ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IDA3ZGU3ZTEuLjI3ZTY3YTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtNDEzLDggKzQxMyw2IEBACiAJLSBob3cgdG8gc2V0IHVwIExpbnV4IHdpdGggYSBzZXJpYWwgbGluZSBjb25zb2xlIGFzIHRoZSBkZWZhdWx0Lgogc2dpLWlvYzQudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB0aGUgU0dJIElPQzQgUENJIChtdWx0aSBmdW5jdGlvbikgZGV2aWNlLgotc2dpLXZpc3dzLnR4dAotCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgogc21zY19lY2UxMDk5LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWZpcm13YXJlLW9wYWwtZHVtcCBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1maXJtd2FyZS1vcGFsLWR1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmZTdmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1maXJtd2FyZS1vcGFsLWR1bXAKQEAgLTAsMCArMSw0MSBAQAorV2hhdDoJCS9zeXMvZmlybXdhcmUvb3BhbC9kdW1wCitEYXRlOgkJRmViIDIwMTQKK0NvbnRhY3Q6CVN0ZXdhcnQgU21pdGggPHN0ZXdhcnRAbGludXgudm5ldC5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgZGlyZWN0b3J5IGV4cG9zZXMgaW50ZXJmYWNlcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aAorCQl0aGUgRlNQIGFuZCBwbGF0Zm9ybSBkdW1wcyB0aHJvdWdoIE9QQUwgZmlybXdhcmUgaW50ZXJmYWNlLgorCisJCVRoaXMgaXMgb25seSBmb3IgdGhlIHBvd2VycGMvcG93ZXJudiBwbGF0Zm9ybS4KKworCQlpbml0aWF0ZV9kdW1wOglXaGVuICcxJyBpcyB3cml0dGVuIHRvIGl0LAorCQkJCXdlIHdpbGwgaW5pdGlhdGUgYSBkdW1wLgorCQkJCVJlYWQgdGhpcyBmaWxlIGZvciBzdXBwb3J0ZWQgY29tbWFuZHMuCisKKwkJMHhYWC0weFlZWVk6CUEgZGlyZWN0b3J5IGZvciBkdW1wIG9mIHR5cGUgMHhYWCBhbmQKKwkJCQlpZCAweFlZWVkgKGluIGhleCkuIFRoZSBuYW1lIG9mIHRoaXMKKwkJCQlkaXJlY3Rvcnkgc2hvdWxkIG5vdCBiZSByZWxpZWQgdXBvbiB0bworCQkJCWJlIGluIHRoaXMgZm9ybWF0LCBvbmx5IHRoYXQgaXQncyB1bmlxdWUKKwkJCQlhbW9uZyBhbGwgZHVtcHMuIEZvciBkZXRlcm1pbmluZyB0aGUgdHlwZQorCQkJCWFuZCBJRCBvZiB0aGUgZHVtcCwgdXNlIHRoZSBpZCBhbmQgdHlwZSBmaWxlcy4KKwkJCQlEbyBub3QgcmVseSBvbiBhbnkgcGFydGljdWxhciBzaXplIG9mIGR1bXAKKwkJCQl0eXBlIG9yIGR1bXAgaWQuCisKKwkJRWFjaCBkdW1wIGhhcyB0aGUgZm9sbG93aW5nIGZpbGVzOgorCQlpZDoJCUFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkdW1wIElECisJCQkJaW4gaGV4IChlLmcuICcweDAxJykKKwkJdHlwZToJCUFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mCisJCQkJZHVtcCBpbiB0aGUgZm9ybWF0ICIweCV4ICVzIiB3aXRoIHRoZSBJRAorCQkJCWluIGhleCBhbmQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZHVtcCB0eXBlCisJCQkJKG9yICd1bmtub3duJykuCisJCQkJVHlwZSAnMHhmZmZmZmZmZiB1bmtub3duJyBpcyB1c2VkIHdoZW4KKwkJCQl3ZSBjb3VsZCBub3QgZ2V0IHRoZSB0eXBlIGZyb20gZmlybXdhcmUuCisJCQkJZS5nLiAnMHgwMiBTeXN0ZW0vUGxhdGZvcm0gRHVtcCcKKwkJZHVtcDoJCUEgYmluYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgZHVtcC4KKwkJCQlUaGUgc2l6ZSBvZiB0aGUgZHVtcCBpcyB0aGUgc2l6ZSBvZiB0aGlzIGZpbGUuCisJCWFja25vd2xlZGdlOglXaGVuICdhY2snIGlzIHdyaXR0ZW4gdG8gdGhpcywgd2Ugd2lsbAorCQkJCWFja25vd2xlZGdlIHRoYXQgd2UndmUgcmV0cmlldmVkIHRoZQorCQkJCWR1bXAgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yLiBJdCB3aWxsCisJCQkJdGhlbiByZW1vdmUgaXQsIG1ha2luZyB0aGUgZHVtcAorCQkJCWluYWNjZXNzaWJsZS4KKwkJCQlSZWFkaW5nIHRoaXMgZmlsZSB3aWxsIGdldCBhIGxpc3Qgb2YKKwkJCQlzdXBwb3J0ZWQgYWN0aW9ucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1maXJtd2FyZS1vcGFsLWVsb2cgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZmlybXdhcmUtb3BhbC1lbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjMwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZmlybXdhcmUtb3BhbC1lbG9nCkBAIC0wLDAgKzEsNjAgQEAKK1doYXQ6CQkvc3lzL2Zpcm13YXJlL29wYWwvZWxvZworRGF0ZToJCUZlYiAyMDE0CitDb250YWN0OglTdGV3YXJ0IFNtaXRoIDxzdGV3YXJ0QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGRpcmVjdG9yeSBleHBvc2VzIGVycm9yIGxvZyBlbnRyaWVzIHJldHJpZXZlZAorCQl0aHJvdWdoIHRoZSBPUEFMIGZpcm13YXJlIGludGVyZmFjZS4KKworCQlFYWNoIGVycm9yIGxvZyBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIElEIGFuZCB3aWxsCisJCWV4aXN0IHVudGlsIGV4cGxpY2l0bHkgYWNrbm93bGVkZ2VkIHRvIGZpcm13YXJlLgorCisJCUVhY2ggbG9nIGVudHJ5IGhhcyBhIGRpcmVjdG9yeSBpbiAvc3lzL2Zpcm13YXJlL29wYWwvZWxvZy4KKworCQlMb2cgZW50cmllcyBtYXkgYmUgcHVyZ2VkIGJ5IHRoZSBzZXJ2aWNlIHByb2Nlc3NvcgorCQliZWZvcmUgcmV0cmlldmVkIGJ5IGZpcm13YXJlIG9yIHJldHJpZXZlZC9hY2tub3dsZWRnZWQgYnkKKwkJTGludXggaWYgdGhlcmUgaXMgbm8gcm9vbSBmb3IgbW9yZSBsb2cgZW50cmllcy4KKworCQlJbiB0aGUgZXZlbnQgdGhhdCBMaW51eCBoYXMgcmV0cmlldmVkIHRoZSBsb2cgZW50cmllcworCQlidXQgbm90IGV4cGxpY2l0bHkgYWNrbm93bGVkZ2VkIHRoZW0gdG8gZmlybXdhcmUgYW5kCisJCXRoZSBzZXJ2aWNlIHByb2Nlc3NvciBuZWVkcyBtb3JlIHJvb20gZm9yIGxvZyBlbnRyaWVzLAorCQl0aGUgb25seSByZW1haW5pbmcgY29weSBvZiBhIGxvZyBtZXNzYWdlIG1heSBiZSBpbgorCQlMaW51eC4KKworCQlUeXBpY2FsbHksIGEgdXNlciBzcGFjZSBkYWVtb24gd2lsbCBtb25pdG9yIGZvciBuZXcKKwkJZW50cmllcywgcmVhZCB0aGVtIG91dCBhbmQgYWNrbm93bGVkZ2UgdGhlbS4KKworCQlUaGUgc2VydmljZSBwcm9jZXNzb3IgbWF5IGJlIGFibGUgdG8gc3RvcmUgbW9yZSBsb2cKKwkJZW50cmllcyB0aGFuIGZpcm13YXJlIGNhbiwgc28gYWZ0ZXIgeW91IGFja25vd2xlZGdlCisJCWFuIGV2ZW50IGZyb20gTGludXggeW91IG1heSBpbnN0YW50bHkgZ2V0IGFub3RoZXIgb25lCisJCWZyb20gdGhlIHF1ZXVlIHRoYXQgd2FzIGdlbmVyYXRlZCBzb21lIHRpbWUgaW4gdGhlIHBhc3QuCisKKwkJVGhlIHJhdyBsb2cgZm9ybWF0IGlzIGEgYmluYXJ5IGZvcm1hdC4gV2UgY3VycmVudGx5CisJCWRvIG5vdCBwYXJzZSB0aGlzIGF0IGFsbCBpbiBrZXJuZWwsIGxlYXZpbmcgaXQgdXAgdG8KKwkJdXNlciBzcGFjZSB0byBzb2x2ZSB0aGUgcHJvYmxlbS4gSW4gZnV0dXJlLCB3ZSBtYXkKKwkJZG8gbW9yZSBwYXJzaW5nIGluIGtlcm5lbCBhbmQgYWRkIG1vcmUgZmlsZXMgdG8gbWFrZQorCQlpdCBlYXNpZXIgZm9yIHNpbXBsZSB1c2VyIHNwYWNlIHByb2Nlc3NlcyB0byBleHRyYWN0CisJCW1vcmUgaW5mb3JtYXRpb24uCisKKwkJRm9yIGVhY2ggbG9nIGVudHJ5IChkaXJlY3RvcnkpLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZworCQlmaWxlczoKKworCQlpZDoJCUFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBJRCBvZiB0aGUKKwkJCQllcnJvciBsb2csIGluIGhleCAtIGUuZy4gIjB4MDEiLgorCisJCXR5cGU6CQlBbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBpZCBhbmQKKwkJCQlkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvciBsb2cuCisJCQkJQ3VycmVudGx5IGp1c3QgIjB4MDAgUEVMIiAtIHBsYXRmb3JtIGVycm9yIGxvZy4KKwkJCQlJbiB0aGUgZnV0dXJlIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsIHR5cGVzLgorCisJCXJhdzoJCUEgcmVhZC1vbmx5IGJpbmFyeSBmaWxlIHRoYXQgY2FuIGJlIHJlYWQKKwkJCQl0byBnZXQgdGhlIHJhdyBsb2cgZW50cnkuIFRoZXNlIGFyZQorCQkJCTwxNmtiLCBvZnRlbiBqdXN0IGh1bmRyZWRzIG9mIGJ5dGVzIGFuZAorCQkJCSJhdmVyYWdlIiAya2IuCisKKwkJYWNrbm93bGVkZ2U6CVdyaXRpbmcgJ2FjaycgdG8gdGhpcyBmaWxlIHdpbGwgYWNrbm93bGVkZ2UKKwkJCQl0aGUgZXJyb3IgbG9nIHRvIGZpcm13YXJlIChhbmQgaW4gdHVybgorCQkJCXRoZSBzZXJ2aWNlIHByb2Nlc3NvciwgaWYgYXBwbGljYWJsZSkuCisJCQkJU2hvcnRseSBhZnRlciBhY2tub3dsZWRnaW5nIGl0LCB0aGUgbG9nCisJCQkJZW50cnkgd2lsbCBiZSByZW1vdmVkIGZyb20gc3lzZnMuCisJCQkJUmVhZGluZyB0aGlzIGZpbGUgd2lsbCBsaXN0IHRoZSBzdXBwb3J0ZWQKKwkJCQlvcGVyYXRpb25zIChjdXJlbnRseSBqdXN0IGFja25vd2xlZGdlKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1ldmVudF9zb3VyY2UtZGV2aWNlcy1ldmVudHMgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1ldmVudF9zb3VyY2UtZGV2aWNlcy1ldmVudHMKaW5kZXggM2MxY2MyNC4uN2I0MGEzYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtZXZlbnRzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWV2ZW50X3NvdXJjZS1kZXZpY2VzLWV2ZW50cwpAQCAtNTcsNiArNTcsNTIzIEBACiAJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xEX1JFRl9MMQogCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9SVU5fQ1lDCiAJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1JVTl9JTlNUX0NNUEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfREVNQU5EX0wyX0JSX0FMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfVVRJTF83X1RPXzEwX1NMT1RTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BNQzJfU0FWRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF8xNkZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xTVV9ERVJBVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19TVF9DTVBMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjNfQURECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NUX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfQ0FTVE9VVF9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSVNFRworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfSU5TVF9USU1FTworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ1NUX0RJU1BfRkFJTF9BRERSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfRENfUFJFRl9TVFJFQU1fQ09ORklSTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JRVJBVF9XUl82NEsKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RUTEJfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUVSQVRfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0xNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX1BSSU9fNF81X0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVEX1RBCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0VYVF9JTlQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZTUVJUX0ZESVYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xEX01JU1NfRVhQT1NFRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MREYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfV1JJVEVfQUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfU1JRX1NURldECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9STDJMM19NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMzFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9MMjFfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfU0NBTF9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfOEZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE9XRVJfRVZFTlQxCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTERfQkFMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfMkZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFdTWU5DX0hFTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDIxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JRVJBVF9YTEFURV9XUl8xNk1QTFVTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX1JFUV9BTEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFNMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wzX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9MMV9QUkVGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TQ0FMQVJfU0lOR0xFX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0RDX1BSRUZfU1RSRUFNX0NPTkZJUk1fU1RSSURFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0lOU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9GUlNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wyTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0RRX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0ZMVVNIX1VMRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fTE1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREVSQVRfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhSRF9BTExfUlVOX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NRU0wX1BSRUZFVENIX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1NUQUxMX0NNUExVX0NZQ19DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fREwyTDNfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9GUlNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDIxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QTUMxX09WRVJGTE9XCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU0lOR0xFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDNNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX1ZFQ1RPUl9TUF9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9GRVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19JTlNUX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9DT01QTEVYX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0ZMVVNIX1VTVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFVfSURMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UwX0ZMVVNIX1VMRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTE1RX1NSUV9FTVBUWV9BTExfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfUkVKRUNUX0xNUV9GVUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wyMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TSExfQ1JFQVRFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9TVF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0RNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfTERfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFUxX0JVU1lfRlhVMF9JRExFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTERfUkVTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NOX1NYX0lfRE9ORQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TVENYX0NNUEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF8yRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19QUkVGX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1NSUV9TWU5DX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfUkVKRUNUX0VSQVRfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMV9JQ0FDSEVfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0ZMVVNIX1NSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MRF9SRUZfTDFfTFNVMAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZFU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX1ZFQ1RPUl9TSU5HTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZSRVFfVVAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0xNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MRFgKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DM19PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfQlJfTVBSRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU0hMX01BVENICisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19CUl9UQUtFTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JU0xCX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRElTUF9IRUxEX1RIRVJNQUwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fUkwyTDNfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfU1JRX1NURldECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9ETUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV8yRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfRlVMTF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MM19DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1NSUV9TMF9BTExPQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREVSQVRfTUlTU180SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9NUFJFRF9UQQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9MMk1JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFBVX0hFTERfUE9XRVIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1ZTVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1NSUV9TMF9WQUxJRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfRU1QVFlfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lPUFNfRElTUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9SVU5fU1BVUlIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wyMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF8xRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TTk9PUF9UTEJJRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDNNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TSU5HTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFRMQl9NSVNTXzE2RworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GTFVTSAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTkVTVF9QQUlSMl9BTkQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV8xRkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19QUkVGX1JFUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19MRF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRElTUF9IRUxECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0xECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GTFVTSF9TUlEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQkNfUExVU184X0NPTlYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMzFfTU9EX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ1NUX0JVU1lfUkNfRlVMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9UQl9CSVRfVFJBTlMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhFUk1BTF9NQVgKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9GTFVTSF9VTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9SRUpFQ1RfTEhTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9MUlFfUzBfQUxMT0MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfQ09fTDMxCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BPV0VSX0VWRU5UNAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9VTkNPTkQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9EQ19QUkVGX1NUUkVBTV9BTExPQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QTUM0X1JFV0lORAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ0xEX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhSRF9QUklPXzJfM19DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9MMk1JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfREVNQU5EX0wyX0JIVF9SRURJUkVDVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19QUkVGX0NBTkNFTF9MMgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRklOX1NUQUxMX0NZQ19DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVEX0NDQUNIRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HQ1RfVVRJTF8xX1RPXzJfU0xPVFMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1NUX0NNUExfSU5UCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9UV09fVEFCTEVXQUxLX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfU0VUX01QUkVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0RJU1BfVExCSUUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9GQ09OVgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ERVJBVF9NSVNTXzE2RworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTE1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19ERU1BTkRfTDJfQlJfUkVESVJFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fTDIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wyCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDIxX1NIUl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RUTEJfTUlTU180SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZQU0NSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfVkVDVF9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fUkwyTDNfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01FTTBfUlFfRElTUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZNWF9SRVNVTFRfU0FUXzEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDFfUFJFRgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0xNRU1fQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0dSUF9JQ19NSVNTX05PTlNQRUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUEJfTk9ERV9QVU1QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1NITF9NRVJHRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTkVTVF9QQUlSMV9BREQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0wzCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GTFVTSAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfU1JRX1NZTkNfQ09VTlQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DMl9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTERGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BPV0VSX0VWRU5UMworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ESVNQX1dUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX0JBTktfQ09ORkxJQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfTVBSRURfQ1JfVEEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfSU5TVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjJfQURECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRkxVU0gKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfTERTVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZJTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZDT05WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTERfVExCSUUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9ETUVNX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVEX0NSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9SRUpFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fR0NUX1VUSUxfM19UT182X1NMT1RTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0NNUExVX1NUQUxMX0VORF9HQ1RfTk9TTE9UCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfUkVKRUNUX0xNUV9GVUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9GRVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjBfQU5ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9MMworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QT1dFUl9FVkVOVDIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfUFJFRl9DQU5DRUxfUEFHRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZTUVJUX0ZESVYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0dSUF9DTVBMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU0NBTF9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0dSUF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTERYCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9MMgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX1ZFQ1RfRE9VQkxFX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxXzJGTE9QX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX1BSSU9fNl83X0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CQ19QTFVTXzhfUlNMVl9UQUtFTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9NUFJFRF9DUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19DT19NRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfU1JRX0ZVTExfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RBQkxFV0FMS19DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9TUlFfU1RGV0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fUk1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFUwX0ZJTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UxX0wxX1NXX1BSRUYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wzMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNV9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MRF9SRUZfTDFfTFNVMQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9MMjFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU0NBTF9TSU5HTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0JSX01QUkVEX0xTVEFDSworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX1JMMkwzX01PRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9GTFVTSF9VU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX05DU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfVEFLRU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9QVEVHX0ZST01fTE1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EVExCX01JU1NfNEsKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNF9TQVZFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX1BFUk1VVEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1NMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfRkxVU0hfTFJRCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RUTEJfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZSU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX1ZFQ1RPUl9ET1VCTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0NBU1RPVVRfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9ETDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9TVEYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU1RfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BURUdfRlJPTV9MMjFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0xPQ19HVUVTU19XUk9ORworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfU1RDWF9GQUlMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfUkVKRUNUX0xIUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JQ19QUkVGX0NBTkNFTF9ISVQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfUFJFRl9CVVNZCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19CUlVfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTFfTkNMRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9MMzFfTU9ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9OQ0xECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9MRFgKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfTE9DX0dVRVNTX0NPUlJFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhSRVNIX1RJTUVPCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wzX1BSRUZfU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRElTUF9DTEJfSEVMRF9TWU5DCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TSU1QTEVfSVNTVUVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfU0lOR0xFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfVEFCTEVXQUxLX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ19TVF9ET05FCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDIxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MQVJYX0xTVTEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9STUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RJU1BfQ0xCX0hFTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREVSQVRfTUlTU180SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ0xEX0RJU1BfRkFJTF9BRERSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1NFR19FWENFUFRJT04KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRkxVU0hfRElTUF9TQgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9EQ19JTlYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0RMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EU0VHCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0JSX1BSRURfTFNUQUNLCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfU1RGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GWF9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREVSQVRfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9ETDJMM19NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fR0NUX1VUSUxfMTFfUExVU19TTE9UUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0lGVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSVRMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TVEYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0ZMVVNIX1VTVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRFNUX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRlhVMV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU0hMX0RFQUxMT0NBVEVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NOX01fV1JfRE9ORQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfUkVKRUNUX1NFVF9NUFJFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19QUkVGX0xECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1NOX01fUkRfRE9ORQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREVSQVRfTUlTU18xNkcKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZDT05WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0FOWV9USFJEX1JVTl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0xNUV9GVUxMX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTFNVX1JFSkVDVF9MSFMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xEX01JU1NfTDFfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDJfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfSU1DX01BVENIX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9STUVNX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX1NJTVBMRV9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9STDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZNQV9ET1VCTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVXzRGTE9QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjFfQU5ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX1JMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fUk1FTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTFJRX1MwX1ZBTElECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTERGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0NPTVBMRVRJT04KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU1RfTUlTU19MMQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9OT0RFX1BVTVAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfU1RBTExfQ01QTFVfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfREVOT1JNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDMxX1NIUl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTkVTVF9QQUlSMF9BREQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9FRV9PRkZfRVhUX0lOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX1BURUdfRlJPTV9ETUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfRlJPTV9ETDJMM19NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNl9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfMkZMT1BfRE9VQkxFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RMQl9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZYVV9CVVNZCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX1JDTERfRElTUF9GQUlMX09USEVSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9SRUpFQ1RfTE1RX0ZVTEwKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfUkVMT0FEX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9HUlBfTVJLCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19TVF9ORVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTFfRlNRUlRfRkRJVgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UwX0ZMVVNIX0xSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MQVJYX0xTVTAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUJVRl9GVUxMX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RMMkwzX1NIUl9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX0RDX1BSRUZfU1RSRUFNX0FMTE9DCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0dSUF9NUktfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fUkwyTDNfU0hSX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9HTE9CX0dVRVNTX0NPUlJFQ1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVX1JFSkVDVF9MSFMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MTUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wzCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZSRVFfRE9XTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QQl9SRVRSWV9OT0RFX1BVTVAKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX1JMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfSU5TVF9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUFRFR19GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9SVU5fUFVSUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfR1JQX0lDX01JU1MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fUkwyTDNfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9GTFVTSF9MUlEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RFUkFUX01JU1NfNjRLCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0RMMkwzX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9TVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19QVEVHX0ZST01fTDIxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MV1NZTkMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9EQ19QUkVGX1NUUkVBTV9DT05GSVJNX1NUUklERQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTFNVX0ZMVVNIX0xSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0lNQ19NQVRDSF9DTVBMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX05FU1RfUEFJUjNfQU5ECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1BCX1JFVFJZX1NZU19QVU1QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19JTlNUX0ZJTgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDMxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRFRMQl9NSVNTXzY0SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfUkVKRUNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0NPX0ZBSUxfQlVTWQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NRU0wX1dRX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0wzMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVEhFUk1BTF9XQVJOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfNEZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfTVBSRURfQ0NBQ0hFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wxX0RFTUFORF9XUklURQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GTFVTSF9CUl9NUFJFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRFRMQl9NSVNTXzE2RworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0RNRU0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfUkNTVF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9QQVJUSUFMX0NERgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ESVNQX0NMQl9IRUxEX1NCCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfRk1BX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9GWFUwX0JVU1lfRlhVMV9JRExFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX0RFTUFORF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9MMjFfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRkxVU0hfVVNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wzTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfREVOT1JNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfUEFSVElBTF9DREYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0wyMV9TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSUNfUFJFRl9XUklURQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CUl9QUkVECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfRlJPTV9ETUVNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX1BSRUZfQ0FOQ0VMX0FMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfRENfUFJFRl9TVFJFQU1fQ09ORklSTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTFNVX0ZMVVNIX1NSUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfRklOX1NUQUxMX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ1NUX0RJU1BfRkFJTF9PVEhFUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0REX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QVEVHX0ZST01fTDMxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9EQVRBX0ZST01fTDIxX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1UwX05DTEQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV80RkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxXzhGTE9QCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV84RkxPUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTE1RX1NSUV9FTVBUWV9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRFRMQl9NSVNTXzY0SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX0NPTkNfUlVOX0lOU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX1BURUdfRlJPTV9MMgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QQl9TWVNfUFVNUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDMxX01PRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEX1BSSU9fMF8xX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9ERVJBVF9NSVNTXzY0SworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9QTUMyX1JFV0lORAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fR1JQX0JSX01QUkVEX05PTlNQRUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01FTTBfUkRfQ0FOQ0VMX1RPVEFMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfRENfUFJFRl9TVFJFQU1fQ09ORklSTQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMV9EQ0FDSEVfUkVMT0FEX1ZBTElECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9TQ0FMQVJfRE9VQkxFX0lTU1VFRAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19QUkVGX0hJVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0wzMV9NT0QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0ZYVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fUE1DNF9PVkVSRkxPVworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfUFRFR19GUk9NX0wzCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTE1RX0xIUl9NRVJHRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9CVEFDX0hJVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MM19SRF9CVVNZCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfTDFfU1dfUFJFRgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9JTlNUX0ZST01fTDJNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVTBfRENfUFJFRl9TVFJFQU1fQUxMT0MKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9ERU5PUk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RBVEFfRlJPTV9ETDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fQlJfUFJFRF9DUl9UQQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwX0ZDT05WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRkxVU0hfVUxECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0JUQUNfTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTERfTUlTU19FWFBPU0VEX0NZQ19DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0wyCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9EQ0FDSEVfUkVMT0FEX1ZBTElECisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVV9GTUEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMF9GTFVTSF9TUlEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MMV9QUkVGCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lPUFNfQ01QTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9TWVNfUFVNUAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9SQ0xEX0JVU1lfUkNfRlVMTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfTE1RX1MwX0FMTE9DCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0ZMVVNIX0RJU1BfU1lOQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfREFUQV9GUk9NX0RMMkwzX01PRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDJfSUNfSU5WCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDIxX01PRF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfUFJFRl9MRFNUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9TUlFfRU1QVFlfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0xTVV9MTVFfUzBfVkFMSUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRkxVU0hfUEFSVElBTAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZNQV9ET1VCTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fMVBMVVNfUFBDX0RJU1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fREFUQV9GUk9NX0wyTUlTUworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9TVVNQRU5ERUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMF9GTUEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fU1RDWF9GQUlMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1ZTVTBfRlNRUlRfRkRJVl9ET1VCTEUKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fRENfUFJFRl9EU1QKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9TQ0FMX1NJTkdMRV9JU1NVRUQKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTDNfSElUCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0dMT0JfR1VFU1NfV1JPTkcKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0RGVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX0wxCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lDX0RFTUFORF9SRVEKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9GU1FSVF9GRElWX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UxX0ZNQQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NUktfTERfTUlTU19MMQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1UwXzJGTE9QX0RPVUJMRQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MU1VfRENfUFJFRl9TVFJJREVEX1NUUkVBTV9DT05GSVJNCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0wzMV9TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTVJLX0xTVV9SRUpFQ1RfRVJBVF9NSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fTDJNSVNTCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RBVEFfRlJPTV9STDJMM19TSFIKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSU5TVF9GUk9NX1BSRUYKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVMV9TUQorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9MMl9MRF9ESVNQCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0wyX0RJU1BfQUxMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RIUkRfR1JQX0NNUExfQk9USF9DWUMKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fVlNVX0ZTUVJUX0ZESVZfRE9VQkxFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lOU1RfUFRFR19GUk9NX0RMMkwzX1NIUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9WU1VfMUZMT1AKKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fSFZfQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19MU1VfRklOCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX01SS19EQVRBX0ZST01fUkwyTDNfU0hSCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0RUTEJfTUlTU18xNk0KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fTFNVMV9MTVFfTEhSX01FUkdFCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX0lGVV9GSU4KKwkJL3N5cy9kZXZpY2VzL2NwdS9ldmVudHMvUE1fMVRIUkRfQ09OX1JVTl9JTlNUUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9DTVBMVV9TVEFMTF9DT1VOVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9NRU0wX1BCX1JEX0NMCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RIUkRfMV9SVU5fQ1lDCisJCS9zeXMvZGV2aWNlcy9jcHUvZXZlbnRzL1BNX1RIUkRfMl9DT05DX1JVTl9JTlNUUgorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzJfUlVOX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzNfQ09OQ19SVU5fSU5TVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzNfUlVOX0NZQworCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzRfQ09OQ19SVU5fSU5TVAorCQkvc3lzL2RldmljZXMvY3B1L2V2ZW50cy9QTV9USFJEXzRfUlVOX0NZQwogCiBEYXRlOgkJMjAxMy8wMS8wOAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1ldmVudF9zb3VyY2UtZGV2aWNlcy1odl8yNHg3IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtaHZfMjR4NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzhlZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtaHZfMjR4NwpAQCAtMCwwICsxLDIzIEBACitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfMjR4Ny9pbnRlcmZhY2UvY2F0YWxvZworRGF0ZToJCUZlYnJ1YXJ5IDIwMTQKK0NvbnRhY3Q6CUNvZHkgUCBTY2hhZmVyIDxjb2R5QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJpbmFyeSAiMjR4NyBjYXRhbG9nIiBwcm92aWRlZCBieSB0aGUKKwkJaHlwZXJ2aXNvciBvbiBQT1dFUjcgYW5kIDggc3lzdGVtcy4gVGhpcyBjYXRhbG9nIGxpc3RzIGV2ZW50cworCQlhdmFsaWFibGUgZnJvbSB0aGUgcG93ZXJwYyAiaHZfMjR4NyIgcG11LiBJdHMgZm9ybWF0IGlzCisJCWRvY3VtZW50ZWQgaGVyZToKKwkJaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ptZXNtb24vY2F0YWxvZy0yNHg3L21hc3Rlci9odi0yNHg3LWNhdGFsb2cuaAorCitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfMjR4Ny9pbnRlcmZhY2UvY2F0YWxvZ19sZW5ndGgKK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJQSBudW1iZXIgZXF1YWwgdG8gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2F0YWxvZy4gVGhpcyBpcworCQlhbHNvIGV4dHJhY3RhYmxlIGZyb20gdGhlIHByb3ZpZGVkIGJpbmFyeSAiY2F0YWxvZyIgc3lzZnMgZW50cnkuCisKK1doYXQ6CQkvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy9odl8yNHg3L2ludGVyZmFjZS9jYXRhbG9nX3ZlcnNpb24KK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJRXhwb3NlcyB0aGUgInZlcnNpb24iIGZpZWxkIG9mIHRoZSAyNHg3IGNhdGFsb2cuIFRoaXMgaXMgYWxzbworCQlleHRyYWN0YWJsZSBmcm9tIHRoZSBwcm92aWRlZCBiaW5hcnkgImNhdGFsb2ciIHN5c2ZzIGVudHJ5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtZXZlbnRfc291cmNlLWRldmljZXMtaHZfZ3BjaSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWV2ZW50X3NvdXJjZS1kZXZpY2VzLWh2X2dwY2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNThjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWV2ZW50X3NvdXJjZS1kZXZpY2VzLWh2X2dwY2kKQEAgLTAsMCArMSw0MyBAQAorV2hhdDoJCS9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzL2h2X2dwY2kvaW50ZXJmYWNlL2NvbGxlY3RfcHJpdmlsZWdlZAorRGF0ZToJCUZlYnJ1YXJ5IDIwMTQKK0NvbnRhY3Q6CUNvZHkgUCBTY2hhZmVyIDxjb2R5QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQknMCcgaWYgdGhlIGh5cGVydmlzb3IgaXMgY29uZmlndXJlZCB0byBmb3JiaWQgYWNjZXNzIHRvIGV2ZW50CisJCWNvdW50ZXJzIGJlaW5nIGFjY3VtdWxhdGVkIGJ5IG90aGVyIGd1ZXN0cyBhbmQgdG8gcGh5c2ljYWwKKwkJZG9tYWluIGV2ZW50IGNvdW50ZXJzLgorCQknMScgaWYgdGhhdCBhY2Nlc3MgaXMgYWxsb3dlZC4KKworV2hhdDoJCS9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzL2h2X2dwY2kvaW50ZXJmYWNlL2dhCitEYXRlOgkJRmVicnVhcnkgMjAxNAorQ29udGFjdDoJQ29keSBQIFNjaGFmZXIgPGNvZHlAbGludXgudm5ldC5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCTAgb3IgMS4gSW5kaWNhdGVzIHdoZXRoZXIgd2UgaGF2ZSBhY2Nlc3MgdG8gIkdBIiBldmVudHMgKGxpc3RlZAorCQlpbiBhcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmgpLgorCitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfZ3BjaS9pbnRlcmZhY2UvZXhwYW5kZWQKK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJMCBvciAxLiBJbmRpY2F0ZXMgd2hldGhlciB3ZSBoYXZlIGFjY2VzcyB0byAiRVhQQU5ERUQiIGV2ZW50cyAobGlzdGVkCisJCWluIGFyY2gvcG93ZXJwYy9wZXJmL2h2LWdwY2kuaCkuCisKK1doYXQ6CQkvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy9odl9ncGNpL2ludGVyZmFjZS9sYWIKK0RhdGU6CQlGZWJydWFyeSAyMDE0CitDb250YWN0OglDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJMCBvciAxLiBJbmRpY2F0ZXMgd2hldGhlciB3ZSBoYXZlIGFjY2VzcyB0byAiTEFCIiBldmVudHMgKGxpc3RlZAorCQlpbiBhcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmgpLgorCitXaGF0OgkJL3N5cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvaHZfZ3BjaS9pbnRlcmZhY2UvdmVyc2lvbgorRGF0ZToJCUZlYnJ1YXJ5IDIwMTQKK0NvbnRhY3Q6CUNvZHkgUCBTY2hhZmVyIDxjb2R5QGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlBIG51bWJlciBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBncGNpIGludGVyZmFjZSB0aGF0IHRoZQorCQloeXBlcnZpc29yIHJlcG9ydHMgc3VwcG9ydGluZy4KKworV2hhdDoJCS9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzL2h2X2dwY2kvaW50ZXJmYWNlL2tlcm5lbF92ZXJzaW9uCitEYXRlOgkJRmVicnVhcnkgMjAxNAorQ29udGFjdDoJQ29keSBQIFNjaGFmZXIgPGNvZHlAbGludXgudm5ldC5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCUEgbnVtYmVyIGluZGljYXRpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBncGNpIGludGVyZmFjZQorCQl0aGF0IHRoZSBrZXJuZWwgaXMgYXdhcmUgb2YuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXNjc2lfaG9zdCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3Mtc2NzaV9ob3N0CmluZGV4IDI5YTRmODkuLjBlYjI1NWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3Mtc2NzaV9ob3N0CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3Mtc2NzaV9ob3N0CkBAIC0xMSwzICsxMSwxOSBAQAogCQlndWFyYW50ZWVkLiAgVGhlICdpc2NpX2lkJyBhdHRyaWJ1dGUgdW5hbWJpZ3VvdXNseSBpZGVudGlmaWVzCiAJCXRoZSBjb250cm9sbGVyIGluZGV4OiAnMCcgZm9yIHRoZSBmaXJzdCBjb250cm9sbGVyLAogCQknMScgZm9yIHRoZSBzZWNvbmQuCisKK1doYXQ6CQkvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0WC9hY2Npb3BhdGhfc3RhdHVzCitEYXRlOgkJTm92ZW1iZXIgMjAxMworQ29udGFjdDoJU3RlcGhlbiBNLiBDYW1lcm9uIDxzY2FtZXJvbkBiZWFyZG9nLmNjZS5ocC5jb20+CitEZXNjcmlwdGlvbjoJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgIlNTRCBTbWFydCBQYXRoIgorCQlmZWF0dXJlIG9mIEhQIFNtYXJ0IEFycmF5IFJBSUQgY29udHJvbGxlcnMgdXNpbmcgdGhlIGhwc2EKKwkJZHJpdmVyLiAgU1NEIFNtYXJ0IFBhdGgsIHdoZW4gZW5hYmxlZCBwZXJtaXRzIHRoZSBkcml2ZXIgdG8KKwkJc2VuZCBpL28gcmVxdWVzdHMgZGlyZWN0bHkgdG8gcGh5c2ljYWwgZGV2aWNlcyB0aGF0IGFyZSBwYXJ0CisJCW9mIGEgbG9naWNhbCBkcml2ZSwgYnlwYXNzaW5nIHRoZSBjb250cm9sbGVycyBmaXJtd2FyZSBSQUlECisJCXN0YWNrIGZvciBhIHBlcmZvcm1hbmNlIGFkdmFudGFnZSB3aGVuIHBvc3NpYmxlLiAgQSB2YWx1ZSBvZgorCQknMScgaW5kaWNhdGVzIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQsIGFuZCB0aGUgY29udHJvbGxlciBtYXkKKwkJdXNlIHRoZSBkaXJlY3QgaS9vIHBhdGggdG8gcGh5c2ljYWwgZGV2aWNlcy4gIEEgdmFsdWUgb2YgemVybworCQltZWFucyB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZCBhbmQgdGhlIGNvbnRyb2xsZXIgbWF5IG5vdCB1c2UKKwkJdGhlIGRpcmVjdCBpL28gcGF0aCB0byBwaHlzaWNhbCBkZXZpY2VzLiAgVGhpcyBzZXR0aW5nIGlzCisJCWNvbnRyb2xsZXIgd2lkZSwgYWZmZWN0aW5nIGFsbCBjb25maWd1cmVkIGxvZ2ljYWwgZHJpdmVzIG9uIHRoZQorCQljb250cm9sbGVyLiAgVGhpcyBmaWxlIGlzIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCAwZjljNmZmLi44ZDk2ZWJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw3IEBACiAJICAgIGdlbmVyaWNpcnEueG1sIHMzOTAtZHJpdmVycy54bWwgdWlvLWhvd3RvLnhtbCBzY3NpLnhtbCBcCiAJICAgIDgwMjExLnhtbCBkZWJ1Z29iamVjdHMueG1sIHNoLnhtbCByZWd1bGF0b3IueG1sIFwKIAkgICAgYWxzYS1kcml2ZXItYXBpLnhtbCB3cml0aW5nLWFuLWFsc2EtZHJpdmVyLnhtbCBcCi0JICAgIHRyYWNlcG9pbnQueG1sIGRybS54bWwgbWVkaWFfYXBpLnhtbAorCSAgICB0cmFjZXBvaW50LnhtbCBkcm0ueG1sIG1lZGlhX2FwaS54bWwgdzEueG1sCiAKIGluY2x1ZGUgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvTWFrZWZpbGUKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3cxLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdzEudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDIyOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3cxLnRtcGwKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKwkiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFtdPgorCis8Ym9vayBpZD0idzFpZCI+CisgIDxib29raW5mbz4KKyAgICA8dGl0bGU+VzE6IERhbGxhcycgMS13aXJlIGJ1czwvdGl0bGU+CisKKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Zmlyc3RuYW1lPkRhdmlkPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPkZyaWVzPC9zdXJuYW1lPgorICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgPGFkZHJlc3M+CisgICAgICAgICAgICA8ZW1haWw+RGF2aWRARnJpZXMubmV0PC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKworICAgIDwvYXV0aG9yZ3JvdXA+CisKKyAgICA8Y29weXJpZ2h0PgorICAgICAgPHllYXI+MjAxMzwveWVhcj4KKyAgICAgIDwhLS0KKyAgICAgIDxob2xkZXI+PC9ob2xkZXI+CisgICAgICAtLT4KKyAgICA8L2NvcHlyaWdodD4KKworICAgIDxsZWdhbG5vdGljZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICAgICBMaWNlbnNlIHZlcnNpb24gMi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAgICAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICAgICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgICAgICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQorICAgICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCisgICAgICA8L3BhcmE+CisgICAgPC9sZWdhbG5vdGljZT4KKyAgPC9ib29raW5mbz4KKworICA8dG9jPjwvdG9jPgorCisgIDxjaGFwdGVyIGlkPSJ3MV9pbnRlcm5hbCI+CisgICAgPHRpdGxlPlcxIEFQSSBpbnRlcm5hbCB0byB0aGUga2VybmVsPC90aXRsZT4KKworICAgIDxzZWN0MSBpZD0idzFfaW50ZXJuYWxfYXBpIj4KKyAgICAgIDx0aXRsZT5XMSBBUEkgaW50ZXJuYWwgdG8gdGhlIGtlcm5lbDwvdGl0bGU+CisgICAgICA8c2VjdDIgaWQ9IncxLmgiPgorICAgICAgICA8dGl0bGU+ZHJpdmVycy93MS93MS5oPC90aXRsZT4KKyAgICAgICAgPHBhcmE+VzEgY29yZSBmdW5jdGlvbnMuPC9wYXJhPgorIUlkcml2ZXJzL3cxL3cxLmgKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzEuYyI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxLmM8L3RpdGxlPgorICAgICAgICA8cGFyYT5XMSBjb3JlIGZ1bmN0aW9ucy48L3BhcmE+CishSWRyaXZlcnMvdzEvdzEuYworICAgICAgPC9zZWN0Mj4KKworICAgICAgPHNlY3QyIGlkPSJ3MV9mYW1pbHkuaCI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxX2ZhbWlseS5oPC90aXRsZT4KKyAgICAgICAgPHBhcmE+QWxsb3dzIHJlZ2lzdGVyaW5nIGRldmljZSBmYW1pbHkgb3BlcmF0aW9ucy48L3BhcmE+CishSWRyaXZlcnMvdzEvdzFfZmFtaWx5LmgKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzFfZmFtaWx5LmMiPgorICAgICAgICA8dGl0bGU+ZHJpdmVycy93MS93MV9mYW1pbHkuYzwvdGl0bGU+CisgICAgICAgIDxwYXJhPkFsbG93cyByZWdpc3RlcmluZyBkZXZpY2UgZmFtaWx5IG9wZXJhdGlvbnMuPC9wYXJhPgorIUVkcml2ZXJzL3cxL3cxX2ZhbWlseS5jCisgICAgICA8L3NlY3QyPgorCisgICAgICA8c2VjdDIgaWQ9IncxX2ludC5jIj4KKyAgICAgICAgPHRpdGxlPmRyaXZlcnMvdzEvdzFfaW50LmM8L3RpdGxlPgorICAgICAgICA8cGFyYT5XMSBpbnRlcm5hbCBpbml0aWFsaXphdGlvbiBmb3IgbWFzdGVyIGRldmljZXMuPC9wYXJhPgorIUVkcml2ZXJzL3cxL3cxX2ludC5jCisgICAgICA8L3NlY3QyPgorCisgICAgICA8c2VjdDIgaWQ9IncxX25ldGxpbmsuaCI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxX25ldGxpbmsuaDwvdGl0bGU+CisgICAgICAgIDxwYXJhPlcxIGV4dGVybmFsIG5ldGxpbmsgQVBJIHN0cnVjdHVyZXMgYW5kIGNvbW1hbmRzLjwvcGFyYT4KKyFJZHJpdmVycy93MS93MV9uZXRsaW5rLmgKKyAgICAgIDwvc2VjdDI+CisKKyAgICAgIDxzZWN0MiBpZD0idzFfaW8uYyI+CisgICAgICAgIDx0aXRsZT5kcml2ZXJzL3cxL3cxX2lvLmM8L3RpdGxlPgorICAgICAgICA8cGFyYT5XMSBpbnB1dC9vdXRwdXQuPC9wYXJhPgorIUVkcml2ZXJzL3cxL3cxX2lvLmMKKyFJZHJpdmVycy93MS93MV9pby5jCisgICAgICA8L3NlY3QyPgorCisgICAgPC9zZWN0MT4KKworCisgIDwvY2hhcHRlcj4KKworPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKaW5kZXggMDY3NDFlOS4uZDAwNTZhNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC00NjgsOCArNDY4LDYgQEAKICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAgICAgICAgICAgKnJjaGlwID0gY2hpcDsKICAgICAgICAgICByZXR1cm4gMDsKICAgfQpAQCAtNDkyLDcgKzQ5MCw4IEBACiAgICAgICAgICAgfQogCiAgICAgICAgICAgLyogKDIpICovCi0gICAgICAgICAgZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisgICAgICAgICAgZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZjYXJkKTsKICAgICAgICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAKQEAgLTU5MSw3ICs1OTAsOCBAQAogICBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAgIGludCBlcnI7CiAgIC4uLi4KLSAgZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisgIGVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorICAgICAgICAgICAgICAgICAgICAgMCwgJmNhcmQpOwogXV0+CiAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgICAgIDwvaW5mb3JtYWxleGFtcGxlPgpAQCAtODA5LDI4ICs4MDksMzQgQEAKIAogICAgICAgPHBhcmE+CiAgICAgICAgIEFzIG1lbnRpb25lZCBhYm92ZSwgdG8gY3JlYXRlIGEgY2FyZCBpbnN0YW5jZSwgY2FsbAotICAgICAgPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4uCisgICAgICA8ZnVuY3Rpb24+c25kX2NhcmRfbmV3KCk8L2Z1bmN0aW9uPi4KIAogICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgogICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwogICBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAgIGludCBlcnI7Ci0gIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIG1vZHVsZSwgZXh0cmFfc2l6ZSwgJmNhcmQpOworICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIG1vZHVsZSwgZXh0cmFfc2l6ZSwgJmNhcmQpOwogXV0+CiAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgZnVuY3Rpb24gdGFrZXMgZml2ZSBhcmd1bWVudHMsIHRoZSBjYXJkLWluZGV4IG51bWJlciwgdGhlCi0gICAgICAgIGlkIHN0cmluZywgdGhlIG1vZHVsZSBwb2ludGVyICh1c3VhbGx5CisgICAgICAgIFRoZSBmdW5jdGlvbiB0YWtlcyBzaXggYXJndW1lbnRzOiB0aGUgcGFyZW50IGRldmljZSBwb2ludGVyLAorICAgICAgICB0aGUgY2FyZC1pbmRleCBudW1iZXIsIHRoZSBpZCBzdHJpbmcsIHRoZSBtb2R1bGUgcG9pbnRlciAodXN1YWxseQogICAgICAgICA8Y29uc3RhbnQ+VEhJU19NT0RVTEU8L2NvbnN0YW50PiksCiAgICAgICAgIHRoZSBzaXplIG9mIGV4dHJhLWRhdGEgc3BhY2UsIGFuZCB0aGUgcG9pbnRlciB0byByZXR1cm4gdGhlCiAgICAgICAgIGNhcmQgaW5zdGFuY2UuICBUaGUgZXh0cmFfc2l6ZSBhcmd1bWVudCBpcyB1c2VkIHRvCiAgICAgICAgIGFsbG9jYXRlIGNhcmQtJmd0O3ByaXZhdGVfZGF0YSBmb3IgdGhlCiAgICAgICAgIGNoaXAtc3BlY2lmaWMgZGF0YS4gIE5vdGUgdGhhdCB0aGVzZSBkYXRhCi0gICAgICAgIGFyZSBhbGxvY2F0ZWQgYnkgPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4uCisgICAgICAgIGFyZSBhbGxvY2F0ZWQgYnkgPGZ1bmN0aW9uPnNuZF9jYXJkX25ldygpPC9mdW5jdGlvbj4uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorCVRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIHBvaW50ZXIgb2Ygc3RydWN0CisJPHN0cnVjdG5hbWU+ZGV2aWNlPC9zdHJ1Y3RuYW1lPiwgc3BlY2lmaWVzIHRoZSBwYXJlbnQgZGV2aWNlLgorCUZvciBQQ0kgZGV2aWNlcywgdHlwaWNhbGx5ICZhbXA7cGNpLSZndDsgaXMgcGFzc2VkIHRoZXJlLgogICAgICAgPC9wYXJhPgogICAgIDwvc2VjdGlvbj4KIApAQCAtOTE2LDE2ICs5MjIsMTYgQEAKICAgICAgIDwvcGFyYT4KIAogICAgICAgPHNlY3Rpb24gaWQ9ImNhcmQtbWFuYWdlbWVudC1jaGlwLXNwZWNpZmljLXNuZC1jYXJkLW5ldyI+Ci0gICAgICAgIDx0aXRsZT4xLiBBbGxvY2F0aW5nIHZpYSA8ZnVuY3Rpb24+c25kX2NhcmRfY3JlYXRlKCk8L2Z1bmN0aW9uPi48L3RpdGxlPgorICAgICAgICA8dGl0bGU+MS4gQWxsb2NhdGluZyB2aWEgPGZ1bmN0aW9uPnNuZF9jYXJkX25ldygpPC9mdW5jdGlvbj4uPC90aXRsZT4KICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB5b3UgY2FuIHBhc3MgdGhlIGV4dHJhLWRhdGEtbGVuZ3RoCi0JICB0byB0aGUgNHRoIGFyZ3VtZW50IG9mIDxmdW5jdGlvbj5zbmRfY2FyZF9jcmVhdGUoKTwvZnVuY3Rpb24+LCBpLmUuCisJICB0byB0aGUgNXRoIGFyZ3VtZW50IG9mIDxmdW5jdGlvbj5zbmRfY2FyZF9uZXcoKTwvZnVuY3Rpb24+LCBpLmUuCiAKICAgICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgogICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgogPCFbQ0RBVEFbCi0gIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXljaGlwKSwgJmNhcmQpOworICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXljaGlwKSwgJmNhcmQpOwogXV0+CiAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgICAgIDwvaW5mb3JtYWxleGFtcGxlPgpAQCAtOTU0LDcgKzk2MCw3IEBACiAKICAgICAgICAgPHBhcmE+CiAgICAgICAgICAgQWZ0ZXIgYWxsb2NhdGluZyBhIGNhcmQgaW5zdGFuY2UgdmlhCi0gICAgICAgICAgPGZ1bmN0aW9uPnNuZF9jYXJkX2NyZWF0ZSgpPC9mdW5jdGlvbj4gKHdpdGgKKyAgICAgICAgICA8ZnVuY3Rpb24+c25kX2NhcmRfbmV3KCk8L2Z1bmN0aW9uPiAod2l0aAogICAgICAgICAgIDxjb25zdGFudD4wPC9jb25zdGFudD4gb24gdGhlIDR0aCBhcmcpLCBjYWxsCiAgICAgICAgICAgPGZ1bmN0aW9uPmt6YWxsb2MoKTwvZnVuY3Rpb24+LiAKIApAQCAtOTYzLDcgKzk2OSw4IEBACiA8IVtDREFUQVsKICAgc3RydWN0IHNuZF9jYXJkICpjYXJkOwogICBzdHJ1Y3QgbXljaGlwICpjaGlwOwotICBlcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKyAgZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAwLCAmY2FyZCk7CiAgIC4uLi4uCiAgIGNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogXV0+CkBAIC0xMTcwLDggKzExNzcsNiBAQAogICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KICAgICAgICAgICAqcmNoaXAgPSBjaGlwOwogICAgICAgICAgIHJldHVybiAwOwogICB9ICAgICAgICAKQEAgLTE1MjYsMzAgKzE1MzEsNiBAQAogCiAgICAgPC9zZWN0aW9uPgogCi0gICAgPHNlY3Rpb24gaWQ9InBjaS1yZXNvdXJjZS1kZXZpY2Utc3RydWN0Ij4KLSAgICAgIDx0aXRsZT5SZWdpc3RyYXRpb24gb2YgRGV2aWNlIFN0cnVjdDwvdGl0bGU+Ci0gICAgICA8cGFyYT4KLQlBdCBzb21lIHBvaW50LCB0eXBpY2FsbHkgYWZ0ZXIgY2FsbGluZyA8ZnVuY3Rpb24+c25kX2RldmljZV9uZXcoKTwvZnVuY3Rpb24+LAotCXlvdSBuZWVkIHRvIHJlZ2lzdGVyIHRoZSBzdHJ1Y3QgPHN0cnVjdG5hbWU+ZGV2aWNlPC9zdHJ1Y3RuYW1lPiBvZiB0aGUgY2hpcAotCXlvdSdyZSBoYW5kbGluZyBmb3IgdWRldiBhbmQgY28uICBBTFNBIHByb3ZpZGVzIGEgbWFjcm8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotCW9sZGVyIGtlcm5lbHMuICBTaW1wbHkgY2FsbCBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIDxpbmZvcm1hbGV4YW1wbGU+Ci0gICAgICAgICAgPHByb2dyYW1saXN0aW5nPgotPCFbQ0RBVEFbCi0gIHNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLV1dPgotICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICAgIDwvaW5mb3JtYWxleGFtcGxlPgotCXNvIHRoYXQgaXQgc3RvcmVzIHRoZSBQQ0kncyBkZXZpY2UgcG9pbnRlciB0byB0aGUgY2FyZC4gIFRoaXMgd2lsbCBiZQotCXJlZmVycmVkIGJ5IEFMU0EgY29yZSBmdW5jdGlvbnMgbGF0ZXIgd2hlbiB0aGUgZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZC4KLSAgICAgIDwvcGFyYT4KLSAgICAgIDxwYXJhPgotCUluIHRoZSBjYXNlIG9mIG5vbi1QQ0ksIHBhc3MgdGhlIHByb3BlciBkZXZpY2Ugc3RydWN0IHBvaW50ZXIgb2YgdGhlIEJVUwotCWluc3RlYWQuICAoSW4gdGhlIGNhc2Ugb2YgbGVnYWN5IElTQSB3aXRob3V0IFBuUCwgeW91IGRvbid0IGhhdmUgdG8gZG8KLQlhbnl0aGluZy4pCi0gICAgICA8L3BhcmE+Ci0gICAgPC9zZWN0aW9uPgotCiAgICAgPHNlY3Rpb24gaWQ9InBjaS1yZXNvdXJjZS1lbnRyaWVzIj4KICAgICAgIDx0aXRsZT5QQ0kgRW50cmllczwvdGl0bGU+CiAgICAgICA8cGFyYT4KQEAgLTU3NDAsNyArNTcyMSw4IEBACiAgICAgICAgICAgc3RydWN0IG15Y2hpcCAqY2hpcDsKICAgICAgICAgICBpbnQgZXJyOwogICAgICAgICAgIC4uLi4KLSAgICAgICAgICBlcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKyAgICAgICAgICBlcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNhcmQpOwogICAgICAgICAgIC4uLi4KICAgICAgICAgICBjaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKICAgICAgICAgICAuLi4uCkBAIC01NzUyLDcgKzU3MzQsNyBAQAogICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CiAKIAlXaGVuIHlvdSBjcmVhdGVkIHRoZSBjaGlwIGRhdGEgd2l0aAotCTxmdW5jdGlvbj5zbmRfY2FyZF9jcmVhdGUoKTwvZnVuY3Rpb24+LCBpdCdzIGFueXdheSBhY2Nlc3NpYmxlCisJPGZ1bmN0aW9uPnNuZF9jYXJkX25ldygpPC9mdW5jdGlvbj4sIGl0J3MgYW55d2F5IGFjY2Vzc2libGUKIAl2aWEgPHN0cnVjdGZpZWxkPnByaXZhdGVfZGF0YTwvc3RydWN0ZmllbGQ+IGZpZWxkLgogCiAgICAgICA8aW5mb3JtYWxleGFtcGxlPgpAQCAtNTc2Niw4ICs1NzQ4LDggQEAKICAgICAgICAgICBzdHJ1Y3QgbXljaGlwICpjaGlwOwogICAgICAgICAgIGludCBlcnI7CiAgICAgICAgICAgLi4uLgotICAgICAgICAgIGVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBteWNoaXApLCAmY2FyZCk7CisgICAgICAgICAgZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXljaGlwKSwgJmNhcmQpOwogICAgICAgICAgIC4uLi4KICAgICAgICAgICBjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogICAgICAgICAgIC4uLi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUENJL3BjaS1pb3YtaG93dG8udHh0IGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLWlvdi1ob3d0by50eHQKaW5kZXggODY1NTFjYy4uMmQ5MWFlMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLWlvdi1ob3d0by50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLWlvdi1ob3d0by50eHQKQEAgLTY4LDEwICs2OCw2IEBACiAJZWNobyAgMCA+IFwKICAgICAgICAgL3N5cy9idXMvcGNpL2RldmljZXMvPERPTUFJTjpCVVM6REVWSUNFLkZVTkNUSU9OPi9zcmlvdl9udW12ZnMKIAotVG8gbm90aWZ5IFNSLUlPViBjb3JlIG9mIFZpcnR1YWwgRnVuY3Rpb24gTWlncmF0aW9uOgotKGEpIEluIHRoZSBkcml2ZXI6Ci0JaXJxcmV0dXJuX3QgcGNpX3NyaW92X21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLQogMy4yIFVzYWdlIGV4YW1wbGUKIAogRm9sbG93aW5nIHBpZWNlIG9mIGNvZGUgaWxsdXN0cmF0ZXMgdGhlIHVzYWdlIG9mIHRoZSBTUi1JT1YgQVBJLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvUlRGUC50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9SVEZQLnR4dAppbmRleCAyNzNlNjU0ZC4uMmYwZmNiMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvUlRGUC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvUlRGUC50eHQKQEAgLTMxLDYgKzMxLDE0IEBACiAoSW4gY29udHJhc3QsIGltcGxlbWVudGF0aW9uIG9mIFJDVSBpcyBwZXJtaXR0ZWQgb25seSBpbiBzb2Z0d2FyZSBsaWNlbnNlZAogdW5kZXIgZWl0aGVyIEdQTCBvciBMR1BMLiAgU29ycnkhISEpCiAKK0luIDE5ODcsIFJhc2hpZCBldCBhbC4gZGVzY3JpYmVkIGxhenkgVExCLWZsdXNoIFtSaWNoYXJkUmFzaGlkODdhXS4KK0F0IGZpcnN0IGdsYW5jZSwgdGhpcyBoYXMgbm90aGluZyB0byBkbyB3aXRoIFJDVSwgYnV0IG5ldmVydGhlbGVzcwordGhpcyBwYXBlciBoZWxwZWQgaW5zcGlyZSB0aGUgdXBkYXRlLXNpZGUgYmF0Y2hpbmcgdXNlZCBpbiB0aGUgbGF0ZXIKK1JDVSBpbXBsZW1lbnRhdGlvbiBpbiBEWU5JWC9wdHguICBJbiAxOTg4LCBCYXJiYXJhIExpc2tvdiBwdWJsaXNoZWQKK2EgZGVzY3JpcHRpb24gb2YgQXJndXMgdGhhdCBub3RlZCB0aGF0IHVzZSBvZiBvdXQtb2YtZGF0ZSB2YWx1ZXMgY2FuCitiZSB0b2xlcmF0ZWQgaW4gc29tZSBzaXR1YXRpb25zLiAgVGh1cywgdGhpcyBwYXBlciBwcm92aWRlcyBzb21lIGVhcmx5Cit0aGVvcmV0aWNhbCBqdXN0aWZpY2F0aW9uIGZvciB1c2Ugb2Ygc3RhbGUgZGF0YS4KKwogSW4gMTk5MCwgUHVnaCBbUHVnaDkwXSBub3RlZCB0aGF0IGV4cGxpY2l0bHkgdHJhY2tpbmcgd2hpY2ggdGhyZWFkcwogd2VyZSByZWFkaW5nIGEgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgcGVybWl0dGVkIGRlZmVycmVkIGZyZWUgdG8gb3BlcmF0ZQogaW4gdGhlIHByZXNlbmNlIG9mIG5vbi10ZXJtaW5hdGluZyB0aHJlYWRzLiAgSG93ZXZlciwgdGhpcyBleHBsaWNpdApAQCAtNDEsMTEgKzQ5LDExIEBACiB0byBzZWUgaG93IG11Y2ggb2YgdGhlIHBlcmZvcm1hbmNlIGFkdmFudGFnZSByZXBvcnRlZCBpbiAxOTkwIHJlbWFpbnMKIHRvZGF5LgogCi1BdCBhYm91dCB0aGlzIHNhbWUgdGltZSwgQWRhbXMgW0FkYW1zOTFdIGRlc2NyaWJlZCBgYGNoYW90aWMgcmVsYXhhdGlvbicnLAotd2hlcmUgdGhlIG5vcm1hbCBiYXJyaWVycyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgaXRlcmF0aW9ucyBvZiBjb252ZXJnZW50Ci1udW1lcmljYWwgYWxnb3JpdGhtcyBhcmUgcmVsYXhlZCwgc28gdGhhdCBpdGVyYXRpb24gJG4kIG1pZ2h0IHVzZQotZGF0YSBmcm9tIGl0ZXJhdGlvbiAkbi0xJCBvciBldmVuICRuLTIkLiAgVGhpcyBpbnRyb2R1Y2VzIGVycm9yLAotd2hpY2ggdHlwaWNhbGx5IHNsb3dzIGNvbnZlcmdlbmNlIGFuZCB0aHVzIGluY3JlYXNlcyB0aGUgbnVtYmVyIG9mCitBdCBhYm91dCB0aGlzIHNhbWUgdGltZSwgQW5kcmV3cyBbQW5kcmV3czkxdGV4dGJvb2tdIGRlc2NyaWJlZCBgYGNoYW90aWMKK3JlbGF4YXRpb24nJywgd2hlcmUgdGhlIG5vcm1hbCBiYXJyaWVycyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgaXRlcmF0aW9ucworb2YgY29udmVyZ2VudCBudW1lcmljYWwgYWxnb3JpdGhtcyBhcmUgcmVsYXhlZCwgc28gdGhhdCBpdGVyYXRpb24gJG4kCittaWdodCB1c2UgZGF0YSBmcm9tIGl0ZXJhdGlvbiAkbi0xJCBvciBldmVuICRuLTIkLiAgVGhpcyBpbnRyb2R1Y2VzCitlcnJvciwgd2hpY2ggdHlwaWNhbGx5IHNsb3dzIGNvbnZlcmdlbmNlIGFuZCB0aHVzIGluY3JlYXNlcyB0aGUgbnVtYmVyIG9mCiBpdGVyYXRpb25zIHJlcXVpcmVkLiAgSG93ZXZlciwgdGhpcyBpbmNyZWFzZSBpcyBzb21ldGltZXMgbW9yZSB0aGFuIG1hZGUKIHVwIGZvciBieSBhIHJlZHVjdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGV4cGVuc2l2ZSBiYXJyaWVyIG9wZXJhdGlvbnMsCiB3aGljaCBhcmUgb3RoZXJ3aXNlIHJlcXVpcmVkIHRvIHN5bmNocm9uaXplIHRoZSB0aHJlYWRzIGF0IHRoZSBlbmQKQEAgLTU1LDcgKzYzLDggQEAKIAogSW4gMTk5MiwgSGVucnkgKG5vdyBBbGV4aWEpIE1hc3NhbGluIGNvbXBsZXRlZCBhIGRpc3NlcnRhdGlvbiBhZHZpc2luZwogcGFyYWxsZWwgcHJvZ3JhbW1lcnMgdG8gZGVmZXIgcHJvY2Vzc2luZyB3aGVuIGZlYXNpYmxlIHRvIHNpbXBsaWZ5Ci1zeW5jaHJvbml6YXRpb24uICBSQ1UgbWFrZXMgZXh0cmVtZWx5IGhlYXZ5IHVzZSBvZiB0aGlzIGFkdmljZS4KK3N5bmNocm9uaXphdGlvbiBbSE1hc3NhbGluUGhEXS4gIFJDVSBtYWtlcyBleHRyZW1lbHkgaGVhdnkgdXNlIG9mCit0aGlzIGFkdmljZS4KIAogSW4gMTk5MywgSmFjb2Jzb24gW0phY29ic29uOTNdIHZlcmJhbGx5IGRlc2NyaWJlZCB3aGF0IGlzIHBlcmhhcHMgdGhlCiBzaW1wbGVzdCBkZWZlcnJlZC1mcmVlIHRlY2huaXF1ZTogc2ltcGx5IHdhaXRpbmcgYSBmaXhlZCBhbW91bnQgb2YgdGltZQpAQCAtOTAsMjcgKzk5LDI5IEBACiBzeXN0ZW1zIG1hZGUgcGVydmFzaXZlIHVzZSBvZiBSQ1UgaW4gcGxhY2Ugb2YgImV4aXN0ZW5jZSBsb2NrcyIsIHdoaWNoCiBncmVhdGx5IHNpbXBsaWZpZXMgbG9ja2luZyBoaWVyYXJjaGllcyBhbmQgaGVscHMgYXZvaWQgZGVhZGxvY2tzLgogCi0yMDAxIHNhdyB0aGUgZmlyc3QgUkNVIHByZXNlbnRhdGlvbiBpbnZvbHZpbmcgTGludXggW01jS2VubmV5MDFhXQotYXQgT0xTLiAgVGhlIHJlc3VsdGluZyBhYnVuZGFuY2Ugb2YgUkNVIHBhdGNoZXMgd2FzIHByZXNlbnRlZCB0aGUKLWZvbGxvd2luZyB5ZWFyIFtNY0tlbm5leTAyYV0sIGFuZCB1c2Ugb2YgUkNVIGluIGRjYWNoZSB3YXMgZmlyc3QKLWRlc2NyaWJlZCB0aGF0IHNhbWUgeWVhciBbTGluZGVyMDJhXS4KK1RoZSB5ZWFyIDIwMDAgc2F3IGFuIGVtYWlsIGV4Y2hhbmdlIHRoYXQgd291bGQgbGlrZWx5IGhhdmUKK2xlZCB0byB5ZXQgYW5vdGhlciBpbmRlcGVuZGVudCBpbnZlbnRpb24gb2Ygc29tZXRoaW5nIGxpa2UgUkNVCitbUnVzdHlSdXNzZWxsMjAwMGEsUnVzdHlSdXNzZWxsMjAwMGJdLiAgSW5zdGVhZCwgMjAwMSBzYXcgdGhlIGZpcnN0CitSQ1UgcHJlc2VudGF0aW9uIGludm9sdmluZyBMaW51eCBbTWNLZW5uZXkwMWFdIGF0IE9MUy4gIFRoZSByZXN1bHRpbmcKK2FidW5kYW5jZSBvZiBSQ1UgcGF0Y2hlcyB3YXMgcHJlc2VudGVkIHRoZSBmb2xsb3dpbmcgeWVhciBbTWNLZW5uZXkwMmFdLAorYW5kIHVzZSBvZiBSQ1UgaW4gZGNhY2hlIHdhcyBmaXJzdCBkZXNjcmliZWQgdGhhdCBzYW1lIHllYXIgW0xpbmRlcjAyYV0uCiAKIEFsc28gaW4gMjAwMiwgTWljaGFlbCBbTWljaGFlbDAyYixNaWNoYWVsMDJhXSBwcmVzZW50ZWQgImhhemFyZC1wb2ludGVyIgogdGVjaG5pcXVlcyB0aGF0IGRlZmVyIHRoZSBkZXN0cnVjdGlvbiBvZiBkYXRhIHN0cnVjdHVyZXMgdG8gc2ltcGxpZnkKIG5vbi1ibG9ja2luZyBzeW5jaHJvbml6YXRpb24gKHdhaXQtZnJlZSBzeW5jaHJvbml6YXRpb24sIGxvY2stZnJlZQogc3luY2hyb25pemF0aW9uLCBhbmQgb2JzdHJ1Y3Rpb24tZnJlZSBzeW5jaHJvbml6YXRpb24gYXJlIGFsbCBleGFtcGxlcyBvZgotbm9uLWJsb2NraW5nIHN5bmNocm9uaXphdGlvbikuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHRlY2huaXF1ZSBlbGltaW5hdGVzCi1sb2NraW5nLCByZWR1Y2VzIGNvbnRlbnRpb24sIHJlZHVjZXMgbWVtb3J5IGxhdGVuY3kgZm9yIHJlYWRlcnMsIGFuZAotcGFyYWxsZWxpemVzIHBpcGVsaW5lIHN0YWxscyBhbmQgbWVtb3J5IGxhdGVuY3kgZm9yIHdyaXRlcnMuICBIb3dldmVyLAotdGhlc2UgdGVjaG5pcXVlcyBzdGlsbCBpbXBvc2Ugc2lnbmlmaWNhbnQgcmVhZC1zaWRlIG92ZXJoZWFkIGluIHRoZQotZm9ybSBvZiBtZW1vcnkgYmFycmllcnMuICBSZXNlYXJjaGVycyBhdCBTdW4gd29ya2VkIGFsb25nIHNpbWlsYXIgbGluZXMKLWluIHRoZSBzYW1lIHRpbWVmcmFtZSBbSGVybGloeUxNMDJdLiAgVGhlc2UgdGVjaG5pcXVlcyBjYW4gYmUgdGhvdWdodAotb2YgYXMgaW5zaWRlLW91dCByZWZlcmVuY2UgY291bnRzLCB3aGVyZSB0aGUgY291bnQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlCi1udW1iZXIgb2YgaGF6YXJkIHBvaW50ZXJzIHJlZmVyZW5jaW5nIGEgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4KLXRoZSBtb3JlIGNvbnZlbnRpb25hbCBjb3VudGVyIGZpZWxkIHdpdGhpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgaXRzZWxmLgotVGhlIGtleSBhZHZhbnRhZ2Ugb2YgaW5zaWRlLW91dCByZWZlcmVuY2UgY291bnRzIGlzIHRoYXQgdGhleSBjYW4gYmUKLXN0b3JlZCBpbiBpbW1vcnRhbCB2YXJpYWJsZXMsIHRodXMgYWxsb3dpbmcgcmFjZXMgYmV0d2VlbiBhY2Nlc3MgYW5kCi1kZWxldGlvbiB0byBiZSBhdm9pZGVkLgorbm9uLWJsb2NraW5nIHN5bmNocm9uaXphdGlvbikuICBUaGUgY29ycmVzcG9uZGluZyBqb3VybmFsIGFydGljbGUgYXBwZWFyZWQKK2luIDIwMDQgW01hZ2VkTWljaGFlbDA0YV0uICBUaGlzIHRlY2huaXF1ZSBlbGltaW5hdGVzIGxvY2tpbmcsIHJlZHVjZXMKK2NvbnRlbnRpb24sIHJlZHVjZXMgbWVtb3J5IGxhdGVuY3kgZm9yIHJlYWRlcnMsIGFuZCBwYXJhbGxlbGl6ZXMgcGlwZWxpbmUKK3N0YWxscyBhbmQgbWVtb3J5IGxhdGVuY3kgZm9yIHdyaXRlcnMuICBIb3dldmVyLCB0aGVzZSB0ZWNobmlxdWVzIHN0aWxsCitpbXBvc2Ugc2lnbmlmaWNhbnQgcmVhZC1zaWRlIG92ZXJoZWFkIGluIHRoZSBmb3JtIG9mIG1lbW9yeSBiYXJyaWVycy4KK1Jlc2VhcmNoZXJzIGF0IFN1biB3b3JrZWQgYWxvbmcgc2ltaWxhciBsaW5lcyBpbiB0aGUgc2FtZSB0aW1lZnJhbWUKK1tIZXJsaWh5TE0wMl0uICBUaGVzZSB0ZWNobmlxdWVzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGluc2lkZS1vdXQgcmVmZXJlbmNlCitjb3VudHMsIHdoZXJlIHRoZSBjb3VudCBpcyByZXByZXNlbnRlZCBieSB0aGUgbnVtYmVyIG9mIGhhemFyZCBwb2ludGVycworcmVmZXJlbmNpbmcgYSBnaXZlbiBkYXRhIHN0cnVjdHVyZSByYXRoZXIgdGhhbiB0aGUgbW9yZSBjb252ZW50aW9uYWwKK2NvdW50ZXIgZmllbGQgd2l0aGluIHRoZSBkYXRhIHN0cnVjdHVyZSBpdHNlbGYuICBUaGUga2V5IGFkdmFudGFnZQorb2YgaW5zaWRlLW91dCByZWZlcmVuY2UgY291bnRzIGlzIHRoYXQgdGhleSBjYW4gYmUgc3RvcmVkIGluIGltbW9ydGFsCit2YXJpYWJsZXMsIHRodXMgYWxsb3dpbmcgcmFjZXMgYmV0d2VlbiBhY2Nlc3MgYW5kIGRlbGV0aW9uIHRvIGJlIGF2b2lkZWQuCiAKIEJ5IHRoZSBzYW1lIHRva2VuLCBSQ1UgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSAiYnVsayByZWZlcmVuY2UgY291bnQiLAogd2hlcmUgc29tZSBmb3JtIG9mIHJlZmVyZW5jZSBjb3VudGVyIGNvdmVycyBhbGwgcmVmZXJlbmNlIGJ5IGEgZ2l2ZW4gQ1BVCkBAIC0xMjMsOCArMTM0LDEwIEBACiAKIEluIDIwMDMsIHRoZSBLNDIgZ3JvdXAgZGVzY3JpYmVkIGhvdyBSQ1UgY291bGQgYmUgdXNlZCB0byBjcmVhdGUKIGhvdC1wbHVnZ2FibGUgaW1wbGVtZW50YXRpb25zIG9mIG9wZXJhdGluZy1zeXN0ZW0gZnVuY3Rpb25zIFtBcHBhdm9vMDNhXS4KLUxhdGVyIHRoYXQgeWVhciBzYXcgYSBwYXBlciBkZXNjcmliaW5nIGFuIFJDVSBpbXBsZW1lbnRhdGlvbiBvZiBTeXN0ZW0KLVYgSVBDIFtBcmNhbmdlbGkwM10sIGFuZCBhbiBpbnRyb2R1Y3Rpb24gdG8gUkNVIGluIExpbnV4IEpvdXJuYWwKK0xhdGVyIHRoYXQgeWVhciBzYXcgYSBwYXBlciBkZXNjcmliaW5nIGFuIFJDVSBpbXBsZW1lbnRhdGlvbgorb2YgU3lzdGVtIFYgSVBDIFtBcmNhbmdlbGkwM10gKGZvbGxvd2luZyB1cCBvbiBhIHN1Z2dlc3Rpb24gYnkKK0h1Z2ggRGlja2lucyBbRGlja2luczAyYV0gYW5kIGFuIGltcGxlbWVudGF0aW9uIGJ5IE1pbmdtaW5nIENhbworW01pbmdtaW5nQ2FvMjAwMklQQ1JDVV0pLCBhbmQgYW4gaW50cm9kdWN0aW9uIHRvIFJDVSBpbiBMaW51eCBKb3VybmFsCiBbTWNLZW5uZXkwM2FdLgogCiAyMDA0IGhhcyBzZWVuIGEgTGludXgtSm91cm5hbCBhcnRpY2xlIG9uIHVzZSBvZiBSQ1UgaW4gZGNhY2hlCkBAIC0zODMsNiArMzk2LDIxIEBACiB9CiB9CiAKK0BwaGR0aGVzaXN7SE1hc3NhbGluUGhECissYXV0aG9yPSJILiBNYXNzYWxpbiIKKyx0aXRsZT0iU3ludGhlc2lzOiBBbiBFZmZpY2llbnQgSW1wbGVtZW50YXRpb24gb2YgRnVuZGFtZW50YWwgT3BlcmF0aW5nCitTeXN0ZW0gU2VydmljZXMiCissc2Nob29sPSJDb2x1bWJpYSBVbml2ZXJzaXR5IgorLGFkZHJlc3M9Ik5ldyBZb3JrLCBOWSIKKyx5ZWFyPSIxOTkyIgorLGFubm90YXRpb249eworCU1vbmRvIG9wdGltaXppbmcgY29tcGlsZXIuCisJV2FpdC1mcmVlIHN0dWZmLgorCUdvb2QgYWR2aWNlOiBkZWZlciB3b3JrIHRvIGF2b2lkIHN5bmNocm9uaXphdGlvbi4gIFNlZSBwYWdlIDkwCisJCShQREYgcGFnZSAxMDYpLCBTZWN0aW9uIDUuNCwgZm91cnRoIGJ1bGxldCBwb2ludC4KK30KK30KKwogQHVucHVibGlzaGVke0phY29ic29uOTMKICxhdXRob3I9IlZhbiBKYWNvYnNvbiIKICx0aXRsZT0iQXZvaWQgUmVhZC1TaWRlIExvY2tpbmcgVmlhIERlbGF5ZWQgRnJlZSIKQEAgLTY3MSw2ICs2OTksMjAgQEAKIFtWaWV3ZWQgT2N0b2JlciAxOCwgMjAwNF0iCiB9CiAKK0Bjb25mZXJlbmNle01pY2hhZWwwMmIKKyxhdXRob3I9Ik1hZ2VkIE0uIE1pY2hhZWwiCissdGl0bGU9IkhpZ2ggUGVyZm9ybWFuY2UgRHluYW1pYyBMb2NrLUZyZWUgSGFzaCBUYWJsZXMgYW5kIExpc3QtQmFzZWQgU2V0cyIKKyxZZWFyPSIyMDAyIgorLE1vbnRoPSJBdWd1c3QiCissYm9va3RpdGxlPSJ7UHJvY2VlZGluZ3Mgb2YgdGhlIDE0XHRleHRzdXBlcnNjcmlwdHt0aH0gQW5udWFsIEFDTQorU3ltcG9zaXVtIG9uIFBhcmFsbGVsCitBbGdvcml0aG1zIGFuZCBBcmNoaXRlY3R1cmV9IgorLHBhZ2VzPSI3My04MiIKKyxhbm5vdGF0aW9uPXsKK0xpa2UgdGhlIHRpdGxlIHNheXMuLi4KK30KK30KKwogQENvbmZlcmVuY2V7TGluZGVyMDJhCiAsQXV0aG9yPSJIYW5uYSBMaW5kZXIgYW5kIERpcGFua2FyIFNhcm1hIGFuZCBNYW5lZXNoIFNvbmkiCiAsVGl0bGU9IlNjYWxhYmlsaXR5IG9mIHRoZSBEaXJlY3RvcnkgRW50cnkgQ2FjaGUiCkBAIC03MjcsNiArNzY5LDI0IEBACiB9CiB9CiAKK0Bjb25mZXJlbmNle01pY2hhZWwwMmEKKyxhdXRob3I9Ik1hZ2VkIE0uIE1pY2hhZWwiCissdGl0bGU9IlNhZmUgTWVtb3J5IFJlY2xhbWF0aW9uIGZvciBEeW5hbWljIExvY2stRnJlZSBPYmplY3RzIFVzaW5nIEF0b21pYworUmVhZHMgYW5kIFdyaXRlcyIKKyxZZWFyPSIyMDAyIgorLE1vbnRoPSJBdWd1c3QiCissYm9va3RpdGxlPSJ7UHJvY2VlZGluZ3Mgb2YgdGhlIDIxXHRleHRzdXBlcnNjcmlwdHtzdH0gQW5udWFsIEFDTQorU3ltcG9zaXVtIG9uIFByaW5jaXBsZXMgb2YgRGlzdHJpYnV0ZWQgQ29tcHV0aW5nfSIKKyxwYWdlcz0iMjEtMzAiCissYW5ub3RhdGlvbj17CisJRWFjaCB0aHJlYWQga2VlcHMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaXRlbXMgdGhhdCBpdCBpcworCWN1cnJlbnRseSByZWZlcmVuY2luZy4JU29ydCBvZiBhbiBpbnNpZGUtb3V0IGdhcmJhZ2UgY29sbGVjdGlvbgorCW1lY2hhbmlzbSwgYnV0IG9uZSB0aGF0IHJlcXVpcmVzIHRoZSBhY2Nlc3NpbmcgY29kZSB0byBleHBsaWNpdGx5CisJc3RhdGUgaXRzIG5lZWRzLiAgQWxzbyByZXF1aXJlcyByZWFkLXNpZGUgbWVtb3J5IGJhcnJpZXJzIG9uCisJbW9zdCBhcmNoaXRlY3R1cmVzLgorfQorfQorCiBAdW5wdWJsaXNoZWR7RGlja2luczAyYQogLGF1dGhvcj0iSHVnaCBEaWNraW5zIgogLHRpdGxlPSJVc2UgUkNVIGZvciBTeXN0ZW0tViBJUEMiCkBAIC03MzUsNiArNzk1LDE3IEBACiAsbm90ZT0icHJpdmF0ZSBjb21tdW5pY2F0aW9uIgogfQogCitASW5Qcm9jZWVkaW5nc3tIZXJsaWh5TE0wMgorLGF1dGhvcj17TWF1cmljZSBIZXJsaWh5IGFuZCBWaWN0b3IgTHVjaGFuZ2NvIGFuZCBNYXJrIE1vaXJ9CissdGl0bGU9IlRoZSBSZXBlYXQgT2ZmZW5kZXIgUHJvYmxlbTogQSBNZWNoYW5pc20gZm9yIFN1cHBvcnRpbmcgRHluYW1pYy1TaXplZCwKK0xvY2stRnJlZSBEYXRhIFN0cnVjdHVyZXMiCissYm9va3RpdGxlPXtQcm9jZWVkaW5ncyBvZiAxNlx0ZXh0c3VwZXJzY3JpcHR7dGh9IEludGVybmF0aW9uYWwKK1N5bXBvc2l1bSBvbiBEaXN0cmlidXRlZCBDb21wdXRpbmd9CisseWVhcj0yMDAyCissbW9udGg9Ik9jdG9iZXIiCisscGFnZXM9IjMzOS0zNTMiCit9CisKIEB1bnB1Ymxpc2hlZHtTYXJtYTAyYgogLEF1dGhvcj0iRGlwYW5rYXIgU2FybWEiCiAsVGl0bGU9IlNvbWUgZGNhY2hlXF9yY3UgYmVuY2htYXJrIG51bWJlcnMiCkBAIC03NDksNiArODIwLDE5IEBACiB9CiB9CiAKK0B1bnB1Ymxpc2hlZHtNaW5nbWluZ0NhbzIwMDJJUENSQ1UKKyxBdXRob3I9Ik1pbmdtaW5nIENhbyIKKyxUaXRsZT0iW1BBVENIXXVwZGF0ZWQgaXBjIGxvY2sgcGF0Y2giCissbW9udGg9Ik9jdG9iZXIiCisseWVhcj0iMjAwMiIKKyxub3RlPSJBdmFpbGFibGU6CitcdXJse2h0dHBzOi8vbGttbC5vcmcvbGttbC8yMDAyLzEwLzI0LzI2Mn0KK1tWaWV3ZWQgRmVicnVhcnkgMTUsIDIwMTRdIgorLGFubm90YXRpb249eworCU1pbmdtaW5nIENhbydzIHBhdGNoIHRvIGludHJvZHVjZSBSQ1UgdG8gU3lzViBJUEMuCit9Cit9CisKIEB1bnB1Ymxpc2hlZHtMaW51c1RvcnZhbGRzMjAwM2EKICxBdXRob3I9IkxpbnVzIFRvcnZhbGRzIgogLFRpdGxlPSJSZToge1tQQVRDSF19IHNtYWxsIGZpeGVzIGluIGJybG9jay5oIgpAQCAtOTgyLDYgKzEwNjYsMjMgQEAKIH0KIH0KIAorQGFydGljbGV7TWFnZWRNaWNoYWVsMDRhCissYXV0aG9yPSJNYWdlZCBNLiBNaWNoYWVsIgorLHRpdGxlPSJIYXphcmQgUG9pbnRlcnM6IFNhZmUgTWVtb3J5IFJlY2xhbWF0aW9uIGZvciBMb2NrLUZyZWUgT2JqZWN0cyIKKyxZZWFyPSIyMDA0IgorLE1vbnRoPSJKdW5lIgorLGpvdXJuYWw9IklFRUUgVHJhbnNhY3Rpb25zIG9uIFBhcmFsbGVsIGFuZCBEaXN0cmlidXRlZCBTeXN0ZW1zIgorLHZvbHVtZT0iMTUiCissbnVtYmVyPSI2IgorLHBhZ2VzPSI0OTEtNTA0IgorLHVybD0iQXZhaWxhYmxlOgorXHVybHtodHRwOi8vd3d3LnJlc2VhcmNoLmlibS5jb20vcGVvcGxlL20vbWljaGFlbC9pZWVldHBkcy0yMDA0LnBkZn0KK1tWaWV3ZWQgTWFyY2ggMSwgMjAwNV0iCissYW5ub3RhdGlvbj17CisJTmV3IGNhbm9uaWNhbCBoYXphcmQtcG9pbnRlciBjaXRhdGlvbi4KK30KK30KKwogQHBoZHRoZXNpc3tQYXVsRWR3YXJkTWNLZW5uZXlQaEQKICxhdXRob3I9IlBhdWwgRS4gTWNLZW5uZXkiCiAsdGl0bGU9IkV4cGxvaXRpbmcgRGVmZXJyZWQgRGVzdHJ1Y3Rpb246CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCA5MTI2NjE5Li45ZDEwZDFkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTI1NiwxMCArMjU2LDEwIEBACiAJCXZhcmlhdGlvbnMgb24gdGhpcyB0aGVtZS4KIAogCWIuCUxpbWl0aW5nIHVwZGF0ZSByYXRlLiAgRm9yIGV4YW1wbGUsIGlmIHVwZGF0ZXMgb2NjdXIgb25seQotCQlvbmNlIHBlciBob3VyLCB0aGVuIG5vIGV4cGxpY2l0IHJhdGUgbGltaXRpbmcgaXMgcmVxdWlyZWQsCi0JCXVubGVzcyB5b3VyIHN5c3RlbSBpcyBhbHJlYWR5IGJhZGx5IGJyb2tlbi4gIFRoZSBkY2FjaGUKLQkJc3Vic3lzdGVtIHRha2VzIHRoaXMgYXBwcm9hY2ggLS0gdXBkYXRlcyBhcmUgZ3VhcmRlZAotCQlieSBhIGdsb2JhbCBsb2NrLCBsaW1pdGluZyB0aGVpciByYXRlLgorCQlvbmNlIHBlciBob3VyLCB0aGVuIG5vIGV4cGxpY2l0IHJhdGUgbGltaXRpbmcgaXMKKwkJcmVxdWlyZWQsIHVubGVzcyB5b3VyIHN5c3RlbSBpcyBhbHJlYWR5IGJhZGx5IGJyb2tlbi4KKwkJT2xkZXIgdmVyc2lvbnMgb2YgdGhlIGRjYWNoZSBzdWJzeXN0ZW0gdGFrZSB0aGlzIGFwcHJvYWNoLAorCQlndWFyZGluZyB1cGRhdGVzIHdpdGggYSBnbG9iYWwgbG9jaywgbGltaXRpbmcgdGhlaXIgcmF0ZS4KIAogCWMuCVRydXN0ZWQgdXBkYXRlIC0tIGlmIHVwZGF0ZXMgY2FuIG9ubHkgYmUgZG9uZSBtYW51YWxseSBieQogCQlzdXBlcnVzZXIgb3Igc29tZSBvdGhlciB0cnVzdGVkIHVzZXIsIHRoZW4gaXQgbWlnaHQgbm90CkBAIC0yNjgsNyArMjY4LDggQEAKIAkJdGhlIG1hY2hpbmUuCiAKIAlkLglVc2UgY2FsbF9yY3VfYmgoKSByYXRoZXIgdGhhbiBjYWxsX3JjdSgpLCBpbiBvcmRlciB0byB0YWtlCi0JCWFkdmFudGFnZSBvZiBjYWxsX3JjdV9iaCgpJ3MgZmFzdGVyIGdyYWNlIHBlcmlvZHMuCisJCWFkdmFudGFnZSBvZiBjYWxsX3JjdV9iaCgpJ3MgZmFzdGVyIGdyYWNlIHBlcmlvZHMuICAoVGhpcworCQlpcyBvbmx5IGEgcGFydGlhbCBzb2x1dGlvbiwgdGhvdWdoLikKIAogCWUuCVBlcmlvZGljYWxseSBpbnZva2Ugc3luY2hyb25pemVfcmN1KCksIHBlcm1pdHRpbmcgYSBsaW1pdGVkCiAJCW51bWJlciBvZiB1cGRhdGVzIHBlciBncmFjZSBwZXJpb2QuCkBAIC0yNzYsNiArMjc3LDEzIEBACiAJVGhlIHNhbWUgY2F1dGlvbnMgYXBwbHkgdG8gY2FsbF9yY3VfYmgoKSwgY2FsbF9yY3Vfc2NoZWQoKSwKIAljYWxsX3NyY3UoKSwgYW5kIGtmcmVlX3JjdSgpLgogCisJTm90ZSB0aGF0IGFsdGhvdWdoIHRoZXNlIHByaW1pdGl2ZXMgZG8gdGFrZSBhY3Rpb24gdG8gYXZvaWQgbWVtb3J5CisJZXhoYXVzdGlvbiB3aGVuIGFueSBnaXZlbiBDUFUgaGFzIHRvbyBtYW55IGNhbGxiYWNrcywgYSBkZXRlcm1pbmVkCisJdXNlciBjb3VsZCBzdGlsbCBleGhhdXN0IG1lbW9yeS4gIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZQorCWlmIGEgc3lzdGVtIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgQ1BVcyBoYXMgYmVlbiBjb25maWd1cmVkIHRvCisJb2ZmbG9hZCBhbGwgb2YgaXRzIFJDVSBjYWxsYmFja3Mgb250byBhIHNpbmdsZSBDUFUsIG9yIGlmIHRoZQorCXN5c3RlbSBoYXMgcmVsYXRpdmVseSBsaXR0bGUgZnJlZSBtZW1vcnkuCisKIDkuCUFsbCBSQ1UgbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlcywgd2hpY2ggaW5jbHVkZQogCXJjdV9kZXJlZmVyZW5jZSgpLCBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSgpLCBhbmQKIAlsaXN0X2Zvcl9lYWNoX3NhZmVfcmN1KCksIG11c3QgYmUgZWl0aGVyIHdpdGhpbiBhbiBSQ1UgcmVhZC1zaWRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybTY0L21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL2FybTY0L21lbW9yeS50eHQKaW5kZXggNWUwNTRiZi4uODVlMjRjNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm02NC9tZW1vcnkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYXJtNjQvbWVtb3J5LnR4dApAQCAtMzUsMTEgKzM1LDEzIEBACiAKIGZmZmZmZmJlMDAwMDAwMDAJZmZmZmZmYmZmYmJmZmZmZgkgIH44R0IJCVtndWFyZCwgZnV0dXJlIHZtbWVtYXBdCiAKK2ZmZmZmZmJmZmEwMDAwMDAJZmZmZmZmYmZmYWZmZmZmZgkgIDE2TUIJCVBDSSBJL08gc3BhY2UKKworZmZmZmZmYmZmYjAwMDAwMAlmZmZmZmZiZmZiYmZmZmZmCSAgMTJNQgkJW2d1YXJkXQorCiBmZmZmZmZiZmZiYzAwMDAwCWZmZmZmZmJmZmJkZmZmZmYJICAgMk1CCQllYXJseXByaW50ayBkZXZpY2UKIAotZmZmZmZmYmZmYmUwMDAwMAlmZmZmZmZiZmZiZTBmZmZmCSAgNjRLQgkJUENJIEkvTyBzcGFjZQotCi1mZmZmZmZiZmZiZTEwMDAwCWZmZmZmZmJjZmZmZmZmZmYJICB+Mk1CCQlbZ3VhcmRdCitmZmZmZmZiZmZiZTAwMDAwCWZmZmZmZmJmZmJmZmZmZmYJICAgMk1CCQlbZ3VhcmRdCiAKIGZmZmZmZmJmZmMwMDAwMDAJZmZmZmZmYmZmZmZmZmZmZgkgIDY0TUIJCW1vZHVsZXMKIApAQCAtNjAsMTEgKzYyLDEzIEBACiAKIGZmZmZmZGZlMDAwMDAwMDAJZmZmZmZkZmZmYmJmZmZmZgkgIH44R0IJCVtndWFyZCwgZnV0dXJlIHZtbWVtYXBdCiAKK2ZmZmZmZGZmZmEwMDAwMDAJZmZmZmZkZmZmYWZmZmZmZgkgIDE2TUIJCVBDSSBJL08gc3BhY2UKKworZmZmZmZkZmZmYjAwMDAwMAlmZmZmZmRmZmZiYmZmZmZmCSAgMTJNQgkJW2d1YXJkXQorCiBmZmZmZmRmZmZiYzAwMDAwCWZmZmZmZGZmZmJkZmZmZmYJICAgMk1CCQllYXJseXByaW50ayBkZXZpY2UKIAotZmZmZmZkZmZmYmUwMDAwMAlmZmZmZmRmZmZiZTBmZmZmCSAgNjRLQgkJUENJIEkvTyBzcGFjZQotCi1mZmZmZmRmZmZiZTEwMDAwCWZmZmZmZGZmZmJmZmZmZmYJICB+Mk1CCQlbZ3VhcmRdCitmZmZmZmRmZmZiZTAwMDAwCWZmZmZmZGZmZmJmZmZmZmYJICAgMk1CCQlbZ3VhcmRdCiAKIGZmZmZmZGZmZmMwMDAwMDAJZmZmZmZkZmZmZmZmZmZmZgkgIDY0TUIJCW1vZHVsZXMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9kcmJkL2RhdGEtc3RydWN0dXJlLXY5LnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvZHJiZC9kYXRhLXN0cnVjdHVyZS12OS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MmEwZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvZHJiZC9kYXRhLXN0cnVjdHVyZS12OS50eHQKQEAgLTAsMCArMSwzOCBAQAorVGhpcyBkZXNjcmliZXMgdGhlIGluIGtlcm5lbCBkYXRhIHN0cnVjdHVyZSBmb3IgRFJCRC05LiBTdGFydGluZyB3aXRoCitMaW51eCB2My4xNCB3ZSBhcmUgcmVvcmdhbml6aW5nIERSQkQgdG8gdXNlIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCisKK0Jhc2ljIERhdGEgU3RydWN0dXJlCis9PT09PT09PT09PT09PT09PT09PQorCitBIG5vZGUgaGFzIGEgbnVtYmVyIG9mIERSQkQgcmVzb3VyY2VzLiAgRWFjaCBzdWNoIHJlc291cmNlIGhhcyBhIG51bWJlciBvZgorZGV2aWNlcyAoYWthIHZvbHVtZXMpIGFuZCBjb25uZWN0aW9ucyB0byBvdGhlciBub2RlcyAoInBlZXIgbm9kZXMiKS4gRWFjaCBEUkJECitkZXZpY2UgaXMgcmVwcmVzZW50ZWQgYnkgYSBibG9jayBkZXZpY2UgbG9jYWxseS4KKworVGhlIERSQkQgb2JqZWN0cyBhcmUgaW50ZXJjb25uZWN0ZWQgdG8gZm9ybSBhIG1hdHJpeCBhcyBkZXBpY3RlZCBiZWxvdzsgYQorZHJiZF9wZWVyX2RldmljZSBvYmplY3Qgc2l0cyBhdCBlYWNoIGludGVyc2VjdGlvbiBiZXR3ZWVuIGEgZHJiZF9kZXZpY2UgYW5kIGEKK2RyYmRfY29ubmVjdGlvbjoKKworICAvLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy4uLi4uKy0tLS0tLS0tLS0tLS0tLVwKKyAgfCAgIHJlc291cmNlICAgfCAgICBkZXZpY2UgICAgIHwgICAgIHwgICAgZGV2aWNlICAgICB8CisgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLi4uLi4rLS0tLS0tLS0tLS0tLS0tKworICB8ICBjb25uZWN0aW9uICB8ICBwZWVyX2RldmljZSAgfCAgICAgfCAgcGVlcl9kZXZpY2UgIHwKKyAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsuLi4uListLS0tLS0tLS0tLS0tLS0rCisgIDogICAgICAgICAgICAgIDogICAgICAgICAgICAgICA6ICAgICA6ICAgICAgICAgICAgICAgOgorICA6ICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgOiAgICAgOiAgICAgICAgICAgICAgIDoKKyAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsuLi4uListLS0tLS0tLS0tLS0tLS0rCisgIHwgIGNvbm5lY3Rpb24gIHwgIHBlZXJfZGV2aWNlICB8ICAgICB8ICBwZWVyX2RldmljZSAgfAorICBcLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy4uLi4uKy0tLS0tLS0tLS0tLS0tLS8KKworSW4gdGhpcyB0YWJsZSwgaG9yaXpvbnRhbGx5LCBkZXZpY2VzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHJlc291cmNlcyBieSB0aGVpcgordm9sdW1lIG51bWJlci4gIExpa2V3aXNlLCBwZWVyX2RldmljZXMgY2FuIGJlIGFjY2Vzc2VkIGZyb20gY29ubmVjdGlvbnMgYnkKK3RoZWlyIHZvbHVtZSBudW1iZXIuICBPYmplY3RzIGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24gYXJlIGNvbm5lY3RlZCBieSBkb3VibGUKK2xpbmtlZCBsaXN0cy4gIFRoZXJlIGFyZSBiYWNrIHBvaW50ZXJzIGZyb20gcGVlcl9kZXZpY2VzIHRvIHRoZWlyIGNvbm5lY3Rpb25zIGEKK2RldmljZXMsIGFuZCBmcm9tIGNvbm5lY3Rpb25zIGFuZCBkZXZpY2VzIHRvIHRoZWlyIHJlc291cmNlLgorCitBbGwgcmVzb3VyY2VzIGFyZSBpbiB0aGUgZHJiZF9yZXNvdXJjZXMgZG91YmxlLWxpbmtlZCBsaXN0LiAgSW4gYWRkaXRpb24sIGFsbAorZGV2aWNlcyBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlaXIgbWlub3IgZGV2aWNlIG51bWJlciB2aWEgdGhlIGRyYmRfZGV2aWNlcyBpZHIuCisKK1RoZSBkcmJkX3Jlc291cmNlLCBkcmJkX2Nvbm5lY3Rpb24sIGFuZCBkcmJkX2RldmljZSBvYmplY3RzIGFyZSByZWZlcmVuY2UKK2NvdW50ZWQuICBUaGUgcGVlcl9kZXZpY2Ugb2JqZWN0cyBvbmx5IHNlcnZlIHRvIGVzdGFibGlzaCB0aGUgbGlua3MgYmV0d2VlbgorZGV2aWNlcyBhbmQgY29ubmVjdGlvbnM7IHRoZWlyIGxpZmV0aW1lIGlzIGRldGVybWluZWQgYnkgdGhlIGxpZmV0aW1lIG9mIHRoZQorZGV2aWNlIGFuZCBjb25uZWN0aW9uIHdoaWNoIHRoZXkgcmVmZXJlbmNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY25fdGVzdC5jIGIvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY25fdGVzdC5jCmluZGV4IGFkY2NhMDMuLmQxMmNjOTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29ubmVjdG9yL2NuX3Rlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL2Nvbm5lY3Rvci9jbl90ZXN0LmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAJCW1lbWNweShtICsgMSwgZGF0YSwgbS0+bGVuKTsKIAotCQljbl9uZXRsaW5rX3NlbmQobSwgMCwgR0ZQX0FUT01JQyk7CisJCWNuX25ldGxpbmtfc2VuZChtLCAwLCAwLCBHRlBfQVRPTUlDKTsKIAkJa2ZyZWUobSk7CiAJfQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dAppbmRleCAxMDM3OGNjLi4wODdkMjEyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKQEAgLTQxMCw2ICs0MTAsNyBAQAogCQkxOTQgPSAvZGV2L3prc2hpbQlaZXJvLUtub3dsZWRnZSBuZXR3b3JrIHNoaW0gY29udHJvbAogCQkxOTUgPSAvZGV2L2Vsb2dyYXBoaWNzL2UyMjAxCUVsb2dyYXBoaWNzIHRvdWNoc2NyZWVuIEUyNzEtMjIwMQogCQkxOTYgPSAvZGV2L3ZmaW8vdmZpbwlWRklPIHVzZXJzcGFjZSBkcml2ZXIgaW50ZXJmYWNlCisJCTE5NyA9IC9kZXYvcHhhM3h4LWdjdQlQWEEzeHggZ3JhcGhpY3MgY29udHJvbGxlciB1bml0IGRyaXZlcgogCQkxOTggPSAvZGV2L3NleGVjCVNpZ25lZCBleGVjdXRhYmxlIGludGVyZmFjZQogCQkxOTkgPSAvZGV2L3NjYW5uZXJzL2N1ZWNhdCA6Q3VlQ2F0IGJhcmNvZGUgc2Nhbm5lcgogCQkyMDAgPSAvZGV2L25ldC90dW4JVEFQL1RVTiBuZXR3b3JrIGRldmljZQpAQCAtNDUxLDYgKzQ1Miw3IEBACiAJCTIzNiA9IC9kZXYvbWFwcGVyL2NvbnRyb2wJRGV2aWNlLU1hcHBlciBjb250cm9sIGRldmljZQogCQkyMzcgPSAvZGV2L2xvb3AtY29udHJvbCBMb29wYmFjayBjb250cm9sIGRldmljZQogCQkyMzggPSAvZGV2L3Zob3N0LW5ldAlIb3N0IGtlcm5lbCBhY2NlbGVyYXRvciBmb3IgdmlydGlvIG5ldAorCQkyMzkgPSAvZGV2L3VoaWQJCVVzZXItc3BhY2UgSS9PIGRyaXZlciBzdXBwb3J0IGZvciBISUQgc3Vic3lzdGVtCiAKIAkJMjQwLTI1NAkJCVJlc2VydmVkIGZvciBsb2NhbCB1c2UKIAkJMjU1CQkJUmVzZXJ2ZWQgZm9yIE1JU0NfRFlOQU1JQ19NSU5PUgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcm1hZGEtMzcwLXhwLW1waWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcm1hZGEtMzcwLXhwLW1waWMudHh0CmluZGV4IGQ3NDA5MWEuLjVmYzAzMTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJtYWRhLTM3MC14cC1tcGljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FybWFkYS0zNzAteHAtbXBpYy50eHQKQEAgLTEsNCArMSw0IEBACi1NYXJ2ZWxsIEFybWFkYSAzNzAgYW5kIEFybWFkYSBYUCBJbnRlcnJ1cHQgQ29udHJvbGxlcgorTWFydmVsbCBBcm1hZGEgMzcwLCAzNzUsIDM4eCwgWFAgSW50ZXJydXB0IENvbnRyb2xsZXIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CkBAIC0xNiw3ICsxNiwxMyBAQAogICBhdXRvbWF0aWNhbGx5IG1hcCB0byB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXJzIG9mIHRoZQogICBjdXJyZW50IENQVSkKIAorT3B0aW9uYWwgcHJvcGVydGllczoKIAorLSBpbnRlcnJ1cHRzOiBJZiBkZWZpbmVkLCB0aGVuIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgTVBJQyBpcworICBjb25uZWN0ZWQgYXMgYSBzbGF2ZSB0byBhbm90aGVyIGludGVycnVwdCBjb250cm9sbGVyLiBUaGlzIGlzCisgIHR5cGljYWxseSB0aGUgY2FzZSBvbiBBcm1hZGEgMzc1IGFuZCBBcm1hZGEgMzh4LCB3aGVyZSB0aGUgTVBJQyBpcworICBjb25uZWN0ZWQgYXMgYSBzbGF2ZSB0byB0aGUgQ29ydGV4LUE5IEdJQy4gVGhlIHByb3ZpZGVkIGludGVycnVwdAorICBpbmRpY2F0ZSB0byB3aGljaCBHSUMgaW50ZXJydXB0IHRoZSBNUElDIG91dHB1dCBpcyBjb25uZWN0ZWQuCiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXRtZWwtYWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXRtZWwtYWRjLnR4dAppbmRleCBkMTA2MTQ2Li45YTExNzViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2F0bWVsLWFkYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hdG1lbC1hZGMudHh0CkBAIC01LDYgKzUsOSBAQAogICAgIDxjaGlwPiBjYW4gYmUgImF0OTFzYW05MjYwIiwgImF0OTFzYW05ZzQ1IiBvciAiYXQ5MXNhbTl4NSIKICAgLSByZWc6IFNob3VsZCBjb250YWluIEFEQyByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAogICAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBJUlEgbGluZSBmb3IgdGhlIEFEQworICAtIGNsb2NrLW5hbWVzOiB0dXBsZSBsaXN0aW5nIGlucHV0IGNsb2NrIG5hbWVzLgorCVJlcXVpcmVkIGVsZW1lbnRzOiAiYWRjX2NsayIsICJhZGNfb3BfY2xrIi4KKyAgLSBjbG9ja3M6IHBoYW5kbGVzIHRvIGlucHV0IGNsb2Nrcy4KICAgLSBhdG1lbCxhZGMtY2hhbm5lbHMtdXNlZDogQml0bWFzayBvZiB0aGUgY2hhbm5lbHMgbXV4ZWQgYW5kIGVuYWJsZSBmb3IgdGhpcwogICAgIGRldmljZQogICAtIGF0bWVsLGFkYy1zdGFydHVwLXRpbWU6IFN0YXJ0dXAgVGltZSBvZiB0aGUgQURDIGluIG1pY3Jvc2Vjb25kcyBhcwpAQCAtNDQsNiArNDcsOCBAQAogCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtYWRjIjsKIAlyZWcgPSA8MHhmZmZiMDAwMCAweDEwMD47CiAJaW50ZXJydXB0cyA9IDwyMCA0PjsKKwljbG9ja3MgPSA8JmFkY19jbGs+LCA8JmFkY19vcF9jbGs+OworCWNsb2NrLW5hbWVzID0gImFkY19jbGsiLCAiYWRjX29wX2NsayI7CiAJYXRtZWwsYWRjLWNoYW5uZWwtYmFzZSA9IDwweDMwPjsKIAlhdG1lbCxhZGMtY2hhbm5lbHMtdXNlZCA9IDwweGZmPjsKIAlhdG1lbCxhZGMtZHJkeS1tYXNrID0gPDB4MTAwMDA+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tYXJ2ZWxsLGRvdmUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tYXJ2ZWxsLGRvdmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYWY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21hcnZlbGwsZG92ZS50eHQKQEAgLTAsMCArMSwyMiBAQAorTWFydmVsbCBEb3ZlIFBsYXRmb3JtcyBEZXZpY2UgVHJlZSBCaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQm9hcmRzIHdpdGggYSBNYXJ2ZWxsIERvdmUgU29DIHNoYWxsIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydHk6CistIGNvbXBhdGlibGU6IG11c3QgY29udGFpbiAibWFydmVsbCxkb3ZlIjsKKworKiBHbG9iYWwgQ29uZmlndXJhdGlvbiByZWdpc3RlcnMKKworR2xvYmFsIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIG9mIERvdmUgU29DIGFyZSBzaGFyZWQgYnkgYSBzeXNjb24gbm9kZS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogbXVzdCBjb250YWluICJtYXJ2ZWxsLGRvdmUtZ2xvYmFsLWNvbmZpZyIgYW5kICJzeXNjb24iLgorLSByZWc6IGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgR2xvYmFsIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorCitFeGFtcGxlOgorCitnY29uZjogZ2xvYmFsLWNvbmZpZ0BlODAyYyB7CisJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGRvdmUtZ2xvYmFsLWNvbmZpZyIsICJzeXNjb24iOworCXJlZyA9IDwweGU4MDJjIDB4MTQ+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvYWhjaS1wbGF0Zm9ybS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXRhL2FoY2ktcGxhdGZvcm0udHh0CmluZGV4IDg5ZGUxNTYuLjQ4YjI4NWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvYWhjaS1wbGF0Zm9ybS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2F0YS9haGNpLXBsYXRmb3JtLnR4dApAQCAtNCwxNyArNCwzMyBAQAogRWFjaCBTQVRBIGNvbnRyb2xsZXIgc2hvdWxkIGhhdmUgaXRzIG93biBub2RlLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlICAgICAgICA6IGNvbXBhdGlibGUgbGlzdCwgY29udGFpbnMgInNucHMsc3BlYXItYWhjaSIKKy0gY29tcGF0aWJsZSAgICAgICAgOiBjb21wYXRpYmxlIGxpc3QsIG9uZSBvZiAic25wcyxzcGVhci1haGNpIiwKKyAgICAgICAgICAgICAgICAgICAgICAic25wcyxleHlub3M1NDQwLWFoY2kiLCAiaWJtLDQ3Nmd0ci1haGNpIiwKKyAgICAgICAgICAgICAgICAgICAgICAiYWxsd2lubmVyLHN1bjRpLWExMC1haGNpIiwgImZzbCxpbXg1My1haGNpIgorICAgICAgICAgICAgICAgICAgICAgICJmc2wsaW14NnEtYWhjaSIgb3IgInNucHMsZHdjLWFoY2kiCiAtIGludGVycnVwdHMgICAgICAgIDogPGludGVycnVwdCBtYXBwaW5nIGZvciBTQVRBIElSUT4KIC0gcmVnICAgICAgICAgICAgICAgOiA8cmVnaXN0ZXJzIG1hcHBpbmc+CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGRtYS1jb2hlcmVudCAgICAgIDogUHJlc2VudCBpZiBkbWEgb3BlcmF0aW9ucyBhcmUgY29oZXJlbnQKKy0gY2xvY2tzICAgICAgICAgICAgOiBhIGxpc3Qgb2YgcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBwYWlycworLSB0YXJnZXQtc3VwcGx5ICAgICA6IHJlZ3VsYXRvciBmb3IgU0FUQSB0YXJnZXQgcG93ZXIKIAotRXhhbXBsZToKKyJmc2wsaW14NTMtYWhjaSIsICJmc2wsaW14NnEtYWhjaSIgcmVxdWlyZWQgcHJvcGVydGllczoKKy0gY2xvY2tzICAgICAgICAgICAgOiBtdXN0IGNvbnRhaW4gdGhlIHNhdGEsIHNhdGFfcmVmIGFuZCBhaGIgY2xvY2tzCistIGNsb2NrLW5hbWVzICAgICAgIDogbXVzdCBjb250YWluICJhaGIiIGZvciB0aGUgYWhiIGNsb2NrCisKK0V4YW1wbGVzOgogICAgICAgICBzYXRhQGZmZTA4MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJzbnBzLHNwZWFyLWFoY2kiOwogCQlyZWcgPSA8MHhmZmUwODAwMCAweDEwMDA+OwogCQlpbnRlcnJ1cHRzID0gPDExNT47Ci0KICAgICAgICAgfTsKKworCWFoY2k6IHNhdGFAMDFjMTgwMDAgeworCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtYWhjaSI7CisJCXJlZyA9IDwweDAxYzE4MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8NTY+OworCQljbG9ja3MgPSA8JnBsbDYgMD4sIDwmYWhiX2dhdGVzIDI1PjsKKwkJdGFyZ2V0LXN1cHBseSA9IDwmcmVnX2FoY2lfNXY+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXRhL2FwbS14Z2VuZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXRhL2FwbS14Z2VuZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjZmJmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvYXBtLXhnZW5lLnR4dApAQCAtMCwwICsxLDc2IEBACisqIEFQTSBYLUdlbmUgNi4wIEdiL3MgU0FUQSBob3N0IGNvbnRyb2xsZXIgbm9kZXMKKworU0FUQSBob3N0IGNvbnRyb2xsZXIgbm9kZXMgYXJlIGRlZmluZWQgdG8gZGVzY3JpYmUgb24tY2hpcCBTZXJpYWwgQVRBCitjb250cm9sbGVycy4gRWFjaCBTQVRBIGNvbnRyb2xsZXIgKHBhaXIgb2YgcG9ydHMpIGhhdmUgaXRzIG93biBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IFNoYWxsIGNvbnRhaW46CisgICogImFwbSx4Z2VuZS1haGNpIgorLSByZWcJCQk6IEZpcnN0IG1lbW9yeSByZXNvdXJjZSBzaGFsbCBiZSB0aGUgQUhDSSBtZW1vcnkKKwkJCSAgcmVzb3VyY2UuCisJCQkgIFNlY29uZCBtZW1vcnkgcmVzb3VyY2Ugc2hhbGwgYmUgdGhlIGhvc3QgY29udHJvbGxlcgorCQkJICBjb3JlIG1lbW9yeSByZXNvdXJjZS4KKwkJCSAgVGhpcmQgbWVtb3J5IHJlc291cmNlIHNoYWxsIGJlIHRoZSBob3N0IGNvbnRyb2xsZXIKKwkJCSAgZGlhZ25vc3RpYyBtZW1vcnkgcmVzb3VyY2UuCisJCQkgIDR0aCBtZW1vcnkgcmVzb3VyY2Ugc2hhbGwgYmUgdGhlIGhvc3QgY29udHJvbGxlcgorCQkJICBBWEkgbWVtb3J5IHJlc291cmNlLgorCQkJICA1dGggb3B0aW9uYWwgbWVtb3J5IHJlc291cmNlIHNoYWxsIGJlIHRoZSBob3N0CisJCQkgIGNvbnRyb2xsZXIgTVVYIG1lbW9yeSByZXNvdXJjZSBpZiByZXF1aXJlZC4KKy0gaW50ZXJydXB0cwkJOiBJbnRlcnJ1cHQtc3BlY2lmaWVyIGZvciBTQVRBIGhvc3QgY29udHJvbGxlciBJUlEuCistIGNsb2NrcwkJOiBSZWZlcmVuY2UgdG8gdGhlIGNsb2NrIGVudHJ5LgorLSBwaHlzCQkJOiBBIGxpc3Qgb2YgcGhhbmRsZXMgKyBwaHktc3BlY2lmaWVycywgb25lIGZvciBlYWNoCisJCQkgIGVudHJ5IGluIHBoeS1uYW1lcy4KKy0gcGh5LW5hbWVzCQk6IFNob3VsZCBjb250YWluOgorICAqICJzYXRhLXBoeSIgZm9yIHRoZSBTQVRBIDYuMEdicHMgUEhZCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHN0YXR1cwkJOiBTaGFsbCBiZSAib2siIGlmIGVuYWJsZWQgb3IgImRpc2FibGVkIiBpZiBkaXNhYmxlZC4KKwkJCSAgRGVmYXVsdCBpcyAib2siLgorCitFeGFtcGxlOgorCQlzYXRhY2xrOiBzYXRhY2xrIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEwMDAwMDAwMD47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2F0YWNsayI7CisJCX07CisKKwkJcGh5MjogcGh5QDFmMjJhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyMmEwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCX07CisKKwkJcGh5MzogcGh5QDFmMjNhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyM2EwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCX07CisKKwkJc2F0YTI6IHNhdGFAMWE0MDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtYWhjaSI7CisJCQlyZWcgPSA8MHgwIDB4MWE0MDAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMjAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMmQwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMmUwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMjcwMDAgMHgwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDg3IDB4ND47CisJCQlzdGF0dXMgPSAib2siOworCQkJY2xvY2tzID0gPCZzYXRhY2xrIDA+OworCQkJcGh5cyA9IDwmcGh5MiAwPjsKKwkJCXBoeS1uYW1lcyA9ICJzYXRhLXBoeSI7CisJCX07CisKKwkJc2F0YTM6IHNhdGFAMWE4MDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtYWhjaS1wY2llIjsKKwkJCXJlZyA9IDwweDAgMHgxYTgwMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzZDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzZTAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIzNzAwMCAweDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgwIDB4ODggMHg0PjsKKwkJCXN0YXR1cyA9ICJvayI7CisJCQljbG9ja3MgPSA8JnNhdGFjbGsgMD47CisJCQlwaHlzID0gPCZwaHkzIDA+OworCQkJcGh5LW5hbWVzID0gInNhdGEtcGh5IjsKKwkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncmFwaC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3JhcGgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3JhcGgudHh0CkBAIC0wLDAgKzEsMTI5IEBACitDb21tb24gYmluZGluZ3MgZm9yIGRldmljZSBncmFwaHMKKworR2VuZXJhbCBjb25jZXB0CistLS0tLS0tLS0tLS0tLS0KKworVGhlIGhpZXJhcmNoaWNhbCBvcmdhbmlzYXRpb24gb2YgdGhlIGRldmljZSB0cmVlIGlzIHdlbGwgc3VpdGVkIHRvIGRlc2NyaWJlCitjb250cm9sIGZsb3cgdG8gZGV2aWNlcywgYnV0IHRoZXJlIGNhbiBiZSBtb3JlIGNvbXBsZXggY29ubmVjdGlvbnMgYmV0d2VlbgorZGV2aWNlcyB0aGF0IHdvcmsgdG9nZXRoZXIgdG8gZm9ybSBhIGxvZ2ljYWwgY29tcG91bmQgZGV2aWNlLCBmb2xsb3dpbmcgYW4KK2FyYml0cmFyaWx5IGNvbXBsZXggZ3JhcGguCitUaGVyZSBhbHJlYWR5IGlzIGEgc2ltcGxlIGRpcmVjdGVkIGdyYXBoIGJldHdlZW4gZGV2aWNlcyB0cmVlIG5vZGVzIHVzaW5nCitwaGFuZGxlIHByb3BlcnRpZXMgcG9pbnRpbmcgdG8gb3RoZXIgbm9kZXMgdG8gZGVzY3JpYmUgY29ubmVjdGlvbnMgdGhhdAorY2FuIG5vdCBiZSBpbmZlcnJlZCBmcm9tIGRldmljZSB0cmVlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLiBUaGUgZGV2aWNlCit0cmVlIGdyYXBoIGJpbmRpbmdzIGRlc2NyaWJlZCBoZXJlaW4gYWJzdHJhY3QgbW9yZSBjb21wbGV4IGRldmljZXMgdGhhdCBjYW4KK2hhdmUgbXVsdGlwbGUgc3BlY2lmaWFibGUgcG9ydHMsIGVhY2ggb2Ygd2hpY2ggY2FuIGJlIGxpbmtlZCB0byBvbmUgb3IgbW9yZQorcG9ydHMgb2Ygb3RoZXIgZGV2aWNlcy4KKworVGhlc2UgY29tbW9uIGJpbmRpbmdzIGRvIG5vdCBjb250YWluIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlyZWN0aW9uIG9yCit0eXBlIG9mIHRoZSBjb25uZWN0aW9ucywgdGhleSBqdXN0IG1hcCB0aGVpciBleGlzdGVuY2UuIFNwZWNpZmljIHByb3BlcnRpZXMKK21heSBiZSBkZXNjcmliZWQgYnkgc3BlY2lhbGl6ZWQgYmluZGluZ3MgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGNvbm5lY3Rpb24uCisKK1RvIHNlZSBob3cgdGhpcyBiaW5kaW5nIGFwcGxpZXMgdG8gdmlkZW8gcGlwZWxpbmVzLCBmb3IgZXhhbXBsZSwgc2VlCitEb2N1bWVudGF0aW9uL2RldmljZS10cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvLWludGVyZmFjZXMudHh0LgorSGVyZSB0aGUgcG9ydHMgZGVzY3JpYmUgZGF0YSBpbnRlcmZhY2VzLCBhbmQgdGhlIGxpbmtzIGJldHdlZW4gdGhlbSBhcmUKK3RoZSBjb25uZWN0aW5nIGRhdGEgYnVzZXMuIEEgc2luZ2xlIHBvcnQgd2l0aCBtdWx0aXBsZSBjb25uZWN0aW9ucyBjYW4KK2NvcnJlc3BvbmQgdG8gbXVsdGlwbGUgZGV2aWNlcyBiZWluZyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGh5c2ljYWwgYnVzLgorCitPcmdhbmlzYXRpb24gb2YgcG9ydHMgYW5kIGVuZHBvaW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUG9ydHMgYXJlIGRlc2NyaWJlZCBieSBjaGlsZCAncG9ydCcgbm9kZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Ugbm9kZS4KK0VhY2ggcG9ydCBub2RlIGNvbnRhaW5zIGFuICdlbmRwb2ludCcgc3Vibm9kZSBmb3IgZWFjaCByZW1vdGUgZGV2aWNlIHBvcnQKK2Nvbm5lY3RlZCB0byB0aGlzIHBvcnQuIElmIGEgc2luZ2xlIHBvcnQgaXMgY29ubmVjdGVkIHRvIG1vcmUgdGhhbiBvbmUKK3JlbW90ZSBkZXZpY2UsIGFuICdlbmRwb2ludCcgY2hpbGQgbm9kZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBlYWNoIGxpbmsuCitJZiBtb3JlIHRoYW4gb25lIHBvcnQgaXMgcHJlc2VudCBpbiBhIGRldmljZSBub2RlIG9yIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKK2VuZHBvaW50IGF0IGEgcG9ydCwgb3IgYSBwb3J0IG5vZGUgbmVlZHMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2VsZWN0ZWQKK2hhcmR3YXJlIGludGVyZmFjZSwgYSBjb21tb24gc2NoZW1lIHVzaW5nICcjYWRkcmVzcy1jZWxscycsICcjc2l6ZS1jZWxscycKK2FuZCAncmVnJyBwcm9wZXJ0aWVzIGlzIHVzZWQgbnVtYmVyIHRoZSBub2Rlcy4KKworZGV2aWNlIHsKKyAgICAgICAgLi4uCisgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OworICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKworICAgICAgICBwb3J0QDAgeworCSAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcmVnID0gPDA+OworCisgICAgICAgICAgICAgICAgZW5kcG9pbnRAMCB7CisJCQlyZWcgPSA8MD47CisJCQkuLi4KKwkJfTsKKyAgICAgICAgICAgICAgICBlbmRwb2ludEAxIHsKKwkJCXJlZyA9IDwxPjsKKwkJCS4uLgorCQl9OworICAgICAgICB9OworCisgICAgICAgIHBvcnRAMSB7CisJCXJlZyA9IDwxPjsKKworCQllbmRwb2ludCB7IC4uLiB9OworCX07Cit9OworCitBbGwgJ3BvcnQnIG5vZGVzIGNhbiBiZSBncm91cGVkIHVuZGVyIGFuIG9wdGlvbmFsICdwb3J0cycgbm9kZSwgd2hpY2gKK2FsbG93cyB0byBzcGVjaWZ5ICNhZGRyZXNzLWNlbGxzLCAjc2l6ZS1jZWxscyBwcm9wZXJ0aWVzIGZvciB0aGUgJ3BvcnQnCitub2RlcyBpbmRlcGVuZGVudGx5IGZyb20gYW55IG90aGVyIGNoaWxkIGRldmljZSBub2RlcyBhIGRldmljZSBtaWdodAoraGF2ZS4KKworZGV2aWNlIHsKKyAgICAgICAgLi4uCisgICAgICAgIHBvcnRzIHsKKyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKyAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKworICAgICAgICAgICAgICAgIHBvcnRAMCB7CisgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50QDAgeyAuLi4gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50QDEgeyAuLi4gfTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgcG9ydEAxIHsgLi4uIH07CisgICAgICAgIH07Cit9OworCitMaW5rcyBiZXR3ZWVuIGVuZHBvaW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRWFjaCBlbmRwb2ludCBzaG91bGQgY29udGFpbiBhICdyZW1vdGUtZW5kcG9pbnQnIHBoYW5kbGUgcHJvcGVydHkgdGhhdCBwb2ludHMKK3RvIHRoZSBjb3JyZXNwb25kaW5nIGVuZHBvaW50IGluIHRoZSBwb3J0IG9mIHRoZSByZW1vdGUgZGV2aWNlLiBJbiB0dXJuLCB0aGUKK3JlbW90ZSBlbmRwb2ludCBzaG91bGQgY29udGFpbiBhICdyZW1vdGUtZW5kcG9pbnQnIHByb3BlcnR5LiBJZiBpdCBoYXMgb25lLAoraXQgbXVzdCBub3QgcG9pbnQgdG8gYW5vdGhlciB0aGFuIHRoZSBsb2NhbCBlbmRwb2ludC4gVHdvIGVuZHBvaW50cyB3aXRoIHRoZWlyCisncmVtb3RlLWVuZHBvaW50JyBwaGFuZGxlcyBwb2ludGluZyBhdCBlYWNoIG90aGVyIGZvcm0gYSBsaW5rIGJldHdlZW4gdGhlCitjb250YWluaW5nIHBvcnRzLgorCitkZXZpY2UtMSB7CisgICAgICAgIHBvcnQgeworICAgICAgICAgICAgICAgIGRldmljZV8xX291dHB1dDogZW5kcG9pbnQgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWVuZHBvaW50ID0gPCZkZXZpY2VfMl9pbnB1dD47CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKK307CisKK2RldmljZS0yIHsKKyAgICAgICAgcG9ydCB7CisgICAgICAgICAgICAgICAgZGV2aWNlXzJfaW5wdXQ6IGVuZHBvaW50IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS1lbmRwb2ludCA9IDwmZGV2aWNlXzFfb3V0cHV0PjsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9OworfTsKKworCitSZXF1aXJlZCBwcm9wZXJ0aWVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgJ3BvcnQnIG9yIG1vcmUgdGhhbiBvbmUgJ2VuZHBvaW50JyBub2RlIG9yICdyZWcnCitwcm9wZXJ0eSBpcyBwcmVzZW50IGluIHBvcnQgYW5kL29yIGVuZHBvaW50IG5vZGVzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcworYXJlIHJlcXVpcmVkIGluIGEgcmVsZXZhbnQgcGFyZW50IG5vZGU6CisKKyAtICNhZGRyZXNzLWNlbGxzIDogbnVtYmVyIG9mIGNlbGxzIHJlcXVpcmVkIHRvIGRlZmluZSBwb3J0L2VuZHBvaW50CisgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIsIHNob3VsZCBiZSAxLgorIC0gI3NpemUtY2VsbHMgICAgOiBzaG91bGQgYmUgemVyby4KKworT3B0aW9uYWwgZW5kcG9pbnQgcHJvcGVydGllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIHJlbW90ZS1lbmRwb2ludDogcGhhbmRsZSB0byBhbiAnZW5kcG9pbnQnIHN1Ym5vZGUgb2YgYSByZW1vdGUgZGV2aWNlIG5vZGUuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dAppbmRleCAxYTFhYzJlLi5mNDdlNTZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0CkBAIC0xOCw2ICsxOCw3IEBACiBhdG1lbCxhdDk3c2MzMjA0dAlpMmMgdHJ1c3RlZCBwbGF0Zm9ybSBtb2R1bGUgKFRQTSkKIGNhcGVsbGEsY20zMjE4MQkJQ00zMjE4MTogQW1iaWVudCBMaWdodCBTZW5zb3IKIGNhdGFseXN0LDI0YzMyCQlpMmMgc2VyaWFsIGVlcHJvbQorY2lycnVzLGNzNDJsNTEJCUNpcnJ1cyBMb2dpYyBDUzQyTDUxIGF1ZGlvIGNvZGVjCiBkYWxsYXMsZHMxMzA3CQk2NCB4IDgsIFNlcmlhbCwgSTJDIFJlYWwtVGltZSBDbG9jawogZGFsbGFzLGRzMTMzOAkJSTJDIFJUQyB3aXRoIDU2LUJ5dGUgTlYgUkFNCiBkYWxsYXMsZHMxMzM5CQlJMkMgU2VyaWFsIFJlYWwtVGltZSBDbG9jawpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdmY2MTAtYWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3ZmNjEwLWFkYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlYmZmMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3ZmNjEwLWFkYy50eHQKQEAgLTAsMCArMSwyMiBAQAorRnJlZXNjYWxlIHZmNjEwIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlciBiaW5kaW5ncworCitUaGUgZGV2aWNldHJlZSBiaW5kaW5ncyBhcmUgZm9yIHRoZSBuZXcgQURDIGRyaXZlciB3cml0dGVuIGZvcgordmY2MTAvaS5NWDZzbHggYW5kIHVwd2FyZCBTb0NzIGZyb20gRnJlZXNjYWxlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgY29udGFpbiAiZnNsLHZmNjEwLWFkYyIKKy0gcmVnOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBkZXZpY2UKKy0gY2xvY2tzOiBUaGUgY2xvY2sgaXMgbmVlZGVkIGJ5IHRoZSBBREMgY29udHJvbGxlciwgQURDIGNsb2NrIHNvdXJjZSBpcyBpcGcgY2xvY2suCistIGNsb2NrLW5hbWVzOiBNdXN0IGNvbnRhaW4gImFkYyIsIG1hdGNoaW5nIGVudHJ5IGluIHRoZSBjbG9ja3MgcHJvcGVydHkuCistIHZyZWYtc3VwcGx5OiBUaGUgcmVndWxhdG9yIHN1cHBseSBBREMgcmVmcmVuY2Ugdm9sdGFnZS4KKworRXhhbXBsZToKK2FkYzA6IGFkY0A0MDAzYjAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsdmY2MTAtYWRjIjsKKwlyZWcgPSA8MHg0MDAzYjAwMCAweDEwMDA+OworCWludGVycnVwdHMgPSA8MCA1MyAweDA0PjsKKwljbG9ja3MgPSA8JmNsa3MgVkY2MTBfQ0xLX0FEQzA+OworCWNsb2NrLW5hbWVzID0gImFkYyI7CisJdnJlZi1zdXBwbHkgPSA8JnJlZ192Y2NfM3YzX21jdT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMveGlsaW54LXhhZGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMveGlsaW54LXhhZGMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZWU5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy94aWxpbngteGFkYy50eHQKQEAgLTAsMCArMSwxMTMgQEAKK1hpbGlueCBYQURDIGRldmljZSBkcml2ZXIKKworVGhpcyBiaW5kaW5nIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgYmluZGluZ3MgZm9yIGJvdGggb2YgdGhlbSBzaW5jZSB0aGUKK2JpbmRpbmdzIGFyZSB2ZXJ5IHNpbWlsYXIuIFRoZSBYaWxpbnggWEFEQyBpcyBhIEFEQyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUKK3NlcmllcyA3IEZQR0FzIGZyb20gWGlsaW54LiBUaGUgWEFEQyBoYXMgYSBEUlAgaW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW9uLgorQ3VycmVudGx5IHR3byBkaWZmZXJlbnQgZnJvbnRlbmRzIGZvciB0aGUgRFJQIGludGVyZmFjZSBleGlzdC4gT25lIHRoYXQgaXMgb25seQorYXZhaWxhYmxlIG9uIHRoZSBaWU5RIGZhbWlseSBhcyBhIGhhcmRtYWNybyBpbiB0aGUgU29DIHBvcnRpb24gb2YgdGhlIFpZTlEuIFRoZQorb3RoZXIgb25lIGlzIGF2YWlsYWJsZSBvbiBhbGwgc2VyaWVzIDcgcGxhdGZvcm1zIGFuZCBpcyBhIHNvZnRtYWNybyB3aXRoIGEgQVhJCitpbnRlcmZhY2UuIFRoaXMgYmluZGluZyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGJpbmRpbmdzIGZvciBib3RoIG9mIHRoZW0gc2luY2UKK3RoZSBiaW5kaW5ncyBhcmUgdmVyeSBzaW1pbGFyLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCS0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZgorCQkqICJ4bG54LHp5bnEteGFkYy0xLjAwLmEiOiBXaGVuIHVzaW5nIHRoZSBaWU5RIGRldmljZQorCQkgIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIHRvIGludGVyZmFjZSB0byB0aGUgWEFEQyBoYXJkbWFjcm8uCisJCSogInhsbngsYXhpLXhhZGMtMS4wMC5hIjogV2hlbiB1c2luZyB0aGUgYXhpLXhhZGMgcGNvcmUgdG8KKwkJICBpbnRlcmZhY2UgdG8gdGhlIFhBREMgaGFyZG1hY3JvLgorCS0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorCS0gaW50ZXJydXB0czogSW50ZXJydXB0IGZvciB0aGUgWEFEQyBjb250cm9sIGludGVyZmFjZS4KKwktIGNsb2NrczogV2hlbiB1c2luZyB0aGUgWllOUSB0aGlzIG11c3QgYmUgdGhlIFpZTlEgUENBUCBjbG9jaywKKwkgIHdoZW4gdXNpbmcgdGhlIEFYSS1YQURDIHBjb3JlIHRoaXMgbXVzdCBiZSB0aGUgY2xvY2sgdGhhdCBwcm92aWRlcyB0aGUKKwkgIGNsb2NrIHRvIHRoZSBBWEkgYnVzIGludGVyZmFjZSBvZiB0aGUgY29yZS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKwktIGludGVycnVwdC1wYXJlbnQ6IHBoYW5kbGUgdG8gdGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlcgorCS0geGxueCxleHRlcm5hbC1tdXg6CisJCSogIm5vbmUiOiBObyBleHRlcm5hbCBtdWx0aXBsZXhlciBpcyB1c2VkLCB0aGlzIGlzIHRoZSBkZWZhdWx0CisJCSAgaWYgdGhlIHByb3BlcnR5IGlzIG9taXR0ZWQuCisJCSogInNpbmdsZSI6IEV4dGVybmFsIG11bHRpcGxleGVyIG1vZGUgaXMgdXNlZCB3aXRoIG9uZQorCQkgICBtdWx0aXBsZXhlci4KKwkJKiAiZHVhbCI6IEV4dGVybmFsIG11bHRpcGxleGVyIG1vZGUgaXMgdXNlZCB3aXRoIHR3bworCQkgIG11bHRpcGxleGVycyBmb3Igc2ltdWx0YW5lb3VzIHNhbXBsaW5nLgorCS0geGxueCxleHRlcm5hbC1tdXgtY2hhbm5lbDogQ29uZmlndXJlcyB3aGljaCBwYWlyIG9mIHBpbnMgaXMgdXNlZCB0bworCSAgc2FtcGxlIGRhdGEgaW4gZXh0ZXJuYWwgbXV4IG1vZGUuCisJICBWYWxpZCB2YWx1ZXMgZm9yIHNpbmdsZSBleHRlcm5hbCBtdWx0aXBsZXhlciBtb2RlIGFyZToKKwkJMDogVlAvVk4KKwkJMTogVkFVWFBbMF0vVkFVWE5bMF0KKwkJMjogVkFVWFBbMV0vVkFVWE5bMV0KKwkJLi4uCisJCTE2OiBWQVVYUFsxNV0vVkFVWE5bMTVdCisJICBWYWxpZCB2YWx1ZXMgZm9yIGR1YWwgZXh0ZXJuYWwgbXVsdGlwbGV4ZXIgbW9kZSBhcmU6CisJCTE6IFZBVVhQWzBdL1ZBVVhOWzBdIC0gVkFVWFBbOF0vVkFVWE5bOF0KKwkJMjogVkFVWFBbMV0vVkFVWE5bMV0gLSBWQVVYUFs5XS9WQVVYTls5XQorCQkuLi4KKwkJODogVkFVWFBbN10vVkFVWE5bN10gLSBWQVVYUFsxNV0vVkFVWE5bMTVdCisKKwkgIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgcHJlc2VudCBpZiB0aGUgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgZm9yCisJICBleHRlcm5hbCBtdWx0aXBsZXhlciBtb2RlIChlaXRoZXIgc2luZ2xlIG9yIGR1YWwpLiBJZiB0aGUgZGV2aWNlIGlzCisJICBub3QgdXNpbmcgZXh0ZXJuYWwgbXVsdGlwbGV4ZXIgbW9kZSB0aGUgcHJvcGVydHkgaXMgaWdub3JlZC4KKwktIHhubHgsY2hhbm5lbHM6IExpc3Qgb2YgZXh0ZXJuYWwgY2hhbm5lbHMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSBBREMKKwkgIFJlcXVpcmVkIHByb3BlcnRpZXM6CisJCSogI2FkZHJlc3MtY2VsbHM6IFNob3VsZCBiZSAxLgorCQkqICNzaXplLWNlbGxzOiBTaG91bGQgYmUgMC4KKworCSAgVGhlIGNoaWxkIG5vZGVzIG9mIHRoaXMgbm9kZSByZXByZXNlbnQgdGhlIGV4dGVybmFsIGNoYW5uZWxzIHdoaWNoIGFyZQorCSAgY29ubmVjdGVkIHRvIHRoZSBBREMuIElmIHRoZSBwcm9wZXJ0eSBpcyBubyBwcmVzZW50IG5vIGV4dGVybmFsCisJICBjaGFubmVscyB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgY29ubmVjdGVkLgorCisJICBFYWNoIGNoaWxkIG5vZGUgcmVwcmVzZW50cyBvbmUgY2hhbm5lbCBhbmQgaGFzIHRoZSBmb2xsb3dpbmcKKwkgIHByb3BlcnRpZXM6CisJCVJlcXVpcmVkIHByb3BlcnRpZXM6CisJCQkqIHJlZzogUGFpciBvZiBwaW5zIHRoZSB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQgdG8uCisJCQkJMDogVlAvVk4KKwkJCQkxOiBWQVVYUFswXS9WQVVYTlswXQorCQkJCTI6IFZBVVhQWzFdL1ZBVVhOWzFdCisJCQkJLi4uCisJCQkJMTY6IFZBVVhQWzE1XS9WQVVYTlsxNV0KKwkJCSAgTm90ZSBlYWNoIGNoYW5uZWwgbnVtYmVyIHNob3VsZCBvbmx5IGJlIHVzZWQgYXQgbW9zdAorCQkJICBvbmNlLgorCQlPcHRpb25hbCBwcm9wZXJ0aWVzOgorCQkJKiB4bG54LGJpcG9sYXI6IElmIHNldCB0aGUgY2hhbm5lbCBpcyB1c2VkIGluIGJpcG9sYXIKKwkJCSAgbW9kZS4KKworCitFeGFtcGxlczoKKwl4YWRjQGY4MDA3MTAwIHsKKwkJY29tcGF0aWJsZSA9ICJ4bG54LHp5bnEteGFkYy0xLjAwLmEiOworCQlyZWcgPSA8MHhmODAwNzEwMCAweDIwPjsKKwkJaW50ZXJydXB0cyA9IDwwIDcgND47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJCWNsb2NrcyA9IDwmcGNhcF9jbGs+OworCisJCXhsbngsY2hhbm5lbHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNoYW5uZWxAMCB7CisJCQkJcmVnID0gPDA+OworCQkJfTsKKwkJCWNoYW5uZWxAMSB7CisJCQkJcmVnID0gPDE+OworCQkJfTsKKwkJCWNoYW5uZWxAOCB7CisJCQkJcmVnID0gPDg+OworCQkJfTsKKwkJfTsKKwl9OworCisJeGFkY0A0MzIwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAieGxueCxheGkteGFkYy0xLjAwLmEiOworCQlyZWcgPSA8MHg0MzIwMDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgNTMgND47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJCWNsb2NrcyA9IDwmZnBnYTFfY2xrPjsKKworCQl4bG54LGNoYW5uZWxzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljaGFubmVsQDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQl4bG54LGJpcG9sYXI7CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYWxsd2lubmVyLHN1bjRpLWljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNGktaWMudHh0CmluZGV4IDMyY2VjNGIuLmIyOTBjYTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNGktaWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNGktaWMudHh0CkBAIC0yLDcgKzIsNyBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImFsbHdpbm5lcixzdW40aS1pYyIKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjRpLWExMC1pYyIKIC0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgogLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6IElkZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKIC0gI2ludGVycnVwdC1jZWxscyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4KQEAgLTExLDcgKzExLDcgQEAKIEV4YW1wbGU6CiAKIGludGM6IGludGVycnVwdC1jb250cm9sbGVyIHsKLQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1pYyI7CisJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWljIjsKIAlyZWcgPSA8MHgwMWMyMDQwMCAweDQwMD47CiAJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hbGx3aW5uZXIsc3VuNjdpLXNjLW5taS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYWxsd2lubmVyLHN1bjY3aS1zYy1ubWkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzVjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYWxsd2lubmVyLHN1bjY3aS1zYy1ubWkudHh0CkBAIC0wLDAgKzEsMjcgQEAKK0FsbHdpbm5lciBTdW54aSBOTUkgQ29udHJvbGxlcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjdpLWEyMC1zYy1ubWkiIG9yCisgICJhbGx3aW5uZXIsc3VuNmktYTMxLXNjLW5taSIKKy0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgorLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6IElkZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gI2ludGVycnVwdC1jZWxscyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgaW50ZXJydXB0IHNvdXJjZS4gVGhlIHZhbHVlIHNoYWxsIGJlIDIuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBJUlEgbnVtYmVyLCB0aGUKKyAgc2Vjb25kIGNlbGwgdGhlIHRyaWdnZXIgdHlwZSBhcyBkZWZpbmVkIGluIGludGVycnVwdC50eHQgaW4gdGhpcyBkaXJlY3RvcnkuCistIGludGVycnVwdC1wYXJlbnQ6IFNwZWNpZmllcyB0aGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHRzOiBTcGVjaWZpZXMgdGhlIGludGVycnVwdCBsaW5lIChOTUkpIHdoaWNoIGlzIGhhbmRsZWQgYnkKKyAgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGluIHRoZSBwYXJlbnQgY29udHJvbGxlcidzIG5vdGF0aW9uLiBUaGlzIHZhbHVlCisgIHNoYWxsIGJlIHRoZSBOTUkuCisKK0V4YW1wbGU6CisKK3NjLW5taS1pbnRjQDAxYzAwMDMwIHsKKwljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtc2Mtbm1pIjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCXJlZyA9IDwweDAxYzAwMDMwIDB4MGM+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJaW50ZXJydXB0cyA9IDwwIDAgND47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL2lmYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL2ZzbC9pZmMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvaWZjLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy9mc2wvaWZjLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy90aS1hZW1pZi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL3RpLWFlbWlmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkyNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy90aS1hZW1pZi50eHQKQEAgLTAsMCArMSwyMTAgQEAKKyogRGV2aWNlIHRyZWUgYmluZGluZ3MgZm9yIFRleGFzIGluc3RydW1lbnRzIEFFTUlGIGNvbnRyb2xsZXIKKworVGhlIEFzeW5jIEV4dGVybmFsIE1lbW9yeSBJbnRlcmZhY2UgKEVNSUYxNi9BRU1JRikgY29udHJvbGxlciBpcyBpbnRlbmRlZCB0bworcHJvdmlkZSBhIGdsdWUtbGVzcyBpbnRlcmZhY2UgdG8gYSB2YXJpZXR5IG9mIGFzeW5jaHJvbm91cyBtZW1vcnkgZGV2aWNlcyBsaWtlCitBU1JBIE0sIE5PUiBhbmQgTkFORCBtZW1vcnkuIEEgdG90YWwgb2YgMjU2TSBieXRlcyBvZiBhbnkgb2YgdGhlc2UgbWVtb3JpZXMKK2NhbiBiZSBhY2Nlc3NlZCBhdCBhbnkgZ2l2ZW4gdGltZSB2aWEgZm91ciBjaGlwIHNlbGVjdHMgd2l0aCA2NE0gYnl0ZSBhY2Nlc3MKK3BlciBjaGlwIHNlbGVjdC4gU3luY2hyb25vdXMgbWVtb3JpZXMgc3VjaCBhcyBERFIxIFNEIFJBTSwgU0RSIFNEUkFNCithbmQgTW9iaWxlIFNEUiBhcmUgbm90IHN1cHBvcnRlZC4KKworRG9jdW1lbnRhdGlvbjoKK0RhdmluY2kgRE02NDZ4IC0gaHR0cDovL3d3dy50aS5jb20vbGl0L3VnL3NwcnVlcTdjL3NwcnVlcTdjLnBkZgorT01BUC1MMTM4IChEQTg1MCkgLSBodHRwOi8vd3d3LnRpLmNvbS9saXQvdWcvc3BydWg3N2Evc3BydWg3N2EucGRmCitLZXN0b25lIC0gaHR0cDovL3d3dy50aS5jb20vbGl0L3VnL3NwcnVnejNhL3NwcnVnejNhLnBkZgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6CQkidGksZGF2aW5jaS1hZW1pZiIKKwkJCSJ0aSxrZXlzdG9uZS1hZW1pZiIKKwkJCSJ0aSxkYTg1MC1hZW1pZiIKKworLSByZWc6CQkJY29udGFpbnMgb2Zmc2V0L2xlbmd0aCB2YWx1ZSBmb3IgQUVNSUYgY29udHJvbCByZWdpc3RlcnMKKwkJCXNwYWNlLgorCistICNhZGRyZXNzLWNlbGxzOglNdXN0IGJlIDIuIFRoZSBwYXJ0aXRpb24gbnVtYmVyIGhhcyB0byBiZSBlbmNvZGVkIGluIHRoZQorCQkJZmlyc3QgYWRkcmVzcyBjZWxsIGFuZCBpdCBtYXkgYWNjZXB0IHZhbHVlcyAwLi5OLTEKKwkJCShOIC0gdG90YWwgbnVtYmVyIG9mIHBhcnRpdGlvbnMpLiBJdCdzIHJlY29tbWVuZGVkIHRvCisJCQlhc3NpZ24gTi0xIG51bWJlciBmb3IgdGhlIGNvbnRyb2wgcGFydGl0aW9uLiBUaGUgc2Vjb25kCisJCQljZWxsIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgcGFydGl0aW9uLgorCistICNzaXplLWNlbGxzOgkJTXVzdCBiZSBzZXQgdG8gMS4KKworLSByYW5nZXM6CQlDb250YWlucyBtZW1vcnkgcmVnaW9ucy4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZgorCQkJcmFuZ2VzL3BhcnRpdGlvbnM6CisJCQktIENTLXNwZWNpZmljIHBhcnRpdGlvbi9yYW5nZS4gSWYgY29udGludW91cywgbXVzdCBiZQorCQkJc2V0IHVwIHRvIHJlZmxlY3QgdGhlIG1lbW9yeSBsYXlvdXQgZm9yIDQgY2hpcHNlbGVjdHMsCisJCQlpZiBub3QgdGhlbiBhZGRpdGlvbmFsIHJhbmdlL3BhcnRpdGlvbiBjYW4gYmUgYWRkZWQgYW5kCisJCQljaGlsZCBkZXZpY2UgY2FuIHNlbGVjdCB0aGUgcHJvcGVyIG9uZS4KKwkJCS0gY29udHJvbCBwYXJ0aXRpb24gd2hpY2ggaXMgY29tbW9uIGZvciBhbGwgQ1MKKwkJCWludGVyZmFjZXMuCisKKy0gY2xvY2tzOgkJdGhlIGNsb2NrIGZlZWRpbmcgdGhlIGNvbnRyb2xsZXIgY2xvY2suIFJlcXVpcmVkIG9ubHkKKwkJCWlmIGNsb2NrIHRyZWUgZGF0YSBwcmVzZW50IGluIGRldmljZSB0cmVlLgorCQkJU2VlIGNsb2NrLWJpbmRpbmdzLnR4dAorCistIGNsb2NrLW5hbWVzOgkJY2xvY2sgbmFtZS4gSXQgaGFzIHRvIGJlICJhZW1pZiIuIFJlcXVpcmVkIG9ubHkgaWYgY2xvY2sKKwkJCXRyZWUgZGF0YSBwcmVzZW50IGluIGRldmljZSB0cmVlLCBpbiBhbm90aGVyIGNhc2UgZG9uJ3QKKwkJCXVzZSBpdC4KKwkJCVNlZSBjbG9jay1iaW5kaW5ncy50eHQKKworLSBjbG9jay1yYW5nZXM6CQlFbXB0eSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgY2hpbGQgbm9kZXMgY2FuIGluaGVyaXQKKwkJCW5hbWVkIGNsb2Nrcy4gUmVxdWlyZWQgb25seSBpZiBjbG9jayB0cmVlIGRhdGEgcHJlc2VudAorCQkJaW4gZGV2aWNlIHRyZWUuCisJCQlTZWUgY2xvY2stYmluZGluZ3MudHh0CisKKworQ2hpbGQgY2hpcC1zZWxlY3QgKGNzKSBub2RlcyBjb250YWluIHRoZSBtZW1vcnkgZGV2aWNlcyBub2RlcyBjb25uZWN0ZWQgdG8KK3N1Y2ggYXMgTk9SIChlLmcuIGNmaS1mbGFzaCkgYW5kIE5BTkQgKHRpLGRhdmluY2ktbmFuZCwgc2VlIGRhdmluY2ktbmFuZC50eHQpLgorVGhlcmUgbWlnaHQgYmUgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyBsaWtlIEZQR0FzLgorCitSZXF1aXJlZCBjaGlsZCBjcyBub2RlIHByb3BlcnRpZXM6CisKKy0gI2FkZHJlc3MtY2VsbHM6CU11c3QgYmUgMi4KKworLSAjc2l6ZS1jZWxsczoJCU11c3QgYmUgMS4KKworLSByYW5nZXM6CQlFbXB0eSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgY2hpbGQgbm9kZXMgY2FuIGluaGVyaXQKKwkJCW1lbW9yeSBsYXlvdXQuCisKKy0gY2xvY2stcmFuZ2VzOgkJRW1wdHkgcHJvcGVydHkgaW5kaWNhdGluZyB0aGF0IGNoaWxkIG5vZGVzIGNhbiBpbmhlcml0CisJCQluYW1lZCBjbG9ja3MuIFJlcXVpcmVkIG9ubHkgaWYgY2xvY2sgdHJlZSBkYXRhIHByZXNlbnQKKwkJCWluIGRldmljZSB0cmVlLgorCistIHRpLGNzLWNoaXBzZWxlY3Q6CW51bWJlciBvZiBjaGlwc2VsZWN0LiBJbmRpY2F0ZXMgb24gdGhlIGFlbWlmIGRyaXZlcgorCQkJd2hpY2ggY2hpcHNlbGVjdCBpcyB1c2VkIGZvciBhY2Nlc3NpbmcgdGhlIG1lbW9yeS4gRm9yCisJCQljb21wYXRpYmxlcyAidGksZGF2aW5jaS1hZW1pZiIgYW5kICJ0aSxrZXlzdG9uZS1hZW1pZiIKKwkJCWl0IGNhbiBiZSBpbiByYW5nZSBbMC0zXS4gRm9yIGNvbXBhdGlibGUKKwkJCSJ0aSxkYTg1MC1hZW1pZiIgcmFuZ2UgaXMgWzItNV0uCisKK09wdGlvbmFsIGNoaWxkIGNzIG5vZGUgcHJvcGVydGllczoKKworLSB0aSxjcy1idXMtd2lkdGg6CQl3aWR0aCBvZiB0aGUgYXN5bmNocm9ub3VzIGRldmljZSdzIGRhdGEgYnVzCisJCQkJOCBvciAxNiBpZiBub3QgcHJlc2V0IDgKKworLSB0aSxjcy1zZWxlY3Qtc3Ryb2JlLW1vZGU6CWVuYWJsZS9kaXNhYmxlIHNlbGVjdCBzdHJvYmUgbW9kZQorCQkJCUluIHNlbGVjdCBzdHJvYmUgbW9kZSBjaGlwIHNlbGVjdCBiZWhhdmVzIGFzCisJCQkJdGhlIHN0cm9iZSBhbmQgaXMgYWN0aXZlIG9ubHkgZHVyaW5nIHRoZSBzdHJvYmUKKwkJCQlwZXJpb2QuIElmIHByZXNlbnQgdGhlbiBlbmFibGUuCisKKy0gdGksY3MtZXh0ZW5kZWQtd2FpdC1tb2RlOgllbmFibGUvZGlzYWJsZSBleHRlbmRlZCB3YWl0IG1vZGUKKwkJCQlpZiBzZXQsIHRoZSBjb250cm9sbGVyIG1vbml0b3JzIHRoZSBFTUlGV0FJVCBwaW4KKwkJCQltYXBwZWQgdG8gdGhhdCBjaGlwIHNlbGVjdCB0byBkZXRlcm1pbmUgaWYgdGhlCisJCQkJZGV2aWNlIHdhbnRzIHRvIGV4dGVuZCB0aGUgc3Ryb2JlIHBlcmlvZC4gSWYKKwkJCQlwcmVzZW50IHRoZW4gZW5hYmxlLgorCistIHRpLGNzLW1pbi10dXJuYXJvdW5kLW5zOgltaW5pbXVtIHR1cm4gYXJvdW5kIHRpbWUsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBlbmQgb2Ygb25lIGFzeW5jaHJvbm91cyBtZW1vcnkKKwkJCQlhY2Nlc3MgYW5kIHRoZSBzdGFydCBvZiBhbm90aGVyIGFzeW5jaHJvbm91cworCQkJCW1lbW9yeSBhY2Nlc3MuIFRoaXMgZGVsYXkgaXMgbm90IGluY3VycmVkCisJCQkJYmV0d2VlbiBhIHJlYWQgZm9sbG93ZWQgYnkgcmVhZCBvciBhIHdyaXRlCisJCQkJZm9sbG93ZWQgYnkgYSB3cml0ZSB0byBzYW1lIGNoaXAgc2VsZWN0LgorCistIHRpLGNzLXJlYWQtc2V0dXAtbnM6CQlyZWFkIHNldHVwIHdpZHRoLCBucworCQkJCVRpbWUgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIG9mIGEgbWVtb3J5IGN5Y2xlCisJCQkJYW5kIHRoZSBhY3RpdmF0aW9uIG9mIHJlYWQgc3Ryb2JlLgorCQkJCU1pbmltdW0gdmFsdWUgaXMgMSAoMCB0cmVhdGVkIGFzIDEpLgorCistIHRpLGNzLXJlYWQtc3Ryb2JlLW5zOgkJcmVhZCBzdHJvYmUgd2lkdGgsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24gb2YKKwkJCQl0aGUgcmVhZCBzdHJvYmUuCisJCQkJTWluaW11bSB2YWx1ZSBpcyAxICgwIHRyZWF0ZWQgYXMgMSkuCisKKy0gdGksY3MtcmVhZC1ob2xkLW5zOgkJcmVhZCBob2xkIHdpZHRoLCBucworCQkJCVRpbWUgYmV0d2VlbiB0aGUgZGVhY3RpdmF0aW9uIG9mIHRoZSByZWFkCisJCQkJc3Ryb2JlIGFuZCB0aGUgZW5kIG9mIHRoZSBjeWNsZSAod2hpY2ggbWF5IGJlCisJCQkJZWl0aGVyIGFuIGFkZHJlc3MgY2hhbmdlIG9yIHRoZSBkZWFjdGl2YXRpb24gb2YKKwkJCQl0aGUgY2hpcCBzZWxlY3Qgc2lnbmFsLgorCQkJCU1pbmltdW0gdmFsdWUgaXMgMSAoMCB0cmVhdGVkIGFzIDEpLgorCistIHRpLGNzLXdyaXRlLXNldHVwLW5zOgkJd3JpdGUgc2V0dXAgd2lkdGgsIG5zCisJCQkJVGltZSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgYSBtZW1vcnkgY3ljbGUKKwkJCQlhbmQgdGhlIGFjdGl2YXRpb24gb2Ygd3JpdGUgc3Ryb2JlLgorCQkJCU1pbmltdW0gdmFsdWUgaXMgMSAoMCB0cmVhdGVkIGFzIDEpLgorCistIHRpLGNzLXdyaXRlLXN0cm9iZS1uczoJd3JpdGUgc3Ryb2JlIHdpZHRoLCBucworCQkJCVRpbWUgYmV0d2VlbiB0aGUgYWN0aXZhdGlvbiBhbmQgZGVhY3RpdmF0aW9uIG9mCisJCQkJdGhlIHdyaXRlIHN0cm9iZS4KKwkJCQlNaW5pbXVtIHZhbHVlIGlzIDEgKDAgdHJlYXRlZCBhcyAxKS4KKworLSB0aSxjcy13cml0ZS1ob2xkLW5zOgkJd3JpdGUgaG9sZCB3aWR0aCwgbnMKKwkJCQlUaW1lIGJldHdlZW4gdGhlIGRlYWN0aXZhdGlvbiBvZiB0aGUgd3JpdGUKKwkJCQlzdHJvYmUgYW5kIHRoZSBlbmQgb2YgdGhlIGN5Y2xlICh3aGljaCBtYXkgYmUKKwkJCQllaXRoZXIgYW4gYWRkcmVzcyBjaGFuZ2Ugb3IgdGhlIGRlYWN0aXZhdGlvbiBvZgorCQkJCXRoZSBjaGlwIHNlbGVjdCBzaWduYWwuCisJCQkJTWluaW11bSB2YWx1ZSBpcyAxICgwIHRyZWF0ZWQgYXMgMSkuCisKK0lmIGFueSBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgYWJzZW50LCBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIHRha2VuCitmcm9tIHRoZSBjb3JyZXNwb25kaW5nIEhXIHJlZy4KKworRXhhbXBsZSBmb3IgYWVtaWYsIGRhdmluY2kgbmFuZCBhbmQgbm9yIGZsYXNoIGNoaXAgc2VsZWN0IHNob3duIGJlbG93LgorCittZW1vcnktY29udHJvbGxlckAyMTAwMEEwMCB7CisJY29tcGF0aWJsZSA9ICJ0aSxkYXZpbmNpLWFlbWlmIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljbG9ja3MgPSA8JmNsa2FlbWlmIDA+OworCWNsb2NrLW5hbWVzID0gImFlbWlmIjsKKwljbG9jay1yYW5nZXM7CisJcmVnID0gPDB4MjEwMDBBMDAgMHgwMDAwMDEwMD47CisJcmFuZ2VzID0gPDAgMCAweDcwMDAwMDAwIDB4MTAwMDAwMDAKKwkJICAxIDAgMHgyMTAwMEEwMCAweDAwMDAwMTAwPjsKKwkJICAvKgorCQkgICAqIFBhcnRpdGlvbjA6IENTLXNwZWNpZmljIG1lbW9yeSByYW5nZSB3aGljaCBpcworCQkgICAqIGltcGxlbWVudGVkIGFzIGNvbnRpbnVvdXMgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbgorCQkgICAqIFBhcnRpdGlvbjE6IGNvbnRyb2wgbWVtb3J5IHJhbmdlCisJCSAgICovCisKKwluYW5kOmNzMiB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY2xvY2stcmFuZ2VzOworCQlyYW5nZXM7CisKKwkJdGksY3MtY2hpcHNlbGVjdCA9IDwyPjsKKwkJLyogYWxsIHRpbWluZ3MgaW4gbmFub3NlY29uZHMgKi8KKwkJdGksY3MtbWluLXR1cm5hcm91bmQtbnMgPSA8MD47CisJCXRpLGNzLXJlYWQtaG9sZC1ucyA9IDw3PjsKKwkJdGksY3MtcmVhZC1zdHJvYmUtbnMgPSA8NDI+OworCQl0aSxjcy1yZWFkLXNldHVwLW5zID0gPDE0PjsKKwkJdGksY3Mtd3JpdGUtaG9sZC1ucyA9IDw3PjsKKwkJdGksY3Mtd3JpdGUtc3Ryb2JlLW5zID0gPDQyPjsKKwkJdGksY3Mtd3JpdGUtc2V0dXAtbnMgPSA8MTQ+OworCisJCW5hbmRAMCwweDgwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJ0aSxkYXZpbmNpLW5hbmQiOworCQkJcmVnID0gPDAgMHg4MDAwMDAwIDB4NDAwMDAwMAorCQkJICAgICAgIDEgMHgwMDAwMDAwIDB4MDAwMDEwMD47CisJCQkvKgorCQkJICogUGFydGl0aW9uMCwgb2Zmc2V0IDB4ODAwMDAwMCwgc2l6ZSAweDQwMDAwMDAKKwkJCSAqIFBhcnRpdGlvbjEsIG9mZnNldCAweDAwMDAwMDAsIHNpemUgMHgwMDAwMTAwCisJCQkgKi8KKworCQkJLi4gc2VlIGRhdmluY2ktbmFuZC50eHQKKwkJfTsKKwl9OworCisJbm9yOmNzMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY2xvY2stcmFuZ2VzOworCQlyYW5nZXM7CisKKwkJdGksY3MtY2hpcHNlbGVjdCA9IDwwPjsKKwkJLyogYWxsIHRpbWluZ3MgaW4gbmFub3NlY29uZHMgKi8KKwkJdGksY3MtbWluLXR1cm5hcm91bmQtbnMgPSA8MD47CisJCXRpLGNzLXJlYWQtaG9sZC1ucyA9IDw4PjsKKwkJdGksY3MtcmVhZC1zdHJvYmUtbnMgPSA8NDA+OworCQl0aSxjcy1yZWFkLXNldHVwLW5zID0gPDE0PjsKKwkJdGksY3Mtd3JpdGUtaG9sZC1ucyA9IDw3PjsKKwkJdGksY3Mtd3JpdGUtc3Ryb2JlLW5zID0gPDQwPjsKKwkJdGksY3Mtd3JpdGUtc2V0dXAtbnMgPSA8MTQ+OworCQl0aSxjcy1idXMtd2lkdGggPSA8MTY+OworCisJCWZsYXNoQDAsMHgwMDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJCXJlZyA9IDwwIDB4MDAwMDAwMCAweDQwMDAwMDA+OworCisJCQkuLi4KKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcGEwMS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3MybXBhMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxM2QzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3MybXBhMDEudHh0CkBAIC0wLDAgKzEsOTAgQEAKKworKiBTYW1zdW5nIFMyTVBBMDEgVm9sdGFnZSBhbmQgQ3VycmVudCBSZWd1bGF0b3IKKworVGhlIFNhbXN1bmcgUzJNUEEwMSBpcyBhIG11bHRpLWZ1bmN0aW9uIGRldmljZSB3aGljaCBpbmNsdWRlcyBoaWdoCitlZmZpY2llbmN5IGJ1Y2sgY29udmVydGVycyBpbmNsdWRpbmcgRHVhbC1QaGFzZSBidWNrIGNvbnZlcnRlciwgdmFyaW91cyBMRE9zLAorYW5kIGFuIFJUQy4gSXQgaXMgaW50ZXJmYWNlZCB0byB0aGUgaG9zdCBjb250cm9sbGVyIHVzaW5nIGFuIEkyQyBpbnRlcmZhY2UuCitFYWNoIHN1Yi1ibG9jayBpcyBhZGRyZXNzZWQgYnkgdGhlIGhvc3Qgc3lzdGVtIHVzaW5nIGRpZmZlcmVudCBJMkMgc2xhdmUKK2FkZHJlc3Nlcy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzYW1zdW5nLHMybXBhMDEtcG1pYyIuCistIHJlZzogU3BlY2lmaWVzIHRoZSBJMkMgc2xhdmUgYWRkcmVzcyBvZiB0aGUgUE1JQyBibG9jay4gSXQgc2hvdWxkIGJlIDB4NjYuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGludGVycnVwdC1wYXJlbnQ6IFNwZWNpZmllcyB0aGUgcGhhbmRsZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdG8gd2hpY2gKKyAgdGhlIGludGVycnVwdHMgZnJvbSBzMm1wYTAxIGFyZSBkZWxpdmVyZWQgdG8uCistIGludGVycnVwdHM6IEFuIGludGVycnVwdCBzcGVjaWZpZXIgZm9yIHRoZSBzb2xlIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgdGhlCisgIGRldmljZS4KKworT3B0aW9uYWwgbm9kZXM6CistIHJlZ3VsYXRvcnM6IFRoZSByZWd1bGF0b3JzIG9mIHMybXBhMDEgdGhhdCBoYXZlIHRvIGJlIGluc3RhbnRpYXRlZCBzaG91bGQgYmUKKyAgaW5jbHVkZWQgaW4gYSBzdWItbm9kZSBuYW1lZCAncmVndWxhdG9ycycuIFJlZ3VsYXRvciBub2RlcyBhbmQgY29uc3RyYWludHMKKyAgaW5jbHVkZWQgaW4gdGhpcyBzdWItbm9kZSB1c2UgdGhlIHN0YW5kYXJkIHJlZ3VsYXRvciBiaW5kaW5ncyB3aGljaCBhcmUKKyAgZG9jdW1lbnRlZCBlbHNld2hlcmUuCisKK1Byb3BlcnRpZXMgZm9yIEJVQ0sgcmVndWxhdG9yIG5vZGVzOgorLSByZWd1bGF0b3ItcmFtcC1kZWxheTogcmFtcCBkZWxheSBpbiB1Vi91cy4gTWF5IGJlIDYyNTAsIDEyNTAwCisgIChkZWZhdWx0KSwgMjUwMDAsIG9yIDUwMDAwLiBNYXkgYmUgMCBmb3IgZGlzYWJsaW5nIHRoZSByYW1wIGRlbGF5IG9uCisgIEJVQ0t7MSwyLDMsNH0uCisKKyBJbiB0aGUgYWJzZW5jZSBvZiB0aGUgcmVndWxhdG9yLXJhbXAtZGVsYXkgcHJvcGVydHksIHRoZSBkZWZhdWx0IHJhbXAKKyBkZWxheSB3aWxsIGJlIHVzZWQuCisKKyAgTk9URTogU29tZSBCVUNLcyBzaGFyZSB0aGUgcmFtcCByYXRlIHNldHRpbmcgaS5lLiBzYW1lIHJhbXAgdmFsdWUgd2lsbCBiZSBzZXQKKyAgZm9yIGEgcGFydGljdWxhciBncm91cCBvZiBCVUNLcy4gU28gcHJvdmlkZSBzYW1lIHJlZ3VsYXRvci1yYW1wLWRlbGF5PTx2YWx1ZT4uCisKKyAgVGhlIGZvbGxvd2luZyBCVUNLcyBzaGFyZSByYW1wIHNldHRpbmdzOgorICAqIDEgYW5kIDYKKyAgKiAyIGFuZCA0CisgICogOCwgOSwgYW5kIDEwCisKK1RoZSBmb2xsb3dpbmcgYXJlIHRoZSBuYW1lcyBvZiB0aGUgcmVndWxhdG9ycyB0aGF0IHRoZSBzMm1wYTAxIFBNSUMgYmxvY2sKK3N1cHBvcnRzLiBOb3RlOiBUaGUgJ24nIGluIExET24gYW5kIEJVQ0tuIHJlcHJlc2VudHMgdGhlIExETyBvciBCVUNLIG51bWJlcgorYXMgcGVyIHRoZSBkYXRhc2hlZXQgb2YgczJtcGEwMS4KKworCS0gTERPbgorCQkgIC0gdmFsaWQgdmFsdWVzIGZvciBuIGFyZSAxIHRvIDI2CisJCSAgLSBFeGFtcGxlOiBMRE8xLCBMRDAyLCBMRE8yNgorCS0gQlVDS24KKwkJICAtIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmUgMSB0byAxMC4KKwkJICAtIEV4YW1wbGU6IEJVQ0sxLCBCVUNLMiwgQlVDSzkKKworRXhhbXBsZToKKworCXMybXBhMDFfcG1pY0A2NiB7CisJCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxzMm1wYTAxLXBtaWMiOworCQlyZWcgPSA8MHg2Nj47CisKKwkJcmVndWxhdG9ycyB7CisJCQlsZG8xX3JlZzogTERPMSB7CisJCQkJcmVndWxhdG9yLW5hbWUgPSAiVkREX0FMSVZFIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMDAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxMDAwMDAwPjsKKwkJCX07CisKKwkJCWxkbzJfcmVnOiBMRE8yIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJWRERRX01NQzIiOworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDI4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDI4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlidWNrMV9yZWc6IEJVQ0sxIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJ2ZGRfbWlmIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw5NTAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEzNTAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQl9OworCisJCQlidWNrMl9yZWc6IEJVQ0syIHsKKwkJCQlyZWd1bGF0b3ItbmFtZSA9ICJ2ZGRfYXJtIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw5NTAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEzNTAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NTAwMDA+OworCQkJfTsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zMm1wczExLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcHMxMS50eHQKaW5kZXggMTVlZTg5YzNjLi5mNjliZWMyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3MybXBzMTEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvczJtcHMxMS50eHQKQEAgLTEsNSArMSw1IEBACiAKLSogU2Ftc3VuZyBTMk1QUzExIFZvbHRhZ2UgYW5kIEN1cnJlbnQgUmVndWxhdG9yCisqIFNhbXN1bmcgUzJNUFMxMSBhbmQgUzJNUFMxNCBWb2x0YWdlIGFuZCBDdXJyZW50IFJlZ3VsYXRvcgogCiBUaGUgU2Ftc3VuZyBTMk1QUzExIGlzIGEgbXVsdGktZnVuY3Rpb24gZGV2aWNlIHdoaWNoIGluY2x1ZGVzIHZvbHRhZ2UgYW5kCiBjdXJyZW50IHJlZ3VsYXRvcnMsIFJUQywgY2hhcmdlciBjb250cm9sbGVyIGFuZCBvdGhlciBzdWItYmxvY2tzLiBJdCBpcwpAQCAtNyw3ICs3LDcgQEAKIGFkZHJlc3NlZCBieSB0aGUgaG9zdCBzeXN0ZW0gdXNpbmcgZGlmZmVyZW50IEkyQyBzbGF2ZSBhZGRyZXNzZXMuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IFNob3VsZCBiZSAic2Ftc3VuZyxzMm1wczExLXBtaWMiLgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInNhbXN1bmcsczJtcHMxMS1wbWljIiBvciAic2Ftc3VuZyxzMm1wczE0LXBtaWMiLgogLSByZWc6IFNwZWNpZmllcyB0aGUgSTJDIHNsYXZlIGFkZHJlc3Mgb2YgdGhlIHBtaWMgYmxvY2suIEl0IHNob3VsZCBiZSAweDY2LgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgpAQCAtNTksMTAgKzU5LDE0IEBACiBhcyBwZXIgdGhlIGRhdGFzaGVldCBvZiBzMm1wczExLgogCiAJLSBMRE9uCi0JCSAgLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlIDEgdG8gMzgKKwkJICAtIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmU6CisJCQktIFMyTVBTMTE6IDEgdG8gMzgKKwkJCS0gUzJNUFMxNDogMSB0byAyNQogCQkgIC0gRXhhbXBsZTogTERPMSwgTEQwMiwgTERPMjgKIAktIEJVQ0tuCi0JCSAgLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlIDEgdG8gMTAuCisJCSAgLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlOgorCQkJLSBTMk1QUzExOiAxIHRvIDEwCisJCQktIFMyTVBTMTQ6IDEgdG8gNQogCQkgIC0gRXhhbXBsZTogQlVDSzEsIEJVQ0syLCBCVUNLOQogCiBFeGFtcGxlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC90cHM2NTkxMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3RwczY1OTEwLnR4dAppbmRleCBiNGJkOThhLi4zODgzM2U2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3RwczY1OTEwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3RwczY1OTEwLnR4dApAQCAtMTEsNyArMTEsNyBAQAogLSAjaW50ZXJydXB0LWNlbGxzOiB0aGUgbnVtYmVyIG9mIGNlbGxzIHRvIGRlc2NyaWJlIGFuIElSUSwgdGhpcyBzaG91bGQgYmUgMi4KICAgVGhlIGZpcnN0IGNlbGwgaXMgdGhlIElSUSBudW1iZXIuCiAgIFRoZSBzZWNvbmQgY2VsbCBpcyB0aGUgZmxhZ3MsIGVuY29kZWQgYXMgdGhlIHRyaWdnZXIgbWFza3MgZnJvbQotICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0cy50eHQKKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0CiAtIHJlZ3VsYXRvcnM6IFRoaXMgaXMgdGhlIGxpc3Qgb2YgY2hpbGQgbm9kZXMgdGhhdCBzcGVjaWZ5IHRoZSByZWd1bGF0b3IKICAgaW5pdGlhbGl6YXRpb24gZGF0YSBmb3IgZGVmaW5lZCByZWd1bGF0b3JzLiBOb3QgYWxsIHJlZ3VsYXRvcnMgZm9yIHRoZSBnaXZlbgogICBkZXZpY2UgbmVlZCB0byBiZSBwcmVzZW50LiBUaGUgZGVmaW5pdGlvbiBmb3IgZWFjaCBvZiB0aGVzZSBub2RlcyBpcyBkZWZpbmVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9hbGx3aW5uZXIsc3VueGktc2lkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2FsbHdpbm5lcixzdW54aS1zaWQudHh0CmluZGV4IDY4YmEzNzIuLmZhYmRmNjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2FsbHdpbm5lcixzdW54aS1zaWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2FsbHdpbm5lcixzdW54aS1zaWQudHh0CkBAIC0xLDEyICsxLDEyIEBACiBBbGx3aW5uZXIgc3VueGktc2lkCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6ICJhbGx3aW5uZXIsc3VuNGktc2lkIiBvciAiYWxsd2lubmVyLHN1bjdpLWEyMC1zaWQiLgorLSBjb21wYXRpYmxlOiAiYWxsd2lubmVyLHN1bjRpLWExMC1zaWQiIG9yICJhbGx3aW5uZXIsc3VuN2ktYTIwLXNpZCIKIC0gcmVnOiBTaG91bGQgY29udGFpbiByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAogCiBFeGFtcGxlIGZvciBzdW40aToKIAlzaWRAMDFjMjM4MDAgewotCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1zaWQiOworCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc2lkIjsKIAkJcmVnID0gPDB4MDFjMjM4MDAgMHgxMD4KIAl9OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9hdG1lbC1zc2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2MvYXRtZWwtc3NjLnR4dAppbmRleCA2MDk2MGIyLi5lZmM5OGVhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWlzYy9hdG1lbC1zc2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL2F0bWVsLXNzYy50eHQKQEAgLTE3LDYgKzE3LDE0IEBACiAgIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2F0bWVsLWRtYS50eHQgZm9yIGRldGFpbHMuCiAtIGRtYS1uYW1lczogTXVzdCBiZSAidHgiLCAicngiLgogCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorICAtIGF0bWVsLGNsay1mcm9tLXJrLXBpbjogYm9vbCBwcm9wZXJ0eS4KKyAgICAgLSBXaGVuIFNTQyB3b3JrcyBpbiBzbGF2ZSBtb2RlLCBhY2NvcmRpbmcgdG8gdGhlIGhhcmR3YXJlIGRlc2lnbiwgdGhlCisgICAgICAgY2xvY2sgY2FuIGdldCBmcm9tIFRLIHBpbiwgYW5kIGFsc28gY2FuIGdldCBmcm9tIFJLIHBpbi4gU28sIGFkZAorICAgICAgIHRoaXMgcGFyYW1ldGVyIHRvIGNob29zZSB3aGVyZSB0aGUgY2xvY2sgZnJvbS4KKyAgICAgLSBCeSBkZWZhdWx0IHRoZSBjbG9jayBpcyBmcm9tIFRLIHBpbiwgaWYgdGhlIGNsb2NrIGZyb20gUksgcGluLCB0aGlzCisgICAgICAgcHJvcGVydHkgaXMgbmVlZGVkLgorCiBFeGFtcGxlczoKIC0gUERDIHRyYW5zZmVyOgogc3NjMDogc3NjQGZmZmJjMDAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9taXNjL3NyYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2Mvc3JhbS50eHQKaW5kZXggNGQwYTAwZS4uMzZjYmU1YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2Mvc3JhbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21pc2Mvc3JhbS50eHQKQEAgLTgsOSArOCw0NCBAQAogCiAtIHJlZyA6IFNSQU0gaW9tZW0gYWRkcmVzcyByYW5nZQogCitSZXNlcnZpbmcgc3JhbSBhcmVhczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIGNoaWxkIG9mIHRoZSBzcmFtIG5vZGUgc3BlY2lmaWVzIGEgcmVnaW9uIG9mIHJlc2VydmVkIG1lbW9yeS4gRWFjaAorY2hpbGQgbm9kZSBzaG91bGQgdXNlIGEgJ3JlZycgcHJvcGVydHkgdG8gc3BlY2lmeSBhIHNwZWNpZmljIHJhbmdlIG9mCityZXNlcnZlZCBtZW1vcnkuCisKK0ZvbGxvd2luZyB0aGUgZ2VuZXJpYy1uYW1lcyByZWNvbW1lbmRlZCBwcmFjdGljZSwgbm9kZSBuYW1lcyBzaG91bGQKK3JlZmxlY3QgdGhlIHB1cnBvc2Ugb2YgdGhlIG5vZGUuIFVuaXQgYWRkcmVzcyAoQDxhZGRyZXNzPikgc2hvdWxkIGJlCithcHBlbmRlZCB0byB0aGUgbmFtZS4KKworUmVxdWlyZWQgcHJvcGVydGllcyBpbiB0aGUgc3JhbSBub2RlOgorCistICNhZGRyZXNzLWNlbGxzLCAjc2l6ZS1jZWxscyA6IHNob3VsZCB1c2UgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSByb290IG5vZGUKKy0gcmFuZ2VzIDogc3RhbmRhcmQgZGVmaW5pdGlvbiwgc2hvdWxkIHRyYW5zbGF0ZSBmcm9tIGxvY2FsIGFkZHJlc3NlcworICAgICAgICAgICB3aXRoaW4gdGhlIHNyYW0gdG8gYnVzIGFkZHJlc3NlcworCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGluIHRoZSBhcmVhIG5vZGVzOgorCistIHJlZyA6IGlvbWVtIGFkZHJlc3MgcmFuZ2UsIHJlbGF0aXZlIHRvIHRoZSBTUkFNIHJhbmdlCisKK09wdGlvbmFsIHByb3BlcnRpZXMgaW4gdGhlIGFyZWEgbm9kZXM6CisKKy0gY29tcGF0aWJsZSA6IHN0YW5kYXJkIGRlZmluaXRpb24sIHNob3VsZCBjb250YWluIGEgdmVuZG9yIHNwZWNpZmljIHN0cmluZworICAgICAgICAgICAgICAgaW4gdGhlIGZvcm0gPHZlbmRvcj4sWzxkZXZpY2U+LV08dXNhZ2U+CisKIEV4YW1wbGU6CiAKIHNyYW06IHNyYW1ANWMwMDAwMDAgewogCWNvbXBhdGlibGUgPSAibW1pby1zcmFtIjsKIAlyZWcgPSA8MHg1YzAwMDAwMCAweDQwMDAwPjsgLyogMjU2IEtpQiBTUkFNIGF0IGFkZHJlc3MgMHg1YzAwMDAwMCAqLworCisJI2FkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlyYW5nZXMgPSA8MCAweDVjMDAwMDAwIDB4NDAwMDA+OworCisJc21wLXNyYW1AMTAwIHsKKwkJY29tcGF0aWJsZSA9ICJzb2N2ZW5kb3Isc21wLXNyYW0iOworCQlyZWcgPSA8MHgxMDAgMHg1MD47CisJfTsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21pY3JlbC1rczg4NTEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9taWNyZWwta3M4ODUxLnR4dAppbmRleCAxMWFjZTNjLi40ZmMzOTI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21pY3JlbC1rczg4NTEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWljcmVsLWtzODg1MS50eHQKQEAgLTcsMyArNyw0IEBACiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGxvY2FsLW1hYy1hZGRyZXNzIDogRXRoZXJuZXQgbWFjIGFkZHJlc3MgdG8gdXNlCistIHZkZC1zdXBwbHk6CXN1cHBseSBmb3IgRXRoZXJuZXQgbWFjCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L2FwbS14Z2VuZS1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9hcG0teGdlbmUtcGh5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNhNjVhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9hcG0teGdlbmUtcGh5LnR4dApAQCAtMCwwICsxLDc5IEBACisqIEFQTSBYLUdlbmUgMTVHYnBzIE11bHRpLXB1cnBvc2UgUEhZIG5vZGVzCisKK1BIWSBub2RlcyBhcmUgZGVmaW5lZCB0byBkZXNjcmliZSBvbi1jaGlwIDE1R2JwcyBNdWx0aS1wdXJwb3NlIFBIWS4gRWFjaAorUEhZIChwYWlyIG9mIGxhbmVzKSBoYXMgaXRzIG93biBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IFNoYWxsIGJlICJhcG0seGdlbmUtcGh5Ii4KKy0gcmVnCQkJOiBQSFkgbWVtb3J5IHJlc291cmNlIGlzIHRoZSBTRFMgUEhZIGFjY2VzcyByZXNvdXJjZS4KKy0gI3BoeS1jZWxscwkJOiBTaGFsbCBiZSAxIGFzIGl0IGV4cGVjdHMgb25lIGFyZ3VtZW50IGZvciBzZXR0aW5nCisJCQkgIHRoZSBtb2RlIG9mIHRoZSBQSFkuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCAoU0FUQSksCisJCQkgIDEgKFNHTUlJKSwgMiAoUENJZSksIDMgKFVTQiksIGFuZCA0IChYRkkpLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBzdGF0dXMJCTogU2hhbGwgYmUgIm9rIiBpZiBlbmFibGVkIG9yICJkaXNhYmxlZCIgaWYgZGlzYWJsZWQuCisJCQkgIERlZmF1bHQgaXMgIm9rIi4KKy0gY2xvY2tzCQk6IFJlZmVyZW5jZSB0byB0aGUgY2xvY2sgZW50cnkuCistIGFwbSx0eC1leWUtdHVuaW5nCTogTWFudWFsIGNvbnRyb2wgdG8gZmluZSB0dW5lIHRoZSBjYXB0dXJlIG9mIHRoZSBzZXJpYWwKKwkJCSAgYml0IGxpbmVzIGZyb20gdGhlIGF1dG9tYXRpYyBjYWxpYnJhdGVkIHBvc2l0aW9uLgorCQkJICBUd28gc2V0IG9mIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaCAodXAgdG8gMykKKwkJCSAgc3VwcG9ydGVkIGxpbmsgc3BlZWQgb24gdGhlIGhvc3QuIFJhbmdlIGZyb20gMCB0bworCQkJICAxMjcgaW4gdW5pdCBvZiBvbmUgYml0IHBlcmlvZC4gRGVmYXVsdCBpcyAxMC4KKy0gYXBtLHR4LWV5ZS1kaXJlY3Rpb24JOiBFeWUgdHVuaW5nIG1hbnVhbCBjb250cm9sIGRpcmVjdGlvbi4gMCBtZWFucyBzYW1wbGUKKwkJCSAgZGF0YSBlYXJsaWVyIHRoYW4gdGhlIG5vbWluYWwgc2FtcGxpbmcgcG9pbnQuIDEgbWVhbnMKKwkJCSAgc2FtcGxlIGRhdGEgbGF0ZXIgdGhhbiB0aGUgbm9taW5hbCBzYW1wbGluZyBwb2ludC4KKwkJCSAgVHdvIHNldCBvZiAzLXR1cGxlIHNldHRpbmcgZm9yIGVhY2ggKHVwIHRvIDMpCisJCQkgIHN1cHBvcnRlZCBsaW5rIHNwZWVkIG9uIHRoZSBob3N0LiBEZWZhdWx0IGlzIDAuCistIGFwbSx0eC1ib29zdC1nYWluCTogRnJlcXVlbmN5IGJvb3N0IEFDIChMU0IgMy1iaXQpIGFuZCBEQyAoMi1iaXQpCisJCQkgIGdhaW4gY29udHJvbC4gVHdvIHNldCBvZiAzLXR1cGxlIHNldHRpbmcgZm9yIGVhY2gKKwkJCSAgKHVwIHRvIDMpIHN1cHBvcnRlZCBsaW5rIHNwZWVkIG9uIHRoZSBob3N0LiBSYW5nZSBpcworCQkJICBiZXR3ZWVuIDAgdG8gMzEgaW4gdW5pdCBvZiBkQi4gRGVmYXVsdCBpcyAzLgorLSBhcG0sdHgtYW1wbGl0dWRlCTogQW1wbGl0dWRlIGNvbnRyb2wuIFR3byBzZXQgb2YgMy10dXBsZSBzZXR0aW5nIGZvcgorCQkJICBlYWNoICh1cCB0byAzKSBzdXBwb3J0ZWQgbGluayBzcGVlZCBvbiB0aGUgaG9zdC4KKwkJCSAgUmFuZ2UgaXMgYmV0d2VlbiAwIHRvIDE5OTUwMCBpbiB1bml0IG9mIHVWLgorCQkJICBEZWZhdWx0IGlzIDE5OTUwMCB1Vi4KKy0gYXBtLHR4LXByZS1jdXJzb3IxCTogMXN0IHByZS1jdXJzb3IgZW1waGFzaXMgdGFwcyBjb250cm9sLiBUd28gc2V0IG9mCisJCQkgIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaCAodXAgdG8gMykgc3VwcG9ydGVkIGxpbmsKKwkJCSAgc3BlZWQgb24gdGhlIGhvc3QuIFJhbmdlIGlzIDAgdG8gMjczMDAwIGluIHVuaXQgb2YKKwkJCSAgdVYuIERlZmF1bHQgaXMgMC4KKy0gYXBtLHR4LXByZS1jdXJzb3IyCTogMnN0IHByZS1jdXJzb3IgZW1waGFzaXMgdGFwcyBjb250cm9sLiBUd28gc2V0IG9mCisJCQkgIDMtdHVwbGUgc2V0dGluZyBmb3IgZWFjaCAodXAgdG8gMykgc3VwcG9ydGVkIGxpbmsKKwkJCSAgc3BlZWQgb24gdGhlIGhvc3QuIFJhbmdlIGlzIDAgdG8gMTI3NDAwIGluIHVuaXQgdVYuCisJCQkgIERlZmF1bHQgaXMgMHgwLgorLSBhcG0sdHgtcG9zdC1jdXJzb3IJOiBQb3N0LWN1cnNvciBlbXBoYXNpcyB0YXBzIGNvbnRyb2wuIFR3byBzZXQgb2YKKwkJCSAgMy10dXBsZSBzZXR0aW5nIGZvciBHZW4xLCBHZW4yLCBhbmQgR2VuMy4gUmFuZ2UgaXMKKwkJCSAgYmV0d2VlbiAwIHRvIDB4MWYgaW4gdW5pdCBvZiAxOC4ybVYuIERlZmF1bHQgaXMgMHhmLgorLSBhcG0sdHgtc3BlZWQJCTogVHggb3BlcmF0aW5nIHNwZWVkLiBPbmUgc2V0IG9mIDMtdHVwbGUgZm9yIGVhY2gKKwkJCSAgc3VwcG9ydGVkIGxpbmsgc3BlZWQgb24gdGhlIGhvc3QuCisJCQkgICAwID0gMS0yR2JwcworCQkJICAgMSA9IDItNEdicHMgKDFzdCB0dXBsZSBkZWZhdWx0KQorCQkJICAgMiA9IDQtOEdicHMKKwkJCSAgIDMgPSA4LTE1R2JwcyAoMm5kIHR1cGxlIGRlZmF1bHQpCisJCQkgICA0ID0gMi41LTRHYnBzCisJCQkgICA1ID0gNC01R2JwcworCQkJICAgNiA9IDUtNkdicHMKKwkJCSAgIDcgPSA2LTE2R2JwcyAoM3JkIHR1cGxlIGRlZmF1bHQpCisKK05PVEU6IFBIWSBvdmVycmlkZSBwYXJhbWV0ZXJzIGFyZSBib2FyZCBzcGVjaWZpYyBzZXR0aW5nLgorCitFeGFtcGxlOgorCQlwaHkxOiBwaHlAMWYyMWEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtcGh5IjsKKwkJCXJlZyA9IDwweDAgMHgxZjIxYTAwMCAweDAgMHgxMDA+OworCQkJI3BoeS1jZWxscyA9IDwxPjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcGh5MjogcGh5QDFmMjJhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyMmEwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCQlzdGF0dXMgPSAib2siOworCQl9OworCisJCXBoeTM6IHBoeUAxZjIzYTAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiOworCQkJcmVnID0gPDB4MCAweDFmMjNhMDAwIDB4MCAweDEwMD47CisJCQkjcGh5LWNlbGxzID0gPDE+OworCQkJc3RhdHVzID0gIm9rIjsKKwkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc2Ftc3VuZy1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKaW5kZXggYzBmY2NhYS4uMjhmOWVkYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKQEAgLTIwLDMgKzIwLDU3IEBACiAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInNhbXN1bmcsZXh5bm9zNTI1MC1kcC12aWRlby1waHkiOwogLSByZWcgOiBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRGlzcGxheSBQb3J0IFBIWSByZWdpc3RlciBzZXQ7CiAtICNwaHktY2VsbHMgOiBmcm9tIHRoZSBnZW5lcmljIFBIWSBiaW5kaW5ncywgbXVzdCBiZSAwOworCitTYW1zdW5nIFM1UC9FWFlOT1MgU29DIHNlcmllcyBVU0IgUEhZCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgb25lIG9mIHRoZSBsaXN0ZWQgY29tcGF0aWJsZXM6CisJLSAic2Ftc3VuZyxleHlub3M0MjEwLXVzYjItcGh5IgorCS0gInNhbXN1bmcsZXh5bm9zNHgxMi11c2IyLXBoeSIKKwktICJzYW1zdW5nLGV4eW5vczUyNTAtdXNiMi1waHkiCistIHJlZyA6IGEgbGlzdCBvZiByZWdpc3RlcnMgdXNlZCBieSBwaHkgZHJpdmVyCisJLSBmaXJzdCBhbmQgb2JsaWdhdG9yeSBpcyB0aGUgbG9jYXRpb24gb2YgcGh5IG1vZHVsZXMgcmVnaXN0ZXJzCistIHNhbXN1bmcsc3lzcmVnLXBoYW5kbGUgLSBoYW5kbGUgdG8gc3lzY29uIHVzZWQgdG8gY29udHJvbCB0aGUgc3lzdGVtIHJlZ2lzdGVycworLSBzYW1zdW5nLHBtdXJlZy1waGFuZGxlIC0gaGFuZGxlIHRvIHN5c2NvbiB1c2VkIHRvIGNvbnRyb2wgUE1VIHJlZ2lzdGVycworLSAjcGh5LWNlbGxzIDogZnJvbSB0aGUgZ2VuZXJpYyBwaHkgYmluZGluZ3MsIG11c3QgYmUgMTsKKy0gY2xvY2tzIGFuZCBjbG9jay1uYW1lczoKKwktIHRoZSAicGh5IiBjbG9jayBpcyByZXF1aXJlZCBieSB0aGUgcGh5IG1vZHVsZSwgdXNlZCBhcyBhIGdhdGUKKwktIHRoZSAicmVmIiBjbG9jayBpcyB1c2VkIHRvIGdldCB0aGUgcmF0ZSBvZiB0aGUgY2xvY2sgcHJvdmlkZWQgdG8gdGhlCisJICBQSFkgbW9kdWxlCisKK1RoZSBmaXJzdCBwaGFuZGxlIGFyZ3VtZW50IGluIHRoZSBQSFkgc3BlY2lmaWVyIGlkZW50aWZpZXMgdGhlIFBIWSwgaXRzCittZWFuaW5nIGlzIGNvbXBhdGlibGUgZGVwZW5kZW50LiBGb3IgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgU29DcyAoRXh5bm9zIDQyMTAKK2FuZCBFeHlub3MgNDIxMikgaXQgaXMgYXMgZm9sbG93czoKKyAgMCAtIFVTQiBkZXZpY2UgKCJkZXZpY2UiKSwKKyAgMSAtIFVTQiBob3N0ICgiaG9zdCIpLAorICAyIC0gSFNJQzAgKCJoc2ljMCIpLAorICAzIC0gSFNJQzEgKCJoc2ljMSIpLAorCitFeHlub3MgNDIxMCBhbmQgRXh5bm9zIDQyMTIgdXNlIG1vZGUgc3dpdGNoaW5nIGFuZCByZXF1aXJlIHRoYXQgbW9kZSBzd2l0Y2gKK3JlZ2lzdGVyIGlzIHN1cHBsaWVkLgorCitFeGFtcGxlOgorCitGb3IgRXh5bm9zIDQ0MTIgKGNvbXBhdGlibGUgd2l0aCBFeHlub3MgNDIxMik6CisKK3VzYnBoeTogcGh5QDEyNWIwMDAwIHsKKwljb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNHgxMi11c2IyLXBoeSI7CisJcmVnID0gPDB4MTI1YjAwMDAgMHgxMDA+OworCWNsb2NrcyA9IDwmY2xvY2sgMzA1PiwgPCZjbG9jayAyPjsKKwljbG9jay1uYW1lcyA9ICJwaHkiLCAicmVmIjsKKwlzdGF0dXMgPSAib2theSI7CisJI3BoeS1jZWxscyA9IDwxPjsKKwlzYW1zdW5nLHN5c3JlZy1waGFuZGxlID0gPCZzeXNfcmVnPjsKKwlzYW1zdW5nLHBtdXJlZy1waGFuZGxlID0gPCZwbXVfcmVnPjsKK307CisKK1RoZW4gdGhlIFBIWSBjYW4gYmUgdXNlZCBpbiBvdGhlciBub2RlcyBzdWNoIGFzOgorCitwaHktY29uc3VtZXJAMTIzNDAwMDAgeworCXBoeXMgPSA8JnVzYnBoeSAyPjsKKwlwaHktbmFtZXMgPSAicGh5IjsKK307CisKK1JlZmVyIHRvIERUIGJpbmRpbmdzIGRvY3VtZW50YXRpb24gb2YgcGFydGljdWxhciBQSFkgY29uc3VtZXIgZGV2aWNlcyBmb3IgbW9yZQoraW5mb3JtYXRpb24gYWJvdXQgcmVxdWlyZWQgUEhZcyBhbmQgdGhlIHdheSBvZiBzcGVjaWZpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW40aS11c2ItcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyMzYxYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQKQEAgLTAsMCArMSwyNiBAQAorQWxsd2lubmVyIHN1bjRpIFVTQiBQSFkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgb25lIG9mICJhbGx3aW5uZXIsc3VuNGktYTEwLXVzYi1waHkiLAorICAiYWxsd2lubmVyLHN1bjVpLWExMy11c2ItcGh5IiBvciAiYWxsd2lubmVyLHN1bjdpLWEyMC11c2ItcGh5IgorLSByZWcgOiBhIGxpc3Qgb2Ygb2Zmc2V0ICsgbGVuZ3RoIHBhaXJzCistIHJlZy1uYW1lcyA6ICJwaHlfY3RybCIsICJwbXUxIiBhbmQgZm9yIHN1bjRpIG9yIHN1bjdpICJwbXUyIgorLSAjcGh5LWNlbGxzIDogZnJvbSB0aGUgZ2VuZXJpYyBwaHkgYmluZGluZ3MsIG11c3QgYmUgMQorLSBjbG9ja3MgOiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIGZvciB0aGUgcGh5IGNsb2NrCistIGNsb2NrLW5hbWVzIDogInVzYl9waHkiCistIHJlc2V0cyA6IGEgbGlzdCBvZiBwaGFuZGxlICsgcmVzZXQgc3BlY2lmaWVyIHBhaXJzCistIHJlc2V0LW5hbWVzIDogInVzYjBfcmVzZXQiLCAidXNiMV9yZXNldCIgYW5kIGZvciBzdW40aSBvciBzdW43aSAidXNiMl9yZXNldCIKKworRXhhbXBsZToKKwl1c2JwaHk6IHBoeUAweDAxYzEzNDAwIHsKKwkJI3BoeS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXVzYi1waHkiOworCQkvKiBwaHkgYmFzZSByZWdzLCBwaHkxIHBtdSByZWcsIHBoeTIgcG11IHJlZyAqLworCQlyZWcgPSA8MHgwMWMxMzQwMCAweDEwIDB4MDFjMTQ4MDAgMHg0IDB4MDFjMWM4MDAgMHg0PjsKKwkJcmVnLW5hbWVzID0gInBoeV9jdHJsIiwgInBtdTEiLCAicG11MiI7CisJCWNsb2NrcyA9IDwmdXNiX2NsayA4PjsKKwkJY2xvY2stbmFtZXMgPSAidXNiX3BoeSI7CisJCXJlc2V0cyA9IDwmdXNiX2NsayAxPiwgPCZ1c2JfY2xrIDI+OworCQlyZXNldC1uYW1lcyA9ICJ1c2IxX3Jlc2V0IiwgInVzYjJfcmVzZXQiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3RpLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3RpLXBoeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4ZmIwZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvdGktcGh5LnR4dApAQCAtMCwwICsxLDg2IEBACitUSSBQSFk6IERUIERPQ1VNRU5UQVRJT04gRk9SIFBIWXMgaW4gVEkgUExBVEZPUk1zCisKK09NQVAgQ09OVFJPTCBQSFkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YKKyAidGksY29udHJvbC1waHktb3RnaHMiIC0gaWYgaXQgaGFzIG90Z2hzX2NvbnRyb2wgbWFpbGJveCByZWdpc3RlciBhcyBvbiBPTUFQNC4KKyAidGksY29udHJvbC1waHktdXNiMiIgLSBpZiBpdCBoYXMgUG93ZXIgZG93biBiaXQgaW4gY29udHJvbF9kZXZfY29uZiByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBVU0IyX1BIWSBvbiBPTUFQNS4KKyAidGksY29udHJvbC1waHktcGlwZTMiIC0gaWYgaXQgaGFzIERQTEwgYW5kIGluZGl2aWR1YWwgUnggJiBUeCBwb3dlciBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIFVTQjMgUEhZIGFuZCBTQVRBIFBIWSBvbiBPTUFQNS4KKyAidGksY29udHJvbC1waHktdXNiMi1kcmE3IiAtIGlmIGl0IGhhcyBwb3dlciBkb3duIHJlZ2lzdGVyIGxpa2UgVVNCMiBQSFkgb24KKyAgICAgICAgICAgICAgICAgICAgICAgIERSQTcgcGxhdGZvcm0uCisgInRpLGNvbnRyb2wtcGh5LXVzYjItYW00MzciIC0gaWYgaXQgaGFzIHBvd2VyIGRvd24gcmVnaXN0ZXIgbGlrZSBVU0IyIFBIWSBvbgorICAgICAgICAgICAgICAgICAgICAgICAgQU00MzcgcGxhdGZvcm0uCisgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4gSXQgY29udGFpbnMKKyAgIHRoZSBhZGRyZXNzIG9mICJvdGdoc19jb250cm9sIiBmb3IgY29udHJvbC1waHktb3RnaHMgb3IgInBvd2VyIiByZWdpc3RlcgorICAgZm9yIG90aGVyIHR5cGVzLgorIC0gcmVnLW5hbWVzOiBzaG91bGQgYmUgIm90Z2hzX2NvbnRyb2wiIGNvbnRyb2wtcGh5LW90Z2hzIGFuZCAicG93ZXIiIGZvcgorICAgb3RoZXIgdHlwZXMuCisKK29tYXBfY29udHJvbF91c2I6IG9tYXAtY29udHJvbC11c2JANGEwMDIzMDAgeworICAgICAgICBjb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LW90Z2hzIjsKKyAgICAgICAgcmVnID0gPDB4NGEwMDIzM2MgMHg0PjsKKyAgICAgICAgcmVnLW5hbWVzID0gIm90Z2hzX2NvbnRyb2wiOworfTsKKworT01BUCBVU0IyIFBIWQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxvbWFwLXVzYjIiCisgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KKyAtICNwaHktY2VsbHM6IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoYXQgc2hvdWxkIGJlIGdpdmVuIGluIHRoZQorICAgcGhhbmRsZSB3aGlsZSByZWZlcmVuY2luZyB0aGlzIHBoeS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGN0cmwtbW9kdWxlIDogcGhhbmRsZSBvZiB0aGUgY29udHJvbCBtb2R1bGUgdXNlZCBieSBQSFkgZHJpdmVyIHRvIHBvd2VyIG9uCisgICB0aGUgUEhZLgorCitUaGlzIGlzIHVzdWFsbHkgYSBzdWJub2RlIG9mIG9jcDJzY3AgdG8gd2hpY2ggaXQgaXMgY29ubmVjdGVkLgorCit1c2IycGh5QDRhMGFkMDgwIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXAtdXNiMiI7CisJcmVnID0gPDB4NGEwYWQwODAgMHg1OD47CisJY3RybC1tb2R1bGUgPSA8Jm9tYXBfY29udHJvbF91c2I+OworCSNwaHktY2VsbHMgPSA8MD47Cit9OworCitUSSBQSVBFMyBQSFkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSAidGkscGh5LXVzYjMiIG9yICJ0aSxwaHktcGlwZTMtc2F0YSIuCisgICAidGksb21hcC11c2IzIiBpcyBkZXByZWNhdGVkLgorIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuCisgLSByZWctbmFtZXM6IFRoZSBuYW1lcyBvZiB0aGUgcmVnaXN0ZXIgYWRkcmVzc2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVycworICAgZmlsbGVkIGluICJyZWciLgorIC0gI3BoeS1jZWxsczogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2VsbHMgdGhhdCBzaG91bGQgYmUgZ2l2ZW4gaW4gdGhlCisgICBwaGFuZGxlIHdoaWxlIHJlZmVyZW5jaW5nIHRoaXMgcGh5LgorIC0gY2xvY2tzOiBhIGxpc3Qgb2YgcGhhbmRsZXMgYW5kIGNsb2NrLXNwZWNpZmllciBwYWlycywgb25lIGZvciBlYWNoIGVudHJ5IGluCisgICBjbG9jay1uYW1lcy4KKyAtIGNsb2NrLW5hbWVzOiBzaG91bGQgaW5jbHVkZToKKyAgICogIndrdXBjbGsiIC0gd2FrZXVwIGNsb2NrLgorICAgKiAic3lzY2xrIiAtIHN5c3RlbSBjbG9jay4KKyAgICogInJlZmNsayIgLSByZWZlcmVuY2UgY2xvY2suCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBjdHJsLW1vZHVsZSA6IHBoYW5kbGUgb2YgdGhlIGNvbnRyb2wgbW9kdWxlIHVzZWQgYnkgUEhZIGRyaXZlciB0byBwb3dlciBvbgorICAgdGhlIFBIWS4KKworVGhpcyBpcyB1c3VhbGx5IGEgc3Vibm9kZSBvZiBvY3Ayc2NwIHRvIHdoaWNoIGl0IGlzIGNvbm5lY3RlZC4KKwordXNiM3BoeUA0YTA4NDQwMCB7CisJY29tcGF0aWJsZSA9ICJ0aSxwaHktdXNiMyI7CisJcmVnID0gPDB4NGEwODQ0MDAgMHg4MD4sCisJICAgICAgPDB4NGEwODQ4MDAgMHg2ND4sCisJICAgICAgPDB4NGEwODRjMDAgMHg0MD47CisJcmVnLW5hbWVzID0gInBoeV9yeCIsICJwaHlfdHgiLCAicGxsX2N0cmwiOworCWN0cmwtbW9kdWxlID0gPCZvbWFwX2NvbnRyb2xfdXNiPjsKKwkjcGh5LWNlbGxzID0gPDA+OworCWNsb2NrcyA9IDwmdXNiX3BoeV9jbV9jbGszMms+LAorCQkgPCZzeXNfY2xraW4+LAorCQkgPCZ1c2Jfb3RnX3NzX3JlZmNsazk2MG0+OworCWNsb2NrLW5hbWVzID0JIndrdXBjbGsiLAorCQkJInN5c2NsayIsCisJCQkicmVmY2xrIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzAtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzAtcGluY3RybC50eHQKaW5kZXggMDFlZjQwOC4uYWRkYTJhOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzcwLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM3MC1waW5jdHJsLnR4dApAQCAtNSw2ICs1LDcgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogIm1hcnZlbGwsODhmNjcxMC1waW5jdHJsIgorLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllciBvZiBNUFAgcmVnaXN0ZXJzCiAKIEF2YWlsYWJsZSBtcHAgcGlucy9ncm91cHMgYW5kIGZ1bmN0aW9uczoKIE5vdGU6IGJyYWNrZXRzICh4KSBhcmUgbm90IHBhcnQgb2YgdGhlIG1wcCBuYW1lIGZvciBtYXJ2ZWxsLGZ1bmN0aW9uIGFuZCBnaXZlbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzc1LXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzc1LXBpbmN0cmwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTBjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS0zNzUtcGluY3RybC50eHQKQEAgLTAsMCArMSw4MiBAQAorKiBNYXJ2ZWxsIEFybWFkYSAzNzUgU29DIHBpbmN0cmwgZHJpdmVyIGZvciBtcHAKKworUGxlYXNlIHJlZmVyIHRvIG1hcnZlbGwsbXZlYnUtcGluY3RybC50eHQgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIGNvbW1vbiBiaW5kaW5nCitwYXJ0IGFuZCB1c2FnZS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogIm1hcnZlbGwsODhmNjcyMC1waW5jdHJsIgorLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllciBvZiBNUFAgcmVnaXN0ZXJzCisKK0F2YWlsYWJsZSBtcHAgcGlucy9ncm91cHMgYW5kIGZ1bmN0aW9uczoKK05vdGU6IGJyYWNrZXRzICh4KSBhcmUgbm90IHBhcnQgb2YgdGhlIG1wcCBuYW1lIGZvciBtYXJ2ZWxsLGZ1bmN0aW9uIGFuZCBnaXZlbgorb25seSBmb3IgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBpbiB0aGlzIGRvY3VtZW50LgorCituYW1lICAgICAgICAgIHBpbnMgICAgIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK21wcDAgICAgICAgICAgMCAgICAgICAgZ3BpbywgZGV2KGFkMiksIHNwaTAoY3MxKSwgc3BpMShjczEpCittcHAxICAgICAgICAgIDEgICAgICAgIGdwaW8sIGRldihhZDMpLCBzcGkwKG1vc2kpLCBzcGkxKG1vc2kpCittcHAyICAgICAgICAgIDIgICAgICAgIGdwaW8sIGRldihhZDQpLCBwdHAoZXZlbnRyZXEpLCBsZWQoYzApLCBhdWRpbyhzZGkpCittcHAzICAgICAgICAgIDMgICAgICAgIGdwaW8sIGRldihhZDUpLCBwdHAodHJpZ2dlbiksIGxlZChwMyksIGF1ZGlvKG1jbGspCittcHA0ICAgICAgICAgIDQgICAgICAgIGdwaW8sIGRldihhZDYpLCBzcGkwKG1pc28pLCBzcGkxKG1pc28pCittcHA1ICAgICAgICAgIDUgICAgICAgIGdwaW8sIGRldihhZDcpLCBzcGkwKGNzMiksIHNwaTEoY3MyKQorbXBwNiAgICAgICAgICA2ICAgICAgICBncGlvLCBkZXYoYWQwKSwgbGVkKHAxKSwgYXVkaW8ocmNsaykKK21wcDcgICAgICAgICAgNyAgICAgICAgZ3BpbywgZGV2KGFkMSksIHB0cChjbGspLCBsZWQocDIpLCBhdWRpbyhleHRjbGspCittcHA4ICAgICAgICAgIDggICAgICAgIGdwaW8sIGRldiAoYm9vdGNzKSwgc3BpMChjczApLCBzcGkxKGNzMCkKK21wcDkgICAgICAgICAgOSAgICAgICAgZ3BpbywgbmYod2VuKSwgc3BpMChzY2spLCBzcGkxKHNjaykKK21wcDEwICAgICAgICAxMCAgICAgICAgZ3BpbywgbmYocmVuKSwgZHJhbSh2dHRjdHJsKSwgbGVkKGMxKQorbXBwMTEgICAgICAgIDExICAgICAgICBncGlvLCBkZXYoYTApLCBsZWQoYzIpLCBhdWRpbyhzZG8pCittcHAxMiAgICAgICAgMTIgICAgICAgIGdwaW8sIGRldihhMSksIGF1ZGlvKGJjbGspCittcHAxMyAgICAgICAgMTMgICAgICAgIGdwaW8sIGRldihyZWFkeW4pLCBwY2llMChyc3RvdXRuKSwgcGNpZTEocnN0b3V0bikKK21wcDE0ICAgICAgICAxNCAgICAgICAgZ3BpbywgaTJjMChzZGEpLCB1YXJ0MSh0eGQpCittcHAxNSAgICAgICAgMTUgICAgICAgIGdwaW8sIGkyYzAoc2NrKSwgdWFydDEocnhkKQorbXBwMTYgICAgICAgIDE2ICAgICAgICBncGlvLCB1YXJ0MCh0eGQpCittcHAxNyAgICAgICAgMTcgICAgICAgIGdwaW8sIHVhcnQwKHJ4ZCkKK21wcDE4ICAgICAgICAxOCAgICAgICAgZ3BpbywgdGRtKGludG4pCittcHAxOSAgICAgICAgMTkgICAgICAgIGdwaW8sIHRkbShyc3RuKQorbXBwMjAgICAgICAgIDIwICAgICAgICBncGlvLCB0ZG0ocGNsaykKK21wcDIxICAgICAgICAyMSAgICAgICAgZ3BpbywgdGRtKGZzeW5jKQorbXBwMjIgICAgICAgIDIyICAgICAgICBncGlvLCB0ZG0oZHJ4KQorbXBwMjMgICAgICAgIDIzICAgICAgICBncGlvLCB0ZG0oZHR4KQorbXBwMjQgICAgICAgIDI0ICAgICAgICBncGlvLCBsZWQocDApLCBnZTEocnhkMCksIHNkKGNtZCksIHVhcnQwKHJ0cykKK21wcDI1ICAgICAgICAyNSAgICAgICAgZ3BpbywgbGVkKHAyKSwgZ2UxKHJ4ZDEpLCBzZChkMCksIHVhcnQwKGN0cykKK21wcDI2ICAgICAgICAyNiAgICAgICAgZ3BpbywgcGNpZTAoY2xrcmVxKSwgZ2UxKHJ4ZDIpLCBzZChkMiksIHVhcnQxKHJ0cykKK21wcDI3ICAgICAgICAyNyAgICAgICAgZ3BpbywgcGNpZTEoY2xrcmVxKSwgZ2UxKHJ4ZDMpLCBzZChkMSksIHVhcnQxKGN0cykKK21wcDI4ICAgICAgICAyOCAgICAgICAgZ3BpbywgbGVkKHAzKSwgZ2UxKHR4Y3RsKSwgc2QoY2xrKQorbXBwMjkgICAgICAgIDI5ICAgICAgICBncGlvLCBwY2llMShjbGtyZXEpLCBnZTEocnhjbGspLCBzZChkMykKK21wcDMwICAgICAgICAzMCAgICAgICAgZ3BpbywgZ2UxKHR4ZDApLCBzcGkxKGNzMCkKK21wcDMxICAgICAgICAzMSAgICAgICAgZ3BpbywgZ2UxKHR4ZDEpLCBzcGkxKG1vc2kpCittcHAzMiAgICAgICAgMzIgICAgICAgIGdwaW8sIGdlMSh0eGQyKSwgc3BpMShzY2spLCBwdHAodHJpZ2dlbikKK21wcDMzICAgICAgICAzMyAgICAgICAgZ3BpbywgZ2UxKHR4ZDMpLCBzcGkxKG1pc28pCittcHAzNCAgICAgICAgMzQgICAgICAgIGdwaW8sIGdlMSh0eGNsa291dCksIHNwaTEoc2NrKQorbXBwMzUgICAgICAgIDM1ICAgICAgICBncGlvLCBnZTEocnhjdGwpLCBzcGkxKGNzMSksIHNwaTAoY3MyKQorbXBwMzYgICAgICAgIDM2ICAgICAgICBncGlvLCBwY2llMChjbGtyZXEpCittcHAzNyAgICAgICAgMzcgICAgICAgIGdwaW8sIHBjaWUwKGNsa3JlcSksIHRkbShpbnRuKSwgZ2UobWRjKQorbXBwMzggICAgICAgIDM4ICAgICAgICBncGlvLCBwY2llMShjbGtyZXEpLCBnZShtZGlvKQorbXBwMzkgICAgICAgIDM5ICAgICAgICBncGlvLCByZWYoY2xrb3V0KQorbXBwNDAgICAgICAgIDQwICAgICAgICBncGlvLCB1YXJ0MSh0eGQpCittcHA0MSAgICAgICAgNDEgICAgICAgIGdwaW8sIHVhcnQxKHJ4ZCkKK21wcDQyICAgICAgICA0MiAgICAgICAgZ3Bpbywgc3BpMShjczIpLCBsZWQoYzApCittcHA0MyAgICAgICAgNDMgICAgICAgIGdwaW8sIHNhdGEwKHByc250KSwgZHJhbSh2dHRjdHJsKQorbXBwNDQgICAgICAgIDQ0ICAgICAgICBncGlvLCBzYXRhMChwcnNudCkKK21wcDQ1ICAgICAgICA0NSAgICAgICAgZ3Bpbywgc3BpMChjczIpLCBwY2llMChyc3RvdXRuKQorbXBwNDYgICAgICAgIDQ2ICAgICAgICBncGlvLCBsZWQocDApLCBnZTAodHhkMCksIGdlMSh0eGQwKQorbXBwNDcgICAgICAgIDQ3ICAgICAgICBncGlvLCBsZWQocDEpLCBnZTAodHhkMSksIGdlMSh0eGQxKQorbXBwNDggICAgICAgIDQ4ICAgICAgICBncGlvLCBsZWQocDIpLCBnZTAodHhkMiksIGdlMSh0eGQyKQorbXBwNDkgICAgICAgIDQ5ICAgICAgICBncGlvLCBsZWQocDMpLCBnZTAodHhkMyksIGdlMSh0eGQzKQorbXBwNTAgICAgICAgIDUwICAgICAgICBncGlvLCBsZWQoYzApLCBnZTAocnhkMCksIGdlMShyeGQwKQorbXBwNTEgICAgICAgIDUxICAgICAgICBncGlvLCBsZWQoYzEpLCBnZTAocnhkMSksIGdlMShyeGQxKQorbXBwNTIgICAgICAgIDUyICAgICAgICBncGlvLCBsZWQoYzIpLCBnZTAocnhkMiksIGdlMShyeGQyKQorbXBwNTMgICAgICAgIDUzICAgICAgICBncGlvLCBwY2llMShyc3RvdXRuKSwgZ2UwKHJ4ZDMpLCBnZTEocnhkMykKK21wcDU0ICAgICAgICA1NCAgICAgICAgZ3BpbywgcGNpZTAocnN0b3V0biksIGdlMChyeGN0bCksIGdlMShyeGN0bCkKK21wcDU1ICAgICAgICA1NSAgICAgICAgZ3BpbywgZ2UwKHJ4Y2xrKSwgZ2UxKHJ4Y2xrKQorbXBwNTYgICAgICAgIDU2ICAgICAgICBncGlvLCBnZTAodHhjbGtvdXQpLCBnZTEodHhjbGtvdXQpCittcHA1NyAgICAgICAgNTcgICAgICAgIGdwaW8sIGdlMCh0eGN0bCksIGdlMSh0eGN0bCkKK21wcDU4ICAgICAgICA1OCAgICAgICAgZ3BpbywgbGVkKGMwKQorbXBwNTkgICAgICAgIDU5ICAgICAgICBncGlvLCBsZWQoYzEpCittcHA2MCAgICAgICAgNjAgICAgICAgIGdwaW8sIHVhcnQxKHR4ZCksIGxlZChjMikKK21wcDYxICAgICAgICA2MSAgICAgICAgZ3BpbywgaTJjMShzZGEpLCB1YXJ0MShyeGQpLCBzcGkxKGNzMiksIGxlZChwMCkKK21wcDYyICAgICAgICA2MiAgICAgICAgZ3BpbywgaTJjMShzY2spLCBsZWQocDEpCittcHA2MyAgICAgICAgNjMgICAgICAgIGdwaW8sIHB0cCh0cmlnZ2VuKSwgbGVkKHAyKQorbXBwNjQgICAgICAgIDY0ICAgICAgICBncGlvLCBkcmFtKHZ0dGN0cmwpLCBsZWQocDMpCittcHA2NSAgICAgICAgNjUgICAgICAgIGdwaW8sIHNhdGExKHByc250KQorbXBwNjYgICAgICAgIDY2ICAgICAgICBncGlvLCBwdHAoZXZlbnRyZXEpLCBzcGkxKGNzMykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM4eC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM4eC1waW5jdHJsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdjOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzh4LXBpbmN0cmwudHh0CkBAIC0wLDAgKzEsODAgQEAKKyogTWFydmVsbCBBcm1hZGEgMzgwLzM4NSBTb0MgcGluY3RybCBkcml2ZXIgZm9yIG1wcAorCitQbGVhc2UgcmVmZXIgdG8gbWFydmVsbCxtdmVidS1waW5jdHJsLnR4dCBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgY29tbW9uIGJpbmRpbmcKK3BhcnQgYW5kIHVzYWdlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibWFydmVsbCw4OGY2ODEwLXBpbmN0cmwiLCAibWFydmVsbCw4OGY2ODIwLXBpbmN0cmwiIG9yCisgICJtYXJ2ZWxsLDg4ZjY4MjgtcGluY3RybCIgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZQorICBTb0MgYmVpbmcgdXNlZC4KKy0gcmVnOiByZWdpc3RlciBzcGVjaWZpZXIgb2YgTVBQIHJlZ2lzdGVycworCitBdmFpbGFibGUgbXBwIHBpbnMvZ3JvdXBzIGFuZCBmdW5jdGlvbnM6CitOb3RlOiBicmFja2V0cyAoeCkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtcHAgbmFtZSBmb3IgbWFydmVsbCxmdW5jdGlvbiBhbmQgZ2l2ZW4KK29ubHkgZm9yIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gaW4gdGhpcyBkb2N1bWVudC4KKworbmFtZSAgICAgICAgICBwaW5zICAgICBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CittcHAwICAgICAgICAgIDAgICAgICAgIGdwaW8sIHVhMChyeGQpCittcHAxICAgICAgICAgIDEgICAgICAgIGdwaW8sIHVhMCh0eGQpCittcHAyICAgICAgICAgIDIgICAgICAgIGdwaW8sIGkyYzAoc2NrKQorbXBwMyAgICAgICAgICAzICAgICAgICBncGlvLCBpMmMwKHNkYSkKK21wcDQgICAgICAgICAgNCAgICAgICAgZ3BpbywgZ2UobWRjKSwgdWExKHR4ZCksIHVhMChydHMpCittcHA1ICAgICAgICAgIDUgICAgICAgIGdwaW8sIGdlKG1kaW8pLCB1YTEocnhkKSwgdWEwKGN0cykKK21wcDYgICAgICAgICAgNiAgICAgICAgZ3BpbywgZ2UwKHR4Y2xrb3V0KSwgZ2UwKGNycyksIGRldihjczMpCittcHA3ICAgICAgICAgIDcgICAgICAgIGdwaW8sIGdlMCh0eGQwKSwgZGV2KGFkOSkKK21wcDggICAgICAgICAgOCAgICAgICAgZ3BpbywgZ2UwKHR4ZDEpLCBkZXYoYWQxMCkKK21wcDkgICAgICAgICAgOSAgICAgICAgZ3BpbywgZ2UwKHR4ZDIpLCBkZXYoYWQxMSkKK21wcDEwICAgICAgICAgMTAgICAgICAgZ3BpbywgZ2UwKHR4ZDMpLCBkZXYoYWQxMikKK21wcDExICAgICAgICAgMTEgICAgICAgZ3BpbywgZ2UwKHR4Y3RsKSwgZGV2KGFkMTMpCittcHAxMiAgICAgICAgIDEyICAgICAgIGdwaW8sIGdlMChyeGQwKSwgcGNpZTAocnN0b3V0KSwgcGNpZTEocnN0b3V0KSBbMV0sIHNwaTAoY3MxKSwgZGV2KGFkMTQpCittcHAxMyAgICAgICAgIDEzICAgICAgIGdwaW8sIGdlMChyeGQxKSwgcGNpZTAoY2xrcmVxKSwgcGNpZTEoY2xrcmVxKSBbMV0sIHNwaTAoY3MyKSwgZGV2KGFkMTUpCittcHAxNCAgICAgICAgIDE0ICAgICAgIGdwaW8sIGdlMChyeGQyKSwgcHRwKGNsayksIG0odnR0X2N0cmwpLCBzcGkwKGNzMyksIGRldih3ZW4xKQorbXBwMTUgICAgICAgICAxNSAgICAgICBncGlvLCBnZTAocnhkMyksIGdlKG1kYyBzbGF2ZSksIHBjaWUwKHJzdG91dCksIHNwaTAobW9zaSksIHBjaWUxKHJzdG91dCkgWzFdCittcHAxNiAgICAgICAgIDE2ICAgICAgIGdwaW8sIGdlMChyeGN0bCksIGdlKG1kaW8gc2xhdmUpLCBtKGRlY2NfZXJyKSwgc3BpMChtaXNvKSwgcGNpZTAoY2xrcmVxKQorbXBwMTcgICAgICAgICAxNyAgICAgICBncGlvLCBnZTAocnhjbGspLCBwdHAoY2xrKSwgdWExKHJ4ZCksIHNwaTAoc2NrKSwgc2F0YTEocHJzbnQpCittcHAxOCAgICAgICAgIDE4ICAgICAgIGdwaW8sIGdlMChyeGVyciksIHB0cCh0cmlnX2dlbiksIHVhMSh0eGQpLCBzcGkwKGNzMCksIHBjaWUxKHJzdG91dCkgWzFdCittcHAxOSAgICAgICAgIDE5ICAgICAgIGdwaW8sIGdlMChjb2wpLCBwdHAoZXZlbnRfcmVxKSwgcGNpZTAoY2xrcmVxKSwgc2F0YTEocHJzbnQpLCB1YTAoY3RzKQorbXBwMjAgICAgICAgICAyMCAgICAgICBncGlvLCBnZTAodHhjbGspLCBwdHAoY2xrKSwgcGNpZTEocnN0b3V0KSBbMV0sIHNhdGEwKHByc250KSwgdWEwKHJ0cykKK21wcDIxICAgICAgICAgMjEgICAgICAgZ3Bpbywgc3BpMChjczEpLCBnZTEocnhkMCksIHNhdGEwKHByc250KSwgc2QwKGNtZCksIGRldihib290Y3MpCittcHAyMiAgICAgICAgIDIyICAgICAgIGdwaW8sIHNwaTAobW9zaSksIGRldihhZDApCittcHAyMyAgICAgICAgIDIzICAgICAgIGdwaW8sIHNwaTAoc2NrKSwgZGV2KGFkMikKK21wcDI0ICAgICAgICAgMjQgICAgICAgZ3Bpbywgc3BpMChtaXNvKSwgdWEwKGN0cyksIHVhMShyeGQpLCBzZDAoZDQpLCBkZXYocmVhZHkpCittcHAyNSAgICAgICAgIDI1ICAgICAgIGdwaW8sIHNwaTAoY3MwKSwgdWEwKHJ0cyksIHVhMSh0eGQpLCBzZDAoZDUpLCBkZXYoY3MwKQorbXBwMjYgICAgICAgICAyNiAgICAgICBncGlvLCBzcGkwKGNzMiksIGkyYzEoc2NrKSwgc2QwKGQ2KSwgZGV2KGNzMSkKK21wcDI3ICAgICAgICAgMjcgICAgICAgZ3Bpbywgc3BpMChjczMpLCBnZTEodHhjbGtvdXQpLCBpMmMxKHNkYSksIHNkMChkNyksIGRldihjczIpCittcHAyOCAgICAgICAgIDI4ICAgICAgIGdwaW8sIGdlMSh0eGQwKSwgc2QwKGNsayksIGRldihhZDUpCittcHAyOSAgICAgICAgIDI5ICAgICAgIGdwaW8sIGdlMSh0eGQxKSwgZGV2KGFsZTApCittcHAzMCAgICAgICAgIDMwICAgICAgIGdwaW8sIGdlMSh0eGQyKSwgZGV2KG9lbikKK21wcDMxICAgICAgICAgMzEgICAgICAgZ3BpbywgZ2UxKHR4ZDMpLCBkZXYoYWxlMSkKK21wcDMyICAgICAgICAgMzIgICAgICAgZ3BpbywgZ2UxKHR4Y3RsKSwgZGV2KHdlbjApCittcHAzMyAgICAgICAgIDMzICAgICAgIGdwaW8sIG0oZGVjY19lcnIpLCBkZXYoYWQzKQorbXBwMzQgICAgICAgICAzNCAgICAgICBncGlvLCBkZXYoYWQxKQorbXBwMzUgICAgICAgICAzNSAgICAgICBncGlvLCByZWYoY2xrX291dDEpLCBkZXYoYTEpCittcHAzNiAgICAgICAgIDM2ICAgICAgIGdwaW8sIHB0cCh0cmlnX2dlbiksIGRldihhMCkKK21wcDM3ICAgICAgICAgMzcgICAgICAgZ3BpbywgcHRwKGNsayksIGdlMShyeGNsayksIHNkMChkMyksIGRldihhZDgpCittcHAzOCAgICAgICAgIDM4ICAgICAgIGdwaW8sIHB0cChldmVudF9yZXEpLCBnZTEocnhkMSksIHJlZihjbGtfb3V0MCksIHNkMChkMCksIGRldihhZDQpCittcHAzOSAgICAgICAgIDM5ICAgICAgIGdwaW8sIGkyYzEoc2NrKSwgZ2UxKHJ4ZDIpLCB1YTAoY3RzKSwgc2QwKGQxKSwgZGV2KGEyKQorbXBwNDAgICAgICAgICA0MCAgICAgICBncGlvLCBpMmMxKHNkYSksIGdlMShyeGQzKSwgdWEwKHJ0cyksIHNkMChkMiksIGRldihhZDYpCittcHA0MSAgICAgICAgIDQxICAgICAgIGdwaW8sIHVhMShyeGQpLCBnZTEocnhjdGwpLCB1YTAoY3RzKSwgc3BpMShjczMpLCBkZXYoYnVyc3QvbGFzdCkKK21wcDQyICAgICAgICAgNDIgICAgICAgZ3BpbywgdWExKHR4ZCksIHVhMChydHMpLCBkZXYoYWQ3KQorbXBwNDMgICAgICAgICA0MyAgICAgICBncGlvLCBwY2llMChjbGtyZXEpLCBtKHZ0dF9jdHJsKSwgbShkZWNjX2VyciksIHBjaWUwKHJzdG91dCksIGRldihjbGtvdXQpCittcHA0NCAgICAgICAgIDQ0ICAgICAgIGdwaW8sIHNhdGEwKHByc250KSwgc2F0YTEocHJzbnQpLCBzYXRhMihwcnNudCkgWzJdLCBzYXRhMyhwcnNudCkgWzNdLCBwY2llMChyc3RvdXQpCittcHA0NSAgICAgICAgIDQ1ICAgICAgIGdwaW8sIHJlZihjbGtfb3V0MCksIHBjaWUwKHJzdG91dCksIHBjaWUxKHJzdG91dCkgWzFdLCBwY2llMihyc3RvdXQpLCBwY2llMyhyc3RvdXQpCittcHA0NiAgICAgICAgIDQ2ICAgICAgIGdwaW8sIHJlZihjbGtfb3V0MSksIHBjaWUwKHJzdG91dCksIHBjaWUxKHJzdG91dCkgWzFdLCBwY2llMihyc3RvdXQpLCBwY2llMyhyc3RvdXQpCittcHA0NyAgICAgICAgIDQ3ICAgICAgIGdwaW8sIHNhdGEwKHByc250KSwgc2F0YTEocHJzbnQpLCBzYXRhMihwcnNudCkgWzJdLCBzcGkxKGNzMiksIHNhdGEzKHByc250KSBbMl0KK21wcDQ4ICAgICAgICAgNDggICAgICAgZ3Bpbywgc2F0YTAocHJzbnQpLCBtKHZ0dF9jdHJsKSwgdGRtMmMocGNsayksIGF1ZGlvKG1jbGspLCBzZDAoZDQpCittcHA0OSAgICAgICAgIDQ5ICAgICAgIGdwaW8sIHNhdGEyKHByc250KSBbMl0sIHNhdGEzKHByc250KSBbMl0sIHRkbTJjKGZzeW5jKSwgYXVkaW8obHJjbGspLCBzZDAoZDUpCittcHA1MCAgICAgICAgIDUwICAgICAgIGdwaW8sIHBjaWUwKHJzdG91dCksIHBjaWUxKHJzdG91dCkgWzFdLCB0ZG0yYyhkcngpLCBhdWRpbyhleHRjbGspLCBzZDAoY21kKQorbXBwNTEgICAgICAgICA1MSAgICAgICBncGlvLCB0ZG0yYyhkdHgpLCBhdWRpbyhzZG8pLCBtKGRlY2NfZXJyKQorbXBwNTIgICAgICAgICA1MiAgICAgICBncGlvLCBwY2llMChyc3RvdXQpLCBwY2llMShyc3RvdXQpIFsxXSwgdGRtMmMoaW50biksIGF1ZGlvKHNkaSksIHNkMChkNikKK21wcDUzICAgICAgICAgNTMgICAgICAgZ3Bpbywgc2F0YTEocHJzbnQpLCBzYXRhMChwcnNudCksIHRkbTJjKHJzdG4pLCBhdWRpbyhiY2xrKSwgc2QwKGQ3KQorbXBwNTQgICAgICAgICA1NCAgICAgICBncGlvLCBzYXRhMChwcnNudCksIHNhdGExKHByc250KSwgcGNpZTAocnN0b3V0KSwgcGNpZTEocnN0b3V0KSBbMV0sIHNkMChkMykKK21wcDU1ICAgICAgICAgNTUgICAgICAgZ3BpbywgdWExKGN0cyksIGdlKG1kaW8pLCBwY2llMShjbGtyZXEpIFsxXSwgc3BpMShjczEpLCBzZDAoZDApCittcHA1NiAgICAgICAgIDU2ICAgICAgIGdwaW8sIHVhMShydHMpLCBnZShtZGMpLCBtKGRlY2NfZXJyKSwgc3BpMShtb3NpKQorbXBwNTcgICAgICAgICA1NyAgICAgICBncGlvLCBzcGkxKHNjayksIHNkMChjbGspCittcHA1OCAgICAgICAgIDU4ICAgICAgIGdwaW8sIHBjaWUxKGNsa3JlcSkgWzFdLCBpMmMxKHNjayksIHBjaWUyKGNsa3JlcSksIHNwaTEobWlzbyksIHNkMChkMSkKK21wcDU5ICAgICAgICAgNTkgICAgICAgZ3BpbywgcGNpZTAocnN0b3V0KSwgaTJjMShzZGEpLCBwY2llMShyc3RvdXQpIFsxXSwgc3BpMShjczApLCBzZDAoZDIpCisKK1sxXTogb25seSBhdmFpbGFibGUgb24gODhGNjgyMCBhbmQgODhGNjgyOAorWzJdOiBvbmx5IGF2YWlsYWJsZSBvbiA4OEY2ODI4CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS14cC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLXhwLXBpbmN0cmwudHh0CmluZGV4IGJmYTBhMmUuLjM3M2RiY2NkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS14cC1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGFybWFkYS14cC1waW5jdHJsLnR4dApAQCAtNiw2ICs2LDcgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6ICJtYXJ2ZWxsLG12NzgyMzAtcGluY3RybCIsICJtYXJ2ZWxsLG12NzgyNjAtcGluY3RybCIsCiAgICAgICAgICAgICAgICJtYXJ2ZWxsLG12Nzg0NjAtcGluY3RybCIKKy0gcmVnOiByZWdpc3RlciBzcGVjaWZpZXIgb2YgTVBQIHJlZ2lzdGVycwogCiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwgQXJtYWRhIFhQIHZhcmlhbnRzLCBpLmUuIG12NzgyMzAsIG12NzgyNjAsIGFuZCBtdjc4NDYwLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGRvdmUtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGRvdmUtcGluY3RybC50eHQKaW5kZXggNTBlYzM1MS4uY2Y1MjQ3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxkb3ZlLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsZG92ZS1waW5jdHJsLnR4dApAQCAtNiw2ICs2LDcgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6ICJtYXJ2ZWxsLGRvdmUtcGluY3RybCIKIC0gY2xvY2tzOiAob3B0aW9uYWwpIHBoYW5kbGUgb2YgcGRtYSBjbG9jaworLSByZWc6IHJlZ2lzdGVyIHNwZWNpZmllcnMgb2YgTVBQLCBNUFA0LCBhbmQgUE1VIE1QUCByZWdpc3RlcnMKIAogQXZhaWxhYmxlIG1wcCBwaW5zL2dyb3VwcyBhbmQgZnVuY3Rpb25zOgogTm90ZTogYnJhY2tldHMgKHgpIGFyZSBub3QgcGFydCBvZiB0aGUgbXBwIG5hbWUgZm9yIG1hcnZlbGwsZnVuY3Rpb24gYW5kIGdpdmVuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGtpcmt3b29kLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxraXJrd29vZC1waW5jdHJsLnR4dAppbmRleCA5NWRhZjYzLi43MzA0NDRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLGtpcmt3b29kLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsa2lya3dvb2QtcGluY3RybC50eHQKQEAgLTgsNiArOCw3IEBACiAgICAgICAgICAgICAgICJtYXJ2ZWxsLDg4ZjYxOTAtcGluY3RybCIsICJtYXJ2ZWxsLDg4ZjYxOTItcGluY3RybCIsCiAgICAgICAgICAgICAgICJtYXJ2ZWxsLDg4ZjYyODEtcGluY3RybCIsICJtYXJ2ZWxsLDg4ZjYyODItcGluY3RybCIKICAgICAgICAgICAgICAgIm1hcnZlbGwsOThkeDQxMjItcGluY3RybCIKKy0gcmVnOiByZWdpc3RlciBzcGVjaWZpZXIgb2YgTVBQIHJlZ2lzdGVycwogCiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwga2lya3dvb2QgdmFyaWFudHMsIGkuZS4gODhmNjE4MCwgODhmNjE5eCwgYW5kIDg4ZjYyOHguCiBJdCBhbHNvIHN1cHBvcnQgdGhlIDg4ZjYyODEtYmFzZWQgdmFyaWFudCBpbiB0aGUgOThkeDQxMnggQm9iY2F0IFNvQ3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLG12ZWJ1LXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxtdmVidS1waW5jdHJsLnR4dAppbmRleCAwYTI2YzNhLi4wYzA5ZjRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tYXJ2ZWxsLG12ZWJ1LXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsbXZlYnUtcGluY3RybC50eHQKQEAgLTM3LDcgKzM3LDcgQEAKIAogcGluY3RybDogcGluY3RybEBkMDIwMCB7CiAJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGRvdmUtcGluY3RybCI7Ci0JcmVnID0gPDB4ZDAyMDAgMHgyMD47CisJcmVnID0gPDB4ZDAyMDAgMHgxND4sIDwweGQwNDQwIDB4MDQ+LCA8MHhkODAyYyAweDA4PjsKIAogCXBteF91YXJ0MV9zdzogcG14LXVhcnQxLXN3IHsKIAkJbWFydmVsbCxwaW5zID0gIm1wcF91YXJ0MSI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXNpbmdsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXNpbmdsZS50eHQKaW5kZXggYmMwZGZkZi4uNjZkY2FhOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zaW5nbGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLnR4dApAQCAtNjMsNiArNjMsMTMgQEAKIAkJLyogaW5wdXQsIGVuYWJsZSBiaXRzLCBkaXNhYmxlIGJpdHMsIG1hc2sgKi8KIAkJcGluY3RybC1zaW5nbGUsaW5wdXQtc2NobWl0dC1lbmFibGUgPSA8MHgzMCAweDQwIDAgMHg3MD47CiAKKy0gcGluY3RybC1zaW5nbGUsbG93LXBvd2VyLW1vZGUgOiBhcnJheSBvZiB2YWx1ZSB0aGF0IGFyZSB1c2VkIHRvIGNvbmZpZ3VyZQorICBsb3cgcG93ZXIgbW9kZSBvZiB0aGlzIHBpbi4gRm9yIHNvbWUgc2lsaWNvbnMsIHRoZSBsb3cgcG93ZXIgbW9kZSB3aWxsCisgIGNvbnRyb2wgdGhlIG91dHB1dCBvZiB0aGUgcGluIHdoZW4gdGhlIHBhZCBpbmNsdWRpbmcgdGhlIHBpbiBlbnRlciBsb3cKKyAgcG93ZXIgbW9kZS4KKwkJLyogbG93IHBvd2VyIG1vZGUgdmFsdWUsIG1hc2sgKi8KKwkJcGluY3RybC1zaW5nbGUsbG93LXBvd2VyLW1vZGUgPSA8MHgyODggMHgzODg+OworCiAtIHBpbmN0cmwtc2luZ2xlLGdwaW8tcmFuZ2UgOiBsaXN0IG9mIHZhbHVlIHRoYXQgYXJlIHVzZWQgdG8gY29uZmlndXJlIGEgR1BJTwogICByYW5nZS4gVGhleSdyZSB2YWx1ZSBvZiBzdWJub2RlIHBoYW5kbGUsIHBpbiBiYXNlIGluIHBpbmN0cmwgZGV2aWNlLCBwaW4KICAgbnVtYmVyIGluIHRoaXMgcmFuZ2UsIEdQSU8gZnVuY3Rpb24gdmFsdWUgb2YgdGhpcyBHUElPIHJhbmdlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAppbmRleCAwNWJmODJhLi40YmQ1YmUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dApAQCAtMTEsMTggKzExLDY4IEBACiBTVCBwaW5jdHJsIGRyaXZlciBjb250cm9scyBQSU8gbXVsdGlwbGV4aW5nIGJsb2NrIGFuZCBhbHNvIGludGVyYWN0cyB3aXRoCiBncGlvIGRyaXZlciB0byBjb25maWd1cmUgYSBwaW4uCiAKLVJlcXVpcmVkIHByb3BlcnRpZXM6IChQSU8gbXVsdGlwbGV4aW5nIGJsb2NrKQorR1BJTyBiYW5rIGNhbiBoYXZlIG9uZSBvZiB0aGUgdHdvIHBvc3NpYmxlIHR5cGVzIG9mIGludGVycnVwdC13aXJpbmdzLgorCitGaXJzdCB0eXBlIGlzIHZpYSBpcnFtdXgsIHNpbmdsZSBpbnRlcnJ1cHQgaXMgdXNlZCBieSBtdWx0aXBsZSBncGlvIGJhbmtzLiBUaGlzCityZWR1Y2VzIG51bWJlciBvZiBvdmVyYWxsIGludGVycnVwdHMgbnVtYmVycyByZXF1aXJlZC4gQWxsIHRoZXNlIGJhbmtzIGJlbG9uZyB0bworYSBzaW5nbGUgcGluY29udHJvbGxlci4KKwkJICBfX19fX19fX18KKwkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4pICAgIF0KKwkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAxKV0KKwlbaXJxTl0tLSB8IGlycS1tdXggfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAyKV0KKwkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKC4uLiAgKV0KKwkJIHxfX19fX19fX198LS0tLT4gW2dwaW8tYmFuayAobiArIDcpXQorCitTZWNvbmQgdHlwZSBoYXMgYSBkZWRpY2F0ZWQgaW50ZXJydXB0IHBlciBncGlvIGJhbmsuCisKKwlbaXJxTl0tLS0tPiBbZ3Bpby1iYW5rIChuKV0KKworCitQaW4gY29udHJvbGxlciBub2RlOgorUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZQk6IHNob3VsZCBiZSAic3QsPFNPQz4tPHBpby1ibG9jaz4tcGluY3RybCIKIAlsaWtlIHN0LHN0aWg0MTUtc2JjLXBpbmN0cmwsIHN0LHN0aWg0MTUtZnJvbnQtcGluY3RybCBhbmQgc28gb24uCi0tIGdwaW8tY29udHJvbGxlciA6IEluZGljYXRlcyB0aGlzIGRldmljZSBpcyBhIEdQSU8gY29udHJvbGxlcgotLSAjZ3Bpby1jZWxscwkgIDogU2hvdWxkIGJlIG9uZS4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIuCistIHN0LHN5c2NmZwkJOiBTaG91bGQgYmUgYSBwaGFuZGxlIG9mIHRoZSBzeXNjZmcgbm9kZS4KIC0gc3QscmV0aW1lLXBpbi1tYXNrCTogU2hvdWxkIGJlIG1hc2sgdG8gc3BlY2lmeSB3aGljaCBwaW5zIGNhbiBiZSByZXRpbWVkLgogCUlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCB0aGUgcGlucyBpbiB0aGUKIAliYW5rIGFyZSBjYXBhYmxlIG9mIHJldGltaW5nLiBSZXRpbWluZyBpcyBtYWlubHkgdXNlZCB0byBpbXByb3ZlIHRoZQogCUlPIHRpbWluZyBtYXJnaW5zIG9mIGV4dGVybmFsIHN5bmNocm9ub3VzIGludGVyZmFjZXMuCi0tIHN0LGJhbmstbmFtZQkJOiBTaG91bGQgYmUgYSBuYW1lIHN0cmluZyBmb3IgdGhpcyBiYW5rIGFzCi0JCQlzcGVjaWZpZWQgaW4gZGF0YXNoZWV0LgotLSBzdCxzeXNjZmcJCTogU2hvdWxkIGJlIGEgcGhhbmRsZSBvZiB0aGUgc3lzY2ZnIG5vZGUuCistIHJhbmdlcyA6IGRlZmluZXMgbWFwcGluZyBiZXR3ZWVuIHBpbiBjb250cm9sbGVyIG5vZGUgKHBhcmVudCkgdG8gZ3Bpby1iYW5rCisgIG5vZGUgKGNoaWxkcmVuKS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gaW50ZXJydXB0cwk6IEludGVycnVwdCBudW1iZXIgb2YgdGhlIGlycW11eC4gSWYgdGhlIGludGVycnVwdCBpcyBzaGFyZWQKKyAgd2l0aCBvdGhlciBncGlvIGJhbmtzIHZpYSBpcnFtdXguCisgIGEgaXJxbGluZSBhbmQgZ3BpbyBiYW5rcy4KKy0gcmVnCQk6IGlycW11eCBtZW1vcnkgcmVzb3VyY2UuIElmIGlycW11eCBpcyBwcmVzZW50LgorLSByZWctbmFtZXMJOiBpcnFtdXggcmVzb3VyY2Ugc2hvdWxkIGJlIG5hbWVkIGFzICJpcnFtdXgiLgorCitHUElPIGNvbnRyb2xsZXIvYmFuayBub2RlLgorUmVxdWlyZWQgcHJvcGVydGllczoKKy0gZ3Bpby1jb250cm9sbGVyIDogSW5kaWNhdGVzIHRoaXMgZGV2aWNlIGlzIGEgR1BJTyBjb250cm9sbGVyCistICNncGlvLWNlbGxzCSAgOiBTaG91bGQgYmUgb25lLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlci4KKy0gc3QsYmFuay1uYW1lCSAgOiBTaG91bGQgYmUgYSBuYW1lIHN0cmluZyBmb3IgdGhpcyBiYW5rIGFzIHNwZWNpZmllZCBpbgorICBkYXRhc2hlZXQuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGludGVycnVwdHMJOiBJbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGlzIGdwaW8gYmFuay4gSWYgdGhlcmUgaXMgYSBkZWRpY2F0ZWQKKyAgaW50ZXJydXB0IHdpcmVkIHVwIGZvciB0aGlzIGdwaW8gYmFuay4KKworLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6IEluZGljYXRlcyB0aGlzIGRldmljZSBpcyBhIGludGVycnVwdCBjb250cm9sbGVyLiBHUElPCisgIGJhbmsgY2FuIGJlIGFuIGludGVycnVwdCBjb250cm9sbGVyIGlmZiBvbmUgb2YgdGhlIGludGVycnVwdCB0eXBlIGVpdGhlciB2aWEKK2lycW11eCBvciBhIGRlZGljYXRlZCBpbnRlcnJ1cHQgcGVyIGJhbmsgaXMgc3BlY2lmaWVkLgorCistICNpbnRlcnJ1cHQtY2VsbHM6IHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSAyLgorICAgICAtIEZpcnN0IENlbGw6IHJlcHJlc2VudHMgdGhlIGV4dGVybmFsIGdwaW8gaW50ZXJydXB0IG51bWJlciBsb2NhbCB0byB0aGUKKyAgICAgICBncGlvIGludGVycnVwdCBzcGFjZSBvZiB0aGUgY29udHJvbGxlci4KKyAgICAgLSBTZWNvbmQgQ2VsbDogZmxhZ3MgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdGhlIGludGVycnVwdAorICAgICAgIC0gMSA9IHJpc2luZyBlZGdlIHRyaWdnZXJlZAorICAgICAgIC0gMiA9IGZhbGxpbmcgZWRnZSB0cmlnZ2VyZWQKKyAgICAgICAtIDMgPSByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VyZWQKKyAgICAgICAtIDQgPSBoaWdoIGxldmVsIHRyaWdnZXJlZAorICAgICAgIC0gOCA9IGxvdyBsZXZlbCB0cmlnZ2VyZWQKK2ZvciByZWxhdGVkIG1hY3JvcyBsb29rIGluOgoraW5jbHVkZS9kdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pcnEuaAogCiBFeGFtcGxlOgogCXBpbi1jb250cm9sbGVyLXNiYyB7CkBAIC0zMCwxMCArODAsMTcgQEAKIAkJI3NpemUtY2VsbHMJPSA8MT47CiAJCWNvbXBhdGlibGUJPSAic3Qsc3RpaDQxNS1zYmMtcGluY3RybCI7CiAJCXN0LHN5c2NmZwk9IDwmc3lzY2ZnX3NiYz47CisJCXJlZyAJCT0gPDB4ZmU2MWYwODAgMHg0PjsKKwkJcmVnLW5hbWVzCT0gImlycW11eCI7CisJCWludGVycnVwdHMgCT0gPEdJQ19TUEkgMTgwIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQlpbnRlcnJ1cHRzLW5hbWVzID0gImlycW11eCI7CiAJCXJhbmdlcyAJCT0gPDAgMHhmZTYxMDAwMCAweDUwMDA+OworCiAJCVBJTzA6IGdwaW9AZmU2MTAwMDAgewogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMJPSA8MT47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlyZWcJCT0gPDAgMHgxMDA+OwogCQkJc3QsYmFuay1uYW1lCT0gIlBJTzAiOwogCQl9OwpAQCAtMTA1LDYgKzE2MiwxMCBAQAogCiBzZGhjaTA6c2RoY2lAZmU4MTAwMDB7CiAJLi4uCisJaW50ZXJydXB0LXBhcmVudCA9IDwmUElPMz47CisJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHRzID0gPDMgSVJRX1RZUEVfTEVWRUxfSElHSD47IC8qIEludGVycnVwdCBsaW5lIHZpYSBQSU8zLTMgKi8KKwlpbnRlcnJ1cHRzLW5hbWVzID0gImNhcmQtZGV0ZWN0IjsKIAlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCXBpbmN0cmwtMAk9IDwmcGluY3RybF9tbWM+OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sbXNtODk3NC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sbXNtODk3NC1waW5jdHJsLnR4dAppbmRleCA0YzM1MmJlLi45ZmI4OWUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLG1zbTg5NzQtcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxtc204OTc0LXBpbmN0cmwudHh0CkBAIC0xLDcgKzEsNyBAQAogUXVhbGNvbW0gTVNNODk3NCBUTE1NIGJsb2NrCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6ICJxY29tLG1zbTh4NzQtcGluY3RybCIKKy0gY29tcGF0aWJsZTogInFjb20sbXNtODk3NC1waW5jdHJsIgogLSByZWc6IFNob3VsZCBiZSB0aGUgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIFRMTU0gYmxvY2suCiAtIGludGVycnVwdHM6IFNob3VsZCBiZSB0aGUgcGFyZW50IElSUSBvZiB0aGUgVExNTSBibG9jay4KIC0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlci4KQEAgLTQyLDE0ICs0MiwxNCBAQAogTm90ZSB0aGF0IG5vdCBhbGwgcHJvcGVydGllcyBhcmUgdmFsaWQgZm9yIGFsbCBwaW5zLgogCiAKLVZhbGlkIHZhbHVlcyBmb3IgcWNvbSxwaW5zIGFyZToKK1ZhbGlkIHZhbHVlcyBmb3IgcGlucyBhcmU6CiAgIGdwaW8wLWdwaW8xNDUKICAgICBTdXBwb3J0cyBtdXgsIGJpYXMgYW5kIGRyaXZlLXN0cmVuZ3RoCiAKICAgc2RjMV9jbGssIHNkYzFfY21kLCBzZGMxX2RhdGEsIHNkYzJfY2xrLCBzZGMyX2NtZCwgc2RjMl9kYXRhCiAgICAgU3VwcG9ydHMgYmlhcyBhbmQgZHJpdmUtc3RyZW5ndGgKIAotVmFsaWQgdmFsdWVzIGZvciBxY29tLGZ1bmN0aW9uIGFyZToKK1ZhbGlkIHZhbHVlcyBmb3IgZnVuY3Rpb24gYXJlOgogICBibHNwX2kyYzIsIGJsc3BfaTJjNiwgYmxzcF9pMmMxMSwgYmxzcF9zcGkxLCBibHNwX3VhcnQyLCBibHNwX3VhcnQ4LCBzbGltYnVzCiAKICAgKE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB5ZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgZnVuY3Rpb25zKQpAQCAtNzMsMTggKzczLDE4IEBACiAKIAkJdWFydDJfZGVmYXVsdDogdWFydDJfZGVmYXVsdCB7CiAJCQltdXggewotCQkJCXFjb20scGlucyA9ICJncGlvNCIsICJncGlvNSI7Ci0JCQkJcWNvbSxmdW5jdGlvbiA9ICJibHNwX3VhcnQyIjsKKwkJCQlwaW5zID0gImdwaW80IiwgImdwaW81IjsKKwkJCQlmdW5jdGlvbiA9ICJibHNwX3VhcnQyIjsKIAkJCX07CiAKIAkJCXR4IHsKLQkJCQlxY29tLHBpbnMgPSAiZ3BpbzQiOworCQkJCXBpbnMgPSAiZ3BpbzQiOwogCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDQ+OwogCQkJCWJpYXMtZGlzYWJsZTsKIAkJCX07CiAKIAkJCXJ4IHsKLQkJCQlxY29tLHBpbnMgPSAiZ3BpbzUiOworCQkJCXBpbnMgPSAiZ3BpbzUiOwogCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OwogCQkJCWJpYXMtcHVsbC11cDsKIAkJCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zYW1zdW5nLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc2Ftc3VuZy1waW5jdHJsLnR4dAppbmRleCAyNTc2NzdkLi4yYjMyNzgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zYW1zdW5nLXBpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3NhbXN1bmctcGluY3RybC50eHQKQEAgLTE2LDYgKzE2LDcgQEAKICAgLSAic2Ftc3VuZyxleHlub3M0MjEwLXBpbmN0cmwiOiBmb3IgRXh5bm9zNDIxMCBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAtICJzYW1zdW5nLGV4eW5vczR4MTItcGluY3RybCI6IGZvciBFeHlub3M0eDEyIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAgIC0gInNhbXN1bmcsZXh5bm9zNTI1MC1waW5jdHJsIjogZm9yIEV4eW5vczUyNTAgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KKyAgLSAic2Ftc3VuZyxleHlub3M1MjYwLXBpbmN0cmwiOiBmb3IgRXh5bm9zNTI2MCBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAtICJzYW1zdW5nLGV4eW5vczU0MjAtcGluY3RybCI6IGZvciBFeHlub3M1NDIwIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAKIC0gcmVnOiBCYXNlIGFkZHJlc3Mgb2YgdGhlIHBpbiBjb250cm9sbGVyIGhhcmR3YXJlIG1vZHVsZSBhbmQgbGVuZ3RoIG9mCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbDJjYWNoZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbDJjYWNoZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxYjIxOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9sMmNhY2hlLnR4dApAQCAtMCwwICsxLDIzIEBACitGcmVlc2NhbGUgTDIgQ2FjaGUgQ29udHJvbGxlcgorCitMMiBjYWNoZSBpcyBwcmVzZW50IGluIEZyZWVzY2FsZSdzIFFvcklRIGFuZCBRb3JJUSBRb252ZXJnZSBwbGF0Zm9ybXMuCitUaGUgY2FjaGUgYmluZGluZ3MgZXhwbGFpbmVkIGJlbG93IGFyZSBlUEFQUiBjb21wbGlhbnQKKworUmVxdWlyZWQgUHJvcGVydGllczoKKworLSBjb21wYXRpYmxlCTogU2hvdWxkIGluY2x1ZGUgImZzbCxjaGlwLWwyLWNhY2hlLWNvbnRyb2xsZXIiIGFuZCAiY2FjaGUiCisJCSAgd2hlcmUgY2hpcCBpcyB0aGUgcHJvY2Vzc29yIChic2M5MTMyLCBucGM4NTcyIGV0Yy4pCistIHJlZwkJOiBBZGRyZXNzIGFuZCBzaXplIG9mIEwyIGNhY2hlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCistIGNhY2hlLXNpemUJOiBTaXplIG9mIHRoZSBlbnRpcmUgTDIgY2FjaGUKKy0gaW50ZXJydXB0cwk6IEVycm9yIGludGVycnVwdCBvZiBMMiBjb250cm9sbGVyCistIGNhY2hlLWxpbmUtc2l6ZSA6IFNpemUgb2YgTDIgY2FjaGUgbGluZXMKKworRXhhbXBsZToKKworCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsYnNjOTEzMi1sMi1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKKwkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKKwkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsgLy8gMzIgYnl0ZXMKKwkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsgLy8gTDIsMjU2SworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21lbS1jdHJsci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbWVtLWN0cmxyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODc4NTZmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21lbS1jdHJsci50eHQKQEAgLTAsMCArMSwyNyBAQAorRnJlZXNjYWxlIEREUiBtZW1vcnkgY29udHJvbGxlcgorCitQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUJOiBTaG91bGQgaW5jbHVkZSAiZnNsLGNoaXAtbWVtb3J5LWNvbnRyb2xsZXIiIHdoZXJlCisJCSAgY2hpcCBpcyB0aGUgcHJvY2Vzc29yIChic2M5MTMyLCBtcGM4NTcyIGV0Yy4pLCBvcgorCQkgICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiLgorLSByZWcJCTogQWRkcmVzcyBhbmQgc2l6ZSBvZiBERFIgY29udHJvbGxlciByZWdpc3RlcnMKKy0gaW50ZXJydXB0cwk6IEVycm9yIGludGVycnVwdCBvZiBERFIgY29udHJvbGxlcgorCitFeGFtcGxlIDE6CisKKwltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsYnNjOTEzMi1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgOD47CisJfTsKKworCitFeGFtcGxlIDI6CisKKwlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNyIsCisJCQkJImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IudHh0CmluZGV4IDYzYzY1OTguLmU1Y2FjMWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IudHh0CkBAIC04LDggKzgsMTIgQEAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGVuYWJsZS1ncGlvCQk6IEdQSU8gdG8gdXNlIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSByZWd1bGF0b3IuCiAtIGdwaW9zCQkJOiBHUElPIGdyb3VwIHVzZWQgdG8gY29udHJvbCB2b2x0YWdlLgorLSBncGlvcy1zdGF0ZXMJCTogZ3Bpb3MgcGluJ3MgaW5pdGlhbCBzdGF0ZXMgYXJyYXkuIDA6IExPVywgMTogSElHSC4KKwkJCSAgZGVmdWFsdCBpcyBMT1cgaWYgbm90aGluZyBpcyBzcGVjaWZpZWQuCiAtIHN0YXJ0dXAtZGVsYXktdXMJOiBTdGFydHVwIHRpbWUgaW4gbWljcm9zZWNvbmRzLgogLSBlbmFibGUtYWN0aXZlLWhpZ2gJOiBQb2xhcml0eSBvZiBHUElPIGlzIGFjdGl2ZSBoaWdoIChkZWZhdWx0IGlzIGxvdykuCistIHJlZ3VsYXRvci10eXBlCTogU3BlY2lmaWVzIHdoYXQgaXMgYmVpbmcgcmVndWxhdGVkLCBtdXN0IGJlIGVpdGhlcgorCQkJICAidm9sdGFnZSIgb3IgImN1cnJlbnQiLCBkZWZhdWx0cyB0byBjdXJyZW50LgogCiBBbnkgcHJvcGVydHkgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBjb3JlIHJlZ3VsYXRvciBiaW5kaW5nIGRlZmluZWQgaW4KIHJlZ3VsYXRvci50eHQgY2FuIGFsc28gYmUgdXNlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcGZ1emUxMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wZnV6ZTEwMC50eHQKaW5kZXggZmM5ODliMi4uMzRlZjVkMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wZnV6ZTEwMC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wZnV6ZTEwMC50eHQKQEAgLTEsNyArMSw3IEBACiBQRlVaRTEwMCBmYW1pbHkgb2YgcmVndWxhdG9ycwogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiAiZnNsLHBmdXplMTAwIgorLSBjb21wYXRpYmxlOiAiZnNsLHBmdXplMTAwIiBvciAiZnNsLHBmdXplMjAwIgogLSByZWc6IEkyQyBzbGF2ZSBhZGRyZXNzCiAKIFJlcXVpcmVkIGNoaWxkIG5vZGU6CkBAIC0xMCwxMSArMTAsMTQgQEAKICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0LgogCiAgIFRoZSB2YWxpZCBuYW1lcyBmb3IgcmVndWxhdG9ycyBhcmU6CisgIC0tUEZVWkUxMDAKICAgc3cxYWIsc3cxYyxzdzIsc3czYSxzdzNiLHN3NCxzd2JzdCx2c252cyx2cmVmZGRyLHZnZW4xfnZnZW42CisgIC0tUEZVWkUyMDAKKyAgc3cxYWIsc3cyLHN3M2Esc3czYixzd2JzdCx2c252cyx2cmVmZGRyLHZnZW4xfnZnZW42CiAKIEVhY2ggcmVndWxhdG9yIGlzIGRlZmluZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGJpbmRpbmcgZm9yIHJlZ3VsYXRvcnMuCiAKLUV4YW1wbGU6CitFeGFtcGxlIDE6IFBGVVpFMTAwCiAKIAlwbWljOiBwZnV6ZTEwMEAwOCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLHBmdXplMTAwIjsKQEAgLTExMywzICsxMTYsOTIgQEAKIAkJCX07CiAJCX07CiAJfTsKKworCitFeGFtcGxlIDI6IFBGVVpFMjAwCisKKwlwbWljOiBwZnV6ZTIwMEAwOCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHBmdXplMjAwIjsKKwkJcmVnID0gPDB4MDg+OworCisJCXJlZ3VsYXRvcnMgeworCQkJc3cxYV9yZWc6IHN3MWFiIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwzMDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE4NzUwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NjI1MD47CisJCQl9OworCisJCQlzdzJfcmVnOiBzdzIgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXN3M2FfcmVnOiBzdzNhIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw0MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE5NzUwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlzdzNiX3JlZzogc3czYiB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NDAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxOTc1MDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJc3dic3RfcmVnOiBzd2JzdCB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NTAwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8NTE1MDAwMD47CisJCQl9OworCisJCQlzbnZzX3JlZzogdnNudnMgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDEwMDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMwMDAwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQl2cmVmX3JlZzogdnJlZmRkciB7CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXZnZW4xX3JlZzogdmdlbjEgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTU1MDAwMD47CisJCQl9OworCisJCQl2Z2VuMl9yZWc6IHZnZW4yIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE1NTAwMDA+OworCQkJfTsKKworCQkJdmdlbjNfcmVnOiB2Z2VuMyB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQl9OworCisJCQl2Z2VuNF9yZWc6IHZnZW40IHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJdmdlbjVfcmVnOiB2Z2VuNSB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXZnZW42X3JlZzogdmdlbjYgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMzMDAwMDA+OworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3M1bTg3NjctcmVndWxhdG9yLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvczVtODc2Ny1yZWd1bGF0b3IudHh0CmluZGV4IGZjNmIzOGYuLmQyOTA5ODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvczVtODc2Ny1yZWd1bGF0b3IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvczVtODc2Ny1yZWd1bGF0b3IudHh0CkBAIC02OSwxMyArNjksMTYgQEAKIAkJfTsKIAl9OwogVGhlIGFib3ZlIHJlZ3VsYXRvciBlbnRyaWVzIGFyZSBkZWZpbmVkIGluIHJlZ3VsYXRvciBiaW5kaW5ncyBkb2N1bWVudGF0aW9uCi1leGNlcHQgb3BfbW9kZSBkZXNjcmlwdGlvbi4KK2V4Y2VwdCB0aGVzZSBwcm9wZXJ0aWVzOgogCS0gb3BfbW9kZTogZGVzY3JpYmVzIHRoZSBkaWZmZXJlbnQgb3BlcmF0aW5nIG1vZGVzIG9mIHRoZSBMRE8ncyB3aXRoCiAJCXBvd2VyIG1vZGUgY2hhbmdlIGluIFNPQy4gVGhlIGRpZmZlcmVudCBwb3NzaWJsZSB2YWx1ZXMgYXJlLAogCQkwIC0gYWx3YXlzIG9mZiBtb2RlCiAJCTEgLSBvbiBpbiBub3JtYWwgbW9kZQogCQkyIC0gbG93IHBvd2VyIG1vZGUKIAkJMyAtIHN1c3BlbmQgbW9kZQorCS0gczVtODc2NyxwbWljLWV4dC1jb250cm9sLWdwaW9zOiAob3B0aW9uYWwpIEdQSU8gc3BlY2lmaWVyIGZvciBvbmUKKwkJR1BJTyBjb250cm9sbGluZyB0aGlzIHJlZ3VsYXRvciAoZW5hYmxlL2Rpc2FibGUpOyBUaGlzIGlzCisJCXZhbGlkIG9ubHkgZm9yIGJ1Y2s5LgogCiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbmFtZXMgb2YgdGhlIHJlZ3VsYXRvcnMgdGhhdCB0aGUgczVtODc2NyBwbWljIGJsb2NrCiBzdXBwb3J0cy4gTm90ZTogVGhlICduJyBpbiBMRE9uIGFuZCBCVUNLbiByZXByZXNlbnRzIHRoZSBMRE8gb3IgQlVDSyBudW1iZXIKQEAgLTE0OCw1ICsxNTEsMTMgQEAKIAkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOwogCQkJCXJlZ3VsYXRvci1ib290LW9uOwogCQkJfTsKKworCQkJdmVtbWNfcmVnOiBCVUNLOSB7CisJCQkJcmVndWxhdG9yLW5hbWUgPSAiVk1FTV9WRERfMi44ViI7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MjgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MjgwMDAwMD47CisJCQkJb3BfbW9kZSA9IDwzPjsgLyogU3RhbmRieSBNb2RlICovCisJCQkJczVtODc2NyxwbWljLWV4dC1jb250cm9sLWdwaW9zID0gPCZncGswIDIgMD47CisJCQl9OwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci90aS1hYmItcmVndWxhdG9yLnR4dAppbmRleCAyZTU3YTMzLi5jNThkYjc1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci50eHQKQEAgLTQsMTAgKzQsMTQgQEAKIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKICAgLSAidGksYWJiLXYxIiBmb3Igb2xkZXIgU29DcyBsaWtlIE9NQVAzCiAgIC0gInRpLGFiYi12MiIgZm9yIG5ld2VyIFNvQ3MgbGlrZSBPTUFQNCwgT01BUDUKKyAgLSAidGksYWJiLXYzIiBmb3IgYSBnZW5lcmljIGRlZmluaXRpb24gd2hlcmUgc2V0dXAgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZQorICAgICBwcm92aWRlZCAoZXhhbXBsZTogRFJBNykKIC0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4gSXQgY29udGFpbnMKICAgdGhlIGluZm9ybWF0aW9uIG9mIHJlZ2lzdGVycyBpbiB0aGUgc2FtZSBvcmRlciBhcyBkZXNjcmliZWQgYnkgcmVnLW5hbWVzCiAtIHJlZy1uYW1lczogU2hvdWxkIGNvbnRhaW4gdGhlIHJlZyBuYW1lcwotICAtICJiYXNlLWFkZHJlc3MiCS0gY29udGFpbnMgYmFzZSBhZGRyZXNzIG9mIEFCQiBtb2R1bGUKKyAgLSAiYmFzZS1hZGRyZXNzIgktIGNvbnRhaW5zIGJhc2UgYWRkcmVzcyBvZiBBQkIgbW9kdWxlICh0aSxhYmItdjEsdGksYWJiLXYyKQorICAtICJjb250cm9sLWFkZHJlc3MiCS0gY29udGFpbnMgY29udHJvbCByZWdpc3RlciBhZGRyZXNzIG9mIEFCQiBtb2R1bGUgKHRpLGFiYi12MykKKyAgLSAic2V0dXAtYWRkcmVzcyIJLSBjb250YWlucyBzZXR1cCByZWdpc3RlciBhZGRyZXNzIG9mIEFCQiBtb2R1bGUgKHRpLGFiYi12MykKICAgLSAiaW50LWFkZHJlc3MiCS0gY29udGFpbnMgYWRkcmVzcyBvZiBpbnRlcnJ1cHQgcmVnaXN0ZXIgZm9yIEFCQiBtb2R1bGUKICAgKGFsc28gc2VlIE9wdGlvbmFsIHByb3BlcnRpZXMpCiAtICNhZGRyZXNzLWNlbGw6IHNob3VsZCBiZSAwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2VmbTMyLXVhcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9lZm0zMi11YXJ0LnR4dAppbmRleCA4ZTA4MGI4Li4xOTg0YmRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2VmbTMyLXVhcnQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZWZtMzItdWFydC50eHQKQEAgLTYsNyArNiw3IEBACiAtIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiB1YXJ0IGludGVycnVwdAogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgotLSBsb2NhdGlvbiA6IERlY2lkZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBVU0FSVCBJL08gcGlucy4KKy0gZWZtMzIsbG9jYXRpb24gOiBEZWNpZGVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgVVNBUlQgSS9PIHBpbnMuCiAgIEFsbG93ZWQgcmFuZ2UgOiBbMCAuLiA1XQogICBEZWZhdWx0OiAwCiAKQEAgLTE2LDUgKzE2LDUgQEAKIAljb21wYXRpYmxlID0gImVmbTMyLHVhcnQiOwogCXJlZyA9IDwweDQwMDBjNDAwIDB4NDAwPjsKIAlpbnRlcnJ1cHRzID0gPDE1PjsKLQlsb2NhdGlvbiA9IDwwPjsKKwllZm0zMixsb2NhdGlvbiA9IDwwPjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2ZzbC1scHVhcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9mc2wtbHB1YXJ0LnR4dAppbmRleCA2ZmQxZGQxLi5hMWQxMjA1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL2ZzbC1scHVhcnQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvZnNsLWxwdWFydC50eHQKQEAgLTQsMTEgKzQsMjQgQEAKIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxzb2M+LWxwdWFydCIKIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKIC0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIHVhcnQgaW50ZXJydXB0CistIGNsb2NrcyA6IHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgcGFpcnMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpbiBjbG9jay1uYW1lcworLSBjbG9jay1uYW1lcyA6IHNob3VsZCBjb250YWluOiAiaXBnIiAtIHRoZSB1YXJ0IGNsb2NrCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGRtYXM6IEEgbGlzdCBvZiB0d28gZG1hIHNwZWNpZmllcnMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpbiBkbWEtbmFtZXMuCistIGRtYS1uYW1lczogc2hvdWxkIGNvbnRhaW4gInR4IiBhbmQgInJ4Ii4KKworTm90ZTogT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgRE1BIHN1cHBvcnQuIFdyaXRlIHRoZW0gYm90aCBvciBib3RoIG5vdC4KIAogRXhhbXBsZToKIAogdWFydDA6IHNlcmlhbEA0MDAyNzAwMCB7Ci0JICAgICAgIGNvbXBhdGlibGUgPSAiZnNsLHZmNjEwLWxwdWFydCI7Ci0JICAgICAgIHJlZyA9IDwweDQwMDI3MDAwIDB4MTAwMD47Ci0JICAgICAgIGludGVycnVwdHMgPSA8MCA2MSAweDAwPjsKLSAgICAgICB9OworCQljb21wYXRpYmxlID0gImZzbCx2ZjYxMC1scHVhcnQiOworCQlyZWcgPSA8MHg0MDAyNzAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgNjEgMHgwMD47CisJCWNsb2NrcyA9IDwmY2xrcyBWRjYxMF9DTEtfVUFSVDA+OworCQljbG9jay1uYW1lcyA9ICJpcGciOworCQlkbWFzID0gPCZlZG1hMCAwIDI+LAorCQkJPCZlZG1hMCAwIDM+OworCQlkbWEtbmFtZXMgPSAicngiLCJ0eCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvbWF4aW0sbWF4MzEweC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL21heGltLG1heDMxMHgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTkxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL21heGltLG1heDMxMHgudHh0CkBAIC0wLDAgKzEsMzYgQEAKKyogTWF4aW0gTUFYMzEwWCBhZHZhbmNlZCBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyLVRyYW5zbWl0dGVyIChVQVJUKQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgIC0gIm1heGltLG1heDMxMDciIGZvciBNYXhpbSBNQVgzMTA3LAorICAtICJtYXhpbSxtYXgzMTA4IiBmb3IgTWF4aW0gTUFYMzEwOCwKKyAgLSAibWF4aW0sbWF4MzEwOSIgZm9yIE1heGltIE1BWDMxMDksCisgIC0gIm1heGltLG1heDE0ODMwIiBmb3IgTWF4aW0gTUFYMTQ4MzAuCistIHJlZzogU1BJIGNoaXAgc2VsZWN0IG51bWJlci4KKy0gaW50ZXJydXB0LXBhcmVudDogVGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0CisgIHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgSUMuCistIGludGVycnVwdHM6IFNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSBvZiB0aGUgcGFyZW50IGludGVycnVwdAorICBjb250cm9sbGVyLiBUaGUgZm9ybWF0IG9mIHRoZSBpbnRlcnJ1cHQgc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlCisgIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlci4KKy0gY2xvY2tzOiBwaGFuZGxlIHRvIHRoZSBJQyBzb3VyY2UgY2xvY2suCistIGNsb2NrLW5hbWVzOiBTaG91bGQgYmUgInh0YWwiIGlmIGNsb2NrIGlzIGFuIGV4dGVybmFsIGNyeXN0YWwgb3IKKyAgIm9zYyIgaWYgYW4gZXh0ZXJuYWwgY2xvY2sgc291cmNlIGlzIHVzZWQuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGdwaW8tY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorLSAjZ3Bpby1jZWxsczogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIEdQSU8gbnVtYmVyIGFuZAorICB0aGUgc2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBHUElPIHBvbGFyaXR5OgorICAgIDAgPSBhY3RpdmUgaGlnaCwKKyAgICAxID0gYWN0aXZlIGxvdy4KKworRXhhbXBsZToKKwltYXgxNDgzMDogbWF4MTQ4MzBAMCB7CisJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4MTQ4MzAiOworCQlyZWcgPSA8MD47CisJCWNsb2NrcyA9IDwmY2xrMjBtPjsKKwkJY2xvY2stbmFtZXMgPSAib3NjIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzM+OworCQlpbnRlcnJ1cHRzID0gPDcgSVJRX1RZUEVfRURHRV9GQUxMSU5HPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9yZW5lc2FzLHNjaS1zZXJpYWwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9yZW5lc2FzLHNjaS1zZXJpYWwudHh0CmluZGV4IGYzNzJjZjIuLjUzZTZjMTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvcmVuZXNhcyxzY2ktc2VyaWFsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL3JlbmVzYXMsc2NpLXNlcmlhbC50eHQKQEAgLTM3LDcgKzM3LDcgQEAKIAl9OwogCiAJc2NpZmEwOiBzZXJpYWxAZTZjNDAwMDAgewotCQljb21wYXRpYmxlID0gInJlbmVzYXMsc2NpZmEtcjhhNzc5MCIsICJyZW5lc2FzLHNjaWZhLWdlbmVyaWMiOworCQljb21wYXRpYmxlID0gInJlbmVzYXMsc2NpZmEtcjhhNzc5MCIsICJyZW5lc2FzLHNjaWZhIjsKIAkJcmVnID0gPDAgMHhlNmM0MDAwMCAwIDY0PjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0cyA9IDwwIDE0NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9hcm1hZGEtMzcwZGItYXVkaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2FybWFkYS0zNzBkYi1hdWRpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5ODRkMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9hcm1hZGEtMzcwZGItYXVkaW8udHh0CkBAIC0wLDAgKzEsMjcgQEAKK0RldmljZSBUcmVlIGJpbmRpbmdzIGZvciB0aGUgQXJtYWRhIDM3MCBEQiBhdWRpbworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXNlIERldmljZSBUcmVlIGJpbmRpbmdzIGFyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBhdWRpbyBjb21wbGV4Citmb3VuZCBvbiB0aGUgQXJtYWRhIDM3MCBEQiBwbGF0Zm9ybS4KKworTWFuZGF0b3J5IHByb3BlcnRpZXM6CisKKyAqIGNvbXBhdGlibGU6IG11c3QgYmUgIm1hcnZlbGwsYTM3MGRiLWF1ZGlvIgorCisgKiBtYXJ2ZWxsLGF1ZGlvLWNvbnRyb2xsZXI6IGEgcGhhbmRsZSB0aGF0IHBvaW50cyB0byB0aGUgYXVkaW8KKyAgIGNvbnRyb2xsZXIgb2YgdGhlIEFybWFkYSAzNzAgU29DLgorCisgKiBtYXJ2ZWxsLGF1ZGlvLWNvZGVjOiBhIHNldCBvZiB0aHJlZSBwaGFuZGxlcyB0aGF0IHBvaW50cyB0bzoKKworICAgIDEvIHRoZSBhbmFsb2cgYXVkaW8gY29kZWMgY29ubmVjdGVkIHRvIHRoZSBBcm1hZGEgMzcwIFNvQworICAgIDIvIHRoZSBTL1BESUYgdHJhbnNjZWl2ZXIKKyAgICAzLyB0aGUgUy9QRElGIHJlY2VpdmVyCisKK0V4YW1wbGU6CisKKwlzb3VuZCB7CisJICAgICAgY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGEzNzBkYi1hdWRpbyI7CisJICAgICAgbWFydmVsbCxhdWRpby1jb250cm9sbGVyID0gPCZhdWRpb19jb250cm9sbGVyPjsKKwkgICAgICBtYXJ2ZWxsLGF1ZGlvLWNvZGVjID0gPCZhdWRpb19jb2RlYyAmc3BkaWZfb3V0ICZzcGRpZl9pbj47CisJICAgICAgc3RhdHVzID0gIm9rYXkiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvY3M0Mnh4OC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvY3M0Mnh4OC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzMWZiYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9jczQyeHg4LnR4dApAQCAtMCwwICsxLDI4IEBACitDUzQyNDQ4L0NTNDI4ODggYXVkaW8gQ09ERUMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiBtdXN0IGNvbnRhaW4gb25lIG9mICJjaXJydXMsY3M0MjQ0OCIgYW5kICJjaXJydXMsY3M0Mjg4OCIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMKKworICAtIGNsb2NrcyA6IGEgbGlzdCBvZiBwaGFuZGxlcyArIGNsb2NrLXNwZWNpZmllcnMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpbgorICAgIGNsb2NrLW5hbWVzCisKKyAgLSBjbG9jay1uYW1lcyA6IG11c3QgY29udGFpbiAibWNsayIKKworICAtIFZBLXN1cHBseSwgVkQtc3VwcGx5LCBWTFMtc3VwcGx5LCBWTEMtc3VwcGx5OiBwb3dlciBzdXBwbGllcyBmb3IgdGhlIGRldmljZSwKKyAgICBhcyBjb3ZlcmVkIGluIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAorCitFeGFtcGxlOgorCitjb2RlYzogY3M0Mjg4OEA0OCB7CisJY29tcGF0aWJsZSA9ICJjaXJydXMsY3M0Mjg4OCI7CisJcmVnID0gPDB4NDg+OworCWNsb2NrcyA9IDwmY29kZWNfbWNsayAwPjsKKwljbG9jay1uYW1lcyA9ICJtY2xrIjsKKwlWQS1zdXBwbHkgPSA8JnJlZ19hdWRpbz47CisJVkQtc3VwcGx5ID0gPCZyZWdfYXVkaW8+OworCVZMUy1zdXBwbHkgPSA8JnJlZ19hdWRpbz47CisJVkxDLXN1cHBseSA9IDwmcmVnX2F1ZGlvPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZGE5MDU1LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9kYTkwNTUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMWI3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZGE5MDU1LnR4dApAQCAtMCwwICsxLDIyIEBACisqIERpYWxvZyBEQTkwNTUgQXVkaW8gQ09ERUMKKworREE5MDU1IHByb3ZpZGVzIEF1ZGlvIENPREVDIHN1cHBvcnQgKEkyQyBvbmx5KS4KKworVGhlIEF1ZGlvIENPREVDIGRldmljZSBpbiBEQTkwNTUgaGFzIGl0J3Mgb3duIEkyQyBhZGRyZXNzIHdoaWNoIGlzIGNvbmZpZ3VyYWJsZSwKK3NvIHRoZSBkZXZpY2UgaXMgaW5zdGFudGlhdGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgUE1JQyAoTUZEKSBkZXZpY2UuCisKK0ZvciBkZXRhaWxzIG9uIGFjY29tcGFueWluZyBQTUlDIEkyQyBkZXZpY2UsIHNlZSB0aGUgZm9sbG93aW5nOgorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9kYTkwNTUudHh0CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlOiAiZGxnLGRhOTA1NS1jb2RlYyIKKyAgLSByZWc6IFNwZWNpZmllcyB0aGUgSTJDIHNsYXZlIGFkZHJlc3MKKworCitFeGFtcGxlOgorCisJY29kZWM6IGRhOTA1NS1jb2RlY0AxYSB7CisJCWNvbXBhdGlibGUgPSAiZGxnLGRhOTA1NS1jb2RlYyI7CisJCXJlZyA9IDwweDFhPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2RhdmluY2ktZXZtLWF1ZGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9kYXZpbmNpLWV2bS1hdWRpby50eHQKaW5kZXggODY1MTc4ZC4uOTYzZTEwMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2RhdmluY2ktZXZtLWF1ZGlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZGF2aW5jaS1ldm0tYXVkaW8udHh0CkBAIC01LDEyICs1LDE5IEBACiAtIHRpLG1vZGVsIDogVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoaXMgc291bmQgY29tcGxleC4KIC0gdGksYXVkaW8tY29kZWMgOiBUaGUgcGhhbmRsZSBvZiB0aGUgVExWMzIwQUlDM3ggYXVkaW8gY29kZWMKIC0gdGksbWNhc3AtY29udHJvbGxlciA6IFRoZSBwaGFuZGxlIG9mIHRoZSBNY0FTUCBjb250cm9sbGVyCi0tIHRpLGNvZGVjLWNsb2NrLXJhdGUgOiBUaGUgQ29kZWMgQ2xvY2sgcmF0ZSAoaW4gSHopIGFwcGxpZWQgdG8gdGhlIENvZGVjCiAtIHRpLGF1ZGlvLXJvdXRpbmcgOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KICAgRWFjaCBlbnRyeSBpcyBhIHBhaXIgb2Ygc3RyaW5ncywgdGhlIGZpcnN0IGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc2luaywKICAgdGhlIHNlY29uZCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNvdXJjZS4gVmFsaWQgbmFtZXMgZm9yIHNvdXJjZXMgYW5kCiAgIHNpbmtzIGFyZSB0aGUgY29kZWMncyBwaW5zLCBhbmQgdGhlIGphY2tzIG9uIHRoZSBib2FyZDoKIAorT3B0aW9uYWwgcHJvcGVydGllczoKKy0gdGksY29kZWMtY2xvY2stcmF0ZSA6IFRoZSBDb2RlYyBDbG9jayByYXRlIChpbiBIeikgYXBwbGllZCB0byB0aGUgQ29kZWMuCistIGNsb2NrcyA6IFJlZmVyZW5jZSB0byB0aGUgbWFzdGVyIGNsb2NrCistIGNsb2NrLW5hbWVzIDogVGhlIGNsb2NrIHNob3VsZCBiZSBuYW1lZCAibWNsayIKKy0gRWl0aGVyIGNvZGVjLWNsb2NrLXJhdGUgb3IgdGhlIGNvZGVjLWNsb2NrIHJlZmVyZW5jZSBoYXMgdG8gYmUgZGVmaW5lZC4gSWYKKyAgdGhlIGJvdGggYXJlIGRlZmluZWQgdGhlIGRyaXZlciBhdHRlbXB0cyB0byBzZXQgcmVmZXJlbmNlZCBjbG9jayB0byB0aGUKKyAgZGVmaW5lZCByYXRlIGFuZCB0YWtlcyB0aGUgcmF0ZSBmcm9tIHRoZSBjbG9jayByZWZlcmVuY2UuCisKICAgQm9hcmQgY29ubmVjdG9yczoKIAogICAqIEhlYWRwaG9uZSBKYWNrCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZXVrcmVhLXRsdjMyMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZXVrcmVhLXRsdjMyMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3OTg1YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ldWtyZWEtdGx2MzIwLnR4dApAQCAtMCwwICsxLDIxIEBACitBdWRpbyBjb21wbGV4IGZvciBFdWtyZWEgYm9hcmRzIHdpdGggdGx2MzIwYWljMjMgY29kZWMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAiZXVrcmVhLGFzb2MtdGx2MzIwIgorLSBldWtyZWEsbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjb21wbGV4LgorLSBzc2ktY29udHJvbGxlciA6IFRoZSBwaGFuZGxlIG9mIHRoZSBTU0kgY29udHJvbGxlci4KKy0gZnNsLG11eC1pbnQtcG9ydCA6IFRoZSBpbnRlcm5hbCBwb3J0IG9mIHRoZSBpLk1YIGF1ZGlvIG11eGVyIChBVURNVVgpLgorLSBmc2wsbXV4LWV4dC1wb3J0IDogVGhlIGV4dGVybmFsIHBvcnQgb2YgdGhlIGkuTVggYXVkaW8gbXV4ZXIuCisKK05vdGU6IFRoZSBBVURNVVggcG9ydCBudW1iZXJpbmcgc2hvdWxkIHN0YXJ0IGF0IDEsIHdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aAoraGFyZHdhcmUgbWFudWFsLgorCitFeGFtcGxlOgorCisJc291bmQgeworCQljb21wYXRpYmxlID0gImV1a3JlYSxhc29jLXRsdjMyMCI7CisJCWV1a3JlYSxtb2RlbCA9ICJpbXg1MS1ldWtyZWEtdGx2MzIwYWljMjMiOworCQlzc2ktY29udHJvbGxlciA9IDwmc3NpMj47CisJCWZzbCxtdXgtaW50LXBvcnQgPSA8Mj47CisJCWZzbCxtdXgtZXh0LXBvcnQgPSA8Mz47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsZXNhaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLGVzYWkudHh0CmluZGV4IGQ3Yjk5ZmEuLmFlYjhjNGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9mc2wsZXNhaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxlc2FpLnR4dApAQCAtMzQsNiArMzQsMTAgQEAKICAgICB0aGF0IEVTQUkgd291bGQgd29yayBpbiB0aGUgc3luY2hyb25vdXMgbW9kZSwgd2hpY2ggbWVhbnMgYWxsIHRoZSBzZXR0aW5ncwogICAgIGZvciBSZWNlaXZpbmcgd291bGQgYmUgZHVwbGljYXRlZCBmcm9tIFRyYW5zbWl0aW9uIHJlbGF0ZWQgcmVnaXN0ZXJzLgogCisgIC0gYmlnLWVuZGlhbiA6IElmIHRoaXMgcHJvcGVydHkgaXMgYWJzZW50LCB0aGUgbmF0aXZlIGVuZGlhbiBtb2RlIHdpbGwKKyAgICBiZSBpbiB1c2UgYXMgZGVmYXVsdCwgb3IgdGhlIGJpZyBlbmRpYW4gbW9kZSB3aWxsIGJlIGluIHVzZSBmb3IgYWxsIHRoZQorICAgIGRldmljZSByZWdpc3RlcnMuCisKIEV4YW1wbGU6CiAKIGVzYWk6IGVzYWlAMDIwMjQwMDAgewpAQCAtNDYsNSArNTAsNiBAQAogCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJZnNsLGZpZm8tZGVwdGggPSA8MTI4PjsKIAlmc2wsZXNhaS1zeW5jaHJvbm91czsKKwliaWctZW5kaWFuOwogCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxzcGRpZi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvZnNsLHNwZGlmLnR4dAppbmRleCBmMmFlMzM1Li4zZTllODJjOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxzcGRpZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2ZzbCxzcGRpZi50eHQKQEAgLTI5LDYgKzI5LDEwIEBACiAJCQljYW4gYWxzbyBiZSByZWZlcnJlZCB0byBUeENsa19Tb3VyY2UKIAkJCWJpdCBvZiByZWdpc3RlciBTUERJRl9TVEMuCiAKKyAgIC0gYmlnLWVuZGlhbiA6IElmIHRoaXMgcHJvcGVydHkgaXMgYWJzZW50LCB0aGUgbmF0aXZlIGVuZGlhbiBtb2RlIHdpbGwKKyAgIGJlIGluIHVzZSBhcyBkZWZhdWx0LCBvciB0aGUgYmlnIGVuZGlhbiBtb2RlIHdpbGwgYmUgaW4gdXNlIGZvciBhbGwgdGhlCisgICBkZXZpY2UgcmVnaXN0ZXJzLgorCiBFeGFtcGxlOgogCiBzcGRpZjogc3BkaWZAMDIwMDQwMDAgewpAQCAtNTAsNSArNTQsNiBAQAogCQkicnh0eDUiLCAicnh0eDYiLAogCQkicnh0eDciOwogCisJYmlnLWVuZGlhbjsKIAlzdGF0dXMgPSAib2theSI7CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL212ZWJ1LWF1ZGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tdmVidS1hdWRpby50eHQKaW5kZXggZjAwNjJjNS4uY2I4YzA3YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL212ZWJ1LWF1ZGlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbXZlYnUtYXVkaW8udHh0CkBAIC01LDYgKzUsNyBAQAogLSBjb21wYXRpYmxlOgogICAibWFydmVsbCxraXJrd29vZC1hdWRpbyIgZm9yIEtpcmt3b29kIHBsYXRmb3JtcwogICAibWFydmVsbCxkb3ZlLWF1ZGlvIiBmb3IgRG92ZSBwbGF0Zm9ybXMKKyAgIm1hcnZlbGwsYXJtYWRhMzcwLWF1ZGlvIiBmb3IgQXJtYWRhIDM3MCBwbGF0Zm9ybXMKIAogLSByZWc6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciBhbmQgbGVuZ3RoIG9mIG1lbW9yeSBtYXBwZWQKICAgcmVnaW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3BjbTUxMngudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3BjbTUxMngudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmY3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcGNtNTEyeC50eHQKQEAgLTAsMCArMSwzMCBAQAorUENNNTEyeCBhdWRpbyBDT0RFQ3MKKworVGhlc2UgZGV2aWNlcyBzdXBwb3J0IGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6IE9uZSBvZiAidGkscGNtNTEyMSIgb3IgInRpLHBjbTUxMjIiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3IgSTJDLCB0aGUgY2hpcCBzZWxlY3QKKyAgICAgICAgICBudW1iZXIgZm9yIFNQSS4KKworICAtIEFWREQtc3VwcGx5LCBEVkRELXN1cHBseSwgYW5kIENQVkRELXN1cHBseSA6IHBvd2VyIHN1cHBsaWVzIGZvciB0aGUKKyAgICBkZXZpY2UsIGFzIGNvdmVyZWQgaW4gYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKworICAtIGNsb2NrcyA6IEEgY2xvY2sgc3BlY2lmaWVyIGZvciB0aGUgY2xvY2sgY29ubmVjdGVkIGFzIFNDTEsuICBJZiB0aGlzCisgICAgaXMgYWJzZW50IHRoZSBkZXZpY2Ugd2lsbCBiZSBjb25maWd1cmVkIHRvIGNsb2NrIGZyb20gQkNMSy4KKworRXhhbXBsZToKKworCXBjbTUxMjI6IHBjbTUxMjJANGMgeworCQljb21wYXRpYmxlID0gInRpLHBjbTUxMjIiOworCQlyZWcgPSA8MHg0Yz47CisKKwkJQVZERC1zdXBwbHkgPSA8JnJlZ18zdjNfYW5hbG9nPjsKKwkJRFZERC1zdXBwbHkgPSA8JnJlZ18xdjg+OworCQlDUFZERC1zdXBwbHkgPSA8JnJlZ18zdjM+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcmVuZXNhcyxyc25kLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzbmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGU5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcmVuZXNhcyxyc25kLnR4dApAQCAtMCwwICsxLDEwNSBAQAorUmVuZXNhcyBSLUNhciBzb3VuZAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQkJOiAicmVuZXNhcyxyY2FyX3NvdW5kLWdlbjEiIGlmIGdlbmVyYXRpb24xCisJCQkJICAicmVuZXNhcyxyY2FyX3NvdW5kLWdlbjIiIGlmIGdlbmVyYXRpb24yCistIHJlZwkJCQk6IFNob3VsZCBjb250YWluIHRoZSByZWdpc3RlciBwaHlzaWNhbCBhZGRyZXNzLgorCQkJCSAgcmVxdWlyZWQgcmVnaXN0ZXIgaXMKKwkJCQkgICBTUlUvQURHL1NTSSAgICAgIGlmIGdlbmVyYXRpb24xCisJCQkJICAgU1JVL0FERy9TU0lVL1NTSSBpZiBnZW5lcmF0aW9uMgorLSByY2FyX3NvdW5kLHNzaQkJOiBTaG91bGQgY29udGFpbiBTU0kgZmVhdHVyZS4KKwkJCQkgIFRoZSBudW1iZXIgb2YgU1NJIHN1Ym5vZGUgc2hvdWxkIGJlIHNhbWUgYXMgSFcuCisJCQkJICBzZWUgYmVsb3cgZm9yIGRldGFpbC4KKy0gcmNhcl9zb3VuZCxzcmMJCTogU2hvdWxkIGNvbnRhaW4gU1JDIGZlYXR1cmUuCisJCQkJICBUaGUgbnVtYmVyIG9mIFNSQyBzdWJub2RlIHNob3VsZCBiZSBzYW1lIGFzIEhXLgorCQkJCSAgc2VlIGJlbG93IGZvciBkZXRhaWwuCistIHJjYXJfc291bmQsZGFpCQk6IERBSSBjb250ZW50cy4KKwkJCQkgIFRoZSBudW1iZXIgb2YgREFJIHN1Ym5vZGUgc2hvdWxkIGJlIHNhbWUgYXMgSFcuCisJCQkJICBzZWUgYmVsb3cgZm9yIGRldGFpbC4KKworU1NJIHN1Ym5vZGUgcHJvcGVydGllczoKKy0gaW50ZXJydXB0cwkJCTogU2hvdWxkIGNvbnRhaW4gU1NJIGludGVycnVwdCBmb3IgUElPIHRyYW5zZmVyCistIHNoYXJlZC1waW4JCQk6IGlmIHNoYXJlZCBjbG9jayBwaW4KKworU1JDIHN1Ym5vZGUgcHJvcGVydGllczoKK25vIHByb3BlcnRpZXMgYXQgdGhpcyBwb2ludAorCitEQUkgc3Vibm9kZSBwcm9wZXJ0aWVzOgorLSBwbGF5YmFjawkJCTogbGlzdCBvZiBwbGF5YmFjayBtb2R1bGVzCistIGNhcHR1cmUJCQk6IGxpc3Qgb2YgY2FwdHVyZSAgbW9kdWxlcworCitFeGFtcGxlOgorCityY2FyX3NvdW5kOiByY2FyX3NvdW5kQDB4ZmZkOTAwMDAgeworCSNzb3VuZC1kYWktY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJjYXJfc291bmQtZ2VuMiI7CisJcmVnID0JPDAgMHhlYzUwMDAwMCAwIDB4MTAwMD4sIC8qIFNDVSAqLworCQk8MCAweGVjNWEwMDAwIDAgMHgxMDA+LCAgLyogQURHICovCisJCTwwIDB4ZWM1NDAwMDAgMCAweDEwMDA+LCAvKiBTU0lVICovCisJCTwwIDB4ZWM1NDEwMDAgMCAweDEyODA+OyAvKiBTU0kgKi8KKworCXJjYXJfc291bmQsc3JjIHsKKwkJc3JjMDogc3JjQDAgeyB9OworCQlzcmMxOiBzcmNAMSB7IH07CisJCXNyYzI6IHNyY0AyIHsgfTsKKwkJc3JjMzogc3JjQDMgeyB9OworCQlzcmM0OiBzcmNANCB7IH07CisJCXNyYzU6IHNyY0A1IHsgfTsKKwkJc3JjNjogc3JjQDYgeyB9OworCQlzcmM3OiBzcmNANyB7IH07CisJCXNyYzg6IHNyY0A4IHsgfTsKKwkJc3JjOTogc3JjQDkgeyB9OworCX07CisKKwlyY2FyX3NvdW5kLHNzaSB7CisJCXNzaTA6IHNzaUAwIHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzAgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTE6IHNzaUAxIHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzEgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTI6IHNzaUAyIHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzIgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTM6IHNzaUAzIHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTQ6IHNzaUA0IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTU6IHNzaUA1IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzUgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTY6IHNzaUA2IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzYgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTc6IHNzaUA3IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzcgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTg6IHNzaUA4IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzggSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJCXNzaTk6IHNzaUA5IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNzkgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisJfTsKKworCXJjYXJfc291bmQsZGFpIHsKKwkJZGFpMCB7CisJCQlwbGF5YmFjayA9IDwmc3NpNSAmc3JjNT47CisJCQljYXB0dXJlICA9IDwmc3NpNj47CisJCX07CisJCWRhaTEgeworCQkJcGxheWJhY2sgPSA8JnNzaTM+OworCQl9OworCQlkYWkyIHsKKwkJCWNhcHR1cmUgID0gPCZzc2k0PjsKKwkJfTsKKwkJZGFpMyB7CisJCQlwbGF5YmFjayA9IDwmc3NpNz47CisJCX07CisJCWRhaTQgeworCQkJY2FwdHVyZSAgPSA8JnNzaTg+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQKaW5kZXggMTljODRkZi4uMTMxYWEyYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLWNhcmQudHh0CkBAIC04LDE2ICs4LDI2IEBACiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAKKy0gc2ltcGxlLWF1ZGlvLWNhcmQsbmFtZQkJOiBVc2VyIHNwZWNpZmllZCBhdWRpbyBzb3VuZCBjYXJkIG5hbWUsIG9uZSBzdHJpbmcKKwkJCQkJICBwcm9wZXJ0eS4KIC0gc2ltcGxlLWF1ZGlvLWNhcmQsZm9ybWF0CQk6IENQVS9DT0RFQyBjb21tb24gYXVkaW8gZm9ybWF0LgogCQkJCQkgICJpMnMiLCAicmlnaHRfaiIsICJsZWZ0X2oiICwgImRzcF9hIgogCQkJCQkgICJkc3BfYiIsICJhYzk3IiwgInBkbSIsICJtc2IiLCAibHNiIgorLSBzaW1wbGUtYXVkaW8tY2FyZCx3aWRnZXRzCQk6IFBsZWFzZSByZWZlciB0byB3aWRnZXRzLnR4dC4KIC0gc2ltcGxlLWF1ZGlvLWNhcmQscm91dGluZwkJOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KIAkJCQkJICBFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzLCB0aGUgZmlyc3QgYmVpbmcgdGhlCiAJCQkJCSAgY29ubmVjdGlvbidzIHNpbmssIHRoZSBzZWNvbmQgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncwogCQkJCQkgIHNvdXJjZS4KKy0gZGFpLXRkbS1zbG90LW51bQkJCTogUGxlYXNlIHJlZmVyIHRvIHRkbS1zbG90LnR4dC4KKy0gZGFpLXRkbS1zbG90LXdpZHRoCQkJOiBQbGVhc2UgcmVmZXIgdG8gdGRtLXNsb3QudHh0LgogCiBSZXF1aXJlZCBzdWJub2RlczoKIAorLSBzaW1wbGUtYXVkaW8tY2FyZCxkYWktbGluawkJOiBjb250YWluZXIgZm9yIHRoZSBDUFUgYW5kIENPREVDIHN1Yi1ub2RlcworCQkJCQkgIFRoaXMgY29udGFpbmVyIG1heSBiZSBvbWl0dGVkIHdoZW4gdGhlCisJCQkJCSAgY2FyZCBoYXMgb25seSBvbmUgREFJIGxpbmsuCisJCQkJCSAgU2VlIHRoZSBleGFtcGxlcy4KKwogLSBzaW1wbGUtYXVkaW8tY2FyZCxjcHUJCQk6IENQVSAgIHN1Yi1ub2RlCiAtIHNpbXBsZS1hdWRpby1jYXJkLGNvZGVjCQk6IENPREVDIHN1Yi1ub2RlCiAKQEAgLTM4LDE1ICs0OCwyOSBAQAogCQkJCQkgIGNsb2NrIG5vZGUgKD0gY29tbW9uIGNsb2NrKSwgb3IgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiCiAJCQkJCSAgKGlmIHN5c3RlbSBkb2Vucyd0IHN1cHBvcnQgY29tbW9uIGNsb2NrKQogCi1FeGFtcGxlOgorTm90ZToKKyAqIEZvciAnZm9ybWF0JywgJ2ZyYW1lLW1hc3RlcicsICdiaXRjbG9jay1tYXN0ZXInLCAnYml0Y2xvY2staW52ZXJzaW9uJyBhbmQKKyAgICdmcmFtZS1pbnZlcnNpb24nLCB0aGUgc2ltcGxlIGNhcmQgd2lsbCB1c2UgdGhlIHNldHRpbmdzIG9mIENPREVDIGZvciBib3RoCisgICBDUFUgYW5kIENPREVDIHNpZGVzIGFzIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2V0dGluZ3MgaWRlbnRpY2FsIGZvciBib3RoIGVuZHMKKyAgIG9mIHRoZSBsaW5rLgorCitFeGFtcGxlIDEgLSBzaW5nbGUgREFJIGxpbms6CiAKIHNvdW5kIHsKIAljb21wYXRpYmxlID0gInNpbXBsZS1hdWRpby1jYXJkIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxuYW1lID0gIlZGNjEwLVRvd2VyLVNvdW5kLUNhcmQiOwogCXNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCA9ICJsZWZ0X2oiOworCXNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMgPQorCQkiTWljcm9waG9uZSIsICJNaWNyb3Bob25lIEphY2siLAorCQkiSGVhZHBob25lIiwgIkhlYWRwaG9uZSBKYWNrIiwKKwkJIlNwZWFrZXIiLCAiRXh0ZXJuYWwgU3BlYWtlciI7CiAJc2ltcGxlLWF1ZGlvLWNhcmQscm91dGluZyA9Ci0JCSJNSUNfSU4iLCAiTWljIEphY2siLAorCQkiTUlDX0lOIiwgIk1pY3JvcGhvbmUgSmFjayIsCiAJCSJIZWFkcGhvbmUgSmFjayIsICJIUF9PVVQiLAotCQkiRXh0IFNwayIsICJMSU5FX09VVCI7CisJCSJFeHRlcm5hbCBTcGVha2VyIiwgIkxJTkVfT1VUIjsKKworCWRhaS10ZG0tc2xvdC1udW0gPSA8Mj47CisJZGFpLXRkbS1zbG90LXdpZHRoID0gPDg+OwogCiAJc2ltcGxlLWF1ZGlvLWNhcmQsY3B1IHsKIAkJc291bmQtZGFpID0gPCZzaF9mc2kyIDA+OwpAQCAtNzUsMyArOTksMzggQEAKIAlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCWludGVycnVwdHMgPSA8MCAxNDYgMHg0PjsKIH07CisKK0V4YW1wbGUgMiAtIG1hbnkgREFJIGxpbmtzOgorCitzb3VuZCB7CisJY29tcGF0aWJsZSA9ICJzaW1wbGUtYXVkaW8tY2FyZCI7CisJc2ltcGxlLWF1ZGlvLWNhcmQsbmFtZSA9ICJDdWJveCBBdWRpbyI7CisJc2ltcGxlLWF1ZGlvLWNhcmQsZm9ybWF0ID0gImkycyI7CisKKwlzaW1wbGUtYXVkaW8tY2FyZCxkYWktbGlua0AwIHsJCS8qIEkyUyAtIEhETUkgKi8KKwkJc2ltcGxlLWF1ZGlvLWNhcmQsY3B1IHsKKwkJCXNvdW5kLWRhaSA9IDwmYXVkaW8xIDA+OworCQl9OworCQlzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYyB7CisJCQlzb3VuZC1kYWkgPSA8JnRkYTk5OHggMD47CisJCX07CisJfTsKKworCXNpbXBsZS1hdWRpby1jYXJkLGRhaS1saW5rQDEgewkJLyogUy9QRElGIC0gSERNSSAqLworCQlzaW1wbGUtYXVkaW8tY2FyZCxjcHUgeworCQkJc291bmQtZGFpID0gPCZhdWRpbzEgMT47CisJCX07CisJCXNpbXBsZS1hdWRpby1jYXJkLGNvZGVjIHsKKwkJCXNvdW5kLWRhaSA9IDwmdGRhOTk4eCAxPjsKKwkJfTsKKwl9OworCisJc2ltcGxlLWF1ZGlvLWNhcmQsZGFpLWxpbmtAMiB7CQkvKiBTL1BESUYgLSBTL1BESUYgKi8KKwkJc2ltcGxlLWF1ZGlvLWNhcmQsY3B1IHsKKwkJCXNvdW5kLWRhaSA9IDwmYXVkaW8xIDE+OworCQl9OworCQlzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYyB7CisJCQlzb3VuZC1kYWkgPSA8JnNwZGlmX2NvZGVjPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLWNvZGVjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaXJmLWF1ZGlvLWNvZGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjJmNWVjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8tY29kZWMudHh0CkBAIC0wLDAgKzEsMTcgQEAKK1NpUkYgaW50ZXJuYWwgYXVkaW8gQ09ERUMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAic2lyZixhdGxhczYtYXVkaW8tY29kZWMiIG9yICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIKKworICAtIHJlZyA6IHRoZSByZWdpc3RlciBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuCisKKyAgLSBjbG9ja3M6IHRoZSBjbG9jayBvZiBTaVJGIGludGVybmFsIGF1ZGlvIGNvZGVjCisKK0V4YW1wbGU6CisKK2F1ZGlvY29kZWM6IGF1ZGlvY29kZWNAYjAwNDAwMDAgeworCWNvbXBhdGlibGUgPSAic2lyZixhdGxhczYtYXVkaW8tY29kZWMiOworCXJlZyA9IDwweGIwMDQwMDAwIDB4MTAwMDA+OworCWNsb2NrcyA9IDwmY2xrcyAyNz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8tcG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjY2ZGUzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8tcG9ydC50eHQKQEAgLTAsMCArMSwyMCBAQAorKiBTaVJGIFNvQyBhdWRpbyBwb3J0CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICJzaXJmLGF1ZGlvLXBvcnQiCistIHJlZzogQmFzZSBhZGRyZXNzIGFuZCBzaXplIGVudHJpZXM6CistIGRtYXM6IExpc3Qgb2YgRE1BIGNvbnRyb2xsZXIgcGhhbmRsZSBhbmQgRE1BIHJlcXVlc3QgbGluZSBvcmRlcmVkIHBhaXJzLgorLSBkbWEtbmFtZXM6IElkZW50aWZpZXIgc3RyaW5nIGZvciBlYWNoIERNQSByZXF1ZXN0IGxpbmUgaW4gdGhlIGRtYXMgcHJvcGVydHkuCisgIFRoZXNlIHN0cmluZ3MgY29ycmVzcG9uZCAxOjEgd2l0aCB0aGUgb3JkZXJlZCBwYWlycyBpbiBkbWFzLgorCisgIE9uZSBvZiB0aGUgRE1BIGNoYW5uZWxzIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHRyYW5zbWlzc2lvbiAoc2hvdWxkIGJlCisgIG5hbWVkICJ0eCIpIGFuZCBvbmUgZm9yIHJlY2VwdGlvbiAoc2hvdWxkIGJlIG5hbWVkICJyeCIpLgorCitFeGFtcGxlOgorCithdWRpb3BvcnQ6IGF1ZGlvcG9ydEBiMDA0MDAwMCB7CisJY29tcGF0aWJsZSA9ICJzaXJmLGF1ZGlvLXBvcnQiOworCXJlZyA9IDwweGIwMDQwMDAwIDB4MTAwMDA+OworCWRtYXMgPSA8JmRtYWMxIDM+LCA8JmRtYWMxIDg+OworCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpcmYtYXVkaW8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODg4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2lyZi1hdWRpby50eHQKQEAgLTAsMCArMSw0MSBAQAorKiBTaVJGIGF0bGFzNiBhbmQgcHJpbWEyIGludGVybmFsIGF1ZGlvIGNvZGVjIGFuZCBwb3J0IGJhc2VkIGF1ZGlvIHNldHVwcworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAic2lyZixzaXJmLWF1ZGlvLWNhcmQiCistIHNpcmYsYXVkaW8tcGxhdGZvcm06IHBoYW5kbGUgZm9yIHRoZSBwbGF0Zm9ybSBub2RlCistIHNpcmYsYXVkaW8tY29kZWM6IHBoYW5kbGUgZm9yIHRoZSBTaVJGIGludGVybmFsIGNvZGVjIG5vZGUKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gaHAtcGEtZ3Bpb3M6IE5lZWQgdG8gYmUgcHJlc2VudCBpZiB0aGUgYm9hcmQgbmVlZCBjb250cm9sIGV4dGVybmFsCisgIGhlYWRwaG9uZSBhbXBsaWZpZXIuCistIHNway1wYS1ncGlvczogTmVlZCB0byBiZSBwcmVzZW50IGlmIHRoZSBib2FyZCBuZWVkIGNvbnRyb2wgZXh0ZXJuYWwKKyAgc3BlYWtlciBhbXBsaWZpZXIuCistIGhwLXN3aXRjaC1ncGlvczogTmVlZCB0byBiZSBwcmVzZW50IGlmIHRoZSBib2FyZCBjYXBhYmxlIHRvIGRldGVjdCBqYWNrCisgIGluc2VydGlvbiwgcmVtb3ZhbC4KKworQXZhaWxhYmxlIGF1ZGlvIGVuZHBvaW50cyBmb3IgdGhlIGF1ZGlvLXJvdXRpbmcgdGFibGU6CisKK0JvYXJkIGNvbm5lY3RvcnM6CisgKiBIZWFkc2V0IFN0ZXJlb3Bob25lCisgKiBFeHQgU3BrCisgKiBMaW5lIEluCisgKiBNaWMKKworU2lSRiBpbnRlcm5hbCBhdWRpbyBjb2RlYyBwaW5zOgorICogSFBPVVRMCisgKiBIUE9VVFIKKyAqIFNQS09VVAorICogRXh0IE1pYworICogTWljIEJpYXMKKworRXhhbXBsZToKKworc291bmQgeworCQljb21wYXRpYmxlID0gInNpcmYsc2lyZi1hdWRpby1jYXJkIjsKKwkJc2lyZixhdWRpby1jb2RlYyA9IDwmYXVkaW9jb2RlYz47CisJCXNpcmYsYXVkaW8tcGxhdGZvcm0gPSA8JmF1ZGlvcG9ydD47CisJCWhwLXBhLWdwaW9zID0gPCZncGlvIDQ0IDA+OworCQlzcGstcGEtZ3Bpb3MgPSA8JmdwaW8gNDYgMD47CisJCWhwLXN3aXRjaC1ncGlvcyA9IDwmZ3BpbyA0NSAwPjsKK307CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90ZG0tc2xvdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGRtLXNsb3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmM4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGRtLXNsb3QudHh0CkBAIC0wLDAgKzEsMjAgQEAKK1RETSBzbG90OgorCitUaGlzIHNwZWNpZmllcyBhdWRpbyBEQUkncyBURE0gc2xvdC4KKworVERNIHNsb3QgcHJvcGVydGllczoKK2RhaS10ZG0tc2xvdC1udW0gOiBOdW1iZXIgb2Ygc2xvdHMgaW4gdXNlLgorZGFpLXRkbS1zbG90LXdpZHRoIDogIFdpZHRoIGluIGJpdHMgZm9yIGVhY2ggc2xvdC4KKworRm9yIGluc3RhbmNlOgorCWRhaS10ZG0tc2xvdC1udW0gPSA8Mj47CisJZGFpLXRkbS1zbG90LXdpZHRoID0gPDg+OworCitBbmQgZm9yIGVhY2ggc3BjaWZpZWQgZHJpdmVyLCB0aGVyZSBjb3VsZCBiZSBvbmUgLm9mX3hsYXRlX3RkbV9zbG90X21hc2soKQordG8gc3BlY2lmeSBhIGV4cGxpY2l0IG1hcHBpbmcgb2YgdGhlIGNoYW5uZWxzIGFuZCB0aGUgc2xvdHMuIElmIGl0J3MgYWJzZW50Cit0aGUgZGVmYXVsdCBzbmRfc29jX29mX3hsYXRlX3RkbV9zbG90X21hc2soKSB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGluZyB0aGUKK3R4IGFuZCByeCBtYXNrcy4KKworRm9yIHNuZF9zb2Nfb2ZfeGxhdGVfdGRtX3Nsb3RfbWFzaygpLCB0aGUgdHggYW5kIHJ4IG1hc2tzIHdpbGwgdXNlIGEgMSBiaXQKK2ZvciBhbiBhY3RpdmUgc2xvdCBhcyBkZWZhdWx0LCBhbmQgdGhlIGRlZmF1bHQgYWN0aXZlIGJpdHMgYXJlIGF0IHRoZSBMU0Igb2YKK3RoZSBtYXNrcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM2NmRlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgudHh0CkBAIC0wLDAgKzEsNjEgQEAKK1RleGFzIEluc3RydW1lbnRzIC0gdGx2MzIwYWljMzF4eCBDb2RlYyBtb2R1bGUKKworVGhlIHRsdjMyMGFpYzMxeHggc2VyaWFsIGNvbnRyb2wgYnVzIGNvbW11bmljYXRlcyB0aHJvdWdoIEkyQyBwcm90b2NvbHMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlIC0gInN0cmluZyIgLSBPbmUgb2Y6CisgICAgInRpLHRsdjMyMGFpYzMxMHgiIC0gR2VuZXJpYyBUTFYzMjBBSUMzMXh4IHdpdGggbW9ubyBzcGVha2VyIGFtcAorICAgICJ0aSx0bHYzMjBhaWMzMTF4IiAtIEdlbmVyaWMgVExWMzIwQUlDMzF4eCB3aXRoIHN0ZXJlbyBzcGVha2VyIGFtcAorICAgICJ0aSx0bHYzMjBhaWMzMTAwIiAtIFRMVjMyMEFJQzMxMDAgKG1vbm8gc3BlYWtlciBhbXAsIG5vIE1pbmlEU1ApCisgICAgInRpLHRsdjMyMGFpYzMxMTAiIC0gVExWMzIwQUlDMzExMCAoc3RlcmVvIHNwZWFrZXIgYW1wLCBubyBNaW5pRFNQKQorICAgICJ0aSx0bHYzMjBhaWMzMTIwIiAtIFRMVjMyMEFJQzMxMjAgKG1vbm8gc3BlYWtlciBhbXAsIE1pbmlEU1ApCisgICAgInRpLHRsdjMyMGFpYzMxMTEiIC0gVExWMzIwQUlDMzExMSAoc3RlcmVvIHNwZWFrZXIgYW1wLCBNaW5pRFNQKQorCistIHJlZyAtIDxpbnQ+IC0gIEkyQyBzbGF2ZSBhZGRyZXNzCisKKworT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBncGlvLXJlc2V0IC0gZ3BpbyBwaW4gbnVtYmVyIHVzZWQgZm9yIGNvZGVjIHJlc2V0CistIGFpMzF4eC1taWNiaWFzLXZnIC0gTWljQmlhcyBWb2x0YWdlIHNldHRpbmcKKyAgICAgICAgMSBvciBNSUNCSUFTXzJfMFYgLSBNSUNCSUFTIG91dHB1dCBpcyBwb3dlcmVkIHRvIDIuMFYKKyAgICAgICAgMiBvciBNSUNCSUFTXzJfNVYgLSBNSUNCSUFTIG91dHB1dCBpcyBwb3dlcmVkIHRvIDIuNVYKKyAgICAgICAgMyBvciBNSUNCSUFTX0FWREQgLSBNSUNCSUFTIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gQVZERAorCUlmIHRoaXMgbm9kZSBpcyBub3QgbWVudGlvbmVkIG9yIGlmIHRoZSB2YWx1ZSBpcyB1bmtub3duLCB0aGVuCisJbWljYmlhcwlpcyBzZXQgdG8gMi4wVi4KKy0gSFBWREQtc3VwcGx5LCBTUFJWREQtc3VwcGx5LCBTUExWREQtc3VwcGx5LCBBVkRELXN1cHBseSwgSU9WREQtc3VwcGx5LAorICBEVkRELXN1cHBseSA6IHBvd2VyIHN1cHBsaWVzIGZvciB0aGUgZGV2aWNlIGFzIGNvdmVyZWQgaW4KKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CisKK0NPREVDIG91dHB1dCBwaW5zOgorICAqIEhQTAorICAqIEhQUgorICAqIFNQTCwgZGV2aWNlcyB3aXRoIHN0ZXJlbyBzcGVha2VyIGFtcAorICAqIFNQUiwgZGV2aWNlcyB3aXRoIHN0ZXJlbyBzcGVha2VyIGFtcAorICAqIFNQSywgZGV2aWNlcyB3aXRoIG1vbm8gc3BlYWtlciBhbXAKKyAgKiBNSUNCSUFTCisKK0NPREVDIGlucHV0IHBpbnM6CisgICogTUlDMUxQCisgICogTUlDMVJQCisgICogTUlDMUxNCisKK1RoZSBwaW5zIGNhbiBiZSB1c2VkIGluIHJlZmVycmluZyBzb3VuZCBub2RlJ3MgYXVkaW8tcm91dGluZyBwcm9wZXJ0eS4KKworRXhhbXBsZToKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LW1pY2JpYXMuaD4KKwordGx2MzIwYWljMzF4eDogdGx2MzIwYWljMzF4eEAxOCB7CisJY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMTF4IjsKKwlyZWcgPSA8MHgxOD47CisKKwlhaTMxeHgtbWljYmlhcy12ZyA9IDxNSUNCSUFTX09GRj47CisKKwlIUFZERC1zdXBwbHkgPSA8JnJlZ3VsYXRvcj47CisJU1BSVkRELXN1cHBseSA9IDwmcmVndWxhdG9yPjsKKwlTUExWREQtc3VwcGx5ID0gPCZyZWd1bGF0b3I+OworCUFWREQtc3VwcGx5ID0gPCZyZWd1bGF0b3I+OworCUlPVkRELXN1cHBseSA9IDwmcmVndWxhdG9yPjsKKwlEVkRELXN1cHBseSA9IDwmcmVndWxhdG9yPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzJ4NC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzJ4NC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyNzQxYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMng0LnR4dApAQCAtMCwwICsxLDMwIEBACitUZXhhcyBJbnN0cnVtZW50cyAtIHRsdjMyMGFpYzMyeDQgQ29kZWMgbW9kdWxlCisKK1RoZSB0bHYzMjBhaWMzMng0IHNlcmlhbCBjb250cm9sIGJ1cyBjb21tdW5pY2F0ZXMgdGhyb3VnaCBJMkMgcHJvdG9jb2xzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLHRsdjMyMGFpYzMyeDQiCisgLSByZWc6IEkyQyBzbGF2ZSBhZGRyZXNzCisgLSBzdXBwbHktKjogUmVxdWlyZWQgc3VwcGx5IHJlZ3VsYXRvcnMgYXJlOgorICAgICJpb3YiIC0gZGlnaXRhbCBJTyBwb3dlciBzdXBwbHkKKyAgICAibGRvaW4iIC0gTERPIHBvd2VyIHN1cHBseQorICAgICJkdiIgLSBEaWdpdGFsIGNvcmUgcG93ZXIgc3VwcGx5CisgICAgImF2IiAtIEFuYWxvZyBjb3JlIHBvd2VyIHN1cHBseQorICAgIElmIHlvdSBzdXBwbHkgbGRvaW4sIGR2IGFuZCBhdiBhcmUgb3B0aW9uYWwuIE90aGVyd2lzZSB0aGV5IGFyZSByZXF1aXJlZAorICAgU2VlIHJlZ3VsYXRvci9yZWd1bGF0b3IudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXRhaWxlZCBiaW5kaW5nCisgICBmb3JtYXQuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSByZXNldC1ncGlvczogUmVzZXQtR1BJTyBwaGFuZGxlIHdpdGggYXJncyBhcyBkZXNjcmliZWQgaW4gZ3Bpby9ncGlvLnR4dAorIC0gY2xvY2tzL2Nsb2NrLW5hbWVzOiBDbG9jayBuYW1lZCAnbWNsaycgZm9yIHRoZSBtYXN0ZXIgY2xvY2sgb2YgdGhlIGNvZGVjLgorICAgU2VlIGNsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldGFpbGVkIGZvcm1hdC4KKworCitFeGFtcGxlOgorCitjb2RlYzogdGx2MzIwYWljMzJ4NEAxOCB7CisJY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMng0IjsKKwlyZWcgPSA8MHgxOD47CisJY2xvY2tzID0gPCZjbGtzIDIwMT47CisJY2xvY2stbmFtZXMgPSAibWNsayI7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzN4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzeC50eHQKaW5kZXggOWQ4ZWExNC4uNWU2MDQwYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzN4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljM3gudHh0CkBAIC02LDcgKzYsNiBAQAogCiAtIGNvbXBhdGlibGUgLSAic3RyaW5nIiAtIE9uZSBvZjoKICAgICAidGksdGx2MzIwYWljM3giIC0gR2VuZXJpYyBUTFYzMjBBSUMzeCBkZXZpY2UKLSAgICAidGksdGx2MzIwYWljMzJ4NCIgLSBUTFYzMjBBSUMzMng0CiAgICAgInRpLHRsdjMyMGFpYzMzIiAtIFRMVjMyMEFJQzMzCiAgICAgInRpLHRsdjMyMGFpYzMwMDciIC0gVExWMzIwQUlDMzAwNwogICAgICJ0aSx0bHYzMjBhaWMzMTA2IiAtIFRMVjMyMEFJQzMxMDYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93aWRnZXRzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93aWRnZXRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRlNWJhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dpZGdldHMudHh0CkBAIC0wLDAgKzEsMjAgQEAKK1dpZGdldHM6CisKK1RoaXMgbWFpbmx5IHNwZWNpZmllcyBhdWRpbyBvZmYtY29kZWMgREFQTSB3aWRnZXRzLgorCitFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzIGluIERUOgorCisJInRlbXBsYXRlLXduYW1lIiwgInVzZXItc3VwcGxpZWQtd25hbWUiCisKK1RoZSAidGVtcGxhdGUtd25hbWUiIGJlaW5nIHRoZSB0ZW1wbGF0ZSB3aWRnZXQgbmFtZSBhbmQgY3VycmVudGx5IGluY2x1ZGVzOgorIk1pY3JvcGhvbmUiLCAiTGluZSIsICJIZWFkcGhvbmUiIGFuZCAiU3BlYWtlciIuCisKK1RoZSAidXNlci1zdXBwbGllZC13bmFtZSIgYmVpbmcgdGhlIHVzZXIgc3BlY2lmaWVkIHdpZGdldCBuYW1lLgorCitGb3IgaW5zdGFuY2U6CisJc2ltcGxlLWF1ZGlvLXdpZGdldHMgPQorCQkiTWljcm9waG9uZSIsICJNaWNyb3Bob25lIEphY2siLAorCQkiTGluZSIsICJMaW5lIEluIEphY2siLAorCQkiTGluZSIsICJMaW5lIE91dCBKYWNrIiwKKwkJIkhlYWRwaG9uZSIsICJIZWFkcGhvbmUgSmFjayIsCisJCSJTcGVha2VyIiwgIlNwZWFrZXIgRXh0ZXJuYWwiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9lZm0zMi1zcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9lZm0zMi1zcGkudHh0CmluZGV4IGE1OTBjYTUuLjhmMDgxYzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvZWZtMzItc3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2VmbTMyLXNwaS50eHQKQEAgLTMsMjQgKzMsMjQgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtICNhZGRyZXNzLWNlbGxzOiBzZWUgc3BpLWJ1cy50eHQKIC0gI3NpemUtY2VsbHM6IHNlZSBzcGktYnVzLnR4dAotLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImVmbTMyLHNwaSIKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJlbmVyZ3ltaWNybyxlZm0zMi1zcGkiCiAtIHJlZzogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGNvbnRyb2xsZXIKIC0gaW50ZXJydXB0czogcGFpciBzcGVjaWZ5aW5nIHJ4IGFuZCB0eCBpcnEKIC0gY2xvY2tzOiBwaGFuZGxlIHRvIHRoZSBzcGkgY2xvY2sKIC0gY3MtZ3Bpb3M6IHNlZSBzcGktYnVzLnR4dAotLSBsb2NhdGlvbjogVmFsdWUgdG8gd3JpdGUgdG8gdGhlIFJPVVRFIHJlZ2lzdGVyJ3MgTE9DQVRJT04gYml0ZmllbGQgdG8gY29uZmlndXJlIHRoZSBwaW5tdXggZm9yIHRoZSBkZXZpY2UsIHNlZSBkYXRhc2hlZXQgZm9yIHZhbHVlcy4KKy0gZWZtMzIsbG9jYXRpb246IFZhbHVlIHRvIHdyaXRlIHRvIHRoZSBST1VURSByZWdpc3RlcidzIExPQ0FUSU9OIGJpdGZpZWxkIHRvIGNvbmZpZ3VyZSB0aGUgcGlubXV4IGZvciB0aGUgZGV2aWNlLCBzZWUgZGF0YXNoZWV0IGZvciB2YWx1ZXMuCiAKIEV4YW1wbGU6CiAKIHNwaTE6IHNwaUAweDQwMDBjNDAwIHsgLyogVVNBUlQxICovCiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MD47Ci0JY29tcGF0aWJsZSA9ICJlZm0zMixzcGkiOworCWNvbXBhdGlibGUgPSAiZW5lcmd5bWljcm8sZWZtMzItc3BpIjsKIAlyZWcgPSA8MHg0MDAwYzQwMCAweDQwMD47CiAJaW50ZXJydXB0cyA9IDwxNSAxNj47CiAJY2xvY2tzID0gPCZjbXUgMjA+OwogCWNzLWdwaW9zID0gPCZncGlvIDUxIDE+OyAvLyBEMwotCWxvY2F0aW9uID0gPDE+OworCWVmbTMyLGxvY2F0aW9uID0gPDE+OwogCXN0YXR1cyA9ICJvayI7CiAKIAlrczg4NTFAMCB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3Fjb20sc3BpLXF1cC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3Fjb20sc3BpLXF1cC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyYTI2OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvcWNvbSxzcGktcXVwLnR4dApAQCAtMCwwICsxLDg1IEBACitRdWFsY29tbSBVbml2ZXJzYWwgUGVyaXBoZXJhbCAoUVVQKSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkKKworVGhlIFFVUCBjb3JlIGlzIGFuIEFIQiBzbGF2ZSB0aGF0IHByb3ZpZGVzIGEgY29tbW9uIGRhdGEgcGF0aCAoYW4gb3V0cHV0IEZJRk8KK2FuZCBhbiBpbnB1dCBGSUZPKSBmb3Igc2VyaWFsIHBlcmlwaGVyYWwgaW50ZXJmYWNlIChTUEkpIG1pbmktY29yZS4KKworU1BJIGluIG1hc3RlciBtb2RlIHN1cHBvcnRzIHVwIHRvIDUwTUh6LCB1cCB0byBmb3VyIGNoaXAgc2VsZWN0cywgcHJvZ3JhbW1hYmxlCitkYXRhIHBhdGggZnJvbSA0IGJpdHMgdG8gMzIgYml0cyBhbmQgbnVtZXJvdXMgcHJvdG9jb2wgdmFyaWFudHMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICAgICBTaG91bGQgY29udGFpbiAicWNvbSxzcGktcXVwLXYyLjEuMSIgb3IgInFjb20sc3BpLXF1cC12Mi4yLjEiCistIHJlZzogICAgICAgICAgICBTaG91bGQgY29udGFpbiBiYXNlIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGgKKy0gaW50ZXJydXB0czogICAgIEludGVycnVwdCBudW1iZXIgdXNlZCBieSB0aGlzIGNvbnRyb2xsZXIKKworLSBjbG9ja3M6ICAgICAgICAgU2hvdWxkIGNvbnRhaW4gdGhlIGNvcmUgY2xvY2sgYW5kIHRoZSBBSEIgY2xvY2suCistIGNsb2NrLW5hbWVzOiAgICBTaG91bGQgYmUgImNvcmUiIGZvciB0aGUgY29yZSBjbG9jayBhbmQgImlmYWNlIiBmb3IgdGhlCisgICAgICAgICAgICAgICAgICBBSEIgY2xvY2suCisKKy0gI2FkZHJlc3MtY2VsbHM6IE51bWJlciBvZiBjZWxscyByZXF1aXJlZCB0byBkZWZpbmUgYSBjaGlwIHNlbGVjdAorICAgICAgICAgICAgICAgICAgYWRkcmVzcyBvbiB0aGUgU1BJIGJ1cy4gU2hvdWxkIGJlIHNldCB0byAxLgorLSAjc2l6ZS1jZWxsczogICAgU2hvdWxkIGJlIHplcm8uCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHNwaS1tYXgtZnJlcXVlbmN5OiBTcGVjaWZpZXMgbWF4aW11bSBTUEkgY2xvY2sgZnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgVW5pdHMgLSBIei4gRGVmaW5pdGlvbiBhcyBwZXIKKyAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKworU1BJIHNsYXZlIG5vZGVzIG11c3QgYmUgY2hpbGRyZW4gb2YgdGhlIFNQSSBtYXN0ZXIgbm9kZSBhbmQgY2FuIGNvbnRhaW4KK3Byb3BlcnRpZXMgZGVzY3JpYmVkIGluIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKworRXhhbXBsZToKKworCXNwaV84OiBzcGlAZjk5NjQwMDAgeyAvKiBCTFNQMiBRVVAyICovCisKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNwaS1xdXAtdjIiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCXJlZyA9IDwweGY5OTY0MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MCAxMDIgMD47CisJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDE5MjAwMDAwPjsKKworCQljbG9ja3MgPSA8JmdjYyBHQ0NfQkxTUDJfUVVQMl9TUElfQVBQU19DTEs+LCA8JmdjYyBHQ0NfQkxTUDJfQUhCX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImNvcmUiLCAiaWZhY2UiOworCisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwmc3BpOF9kZWZhdWx0PjsKKworCQlkZXZpY2VAMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAyMi1kdW1teSI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDA+OyAvKiBDaGlwIHNlbGVjdCAwICovCisJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDwxOTIwMDAwMD47CisJCQlzcGktY3BvbDsKKwkJfTsKKworCQlkZXZpY2VAMSB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAyMi1kdW1teSI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDE+OyAvKiBDaGlwIHNlbGVjdCAxICovCisJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw5NjAwMDAwPjsKKwkJCXNwaS1jcGhhOworCQl9OworCisJCWRldmljZUAyIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDIyLWR1bW15IjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8Mj47IC8qIENoaXAgc2VsZWN0IDIgKi8KKwkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDE5MjAwMDAwPjsKKwkJCXNwaS1jcG9sOworCQkJc3BpLWNwaGE7CisJCX07CisKKwkJZGV2aWNlQDMgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMjItZHVtbXkiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwzPjsgLyogQ2hpcCBzZWxlY3QgMyAqLworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MTkyMDAwMDA+OworCQkJc3BpLWNwb2w7CisJCQlzcGktY3BoYTsKKwkJCXNwaS1jcy1oaWdoOworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLWhzcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zaC1oc3BpLnR4dAppbmRleCAzMGI1N2IxLi4zMTliYWQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLWhzcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtaHNwaS50eHQKQEAgLTEsNyArMSwyOSBAQAogUmVuZXNhcyBIU1BJLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlIDogCSJyZW5lc2FzLGhzcGkiCi0tIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKLS0gaW50ZXJydXB0cyA6IGludGVycnVwdCBsaW5lIHVzZWQgYnkgSFNQSQorLSBjb21wYXRpYmxlICAgICAgIDogInJlbmVzYXMsaHNwaS08c29jdHlwZT4iLCAicmVuZXNhcyxoc3BpIiBhcyBmYWxsYmFjay4KKwkJICAgICBFeGFtcGxlcyB3aXRoIHNvY3R5cGVzIGFyZToKKwkJICAgICAgIC0gInJlbmVzYXMsaHNwaS1yOGE3Nzc4IiAoUi1DYXIgTTEpCisJCSAgICAgICAtICJyZW5lc2FzLGhzcGktcjhhNzc3OSIgKFItQ2FyIEgxKQorLSByZWcgICAgICAgICAgICAgIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHQtcGFyZW50IDogVGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0CisJCSAgICAgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UKKy0gaW50ZXJydXB0cyAgICAgICA6IEludGVycnVwdCBzcGVjaWZpZXIKKy0gI2FkZHJlc3MtY2VsbHMgICA6IE11c3QgYmUgPDE+CistICNzaXplLWNlbGxzICAgICAgOiBNdXN0IGJlIDwwPgorCitQaW5jdHJsIHByb3BlcnRpZXMgbWlnaHQgYmUgbmVlZGVkLCB0b28uICBTZWUKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3JlbmVzYXMsKi4KKworRXhhbXBsZToKKworCWhzcGkwOiBzcGlAZmZmYzcwMDAgeworCQljb21wYXRpYmxlID0gInJlbmVzYXMsaHNwaS1yOGE3Nzc4IiwgInJlbmVzYXMsaHNwaSI7CisJCXJlZyA9IDwweGZmZmM3MDAwIDB4MTg+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OworCQlpbnRlcnJ1cHRzID0gPDAgNjMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NoLW1zaW9mLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtbXNpb2YudHh0CmluZGV4IGU2MjIyMTAuLmYyNGJhZjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtbXNpb2YudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc2gtbXNpb2YudHh0CkBAIC0xLDEyICsxLDQwIEBACiBSZW5lc2FzIE1TSU9GIHNwaSBjb250cm9sbGVyCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUgOiAJInJlbmVzYXMsc2gtbXNpb2YiIGZvciBTdXBlckggb3IKLQkJInJlbmVzYXMsc2gtbW9iaWxlLW1zaW9mIiBmb3IgU0ggTW9iaWxlIHNlcmllcwotLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCi0tIGludGVycnVwdHMgOiBpbnRlcnJ1cHQgbGluZSB1c2VkIGJ5IE1TSU9GCistIGNvbXBhdGlibGUgICAgICAgICAgIDogInJlbmVzYXMsbXNpb2YtPHNvY3R5cGU+IiBmb3IgU29DcywKKwkJCSAicmVuZXNhcyxzaC1tc2lvZiIgZm9yIFN1cGVySCwgb3IKKwkJCSAicmVuZXNhcyxzaC1tb2JpbGUtbXNpb2YiIGZvciBTSCBNb2JpbGUgc2VyaWVzLgorCQkJIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgorCQkJICJyZW5lc2FzLG1zaW9mLXI4YTc3OTAiIChSLUNhciBIMikKKwkJCSAicmVuZXNhcyxtc2lvZi1yOGE3NzkxIiAoUi1DYXIgTTIpCistIHJlZyAgICAgICAgICAgICAgICAgIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHQtcGFyZW50ICAgICA6IFRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorCQkJIHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCistIGludGVycnVwdHMgICAgICAgICAgIDogSW50ZXJydXB0IHNwZWNpZmllcgorLSAjYWRkcmVzcy1jZWxscyAgICAgICA6IE11c3QgYmUgPDE+CistICNzaXplLWNlbGxzICAgICAgICAgIDogTXVzdCBiZSA8MD4KIAogT3B0aW9uYWwgcHJvcGVydGllczoKLS0gbnVtLWNzCQk6IHRvdGFsIG51bWJlciBvZiBjaGlwLXNlbGVjdHMKLS0gcmVuZXNhcyx0eC1maWZvLXNpemUJOiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgdHggZmlmbyBzaXplIGdpdmVuIGluIHdvcmRzCi0tIHJlbmVzYXMscngtZmlmby1zaXplCTogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJ4IGZpZm8gc2l6ZSBnaXZlbiBpbiB3b3JkcworLSBjbG9ja3MgICAgICAgICAgICAgICA6IE11c3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb25hbCBjbG9jay4KKy0gbnVtLWNzICAgICAgICAgICAgICAgOiBUb3RhbCBudW1iZXIgb2YgY2hpcC1zZWxlY3RzIChkZWZhdWx0IGlzIDEpCisKK09wdGlvbmFsIHByb3BlcnRpZXMsIGRlcHJlY2F0ZWQgZm9yIHNvY3R5cGUtc3BlY2lmaWMgYmluZGluZ3M6CistIHJlbmVzYXMsdHgtZmlmby1zaXplIDogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHR4IGZpZm8gc2l6ZSBnaXZlbiBpbiB3b3JkcworCQkJIChkZWZhdWx0IGlzIDY0KQorLSByZW5lc2FzLHJ4LWZpZm8tc2l6ZSA6IE92ZXJyaWRlcyB0aGUgZGVmYXVsdCByeCBmaWZvIHNpemUgZ2l2ZW4gaW4gd29yZHMKKwkJCSAoZGVmYXVsdCBpcyA2NCwgb3IgMjU2IG9uIFItQ2FyIEgyIGFuZCBNMikKKworUGluY3RybCBwcm9wZXJ0aWVzIG1pZ2h0IGJlIG5lZWRlZCwgdG9vLiAgU2VlCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLCouCisKK0V4YW1wbGU6CisKKwltc2lvZjA6IHNwaUBlNmUyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicmVuZXNhcyxtc2lvZi1yOGE3NzkxIjsKKwkJcmVnID0gPDAgMHhlNmUyMDAwMCAwIDB4MDA2ND47CisJCWludGVycnVwdHMgPSA8MCAxNTYgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmbXN0cDBfY2xrcyBSOEE3NzkxX0NMS19NU0lPRjA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWZzbC1kc3BpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWZzbC1kc3BpLnR4dAppbmRleCBhMWZiMzAzLi41Mzc2ZGU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1mc2wtZHNwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktZnNsLWRzcGkudHh0CkBAIC0xMCw2ICsxMCw3IEBACiAtIHBpbmN0cmwtbmFtZXM6IG11c3QgY29udGFpbiBhICJkZWZhdWx0IiBlbnRyeS4KIC0gc3BpLW51bS1jaGlwc2VsZWN0cyA6IHRoZSBudW1iZXIgb2YgdGhlIGNoaXBzZWxlY3Qgc2lnbmFscy4KIC0gYnVzLW51bSA6IHRoZSBzbGF2ZSBjaGlwIGNoaXBzZWxlY3Qgc2lnbmFsIG51bWJlci4KKy0gYmlnLWVuZGlhbiA6IGlmIERTUEkgbW9kdWRsZSBpcyBiaWcgZW5kaWFuLCB0aGUgYm9vbCB3aWxsIGJlIHNldCBpbiBub2RlLgogRXhhbXBsZToKIAogZHNwaTBANDAwMmMwMDAgewpAQCAtMjQsNiArMjUsNyBAQAogCWJ1cy1udW0gPSA8MD47CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfZHNwaTBfMT47CisJYmlnLWVuZGlhbjsKIAlzdGF0dXMgPSAib2theSI7CiAKIAlzZmxhc2g6IGF0MjZkZjA4MWFAMCB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1yc3BpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXJzcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1N2Q4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1yc3BpLnR4dApAQCAtMCwwICsxLDYxIEBACitEZXZpY2UgdHJlZSBjb25maWd1cmF0aW9uIGZvciBSZW5lc2FzIFJTUEkvUVNQSSBkcml2ZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgICA6IEZvciBSZW5lc2FzIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSBvbiBsZWdhY3kgU0g6CisJCSAgICAgInJlbmVzYXMscnNwaS08c29jdHlwZT4iLCAicmVuZXNhcyxyc3BpIiBhcyBmYWxsYmFjay4KKwkJICAgICBGb3IgUmVuZXNhcyBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2Ugb24gUlovQTFIOgorCQkgICAgICJyZW5lc2FzLHJzcGktPHNvY3R5cGU+IiwgInJlbmVzYXMscnNwaS1yeiIgYXMgZmFsbGJhY2suCisJCSAgICAgRm9yIFF1YWQgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIG9uIFItQ2FyIEdlbjI6CisJCSAgICAgInJlbmVzYXMscXNwaS08c29jdHlwZT4iLCAicmVuZXNhcyxxc3BpIiBhcyBmYWxsYmFjay4KKwkJICAgICBFeGFtcGxlcyB3aXRoIHNvY3R5cGVzIGFyZToKKwkJICAgICAgICAtICJyZW5lc2FzLHJzcGktc2g3NzU3IiAoU0gpCisJCQktICJyZW5lc2FzLHJzcGktcjdzNzIxMDAiIChSWi9BMUgpCisJCQktICJyZW5lc2FzLHFzcGktcjhhNzc5MCIgKFItQ2FyIEgyKQorCQkJLSAicmVuZXNhcyxxc3BpLXI4YTc3OTEiIChSLUNhciBNMikKKy0gcmVnICAgICAgICAgICAgICA6IEFkZHJlc3Mgc3RhcnQgYW5kIGFkZHJlc3MgcmFuZ2Ugc2l6ZSBvZiB0aGUgZGV2aWNlCistIGludGVycnVwdHMgICAgICAgOiBBIGxpc3Qgb2YgaW50ZXJydXB0LXNwZWNpZmllcnMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpbgorCQkgICAgIGludGVycnVwdC1uYW1lcy4KKwkJICAgICBJZiBpbnRlcnJ1cHQtbmFtZXMgaXMgbm90IHByZXNlbnQsIGFuIGludGVycnVwdCBzcGVjaWZpZXIKKwkJICAgICBmb3IgYSBzaW5nbGUgbXV4ZWQgaW50ZXJydXB0LgorLSBpbnRlcnJ1cHQtbmFtZXMgIDogQSBsaXN0IG9mIGludGVycnVwdCBuYW1lcy4gU2hvdWxkIGNvbnRhaW4gKGlmIHByZXNlbnQpOgorCQkgICAgICAgLSAiZXJyb3IiIGZvciBTUEVJLAorCQkgICAgICAgLSAicngiIGZvciBTUFJJLAorCQkgICAgICAgLSAidHgiIHRvIFNQVEksCisJCSAgICAgICAtICJtdXgiIGZvciBhIHNpbmdsZSBtdXhlZCBpbnRlcnJ1cHQuCistIGludGVycnVwdC1wYXJlbnQgOiBUaGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoYXQKKwkJICAgICBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZS4KKy0gbnVtLWNzCSAgIDogTnVtYmVyIG9mIGNoaXAgc2VsZWN0cy4gU29tZSBSU1BJIGNvcmVzIGhhdmUgbW9yZSB0aGFuIDEuCistICNhZGRyZXNzLWNlbGxzICAgOiBNdXN0IGJlIDwxPgorLSAjc2l6ZS1jZWxscyAgICAgIDogTXVzdCBiZSA8MD4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2xvY2tzICAgICAgICAgICA6IE11c3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb25hbCBjbG9jay4KKworUGluY3RybCBwcm9wZXJ0aWVzIG1pZ2h0IGJlIG5lZWRlZCwgdG9vLiAgU2VlCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLCouCisKK0V4YW1wbGVzOgorCisJc3BpMDogc3BpQGU4MDBjODAwIHsKKwkJY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcGktcjdzNzIxMDAiLCAicmVuZXNhcyxyc3BpLXJ6IjsKKwkJcmVnID0gPDB4ZTgwMGM4MDAgMHgyND47CisJCWludGVycnVwdHMgPSA8MCAyMzggSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkgICAgIDwwIDIzOSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCSAgICAgPDAgMjQwIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAiZXJyb3IiLCAicngiLCAidHgiOworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OworCQludW0tY3MgPSA8MT47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwl9OworCisJc3BpOiBzcGlAZTZiMTAwMDAgeworCQljb21wYXRpYmxlID0gInJlbmVzYXMscXNwaS1yOGE3NzkxIiwgInJlbmVzYXMscXNwaSI7CisJCXJlZyA9IDwwIDB4ZTZiMTAwMDAgMCAweDJjPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwkJaW50ZXJydXB0cyA9IDwwIDE4NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJY2xvY2tzID0gPCZtc3RwOV9jbGtzIFI4QTc3OTFfQ0xLX1FTUElfTU9EPjsKKwkJbnVtLWNzID0gPDE+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXN1bjRpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXN1bjRpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTgyN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc3VuNGkudHh0CkBAIC0wLDAgKzEsMjQgQEAKK0FsbHdpbm5lciBBMTAgU1BJIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJhbGx3aW5uZXIsc3VuNC1hMTAtc3BpIi4KKy0gcmVnOiBTaG91bGQgY29udGFpbiByZWdpc3RlciBsb2NhdGlvbiBhbmQgbGVuZ3RoLgorLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBpbnRlcnJ1cHQuCistIGNsb2NrczogcGhhbmRsZSB0byB0aGUgY2xvY2tzIGZlZWRpbmcgdGhlIFNQSSBjb250cm9sbGVyLiBUd28gYXJlCisgICAgICAgICAgbmVlZGVkOgorICAtICJhaGIiOiB0aGUgZ2F0ZWQgQUhCIHBhcmVudCBjbG9jaworICAtICJtb2QiOiB0aGUgcGFyZW50IG1vZHVsZSBjbG9jaworLSBjbG9jay1uYW1lczogTXVzdCBjb250YWluIHRoZSBjbG9jayBuYW1lcyBkZXNjcmliZWQganVzdCBhYm92ZQorCitFeGFtcGxlOgorCitzcGkxOiBzcGlAMDFjMDYwMDAgeworCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1zcGkiOworCXJlZyA9IDwweDAxYzA2MDAwIDB4MTAwMD47CisJaW50ZXJydXB0cyA9IDwxMT47CisJY2xvY2tzID0gPCZhaGJfZ2F0ZXMgMjE+LCA8JnNwaTFfY2xrPjsKKwljbG9jay1uYW1lcyA9ICJhaGIiLCAibW9kIjsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXN1bjZpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXN1bjZpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRlNzNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc3VuNmkudHh0CkBAIC0wLDAgKzEsMjQgQEAKK0FsbHdpbm5lciBBMzEgU1BJIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJhbGx3aW5uZXIsc3VuNmktYTMxLXNwaSIuCistIHJlZzogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXIgbG9jYXRpb24gYW5kIGxlbmd0aC4KKy0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gaW50ZXJydXB0LgorLSBjbG9ja3M6IHBoYW5kbGUgdG8gdGhlIGNsb2NrcyBmZWVkaW5nIHRoZSBTUEkgY29udHJvbGxlci4gVHdvIGFyZQorICAgICAgICAgIG5lZWRlZDoKKyAgLSAiYWhiIjogdGhlIGdhdGVkIEFIQiBwYXJlbnQgY2xvY2sKKyAgLSAibW9kIjogdGhlIHBhcmVudCBtb2R1bGUgY2xvY2sKKy0gY2xvY2stbmFtZXM6IE11c3QgY29udGFpbiB0aGUgY2xvY2sgbmFtZXMgZGVzY3JpYmVkIGp1c3QgYWJvdmUKKy0gcmVzZXRzOiBwaGFuZGxlIHRvIHRoZSByZXNldCBjb250cm9sbGVyIGFzc2VydGluZyB0aGlzIGRldmljZSBpbgorICAgICAgICAgIHJlc2V0CisKK0V4YW1wbGU6CisKK3NwaTE6IHNwaUAwMWM2OTAwMCB7CisJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxLXNwaSI7CisJcmVnID0gPDB4MDFjNjkwMDAgMHgxMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDAgNjYgND47CisJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDIxPiwgPCZzcGkxX2Nsaz47CisJY2xvY2stbmFtZXMgPSAiYWhiIiwgIm1vZCI7CisJcmVzZXRzID0gPCZhaGIxX3JzdCAyMT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS14dGVuc2EteHRmcGdhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmViZTJiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS50eHQKQEAgLTAsMCArMSw5IEBACitDYWRlbmNlIFh0ZW5zYSBYVEZQR0EgcGxhdGZvcm0gU1BJIGNvbnRyb2xsZXIuCisKK1RoaXMgc2ltcGxlIFNQSSBtYXN0ZXIgY29udHJvbGxlciBpcyBidWlsdCBpbnRvIHh0ZnBnYSBiaXRzdHJlYW1zIGFuZCBpcyB1c2VkCit0byBjb250cm9sIGRhdWdodGVyYm9hcmQgYXVkaW8gY29kZWMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiY2Rucyx4dGZwZ2Etc3BpIi4KKy0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCisgIHJlZ2lvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcG1pL3Fjb20sc3BtaS1wbWljLWFyYi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9xY29tLHNwbWktcG1pYy1hcmIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNWQwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9xY29tLHNwbWktcG1pYy1hcmIudHh0CkBAIC0wLDAgKzEsNjEgQEAKK1F1YWxjb21tIFNQTUkgQ29udHJvbGxlciAoUE1JQyBBcmJpdGVyKQorCitUaGUgU1BNSSBQTUlDIEFyYml0ZXIgaXMgZm91bmQgb24gdGhlIFNuYXBkcmFnb24gODAwIFNlcmllcy4gIEl0IGlzIGFuIFNQTUkKK2NvbnRyb2xsZXIgd2l0aCB3cmFwcGluZyBhcmJpdHJhdGlvbiBsb2dpYyB0byBhbGxvdyBmb3IgbXVsdGlwbGUgb24tY2hpcAorZGV2aWNlcyB0byBjb250cm9sIGEgc2luZ2xlIFNQTUkgbWFzdGVyLgorCitUaGUgUE1JQyBBcmJpdGVyIGNhbiBhbHNvIGFjdCBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlciwgcHJvdmlkaW5nIGludGVycnVwdHMKK3RvIHNsYXZlIGRldmljZXMuCisKK1NlZSBzcG1pLnR4dCBmb3IgdGhlIGdlbmVyaWMgU1BNSSBjb250cm9sbGVyIGJpbmRpbmcgcmVxdWlyZW1lbnRzIGZvciBjaGlsZAorbm9kZXMuCisKK1NlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaW50ZXJydXB0cy50eHQgZm9yCitnZW5lcmljIGludGVycnVwdCBjb250cm9sbGVyIGJpbmRpbmcgZG9jdW1lbnRhdGlvbi4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAicWNvbSxzcG1pLXBtaWMtYXJiIi4KKy0gcmVnLW5hbWVzICA6IG11c3QgY29udGFpbjoKKyAgICAgImNvcmUiIC0gY29yZSByZWdpc3RlcnMKKyAgICAgImludHIiIC0gaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisgICAgICJjbmZnIiAtIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCistIHJlZyA6IGFkZHJlc3MgKyBzaXplIHBhaXJzIGRlc2NyaWJpbmcgdGhlIFBNSUMgYXJiIHJlZ2lzdGVyIHNldHM7IG9yZGVyIG11c3QKKyAgICAgICAgY29ycmVzcG9uZCB3aXRoIHRoZSBvcmRlciBvZiBlbnRyaWVzIGluIHJlZy1uYW1lcworLSAjYWRkcmVzcy1jZWxscyA6IG11c3QgYmUgc2V0IHRvIDIKKy0gI3NpemUtY2VsbHMgOiBtdXN0IGJlIHNldCB0byAwCistIHFjb20sZWUgOiBpbmRpY2F0ZXMgdGhlIGFjdGl2ZSBFeGVjdXRpb24gRW52aXJvbm1lbnQgaWRlbnRpZmllciAoMC01KQorLSBxY29tLGNoYW5uZWwgOiB3aGljaCBvZiB0aGUgUE1JQyBBcmIgcHJvdmlkZWQgY2hhbm5lbHMgdG8gdXNlIGZvciBhY2Nlc3NlcyAoMC01KQorLSBpbnRlcnJ1cHRzIDogaW50ZXJydXB0IGxpc3QgZm9yIHRoZSBQTUlDIEFyYiBjb250cm9sbGVyLCBtdXN0IGNvbnRhaW4gYQorICAgICAgICAgICAgICAgc2luZ2xlIGludGVycnVwdCBlbnRyeSBmb3IgdGhlIHBlcmlwaGVyYWwgaW50ZXJydXB0CistIGludGVycnVwdC1uYW1lcyA6IGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IG5hbWVzIGZvciB0aGUgaW50ZXJydXB0cworICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgaW4gdGhlICdpbnRlcnJ1cHRzJyBwcm9wZXJ0eSwgbXVzdCBjb250YWluOgorICAgICAicGVyaXBoX2lycSIgLSBzdW1tYXJ5IGludGVycnVwdCBmb3IgUE1JQyBwZXJpcGhlcmFscworLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6IGJvb2xlYW4gaW5kaWNhdG9yIHRoYXQgdGhlIFBNSUMgYXJiaXRlciBpcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSAjaW50ZXJydXB0LWNlbGxzIDogIG11c3QgYmUgc2V0IHRvIDQuIEludGVycnVwdHMgYXJlIHNwZWNpZmllZCBhcyBhIDQtdHVwbGU6CisgICAgY2VsbCAxOiBzbGF2ZSBJRCBmb3IgdGhlIHJlcXVlc3RlZCBpbnRlcnJ1cHQgKDAtMTUpCisgICAgY2VsbCAyOiBwZXJpcGhlcmFsIElEIGZvciByZXF1ZXN0ZWQgaW50ZXJydXB0ICgwLTI1NSkKKyAgICBjZWxsIDM6IHRoZSByZXF1ZXN0ZWQgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgKDAtNykKKyAgICBjZWxsIDQ6IGludGVycnVwdCBmbGFncyBpbmRpY2F0aW5nIGxldmVsLXNlbnNlIGluZm9ybWF0aW9uLCBhcyBkZWZpbmVkIGluCisgICAgICAgICAgICBkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pcnEuaAorCitFeGFtcGxlOgorCisJc3BtaSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzcG1pLXBtaWMtYXJiIjsKKwkJcmVnLW5hbWVzID0gImNvcmUiLCAiaW50ciIsICJjbmZnIjsKKwkJcmVnID0gPDB4ZmM0Y2YwMDAgMHgxMDAwPiwKKwkJICAgICAgPDB4ZmM0Y2IwMDAgMHgxMDAwPiwKKwkJICAgICAgPDB4ZmM0Y2EwMDAgMHgxMDAwPjsKKworCQlpbnRlcnJ1cHQtbmFtZXMgPSAicGVyaXBoX2lycSI7CisJCWludGVycnVwdHMgPSA8MCAxOTAgMD47CisKKwkJcWNvbSxlZSA9IDwwPjsKKwkJcWNvbSxjaGFubmVsID0gPDA+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDw0PjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvc3BtaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9zcG1pLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjJhNDJmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvc3BtaS50eHQKQEAgLTAsMCArMSw0MSBAQAorU3lzdGVtIFBvd2VyIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChTUE1JKSBDb250cm9sbGVyCisKK1RoaXMgZG9jdW1lbnQgZGVmaW5lcyBhIGdlbmVyaWMgc2V0IG9mIGJpbmRpbmdzIGZvciB1c2UgYnkgU1BNSSBjb250cm9sbGVycy4gIEEKK2NvbnRyb2xsZXIgaXMgbW9kZWxsZWQgaW4gZGV2aWNlIHRyZWUgYXMgYSBub2RlIHdpdGggemVybyBvciBtb3JlIGNoaWxkIG5vZGVzLAorZWFjaCByZXByZXNlbnRpbmcgYSB1bmlxdWUgc2xhdmUgb24gdGhlIGJ1cy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gI2FkZHJlc3MtY2VsbHMgOiBtdXN0IGJlIHNldCB0byAyCistICNzaXplLWNlbGxzIDogbXVzdCBiZSBzZXQgdG8gMAorCitDaGlsZCBub2RlczoKKworQW4gU1BNSSBjb250cm9sbGVyIG5vZGUgY2FuIGNvbnRhaW4gemVybyBvciBtb3JlIGNoaWxkIG5vZGVzIHJlcHJlc2VudGluZyBzbGF2ZQorZGV2aWNlcyBvbiB0aGUgYnVzLiAgQ2hpbGQgJ3JlZycgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGFzIGFuIGFkZHJlc3MsIHR5cGUKK3BhaXIuICBUaGUgYWRkcmVzcyBtdXN0IGJlIGluIHRoZSByYW5nZSAwLTE1ICg0IGJpdHMpLiAgVGhlIHR5cGUgbXVzdCBiZSBvbmUgb2YKK1NQTUlfVVNJRCAoMCkgb3IgU1BNSV9HU0lEICgxKSBmb3IgVW5pcXVlIFNsYXZlIElEIG9yIEdyb3VwIFNsYXZlIElEIHJlc3BlY3RpdmVseS4KK1RoZXNlIGFyZSB0aGUgaWRlbnRpZmllcnMgInN0YXRpY2FsbHkgYXNzaWduZWQgYnkgdGhlIHN5c3RlbSBpbnRlZ3JhdG9yIiwgYXMKK3BlciB0aGUgU1BNSSBzcGVjLgorCitFYWNoIGNoaWxkIG5vZGUgbXVzdCBoYXZlIG9uZSBhbmQgb25seSBvbmUgJ3JlZycgZW50cnkgb2YgdHlwZSBTUE1JX1VTSUQuCisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9zcG1pL3NwbWkuaD4KKworCXNwbWlALi4geworCQljb21wYXRpYmxlID0gIi4uLiI7CisJCXJlZyA9IDwuLi4+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA8MD47CisKKwkJY2hpbGRAMCB7CisJCQljb21wYXRpYmxlID0gIi4uLiI7CisJCQlyZWcgPSA8MCBTUE1JX1VTSUQ+OworCQl9OworCisJCWNoaWxkQDcgeworCQkJY29tcGF0aWJsZSA9ICIuLi4iOworCQkJcmVnID0gPDcgU1BNSV9VU0lECisJCQkgICAgICAgMyBTUE1JX0dTSUQ+OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2ZzbC1pbXgtZHJtLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vZnNsLWlteC1kcm0udHh0CmluZGV4IGI4NzZkNDkuLjNiZTVjZTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vZnNsLWlteC1kcm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vZnNsLWlteC1kcm0udHh0CkBAIC0xLDMgKzEsMjIgQEAKK0ZyZWVzY2FsZSBpLk1YIERSTSBtYXN0ZXIgZGV2aWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZnJlZXNjYWxlIGkuTVggRFJNIG1hc3RlciBkZXZpY2UgaXMgYSB2aXJ0dWFsIGRldmljZSBuZWVkZWQgdG8gbGlzdCBhbGwKK0lQVSBvciBvdGhlciBkaXNwbGF5IGludGVyZmFjZSBub2RlcyB0aGF0IGNvbXByaXNlIHRoZSBncmFwaGljcyBzdWJzeXN0ZW0uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiZnNsLGlteC1kaXNwbGF5LXN1YnN5c3RlbSIKKy0gcG9ydHM6IFNob3VsZCBjb250YWluIGEgbGlzdCBvZiBwaGFuZGxlcyBwb2ludGluZyB0byBkaXNwbGF5IGludGVyZmFjZSBwb3J0cworICBvZiBJUFUgZGV2aWNlcworCitleGFtcGxlOgorCitkaXNwbGF5LXN1YnN5c3RlbSB7CisJY29tcGF0aWJsZSA9ICJmc2wsZGlzcGxheS1zdWJzeXN0ZW0iOworCXBvcnRzID0gPCZpcHVfZGkwPjsKK307CisKKwogRnJlZXNjYWxlIGkuTVggSVBVdjMKID09PT09PT09PT09PT09PT09PT09CiAKQEAgLTcsMTggKzI2LDMxIEBACiAgIGRhdGFzaGVldAogLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBzeW5jIGludGVycnVwdCBhbmQgZXJyb3IgaW50ZXJydXB0LAogICBpbiB0aGlzIG9yZGVyLgotLSAjY3J0Yy1jZWxsczogMSwgU2VlIGJlbG93CiAtIHJlc2V0czogcGhhbmRsZSBwb2ludGluZyB0byB0aGUgc3lzdGVtIHJlc2V0IGNvbnRyb2xsZXIgYW5kCiAgICAgICAgICAgcmVzZXQgbGluZSBpbmRleCwgc2VlIHJlc2V0L2ZzbCxpbXgtc3JjLnR4dCBmb3IgZGV0YWlscworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gcG9ydEBbMC0zXTogUG9ydCBub2RlcyB3aXRoIGVuZHBvaW50IGRlZmluaXRpb25zIGFzIGRlZmluZWQgaW4KKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvLWludGVyZmFjZXMudHh0LgorICBQb3J0cyAwIGFuZCAxIHNob3VsZCBjb3JyZXNwb25kIHRvIENTSTAgYW5kIENTSTEsCisgIHBvcnRzIDIgYW5kIDMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gREkwIGFuZCBESTEsIHJlc3BlY3RpdmVseS4KIAogZXhhbXBsZToKIAogaXB1OiBpcHVAMTgwMDAwMDAgewotCSNjcnRjLWNlbGxzID0gPDE+OworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OwogCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWlwdSI7CiAJcmVnID0gPDB4MTgwMDAwMDAgMHgwODAwMDAwMDA+OwogCWludGVycnVwdHMgPSA8MTEgMTA+OwogCXJlc2V0cyA9IDwmc3JjIDI+OworCisJaXB1X2RpMDogcG9ydEAyIHsKKwkJcmVnID0gPDI+OworCisJCWlwdV9kaTBfZGlzcDA6IGVuZHBvaW50IHsKKwkJCXJlbW90ZS1lbmRwb2ludCA9IDwmZGlzcGxheV9pbj47CisJCX07CisJfTsKIH07CiAKIFBhcmFsbGVsIGRpc3BsYXkgc3VwcG9ydApAQCAtMjYsMTkgKzU4LDI1IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IgotLSBjcnRjOiB0aGUgY3J0YyB0aGlzIGRpc3BsYXkgaXMgY29ubmVjdGVkIHRvLCBzZWUgYmVsb3cKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGludGVyZmFjZV9waXhfZm10OiBIb3cgdGhpcyBkaXNwbGF5IGlzIGNvbm5lY3RlZCB0byB0aGUKLSAgY3J0Yy4gQ3VycmVudGx5IHN1cHBvcnRlZCB0eXBlczogInJnYjI0IiwgInJnYjU2NSIsICJiZ3I2NjYiCisgIGRpc3BsYXkgaW50ZXJmYWNlLiBDdXJyZW50bHkgc3VwcG9ydGVkIHR5cGVzOiAicmdiMjQiLCAicmdiNTY1IiwgImJncjY2NiIKIC0gZWRpZDogdmVyYmF0aW0gRURJRCBkYXRhIGJsb2NrIGRlc2NyaWJpbmcgYXR0YWNoZWQgZGlzcGxheS4KIC0gZGRjOiBwaGFuZGxlIGRlc2NyaWJpbmcgdGhlIGkyYyBidXMgaGFuZGxpbmcgdGhlIGRpc3BsYXkgZGF0YQogICBjaGFubmVsCistIHBvcnQ6IEEgcG9ydCBub2RlIHdpdGggZW5kcG9pbnQgZGVmaW5pdGlvbnMgYXMgZGVmaW5lZCBpbgorICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8taW50ZXJmYWNlcy50eHQuCiAKIGV4YW1wbGU6CiAKIGRpc3BsYXlAZGkwIHsKIAljb21wYXRpYmxlID0gImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSI7CiAJZWRpZCA9IFtlZGlkLWRhdGFdOwotCWNydGMgPSA8JmlwdSAwPjsKIAlpbnRlcmZhY2UtcGl4LWZtdCA9ICJyZ2IyNCI7CisKKwlwb3J0IHsKKwkJZGlzcGxheV9pbjogZW5kcG9pbnQgeworCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkwX2Rpc3AwPjsKKwkJfTsKKwl9OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vaGRtaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2hkbWkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzU2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2hkbWkudHh0CkBAIC0wLDAgKzEsNTggQEAKK0RldmljZS1UcmVlIGJpbmRpbmdzIGZvciBIRE1JIFRyYW5zbWl0dGVyCisKK0hETUkgVHJhbnNtaXR0ZXIKKz09PT09PT09PT09PT09PT0KKworVGhlIEhETUkgVHJhbnNtaXR0ZXIgaXMgYSBTeW5vcHN5cyBEZXNpZ25XYXJlIEhETUkgMS40IFRYIGNvbnRyb2xsZXIgSVAKK3dpdGggYWNjb21wYW55aW5nIFBIWSBJUC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtICNhZGRyZXNzLWNlbGxzIDogc2hvdWxkIGJlIDwxPgorIC0gI3NpemUtY2VsbHMgOiBzaG91bGQgYmUgPDA+CisgLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJmc2wsaW14NnEtaGRtaSIgb3IgImZzbCxpbXg2ZGwtaGRtaSIuCisgLSBncHIgOiBzaG91bGQgYmUgPCZncHI+LgorICAgVGhlIHBoYW5kbGUgcG9pbnRzIHRvIHRoZSBpb211eGMtZ3ByIHJlZ2lvbiBjb250YWluaW5nIHRoZSBIRE1JCisgICBtdWx0aXBsZXhlciBjb250cm9sIHJlZ2lzdGVyLgorIC0gY2xvY2tzLCBjbG9jay1uYW1lcyA6IHBoYW5kbGVzIHRvIHRoZSBIRE1JIGlhaGIgYW5kIGlzcmYgY2xvY2tzLCBhcyBkZXNjcmliZWQKKyAgIGluIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQgYW5kCisgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svaW14NnEtY2xvY2sudHh0LgorIC0gcG9ydEBbMC00XTogVXAgdG8gZm91ciBwb3J0IG5vZGVzIHdpdGggZW5kcG9pbnQgZGVmaW5pdGlvbnMgYXMgZGVmaW5lZCBpbgorICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvLWludGVyZmFjZXMudHh0LAorICAgY29ycmVzcG9uZGluZyB0byB0aGUgZm91ciBpbnB1dHMgdG8gdGhlIEhETUkgbXVsdGlwbGV4ZXIuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBkZGMtaTJjLWJ1czogcGhhbmRsZSBvZiBhbiBJMkMgY29udHJvbGxlciB1c2VkIGZvciBEREMgRURJRCBwcm9iaW5nCisKK2V4YW1wbGU6CisKKwlncHI6IGlvbXV4Yy1ncHJAMDIwZTAwMDAgeworCQkvKiAuLi4gKi8KKwl9OworCisgICAgICAgIGhkbWk6IGhkbWlAMDEyMDAwMCB7CisgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CisgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47CisgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtaGRtaSI7CisgICAgICAgICAgICAgICAgcmVnID0gPDB4MDAxMjAwMDAgMHg5MDAwPjsKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDAgMTE1IDB4MDQ+OworICAgICAgICAgICAgICAgIGdwciA9IDwmZ3ByPjsKKyAgICAgICAgICAgICAgICBjbG9ja3MgPSA8JmNsa3MgMTIzPiwgPCZjbGtzIDEyND47CisgICAgICAgICAgICAgICAgY2xvY2stbmFtZXMgPSAiaWFoYiIsICJpc2ZyIjsKKyAgICAgICAgICAgICAgICBkZGMtaTJjLWJ1cyA9IDwmaTJjMj47CisKKyAgICAgICAgICAgICAgICBwb3J0QDAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDA+OworCisgICAgICAgICAgICAgICAgICAgICAgICBoZG1pX211eF8wOiBlbmRwb2ludCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS1lbmRwb2ludCA9IDwmaXB1MV9kaTBfaGRtaT47CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBwb3J0QDEgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDE+OworCisgICAgICAgICAgICAgICAgICAgICAgICBoZG1pX211eF8xOiBlbmRwb2ludCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS1lbmRwb2ludCA9IDwmaXB1MV9kaTFfaGRtaT47CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH07CisgICAgICAgIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2xkYi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pbXgtZHJtL2xkYi50eHQKaW5kZXggZWQ5Mzc3OC4uNTc4YTFmYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3N0YWdpbmcvaW14LWRybS9sZGIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdGFnaW5nL2lteC1kcm0vbGRiLnR4dApAQCAtNTAsMTIgKzUwLDE0IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAgLSByZWcgOiBzaG91bGQgYmUgPDA+IG9yIDwxPgotIC0gY3J0Y3MgOiBhIGxpc3Qgb2YgcGhhbmRsZXMgd2l0aCBpbmRleCBwb2ludGluZyB0byB0aGUgSVBVIGRpc3BsYXkgaW50ZXJmYWNlcwotICAgICAgICAgICB0aGF0IGNhbiBiZSB1c2VkIGFzIHZpZGVvIHNvdXJjZSBmb3IgdGhpcyBjaGFubmVsLgogIC0gZnNsLGRhdGEtbWFwcGluZyA6IHNob3VsZCBiZSAic3B3ZyIgb3IgImplaWRhIgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgY29sb3IgYml0cyBhcmUgbGFpZCBvdXQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBMVkRTIHNpZ25hbC4KICAtIGZzbCxkYXRhLXdpZHRoIDogc2hvdWxkIGJlIDwxOD4gb3IgPDI0PgorIC0gcG9ydDogQSBwb3J0IG5vZGUgd2l0aCBlbmRwb2ludCBkZWZpbml0aW9ucyBhcyBkZWZpbmVkIGluCisgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8taW50ZXJmYWNlcy50eHQuCisgICBPbiBpLk1YNiwgdGhlcmUgc2hvdWxkIGJlIGZvdXIgcG9ydHMgKHBvcnRAWzAtM10pIHRoYXQgY29ycmVzcG9uZAorICAgdG8gdGhlIGZvdXIgTFZEUyBtdWx0aXBsZXhlciBpbnB1dHMuCiAKIGV4YW1wbGU6CiAKQEAgLTc3LDIzICs3OSwzMyBAQAogCiAJbHZkcy1jaGFubmVsQDAgewogCQlyZWcgPSA8MD47Ci0JCWNydGNzID0gPCZpcHUgMD47CiAJCWZzbCxkYXRhLW1hcHBpbmcgPSAic3B3ZyI7CiAJCWZzbCxkYXRhLXdpZHRoID0gPDI0PjsKIAogCQlkaXNwbGF5LXRpbWluZ3MgewogCQkJLyogLi4uICovCiAJCX07CisKKwkJcG9ydCB7CisJCQlsdmRzMF9pbjogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMF9sdmRzMD47CisJCQl9OworCQl9OwogCX07CiAKIAlsdmRzLWNoYW5uZWxAMSB7CiAJCXJlZyA9IDwxPjsKLQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJZnNsLGRhdGEtbWFwcGluZyA9ICJzcHdnIjsKIAkJZnNsLGRhdGEtd2lkdGggPSA8MjQ+OwogCiAJCWRpc3BsYXktdGltaW5ncyB7CiAJCQkvKiAuLi4gKi8KIAkJfTsKKworCQlwb3J0IHsKKwkJCWx2ZHMxX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkxX2x2ZHMxPjsKKwkJCX07CisJCX07CiAJfTsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvYWxsd2lubmVyLHN1bjRpLXRpbWVyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9hbGx3aW5uZXIsc3VuNGktdGltZXIudHh0CmluZGV4IDQ4YWViNzguLjVjMmUyMzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9hbGx3aW5uZXIsc3VuNGktdGltZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9hbGx3aW5uZXIsc3VuNGktdGltZXIudHh0CkBAIC0yLDcgKzIsNyBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImFsbHdpbm5lcixzdW40aS10aW1lciIKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLHN1bjRpLWExMC10aW1lciIKIC0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgogLSBpbnRlcnJ1cHRzIDogVGhlIGludGVycnVwdCBvZiB0aGUgZmlyc3QgdGltZXIKIC0gY2xvY2tzOiBwaGFuZGxlIHRvIHRoZSBzb3VyY2UgY2xvY2sgKHVzdWFsbHkgYSAyNCBNSHogZml4ZWQgY2xvY2spCkBAIC0xMCw3ICsxMCw3IEBACiBFeGFtcGxlOgogCiB0aW1lciB7Ci0JY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktdGltZXIiOworCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC10aW1lciI7CiAJcmVnID0gPDB4MDFjMjBjMDAgMHg0MDA+OwogCWludGVycnVwdHMgPSA8MjI+OwogCWNsb2NrcyA9IDwmb3NjPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci90aSxrZXlzdG9uZS10aW1lci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvdGksa2V5c3RvbmUtdGltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYmUzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvdGksa2V5c3RvbmUtdGltZXIudHh0CkBAIC0wLDAgKzEsMjkgQEAKKyogRGV2aWNlIHRyZWUgYmluZGluZ3MgZm9yIFRleGFzIGluc3RydW1lbnRzIEtleXN0b25lIHRpbWVyCisKK1RoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYmluZGluZ3MgZm9yIHRoZSA2NC1iaXQgdGltZXIgaW4gdGhlIEtleVN0b25lCithcmNoaXRlY3R1cmUgZGV2aWNlcy4gVGhlIHRpbWVyIGNhbiBiZSBjb25maWd1cmVkIGFzIGEgZ2VuZXJhbC1wdXJwb3NlIDY0LWJpdAordGltZXIsIGR1YWwgZ2VuZXJhbC1wdXJwb3NlIDMyLWJpdCB0aW1lcnMuIFdoZW4gY29uZmlndXJlZCBhcyBkdWFsIDMyLWJpdAordGltZXJzLCBlYWNoIGhhbGYgY2FuIG9wZXJhdGUgaW4gY29uanVuY3Rpb24gKGNoYWluIG1vZGUpIG9yIGluZGVwZW5kZW50bHkKKyh1bmNoYWluZWQgbW9kZSkgb2YgZWFjaCBvdGhlci4KKworSXQgaXMgZ2xvYmFsIHRpbWVyIGlzIGEgZnJlZSBydW5uaW5nIHVwLWNvdW50ZXIgYW5kIGNhbiBnZW5lcmF0ZSBpbnRlcnJ1cHQKK3doZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyBwcmVzZXQgY291bnRlciB2YWx1ZXMuCisKK0RvY3VtZW50YXRpb246CitodHRwOi8vd3d3LnRpLmNvbS9saXQvdWcvc3BydWd2NWEvc3BydWd2NWEucGRmCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAidGksa2V5c3RvbmUtdGltZXIiLgorLSByZWcgOiBzcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBjb3VudCBvZiB0aGUgcmVnaXN0ZXJzLgorLSBpbnRlcnJ1cHRzIDogaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgdGltZXIuCistIGNsb2NrcyA6IHRoZSBjbG9jayBmZWVkaW5nIHRoZSB0aW1lciBjbG9jay4KKworRXhhbXBsZToKKwordGltZXJAMjJmMDAwMCB7CisJY29tcGF0aWJsZSA9ICJ0aSxrZXlzdG9uZS10aW1lciI7CisJcmVnID0gPDB4MDIyZjAwMDAgMHg4MD47CisJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDExMCBJUlFfVFlQRV9FREdFX1JJU0lORz47CisJY2xvY2tzID0gPCZjbGt0aW1lcjE1PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtaW14LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy1pbXgudHh0CmluZGV4IGI0YjViNzkuLmE2YTMyY2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy1pbXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy1pbXgudHh0CkBAIC0xOCw2ICsxOCw3IEBACiAtIHZidXMtc3VwcGx5OiByZWd1bGF0b3IgZm9yIHZidXMKIC0gZGlzYWJsZS1vdmVyLWN1cnJlbnQ6IGRpc2FibGUgb3ZlciBjdXJyZW50IGRldGVjdAogLSBleHRlcm5hbC12YnVzLWRpdmlkZXI6IGVuYWJsZXMgb2ZmLWNoaXAgcmVzaXN0b3IgZGl2aWRlciBmb3IgVmJ1cworLSBtYXhpbXVtLXNwZWVkOiBsaW1pdCB0aGUgbWF4aW11bSBjb25uZWN0aW9uIHNwZWVkIHRvICJmdWxsLXNwZWVkIi4KIAogRXhhbXBsZXM6CiB1c2JAMDIxODQwMDAgeyAvKiBVU0IgT1RHICovCkBAIC0yOCw0ICsyOSw1IEBACiAJZnNsLHVzYm1pc2MgPSA8JnVzYm1pc2MgMD47CiAJZGlzYWJsZS1vdmVyLWN1cnJlbnQ7CiAJZXh0ZXJuYWwtdmJ1cy1kaXZpZGVyOworCW1heGltdW0tc3BlZWQgPSAiZnVsbC1zcGVlZCI7CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXpldmlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy16ZXZpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiY2IyYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy16ZXZpby50eHQKQEAgLTAsMCArMSwxNyBAQAorKiBMU0kgWmV2aW8gVVNCIE9URyBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAibHNpLHpldmlvLXVzYiIKKy0gcmVnOiBTaG91bGQgY29udGFpbiByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAorLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBjb250cm9sbGVyIGludGVycnVwdAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSB2YnVzLXN1cHBseTogcmVndWxhdG9yIGZvciB2YnVzCisKK0V4YW1wbGVzOgorCQl1c2IwOiB1c2JAYjAwMDAwMDAgeworCQkJcmVnID0gPDB4YjAwMDAwMDAgMHgxMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAibHNpLHpldmlvLXVzYiI7CisJCQlpbnRlcnJ1cHRzID0gPDg+OworCQkJdmJ1cy1zdXBwbHkgPSA8JnZidXNfcmVnPjsKKwkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CmluZGV4IGU4MDc2MzUuLjQ3MTM2NmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dApAQCAtNiwxMSArNiwxMyBAQAogIC0gY29tcGF0aWJsZTogbXVzdCBiZSAic25wcyxkd2MzIgogIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKICAtIGludGVycnVwdHM6IEludGVycnVwdHMgdXNlZCBieSB0aGUgZHdjMyBjb250cm9sbGVyLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgogIC0gdXNiLXBoeSA6IGFycmF5IG9mIHBoYW5kbGUgZm9yIHRoZSBQSFkgZGV2aWNlLiAgVGhlIGZpcnN0IGVsZW1lbnQKICAgIGluIHRoZSBhcnJheSBpcyBleHBlY3RlZCB0byBiZSBhIGhhbmRsZSB0byB0aGUgVVNCMi9IUyBQSFkgYW5kCiAgICB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBoYW5kbGUgdG8gdGhlIFVTQjMvU1MgUEhZCi0KLU9wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBwaHlzOiBmcm9tIHRoZSAqR2VuZXJpYyBQSFkqIGJpbmRpbmdzCisgLSBwaHktbmFtZXM6IGZyb20gdGhlICpHZW5lcmljIFBIWSogYmluZGluZ3MKICAtIHR4LWZpZm8tcmVzaXplOiBkZXRlcm1pbmVzIGlmIHRoZSBGSUZPICpoYXMqIHRvIGJlIHJlYWxsb2NhdGVkLgogCiBUaGlzIGlzIHVzdWFsbHkgYSBzdWJub2RlIHRvIERXQzMgZ2x1ZSB0byB3aGljaCBpdCBpcyBjb25uZWN0ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2ZzbC11c2IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9mc2wtdXNiLnR4dAppbmRleCBiZDU3MjNmLi40Nzc5YzAyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2ZzbC11c2IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZnNsLXVzYi50eHQKQEAgLTgsNyArOCw5IEBACiBSZXF1aXJlZCBwcm9wZXJ0aWVzIDoKICAtIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImZzbC11c2IyLW1waCIgZm9yIG11bHRpIHBvcnQgaG9zdCBVU0IKICAgIGNvbnRyb2xsZXJzLCBvciAiZnNsLXVzYjItZHIiIGZvciBkdWFsIHJvbGUgVVNCIGNvbnRyb2xsZXJzCi0gICBvciAiZnNsLG1wYzUxMjEtdXNiMi1kciIgZm9yIGR1YWwgcm9sZSBVU0IgY29udHJvbGxlcnMgb2YgTVBDNTEyMQorICAgb3IgImZzbCxtcGM1MTIxLXVzYjItZHIiIGZvciBkdWFsIHJvbGUgVVNCIGNvbnRyb2xsZXJzIG9mIE1QQzUxMjEuCisgICBXaGVyZXZlciBhcHBsaWNhYmxlLCB0aGUgSVAgdmVyc2lvbiBvZiB0aGUgVVNCIGNvbnRyb2xsZXIgc2hvdWxkCisgICBhbHNvIGJlIG1lbnRpb25lZCAoZm9yIGVnLiBmc2wtdXNiMi1kci12Mi4yIGZvciBic2M5MTMyKS4KICAtIHBoeV90eXBlIDogRm9yIG11bHRpIHBvcnQgaG9zdCBVU0IgY29udHJvbGxlcnMsIHNob3VsZCBiZSBvbmUgb2YKICAgICJ1bHBpIiwgb3IgInNlcmlhbCIuIEZvciBkdWFsIHJvbGUgVVNCIGNvbnRyb2xsZXJzLCBzaG91bGQgYmUKICAgIG9uZSBvZiAidWxwaSIsICJ1dG1pIiwgInV0bWlfd2lkZSIsIG9yICJzZXJpYWwiLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9teHMtcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvbXhzLXBoeS50eHQKaW5kZXggNTgzNWIyNy4uY2VmMTgxYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9teHMtcGh5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL214cy1waHkudHh0CkBAIC0xLDEzICsxLDE5IEBACiAqIEZyZWVzY2FsZSBNWFMgVVNCIFBoeSBEZXZpY2UKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJmc2wsaW14MjMtdXNicGh5IgorLSBjb21wYXRpYmxlOiBzaG91bGQgY29udGFpbjoKKwkqICJmc2wsaW14MjMtdXNicGh5IiBmb3IgaW14MjMgYW5kIGlteDI4CisJKiAiZnNsLGlteDZxLXVzYnBoeSIgZm9yIGlteDZkcSBhbmQgaW14NmRsCisJKiAiZnNsLGlteDZzbC11c2JwaHkiIGZvciBpbXg2c2wKKyAgImZzbCxpbXgyMy11c2JwaHkiIGlzIHN0aWxsIGEgZmFsbGJhY2sgZm9yIG90aGVyIHN0cmluZ3MKIC0gcmVnOiBTaG91bGQgY29udGFpbiByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAogLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBwaHkgaW50ZXJydXB0CistIGZzbCxhbmF0b3A6IHBoYW5kbGUgZm9yIGFuYXRvcCByZWdpc3RlciwgaXQgaXMgb25seSBmb3IgaW14NiBTb0Mgc2VyaWVzCiAKIEV4YW1wbGU6CiB1c2JwaHkxOiB1c2JwaHlAMDIwYzkwMDAgewogCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVzYnBoeSIsICJmc2wsaW14MjMtdXNicGh5IjsKIAlyZWcgPSA8MHgwMjBjOTAwMCAweDEwMDA+OwogCWludGVycnVwdHMgPSA8MCA0NCAweDA0PjsKKwlmc2wsYW5hdG9wID0gPCZhbmF0b3A+OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivb21hcC11c2IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9vbWFwLXVzYi50eHQKaW5kZXggYzQ5NTEzNS4uMzhiMmZhZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9vbWFwLXVzYi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9vbWFwLXVzYi50eHQKQEAgLTc2LDI3ICs3NiwzIEBACiAJcmFuZ2VzOwogfTsKIAotT01BUCBDT05UUk9MIFVTQgotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZgotICJ0aSxjb250cm9sLXBoeS1vdGdocyIgLSBpZiBpdCBoYXMgb3RnaHNfY29udHJvbCBtYWlsYm94IHJlZ2lzdGVyIGFzIG9uIE9NQVA0LgotICJ0aSxjb250cm9sLXBoeS11c2IyIiAtIGlmIGl0IGhhcyBQb3dlciBkb3duIGJpdCBpbiBjb250cm9sX2Rldl9jb25mIHJlZ2lzdGVyCi0JCQllLmcuIFVTQjJfUEhZIG9uIE9NQVA1LgotICJ0aSxjb250cm9sLXBoeS1waXBlMyIgLSBpZiBpdCBoYXMgRFBMTCBhbmQgaW5kaXZpZHVhbCBSeCAmIFR4IHBvd2VyIGNvbnRyb2wKLQkJCWUuZy4gVVNCMyBQSFkgYW5kIFNBVEEgUEhZIG9uIE9NQVA1LgotICJ0aSxjb250cm9sLXBoeS1kcmE3dXNiMiIgLSBpZiBpdCBoYXMgcG93ZXIgZG93biByZWdpc3RlciBsaWtlIFVTQjIgUEhZIG9uCi0JCQlEUkE3IHBsYXRmb3JtLgotICJ0aSxjb250cm9sLXBoeS1hbTQzN3VzYjIiIC0gaWYgaXQgaGFzIHBvd2VyIGRvd24gcmVnaXN0ZXIgbGlrZSBVU0IyIFBIWSBvbgotCQkJQU00MzcgcGxhdGZvcm0uCi0gLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4gSXQgY29udGFpbnMKLSAgIHRoZSBhZGRyZXNzIG9mICJvdGdoc19jb250cm9sIiBmb3IgY29udHJvbC1waHktb3RnaHMgb3IgInBvd2VyIiByZWdpc3RlcgotICAgZm9yIG90aGVyIHR5cGVzLgotIC0gcmVnLW5hbWVzOiBzaG91bGQgYmUgIm90Z2hzX2NvbnRyb2wiIGNvbnRyb2wtcGh5LW90Z2hzIGFuZCAicG93ZXIiIGZvcgotICAgb3RoZXIgdHlwZXMuCi0KLW9tYXBfY29udHJvbF91c2I6IG9tYXAtY29udHJvbC11c2JANGEwMDIzMDAgewotCWNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktb3RnaHMiOwotCXJlZyA9IDwweDRhMDAyMzNjIDB4ND47Ci0JcmVnLW5hbWVzID0gIm90Z2hzX2NvbnRyb2wiOwotfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcGxhdGZvcm0tdWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3BsYXRmb3JtLXVoY2kudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZiMDcxLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcGxhdGZvcm0tdWhjaS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1HZW5lcmljIFBsYXRmb3JtIFVIQ0kgQ29udHJvbGxlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6ICJwbGF0Zm9ybS11aGNpIgotLSByZWcgOiBTaG91bGQgY29udGFpbiAxIHJlZ2lzdGVyIHJhbmdlcyhhZGRyZXNzIGFuZCBsZW5ndGgpCi0tIGludGVycnVwdHMgOiBVSENJIGNvbnRyb2xsZXIgaW50ZXJydXB0Ci0KLUV4YW1wbGU6Ci0KLQl1aGNpQGQ4MDA3YjAwIHsKLQkJY29tcGF0aWJsZSA9ICJwbGF0Zm9ybS11aGNpIjsKLQkJcmVnID0gPDB4ZDgwMDdiMDAgMHgyMDA+OwotCQlpbnRlcnJ1cHRzID0gPDQzPjsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItZWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1laGNpLnR4dAppbmRleCBmYTE4NjEyLi5mZjE1MWVjMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItZWhjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2ItZWhjaS50eHQKQEAgLTEsMTkgKzEsMjAgQEAKIFVTQiBFSENJIGNvbnRyb2xsZXJzCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAidXNiLWVoY2kiLgorICAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImdlbmVyaWMtZWhjaSIuCiAgIC0gcmVnIDogc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBzdGFuZGFyZCBFSENJCiAgICAgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLiBPcHRpb25hbCBwbGF0Zm9ybS1kZXBlbmRlbnQgcmVnaXN0ZXJzCiAgICAgKGRlYnVnLXBvcnQgb3Igb3RoZXIpIGNhbiBiZSBhbHNvIHNwZWNpZmllZCBoZXJlLCBidXQgb25seSBhZnRlcgogICAgIGRlZmluaXRpb24gb2Ygc3RhbmRhcmQgRUhDSSByZWdpc3RlcnMuCiAgIC0gaW50ZXJydXB0cyA6IG9uZSBFSENJIGludGVycnVwdCBzaG91bGQgYmUgZGVzY3JpYmVkIGhlcmUuCi1JZiBkZXZpY2UgcmVnaXN0ZXJzIGFyZSBpbXBsZW1lbnRlZCBpbiBiaWcgZW5kaWFuIG1vZGUsIHRoZSBkZXZpY2UKLW5vZGUgc2hvdWxkIGhhdmUgImJpZy1lbmRpYW4tcmVncyIgcHJvcGVydHkuCi1JZiBjb250cm9sbGVyIGltcGxlbWVudGF0aW9uIG9wZXJhdGVzIHdpdGggYmlnIGVuZGlhbiBkZXNjcmlwdG9ycywKLSJiaWctZW5kaWFuLWRlc2MiIHByb3BlcnR5IHNob3VsZCBiZSBzcGVjaWZpZWQuCi1JZiBib3RoIGJpZyBlbmRpYW4gcmVnaXN0ZXJzIGFuZCBkZXNjcmlwdG9ycyBhcmUgdXNlZCBieSB0aGUgY29udHJvbGxlcgotaW1wbGVtZW50YXRpb24sICJiaWctZW5kaWFuIiBwcm9wZXJ0eSBjYW4gYmUgc3BlY2lmaWVkIGluc3RlYWQgb2YgaGF2aW5nCi1ib3RoICJiaWctZW5kaWFuLXJlZ3MiIGFuZCAiYmlnLWVuZGlhbi1kZXNjIi4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGJpZy1lbmRpYW4tcmVncyA6IGJvb2xlYW4sIHNldCB0aGlzIGZvciBoY2RzIHdpdGggYmlnLWVuZGlhbiByZWdpc3RlcnMKKyAtIGJpZy1lbmRpYW4tZGVzYyA6IGJvb2xlYW4sIHNldCB0aGlzIGZvciBoY2RzIHdpdGggYmlnLWVuZGlhbiBkZXNjcmlwdG9ycworIC0gYmlnLWVuZGlhbiA6IGJvb2xlYW4sIGZvciBoY2RzIHdpdGggYmlnLWVuZGlhbi1yZWdzICsgYmlnLWVuZGlhbi1kZXNjCisgLSBjbG9ja3MgOiBhIGxpc3Qgb2YgcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBwYWlycworIC0gcGh5cyA6IHBoYW5kbGUgKyBwaHkgc3BlY2lmaWVyIHBhaXIKKyAtIHBoeS1uYW1lcyA6ICJ1c2IiCiAKIEV4YW1wbGUgKFNlcXVvaWEgNDQwRVB4KToKICAgICBlaGNpQGUwMDAwMzAwIHsKQEAgLTIzLDMgKzI0LDEzIEBACiAJICAgcmVnID0gPDAgZTAwMDAzMDAgOTAgMCBlMDAwMDM5MCA3MD47CiAJICAgYmlnLWVuZGlhbjsKICAgIH07CisKK0V4YW1wbGUgKEFsbHdpbm5lciBzdW40aSBBMTAgU29DKToKKyAgIGVoY2kwOiB1c2JAMDFjMTQwMDAgeworCSAgIGNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1laGNpIiwgImdlbmVyaWMtZWhjaSI7CisJICAgcmVnID0gPDB4MDFjMTQwMDAgMHgxMDA+OworCSAgIGludGVycnVwdHMgPSA8Mzk+OworCSAgIGNsb2NrcyA9IDwmYWhiX2dhdGVzIDE+OworCSAgIHBoeXMgPSA8JnVzYnBoeSAxPjsKKwkgICBwaHktbmFtZXMgPSAidXNiIjsKKyAgIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1vaGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLW9oY2kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjY3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1vaGNpLnR4dApAQCAtMCwwICsxLDI1IEBACitVU0IgT0hDSSBjb250cm9sbGVycworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogImdlbmVyaWMtb2hjaSIKKy0gcmVnIDogb2hjaSBjb250cm9sbGVyIHJlZ2lzdGVyIHJhbmdlIChhZGRyZXNzIGFuZCBsZW5ndGgpCistIGludGVycnVwdHMgOiBvaGNpIGNvbnRyb2xsZXIgaW50ZXJydXB0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGJpZy1lbmRpYW4tcmVncyA6IGJvb2xlYW4sIHNldCB0aGlzIGZvciBoY2RzIHdpdGggYmlnLWVuZGlhbiByZWdpc3RlcnMKKy0gYmlnLWVuZGlhbi1kZXNjIDogYm9vbGVhbiwgc2V0IHRoaXMgZm9yIGhjZHMgd2l0aCBiaWctZW5kaWFuIGRlc2NyaXB0b3JzCistIGJpZy1lbmRpYW4gOiBib29sZWFuLCBmb3IgaGNkcyB3aXRoIGJpZy1lbmRpYW4tcmVncyArIGJpZy1lbmRpYW4tZGVzYworLSBjbG9ja3MgOiBhIGxpc3Qgb2YgcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBwYWlycworLSBwaHlzIDogcGhhbmRsZSArIHBoeSBzcGVjaWZpZXIgcGFpcgorLSBwaHktbmFtZXMgOiAidXNiIgorCitFeGFtcGxlOgorCisJb2hjaTA6IHVzYkAwMWMxNDQwMCB7CisJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1vaGNpIiwgImdlbmVyaWMtb2hjaSI7CisJCXJlZyA9IDwweDAxYzE0NDAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDw2ND47CisJCWNsb2NrcyA9IDwmdXNiX2NsayA2PiwgPCZhaGJfZ2F0ZXMgMj47CisJCXBoeXMgPSA8JnVzYnBoeSAxPjsKKwkJcGh5LW5hbWVzID0gInVzYiI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi1waHkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDI0NWM4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXBoeS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1VU0IgUEhZCi0KLU9NQVAgVVNCMiBQSFkKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSAidGksb21hcC11c2IyIgotIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuCi0gLSAjcGh5LWNlbGxzOiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjZWxscyB0aGF0IHNob3VsZCBiZSBnaXZlbiBpbiB0aGUKLSAgIHBoYW5kbGUgd2hpbGUgcmVmZXJlbmNpbmcgdGhpcyBwaHkuCi0KLU9wdGlvbmFsIHByb3BlcnRpZXM6Ci0gLSBjdHJsLW1vZHVsZSA6IHBoYW5kbGUgb2YgdGhlIGNvbnRyb2wgbW9kdWxlIHVzZWQgYnkgUEhZIGRyaXZlciB0byBwb3dlciBvbgotICAgdGhlIFBIWS4KLQotVGhpcyBpcyB1c3VhbGx5IGEgc3Vibm9kZSBvZiBvY3Ayc2NwIHRvIHdoaWNoIGl0IGlzIGNvbm5lY3RlZC4KLQotdXNiMnBoeUA0YTBhZDA4MCB7Ci0JY29tcGF0aWJsZSA9ICJ0aSxvbWFwLXVzYjIiOwotCXJlZyA9IDwweDRhMGFkMDgwIDB4NTg+OwotCWN0cmwtbW9kdWxlID0gPCZvbWFwX2NvbnRyb2xfdXNiPjsKLQkjcGh5LWNlbGxzID0gPDA+OwotfTsKLQotT01BUCBVU0IzIFBIWQotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxvbWFwLXVzYjMiCi0gLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KLSAtIHJlZy1uYW1lczogVGhlIG5hbWVzIG9mIHRoZSByZWdpc3RlciBhZGRyZXNzZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVnaXN0ZXJzCi0gICBmaWxsZWQgaW4gInJlZyIuCi0gLSAjcGh5LWNlbGxzOiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjZWxscyB0aGF0IHNob3VsZCBiZSBnaXZlbiBpbiB0aGUKLSAgIHBoYW5kbGUgd2hpbGUgcmVmZXJlbmNpbmcgdGhpcyBwaHkuCi0KLU9wdGlvbmFsIHByb3BlcnRpZXM6Ci0gLSBjdHJsLW1vZHVsZSA6IHBoYW5kbGUgb2YgdGhlIGNvbnRyb2wgbW9kdWxlIHVzZWQgYnkgUEhZIGRyaXZlciB0byBwb3dlciBvbgotICAgdGhlIFBIWS4KLQotVGhpcyBpcyB1c3VhbGx5IGEgc3Vibm9kZSBvZiBvY3Ayc2NwIHRvIHdoaWNoIGl0IGlzIGNvbm5lY3RlZC4KLQotdXNiM3BoeUA0YTA4NDQwMCB7Ci0JY29tcGF0aWJsZSA9ICJ0aSxvbWFwLXVzYjMiOwotCXJlZyA9IDwweDRhMDg0NDAwIDB4ODA+LAotCSAgICAgIDwweDRhMDg0ODAwIDB4NjQ+LAotCSAgICAgIDwweDRhMDg0YzAwIDB4NDA+OwotCXJlZy1uYW1lcyA9ICJwaHlfcngiLCAicGh5X3R4IiwgInBsbF9jdHJsIjsKLQljdHJsLW1vZHVsZSA9IDwmb21hcF9jb250cm9sX3VzYj47Ci0JI3BoeS1jZWxscyA9IDwwPjsKLX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi11aGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXVoY2kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODEzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYi11aGNpLnR4dApAQCAtMCwwICsxLDE1IEBACitHZW5lcmljIFBsYXRmb3JtIFVIQ0kgQ29udHJvbGxlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJnZW5lcmljLXVoY2kiIChkZXByZWNhdGVkOiAicGxhdGZvcm0tdWhjaSIpCistIHJlZyA6IFNob3VsZCBjb250YWluIDEgcmVnaXN0ZXIgcmFuZ2VzKGFkZHJlc3MgYW5kIGxlbmd0aCkKKy0gaW50ZXJydXB0cyA6IFVIQ0kgY29udHJvbGxlciBpbnRlcnJ1cHQKKworRXhhbXBsZToKKworCXVoY2lAZDgwMDdiMDAgeworCQljb21wYXRpYmxlID0gImdlbmVyaWMtdWhjaSI7CisJCXJlZyA9IDwweGQ4MDA3YjAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDw0Mz47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiLXhoY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2IteGhjaS50eHQKaW5kZXggNTc1MmRmMC4uOTBmOGY2MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2IteGhjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2IteGhjaS50eHQKQEAgLTEsMTQgKzEsMTQgQEAKIFVTQiB4SENJIGNvbnRyb2xsZXJzCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gIC0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJ4aGNpLXBsYXRmb3JtIi4KKyAgLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImdlbmVyaWMteGhjaSIgKGRlcHJlY2F0ZWQ6ICJ4aGNpLXBsYXRmb3JtIikuCiAgIC0gcmVnOiBzaG91bGQgY29udGFpbiBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHN0YW5kYXJkIFhIQ0kKICAgICByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuCiAgIC0gaW50ZXJydXB0czogb25lIFhIQ0kgaW50ZXJydXB0IHNob3VsZCBiZSBkZXNjcmliZWQgaGVyZS4KIAogRXhhbXBsZToKIAl1c2JAZjA5MzEwMDAgewotCQljb21wYXRpYmxlID0gInhoY2ktcGxhdGZvcm0iOworCQljb21wYXRpYmxlID0gImdlbmVyaWMteGhjaSI7CiAJCXJlZyA9IDwweGYwOTMxMDAwIDB4OGM4PjsKIAkJaW50ZXJydXB0cyA9IDwweDAgMHg0ZSAweDA+OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3ZpYSx2dDg1MDAtZWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3ZpYSx2dDg1MDAtZWhjaS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjNhZDEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi92aWEsdnQ4NTAwLWVoY2kudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotVklBL1dvbmRlcm1lZGlhIFZUODUwMCBFSENJIENvbnRyb2xsZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUgOiAidmlhLHZ0ODUwMC1laGNpIgotLSByZWcgOiBTaG91bGQgY29udGFpbiAxIHJlZ2lzdGVyIHJhbmdlcyhhZGRyZXNzIGFuZCBsZW5ndGgpCi0tIGludGVycnVwdHMgOiBlaGNpIGNvbnRyb2xsZXIgaW50ZXJydXB0Ci0KLUV4YW1wbGU6Ci0KLQllaGNpQGQ4MDA3OTAwIHsKLQkJY29tcGF0aWJsZSA9ICJ2aWEsdnQ4NTAwLWVoY2kiOwotCQlyZWcgPSA8MHhkODAwNzkwMCAweDIwMD47Ci0JCWludGVycnVwdHMgPSA8NDM+OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3Z0ODUwMC1laGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdnQ4NTAwLWVoY2kudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI4ZmQ2Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdnQ4NTAwLWVoY2kudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotVklBIFZUODUwMCBhbmQgV29uZGVybWVkaWEgV004eHh4IFNvQyBVU0IgY29udHJvbGxlcnMuCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInZpYSx2dDg1MDAtZWhjaSIgb3IgIndtLHByaXptLWVoY2kiLgotIC0gcmVnOiBBZGRyZXNzIHJhbmdlIG9mIHRoZSBlaGNpIHJlZ2lzdGVycy4gc2l6ZSBzaG91bGQgYmUgMHgyMDAKLSAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBlaGNpIGludGVycnVwdC4KLQotdXNiOiBlaGNpQEQ4MDA3MTAwIHsKLQljb21wYXRpYmxlID0gIndtLHByaXptLWVoY2kiLCAidXNiLWVoY2kiOwotCXJlZyA9IDwweEQ4MDA3MTAwIDB4MjAwPjsKLQlpbnRlcnJ1cHRzID0gPDE+OwotfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9vZi14aWxpbngtd2R0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9vZi14aWxpbngtd2R0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDYzNzgyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL29mLXhpbGlueC13ZHQudHh0CkBAIC0wLDAgKzEsMjMgQEAKK1hpbGlueCBBWEkvUExCIHNvZnQtY29yZSB3YXRjaGRvZyBEZXZpY2UgVHJlZSBCaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUJCTogU2hvdWxkIGJlICJ4bG54LHhwcy10aW1lYmFzZS13ZHQtMS4wMC5hIiBvcgorCQkJICAieGxueCx4cHMtdGltZWJhc2Utd2R0LTEuMDEuYSIuCistIHJlZwkJCTogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBzaXplCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGNsb2NrLWZyZXF1ZW5jeQk6IEZyZXF1ZW5jeSBvZiBjbG9jayBpbiBIegorLSB4bG54LHdkdC1lbmFibGUtb25jZQk6IDAgLSBXYXRjaGRvZyBjYW4gYmUgcmVzdGFydGVkCisJCQkgIDEgLSBXYXRjaGRvZyBjYW4gYmUgZW5hYmxlZCBqdXN0IG9uY2UKKy0geGxueCx3ZHQtaW50ZXJ2YWwJOiBXYXRjaGRvZyB0aW1lb3V0IGludGVydmFsIGluIDJePHZhbD4gY2xvY2sgY3ljbGVzLAorCQkJICA8dmFsPiBpcyBpbnRlZ2VyIGZyb20gOCB0byAzMS4KKworRXhhbXBsZToKK2F4aS10aW1lYmFzZS13ZHRANDAxMDAwMDAgeworCWNsb2NrLWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CisJY29tcGF0aWJsZSA9ICJ4bG54LHhwcy10aW1lYmFzZS13ZHQtMS4wMC5hIjsKKwlyZWcgPSA8MHg0MDEwMDAwMCAweDEwMDAwPjsKKwl4bG54LHdkdC1lbmFibGUtb25jZSA9IDwweDA+OworCXhsbngsd2R0LWludGVydmFsID0gPDB4MWI+OworfSA7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc3VueGktd2R0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9zdW54aS13ZHQudHh0CmluZGV4IGUzOWNiMjYuLmI4Zjc1YzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9zdW54aS13ZHQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9zdW54aS13ZHQudHh0CkBAIC0yLDEzICsyLDEzIEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYWxsd2lubmVyLDxzb2MtZmFtaWx5Pi13ZHQiLCB0aGUgY3VycmVudGx5IHN1cHBvcnRlZAotICBTb0MgZmFtaWxpZXMgYmVpbmcgc3VuNGkgYW5kIHN1bjZpCistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgZWl0aGVyICJhbGx3aW5uZXIsc3VuNGktYTEwLXdkdCIgb3IKKyAgICAgICAgICAgICAgICJhbGx3aW5uZXIsc3VuNmktYTMxLXdkdCIKIC0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgogCiBFeGFtcGxlOgogCiB3ZHQ6IHdhdGNoZG9nQDAxYzIwYzkwIHsKLQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS13ZHQiOworCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC13ZHQiOwogCXJlZyA9IDwweDAxYzIwYzkwIDB4MTA+OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZm1jL2ZtYy13cml0ZS1lZXByb20udHh0IGIvRG9jdW1lbnRhdGlvbi9mbWMvZm1jLXdyaXRlLWVlcHJvbS50eHQKaW5kZXggNDRhM2JjNi4uZTBhOTcxMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mbWMvZm1jLXdyaXRlLWVlcHJvbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mbWMvZm1jLXdyaXRlLWVlcHJvbS50eHQKQEAgLTksNyArOSwxMiBAQAogZXhwZWN0ZWQgdG8gb25seSBoYXBwZW4gZHVyaW5nIG1hbnVmYWN0dXJpbmcuIEZvciB0aGlzIHJlYXNvbiwgdGhlCiBtb2R1bGUgbWFrZXMgaXQgdW5saWtlbHkgZm9yIHRoZSByYW5kb20gdXNlciB0byBjaGFuZ2UgYSB3b3JraW5nIEVFUFJPTS4KIAotVGhlIG1vZHVsZSB0YWtlcyB0aGUgZm9sbG93aW5nIG1lYXN1cmVzOgorSG93ZXZlciwgc2luY2UgdGhlIEVFUFJPTSBtYXkgaW5jbHVkZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBpbmZvcm1hdGlvbgorb3RoZXIgdGhhbiB0aGUgaWRlbnRpZmljYXRpb24sIGxhdGVyIHZlcnNpb25zIG9mIHRoaXMgcGFja2FnZXMgYWRkZWQKK3dyaXRlLXN1cHBvcnQgdGhyb3VnaCBzeXNmcy4gU2VlICpub3RlIEFjY2Vzc2luZyB0aGUgRUVQUk9NOjouCisKK1RvIGF2b2lkIGRhbWFnaW5nIHRoZSBFRVBST00gY29udGVudCwgdGhlIG1vZHVsZSB0YWtlcyB0aGUgZm9sbG93aW5nCittZWFzdXJlczoKIAogICAgKiBJdCBhY2NlcHRzIGEgYGZpbGU9JyBhcmd1bWVudCAod2l0aGluIC9saWIvZmlybXdhcmUpIGFuZCBpZiBubwogICAgICBzdWNoIGFyZ3VtZW50IGlzIHJlY2VpdmVkLCBpdCBkb2Vzbid0IHdyaXRlIGFueXRoaW5nIHRvIEVFUFJPTQpAQCAtNzAsNTYgKzc1LDI0IEBACiAgICAgICAgIFsgIDEzMi44OTk4NzJdICBmYWtlLWZtYzogUHJvZHVjdCBuYW1lOiBGbWNEZWxheTFuczRjaGEKIAogCi1Xcml0aW5nIHRvIHRoZSBFRVBST00KK0FjY2Vzc2luZyB0aGUgRUVQUk9NCiA9PT09PT09PT09PT09PT09PT09PT0KIAotT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgYmluYXJ5IGZpbGUgZm9yIHlvdXIgRUVQUk9NLCB5b3UgY2FuIHdyaXRlIGl0Ci10byB0aGUgc3RvcmFnZSBtZWRpdW0gdXNpbmcgdGhlIGZtYy13cml0ZS1lZXByb20gKFNlZSAqbm90ZQotZm1jLXdyaXRlLWVlcHJvbTo6LCB3aGlsZSByZWx5aW5nIG9uIGEgY2FycmllciBkcml2ZXIuICBUaGUgcHJvY2VkdXJlCi1oZXJlIHNob3duIGhlcmUgdXNlcyB0aGUgU1BFQyBkcml2ZXIKLShgaHR0cDovL3d3dy5vaHdyLm9yZy9wcm9qZWN0cy9zcGVjLXN3JykuCitUaGUgYnVzIGNyZWF0ZXMgYSBzeXNmcyBiaW5hcnkgZmlsZSBjYWxsZWQgZWVwcm9tIGZvciBlYWNoIG1lenphbmluZSBpdAora25vd3MgYWJvdXQ6CiAKLVRoZSBleGFtcGxlIGFzc3VtZXMgbm8gZHJpdmVyIGlzIGFscmVhZHkgbG9hZGVkIChhY3R1YWxseSwgSSB1bmxvYWRlZAotdGhlbSBieSBoYW5kIGFzIGV2ZXJ5dGhpbmcgbG9hZHMgYXV0b21hdGljYWxseSBhdCBib290IHRpbWUgYWZ0ZXIgeW91Ci1pbnN0YWxsZWQgdGhlIG1vZHVsZXMpLCBhbmQgc2hvd3Mga2VybmVsIG1lc3NhZ2VzIHRvZ2V0aGVyIHdpdGgKLWNvbW1hbmRzLiBIZXJlIHRoZSBwcm9tcHQgaXMgc3B1c2Eucm9vdCMgYW5kIHR3byBTUEVDIGNhcmRzIGFyZSBwbHVnZ2VkCi1pbiB0aGUgc3lzdGVtLgorICAgICAgICBzcHVzYS5yb290IyBjZCAvc3lzL2J1cy9mbWMvZGV2aWNlczsgbHMgLWwgKi9lZXByb20KKyAgICAgICAgLXItLXItLXItLSAxIHJvb3Qgcm9vdCA4MTkyIEZlYiAyMSAxMjozMCBGbWNBZGMxMDBtMTRiNGNoYS0wODAwL2VlcHJvbQorICAgICAgICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgRmViIDIxIDEyOjMwIEZtY0RlbGF5MW5zNGNoYS0wMjAwL2VlcHJvbQorICAgICAgICAtci0tci0tci0tIDEgcm9vdCByb290IDgxOTIgRmViIDIxIDEyOjMwIEZtY0RpbzVjaGEtMDQwMC9lZXByb20KIAotICAgICBzcHVzYS5yb290IyBpbnNtb2QgZm1jLmtvCi0gICAgIHNwdXNhLnJvb3QjIGluc21vZCBzcGVjLmtvCi0gICAgIFsxMzk3Mi4zODI4MThdIHNwZWMgMDAwMDowMjowMC4wOiAgcHJvYmUgZm9yIGRldmljZSAwMDAyOjAwMDAKLSAgICAgWzEzOTcyLjM5Mjc3M10gc3BlYyAwMDAwOjAyOjAwLjA6IGdvdCBmaWxlICJmbWMvc3BlYy1pbml0LmJpbiIsIDE0ODQ0MDQgKDB4MTZhNjc0KSBieXRlcwotICAgICBbMTM5NzIuNTkxMzg4XSBzcGVjIDAwMDA6MDI6MDAuMDogRlBHQSBwcm9ncmFtbWluZyBzdWNjZXNzZnVsCi0gICAgIFsxMzk3Mi44ODMwMTFdIHNwZWMgMDAwMDowMjowMC4wOiBFRVBST00gaGFzIG5vIEZSVSBpbmZvcm1hdGlvbgotICAgICBbMTM5NzIuODg4NzE5XSBzcGVjIDAwMDA6MDI6MDAuMDogTm8gZGV2aWNlX2lkIGZpbGxlZCwgdXNpbmcgaW5kZXgKLSAgICAgWzEzOTcyLjg5NDY3Nl0gc3BlYyAwMDAwOjAyOjAwLjA6IE5vIG1lenphbmluZV9uYW1lIGZvdW5kCi0gICAgIFsxMzk3Mi44OTk4NjNdIC9ob21lL3J1YmluaS93aXAvc3BlYy1zdy9rZXJuZWwvc3BlYy1ncGlvLmMgLSBzcGVjX2dwaW9faW5pdAotICAgICBbMTM5NzIuOTA2NTc4XSBzcGVjIDAwMDA6MDQ6MDAuMDogIHByb2JlIGZvciBkZXZpY2UgMDAwNDowMDAwCi0gICAgIFsxMzk3Mi45MTY1MDldIHNwZWMgMDAwMDowNDowMC4wOiBnb3QgZmlsZSAiZm1jL3NwZWMtaW5pdC5iaW4iLCAxNDg0NDA0ICgweDE2YTY3NCkgYnl0ZXMKLSAgICAgWzEzOTczLjExNTA5Nl0gc3BlYyAwMDAwOjA0OjAwLjA6IEZQR0EgcHJvZ3JhbW1pbmcgc3VjY2Vzc2Z1bAotICAgICBbMTM5NzMuNDAxNzk4XSBzcGVjIDAwMDA6MDQ6MDAuMDogRUVQUk9NIGhhcyBubyBGUlUgaW5mb3JtYXRpb24KLSAgICAgWzEzOTczLjQwNzQ3NF0gc3BlYyAwMDAwOjA0OjAwLjA6IE5vIGRldmljZV9pZCBmaWxsZWQsIHVzaW5nIGluZGV4Ci0gICAgIFsxMzk3My40MTM0MTddIHNwZWMgMDAwMDowNDowMC4wOiBObyBtZXp6YW5pbmVfbmFtZSBmb3VuZAotICAgICBbMTM5NzMuNDE4NjAwXSAvaG9tZS9ydWJpbmkvd2lwL3NwZWMtc3cva2VybmVsL3NwZWMtZ3Bpby5jIC0gc3BlY19ncGlvX2luaXQKLSAgICAgc3B1c2Eucm9vdCMgbHMgL3N5cy9idXMvZm1jL2RldmljZXMKLSAgICAgZm1jLTAwMDAgIGZtYy0wMDAxCi0gICAgIHNwdXNhLnJvb3QjIGluc21vZCBmbWMtd3JpdGUtZWVwcm9tLmtvIGJ1c2lkPTB4MDIwMCBmaWxlPWZkZWxheS1lZXByb20uYmluCi0gICAgIFsxNDEwMy45NjYyNTldIHNwZWMgMDAwMDowMjowMC4wOiBNYXRjaGluZyBhbiBnZW5lcmljIGRyaXZlciAobm8gSUQpCi0gICAgIFsxNDEwMy45NzU1MTldIHNwZWMgMDAwMDowMjowMC4wOiBwcm9ncmFtbWluZyA2MTU1IGJ5dGVzCi0gICAgIFsxNDEyNi4zNzM3NjJdIHNwZWMgMDAwMDowMjowMC4wOiB3cml0ZV9lZXByb206IHN1Y2Nlc3MKLSAgICAgWzE0MTI2LjM3ODc3MF0gc3BlYyAwMDAwOjA0OjAwLjA6IE1hdGNoaW5nIGFuIGdlbmVyaWMgZHJpdmVyIChubyBJRCkKLSAgICAgWzE0MTI2LjM4NDkwM10gc3BlYyAwMDAwOjA0OjAwLjA6IGZtY193cml0ZV9lZXByb206IG5vIGZpbGVuYW1lIGdpdmVuOiBub3QgcHJvZ3JhbW1pbmcKLSAgICAgWzE0MTI2LjM5MjYwMF0gZm1jX3dyaXRlX2VlcHJvbTogcHJvYmUgb2YgZm1jLTAwMDEgZmFpbGVkIHdpdGggZXJyb3IgLTIKK0V2ZXJ5Ym9keSBjYW4gcmVhZCB0aGUgZmlsZXMgYW5kIHRoZSBzdXBlcnVzZXIgY2FuIGFsc28gbW9kaWZ5IGl0LCBidXQKK3RoZSBvcGVyYXRpb24gbWF5IG9uIHRoZSBjYXJyaWVyIGRyaXZlciwgaWYgdGhlIGNhcnJpZXIgaXMgdW5hYmxlIHRvCithY2Nlc3MgdGhlIEkyQyBidXMuICBGb3IgZXhhbXBsZSwgdGhlIHNwZWMgZHJpdmVyIGNhbiBhY2Nlc3MgdGhlIGJ1cworb25seSB3aXRoIGl0cyBnb2xkZW4gZ2F0ZXdhcmU6IGFmdGVyIGEgbWV6emFuaW5lIGRyaXZlciByZXByb2dyYW1tZWQKK3RoZSBGUEdBIHdpdGggYSBjdXN0b20gY2lyY3VpdCwgdGhlIGNhcnJpZXIgaXMgdW5hYmxlIHRvIGFjY2VzcyB0aGUKK0VFUFJPTSBhbmQgcmV0dXJucyBFTk9UU1VQUC4KIAotUmVhZGluZyBiYWNrIHRoZSBFRVBST00KLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUluIG9yZGVyIHRvIHJlYWQgYmFjayB0aGUgYmluYXJ5IGNvbnRlbnQgb2YgdGhlIEVFUFJPTSBvZiB5b3VyCi1tZXp6YW5pbmUgZGV2aWNlLCB0aGUgYnVzIGNyZWF0ZXMgYSByZWFkLW9ubHkgc3lzZnMgZmlsZSBjYWxsZWQgZWVwcm9tCi1mb3IgZWFjaCBtZXp6YW5pbmUgaXQga25vd3MgYWJvdXQ6Ci0KLSAgIHNwdXNhLnJvb3QjIGNkIC9zeXMvYnVzL2ZtYy9kZXZpY2VzOyBscyAtbCAqL2VlcHJvbQotICAgLXItLXItLXItLSAxIHJvb3Qgcm9vdCA4MTkyIEFwciAgOSAxNjo1MyBGbWNEZWxheTFuczRjaGEtZjAwMS9lZXByb20KLSAgIC1yLS1yLS1yLS0gMSByb290IHJvb3QgODE5MiBBcHIgIDkgMTc6MTkgZmFrZS1kZXNpZ24tZm9yLXRlc3RpbmctZjAwMi9lZXByb20KLSAgIC1yLS1yLS1yLS0gMSByb290IHJvb3QgODE5MiBBcHIgIDkgMTc6MTkgZmFrZS1kZXNpZ24tZm9yLXRlc3RpbmctZjAwMy9lZXByb20KLSAgIC1yLS1yLS1yLS0gMSByb290IHJvb3QgODE5MiBBcHIgIDkgMTc6MTkgZm1jLWYwMDQvZWVwcm9tCitBbiBhbHRlcm5hdGl2ZSB3YXkgdG8gd3JpdGUgdGhlIEVFUFJPTSBpcyB0aGUgbWV6emFuaW5lIGRyaXZlcgorZm1jLXdyaXRlLWVlcHJvbSAoU2VlICpub3RlIGZtYy13cml0ZS1lZXByb206OiksIGJ1dCB0aGUgcHJvY2VkdXJlIGlzCittb3JlIGNvbXBsZXguCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkYzEyOGQ4MTggYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkYzEyOGQ4MTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljOTUwMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRjMTI4ZDgxOApAQCAtMCwwICsxLDQ3IEBACitLZXJuZWwgZHJpdmVyIGFkYzEyOGQ4MTgKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogVGV4YXMgSW5zdHJ1bWVudHMgQURDODE4RDgxOAorICAgIFByZWZpeDogJ2FkYzgxOGQ4MTgnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDFkLCAweDFlLCAweDFmLCAweDJkLCAweDJlLCAweDJmCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIFRJIHdlYnNpdGUKKyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudGkuY29tLworCitBdXRob3I6IEd1ZW50ZXIgUm9lY2sKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIEFEQzEyOEQ4MTguCitJdCBpcyBkZXNjcmliZWQgYXMgJ0FEQyBTeXN0ZW0gTW9uaXRvciB3aXRoIFRlbXBlcmF0dXJlIFNlbnNvcicuCisKK1RoZSBBREMxMjhEODE4IGltcGxlbWVudHMgb25lIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgc2V2ZW4gdm9sdGFnZSBzZW5zb3JzLgorCitUZW1wZXJhdHVyZXMgYXJlIG1lYXN1cmVkIGluIGRlZ3JlZXMgQ2Vsc2l1cy4gVGhlcmUgaXMgb25lIHNldCBvZiBsaW1pdHMuCitXaGVuIHRoZSBIT1QgVGVtcGVyYXR1cmUgTGltaXQgaXMgY3Jvc3NlZCwgdGhpcyB3aWxsIGNhdXNlIGFuIGFsYXJtIHRoYXQgd2lsbAorYmUgcmVhc3NlcnRlZCB1bnRpbCB0aGUgdGVtcGVyYXR1cmUgZHJvcHMgYmVsb3cgdGhlIEhPVCBIeXN0ZXJlc2lzLgorTWVhc3VyZW1lbnRzIGFyZSBndWFyYW50ZWVkIGJldHdlZW4gLTU1IGFuZCArMTI1IGRlZ3JlZXMuIFRoZSB0ZW1wZXJhdHVyZQorbWVhc3VyZW1lbnQgaGFzIGEgcmVzb2x1dGlvbiBvZiAwLjUgZGVncmVlczsgdGhlIGxpbWl0cyBoYXZlIGEgcmVzb2x1dGlvbgorb2YgMSBkZWdyZWUuCisKK1ZvbHRhZ2Ugc2Vuc29ycyAoYWxzbyBrbm93biBhcyBJTiBzZW5zb3JzKSByZXBvcnQgdGhlaXIgdmFsdWVzIGluIHZvbHRzLgorQW4gYWxhcm0gaXMgdHJpZ2dlcmVkIGlmIHRoZSB2b2x0YWdlIGhhcyBjcm9zc2VkIGEgcHJvZ3JhbW1hYmxlIG1pbmltdW0KK29yIG1heGltdW0gbGltaXQuIE5vdGUgdGhhdCBtaW5pbXVtIGluIHRoaXMgY2FzZSBhbHdheXMgbWVhbnMgJ2Nsb3Nlc3QgdG8KK3plcm8nOyB0aGlzIGlzIGltcG9ydGFudCBmb3IgbmVnYXRpdmUgdm9sdGFnZSBtZWFzdXJlbWVudHMuIEFsbCB2b2x0YWdlCitpbnB1dHMgY2FuIG1lYXN1cmUgdm9sdGFnZXMgYmV0d2VlbiAwIGFuZCAyLjU1IHZvbHRzLCB3aXRoIGEgcmVzb2x1dGlvbgorb2YgMC42MjUgbVYuCisKK0lmIGFuIGFsYXJtIHRyaWdnZXJzLCBpdCB3aWxsIHJlbWFpbiB0cmlnZ2VyZWQgdW50aWwgdGhlIGhhcmR3YXJlIHJlZ2lzdGVyCitpcyByZWFkIGF0IGxlYXN0IG9uY2UuIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2F1c2UgZm9yIHRoZSBhbGFybSBtYXkKK2FscmVhZHkgaGF2ZSBkaXNhcHBlYXJlZCBieSB0aGUgdGltZSB0aGUgYWxhcm0gaXMgcmVhZC4gVGhlIGRyaXZlcgorY2FjaGVzIHRoZSBhbGFybSBzdGF0dXMgZm9yIGVhY2ggc2Vuc29yIHVudGlsIGl0IGlzIGF0IGxlYXN0IHJlcG9ydGVkCitvbmNlLCB0byBlbnN1cmUgdGhhdCBhbGFybXMgYXJlIHJlcG9ydGVkIHRvIHVzZXIgc3BhY2UuCisKK1RoZSBBREMxMjhEODE4IG9ubHkgdXBkYXRlcyBpdHMgdmFsdWVzIGFwcHJveGltYXRlbHkgb25jZSBwZXIgc2Vjb25kOworcmVhZGluZyBpdCBtb3JlIG9mdGVuIHdpbGwgZG8gbm8gaGFybSwgYnV0IHdpbGwgcmV0dXJuICdvbGQnIHZhbHVlcy4KKworSW4gYWRkaXRpb24gdG8gdGhlIHNjYW5uZWQgYWRkcmVzcyBsaXN0LCB0aGUgY2hpcCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIGZvcgorYWRkcmVzc2VzIDB4MzUgdG8gMHgzNy4gVGhvc2UgYWRkcmVzc2VzIGFyZSBub3Qgc2Nhbm5lZC4gWW91IGhhdmUgdG8gaW5zdGFudGlhdGUKK3RoZSBkcml2ZXIgZXhwbGljaXRseSBpZiB0aGUgY2hpcCBpcyBjb25maWd1cmVkIGZvciBhbnkgb2YgdGhvc2UgYWRkcmVzc2VzIGluCit5b3VyIHN5c3RlbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG05NTI0NSBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05NTI0NQppbmRleCBjYmQ4YWVhLi43N2VhZjI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTUyNDUKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTk1MjQ1CkBAIC0yNCw4ICsyNCwxMiBAQAogZ2l2ZW4gd2l0aGluIGEgcmFuZ2Ugb2YgLTEyNyB0byArMjU1IGRlZ3JlZXMuIFJlc29sdXRpb24gZGVwZW5kcyBvbgogdGVtcGVyYXR1cmUgaW5wdXQgYW5kIHJhbmdlLgogCi1FYWNoIHNlbnNvciBoYXMgaXRzIG93biBjcml0aWNhbCBsaW1pdCwgYnV0IHRoZSBoeXN0ZXJlc2lzIGlzIGNvbW1vbiB0byBhbGwKLXR3byBjaGFubmVscy4KK0VhY2ggc2Vuc29yIGhhcyBpdHMgb3duIGNyaXRpY2FsIGxpbWl0LiBBZGRpdGlvbmFsbHksIHRoZXJlIGlzIGEgcmVsYXRpdmUKK2h5c3RlcmVzaXMgdmFsdWUgY29tbW9uIHRvIGJvdGggY3JpdGljYWwgbGltaXRzLiBUbyBtYWtlIGxpZmUgZWFzaWVyIHRvCit1c2VyLXNwYWNlIGFwcGxpY2F0aW9ucywgdHdvIGFic29sdXRlIHZhbHVlcyBhcmUgZXhwb3J0ZWQsIG9uZSBmb3IgZWFjaAorY2hhbm5lbCwgYnV0IHRoZXNlIHZhbHVlcyBhcmUgb2YgY291cnNlIGxpbmtlZC4gT25seSB0aGUgbG9jYWwgaHlzdGVyZXNpcworY2FuIGJlIHNldCBmcm9tIHVzZXItc3BhY2UsIGFuZCB0aGUgc2FtZSBkZWx0YSBhcHBsaWVzIHRvIHRoZSByZW1vdGUKK2h5c3RlcmVzaXMuCiAKIFRoZSBsbTk1MjQ1IGRyaXZlciBjYW4gY2hhbmdlIGl0cyB1cGRhdGUgaW50ZXJ2YWwgdG8gYSBmaXhlZCBzZXQgb2YgdmFsdWVzLgogSXQgd2lsbCByb3VuZCB1cCB0byB0aGUgbmV4dCBzZWxlY3RhYmxlIGludGVydmFsLiBTZWUgdGhlIGRhdGFzaGVldCBmb3IgZXhhY3QKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbHRjMjk0NSBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjMjk0NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQwZjdmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGMyOTQ1CkBAIC0wLDAgKzEsODQgQEAKK0tlcm5lbCBkcml2ZXIgbHRjMjk0NQorPT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBMaW5lYXIgVGVjaG5vbG9neSBMVEMyOTQ1CisgICAgUHJlZml4OiAnbHRjMjk0NScKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQorICAgIERhdGFzaGVldDoKKyAgICAgICAgaHR0cDovL2Nkcy5saW5lYXIuY29tL2RvY3MvZW4vZGF0YXNoZWV0LzI5NDVmYS5wZGYKKworQXV0aG9yOiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBMVEMyOTQ1ICBpcyBhIHJhaWwtdG8tcmFpbCBzeXN0ZW0gbW9uaXRvciB0aGF0IG1lYXN1cmVzIGN1cnJlbnQsIHZvbHRhZ2UsCithbmQgcG93ZXIgY29uc3VtcHRpb24uCisKKworVXNhZ2UgTm90ZXMKKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGRvZXMgbm90IHByb2JlIGZvciBMVEMyOTQ1IGRldmljZXMsIHNpbmNlIHRoZXJlIGlzIG5vIHJlZ2lzdGVyCit3aGljaCBjYW4gYmUgc2FmZWx5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGNoaXAuIFlvdSB3aWxsIGhhdmUgdG8gaW5zdGFudGlhdGUKK3RoZSBkZXZpY2VzIGV4cGxpY2l0bHkuCisKK0V4YW1wbGU6IHRoZSBmb2xsb3dpbmcgd2lsbCBsb2FkIHRoZSBkcml2ZXIgZm9yIGFuIExUQzI5NDUgYXQgYWRkcmVzcyAweDEwCitvbiBJMkMgYnVzICMxOgorJCBtb2Rwcm9iZSBsdGMyOTQ1CiskIGVjaG8gbHRjMjk0NSAweDEwID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTEvbmV3X2RldmljZQorCisKK1N5c2ZzIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0KKworVm9sdGFnZSByZWFkaW5ncyBwcm92aWRlZCBieSB0aGlzIGRyaXZlciBhcmUgcmVwb3J0ZWQgYXMgb2J0YWluZWQgZnJvbSB0aGUgQURDCityZWdpc3RlcnMuIElmIGEgc2V0IG9mIHZvbHRhZ2UgZGl2aWRlciByZXNpc3RvcnMgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlCityZWFsIHZvbHRhZ2UgYnkgbXVsdGlwbHlpbmcgdGhlIHJlcG9ydGVkIHZhbHVlIHdpdGggKFIxK1IyKS9SMiwgd2hlcmUgUjEgaXMgdGhlCit2YWx1ZSBvZiB0aGUgZGl2aWRlciByZXNpc3RvciBhZ2FpbnN0IHRoZSBtZWFzdXJlZCB2b2x0YWdlIGFuZCBSMiBpcyB0aGUgdmFsdWUKK29mIHRoZSBkaXZpZGVyIHJlc2lzdG9yIGFnYWluc3QgR3JvdW5kLgorCitDdXJyZW50IHJlYWRpbmcgcHJvdmlkZWQgYnkgdGhpcyBkcml2ZXIgaXMgcmVwb3J0ZWQgYXMgb2J0YWluZWQgZnJvbSB0aGUgQURDCitDdXJyZW50IFNlbnNlIHJlZ2lzdGVyLiBUaGUgcmVwb3J0ZWQgdmFsdWUgYXNzdW1lcyB0aGF0IGEgMSBtT2htIHNlbnNlIHJlc2lzdG9yCitpcyBpbnN0YWxsZWQuIElmIGEgZGlmZmVyZW50IHNlbnNlIHJlc2lzdG9yIGlzIGluc3RhbGxlZCwgY2FsY3VsYXRlIHRoZSByZWFsCitjdXJyZW50IGJ5IGRpdmlkaW5nIHRoZSByZXBvcnRlZCB2YWx1ZSBieSB0aGUgc2Vuc2UgcmVzaXN0b3IgdmFsdWUgaW4gbU9obS4KKworaW4xX2lucHV0CQlWSU4gdm9sdGFnZSAobVYpLiBWb2x0YWdlIGlzIG1lYXN1cmVkIGVpdGhlciBhdAorCQkJU0VOU0UrIG9yIFZERCBwaW4gZGVwZW5kaW5nIG9uIGNoaXAgY29uZmlndXJhdGlvbi4KK2luMV9taW4JCQlVbmRlcnZvbHRhZ2UgdGhyZXNob2xkCitpbjFfbWF4CQkJT3ZlcnZvbHRhZ2UgdGhyZXNob2xkCitpbjFfbG93ZXN0CQlMb3dlc3QgbWVhc3VyZWQgdm9sdGFnZQoraW4xX2hpZ2hlc3QJCUhpZ2hlc3QgbWVhc3VyZWQgdm9sdGFnZQoraW4xX3Jlc2V0X2hpc3RvcnkJV3JpdGUgMSB0byByZXNldCBpbjEgaGlzdG9yeQoraW4xX21pbl9hbGFybQkJVW5kZXJ2b2x0YWdlIGFsYXJtCitpbjFfbWF4X2FsYXJtCQlPdmVydm9sdGFnZSBhbGFybQorCitpbjJfaW5wdXQJCUFESU4gdm9sdGFnZSAobVYpCitpbjJfbWluCQkJVW5kZXJ2b2x0YWdlIHRocmVzaG9sZAoraW4yX21heAkJCU92ZXJ2b2x0YWdlIHRocmVzaG9sZAoraW4yX2xvd2VzdAkJTG93ZXN0IG1lYXN1cmVkIHZvbHRhZ2UKK2luMl9oaWdoZXN0CQlIaWdoZXN0IG1lYXN1cmVkIHZvbHRhZ2UKK2luMl9yZXNldF9oaXN0b3J5CVdyaXRlIDEgdG8gcmVzZXQgaW4yIGhpc3RvcnkKK2luMl9taW5fYWxhcm0JCVVuZGVydm9sdGFnZSBhbGFybQoraW4yX21heF9hbGFybQkJT3ZlcnZvbHRhZ2UgYWxhcm0KKworY3VycjFfaW5wdXQJCVNFTlNFIGN1cnJlbnQgKG1BKQorY3VycjFfbWluCQlVbmRlcmN1cnJlbnQgdGhyZXNob2xkCitjdXJyMV9tYXgJCU92ZXJjdXJyZW50IHRocmVzaG9sZAorY3VycjFfbG93ZXN0CQlMb3dlc3QgbWVhc3VyZWQgY3VycmVudAorY3VycjFfaGlnaGVzdAkJSGlnaGVzdCBtZWFzdXJlZCBjdXJyZW50CitjdXJyMV9yZXNldF9oaXN0b3J5CVdyaXRlIDEgdG8gcmVzZXQgY3VycjEgaGlzdG9yeQorY3VycjFfbWluX2FsYXJtCQlVbmRlcmN1cnJlbnQgYWxhcm0KK2N1cnIxX21heF9hbGFybQkJT3ZlcmN1cnJlbnQgYWxhcm0KKworcG93ZXIxX2lucHV0CQlQb3dlciAoaW4gdVcpLiBQb3dlciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIFNFTlNFKy9WREQKKwkJCXZvbHRhZ2Ugb3IgQURJTiB2b2x0YWdlIGRlcGVuZGluZyBvbiBjaGlwIGNvbmZpZ3VyYXRpb24uCitwb3dlcjFfbWluCQlMb3cgbG93ZXIgdGhyZXNob2xkCitwb3dlcjFfbWF4CQlIaWdoIHBvd2VyIHRocmVzaG9sZAorcG93ZXIxX2lucHV0X2xvd2VzdAlIaXN0b3JpY2FsIG1pbmltdW0gcG93ZXIgdXNlCitwb3dlcjFfaW5wdXRfaGlnaGVzdAlIaXN0b3JpY2FsIG1heGltdW0gcG93ZXIgdXNlCitwb3dlcjFfcmVzZXRfaGlzdG9yeQlXcml0ZSAxIHRvIHJlc2V0IHBvd2VyMSBoaXN0b3J5Citwb3dlcjFfbWluX2FsYXJtCUxvdyBwb3dlciBhbGFybQorcG93ZXIxX21heF9hbGFybQlIaWdoIHBvd2VyIGFsYXJtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NzggYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzI5NzgKaW5kZXggYTA1NDZmYy4uNjg2YzA3OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sdGMyOTc4CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjMjk3OApAQCAtMjMsNiArMjMsMTAgQEAKICAgICBQcmVmaXg6ICdsdGMzODgzJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiAtCiAgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LmxpbmVhci5jb20vcHJvZHVjdC9sdGMzODgzCisgICogTGluZWFyIFRlY2hub2xvZ3kgTFRNNDY3NgorICAgIFByZWZpeDogJ2x0bTQ2NzYnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KKyAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cubGluZWFyLmNvbS9wcm9kdWN0L2x0bTQ2NzYKIAogQXV0aG9yOiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+CiAKQEAgLTMzLDcgKzM3LDggQEAKIExUQzI5NzQgaXMgYSBxdWFkIGRpZ2l0YWwgcG93ZXIgc3VwcGx5IG1hbmFnZXIuIExUQzI5NzggaXMgYW4gb2N0YWwgcG93ZXIgc3VwcGx5CiBtb25pdG9yLiBMVEMyOTc3IGlzIGEgcGluIGNvbXBhdGlibGUgcmVwbGFjZW1lbnQgZm9yIExUQzI5NzguIExUQzM4ODAgaXMgYSBkdWFsCiBvdXRwdXQgcG9seS1waGFzZSBzdGVwLWRvd24gREMvREMgY29udHJvbGxlci4gTFRDMzg4MyBpcyBhIHNpbmdsZSBwaGFzZQotc3RlcC1kb3duIERDL0RDIGNvbnRyb2xsZXIuCitzdGVwLWRvd24gREMvREMgY29udHJvbGxlci4gTFRNNDY3NiBpcyBhIGR1YWwgMTNBIG9yIHNpbmdsZSAyNkEgdU1vZHVsZQorcmVndWxhdG9yLgogCiAKIFVzYWdlIE5vdGVzCkBAIC03NSw3ICs4MCw3IEBACiAJCQlMVEMyOTc0OiBOPTItNQogCQkJTFRDMjk3NzogTj0yLTkKIAkJCUxUQzI5Nzg6IE49Mi05Ci0JCQlMVEMzODgwOiBOPTItMworCQkJTFRDMzg4MCwgTFRNNDY3NjogTj0yLTMKIAkJCUxUQzM4ODM6IE49MgogaW5bTl1faW5wdXQJCU1lYXN1cmVkIG91dHB1dCB2b2x0YWdlLgogaW5bTl1fbWluCQlNaW5pbXVtIG91dHB1dCB2b2x0YWdlLgpAQCAtOTUsNyArMTAwLDcgQEAKIAkJCWFuZCB0ZW1wNSByZXBvcnRzIHRoZSBjaGlwIHRlbXBlcmF0dXJlLgogCQkJT24gTFRDMjk3NyBhbmQgTFRDMjk3OCwgb25seSBvbmUgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQKIAkJCWlzIHN1cHBvcnRlZCBhbmQgcmVwb3J0cyB0aGUgY2hpcCB0ZW1wZXJhdHVyZS4KLQkJCU9uIExUQzM4ODAsIHRlbXAxIGFuZCB0ZW1wMiByZXBvcnQgZXh0ZXJuYWwKKwkJCU9uIExUQzM4ODAgYW5kIExUTTQ2NzYsIHRlbXAxIGFuZCB0ZW1wMiByZXBvcnQgZXh0ZXJuYWwKIAkJCXRlbXBlcmF0dXJlcywgYW5kIHRlbXAzIHJlcG9ydHMgdGhlIGNoaXAgdGVtcGVyYXR1cmUuCiAJCQlPbiBMVEMzODgzLCB0ZW1wMSByZXBvcnRzIGFuIGV4dGVybmFsIHRlbXBlcmF0dXJlLAogCQkJYW5kIHRlbXAyIHJlcG9ydHMgdGhlIGNoaXAgdGVtcGVyYXR1cmUuCkBAIC0xMjMsMTEgKzEyOCwxMSBAQAogCQkJTFRDMjk3NDogTj0xLTQKIAkJCUxUQzI5Nzc6IE5vdCBzdXBwb3J0ZWQKIAkJCUxUQzI5Nzg6IE5vdCBzdXBwb3J0ZWQKLQkJCUxUQzM4ODA6IE49MS0yCisJCQlMVEMzODgwLCBMVE00Njc2OiBOPTEtMgogCQkJTFRDMzg4MzogTj0yCiBwb3dlcltOXV9pbnB1dAkJTWVhc3VyZWQgb3V0cHV0IHBvd2VyLgogCi1jdXJyMV9sYWJlbAkJImlpbiIuIExUQzM4ODAgYW5kIExUQzM4ODMgb25seS4KK2N1cnIxX2xhYmVsCQkiaWluIi4gTFRDMzg4MCwgTFRDMzg4MywgYW5kIExUTTQ2NzYgb25seS4KIGN1cnIxX2lucHV0CQlNZWFzdXJlZCBpbnB1dCBjdXJyZW50LgogY3VycjFfbWF4CQlNYXhpbXVtIGlucHV0IGN1cnJlbnQuCiBjdXJyMV9tYXhfYWxhcm0JCUlucHV0IGN1cnJlbnQgaGlnaCBhbGFybS4KQEAgLTEzOCw3ICsxNDMsNyBAQAogCQkJTFRDMjk3NDogTj0xLTQKIAkJCUxUQzI5Nzc6IG5vdCBzdXBwb3J0ZWQKIAkJCUxUQzI5Nzg6IG5vdCBzdXBwb3J0ZWQKLQkJCUxUQzM4ODA6IE49Mi0zCisJCQlMVEMzODgwLCBMVE00Njc2OiBOPTItMwogCQkJTFRDMzg4MzogTj0yCiBjdXJyW05dX2lucHV0CQlNZWFzdXJlZCBvdXRwdXQgY3VycmVudC4KIGN1cnJbTl1fbWF4CQlNYXhpbXVtIG91dHB1dCBjdXJyZW50LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjYwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjYwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZmY0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyNjAKQEAgLTAsMCArMSw1NiBAQAorS2VybmVsIGRyaXZlciBsdGM0MjYwCis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIExpbmVhciBUZWNobm9sb2d5IExUQzQyNjAKKyAgICBQcmVmaXg6ICdsdGM0MjYwJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiAtCisgICAgRGF0YXNoZWV0OgorICAgICAgICBodHRwOi8vY2RzLmxpbmVhci5jb20vZG9jcy9lbi9kYXRhc2hlZXQvNDI2MGZjLnBkZgorCitBdXRob3I6IEd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIExUQzQyNjAgSG90IFN3YXAgY29udHJvbGxlciBhbGxvd3MgYSBib2FyZCB0byBiZSBzYWZlbHkgaW5zZXJ0ZWQKK2FuZCByZW1vdmVkIGZyb20gYSBsaXZlIGJhY2twbGFuZS4KKworCitVc2FnZSBOb3RlcworLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgZG9lcyBub3QgcHJvYmUgZm9yIExUQzQyNjAgZGV2aWNlcywgc2luY2UgdGhlcmUgaXMgbm8gcmVnaXN0ZXIKK3doaWNoIGNhbiBiZSBzYWZlbHkgdXNlZCB0byBpZGVudGlmeSB0aGUgY2hpcC4gWW91IHdpbGwgaGF2ZSB0byBpbnN0YW50aWF0ZQordGhlIGRldmljZXMgZXhwbGljaXRseS4KKworRXhhbXBsZTogdGhlIGZvbGxvd2luZyB3aWxsIGxvYWQgdGhlIGRyaXZlciBmb3IgYW4gTFRDNDI2MCBhdCBhZGRyZXNzIDB4MTAKK29uIEkyQyBidXMgIzE6CiskIG1vZHByb2JlIGx0YzQyNjAKKyQgZWNobyBsdGM0MjYwIDB4MTAgPiAvc3lzL2J1cy9pMmMvZGV2aWNlcy9pMmMtMS9uZXdfZGV2aWNlCisKKworU3lzZnMgZW50cmllcworLS0tLS0tLS0tLS0tLQorCitWb2x0YWdlIHJlYWRpbmdzIHByb3ZpZGVkIGJ5IHRoaXMgZHJpdmVyIGFyZSByZXBvcnRlZCBhcyBvYnRhaW5lZCBmcm9tIHRoZSBBREMKK3JlZ2lzdGVycy4gSWYgYSBzZXQgb2Ygdm9sdGFnZSBkaXZpZGVyIHJlc2lzdG9ycyBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUKK3JlYWwgdm9sdGFnZSBieSBtdWx0aXBseWluZyB0aGUgcmVwb3J0ZWQgdmFsdWUgd2l0aCAoUjErUjIpL1IyLCB3aGVyZSBSMSBpcyB0aGUKK3ZhbHVlIG9mIHRoZSBkaXZpZGVyIHJlc2lzdG9yIGFnYWluc3QgdGhlIG1lYXN1cmVkIHZvbHRhZ2UgYW5kIFIyIGlzIHRoZSB2YWx1ZQorb2YgdGhlIGRpdmlkZXIgcmVzaXN0b3IgYWdhaW5zdCBHcm91bmQuCisKK0N1cnJlbnQgcmVhZGluZyBwcm92aWRlZCBieSB0aGlzIGRyaXZlciBpcyByZXBvcnRlZCBhcyBvYnRhaW5lZCBmcm9tIHRoZSBBREMKK0N1cnJlbnQgU2Vuc2UgcmVnaXN0ZXIuIFRoZSByZXBvcnRlZCB2YWx1ZSBhc3N1bWVzIHRoYXQgYSAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IKK2lzIGluc3RhbGxlZC4gSWYgYSBkaWZmZXJlbnQgc2Vuc2UgcmVzaXN0b3IgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlIHJlYWwKK2N1cnJlbnQgYnkgZGl2aWRpbmcgdGhlIHJlcG9ydGVkIHZhbHVlIGJ5IHRoZSBzZW5zZSByZXNpc3RvciB2YWx1ZSBpbiBtT2htLgorCitpbjFfaW5wdXQJCVNPVVJDRSB2b2x0YWdlIChtVikKK2luMV9taW5fYWxhcm0JCVVuZGVydm9sdGFnZSBhbGFybQoraW4xX21heF9hbGFybQkJT3ZlcnZvbHRhZ2UgYWxhcm0KKworaW4yX2lucHV0CQlBRElOIHZvbHRhZ2UgKG1WKQoraW4yX2FsYXJtCQlQb3dlciBiYWQgYWxhcm0KKworY3VycjFfaW5wdXQJCVNFTlNFIGN1cnJlbnQgKG1BKQorY3VycjFfYWxhcm0JCVNFTlNFIG92ZXJjdXJyZW50IGFsYXJtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDkxZjBiZTguLmJjMzQ3ODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC0xMDI1LDYgKzEwMjUsMTMgQEAKIAkJCXBhcmFtZXRlciB3aWxsIGZvcmNlIGlhNjRfc2FsX2NhY2hlX2ZsdXNoIHRvIGNhbGwKIAkJCWlhNjRfcGFsX2NhY2hlX2ZsdXNoIGluc3RlYWQgb2YgU0FMX0NBQ0hFX0ZMVVNILgogCisJZm9yY2VwYWUgW1g4Ni0zMl0KKwkJCUZvcmNlZnVsbHkgZW5hYmxlIFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9uIChQQUUpLgorCQkJTWFueSBQZW50aXVtIE0gc3lzdGVtcyBkaXNhYmxlIFBBRSBidXQgbWF5IGhhdmUgYQorCQkJZnVuY3Rpb25hbGx5IHVzYWJsZSBQQUUgaW1wbGVtZW50YXRpb24uCisJCQlXYXJuaW5nOiB1c2Ugb2YgdGhpcyBwYXJhbWV0ZXIgd2lsbCB0YWludCB0aGUga2VybmVsCisJCQlhbmQgbWF5IGNhdXNlIHVua25vd24gcHJvYmxlbXMuCisKIAlmdHJhY2U9W3RyYWNlcl0KIAkJCVtGVFJBQ0VdIHdpbGwgc2V0IGFuZCBzdGFydCB0aGUgc3BlY2lmaWVkIHRyYWNlcgogCQkJYXMgZWFybHkgYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSBlYXJseQpAQCAtMjA2Nyw4ICsyMDc0LDggQEAKIAkJCUlPQVBJQ3MgdGhhdCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgogCiAJbm9rYXNscgkJW1g4Nl0KLQkJCURpc2FibGUga2VybmVsIGJhc2Ugb2Zmc2V0IEFTTFIgKEFkZHJlc3MgU3BhY2UKLQkJCUxheW91dCBSYW5kb21pemF0aW9uKSBpZiBidWlsdCBpbnRvIHRoZSBrZXJuZWwuCisJCQlEaXNhYmxlIGtlcm5lbCBhbmQgbW9kdWxlIGJhc2Ugb2Zmc2V0IEFTTFIgKEFkZHJlc3MKKwkJCVNwYWNlIExheW91dCBSYW5kb21pemF0aW9uKSBpZiBidWlsdCBpbnRvIHRoZSBrZXJuZWwuCiAKIAlub2F1dG9ncm91cAlEaXNhYmxlIHNjaGVkdWxlciBhdXRvbWF0aWMgdGFzayBncm91cCBjcmVhdGlvbi4KIApAQCAtMzQyMywxNCArMzQzMCwyNCBAQAogCQkJCQlvZiBDT05GSUdfSElHSFBURS4KIAogCXZkc289CQlbWDg2LFNIXQotCQkJdmRzbz0yOiBlbmFibGUgY29tcGF0IFZEU08gKGRlZmF1bHQgd2l0aCBDT01QQVRfVkRTTykKLQkJCXZkc289MTogZW5hYmxlIFZEU08gKGRlZmF1bHQpCisJCQlPbiBYODZfMzIsIHRoaXMgaXMgYW4gYWxpYXMgZm9yIHZkc28zMj0uICBPdGhlcndpc2U6CisKKwkJCXZkc289MTogZW5hYmxlIFZEU08gKHRoZSBkZWZhdWx0KQogCQkJdmRzbz0wOiBkaXNhYmxlIFZEU08gbWFwcGluZwogCi0JdmRzbzMyPQkJW1g4Nl0KLQkJCXZkc28zMj0yOiBlbmFibGUgY29tcGF0IFZEU08gKGRlZmF1bHQgd2l0aCBDT01QQVRfVkRTTykKLQkJCXZkc28zMj0xOiBlbmFibGUgMzItYml0IFZEU08gKGRlZmF1bHQpCi0JCQl2ZHNvMzI9MDogZGlzYWJsZSAzMi1iaXQgVkRTTyBtYXBwaW5nCisJdmRzbzMyPQkJW1g4Nl0gQ29udHJvbCB0aGUgMzItYml0IHZEU08KKwkJCXZkc28zMj0xOiBlbmFibGUgMzItYml0IFZEU08KKwkJCXZkc28zMj0wIG9yIHZkc28zMj0yOiBkaXNhYmxlIDMyLWJpdCBWRFNPCisKKwkJCVNlZSB0aGUgaGVscCB0ZXh0IGZvciBDT05GSUdfQ09NUEFUX1ZEU08gZm9yIG1vcmUKKwkJCWRldGFpbHMuICBJZiBDT05GSUdfQ09NUEFUX1ZEU08gaXMgc2V0LCB0aGUgZGVmYXVsdCBpcworCQkJdmRzbzMyPTA7IG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgaXMgdmRzbzMyPTEuCisKKwkJCUZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIga2VybmVscywgdmRzbzMyPTIgaXMgYW4KKwkJCWFsaWFzIGZvciB2ZHNvMzI9MC4KKworCQkJVHJ5IHZkc28zMj0wIGlmIHlvdSBlbmNvdW50ZXIgYW4gZXJyb3IgdGhhdCBzYXlzOgorCQkJZGxfbWFpbjogQXNzZXJ0aW9uIGAodm9pZCAqKSBwaC0+cF92YWRkciA9PSBfcnRsZF9sb2NhbC5fZGxfc3lzaW5mb19kc28nIGZhaWxlZCEKIAogCXZlY3Rvcj0JCVtJQS02NCxTTVBdCiAJCQl2ZWN0b3I9cGVyY3B1OiBlbmFibGUgcGVyY3B1IHZlY3RvciBkb21haW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGVyLUNQVS1rdGhyZWFkcy50eHQKaW5kZXggODI3MTA0Zi4uZjNjZDI5OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGVyLUNQVS1rdGhyZWFkcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGVyLUNQVS1rdGhyZWFkcy50eHQKQEAgLTE2Miw3ICsxNjIsMTggQEAKIFRvIHJlZHVjZSBpdHMgT1Mgaml0dGVyLCBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzoKIDEuCVJ1biB5b3VyIHdvcmtsb2FkIGF0IGEgcmVhbC10aW1lIHByaW9yaXR5LCB3aGljaCB3aWxsIGFsbG93CiAJcHJlZW1wdGluZyB0aGUga3dvcmtlciBkYWVtb25zLgotMi4JRG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgbmVlZGVkIHRvIGF2b2lkIGppdHRlciB0aGF0IHlvdXIKKzIuCUEgZ2l2ZW4gd29ya3F1ZXVlIGNhbiBiZSBtYWRlIHZpc2libGUgaW4gdGhlIHN5c2ZzIGZpbGVzeXN0ZW0KKwlieSBwYXNzaW5nIHRoZSBXUV9TWVNGUyB0byB0aGF0IHdvcmtxdWV1ZSdzIGFsbG9jX3dvcmtxdWV1ZSgpLgorCVN1Y2ggYSB3b3JrcXVldWUgY2FuIGJlIGNvbmZpbmVkIHRvIGEgZ2l2ZW4gc3Vic2V0IG9mIHRoZQorCUNQVXMgdXNpbmcgdGhlIC9zeXMvZGV2aWNlcy92aXJ0dWFsL3dvcmtxdWV1ZS8qL2NwdW1hc2sgc3lzZnMKKwlmaWxlcy4JVGhlIHNldCBvZiBXUV9TWVNGUyB3b3JrcXVldWVzIGNhbiBiZSBkaXNwbGF5ZWQgdXNpbmcKKwkibHMgc3lzL2RldmljZXMvdmlydHVhbC93b3JrcXVldWUiLiAgVGhhdCBzYWlkLCB0aGUgd29ya3F1ZXVlcworCW1haW50YWluZXIgd291bGQgbGlrZSB0byBjYXV0aW9uIHBlb3BsZSBhZ2FpbnN0IGluZGlzY3JpbWluYXRlbHkKKwlzcHJpbmtsaW5nIFdRX1NZU0ZTIGFjcm9zcyBhbGwgdGhlIHdvcmtxdWV1ZXMuCVRoZSByZWFzb24gZm9yCisJY2F1dGlvbiBpcyB0aGF0IGl0IGlzIGVhc3kgdG8gYWRkIFdRX1NZU0ZTLCBidXQgYmVjYXVzZSBzeXNmcyBpcworCXBhcnQgb2YgdGhlIGZvcm1hbCB1c2VyL2tlcm5lbCBBUEksIGl0IGNhbiBiZSBuZWFybHkgaW1wb3NzaWJsZQorCXRvIHJlbW92ZSBpdCwgZXZlbiBpZiBpdHMgYWRkaXRpb24gd2FzIGEgbWlzdGFrZS4KKzMuCURvIGFueSBvZiB0aGUgZm9sbG93aW5nIG5lZWRlZCB0byBhdm9pZCBqaXR0ZXIgdGhhdCB5b3VyCiAJYXBwbGljYXRpb24gY2Fubm90IHRvbGVyYXRlOgogCWEuCUJ1aWxkIHlvdXIga2VybmVsIHdpdGggQ09ORklHX1NMVUI9eSByYXRoZXIgdGhhbgogCQlDT05GSUdfU0xBQj15LCB0aHVzIGF2b2lkaW5nIHRoZSBzbGFiIGFsbG9jYXRvcidzIHBlcmlvZGljCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKaW5kZXggMTAyZGMxOS4uMTFjMWQyMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dApAQCAtNjA4LDI2ICs2MDgsMzAgQEAKIAliID0gcDsgIC8qIEJVRzogQ29tcGlsZXIgY2FuIHJlb3JkZXIhISEgKi8KIAlkb19zb21ldGhpbmcoKTsKIAotVGhlIHNvbHV0aW9uIGlzIGFnYWluIEFDQ0VTU19PTkNFKCksIHdoaWNoIHByZXNlcnZlcyB0aGUgb3JkZXJpbmcgYmV0d2VlbgotdGhlIGxvYWQgZnJvbSB2YXJpYWJsZSAnYScgYW5kIHRoZSBzdG9yZSB0byB2YXJpYWJsZSAnYic6CitUaGUgc29sdXRpb24gaXMgYWdhaW4gQUNDRVNTX09OQ0UoKSBhbmQgYmFycmllcigpLCB3aGljaCBwcmVzZXJ2ZXMgdGhlCitvcmRlcmluZyBiZXR3ZWVuIHRoZSBsb2FkIGZyb20gdmFyaWFibGUgJ2EnIGFuZCB0aGUgc3RvcmUgdG8gdmFyaWFibGUgJ2InOgogCiAJcSA9IEFDQ0VTU19PTkNFKGEpOwogCWlmIChxKSB7CisJCWJhcnJpZXIoKTsKIAkJQUNDRVNTX09OQ0UoYikgPSBwOwogCQlkb19zb21ldGhpbmcoKTsKIAl9IGVsc2UgeworCQliYXJyaWVyKCk7CiAJCUFDQ0VTU19PTkNFKGIpID0gcDsKIAkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKIAl9CiAKLVlvdSBjb3VsZCBhbHNvIHVzZSBiYXJyaWVyKCkgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBtb3ZpbmcKLXRoZSBzdG9yZXMgdG8gdmFyaWFibGUgJ2InLCBidXQgYmFycmllcigpIHdvdWxkIG5vdCBwcmV2ZW50IHRoZQotY29tcGlsZXIgZnJvbSBwcm92aW5nIHRvIGl0c2VsZiB0aGF0IGE9PTEgYWx3YXlzLCBzbyBBQ0NFU1NfT05DRSgpCi1pcyBhbHNvIG5lZWRlZC4KK1RoZSBpbml0aWFsIEFDQ0VTU19PTkNFKCkgaXMgcmVxdWlyZWQgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbQorcHJvdmluZyB0aGUgdmFsdWUgb2YgJ2EnLCBhbmQgdGhlIHBhaXIgb2YgYmFycmllcigpIGludm9jYXRpb25zIGFyZQorcmVxdWlyZWQgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBwdWxsaW5nIHRoZSB0d28gaWRlbnRpY2FsIHN0b3JlcwordG8gJ2InIG91dCBmcm9tIHRoZSBsZWdzIG9mIHRoZSAiaWYiIHN0YXRlbWVudC4KIAogSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBjb250cm9sIGRlcGVuZGVuY2llcyBhYnNvbHV0ZWx5IHJlcXVpcmUgYQogYSBjb25kaXRpb25hbC4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nICJvcHRpbWl6ZWQiIHZlcnNpb24gb2YKLXRoZSBhYm92ZSBleGFtcGxlIGJyZWFrcyBvcmRlcmluZzoKK3RoZSBhYm92ZSBleGFtcGxlIGJyZWFrcyBvcmRlcmluZywgd2hpY2ggaXMgd2h5IHRoZSBiYXJyaWVyKCkgaW52b2NhdGlvbnMKK2FyZSBhYnNvbHV0ZWx5IHJlcXVpcmVkIGlmIHlvdSBoYXZlIGlkZW50aWNhbCBzdG9yZXMgaW4gYm90aCBsZWdzIG9mCit0aGUgImlmIiBzdGF0ZW1lbnQ6CiAKIAlxID0gQUNDRVNTX09OQ0UoYSk7CiAJQUNDRVNTX09OQ0UoYikgPSBwOyAgLyogQlVHOiBObyBvcmRlcmluZyB2cy4gbG9hZCBmcm9tIGEhISEgKi8KQEAgLTY0Myw5ICs2NDcsMTEgQEAKIGZvciBleGFtcGxlLCBhcyBmb2xsb3dzOgogCiAJaWYgKEFDQ0VTU19PTkNFKGEpID4gMCkgeworCQliYXJyaWVyKCk7CiAJCUFDQ0VTU19PTkNFKGIpID0gcSAvIDI7CiAJCWRvX3NvbWV0aGluZygpOwogCX0gZWxzZSB7CisJCWJhcnJpZXIoKTsKIAkJQUNDRVNTX09OQ0UoYikgPSBxIC8gMzsKIAkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKIAl9CkBAIC02NTksOSArNjY1LDExIEBACiAKIAlxID0gQUNDRVNTX09OQ0UoYSk7CiAJaWYgKHEgJSBNQVgpIHsKKwkJYmFycmllcigpOwogCQlBQ0NFU1NfT05DRShiKSA9IHA7CiAJCWRvX3NvbWV0aGluZygpOwogCX0gZWxzZSB7CisJCWJhcnJpZXIoKTsKIAkJQUNDRVNTX09OQ0UoYikgPSBwOwogCQlkb19zb21ldGhpbmdfZWxzZSgpOwogCX0KQEAgLTcyMyw4ICs3MzEsMTMgQEAKICAgICAgIHVzZSBzbWJfcm1iKCksIHNtcF93bWIoKSwgb3IsIGluIHRoZSBjYXNlIG9mIHByaW9yIHN0b3JlcyBhbmQKICAgICAgIGxhdGVyIGxvYWRzLCBzbXBfbWIoKS4KIAorICAoKikgSWYgYm90aCBsZWdzIG9mIHRoZSAiaWYiIHN0YXRlbWVudCBiZWdpbiB3aXRoIGlkZW50aWNhbCBzdG9yZXMKKyAgICAgIHRvIHRoZSBzYW1lIHZhcmlhYmxlLCBhIGJhcnJpZXIoKSBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgYXQgdGhlCisgICAgICBiZWdpbm5pbmcgb2YgZWFjaCBsZWcgb2YgdGhlICJpZiIgc3RhdGVtZW50LgorCiAgICgqKSBDb250cm9sIGRlcGVuZGVuY2llcyByZXF1aXJlIGF0IGxlYXN0IG9uZSBydW4tdGltZSBjb25kaXRpb25hbAotICAgICAgYmV0d2VlbiB0aGUgcHJpb3IgbG9hZCBhbmQgdGhlIHN1YnNlcXVlbnQgc3RvcmUuICBJZiB0aGUgY29tcGlsZXIKKyAgICAgIGJldHdlZW4gdGhlIHByaW9yIGxvYWQgYW5kIHRoZSBzdWJzZXF1ZW50IHN0b3JlLCBhbmQgdGhpcworICAgICAgY29uZGl0aW9uYWwgbXVzdCBpbnZvbHZlIHRoZSBwcmlvciBsb2FkLiAgSWYgdGhlIGNvbXBpbGVyCiAgICAgICBpcyBhYmxlIHRvIG9wdGltaXplIHRoZSBjb25kaXRpb25hbCBhd2F5LCBpdCB3aWxsIGhhdmUgYWxzbwogICAgICAgb3B0aW1pemVkIGF3YXkgdGhlIG9yZGVyaW5nLiAgQ2FyZWZ1bCB1c2Ugb2YgQUNDRVNTX09OQ0UoKSBjYW4KICAgICAgIGhlbHAgdG8gcHJlc2VydmUgdGhlIG5lZWRlZCBjb25kaXRpb25hbC4KQEAgLTEyNDksNiArMTI2MiwyMyBAQAogd2hpbGUgcGVyZmVjdGx5IHNhZmUgaW4gc2luZ2xlLXRocmVhZGVkIGNvZGUsIGNhbiBiZSBmYXRhbCBpbiBjb25jdXJyZW50CiBjb2RlLiAgSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiB0aGVzZSBzb3J0cyBvZiBvcHRpbWl6YXRpb25zOgogCisgKCopIFRoZSBjb21waWxlciBpcyB3aXRoaW4gaXRzIHJpZ2h0cyB0byByZW9yZGVyIGxvYWRzIGFuZCBzdG9yZXMKKyAgICAgdG8gdGhlIHNhbWUgdmFyaWFibGUsIGFuZCBpbiBzb21lIGNhc2VzLCB0aGUgQ1BVIGlzIHdpdGhpbiBpdHMKKyAgICAgcmlnaHRzIHRvIHJlb3JkZXIgbG9hZHMgdG8gdGhlIHNhbWUgdmFyaWFibGUuICBUaGlzIG1lYW5zIHRoYXQKKyAgICAgdGhlIGZvbGxvd2luZyBjb2RlOgorCisJYVswXSA9IHg7CisJYVsxXSA9IHg7CisKKyAgICAgTWlnaHQgcmVzdWx0IGluIGFuIG9sZGVyIHZhbHVlIG9mIHggc3RvcmVkIGluIGFbMV0gdGhhbiBpbiBhWzBdLgorICAgICBQcmV2ZW50IGJvdGggdGhlIGNvbXBpbGVyIGFuZCB0aGUgQ1BVIGZyb20gZG9pbmcgdGhpcyBhcyBmb2xsb3dzOgorCisJYVswXSA9IEFDQ0VTU19PTkNFKHgpOworCWFbMV0gPSBBQ0NFU1NfT05DRSh4KTsKKworICAgICBJbiBzaG9ydCwgQUNDRVNTX09OQ0UoKSBwcm92aWRlcyBjYWNoZSBjb2hlcmVuY2UgZm9yIGFjY2Vzc2VzIGZyb20KKyAgICAgbXVsdGlwbGUgQ1BVcyB0byBhIHNpbmdsZSB2YXJpYWJsZS4KKwogICgqKSBUaGUgY29tcGlsZXIgaXMgd2l0aGluIGl0cyByaWdodHMgdG8gbWVyZ2Ugc3VjY2Vzc2l2ZSBsb2FkcyBmcm9tCiAgICAgIHRoZSBzYW1lIHZhcmlhYmxlLiAgU3VjaCBtZXJnaW5nIGNhbiBjYXVzZSB0aGUgY29tcGlsZXIgdG8gIm9wdGltaXplIgogICAgICB0aGUgZm9sbG93aW5nIGNvZGU6CkBAIC0xNjQ0LDEyICsxNjc0LDEyIEBACiAgICAgIE1lbW9yeSBvcGVyYXRpb25zIGlzc3VlZCBhZnRlciB0aGUgQUNRVUlSRSB3aWxsIGJlIGNvbXBsZXRlZCBhZnRlciB0aGUKICAgICAgQUNRVUlSRSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KIAotICAgICBNZW1vcnkgb3BlcmF0aW9ucyBpc3N1ZWQgYmVmb3JlIHRoZSBBQ1FVSVJFIG1heSBiZSBjb21wbGV0ZWQgYWZ0ZXIgdGhlCi0gICAgIEFDUVVJUkUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuICBBbiBzbXBfbWJfX2JlZm9yZV9zcGlubG9jaygpLCBjb21iaW5lZAotICAgICB3aXRoIGEgZm9sbG93aW5nIEFDUVVJUkUsIG9yZGVycyBwcmlvciBsb2FkcyBhZ2FpbnN0IHN1YnNlcXVlbnQgc3RvcmVzIGFuZAotICAgICBzdG9yZXMgYW5kIHByaW9yIHN0b3JlcyBhZ2FpbnN0IHN1YnNlcXVlbnQgc3RvcmVzLiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAgICAgd2Vha2VyIHRoYW4gc21wX21iKCkhICBUaGUgc21wX21iX19iZWZvcmVfc3BpbmxvY2soKSBwcmltaXRpdmUgaXMgZnJlZSBvbgotICAgICBtYW55IGFyY2hpdGVjdHVyZXMuCisgICAgIE1lbW9yeSBvcGVyYXRpb25zIGlzc3VlZCBiZWZvcmUgdGhlIEFDUVVJUkUgbWF5IGJlIGNvbXBsZXRlZCBhZnRlcgorICAgICB0aGUgQUNRVUlSRSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4gIEFuIHNtcF9tYl9fYmVmb3JlX3NwaW5sb2NrKCksCisgICAgIGNvbWJpbmVkIHdpdGggYSBmb2xsb3dpbmcgQUNRVUlSRSwgb3JkZXJzIHByaW9yIGxvYWRzIGFnYWluc3QKKyAgICAgc3Vic2VxdWVudCBsb2FkcyBhbmQgc3RvcmVzIGFuZCBhbHNvIG9yZGVycyBwcmlvciBzdG9yZXMgYWdhaW5zdAorICAgICBzdWJzZXF1ZW50IHN0b3Jlcy4gIE5vdGUgdGhhdCB0aGlzIGlzIHdlYWtlciB0aGFuIHNtcF9tYigpISAgVGhlCisgICAgIHNtcF9tYl9fYmVmb3JlX3NwaW5sb2NrKCkgcHJpbWl0aXZlIGlzIGZyZWUgb24gbWFueSBhcmNoaXRlY3R1cmVzLgogCiAgKDIpIFJFTEVBU0Ugb3BlcmF0aW9uIGltcGxpY2F0aW9uOgogCkBAIC0xNjk0LDI0ICsxNzI0LDIxIEBACiAKIAlBQ1FVSVJFIE0sIFNUT1JFICpCLCBTVE9SRSAqQSwgUkVMRUFTRSBNCiAKLVRoaXMgc2FtZSByZW9yZGVyaW5nIGNhbiBvZiBjb3Vyc2Ugb2NjdXIgaWYgdGhlIGxvY2sncyBBQ1FVSVJFIGFuZCBSRUxFQVNFIGFyZQotdG8gdGhlIHNhbWUgbG9jayB2YXJpYWJsZSwgYnV0IG9ubHkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYW5vdGhlciBDUFUgbm90Ci1ob2xkaW5nIHRoYXQgbG9jay4KK1doZW4gdGhlIEFDUVVJUkUgYW5kIFJFTEVBU0UgYXJlIGEgbG9jayBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSwKK3Jlc3BlY3RpdmVseSwgdGhpcyBzYW1lIHJlb3JkZXJpbmcgY2FuIG9jY3VyIGlmIHRoZSBsb2NrJ3MgQUNRVUlSRSBhbmQKK1JFTEVBU0UgYXJlIHRvIHRoZSBzYW1lIGxvY2sgdmFyaWFibGUsIGJ1dCBvbmx5IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mCithbm90aGVyIENQVSBub3QgaG9sZGluZyB0aGF0IGxvY2suICBJbiBzaG9ydCwgYSBBQ1FVSVJFIGZvbGxvd2VkIGJ5IGFuCitSRUxFQVNFIG1heSAtbm90LSBiZSBhc3N1bWVkIHRvIGJlIGEgZnVsbCBtZW1vcnkgYmFycmllci4KIAotSW4gc2hvcnQsIGEgUkVMRUFTRSBmb2xsb3dlZCBieSBhbiBBQ1FVSVJFIG1heSAtbm90LSBiZSBhc3N1bWVkIHRvIGJlIGEgZnVsbAotbWVtb3J5IGJhcnJpZXIgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSBmb3IgYSBwcmVjZWRpbmcgUkVMRUFTRSB0byBwYXNzIGEKLWxhdGVyIEFDUVVJUkUgZnJvbSB0aGUgdmlld3BvaW50IG9mIHRoZSBDUFUsIGJ1dCBub3QgZnJvbSB0aGUgdmlld3BvaW50Ci1vZiB0aGUgY29tcGlsZXIuICBOb3RlIHRoYXQgZGVhZGxvY2tzIGNhbm5vdCBiZSBpbnRyb2R1Y2VkIGJ5IHRoaXMKLWludGVyY2hhbmdlIGJlY2F1c2UgaWYgc3VjaCBhIGRlYWRsb2NrIHRocmVhdGVuZWQsIHRoZSBSRUxFQVNFIHdvdWxkCi1zaW1wbHkgY29tcGxldGUuCi0KLUlmIGl0IGlzIG5lY2Vzc2FyeSBmb3IgYSBSRUxFQVNFLUFDUVVJUkUgcGFpciB0byBwcm9kdWNlIGEgZnVsbCBiYXJyaWVyLCB0aGUKLUFDUVVJUkUgY2FuIGJlIGZvbGxvd2VkIGJ5IGFuIHNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKSBpbnZvY2F0aW9uLiAgVGhpcwotd2lsbCBwcm9kdWNlIGEgZnVsbCBiYXJyaWVyIGlmIGVpdGhlciAoYSkgdGhlIFJFTEVBU0UgYW5kIHRoZSBBQ1FVSVJFIGFyZQotZXhlY3V0ZWQgYnkgdGhlIHNhbWUgQ1BVIG9yIHRhc2ssIG9yIChiKSB0aGUgUkVMRUFTRSBhbmQgQUNRVUlSRSBhY3Qgb24gdGhlCi1zYW1lIHZhcmlhYmxlLiAgVGhlIHNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKSBwcmltaXRpdmUgaXMgZnJlZSBvbiBtYW55Ci1hcmNoaXRlY3R1cmVzLiAgV2l0aG91dCBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCksIHRoZSBjcml0aWNhbCBzZWN0aW9ucwotY29ycmVzcG9uZGluZyB0byB0aGUgUkVMRUFTRSBhbmQgdGhlIEFDUVVJUkUgY2FuIGNyb3NzOgorU2ltaWxhcmx5LCB0aGUgcmV2ZXJzZSBjYXNlIG9mIGEgUkVMRUFTRSBmb2xsb3dlZCBieSBhbiBBQ1FVSVJFIGRvZXMgbm90CitpbXBseSBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIuICBJZiBpdCBpcyBuZWNlc3NhcnkgZm9yIGEgUkVMRUFTRS1BQ1FVSVJFCitwYWlyIHRvIHByb2R1Y2UgYSBmdWxsIGJhcnJpZXIsIHRoZSBBQ1FVSVJFIGNhbiBiZSBmb2xsb3dlZCBieSBhbgorc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpIGludm9jYXRpb24uICBUaGlzIHdpbGwgcHJvZHVjZSBhIGZ1bGwgYmFycmllcgoraWYgZWl0aGVyIChhKSB0aGUgUkVMRUFTRSBhbmQgdGhlIEFDUVVJUkUgYXJlIGV4ZWN1dGVkIGJ5IHRoZSBzYW1lCitDUFUgb3IgdGFzaywgb3IgKGIpIHRoZSBSRUxFQVNFIGFuZCBBQ1FVSVJFIGFjdCBvbiB0aGUgc2FtZSB2YXJpYWJsZS4KK1RoZSBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCkgcHJpbWl0aXZlIGlzIGZyZWUgb24gbWFueSBhcmNoaXRlY3R1cmVzLgorV2l0aG91dCBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCksIHRoZSBDUFUncyBleGVjdXRpb24gb2YgdGhlIGNyaXRpY2FsCitzZWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBSRUxFQVNFIGFuZCB0aGUgQUNRVUlSRSBjYW4gY3Jvc3MsIHNvIHRoYXQ6CiAKIAkqQSA9IGE7CiAJUkVMRUFTRSBNCkBAIC0xNzIyLDcgKzE3NDksMzYgQEAKIAogCUFDUVVJUkUgTiwgU1RPUkUgKkIsIFNUT1JFICpBLCBSRUxFQVNFIE0KIAotV2l0aCBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCksIHRoZXkgY2Fubm90LCBzbyB0aGF0OgorSXQgbWlnaHQgYXBwZWFyIHRoYXQgdGhpcyByZW9yZGVyaW5nIGNvdWxkIGludHJvZHVjZSBhIGRlYWRsb2NrLgorSG93ZXZlciwgdGhpcyBjYW5ub3QgaGFwcGVuIGJlY2F1c2UgaWYgc3VjaCBhIGRlYWRsb2NrIHRocmVhdGVuZWQsCit0aGUgUkVMRUFTRSB3b3VsZCBzaW1wbHkgY29tcGxldGUsIHRoZXJlYnkgYXZvaWRpbmcgdGhlIGRlYWRsb2NrLgorCisJV2h5IGRvZXMgdGhpcyB3b3JrPworCisJT25lIGtleSBwb2ludCBpcyB0aGF0IHdlIGFyZSBvbmx5IHRhbGtpbmcgYWJvdXQgdGhlIENQVSBkb2luZworCXRoZSByZW9yZGVyaW5nLCBub3QgdGhlIGNvbXBpbGVyLiAgSWYgdGhlIGNvbXBpbGVyIChvciwgZm9yCisJdGhhdCBtYXR0ZXIsIHRoZSBkZXZlbG9wZXIpIHN3aXRjaGVkIHRoZSBvcGVyYXRpb25zLCBkZWFkbG9jaworCS1jb3VsZC0gb2NjdXIuCisKKwlCdXQgc3VwcG9zZSB0aGUgQ1BVIHJlb3JkZXJlZCB0aGUgb3BlcmF0aW9ucy4gIEluIHRoaXMgY2FzZSwKKwl0aGUgdW5sb2NrIHByZWNlZGVzIHRoZSBsb2NrIGluIHRoZSBhc3NlbWJseSBjb2RlLiAgVGhlIENQVQorCXNpbXBseSBlbGVjdGVkIHRvIHRyeSBleGVjdXRpbmcgdGhlIGxhdGVyIGxvY2sgb3BlcmF0aW9uIGZpcnN0LgorCUlmIHRoZXJlIGlzIGEgZGVhZGxvY2ssIHRoaXMgbG9jayBvcGVyYXRpb24gd2lsbCBzaW1wbHkgc3BpbiAob3IKKwl0cnkgdG8gc2xlZXAsIGJ1dCBtb3JlIG9uIHRoYXQgbGF0ZXIpLglUaGUgQ1BVIHdpbGwgZXZlbnR1YWxseQorCWV4ZWN1dGUgdGhlIHVubG9jayBvcGVyYXRpb24gKHdoaWNoIHByZWNlZGVkIHRoZSBsb2NrIG9wZXJhdGlvbgorCWluIHRoZSBhc3NlbWJseSBjb2RlKSwgd2hpY2ggd2lsbCB1bnJhdmVsIHRoZSBwb3RlbnRpYWwgZGVhZGxvY2ssCisJYWxsb3dpbmcgdGhlIGxvY2sgb3BlcmF0aW9uIHRvIHN1Y2NlZWQuCisKKwlCdXQgd2hhdCBpZiB0aGUgbG9jayBpcyBhIHNsZWVwbG9jaz8gIEluIHRoYXQgY2FzZSwgdGhlIGNvZGUgd2lsbAorCXRyeSB0byBlbnRlciB0aGUgc2NoZWR1bGVyLCB3aGVyZSBpdCB3aWxsIGV2ZW50dWFsbHkgZW5jb3VudGVyCisJYSBtZW1vcnkgYmFycmllciwgd2hpY2ggd2lsbCBmb3JjZSB0aGUgZWFybGllciB1bmxvY2sgb3BlcmF0aW9uCisJdG8gY29tcGxldGUsIGFnYWluIHVucmF2ZWxpbmcgdGhlIGRlYWRsb2NrLiAgVGhlcmUgbWlnaHQgYmUKKwlhIHNsZWVwLXVubG9jayByYWNlLCBidXQgdGhlIGxvY2tpbmcgcHJpbWl0aXZlIG5lZWRzIHRvIHJlc29sdmUKKwlzdWNoIHJhY2VzIHByb3Blcmx5IGluIGFueSBjYXNlLgorCitXaXRoIHNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKSwgdGhlIHR3byBjcml0aWNhbCBzZWN0aW9ucyBjYW5ub3Qgb3ZlcmxhcC4KK0ZvciBleGFtcGxlLCB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZSwgdGhlIHN0b3JlIHRvICpBIHdpbGwgYWx3YXlzIGJlCitzZWVuIGJ5IG90aGVyIENQVXMgYmVmb3JlIHRoZSBzdG9yZSB0byAqQjoKIAogCSpBID0gYTsKIAlSRUxFQVNFIE0KQEAgLTE3MzAsMTMgKzE3ODYsMTggQEAKIAlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7CiAJKkIgPSBiOwogCi13aWxsIGFsd2F5cyBvY2N1ciBhcyBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZzoKK1RoZSBvcGVyYXRpb25zIHdpbGwgYWx3YXlzIG9jY3VyIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9yZGVyczoKIAotCVNUT1JFICpBLCBSRUxFQVNFLCBBQ1FVSVJFLCBTVE9SRSAqQgotCVNUT1JFICpBLCBBQ1FVSVJFLCBSRUxFQVNFLCBTVE9SRSAqQgorCVNUT1JFICpBLCBSRUxFQVNFLCBBQ1FVSVJFLCBzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCksIFNUT1JFICpCCisJU1RPUkUgKkEsIEFDUVVJUkUsIFJFTEVBU0UsIHNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKSwgU1RPUkUgKkIKKwlBQ1FVSVJFLCBTVE9SRSAqQSwgUkVMRUFTRSwgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpLCBTVE9SRSAqQgogCiBJZiB0aGUgUkVMRUFTRSBhbmQgQUNRVUlSRSB3ZXJlIGluc3RlYWQgYm90aCBvcGVyYXRpbmcgb24gdGhlIHNhbWUgbG9jawotdmFyaWFibGUsIG9ubHkgdGhlIGZpcnN0IG9mIHRoZXNlIHR3byBhbHRlcm5hdGl2ZXMgY2FuIG9jY3VyLgordmFyaWFibGUsIG9ubHkgdGhlIGZpcnN0IG9mIHRoZXNlIGFsdGVybmF0aXZlcyBjYW4gb2NjdXIuICBJbiBhZGRpdGlvbiwKK3RoZSBtb3JlIHN0cm9uZ2x5IG9yZGVyZWQgc3lzdGVtcyBtYXkgcnVsZSBvdXQgc29tZSBvZiB0aGUgYWJvdmUgb3JkZXJzLgorQnV0IGluIGFueSBjYXNlLCBhcyBub3RlZCBlYXJsaWVyLCB0aGUgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpCitlbnN1cmVzIHRoYXQgdGhlIHN0b3JlIHRvICpBIHdpbGwgYWx3YXlzIGJlIHNlZW4gYXMgaGFwcGVuaW5nIGJlZm9yZQordGhlIHN0b3JlIHRvICpCLgogCiBMb2NrcyBhbmQgc2VtYXBob3JlcyBtYXkgbm90IHByb3ZpZGUgYW55IGd1YXJhbnRlZSBvZiBvcmRlcmluZyBvbiBVUCBjb21waWxlZAogc3lzdGVtcywgYW5kIHNvIGNhbm5vdCBiZSBjb3VudGVkIG9uIGluIHN1Y2ggYSBzaXR1YXRpb24gdG8gYWN0dWFsbHkgYWNoaWV2ZQpAQCAtMjc1Nyw3ICsyODE4LDcgQEAKIGNvbWJpbmF0aW9uIG9mIGVsZW1lbnRzIGNvbWJpbmVkIG9yIGRpc2NhcmRlZCwgcHJvdmlkZWQgdGhlIHByb2dyYW0ncyB2aWV3IG9mCiB0aGUgd29ybGQgcmVtYWlucyBjb25zaXN0ZW50LiAgTm90ZSB0aGF0IEFDQ0VTU19PTkNFKCkgaXMgLW5vdC0gb3B0aW9uYWwKIGluIHRoZSBhYm92ZSBleGFtcGxlLCBhcyB0aGVyZSBhcmUgYXJjaGl0ZWN0dXJlcyB3aGVyZSBhIGdpdmVuIENQVSBtaWdodAotaW50ZXJjaGFuZ2Ugc3VjY2Vzc2l2ZSBsb2FkcyB0byB0aGUgc2FtZSBsb2NhdGlvbi4gIE9uIHN1Y2ggYXJjaGl0ZWN0dXJlcywKK3Jlb3JkZXIgc3VjY2Vzc2l2ZSBsb2FkcyB0byB0aGUgc2FtZSBsb2NhdGlvbi4gIE9uIHN1Y2ggYXJjaGl0ZWN0dXJlcywKIEFDQ0VTU19PTkNFKCkgZG9lcyB3aGF0ZXZlciBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGlzLCBmb3IgZXhhbXBsZSwgb24KIEl0YW5pdW0gdGhlIHZvbGF0aWxlIGNhc3RzIHVzZWQgYnkgQUNDRVNTX09OQ0UoKSBjYXVzZSBHQ0MgdG8gZW1pdCB0aGUKIHNwZWNpYWwgbGQuYWNxIGFuZCBzdC5yZWwgaW5zdHJ1Y3Rpb25zIHRoYXQgcHJldmVudCBzdWNoIHJlb3JkZXJpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0bGlua19tbWFwLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRsaW5rX21tYXAudHh0CmluZGV4IGIyNjEyMjkuLmM2YWY0YmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRsaW5rX21tYXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRsaW5rX21tYXAudHh0CkBAIC0yMjYsOSArMjI2LDkgQEAKIAl2b2lkICpyeF9yaW5nLCAqdHhfcmluZzsKIAogCS8qIENvbmZpZ3VyZSByaW5nIHBhcmFtZXRlcnMgKi8KLQlpZiAoc2V0c29ja29wdChmZCwgTkVUTElOS19SWF9SSU5HLCAmcmVxLCBzaXplb2YocmVxKSkgPCAwKQorCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfTkVUTElOSywgTkVUTElOS19SWF9SSU5HLCAmcmVxLCBzaXplb2YocmVxKSkgPCAwKQogCQlleGl0KDEpOwotCWlmIChzZXRzb2Nrb3B0KGZkLCBORVRMSU5LX1RYX1JJTkcsICZyZXEsIHNpemVvZihyZXEpKSA8IDApCisJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9ORVRMSU5LLCBORVRMSU5LX1RYX1JJTkcsICZyZXEsIHNpemVvZihyZXEpKSA8IDApCiAJCWV4aXQoMSkKIAogCS8qIENhbGN1bGF0ZSBzaXplIG9mIGVhY2ggaW5kaXZpZHVhbCByaW5nICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BoeS9zYW1zdW5nLXVzYjIudHh0IGIvRG9jdW1lbnRhdGlvbi9waHkvc2Ftc3VuZy11c2IyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDEyZDQzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9waHkvc2Ftc3VuZy11c2IyLnR4dApAQCAtMCwwICsxLDEzNSBAQAorLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wJCQlTYW1zdW5nIFVTQiAyLjAgUEhZIGFkYXB0YXRpb24gbGF5ZXIJCSAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rJworCit8IDEuIERlc2NyaXB0aW9uCisrLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBVU0IgMi4wIFBIWSBtb2R1bGUgaW4gU2Ftc3VuZyBTb0NzIGlzIHNpbWlsYXIKK2Ftb25nIG1hbnkgU29Dcy4gSW4gc3BpdGUgb2YgdGhlIHNpbWlsYXJpdGllcyBpdCBwcm92ZWQgZGlmZmljdWx0IHRvCitjcmVhdGUgYSBvbmUgZHJpdmVyIHRoYXQgd291bGQgZml0IGFsbCB0aGVzZSBQSFkgY29udHJvbGxlcnMuIE9mdGVuCit0aGUgZGlmZmVyZW5jZXMgd2VyZSBtaW5vciBhbmQgd2VyZSBmb3VuZCBpbiBwYXJ0aWN1bGFyIGJpdHMgb2YgdGhlCityZWdpc3RlcnMgb2YgdGhlIFBIWS4gSW4gc29tZSByYXJlIGNhc2VzIHRoZSBvcmRlciBvZiByZWdpc3RlciB3cml0ZXMgb3IKK3RoZSBQSFkgcG93ZXJpbmcgdXAgcHJvY2VzcyBoYWQgdG8gYmUgYWx0ZXJlZC4gVGhpcyBhZGFwdGF0aW9uIGxheWVyIGlzCithIGNvbXByb21pc2UgYmV0d2VlbiBoYXZpbmcgc2VwYXJhdGUgZHJpdmVycyBhbmQgaGF2aW5nIGEgc2luZ2xlIGRyaXZlcgord2l0aCBhZGRlZCBzdXBwb3J0IGZvciBtYW55IHNwZWNpYWwgY2FzZXMuCisKK3wgMi4gRmlsZXMgZGVzY3JpcHRpb24KKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gcGh5LXNhbXN1bmctdXNiMi5jCisgICBUaGlzIGlzIHRoZSBtYWluIGZpbGUgb2YgdGhlIGFkYXB0YXRpb24gbGF5ZXIuIFRoaXMgZmlsZSBjb250YWlucworICAgdGhlIHByb2JlIGZ1bmN0aW9uIGFuZCBwcm92aWRlcyB0d28gY2FsbGJhY2tzIHRvIHRoZSBHZW5lcmljIFBIWQorICAgRnJhbWV3b3JrLiBUaGlzIHR3byBjYWxsYmFja3MgYXJlIHVzZWQgdG8gcG93ZXIgb24gYW5kIHBvd2VyIG9mZiB0aGUKKyAgIHBoeS4gVGhleSBjYXJyeSBvdXQgdGhlIGNvbW1vbiB3b3JrIHRoYXQgaGFzIHRvIGJlIGRvbmUgb24gYWxsIHZlcnNpb24KKyAgIG9mIHRoZSBQSFkgbW9kdWxlLiBEZXBlbmRpbmcgb24gd2hpY2ggU29DIHdhcyBjaG9zZW4gdGhleSBleGVjdXRlIFNvQworICAgc3BlY2lmaWMgY2FsbGJhY2tzLiBUaGUgc3BlY2lmaWMgU29DIHZlcnNpb24gaXMgc2VsZWN0ZWQgYnkgY2hvb3NpbmcKKyAgIHRoZSBhcHByb3ByaWF0ZSBjb21wYXRpYmxlIHN0cmluZy4gSW4gYWRkaXRpb24sIHRoaXMgZmlsZSBjb250YWlucworICAgc3RydWN0IG9mX2RldmljZV9pZCBkZWZpbml0aW9ucyBmb3IgcGFydGljdWxhciBTb0NzLgorCistIHBoeS1zYW1zdW5nLXVzYjIuaAorICAgVGhpcyBpcyB0aGUgaW5jbHVkZSBmaWxlLiBJdCBkZWNsYXJlcyB0aGUgc3RydWN0dXJlcyB1c2VkIGJ5IHRoaXMKKyAgIGRyaXZlci4gSW4gYWRkaXRpb24gaXQgc2hvdWxkIGNvbnRhaW4gZXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IKKyAgIHN0cnVjdHVyZXMgdGhhdCBkZXNjcmliZSBwYXJ0aWN1bGFyIFNvQ3MuCisKK3wgMy4gU3VwcG9ydGluZyBTb0NzCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gc3VwcG9ydCBhIG5ldyBTb0MgYSBuZXcgZmlsZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGRyaXZlcnMvcGh5CitkaXJlY3RvcnkuIEVhY2ggU29DJ3MgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcuCisKK3N0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyB7CisJY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9jb21tb25fcGh5ICpwaHlzOworCWludCAoKnJhdGVfdG9fY2xrKSh1bnNpZ25lZCBsb25nLCB1MzIgKik7CisJdW5zaWduZWQgaW50IG51bV9waHlzOworCWJvb2wgaGFzX21vZGVfc3dpdGNoOworfTsKKworVGhlIG51bV9waHlzIGlzIHRoZSBudW1iZXIgb2YgcGh5cyBoYW5kbGVkIGJ5IHRoZSBkcml2ZXIuICpwaHlzIGlzIGFuCithcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBlYWNoIHBoeS4gVGhlIGhhc19tb2RlX3N3aXRjaAorcHJvcGVydHkgaXMgYSBib29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFNvQyBoYXMgVVNCIGhvc3QKK2FuZCBkZXZpY2Ugb24gYSBzaW5nbGUgcGFpciBvZiBwaW5zLiBJZiBzbywgYSBzcGVjaWFsIHJlZ2lzdGVyIGhhcyB0bworYmUgbW9kaWZpZWQgdG8gY2hhbmdlIHRoZSBpbnRlcm5hbCByb3V0aW5nIG9mIHRoZXNlIHBpbnMgYmV0d2VlbiBhIFVTQgorZGV2aWNlIG9yIGhvc3QgbW9kdWxlLgorCitGb3IgZXhhbXBsZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgRXh5bm9zIDQyMTAgaXMgZm9sbG93aW5nOgorCitjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zNDIxMF91c2IyX3BoeV9jb25maWcgPSB7CisJLmhhc19tb2RlX3N3aXRjaCAgICAgICAgPSAwLAorCS5udW1fcGh5cwkJPSBFWFlOT1M0MjEwX05VTV9QSFlTLAorCS5waHlzCQkJPSBleHlub3M0MjEwX3BoeXMsCisJLnJhdGVfdG9fY2xrCQk9IGV4eW5vczQyMTBfcmF0ZV90b19jbGssCit9CisKKy0gaW50ICgqcmF0ZV90b19jbGspKHVuc2lnbmVkIGxvbmcsIHUzMiAqKQorCVRoZSByYXRlX3RvX2NsayBjYWxsYmFjayBpcyB0byBjb252ZXJ0IHRoZSByYXRlIG9mIHRoZSBjbG9jaworCXVzZWQgYXMgdGhlIHJlZmVyZW5jZSBjbG9jayBmb3IgdGhlIFBIWSBtb2R1bGUgdG8gdGhlIHZhbHVlCisJdGhhdCBzaG91bGQgYmUgd3JpdHRlbiBpbiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXIuCisKK1RoZSBleHlub3M0MjEwX3BoeXMgY29uZmlndXJhdGlvbiBhcnJheSBpcyBhcyBmb2xsb3dzOgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9jb21tb25fcGh5IGV4eW5vczQyMTBfcGh5c1tdID0geworCXsKKwkJLmxhYmVsCQk9ICJkZXZpY2UiLAorCQkuaWQJCT0gRVhZTk9TNDIxMF9ERVZJQ0UsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJob3N0IiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfSE9TVCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNDIxMF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczQyMTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMwIiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfSFNJQzAsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMSIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hTSUMxLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7fSwKK307CisKKy0gaW50ICgqcG93ZXJfb24pKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICopOworLSBpbnQgKCpwb3dlcl9vZmYpKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICopOworCVRoZXNlIHR3byBjYWxsYmFja3MgYXJlIHVzZWQgdG8gcG93ZXIgb24gYW5kIHBvd2VyIG9mZiB0aGUgcGh5CisJYnkgbW9kaWZ5aW5nIGFwcHJvcHJpYXRlIHJlZ2lzdGVycy4KKworRmluYWwgY2hhbmdlIHRvIHRoZSBkcml2ZXIgaXMgYWRkaW5nIGFwcHJvcHJpYXRlIGNvbXBhdGlibGUgdmFsdWUgdG8gdGhlCitwaHktc2Ftc3VuZy11c2IyLmMgZmlsZS4gSW4gY2FzZSBvZiBFeHlub3MgNDIxMCB0aGUgZm9sbG93aW5nIGxpbmVzIHdlcmUKK2FkZGVkIHRvIHRoZSBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNhbXN1bmdfdXNiMl9waHlfb2ZfbWF0Y2hbXSBhcnJheToKKworI2lmZGVmIENPTkZJR19QSFlfRVhZTk9TNDIxMF9VU0IyCisJeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQyMTAtdXNiMi1waHkiLAorCQkuZGF0YSA9ICZleHlub3M0MjEwX3VzYjJfcGh5X2NvbmZpZywKKwl9LAorI2VuZGlmCisKK1RvIGFkZCBmdXJ0aGVyIGZsZXhpYmlsaXR5IHRvIHRoZSBkcml2ZXIgdGhlIEtjb25maWcgZmlsZSBlbmFibGVzIHRvCitpbmNsdWRlIHN1cHBvcnQgZm9yIHNlbGVjdGVkIFNvQ3MgaW4gdGhlIGNvbXBpbGVkIGRyaXZlci4gVGhlIEtjb25maWcKK2VudHJ5IGZvciBFeHlub3MgNDIxMCBpcyBmb2xsb3dpbmc6CisKK2NvbmZpZyBQSFlfRVhZTk9TNDIxMF9VU0IyCisJYm9vbCAiU3VwcG9ydCBmb3IgRXh5bm9zIDQyMTAiCisJZGVwZW5kcyBvbiBQSFlfU0FNU1VOR19VU0IyCisJZGVwZW5kcyBvbiBDUFVfRVhZTk9TNDIxMAorCWhlbHAKKwkgIEVuYWJsZSBVU0IgUEhZIHN1cHBvcnQgZm9yIEV4eW5vcyA0MjEwLiBUaGlzIG9wdGlvbiByZXF1aXJlcyB0aGF0CisJICBTYW1zdW5nIFVTQiAyLjAgUEhZIGRyaXZlciBpcyBlbmFibGVkIGFuZCBtZWFucyB0aGF0IHN1cHBvcnQgZm9yIHRoaXMKKwkgIHBhcnRpY3VsYXIgU29DIGlzIGNvbXBpbGVkIGluIHRoZSBkcml2ZXIuIEluIGNhc2Ugb2YgRXh5bm9zIDQyMTAgZm91cgorCSAgcGh5cyBhcmUgYXZhaWxhYmxlIC0gZGV2aWNlLCBob3N0LCBIU0NJMCBhbmQgSFNDSTEuCisKK1RoZSBuZXdseSBjcmVhdGVkIGZpbGUgdGhhdCBzdXBwb3J0cyB0aGUgbmV3IFNvQyBoYXMgdG8gYmUgYWxzbyBhZGRlZCB0byB0aGUKK01ha2VmaWxlLiBJbiBjYXNlIG9mIEV4eW5vcyA0MjEwIHRoZSBhZGRlZCBsaW5lIGlzIGZvbGxvd2luZzoKKworb2JqLSQoQ09ORklHX1BIWV9FWFlOT1M0MjEwX1VTQjIpICAgICAgICs9IHBoeS1leHlub3M0MjEwLXVzYjIubworCitBZnRlciBjb21wbGV0aW5nIHRoZXNlIHN0ZXBzIHRoZSBzdXBwb3J0IGZvciB0aGUgbmV3IFNvQyBzaG91bGQgYmUgcmVhZHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCmluZGV4IDZlZGFhNjUuLjkxYmE1OGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCkBAIC0xLDMgKzEsMTYgQEAKK1JlbGVhc2UgRGF0ZSAgICA6IE1vbi4gTWFyIDEwLCAyMDE0IDE3OjAwOjAwIFBTVCAyMDE0IC0KKwkJCShlbWFpbGQtaWQ6bWVnYXJhaWRsaW51eEBsc2kuY29tKQorCQkJQWRhbSBSYWRmb3JkCisJCQlLYXNoeWFwIERlc2FpCisJCQlTdW1pdCBTYXhlbmEKK0N1cnJlbnQgVmVyc2lvbiA6IDA2LjgwMy4wMS4wMC1yYzEKK09sZCBWZXJzaW9uICAgICA6IDA2LjcwMC4wNi4wMC1yYzEKKyAgICAxLiBMb2FkIGNvcnJlY3QgcmFpZCBjb250ZXh0IHRpbWVvdXQgdmFsdWUgZm9yIG11bHRpcGF0aGluZyAmIGNsdXN0ZXJpbmcuCisgICAgMi4gRml4IG1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uIHRvIHVzZSBsb2NhbCBzdGFjayB2YXJpYWJsZS4KKyAgICAzLiBSZXR1cm4gbGVha2VkIE1QVCBmcmFtZXMgdG8gTVBUIGNvbW1hbmQgcG9vbC4KKyAgICA0LiBBZGQgRGVsbCBQb3dlckVkZ2UgVlJUWCBTUi1JT1YgVkYgZGV2aWNlIHN1cHBvcnQuCisgICAgNS4gVmVyc2lvbiBhbmQgQ2hhbmdlbG9nIHVwZGF0ZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFJlbGVhc2UgRGF0ZSAgICA6IFNhdC4gQXVnIDMxLCAyMDEzIDE3OjAwOjAwIFBTVCAyMDEzIC0KIAkJCShlbWFpbGQtaWQ6bWVnYXJhaWRsaW51eEBsc2kuY29tKQogCQkJQWRhbSBSYWRmb3JkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQgYi9Eb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA4MTFjLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc2dpLXZpc3dzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotVGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zIChtb2RlbHMgMzIwIGFuZCA1NDApIGFyZSBiYXNlZCBhcm91bmQKLXRoZSBDb2JhbHQsIExpdGhpdW0sIGFuZCBBcnNlbmljIEFTSUNzLiAgVGhlIENvYmFsdCBBU0lDIGlzIHRoZQotbWFpbiBzeXN0ZW0gQVNJQyB3aGljaCBpbnRlcmZhY2VzIHRoZSAxLTQgSUEzMiBjcHVzLCB0aGUgbWVtb3J5Ci1zeXN0ZW0sIGFuZCB0aGUgSS9PIHN5c3RlbSBpbiB0aGUgTGl0aGl1bSBBU0lDLiAgVGhlIENvYmFsdCBBU0lDCi1hbHNvIGNvbnRhaW5zIHRoZSAzRCBnZnggcmVuZGVyaW5nIGVuZ2luZSB3aGljaCByZW5kZXJzIHRvIG1haW4KLXN5c3RlbSBtZW1vcnkgLS0gcGFydCBvZiB3aGljaCBpcyB1c2VkIGFzIHRoZSBmcmFtZSBidWZmZXIgd2hpY2gKLWlzIERNQSdlZCB0byBhIHZpZGVvIGNvbm5lY3RvciB1c2luZyB0aGUgQXJzZW5pYyBBU0lDLiAgQSBQSUlYNAotY2hpcCBhbmQgTlM4NzMwNyBhcmUgdXNlZCB0byBwcm92aWRlIGxlZ2FjeSBkZXZpY2Ugc3VwcG9ydCAoSURFLAotc2VyaWFsLCBmbG9wcHksIGFuZCBwYXJhbGxlbCkuCi0KLVRoZSBWaXN1YWwgV29ya3N0YXRpb24gY2hpcHNldCBsYXJnZWx5IGNvbmZvcm1zIHRvIHRoZSBQQyBhcmNoaXRlY3R1cmUKLXdpdGggc29tZSBub3RhYmxlIGV4Y2VwdGlvbnMgc3VjaCBhcyBpbnRlcnJ1cHQgaGFuZGxpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy92d3NuZCBiL0RvY3VtZW50YXRpb24vc291bmQvb3NzL3Z3c25kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjYmRiLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL3Z3c25kCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLXZ3c25kIC0gU291bmQgZHJpdmVyIGZvciB0aGUgU2lsaWNvbiBHcmFwaGljcyAzMjAgYW5kIDU0MCBWaXN1YWwKLVdvcmtzdGF0aW9ucycgb25ib2FyZCBhdWRpby4KLQotQ29weXJpZ2h0IDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotCi1BdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE1hcmNoIDE5OTksIHRoZXJlIGFyZSB0d28gbW9kZWxzIG9mCi1WaXN1YWwgV29ya3N0YXRpb24sIHRoZSAzMjAgYW5kIHRoZSA1NDAuICBUaGlzIGRvY3VtZW50IG9ubHkgZGVzY3JpYmVzCi10aG9zZSBtb2RlbHMuICBGdXR1cmUgVmlzdWFsIFdvcmtzdGF0aW9uIG1vZGVscyBtYXkgaGF2ZSBkaWZmZXJlbnQKLXNvdW5kIGNhcGFiaWxpdGllcywgYW5kIHRoaXMgZHJpdmVyIHdpbGwgcHJvYmFibHkgbm90IHdvcmsgb24gdGhvc2UKLWJveGVzLgotCi1UaGUgVmlzdWFsIFdvcmtzdGF0aW9uIGhhcyBhbiBBbmFsb2cgRGV2aWNlcyBBRDE4NDMgIlNvdW5kQ29tbSIgYXVkaW8KLWNvZGVjIGNoaXAuICBUaGUgQUQxODQzIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIENvYmFsdCBJL08gQVNJQywgYWxzbwota25vd24gYXMgTGl0aGl1bS4gIFRoaXMgZHJpdmVyIHByb2dyYW1zIGJvdGggY2hpcHMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUVVJQ0sgQ09ORklHVVJBVElPTgotCi0JIyBpbnNtb2Qgc291bmRjb3JlCi0JIyBpbnNtb2QgdndzbmQKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JL08gQ09OTkVDVElPTlMKLQotT24gdGhlIFZpc3VhbCBXb3Jrc3RhdGlvbiwgb25seSB0aHJlZSBvZiB0aGUgQUQxODQzIGlucHV0cyBhcmUgaG9va2VkCi11cC4gIFRoZSBhbmFsb2cgbGluZSBpbiBqYWNrcyBhcmUgY29ubmVjdGVkIHRvIHRoZSBBRDE4NDMncyBBVVgxCi1pbnB1dC4gIFRoZSBDRCBhdWRpbyBsaW5lcyBhcmUgY29ubmVjdGVkIHRvIHRoZSBBRDE4NDMncyBBVVgyIGlucHV0LgotVGhlIG1pY3JvcGhvbmUgamFjayBpcyBjb25uZWN0ZWQgdG8gdGhlIEFEMTg0MydzIE1JQyBpbnB1dC4gIFRoZSBtaWMKLWphY2sgaXMgbW9ubywgYnV0IHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkIHRvIGJvdGggdGhlIGxlZnQgYW5kIHJpZ2h0Ci1NSUMgaW5wdXRzLiAgWW91IGNhbiByZWNvcmQgaW4gc3RlcmVvIGZyb20gdGhlIG1pYyBpbnB1dCwgYnV0IHlvdSB3aWxsCi1nZXQgdGhlIHNhbWUgc2lnbmFsIG9uIGJvdGggY2hhbm5lbHMgKHdpdGhpbiB0aGUgbGltaXRzIG9mIEEvRAotYWNjdXJhY3kpLiAgRnVsbCBzY2FsZSBvbiB0aGUgTGluZSBpbnB1dCBpcyArLy0gMi4wIFYuICBGdWxsIHNjYWxlIG9uCi10aGUgTUlDIGlucHV0IGlzIDIwIGRCIGxlc3MsIG9yICsvLSAwLjIgVi4KLQotVGhlIEFEMTg0MydzIExPVVQxIG91dHB1dHMgYXJlIGNvbm5lY3RlZCB0byB0aGUgTGluZSBPdXQgamFja3MuICBUaGUKLUFEMTg0MydzIEhQT1VUIG91dHB1dHMgYXJlIGNvbm5lY3RlZCB0byB0aGUgc3BlYWtlci9oZWFkcGhvbmUgamFjay4KLUxPVVQyIGlzIG5vdCBjb25uZWN0ZWQuICBMaW5lIG91dCdzIG1heGltdW0gbGV2ZWwgaXMgKy8tIDIuMCBWIHBlYWsgdG8KLXBlYWsuICBUaGUgc3BlYWtlci9oZWFkcGhvbmUgb3V0J3MgbWF4aW11bSBpcyArLy0gNC4wIFYgcGVhayB0byBwZWFrLgotCi1UaGUgQUQxODQzJ3MgUENNIGlucHV0IGNoYW5uZWwgYW5kIG9uZSBvZiBpdHMgb3V0cHV0IGNoYW5uZWxzIChEQUMxKQotYXJlIGNvbm5lY3RlZCB0byBMaXRoaXVtLiAgVGhlIG90aGVyIG91dHB1dCBjaGFubmVsIChEQUMyKSBpcyBub3QKLWNvbm5lY3RlZC4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1DQVBBQklMSVRJRVMKLQotVGhlIEFEMTg0MyBoYXMgUENNIGlucHV0IGFuZCBvdXRwdXQgKFB1bHNlIENvZGUgTW9kdWxhdGlvbiwgYWxzbyBrbm93bgotYXMgd2F2ZXRhYmxlKS4gIFBDTSBpbnB1dCBhbmQgb3V0cHV0IGNhbiBiZSBtb25vIG9yIHN0ZXJlbyBpbiBhbnkgb2YKLWZvdXIgZm9ybWF0cy4gIFRoZSBmb3JtYXRzIGFyZSAxNiBiaXQgc2lnbmVkIGFuZCA4IGJpdCB1bnNpZ25lZCwKLXUtTGF3LCBhbmQgQS1MYXcgZm9ybWF0LiAgQW55IHNhbXBsZSByYXRlIGZyb20gNCBLSHogdG8gNDkgS0h6IGlzCi1hdmFpbGFibGUsIGluIDEgSHogaW5jcmVtZW50cy4KLQotVGhlIEFEMTg0MyBpbmNsdWRlcyBhbiBhbmFsb2cgbWl4ZXIgdGhhdCBjYW4gbWl4IGFsbCB0aHJlZSBpbnB1dAotc2lnbmFscyAobGluZSwgbWljIGFuZCBDRCkgaW50byB0aGUgYW5hbG9nIG91dHB1dHMuICBUaGUgbWl4ZXIgaGFzIGEKLXNlcGFyYXRlIGdhaW4gY29udHJvbCBhbmQgbXV0ZSBzd2l0Y2ggZm9yIGVhY2ggaW5wdXQuCi0KLVRoZXJlIGFyZSB0d28gb3V0cHV0cywgbGluZSBvdXQgYW5kIHNwZWFrZXIvaGVhZHBob25lIG91dC4gIFRoZXkKLWFsd2F5cyBwcm9kdWNlIHRoZSBzYW1lIHNpZ25hbCwgYW5kIHRoZSBzcGVha2VyIGFsd2F5cyBoYXMgMyBkQiBtb3JlCi1nYWluIHRoYW4gdGhlIGxpbmUgb3V0LiAgVGhlIHNwZWFrZXIvaGVhZHBob25lIG91dHB1dCBjYW4gYmUgbXV0ZWQsCi1idXQgdGhpcyBkcml2ZXIgZG9lcyBub3QgZXhwb3J0IHRoYXQgZnVuY3Rpb24uCi0KLVRoZSBoYXJkd2FyZSBjYW4gc3luYyBhdWRpbyB0byB0aGUgdmlkZW8gY2xvY2ssIGJ1dCB0aGlzIGRyaXZlciBkb2VzCi1ub3QgaGF2ZSBhIHdheSB0byBzcGVjaWZ5IHN5bmNpbmcgdG8gdmlkZW8uCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUFJPR1JBTU1JTkcKLQotVGhpcyBzZWN0aW9uIGV4cGxhaW5zIHRoZSBBUEkgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuICBBbHNvIHNlZSB0aGUKLU9wZW4gU291bmQgUHJvZ3JhbW1pbmcgR3VpZGUgYXQgaHR0cDovL3d3dy5vcGVuc291bmQuY29tL3BndWlkZS8gLgotVGhpcyBzZWN0aW9uIGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aCB0aGF0IGRvY3VtZW50LgotCi1UaGUgZHJpdmVyIGhhcyB0d28gaW50ZXJmYWNlcywgYW4gSS9PIGludGVyZmFjZSBhbmQgYSBtaXhlciBpbnRlcmZhY2UuCi1UaGVyZSBpcyBubyBNSURJIG9yIHNlcXVlbmNlciBjYXBhYmlsaXR5LgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBST0dSQU1NSU5HIFBDTSBJL08KLQotVGhlIEkvTyBpbnRlcmZhY2UgaXMgdXN1YWxseSBhY2Nlc3NlZCBhcyAvZGV2L2F1ZGlvIG9yIC9kZXYvZHNwLgotVXNpbmcgdGhlIHN0YW5kYXJkIE9wZW4gU291bmQgU3lzdGVtIChPU1MpIGlvY3RsIGNhbGxzLCB0aGUgc2FtcGxlCi1yYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGFuZCBzYW1wbGUgZm9ybWF0IG1heSBiZSBzZXQgd2l0aGluIHRoZQotbGltaXRhdGlvbnMgZGVzY3JpYmVkIGFib3ZlLiAgVGhlIGRyaXZlciBzdXBwb3J0cyB0cmlnZ2VyaW5nLiAgSXQgYWxzbwotc3VwcG9ydHMgZ2V0dGluZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycyB3aXRoIG9uZS1zYW1wbGUKLWFjY3VyYWN5LgotCi1UaGUgU05EQ1RMX0RTUF9HRVRDQVAgaW9jdGwgcmV0dXJucyB0aGVzZSBjYXBhYmlsaXRpZXMuCi0KLQlEU1BfQ0FQX0RVUExFWCAtIGRyaXZlciBzdXBwb3J0cyBmdWxsIGR1cGxleC4KLQotCURTUF9DQVBfVFJJR0dFUiAtIGRyaXZlciBzdXBwb3J0cyB0cmlnZ2VyaW5nLgotCi0JRFNQX0NBUF9SRUFMVElNRSAtIHZhbHVlcyByZXR1cm5lZCBieSBTTkRDVExfRFNQX0dFVElQVFIKLQlhbmQgU05EQ1RMX0RTUF9HRVRPUFRSIGFyZSBhY2N1cmF0ZSB0byBhIGZldyBzYW1wbGVzLgotCi1NZW1vcnkgbWFwcGluZyAobW1hcCkgaXMgbm90IGltcGxlbWVudGVkLgotCi1UaGUgZHJpdmVyIHBlcm1pdHMgc3ViZGl2aWRlZCBmcmFnbWVudCBzaXplcyBmcm9tIDY0IHRvIDQwOTYgYnl0ZXMuCi1UaGUgbnVtYmVyIG9mIGZyYWdtZW50cyBjYW4gYmUgYW55dGhpbmcgZnJvbSAzIGZyYWdtZW50cyB0byBob3dldmVyCi1tYW55IGZyYWdtZW50cyBmaXQgaW50byAxMjQga2lsb2J5dGVzLiAgSXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8KLWRldGVybWluZSBob3cgZmV3L3NtYWxsIGZyYWdtZW50cyBjYW4gYmUgdXNlZCB3aXRob3V0IGludHJvZHVjaW5nCi1nbGl0Y2hlcyB3aXRoIGEgZ2l2ZW4gd29ya2xvYWQuICBMaW51eCBpcyBub3QgcmVhbHRpbWUsIHNvIHdlIGNhbid0Ci1wcm9taXNlIGFueXRoaW5nLiAgKHNpZ2guLi4pCi0KLVdoZW4gdGhpcyBkcml2ZXIgaXMgc3dpdGNoZWQgaW50byBvciBvdXQgb2YgbXUtTGF3IG9yIEEtTGF3IG1vZGUgb24KLW91dHB1dCwgaXQgbWF5IHByb2R1Y2UgYW4gYXVkaWJsZSBjbGljay4gIFRoaXMgaXMgdW5hdm9pZGFibGUuICBUbwotcHJldmVudCBjbGlja2luZywgdXNlIHNpZ25lZCAxNi1iaXQgbW9kZSBpbnN0ZWFkLCBhbmQgY29udmVydCBmcm9tCi1tdS1MYXcgb3IgQS1MYXcgZm9ybWF0IGluIHNvZnR3YXJlLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVBST0dSQU1NSU5HIFRIRSBNSVhFUiBJTlRFUkZBQ0UKLQotVGhlIG1peGVyIGludGVyZmFjZSBpcyB1c3VhbGx5IGFjY2Vzc2VkIGFzIC9kZXYvbWl4ZXIuICBJdCBpcyBhY2Nlc3NlZAotdGhyb3VnaCBpb2N0bHMuICBUaGUgbWl4ZXIgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBjb250cm9sIGdhaW4gb3IKLW11dGUgc2V2ZXJhbCBhdWRpbyBzaWduYWwgcGF0aHMsIGFuZCBhbHNvIGFsbG93cyBzZWxlY3Rpb24gb2YgdGhlCi1yZWNvcmRpbmcgc291cmNlLgotCi1FYWNoIG9mIHRoZSBjb25zdGFudHMgZGVzY3JpYmVkIGhlcmUgY2FuIGJlIHJlYWQgdXNpbmcgdGhlCi1NSVhFUl9SRUFEKFNPVU5EX01JWEVSX3h4eCkgaW9jdGwuICBUaG9zZSB0aGF0IGFyZSBub3QgcmVhZC1vbmx5IGNhbgotYWxzbyBiZSB3cml0dGVuIHVzaW5nIHRoZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl94eHgpIGlvY3RsLiAgSW4gbW9zdAotY2FzZXMsIDxzeXMvc291bmRjYXJkLmg+IGRlZmluZXMgY29uc3RhbnRzIFNPVU5EX01JWEVSX1JFQURfeHh4IGFuZAotU09VTkRfTUlYRVJfV1JJVEVfeHh4IHdoaWNoIHdvcmsganVzdCBhcyB3ZWxsLgotCi1TT1VORF9NSVhFUl9DQVBTCVJlYWQtb25seQotCi1UaGlzIGlzIGEgbWFzayBvZiBvcHRpb25hbCBkcml2ZXIgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGltcGxlbWVudGVkLgotVGhpcyBkcml2ZXIncyBvbmx5IGNhcGFiaWxpdHkgaXMgU09VTkRfQ0FQX0VYQ0xfSU5QVVQsIHdoaWNoIG1lYW5zCi10aGF0IG9ubHkgb25lIHJlY29yZGluZyBzb3VyY2UgY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuCi0KLVNPVU5EX01JWEVSX0RFVk1BU0sJUmVhZC1vbmx5Ci0KLVRoaXMgaXMgYSBtYXNrIG9mIHRoZSBzb3VuZCBjaGFubmVscy4gIFRoaXMgZHJpdmVyJ3MgY2hhbm5lbHMgYXJlIFBDTSwKLUxJTkUsIE1JQywgQ0QsIGFuZCBSRUNMRVYuCi0KLVNPVU5EX01JWEVSX1NURVJFT0RFVlMJUmVhZC1vbmx5Ci0KLVRoaXMgaXMgYSBtYXNrIG9mIHdoaWNoIHNvdW5kIGNoYW5uZWxzIGFyZSBjYXBhYmxlIG9mIHN0ZXJlby4gIEFsbAotY2hhbm5lbHMgYXJlIGNhcGFibGUgb2Ygc3RlcmVvLiAgKEJ1dCBzZWUgY2F2ZWF0IG9uIE1JQyBpbnB1dCBpbiBJL08KLUNPTk5FQ1RJT05TIHNlY3Rpb24gYWJvdmUpLgotCi1TT1VORF9NSVhFUl9PVVRNQVNLCVJlYWQtb25seQotCi1UaGlzIGlzIGEgbWFzayBvZiBjaGFubmVscyB0aGF0IHJvdXRlIGlucHV0cyB0aHJvdWdoIHRvIG91dHB1dHMuCi1UaG9zZSBhcmUgTElORSwgTUlDLCBhbmQgQ0QuCi0KLVNPVU5EX01JWEVSX1JFQ01BU0sJUmVhZC1vbmx5Ci0KLVRoaXMgaXMgYSBtYXNrIG9mIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHJlY29yZGluZyBzb3VyY2VzLiAgVGhvc2UgYXJlCi1QQ00sIExJTkUsIE1JQywgQ0QuCi0KLVNPVU5EX01JWEVSX1BDTQkJRGVmYXVsdDogMHg1NzU3ICgwIGRCKQotCi1UaGlzIGlzIHRoZSBnYWluIGNvbnRyb2wgZm9yIFBDTSBvdXRwdXQuICBUaGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbAotZ2FpbiBhcmUgY29udHJvbGxlZCBpbmRlcGVuZGVudGx5LiAgVGhpcyBnYWluIGNvbnRyb2wgaGFzIDY0IGxldmVscywKLXdoaWNoIHJhbmdlIGZyb20gLTgyLjUgZEIgdG8gKzEyLjAgZEIgaW4gMS41IGRCIHN0ZXBzLiAgVGhvc2UgNjQKLWxldmVscyBhcmUgbWFwcGVkIG9udG8gMTAwIGxldmVscyBhdCB0aGUgaW9jdGwsIHNlZSBiZWxvdy4KLQotU09VTkRfTUlYRVJfTElORQlEZWZhdWx0OiAweDRhNGEgKDAgZEIpCi0KLVRoaXMgaXMgdGhlIGdhaW4gY29udHJvbCBmb3IgbWl4aW5nIHRoZSBMaW5lIEluIHNvdXJjZSBpbnRvIHRoZQotb3V0cHV0cy4gIFRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGdhaW4gYXJlIGNvbnRyb2xsZWQKLWluZGVwZW5kZW50bHkuICBUaGlzIGdhaW4gY29udHJvbCBoYXMgMzIgbGV2ZWxzLCB3aGljaCByYW5nZSBmcm9tCi0tMzQuNSBkQiB0byArMTIuMCBkQiBpbiAxLjUgZEIgc3RlcHMuICBUaG9zZSAzMiBsZXZlbHMgYXJlIG1hcHBlZCBvbnRvCi0xMDAgbGV2ZWxzIGF0IHRoZSBpb2N0bCwgc2VlIGJlbG93LgotCi1TT1VORF9NSVhFUl9NSUMJCURlZmF1bHQ6IDB4NGE0YSAoMCBkQikKLQotVGhpcyBpcyB0aGUgZ2FpbiBjb250cm9sIGZvciBtaXhpbmcgdGhlIE1JQyBzb3VyY2UgaW50byB0aGUgb3V0cHV0cy4KLVRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGdhaW4gYXJlIGNvbnRyb2xsZWQgaW5kZXBlbmRlbnRseS4gIFRoaXMKLWdhaW4gY29udHJvbCBoYXMgMzIgbGV2ZWxzLCB3aGljaCByYW5nZSBmcm9tIC0zNC41IGRCIHRvICsxMi4wIGRCIGluCi0xLjUgZEIgc3RlcHMuICBUaG9zZSAzMiBsZXZlbHMgYXJlIG1hcHBlZCBvbnRvIDEwMCBsZXZlbHMgYXQgdGhlCi1pb2N0bCwgc2VlIGJlbG93LgotCi1TT1VORF9NSVhFUl9DRAkJRGVmYXVsdDogMHg0YTRhICgwIGRCKQotCi1UaGlzIGlzIHRoZSBnYWluIGNvbnRyb2wgZm9yIG1peGluZyB0aGUgQ0QgYXVkaW8gc291cmNlIGludG8gdGhlCi1vdXRwdXRzLiAgVGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgZ2FpbiBhcmUgY29udHJvbGxlZAotaW5kZXBlbmRlbnRseS4gIFRoaXMgZ2FpbiBjb250cm9sIGhhcyAzMiBsZXZlbHMsIHdoaWNoIHJhbmdlIGZyb20KLS0zNC41IGRCIHRvICsxMi4wIGRCIGluIDEuNSBkQiBzdGVwcy4gIFRob3NlIDMyIGxldmVscyBhcmUgbWFwcGVkIG9udG8KLTEwMCBsZXZlbHMgYXQgdGhlIGlvY3RsLCBzZWUgYmVsb3cuCi0KLVNPVU5EX01JWEVSX1JFQ0xFVgkgRGVmYXVsdDogMCAoMCBkQikKLQotVGhpcyBpcyB0aGUgZ2FpbiBjb250cm9sIGZvciBQQ00gaW5wdXQgKFJFQ29yZGluZyBMRVZlbCkuICBUaGUgbGVmdAotYW5kIHJpZ2h0IGNoYW5uZWwgZ2FpbiBhcmUgY29udHJvbGxlZCBpbmRlcGVuZGVudGx5LiAgVGhpcyBnYWluCi1jb250cm9sIGhhcyAxNiBsZXZlbHMsIHdoaWNoIHJhbmdlIGZyb20gMCBkQiB0byArMjIuNSBkQiBpbiAxLjUgZEIKLXN0ZXBzLiAgVGhvc2UgMTYgbGV2ZWxzIGFyZSBtYXBwZWQgb250byAxMDAgbGV2ZWxzIGF0IHRoZSBpb2N0bCwgc2VlCi1iZWxvdy4KLQotU09VTkRfTUlYRVJfUkVDU1JDCSBEZWZhdWx0OiBTT1VORF9NQVNLX0xJTkUKLQotVGhpcyBpcyBhIG1hc2sgb2YgY3VycmVudGx5IHNlbGVjdGVkIFBDTSBpbnB1dCBzb3VyY2VzIChSRUNvcmRpbmcKLVNvdVJDZXMpLiAgQmVjYXVzZSB0aGUgQUQxODQzIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgcmVjb3JkaW5nIHNvdXJjZQotYXQgYSB0aW1lLCBvbmx5IG9uZSBiaXQgYXQgYSB0aW1lIGNhbiBiZSBzZXQgaW4gdGhpcyBtYXNrLiAgVGhlCi1hbGxvd2FibGUgdmFsdWVzIGFyZSBTT1VORF9NQVNLX1BDTSwgU09VTkRfTUFTS19MSU5FLCBTT1VORF9NQVNLX01JQywKLW9yIFNPVU5EX01BU0tfQ0QuICBTZWxlY3RpbmcgU09VTkRfTUFTS19QQ00gc2V0cyB1cCBpbnRlcm5hbAotcmVzYW1wbGluZyB3aGljaCBpcyB1c2VmdWwgZm9yIGxvb3BiYWNrIHRlc3RpbmcgYW5kIGZvciBoYXJkd2FyZQotc2FtcGxlIHJhdGUgY29udmVyc2lvbi4gIEJ1dCBzb2Z0d2FyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIGlzCi1wcm9iYWJseSBmYXN0ZXIsIHNvIEkgZG9uJ3Qga25vdyBob3cgdXNlZnVsIHRoYXQgaXMuCi0KLVNPVU5EX01JWEVSX09VVFNSQwlERUZBVUxUOiBTT1VORF9NQVNLX0xJTkV8U09VTkRfTUFTS19NSUN8U09VTkRfTUFTS19DRAotCi1UaGlzIGlzIGEgbWFzayBvZiBzb3VyY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBwYXNzZWQgdGhyb3VnaCB0byB0aGUKLW91dHB1dHMuICBUaG9zZSBzb3VyY2VzIHdob3NlIGJpdHMgYXJlIG5vdCBzZXQgYXJlIG11dGVkLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUdBSU4gQ09OVFJPTAotCi1UaGVyZSBhcmUgZml2ZSBnYWluIGNvbnRyb2xzIGxpc3RlZCBhYm92ZS4gIEVhY2ggaGFzIDE2LCAzMiwgb3IgNjQKLXN0ZXBzLiAgRWFjaCBjb250cm9sIGhhcyAxLjUgZEIgb2YgZ2FpbiBwZXIgc3RlcC4gIEVhY2ggY29udHJvbCBpcwotc3RlcmVvLgotCi1UaGUgT1NTIGRlZmluZXMgdGhlIGFyZ3VtZW50IHRvIGEgY2hhbm5lbCBnYWluIGlvY3RsIGFzIGhhdmluZyB0d28KLWNvbXBvbmVudHMsIGxlZnQgYW5kIHJpZ2h0LCBlYWNoIG9mIHdoaWNoIHJhbmdlcyBmcm9tIDAgdG8gMTAwLiAgVGhlCi10d28gY29tcG9uZW50cyBhcmUgcGFja2VkIGludG8gdGhlIHNhbWUgd29yZCwgd2l0aCB0aGUgbGVmdCBzaWRlIGdhaW4KLWluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlLCBhbmQgdGhlIHJpZ2h0IHNpZGUgZ2FpbiBpbiB0aGUgc2Vjb25kCi1sZWFzdCBzaWduaWZpY2FudCBieXRlLiAgSW4gQywgd2Ugd291bGQgc2F5IHRoaXMuCi0KLQkjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLQkuLi4KLQotCSAJYXNzZXJ0KGxlZnRnYWluID49IDAgJiYgbGVmdGdhaW4gPD0gMTAwKTsKLQkJYXNzZXJ0KHJpZ2h0Z2FpbiA+PSAwICYmIHJpZ2h0Z2FpbiA8PSAxMDApOwotCQlhcmcgPSBsZWZ0Z2FpbiB8IHJpZ2h0Z2FpbiA8PCA4OwotCi1TbyBlYWNoIE9TUyBnYWluIGNvbnRyb2wgaGFzIDEwMSBzdGVwcy4gIEJ1dCB0aGUgaGFyZHdhcmUgaGFzIDE2LCAzMiwKLW9yIDY0IHN0ZXBzLiAgVGhlIGhhcmR3YXJlIHN0ZXBzIGFyZSBzcHJlYWQgYWNyb3NzIHRoZSAxMDEgT1NTIHN0ZXBzCi1uZWFybHkgZXZlbmx5LiAgVGhlIGNvbnZlcnNpb24gZm9ybXVsYXMgYXJlIGxpa2UgdGhpcywgZ2l2ZW4gTiBlcXVhbHMKLTE2LCAzMiwgb3IgNjQuCi0KLQlpbnQgcm91bmQgPSBOLzIgLSAxOwotCU9TU19nYWluX3N0ZXBzID0gKGh3X2dhaW5fc3RlcHMgKiAxMDAgKyByb3VuZCkgLyAoTiAtIDEpOwotCWh3X2dhaW5fc3RlcHMgPSAoT1NTX2dhaW5fc3RlcHMgKiAoTiAtIDEpICsgcm91bmQpIC8gMTAwOwotCi1IZXJlIGlzIGEgc25pcHBldCBvZiBDIGNvZGUgdGhhdCB3aWxsIHJldHVybiB0aGUgbGVmdCBhbmQgcmlnaHQgZ2Fpbgotb2YgYW55IGNoYW5uZWwgaW4gZEIuICBQYXNzIGl0IG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBnYWluX2Rlc2NfdAotc3RydWN0dXJlcyB0byBhY2Nlc3MgYW55IG9mIHRoZSBmaXZlIGNoYW5uZWxzJyBnYWlucy4KLQotCXR5cGVkZWYgc3RydWN0IGdhaW5fZGVzYyB7Ci0JCWZsb2F0IG1pbl9nYWluOwotCQlmbG9hdCBnYWluX3N0ZXA7Ci0JCWludCBuYml0czsKLQkJaW50IGNoYW47Ci0JfSBnYWluX2Rlc2NfdDsKLQotCWNvbnN0IGdhaW5fZGVzY190IGdhaW5fcGNtICAgID0geyAtODIuNSwgMS41LCA2LCBTT1VORF9NSVhFUl9QQ00gICAgfTsKLQljb25zdCBnYWluX2Rlc2NfdCBnYWluX2xpbmUgICA9IHsgLTM0LjUsIDEuNSwgNSwgU09VTkRfTUlYRVJfTElORSAgIH07Ci0JY29uc3QgZ2Fpbl9kZXNjX3QgZ2Fpbl9taWMgICAgPSB7IC0zNC41LCAxLjUsIDUsIFNPVU5EX01JWEVSX01JQyAgICB9OwotCWNvbnN0IGdhaW5fZGVzY190IGdhaW5fY2QgICAgID0geyAtMzQuNSwgMS41LCA1LCBTT1VORF9NSVhFUl9DRCAgICAgfTsKLQljb25zdCBnYWluX2Rlc2NfdCBnYWluX3JlY2xldiA9IHsgICAwLjAsIDEuNSwgNCwgU09VTkRfTUlYRVJfUkVDTEVWIH07Ci0KLQlpbnQgZ2V0X2dhaW5fZEIoaW50IGZkLCBjb25zdCBnYWluX2Rlc2NfdCAqZ3AsCi0JCQlmbG9hdCAqbGVmdCwgZmxvYXQgKnJpZ2h0KQotCXsKLQkJaW50IHdvcmQ7Ci0JCWludCBsZywgcmc7Ci0JCWludCBtYXNrID0gKDEgPDwgZ3AtPm5iaXRzKSAtIDE7Ci0KLQkJaWYgKGlvY3RsKGZkLCBNSVhFUl9SRUFEKGdwLT5jaGFuKSwgJndvcmQpICE9IDApCi0JCQlyZXR1cm4gLTE7CS8qIGZhaWwgKi8KLQkJbGcgPSB3b3JkICYgMHhGRjsKLQkJcmcgPSB3b3JkID4+IDggJiAweEZGOwotCQlsZyA9IChsZyAqIG1hc2sgKyBtYXNrIC8gMikgLyAxMDA7Ci0JCXJnID0gKHJnICogbWFzayArIG1hc2sgLyAyKSAvIDEwMDsKLQkJKmxlZnQgPSBncC0+bWluX2dhaW4gKyBncC0+Z2Fpbl9zdGVwICogbGc7Ci0JCSpyaWdodCA9IGdwLT5taW5fZ2FpbiArIGdwLT5nYWluX3N0ZXAgKiByZzsKLQkJcmV0dXJuIDA7Ci0JfQkKLQotQW5kIGhlcmUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgcm91dGluZSB0byBzZXQgYSBjaGFubmVsJ3MgZ2FpbiBpbiBkQi4KLQotCWludCBzZXRfZ2Fpbl9kQihpbnQgZmQsIGNvbnN0IGdhaW5fZGVzY190ICpncCwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCi0JewotCQlmbG9hdCBtYXhfZ2FpbiA9Ci0JCQlncC0+bWluX2dhaW4gKyAoMSA8PCBncC0+bmJpdHMpICogZ3AtPmdhaW5fc3RlcDsKLQkJZmxvYXQgcm91bmQgPSBncC0+Z2Fpbl9zdGVwIC8gMjsKLQkJaW50IG1hc2sgPSAoMSA8PCBncC0+bmJpdHMpIC0gMTsKLQkJaW50IHdvcmQ7Ci0JCWludCBsZywgcmc7Ci0KLQkJaWYgKGxlZnQgPCBncC0+bWluX2dhaW4gfHwgcmlnaHQgPCBncC0+bWluX2dhaW4pCi0JCQlyZXR1cm4gRUlOVkFMOwotCQlsZyA9IChsZWZ0IC0gZ3AtPm1pbl9nYWluICsgcm91bmQpIC8gZ3AtPmdhaW5fc3RlcDsKLQkJcmcgPSAocmlnaHQgLSBncC0+bWluX2dhaW4gKyByb3VuZCkgLyBncC0+Z2Fpbl9zdGVwOwotCQlpZiAobGcgPj0gKDEgPDwgZ3AtPm5iaXRzKSB8fCByZyA+PSAoMSA8PCBncC0+bmJpdHMpKQotCQkJcmV0dXJuIEVJTlZBTDsKLQkJbGcgPSAoMTAwICogbGcgKyBtYXNrIC8gMikgLyBtYXNrOwotCQlyZyA9ICgxMDAgKiByZyArIG1hc2sgLyAyKSAvIG1hc2s7Ci0JCXdvcmQgPSBsZyB8IHJnIDw8IDg7Ci0KLQkJcmV0dXJuIGlvY3RsKGZkLCBNSVhFUl9XUklURShncC0+Y2hhbiksICZ3b3JkKTsKLQl9Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldiBiL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldgppbmRleCBlZDJkYTVlLi4zZDE0MDM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXYKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2CkBAIC04NSw2ICs4NSwxMiBAQAogCVNQSV9NT0RFXzAuLlNQSV9NT0RFXzM7IG9yIGlmIHlvdSBwcmVmZXIgeW91IGNhbiBjb21iaW5lIFNQSV9DUE9MCiAJKGNsb2NrIHBvbGFyaXR5LCBpZGxlIGhpZ2ggaWZmIHRoaXMgaXMgc2V0KSBvciBTUElfQ1BIQSAoY2xvY2sgcGhhc2UsCiAJc2FtcGxlIG9uIHRyYWlsaW5nIGVkZ2UgaWZmIHRoaXMgaXMgc2V0KSBmbGFncy4KKwlOb3RlIHRoYXQgdGhpcyByZXF1ZXN0IGlzIGxpbWl0ZWQgdG8gU1BJIG1vZGUgZmxhZ3MgdGhhdCBmaXQgaW4gYQorCXNpbmdsZSBieXRlLgorCisgICAgU1BJX0lPQ19SRF9NT0RFMzIsIFNQSV9JT0NfV1JfTU9ERTMyIC4uLiBwYXNzIGEgcG9pbnRlciB0byBhIHVpbjMyX3QKKwl3aGljaCB3aWxsIHJldHVybiAoUkQpIG9yIGFzc2lnbiAoV1IpIHRoZSBmdWxsIFNQSSB0cmFuc2ZlciBtb2RlLAorCW5vdCBsaW1pdGVkIHRvIHRoZSBiaXRzIHRoYXQgZml0IGluIG9uZSBieXRlLgogCiAgICAgU1BJX0lPQ19SRF9MU0JfRklSU1QsIFNQSV9JT0NfV1JfTFNCX0ZJUlNUIC4uLiBwYXNzIGEgcG9pbnRlciB0byBhIGJ5dGUKIAl3aGljaCB3aWxsIHJldHVybiAoUkQpIG9yIGFzc2lnbiAoV1IpIHRoZSBiaXQganVzdGlmaWNhdGlvbiB1c2VkIHRvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfZmR4LmMgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfZmR4LmMKaW5kZXggMzZlYzA3Ny4uMGVhM2U1MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X2ZkeC5jCisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl9mZHguYwpAQCAtNzgsMTAgKzc4LDEwIEBACiAKIHN0YXRpYyB2b2lkIGR1bXBzdGF0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCkKIHsKLQlfX3U4CW1vZGUsIGxzYiwgYml0czsKLQlfX3UzMglzcGVlZDsKKwlfX3U4CWxzYiwgYml0czsKKwlfX3UzMgltb2RlLCBzcGVlZDsKIAotCWlmIChpb2N0bChmZCwgU1BJX0lPQ19SRF9NT0RFLCAmbW9kZSkgPCAwKSB7CisJaWYgKGlvY3RsKGZkLCBTUElfSU9DX1JEX01PREUzMiwgJm1vZGUpIDwgMCkgewogCQlwZXJyb3IoIlNQSSByZF9tb2RlIik7CiAJCXJldHVybjsKIAl9CkBAIC05OCw3ICs5OCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlwcmludGYoIiVzOiBzcGkgbW9kZSAlZCwgJWQgYml0cyAlc3BlciB3b3JkLCAlZCBIeiBtYXhcbiIsCisJcHJpbnRmKCIlczogc3BpIG1vZGUgMHgleCwgJWQgYml0cyAlc3BlciB3b3JkLCAlZCBIeiBtYXhcbiIsCiAJCW5hbWUsIG1vZGUsIGJpdHMsIGxzYiA/ICIobHNiIGZpcnN0KSAiIDogIiIsIHNwZWVkKTsKIH0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X3Rlc3QuYyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl90ZXN0LmMKaW5kZXggMTZmZWRhOS4uM2EyZjlkNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X3Rlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfdGVzdC5jCkBAIC0zMCw3ICszMCw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZXZpY2UgPSAiL2Rldi9zcGlkZXYxLjEiOwotc3RhdGljIHVpbnQ4X3QgbW9kZTsKK3N0YXRpYyB1aW50MzJfdCBtb2RlOwogc3RhdGljIHVpbnQ4X3QgYml0cyA9IDg7CiBzdGF0aWMgdWludDMyX3Qgc3BlZWQgPSA1MDAwMDA7CiBzdGF0aWMgdWludDE2X3QgZGVsYXk7CkBAIC01Nyw2ICs1NywyMSBAQAogCQkuYml0c19wZXJfd29yZCA9IGJpdHMsCiAJfTsKIAorCWlmIChtb2RlICYgU1BJX1RYX1FVQUQpCisJCXRyLnR4X25iaXRzID0gNDsKKwllbHNlIGlmIChtb2RlICYgU1BJX1RYX0RVQUwpCisJCXRyLnR4X25iaXRzID0gMjsKKwlpZiAobW9kZSAmIFNQSV9SWF9RVUFEKQorCQl0ci5yeF9uYml0cyA9IDQ7CisJZWxzZSBpZiAobW9kZSAmIFNQSV9SWF9EVUFMKQorCQl0ci5yeF9uYml0cyA9IDI7CisJaWYgKCEobW9kZSAmIFNQSV9MT09QKSkgeworCQlpZiAobW9kZSAmIChTUElfVFhfUVVBRCB8IFNQSV9UWF9EVUFMKSkKKwkJCXRyLnJ4X2J1ZiA9IDA7CisJCWVsc2UgaWYgKG1vZGUgJiAoU1BJX1JYX1FVQUQgfCBTUElfUlhfRFVBTCkpCisJCQl0ci50eF9idWYgPSAwOworCX0KKwogCXJldCA9IGlvY3RsKGZkLCBTUElfSU9DX01FU1NBR0UoMSksICZ0cik7CiAJaWYgKHJldCA8IDEpCiAJCXBhYm9ydCgiY2FuJ3Qgc2VuZCBzcGkgbWVzc2FnZSIpOwpAQCAtODEsNyArOTYsMTEgQEAKIAkgICAgICIgIC1PIC0tY3BvbCAgICAgY2xvY2sgcG9sYXJpdHlcbiIKIAkgICAgICIgIC1MIC0tbHNiICAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0XG4iCiAJICAgICAiICAtQyAtLWNzLWhpZ2ggIGNoaXAgc2VsZWN0IGFjdGl2ZSBoaWdoXG4iCi0JICAgICAiICAtMyAtLTN3aXJlICAgIFNJL1NPIHNpZ25hbHMgc2hhcmVkXG4iKTsKKwkgICAgICIgIC0zIC0tM3dpcmUgICAgU0kvU08gc2lnbmFscyBzaGFyZWRcbiIKKwkgICAgICIgIC1OIC0tbm8tY3MgICAgbm8gY2hpcCBzZWxlY3RcbiIKKwkgICAgICIgIC1SIC0tcmVhZHkgICAgc2xhdmUgcHVsbHMgbG93IHRvIHBhdXNlXG4iCisJICAgICAiICAtMiAtLWR1YWwgICAgIGR1YWwgdHJhbnNmZXJcbiIKKwkgICAgICIgIC00IC0tcXVhZCAgICAgcXVhZCB0cmFuc2ZlclxuIik7CiAJZXhpdCgxKTsKIH0KIApAQCAtMTAxLDExICsxMjAsMTMgQEAKIAkJCXsgIjN3aXJlIiwgICAwLCAwLCAnMycgfSwKIAkJCXsgIm5vLWNzIiwgICAwLCAwLCAnTicgfSwKIAkJCXsgInJlYWR5IiwgICAwLCAwLCAnUicgfSwKKwkJCXsgImR1YWwiLCAgICAwLCAwLCAnMicgfSwKKwkJCXsgInF1YWQiLCAgICAwLCAwLCAnNCcgfSwKIAkJCXsgTlVMTCwgMCwgMCwgMCB9LAogCQl9OwogCQlpbnQgYzsKIAotCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkQ6czpkOmI6bEhPTEMzTlIiLCBsb3B0cywgTlVMTCk7CisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiRDpzOmQ6YjpsSE9MQzNOUjI0IiwgbG9wdHMsIE5VTEwpOwogCiAJCWlmIChjID09IC0xKQogCQkJYnJlYWs7CkBAIC0xNDcsMTEgKzE2OCwyMyBAQAogCQljYXNlICdSJzoKIAkJCW1vZGUgfD0gU1BJX1JFQURZOwogCQkJYnJlYWs7CisJCWNhc2UgJzInOgorCQkJbW9kZSB8PSBTUElfVFhfRFVBTDsKKwkJCWJyZWFrOworCQljYXNlICc0JzoKKwkJCW1vZGUgfD0gU1BJX1RYX1FVQUQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50X3VzYWdlKGFyZ3ZbMF0pOwogCQkJYnJlYWs7CiAJCX0KIAl9CisJaWYgKG1vZGUgJiBTUElfTE9PUCkgeworCQlpZiAobW9kZSAmIFNQSV9UWF9EVUFMKQorCQkJbW9kZSB8PSBTUElfUlhfRFVBTDsKKwkJaWYgKG1vZGUgJiBTUElfVFhfUVVBRCkKKwkJCW1vZGUgfD0gU1BJX1JYX1FVQUQ7CisJfQogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtMTY4LDExICsyMDEsMTEgQEAKIAkvKgogCSAqIHNwaSBtb2RlCiAJICovCi0JcmV0ID0gaW9jdGwoZmQsIFNQSV9JT0NfV1JfTU9ERSwgJm1vZGUpOworCXJldCA9IGlvY3RsKGZkLCBTUElfSU9DX1dSX01PREUzMiwgJm1vZGUpOwogCWlmIChyZXQgPT0gLTEpCiAJCXBhYm9ydCgiY2FuJ3Qgc2V0IHNwaSBtb2RlIik7CiAKLQlyZXQgPSBpb2N0bChmZCwgU1BJX0lPQ19SRF9NT0RFLCAmbW9kZSk7CisJcmV0ID0gaW9jdGwoZmQsIFNQSV9JT0NfUkRfTU9ERTMyLCAmbW9kZSk7CiAJaWYgKHJldCA9PSAtMSkKIAkJcGFib3J0KCJjYW4ndCBnZXQgc3BpIG1vZGUiKTsKIApAQCAtMTk4LDcgKzIzMSw3IEBACiAJaWYgKHJldCA9PSAtMSkKIAkJcGFib3J0KCJjYW4ndCBnZXQgbWF4IHNwZWVkIGh6Iik7CiAKLQlwcmludGYoInNwaSBtb2RlOiAlZFxuIiwgbW9kZSk7CisJcHJpbnRmKCJzcGkgbW9kZTogMHgleFxuIiwgbW9kZSk7CiAJcHJpbnRmKCJiaXRzIHBlciB3b3JkOiAlZFxuIiwgYml0cyk7CiAJcHJpbnRmKCJtYXggc3BlZWQ6ICVkIEh6ICglZCBLSHopXG4iLCBzcGVlZCwgc3BlZWQvMTAwMCk7CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IGU1NTEyNGUuLmVjOGJlNDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtMzIwLDEwICszMjAsMTEgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotaHVuZ190YXNrX3dhcm5pbmc6CitodW5nX3Rhc2tfd2FybmluZ3M6CiAKIFRoZSBtYXhpbXVtIG51bWJlciBvZiB3YXJuaW5ncyB0byByZXBvcnQuIER1cmluZyBhIGNoZWNrIGludGVydmFsCi1XaGVuIHRoaXMgdmFsdWUgaXMgcmVhY2hlZCwgbm8gbW9yZSB0aGUgd2FybmluZ3Mgd2lsbCBiZSByZXBvcnRlZC4KK2lmIGEgaHVuZyB0YXNrIGlzIGRldGVjdGVkLCB0aGlzIHZhbHVlIGlzIGRlY3JlYXNlZCBieSAxLgorV2hlbiB0aGlzIHZhbHVlIHJlYWNoZXMgMCwgbm8gbW9yZSB3YXJuaW5ncyB3aWxsIGJlIHJlcG9ydGVkLgogVGhpcyBmaWxlIHNob3dzIHVwIGlmIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIGVuYWJsZWQuCiAKIC0xOiByZXBvcnQgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHdhcm5pbmdzLgpAQCAtNDQxLDggKzQ0Miw3IEBACiBmZWF0dXJlIGlzIHRvbyBoaWdoIHRoZW4gdGhlIHJhdGUgdGhlIGtlcm5lbCBzYW1wbGVzIGZvciBOVU1BIGhpbnRpbmcKIGZhdWx0cyBtYXkgYmUgY29udHJvbGxlZCBieSB0aGUgbnVtYV9iYWxhbmNpbmdfc2Nhbl9wZXJpb2RfbWluX21zLAogbnVtYV9iYWxhbmNpbmdfc2Nhbl9kZWxheV9tcywgbnVtYV9iYWxhbmNpbmdfc2Nhbl9wZXJpb2RfbWF4X21zLAotbnVtYV9iYWxhbmNpbmdfc2Nhbl9zaXplX21iLCBudW1hX2JhbGFuY2luZ19zZXR0bGVfY291bnQgc3lzY3RscyBhbmQKLW51bWFfYmFsYW5jaW5nX21pZ3JhdGVfZGVmZXJyZWQuCitudW1hX2JhbGFuY2luZ19zY2FuX3NpemVfbWIsIGFuZCBudW1hX2JhbGFuY2luZ19zZXR0bGVfY291bnQgc3lzY3Rscy4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNDgzLDEzICs0ODMsNiBAQAogbnVtYV9iYWxhbmNpbmdfc2Nhbl9zaXplX21iIGlzIGhvdyBtYW55IG1lZ2FieXRlcyB3b3J0aCBvZiBwYWdlcyBhcmUKIHNjYW5uZWQgZm9yIGEgZ2l2ZW4gc2Nhbi4KIAotbnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCBpcyBob3cgbWFueSBwYWdlIG1pZ3JhdGlvbnMgZ2V0IHNraXBwZWQKLXVuY29uZGl0aW9uYWxseSwgYWZ0ZXIgYSBwYWdlIG1pZ3JhdGlvbiBpcyBza2lwcGVkIGJlY2F1c2UgYSBwYWdlIGlzIHNoYXJlZAotd2l0aCBvdGhlciB0YXNrcy4gVGhpcyByZWR1Y2VzIHBhZ2UgbWlncmF0aW9uIG92ZXJoZWFkLCBhbmQgZGV0ZXJtaW5lcwotaG93IG11Y2ggc3Ryb25nZXIgdGhlICJtb3ZlIHRhc2sgbmVhciBpdHMgbWVtb3J5IiBwb2xpY3kgc2NoZWR1bGVyIGJlY29tZXMsCi12ZXJzdXMgdGhlICJtb3ZlIG1lbW9yeSBuZWFyIGl0cyB0YXNrIiBtZW1vcnkgbWFuYWdlbWVudCBwb2xpY3ksIGZvciB3b3JrbG9hZHMKLXdpdGggc2hhcmVkIG1lbW9yeS4KLQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogb3NyZWxlYXNlLCBvc3R5cGUgJiB2ZXJzaW9uOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ5MCBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0OTAKaW5kZXggMjgxNzZkZS4uM2UwOTExNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ5MAorKysgYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDkwCkBAIC0yMSw4ICsyMSw2IEBACiAtIFRoZSB3ZWFrIHB1bGx1cCBjdXJyZW50IGlzIGEgbWluaW11bSBvZiAwLjltQSBhbmQgbWF4aW11bSBvZiA2LjBtQS4KIC0gVGhlIDVWIHN0cm9uZyBwdWxsdXAgaXMgc3VwcG9ydGVkIHdpdGggYSBtaW5pbXVtIG9mIDUuOW1BIGFuZCBhCiAgIG1heGltdW0gb2YgMzAuNCBtQS4gIChGcm9tIERTMjQ5MC5wZGYpCi0tIFdoaWxlIHRoZSBkczI0OTAgc3VwcG9ydHMgYSBoYXJkd2FyZSBzZWFyY2ggdGhlIGNvZGUgZG9lc24ndCB0YWtlCi0gIGFkdmFudGFnZSBvZiBpdCAoaW4gdGVzdGVkIGNhc2UgaXQgb25seSByZXR1cm5lZCBmaXJzdCBkZXZpY2UpLgogLSBUaGUgaGFyZHdhcmUgd2lsbCBkZXRlY3Qgd2hlbiBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byB0aGUgYnVzIG9uIHRoZQogICBuZXh0IGJ1cyAocmVzZXQ/KSBvcGVyYXRpb24sIGhvd2V2ZXIgb25seSBhIG1lc3NhZ2UgaXMgcHJpbnRlZCBhcwogICB0aGUgY29yZSB3MSBjb2RlIGRvZXNuJ3QgbWFrZSB1c2Ugb2YgdGhlIGluZm9ybWF0aW9uLiAgQ29ubmVjdGluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rIGIvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rCmluZGV4IGY1OWEzMTkuLjkyN2E1MmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluaworKysgYi9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsKQEAgLTUsOCArNSw4IEBACiA9PT09PT09PT09PT09CiAKIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlcyBiZXR3ZWVuIHcxIGNvcmUgYW5kIHVzZXJzcGFjZToKLTEuIEV2ZW50cy4gVGhleSBhcmUgZ2VuZXJhdGVkIGVhY2ggdGltZSBuZXcgbWFzdGVyIG9yIHNsYXZlIGRldmljZQotCWZvdW5kIGVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCisxLiBFdmVudHMuIFRoZXkgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgYSBuZXcgbWFzdGVyIG9yIHNsYXZlIGRldmljZQorCWlzIGZvdW5kIGVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCiAyLiBVc2Vyc3BhY2UgY29tbWFuZHMuCiAzLiBSZXBsaWVzIHRvIHVzZXJzcGFjZSBjb21tYW5kcy4KIApAQCAtMTMxLDcgKzEzMSw3IEBACiBvZiB0aGUgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgYW5kIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpLgogSWYgcmVwbHkgaXMgZ2VuZXJhdGVkIGZvciBtYXN0ZXIgb3Igcm9vdCBjb21tYW5kICh3aGljaCBkbyBub3QgaGF2ZQogdzFfbmV0bGlua19jbWQgYXR0YWNoZWQpLCByZXBseSB3aWxsIGNvbnRhaW4gb25seSBjbl9tc2cgYW5kIHcxX25ldGxpbmtfbXNnCi1zdHJ1Y3RpcmVzLgorc3RydWN0dXJlcy4KIAogdzFfbmV0bGlua19tc2cuc3RhdHVzIGZpZWxkIHdpbGwgY2FycnkgcG9zaXRpdmUgZXJyb3IgdmFsdWUKIChFSU5WQUwgZm9yIGV4YW1wbGUpIG9yIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzLgpAQCAtMTYwLDcgKzE2MCw3IEBACiBUaGVuIGFsbCByZXF1ZXN0ZWQgaW4gdzFfbmV0bGlua19tc2cgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uZSBieSBvbmUuCiBJZiBjb21tYW5kIHJlcXVpcmVzIHJlcGx5IChsaWtlIHJlYWQgY29tbWFuZCkgaXQgaXMgc2VudCBvbiBjb21tYW5kIGNvbXBsZXRpb24uCiAKLVdoZW4gYWxsIGNvbW1hbmRzICh3MV9uZXRsaW5rX2NtZCkgYXJlIHByb2Nlc3NlZCBtdXN0ZXIgZGV2aWNlIGlzIHVubG9ja2VkCitXaGVuIGFsbCBjb21tYW5kcyAodzFfbmV0bGlua19jbWQpIGFyZSBwcm9jZXNzZWQgbWFzdGVyIGRldmljZSBpcyB1bmxvY2tlZAogYW5kIG5leHQgdzFfbmV0bGlua19tc2cgaGVhZGVyIHByb2Nlc3Npbmcgc3RhcnRlZC4KIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1wYXJhbWV0ZXJzLnR4dAppbmRleCBmOTQ5MmZlLi42OTI3OTFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2ctcGFyYW1ldGVycy50eHQKQEAgLTE1MCw2ICsxNTAsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaXQ4N193ZHQ6CiBub2dhbWVwb3J0OiBGb3JiaWQgdGhlIGFjdGl2YXRpb24gb2YgZ2FtZSBwb3J0LCBkZWZhdWx0PTAKK25vY2lyOiBGb3JiaWQgdGhlIHVzZSBvZiBDSVIgKHdvcmthcm91bmQgZm9yIHNvbWUgYnVnZ3kgc2V0dXBzKTsgc2V0IHRvIDEgaWYKK3N5c3RlbSByZXNldHMgZGVzcGl0ZSB3YXRjaGRvZyBkYWVtb24gcnVubmluZywgZGVmYXVsdD0wCiBleGNsdXNpdmU6IFdhdGNoZG9nIGV4Y2x1c2l2ZSBkZXZpY2Ugb3BlbiwgZGVmYXVsdD0xCiB0aW1lb3V0OiBXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMsIGRlZmF1bHQ9NjAKIHRlc3Rtb2RlOiBXYXRjaGRvZyB0ZXN0IG1vZGUgKDEgPSBubyByZWJvb3QpLCBkZWZhdWx0PTAKQEAgLTMyNSw2ICszMjcsMTEgQEAKIHN0bXAzeHh4X3dkdDoKIGhlYXJ0YmVhdDogV2F0Y2hkb2cgaGVhcnRiZWF0IHBlcmlvZCBpbiBzZWNvbmRzIGZyb20gMSB0byA0MTk0MzA0LCBkZWZhdWx0IDE5CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZWdyYV93ZHQ6CitoZWFydGJlYXQ6IFdhdGNoZG9nIGhlYXJ0YmVhdHMgaW4gc2Vjb25kcy4gKGRlZmF1bHQgPSAxMjApCitub3dheW91dDogV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkCisJKGRlZmF1bHQ9a2VybmVsIGNvbmZpZyBwYXJhbWV0ZXIpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB0czcyeHhfd2R0OgogdGltZW91dDogV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAoMSA8PSB0aW1lb3V0IDw9IDgsIGRlZmF1bHQ9OCkKIG5vd2F5b3V0OiBEaXNhYmxlIHdhdGNoZG9nIHNodXRkb3duIG9uIGNsb3NlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dCBiL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0CmluZGV4IGNiODE3NDFkLi5hNzVlM2FkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dApAQCAtMTgyLDcgKzE4Miw3IEBACiAwMjI2LzEJMi4wMisoMyBleHRfbG9hZGVyX3ZlcglFeHRlbmRlZCBib290IGxvYWRlciB2ZXJzaW9uCiAwMjI3LzEJMi4wMisoMwlleHRfbG9hZGVyX3R5cGUJRXh0ZW5kZWQgYm9vdCBsb2FkZXIgSUQKIDAyMjgvNAkyLjAyKwljbWRfbGluZV9wdHIJMzItYml0IHBvaW50ZXIgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUKLTAyMkMvNAkyLjAzKwlyYW1kaXNrX21heAlIaWdoZXN0IGxlZ2FsIGluaXRyZCBhZGRyZXNzCiswMjJDLzQJMi4wMysJaW5pdHJkX2FkZHJfbWF4CUhpZ2hlc3QgbGVnYWwgaW5pdHJkIGFkZHJlc3MKIDAyMzAvNAkyLjA1KwlrZXJuZWxfYWxpZ25tZW50IFBoeXNpY2FsIGFkZHIgYWxpZ25tZW50IHJlcXVpcmVkIGZvciBrZXJuZWwKIDAyMzQvMQkyLjA1KwlyZWxvY2F0YWJsZV9rZXJuZWwgV2hldGhlciBrZXJuZWwgaXMgcmVsb2NhdGFibGUgb3Igbm90CiAwMjM1LzEJMi4xMCsJbWluX2FsaWdubWVudAlNaW5pbXVtIGFsaWdubWVudCwgYXMgYSBwb3dlciBvZiB0d28KQEAgLTUzNCw3ICs1MzQsNyBAQAogICB6ZXJvLCB0aGUga2VybmVsIHdpbGwgYXNzdW1lIHRoYXQgeW91ciBib290IGxvYWRlciBkb2VzIG5vdCBzdXBwb3J0CiAgIHRoZSAyLjAyKyBwcm90b2NvbC4KIAotRmllbGQgbmFtZToJcmFtZGlza19tYXgKK0ZpZWxkIG5hbWU6CWluaXRyZF9hZGRyX21heAogVHlwZToJCXJlYWQKIE9mZnNldC9zaXplOgkweDIyYy80CiBQcm90b2NvbDoJMi4wMysKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggOWQzM2NjYi4uZTJlZDY5ZiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTkxMSwxMSArOTExLDExIEBACiBGOglhcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvCiAKIEFSTS9GUkVFU0NBTEUgSU1YIC8gTVhDIEFSTSBBUkNISVRFQ1RVUkUKLU06CVNoYXduIEd1byA8c2hhd24uZ3VvQGxpbmFyby5vcmc+CitNOglTaGF3biBHdW8gPHNoYXduLmd1b0BmcmVlc2NhbGUuY29tPgogTToJU2FzY2hhIEhhdWVyIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogUzoJTWFpbnRhaW5lZAotVDoJZ2l0IGdpdDovL2dpdC5saW5hcm8ub3JnL3Blb3BsZS9zaGF3bmd1by9saW51eC0yLjYuZ2l0CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3NoYXduZ3VvL2xpbnV4LmdpdAogRjoJYXJjaC9hcm0vbWFjaC1pbXgvCiBGOglhcmNoL2FybS9ib290L2R0cy9pbXgqCiBGOglhcmNoL2FybS9jb25maWdzL2lteCpfZGVmY29uZmlnCkBAIC0xMzIwLDYgKzEzMjAsNyBAQAogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CVN1cHBvcnRlZAogRjoJYXJjaC9hcm0vbWFjaC11MzAwLworRjoJZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci11MzAwLmMKIEY6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1MzAwLmMKIEY6CWRyaXZlcnMvcnRjL3J0Yy1jb2g5MDEzMzEuYwogRjoJZHJpdmVycy93YXRjaGRvZy9jb2g5MDEzMjdfd2R0LmMKQEAgLTE4MzIsOCArMTgzMyw4IEBACiBGOglpbmNsdWRlL25ldC9ibHVldG9vdGgvCiAKIEJPTkRJTkcgRFJJVkVSCi1NOglKYXkgVm9zYnVyZ2ggPGZ1YmFyQHVzLmlibS5jb20+Ci1NOglWZWFjZXNsYXYgRmFsaWNvIDx2ZmFsaWNvQHJlZGhhdC5jb20+CitNOglKYXkgVm9zYnVyZ2ggPGoudm9zYnVyZ2hAZ21haWwuY29tPgorTToJVmVhY2VzbGF2IEZhbGljbyA8dmZhbGljb0BnbWFpbC5jb20+CiBNOglBbmR5IEdvc3BvZGFyZWsgPGFuZHlAZ3JleWhvdXNlLm5ldD4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9uZGluZy8KQEAgLTE5MjAsOCArMTkyMSw4IEBACiBGOglpbmNsdWRlL2xpbnV4L2JjbWEvCiAKIEJST0NBREUgQkZBIEZDIFNDU0kgRFJJVkVSCi1NOglBbmlsIEd1cnVtdXJ0aHkgPGFndXJ1bXVyQGJyb2NhZGUuY29tPgotTToJVmlqYXlhIE1vaGFuIEd1dnZhIDx2bW9oYW5AYnJvY2FkZS5jb20+CitNOglBbmlsIEd1cnVtdXJ0aHkgPGFuaWwuZ3VydW11cnRoeUBxbG9naWMuY29tPgorTToJU3VkYXJzYW5hIEthbGx1cnUgPHN1ZGFyc2FuYS5rYWxsdXJ1QHFsb2dpYy5jb20+CiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3Njc2kvYmZhLwpAQCAtMjIwMyw2ICsyMjA0LDEzIEBACiBTOglPZGQgRml4ZXMKIEY6CXNvdW5kL3NvYy9jb2RlY3MvY3M0MjcwKgogCitDSVJSVVMgTE9HSUMgQVVESU8gQ09ERUMgRFJJVkVSUworTToJQnJpYW4gQXVzdGluIDxicmlhbi5hdXN0aW5AY2lycnVzLmNvbT4KK006CVBhdWwgSGFuZHJpZ2FuIDxQYXVsLkhhbmRyaWdhbkBjaXJydXMuY29tPgorTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKK1M6CU1haW50YWluZWQKK0Y6CXNvdW5kL3NvYy9jb2RlY3MvY3MqCisKIENMRUFOQ0FDSEUgQVBJCiBNOglLb25yYWQgUnplc3p1dGVrIFdpbGsgPGtvbnJhZC53aWxrQG9yYWNsZS5jb20+CiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCkBAIC0yODAxLDkgKzI4MDksOSBAQAogRjoJZHJpdmVycy9hY3BpL2RvY2suYwogCiBET0NVTUVOVEFUSU9OCi1NOglSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorTToJUmFuZHkgRHVubGFwIDxyZHVubGFwQGluZnJhZGVhZC5vcmc+CiBMOglsaW51eC1kb2NAdmdlci5rZXJuZWwub3JnCi1UOglUQkQKK1Q6CXF1aWx0IGh0dHA6Ly93d3cuaW5mcmFkZWFkLm9yZy9+cmR1bmxhcC9Eb2MvcGF0Y2hlcy8KIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vCiAKQEAgLTQ1NDUsNiArNDU1Myw3IEBACiBNOglBbGV4IER1eWNrIDxhbGV4YW5kZXIuaC5kdXlja0BpbnRlbC5jb20+CiBNOglKb2huIFJvbmNpYWsgPGpvaG4ucm9uY2lha0BpbnRlbC5jb20+CiBNOglNaXRjaCBXaWxsaWFtcyA8bWl0Y2guYS53aWxsaWFtc0BpbnRlbC5jb20+CitNOglMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KIEw6CWUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL3d3dy5pbnRlbC5jb20vc3VwcG9ydC9mZWVkYmFjay5odG0KIFc6CWh0dHA6Ly9lMTAwMC5zb3VyY2Vmb3JnZS5uZXQvCkBAIC01MjQ1LDExICs1MjU0LDEwIEBACiBGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvCiAKIExJTlVYIEZPUiBQT1dFUlBDIEVNQkVEREVEIFBQQzRYWAotTToJSm9zaCBCb3llciA8andib3llckBnbWFpbC5jb20+CitNOiAgQWxpc3RhaXIgUG9wcGxlIDxhbGlzdGFpckBwb3BwbGUuaWQuYXU+CiBNOglNYXR0IFBvcnRlciA8bXBvcnRlckBrZXJuZWwuY3Jhc2hpbmcub3JnPgogVzoJaHR0cDovL3d3dy5wZW5ndWlucHBjLm9yZy8KIEw6CWxpbnV4cHBjLWRldkBsaXN0cy5vemxhYnMub3JnCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2p3Ym95ZXIvcG93ZXJwYy00eHguZ2l0CiBTOglNYWludGFpbmVkCiBGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC8KIEY6CWFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4LwpAQCAtNTY4Nyw2ICs1Njk1LDEyIEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvd2F0Y2hkb2cvbWVuYTIxX3dkdC5jCiAKK01FTiBDSEFNRUxFT04gQlVTIChtY2IpCitNOiAgCUpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9tY2IvCitGOglpbmNsdWRlL2xpbnV4L21jYi5oCisKIE1FVEFHIEFSQ0hJVEVDVFVSRQogTToJSmFtZXMgSG9nYW4gPGphbWVzLmhvZ2FuQGltZ3RlYy5jb20+CiBMOglsaW51eC1tZXRhZ0B2Z2VyLmtlcm5lbC5vcmcKQEAgLTYwMDUsNiArNjAxOSw3IEBACiBGOglpbmNsdWRlL3VhcGkvbGludXgvbmV0ZGV2aWNlLmgKIEY6CXRvb2xzL25ldC8KIEY6CXRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC8KK0Y6CWxpYi9yYW5kb20zMi5jCiAKIE5FVFdPUktJTkcgW0lQdjQvSVB2Nl0KIE06CSJEYXZpZCBTLiBNaWxsZXIiIDxkYXZlbUBkYXZlbWxvZnQubmV0PgpAQCAtNzQwMywxMCArNzQxOCwyNiBAQAogUzoJU3VwcG9ydGVkCiBGOglhcmNoL3MzOTAvCiBGOglkcml2ZXJzL3MzOTAvCi1GOglibG9jay9wYXJ0aXRpb25zL2libS5jCiBGOglEb2N1bWVudGF0aW9uL3MzOTAvCiBGOglEb2N1bWVudGF0aW9uL0RvY0Jvb2svczM5MCoKIAorUzM5MCBDT01NT04gSS9PIExBWUVSCitNOglTZWJhc3RpYW4gT3R0IDxzZWJvdHRAbGludXgudm5ldC5pYm0uY29tPgorTToJUGV0ZXIgT2JlcnBhcmxlaXRlciA8b2JlcnBhckBsaW51eC52bmV0LmlibS5jb20+CitMOglsaW51eC1zMzkwQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpbnV4MzkwLworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3MzOTAvY2lvLworCitTMzkwIERBU0QgRFJJVkVSCitNOglTdGVmYW4gV2Vpbmh1YmVyIDx3ZWluQGRlLmlibS5jb20+CitNOglTdGVmYW4gSGFiZXJsYW5kIDxzdGVmYW4uaGFiZXJsYW5kQGRlLmlibS5jb20+CitMOglsaW51eC1zMzkwQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpbnV4MzkwLworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3MzOTAvYmxvY2svZGFzZCoKK0Y6CWJsb2NrL3BhcnRpdGlvbnMvaWJtLmMKKwogUzM5MCBORVRXT1JLIERSSVZFUlMKIE06CVVyc3VsYSBCcmF1biA8dXJzdWxhLmJyYXVuQGRlLmlibS5jb20+CiBNOglGcmFuayBCbGFzY2hrYSA8Ymxhc2Noa2FAbGludXgudm5ldC5pYm0uY29tPgpAQCAtNzQxNiw2ICs3NDQ3LDE1IEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvczM5MC9uZXQvCiAKK1MzOTAgUENJIFNVQlNZU1RFTQorTToJU2ViYXN0aWFuIE90dCA8c2Vib3R0QGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CUdlcmFsZCBTY2hhZWZlciA8Z2VyYWxkLnNjaGFlZmVyQGRlLmlibS5jb20+CitMOglsaW51eC1zMzkwQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpbnV4MzkwLworUzoJU3VwcG9ydGVkCitGOglhcmNoL3MzOTAvcGNpLworRjoJZHJpdmVycy9wY2kvaG90cGx1Zy9zMzkwX3BjaV9ocGMuYworCiBTMzkwIFpDUllQVCBEUklWRVIKIE06CUluZ28gVHVjaHNjaGVyZXIgPGluZ28udHVjaHNjaGVyZXJAZGUuaWJtLmNvbT4KIE06CWxpbnV4MzkwQGRlLmlibS5jb20KQEAgLTc3OTksMTMgKzc4MzksNiBAQAogRjoJZHJpdmVycy90dHkvc2VyaWFsL2lvYz9fc2VyaWFsLmMKIEY6CWluY2x1ZGUvbGludXgvaW9jPy5oCiAKLVNHSSBWSVNVQUwgV09SS1NUQVRJT04gMzIwIEFORCA1NDAKLU06CUFuZHJleSBQYW5pbiA8cGF6a2VAZG9ucGFjLnJ1PgotTDoJbGludXgtdmlzd3MtZGV2ZWxAbGlzdHMuc2YubmV0Ci1XOglodHRwOi8vbGludXgtdmlzd3Muc2YubmV0Ci1TOglNYWludGFpbmVkIGZvciAyLjYuCi1GOglEb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQKLQogU0dJIFhQL1hQQy9YUE5FVCBEUklWRVIKIE06CUNsaWZmIFdoaWNrbWFuIDxjcHdAc2dpLmNvbT4KIE06CVJvYmluIEhvbHQgPHJvYmlubWhvbHRAZ21haWwuY29tPgpAQCAtODM1Myw2ICs4Mzg2LDEyIEBACiBTOglPZGQgRml4ZXMKIEY6CWRyaXZlcnMvc3RhZ2luZy9zbTd4eGZiLwogCitTVEFHSU5HIC0gU0xJQ09TUworTToJTGlvciBEb3RhbiA8bGlvZG90QGdtYWlsLmNvbT4KK006CUNocmlzdG9waGVyIEhhcnJlciA8Y2hhcnJlckBhbGFjcml0ZWNoLmNvbT4KK1M6CU9kZCBGaXhlcworRjoJZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvCisKIFNUQUdJTkcgLSBTT0ZUTE9HSUMgNngxMCBNUEVHIENPREVDCiBNOglJc21hZWwgTHVjZW5vIDxpc21hZWwubHVjZW5vQGNvcnAuYmx1ZWNoZXJyeS5uZXQ+CiBTOglTdXBwb3J0ZWQKQEAgLTkwMzgsNiArOTA3NywxMyBAQAogRjoJaW5jbHVkZS9saW51eC9jZHJvbS5oCiBGOglpbmNsdWRlL3VhcGkvbGludXgvY2Ryb20uaAogCitVTklTWVMgUy1QQVIgRFJJVkVSUworTTogICAgIEJlbmphbWluIFJvbWVyIDxiZW5qYW1pbi5yb21lckB1bmlzeXMuY29tPgorTTogICAgIERhdmlkIEtlcnNobmVyIDxkYXZpZC5rZXJzaG5lckB1bmlzeXMuY29tPgorTDogICAgIHNwYXJtYWludGFpbmVyQHVuaXN5cy5jb20gKFVuaXN5cyBpbnRlcm5hbCkKK1M6ICAgICBTdXBwb3J0ZWQKK0Y6ICAgICBkcml2ZXJzL3N0YWdpbmcvdW5pc3lzLworCiBVTklWRVJTQUwgRkxBU0ggU1RPUkFHRSBIT1NUIENPTlRST0xMRVIgRFJJVkVSCiBNOglWaW5heWFrIEhvbGlrYXR0aSA8dmluaG9saWthdHRpQGdtYWlsLmNvbT4KIE06CVNhbnRvc2ggWSA8c2FudG9zaHN5QGdtYWlsLmNvbT4KQEAgLTkwNzYsOCArOTEyMiw3IEBACiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzLwogCiBVU0IgQVRUQUNIRUQgU0NTSQotTToJTWF0dGhldyBXaWxjb3ggPHdpbGx5QGxpbnV4LmludGVsLmNvbT4KLU06CVNhcmFoIFNoYXJwIDxzYXJhaC5hLnNoYXJwQGxpbnV4LmludGVsLmNvbT4KK006CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CiBNOglHZXJkIEhvZmZtYW5uIDxrcmF4ZWxAcmVkaGF0LmNvbT4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCkBAIC05MzAzLDcgKzkzNDgsNyBAQAogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCiAKIFVTQiBYSENJIERSSVZFUgotTToJU2FyYWggU2hhcnAgPHNhcmFoLmEuc2hhcnBAbGludXguaW50ZWwuY29tPgorTToJTWF0aGlhcyBOeW1hbiA8bWF0aGlhcy5ueW1hbkBpbnRlbC5jb20+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvdXNiL2hvc3QveGhjaSoKQEAgLTk3ODEsNiArOTgyNiwxMiBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKIAorWFRFTlNBIFhURlBHQSBQTEFURk9STSBTVVBQT1JUCitNOglNYXggRmlsaXBwb3YgPGpjbXZia2JjQGdtYWlsLmNvbT4KK0w6CWxpbnV4LXh0ZW5zYUBsaW51eC14dGVuc2Eub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS5jCisKIFlBTSBEUklWRVIgRk9SIEFYLjI1CiBNOglKZWFuLVBhdWwgUm91YmVsYXQgPGpwckBmNmZiYi5vcmc+CiBMOglsaW51eC1oYW1zQHZnZXIua2VybmVsLm9yZwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBlZjc3OWVjLi5lNWFjOGE2IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIFZFUlNJT04gPSAzCiBQQVRDSExFVkVMID0gMTQKIFNVQkxFVkVMID0gMAotRVhUUkFWRVJTSU9OID0gLXJjNworRVhUUkFWRVJTSU9OID0KIE5BTUUgPSBTaHVmZmxpbmcgWm9tYmllIEp1cm9yCiAKICMgKkRPQ1VNRU5UQVRJT04qCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGE3M2E4ZTIuLjk2ZTU0YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDcgKzEsOSBAQAogCi1nZW5lcmljLXkgKz0gY2xrZGV2LmgKIAorZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCi1nZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IGhhc2guaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1NzdmZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX0FMUEhBX0NQVVRJTUVfSAotI2RlZmluZSBfX0FMUEhBX0NQVVRJTUVfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgotCi0jZW5kaWYgLyogX19BTFBIQV9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKaW5kZXggZWRiNGUwMC4uMDc2YzM1YyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKQEAgLTI1NCwxMiArMjU0LDYgQEAKIAl9CiB9CiAKLWludAotcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQotewotCXJldHVybiBwY2lfZW5hYmxlX3Jlc291cmNlcyhkZXYsIG1hc2spOwotfQotCiAvKgogICogIElmIHdlIHNldCB1cCBhIGRldmljZSBmb3IgYnVzIG1hc3RlcmluZywgd2UgbmVlZCB0byBjaGVjayB0aGUgbGF0ZW5jeQogICogIHRpbWVyIGFzIGNlcnRhaW4gZmlybXdhcmUgZm9yZ2V0cyB0byBzZXQgaXQgcHJvcGVybHksIGFzIHNlZW4KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAwZDMzNjI5Li5lNzZmZDc5IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDE1ICsxLDE1IEBACiBnZW5lcmljLXkgKz0gYXV4dmVjLmgKIGdlbmVyaWMteSArPSBiYXJyaWVyLmgKLWdlbmVyaWMteSArPSBidWdzLmgKIGdlbmVyaWMteSArPSBiaXRzcGVybG9uZy5oCitnZW5lcmljLXkgKz0gYnVncy5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKIGdlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBkZXZpY2UuaAogZ2VuZXJpYy15ICs9IGRpdjY0LmgKIGdlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCiBnZW5lcmljLXkgKz0gZXJybm8uaAotZ2VuZXJpYy15ICs9IGZjbnRsLmgKIGdlbmVyaWMteSArPSBmYi5oCitnZW5lcmljLXkgKz0gZmNudGwuaAogZ2VuZXJpYy15ICs9IGZ0cmFjZS5oCiBnZW5lcmljLXkgKz0gaGFyZGlycS5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCkBAIC0yMiw2ICsyMiw3IEBACiBnZW5lcmljLXkgKz0ga3ZtX3BhcmEuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKIGdlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1tYW4uaAogZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCiBnZW5lcmljLXkgKz0gcGFyYW0uaApAQCAtMzAsNiArMzEsNyBAQAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCiBnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCiBnZW5lcmljLXkgKz0gc2VtYnVmLmgKQEAgLTQ4LDQgKzUwLDMgQEAKIGdlbmVyaWMteSArPSB1c2VyLmgKIGdlbmVyaWMteSArPSB2Z2EuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCAxNTk0OTQ1Li5iNzZhZTQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTUzNCw3ICs1MzQsNiBAQAogCXNlbGVjdCBQSU5DVFJMCiAJc2VsZWN0IFBJTkNUUkxfRE9WRQogCXNlbGVjdCBQTEFUX09SSU9OX0xFR0FDWQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIERvdmUgU29DIDg4QVA1MTAKIApAQCAtNjMzLDcgKzYzMiw2IEBACiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlzZWxlY3QgSEFWRV9JREUKIAlzZWxlY3QgSEFWRV9QV00KLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgVVNFX09GCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIE5YUCBMUEMzMlhYIGZhbWlseSBvZiBwcm9jZXNzb3JzCkBAIC03NzAsNyArNzY4LDYgQEAKIAlzZWxlY3QgU0FNU1VOR19BVEFHUwogCXNlbGVjdCBTQU1TVU5HX1dBS0VNQVNLCiAJc2VsZWN0IFNBTVNVTkdfV0RUX1JFU0VUCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJaGVscAogCSAgU2Ftc3VuZyBTM0M2NFhYIHNlcmllcyBiYXNlZCBzeXN0ZW1zCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0bGFzNi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXRsYXM2LmR0c2kKaW5kZXggZjg2NzRiYy4uMGM4MWRjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYXRsYXM2LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXRsYXM2LmR0c2kKQEAgLTIxNyw4ICsyMTcsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MTc+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDEzPjsKLQkJCQlzaXJmLHVhcnQtZG1hLXJ4LWNoYW5uZWwgPSA8MjE+OwotCQkJCXNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCA9IDwyPjsKKwkJCQlkbWFzID0gPCZkbWFjMSA1PiwgPCZkbWFjMCAyPjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdWFydDE6IHVhcnRAYjAwNjAwMDAgewpAQCAtMjI4LDYgKzIyOCw3IEBACiAJCQkJaW50ZXJydXB0cyA9IDwxOD47CiAJCQkJZmlmb3NpemUgPSA8MzI+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAxND47CisJCQkJZG1hLW5hbWVzID0gIm5vLXJ4IiwgIm5vLXR4IjsKIAkJCX07CiAKIAkJCXVhcnQyOiB1YXJ0QGIwMDcwMDAwIHsKQEAgLTIzNyw4ICsyMzgsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MTk+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDE1PjsKLQkJCQlzaXJmLHVhcnQtZG1hLXJ4LWNoYW5uZWwgPSA8Nj47Ci0JCQkJc2lyZix1YXJ0LWRtYS10eC1jaGFubmVsID0gPDc+OworCQkJCWRtYXMgPSA8JmRtYWMwIDY+LCA8JmRtYWMwIDc+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQl1c3AwOiB1c3BAYjAwODAwMDAgewpAQCAtMjQ4LDggKzI0OSw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwyMD47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMjg+OwotCQkJCXNpcmYsdXNwLWRtYS1yeC1jaGFubmVsID0gPDE3PjsKLQkJCQlzaXJmLHVzcC1kbWEtdHgtY2hhbm5lbCA9IDwxOD47CisJCQkJZG1hcyA9IDwmZG1hYzEgMT4sIDwmZG1hYzEgMj47CisJCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAkJCX07CiAKIAkJCXVzcDE6IHVzcEBiMDA5MDAwMCB7CkBAIC0yNTksOCArMjYwLDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDIxPjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAyOT47Ci0JCQkJc2lyZix1c3AtZG1hLXJ4LWNoYW5uZWwgPSA8MTQ+OwotCQkJCXNpcmYsdXNwLWRtYS10eC1jaGFubmVsID0gPDE1PjsKKwkJCQlkbWFzID0gPCZkbWFjMCAxND4sIDwmZG1hYzAgMTU+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQlkbWFjMDogZG1hLWNvbnRyb2xsZXJAYjAwYjAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYXBmNTFkZXYuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYXBmNTFkZXYuZHRzCmluZGV4IDVhN2Y1NTIuLmQzZjk4MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWFwZjUxZGV2LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS1hcGY1MWRldi5kdHMKQEAgLTE4LDcgKzE4LDYgQEAKIAogCWRpc3BsYXlAZGkxIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiOwotCQljcnRjcyA9IDwmaXB1IDA+OwogCQlpbnRlcmZhY2UtcGl4LWZtdCA9ICJiZ3I2NjYiOwogCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfaXB1X2Rpc3AxXzE+OwpAQCAtNDEsNiArNDAsMTIgQEAKIAkJCQlwaXhlbGNsay1hY3RpdmUgPSA8MD47CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheV9pbjogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1X2RpMF9kaXNwMD47CisJCQl9OworCQl9OwogCX07CiAKIAlncGlvLWtleXMgewpAQCAtMTIyLDMgKzEyNyw3IEBACiAJCX07CiAJfTsKIH07CisKKyZpcHVfZGkwX2Rpc3AwIHsKKwlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXlfaW4+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLWJhYmJhZ2UuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKaW5kZXggYmUxNDA3Yy4uNjcxOTI3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKQEAgLTIxLDkgKzIxLDggQEAKIAkJcmVnID0gPDB4OTAwMDAwMDAgMHgyMDAwMDAwMD47CiAJfTsKIAotCWRpc3BsYXlAZGkwIHsKKwlkaXNwbGF5MDogZGlzcGxheUBkaTAgewogCQljb21wYXRpYmxlID0gImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSI7Ci0JCWNydGNzID0gPCZpcHUgMD47CiAJCWludGVyZmFjZS1waXgtZm10ID0gInJnYjI0IjsKIAkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJcGluY3RybC0wID0gPCZwaW5jdHJsX2lwdV9kaXNwMV8xPjsKQEAgLTQxLDExICs0MCwxNiBAQAogCQkJCXZzeW5jLWxlbiA9IDwxMD47CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheTBfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfZGlzcDA+OworCQkJfTsKKwkJfTsKIAl9OwogCi0JZGlzcGxheUBkaTEgeworCWRpc3BsYXkxOiBkaXNwbGF5QGRpMSB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IjsKLQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJaW50ZXJmYWNlLXBpeC1mbXQgPSAicmdiNTY1IjsKIAkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJcGluY3RybC0wID0gPCZwaW5jdHJsX2lwdV9kaXNwMl8xPjsKQEAgLTY4LDYgKzcyLDEyIEBACiAJCQkJcGl4ZWxjbGstYWN0aXZlID0gPDA+OwogCQkJfTsKIAkJfTsKKworCQlwb3J0IHsKKwkJCWRpc3BsYXkxX2luOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkxX2Rpc3AxPjsKKwkJCX07CisJCX07CiAJfTsKIAogCWdwaW8ta2V5cyB7CkBAIC0yNTgsNiArMjY4LDE0IEBACiAJfTsKIH07CiAKKyZpcHVfZGkwX2Rpc3AwIHsKKwlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXkwX2luPjsKK307CisKKyZpcHVfZGkxX2Rpc3AxIHsKKwlyZW1vdGUtZW5kcG9pbnQgPSA8JmRpc3BsYXkxX2luPjsKK307CisKICZzc2kyIHsKIAlmc2wsbW9kZSA9ICJpMnMtc2xhdmUiOwogCXN0YXR1cyA9ICJva2F5IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpCmluZGV4IDRiY2RkM2EuLjI4Yzk2YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEuZHRzaQpAQCAtNzksNiArNzksMTEgQEAKIAkJfTsKIAl9OwogCisJZGlzcGxheS1zdWJzeXN0ZW0geworCQljb21wYXRpYmxlID0gImZzbCxpbXgtZGlzcGxheS1zdWJzeXN0ZW0iOworCQlwb3J0cyA9IDwmaXB1X2RpMD4sIDwmaXB1X2RpMT47CisJfTsKKwogCXNvYyB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKQEAgLTkyLDEzICs5NywyOCBAQAogCQl9OwogCiAJCWlwdTogaXB1QDQwMDAwMDAwIHsKLQkJCSNjcnRjLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWlwdSI7CiAJCQlyZWcgPSA8MHg0MDAwMDAwMCAweDIwMDAwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTEgMTA+OwogCQkJY2xvY2tzID0gPCZjbGtzIDU5PiwgPCZjbGtzIDExMD4sIDwmY2xrcyA2MT47CiAJCQljbG9jay1uYW1lcyA9ICJidXMiLCAiZGkwIiwgImRpMSI7CiAJCQlyZXNldHMgPSA8JnNyYyAyPjsKKworCQkJaXB1X2RpMDogcG9ydEAyIHsKKwkJCQlyZWcgPSA8Mj47CisKKwkJCQlpcHVfZGkwX2Rpc3AwOiBlbmRwb2ludCB7CisJCQkJfTsKKwkJCX07CisKKwkJCWlwdV9kaTE6IHBvcnRAMyB7CisJCQkJcmVnID0gPDM+OworCisJCQkJaXB1X2RpMV9kaXNwMTogZW5kcG9pbnQgeworCQkJCX07CisJCQl9OwogCQl9OwogCiAJCWFpcHNANzAwMDAwMDAgeyAvKiBBSVBTMSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbTUzZXZrLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW01M2V2ay5kdHMKaW5kZXggN2QzMDRkMC4uMDI5OGFkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbTUzZXZrLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1tNTNldmsuZHRzCkBAIC0yMSw5ICsyMSw4IEBACiAJfTsKIAogCXNvYyB7Ci0JCWRpc3BsYXlAZGkxIHsKKwkJZGlzcGxheTE6IGRpc3BsYXlAZGkxIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1wYXJhbGxlbC1kaXNwbGF5IjsKLQkJCWNydGNzID0gPCZpcHUgMT47CiAJCQlpbnRlcmZhY2UtcGl4LWZtdCA9ICJiZ3I2NjYiOwogCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9pcHVfZGlzcDJfMT47CkBAIC00NCw2ICs0MywxMiBAQAogCQkJCX07CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheTFfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTFfZGlzcDE+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJYmFja2xpZ2h0IHsKQEAgLTIyMSw2ICsyMjYsMTAgQEAKIAl9OwogfTsKIAorJmlwdV9kaTFfZGlzcDEgeworCXJlbW90ZS1lbmRwb2ludCA9IDwmZGlzcGxheTFfaW4+OworfTsKKwogJm5mYyB7CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfbmFuZF8xPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW1iYTUzLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLW1iYTUzLmR0cwppbmRleCBhNjMwOTAyLi5hNWI1NWM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My1tYmE1My5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtbWJhNTMuZHRzCkBAIC0zOCw5ICszOCwxNCBAQAogCQljb21wYXRpYmxlID0gImZzbCxpbXgtcGFyYWxsZWwtZGlzcGxheSI7CiAJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCXBpbmN0cmwtMCA9IDwmcGluY3RybF9kaXNwMV8xPjsKLQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJaW50ZXJmYWNlLXBpeC1mbXQgPSAicmdiMjQiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCXBvcnQgeworCQkJZGlzcGxheTFfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTFfZGlzcDE+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJcmVnXzNwMnY6IDNwMnYgewpAQCAtMTQxLDYgKzE0NiwxMCBAQAogCX07CiB9OwogCismaXB1X2RpMV9kaXNwMSB7CisJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5MV9pbj47Cit9OworCiAmY3NwaSB7CiAJc3RhdHVzID0gIm9rYXkiOwogfTsKQEAgLTIyOCw3ICsyMzcsNyBAQAogJnR2ZSB7CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfdmdhX3N5bmNfMT47Ci0JZGRjID0gPCZpMmMzPjsKKwlpMmMtZGRjLWJ1cyA9IDwmaTJjMz47CiAJZnNsLHR2ZS1tb2RlID0gInZnYSI7CiAJZnNsLGhzeW5jLXBpbiA9IDw0PjsKIAlmc2wsdnN5bmMtcGluID0gPDY+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtcXNiLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLXFzYi5kdHMKaW5kZXggOTFhNTkzNS4uOGIyNTQyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtcXNiLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1xc2IuZHRzCkBAIC0yMSw5ICsyMSw4IEBACiAJCXJlZyA9IDwweDcwMDAwMDAwIDB4NDAwMDAwMDA+OwogCX07CiAKLQlkaXNwbGF5QGRpMCB7CisJZGlzcGxheTA6IGRpc3BsYXlAZGkwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsaW14LXBhcmFsbGVsLWRpc3BsYXkiOwotCQljcnRjcyA9IDwmaXB1IDA+OwogCQlpbnRlcmZhY2UtcGl4LWZtdCA9ICJyZ2I1NjUiOwogCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfaXB1X2Rpc3AwXzE+OwpAQCAtNDYsNiArNDUsMTIgQEAKIAkJCQlwaXhlbGNsay1hY3RpdmUgPSA8MD47CiAJCQl9OwogCQl9OworCisJCXBvcnQgeworCQkJZGlzcGxheTBfaW46IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfZGlzcDA+OworCQkJfTsKKwkJfTsKIAl9OwogCiAJZ3Bpby1rZXlzIHsKQEAgLTEyNiw2ICsxMzEsMTAgQEAKIAlzdGF0dXMgPSAib2theSI7CiB9OwogCismaXB1X2RpMF9kaXNwMCB7CisJcmVtb3RlLWVuZHBvaW50ID0gPCZkaXNwbGF5MF9pbj47Cit9OworCiAmc3NpMiB7CiAJZnNsLG1vZGUgPSAiaTJzLXNsYXZlIjsKIAlzdGF0dXMgPSAib2theSI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMuZHRzaQppbmRleCA0MzA3ZTgwLi4wNGQzMTI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLmR0c2kKQEAgLTQ1LDYgKzQ1LDExIEBACiAJCX07CiAJfTsKIAorCWRpc3BsYXktc3Vic3lzdGVtIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIjsKKwkJcG9ydHMgPSA8JmlwdV9kaTA+LCA8JmlwdV9kaTE+OworCX07CisKIAl0emljOiB0ei1pbnRlcnJ1cHQtY29udHJvbGxlckAwZmZmYzAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXR6aWMiLCAiZnNsLHR6aWMiOwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTg1LDEzICs5MCw0OSBAQAogCQlyYW5nZXM7CiAKIAkJaXB1OiBpcHVAMTgwMDAwMDAgewotCQkJI2NydGMtY2VsbHMgPSA8MT47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaXB1IjsKIAkJCXJlZyA9IDwweDE4MDAwMDAwIDB4MDgwMDAwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTEgMTA+OwogCQkJY2xvY2tzID0gPCZjbGtzIDU5PiwgPCZjbGtzIDExMD4sIDwmY2xrcyA2MT47CiAJCQljbG9jay1uYW1lcyA9ICJidXMiLCAiZGkwIiwgImRpMSI7CiAJCQlyZXNldHMgPSA8JnNyYyAyPjsKKworCQkJaXB1X2RpMDogcG9ydEAyIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mj47CisKKwkJCQlpcHVfZGkwX2Rpc3AwOiBlbmRwb2ludEAwIHsKKwkJCQkJcmVnID0gPDA+OworCQkJCX07CisKKwkJCQlpcHVfZGkwX2x2ZHMwOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVnID0gPDE+OworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMwX2luPjsKKwkJCQl9OworCQkJfTsKKworCQkJaXB1X2RpMTogcG9ydEAzIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mz47CisKKwkJCQlpcHVfZGkxX2Rpc3AxOiBlbmRwb2ludEAwIHsKKwkJCQkJcmVnID0gPDA+OworCQkJCX07CisKKwkJCQlpcHVfZGkxX2x2ZHMxOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVnID0gPDE+OworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jmx2ZHMxX2luPjsKKwkJCQl9OworCisJCQkJaXB1X2RpMV90dmU6IGVuZHBvaW50QDIgeworCQkJCQlyZWcgPSA8Mj47CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmdHZlX2luPjsKKwkJCQl9OworCQkJfTsKIAkJfTsKIAogCQlhaXBzQDUwMDAwMDAwIHsgLyogQUlQUzEgKi8KQEAgLTgzOCwxNCArODc5LDI0IEBACiAKIAkJCQlsdmRzLWNoYW5uZWxAMCB7CiAJCQkJCXJlZyA9IDwwPjsKLQkJCQkJY3J0Y3MgPSA8JmlwdSAwPjsKIAkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQkJCQlwb3J0IHsKKwkJCQkJCWx2ZHMwX2luOiBlbmRwb2ludCB7CisJCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkwX2x2ZHMwPjsKKwkJCQkJCX07CisJCQkJCX07CiAJCQkJfTsKIAogCQkJCWx2ZHMtY2hhbm5lbEAxIHsKIAkJCQkJcmVnID0gPDE+OwotCQkJCQljcnRjcyA9IDwmaXB1IDE+OwogCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJCXBvcnQgeworCQkJCQkJbHZkczFfaW46IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdV9kaTBfbHZkczA+OworCQkJCQkJfTsKKwkJCQkJfTsKIAkJCQl9OwogCQkJfTsKIApAQCAtMTEwMyw4ICsxMTU0LDEzIEBACiAJCQkJaW50ZXJydXB0cyA9IDw5Mj47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDY5PiwgPCZjbGtzIDExNj47CiAJCQkJY2xvY2stbmFtZXMgPSAidHZlIiwgImRpX3NlbCI7Ci0JCQkJY3J0Y3MgPSA8JmlwdSAxPjsKIAkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJcG9ydCB7CisJCQkJCXR2ZV9pbjogZW5kcG9pbnQgeworCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHVfZGkxX3R2ZT47CisJCQkJCX07CisJCQkJfTsKIAkJCX07CiAKIAkJCXZwdTogdnB1QDYzZmY0MDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZkbC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NmRsLmR0c2kKaW5kZXggOWU4YWUxMS4uMjViYmRkNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZkbC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZkbC5kdHNpCkBAIC03MCw2ICs3MCwxNSBAQAogCQkJfTsKIAkJfTsKIAl9OworCisJZGlzcGxheS1zdWJzeXN0ZW0geworCQljb21wYXRpYmxlID0gImZzbCxpbXgtZGlzcGxheS1zdWJzeXN0ZW0iOworCQlwb3J0cyA9IDwmaXB1MV9kaTA+LCA8JmlwdTFfZGkxPjsKKwl9OworfTsKKworJmhkbWkgeworCWNvbXBhdGlibGUgPSAiZnNsLGlteDZkbC1oZG1pIjsKIH07CiAKICZsZGIgewpAQCAtNzksMTIgKzg4LDQgQEAKIAljbG9jay1uYW1lcyA9ICJkaTBfcGxsIiwgImRpMV9wbGwiLAogCQkgICAgICAiZGkwX3NlbCIsICJkaTFfc2VsIiwKIAkJICAgICAgImRpMCIsICJkaTEiOwotCi0JbHZkcy1jaGFubmVsQDAgewotCQljcnRjcyA9IDwmaXB1MSAwPiwgPCZpcHUxIDE+OwotCX07Ci0KLQlsdmRzLWNoYW5uZWxAMSB7Ci0JCWNydGNzID0gPCZpcHUxIDA+LCA8JmlwdTEgMT47Ci0JfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaQppbmRleCBmMDI0ZWYyLi4yYThkOWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxLmR0c2kKQEAgLTEzMiwxMyArMTMyLDg0IEBACiAJCX07CiAKIAkJaXB1MjogaXB1QDAyODAwMDAwIHsKLQkJCSNjcnRjLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWlwdSI7CiAJCQlyZWcgPSA8MHgwMjgwMDAwMCAweDQwMDAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgOCAweDQgMCA3IDB4ND47CiAJCQljbG9ja3MgPSA8JmNsa3MgMTMzPiwgPCZjbGtzIDEzND4sIDwmY2xrcyAxMzc+OwogCQkJY2xvY2stbmFtZXMgPSAiYnVzIiwgImRpMCIsICJkaTEiOwogCQkJcmVzZXRzID0gPCZzcmMgND47CisKKwkJCWlwdTJfZGkwOiBwb3J0QDIgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZyA9IDwyPjsKKworCQkJCWlwdTJfZGkwX2Rpc3AwOiBlbmRwb2ludEAwIHsKKwkJCQl9OworCisJCQkJaXB1Ml9kaTBfaGRtaTogZW5kcG9pbnRAMSB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaGRtaV9tdXhfMj47CisJCQkJfTsKKworCQkJCWlwdTJfZGkwX21pcGk6IGVuZHBvaW50QDIgeworCQkJCX07CisKKwkJCQlpcHUyX2RpMF9sdmRzMDogZW5kcG9pbnRAMyB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczBfbXV4XzI+OworCQkJCX07CisKKwkJCQlpcHUyX2RpMF9sdmRzMTogZW5kcG9pbnRANCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczFfbXV4XzI+OworCQkJCX07CisJCQl9OworCisJCQlpcHUyX2RpMTogcG9ydEAzIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlyZWcgPSA8Mz47CisKKwkJCQlpcHUyX2RpMV9oZG1pOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZoZG1pX211eF8zPjsKKwkJCQl9OworCisJCQkJaXB1Ml9kaTFfbWlwaTogZW5kcG9pbnRAMiB7CisJCQkJfTsKKworCQkJCWlwdTJfZGkxX2x2ZHMwOiBlbmRwb2ludEAzIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMF9tdXhfMz47CisJCQkJfTsKKworCQkJCWlwdTJfZGkxX2x2ZHMxOiBlbmRwb2ludEA0IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMV9tdXhfMz47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKKworCWRpc3BsYXktc3Vic3lzdGVtIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWRpc3BsYXktc3Vic3lzdGVtIjsKKwkJcG9ydHMgPSA8JmlwdTFfZGkwPiwgPCZpcHUxX2RpMT4sIDwmaXB1Ml9kaTA+LCA8JmlwdTJfZGkxPjsKKwl9OworfTsKKworJmhkbWkgeworCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWhkbWkiOworCisJcG9ydEAyIHsKKwkJcmVnID0gPDI+OworCisJCWhkbWlfbXV4XzI6IGVuZHBvaW50IHsKKwkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1Ml9kaTBfaGRtaT47CisJCX07CisJfTsKKworCXBvcnRAMyB7CisJCXJlZyA9IDwzPjsKKworCQloZG1pX211eF8zOiBlbmRwb2ludCB7CisJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkxX2hkbWk+OwogCQl9OwogCX07CiB9OwpAQCAtMTUyLDEwICsyMjMsNTYgQEAKIAkJICAgICAgImRpMCIsICJkaTEiOwogCiAJbHZkcy1jaGFubmVsQDAgewotCQljcnRjcyA9IDwmaXB1MSAwPiwgPCZpcHUxIDE+LCA8JmlwdTIgMD4sIDwmaXB1MiAxPjsKKwkJcG9ydEAyIHsKKwkJCXJlZyA9IDwyPjsKKworCQkJbHZkczBfbXV4XzI6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkwX2x2ZHMwPjsKKwkJCX07CisJCX07CisKKwkJcG9ydEAzIHsKKwkJCXJlZyA9IDwzPjsKKworCQkJbHZkczBfbXV4XzM6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkxX2x2ZHMwPjsKKwkJCX07CisJCX07CiAJfTsKIAogCWx2ZHMtY2hhbm5lbEAxIHsKLQkJY3J0Y3MgPSA8JmlwdTEgMD4sIDwmaXB1MSAxPiwgPCZpcHUyIDA+LCA8JmlwdTIgMT47CisJCXBvcnRAMiB7CisJCQlyZWcgPSA8Mj47CisKKwkJCWx2ZHMxX211eF8yOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMF9sdmRzMT47CisJCQl9OworCQl9OworCisJCXBvcnRAMyB7CisJCQlyZWcgPSA8Mz47CisKKwkJCWx2ZHMxX211eF8zOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMV9sdmRzMT47CisJCQl9OworCQl9OworCX07Cit9OworCismbWlwaV9kc2kgeworCXBvcnRAMiB7CisJCXJlZyA9IDwyPjsKKworCQltaXBpX211eF8yOiBlbmRwb2ludCB7CisJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTJfZGkwX21pcGk+OworCQl9OworCX07CisKKwlwb3J0QDMgeworCQlyZWcgPSA8Mz47CisKKwkJbWlwaV9tdXhfMzogZW5kcG9pbnQgeworCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZpcHUyX2RpMV9taXBpPjsKKwkJfTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwuZHRzaQppbmRleCBmYjI4YjJlLi42NGE4Y2JlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC5kdHNpCkBAIC0xMzU4LDEzICsxMzU4LDc2IEBACiAJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAogCQkJCWx2ZHMtY2hhbm5lbEAwIHsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJCQlyZWcgPSA8MD47CiAJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJCQkJcG9ydEAwIHsKKwkJCQkJCXJlZyA9IDwwPjsKKworCQkJCQkJbHZkczBfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkwX2x2ZHMwPjsKKwkJCQkJCX07CisJCQkJCX07CisKKwkJCQkJcG9ydEAxIHsKKwkJCQkJCXJlZyA9IDwxPjsKKworCQkJCQkJbHZkczBfbXV4XzE6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX2x2ZHMwPjsKKwkJCQkJCX07CisJCQkJCX07CiAJCQkJfTsKIAogCQkJCWx2ZHMtY2hhbm5lbEAxIHsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJCQlyZWcgPSA8MT47CiAJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJCQkJcG9ydEAwIHsKKwkJCQkJCXJlZyA9IDwwPjsKKworCQkJCQkJbHZkczFfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkwX2x2ZHMxPjsKKwkJCQkJCX07CisJCQkJCX07CisKKwkJCQkJcG9ydEAxIHsKKwkJCQkJCXJlZyA9IDwxPjsKKworCQkJCQkJbHZkczFfbXV4XzE6IGVuZHBvaW50IHsKKwkJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX2x2ZHMxPjsKKwkJCQkJCX07CisJCQkJCX07CisJCQkJfTsKKwkJCX07CisKKwkJCWhkbWk6IGhkbWlAMDEyMDAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnID0gPDB4MDAxMjAwMDAgMHg5MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTE1IDB4MDQ+OworCQkJCWdwciA9IDwmZ3ByPjsKKwkJCQljbG9ja3MgPSA8JmNsa3MgMTIzPiwgPCZjbGtzIDEyND47CisJCQkJY2xvY2stbmFtZXMgPSAiaWFoYiIsICJpc2ZyIjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJcG9ydEAwIHsKKwkJCQkJcmVnID0gPDA+OworCisJCQkJCWhkbWlfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1MV9kaTBfaGRtaT47CisJCQkJCX07CisJCQkJfTsKKworCQkJCXBvcnRAMSB7CisJCQkJCXJlZyA9IDwxPjsKKworCQkJCQloZG1pX211eF8xOiBlbmRwb2ludCB7CisJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX2hkbWk+OworCQkJCQl9OwogCQkJCX07CiAJCQl9OwogCkBAIC0xNTc5LDggKzE2NDIsMjcgQEAKIAkJCQlyZWcgPSA8MHgwMjFkYzAwMCAweDQwMDA+OwogCQkJfTsKIAotCQkJbWlwaUAwMjFlMDAwMCB7IC8qIE1JUEktRFNJICovCisJCQltaXBpX2RzaTogbWlwaUAwMjFlMDAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQkJcmVnID0gPDB4MDIxZTAwMDAgMHg0MDAwPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQkJcG9ydEAwIHsKKwkJCQkJcmVnID0gPDA+OworCisJCQkJCW1pcGlfbXV4XzA6IGVuZHBvaW50IHsKKwkJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaXB1MV9kaTBfbWlwaT47CisJCQkJCX07CisJCQkJfTsKKworCQkJCXBvcnRAMSB7CisJCQkJCXJlZyA9IDwxPjsKKworCQkJCQltaXBpX211eF8xOiBlbmRwb2ludCB7CisJCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmlwdTFfZGkxX21pcGk+OworCQkJCQl9OworCQkJCX07CiAJCQl9OwogCiAJCQl2ZG9hQDAyMWU0MDAwIHsKQEAgLTE2MzQsMTMgKzE3MTYsNjQgQEAKIAkJfTsKIAogCQlpcHUxOiBpcHVAMDI0MDAwMDAgewotCQkJI2NydGMtY2VsbHMgPSA8MT47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtaXB1IjsKIAkJCXJlZyA9IDwweDAyNDAwMDAwIDB4NDAwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MCA2IDB4NCAwIDUgMHg0PjsKIAkJCWNsb2NrcyA9IDwmY2xrcyAxMzA+LCA8JmNsa3MgMTMxPiwgPCZjbGtzIDEzMj47CiAJCQljbG9jay1uYW1lcyA9ICJidXMiLCAiZGkwIiwgImRpMSI7CiAJCQlyZXNldHMgPSA8JnNyYyAyPjsKKworCQkJaXB1MV9kaTA6IHBvcnRAMiB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnID0gPDI+OworCisJCQkJaXB1MV9kaTBfZGlzcDA6IGVuZHBvaW50QDAgeworCQkJCX07CisKKwkJCQlpcHUxX2RpMF9oZG1pOiBlbmRwb2ludEAxIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZoZG1pX211eF8wPjsKKwkJCQl9OworCisJCQkJaXB1MV9kaTBfbWlwaTogZW5kcG9pbnRAMiB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbWlwaV9tdXhfMD47CisJCQkJfTsKKworCQkJCWlwdTFfZGkwX2x2ZHMwOiBlbmRwb2ludEAzIHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMF9tdXhfMD47CisJCQkJfTsKKworCQkJCWlwdTFfZGkwX2x2ZHMxOiBlbmRwb2ludEA0IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZsdmRzMV9tdXhfMD47CisJCQkJfTsKKwkJCX07CisKKwkJCWlwdTFfZGkxOiBwb3J0QDMgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZyA9IDwzPjsKKworCQkJCWlwdTFfZGkwX2Rpc3AxOiBlbmRwb2ludEAwIHsKKwkJCQl9OworCisJCQkJaXB1MV9kaTFfaGRtaTogZW5kcG9pbnRAMSB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmaGRtaV9tdXhfMT47CisJCQkJfTsKKworCQkJCWlwdTFfZGkxX21pcGk6IGVuZHBvaW50QDIgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8Jm1pcGlfbXV4XzE+OworCQkJCX07CisKKwkJCQlpcHUxX2RpMV9sdmRzMDogZW5kcG9pbnRAMyB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczBfbXV4XzE+OworCQkJCX07CisKKwkJCQlpcHUxX2RpMV9sdmRzMTogZW5kcG9pbnRANCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmbHZkczFfbXV4XzE+OworCQkJCX07CisJCQl9OwogCQl9OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcHJpbWEyLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9wcmltYTIuZHRzaQppbmRleCAwZTIxOTkzLi44NTgyYWU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9wcmltYTIuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9wcmltYTIuZHRzaQpAQCAtMjIzLDggKzIyMyw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwxNz47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMTM+OwotCQkJCXNpcmYsdWFydC1kbWEtcngtY2hhbm5lbCA9IDwyMT47Ci0JCQkJc2lyZix1YXJ0LWRtYS10eC1jaGFubmVsID0gPDI+OworCQkJCWRtYXMgPSA8JmRtYWMxIDU+LCA8JmRtYWMwIDI+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQl1YXJ0MTogdWFydEBiMDA2MDAwMCB7CkBAIC0yNDMsOCArMjQzLDggQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDE5PjsKIAkJCQlmaWZvc2l6ZSA9IDwxMjg+OwogCQkJCWNsb2NrcyA9IDwmY2xrcyAxNT47Ci0JCQkJc2lyZix1YXJ0LWRtYS1yeC1jaGFubmVsID0gPDY+OwotCQkJCXNpcmYsdWFydC1kbWEtdHgtY2hhbm5lbCA9IDw3PjsKKwkJCQlkbWFzID0gPCZkbWFjMCA2PiwgPCZkbWFjMCA3PjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdXNwMDogdXNwQGIwMDgwMDAwIHsKQEAgLTI1NCw4ICsyNTQsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MjA+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDI4PjsKLQkJCQlzaXJmLHVzcC1kbWEtcngtY2hhbm5lbCA9IDwxNz47Ci0JCQkJc2lyZix1c3AtZG1hLXR4LWNoYW5uZWwgPSA8MTg+OworCQkJCWRtYXMgPSA8JmRtYWMxIDE+LCA8JmRtYWMxIDI+OworCQkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CiAJCQl9OwogCiAJCQl1c3AxOiB1c3BAYjAwOTAwMDAgewpAQCAtMjY1LDggKzI2NSw4IEBACiAJCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQkJZmlmb3NpemUgPSA8MTI4PjsKIAkJCQljbG9ja3MgPSA8JmNsa3MgMjk+OwotCQkJCXNpcmYsdXNwLWRtYS1yeC1jaGFubmVsID0gPDE0PjsKLQkJCQlzaXJmLHVzcC1kbWEtdHgtY2hhbm5lbCA9IDwxNT47CisJCQkJZG1hcyA9IDwmZG1hYzAgMTQ+LCA8JmRtYWMwIDE1PjsKKwkJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOwogCQkJfTsKIAogCQkJdXNwMjogdXNwQGIwMGEwMDAwIHsKQEAgLTI3Niw4ICsyNzYsOCBAQAogCQkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJCWZpZm9zaXplID0gPDEyOD47CiAJCQkJY2xvY2tzID0gPCZjbGtzIDMwPjsKLQkJCQlzaXJmLHVzcC1kbWEtcngtY2hhbm5lbCA9IDwxMD47Ci0JCQkJc2lyZix1c3AtZG1hLXR4LWNoYW5uZWwgPSA8MTE+OworCQkJCWRtYXMgPSA8JmRtYWMwIDEwPiwgPCZkbWFjMCAxMT47CisJCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKIAkJCX07CiAKIAkJCWRtYWMwOiBkbWEtY29udHJvbGxlckBiMDBiMDAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9yOGE3NzkxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9yOGE3NzkxLmR0c2kKaW5kZXggMTljNjU1MC4uM2IwNzVkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvcjhhNzc5MS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3I4YTc3OTEuZHRzaQpAQCAtNDI5LDcgKzQyOSw3IEBACiAJCQkJUjhBNzc5MV9DTEtfTVNJT0YxIFI4QTc3OTFfQ0xLX1NDSUZCMgogCQkJPjsKIAkJCWNsb2NrLW91dHB1dC1uYW1lcyA9Ci0JCQkJInNjaWZhMiIsICJzY2lmYTEiLCAic2NpZmEwIiwgIm1pc29mMiIsICJzY2lmYjAiLAorCQkJCSJzY2lmYTIiLCAic2NpZmExIiwgInNjaWZhMCIsICJtc2lvZjIiLCAic2NpZmIwIiwKIAkJCQkic2NpZmIxIiwgIm1zaW9mMSIsICJzY2lmYjIiOwogCQl9OwogCQltc3RwM19jbGtzOiBtc3RwM19jbGtzQGU2MTUwMTNjIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3NhbWE1ZDM2LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zYW1hNWQzNi5kdHNpCmluZGV4IDZjMzFjMjYuLmRiNThjYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3NhbWE1ZDM2LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc2FtYTVkMzYuZHRzaQpAQCAtOCw4ICs4LDggQEAKICAqLwogI2luY2x1ZGUgInNhbWE1ZDMuZHRzaSIKICNpbmNsdWRlICJzYW1hNWQzX2Nhbi5kdHNpIgotI2luY2x1ZGUgInNhbWE1ZDNfZW1hYy5kdHNpIgogI2luY2x1ZGUgInNhbWE1ZDNfZ21hYy5kdHNpIgorI2luY2x1ZGUgInNhbWE1ZDNfZW1hYy5kdHNpIgogI2luY2x1ZGUgInNhbWE1ZDNfbGNkLmR0c2kiCiAjaW5jbHVkZSAic2FtYTVkM19tY2kyLmR0c2kiCiAjaW5jbHVkZSAic2FtYTVkM190Y2IxLmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW40aS1hMTAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpCmluZGV4IGQ0ZDI3NjMuLjc3NTNiZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpCkBAIC0zMzEsNyArMzMxLDcgQEAKIAkJfTsKIAogCQlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwMWMyMDQwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1pYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtaWMiOwogCQkJcmVnID0gPDB4MDFjMjA0MDAgMHg0MDA+OwogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwpAQCAtNDAzLDcgKzQwMyw3IEBACiAJCX07CiAKIAkJdGltZXJAMDFjMjBjMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktdGltZXIiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIjsKIAkJCXJlZyA9IDwweDAxYzIwYzAwIDB4OTA+OwogCQkJaW50ZXJydXB0cyA9IDwyMj47CiAJCQljbG9ja3MgPSA8Jm9zYzI0TT47CkBAIC00MjEsNyArNDIxLDcgQEAKIAkJfTsKIAogCQlzaWQ6IGVlcHJvbUAwMWMyMzgwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1zaWQiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNpZCI7CiAJCQlyZWcgPSA8MHgwMWMyMzgwMCAweDEwPjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEwcy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEwcy5kdHNpCmluZGV4IDc5ZmQ0MTIuLmVlMTdiMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMHMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTBzLmR0c2kKQEAgLTI5NCw3ICsyOTQsNyBAQAogCQl9OwogCiAJCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDAxYzIwNDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWljIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1pYyI7CiAJCQlyZWcgPSA8MHgwMWMyMDQwMCAweDQwMD47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CkBAIC0zNjYsNyArMzY2LDcgQEAKIAkJfTsKIAogCQl0aW1lckAwMWMyMGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS10aW1lciI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiOwogCQkJcmVnID0gPDB4MDFjMjBjMDAgMHg5MD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWNsb2NrcyA9IDwmb3NjMjRNPjsKQEAgLTM3OCw3ICszNzgsNyBAQAogCQl9OwogCiAJCXNpZDogZWVwcm9tQDAxYzIzODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXNpZCI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc2lkIjsKIAkJCXJlZyA9IDwweDAxYzIzODAwIDB4MTA+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMy5kdHNpCmluZGV4IGM0NjNmZDcuLjM0OTBlZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMy5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjVpLWExMy5kdHNpCkBAIC0yNzUsNyArMjc1LDcgQEAKIAkJcmFuZ2VzOwogCiAJCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDAxYzIwNDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWljIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1pYyI7CiAJCQlyZWcgPSA8MHgwMWMyMDQwMCAweDQwMD47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CkBAIC0zMjksNyArMzI5LDcgQEAKIAkJfTsKIAogCQl0aW1lckAwMWMyMGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS10aW1lciI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtdGltZXIiOwogCQkJcmVnID0gPDB4MDFjMjBjMDAgMHg5MD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWNsb2NrcyA9IDwmb3NjMjRNPjsKQEAgLTM0MSw3ICszNDEsNyBAQAogCQl9OwogCiAJCXNpZDogZWVwcm9tQDAxYzIzODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXNpZCI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtc2lkIjsKIAkJCXJlZyA9IDwweDAxYzIzODAwIDB4MTA+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW42aS1hMzEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCmluZGV4IDUyNTZhZDkuLjM4ZDQzZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCkBAIC0xOTAsNiArMTkwLDE0IEBACiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyYW5nZXM7CiAKKwkJbm1pX2ludGM6IGludGVycnVwdC1jb250cm9sbGVyQDAxZjAwYzBjIHsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1zYy1ubWkiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDB4MDFmMDBjMGMgMHgzOD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMzIgND47CisJCX07CisKIAkJcGlvOiBwaW5jdHJsQDAxYzIwODAwIHsKIAkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1waW5jdHJsIjsKIAkJCXJlZyA9IDwweDAxYzIwODAwIDB4NDAwPjsKQEAgLTIzMSw3ICsyMzksNyBAQAogCQl9OwogCiAJCXRpbWVyQDAxYzIwYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC10aW1lciI7CiAJCQlyZWcgPSA8MHgwMWMyMGMwMCAweGEwPjsKIAkJCWludGVycnVwdHMgPSA8MCAxOCA0PiwKIAkJCQkgICAgIDwwIDE5IDQ+LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW43aS1hMjAuZHRzaQppbmRleCA2ZjI1Y2Y1Li5jYWRjZjJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW43aS1hMjAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW43aS1hMjAuZHRzaQpAQCAtMzM5LDYgKzMzOSwxNCBAQAogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJcmFuZ2VzOwogCisJCW5taV9pbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwMWMwMDAzMCB7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtc2Mtbm1pIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCXJlZyA9IDwweDAxYzAwMDMwIDB4MGM+OworCQkJaW50ZXJydXB0cyA9IDwwIDAgND47CisJCX07CisKIAkJZW1hYzogZXRoZXJuZXRAMDFjMGIwMDAgewogCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLWVtYWMiOwogCQkJcmVnID0gPDB4MDFjMGIwMDAgMHgxMDAwPjsKQEAgLTQzNSw3ICs0NDMsNyBAQAogCQl9OwogCiAJCXRpbWVyQDAxYzIwYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC10aW1lciI7CiAJCQlyZWcgPSA8MHgwMWMyMGMwMCAweDkwPjsKIAkJCWludGVycnVwdHMgPSA8MCAyMiA0PiwKIAkJCQkgICAgIDwwIDIzIDQ+LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvenlucS03MDAwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy96eW5xLTcwMDAuZHRzaQppbmRleCA4YjY3YjE5Li43ODlkMGJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy96eW5xLTcwMDAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy96eW5xLTcwMDAuZHRzaQpAQCAtMjQsNiArMjQsMTIgQEAKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47CiAJCQljbG9ja3MgPSA8JmNsa2MgMz47CisJCQlvcGVyYXRpbmctcG9pbnRzID0gPAorCQkJCS8qIGtIeiAgICB1ViAqLworCQkJCTY2NjY2NyAgMTAwMDAwMAorCQkJCTMzMzMzNCAgMTAwMDAwMAorCQkJCTIyMjIyMyAgMTAwMDAwMAorCQkJPjsKIAkJfTsKIAogCQljcHVAMSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMzI3OGFmZS4uMjNlNzI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtNywxNiArNywxOSBAQAogZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKIGdlbmVyaWMteSArPSBlcnJuby5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaW9jdGwuaAogZ2VuZXJpYy15ICs9IGlwY2J1Zi5oCiBnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAogZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAogZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBwYXJhbS5oCiBnZW5lcmljLXkgKz0gcGFycG9ydC5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAogZ2VuZXJpYy15ICs9IHNlY3Rpb25zLmgKIGdlbmVyaWMteSArPSBzZWdtZW50LmgKQEAgLTMzLDUgKzM2LDMgQEAKIGdlbmVyaWMteSArPSB0aW1leC5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHVuYWxpZ25lZC5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCA1OGI4Yjg0Li4yZmU4NWZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTIwLDkgKzIwLDYgQEAKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9jcHVtYXNrKGNwdSkJKCZjcHVfdG9wb2xvZ3lbY3B1XS5jb3JlX3NpYmxpbmcpCiAjZGVmaW5lIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkJKCZjcHVfdG9wb2xvZ3lbY3B1XS50aHJlYWRfc2libGluZykKIAotI2RlZmluZSBtY19jYXBhYmxlKCkJKGNwdV90b3BvbG9neVswXS5zb2NrZXRfaWQgIT0gLTEpCi0jZGVmaW5lIHNtdF9jYXBhYmxlKCkJKGNwdV90b3BvbG9neVswXS50aHJlYWRfaWQgIT0gLTEpCi0KIHZvaWQgaW5pdF9jcHVfdG9wb2xvZ3kodm9pZCk7CiB2b2lkIHN0b3JlX2NwdV90b3BvbG9neSh1bnNpZ25lZCBpbnQgY3B1aWQpOwogY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9jb3JlZ3JvdXBfbWFzayhpbnQgY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwppbmRleCAzMTdkYTg4Li5kMGQ0Njc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC0xOSw3ICsxOSw3IEBACiBzdGF0aWMgaW50IGRlYnVnX3BjaTsKIAogLyoKLSAqIFdlIGNhbid0IHVzZSBwY2lfZmluZF9kZXZpY2UoKSBoZXJlIHNpbmNlIHdlIGFyZQorICogV2UgY2FuJ3QgdXNlIHBjaV9nZXRfZGV2aWNlKCkgaGVyZSBzaW5jZSB3ZSBhcmUKICAqIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgogICovCiBzdGF0aWMgdm9pZCBwY2liaW9zX2J1c19yZXBvcnRfc3RhdHVzKHN0cnVjdCBwY2lfYnVzICpidXMsIHVfaW50IHN0YXR1c19tYXNrLCBpbnQgd2FybikKQEAgLTU3LDEzICs1NywxMCBAQAogCiB2b2lkIHBjaWJpb3NfcmVwb3J0X3N0YXR1cyh1X2ludCBzdGF0dXNfbWFzaywgaW50IHdhcm4pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCi0JbGlzdF9mb3JfZWFjaChsLCAmcGNpX3Jvb3RfYnVzZXMpIHsKLQkJc3RydWN0IHBjaV9idXMgKmJ1cyA9IHBjaV9idXNfYihsKTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpCiAJCXBjaWJpb3NfYnVzX3JlcG9ydF9zdGF0dXMoYnVzLCBzdGF0dXNfbWFzaywgd2Fybik7Ci0JfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOTJmN2IxNS4uYWRhYmVhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogCkBAIC0xMzMsNyArMTMyLDExIEBACiAKIHZvaWQgKCphcm1fcG1faWRsZSkodm9pZCk7CiAKLXN0YXRpYyB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQorLyoKKyAqIENhbGxlZCBmcm9tIHRoZSBjb3JlIGlkbGUgbG9vcC4KKyAqLworCit2b2lkIGFyY2hfY3B1X2lkbGUodm9pZCkKIHsKIAlpZiAoYXJtX3BtX2lkbGUpCiAJCWFybV9wbV9pZGxlKCk7CkBAIC0xNjgsMTUgKzE3MSw2IEBACiAjZW5kaWYKIAogLyoKLSAqIENhbGxlZCBmcm9tIHRoZSBjb3JlIGlkbGUgbG9vcC4KLSAqLwotdm9pZCBhcmNoX2NwdV9pZGxlKHZvaWQpCi17Ci0JaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpCi0JCWRlZmF1bHRfaWRsZSgpOwotfQotCi0vKgogICogQ2FsbGVkIGJ5IGtleGVjLCBpbW1lZGlhdGVseSBwcmlvciB0byBtYWNoaW5lX2tleGVjKCkuCiAgKgogICogVGhpcyBtdXN0IGNvbXBsZXRlbHkgZGlzYWJsZSBhbGwgc2Vjb25kYXJ5IENQVXM7IHNpbXBseSBjYXVzaW5nIHRob3NlIENQVXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODUwLmMKaW5kZXggMmFiMDA0My4uODUzOTljOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODUwLmMKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCUNMSygic3BpX2RhdmluY2kuMCIsCU5VTEwsCQkmc3BpMF9jbGspLAogCUNMSygic3BpX2RhdmluY2kuMSIsCU5VTEwsCQkmc3BpMV9jbGspLAogCUNMSygidnBpZiIsCQlOVUxMLAkJJnZwaWZfY2xrKSwKLQlDTEsoImFoY2kiLAkJTlVMTCwJCSZzYXRhX2NsayksCisJQ0xLKCJhaGNpX2RhODUwIiwJCU5VTEwsCQkmc2F0YV9jbGspLAogCUNMSygiZGF2aW5jaS1ycHJvYy4wIiwJTlVMTCwJCSZkc3BfY2xrKSwKIAlDTEsoImVocnB3bSIsCQkiZmNrIiwJCSZlaHJwd21fY2xrKSwKIAlDTEsoImVocnB3bSIsCQkidGJjbGsiLAkmZWhycHdtX3RiY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCmluZGV4IDA0ODZjZGYuLjU2ZWE0MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYwpAQCAtMTAyMCw3ICsxMDIwLDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19BUkNIX0RBVklOQ0lfREE4NTAKLQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYTg1MF9zYXRhX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0CT0gREE4NTBfU0FUQV9CQVNFLApAQCAtMTAyOCwxMDMgKzEwMjcsMjIgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydAk9IERBOFhYX1NZU0NGRzFfQkFTRSArIERBOFhYX1BXUkROX1JFRywKKwkJLmVuZAk9IERBOFhYX1NZU0NGRzFfQkFTRSArIERBOFhYX1BXUkROX1JFRyArIDB4MywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CiAJCS5zdGFydAk9IElSUV9EQTg1MF9TQVRBSU5ULAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotLyogU0FUQSBQSFkgQ29udHJvbCBSZWdpc3RlciBvZmZzZXQgZnJvbSBBSENJIGJhc2UgKi8KLSNkZWZpbmUgU0FUQV9QMFBIWUNSX1JFRwkweDE3OAotCi0jZGVmaW5lIFNBVEFfUEhZX01QWSh4KQkJKCh4KSA8PCAwKQotI2RlZmluZSBTQVRBX1BIWV9MT1MoeCkJCSgoeCkgPDwgNikKLSNkZWZpbmUgU0FUQV9QSFlfUlhDRFIoeCkJKCh4KSA8PCAxMCkKLSNkZWZpbmUgU0FUQV9QSFlfUlhFUSh4KQkoKHgpIDw8IDEzKQotI2RlZmluZSBTQVRBX1BIWV9UWFNXSU5HKHgpCSgoeCkgPDwgMTkpCi0jZGVmaW5lIFNBVEFfUEhZX0VOUExMKHgpCSgoeCkgPDwgMzEpCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpkYTg1MF9zYXRhX2NsazsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRhODUwX3NhdGFfcmVmY2xrcG47Ci0KLS8qIFN1cHBvcnRlZCBEQTg1MCBTQVRBIGNyeXN0YWwgZnJlcXVlbmNpZXMgKi8KLSNkZWZpbmUgS0haX1RPX0haKGZyZXEpICgoZnJlcSkgKiAxMDAwKQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGE4NTBfc2F0YV94dGFsW10gPSB7Ci0JS0haX1RPX0haKDMwMDAwMCksCi0JS0haX1RPX0haKDI1MDAwMCksCi0JMCwJCQkvKiBSZXNlcnZlZCAqLwotCUtIWl9UT19IWigxODc1MDApLAotCUtIWl9UT19IWigxNTAwMDApLAotCUtIWl9UT19IWigxMjUwMDApLAotCUtIWl9UT19IWigxMjAwMDApLAotCUtIWl9UT19IWigxMDAwMDApLAotCUtIWl9UT19IWig3NTAwMCksCi0JS0haX1RPX0haKDYwMDAwKSwKLX07Ci0KLXN0YXRpYyBpbnQgZGE4NTBfc2F0YV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCBfX2lvbWVtICphZGRyKQotewotCWludCBpLCByZXQ7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCWRhODUwX3NhdGFfY2xrID0gY2xrX2dldChkZXYsIE5VTEwpOwotCWlmIChJU19FUlIoZGE4NTBfc2F0YV9jbGspKQotCQlyZXR1cm4gUFRSX0VSUihkYTg1MF9zYXRhX2Nsayk7Ci0KLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGE4NTBfc2F0YV9jbGspOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyMDsKLQotCS8qIEVuYWJsZSBTQVRBIGNsb2NrIHJlY2VpdmVyICovCi0JdmFsID0gX19yYXdfcmVhZGwoREE4WFhfU1lTQ0ZHMV9WSVJUKERBOFhYX1BXUkROX1JFRykpOwotCXZhbCAmPSB+QklUKDApOwotCV9fcmF3X3dyaXRlbCh2YWwsIERBOFhYX1NZU0NGRzFfVklSVChEQThYWF9QV1JETl9SRUcpKTsKLQotCS8qIEdldCB0aGUgbXVsdGlwbGllciBuZWVkZWQgZm9yIDEuNUdIeiBQTEwgb3V0cHV0ICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGE4NTBfc2F0YV94dGFsKTsgaSsrKQotCQlpZiAoZGE4NTBfc2F0YV94dGFsW2ldID09IGRhODUwX3NhdGFfcmVmY2xrcG4pCi0JCQlicmVhazsKLQotCWlmIChpID09IEFSUkFZX1NJWkUoZGE4NTBfc2F0YV94dGFsKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JdmFsID0gU0FUQV9QSFlfTVBZKGkgKyAxKSB8Ci0JCVNBVEFfUEhZX0xPUygxKSB8Ci0JCVNBVEFfUEhZX1JYQ0RSKDQpIHwKLQkJU0FUQV9QSFlfUlhFUSgxKSB8Ci0JCVNBVEFfUEhZX1RYU1dJTkcoMykgfAotCQlTQVRBX1BIWV9FTlBMTCgxKTsKLQotCV9fcmF3X3dyaXRlbCh2YWwsIGFkZHIgKyBTQVRBX1AwUEhZQ1JfUkVHKTsKLQotCXJldHVybiAwOwotCi1lcnIxOgotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTg1MF9zYXRhX2Nsayk7Ci1lcnIwOgotCWNsa19wdXQoZGE4NTBfc2F0YV9jbGspOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRhODUwX3NhdGFfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhODUwX3NhdGFfY2xrKTsKLQljbGtfcHV0KGRhODUwX3NhdGFfY2xrKTsKLX0KLQotc3RhdGljIHN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgZGE4NTBfc2F0YV9wZGF0YSA9IHsKLQkuaW5pdAk9IGRhODUwX3NhdGFfaW5pdCwKLQkuZXhpdAk9IGRhODUwX3NhdGFfZXhpdCwKLX07Ci0KIHN0YXRpYyB1NjQgZGE4NTBfc2F0YV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGE4NTBfc2F0YV9kZXZpY2UgPSB7Ci0JLm5hbWUJPSAiYWhjaSIsCisJLm5hbWUJPSAiYWhjaV9kYTg1MCIsCiAJLmlkCT0gLTEsCiAJLmRldgk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJmRhODUwX3NhdGFfcGRhdGEsCiAJCS5kbWFfbWFzawkJPSAmZGE4NTBfc2F0YV9kbWFtYXNrLAogCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAogCX0sCkBAIC0xMTM0LDkgKzEwNTIsOCBAQAogCiBpbnQgX19pbml0IGRhODUwX3JlZ2lzdGVyX3NhdGEodW5zaWduZWQgbG9uZyByZWZjbGtwbikKIHsKLQlkYTg1MF9zYXRhX3JlZmNsa3BuID0gcmVmY2xrcG47Ci0JaWYgKCFkYTg1MF9zYXRhX3JlZmNsa3BuKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBwbGVhc2Ugc2VlIGNvbW1lbnQgaW4gZHJpdmVycy9hdGEvYWhjaV9kYTg1MC5jICovCisJQlVHX09OKHJlZmNsa3BuICE9IDEwMCAqIDEwMDAgKiAxMDAwKTsKIAogCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRhODUwX3NhdGFfZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnCmluZGV4IDRjNDE0YWYuLjhkMTk3ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvS2NvbmZpZwpAQCAtMzYsNyArMzYsNiBAQAogCXNlbGVjdCBIQVZFX0FSTV9TQ1UgaWYgU01QCiAJc2VsZWN0IEhBVkVfU01QCiAJc2VsZWN0IFBJTkNUUkwKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX1hIQ0kKIAloZWxwCiAJICBTYW1zdW5nIEVYWU5PUzUgKENvcnRleC1BMTUpIFNvQyBiYXNlZCBzeXN0ZW1zCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMW1vYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMW1vYm9hcmQuYwppbmRleCBiMzczOGU2Li44ZjQ1YWZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jCkBAIC0xMjgsMjcgKzEyOCwxNSBAQAogCS5udW1fcmVzb3VyY2VzID0gMSwKIH07CiAKLXN0YXRpYyBpbnQgbW9ib2FyZF91YXJ0MF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBfX2luaXQgbW9ib2FyZF91YXJ0MF9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IGdwaW9fcmVxdWVzdChJT01VWF9UT19HUElPKE1YMzFfUElOX0NUUzEpLCAidWFydDAtY3RzLWhhY2siKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ1RTMSksIDApOwotCWlmIChyZXQpCisJaWYgKCFncGlvX3JlcXVlc3QoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSwgInVhcnQwLWN0cy1oYWNrIikpIHsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ1RTMSksIDApOwogCQlncGlvX2ZyZWUoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtb2JvYXJkX3VhcnQwX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlncGlvX2ZyZWUoSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9DVFMxKSk7CisJfQogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0MF9wZGF0YSBfX2luaXRjb25zdCA9IHsKLQkuaW5pdCA9IG1vYm9hcmRfdWFydDBfaW5pdCwKLQkuZXhpdCA9IG1vYm9hcmRfdWFydDBfZXhpdCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnQ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewpAQCAtNTQzLDYgKzUzMSw3IEBACiAKIAlpbXgzMV9hZGRfaW14Ml93ZHQoKTsKIAorCW1vYm9hcmRfdWFydDBfaW5pdCgpOwogCWlteDMxX2FkZF9pbXhfdWFydDAoJnVhcnQwX3BkYXRhKTsKIAlpbXgzMV9hZGRfaW14X3VhcnQ0KCZ1YXJ0NF9wZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDZxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2cS5jCmluZGV4IDdhOWI5ODUuLjI5ZTNmZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDZxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14NnEuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAKIGludCBpbXg2cV9zZXRfbHBtKGVudW0gbXhjX2NwdV9wd3JfbW9kZSBtb2RlKQogewotCXN0cnVjdCBpcnFfZGVzYyAqaW9tdXhjX2lycV9kZXNjOworCXN0cnVjdCBpcnFfZGF0YSAqaW9tdXhjX2lycV9kYXRhID0gaXJxX2dldF9pcnFfZGF0YSgzMik7CiAJdTMyIHZhbCA9IHJlYWRsX3JlbGF4ZWQoY2NtX2Jhc2UgKyBDTFBDUik7CiAKIAl2YWwgJj0gfkJNX0NMUENSX0xQTTsKQEAgLTE2NywxMCArMTY3LDkgQEAKIAkgKiAzKSBTb2Z0d2FyZSBzaG91bGQgbWFzayBJUlEgIzMyIHJpZ2h0IGFmdGVyIENDTSBMb3ctUG93ZXIgbW9kZQogCSAqICAgIGlzIHNldCAoc2V0IGJpdHMgMC0xIG9mIENDTV9DTFBDUikuCiAJICovCi0JaW9tdXhjX2lycV9kZXNjID0gaXJxX3RvX2Rlc2MoMzIpOwotCWlteF9ncGNfaXJxX3VubWFzaygmaW9tdXhjX2lycV9kZXNjLT5pcnFfZGF0YSk7CisJaW14X2dwY19pcnFfdW5tYXNrKGlvbXV4Y19pcnFfZGF0YSk7CiAJd3JpdGVsX3JlbGF4ZWQodmFsLCBjY21fYmFzZSArIENMUENSKTsKLQlpbXhfZ3BjX2lycV9tYXNrKCZpb211eGNfaXJxX2Rlc2MtPmlycV9kYXRhKTsKKwlpbXhfZ3BjX2lycV9tYXNrKGlvbXV4Y19pcnFfZGF0YSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3BtLW1tcDIuYyBiL2FyY2gvYXJtL21hY2gtbW1wL3BtLW1tcDIuYwppbmRleCA0NjFhMTkxLi40M2IxYTUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9wbS1tbXAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvcG0tbW1wMi5jCkBAIC0yNywyMiArMjcsOCBAQAogCiBpbnQgbW1wMl9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbikKIHsKLQlpbnQgaXJxID0gZC0+aXJxOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJdW5zaWduZWQgbG9uZyBkYXRhID0gMDsKLQotCWlmICh1bmxpa2VseShpcnEgPj0gbnJfaXJxcykpIHsKLQkJcHJfZXJyKCJJUlEgbnVibWVycyBhcmUgb3V0IG9mIGJvdW5kYXJ5IVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChvbikgewotCQlpZiAoZGVzYy0+YWN0aW9uKQotCQkJZGVzYy0+YWN0aW9uLT5mbGFncyB8PSBJUlFGX05PX1NVU1BFTkQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGRlc2MtPmFjdGlvbikKLQkJCWRlc2MtPmFjdGlvbi0+ZmxhZ3MgJj0gfklSUUZfTk9fU1VTUEVORDsKLQl9CisJaW50IGlycSA9IGQtPmlycTsKIAogCS8qIGVuYWJsZSB3YWtldXAgc291cmNlcyAqLwogCXN3aXRjaCAoaXJxKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9wbS1weGE5MTAuYyBiL2FyY2gvYXJtL21hY2gtbW1wL3BtLXB4YTkxMC5jCmluZGV4IDQ4OTgxY2EuLjA0YzlkYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3BtLXB4YTkxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3BtLXB4YTkxMC5jCkBAIC0yNywyMiArMjcsOCBAQAogCiBpbnQgcHhhOTEwX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQogewotCWludCBpcnEgPSBkYXRhLT5pcnE7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoZGF0YS0+aXJxKTsKIAl1aW50MzJfdCBhd3Vjcm0gPSAwLCBhcGNyID0gMDsKLQotCWlmICh1bmxpa2VseShpcnEgPj0gbnJfaXJxcykpIHsKLQkJcHJfZXJyKCJJUlEgbnVibWVycyBhcmUgb3V0IG9mIGJvdW5kYXJ5IVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChvbikgewotCQlpZiAoZGVzYy0+YWN0aW9uKQotCQkJZGVzYy0+YWN0aW9uLT5mbGFncyB8PSBJUlFGX05PX1NVU1BFTkQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGRlc2MtPmFjdGlvbikKLQkJCWRlc2MtPmFjdGlvbi0+ZmxhZ3MgJj0gfklSUUZfTk9fU1VTUEVORDsKLQl9CisJaW50IGlycSA9IGRhdGEtPmlycTsKIAogCS8qIHNldHRpbmcgd2FrZXVwIHNvdXJjZXMgKi8KIAlzd2l0Y2ggKGlycSkgewpAQCAtMTE1LDkgKzEwMSwxMSBAQAogCQlpZiAoaXJxID49IElSUV9HUElPX1NUQVJUICYmIGlycSA8IElSUV9CT0FSRF9TVEFSVCkgewogCQkJYXd1Y3JtID0gTVBNVV9BV1VDUk1fV0FLRVVQKDIpOwogCQkJYXBjciB8PSBNUE1VX0FQQ1JfU0xQV1AyOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKKwkJCS8qIEZJWE1FOiBUaGlzIHNob3VsZCByZXR1cm4gYSBwcm9wZXIgZXJyb3IgY29kZSAhICovCiAJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBubyBkZWZpbmVkIHdha2UgdXAgc291cmNlIGlycTogJWRcbiIsCiAJCQkJaXJxKTsKKwkJfQogCX0KIAogCWlmIChvbikgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9hbXMtZGVsdGEtZmlxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Ftcy1kZWx0YS1maXEuYwppbmRleCBmMTJhMTJhLi5kMWYxMjA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Ftcy1kZWx0YS1maXEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Ftcy1kZWx0YS1maXEuYwpAQCAtNDQsMTMgKzQ0LDEwIEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBkZWZlcnJlZF9maXEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBpcnFfZGVzYyAqaXJxX2Rlc2M7Ci0Jc3RydWN0IGlycV9jaGlwICppcnFfY2hpcCA9IE5VTEw7CiAJaW50IGdwaW8sIGlycV9udW0sIGZpcV9jb3VudDsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmlycV9jaGlwOwogCi0JaXJxX2Rlc2MgPSBpcnFfdG9fZGVzYyhncGlvX3RvX2lycShBTVNfREVMVEFfR1BJT19QSU5fS0VZQlJEX0NMSykpOwotCWlmIChpcnFfZGVzYykKLQkJaXJxX2NoaXAgPSBpcnFfZGVzYy0+aXJxX2RhdGEuY2hpcDsKKwlpcnFfY2hpcCA9IGlycV9nZXRfY2hpcChncGlvX3RvX2lycShBTVNfREVMVEFfR1BJT19QSU5fS0VZQlJEX0NMSykpOwogCiAJLyoKIAkgKiBGb3IgZWFjaCBoYW5kbGVkIEdQSU8gaW50ZXJydXB0LCBrZWVwIGNhbGxpbmcgaXRzIGludGVycnVwdCBoYW5kbGVyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKaW5kZXggMGFmN2NhMC4uNmZiOTFmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZwpAQCAtMjEsNyArMjEsNiBAQAogCXNlbGVjdCBQTV9PUFAgaWYgUE0KIAlzZWxlY3QgUE1fUlVOVElNRSBpZiBDUFVfSURMRQogCXNlbGVjdCBTT0NfSEFTX09NQVAyX1NEUkMKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kgaWYgVVNCX1NVUFBPUlQKIAogY29uZmlnIEFSQ0hfT01BUDQKIAlib29sICJUSSBPTUFQNCIKQEAgLTQyLDcgKzQxLDYgQEAKIAlzZWxlY3QgUEwzMTBfRVJSQVRBXzcyNzkxNQogCXNlbGVjdCBQTV9PUFAgaWYgUE0KIAlzZWxlY3QgUE1fUlVOVElNRSBpZiBDUFVfSURMRQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSSBpZiBVU0JfU1VQUE9SVAogCXNlbGVjdCBBUk1fRVJSQVRBXzc1NDMyMgogCXNlbGVjdCBBUk1fRVJSQVRBXzc3NTQyMAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcKaW5kZXggMDVmYTUwNS4uM2I4Yzg3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZwpAQCAtMjQsMTcgKzI0LDIxIEBACiAKIGNvbmZpZyBBUkNIX0VNRVYyCiAJYm9vbCAiRW1tYSBNb2JpbGUgRVYyIgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfRU1fU1RJCiAKIGNvbmZpZyBBUkNIX1I3UzcyMTAwCiAJYm9vbCAiUlovQTFIIChSN1M3MjEwMCkiCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAKIGNvbmZpZyBBUkNIX1I4QTc3OTAKIAlib29sICJSLUNhciBIMiAoUjhBNzc5MDApIgogCXNlbGVjdCBSRU5FU0FTX0lSUUMKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCiBjb25maWcgQVJDSF9SOEE3NzkxCiAJYm9vbCAiUi1DYXIgTTIgKFI4QTc3OTEwKSIKIAlzZWxlY3QgUkVORVNBU19JUlFDCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAogY29tbWVudCAiUmVuZXNhcyBBUk0gU29DcyBCb2FyZCBUeXBlIgogCkBAIC02OCw2ICs3Miw4IEBACiAJc2VsZWN0IEFSTV9DUFVfU1VTUEVORCBpZiBQTSB8fCBDUFVfSURMRQogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgU0hfQ0xLX0NQRworCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAogY29uZmlnIEFSQ0hfU0g3M0EwCiAJYm9vbCAiU0gtTW9iaWxlIEFHNSAoUjhBNzNBMDApIgpAQCAtNzcsNiArODMsOCBAQAogCXNlbGVjdCBJMkMKIAlzZWxlY3QgU0hfQ0xLX0NQRwogCXNlbGVjdCBSRU5FU0FTX0lOVENfSVJRUElOCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQVJDSF9SOEE3M0E0CiAJYm9vbCAiUi1Nb2JpbGUgQVBFNiAoUjhBNzNBNDApIgpAQCAtODcsNiArOTUsOCBAQAogCXNlbGVjdCBSRU5FU0FTX0lSUUMKIAlzZWxlY3QgQVJDSF9IQVNfQ1BVRlJFUQogCXNlbGVjdCBBUkNIX0hBU19PUFAKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfVE1VCiAKIGNvbmZpZyBBUkNIX1I4QTc3NDAKIAlib29sICJSLU1vYmlsZSBBMSAoUjhBNzc0MDApIgpAQCAtOTUsNiArMTA1LDggQEAKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IFNIX0NMS19DUEcKIAlzZWxlY3QgUkVORVNBU19JTlRDX0lSUVBJTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAogY29uZmlnIEFSQ0hfUjhBNzc3OAogCWJvb2wgIlItQ2FyIE0xQSAoUjhBNzc3ODEpIgpAQCAtMTAyLDggKzExNCw3IEBACiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBTSF9DTEtfQ1BHCiAJc2VsZWN0IEFSTV9HSUMKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQVJDSF9SOEE3Nzc5CiAJYm9vbCAiUi1DYXIgSDEgKFI4QTc3NzkwKSIKQEAgLTExMSw5ICsxMjIsOCBAQAogCXNlbGVjdCBBUk1fR0lDCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBTSF9DTEtfQ1BHCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IFJFTkVTQVNfSU5UQ19JUlFQSU4KKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQVJDSF9SOEE3NzkwCiAJYm9vbCAiUi1DYXIgSDIgKFI4QTc3OTAwKSIKQEAgLTEyMyw2ICsxMzMsNyBAQAogCXNlbGVjdCBNSUdIVF9IQVZFX1BDSQogCXNlbGVjdCBTSF9DTEtfQ1BHCiAJc2VsZWN0IFJFTkVTQVNfSVJRQworCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAKIGNvbmZpZyBBUkNIX1I4QTc3OTEKIAlib29sICJSLUNhciBNMiAoUjhBNzc5MTApIgpAQCAtMTMyLDYgKzE0Myw3IEBACiAJc2VsZWN0IE1JR0hUX0hBVkVfUENJCiAJc2VsZWN0IFNIX0NMS19DUEcKIAlzZWxlY3QgUkVORVNBU19JUlFDCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAogY29uZmlnIEFSQ0hfRU1FVjIKIAlib29sICJFbW1hIE1vYmlsZSBFVjIiCkBAIC0xNDEsNiArMTUzLDcgQEAKIAlzZWxlY3QgTUlHSFRfSEFWRV9QQ0kKIAlzZWxlY3QgVVNFX09GCiAJc2VsZWN0IEFVVE9fWlJFTEFERFIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0VNX1NUSQogCiBjb25maWcgQVJDSF9SN1M3MjEwMAogCWJvb2wgIlJaL0ExSCAoUjdTNzIxMDApIgpAQCAtMTQ4LDYgKzE2MSw3IEBACiAJc2VsZWN0IEFSTV9HSUMKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IFNIX0NMS19DUEcKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAogY29tbWVudCAiUmVuZXNhcyBBUk0gU29DcyBCb2FyZCBUeXBlIgogCkBAIC0zMjEsMjQgKzMzNSw2IEBACiAJICB3YW50IHRvIHNlbGVjdCBhIEhaIHZhbHVlIHN1Y2ggYXMgMTI4IHRoYXQgY2FuIGV2ZW5seSBkaXZpZGUgUkNMSy4KIAkgIEEgSFogdmFsdWUgdGhhdCBkb2VzIG5vdCBkaXZpZGUgZXZlbmx5IG1heSBjYXVzZSB0aW1lciBkcmlmdC4KIAotY29uZmlnIFNIX1RJTUVSX0NNVAotCWJvb2wgIkNNVCB0aW1lciBkcml2ZXIiCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIHRoZSBDTVQgdGltZXIgZHJpdmVyLgotCi1jb25maWcgU0hfVElNRVJfVE1VCi0JYm9vbCAiVE1VIHRpbWVyIGRyaXZlciIKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgdGhlIFRNVSB0aW1lciBkcml2ZXIuCi0KLWNvbmZpZyBFTV9USU1FUl9TVEkKLQlib29sICJTVEkgdGltZXIgZHJpdmVyIgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiB0aGUgU1RJIHRpbWVyIGRyaXZlci4KLQogZW5kbWVudQogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcm1hZGlsbG84MDBldmEuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXJtYWRpbGxvODAwZXZhLmMKaW5kZXggOTM1MzNlMi4uOTMyMzg1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcm1hZGlsbG84MDBldmEuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFybWFkaWxsbzgwMGV2YS5jCkBAIC05ODgsMTQgKzk4OCwxMiBAQAogCS5jYXJkCQk9ICJGU0kyQS1XTTg5NzgiLAogCS5jb2RlYwkJPSAid204OTc4LjAtMDAxYSIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLAotCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfSTJTLAorCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkuY3B1X2RhaSA9IHsKIAkJLm5hbWUJPSAiZnNpYS1kYWkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyB8IFNORF9TT0NfREFJRk1UX0lCX05GLAogCX0sCiAJLmNvZGVjX2RhaSA9IHsKIAkJLm5hbWUJPSAid204OTc4LWhpZmkiLAotCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSB8IFNORF9TT0NfREFJRk1UX05CX05GLAogCQkuc3lzY2xrCT0gMTIyODgwMDAsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWJvY2t3LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWJvY2t3LmMKaW5kZXggYzQ3NTIyMC4uNzRjMjdkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1ib2Nrdy5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYm9ja3cuYwpAQCAtNDI5LDE0ICs0MjksMTIgQEAKIAkJLmNhcmQJCT0gIlNTSTU2LUFLNDY0MyIsCiAJCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMiIsCiAJCS5wbGF0Zm9ybQk9ICJyY2FyX3NvdW5kIiwKLQkJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0osCisJCS5kYWlmbXQJCT0gU05EX1NPQ19EQUlGTVRfTEVGVF9KIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLmNwdV9kYWkgPSB7CiAJCQkubmFtZQk9ICJyc25kLWRhaS4wIiwKLQkJCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAogCQl9LAogCQkuY29kZWNfZGFpID0gewogCQkJLm5hbWUJPSAiYWs0NjQyLWhpZmkiLAotCQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCQkuc3lzY2xrCT0gMTEyODk2MDAsCiAJCX0sCiAJfSwKQEAgLTQ0NiwxMCArNDQ0LDkgQEAKIAkJLmNhcmQJCT0gIlNTSTMtQUs0NTU0KHBsYXliYWNrKSIsCiAJCS5jb2RlYwkJPSAiYWs0NTU0LWFkYy1kYWMuMCIsCiAJCS5wbGF0Zm9ybQk9ICJyY2FyX3NvdW5kIiwKKwkJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfUklHSFRfSiwKIAkJLmNwdV9kYWkgPSB7CiAJCQkubmFtZQk9ICJyc25kLWRhaS4xIiwKLQkJCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX1JJR0hUX0osCiAJCX0sCiAJCS5jb2RlY19kYWkgPSB7CiAJCQkubmFtZQk9ICJhazQ1NTQtaGlmaSIsCkBAIC00NjEsMTAgKzQ1OCw5IEBACiAJCS5jYXJkCQk9ICJTU0k0LUFLNDU1NChjYXB0dXJlKSIsCiAJCS5jb2RlYwkJPSAiYWs0NTU0LWFkYy1kYWMuMCIsCiAJCS5wbGF0Zm9ybQk9ICJyY2FyX3NvdW5kIiwKKwkJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfTEVGVF9KLAogCQkuY3B1X2RhaSA9IHsKIAkJCS5uYW1lCT0gInJzbmQtZGFpLjIiLAotCQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0gfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfTEVGVF9KLAogCQl9LAogCQkuY29kZWNfZGFpID0gewogCQkJLm5hbWUJPSAiYWs0NTU0LWhpZmkiLApAQCAtNDc2LDEwICs0NzIsOSBAQAogCQkuY2FyZAkJPSAiU1NJNy1BSzQ1NTQocGxheWJhY2spIiwKIAkJLmNvZGVjCQk9ICJhazQ1NTQtYWRjLWRhYy4xIiwKIAkJLnBsYXRmb3JtCT0gInJjYXJfc291bmQiLAorCQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMgfCBTTkRfU09DX0RBSUZNVF9SSUdIVF9KLAogCQkuY3B1X2RhaSA9IHsKIAkJCS5uYW1lCT0gInJzbmQtZGFpLjMiLAotCQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0gfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfUklHSFRfSiwKIAkJfSwKIAkJLmNvZGVjX2RhaSA9IHsKIAkJCS5uYW1lCT0gImFrNDU1NC1oaWZpIiwKQEAgLTQ5MSwxMCArNDg2LDkgQEAKIAkJLmNhcmQJCT0gIlNTSTgtQUs0NTU0KGNhcHR1cmUpIiwKIAkJLmNvZGVjCQk9ICJhazQ1NTQtYWRjLWRhYy4xIiwKIAkJLnBsYXRmb3JtCT0gInJjYXJfc291bmQiLAorCQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMgfCBTTkRfU09DX0RBSUZNVF9MRUZUX0osCiAJCS5jcHVfZGFpID0gewogCQkJLm5hbWUJPSAicnNuZC1kYWkuNCIsCi0JCQkuZm10CT0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9MRUZUX0osCiAJCX0sCiAJCS5jb2RlY19kYWkgPSB7CiAJCQkubmFtZQk9ICJhazQ1NTQtaGlmaSIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWt6bTlnLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWt6bTlnLmMKaW5kZXggYmM0MGI4NS4uMDNkYzNhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rem05Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta3ptOWcuYwpAQCAtNTg5LDE0ICs1ODksMTIgQEAKIAkuY2FyZAkJPSAiRlNJMkEtQUs0NjQ4IiwKIAkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTIiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKLQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0xFRlRfSiwKKwkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0xFRlRfSiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLmNwdV9kYWkgPSB7CiAJCS5uYW1lCT0gImZzaWEtZGFpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZQk9ICJhazQ2NDItaGlmaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkuc3lzY2xrCT0gMTEyODk2MDAsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKaW5kZXggM2FiYTAzNy4uMGZmNGQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwpAQCAtNTA5LDkgKzUwOSw5IEBACiAJLmNhcmQJCT0gIkZTSTJCLUhETUkiLAogCS5jb2RlYwkJPSAic2gtbW9iaWxlLWhkbWkiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKKwkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJLmNwdV9kYWkgPSB7CiAJCS5uYW1lCT0gImZzaWItZGFpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0gfCBTTkRfU09DX0RBSUZNVF9JQl9ORiwKIAl9LAogCS5jb2RlY19kYWkgPSB7CiAJCS5uYW1lCT0gInNoX21vYmlsZV9oZG1pLWhpZmkiLApAQCAtOTA1LDE0ICs5MDUsMTIgQEAKIAkuY2FyZAkJPSAiRlNJMkEtQUs0NjQzIiwKIAkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTMiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKLQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0xFRlRfSiwKKwkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0xFRlRfSiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLmNwdV9kYWkgPSB7CiAJCS5uYW1lCT0gImZzaWEtZGFpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZQk9ICJhazQ2NDItaGlmaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkuc3lzY2xrCT0gMTEyODk2MDAsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKaW5kZXggYjEyMzJkOC4uNDkyNmJkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZwpAQCAtMTksNyArMTksNiBAQAogCXNlbGVjdCBSRVNFVF9DT05UUk9MTEVSCiAJc2VsZWN0IFNPQ19CVVMKIAlzZWxlY3QgU1BBUlNFX0lSUQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSSBpZiBVU0JfU1VQUE9SVAogCXNlbGVjdCBVU0JfVUxQSSBpZiBVU0JfUEhZCiAJc2VsZWN0IFVTQl9VTFBJX1ZJRVdQT1JUIGlmIFVTQl9QSFkKIAlzZWxlY3QgVVNFX09GCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUKaW5kZXggMGYzNjJiNi4uM2VjNzRhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwsIFUzMDAgbWFjaGluZS4KICMKIAotb2JqLXkJCTo9IGNvcmUubyB0aW1lci5vCitvYmoteQkJOj0gY29yZS5vCiBvYmotbQkJOj0KIG9iai1uCQk6PQogb2JqLQkJOj0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jIGIvYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMDhmZDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoKLSAqCi0gKiBhcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYwotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTVC1Fcmljc3NvbiBBQgotICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCi0gKiBUaW1lciBDT0ggOTAxIDMyOCwgcnVucyB0aGUgT1MgdGltZXIgaW50ZXJydXB0LgotICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgotICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkX2Nsb2NrLmg+Ci0KLS8qIEdlbmVyaWMgc3R1ZmYgKi8KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLS8qCi0gKiBBUFAgc2lkZSBzcGVjaWFsIHRpbWVyIHJlZ2lzdGVycwotICogVGhpcyB0aW1lciBjb250YWlucyBmb3VyIHRpbWVycyB3aGljaCBjYW4gZmlyZSBhbiBpbnRlcnJ1cHQgZWFjaC4KLSAqIE9TIChvcGVyYXRpbmcgc3lzdGVtKSB0aW1lciBAIDMyNzY4IEh6Ci0gKiBERCAoZGV2aWNlIGRyaXZlcikgdGltZXIgQCAxIGtIegotICogR1AxIChnZW5lcmFsIHB1cnBvc2UgMSkgdGltZXIgQCAxTUh6Ci0gKiBHUDIgKGdlbmVyYWwgcHVycG9zZSAyKSB0aW1lciBAIDFNSHoKLSAqLwotCi0vKiBSZXNldCBPUyBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ST1NUCQkJCQkoMHgwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ST1NUX1RJTUVSX1JFU0VUCQkJCSgweDAwMDAwMDAwKQotLyogRW5hYmxlIE9TIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VPU1QJCQkJCSgweDAwMDQpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VPU1RfVElNRVJfRU5BQkxFCQkJKDB4MDAwMDAwMDApCi0vKiBEaXNhYmxlIE9TIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RPU1QJCQkJCSgweDAwMDgpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RPU1RfVElNRVJfRElTQUJMRQkJCSgweDAwMDAwMDAwKQotLyogT1MgVGltZXIgTW9kZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TT1NUTQkJCQkJKDB4MDAwYykKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU09TVE1fTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NPU1RNX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAwMSkKLS8qIE9TIFRpbWVyIFN0YXR1cyBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTCQkJCQkoMHgwMDEwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX1RJTUVSX1NUQVRFX01BU0sJCQkoMHgwMDAwMDAwRikKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19USU1FUl9TVEFURV9JRExFCQkJKDB4MDAwMDAwMDEpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfVElNRVJfU1RBVEVfQUNUSVZFCQkJKDB4MDAwMDAwMDIpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfRU5BQkxFX0lORAkJCQkoMHgwMDAwMDAxMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19NT0RFX01BU0sJCQkJKDB4MDAwMDAwMjApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDIwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX0lSUV9FTkFCTEVEX0lORAkJCSgweDAwMDAwMDQwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX0lSUV9QRU5ESU5HX0lORAkJCSgweDAwMDAwMDgwKQotLyogT1MgVGltZXIgQ3VycmVudCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RDQwkJCQkJKDB4MDAxNCkKLS8qIE9TIFRpbWVyIFRlcm1pbmFsIENvdW50IFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFRDCQkJCQkoMHgwMDE4KQotLyogT1MgVGltZXIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RJRQkJCQkJKDB4MDAxYykKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUSUVfSVJRX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUSUVfSVJRX0VOQUJMRQkJCQkoMHgwMDAwMDAwMSkKLS8qIE9TIFRpbWVyIEludGVycnVwdCBBY2tub3dsZWRnZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RJQQkJCQkJKDB4MDAyMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUSUFfSVJRX0FDSwkJCQkoMHgwMDAwMDA4MCkKLQotLyogUmVzZXQgREQgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUkREVAkJCQkJKDB4MDA0MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUkREVF9USU1FUl9SRVNFVAkJCQkoMHgwMDAwMDAwMCkKLS8qIEVuYWJsZSBERCBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FRERUCQkJCQkoMHgwMDQ0KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FRERUX1RJTUVSX0VOQUJMRQkJCSgweDAwMDAwMDAwKQotLyogRGlzYWJsZSBERCBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERERUCQkJCQkoMHgwMDQ4KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERERUX1RJTUVSX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKLS8qIEREIFRpbWVyIE1vZGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0REVE0JCQkJCSgweDAwNGMpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NERFRNX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TRERUTV9NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMDEpCi0vKiBERCBUaW1lciBTdGF0dXMgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUUwkJCQkJKDB4MDA1MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19USU1FUl9TVEFURV9NQVNLCQkJKDB4MDAwMDAwMEYpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfVElNRVJfU1RBVEVfSURMRQkJCSgweDAwMDAwMDAxKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX1RJTUVSX1NUQVRFX0FDVElWRQkJCSgweDAwMDAwMDAyKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX0VOQUJMRV9JTkQJCQkJKDB4MDAwMDAwMTApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfTU9ERV9NQVNLCQkJCSgweDAwMDAwMDIwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAyMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19JUlFfRU5BQkxFRF9JTkQJCQkoMHgwMDAwMDA0MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19JUlFfUEVORElOR19JTkQJCQkoMHgwMDAwMDA4MCkKLS8qIEREIFRpbWVyIEN1cnJlbnQgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUQ0MJCQkJCSgweDAwNTQpCi0vKiBERCBUaW1lciBUZXJtaW5hbCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRUQwkJCQkJKDB4MDA1OCkKLS8qIEREIFRpbWVyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUSUUJCQkJCSgweDAwNWMpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVElFX0lSUV9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVElFX0lSUV9FTkFCTEUJCQkJKDB4MDAwMDAwMDEpCi0vKiBERCBUaW1lciBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUSUEJCQkJCSgweDAwNjApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVElBX0lSUV9BQ0sJCQkJKDB4MDAwMDAwODApCi0KLS8qIFJlc2V0IEdQMSBUaW1lciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9SR1BUMQkJCQkJKDB4MDA4MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUkdQVDFfVElNRVJfUkVTRVQJCQkoMHgwMDAwMDAwMCkKLS8qIEVuYWJsZSBHUDEgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUdQVDEJCQkJCSgweDAwODQpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VHUFQxX1RJTUVSX0VOQUJMRQkJCSgweDAwMDAwMDAwKQotLyogRGlzYWJsZSBHUDEgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREdQVDEJCQkJCSgweDAwODgpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RHUFQxX1RJTUVSX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKLS8qIEdQMSBUaW1lciBNb2RlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQxTQkJCQkJKDB4MDA4YykKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMU1fTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDAxKQotLyogR1AxIFRpbWVyIFN0YXR1cyBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxUwkJCQkJKDB4MDA5MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfVElNRVJfU1RBVEVfTUFTSwkJCSgweDAwMDAwMDBGKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19USU1FUl9TVEFURV9JRExFCQkJKDB4MDAwMDAwMDEpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX1RJTUVSX1NUQVRFX0FDVElWRQkJCSgweDAwMDAwMDAyKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19FTkFCTEVfSU5ECQkJCSgweDAwMDAwMDEwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19NT0RFX01BU0sJCQkJKDB4MDAwMDAwMjApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMjApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX0lSUV9FTkFCTEVEX0lORAkJCSgweDAwMDAwMDQwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19JUlFfUEVORElOR19JTkQJCQkoMHgwMDAwMDA4MCkKLS8qIEdQMSBUaW1lciBDdXJyZW50IENvdW50IFJlZ2lzdGVyIDMyYml0IChSLy0pICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFDQwkJCQkJKDB4MDA5NCkKLS8qIEdQMSBUaW1lciBUZXJtaW5hbCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxVEMJCQkJCSgweDAwOTgpCi0vKiBHUDEgVGltZXIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxSUUJCQkJCSgweDAwOWMpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRElTQUJMRQkJCSgweDAwMDAwMDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0VOQUJMRQkJCSgweDAwMDAwMDAxKQotLyogR1AxIFRpbWVyIEludGVycnVwdCBBY2tub3dsZWRnZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxSUEJCQkJCSgweDAwYTApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFJQV9JUlFfQUNLCQkJCSgweDAwMDAwMDgwKQotCi0vKiBSZXNldCBHUDIgVGltZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUkdQVDIJCQkJCSgweDAwYzApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JHUFQyX1RJTUVSX1JFU0VUCQkJKDB4MDAwMDAwMDApCi0vKiBFbmFibGUgR1AyIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VHUFQyCQkJCQkoMHgwMGM0KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FR1BUMl9USU1FUl9FTkFCTEUJCQkoMHgwMDAwMDAwMCkKLS8qIERpc2FibGUgR1AyIFRpbWVyIDMyYml0ICgtL1cpICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RHUFQyCQkJCQkoMHgwMGM4KQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ER1BUMl9USU1FUl9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCi0vKiBHUDIgVGltZXIgTW9kZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMk0JCQkJCSgweDAwY2MpCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQyTV9NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDJNX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAwMSkKLS8qIEdQMiBUaW1lciBTdGF0dXMgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlMJCQkJCSgweDAwZDApCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX1RJTUVSX1NUQVRFX01BU0sJCQkoMHgwMDAwMDAwRikKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfVElNRVJfU1RBVEVfSURMRQkJCSgweDAwMDAwMDAxKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19USU1FUl9TVEFURV9BQ1RJVkUJCQkoMHgwMDAwMDAwMikKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfRU5BQkxFX0lORAkJCQkoMHgwMDAwMDAxMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfTU9ERV9NQVNLCQkJCSgweDAwMDAwMDIwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDIwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19JUlFfRU5BQkxFRF9JTkQJCQkoMHgwMDAwMDA0MCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfSVJRX1BFTkRJTkdfSU5ECQkJKDB4MDAwMDAwODApCi0vKiBHUDIgVGltZXIgQ3VycmVudCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLwotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyQ0MJCQkJCSgweDAwZDQpCi0vKiBHUDIgVGltZXIgVGVybWluYWwgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlRDCQkJCQkoMHgwMGQ4KQotLyogR1AyIFRpbWVyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMklFCQkJCQkoMHgwMGRjKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQySUVfSVJRX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMklFX0lSUV9FTkFCTEUJCQkoMHgwMDAwMDAwMSkKLS8qIEdQMiBUaW1lciBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KLSNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMklBCQkJCQkoMHgwMGUwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQySUFfSVJRX0FDSwkJCQkoMHgwMDAwMDA4MCkKLQotLyogQ2xvY2sgcmVxdWVzdCBjb250cm9sIHJlZ2lzdGVyIC0gYWxsIGZvdXIgdGltZXJzICovCi0jZGVmaW5lIFUzMDBfVElNRVJfQVBQX0NSQwkJCQkJKDB4MTAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9DUkNfQ0xPQ0tfUkVRVUVTVF9FTkFCTEUJCQkoMHgwMDAwMDAwMSkKLQotc3RhdGljIHZvaWQgX19pb21lbSAqdTMwMF90aW1lcl9iYXNlOwotCi1zdHJ1Y3QgdTMwMF9jbG9ja2V2ZW50X2RhdGEgewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgY2V2ZDsKLQl1bnNpZ25lZCB0aWNrc19wZXJfamlmZnk7Ci19OwotCi0vKgotICogVGhlIHUzMDBfc2V0X21vZGUoKSBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIGZpcnN0LCBpZiB3ZQotICogaGF2ZSBvbmVzaG90IHRpbWVyIGFjdGl2ZSwgdGhlIG9uZXNob3Qgc2NoZWR1bGluZyBmdW5jdGlvbgotICogdTMwMF9zZXRfbmV4dF9ldmVudCgpIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlci4KLSAqLwotc3RhdGljIHZvaWQgdTMwMF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKLQkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCXN0cnVjdCB1MzAwX2Nsb2NrZXZlbnRfZGF0YSAqY2V2ZGF0YSA9Ci0JCWNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCB1MzAwX2Nsb2NrZXZlbnRfZGF0YSwgY2V2ZCk7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgotCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gR1BUMSAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9ESVNBQkxFLAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKLQkJLyogRGlzYWJsZSBHUDEgd2hpbGUgd2UncmUgcmVwcm9ncmFtbWluZyBpdC4gKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RHUFQxX1RJTUVSX0RJU0FCTEUsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ER1BUMSk7Ci0JCS8qCi0JCSAqIFNldCB0aGUgcGVyaW9kaWMgbW9kZSB0byBhIGNlcnRhaW4gbnVtYmVyIG9mIHRpY2tzIHBlcgotCQkgKiBqaWZmeS4KLQkJICovCi0JCXdyaXRlbChjZXZkYXRhLT50aWNrc19wZXJfamlmZnksCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxVEMpOwotCQkvKgotCQkgKiBTZXQgY29udGludW91cyBtb2RlLCBzbyB0aGUgdGltZXIga2VlcHMgdHJpZ2dlcmluZwotCQkgKiBpbnRlcnJ1cHRzLgotCQkgKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1NHUFQxTV9NT0RFX0NPTlRJTlVPVVMsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9TR1BUMU0pOwotCQkvKiBFbmFibGUgdGltZXIgaW50ZXJydXB0cyAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9FTkFCTEUsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOwotCQkvKiBUaGVuIGVuYWJsZSB0aGUgT1MgdGltZXIgYWdhaW4gKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0VHUFQxX1RJTUVSX0VOQUJMRSwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0VHUFQxKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCQkvKiBKdXN0IGJyZWFrOyBoZXJlPyAqLwotCQkvKgotCQkgKiBUaGUgYWN0dWFsIGV2ZW50IHdpbGwgYmUgcHJvZ3JhbW1lZCBieSB0aGUgbmV4dCBldmVudCBob29rLAotCQkgKiBzbyB3ZSBqdXN0IHNldCBhIGR1bW15IHZhbHVlIHNvbWV3aGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotCQkgKiB1bml2ZXJzZSBoZXJlLgotCQkgKi8KLQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIEdQVDEgKi8KLQkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRElTQUJMRSwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7Ci0JCS8qIERpc2FibGUgR1AxIHdoaWxlIHdlJ3JlIHJlcHJvZ3JhbW1pbmcgaXQuICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ER1BUMV9USU1FUl9ESVNBQkxFLAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfREdQVDEpOwotCQkvKgotCQkgKiBFeHBpcmUgZmFyIGluIHRoZSBmdXR1cmUsIHUzMDBfc2V0X25leHRfZXZlbnQoKSB3aWxsIGJlCi0JCSAqIGNhbGxlZCBzb29uLi4uCi0JCSAqLwotCQl3cml0ZWwoMHhGRkZGRkZGRiwgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMVRDKTsKLQkJLyogV2UgcnVuIG9uZSBzaG90IHBlciB0aWNrIGhlcmUhICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9TR1BUMU1fTU9ERV9PTkVfU0hPVCwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1NHUFQxTSk7Ci0JCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGlzIHRpbWVyICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0VOQUJMRSwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7Ci0JCS8qIEVuYWJsZSB0aW1lciAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfRUdQVDFfVElNRVJfRU5BQkxFLAotCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfRUdQVDEpOwotCQlicmVhazsKLQljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gR1AxICovCi0JCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUsCi0JCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOwotCQkvKiBEaXNhYmxlIEdQMSAqLwotCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfREdQVDFfVElNRVJfRElTQUJMRSwKLQkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RHUFQxKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6Ci0JCS8qIElnbm9yZSB0aGlzIGNhbGwgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogVGhlIGFwcCB0aW1lciBpbiBvbmUgc2hvdCBtb2RlIG9idmlvdXNseSBoYXMgdG8gYmUgcmVwcm9ncmFtbWVkCi0gKiBpbiBFWEFDVExZIHRoaXMgc2VxdWVuY2UgdG8gd29yayBwcm9wZXJseS4gRG8gTk9UIHRyeSB0byBlLmcuIHJlcGxhY2UKLSAqIHRoZSBpbnRlcnJ1cHQgZGlzYWJsZSArIHRpbWVyIGRpc2FibGUgY29tbWFuZHMgd2l0aCBhIHJlc2V0IGNvbW1hbmQsCi0gKiBpdCB3aWxsIGZhaWwgbWlzZXJhYmx5LiBBcHBhcmVudGx5IChhbmQgSSBmb3VuZCB0aGlzIHRoZSBoYXJkIHdheSkKLSAqIHRoZSB0aW1lciBpcyB2ZXJ5IHNlbnNpdGl2ZSB0byB0aGUgaW5zdHJ1Y3Rpb24gb3JkZXIsIHRob3VnaCB5b3UgZG9uJ3QKLSAqIGdldCB0aGF0IGltcHJlc3Npb24gZnJvbSB0aGUgZGF0YSBzaGVldC4KLSAqLwotc3RhdGljIGludCB1MzAwX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAotCQkJICAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLQotewotCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiBHUFQxICovCi0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRElTQUJMRSwKLQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKLQkvKiBEaXNhYmxlIEdQMSB3aGlsZSB3ZSdyZSByZXByb2dyYW1taW5nIGl0LiAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ER1BUMV9USU1FUl9ESVNBQkxFLAotCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ER1BUMSk7Ci0JLyogUmVzZXQgdGhlIEdlbmVyYWwgUHVycG9zZSB0aW1lciAxLiAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9SR1BUMV9USU1FUl9SRVNFVCwKLQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfUkdQVDEpOwotCS8qIElSUSBpbiBuICogY3ljbGVzICovCi0Jd3JpdGVsKGN5Y2xlcywgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMVRDKTsKLQkvKgotCSAqIFdlIHJ1biBvbmUgc2hvdCBwZXIgdGljayBoZXJlISAoVGhpcyBpcyBuZWNlc3NhcnkgdG8gcmVjb25maWd1cmUsCi0JICogdGhlIHRpbWVyIHdpbGwgdGlsdCBpZiB5b3UgZG9uJ3QhKQotCSAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9TR1BUMU1fTU9ERV9PTkVfU0hPVCwKLQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfU0dQVDFNKTsKLQkvKiBFbmFibGUgdGltZXIgaW50ZXJydXB0cyAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0VOQUJMRSwKLQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKLQkvKiBUaGVuIGVuYWJsZSB0aGUgT1MgdGltZXIgYWdhaW4gKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfRUdQVDFfVElNRVJfRU5BQkxFLAotCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9FR1BUMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdTMwMF9jbG9ja2V2ZW50X2RhdGEgdTMwMF9jbG9ja2V2ZW50X2RhdGEgPSB7Ci0JLyogVXNlIGdlbmVyYWwgcHVycG9zZSB0aW1lciAxIGFzIGNsb2NrIGV2ZW50ICovCi0JLmNldmQgPSB7Ci0JCS5uYW1lCQk9ICJHUFQxIiwKLQkJLyogUmVhc29uYWJseSBmYXN0IGFuZCBhY2N1cmF0ZSBjbG9jayBldmVudCAqLwotCQkucmF0aW5nCQk9IDMwMCwKLQkJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfAotCQkJQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKLQkJLnNldF9uZXh0X2V2ZW50CT0gdTMwMF9zZXRfbmV4dF9ldmVudCwKLQkJLnNldF9tb2RlCT0gdTMwMF9zZXRfbW9kZSwKLQl9LAotfTsKLQotLyogQ2xvY2sgZXZlbnQgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCB1MzAwX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gJnUzMDBfY2xvY2tldmVudF9kYXRhLmNldmQ7Ci0JLyogQUNLL0NsZWFyIHRpbWVyIElSUSBmb3IgdGhlIEFQUCBHUFQxIFRpbWVyICovCi0KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlBX0lSUV9BQ0ssCi0JCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJQSk7Ci0JZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiB1MzAwX3RpbWVyX2lycSA9IHsKLQkubmFtZQkJPSAiVTMwMCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEwsCi0JLmhhbmRsZXIJPSB1MzAwX3RpbWVyX2ludGVycnVwdCwKLX07Ci0KLS8qCi0gKiBPdmVycmlkZSB0aGUgZ2xvYmFsIHdlYWsgc2NoZWRfY2xvY2sgc3ltYm9sIHdpdGggdGhpcwotICogbG9jYWwgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlcyB0aGUgY2xvY2tzb3VyY2UgdG8gZ2V0IHNvbWUKLSAqIGJldHRlciByZXNvbHV0aW9uIHdoZW4gc2NoZWR1bGluZyB0aGUga2VybmVsLiBXZSBhY2NlcHQgdGhhdAotICogdGhpcyB3cmFwcyBhcm91bmQgZm9yIG5vdywgc2luY2UgaXQgaXMganVzdCBhIHJlbGF0aXZlIHRpbWUKLSAqIHN0YW1wLiAoSW5zcGlyZWQgYnkgT01BUCBpbXBsZW1lbnRhdGlvbi4pCi0gKi8KLQotc3RhdGljIHU2NCBub3RyYWNlIHUzMDBfcmVhZF9zY2hlZF9jbG9jayh2b2lkKQotewotCXJldHVybiByZWFkbCh1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQyQ0MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB1MzAwX3JlYWRfY3VycmVudF90aW1lcih2b2lkKQotewotCXJldHVybiByZWFkbCh1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQyQ0MpOwotfQotCi1zdGF0aWMgc3RydWN0IGRlbGF5X3RpbWVyIHUzMDBfZGVsYXlfdGltZXI7Ci0KLS8qCi0gKiBUaGlzIHNldHMgdXAgdGhlIHN5c3RlbSB0aW1lcnMsIGNsb2NrIHNvdXJjZSBhbmQgY2xvY2sgZXZlbnQuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCB1MzAwX3RpbWVyX2luaXRfb2Yoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCXN0cnVjdCBjbGsgKmNsazsKLQl1bnNpZ25lZCBsb25nIHJhdGU7Ci0KLQl1MzAwX3RpbWVyX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7Ci0JaWYgKCF1MzAwX3RpbWVyX2Jhc2UpCi0JCXBhbmljKCJjb3VsZCBub3QgaW9yZW1hcCBzeXN0ZW0gdGltZXJcbiIpOwotCi0JLyogR2V0IHRoZSBJUlEgZm9yIHRoZSBHUDEgdGltZXIgKi8KLQlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMik7Ci0JaWYgKCFpcnEpCi0JCXBhbmljKCJubyBJUlEgZm9yIHN5c3RlbSB0aW1lclxuIik7Ci0KLQlwcl9pbmZvKCJVMzAwIEdQMSB0aW1lciBAIGJhc2U6ICVwLCBJUlE6ICV1XG4iLCB1MzAwX3RpbWVyX2Jhc2UsIGlycSk7Ci0KLQkvKiBDbG9jayB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKLQlCVUdfT04oSVNfRVJSKGNsaykpOwotCWNsa19wcmVwYXJlX2VuYWJsZShjbGspOwotCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKLQotCXUzMDBfY2xvY2tldmVudF9kYXRhLnRpY2tzX3Blcl9qaWZmeSA9IERJVl9ST1VORF9DTE9TRVNUKHJhdGUsIEhaKTsKLQotCXNjaGVkX2Nsb2NrX3JlZ2lzdGVyKHUzMDBfcmVhZF9zY2hlZF9jbG9jaywgMzIsIHJhdGUpOwotCi0JdTMwMF9kZWxheV90aW1lci5yZWFkX2N1cnJlbnRfdGltZXIgPSAmdTMwMF9yZWFkX2N1cnJlbnRfdGltZXI7Ci0JdTMwMF9kZWxheV90aW1lci5mcmVxID0gcmF0ZTsKLQlyZWdpc3Rlcl9jdXJyZW50X3RpbWVyX2RlbGF5KCZ1MzAwX2RlbGF5X3RpbWVyKTsKLQotCS8qCi0JICogRGlzYWJsZSB0aGUgIk9TIiBhbmQgIkREIiB0aW1lcnMgLSB0aGVzZSBhcmUgZGVzaWduZWQgZm9yIFN5bWJpYW4hCi0JICogRXhhbXBsZSB1c2FnZSBpbiBjbmgxNjAxNTc4IGNwdSBzdWJzeXN0ZW0gcGRfdGltZXJfYXBwLmMKLQkgKi8KLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfQ1JDX0NMT0NLX1JFUVVFU1RfRU5BQkxFLAotCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9DUkMpOwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ST1NUX1RJTUVSX1JFU0VULAotCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ST1NUKTsKLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfRE9TVF9USU1FUl9ESVNBQkxFLAotCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ET1NUKTsKLQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUkREVF9USU1FUl9SRVNFVCwKLQkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfUkREVCk7Ci0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RERFRfVElNRVJfRElTQUJMRSwKLQkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfREREVCk7Ci0KLQkvKiBSZXNldCB0aGUgR2VuZXJhbCBQdXJwb3NlIHRpbWVyIDEuICovCi0Jd3JpdGVsKFUzMDBfVElNRVJfQVBQX1JHUFQxX1RJTUVSX1JFU0VULAotCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9SR1BUMSk7Ci0KLQkvKiBTZXQgdXAgdGhlIElSUSBoYW5kbGVyICovCi0Jc2V0dXBfaXJxKGlycSwgJnUzMDBfdGltZXJfaXJxKTsKLQotCS8qIFJlc2V0IHRoZSBHZW5lcmFsIFB1cnBvc2UgdGltZXIgMiAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9SR1BUMl9USU1FUl9SRVNFVCwKLQkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfUkdQVDIpOwotCS8qIFNldCB0aGlzIHRpbWVyIHRvIHJ1biBhcm91bmQgZm9yZXZlciAqLwotCXdyaXRlbCgweEZGRkZGRkZGVSwgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMlRDKTsKLQkvKiBTZXQgY29udGludW91cyBtb2RlIHNvIGl0IHdyYXBzIGFyb3VuZCAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9TR1BUMk1fTU9ERV9DT05USU5VT1VTLAotCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9TR1BUMk0pOwotCS8qIERpc2FibGUgdGltZXIgaW50ZXJydXB0cyAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQySUVfSVJRX0RJU0FCTEUsCi0JCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDJJRSk7Ci0JLyogVGhlbiBlbmFibGUgdGhlIEdQMiB0aW1lciB0byB1c2UgYXMgYSBmcmVlIHJ1bm5pbmcgdXMgY291bnRlciAqLwotCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9FR1BUMl9USU1FUl9FTkFCTEUsCi0JCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0VHUFQyKTsKLQotCS8qIFVzZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgMiBhcyBjbG9jayBzb3VyY2UgKi8KLQlpZiAoY2xvY2tzb3VyY2VfbW1pb19pbml0KHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDJDQywKLQkJCSJHUFQyIiwgcmF0ZSwgMzAwLCAzMiwgY2xvY2tzb3VyY2VfbW1pb19yZWFkbF91cCkpCi0JCXByX2VycigidGltZXI6IGZhaWxlZCB0byBpbml0aWFsaXplIFUzMDAgY2xvY2sgc291cmNlXG4iKTsKLQotCS8qIENvbmZpZ3VyZSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrZXZlbnQgKi8KLQljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKCZ1MzAwX2Nsb2NrZXZlbnRfZGF0YS5jZXZkLCByYXRlLAotCQkJCQkxLCAweGZmZmZmZmZmKTsKLQotCS8qCi0JICogVE9ETzogaW5pdCBhbmQgcmVnaXN0ZXIgdGhlIHJlc3Qgb2YgdGhlIHRpbWVycyB0b28sIHRoZXkgY2FuIGJlCi0JICogdXNlZCBieSBocnRpbWVycyEKLQkgKi8KLX0KLQotQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRSh1MzAwX3RpbWVyLCAic3Rlcmljc3Nvbix1MzAwLWFwcHRpbWVyIiwKLQkJICAgICAgIHUzMDBfdGltZXJfaW5pdF9vZik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXp5bnEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtenlucS9LY29uZmlnCmluZGV4IDZiMDQyNjAuLmYwM2U3NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtenlucS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtenlucS9LY29uZmlnCkBAIC0yLDYgKzIsOCBAQAogCWJvb2wgIlhpbGlueCBaeW5xIEFSTSBDb3J0ZXggQTkgUGxhdGZvcm0iIGlmIEFSQ0hfTVVMVElfVjcKIAlzZWxlY3QgQVJNX0FNQkEKIAlzZWxlY3QgQVJNX0dJQworCXNlbGVjdCBBUkNIX0hBU19DUFVGUkVRCisJc2VsZWN0IEFSQ0hfSEFTX09QUAogCXNlbGVjdCBDT01NT05fQ0xLCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCkBAIC0xMyw2ICsxNSw2IEBACiAJc2VsZWN0IEhBVkVfU01QCiAJc2VsZWN0IFNQQVJTRV9JUlEKIAlzZWxlY3QgQ0FERU5DRV9UVENfVElNRVIKLQlzZWxlY3QgQVJNX0dMT0JBTF9USU1FUgorCXNlbGVjdCBBUk1fR0xPQkFMX1RJTUVSIGlmICFDUFVfRlJFUQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFhpbGlueCBaeW5xIEFSTSBDb3J0ZXggQTkgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtenlucS9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtenlucS9jb21tb24uYwppbmRleCA4YzA5YTgzLi5hMzliZThlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXp5bnEvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC16eW5xL2NvbW1vbi5jCkBAIC02NCw2ICs2NCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCB6eW5xX2luaXRfbWFjaGluZSh2b2lkKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaW5mbyBkZXZpbmZvID0geyAubmFtZSA9ICJjcHVmcmVxLWNwdTAiLCB9OworCiAJLyoKIAkgKiA2NEtCIHdheSBzaXplLCA4LXdheSBhc3NvY2lhdGl2aXR5LCBwYXJpdHkgZGlzYWJsZWQKIAkgKi8KQEAgLTcyLDYgKzc0LDcgQEAKIAlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZSwgTlVMTCwgTlVMTCk7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnp5bnFfY3B1aWRsZV9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9mdWxsKCZkZXZpbmZvKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHp5bnFfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnCmluZGV4IGM2ZTJmNWIuLjgwMzNiOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZworKysgYi9hcmNoL2FybTY0L0tjb25maWcKQEAgLTE2LDYgKzE2LDcgQEAKIAlzZWxlY3QgRENBQ0hFX1dPUkRfQUNDRVNTCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QgaWYgU01QCisJc2VsZWN0IEdFTkVSSUNfQ1BVX0FVVE9QUk9CRQogCXNlbGVjdCBHRU5FUklDX0lPTUFQCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1BST0JFCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKQEAgLTI2LDYgKzI3LDcgQEAKIAlzZWxlY3QgR0VORVJJQ19USU1FX1ZTWVNDQUxMCiAJc2VsZWN0IEhBUkRJUlFTX1NXX1JFU0VORAogCXNlbGVjdCBIQVZFX0FSQ0hfSlVNUF9MQUJFTAorCXNlbGVjdCBIQVZFX0FSQ0hfS0dEQgogCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCiAJc2VsZWN0IEhBVkVfREVCVUdfQlVHVkVSQk9TRQogCXNlbGVjdCBIQVZFX0RFQlVHX0tNRU1MRUFLCkBAIC0zOCw2ICs0MCw4IEBACiAJc2VsZWN0IEhBVkVfTUVNQkxPQ0sKIAlzZWxlY3QgSEFWRV9QQVRBX1BMQVRGT1JNCiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKKwlzZWxlY3QgSEFWRV9QRVJGX1JFR1MKKwlzZWxlY3QgSEFWRV9QRVJGX1VTRVJfU1RBQ0tfRFVNUAogCXNlbGVjdCBJUlFfRE9NQUlOCiAJc2VsZWN0IE1PRFVMRVNfVVNFX0VMRl9SRUxBCiAJc2VsZWN0IE5PX0JPT1RNRU0KQEAgLTczLDcgKzc3LDcgQEAKIGNvbmZpZyBUUkFDRV9JUlFGTEFHU19TVVBQT1JUCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCiAJZGVmX2Jvb2wgeQogCiBjb25maWcgR0VORVJJQ19IV0VJR0hUCkBAIC04NSw3ICs4OSw3IEBACiBjb25maWcgR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBaT05FX0RNQTMyCitjb25maWcgWk9ORV9ETUEKIAlkZWZfYm9vbCB5CiAKIGNvbmZpZyBBUkNIX0RNQV9BRERSX1RfNjRCSVQKQEAgLTE2NCw2ICsxNjgsMjIgQEAKIAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KIAorY29uZmlnIFNDSEVEX01DCisJYm9vbCAiTXVsdGktY29yZSBzY2hlZHVsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNNUAorCWhlbHAKKwkgIE11bHRpLWNvcmUgc2NoZWR1bGVyIHN1cHBvcnQgaW1wcm92ZXMgdGhlIENQVSBzY2hlZHVsZXIncyBkZWNpc2lvbgorCSAgbWFraW5nIHdoZW4gZGVhbGluZyB3aXRoIG11bHRpLWNvcmUgQ1BVIGNoaXBzIGF0IGEgY29zdCBvZiBzbGlnaHRseQorCSAgaW5jcmVhc2VkIG92ZXJoZWFkIGluIHNvbWUgcGxhY2VzLiBJZiB1bnN1cmUgc2F5IE4gaGVyZS4KKworY29uZmlnIFNDSEVEX1NNVAorCWJvb2wgIlNNVCBzY2hlZHVsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNNUAorCWhlbHAKKwkgIEltcHJvdmVzIHRoZSBDUFUgc2NoZWR1bGVyJ3MgZGVjaXNpb24gbWFraW5nIHdoZW4gZGVhbGluZyB3aXRoCisJICBNdWx0aVRocmVhZGluZyBhdCBhIGNvc3Qgb2Ygc2xpZ2h0bHkgaW5jcmVhc2VkIG92ZXJoZWFkIGluIHNvbWUKKwkgIHBsYWNlcy4gSWYgdW5zdXJlIHNheSBOIGhlcmUuCisKIGNvbmZpZyBOUl9DUFVTCiAJaW50ICJNYXhpbXVtIG51bWJlciBvZiBDUFVzICgyLTMyKSIKIAlyYW5nZSAyIDMyCkBAIC0zMDEsMTAgKzMyMSw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9jcHVpZGxlL0tjb25maWciCiAKLWVuZG1lbnUKLQotbWVudSAiUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIgotCiBzb3VyY2UgImtlcm5lbC9wb3dlci9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9hcG0tc3Rvcm0uZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtLXN0b3JtLmR0c2kKaW5kZXggZDM3ZDczNi4uOTNmNGIyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9hcG0tc3Rvcm0uZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS1zdG9ybS5kdHNpCkBAIC0xNzYsNiArMTc2LDg3IEBACiAJCQkJcmVnLW5hbWVzID0gImNzci1yZWciOwogCQkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJldGg4Y2xrIjsKIAkJCX07CisKKwkJCXNhdGFwaHkxY2xrOiBzYXRhcGh5MWNsa0AxZjIxYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtZGV2aWNlLWNsb2NrIjsKKwkJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkJY2xvY2tzID0gPCZzb2NwbGxkaXYyIDA+OworCQkJCXJlZyA9IDwweDAgMHgxZjIxYzAwMCAweDAgMHgxMDAwPjsKKwkJCQlyZWctbmFtZXMgPSAiY3NyLXJlZyI7CisJCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInNhdGFwaHkxY2xrIjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCWNzci1vZmZzZXQgPSA8MHg0PjsKKwkJCQljc3ItbWFzayA9IDwweDAwPjsKKwkJCQllbmFibGUtb2Zmc2V0ID0gPDB4MD47CisJCQkJZW5hYmxlLW1hc2sgPSA8MHgwNj47CisJCQl9OworCisJCQlzYXRhcGh5MmNsazogc2F0YXBoeTFjbGtAMWYyMmMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWRldmljZS1jbG9jayI7CisJCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJCWNsb2NrcyA9IDwmc29jcGxsZGl2MiAwPjsKKwkJCQlyZWcgPSA8MHgwIDB4MWYyMmMwMDAgMHgwIDB4MTAwMD47CisJCQkJcmVnLW5hbWVzID0gImNzci1yZWciOworCQkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzYXRhcGh5MmNsayI7CisJCQkJc3RhdHVzID0gIm9rIjsKKwkJCQljc3Itb2Zmc2V0ID0gPDB4ND47CisJCQkJY3NyLW1hc2sgPSA8MHgzYT47CisJCQkJZW5hYmxlLW9mZnNldCA9IDwweDA+OworCQkJCWVuYWJsZS1tYXNrID0gPDB4MDY+OworCQkJfTsKKworCQkJc2F0YXBoeTNjbGs6IHNhdGFwaHkxY2xrQDFmMjNjMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1kZXZpY2UtY2xvY2siOworCQkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCQljbG9ja3MgPSA8JnNvY3BsbGRpdjIgMD47CisJCQkJcmVnID0gPDB4MCAweDFmMjNjMDAwIDB4MCAweDEwMDA+OworCQkJCXJlZy1uYW1lcyA9ICJjc3ItcmVnIjsKKwkJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2F0YXBoeTNjbGsiOworCQkJCXN0YXR1cyA9ICJvayI7CisJCQkJY3NyLW9mZnNldCA9IDwweDQ+OworCQkJCWNzci1tYXNrID0gPDB4M2E+OworCQkJCWVuYWJsZS1vZmZzZXQgPSA8MHgwPjsKKwkJCQllbmFibGUtbWFzayA9IDwweDA2PjsKKwkJCX07CisKKwkJCXNhdGEwMWNsazogc2F0YTAxY2xrQDFmMjFjMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1kZXZpY2UtY2xvY2siOworCQkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCQljbG9ja3MgPSA8JnNvY3BsbGRpdjIgMD47CisJCQkJcmVnID0gPDB4MCAweDFmMjFjMDAwIDB4MCAweDEwMDA+OworCQkJCXJlZy1uYW1lcyA9ICJjc3ItcmVnIjsKKwkJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2F0YTAxY2xrIjsKKwkJCQljc3Itb2Zmc2V0ID0gPDB4ND47CisJCQkJY3NyLW1hc2sgPSA8MHgwNT47CisJCQkJZW5hYmxlLW9mZnNldCA9IDwweDA+OworCQkJCWVuYWJsZS1tYXNrID0gPDB4Mzk+OworCQkJfTsKKworCQkJc2F0YTIzY2xrOiBzYXRhMjNjbGtAMWYyMmMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWRldmljZS1jbG9jayI7CisJCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJCWNsb2NrcyA9IDwmc29jcGxsZGl2MiAwPjsKKwkJCQlyZWcgPSA8MHgwIDB4MWYyMmMwMDAgMHgwIDB4MTAwMD47CisJCQkJcmVnLW5hbWVzID0gImNzci1yZWciOworCQkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzYXRhMjNjbGsiOworCQkJCWNzci1vZmZzZXQgPSA8MHg0PjsKKwkJCQljc3ItbWFzayA9IDwweDA1PjsKKwkJCQllbmFibGUtb2Zmc2V0ID0gPDB4MD47CisJCQkJZW5hYmxlLW1hc2sgPSA8MHgzOT47CisJCQl9OworCisJCQlzYXRhNDVjbGs6IHNhdGE0NWNsa0AxZjIzYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtZGV2aWNlLWNsb2NrIjsKKwkJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkJY2xvY2tzID0gPCZzb2NwbGxkaXYyIDA+OworCQkJCXJlZyA9IDwweDAgMHgxZjIzYzAwMCAweDAgMHgxMDAwPjsKKwkJCQlyZWctbmFtZXMgPSAiY3NyLXJlZyI7CisJCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInNhdGE0NWNsayI7CisJCQkJY3NyLW9mZnNldCA9IDwweDQ+OworCQkJCWNzci1tYXNrID0gPDB4MDU+OworCQkJCWVuYWJsZS1vZmZzZXQgPSA8MHgwPjsKKwkJCQllbmFibGUtbWFzayA9IDwweDM5PjsKKwkJCX07CiAJCX07CiAKIAkJc2VyaWFsMDogc2VyaWFsQDFjMDIwMDAwIHsKQEAgLTE4Nyw1ICsyNjgsNzYgQEAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDRjIDB4ND47CiAJCX07CisKKwkJcGh5MTogcGh5QDFmMjFhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyMWEwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCQljbG9ja3MgPSA8JnNhdGFwaHkxY2xrIDA+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCWFwbSx0eC1ib29zdC1nYWluID0gPDMwIDMwIDMwIDMwIDMwIDMwPjsKKwkJCWFwbSx0eC1leWUtdHVuaW5nID0gPDIgMTAgMTAgMiAxMCAxMD47CisJCX07CisKKwkJcGh5MjogcGh5QDFmMjJhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyMmEwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCQljbG9ja3MgPSA8JnNhdGFwaHkyY2xrIDA+OworCQkJc3RhdHVzID0gIm9rIjsKKwkJCWFwbSx0eC1ib29zdC1nYWluID0gPDMwIDMwIDMwIDMwIDMwIDMwPjsKKwkJCWFwbSx0eC1leWUtdHVuaW5nID0gPDEgMTAgMTAgMiAxMCAxMD47CisJCX07CisKKwkJcGh5MzogcGh5QDFmMjNhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXBoeSI7CisJCQlyZWcgPSA8MHgwIDB4MWYyM2EwMDAgMHgwIDB4MTAwPjsKKwkJCSNwaHktY2VsbHMgPSA8MT47CisJCQljbG9ja3MgPSA8JnNhdGFwaHkzY2xrIDA+OworCQkJc3RhdHVzID0gIm9rIjsKKwkJCWFwbSx0eC1ib29zdC1nYWluID0gPDMxIDMxIDMxIDMxIDMxIDMxPjsKKwkJCWFwbSx0eC1leWUtdHVuaW5nID0gPDIgMTAgMTAgMiAxMCAxMD47CisJCX07CisKKwkJc2F0YTE6IHNhdGFAMWEwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtYWhjaSI7CisJCQlyZWcgPSA8MHgwIDB4MWEwMDAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMTAwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMWQwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMWUwMDAgMHgwIDB4MTAwMD4sCisJCQkgICAgICA8MHgwIDB4MWYyMTcwMDAgMHgwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDg2IDB4ND47CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJY2xvY2tzID0gPCZzYXRhMDFjbGsgMD47CisJCQlwaHlzID0gPCZwaHkxIDA+OworCQkJcGh5LW5hbWVzID0gInNhdGEtcGh5IjsKKwkJfTsKKworCQlzYXRhMjogc2F0YUAxYTQwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1haGNpIjsKKwkJCXJlZyA9IDwweDAgMHgxYTQwMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIyMDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIyZDAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIyZTAwMCAweDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIyNzAwMCAweDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgwIDB4ODcgMHg0PjsKKwkJCXN0YXR1cyA9ICJvayI7CisJCQljbG9ja3MgPSA8JnNhdGEyM2NsayAwPjsKKwkJCXBoeXMgPSA8JnBoeTIgMD47CisJCQlwaHktbmFtZXMgPSAic2F0YS1waHkiOworCQl9OworCisJCXNhdGEzOiBzYXRhQDFhODAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWFoY2kiOworCQkJcmVnID0gPDB4MCAweDFhODAwMDAwIDB4MCAweDEwMDA+LAorCQkJICAgICAgPDB4MCAweDFmMjMwMDAwIDB4MCAweDEwMDA+LAorCQkJICAgICAgPDB4MCAweDFmMjNkMDAwIDB4MCAweDEwMDA+LAorCQkJICAgICAgPDB4MCAweDFmMjNlMDAwIDB4MCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwweDAgMHg4OCAweDQ+OworCQkJc3RhdHVzID0gIm9rIjsKKwkJCWNsb2NrcyA9IDwmc2F0YTQ1Y2xrIDA+OworCQkJcGh5cyA9IDwmcGh5MyAwPjsKKwkJCXBoeS1uYW1lcyA9ICJzYXRhLXBoeSI7CisJCX07CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDcxYzUzZWMuLjRiY2E0OTIzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTIsNiArMTIsNyBAQAogZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKIGdlbmVyaWMteSArPSBlcnJuby5oCiBnZW5lcmljLXkgKz0gZnRyYWNlLmgKK2dlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBod19pcnEuaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpb2N0bHMuaApAQCAtMjIsMTMgKzIzLDE2IEBACiBnZW5lcmljLXkgKz0ga3ZtX3BhcmEuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKIGdlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1tYW4uaAogZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCiBnZW5lcmljLXkgKz0gbXV0ZXguaAogZ2VuZXJpYy15ICs9IHBjaS5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCiBnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKK2dlbmVyaWMteSArPSByd3NlbS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlY3Rpb25zLmgKIGdlbmVyaWMteSArPSBzZWdtZW50LmgKQEAgLTM4LDggKzQyLDggQEAKIGdlbmVyaWMteSArPSBzaXplcy5oCiBnZW5lcmljLXkgKz0gc29ja2V0LmgKIGdlbmVyaWMteSArPSBzb2NraW9zLmgKLWdlbmVyaWMteSArPSBzd2l0Y2hfdG8uaAogZ2VuZXJpYy15ICs9IHN3YWIuaAorZ2VuZXJpYy15ICs9IHN3aXRjaF90by5oCiBnZW5lcmljLXkgKz0gdGVybWJpdHMuaAogZ2VuZXJpYy15ICs9IHRlcm1pb3MuaAogZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKQEAgLTQ5LDUgKzUzLDMgQEAKIGdlbmVyaWMteSArPSB1c2VyLmgKIGdlbmVyaWMteSArPSB2Z2EuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCmluZGV4IDQwOWNhMzcuLjY2ZWI3NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIHdmaSgpCQlhc20gdm9sYXRpbGUoIndmaSIgOiA6IDogIm1lbW9yeSIpCiAKICNkZWZpbmUgaXNiKCkJCWFzbSB2b2xhdGlsZSgiaXNiIiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgZG1iKG9wdCkJYXNtIHZvbGF0aWxlKCJkbWIgc3kiIDogOiA6ICJtZW1vcnkiKQogI2RlZmluZSBkc2Iob3B0KQlhc20gdm9sYXRpbGUoImRzYiBzeSIgOiA6IDogIm1lbW9yeSIpCiAKICNkZWZpbmUgbWIoKQkJZHNiKCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggODg5MzI0OTguLjRjNjBlNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCkBAIC04NSw2ICs4NSwxMyBAQAogfQogCiAvKgorICogQ2FjaGUgbWFpbnRlbmFuY2UgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIERNQSBBUEkuIE5vIHRvIGJlIHVzZWQgZGlyZWN0bHkuCisgKi8KK2V4dGVybiB2b2lkIF9fZG1hX21hcF9hcmVhKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHZvaWQgX19kbWFfdW5tYXBfYXJlYShjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiB2b2lkIF9fZG1hX2ZsdXNoX3JhbmdlKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKKworLyoKICAqIENvcHkgdXNlciBkYXRhIGZyb20vdG8gYSBwYWdlIHdoaWNoIGlzIG1hcHBlZCBpbnRvIGEgZGlmZmVyZW50CiAgKiBwcm9jZXNzZXMgYWRkcmVzcyBzcGFjZS4gIFJlYWxseSwgd2Ugd2FudCB0byBhbGxvdyBvdXIgInVzZXIKICAqIHNwYWNlIiBtb2RlbCB0byBoYW5kbGUgdGhpcy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY29tcGF0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IGZkYTI3MDQuLmU3MWY4MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMjI4LDcgKzIyOCw3IEBACiAJcmV0dXJuICh1MzIpKHVuc2lnbmVkIGxvbmcpdXB0cjsKIH0KIAotI2RlZmluZSBjb21wYXRfdXNlcl9zdGFja19wb2ludGVyKCkgKGN1cnJlbnRfcHRfcmVncygpLT5jb21wYXRfc3ApCisjZGVmaW5lIGNvbXBhdF91c2VyX3N0YWNrX3BvaW50ZXIoKSAodXNlcl9zdGFja19wb2ludGVyKGN1cnJlbnRfcHRfcmVncygpKSkKIAogc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqYXJjaF9jb21wYXRfYWxsb2NfdXNlcl9zcGFjZShsb25nIGxlbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0YWMwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTGluYXJvIEx0ZC4gPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX0NQVUZFQVRVUkVfSAorI2RlZmluZSBfX0FTTV9DUFVGRUFUVVJFX0gKKworI2luY2x1ZGUgPGFzbS9od2NhcC5oPgorCisvKgorICogSW4gdGhlIGFybTY0IHdvcmxkIChhcyBpbiB0aGUgQVJNIHdvcmxkKSwgZWxmX2h3Y2FwIGlzIHVzZWQgYm90aCBpbnRlcm5hbGx5CisgKiBpbiB0aGUga2VybmVsIGFuZCBmb3IgdXNlciBzcGFjZSB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIG9wdGlvbmFsIGZlYXR1cmVzCisgKiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN5c3RlbS4gU28gbGV0J3MgbWFwIGZlYXR1cmUgJ3gnIHRvIEhXQ0FQX3guCisgKiBOb3RlIHRoYXQgSFdDQVBfeCBjb25zdGFudHMgYXJlIGJpdCBmaWVsZHMgc28gd2UgbmVlZCB0byB0YWtlIHRoZSBsb2cuCisgKi8KKworI2RlZmluZSBNQVhfQ1BVX0ZFQVRVUkVTCSg4ICogc2l6ZW9mKGVsZl9od2NhcCkpCisjZGVmaW5lIGNwdV9mZWF0dXJlKHgpCQlpbG9nMihIV0NBUF8gIyMgeCkKKworc3RhdGljIGlubGluZSBib29sIGNwdV9oYXZlX2ZlYXR1cmUodW5zaWduZWQgaW50IG51bSkKK3sKKwlyZXR1cm4gZWxmX2h3Y2FwICYgKDFVTCA8PCBudW0pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWctbW9uaXRvcnMuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWctbW9uaXRvcnMuaAppbmRleCA2MjMxNDc5Li42ZTliNWIzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVnLW1vbml0b3JzLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kZWJ1Zy1tb25pdG9ycy5oCkBAIC0yNiw2ICsyNiw1MyBAQAogI2RlZmluZSBEQkdfRVNSX0VWVF9IV1dQCTB4MgogI2RlZmluZSBEQkdfRVNSX0VWVF9CUksJCTB4NgogCisvKgorICogQnJlYWsgcG9pbnQgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcKKyAqLworI2RlZmluZSBCUkVBS19JTlNUUl9TSVpFCQk0CisKKy8qCisgKiBFU1IgdmFsdWVzIGV4cGVjdGVkIGZvciBkeW5hbWljIGFuZCBjb21waWxlIHRpbWUgQlJLIGluc3RydWN0aW9uCisgKi8KKyNkZWZpbmUgREJHX0VTUl9WQUxfQlJLKHgpCSgweGYyMDAwMDAwIHwgKCh4KSAmIDB4ZmZmZmYpKQorCisvKgorICogI2ltbTE2IHZhbHVlcyB1c2VkIGZvciBCUksgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGlvbgorICogQWxsb3dlZCB2YWx1ZXMgZm9yIGtnYmQgYXJlIDB4NDAwIC0gMHg3ZmYKKyAqIDB4NDAwOiBmb3IgZHluYW1pYyBCUksgaW5zdHJ1Y3Rpb24KKyAqIDB4NDAxOiBmb3IgY29tcGlsZSB0aW1lIEJSSyBpbnN0cnVjdGlvbgorICovCisjZGVmaW5lIEtHREJfRFlOX0RHQl9CUktfSU1NCQkweDQwMAorI2RlZmluZSBLREJHX0NPTVBJTEVEX0RCR19CUktfSU1NCTB4NDAxCisKKy8qCisgKiBCUksgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcKKyAqIFRoZSAjaW1tMTYgdmFsdWUgc2hvdWxkIGJlIHBsYWNlZCBhdCBiaXRzWzIwOjVdIHdpdGhpbiBCUksgaW5zCisgKi8KKyNkZWZpbmUgQUFSQ0g2NF9CUkVBS19NT04JMHhkNDIwMDAwMAorCisvKgorICogRXh0cmFjdCBieXRlIGZyb20gQlJLIGluc3RydWN0aW9uCisgKi8KKyNkZWZpbmUgS0dEQl9EWU5fREdCX0JSS19JTlNfQllURSh4KSBcCisJKCgoKEFBUkNINjRfQlJFQUtfTU9OKSAmIDB4ZmZlMDAwMWYpID4+ICh4ICogOCkpICYgMHhmZikKKworLyoKKyAqIEV4dHJhY3QgYnl0ZSBmcm9tIEJSSyAjaW1tMTYKKyAqLworI2RlZmluZSBLR0JEX0RZTl9ER0JfQlJLX0lNTV9CWVRFKHgpIFwKKwkoKCgoKEtHREJfRFlOX0RHQl9CUktfSU1NKSAmIDB4ZmZmZikgPDwgNSkgPj4gKHggKiA4KSkgJiAweGZmKQorCisjZGVmaW5lIEtHREJfRFlOX0RHQl9CUktfQllURSh4KSBcCisJKEtHREJfRFlOX0RHQl9CUktfSU5TX0JZVEUoeCkgfCBLR0JEX0RZTl9ER0JfQlJLX0lNTV9CWVRFKHgpKQorCisjZGVmaW5lICBLR0RCX0RZTl9CUktfSU5TX0JZVEUwICBLR0RCX0RZTl9ER0JfQlJLX0JZVEUoMCkKKyNkZWZpbmUgIEtHREJfRFlOX0JSS19JTlNfQllURTEgIEtHREJfRFlOX0RHQl9CUktfQllURSgxKQorI2RlZmluZSAgS0dEQl9EWU5fQlJLX0lOU19CWVRFMiAgS0dEQl9EWU5fREdCX0JSS19CWVRFKDIpCisjZGVmaW5lICBLR0RCX0RZTl9CUktfSU5TX0JZVEUzICBLR0RCX0RZTl9ER0JfQlJLX0JZVEUoMykKKworI2RlZmluZSBDQUNIRV9GTFVTSF9JU19TQUZFCQkxCisKIGVudW0gZGVidWdfZWwgewogCURCR19BQ1RJVkVfRUwwID0gMCwKIAlEQkdfQUNUSVZFX0VMMSwKQEAgLTQzLDIzICs5MCw2IEBACiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogc3RydWN0IHRhc2tfc3RydWN0OwogCi0jZGVmaW5lIGxvY2FsX2RiZ19zYXZlKGZsYWdzKQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJCVwKLQkJdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsJCQkJXAotCQlhc20gdm9sYXRpbGUoCQkJCQkJCVwKLQkJIm1ycwklMCwgZGFpZgkJCS8vIGxvY2FsX2RiZ19zYXZlXG4iCVwKLQkJIm1zcglkYWlmc2V0LCAjOCIJCQkJCQlcCi0JCTogIj1yIiAoZmxhZ3MpIDogOiAibWVtb3J5Iik7CQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBsb2NhbF9kYmdfcmVzdG9yZShmbGFncykJCQkJCQlcCi0JZG8gewkJCQkJCQkJCVwKLQkJdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsJCQkJXAotCQlhc20gdm9sYXRpbGUoCQkJCQkJCVwKLQkJIm1zcglkYWlmLCAlMAkJCS8vIGxvY2FsX2RiZ19yZXN0b3JlXG4iCVwKLQkJOiA6ICJyIiAoZmxhZ3MpIDogIm1lbW9yeSIpOwkJCQkJXAotCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgREJHX0FSQ0hfSURfUkVTRVJWRUQJMAkvKiBJbiBjYXNlIG9mIHB0cmFjZSBBQkkgdXBkYXRlcy4gKi8KIAogI2RlZmluZSBEQkdfSE9PS19IQU5ETEVECTAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCBmZDBjMGMwLi4zYTQ1NzJlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCkBAIC0zMCw2ICszMCw4IEBACiAKICNkZWZpbmUgRE1BX0VSUk9SX0NPREUJKH4oZG1hX2FkZHJfdCkwKQogZXh0ZXJuIHN0cnVjdCBkbWFfbWFwX29wcyAqZG1hX29wczsKK2V4dGVybiBzdHJ1Y3QgZG1hX21hcF9vcHMgY29oZXJlbnRfc3dpb3RsYl9kbWFfb3BzOworZXh0ZXJuIHN0cnVjdCBkbWFfbWFwX29wcyBub25jb2hlcmVudF9zd2lvdGxiX2RtYV9vcHM7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRtYV9tYXBfb3BzICpfX2dlbmVyaWNfZG1hX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC00Nyw2ICs0OSwxMSBAQAogCQlyZXR1cm4gX19nZW5lcmljX2RtYV9vcHMoZGV2KTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfb3BzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRtYV9tYXBfb3BzICpvcHMpCit7CisJZGV2LT5hcmNoZGF0YS5kbWFfb3BzID0gb3BzOworfQorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctY29tbW9uLmg+CiAKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBwaHlzX3RvX2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBhZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9od2NhcC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9od2NhcC5oCmluZGV4IDZjZGRiYjAuLjAyNGM0NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHdjYXAuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2h3Y2FwLmgKQEAgLTMyLDYgKzMyLDEyIEBACiAjZGVmaW5lIENPTVBBVF9IV0NBUF9JRElWCShDT01QQVRfSFdDQVBfSURJVkF8Q09NUEFUX0hXQ0FQX0lESVZUKQogI2RlZmluZSBDT01QQVRfSFdDQVBfRVZUU1RSTQkoMSA8PCAyMSkKIAorI2RlZmluZSBDT01QQVRfSFdDQVAyX0FFUwkoMSA8PCAwKQorI2RlZmluZSBDT01QQVRfSFdDQVAyX1BNVUxMCSgxIDw8IDEpCisjZGVmaW5lIENPTVBBVF9IV0NBUDJfU0hBMQkoMSA8PCAyKQorI2RlZmluZSBDT01QQVRfSFdDQVAyX1NIQTIJKDEgPDwgMykKKyNkZWZpbmUgQ09NUEFUX0hXQ0FQMl9DUkMzMgkoMSA8PCA0KQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogLyoKICAqIFRoaXMgeWllbGRzIGEgbWFzayB0aGF0IHVzZXIgcHJvZ3JhbXMgY2FuIHVzZSB0byBmaWd1cmUgb3V0IHdoYXQKQEAgLTQxLDcgKzQ3LDggQEAKIAogI2lmZGVmIENPTkZJR19DT01QQVQKICNkZWZpbmUgQ09NUEFUX0VMRl9IV0NBUAkoY29tcGF0X2VsZl9od2NhcCkKLWV4dGVybiB1bnNpZ25lZCBpbnQgY29tcGF0X2VsZl9od2NhcDsKKyNkZWZpbmUgQ09NUEFUX0VMRl9IV0NBUDIJKGNvbXBhdF9lbGZfaHdjYXAyKQorZXh0ZXJuIHVuc2lnbmVkIGludCBjb21wYXRfZWxmX2h3Y2FwLCBjb21wYXRfZWxmX2h3Y2FwMjsKICNlbmRpZgogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBlbGZfaHdjYXA7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggNGNjODEzZS4uNzg0NmE2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaApAQCAtMTIxLDcgKzEyMSw3IEBACiAgKiAgSS9PIHBvcnQgYWNjZXNzIHByaW1pdGl2ZXMuCiAgKi8KICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQJCTB4ZmZmZgotI2RlZmluZSBQQ0lfSU9CQVNFCQkoKHZvaWQgX19pb21lbSAqKShNT0RVTEVTX1ZBRERSIC0gU1pfMk0pKQorI2RlZmluZSBQQ0lfSU9CQVNFCQkoKHZvaWQgX19pb21lbSAqKShNT0RVTEVTX1ZBRERSIC0gU1pfMzJNKSkKIAogc3RhdGljIGlubGluZSB1OCBpbmIodW5zaWduZWQgbG9uZyBhZGRyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pcnFmbGFncy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCmluZGV4IGIyZmNmYmMuLjExY2M5NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKQEAgLTkwLDUgKzkwLDI4IEBACiAJcmV0dXJuIGZsYWdzICYgUFNSX0lfQklUOwogfQogCisvKgorICogc2F2ZSBhbmQgcmVzdG9yZSBkZWJ1ZyBzdGF0ZQorICovCisjZGVmaW5lIGxvY2FsX2RiZ19zYXZlKGZsYWdzKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7CQkJXAorCQlhc20gdm9sYXRpbGUoCQkJCQkJXAorCQkibXJzICAgICUwLCBkYWlmCQkvLyBsb2NhbF9kYmdfc2F2ZVxuIglcCisJCSJtc3IgICAgZGFpZnNldCwgIzgiCQkJCQlcCisJCTogIj1yIiAoZmxhZ3MpIDogOiAibWVtb3J5Iik7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2RiZ19yZXN0b3JlKGZsYWdzKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsJCQlcCisJCWFzbSB2b2xhdGlsZSgJCQkJCQlcCisJCSJtc3IgICAgZGFpZiwgJTAJCS8vIGxvY2FsX2RiZ19yZXN0b3JlXG4iCVwKKwkJOiA6ICJyIiAoZmxhZ3MpIDogIm1lbW9yeSIpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9kYmdfZW5hYmxlKCkJYXNtKCJtc3IJZGFpZmNsciwgIzgiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBsb2NhbF9kYmdfZGlzYWJsZSgpCWFzbSgibXNyCWRhaWZzZXQsICM4IiA6IDogOiAibWVtb3J5IikKKwogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va2dkYi5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rZ2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4YWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va2dkYi5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBBQXJjaDY0IEtHREIgc3VwcG9ydAorICoKKyAqIEJhc2VkIG9uIGFyY2gvYXJtL2luY2x1ZGUva2dkYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENhdml1bSBJbmMuCisgKiBBdXRob3I6IFZpamF5YSBLdW1hciBLIDx2aWpheWEua3VtYXJAY2F2aXVtbmV0d29ya3MuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0FSTV9LR0RCX0gKKyNkZWZpbmUgX19BUk1fS0dEQl9ICisKKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vZGVidWctbW9uaXRvcnMuaD4KKworI2lmbmRlZglfX0FTU0VNQkxZX18KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfa2dkYl9icmVha3BvaW50KHZvaWQpCit7CisJYXNtICgiYnJrICUwIiA6IDogIkkiIChLREJHX0NPTVBJTEVEX0RCR19CUktfSU1NKSk7Cit9CisKK2V4dGVybiB2b2lkIGtnZGJfaGFuZGxlX2J1c19lcnJvcih2b2lkKTsKK2V4dGVybiBpbnQga2dkYl9mYXVsdF9leHBlY3RlZDsKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIGdkYiBpcyBleHBlY3RpbmcgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgbGF5b3V0LgorICoKKyAqIEdlbmVyYWwgcHVycG9zZSByZWdzOgorICogICAgIHIwLXIzMDogNjQgYml0CisgKiAgICAgc3AscGMgOiA2NCBiaXQKKyAqICAgICBwc3RhdGUgIDogNjQgYml0CisgKiAgICAgVG90YWw6IDM0CisgKiBGUFUgcmVnczoKKyAqICAgICBmMC1mMzE6IDEyOCBiaXQKKyAqICAgICBUb3RhbDogMzIKKyAqIEV4dHJhIHJlZ3MKKyAqICAgICBmcHNyICYgZnBjcjogMzIgYml0CisgKiAgICAgVG90YWw6IDIKKyAqCisgKi8KKworI2RlZmluZSBfR1BfUkVHUwkJMzQKKyNkZWZpbmUgX0ZQX1JFR1MJCTMyCisjZGVmaW5lIF9FWFRSQV9SRUdTCQkyCisvKgorICogZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBzaXplIGluIGJ5dGVzLgorICogcHN0YXRlIGlzIG9ubHkgNCBieXRlcy4gc3VidHJhY3QgNCBieXRlcworICovCisjZGVmaW5lIEdQX1JFR19CWVRFUwkJKF9HUF9SRUdTICogOCkKKyNkZWZpbmUgREJHX01BWF9SRUdfTlVNCQkoX0dQX1JFR1MgKyBfRlBfUkVHUyArIF9FWFRSQV9SRUdTKQorCisvKgorICogU2l6ZSBvZiBJL08gYnVmZmVyIGZvciBnZGIgcGFja2V0LgorICogY29uc2lkZXJpbmcgdG8gaG9sZCBhbGwgcmVnaXN0ZXIgY29udGVudHMsIHNpemUgaXMgc2V0CisgKi8KKworI2RlZmluZSBCVUZNQVgJCQkyMDQ4CisKKy8qCisgKiBOdW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIGdkYl9yZWdzIGJ1ZmZlci4KKyAqIF9HUF9SRUdTOiA4IGJ5dGVzLCBfRlBfUkVHUzogMTYgYnl0ZXMgYW5kIF9FWFRSQV9SRUdTOiA0IGJ5dGVzIGVhY2gKKyAqIEdEQiBmYWlscyB0byBjb25uZWN0IGZvciBzaXplIGJleW9uZCB0aGlzIHdpdGggZXJyb3IKKyAqICInZycgcGFja2V0IHJlcGx5IGlzIHRvbyBsb25nIgorICovCisKKyNkZWZpbmUgTlVNUkVHQllURVMJKChfR1BfUkVHUyAqIDgpICsgKF9GUF9SRUdTICogMTYpICsgXAorCQkJKF9FWFRSQV9SRUdTICogNCkpCisKKyNlbmRpZiAvKiBfX0FTTV9LR0RCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FybS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXJtLmgKaW5kZXggMGViMzk4Ni4uMjFlZjQ4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXJtLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXJtLmgKQEAgLTEwNiw3ICsxMDYsNiBAQAogCiAvKiBWVENSX0VMMiBSZWdpc3RlcnMgYml0cyAqLwogI2RlZmluZSBWVENSX0VMMl9QU19NQVNLCSg3IDw8IDE2KQotI2RlZmluZSBWVENSX0VMMl9QU180MEIJCSgyIDw8IDE2KQogI2RlZmluZSBWVENSX0VMMl9URzBfTUFTSwkoMSA8PCAxNCkKICNkZWZpbmUgVlRDUl9FTDJfVEcwXzRLCQkoMCA8PCAxNCkKICNkZWZpbmUgVlRDUl9FTDJfVEcwXzY0SwkoMSA8PCAxNCkKQEAgLTEyOSwxMCArMTI4LDkgQEAKICAqIDY0a0IgcGFnZXMgKFRHMCA9IDEpCiAgKiAyIGxldmVsIHBhZ2UgdGFibGVzIChTTCA9IDEpCiAgKi8KLSNkZWZpbmUgVlRDUl9FTDJfRkxBR1MJCShWVENSX0VMMl9QU180MEIgfCBWVENSX0VMMl9URzBfNjRLIHwgXAotCQkJCSBWVENSX0VMMl9TSDBfSU5ORVIgfCBWVENSX0VMMl9PUkdOMF9XQldBIHwgXAotCQkJCSBWVENSX0VMMl9JUkdOMF9XQldBIHwgVlRDUl9FTDJfU0wwX0xWTDEgfCBcCi0JCQkJIFZUQ1JfRUwyX1QwU1pfNDBCKQorI2RlZmluZSBWVENSX0VMMl9GTEFHUwkJKFZUQ1JfRUwyX1RHMF82NEsgfCBWVENSX0VMMl9TSDBfSU5ORVIgfCBcCisJCQkJIFZUQ1JfRUwyX09SR04wX1dCV0EgfCBWVENSX0VMMl9JUkdOMF9XQldBIHwgXAorCQkJCSBWVENSX0VMMl9TTDBfTFZMMSB8IFZUQ1JfRUwyX1QwU1pfNDBCKQogI2RlZmluZSBWVFRCUl9YCQkoMzggLSBWVENSX0VMMl9UMFNaXzQwQikKICNlbHNlCiAvKgpAQCAtMTQyLDEwICsxNDAsOSBAQAogICogNGtCIHBhZ2VzIChURzAgPSAwKQogICogMyBsZXZlbCBwYWdlIHRhYmxlcyAoU0wgPSAxKQogICovCi0jZGVmaW5lIFZUQ1JfRUwyX0ZMQUdTCQkoVlRDUl9FTDJfUFNfNDBCIHwgVlRDUl9FTDJfVEcwXzRLIHwgXAotCQkJCSBWVENSX0VMMl9TSDBfSU5ORVIgfCBWVENSX0VMMl9PUkdOMF9XQldBIHwgXAotCQkJCSBWVENSX0VMMl9JUkdOMF9XQldBIHwgVlRDUl9FTDJfU0wwX0xWTDEgfCBcCi0JCQkJIFZUQ1JfRUwyX1QwU1pfNDBCKQorI2RlZmluZSBWVENSX0VMMl9GTEFHUwkJKFZUQ1JfRUwyX1RHMF80SyB8IFZUQ1JfRUwyX1NIMF9JTk5FUiB8IFwKKwkJCQkgVlRDUl9FTDJfT1JHTjBfV0JXQSB8IFZUQ1JfRUwyX0lSR04wX1dCV0EgfCBcCisJCQkJIFZUQ1JfRUwyX1NMMF9MVkwxIHwgVlRDUl9FTDJfVDBTWl80MEIpCiAjZGVmaW5lIFZUVEJSX1gJCSgzNyAtIFZUQ1JfRUwyX1QwU1pfNDBCKQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1od2RlZi5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmgKaW5kZXggYjFkMmUyNi4uZjdhZjY2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmgKQEAgLTEwMCw5ICsxMDAsOSBAQAogI2RlZmluZSBQVEVfSFlQCQkJUFRFX1VTRVIKIAogLyoKLSAqIDQwLWJpdCBwaHlzaWNhbCBhZGRyZXNzIHN1cHBvcnRlZC4KKyAqIEhpZ2hlc3QgcG9zc2libGUgcGh5c2ljYWwgYWRkcmVzcyBzdXBwb3J0ZWQuCiAgKi8KLSNkZWZpbmUgUEhZU19NQVNLX1NISUZUCQkoNDApCisjZGVmaW5lIFBIWVNfTUFTS19TSElGVAkJKDQ4KQogI2RlZmluZSBQSFlTX01BU0sJCSgoVUwoMSkgPDwgUEhZU19NQVNLX1NISUZUKSAtIDEpCiAKIC8qCkBAIC0xMjIsNyArMTIyLDYgQEAKICNkZWZpbmUgVENSX1NIQVJFRAkJKChVTCgzKSA8PCAxMikgfCAoVUwoMykgPDwgMjgpKQogI2RlZmluZSBUQ1JfVEcwXzY0SwkJKFVMKDEpIDw8IDE0KQogI2RlZmluZSBUQ1JfVEcxXzY0SwkJKFVMKDEpIDw8IDMwKQotI2RlZmluZSBUQ1JfSVBTXzQwQklUCQkoVUwoMikgPDwgMzIpCiAjZGVmaW5lIFRDUl9BU0lEMTYJCShVTCgxKSA8PCAzNikKICNkZWZpbmUgVENSX1RCSTAJCShVTCgxKSA8PCAzNykKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBhYTM5MTdjLi45MGM4MTFmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMTk5LDcgKzE5OSw3IEBACiAJCQkgICAgICBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQogewogCWlmIChwdGVfdmFsaWRfdXNlcihwdGUpKSB7Ci0JCWlmIChwdGVfZXhlYyhwdGUpKQorCQlpZiAoIXB0ZV9zcGVjaWFsKHB0ZSkgJiYgcHRlX2V4ZWMocHRlKSkKIAkJCV9fc3luY19pY2FjaGVfZGNhY2hlKHB0ZSwgYWRkcik7CiAJCWlmIChwdGVfZGlydHkocHRlKSAmJiBwdGVfd3JpdGUocHRlKSkKIAkJCXB0ZV92YWwocHRlKSAmPSB+UFRFX1JET05MWTsKQEAgLTIyNywzNiArMjI3LDM2IEBACiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NQRUNJQUwKIAotLyoKLSAqIFNvZnR3YXJlIFBNRCBiaXRzIGZvciBUSFAKLSAqLworc3RhdGljIGlubGluZSBwdGVfdCBwbWRfcHRlKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gX19wdGUocG1kX3ZhbChwbWQpKTsKK30KIAotI2RlZmluZSBQTURfU0VDVF9ESVJUWQkJKF9BVChwbWR2YWxfdCwgMSkgPDwgNTUpCi0jZGVmaW5lIFBNRF9TRUNUX1NQTElUVElORwkoX0FUKHBtZHZhbF90LCAxKSA8PCA1NykKK3N0YXRpYyBpbmxpbmUgcG1kX3QgcHRlX3BtZChwdGVfdCBwdGUpCit7CisJcmV0dXJuIF9fcG1kKHB0ZV92YWwocHRlKSk7Cit9CiAKIC8qCiAgKiBUSFAgZGVmaW5pdGlvbnMuCiAgKi8KLSNkZWZpbmUgcG1kX3lvdW5nKHBtZCkJCShwbWRfdmFsKHBtZCkgJiBQTURfU0VDVF9BRikKLQotI2RlZmluZSBfX0hBVkVfQVJDSF9QTURfV1JJVEUKLSNkZWZpbmUgcG1kX3dyaXRlKHBtZCkJCSghKHBtZF92YWwocG1kKSAmIFBNRF9TRUNUX1JET05MWSkpCiAKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKICNkZWZpbmUgcG1kX3RyYW5zX2h1Z2UocG1kKQkocG1kX3ZhbChwbWQpICYmICEocG1kX3ZhbChwbWQpICYgUE1EX1RBQkxFX0JJVCkpCi0jZGVmaW5lIHBtZF90cmFuc19zcGxpdHRpbmcocG1kKSAocG1kX3ZhbChwbWQpICYgUE1EX1NFQ1RfU1BMSVRUSU5HKQorI2RlZmluZSBwbWRfdHJhbnNfc3BsaXR0aW5nKHBtZCkJcHRlX3NwZWNpYWwocG1kX3B0ZShwbWQpKQogI2VuZGlmCiAKLSNkZWZpbmUgUE1EX0JJVF9GVU5DKGZuLG9wKSBcCi1zdGF0aWMgaW5saW5lIHBtZF90IHBtZF8jI2ZuKHBtZF90IHBtZCkgeyBwbWRfdmFsKHBtZCkgb3A7IHJldHVybiBwbWQ7IH0KKyNkZWZpbmUgcG1kX3lvdW5nKHBtZCkJCXB0ZV95b3VuZyhwbWRfcHRlKHBtZCkpCisjZGVmaW5lIHBtZF93cnByb3RlY3QocG1kKQlwdGVfcG1kKHB0ZV93cnByb3RlY3QocG1kX3B0ZShwbWQpKSkKKyNkZWZpbmUgcG1kX21rc3BsaXR0aW5nKHBtZCkJcHRlX3BtZChwdGVfbWtzcGVjaWFsKHBtZF9wdGUocG1kKSkpCisjZGVmaW5lIHBtZF9ta29sZChwbWQpCQlwdGVfcG1kKHB0ZV9ta29sZChwbWRfcHRlKHBtZCkpKQorI2RlZmluZSBwbWRfbWt3cml0ZShwbWQpCXB0ZV9wbWQocHRlX21rd3JpdGUocG1kX3B0ZShwbWQpKSkKKyNkZWZpbmUgcG1kX21rZGlydHkocG1kKQlwdGVfcG1kKHB0ZV9ta2RpcnR5KHBtZF9wdGUocG1kKSkpCisjZGVmaW5lIHBtZF9ta3lvdW5nKHBtZCkJcHRlX3BtZChwdGVfbWt5b3VuZyhwbWRfcHRlKHBtZCkpKQorI2RlZmluZSBwbWRfbWtub3RwcmVzZW50KHBtZCkJKF9fcG1kKHBtZF92YWwocG1kKSAmPSB+UE1EX1RZUEVfTUFTSykpCiAKLVBNRF9CSVRfRlVOQyh3cnByb3RlY3QsCXw9IFBNRF9TRUNUX1JET05MWSk7Ci1QTURfQklUX0ZVTkMobWtvbGQsCSY9IH5QTURfU0VDVF9BRik7Ci1QTURfQklUX0ZVTkMobWtzcGxpdHRpbmcsIHw9IFBNRF9TRUNUX1NQTElUVElORyk7Ci1QTURfQklUX0ZVTkMobWt3cml0ZSwgICAmPSB+UE1EX1NFQ1RfUkRPTkxZKTsKLVBNRF9CSVRfRlVOQyhta2RpcnR5LCAgIHw9IFBNRF9TRUNUX0RJUlRZKTsKLVBNRF9CSVRfRlVOQyhta3lvdW5nLCAgIHw9IFBNRF9TRUNUX0FGKTsKLVBNRF9CSVRfRlVOQyhta25vdHByZXNlbnQsICY9IH5QTURfVFlQRV9NQVNLKTsKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUE1EX1dSSVRFCisjZGVmaW5lIHBtZF93cml0ZShwbWQpCQlwdGVfd3JpdGUocG1kX3B0ZShwbWQpKQogCiAjZGVmaW5lIHBtZF9ta2h1Z2UocG1kKQkJKF9fcG1kKHBtZF92YWwocG1kKSAmIH5QTURfVEFCTEVfQklUKSkKIApAQCAtMjY2LDE1ICsyNjYsNiBAQAogCiAjZGVmaW5lIHBtZF9wYWdlKHBtZCkgICAgICAgICAgIHBmbl90b19wYWdlKF9fcGh5c190b19wZm4ocG1kX3ZhbChwbWQpICYgUEhZU19NQVNLKSkKIAotc3RhdGljIGlubGluZSBwbWRfdCBwbWRfbW9kaWZ5KHBtZF90IHBtZCwgcGdwcm90X3QgbmV3cHJvdCkKLXsKLQljb25zdCBwbWR2YWxfdCBtYXNrID0gUE1EX1NFQ1RfVVNFUiB8IFBNRF9TRUNUX1BYTiB8IFBNRF9TRUNUX1VYTiB8Ci0JCQkgICAgICBQTURfU0VDVF9SRE9OTFkgfCBQTURfU0VDVF9QUk9UX05PTkUgfAotCQkJICAgICAgUE1EX1NFQ1RfVkFMSUQ7Ci0JcG1kX3ZhbChwbWQpID0gKHBtZF92YWwocG1kKSAmIH5tYXNrKSB8IChwZ3Byb3RfdmFsKG5ld3Byb3QpICYgbWFzayk7Ci0JcmV0dXJuIHBtZDsKLX0KLQogI2RlZmluZSBzZXRfcG1kX2F0KG1tLCBhZGRyLCBwbWRwLCBwbWQpCXNldF9wbWQocG1kcCwgcG1kKQogCiBzdGF0aWMgaW5saW5lIGludCBoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2Uodm9pZCkKQEAgLTI4NiwxMSArMjc3LDkgQEAKICAqIE1hcmsgdGhlIHByb3QgdmFsdWUgYXMgdW5jYWNoZWFibGUgYW5kIHVuYnVmZmVyYWJsZS4KICAqLwogI2RlZmluZSBwZ3Byb3Rfbm9uY2FjaGVkKHByb3QpIFwKLQlfX3BncHJvdF9tb2RpZnkocHJvdCwgUFRFX0FUVFJJTkRYX01BU0ssIFBURV9BVFRSSU5EWChNVF9ERVZJQ0VfbkduUm5FKSkKKwlfX3BncHJvdF9tb2RpZnkocHJvdCwgUFRFX0FUVFJJTkRYX01BU0ssIFBURV9BVFRSSU5EWChNVF9ERVZJQ0VfbkduUm5FKSB8IFBURV9QWE4gfCBQVEVfVVhOKQogI2RlZmluZSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHByb3QpIFwKLQlfX3BncHJvdF9tb2RpZnkocHJvdCwgUFRFX0FUVFJJTkRYX01BU0ssIFBURV9BVFRSSU5EWChNVF9OT1JNQUxfTkMpKQotI2RlZmluZSBwZ3Byb3RfZG1hY29oZXJlbnQocHJvdCkgXAotCV9fcGdwcm90X21vZGlmeShwcm90LCBQVEVfQVRUUklORFhfTUFTSywgUFRFX0FUVFJJTkRYKE1UX05PUk1BTF9OQykpCisJX19wZ3Byb3RfbW9kaWZ5KHByb3QsIFBURV9BVFRSSU5EWF9NQVNLLCBQVEVfQVRUUklORFgoTVRfTk9STUFMX05DKSB8IFBURV9QWE4gfCBQVEVfVVhOKQogI2RlZmluZSBfX0hBVkVfUEhZU19NRU1fQUNDRVNTX1BST1QKIHN0cnVjdCBmaWxlOwogZXh0ZXJuIHBncHJvdF90IHBoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIHBmbiwKQEAgLTM4Myw2ICszNzIsMTEgQEAKIAlyZXR1cm4gcHRlOwogfQogCitzdGF0aWMgaW5saW5lIHBtZF90IHBtZF9tb2RpZnkocG1kX3QgcG1kLCBwZ3Byb3RfdCBuZXdwcm90KQoreworCXJldHVybiBwdGVfcG1kKHB0ZV9tb2RpZnkocG1kX3B0ZShwbWQpLCBuZXdwcm90KSk7Cit9CisKIGV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOwogZXh0ZXJuIHBnZF90IGlkbWFwX3BnX2RpcltQVFJTX1BFUl9QR0RdOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BzY2kuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHNjaS5oCmluZGV4IGU1MzEyZWEuLmQxNWFiOGI0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BzY2kuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BzY2kuaApAQCAtMTQsNiArMTQsNiBAQAogI2lmbmRlZiBfX0FTTV9QU0NJX0gKICNkZWZpbmUgX19BU01fUFNDSV9ICiAKLWludCBwc2NpX2luaXQodm9pZCk7Cit2b2lkIHBzY2lfaW5pdCh2b2lkKTsKIAogI2VuZGlmIC8qIF9fQVNNX1BTQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggMGU3ZmE0OS4uYzdiYTI2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC02OCw2ICs2OCw3IEBACiAKIC8qIEFyY2hpdGVjdHVyYWxseSBkZWZpbmVkIG1hcHBpbmcgYmV0d2VlbiBBQXJjaDMyIGFuZCBBQXJjaDY0IHJlZ2lzdGVycyAqLwogI2RlZmluZSBjb21wYXRfdXNyKHgpCXJlZ3NbKHgpXQorI2RlZmluZSBjb21wYXRfZnAJcmVnc1sxMV0KICNkZWZpbmUgY29tcGF0X3NwCXJlZ3NbMTNdCiAjZGVmaW5lIGNvbXBhdF9scglyZWdzWzE0XQogI2RlZmluZSBjb21wYXRfc3BfaHlwCXJlZ3NbMTVdCkBAIC0xMzIsNyArMTMzLDcgQEAKIAkoISgocmVncyktPnBzdGF0ZSAmIFBTUl9GX0JJVCkpCiAKICNkZWZpbmUgdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpIFwKLQkoKHJlZ3MpLT5zcCkKKwkoIWNvbXBhdF91c2VyX21vZGUocmVncykpID8gKChyZWdzKS0+c3ApIDogKChyZWdzKS0+Y29tcGF0X3NwKQogCiAvKgogICogQXJlIHRoZSBjdXJyZW50IHJlZ2lzdGVycyBzdWl0YWJsZSBmb3IgdXNlciBtb2RlPyAodXNlZCB0byBtYWludGFpbgpAQCAtMTY0LDcgKzE2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQkocmVncyktPnBjCisjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykJKCh1bnNpZ25lZCBsb25nKShyZWdzKS0+cGMpCiAKICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGxiLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYi5oCmluZGV4IDcxNzAzMWEuLjcyY2FkZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGxiLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90bGIuaApAQCAtMTksMTE1ICsxOSw0NCBAQAogI2lmbmRlZiBfX0FTTV9UTEJfSAogI2RlZmluZSBfX0FTTV9UTEJfSAogCi0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KIAotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0KLSNkZWZpbmUgTU1VX0dBVEhFUl9CVU5ETEUJOAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RsYi5oPgogCiAvKgotICogVExCIGhhbmRsaW5nLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmVtb3ZlIHBhZ2VzIGZyb20gdGhlIHBhZ2UKLSAqIHRhYmxlcywgYW5kIGVmZmljaWVudGx5IGhhbmRsZSB0aGUgVExCIGlzc3Vlcy4KLSAqLwotc3RydWN0IG1tdV9nYXRoZXIgewotCXN0cnVjdCBtbV9zdHJ1Y3QJKm1tOwotCXVuc2lnbmVkIGludAkJZnVsbG1tOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAkqdm1hOwotCXVuc2lnbmVkIGxvbmcJCXN0YXJ0LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZwkJcmFuZ2Vfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZwkJcmFuZ2VfZW5kOwotCXVuc2lnbmVkIGludAkJbnI7Ci0JdW5zaWduZWQgaW50CQltYXg7Ci0Jc3RydWN0IHBhZ2UJCSoqcGFnZXM7Ci0Jc3RydWN0IHBhZ2UJCSpsb2NhbFtNTVVfR0FUSEVSX0JVTkRMRV07Ci19OwotCi0vKgotICogVGhpcyBpcyB1bm5lY2Vzc2FyaWx5IGNvbXBsZXguICBUaGVyZSdzIHRocmVlIHdheXMgdGhlIFRMQiBzaG9vdGRvd24KLSAqIGNvZGUgaXMgdXNlZDoKKyAqIFRoZXJlJ3MgdGhyZWUgd2F5cyB0aGUgVExCIHNob290ZG93biBjb2RlIGlzIHVzZWQ6CiAgKiAgMS4gVW5tYXBwaW5nIGEgcmFuZ2Ugb2Ygdm1hcy4gIFNlZSB6YXBfcGFnZV9yYW5nZSgpLCB1bm1hcF9yZWdpb24oKS4KICAqICAgICB0bGItPmZ1bGxtbSA9IDAsIGFuZCB0bGJfc3RhcnRfdm1hL3RsYl9lbmRfdm1hIHdpbGwgYmUgY2FsbGVkLgotICogICAgIHRsYi0+dm1hIHdpbGwgYmUgbm9uLU5VTEwuCiAgKiAgMi4gVW5tYXBwaW5nIGFsbCB2bWFzLiAgU2VlIGV4aXRfbW1hcCgpLgogICogICAgIHRsYi0+ZnVsbG1tID0gMSwgYW5kIHRsYl9zdGFydF92bWEvdGxiX2VuZF92bWEgd2lsbCBiZSBjYWxsZWQuCi0gKiAgICAgdGxiLT52bWEgd2lsbCBiZSBub24tTlVMTC4gIEFkZGl0aW9uYWxseSwgcGFnZSB0YWJsZXMgd2lsbCBiZSBmcmVlZC4KKyAqICAgICBQYWdlIHRhYmxlcyB3aWxsIGJlIGZyZWVkLgogICogIDMuIFVubWFwcGluZyBhcmd1bWVudCBwYWdlcy4gIFNlZSBzaGlmdF9hcmdfcGFnZXMoKS4KICAqICAgICB0bGItPmZ1bGxtbSA9IDAsIGJ1dCB0bGJfc3RhcnRfdm1hL3RsYl9lbmRfdm1hIHdpbGwgbm90IGJlIGNhbGxlZC4KLSAqICAgICB0bGItPnZtYSB3aWxsIGJlIE5VTEwuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfZmx1c2goc3RydWN0IG1tdV9nYXRoZXIgKnRsYikKIHsKLQlpZiAodGxiLT5mdWxsbW0gfHwgIXRsYi0+dm1hKQorCWlmICh0bGItPmZ1bGxtbSkgewogCQlmbHVzaF90bGJfbW0odGxiLT5tbSk7Ci0JZWxzZSBpZiAodGxiLT5yYW5nZV9lbmQgPiAwKSB7Ci0JCWZsdXNoX3RsYl9yYW5nZSh0bGItPnZtYSwgdGxiLT5yYW5nZV9zdGFydCwgdGxiLT5yYW5nZV9lbmQpOwotCQl0bGItPnJhbmdlX3N0YXJ0ID0gVEFTS19TSVpFOwotCQl0bGItPnJhbmdlX2VuZCA9IDA7CisJfSBlbHNlIGlmICh0bGItPmVuZCA+IDApIHsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0IHZtYSA9IHsgLnZtX21tID0gdGxiLT5tbSwgfTsKKwkJZmx1c2hfdGxiX3JhbmdlKCZ2bWEsIHRsYi0+c3RhcnQsIHRsYi0+ZW5kKTsKKwkJdGxiLT5zdGFydCA9IFRBU0tfU0laRTsKKwkJdGxiLT5lbmQgPSAwOwogCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRsYl9hZGRfZmx1c2goc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCWlmICghdGxiLT5mdWxsbW0pIHsKLQkJaWYgKGFkZHIgPCB0bGItPnJhbmdlX3N0YXJ0KQotCQkJdGxiLT5yYW5nZV9zdGFydCA9IGFkZHI7Ci0JCWlmIChhZGRyICsgUEFHRV9TSVpFID4gdGxiLT5yYW5nZV9lbmQpCi0JCQl0bGItPnJhbmdlX2VuZCA9IGFkZHIgKyBQQUdFX1NJWkU7CisJCXRsYi0+c3RhcnQgPSBtaW4odGxiLT5zdGFydCwgYWRkcik7CisJCXRsYi0+ZW5kID0gbWF4KHRsYi0+ZW5kLCBhZGRyICsgUEFHRV9TSVpFKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9hbGxvY19wYWdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfTk9XQUlUIHwgX19HRlBfTk9XQVJOLCAwKTsKLQotCWlmIChhZGRyKSB7Ci0JCXRsYi0+cGFnZXMgPSAodm9pZCAqKWFkZHI7Ci0JCXRsYi0+bWF4ID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBwYWdlICopOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRsYl9mbHVzaF9tbXUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYikKLXsKLQl0bGJfZmx1c2godGxiKTsKLQlmcmVlX3BhZ2VzX2FuZF9zd2FwX2NhY2hlKHRsYi0+cGFnZXMsIHRsYi0+bnIpOwotCXRsYi0+bnIgPSAwOwotCWlmICh0bGItPnBhZ2VzID09IHRsYi0+bG9jYWwpCi0JCV9fdGxiX2FsbG9jX3BhZ2UodGxiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi10bGJfZ2F0aGVyX21tdShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JdGxiLT5tbSA9IG1tOwotCXRsYi0+ZnVsbG1tID0gIShzdGFydCB8IChlbmQrMSkpOwotCXRsYi0+c3RhcnQgPSBzdGFydDsKLQl0bGItPmVuZCA9IGVuZDsKLQl0bGItPnZtYSA9IE5VTEw7Ci0JdGxiLT5tYXggPSBBUlJBWV9TSVpFKHRsYi0+bG9jYWwpOwotCXRsYi0+cGFnZXMgPSB0bGItPmxvY2FsOwotCXRsYi0+bnIgPSAwOwotCV9fdGxiX2FsbG9jX3BhZ2UodGxiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi10bGJfZmluaXNoX21tdShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQl0bGJfZmx1c2hfbW11KHRsYik7Ci0KLQkvKiBrZWVwIHRoZSBwYWdlIHRhYmxlIGNhY2hlIHdpdGhpbiBib3VuZHMgKi8KLQljaGVja19wZ3RfY2FjaGUoKTsKLQotCWlmICh0bGItPnBhZ2VzICE9IHRsYi0+bG9jYWwpCi0JCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdGxiLT5wYWdlcywgMCk7Ci19Ci0KIC8qCiAgKiBNZW1vcml6ZSB0aGUgcmFuZ2UgZm9yIHRoZSBUTEIgZmx1c2guCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotdGxiX3JlbW92ZV90bGJfZW50cnkoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9yZW1vdmVfdGxiX2VudHJ5KHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHB0ZV90ICpwdGVwLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAl0bGJfYWRkX2ZsdXNoKHRsYiwgYWRkcik7CiB9CkBAIC0xMzcsMzggKzY2LDI0IEBACiAgKiBjYXNlIHdoZXJlIHdlJ3JlIGRvaW5nIGEgZnVsbCBNTSBmbHVzaC4gIFdoZW4gd2UncmUgZG9pbmcgYSBtdW5tYXAsCiAgKiB0aGUgdm1hcyBhcmUgYWRqdXN0ZWQgdG8gb25seSBjb3ZlciB0aGUgcmVnaW9uIHRvIGJlIHRvcm4gZG93bi4KICAqLwotc3RhdGljIGlubGluZSB2b2lkCi10bGJfc3RhcnRfdm1hKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGlubGluZSB2b2lkIHRsYl9zdGFydF92bWEoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwKKwkJCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJaWYgKCF0bGItPmZ1bGxtbSkgewotCQl0bGItPnZtYSA9IHZtYTsKLQkJdGxiLT5yYW5nZV9zdGFydCA9IFRBU0tfU0laRTsKLQkJdGxiLT5yYW5nZV9lbmQgPSAwOworCQl0bGItPnN0YXJ0ID0gVEFTS19TSVpFOworCQl0bGItPmVuZCA9IDA7CiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXRsYl9lbmRfdm1hKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGlubGluZSB2b2lkIHRsYl9lbmRfdm1hKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsCisJCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJaWYgKCF0bGItPmZ1bGxtbSkKIAkJdGxiX2ZsdXNoKHRsYik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fdGxiX3JlbW92ZV9wYWdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCBwYWdlICpwYWdlKQotewotCXRsYi0+cGFnZXNbdGxiLT5ucisrXSA9IHBhZ2U7Ci0JVk1fQlVHX09OKHRsYi0+bnIgPiB0bGItPm1heCk7Ci0JcmV0dXJuIHRsYi0+bWF4IC0gdGxiLT5ucjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRsYl9yZW1vdmVfcGFnZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlpZiAoIV9fdGxiX3JlbW92ZV9wYWdlKHRsYiwgcGFnZSkpCi0JCXRsYl9mbHVzaF9tbXUodGxiKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIF9fcHRlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHBndGFibGVfdCBwdGUsCi0JdW5zaWduZWQgbG9uZyBhZGRyKQorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CiAJdGxiX2FkZF9mbHVzaCh0bGIsIGFkZHIpOwpAQCAtMTg0LDE2ICs5OSw1IEBACiB9CiAjZW5kaWYKIAotI2RlZmluZSBwdGVfZnJlZV90bGIodGxiLCBwdGVwLCBhZGRyKQlfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZXAsIGFkZHIpCi0jZGVmaW5lIHBtZF9mcmVlX3RsYih0bGIsIHBtZHAsIGFkZHIpCV9fcG1kX2ZyZWVfdGxiKHRsYiwgcG1kcCwgYWRkcikKLSNkZWZpbmUgcHVkX2ZyZWVfdGxiKHRsYiwgcHVkcCwgYWRkcikJcHVkX2ZyZWUoKHRsYiktPm1tLCBwdWRwKQotCi0jZGVmaW5lIHRsYl9taWdyYXRlX2ZpbmlzaChtbSkJCWRvIHsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSB2b2lkCi10bGJfcmVtb3ZlX3BtZF90bGJfZW50cnkoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl0bGJfYWRkX2ZsdXNoKHRsYiwgYWRkcik7Ci19CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzJlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfX0FTTV9UT1BPTE9HWV9ICisjZGVmaW5lIF9fQVNNX1RPUE9MT0dZX0gKKworI2lmZGVmIENPTkZJR19TTVAKKworI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKworc3RydWN0IGNwdV90b3BvbG9neSB7CisJaW50IHRocmVhZF9pZDsKKwlpbnQgY29yZV9pZDsKKwlpbnQgY2x1c3Rlcl9pZDsKKwljcHVtYXNrX3QgdGhyZWFkX3NpYmxpbmc7CisJY3B1bWFza190IGNvcmVfc2libGluZzsKK307CisKK2V4dGVybiBzdHJ1Y3QgY3B1X3RvcG9sb2d5IGNwdV90b3BvbG9neVtOUl9DUFVTXTsKKworI2RlZmluZSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGNwdSkJKGNwdV90b3BvbG9neVtjcHVdLmNsdXN0ZXJfaWQpCisjZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkJKGNwdV90b3BvbG9neVtjcHVdLmNvcmVfaWQpCisjZGVmaW5lIHRvcG9sb2d5X2NvcmVfY3B1bWFzayhjcHUpCSgmY3B1X3RvcG9sb2d5W2NwdV0uY29yZV9zaWJsaW5nKQorI2RlZmluZSB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpCSgmY3B1X3RvcG9sb2d5W2NwdV0udGhyZWFkX3NpYmxpbmcpCisKKyNkZWZpbmUgbWNfY2FwYWJsZSgpCShjcHVfdG9wb2xvZ3lbMF0uY2x1c3Rlcl9pZCAhPSAtMSkKKyNkZWZpbmUgc210X2NhcGFibGUoKQkoY3B1X3RvcG9sb2d5WzBdLnRocmVhZF9pZCAhPSAtMSkKKwordm9pZCBpbml0X2NwdV90b3BvbG9neSh2b2lkKTsKK3ZvaWQgc3RvcmVfY3B1X3RvcG9sb2d5KHVuc2lnbmVkIGludCBjcHVpZCk7Citjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X2NvcmVncm91cF9tYXNrKGludCBjcHUpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9jcHVfdG9wb2xvZ3kodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfY3B1X3RvcG9sb2d5KHVuc2lnbmVkIGludCBjcHVpZCkgeyB9CisKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdG9wb2xvZ3kuaD4KKworI2VuZGlmIC8qIF9BU01fQVJNX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggNmMwZjY4NC4uM2JmOGY0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTgzLDcgKzgzLDcgQEAKICAqIFJldHVybnMgMSBpZiB0aGUgcmFuZ2UgaXMgdmFsaWQsIDAgb3RoZXJ3aXNlLgogICoKICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHRlc3Q6Ci0gKiAodTY1KWFkZHIgKyAodTY1KXNpemUgPCAodTY1KWN1cnJlbnQtPmFkZHJfbGltaXQKKyAqICh1NjUpYWRkciArICh1NjUpc2l6ZSA8PSBjdXJyZW50LT5hZGRyX2xpbWl0CiAgKgogICogVGhpcyBuZWVkcyA2NS1iaXQgYXJpdGhtZXRpYy4KICAqLwpAQCAtOTEsNyArOTEsNyBAQAogKHsJCQkJCQkJCQlcCiAJdW5zaWduZWQgbG9uZyBmbGFnLCByb2tzdW07CQkJCQlcCiAJX19jaGtfdXNlcl9wdHIoYWRkcik7CQkJCQkJXAotCWFzbSgiYWRkcyAlMSwgJTEsICUzOyBjY21wICUxLCAlNCwgIzIsIGNjOyBjc2V0ICUwLCBjYyIJCVwKKwlhc20oImFkZHMgJTEsICUxLCAlMzsgY2NtcCAlMSwgJTQsICMyLCBjYzsgY3NldCAlMCwgbHMiCQlcCiAJCTogIj0mciIgKGZsYWcpLCAiPSZyIiAocm9rc3VtKQkJCQlcCiAJCTogIjEiIChhZGRyKSwgIklyIiAoc2l6ZSksCQkJCVwKIAkJICAiciIgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdCkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDgyY2UyMTcuLmE0NjU0YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMTQsNiArMTQsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KICNpZmRlZiBDT05GSUdfQ09NUEFUCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfR0VUREVOVFM2NAogI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1RBVDY0CiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRIT1NUTkFNRQogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUEFVU0UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQgYi9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkCmluZGV4IGU0Yjc4YmQuLjk0MjM3NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZApAQCAtOSw2ICs5LDcgQEAKIGhlYWRlci15ICs9IGZjbnRsLmgKIGhlYWRlci15ICs9IGh3Y2FwLmgKIGhlYWRlci15ICs9IGt2bV9wYXJhLmgKK2hlYWRlci15ICs9IHBlcmZfcmVncy5oCiBoZWFkZXIteSArPSBwYXJhbS5oCiBoZWFkZXIteSArPSBwdHJhY2UuaAogaGVhZGVyLXkgKz0gc2V0dXAuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL3BlcmZfcmVncy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL3BlcmZfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmI4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20vcGVyZl9yZWdzLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfQVNNX0FSTTY0X1BFUkZfUkVHU19ICisjZGVmaW5lIF9BU01fQVJNNjRfUEVSRl9SRUdTX0gKKworZW51bSBwZXJmX2V2ZW50X2FybV9yZWdzIHsKKwlQRVJGX1JFR19BUk02NF9YMCwKKwlQRVJGX1JFR19BUk02NF9YMSwKKwlQRVJGX1JFR19BUk02NF9YMiwKKwlQRVJGX1JFR19BUk02NF9YMywKKwlQRVJGX1JFR19BUk02NF9YNCwKKwlQRVJGX1JFR19BUk02NF9YNSwKKwlQRVJGX1JFR19BUk02NF9YNiwKKwlQRVJGX1JFR19BUk02NF9YNywKKwlQRVJGX1JFR19BUk02NF9YOCwKKwlQRVJGX1JFR19BUk02NF9YOSwKKwlQRVJGX1JFR19BUk02NF9YMTAsCisJUEVSRl9SRUdfQVJNNjRfWDExLAorCVBFUkZfUkVHX0FSTTY0X1gxMiwKKwlQRVJGX1JFR19BUk02NF9YMTMsCisJUEVSRl9SRUdfQVJNNjRfWDE0LAorCVBFUkZfUkVHX0FSTTY0X1gxNSwKKwlQRVJGX1JFR19BUk02NF9YMTYsCisJUEVSRl9SRUdfQVJNNjRfWDE3LAorCVBFUkZfUkVHX0FSTTY0X1gxOCwKKwlQRVJGX1JFR19BUk02NF9YMTksCisJUEVSRl9SRUdfQVJNNjRfWDIwLAorCVBFUkZfUkVHX0FSTTY0X1gyMSwKKwlQRVJGX1JFR19BUk02NF9YMjIsCisJUEVSRl9SRUdfQVJNNjRfWDIzLAorCVBFUkZfUkVHX0FSTTY0X1gyNCwKKwlQRVJGX1JFR19BUk02NF9YMjUsCisJUEVSRl9SRUdfQVJNNjRfWDI2LAorCVBFUkZfUkVHX0FSTTY0X1gyNywKKwlQRVJGX1JFR19BUk02NF9YMjgsCisJUEVSRl9SRUdfQVJNNjRfWDI5LAorCVBFUkZfUkVHX0FSTTY0X0xSLAorCVBFUkZfUkVHX0FSTTY0X1NQLAorCVBFUkZfUkVHX0FSTTY0X1BDLAorCVBFUkZfUkVHX0FSTTY0X01BWCwKK307CisjZW5kaWYgLyogX0FTTV9BUk02NF9QRVJGX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZQppbmRleCAyZDQ1NTRiLi43ZDgxMWQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTQsMTIgKzE0LDE0IEBACiBhcm02NC1vYmotJChDT05GSUdfQ09NUEFUKQkJKz0gc3lzMzIubyBrdXNlcjMyLm8gc2lnbmFsMzIubyAJXAogCQkJCQkgICBzeXNfY29tcGF0Lm8KIGFybTY0LW9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gYXJtNjRrc3ltcy5vIG1vZHVsZS5vCi1hcm02NC1vYmotJChDT05GSUdfU01QKQkJCSs9IHNtcC5vIHNtcF9zcGluX3RhYmxlLm8KK2FybTY0LW9iai0kKENPTkZJR19TTVApCQkJKz0gc21wLm8gc21wX3NwaW5fdGFibGUubyB0b3BvbG9neS5vCithcm02NC1vYmotJChDT05GSUdfUEVSRl9FVkVOVFMpCQkrPSBwZXJmX3JlZ3MubwogYXJtNjQtb2JqLSQoQ09ORklHX0hXX1BFUkZfRVZFTlRTKQkrPSBwZXJmX2V2ZW50Lm8KLWFybTY0LW9iai0kKENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQpKz0gaHdfYnJlYWtwb2ludC5vCithcm02NC1vYmotJChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKQkrPSBod19icmVha3BvaW50Lm8KIGFybTY0LW9iai0kKENPTkZJR19FQVJMWV9QUklOVEspCSs9IGVhcmx5X3ByaW50ay5vCiBhcm02NC1vYmotJChDT05GSUdfQVJNNjRfQ1BVX1NVU1BFTkQpCSs9IHNsZWVwLm8gc3VzcGVuZC5vCiBhcm02NC1vYmotJChDT05GSUdfSlVNUF9MQUJFTCkJCSs9IGp1bXBfbGFiZWwubworYXJtNjQtb2JqLSQoQ09ORklHX0tHREIpCQkrPSBrZ2RiLm8KIAogb2JqLXkJCQkJCSs9ICQoYXJtNjQtb2JqLXkpIHZkc28vCiBvYmotbQkJCQkJKz0gJChhcm02NC1vYmotbSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2RlYnVnLW1vbml0b3JzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jCmluZGV4IDYzNmJhOGIuLjE0YmEyM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2RlYnVnLW1vbml0b3JzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvZGVidWctbW9uaXRvcnMuYwpAQCAtMTM3LDcgKzEzNyw2IEBACiBzdGF0aWMgdm9pZCBjbGVhcl9vc19sb2NrKHZvaWQgKnVudXNlZCkKIHsKIAlhc20gdm9sYXRpbGUoIm1zciBvc2xhcl9lbDEsICUwIiA6IDogInIiICgwKSk7Ci0JaXNiKCk7CiB9CiAKIHN0YXRpYyBpbnQgb3NfbG9ja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLApAQCAtMTU2LDggKzE1NSw5IEBACiBzdGF0aWMgaW50IGRlYnVnX21vbml0b3JzX2luaXQodm9pZCkKIHsKIAkvKiBDbGVhciB0aGUgT1MgbG9jay4gKi8KLQlzbXBfY2FsbF9mdW5jdGlvbihjbGVhcl9vc19sb2NrLCBOVUxMLCAxKTsKLQljbGVhcl9vc19sb2NrKE5VTEwpOworCW9uX2VhY2hfY3B1KGNsZWFyX29zX2xvY2ssIE5VTEwsIDEpOworCWlzYigpOworCWxvY2FsX2RiZ19lbmFibGUoKTsKIAogCS8qIFJlZ2lzdGVyIGhvdHBsdWcgaGFuZGxlci4gKi8KIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJm9zX2xvY2tfbmIpOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIC8qIEVMMSBTaW5nbGUgU3RlcCBIYW5kbGVyIGhvb2tzICovCiBzdGF0aWMgTElTVF9IRUFEKHN0ZXBfaG9vayk7Ci1ERUZJTkVfUldMT0NLKHN0ZXBfaG9va19sb2NrKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHN0ZXBfaG9va19sb2NrKTsKIAogdm9pZCByZWdpc3Rlcl9zdGVwX2hvb2soc3RydWN0IHN0ZXBfaG9vayAqaG9vaykKIHsKQEAgLTI3Niw3ICsyNzYsNyBAQAogICogVXNlIHJlYWRlci93cml0ZXIgbG9ja3MgaW5zdGVhZCBvZiBwbGFpbiBzcGlubG9jay4KICAqLwogc3RhdGljIExJU1RfSEVBRChicmVha19ob29rKTsKLURFRklORV9SV0xPQ0soYnJlYWtfaG9va19sb2NrKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGJyZWFrX2hvb2tfbG9jayk7CiAKIHZvaWQgcmVnaXN0ZXJfYnJlYWtfaG9vayhzdHJ1Y3QgYnJlYWtfaG9vayAqaG9vaykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvYXJtNjQva2VybmVsL2hlYWQuUwppbmRleCAwYjI4MWZmLi42MTAzNWQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvaGVhZC5TCkBAIC0zODQsMjYgKzM4NCwxOCBAQAogICogUHJlc2VydmVzOgl0YmwsIGZsYWdzCiAgKiBDb3JydXB0czoJcGh5cywgc3RhcnQsIGVuZCwgcHN0YXRlCiAgKi8KLQkubWFjcm8JY3JlYXRlX2Jsb2NrX21hcCwgdGJsLCBmbGFncywgcGh5cywgc3RhcnQsIGVuZCwgaWRtYXA9MAorCS5tYWNybwljcmVhdGVfYmxvY2tfbWFwLCB0YmwsIGZsYWdzLCBwaHlzLCBzdGFydCwgZW5kCiAJbHNyCVxwaHlzLCBccGh5cywgI0JMT0NLX1NISUZUCi0JLmlmCVxpZG1hcAotCWFuZAlcc3RhcnQsIFxwaHlzLCAjUFRSU19QRVJfUFRFIC0gMQkvLyB0YWJsZSBpbmRleAotCS5lbHNlCiAJbHNyCVxzdGFydCwgXHN0YXJ0LCAjQkxPQ0tfU0hJRlQKIAlhbmQJXHN0YXJ0LCBcc3RhcnQsICNQVFJTX1BFUl9QVEUgLSAxCS8vIHRhYmxlIGluZGV4Ci0JLmVuZGlmCiAJb3JyCVxwaHlzLCBcZmxhZ3MsIFxwaHlzLCBsc2wgI0JMT0NLX1NISUZUCS8vIHRhYmxlIGVudHJ5Ci0JLmlmbmMJXHN0YXJ0LFxlbmQKIAlsc3IJXGVuZCwgXGVuZCwgI0JMT0NLX1NISUZUCiAJYW5kCVxlbmQsIFxlbmQsICNQVFJTX1BFUl9QVEUgLSAxCQkvLyB0YWJsZSBlbmQgaW5kZXgKLQkuZW5kaWYKIDk5OTk6CXN0cglccGh5cywgW1x0YmwsIFxzdGFydCwgbHNsICMzXQkJLy8gc3RvcmUgdGhlIGVudHJ5Ci0JLmlmbmMJXHN0YXJ0LFxlbmQKIAlhZGQJXHN0YXJ0LCBcc3RhcnQsICMxCQkJLy8gbmV4dCBlbnRyeQogCWFkZAlccGh5cywgXHBoeXMsICNCTE9DS19TSVpFCQkvLyBuZXh0IGJsb2NrCiAJY21wCVxzdGFydCwgXGVuZAogCWIubHMJOTk5OWIKLQkuZW5kaWYKIAkuZW5kbQogCiAvKgpAQCAtNDM1LDkgKzQyNywxMyBAQAogCSAqIENyZWF0ZSB0aGUgaWRlbnRpdHkgbWFwcGluZy4KIAkgKi8KIAlhZGQJeDAsIHgyNSwgI1BBR0VfU0laRQkJLy8gc2VjdGlvbiB0YWJsZSBhZGRyZXNzCi0JYWRyCXgzLCBfX3R1cm5fbW11X29uCQkvLyB2aXJ0dWFsL3BoeXNpY2FsIGFkZHJlc3MKKwlsZHIJeDMsID1LRVJORUxfU1RBUlQKKwlhZGQJeDMsIHgzLCB4MjgJCQkvLyBfX3BhKEtFUk5FTF9TVEFSVCkKIAljcmVhdGVfcGdkX2VudHJ5IHgyNSwgeDAsIHgzLCB4NSwgeDYKLQljcmVhdGVfYmxvY2tfbWFwIHgwLCB4NywgeDMsIHg1LCB4NSwgaWRtYXA9MQorCWxkcgl4NiwgPUtFUk5FTF9FTkQKKwltb3YJeDUsIHgzCQkJCS8vIF9fcGEoS0VSTkVMX1NUQVJUKQorCWFkZAl4NiwgeDYsIHgyOAkJCS8vIF9fcGEoS0VSTkVMX0VORCkKKwljcmVhdGVfYmxvY2tfbWFwIHgwLCB4NywgeDMsIHg1LCB4NgogCiAJLyoKIAkgKiBNYXAgdGhlIGtlcm5lbCBpbWFnZSAoc3RhcnRpbmcgd2l0aCBQSFlTX09GRlNFVCkuCkBAIC00NDUsNyArNDQxLDcgQEAKIAlhZGQJeDAsIHgyNiwgI1BBR0VfU0laRQkJLy8gc2VjdGlvbiB0YWJsZSBhZGRyZXNzCiAJbW92CXg1LCAjUEFHRV9PRkZTRVQKIAljcmVhdGVfcGdkX2VudHJ5IHgyNiwgeDAsIHg1LCB4MywgeDYKLQlsZHIJeDYsID1LRVJORUxfRU5EIC0gMQorCWxkcgl4NiwgPUtFUk5FTF9FTkQKIAltb3YJeDMsIHgyNAkJCQkvLyBwaHlzIG9mZnNldAogCWNyZWF0ZV9ibG9ja19tYXAgeDAsIHg3LCB4MywgeDUsIHg2CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2tnZGIuYyBiL2FyY2gvYXJtNjQva2VybmVsL2tnZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM5Y2YxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwva2dkYi5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogQUFyY2g2NCBLR0RCIHN1cHBvcnQKKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9rZXJuZWwva2dkYi5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENhdml1bSBJbmMuCisgKiBBdXRob3I6IFZpamF5YSBLdW1hciBLIDx2aWpheWEua3VtYXJAY2F2aXVtbmV0d29ya3MuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKworc3RydWN0IGRiZ19yZWdfZGVmX3QgZGJnX3JlZ19kZWZbREJHX01BWF9SRUdfTlVNXSA9IHsKKwl7ICJ4MCIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzBdKX0sCisJeyAieDEiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1sxXSl9LAorCXsgIngyIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMl0pfSwKKwl7ICJ4MyIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzNdKX0sCisJeyAieDQiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1s0XSl9LAorCXsgIng1IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbNV0pfSwKKwl7ICJ4NiIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzZdKX0sCisJeyAieDciLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVnc1s3XSl9LAorCXsgIng4IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbOF0pfSwKKwl7ICJ4OSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWdzWzldKX0sCisJeyAieDEwIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTBdKX0sCisJeyAieDExIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTFdKX0sCisJeyAieDEyIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTJdKX0sCisJeyAieDEzIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTNdKX0sCisJeyAieDE0IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTRdKX0sCisJeyAieDE1IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTVdKX0sCisJeyAieDE2IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTZdKX0sCisJeyAieDE3IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTddKX0sCisJeyAieDE4IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMThdKX0sCisJeyAieDE5IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMTldKX0sCisJeyAieDIwIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjBdKX0sCisJeyAieDIxIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjFdKX0sCisJeyAieDIyIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjJdKX0sCisJeyAieDIzIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjNdKX0sCisJeyAieDI0IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjRdKX0sCisJeyAieDI1IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjVdKX0sCisJeyAieDI2IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjZdKX0sCisJeyAieDI3IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjddKX0sCisJeyAieDI4IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjhdKX0sCisJeyAieDI5IiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMjldKX0sCisJeyAieDMwIiwgOCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlZ3NbMzBdKX0sCisJeyAic3AiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3ApfSwKKwl7ICJwYyIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBwYyl9LAorCXsgInBzdGF0ZSIsIDgsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBwc3RhdGUpfSwKKwl7ICJ2MCIsIDE2LCAtMSB9LAorCXsgInYxIiwgMTYsIC0xIH0sCisJeyAidjIiLCAxNiwgLTEgfSwKKwl7ICJ2MyIsIDE2LCAtMSB9LAorCXsgInY0IiwgMTYsIC0xIH0sCisJeyAidjUiLCAxNiwgLTEgfSwKKwl7ICJ2NiIsIDE2LCAtMSB9LAorCXsgInY3IiwgMTYsIC0xIH0sCisJeyAidjgiLCAxNiwgLTEgfSwKKwl7ICJ2OSIsIDE2LCAtMSB9LAorCXsgInYxMCIsIDE2LCAtMSB9LAorCXsgInYxMSIsIDE2LCAtMSB9LAorCXsgInYxMiIsIDE2LCAtMSB9LAorCXsgInYxMyIsIDE2LCAtMSB9LAorCXsgInYxNCIsIDE2LCAtMSB9LAorCXsgInYxNSIsIDE2LCAtMSB9LAorCXsgInYxNiIsIDE2LCAtMSB9LAorCXsgInYxNyIsIDE2LCAtMSB9LAorCXsgInYxOCIsIDE2LCAtMSB9LAorCXsgInYxOSIsIDE2LCAtMSB9LAorCXsgInYyMCIsIDE2LCAtMSB9LAorCXsgInYyMSIsIDE2LCAtMSB9LAorCXsgInYyMiIsIDE2LCAtMSB9LAorCXsgInYyMyIsIDE2LCAtMSB9LAorCXsgInYyNCIsIDE2LCAtMSB9LAorCXsgInYyNSIsIDE2LCAtMSB9LAorCXsgInYyNiIsIDE2LCAtMSB9LAorCXsgInYyNyIsIDE2LCAtMSB9LAorCXsgInYyOCIsIDE2LCAtMSB9LAorCXsgInYyOSIsIDE2LCAtMSB9LAorCXsgInYzMCIsIDE2LCAtMSB9LAorCXsgInYzMSIsIDE2LCAtMSB9LAorCXsgImZwc3IiLCA0LCAtMSB9LAorCXsgImZwY3IiLCA0LCAtMSB9LAorfTsKKworY2hhciAqZGJnX2dldF9yZWcoaW50IHJlZ25vLCB2b2lkICptZW0sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZWdubyA+PSBEQkdfTUFYX1JFR19OVU0gfHwgcmVnbm8gPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0ICE9IC0xKQorCQltZW1jcHkobWVtLCAodm9pZCAqKXJlZ3MgKyBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0LAorCQkgICAgICAgZGJnX3JlZ19kZWZbcmVnbm9dLnNpemUpOworCWVsc2UKKwkJbWVtc2V0KG1lbSwgMCwgZGJnX3JlZ19kZWZbcmVnbm9dLnNpemUpOworCXJldHVybiBkYmdfcmVnX2RlZltyZWdub10ubmFtZTsKK30KKworaW50IGRiZ19zZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVnbm8gPj0gREJHX01BWF9SRUdfTlVNIHx8IHJlZ25vIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGJnX3JlZ19kZWZbcmVnbm9dLm9mZnNldCAhPSAtMSkKKwkJbWVtY3B5KCh2b2lkICopcmVncyArIGRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQsIG1lbSwKKwkJICAgICAgIGRiZ19yZWdfZGVmW3JlZ25vXS5zaXplKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorc2xlZXBpbmdfdGhyZWFkX3RvX2dkYl9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHB0X3JlZ3MgKnRocmVhZF9yZWdzOworCisJLyogSW5pdGlhbGl6ZSB0byB6ZXJvICovCisJbWVtc2V0KChjaGFyICopZ2RiX3JlZ3MsIDAsIE5VTVJFR0JZVEVTKTsKKwl0aHJlYWRfcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKKwltZW1jcHkoKHZvaWQgKilnZGJfcmVncywgKHZvaWQgKil0aHJlYWRfcmVncy0+cmVncywgR1BfUkVHX0JZVEVTKTsKK30KKwordm9pZCBrZ2RiX2FyY2hfc2V0X3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjKQoreworCXJlZ3MtPnBjID0gcGM7Cit9CisKK3N0YXRpYyBpbnQgY29tcGlsZWRfYnJlYWs7CisKK3N0YXRpYyB2b2lkIGtnZGJfYXJjaF91cGRhdGVfYWRkcihzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQljaGFyICpyZW1jb21faW5fYnVmZmVyKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwljaGFyICpwdHI7CisKKwlwdHIgPSAmcmVtY29tX2luX2J1ZmZlclsxXTsKKwlpZiAoa2dkYl9oZXgybG9uZygmcHRyLCAmYWRkcikpCisJCWtnZGJfYXJjaF9zZXRfcGMocmVncywgYWRkcik7CisJZWxzZSBpZiAoY29tcGlsZWRfYnJlYWsgPT0gMSkKKwkJa2dkYl9hcmNoX3NldF9wYyhyZWdzLCByZWdzLT5wYyArIDQpOworCisJY29tcGlsZWRfYnJlYWsgPSAwOworfQorCitpbnQga2dkYl9hcmNoX2hhbmRsZV9leGNlcHRpb24oaW50IGV4Y2VwdGlvbl92ZWN0b3IsIGludCBzaWdubywKKwkJCSAgICAgICBpbnQgZXJyX2NvZGUsIGNoYXIgKnJlbWNvbV9pbl9idWZmZXIsCisJCQkgICAgICAgY2hhciAqcmVtY29tX291dF9idWZmZXIsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKmxpbnV4X3JlZ3MpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAocmVtY29tX2luX2J1ZmZlclswXSkgeworCWNhc2UgJ0QnOgorCWNhc2UgJ2snOgorCQkvKgorCQkgKiBQYWNrZXQgRCAoRGV0YWNoKSwgayAoa2lsbCkuIE5vIHNwZWNpYWwgaGFuZGxpbmcKKwkJICogaXMgcmVxdWlyZWQgaGVyZS4gSGFuZGxlIHNhbWUgYXMgYyBwYWNrZXQuCisJCSAqLworCWNhc2UgJ2MnOgorCQkvKgorCQkgKiBQYWNrZXQgYyAoQ29udGludWUpIHRvIGNvbnRpbnVlIGV4ZWN1dGluZy4KKwkJICogU2V0IHBjIHRvIHJlcXVpcmVkIGFkZHJlc3MuCisJCSAqIFRyeSB0byByZWFkIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgc2V0IHBjLgorCQkgKiBJZiB0aGlzIHdhcyBhIGNvbXBpbGVkIGJyZWFrcG9pbnQsIHdlIG5lZWQgdG8gbW92ZQorCQkgKiB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBlbHNlIHdlIHdpbGwganVzdCBicmVha3BvaW50CisJCSAqIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisJCSAqLworCQlrZ2RiX2FyY2hfdXBkYXRlX2FkZHIobGludXhfcmVncywgcmVtY29tX2luX2J1ZmZlcik7CisJCWF0b21pY19zZXQoJmtnZGJfY3B1X2RvaW5nX3NpbmdsZV9zdGVwLCAtMSk7CisJCWtnZGJfc2luZ2xlX3N0ZXAgPSAgMDsKKworCQkvKgorCQkgKiBSZWNlaXZlZCBjb250aW51ZSBjb21tYW5kLCBkaXNhYmxlIHNpbmdsZSBzdGVwCisJCSAqLworCQlpZiAoa2VybmVsX2FjdGl2ZV9zaW5nbGVfc3RlcCgpKQorCQkJa2VybmVsX2Rpc2FibGVfc2luZ2xlX3N0ZXAoKTsKKworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlICdzJzoKKwkJLyoKKwkJICogVXBkYXRlIHN0ZXAgYWRkcmVzcyB2YWx1ZSB3aXRoIGFkZHJlc3MgcGFzc2VkCisJCSAqIHdpdGggc3RlcCBwYWNrZXQuCisJCSAqIE9uIGRlYnVnIGV4Y2VwdGlvbiByZXR1cm4gUEMgaXMgY29waWVkIHRvIEVMUgorCQkgKiBTbyBqdXN0IHVwZGF0ZSBQQy4KKwkJICogSWYgbm8gc3RlcCBhZGRyZXNzIGlzIHBhc3NlZCwgcmVzdW1lIGZyb20gdGhlIGFkZHJlc3MKKwkJICogcG9pbnRlZCBieSBQQy4gRG8gbm90IHVwZGF0ZSBQQworCQkgKi8KKwkJa2dkYl9hcmNoX3VwZGF0ZV9hZGRyKGxpbnV4X3JlZ3MsIHJlbWNvbV9pbl9idWZmZXIpOworCQlhdG9taWNfc2V0KCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWtnZGJfc2luZ2xlX3N0ZXAgPSAgMTsKKworCQkvKgorCQkgKiBFbmFibGUgc2luZ2xlIHN0ZXAgaGFuZGxpbmcKKwkJICovCisJCWlmICgha2VybmVsX2FjdGl2ZV9zaW5nbGVfc3RlcCgpKQorCQkJa2VybmVsX2VuYWJsZV9zaW5nbGVfc3RlcChsaW51eF9yZWdzKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLTE7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQga2dkYl9icmtfZm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBlc3IpCit7CisJa2dkYl9oYW5kbGVfZXhjZXB0aW9uKDEsIFNJR1RSQVAsIDAsIHJlZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtnZGJfY29tcGlsZWRfYnJrX2ZuKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgZXNyKQoreworCWNvbXBpbGVkX2JyZWFrID0gMTsKKwlrZ2RiX2hhbmRsZV9leGNlcHRpb24oMSwgU0lHVFJBUCwgMCwgcmVncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrZ2RiX3N0ZXBfYnJrX2ZuKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgZXNyKQoreworCWtnZGJfaGFuZGxlX2V4Y2VwdGlvbigxLCBTSUdUUkFQLCAwLCByZWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBicmVha19ob29rIGtnZGJfYnJrcHRfaG9vayA9IHsKKwkuZXNyX21hc2sJPSAweGZmZmZmZmZmLAorCS5lc3JfdmFsCT0gREJHX0VTUl9WQUxfQlJLKEtHREJfRFlOX0RHQl9CUktfSU1NKSwKKwkuZm4JCT0ga2dkYl9icmtfZm4KK307CisKK3N0YXRpYyBzdHJ1Y3QgYnJlYWtfaG9vayBrZ2RiX2NvbXBpbGVkX2Jya3B0X2hvb2sgPSB7CisJLmVzcl9tYXNrCT0gMHhmZmZmZmZmZiwKKwkuZXNyX3ZhbAk9IERCR19FU1JfVkFMX0JSSyhLREJHX0NPTVBJTEVEX0RCR19CUktfSU1NKSwKKwkuZm4JCT0ga2dkYl9jb21waWxlZF9icmtfZm4KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RlcF9ob29rIGtnZGJfc3RlcF9ob29rID0geworCS5mbgkJPSBrZ2RiX3N0ZXBfYnJrX2ZuCit9OworCitzdGF0aWMgdm9pZCBrZ2RiX2NhbGxfbm1pX2hvb2sodm9pZCAqaWdub3JlZCkKK3sKKwlrZ2RiX25taWNhbGxiYWNrKHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGdldF9pcnFfcmVncygpKTsKK30KKwordm9pZCBrZ2RiX3JvdW5kdXBfY3B1cyh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihrZ2RiX2NhbGxfbm1pX2hvb2ssIE5VTEwsIDApOworCWxvY2FsX2lycV9kaXNhYmxlKCk7Cit9CisKK3N0YXRpYyBpbnQgX19rZ2RiX25vdGlmeShzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MsIHVuc2lnbmVkIGxvbmcgY21kKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gYXJncy0+cmVnczsKKworCWlmIChrZ2RiX2hhbmRsZV9leGNlcHRpb24oMSwgYXJncy0+c2lnbnIsIGNtZCwgcmVncykpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKwlyZXR1cm4gTk9USUZZX1NUT1A7Cit9CisKK3N0YXRpYyBpbnQKK2tnZGJfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKnB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0ID0gX19rZ2RiX25vdGlmeShwdHIsIGNtZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrZ2RiX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0ga2dkYl9ub3RpZnksCisJLyoKKwkgKiBXYW50IHRvIGJlIGxvd2VzdCBwcmlvcml0eQorCSAqLworCS5wcmlvcml0eQk9IC1JTlRfTUFYLAorfTsKKworLyoKKyAqIGtnZGJfYXJjaF9pbml0IC0gUGVyZm9ybSBhbnkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGluaXRhbGl6YXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIHRoZSBpbml0YWxpemF0aW9uIG9mIGFueSBhcmNoaXRlY3R1cmUKKyAqIHNwZWNpZmljIGNhbGxiYWNrcy4KKyAqLworaW50IGtnZGJfYXJjaF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2dkYl9ub3RpZmllcik7CisKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlyZWdpc3Rlcl9icmVha19ob29rKCZrZ2RiX2Jya3B0X2hvb2spOworCXJlZ2lzdGVyX2JyZWFrX2hvb2soJmtnZGJfY29tcGlsZWRfYnJrcHRfaG9vayk7CisJcmVnaXN0ZXJfc3RlcF9ob29rKCZrZ2RiX3N0ZXBfaG9vayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBrZ2RiX2FyY2hfZXhpdCAtIFBlcmZvcm0gYW55IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB1bmluaXRhbGl6YXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIHRoZSB1bmluaXRhbGl6YXRpb24gb2YgYW55IGFyY2hpdGVjdHVyZQorICogc3BlY2lmaWMgY2FsbGJhY2tzLCBmb3IgZHluYW1pYyByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uLgorICovCit2b2lkIGtnZGJfYXJjaF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9icmVha19ob29rKCZrZ2RiX2Jya3B0X2hvb2spOworCXVucmVnaXN0ZXJfYnJlYWtfaG9vaygma2dkYl9jb21waWxlZF9icmtwdF9ob29rKTsKKwl1bnJlZ2lzdGVyX3N0ZXBfaG9vaygma2dkYl9zdGVwX2hvb2spOworCXVucmVnaXN0ZXJfZGllX25vdGlmaWVyKCZrZ2RiX25vdGlmaWVyKTsKK30KKworLyoKKyAqIEFSTSBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBpbiBMRS4KKyAqIEJyZWFrIGluc3RydWN0aW9uIGlzIGVuY29kZWQgaW4gTEUgZm9ybWF0CisgKi8KK3N0cnVjdCBrZ2RiX2FyY2ggYXJjaF9rZ2RiX29wcyA9IHsKKwkuZ2RiX2JwdF9pbnN0ciA9IHsKKwkJS0dEQl9EWU5fQlJLX0lOU19CWVRFMCwKKwkJS0dEQl9EWU5fQlJLX0lOU19CWVRFMSwKKwkJS0dEQl9EWU5fQlJLX0lOU19CWVRFMiwKKwkJS0dEQl9EWU5fQlJLX0lOU19CWVRFMywKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDViMWNkNzkuLmU4NjhjNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTEzNDgsOCArMTM0OCw4IEBACiAgKiBDYWxsY2hhaW4gaGFuZGxpbmcgY29kZS4KICAqLwogc3RydWN0IGZyYW1lX3RhaWwgewotCXN0cnVjdCBmcmFtZV90YWlsICAgX191c2VyICpmcDsKLQl1bnNpZ25lZCBsb25nCSAgICBscjsKKwlzdHJ1Y3QgZnJhbWVfdGFpbAlfX3VzZXIgKmZwOworCXVuc2lnbmVkIGxvbmcJCWxyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTEzODYsMjIgKzEzODYsODAgQEAKIAlyZXR1cm4gYnVmdGFpbC5mcDsKIH0KIAorLyoKKyAqIFRoZSByZWdpc3RlcnMgd2UncmUgaW50ZXJlc3RlZCBpbiBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgdmFyaWFibGUKKyAqIGxlbmd0aCBzYXZlZCByZWdpc3RlciBzdHJ1Y3R1cmUuIFRoZSBmcCBwb2ludHMgYXQgdGhlIGVuZCBvZiB0aGlzCisgKiBzdHJ1Y3R1cmUgc28gdGhlIGFkZHJlc3Mgb2YgdGhpcyBzdHJ1Y3QgaXM6CisgKiAoc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsICopKHh4eC0+ZnApLTEKKyAqCisgKiBUaGlzIGNvZGUgaGFzIGJlZW4gYWRhcHRlZCBmcm9tIHRoZSBBUk0gT1Byb2ZpbGUgc3VwcG9ydC4KKyAqLworc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsIHsKKwljb21wYXRfdXB0cl90CWZwOyAvKiBhIChzdHJ1Y3QgY29tcGF0X2ZyYW1lX3RhaWwgKikgaW4gY29tcGF0IG1vZGUgKi8KKwl1MzIJCXNwOworCXUzMgkJbHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsIF9fdXNlciAqCitjb21wYXRfdXNlcl9iYWNrdHJhY2Uoc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsIF9fdXNlciAqdGFpbCwKKwkJICAgICAgc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgY29tcGF0X2ZyYW1lX3RhaWwgYnVmdGFpbDsKKwl1bnNpZ25lZCBsb25nIGVycjsKKworCS8qIEFsc28gY2hlY2sgYWNjZXNzaWJpbGl0eSBvZiBvbmUgc3RydWN0IGZyYW1lX3RhaWwgYmV5b25kICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHRhaWwsIHNpemVvZihidWZ0YWlsKSkpCisJCXJldHVybiBOVUxMOworCisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKwllcnIgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCZidWZ0YWlsLCB0YWlsLCBzaXplb2YoYnVmdGFpbCkpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKworCWlmIChlcnIpCisJCXJldHVybiBOVUxMOworCisJcGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIGJ1ZnRhaWwubHIpOworCisJLyoKKwkgKiBGcmFtZSBwb2ludGVycyBzaG91bGQgc3RyaWN0bHkgcHJvZ3Jlc3MgYmFjayB1cCB0aGUgc3RhY2sKKwkgKiAodG93YXJkcyBoaWdoZXIgYWRkcmVzc2VzKS4KKwkgKi8KKwlpZiAodGFpbCArIDEgPj0gKHN0cnVjdCBjb21wYXRfZnJhbWVfdGFpbCBfX3VzZXIgKikKKwkJCWNvbXBhdF9wdHIoYnVmdGFpbC5mcCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIChzdHJ1Y3QgY29tcGF0X2ZyYW1lX3RhaWwgX191c2VyICopY29tcGF0X3B0cihidWZ0YWlsLmZwKSAtIDE7Cit9CisKIHZvaWQgcGVyZl9jYWxsY2hhaW5fdXNlcihzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5LAogCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBmcmFtZV90YWlsIF9fdXNlciAqdGFpbDsKLQogCWlmIChwZXJmX2d1ZXN0X2NicyAmJiBwZXJmX2d1ZXN0X2Nicy0+aXNfaW5fZ3Vlc3QoKSkgewogCQkvKiBXZSBkb24ndCBzdXBwb3J0IGd1ZXN0IG9zIGNhbGxjaGFpbiBub3cgKi8KIAkJcmV0dXJuOwogCX0KIAogCXBlcmZfY2FsbGNoYWluX3N0b3JlKGVudHJ5LCByZWdzLT5wYyk7Ci0JdGFpbCA9IChzdHJ1Y3QgZnJhbWVfdGFpbCBfX3VzZXIgKilyZWdzLT5yZWdzWzI5XTsKIAotCXdoaWxlIChlbnRyeS0+bnIgPCBQRVJGX01BWF9TVEFDS19ERVBUSCAmJgotCSAgICAgICB0YWlsICYmICEoKHVuc2lnbmVkIGxvbmcpdGFpbCAmIDB4ZikpCi0JCXRhaWwgPSB1c2VyX2JhY2t0cmFjZSh0YWlsLCBlbnRyeSk7CisJaWYgKCFjb21wYXRfdXNlcl9tb2RlKHJlZ3MpKSB7CisJCS8qIEFBUkNINjQgbW9kZSAqLworCQlzdHJ1Y3QgZnJhbWVfdGFpbCBfX3VzZXIgKnRhaWw7CisKKwkJdGFpbCA9IChzdHJ1Y3QgZnJhbWVfdGFpbCBfX3VzZXIgKilyZWdzLT5yZWdzWzI5XTsKKworCQl3aGlsZSAoZW50cnktPm5yIDwgUEVSRl9NQVhfU1RBQ0tfREVQVEggJiYKKwkJICAgICAgIHRhaWwgJiYgISgodW5zaWduZWQgbG9uZyl0YWlsICYgMHhmKSkKKwkJCXRhaWwgPSB1c2VyX2JhY2t0cmFjZSh0YWlsLCBlbnRyeSk7CisJfSBlbHNlIHsKKwkJLyogQUFSQ0gzMiBjb21wYXQgbW9kZSAqLworCQlzdHJ1Y3QgY29tcGF0X2ZyYW1lX3RhaWwgX191c2VyICp0YWlsOworCisJCXRhaWwgPSAoc3RydWN0IGNvbXBhdF9mcmFtZV90YWlsIF9fdXNlciAqKXJlZ3MtPmNvbXBhdF9mcCAtIDE7CisKKwkJd2hpbGUgKChlbnRyeS0+bnIgPCBQRVJGX01BWF9TVEFDS19ERVBUSCkgJiYKKwkJCXRhaWwgJiYgISgodW5zaWduZWQgbG9uZyl0YWlsICYgMHgzKSkKKwkJCXRhaWwgPSBjb21wYXRfdXNlcl9iYWNrdHJhY2UodGFpbCwgZW50cnkpOworCX0KIH0KIAogLyoKQEAgLTE0MjksNiArMTQ4Nyw3IEBACiAJZnJhbWUuZnAgPSByZWdzLT5yZWdzWzI5XTsKIAlmcmFtZS5zcCA9IHJlZ3MtPnNwOwogCWZyYW1lLnBjID0gcmVncy0+cGM7CisKIAl3YWxrX3N0YWNrZnJhbWUoJmZyYW1lLCBjYWxsY2hhaW5fdHJhY2UsIGVudHJ5KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9yZWdzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9wZXJmX3JlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQ2ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9yZWdzLmMKQEAgLTAsMCArMSw0NCBAQAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGFzbS9wZXJmX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKK3U2NCBwZXJmX3JlZ192YWx1ZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGlkeCkKK3sKKwlpZiAoV0FSTl9PTl9PTkNFKCh1MzIpaWR4ID49IFBFUkZfUkVHX0FSTTY0X01BWCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDb21wYXQgKGkuZS4gMzIgYml0KSBtb2RlOgorCSAqIC0gUEMgaGFzIGJlZW4gc2V0IGluIHRoZSBwdF9yZWdzIHN0cnVjdCBpbiBrZXJuZWxfZW50cnksCisJICogLSBIYW5kbGUgU1AgYW5kIExSIGhlcmUuCisJICovCisJaWYgKGNvbXBhdF91c2VyX21vZGUocmVncykpIHsKKwkJaWYgKCh1MzIpaWR4ID09IFBFUkZfUkVHX0FSTTY0X1NQKQorCQkJcmV0dXJuIHJlZ3MtPmNvbXBhdF9zcDsKKwkJaWYgKCh1MzIpaWR4ID09IFBFUkZfUkVHX0FSTTY0X0xSKQorCQkJcmV0dXJuIHJlZ3MtPmNvbXBhdF9scjsKKwl9CisKKwlyZXR1cm4gcmVncy0+cmVnc1tpZHhdOworfQorCisjZGVmaW5lIFJFR19SRVNFUlZFRCAofigoMVVMTCA8PCBQRVJGX1JFR19BUk02NF9NQVgpIC0gMSkpCisKK2ludCBwZXJmX3JlZ192YWxpZGF0ZSh1NjQgbWFzaykKK3sKKwlpZiAoIW1hc2sgfHwgbWFzayAmIFJFR19SRVNFUlZFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwordTY0IHBlcmZfcmVnX2FiaShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJaWYgKGlzX2NvbXBhdF90aHJlYWQodGFza190aHJlYWRfaW5mbyh0YXNrKSkpCisJCXJldHVybiBQRVJGX1NBTVBMRV9SRUdTX0FCSV8zMjsKKwllbHNlCisJCXJldHVybiBQRVJGX1NBTVBMRV9SRUdTX0FCSV82NDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCAxYzBhOWJlLi42MzkxNDg1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KQEAgLTcyLDggKzcxLDE3IEBACiAKIHZvaWQgc29mdF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKKwl0eXBlZGVmIHZvaWQgKCpwaHlzX3Jlc2V0X3QpKHVuc2lnbmVkIGxvbmcpOworCXBoeXNfcmVzZXRfdCBwaHlzX3Jlc2V0OworCiAJc2V0dXBfcmVzdGFydCgpOwotCWNwdV9yZXNldChhZGRyKTsKKworCS8qIFN3aXRjaCB0byB0aGUgaWRlbnRpdHkgbWFwcGluZyAqLworCXBoeXNfcmVzZXQgPSAocGh5c19yZXNldF90KXZpcnRfdG9fcGh5cyhjcHVfcmVzZXQpOworCXBoeXNfcmVzZXQoYWRkcik7CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwlCVUcoKTsKIH0KIAogLyoKQEAgLTk0LDEwICsxMDIsOCBAQAogCSAqIFRoaXMgc2hvdWxkIGRvIGFsbCB0aGUgY2xvY2sgc3dpdGNoaW5nIGFuZCB3YWl0IGZvciBpbnRlcnJ1cHQKIAkgKiB0cmlja3MKIAkgKi8KLQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkgewotCQljcHVfZG9faWRsZSgpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JfQorCWNwdV9kb19pZGxlKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9wc2NpLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9wc2NpLmMKaW5kZXggNGY5N2RiMy4uZWE0ODI4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvcHNjaS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3BzY2kuYwpAQCAtMTc2LDIyICsxNzYsMjAgQEAKIAl7fSwKIH07CiAKLWludCBfX2luaXQgcHNjaV9pbml0KHZvaWQpCit2b2lkIF9faW5pdCBwc2NpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCWNvbnN0IGNoYXIgKm1ldGhvZDsKIAl1MzIgaWQ7Ci0JaW50IGVyciA9IDA7CiAKIAlucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBwc2NpX29mX21hdGNoKTsKIAlpZiAoIW5wKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuOwogCiAJcHJfaW5mbygicHJvYmluZyBmdW5jdGlvbiBJRHMgZnJvbSBkZXZpY2UtdHJlZVxuIik7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJtZXRob2QiLCAmbWV0aG9kKSkgewogCQlwcl93YXJuaW5nKCJtaXNzaW5nIFwibWV0aG9kXCIgcHJvcGVydHlcbiIpOwotCQllcnIgPSAtRU5YSU87CiAJCWdvdG8gb3V0X3B1dF9ub2RlOwogCX0KIApAQCAtMjAxLDcgKzE5OSw2IEBACiAJCWludm9rZV9wc2NpX2ZuID0gX19pbnZva2VfcHNjaV9mbl9zbWM7CiAJfSBlbHNlIHsKIAkJcHJfd2FybmluZygiaW52YWxpZCBcIm1ldGhvZFwiIHByb3BlcnR5OiAlc1xuIiwgbWV0aG9kKTsKLQkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXRfcHV0X25vZGU7CiAJfQogCkBAIC0yMjcsNyArMjI0LDcgQEAKIAogb3V0X3B1dF9ub2RlOgogCW9mX25vZGVfcHV0KG5wKTsKLQlyZXR1cm4gZXJyOworCXJldHVybjsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTI1MSw3ICsyNDgsNyBAQAogewogCWludCBlcnIgPSBwc2NpX29wcy5jcHVfb24oY3B1X2xvZ2ljYWxfbWFwKGNwdSksIF9fcGEoc2Vjb25kYXJ5X2VudHJ5KSk7CiAJaWYgKGVycikKLQkJcHJfZXJyKCJwc2NpOiBmYWlsZWQgdG8gYm9vdCBDUFUlZCAoJWQpXG4iLCBjcHUsIGVycik7CisJCXByX2VycigiZmFpbGVkIHRvIGJvb3QgQ1BVJWQgKCVkKVxuIiwgY3B1LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI3OCw3ICsyNzUsNyBAQAogCiAJcmV0ID0gcHNjaV9vcHMuY3B1X29mZihzdGF0ZSk7CiAKLQlwcl9jcml0KCJwc2NpOiB1bmFibGUgdG8gcG93ZXIgb2ZmIENQVSV1ICglZClcbiIsIGNwdSwgcmV0KTsKKwlwcl9jcml0KCJ1bmFibGUgdG8gcG93ZXIgb2ZmIENQVSV1ICglZClcbiIsIGNwdSwgcmV0KTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYwppbmRleCBjOGU5ZWZmLi42N2RhMzA3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3NldHVwLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAkJCQkgQ09NUEFUX0hXQ0FQX1ZGUHYzfENPTVBBVF9IV0NBUF9WRlB2NHxcCiAJCQkJIENPTVBBVF9IV0NBUF9ORU9OfENPTVBBVF9IV0NBUF9JRElWKQogdW5zaWduZWQgaW50IGNvbXBhdF9lbGZfaHdjYXAgX19yZWFkX21vc3RseSA9IENPTVBBVF9FTEZfSFdDQVBfREVGQVVMVDsKK3Vuc2lnbmVkIGludCBjb21wYXRfZWxmX2h3Y2FwMiBfX3JlYWRfbW9zdGx5OwogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBjaGFyICpjcHVfbmFtZTsKQEAgLTI0Miw2ICsyNDMsMzggQEAKIAlibG9jayA9IChmZWF0dXJlcyA+PiAxNikgJiAweGY7CiAJaWYgKGJsb2NrICYmICEoYmxvY2sgJiAweDgpKQogCQllbGZfaHdjYXAgfD0gSFdDQVBfQ1JDMzI7CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLyoKKwkgKiBJRF9JU0FSNV9FTDEgY2FycmllcyBzaW1pbGFyIGluZm9ybWF0aW9uIGFzIGFib3ZlLCBidXQgcGVydGFpbmluZyB0bworCSAqIHRoZSBBYXJjaDMyIDMyLWJpdCBleGVjdXRpb24gc3RhdGUuCisJICovCisJZmVhdHVyZXMgPSByZWFkX2NwdWlkKElEX0lTQVI1X0VMMSk7CisJYmxvY2sgPSAoZmVhdHVyZXMgPj4gNCkgJiAweGY7CisJaWYgKCEoYmxvY2sgJiAweDgpKSB7CisJCXN3aXRjaCAoYmxvY2spIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSAyOgorCQkJY29tcGF0X2VsZl9od2NhcDIgfD0gQ09NUEFUX0hXQ0FQMl9QTVVMTDsKKwkJY2FzZSAxOgorCQkJY29tcGF0X2VsZl9od2NhcDIgfD0gQ09NUEFUX0hXQ0FQMl9BRVM7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJYmxvY2sgPSAoZmVhdHVyZXMgPj4gOCkgJiAweGY7CisJaWYgKGJsb2NrICYmICEoYmxvY2sgJiAweDgpKQorCQljb21wYXRfZWxmX2h3Y2FwMiB8PSBDT01QQVRfSFdDQVAyX1NIQTE7CisKKwlibG9jayA9IChmZWF0dXJlcyA+PiAxMikgJiAweGY7CisJaWYgKGJsb2NrICYmICEoYmxvY2sgJiAweDgpKQorCQljb21wYXRfZWxmX2h3Y2FwMiB8PSBDT01QQVRfSFdDQVAyX1NIQTI7CisKKwlibG9jayA9IChmZWF0dXJlcyA+PiAxNikgJiAweGY7CisJaWYgKGJsb2NrICYmICEoYmxvY2sgJiAweDgpKQorCQljb21wYXRfZWxmX2h3Y2FwMiB8PSBDT01QQVRfSFdDQVAyX0NSQzMyOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9tYWNoaW5lX2ZkdChwaHlzX2FkZHJfdCBkdF9waHlzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYwppbmRleCA3Y2ZiOTJhLi5mMGExNDFkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYwpAQCAtMTE0LDYgKzExNCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHNtcF9zdG9yZV9jcHVfaW5mbyh1bnNpZ25lZCBpbnQgY3B1aWQpCit7CisJc3RvcmVfY3B1X3RvcG9sb2d5KGNwdWlkKTsKK30KKwogLyoKICAqIFRoaXMgaXMgdGhlIHNlY29uZGFyeSBDUFUgYm9vdCBlbnRyeS4gIFdlJ3JlIHVzaW5nIHRoaXMgQ1BVcwogICogaWRsZSB0aHJlYWQgc3RhY2ssIGJ1dCBhIHNldCBvZiB0ZW1wb3JhcnkgcGFnZSB0YWJsZXMuCkBAIC0xNTIsNiArMTU3LDggQEAKIAkgKi8KIAlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7CiAKKwlzbXBfc3RvcmVfY3B1X2luZm8oY3B1KTsKKwogCS8qCiAJICogT0ssIG5vdyBpdCdzIHNhZmUgdG8gbGV0IHRoZSBib290IENQVSBjb250aW51ZS4gIFdhaXQgZm9yCiAJICogdGhlIENQVSBtaWdyYXRpb24gY29kZSB0byBub3RpY2UgdGhhdCB0aGUgQ1BVIGlzIG9ubGluZQpAQCAtMTYwLDYgKzE2Nyw3IEBACiAJc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKIAljb21wbGV0ZSgmY3B1X3J1bm5pbmcpOwogCisJbG9jYWxfZGJnX2VuYWJsZSgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlsb2NhbF9hc3luY19lbmFibGUoKTsKIApAQCAtMzkwLDYgKzM5OCwxMCBAQAogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IGNwdSwgbmNvcmVzID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKIAorCWluaXRfY3B1X3RvcG9sb2d5KCk7CisKKwlzbXBfc3RvcmVfY3B1X2luZm8oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwogCS8qCiAJICogYXJlIHdlIHRyeWluZyB0byBib290IG1vcmUgY29yZXMgdGhhbiBleGlzdD8KIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXBfc3Bpbl90YWJsZS5jCmluZGV4IDQ0YzIyODAuLjdhNTMwZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wX3NwaW5fdGFibGUuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJcmV0dXJuIHNlY29uZGFyeV9ob2xkaW5nX3Blbl9yZWxlYXNlICE9IElOVkFMSURfSFdJRCA/IC1FTk9TWVMgOiAwOwogfQogCi12b2lkIHNtcF9zcGluX3RhYmxlX2NwdV9wb3N0Ym9vdCh2b2lkKQorc3RhdGljIHZvaWQgc21wX3NwaW5fdGFibGVfY3B1X3Bvc3Rib290KHZvaWQpCiB7CiAJLyoKIAkgKiBMZXQgdGhlIHByaW1hcnkgcHJvY2Vzc29yIGtub3cgd2UncmUgb3V0IG9mIHRoZSBwZW4uCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvdG9wb2xvZ3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTA2YjBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogYXJjaC9hcm02NC9rZXJuZWwvdG9wb2xvZ3kuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwyMDEzLDIwMTQgTGluYXJvIExpbWl0ZWQuCisgKgorICogQmFzZWQgb24gdGhlIGFybTMyIHZlcnNpb24gd3JpdHRlbiBieSBWaW5jZW50IEd1aXR0b3QgaW4gdHVybiBiYXNlZCBvbgorICogYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KKworLyoKKyAqIGNwdSB0b3BvbG9neSB0YWJsZQorICovCitzdHJ1Y3QgY3B1X3RvcG9sb2d5IGNwdV90b3BvbG9neVtOUl9DUFVTXTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV90b3BvbG9neSk7CisKK2NvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfY29yZWdyb3VwX21hc2soaW50IGNwdSkKK3sKKwlyZXR1cm4gJmNwdV90b3BvbG9neVtjcHVdLmNvcmVfc2libGluZzsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3NpYmxpbmdzX21hc2tzKHVuc2lnbmVkIGludCBjcHVpZCkKK3sKKwlzdHJ1Y3QgY3B1X3RvcG9sb2d5ICpjcHVfdG9wbywgKmNwdWlkX3RvcG8gPSAmY3B1X3RvcG9sb2d5W2NwdWlkXTsKKwlpbnQgY3B1OworCisJaWYgKGNwdWlkX3RvcG8tPmNsdXN0ZXJfaWQgPT0gLTEpIHsKKwkJLyoKKwkJICogRFQgZG9lcyBub3QgY29udGFpbiB0b3BvbG9neSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjcHUKKwkJICogcmVzZXQgaXQgdG8gZGVmYXVsdCBiZWhhdmlvdXIKKwkJICovCisJCXByX2RlYnVnKCJDUFUldTogTm8gdG9wb2xvZ3kgaW5mb3JtYXRpb24gY29uZmlndXJlZFxuIiwgY3B1aWQpOworCQljcHVpZF90b3BvLT5jb3JlX2lkID0gMDsKKwkJY3B1bWFza19zZXRfY3B1KGNwdWlkLCAmY3B1aWRfdG9wby0+Y29yZV9zaWJsaW5nKTsKKwkJY3B1bWFza19zZXRfY3B1KGNwdWlkLCAmY3B1aWRfdG9wby0+dGhyZWFkX3NpYmxpbmcpOworCQlyZXR1cm47CisJfQorCisJLyogdXBkYXRlIGNvcmUgYW5kIHRocmVhZCBzaWJsaW5nIG1hc2tzICovCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQljcHVfdG9wbyA9ICZjcHVfdG9wb2xvZ3lbY3B1XTsKKworCQlpZiAoY3B1aWRfdG9wby0+Y2x1c3Rlcl9pZCAhPSBjcHVfdG9wby0+Y2x1c3Rlcl9pZCkKKwkJCWNvbnRpbnVlOworCisJCWNwdW1hc2tfc2V0X2NwdShjcHVpZCwgJmNwdV90b3BvLT5jb3JlX3NpYmxpbmcpOworCQlpZiAoY3B1ICE9IGNwdWlkKQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgJmNwdWlkX3RvcG8tPmNvcmVfc2libGluZyk7CisKKwkJaWYgKGNwdWlkX3RvcG8tPmNvcmVfaWQgIT0gY3B1X3RvcG8tPmNvcmVfaWQpCisJCQljb250aW51ZTsKKworCQljcHVtYXNrX3NldF9jcHUoY3B1aWQsICZjcHVfdG9wby0+dGhyZWFkX3NpYmxpbmcpOworCQlpZiAoY3B1ICE9IGNwdWlkKQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgJmNwdWlkX3RvcG8tPnRocmVhZF9zaWJsaW5nKTsKKwl9Cit9CisKK3ZvaWQgc3RvcmVfY3B1X3RvcG9sb2d5KHVuc2lnbmVkIGludCBjcHVpZCkKK3sKKwl1cGRhdGVfc2libGluZ3NfbWFza3MoY3B1aWQpOworfQorCisvKgorICogaW5pdF9jcHVfdG9wb2xvZ3kgaXMgY2FsbGVkIGF0IGJvb3Qgd2hlbiBvbmx5IG9uZSBjcHUgaXMgcnVubmluZworICogd2hpY2ggcHJldmVudCBzaW11bHRhbmVvdXMgd3JpdGUgYWNjZXNzIHRvIGNwdV90b3BvbG9neSBhcnJheQorICovCit2b2lkIF9faW5pdCBpbml0X2NwdV90b3BvbG9neSh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwkvKiBpbml0IGNvcmUgbWFzayBhbmQgcG93ZXIqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3RydWN0IGNwdV90b3BvbG9neSAqY3B1X3RvcG8gPSAmY3B1X3RvcG9sb2d5W2NwdV07CisKKwkJY3B1X3RvcG8tPnRocmVhZF9pZCA9IC0xOworCQljcHVfdG9wby0+Y29yZV9pZCA9ICAtMTsKKwkJY3B1X3RvcG8tPmNsdXN0ZXJfaWQgPSAtMTsKKwkJY3B1bWFza19jbGVhcigmY3B1X3RvcG8tPmNvcmVfc2libGluZyk7CisJCWNwdW1hc2tfY2xlYXIoJmNwdV90b3BvLT50aHJlYWRfc2libGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jCmluZGV4IGE3MTQ5Y2EuLjUwMzg0ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC92ZHNvLmMKQEAgLTEwNiw0OSArMTA2LDMxIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHZkc29faW5pdCh2b2lkKQogewotCXN0cnVjdCBwYWdlICpwZzsKLQljaGFyICp2YmFzZTsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgaTsKKworCWlmIChtZW1jbXAoJnZkc29fc3RhcnQsICJcMTc3RUxGIiwgNCkpIHsKKwkJcHJfZXJyKCJ2RFNPIGlzIG5vdCBhIHZhbGlkIEVMRiBvYmplY3QhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJdmRzb19wYWdlcyA9ICgmdmRzb19lbmQgLSAmdmRzb19zdGFydCkgPj4gUEFHRV9TSElGVDsKIAlwcl9pbmZvKCJ2ZHNvOiAlbGQgcGFnZXMgKCVsZCBjb2RlLCAlbGQgZGF0YSkgYXQgYmFzZSAlcFxuIiwKIAkJdmRzb19wYWdlcyArIDEsIHZkc29fcGFnZXMsIDFMLCAmdmRzb19zdGFydCk7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgdkRTTyBwYWdlbGlzdCwgcGx1cyBhIHBhZ2UgZm9yIHRoZSBkYXRhLiAqLwotCXZkc29fcGFnZWxpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqICh2ZHNvX3BhZ2VzICsgMSksCisJdmRzb19wYWdlbGlzdCA9IGtjYWxsb2ModmRzb19wYWdlcyArIDEsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAodmRzb19wYWdlbGlzdCA9PSBOVUxMKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIHZEU08gcGFnZWxpc3QhXG4iKTsKKwlpZiAodmRzb19wYWdlbGlzdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBHcmFiIHRoZSB2RFNPIGNvZGUgcGFnZXMuICovCi0JZm9yIChpID0gMDsgaSA8IHZkc29fcGFnZXM7IGkrKykgewotCQlwZyA9IHZpcnRfdG9fcGFnZSgmdmRzb19zdGFydCArIGkqUEFHRV9TSVpFKTsKLQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGcpOwotCQlnZXRfcGFnZShwZyk7Ci0JCXZkc29fcGFnZWxpc3RbaV0gPSBwZzsKLQl9Ci0KLQkvKiBTYW5pdHkgY2hlY2sgdGhlIHNoYXJlZCBvYmplY3QgaGVhZGVyLiAqLwotCXZiYXNlID0gdm1hcCh2ZHNvX3BhZ2VsaXN0LCAxLCAwLCBQQUdFX0tFUk5FTCk7Ci0JaWYgKHZiYXNlID09IE5VTEwpIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gbWFwIHZEU08gcGFnZWxpc3QhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfSBlbHNlIGlmIChtZW1jbXAodmJhc2UsICJcMTc3RUxGIiwgNCkpIHsKLQkJcHJfZXJyKCJ2RFNPIGlzIG5vdCBhIHZhbGlkIEVMRiBvYmplY3QhXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bm1hcDsKLQl9CisJZm9yIChpID0gMDsgaSA8IHZkc29fcGFnZXM7IGkrKykKKwkJdmRzb19wYWdlbGlzdFtpXSA9IHZpcnRfdG9fcGFnZSgmdmRzb19zdGFydCArIGkgKiBQQUdFX1NJWkUpOwogCiAJLyogR3JhYiB0aGUgdkRTTyBkYXRhIHBhZ2UuICovCi0JcGcgPSB2aXJ0X3RvX3BhZ2UodmRzb19kYXRhKTsKLQlnZXRfcGFnZShwZyk7Ci0JdmRzb19wYWdlbGlzdFtpXSA9IHBnOworCXZkc29fcGFnZWxpc3RbaV0gPSB2aXJ0X3RvX3BhZ2UodmRzb19kYXRhKTsKIAotdW5tYXA6Ci0JdnVubWFwKHZiYXNlKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogYXJjaF9pbml0Y2FsbCh2ZHNvX2luaXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAtaW5pdC5TIGIvYXJjaC9hcm02NC9rdm0vaHlwLWluaXQuUwppbmRleCAyYjAyNDRkLi5kOTY4Nzk2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAtaW5pdC5TCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC1pbml0LlMKQEAgLTY4LDYgKzY4LDEyIEBACiAJbXNyCXRjcl9lbDIsIHg0CiAKIAlsZHIJeDQsID1WVENSX0VMMl9GTEFHUworCS8qCisJICogUmVhZCB0aGUgUEFSYW5nZSBiaXRzIGZyb20gSURfQUE2NE1NRlIwX0VMMSBhbmQgc2V0IHRoZSBQUyBiaXRzIGluCisJICogVlRDUl9FTDIuCisJICovCisJbXJzCXg1LCBJRF9BQTY0TU1GUjBfRUwxCisJYmZpCXg0LCB4NSwgIzE2LCAjMwogCW1zcgl2dGNyX2VsMiwgeDQKIAogCW1ycwl4NCwgbWFpcl9lbDEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vY2FjaGUuUyBiL2FyY2gvYXJtNjQvbW0vY2FjaGUuUwppbmRleCAxZWE5ZjI2Li5jNDZmNDhiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2NhY2hlLlMKKysrIGIvYXJjaC9hcm02NC9tbS9jYWNoZS5TCkBAIC0zMCw3ICszMCw3IEBACiAgKgogICoJQ29ycnVwdGVkIHJlZ2lzdGVyczogeDAteDcsIHg5LXgxMQogICovCi1FTlRSWShfX2ZsdXNoX2RjYWNoZV9hbGwpCitfX2ZsdXNoX2RjYWNoZV9hbGw6CiAJZHNiCXN5CQkJCS8vIGVuc3VyZSBvcmRlcmluZyB3aXRoIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3NlcwogCW1ycwl4MCwgY2xpZHJfZWwxCQkJLy8gcmVhZCBjbGlkcgogCWFuZAl4MywgeDAsICMweDcwMDAwMDAJCS8vIGV4dHJhY3QgbG9jIGZyb20gY2xpZHIKQEAgLTE2NiwzICsxNjYsODEgQEAKIAlkc2IJc3kKIAlyZXQKIEVORFBST0MoX19mbHVzaF9kY2FjaGVfYXJlYSkKKworLyoKKyAqCV9fZG1hX2ludl9yYW5nZShzdGFydCwgZW5kKQorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqLworX19kbWFfaW52X3JhbmdlOgorCWRjYWNoZV9saW5lX3NpemUgeDIsIHgzCisJc3ViCXgzLCB4MiwgIzEKKwliaWMJeDAsIHgwLCB4MworCWJpYwl4MSwgeDEsIHgzCisxOglkYwlpdmFjLCB4MAkJCS8vIGludmFsaWRhdGUgRCAvIFUgbGluZQorCWFkZAl4MCwgeDAsIHgyCisJY21wCXgwLCB4MQorCWIubG8JMWIKKwlkc2IJc3kKKwlyZXQKK0VORFBST0MoX19kbWFfaW52X3JhbmdlKQorCisvKgorICoJX19kbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gZW5kICAgICAtIHZpcnR1YWwgZW5kIGFkZHJlc3Mgb2YgcmVnaW9uCisgKi8KK19fZG1hX2NsZWFuX3JhbmdlOgorCWRjYWNoZV9saW5lX3NpemUgeDIsIHgzCisJc3ViCXgzLCB4MiwgIzEKKwliaWMJeDAsIHgwLCB4MworMToJZGMJY3ZhYywgeDAJCQkvLyBjbGVhbiBEIC8gVSBsaW5lCisJYWRkCXgwLCB4MCwgeDIKKwljbXAJeDAsIHgxCisJYi5sbwkxYgorCWRzYglzeQorCXJldAorRU5EUFJPQyhfX2RtYV9jbGVhbl9yYW5nZSkKKworLyoKKyAqCV9fZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LCBlbmQpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCitFTlRSWShfX2RtYV9mbHVzaF9yYW5nZSkKKwlkY2FjaGVfbGluZV9zaXplIHgyLCB4MworCXN1Ygl4MywgeDIsICMxCisJYmljCXgwLCB4MCwgeDMKKzE6CWRjCWNpdmFjLCB4MAkJCS8vIGNsZWFuICYgaW52YWxpZGF0ZSBEIC8gVSBsaW5lCisJYWRkCXgwLCB4MCwgeDIKKwljbXAJeDAsIHgxCisJYi5sbwkxYgorCWRzYglzeQorCXJldAorRU5EUFJPQyhfX2RtYV9mbHVzaF9yYW5nZSkKKworLyoKKyAqCV9fZG1hX21hcF9hcmVhKHN0YXJ0LCBzaXplLCBkaXIpCisgKgktIHN0YXJ0CS0ga2VybmVsIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBzaXplCS0gc2l6ZSBvZiByZWdpb24KKyAqCS0gZGlyCS0gRE1BIGRpcmVjdGlvbgorICovCitFTlRSWShfX2RtYV9tYXBfYXJlYSkKKwlhZGQJeDEsIHgxLCB4MAorCWNtcAl3MiwgI0RNQV9GUk9NX0RFVklDRQorCWIuZXEJX19kbWFfaW52X3JhbmdlCisJYglfX2RtYV9jbGVhbl9yYW5nZQorRU5EUFJPQyhfX2RtYV9tYXBfYXJlYSkKKworLyoKKyAqCV9fZG1hX3VubWFwX2FyZWEoc3RhcnQsIHNpemUsIGRpcikKKyAqCS0gc3RhcnQJLSBrZXJuZWwgdmlydHVhbCBzdGFydCBhZGRyZXNzCisgKgktIHNpemUJLSBzaXplIG9mIHJlZ2lvbgorICoJLSBkaXIJLSBETUEgZGlyZWN0aW9uCisgKi8KK0VOVFJZKF9fZG1hX3VubWFwX2FyZWEpCisJYWRkCXgxLCB4MSwgeDAKKwljbXAJdzIsICNETUFfVE9fREVWSUNFCisJYi5uZQlfX2RtYV9pbnZfcmFuZ2UKKwlyZXQKK0VORFBST0MoX19kbWFfdW5tYXBfYXJlYSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYwppbmRleCBmYmQ3Njc4Li4wYmEzNDdlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCkBAIC0zMCwxOCArMzAsMjYgQEAKIHN0cnVjdCBkbWFfbWFwX29wcyAqZG1hX29wczsKIEVYUE9SVF9TWU1CT0woZG1hX29wcyk7CiAKLXN0YXRpYyB2b2lkICphcm02NF9zd2lvdGxiX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJCSAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZ3MsCi0JCQkJCSAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCitzdGF0aWMgcGdwcm90X3QgX19nZXRfZG1hX3BncHJvdChzdHJ1Y3QgZG1hX2F0dHJzICphdHRycywgcGdwcm90X3QgcHJvdCwKKwkJCQkgYm9vbCBjb2hlcmVudCkKK3sKKwlpZiAoIWNvaGVyZW50IHx8IGRtYV9nZXRfYXR0cihETUFfQVRUUl9XUklURV9DT01CSU5FLCBhdHRycykpCisJCXJldHVybiBwZ3Byb3Rfd3JpdGVjb21iaW5lKHByb3QpOworCXJldHVybiBwcm90OworfQorCitzdGF0aWMgdm9pZCAqX19kbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWdzLAorCQkJCSAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7CiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCVdBUk5fT05DRSgxLCAiVXNlIGFuIGFjdHVhbCBkZXZpY2Ugc3RydWN0dXJlIGZvciBETUEgYWxsb2NhdGlvblxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChJU19FTkFCTEVEKENPTkZJR19aT05FX0RNQTMyKSAmJgorCWlmIChJU19FTkFCTEVEKENPTkZJR19aT05FX0RNQSkgJiYKIAkgICAgZGV2LT5jb2hlcmVudF9kbWFfbWFzayA8PSBETUFfQklUX01BU0soMzIpKQotCQlmbGFncyB8PSBHRlBfRE1BMzI7CisJCWZsYWdzIHw9IEdGUF9ETUE7CiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX0RNQV9DTUEpKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwogCkBAIC01OCw5ICs2Niw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhcm02NF9zd2lvdGxiX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCitzdGF0aWMgdm9pZCBfX2RtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKIHsKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJV0FSTl9PTkNFKDEsICJVc2UgYW4gYWN0dWFsIGRldmljZSBzdHJ1Y3R1cmUgZm9yIERNQSBhbGxvY2F0aW9uXG4iKTsKQEAgLTc4LDkgKzg2LDIxMiBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBkbWFfbWFwX29wcyBhcm02NF9zd2lvdGxiX2RtYV9vcHMgPSB7Ci0JLmFsbG9jID0gYXJtNjRfc3dpb3RsYl9hbGxvY19jb2hlcmVudCwKLQkuZnJlZSA9IGFybTY0X3N3aW90bGJfZnJlZV9jb2hlcmVudCwKK3N0YXRpYyB2b2lkICpfX2RtYV9hbGxvY19ub25jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZ3MsCisJCQkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKiptYXA7CisJdm9pZCAqcHRyLCAqY29oZXJlbnRfcHRyOworCWludCBvcmRlciwgaTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCisJcHRyID0gX19kbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFncywgYXR0cnMpOworCWlmICghcHRyKQorCQlnb3RvIG5vX21lbTsKKwltYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSA8PCBvcmRlciwgZmxhZ3MgJiB+R0ZQX0RNQSk7CisJaWYgKCFtYXApCisJCWdvdG8gbm9fbWFwOworCisJLyogcmVtb3ZlIGFueSBkaXJ0eSBjYWNoZSBsaW5lcyBvbiB0aGUga2VybmVsIGFsaWFzICovCisJX19kbWFfZmx1c2hfcmFuZ2UocHRyLCBwdHIgKyBzaXplKTsKKworCS8qIGNyZWF0ZSBhIGNvaGVyZW50IG1hcHBpbmcgKi8KKwlwYWdlID0gdmlydF90b19wYWdlKHB0cik7CisJZm9yIChpID0gMDsgaSA8IChzaXplID4+IFBBR0VfU0hJRlQpOyBpKyspCisJCW1hcFtpXSA9IHBhZ2UgKyBpOworCWNvaGVyZW50X3B0ciA9IHZtYXAobWFwLCBzaXplID4+IFBBR0VfU0hJRlQsIFZNX01BUCwKKwkJCSAgICBfX2dldF9kbWFfcGdwcm90KGF0dHJzLCBwZ3Byb3RfZGVmYXVsdCwgZmFsc2UpKTsKKwlrZnJlZShtYXApOworCWlmICghY29oZXJlbnRfcHRyKQorCQlnb3RvIG5vX21hcDsKKworCXJldHVybiBjb2hlcmVudF9wdHI7CisKK25vX21hcDoKKwlfX2RtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgcHRyLCAqZG1hX2hhbmRsZSwgYXR0cnMpOworbm9fbWVtOgorCSpkbWFfaGFuZGxlID0gfjA7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZG1hX2ZyZWVfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCSAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCXZvaWQgKnN3aW90bGJfYWRkciA9IHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIGRtYV9oYW5kbGUpKTsKKworCXZ1bm1hcCh2YWRkcik7CisJX19kbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIHN3aW90bGJfYWRkciwgZG1hX2hhbmRsZSwgYXR0cnMpOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCBfX3N3aW90bGJfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCWRtYV9hZGRyX3QgZGV2X2FkZHI7CisKKwlkZXZfYWRkciA9IHN3aW90bGJfbWFwX3BhZ2UoZGV2LCBwYWdlLCBvZmZzZXQsIHNpemUsIGRpciwgYXR0cnMpOworCV9fZG1hX21hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIGRldl9hZGRyKSksIHNpemUsIGRpcik7CisKKwlyZXR1cm4gZGV2X2FkZHI7Cit9CisKKworc3RhdGljIHZvaWQgX19zd2lvdGxiX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJCSBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCSBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlfX2RtYV91bm1hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIGRldl9hZGRyKSksIHNpemUsIGRpcik7CisJc3dpb3RsYl91bm1hcF9wYWdlKGRldiwgZGV2X2FkZHIsIHNpemUsIGRpciwgYXR0cnMpOworfQorCitzdGF0aWMgaW50IF9fc3dpb3RsYl9tYXBfc2dfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJCQkgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGksIHJldDsKKworCXJldCA9IHN3aW90bGJfbWFwX3NnX2F0dHJzKGRldiwgc2dsLCBuZWxlbXMsIGRpciwgYXR0cnMpOworCWZvcl9lYWNoX3NnKHNnbCwgc2csIHJldCwgaSkKKwkJX19kbWFfbWFwX2FyZWEocGh5c190b192aXJ0KGRtYV90b19waHlzKGRldiwgc2ctPmRtYV9hZGRyZXNzKSksCisJCQkgICAgICAgc2ctPmxlbmd0aCwgZGlyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fc3dpb3RsYl91bm1hcF9zZ19hdHRycyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbGVtcywKKwkJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGk7CisKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpCisJCV9fZG1hX3VubWFwX2FyZWEocGh5c190b192aXJ0KGRtYV90b19waHlzKGRldiwgc2ctPmRtYV9hZGRyZXNzKSksCisJCQkJIHNnLT5sZW5ndGgsIGRpcik7CisJc3dpb3RsYl91bm1hcF9zZ19hdHRycyhkZXYsIHNnbCwgbmVsZW1zLCBkaXIsIGF0dHJzKTsKK30KKworc3RhdGljIHZvaWQgX19zd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIGRtYV9hZGRyX3QgZGV2X2FkZHIsIHNpemVfdCBzaXplLAorCQkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlfX2RtYV91bm1hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIGRldl9hZGRyKSksIHNpemUsIGRpcik7CisJc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgZGV2X2FkZHIsIHNpemUsIGRpcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBkbWFfYWRkcl90IGRldl9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgZGV2X2FkZHIsIHNpemUsIGRpcik7CisJX19kbWFfbWFwX2FyZWEocGh5c190b192aXJ0KGRtYV90b19waHlzKGRldiwgZGV2X2FkZHIpKSwgc2l6ZSwgZGlyKTsKK30KKworc3RhdGljIHZvaWQgX19zd2lvdGxiX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZWxlbXMsCisJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGk7CisKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpCisJCV9fZG1hX3VubWFwX2FyZWEocGh5c190b192aXJ0KGRtYV90b19waHlzKGRldiwgc2ctPmRtYV9hZGRyZXNzKSksCisJCQkJIHNnLT5sZW5ndGgsIGRpcik7CisJc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoZGV2LCBzZ2wsIG5lbGVtcywgZGlyKTsKK30KKworc3RhdGljIHZvaWQgX19zd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbGVtcywKKwkJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UoZGV2LCBzZ2wsIG5lbGVtcywgZGlyKTsKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpCisJCV9fZG1hX21hcF9hcmVhKHBoeXNfdG9fdmlydChkbWFfdG9fcGh5cyhkZXYsIHNnLT5kbWFfYWRkcmVzcykpLAorCQkJICAgICAgIHNnLT5sZW5ndGgsIGRpcik7Cit9CisKKy8qIHZtYS0+dm1fcGFnZV9wcm90IG11c3QgYmUgc2V0IGFwcHJvcHJpYXRlbHkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBfX2RtYV9jb21tb25fbW1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IC1FTlhJTzsKKwl1bnNpZ25lZCBsb25nIG5yX3ZtYV9wYWdlcyA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+CisJCQkJCVBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHBmbiA9IGRtYV90b19waHlzKGRldiwgZG1hX2FkZHIpID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBvZmYgPSB2bWEtPnZtX3Bnb2ZmOworCisJaWYgKGRtYV9tbWFwX2Zyb21fY29oZXJlbnQoZGV2LCB2bWEsIGNwdV9hZGRyLCBzaXplLCAmcmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvZmYgPCBucl9wYWdlcyAmJiBucl92bWFfcGFnZXMgPD0gKG5yX3BhZ2VzIC0gb2ZmKSkgeworCQlyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICAgIHBmbiArIG9mZiwKKwkJCQkgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgICAgdm1hLT52bV9wYWdlX3Byb3QpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19zd2lvdGxiX21tYXBfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fZ2V0X2RtYV9wZ3Byb3QoYXR0cnMsIHZtYS0+dm1fcGFnZV9wcm90LCBmYWxzZSk7CisJcmV0dXJuIF9fZG1hX2NvbW1vbl9tbWFwKGRldiwgdm1hLCBjcHVfYWRkciwgZG1hX2FkZHIsIHNpemUpOworfQorCitzdGF0aWMgaW50IF9fc3dpb3RsYl9tbWFwX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCXZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJLyogSnVzdCB1c2Ugd2hhdGV2ZXIgcGFnZV9wcm90IGF0dHJpYnV0ZXMgd2VyZSBzcGVjaWZpZWQgKi8KKwlyZXR1cm4gX19kbWFfY29tbW9uX21tYXAoZGV2LCB2bWEsIGNwdV9hZGRyLCBkbWFfYWRkciwgc2l6ZSk7Cit9CisKK3N0cnVjdCBkbWFfbWFwX29wcyBub25jb2hlcmVudF9zd2lvdGxiX2RtYV9vcHMgPSB7CisJLmFsbG9jID0gX19kbWFfYWxsb2Nfbm9uY29oZXJlbnQsCisJLmZyZWUgPSBfX2RtYV9mcmVlX25vbmNvaGVyZW50LAorCS5tbWFwID0gX19zd2lvdGxiX21tYXBfbm9uY29oZXJlbnQsCisJLm1hcF9wYWdlID0gX19zd2lvdGxiX21hcF9wYWdlLAorCS51bm1hcF9wYWdlID0gX19zd2lvdGxiX3VubWFwX3BhZ2UsCisJLm1hcF9zZyA9IF9fc3dpb3RsYl9tYXBfc2dfYXR0cnMsCisJLnVubWFwX3NnID0gX19zd2lvdGxiX3VubWFwX3NnX2F0dHJzLAorCS5zeW5jX3NpbmdsZV9mb3JfY3B1ID0gX19zd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUsCisJLnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UgPSBfX3N3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZSwKKwkuc3luY19zZ19mb3JfY3B1ID0gX19zd2lvdGxiX3N5bmNfc2dfZm9yX2NwdSwKKwkuc3luY19zZ19mb3JfZGV2aWNlID0gX19zd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZSwKKwkuZG1hX3N1cHBvcnRlZCA9IHN3aW90bGJfZG1hX3N1cHBvcnRlZCwKKwkubWFwcGluZ19lcnJvciA9IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IsCit9OworRVhQT1JUX1NZTUJPTChub25jb2hlcmVudF9zd2lvdGxiX2RtYV9vcHMpOworCitzdHJ1Y3QgZG1hX21hcF9vcHMgY29oZXJlbnRfc3dpb3RsYl9kbWFfb3BzID0geworCS5hbGxvYyA9IF9fZG1hX2FsbG9jX2NvaGVyZW50LAorCS5mcmVlID0gX19kbWFfZnJlZV9jb2hlcmVudCwKKwkubW1hcCA9IF9fc3dpb3RsYl9tbWFwX2NvaGVyZW50LAogCS5tYXBfcGFnZSA9IHN3aW90bGJfbWFwX3BhZ2UsCiAJLnVubWFwX3BhZ2UgPSBzd2lvdGxiX3VubWFwX3BhZ2UsCiAJLm1hcF9zZyA9IHN3aW90bGJfbWFwX3NnX2F0dHJzLApAQCAtOTIsMTIgKzMwMywxOSBAQAogCS5kbWFfc3VwcG9ydGVkID0gc3dpb3RsYl9kbWFfc3VwcG9ydGVkLAogCS5tYXBwaW5nX2Vycm9yID0gc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvciwKIH07CitFWFBPUlRfU1lNQk9MKGNvaGVyZW50X3N3aW90bGJfZG1hX29wcyk7CiAKLXZvaWQgX19pbml0IGFybTY0X3N3aW90bGJfaW5pdCh2b2lkKQorZXh0ZXJuIGludCBzd2lvdGxiX2xhdGVfaW5pdF93aXRoX2RlZmF1bHRfc2l6ZShzaXplX3QgZGVmYXVsdF9zaXplKTsKKworc3RhdGljIGludCBfX2luaXQgc3dpb3RsYl9sYXRlX2luaXQodm9pZCkKIHsKLQlkbWFfb3BzID0gJmFybTY0X3N3aW90bGJfZG1hX29wczsKLQlzd2lvdGxiX2luaXQoMSk7CisJc2l6ZV90IHN3aW90bGJfc2l6ZSA9IG1pbihTWl82NE0sIE1BWF9PUkRFUl9OUl9QQUdFUyA8PCBQQUdFX1NISUZUKTsKKworCWRtYV9vcHMgPSAmY29oZXJlbnRfc3dpb3RsYl9kbWFfb3BzOworCisJcmV0dXJuIHN3aW90bGJfbGF0ZV9pbml0X3dpdGhfZGVmYXVsdF9zaXplKHN3aW90bGJfc2l6ZSk7CiB9CitzdWJzeXNfaW5pdGNhbGwoc3dpb3RsYl9sYXRlX2luaXQpOwogCiAjZGVmaW5lIFBSRUFMTE9DX0RNQV9ERUJVR19FTlRSSUVTCTQwOTYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9pbml0LmMgYi9hcmNoL2FybTY0L21tL2luaXQuYwppbmRleCBkMGI0YzJlLi44ODYyN2M0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2luaXQuYworKysgYi9hcmNoL2FybTY0L21tL2luaXQuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWNvbnRpZ3VvdXMuaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgpAQCAtNTksMjIgKzYwLDIyIEBACiBlYXJseV9wYXJhbSgiaW5pdHJkIiwgZWFybHlfaW5pdHJkKTsKICNlbmRpZgogCi0jZGVmaW5lIE1BWF9ETUEzMl9QRk4gKCg0VUwgKiAxMDI0ICogMTAyNCAqIDEwMjQpID4+IFBBR0VfU0hJRlQpCi0KIHN0YXRpYyB2b2lkIF9faW5pdCB6b25lX3NpemVzX2luaXQodW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4KQogewogCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJlZzsKIAl1bnNpZ25lZCBsb25nIHpvbmVfc2l6ZVtNQVhfTlJfWk9ORVNdLCB6aG9sZV9zaXplW01BWF9OUl9aT05FU107Ci0JdW5zaWduZWQgbG9uZyBtYXhfZG1hMzIgPSBtaW47CisJdW5zaWduZWQgbG9uZyBtYXhfZG1hID0gbWluOwogCiAJbWVtc2V0KHpvbmVfc2l6ZSwgMCwgc2l6ZW9mKHpvbmVfc2l6ZSkpOwogCi0jaWZkZWYgQ09ORklHX1pPTkVfRE1BMzIKIAkvKiA0R0IgbWF4aW11bSBmb3IgMzItYml0IG9ubHkgY2FwYWJsZSBkZXZpY2VzICovCi0JbWF4X2RtYTMyID0gbWF4KG1pbiwgbWluKG1heCwgTUFYX0RNQTMyX1BGTikpOwotCXpvbmVfc2l6ZVtaT05FX0RNQTMyXSA9IG1heF9kbWEzMiAtIG1pbjsKLSNlbmRpZgotCXpvbmVfc2l6ZVtaT05FX05PUk1BTF0gPSBtYXggLSBtYXhfZG1hMzI7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHX1pPTkVfRE1BKSkgeworCQl1bnNpZ25lZCBsb25nIG1heF9kbWFfcGh5cyA9CisJCQkodW5zaWduZWQgbG9uZylkbWFfdG9fcGh5cyhOVUxMLCBETUFfQklUX01BU0soMzIpICsgMSk7CisJCW1heF9kbWEgPSBtYXgobWluLCBtaW4obWF4LCBtYXhfZG1hX3BoeXMgPj4gUEFHRV9TSElGVCkpOworCQl6b25lX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYSAtIG1pbjsKKwl9CisJem9uZV9zaXplW1pPTkVfTk9STUFMXSA9IG1heCAtIG1heF9kbWE7CiAKIAltZW1jcHkoemhvbGVfc2l6ZSwgem9uZV9zaXplLCBzaXplb2YoemhvbGVfc2l6ZSkpOwogCkBAIC04NCwxNSArODUsMTUgQEAKIAogCQlpZiAoc3RhcnQgPj0gbWF4KQogCQkJY29udGludWU7Ci0jaWZkZWYgQ09ORklHX1pPTkVfRE1BMzIKLQkJaWYgKHN0YXJ0IDwgbWF4X2RtYTMyKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGRtYV9lbmQgPSBtaW4oZW5kLCBtYXhfZG1hMzIpOwotCQkJemhvbGVfc2l6ZVtaT05FX0RNQTMyXSAtPSBkbWFfZW5kIC0gc3RhcnQ7CisKKwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX1pPTkVfRE1BKSAmJiBzdGFydCA8IG1heF9kbWEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZG1hX2VuZCA9IG1pbihlbmQsIG1heF9kbWEpOworCQkJemhvbGVfc2l6ZVtaT05FX0RNQV0gLT0gZG1hX2VuZCAtIHN0YXJ0OwogCQl9Ci0jZW5kaWYKLQkJaWYgKGVuZCA+IG1heF9kbWEzMikgeworCisJCWlmIChlbmQgPiBtYXhfZG1hKSB7CiAJCQl1bnNpZ25lZCBsb25nIG5vcm1hbF9lbmQgPSBtaW4oZW5kLCBtYXgpOwotCQkJdW5zaWduZWQgbG9uZyBub3JtYWxfc3RhcnQgPSBtYXgoc3RhcnQsIG1heF9kbWEzMik7CisJCQl1bnNpZ25lZCBsb25nIG5vcm1hbF9zdGFydCA9IG1heChzdGFydCwgbWF4X2RtYSk7CiAJCQl6aG9sZV9zaXplW1pPTkVfTk9STUFMXSAtPSBub3JtYWxfZW5kIC0gbm9ybWFsX3N0YXJ0OwogCQl9CiAJfQpAQCAtMjYxLDggKzI2Miw2IEBACiAgKi8KIHZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCiB7Ci0JYXJtNjRfc3dpb3RsYl9pbml0KCk7Ci0KIAltYXhfbWFwbnIgICA9IHBmbl90b19wYWdlKG1heF9wZm4gKyBQSFlTX1BGTl9PRkZTRVQpIC0gbWVtX21hcDsKIAogI2lmbmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vcHJvYy5TIGIvYXJjaC9hcm02NC9tbS9wcm9jLlMKaW5kZXggMTMzM2U2ZjkuLmUwODVlZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vcHJvYy5TCisrKyBiL2FyY2gvYXJtNjQvbW0vcHJvYy5TCkBAIC0xNzMsMTIgKzE3Myw2IEBACiAgKgl2YWx1ZSBvZiB0aGUgU0NUTFJfRUwxIHJlZ2lzdGVyLgogICovCiBFTlRSWShfX2NwdV9zZXR1cCkKLQkvKgotCSAqIFByZXNlcnZlIHRoZSBsaW5rIHJlZ2lzdGVyIGFjcm9zcyB0aGUgZnVuY3Rpb24gY2FsbC4KLQkgKi8KLQltb3YJeDI4LCBscgotCWJsCV9fZmx1c2hfZGNhY2hlX2FsbAotCW1vdglsciwgeDI4CiAJaWMJaWFsbHUJCQkJLy8gSStCVEIgY2FjaGUgaW52YWxpZGF0ZQogCXRsYmkJdm1hbGxlMWlzCQkJLy8gaW52YWxpZGF0ZSBJICsgRCBUTEJzCiAJZHNiCXN5CkBAIC0yMTUsOCArMjA5LDE0IEBACiAJICogU2V0L3ByZXBhcmUgVENSIGFuZCBUVEJSLiBXZSB1c2UgNTEyR0IgKDM5LWJpdCkgYWRkcmVzcyByYW5nZSBmb3IKIAkgKiBib3RoIHVzZXIgYW5kIGtlcm5lbC4KIAkgKi8KLQlsZHIJeDEwLCA9VENSX1R4U1ooVkFfQklUUykgfCBUQ1JfRkxBR1MgfCBUQ1JfSVBTXzQwQklUIHwgXAorCWxkcgl4MTAsID1UQ1JfVHhTWihWQV9CSVRTKSB8IFRDUl9GTEFHUyB8IFwKIAkJICAgICAgVENSX0FTSUQxNiB8IFRDUl9UQkkwIHwgKDEgPDwgMzEpCisJLyoKKwkgKiBSZWFkIHRoZSBQQVJhbmdlIGJpdHMgZnJvbSBJRF9BQTY0TU1GUjBfRUwxIGFuZCBzZXQgdGhlIElQUyBiaXRzIGluCisJICogVENSX0VMMS4KKwkgKi8KKwltcnMJeDksIElEX0FBNjRNTUZSMF9FTDEKKwliZmkJeDEwLCB4OSwgIzMyLCAjMwogI2lmZGVmIENPTkZJR19BUk02NF82NEtfUEFHRVMKIAlvcnIJeDEwLCB4MTAsIFRDUl9URzBfNjRLCiAJb3JyCXgxMCwgeDEwLCBUQ1JfVEcxXzY0SwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9NYWtlZmlsZSBiL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvTWFrZWZpbGUKaW5kZXggNzljMDc2ZS4uYzc0MGFhMSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9NYWtlZmlsZQorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL01ha2VmaWxlCkBAIC0xICsxIEBACi1vYmoteQkJCQkrPSBzZXR1cC5vIGZsYXNoLm8gZnJhbS5vCitvYmoteQkJCQkrPSBzZXR1cC5vIGZsYXNoLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvZnJhbS5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9mcmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDY2YTguLjAwMDAwMDAKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9mcmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogRlJBTSBkcml2ZXIgZm9yIE1JTUMyMDAgYm9hcmQKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBNYXJrIEphY2tzb24gPG1wZmpAbWltYy5jby51az4KLSAqCi0gKiBUaGlzIG1vZHVsZSBhZGRzICp2ZXJ5KiBzaW1wbHkgc3VwcG9ydCBmb3IgdGhlIHN5c3RlbSdzIEZSQU0gZGV2aWNlLgotICogQXQgdGhlIG1vbWVudCwgdGhpcyBpcyBoYXJkLWNvZGVkIHRvIHRoZSBNSU1DMjAwIHBsYXRmb3JtLCBhbmQgb25seQotICogc3VwcG9ydHMgbW1hcCgpLgotICovCi0KLSNkZWZpbmUgRlJBTV9WRVJTSU9OCSIxLjAiCi0KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2RlZmluZSBGUkFNX0JBU0UJMHhhYzAwMDAwMAotI2RlZmluZSBGUkFNX1NJWkUJMHgyMDAwMAotCi0vKgotICogVGhlIGFyZSB0aGUgZmlsZSBvcGVyYXRpb24gZnVuY3Rpb24gZm9yIHVzZXIgYWNjZXNzIHRvIC9kZXYvZnJhbQotICovCi0KLXN0YXRpYyBpbnQgZnJhbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwKLQkJdm1hLT52bV9zdGFydCwKLQkJdmlydF90b19waHlzKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKUZSQU1fQkFTRSkpID4+IFBBR0VfU0hJRlQsCi0JCXZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQsCi0JCVBBR0VfU0hBUkVEKTsKLQotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnJhbV9mb3BzID0gewotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLm1tYXAJCQk9IGZyYW1fbW1hcCwKLQkubGxzZWVrCQkJPSBub29wX2xsc2VlaywKLX07Ci0KLSNkZWZpbmUgRlJBTV9NSU5PUgkwCi0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBmcmFtX2RldiA9IHsKLQlGUkFNX01JTk9SLAotCSJmcmFtIiwKLQkmZnJhbV9mb3BzCi19OwotCi1zdGF0aWMgaW50IF9faW5pdAotZnJhbV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmZyYW1fZGV2KTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZnJhbTogY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwKLQkJICAgIEZSQU1fTUlOT1IpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJGUkFNIG1lbW9yeSBkcml2ZXIgdiIgRlJBTV9WRVJTSU9OICJcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWZyYW1fY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmZyYW1fZGV2KTsKLX0KLQotbW9kdWxlX2luaXQoZnJhbV9pbml0KTsKLW1vZHVsZV9leGl0KGZyYW1fY2xlYW51cF9tb2R1bGUpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLU1PRFVMRV9BTElBU19NSVNDREVWKEZSQU1fTUlOT1IpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBjN2M2NGE2Li4wMGEwZjNjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwyMiArMSwyMyBAQAogCi1nZW5lcmljLXkJKz0gY2xrZGV2LmgKLWdlbmVyaWMteSAgICAgICArPSBjcHV0aW1lLmgKLWdlbmVyaWMteSAgICAgICArPSBkZWxheS5oCi1nZW5lcmljLXkgICAgICAgKz0gZGV2aWNlLmgKLWdlbmVyaWMteSAgICAgICArPSBkaXY2NC5oCi1nZW5lcmljLXkgICAgICAgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAotZ2VuZXJpYy15CSs9IGV4ZWMuaAotZ2VuZXJpYy15ICAgICAgICs9IGZ1dGV4LmgKLWdlbmVyaWMteQkrPSBwcmVlbXB0LmgKLWdlbmVyaWMteSAgICAgICArPSBpcnFfcmVncy5oCi1nZW5lcmljLXkJKz0gcGFyYW0uaAotZ2VuZXJpYy15ICAgICAgICs9IGxvY2FsLmgKLWdlbmVyaWMteSAgICAgICArPSBsb2NhbDY0LmgKLWdlbmVyaWMteSAgICAgICArPSBwZXJjcHUuaAotZ2VuZXJpYy15ICAgICAgICs9IHNjYXR0ZXJsaXN0LmgKLWdlbmVyaWMteSAgICAgICArPSBzZWN0aW9ucy5oCi1nZW5lcmljLXkgICAgICAgKz0gdG9wb2xvZ3kuaAotZ2VuZXJpYy15CSs9IHRyYWNlX2Nsb2NrLmgKK2dlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IGRlbGF5LmgKK2dlbmVyaWMteSArPSBkZXZpY2UuaAorZ2VuZXJpYy15ICs9IGRpdjY0LmgKK2dlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCitnZW5lcmljLXkgKz0gZXhlYy5oCitnZW5lcmljLXkgKz0gZnV0ZXguaAorZ2VuZXJpYy15ICs9IGhhc2guaAorZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKK2dlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKK2dlbmVyaWMteSArPSBwYXJhbS5oCitnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKK2dlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCitnZW5lcmljLXkgKz0gc2VjdGlvbnMuaAorZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKK2dlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCiBnZW5lcmljLXkgKz0gdmdhLmgKLWdlbmVyaWMteSAgICAgICArPSB4b3IuaAotZ2VuZXJpYy15CSs9IGhhc2guaAorZ2VuZXJpYy15ICs9IHhvci5oCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J1Z3MuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnVncy5oCmluZGV4IDc2MzVlNzcuLjI3ODY2MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnVncy5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnVncy5oCkBAIC05LDcgKzksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfYnVncyh2b2lkKQogewotCWNwdV9kYXRhLT5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CisJYm9vdF9jcHVfZGF0YS5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CiB9CiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9CVUdTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDQ4ZDcxYzUuLjk3MmFkY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtODMsMTMgKzgzLDggQEAKIAogZXh0ZXJuIHN0cnVjdCBhdnIzMl9jcHVpbmZvIGJvb3RfY3B1X2RhdGE7CiAKLSNpZmRlZiBDT05GSUdfU01QCi1leHRlcm4gc3RydWN0IGF2cjMyX2NwdWluZm8gY3B1X2RhdGFbXTsKLSNkZWZpbmUgY3VycmVudF9jcHVfZGF0YSBjcHVfZGF0YVtzbXBfcHJvY2Vzc29yX2lkKCldCi0jZWxzZQotI2RlZmluZSBjcHVfZGF0YSAoJmJvb3RfY3B1X2RhdGEpCisvKiBObyBTTVAgc3VwcG9ydCBzbyBmYXIgKi8KICNkZWZpbmUgY3VycmVudF9jcHVfZGF0YSBib290X2NwdV9kYXRhCi0jZW5kaWYKIAogLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQogICogc3BhY2UgZHVyaW5nIG1tYXAncwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9jcHUuYwppbmRleCAyMjMzYmU3Li4wMzQxYWUyIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9jcHUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9jcHUuYwpAQCAtMzksMTAgKzM5LDEyIEBACiAJCQkgICAgICBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciAqZW5kcDsKKwlpbnQgcmV0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0JaWYgKGVuZHAgPT0gYnVmIHx8IHZhbCA+IDB4M2YpCisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgPiAweDNmKQogCQlyZXR1cm4gLUVJTlZBTDsKIAl2YWwgPSAodmFsIDw8IDEyKSB8IChzeXNyZWdfcmVhZChQQ0NSKSAmIDB4ZmZmYzBmZmYpOwogCXN5c3JlZ193cml0ZShQQ0NSLCB2YWwpOwpAQCAtNjEsMTEgKzYzLDExIEBACiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciAqZW5kcDsKKwlpbnQgcmV0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0JaWYgKGVuZHAgPT0gYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJc3lzcmVnX3dyaXRlKFBDTlQwLCB2YWwpOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtODQsMTAgKzg2LDEyIEBACiAJCQkgICAgICBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciAqZW5kcDsKKwlpbnQgcmV0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0JaWYgKGVuZHAgPT0gYnVmIHx8IHZhbCA+IDB4M2YpCisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgPiAweDNmKQogCQlyZXR1cm4gLUVJTlZBTDsKIAl2YWwgPSAodmFsIDw8IDE4KSB8IChzeXNyZWdfcmVhZChQQ0NSKSAmIDB4ZmYwM2ZmZmYpOwogCXN5c3JlZ193cml0ZShQQ0NSLCB2YWwpOwpAQCAtMTA2LDExICsxMTAsMTEgQEAKIAkJCSAgICAgIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyICplbmRwOworCWludCByZXQ7CiAKLQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlpZiAoZW5kcCA9PSBidWYpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAlzeXNyZWdfd3JpdGUoUENOVDEsIHZhbCk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xMjksMTEgKzEzMywxMSBAQAogCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWNoYXIgKmVuZHA7CisJaW50IHJldDsKIAotCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IGJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCXN5c3JlZ193cml0ZShQQ0NOVCwgdmFsKTsKIAogCXJldHVybiBjb3VudDsKQEAgLTE1MiwxMSArMTU2LDExIEBACiAJCQkgICAgICBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBwY2NyLCB2YWw7Ci0JY2hhciAqZW5kcDsKKwlpbnQgcmV0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0JaWYgKGVuZHAgPT0gYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJaWYgKHZhbCkKIAkJdmFsID0gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS9jYWNoZS5jIGIvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCmluZGV4IDZhNDZlY2QuLjg1ZDYzNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vY2FjaGUuYworKysgYi9hcmNoL2F2cjMyL21tL2NhY2hlLmMKQEAgLTExMSw2ICsxMTEsNyBAQAogCV9fZmx1c2hfaWNhY2hlX3JhbmdlKHN0YXJ0ICYgfihsaW5lc3ogLSAxKSwKIAkJCSAgICAgKGVuZCArIGxpbmVzeiAtIDEpICYgfihsaW5lc3ogLSAxKSk7CiB9CitFWFBPUlRfU1lNQk9MKGZsdXNoX2ljYWNoZV9yYW5nZSk7CiAKIC8qCiAgKiBUaGlzIG9uZSBpcyBjYWxsZWQgZnJvbSBfX2RvX2ZhdWx0KCkgYW5kIGRvX3N3YXBfcGFnZSgpLgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAzNTlkMzZmLi4wZDkzYjlhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTAsNiArMTAsNyBAQAogZ2VuZXJpYy15ICs9IGVycm5vLmgKIGdlbmVyaWMteSArPSBmYi5oCiBnZW5lcmljLXkgKz0gZnV0ZXguaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGh3X2lycS5oCiBnZW5lcmljLXkgKz0gaW9jdGwuaAogZ2VuZXJpYy15ICs9IGlwY2J1Zi5oCkBAIC0xNywxNCArMTgsMTYgQEAKIGdlbmVyaWMteSArPSBrZGVidWcuaAogZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAogZ2VuZXJpYy15ICs9IGt2bV9wYXJhLmgKLWdlbmVyaWMteSArPSBsb2NhbDY0LmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtbWFuLmgKIGdlbmVyaWMteSArPSBtc2didWYuaAogZ2VuZXJpYy15ICs9IG11dGV4LmgKIGdlbmVyaWMteSArPSBwYXJhbS5oCiBnZW5lcmljLXkgKz0gcGVyY3B1LmgKIGdlbmVyaWMteSArPSBwZ2FsbG9jLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCkBAIC00NCw1ICs0NywzIEBACiBnZW5lcmljLXkgKz0gdW5hbGlnbmVkLmgKIGdlbmVyaWMteSArPSB1c2VyLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggMmZkMDRmMS4uODlkZTUzOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0yMCwxNSArMjAsNiBAQAogLyogU1lTX0lSUVMgYW5kIE5SX0lSUVMgYXJlIGRlZmluZWQgaW4gPG1hY2gtYmY1eHgvaXJxLmg+ICovCiAjaW5jbHVkZSA8bWFjaC9pcnEuaD4KIAotLyoKLSAqIHBtIHNhdmUgYmZpbiBwaW50IHJlZ2lzdGVycwotICovCi1zdHJ1Y3QgYWRpX3BtX3BpbnRfc2F2ZSB7Ci0JdTMyIGFzc2lnbjsKLQl1MzIgZWRnZV9zZXQ7Ci0JdTMyIGludmVydF9zZXQ7Ci19OwotCiAjaWYgQU5PTUFMWV8wNTAwMDI0NCAmJiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKICMgZGVmaW5lIE5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NCAibm9wOyBub3A7IgogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYzZ4L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYzZ4L2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBkNzNiYjg1Li44ZGJkY2U4IDEwMDY0NAotLS0gYS9hcmNoL2M2eC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9jNngvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xNSw2ICsxNSw3IEBACiBnZW5lcmljLXkgKz0gZmIuaAogZ2VuZXJpYy15ICs9IGZjbnRsLmgKIGdlbmVyaWMteSArPSBmdXRleC5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaHdfaXJxLmgKIGdlbmVyaWMteSArPSBpby5oCiBnZW5lcmljLXkgKz0gaW9jdGwuaApAQCAtMjQsNiArMjUsNyBAQAogZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCiBnZW5lcmljLXkgKz0ga21hcF90eXBlcy5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbW1hbi5oCiBnZW5lcmljLXkgKz0gbW11LmgKIGdlbmVyaWMteSArPSBtbXVfY29udGV4dC5oCkBAIC0zNCw2ICszNiw3IEBACiBnZW5lcmljLXkgKz0gcGdhbGxvYy5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCiBnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCiBnZW5lcmljLXkgKz0gc2VnbWVudC5oCkBAIC01Niw1ICs1OSwzIEBACiBnZW5lcmljLXkgKz0gdXNlci5oCiBnZW5lcmljLXkgKz0gdmdhLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggZjNmZDg3Ni4uYWZmZjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC01LDEyICs1LDE0IEBACiAKIGdlbmVyaWMteSArPSBiYXJyaWVyLmgKIGdlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAogZ2VuZXJpYy15ICs9IGV4ZWMuaAogZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGt2bV9wYXJhLmgKIGdlbmVyaWMteSArPSBsaW5rYWdlLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1vZHVsZS5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHZnYS5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ2YTY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19DUklTX0NQVVRJTUVfSAotI2RlZmluZSBfX0NSSVNfQ1BVVElNRV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+Ci0KLSNlbmRpZiAvKiBfX0NSSVNfQ1BVVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYmM0MmYxNC4uODdiOTVlYiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw2ICsxLDggQEAKIAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCi1nZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IGhhc2guaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmMzNzNhLi4wMDAwMDAwCi0tLSBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX0NQVVRJTUVfSAotI2RlZmluZSBfQVNNX0NQVVRJTUVfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgotCi0jZW5kaWYgLyogX0FTTV9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmMgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5jCmluZGV4IGMyODEyMTcuLjY3YjFkMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmMKKysrIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYwpAQCAtODgsNyArODgsNyBAQAogCiAJLyogRGVwdGgtRmlyc3QgU2VhcmNoIG9uIGJ1cyB0cmVlICovCiAJZm9yIChsbj1idXNfbGlzdC0+bmV4dDsgbG4gIT0gYnVzX2xpc3Q7IGxuPWxuLT5uZXh0KSB7Ci0JCWJ1cyA9IHBjaV9idXNfYihsbik7CisJCWJ1cyA9IGxpc3RfZW50cnkobG4sIHN0cnVjdCBwY2lfYnVzLCBub2RlKTsKIAkJaWYgKChkZXYgPSBidXMtPnNlbGYpKSB7CiAJCQlmb3IgKGlkeCA9IFBDSV9CUklER0VfUkVTT1VSQ0VTOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKIAkJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDM4Y2E0NWQuLmVhZGNjMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMjUsMTQgKzI1LDE2IEBACiBnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAogZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCiBnZW5lcmljLXkgKz0ga21hcF90eXBlcy5oCi1nZW5lcmljLXkgKz0gbG9jYWw2NC5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbW1hbi5oCiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBwY2kuaAogZ2VuZXJpYy15ICs9IHBlcmNwdS5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCiBnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSByd3NlbS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaApAQCAtNDUsOCArNDcsOCBAQAogZ2VuZXJpYy15ICs9IHNpemVzLmgKIGdlbmVyaWMteSArPSBzb2NrZXQuaAogZ2VuZXJpYy15ICs9IHNvY2tpb3MuaAotZ2VuZXJpYy15ICs9IHN0YXRmcy5oCiBnZW5lcmljLXkgKz0gc3RhdC5oCitnZW5lcmljLXkgKz0gc3RhdGZzLmgKIGdlbmVyaWMteSArPSB0ZXJtYml0cy5oCiBnZW5lcmljLXkgKz0gdGVybWlvcy5oCiBnZW5lcmljLXkgKz0gdG9wb2xvZ3kuaApAQCAtNTUsNCArNTcsMyBAQAogZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKIGdlbmVyaWMteSArPSB1bmFsaWduZWQuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCmluZGV4IGY0YTBkYWEuLmI0ZWZhZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCkBAIC0yOSw5ICsyOSw5IEBACiBDT05GSUdfQUNQSV9GQU49bQogQ09ORklHX0FDUElfRE9DSz15CiBDT05GSUdfQUNQSV9QUk9DRVNTT1I9bQotQ09ORklHX0FDUElfQ09OVEFJTkVSPW0KK0NPTkZJR19BQ1BJX0NPTlRBSU5FUj15CiBDT05GSUdfSE9UUExVR19QQ0k9eQotQ09ORklHX0hPVFBMVUdfUENJX0FDUEk9bQorQ09ORklHX0hPVFBMVUdfUENJX0FDUEk9eQogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfVU5JWD15CiBDT05GSUdfSU5FVD15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwppbmRleCA4ZTg1OGI1Li4xYTg3MWI3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKQEAgLTExNDAsMTEgKzExNDAsMTMgQEAKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJeworCQlpbnQgbm9kZSA9IGlvYy0+bm9kZTsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXBhZ2UgPSBhbGxvY19wYWdlc19leGFjdF9ub2RlKGlvYy0+bm9kZSA9PSBNQVhfTlVNTk9ERVMgPwotCQkgICAgICAgICAgICAgICAgICAgICAgICBudW1hX25vZGVfaWQoKSA6IGlvYy0+bm9kZSwgZmxhZ3MsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIGdldF9vcmRlcihzaXplKSk7CiAKKwkJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQorCQkJbm9kZSA9IG51bWFfbm9kZV9pZCgpOworCisJCXBhZ2UgPSBhbGxvY19wYWdlc19leGFjdF9ub2RlKG5vZGUsIGZsYWdzLCBnZXRfb3JkZXIoc2l6ZSkpOwogCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJcmV0dXJuIE5VTEw7CiAKQEAgLTE1OTYsNyArMTU5OCw3IEBACiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIF9faW5pdAorc3RhdGljIHZvaWQKIGlvY19pb3ZhX2luaXQoc3RydWN0IGlvYyAqaW9jKQogewogCWludCB0Y25mZzsKQEAgLTE4MDcsNyArMTgwOSw3IEBACiAJeyBTWDIwMDBfSU9DX0lELCAic3gyMDAwIiwgTlVMTCB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpb2MgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgaW9jICoKIGlvY19pbml0KHVuc2lnbmVkIGxvbmcgaHBhLCB2b2lkICpoYW5kbGUpCiB7CiAJc3RydWN0IGlvYyAqaW9jOwpAQCAtMTkxNCw3ICsxOTE2LDcgQEAKIAlzZXFfcHJpbnRmKHMsICJIZXdsZXR0IFBhY2thcmQgJXMgSU9DIHJldiAlZC4lZFxuIiwKIAkJaW9jLT5uYW1lLCAoKGlvYy0+cmV2ID4+IDQpICYgMHhGKSwgKGlvYy0+cmV2ICYgMHhGKSk7CiAjaWZkZWYgQ09ORklHX05VTUEKLQlpZiAoaW9jLT5ub2RlICE9IE1BWF9OVU1OT0RFUykKKwlpZiAoaW9jLT5ub2RlICE9IE5VTUFfTk9fTk9ERSkKIAkJc2VxX3ByaW50ZihzLCAiTlVNQSBub2RlICAgICAgIDogJWRcbiIsIGlvYy0+bm9kZSk7CiAjZW5kaWYKIAlzZXFfcHJpbnRmKHMsICJJT1ZBIHNpemUgICAgICAgOiAlbGQgTUJcbiIsICgoaW9jLT5wZGlyX3NpemUgPj4gMykgKiBpb3ZwX3NpemUpLygxMDI0KjEwMjQpKTsKQEAgLTIwMTUsMzMgKzIwMTcsMjEgQEAKIAlwcmludGsoS0VSTl9XQVJOSU5HICJObyBJT0MgZm9yIFBDSSBCdXMgJTA0eDolMDJ4IGluIEFDUElcbiIsIHBjaV9kb21haW5fbnIoYnVzKSwgYnVzLT5udW1iZXIpOwogfQogCi0jaWZkZWYgQ09ORklHX05VTUEKIHN0YXRpYyB2b2lkIF9faW5pdAogc2JhX21hcF9pb2NfdG9fbm9kZShzdHJ1Y3QgaW9jICppb2MsIGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKKyNpZmRlZiBDT05GSUdfTlVNQQogCXVuc2lnbmVkIGludCBub2RlOwotCWludCBweG07CiAKLQlpb2MtPm5vZGUgPSBNQVhfTlVNTk9ERVM7Ci0KLQlweG0gPSBhY3BpX2dldF9weG0oaGFuZGxlKTsKLQotCWlmIChweG0gPCAwKQotCQlyZXR1cm47Ci0KLQlub2RlID0gcHhtX3RvX25vZGUocHhtKTsKLQotCWlmIChub2RlID49IE1BWF9OVU1OT0RFUyB8fCAhbm9kZV9vbmxpbmUobm9kZSkpCi0JCXJldHVybjsKKwlub2RlID0gYWNwaV9nZXRfbm9kZShoYW5kbGUpOworCWlmIChub2RlICE9IE5VTUFfTk9fTk9ERSAmJiAhbm9kZV9vbmxpbmUobm9kZSkpCisJCW5vZGUgPSBOVU1BX05PX05PREU7CiAKIAlpb2MtPm5vZGUgPSBub2RlOwotCXJldHVybjsKLX0KLSNlbHNlCi0jZGVmaW5lIHNiYV9tYXBfaW9jX3RvX25vZGUoaW9jLCBoYW5kbGUpCiAjZW5kaWYKK30KIAotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQKIGFjcGlfc2JhX2lvY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCiAJCSBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKm5vdF91c2VkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMjgzYTgzMS4uMGRhNGFhMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDggKzEsOSBAQAogCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKIGdlbmVyaWMteSArPSBleGVjLmgKLWdlbmVyaWMteSArPSBrdm1fcGFyYS5oCi1nZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IHZ0aW1lLmgKIGdlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBrdm1fcGFyYS5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKK2dlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCitnZW5lcmljLXkgKz0gdnRpbWUuaApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BjaS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BjaS5oCmluZGV4IDcxZmJhYWEuLjdkNDFjYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wY2kuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGNpLmgKQEAgLTk4LDcgKzk4LDcgQEAKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmNvbXBhbmlvbjsKIAl2b2lkICppb21tdTsKIAlpbnQgc2VnbWVudDsKLQlpbnQgbm9kZTsJCS8qIG5lYXJlc3Qgbm9kZSB3aXRoIG1lbW9yeSBvciAtMSBmb3IgZ2xvYmFsIGFsbG9jYXRpb24gKi8KKwlpbnQgbm9kZTsJCS8qIG5lYXJlc3Qgbm9kZSB3aXRoIG1lbW9yeSBvciBOVU1BX05PX05PREUgZm9yIGdsb2JhbCBhbGxvY2F0aW9uICovCiAKIAl2b2lkICpwbGF0Zm9ybV9kYXRhOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggYTI0OTZlNC4uNWNiNTVhMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTc3LDcgKzc3LDYgQEAKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9pZChjcHUpCQkJKGNwdV9kYXRhKGNwdSktPmNvcmVfaWQpCiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfY3B1bWFzayhjcHUpCQkoJmNwdV9jb3JlX21hcFtjcHVdKQogI2RlZmluZSB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpCQkoJnBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBjcHUpKQotI2RlZmluZSBzbXRfY2FwYWJsZSgpIAkJCQkoc21wX251bV9zaWJsaW5ncyA+IDEpCiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgYXJjaF9maXhfcGh5c19wYWNrYWdlX2lkKGludCBudW0sIHUzMiBzbG90KTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggNDY3NDk3YS4uMGQ0MDdiMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTc5OSwxNCArNzk5LDkgQEAKICAqICBBQ1BJIGJhc2VkIGhvdHBsdWcgQ1BVIHN1cHBvcnQKICAqLwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCi1zdGF0aWMKLWludCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCitzdGF0aWMgaW50IGFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgaW50IHBoeXNpZCkKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JaW50IHB4bV9pZDsKLQlpbnQgbmlkOwotCi0JcHhtX2lkID0gYWNwaV9nZXRfcHhtKGhhbmRsZSk7CiAJLyoKIAkgKiBXZSBkb24ndCBoYXZlIGNwdS1vbmx5LW5vZGUgaG90YWRkLiBCdXQgaWYgdGhlIHN5c3RlbSBlcXVpcHMKIAkgKiBTUkFUIHRhYmxlLCBweG0gaXMgYWxyZWFkeSBmb3VuZCBhbmQgbm9kZSBpcyByZWFkeS4KQEAgLTgxNCwxMSArODA5LDEwIEBACiAJICogVGhpcyBjb2RlIGhlcmUgaXMgZm9yIHRoZSBzeXN0ZW0gd2hpY2ggZG9lc24ndCBoYXZlIGZ1bGwgU1JBVAogICAJICogdGFibGUgZm9yIHBvc3NpYmxlIGNwdXMuCiAJICovCi0JbmlkID0gYWNwaV9tYXBfcHhtX3RvX25vZGUocHhtX2lkKTsKIAlub2RlX2NwdWlkW2NwdV0ucGh5c19pZCA9IHBoeXNpZDsKLQlub2RlX2NwdWlkW2NwdV0ubmlkID0gbmlkOworCW5vZGVfY3B1aWRbY3B1XS5uaWQgPSBhY3BpX2dldF9ub2RlKGhhbmRsZSk7CiAjZW5kaWYKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBpbnQgYWRkaXRpb25hbF9jcHVzIF9faW5pdGRhdGEgPSAtMTsKQEAgLTkyNSw3ICs5MTksNyBAQAogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGFjcGlfbWFkdF9pb19zYXBpYyAqaW9zYXBpYzsKIAl1bnNpZ25lZCBpbnQgZ3NpX2Jhc2U7Ci0JaW50IHB4bSwgbm9kZTsKKwlpbnQgbm9kZTsKIAogCS8qIE9ubHkgY2FyZSBhYm91dCBvYmplY3RzIHcvIGEgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgTUFEVCAqLwogCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX01BVCIsIE5VTEwsICZidWZmZXIpKSkKQEAgLTk1MiwxNyArOTQ2LDkgQEAKIAogCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAotCS8qCi0JICogT0ssIGl0J3MgYW4gSU9TQVBJQyBNQURUIGVudHJ5LCBsb29rIGZvciBhIF9QWE0gdmFsdWUgdG8gdGVsbAotCSAqIHVzIHdoaWNoIG5vZGUgdG8gYXNzb2NpYXRlIHRoaXMgd2l0aC4KLQkgKi8KLQlweG0gPSBhY3BpX2dldF9weG0oaGFuZGxlKTsKLQlpZiAocHhtIDwgMCkKLQkJcmV0dXJuIEFFX09LOwotCi0Jbm9kZSA9IHB4bV90b19ub2RlKHB4bSk7Ci0KLQlpZiAobm9kZSA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5vZGUpIHx8CisJLyogT0ssIGl0J3MgYW4gSU9TQVBJQyBNQURUIGVudHJ5OyBhc3NvY2lhdGUgaXQgd2l0aCBhIG5vZGUgKi8KKwlub2RlID0gYWNwaV9nZXRfbm9kZShoYW5kbGUpOworCWlmIChub2RlID09IE5VTUFfTk9fTk9ERSB8fCAhbm9kZV9vbmxpbmUobm9kZSkgfHwKIAkgICAgY3B1bWFza19lbXB0eShjcHVtYXNrX29mX25vZGUobm9kZSkpKQogCQlyZXR1cm4gQUVfT0s7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCmluZGV4IGRhNWI0NjIuLjc0MWI5OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwpAQCAtNDc3LDYgKzQ3Nyw5IEBACiAJY2hhciAqY3AsIHZlbmRvclsxMDBdID0gInVua25vd24iOwogCWludCBpOwogCisJc2V0X2JpdChFRklfQk9PVCwgJmVmaS5mbGFncyk7CisJc2V0X2JpdChFRklfNjRCSVQsICZlZmkuZmxhZ3MpOworCiAJLyoKIAkgKiBJdCdzIHRvbyBlYXJseSB0byBiZSBhYmxlIHRvIHVzZSB0aGUgc3RhbmRhcmQga2VybmVsIGNvbW1hbmQgbGluZQogCSAqIHN1cHBvcnQuLi4KQEAgLTUyOSw2ICs1MzIsOCBAQAogCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gPj4gMTYsCiAJICAgICAgIGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiAmIDB4ZmZmZiwgdmVuZG9yKTsKIAorCXNldF9iaXQoRUZJX1NZU1RFTV9UQUJMRVMsICZlZmkuZmxhZ3MpOworCiAJcGFsb19waHlzICAgICAgPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSOwogCiAJaWYgKGVmaV9jb25maWdfaW5pdChhcmNoX3RhYmxlcykgIT0gMCkKQEAgLTY1Nyw2ICs2NjIsOCBAQAogCQlyZXR1cm47CiAJfQogCisJc2V0X2JpdChFRklfUlVOVElNRV9TRVJWSUNFUywgJmVmaS5mbGFncyk7CisKIAkvKgogCSAqIE5vdyB0aGF0IEVGSSBpcyBpbiB2aXJ0dWFsIG1vZGUsIHdlIGNhbGwgdGhlIEVGSSBmdW5jdGlvbnMgbW9yZQogCSAqIGVmZmljaWVudGx5OgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCmluZGV4IDEwMzQ4ODQuLjA4ODRmNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKQEAgLTM2NCw3ICszNjQsNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnFfbW92ZV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlzbXBfaXJxX21vdmVfY2xlYW51cF9pbnRlcnJ1cHQsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiaXJxX21vdmUiCiB9OwogCkBAIC00ODksMTQgKzQ4OCwxMyBAQAogCWlhNjRfc3Jsel9kKCk7CiAJd2hpbGUgKHZlY3RvciAhPSBJQTY0X1NQVVJJT1VTX0lOVF9WRUNUT1IpIHsKIAkJaW50IGlycSA9IGxvY2FsX3ZlY3Rvcl90b19pcnEodmVjdG9yKTsKLQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAogCQlpZiAodW5saWtlbHkoSVNfTE9DQUxfVExCX0ZMVVNIKHZlY3RvcikpKSB7CiAJCQlzbXBfbG9jYWxfZmx1c2hfdGxiKCk7Ci0JCQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBkZXNjKTsKKwkJCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJCX0gZWxzZSBpZiAodW5saWtlbHkoSVNfUkVTQ0hFRFVMRSh2ZWN0b3IpKSkgewogCQkJc2NoZWR1bGVyX2lwaSgpOwotCQkJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CisJCQlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCQl9IGVsc2UgewogCQkJaWE2NF9zZXRyZWcoX0lBNjRfUkVHX0NSX1RQUiwgdmVjdG9yKTsKIAkJCWlhNjRfc3Jsel9kKCk7CkBAIC01NDksMTMgKzU0NywxMiBAQAogCSAgKi8KIAl3aGlsZSAodmVjdG9yICE9IElBNjRfU1BVUklPVVNfSU5UX1ZFQ1RPUikgewogCQlpbnQgaXJxID0gbG9jYWxfdmVjdG9yX3RvX2lycSh2ZWN0b3IpOwotCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCiAJCWlmICh1bmxpa2VseShJU19MT0NBTF9UTEJfRkxVU0godmVjdG9yKSkpIHsKIAkJCXNtcF9sb2NhbF9mbHVzaF90bGIoKTsKLQkJCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGRlc2MpOworCQkJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAkJfSBlbHNlIGlmICh1bmxpa2VseShJU19SRVNDSEVEVUxFKHZlY3RvcikpKSB7Ci0JCQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBkZXNjKTsKKwkJCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MoTlVMTCk7CiAKQEAgLTYwMiw3ICs1OTksNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcGlfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JaGFuZGxlX0lQSSwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJJUEkiCiB9OwogCkBAIC02MTEsMTMgKzYwNywxMSBAQAogICovCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiByZXNjaGVkX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWR1bW15X2hhbmRsZXIsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkicmVzY2hlZCIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHRsYl9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlkdW1teV9oYW5kbGVyLAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJInRsYl9mbHVzaCIKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IGI4ZWRmYTcuLmRiN2IzNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJLyogQ29weSB0aGUgb3V0cHV0IGludG8gbWxvZ2J1ZiAqLwogCWlmIChvb3BzX2luX3Byb2dyZXNzKSB7CiAJCS8qIG1sb2didWYgd2FzIGFiYW5kb25lZCwgdXNlIHByaW50ayBkaXJlY3RseSBpbnN0ZWFkLiAqLwotCQlwcmludGsodGVtcF9idWYpOworCQlwcmludGsoIiVzIiwgdGVtcF9idWYpOwogCX0gZWxzZSB7CiAJCXNwaW5fbG9jaygmbWxvZ2J1Zl93bG9jayk7CiAJCWZvciAocCA9IHRlbXBfYnVmOyAqcDsgcCsrKSB7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAkJfQogCQkqcCA9ICdcMCc7CiAJCWlmICh0ZW1wX2J1ZlswXSkKLQkJCXByaW50ayh0ZW1wX2J1Zik7CisJCQlwcmludGsoIiVzIiwgdGVtcF9idWYpOwogCQltbG9nYnVmX3N0YXJ0ID0gaW5kZXg7CiAKIAkJbWxvZ2J1Zl90aW1lc3RhbXAgPSAwOwpAQCAtMTc3MiwzOCArMTc3MiwzMiBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjbWNpX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWlhNjRfbWNhX2NtY19pbnRfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJjbWNfaG5kbHIiCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjbWNwX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWlhNjRfbWNhX2NtY19pbnRfY2FsbGVyLAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJImNtY19wb2xsIgogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWNhX3JkenZfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JaWE2NF9tY2FfcmVuZGV6X2ludF9oYW5kbGVyLAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJIm1jYV9yZHp2IgogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWNhX3drdXBfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0JaWE2NF9tY2Ffd2FrZXVwX2ludF9oYW5kbGVyLAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCiAJLm5hbWUgPQkJIm1jYV93a3VwIgogfTsKIAogI2lmZGVmIENPTkZJR19BQ1BJCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtY2FfY3BlX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWlhNjRfbWNhX2NwZV9pbnRfaGFuZGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJjcGVfaG5kbHIiCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtY2FfY3BlcF9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQlpYTY0X21jYV9jcGVfaW50X2NhbGxlciwKLQkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELAogCS5uYW1lID0JCSJjcGVfcG9sbCIKIH07CiAjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYwppbmRleCBmYjJmMWU2Li5jNDMwZjkxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tc2lfaWE2NC5jCkBAIC0xNywxMiArMTcsOSBAQAogewogCXN0cnVjdCBtc2lfbXNnIG1zZzsKIAl1MzIgYWRkciwgZGF0YTsKLQlpbnQgY3B1ID0gZmlyc3RfY3B1KCpjcHVfbWFzayk7CisJaW50IGNwdSA9IGNwdW1hc2tfZmlyc3RfYW5kKGNwdV9tYXNrLCBjcHVfb25saW5lX21hc2spOwogCXVuc2lnbmVkIGludCBpcnEgPSBpZGF0YS0+aXJxOwogCi0JaWYgKCFjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybiAtMTsKLQogCWlmIChpcnFfcHJlcGFyZV9tb3ZlKGlycSwgY3B1KSkKIAkJcmV0dXJuIC0xOwogCkBAIC0xMzksMTAgKzEzNiw3IEBACiAJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxX2NmZyArIGlycTsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7Ci0JaW50IGNwdSA9IGNwdW1hc2tfZmlyc3QobWFzayk7Ci0KLQlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKLQkJcmV0dXJuIC0xOworCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0X2FuZChtYXNrLCBjcHVfb25saW5lX21hc2spOwogCiAJaWYgKGlycV9wcmVwYXJlX21vdmUoaXJxLCBjcHUpKQogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCmluZGV4IGNiNTkyNzcuLmQ4NDFjNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCkBAIC02Mzg3LDcgKzYzODcsNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBwZXJmbW9uX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9IHBmbV9pbnRlcnJ1cHRfaGFuZGxlciwKLQkuZmxhZ3MgICA9IElSUUZfRElTQUJMRUQsCiAJLm5hbWUgICAgPSAicGVyZm1vbiIKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKaW5kZXggZmJhYWMxYS4uNzFjNTJiYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKQEAgLTM4MCw3ICszODAsNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0aW1lcl9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPQl0aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzID0JSVJRRl9ESVNBQkxFRCB8IElSUUZfSVJRUE9MTCwKKwkuZmxhZ3MgPQlJUlFGX0lSUVBPTEwsCiAJLm5hbWUgPQkJInRpbWVyIgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9maXh1cC5jIGIvYXJjaC9pYTY0L3BjaS9maXh1cC5jCmluZGV4IDVkYzk2OWQuLmVlZTA2OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvZml4dXAuYworKysgYi9hcmNoL2lhNjQvcGNpL2ZpeHVwLmMKQEAgLTUsNiArNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogCkBAIC0xOSw5ICsyMCwxMCBAQAogICogSU9SRVNPVVJDRV9ST01fU0hBRE9XIGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBib290IHZpZGVvCiAgKiBjYXJkIHdpdGggdGhpcyBjb3B5LiBPbiBsYXB0b3BzIHRoaXMgY29weSBoYXMgdG8gYmUgdXNlZCBzaW5jZQogICogdGhlIG1haW4gUk9NIG1heSBiZSBjb21wcmVzc2VkIG9yIGNvbWJpbmVkIHdpdGggYW5vdGhlciBpbWFnZS4KLSAqIFNlZSBwY2lfbWFwX3JvbSgpIGZvciB1c2Ugb2YgdGhpcyBmbGFnLiBJT1JFU09VUkNFX1JPTV9TSEFET1cKLSAqIGlzIG1hcmtlZCBoZXJlIHNpbmNlIHRoZSBib290IHZpZGVvIGRldmljZSB3aWxsIGJlIHRoZSBvbmx5IGVuYWJsZWQKLSAqIHZpZGVvIGRldmljZSBhdCB0aGlzIHBvaW50LgorICogU2VlIHBjaV9tYXBfcm9tKCkgZm9yIHVzZSBvZiB0aGlzIGZsYWcuIEJlZm9yZSBtYXJraW5nIHRoZSBkZXZpY2UKKyAqIHdpdGggSU9SRVNPVVJDRV9ST01fU0hBRE9XIGNoZWNrIGlmIGEgdmdhX2RlZmF1bHRfZGV2aWNlIGlzIGFscmVhZHkgc2V0CisgKiBieSBlaXRoZXIgYXJjaCBjZGUgb3IgdmdhLWFyYml0cmF0aW9uLCBpZiBzbyBvbmx5IGFwcGx5IHRoZSBmaXh1cCB0byB0aGlzCisgKiBhbHJlYWR5IGRldGVybWluZWQgcHJpbWFyeSB2aWRlbyBjYXJkLgogICovCiAKIHN0YXRpYyB2b2lkIHBjaV9maXh1cF92aWRlbyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTM1LDkgKzM3LDYgQEAKIAkJcmV0dXJuOwogCS8qIE1heWJlLCB0aGlzIG1hY2hpbmUgc3VwcG9ydHMgbGVnYWN5IG1lbW9yeSBtYXAuICovCiAKLQlpZiAoKHBkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkKLQkJcmV0dXJuOwotCiAJLyogSXMgVkdBIHJvdXRlZCB0byB1cz8gKi8KIAlidXMgPSBwZGV2LT5idXM7CiAJd2hpbGUgKGJ1cykgewpAQCAtNjAsMTAgKzU5LDE0IEBACiAJCX0KIAkJYnVzID0gYnVzLT5wYXJlbnQ7CiAJfQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKLQlpZiAoY29uZmlnICYgKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKSkgewotCQlwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9TSEFET1c7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgIkJvb3QgdmlkZW8gZGV2aWNlXG4iKTsKKwlpZiAoIXZnYV9kZWZhdWx0X2RldmljZSgpIHx8IHBkZXYgPT0gdmdhX2RlZmF1bHRfZGV2aWNlKCkpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjb25maWcpOworCQlpZiAoY29uZmlnICYgKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworCQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fU0hBRE9XOworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAiQm9vdCB2aWRlbyBkZXZpY2VcbiIpOworCQkJdmdhX3NldF9kZWZhdWx0X2RldmljZShwZGV2KTsKKwkJfQogCX0KIH0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfdmlkZW8pOworREVDTEFSRV9QQ0lfRklYVVBfQ0xBU1NfRklOQUwoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkJCQlQQ0lfQ0xBU1NfRElTUExBWV9WR0EsIDgsIHBjaV9maXh1cF92aWRlbyk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvcGNpL3BjaS5jIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwppbmRleCA5ZTQ5MzhkLi4yOTFhNTgyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL3BjaS5jCisrKyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKQEAgLTEyNiw3ICsxMjYsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWNvbnRyb2xsZXItPnNlZ21lbnQgPSBzZWc7Ci0JY29udHJvbGxlci0+bm9kZSA9IC0xOwogCXJldHVybiBjb250cm9sbGVyOwogfQogCkBAIC00MzAsMTkgKzQyOSwxNCBAQAogCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvID0gTlVMTDsKIAlpbnQgYnVzbnVtID0gcm9vdC0+c2Vjb25kYXJ5LnN0YXJ0OwogCXN0cnVjdCBwY2lfYnVzICpwYnVzOwotCWludCBweG0sIHJldDsKKwlpbnQgcmV0OwogCiAJY29udHJvbGxlciA9IGFsbG9jX3BjaV9jb250cm9sbGVyKGRvbWFpbik7CiAJaWYgKCFjb250cm9sbGVyKQogCQlyZXR1cm4gTlVMTDsKIAogCWNvbnRyb2xsZXItPmNvbXBhbmlvbiA9IGRldmljZTsKLQotCXB4bSA9IGFjcGlfZ2V0X3B4bShkZXZpY2UtPmhhbmRsZSk7Ci0jaWZkZWYgQ09ORklHX05VTUEKLQlpZiAocHhtID49IDApCi0JCWNvbnRyb2xsZXItPm5vZGUgPSBweG1fdG9fbm9kZShweG0pOwotI2VuZGlmCisJY29udHJvbGxlci0+bm9kZSA9IGFjcGlfZ2V0X25vZGUoZGV2aWNlLT5oYW5kbGUpOwogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKSB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwppbmRleCA2MmNmNGRkLi44NWQwOTUxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKQEAgLTIwOSw4ICsyMDksOCBAQAogCW5hc2lkX3QgbmFzaWQ7CiAJaW50IHNsaWNlOwogCi0JbmFzaWQgPSBjcHVpZF90b19uYXNpZChjcHVtYXNrX2ZpcnN0KG1hc2spKTsKLQlzbGljZSA9IGNwdWlkX3RvX3NsaWNlKGNwdW1hc2tfZmlyc3QobWFzaykpOworCW5hc2lkID0gY3B1aWRfdG9fbmFzaWQoY3B1bWFza19maXJzdF9hbmQobWFzaywgY3B1X29ubGluZV9tYXNrKSk7CisJc2xpY2UgPSBjcHVpZF90b19zbGljZShjcHVtYXNrX2ZpcnN0X2FuZChtYXNrLCBjcHVfb25saW5lX21hc2spKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbl9pcnFfaW5mbywgc25faXJxX2luZm9fc2FmZSwKIAkJCQkgc25faXJxX2xoW2lycV0sIGxpc3QpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYwppbmRleCAyYjk4YjllLi5hZmM1OGQyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnByb3ZpZGVyOwogCXVuc2lnbmVkIGludCBjcHUsIGlycSA9IGRhdGEtPmlycTsKIAotCWNwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X21hc2spOworCWNwdSA9IGNwdW1hc2tfZmlyc3RfYW5kKGNwdV9tYXNrLCBjcHVfb25saW5lX21hc2spOwogCXNuX2lycV9pbmZvID0gc25fbXNpX2luZm9baXJxXS5zbl9pcnFfaW5mbzsKIAlpZiAoc25faXJxX2luZm8gPT0gTlVMTCB8fCBzbl9pcnFfaW5mby0+aXJxX2ludF9iaXQgPj0gMCkKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggOTMyNDM1YS4uNjc3NzlhNyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDcgKzEsOSBAQAogCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBleGVjLmgKLWdlbmVyaWMteSArPSBtb2R1bGUuaAotZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IG1vZHVsZS5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDc1NTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX00zMlJfQ1BVVElNRV9ICi0jZGVmaW5lIF9fTTMyUl9DUFVUSU1FX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KLQotI2VuZGlmIC8qIF9fTTMyUl9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggZGJkZDIyMy4uYjJlMzIyOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTE3LDYgKzE3LDcgQEAKIAlzZWxlY3QgRlBVIGlmIE1NVQogCXNlbGVjdCBBUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIAlzZWxlY3QgQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQgaWYgTU1VICYmICFDT0xERklSRQorCXNlbGVjdCBIQVZFX0ZVVEVYX0NNUFhDSEcgaWYgTU1VICYmIEZVVEVYCiAJc2VsZWN0IEhBVkVfTU9EX0FSQ0hfU1BFQ0lGSUMKIAlzZWxlY3QgTU9EVUxFU19VU0VfRUxGX1JFTAogCXNlbGVjdCBNT0RVTEVTX1VTRV9FTEZfUkVMQQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jIGIvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCmluZGV4IDE4YzBlMjkuLjIwODFiOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jaWEuYworKysgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYyBiL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKaW5kZXggM2U3M2E2My4uM2QyYjYzYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYworKysgYi9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnCmluZGV4IDU1OWZmM2EuLjk2ZGE0OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKQEAgLTI0LDYgKzI0LDggQEAKICMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAogQ09ORklHX1NZU1Y2OF9QQVJUSVRJT049eQogQ09ORklHX0lPU0NIRURfREVBRExJTkU9bQorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19CT09USU5GT19QUk9DPXkKIENPTkZJR19NNjgwMjA9eQogQ09ORklHX002ODAzMD15CiBDT05GSUdfTTY4MDQwPXkKQEAgLTg1LDYgKzg3LDcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfVEFCTEVTPW0KK0NPTkZJR19ORl9UQUJMRVNfSU5FVD1tCiBDT05GSUdfTkZUX0VYVEhEUj1tCiBDT05GSUdfTkZUX01FVEE9bQogQ09ORklHX05GVF9DVD1tCkBAIC05NCw2ICs5Nyw4IEBACiBDT05GSUdfTkZUX0xPRz1tCiBDT05GSUdfTkZUX0xJTUlUPW0KIENPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfUVVFVUU9bQorQ09ORklHX05GVF9SRUpFQ1Q9bQogQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMTI2LDYgKzEzMSw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQQ09NUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCkBAIC0xNjMsOCArMTY5LDYgQEAKIENPTkZJR19JUF9TRVRfSEFTSF9ORVRJRkFDRT1tCiBDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQotQ09ORklHX05GVF9SRUpFQ1RfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCkBAIC0xOTAsNyArMTk0LDYgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KQEAgLTUxMiw3ICs1MTUsNiBAQAogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19YWl9ERUNfWDg2PXkKIENPTkZJR19YWl9ERUNfUE9XRVJQQz15CiBDT05GSUdfWFpfREVDX0lBNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcKaW5kZXggY2IxZjU1ZC4uMWI4NzM5ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnCkBAIC0yNSw2ICsyNSw4IEBACiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfTTY4MDIwPXkKIENPTkZJR19NNjgwMzA9eQogQ09ORklHX002ODA0MD15CkBAIC04Myw2ICs4NSw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtOTIsNiArOTUsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEyNCw2ICsxMjksNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTYxLDggKzE2Nyw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTg4LDcgKzE5Miw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00NzAsNyArNDczLDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZwppbmRleCBlODgwY2ZiLi42ZWE0ZTkxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnCkBAIC0yNCw2ICsyNCw4IEBACiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfTTY4MDIwPXkKIENPTkZJR19NNjgwMzA9eQogQ09ORklHX002ODA0MD15CkBAIC04Miw2ICs4NCw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtOTEsNiArOTQsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEyMyw2ICsxMjgsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTYwLDggKzE2Niw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTg3LDcgKzE5MSw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00ODcsNyArNDkwLDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZwppbmRleCA0YWE0ZjQ1Li5lNWExMjczIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnCkBAIC0yNCw2ICsyNCw4IEBACiBDT05GSUdfU1VOX1BBUlRJVElPTj15CiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfTTY4MDQwPXkKIENPTkZJR19NNjgwNjA9eQogQ09ORklHX1ZNRT15CkBAIC04MSw2ICs4Myw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtOTAsNiArOTMsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEyMiw2ICsxMjcsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTU5LDggKzE2NSw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTg2LDcgKzE5MCw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00NjMsNyArNDY2LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZwppbmRleCA3Y2Q5ZDlmLi44OTM2ZDdmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnCkBAIC0yNSw2ICsyNSw4IEBACiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfTTY4MDIwPXkKIENPTkZJR19NNjgwMzA9eQogQ09ORklHX002ODA0MD15CkBAIC04Myw2ICs4NSw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtOTIsNiArOTUsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTEyNCw2ICsxMjksNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTYxLDggKzE2Nyw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTg4LDcgKzE5Miw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00NzIsNyArNDc1LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnCmluZGV4IDMxZjViZDAuLmJlNTM0MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZwpAQCAtMjQsNiArMjQsOCBAQAogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVjY4X1BBUlRJVElPTj15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODAyMD15CiBDT05GSUdfTTY4MDMwPXkKIENPTkZJR19NNjgwNDA9eQpAQCAtODIsNiArODQsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTkxLDYgKzk0LDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMjMsNiArMTI4LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE2MCw4ICsxNjYsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4Nyw3ICsxOTEsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDk1LDcgKzQ5OCw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcKaW5kZXggNGU1YWRmZi4uZjI3MTk0YSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZwpAQCAtMjAsNiArMjAsOCBAQAogQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTD15CiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfTTY4MDIwPXkKIENPTkZJR19NNjgwNDA9eQogQ09ORklHX002ODA2MD15CkBAIC05MSw2ICs5Myw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtMTAwLDYgKzEwMyw4IEBACiBDT05GSUdfTkZUX0xPRz1tCiBDT05GSUdfTkZUX0xJTUlUPW0KIENPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfUVVFVUU9bQorQ09ORklHX05GVF9SRUpFQ1Q9bQogQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMTMyLDYgKzEzNyw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQQ09NUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCkBAIC0xNjksOCArMTc1LDYgQEAKIENPTkZJR19JUF9TRVRfSEFTSF9ORVRJRkFDRT1tCiBDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQotQ09ORklHX05GVF9SRUpFQ1RfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCkBAIC0xOTYsNyArMjAwLDYgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KQEAgLTU3MSw3ICs1NzQsNiBAQAogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19YWl9ERUNfWDg2PXkKIENPTkZJR19YWl9ERUNfUE9XRVJQQz15CiBDT05GSUdfWFpfREVDX0lBNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZwppbmRleCAwMmNkYmFjLi5jMzg4NzYwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZwpAQCAtMjQsNiArMjQsOCBAQAogQ09ORklHX1NVTl9QQVJUSVRJT049eQogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODAzMD15CiBDT05GSUdfVk1FPXkKIENPTkZJR19NVk1FMTQ3PXkKQEAgLTgwLDYgKzgyLDcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfVEFCTEVTPW0KK0NPTkZJR19ORl9UQUJMRVNfSU5FVD1tCiBDT05GSUdfTkZUX0VYVEhEUj1tCiBDT05GSUdfTkZUX01FVEE9bQogQ09ORklHX05GVF9DVD1tCkBAIC04OSw2ICs5Miw4IEBACiBDT05GSUdfTkZUX0xPRz1tCiBDT05GSUdfTkZUX0xJTUlUPW0KIENPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfUVVFVUU9bQorQ09ORklHX05GVF9SRUpFQ1Q9bQogQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMTIxLDYgKzEyNiw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQQ09NUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCkBAIC0xNTgsOCArMTY0LDYgQEAKIENPTkZJR19JUF9TRVRfSEFTSF9ORVRJRkFDRT1tCiBDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQotQ09ORklHX05GVF9SRUpFQ1RfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCkBAIC0xODUsNyArMTg5LDYgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KQEAgLTQ2Myw3ICs0NjYsNiBAQAogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19YWl9ERUNfWDg2PXkKIENPTkZJR19YWl9ERUNfUE9XRVJQQz15CiBDT05GSUdfWFpfREVDX0lBNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwppbmRleCAwNWE5OTBhLi5mN2ZmNzg0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwpAQCAtMjQsNiArMjQsOCBAQAogQ09ORklHX1NVTl9QQVJUSVRJT049eQogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX002ODA0MD15CiBDT05GSUdfTTY4MDYwPXkKIENPTkZJR19WTUU9eQpAQCAtODEsNiArODMsNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GX1RBQkxFU19JTkVUPW0KIENPTkZJR19ORlRfRVhUSERSPW0KIENPTkZJR19ORlRfTUVUQT1tCiBDT05GSUdfTkZUX0NUPW0KQEAgLTkwLDYgKzkzLDggQEAKIENPTkZJR19ORlRfTE9HPW0KIENPTkZJR19ORlRfTElNSVQ9bQogQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9RVUVVRT1tCitDT05GSUdfTkZUX1JFSkVDVD1tCiBDT05GSUdfTkZUX0NPTVBBVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1NFVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTT1tCkBAIC0xMjIsNiArMTI3LDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTE1OSw4ICsxNjUsNiBAQAogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWND1tCi1DT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KIENPTkZJR19ORl9UQUJMRVNfQVJQPW0KQEAgLTE4Niw3ICsxOTAsNiBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQotQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQpAQCAtNDY0LDcgKzQ2Nyw2IEBACiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAotQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX1haX0RFQ19YODY9eQogQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKIENPTkZJR19YWl9ERUNfSUE2ND15CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZwppbmRleCA1NjhlMmE5Li5mMGM3MmFiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcKQEAgLTI1LDYgKzI1LDggQEAKICMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAogQ09ORklHX1NZU1Y2OF9QQVJUSVRJT049eQogQ09ORklHX0lPU0NIRURfREVBRExJTkU9bQorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19CT09USU5GT19QUk9DPXkKIENPTkZJR19NNjgwNDA9eQogQ09ORklHX002ODA2MD15CiBDT05GSUdfUTQwPXkKQEAgLTgxLDYgKzgzLDcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfVEFCTEVTPW0KK0NPTkZJR19ORl9UQUJMRVNfSU5FVD1tCiBDT05GSUdfTkZUX0VYVEhEUj1tCiBDT05GSUdfTkZUX01FVEE9bQogQ09ORklHX05GVF9DVD1tCkBAIC05MCw2ICs5Myw4IEBACiBDT05GSUdfTkZUX0xPRz1tCiBDT05GSUdfTkZUX0xJTUlUPW0KIENPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfUVVFVUU9bQorQ09ORklHX05GVF9SRUpFQ1Q9bQogQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMTIyLDYgKzEyNyw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQQ09NUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCkBAIC0xNTksOCArMTY1LDYgQEAKIENPTkZJR19JUF9TRVRfSEFTSF9ORVRJRkFDRT1tCiBDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjQ9bQotQ09ORklHX05GVF9SRUpFQ1RfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCkBAIC0xODYsNyArMTkwLDYgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KLUNPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KQEAgLTQ4NSw3ICs0ODgsNiBAQAogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19YWl9ERUNfWDg2PXkKIENPTkZJR19YWl9ERUNfUE9XRVJQQz15CiBDT05GSUdfWFpfREVDX0lBNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZwppbmRleCA2MGIwYWVhLi43YmNhMGY0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZwpAQCAtMjQsNiArMjQsOCBAQAogIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVjY4X1BBUlRJVElPTj15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0JPT1RJTkZPX1BST0M9eQogQ09ORklHX1NVTjM9eQogIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfQ0xFQU5DQUNIRT15CkBAIC03OCw2ICs4MCw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtODcsNiArOTAsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTExOSw2ICsxMjQsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTU2LDggKzE2Miw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTgzLDcgKzE4Nyw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00NjQsNyArNDY3LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZwppbmRleCAyMWJkYTMzLi4zMTdmM2UxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnCkBAIC0yNCw2ICsyNCw4IEBACiAjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPW0KK0NPTkZJR19LRVhFQz15CitDT05GSUdfQk9PVElORk9fUFJPQz15CiBDT05GSUdfU1VOM1g9eQogIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfQ0xFQU5DQUNIRT15CkBAIC03OCw2ICs4MCw3IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQogQ09ORklHX05GVF9FWFRIRFI9bQogQ09ORklHX05GVF9NRVRBPW0KIENPTkZJR19ORlRfQ1Q9bQpAQCAtODcsNiArOTAsOCBAQAogQ09ORklHX05GVF9MT0c9bQogQ09ORklHX05GVF9MSU1JVD1tCiBDT05GSUdfTkZUX05BVD1tCitDT05GSUdfTkZUX1FVRVVFPW0KK0NPTkZJR19ORlRfUkVKRUNUPW0KIENPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTExOSw2ICsxMjQsNyBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUENPTVA9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQpAQCAtMTU2LDggKzE2Miw2IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX05GX1RBQkxFU19JUFY0PW0KLUNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQpAQCAtMTgzLDcgKzE4Nyw2IEBACiBDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KIENPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi1DT05GSUdfTkZfVEFCTEVTX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCkBAIC00NjQsNyArNDY3LDYgQEAKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfWFpfREVDX1g4Nj15CiBDT05GSUdfWFpfREVDX1BPV0VSUEM9eQogQ09ORklHX1haX0RFQ19JQTY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDZmYjllODEuLmM2N2M5NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTQsOCArMTQsOSBAQAogZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCiBnZW5lcmljLXkgKz0ga21hcF90eXBlcy5oCiBnZW5lcmljLXkgKz0ga3ZtX3BhcmEuaAotZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1tYW4uaAogZ2VuZXJpYy15ICs9IG11dGV4LmgKIGdlbmVyaWMteSArPSBwZXJjcHUuaApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwppbmRleCA0Yzk5YmFiLi4zYWIzMjliIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2hlYWQuUworKysgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwpAQCAtMjc1LDcgKzI3NSw2IEBACiAKICNpZmRlZiBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRQogI2RlZmluZSBDT05TT0xFCi0jZGVmaW5lIENPTlNPTEVfUEVOR1VJTgogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLCkBAIC02NTgsMjcgKzY1Nyw2IEBACiAJbW92ZWwJJWEwQCwlYTFACiAjZW5kaWYKIAotI2lmIDAKLQkvKgotCSAqIENsZWFyIHRoZSBzY3JlZW4KLQkgKi8KLQlsZWEJJXBjQChMKG1hY192aWRlb2Jhc2UpKSwlYTAKLQltb3ZlbAklYTBALCVhMQotCWxlYQklcGNAKEwobWFjX2RpbWVuc2lvbnMpKSwlYTAKLQltb3ZlbAklYTBALCVkMQotCXN3YXAJJWQxCQkvKiAjcm93cyBpcyBoaWdoIGJ5dGVzICovCi0JYW5kbAkjMHhGRkZGLCVkMQkvKiByb3dzICovCi0Jc3VibAkjMTAsJWQxCi0JbGVhCSVwY0AoTChtYWNfcm93Ynl0ZXMpKSwlYTAKLWxvb3B5MjoKLQltb3ZlbAklYTBALCVkMAotCXN1YnFsCSMxLCVkMAotbG9vcHgyOgotCW1vdmViCSMweDU1LCAlYTFAKwotCWRicmEJJWQwLGxvb3B4MgotCWRicmEJJWQxLGxvb3B5MgotI2VuZGlmCi0KIEwodGVzdF9ub3RtYWMpOgogI2VuZGlmIC8qIENPTkZJR19NQUMgKi8KIApAQCAtOTA3LDE1ICs4ODUsMTUgQEAKICAqLwogI2lmZGVmIENPTkZJR19NQUMKIAlpc19ub3RfbWFjKEwobm9jb24pKQotI2lmZGVmIENPTlNPTEUKKyMgIGlmZGVmIENPTlNPTEUKIAljb25zb2xlX2luaXQKLSNpZmRlZiBDT05TT0xFX1BFTkdVSU4KKyMgICAgaWZkZWYgQ09ORklHX0xPR08KIAljb25zb2xlX3B1dF9wZW5ndWluCi0jZW5kaWYJLyogQ09OU09MRV9QRU5HVUlOICovCisjICAgIGVuZGlmIC8qIENPTkZJR19MT0dPICovCiAJY29uc29sZV9wdXRfc3RhdHMKLSNlbmRpZgkvKiBDT05TT0xFICovCisjICBlbmRpZiAvKiBDT05TT0xFICovCiBMKG5vY29uKToKLSNlbmRpZgkvKiBDT05GSUdfTUFDICovCisjZW5kaWYgLyogQ09ORklHX01BQyAqLwogCiAKIAlwdXRjCSdcbicKQEAgLTMzMjQsMTQgKzMzMDIsMTMgQEAKICNkZWZpbmUgTGNvbnNvbGVfc3RydWN0X251bV9jb2x1bW5zCTgKICNkZWZpbmUgTGNvbnNvbGVfc3RydWN0X251bV9yb3dzCTEyCiAjZGVmaW5lIExjb25zb2xlX3N0cnVjdF9sZWZ0X2VkZ2UJMTYKLSNkZWZpbmUgTGNvbnNvbGVfc3RydWN0X3Blbmd1aW5fcHV0YwkyMAogCiBmdW5jX3N0YXJ0CWNvbnNvbGVfaW5pdCwlYTAtJWE0LyVkMC0lZDcKIAkvKgogCSAqCVNvbWUgb2YgdGhlIHJlZ2lzdGVyIHVzYWdlIHRoYXQgZm9sbG93cwogCSAqCQlhMCA9IHBvaW50ZXIgdG8gYm9vdF9pbmZvCiAJICoJCWExID0gcG9pbnRlciB0byBzY3JlZW4KLQkgKgkJYTIgPSBwb2ludGVyIHRvIExjb25zb2xlX2dsb2JhbHMKKwkgKgkJYTIgPSBwb2ludGVyIHRvIGNvbnNvbGVfZ2xvYmFscwogCSAqCQlkMyA9IHBpeGVsIHdpZHRoIG9mIHNjcmVlbgogCSAqCQlkNCA9IHBpeGVsIGhlaWdodCBvZiBzY3JlZW4KIAkgKgkJKGQzLGQ0KSB+PSAoeCx5KSBvZiBhIHBvaW50IGp1c3QgYmVsb3cKQEAgLTM0NTYsNyArMzQzMyw3IEBACiAKIGZ1bmNfcmV0dXJuCWNvbnNvbGVfcHV0X3N0YXRzCiAKLSNpZmRlZiBDT05TT0xFX1BFTkdVSU4KKyNpZmRlZiBDT05GSUdfTE9HTwogZnVuY19zdGFydAljb25zb2xlX3B1dF9wZW5ndWluLCVhMC0lYTEvJWQwLSVkNwogCS8qCiAJICoJR2V0ICd0aGF0X3Blbmd1aW4nIG9udG8gdGhlIHNjcmVlbiBpbiB0aGUgdXBwZXIgcmlnaHQgY29ybmVyCkBAIC0zNzk5LDM4ICszNzc2LDYgQEAKIGZ1bmNfcmV0dXJuCWNvbnNvbGVfcGxvdF9waXhlbAogI2VuZGlmIC8qIENPTlNPTEUgKi8KIAotI2lmIDAKLS8qCi0gKiBUaGlzIGlzIHNvbWUgb2xkIGNvZGUgbHlpbmcgYXJvdW5kLiAgSSBkb24ndCBiZWxpZXZlCi0gKiBpdCdzIHVzZWQgb3IgaW1wb3J0YW50IGFueW1vcmUuICBNeSBndWVzcyBpcyBpdCBjb250cmlidXRlZAotICogdG8gZ2V0dGluZyB0byB0aGlzIHBvaW50LCBidXQgaXQncyBkb25lIGZvciBub3cuCi0gKiBJdCB3YXMgc3RpbGwgaW4gdGhlIDIuMS43NyBoZWFkLlMsIHNvIGl0J3Mgc3RpbGwgaGVyZS4KLSAqIChBbmQgc3RpbGwgbm90IHVzZWQhKQotICovCi1MKHNob3d0ZXN0KToKLQltb3ZlbWwJJWEwLyVkNywlc3BALQotCXB1dHMJIkE9IgotCXB1dG4JJWExCi0KLQkubG9uZwkweGYwMTE5ZjE1CQl8IHB0ZXN0cgkjNSwlYTFALCM3LCVhMAotCi0JcHV0cwkiREE9IgotCXB1dG4JJWEwCi0KLQlwdXRzCSJEPSIKLQlwdXRuCSVhMEAKLQotCXB1dHMJIlM9IgotCWxlYQklcGNAKEwobW11KSksJWEwCi0JLmxvbmcJMHhmMDEwNjIwMAkJfCBwbW92ZQkJJXBzciwlYTBACi0JY2xybAklZDcKLQltb3ZldwklYTBALCVkNwotCXB1dG4JJWQ3Ci0KLQlwdXRjCSdcbicKLQltb3ZlbWwJJXNwQCssJWEwLyVkNwotCXJ0cwotI2VuZGlmCS8qIDAgKi8KIAogX19JTklUREFUQQogCS5hbGlnbgk0CkBAIC0zODQ5LDcgKzM3OTQsNiBAQAogCS5sb25nCTAJCS8qIG1heCBudW0gY29sdW1ucyAqLwogCS5sb25nCTAJCS8qIG1heCBudW0gcm93cyAqLwogCS5sb25nCTAJCS8qIGxlZnQgZWRnZSAqLwotCS5sb25nCTAJCS8qIG1hYyBwdXRjICovCiBMKGNvbnNvbGVfZm9udCk6CiAJLmxvbmcJMAkJLyogcG9pbnRlciB0byBjb25zb2xlIGZvbnQgKHN0cnVjdCBmb250X2Rlc2MpICovCiBMKGNvbnNvbGVfZm9udF9kYXRhKToKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKaW5kZXggMDc3ZDNhNy4uNWI4ZDY2ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKQEAgLTEwLDkgKzEwLDkgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcvS2NvbmZpZyBiL2FyY2gvbWV0YWcvS2NvbmZpZwppbmRleCBlNTZhYmQyLi5iMWQzYzljIDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL0tjb25maWcKKysrIGIvYXJjaC9tZXRhZy9LY29uZmlnCkBAIC05LDYgKzksNyBAQAogCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCiAJc2VsZWN0IEhBVkVfQ19SRUNPUkRNQ09VTlQKIAlzZWxlY3QgSEFWRV9ERUJVR19LTUVNTEVBSworCXNlbGVjdCBIQVZFX0RFQlVHX1NUQUNLT1ZFUkZMT1cKIAlzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRQogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCkBAIC0yOSw3ICszMCw2IEBACiAJc2VsZWN0IE9GCiAJc2VsZWN0IE9GX0VBUkxZX0ZMQVRUUkVFCiAJc2VsZWN0IFNQQVJTRV9JUlEKLQlzZWxlY3QgSEFWRV9ERUJVR19TVEFDS09WRVJGTE9XCiAKIGNvbmZpZyBTVEFDS1RSQUNFX1NVUFBPUlQKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGI3MTZkODAuLmMyOWVhZDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xMyw2ICsxMyw3IEBACiBnZW5lcmljLXkgKz0gZmNudGwuaAogZ2VuZXJpYy15ICs9IGZ1dGV4LmgKIGdlbmVyaWMteSArPSBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBod19pcnEuaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpb2N0bHMuaApAQCAtMjMsNiArMjQsNyBAQAogZ2VuZXJpYy15ICs9IGt2bV9wYXJhLmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCiBnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtc2didWYuaAogZ2VuZXJpYy15ICs9IG11dGV4LmgKIGdlbmVyaWMteSArPSBwYXJhbS5oCkBAIC0zMCw2ICszMiw3IEBACiBnZW5lcmljLXkgKz0gcGVyY3B1LmgKIGdlbmVyaWMteSArPSBwb2xsLmgKIGdlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlY3Rpb25zLmgKIGdlbmVyaWMteSArPSBzZW1idWYuaApAQCAtNTIsNSArNTUsMyBAQAogZ2VuZXJpYy15ICs9IHVzZXIuaAogZ2VuZXJpYy15ICs9IHZnYS5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCA4ZTljMGIzLi5lOTVmODc0IDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0zLDMzICszLDYgQEAKIAogI2lmZGVmIENPTkZJR19OVU1BCiAKLS8qIHNjaGVkX2RvbWFpbnMgU0RfTk9ERV9JTklUIGZvciBNZXRhIG1hY2hpbmVzICovCi0jZGVmaW5lIFNEX05PREVfSU5JVCAoc3RydWN0IHNjaGVkX2RvbWFpbikgewkJXAotCS5wYXJlbnQJCQk9IE5VTEwsCQkJXAotCS5jaGlsZAkJCT0gTlVMTCwJCQlcCi0JLmdyb3VwcwkJCT0gTlVMTCwJCQlcCi0JLm1pbl9pbnRlcnZhbAkJPSA4LAkJCVwKLQkubWF4X2ludGVydmFsCQk9IDMyLAkJCVwKLQkuYnVzeV9mYWN0b3IJCT0gMzIsCQkJXAotCS5pbWJhbGFuY2VfcGN0CQk9IDEyNSwJCQlcCi0JLmNhY2hlX25pY2VfdHJpZXMJPSAyLAkJCVwKLQkuYnVzeV9pZHgJCT0gMywJCQlcCi0JLmlkbGVfaWR4CQk9IDIsCQkJXAotCS5uZXdpZGxlX2lkeAkJPSAwLAkJCVwKLQkud2FrZV9pZHgJCT0gMCwJCQlcCi0JLmZvcmtleGVjX2lkeAkJPSAwLAkJCVwKLQkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRQlcCi0JCQkJfCBTRF9CQUxBTkNFX0ZPUksJXAotCQkJCXwgU0RfQkFMQU5DRV9FWEVDCVwKLQkJCQl8IFNEX0JBTEFOQ0VfTkVXSURMRQlcCi0JCQkJfCBTRF9TRVJJQUxJWkUsCQlcCi0JLmxhc3RfYmFsYW5jZQkJPSBqaWZmaWVzLAkJXAotCS5iYWxhbmNlX2ludGVydmFsCT0gMSwJCQlcCi0JLm5yX2JhbGFuY2VfZmFpbGVkCT0gMCwJCQlcCi0JLm1heF9uZXdpZGxlX2xiX2Nvc3QJPSAwLAkJCVwKLQkubmV4dF9kZWNheV9tYXhfbGJfY29zdAk9IGppZmZpZXMsCQlcCi19Ci0KICNkZWZpbmUgY3B1X3RvX25vZGUoY3B1KQkoKHZvaWQpKGNwdSksIDApCiAjZGVmaW5lIHBhcmVudF9ub2RlKG5vZGUpCSgodm9pZCkobm9kZSksIDApCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcva2VybmVsL2lycS5jIGIvYXJjaC9tZXRhZy9rZXJuZWwvaXJxLmMKaW5kZXggM2I0YjdmNi4uNTM4NWRkMSAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9tZXRhZy9rZXJuZWwvaXJxLmMKQEAgLTI2MSwxOCArMjYxLDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIHZvaWQgcm91dGVfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkYXRhKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGNoaXAtPmlycV9zZXRfYWZmaW5pdHkpCi0JCWNoaXAtPmlycV9zZXRfYWZmaW5pdHkoZGF0YSwgY3B1bWFza19vZihjcHUpLCBmYWxzZSk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLX0KLQogLyoKICAqIFRoZSBDUFUgaGFzIGJlZW4gbWFya2VkIG9mZmxpbmUuICBNaWdyYXRlIElSUXMgb2ZmIHRoaXMgQ1BVLiAgSWYKICAqIHRoZSBhZmZpbml0eSBzZXR0aW5ncyBkbyBub3QgYWxsb3cgb3RoZXIgQ1BVcywgZm9yY2UgdGhlbSBvbnRvIGFueQpAQCAtMjgxLDEwICsyNjksOSBAQAogdm9pZCBtaWdyYXRlX2lycXModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAotCWZvcl9lYWNoX2lycV9kZXNjKGksIGRlc2MpIHsKLQkJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2Rlc2NfZ2V0X2lycV9kYXRhKGRlc2MpOworCWZvcl9lYWNoX2FjdGl2ZV9pcnEoaSkgeworCQlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKGkpOwogCQl1bnNpZ25lZCBpbnQgbmV3Y3B1OwogCiAJCWlmIChpcnFkX2lzX3Blcl9jcHUoZGF0YSkpCkBAIC0zMDAsMTEgKzI4Nyw4IEBACiAJCQkJCSAgICBpLCBjcHUpOwogCiAJCQljcHVtYXNrX3NldGFsbChkYXRhLT5hZmZpbml0eSk7Ci0JCQluZXdjcHUgPSBjcHVtYXNrX2FueV9hbmQoZGF0YS0+YWZmaW5pdHksCi0JCQkJCQkgY3B1X29ubGluZV9tYXNrKTsKIAkJfQotCi0JCXJvdXRlX2lycShkYXRhLCBpLCBuZXdjcHUpOworCQlpcnFfc2V0X2FmZmluaXR5KGksIGRhdGEtPmFmZmluaXR5KTsKIAl9CiB9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbWV0YWcva2VybmVsL3NpZ25hbC5jCmluZGV4IDNiZTYxY2YuLmI5ZTRhODIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWV0YWcva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbWV0YWcva2VybmVsL3NpZ25hbC5jCkBAIC0xNTIsMTggKzE1MiwxOCBAQAogCXJldHVybiAodm9pZCBfX3VzZXIgKilzcDsKIH0KIAotc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCi0JCQkgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc2lnc2V0X3QgKnNldCwKKwkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7Ci0JaW50IGVyciA9IC1FRkFVTFQ7CisJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIGNvZGU7CiAKLQlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncy0+UkVHX1NQLCBzaXplb2YoKmZyYW1lKSk7CisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoJmtzaWctPmthLCByZWdzLT5SRUdfU1AsIHNpemVvZigqZnJhbWUpKTsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbyk7CisJZXJyID0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCAma3NpZy0+aW5mbyk7CiAKIAkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KIAllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKIAogCWlmIChlcnIpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICAqLwogCkBAIC0xODcsMTUgKzE4NywxNSBAQAogCWVyciB8PSBfX3B1dF91c2VyKGNvZGUsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSgmZnJhbWUtPnJldGNvZGVbMV0pKTsKIAogCWlmIChlcnIpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+UkVHX1JUUCA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZS0+cmV0Y29kZTsKIAlyZWdzLT5SRUdfU1AgPSAodW5zaWduZWQgbG9uZykgZnJhbWUgKyBzaXplb2YoKmZyYW1lKTsKLQlyZWdzLT5SRUdfQVJHMSA9IHNpZzsKKwlyZWdzLT5SRUdfQVJHMSA9IGtzaWctPnNpZzsKIAlyZWdzLT5SRUdfQVJHMiA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPmluZm87CiAJcmVncy0+UkVHX0FSRzMgPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT51YzsKLQlyZWdzLT5SRUdfUEMgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CisJcmVncy0+UkVHX1BDID0gKHVuc2lnbmVkIGxvbmcpIGtzaWctPmthLnNhLnNhX2hhbmRsZXI7CiAKIAlwcl9kZWJ1ZygiU0lHIGRlbGl2ZXIgKCVzOiVkKTogc3A9JXAgcGM9JTA4eCBwcj0lMDh4XG4iLAogCQkgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+UkVHX1BDLApAQCAtMjA1LDI0ICsyMDUsMTkgQEAKIAkgKiBlZmZlY3RpdmUgY2FjaGUgZmx1c2ggLSBkaXJlY3RlZCByYXRoZXIgdGhhbiAnZnVsbCBmbHVzaCcuCiAJICovCiAJZmx1c2hfY2FjaGVfc2lndHJhbXAocmVncy0+UkVHX1JUUCwgc2l6ZW9mKGZyYW1lLT5yZXRjb2RlKSk7Ci1vdXQ6Ci0JaWYgKGVycikgewotCQlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzaWdpbmZvX3QgKmluZm8sCi0JCQkgIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgaGFuZGxlX3NpZ25hbChzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc2lnc2V0X3QgKm9sZHNldCA9IHNpZ21hc2tfdG9fc2F2ZSgpOworCWludCByZXQ7CiAKIAkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCi0JaWYgKHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncykpCi0JCXJldHVybjsKKwlyZXQgPSBzZXR1cF9ydF9mcmFtZShrc2lnLCBvbGRzZXQsIHJlZ3MpOwogCi0Jc2lnbmFsX2RlbGl2ZXJlZChzaWcsIGluZm8sIGthLCByZWdzLCB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSk7CisJc2lnbmFsX3NldHVwX2RvbmUocmV0LCBrc2lnLCB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSk7CiB9CiAKICAvKgpAQCAtMjM1LDEwICsyMzAsOCBAQAogc3RhdGljIGludCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBzeXNjYWxsKQogewogCXVuc2lnbmVkIGludCByZXR2YWwgPSAwLCBjb250aW51ZV9hZGRyID0gMCwgcmVzdGFydF9hZGRyID0gMDsKLQlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7Ci0Jc2lnaW5mb190IGluZm87Ci0JaW50IHNpZ25yOwogCWludCByZXN0YXJ0ID0gMDsKKwlzdHJ1Y3Qga3NpZ25hbCBrc2lnOwogCiAJLyoKIAkgKiBCeSB0aGUgZW5kIG9mIHJ0X3NpZ3JldHVybiB0aGUgY29udGV4dCBkZXNjcmliZXMgdGhlIHBvaW50IHRoYXQgdGhlCkBAIC0yNzUsNyArMjY4LDggQEAKIAkgKiBHZXQgdGhlIHNpZ25hbCB0byBkZWxpdmVyLiBXaGVuIHJ1bm5pbmcgdW5kZXIgcHRyYWNlLCBhdCB0aGlzIHBvaW50CiAJICogdGhlIGRlYnVnZ2VyIG1heSBjaGFuZ2UgYWxsIG91ciByZWdpc3RlcnMgLi4uCiAJICovCi0Jc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisJZ2V0X3NpZ25hbCgma3NpZyk7CisKIAkvKgogCSAqIERlcGVuZGluZyBvbiB0aGUgc2lnbmFsIHNldHRpbmdzIHdlIG1heSBuZWVkIHRvIHJldmVydCB0aGUgZGVjaXNpb24KIAkgKiB0byByZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbC4gQnV0IHNraXAgdGhpcyBpZiBhIGRlYnVnZ2VyIGhhcyBjaG9zZW4gdG8KQEAgLTI4MywxOSArMjc3LDE5IEBACiAJICovCiAJaWYgKHJlZ3MtPlJFR19QQyAhPSByZXN0YXJ0X2FkZHIpCiAJCXJlc3RhcnQgPSAwOwotCWlmIChzaWduciA+IDApIHsKKwlpZiAoa3NpZy5zaWcgPiAwKSB7CiAJCWlmICh1bmxpa2VseShyZXN0YXJ0KSkgewogCQkJaWYgKHJldHZhbCA9PSAtRVJFU1RBUlROT0hBTkQKIAkJCSAgICB8fCByZXR2YWwgPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSwogCQkJICAgIHx8IChyZXR2YWwgPT0gLUVSRVNUQVJUU1lTCi0JCQkJJiYgIShrYS5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSkgeworCQkJCSYmICEoa3NpZy5rYS5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSkgewogCQkJCXJlZ3MtPlJFR19SRVRWQUwgPSAtRUlOVFI7CiAJCQkJcmVncy0+UkVHX1BDID0gY29udGludWVfYWRkcjsKIAkJCX0KIAkJfQogCiAJCS8qIFdoZWUhIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWhhbmRsZV9zaWduYWwoc2lnbnIsICZpbmZvLCAma2EsIHJlZ3MpOworCQloYW5kbGVfc2lnbmFsKCZrc2lnLCByZWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAyYjk4YmM3Li5jOThlZDk1IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsOCArMSwxMCBAQAogCiBnZW5lcmljLXkgKz0gYmFycmllci5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBleGVjLmgKIGdlbmVyaWMteSArPSBoYXNoLmgKLWdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCi1nZW5lcmljLXkgKz0gc3lzY2FsbHMuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gc3lzY2FsbHMuaAorZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDY4YWQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL3BjaS9wY2ktY29tbW9uLmMgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYwppbmRleCA2NjgwNGFkLi43MDk5NmNjIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYworKysgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYwpAQCAtMTI5NCwxMSArMTI5NCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZpbmlzaF9hZGRpbmdfdG9fYnVzKTsKIAotaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQogc3RhdGljIHZvaWQgcGNpYmlvc19zZXR1cF9waGJfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqcmVzb3VyY2VzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCBkY2FlM2E3Li4xNmQ1YWIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMTAsNiArMTAsNyBAQAogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCiAJc2VsZWN0IFBFUkZfVVNFX1ZNQUxMT0MKIAlzZWxlY3QgSEFWRV9BUkNIX0tHREIKKwlzZWxlY3QgSEFWRV9BUkNIX1NFQ0NPTVBfRklMVEVSCiAJc2VsZWN0IEhBVkVfQVJDSF9UUkFDRUhPT0sKIAlzZWxlY3QgQVJDSF9IQVZFX0NVU1RPTV9HUElPX0gKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKQEAgLTYyLDEzICs2MywxMiBAQAogCXNlbGVjdCBDRVZUX1I0SwogCXNlbGVjdCBDU1JDX1I0SwogCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IERNQV9NQVlCRV9DT0hFUkVOVAkjIEF1MTAwMCwxNTAwLDExMDAgYXJlbid0LCByZXN0IGlzCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IFNZU19TVVBQT1JUU19aQk9PVAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCiBjb25maWcgQVI3CiAJYm9vbCAiVGV4YXMgSW5zdHJ1bWVudHMgQVI3IgpAQCAtMTIzLDcgKzEyMyw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKLQlzZWxlY3QgRUFSTFlfUFJJTlRLXzgyNTAgaWYgRUFSTFlfUFJJTlRLCisJc2VsZWN0IFVTRV9HRU5FUklDX0VBUkxZX1BSSU5US184MjUwCiAJaGVscAogCSBTdXBwb3J0IGZvciBCQ000N1hYIGJhc2VkIGJvYXJkcwogCkBAIC0xNTAsNyArMTUwLDYgQEAKIAlzZWxlY3QgQ1NSQ19SNEsKIAlzZWxlY3QgQ0VWVF9HVDY0MVhYCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBFQVJMWV9QUklOVEtfODI1MCBpZiBFQVJMWV9QUklOVEsKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJODI1MwogCXNlbGVjdCBJODI1OQpAQCAtMTYzLDYgKzE2Miw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCXNlbGVjdCBVU0VfR0VORVJJQ19FQVJMWV9QUklOVEtfODI1MAogCiBjb25maWcgTUFDSF9ERUNTVEFUSU9OCiAJYm9vbCAiREVDc3RhdGlvbnMiCkBAIC0yMzUsNyArMjM1LDYgQEAKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwotCXNlbGVjdCBIQVZFX1BXTQogCXNlbGVjdCBIQVZFX0NMSwogCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAKQEAgLTMyMCw2ICszMTksNyBAQAogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjIKKwlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IzXzUKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzY0X1IxCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFM2NF9SMgogCXNlbGVjdCBTWVNfSEFTX0NQVV9ORVZBREEKQEAgLTMyOSw2ICszMjksNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTUlQU19DTVAKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX01JUFNfQ1BTCiAJc2VsZWN0IFNZU19TVVBQT1JUU19NVUxUSVRIUkVBRElORwogCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01BUlRNSVBTCiAJc2VsZWN0IFNZU19TVVBQT1JUU19aQk9PVApAQCAtMzYwLDcgKzM2MSw2IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19TVVBQT1JUU19TTUFSVE1JUFMKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX01JQ1JPTUlQUwotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX0RFU0MKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCiAJc2VsZWN0IFVTRV9PRgpAQCAtNjc0LDYgKzY3NCw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCiAJc2VsZWN0IFNZU19TVVBQT1JUU19ISUdITUVNCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisJc2VsZWN0IFVTRV9HRU5FUklDX0VBUkxZX1BSSU5US184MjUwCiAJaGVscAogCSAgVGhlIFNOSSBSTTIwMC8zMDAvNDAwIGFyZSBNSVBTLWJhc2VkIG1hY2hpbmVzIG1hbnVmYWN0dXJlZCBieQogCSAgU2llbWVucyBOaXhkb3JmIEluZm9ybWF0aW9uc3N5c3RlbWUgKFNOSSksIHBhcmVudCBjb21wYW55IG9mIFB5cmFtaWQKQEAgLTcxOCw4ICs3MTksNiBAQAogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgWk9ORV9ETUEzMgotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBIT0xFU19JTl9aT05FCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJaGVscApAQCAtNzU2LDggKzc1NSw2IEBACiAJc2VsZWN0IFpPTkVfRE1BMzIgaWYgNjRCSVQKIAlzZWxlY3QgU1lOQ19SNEsKIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kgaWYgVVNCX1NVUFBPUlQKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kgaWYgVVNCX1NVUFBPUlQKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX1pCT09UCiAJc2VsZWN0IFNZU19TVVBQT1JUU19aQk9PVF9VQVJUMTY1NTAKIAloZWxwCkBAIC03ODIsNyArNzc5LDYgQEAKIAlzZWxlY3QgQ0VWVF9SNEsKIAlzZWxlY3QgQ1NSQ19SNEsKIAlzZWxlY3QgSVJRX0NQVQotCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01TSQogCXNlbGVjdCBaT05FX0RNQTMyIGlmIDY0QklUCiAJc2VsZWN0IFNZTkNfUjRLCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCkBAIC04NjgsNiArODY0LDcgQEAKIAlib29sCiAKIGNvbmZpZyBDRVZUX0dJQworCXNlbGVjdCBNSVBTX0NNCiAJYm9vbAogCiBjb25maWcgQ0VWVF9TQjEyNTAKQEAgLTg4Niw2ICs4ODMsNyBAQAogCWJvb2wKIAogY29uZmlnIENTUkNfR0lDCisJc2VsZWN0IE1JUFNfQ00KIAlib29sCiAKIGNvbmZpZyBDU1JDX1NCMTI1MApAQCAtMTAzMCw2ICsxMDI4LDcgQEAKIAlib29sCiAKIGNvbmZpZyBJUlFfR0lDCisJc2VsZWN0IE1JUFNfQ00KIAlib29sCiAKIGNvbmZpZyBQQ0lfR1Q2NFhYWF9QQ0kwCkBAIC0xMTQ4LDYgKzExNDcsMTggQEAKIAlwcm9tcHQgIkNQVSB0eXBlIgogCWRlZmF1bHQgQ1BVX1I0WDAwCiAKK2NvbmZpZyBDUFVfTE9PTkdTT04zCisJYm9vbCAiTG9vbmdzb24gMyBDUFUiCisJZGVwZW5kcyBvbiBTWVNfSEFTX0NQVV9MT09OR1NPTjMKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAorCXNlbGVjdCBDUFVfU1VQUE9SVFNfSElHSE1FTQorCXNlbGVjdCBDUFVfU1VQUE9SVFNfSFVHRVBBR0VTCisJc2VsZWN0IFdFQUtfT1JERVJJTkcKKwlzZWxlY3QgV0VBS19SRU9SREVSSU5HX0JFWU9ORF9MTFNDCisJaGVscAorCQlUaGUgTG9vbmdzb24gMyBwcm9jZXNzb3IgaW1wbGVtZW50cyB0aGUgTUlQUzY0UjIgaW5zdHJ1Y3Rpb24KKwkJc2V0IHdpdGggbWFueSBleHRlbnNpb25zLgorCiBjb25maWcgQ1BVX0xPT05HU09OMkUKIAlib29sICJMb29uZ3NvbiAyRSIKIAlkZXBlbmRzIG9uIFNZU19IQVNfQ1BVX0xPT05HU09OMkUKQEAgLTEyMDMsNiArMTIxNCw3IEBACiAJc2VsZWN0IENQVV9IQVNfUFJFRkVUQ0gKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBDUFVfU1VQUE9SVFNfSElHSE1FTQorCXNlbGVjdCBDUFVfU1VQUE9SVFNfTVNBCiAJc2VsZWN0IEhBVkVfS1ZNCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIHRvIGJ1aWxkIGEga2VybmVsIGZvciByZWxlYXNlIDIgb3IgbGF0ZXIgb2YgdGhlCkBAIC0xMjM4LDYgKzEyNTAsNyBAQAogCXNlbGVjdCBDUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJc2VsZWN0IENQVV9TVVBQT1JUU19ISUdITUVNCiAJc2VsZWN0IENQVV9TVVBQT1JUU19IVUdFUEFHRVMKKwlzZWxlY3QgQ1BVX1NVUFBPUlRTX01TQQogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiB0byBidWlsZCBhIGtlcm5lbCBmb3IgcmVsZWFzZSAyIG9yIGxhdGVyIG9mIHRoZQogCSAgTUlQUzY0IGFyY2hpdGVjdHVyZS4gIE1hbnkgbW9kZXJuIGVtYmVkZGVkIHN5c3RlbXMgd2l0aCBhIDY0LWJpdApAQCAtMTM5Niw3ICsxNDA5LDYgQEAKIAlzZWxlY3QgTElCRkRUCiAJc2VsZWN0IFVTRV9PRgogCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KLQlzZWxlY3QgU1lTX0hBU19ETUFfT1BTCiAJc2VsZWN0IE1JUFNfTDFfQ0FDSEVfU0hJRlRfNwogCWhlbHAKIAkgIFRoZSBDYXZpdW0gT2N0ZW9uIHByb2Nlc3NvciBpcyBhIGhpZ2hseSBpbnRlZ3JhdGVkIGNoaXAgY29udGFpbmluZwpAQCAtMTQ0OCw2ICsxNDYwLDI2IEBACiAJICBOZXRsb2dpYyBNaWNyb3N5c3RlbXMgWExQIHByb2Nlc3NvcnMuCiBlbmRjaG9pY2UKIAorY29uZmlnIENQVV9NSVBTMzJfM181X0ZFQVRVUkVTCisJYm9vbCAiTUlQUzMyIFJlbGVhc2UgMy41IEZlYXR1cmVzIgorCWRlcGVuZHMgb24gU1lTX0hBU19DUFVfTUlQUzMyX1IzXzUKKwlkZXBlbmRzIG9uIENQVV9NSVBTMzJfUjIKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gdG8gYnVpbGQgYSBrZXJuZWwgZm9yIHJlbGVhc2UgMiBvciBsYXRlciBvZiB0aGUKKwkgIE1JUFMzMiBhcmNoaXRlY3R1cmUgaW5jbHVkaW5nIGZlYXR1cmVzIGZyb20gdGhlIDMuNSByZWxlYXNlIHN1Y2ggYXMKKwkgIHN1cHBvcnQgZm9yIEVuaGFuY2VkIFZpcnR1YWwgQWRkcmVzc2luZyAoRVZBKS4KKworY29uZmlnIENQVV9NSVBTMzJfM181X0VWQQorCWJvb2wgIkVuaGFuY2VkIFZpcnR1YWwgQWRkcmVzc2luZyAoRVZBKSIKKwlkZXBlbmRzIG9uIENQVV9NSVBTMzJfM181X0ZFQVRVUkVTCisJc2VsZWN0IEVWQQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIEVuaGFuY2VkIFZpcnR1YWwKKwkgIEFkZHJlc3NpbmcgKEVWQSkgb24geW91ciBNSVBTMzIgY29yZSAoc3VjaCBhcyBwcm9BcHRpdikuCisJICBPbmUgb2YgaXRzIHByaW1hcnkgYmVuZWZpdHMgaXMgYW4gaW5jcmVhc2UgaW4gdGhlIG1heGltdW0gc2l6ZQorCSAgb2YgbG93bWVtICh1cCB0byAzR0IpLiBJZiB1bnN1cmUsIHNheSAnTicgaGVyZS4KKwogaWYgQ1BVX0xPT05HU09OMkYKIGNvbmZpZyBDUFVfTk9QX1dPUktBUk9VTkRTCiAJYm9vbApAQCAtMTUyMyw2ICsxNTU1LDEwIEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0hPVFBMVUdfQ1BVCiAKK2NvbmZpZyBTWVNfSEFTX0NQVV9MT09OR1NPTjMKKwlib29sCisJc2VsZWN0IENQVV9TVVBQT1JUU19DUFVGUkVRCisKIGNvbmZpZyBTWVNfSEFTX0NQVV9MT09OR1NPTjJFCiAJYm9vbAogCkBAIC0xNTQxLDYgKzE1NzcsOSBAQAogY29uZmlnIFNZU19IQVNfQ1BVX01JUFMzMl9SMgogCWJvb2wKIAorY29uZmlnIFNZU19IQVNfQ1BVX01JUFMzMl9SM181CisJYm9vbAorCiBjb25maWcgU1lTX0hBU19DUFVfTUlQUzY0X1IxCiAJYm9vbAogCkBAIC0xNjU3LDYgKzE2OTYsOSBAQAogCWJvb2wKIAlkZWZhdWx0IHkgaWYgQ1BVX01JUFMzMl9SMiB8fCBDUFVfTUlQUzY0X1IyIHx8IENQVV9DQVZJVU1fT0NURU9OCiAKK2NvbmZpZyBFVkEKKwlib29sCisKIGNvbmZpZyBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJYm9vbAogY29uZmlnIFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKQEAgLTE3MjksNyArMTc3MSw3IEBACiAKIGNvbmZpZyBQQUdFX1NJWkVfNEtCCiAJYm9vbCAiNGtCIgotCWRlcGVuZHMgb24gIUNQVV9MT09OR1NPTjIKKwlkZXBlbmRzIG9uICFDUFVfTE9PTkdTT04yICYmICFDUFVfTE9PTkdTT04zCiAJaGVscAogCSBUaGlzIG9wdGlvbiBzZWxlY3QgdGhlIHN0YW5kYXJkIDRrQiBMaW51eCBwYWdlIHNpemUuICBPbiBzb21lCiAJIFIzMDAwLWZhbWlseSBwcm9jZXNzb3JzIHRoaXMgaXMgdGhlIG9ubHkgYXZhaWxhYmxlIHBhZ2Ugc2l6ZS4gIFVzaW5nCkBAIC0xNzc2LDEyICsxODE4LDEyIEBACiAKIGNvbmZpZyBGT1JDRV9NQVhfWk9ORU9SREVSCiAJaW50ICJNYXhpbXVtIHpvbmUgb3JkZXIiCi0JcmFuZ2UgMTQgNjQgaWYgSFVHRVRMQl9QQUdFICYmIFBBR0VfU0laRV82NEtCCi0JZGVmYXVsdCAiMTQiIGlmIEhVR0VUTEJfUEFHRSAmJiBQQUdFX1NJWkVfNjRLQgotCXJhbmdlIDEzIDY0IGlmIEhVR0VUTEJfUEFHRSAmJiBQQUdFX1NJWkVfMzJLQgotCWRlZmF1bHQgIjEzIiBpZiBIVUdFVExCX1BBR0UgJiYgUEFHRV9TSVpFXzMyS0IKLQlyYW5nZSAxMiA2NCBpZiBIVUdFVExCX1BBR0UgJiYgUEFHRV9TSVpFXzE2S0IKLQlkZWZhdWx0ICIxMiIgaWYgSFVHRVRMQl9QQUdFICYmIFBBR0VfU0laRV8xNktCCisJcmFuZ2UgMTQgNjQgaWYgTUlQU19IVUdFX1RMQl9TVVBQT1JUICYmIFBBR0VfU0laRV82NEtCCisJZGVmYXVsdCAiMTQiIGlmIE1JUFNfSFVHRV9UTEJfU1VQUE9SVCAmJiBQQUdFX1NJWkVfNjRLQgorCXJhbmdlIDEzIDY0IGlmIE1JUFNfSFVHRV9UTEJfU1VQUE9SVCAmJiBQQUdFX1NJWkVfMzJLQgorCWRlZmF1bHQgIjEzIiBpZiBNSVBTX0hVR0VfVExCX1NVUFBPUlQgJiYgUEFHRV9TSVpFXzMyS0IKKwlyYW5nZSAxMiA2NCBpZiBNSVBTX0hVR0VfVExCX1NVUFBPUlQgJiYgUEFHRV9TSVpFXzE2S0IKKwlkZWZhdWx0ICIxMiIgaWYgTUlQU19IVUdFX1RMQl9TVVBQT1JUICYmIFBBR0VfU0laRV8xNktCCiAJcmFuZ2UgMTEgNjQKIAlkZWZhdWx0ICIxMSIKIAloZWxwCkBAIC0xODcwLDYgKzE5MTIsNyBAQAogCXNlbGVjdCBDUFVfTUlQU1IyX0lSUV9WSQogCXNlbGVjdCBDUFVfTUlQU1IyX0lSUV9FSQogCXNlbGVjdCBTWU5DX1I0SworCXNlbGVjdCBNSVBTX0dJQ19JUEkKIAlzZWxlY3QgTUlQU19NVAogCXNlbGVjdCBTTVAKIAlzZWxlY3QgU01QX1VQCkBAIC0xODg3LDYgKzE5MzAsNyBAQAogCWJvb2wgIlVzZSBhbGwgVENzIG9uIGFsbCBWUEVzIGZvciBTTVAgKERFUFJFQ0FURUQpIgogCWRlcGVuZHMgb24gQ1BVX01JUFMzMl9SMgogCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX01VTFRJVEhSRUFESU5HCisJZGVwZW5kcyBvbiAhTUlQU19DUFMKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfVkkKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfRUkKIAlzZWxlY3QgTUlQU19NVApAQCAtMTk5NCwxMyArMjAzOCw0NSBAQAogCWRlcGVuZHMgb24gTUlQU19WUEVfQVBTUF9BUEkgJiYgIU1JUFNfQ01QCiAKIGNvbmZpZyBNSVBTX0NNUAotCWJvb2wgIk1JUFMgQ01QIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfTUlQU19DTVAgJiYgTUlQU19NVF9TTVAKKwlib29sICJNSVBTIENNUCBmcmFtZXdvcmsgc3VwcG9ydCAoREVQUkVDQVRFRCkiCisJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfTUlQU19DTVAgJiYgIU1JUFNfTVRfU01UQworCXNlbGVjdCBNSVBTX0dJQ19JUEkKIAlzZWxlY3QgU1lOQ19SNEsKIAlzZWxlY3QgV0VBS19PUkRFUklORwogCWRlZmF1bHQgbgogCWhlbHAKLQkgIEVuYWJsZSBDb2hlcmVuY3kgTWFuYWdlciBwcm9jZXNzb3IgKENNUCkgc3VwcG9ydC4KKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgYSBib290bG9hZGVyIHdoaWNoIGltcGxlbWVudHMgdGhlICJDTVAKKwkgIGZyYW1ld29yayIgcHJvdG9jb2wgKGllLiBZQU1PTikgYW5kIHdhbnQgeW91ciBrZXJuZWwgdG8gbWFrZSB1c2Ugb2YKKwkgIGl0cyBhYmlsaXR5IHRvIHN0YXJ0IHNlY29uZGFyeSBDUFVzLgorCisJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBuZWVkLCB5b3Ugc2hvdWxkIHVzZSBDT05GSUdfTUlQU19DUFMKKwkgIGluc3RlYWQgb2YgdGhpcy4KKworY29uZmlnIE1JUFNfQ1BTCisJYm9vbCAiTUlQUyBDb2hlcmVudCBQcm9jZXNzaW5nIFN5c3RlbSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX01JUFNfQ1BTCisJc2VsZWN0IE1JUFNfQ00KKwlzZWxlY3QgTUlQU19DUEMKKwlzZWxlY3QgTUlQU19HSUNfSVBJCisJc2VsZWN0IFNNUAorCXNlbGVjdCBTWU5DX1I0SyBpZiAoQ0VWVF9SNEsgfHwgQ1NSQ19SNEspCisJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKKwlzZWxlY3QgV0VBS19PUkRFUklORworCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSB3aXNoIHRvIHJ1biBhbiBTTVAga2VybmVsIGFjcm9zcyBtdWx0aXBsZSBjb3JlcworCSAgd2l0aGluIGEgTUlQUyBDb2hlcmVudCBQcm9jZXNzaW5nIFN5c3RlbS4gV2hlbiB0aGlzIG9wdGlvbiBpcworCSAgZW5hYmxlZCB0aGUga2VybmVsIHdpbGwgcHJvYmUgZm9yIG90aGVyIGNvcmVzIGFuZCBib290IHRoZW0gd2l0aAorCSAgbm8gZXh0ZXJuYWwgYXNzaXN0YW5jZS4gSXQgaXMgc2FmZSB0byBlbmFibGUgdGhpcyB3aGVuIGhhcmR3YXJlCisJICBzdXBwb3J0IGlzIHVuYXZhaWxhYmxlLgorCitjb25maWcgTUlQU19HSUNfSVBJCisJYm9vbAorCitjb25maWcgTUlQU19DTQorCWJvb2wKKworY29uZmlnIE1JUFNfQ1BDCisJYm9vbAogCiBjb25maWcgU0IxX1BBU1NfMV9XT1JLQVJPVU5EUwogCWJvb2wKQEAgLTIwNDMsNiArMjExOSwyMSBAQAogCSAgV2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkIHRoZSBrZXJuZWwgd2lsbCBiZSBidWlsdCB1c2luZyB0aGUKIAkgIG1pY3JvTUlQUyBJU0EKIAorY29uZmlnIENQVV9IQVNfTVNBCisJYm9vbCAiU3VwcG9ydCBmb3IgdGhlIE1JUFMgU0lNRCBBcmNoaXRlY3R1cmUiCisJZGVwZW5kcyBvbiBDUFVfU1VQUE9SVFNfTVNBCisJZGVmYXVsdCB5CisJaGVscAorCSAgTUlQUyBTSU1EIEFyY2hpdGVjdHVyZSAoTVNBKSBpbnRyb2R1Y2VzIDEyOCBiaXQgd2lkZSB2ZWN0b3IgcmVnaXN0ZXJzCisJICBhbmQgYSBzZXQgb2YgU0lNRCBpbnN0cnVjdGlvbnMgdG8gb3BlcmF0ZSBvbiB0aGVtLiBXaGVuIHRoaXMgb3B0aW9uCisJICBpcyBlbmFibGVkIHRoZSBrZXJuZWwgd2lsbCBzdXBwb3J0IGFsbG9jYXRpbmcgJiBzd2l0Y2hpbmcgTVNBCisJICB2ZWN0b3IgcmVnaXN0ZXIgY29udGV4dHMuIElmIHlvdSBrbm93IHRoYXQgeW91ciBrZXJuZWwgd2lsbCBvbmx5IGJlCisJICBydW5uaW5nIG9uIENQVXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgTVNBIG9yIHRoYXQgeW91ciB1c2VybGFuZCB3aWxsCisJICBub3QgYmUgbWFraW5nIHVzZSBvZiBpdCB0aGVuIHlvdSBtYXkgd2lzaCB0byBzYXkgTiBoZXJlIHRvIHJlZHVjZQorCSAgdGhlIHNpemUgJiBjb21wbGV4aXR5IG9mIHlvdXIga2VybmVsLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgQ1BVX0hBU19XQgogCWJvb2wKIApAQCAtMjA5NCw3ICsyMTg1LDcgQEAKICMKIGNvbmZpZyBISUdITUVNCiAJYm9vbCAiSGlnaCBNZW1vcnkgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIDMyQklUICYmIENQVV9TVVBQT1JUU19ISUdITUVNICYmIFNZU19TVVBQT1JUU19ISUdITUVNCisJZGVwZW5kcyBvbiAzMkJJVCAmJiBDUFVfU1VQUE9SVFNfSElHSE1FTSAmJiBTWVNfU1VQUE9SVFNfSElHSE1FTSAmJiAhQ1BVX01JUFMzMl8zXzVfRVZBCiAKIGNvbmZpZyBDUFVfU1VQUE9SVFNfSElHSE1FTQogCWJvb2wKQEAgLTIxMDgsNiArMjE5OSw5IEBACiBjb25maWcgU1lTX1NVUFBPUlRTX01JQ1JPTUlQUwogCWJvb2wKIAorY29uZmlnIENQVV9TVVBQT1JUU19NU0EKKwlib29sCisKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gIU5VTUEgJiYgIUNQVV9MT09OR1NPTjIKQEAgLTIxODEsNiArMjI3NSw5IEBACiBjb25maWcgU1lTX1NVUFBPUlRTX01JUFNfQ01QCiAJYm9vbAogCitjb25maWcgU1lTX1NVUFBPUlRTX01JUFNfQ1BTCisJYm9vbAorCiBjb25maWcgU1lTX1NVUFBPUlRTX1NNUAogCWJvb2wKIApAQCAtMjM1Myw5ICsyNDUwLDggQEAKIAkgIElmIHVuc3VyZSwgc2F5IFkuIE9ubHkgZW1iZWRkZWQgc2hvdWxkIHNheSBOIGhlcmUuCiAKIGNvbmZpZyBNSVBTX08zMl9GUDY0X1NVUFBPUlQKLQlib29sICJTdXBwb3J0IGZvciBPMzIgYmluYXJpZXMgdXNpbmcgNjQtYml0IEZQIgorCWJvb2wgIlN1cHBvcnQgZm9yIE8zMiBiaW5hcmllcyB1c2luZyA2NC1iaXQgRlAgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiAzMkJJVCB8fCBNSVBTMzJfTzMyCi0JZGVmYXVsdCB5CiAJaGVscAogCSAgV2hlbiB0aGlzIGlzIGVuYWJsZWQsIHRoZSBrZXJuZWwgd2lsbCBzdXBwb3J0IHVzZSBvZiA2NC1iaXQgZmxvYXRpbmcKIAkgIHBvaW50IHJlZ2lzdGVycyB3aXRoIGJpbmFyaWVzIHVzaW5nIHRoZSBPMzIgQUJJIGFsb25nIHdpdGggdGhlCkBAIC0yMzY3LDcgKzI0NjMsMTQgQEAKIAkgIG9mIHlvdXIga2VybmVsICYgcG90ZW50aWFsbHkgaW1wcm92ZSBGUCBlbXVsYXRpb24gcGVyZm9ybWFuY2UgYnkKIAkgIHNheWluZyBOIGhlcmUuCiAKLQkgIElmIHVuc3VyZSwgc2F5IFkuCisJICBBbHRob3VnaCBiaW51dGlscyBjdXJyZW50bHkgc3VwcG9ydHMgdXNlIG9mIHRoaXMgZmxhZyB0aGUgZGV0YWlscworCSAgY29uY2VybmluZyBpdHMgZWZmZWN0IHVwb24gdGhlIE8zMiBBQkkgaW4gdXNlcmxhbmQgYXJlIHN0aWxsIGJlaW5nCisJICB3b3JrZWQgb24uIEluIG9yZGVyIHRvIGF2b2lkIHVzZXJsYW5kIGJlY29taW5nIGRlcGVuZGFudCB1cG9uIGN1cnJlbnQKKwkgIGJlaGF2aW91ciBiZWZvcmUgdGhlIGRldGFpbHMgaGF2ZSBiZWVuIGZpbmFsaXNlZCwgdGhpcyBvcHRpb24gc2hvdWxkCisJICBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCBhbmQgb25seSBlbmFibGVkIGJ5IHRob3NlIHdvcmtpbmcgdXBvbgorCSAgc2FpZCBkZXRhaWxzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgVVNFX09GCiAJYm9vbApAQCAtMjQwNyw2ICsyNTEwLDE3IEBACiAJICB5b3VyIGJveC4gT3RoZXIgYnVzIHN5c3RlbXMgYXJlIElTQSwgRUlTQSwgb3IgVkVTQS4gSWYgeW91IGhhdmUgUENJLAogCSAgc2F5IFksIG90aGVyd2lzZSBOLgogCitjb25maWcgSFRfUENJCisJYm9vbCAiU3VwcG9ydCBmb3IgSFQtbGlua2VkIFBDSSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENQVV9MT09OR1NPTjMKKwlzZWxlY3QgUENJCisJc2VsZWN0IFBDSV9ET01BSU5TCisJaGVscAorCSAgTG9vbmdzb24gZmFtaWx5IG1hY2hpbmVzIHVzZSBIeXBlci1UcmFuc3BvcnQgYnVzIGZvciBpbnRlci1jb3JlCisJICBjb25uZWN0aW9uIGFuZCBkZXZpY2UgY29ubmVjdGlvbi4gVGhlIFBDSSBidXMgaXMgYSBzdWJvcmRpbmF0ZQorCSAgbGlua2VkIGF0IEhULiBDaG9vc2UgWSBmb3IgTG9vbmdzb24tMyBiYXNlZCBtYWNoaW5lcy4KKwogY29uZmlnIFBDSV9ET01BSU5TCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnCmluZGV4IGIxNDdlNzAuLjI1ZGUyOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnCkBAIC0yMSwxMyArMjEsMTcgQEAKIAkgIHVubGVzcyB5b3Ugd2FudCB0byBkZWJ1ZyBzdWNoIGEgY3Jhc2guCiAKIGNvbmZpZyBFQVJMWV9QUklOVEtfODI1MAotCWJvb2wgIjgyNTAvMTY1NTAgYW5kIGNvbXBhdGlibGUgc2VyaWFsIGVhcmx5IHByaW50ayBkcml2ZXIiCi0JZGVwZW5kcyBvbiBFQVJMWV9QUklOVEsKLQlkZWZhdWx0IG4KKwlib29sCisJZGVwZW5kcyBvbiBFQVJMWV9QUklOVEsgJiYgVVNFX0dFTkVSSUNfRUFSTFlfUFJJTlRLXzgyNTAKKwlkZWZhdWx0IHkKIAloZWxwCisJICAiODI1MC8xNjU1MCBhbmQgY29tcGF0aWJsZSBzZXJpYWwgZWFybHkgcHJpbnRrIGRyaXZlciIKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHVzZSBhIDgyNTAvMTY1NTAgc2VyaWFsCiAJICBwb3J0IGFzIHRoZSBib290IGNvbnNvbGUuCiAKK2NvbmZpZyBVU0VfR0VORVJJQ19FQVJMWV9QUklOVEtfODI1MAorCWJvb2wKKwogY29uZmlnIENNRExJTkVfQk9PTAogCWJvb2wgIkJ1aWx0LWluIGtlcm5lbCBjb21tYW5kIGxpbmUiCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvTWFrZWZpbGUgYi9hcmNoL21pcHMvTWFrZWZpbGUKaW5kZXggOWI4NTU2ZC4uMWE1YjQwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9NYWtlZmlsZQpAQCAtMTE5LDYgKzExOSwxMSBAQAogY2ZsYWdzLSQoQ09ORklHX1NCMVhYWF9DT1JFTElTKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tc2NoZWQtcHJvbG9nKSBcCiAJCQkJICAgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKIAoraWZlcSAoJChDT05GSUdfQ1BVX0hBU19NU0EpLHkpCit0b29sY2hhaW4tbXNhCQkJOj0gJChjYWxsIGNjLW9wdGlvbi15biwtbWhhcmQtZmxvYXQgLW1mcDY0IC1tbXNhKQorY2ZsYWdzLSQodG9vbGNoYWluLW1zYSkJCSs9IC1EVE9PTENIQUlOX1NVUFBPUlRTX01TQQorZW5kaWYKKwogIwogIyBDUFUtZGVwZW5kZW50IGNvbXBpbGVyL2Fzc2VtYmxlciBvcHRpb25zIGZvciBvcHRpbWl6YXRpb24uCiAjCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnIGIvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZwppbmRleCA3MDMyYWM3Li5iOTYyODk4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L0tjb25maWcKQEAgLTE2LDM2ICsxNiwyOSBAQAogY2hvaWNlCiAJcHJvbXB0ICJNYWNoaW5lIHR5cGUiCiAJZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkKLQlkZWZhdWx0IE1JUFNfREIxMDAwCisJZGVmYXVsdCBNSVBTX0RCMVhYWAogCiBjb25maWcgTUlQU19NVFgxCiAJYm9vbCAiNEcgU3lzdGVtcyBNVFgtMSBib2FyZCIKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCi1jb25maWcgTUlQU19EQjEwMDAKLQlib29sICJBbGNoZW15IERCMTAwMC9EQjE1MDAvREIxMTAwIFBCMTUwMC8xMTAwIGJvYXJkcyIKLQlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgotCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwotCi1jb25maWcgTUlQU19EQjEyMzUKLQlib29sICJBbGNoZW15IERCMTIwMC9QQjEyMDAvREIxMzAwL0RCMTU1MC9QQjE1NTAgYm9hcmRzIgorY29uZmlnIE1JUFNfREIxWFhYCisJYm9vbCAiQWxjaGVteSBEQjFYWFggLyBQQjFYWFggYm9hcmRzIgogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IERNQV9DT0hFUkVOVAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USworCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBBbGNoZW15CisJICBkZXZlbG9wbWVudCBib2FyZHM6ICBEQjEwMDAgREIxNTAwIERCMTEwMCBEQjE1NTAgREIxMjAwIERCMTMwMAorCQkJICAgICAgIFBCMTUwMCBQQjExMDAgUEIxNTUwIFBCMTIwMAorCSAgQm9hcmQgdHlwZSBpcyBhdXRvZGV0ZWN0ZWQgZHVyaW5nIGJvb3QuCiAKIGNvbmZpZyBNSVBTX1hYUzE1MDAKIAlib29sICJNeUNhYmxlIFhYUzE1MDAgYm9hcmQiCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCkBAIC01NCw3ICs0Nyw2IEBACiAJYm9vbCAiVHJhcGV6ZSBJVFMgR1BSIGJvYXJkIgogCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L1BsYXRmb3JtIGIvYXJjaC9taXBzL2FsY2hlbXkvUGxhdGZvcm0KaW5kZXggYjNhZmNkZC4uMzNjOWRhMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvUGxhdGZvcm0KKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvUGxhdGZvcm0KQEAgLTUsMTggKzUsMTIgQEAKIAogCiAjCi0jIEFNRCBBbGNoZW15IERiMTAwMC9EYjE1MDAvUGIxNTAwL0RiMTEwMC9QYjExMDAgZXZhbCBib2FyZHMKKyMgQU1EIEFsY2hlbXkgRGIxMDAwL0RiMTUwMC9QYjE1MDAvRGIxMTAwL1BiMTEwMAorIyAgICAgICAgICAgICBEYjE1NTAvUGIxNTUwL0RiMTIwMC9QYjEyMDAvRGIxMzAwCiAjCi1wbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMTAwMCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCi1jZmxhZ3MtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKLWxvYWQtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAotCi0jCi0jIEFNRCBBbGNoZW15IERiMTIwMC9QYjEyMDAvRGIxNTUwL1BiMTU1MC9EYjEzMDAgZXZhbCBib2FyZHMKLSMKLXBsYXRmb3JtLSQoQ09ORklHX01JUFNfREIxMjM1KQkrPSBhbGNoZW15L2RldmJvYXJkcy8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTIzNSkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAotbG9hZC0kKENPTkZJR19NSVBTX0RCMTIzNSkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCitwbGF0Zm9ybS0kKENPTkZJR19NSVBTX0RCMVhYWCkJKz0gYWxjaGVteS9kZXZib2FyZHMvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjFYWFgpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKK2xvYWQtJChDT05GSUdfTUlQU19EQjFYWFgpCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIDRHLVN5c3RlbXMgTVRYLTEgIk1lc2hDdWJlIiB3aXJlbGVzcyByb3V0ZXIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2JvYXJkLWdwci5jIGIvYXJjaC9taXBzL2FsY2hlbXkvYm9hcmQtZ3ByLmMKaW5kZXggOWVkYzM1Zi4uYWNmOWEyYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvYm9hcmQtZ3ByLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvYm9hcmQtZ3ByLmMKQEAgLTUzLDEwICs1Myw4IEBACiAJcHJvbV9pbml0X2NtZGxpbmUoKTsKIAogCW1lbXNpemVfc3RyID0gcHJvbV9nZXRlbnYoIm1lbXNpemUiKTsKLQlpZiAoIW1lbXNpemVfc3RyKQorCWlmICghbWVtc2l6ZV9zdHIgfHwga3N0cnRvdWwobWVtc2l6ZV9zdHIsIDAsICZtZW1zaXplKSkKIAkJbWVtc2l6ZSA9IDB4MDQwMDAwMDA7Ci0JZWxzZQotCQlzdHJpY3Rfc3RydG91bChtZW1zaXplX3N0ciwgMCwgJm1lbXNpemUpOwogCWFkZF9tZW1vcnlfcmVnaW9uKDAsIG1lbXNpemUsIEJPT1RfTUVNX1JBTSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2JvYXJkLW10eDEuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2JvYXJkLW10eDEuYwppbmRleCA5OTY5ZGJhLi4yNWE1OWEyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9ib2FyZC1tdHgxLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvYm9hcmQtbXR4MS5jCkBAIC01MiwxMCArNTIsOCBAQAogCXByb21faW5pdF9jbWRsaW5lKCk7CiAKIAltZW1zaXplX3N0ciA9IHByb21fZ2V0ZW52KCJtZW1zaXplIik7Ci0JaWYgKCFtZW1zaXplX3N0cikKKwlpZiAoIW1lbXNpemVfc3RyIHx8IGtzdHJ0b3VsKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSkpCiAJCW1lbXNpemUgPSAweDA0MDAwMDAwOwotCWVsc2UKLQkJc3RyaWN0X3N0cnRvdWwobWVtc2l6ZV9zdHIsIDAsICZtZW1zaXplKTsKIAlhZGRfbWVtb3J5X3JlZ2lvbigwLCBtZW1zaXplLCBCT09UX01FTV9SQU0pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zZXR1cC5jCmluZGV4IDYyYjRlN2IuLjU2NmExNzQzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorI2luY2x1ZGUgPGFzbS9kbWEtY29oZXJlbmNlLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIApAQCAtNTksNiArNjAsMTUgQEAKIAkJLyogQ2xlYXIgdG8gb2J0YWluIGJlc3Qgc3lzdGVtIGJ1cyBwZXJmb3JtYW5jZSAqLwogCQljbGVhcl9jMF9jb25maWcoMSA8PCAxOSk7IC8qIENsZWFyIENvbmZpZ1tPRF0gKi8KIAorCWh3X2NvaGVyZW50aW8gPSAwOworCWNvaGVyZW50aW8gPSAxOworCXN3aXRjaCAoYWxjaGVteV9nZXRfY3B1dHlwZSgpKSB7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTEwMDA6CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1MDA6CisJY2FzZSBBTENIRU1ZX0NQVV9BVTExMDA6CisJCWNvaGVyZW50aW8gPSAwOworCX0KKwogCWJvYXJkX3NldHVwKCk7CS8qIGJvYXJkIHNwZWNpZmljIHNldHVwICovCiAKIAkvKiBJTy9NRU0gcmVzb3VyY2VzLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NsZWVwZXIuUyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMKaW5kZXggNzA2ZDkzMy4uYzczZDgxMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NsZWVwZXIuUworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2xlZXBlci5TCkBAIC05NSw3ICs5NSw3IEBACiAKIAkvKiBjYWNoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zLCBhcyBtZW1vcnkgZ2V0cyBwdXQgdG8gc2xlZXAgKi8KIAlsYQl0MCwgMWYKLQkuc2V0CW1pcHMzCisJLnNldAlhcmNoPXI0MDAwCiAJY2FjaGUJMHgxNCwgMCh0MCkKIAljYWNoZQkweDE0LCAzMih0MCkKIAljYWNoZQkweDE0LCA2NCh0MCkKQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAJLyogY2FjaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucywgYXMgbWVtb3J5IGdldHMgcHV0IHRvIHNsZWVwICovCiAJbGEJdDAsIDFmCi0JLnNldAltaXBzMworCS5zZXQJYXJjaD1yNDAwMAogCWNhY2hlCTB4MTQsIDAodDApCiAJY2FjaGUJMHgxNCwgMzIodDApCiAJY2FjaGUJMHgxNCwgNjQodDApCkBAIC0xNjMsNyArMTYzLDcgQEAKIAlsYQl0MSwgNGYKIAlzdWJ1CXQyLCB0MSwgdDAKIAotCS5zZXQJbWlwczMKKwkuc2V0CWFyY2g9cjQwMDAKIAogMToJY2FjaGUJMHgxNCwgMCh0MCkKIAlzdWJ1CXQyLCB0MiwgMzIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9NYWtlZmlsZQppbmRleCAxNWJmNzMwLi45ZGEzNjU5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL01ha2VmaWxlCkBAIC0yLDcgKzIsNSBAQAogIyBBbGNoZW15IERldmVsYm9hcmRzCiAjCiAKLW9iai15ICs9IGJjc3IubyBwbGF0Zm9ybS5vCitvYmoteSArPSBiY3NyLm8gcGxhdGZvcm0ubyBkYjEwMDAubyBkYjEyMDAubyBkYjEzMDAubyBkYjE1NTAubyBkYjF4eHgubwogb2JqLSQoQ09ORklHX1BNKQkJKz0gcG0ubwotb2JqLSQoQ09ORklHX01JUFNfREIxMDAwKQkrPSBkYjEwMDAubwotb2JqLSQoQ09ORklHX01JUFNfREIxMjM1KQkrPSBkYjEyMzUubyBkYjEyMDAubyBkYjEzMDAubyBkYjE1NTAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTAwMC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTAwMC5jCmluZGV4IDU0ODM5MDYuLjkyZGQ5MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEwMDAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMDAwLmMKQEAgLTQxLDQyICs0MSwyNyBAQAogCiAjZGVmaW5lIEZfU1dBUFBFRCAoYmNzcl9yZWFkKEJDU1JfU1RBVFVTKSAmIEJDU1JfU1RBVFVTX0RCMTAwMF9TV0FQQk9PVCkKIAotc3RydWN0IHBjaV9kZXY7Citjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCk7CiAKLXN0YXRpYyBjb25zdCBjaGFyICpib2FyZF90eXBlX3N0cih2b2lkKQotewotCXN3aXRjaCAoQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSkpIHsKLQljYXNlIEJDU1JfV0hPQU1JX0RCMTAwMDoKLQkJcmV0dXJuICJEQjEwMDAiOwotCWNhc2UgQkNTUl9XSE9BTUlfREIxNTAwOgotCQlyZXR1cm4gIkRCMTUwMCI7Ci0JY2FzZSBCQ1NSX1dIT0FNSV9EQjExMDA6Ci0JCXJldHVybiAiREIxMTAwIjsKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMDoKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMFIyOgotCQlyZXR1cm4gIlBCMTUwMCI7Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjExMDA6Ci0JCXJldHVybiAiUEIxMTAwIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIih1bmtub3duKSI7Ci0JfQotfQotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gYm9hcmRfdHlwZV9zdHIoKTsKLX0KLQotdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKK2ludCBfX2luaXQgZGIxMDAwX2JvYXJkX3NldHVwKHZvaWQpCiB7CiAJLyogaW5pdGlhbGl6ZSBib2FyZCByZWdpc3RlciBzcGFjZSAqLwogCWJjc3JfaW5pdChEQjEwMDBfQkNTUl9QSFlTX0FERFIsCiAJCSAgREIxMDAwX0JDU1JfUEhZU19BRERSICsgREIxMDAwX0JDU1JfSEVYTEVEX09GUyk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJBTUQgQWxjaGVteSAlcyBCb2FyZFxuIiwgYm9hcmRfdHlwZV9zdHIoKSk7CisJc3dpdGNoIChCQ1NSX1dIT0FNSV9CT0FSRChiY3NyX3JlYWQoQkNTUl9XSE9BTUkpKSkgeworCWNhc2UgQkNTUl9XSE9BTUlfREIxMDAwOgorCWNhc2UgQkNTUl9XSE9BTUlfREIxNTAwOgorCWNhc2UgQkNTUl9XSE9BTUlfREIxMTAwOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxNTAwOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxNTAwUjI6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjExMDA6CisJCXByX2luZm8oIkFNRCBBbGNoZW15ICVzIEJvYXJkXG4iLCBnZXRfc3lzdGVtX3R5cGUoKSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotCiBzdGF0aWMgaW50IGRiMTUwMF9tYXBfcGNpX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKQogewogCWlmICgoc2xvdCA8IDEyKSB8fCAoc2xvdCA+IDEzKSB8fCBwaW4gPT0gMCkKQEAgLTExNCwxNyArOTksMTAgQEAKIAkucmVzb3VyY2UJPSBhbGNoZW15X3BjaV9ob3N0X3JlcywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGRiMTUwMF9wY2lfaW5pdCh2b2lkKQoraW50IF9faW5pdCBkYjE1MDBfcGNpX3NldHVwKHZvaWQpCiB7Ci0JaW50IGlkID0gQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSk7Ci0JaWYgKChpZCA9PSBCQ1NSX1dIT0FNSV9EQjE1MDApIHx8IChpZCA9PSBCQ1NSX1dIT0FNSV9QQjE1MDApIHx8Ci0JICAgIChpZCA9PSBCQ1NSX1dIT0FNSV9QQjE1MDBSMikpCi0JCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRiMTUwMF9wY2lfaG9zdF9kZXYpOwotCXJldHVybiAwOworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRiMTUwMF9wY2lfaG9zdF9kZXYpOwogfQotLyogbXVzdCBiZSBhcmNoX2luaXRjYWxsOyBNSVBTIFBDSSBzY2FucyBidXNzZXMgaW4gYSBzdWJzeXNfaW5pdGNhbGwgKi8KLWFyY2hfaW5pdGNhbGwoZGIxNTAwX3BjaV9pbml0KTsKLQogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTEwMF9sY2RfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpAQCAtNTEzLDcgKzQ5MSw3IEBACiAJJmRiMTAwMF9pcmRhX2RldiwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGRiMTAwMF9kZXZfaW5pdCh2b2lkKQoraW50IF9faW5pdCBkYjEwMDBfZGV2X3NldHVwKHZvaWQpCiB7CiAJaW50IGJvYXJkID0gQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSk7CiAJaW50IGMwLCBjMSwgZDAsIGQxLCBzMCwgczEsIGZsYXNoc2l6ZSA9IDMyLCAgdHdvc29ja3MgPSAxOwpAQCAtNjIzLDQgKzYwMSwzIEBACiAJZGIxeF9yZWdpc3Rlcl9ub3JmbGFzaChmbGFzaHNpemUgPDwgMjAsIDQgLyogMzJiaXQgKi8sIEZfU1dBUFBFRCk7CiAJcmV0dXJuIDA7CiB9Ci1kZXZpY2VfaW5pdGNhbGwoZGIxMDAwX2Rldl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAuYwppbmRleCBhODRkOThiLi45ZTQ2NjY3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIwMC5jCkBAIC0zNSwxNiArMzUsNjMgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CisjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTExMDBfbW1jLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTIwMGZiLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTU1MF9zcGkuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9kYjEyMDAuaD4KIAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKKyNkZWZpbmUgQkNTUl9JTlRfSURFCQkweDAwMDEKKyNkZWZpbmUgQkNTUl9JTlRfRVRICQkweDAwMDIKKyNkZWZpbmUgQkNTUl9JTlRfUEMwCQkweDAwMDQKKyNkZWZpbmUgQkNTUl9JTlRfUEMwU1RTQ0hHCTB4MDAwOAorI2RlZmluZSBCQ1NSX0lOVF9QQzEJCTB4MDAxMAorI2RlZmluZSBCQ1NSX0lOVF9QQzFTVFNDSEcJMHgwMDIwCisjZGVmaW5lIEJDU1JfSU5UX0RDCQkweDAwNDAKKyNkZWZpbmUgQkNTUl9JTlRfRkxBU0hCVVNZCTB4MDA4MAorI2RlZmluZSBCQ1NSX0lOVF9QQzBJTlNFUlQJMHgwMTAwCisjZGVmaW5lIEJDU1JfSU5UX1BDMEVKRUNUCTB4MDIwMAorI2RlZmluZSBCQ1NSX0lOVF9QQzFJTlNFUlQJMHgwNDAwCisjZGVmaW5lIEJDU1JfSU5UX1BDMUVKRUNUCTB4MDgwMAorI2RlZmluZSBCQ1NSX0lOVF9TRDBJTlNFUlQJMHgxMDAwCisjZGVmaW5lIEJDU1JfSU5UX1NEMEVKRUNUCTB4MjAwMAorI2RlZmluZSBCQ1NSX0lOVF9TRDFJTlNFUlQJMHg0MDAwCisjZGVmaW5lIEJDU1JfSU5UX1NEMUVKRUNUCTB4ODAwMAorCisjZGVmaW5lIERCMTIwMF9JREVfUEhZU19BRERSCTB4MTg4MDAwMDAKKyNkZWZpbmUgREIxMjAwX0lERV9SRUdfU0hJRlQJNQorI2RlZmluZSBEQjEyMDBfSURFX1BIWVNfTEVOCSgxNiA8PCBEQjEyMDBfSURFX1JFR19TSElGVCkKKyNkZWZpbmUgREIxMjAwX0VUSF9QSFlTX0FERFIJMHgxOTAwMDMwMAorI2RlZmluZSBEQjEyMDBfTkFORF9QSFlTX0FERFIJMHgyMDAwMDAwMAorCisjZGVmaW5lIFBCMTIwMF9JREVfUEhZU19BRERSCTB4MEM4MDAwMDAKKyNkZWZpbmUgUEIxMjAwX0VUSF9QSFlTX0FERFIJMHgwRDAwMDMwMAorI2RlZmluZSBQQjEyMDBfTkFORF9QSFlTX0FERFIJMHgxQzAwMDAwMAorCisjZGVmaW5lIERCMTIwMF9JTlRfQkVHSU4JKEFVMTAwMF9NQVhfSU5UUiArIDEpCisjZGVmaW5lIERCMTIwMF9JREVfSU5UCQkoREIxMjAwX0lOVF9CRUdJTiArIDApCisjZGVmaW5lIERCMTIwMF9FVEhfSU5UCQkoREIxMjAwX0lOVF9CRUdJTiArIDEpCisjZGVmaW5lIERCMTIwMF9QQzBfSU5UCQkoREIxMjAwX0lOVF9CRUdJTiArIDIpCisjZGVmaW5lIERCMTIwMF9QQzBfU1RTQ0hHX0lOVAkoREIxMjAwX0lOVF9CRUdJTiArIDMpCisjZGVmaW5lIERCMTIwMF9QQzFfSU5UCQkoREIxMjAwX0lOVF9CRUdJTiArIDQpCisjZGVmaW5lIERCMTIwMF9QQzFfU1RTQ0hHX0lOVAkoREIxMjAwX0lOVF9CRUdJTiArIDUpCisjZGVmaW5lIERCMTIwMF9EQ19JTlQJCShEQjEyMDBfSU5UX0JFR0lOICsgNikKKyNkZWZpbmUgREIxMjAwX0ZMQVNIQlVTWV9JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyA3KQorI2RlZmluZSBEQjEyMDBfUEMwX0lOU0VSVF9JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyA4KQorI2RlZmluZSBEQjEyMDBfUEMwX0VKRUNUX0lOVAkoREIxMjAwX0lOVF9CRUdJTiArIDkpCisjZGVmaW5lIERCMTIwMF9QQzFfSU5TRVJUX0lOVAkoREIxMjAwX0lOVF9CRUdJTiArIDEwKQorI2RlZmluZSBEQjEyMDBfUEMxX0VKRUNUX0lOVAkoREIxMjAwX0lOVF9CRUdJTiArIDExKQorI2RlZmluZSBEQjEyMDBfU0QwX0lOU0VSVF9JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyAxMikKKyNkZWZpbmUgREIxMjAwX1NEMF9FSkVDVF9JTlQJKERCMTIwMF9JTlRfQkVHSU4gKyAxMykKKyNkZWZpbmUgUEIxMjAwX1NEMV9JTlNFUlRfSU5UCShEQjEyMDBfSU5UX0JFR0lOICsgMTQpCisjZGVmaW5lIFBCMTIwMF9TRDFfRUpFQ1RfSU5UCShEQjEyMDBfSU5UX0JFR0lOICsgMTUpCisjZGVmaW5lIERCMTIwMF9JTlRfRU5ECQkoREIxMjAwX0lOVF9CRUdJTiArIDE1KQorCiBjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGRiMTIwMF9kZXRlY3RfYm9hcmQodm9pZCkKQEAgLTg5LDYgKzEzNiwxNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXdob2FtaSA9IGJjc3JfcmVhZChCQ1NSX1dIT0FNSSk7CisJc3dpdGNoIChCQ1NSX1dIT0FNSV9CT0FSRCh3aG9hbWkpKSB7CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjEyMDBfRERSMToKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTIwMF9ERFIyOgorCWNhc2UgQkNTUl9XSE9BTUlfREIxMjAwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlwcmludGsoS0VSTl9JTkZPICJBbGNoZW15L0FNRC9STUkgJXMgQm9hcmQsIENQTEQgUmV2ICVkIgogCQkiICBCb2FyZC1JRCAlZAlEYXVnaHRlcmNhcmQgSUQgJWRcbiIsIGdldF9zeXN0ZW1fdHlwZSgpLAogCQkod2hvYW1pID4+IDQpICYgMHhmLCAod2hvYW1pID4+IDgpICYgMHhmLCB3aG9hbWkgJiAweGYpOwpAQCAtMjc1LDMyICszMzEsMzggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyBzdHJ1Y3QgcGF0YV9wbGF0Zm9ybV9pbmZvIGRiMTIwMF9pZGVfaW5mbyA9IHsKKwkuaW9wb3J0X3NoaWZ0CT0gREIxMjAwX0lERV9SRUdfU0hJRlQsCit9OworCisjZGVmaW5lIElERV9BTFRfU1RBUlQJKDE0IDw8IERCMTIwMF9JREVfUkVHX1NISUZUKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYjEyMDBfaWRlX3Jlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gREIxMjAwX0lERV9QSFlTX0FERFIsCi0JCS5lbmQJPSBEQjEyMDBfSURFX1BIWVNfQUREUiArIERCMTIwMF9JREVfUEhZU19MRU4gLSAxLAorCQkuZW5kCT0gREIxMjAwX0lERV9QSFlTX0FERFIgKyBJREVfQUxUX1NUQVJUIC0gMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CisJCS5zdGFydAk9IERCMTIwMF9JREVfUEhZU19BRERSICsgSURFX0FMVF9TVEFSVCwKKwkJLmVuZAk9IERCMTIwMF9JREVfUEhZU19BRERSICsgREIxMjAwX0lERV9QSFlTX0xFTiAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzJdID0gewogCQkuc3RhcnQJPSBEQjEyMDBfSURFX0lOVCwKIAkJLmVuZAk9IERCMTIwMF9JREVfSU5ULAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9ETUFfUkVRMSwKLQkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAotCX0sCiB9OwogCiBzdGF0aWMgdTY0IGF1MTIwMF9pZGVfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRiMTIwMF9pZGVfZGV2ID0gewotCS5uYW1lCQk9ICJhdTEyMDAtaWRlIiwKKwkubmFtZQkJPSAicGF0YV9wbGF0Zm9ybSIsCiAJLmlkCQk9IDAsCiAJLmRldiA9IHsKIAkJLmRtYV9tYXNrCQk9ICZhdTEyMDBfaWRlX2RtYW1hc2ssCiAJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZkYjEyMDBfaWRlX2luZm8sCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZGIxMjAwX2lkZV9yZXMpLAogCS5yZXNvdXJjZQk9IGRiMTIwMF9pZGVfcmVzLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIzNS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWMxOWRjLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMzUuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBEQjEyMDAvUEIxMjAwIC8gREIxNTUwIC8gREIxMzAwIGJvYXJkIHN1cHBvcnQuCi0gKgotICogVGhlc2UgNCBib2FyZHMgY2FuIHJlbGlhYmx5IGJlIHN1cHBvcnRlZCBpbiBhIHNpbmdsZSBrZXJuZWwgaW1hZ2UuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgotCi1pbnQgX19pbml0IGRiMTIwMF9ib2FyZF9zZXR1cCh2b2lkKTsKLWludCBfX2luaXQgZGIxMjAwX2Rldl9zZXR1cCh2b2lkKTsKLWludCBfX2luaXQgZGIxMzAwX2JvYXJkX3NldHVwKHZvaWQpOwotaW50IF9faW5pdCBkYjEzMDBfZGV2X3NldHVwKHZvaWQpOwotaW50IF9faW5pdCBkYjE1NTBfYm9hcmRfc2V0dXAodm9pZCk7Ci1pbnQgX19pbml0IGRiMTU1MF9kZXZfc2V0dXAodm9pZCk7Ci1pbnQgX19pbml0IGRiMTU1MF9wY2lfc2V0dXAoaW50KTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkX3R5cGVfc3RyKHZvaWQpCi17Ci0Jc3dpdGNoIChCQ1NSX1dIT0FNSV9CT0FSRChiY3NyX3JlYWQoQkNTUl9XSE9BTUkpKSkgewotCWNhc2UgQkNTUl9XSE9BTUlfUEIxMjAwX0REUjE6Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjEyMDBfRERSMjoKLQkJcmV0dXJuICJQQjEyMDAiOwotCWNhc2UgQkNTUl9XSE9BTUlfREIxMjAwOgotCQlyZXR1cm4gIkRCMTIwMCI7Ci0JY2FzZSBCQ1NSX1dIT0FNSV9EQjEzMDA6Ci0JCXJldHVybiAiREIxMzAwIjsKLQljYXNlIEJDU1JfV0hPQU1JX0RCMTU1MDoKLQkJcmV0dXJuICJEQjE1NTAiOwotCWNhc2UgQkNTUl9XSE9BTUlfUEIxNTUwX1NEUjoKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTU1MF9ERFI6Ci0JCXJldHVybiAiUEIxNTUwIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIih1bmtub3duKSI7Ci0JfQotfQotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gYm9hcmRfdHlwZV9zdHIoKTsKLX0KLQotdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKLQljYXNlIEFMQ0hFTVlfQ1BVX0FVMTU1MDoKLQkJcmV0ID0gZGIxNTUwX2JvYXJkX3NldHVwKCk7Ci0JCWJyZWFrOwotCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgotCQlyZXQgPSBkYjEyMDBfYm9hcmRfc2V0dXAoKTsKLQkJYnJlYWs7Ci0JY2FzZSBBTENIRU1ZX0NQVV9BVTEzMDA6Ci0JCXJldCA9IGRiMTMwMF9ib2FyZF9zZXR1cCgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoInVuc3VwcG9ydGVkIENQVSBvbiBib2FyZFxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JfQotCWlmIChyZXQpCi0JCXBhbmljKCJjYW5ub3QgaW5pdGlhbGl6ZSBib2FyZCBzdXBwb3J0Iik7Ci19Ci0KLWludCBfX2luaXQgZGIxMjM1X2FyY2hfaW5pdCh2b2lkKQotewotCWludCBpZCA9IEJDU1JfV0hPQU1JX0JPQVJEKGJjc3JfcmVhZChCQ1NSX1dIT0FNSSkpOwotCWlmIChpZCA9PSBCQ1NSX1dIT0FNSV9EQjE1NTApCi0JCXJldHVybiBkYjE1NTBfcGNpX3NldHVwKDApOwotCWVsc2UgaWYgKChpZCA9PSBCQ1NSX1dIT0FNSV9QQjE1NTBfU0RSKSB8fAotCQkgKGlkID09IEJDU1JfV0hPQU1JX1BCMTU1MF9ERFIpKQotCQlyZXR1cm4gZGIxNTUwX3BjaV9zZXR1cCgxKTsKLQotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChkYjEyMzVfYXJjaF9pbml0KTsKLQotaW50IF9faW5pdCBkYjEyMzVfZGV2X2luaXQodm9pZCkKLXsKLQlzd2l0Y2ggKEJDU1JfV0hPQU1JX0JPQVJEKGJjc3JfcmVhZChCQ1NSX1dIT0FNSSkpKSB7Ci0JY2FzZSBCQ1NSX1dIT0FNSV9QQjEyMDBfRERSMToKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTIwMF9ERFIyOgotCWNhc2UgQkNTUl9XSE9BTUlfREIxMjAwOgotCQlyZXR1cm4gZGIxMjAwX2Rldl9zZXR1cCgpOwotCWNhc2UgQkNTUl9XSE9BTUlfREIxMzAwOgotCQlyZXR1cm4gZGIxMzAwX2Rldl9zZXR1cCgpOwotCWNhc2UgQkNTUl9XSE9BTUlfREIxNTUwOgotCWNhc2UgQkNTUl9XSE9BTUlfUEIxNTUwX1NEUjoKLQljYXNlIEJDU1JfV0hPQU1JX1BCMTU1MF9ERFI6Ci0JCXJldHVybiBkYjE1NTBfZGV2X3NldHVwKCk7Ci0JfQotCXJldHVybiAwOwotfQotZGV2aWNlX2luaXRjYWxsKGRiMTIzNV9kZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMzAwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMzAwLmMKaW5kZXggNjE2N2U3My4uMWFlZDZiZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTMwMC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEzMDAuYwpAQCAtMjYsMTIgKzI2LDQ0IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTIwMGZiLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2RiMTMwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9iY3NyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL3Byb20uaD4KIAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKKy8qIEZQR0EgKGV4dGVybmFsIG11eCkgaW50ZXJydXB0IHNvdXJjZXMgKi8KKyNkZWZpbmUgREIxMzAwX0ZJUlNUX0lOVAkoQUxDSEVNWV9HUElDX0lOVF9MQVNUICsgMSkKKyNkZWZpbmUgREIxMzAwX0lERV9JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgMCkKKyNkZWZpbmUgREIxMzAwX0VUSF9JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgMSkKKyNkZWZpbmUgREIxMzAwX0NGX0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyAyKQorI2RlZmluZSBEQjEzMDBfVklERU9fSU5UCShEQjEzMDBfRklSU1RfSU5UICsgNCkKKyNkZWZpbmUgREIxMzAwX0hETUlfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDUpCisjZGVmaW5lIERCMTMwMF9EQ19JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgNikKKyNkZWZpbmUgREIxMzAwX0ZMQVNIX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDcpCisjZGVmaW5lIERCMTMwMF9DRl9JTlNFUlRfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgOCkKKyNkZWZpbmUgREIxMzAwX0NGX0VKRUNUX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDkpCisjZGVmaW5lIERCMTMwMF9BQzk3X0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyAxMCkKKyNkZWZpbmUgREIxMzAwX0FDOTdfUEVOX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDExKQorI2RlZmluZSBEQjEzMDBfU0QxX0lOU0VSVF9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyAxMikKKyNkZWZpbmUgREIxMzAwX1NEMV9FSkVDVF9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyAxMykKKyNkZWZpbmUgREIxMzAwX09UR19WQlVTX09DX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDE0KQorI2RlZmluZSBEQjEzMDBfSE9TVF9WQlVTX09DX0lOVCAoREIxMzAwX0ZJUlNUX0lOVCArIDE1KQorI2RlZmluZSBEQjEzMDBfTEFTVF9JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgMTUpCisKKy8qIFNNU0M5MjEwIENTICovCisjZGVmaW5lIERCMTMwMF9FVEhfUEhZU19BRERSCTB4MTkwMDAwMDAKKyNkZWZpbmUgREIxMzAwX0VUSF9QSFlTX0VORAkweDE5N2ZmZmZmCisKKy8qIEFUQSBDUyAqLworI2RlZmluZSBEQjEzMDBfSURFX1BIWVNfQUREUgkweDE4ODAwMDAwCisjZGVmaW5lIERCMTMwMF9JREVfUkVHX1NISUZUCTUKKyNkZWZpbmUgREIxMzAwX0lERV9QSFlTX0xFTgkoMTYgPDwgREIxMzAwX0lERV9SRUdfU0hJRlQpCisKKy8qIE5BTkQgQ1MgKi8KKyNkZWZpbmUgREIxMzAwX05BTkRfUEhZU19BRERSCTB4MjAwMDAwMDAKKyNkZWZpbmUgREIxMzAwX05BTkRfUEhZU19FTkQJMHgyMDAwMGZmZgorCisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gZGIxMzAwX2kyY19kZXZzW10gX19pbml0ZGF0YSA9IHsKIAl7IEkyQ19CT0FSRF9JTkZPKCJ3bTg3MzEiLCAweDFiKSwgfSwJLyogSTJTIGF1ZGlvIGNvZGVjICovCiAJeyBJMkNfQk9BUkRfSU5GTygibmUxNjE5IiwgMHgyZCksIH0sCS8qIGFkbTEwMjUtY29tcGF0IGh3bW9uICovCkBAIC03NTksMTEgKzc5MSwxNSBAQAogewogCXVuc2lnbmVkIHNob3J0IHdob2FtaTsKIAotCWRiMTMwMF9ncGlvX2NvbmZpZygpOwogCWJjc3JfaW5pdChEQjEzMDBfQkNTUl9QSFlTX0FERFIsCiAJCSAgREIxMzAwX0JDU1JfUEhZU19BRERSICsgREIxMzAwX0JDU1JfSEVYTEVEX09GUyk7CiAKIAl3aG9hbWkgPSBiY3NyX3JlYWQoQkNTUl9XSE9BTUkpOworCWlmIChCQ1NSX1dIT0FNSV9CT0FSRCh3aG9hbWkpICE9IEJDU1JfV0hPQU1JX0RCMTMwMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkYjEzMDBfZ3Bpb19jb25maWcoKTsKKwogCXByaW50ayhLRVJOX0lORk8gIk5ldExvZ2ljIERCQXUxMzAwIERldmVsb3BtZW50IFBsYXRmb3JtLlxuXHQiCiAJCSJCb2FyZElEICVkICAgQ1BMRCBSZXYgJWQgICBEYXVnaHRlcmNhcmRJRCAlZFxuIiwKIAkJQkNTUl9XSE9BTUlfQk9BUkQod2hvYW1pKSwgQkNTUl9XSE9BTUlfQ1BMRCh3aG9hbWkpLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTU1MC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTU1MC5jCmluZGV4IDAxNmNkZGEuLmJiZDhkOTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjE1NTAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxNTUwLmMKQEAgLTYyLDEwICs2MiwxNiBAQAogCQkgIERCMTU1MF9CQ1NSX1BIWVNfQUREUiArIERCMTU1MF9CQ1NSX0hFWExFRF9PRlMpOwogCiAJd2hvYW1pID0gYmNzcl9yZWFkKEJDU1JfV0hPQU1JKTsgLyogUEIxNTUwIGhleGxlZCBvZmZzZXQgZGlmZmVycyAqLwotCWlmICgoQkNTUl9XSE9BTUlfQk9BUkQod2hvYW1pKSA9PSBCQ1NSX1dIT0FNSV9QQjE1NTBfU0RSKSB8fAotCSAgICAoQkNTUl9XSE9BTUlfQk9BUkQod2hvYW1pKSA9PSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSKSkKKwlzd2l0Y2ggKEJDU1JfV0hPQU1JX0JPQVJEKHdob2FtaSkpIHsKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTU1MF9TRFI6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSOgogCQliY3NyX2luaXQoUEIxNTUwX0JDU1JfUEhZU19BRERSLAogCQkJICBQQjE1NTBfQkNTUl9QSFlTX0FERFIgKyBQQjE1NTBfQkNTUl9IRVhMRURfT0ZTKTsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTU1MDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJcHJfaW5mbygiQWxjaGVteS9BTUQgJXMgQm9hcmQsIENQTEQgUmV2ICVkIEJvYXJkLUlEICVkCSIJXAogCQkiRGF1Z2h0ZXJjYXJkIElEICVkXG4iLCBnZXRfc3lzdGVtX3R5cGUoKSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4eHguYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQ3Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXh4eC5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQWxjaGVteSBEQi9QQjF4eHggYm9hcmQgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9iY3NyLmg+CisKK2ludCBfX2luaXQgZGIxMDAwX2JvYXJkX3NldHVwKHZvaWQpOworaW50IF9faW5pdCBkYjEwMDBfZGV2X3NldHVwKHZvaWQpOworaW50IF9faW5pdCBkYjE1MDBfcGNpX3NldHVwKHZvaWQpOworaW50IF9faW5pdCBkYjEyMDBfYm9hcmRfc2V0dXAodm9pZCk7CitpbnQgX19pbml0IGRiMTIwMF9kZXZfc2V0dXAodm9pZCk7CitpbnQgX19pbml0IGRiMTMwMF9ib2FyZF9zZXR1cCh2b2lkKTsKK2ludCBfX2luaXQgZGIxMzAwX2Rldl9zZXR1cCh2b2lkKTsKK2ludCBfX2luaXQgZGIxNTUwX2JvYXJkX3NldHVwKHZvaWQpOworaW50IF9faW5pdCBkYjE1NTBfZGV2X3NldHVwKHZvaWQpOworaW50IF9faW5pdCBkYjE1NTBfcGNpX3NldHVwKGludCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZF90eXBlX3N0cih2b2lkKQoreworCXN3aXRjaCAoQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSkpIHsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTAwMDoKKwkJcmV0dXJuICJEQjEwMDAiOworCWNhc2UgQkNTUl9XSE9BTUlfREIxNTAwOgorCQlyZXR1cm4gIkRCMTUwMCI7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjExMDA6CisJCXJldHVybiAiREIxMTAwIjsKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMDoKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMFIyOgorCQlyZXR1cm4gIlBCMTUwMCI7CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjExMDA6CisJCXJldHVybiAiUEIxMTAwIjsKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTIwMF9ERFIxOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxMjAwX0REUjI6CisJCXJldHVybiAiUEIxMjAwIjsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTIwMDoKKwkJcmV0dXJuICJEQjEyMDAiOworCWNhc2UgQkNTUl9XSE9BTUlfREIxMzAwOgorCQlyZXR1cm4gIkRCMTMwMCI7CisJY2FzZSBCQ1NSX1dIT0FNSV9EQjE1NTA6CisJCXJldHVybiAiREIxNTUwIjsKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTU1MF9TRFI6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSOgorCQlyZXR1cm4gIlBCMTU1MCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICIodW5rbm93bikiOworCX0KK30KKworY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCit7CisJcmV0dXJuIGJvYXJkX3R5cGVfc3RyKCk7Cit9CisKK3ZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAoYWxjaGVteV9nZXRfY3B1dHlwZSgpKSB7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTEwMDA6CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1MDA6CisJY2FzZSBBTENIRU1ZX0NQVV9BVTExMDA6CisJCXJldCA9IGRiMTAwMF9ib2FyZF9zZXR1cCgpOworCQlicmVhazsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTU1MDoKKwkJcmV0ID0gZGIxNTUwX2JvYXJkX3NldHVwKCk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlyZXQgPSBkYjEyMDBfYm9hcmRfc2V0dXAoKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTEzMDA6CisJCXJldCA9IGRiMTMwMF9ib2FyZF9zZXR1cCgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVuc3VwcG9ydGVkIENQVSBvbiBib2FyZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJfQorCWlmIChyZXQpCisJCXBhbmljKCJjYW5ub3QgaW5pdGlhbGl6ZSBib2FyZCBzdXBwb3J0Iik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRiMXh4eF9hcmNoX2luaXQodm9pZCkKK3sKKwlpbnQgaWQgPSBCQ1NSX1dIT0FNSV9CT0FSRChiY3NyX3JlYWQoQkNTUl9XSE9BTUkpKTsKKwlpZiAoaWQgPT0gQkNTUl9XSE9BTUlfREIxNTUwKQorCQlyZXR1cm4gZGIxNTUwX3BjaV9zZXR1cCgwKTsKKwllbHNlIGlmICgoaWQgPT0gQkNTUl9XSE9BTUlfUEIxNTUwX1NEUikgfHwKKwkJIChpZCA9PSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSKSkKKwkJcmV0dXJuIGRiMTU1MF9wY2lfc2V0dXAoMSk7CisJZWxzZSBpZiAoKGlkID09IEJDU1JfV0hPQU1JX0RCMTUwMCkgfHwgKGlkID09IEJDU1JfV0hPQU1JX1BCMTUwMCkgfHwKKwkJIChpZCA9PSBCQ1NSX1dIT0FNSV9QQjE1MDBSMikpCisJCXJldHVybiBkYjE1MDBfcGNpX3NldHVwKCk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoZGIxeHh4X2FyY2hfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGRiMXh4eF9kZXZfaW5pdCh2b2lkKQoreworCXN3aXRjaCAoQkNTUl9XSE9BTUlfQk9BUkQoYmNzcl9yZWFkKEJDU1JfV0hPQU1JKSkpIHsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTAwMDoKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTUwMDoKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTEwMDoKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMDoKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTUwMFIyOgorCWNhc2UgQkNTUl9XSE9BTUlfUEIxMTAwOgorCQlyZXR1cm4gZGIxMDAwX2Rldl9zZXR1cCgpOworCWNhc2UgQkNTUl9XSE9BTUlfUEIxMjAwX0REUjE6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjEyMDBfRERSMjoKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTIwMDoKKwkJcmV0dXJuIGRiMTIwMF9kZXZfc2V0dXAoKTsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTMwMDoKKwkJcmV0dXJuIGRiMTMwMF9kZXZfc2V0dXAoKTsKKwljYXNlIEJDU1JfV0hPQU1JX0RCMTU1MDoKKwljYXNlIEJDU1JfV0hPQU1JX1BCMTU1MF9TRFI6CisJY2FzZSBCQ1NSX1dIT0FNSV9QQjE1NTBfRERSOgorCQlyZXR1cm4gZGIxNTUwX2Rldl9zZXR1cCgpOworCX0KKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChkYjF4eHhfZGV2X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FyNy90aW1lLmMgYi9hcmNoL21pcHMvYXI3L3RpbWUuYwppbmRleCAxZGM2YzNiLi4yMmM5MzIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXI3L3RpbWUuYworKysgYi9hcmNoL21pcHMvYXI3L3RpbWUuYwpAQCAtMTgsNiArMTgsNyBAQAogICogU2V0dGluZyB1cCB0aGUgY2xvY2sgb24gdGhlIE1JUFMgYm9hcmRzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F0aDc5L0tjb25maWcgYi9hcmNoL21pcHMvYXRoNzkvS2NvbmZpZwppbmRleCAzOTk1ZTMxLi5kZmM2MDIwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXRoNzkvS2NvbmZpZworKysgYi9hcmNoL21pcHMvYXRoNzkvS2NvbmZpZwpAQCAtNzQsMzQgKzc0LDI2IEBACiBlbmRtZW51CiAKIGNvbmZpZyBTT0NfQVI3MVhYCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlkZWZfYm9vbCBuCiAKIGNvbmZpZyBTT0NfQVI3MjRYCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgUENJX0FSNzI0WCBpZiBQQ0kKIAlkZWZfYm9vbCBuCiAKIGNvbmZpZyBTT0NfQVI5MTNYCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJZGVmX2Jvb2wgbgogCiBjb25maWcgU09DX0FSOTMzWAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCWRlZl9ib29sIG4KIAogY29uZmlnIFNPQ19BUjkzNFgKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBQQ0lfQVI3MjRYIGlmIFBDSQogCWRlZl9ib29sIG4KIAogY29uZmlnIFNPQ19RQ0E5NTVYCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgUENJX0FSNzI0WCBpZiBQQ0kKIAlkZWZfYm9vbCBuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9iY200N3h4L01ha2VmaWxlCmluZGV4IDQ2ODhiNmEuLmQ1OGM1MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogIwogCiBvYmoteQkJCQkrPSBpcnEubyBudnJhbS5vIHByb20ubyBzZXJpYWwubyBzZXR1cC5vIHRpbWUubyBzcHJvbS5vCi1vYmoteQkJCQkrPSBib2FyZC5vIGJ1dHRvbnMubyBsZWRzLm8KK29iai15CQkJCSs9IGJvYXJkLm8gYnV0dG9ucy5vIGxlZHMubyB3b3JrYXJvdW5kcy5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9iY200N3h4X3ByaXZhdGUuaCBiL2FyY2gvbWlwcy9iY200N3h4L2JjbTQ3eHhfcHJpdmF0ZS5oCmluZGV4IDVjOTRhY2UuLjAxOTRjM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L2JjbTQ3eHhfcHJpdmF0ZS5oCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L2JjbTQ3eHhfcHJpdmF0ZS5oCkBAIC05LDQgKzksNyBAQAogLyogbGVkcy5jICovCiB2b2lkIF9faW5pdCBiY200N3h4X2xlZHNfcmVnaXN0ZXIodm9pZCk7CiAKKy8qIHdvcmthcm91bmRzLmMgKi8KK3ZvaWQgX19pbml0IGJjbTQ3eHhfd29ya2Fyb3VuZHModm9pZCk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvYm9hcmQuYyBiL2FyY2gvbWlwcy9iY200N3h4L2JvYXJkLmMKaW5kZXggNmQ2MTJlMi4uNDRhYjFiZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvYm9hcmQuYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9ib2FyZC5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8YmNtNDd4eF9ib2FyZC5oPgpAQCAtNzEsNyArNzIsMTEgQEAKIAl7e0JDTTQ3WFhfQk9BUkRfQVNVU19XTDUwMFcsICJBc3VzIFdMNTAwVyJ9LCAiV0w1MDBnVy0ifSwKIAl7e0JDTTQ3WFhfQk9BUkRfQVNVU19XTDUyMEdDLCAiQXN1cyBXTDUyMEdDIn0sICJXTDUyMEdDLSJ9LAogCXt7QkNNNDdYWF9CT0FSRF9BU1VTX1dMNTIwR1UsICJBc3VzIFdMNTIwR1UifSwgIldMNTIwR1UtIn0sCisJe3tCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0QzMzAxLCAiQmVsa2luIEY3RDMzMDEifSwgIkY3RDMzMDEifSwKKwl7e0JDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDMzMDIsICJCZWxraW4gRjdEMzMwMiJ9LCAiRjdEMzMwMiJ9LAogCXt7QkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMSwgIkJlbGtpbiBGN0Q0MzAxIn0sICJGN0Q0MzAxIn0sCisJe3tCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0MzAyLCAiQmVsa2luIEY3RDQzMDIifSwgIkY3RDQzMDIifSwKKwl7e0JDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQ0MDEsICJCZWxraW4gRjdENDQwMSJ9LCAiRjdENDQwMSJ9LAogCXsgezB9LCBOVUxMfSwKIH07CiAKQEAgLTE3NSw3ICsxODAsMTYgQEAKIAl7e0JDTTQ3WFhfQk9BUkRfUEhJQ09NTV9NMSwgIlBoaWNvbW0gTTEifSwgIjB4MDU5MCIsICI4MCIsICIweDExMDQifSwKIAl7e0JDTTQ3WFhfQk9BUkRfWlRFX0gyMThOLCAiWlRFIEgyMThOIn0sICIweDA1M2QiLCAiMTIzNCIsICIweDEzMDUifSwKIAl7e0JDTTQ3WFhfQk9BUkRfTkVUR0VBUl9XTlIzNTAwTCwgIk5ldGdlYXIgV05SMzUwMEwifSwgIjB4MDRDRiIsICIzNTAwIiwgIjAyIn0sCi0Je3tCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHU1YxLCAiTGlua3N5cyBXUlQ1NEdTIFYxIn0sICIweDAxMDEiLCAiNDIiLCAiMHgxMCJ9LAorCXt7QkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0RywgIkxpbmtzeXMgV1JUNTRHL0dTL0dMIn0sICIweDAxMDEiLCAiNDIiLCAiMHgxMCJ9LAorCXt7QkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0RywgIkxpbmtzeXMgV1JUNTRHL0dTL0dMIn0sICIweDA0NjciLCAiNDIiLCAiMHgxMCJ9LAorCXt7QkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0RywgIkxpbmtzeXMgV1JUNTRHL0dTL0dMIn0sICIweDA3MDgiLCAiNDIiLCAiMHgxMCJ9LAorCXsgezB9LCBOVUxMfSwKK307CisKKy8qIGJvYXJkdHlwZSwgYm9hcmRyZXYgKi8KK3N0YXRpYyBjb25zdAorc3RydWN0IGJjbTQ3eHhfYm9hcmRfdHlwZV9saXN0MiBiY200N3h4X2JvYXJkX2xpc3RfYm9hcmRfdHlwZV9yZXZbXSBfX2luaXRjb25zdCA9IHsKKwl7e0JDTTQ3WFhfQk9BUkRfU0lFTUVOU19TRTUwNVYyLCAiU2llbWVucyBTRTUwNSBWMiJ9LCAiMHgwMTAxIiwgIjB4MTAifSwKIAl7IHswfSwgTlVMTH0sCiB9OwogCkBAIC0yNzIsNiArMjg2LDE2IEBACiAJCQkJcmV0dXJuICZlMy0+Ym9hcmQ7CiAJCX0KIAl9CisKKwlpZiAoYmNtNDd4eF9udnJhbV9nZXRlbnYoImJvYXJkdHlwZSIsIGJ1ZjEsIHNpemVvZihidWYxKSkgPj0gMCAmJgorCSAgICBiY200N3h4X252cmFtX2dldGVudigiYm9hcmRyZXYiLCBidWYyLCBzaXplb2YoYnVmMikpID49IDAgJiYKKwkgICAgYmNtNDd4eF9udnJhbV9nZXRlbnYoImJvYXJkbnVtIiwgYnVmMywgc2l6ZW9mKGJ1ZjMpKSA9PSAgLUVOT0VOVCkgeworCQlmb3IgKGUyID0gYmNtNDd4eF9ib2FyZF9saXN0X2JvYXJkX3R5cGVfcmV2OyBlMi0+dmFsdWUxOyBlMisrKSB7CisJCQlpZiAoIXN0cmNtcChidWYxLCBlMi0+dmFsdWUxKSAmJgorCQkJICAgICFzdHJjbXAoYnVmMiwgZTItPnZhbHVlMikpCisJCQkJcmV0dXJuICZlMi0+Ym9hcmQ7CisJCX0KKwl9CiAJcmV0dXJuIGJjbTQ3eHhfYm9hcmRfdW5rbm93bjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvYnV0dG9ucy5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvYnV0dG9ucy5jCmluZGV4IDg3MmM2MmUuLjQ5YTFjZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L2J1dHRvbnMuYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9idXR0b25zLmMKQEAgLTI1OSw2ICsyNTksMTggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0NTRnM2d2MltdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19LRVkoNSwgS0VZX1dJTUFYKSwKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgorYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0NTRnc3YxW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0tFWSg0LCBLRVlfV1BTX0JVVFRPTiksCisJQkNNNDdYWF9HUElPX0tFWSg2LCBLRVlfUkVTVEFSVCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fa2V5c19idXR0b24KIGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDYxMG52MVtdIF9faW5pdGNvbnN0ID0gewogCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAogCUJDTTQ3WFhfR1BJT19LRVkoOCwgS0VZX1dQU19CVVRUT04pLApAQCAtMjcwLDYgKzI4MiwxMiBAQAogCUJDTTQ3WFhfR1BJT19LRVkoNiwgS0VZX1JFU1RBUlQpLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2tleXNfYnV0dG9uCitiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnRzbDU0Z3NbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fS0VZKDQsIEtFWV9XUFNfQlVUVE9OKSwKKwlCQ000N1hYX0dQSU9fS0VZKDYsIEtFWV9SRVNUQVJUKSwKK307CisKIC8qIE1vdG9yb2xhICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbgpAQCAtNDAyLDcgKzQyMCwxMSBAQAogCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2FzdXNfd2xoZGQpOwogCQlicmVhazsKIAorCWNhc2UgQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdEMzMwMToKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDMzMDI6CiAJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0MzAxOgorCWNhc2UgQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMjoKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQ0MDE6CiAJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfYmVsa2luX2Y3ZDQzMDEpOwogCQlicmVhazsKIApAQCAtNDc5LDEyICs1MDEsMjEgQEAKIAljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQzMTBOVjE6CiAJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQzMTBudjEpOwogCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEc6CisJCWVyciA9IGJjbTQ3eHhfY29weV9iZGF0YShiY200N3h4X2J1dHRvbnNfbGlua3N5c193cnQ1NGdzdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEczR1YyOgorCQllcnIgPSBiY200N3h4X2NvcHlfYmRhdGEoYmNtNDd4eF9idXR0b25zX2xpbmtzeXNfd3J0NTRnM2d2Mik7CisJCWJyZWFrOwogCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDYxME5WMToKIAkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDYxMG52MSk7CiAJCWJyZWFrOwogCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDYxME5WMjoKIAkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydDYxMG52Mik7CiAJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVFNMNTRHUzoKKwkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19saW5rc3lzX3dydHNsNTRncyk7CisJCWJyZWFrOwogCiAJY2FzZSBCQ000N1hYX0JPQVJEX01PVE9ST0xBX1dFODAwRzoKIAkJZXJyID0gYmNtNDd4eF9jb3B5X2JkYXRhKGJjbTQ3eHhfYnV0dG9uc19tb3Rvcm9sYV93ZTgwMGcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvbGVkcy5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvbGVkcy5jCmluZGV4IDY0N2QxNTUuLmFkY2I1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L2xlZHMuYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9sZWRzLmMKQEAgLTI5Miw2ICsyOTIsMjEgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19saW5rc3lzX3dydDU0Z3N2MVtdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJkbXoiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoNSwgIndoaXRlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNywgIm9yYW5nZSIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKK2JjbTQ3eHhfbGVkc19saW5rc3lzX3dydDU0ZzNndjJbXSBfX2luaXRjb25zdCA9IHsKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoMiwgImdyZWVuIiwgIjNnIiwgMCwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCisJQkNNNDdYWF9HUElPX0xFRCgzLCAiYmx1ZSIsICIzZyIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAogYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0NjEwbnYxW10gX19pbml0Y29uc3QgPSB7CiAJQkNNNDdYWF9HUElPX0xFRCgwLCAidW5rIiwgInVzYiIsICAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKIAlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAgMCwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCkBAIC0zMDgsNiArMzIzLDE1IEBACiAJQkNNNDdYWF9HUElPX0xFRCg3LCAidW5rIiwgInVzYiIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0c2w1NGdzW10gX19pbml0Y29uc3QgPSB7CisJQkNNNDdYWF9HUElPX0xFRCgwLCAidW5rIiwgIndsYW4iLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDEsICJ1bmsiLCAicG93ZXIiLCAwLCBMRURTX0dQSU9fREVGU1RBVEVfT04pLAorCUJDTTQ3WFhfR1BJT19MRUQoMiwgIndoaXRlIiwgIndwcyIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoMywgIm9yYW5nZSIsICJ3cHMiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDcsICJ1bmsiLCAiZG16IiwgMSwgTEVEU19HUElPX0RFRlNUQVRFX09GRiksCit9OworCiAvKiBNb3Rvcm9sYSAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkCkBAIC0zNTksNiArMzgzLDE0IEBACiAJQkNNNDdYWF9HUElPX0xFRCg3LCAidW5rIiwgImNvbm5lY3RlZCIsIDAsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAogfTsKIAorLyogU2llbWVucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZAorYmNtNDd4eF9sZWRzX3NpZW1lbnNfc2U1MDV2MltdIF9faW5pdGNvbnN0ID0geworCUJDTTQ3WFhfR1BJT19MRUQoMCwgInVuayIsICJkbXoiLCAxLCBMRURTX0dQSU9fREVGU1RBVEVfT0ZGKSwKKwlCQ000N1hYX0dQSU9fTEVEKDMsICJ1bmsiLCAid2xhbiIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PRkYpLAorCUJDTTQ3WFhfR1BJT19MRUQoNSwgInVuayIsICJwb3dlciIsIDEsIExFRFNfR1BJT19ERUZTVEFURV9PTiksCit9OworCiAvKiBTaW1wbGVUZWNoICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQKQEAgLTQyNSw3ICs0NTcsMTEgQEAKIAkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2FzdXNfd2xoZGQpOwogCQlicmVhazsKIAorCWNhc2UgQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdEMzMwMToKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDMzMDI6CiAJY2FzZSBCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0MzAxOgorCWNhc2UgQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMjoKKwljYXNlIEJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQ0MDE6CiAJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19iZWxraW5fZjdkNDMwMSk7CiAJCWJyZWFrOwogCkBAIC01MDIsMTIgKzUzOCwyMSBAQAogCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDMxME5WMToKIAkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0MzEwbnYxKTsKIAkJYnJlYWs7CisJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbGlua3N5c193cnQ1NGdzdjEpOworCQlicmVhazsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ1NEczR1YyOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbGlua3N5c193cnQ1NGczZ3YyKTsKKwkJYnJlYWs7CiAJY2FzZSBCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNjEwTlYxOgogCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbGlua3N5c193cnQ2MTBudjEpOwogCQlicmVhazsKIAljYXNlIEJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjI6CiAJCWJjbTQ3eHhfc2V0X3BkYXRhKGJjbTQ3eHhfbGVkc19saW5rc3lzX3dydDYxMG52Mik7CiAJCWJyZWFrOworCWNhc2UgQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVFNMNTRHUzoKKwkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX2xpbmtzeXNfd3J0c2w1NGdzKTsKKwkJYnJlYWs7CiAKIAljYXNlIEJDTTQ3WFhfQk9BUkRfTU9UT1JPTEFfV0U4MDBHOgogCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfbW90b3JvbGFfd2U4MDBnKTsKQEAgLTUyOSw2ICs1NzQsMTAgQEAKIAkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX25ldGdlYXJfd25yODM0YnYyKTsKIAkJYnJlYWs7CiAKKwljYXNlIEJDTTQ3WFhfQk9BUkRfU0lFTUVOU19TRTUwNVYyOgorCQliY200N3h4X3NldF9wZGF0YShiY200N3h4X2xlZHNfc2llbWVuc19zZTUwNXYyKTsKKwkJYnJlYWs7CisKIAljYXNlIEJDTTQ3WFhfQk9BUkRfU0lNUExFVEVDSF9TSU1QTEVTSEFSRToKIAkJYmNtNDd4eF9zZXRfcGRhdGEoYmNtNDd4eF9sZWRzX3NpbXBsZXRlY2hfc2ltcGxlc2hhcmUpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L252cmFtLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9udnJhbS5jCmluZGV4IDZkZWNiMjcuLjJiZWQ3M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L252cmFtLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvbnZyYW0uYwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJY2hhciBudnJhbV92YXJbMTBdOwogCWNoYXIgYnVmWzMwXTsKIAotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKIAkJZXJyID0gc25wcmludGYobnZyYW1fdmFyLCBzaXplb2YobnZyYW1fdmFyKSwgImdwaW8laSIsIGkpOwogCQlpZiAoZXJyIDw9IDApCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCmluZGV4IDAyNWJlMjEuLjYzYTRiMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiB7CiAJc3RydWN0IGNwdWluZm9fbWlwcyAqYyA9ICZjdXJyZW50X2NwdV9kYXRhOwogCi0JaWYgKGMtPmNwdXR5cGUgPT0gQ1BVXzc0SykgeworCWlmICgoYy0+Y3B1dHlwZSA9PSBDUFVfNzRLKSB8fCAoYy0+Y3B1dHlwZSA9PSBDUFVfMTA3NEspKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImJjbTQ3eHg6IHVzaW5nIGJjbWEgYnVzXG4iKTsKICNpZmRlZiBDT05GSUdfQkNNNDdYWF9CQ01BCiAJCWJjbTQ3eHhfYnVzX3R5cGUgPSBCQ000N1hYX0JVU19UWVBFX0JDTUE7CkBAIC0yODIsNiArMjgyLDcgQEAKIAl9CiAJYmNtNDd4eF9idXR0b25zX3JlZ2lzdGVyKCk7CiAJYmNtNDd4eF9sZWRzX3JlZ2lzdGVyKCk7CisJYmNtNDd4eF93b3JrYXJvdW5kcygpOwogCiAJZml4ZWRfcGh5X2FkZChQSFlfUE9MTCwgMCwgJmJjbTQ3eHhfZml4ZWRfcGh5X3N0YXR1cyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC93b3JrYXJvdW5kcy5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvd29ya2Fyb3VuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODFjZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvd29ya2Fyb3VuZHMuYwpAQCAtMCwwICsxLDMxIEBACisjaW5jbHVkZSAiYmNtNDd4eF9wcml2YXRlLmgiCisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8YmNtNDd4eF9ib2FyZC5oPgorI2luY2x1ZGUgPGJjbTQ3eHguaD4KKworc3RhdGljIHZvaWQgX19pbml0IGJjbTQ3eHhfd29ya2Fyb3VuZHNfbmV0Z2Vhcl93bnIzNTAwbCh2b2lkKQoreworCWNvbnN0IGludCB1c2JfcG93ZXIgPSAxMjsKKwlpbnQgZXJyOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0X29uZSh1c2JfcG93ZXIsIEdQSU9GX09VVF9JTklUX0hJR0gsICJ1c2JfcG93ZXIiKTsKKwlpZiAoZXJyKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZXF1ZXN0IFVTQiBwb3dlciBncGlvOiAlZFxuIiwgZXJyKTsKKwllbHNlCisJCWdwaW9fZnJlZSh1c2JfcG93ZXIpOworfQorCit2b2lkIF9faW5pdCBiY200N3h4X3dvcmthcm91bmRzKHZvaWQpCit7CisJZW51bSBiY200N3h4X2JvYXJkIGJvYXJkID0gYmNtNDd4eF9ib2FyZF9nZXQoKTsKKworCXN3aXRjaCAoYm9hcmQpIHsKKwljYXNlIEJDTTQ3WFhfQk9BUkRfTkVUR0VBUl9XTlIzNTAwTDoKKwkJYmNtNDd4eF93b3JrYXJvdW5kc19uZXRnZWFyX3ducjM1MDBsKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIE5vIHdvcmthcm91bmQocykgbmVlZGVkICovCisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY202M3h4L2NwdS5jIGIvYXJjaC9taXBzL2JjbTYzeHgvY3B1LmMKaW5kZXggMWIxYjhhOC4uZmQ0ZTc2YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTYzeHgvY3B1LmMKKysrIGIvYXJjaC9taXBzL2JjbTYzeHgvY3B1LmMKQEAgLTI5OSwxNCArMjk5LDEzIEBACiB2b2lkIF9faW5pdCBiY202M3h4X2NwdV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKLQlzdHJ1Y3QgY3B1aW5mb19taXBzICpjID0gJmN1cnJlbnRfY3B1X2RhdGE7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1MzIgY2hpcGlkX3JlZzsKIAogCS8qIHNvYyByZWdpc3RlcnMgbG9jYXRpb24gZGVwZW5kcyBvbiBjcHUgdHlwZSAqLwogCWNoaXBpZF9yZWcgPSAwOwogCi0Jc3dpdGNoIChjLT5jcHV0eXBlKSB7CisJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKIAljYXNlIENQVV9CTUlQUzMzMDA6CiAJCWlmICgocmVhZF9jMF9wcmlkKCkgJiBQUklEX0lNUF9NQVNLKSAhPSBQUklEX0lNUF9CTUlQUzMzMDBfQUxUKQogCQkJX19jcHVfbmFtZVtjcHVdID0gIkJyb2FkY29tIEJDTTYzMzgiOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCmluZGV4IDI1ZmJmYWUuLmMyYmI0ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKQEAgLTk3NSwxMCArOTc1LDYgQEAKIAlpZiAoY2l1ID4gMSB8fCBiaXQgPiA2MykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBUaGVzZSBhcmUgdGhlIEdQSU8gbGluZXMgKi8KLQlpZiAoY2l1ID09IDAgJiYgYml0ID49IDE2ICYmIGJpdCA8IDMyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCSpvdXRfaHdpcnEgPSAoY2l1IDw8IDYpIHwgYml0OwogCSpvdXRfdHlwZSA9IDA7CiAKQEAgLTEwMDcsNiArMTAwMywxMCBAQAogCWlmICghb2N0ZW9uX2lycV92aXJxX2luX3JhbmdlKHZpcnEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIERvbid0IG1hcCBpcnEgaWYgaXQgaXMgcmVzZXJ2ZWQgZm9yIEdQSU8uICovCisJaWYgKGxpbmUgPT0gMCAmJiBiaXQgPj0gMTYgJiYgYml0IDwzMikKKwkJcmV0dXJuIDA7CisKIAlpZiAobGluZSA+IDEgfHwgb2N0ZW9uX2lycV9jaXVfdG9faXJxW2xpbmVdW2JpdF0gIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE1MjUsMTAgKzE1MjUsNiBAQAogCWNpdSA9IGludHNwZWNbMF07CiAJYml0ID0gaW50c3BlY1sxXTsKIAotCS8qIExpbmUgNyAgYXJlIHRoZSBHUElPIGxpbmVzICovCi0JaWYgKGNpdSA+IDYgfHwgYml0ID4gNjMpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJKm91dF9od2lycSA9IChjaXUgPDwgNikgfCBiaXQ7CiAJKm91dF90eXBlID0gMDsKIApAQCAtMTU3MCw4ICsxNTY2LDE0IEBACiAJaWYgKCFvY3Rlb25faXJxX3ZpcnFfaW5fcmFuZ2UodmlycSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogTGluZSA3ICBhcmUgdGhlIEdQSU8gbGluZXMgKi8KLQlpZiAobGluZSA+IDYgfHwgb2N0ZW9uX2lycV9jaXVfdG9faXJxW2xpbmVdW2JpdF0gIT0gMCkKKwkvKgorCSAqIERvbid0IG1hcCBpcnEgaWYgaXQgaXMgcmVzZXJ2ZWQgZm9yIEdQSU8uCisJICogKExpbmUgNyBhcmUgdGhlIEdQSU8gbGluZXMuKQorCSAqLworCWlmIChsaW5lID09IDcpCisJCXJldHVybiAwOworCisJaWYgKGxpbmUgPiA3IHx8IG9jdGVvbl9pcnFfY2l1X3RvX2lycVtsaW5lXVtiaXRdICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG9jdGVvbl9pcnFfY2l1Ml9pc19lZGdlKGxpbmUsIGJpdCkpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjMjZiOS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLUNPTkZJR19NSVBTPXkKLUNPTkZJR19NSVBTX0FMQ0hFTVk9eQotQ09ORklHX01JUFNfREIxMDAwPXkKLUNPTkZJR19TQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX1RJQ0tfT05FU0hPVD15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfSFpfMTAwPXkKLUNPTkZJR19IWj0xMDAKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi1DT05GSUdfQ1JPU1NfQ09NUElMRT0iIgotQ09ORklHX0xPQ0FMVkVSU0lPTj0iLWRiMXgwMCIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfS0VSTkVMX0xaTUE9eQotQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9ImRiMXgwMCIKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19TWVNWSVBDX1NZU0NUTD15Ci1DT05GSUdfRkhBTkRMRT15Ci1DT05GSUdfQVVESVQ9eQotQ09ORklHX1RJTllfUkNVPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE4Ci1DT05GSUdfTkFNRVNQQUNFUz15Ci1DT05GSUdfVVRTX05TPXkKLUNPTkZJR19JUENfTlM9eQotQ09ORklHX1VTRVJfTlM9eQotQ09ORklHX1BJRF9OUz15Ci1DT05GSUdfTkVUX05TPXkKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0VYUEVSVD15Ci1DT05GSUdfS0FMTFNZTVM9eQotQ09ORklHX0tBTExTWU1TX0FMTD15Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0lHTkFMRkQ9eQotQ09ORklHX1RJTUVSRkQ9eQotQ09ORklHX0VWRU5URkQ9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19BSU89eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKLUNPTkZJR19QRVJGX1VTRV9WTUFMTE9DPXkKLUNPTkZJR19QQ0lfUVVJUktTPXkKLUNPTkZJR19TTEFCPXkKLUNPTkZJR19TTEFCSU5GTz15Ci1DT05GSUdfQkxPQ0s9eQotQ09ORklHX0xCREFGPXkKLUNPTkZJR19CTEtfREVWX0JTRz15Ci1DT05GSUdfQkxLX0RFVl9CU0dMSUI9eQotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfREVGQVVMVF9OT09QPXkKLUNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCi1DT05GSUdfRlJFRVpFUj15Ci1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0lfRE9NQUlOUz15Ci1DT05GSUdfUENDQVJEPXkKLUNPTkZJR19QQ01DSUE9eQotQ09ORklHX1BDTUNJQV9MT0FEX0NJUz15Ci1DT05GSUdfUENNQ0lBX0FMQ0hFTVlfREVWQk9BUkQ9eQotQ09ORklHX0JJTkZNVF9FTEY9eQotQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTPXkKLUNPTkZJR19TVVNQRU5EPXkKLUNPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQotQ09ORklHX1BNX1NMRUVQPXkKLUNPTkZJR19QTV9SVU5USU1FPXkKLUNPTkZJR19QTT15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLUNPTkZJR19JUF9QTlBfUkFSUD15Ci1DT05GSUdfTkVUX0lQSVA9eQotQ09ORklHX0lORVRfVFVOTkVMPXkKLUNPTkZJR19JTkVUX0xSTz15Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotQ09ORklHX0lQVjY9eQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPXkKLUNPTkZJR19JUFY2X1NJVD15Ci1DT05GSUdfSVBWNl9ORElTQ19OT0RFVFlQRT15Ci1DT05GSUdfU1RQPXkKLUNPTkZJR19HQVJQPXkKLUNPTkZJR19CUklER0U9eQotQ09ORklHX0JSSURHRV9JR01QX1NOT09QSU5HPXkKLUNPTkZJR19WTEFOXzgwMjFRPXkKLUNPTkZJR19WTEFOXzgwMjFRX0dWUlA9eQotQ09ORklHX0xMQz15Ci1DT05GSUdfTExDMj15Ci1DT05GSUdfRE5TX1JFU09MVkVSPXkKLUNPTkZJR19CVD15Ci1DT05GSUdfQlRfTDJDQVA9eQotQ09ORklHX0JUX1NDTz15Ci1DT05GSUdfQlRfUkZDT01NPXkKLUNPTkZJR19CVF9SRkNPTU1fVFRZPXkKLUNPTkZJR19CVF9CTkVQPXkKLUNPTkZJR19CVF9CTkVQX01DX0ZJTFRFUj15Ci1DT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVI9eQotQ09ORklHX0JUX0hJRFA9eQotQ09ORklHX0JUX0hDSUJUVVNCPXkKLUNPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9IiIKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLUNPTkZJR19GV19MT0FERVI9eQotQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxLREVWUz15Ci1DT05GSUdfTVREX0JMT0NLPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfR0VOX1BST0JFPXkKLUNPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKLUNPTkZJR19NVERfQ0ZJX05PU1dBUD15Ci1DT05GSUdfTVREX0NGSV9HRU9NRVRSWT15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15Ci1DT05GSUdfTVREX0NGSV9JMT15Ci1DT05GSUdfTVREX0NGSV9JMj15Ci1DT05GSUdfTVREX0NGSV9JND15Ci1DT05GSUdfTVREX0NGSV9JOD15Ci1DT05GSUdfTVREX0NGSV9JTlRFTEVYVD15Ci1DT05GSUdfTVREX0NGSV9BTURTVEQ9eQotQ09ORklHX01URF9DRklfVVRJTD15Ci1DT05GSUdfTVREX1BIWVNNQVA9eQotQ09ORklHX1NDU0lfTU9EPXkKLUNPTkZJR19TQ1NJPXkKLUNPTkZJR19TQ1NJX0RNQT15Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLUNPTkZJR19CTEtfREVWX1NEPXkKLUNPTkZJR19DSFJfREVWX1NHPXkKLUNPTkZJR19TQ1NJX01VTFRJX0xVTj15Ci1DT05GSUdfU0NTSV9DT05TVEFOVFM9eQotQ09ORklHX0FUQT15Ci1DT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQotQ09ORklHX0FUQV9TRkY9eQotQ09ORklHX0FUQV9CTURNQT15Ci1DT05GSUdfUEFUQV9IUFQzN1g9eQotQ09ORklHX1BBVEFfUENNQ0lBPXkKLUNPTkZJR19NRD15Ci1DT05GSUdfQkxLX0RFVl9ETT15Ci1DT05GSUdfRklSRVdJUkU9eQotQ09ORklHX0ZJUkVXSVJFX09IQ0k9eQotQ09ORklHX0ZJUkVXSVJFX09IQ0lfREVCVUc9eQotQ09ORklHX0ZJUkVXSVJFX05FVD15Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfTUlJPXkKLUNPTkZJR19QSFlMSUI9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlQU19BVTFYMDBfRU5FVD15Ci1DT05GSUdfTkVUX1BDTUNJQT15Ci1DT05GSUdfUENNQ0lBXzNDNTg5PXkKLUNPTkZJR19QQ01DSUFfUENORVQ9eQotQ09ORklHX1BQUD15Ci1DT05GSUdfUFBQX01VTFRJTElOSz15Ci1DT05GSUdfUFBQX0ZJTFRFUj15Ci1DT05GSUdfUFBQX0FTWU5DPXkKLUNPTkZJR19QUFBfU1lOQ19UVFk9eQotQ09ORklHX1BQUF9ERUZMQVRFPXkKLUNPTkZJR19QUFBfQlNEQ09NUD15Ci1DT05GSUdfUFBQX01QUEU9eQotQ09ORklHX1BQUE9FPXkKLUNPTkZJR19JTlBVVD15Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotQ09ORklHX0lOUFVUX01JU0M9eQotQ09ORklHX0lOUFVUX1VJTlBVVD15Ci1DT05GSUdfVlQ9eQotQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUz15Ci1DT05GSUdfREVWS01FTT15Ci1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKLUNPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVFRZX1BSSU5USz15Ci1DT05GSUdfREVWUE9SVD15Ci1DT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQotQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15Ci1DT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15Ci1DT05GSUdfRkJfQVUxMTAwPXkKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZPXkKLUNPTkZJR19GT05UUz15Ci1DT05GSUdfRk9OVF84eDE2PXkKLUNPTkZJR19TT1VORD15Ci1DT05GSUdfU05EPXkKLUNPTkZJR19TTkRfVElNRVI9eQotQ09ORklHX1NORF9QQ009eQotQ09ORklHX1NORF9KQUNLPXkKLUNPTkZJR19TTkRfU0VRVUVOQ0VSPXkKLUNPTkZJR19TTkRfSFJUSU1FUj15Ci1DT05GSUdfU05EX1NFUV9IUlRJTUVSX0RFRkFVTFQ9eQotQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15Ci1DT05GSUdfU05EX1ZNQVNURVI9eQotQ09ORklHX1NORF9BQzk3X0NPREVDPXkKLUNPTkZJR19TTkRfU09DPXkKLUNPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKLUNPTkZJR19TTkRfU09DX0FVMVhBVURJTz15Ci1DT05GSUdfU05EX1NPQ19BVTFYQUM5N0M9eQotQ09ORklHX1NORF9TT0NfREIxMDAwPXkKLUNPTkZJR19TTkRfU09DX0FDOTdfQ09ERUM9eQotQ09ORklHX0FDOTdfQlVTPXkKLUNPTkZJR19ISURfU1VQUE9SVD15Ci1DT05GSUdfSElEPXkKLUNPTkZJR19ISURSQVc9eQotQ09ORklHX1VTQl9ISUQ9eQotQ09ORklHX1VTQl9TVVBQT1JUPXkKLUNPTkZJR19VU0I9eQotQ09ORklHX1VTQl9FSENJX0hDRD15Ci1DT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQ9eQotQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEPXkKLUNPTkZJR19VU0JfT0hDSV9IQ0Q9eQotQ09ORklHX1VTQl9PSENJX0hDRF9QTEFURk9STT15Ci1DT05GSUdfVVNCX1VIQ0lfSENEPXkKLUNPTkZJR19VU0JfU1RPUkFHRT15Ci1DT05GSUdfTkVXX0xFRFM9eQotQ09ORklHX0xFRFNfQ0xBU1M9eQotQ09ORklHX0xFRFNfVFJJR0dFUlM9eQotQ09ORklHX1JUQ19MSUI9eQotQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0hDVE9TWVM9eQotQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKLUNPTkZJR19SVENfSU5URl9TWVNGUz15Ci1DT05GSUdfUlRDX0lOVEZfUFJPQz15Ci1DT05GSUdfUlRDX0lOVEZfREVWPXkKLUNPTkZJR19SVENfRFJWX0FVMVhYWD15Ci1DT05GSUdfRVhUNF9GUz15Ci1DT05GSUdfRVhUNF9VU0VfRk9SX0VYVDIzPXkKLUNPTkZJR19FWFQ0X0ZTX1hBVFRSPXkKLUNPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhUNF9GU19TRUNVUklUWT15Ci1DT05GSUdfSkJEMj15Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci1DT05GSUdfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19FWFBPUlRGUz15Ci1DT05GSUdfRklMRV9MT0NLSU5HPXkKLUNPTkZJR19GU05PVElGWT15Ci1DT05GSUdfRE5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLUNPTkZJR19HRU5FUklDX0FDTD15Ci1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19UTVBGU19YQVRUUj15Ci1DT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15Ci1DT05GSUdfSkZGUzJfRlM9eQotQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKLUNPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15Ci1DT05GSUdfSkZGUzJfU1VNTUFSWT15Ci1DT05GSUdfSkZGUzJfRlNfWEFUVFI9eQotQ09ORklHX0pGRlMyX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfSkZGUzJfRlNfU0VDVVJJVFk9eQotQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlM9eQotQ09ORklHX0pGRlMyX1pMSUI9eQotQ09ORklHX0pGRlMyX0xaTz15Ci1DT05GSUdfSkZGUzJfUlRJTUU9eQotQ09ORklHX0pGRlMyX1JVQklOPXkKLUNPTkZJR19KRkZTMl9DTU9ERV9QUklPUklUWT15Ci1DT05GSUdfU1FVQVNIRlM9eQotQ09ORklHX1NRVUFTSEZTX1pMSUI9eQotQ09ORklHX1NRVUFTSEZTX0xaTz15Ci1DT05GSUdfU1FVQVNIRlNfWFo9eQotQ09ORklHX1NRVUFTSEZTX0ZSQUdNRU5UX0NBQ0hFX1NJWkU9MwotQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ORlNfVjQ9eQotQ09ORklHX05GU19WNF8xPXkKLUNPTkZJR19QTkZTX0ZJTEVfTEFZT1VUPXkKLUNPTkZJR19QTkZTX0JMT0NLPXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkZTX1VTRV9LRVJORUxfRE5TPXkKLUNPTkZJR19ORlNfVVNFX05FV19JRE1BUFBFUj15Ci1DT05GSUdfTkZTRD15Ci1DT05GSUdfTkZTRF9WMl9BQ0w9eQotQ09ORklHX05GU0RfVjM9eQotQ09ORklHX05GU0RfVjNfQUNMPXkKLUNPTkZJR19ORlNEX1Y0PXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfTE9DS0RfVjQ9eQotQ09ORklHX05GU19BQ0xfU1VQUE9SVD15Ci1DT05GSUdfTkZTX0NPTU1PTj15Ci1DT05GSUdfU1VOUlBDPXkKLUNPTkZJR19TVU5SUENfR1NTPXkKLUNPTkZJR19TVU5SUENfQkFDS0NIQU5ORUw9eQotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQotQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPXkKLUNPTkZJR19OTFNfQVNDSUk9eQotQ09ORklHX05MU19JU084ODU5XzE9eQotQ09ORklHX05MU19JU084ODU5XzE1PXkKLUNPTkZJR19OTFNfVVRGOD15Ci1DT05GSUdfSEFWRV9BUkNIX0tHREI9eQotQ09ORklHX0VBUkxZX1BSSU5USz15Ci1DT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJub2lycWRlYnVnIHJvb3R3YWl0IHJvb3Q9L2Rldi9zZGExIHJvb3Rmc3R5cGU9ZXh0NCBjb25zb2xlPXR0eVMwLDExNTIwMCB2aWRlbz1hdTExMDBmYjpwYW5lbDpDUlRfODAweDYwMF8xNiIKLUNPTkZJR19ERUJVR19aQk9PVD15Ci1DT05GSUdfS0VZUz15Ci1DT05GSUdfS0VZU19ERUJVR19QUk9DX0tFWVM9eQotQ09ORklHX1NFQ1VSSVRZRlM9eQotQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXkKLUNPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCi1DT05GSUdfQ1JZUFRPPXkKLUNPTkZJR19DUllQVE9fQUxHQVBJPXkKLUNPTkZJR19DUllQVE9fQUxHQVBJMj15Ci1DT05GSUdfQ1JZUFRPX0FFQUQyPXkKLUNPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKLUNPTkZJR19DUllQVE9fQkxLQ0lQSEVSMj15Ci1DT05GSUdfQ1JZUFRPX0hBU0g9eQotQ09ORklHX0NSWVBUT19IQVNIMj15Ci1DT05GSUdfQ1JZUFRPX1JORz15Ci1DT05GSUdfQ1JZUFRPX1JORzI9eQotQ09ORklHX0NSWVBUT19QQ09NUDI9eQotQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUjI9eQotQ09ORklHX0NSWVBUT19NQU5BR0VSX0RJU0FCTEVfVEVTVFM9eQotQ09ORklHX0NSWVBUT19XT1JLUVVFVUU9eQotQ09ORklHX0NSWVBUT19FQ0I9eQotQ09ORklHX0NSWVBUT19TSEExPXkKLUNPTkZJR19DUllQVE9fQUVTPXkKLUNPTkZJR19DUllQVE9fQU5TSV9DUFJORz15Ci1DT05GSUdfQklUUkVWRVJTRT15Ci1DT05GSUdfQ1JDX0NDSVRUPXkKLUNPTkZJR19DUkMxNj15Ci1DT05GSUdfQ1JDX0lUVV9UPXkKLUNPTkZJR19DUkMzMj15Ci1DT05GSUdfWkxJQl9JTkZMQVRFPXkKLUNPTkZJR19aTElCX0RFRkxBVEU9eQotQ09ORklHX0xaT19DT01QUkVTUz15Ci1DT05GSUdfTFpPX0RFQ09NUFJFU1M9eQotQ09ORklHX1haX0RFQz15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjEyMzVfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjM1X2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlNDlmMi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjEyMzVfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLUNPTkZJR19NSVBTX0FMQ0hFTVk9eQotQ09ORklHX01JUFNfREIxMjM1PXkKLUNPTkZJR19DT01QQUNUSU9OPXkKLUNPTkZJR19LU009eQotQ09ORklHX0haXzEwMD15Ci1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19MT0NBTFZFUlNJT049Ii1kYjEyMzUiCi1DT05GSUdfS0VSTkVMX0xaTUE9eQotQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9ImRiMTIzNSIKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQotQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQotQ09ORklHX0ZIQU5ETEU9eQotQ09ORklHX1RBU0tTVEFUUz15Ci1DT05GSUdfVEFTS19ERUxBWV9BQ0NUPXkKLUNPTkZJR19BVURJVD15Ci1DT05GSUdfQVVESVRfTE9HSU5VSURfSU1NVVRBQkxFPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfSElHSF9SRVNfVElNRVJTPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE2Ci1DT05GSUdfTkFNRVNQQUNFUz15Ci1DT05GSUdfRU1CRURERUQ9eQotQ09ORklHX1NMQUI9eQotQ09ORklHX0pVTVBfTEFCRUw9eQotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci1DT05GSUdfTERNX1BBUlRJVElPTj15Ci1DT05GSUdfRUZJX1BBUlRJVElPTj15Ci1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0NBUkQ9eQotQ09ORklHX1BDTUNJQV9BTENIRU1ZX0RFVkJPQVJEPXkKLUNPTkZJR19QTV9SVU5USU1FPXkKLUNPTkZJR19ORVQ9eQotQ09ORklHX1BBQ0tFVD15Ci1DT05GSUdfVU5JWD15Ci1DT05GSUdfVU5JWF9ESUFHPXkKLUNPTkZJR19YRlJNX1VTRVI9eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci1DT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKLUNPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15Ci1DT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLUNPTkZJR19JUF9QTlBfUkFSUD15Ci1DT05GSUdfTkVUX0lQSVA9eQotQ09ORklHX05FVF9JUEdSRV9ERU1VWD15Ci1DT05GSUdfTkVUX0lQR1JFPXkKLUNPTkZJR19ORVRfSVBHUkVfQlJPQURDQVNUPXkKLUNPTkZJR19JUF9NUk9VVEU9eQotQ09ORklHX0lQX01ST1VURV9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQX1BJTVNNX1YxPXkKLUNPTkZJR19JUF9QSU1TTV9WMj15Ci1DT05GSUdfQVJQRD15Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotQ09ORklHX05FVF9JUFZUST15Ci1DT05GSUdfSU5FVF9BSD15Ci1DT05GSUdfSU5FVF9FU1A9eQotQ09ORklHX0lORVRfSVBDT01QPXkKLUNPTkZJR19JTkVUX1VEUF9ESUFHPXkKLUNPTkZJR19UQ1BfQ09OR19BRFZBTkNFRD15Ci1DT05GSUdfVENQX0NPTkdfSFNUQ1A9eQotQ09ORklHX1RDUF9DT05HX0hZQkxBPXkKLUNPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRT15Ci1DT05GSUdfVENQX0NPTkdfTFA9eQotQ09ORklHX1RDUF9DT05HX1ZFTk89eQotQ09ORklHX1RDUF9DT05HX1lFQUg9eQotQ09ORklHX1RDUF9DT05HX0lMTElOT0lTPXkKLUNPTkZJR19ERUZBVUxUX0hZQkxBPXkKLUNPTkZJR19UQ1BfTUQ1U0lHPXkKLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQotQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQotQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15Ci1DT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRD15Ci1DT05GSUdfSU5FVDZfQUg9eQotQ09ORklHX0lORVQ2X0VTUD15Ci1DT05GSUdfSU5FVDZfSVBDT01QPXkKLUNPTkZJR19JUFY2X01JUDY9eQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTj15Ci1DT05GSUdfSVBWNl9TSVRfNlJEPXkKLUNPTkZJR19JUFY2X1RVTk5FTD15Ci1DT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQVjZfU1VCVFJFRVM9eQotQ09ORklHX0lQVjZfTVJPVVRFPXkKLUNPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQVjZfUElNU01fVjI9eQotQ09ORklHX05FVEZJTFRFUj15Ci1DT05GSUdfTkZfQ09OTlRSQUNLPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfVElNRU9VVD15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1RJTUVTVEFNUD15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fRENDUD15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fU0NUUD15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0FNQU5EQT15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9eQotQ09ORklHX05GX0NPTk5UUkFDS19JUkM9eQotQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfU05NUD15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1BQVFA9eQotQ09ORklHX05GX0NPTk5UUkFDS19TQU5FPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfU0lQPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD15Ci1DT05GSUdfTkZfQ1RfTkVUTElOSz15Ci1DT05GSUdfTkZfQ1RfTkVUTElOS19USU1FT1VUPXkKLUNPTkZJR19ORl9DVF9ORVRMSU5LX0hFTFBFUj15Ci1DT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUVfQ1Q9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSE1BUks9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSURMRVRJTUVSPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0xFRD15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9MT0c9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RFRT15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1M9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9BRERSVFlQRT15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NMVVNURVI9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkxJTUlUPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DUFU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfREVWR1JPVVA9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX05GQUNDVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX09TRj15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVj15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1Q9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQ0VOVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFA9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RJTUU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzI9eQotQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PXkKLUNPTkZJR19JUF9ORl9JUFRBQkxFUz15Ci1DT05GSUdfSVBfTkZfTUFUQ0hfQUg9eQotQ09ORklHX0lQX05GX01BVENIX0VDTj15Ci1DT05GSUdfSVBfTkZfTUFUQ0hfUlBGSUxURVI9eQotQ09ORklHX0lQX05GX01BVENIX1RUTD15Ci1DT05GSUdfSVBfTkZfRklMVEVSPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz15Ci1DT05GSUdfTkZfTkFUPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPXkKLUNPTkZJR19JUF9ORl9NQU5HTEU9eQotQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9eQotQ09ORklHX0lQX05GX1RBUkdFVF9FQ049eQotQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9eQotQ09ORklHX0lQX05GX1JBVz15Ci1DT05GSUdfSVBfTkZfQVJQVEFCTEVTPXkKLUNPTkZJR19JUF9ORl9BUlBGSUxURVI9eQotQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9eQotQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PXkKLUNPTkZJR19JUDZfTkZfSVBUQUJMRVM9eQotQ09ORklHX0lQNl9ORl9NQVRDSF9BSD15Ci1DT05GSUdfSVA2X05GX01BVENIX0VVSTY0PXkKLUNPTkZJR19JUDZfTkZfTUFUQ0hfRlJBRz15Ci1DT05GSUdfSVA2X05GX01BVENIX09QVFM9eQotQ09ORklHX0lQNl9ORl9NQVRDSF9ITD15Ci1DT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVI9eQotQ09ORklHX0lQNl9ORl9NQVRDSF9NSD15Ci1DT05GSUdfSVA2X05GX01BVENIX1JQRklMVEVSPXkKLUNPTkZJR19JUDZfTkZfTUFUQ0hfUlQ9eQotQ09ORklHX0lQNl9ORl9UQVJHRVRfSEw9eQotQ09ORklHX0lQNl9ORl9GSUxURVI9eQotQ09ORklHX0lQNl9ORl9UQVJHRVRfUkVKRUNUPXkKLUNPTkZJR19JUDZfTkZfTUFOR0xFPXkKLUNPTkZJR19JUDZfTkZfUkFXPXkKLUNPTkZJR19CUklER0VfTkZfRUJUQUJMRVM9eQotQ09ORklHX0JSSURHRV9FQlRfQlJPVVRFPXkKLUNPTkZJR19CUklER0VfRUJUX1RfRklMVEVSPXkKLUNPTkZJR19CUklER0VfRUJUX1RfTkFUPXkKLUNPTkZJR19CUklER0VfRUJUXzgwMl8zPXkKLUNPTkZJR19CUklER0VfRUJUX0FNT05HPXkKLUNPTkZJR19CUklER0VfRUJUX0FSUD15Ci1DT05GSUdfQlJJREdFX0VCVF9JUD15Ci1DT05GSUdfQlJJREdFX0VCVF9JUDY9eQotQ09ORklHX0JSSURHRV9FQlRfTElNSVQ9eQotQ09ORklHX0JSSURHRV9FQlRfTUFSSz15Ci1DT05GSUdfQlJJREdFX0VCVF9QS1RUWVBFPXkKLUNPTkZJR19CUklER0VfRUJUX1NUUD15Ci1DT05GSUdfQlJJREdFX0VCVF9WTEFOPXkKLUNPTkZJR19CUklER0VfRUJUX0FSUFJFUExZPXkKLUNPTkZJR19CUklER0VfRUJUX0ROQVQ9eQotQ09ORklHX0JSSURHRV9FQlRfTUFSS19UPXkKLUNPTkZJR19CUklER0VfRUJUX1JFRElSRUNUPXkKLUNPTkZJR19CUklER0VfRUJUX1NOQVQ9eQotQ09ORklHX0JSSURHRV9FQlRfTE9HPXkKLUNPTkZJR19CUklER0VfRUJUX05GTE9HPXkKLUNPTkZJR19MMlRQPXkKLUNPTkZJR19MMlRQX1YzPXkKLUNPTkZJR19MMlRQX0lQPXkKLUNPTkZJR19MMlRQX0VUSD15Ci1DT05GSUdfQlJJREdFPXkKLUNPTkZJR19WTEFOXzgwMjFRPXkKLUNPTkZJR19WTEFOXzgwMjFRX0dWUlA9eQotQ09ORklHX0xMQzI9eQotQ09ORklHX05FVF9TQ0hFRD15Ci1DT05GSUdfTkVUX1NDSF9DQlE9eQotQ09ORklHX05FVF9TQ0hfSFRCPXkKLUNPTkZJR19ORVRfU0NIX0hGU0M9eQotQ09ORklHX05FVF9TQ0hfUFJJTz15Ci1DT05GSUdfTkVUX1NDSF9NVUxUSVE9eQotQ09ORklHX05FVF9TQ0hfUkVEPXkKLUNPTkZJR19ORVRfU0NIX1NGQj15Ci1DT05GSUdfTkVUX1NDSF9TRlE9eQotQ09ORklHX05FVF9TQ0hfVEVRTD15Ci1DT05GSUdfTkVUX1NDSF9UQkY9eQotQ09ORklHX05FVF9TQ0hfR1JFRD15Ci1DT05GSUdfTkVUX1NDSF9EU01BUks9eQotQ09ORklHX05FVF9TQ0hfTkVURU09eQotQ09ORklHX05FVF9TQ0hfRFJSPXkKLUNPTkZJR19ORVRfU0NIX01RUFJJTz15Ci1DT05GSUdfTkVUX1NDSF9DSE9LRT15Ci1DT05GSUdfTkVUX1NDSF9RRlE9eQotQ09ORklHX05FVF9TQ0hfQ09ERUw9eQotQ09ORklHX05FVF9TQ0hfRlFfQ09ERUw9eQotQ09ORklHX05FVF9TQ0hfSU5HUkVTUz15Ci1DT05GSUdfTkVUX1NDSF9QTFVHPXkKLUNPTkZJR19ORVRfQ0xTX0JBU0lDPXkKLUNPTkZJR19ORVRfQ0xTX1RDSU5ERVg9eQotQ09ORklHX05FVF9DTFNfUk9VVEU0PXkKLUNPTkZJR19ORVRfQ0xTX0ZXPXkKLUNPTkZJR19ORVRfQ0xTX1UzMj15Ci1DT05GSUdfQ0xTX1UzMl9QRVJGPXkKLUNPTkZJR19DTFNfVTMyX01BUks9eQotQ09ORklHX05FVF9DTFNfUlNWUD15Ci1DT05GSUdfTkVUX0NMU19SU1ZQNj15Ci1DT05GSUdfTkVUX0NMU19GTE9XPXkKLUNPTkZJR19ORVRfRU1BVENIPXkKLUNPTkZJR19ORVRfRU1BVENIX0NNUD15Ci1DT05GSUdfTkVUX0VNQVRDSF9OQllURT15Ci1DT05GSUdfTkVUX0VNQVRDSF9VMzI9eQotQ09ORklHX05FVF9FTUFUQ0hfTUVUQT15Ci1DT05GSUdfTkVUX0VNQVRDSF9URVhUPXkKLUNPTkZJR19ORVRfQ0xTX0FDVD15Ci1DT05GSUdfTkVUX0FDVF9QT0xJQ0U9eQotQ09ORklHX05FVF9BQ1RfR0FDVD15Ci1DT05GSUdfR0FDVF9QUk9CPXkKLUNPTkZJR19ORVRfQUNUX01JUlJFRD15Ci1DT05GSUdfTkVUX0FDVF9OQVQ9eQotQ09ORklHX05FVF9BQ1RfUEVESVQ9eQotQ09ORklHX05FVF9BQ1RfU0lNUD15Ci1DT05GSUdfTkVUX0FDVF9TS0JFRElUPXkKLUNPTkZJR19ORVRfQUNUX0NTVU09eQotQ09ORklHX05FVF9DTFNfSU5EPXkKLUNPTkZJR19CVD15Ci1DT05GSUdfQlRfUkZDT01NPXkKLUNPTkZJR19CVF9SRkNPTU1fVFRZPXkKLUNPTkZJR19CVF9CTkVQPXkKLUNPTkZJR19CVF9CTkVQX01DX0ZJTFRFUj15Ci1DT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVI9eQotQ09ORklHX0JUX0hJRFA9eQotQ09ORklHX0JUX0hDSUJUVVNCPXkKLUNPTkZJR19DRkc4MDIxMT15Ci1DT05GSUdfQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTPXkKLUNPTkZJR19DRkc4MDIxMV9XRVhUPXkKLUNPTkZJR19NQUM4MDIxMT15Ci1DT05GSUdfTUFDODAyMTFfTEVEUz15Ci1DT05GSUdfUkZLSUxMPXkKLUNPTkZJR19SRktJTExfSU5QVVQ9eQotQ09ORklHX0RFVlRNUEZTPXkKLUNPTkZJR19ERVZUTVBGU19NT1VOVD15Ci1DT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMT0NLPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfQ0ZJX0FNRFNURD15Ci1DT05GSUdfTVREX1BIWVNNQVA9eQotQ09ORklHX01URF9NMjVQODA9eQotQ09ORklHX01URF9OQU5EPXkKLUNPTkZJR19NVERfTkFORF9QTEFURk9STT15Ci1DT05GSUdfRUVQUk9NX0FUMjQ9eQotQ09ORklHX0VFUFJPTV9BVDI1PXkKLUNPTkZJR19JREU9eQotQ09ORklHX0JMS19ERVZfSURFX0FVMVhYWD15Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQ0hSX0RFVl9TRz15Ci1DT05GSUdfU0NTSV9NVUxUSV9MVU49eQotQ09ORklHX0FUQT15Ci1DT05GSUdfUEFUQV9IUFQzN1g9eQotQ09ORklHX1BBVEFfUENNQ0lBPXkKLUNPTkZJR19QQVRBX1BMQVRGT1JNPXkKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19NSVBTX0FVMVgwMF9FTkVUPXkKLUNPTkZJR19TTUM5MVg9eQotQ09ORklHX1NNU0M5MTFYPXkKLUNPTkZJR19BTURfUEhZPXkKLUNPTkZJR19TTVNDX1BIWT15Ci1DT05GSUdfUlQyWDAwPXkKLUNPTkZJR19SVDczVVNCPXkKLUNPTkZJR19JTlBVVF9FVkRFVj15Ci1DT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQotQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWD15Ci1DT05GSUdfSU5QVVRfTUlTQz15Ci1DT05GSUdfSU5QVVRfVUlOUFVUPXkKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfVFRZX1BSSU5USz15Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX0FVMTU1MD15Ci1DT05GSUdfU1BJPXkKLUNPTkZJR19TUElfQVUxNTUwPXkKLUNPTkZJR19HUElPX1NZU0ZTPXkKLUNPTkZJR19TRU5TT1JTX0FETTEwMjU9eQotQ09ORklHX1NFTlNPUlNfTE03MD15Ci1DT05GSUdfU09VTkQ9eQotQ09ORklHX1NORD15Ci1DT05GSUdfU05EX0hSVElNRVI9eQotQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15Ci1DT05GSUdfU05EX1NPQz15Ci1DT05GSUdfU05EX1NPQ19BVTFYUFNDPXkKLUNPTkZJR19TTkRfU09DX0RCMTIwMD15Ci1DT05GSUdfSElEUkFXPXkKLUNPTkZJR19VSElEPXkKLUNPTkZJR19VU0JfSElEREVWPXkKLUNPTkZJR19VU0I9eQotQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUz15Ci1DT05GSUdfVVNCX0VIQ0lfSENEPXkKLUNPTkZJR19VU0JfRUhDSV9IQ0RfUExBVEZPUk09eQotQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUPXkKLUNPTkZJR19VU0JfT0hDSV9IQ0Q9eQotQ09ORklHX1VTQl9PSENJX0hDRF9QTEFURk9STT15Ci1DT05GSUdfVVNCX1NUT1JBR0U9eQotQ09ORklHX01NQz15Ci1DT05GSUdfTU1DX0FVMVg9eQotQ09ORklHX05FV19MRURTPXkKLUNPTkZJR19MRURTX0NMQVNTPXkKLUNPTkZJR19SVENfQ0xBU1M9eQotQ09ORklHX1JUQ19EUlZfQVUxWFhYPXkKLUNPTkZJR19FWFQ0X0ZTPXkKLUNPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhUNF9GU19TRUNVUklUWT15Ci1DT05GSUdfWEZTX0ZTPXkKLUNPTkZJR19YRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19WRkFUX0ZTPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19DT05GSUdGU19GUz15Ci1DT05GSUdfSkZGUzJfRlM9eQotQ09ORklHX0pGRlMyX1NVTU1BUlk9eQotQ09ORklHX0pGRlMyX0ZTX1hBVFRSPXkKLUNPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TPXkKLUNPTkZJR19KRkZTMl9MWk89eQotQ09ORklHX0pGRlMyX0NNT0RFX0ZBVk9VUkxaTz15Ci1DT05GSUdfU1FVQVNIRlM9eQotQ09ORklHX1NRVUFTSEZTX0xaTz15Ci1DT05GSUdfU1FVQVNIRlNfWFo9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzX0FDTD15Ci1DT05GSUdfTkZTX1Y0PXkKLUNPTkZJR19ORlNfVjRfMT15Ci1DT05GSUdfTkZTX1Y0XzFfSU1QTEVNRU5UQVRJT05fSURfRE9NQUlOPSJrZXJuZWwub3JnIgotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19ORlNEPXkKLUNPTkZJR19ORlNEX1YzX0FDTD15Ci1DT05GSUdfTkZTRF9WND15Ci1DT05GSUdfTkxTX0NPREVQQUdFXzQzNz15Ci1DT05GSUdfTkxTX0NPREVQQUdFXzg1MD15Ci1DT05GSUdfTkxTX0NPREVQQUdFXzg1Mj15Ci1DT05GSUdfTkxTX0NPREVQQUdFXzEyNTA9eQotQ09ORklHX05MU19BU0NJST15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMT15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMj15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMTU9eQotQ09ORklHX05MU19VVEY4PXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfU1RSSVBfQVNNX1NZTVM9eQotQ09ORklHX1NFQ1VSSVRZRlM9eQotQ09ORklHX0NSWVBUT19VU0VSPXkKLUNPTkZJR19DUllQVE9fTlVMTD15Ci1DT05GSUdfQ1JZUFRPX0NSWVBURD15Ci1DT05GSUdfQ1JZUFRPX0NDTT15Ci1DT05GSUdfQ1JZUFRPX0dDTT15Ci1DT05GSUdfQ1JZUFRPX0NUUz15Ci1DT05GSUdfQ1JZUFRPX0xSVz15Ci1DT05GSUdfQ1JZUFRPX1BDQkM9eQotQ09ORklHX0NSWVBUT19YVFM9eQotQ09ORklHX0NSWVBUT19YQ0JDPXkKLUNPTkZJR19DUllQVE9fVk1BQz15Ci1DT05GSUdfQ1JZUFRPX01END15Ci1DT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPXkKLUNPTkZJR19DUllQVE9fUk1EMTI4PXkKLUNPTkZJR19DUllQVE9fUk1EMTYwPXkKLUNPTkZJR19DUllQVE9fUk1EMjU2PXkKLUNPTkZJR19DUllQVE9fUk1EMzIwPXkKLUNPTkZJR19DUllQVE9fU0hBMjU2PXkKLUNPTkZJR19DUllQVE9fU0hBNTEyPXkKLUNPTkZJR19DUllQVE9fVEdSMTkyPXkKLUNPTkZJR19DUllQVE9fV1A1MTI9eQotQ09ORklHX0NSWVBUT19BTlVCSVM9eQotQ09ORklHX0NSWVBUT19CTE9XRklTSD15Ci1DT05GSUdfQ1JZUFRPX0NBTUVMTElBPXkKLUNPTkZJR19DUllQVE9fQ0FTVDU9eQotQ09ORklHX0NSWVBUT19DQVNUNj15Ci1DT05GSUdfQ1JZUFRPX0ZDUllQVD15Ci1DT05GSUdfQ1JZUFRPX0tIQVpBRD15Ci1DT05GSUdfQ1JZUFRPX1NBTFNBMjA9eQotQ09ORklHX0NSWVBUT19TRUVEPXkKLUNPTkZJR19DUllQVE9fU0VSUEVOVD15Ci1DT05GSUdfQ1JZUFRPX1RFQT15Ci1DT05GSUdfQ1JZUFRPX1RXT0ZJU0g9eQotQ09ORklHX0NSWVBUT19aTElCPXkKLUNPTkZJR19DUllQVE9fTFpPPXkKLUNPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD15Ci1DT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RiMXh4eF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kYjF4eHhfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWI2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjF4eHhfZGVmY29uZmlnCkBAIC0wLDAgKzEsMjQ1IEBACitDT05GSUdfTUlQU19BTENIRU1ZPXkKK0NPTkZJR19NSVBTX0RCMVhYWD15CitDT05GSUdfQ01BPXkKK0NPTkZJR19DTUFfREVCVUc9eQorQ09ORklHX0haXzEwMD15CitDT05GSUdfTE9DQUxWRVJTSU9OPSItZGIxeHh4IgorQ09ORklHX0tFUk5FTF9YWj15CitDT05GSUdfREVGQVVMVF9IT1NUTkFNRT0iZGIxeHh4IgorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfRkhBTkRMRT15CitDT05GSUdfQVVESVQ9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTYKK0NPTkZJR19DR1JPVVBTPXkKK0NPTkZJR19DR1JPVVBfRlJFRVpFUj15CitDT05GSUdfQ0dST1VQX0RFVklDRT15CitDT05GSUdfQ1BVU0VUUz15CitDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQorQ09ORklHX1JFU09VUkNFX0NPVU5URVJTPXkKK0NPTkZJR19NRU1DRz15CitDT05GSUdfTUVNQ0dfU1dBUD15CitDT05GSUdfTUVNQ0dfS01FTT15CitDT05GSUdfQ0dST1VQX1NDSEVEPXkKK0NPTkZJR19DRlNfQkFORFdJRFRIPXkKK0NPTkZJR19SVF9HUk9VUF9TQ0hFRD15CitDT05GSUdfQkxLX0NHUk9VUD15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfU0xBQj15CitDT05GSUdfQkxLX0RFVl9CU0dMSUI9eQorQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CitDT05GSUdfREVGQVVMVF9OT09QPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9SRUFMTE9DX0VOQUJMRV9BVVRPPXkKK0NPTkZJR19QQ0NBUkQ9eQorQ09ORklHX1BDTUNJQV9BTENIRU1ZX0RFVkJPQVJEPXkKK0NPTkZJR19QTV9SVU5USU1FPXkKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX0RJQUc9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1VOSVhfRElBRz15CitDT05GSUdfWEZSTV9VU0VSPXkKK0NPTkZJR19YRlJNX1NVQl9QT0xJQ1k9eQorQ09ORklHX1hGUk1fTUlHUkFURT15CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTPXkKK0NPTkZJR19ORVRfSVBJUD15CitDT05GSUdfTkVUX0lQR1JFX0RFTVVYPXkKK0NPTkZJR19ORVRfSVBHUkU9eQorQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1Q9eQorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19JTkVUX0FIPXkKK0NPTkZJR19JTkVUX0VTUD15CitDT05GSUdfSU5FVF9JUENPTVA9eQorQ09ORklHX0lORVRfVURQX0RJQUc9eQorQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEPXkKK0NPTkZJR19UQ1BfQ09OR19WRU5PPXkKK0NPTkZJR19ERUZBVUxUX1ZFTk89eQorQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQorQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15CitDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRD15CitDT05GSUdfSU5FVDZfQUg9eQorQ09ORklHX0lORVQ2X0VTUD15CitDT05GSUdfSU5FVDZfSVBDT01QPXkKK0NPTkZJR19JUFY2X01JUDY9eQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTj15CitDT05GSUdfSVBWNl9WVEk9eQorQ09ORklHX0lQVjZfU0lUXzZSRD15CitDT05GSUdfSVBWNl9HUkU9eQorQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUFY2X1NVQlRSRUVTPXkKK0NPTkZJR19JUFY2X01ST1VURT15CitDT05GSUdfSVBWNl9NUk9VVEVfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUFY2X1BJTVNNX1YyPXkKK0NPTkZJR19CUklER0U9eQorQ09ORklHX05FVExJTktfTU1BUD15CitDT05GSUdfTkVUTElOS19ESUFHPXkKK0NPTkZJR19JUkRBPXkKK0NPTkZJR19JUkxBTj15CitDT05GSUdfSVJDT01NPXkKK0NPTkZJR19JUkRBX1VMVFJBPXkKK0NPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUD15CitDT05GSUdfSVJEQV9GQVNUX1JSPXkKK0NPTkZJR19BVTEwMDBfRklSPXkKK0NPTkZJR19CVD15CitDT05GSUdfQlRfUkZDT01NPXkKK0NPTkZJR19CVF9SRkNPTU1fVFRZPXkKK0NPTkZJR19CVF9CTkVQPXkKK0NPTkZJR19CVF9CTkVQX01DX0ZJTFRFUj15CitDT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVI9eQorQ09ORklHX0JUX0hJRFA9eQorQ09ORklHX0JUX0hDSUJUVVNCPXkKK0NPTkZJR19DRkc4MDIxMT15CitDT05GSUdfQ0ZHODAyMTFfV0VYVD15CitDT05GSUdfTUFDODAyMTE9eQorQ09ORklHX0RFVlRNUEZTPXkKK0NPTkZJR19ERVZUTVBGU19NT1VOVD15CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CitDT05GSUdfTVREX0JMT0NLPXkKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9NMjVQODA9eQorQ09ORklHX01URF9TU1QyNUw9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9FQ0NfQkNIPXkKK0NPTkZJR19NVERfTkFORF9BVTE1NTA9eQorQ09ORklHX01URF9OQU5EX1BMQVRGT1JNPXkKK0NPTkZJR19FRVBST01fQVQyND15CitDT05GSUdfRUVQUk9NX0FUMjU9eQorQ09ORklHX1NDU0lfVEdUPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CitDT05GSUdfQVRBPXkKK0NPTkZJR19QQVRBX0hQVDM3WD15CitDT05GSUdfUEFUQV9IUFQzWDJOPXkKK0NPTkZJR19QQVRBX1BDTUNJQT15CitDT05GSUdfUEFUQV9QTEFURk9STT15CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfTkxNT049eQorQ09ORklHX1BDTUNJQV8zQzU4OT15CitDT05GSUdfTUlQU19BVTFYMDBfRU5FVD15CitDT05GSUdfU01DOTFYPXkKK0NPTkZJR19TTVNDOTExWD15CitDT05GSUdfQU1EX1BIWT15CitDT05GSUdfU01TQ19QSFk9eQorQ09ORklHX0lOUFVUX0VWREVWPXkKK0NPTkZJR19LRVlCT0FSRF9HUElPPXkKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CitDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0Nj15CitDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYPXkKK0NPTkZJR19JTlBVVF9NSVNDPXkKK0NPTkZJR19JTlBVVF9VSU5QVVQ9eQorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19UVFlfUFJJTlRLPXkKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfQVUxNTUwPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9BVTE1NTA9eQorQ09ORklHX1NQSV9HUElPPXkKK0NPTkZJR19TRU5TT1JTX0FETTEwMjU9eQorQ09ORklHX1NFTlNPUlNfTE03MD15CitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0FVMTEwMD15CitDT05GSUdfRkJfQVUxMjAwPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZPXkKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSPXkKK0NPTkZJR19TTkRfSFJUSU1FUj15CitDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXkKK0NPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFPXkKK0NPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFX0RFRkFVTFQ9MQorQ09ORklHX1NORF9TT0M9eQorQ09ORklHX1NORF9TT0NfQVUxWFBTQz15CitDT05GSUdfU05EX1NPQ19BVTFYQVVESU89eQorQ09ORklHX1NORF9TT0NfREIxMDAwPXkKK0NPTkZJR19TTkRfU09DX0RCMTIwMD15CitDT05GSUdfSElEUkFXPXkKK0NPTkZJR19VSElEPXkKK0NPTkZJR19ISURfTE9HSVRFQ0g9eQorQ09ORklHX0hJRF9MT0dJVEVDSF9ESj15CitDT05GSUdfVVNCX0hJRERFVj15CitDT05GSUdfVVNCPXkKK0NPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlM9eQorQ09ORklHX1VTQl9PVEc9eQorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQ9eQorQ09ORklHX1VTQl9FSENJX0hDRF9QTEFURk9STT15CitDT05GSUdfVVNCX09IQ0lfSENEPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0RfUExBVEZPUk09eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19DTEtHQVRFPXkKK0NPTkZJR19TRElPX1VBUlQ9eQorQ09ORklHX01NQ19BVTFYPXkKK0NPTkZJR19ORVdfTEVEUz15CitDT05GSUdfTEVEU19DTEFTUz15CitDT05GSUdfTEVEU19UUklHR0VSUz15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfRFJWX0FVMVhYWD15CitDT05GSUdfRklSTVdBUkVfTUVNTUFQPXkKK0NPTkZJR19FWFQ0X0ZTPXkKK0NPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUNF9GU19TRUNVUklUWT15CitDT05GSUdfWEZTX0ZTPXkKK0NPTkZJR19YRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19GQU5PVElGWT15CitDT05GSUdfRlVTRV9GUz15CitDT05GSUdfQ1VTRT15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CitDT05GSUdfQ09ORklHRlNfRlM9eQorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9TVU1NQVJZPXkKK0NPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TPXkKK0NPTkZJR19KRkZTMl9MWk89eQorQ09ORklHX0pGRlMyX1JVQklOPXkKK0NPTkZJR19TUVVBU0hGUz15CitDT05GSUdfU1FVQVNIRlNfRklMRV9ESVJFQ1Q9eQorQ09ORklHX1NRVUFTSEZTX1hBVFRSPXkKK0NPTkZJR19TUVVBU0hGU19MWk89eQorQ09ORklHX1NRVUFTSEZTX1haPXkKK0NPTkZJR19GMkZTX0ZTPXkKK0NPTkZJR19GMkZTX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WM19BQ0w9eQorQ09ORklHX05GU19WND15CitDT05GSUdfTkZTX1Y0XzE9eQorQ09ORklHX05GU19WNF8yPXkKK0NPTkZJR19ORlNfVjRfMV9JTVBMRU1FTlRBVElPTl9JRF9ET01BSU49ImxvY2FsIgorQ09ORklHX05GU19WNF8xX01JR1JBVElPTj15CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WM19BQ0w9eQorQ09ORklHX05GU0RfVjQ9eQorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorQ09ORklHX05MU19DT0RFUEFHRV84NTI9eQorQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPXkKK0NPTkZJR19OTFNfQVNDSUk9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX05MU19JU084ODU5XzI9eQorQ09ORklHX05MU19JU084ODU5XzE1PXkKK0NPTkZJR19OTFNfVVRGOD15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX1NFQ1VSSVRZRlM9eQorQ09ORklHX0NSWVBUT19VU0VSPXkKK0NPTkZJR19DUllQVE9fQ1JZUFREPXkKK0NPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD15CitDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPXkKK0NPTkZJR19DUkMzMl9TTElDRUJZND15CitDT05GSUdfRk9OVFM9eQorQ09ORklHX0ZPTlRfOHg4PXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2xvb25nc29uM19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9sb29uZ3NvbjNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTc2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy9sb29uZ3NvbjNfZGVmY29uZmlnCkBAIC0wLDAgKzEsMzYyIEBACitDT05GSUdfTUFDSF9MT09OR1NPTj15CitDT05GSUdfU1dJT1RMQj15CitDT05GSUdfTEVNT1RFX01BQ0gzQT15CitDT05GSUdfQ1BVX0xPT05HU09OMz15CitDT05GSUdfNjRCSVQ9eQorQ09ORklHX1BBR0VfU0laRV8xNktCPXkKK0NPTkZJR19LU009eQorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz00CitDT05GSUdfSFpfMjU2PXkKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19LRVhFQz15CisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfS0VSTkVMX0xaTUE9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQVVESVQ9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorQ09ORklHX1RBU0tTVEFUUz15CitDT05GSUdfVEFTS19ERUxBWV9BQ0NUPXkKK0NPTkZJR19UQVNLX1hBQ0NUPXkKK0NPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkc9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19DUFVTRVRTPXkKK0NPTkZJR19SRVNPVVJDRV9DT1VOVEVSUz15CitDT05GSUdfTUVNQ0c9eQorQ09ORklHX01FTUNHX1NXQVA9eQorQ09ORklHX0JMS19DR1JPVVA9eQorQ09ORklHX1NDSEVEX0FVVE9HUk9VUD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfUkVMQVk9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19SRF9CWklQMj15CitDT05GSUdfUkRfTFpNQT15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX0JMS19ERVZfSU5URUdSSVRZPXkKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9bQorQ09ORklHX0NGUV9HUk9VUF9JT1NDSEVEPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX0hUX1BDST15CitDT05GSUdfUENJRVBPUlRCVVM9eQorQ09ORklHX0hPVFBMVUdfUENJX1BDSUU9eQorIyBDT05GSUdfUENJRUFFUiBpcyBub3Qgc2V0CitDT05GSUdfUENJRUFTUE1fUEVSRk9STUFOQ0U9eQorQ09ORklHX0hPVFBMVUdfUENJPXkKK0NPTkZJR19IT1RQTFVHX1BDSV9TSFBDPW0KK0NPTkZJR19CSU5GTVRfTUlTQz1tCitDT05GSUdfTUlQUzMyX0NPTVBBVD15CitDT05GSUdfTUlQUzMyX08zMj15CitDT05GSUdfTUlQUzMyX04zMj15CitDT05GSUdfUE1fUlVOVElNRT15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNX1VTRVI9eQorQ09ORklHX05FVF9LRVk9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15CitDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CitDT05GSUdfTkVURklMVEVSPXkKK0NPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0c9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUz1tCitDT05GSUdfSVBfVlM9bQorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQorQ09ORklHX0lQX05GX0ZJTFRFUj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQorQ09ORklHX0lQX05GX01BTkdMRT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCitDT05GSUdfSVBfTkZfUkFXPW0KK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCitDT05GSUdfSVBfU0NUUD1tCitDT05GSUdfTDJUUD1tCitDT05GSUdfQlJJREdFPW0KK0NPTkZJR19DRkc4MDIxMT1tCitDT05GSUdfQ0ZHODAyMTFfV0VYVD15CitDT05GSUdfTUFDODAyMTE9bQorQ09ORklHX1JGS0lMTD1tCitDT05GSUdfUkZLSUxMX0lOUFVUPXkKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfREVWVE1QRlM9eQorQ09ORklHX0RFVlRNUEZTX01PVU5UPXkKK0NPTkZJR19NVEQ9bQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfUkFJRF9BVFRSUz1tCitDT05GSUdfU0NTSV9UR1Q9eQorQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0JMS19ERVZfU1I9eQorQ09ORklHX0NIUl9ERVZfU0c9eQorQ09ORklHX0NIUl9ERVZfU0NIPW0KK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9TUElfQVRUUlM9bQorQ09ORklHX1NDU0lfRkNfQVRUUlM9bQorQ09ORklHX0lTQ1NJX1RDUD1tCitDT05GSUdfTUVHQVJBSURfTkVXR0VOPXkKK0NPTkZJR19NRUdBUkFJRF9NTT15CitDT05GSUdfTUVHQVJBSURfTUFJTEJPWD15CitDT05GSUdfTUVHQVJBSURfTEVHQUNZPXkKK0NPTkZJR19NRUdBUkFJRF9TQVM9eQorQ09ORklHX0FUQT15CitDT05GSUdfU0FUQV9BSENJPXkKK0NPTkZJR19QQVRBX0FUSUlYUD15CitDT05GSUdfTUQ9eQorQ09ORklHX0JMS19ERVZfTUQ9bQorQ09ORklHX01EX0xJTkVBUj1tCitDT05GSUdfTURfUkFJRDA9bQorQ09ORklHX01EX1JBSUQxPW0KK0NPTkZJR19NRF9SQUlEMTA9bQorQ09ORklHX01EX1JBSUQ0NTY9bQorQ09ORklHX01EX01VTFRJUEFUSD1tCitDT05GSUdfQkxLX0RFVl9ETT1tCitDT05GSUdfRE1fQ1JZUFQ9bQorQ09ORklHX0RNX1NOQVBTSE9UPW0KK0NPTkZJR19ETV9NSVJST1I9bQorQ09ORklHX0RNX1pFUk89bQorQ09ORklHX1RBUkdFVF9DT1JFPW0KK0NPTkZJR19UQ01fSUJMT0NLPW0KK0NPTkZJR19UQ01fRklMRUlPPW0KK0NPTkZJR19UQ01fUFNDU0k9bQorQ09ORklHX0xPT1BCQUNLX1RBUkdFVD1tCitDT05GSUdfSVNDU0lfVEFSR0VUPW0KK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19UVU49bQorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQURBUFRFQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0FMVEVPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0FSQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0FUSEVST1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NBREVOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9CUk9BRENPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0JST0NBREUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9DSEVMU0lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQ0lSUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQ0lTQ08gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9ERUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9ETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0VNVUxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0VYQVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9IUCBpcyBub3Qgc2V0CitDT05GSUdfRTEwMDA9eQorQ09ORklHX0UxMDAwRT15CitDT05GSUdfSUdCPXkKK0NPTkZJR19JWEdCPXkKK0NPTkZJR19JWEdCRT15CisjIENPTkZJR19ORVRfVkVORE9SX0k4MjVYWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NRUxMQU5PWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01JQ1JFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01ZUkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTlZJRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQUNLRVRfRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUUxPR0lDIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5Q1A9bQorQ09ORklHXzgxMzlUT089bQorQ09ORklHX1I4MTY5PXkKKyMgQ09ORklHX05FVF9WRU5ET1JfUkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0VFUSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NJTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU01TQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NUTUlDUk8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TVU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9URUhVVEkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9USSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1RPU0hJQkEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9XSVpORVQgaXMgbm90IHNldAorQ09ORklHX1BQUD1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorQ09ORklHX1BQUF9ERUZMQVRFPW0KK0NPTkZJR19QUFBfRklMVEVSPXkKK0NPTkZJR19QUFBfTVBQRT1tCitDT05GSUdfUFBQX01VTFRJTElOSz15CitDT05GSUdfUFBQT0U9bQorQ09ORklHX1BQUE9MMlRQPW0KK0NPTkZJR19QUFBfQVNZTkM9bQorQ09ORklHX1BQUF9TWU5DX1RUWT1tCitDT05GSUdfQVRIX0NBUkRTPW0KK0NPTkZJR19BVEg5Sz1tCitDT05GSUdfSE9TVEFQPW0KK0NPTkZJR19JTlBVVF9QT0xMREVWPW0KK0NPTkZJR19JTlBVVF9TUEFSU0VLTUFQPXkKK0NPTkZJR19JTlBVVF9FVkRFVj15CitDT05GSUdfS0VZQk9BUkRfWFRLQkQ9bQorQ09ORklHX01PVVNFX1BTMl9TRU5URUxJQz15CitDT05GSUdfTU9VU0VfU0VSSUFMPW0KK0NPTkZJR19JTlBVVF9NSVNDPXkKK0NPTkZJR19JTlBVVF9VSU5QVVQ9bQorQ09ORklHX1NFUklPX1NFUlBPUlQ9bQorQ09ORklHX1NFUklPX1JBVz1tCitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0xNgorQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15CitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTE2CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfUlNBPXkKK0NPTkZJR19IV19SQU5ET009eQorQ09ORklHX1JBV19EUklWRVI9bQorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfUElJWDQ9eQorQ09ORklHX1NFTlNPUlNfTE03NT1tCitDT05GSUdfU0VOU09SU19MTTkzPW0KK0NPTkZJR19TRU5TT1JTX1c4MzYyN0hGPW0KK0NPTkZJR19NRURJQV9TVVBQT1JUPW0KK0NPTkZJR19NRURJQV9DQU1FUkFfU1VQUE9SVD15CitDT05GSUdfTUVESUFfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9WSURFT19DTEFTUz1tCitDT05GSUdfRFJNPXkKK0NPTkZJR19EUk1fUkFERU9OPXkKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15CitDT05GSUdfRkJfUkFERU9OPXkKK0NPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19MQ0RfUExBVEZPUk09bQorQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDPW0KKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OPXkKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPW0KK0NPTkZJR19TTkRfU0VRVUVOQ0VSPW0KK0NPTkZJR19TTkRfU0VRX0RVTU1ZPW0KKyMgQ09ORklHX1NORF9JU0EgaXMgbm90IHNldAorQ09ORklHX1NORF9IREFfSU5URUw9bQorQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSPXkKK0NPTkZJR19TTkRfSERBX0NPREVDX1JFQUxURUs9bQorQ09ORklHX1NORF9IREFfQ09ERUNfQ09ORVhBTlQ9bQorIyBDT05GSUdfU05EX1VTQiBpcyBub3Qgc2V0CitDT05GSUdfSElEX0E0VEVDSD1tCitDT05GSUdfSElEX1NVTlBMVVM9bQorQ09ORklHX1VTQj15CitDT05GSUdfVVNCX01PTj15CitDT05GSUdfVVNCX1hIQ0lfSENEPW0KK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorQ09ORklHX1VTQl9VSENJX0hDRD1tCitDT05GSUdfVVNCX1NUT1JBR0U9bQorQ09ORklHX1VTQl9TRVJJQUw9bQorQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OPW0KK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfQ01PUz15CitDT05GSUdfRE1BREVWSUNFUz15CitDT05GSUdfUE1fREVWRlJFUT15CitDT05GSUdfREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5EPXkKK0NPTkZJR19ERVZGUkVRX0dPVl9QRVJGT1JNQU5DRT15CitDT05GSUdfREVWRlJFUV9HT1ZfUE9XRVJTQVZFPXkKK0NPTkZJR19ERVZGUkVRX0dPVl9VU0VSU1BBQ0U9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUM19GU19TRUNVUklUWT15CitDT05GSUdfRVhUNF9GUz15CitDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDRfRlNfU0VDVVJJVFk9eQorQ09ORklHX1FVT1RBPXkKKyMgQ09ORklHX1BSSU5UX1FVT1RBX1dBUk5JTkcgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9eQorQ09ORklHX0ZVU0VfRlM9bQorQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTkzNgorQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iZ2IyMzEyIgorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQorQ09ORklHX0NPTkZJR0ZTX0ZTPXkKK0NPTkZJR19DUkFNRlM9bQorQ09ORklHX1NRVUFTSEZTPXkKK0NPTkZJR19TUVVBU0hGU19YQVRUUj15CitDT05GSUdfTkZTX0ZTPW0KK0NPTkZJR19ORlNfVjNfQUNMPXkKK0NPTkZJR19ORlNfVjQ9bQorQ09ORklHX05GU0Q9bQorQ09ORklHX05GU0RfVjNfQUNMPXkKK0NPTkZJR19ORlNEX1Y0PXkKK0NPTkZJR19DSUZTPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTM2PXkKK0NPTkZJR19OTFNfQVNDSUk9eQorQ09ORklHX05MU19VVEY4PXkKK0NPTkZJR19QUklOVEtfVElNRT15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfU1RSSVBfQVNNX1NZTVM9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFk9eQorQ09ORklHX1NFQ1VSSVRZRlM9eQorQ09ORklHX1NFQ1VSSVRZX05FVFdPUks9eQorQ09ORklHX1NFQ1VSSVRZX1BBVEg9eQorQ09ORklHX1NFQ1VSSVRZX1NFTElOVVg9eQorQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfQk9PVFBBUkFNPXkKK0NPTkZJR19TRUNVUklUWV9TRUxJTlVYX0RJU0FCTEU9eQorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXkKK0NPTkZJR19DUllQVE9fQVVUSEVOQz1tCitDT05GSUdfQ1JZUFRPX0hNQUM9eQorQ09ORklHX0NSWVBUT19NRDU9eQorQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19XUDUxMj1tCitDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KK0NPTkZJR19DUllQVE9fQ0FTVDU9bQorQ09ORklHX0NSWVBUT19DQVNUNj1tCitDT05GSUdfQ1JZUFRPX0tIQVpBRD1tCitDT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQorQ09ORklHX0NSWVBUT19URUE9bQorQ09ORklHX0NSWVBUT19UV09GSVNIPW0KK0NPTkZJR19DUllQVE9fREVGTEFURT1tCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcKaW5kZXggY2UxZDNlZS4uYjc0NWI2YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDkgQEAKIENPTkZJR19NSVBTX01BTFRBPXkKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CiBDT05GSUdfQ1BVX01JUFMzMl9SMj15CitDT05GSUdfUEFHRV9TSVpFXzE2S0I9eQogQ09ORklHX01JUFNfTVRfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKIENPTkZJR19IWl8xMDA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX05PX0haPXkKQEAgLTQyLDcgKzQ0LDYgQEAKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD1tCiBDT05GSUdfVENQX01ENVNJRz15Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKIENPTkZJR19JUFY2X1JPVVRFX0lORk89eQogQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQpAQCAtNjgsNyArNjksNiBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9DVF9ORVRMSU5LPW0KLUNPTkZJR19ORVRGSUxURVJfVFBST1hZPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQpAQCAtMTI1LDcgKzEyNSw2IEBACiBDT05GSUdfSVBfVlNfU0VEPW0KIENPTkZJR19JUF9WU19OUT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX0lQX05GX1FVRVVFPW0KIENPTkZJR19JUF9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQX05GX01BVENIX0VDTj1tCkBAIC0xODUsNyArMTg0LDYgQEAKIENPTkZJR19ERVZfQVBQTEVUQUxLPW0KIENPTkZJR19JUEREUD1tCiBDT05GSUdfSVBERFBfRU5DQVA9eQotQ09ORklHX0lQRERQX0RFQ0FQPXkKIENPTkZJR19QSE9ORVQ9bQogQ09ORklHX05FVF9TQ0hFRD15CiBDT05GSUdfTkVUX1NDSF9DQlE9bQpAQCAtMjI2LDkgKzIyNCw5IEBACiBDT05GSUdfTUFDODAyMTFfTUVTSD15CiBDT05GSUdfUkZLSUxMPW0KIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfREVWVE1QRlM9eQogQ09ORklHX0NPTk5FQ1RPUj1tCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfT09QUz1tCiBDT05GSUdfTVREX0NGST15CkBAIC0zMjgsNyArMzI2LDYgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQogQ09ORklHX1NFUklBTF84MjUwPXkKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2t2bV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9rdm1fZGVmY29uZmlnCmluZGV4IDM0MWJiNDcuLjRmN2Q5NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2t2bV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfa3ZtX2RlZmNvbmZpZwpAQCAtMyw2ICszLDcgQEAKIENPTkZJR19DUFVfTUlQUzMyX1IyPXkKIENPTkZJR19QQUdFX1NJWkVfMTZLQj15CiBDT05GSUdfTUlQU19NVF9TTVA9eQorQ09ORklHX05SX0NQVVM9OAogQ09ORklHX0haXzEwMD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfTk9fSFo9eQpAQCAtNDQsNyArNDUsNiBAQAogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KIENPTkZJR19UQ1BfTUQ1U0lHPXkKLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQogQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQogQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15CiBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRD15CkBAIC03MCw3ICs3MCw2IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQogQ09ORklHX05GX0NUX05FVExJTks9bQotQ09ORklHX05FVEZJTFRFUl9UUFJPWFk9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCkBAIC0xMjcsNyArMTI2LDYgQEAKIENPTkZJR19JUF9WU19TRUQ9bQogQ09ORklHX0lQX1ZTX05RPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfSVBfTkZfUVVFVUU9bQogQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIENPTkZJR19JUF9ORl9NQVRDSF9BSD1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KQEAgLTE4Nyw3ICsxODUsNiBAQAogQ09ORklHX0RFVl9BUFBMRVRBTEs9bQogQ09ORklHX0lQRERQPW0KIENPTkZJR19JUEREUF9FTkNBUD15Ci1DT05GSUdfSVBERFBfREVDQVA9eQogQ09ORklHX1BIT05FVD1tCiBDT05GSUdfTkVUX1NDSEVEPXkKIENPTkZJR19ORVRfU0NIX0NCUT1tCkBAIC0yMjgsOSArMjI1LDkgQEAKIENPTkZJR19NQUM4MDIxMV9NRVNIPXkKIENPTkZJR19SRktJTEw9bQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfQ09OTkVDVE9SPW0KIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9PT1BTPW0KIENPTkZJR19NVERfQ0ZJPXkKQEAgLTMwMCw2ICsyOTcsNyBAQAogQ09ORklHX01BQ1ZMQU49bQogQ09ORklHX1RVTj1tCiBDT05GSUdfVkVUSD1tCitDT05GSUdfVkhPU1RfTkVUPW0KIENPTkZJR19QQ05FVDMyPXkKIENPTkZJR19DSEVMU0lPX1QzPW0KIENPTkZJR19BWDg4Nzk2PW0KQEAgLTMyOSw3ICszMjcsNiBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldApAQCAtNDUzLDQgKzQ1MCwzIEBACiBDT05GSUdfS1ZNPW0KIENPTkZJR19LVk1fTUlQU19EWU5fVFJBTlM9eQogQ09ORklHX0tWTV9NSVBTX0RFQlVHX0NPUDBfQ09VTlRFUlM9eQotQ09ORklHX1ZIT1NUX05FVD1tCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9rdm1fZ3Vlc3RfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfa3ZtX2d1ZXN0X2RlZmNvbmZpZwppbmRleCAyYjg1NThiLi5lMzY2ODFjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9rdm1fZ3Vlc3RfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2t2bV9ndWVzdF9kZWZjb25maWcKQEAgLTQ0LDcgKzQ0LDYgQEAKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD1tCiBDT05GSUdfVENQX01ENVNJRz15Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKIENPTkZJR19JUFY2X1JPVVRFX0lORk89eQogQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQpAQCAtNzAsNyArNjksNiBAQAogQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9DVF9ORVRMSU5LPW0KLUNPTkZJR19ORVRGSUxURVJfVFBST1hZPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQpAQCAtMTI3LDcgKzEyNSw2IEBACiBDT05GSUdfSVBfVlNfU0VEPW0KIENPTkZJR19JUF9WU19OUT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX0lQX05GX1FVRVVFPW0KIENPTkZJR19JUF9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQX05GX01BVENIX0VDTj1tCkBAIC0xODcsNyArMTg0LDYgQEAKIENPTkZJR19ERVZfQVBQTEVUQUxLPW0KIENPTkZJR19JUEREUD1tCiBDT05GSUdfSVBERFBfRU5DQVA9eQotQ09ORklHX0lQRERQX0RFQ0FQPXkKIENPTkZJR19QSE9ORVQ9bQogQ09ORklHX05FVF9TQ0hFRD15CiBDT05GSUdfTkVUX1NDSF9DQlE9bQpAQCAtMjI4LDkgKzIyNCw5IEBACiBDT05GSUdfTUFDODAyMTFfTUVTSD15CiBDT05GSUdfUkZLSUxMPW0KIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfREVWVE1QRlM9eQogQ09ORklHX0NPTk5FQ1RPUj1tCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfT09QUz1tCiBDT05GSUdfTVREX0NGST15CkBAIC0zMzEsNyArMzI3LDYgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQogQ09ORklHX1NFUklBTF84MjUwPXkKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhYXBycF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YWFwcnBfZGVmY29uZmlnCmluZGV4IDkzMDU3YTcuLmZiMDQyY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhYXBycF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFhcHJwX2RlZmNvbmZpZwpAQCAtNDQsNyArNDQsNiBAQAogQ09ORklHX0lORVRfRVNQPW0KIENPTkZJR19JTkVUX0lQQ09NUD1tCiAjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JTkVUNl9BSD1tCiBDT05GSUdfSU5FVDZfRVNQPW0KIENPTkZJR19JTkVUNl9JUENPTVA9bQpAQCAtNTUsNyArNTQsNiBAQAogQ09ORklHX0RFVl9BUFBMRVRBTEs9bQogQ09ORklHX0lQRERQPW0KIENPTkZJR19JUEREUF9FTkNBUD15Ci1DT05GSUdfSVBERFBfREVDQVA9eQogQ09ORklHX05FVF9TQ0hFRD15CiBDT05GSUdfTkVUX1NDSF9DQlE9bQogQ09ORklHX05FVF9TQ0hfSFRCPW0KQEAgLTgwLDYgKzc4LDcgQEAKIENPTkZJR19ORVRfQUNUX1BPTElDRT15CiBDT05GSUdfTkVUX0NMU19JTkQ9eQogIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCiBDT05GSUdfSURFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc210Y19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdGNfZGVmY29uZmlnCmluZGV4IDRlNTRiNzUuLmViMzE2NDQ3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdGNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc210Y19kZWZjb25maWcKQEAgLTEsNiArMSw3IEBACiBDT05GSUdfTUlQU19NQUxUQT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0NQVV9NSVBTMzJfUjI9eQorQ09ORklHX1BBR0VfU0laRV8xNktCPXkKIENPTkZJR19NSVBTX01UX1NNVEM9eQogIyBDT05GSUdfTUlQU19NVF9GUEFGRiBpcyBub3Qgc2V0CiBDT05GSUdfTlJfQ1BVUz05CkBAIC00NSw3ICs0Niw2IEBACiBDT05GSUdfSU5FVF9FU1A9bQogQ09ORklHX0lORVRfSVBDT01QPW0KICMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQogQ09ORklHX0lORVQ2X0FIPW0KIENPTkZJR19JTkVUNl9FU1A9bQogQ09ORklHX0lORVQ2X0lQQ09NUD1tCkBAIC01Niw3ICs1Niw2IEBACiBDT05GSUdfREVWX0FQUExFVEFMSz1tCiBDT05GSUdfSVBERFA9bQogQ09ORklHX0lQRERQX0VOQ0FQPXkKLUNPTkZJR19JUEREUF9ERUNBUD15CiBDT05GSUdfTkVUX1NDSEVEPXkKIENPTkZJR19ORVRfU0NIX0NCUT1tCiBDT05GSUdfTkVUX1NDSF9IVEI9bQpAQCAtODEsNiArODAsNyBAQAogQ09ORklHX05FVF9BQ1RfUE9MSUNFPXkKIENPTkZJR19ORVRfQ0xTX0lORD15CiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KIENPTkZJR19JREU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXZwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc212cF9kZWZjb25maWcKaW5kZXggZDc1OTMxOC4uMTBlZjNiZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXZwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YXNtdnBfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiBDT05GSUdfTUlQU19NQUxUQT15CiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0NQVV9NSVBTMzJfUjI9eQorQ09ORklHX1BBR0VfU0laRV8xNktCPXkKIENPTkZJR19NSVBTX01UX1NNUD15CiBDT05GSUdfU0NIRURfU01UPXkKIENPTkZJR19NSVBTX0NNUD15Ci1DT05GSUdfTlJfQ1BVUz0yCitDT05GSUdfTlJfQ1BVUz04CiBDT05GSUdfSFpfMTAwPXkKIENPTkZJR19MT0NBTFZFUlNJT049ImNtcCIKIENPTkZJR19TWVNWSVBDPXkKQEAgLTQ3LDcgKzQ4LDYgQEAKIENPTkZJR19JTkVUX0VTUD1tCiBDT05GSUdfSU5FVF9JUENPTVA9bQogIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotQ09ORklHX0lQVjZfUFJJVkFDWT15CiBDT05GSUdfSU5FVDZfQUg9bQogQ09ORklHX0lORVQ2X0VTUD1tCiBDT05GSUdfSU5FVDZfSVBDT01QPW0KQEAgLTgyLDYgKzgyLDcgQEAKIENPTkZJR19ORVRfQUNUX1BPTElDRT15CiBDT05GSUdfTkVUX0NMU19JTkQ9eQogIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCiBDT05GSUdfSURFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc212cF9ldmFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFzbXZwX2V2YV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMDAyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21hbHRhc212cF9ldmFfZGVmY29uZmlnCkBAIC0wLDAgKzEsMjAwIEBACitDT05GSUdfTUlQU19NQUxUQT15CitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX0NQVV9NSVBTMzJfUjI9eQorQ09ORklHX0NQVV9NSVBTMzJfM181X0ZFQVRVUkVTPXkKK0NPTkZJR19QQUdFX1NJWkVfMTZLQj15CitDT05GSUdfTUlQU19NVF9TTVA9eQorQ09ORklHX1NDSEVEX1NNVD15CitDT05GSUdfTUlQU19DTVA9eQorQ09ORklHX05SX0NQVVM9OAorQ09ORklHX0haXzEwMD15CitDT05GSUdfTE9DQUxWRVJTSU9OPSJjbXAiCitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19BVURJVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE1CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CitDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNX1VTRVI9bQorQ09ORklHX05FVF9LRVk9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15CitDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19ORVRfSVBJUD1tCitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CitDT05GSUdfSVBfUElNU01fVjI9eQorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19JTkVUX0FIPW0KK0NPTkZJR19JTkVUX0VTUD1tCitDT05GSUdfSU5FVF9JUENPTVA9bQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVQ2X0FIPW0KK0NPTkZJR19JTkVUNl9FU1A9bQorQ09ORklHX0lORVQ2X0lQQ09NUD1tCitDT05GSUdfSVBWNl9UVU5ORUw9bQorQ09ORklHX0JSSURHRT1tCitDT05GSUdfVkxBTl84MDIxUT1tCitDT05GSUdfQVRBTEs9bQorQ09ORklHX0RFVl9BUFBMRVRBTEs9bQorQ09ORklHX0lQRERQPW0KK0NPTkZJR19JUEREUF9FTkNBUD15CitDT05GSUdfTkVUX1NDSEVEPXkKK0NPTkZJR19ORVRfU0NIX0NCUT1tCitDT05GSUdfTkVUX1NDSF9IVEI9bQorQ09ORklHX05FVF9TQ0hfSEZTQz1tCitDT05GSUdfTkVUX1NDSF9QUklPPW0KK0NPTkZJR19ORVRfU0NIX1JFRD1tCitDT05GSUdfTkVUX1NDSF9TRlE9bQorQ09ORklHX05FVF9TQ0hfVEVRTD1tCitDT05GSUdfTkVUX1NDSF9UQkY9bQorQ09ORklHX05FVF9TQ0hfR1JFRD1tCitDT05GSUdfTkVUX1NDSF9EU01BUks9bQorQ09ORklHX05FVF9TQ0hfTkVURU09bQorQ09ORklHX05FVF9TQ0hfSU5HUkVTUz1tCitDT05GSUdfTkVUX0NMU19CQVNJQz1tCitDT05GSUdfTkVUX0NMU19UQ0lOREVYPW0KK0NPTkZJR19ORVRfQ0xTX1JPVVRFND1tCitDT05GSUdfTkVUX0NMU19GVz1tCitDT05GSUdfTkVUX0NMU19VMzI9bQorQ09ORklHX05FVF9DTFNfUlNWUD1tCitDT05GSUdfTkVUX0NMU19SU1ZQNj1tCitDT05GSUdfTkVUX0NMU19BQ1Q9eQorQ09ORklHX05FVF9BQ1RfUE9MSUNFPXkKK0NPTkZJR19ORVRfQ0xTX0lORD15CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KK0NPTkZJR19JREU9eQorIyBDT05GSUdfSURFX1BST0NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSURFUENJX1BDSUJVU19PUkRFUiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKK0NPTkZJR19CTEtfREVWX1BJSVg9eQorQ09ORklHX1NDU0k9eQorQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU0c9eQorIyBDT05GSUdfU0NTSV9MT1dMRVZFTCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9BREFQVEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQUxURU9OIGlzIG5vdCBzZXQKK0NPTkZJR19QQ05FVDMyPXkKKyMgQ09ORklHX05FVF9WRU5ET1JfQVRIRVJPUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0JST0FEQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQlJPQ0FERSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0NIRUxTSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9DSVNDTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0RFQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0RMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfRU1VTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfRVhBUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfSU5URUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTUVMTEFOT1ggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NWVJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX05WSURJQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX09LSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUEFDS0VUX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1FMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1JFQUxURUsgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SREMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TRUVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0lMQU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU1RNSUNSTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NVTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1RFSFVUSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfVE9TSElCQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1dJWk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTQKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCitDT05GSUdfRkI9eQorQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQorQ09ORklHX0ZCX01BVFJPWD15CitDT05GSUdfRkJfTUFUUk9YX0c9eQorQ09ORklHX1VTQj15CitDT05GSUdfVVNCX0VIQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfVUhDSV9IQ0Q9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19ORVdfTEVEUz15CitDT05GSUdfTEVEU19DTEFTUz15CitDT05GSUdfTEVEU19UUklHR0VSUz15CitDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfSURFX0RJU0s9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9CQUNLTElHSFQ9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfQ01PUz15CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAorQ09ORklHX1hGU19GUz15CitDT05GSUdfWEZTX1FVT1RBPXkKK0NPTkZJR19YRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19RVU9UQT15CitDT05GSUdfUUZNVF9WMj15CitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19DSUZTPW0KK0NPTkZJR19DSUZTX1dFQUtfUFdfSEFTSD15CitDT05GSUdfQ0lGU19YQVRUUj15CitDT05GSUdfQ0lGU19QT1NJWD15CitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19OVUxMPW0KK0NPTkZJR19DUllQVE9fUENCQz1tCitDT05GSUdfQ1JZUFRPX0hNQUM9eQorQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCitDT05GSUdfQ1JZUFRPX1dQNTEyPW0KK0NPTkZJR19DUllQVE9fQU5VQklTPW0KK0NPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQorQ09ORklHX0NSWVBUT19DQVNUNT1tCitDT05GSUdfQ1JZUFRPX0NBU1Q2PW0KK0NPTkZJR19DUllQVE9fS0hBWkFEPW0KK0NPTkZJR19DUllQVE9fU0VSUEVOVD1tCitDT05GSUdfQ1JZUFRPX1RFQT1tCitDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9bQorIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhdXBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGF1cF9kZWZjb25maWcKaW5kZXggOTg2OGZjOS4uNjIzNDQ2NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGF1cF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGF1cF9kZWZjb25maWcKQEAgLTQzLDcgKzQzLDYgQEAKIENPTkZJR19JTkVUX0VTUD1tCiBDT05GSUdfSU5FVF9JUENPTVA9bQogIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotQ09ORklHX0lQVjZfUFJJVkFDWT15CiBDT05GSUdfSU5FVDZfQUg9bQogQ09ORklHX0lORVQ2X0VTUD1tCiBDT05GSUdfSU5FVDZfSVBDT01QPW0KQEAgLTU0LDcgKzUzLDYgQEAKIENPTkZJR19ERVZfQVBQTEVUQUxLPW0KIENPTkZJR19JUEREUD1tCiBDT05GSUdfSVBERFBfRU5DQVA9eQotQ09ORklHX0lQRERQX0RFQ0FQPXkKIENPTkZJR19ORVRfU0NIRUQ9eQogQ09ORklHX05FVF9TQ0hfQ0JRPW0KIENPTkZJR19ORVRfU0NIX0hUQj1tCkBAIC03OSw2ICs3Nyw3IEBACiBDT05GSUdfTkVUX0FDVF9QT0xJQ0U9eQogQ09ORklHX05FVF9DTFNfSU5EPXkKICMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQogQ09ORklHX0lERT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAyZDdmNjUwLi4wNTQzOTE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTIsMTYgKzIsMTcgQEAKIGdlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBjdXJyZW50LmgKIGdlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtdXRleC5oCiBnZW5lcmljLXkgKz0gcGFycG9ydC5oCiBnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCiBnZW5lcmljLXkgKz0gc2VjdGlvbnMuaAogZ2VuZXJpYy15ICs9IHNlZ21lbnQuaAogZ2VuZXJpYy15ICs9IHNlcmlhbC5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbS1ldmEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc20tZXZhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxYzU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc20tZXZhLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BU01fRVZBX0gKKyNkZWZpbmUgX19BU01fQVNNX0VWQV9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaWZkZWYgQ09ORklHX0VWQQorCisjZGVmaW5lIF9fQlVJTERfRVZBX0lOU04oaW5zbiwgcmVnLCBhZGRyKQkJCQlcCisJCQkJIgkuc2V0CXB1c2hcbiIJCQlcCisJCQkJIgkuc2V0CW1pcHMwXG4iCQlcCisJCQkJIgkuc2V0CWV2YVxuIgkJCVwKKwkJCQkiCSJpbnNuIiAicmVnIiwgImFkZHIgIlxuIglcCisJCQkJIgkuc2V0CXBvcFxuIgorCisjZGVmaW5lIHVzZXJfY2FjaGUob3AsIGJhc2UpCQlfX0JVSUxEX0VWQV9JTlNOKCJjYWNoZWUiLCBvcCwgYmFzZSkKKyNkZWZpbmUgdXNlcl9sbChyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJsbGUiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc2MocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigic2NlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2x3KHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oImx3ZSIsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sd2wocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigibHdsZSIsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sd3IocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigibHdyZSIsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9saChyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJsaGUiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbGIocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigibGJlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2xidShyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJsYnVlIiwgcmVnLCBhZGRyKQorLyogTm8gNjQtYml0IEVWQSBpbnN0cnVjdGlvbiBmb3IgbG9hZGluZyBkb3VibGUgd29yZHMgKi8KKyNkZWZpbmUgdXNlcl9sZChyZWcsIGFkZHIpCQl1c2VyX2x3KHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9zdyhyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKCJzd2UiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc3dsKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oInN3bGUiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc3dyKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oInN3cmUiLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc2gocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTigic2hlIiwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX3NiKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04oInNiZSIsIHJlZywgYWRkcikKKy8qIE5vIDY0LWJpdCBFVkEgaW5zdHJ1Y3Rpb24gZm9yIHN0b3JpbmcgZG91YmxlIHdvcmRzICovCisjZGVmaW5lIHVzZXJfc2QocmVnLCBhZGRyKQkJdXNlcl9zdyhyZWcsIGFkZHIpCisKKyNlbHNlCisKKyNkZWZpbmUgdXNlcl9jYWNoZShvcCwgYmFzZSkJCSJjYWNoZSAiIG9wICIsICIgYmFzZSAiXG4iCisjZGVmaW5lIHVzZXJfbGwocmVnLCBhZGRyKQkJImxsICIgcmVnICIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfc2MocmVnLCBhZGRyKQkJInNjICIgcmVnICIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfbHcocmVnLCBhZGRyKQkJImx3ICIgcmVnICIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfbHdsKHJlZywgYWRkcikJCSJsd2wgIiByZWcgIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9sd3IocmVnLCBhZGRyKQkJImx3ciAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX2xoKHJlZywgYWRkcikJCSJsaCAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX2xiKHJlZywgYWRkcikJCSJsYiAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX2xidShyZWcsIGFkZHIpCQkibGJ1ICIgcmVnICIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfc3cocmVnLCBhZGRyKQkJInN3ICIgcmVnICIsICIgYWRkciAiXG4iCisjZGVmaW5lIHVzZXJfc3dsKHJlZywgYWRkcikJCSJzd2wgIiByZWcgIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9zd3IocmVnLCBhZGRyKQkJInN3ciAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX3NoKHJlZywgYWRkcikJCSJzaCAiIHJlZyAiLCAiIGFkZHIgIlxuIgorI2RlZmluZSB1c2VyX3NiKHJlZywgYWRkcikJCSJzYiAiIHJlZyAiLCAiIGFkZHIgIlxuIgorCisjaWZkZWYgQ09ORklHXzMyQklUCisvKgorICogTm8gJ3NkJyBvciAnbGQnIGluc3RydWN0aW9ucyBpbiAzMi1iaXQgYnV0IHRoZSBjb2RlIHdpbGwKKyAqIGRvIHRoZSBjb3JyZWN0IHRoaW5nCisgKi8KKyNkZWZpbmUgdXNlcl9zZChyZWcsIGFkZHIpCQl1c2VyX3N3KHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sZChyZWcsIGFkZHIpCQl1c2VyX2x3KHJlZywgYWRkcikKKyNlbHNlCisjZGVmaW5lIHVzZXJfc2QocmVnLCBhZGRyKQkJInNkICIgcmVnIiwgIiBhZGRyICJcbiIKKyNkZWZpbmUgdXNlcl9sZChyZWcsIGFkZHIpCQkibGQgIiByZWciLCAiIGFkZHIgIlxuIgorI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLworCisjZW5kaWYgLyogQ09ORklHX0VWQSAqLworCisjZWxzZSAvKiBfX0FTU0VNQkxZX18gKi8KKworI2lmZGVmIENPTkZJR19FVkEKKworI2RlZmluZSBfX0JVSUxEX0VWQV9JTlNOKGluc24sIHJlZywgYWRkcikJCQlcCisJCQkJLnNldAlwdXNoOwkJCVwKKwkJCQkuc2V0CW1pcHMwOwkJCVwKKwkJCQkuc2V0CWV2YTsJCQlcCisJCQkJaW5zbiByZWcsIGFkZHI7CQkJXAorCQkJCS5zZXQJcG9wOworCisjZGVmaW5lIHVzZXJfY2FjaGUob3AsIGJhc2UpCQlfX0JVSUxEX0VWQV9JTlNOKGNhY2hlZSwgb3AsIGJhc2UpCisjZGVmaW5lIHVzZXJfbGwocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihsbGUsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9zYyhyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKHNjZSwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2x3KHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04obHdlLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbHdsKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04obHdsZSwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2x3cihyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKGx3cmUsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9saChyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKGxoZSwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX2xiKHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04obGJlLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfbGJ1KHJlZywgYWRkcikJCV9fQlVJTERfRVZBX0lOU04obGJ1ZSwgcmVnLCBhZGRyKQorLyogTm8gNjQtYml0IEVWQSBpbnN0cnVjdGlvbiBmb3IgbG9hZGluZyBkb3VibGUgd29yZHMgKi8KKyNkZWZpbmUgdXNlcl9sZChyZWcsIGFkZHIpCQl1c2VyX2x3KHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9zdyhyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKHN3ZSwgcmVnLCBhZGRyKQorI2RlZmluZSB1c2VyX3N3bChyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKHN3bGUsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9zd3IocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihzd3JlLCByZWcsIGFkZHIpCisjZGVmaW5lIHVzZXJfc2gocmVnLCBhZGRyKQkJX19CVUlMRF9FVkFfSU5TTihzaGUsIHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9zYihyZWcsIGFkZHIpCQlfX0JVSUxEX0VWQV9JTlNOKHNiZSwgcmVnLCBhZGRyKQorLyogTm8gNjQtYml0IEVWQSBpbnN0cnVjdGlvbiBmb3IgbG9hZGluZyBkb3VibGUgd29yZHMgKi8KKyNkZWZpbmUgdXNlcl9zZChyZWcsIGFkZHIpCQl1c2VyX3N3KHJlZywgYWRkcikKKyNlbHNlCisKKyNkZWZpbmUgdXNlcl9jYWNoZShvcCwgYmFzZSkJCWNhY2hlIG9wLCBiYXNlCisjZGVmaW5lIHVzZXJfbGwocmVnLCBhZGRyKQkJbGwgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfc2MocmVnLCBhZGRyKQkJc2MgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfbHcocmVnLCBhZGRyKQkJbHcgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfbHdsKHJlZywgYWRkcikJCWx3bCByZWcsIGFkZHIKKyNkZWZpbmUgdXNlcl9sd3IocmVnLCBhZGRyKQkJbHdyIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX2xoKHJlZywgYWRkcikJCWxoIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX2xiKHJlZywgYWRkcikJCWxiIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX2xidShyZWcsIGFkZHIpCQlsYnUgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfc3cocmVnLCBhZGRyKQkJc3cgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfc3dsKHJlZywgYWRkcikJCXN3bCByZWcsIGFkZHIKKyNkZWZpbmUgdXNlcl9zd3IocmVnLCBhZGRyKQkJc3dyIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX3NoKHJlZywgYWRkcikJCXNoIHJlZywgYWRkcgorI2RlZmluZSB1c2VyX3NiKHJlZywgYWRkcikJCXNiIHJlZywgYWRkcgorCisjaWZkZWYgQ09ORklHXzMyQklUCisvKgorICogTm8gJ3NkJyBvciAnbGQnIGluc3RydWN0aW9ucyBpbiAzMi1iaXQgYnV0IHRoZSBjb2RlIHdpbGwKKyAqIGRvIHRoZSBjb3JyZWN0IHRoaW5nCisgKi8KKyNkZWZpbmUgdXNlcl9zZChyZWcsIGFkZHIpCQl1c2VyX3N3KHJlZywgYWRkcikKKyNkZWZpbmUgdXNlcl9sZChyZWcsIGFkZHIpCQl1c2VyX2x3KHJlZywgYWRkcikKKyNlbHNlCisjZGVmaW5lIHVzZXJfc2QocmVnLCBhZGRyKQkJc2QgcmVnLCBhZGRyCisjZGVmaW5lIHVzZXJfbGQocmVnLCBhZGRyKQkJbGQgcmVnLCBhZGRyCisjZW5kaWYgLyogQ09ORklHXzMyQklUICovCisKKyNlbmRpZiAvKiBDT05GSUdfRVZBICovCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9fQVNNX0FTTV9FVkFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbS5oCmluZGV4IDg3OTY5MWQuLjdjMjZiMjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc20uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgX19BU01fQVNNX0gKIAogI2luY2x1ZGUgPGFzbS9zZ2lkZWZzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1ldmEuaD4KIAogI2lmbmRlZiBDQVQKICNpZmRlZiBfX1NURENfXwpAQCAtMTQ1LDE5ICsxNDYsMjcgQEAKIAogI2RlZmluZSBQUkVGKGhpbnQsYWRkcikJCQkJCVwKIAkJLnNldAlwdXNoOwkJCQlcCi0JCS5zZXQJbWlwczQ7CQkJCVwKKwkJLnNldAlhcmNoPXI1MDAwOwkJCVwKIAkJcHJlZgloaW50LCBhZGRyOwkJCVwKIAkJLnNldAlwb3AKIAorI2RlZmluZSBQUkVGRShoaW50LCBhZGRyKQkJCQlcCisJCS5zZXQJcHVzaDsJCQkJXAorCQkuc2V0CW1pcHMwOwkJCQlcCisJCS5zZXQJZXZhOwkJCQlcCisJCXByZWZlCWhpbnQsIGFkZHI7CQkJXAorCQkuc2V0CXBvcAorCiAjZGVmaW5lIFBSRUZYKGhpbnQsYWRkcikJCQkJXAogCQkuc2V0CXB1c2g7CQkJCVwKLQkJLnNldAltaXBzNDsJCQkJXAorCQkuc2V0CWFyY2g9cjUwMDA7CQkJXAogCQlwcmVmeAloaW50LCBhZGRyOwkJCVwKIAkJLnNldAlwb3AKIAogI2Vsc2UgLyogIUNPTkZJR19DUFVfSEFTX1BSRUZFVENIICovCiAKICNkZWZpbmUgUFJFRihoaW50LCBhZGRyKQorI2RlZmluZSBQUkVGRShoaW50LCBhZGRyKQogI2RlZmluZSBQUkVGWChoaW50LCBhZGRyKQogCiAjZW5kaWYgLyogIUNPTkZJR19DUFVfSEFTX1BSRUZFVENIICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby0zMi5oCmluZGV4IDcwZTFmMTcuLmUzOGMyODEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby0zMi5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby0zMi5oCkBAIC0xNCw3NSArMTQsNzUgQEAKIAogCS5tYWNybwlmcHVfc2F2ZV9zaW5nbGUgdGhyZWFkIHRtcD10MAogCWNmYzEJXHRtcCwgIGZjcjMxCi0Jc3djMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQotCXN3YzEJJGYxLCAgVEhSRUFEX0ZQUjEoXHRocmVhZCkKLQlzd2MxCSRmMiwgIFRIUkVBRF9GUFIyKFx0aHJlYWQpCi0Jc3djMQkkZjMsICBUSFJFQURfRlBSMyhcdGhyZWFkKQotCXN3YzEJJGY0LCAgVEhSRUFEX0ZQUjQoXHRocmVhZCkKLQlzd2MxCSRmNSwgIFRIUkVBRF9GUFI1KFx0aHJlYWQpCi0Jc3djMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQotCXN3YzEJJGY3LCAgVEhSRUFEX0ZQUjcoXHRocmVhZCkKLQlzd2MxCSRmOCwgIFRIUkVBRF9GUFI4KFx0aHJlYWQpCi0Jc3djMQkkZjksICBUSFJFQURfRlBSOShcdGhyZWFkKQotCXN3YzEJJGYxMCwgVEhSRUFEX0ZQUjEwKFx0aHJlYWQpCi0Jc3djMQkkZjExLCBUSFJFQURfRlBSMTEoXHRocmVhZCkKLQlzd2MxCSRmMTIsIFRIUkVBRF9GUFIxMihcdGhyZWFkKQotCXN3YzEJJGYxMywgVEhSRUFEX0ZQUjEzKFx0aHJlYWQpCi0Jc3djMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKLQlzd2MxCSRmMTUsIFRIUkVBRF9GUFIxNShcdGhyZWFkKQotCXN3YzEJJGYxNiwgVEhSRUFEX0ZQUjE2KFx0aHJlYWQpCi0Jc3djMQkkZjE3LCBUSFJFQURfRlBSMTcoXHRocmVhZCkKLQlzd2MxCSRmMTgsIFRIUkVBRF9GUFIxOChcdGhyZWFkKQotCXN3YzEJJGYxOSwgVEhSRUFEX0ZQUjE5KFx0aHJlYWQpCi0Jc3djMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKLQlzd2MxCSRmMjEsIFRIUkVBRF9GUFIyMShcdGhyZWFkKQotCXN3YzEJJGYyMiwgVEhSRUFEX0ZQUjIyKFx0aHJlYWQpCi0Jc3djMQkkZjIzLCBUSFJFQURfRlBSMjMoXHRocmVhZCkKLQlzd2MxCSRmMjQsIFRIUkVBRF9GUFIyNChcdGhyZWFkKQotCXN3YzEJJGYyNSwgVEhSRUFEX0ZQUjI1KFx0aHJlYWQpCi0Jc3djMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKLQlzd2MxCSRmMjcsIFRIUkVBRF9GUFIyNyhcdGhyZWFkKQotCXN3YzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCi0Jc3djMQkkZjI5LCBUSFJFQURfRlBSMjkoXHRocmVhZCkKLQlzd2MxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQotCXN3YzEJJGYzMSwgVEhSRUFEX0ZQUjMxKFx0aHJlYWQpCisJc3djMQkkZjAsICBUSFJFQURfRlBSMF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjEsICBUSFJFQURfRlBSMV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjIsICBUSFJFQURfRlBSMl9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjMsICBUSFJFQURfRlBSM19MUzY0KFx0aHJlYWQpCisJc3djMQkkZjQsICBUSFJFQURfRlBSNF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjUsICBUSFJFQURfRlBSNV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjYsICBUSFJFQURfRlBSNl9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjcsICBUSFJFQURfRlBSN19MUzY0KFx0aHJlYWQpCisJc3djMQkkZjgsICBUSFJFQURfRlBSOF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjksICBUSFJFQURfRlBSOV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjEwLCBUSFJFQURfRlBSMTBfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxMSwgVEhSRUFEX0ZQUjExX0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMTIsIFRIUkVBRF9GUFIxMl9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjEzLCBUSFJFQURfRlBSMTNfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxNCwgVEhSRUFEX0ZQUjE0X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMTUsIFRIUkVBRF9GUFIxNV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjE2LCBUSFJFQURfRlBSMTZfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYxNywgVEhSRUFEX0ZQUjE3X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMTgsIFRIUkVBRF9GUFIxOF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjE5LCBUSFJFQURfRlBSMTlfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyMCwgVEhSRUFEX0ZQUjIwX0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMjEsIFRIUkVBRF9GUFIyMV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjIyLCBUSFJFQURfRlBSMjJfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyMywgVEhSRUFEX0ZQUjIzX0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMjQsIFRIUkVBRF9GUFIyNF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjI1LCBUSFJFQURfRlBSMjVfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyNiwgVEhSRUFEX0ZQUjI2X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMjcsIFRIUkVBRF9GUFIyN19MUzY0KFx0aHJlYWQpCisJc3djMQkkZjI4LCBUSFJFQURfRlBSMjhfTFM2NChcdGhyZWFkKQorCXN3YzEJJGYyOSwgVEhSRUFEX0ZQUjI5X0xTNjQoXHRocmVhZCkKKwlzd2MxCSRmMzAsIFRIUkVBRF9GUFIzMF9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjMxLCBUSFJFQURfRlBSMzFfTFM2NChcdGhyZWFkKQogCXN3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQogCS5lbmRtCiAKIAkubWFjcm8JZnB1X3Jlc3RvcmVfc2luZ2xlIHRocmVhZCB0bXA9dDAKIAlsdwlcdG1wLCBUSFJFQURfRkNSMzEoXHRocmVhZCkKLQlsd2MxCSRmMCwgIFRIUkVBRF9GUFIwKFx0aHJlYWQpCi0JbHdjMQkkZjEsICBUSFJFQURfRlBSMShcdGhyZWFkKQotCWx3YzEJJGYyLCAgVEhSRUFEX0ZQUjIoXHRocmVhZCkKLQlsd2MxCSRmMywgIFRIUkVBRF9GUFIzKFx0aHJlYWQpCi0JbHdjMQkkZjQsICBUSFJFQURfRlBSNChcdGhyZWFkKQotCWx3YzEJJGY1LCAgVEhSRUFEX0ZQUjUoXHRocmVhZCkKLQlsd2MxCSRmNiwgIFRIUkVBRF9GUFI2KFx0aHJlYWQpCi0JbHdjMQkkZjcsICBUSFJFQURfRlBSNyhcdGhyZWFkKQotCWx3YzEJJGY4LCAgVEhSRUFEX0ZQUjgoXHRocmVhZCkKLQlsd2MxCSRmOSwgIFRIUkVBRF9GUFI5KFx0aHJlYWQpCi0JbHdjMQkkZjEwLCBUSFJFQURfRlBSMTAoXHRocmVhZCkKLQlsd2MxCSRmMTEsIFRIUkVBRF9GUFIxMShcdGhyZWFkKQotCWx3YzEJJGYxMiwgVEhSRUFEX0ZQUjEyKFx0aHJlYWQpCi0JbHdjMQkkZjEzLCBUSFJFQURfRlBSMTMoXHRocmVhZCkKLQlsd2MxCSRmMTQsIFRIUkVBRF9GUFIxNChcdGhyZWFkKQotCWx3YzEJJGYxNSwgVEhSRUFEX0ZQUjE1KFx0aHJlYWQpCi0JbHdjMQkkZjE2LCBUSFJFQURfRlBSMTYoXHRocmVhZCkKLQlsd2MxCSRmMTcsIFRIUkVBRF9GUFIxNyhcdGhyZWFkKQotCWx3YzEJJGYxOCwgVEhSRUFEX0ZQUjE4KFx0aHJlYWQpCi0JbHdjMQkkZjE5LCBUSFJFQURfRlBSMTkoXHRocmVhZCkKLQlsd2MxCSRmMjAsIFRIUkVBRF9GUFIyMChcdGhyZWFkKQotCWx3YzEJJGYyMSwgVEhSRUFEX0ZQUjIxKFx0aHJlYWQpCi0JbHdjMQkkZjIyLCBUSFJFQURfRlBSMjIoXHRocmVhZCkKLQlsd2MxCSRmMjMsIFRIUkVBRF9GUFIyMyhcdGhyZWFkKQotCWx3YzEJJGYyNCwgVEhSRUFEX0ZQUjI0KFx0aHJlYWQpCi0JbHdjMQkkZjI1LCBUSFJFQURfRlBSMjUoXHRocmVhZCkKLQlsd2MxCSRmMjYsIFRIUkVBRF9GUFIyNihcdGhyZWFkKQotCWx3YzEJJGYyNywgVEhSRUFEX0ZQUjI3KFx0aHJlYWQpCi0JbHdjMQkkZjI4LCBUSFJFQURfRlBSMjgoXHRocmVhZCkKLQlsd2MxCSRmMjksIFRIUkVBRF9GUFIyOShcdGhyZWFkKQotCWx3YzEJJGYzMCwgVEhSRUFEX0ZQUjMwKFx0aHJlYWQpCi0JbHdjMQkkZjMxLCBUSFJFQURfRlBSMzEoXHRocmVhZCkKKwlsd2MxCSRmMCwgIFRIUkVBRF9GUFIwX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMSwgIFRIUkVBRF9GUFIxX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMiwgIFRIUkVBRF9GUFIyX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMywgIFRIUkVBRF9GUFIzX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmNCwgIFRIUkVBRF9GUFI0X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmNSwgIFRIUkVBRF9GUFI1X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmNiwgIFRIUkVBRF9GUFI2X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmNywgIFRIUkVBRF9GUFI3X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmOCwgIFRIUkVBRF9GUFI4X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmOSwgIFRIUkVBRF9GUFI5X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMTAsIFRIUkVBRF9GUFIxMF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjExLCBUSFJFQURfRlBSMTFfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYxMiwgVEhSRUFEX0ZQUjEyX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMTMsIFRIUkVBRF9GUFIxM19MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjE0LCBUSFJFQURfRlBSMTRfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYxNSwgVEhSRUFEX0ZQUjE1X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMTYsIFRIUkVBRF9GUFIxNl9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjE3LCBUSFJFQURfRlBSMTdfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYxOCwgVEhSRUFEX0ZQUjE4X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMTksIFRIUkVBRF9GUFIxOV9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjIwLCBUSFJFQURfRlBSMjBfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYyMSwgVEhSRUFEX0ZQUjIxX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMjIsIFRIUkVBRF9GUFIyMl9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjIzLCBUSFJFQURfRlBSMjNfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYyNCwgVEhSRUFEX0ZQUjI0X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMjUsIFRIUkVBRF9GUFIyNV9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjI2LCBUSFJFQURfRlBSMjZfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYyNywgVEhSRUFEX0ZQUjI3X0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMjgsIFRIUkVBRF9GUFIyOF9MUzY0KFx0aHJlYWQpCisJbHdjMQkkZjI5LCBUSFJFQURfRlBSMjlfTFM2NChcdGhyZWFkKQorCWx3YzEJJGYzMCwgVEhSRUFEX0ZQUjMwX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMzEsIFRIUkVBRF9GUFIzMV9MUzY0KFx0aHJlYWQpCiAJY3RjMQlcdG1wLCBmY3IzMQogCS5lbmRtCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKaW5kZXggMzIyMGM5My4uYjQ2NGI4YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKQEAgLTksNiArOSw3IEBACiAjZGVmaW5lIF9BU01fQVNNTUFDUk9fSAogCiAjaW5jbHVkZSA8YXNtL2hhemFyZHMuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2lmZGVmIENPTkZJR18zMkJJVAogI2luY2x1ZGUgPGFzbS9hc21tYWNyby0zMi5oPgpAQCAtNTQsNTkgKzU1LDY5IEBACiAJLmVuZG0KIAogCS5tYWNybwlsb2NhbF9pcnFfZGlzYWJsZSByZWc9dDAKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCWx3ICAgICAgXHJlZywgVElfUFJFX0NPVU5UKCQyOCkKKwlhZGRpICAgIFxyZWcsIFxyZWcsIDEKKwlzdyAgICAgIFxyZWcsIFRJX1BSRV9DT1VOVCgkMjgpCisjZW5kaWYKIAltZmMwCVxyZWcsIENQMF9TVEFUVVMKIAlvcmkJXHJlZywgXHJlZywgMQogCXhvcmkJXHJlZywgXHJlZywgMQogCW10YzAJXHJlZywgQ1AwX1NUQVRVUwogCWlycV9kaXNhYmxlX2hhemFyZAorI2lmZGVmIENPTkZJR19QUkVFTVBUCisJbHcgICAgICBccmVnLCBUSV9QUkVfQ09VTlQoJDI4KQorCWFkZGkgICAgXHJlZywgXHJlZywgLTEKKwlzdyAgICAgIFxyZWcsIFRJX1BSRV9DT1VOVCgkMjgpCisjZW5kaWYKIAkuZW5kbQogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAogCS5tYWNybwlmcHVfc2F2ZV8xNmV2ZW4gdGhyZWFkIHRtcD10MAogCWNmYzEJXHRtcCwgZmNyMzEKLQlzZGMxCSRmMCwgIFRIUkVBRF9GUFIwKFx0aHJlYWQpCi0Jc2RjMQkkZjIsICBUSFJFQURfRlBSMihcdGhyZWFkKQotCXNkYzEJJGY0LCAgVEhSRUFEX0ZQUjQoXHRocmVhZCkKLQlzZGMxCSRmNiwgIFRIUkVBRF9GUFI2KFx0aHJlYWQpCi0Jc2RjMQkkZjgsICBUSFJFQURfRlBSOChcdGhyZWFkKQotCXNkYzEJJGYxMCwgVEhSRUFEX0ZQUjEwKFx0aHJlYWQpCi0Jc2RjMQkkZjEyLCBUSFJFQURfRlBSMTIoXHRocmVhZCkKLQlzZGMxCSRmMTQsIFRIUkVBRF9GUFIxNChcdGhyZWFkKQotCXNkYzEJJGYxNiwgVEhSRUFEX0ZQUjE2KFx0aHJlYWQpCi0Jc2RjMQkkZjE4LCBUSFJFQURfRlBSMTgoXHRocmVhZCkKLQlzZGMxCSRmMjAsIFRIUkVBRF9GUFIyMChcdGhyZWFkKQotCXNkYzEJJGYyMiwgVEhSRUFEX0ZQUjIyKFx0aHJlYWQpCi0Jc2RjMQkkZjI0LCBUSFJFQURfRlBSMjQoXHRocmVhZCkKLQlzZGMxCSRmMjYsIFRIUkVBRF9GUFIyNihcdGhyZWFkKQotCXNkYzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCi0Jc2RjMQkkZjMwLCBUSFJFQURfRlBSMzAoXHRocmVhZCkKKwlzZGMxCSRmMCwgIFRIUkVBRF9GUFIwX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMiwgIFRIUkVBRF9GUFIyX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmNCwgIFRIUkVBRF9GUFI0X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmNiwgIFRIUkVBRF9GUFI2X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmOCwgIFRIUkVBRF9GUFI4X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMTAsIFRIUkVBRF9GUFIxMF9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjEyLCBUSFJFQURfRlBSMTJfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYxNCwgVEhSRUFEX0ZQUjE0X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMTYsIFRIUkVBRF9GUFIxNl9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjE4LCBUSFJFQURfRlBSMThfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYyMCwgVEhSRUFEX0ZQUjIwX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMjIsIFRIUkVBRF9GUFIyMl9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjI0LCBUSFJFQURfRlBSMjRfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYyNiwgVEhSRUFEX0ZQUjI2X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMjgsIFRIUkVBRF9GUFIyOF9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjMwLCBUSFJFQURfRlBSMzBfTFM2NChcdGhyZWFkKQogCXN3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQogCS5lbmRtCiAKIAkubWFjcm8JZnB1X3NhdmVfMTZvZGQgdGhyZWFkCiAJLnNldAlwdXNoCiAJLnNldAltaXBzNjRyMgotCXNkYzEJJGYxLCAgVEhSRUFEX0ZQUjEoXHRocmVhZCkKLQlzZGMxCSRmMywgIFRIUkVBRF9GUFIzKFx0aHJlYWQpCi0Jc2RjMQkkZjUsICBUSFJFQURfRlBSNShcdGhyZWFkKQotCXNkYzEJJGY3LCAgVEhSRUFEX0ZQUjcoXHRocmVhZCkKLQlzZGMxCSRmOSwgIFRIUkVBRF9GUFI5KFx0aHJlYWQpCi0Jc2RjMQkkZjExLCBUSFJFQURfRlBSMTEoXHRocmVhZCkKLQlzZGMxCSRmMTMsIFRIUkVBRF9GUFIxMyhcdGhyZWFkKQotCXNkYzEJJGYxNSwgVEhSRUFEX0ZQUjE1KFx0aHJlYWQpCi0Jc2RjMQkkZjE3LCBUSFJFQURfRlBSMTcoXHRocmVhZCkKLQlzZGMxCSRmMTksIFRIUkVBRF9GUFIxOShcdGhyZWFkKQotCXNkYzEJJGYyMSwgVEhSRUFEX0ZQUjIxKFx0aHJlYWQpCi0Jc2RjMQkkZjIzLCBUSFJFQURfRlBSMjMoXHRocmVhZCkKLQlzZGMxCSRmMjUsIFRIUkVBRF9GUFIyNShcdGhyZWFkKQotCXNkYzEJJGYyNywgVEhSRUFEX0ZQUjI3KFx0aHJlYWQpCi0Jc2RjMQkkZjI5LCBUSFJFQURfRlBSMjkoXHRocmVhZCkKLQlzZGMxCSRmMzEsIFRIUkVBRF9GUFIzMShcdGhyZWFkKQorCXNkYzEJJGYxLCAgVEhSRUFEX0ZQUjFfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYzLCAgVEhSRUFEX0ZQUjNfTFM2NChcdGhyZWFkKQorCXNkYzEJJGY1LCAgVEhSRUFEX0ZQUjVfTFM2NChcdGhyZWFkKQorCXNkYzEJJGY3LCAgVEhSRUFEX0ZQUjdfTFM2NChcdGhyZWFkKQorCXNkYzEJJGY5LCAgVEhSRUFEX0ZQUjlfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYxMSwgVEhSRUFEX0ZQUjExX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMTMsIFRIUkVBRF9GUFIxM19MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjE1LCBUSFJFQURfRlBSMTVfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYxNywgVEhSRUFEX0ZQUjE3X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMTksIFRIUkVBRF9GUFIxOV9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjIxLCBUSFJFQURfRlBSMjFfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYyMywgVEhSRUFEX0ZQUjIzX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMjUsIFRIUkVBRF9GUFIyNV9MUzY0KFx0aHJlYWQpCisJc2RjMQkkZjI3LCBUSFJFQURfRlBSMjdfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYyOSwgVEhSRUFEX0ZQUjI5X0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMzEsIFRIUkVBRF9GUFIzMV9MUzY0KFx0aHJlYWQpCiAJLnNldAlwb3AKIAkuZW5kbQogCiAJLm1hY3JvCWZwdV9zYXZlX2RvdWJsZSB0aHJlYWQgc3RhdHVzIHRtcAotI2lmIGRlZmluZWQoQ09ORklHX01JUFM2NCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikKIAlzbGwJXHRtcCwgXHN0YXR1cywgNQogCWJnZXoJXHRtcCwgMTBmCiAJZnB1X3NhdmVfMTZvZGQgXHRocmVhZApAQCAtMTE3LDQ5ICsxMjgsNDkgQEAKIAogCS5tYWNybwlmcHVfcmVzdG9yZV8xNmV2ZW4gdGhyZWFkIHRtcD10MAogCWx3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQotCWxkYzEJJGYwLCAgVEhSRUFEX0ZQUjAoXHRocmVhZCkKLQlsZGMxCSRmMiwgIFRIUkVBRF9GUFIyKFx0aHJlYWQpCi0JbGRjMQkkZjQsICBUSFJFQURfRlBSNChcdGhyZWFkKQotCWxkYzEJJGY2LCAgVEhSRUFEX0ZQUjYoXHRocmVhZCkKLQlsZGMxCSRmOCwgIFRIUkVBRF9GUFI4KFx0aHJlYWQpCi0JbGRjMQkkZjEwLCBUSFJFQURfRlBSMTAoXHRocmVhZCkKLQlsZGMxCSRmMTIsIFRIUkVBRF9GUFIxMihcdGhyZWFkKQotCWxkYzEJJGYxNCwgVEhSRUFEX0ZQUjE0KFx0aHJlYWQpCi0JbGRjMQkkZjE2LCBUSFJFQURfRlBSMTYoXHRocmVhZCkKLQlsZGMxCSRmMTgsIFRIUkVBRF9GUFIxOChcdGhyZWFkKQotCWxkYzEJJGYyMCwgVEhSRUFEX0ZQUjIwKFx0aHJlYWQpCi0JbGRjMQkkZjIyLCBUSFJFQURfRlBSMjIoXHRocmVhZCkKLQlsZGMxCSRmMjQsIFRIUkVBRF9GUFIyNChcdGhyZWFkKQotCWxkYzEJJGYyNiwgVEhSRUFEX0ZQUjI2KFx0aHJlYWQpCi0JbGRjMQkkZjI4LCBUSFJFQURfRlBSMjgoXHRocmVhZCkKLQlsZGMxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQorCWxkYzEJJGYwLCAgVEhSRUFEX0ZQUjBfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyLCAgVEhSRUFEX0ZQUjJfTFM2NChcdGhyZWFkKQorCWxkYzEJJGY0LCAgVEhSRUFEX0ZQUjRfTFM2NChcdGhyZWFkKQorCWxkYzEJJGY2LCAgVEhSRUFEX0ZQUjZfTFM2NChcdGhyZWFkKQorCWxkYzEJJGY4LCAgVEhSRUFEX0ZQUjhfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYxMCwgVEhSRUFEX0ZQUjEwX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTIsIFRIUkVBRF9GUFIxMl9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjE0LCBUSFJFQURfRlBSMTRfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYxNiwgVEhSRUFEX0ZQUjE2X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTgsIFRIUkVBRF9GUFIxOF9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjIwLCBUSFJFQURfRlBSMjBfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyMiwgVEhSRUFEX0ZQUjIyX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMjQsIFRIUkVBRF9GUFIyNF9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjI2LCBUSFJFQURfRlBSMjZfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyOCwgVEhSRUFEX0ZQUjI4X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMzAsIFRIUkVBRF9GUFIzMF9MUzY0KFx0aHJlYWQpCiAJY3RjMQlcdG1wLCBmY3IzMQogCS5lbmRtCiAKIAkubWFjcm8JZnB1X3Jlc3RvcmVfMTZvZGQgdGhyZWFkCiAJLnNldAlwdXNoCiAJLnNldAltaXBzNjRyMgotCWxkYzEJJGYxLCAgVEhSRUFEX0ZQUjEoXHRocmVhZCkKLQlsZGMxCSRmMywgIFRIUkVBRF9GUFIzKFx0aHJlYWQpCi0JbGRjMQkkZjUsICBUSFJFQURfRlBSNShcdGhyZWFkKQotCWxkYzEJJGY3LCAgVEhSRUFEX0ZQUjcoXHRocmVhZCkKLQlsZGMxCSRmOSwgIFRIUkVBRF9GUFI5KFx0aHJlYWQpCi0JbGRjMQkkZjExLCBUSFJFQURfRlBSMTEoXHRocmVhZCkKLQlsZGMxCSRmMTMsIFRIUkVBRF9GUFIxMyhcdGhyZWFkKQotCWxkYzEJJGYxNSwgVEhSRUFEX0ZQUjE1KFx0aHJlYWQpCi0JbGRjMQkkZjE3LCBUSFJFQURfRlBSMTcoXHRocmVhZCkKLQlsZGMxCSRmMTksIFRIUkVBRF9GUFIxOShcdGhyZWFkKQotCWxkYzEJJGYyMSwgVEhSRUFEX0ZQUjIxKFx0aHJlYWQpCi0JbGRjMQkkZjIzLCBUSFJFQURfRlBSMjMoXHRocmVhZCkKLQlsZGMxCSRmMjUsIFRIUkVBRF9GUFIyNShcdGhyZWFkKQotCWxkYzEJJGYyNywgVEhSRUFEX0ZQUjI3KFx0aHJlYWQpCi0JbGRjMQkkZjI5LCBUSFJFQURfRlBSMjkoXHRocmVhZCkKLQlsZGMxCSRmMzEsIFRIUkVBRF9GUFIzMShcdGhyZWFkKQorCWxkYzEJJGYxLCAgVEhSRUFEX0ZQUjFfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYzLCAgVEhSRUFEX0ZQUjNfTFM2NChcdGhyZWFkKQorCWxkYzEJJGY1LCAgVEhSRUFEX0ZQUjVfTFM2NChcdGhyZWFkKQorCWxkYzEJJGY3LCAgVEhSRUFEX0ZQUjdfTFM2NChcdGhyZWFkKQorCWxkYzEJJGY5LCAgVEhSRUFEX0ZQUjlfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYxMSwgVEhSRUFEX0ZQUjExX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTMsIFRIUkVBRF9GUFIxM19MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjE1LCBUSFJFQURfRlBSMTVfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYxNywgVEhSRUFEX0ZQUjE3X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMTksIFRIUkVBRF9GUFIxOV9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjIxLCBUSFJFQURfRlBSMjFfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyMywgVEhSRUFEX0ZQUjIzX0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMjUsIFRIUkVBRF9GUFIyNV9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjI3LCBUSFJFQURfRlBSMjdfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYyOSwgVEhSRUFEX0ZQUjI5X0xTNjQoXHRocmVhZCkKKwlsZGMxCSRmMzEsIFRIUkVBRF9GUFIzMV9MUzY0KFx0aHJlYWQpCiAJLnNldAlwb3AKIAkuZW5kbQogCiAJLm1hY3JvCWZwdV9yZXN0b3JlX2RvdWJsZSB0aHJlYWQgc3RhdHVzIHRtcAotI2lmIGRlZmluZWQoQ09ORklHX01JUFM2NCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMikKIAlzbGwJXHRtcCwgXHN0YXR1cywgNQogCWJnZXoJXHRtcCwgMTBmCQkJCSMgMTYgcmVnaXN0ZXIgbW9kZT8KIApAQCAtMTY5LDYgKzE4MCwxNyBAQAogCWZwdV9yZXN0b3JlXzE2ZXZlbiBcdGhyZWFkIFx0bXAKIAkuZW5kbQogCisjaWZkZWYgQ09ORklHX0NQVV9NSVBTUjIKKwkubWFjcm8JX0VYVAlyZCwgcnMsIHAsIHMKKwlleHQJXHJkLCBccnMsIFxwLCBccworCS5lbmRtCisjZWxzZSAvKiAhQ09ORklHX0NQVV9NSVBTUjIgKi8KKwkubWFjcm8JX0VYVAlyZCwgcnMsIHAsIHMKKwlzcmwJXHJkLCBccnMsIFxwCisJYW5kaQlccmQsIFxyZCwgKDEgPDwgXHMpIC0gMQorCS5lbmRtCisjZW5kaWYgLyogIUNPTkZJR19DUFVfTUlQU1IyICovCisKIC8qCiAgKiBUZW1wb3JhcnkgdW50aWwgYWxsIGdhcyBoYXZlIE1UIEFTRSBzdXBwb3J0CiAgKi8KQEAgLTE5Niw0ICsyMTgsMTk1IEBACiAJIC53b3JkCTB4NDE4MDAwMDAgfCAoXHJ0IDw8IDE2KSB8IChccmQgPDwgMTEpIHwgKFx1IDw8IDUpIHwgKFxzZWwpCiAJLmVuZG0KIAorI2lmZGVmIFRPT0xDSEFJTl9TVVBQT1JUU19NU0EKKwkubWFjcm8JbGRfZAl3ZCwgb2ZmLCBiYXNlCisJLnNldAlwdXNoCisJLnNldAltaXBzMzJyMgorCS5zZXQJbXNhCisJbGQuZAkkd1x3ZCwgXG9mZihcYmFzZSkKKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8Jc3RfZAl3ZCwgb2ZmLCBiYXNlCisJLnNldAlwdXNoCisJLnNldAltaXBzMzJyMgorCS5zZXQJbXNhCisJc3QuZAkkd1x3ZCwgXG9mZihcYmFzZSkKKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8JY29weV91X3cJcmQsIHdzLCBuCisJLnNldAlwdXNoCisJLnNldAltaXBzMzJyMgorCS5zZXQJbXNhCisJY29weV91LncgXHJkLCAkd1x3c1tcbl0KKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8JY29weV91X2QJcmQsIHdzLCBuCisJLnNldAlwdXNoCisJLnNldAltaXBzNjRyMgorCS5zZXQJbXNhCisJY29weV91LmQgXHJkLCAkd1x3c1tcbl0KKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8JaW5zZXJ0X3cJd2QsIG4sIHJzCisJLnNldAlwdXNoCisJLnNldAltaXBzMzJyMgorCS5zZXQJbXNhCisJaW5zZXJ0LncgJHdcd2RbXG5dLCBccnMKKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8JaW5zZXJ0X2QJd2QsIG4sIHJzCisJLnNldAlwdXNoCisJLnNldAltaXBzNjRyMgorCS5zZXQJbXNhCisJaW5zZXJ0LmQgJHdcd2RbXG5dLCBccnMKKwkuc2V0CXBvcAorCS5lbmRtCisjZWxzZQorCS8qCisJICogVGVtcG9yYXJ5IHVudGlsIGFsbCB0b29sY2hhaW5zIGluIHVzZSBpbmNsdWRlIE1TQSBzdXBwb3J0LgorCSAqLworCS5tYWNybwljZmNtc2EJcmQsIGNzCisJLnNldAlwdXNoCisJLnNldAlub2F0CisJLndvcmQJMHg3ODdlMDA1OSB8IChcY3MgPDwgMTEpCisJbW92ZQlccmQsICQxCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWN0Y21zYQljZCwgcnMKKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKwltb3ZlCSQxLCBccnMKKwkud29yZAkweDc4M2UwODE5IHwgKFxjZCA8PCA2KQorCS5zZXQJcG9wCisJLmVuZG0KKworCS5tYWNybwlsZF9kCXdkLCBvZmYsIGJhc2UKKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKwlhZGQJJDEsIFxiYXNlLCBcb2ZmCisJLndvcmQJMHg3ODAwMDgyMyB8IChcd2QgPDwgNikKKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8Jc3RfZAl3ZCwgb2ZmLCBiYXNlCisJLnNldAlwdXNoCisJLnNldAlub2F0CisJYWRkCSQxLCBcYmFzZSwgXG9mZgorCS53b3JkCTB4NzgwMDA4MjcgfCAoXHdkIDw8IDYpCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWNvcHlfdV93CXJkLCB3cywgbgorCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCS53b3JkCTB4NzhmMDAwNTkgfCAoXG4gPDwgMTYpIHwgKFx3cyA8PCAxMSkKKwkvKiBtb3ZlIHRyaWdnZXJzIGFuIGFzc2VtYmxlciBidWcuLi4gKi8KKwlvcglccmQsICQxLCB6ZXJvCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWNvcHlfdV9kCXJkLCB3cywgbgorCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCS53b3JkCTB4NzhmODAwNTkgfCAoXG4gPDwgMTYpIHwgKFx3cyA8PCAxMSkKKwkvKiBtb3ZlIHRyaWdnZXJzIGFuIGFzc2VtYmxlciBidWcuLi4gKi8KKwlvcglccmQsICQxLCB6ZXJvCisJLnNldAlwb3AKKwkuZW5kbQorCisJLm1hY3JvCWluc2VydF93CXdkLCBuLCBycworCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCS8qIG1vdmUgdHJpZ2dlcnMgYW4gYXNzZW1ibGVyIGJ1Zy4uLiAqLworCW9yCSQxLCBccnMsIHplcm8KKwkud29yZAkweDc5MzAwODE5IHwgKFxuIDw8IDE2KSB8IChcd2QgPDwgNikKKwkuc2V0CXBvcAorCS5lbmRtCisKKwkubWFjcm8JaW5zZXJ0X2QJd2QsIG4sIHJzCisJLnNldAlwdXNoCisJLnNldAlub2F0CisJLyogbW92ZSB0cmlnZ2VycyBhbiBhc3NlbWJsZXIgYnVnLi4uICovCisJb3IJJDEsIFxycywgemVybworCS53b3JkCTB4NzkzODA4MTkgfCAoXG4gPDwgMTYpIHwgKFx3ZCA8PCA2KQorCS5zZXQJcG9wCisJLmVuZG0KKyNlbmRpZgorCisJLm1hY3JvCW1zYV9zYXZlX2FsbAl0aHJlYWQKKwlzdF9kCTAsIFRIUkVBRF9GUFIwLCBcdGhyZWFkCisJc3RfZAkxLCBUSFJFQURfRlBSMSwgXHRocmVhZAorCXN0X2QJMiwgVEhSRUFEX0ZQUjIsIFx0aHJlYWQKKwlzdF9kCTMsIFRIUkVBRF9GUFIzLCBcdGhyZWFkCisJc3RfZAk0LCBUSFJFQURfRlBSNCwgXHRocmVhZAorCXN0X2QJNSwgVEhSRUFEX0ZQUjUsIFx0aHJlYWQKKwlzdF9kCTYsIFRIUkVBRF9GUFI2LCBcdGhyZWFkCisJc3RfZAk3LCBUSFJFQURfRlBSNywgXHRocmVhZAorCXN0X2QJOCwgVEhSRUFEX0ZQUjgsIFx0aHJlYWQKKwlzdF9kCTksIFRIUkVBRF9GUFI5LCBcdGhyZWFkCisJc3RfZAkxMCwgVEhSRUFEX0ZQUjEwLCBcdGhyZWFkCisJc3RfZAkxMSwgVEhSRUFEX0ZQUjExLCBcdGhyZWFkCisJc3RfZAkxMiwgVEhSRUFEX0ZQUjEyLCBcdGhyZWFkCisJc3RfZAkxMywgVEhSRUFEX0ZQUjEzLCBcdGhyZWFkCisJc3RfZAkxNCwgVEhSRUFEX0ZQUjE0LCBcdGhyZWFkCisJc3RfZAkxNSwgVEhSRUFEX0ZQUjE1LCBcdGhyZWFkCisJc3RfZAkxNiwgVEhSRUFEX0ZQUjE2LCBcdGhyZWFkCisJc3RfZAkxNywgVEhSRUFEX0ZQUjE3LCBcdGhyZWFkCisJc3RfZAkxOCwgVEhSRUFEX0ZQUjE4LCBcdGhyZWFkCisJc3RfZAkxOSwgVEhSRUFEX0ZQUjE5LCBcdGhyZWFkCisJc3RfZAkyMCwgVEhSRUFEX0ZQUjIwLCBcdGhyZWFkCisJc3RfZAkyMSwgVEhSRUFEX0ZQUjIxLCBcdGhyZWFkCisJc3RfZAkyMiwgVEhSRUFEX0ZQUjIyLCBcdGhyZWFkCisJc3RfZAkyMywgVEhSRUFEX0ZQUjIzLCBcdGhyZWFkCisJc3RfZAkyNCwgVEhSRUFEX0ZQUjI0LCBcdGhyZWFkCisJc3RfZAkyNSwgVEhSRUFEX0ZQUjI1LCBcdGhyZWFkCisJc3RfZAkyNiwgVEhSRUFEX0ZQUjI2LCBcdGhyZWFkCisJc3RfZAkyNywgVEhSRUFEX0ZQUjI3LCBcdGhyZWFkCisJc3RfZAkyOCwgVEhSRUFEX0ZQUjI4LCBcdGhyZWFkCisJc3RfZAkyOSwgVEhSRUFEX0ZQUjI5LCBcdGhyZWFkCisJc3RfZAkzMCwgVEhSRUFEX0ZQUjMwLCBcdGhyZWFkCisJc3RfZAkzMSwgVEhSRUFEX0ZQUjMxLCBcdGhyZWFkCisJLmVuZG0KKworCS5tYWNybwltc2FfcmVzdG9yZV9hbGwJdGhyZWFkCisJbGRfZAkwLCBUSFJFQURfRlBSMCwgXHRocmVhZAorCWxkX2QJMSwgVEhSRUFEX0ZQUjEsIFx0aHJlYWQKKwlsZF9kCTIsIFRIUkVBRF9GUFIyLCBcdGhyZWFkCisJbGRfZAkzLCBUSFJFQURfRlBSMywgXHRocmVhZAorCWxkX2QJNCwgVEhSRUFEX0ZQUjQsIFx0aHJlYWQKKwlsZF9kCTUsIFRIUkVBRF9GUFI1LCBcdGhyZWFkCisJbGRfZAk2LCBUSFJFQURfRlBSNiwgXHRocmVhZAorCWxkX2QJNywgVEhSRUFEX0ZQUjcsIFx0aHJlYWQKKwlsZF9kCTgsIFRIUkVBRF9GUFI4LCBcdGhyZWFkCisJbGRfZAk5LCBUSFJFQURfRlBSOSwgXHRocmVhZAorCWxkX2QJMTAsIFRIUkVBRF9GUFIxMCwgXHRocmVhZAorCWxkX2QJMTEsIFRIUkVBRF9GUFIxMSwgXHRocmVhZAorCWxkX2QJMTIsIFRIUkVBRF9GUFIxMiwgXHRocmVhZAorCWxkX2QJMTMsIFRIUkVBRF9GUFIxMywgXHRocmVhZAorCWxkX2QJMTQsIFRIUkVBRF9GUFIxNCwgXHRocmVhZAorCWxkX2QJMTUsIFRIUkVBRF9GUFIxNSwgXHRocmVhZAorCWxkX2QJMTYsIFRIUkVBRF9GUFIxNiwgXHRocmVhZAorCWxkX2QJMTcsIFRIUkVBRF9GUFIxNywgXHRocmVhZAorCWxkX2QJMTgsIFRIUkVBRF9GUFIxOCwgXHRocmVhZAorCWxkX2QJMTksIFRIUkVBRF9GUFIxOSwgXHRocmVhZAorCWxkX2QJMjAsIFRIUkVBRF9GUFIyMCwgXHRocmVhZAorCWxkX2QJMjEsIFRIUkVBRF9GUFIyMSwgXHRocmVhZAorCWxkX2QJMjIsIFRIUkVBRF9GUFIyMiwgXHRocmVhZAorCWxkX2QJMjMsIFRIUkVBRF9GUFIyMywgXHRocmVhZAorCWxkX2QJMjQsIFRIUkVBRF9GUFIyNCwgXHRocmVhZAorCWxkX2QJMjUsIFRIUkVBRF9GUFIyNSwgXHRocmVhZAorCWxkX2QJMjYsIFRIUkVBRF9GUFIyNiwgXHRocmVhZAorCWxkX2QJMjcsIFRIUkVBRF9GUFIyNywgXHRocmVhZAorCWxkX2QJMjgsIFRIUkVBRF9GUFIyOCwgXHRocmVhZAorCWxkX2QJMjksIFRIUkVBRF9GUFIyOSwgXHRocmVhZAorCWxkX2QJMzAsIFRIUkVBRF9GUFIzMCwgXHRocmVhZAorCWxkX2QJMzEsIFRIUkVBRF9GUFIzMSwgXHRocmVhZAorCS5lbmRtCisKICNlbmRpZiAvKiBfQVNNX0FTTU1BQ1JPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA3ZWVkMmYyLi5lOGViM2Q1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC01Myw3ICs1Myw3IEBACiAJCWludCB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsCSUwLCAlMQkJIyBhdG9taWNfYWRkCQlcbiIKIAkJIglhZGR1CSUwLCAlMgkJCQkJXG4iCiAJCSIJc2MJJTAsICUxCQkJCQlcbiIKQEAgLTY2LDcgKzY2LDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCWxsCSUwLCAlMQkJIyBhdG9taWNfYWRkCVxuIgogCQkJIglhZGR1CSUwLCAlMgkJCQlcbiIKIAkJCSIJc2MJJTAsICUxCQkJCVxuIgpAQCAtOTYsNyArOTYsNyBAQAogCQlpbnQgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbAklMCwgJTEJCSMgYXRvbWljX3N1YgkJXG4iCiAJCSIJc3VidQklMCwgJTIJCQkJCVxuIgogCQkiCXNjCSUwLCAlMQkJCQkJXG4iCkBAIC0xMDksNyArMTA5LDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCWxsCSUwLCAlMQkJIyBhdG9taWNfc3ViCVxuIgogCQkJIglzdWJ1CSUwLCAlMgkJCQlcbiIKIAkJCSIJc2MJJTAsICUxCQkJCVxuIgpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCWludCB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsCSUxLCAlMgkJIyBhdG9taWNfYWRkX3JldHVybglcbiIKIAkJIglhZGR1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJc2MJJTAsICUyCQkJCQlcbiIKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJbGwJJTEsICUyCSMgYXRvbWljX2FkZF9yZXR1cm4JXG4iCiAJCQkiCWFkZHUJJTAsICUxLCAlMwkJCVxuIgogCQkJIglzYwklMCwgJTIJCQkJXG4iCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJaW50IHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGwJJTEsICUyCQkjIGF0b21pY19zdWJfcmV0dXJuCVxuIgogCQkiCXN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIglzYwklMCwgJTIJCQkJCVxuIgpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglsbAklMSwgJTIJIyBhdG9taWNfc3ViX3JldHVybglcbiIKIAkJCSIJc3VidQklMCwgJTEsICUzCQkJXG4iCiAJCQkiCXNjCSUwLCAlMgkJCQlcbiIKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQlpbnQgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbAklMSwgJTIJCSMgYXRvbWljX3N1Yl9pZl9wb3NpdGl2ZVxuIgogCQkiCXN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIglibHR6CSUwLCAxZgkJCQkJXG4iCkBAIC0yNjYsNyArMjY2LDcgQEAKIAkJaW50IHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGwJJTEsICUyCQkjIGF0b21pY19zdWJfaWZfcG9zaXRpdmVcbiIKIAkJIglzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJYmx0egklMCwgMWYJCQkJCVxuIgpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCWxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbGQJJTAsICUxCQkjIGF0b21pYzY0X2FkZAkJXG4iCiAJCSIJZGFkZHUJJTAsICUyCQkJCQlcbiIKIAkJIglzY2QJJTAsICUxCQkJCQlcbiIKQEAgLTQzMyw3ICs0MzMsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJbGxkCSUwLCAlMQkJIyBhdG9taWM2NF9hZGQJXG4iCiAJCQkiCWRhZGR1CSUwLCAlMgkJCQlcbiIKIAkJCSIJc2NkCSUwLCAlMQkJCQlcbiIKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCQlsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGxkCSUwLCAlMQkJIyBhdG9taWM2NF9zdWIJCVxuIgogCQkiCWRzdWJ1CSUwLCAlMgkJCQkJXG4iCiAJCSIJc2NkCSUwLCAlMQkJCQkJXG4iCkBAIC00NzYsNyArNDc2LDcgQEAKIAogCQlkbyB7CiAJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCWxsZAklMCwgJTEJCSMgYXRvbWljNjRfc3ViCVxuIgogCQkJIglkc3VidQklMCwgJTIJCQkJXG4iCiAJCQkiCXNjZAklMCwgJTEJCQkJXG4iCkBAIC01MDYsNyArNTA2LDcgQEAKIAkJbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsZAklMSwgJTIJCSMgYXRvbWljNjRfYWRkX3JldHVybglcbiIKIAkJIglkYWRkdQklMCwgJTEsICUzCQkJCVxuIgogCQkiCXNjZAklMCwgJTIJCQkJCVxuIgpAQCAtNTIwLDcgKzUyMCw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglsbGQJJTEsICUyCSMgYXRvbWljNjRfYWRkX3JldHVybglcbiIKIAkJCSIJZGFkZHUJJTAsICUxLCAlMwkJCVxuIgogCQkJIglzY2QJJTAsICUyCQkJCVxuIgpAQCAtNTU2LDcgKzU1Niw3IEBACiAJCWxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbGQJJTEsICUyCQkjIGF0b21pYzY0X3N1Yl9yZXR1cm4JXG4iCiAJCSIJZHN1YnUJJTAsICUxLCAlMwkJCQlcbiIKIAkJIglzY2QJJTAsICUyCQkJCQlcbiIKQEAgLTU3MSw3ICs1NzEsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJbGxkCSUxLCAlMgkjIGF0b21pYzY0X3N1Yl9yZXR1cm4JXG4iCiAJCQkiCWRzdWJ1CSUwLCAlMSwgJTMJCQlcbiIKIAkJCSIJc2NkCSUwLCAlMgkJCQlcbiIKQEAgLTYxNSw3ICs2MTUsNyBAQAogCQlsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGxkCSUxLCAlMgkJIyBhdG9taWM2NF9zdWJfaWZfcG9zaXRpdmVcbiIKIAkJIglkc3VidQklMCwgJTEsICUzCQkJCVxuIgogCQkiCWJsdHoJJTAsIDFmCQkJCQlcbiIKQEAgLTYzMyw3ICs2MzMsNyBAQAogCQlsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJbGxkCSUxLCAlMgkJIyBhdG9taWM2NF9zdWJfaWZfcG9zaXRpdmVcbiIKIAkJIglkc3VidQklMCwgJTEsICUzCQkJCVxuIgogCQkiCWJsdHoJJTAsIDFmCQkJCQlcbiIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCA3MTMwNWE4Li42YTY1ZDQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC03OSw3ICs3OSw3IEBACiAKIAlpZiAoa2VybmVsX3VzZXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJIiBfX0xMICIlMCwgJTEJCQkjIHNldF9iaXQJXG4iCiAJCSIJb3IJJTAsICUyCQkJCQlcbiIKIAkJIgkiIF9fU0MJIiUwLCAlMQkJCQkJXG4iCkBAIC0xMDEsNyArMTAxLDcgQEAKIAl9IGVsc2UgaWYgKGtlcm5lbF91c2VzX2xsc2MpIHsKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIgkiIF9fTEwgIiUwLCAlMQkJIyBzZXRfYml0CVxuIgogCQkJIglvcgklMCwgJTIJCQkJXG4iCiAJCQkiCSIgX19TQwkiJTAsICUxCQkJCVxuIgpAQCAtMTMxLDcgKzEzMSw3IEBACiAKIAlpZiAoa2VybmVsX3VzZXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJIiBfX0xMICIlMCwgJTEJCQkjIGNsZWFyX2JpdAlcbiIKIAkJIglhbmQJJTAsICUyCQkJCQlcbiIKIAkJIgkiIF9fU0MgIiUwLCAlMQkJCQkJXG4iCkBAIC0xNTMsNyArMTUzLDcgQEAKIAl9IGVsc2UgaWYgKGtlcm5lbF91c2VzX2xsc2MpIHsKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIgkiIF9fTEwgIiUwLCAlMQkJIyBjbGVhcl9iaXQJXG4iCiAJCQkiCWFuZAklMCwgJTIJCQkJXG4iCiAJCQkiCSIgX19TQyAiJTAsICUxCQkJCVxuIgpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkiMToJIiBfX0xMICIlMCwgJTEJCSMgY2hhbmdlX2JpdAlcbiIKIAkJIgl4b3IJJTAsICUyCQkJCVxuIgogCQkiCSIgX19TQwkiJTAsICUxCQkJCVxuIgpAQCAtMjExLDcgKzIxMSw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIgkiIF9fTEwgIiUwLCAlMQkJIyBjaGFuZ2VfYml0CVxuIgogCQkJIgl4b3IJJTAsICUyCQkJCVxuIgogCQkJIgkiIF9fU0MJIiUwLCAlMQkJCQlcbiIKQEAgLTI0NCw3ICsyNDQsNyBAQAogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToJIiBfX0xMICIlMCwgJTEJCSMgdGVzdF9hbmRfc2V0X2JpdAlcbiIKIAkJIglvcgklMiwgJTAsICUzCQkJCVxuIgogCQkiCSIgX19TQwkiJTIsICUxCQkJCQlcbiIKQEAgLTI2MCw3ICsyNjAsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJIiBfX0xMICIlMCwgJTEJIyB0ZXN0X2FuZF9zZXRfYml0CVxuIgogCQkJIglvcgklMiwgJTAsICUzCQkJXG4iCiAJCQkiCSIgX19TQwkiJTIsICUxCQkJCVxuIgpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOgkiIF9fTEwgIiUwLCAlMQkJIyB0ZXN0X2FuZF9zZXRfYml0CVxuIgogCQkiCW9yCSUyLCAlMCwgJTMJCQkJXG4iCiAJCSIJIiBfX1NDCSIlMiwgJTEJCQkJCVxuIgpAQCAtMzE0LDcgKzMxNCw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIgkiIF9fTEwgIiUwLCAlMQkjIHRlc3RfYW5kX3NldF9iaXQJXG4iCiAJCQkiCW9yCSUyLCAlMCwgJTMJCQlcbiIKIAkJCSIJIiBfX1NDCSIlMiwgJTEJCQkJXG4iCkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CSIgX19MTAkiJTAsICUxCQkjIHRlc3RfYW5kX2NsZWFyX2JpdAlcbiIKIAkJIglvcgklMiwgJTAsICUzCQkJCVxuIgogCQkiCXhvcgklMiwgJTMJCQkJCVxuIgpAQCAtMzg2LDcgKzM4Niw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIgkiIF9fTEwJIiUwLCAlMSAjIHRlc3RfYW5kX2NsZWFyX2JpdAlcbiIKIAkJCSIJb3IJJTIsICUwLCAlMwkJCVxuIgogCQkJIgl4b3IJJTIsICUzCQkJCVxuIgpAQCAtNDI3LDcgKzQyNyw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOgkiIF9fTEwJIiUwLCAlMQkJIyB0ZXN0X2FuZF9jaGFuZ2VfYml0CVxuIgogCQkiCXhvcgklMiwgJTAsICUzCQkJCVxuIgogCQkiCSIgX19TQwkiJTIsICUxCQkJCQlcbiIKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCiAJCWRvIHsKIAkJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkJCSIJIiBfX0xMCSIlMCwgJTEgIyB0ZXN0X2FuZF9jaGFuZ2VfYml0CVxuIgogCQkJIgl4b3IJJTIsICUwLCAlMwkJCVxuIgogCQkJIgkiIF9fU0MJIlx0JTIsICUxCQkJXG4iCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYm9vdGluZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ib290aW5mby5oCmluZGV4IDRkMmNkZWEuLjFmN2NhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ib290aW5mby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ib290aW5mby5oCkBAIC02MSwxNSArNjEsMjEgQEAKIC8qCiAgKiBWYWxpZCBtYWNodHlwZSBmb3IgTG9vbmdzb24gZmFtaWx5CiAgKi8KLSNkZWZpbmUgTUFDSF9MT09OR1NPTl9VTktOT1dOICAwCi0jZGVmaW5lIE1BQ0hfTEVNT1RFX0ZMMkUgICAgICAgMQotI2RlZmluZSBNQUNIX0xFTU9URV9GTDJGICAgICAgIDIKLSNkZWZpbmUgTUFDSF9MRU1PVEVfTUwyRjcgICAgICAzCi0jZGVmaW5lIE1BQ0hfTEVNT1RFX1lMMkY4OSAgICAgNAotI2RlZmluZSBNQUNIX0RFWFhPTl9HRElVTTJGMTAgIDUKLSNkZWZpbmUgTUFDSF9MRU1PVEVfTkFTCSAgICAgICA2Ci0jZGVmaW5lIE1BQ0hfTEVNT1RFX0xMMkYgICAgICAgNwotI2RlZmluZSBNQUNIX0xPT05HU09OX0VORCAgICAgIDgKK2VudW0gbG9vbmdzb25fbWFjaGluZV90eXBlIHsKKwlNQUNIX0xPT05HU09OX1VOS05PV04sCisJTUFDSF9MRU1PVEVfRkwyRSwKKwlNQUNIX0xFTU9URV9GTDJGLAorCU1BQ0hfTEVNT1RFX01MMkY3LAorCU1BQ0hfTEVNT1RFX1lMMkY4OSwKKwlNQUNIX0RFWFhPTl9HRElVTTJGMTAsCisJTUFDSF9MRU1PVEVfTkFTLAorCU1BQ0hfTEVNT1RFX0xMMkYsCisJTUFDSF9MRU1PVEVfQTEwMDQsCisJTUFDSF9MRU1PVEVfQTExMDEsCisJTUFDSF9MRU1PVEVfQTEyMDEsCisJTUFDSF9MRU1PVEVfQTEyMDUsCisJTUFDSF9MT09OR1NPTl9FTkQKK307CiAKIC8qCiAgKiBWYWxpZCBtYWNodHlwZSBmb3IgZ3JvdXAgSU5HRU5JQwpAQCAtMTEyLDYgKzExOCw4IEBACiBleHRlcm4gdm9pZCBmcmVlX2luaXRfcGFnZXMoY29uc3QgY2hhciAqd2hhdCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGJlZ2luLCB1bnNpZ25lZCBsb25nIGVuZCk7CiAKK2V4dGVybiB2b2lkICgqZnJlZV9pbml0X3BhZ2VzX2V2YSkodm9pZCAqYmVnaW4sIHZvaWQgKmVuZCk7CisKIC8qCiAgKiBJbml0aWFsIGtlcm5lbCBjb21tYW5kIGxpbmUsIHVzdWFsbHkgc2V0dXAgYnkgcHJvbV9pbml0KCkKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2hlY2tzdW0uaAppbmRleCBhYzNkMmI4Li4zNDE4YzUxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2hlY2tzdW0uaApAQCAtNyw2ICs3LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgVGhpZW1vIFNldWZlci4KICAqIENvcHlyaWdodCAoQykgMjAwMiBNYWNpZWogVy4gUm96eWNraQorICogQ29weXJpZ2h0IChDKSAyMDE0IEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKi8KICNpZm5kZWYgX0FTTV9DSEVDS1NVTV9ICiAjZGVmaW5lIF9BU01fQ0hFQ0tTVU1fSApAQCAtMjksOSArMzAsMTMgQEAKICAqLwogX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAotX193c3VtIF9fY3N1bV9wYXJ0aWFsX2NvcHlfdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKLQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpOworX193c3VtIF9fY3N1bV9wYXJ0aWFsX2NvcHlfa2VybmVsKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKTsKIAorX193c3VtIF9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKTsKK19fd3N1bSBfX2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKTsKIC8qCiAgKiB0aGlzIGlzIGEgbmV3IHZlcnNpb24gb2YgdGhlIGFib3ZlIHRoYXQgcmVjb3JkcyBlcnJvcnMgaXQgZmluZHMgaW4gKmVycnAsCiAgKiBidXQgY29udGludWVzIGFuZCB6ZXJvcyB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgpAQCAtNDEsOCArNDYsMjYgQEAKIAkJCQkgICBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7CiAJbWlnaHRfZmF1bHQoKTsKLQlyZXR1cm4gX19jc3VtX3BhcnRpYWxfY29weV91c2VyKChfX2ZvcmNlIHZvaWQgKilzcmMsIGRzdCwKLQkJCQkJbGVuLCBzdW0sIGVycl9wdHIpOworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCisJCXJldHVybiBfX2NzdW1fcGFydGlhbF9jb3B5X2tlcm5lbCgoX19mb3JjZSB2b2lkICopc3JjLCBkc3QsCisJCQkJCQkgIGxlbiwgc3VtLCBlcnJfcHRyKTsKKwllbHNlCisJCXJldHVybiBfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcigoX19mb3JjZSB2b2lkICopc3JjLCBkc3QsCisJCQkJCQkgICAgIGxlbiwgc3VtLCBlcnJfcHRyKTsKK30KKworI2RlZmluZSBfSEFWRV9BUkNIX0NPUFlfQU5EX0NTVU1fRlJPTV9VU0VSCitzdGF0aWMgaW5saW5lCitfX3dzdW0gY3N1bV9hbmRfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIGxlbikpCisJCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoc3JjLCBkc3QsIGxlbiwgc3VtLAorCQkJCQkJICAgZXJyX3B0cik7CisJaWYgKGxlbikKKwkJKmVycl9wdHIgPSAtRUZBVUxUOworCisJcmV0dXJuIHN1bTsKIH0KIAogLyoKQEAgLTU0LDkgKzc3LDE2IEBACiAJCQkgICAgIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAltaWdodF9mYXVsdCgpOwotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpCi0JCXJldHVybiBfX2NzdW1fcGFydGlhbF9jb3B5X3VzZXIoc3JjLCAoX19mb3JjZSB2b2lkICopZHN0LAotCQkJCQkJbGVuLCBzdW0sIGVycl9wdHIpOworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpIHsKKwkJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkKKwkJCXJldHVybiBfX2NzdW1fcGFydGlhbF9jb3B5X2tlcm5lbChzcmMsCisJCQkJCQkJICAoX19mb3JjZSB2b2lkICopZHN0LAorCQkJCQkJCSAgbGVuLCBzdW0sIGVycl9wdHIpOworCQllbHNlCisJCQlyZXR1cm4gX19jc3VtX3BhcnRpYWxfY29weV90b191c2VyKHNyYywKKwkJCQkJCQkgICAoX19mb3JjZSB2b2lkICopZHN0LAorCQkJCQkJCSAgIGxlbiwgc3VtLCBlcnJfcHRyKTsKKwl9CiAJaWYgKGxlbikKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY21weGNoZy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NtcHhjaGcuaAppbmRleCA0NjYwNjliLi5lZWZjYWEzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY21weGNoZy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKQEAgLTIyLDExICsyMiwxMSBAQAogCQl1bnNpZ25lZCBsb25nIGR1bW15OwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsCSUwLCAlMwkJCSMgeGNoZ191MzIJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCSIJbW92ZQklMiwgJXo0CQkJCQlcbiIKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIJc2MJJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgpAQCAtMzgsMTEgKzM4LDExIEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglsbAklMCwgJTMJCSMgeGNoZ191MzIJXG4iCiAJCQkiCS5zZXQJbWlwczAJCQkJXG4iCiAJCQkiCW1vdmUJJTIsICV6NAkJCQlcbiIKLQkJCSIJLnNldAltaXBzMwkJCQlcbiIKKwkJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJCQkiCXNjCSUyLCAlMQkJCQlcbiIKIAkJCSIJLnNldAltaXBzMAkJCQlcbiIKIAkJCTogIj0mciIgKHJldHZhbCksICI9bSIgKCptKSwgIj0mciIgKGR1bW15KQpAQCAtNzQsNyArNzQsNyBAQAogCQl1bnNpZ25lZCBsb25nIGR1bW15OwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6CWxsZAklMCwgJTMJCQkjIHhjaGdfdTY0CVxuIgogCQkiCW1vdmUJJTIsICV6NAkJCQkJXG4iCiAJCSIJc2NkCSUyLCAlMQkJCQkJXG4iCkBAIC04OCw3ICs4OCw3IEBACiAKIAkJZG8gewogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkiCS5zZXQJbWlwczMJCQkJXG4iCisJCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkJIglsbGQJJTAsICUzCQkjIHhjaGdfdTY0CVxuIgogCQkJIgltb3ZlCSUyLCAlejQJCQkJXG4iCiAJCQkiCXNjZAklMiwgJTEJCQkJXG4iCkBAIC0xNDUsMTIgKzE0NSwxMiBAQAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkJIgkuc2V0CXB1c2gJCQkJXG4iCVwKIAkJIgkuc2V0CW5vYXQJCQkJXG4iCVwKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKIAkJIjE6CSIgbGQgIgklMCwgJTIJCSMgX19jbXB4Y2hnX2FzbSBcbiIJXAogCQkiCWJuZQklMCwgJXozLCAyZgkJCVxuIglcCiAJCSIJLnNldAltaXBzMAkJCQlcbiIJXAogCQkiCW1vdmUJJDEsICV6NAkJCQlcbiIJXAotCQkiCS5zZXQJbWlwczMJCQkJXG4iCVwKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIJXAogCQkiCSIgc3QgIgkkMSwgJTEJCQkJXG4iCVwKIAkJIgliZXF6bAkkMSwgMWIJCQkJXG4iCVwKIAkJIjI6CQkJCQkJXG4iCVwKQEAgLTE2MiwxMiArMTYyLDEyIEBACiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAogCQkiCS5zZXQJcHVzaAkJCQlcbiIJXAogCQkiCS5zZXQJbm9hdAkJCQlcbiIJXAotCQkiCS5zZXQJbWlwczMJCQkJXG4iCVwKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIJXAogCQkiMToJIiBsZCAiCSUwLCAlMgkJIyBfX2NtcHhjaGdfYXNtIFxuIglcCiAJCSIJYm5lCSUwLCAlejMsIDJmCQkJXG4iCVwKIAkJIgkuc2V0CW1pcHMwCQkJCVxuIglcCiAJCSIJbW92ZQkkMSwgJXo0CQkJCVxuIglcCi0JCSIJLnNldAltaXBzMwkJCQlcbiIJXAorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIglcCiAJCSIJIiBzdCAiCSQxLCAlMQkJCQlcbiIJXAogCQkiCWJlcXoJJDEsIDFiCQkJCVxuIglcCiAJCSIJLnNldAlwb3AJCQkJXG4iCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaAppbmRleCA2ZTcwYjAzLi5mNTZjYzk3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1mZWF0dXJlcy5oCkBAIC0yNiw3ICsyNiw5IEBACiAjaWZuZGVmIGNwdV9oYXNfc2VnbWVudHMKICNkZWZpbmUgY3B1X2hhc19zZWdtZW50cwkoY3B1X2RhdGFbMF0ub3B0aW9ucyAmIE1JUFNfQ1BVX1NFR01FTlRTKQogI2VuZGlmCi0KKyNpZm5kZWYgY3B1X2hhc19ldmEKKyNkZWZpbmUgY3B1X2hhc19ldmEJCShjcHVfZGF0YVswXS5vcHRpb25zICYgTUlQU19DUFVfRVZBKQorI2VuZGlmCiAKIC8qCiAgKiBGb3IgdGhlIG1vbWVudCB3ZSBkb24ndCBjb25zaWRlciBSNjAwMCBhbmQgUjgwMDAgc28gd2UgY2FuIGFzc3VtZSB0aGF0CkBAIC0yOTksNCArMzAxLDEwIEBACiAjZGVmaW5lIGNwdV9oYXNfdnoJCShjcHVfZGF0YVswXS5hc2VzICYgTUlQU19BU0VfVlopCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IQVNfTVNBKSAmJiAhZGVmaW5lZChjcHVfaGFzX21zYSkKKyMgZGVmaW5lIGNwdV9oYXNfbXNhCQkoY3B1X2RhdGFbMF0uYXNlcyAmIE1JUFNfQVNFX01TQSkKKyNlbGlmICFkZWZpbmVkKGNwdV9oYXNfbXNhKQorIyBkZWZpbmUgY3B1X2hhc19tc2EJCTAKKyNlbmRpZgorCiAjZW5kaWYgLyogX19BU01fQ1BVX0ZFQVRVUkVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtaW5mby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1pbmZvLmgKaW5kZXggOGY3YWRmMC4uZGMyMTM1YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1pbmZvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1pbmZvLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlhc2VzOwogCXVuc2lnbmVkIGludAkJcHJvY2Vzc29yX2lkOwogCXVuc2lnbmVkIGludAkJZnB1X2lkOworCXVuc2lnbmVkIGludAkJbXNhX2lkOwogCXVuc2lnbmVkIGludAkJY3B1dHlwZTsKIAlpbnQJCQlpc2FfbGV2ZWw7CiAJaW50CQkJdGxic2l6ZTsKQEAgLTk1LDQgKzk2LDMxIEBACiBleHRlcm4gY29uc3QgY2hhciAqX19jcHVfbmFtZVtdOwogI2RlZmluZSBjcHVfbmFtZV9zdHJpbmcoKQlfX2NwdV9uYW1lW3NtcF9wcm9jZXNzb3JfaWQoKV0KIAorc3RydWN0IHNlcV9maWxlOworc3RydWN0IG5vdGlmaWVyX2Jsb2NrOworCitleHRlcm4gaW50IHJlZ2lzdGVyX3Byb2NfY3B1aW5mb19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiBpbnQgcHJvY19jcHVpbmZvX25vdGlmaWVyX2NhbGxfY2hhaW4odW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnYpOworCisjZGVmaW5lIHByb2NfY3B1aW5mb19ub3RpZmllcihmbiwgcHJpKQkJCQkJXAorKHsJCQkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmbiMjX25iID0gewkJCVwKKwkJLm5vdGlmaWVyX2NhbGwgPSBmbiwJCQkJCVwKKwkJLnByaW9yaXR5ID0gcHJpCQkJCQkJXAorCX07CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmVnaXN0ZXJfcHJvY19jcHVpbmZvX25vdGlmaWVyKCZmbiMjX25iKTsJCQlcCit9KQorCitzdHJ1Y3QgcHJvY19jcHVpbmZvX25vdGlmaWVyX2FyZ3MgeworCXN0cnVjdCBzZXFfZmlsZSAqbTsKKwl1bnNpZ25lZCBsb25nIG47Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01UQykKKyMgZGVmaW5lIGNwdV92cGVfaWQoY3B1aW5mbykJKChjcHVpbmZvKS0+dnBlX2lkKQorI2Vsc2UKKyMgZGVmaW5lIGNwdV92cGVfaWQoY3B1aW5mbykJMAorI2VuZGlmCisKICNlbmRpZiAvKiBfX0FTTV9DUFVfSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LXR5cGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtdHlwZS5oCmluZGV4IDAyZjU5MWIuLjcyMTkwNjEzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LXR5cGUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LXR5cGUuaApAQCAtMjAsNiArMjAsMTAgQEAKIAljYXNlIENQVV9MT09OR1NPTjI6CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TWVNfSEFTX0NQVV9MT09OR1NPTjMKKwljYXNlIENQVV9MT09OR1NPTjM6CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TWVNfSEFTX0NQVV9MT09OR1NPTjFCCiAJY2FzZSBDUFVfTE9PTkdTT04xOgogI2VuZGlmCkBAIC00Niw2ICs1MCw4IEBACiAJY2FzZSBDUFVfTTE0S0VDOgogCWNhc2UgQ1BVX0lOVEVSQVBUSVY6CiAJY2FzZSBDUFVfUFJPQVBUSVY6CisJY2FzZSBDUFVfUDU2MDA6CisJY2FzZSBDUFVfTTUxNTA6CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TWVNfSEFTX0NQVV9NSVBTNjRfUjEKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaAppbmRleCA3NjQxMWRmLi41MzBlYjhiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCkBAIC04MiwxMCArODIsMTAgQEAKICNkZWZpbmUgUFJJRF9JTVBfUk03MDAwCQkweDI3MDAKICNkZWZpbmUgUFJJRF9JTVBfTkVWQURBCQkweDI4MDAJCS8qIFJNNTI2MCA/Pz8gKi8KICNkZWZpbmUgUFJJRF9JTVBfUk05MDAwCQkweDM0MDAKLSNkZWZpbmUgUFJJRF9JTVBfTE9PTkdTT04xCTB4NDIwMAorI2RlZmluZSBQUklEX0lNUF9MT09OR1NPTl8zMgkweDQyMDAgIC8qIExvb25nc29uLTEgKi8KICNkZWZpbmUgUFJJRF9JTVBfUjU0MzIJCTB4NTQwMAogI2RlZmluZSBQUklEX0lNUF9SNTUwMAkJMHg1NTAwCi0jZGVmaW5lIFBSSURfSU1QX0xPT05HU09OMgkweDYzMDAKKyNkZWZpbmUgUFJJRF9JTVBfTE9PTkdTT05fNjQJMHg2MzAwICAvKiBMb29uZ3Nvbi0yLzMgKi8KIAogI2RlZmluZSBQUklEX0lNUF9VTktOT1dOCTB4ZmYwMAogCkBAIC0xMTUsNiArMTE1LDggQEAKICNkZWZpbmUgUFJJRF9JTVBfSU5URVJBUFRJVl9NUAkweGExMDAKICNkZWZpbmUgUFJJRF9JTVBfUFJPQVBUSVZfVVAJMHhhMjAwCiAjZGVmaW5lIFBSSURfSU1QX1BST0FQVElWX01QCTB4YTMwMAorI2RlZmluZSBQUklEX0lNUF9NNTE1MAkJMHhhNzAwCisjZGVmaW5lIFBSSURfSU1QX1A1NjAwCQkweGE4MDAKIAogLyoKICAqIFRoZXNlIGFyZSB0aGUgUFJJRCdzIGZvciB3aGVuIDIzOjE2ID09IFBSSURfQ09NUF9TSUJZVEUKQEAgLTIyOSw2ICsyMzEsNyBAQAogI2RlZmluZSBQUklEX1JFVl9MT09OR1NPTjFCCTB4MDAyMAogI2RlZmluZSBQUklEX1JFVl9MT09OR1NPTjJFCTB4MDAwMgogI2RlZmluZSBQUklEX1JFVl9MT09OR1NPTjJGCTB4MDAwMworI2RlZmluZSBQUklEX1JFVl9MT09OR1NPTjNBCTB4MDAwNQogCiAvKgogICogT2xkZXIgcHJvY2Vzc29ycyB1c2VkIHRvIGVuY29kZSBwcm9jZXNzb3IgdmVyc2lvbiBhbmQgcmV2aXNpb24gaW4gdHdvCkBAIC0yOTYsMTQgKzI5OSwxNCBAQAogCUNQVV80S0MsIENQVV80S0VDLCBDUFVfNEtTQywgQ1BVXzI0SywgQ1BVXzM0SywgQ1BVXzEwMDRLLCBDUFVfNzRLLAogCUNQVV9BTENIRU1ZLCBDUFVfUFI0NDUwLCBDUFVfQk1JUFMzMiwgQ1BVX0JNSVBTMzMwMCwgQ1BVX0JNSVBTNDM1MCwKIAlDUFVfQk1JUFM0MzgwLCBDUFVfQk1JUFM1MDAwLCBDUFVfSlpSSVNDLCBDUFVfTE9PTkdTT04xLCBDUFVfTTE0S0MsCi0JQ1BVX00xNEtFQywgQ1BVX0lOVEVSQVBUSVYsIENQVV9QUk9BUFRJViwKKwlDUFVfTTE0S0VDLCBDUFVfSU5URVJBUFRJViwgQ1BVX1A1NjAwLCBDUFVfUFJPQVBUSVYsIENQVV8xMDc0SywgQ1BVX001MTUwLAogCiAJLyoKIAkgKiBNSVBTNjQgY2xhc3MgcHJvY2Vzc29ycwogCSAqLwogCUNQVV81S0MsIENQVV81S0UsIENQVV8yMEtDLCBDUFVfMjVLRiwgQ1BVX1NCMSwgQ1BVX1NCMUEsIENQVV9MT09OR1NPTjIsCi0JQ1BVX0NBVklVTV9PQ1RFT04sIENQVV9DQVZJVU1fT0NURU9OX1BMVVMsIENQVV9DQVZJVU1fT0NURU9OMiwKLQlDUFVfQ0FWSVVNX09DVEVPTjMsIENQVV9YTFIsIENQVV9YTFAsCisJQ1BVX0xPT05HU09OMywgQ1BVX0NBVklVTV9PQ1RFT04sIENQVV9DQVZJVU1fT0NURU9OX1BMVVMsCisJQ1BVX0NBVklVTV9PQ1RFT04yLCBDUFVfQ0FWSVVNX09DVEVPTjMsIENQVV9YTFIsIENQVV9YTFAsCiAKIAlDUFVfTEFTVAogfTsKQEAgLTM1OCw2ICszNjEsNyBAQAogI2RlZmluZSBNSVBTX0NQVV9NSUNST01JUFMJMHgwMTAwMDAwMCAvKiBDUFUgaGFzIG1pY3JvTUlQUyBjYXBhYmlsaXR5ICovCiAjZGVmaW5lIE1JUFNfQ1BVX1RMQklOVgkJMHgwMjAwMDAwMCAvKiBDUFUgc3VwcG9ydHMgVExCSU5WL0YgKi8KICNkZWZpbmUgTUlQU19DUFVfU0VHTUVOVFMJMHgwNDAwMDAwMCAvKiBDUFUgc3VwcG9ydHMgU2VnbWVudGF0aW9uIENvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1JUFNfQ1BVX0VWQQkJMHg4MDAwMDAwMCAvKiBDUFUgc3VwcG9ydHMgRW5oYW5jZWQgVmlydHVhbCBBZGRyZXNzaW5nICovCiAKIC8qCiAgKiBDUFUgQVNFIGVuY29kaW5ncwpAQCAtMzcwLDUgKzM3NCw2IEBACiAjZGVmaW5lIE1JUFNfQVNFX01JUFNNVAkJMHgwMDAwMDAyMCAvKiBDUFUgc3VwcG9ydHMgTUlQUyBNVCAqLwogI2RlZmluZSBNSVBTX0FTRV9EU1AyUAkJMHgwMDAwMDA0MCAvKiBTaWduYWwgUHJvY2Vzc2luZyBBU0UgUmV2IDIgKi8KICNkZWZpbmUgTUlQU19BU0VfVloJCTB4MDAwMDAwODAgLyogVmlydHVhbGl6YXRpb24gQVNFICovCisjZGVmaW5lIE1JUFNfQVNFX01TQQkJMHgwMDAwMDEwMCAvKiBNSVBTIFNJTUQgQXJjaGl0ZWN0dXJlICovCiAKICNlbmRpZiAvKiBfQVNNX0NQVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IDg0MjM4YzUuLjA2NDEyYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCkBAIC00OSw5ICs0OSwxNCBAQAogc3RhdGljIGlubGluZSBpbnQKIGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQogeworCXN0cnVjdCBkbWFfbWFwX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKwogCWlmKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgbWFzaykpCiAJCXJldHVybiAtRUlPOwogCisJaWYgKG9wcy0+c2V0X2RtYV9tYXNrKQorCQlyZXR1cm4gb3BzLT5zZXRfZG1hX21hc2soZGV2LCBtYXNrKTsKKwogCSpkZXYtPmRtYV9tYXNrID0gbWFzazsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZwdS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZwdS5oCmluZGV4IDZiOTc0OTUuLjRkODZiNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1LmgKQEAgLTU3LDcgKzU3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIEZQVV82NEJJVDoKLSNpZiAhKGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjIpIHx8IGRlZmluZWQoQ09ORklHX01JUFM2NCkpCisjaWYgIShkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyX1IyKSB8fCBkZWZpbmVkKENPTkZJR182NEJJVCkpCiAJCS8qIHdlIG9ubHkgaGF2ZSBhIDMyLWJpdCBGUFUgKi8KIAkJcmV0dXJuIFNJR0ZQRTsKICNlbmRpZgpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCV9yZXN0b3JlX2ZwKHRzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgZnB1cmVnX3QgKmdldF9mcHVfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0YXRpYyBpbmxpbmUgdW5pb24gZnB1cmVnICpnZXRfZnB1X3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJaWYgKHRzayA9PSBjdXJyZW50KSB7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCmluZGV4IGNlMzVjOWEuLjk5MmFhYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdHJhY2UuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnRyYWNlLmgKQEAgLTIyLDEyICsyMiwxMiBAQAogI2RlZmluZSBzYWZlX2xvYWQobG9hZCwgc3JjLCBkc3QsIGVycm9yKQkJXAogZG8gewkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlICgJCQkJCVwKLQkJIjE6ICIgbG9hZCAiICVbIiBTVFIoZHN0KSAiXSwgMCglWyIgU1RSKHNyYykgIl0pXG4iXAotCQkiICAgbGkgJVsiIFNUUihlcnJvcikgIl0sIDBcbiIJCVwKKwkJIjE6ICIgbG9hZCAiICVbdG1wX2RzdF0sIDAoJVt0bXBfc3JjXSlcbiIJXAorCQkiICAgbGkgJVt0bXBfZXJyXSwgMFxuIgkJCVwKIAkJIjI6XG4iCQkJCQlcCiAJCQkJCQkJXAogCQkiLnNlY3Rpb24gLmZpeHVwLCBcImF4XCJcbiIJCVwKLQkJIjM6IGxpICVbIiBTVFIoZXJyb3IpICJdLCAxXG4iCQlcCisJCSIzOiBsaSAlW3RtcF9lcnJdLCAxXG4iCQkJXAogCQkiICAgaiAyYlxuIgkJCQlcCiAJCSIucHJldmlvdXNcbiIJCQkJXAogCQkJCQkJCVwKQEAgLTM1LDggKzM1LDggQEAKIAkJU1RSKFBUUikgIlx0MWIsIDNiXG5cdCIJCQlcCiAJCSIucHJldmlvdXNcbiIJCQkJXAogCQkJCQkJCVwKLQkJOiBbZHN0XSAiPSZyIiAoZHN0KSwgW2Vycm9yXSAiPXIiIChlcnJvcilcCi0JCTogW3NyY10gInIiIChzcmMpCQkJXAorCQk6IFt0bXBfZHN0XSAiPSZyIiAoZHN0KSwgW3RtcF9lcnJdICI9ciIgKGVycm9yKVwKKwkJOiBbdG1wX3NyY10gInIiIChzcmMpCQkJXAogCQk6ICJtZW1vcnkiCQkJCVwKIAkpOwkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC00NCwxMiArNDQsMTIgQEAKICNkZWZpbmUgc2FmZV9zdG9yZShzdG9yZSwgc3JjLCBkc3QsIGVycm9yKQlcCiBkbyB7CQkJCQkJXAogCWFzbSB2b2xhdGlsZSAoCQkJCVwKLQkJIjE6ICIgc3RvcmUgIiAlWyIgU1RSKHNyYykgIl0sIDAoJVsiIFNUUihkc3QpICJdKVxuIlwKLQkJIiAgIGxpICVbIiBTVFIoZXJyb3IpICJdLCAwXG4iCVwKKwkJIjE6ICIgc3RvcmUgIiAlW3RtcF9zcmNdLCAwKCVbdG1wX2RzdF0pXG4iXAorCQkiICAgbGkgJVt0bXBfZXJyXSwgMFxuIgkJXAogCQkiMjpcbiIJCQkJXAogCQkJCQkJXAogCQkiLnNlY3Rpb24gLmZpeHVwLCBcImF4XCJcbiIJXAotCQkiMzogbGkgJVsiIFNUUihlcnJvcikgIl0sIDFcbiIJXAorCQkiMzogbGkgJVt0bXBfZXJyXSwgMVxuIgkJXAogCQkiICAgaiAyYlxuIgkJCVwKIAkJIi5wcmV2aW91c1xuIgkJCVwKIAkJCQkJCVwKQEAgLTU3LDggKzU3LDggQEAKIAkJU1RSKFBUUikgIlx0MWIsIDNiXG5cdCIJCVwKIAkJIi5wcmV2aW91c1xuIgkJCVwKIAkJCQkJCVwKLQkJOiBbZXJyb3JdICI9ciIgKGVycm9yKQkJXAotCQk6IFtkc3RdICJyIiAoZHN0KSwgW3NyY10gInIiIChzcmMpXAorCQk6IFt0bXBfZXJyXSAiPXIiIChlcnJvcikJXAorCQk6IFt0bXBfZHN0XSAiciIgKGRzdCksIFt0bXBfc3JjXSAiciIgKHNyYylcCiAJCTogIm1lbW9yeSIJCQlcCiAJKTsJCQkJCVwKIH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnV0ZXguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdXRleC5oCmluZGV4IDZlYTE1ODEuLjE5NGNkYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdXRleC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdXRleC5oCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXNtLWV2YS5oPgogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgpAQCAtMjIsMTEgKzIzLDExIEBACiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAogCQkiCS5zZXQJcHVzaAkJCQlcbiIJXAogCQkiCS5zZXQJbm9hdAkJCQlcbiIJXAotCQkiCS5zZXQJbWlwczMJCQkJXG4iCVwKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIJXAogCQkiMToJbGwJJTEsICU0CSMgX19mdXRleF9hdG9taWNfb3AJXG4iCVwKIAkJIgkuc2V0CW1pcHMwCQkJCVxuIglcCiAJCSIJIiBpbnNuCSIJCQkJXG4iCVwKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKIAkJIjI6CXNjCSQxLCAlMgkJCQlcbiIJXAogCQkiCWJlcXpsCSQxLCAxYgkJCQlcbiIJXAogCQlfX1dFQUtfTExTQ19NQgkJCQkJCVwKQEAgLTQ4LDEyICs0OSwxMiBAQAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkJIgkuc2V0CXB1c2gJCQkJXG4iCVwKIAkJIgkuc2V0CW5vYXQJCQkJXG4iCVwKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCi0JCSIxOglsbAklMSwgJTQJIyBfX2Z1dGV4X2F0b21pY19vcAlcbiIJXAorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIglcCisJCSIxOgkidXNlcl9sbCgiJTEiLCAiJTQiKSIgIyBfX2Z1dGV4X2F0b21pY19vcFxuIglcCiAJCSIJLnNldAltaXBzMAkJCQlcbiIJXAogCQkiCSIgaW5zbgkiCQkJCVxuIglcCi0JCSIJLnNldAltaXBzMwkJCQlcbiIJXAotCQkiMjoJc2MJJDEsICUyCQkJCVxuIglcCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKKwkJIjI6CSJ1c2VyX3NjKCIkMSIsICIlMiIpIgkJCVxuIglcCiAJCSIJYmVxegkkMSwgMWIJCQkJXG4iCVwKIAkJX19XRUFLX0xMU0NfTUIJCQkJCQlcCiAJCSIzOgkJCQkJCVxuIglcCkBAIC0xNDYsMTIgKzE0NywxMiBAQAogCQkiIyBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYwkJCVxuIgogCQkiCS5zZXQJcHVzaAkJCQkJXG4iCiAJCSIJLnNldAlub2F0CQkJCQlcbiIKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOglsbAklMSwgJTMJCQkJCVxuIgogCQkiCWJuZQklMSwgJXo0LCAzZgkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJIgltb3ZlCSQxLCAlejUJCQkJCVxuIgotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjI6CXNjCSQxLCAlMgkJCQkJXG4iCiAJCSIJYmVxemwJJDEsIDFiCQkJCQlcbiIKIAkJX19XRUFLX0xMU0NfTUIKQEAgLTE3MywxMyArMTc0LDEzIEBACiAJCSIjIGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljCQkJXG4iCiAJCSIJLnNldAlwdXNoCQkJCQlcbiIKIAkJIgkuc2V0CW5vYXQJCQkJCVxuIgotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgotCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCisJCSIxOgkidXNlcl9sbCgiJTEiLCAiJTMiKSIJCQkJXG4iCiAJCSIJYm5lCSUxLCAlejQsIDNmCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQkiCW1vdmUJJDEsICV6NQkJCQkJXG4iCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCi0JCSIyOglzYwkkMSwgJTIJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKKwkJIjI6CSJ1c2VyX3NjKCIkMSIsICIlMiIpIgkJCQlcbiIKIAkJIgliZXF6CSQxLCAxYgkJCQkJXG4iCiAJCV9fV0VBS19MTFNDX01CCiAJCSIzOgkJCQkJCQlcbiIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9mdy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z3L2Z3LmgKaW5kZXggZDZjNTBhNy4uZjNlNjk3OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z3L2Z3LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z3L2Z3LmgKQEAgLTM4LDcgKzM4LDcgQEAKIAogZXh0ZXJuIHZvaWQgZndfaW5pdF9jbWRsaW5lKHZvaWQpOwogZXh0ZXJuIGNoYXIgKmZ3X2dldGNtZGxpbmUodm9pZCk7Ci1leHRlcm4gZndfbWVtYmxvY2tfdCAqZndfZ2V0bWRlc2Modm9pZCk7CitleHRlcm4gZndfbWVtYmxvY2tfdCAqZndfZ2V0bWRlc2MoaW50KTsKIGV4dGVybiB2b2lkIGZ3X21lbWluaXQodm9pZCk7CiBleHRlcm4gY2hhciAqZndfZ2V0ZW52KGNoYXIgKm5hbWUpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZndfZ2V0ZW52bChjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9nY21wcmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2djbXByZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzU5ZjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2djbXByZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMDcgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KLSAqCi0gKiBNdWx0aXByb2Nlc3NvciBTdWJzeXN0ZW0gUmVnaXN0ZXIgRGVmaW5pdGlvbnMKLSAqCi0gKi8KLSNpZm5kZWYgX0FTTV9HQ01QUkVHU19ICi0jZGVmaW5lIF9BU01fR0NNUFJFR1NfSAotCi0KLS8qIE9mZnNldHMgdG8gbWFqb3IgYmxvY2tzIHdpdGhpbiBHQ01QIGZyb20gR0NNUCBiYXNlICovCi0jZGVmaW5lIEdDTVBfR0NCX09GUwkJMHgwMDAwIC8qIEdsb2JhbCBDb250cm9sIEJsb2NrICovCi0jZGVmaW5lIEdDTVBfQ0xDQl9PRlMJCTB4MjAwMCAvKiBDb3JlIExvY2FsIENvbnRyb2wgQmxvY2sgKi8KLSNkZWZpbmUgR0NNUF9DT0NCX09GUwkJMHg0MDAwIC8qIENvcmUgT3RoZXIgQ29udHJvbCBCbG9jayAqLwotI2RlZmluZSBHQ01QX0dEQl9PRlMJCTB4ODAwMCAvKiBHbG9iYWwgRGVidWcgQmxvY2sgKi8KLQotLyogT2Zmc2V0cyB0byBpbmRpdmlkdWFsIEdDTVAgcmVnaXN0ZXJzIGZyb20gR0NNUCBiYXNlICovCi0jZGVmaW5lIEdDTVBPRlMoYmxvY2ssIHRhZywgcmVnKQlcCi0JKEdDTVBfIyNibG9jayMjX09GUyArIEdDTVBfIyN0YWcjI18jI3JlZyMjX09GUykKLSNkZWZpbmUgR0NNUE9GU24oYmxvY2ssIHRhZywgcmVnLCBuKSBcCi0JKEdDTVBfIyNibG9jayMjX09GUyArIEdDTVBfIyN0YWcjI18jI3JlZyMjX09GUyhuKSkKLQotI2RlZmluZSBHQ01QR0NCT0ZTKHJlZykJCUdDTVBPRlMoR0NCLCBHQ0IsIHJlZykKLSNkZWZpbmUgR0NNUEdDQk9GU24ocmVnLCBuKQlHQ01QT0ZTbihHQ0IsIEdDQiwgcmVnLCBuKQotI2RlZmluZSBHQ01QQ0xDQk9GUyhyZWcpCUdDTVBPRlMoQ0xDQiwgQ0NCLCByZWcpCi0jZGVmaW5lIEdDTVBDT0NCT0ZTKHJlZykJR0NNUE9GUyhDT0NCLCBDQ0IsIHJlZykKLSNkZWZpbmUgR0NNUEdEQk9GUyhyZWcpCQlHQ01QT0ZTKEdEQiwgR0RCLCByZWcpCi0KLS8qIEdDTVAgcmVnaXN0ZXIgYWNjZXNzICovCi0jZGVmaW5lIEdDTVBHQ0IocmVnKQkJCVJFR1AoX2djbXBfYmFzZSwgR0NNUEdDQk9GUyhyZWcpKQotI2RlZmluZSBHQ01QR0NCbihyZWcsIG4pCSAgICAgICBSRUdQKF9nY21wX2Jhc2UsIEdDTVBHQ0JPRlNuKHJlZywgbikpCi0jZGVmaW5lIEdDTVBDTENCKHJlZykJCQlSRUdQKF9nY21wX2Jhc2UsIEdDTVBDTENCT0ZTKHJlZykpCi0jZGVmaW5lIEdDTVBDT0NCKHJlZykJCQlSRUdQKF9nY21wX2Jhc2UsIEdDTVBDT0NCT0ZTKHJlZykpCi0jZGVmaW5lIEdDTVBHREIocmVnKQkJCVJFR1AoX2djbXBfYmFzZSwgR0NNUEdEQk9GUyhyZWcpKQotCi0vKiBNYXNrIGdlbmVyYXRpb24gKi8KLSNkZWZpbmUgR0NNUE1TSyhibG9jaywgcmVnLCBiaXRzKQkoTVNLKGJpdHMpPDxHQ01QXyMjYmxvY2sjI18jI3JlZyMjX1NIRikKLSNkZWZpbmUgR0NNUEdDQk1TSyhyZWcsIGJpdHMpCQlHQ01QTVNLKEdDQiwgcmVnLCBiaXRzKQotI2RlZmluZSBHQ01QQ0NCTVNLKHJlZywgYml0cykJCUdDTVBNU0soQ0NCLCByZWcsIGJpdHMpCi0jZGVmaW5lIEdDTVBHREJNU0socmVnLCBiaXRzKQkJR0NNUE1TSyhHREIsIHJlZywgYml0cykKLQotLyogR0NCIHJlZ2lzdGVycyAqLwotI2RlZmluZSBHQ01QX0dDQl9HQ19PRlMJCQkweDAwMDAJLyogR2xvYmFsIENvbmZpZyBSZWdpc3RlciAqLwotI2RlZmluZQkgR0NNUF9HQ0JfR0NfTlVNSU9DVV9TSEYJOAotI2RlZmluZQkgR0NNUF9HQ0JfR0NfTlVNSU9DVV9NU0sJR0NNUEdDQk1TSyhHQ19OVU1JT0NVLCA0KQotI2RlZmluZQkgR0NNUF9HQ0JfR0NfTlVNQ09SRVNfU0hGCTAKLSNkZWZpbmUJIEdDTVBfR0NCX0dDX05VTUNPUkVTX01TSwlHQ01QR0NCTVNLKEdDX05VTUNPUkVTLCA4KQotI2RlZmluZSBHQ01QX0dDQl9HQ01QQl9PRlMJCTB4MDAwOAkJLyogR2xvYmFsIEdDTVAgQmFzZSAqLwotI2RlZmluZQkgR0NNUF9HQ0JfR0NNUEJfR0NNUEJBU0VfU0hGCTE1Ci0jZGVmaW5lCSBHQ01QX0dDQl9HQ01QQl9HQ01QQkFTRV9NU0sJR0NNUEdDQk1TSyhHQ01QQl9HQ01QQkFTRSwgMTcpCi0jZGVmaW5lCSBHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9TSEYJMAotI2RlZmluZQkgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfTVNLCUdDTVBHQ0JNU0soR0NNUEJfQ01ERUZUR1QsIDIpCi0jZGVmaW5lCSBHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9ESVNBQkxFRAkwCi0jZGVmaW5lCSBHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9NRU0JCTEKLSNkZWZpbmUJIEdDTVBfR0NCX0dDTVBCX0NNREVGVEdUX0lPQ1UxCQkyCi0jZGVmaW5lCSBHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9JT0NVMgkJMwotI2RlZmluZSBHQ01QX0dDQl9DQ01DX09GUwkJMHgwMDEwCS8qIEdsb2JhbCBDTSBDb250cm9sICovCi0jZGVmaW5lIEdDTVBfR0NCX0dDU1JBUF9PRlMJCTB4MDAyMAkvKiBHbG9iYWwgQ1NSIEFjY2VzcyBQcml2aWxlZ2UgKi8KLSNkZWZpbmUJIEdDTVBfR0NCX0dDU1JBUF9DTUFDQ0VTU19TSEYJMAotI2RlZmluZQkgR0NNUF9HQ0JfR0NTUkFQX0NNQUNDRVNTX01TSwlHQ01QR0NCTVNLKEdDU1JBUF9DTUFDQ0VTUywgOCkKLSNkZWZpbmUgR0NNUF9HQ0JfR0NNUFJFVl9PRlMJCTB4MDAzMAkvKiBHQ01QIFJldmlzaW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIEdDTVBfR0NCX0dDTUVNX09GUwkJMHgwMDQwCS8qIEdsb2JhbCBDTSBFcnJvciBNYXNrICovCi0jZGVmaW5lIEdDTVBfR0NCX0dDTUVDX09GUwkJMHgwMDQ4CS8qIEdsb2JhbCBDTSBFcnJvciBDYXVzZSAqLwotI2RlZmluZQkgR0NNUF9HQ0JfR01FQ19FUlJPUl9UWVBFX1NIRgkyNwotI2RlZmluZQkgR0NNUF9HQ0JfR01FQ19FUlJPUl9UWVBFX01TSwlHQ01QR0NCTVNLKEdNRUNfRVJST1JfVFlQRSwgNSkKLSNkZWZpbmUJIEdDTVBfR0NCX0dNRUNfRVJST1JfSU5GT19TSEYJMAotI2RlZmluZQkgR0NNUF9HQ0JfR01FQ19FUlJPUl9JTkZPX01TSwlHQ01QR0NCTVNLKEdNRUNfRVJST1JfSU5GTywgMjcpCi0jZGVmaW5lIEdDTVBfR0NCX0dDTUVBX09GUwkJMHgwMDUwCS8qIEdsb2JhbCBDTSBFcnJvciBBZGRyZXNzICovCi0jZGVmaW5lIEdDTVBfR0NCX0dDTUVPX09GUwkJMHgwMDU4CS8qIEdsb2JhbCBDTSBFcnJvciBNdWx0aXBsZSAqLwotI2RlZmluZQkgR0NNUF9HQ0JfR01FT19FUlJPUl8yTkRfU0hGCTAKLSNkZWZpbmUJIEdDTVBfR0NCX0dNRU9fRVJST1JfMk5EX01TSwlHQ01QR0NCTVNLKEdNRU9fRVJST1JfMk5ELCA1KQotI2RlZmluZSBHQ01QX0dDQl9HSUNCQV9PRlMJCTB4MDA4MAkvKiBHbG9iYWwgSW50ZXJydXB0IENvbnRyb2xsZXIgQmFzZSBBZGRyZXNzICovCi0jZGVmaW5lCSBHQ01QX0dDQl9HSUNCQV9CQVNFX1NIRgkxNwotI2RlZmluZQkgR0NNUF9HQ0JfR0lDQkFfQkFTRV9NU0sJR0NNUEdDQk1TSyhHSUNCQV9CQVNFLCAxNSkKLSNkZWZpbmUJIEdDTVBfR0NCX0dJQ0JBX0VOX1NIRgkJMAotI2RlZmluZQkgR0NNUF9HQ0JfR0lDQkFfRU5fTVNLCQlHQ01QR0NCTVNLKEdJQ0JBX0VOLCAxKQotCi0vKiBHQ0IgUmVnaW9ucyAqLwotI2RlZmluZSBHQ01QX0dDQl9DTXhCQVNFX09GUyhuKQkJKDB4MDA5MCsxNioobikpCQkvKiBHbG9iYWwgUmVnaW9uWzAtM10gQmFzZSBBZGRyZXNzICovCi0jZGVmaW5lCSBHQ01QX0dDQl9DTXhCQVNFX0JBU0VfU0hGCTE2Ci0jZGVmaW5lCSBHQ01QX0dDQl9DTXhCQVNFX0JBU0VfTVNLCUdDTVBHQ0JNU0soQ014QkFTRV9CQVNFLCAxNikKLSNkZWZpbmUgR0NNUF9HQ0JfQ014TUFTS19PRlMobikJCSgweDAwOTgrMTYqKG4pKQkJLyogR2xvYmFsIFJlZ2lvblswLTNdIEFkZHJlc3MgTWFzayAqLwotI2RlZmluZQkgR0NNUF9HQ0JfQ014TUFTS19NQVNLX1NIRgkxNgotI2RlZmluZQkgR0NNUF9HQ0JfQ014TUFTS19NQVNLX01TSwlHQ01QR0NCTVNLKENNeE1BU0tfTUFTSywgMTYpCi0jZGVmaW5lCSBHQ01QX0dDQl9DTXhNQVNLX0NNUkVHVEdUX1NIRgkwCi0jZGVmaW5lCSBHQ01QX0dDQl9DTXhNQVNLX0NNUkVHVEdUX01TSwlHQ01QR0NCTVNLKENNeE1BU0tfQ01SRUdUR1QsIDIpCi0jZGVmaW5lCSBHQ01QX0dDQl9DTXhNQVNLX0NNUkVHVEdUX01FTQkgMAotI2RlZmluZQkgR0NNUF9HQ0JfQ014TUFTS19DTVJFR1RHVF9NRU0xCSAxCi0jZGVmaW5lCSBHQ01QX0dDQl9DTXhNQVNLX0NNUkVHVEdUX0lPQ1UxIDIKLSNkZWZpbmUJIEdDTVBfR0NCX0NNeE1BU0tfQ01SRUdUR1RfSU9DVTIgMwotCi0KLS8qIENvcmUgbG9jYWwvQ29yZSBvdGhlciBjb250cm9sIGJsb2NrIHJlZ2lzdGVycyAqLwotI2RlZmluZSBHQ01QX0NDQl9SRVNFVFJfT0ZTCQkweDAwMDAJCQkvKiBSZXNldCBSZWxlYXNlICovCi0jZGVmaW5lCSBHQ01QX0NDQl9SRVNFVFJfSU5SRVNFVF9TSEYJMAotI2RlZmluZQkgR0NNUF9DQ0JfUkVTRVRSX0lOUkVTRVRfTVNLCUdDTVBDQ0JNU0soUkVTRVRSX0lOUkVTRVQsIDE2KQotI2RlZmluZSBHQ01QX0NDQl9DT0hDVExfT0ZTCQkweDAwMDgJCQkvKiBDb2hlcmVuY2UgQ29udHJvbCAqLwotI2RlZmluZQkgR0NNUF9DQ0JfQ09IQ1RMX0RPTUFJTl9TSEYJMAotI2RlZmluZQkgR0NNUF9DQ0JfQ09IQ1RMX0RPTUFJTl9NU0sJR0NNUENDQk1TSyhDT0hDVExfRE9NQUlOLCA4KQotI2RlZmluZSBHQ01QX0NDQl9DRkdfT0ZTCQkweDAwMTAJCQkvKiBDb25maWcgKi8KLSNkZWZpbmUJIEdDTVBfQ0NCX0NGR19JT0NVVFlQRV9TSEYJMTAKLSNkZWZpbmUJIEdDTVBfQ0NCX0NGR19JT0NVVFlQRV9NU0sJR0NNUENDQk1TSyhDRkdfSU9DVVRZUEUsIDIpCi0jZGVmaW5lCSAgR0NNUF9DQ0JfQ0ZHX0lPQ1VUWVBFX0NQVQkwCi0jZGVmaW5lCSAgR0NNUF9DQ0JfQ0ZHX0lPQ1VUWVBFX05DSU9DVQkxCi0jZGVmaW5lCSAgR0NNUF9DQ0JfQ0ZHX0lPQ1VUWVBFX0NJT0NVCTIKLSNkZWZpbmUJIEdDTVBfQ0NCX0NGR19OVU1WUEVfU0hGCTAKLSNkZWZpbmUJIEdDTVBfQ0NCX0NGR19OVU1WUEVfTVNLCUdDTVBDQ0JNU0soQ0ZHX05VTVZQRSwgMTApCi0jZGVmaW5lIEdDTVBfQ0NCX09USEVSX09GUwkJMHgwMDE4CQkvKiBPdGhlciBBZGRyZXNzICovCi0jZGVmaW5lCSBHQ01QX0NDQl9PVEhFUl9DT1JFTlVNX1NIRgkxNgotI2RlZmluZQkgR0NNUF9DQ0JfT1RIRVJfQ09SRU5VTV9NU0sJR0NNUENDQk1TSyhPVEhFUl9DT1JFTlVNLCAxNikKLSNkZWZpbmUgR0NNUF9DQ0JfUkVTRVRCQVNFX09GUwkJMHgwMDIwCQkvKiBSZXNldCBFeGNlcHRpb24gQmFzZSAqLwotI2RlZmluZQkgR0NNUF9DQ0JfUkVTRVRCQVNFX0JFVl9TSEYJMTIKLSNkZWZpbmUJIEdDTVBfQ0NCX1JFU0VUQkFTRV9CRVZfTVNLCUdDTVBDQ0JNU0soUkVTRVRCQVNFX0JFViwgMjApCi0jZGVmaW5lIEdDTVBfQ0NCX0lEX09GUwkJCTB4MDAyOAkJLyogSWRlbnRpZmljYXRpb24gKi8KLSNkZWZpbmUgR0NNUF9DQ0JfRElOVEdST1VQX09GUwkJMHgwMDMwCQkvKiBESU5UIEdyb3VwIFBhcnRpY2lwYXRlICovCi0jZGVmaW5lIEdDTVBfQ0NCX0RCR0dST1VQX09GUwkJMHgwMTAwCQkvKiBEZWJ1Z0JyZWFrIEdyb3VwICovCi0KLWV4dGVybiBpbnQgX19pbml0IGdjbXBfcHJvYmUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gaW50IF9faW5pdCBnY21wX25pb2N1KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGdjbXBfc2V0cmVnaW9uKGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKLSNlbmRpZiAvKiBfQVNNX0dDTVBSRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9naWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9naWMuaAppbmRleCBiMmUzZTkzLi4wODI3MTY2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2ljLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2dpYy5oCkBAIC0xMSw2ICsxMSw5IEBACiAjaWZuZGVmIF9BU01fR0lDUkVHU19ICiAjZGVmaW5lIF9BU01fR0lDUkVHU19ICiAKKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisKICN1bmRlZglHSUNJU0JZVEVMSVRUTEVFTkRJQU4KIAogLyogQ29uc3RhbnRzICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pby5oCmluZGV4IDMzMjFkZDUuLjkzM2I1MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pby5oCkBAIC0zMzEsNyArMzMxLDcgQEAKIAkJaWYgKGlycSkJCQkJCQlcCiAJCQlsb2NhbF9pcnFfc2F2ZShfX2ZsYWdzKTsJCQlcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCQkJIi5zZXQJbWlwczMiCQkiXHRcdCMgX193cml0ZXEiIlxuXHQiCVwKKwkJCSIuc2V0CWFyY2g9cjQwMDAiCSJcdFx0IyBfX3dyaXRlcSIiXG5cdCIJXAogCQkJImRzbGwzMiAlTDAsICVMMCwgMCIJCQkiXG5cdCIJXAogCQkJImRzcmwzMiAlTDAsICVMMCwgMCIJCQkiXG5cdCIJXAogCQkJImRzbGwzMiAlTTAsICVNMCwgMCIJCQkiXG5cdCIJXApAQCAtMzYxLDcgKzM2MSw3IEBACiAJCWlmIChpcnEpCQkJCQkJXAogCQkJbG9jYWxfaXJxX3NhdmUoX19mbGFncyk7CQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKLQkJCSIuc2V0CW1pcHMzIgkJIlx0XHQjIF9fcmVhZHEiICJcblx0IglcCisJCQkiLnNldAlhcmNoPXI0MDAwIgkiXHRcdCMgX19yZWFkcSIgIlxuXHQiCVwKIAkJCSJsZAklTDAsICUxIgkJCSJcblx0IglcCiAJCQkiZHNyYTMyICVNMCwgJUwwLCAwIgkJCSJcblx0IglcCiAJCQkic2xsCSVMMCwgJUwwLCAwIgkJCSJcblx0IglcCkBAIC01ODQsNyArNTg0LDcgQEAKICAqCiAgKiBUaGlzIEFQSSB1c2VkIHRvIGJlIGV4cG9ydGVkOyBpdCBub3cgaXMgZm9yIGFyY2ggY29kZSBpbnRlcm5hbCB1c2Ugb25seS4KICAqLwotI2lmZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKKyNpZiBkZWZpbmVkKENPTkZJR19ETUFfTk9OQ09IRVJFTlQpIHx8IGRlZmluZWQoQ09ORklHX0RNQV9NQVlCRV9DT0hFUkVOVCkKIAogZXh0ZXJuIHZvaWQgKCpfZG1hX2NhY2hlX3diYWNrX2ludikodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkICgqX2RtYV9jYWNoZV93YmFjaykodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKQEAgLTYwMyw3ICs2MDMsNyBAQAogI2RlZmluZSBkbWFfY2FjaGVfaW52KHN0YXJ0LHNpemUpCVwKIAlkbyB7ICh2b2lkKSAoc3RhcnQpOyAodm9pZCkgKHNpemUpOyB9IHdoaWxlICgwKQogCi0jZW5kaWYgLyogQ09ORklHX0RNQV9OT05DT0hFUkVOVCAqLworI2VuZGlmIC8qIENPTkZJR19ETUFfTk9OQ09IRVJFTlQgfHwgQ09ORklHX0RNQV9NQVlCRV9DT0hFUkVOVCAqLwogCiAvKgogICogUmVhZCBhIDMyLWJpdCByZWdpc3RlciB0aGF0IHJlcXVpcmVzIGEgNjQtYml0IHJlYWQgY3ljbGUgb24gdGhlIGJ1cy4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9sb2NhbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xvY2FsLmgKaW5kZXggZDQ0NjIyYy4uNDZkZmMzYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xvY2FsLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xvY2FsLmgKQEAgLTMzLDcgKzMzLDcgQEAKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6IglfX0xMCSIlMSwgJTIJCSMgbG9jYWxfYWRkX3JldHVybglcbiIKIAkJIglhZGR1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCQlfX1NDCSIlMCwgJTIJCQkJCVxuIgpAQCAtNDcsNyArNDcsNyBAQAogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCQkJCVxuIgogCQkiMToiCV9fTEwJIiUxLCAlMgkJIyBsb2NhbF9hZGRfcmV0dXJuCVxuIgogCQkiCWFkZHUJJTAsICUxLCAlMwkJCQlcbiIKIAkJCV9fU0MJIiUwLCAlMgkJCQkJXG4iCkBAIC03OCw3ICs3OCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIxOiIJX19MTAkiJTEsICUyCQkjIGxvY2FsX3N1Yl9yZXR1cm4JXG4iCiAJCSIJc3VidQklMCwgJTEsICUzCQkJCVxuIgogCQkJX19TQwkiJTAsICUyCQkJCQlcbiIKQEAgLTkyLDcgKzkyLDcgQEAKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIjE6IglfX0xMCSIlMSwgJTIJCSMgbG9jYWxfc3ViX3JldHVybglcbiIKIAkJIglzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCQlfX1NDCSIlMCwgJTIJCQkJCVxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oCmluZGV4IDU0ZjllODQuLmI0YzNlY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKQEAgLTExNjEsMTggKzExNjEsNiBAQAogI2RlZmluZSBNQUNfUlhfQlVGRjNfU1RBVFVTCTB4MzAKICNkZWZpbmUgTUFDX1JYX0JVRkYzX0FERFIJMHgzNAogCi0jZGVmaW5lIFVBUlRfUlgJCTAJLyogUmVjZWl2ZSBidWZmZXIgKi8KLSNkZWZpbmUgVUFSVF9UWAkJNAkvKiBUcmFuc21pdCBidWZmZXIgKi8KLSNkZWZpbmUgVUFSVF9JRVIJOAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfSUlSCTB4QwkvKiBJbnRlcnJ1cHQgSUQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUFSVF9GQ1IJMHgxMAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUFSVF9MQ1IJMHgxNAkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUFSVF9NQ1IJMHgxOAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFVBUlRfTFNSCTB4MUMJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUFSVF9NU1IJMHgyMAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUFSVF9DTEsJMHgyOAkvKiBCYXVkIFJhdGUgQ2xvY2sgRGl2aWRlciAqLwotI2RlZmluZSBVQVJUX01PRF9DTlRSTAkweDEwMAkvKiBNb2R1bGUgQ29udHJvbCAqLwotCiAvKiBTU0lPICovCiAjZGVmaW5lIFNTSTBfU1RBVFVTCQkweEIxNjAwMDAwCiAjICBkZWZpbmUgU1NJX1NUQVRVU19CRgkJKDEgPDwgNCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvYmNtNDd4eF9ib2FyZC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9iY200N3h4X2JvYXJkLmgKaW5kZXggNDAwMDVmYi4uYmJhNzM5OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9iY200N3h4X2JvYXJkLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9iY200N3h4X2JvYXJkLmgKQEAgLTI3LDcgKzI3LDExIEBACiAJQkNNNDdYWF9CT0FSRF9BU1VTX1dMNzAwR0UsCiAJQkNNNDdYWF9CT0FSRF9BU1VTX1dMSERELAogCisJQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdEMzMwMSwKKwlCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0QzMzAyLAogCUJDTTQ3WFhfQk9BUkRfQkVMS0lOX0Y3RDQzMDEsCisJQkNNNDdYWF9CT0FSRF9CRUxLSU5fRjdENDMwMiwKKwlCQ000N1hYX0JPQVJEX0JFTEtJTl9GN0Q0NDAxLAogCiAJQkNNNDdYWF9CT0FSRF9CVUZGQUxPX1dCUjJfRzU0LAogCUJDTTQ3WFhfQk9BUkRfQlVGRkFMT19XSFIyX0E1NEc1NCwKQEAgLTY2LDcgKzcwLDcgQEAKIAlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUMzEwTlYxLAogCUJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQzMTBOVjIsCiAJQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0RzNHVjIsCi0JQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDU0R1NWMSwKKwlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUNTRHLAogCUJDTTQ3WFhfQk9BUkRfTElOS1NZU19XUlQ2MTBOVjEsCiAJQkNNNDdYWF9CT0FSRF9MSU5LU1lTX1dSVDYxME5WMiwKIAlCQ000N1hYX0JPQVJEX0xJTktTWVNfV1JUU0w1NEdTLApAQCAtOTQsNiArOTgsOCBAQAogCiAJQkNNNDdYWF9CT0FSRF9QSElDT01NX00xLAogCisJQkNNNDdYWF9CT0FSRF9TSUVNRU5TX1NFNTA1VjIsCisKIAlCQ000N1hYX0JPQVJEX1NJTVBMRVRFQ0hfU0lNUExFU0hBUkUsCiAKIAlCQ000N1hYX0JPQVJEX1pURV9IMjE4TiwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjEyMDAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjEyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjY2U3My4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQU1EIEFsY2hlbXkgREJBdTEyMDAgUmVmZXJlbmNlIEJvYXJkCi0gKiBCb2FyZCByZWdpc3RlciBkZWZpbmVzLgotICoKLSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICoKLSAqCi0gKi8KLSNpZm5kZWYgX19BU01fREIxMjAwX0gKLSNkZWZpbmUgX19BU01fREIxMjAwX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+Ci0KLS8qIEJpdCBwb3NpdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgaW50ZXJydXB0IHNvdXJjZXMgKi8KLSNkZWZpbmUgQkNTUl9JTlRfSURFCQkweDAwMDEKLSNkZWZpbmUgQkNTUl9JTlRfRVRICQkweDAwMDIKLSNkZWZpbmUgQkNTUl9JTlRfUEMwCQkweDAwMDQKLSNkZWZpbmUgQkNTUl9JTlRfUEMwU1RTQ0hHCTB4MDAwOAotI2RlZmluZSBCQ1NSX0lOVF9QQzEJCTB4MDAxMAotI2RlZmluZSBCQ1NSX0lOVF9QQzFTVFNDSEcJMHgwMDIwCi0jZGVmaW5lIEJDU1JfSU5UX0RDCQkweDAwNDAKLSNkZWZpbmUgQkNTUl9JTlRfRkxBU0hCVVNZCTB4MDA4MAotI2RlZmluZSBCQ1NSX0lOVF9QQzBJTlNFUlQJMHgwMTAwCi0jZGVmaW5lIEJDU1JfSU5UX1BDMEVKRUNUCTB4MDIwMAotI2RlZmluZSBCQ1NSX0lOVF9QQzFJTlNFUlQJMHgwNDAwCi0jZGVmaW5lIEJDU1JfSU5UX1BDMUVKRUNUCTB4MDgwMAotI2RlZmluZSBCQ1NSX0lOVF9TRDBJTlNFUlQJMHgxMDAwCi0jZGVmaW5lIEJDU1JfSU5UX1NEMEVKRUNUCTB4MjAwMAotI2RlZmluZSBCQ1NSX0lOVF9TRDFJTlNFUlQJMHg0MDAwCi0jZGVmaW5lIEJDU1JfSU5UX1NEMUVKRUNUCTB4ODAwMAotCi0jZGVmaW5lIElERV9SRUdfU0hJRlQJCTUKLQotI2RlZmluZSBEQjEyMDBfSURFX1BIWVNfQUREUgkweDE4ODAwMDAwCi0jZGVmaW5lIERCMTIwMF9JREVfUEhZU19MRU4JKDE2IDw8IElERV9SRUdfU0hJRlQpCi0jZGVmaW5lIERCMTIwMF9FVEhfUEhZU19BRERSCTB4MTkwMDAzMDAKLSNkZWZpbmUgREIxMjAwX05BTkRfUEhZU19BRERSCTB4MjAwMDAwMDAKLQotI2RlZmluZSBQQjEyMDBfSURFX1BIWVNfQUREUgkweDBDODAwMDAwCi0jZGVmaW5lIFBCMTIwMF9FVEhfUEhZU19BRERSCTB4MEQwMDAzMDAKLSNkZWZpbmUgUEIxMjAwX05BTkRfUEhZU19BRERSCTB4MUMwMDAwMDAKLQotLyoKLSAqIEV4dGVybmFsIEludGVycnVwdHMgZm9yIERCQXUxMjAwIGFzIG9mIDgvNi8yMDA0LgotICogQml0IHBvc2l0aW9ucyBpbiB0aGUgQ1BMRCByZWdpc3RlcnMgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgdGFraW5nCi0gKiB0aGUgaW50ZXJydXB0IGRlZmluZSBhbmQgc3VidHJhY3RpbmcgdGhlIERCMTIwMF9JTlRfQkVHSU4gdmFsdWUuCi0gKgotICogICBFeGFtcGxlOiBJREUgYmlzIHBvcyBpcyAgPSA2NCAtIDY0Ci0gKgkgICAgICBFVEggYml0IHBvcyBpcyAgPSA2NSAtIDY0Ci0gKi8KLWVudW0gZXh0ZXJuYWxfZGIxMjAwX2ludHMgewotCURCMTIwMF9JTlRfQkVHSU4JPSBBVTEwMDBfTUFYX0lOVFIgKyAxLAotCi0JREIxMjAwX0lERV9JTlQJCT0gREIxMjAwX0lOVF9CRUdJTiwKLQlEQjEyMDBfRVRIX0lOVCwKLQlEQjEyMDBfUEMwX0lOVCwKLQlEQjEyMDBfUEMwX1NUU0NIR19JTlQsCi0JREIxMjAwX1BDMV9JTlQsCi0JREIxMjAwX1BDMV9TVFNDSEdfSU5ULAotCURCMTIwMF9EQ19JTlQsCi0JREIxMjAwX0ZMQVNIQlVTWV9JTlQsCi0JREIxMjAwX1BDMF9JTlNFUlRfSU5ULAotCURCMTIwMF9QQzBfRUpFQ1RfSU5ULAotCURCMTIwMF9QQzFfSU5TRVJUX0lOVCwKLQlEQjEyMDBfUEMxX0VKRUNUX0lOVCwKLQlEQjEyMDBfU0QwX0lOU0VSVF9JTlQsCi0JREIxMjAwX1NEMF9FSkVDVF9JTlQsCi0JUEIxMjAwX1NEMV9JTlNFUlRfSU5ULAotCVBCMTIwMF9TRDFfRUpFQ1RfSU5ULAotCi0JREIxMjAwX0lOVF9FTkQJCT0gREIxMjAwX0lOVF9CRUdJTiArIDE1LAotfTsKLQotI2VuZGlmIC8qIF9fQVNNX0RCMTIwMF9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMzAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWVkZTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIE5ldExvZ2ljIERCMTMwMCBib2FyZCBjb25zdGFudHMKLSAqLwotCi0jaWZuZGVmIF9EQjEzMDBfSF8KLSNkZWZpbmUgX0RCMTMwMF9IXwotCi0vKiBGUEdBIChleHRlcm5hbCBtdXgpIGludGVycnVwdCBzb3VyY2VzICovCi0jZGVmaW5lIERCMTMwMF9GSVJTVF9JTlQJKEFMQ0hFTVlfR1BJQ19JTlRfTEFTVCArIDEpCi0jZGVmaW5lIERCMTMwMF9JREVfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDApCi0jZGVmaW5lIERCMTMwMF9FVEhfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDEpCi0jZGVmaW5lIERCMTMwMF9DRl9JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgMikKLSNkZWZpbmUgREIxMzAwX1ZJREVPX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDQpCi0jZGVmaW5lIERCMTMwMF9IRE1JX0lOVAkJKERCMTMwMF9GSVJTVF9JTlQgKyA1KQotI2RlZmluZSBEQjEzMDBfRENfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDYpCi0jZGVmaW5lIERCMTMwMF9GTEFTSF9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyA3KQotI2RlZmluZSBEQjEzMDBfQ0ZfSU5TRVJUX0lOVAkoREIxMzAwX0ZJUlNUX0lOVCArIDgpCi0jZGVmaW5lIERCMTMwMF9DRl9FSkVDVF9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyA5KQotI2RlZmluZSBEQjEzMDBfQUM5N19JTlQJCShEQjEzMDBfRklSU1RfSU5UICsgMTApCi0jZGVmaW5lIERCMTMwMF9BQzk3X1BFTl9JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyAxMSkKLSNkZWZpbmUgREIxMzAwX1NEMV9JTlNFUlRfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgMTIpCi0jZGVmaW5lIERCMTMwMF9TRDFfRUpFQ1RfSU5UCShEQjEzMDBfRklSU1RfSU5UICsgMTMpCi0jZGVmaW5lIERCMTMwMF9PVEdfVkJVU19PQ19JTlQJKERCMTMwMF9GSVJTVF9JTlQgKyAxNCkKLSNkZWZpbmUgREIxMzAwX0hPU1RfVkJVU19PQ19JTlQgKERCMTMwMF9GSVJTVF9JTlQgKyAxNSkKLSNkZWZpbmUgREIxMzAwX0xBU1RfSU5UCQkoREIxMzAwX0ZJUlNUX0lOVCArIDE1KQotCi0vKiBTTVNDOTIxMCBDUyAqLwotI2RlZmluZSBEQjEzMDBfRVRIX1BIWVNfQUREUgkweDE5MDAwMDAwCi0jZGVmaW5lIERCMTMwMF9FVEhfUEhZU19FTkQJMHgxOTdmZmZmZgotCi0vKiBBVEEgQ1MgKi8KLSNkZWZpbmUgREIxMzAwX0lERV9QSFlTX0FERFIJMHgxODgwMDAwMAotI2RlZmluZSBEQjEzMDBfSURFX1JFR19TSElGVAk1Ci0jZGVmaW5lIERCMTMwMF9JREVfUEhZU19MRU4JKDE2IDw8IERCMTMwMF9JREVfUkVHX1NISUZUKQotCi0vKiBOQU5EIENTICovCi0jZGVmaW5lIERCMTMwMF9OQU5EX1BIWVNfQUREUgkweDIwMDAwMDAwCi0jZGVmaW5lIERCMTMwMF9OQU5EX1BIWVNfRU5ECTB4MjAwMDBmZmYKLQotI2VuZGlmCS8qIF9EQjEzMDBfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2Jvb3RfcGFyYW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2Jvb3RfcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjlhN2VjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vYm9vdF9wYXJhbS5oCkBAIC0wLDAgKzEsMTYzIEBACisjaWZuZGVmIF9fQVNNX01BQ0hfTE9PTkdTT05fQk9PVF9QQVJBTV9IXworI2RlZmluZSBfX0FTTV9NQUNIX0xPT05HU09OX0JPT1RfUEFSQU1fSF8KKworI2RlZmluZSBTWVNURU1fUkFNX0xPVwkJMQorI2RlZmluZSBTWVNURU1fUkFNX0hJR0gJCTIKKyNkZWZpbmUgTUVNX1JFU0VSVkVECQkzCisjZGVmaW5lIFBDSV9JTwkJCTQKKyNkZWZpbmUgUENJX01FTQkJCTUKKyNkZWZpbmUgTE9PTkdTT05fQ0ZHX1JFRwk2CisjZGVmaW5lIFZJREVPX1JPTQkJNworI2RlZmluZSBBREFQVEVSX1JPTQkJOAorI2RlZmluZSBBQ1BJX1RBQkxFCQk5CisjZGVmaW5lIE1BWF9NRU1PUllfVFlQRQkJMTAKKworI2RlZmluZSBMT09OR1NPTjNfQk9PVF9NRU1fTUFQX01BWCAxMjgKK3N0cnVjdCBlZmlfbWVtb3J5X21hcF9sb29uZ3NvbiB7CisJdTE2IHZlcnM7CS8qIHZlcnNpb24gb2YgZWZpX21lbW9yeV9tYXAgKi8KKwl1MzIgbnJfbWFwOwkvKiBudW1iZXIgb2YgbWVtb3J5X21hcHMgKi8KKwl1MzIgbWVtX2ZyZXE7CS8qIG1lbW9yeSBmcmVxdWVuY2UgKi8KKwlzdHJ1Y3QgbWVtX21hcCB7CisJCXUzMiBub2RlX2lkOwkvKiBub2RlX2lkIHdoaWNoIG1lbW9yeSBhdHRhY2hlZCB0byAqLworCQl1MzIgbWVtX3R5cGU7CS8qIHN5c3RlbSBtZW1vcnksIHBjaSBtZW1vcnksIHBjaSBpbywgZXRjLiAqLworCQl1NjQgbWVtX3N0YXJ0OwkvKiBtZW1vcnkgbWFwIHN0YXJ0IGFkZHJlc3MgKi8KKwkJdTMyIG1lbV9zaXplOwkvKiBlYWNoIG1lbW9yeV9tYXAgc2l6ZSwgbm90IHRoZSB0b3RhbCBzaXplICovCisJfSBtYXBbTE9PTkdTT04zX0JPT1RfTUVNX01BUF9NQVhdOworfSBfX3BhY2tlZDsKKworZW51bSBsb29uZ3Nvbl9jcHVfdHlwZSB7CisJTG9vbmdzb25fMkUgPSAwLAorCUxvb25nc29uXzJGID0gMSwKKwlMb29uZ3Nvbl8zQSA9IDIsCisJTG9vbmdzb25fM0IgPSAzLAorCUxvb25nc29uXzFBID0gNCwKKwlMb29uZ3Nvbl8xQiA9IDUKK307CisKKy8qCisgKiBDYXBhYmlsaXR5IGFuZCBmZWF0dXJlIGRlc2NyaXB0b3Igc3RydWN0dXJlIGZvciBNSVBTIENQVQorICovCitzdHJ1Y3QgZWZpX2NwdWluZm9fbG9vbmdzb24geworCXUxNiB2ZXJzOyAgICAgLyogdmVyc2lvbiBvZiBlZmlfY3B1aW5mb19sb29uZ3NvbiAqLworCXUzMiBwcm9jZXNzb3JfaWQ7IC8qIFBSSUQsIGUuZy4gNjMwNSwgNjMwNiAqLworCXUzMiBjcHV0eXBlOyAgLyogTG9vbmdzb25fM0EvM0IsIGV0Yy4gKi8KKwl1MzIgdG90YWxfbm9kZTsgICAvKiBudW0gb2YgdG90YWwgbnVtYSBub2RlcyAqLworCXUzMiBjcHVfc3RhcnR1cF9jb3JlX2lkOyAvKiBDb3JlIGlkICovCisJdTMyIGNwdV9jbG9ja19mcmVxOyAvKiBjcHVfY2xvY2sgKi8KKwl1MzIgbnJfY3B1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzeXN0ZW1fbG9vbmdzb24geworCXUxNiB2ZXJzOyAgICAgLyogdmVyc2lvbiBvZiBzeXN0ZW1fbG9vbmdzb24gKi8KKwl1MzIgY2NudW1hX3NtcDsgLyogMDogbm8gbnVtYTsgMTogaGFzIG51bWEgKi8KKwl1MzIgc2luZ19kb3VibGVfY2hhbm5lbDsgLyogMTpzaW5nbGU7IDI6ZG91YmxlICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXJxX3NvdXJjZV9yb3V0aW5nX3RhYmxlIHsKKwl1MTYgdmVyczsKKwl1MTYgc2l6ZTsKKwl1MTYgcnRyX2J1czsKKwl1MTYgcnRyX2RldmZuOworCXUzMiB2ZW5kb3I7CisJdTMyIGRldmljZTsKKwl1MzIgUElDX3R5cGU7ICAgLyogY29uZm9ybSB1c2UgSFQgb3IgUENJIHRvIHJvdXRlIHRvIENQVS1QSUMgKi8KKwl1NjQgaHRfaW50X2JpdDsgLyogM0E6IDE8PDI0OyAzQjogMTw8MTYgKi8KKwl1NjQgaHRfZW5hYmxlOyAgLyogaXJxcyB1c2VkIGluIHRoaXMgUElDICovCisJdTMyIG5vZGVfaWQ7ICAgIC8qIG5vZGUgaWQ6IDB4MC0wOyAweDEtMTsgMHgxMC0yOyAweDExLTMgKi8KKwl1NjQgcGNpX21lbV9zdGFydF9hZGRyOworCXU2NCBwY2lfbWVtX2VuZF9hZGRyOworCXU2NCBwY2lfaW9fc3RhcnRfYWRkcjsKKwl1NjQgcGNpX2lvX2VuZF9hZGRyOworCXU2NCBwY2lfY29uZmlnX2FkZHI7CisJdTMyIGRtYV9tYXNrX2JpdHM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaW50ZXJmYWNlX2luZm8geworCXUxNiB2ZXJzOyAvKiB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2l0aW9uICovCisJdTE2IHNpemU7CisJdTggIGZsYWc7CisJY2hhciBkZXNjcmlwdGlvbls2NF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1BWF9SRVNPVVJDRV9OVU1CRVIgMTI4CitzdHJ1Y3QgcmVzb3VyY2VfbG9vbmdzb24geworCXU2NCBzdGFydDsgLyogcmVzb3VyY2Ugc3RhcnQgYWRkcmVzcyAqLworCXU2NCBlbmQ7ICAgLyogcmVzb3VyY2UgZW5kIGFkZHJlc3MgKi8KKwljaGFyIG5hbWVbNjRdOworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCBhcmNoZGV2X2RhdGEge307ICAvKiBhcmNoIHNwZWNpZmljIGFkZGl0aW9ucyAqLworCitzdHJ1Y3QgYm9hcmRfZGV2aWNlcyB7CisJY2hhciBuYW1lWzY0XTsgICAgLyogaG9sZCB0aGUgZGV2aWNlIG5hbWUgKi8KKwl1MzIgbnVtX3Jlc291cmNlczsgLyogbnVtYmVyIG9mIGRldmljZV9yZXNvdXJjZSAqLworCS8qIGZvciBlYWNoIGRldmljZSdzIHJlc291cmNlICovCisJc3RydWN0IHJlc291cmNlX2xvb25nc29uIHJlc291cmNlW01BWF9SRVNPVVJDRV9OVU1CRVJdOworCS8qIGFyY2ggc3BlY2lmaWMgYWRkaXRpb25zICovCisJc3RydWN0IGFyY2hkZXZfZGF0YSBhcmNoZGF0YTsKK307CisKK3N0cnVjdCBsb29uZ3Nvbl9zcGVjaWFsX2F0dHJpYnV0ZSB7CisJdTE2IHZlcnM7ICAgICAvKiB2ZXJzaW9uIG9mIHRoaXMgc3BlY2lhbCAqLworCWNoYXIgc3BlY2lhbF9uYW1lWzY0XTsgLyogc3BlY2lhbF9hdHJpYnV0ZV9uYW1lICovCisJdTMyIGxvb25nc29uX3NwZWNpYWxfdHlwZTsgLyogdHlwZSBvZiBzcGVjaWFsIGRldmljZSAqLworCS8qIGZvciBlYWNoIGRldmljZSdzIHJlc291cmNlICovCisJc3RydWN0IHJlc291cmNlX2xvb25nc29uIHJlc291cmNlW01BWF9SRVNPVVJDRV9OVU1CRVJdOworfTsKKworc3RydWN0IGxvb25nc29uX3BhcmFtcyB7CisJdTY0IG1lbW9yeV9vZmZzZXQ7CS8qIGVmaV9tZW1vcnlfbWFwX2xvb25nc29uIHN0cnVjdCBvZmZzZXQgKi8KKwl1NjQgY3B1X29mZnNldDsJCS8qIGVmaV9jcHVpbmZvX2xvb25nc29uIHN0cnVjdCBvZmZzZXQgKi8KKwl1NjQgc3lzdGVtX29mZnNldDsJLyogc3lzdGVtX2xvb25nc29uIHN0cnVjdCBvZmZzZXQgKi8KKwl1NjQgaXJxX29mZnNldDsJCS8qIGlycV9zb3VyY2Vfcm91dGluZ190YWJsZSBzdHJ1Y3Qgb2Zmc2V0ICovCisJdTY0IGludGVyZmFjZV9vZmZzZXQ7CS8qIGludGVyZmFjZV9pbmZvIHN0cnVjdCBvZmZzZXQgKi8KKwl1NjQgc3BlY2lhbF9vZmZzZXQ7CS8qIGxvb25nc29uX3NwZWNpYWxfYXR0cmlidXRlIHN0cnVjdCBvZmZzZXQgKi8KKwl1NjQgYm9hcmRkZXZfdGFibGVfb2Zmc2V0OyAgLyogYm9hcmRfZGV2aWNlcyBvZmZzZXQgKi8KK307CisKK3N0cnVjdCBzbWJpb3NfdGFibGVzIHsKKwl1MTYgdmVyczsgICAgIC8qIHZlcnNpb24gb2Ygc21iaW9zICovCisJdTY0IHZnYV9iaW9zOyAvKiB2Z2FfYmlvcyBhZGRyZXNzICovCisJc3RydWN0IGxvb25nc29uX3BhcmFtcyBscDsKK307CisKK3N0cnVjdCBlZmlfcmVzZXRfc3lzdGVtX3QgeworCXU2NCBSZXNldENvbGQ7CisJdTY0IFJlc2V0V2FybTsKKwl1NjQgUmVzZXRUeXBlOworCXU2NCBTaHV0ZG93bjsKKwl1NjQgRG9TdXNwZW5kOyAvKiBOVUxMIGlmIG5vdCBzdXBwb3J0ICovCit9OworCitzdHJ1Y3QgZWZpX2xvb25nc29uIHsKKwl1NjQgbXBzOwkvKiBNUFMgdGFibGUgKi8KKwl1NjQgYWNwaTsJLyogQUNQSSB0YWJsZSAoSUE2NCBleHQgMC43MSkgKi8KKwl1NjQgYWNwaTIwOwkvKiBBQ1BJIHRhYmxlIChBQ1BJIDIuMCkgKi8KKwlzdHJ1Y3Qgc21iaW9zX3RhYmxlcyBzbWJpb3M7CS8qIFNNIEJJT1MgdGFibGUgKi8KKwl1NjQgc2FsX3N5c3RhYjsJLyogU0FMIHN5c3RlbSB0YWJsZSAqLworCXU2NCBib290X2luZm87CS8qIGJvb3QgaW5mbyB0YWJsZSAqLworfTsKKworc3RydWN0IGJvb3RfcGFyYW1zIHsKKwlzdHJ1Y3QgZWZpX2xvb25nc29uIGVmaTsKKwlzdHJ1Y3QgZWZpX3Jlc2V0X3N5c3RlbV90IHJlc2V0X3N5c3RlbTsKK307CisKK3N0cnVjdCBsb29uZ3Nvbl9zeXN0ZW1fY29uZmlndXJhdGlvbiB7CisJdTMyIG5yX2NwdXM7CisJZW51bSBsb29uZ3Nvbl9jcHVfdHlwZSBjcHV0eXBlOworCXU2NCBodF9jb250cm9sX2Jhc2U7CisJdTY0IHBjaV9tZW1fc3RhcnRfYWRkcjsKKwl1NjQgcGNpX21lbV9lbmRfYWRkcjsKKwl1NjQgcGNpX2lvX2Jhc2U7CisJdTY0IHJlc3RhcnRfYWRkcjsKKwl1NjQgcG93ZXJvZmZfYWRkcjsKKwl1NjQgc3VzcGVuZF9hZGRyOworCXU2NCB2Z2FiaW9zX2FkZHI7CisJdTMyIGRtYV9tYXNrX2JpdHM7Cit9OworCitleHRlcm4gc3RydWN0IGVmaV9tZW1vcnlfbWFwX2xvb25nc29uICpsb29uZ3Nvbl9tZW1tYXA7CitleHRlcm4gc3RydWN0IGxvb25nc29uX3N5c3RlbV9jb25maWd1cmF0aW9uIGxvb25nc29uX3N5c2NvbmY7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2RtYS1jb2hlcmVuY2UuaAppbmRleCBhZWIyYzA1Li42YTkwMjc1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9kbWEtY29oZXJlbmNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vZG1hLWNvaGVyZW5jZS5oCkBAIC0xMSwyNCArMTEsNDAgQEAKICNpZm5kZWYgX19BU01fTUFDSF9MT09OR1NPTl9ETUFfQ09IRVJFTkNFX0gKICNkZWZpbmUgX19BU01fTUFDSF9MT09OR1NPTl9ETUFfQ09IRVJFTkNFX0gKIAorI2lmZGVmIENPTkZJR19TV0lPVExCCisjaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgorI2VuZGlmCisKIHN0cnVjdCBkZXZpY2U7CiAKK2V4dGVybiBkbWFfYWRkcl90IHBoeXNfdG9fZG1hKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgcGFkZHIpOworZXh0ZXJuIHBoeXNfYWRkcl90IGRtYV90b19waHlzKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkYWRkcik7CiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgcGxhdF9tYXBfZG1hX21lbShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIsCiAJCQkJCSAgc2l6ZV90IHNpemUpCiB7CisjaWZkZWYgQ09ORklHX0NQVV9MT09OR1NPTjMKKwlyZXR1cm4gdmlydF90b19waHlzKGFkZHIpOworI2Vsc2UKIAlyZXR1cm4gdmlydF90b19waHlzKGFkZHIpIHwgMHg4MDAwMDAwMDsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgcGxhdF9tYXBfZG1hX21lbV9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBwYWdlICpwYWdlKQogeworI2lmZGVmIENPTkZJR19DUFVfTE9PTkdTT04zCisJcmV0dXJuIHBhZ2VfdG9fcGh5cyhwYWdlKTsKKyNlbHNlCiAJcmV0dXJuIHBhZ2VfdG9fcGh5cyhwYWdlKSB8IDB4ODAwMDAwMDA7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBsYXRfZG1hX2FkZHJfdG9fcGh5cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfTE9PTkdTT04yRikgJiYgZGVmaW5lZChDT05GSUdfNjRCSVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0xPT05HU09OMykgJiYgZGVmaW5lZChDT05GSUdfNjRCSVQpCisJcmV0dXJuIGRtYV9hZGRyOworI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX0xPT05HU09OMkYpICYmIGRlZmluZWQoQ09ORklHXzY0QklUKQogCXJldHVybiAoZG1hX2FkZHIgPiAweDhmZmZmZmZmKSA/IGRtYV9hZGRyIDogKGRtYV9hZGRyICYgMHgwZmZmZmZmZik7CiAjZWxzZQogCXJldHVybiBkbWFfYWRkciAmIDB4N2ZmZmZmZmY7CkBAIC01NSw3ICs3MSwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwbGF0X2RldmljZV9pc19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisjaWZkZWYgQ09ORklHX0RNQV9OT05DT0hFUkVOVAogCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gMTsKKyNlbmRpZiAvKiBDT05GSUdfRE1BX05PTkNPSEVSRU5UICovCiB9CiAKICNlbmRpZiAvKiBfX0FTTV9NQUNIX0xPT05HU09OX0RNQV9DT0hFUkVOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDU2MGJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vaXJxLmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0xPT05HU09OX0lSUV9IXworI2RlZmluZSBfX0FTTV9NQUNIX0xPT05HU09OX0lSUV9IXworCisjaW5jbHVkZSA8Ym9vdF9wYXJhbS5oPgorCisjaWZkZWYgQ09ORklHX0NQVV9MT09OR1NPTjMKKworLyogY3B1IGNvcmUgaW50ZXJydXB0IG51bWJlcnMgKi8KKyNkZWZpbmUgTUlQU19DUFVfSVJRX0JBU0UgNTYKKworI2RlZmluZSBMT09OR1NPTl9VQVJUX0lSUSAgIChNSVBTX0NQVV9JUlFfQkFTRSArIDIpIC8qIFVBUlQgKi8KKyNkZWZpbmUgTE9PTkdTT05fSFQxX0lSUSAgICAoTUlQU19DUFVfSVJRX0JBU0UgKyAzKSAvKiBIVDEgKi8KKyNkZWZpbmUgTE9PTkdTT05fVElNRVJfSVJRICAoTUlQU19DUFVfSVJRX0JBU0UgKyA3KSAvKiBDUFUgVGltZXIgKi8KKworI2RlZmluZSBMT09OR1NPTl9IVDFfQ0ZHX0JBU0UJCWxvb25nc29uX3N5c2NvbmYuaHRfY29udHJvbF9iYXNlCisjZGVmaW5lIExPT05HU09OX0hUMV9JTlRfVkVDVE9SX0JBU0UJKExPT05HU09OX0hUMV9DRkdfQkFTRSArIDB4ODApCisjZGVmaW5lIExPT05HU09OX0hUMV9JTlRfRU5fQkFTRQkoTE9PTkdTT05fSFQxX0NGR19CQVNFICsgMHhhMCkKKyNkZWZpbmUgTE9PTkdTT05fSFQxX0lOVF9WRUNUT1IobikJXAorCQlMT09OR1NPTjNfUkVHMzIoTE9PTkdTT05fSFQxX0lOVF9WRUNUT1JfQkFTRSwgNCAqIChuKSkKKyNkZWZpbmUgTE9PTkdTT05fSFQxX0lOVE5fRU4obikJCVwKKwkJTE9PTkdTT04zX1JFRzMyKExPT05HU09OX0hUMV9JTlRfRU5fQkFTRSwgNCAqIChuKSkKKworI2RlZmluZSBMT09OR1NPTl9JTlRfUk9VVEVSX09GRlNFVAkweDE0MDAKKyNkZWZpbmUgTE9PTkdTT05fSU5UX1JPVVRFUl9JTlRFTglcCisJICBMT09OR1NPTjNfUkVHMzIoTE9PTkdTT04zX1JFR19CQVNFLCBMT09OR1NPTl9JTlRfUk9VVEVSX09GRlNFVCArIDB4MjQpCisjZGVmaW5lIExPT05HU09OX0lOVF9ST1VURVJfSU5URU5TRVQJXAorCSAgTE9PTkdTT04zX1JFRzMyKExPT05HU09OM19SRUdfQkFTRSwgTE9PTkdTT05fSU5UX1JPVVRFUl9PRkZTRVQgKyAweDI4KQorI2RlZmluZSBMT09OR1NPTl9JTlRfUk9VVEVSX0lOVEVOQ0xSCVwKKwkgIExPT05HU09OM19SRUczMihMT09OR1NPTjNfUkVHX0JBU0UsIExPT05HU09OX0lOVF9ST1VURVJfT0ZGU0VUICsgMHgyYykKKyNkZWZpbmUgTE9PTkdTT05fSU5UX1JPVVRFUl9FTlRSWShuKQlcCisJICBMT09OR1NPTjNfUkVHOChMT09OR1NPTjNfUkVHX0JBU0UsIExPT05HU09OX0lOVF9ST1VURVJfT0ZGU0VUICsgbikKKyNkZWZpbmUgTE9PTkdTT05fSU5UX1JPVVRFUl9MUEMJCUxPT05HU09OX0lOVF9ST1VURVJfRU5UUlkoMHgwYSkKKyNkZWZpbmUgTE9PTkdTT05fSU5UX1JPVVRFUl9IVDEobikJTE9PTkdTT05fSU5UX1JPVVRFUl9FTlRSWShuICsgMHgxOCkKKworI2RlZmluZSBMT09OR1NPTl9JTlRfQ09SRTBfSU5UMAkJMHgxMSAvKiByb3V0ZSB0byBpbnQgMCBvZiBjb3JlIDAgKi8KKyNkZWZpbmUgTE9PTkdTT05fSU5UX0NPUkUwX0lOVDEJCTB4MjEgLyogcm91dGUgdG8gaW50IDEgb2YgY29yZSAwICovCisKKyNlbmRpZgorCitleHRlcm4gdm9pZCBmaXh1cF9pcnFzKHZvaWQpOworZXh0ZXJuIHZvaWQgbG9vbmdzb24zX2lwaV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisjaW5jbHVkZV9uZXh0IDxpcnEuaD4KKyNlbmRpZiAvKiBfX0FTTV9NQUNIX0xPT05HU09OX0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vbG9vbmdzb24uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL2xvb25nc29uLmgKaW5kZXggYjI4NjUzNC4uZjNmZDFlYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vbG9vbmdzb24uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9sb29uZ3Nvbi5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tjb25maWcuaD4KKyNpbmNsdWRlIDxib290X3BhcmFtLmg+CiAKIC8qIGxvb25nc29uIGludGVybmFsIG5vcnRoYnJpZGdlIGluaXRpYWxpemF0aW9uICovCiBleHRlcm4gdm9pZCBib25pdG9faXJxX2luaXQodm9pZCk7CkBAIC0yNCw4ICsyNSw5IEBACiBleHRlcm4gdm9pZCBtYWNoX3ByZXBhcmVfc2h1dGRvd24odm9pZCk7CiAKIC8qIGVudmlyb25tZW50IGFyZ3VtZW50cyBmcm9tIGJvb3Rsb2FkZXIgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGNwdV9jbG9ja19mcmVxOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtc2l6ZSwgaGlnaG1lbXNpemU7CitleHRlcm4gdTMyIGNwdV9jbG9ja19mcmVxOworZXh0ZXJuIHUzMiBtZW1zaXplLCBoaWdobWVtc2l6ZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIGxvb25nc29uM19zbXBfb3BzOwogCiAvKiBsb29uZ3Nvbi1zcGVjaWZpYyBjb21tYW5kIGxpbmUsIGVudiBhbmQgbWVtb3J5IGluaXRpYWxpemF0aW9uICovCiBleHRlcm4gdm9pZCBfX2luaXQgcHJvbV9pbml0X21lbW9yeSh2b2lkKTsKQEAgLTYxLDYgKzYzLDEyIEBACiAjZGVmaW5lIExPT05HU09OX1JFRyh4KSBcCiAJKCoodm9sYXRpbGUgdTMyICopKChjaGFyICopQ0tTRUcxQUREUihMT09OR1NPTl9SRUdfQkFTRSkgKyAoeCkpKQogCisjZGVmaW5lIExPT05HU09OM19SRUc4KGJhc2UsIHgpIFwKKwkoKih2b2xhdGlsZSB1OCAqKSgoY2hhciAqKVRPX1VOQ0FDKGJhc2UpICsgKHgpKSkKKworI2RlZmluZSBMT09OR1NPTjNfUkVHMzIoYmFzZSwgeCkgXAorCSgqKHZvbGF0aWxlIHUzMiAqKSgoY2hhciAqKVRPX1VOQ0FDKGJhc2UpICsgKHgpKSkKKwogI2RlZmluZSBMT09OR1NPTl9JUlFfQkFTRQkzMgogI2RlZmluZSBMT09OR1NPTjJfUEVSRkNOVF9JUlEJKE1JUFNfQ1BVX0lSUV9CQVNFICsgNikgLyogY3B1IHBlcmYgY291bnRlciAqLwogCkBAIC04Niw2ICs5NCwxMCBAQAogI2RlZmluZSBMT09OR1NPTl9SRUdfQkFTRQkweDFmZTAwMDAwCiAjZGVmaW5lIExPT05HU09OX1JFR19TSVpFCTB4MDAxMDAwMDAJLyogMjU2Qnl0ZXMgKyAyNTZCeXRlcyArID8/PyAqLwogI2RlZmluZSBMT09OR1NPTl9SRUdfVE9QCShMT09OR1NPTl9SRUdfQkFTRStMT09OR1NPTl9SRUdfU0laRS0xKQorLyogTG9vbmdzb24tMyBzcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE9PTkdTT04zX1JFR19CQVNFCTB4M2ZmMDAwMDAKKyNkZWZpbmUgTE9PTkdTT04zX1JFR19TSVpFCTB4MDAxMDAwMDAJLyogMjU2Qnl0ZXMgKyAyNTZCeXRlcyArID8/PyAqLworI2RlZmluZSBMT09OR1NPTjNfUkVHX1RPUAkoTE9PTkdTT04zX1JFR19CQVNFK0xPT05HU09OM19SRUdfU0laRS0xKQogCiAjZGVmaW5lIExPT05HU09OX0xJTzFfQkFTRQkweDFmZjAwMDAwCiAjZGVmaW5lIExPT05HU09OX0xJTzFfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCkBAIC0xMDEsNyArMTEzLDEzIEBACiAjZGVmaW5lIExPT05HU09OX1BDSUNGR19CQVNFCTB4MWZlODAwMDAKICNkZWZpbmUgTE9PTkdTT05fUENJQ0ZHX1NJWkUJMHgwMDAwMDgwMAkvKiAySyAqLwogI2RlZmluZSBMT09OR1NPTl9QQ0lDRkdfVE9QCShMT09OR1NPTl9QQ0lDRkdfQkFTRStMT09OR1NPTl9QQ0lDRkdfU0laRS0xKQorCisjaWYgZGVmaW5lZChDT05GSUdfSFRfUENJKQorI2RlZmluZSBMT09OR1NPTl9QQ0lJT19CQVNFCWxvb25nc29uX3N5c2NvbmYucGNpX2lvX2Jhc2UKKyNlbHNlCiAjZGVmaW5lIExPT05HU09OX1BDSUlPX0JBU0UJMHgxZmQwMDAwMAorI2VuZGlmCisKICNkZWZpbmUgTE9PTkdTT05fUENJSU9fU0laRQkweDAwMTAwMDAwCS8qIDFNICovCiAjZGVmaW5lIExPT05HU09OX1BDSUlPX1RPUAkoTE9PTkdTT05fUENJSU9fQkFTRStMT09OR1NPTl9QQ0lJT19TSVpFLTEpCiAKQEAgLTIzMSw2ICsyNDksOSBAQAogI2RlZmluZSBMT09OR1NPTl9QWEFSQl9DRkcJCUxPT05HU09OX1JFRyhMT09OR1NPTl9SRUdCQVNFICsgMHg2OCkKICNkZWZpbmUgTE9PTkdTT05fUFhBUkJfU1RBVFVTCQlMT09OR1NPTl9SRUcoTE9PTkdTT05fUkVHQkFTRSArIDB4NmMpCiAKKy8qIENoaXAgQ29uZmlnICovCisjZGVmaW5lIExPT05HU09OX0NISVBDRkcwCQlMT09OR1NPTl9SRUcoTE9PTkdTT05fUkVHQkFTRSArIDB4ODApCisKIC8qIHBjaW1hcCAqLwogCiAjZGVmaW5lIExPT05HU09OX1BDSU1BUF9QQ0lNQVBfTE8wCTB4MDAwMDAwM2YKQEAgLTI0Niw5ICsyNjcsNiBAQAogI2lmZGVmIENPTkZJR19DUFVfU1VQUE9SVFNfQ1BVRlJFUQogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KIGV4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgbG9vbmdzb24yX2Nsb2NrbW9kX3RhYmxlW107Ci0KLS8qIENoaXAgQ29uZmlnICovCi0jZGVmaW5lIExPT05HU09OX0NISVBDRkcwCQlMT09OR1NPTl9SRUcoTE9PTkdTT05fUkVHQkFTRSArIDB4ODApCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL21hY2hpbmUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxvb25nc29uL21hY2hpbmUuaAppbmRleCAzODEwZDVjLi4xYjFmNTkyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9tYWNoaW5lLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vbWFjaGluZS5oCkBAIC0yNCw0ICsyNCwxMCBAQAogCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19MRU1PVEVfTUFDSDNBCisKKyNkZWZpbmUgTE9PTkdTT05fTUFDSFRZUEUgTUFDSF9MRU1PVEVfQTExMDEKKworI2VuZGlmIC8qIENPTkZJR19MRU1PVEVfTUFDSDNBICovCisKICNlbmRpZiAvKiBfX0FTTV9NQUNIX0xPT05HU09OX01BQ0hJTkVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vcGNpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9wY2kuaAppbmRleCBiYzk5ZGFiLi4xMjEyNzc0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9wY2kuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9wY2kuaApAQCAtNDAsOCArNDAsMTMgQEAKICNlbHNlCS8qIGxvb25nc29uMmYvMzJiaXQgJiBsb29uZ3NvbjJlICovCiAKIC8qIHRoaXMgcGNpIG1lbW9yeSBzcGFjZSBpcyBtYXBwZWQgYnkgcGNpbWFwIGluIHBjaS5jICovCisjaWZkZWYgQ09ORklHX0NQVV9MT09OR1NPTjMKKyNkZWZpbmUgTE9PTkdTT05fUENJX01FTV9TVEFSVAkweDQwMDAwMDAwVUwKKyNkZWZpbmUgTE9PTkdTT05fUENJX01FTV9FTkQJMHg3ZWZmZmZmZlVMCisjZWxzZQogI2RlZmluZSBMT09OR1NPTl9QQ0lfTUVNX1NUQVJUCUxPT05HU09OX1BDSUxPMV9CQVNFCiAjZGVmaW5lIExPT05HU09OX1BDSV9NRU1fRU5ECShMT09OR1NPTl9QQ0lMTzFfQkFTRSArIDB4MDQwMDAwMDAgKiAyKQorI2VuZGlmCiAvKiB0aGlzIGlzIGFuIG9mZnNldCBmcm9tIG1pcHNfaW9fcG9ydF9iYXNlICovCiAjZGVmaW5lIExPT05HU09OX1BDSV9JT19TVEFSVAkweDAwMDA0MDAwVUwKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vc3BhY2VzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9zcGFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjUwNmVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vc3BhY2VzLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9fQVNNX01BQ0hfTE9PTkdTT05fU1BBQ0VTX0hfCisjZGVmaW5lIF9fQVNNX01BQ0hfTE9PTkdTT05fU1BBQ0VTX0hfCisKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkKKyNkZWZpbmUgQ0FDX0JBU0UgICAgICAgIF9BQygweDk4MDAwMDAwMDAwMDAwMDAsIFVMKQorI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLworCisjaW5jbHVkZSA8YXNtL21hY2gtZ2VuZXJpYy9zcGFjZXMuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEva2VybmVsLWVudHJ5LWluaXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL2tlcm5lbC1lbnRyeS1pbml0LmgKaW5kZXggMGI3OTNlNy4uN2M1ZTE3YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEva2VybmVsLWVudHJ5LWluaXQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YS9rZXJuZWwtZW50cnktaW5pdC5oCkBAIC01LDEwICs1LDgwIEBACiAgKgogICogQ2hyaXMgRGVhcm1hbiAoY2hyaXNAbWlwcy5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWlwcyBUZWNobm9sb2dpZXMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCiAjaWZuZGVmIF9fQVNNX01BQ0hfTUlQU19LRVJORUxfRU5UUllfSU5JVF9ICiAjZGVmaW5lIF9fQVNNX01BQ0hfTUlQU19LRVJORUxfRU5UUllfSU5JVF9ICiAKKwkvKgorCSAqIFByZXBhcmUgc2VnbWVudHMgZm9yIEVWQSBib290OgorCSAqCisJICogVGhpcyBpcyBpbiBjYXNlIHRoZSBwcm9jZXNzb3IgYm9vdHMgaW4gbGVnYWN5IGNvbmZpZ3VyYXRpb24KKwkgKiAoU0lfRVZBUmVzZXQgaXMgZGUtYXNzZXJ0ZWQgYW5kIENPTkZJRzUuSyA9PSAwKQorCSAqCisJICogT24gZW50cnksIHQxIGlzIGxvYWRlZCB3aXRoIENQMF9DT05GSUcKKwkgKgorCSAqID09PT09PT09PT09PT09PT09PT09PT09PT0gTWFwcGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgKiBWaXJ0dWFsIG1lbW9yeSAgICAgICAgICAgUGh5c2ljYWwgbWVtb3J5ICAgICAgICAgICBNYXBwaW5nCisJICogMHgwMDAwMDAwMCAtIDB4N2ZmZmZmZmYgIDB4ODAwMDAwMDAgLSAweGZmZmZmZmZmZiAgIE1VU1VLIChrdXNlZykKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhdCAyR0IgcGh5c2ljYWwgbWVtb3J5CisJICoKKwkgKiAweDgwMDAwMDAwIC0gMHg5ZmZmZmZmZiAgMHgwMDAwMDAwMCAtIDB4MWZmZmZmZmZmICAgTVVTVUsgKGtzZWcwKQorCSAqIDB4YTAwMDAwMDAgLSAweGJmMDAwMDAwICAweDAwMDAwMDAwIC0gMHgxZmZmZmZmZmYgICBNVVNVSyAoa3NlZzEpCisJICogMHhjMDAwMDAwMCAtIDB4ZGZmZmZmZmYgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgTUsgIChrc2VnMikKKwkgKiAweGUwMDAwMDAwIC0gMHhmZmZmZmZmZiAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICBNSyAgKGtzZWczKQorCSAqCisJICoKKwkgKiBMb3dtZW0gaXMgZXhwYW5kZWQgdG8gMkdCCisJICovCisJLm1hY3JvCWV2YV9lbnRyeQorCS8qCisJICogR2V0IENvbmZpZy5LMCB2YWx1ZSBhbmQgdXNlIGl0IHRvIHByb2dyYW0KKwkgKiB0aGUgc2VnbWVudGF0aW9uIHJlZ2lzdGVycworCSAqLworCWFuZGkJdDEsIDB4NyAvKiBDQ0EgKi8KKwltb3ZlCXQyLCB0MQorCWlucwl0MiwgdDEsIDE2LCAzCisJLyogU2VnQ3RsMCAqLworCWxpICAgICAgdDAsICgoTUlQU19TRUdDRkdfTUsgPDwgTUlQU19TRUdDRkdfQU1fU0hJRlQpIHwJCVwKKwkJKDAgPDwgTUlQU19TRUdDRkdfUEFfU0hJRlQpIHwJCQkJXAorCQkoMSA8PCBNSVBTX1NFR0NGR19FVV9TSElGVCkpIHwJCQkJXAorCQkoKChNSVBTX1NFR0NGR19NSyA8PCBNSVBTX1NFR0NGR19BTV9TSElGVCkgfAkJXAorCQkoMCA8PCBNSVBTX1NFR0NGR19QQV9TSElGVCkgfAkJCQlcCisJCSgxIDw8IE1JUFNfU0VHQ0ZHX0VVX1NISUZUKSkgPDwgMTYpCisJb3IJdDAsIHQyCisJbXRjMAl0MCwgJDUsIDIKKworCS8qIFNlZ0N0bDEgKi8KKwlsaSAgICAgIHQwLCAoKE1JUFNfU0VHQ0ZHX01VU1VLIDw8IE1JUFNfU0VHQ0ZHX0FNX1NISUZUKSB8CVwKKwkJKDAgPDwgTUlQU19TRUdDRkdfUEFfU0hJRlQpIHwJCQkJXAorCQkoMiA8PCBNSVBTX1NFR0NGR19DX1NISUZUKSB8CQkJCVwKKwkJKDEgPDwgTUlQU19TRUdDRkdfRVVfU0hJRlQpKSB8CQkJCVwKKwkJKCgoTUlQU19TRUdDRkdfTVVTVUsgPDwgTUlQU19TRUdDRkdfQU1fU0hJRlQpIHwJCVwKKwkJKDAgPDwgTUlQU19TRUdDRkdfUEFfU0hJRlQpIHwJCQkJXAorCQkoMSA8PCBNSVBTX1NFR0NGR19FVV9TSElGVCkpIDw8IDE2KQorCWlucwl0MCwgdDEsIDE2LCAzCisJbXRjMAl0MCwgJDUsIDMKKworCS8qIFNlZ0N0bDIgKi8KKwlsaQl0MCwgKChNSVBTX1NFR0NGR19NVVNVSyA8PCBNSVBTX1NFR0NGR19BTV9TSElGVCkgfAlcCisJCSg2IDw8IE1JUFNfU0VHQ0ZHX1BBX1NISUZUKSB8CQkJCVwKKwkJKDEgPDwgTUlQU19TRUdDRkdfRVVfU0hJRlQpKSB8CQkJCVwKKwkJKCgoTUlQU19TRUdDRkdfTVVTVUsgPDwgTUlQU19TRUdDRkdfQU1fU0hJRlQpIHwJCVwKKwkJKDQgPDwgTUlQU19TRUdDRkdfUEFfU0hJRlQpIHwJCQkJXAorCQkoMSA8PCBNSVBTX1NFR0NGR19FVV9TSElGVCkpIDw8IDE2KQorCW9yCXQwLCB0MgorCW10YzAJdDAsICQ1LCA0CisKKwlqYWwJbWlwc19paGIKKwltZmMwICAgIHQwLCAkMTYsIDUKKwlsaSAgICAgIHQyLCAweDQwMDAwMDAwICAgICAgLyogSyBiaXQgKi8KKwlvciAgICAgIHQwLCB0MCwgdDIKKwltdGMwICAgIHQwLCAkMTYsIDUKKwlzeW5jCisJamFsCW1pcHNfaWhiCisJLmVuZG0KKwogCS5tYWNybwlrZXJuZWxfZW50cnlfc2V0dXAKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCiAJbWZjMAl0MCwgQ1AwX0NPTkZJRwpAQCAtMzksMTQgKzEwOSw1NyBAQAogbm9ubXRfcHJvY2Vzc29yOgogCS5hc2NpegkiU01UQyBrZXJuZWwgcmVxdWlyZXMgdGhlIE1UIEFTRSB0byBydW5cbiIKIAlfX0ZJTklUCi0wOgogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRVZBCisJc3luYworCWVoYgorCisJbWZjMCAgICB0MSwgQ1AwX0NPTkZJRworCWJnZXogICAgdDEsIDlmCisJbWZjMAl0MCwgQ1AwX0NPTkZJRywgMQorCWJnZXoJdDAsIDlmCisJbWZjMAl0MCwgQ1AwX0NPTkZJRywgMgorCWJnZXoJdDAsIDlmCisJbWZjMAl0MCwgQ1AwX0NPTkZJRywgMworCXNsbCAgICAgdDAsIHQwLCA2ICAgLyogU0MgYml0ICovCisJYmdleiAgICB0MCwgOWYKKworCWV2YV9lbnRyeQorCWIgICAgICAgMGYKKzk6CisJLyogQXNzdW1lIHdlIGNhbWUgZnJvbSBZQU1PTi4uLiAqLworCVBUUl9MQQl2MCwgMHg5ZmMwMDUzNAkvKiBZQU1PTiBwcmludCAqLworCWx3CXYwLCAodjApCisJbW92ZQlhMCwgemVybworCVBUUl9MQSAgYTEsIG5vbnNjX3Byb2Nlc3NvcgorCWphbAl2MAorCisJUFRSX0xBCXYwLCAweDlmYzAwNTIwCS8qIFlBTU9OIGV4aXQgKi8KKwlsdwl2MCwgKHYwKQorCWxpCWEwLCAxCisJamFsCXYwCisKKzE6CWIJMWIKKwlub3AKKwlfX0lOSVREQVRBCitub25zY19wcm9jZXNzb3I6CisJLmFzY2l6ICAiRVZBIGtlcm5lbCByZXF1aXJlcyBhIE1JUFMgY29yZSB3aXRoIFNlZ21lbnQgQ29udHJvbCBpbXBsZW1lbnRlZFxuIgorCV9fRklOSVQKKyNlbmRpZiAvKiBDT05GSUdfRVZBICovCiswOgogCS5lbmRtCiAKIC8qCiAgKiBEbyBTTVAgc2xhdmUgcHJvY2Vzc29yIHNldHVwIG5lY2Vzc2FyeSBiZWZvcmUgd2UgY2FuIHNhZmVseSBleGVjdXRlIEMgY29kZS4KICAqLwogCS5tYWNybwlzbXBfc2xhdmVfc2V0dXAKKyNpZmRlZiBDT05GSUdfRVZBCisJc3luYworCWVoYgorCW1mYzAgICAgdDEsIENQMF9DT05GSUcKKwlldmFfZW50cnkKKyNlbmRpZgogCS5lbmRtCiAKICNlbmRpZiAvKiBfX0FTTV9NQUNIX01JUFNfS0VSTkVMX0VOVFJZX0lOSVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEvc3BhY2VzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YS9zcGFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2U1NDk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEvc3BhY2VzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICovCisKKyNpZm5kZWYgX0FTTV9NQUxUQV9TUEFDRVNfSAorI2RlZmluZSBfQVNNX01BTFRBX1NQQUNFU19ICisKKyNpZmRlZiBDT05GSUdfRVZBCisKKy8qCisgKiBUcmFkaXRpb25hbCBNYWx0YSBCb2FyZCBNZW1vcnkgTWFwIGZvciBFVkEKKyAqCisgKiAweDAwMDAwMDAwIC0gMHgwZmZmZmZmZjogMXN0IFJBTSByZWdpb24sIDI1Nk1CCisgKiAweDEwMDAwMDAwIC0gMHgxYmZmZmZmZjogR0lDIGFuZCBDUEMgQ29udHJvbCBSZWdpc3RlcnMKKyAqIDB4MWMwMDAwMDAgLSAweDFmZmZmZmZmOiBJL08gQW5kIEZsYXNoCisgKiAweDIwMDAwMDAwIC0gMHg3ZmZmZmZmZjogMm5kIFJBTSByZWdpb24sIDEuNUdCCisgKiAweDgwMDAwMDAwIC0gMHhmZmZmZmZmZjogUGh5c2ljYWwgbWVtb3J5IGFsaWFzZXMgdG8gMHgwICgyR0IpCisgKgorICogVGhlIGtlcm5lbCBpcyBzdGlsbCBsb2NhdGVkIGluIDB4ODAwMDAwMDAoa3NlZzApLiBIb3dldmVyLAorICogdGhlIHBoeXNpY2FsIG1hc2sgaGFzIGJlZW4gc2hpZnRlZCB0byAweDgwMDAwMDAwIHdoaWNoIGV4cGxvaXRzIHRoZSBhbGlhcworICogb24gdGhlIE1hbHRhIGJvYXJkLiBBcyBhIHJlc3VsdCBvZiB3aGljaCwgd2Ugb3ZlcnJpZGUgdGhlIF9fcGFfc3ltYm9sCisgKiB0byBwZWZvcm0gZGlyZWN0IG1hcHBpbmcgZnJvbSB2aXJ0dWFsIHRvIHBoeXNpY2FsIGFkZHJlc3Nlcy4gSW4gb3RoZXIKKyAqIHdvcmRzLCB0aGUgMHg4MDAwMDAwMCB2aXJ0dWFsIGFkZHJlc3MgbWFwcyB0byAweDgwMDAwMDAwIHBoeXNpY2FsIGFkZHJlc3MKKyAqIHdoaWNoIGluIHR1cm4gYWxpYXNlcyB0byAweDAuIFdlIGRvIHRoaXMgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgYSBmbGF0CisgKiAyR0Igb2YgbWVtb3J5ICgweDgwMDAwMDAwIC0gMHhmZmZmZmZmZikgc28gd2UgY2FuIGF2b2lkIHRoZSBJL08gaG9sZSBpbgorICogMHgxMDAwMDAwMCAtIDB4MWZmZmZmZmYuCisgKiBUaGUgbGFzdCA2NEtCIG9mIHBoeXNpY2FsIG1lbW9yeSBhcmUgcmVzZXJ2ZWQgZm9yIGNvcnJlY3QgSElHSE1FTQorICogbWFjcm9zIGFyaXRobWV0aWNzLgorICoKKyAqLworCisjZGVmaW5lIFBBR0VfT0ZGU0VUCV9BQygweDAsIFVMKQorI2RlZmluZSBQSFlTX09GRlNFVAlfQUMoMHg4MDAwMDAwMCwgVUwpCisjZGVmaW5lIEhJR0hNRU1fU1RBUlQJX0FDKDB4ZmZmZjAwMDAsIFVMKQorCisjZGVmaW5lIF9fcGFfc3ltYm9sKHgpCShSRUxPQ19ISURFKCh1bnNpZ25lZCBsb25nKSh4KSwgMCkpCisKKyNlbmRpZiAvKiBDT05GSUdfRVZBICovCisKKyNpbmNsdWRlIDxhc20vbWFjaC1nZW5lcmljL3NwYWNlcy5oPgorCisjZW5kaWYgLyogX0FTTV9NQUxUQV9TUEFDRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG1jcy1tc3A3MXh4L21zcF9yZWdvcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBtY3MtbXNwNzF4eC9tc3BfcmVnb3BzLmgKaW5kZXggMmRiYzdhOC4uZmM5NDZjOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG1jcy1tc3A3MXh4L21zcF9yZWdvcHMuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbWNzLW1zcDcxeHgvbXNwX3JlZ29wcy5oCkBAIC03Niw3ICs3Niw3IEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkiCS5zZXQJcHVzaAkJCQlcbiIKLQkiCS5zZXQJbWlwczMJCQkJXG4iCisJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkiMToJbGwJJTAsICUxCSMgc2V0X3ZhbHVlX3JlZzMyCVxuIgogCSIJYW5kCSUwLCAlMgkJCQlcbiIKIAkiCW9yCSUwLCAlMwkJCQlcbiIKQEAgLTk4LDcgKzk4LDcgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCSIJLnNldAlwdXNoCQkJCVxuIgotCSIJLnNldAltaXBzMwkJCQlcbiIKKwkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCSIxOglsbAklMCwgJTEJCSMgc2V0X3JlZzMyCVxuIgogCSIJb3IJJTAsICUyCQkJCVxuIgogCSIJc2MJJTAsICUxCQkJCVxuIgpAQCAtMTE5LDcgKzExOSw3IEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkiCS5zZXQJcHVzaAkJCQlcbiIKLQkiCS5zZXQJbWlwczMJCQkJXG4iCisJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIKIAkiMToJbGwJJTAsICUxCQkjIGNsZWFyX3JlZzMyCVxuIgogCSIJYW5kCSUwLCAlMgkJCQlcbiIKIAkiCXNjCSUwLCAlMQkJCQlcbiIKQEAgLTE0MCw3ICsxNDAsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIgkuc2V0CXB1c2gJCQkJXG4iCi0JIgkuc2V0CW1pcHMzCQkJCVxuIgorCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJIjE6CWxsCSUwLCAlMQkJIyB0b2dnbGVfcmVnMzIJXG4iCiAJIgl4b3IJJTAsICUyCQkJCVxuIgogCSIJc2MJJTAsICUxCQkJCVxuIgpAQCAtMjE2LDcgKzIxNiw3IEBACiAjZGVmaW5lIGN1c3RvbV9yZWFkX3JlZzMyKGFkZHJlc3MsIHRtcCkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAogCSIJLnNldAlwdXNoCQkJCVxuIglcCi0JIgkuc2V0CW1pcHMzCQkJCVxuIglcCisJIgkuc2V0CWFyY2g9cjQwMDAJCQlcbiIJXAogCSIxOglsbAklMCwgJTEJI2N1c3RvbV9yZWFkX3JlZzMyCVxuIglcCiAJIgkuc2V0CXBvcAkJCQlcbiIJXAogCTogIj1yIiAodG1wKSwgIj1tIiAoKmFkZHJlc3MpCQkJCVwKQEAgLTIyNSw3ICsyMjUsNyBAQAogI2RlZmluZSBjdXN0b21fd3JpdGVfcmVnMzIoYWRkcmVzcywgdG1wKQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkiCS5zZXQJcHVzaAkJCQlcbiIJXAotCSIJLnNldAltaXBzMwkJCQlcbiIJXAorCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCVwKIAkiCXNjCSUwLCAlMQkjY3VzdG9tX3dyaXRlX3JlZzMyCVxuIglcCiAJIgkiX19iZXF6IiUwLCAxYgkJCQlcbiIJXAogCSIJbm9wCQkJCQlcbiIJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL21hbHRhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvbWFsdGEuaAppbmRleCA3MjJiYzg4Li5mZDk3NzQyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvbWFsdGEuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvbWFsdGEuaApAQCAtNjQsNiArNjQsMTEgQEAKICNkZWZpbmUgR0lDX0FERFJTUEFDRV9TWgkJKDEyOCAqIDEwMjQpCiAKIC8qCisgKiBDUEMgU3BlY2lmaWMgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBDUENfQkFTRV9BRERSCQkJMHgxYmRlMDAwMAorCisvKgogICogTVNDMDEgQklVIFNwZWNpZmljIGRlZmluaXRpb25zCiAgKiBGSVhNRSA6IFRoZXNlIHNob3VsZCBiZSBlbHNld2hlcmUgPwogICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvcGlpeDQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9waWl4NC5oCmluZGV4IDgzNmUyZWQuLjljZjU0MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9waWl4NC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9waWl4NC5oCkBAIC01MCw0ICs1MCw5IEBACiAjZGVmaW5lIFBJSVg0X0ZVTkMxX0lERVRJTV9TRUNPTkRBUllfSEkJCTB4NDMKICNkZWZpbmUgICBQSUlYNF9GVU5DMV9JREVUSU1fU0VDT05EQVJZX0hJX0lERV9ERUNPREVfRU4JKDEgPDwgNykKIAorLyogUG93ZXIgTWFuYWdlbWVudCBDb25maWd1cmF0aW9uIFNwYWNlICovCisjZGVmaW5lIFBJSVg0X0ZVTkMzX1BNQkEJCQkweDQwCisjZGVmaW5lIFBJSVg0X0ZVTkMzX1BNUkVHTUlTQwkJCTB4ODAKKyNkZWZpbmUgICBQSUlYNF9GVU5DM19QTVJFR01JU0NfRU4JCQkoMSA8PCAwKQorCiAjZW5kaWYgLyogX19BU01fTUlQU19CT0FSRFNfUElJWDRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5ZDJkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNtLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisgKiBBdXRob3I6IFBhdWwgQnVydG9uIDxwYXVsLmJ1cnRvbkBpbWd0ZWMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTUlQU19BU01fTUlQU19DTV9IX18KKyNkZWZpbmUgX19NSVBTX0FTTV9NSVBTX0NNX0hfXworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBDTSBHQ1IgYmxvY2sgKi8KK2V4dGVybiB2b2lkIF9faW9tZW0gKm1pcHNfY21fYmFzZTsKKworLyogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgQ00gTDItb25seSBzeW5jIHJlZ2lvbiAqLworZXh0ZXJuIHZvaWQgX19pb21lbSAqbWlwc19jbV9sMnN5bmNfYmFzZTsKKworLyoqCisgKiBfX21pcHNfY21fcGh5c19iYXNlIC0gcmV0cmlldmUgdGhlIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgQ00KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgQ29oZXJlbmNlIE1hbmFnZXIKKyAqIGdsb2JhbCBjb250cm9sIGJsb2NrLCBvciAwIGlmIG5vIENvaGVyZW5jZSBNYW5hZ2VyIGlzIHByZXNlbnQuIEl0IHByb3ZpZGVzCisgKiBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggcmVhZHMgdGhlIENNR0NSQmFzZSByZWdpc3RlciB3aGVyZSBhdmFpbGFibGUsCisgKiBhbmQgbWF5IGJlIG92ZXJyaWRlbiBieSBwbGF0Zm9ybXMgd2hpY2ggZGV0ZXJtaW5lIHRoaXMgYWRkcmVzcyBpbiBhCisgKiBkaWZmZXJlbnQgd2F5IGJ5IGRlZmluaW5nIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBwcm90b3R5cGUgZXhjZXB0IGZvciB0aGUKKyAqIG5hbWUgbWlwc19jbV9waHlzX2Jhc2UgKHdpdGhvdXQgdW5kZXJzY29yZXMpLgorICovCitleHRlcm4gcGh5c190IF9fbWlwc19jbV9waHlzX2Jhc2Uodm9pZCk7CisKKy8qKgorICogbWlwc19jbV9wcm9iZSAtIHByb2JlIGZvciBhIENvaGVyZW5jZSBNYW5hZ2VyCisgKgorICogQXR0ZW1wdCB0byBkZXRlY3QgdGhlIHByZXNlbmNlIG9mIGEgQ29oZXJlbmNlIE1hbmFnZXIuIFJldHVybnMgMCBpZiBhIENNCisgKiBpcyBzdWNjZXNzZnVsbHkgZGV0ZWN0ZWQsIGVsc2UgLWVycm5vLgorICovCisjaWZkZWYgQ09ORklHX01JUFNfQ00KK2V4dGVybiBpbnQgbWlwc19jbV9wcm9iZSh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBtaXBzX2NtX3Byb2JlKHZvaWQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworLyoqCisgKiBtaXBzX2NtX3ByZXNlbnQgLSBkZXRlcm1pbmUgd2hldGhlciBhIENvaGVyZW5jZSBNYW5hZ2VyIGlzIHByZXNlbnQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgYSBDTSBpcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0sIGVsc2UgZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBtaXBzX2NtX3ByZXNlbnQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTUlQU19DTQorCXJldHVybiBtaXBzX2NtX2Jhc2UgIT0gTlVMTDsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qKgorICogbWlwc19jbV9oYXNfbDJzeW5jIC0gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gTDItb25seSBzeW5jIHJlZ2lvbiBpcyBwcmVzZW50CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzeXN0ZW0gaW1wbGVtZW50cyBhbiBMMi1vbmx5IHN5bmMgcmVnaW9uLCBlbHNlIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbWlwc19jbV9oYXNfbDJzeW5jKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01JUFNfQ00KKwlyZXR1cm4gbWlwc19jbV9sMnN5bmNfYmFzZSAhPSBOVUxMOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworLyogT2Zmc2V0cyB0byByZWdpc3RlciBibG9ja3MgZnJvbSB0aGUgQ00gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1JUFNfQ01fR0NCX09GUwkJMHgwMDAwIC8qIEdsb2JhbCBDb250cm9sIEJsb2NrICovCisjZGVmaW5lIE1JUFNfQ01fQ0xDQl9PRlMJMHgyMDAwIC8qIENvcmUgTG9jYWwgQ29udHJvbCBCbG9jayAqLworI2RlZmluZSBNSVBTX0NNX0NPQ0JfT0ZTCTB4NDAwMCAvKiBDb3JlIE90aGVyIENvbnRyb2wgQmxvY2sgKi8KKyNkZWZpbmUgTUlQU19DTV9HREJfT0ZTCQkweDYwMDAgLyogR2xvYmFsIERlYnVnIEJsb2NrICovCisKKy8qIFRvdGFsIHNpemUgb2YgdGhlIENNIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1JUFNfQ01fR0NSX1NJWkUJMHg4MDAwCisKKy8qIFNpemUgb2YgdGhlIEwyLW9ubHkgc3luYyByZWdpb24gKi8KKyNkZWZpbmUgTUlQU19DTV9MMlNZTkNfU0laRQkweDEwMDAKKworLyogTWFjcm9zIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQlVJTERfQ01fUl8obmFtZSwgb2ZmKQkJCQkJXAorc3RhdGljIGlubGluZSB1MzIgKmFkZHJfZ2NyXyMjbmFtZSh2b2lkKQkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gKHUzMiAqKShtaXBzX2NtX2Jhc2UgKyAob2ZmKSk7CQkJXAorfQkJCQkJCQkJXAorCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2djcl8jI25hbWUodm9pZCkJCQkJXAorewkJCQkJCQkJXAorCXJldHVybiBfX3Jhd19yZWFkbChhZGRyX2djcl8jI25hbWUoKSk7CQkJXAorfQorCisjZGVmaW5lIEJVSUxEX0NNX19XKG5hbWUsIG9mZikJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9nY3JfIyNuYW1lKHUzMiB2YWx1ZSkJCQlcCit7CQkJCQkJCQlcCisJX19yYXdfd3JpdGVsKHZhbHVlLCBhZGRyX2djcl8jI25hbWUoKSk7CQkJXAorfQorCisjZGVmaW5lIEJVSUxEX0NNX1JXKG5hbWUsIG9mZikJCQkJCVwKKwlCVUlMRF9DTV9SXyhuYW1lLCBvZmYpCQkJCQlcCisJQlVJTERfQ01fX1cobmFtZSwgb2ZmKQorCisjZGVmaW5lIEJVSUxEX0NNX0N4X1JfKG5hbWUsIG9mZikJCQkJXAorCUJVSUxEX0NNX1JfKGNsXyMjbmFtZSwgTUlQU19DTV9DTENCX09GUyArIChvZmYpKQlcCisJQlVJTERfQ01fUl8oY29fIyNuYW1lLCBNSVBTX0NNX0NPQ0JfT0ZTICsgKG9mZikpCisKKyNkZWZpbmUgQlVJTERfQ01fQ3hfX1cobmFtZSwgb2ZmKQkJCQlcCisJQlVJTERfQ01fX1coY2xfIyNuYW1lLCBNSVBTX0NNX0NMQ0JfT0ZTICsgKG9mZikpCVwKKwlCVUlMRF9DTV9fVyhjb18jI25hbWUsIE1JUFNfQ01fQ09DQl9PRlMgKyAob2ZmKSkKKworI2RlZmluZSBCVUlMRF9DTV9DeF9SVyhuYW1lLCBvZmYpCQkJCVwKKwlCVUlMRF9DTV9DeF9SXyhuYW1lLCBvZmYpCQkJCVwKKwlCVUlMRF9DTV9DeF9fVyhuYW1lLCBvZmYpCisKKy8qIEdDQiByZWdpc3RlciBhY2Nlc3NvciBmdW5jdGlvbnMgKi8KK0JVSUxEX0NNX1JfKGNvbmZpZywJCU1JUFNfQ01fR0NCX09GUyArIDB4MDApCitCVUlMRF9DTV9SVyhiYXNlLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHgwOCkKK0JVSUxEX0NNX1JXKGFjY2VzcywJCU1JUFNfQ01fR0NCX09GUyArIDB4MjApCitCVUlMRF9DTV9SXyhyZXYsCQlNSVBTX0NNX0dDQl9PRlMgKyAweDMwKQorQlVJTERfQ01fUlcoZXJyb3JfbWFzaywJCU1JUFNfQ01fR0NCX09GUyArIDB4NDApCitCVUlMRF9DTV9SVyhlcnJvcl9jYXVzZSwJTUlQU19DTV9HQ0JfT0ZTICsgMHg0OCkKK0JVSUxEX0NNX1JXKGVycm9yX2FkZHIsCQlNSVBTX0NNX0dDQl9PRlMgKyAweDUwKQorQlVJTERfQ01fUlcoZXJyb3JfbXVsdCwJCU1JUFNfQ01fR0NCX09GUyArIDB4NTgpCitCVUlMRF9DTV9SVyhsMl9vbmx5X3N5bmNfYmFzZSwJTUlQU19DTV9HQ0JfT0ZTICsgMHg3MCkKK0JVSUxEX0NNX1JXKGdpY19iYXNlLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHg4MCkKK0JVSUxEX0NNX1JXKGNwY19iYXNlLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHg4OCkKK0JVSUxEX0NNX1JXKHJlZzBfYmFzZSwJCU1JUFNfQ01fR0NCX09GUyArIDB4OTApCitCVUlMRF9DTV9SVyhyZWcwX21hc2ssCQlNSVBTX0NNX0dDQl9PRlMgKyAweDk4KQorQlVJTERfQ01fUlcocmVnMV9iYXNlLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHhhMCkKK0JVSUxEX0NNX1JXKHJlZzFfbWFzaywJCU1JUFNfQ01fR0NCX09GUyArIDB4YTgpCitCVUlMRF9DTV9SVyhyZWcyX2Jhc2UsCQlNSVBTX0NNX0dDQl9PRlMgKyAweGIwKQorQlVJTERfQ01fUlcocmVnMl9tYXNrLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHhiOCkKK0JVSUxEX0NNX1JXKHJlZzNfYmFzZSwJCU1JUFNfQ01fR0NCX09GUyArIDB4YzApCitCVUlMRF9DTV9SVyhyZWczX21hc2ssCQlNSVBTX0NNX0dDQl9PRlMgKyAweGM4KQorQlVJTERfQ01fUl8oZ2ljX3N0YXR1cywJCU1JUFNfQ01fR0NCX09GUyArIDB4ZDApCitCVUlMRF9DTV9SXyhjcGNfc3RhdHVzLAkJTUlQU19DTV9HQ0JfT0ZTICsgMHhmMCkKKworLyogQ29yZSBMb2NhbCAmIENvcmUgT3RoZXIgcmVnaXN0ZXIgYWNjZXNzb3IgZnVuY3Rpb25zICovCitCVUlMRF9DTV9DeF9SVyhyZXNldF9yZWxlYXNlLAkweDAwKQorQlVJTERfQ01fQ3hfUlcoY29oZXJlbmNlLAkweDA4KQorQlVJTERfQ01fQ3hfUl8oY29uZmlnLAkJMHgxMCkKK0JVSUxEX0NNX0N4X1JXKG90aGVyLAkJMHgxOCkKK0JVSUxEX0NNX0N4X1JXKHJlc2V0X2Jhc2UsCTB4MjApCitCVUlMRF9DTV9DeF9SXyhpZCwJCTB4MjgpCitCVUlMRF9DTV9DeF9SVyhyZXNldF9leHRfYmFzZSwJMHgzMCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfMF9wcmlvcml0eSwJMHg0MCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfMV9wcmlvcml0eSwJMHg0OCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfMl9wcmlvcml0eSwJMHg1MCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfM19wcmlvcml0eSwJMHg1OCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfNF9wcmlvcml0eSwJMHg2MCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfNV9wcmlvcml0eSwJMHg2OCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfNl9wcmlvcml0eSwJMHg3MCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfN19wcmlvcml0eSwJMHg3OCkKK0JVSUxEX0NNX0N4X1JfKHRjaWRfOF9wcmlvcml0eSwJMHg4MCkKKworLyogR0NSX0NPTkZJRyByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX0NPTkZJR19OVU1JT0NVX1NIRgkJOAorI2RlZmluZSBDTV9HQ1JfQ09ORklHX05VTUlPQ1VfTVNLCQkoX1VMQ0FTVF8oMHhmKSA8PCA4KQorI2RlZmluZSBDTV9HQ1JfQ09ORklHX1BDT1JFU19TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0NPTkZJR19QQ09SRVNfTVNLCQkoX1VMQ0FTVF8oMHhmZikgPDwgMCkKKworLyogR0NSX0JBU0UgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9CQVNFX0dDUkJBU0VfU0hGCQkJMTUKKyNkZWZpbmUgQ01fR0NSX0JBU0VfR0NSQkFTRV9NU0sJCQkoX1VMQ0FTVF8oMHgxZmZmZikgPDwgMTUpCisjZGVmaW5lIENNX0dDUl9CQVNFX0NNREVGVEdUX1NIRgkJMAorI2RlZmluZSBDTV9HQ1JfQkFTRV9DTURFRlRHVF9NU0sJCShfVUxDQVNUXygweDMpIDw8IDApCisjZGVmaW5lICBDTV9HQ1JfQkFTRV9DTURFRlRHVF9ESVNBQkxFRAkJMAorI2RlZmluZSAgQ01fR0NSX0JBU0VfQ01ERUZUR1RfTUVNCQkxCisjZGVmaW5lICBDTV9HQ1JfQkFTRV9DTURFRlRHVF9JT0NVMAkJMgorI2RlZmluZSAgQ01fR0NSX0JBU0VfQ01ERUZUR1RfSU9DVTEJCTMKKworLyogR0NSX0FDQ0VTUyByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX0FDQ0VTU19BQ0NFU1NFTl9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0FDQ0VTU19BQ0NFU1NFTl9NU0sJCShfVUxDQVNUXygweGZmKSA8PCAwKQorCisvKiBHQ1JfUkVWIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfUkVWX01BSk9SX1NIRgkJCTgKKyNkZWZpbmUgQ01fR0NSX1JFVl9NQUpPUl9NU0sJCQkoX1VMQ0FTVF8oMHhmZikgPDwgOCkKKyNkZWZpbmUgQ01fR0NSX1JFVl9NSU5PUl9TSEYJCQkwCisjZGVmaW5lIENNX0dDUl9SRVZfTUlOT1JfTVNLCQkJKF9VTENBU1RfKDB4ZmYpIDw8IDApCisKKy8qIEdDUl9FUlJPUl9DQVVTRSByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX0VSUk9SX0NBVVNFX0VSUlRZUEVfU0hGCQkyNworI2RlZmluZSBDTV9HQ1JfRVJST1JfQ0FVU0VfRVJSVFlQRV9NU0sJCShfVUxDQVNUXygweDFmKSA8PCAyNykKKyNkZWZpbmUgQ01fR0NSX0VSUk9SX0NBVVNFX0VSUklORk9fU0hGCQkwCisjZGVmaW5lIENNX0dDUl9FUlJPUl9DQVVTRV9FUlJJTkdPX01TSwkJKF9VTENBU1RfKDB4N2ZmZmZmZikgPDwgMCkKKworLyogR0NSX0VSUk9SX01VTFQgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9FUlJPUl9NVUxUX0VSUjJORF9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0VSUk9SX01VTFRfRVJSMk5EX01TSwkJKF9VTENBU1RfKDB4MWYpIDw8IDApCisKKy8qIEdDUl9MMl9PTkxZX1NZTkNfQkFTRSByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX0wyX09OTFlfU1lOQ19CQVNFX1NZTkNCQVNFX1NIRgkxMgorI2RlZmluZSBDTV9HQ1JfTDJfT05MWV9TWU5DX0JBU0VfU1lOQ0JBU0VfTVNLCShfVUxDQVNUXygweGZmZmZmKSA8PCAxMikKKyNkZWZpbmUgQ01fR0NSX0wyX09OTFlfU1lOQ19CQVNFX1NZTkNFTl9TSEYJMAorI2RlZmluZSBDTV9HQ1JfTDJfT05MWV9TWU5DX0JBU0VfU1lOQ0VOX01TSwkoX1VMQ0FTVF8oMHgxKSA8PCAwKQorCisvKiBHQ1JfR0lDX0JBU0UgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9HSUNfQkFTRV9HSUNCQVNFX1NIRgkJMTcKKyNkZWZpbmUgQ01fR0NSX0dJQ19CQVNFX0dJQ0JBU0VfTVNLCQkoX1VMQ0FTVF8oMHg3ZmZmKSA8PCAxNykKKyNkZWZpbmUgQ01fR0NSX0dJQ19CQVNFX0dJQ0VOX1NIRgkJMAorI2RlZmluZSBDTV9HQ1JfR0lDX0JBU0VfR0lDRU5fTVNLCQkoX1VMQ0FTVF8oMHgxKSA8PCAwKQorCisvKiBHQ1JfQ1BDX0JBU0UgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9DUENfQkFTRV9DUENCQVNFX1NIRgkJMTcKKyNkZWZpbmUgQ01fR0NSX0NQQ19CQVNFX0NQQ0JBU0VfTVNLCQkoX1VMQ0FTVF8oMHg3ZmZmKSA8PCAxNykKKyNkZWZpbmUgQ01fR0NSX0NQQ19CQVNFX0NQQ0VOX1NIRgkJMAorI2RlZmluZSBDTV9HQ1JfQ1BDX0JBU0VfQ1BDRU5fTVNLCQkoX1VMQ0FTVF8oMHgxKSA8PCAwKQorCisvKiBHQ1JfUkVHbl9CQVNFIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfUkVHbl9CQVNFX0JBU0VBRERSX1NIRgkJMTYKKyNkZWZpbmUgQ01fR0NSX1JFR25fQkFTRV9CQVNFQUREUl9NU0sJCShfVUxDQVNUXygweGZmZmYpIDw8IDE2KQorCisvKiBHQ1JfUkVHbl9NQVNLIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfUkVHbl9NQVNLX0FERFJNQVNLX1NIRgkJMTYKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19BRERSTUFTS19NU0sJCShfVUxDQVNUXygweGZmZmYpIDw8IDE2KQorI2RlZmluZSBDTV9HQ1JfUkVHbl9NQVNLX0NDQU9WUl9TSEYJCTUKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19DQ0FPVlJfTVNLCQkoX1VMQ0FTVF8oMHgzKSA8PCA1KQorI2RlZmluZSBDTV9HQ1JfUkVHbl9NQVNLX0NDQU9WUkVOX1NIRgkJNAorI2RlZmluZSBDTV9HQ1JfUkVHbl9NQVNLX0NDQU9WUkVOX01TSwkJKF9VTENBU1RfKDB4MSkgPDwgNCkKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19EUk9QTDJfU0hGCQkyCisjZGVmaW5lIENNX0dDUl9SRUduX01BU0tfRFJPUEwyX01TSwkJKF9VTENBU1RfKDB4MSkgPDwgMikKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19DTVRHVF9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX1JFR25fTUFTS19DTVRHVF9NU0sJCShfVUxDQVNUXygweDMpIDw8IDApCisjZGVmaW5lICBDTV9HQ1JfUkVHbl9NQVNLX0NNVEdUX0RJU0FCTEVECShfVUxDQVNUXygweDApIDw8IDApCisjZGVmaW5lICBDTV9HQ1JfUkVHbl9NQVNLX0NNVEdUX01FTQkJKF9VTENBU1RfKDB4MSkgPDwgMCkKKyNkZWZpbmUgIENNX0dDUl9SRUduX01BU0tfQ01UR1RfSU9DVTAJCShfVUxDQVNUXygweDIpIDw8IDApCisjZGVmaW5lICBDTV9HQ1JfUkVHbl9NQVNLX0NNVEdUX0lPQ1UxCQkoX1VMQ0FTVF8oMHgzKSA8PCAwKQorCisvKiBHQ1JfR0lDX1NUQVRVUyByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQ01fR0NSX0dJQ19TVEFUVVNfRVhfU0hGCQkwCisjZGVmaW5lIENNX0dDUl9HSUNfU1RBVFVTX0VYX01TSwkJKF9VTENBU1RfKDB4MSkgPDwgMCkKKworLyogR0NSX0NQQ19TVEFUVVMgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9DUENfU1RBVFVTX0VYX1NIRgkJMAorI2RlZmluZSBDTV9HQ1JfQ1BDX1NUQVRVU19FWF9NU0sJCShfVUxDQVNUXygweDEpIDw8IDApCisKKy8qIEdDUl9DeF9DT0hFUkVOQ0UgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9DeF9DT0hFUkVOQ0VfQ09IRE9NQUlORU5fU0hGCTAKKyNkZWZpbmUgQ01fR0NSX0N4X0NPSEVSRU5DRV9DT0hET01BSU5FTl9NU0sJKF9VTENBU1RfKDB4ZmYpIDw8IDApCisKKy8qIEdDUl9DeF9DT05GSUcgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9DeF9DT05GSUdfSU9DVVRZUEVfU0hGCQkxMAorI2RlZmluZSBDTV9HQ1JfQ3hfQ09ORklHX0lPQ1VUWVBFX01TSwkJKF9VTENBU1RfKDB4MykgPDwgMTApCisjZGVmaW5lIENNX0dDUl9DeF9DT05GSUdfUFZQRV9TSEYJCTAKKyNkZWZpbmUgQ01fR0NSX0N4X0NPTkZJR19QVlBFX01TSwkJKF9VTENBU1RfKDB4MWZmKSA8PCAwKQorCisvKiBHQ1JfQ3hfT1RIRVIgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9DeF9PVEhFUl9DT1JFTlVNX1NIRgkJMTYKKyNkZWZpbmUgQ01fR0NSX0N4X09USEVSX0NPUkVOVU1fTVNLCQkoX1VMQ0FTVF8oMHhmZmZmKSA8PCAxNikKKworLyogR0NSX0N4X1JFU0VUX0JBU0UgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9CQVNFX0JFVkVYQ0JBU0VfU0hGCTEyCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9CQVNFX0JFVkVYQ0JBU0VfTVNLCShfVUxDQVNUXygweGZmZmZmKSA8PCAxMikKKworLyogR0NSX0N4X1JFU0VUX0VYVF9CQVNFIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfRVZBUkVTRVRfU0hGCTMxCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9FVkFSRVNFVF9NU0sJKF9VTENBU1RfKDB4MSkgPDwgMzEpCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9VRUJfU0hGCTMwCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9VRUJfTVNLCShfVUxDQVNUXygweDEpIDw8IDMwKQorI2RlZmluZSBDTV9HQ1JfQ3hfUkVTRVRfRVhUX0JBU0VfQkVWRVhDTUFTS19TSEYJMjAKKyNkZWZpbmUgQ01fR0NSX0N4X1JFU0VUX0VYVF9CQVNFX0JFVkVYQ01BU0tfTVNLCShfVUxDQVNUXygweGZmKSA8PCAyMCkKKyNkZWZpbmUgQ01fR0NSX0N4X1JFU0VUX0VYVF9CQVNFX0JFVkVYQ1BBX1NIRgkxCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9CRVZFWENQQV9NU0sJKF9VTENBU1RfKDB4N2YpIDw8IDEpCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9QUkVTRU5UX1NIRgkwCisjZGVmaW5lIENNX0dDUl9DeF9SRVNFVF9FWFRfQkFTRV9QUkVTRU5UX01TSwkoX1VMQ0FTVF8oMHgxKSA8PCAwKQorCisvKioKKyAqIG1pcHNfY21fbnVtY29yZXMgLSByZXR1cm4gdGhlIG51bWJlciBvZiBjb3JlcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0KKyAqCisgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgUENPUkVTIGZpZWxkIG9mIHRoZSBHQ1JfQ09ORklHIHJlZ2lzdGVyIHBsdXMgMSwgb3IKKyAqIHplcm8gaWYgbm8gQ29oZXJlbmNlIE1hbmFnZXIgaXMgcHJlc2VudC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBtaXBzX2NtX251bWNvcmVzKHZvaWQpCit7CisJaWYgKCFtaXBzX2NtX3ByZXNlbnQoKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKChyZWFkX2djcl9jb25maWcoKSAmIENNX0dDUl9DT05GSUdfUENPUkVTX01TSykKKwkJPj4gQ01fR0NSX0NPTkZJR19QQ09SRVNfU0hGKSArIDE7Cit9CisKKy8qKgorICogbWlwc19jbV9udW1pb2N1IC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgSU9DVXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtCisgKgorICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIE5VTUlPQ1UgZmllbGQgb2YgdGhlIEdDUl9DT05GSUcgcmVnaXN0ZXIsIG9yIHplcm8KKyAqIGlmIG5vIENvaGVyZW5jZSBNYW5hZ2VyIGlzIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbWlwc19jbV9udW1pb2N1KHZvaWQpCit7CisJaWYgKCFtaXBzX2NtX3ByZXNlbnQoKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKHJlYWRfZ2NyX2NvbmZpZygpICYgQ01fR0NSX0NPTkZJR19OVU1JT0NVX01TSykKKwkJPj4gQ01fR0NSX0NPTkZJR19OVU1JT0NVX1NIRjsKK30KKworLyoqCisgKiBtaXBzX2NtX2wyc3luYyAtIHBlcmZvcm0gYW4gTDItb25seSBzeW5jIG9wZXJhdGlvbgorICoKKyAqIElmIGFuIEwyLW9ubHkgc3luYyByZWdpb24gaXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtIHRoZW4gdGhpcyBmdW5jdGlvbgorICogcGVyZm9ybXMgYW5kIEwyLW9ubHkgc3luYyBhbmQgcmV0dXJucyB6ZXJvLiBPdGhlcndpc2UgaXQgcmV0dXJucyAtRU5PREVWLgorICovCitzdGF0aWMgaW5saW5lIGludCBtaXBzX2NtX2wyc3luYyh2b2lkKQoreworCWlmICghbWlwc19jbV9oYXNfbDJzeW5jKCkpCisJCXJldHVybiAtRU5PREVWOworCisJd3JpdGVsKDAsIG1pcHNfY21fbDJzeW5jX2Jhc2UpOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX19NSVBTX0FTTV9NSVBTX0NNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY3BjLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1jcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODg1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY3BjLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisgKiBBdXRob3I6IFBhdWwgQnVydG9uIDxwYXVsLmJ1cnRvbkBpbWd0ZWMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTUlQU19BU01fTUlQU19DUENfSF9fCisjZGVmaW5lIF9fTUlQU19BU01fTUlQU19DUENfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIENQQyByZWdpc3RlcnMgKi8KK2V4dGVybiB2b2lkIF9faW9tZW0gKm1pcHNfY3BjX2Jhc2U7CisKKy8qKgorICogbWlwc19jcGNfZGVmYXVsdF9waHlzX2Jhc2UgLSByZXRyaWV2ZSB0aGUgZGVmYXVsdCBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIENQQworICoKKyAqIFJldHVybnMgdGhlIGRlZmF1bHQgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBDbHVzdGVyIFBvd2VyIENvbnRyb2xsZXIKKyAqIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzLiBUaGlzIGlzIHBsYXRmb3JtIGRlcGVuZGFudCAmIG11c3QgdGhlcmVmb3JlIGJlCisgKiBpbXBsZW1lbnRlZCBwZXItcGxhdGZvcm0uCisgKi8KK2V4dGVybiBwaHlzX3QgbWlwc19jcGNfZGVmYXVsdF9waHlzX2Jhc2Uodm9pZCk7CisKKy8qKgorICogbWlwc19jcGNfcGh5c19iYXNlIC0gcmV0cmlldmUgdGhlIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgQ1BDCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIENsdXN0ZXIgUG93ZXIKKyAqIENvbnRyb2xsZXIgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMsIG9yIDAgaWYgbm8gQ2x1c3RlciBQb3dlciBDb250cm9sbGVyCisgKiBpcyBwcmVzZW50LiBJdCBtYXkgYmUgb3ZlcnJpZGVuIGJ5IGluZGl2aWR1YWwgcGxhdGZvcm1zIHdoaWNoIGRldGVybWluZQorICogdGhpcyBhZGRyZXNzIGluIGEgZGlmZmVyZW50IHdheS4KKyAqLworZXh0ZXJuIHBoeXNfdCBfX3dlYWsgbWlwc19jcGNfcGh5c19iYXNlKHZvaWQpOworCisvKioKKyAqIG1pcHNfY3BjX3Byb2JlIC0gcHJvYmUgZm9yIGEgQ2x1c3RlciBQb3dlciBDb250cm9sbGVyCisgKgorICogQXR0ZW1wdCB0byBkZXRlY3QgdGhlIHByZXNlbmNlIG9mIGEgQ2x1c3RlciBQb3dlciBDb250cm9sbGVyLiBSZXR1cm5zIDAgaWYKKyAqIGEgQ1BDIGlzIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCwgZWxzZSAtZXJybm8uCisgKi8KKyNpZmRlZiBDT05GSUdfTUlQU19DUEMKK2V4dGVybiBpbnQgbWlwc19jcGNfcHJvYmUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbWlwc19jcGNfcHJvYmUodm9pZCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKyNlbmRpZgorCisvKioKKyAqIG1pcHNfY3BjX3ByZXNlbnQgLSBkZXRlcm1pbmUgd2hldGhlciBhIENsdXN0ZXIgUG93ZXIgQ29udHJvbGxlciBpcyBwcmVzZW50CisgKgorICogUmV0dXJucyB0cnVlIGlmIGEgQ1BDIGlzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSwgZWxzZSBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIG1pcHNfY3BjX3ByZXNlbnQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTUlQU19DUEMKKwlyZXR1cm4gbWlwc19jcGNfYmFzZSAhPSBOVUxMOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworLyogT2Zmc2V0cyBmcm9tIHRoZSBDUEMgYmFzZSBhZGRyZXNzIHRvIHZhcmlvdXMgY29udHJvbCBibG9ja3MgKi8KKyNkZWZpbmUgTUlQU19DUENfR0NCX09GUwkweDAwMDAKKyNkZWZpbmUgTUlQU19DUENfQ0xDQl9PRlMJMHgyMDAwCisjZGVmaW5lIE1JUFNfQ1BDX0NPQ0JfT0ZTCTB4NDAwMAorCisvKiBNYWNyb3MgdG8gZWFzZSB0aGUgY3JlYXRpb24gb2YgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworI2RlZmluZSBCVUlMRF9DUENfUl8obmFtZSwgb2ZmKSBcCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2NwY18jI25hbWUodm9pZCkJCQkJXAorewkJCQkJCQkJXAorCXJldHVybiBfX3Jhd19yZWFkbChtaXBzX2NwY19iYXNlICsgKG9mZikpOwkJXAorfQorCisjZGVmaW5lIEJVSUxEX0NQQ19fVyhuYW1lLCBvZmYpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9jcGNfIyNuYW1lKHUzMiB2YWx1ZSkJCQlcCit7CQkJCQkJCQlcCisJX19yYXdfd3JpdGVsKHZhbHVlLCBtaXBzX2NwY19iYXNlICsgKG9mZikpOwkJXAorfQorCisjZGVmaW5lIEJVSUxEX0NQQ19SVyhuYW1lLCBvZmYpCQkJCQlcCisJQlVJTERfQ1BDX1JfKG5hbWUsIG9mZikJCQkJCVwKKwlCVUlMRF9DUENfX1cobmFtZSwgb2ZmKQorCisjZGVmaW5lIEJVSUxEX0NQQ19DeF9SXyhuYW1lLCBvZmYpCQkJCVwKKwlCVUlMRF9DUENfUl8oY2xfIyNuYW1lLCBNSVBTX0NQQ19DTENCX09GUyArIChvZmYpKQlcCisJQlVJTERfQ1BDX1JfKGNvXyMjbmFtZSwgTUlQU19DUENfQ09DQl9PRlMgKyAob2ZmKSkKKworI2RlZmluZSBCVUlMRF9DUENfQ3hfX1cobmFtZSwgb2ZmKQkJCQlcCisJQlVJTERfQ1BDX19XKGNsXyMjbmFtZSwgTUlQU19DUENfQ0xDQl9PRlMgKyAob2ZmKSkJXAorCUJVSUxEX0NQQ19fVyhjb18jI25hbWUsIE1JUFNfQ1BDX0NPQ0JfT0ZTICsgKG9mZikpCisKKyNkZWZpbmUgQlVJTERfQ1BDX0N4X1JXKG5hbWUsIG9mZikJCQkJXAorCUJVSUxEX0NQQ19DeF9SXyhuYW1lLCBvZmYpCQkJCVwKKwlCVUlMRF9DUENfQ3hfX1cobmFtZSwgb2ZmKQorCisvKiBHQ0IgcmVnaXN0ZXIgYWNjZXNzb3IgZnVuY3Rpb25zICovCitCVUlMRF9DUENfUlcoYWNjZXNzLAkJTUlQU19DUENfR0NCX09GUyArIDB4MDApCitCVUlMRF9DUENfUlcoc2VxZGVsLAkJTUlQU19DUENfR0NCX09GUyArIDB4MDgpCitCVUlMRF9DUENfUlcocmFpbCwJCU1JUFNfQ1BDX0dDQl9PRlMgKyAweDEwKQorQlVJTERfQ1BDX1JXKHJlc2V0bGVuLAkJTUlQU19DUENfR0NCX09GUyArIDB4MTgpCitCVUlMRF9DUENfUl8ocmV2aXNpb24sCQlNSVBTX0NQQ19HQ0JfT0ZTICsgMHgyMCkKKworLyogQ29yZSBMb2NhbCAmIENvcmUgT3RoZXIgYWNjZXNzb3IgZnVuY3Rpb25zICovCitCVUlMRF9DUENfQ3hfUlcoY21kLAkJMHgwMCkKK0JVSUxEX0NQQ19DeF9SVyhzdGF0X2NvbmYsCTB4MDgpCitCVUlMRF9DUENfQ3hfUlcob3RoZXIsCQkweDEwKQorCisvKiBDUENfQ3hfQ01EIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDUENfQ3hfQ01EX1NIRgkJCQkwCisjZGVmaW5lIENQQ19DeF9DTURfTVNLCQkJCShfVUxDQVNUXygweGYpIDw8IDApCisjZGVmaW5lICBDUENfQ3hfQ01EX0NMT0NLT0ZGCQkJKF9VTENBU1RfKDB4MSkgPDwgMCkKKyNkZWZpbmUgIENQQ19DeF9DTURfUFdSRE9XTgkJCShfVUxDQVNUXygweDIpIDw8IDApCisjZGVmaW5lICBDUENfQ3hfQ01EX1BXUlVQCQkJKF9VTENBU1RfKDB4MykgPDwgMCkKKyNkZWZpbmUgIENQQ19DeF9DTURfUkVTRVQJCQkoX1VMQ0FTVF8oMHg0KSA8PCAwKQorCisvKiBDUENfQ3hfU1RBVF9DT05GIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX1BXUlVQRV9TSEYJCTIzCisjZGVmaW5lIENQQ19DeF9TVEFUX0NPTkZfUFdSVVBFX01TSwkJKF9VTENBU1RfKDB4MSkgPDwgMjMpCisjZGVmaW5lIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfU0hGCQkxOQorI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX01TSwkJKF9VTENBU1RfKDB4ZikgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX0QwCQkoX1VMQ0FTVF8oMHgwKSA8PCAxOSkKKyNkZWZpbmUgIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfVTAJCShfVUxDQVNUXygweDEpIDw8IDE5KQorI2RlZmluZSAgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9VMQkJKF9VTENBU1RfKDB4MikgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX1UyCQkoX1VMQ0FTVF8oMHgzKSA8PCAxOSkKKyNkZWZpbmUgIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfVTMJCShfVUxDQVNUXygweDQpIDw8IDE5KQorI2RlZmluZSAgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9VNAkJKF9VTENBU1RfKDB4NSkgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX1U1CQkoX1VMQ0FTVF8oMHg2KSA8PCAxOSkKKyNkZWZpbmUgIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfVTYJCShfVUxDQVNUXygweDcpIDw8IDE5KQorI2RlZmluZSAgQ1BDX0N4X1NUQVRfQ09ORl9TRVFTVEFURV9EMQkJKF9VTENBU1RfKDB4OCkgPDwgMTkpCisjZGVmaW5lICBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX0QzCQkoX1VMQ0FTVF8oMHg5KSA8PCAxOSkKKyNkZWZpbmUgIENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfRDIJCShfVUxDQVNUXygweGEpIDw8IDE5KQorI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX0NMS0dBVF9JTVBMX1NIRgkxNworI2RlZmluZSBDUENfQ3hfU1RBVF9DT05GX0NMS0dBVF9JTVBMX01TSwkoX1VMQ0FTVF8oMHgxKSA8PCAxNykKKyNkZWZpbmUgQ1BDX0N4X1NUQVRfQ09ORl9QV1JETl9JTVBMX1NIRgkJMTYKKyNkZWZpbmUgQ1BDX0N4X1NUQVRfQ09ORl9QV1JETl9JTVBMX01TSwkJKF9VTENBU1RfKDB4MSkgPDwgMTYpCisjZGVmaW5lIENQQ19DeF9TVEFUX0NPTkZfRUpUQUdfUFJPQkVfU0hGCTE1CisjZGVmaW5lIENQQ19DeF9TVEFUX0NPTkZfRUpUQUdfUFJPQkVfTVNLCShfVUxDQVNUXygweDEpIDw8IDE1KQorCisvKiBDUENfQ3hfT1RIRVIgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIENQQ19DeF9PVEhFUl9DT1JFTlVNX1NIRgkJMTYKKyNkZWZpbmUgQ1BDX0N4X09USEVSX0NPUkVOVU1fTVNLCQkoX1VMQ0FTVF8oMHhmZikgPDwgMTYpCisKKyNlbmRpZiAvKiBfX01JUFNfQVNNX01JUFNfQ1BDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNfbXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzX210LmgKaW5kZXggYWM3OTM1Mi4uYTNkZjBjMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNfbXQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc19tdC5oCkBAIC0xOCw3ICsxOCwxMiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXRfZnBlbXVsX3RocmVzaG9sZDsKIAogZXh0ZXJuIHZvaWQgbWlwc19tdF9yZWdkdW1wKHVuc2lnbmVkIGxvbmcgcHJldmlvdXNfbXZwY29udHJvbF92YWx1ZSk7CisKKyNpZmRlZiBDT05GSUdfTUlQU19NVAogZXh0ZXJuIHZvaWQgbWlwc19tdF9zZXRfY3B1b3B0aW9ucyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwc19tdF9zZXRfY3B1b3B0aW9ucyh2b2lkKSB7IH0KKyNlbmRpZgogCiBzdHJ1Y3QgY2xhc3M7CiBleHRlcm4gc3RydWN0IGNsYXNzICptdF9jbGFzczsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzbXRyZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc210cmVncy5oCmluZGV4IDM4Yjc3MDQuLjZlZmE3OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzbXRyZWdzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNtdHJlZ3MuaApAQCAtMTc2LDYgKzE3NiwxNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNvcmVfbnZwZXModm9pZCkKK3sKKwl1bnNpZ25lZCBjb25mMDsKKworCWlmICghY3B1X2hhc19taXBzbXQpCisJCXJldHVybiAxOworCisJY29uZjAgPSByZWFkX2MwX212cGNvbmYwKCk7CisJcmV0dXJuICgoY29uZjAgJiBNVlBDT05GMF9QVlBFKSA+PiBNVlBDT05GMF9QVlBFX1NISUZUKSArIDE7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGR2cGUodm9pZCkKIHsKIAlpbnQgcmVzID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmgKaW5kZXggYmJjM2RkNC4uM2UwMjViNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmgKQEAgLTU2OCwxMSArNTY4LDIzIEBACiAjZGVmaW5lIE1JUFNfQ09ORjFfUEMJCShfVUxDQVNUXygxKSA8PAkgNCkKICNkZWZpbmUgTUlQU19DT05GMV9NRAkJKF9VTENBU1RfKDEpIDw8CSA1KQogI2RlZmluZSBNSVBTX0NPTkYxX0MyCQkoX1VMQ0FTVF8oMSkgPDwJIDYpCisjZGVmaW5lIE1JUFNfQ09ORjFfREFfU0hGCTcKKyNkZWZpbmUgTUlQU19DT05GMV9EQV9TWgkzCiAjZGVmaW5lIE1JUFNfQ09ORjFfREEJCShfVUxDQVNUXyg3KSA8PAkgNykKKyNkZWZpbmUgTUlQU19DT05GMV9ETF9TSEYJMTAKKyNkZWZpbmUgTUlQU19DT05GMV9ETF9TWgkzCiAjZGVmaW5lIE1JUFNfQ09ORjFfREwJCShfVUxDQVNUXyg3KSA8PCAxMCkKKyNkZWZpbmUgTUlQU19DT05GMV9EU19TSEYJMTMKKyNkZWZpbmUgTUlQU19DT05GMV9EU19TWgkzCiAjZGVmaW5lIE1JUFNfQ09ORjFfRFMJCShfVUxDQVNUXyg3KSA8PCAxMykKKyNkZWZpbmUgTUlQU19DT05GMV9JQV9TSEYJMTYKKyNkZWZpbmUgTUlQU19DT05GMV9JQV9TWgkzCiAjZGVmaW5lIE1JUFNfQ09ORjFfSUEJCShfVUxDQVNUXyg3KSA8PCAxNikKKyNkZWZpbmUgTUlQU19DT05GMV9JTF9TSEYJMTkKKyNkZWZpbmUgTUlQU19DT05GMV9JTF9TWgkzCiAjZGVmaW5lIE1JUFNfQ09ORjFfSUwJCShfVUxDQVNUXyg3KSA8PCAxOSkKKyNkZWZpbmUgTUlQU19DT05GMV9JU19TSEYJMjIKKyNkZWZpbmUgTUlQU19DT05GMV9JU19TWgkzCiAjZGVmaW5lIE1JUFNfQ09ORjFfSVMJCShfVUxDQVNUXyg3KSA8PCAyMikKICNkZWZpbmUgTUlQU19DT05GMV9UTEJTX1NISUZUICAgKDI1KQogI2RlZmluZSBNSVBTX0NPTkYxX1RMQlNfU0laRSAgICAoNikKQEAgLTY1Myw5ICs2NjUsMTYgQEAKIAogI2RlZmluZSBNSVBTX0NPTkY3X1JQUwkJKF9VTENBU1RfKDEpIDw8IDIpCiAKKyNkZWZpbmUgTUlQU19DT05GN19JQVIJCShfVUxDQVNUXygxKSA8PCAxMCkKKyNkZWZpbmUgTUlQU19DT05GN19BUgkJKF9VTENBU1RfKDEpIDw8IDE2KQorCiAvKiAgRW50cnlISSBiaXQgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBNSVBTX0VOVFJZSElfRUhJTlYJKF9VTENBU1RfKDEpIDw8IDEwKQogCisvKiBDTUdDUkJhc2UgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIE1JUFNfQ01HQ1JCX0JBU0UJMTEKKyNkZWZpbmUgTUlQU19DTUdDUkZfQkFTRQkofl9VTENBU1RfKCgxIDw8IE1JUFNfQ01HQ1JCX0JBU0UpIC0gMSkpCisKIC8qCiAgKiBCaXRzIGluIHRoZSBNSVBTMzIvNjQgY29wcm9jZXNzb3IgMSAoRlBVKSByZXZpc2lvbiByZWdpc3Rlci4KICAqLwpAQCAtMTAxMCw2ICsxMDI5LDggQEAKIAogI2RlZmluZSByZWFkX2MwX3ByaWQoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNSwgMCkKIAorI2RlZmluZSByZWFkX2MwX2NtZ2NyYmFzZSgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMTUsIDMpCisKICNkZWZpbmUgcmVhZF9jMF9jb25maWcoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAwKQogI2RlZmluZSByZWFkX2MwX2NvbmZpZzEoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAxKQogI2RlZmluZSByZWFkX2MwX2NvbmZpZzIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAyKQpAQCAtMTg4Myw2ICsxOTA0LDcgQEAKIF9fQlVJTERfU0VUX0MwKHN0YXR1cykKIF9fQlVJTERfU0VUX0MwKGNhdXNlKQogX19CVUlMRF9TRVRfQzAoY29uZmlnKQorX19CVUlMRF9TRVRfQzAoY29uZmlnNSkKIF9fQlVJTERfU0VUX0MwKGludGNvbnRyb2wpCiBfX0JVSUxEX1NFVF9DMChpbnRjdGwpCiBfX0JVSUxEX1NFVF9DMChzcnNtYXApCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW9kdWxlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5kZXggNDRiNzA1ZC4uYzJlZGFlMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21vZHVsZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tb2R1bGUuaApAQCAtMTI2LDYgKzEyNiw4IEBACiAjZGVmaW5lIE1PRFVMRV9QUk9DX0ZBTUlMWSAiTE9PTkdTT04xICIKICNlbGlmIGRlZmluZWQgQ09ORklHX0NQVV9MT09OR1NPTjIKICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJMT09OR1NPTjIgIgorI2VsaWYgZGVmaW5lZCBDT05GSUdfQ1BVX0xPT05HU09OMworI2RlZmluZSBNT0RVTEVfUFJPQ19GQU1JTFkgIkxPT05HU09OMyAiCiAjZWxpZiBkZWZpbmVkIENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTgogI2RlZmluZSBNT0RVTEVfUFJPQ19GQU1JTFkgIk9DVEVPTiAiCiAjZWxpZiBkZWZpbmVkIENPTkZJR19DUFVfWExSCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbXNhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhYmE2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tc2EuaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogUGF1bCBCdXJ0b24gPHBhdWwuYnVydG9uQGltZ3RlYy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fTVNBX0gKKyNkZWZpbmUgX0FTTV9NU0FfSAorCisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisKK2V4dGVybiB2b2lkIF9zYXZlX21zYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBfcmVzdG9yZV9tc2Eoc3RydWN0IHRhc2tfc3RydWN0ICopOworCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX21zYSh2b2lkKQoreworCWlmIChjcHVfaGFzX21zYSkgeworCQlzZXRfYzBfY29uZmlnNShNSVBTX0NPTkY1X01TQUVOKTsKKwkJZW5hYmxlX2ZwdV9oYXphcmQoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX21zYSh2b2lkKQoreworCWlmIChjcHVfaGFzX21zYSkgeworCQljbGVhcl9jMF9jb25maWc1KE1JUFNfQ09ORjVfTVNBRU4pOworCQlkaXNhYmxlX2ZwdV9oYXphcmQoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX21zYV9lbmFibGVkKHZvaWQpCit7CisJaWYgKCFjcHVfaGFzX21zYSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcmVhZF9jMF9jb25maWc1KCkgJiBNSVBTX0NPTkY1X01TQUVOOworfQorCitzdGF0aWMgaW5saW5lIGludCB0aHJlYWRfbXNhX2NvbnRleHRfbGl2ZSh2b2lkKQoreworCS8qCisJICogQ2hlY2sgY3B1X2hhc19tc2Egb25seSBpZiBpdCdzIGEgY29uc3RhbnQuIFRoaXMgd2lsbCBhbGxvdyB0aGUKKwkgKiBjb21waWxlciB0byBvcHRpbWlzZSBvdXQgY29kZSBmb3IgQ1BVcyB3aXRob3V0IE1TQSB3aXRob3V0IGFkZGluZworCSAqIGFuIGV4dHJhIHJlZHVuZGFudCBjaGVjayBmb3IgQ1BVcyB3aXRoIE1TQS4KKwkgKi8KKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoY3B1X2hhc19tc2EpICYmICFjcHVfaGFzX21zYSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdGVzdF90aHJlYWRfZmxhZyhUSUZfTVNBX0NUWF9MSVZFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbXNhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlpZiAoY3B1X2hhc19tc2EpCisJCV9zYXZlX21zYSh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfbXNhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlpZiAoY3B1X2hhc19tc2EpCisJCV9yZXN0b3JlX21zYSh0KTsKK30KKworI2lmZGVmIFRPT0xDSEFJTl9TVVBQT1JUU19NU0EKKworI2RlZmluZSBfX0JVSUxEX01TQV9DVExfUkVHKG5hbWUsIGNzKQkJCQlcCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX21zYV8jI25hbWUodm9pZCkJCVwKK3sJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgcmVnOwkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSIJLnNldAlwdXNoXG4iCQkJCQlcCisJIgkuc2V0CW1zYVxuIgkJCQkJXAorCSIJY2ZjbXNhCSUwLCAkIiAjY3MgIlxuIgkJCQlcCisJIgkuc2V0CXBvcFxuIgkJCQkJXAorCTogIj1yIihyZWcpKTsJCQkJCQlcCisJcmV0dXJuIHJlZzsJCQkJCQlcCit9CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tc2FfIyNuYW1lKHVuc2lnbmVkIGludCB2YWwpCQlcCit7CQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIgkuc2V0CXB1c2hcbiIJCQkJCVwKKwkiCS5zZXQJbXNhXG4iCQkJCQlcCisJIgljZmNtc2EJJCIgI2NzICIsICUwXG4iCQkJCVwKKwkiCS5zZXQJcG9wXG4iCQkJCQlcCisJOiA6ICJyIih2YWwpKTsJCQkJCQlcCit9CisKKyNlbHNlIC8qICFUT09MQ0hBSU5fU1VQUE9SVFNfTVNBICovCisKKy8qCisgKiBEZWZpbmUgZnVuY3Rpb25zIHVzaW5nIC53b3JkIGZvciB0aGUgY1tmdF1jbXNhIGluc3RydWN0aW9ucyBpbiBvcmRlciB0bworICogYWxsb3cgY29tcGlsYXRpb24gd2l0aCB0b29sY2hhaW5zIHRoYXQgZG8gbm90IHN1cHBvcnQgTVNBLiBPbmNlIGFsbAorICogdG9vbGNoYWlucyBpbiB1c2Ugc3VwcG9ydCBNU0EgdGhlc2UgY2FuIGJlIHJlbW92ZWQuCisgKi8KKworI2RlZmluZSBfX0JVSUxEX01TQV9DVExfUkVHKG5hbWUsIGNzKQkJCQlcCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX21zYV8jI25hbWUodm9pZCkJCVwKK3sJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgcmVnOwkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSIJLnNldAlwdXNoXG4iCQkJCQlcCisJIgkuc2V0CW5vYXRcbiIJCQkJCVwKKwkiCS53b3JkCTB4Nzg3ZTAwNTkgfCAoIiAjY3MgIiA8PCAxMSlcbiIJCVwKKwkiCW1vdmUJJTAsICQxXG4iCQkJCVwKKwkiCS5zZXQJcG9wXG4iCQkJCQlcCisJOiAiPXIiKHJlZykpOwkJCQkJCVwKKwlyZXR1cm4gcmVnOwkJCQkJCVwKK30JCQkJCQkJCVwKKwkJCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21zYV8jI25hbWUodW5zaWduZWQgaW50IHZhbCkJCVwKK3sJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkiCS5zZXQJcHVzaFxuIgkJCQkJXAorCSIJLnNldAlub2F0XG4iCQkJCQlcCisJIgltb3ZlCSQxLCAlMFxuIgkJCQlcCisJIgkud29yZAkweDc4M2UwODE5IHwgKCIgI2NzICIgPDwgNilcbiIJCVwKKwkiCS5zZXQJcG9wXG4iCQkJCQlcCisJOiA6ICJyIih2YWwpKTsJCQkJCQlcCit9CisKKyNlbmRpZiAvKiAhVE9PTENIQUlOX1NVUFBPUlRTX01TQSAqLworCisjZGVmaW5lIE1TQV9JUgkJMAorI2RlZmluZSBNU0FfQ1NSCQkxCisjZGVmaW5lIE1TQV9BQ0NFU1MJMgorI2RlZmluZSBNU0FfU0FWRQkzCisjZGVmaW5lIE1TQV9NT0RJRlkJNAorI2RlZmluZSBNU0FfUkVRVUVTVAk1CisjZGVmaW5lIE1TQV9NQVAJCTYKKyNkZWZpbmUgTVNBX1VOTUFQCTcKKworX19CVUlMRF9NU0FfQ1RMX1JFRyhpciwgMCkKK19fQlVJTERfTVNBX0NUTF9SRUcoY3NyLCAxKQorX19CVUlMRF9NU0FfQ1RMX1JFRyhhY2Nlc3MsIDIpCitfX0JVSUxEX01TQV9DVExfUkVHKHNhdmUsIDMpCitfX0JVSUxEX01TQV9DVExfUkVHKG1vZGlmeSwgNCkKK19fQlVJTERfTVNBX0NUTF9SRUcocmVxdWVzdCwgNSkKK19fQlVJTERfTVNBX0NUTF9SRUcobWFwLCA2KQorX19CVUlMRF9NU0FfQ1RMX1JFRyh1bm1hcCwgNykKKworLyogTVNBIEltcGxlbWVudGF0aW9uIFJlZ2lzdGVyIChNU0FJUikgKi8KKyNkZWZpbmUgTVNBX0lSX1JFVkIJCTAKKyNkZWZpbmUgTVNBX0lSX1JFVkYJCShfVUxDQVNUXygweGZmKSA8PCBNU0FfSVJfUkVWQikKKyNkZWZpbmUgTVNBX0lSX1BST0NCCQk4CisjZGVmaW5lIE1TQV9JUl9QUk9DRgkJKF9VTENBU1RfKDB4ZmYpIDw8IE1TQV9JUl9QUk9DQikKKyNkZWZpbmUgTVNBX0lSX1dSUEIJCTE2CisjZGVmaW5lIE1TQV9JUl9XUlBGCQkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfSVJfV1JQQikKKworLyogTVNBIENvbnRyb2wgJiBTdGF0dXMgUmVnaXN0ZXIgKE1TQUNTUikgKi8KKyNkZWZpbmUgTVNBX0NTUl9STUIJCTAKKyNkZWZpbmUgTVNBX0NTUl9STUYJCShfVUxDQVNUXygweDMpIDw8IE1TQV9DU1JfUk1CKQorI2RlZmluZSBNU0FfQ1NSX1JNX05FQVJFU1QJMAorI2RlZmluZSBNU0FfQ1NSX1JNX1RPX1pFUk8JMQorI2RlZmluZSBNU0FfQ1NSX1JNX1RPX1BPUwkyCisjZGVmaW5lIE1TQV9DU1JfUk1fVE9fTkVHCTMKKyNkZWZpbmUgTVNBX0NTUl9GTEFHU0IJCTIKKyNkZWZpbmUgTVNBX0NTUl9GTEFHU0YJCShfVUxDQVNUXygweDFmKSA8PCBNU0FfQ1NSX0ZMQUdTQikKKyNkZWZpbmUgTVNBX0NTUl9GTEFHU19JQgkyCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfSUYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9GTEFHU19JQikKKyNkZWZpbmUgTVNBX0NTUl9GTEFHU19VQgkzCisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfVUYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9GTEFHU19VQikKKyNkZWZpbmUgTVNBX0NTUl9GTEFHU19PQgk0CisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfT0YJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9GTEFHU19PQikKKyNkZWZpbmUgTVNBX0NTUl9GTEFHU19aQgk1CisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfWkYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9GTEFHU19aQikKKyNkZWZpbmUgTVNBX0NTUl9GTEFHU19WQgk2CisjZGVmaW5lIE1TQV9DU1JfRkxBR1NfVkYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9GTEFHU19WQikKKyNkZWZpbmUgTVNBX0NTUl9FTkFCTEVTQgk3CisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU0YJKF9VTENBU1RfKDB4MWYpIDw8IE1TQV9DU1JfRU5BQkxFU0IpCisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19JQgk3CisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19JRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0VOQUJMRVNfSUIpCisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19VQgk4CisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19VRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0VOQUJMRVNfVUIpCisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19PQgk5CisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19PRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0VOQUJMRVNfT0IpCisjZGVmaW5lIE1TQV9DU1JfRU5BQkxFU19aQgkxMAorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfWkYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9FTkFCTEVTX1pCKQorI2RlZmluZSBNU0FfQ1NSX0VOQUJMRVNfVkIJMTEKKyNkZWZpbmUgTVNBX0NTUl9FTkFCTEVTX1ZGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfRU5BQkxFU19WQikKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRUIJCTEyCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VGCQkoX1VMQ0FTVF8oMHgzZikgPDwgTVNBX0NTUl9DQVVTRUIpCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfSUIJMTIKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9JRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0NBVVNFX0lCKQorI2RlZmluZSBNU0FfQ1NSX0NBVVNFX1VCCTEzCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfVUYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9DQVVTRV9VQikKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9PQgkxNAorI2RlZmluZSBNU0FfQ1NSX0NBVVNFX09GCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfQ0FVU0VfT0IpCisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfWkIJMTUKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9aRgkoX1VMQ0FTVF8oMHgxKSA8PCBNU0FfQ1NSX0NBVVNFX1pCKQorI2RlZmluZSBNU0FfQ1NSX0NBVVNFX1ZCCTE2CisjZGVmaW5lIE1TQV9DU1JfQ0FVU0VfVkYJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9DQVVTRV9WQikKKyNkZWZpbmUgTVNBX0NTUl9DQVVTRV9FQgkxNworI2RlZmluZSBNU0FfQ1NSX0NBVVNFX0VGCShfVUxDQVNUXygweDEpIDw8IE1TQV9DU1JfQ0FVU0VfRUIpCisjZGVmaW5lIE1TQV9DU1JfTlhCCQkxOAorI2RlZmluZSBNU0FfQ1NSX05YRgkJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9OWEIpCisjZGVmaW5lIE1TQV9DU1JfRlNCCQkyNAorI2RlZmluZSBNU0FfQ1NSX0ZTRgkJKF9VTENBU1RfKDB4MSkgPDwgTVNBX0NTUl9GU0IpCisKKyNlbmRpZiAvKiBfQVNNX01TQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCA1ZTA4YmNjLi41Njk5ZWMzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTE5MCw3ICsxOTAsOSBAQAogICogaHR0cHM6Ly9wYXRjaHdvcmsubGludXgtbWlwcy5vcmcvcGF0Y2gvMTU0MS8KICAqLwogCisjaWZuZGVmIF9fcGFfc3ltYm9sCiAjZGVmaW5lIF9fcGFfc3ltYm9sKHgpCV9fcGEoUkVMT0NfSElERSgodW5zaWduZWQgbG9uZykoeCksIDApKQorI2VuZGlmCiAKICNkZWZpbmUgcGZuX3RvX2thZGRyKHBmbikJX192YSgocGZuKSA8PCBQQUdFX1NISUZUKQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGd0YWJsZS1iaXRzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGd0YWJsZS1iaXRzLmgKaW5kZXggMzJhZWE0OC4uZTU5MmYzNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BndGFibGUtYml0cy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wZ3RhYmxlLWJpdHMuaApAQCAtMjM1LDYgKzIzNSwxNSBAQAogI2RlZmluZSBfQ0FDSEVfQ0FDSEFCTEVfTk9OQ09IRVJFTlQgKDU8PF9DQUNIRV9TSElGVCkKICNkZWZpbmUgX0NBQ0hFX1VOQ0FDSEVEX0FDQ0VMRVJBVEVEICg3PDxfQ0FDSEVfU0hJRlQpCiAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9MT09OR1NPTjMpCisKKy8qIFVzaW5nIENPSEVSRU5UIGZsYWcgZm9yIE5PTkNPSEVSRU5UIGRvZXNuJ3QgaHVydC4gKi8KKworI2RlZmluZSBfQ0FDSEVfVU5DQUNIRUQgICAgICAgICAgICAgKDI8PF9DQUNIRV9TSElGVCkgIC8qIExPT05HU09OICAgICAgICovCisjZGVmaW5lIF9DQUNIRV9DQUNIQUJMRV9OT05DT0hFUkVOVCAoMzw8X0NBQ0hFX1NISUZUKSAgLyogTE9PTkdTT04gICAgICAgKi8KKyNkZWZpbmUgX0NBQ0hFX0NBQ0hBQkxFX0NPSEVSRU5UICAgICgzPDxfQ0FDSEVfU0hJRlQpICAvKiBMT09OR1NPTi0zICAgICAqLworI2RlZmluZSBfQ0FDSEVfVU5DQUNIRURfQUNDRUxFUkFURUQgKDc8PF9DQUNIRV9TSElGVCkgIC8qIExPT05HU09OICAgICAgICovCisKICNlbHNlCiAKICNkZWZpbmUgX0NBQ0hFX0NBQ0hBQkxFX05PX1dBCSAgICAoMDw8X0NBQ0hFX1NISUZUKSAgLyogUjQ2MDAgb25seQkgICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggMzYwNWI4NC4uYWQ3MGNiYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtOTcsMTggKzk3LDQ4IEBACiAKICNkZWZpbmUgTlVNX0ZQVV9SRUdTCTMyCiAKLXR5cGVkZWYgX191NjQgZnB1cmVnX3Q7CisjaWZkZWYgQ09ORklHX0NQVV9IQVNfTVNBCisjIGRlZmluZSBGUFVfUkVHX1dJRFRICTEyOAorI2Vsc2UKKyMgZGVmaW5lIEZQVV9SRUdfV0lEVEgJNjQKKyNlbmRpZgorCit1bmlvbiBmcHVyZWcgeworCV9fdTMyCXZhbDMyW0ZQVV9SRUdfV0lEVEggLyAzMl07CisJX191NjQJdmFsNjRbRlBVX1JFR19XSURUSCAvIDY0XTsKK307CisKKyNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEZQUl9JRFgod2lkdGgsIGlkeCkJKGlkeCkKKyNlbHNlCisjIGRlZmluZSBGUFJfSURYKHdpZHRoLCBpZHgpCSgoRlBVX1JFR19XSURUSCAvICh3aWR0aCkpIC0gMSAtIChpZHgpKQorI2VuZGlmCisKKyNkZWZpbmUgQlVJTERfRlBSX0FDQ0VTUyh3aWR0aCkgXAorc3RhdGljIGlubGluZSB1IyN3aWR0aCBnZXRfZnByIyN3aWR0aCh1bmlvbiBmcHVyZWcgKmZwciwgdW5zaWduZWQgaWR4KQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBmcHItPnZhbCMjd2lkdGhbRlBSX0lEWCh3aWR0aCwgaWR4KV07CQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnByIyN3aWR0aCh1bmlvbiBmcHVyZWcgKmZwciwgdW5zaWduZWQgaWR4LAlcCisJCQkJICB1IyN3aWR0aCB2YWwpCQkJCVwKK3sJCQkJCQkJCQlcCisJZnByLT52YWwjI3dpZHRoW0ZQUl9JRFgod2lkdGgsIGlkeCldID0gdmFsOwkJCVwKK30KKworQlVJTERfRlBSX0FDQ0VTUygzMikKK0JVSUxEX0ZQUl9BQ0NFU1MoNjQpCiAKIC8qCi0gKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGFkZCBzb21lIG1vcmUgZmllbGRzIGZvciBlbXVsYXRvciBzdGF0aXN0aWNzLCBidXQgdGhlcmUKLSAqIGFyZSBhIG51bWJlciBvZiBmaXhlZCBvZmZzZXRzIGluIG9mZnNldC5oIGFuZCBlbHNld2hlcmUgdGhhdCB3b3VsZCBoYXZlIHRvCi0gKiBiZSByZWNhbGN1bGF0ZWQgYnkgaGFuZC4gIFNvIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJpdmF0ZSB0bwotICogdGhlIEZQVSBlbXVsYXRvciBmb3Igbm93LiAgU2VlIGFzbS1taXBzL2ZwdV9lbXVsYXRvci5oLgorICogSXQgd291bGQgYmUgbmljZSB0byBhZGQgc29tZSBtb3JlIGZpZWxkcyBmb3IgZW11bGF0b3Igc3RhdGlzdGljcywKKyAqIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIHByaXZhdGUgdG8gdGhlIEZQVSBlbXVsYXRvciBmb3Igbm93LgorICogU2VlIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHVfZW11bGF0b3IuaC4KICAqLwogCiBzdHJ1Y3QgbWlwc19mcHVfc3RydWN0IHsKLQlmcHVyZWdfdAlmcHJbTlVNX0ZQVV9SRUdTXTsKKwl1bmlvbiBmcHVyZWcJZnByW05VTV9GUFVfUkVHU107CiAJdW5zaWduZWQgaW50CWZjcjMxOworCXVuc2lnbmVkIGludAltc2Fjc3I7CiB9OwogCiAjZGVmaW5lIE5VTV9EU1BfUkVHUyAgIDYKQEAgLTI4NCw4ICszMTQsOSBAQAogCSAqIFNhdmVkIEZQVS9GUFUgZW11bGF0b3Igc3R1ZmYJCQkJXAogCSAqLwkJCQkJCQlcCiAJLmZwdQkJCT0gewkJCQlcCi0JCS5mcHIJCT0gezAsfSwJCQkJXAorCQkuZnByCQk9IHt7ezAsfSx9LH0sCQkJXAogCQkuZmNyMzEJCT0gMCwJCQkJXAorCQkubXNhY3NyCQk9IDAsCQkJCVwKIAl9LAkJCQkJCQlcCiAJLyoJCQkJCQkJXAogCSAqIEZQVSBhZmZpbml0eSBzdGF0ZSAobnVsbCBpZiBub3QgRlBBRkYpCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggN2JiYTlkYS4uYmYxYWM4ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTgyLDcgKzgyLDcgQEAKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5jcDBfZXBjKQogI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKIAotZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBhc21saW5rYWdlIGxvbmcgc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBzeXNjYWxsKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZV9sZWF2ZShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICopIF9fbm9yZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcjRrY2FjaGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9yNGtjYWNoZS5oCmluZGV4IGM4NGNhZGQuLmNhNjRjYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9yNGtjYWNoZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9yNGtjYWNoZS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgogI2luY2x1ZGUgPGFzbS9jcHUtdHlwZS5oPgogI2luY2x1ZGUgPGFzbS9taXBzbXRyZWdzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4gLyogZm9yIHNlZ21lbnRfZXEoKSAqLwogCiAvKgogICogVGhpcyBtYWNybyByZXR1cm4gYSBwcm9wZXJseSBzaWduLWV4dGVuZGVkIGFkZHJlc3Mgc3VpdGFibGUgYXMgYmFzZSBhZGRyZXNzCkBAIC0zNSw3ICszNiw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAogCSIJLnNldAlwdXNoCQkJCQlcbiIJXAogCSIJLnNldAlub3Jlb3JkZXIJCQkJXG4iCVwKLQkiCS5zZXQJbWlwczNcblx0CQkJCVxuIglcCisJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCVwKIAkiCWNhY2hlCSUwLCAlMQkJCQkJXG4iCVwKIAkiCS5zZXQJcG9wCQkJCQlcbiIJXAogCToJCQkJCQkJCVwKQEAgLTIwMyw3ICsyMDQsNyBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAogCSIJLnNldAlwdXNoCQkJXG4iCQlcCiAJIgkuc2V0CW5vcmVvcmRlcgkJXG4iCQlcCi0JIgkuc2V0CW1pcHMzCQkJXG4iCQlcCisJIgkuc2V0CWFyY2g9cjQwMDAJCVxuIgkJXAogCSIxOgljYWNoZQklMCwgKCUxKQkJXG4iCQlcCiAJIjI6CS5zZXQJcG9wCQkJXG4iCQlcCiAJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiCVxuIgkJXApAQCAtMjEyLDYgKzIxMywyMCBAQAogCToJCQkJCQkJXAogCTogImkiIChvcCksICJyIiAoYWRkcikpCiAKKyNkZWZpbmUgcHJvdGVjdGVkX2NhY2hlZV9vcChvcCxhZGRyKQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIgkuc2V0CXB1c2gJCQlcbiIJCVwKKwkiCS5zZXQJbm9yZW9yZGVyCQlcbiIJCVwKKwkiCS5zZXQJbWlwczAJCQlcbiIJCVwKKwkiCS5zZXQJZXZhCQkJXG4iCQlcCisJIjE6CWNhY2hlZQklMCwgKCUxKQkJXG4iCQlcCisJIjI6CS5zZXQJcG9wCQkJXG4iCQlcCisJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiCVxuIgkJXAorCSIJIlNUUihQVFIpIiAxYiwgMmIJCVxuIgkJXAorCSIJLnByZXZpb3VzIgkJCQkJXAorCToJCQkJCQkJXAorCTogImkiIChvcCksICJyIiAoYWRkcikpCisKIC8qCiAgKiBUaGUgbmV4dCB0d28gYXJlIGZvciBiYWRsYW5kIGFkZHJlc3NlcyBsaWtlIHNpZ25hbCB0cmFtcG9saW5lcy4KICAqLwpAQCAtMjIzLDcgKzIzOCwxMSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6CisjaWZkZWYgQ09ORklHX0VWQQorCQlwcm90ZWN0ZWRfY2FjaGVlX29wKEhpdF9JbnZhbGlkYXRlX0ksIGFkZHIpOworI2Vsc2UKIAkJcHJvdGVjdGVkX2NhY2hlX29wKEhpdF9JbnZhbGlkYXRlX0ksIGFkZHIpOworI2VuZGlmCiAJCWJyZWFrOwogCX0KIH0KQEAgLTM1Niw2ICszNzUsOTEgQEAKIAkJOiAiciIgKGJhc2UpLAkJCQkJCVwKIAkJICAiaSIgKG9wKSk7CiAKKy8qCisgKiBQZXJmb3JtIHRoZSBjYWNoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5IG9wIHVzaW5nIGEgdXNlciBtb2RlIHZpcnR1YWwKKyAqIGFkZHJlc3Mgd2hpbGUgaW4ga2VybmVsIG1vZGUuCisgKi8KKyNkZWZpbmUgY2FjaGUxNl91bnJvbGwzMl91c2VyKGJhc2Usb3ApCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldCBwdXNoCQkJCQlcbiIJXAorCSIJLnNldCBub3Jlb3JkZXIJCQkJCVxuIglcCisJIgkuc2V0IG1pcHMwCQkJCQlcbiIJXAorCSIJLnNldCBldmEJCQkJCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MDAwKCUwKTsgY2FjaGVlICUxLCAweDAxMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwMjAoJTApOyBjYWNoZWUgJTEsIDB4MDMwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDA0MCglMCk7IGNhY2hlZSAlMSwgMHgwNTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MDYwKCUwKTsgY2FjaGVlICUxLCAweDA3MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwODAoJTApOyBjYWNoZWUgJTEsIDB4MDkwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDBhMCglMCk7IGNhY2hlZSAlMSwgMHgwYjAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MGMwKCUwKTsgY2FjaGVlICUxLCAweDBkMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwZTAoJTApOyBjYWNoZWUgJTEsIDB4MGYwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDEwMCglMCk7IGNhY2hlZSAlMSwgMHgxMTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MTIwKCUwKTsgY2FjaGVlICUxLCAweDEzMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxNDAoJTApOyBjYWNoZWUgJTEsIDB4MTUwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDE2MCglMCk7IGNhY2hlZSAlMSwgMHgxNzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MTgwKCUwKTsgY2FjaGVlICUxLCAweDE5MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxYTAoJTApOyBjYWNoZWUgJTEsIDB4MWIwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDFjMCglMCk7IGNhY2hlZSAlMSwgMHgxZDAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MWUwKCUwKTsgY2FjaGVlICUxLCAweDFmMCglMCkJXG4iCVwKKwkiCS5zZXQgcG9wCQkJCQlcbiIJXAorCQk6CQkJCQkJCVwKKwkJOiAiciIgKGJhc2UpLAkJCQkJCVwKKwkJICAiaSIgKG9wKSk7CisKKyNkZWZpbmUgY2FjaGUzMl91bnJvbGwzMl91c2VyKGJhc2UsIG9wKQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiCS5zZXQgcHVzaAkJCQkJXG4iCVwKKwkiCS5zZXQgbm9yZW9yZGVyCQkJCQlcbiIJXAorCSIJLnNldCBtaXBzMAkJCQkJXG4iCVwKKwkiCS5zZXQgZXZhCQkJCQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDAwMCglMCk7IGNhY2hlZSAlMSwgMHgwMjAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MDQwKCUwKTsgY2FjaGVlICUxLCAweDA2MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwODAoJTApOyBjYWNoZWUgJTEsIDB4MGEwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDBjMCglMCk7IGNhY2hlZSAlMSwgMHgwZTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MTAwKCUwKTsgY2FjaGVlICUxLCAweDEyMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxNDAoJTApOyBjYWNoZWUgJTEsIDB4MTYwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDE4MCglMCk7IGNhY2hlZSAlMSwgMHgxYTAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MWMwKCUwKTsgY2FjaGVlICUxLCAweDFlMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgyMDAoJTApOyBjYWNoZWUgJTEsIDB4MjIwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDI0MCglMCk7IGNhY2hlZSAlMSwgMHgyNjAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MjgwKCUwKTsgY2FjaGVlICUxLCAweDJhMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgyYzAoJTApOyBjYWNoZWUgJTEsIDB4MmUwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDMwMCglMCk7IGNhY2hlZSAlMSwgMHgzMjAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MzQwKCUwKTsgY2FjaGVlICUxLCAweDM2MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgzODAoJTApOyBjYWNoZWUgJTEsIDB4M2EwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDNjMCglMCk7IGNhY2hlZSAlMSwgMHgzZTAoJTApCVxuIglcCisJIgkuc2V0IHBvcAkJCQkJXG4iCVwKKwkJOgkJCQkJCQlcCisJCTogInIiIChiYXNlKSwJCQkJCQlcCisJCSAgImkiIChvcCkpOworCisjZGVmaW5lIGNhY2hlNjRfdW5yb2xsMzJfdXNlcihiYXNlLCBvcCkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIgkuc2V0IHB1c2gJCQkJCVxuIglcCisJIgkuc2V0IG5vcmVvcmRlcgkJCQkJXG4iCVwKKwkiCS5zZXQgbWlwczAJCQkJCVxuIglcCisJIgkuc2V0IGV2YQkJCQkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgwMDAoJTApOyBjYWNoZWUgJTEsIDB4MDQwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDA4MCglMCk7IGNhY2hlZSAlMSwgMHgwYzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MTAwKCUwKTsgY2FjaGVlICUxLCAweDE0MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgxODAoJTApOyBjYWNoZWUgJTEsIDB4MWMwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDIwMCglMCk7IGNhY2hlZSAlMSwgMHgyNDAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4MjgwKCUwKTsgY2FjaGVlICUxLCAweDJjMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHgzMDAoJTApOyBjYWNoZWUgJTEsIDB4MzQwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDM4MCglMCk7IGNhY2hlZSAlMSwgMHgzYzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4NDAwKCUwKTsgY2FjaGVlICUxLCAweDQ0MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHg0ODAoJTApOyBjYWNoZWUgJTEsIDB4NGMwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDUwMCglMCk7IGNhY2hlZSAlMSwgMHg1NDAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4NTgwKCUwKTsgY2FjaGVlICUxLCAweDVjMCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHg2MDAoJTApOyBjYWNoZWUgJTEsIDB4NjQwKCUwKQlcbiIJXAorCSIJY2FjaGVlICUxLCAweDY4MCglMCk7IGNhY2hlZSAlMSwgMHg2YzAoJTApCVxuIglcCisJIgljYWNoZWUgJTEsIDB4NzAwKCUwKTsgY2FjaGVlICUxLCAweDc0MCglMCkJXG4iCVwKKwkiCWNhY2hlZSAlMSwgMHg3ODAoJTApOyBjYWNoZWUgJTEsIDB4N2MwKCUwKQlcbiIJXAorCSIJLnNldCBwb3AJCQkJCVxuIglcCisJCToJCQkJCQkJXAorCQk6ICJyIiAoYmFzZSksCQkJCQkJXAorCQkgICJpIiAob3ApKTsKKwogLyogYnVpbGQgYmxhc3RfeHh4LCBibGFzdF94eHhfcGFnZSwgYmxhc3RfeHh4X3BhZ2VfaW5kZXhlZCAqLwogI2RlZmluZSBfX0JVSUxEX0JMQVNUX0NBQ0hFKHBmeCwgZGVzYywgaW5kZXhvcCwgaGl0b3AsIGxzaXplLCBleHRyYSkJXAogc3RhdGljIGlubGluZSB2b2lkIGV4dHJhIyNibGFzdF8jI3BmeCMjY2FjaGUjI2xzaXplKHZvaWQpCQlcCkBAIC00MjksNiArNTMzLDMyIEBACiBfX0JVSUxEX0JMQVNUX0NBQ0hFKGludl9zLCBzY2FjaGUsIEluZGV4X1dyaXRlYmFja19JbnZfU0QsIEhpdF9JbnZhbGlkYXRlX1NELCA2NCwgKQogX19CVUlMRF9CTEFTVF9DQUNIRShpbnZfcywgc2NhY2hlLCBJbmRleF9Xcml0ZWJhY2tfSW52X1NELCBIaXRfSW52YWxpZGF0ZV9TRCwgMTI4LCApCiAKKyNkZWZpbmUgX19CVUlMRF9CTEFTVF9VU0VSX0NBQ0hFKHBmeCwgZGVzYywgaW5kZXhvcCwgaGl0b3AsIGxzaXplKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgYmxhc3RfIyNwZngjI2NhY2hlIyNsc2l6ZSMjX3VzZXJfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2UpIFwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHBhZ2U7CQkJCQlcCisJdW5zaWduZWQgbG9uZyBlbmQgPSBwYWdlICsgUEFHRV9TSVpFOwkJCQlcCisJCQkJCQkJCQlcCisJX18jI3BmeCMjZmx1c2hfcHJvbG9ndWUJCQkJCQlcCisJCQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljYWNoZSMjbHNpemUjI191bnJvbGwzMl91c2VyKHN0YXJ0LCBoaXRvcCk7ICAgICAgICAgICAgIFwKKwkJc3RhcnQgKz0gbHNpemUgKiAzMjsJCQkJCVwKKwl9IHdoaWxlIChzdGFydCA8IGVuZCk7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fIyNwZngjI2ZsdXNoX2VwaWxvZ3VlCQkJCQkJXAorfQorCitfX0JVSUxEX0JMQVNUX1VTRVJfQ0FDSEUoZCwgZGNhY2hlLCBJbmRleF9Xcml0ZWJhY2tfSW52X0QsIEhpdF9Xcml0ZWJhY2tfSW52X0QsCisJCQkgMTYpCitfX0JVSUxEX0JMQVNUX1VTRVJfQ0FDSEUoaSwgaWNhY2hlLCBJbmRleF9JbnZhbGlkYXRlX0ksIEhpdF9JbnZhbGlkYXRlX0ksIDE2KQorX19CVUlMRF9CTEFTVF9VU0VSX0NBQ0hFKGQsIGRjYWNoZSwgSW5kZXhfV3JpdGViYWNrX0ludl9ELCBIaXRfV3JpdGViYWNrX0ludl9ELAorCQkJIDMyKQorX19CVUlMRF9CTEFTVF9VU0VSX0NBQ0hFKGksIGljYWNoZSwgSW5kZXhfSW52YWxpZGF0ZV9JLCBIaXRfSW52YWxpZGF0ZV9JLCAzMikKK19fQlVJTERfQkxBU1RfVVNFUl9DQUNIRShkLCBkY2FjaGUsIEluZGV4X1dyaXRlYmFja19JbnZfRCwgSGl0X1dyaXRlYmFja19JbnZfRCwKKwkJCSA2NCkKK19fQlVJTERfQkxBU1RfVVNFUl9DQUNIRShpLCBpY2FjaGUsIEluZGV4X0ludmFsaWRhdGVfSSwgSGl0X0ludmFsaWRhdGVfSSwgNjQpCisKIC8qIGJ1aWxkIGJsYXN0X3h4eF9yYW5nZSwgcHJvdGVjdGVkX2JsYXN0X3h4eF9yYW5nZSAqLwogI2RlZmluZSBfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKHBmeCwgZGVzYywgaGl0b3AsIHByb3QsIGV4dHJhKQlcCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJvdCMjZXh0cmEjI2JsYXN0XyMjcGZ4IyNjYWNoZSMjX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIFwKQEAgLTQ1MCwxMiArNTgwLDUxIEBACiAJX18jI3BmeCMjZmx1c2hfZXBpbG9ndWUJCQkJCQlcCiB9CiAKKyNpZm5kZWYgQ09ORklHX0VWQQorCiBfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKGQsIGRjYWNoZSwgSGl0X1dyaXRlYmFja19JbnZfRCwgcHJvdGVjdGVkXywgKQotX19CVUlMRF9CTEFTVF9DQUNIRV9SQU5HRShzLCBzY2FjaGUsIEhpdF9Xcml0ZWJhY2tfSW52X1NELCBwcm90ZWN0ZWRfLCApCiBfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKGksIGljYWNoZSwgSGl0X0ludmFsaWRhdGVfSSwgcHJvdGVjdGVkXywgKQorCisjZWxzZQorCisjZGVmaW5lIF9fQlVJTERfUFJPVF9CTEFTVF9DQUNIRV9SQU5HRShwZngsIGRlc2MsIGhpdG9wKQkJXAorc3RhdGljIGlubGluZSB2b2lkIHByb3RlY3RlZF9ibGFzdF8jI3BmeCMjY2FjaGUjI19yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LFwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGVuZCkgXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGxzaXplID0gY3B1XyMjZGVzYyMjX2xpbmVfc2l6ZSgpOwkJCVwKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydCAmIH4obHNpemUgLSAxKTsJCQlcCisJdW5zaWduZWQgbG9uZyBhZW5kID0gKGVuZCAtIDEpICYgfihsc2l6ZSAtIDEpOwkJCVwKKwkJCQkJCQkJCVwKKwlfXyMjcGZ4IyNmbHVzaF9wcm9sb2d1ZQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgVVNFUl9EUykpIHsJCQkJXAorCQl3aGlsZSAoMSkgewkJCQkJCVwKKwkJCXByb3RlY3RlZF9jYWNoZWVfb3AoaGl0b3AsIGFkZHIpOwkJXAorCQkJaWYgKGFkZHIgPT0gYWVuZCkJCQkJXAorCQkJCWJyZWFrOwkJCQkJXAorCQkJYWRkciArPSBsc2l6ZTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQl3aGlsZSAoMSkgewkJCQkJCVwKKwkJCXByb3RlY3RlZF9jYWNoZV9vcChoaXRvcCwgYWRkcik7CQlcCisJCQlpZiAoYWRkciA9PSBhZW5kKQkJCQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQlhZGRyICs9IGxzaXplOwkJCQkJXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJX18jI3BmeCMjZmx1c2hfZXBpbG9ndWUJCQkJCQlcCit9CisKK19fQlVJTERfUFJPVF9CTEFTVF9DQUNIRV9SQU5HRShkLCBkY2FjaGUsIEhpdF9Xcml0ZWJhY2tfSW52X0QpCitfX0JVSUxEX1BST1RfQkxBU1RfQ0FDSEVfUkFOR0UoaSwgaWNhY2hlLCBIaXRfSW52YWxpZGF0ZV9JKQorCisjZW5kaWYKK19fQlVJTERfQkxBU1RfQ0FDSEVfUkFOR0Uocywgc2NhY2hlLCBIaXRfV3JpdGViYWNrX0ludl9TRCwgcHJvdGVjdGVkXywgKQogX19CVUlMRF9CTEFTVF9DQUNIRV9SQU5HRShpLCBpY2FjaGUsIEhpdF9JbnZhbGlkYXRlX0lfTG9vbmdzb24yLCBcCiAJcHJvdGVjdGVkXywgbG9vbmdzb24yXykKIF9fQlVJTERfQkxBU1RfQ0FDSEVfUkFOR0UoZCwgZGNhY2hlLCBIaXRfV3JpdGViYWNrX0ludl9ELCAsICkKK19fQlVJTERfQkxBU1RfQ0FDSEVfUkFOR0UoaSwgaWNhY2hlLCBIaXRfSW52YWxpZGF0ZV9JLCAsICkKIF9fQlVJTERfQkxBU1RfQ0FDSEVfUkFOR0Uocywgc2NhY2hlLCBIaXRfV3JpdGViYWNrX0ludl9TRCwgLCApCiAvKiBibGFzdF9pbnZfZGNhY2hlX3JhbmdlICovCiBfX0JVSUxEX0JMQVNUX0NBQ0hFX1JBTkdFKGludl9kLCBkY2FjaGUsIEhpdF9JbnZhbGlkYXRlX0QsICwgKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKaW5kZXggZWVlYjBmNC4uZjU0YmRiZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCkBAIC0zMiw2ICszMiw4IEBACiAJX191MzIJCXNjX2xvMjsKIAlfX3UzMgkJc2NfaGkzOwogCV9fdTMyCQlzY19sbzM7CisJX191NjQJCXNjX21zYXJlZ3NbMzJdOwkvKiBNb3N0IHNpZ25pZmljYW50IDY0IGJpdHMgKi8KKwlfX3UzMgkJc2NfbXNhX2NzcjsKIH07CiAjZW5kaWYgLyogX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkk2NCB8fCBfTUlQU19TSU0gPT0gX01JUFNfU0lNX05BQkkzMiAqLwogI2VuZGlmIC8qIF9BU01fU0lHQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLWNwcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1jcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBkMWEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1jcHMuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBQYXVsIEJ1cnRvbiA8cGF1bC5idXJ0b25AaW1ndGVjLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX01JUFNfQVNNX1NNUF9DUFNfSF9fCisjZGVmaW5lIF9fTUlQU19BU01fU01QX0NQU19IX18KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworc3RydWN0IGJvb3RfY29uZmlnIHsKKwl1bnNpZ25lZCBpbnQgY29yZTsKKwl1bnNpZ25lZCBpbnQgdnBlOworCXVuc2lnbmVkIGxvbmcgcGM7CisJdW5zaWduZWQgbG9uZyBzcDsKKwl1bnNpZ25lZCBsb25nIGdwOworfTsKKworZXh0ZXJuIHN0cnVjdCBib290X2NvbmZpZyBtaXBzX2Nwc19ib290Y2ZnOworCitleHRlcm4gdm9pZCBtaXBzX2Nwc19jb3JlX2VudHJ5KHZvaWQpOworCisjZWxzZSAvKiBfX0FTU0VNQkxZX18gKi8KKworLmV4dGVybiBtaXBzX2Nwc19ib290Y2ZnOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX19NSVBTX0FTTV9TTVBfQ1BTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1vcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAtb3BzLmgKaW5kZXggZWYyYTgwNC4uNzNkMzViMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1vcHMuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLW9wcy5oCkBAIC0xMyw2ICsxMyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCisjaW5jbHVkZSA8YXNtL21pcHMtY20uaD4KKwogI2lmZGVmIENPTkZJR19TTVAKIAogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KQEAgLTQzLDYgKzQ1LDkgQEAKIAltcF9vcHMtPnNtcF9zZXR1cCgpOwogfQogCitleHRlcm4gdm9pZCBnaWNfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pOworZXh0ZXJuIHZvaWQgZ2ljX3NlbmRfaXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBhY3Rpb24pOworCiAjZWxzZSAvKiAhQ09ORklHX1NNUCAqLwogCiBzdHJ1Y3QgcGxhdF9zbXBfb3BzOwpAQCAtNzYsNiArODEsOSBAQAogI2lmZGVmIENPTkZJR19NSVBTX0NNUAogCWV4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIGNtcF9zbXBfb3BzOwogCisJaWYgKCFtaXBzX2NtX3ByZXNlbnQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlyZWdpc3Rlcl9zbXBfb3BzKCZjbXBfc21wX29wcyk7CiAKIAlyZXR1cm4gMDsKQEAgLTk3LDQgKzEwNSwxMyBAQAogI2VuZGlmCiB9CiAKKyNpZmRlZiBDT05GSUdfTUlQU19DUFMKK2V4dGVybiBpbnQgcmVnaXN0ZXJfY3BzX3NtcF9vcHModm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfY3BzX3NtcF9vcHModm9pZCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKyNlbmRpZgorCiAjZW5kaWYgLyogX19BU01fU01QX09QU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggZWI2MDA4Ny4uZWZhMDJhYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAuaApAQCAtNDIsNiArNDIsNyBAQAogI2RlZmluZSBTTVBfSUNBQ0hFX0ZMVVNICTB4NAogLyogVXNlZCBieSBrZXhlYyBjcmFzaGR1bXAgdG8gc2F2ZSBhbGwgY3B1J3Mgc3RhdGUgKi8KICNkZWZpbmUgU01QX0RVTVAJCTB4OAorI2RlZmluZSBTTVBfQVNLX0MwQ09VTlQJCTB4MTAKIAogZXh0ZXJuIHZvbGF0aWxlIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YWNrZnJhbWUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGFja2ZyYW1lLmgKaW5kZXggNDg1N2UyYy4uZDMwMWUxMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YWNrZnJhbWUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhY2tmcmFtZS5oCkBAIC00MzUsNyArNDM1LDcgQEAKIAogCQkubWFjcm8JUkVTVE9SRV9TUF9BTkRfUkVUCiAJCUxPTkdfTAlzcCwgUFRfUjI5KHNwKQotCQkuc2V0CW1pcHMzCisJCS5zZXQJYXJjaD1yNDAwMAogCQllcmV0CiAJCS5zZXQJbWlwczAKIAkJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaAppbmRleCAyNzhkNDVhLi40OTVjMTA0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCkBAIC0xNiwyMiArMTYsMjkgQEAKICNpbmNsdWRlIDxhc20vd2F0Y2guaD4KICNpbmNsdWRlIDxhc20vZHNwLmg+CiAjaW5jbHVkZSA8YXNtL2NvcDIuaD4KKyNpbmNsdWRlIDxhc20vbXNhLmg+CiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAorZW51bSB7CisJRlBfU0FWRV9OT05FCT0gMCwKKwlGUF9TQVZFX1ZFQ1RPUgk9IC0xLAorCUZQX1NBVkVfU0NBTEFSCT0gMSwKK307CisKIC8qKgogICogcmVzdW1lIC0gcmVzdW1lIGV4ZWN1dGlvbiBvZiBhIHRhc2sKICAqIEBwcmV2OglUaGUgdGFzayBwcmV2aW91c2x5IGV4ZWN1dGVkLgogICogQG5leHQ6CVRoZSB0YXNrIHRvIGJlZ2luIGV4ZWN1dGluZy4KICAqIEBuZXh0X3RpOgl0YXNrX3RocmVhZF9pbmZvKG5leHQpLgotICogQHVzZWRmcHU6CU5vbi16ZXJvIGlmIHByZXYncyBGUCBjb250ZXh0IHNob3VsZCBiZSBzYXZlZC4KKyAqIEBmcF9zYXZlOglXaGljaCwgaWYgYW55LCBGUCBjb250ZXh0IHRvIHNhdmUgZm9yIHByZXYuCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoaWxzdCBzY2hlZHVsaW5nIHRvIHNhdmUgdGhlIGNvbnRleHQgb2YgcHJldiAmIGxvYWQKICAqIHRoZSBjb250ZXh0IG9mIG5leHQuIFJldHVybnMgcHJldi4KICAqLwogZXh0ZXJuIGFzbWxpbmthZ2Ugc3RydWN0IHRhc2tfc3RydWN0ICpyZXN1bWUoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsIHN0cnVjdCB0aHJlYWRfaW5mbyAqbmV4dF90aSwKLQkJdTMyIHVzZWRmcHUpOworCQlzMzIgZnBfc2F2ZSk7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgbGxfYml0OwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqbGxfdGFzazsKQEAgLTc1LDcgKzgyLDggQEAKIAogI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JdTMyIF9fdXNlZGZwdSwgX19jMF9zdGF0OwkJCQkJXAorCXUzMiBfX2MwX3N0YXQ7CQkJCQkJCVwKKwlzMzIgX19mcHNhdmUgPSBGUF9TQVZFX05PTkU7CQkJCQlcCiAJX19taXBzX210X2ZwYWZmX3N3aXRjaF90byhwcmV2KTsJCQkJXAogCWlmIChjcHVfaGFzX2RzcCkJCQkJCQlcCiAJCV9fc2F2ZV9kc3AocHJldik7CQkJCQlcCkBAIC04OCw4ICs5NiwxMiBAQAogCQl3cml0ZV9jMF9zdGF0dXMoX19jMF9zdGF0ICYgflNUMF9DVTIpOwkJCVwKIAl9CQkJCQkJCQlcCiAJX19jbGVhcl9zb2Z0d2FyZV9sbF9iaXQoKTsJCQkJCVwKLQlfX3VzZWRmcHUgPSB0ZXN0X2FuZF9jbGVhcl90c2tfdGhyZWFkX2ZsYWcocHJldiwgVElGX1VTRURGUFUpOwlcCi0JKGxhc3QpID0gcmVzdW1lKHByZXYsIG5leHQsIHRhc2tfdGhyZWFkX2luZm8obmV4dCksIF9fdXNlZGZwdSk7IFwKKwlpZiAodGVzdF9hbmRfY2xlYXJfdHNrX3RocmVhZF9mbGFnKHByZXYsIFRJRl9VU0VERlBVKSkJCVwKKwkJX19mcHNhdmUgPSBGUF9TQVZFX1NDQUxBUjsJCQkJXAorCWlmICh0ZXN0X2FuZF9jbGVhcl90c2tfdGhyZWFkX2ZsYWcocHJldiwgVElGX1VTRURNU0EpKQkJXAorCQlfX2Zwc2F2ZSA9IEZQX1NBVkVfVkVDVE9SOwkJCQlcCisJKGxhc3QpID0gcmVzdW1lKHByZXYsIG5leHQsIHRhc2tfdGhyZWFkX2luZm8obmV4dCksIF9fZnBzYXZlKTsJXAorCWRpc2FibGVfbXNhKCk7CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3lzY2FsbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N5c2NhbGwuaAppbmRleCAzM2U4ZGJmLi42YzQ4OGM4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3lzY2FsbC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKQEAgLTEzLDE3ICsxMywyOSBAQAogI2lmbmRlZiBfX0FTTV9NSVBTX1NZU0NBTExfSAogI2RlZmluZSBfX0FTTV9NSVBTX1NZU0NBTExfSAogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNpZm5kZWYgX19OUl9zeXNjYWxsIC8qIE9ubHkgZGVmaW5lZCBpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyICovCisjZGVmaW5lIF9fTlJfc3lzY2FsbCA0MDAwCisjZW5kaWYKIAogc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X25yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXJldHVybiByZWdzLT5yZWdzWzJdOworCS8qIE8zMiBBQkkgc3lzY2FsbCgpIC0gRWl0aGVyIDY0LWJpdCB3aXRoIE8zMiBvciAzMi1iaXQgKi8KKwlpZiAoKGNvbmZpZ19lbmFibGVkKENPTkZJR18zMkJJVCkgfHwKKwkgICAgdGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGXzMyQklUX1JFR1MpKSAmJgorCSAgICAocmVncy0+cmVnc1syXSA9PSBfX05SX3N5c2NhbGwpKQorCQlyZXR1cm4gcmVncy0+cmVnc1s0XTsKKwllbHNlCisJCXJldHVybiByZWdzLT5yZWdzWzJdOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWlwc19nZXRfc3lzY2FsbF9hcmcodW5zaWduZWQgbG9uZyAqYXJnLApAQCAtMzksMTQgKzUxLDE0IEBACiAKICNpZmRlZiBDT05GSUdfMzJCSVQKIAljYXNlIDQ6IGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6Ci0JCXJldHVybiBnZXRfdXNlcigqYXJnLCAoaW50ICopdXNwICsgNCAqIG4pOworCQlyZXR1cm4gZ2V0X3VzZXIoKmFyZywgKGludCAqKXVzcCArIG4pOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAljYXNlIDQ6IGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6CiAjaWZkZWYgQ09ORklHX01JUFMzMl9PMzIKIAkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX1JFR1MpKQotCQkJcmV0dXJuIGdldF91c2VyKCphcmcsIChpbnQgKil1c3AgKyA0ICogbik7CisJCQlyZXR1cm4gZ2V0X3VzZXIoKmFyZywgKGludCAqKXVzcCArIG4pOwogCQllbHNlCiAjZW5kaWYKIAkJCSphcmcgPSByZWdzLT5yZWdzWzQgKyBuXTsKQEAgLTU3LDYgKzY5LDggQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CisKKwl1bnJlYWNoYWJsZSgpOwogfQogCiBzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfcmV0dXJuX3ZhbHVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKQEAgLTY1LDYgKzc5LDEyIEBACiAJcmV0dXJuIHJlZ3MtPnJlZ3NbMl07CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX3JvbGxiYWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogRG8gbm90aGluZyAqLworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9zZXRfcmV0dXJuX3ZhbHVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJCQkgICAgaW50IGVycm9yLCBsb25nIHZhbCkKQEAgLTgzLDExICsxMDMsMTcgQEAKIAkJCQkJIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBhcmc7CiAJaW50IHJldDsKKwkvKiBPMzIgQUJJIHN5c2NhbGwoKSAtIEVpdGhlciA2NC1iaXQgd2l0aCBPMzIgb3IgMzItYml0ICovCisJaWYgKChjb25maWdfZW5hYmxlZChDT05GSUdfMzJCSVQpIHx8CisJICAgIHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl8zMkJJVF9SRUdTKSkgJiYKKwkgICAgKHJlZ3MtPnJlZ3NbMl0gPT0gX19OUl9zeXNjYWxsKSkgeworCQlpKys7CisJCW4rKzsKKwl9CiAKIAl3aGlsZSAobi0tKQotCQlyZXQgfD0gbWlwc19nZXRfc3lzY2FsbF9hcmcoJmFyZywgdGFzaywgcmVncywgaSsrKTsKKwkJcmV0IHw9IG1pcHNfZ2V0X3N5c2NhbGxfYXJnKGFyZ3MrKywgdGFzaywgcmVncywgaSsrKTsKIAogCS8qCiAJICogTm8gd2F5IHRvIGNvbW11bmljYXRlIGFuIGVycm9yIGJlY2F1c2UgdGhpcyBpcyBhIHZvaWQgZnVuY3Rpb24uCkBAIC0xMDEsMTEgKzEyNywxMyBAQAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgc3lzMzJfY2FsbF90YWJsZVtdOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgc3lzbjMyX2NhbGxfdGFibGVbXTsKIAotc3RhdGljIGlubGluZSBpbnQgX19zeXNjYWxsX2dldF9hcmNoKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBzeXNjYWxsX2dldF9hcmNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgYXJjaCA9IEVNX01JUFM7CiAjaWZkZWYgQ09ORklHXzY0QklUCi0JYXJjaCB8PSAgX19BVURJVF9BUkNIXzY0QklUOworCWlmICghdGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGXzMyQklUX1JFR1MpKQorCQlhcmNoIHw9IF9fQVVESVRfQVJDSF82NEJJVDsKICNlbmRpZgogI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCWFyY2ggfD0gIF9fQVVESVRfQVJDSF9MRTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggMjQ4NDZmOS4uZDJkOTYxZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTExNiw2ICsxMTYsOCBAQAogI2RlZmluZSBUSUZfTE9BRF9XQVRDSAkJMjUJLyogSWYgc2V0LCBsb2FkIHdhdGNoIHJlZ2lzdGVycyAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRVBPSU5UCTI2CS8qIHN5c2NhbGwgdHJhY2Vwb2ludCBpbnN0cnVtZW50YXRpb24gKi8KICNkZWZpbmUgVElGXzMyQklUX0ZQUkVHUwkyNwkvKiAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRJRl9VU0VETVNBCQkyOQkvKiBNU0EgaGFzIGJlZW4gdXNlZCB0aGlzIHF1YW50dW0gKi8KKyNkZWZpbmUgVElGX01TQV9DVFhfTElWRQkzMAkvKiBNU0EgY29udGV4dCBtdXN0IGJlIHByZXNlcnZlZCAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQkzMQkvKiBzeXNjYWxsIHRyYWNlIGFjdGl2ZSAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCkBAIC0xMzMsMTAgKzEzNSwxMyBAQAogI2RlZmluZSBfVElGX0ZQVUJPVU5ECQkoMTw8VElGX0ZQVUJPVU5EKQogI2RlZmluZSBfVElGX0xPQURfV0FUQ0gJCSgxPDxUSUZfTE9BRF9XQVRDSCkKICNkZWZpbmUgX1RJRl8zMkJJVF9GUFJFR1MJKDE8PFRJRl8zMkJJVF9GUFJFR1MpCisjZGVmaW5lIF9USUZfVVNFRE1TQQkJKDE8PFRJRl9VU0VETVNBKQorI2RlZmluZSBfVElGX01TQV9DVFhfTElWRQkoMTw8VElGX01TQV9DVFhfTElWRSkKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQJKDE8PFRJRl9TWVNDQUxMX1RSQUNFUE9JTlQpCiAKICNkZWZpbmUgX1RJRl9XT1JLX1NZU0NBTExfRU5UUlkJKF9USUZfTk9IWiB8IF9USUZfU1lTQ0FMTF9UUkFDRSB8CVwKLQkJCQkgX1RJRl9TWVNDQUxMX0FVRElUIHwgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQpCisJCQkJIF9USUZfU1lTQ0FMTF9BVURJVCB8IFwKKwkJCQkgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQgfCBfVElGX1NFQ0NPTVApCiAKIC8qIHdvcmsgdG8gZG8gaW4gc3lzY2FsbF90cmFjZV9sZWF2ZSgpICovCiAjZGVmaW5lIF9USUZfV09SS19TWVNDQUxMX0VYSVQJKF9USUZfTk9IWiB8IF9USUZfU1lTQ0FMTF9UUkFDRSB8CVwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggMTI2MDlhMS4uMjBlYTQ4NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTEwLDggKzEwLDQgQEAKIAogI2luY2x1ZGUgPHRvcG9sb2d5Lmg+CiAKLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIHNtdF9jYXBhYmxlKCkJKHNtcF9udW1fc2libGluZ3MgPiAxKQotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0FTTV9UT1BPTE9HWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBmM2ZhMzc1Li5hMTA5NTEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTYsNiArNiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDAzLCAwNCBieSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIE1hY2llaiBXLiBSb3p5Y2tpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKi8KICNpZm5kZWYgX0FTTV9VQUNDRVNTX0gKICNkZWZpbmUgX0FTTV9VQUNDRVNTX0gKQEAgLTEzLDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1ldmEuaD4KIAogLyoKICAqIFRoZSBmcyB2YWx1ZSBkZXRlcm1pbmVzIHdoZXRoZXIgYXJndW1lbnQgdmFsaWRpdHkgY2hlY2tpbmcgc2hvdWxkIGJlCkBAIC0yMjIsMTEgKzIyNCw0NCBAQAogICogWXVjay4gIFdlIG5lZWQgdHdvIHZhcmlhbnRzLCBvbmUgZm9yIDY0Yml0IG9wZXJhdGlvbiBhbmQgb25lCiAgKiBmb3IgMzIgYml0IG1vZGUgYW5kIG9sZCBpcm9uLgogICovCisjaWZuZGVmIENPTkZJR19FVkEKKyNkZWZpbmUgX19nZXRfa2VybmVsX2NvbW1vbih2YWwsIHNpemUsIHB0cikgX19nZXRfdXNlcl9jb21tb24odmFsLCBzaXplLCBwdHIpCisjZWxzZQorLyoKKyAqIEtlcm5lbCBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIEVWQS4gV2UgbmVlZCB0byB1c2Ugbm9ybWFsIGxvYWQgaW5zdHJ1Y3Rpb25zCisgKiB0byByZWFkIGRhdGEgZnJvbSBrZXJuZWwgd2hlbiBvcGVyYXRpbmcgaW4gRVZBIG1vZGUuIFdlIHVzZSB0aGVzZSBtYWNyb3MgdG8KKyAqIGF2b2lkIHJlZGVmaW5pbmcgX19nZXRfdXNlcl9hc20gZm9yIEVWQS4KKyAqLworI3VuZGVmIF9sb2FkZAorI3VuZGVmIF9sb2FkdworI3VuZGVmIF9sb2FkaAorI3VuZGVmIF9sb2FkYgogI2lmZGVmIENPTkZJR18zMkJJVAotI2RlZmluZSBfX0dFVF9VU0VSX0RXKHZhbCwgcHRyKSBfX2dldF91c2VyX2FzbV9sbDMyKHZhbCwgcHRyKQorI2RlZmluZSBfbG9hZGQJCQlfbG9hZHcKKyNlbHNlCisjZGVmaW5lIF9sb2FkZChyZWcsIGFkZHIpCSJsZCAiIHJlZyAiLCAiIGFkZHIKKyNlbmRpZgorI2RlZmluZSBfbG9hZHcocmVnLCBhZGRyKQkibHcgIiByZWcgIiwgIiBhZGRyCisjZGVmaW5lIF9sb2FkaChyZWcsIGFkZHIpCSJsaCAiIHJlZyAiLCAiIGFkZHIKKyNkZWZpbmUgX2xvYWRiKHJlZywgYWRkcikJImxiICIgcmVnICIsICIgYWRkcgorCisjZGVmaW5lIF9fZ2V0X2tlcm5lbF9jb21tb24odmFsLCBzaXplLCBwdHIpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKwljYXNlIDE6IF9fZ2V0X2RhdGFfYXNtKHZhbCwgX2xvYWRiLCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDI6IF9fZ2V0X2RhdGFfYXNtKHZhbCwgX2xvYWRoLCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDQ6IF9fZ2V0X2RhdGFfYXNtKHZhbCwgX2xvYWR3LCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDg6IF9fR0VUX0RXKHZhbCwgX2xvYWRkLCBwdHIpOyBicmVhazsJCQlcCisJZGVmYXVsdDogX19nZXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzMyQklUCisjZGVmaW5lIF9fR0VUX0RXKHZhbCwgaW5zbiwgcHRyKSBfX2dldF9kYXRhX2FzbV9sbDMyKHZhbCwgaW5zbiwgcHRyKQogI2VuZGlmCiAjaWZkZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIF9fR0VUX1VTRVJfRFcodmFsLCBwdHIpIF9fZ2V0X3VzZXJfYXNtKHZhbCwgImxkIiwgcHRyKQorI2RlZmluZSBfX0dFVF9EVyh2YWwsIGluc24sIHB0cikgX19nZXRfZGF0YV9hc20odmFsLCBpbnNuLCBwdHIpCiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgX19nZXRfdXNlcl91bmtub3duKHZvaWQpOwpAQCAtMjM0LDEwICsyNjksMTAgQEAKICNkZWZpbmUgX19nZXRfdXNlcl9jb21tb24odmFsLCBzaXplLCBwdHIpCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKLQljYXNlIDE6IF9fZ2V0X3VzZXJfYXNtKHZhbCwgImxiIiwgcHRyKTsgYnJlYWs7CQkJXAotCWNhc2UgMjogX19nZXRfdXNlcl9hc20odmFsLCAibGgiLCBwdHIpOyBicmVhazsJCQlcCi0JY2FzZSA0OiBfX2dldF91c2VyX2FzbSh2YWwsICJsdyIsIHB0cik7IGJyZWFrOwkJCVwKLQljYXNlIDg6IF9fR0VUX1VTRVJfRFcodmFsLCBwdHIpOyBicmVhazsJCQkJXAorCWNhc2UgMTogX19nZXRfZGF0YV9hc20odmFsLCB1c2VyX2xiLCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDI6IF9fZ2V0X2RhdGFfYXNtKHZhbCwgdXNlcl9saCwgcHRyKTsgYnJlYWs7CQlcCisJY2FzZSA0OiBfX2dldF9kYXRhX2FzbSh2YWwsIHVzZXJfbHcsIHB0cik7IGJyZWFrOwkJXAorCWNhc2UgODogX19HRVRfRFcodmFsLCB1c2VyX2xkLCBwdHIpOyBicmVhazsJCQlcCiAJZGVmYXVsdDogX19nZXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwkJCQlcCiAJfQkJCQkJCQkJXAogfSB3aGlsZSAoMCkKQEAgLTI0Niw4ICsyODEsMTIgQEAKICh7CQkJCQkJCQkJXAogCWludCBfX2d1X2VycjsJCQkJCQkJXAogCQkJCQkJCQkJXAotCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQkJXAotCV9fZ2V0X3VzZXJfY29tbW9uKCh4KSwgc2l6ZSwgcHRyKTsJCQkJXAorCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsJCQkJXAorCQlfX2dldF9rZXJuZWxfY29tbW9uKCh4KSwgc2l6ZSwgcHRyKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAorCQlfX2dldF91c2VyX2NvbW1vbigoeCksIHNpemUsIHB0cik7CQkJXAorCX0JCQkJCQkJCVwKIAlfX2d1X2VycjsJCQkJCQkJXAogfSkKIApAQCAtMjU3LDE4ICsyOTYsMjIgQEAKIAljb25zdCBfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICogX19ndV9wdHIgPSAocHRyKTsJCVwKIAkJCQkJCQkJCVwKIAltaWdodF9mYXVsdCgpOwkJCQkJCQlcCi0JaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICBfX2d1X3B0ciwgc2l6ZSkpKQkJXAotCQlfX2dldF91c2VyX2NvbW1vbigoeCksIHNpemUsIF9fZ3VfcHRyKTsJCQlcCisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICBfX2d1X3B0ciwgc2l6ZSkpKSB7CQlcCisJCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCQkJXAorCQkJX19nZXRfa2VybmVsX2NvbW1vbigoeCksIHNpemUsIF9fZ3VfcHRyKTsJXAorCQllbHNlCQkJCQkJCVwKKwkJCV9fZ2V0X3VzZXJfY29tbW9uKCh4KSwgc2l6ZSwgX19ndV9wdHIpOwkJXAorCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKIAlfX2d1X2VycjsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX2dldF91c2VyX2FzbSh2YWwsIGluc24sIGFkZHIpCQkJCQlcCisjZGVmaW5lIF9fZ2V0X2RhdGFfYXNtKHZhbCwgaW5zbiwgYWRkcikJCQkJCVwKIHsJCQkJCQkJCQlcCiAJbG9uZyBfX2d1X3RtcDsJCQkJCQkJXAogCQkJCQkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiMToJIiBpbnNuICIJJTEsICUzCQkJCVxuIglcCisJIjE6CSJpbnNuKCIlMSIsICIlMyIpIgkJCQlcbiIJXAogCSIyOgkJCQkJCQlcbiIJXAogCSIJLmluc24JCQkJCQlcbiIJXAogCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIgkJCQlcbiIJXApAQCAtMjg3LDcgKzMzMCw3IEBACiAvKgogICogR2V0IGEgbG9uZyBsb25nIDY0IHVzaW5nIDMyIGJpdCByZWdpc3RlcnMuCiAgKi8KLSNkZWZpbmUgX19nZXRfdXNlcl9hc21fbGwzMih2YWwsIGFkZHIpCQkJCQlcCisjZGVmaW5lIF9fZ2V0X2RhdGFfYXNtX2xsMzIodmFsLCBpbnNuLCBhZGRyKQkJCQlcCiB7CQkJCQkJCQkJXAogCXVuaW9uIHsJCQkJCQkJCVwKIAkJdW5zaWduZWQgbG9uZyBsb25nCWw7CQkJCVwKQEAgLTI5NSw4ICszMzgsOCBAQAogCX0gX19ndV90bXA7CQkJCQkJCVwKIAkJCQkJCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CWx3CSUxLCAoJTMpCQkJCVxuIglcCi0JIjI6CWx3CSVEMSwgNCglMykJCQkJXG4iCVwKKwkiMToJIiBpbnNuKCIlMSIsICIoJTMpIikiCQkJCVxuIglcCisJIjI6CSIgaW5zbigiJUQxIiwgIjQoJTMpIikiCQkJCVxuIglcCiAJIjM6CQkJCQkJCVxuIglcCiAJIgkuaW5zbgkJCQkJCVxuIglcCiAJIgkuc2VjdGlvbgkuZml4dXAsXCJheFwiCQkJXG4iCVwKQEAgLTMxNSwzMCArMzU4LDczIEBACiAJKHZhbCkgPSBfX2d1X3RtcC50OwkJCQkJCVwKIH0KIAorI2lmbmRlZiBDT05GSUdfRVZBCisjZGVmaW5lIF9fcHV0X2tlcm5lbF9jb21tb24ocHRyLCBzaXplKSBfX3B1dF91c2VyX2NvbW1vbihwdHIsIHNpemUpCisjZWxzZQorLyoKKyAqIEtlcm5lbCBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIEVWQS4gV2UgbmVlZCB0byB1c2Ugbm9ybWFsIGxvYWQgaW5zdHJ1Y3Rpb25zCisgKiB0byByZWFkIGRhdGEgZnJvbSBrZXJuZWwgd2hlbiBvcGVyYXRpbmcgaW4gRVZBIG1vZGUuIFdlIHVzZSB0aGVzZSBtYWNyb3MgdG8KKyAqIGF2b2lkIHJlZGVmaW5pbmcgX19nZXRfZGF0YV9hc20gZm9yIEVWQS4KKyAqLworI3VuZGVmIF9zdG9yZWQKKyN1bmRlZiBfc3RvcmV3CisjdW5kZWYgX3N0b3JlaAorI3VuZGVmIF9zdG9yZWIKKyNpZmRlZiBDT05GSUdfMzJCSVQKKyNkZWZpbmUgX3N0b3JlZAkJCV9zdG9yZXcKKyNlbHNlCisjZGVmaW5lIF9zdG9yZWQocmVnLCBhZGRyKQkibGQgIiByZWcgIiwgIiBhZGRyCisjZW5kaWYKKworI2RlZmluZSBfc3RvcmV3KHJlZywgYWRkcikJInN3ICIgcmVnICIsICIgYWRkcgorI2RlZmluZSBfc3RvcmVoKHJlZywgYWRkcikJInNoICIgcmVnICIsICIgYWRkcgorI2RlZmluZSBfc3RvcmViKHJlZywgYWRkcikJInNiICIgcmVnICIsICIgYWRkcgorCisjZGVmaW5lIF9fcHV0X2tlcm5lbF9jb21tb24ocHRyLCBzaXplKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAorCWNhc2UgMTogX19wdXRfZGF0YV9hc20oX3N0b3JlYiwgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgMjogX19wdXRfZGF0YV9hc20oX3N0b3JlaCwgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgNDogX19wdXRfZGF0YV9hc20oX3N0b3JldywgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgODogX19QVVRfRFcoX3N0b3JlZCwgcHRyKTsgYnJlYWs7CQkJCVwKKwlkZWZhdWx0OiBfX3B1dF91c2VyX3Vua25vd24oKTsgYnJlYWs7CQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlKDApCisjZW5kaWYKKwogLyoKICAqIFl1Y2suICBXZSBuZWVkIHR3byB2YXJpYW50cywgb25lIGZvciA2NGJpdCBvcGVyYXRpb24gYW5kIG9uZQogICogZm9yIDMyIGJpdCBtb2RlIGFuZCBvbGQgaXJvbi4KICAqLwogI2lmZGVmIENPTkZJR18zMkJJVAotI2RlZmluZSBfX1BVVF9VU0VSX0RXKHB0cikgX19wdXRfdXNlcl9hc21fbGwzMihwdHIpCisjZGVmaW5lIF9fUFVUX0RXKGluc24sIHB0cikgX19wdXRfZGF0YV9hc21fbGwzMihpbnNuLCBwdHIpCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgX19QVVRfVVNFUl9EVyhwdHIpIF9fcHV0X3VzZXJfYXNtKCJzZCIsIHB0cikKKyNkZWZpbmUgX19QVVRfRFcoaW5zbiwgcHRyKSBfX3B1dF9kYXRhX2FzbShpbnNuLCBwdHIpCiAjZW5kaWYKIAorI2RlZmluZSBfX3B1dF91c2VyX2NvbW1vbihwdHIsIHNpemUpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCisJY2FzZSAxOiBfX3B1dF9kYXRhX2FzbSh1c2VyX3NiLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSAyOiBfX3B1dF9kYXRhX2FzbSh1c2VyX3NoLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSA0OiBfX3B1dF9kYXRhX2FzbSh1c2VyX3N3LCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSA4OiBfX1BVVF9EVyh1c2VyX3NkLCBwdHIpOyBicmVhazsJCQkJXAorCWRlZmF1bHQ6IF9fcHV0X3VzZXJfdW5rbm93bigpOyBicmVhazsJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKICNkZWZpbmUgX19wdXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQkJXAogKHsJCQkJCQkJCQlcCiAJX190eXBlb2ZfXygqKHB0cikpIF9fcHVfdmFsOwkJCQkJXAogCWludCBfX3B1X2VyciA9IDA7CQkJCQkJXAogCQkJCQkJCQkJXAotCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQkJXAogCV9fcHVfdmFsID0gKHgpOwkJCQkJCQlcCi0Jc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKLQljYXNlIDE6IF9fcHV0X3VzZXJfYXNtKCJzYiIsIHB0cik7IGJyZWFrOwkJCVwKLQljYXNlIDI6IF9fcHV0X3VzZXJfYXNtKCJzaCIsIHB0cik7IGJyZWFrOwkJCVwKLQljYXNlIDQ6IF9fcHV0X3VzZXJfYXNtKCJzdyIsIHB0cik7IGJyZWFrOwkJCVwKLQljYXNlIDg6IF9fUFVUX1VTRVJfRFcocHRyKTsgYnJlYWs7CQkJCVwKLQlkZWZhdWx0OiBfX3B1dF91c2VyX3Vua25vd24oKTsgYnJlYWs7CQkJCVwKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKSB7CQkJCVwKKwkJX19wdXRfa2VybmVsX2NvbW1vbihwdHIsIHNpemUpOwkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAorCQlfX3B1dF91c2VyX2NvbW1vbihwdHIsIHNpemUpOwkJCQlcCiAJfQkJCQkJCQkJXAogCV9fcHVfZXJyOwkJCQkJCQlcCiB9KQpAQCAtMzUxLDIxICs0MzcsMTkgQEAKIAkJCQkJCQkJCVwKIAltaWdodF9mYXVsdCgpOwkJCQkJCQlcCiAJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAgX19wdV9hZGRyLCBzaXplKSkpIHsJXAotCQlzd2l0Y2ggKHNpemUpIHsJCQkJCQlcCi0JCWNhc2UgMTogX19wdXRfdXNlcl9hc20oInNiIiwgX19wdV9hZGRyKTsgYnJlYWs7CQlcCi0JCWNhc2UgMjogX19wdXRfdXNlcl9hc20oInNoIiwgX19wdV9hZGRyKTsgYnJlYWs7CQlcCi0JCWNhc2UgNDogX19wdXRfdXNlcl9hc20oInN3IiwgX19wdV9hZGRyKTsgYnJlYWs7CQlcCi0JCWNhc2UgODogX19QVVRfVVNFUl9EVyhfX3B1X2FkZHIpOyBicmVhazsJCVwKLQkJZGVmYXVsdDogX19wdXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwkJCVwKLQkJfQkJCQkJCQlcCisJCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCQkJXAorCQkJX19wdXRfa2VybmVsX2NvbW1vbihfX3B1X2FkZHIsIHNpemUpOwkJXAorCQllbHNlCQkJCQkJCVwKKwkJCV9fcHV0X3VzZXJfY29tbW9uKF9fcHVfYWRkciwgc2l6ZSk7CQlcCiAJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAogCV9fcHVfZXJyOwkJCQkJCQlcCiB9KQogCi0jZGVmaW5lIF9fcHV0X3VzZXJfYXNtKGluc24sIHB0cikJCQkJCVwKKyNkZWZpbmUgX19wdXRfZGF0YV9hc20oaW5zbiwgcHRyKQkJCQkJXAogewkJCQkJCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CSIgaW5zbiAiCSV6MiwgJTMJCSMgX19wdXRfdXNlcl9hc21cbiIJXAorCSIxOgkiaW5zbigiJXoyIiwgIiUzIikiCSMgX19wdXRfZGF0YV9hc20JXG4iCVwKIAkiMjoJCQkJCQkJXG4iCVwKIAkiCS5pbnNuCQkJCQkJXG4iCVwKIAkiCS5zZWN0aW9uCS5maXh1cCxcImF4XCIJCQlcbiIJXApAQCAtMzgwLDExICs0NjQsMTEgQEAKIAkgICJpIiAoLUVGQVVMVCkpOwkJCQkJCVwKIH0KIAotI2RlZmluZSBfX3B1dF91c2VyX2FzbV9sbDMyKHB0cikJCQkJCVwKKyNkZWZpbmUgX19wdXRfZGF0YV9hc21fbGwzMihpbnNuLCBwdHIpCQkJCQlcCiB7CQkJCQkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiMToJc3cJJTIsICglMykJIyBfX3B1dF91c2VyX2FzbV9sbDMyCVxuIglcCi0JIjI6CXN3CSVEMiwgNCglMykJCQkJXG4iCVwKKwkiMToJImluc24oIiUyIiwgIiglMykiKSIJIyBfX3B1dF9kYXRhX2FzbV9sbDMyCVxuIglcCisJIjI6CSJpbnNuKCIlRDIiLCAiNCglMykiKSIJCQkJXG4iCVwKIAkiMzoJCQkJCQkJXG4iCVwKIAkiCS5pbnNuCQkJCQkJXG4iCVwKIAkiCS5zZWN0aW9uCS5maXh1cCxcImF4XCIJCQlcbiIJXApAQCAtNDAzLDYgKzQ4NywxMSBAQAogZXh0ZXJuIHZvaWQgX19wdXRfdXNlcl91bmtub3duKHZvaWQpOwogCiAvKgorICogdWx7YixoLHd9IGFyZSBtYWNyb3MgYW5kIHRoZXJlIGFyZSBubyBlcXVpdmFsZW50IG1hY3JvcyBmb3IgRVZBLgorICogRVZBIHVuYWxpZ25lZCBhY2Nlc3MgaXMgaGFuZGxlZCBpbiB0aGUgQURFIGV4Y2VwdGlvbiBoYW5kbGVyLgorICovCisjaWZuZGVmIENPTkZJR19FVkEKKy8qCiAgKiBwdXRfdXNlcl91bmFsaWduZWQ6IC0gV3JpdGUgYSBzaW1wbGUgdmFsdWUgaW50byB1c2VyIHNwYWNlLgogICogQHg6CSBWYWx1ZSB0byBjb3B5IHRvIHVzZXIgc3BhY2UuCiAgKiBAcHRyOiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgpAQCAtNTA0LDcgKzU5Myw3IEBACiAjZGVmaW5lIF9fZ2V0X3VzZXJfdW5hbGlnbmVkX2NvbW1vbih2YWwsIHNpemUsIHB0cikJCQlcCiBkbyB7CQkJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCi0JY2FzZSAxOiBfX2dldF91c2VyX2FzbSh2YWwsICJsYiIsIHB0cik7IGJyZWFrOwkJCVwKKwljYXNlIDE6IF9fZ2V0X2RhdGFfYXNtKHZhbCwgImxiIiwgcHRyKTsgYnJlYWs7CQkJXAogCWNhc2UgMjogX19nZXRfdXNlcl91bmFsaWduZWRfYXNtKHZhbCwgInVsaCIsIHB0cik7IGJyZWFrOwlcCiAJY2FzZSA0OiBfX2dldF91c2VyX3VuYWxpZ25lZF9hc20odmFsLCAidWx3IiwgcHRyKTsgYnJlYWs7CVwKIAljYXNlIDg6IF9fR0VUX1VTRVJfVU5BTElHTkVEX0RXKHZhbCwgcHRyKTsgYnJlYWs7CQlcCkBAIC01MzEsNyArNjIwLDcgQEAKIAlfX2d1X2VycjsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX2dldF91c2VyX3VuYWxpZ25lZF9hc20odmFsLCBpbnNuLCBhZGRyKQkJCVwKKyNkZWZpbmUgX19nZXRfZGF0YV91bmFsaWduZWRfYXNtKHZhbCwgaW5zbiwgYWRkcikJCQlcCiB7CQkJCQkJCQkJXAogCWxvbmcgX19ndV90bXA7CQkJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTU5NCwxOSArNjgzLDIzIEBACiAjZGVmaW5lIF9fUFVUX1VTRVJfVU5BTElHTkVEX0RXKHB0cikgX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c2QiLCBwdHIpCiAjZW5kaWYKIAorI2RlZmluZSBfX3B1dF91c2VyX3VuYWxpZ25lZF9jb21tb24ocHRyLCBzaXplKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCisJY2FzZSAxOiBfX3B1dF9kYXRhX2FzbSgic2IiLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSAyOiBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc20oInVzaCIsIHB0cik7IGJyZWFrOwkJXAorCWNhc2UgNDogX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c3ciLCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDg6IF9fUFVUX1VTRVJfVU5BTElHTkVEX0RXKHB0cik7IGJyZWFrOwkJCVwKKwlkZWZhdWx0OiBfX3B1dF91c2VyX3VuYWxpZ25lZF91bmtub3duKCk7IGJyZWFrOwkJCVwKK30gd2hpbGUgKDApCisKICNkZWZpbmUgX19wdXRfdXNlcl91bmFsaWduZWRfbm9jaGVjayh4LHB0cixzaXplKQkJCVwKICh7CQkJCQkJCQkJXAogCV9fdHlwZW9mX18oKihwdHIpKSBfX3B1X3ZhbDsJCQkJCVwKIAlpbnQgX19wdV9lcnIgPSAwOwkJCQkJCVwKIAkJCQkJCQkJCVwKIAlfX3B1X3ZhbCA9ICh4KTsJCQkJCQkJXAotCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCi0JY2FzZSAxOiBfX3B1dF91c2VyX2FzbSgic2IiLCBwdHIpOyBicmVhazsJCQlcCi0JY2FzZSAyOiBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc20oInVzaCIsIHB0cik7IGJyZWFrOwkJXAotCWNhc2UgNDogX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c3ciLCBwdHIpOyBicmVhazsJCVwKLQljYXNlIDg6IF9fUFVUX1VTRVJfVU5BTElHTkVEX0RXKHB0cik7IGJyZWFrOwkJCVwKLQlkZWZhdWx0OiBfX3B1dF91c2VyX3VuYWxpZ25lZF91bmtub3duKCk7IGJyZWFrOwkJCVwKLQl9CQkJCQkJCQlcCisJX19wdXRfdXNlcl91bmFsaWduZWRfY29tbW9uKHB0ciwgc2l6ZSk7CQkJCVwKIAlfX3B1X2VycjsJCQkJCQkJXAogfSkKIApAQCAtNjE2LDE1ICs3MDksOSBAQAogCV9fdHlwZW9mX18oKihwdHIpKSBfX3B1X3ZhbCA9ICh4KTsJCQkJXAogCWludCBfX3B1X2VyciA9IC1FRkFVTFQ7CQkJCQkJXAogCQkJCQkJCQkJXAotCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgIF9fcHVfYWRkciwgc2l6ZSkpKSB7CVwKLQkJc3dpdGNoIChzaXplKSB7CQkJCQkJXAotCQljYXNlIDE6IF9fcHV0X3VzZXJfYXNtKCJzYiIsIF9fcHVfYWRkcik7IGJyZWFrOwkJXAotCQljYXNlIDI6IF9fcHV0X3VzZXJfdW5hbGlnbmVkX2FzbSgidXNoIiwgX19wdV9hZGRyKTsgYnJlYWs7IFwKLQkJY2FzZSA0OiBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc20oInVzdyIsIF9fcHVfYWRkcik7IGJyZWFrOyBcCi0JCWNhc2UgODogX19QVVRfVVNFUl9VTkFMR0lORURfRFcoX19wdV9hZGRyKTsgYnJlYWs7CVwKLQkJZGVmYXVsdDogX19wdXRfdXNlcl91bmFsaWduZWRfdW5rbm93bigpOyBicmVhazsJCVwKLQkJfQkJCQkJCQlcCi0JfQkJCQkJCQkJXAorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgIF9fcHVfYWRkciwgc2l6ZSkpKQkJXAorCQlfX3B1dF91c2VyX3VuYWxpZ25lZF9jb21tb24oX19wdV9hZGRyLCBzaXplKTsJCVwKKwkJCQkJCQkJCVwKIAlfX3B1X2VycjsJCQkJCQkJXAogfSkKIApAQCAtNjY5LDYgKzc1Niw3IEBACiB9CiAKIGV4dGVybiB2b2lkIF9fcHV0X3VzZXJfdW5hbGlnbmVkX3Vua25vd24odm9pZCk7CisjZW5kaWYKIAogLyoKICAqIFdlJ3JlIGdlbmVyYXRpbmcganVtcCB0byBzdWJyb3V0aW5lcyB3aGljaCB3aWxsIGJlIG91dHNpZGUgdGhlIHJhbmdlIG9mCkBAIC02OTMsNiArNzgxLDcgQEAKIAogZXh0ZXJuIHNpemVfdCBfX2NvcHlfdXNlcih2b2lkICpfX3RvLCBjb25zdCB2b2lkICpfX2Zyb20sIHNpemVfdCBfX24pOwogCisjaWZuZGVmIENPTkZJR19FVkEKICNkZWZpbmUgX19pbnZva2VfY29weV90b191c2VyKHRvLCBmcm9tLCBuKQkJCQlcCiAoewkJCQkJCQkJCVwKIAlyZWdpc3RlciB2b2lkIF9fdXNlciAqX19jdV90b19yIF9fYXNtX18oIiQ0Iik7CQkJXApAQCAtNzExLDYgKzgwMCwxMSBAQAogCV9fY3VfbGVuX3I7CQkJCQkJCVwKIH0pCiAKKyNkZWZpbmUgX19pbnZva2VfY29weV90b19rZXJuZWwodG8sIGZyb20sIG4pCQkJCVwKKwlfX2ludm9rZV9jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCisKKyNlbmRpZgorCiAvKgogICogX19jb3B5X3RvX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgaW50byB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCiAgKiBAdG86CSAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KQEAgLTczNSw3ICs4MjksMTIgQEAKIAlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAogCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCiAJbWlnaHRfZmF1bHQoKTsJCQkJCQkJXAotCV9fY3VfbGVuID0gX19pbnZva2VfY29weV90b191c2VyKF9fY3VfdG8sIF9fY3VfZnJvbSwgX19jdV9sZW4pOyBcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkJCQkJXAorCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fa2VybmVsKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAorCQkJCQkJICAgX19jdV9sZW4pOwkJXAorCWVsc2UJCQkJCQkJCVwKKwkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCisJCQkJCQkgX19jdV9sZW4pOwkJXAogCV9fY3VfbGVuOwkJCQkJCQlcCiB9KQogCkBAIC03NTAsNyArODQ5LDEyIEBACiAJX19jdV90byA9ICh0byk7CQkJCQkJCVwKIAlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAogCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCi0JX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywgX19jdV9mcm9tLCBfX2N1X2xlbik7IFwKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKQkJCQlcCisJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV90b19rZXJuZWwoX19jdV90bywgX19jdV9mcm9tLAlcCisJCQkJCQkgICBfX2N1X2xlbik7CQlcCisJZWxzZQkJCQkJCQkJXAorCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sCVwKKwkJCQkJCSBfX2N1X2xlbik7CQlcCiAJX19jdV9sZW47CQkJCQkJCVwKIH0pCiAKQEAgLTc2Myw4ICs4NjcsMTQgQEAKIAlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAogCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCiAJX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKF9fY3VfdG8sIF9fY3VfZnJvbSwgXAotCQkJCQkJICAgIF9fY3VfbGVuKTsJCVwKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKQkJCQlcCisJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX2tlcm5lbF9pbmF0b21pYyhfX2N1X3RvLAlcCisJCQkJCQkJICAgICAgX19jdV9mcm9tLFwKKwkJCQkJCQkgICAgICBfX2N1X2xlbik7XAorCWVsc2UJCQkJCQkJCVwKKwkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhfX2N1X3RvLAlcCisJCQkJCQkJICAgIF9fY3VfZnJvbSwJXAorCQkJCQkJCSAgICBfX2N1X2xlbik7CVwKIAlfX2N1X2xlbjsJCQkJCQkJXAogfSkKIApAQCAtNzkwLDE0ICs5MDAsMjMgQEAKIAlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAogCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCiAJX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgX19jdV90bywgX19jdV9sZW4pKSB7CQlcCi0JCW1pZ2h0X2ZhdWx0KCk7CQkJCQkJXAotCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sCVwKLQkJCQkJCSBfX2N1X2xlbik7CQlcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgewkJCQlcCisJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV90b19rZXJuZWwoX19jdV90bywJCVwKKwkJCQkJCSAgIF9fY3VfZnJvbSwJCVwKKwkJCQkJCSAgIF9fY3VfbGVuKTsJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBfX2N1X3RvLCBfX2N1X2xlbikpIHsgICAgICAgXAorCQkJbWlnaHRfZmF1bHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywJXAorCQkJCQkJCSBfX2N1X2Zyb20sCVwKKwkJCQkJCQkgX19jdV9sZW4pOyAgICAgXAorCQl9CQkJCQkJCVwKIAl9CQkJCQkJCQlcCiAJX19jdV9sZW47CQkJCQkJCVwKIH0pCiAKKyNpZm5kZWYgQ09ORklHX0VWQQorCiAjZGVmaW5lIF9faW52b2tlX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQkJCQlcCiAoewkJCQkJCQkJCVwKIAlyZWdpc3RlciB2b2lkICpfX2N1X3RvX3IgX19hc21fXygiJDQiKTsJCQkJXApAQCAtODIxLDYgKzk0MCwxNyBAQAogCV9fY3VfbGVuX3I7CQkJCQkJCVwKIH0pCiAKKyNkZWZpbmUgX19pbnZva2VfY29weV9mcm9tX2tlcm5lbCh0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQorCisvKiBGb3IgdXNlcmxhbmQgPC0+IHVzZXJsYW5kIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgX19faW52b2tlX2NvcHlfaW5fdXNlcih0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQorCisvKiBGb3Iga2VybmVsIDwtPiBrZXJuZWwgb3BlcmF0aW9ucyAqLworI2RlZmluZSBfX19pbnZva2VfY29weV9pbl9rZXJuZWwodG8sIGZyb20sIG4pCQkJCVwKKwlfX2ludm9rZV9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikKKwogI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJCQlcCiAoewkJCQkJCQkJCVwKIAlyZWdpc3RlciB2b2lkICpfX2N1X3RvX3IgX19hc21fXygiJDQiKTsJCQkJXApAQCAtODQ0LDYgKzk3NCw5NyBAQAogCV9fY3VfbGVuX3I7CQkJCQkJCVwKIH0pCiAKKyNkZWZpbmUgX19pbnZva2VfY29weV9mcm9tX2tlcm5lbF9pbmF0b21pYyh0bywgZnJvbSwgbikJCQlcCisJX19pbnZva2VfY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCQkJXAorCisjZWxzZQorCisvKiBFVkEgc3BlY2lmaWMgZnVuY3Rpb25zICovCisKK2V4dGVybiBzaXplX3QgX19jb3B5X3VzZXJfaW5hdG9taWNfZXZhKHZvaWQgKl9fdG8sIGNvbnN0IHZvaWQgKl9fZnJvbSwKKwkJCQkgICAgICAgc2l6ZV90IF9fbik7CitleHRlcm4gc2l6ZV90IF9fY29weV9mcm9tX3VzZXJfZXZhKHZvaWQgKl9fdG8sIGNvbnN0IHZvaWQgKl9fZnJvbSwKKwkJCQkgICBzaXplX3QgX19uKTsKK2V4dGVybiBzaXplX3QgX19jb3B5X3RvX3VzZXJfZXZhKHZvaWQgKl9fdG8sIGNvbnN0IHZvaWQgKl9fZnJvbSwKKwkJCQkgc2l6ZV90IF9fbik7CitleHRlcm4gc2l6ZV90IF9fY29weV9pbl91c2VyX2V2YSh2b2lkICpfX3RvLCBjb25zdCB2b2lkICpfX2Zyb20sIHNpemVfdCBfX24pOworCisjZGVmaW5lIF9faW52b2tlX2NvcHlfZnJvbV91c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBmdW5jX3B0cikJXAorKHsJCQkJCQkJCQlcCisJcmVnaXN0ZXIgdm9pZCAqX19jdV90b19yIF9fYXNtX18oIiQ0Iik7CQkJCVwKKwlyZWdpc3RlciBjb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tX3IgX19hc21fXygiJDUiKTsJCVwKKwlyZWdpc3RlciBsb25nIF9fY3VfbGVuX3IgX19hc21fXygiJDYiKTsJCQkJXAorCQkJCQkJCQkJXAorCV9fY3VfdG9fciA9ICh0byk7CQkJCQkJXAorCV9fY3VfZnJvbV9yID0gKGZyb20pOwkJCQkJCVwKKwlfX2N1X2xlbl9yID0gKG4pOwkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIi5zZXRcdG5vcmVvcmRlclxuXHQiCQkJCQkJXAorCV9fTU9EVUxFX0pBTChmdW5jX3B0cikJCQkJCQlcCisJIi5zZXRcdG5vYXRcblx0IgkJCQkJCVwKKwlfX1VBX0FERFUgIlx0JDEsICUxLCAlMlxuXHQiCQkJCQlcCisJIi5zZXRcdGF0XG5cdCIJCQkJCQkJXAorCSIuc2V0XHRyZW9yZGVyIgkJCQkJCQlcCisJOiAiK3IiIChfX2N1X3RvX3IpLCAiK3IiIChfX2N1X2Zyb21fciksICIrciIgKF9fY3VfbGVuX3IpCVwKKwk6CQkJCQkJCQlcCisJOiAiJDgiLCAiJDkiLCAiJDEwIiwgIiQxMSIsICIkMTIiLCAiJDE0IiwgIiQxNSIsICIkMjQiLCAiJDMxIiwJXAorCSAgREFERElfU0NSQVRDSCwgIm1lbW9yeSIpOwkJCQkJXAorCV9fY3VfbGVuX3I7CQkJCQkJCVwKK30pCisKKyNkZWZpbmUgX19pbnZva2VfY29weV90b191c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBmdW5jX3B0cikJXAorKHsJCQkJCQkJCQlcCisJcmVnaXN0ZXIgdm9pZCAqX19jdV90b19yIF9fYXNtX18oIiQ0Iik7CQkJCVwKKwlyZWdpc3RlciBjb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tX3IgX19hc21fXygiJDUiKTsJCVwKKwlyZWdpc3RlciBsb25nIF9fY3VfbGVuX3IgX19hc21fXygiJDYiKTsJCQkJXAorCQkJCQkJCQkJXAorCV9fY3VfdG9fciA9ICh0byk7CQkJCQkJXAorCV9fY3VfZnJvbV9yID0gKGZyb20pOwkJCQkJCVwKKwlfX2N1X2xlbl9yID0gKG4pOwkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJX19NT0RVTEVfSkFMKGZ1bmNfcHRyKQkJCQkJCVwKKwk6ICIrciIgKF9fY3VfdG9fciksICIrciIgKF9fY3VfZnJvbV9yKSwgIityIiAoX19jdV9sZW5fcikJXAorCToJCQkJCQkJCVwKKwk6ICIkOCIsICIkOSIsICIkMTAiLCAiJDExIiwgIiQxMiIsICIkMTQiLCAiJDE1IiwgIiQyNCIsICIkMzEiLAlcCisJICBEQURESV9TQ1JBVENILCAibWVtb3J5Iik7CQkJCQlcCisJX19jdV9sZW5fcjsJCQkJCQkJXAorfSkKKworLyoKKyAqIFNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGluIHVzZXJsYW5kLiBXZSBuZWVkIHRvIGdvIHRocm91Z2gKKyAqIHRoZSBUTEIKKyAqLworI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBfX2NvcHlfZnJvbV91c2VyX2V2YSkKKworI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJCQlcCisJX19pbnZva2VfY29weV9mcm9tX3VzZXJfZXZhX2dlbmVyaWModG8sIGZyb20sIG4sCQlcCisJCQkJCSAgICBfX2NvcHlfdXNlcl9pbmF0b21pY19ldmEpCisKKyNkZWZpbmUgX19pbnZva2VfY29weV90b191c2VyKHRvLCBmcm9tLCBuKQkJCQlcCisJX19pbnZva2VfY29weV90b191c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBfX2NvcHlfdG9fdXNlcl9ldmEpCisKKyNkZWZpbmUgX19faW52b2tlX2NvcHlfaW5fdXNlcih0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBfX2NvcHlfaW5fdXNlcl9ldmEpCisKKy8qCisgKiBTb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpbiB0aGUga2VybmVsLiBXZSBhcmUgbm90IGdvaW5nIHRocm91Z2gKKyAqIHRoZSBUTEIKKyAqLworI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fa2VybmVsKHRvLCBmcm9tLCBuKQkJCQlcCisJX19pbnZva2VfY29weV9mcm9tX3VzZXJfZXZhX2dlbmVyaWModG8sIGZyb20sIG4sIF9fY29weV91c2VyKQorCisjZGVmaW5lIF9faW52b2tlX2NvcHlfZnJvbV9rZXJuZWxfaW5hdG9taWModG8sIGZyb20sIG4pCQkJXAorCV9faW52b2tlX2NvcHlfZnJvbV91c2VyX2V2YV9nZW5lcmljKHRvLCBmcm9tLCBuLCBfX2NvcHlfdXNlcl9pbmF0b21pYykKKworI2RlZmluZSBfX2ludm9rZV9jb3B5X3RvX2tlcm5lbCh0bywgZnJvbSwgbikJCQkJXAorCV9faW52b2tlX2NvcHlfdG9fdXNlcl9ldmFfZ2VuZXJpYyh0bywgZnJvbSwgbiwgX19jb3B5X3VzZXIpCisKKyNkZWZpbmUgX19faW52b2tlX2NvcHlfaW5fa2VybmVsKHRvLCBmcm9tLCBuKQkJCQlcCisJX19pbnZva2VfY29weV9mcm9tX3VzZXJfZXZhX2dlbmVyaWModG8sIGZyb20sIG4sIF9fY29weV91c2VyKQorCisjZW5kaWYgLyogQ09ORklHX0VWQSAqLworCiAvKgogICogX19jb3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBmcm9tIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KICAqIEB0bzoJICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCkBAIC05MDEsMTAgKzExMjIsMTcgQEAKIAlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAogCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCiAJX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBfX2N1X2Zyb20sIF9fY3VfbGVuKSkgewkJXAotCQltaWdodF9mYXVsdCgpOwkJCQkJCVwKLQkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sCVwKLQkJCQkJCSAgIF9fY3VfbGVuKTsJCVwKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKSB7CQkJCVwKKwkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fa2VybmVsKF9fY3VfdG8sCQlcCisJCQkJCQkgICAgIF9fY3VfZnJvbSwJCVwKKwkJCQkJCSAgICAgX19jdV9sZW4pOwkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgX19jdV9mcm9tLCBfX2N1X2xlbikpIHsJXAorCQkJbWlnaHRfZmF1bHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcihfX2N1X3RvLAlcCisJCQkJCQkJICAgX19jdV9mcm9tLAlcCisJCQkJCQkJICAgX19jdV9sZW4pOyAgIFwKKwkJfQkJCQkJCQlcCiAJfQkJCQkJCQkJXAogCV9fY3VfbGVuOwkJCQkJCQlcCiB9KQpAQCAtOTE4LDkgKzExNDYsMTQgQEAKIAlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAogCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCiAJX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQltaWdodF9mYXVsdCgpOwkJCQkJCQlcCi0JX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sCQlcCi0JCQkJCSAgIF9fY3VfbGVuKTsJCQlcCisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgewkJCQlcCisJCV9fY3VfbGVuID0gX19faW52b2tlX2NvcHlfaW5fa2VybmVsKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAorCQkJCQkJICAgIF9fY3VfbGVuKTsJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCW1pZ2h0X2ZhdWx0KCk7CQkJCQkJXAorCQlfX2N1X2xlbiA9IF9fX2ludm9rZV9jb3B5X2luX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCisJCQkJCQkgIF9fY3VfbGVuKTsJCVwKKwl9CQkJCQkJCQlcCiAJX19jdV9sZW47CQkJCQkJCVwKIH0pCiAKQEAgLTkzMywxMSArMTE2NiwxNyBAQAogCV9fY3VfdG8gPSAodG8pOwkJCQkJCQlcCiAJX19jdV9mcm9tID0gKGZyb20pOwkJCQkJCVwKIAlfX2N1X2xlbiA9IChuKTsJCQkJCQkJXAotCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBfX2N1X2Zyb20sIF9fY3VfbGVuKSAmJglcCi0JCSAgIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIF9fY3VfdG8sIF9fY3VfbGVuKSkpIHsJXAotCQltaWdodF9mYXVsdCgpOwkJCQkJCVwKLQkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sCVwKLQkJCQkJCSAgIF9fY3VfbGVuKTsJCVwKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKSB7CQkJCVwKKwkJX19jdV9sZW4gPSBfX19pbnZva2VfY29weV9pbl9rZXJuZWwoX19jdV90byxfX2N1X2Zyb20sCVwKKwkJCQkJCSAgICBfX2N1X2xlbik7CQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgX19jdV9mcm9tLCBfX2N1X2xlbikgJiZcCisJCQkgICBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBfX2N1X3RvLCBfX2N1X2xlbikpKSB7XAorCQkJbWlnaHRfZmF1bHQoKTsJCQkJCVwKKwkJCV9fY3VfbGVuID0gX19faW52b2tlX2NvcHlfaW5fdXNlcihfX2N1X3RvLAlcCisJCQkJCQkJICBfX2N1X2Zyb20sCVwKKwkJCQkJCQkgIF9fY3VfbGVuKTsJXAorCQl9CQkJCQkJCVwKIAl9CQkJCQkJCQlcCiAJX19jdV9sZW47CQkJCQkJCVwKIH0pCkBAIC0xMDA3LDE2ICsxMjQ2LDI4IEBACiB7CiAJbG9uZyByZXM7CiAKLQltaWdodF9mYXVsdCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJIm1vdmVcdCQ1LCAlMlxuXHQiCi0JCSJtb3ZlXHQkNiwgJTNcblx0IgotCQlfX01PRFVMRV9KQUwoX19zdHJuY3B5X2Zyb21fdXNlcl9ub2NoZWNrX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChfX3RvKSwgInIiIChfX2Zyb20pLCAiciIgKF9fbGVuKQotCQk6ICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsICIkMzEiLCAibWVtb3J5Iik7CisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJIm1vdmVcdCQ1LCAlMlxuXHQiCisJCQkibW92ZVx0JDYsICUzXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cm5jcHlfZnJvbV9rZXJuZWxfbm9jaGVja19hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAoX190byksICJyIiAoX19mcm9tKSwgInIiIChfX2xlbikKKwkJCTogIiQyIiwgIiQzIiwgIiQ0IiwgIiQ1IiwgIiQ2IiwgX19VQV90MCwgIiQzMSIsICJtZW1vcnkiKTsKKwl9IGVsc2UgeworCQltaWdodF9mYXVsdCgpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJIm1vdmVcdCQ1LCAlMlxuXHQiCisJCQkibW92ZVx0JDYsICUzXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cm5jcHlfZnJvbV91c2VyX25vY2hlY2tfYXNtKQorCQkJIm1vdmVcdCUwLCAkMiIKKwkJCTogIj1yIiAocmVzKQorCQkJOiAiciIgKF9fdG8pLCAiciIgKF9fZnJvbSksICJyIiAoX19sZW4pCisJCQk6ICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsICIkMzEiLCAibWVtb3J5Iik7CisJfQogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEwNDQsMTYgKzEyOTUsMjggQEAKIHsKIAlsb25nIHJlczsKIAotCW1pZ2h0X2ZhdWx0KCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQkibW92ZVx0JDUsICUyXG5cdCIKLQkJIm1vdmVcdCQ2LCAlM1xuXHQiCi0JCV9fTU9EVUxFX0pBTChfX3N0cm5jcHlfZnJvbV91c2VyX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChfX3RvKSwgInIiIChfX2Zyb20pLCAiciIgKF9fbGVuKQotCQk6ICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsICIkMzEiLCAibWVtb3J5Iik7CisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJIm1vdmVcdCQ1LCAlMlxuXHQiCisJCQkibW92ZVx0JDYsICUzXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cm5jcHlfZnJvbV9rZXJuZWxfYXNtKQorCQkJIm1vdmVcdCUwLCAkMiIKKwkJCTogIj1yIiAocmVzKQorCQkJOiAiciIgKF9fdG8pLCAiciIgKF9fZnJvbSksICJyIiAoX19sZW4pCisJCQk6ICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsICIkMzEiLCAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJbWlnaHRfZmF1bHQoKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQkJIm1vdmVcdCQ2LCAlM1xuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJuY3B5X2Zyb21fdXNlcl9hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAoX190byksICJyIiAoX19mcm9tKSwgInIiIChfX2xlbikKKwkJCTogIiQyIiwgIiQzIiwgIiQ0IiwgIiQ1IiwgIiQ2IiwgX19VQV90MCwgIiQzMSIsICJtZW1vcnkiKTsKKwl9CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTA2MywxNCArMTMyNiwyNCBAQAogewogCWxvbmcgcmVzOwogCi0JbWlnaHRfZmF1bHQoKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIm1vdmVcdCQ0LCAlMVxuXHQiCi0JCV9fTU9EVUxFX0pBTChfX3N0cmxlbl91c2VyX25vY2hlY2tfYXNtKQotCQkibW92ZVx0JTAsICQyIgotCQk6ICI9ciIgKHJlcykKLQkJOiAiciIgKHMpCi0JCTogIiQyIiwgIiQ0IiwgX19VQV90MCwgIiQzMSIpOworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cmxlbl9rZXJuZWxfbm9jaGVja19hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocykKKwkJCTogIiQyIiwgIiQ0IiwgX19VQV90MCwgIiQzMSIpOworCX0gZWxzZSB7CisJCW1pZ2h0X2ZhdWx0KCk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJsZW5fdXNlcl9ub2NoZWNrX2FzbSkKKwkJCSJtb3ZlXHQlMCwgJDIiCisJCQk6ICI9ciIgKHJlcykKKwkJCTogInIiIChzKQorCQkJOiAiJDIiLCAiJDQiLCBfX1VBX3QwLCAiJDMxIik7CisJfQogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEwOTMsMTQgKzEzNjYsMjQgQEAKIHsKIAlsb25nIHJlczsKIAotCW1pZ2h0X2ZhdWx0KCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQlfX01PRFVMRV9KQUwoX19zdHJsZW5fdXNlcl9hc20pCi0JCSJtb3ZlXHQlMCwgJDIiCi0JCTogIj1yIiAocmVzKQotCQk6ICJyIiAocykKLQkJOiAiJDIiLCAiJDQiLCBfX1VBX3QwLCAiJDMxIik7CisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIGdldF9kcygpKSkgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkJX19NT0RVTEVfSkFMKF9fc3RybGVuX2tlcm5lbF9hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocykKKwkJCTogIiQyIiwgIiQ0IiwgX19VQV90MCwgIiQzMSIpOworCX0gZWxzZSB7CisJCW1pZ2h0X2ZhdWx0KCk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQlfX01PRFVMRV9KQUwoX19zdHJsZW5fa2VybmVsX2FzbSkKKwkJCSJtb3ZlXHQlMCwgJDIiCisJCQk6ICI9ciIgKHJlcykKKwkJCTogInIiIChzKQorCQkJOiAiJDIiLCAiJDQiLCBfX1VBX3QwLCAiJDMxIik7CisJfQogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTExMTAsMTUgKzEzOTMsMjYgQEAKIHsKIAlsb25nIHJlczsKIAotCW1pZ2h0X2ZhdWx0KCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQkibW92ZVx0JDUsICUyXG5cdCIKLQkJX19NT0RVTEVfSkFMKF9fc3Rybmxlbl91c2VyX25vY2hlY2tfYXNtKQotCQkibW92ZVx0JTAsICQyIgotCQk6ICI9ciIgKHJlcykKLQkJOiAiciIgKHMpLCAiciIgKG4pCi0JCTogIiQyIiwgIiQ0IiwgIiQ1IiwgX19VQV90MCwgIiQzMSIpOworCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQkJX19NT0RVTEVfSkFMKF9fc3Rybmxlbl9rZXJuZWxfbm9jaGVja19hc20pCisJCQkibW92ZVx0JTAsICQyIgorCQkJOiAiPXIiIChyZXMpCisJCQk6ICJyIiAocyksICJyIiAobikKKwkJCTogIiQyIiwgIiQ0IiwgIiQ1IiwgX19VQV90MCwgIiQzMSIpOworCX0gZWxzZSB7CisJCW1pZ2h0X2ZhdWx0KCk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQkibW92ZVx0JDUsICUyXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fdXNlcl9ub2NoZWNrX2FzbSkKKwkJCSJtb3ZlXHQlMCwgJDIiCisJCQk6ICI9ciIgKHJlcykKKwkJCTogInIiIChzKSwgInIiIChuKQorCQkJOiAiJDIiLCAiJDQiLCAiJDUiLCBfX1VBX3QwLCAiJDMxIik7CisJfQogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTExNDIsMTQgKzE0MzYsMjUgQEAKIAlsb25nIHJlczsKIAogCW1pZ2h0X2ZhdWx0KCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQkibW92ZVx0JDUsICUyXG5cdCIKLQkJX19NT0RVTEVfSkFMKF9fc3Rybmxlbl91c2VyX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChzKSwgInIiIChuKQotCQk6ICIkMiIsICIkNCIsICIkNSIsIF9fVUFfdDAsICIkMzEiKTsKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgZ2V0X2RzKCkpKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCQkibW92ZVx0JDUsICUyXG5cdCIKKwkJCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fa2VybmVsX2FzbSkKKwkJCSJtb3ZlXHQlMCwgJDIiCisJCQk6ICI9ciIgKHJlcykKKwkJCTogInIiIChzKSwgInIiIChuKQorCQkJOiAiJDIiLCAiJDQiLCAiJDUiLCBfX1VBX3QwLCAiJDMxIik7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQkJX19NT0RVTEVfSkFMKF9fc3Rybmxlbl91c2VyX2FzbSkKKwkJCSJtb3ZlXHQlMCwgJDIiCisJCQk6ICI9ciIgKHJlcykKKwkJCTogInIiIChzKSwgInIiIChuKQorCQkJOiAiJDIiLCAiJDQiLCAiJDUiLCBfX1VBX3QwLCAiJDMxIik7CisJfQogCiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCA0ZDNiOTI4Li40MTNkNmM2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNkZWZpbmUgX19BUkNIX09NSVRfQ09NUEFUX1NZU19HRVRERU5UUzY0CiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL2luc3QuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL2luc3QuaAppbmRleCBiMzliYTI1Li5kZjZlNzc1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9pbnN0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vaW5zdC5oCkBAIC04LDYgKzgsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDAwIGJ5IFJhbGYgQmFlY2hsZQogICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IFRoaWVtbyBTZXVmZXIKICAqIENvcHlyaWdodCAoQykgMjAxMiBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCiAjaWZuZGVmIF9VQVBJX0FTTV9JTlNUX0gKICNkZWZpbmUgX1VBUElfQVNNX0lOU1RfSApAQCAtNzMsMTAgKzc0LDE2IEBACiBlbnVtIHNwZWMzX29wIHsKIAlleHRfb3AsIGRleHRtX29wLCBkZXh0dV9vcCwgZGV4dF9vcCwKIAlpbnNfb3AsIGRpbnNtX29wLCBkaW5zdV9vcCwgZGluc19vcCwKLQlseF9vcCA9IDB4MGEsCi0JYnNoZmxfb3AgPSAweDIwLAotCWRic2hmbF9vcCA9IDB4MjQsCi0JcmRod3Jfb3AgPSAweDNiCisJbHhfb3AgICAgID0gMHgwYSwgbHdsZV9vcCAgID0gMHgxOSwKKwlsd3JlX29wICAgPSAweDFhLCBjYWNoZWVfb3AgPSAweDFiLAorCXNiZV9vcCAgICA9IDB4MWMsIHNoZV9vcCAgICA9IDB4MWQsCisJc2NlX29wICAgID0gMHgxZSwgc3dlX29wICAgID0gMHgxZiwKKwlic2hmbF9vcCAgPSAweDIwLCBzd2xlX29wICAgPSAweDIxLAorCXN3cmVfb3AgICA9IDB4MjIsIHByZWZlX29wICA9IDB4MjMsCisJZGJzaGZsX29wID0gMHgyNCwgbGJ1ZV9vcCAgID0gMHgyOCwKKwlsaHVlX29wICAgPSAweDI5LCBsYmVfb3AgICAgPSAweDJjLAorCWxoZV9vcCAgICA9IDB4MmQsIGxsZV9vcCAgICA9IDB4MmUsCisJbHdlX29wICAgID0gMHgyZiwgcmRod3Jfb3AgID0gMHgzYgogfTsKIAogLyoKQEAgLTE2Myw4ICsxNzAsOCBAQAogICovCiBlbnVtIGNvcDF4X2Z1bmMgewogCWx3eGMxX29wICAgICA9CTB4MDAsIGxkeGMxX29wCSAgID0gIDB4MDEsCi0JcGZldGNoX29wICAgID0JMHgwNywgc3d4YzFfb3AJICAgPSAgMHgwOCwKLQlzZHhjMV9vcCAgICAgPQkweDA5LCBtYWRkX3Nfb3AJICAgPSAgMHgyMCwKKwlzd3hjMV9vcCAgICAgPSAgMHgwOCwgc2R4YzFfb3AJICAgPSAgMHgwOSwKKwlwZmV0Y2hfb3AgICAgPQkweDBmLCBtYWRkX3Nfb3AJICAgPSAgMHgyMCwKIAltYWRkX2Rfb3AgICAgPQkweDIxLCBtYWRkX2Vfb3AJICAgPSAgMHgyMiwKIAltc3ViX3Nfb3AgICAgPQkweDI4LCBtc3ViX2Rfb3AJICAgPSAgMHgyOSwKIAltc3ViX2Vfb3AgICAgPQkweDJhLCBubWFkZF9zX29wICAgPSAgMHgzMCwKQEAgLTU5Miw2ICs1OTksMTUgQEAKIAk7KSkpKSkpKQogfTsKIAorc3RydWN0IHNwZWMzX2Zvcm1hdCB7ICAgLyogU1BFQzMgKi8KKwlCSVRGSUVMRF9GSUVMRCh1bnNpZ25lZCBpbnQgb3Bjb2RlOjYsCisJQklURklFTERfRklFTEQodW5zaWduZWQgaW50IHJzOjUsCisJQklURklFTERfRklFTEQodW5zaWduZWQgaW50IHJ0OjUsCisJQklURklFTERfRklFTEQoc2lnbmVkIGludCBzaW1tZWRpYXRlOjksCisJQklURklFTERfRklFTEQodW5zaWduZWQgaW50IGZ1bmM6NywKKwk7KSkpKSkKK307CisKIC8qCiAgKiBtaWNyb01JUFMgaW5zdHJ1Y3Rpb24gZm9ybWF0cyAoMzItYml0IGxlbmd0aCkKICAqCkBAIC04NjMsNiArODc5LDcgQEAKIAlzdHJ1Y3QgYl9mb3JtYXQgYl9mb3JtYXQ7CiAJc3RydWN0IHBzX2Zvcm1hdCBwc19mb3JtYXQ7CiAJc3RydWN0IHZfZm9ybWF0IHZfZm9ybWF0OworCXN0cnVjdCBzcGVjM19mb3JtYXQgc3BlYzNfZm9ybWF0OwogCXN0cnVjdCBmYl9mb3JtYXQgZmJfZm9ybWF0OwogCXN0cnVjdCBmcDBfZm9ybWF0IGZwMF9mb3JtYXQ7CiAJc3RydWN0IG1tX2ZwMF9mb3JtYXQgbW1fZnAwX2Zvcm1hdDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NpZ2NvbnRleHQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NpZ2NvbnRleHQuaAppbmRleCA2Yzk5MDZmLi42ODFjMTc2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zaWdjb250ZXh0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc2lnY29udGV4dC5oCkBAIC0xMiw2ICsxMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NnaWRlZnMuaD4KIAorLyogQml0cyB3aGljaCBtYXkgYmUgc2V0IGluIHNjX3VzZWRfbWF0aCAqLworI2RlZmluZSBVU0VETUFUSF9GUAkoMSA8PCAwKQorI2RlZmluZSBVU0VETUFUSF9NU0EJKDEgPDwgMSkKKwogI2lmIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJMzIKIAogLyoKQEAgLTM3LDYgKzQxLDggQEAKIAl1bnNpZ25lZCBsb25nCQlzY19sbzI7CiAJdW5zaWduZWQgbG9uZwkJc2NfaGkzOwogCXVuc2lnbmVkIGxvbmcJCXNjX2xvMzsKKwl1bnNpZ25lZCBsb25nIGxvbmcJc2NfbXNhcmVnc1szMl07CS8qIE1vc3Qgc2lnbmlmaWNhbnQgNjQgYml0cyAqLworCXVuc2lnbmVkIGxvbmcJCXNjX21zYV9jc3I7CiB9OwogCiAjZW5kaWYgLyogX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkkzMiAqLwpAQCAtNzAsNiArNzYsOCBAQAogCV9fdTMyCXNjX3VzZWRfbWF0aDsKIAlfX3UzMglzY19kc3A7CiAJX191MzIJc2NfcmVzZXJ2ZWQ7CisJX191NjQJc2NfbXNhcmVnc1szMl07CisJX191MzIJc2NfbXNhX2NzcjsKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMjZjNjE3NS4uMjc3ZGFiMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCkBAIC01Myw2ICs1Myw4IEBACiBvYmotJChDT05GSUdfTUlQU19NVF9TTVRDKQkrPSBzbXRjLm8gc210Yy1hc20ubyBzbXRjLXByb2Mubwogb2JqLSQoQ09ORklHX01JUFNfTVRfU01QKQkrPSBzbXAtbXQubwogb2JqLSQoQ09ORklHX01JUFNfQ01QKQkJKz0gc21wLWNtcC5vCitvYmotJChDT05GSUdfTUlQU19DUFMpCQkrPSBzbXAtY3BzLm8gY3BzLXZlYy5vCitvYmotJChDT05GSUdfTUlQU19HSUNfSVBJKQkrPSBzbXAtZ2ljLm8KIG9iai0kKENPTkZJR19DUFVfTUlQU1IyKQkrPSBzcHJhbS5vCiAKIG9iai0kKENPTkZJR19NSVBTX1ZQRV9MT0FERVIpCSs9IHZwZS5vCkBAIC0xMDIsNiArMTA0LDkgQEAKIAogb2JqLSQoQ09ORklHX0pVTVBfTEFCRUwpCSs9IGp1bXBfbGFiZWwubwogCitvYmotJChDT05GSUdfTUlQU19DTSkJCSs9IG1pcHMtY20ubworb2JqLSQoQ09ORklHX01JUFNfQ1BDKQkJKz0gbWlwcy1jcGMubworCiAjCiAjIERTUCBBU0Ugc3VwcG9ydGVkIGZvciBNSVBTMzIgb3IgTUlQUzY0IFJlbGVhc2UgMiBjb3JlcyBvbmx5LiBJdCBpcyBub3QKICMgc2FmZSB0byB1bmNvbmRpdGlvbm5hbHkgdXNlIHRoZSBhc3NlbWJsZXIgLW1kc3AgLyAtbWRzcHIyIHN3aXRjaGVzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMGMyZTg1My4uMGVhNzVjMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zbXAtY3BzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogCkBAIC0xNjgsNiArMTY5LDcyIEBACiAJT0ZGU0VUKFRIUkVBRF9GUFIzMCwgdGFza19zdHJ1Y3QsIHRocmVhZC5mcHUuZnByWzMwXSk7CiAJT0ZGU0VUKFRIUkVBRF9GUFIzMSwgdGFza19zdHJ1Y3QsIHRocmVhZC5mcHUuZnByWzMxXSk7CiAKKwkvKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNjQgYml0cyBvZiBlYWNoIEZQIHJlZ2lzdGVyICovCisJT0ZGU0VUKFRIUkVBRF9GUFIwX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclswXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMV9MUzY0LCB0YXNrX3N0cnVjdCwKKwkgICAgICAgdGhyZWFkLmZwdS5mcHJbMV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjJfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzJdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7CisJT0ZGU0VUKFRIUkVBRF9GUFIzX0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwclszXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSNF9MUzY0LCB0YXNrX3N0cnVjdCwKKwkgICAgICAgdGhyZWFkLmZwdS5mcHJbNF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjVfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzVdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7CisJT0ZGU0VUKFRIUkVBRF9GUFI2X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwcls2XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSN19MUzY0LCB0YXNrX3N0cnVjdCwKKwkgICAgICAgdGhyZWFkLmZwdS5mcHJbN10udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKKwlPRkZTRVQoVEhSRUFEX0ZQUjhfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzhdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7CisJT0ZGU0VUKFRIUkVBRF9GUFI5X0xTNjQsIHRhc2tfc3RydWN0LAorCSAgICAgICB0aHJlYWQuZnB1LmZwcls5XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTBfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzEwXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTFfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzExXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTJfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzEyXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTNfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzEzXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTRfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzE0XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTVfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzE1XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTZfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzE2XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTdfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzE3XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMThfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzE4XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMTlfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzE5XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjBfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzIwXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjFfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzIxXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjJfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzIyXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjNfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzIzXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjRfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzI0XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjVfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzI1XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjZfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzI2XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjdfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzI3XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjhfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzI4XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMjlfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzI5XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMzBfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzMwXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCU9GRlNFVChUSFJFQURfRlBSMzFfTFM2NCwgdGFza19zdHJ1Y3QsCisJICAgICAgIHRocmVhZC5mcHUuZnByWzMxXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOworCiAJT0ZGU0VUKFRIUkVBRF9GQ1IzMSwgdGFza19zdHJ1Y3QsIHRocmVhZC5mcHUuZmNyMzEpOwogCUJMQU5LKCk7CiB9CkBAIC0yMjgsNiArMjk1LDcgQEAKIAlPRkZTRVQoU0NfTE8yLCBzaWdjb250ZXh0LCBzY19sbzIpOwogCU9GRlNFVChTQ19ISTMsIHNpZ2NvbnRleHQsIHNjX2hpMyk7CiAJT0ZGU0VUKFNDX0xPMywgc2lnY29udGV4dCwgc2NfbG8zKTsKKwlPRkZTRVQoU0NfTVNBUkVHUywgc2lnY29udGV4dCwgc2NfbXNhcmVncyk7CiAJQkxBTksoKTsKIH0KICNlbmRpZgpAQCAtMjQyLDYgKzMxMCw3IEBACiAJT0ZGU0VUKFNDX01ETE8sIHNpZ2NvbnRleHQsIHNjX21kbG8pOwogCU9GRlNFVChTQ19QQywgc2lnY29udGV4dCwgc2NfcGMpOwogCU9GRlNFVChTQ19GUENfQ1NSLCBzaWdjb250ZXh0LCBzY19mcGNfY3NyKTsKKwlPRkZTRVQoU0NfTVNBUkVHUywgc2lnY29udGV4dCwgc2NfbXNhcmVncyk7CiAJQkxBTksoKTsKIH0KICNlbmRpZgpAQCAtMjUzLDYgKzMyMiw3IEBACiAJT0ZGU0VUKFNDMzJfRlBSRUdTLCBzaWdjb250ZXh0MzIsIHNjX2ZwcmVncyk7CiAJT0ZGU0VUKFNDMzJfRlBDX0NTUiwgc2lnY29udGV4dDMyLCBzY19mcGNfY3NyKTsKIAlPRkZTRVQoU0MzMl9GUENfRUlSLCBzaWdjb250ZXh0MzIsIHNjX2ZwY19laXIpOworCU9GRlNFVChTQzMyX01TQVJFR1MsIHNpZ2NvbnRleHQzMiwgc2NfbXNhcmVncyk7CiAJQkxBTksoKTsKIH0KICNlbmRpZgpAQCAtMzk3LDMgKzQ2NywxNSBAQAogCU9GRlNFVChDT1AwX1NUQVRVUywgbWlwc19jb3Byb2MsIHJlZ1tNSVBTX0NQMF9TVEFUVVNdWzBdKTsKIAlCTEFOSygpOwogfQorCisjaWZkZWYgQ09ORklHX01JUFNfQ1BTCit2b2lkIG91dHB1dF9jcHNfZGVmaW5lcyh2b2lkKQoreworCUNPTU1FTlQoIiBNSVBTIENQUyBvZmZzZXRzLiAiKTsKKwlPRkZTRVQoQk9PVENGR19DT1JFLCBib290X2NvbmZpZywgY29yZSk7CisJT0ZGU0VUKEJPT1RDRkdfVlBFLCBib290X2NvbmZpZywgdnBlKTsKKwlPRkZTRVQoQk9PVENGR19QQywgYm9vdF9jb25maWcsIHBjKTsKKwlPRkZTRVQoQk9PVENGR19TUCwgYm9vdF9jb25maWcsIHNwKTsKKwlPRkZTRVQoQk9PVENGR19HUCwgYm9vdF9jb25maWcsIGdwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9ibWlwc192ZWMuUyBiL2FyY2gvbWlwcy9rZXJuZWwvYm1pcHNfdmVjLlMKaW5kZXggYTViZjczZC4uMjkwYzIzYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ibWlwc192ZWMuUworKysgYi9hcmNoL21pcHMva2VybmVsL2JtaXBzX3ZlYy5TCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlqcglrMAogCiAJUkVTVE9SRV9BTEwKLQkuc2V0CW1pcHMzCisJLnNldAlhcmNoPXI0MDAwCiAJZXJldAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3BzLXZlYy5TIGIvYXJjaC9taXBzL2tlcm5lbC9jcHMtdmVjLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhNDZkYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3BzLXZlYy5TCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBQYXVsIEJ1cnRvbiA8cGF1bC5idXJ0b25AaW1ndGVjLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlb3BzLmg+CisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisKKyNkZWZpbmUgR0NSX0NMX0NPSEVSRU5DRV9PRlMgMHgyMDA4CisKKy5zZWN0aW9uIC50ZXh0LmNwcy12ZWMKKy5iYWxpZ24gMHgxMDAwCisuc2V0IG5vcmVvcmRlcgorCitMRUFGKG1pcHNfY3BzX2NvcmVfZW50cnkpCisJLyoKKwkgKiBUaGVzZSBmaXJzdCA4IGJ5dGVzIHdpbGwgYmUgcGF0Y2hlZCBieSBjcHNfc21wX3NldHVwIHRvIGxvYWQgdGhlCisJICogYmFzZSBhZGRyZXNzIG9mIHRoZSBDTSBHQ1JzIGludG8gcmVnaXN0ZXIgdjEuCisJICovCisJLnF1YWQJMAorCisJLyogQ2hlY2sgd2hldGhlciB3ZSdyZSBoZXJlIGR1ZSB0byBhbiBOTUkgKi8KKwltZmMwCWswLCBDUDBfU1RBVFVTCisJYW5kCWswLCBrMCwgU1QwX05NSQorCWJlcXoJazAsIG5vdF9ubWkKKwkgbm9wCisKKwkvKiBUaGlzIGlzIGFuIE5NSSAqLworCWxhCWswLCBubWlfaGFuZGxlcgorCWpyCWswCisJIG5vcAorCitub3Rfbm1pOgorCS8qIFNldHVwIENhdXNlICovCisJbGkJdDAsIENBVVNFRl9JVgorCW10YzAJdDAsIENQMF9DQVVTRQorCisJLyogU2V0dXAgU3RhdHVzICovCisJbGkJdDAsIFNUMF9DVTEgfCBTVDBfQ1UwCisJbXRjMAl0MCwgQ1AwX1NUQVRVUworCisJLyoKKwkgKiBDbGVhciB0aGUgYml0cyB1c2VkIHRvIGluZGV4IHRoZSBjYWNoZXMuIE5vdGUgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlCisJICogZGljdGF0ZXMgdGhhdCB3cml0aW5nIHRvIGFueSBvZiBUYWdMbyBvciBUYWdIaSBzZWxlY3RzIDAgb3IgMiBzaG91bGQKKwkgKiBiZSB2YWxpZCBmb3IgYWxsIE1JUFMzMiBDUFVzLCBldmVuIHRob3NlIGZvciB3aGljaCBzYWlkIHdyaXRlcyBhcmUKKwkgKiB1bm5lY2Vzc2FyeS4KKwkgKi8KKwltdGMwCXplcm8sIENQMF9UQUdMTywgMAorCW10YzAJemVybywgQ1AwX1RBR0hJLCAwCisJbXRjMAl6ZXJvLCBDUDBfVEFHTE8sIDIKKwltdGMwCXplcm8sIENQMF9UQUdISSwgMgorCWVoYgorCisJLyogUHJpbWFyeSBjYWNoZSBjb25maWd1cmF0aW9uIGlzIGluZGljYXRlZCBieSBDb25maWcxICovCisJbWZjMAl2MCwgQ1AwX0NPTkZJRywgMQorCisJLyogRGV0ZWN0IEktY2FjaGUgbGluZSBzaXplICovCisJX0VYVAl0MCwgdjAsIE1JUFNfQ09ORjFfSUxfU0hGLCBNSVBTX0NPTkYxX0lMX1NaCisJYmVxegl0MCwgaWNhY2hlX2RvbmUKKwkgbGkJdDEsIDIKKwlzbGx2CXQwLCB0MSwgdDAKKworCS8qIERldGVjdCBJLWNhY2hlIHNpemUgKi8KKwlfRVhUCXQxLCB2MCwgTUlQU19DT05GMV9JU19TSEYsIE1JUFNfQ09ORjFfSVNfU1oKKwl4b3JpCXQyLCB0MSwgMHg3CisJYmVxegl0MiwgMWYKKwkgbGkJdDMsIDMyCisJYWRkaQl0MSwgdDEsIDEKKwlzbGx2CXQxLCB0MywgdDEKKzE6CS8qIEF0IHRoaXMgcG9pbnQgdDEgPT0gSS1jYWNoZSBzZXRzIHBlciB3YXkgKi8KKwlfRVhUCXQyLCB2MCwgTUlQU19DT05GMV9JQV9TSEYsIE1JUFNfQ09ORjFfSUFfU1oKKwlhZGRpCXQyLCB0MiwgMQorCW11bAl0MSwgdDEsIHQwCisJbXVsCXQxLCB0MSwgdDIKKworCWxpCWEwLCBLU0VHMAorCWFkZAlhMSwgYTAsIHQxCisxOgljYWNoZQlJbmRleF9TdG9yZV9UYWdfSSwgMChhMCkKKwlhZGQJYTAsIGEwLCB0MAorCWJuZQlhMCwgYTEsIDFiCisJIG5vcAoraWNhY2hlX2RvbmU6CisKKwkvKiBEZXRlY3QgRC1jYWNoZSBsaW5lIHNpemUgKi8KKwlfRVhUCXQwLCB2MCwgTUlQU19DT05GMV9ETF9TSEYsIE1JUFNfQ09ORjFfRExfU1oKKwliZXF6CXQwLCBkY2FjaGVfZG9uZQorCSBsaQl0MSwgMgorCXNsbHYJdDAsIHQxLCB0MAorCisJLyogRGV0ZWN0IEQtY2FjaGUgc2l6ZSAqLworCV9FWFQJdDEsIHYwLCBNSVBTX0NPTkYxX0RTX1NIRiwgTUlQU19DT05GMV9EU19TWgorCXhvcmkJdDIsIHQxLCAweDcKKwliZXF6CXQyLCAxZgorCSBsaQl0MywgMzIKKwlhZGRpCXQxLCB0MSwgMQorCXNsbHYJdDEsIHQzLCB0MQorMToJLyogQXQgdGhpcyBwb2ludCB0MSA9PSBELWNhY2hlIHNldHMgcGVyIHdheSAqLworCV9FWFQJdDIsIHYwLCBNSVBTX0NPTkYxX0RBX1NIRiwgTUlQU19DT05GMV9EQV9TWgorCWFkZGkJdDIsIHQyLCAxCisJbXVsCXQxLCB0MSwgdDAKKwltdWwJdDEsIHQxLCB0MgorCisJbGkJYTAsIEtTRUcwCisJYWRkdQlhMSwgYTAsIHQxCisJc3VidQlhMSwgYTEsIHQwCisxOgljYWNoZQlJbmRleF9TdG9yZV9UYWdfRCwgMChhMCkKKwlibmUJYTAsIGExLCAxYgorCSBhZGQJYTAsIGEwLCB0MAorZGNhY2hlX2RvbmU6CisKKwkvKiBTZXQgS3NlZzAgY2FjaGVhYmxlLCBjb2hlcmVudCwgd3JpdGUtYmFjaywgd3JpdGUtYWxsb2NhdGUgKi8KKwltZmMwCXQwLCBDUDBfQ09ORklHCisJb3JpCXQwLCAweDcKKwl4b3JpCXQwLCAweDIKKwltdGMwCXQwLCBDUDBfQ09ORklHCisJZWhiCisKKwkvKiBFbnRlciB0aGUgY29oZXJlbnQgZG9tYWluICovCisJbGkJdDAsIDB4ZmYKKwlzdwl0MCwgR0NSX0NMX0NPSEVSRU5DRV9PRlModjEpCisJZWhiCisKKwkvKiBKdW1wIHRvIGtzZWcwICovCisJbGEJdDAsIDFmCisJanIJdDAKKwkgbm9wCisKKzE6CS8qIFdlJ3JlIHVwLCBjYWNoZWQgJiBjb2hlcmVudCAqLworCisJLyoKKwkgKiBUT0RPOiBXZSBzaG91bGQgY2hlY2sgdGhlIFZQRSBudW1iZXIgd2UgaW50ZW5kZWQgdG8gYm9vdCBoZXJlLCBhbmQKKwkgKiAgICAgICBpZiBub24temVybyB3ZSBzaG91bGQgc3RhcnQgdGhhdCBWUEUgYW5kIHN0b3AgdGhpcyBvbmUuIEZvcgorCSAqICAgICAgIHRoZSBtb21lbnQgdGhpcyBkb2Vzbid0IG1hdHRlciBzaW5jZSBDUFVzIGFyZSBicm91Z2h0IHVwCisJICogICAgICAgc2VxdWVudGlhbGx5IGFuZCBpbiBvcmRlciwgYnV0IG9uY2UgaG90cGx1ZyBpcyBpbXBsZW1lbnRlZAorCSAqICAgICAgIHRoaXMgd2lsbCBuZWVkIHJldmlzaXRpbmcuCisJICovCisKKwkvKiBPZmYgd2UgZ28hICovCisJbGEJdDAsIG1pcHNfY3BzX2Jvb3RjZmcKKwlsdwl0MSwgQk9PVENGR19QQyh0MCkKKwlsdwlncCwgQk9PVENGR19HUCh0MCkKKwlsdwlzcCwgQk9PVENGR19TUCh0MCkKKwlqcgl0MQorCSBub3AKKwlFTkQobWlwc19jcHNfY29yZV9lbnRyeSkKKworLm9yZyAweDIwMAorTEVBRihleGNlcF90bGJmaWxsKQorCWIJLgorCSBub3AKKwlFTkQoZXhjZXBfdGxiZmlsbCkKKworLm9yZyAweDI4MAorTEVBRihleGNlcF94dGxiZmlsbCkKKwliCS4KKwkgbm9wCisJRU5EKGV4Y2VwX3h0bGJmaWxsKQorCisub3JnIDB4MzAwCitMRUFGKGV4Y2VwX2NhY2hlKQorCWIJLgorCSBub3AKKwlFTkQoZXhjZXBfY2FjaGUpCisKKy5vcmcgMHgzODAKK0xFQUYoZXhjZXBfZ2VuZXgpCisJYgkuCisJIG5vcAorCUVORChleGNlcF9nZW5leCkKKworLm9yZyAweDQwMAorTEVBRihleGNlcF9pbnRleCkKKwliCS4KKwkgbm9wCisJRU5EKGV4Y2VwX2ludGV4KQorCisub3JnIDB4NDgwCitMRUFGKGV4Y2VwX2VqdGFnKQorCWxhCWswLCBlanRhZ19kZWJ1Z19oYW5kbGVyCisJanIJazAKKwkgbm9wCisJRU5EKGV4Y2VwX2VqdGFnKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKaW5kZXggNTMwZjgzMi4uNmU4ZmI4NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8YXNtL2NwdS10eXBlLmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9taXBzbXRyZWdzLmg+CisjaW5jbHVkZSA8YXNtL21zYS5oPgogI2luY2x1ZGUgPGFzbS93YXRjaC5oPgogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vc3ByYW0uaD4KQEAgLTEyNiw2ICsxMjgsMjAgQEAKIAlyZXR1cm4gKChjcHVfZ2V0X2ZwdV9pZCgpICYgRlBJUl9JTVBfTUFTSykgIT0gRlBJUl9JTVBfTk9ORSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjcHVfZ2V0X21zYV9pZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhdHVzLCBjb25mNSwgbXNhX2lkOworCisJc3RhdHVzID0gcmVhZF9jMF9zdGF0dXMoKTsKKwlfX2VuYWJsZV9mcHUoRlBVXzY0QklUKTsKKwljb25mNSA9IHJlYWRfYzBfY29uZmlnNSgpOworCWVuYWJsZV9tc2EoKTsKKwltc2FfaWQgPSByZWFkX21zYV9pcigpOworCXdyaXRlX2MwX2NvbmZpZzUoY29uZjUpOworCXdyaXRlX2MwX3N0YXR1cyhzdGF0dXMpOworCXJldHVybiBtc2FfaWQ7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcHJvYmVfdm1iaXRzKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMpCiB7CiAjaWZkZWYgX19ORUVEX1ZNQklUU19QUk9CRQpAQCAtMTY2LDExICsxODIsMTIgQEAKIHN0YXRpYyB2b2lkIHNldF9mdGxiX2VuYWJsZShzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCBpbnQgZW5hYmxlKQogewogCXVuc2lnbmVkIGludCBjb25maWc2OwotCS8qCi0JICogQ29uZmlnNiBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgYW5kIGl0J3MgY3VycmVudGx5IG9ubHkKLQkgKiB1c2VkIGJ5IHByb0FwdGl2Ci0JICovCi0JaWYgKGMtPmNwdXR5cGUgPT0gQ1BVX1BST0FQVElWKSB7CisKKwkvKiBJdCdzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBob3cgdGhlIEZUTEIgY2FuIGJlIGVuYWJsZWQgKi8KKwlzd2l0Y2ggKGMtPmNwdXR5cGUpIHsKKwljYXNlIENQVV9QUk9BUFRJVjoKKwljYXNlIENQVV9QNTYwMDoKKwkJLyogcHJvQXB0aXYgJiByZWxhdGVkIGNvcmVzIHVzZSBDb25maWc2IHRvIGVuYWJsZSB0aGUgRlRMQiAqLwogCQljb25maWc2ID0gcmVhZF9jMF9jb25maWc2KCk7CiAJCWlmIChlbmFibGUpCiAJCQkvKiBFbmFibGUgRlRMQiAqLwpAQCAtMTc5LDYgKzE5Niw3IEBACiAJCQkvKiBEaXNhYmxlIEZUTEIgKi8KIAkJCXdyaXRlX2MwX2NvbmZpZzYoY29uZmlnNiAmICB+TUlQU19DT05GNl9GVExCRU4pOwogCQliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtMzAxLDYgKzMxOSw4IEBACiAJCWMtPmFzZXMgfD0gTUlQU19BU0VfVlo7CiAJaWYgKGNvbmZpZzMgJiBNSVBTX0NPTkYzX1NDKQogCQljLT5vcHRpb25zIHw9IE1JUFNfQ1BVX1NFR01FTlRTOworCWlmIChjb25maWczICYgTUlQU19DT05GM19NU0EpCisJCWMtPmFzZXMgfD0gTUlQU19BU0VfTVNBOwogCiAJcmV0dXJuIGNvbmZpZzMgJiBNSVBTX0NPTkZfTTsKIH0KQEAgLTM2Nyw2ICszODcsOSBAQAogCWNvbmZpZzUgJj0gfk1JUFNfQ09ORjVfVUZSOwogCXdyaXRlX2MwX2NvbmZpZzUoY29uZmlnNSk7CiAKKwlpZiAoY29uZmlnNSAmIE1JUFNfQ09ORjVfRVZBKQorCQljLT5vcHRpb25zIHw9IE1JUFNfQ1BVX0VWQTsKKwogCXJldHVybiBjb25maWc1ICYgTUlQU19DT05GX007CiB9CiAKQEAgLTM5OCw4ICs0MjEsMTMgQEAKIAogCW1pcHNfcHJvYmVfd2F0Y2hfcmVnaXN0ZXJzKGMpOwogCi0JaWYgKGNwdV9oYXNfbWlwc19yMikKKyNpZm5kZWYgQ09ORklHX01JUFNfQ1BTCisJaWYgKGNwdV9oYXNfbWlwc19yMikgewogCQljLT5jb3JlID0gcmVhZF9jMF9lYmFzZSgpICYgMHgzZmY7CisJCWlmIChjcHVfaGFzX21pcHNtdCkKKwkJCWMtPmNvcmUgPj49IGZscyhjb3JlX252cGVzKCkpIC0gMTsKKwl9CisjZW5kaWYKIH0KIAogI2RlZmluZSBSNEtfT1BUUyAoTUlQU19DUFVfVExCIHwgTUlQU19DUFVfNEtFWCB8IE1JUFNfQ1BVXzRLX0NBQ0hFIFwKQEAgLTcxMCwxNyArNzM4LDIzIEBACiAJCQkgICAgIE1JUFNfQ1BVX0xMU0M7CiAJCWMtPnRsYnNpemUgPSA2NDsKIAkJYnJlYWs7Ci0JY2FzZSBQUklEX0lNUF9MT09OR1NPTjI6Ci0JCWMtPmNwdXR5cGUgPSBDUFVfTE9PTkdTT04yOwotCQlfX2NwdV9uYW1lW2NwdV0gPSAiSUNUIExvb25nc29uLTIiOwotCisJY2FzZSBQUklEX0lNUF9MT09OR1NPTl82NDogIC8qIExvb25nc29uLTIvMyAqLwogCQlzd2l0Y2ggKGMtPnByb2Nlc3Nvcl9pZCAmIFBSSURfUkVWX01BU0spIHsKIAkJY2FzZSBQUklEX1JFVl9MT09OR1NPTjJFOgorCQkJYy0+Y3B1dHlwZSA9IENQVV9MT09OR1NPTjI7CisJCQlfX2NwdV9uYW1lW2NwdV0gPSAiSUNUIExvb25nc29uLTIiOwogCQkJc2V0X2VsZl9wbGF0Zm9ybShjcHUsICJsb29uZ3NvbjJlIik7CiAJCQlicmVhazsKIAkJY2FzZSBQUklEX1JFVl9MT09OR1NPTjJGOgorCQkJYy0+Y3B1dHlwZSA9IENQVV9MT09OR1NPTjI7CisJCQlfX2NwdV9uYW1lW2NwdV0gPSAiSUNUIExvb25nc29uLTIiOwogCQkJc2V0X2VsZl9wbGF0Zm9ybShjcHUsICJsb29uZ3NvbjJmIik7CiAJCQlicmVhazsKKwkJY2FzZSBQUklEX1JFVl9MT09OR1NPTjNBOgorCQkJYy0+Y3B1dHlwZSA9IENQVV9MT09OR1NPTjM7CisJCQlfX2NwdV9uYW1lW2NwdV0gPSAiSUNUIExvb25nc29uLTMiOworCQkJc2V0X2VsZl9wbGF0Zm9ybShjcHUsICJsb29uZ3NvbjNhIik7CisJCQlicmVhazsKIAkJfQogCiAJCXNldF9pc2EoYywgTUlQU19DUFVfSVNBX0lJSSk7CkBAIC03MjksNyArNzYzLDcgQEAKIAkJCSAgICAgTUlQU19DUFVfMzJGUFI7CiAJCWMtPnRsYnNpemUgPSA2NDsKIAkJYnJlYWs7Ci0JY2FzZSBQUklEX0lNUF9MT09OR1NPTjE6CisJY2FzZSBQUklEX0lNUF9MT09OR1NPTl8zMjogIC8qIExvb25nc29uLTEgKi8KIAkJZGVjb2RlX2NvbmZpZ3MoYyk7CiAKIAkJYy0+Y3B1dHlwZSA9IENQVV9MT09OR1NPTjE7CkBAIC04MDYsNyArODQwLDcgQEAKIAkJX19jcHVfbmFtZVtjcHVdID0gIk1JUFMgMTAwNEtjIjsKIAkJYnJlYWs7CiAJY2FzZSBQUklEX0lNUF8xMDc0SzoKLQkJYy0+Y3B1dHlwZSA9IENQVV83NEs7CisJCWMtPmNwdXR5cGUgPSBDUFVfMTA3NEs7CiAJCV9fY3B1X25hbWVbY3B1XSA9ICJNSVBTIDEwNzRLYyI7CiAJCWJyZWFrOwogCWNhc2UgUFJJRF9JTVBfSU5URVJBUFRJVl9VUDoKQEAgLTgyNSw2ICs4NTksMTQgQEAKIAkJYy0+Y3B1dHlwZSA9IENQVV9QUk9BUFRJVjsKIAkJX19jcHVfbmFtZVtjcHVdID0gIk1JUFMgcHJvQXB0aXYgKG11bHRpKSI7CiAJCWJyZWFrOworCWNhc2UgUFJJRF9JTVBfUDU2MDA6CisJCWMtPmNwdXR5cGUgPSBDUFVfUDU2MDA7CisJCV9fY3B1X25hbWVbY3B1XSA9ICJNSVBTIFA1NjAwIjsKKwkJYnJlYWs7CisJY2FzZSBQUklEX0lNUF9NNTE1MDoKKwkJYy0+Y3B1dHlwZSA9IENQVV9NNTE1MDsKKwkJX19jcHVfbmFtZVtjcHVdID0gIk1JUFMgTTUxNTAiOworCQlicmVhazsKIAl9CiAKIAlkZWNvZGVfY29uZmlncyhjKTsKQEAgLTExNzYsNiArMTIxOCwxMiBAQAogCWVsc2UKIAkJYy0+c3JzZXRzID0gMTsKIAorCWlmIChjcHVfaGFzX21zYSkgeworCQljLT5tc2FfaWQgPSBjcHVfZ2V0X21zYV9pZCgpOworCQlXQVJOKGMtPm1zYV9pZCAmIE1TQV9JUl9XUlBGLAorCQkgICAgICJWZWN0b3IgcmVnaXN0ZXIgcGFydGl0aW9uaW5nIHVuaW1wbGVtZW50ZWQhIik7CisJfQorCiAJY3B1X3Byb2JlX3ZtYml0cyhjKTsKIAogI2lmZGVmIENPTkZJR182NEJJVApAQCAtMTE5Miw0ICsxMjQwLDYgQEAKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBjLT5wcm9jZXNzb3JfaWQsIGNwdV9uYW1lX3N0cmluZygpKTsKIAlpZiAoYy0+b3B0aW9ucyAmIE1JUFNfQ1BVX0ZQVSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRlBVIHJldmlzaW9uIGlzOiAlMDh4XG4iLCBjLT5mcHVfaWQpOworCWlmIChjcHVfaGFzX21zYSkKKwkJcHJfaW5mbygiTVNBIHJldmlzaW9uIGlzOiAlMDh4XG4iLCBjLT5tc2FfaWQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvZnRyYWNlLmMKaW5kZXggMTg1YmEyNS4uNzRmZTczNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL2Z0cmFjZS5jCkBAIC05MCw2ICs5MCw3IEBACiBzdGF0aWMgaW50IGZ0cmFjZV9tb2RpZnlfY29kZSh1bnNpZ25lZCBsb25nIGlwLCB1bnNpZ25lZCBpbnQgbmV3X2NvZGUpCiB7CiAJaW50IGZhdWx0ZWQ7CisJbW1fc2VnbWVudF90IG9sZF9mczsKIAogCS8qICoodW5zaWduZWQgaW50ICopaXAgPSBuZXdfY29kZTsgKi8KIAlzYWZlX3N0b3JlX2NvZGUobmV3X2NvZGUsIGlwLCBmYXVsdGVkKTsKQEAgLTk3LDcgKzk4LDEwIEBACiAJaWYgKHVubGlrZWx5KGZhdWx0ZWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAorCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CiAJZmx1c2hfaWNhY2hlX3JhbmdlKGlwLCBpcCArIDgpOworCXNldF9mcyhvbGRfZnMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTEsMTEgKzExNSwxMCBAQAogCXNhZmVfc3RvcmVfY29kZShuZXdfY29kZTEsIGlwLCBmYXVsdGVkKTsKIAlpZiAodW5saWtlbHkoZmF1bHRlZCkpCiAJCXJldHVybiAtRUZBVUxUOwotCWlwICs9IDQ7Ci0Jc2FmZV9zdG9yZV9jb2RlKG5ld19jb2RlMiwgaXAsIGZhdWx0ZWQpOworCXNhZmVfc3RvcmVfY29kZShuZXdfY29kZTIsIGlwICsgNCwgZmF1bHRlZCk7CiAJaWYgKHVubGlrZWx5KGZhdWx0ZWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlmbHVzaF9pY2FjaGVfcmFuZ2UoaXAsIGlwICsgOCk7IC8qIG9yaWdpbmFsIGlwICsgMTIgKi8KKwlmbHVzaF9pY2FjaGVfcmFuZ2UoaXAsIGlwICsgOCk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwppbmRleCBkODRmNmE1Li5hOWNlMzQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCkBAIC02Nyw3ICs2Nyw3IEBACiAgKi8KIE5FU1RFRChleGNlcHRfdmVjM19yNDAwMCwgMCwgc3ApCiAJLnNldAlwdXNoCi0JLnNldAltaXBzMworCS5zZXQJYXJjaD1yNDAwMAogCS5zZXQJbm9hdAogCW1mYzAJazEsIENQMF9DQVVTRQogCWxpCWswLCAzMTw8MgpAQCAtMTM5LDcgKzEzOSw3IEBACiAJbm9wCiAJbm9wCiAjZW5kaWYKLQkuc2V0CW1pcHMzCisJLnNldAlhcmNoPXI0MDAwCiAJd2FpdAogCS8qIGVuZCBvZiByb2xsYmFjayByZWdpb24gKHRoZSByZWdpb24gc2l6ZSBtdXN0IGJlIHBvd2VyIG9mIHR3bykgKi8KIDE6CkBAIC00NzUsOCArNDc1LDEwIEBACiAJQlVJTERfSEFORExFUiBjcHUgY3B1IHN0aSBzaWxlbnQJCS8qICMxMSAqLwogCUJVSUxEX0hBTkRMRVIgb3Ygb3Ygc3RpIHNpbGVudAkJCS8qICMxMiAqLwogCUJVSUxEX0hBTkRMRVIgdHIgdHIgc3RpIHNpbGVudAkJCS8qICMxMyAqLworCUJVSUxEX0hBTkRMRVIgbXNhX2ZwZSBtc2FfZnBlIHN0aSBzaWxlbnQJLyogIzE0ICovCiAJQlVJTERfSEFORExFUiBmcGUgZnBlIGZwZSBzaWxlbnQJCS8qICMxNSAqLwogCUJVSUxEX0hBTkRMRVIgZnRsYiBmdGxiIG5vbmUgc2lsZW50CQkvKiAjMTYgKi8KKwlCVUlMRF9IQU5ETEVSIG1zYSBtc2Egc3RpIHNpbGVudAkJLyogIzIxICovCiAJQlVJTERfSEFORExFUiBtZG14IG1kbXggc3RpIHNpbGVudAkJLyogIzIyICovCiAjaWZkZWYJQ09ORklHX0hBUkRXQVJFX1dBVENIUE9JTlRTCiAJLyoKQEAgLTU3NSw3ICs1NzcsNyBAQAogCW9yaQlrMSwgX1RIUkVBRF9NQVNLCiAJeG9yaQlrMSwgX1RIUkVBRF9NQVNLCiAJTE9OR19MCXYxLCBUSV9UUF9WQUxVRShrMSkKLQkuc2V0CW1pcHMzCisJLnNldAlhcmNoPXI0MDAwCiAJZXJldAogCS5zZXQJbWlwczAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwppbmRleCA3YjZhNWIzLi5lNzEyZGNmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2hlYWQuUworKysgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwpAQCAtMTc1LDggKzE3NSw4IEBACiAJRE1UCTEwCSMgZG10IHQyIC8qIHQwLCB0MSBhcmUgdXNlZCBieSBDTEkgYW5kIHNldHVwX2MwX3N0YXR1cygpICovCiAJamFsCW1pcHNfaWhiCiAjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCXNldHVwX2MwX3N0YXR1c19zZWMKIAlzbXBfc2xhdmVfc2V0dXAKKwlzZXR1cF9jMF9zdGF0dXNfc2VjCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCWFuZGkJdDIsIHQyLCBWUEVDT05UUk9MX1RFCiAJYmVxegl0MiwgMmYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaWRsZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pZGxlLmMKaW5kZXggMzU1MzI0My4uODM3ZmYyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pZGxlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pZGxlLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAlpZiAoIW5lZWRfcmVzY2hlZCgpKQogCQlfX2FzbV9fKAogCQkiCS5zZXQJcHVzaAkJXG4iCi0JCSIJLnNldAltaXBzMwkJXG4iCisJCSIJLnNldAlhcmNoPXI0MDAwCVxuIgogCQkiCXdhaXQJCQlcbiIKIAkJIgkuc2V0CXBvcAkJXG4iKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC04Miw3ICs4Miw3IEBACiAJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKIAkJX19hc21fXygKIAkJIgkuc2V0CXB1c2gJCQkJCVxuIgotCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCQlcbiIKIAkJIgkuc2V0CW5vYXQJCQkJCVxuIgogCQkiCW1mYzAJJDEsICQxMgkJCQkJXG4iCiAJCSIJc3luYwkJCQkJCVxuIgpAQCAtMTAzLDcgKzEwMyw3IEBACiAJdW5zaWduZWQgbG9uZyBjMHN0YXR1cyA9IHJlYWRfYzBfc3RhdHVzKCkgfCAxOwkvKiBpcnFzIG9uICovCiAKIAlfX2FzbV9fKAotCSIJLnNldAltaXBzMwkJCVxuIgorCSIJLnNldAlhcmNoPXI0MDAwCQkJXG4iCiAJIgljYWNoZQkweDE0LCAwKCUwKQkJXG4iCiAJIgljYWNoZQkweDE0LCAzMiglMCkJCVxuIgogCSIJc3luYwkJCQlcbiIKQEAgLTE4NCw4ICsxODQsMTEgQEAKIAljYXNlIENQVV8yNEs6CiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzEwMDRLOgorCWNhc2UgQ1BVXzEwNzRLOgogCWNhc2UgQ1BVX0lOVEVSQVBUSVY6CiAJY2FzZSBDUFVfUFJPQVBUSVY6CisJY2FzZSBDUFVfUDU2MDA6CisJY2FzZSBDUFVfTTUxNTA6CiAJCWNwdV93YWl0ID0gcjRrX3dhaXQ7CiAJCWlmIChyZWFkX2MwX2NvbmZpZzcoKSAmIE1JUFNfQ09ORjdfV0lJKQogCQkJY3B1X3dhaXQgPSByNGtfd2FpdF9pcnFvZmY7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLWdpYy5jCmluZGV4IDViNWRkYjIuLjg1MjBkYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLWdpYy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLWdpYy5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2dpYy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9nY21wcmVncy5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmluZC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2tnZGIuYyBiL2FyY2gvbWlwcy9rZXJuZWwva2dkYi5jCmluZGV4IGZjYWFjMmYuLjdhZmNjMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwva2dkYi5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiBzdGF0aWMgc3RydWN0IGhhcmRfdHJhcF9pbmZvIHsKIAl1bnNpZ25lZCBjaGFyIHR0OwkvKiBUcmFwIHR5cGUgY29kZSBmb3IgTUlQUyBSM3h4eCBhbmQgUjR4eHggKi8KQEAgLTIwOCw3ICsyMDksMTQgQEAKIAogc3RhdGljIHZvaWQga2dkYl9jYWxsX25taV9ob29rKHZvaWQgKmlnbm9yZWQpCiB7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisKIAlrZ2RiX25taWNhbGxiYWNrKHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIE5VTEwpOworCisJc2V0X2ZzKG9sZF9mcyk7CiB9CiAKIHZvaWQga2dkYl9yb3VuZHVwX2NwdXModW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTI4Miw2ICsyOTAsNyBAQAogCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilwdHI7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBhcmdzLT5yZWdzOwogCWludCB0cmFwID0gKHJlZ3MtPmNwMF9jYXVzZSAmIDB4N2MpID4+IDI7CisJbW1fc2VnbWVudF90IG9sZF9mczsKIAogI2lmZGVmIENPTkZJR19LUFJPQkVTCiAJLyoKQEAgLTI5NiwxMSArMzA1LDE3IEBACiAJaWYgKHVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCisJLyogS2VybmVsIG1vZGUuIFNldCBjb3JyZWN0IGFkZHJlc3MgbGltaXQgKi8KKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCiAJaWYgKGF0b21pY19yZWFkKCZrZ2RiX2FjdGl2ZSkgIT0gLTEpCiAJCWtnZGJfbm1pY2FsbGJhY2soc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWdzKTsKIAotCWlmIChrZ2RiX2hhbmRsZV9leGNlcHRpb24odHJhcCwgY29tcHV0ZV9zaWduYWwodHJhcCksIGNtZCwgcmVncykpCisJaWYgKGtnZGJfaGFuZGxlX2V4Y2VwdGlvbih0cmFwLCBjb21wdXRlX3NpZ25hbCh0cmFwKSwgY21kLCByZWdzKSkgeworCQlzZXRfZnMob2xkX2ZzKTsKIAkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KIAogCWlmIChhdG9taWNfcmVhZCgma2dkYl9zZXR0aW5nX2JyZWFrcG9pbnQpKQogCQlpZiAoKHRyYXAgPT0gOSkgJiYgKHJlZ3MtPmNwMF9lcGMgPT0gKHVuc2lnbmVkIGxvbmcpYnJlYWtpbnN0KSkKQEAgLTMxMCw2ICszMjUsNyBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlfX2ZsdXNoX2NhY2hlX2FsbCgpOwogCisJc2V0X2ZzKG9sZF9mcyk7CiAJcmV0dXJuIE5PVElGWV9TVE9QOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21pcHMtY20uYyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwcy1jbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NmY3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL21pcHMtY20uYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogUGF1bCBCdXJ0b24gPHBhdWwuYnVydG9uQGltZ3RlYy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL21pcHMtY20uaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKwordm9pZCBfX2lvbWVtICptaXBzX2NtX2Jhc2U7Cit2b2lkIF9faW9tZW0gKm1pcHNfY21fbDJzeW5jX2Jhc2U7CisKK3BoeXNfdCBfX21pcHNfY21fcGh5c19iYXNlKHZvaWQpCit7CisJdTMyIGNvbmZpZzMgPSByZWFkX2MwX2NvbmZpZzMoKTsKKwl1MzIgY21nY3I7CisKKwkvKiBDaGVjayB0aGUgQ01HQ1JCYXNlIHJlZ2lzdGVyIGlzIGltcGxlbWVudGVkICovCisJaWYgKCEoY29uZmlnMyAmIE1JUFNfQ09ORjNfQ01HQ1IpKQorCQlyZXR1cm4gMDsKKworCS8qIFJlYWQgdGhlIGFkZHJlc3MgZnJvbSBDTUdDUkJhc2UgKi8KKwljbWdjciA9IHJlYWRfYzBfY21nY3JiYXNlKCk7CisJcmV0dXJuIChjbWdjciAmIE1JUFNfQ01HQ1JGX0JBU0UpIDw8ICgzNiAtIDMyKTsKK30KKworcGh5c190IG1pcHNfY21fcGh5c19iYXNlKHZvaWQpCisJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fbWlwc19jbV9waHlzX2Jhc2UiKSkpOworCitwaHlzX3QgX19taXBzX2NtX2wyc3luY19waHlzX2Jhc2Uodm9pZCkKK3sKKwl1MzIgYmFzZV9yZWc7CisKKwkvKgorCSAqIElmIHRoZSBMMi1vbmx5IHN5bmMgcmVnaW9uIGlzIGFscmVhZHkgZW5hYmxlZCB0aGVuIGxlYXZlIGl0IGF0IGl0J3MKKwkgKiBjdXJyZW50IGxvY2F0aW9uLgorCSAqLworCWJhc2VfcmVnID0gcmVhZF9nY3JfbDJfb25seV9zeW5jX2Jhc2UoKTsKKwlpZiAoYmFzZV9yZWcgJiBDTV9HQ1JfTDJfT05MWV9TWU5DX0JBU0VfU1lOQ0VOX01TSykKKwkJcmV0dXJuIGJhc2VfcmVnICYgQ01fR0NSX0wyX09OTFlfU1lOQ19CQVNFX1NZTkNCQVNFX01TSzsKKworCS8qIERlZmF1bHQgdG8gZm9sbG93aW5nIHRoZSBDTSAqLworCXJldHVybiBtaXBzX2NtX3BoeXNfYmFzZSgpICsgTUlQU19DTV9HQ1JfU0laRTsKK30KKworcGh5c190IG1pcHNfY21fbDJzeW5jX3BoeXNfYmFzZSh2b2lkKQorCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX21pcHNfY21fbDJzeW5jX3BoeXNfYmFzZSIpKSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfY21fcHJvYmVfbDJzeW5jKHZvaWQpCit7CisJdW5zaWduZWQgbWFqb3JfcmV2OworCXBoeXNfdCBhZGRyOworCisJLyogTDItb25seSBzeW5jIHdhcyBpbnRyb2R1Y2VkIHdpdGggQ00gbWFqb3IgcmV2aXNpb24gNiAqLworCW1ham9yX3JldiA9IChyZWFkX2djcl9yZXYoKSAmIENNX0dDUl9SRVZfTUFKT1JfTVNLKSA+PgorCQlDTV9HQ1JfUkVWX01BSk9SX1NIRjsKKwlpZiAobWFqb3JfcmV2IDwgNikKKwkJcmV0dXJuOworCisJLyogRmluZCBhIGxvY2F0aW9uIGZvciB0aGUgTDIgc3luYyByZWdpb24gKi8KKwlhZGRyID0gbWlwc19jbV9sMnN5bmNfcGh5c19iYXNlKCk7CisJQlVHX09OKChhZGRyICYgQ01fR0NSX0wyX09OTFlfU1lOQ19CQVNFX1NZTkNCQVNFX01TSykgIT0gYWRkcik7CisJaWYgKCFhZGRyKQorCQlyZXR1cm47CisKKwkvKiBTZXQgdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgJiBlbmFibGUgaXQgKi8KKwl3cml0ZV9nY3JfbDJfb25seV9zeW5jX2Jhc2UoYWRkciB8IENNX0dDUl9MMl9PTkxZX1NZTkNfQkFTRV9TWU5DRU5fTVNLKTsKKworCS8qIE1hcCB0aGUgcmVnaW9uICovCisJbWlwc19jbV9sMnN5bmNfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShhZGRyLCBNSVBTX0NNX0wyU1lOQ19TSVpFKTsKK30KKworaW50IG1pcHNfY21fcHJvYmUodm9pZCkKK3sKKwlwaHlzX3QgYWRkcjsKKwl1MzIgYmFzZV9yZWc7CisKKwlhZGRyID0gbWlwc19jbV9waHlzX2Jhc2UoKTsKKwlCVUdfT04oKGFkZHIgJiBDTV9HQ1JfQkFTRV9HQ1JCQVNFX01TSykgIT0gYWRkcik7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1pcHNfY21fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShhZGRyLCBNSVBTX0NNX0dDUl9TSVpFKTsKKwlpZiAoIW1pcHNfY21fYmFzZSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIHNhbml0eSBjaGVjayB0aGF0IHdlJ3JlIGxvb2tpbmcgYXQgYSBDTSAqLworCWJhc2VfcmVnID0gcmVhZF9nY3JfYmFzZSgpOworCWlmICgoYmFzZV9yZWcgJiBDTV9HQ1JfQkFTRV9HQ1JCQVNFX01TSykgIT0gYWRkcikgeworCQlwcl9lcnIoIkdDUnMgYXBwZWFyIHRvIGhhdmUgYmVlbiBtb3ZlZCAoZXhwZWN0ZWQgdGhlbSBhdCAweCUwOGx4KSFcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylhZGRyKTsKKwkJbWlwc19jbV9iYXNlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogc2V0IGRlZmF1bHQgdGFyZ2V0IHRvIG1lbW9yeSAqLworCWJhc2VfcmVnICY9IH5DTV9HQ1JfQkFTRV9DTURFRlRHVF9NU0s7CisJYmFzZV9yZWcgfD0gQ01fR0NSX0JBU0VfQ01ERUZUR1RfTUVNOworCXdyaXRlX2djcl9iYXNlKGJhc2VfcmVnKTsKKworCS8qIGRpc2FibGUgQ00gcmVnaW9ucyAqLworCXdyaXRlX2djcl9yZWcwX2Jhc2UoQ01fR0NSX1JFR25fQkFTRV9CQVNFQUREUl9NU0spOworCXdyaXRlX2djcl9yZWcwX21hc2soQ01fR0NSX1JFR25fTUFTS19BRERSTUFTS19NU0spOworCXdyaXRlX2djcl9yZWcxX2Jhc2UoQ01fR0NSX1JFR25fQkFTRV9CQVNFQUREUl9NU0spOworCXdyaXRlX2djcl9yZWcxX21hc2soQ01fR0NSX1JFR25fTUFTS19BRERSTUFTS19NU0spOworCXdyaXRlX2djcl9yZWcyX2Jhc2UoQ01fR0NSX1JFR25fQkFTRV9CQVNFQUREUl9NU0spOworCXdyaXRlX2djcl9yZWcyX21hc2soQ01fR0NSX1JFR25fTUFTS19BRERSTUFTS19NU0spOworCXdyaXRlX2djcl9yZWczX2Jhc2UoQ01fR0NSX1JFR25fQkFTRV9CQVNFQUREUl9NU0spOworCXdyaXRlX2djcl9yZWczX21hc2soQ01fR0NSX1JFR25fTUFTS19BRERSTUFTS19NU0spOworCisJLyogcHJvYmUgZm9yIGFuIEwyLW9ubHkgc3luYyByZWdpb24gKi8KKwltaXBzX2NtX3Byb2JlX2wyc3luYygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21pcHMtY3BjLmMgYi9hcmNoL21pcHMva2VybmVsL21pcHMtY3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkYzY3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwcy1jcGMuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworICogQXV0aG9yOiBQYXVsIEJ1cnRvbiA8cGF1bC5idXJ0b25AaW1ndGVjLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxhc20vbWlwcy1jbS5oPgorI2luY2x1ZGUgPGFzbS9taXBzLWNwYy5oPgorCit2b2lkIF9faW9tZW0gKm1pcHNfY3BjX2Jhc2U7CisKK3BoeXNfdCBfX3dlYWsgbWlwc19jcGNfcGh5c19iYXNlKHZvaWQpCit7CisJdTMyIGNwY19iYXNlOworCisJaWYgKCFtaXBzX2NtX3ByZXNlbnQoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShyZWFkX2djcl9jcGNfc3RhdHVzKCkgJiBDTV9HQ1JfQ1BDX1NUQVRVU19FWF9NU0spKQorCQlyZXR1cm4gMDsKKworCS8qIElmIHRoZSBDUEMgaXMgYWxyZWFkeSBlbmFibGVkLCBsZWF2ZSBpdCBzbyAqLworCWNwY19iYXNlID0gcmVhZF9nY3JfY3BjX2Jhc2UoKTsKKwlpZiAoY3BjX2Jhc2UgJiBDTV9HQ1JfQ1BDX0JBU0VfQ1BDRU5fTVNLKQorCQlyZXR1cm4gY3BjX2Jhc2UgJiBDTV9HQ1JfQ1BDX0JBU0VfQ1BDQkFTRV9NU0s7CisKKwkvKiBPdGhlcndpc2UsIGdpdmUgaXQgdGhlIGRlZmF1bHQgYWRkcmVzcyAmIGVuYWJsZSBpdCAqLworCWNwY19iYXNlID0gbWlwc19jcGNfZGVmYXVsdF9waHlzX2Jhc2UoKTsKKwl3cml0ZV9nY3JfY3BjX2Jhc2UoY3BjX2Jhc2UgfCBDTV9HQ1JfQ1BDX0JBU0VfQ1BDRU5fTVNLKTsKKwlyZXR1cm4gY3BjX2Jhc2U7Cit9CisKK2ludCBtaXBzX2NwY19wcm9iZSh2b2lkKQoreworCXBoeXNfdCBhZGRyOworCisJYWRkciA9IG1pcHNfY3BjX3BoeXNfYmFzZSgpOworCWlmICghYWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltaXBzX2NwY19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGFkZHIsIDB4ODAwMCk7CisJaWYgKCFtaXBzX2NwY19iYXNlKQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21pcHNfa3N5bXMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jCmluZGV4IDZlNThlOTcuLjI2MDdjM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jCkBAIC0xNiwxMiArMTYsMjAgQEAKICNpbmNsdWRlIDxhc20vZnRyYWNlLmg+CiAKIGV4dGVybiB2b2lkICpfX2J6ZXJvKHZvaWQgKl9fcywgc2l6ZV90IF9fY291bnQpOworZXh0ZXJuIGxvbmcgX19zdHJuY3B5X2Zyb21fa2VybmVsX25vY2hlY2tfYXNtKGNoYXIgKl9fdG8sCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fZnJvbSwgbG9uZyBfX2xlbik7CitleHRlcm4gbG9uZyBfX3N0cm5jcHlfZnJvbV9rZXJuZWxfYXNtKGNoYXIgKl9fdG8sIGNvbnN0IGNoYXIgKl9fZnJvbSwKKwkJCQkgICAgICBsb25nIF9fbGVuKTsKIGV4dGVybiBsb25nIF9fc3RybmNweV9mcm9tX3VzZXJfbm9jaGVja19hc20oY2hhciAqX190bywKIAkJCQkJICAgIGNvbnN0IGNoYXIgKl9fZnJvbSwgbG9uZyBfX2xlbik7CiBleHRlcm4gbG9uZyBfX3N0cm5jcHlfZnJvbV91c2VyX2FzbShjaGFyICpfX3RvLCBjb25zdCBjaGFyICpfX2Zyb20sCiAJCQkJICAgIGxvbmcgX19sZW4pOworZXh0ZXJuIGxvbmcgX19zdHJsZW5fa2VybmVsX25vY2hlY2tfYXNtKGNvbnN0IGNoYXIgKnMpOworZXh0ZXJuIGxvbmcgX19zdHJsZW5fa2VybmVsX2FzbShjb25zdCBjaGFyICpzKTsKIGV4dGVybiBsb25nIF9fc3RybGVuX3VzZXJfbm9jaGVja19hc20oY29uc3QgY2hhciAqcyk7CiBleHRlcm4gbG9uZyBfX3N0cmxlbl91c2VyX2FzbShjb25zdCBjaGFyICpzKTsKK2V4dGVybiBsb25nIF9fc3Rybmxlbl9rZXJuZWxfbm9jaGVja19hc20oY29uc3QgY2hhciAqcyk7CitleHRlcm4gbG9uZyBfX3N0cm5sZW5fa2VybmVsX2FzbShjb25zdCBjaGFyICpzKTsKIGV4dGVybiBsb25nIF9fc3Rybmxlbl91c2VyX25vY2hlY2tfYXNtKGNvbnN0IGNoYXIgKnMpOwogZXh0ZXJuIGxvbmcgX19zdHJubGVuX3VzZXJfYXNtKGNvbnN0IGNoYXIgKnMpOwogCkBAIC00MywxNyArNTEsMzEgQEAKICAqLwogRVhQT1JUX1NZTUJPTChfX2NvcHlfdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9fY29weV91c2VyX2luYXRvbWljKTsKKyNpZmRlZiBDT05GSUdfRVZBCitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXJfZXZhKTsKK0VYUE9SVF9TWU1CT0woX19jb3B5X2luX3VzZXJfZXZhKTsKK0VYUE9SVF9TWU1CT0woX19jb3B5X3RvX3VzZXJfZXZhKTsKK0VYUE9SVF9TWU1CT0woX19jb3B5X3VzZXJfaW5hdG9taWNfZXZhKTsKKyNlbmRpZgogRVhQT1JUX1NZTUJPTChfX2J6ZXJvKTsKK0VYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fa2VybmVsX25vY2hlY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fa2VybmVsX2FzbSk7CiBFWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX3VzZXJfbm9jaGVja19hc20pOwogRVhQT1JUX1NZTUJPTChfX3N0cm5jcHlfZnJvbV91c2VyX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fc3RybGVuX2tlcm5lbF9ub2NoZWNrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fc3RybGVuX2tlcm5lbF9hc20pOwogRVhQT1JUX1NZTUJPTChfX3N0cmxlbl91c2VyX25vY2hlY2tfYXNtKTsKIEVYUE9SVF9TWU1CT0woX19zdHJsZW5fdXNlcl9hc20pOworRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fa2VybmVsX25vY2hlY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19zdHJubGVuX2tlcm5lbF9hc20pOwogRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fdXNlcl9ub2NoZWNrX2FzbSk7CiBFWFBPUlRfU1lNQk9MKF9fc3Rybmxlbl91c2VyX2FzbSk7CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayk7Ci1FWFBPUlRfU1lNQk9MKF9fY3N1bV9wYXJ0aWFsX2NvcHlfdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fY3N1bV9wYXJ0aWFsX2NvcHlfa2VybmVsKTsKK0VYUE9SVF9TWU1CT0woX19jc3VtX3BhcnRpYWxfY29weV90b191c2VyKTsKK0VYUE9SVF9TWU1CT0woX19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpOwogCiBFWFBPUlRfU1lNQk9MKGludmFsaWRfcHRlX3RhYmxlKTsKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMgYi9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMKaW5kZXggMjRjZGY2NC4uNGYyZDlkZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudF9taXBzeHguYwpAQCAtODA1LDcgKzgwNSw3IEBACiAJfQogfQogCi0vKiAyNEsvMzRLLzEwMDRLIGNvcmVzIGNhbiBzaGFyZSB0aGUgc2FtZSBldmVudCBtYXAuICovCisvKiAyNEsvMzRLLzEwMDRLL2ludGVyQXB0aXYvbG9vbmdzb24xIGNvcmVzIHNoYXJlIHRoZSBzYW1lIGV2ZW50IG1hcC4gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IG1pcHN4eGNvcmVfZXZlbnRfbWFwCiAJCQkJW1BFUkZfQ09VTlRfSFdfTUFYXSA9IHsKIAlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXSA9IHsgMHgwMCwgQ05UUl9FVkVOIHwgQ05UUl9PREQsIFAgfSwKQEAgLTgxNCw4ICs4MTQsOCBAQAogCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdID0geyAweDAyLCBDTlRSX09ERCwgVCB9LAogfTsKIAotLyogNzRLIGNvcmUgaGFzIGRpZmZlcmVudCBicmFuY2ggZXZlbnQgY29kZS4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IG1pcHN4eDc0S2NvcmVfZXZlbnRfbWFwCisvKiA3NEsvcHJvQXB0aXYgY29yZSBoYXMgZGlmZmVyZW50IGJyYW5jaCBldmVudCBjb2RlLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgbWlwc3h4Y29yZV9ldmVudF9tYXAyCiAJCQkJW1BFUkZfQ09VTlRfSFdfTUFYXSA9IHsKIAlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXSA9IHsgMHgwMCwgQ05UUl9FVkVOIHwgQ05UUl9PREQsIFAgfSwKIAlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdID0geyAweDAxLCBDTlRSX0VWRU4gfCBDTlRSX09ERCwgVCB9LApAQCAtODQ5LDcgKzg0OSw3IEBACiAJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10gPSB7IDB4MWMsIENOVFJfQUxMIH0sIC8qIFBBUElfQlJfTVNQICovCiB9OwogCi0vKiAyNEsvMzRLLzEwMDRLIGNvcmVzIGNhbiBzaGFyZSB0aGUgc2FtZSBjYWNoZSBldmVudCBtYXAuICovCisvKiAyNEsvMzRLLzEwMDRLL2ludGVyQXB0aXYvbG9vbmdzb24xIGNvcmVzIHNoYXJlIHRoZSBzYW1lIGNhY2hlIGV2ZW50IG1hcC4gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IG1pcHN4eGNvcmVfY2FjaGVfbWFwCiAJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQogCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KQEAgLTkzMCw4ICs5MzAsOCBAQAogfSwKIH07CiAKLS8qIDc0SyBjb3JlIGhhcyBjb21wbGV0ZWx5IGRpZmZlcmVudCBjYWNoZSBldmVudCBtYXAuICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBtaXBzeHg3NEtjb3JlX2NhY2hlX21hcAorLyogNzRLL3Byb0FwdGl2IGNvcmUgaGFzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGNhY2hlIGV2ZW50IG1hcC4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IG1pcHN4eGNvcmVfY2FjaGVfbWFwMgogCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KIAkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCiAJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPSB7CkBAIC05NzgsNiArOTc4LDExIEBACiAJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IDB4MWQsIENOVFJfRVZFTiwgUCB9LAogCX0sCiB9LAorLyoKKyAqIDc0SyBjb3JlIGRvZXMgbm90IGhhdmUgc3BlY2lmaWMgRFRMQiBldmVudHMuIHByb0FwdGl2IGNvcmUgaGFzCisgKiAic3BlY3VsYXRpdmUiIERUTEIgZXZlbnRzIHdoaWNoIGFyZSBudW1iZXJlZCAweDYzIChldmVuL29kZCkgYW5kCisgKiBub3QgaW5jbHVkZWQgaGVyZS4gT25lIGNhbiB1c2UgcmF3IGV2ZW50cyBpZiByZWFsbHkgbmVlZGVkLgorICovCiBbQyhJVExCKV0gPSB7CiAJW0MoT1BfUkVBRCldID0gewogCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IDB4MDQsIENOVFJfRVZFTiwgVCB9LApAQCAtMTM3OCw2ICsxMzgzLDEwIEBACiAjZGVmaW5lIElTX0JPVEhfQ09VTlRFUlNfNzRLX0VWRU5UKGIpCQkJCQlcCiAJKChiKSA9PSAwIHx8IChiKSA9PSAxKQogCisvKiBwcm9BcHRpdiAqLworI2RlZmluZSBJU19CT1RIX0NPVU5URVJTX1BST0FQVElWX0VWRU5UKGIpCQkJCVwKKwkoKGIpID09IDAgfHwgKGIpID09IDEpCisKIC8qIDEwMDRLICovCiAjZGVmaW5lIElTX0JPVEhfQ09VTlRFUlNfMTAwNEtfRVZFTlQoYikJCQkJCVwKIAkoKGIpID09IDAgfHwgKGIpID09IDEgfHwgKGIpID09IDExKQpAQCAtMTM5MSw2ICsxNDAwLDIwIEBACiAjZGVmaW5lIElTX1JBTkdFX1ZfMTAwNEtfRVZFTlQocikJKChyKSA9PSA0NykKICNlbmRpZgogCisvKiBpbnRlckFwdGl2ICovCisjZGVmaW5lIElTX0JPVEhfQ09VTlRFUlNfSU5URVJBUFRJVl9FVkVOVChiKQkJCQlcCisJKChiKSA9PSAwIHx8IChiKSA9PSAxIHx8IChiKSA9PSAxMSkKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKy8qIFRoZSBQL1YvVCBpbmZvIGlzIG5vdCBwcm92aWRlZCBmb3IgIihiKSA9PSAzOCIgaW4gU1VNLCBhc3N1bWUgUC4gKi8KKyNkZWZpbmUgSVNfUkFOR0VfUF9JTlRFUkFQVElWX0VWRU5UKHIsIGIpCQkJCVwKKwkoKGIpID09IDAgfHwgKHIpID09IDE4IHx8IChiKSA9PSAyMSB8fCAoYikgPT0gMjIgfHwJCVwKKwkgKGIpID09IDI1IHx8IChiKSA9PSAzNiB8fCAoYikgPT0gMzggfHwgKGIpID09IDM5IHx8CQlcCisJIChyKSA9PSA0NCB8fCAocikgPT0gMTc0IHx8IChyKSA9PSAxNzYgfHwgKChiKSA+PSA1MCAmJgkJXAorCSAoYikgPD0gNTkpIHx8IChyKSA9PSAxODggfHwgKGIpID09IDYxIHx8IChiKSA9PSA2MiB8fAkJXAorCSAoKGIpID49IDY0ICYmIChiKSA8PSA2NykpCisjZGVmaW5lIElTX1JBTkdFX1ZfSU5URVJBUFRJVl9FVkVOVChyKQkoKHIpID09IDQ3IHx8IChyKSA9PSAxNzUpCisjZW5kaWYKKwogLyogQk1JUFM1MDAwICovCiAjZGVmaW5lIElTX0JPVEhfQ09VTlRFUlNfQk1JUFM1MDAwX0VWRU5UKGIpCQkJCVwKIAkoKGIpID09IDAgfHwgKGIpID09IDEpCkBAIC0xNDQyLDYgKzE0NjUsNyBAQAogI2VuZGlmCiAJCWJyZWFrOwogCWNhc2UgQ1BVXzc0SzoKKwljYXNlIENQVV8xMDc0SzoKIAkJaWYgKElTX0JPVEhfQ09VTlRFUlNfNzRLX0VWRU5UKGJhc2VfaWQpKQogCQkJcmF3X2V2ZW50LmNudHJfbWFzayA9IENOVFJfRVZFTiB8IENOVFJfT0REOwogCQllbHNlCkBAIC0xNDUxLDYgKzE0NzUsMTYgQEAKIAkJcmF3X2V2ZW50LnJhbmdlID0gUDsKICNlbmRpZgogCQlicmVhazsKKwljYXNlIENQVV9QUk9BUFRJVjoKKwkJaWYgKElTX0JPVEhfQ09VTlRFUlNfUFJPQVBUSVZfRVZFTlQoYmFzZV9pZCkpCisJCQlyYXdfZXZlbnQuY250cl9tYXNrID0gQ05UUl9FVkVOIHwgQ05UUl9PREQ7CisJCWVsc2UKKwkJCXJhd19ldmVudC5jbnRyX21hc2sgPQorCQkJCXJhd19pZCA+IDEyNyA/IENOVFJfT0REIDogQ05UUl9FVkVOOworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAorCQlyYXdfZXZlbnQucmFuZ2UgPSBQOworI2VuZGlmCisJCWJyZWFrOwogCWNhc2UgQ1BVXzEwMDRLOgogCQlpZiAoSVNfQk9USF9DT1VOVEVSU18xMDA0S19FVkVOVChiYXNlX2lkKSkKIAkJCXJhd19ldmVudC5jbnRyX21hc2sgPSBDTlRSX0VWRU4gfCBDTlRSX09ERDsKQEAgLTE0NjYsNiArMTUwMCwyMSBAQAogCQkJcmF3X2V2ZW50LnJhbmdlID0gVDsKICNlbmRpZgogCQlicmVhazsKKwljYXNlIENQVV9JTlRFUkFQVElWOgorCQlpZiAoSVNfQk9USF9DT1VOVEVSU19JTlRFUkFQVElWX0VWRU5UKGJhc2VfaWQpKQorCQkJcmF3X2V2ZW50LmNudHJfbWFzayA9IENOVFJfRVZFTiB8IENOVFJfT0REOworCQllbHNlCisJCQlyYXdfZXZlbnQuY250cl9tYXNrID0KKwkJCQlyYXdfaWQgPiAxMjcgPyBDTlRSX09ERCA6IENOVFJfRVZFTjsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKwkJaWYgKElTX1JBTkdFX1BfSU5URVJBUFRJVl9FVkVOVChyYXdfaWQsIGJhc2VfaWQpKQorCQkJcmF3X2V2ZW50LnJhbmdlID0gUDsKKwkJZWxzZSBpZiAodW5saWtlbHkoSVNfUkFOR0VfVl9JTlRFUkFQVElWX0VWRU5UKHJhd19pZCkpKQorCQkJcmF3X2V2ZW50LnJhbmdlID0gVjsKKwkJZWxzZQorCQkJcmF3X2V2ZW50LnJhbmdlID0gVDsKKyNlbmRpZgorCQlicmVhazsKIAljYXNlIENQVV9CTUlQUzUwMDA6CiAJCWlmIChJU19CT1RIX0NPVU5URVJTX0JNSVBTNTAwMF9FVkVOVChiYXNlX2lkKSkKIAkJCXJhd19ldmVudC5jbnRyX21hc2sgPSBDTlRSX0VWRU4gfCBDTlRSX09ERDsKQEAgLTE1NzYsMTQgKzE2MjUsMjkgQEAKIAkJYnJlYWs7CiAJY2FzZSBDUFVfNzRLOgogCQltaXBzcG11Lm5hbWUgPSAibWlwcy83NEsiOwotCQltaXBzcG11LmdlbmVyYWxfZXZlbnRfbWFwID0gJm1pcHN4eDc0S2NvcmVfZXZlbnRfbWFwOwotCQltaXBzcG11LmNhY2hlX2V2ZW50X21hcCA9ICZtaXBzeHg3NEtjb3JlX2NhY2hlX21hcDsKKwkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcDI7CisJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwMjsKKwkJYnJlYWs7CisJY2FzZSBDUFVfUFJPQVBUSVY6CisJCW1pcHNwbXUubmFtZSA9ICJtaXBzL3Byb0FwdGl2IjsKKwkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcDI7CisJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwMjsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfMTAwNEs6CiAJCW1pcHNwbXUubmFtZSA9ICJtaXBzLzEwMDRLIjsKIAkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcDsKIAkJbWlwc3BtdS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9jYWNoZV9tYXA7CiAJCWJyZWFrOworCWNhc2UgQ1BVXzEwNzRLOgorCQltaXBzcG11Lm5hbWUgPSAibWlwcy8xMDc0SyI7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXA7CisJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwOworCQlicmVhazsKKwljYXNlIENQVV9JTlRFUkFQVElWOgorCQltaXBzcG11Lm5hbWUgPSAibWlwcy9pbnRlckFwdGl2IjsKKwkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcDsKKwkJbWlwc3BtdS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9jYWNoZV9tYXA7CisJCWJyZWFrOwogCWNhc2UgQ1BVX0xPT05HU09OMToKIAkJbWlwc3BtdS5uYW1lID0gIm1pcHMvbG9vbmdzb24xIjsKIAkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvYy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jLmMKaW5kZXggMDBkMjA5Ny4uZTQwOTcxYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jLmMKQEAgLTE3LDggKzE3LDI0IEBACiAKIHVuc2lnbmVkIGludCB2Y2VkX2NvdW50LCB2Y2VpX2NvdW50OwogCisvKgorICogICogTm8gbG9jazsgb25seSB3cml0dGVuIGR1cmluZyBlYXJseSBib290dXAgYnkgQ1BVIDAuCisgKiAgICovCitzdGF0aWMgUkFXX05PVElGSUVSX0hFQUQocHJvY19jcHVpbmZvX2NoYWluKTsKKworaW50IF9fcmVmIHJlZ2lzdGVyX3Byb2NfY3B1aW5mb19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiByYXdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnByb2NfY3B1aW5mb19jaGFpbiwgbmIpOworfQorCitpbnQgcHJvY19jcHVpbmZvX25vdGlmaWVyX2NhbGxfY2hhaW4odW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnYpCit7CisJcmV0dXJuIHJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZwcm9jX2NwdWluZm9fY2hhaW4sIHZhbCwgdik7Cit9CisKIHN0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKKwlzdHJ1Y3QgcHJvY19jcHVpbmZvX25vdGlmaWVyX2FyZ3MgcHJvY19jcHVpbmZvX25vdGlmaWVyX2FyZ3M7CiAJdW5zaWduZWQgbG9uZyBuID0gKHVuc2lnbmVkIGxvbmcpIHYgLSAxOwogCXVuc2lnbmVkIGludCB2ZXJzaW9uID0gY3B1X2RhdGFbbl0ucHJvY2Vzc29yX2lkOwogCXVuc2lnbmVkIGludCBmcF92ZXJzID0gY3B1X2RhdGFbbl0uZnB1X2lkOwpAQCAtOTUsNiArMTExLDggQEAKIAlpZiAoY3B1X2hhc19taXBzbXQpCXNlcV9wcmludGYobSwgIiVzIiwgIiBtdCIpOwogCWlmIChjcHVfaGFzX21taXBzKQlzZXFfcHJpbnRmKG0sICIlcyIsICIgbWljcm9taXBzIik7CiAJaWYgKGNwdV9oYXNfdnopCQlzZXFfcHJpbnRmKG0sICIlcyIsICIgdnoiKTsKKwlpZiAoY3B1X2hhc19tc2EpCXNlcV9wcmludGYobSwgIiVzIiwgIiBtc2EiKTsKKwlpZiAoY3B1X2hhc19ldmEpCXNlcV9wcmludGYobSwgIiVzIiwgIiBldmEiKTsKIAlzZXFfcHJpbnRmKG0sICJcbiIpOwogCiAJaWYgKGNwdV9oYXNfbW1pcHMpIHsKQEAgLTExOCw2ICsxMzYsMTMgQEAKIAkJICAgICAgY3B1X2hhc192Y2UgPyAiJXUiIDogIm5vdCBhdmFpbGFibGUiKTsKIAlzZXFfcHJpbnRmKG0sIGZtdCwgJ0QnLCB2Y2VkX2NvdW50KTsKIAlzZXFfcHJpbnRmKG0sIGZtdCwgJ0knLCB2Y2VpX2NvdW50KTsKKworCXByb2NfY3B1aW5mb19ub3RpZmllcl9hcmdzLm0gPSBtOworCXByb2NfY3B1aW5mb19ub3RpZmllcl9hcmdzLm4gPSBuOworCisJcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4oJnByb2NfY3B1aW5mb19jaGFpbiwgMCwKKwkJCQkmcHJvY19jcHVpbmZvX25vdGlmaWVyX2FyZ3MpOworCiAJc2VxX3ByaW50ZihtLCAiXG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2YWU1NDBlLi42MGUzOWRjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vZHNwLmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgorI2luY2x1ZGUgPGFzbS9tc2EuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTY1LDYgKzY2LDggQEAKIAljbGVhcl91c2VkX21hdGgoKTsKIAljbGVhcl9mcHVfb3duZXIoKTsKIAlpbml0X2RzcCgpOworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9NU0FfQ1RYX0xJVkUpOworCWRpc2FibGVfbXNhKCk7CiAJcmVncy0+Y3AwX2VwYyA9IHBjOwogCXJlZ3MtPnJlZ3NbMjldID0gc3A7CiB9CkBAIC04OSw3ICs5Miw5IEBACiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAotCWlmIChpc19mcHVfb3duZXIoKSkKKwlpZiAoaXNfbXNhX2VuYWJsZWQoKSkKKwkJc2F2ZV9tc2EocCk7CisJZWxzZSBpZiAoaXNfZnB1X293bmVyKCkpCiAJCXNhdmVfZnAocCk7CiAKIAlpZiAoY3B1X2hhc19kc3ApCkBAIC0xNTcsNyArMTYyLDEzIEBACiAvKiBGaWxsIGluIHRoZSBmcHUgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uICovCiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGVsZl9mcHJlZ3NldF90ICpyKQogewotCW1lbWNweShyLCAmY3VycmVudC0+dGhyZWFkLmZwdSwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC5mcHUpKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkrKykKKwkJbWVtY3B5KCZyW2ldLCAmY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sIHNpemVvZigqcikpOworCisJbWVtY3B5KCZyW05VTV9GUFVfUkVHU10sICZjdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxLAorCSAgICAgICBzaXplb2YoY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSkpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xOTIsNyArMjAzLDEzIEBACiAKIGludCBkdW1wX3Rhc2tfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZWxmX2ZwcmVnc2V0X3QgKmZwcikKIHsKLQltZW1jcHkoZnByLCAmdC0+dGhyZWFkLmZwdSwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC5mcHUpKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkrKykKKwkJbWVtY3B5KCZmcHJbaV0sICZ0LT50aHJlYWQuZnB1LmZwcltpXSwgc2l6ZW9mKCpmcHIpKTsKKworCW1lbWNweSgmZnByW05VTV9GUFVfUkVHU10sICZ0LT50aHJlYWQuZnB1LmZjcjMxLAorCSAgICAgICBzaXplb2YodC0+dGhyZWFkLmZwdS5mY3IzMSkpOwogCiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYwppbmRleCA3ZGE5Yjc2Li43MjcxZTVhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKQEAgLTExNCw1MSArMTE0LDMwIEBACiBpbnQgcHRyYWNlX2dldGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBfX3UzMiBfX3VzZXIgKmRhdGEpCiB7CiAJaW50IGk7Ci0JdW5zaWduZWQgaW50IHRtcDsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YSwgMzMgKiA4KSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAodHNrX3VzZWRfbWF0aChjaGlsZCkpIHsKLQkJZnB1cmVnX3QgKmZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKKwkJdW5pb24gZnB1cmVnICpmcmVncyA9IGdldF9mcHVfcmVncyhjaGlsZCk7CiAJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkJX19wdXRfdXNlcihmcmVnc1tpXSwgaSArIChfX3U2NCBfX3VzZXIgKikgZGF0YSk7CisJCQlfX3B1dF91c2VyKGdldF9mcHI2NCgmZnJlZ3NbaV0sIDApLAorCQkJCSAgIGkgKyAoX191NjQgX191c2VyICopZGF0YSk7CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCiAJCQlfX3B1dF91c2VyKChfX3U2NCkgLTEsIGkgKyAoX191NjQgX191c2VyICopIGRhdGEpOwogCX0KIAogCV9fcHV0X3VzZXIoY2hpbGQtPnRocmVhZC5mcHUuZmNyMzEsIGRhdGEgKyA2NCk7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAoY3B1X2hhc19mcHUpIHsKLQkJdW5zaWduZWQgaW50IGZsYWdzOwotCi0JCWlmIChjcHVfaGFzX21pcHNtdCkgewotCQkJdW5zaWduZWQgaW50IHZwZmxhZ3MgPSBkdnBlKCk7Ci0JCQlmbGFncyA9IHJlYWRfYzBfc3RhdHVzKCk7Ci0JCQlfX2VuYWJsZV9mcHUoRlBVX0FTX0lTKTsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJjZmMxXHQlMCwkMCIgOiAiPXIiICh0bXApKTsKLQkJCXdyaXRlX2MwX3N0YXR1cyhmbGFncyk7Ci0JCQlldnBlKHZwZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJZmxhZ3MgPSByZWFkX2MwX3N0YXR1cygpOwotCQkJX19lbmFibGVfZnB1KEZQVV9BU19JUyk7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiIDogIj1yIiAodG1wKSk7Ci0JCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdG1wID0gMDsKLQl9Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQlfX3B1dF91c2VyKHRtcCwgZGF0YSArIDY1KTsKKwlfX3B1dF91c2VyKGN1cnJlbnRfY3B1X2RhdGEuZnB1X2lkLCBkYXRhICsgNjUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBwdHJhY2Vfc2V0ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIF9fdTMyIF9fdXNlciAqZGF0YSkKIHsKLQlmcHVyZWdfdCAqZnJlZ3M7CisJdW5pb24gZnB1cmVnICpmcmVnczsKKwl1NjQgZnByX3ZhbDsKIAlpbnQgaTsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhLCAzMyAqIDgpKQpAQCAtMTY2LDggKzE0NSwxMCBAQAogCiAJZnJlZ3MgPSBnZXRfZnB1X3JlZ3MoY2hpbGQpOwogCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCV9fZ2V0X3VzZXIoZnJlZ3NbaV0sIGkgKyAoX191NjQgX191c2VyICopIGRhdGEpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCV9fZ2V0X3VzZXIoZnByX3ZhbCwgaSArIChfX3U2NCBfX3VzZXIgKilkYXRhKTsKKwkJc2V0X2ZwcjY0KCZmcmVnc1tpXSwgMCwgZnByX3ZhbCk7CisJfQogCiAJX19nZXRfdXNlcihjaGlsZC0+dGhyZWFkLmZwdS5mY3IzMSwgZGF0YSArIDY0KTsKIApAQCAtMzAwLDEwICsyODEsMjcgQEAKIAkJICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAogCQkgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKIHsKLQlyZXR1cm4gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKLQkJCQkgICAmdGFyZ2V0LT50aHJlYWQuZnB1LAotCQkJCSAgIDAsIHNpemVvZihlbGZfZnByZWdzZXRfdCkpOworCXVuc2lnbmVkIGk7CisJaW50IGVycjsKKwl1NjQgZnByX3ZhbDsKKwogCS8qIFhYWCBmY3IzMSAgKi8KKworCWlmIChzaXplb2YodGFyZ2V0LT50aHJlYWQuZnB1LmZwcltpXSkgPT0gc2l6ZW9mKGVsZl9mcHJlZ190KSkKKwkJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgICZ0YXJnZXQtPnRocmVhZC5mcHUsCisJCQkJCSAgIDAsIHNpemVvZihlbGZfZnByZWdzZXRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GUFVfUkVHUzsgaSsrKSB7CisJCWZwcl92YWwgPSBnZXRfZnByNjQoJnRhcmdldC0+dGhyZWFkLmZwdS5mcHJbaV0sIDApOworCQllcnIgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICZmcHJfdmFsLCBpICogc2l6ZW9mKGVsZl9mcHJlZ190KSwKKwkJCQkJICAoaSArIDEpICogc2l6ZW9mKGVsZl9mcHJlZ190KSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGZwcl9zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCkBAIC0zMTEsMTAgKzMwOSwyNyBAQAogCQkgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCiAJCSAgIGNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQogewotCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCi0JCQkJICAmdGFyZ2V0LT50aHJlYWQuZnB1LAotCQkJCSAgMCwgc2l6ZW9mKGVsZl9mcHJlZ3NldF90KSk7CisJdW5zaWduZWQgaTsKKwlpbnQgZXJyOworCXU2NCBmcHJfdmFsOworCiAJLyogWFhYIGZjcjMxICAqLworCisJaWYgKHNpemVvZih0YXJnZXQtPnRocmVhZC5mcHUuZnByW2ldKSA9PSBzaXplb2YoZWxmX2ZwcmVnX3QpKQorCQlyZXR1cm4gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICZ0YXJnZXQtPnRocmVhZC5mcHUsCisJCQkJCSAgMCwgc2l6ZW9mKGVsZl9mcHJlZ3NldF90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpKyspIHsKKwkJZXJyID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgJmZwcl92YWwsIGkgKiBzaXplb2YoZWxmX2ZwcmVnX3QpLAorCQkJCQkgKGkgKyAxKSAqIHNpemVvZihlbGZfZnByZWdfdCkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJc2V0X2ZwcjY0KCZ0YXJnZXQtPnRocmVhZC5mcHUuZnByW2ldLCAwLCBmcHJfdmFsKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogZW51bSBtaXBzX3JlZ3NldCB7CkBAIC00MDgsNyArNDIzLDcgQEAKIAkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwotCQlmcHVyZWdfdCAqZnJlZ3M7CisJCXVuaW9uIGZwdXJlZyAqZnJlZ3M7CiAJCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKIAogCQlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKQEAgLTQzMywxNCArNDQ4LDEyIEBACiAJCQkJICogb3JkZXIgYml0cyBvZiB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZXZlbgogCQkJCSAqIHJlZ2lzdGVycyAtIHVubGVzcyB3ZSdyZSB1c2luZyByMmtfc3dpdGNoLlMuCiAJCQkJICovCi0JCQkJaWYgKGFkZHIgJiAxKQotCQkJCQl0bXAgPSBmcmVnc1soYWRkciAmIH4xKSAtIDMyXSA+PiAzMjsKLQkJCQllbHNlCi0JCQkJCXRtcCA9IGZyZWdzW2FkZHIgLSAzMl07CisJCQkJdG1wID0gZ2V0X2ZwcjMyKCZmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSwKKwkJCQkJCWFkZHIgJiAxKTsKIAkJCQlicmVhazsKIAkJCX0KICNlbmRpZgotCQkJdG1wID0gZnJlZ3NbYWRkciAtIEZQUl9CQVNFXTsKKwkJCXRtcCA9IGdldF9mcHIzMigmZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSwgMCk7CiAJCQlicmVhazsKIAkJY2FzZSBQQzoKIAkJCXRtcCA9IHJlZ3MtPmNwMF9lcGM7CkBAIC00NjUsNDQgKzQ3OCwxMCBAQAogCQljYXNlIEZQQ19DU1I6CiAJCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmZwdS5mY3IzMTsKIAkJCWJyZWFrOwotCQljYXNlIEZQQ19FSVI6IHsgLyogaW1wbGVtZW50YXRpb24gLyB2ZXJzaW9uIHJlZ2lzdGVyICovCi0JCQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQkJCXVuc2lnbmVkIGludCBtdGZsYWdzOwotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQotCQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCQlpZiAoIWNwdV9oYXNfZnB1KSB7Ci0JCQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJCQlicmVhazsKLQkJCX0KLQotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJCS8qIFJlYWQtbW9kaWZ5LXdyaXRlIG9mIFN0YXR1cyBtdXN0IGJlIGF0b21pYyAqLwotCQkJbG9jYWxfaXJxX3NhdmUoaXJxZmxhZ3MpOwotCQkJbXRmbGFncyA9IGRtdCgpOwotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQkJCWlmIChjcHVfaGFzX21pcHNtdCkgewotCQkJCXVuc2lnbmVkIGludCB2cGZsYWdzID0gZHZwZSgpOwotCQkJCWZsYWdzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQkJCQlfX2VuYWJsZV9mcHUoRlBVX0FTX0lTKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiOiAiPXIiICh0bXApKTsKLQkJCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwotCQkJCWV2cGUodnBmbGFncyk7Ci0JCQl9IGVsc2UgewotCQkJCWZsYWdzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQkJCQlfX2VuYWJsZV9mcHUoRlBVX0FTX0lTKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiOiAiPXIiICh0bXApKTsKLQkJCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwotCQkJfQotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJCWVtdChtdGZsYWdzKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGlycWZsYWdzKTsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JCQlwcmVlbXB0X2VuYWJsZSgpOworCQljYXNlIEZQQ19FSVI6CisJCQkvKiBpbXBsZW1lbnRhdGlvbiAvIHZlcnNpb24gcmVnaXN0ZXIgKi8KKwkJCXRtcCA9IGN1cnJlbnRfY3B1X2RhdGEuZnB1X2lkOwogCQkJYnJlYWs7Ci0JCX0KIAkJY2FzZSBEU1BfQkFTRSAuLi4gRFNQX0JBU0UgKyA1OiB7CiAJCQlkc3ByZWdfdCAqZHJlZ3M7CiAKQEAgLTU0OCw3ICs1MjcsNyBAQAogCQkJcmVncy0+cmVnc1thZGRyXSA9IGRhdGE7CiAJCQlicmVhazsKIAkJY2FzZSBGUFJfQkFTRSAuLi4gRlBSX0JBU0UgKyAzMTogewotCQkJZnB1cmVnX3QgKmZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKKwkJCXVuaW9uIGZwdXJlZyAqZnJlZ3MgPSBnZXRfZnB1X3JlZ3MoY2hpbGQpOwogCiAJCQlpZiAoIXRza191c2VkX21hdGgoY2hpbGQpKSB7CiAJCQkJLyogRlAgbm90IHlldCB1c2VkICAqLwpAQCAtNTYzLDE5ICs1NDIsMTIgQEAKIAkJCQkgKiBvcmRlciBiaXRzIG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBldmVuCiAJCQkJICogcmVnaXN0ZXJzIC0gdW5sZXNzIHdlJ3JlIHVzaW5nIHIya19zd2l0Y2guUy4KIAkJCQkgKi8KLQkJCQlpZiAoYWRkciAmIDEpIHsKLQkJCQkJZnJlZ3NbKGFkZHIgJiB+MSkgLSBGUFJfQkFTRV0gJj0KLQkJCQkJCTB4ZmZmZmZmZmY7Ci0JCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdIHw9Ci0JCQkJCQkoKHU2NClkYXRhKSA8PCAzMjsKLQkJCQl9IGVsc2UgewotCQkJCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdICY9IH4weGZmZmZmZmZmTEw7Ci0JCQkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gfD0gZGF0YTsKLQkJCQl9CisJCQkJc2V0X2ZwcjMyKCZmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSwKKwkJCQkJICBhZGRyICYgMSwgZGF0YSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAjZW5kaWYKLQkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gPSBkYXRhOworCQkJc2V0X2ZwcjY0KCZmcmVnc1thZGRyIC0gRlBSX0JBU0VdLCAwLCBkYXRhKTsKIAkJCWJyZWFrOwogCQl9CiAJCWNhc2UgUEM6CkBAIC02NjIsMTMgKzYzNCwxMyBAQAogICogTm90aWZpY2F0aW9uIG9mIHN5c3RlbSBjYWxsIGVudHJ5L2V4aXQKICAqIC0gdHJpZ2dlcmVkIGJ5IGN1cnJlbnQtPndvcmsuc3lzY2FsbF90cmFjZQogICovCi1hc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2FzbWxpbmthZ2UgbG9uZyBzeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIHN5c2NhbGwpCiB7CiAJbG9uZyByZXQgPSAwOwogCXVzZXJfZXhpdCgpOwogCi0JLyogZG8gdGhlIHNlY3VyZSBjb21wdXRpbmcgY2hlY2sgZmlyc3QgKi8KLQlzZWN1cmVfY29tcHV0aW5nX3N0cmljdChyZWdzLT5yZWdzWzJdKTsKKwlpZiAoc2VjdXJlX2NvbXB1dGluZyhzeXNjYWxsKSA9PSAtMSkKKwkJcmV0dXJuIC0xOwogCiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpICYmCiAJICAgIHRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeShyZWdzKSkKQEAgLTY3NywxMCArNjQ5LDExIEBACiAJaWYgKHVubGlrZWx5KHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0VQT0lOVCkpKQogCQl0cmFjZV9zeXNfZW50ZXIocmVncywgcmVncy0+cmVnc1syXSk7CiAKLQlhdWRpdF9zeXNjYWxsX2VudHJ5KF9fc3lzY2FsbF9nZXRfYXJjaCgpLAotCQkJICAgIHJlZ3MtPnJlZ3NbMl0sCisJYXVkaXRfc3lzY2FsbF9lbnRyeShzeXNjYWxsX2dldF9hcmNoKGN1cnJlbnQsIHJlZ3MpLAorCQkJICAgIHN5c2NhbGwsCiAJCQkgICAgcmVncy0+cmVnc1s0XSwgcmVncy0+cmVnc1s1XSwKIAkJCSAgICByZWdzLT5yZWdzWzZdLCByZWdzLT5yZWdzWzddKTsKKwlyZXR1cm4gc3lzY2FsbDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYwppbmRleCBiOGFhMmRkLi5iNDBjM2NhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jCkBAIC04MCw3ICs4MCw3IEBACiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewogCQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKLQkJZnB1cmVnX3QgKmZyZWdzOworCQl1bmlvbiBmcHVyZWcgKmZyZWdzOwogCQl1bnNpZ25lZCBpbnQgdG1wOwogCiAJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwpAQCAtMTAzLDEzICsxMDMsMTEgQEAKIAkJCQkgKiBvcmRlciBiaXRzIG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBldmVuCiAJCQkJICogcmVnaXN0ZXJzIC0gdW5sZXNzIHdlJ3JlIHVzaW5nIHIya19zd2l0Y2guUy4KIAkJCQkgKi8KLQkJCQlpZiAoYWRkciAmIDEpCi0JCQkJCXRtcCA9IGZyZWdzWyhhZGRyICYgfjEpIC0gMzJdID4+IDMyOwotCQkJCWVsc2UKLQkJCQkJdG1wID0gZnJlZ3NbYWRkciAtIDMyXTsKKwkJCQl0bXAgPSBnZXRfZnByMzIoJmZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdLAorCQkJCQkJYWRkciAmIDEpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJdG1wID0gZnJlZ3NbYWRkciAtIEZQUl9CQVNFXTsKKwkJCXRtcCA9IGdldF9mcHIzMigmZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSwgMCk7CiAJCQlicmVhazsKIAkJY2FzZSBQQzoKIAkJCXRtcCA9IHJlZ3MtPmNwMF9lcGM7CkBAIC0xMjksNDYgKzEyNywxMCBAQAogCQljYXNlIEZQQ19DU1I6CiAJCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmZwdS5mY3IzMTsKIAkJCWJyZWFrOwotCQljYXNlIEZQQ19FSVI6IHsgLyogaW1wbGVtZW50YXRpb24gLyB2ZXJzaW9uIHJlZ2lzdGVyICovCi0JCQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQkJdW5zaWduZWQgaW50IGlycWZsYWdzOwotCQkJdW5zaWduZWQgaW50IG10ZmxhZ3M7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCi0JCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJCWlmICghY3B1X2hhc19mcHUpIHsKLQkJCQlwcmVlbXB0X2VuYWJsZSgpOwotCQkJCXRtcCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JCQkvKiBSZWFkLW1vZGlmeS13cml0ZSBvZiBTdGF0dXMgbXVzdCBiZSBhdG9taWMgKi8KLQkJCWxvY2FsX2lycV9zYXZlKGlycWZsYWdzKTsKLQkJCW10ZmxhZ3MgPSBkbXQoKTsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0KLQkJCWlmIChjcHVfaGFzX21pcHNtdCkgewotCQkJCXVuc2lnbmVkIGludCB2cGZsYWdzID0gZHZwZSgpOwotCQkJCWZsYWdzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQkJCQlfX2VuYWJsZV9mcHUoRlBVX0FTX0lTKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiOiAiPXIiICh0bXApKTsKLQkJCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwotCQkJCWV2cGUodnBmbGFncyk7Ci0JCQl9IGVsc2UgewotCQkJCWZsYWdzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQkJCQlfX2VuYWJsZV9mcHUoRlBVX0FTX0lTKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2ZjMVx0JTAsJDAiOiAiPXIiICh0bXApKTsKLQkJCQl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwotCQkJfQotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJCWVtdChtdGZsYWdzKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGlycWZsYWdzKTsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JCQlwcmVlbXB0X2VuYWJsZSgpOworCQljYXNlIEZQQ19FSVI6CisJCQkvKiBpbXBsZW1lbnRhdGlvbiAvIHZlcnNpb24gcmVnaXN0ZXIgKi8KKwkJCXRtcCA9IGN1cnJlbnRfY3B1X2RhdGEuZnB1X2lkOwogCQkJYnJlYWs7Ci0JCX0KIAkJY2FzZSBEU1BfQkFTRSAuLi4gRFNQX0JBU0UgKyA1OiB7CiAJCQlkc3ByZWdfdCAqZHJlZ3M7CiAKQEAgLTIzMyw3ICsxOTUsNyBAQAogCQkJcmVncy0+cmVnc1thZGRyXSA9IGRhdGE7CiAJCQlicmVhazsKIAkJY2FzZSBGUFJfQkFTRSAuLi4gRlBSX0JBU0UgKyAzMTogewotCQkJZnB1cmVnX3QgKmZyZWdzID0gZ2V0X2ZwdV9yZWdzKGNoaWxkKTsKKwkJCXVuaW9uIGZwdXJlZyAqZnJlZ3MgPSBnZXRfZnB1X3JlZ3MoY2hpbGQpOwogCiAJCQlpZiAoIXRza191c2VkX21hdGgoY2hpbGQpKSB7CiAJCQkJLyogRlAgbm90IHlldCB1c2VkICAqLwpAQCAtMjQ3LDE4ICsyMDksMTEgQEAKIAkJCQkgKiBvcmRlciBiaXRzIG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBldmVuCiAJCQkJICogcmVnaXN0ZXJzIC0gdW5sZXNzIHdlJ3JlIHVzaW5nIHIya19zd2l0Y2guUy4KIAkJCQkgKi8KLQkJCQlpZiAoYWRkciAmIDEpIHsKLQkJCQkJZnJlZ3NbKGFkZHIgJiB+MSkgLSBGUFJfQkFTRV0gJj0KLQkJCQkJCTB4ZmZmZmZmZmY7Ci0JCQkJCWZyZWdzWyhhZGRyICYgfjEpIC0gRlBSX0JBU0VdIHw9Ci0JCQkJCQkoKHU2NClkYXRhKSA8PCAzMjsKLQkJCQl9IGVsc2UgewotCQkJCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdICY9IH4weGZmZmZmZmZmTEw7Ci0JCQkJCWZyZWdzW2FkZHIgLSBGUFJfQkFTRV0gfD0gZGF0YTsKLQkJCQl9CisJCQkJc2V0X2ZwcjMyKCZmcmVnc1soYWRkciAmIH4xKSAtIEZQUl9CQVNFXSwKKwkJCQkJICBhZGRyICYgMSwgZGF0YSk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlmcmVnc1thZGRyIC0gRlBSX0JBU0VdID0gZGF0YTsKKwkJCXNldF9mcHI2NCgmZnJlZ3NbYWRkciAtIEZQUl9CQVNFXSwgMCwgZGF0YSk7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIFBDOgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfZnB1LlMgYi9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUwppbmRleCAyNTNiMmZiLi43MTgxNDI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUworKysgYi9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUwpAQCAtMTMsNiArMTMsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwogI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZnByZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KQEAgLTMwLDE0ICszMSwxNCBAQAogCS5lbmRtCiAKIAkuc2V0CW5vcmVvcmRlcgotCS5zZXQJbWlwczMKKwkuc2V0CWFyY2g9cjQwMDAKIAogTEVBRihfc2F2ZV9mcF9jb250ZXh0KQogCWNmYzEJdDEsIGZjcjMxCiAKLSNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfTUlQUzMyX1IyKQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyX1IyKQogCS5zZXQJcHVzaAotI2lmZGVmIENPTkZJR19NSVBTMzJfUjIKKyNpZmRlZiBDT05GSUdfQ1BVX01JUFMzMl9SMgogCS5zZXQJbWlwczY0cjIKIAltZmMwCXQwLCBDUDBfU1RBVFVTCiAJc2xsCXQwLCB0MCwgNQpAQCAtMTQ2LDExICsxNDcsMTEgQEAKICAqICAtIGNwMSBzdGF0dXMvY29udHJvbCByZWdpc3RlcgogICovCiBMRUFGKF9yZXN0b3JlX2ZwX2NvbnRleHQpCi0JRVgJbHcgdDAsIFNDX0ZQQ19DU1IoYTApCisJRVgJbHcgdDEsIFNDX0ZQQ19DU1IoYTApCiAKLSNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChDT05GSUdfTUlQUzMyX1IyKQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyX1IyKQogCS5zZXQJcHVzaAotI2lmZGVmIENPTkZJR19NSVBTMzJfUjIKKyNpZmRlZiBDT05GSUdfQ1BVX01JUFMzMl9SMgogCS5zZXQJbWlwczY0cjIKIAltZmMwCXQwLCBDUDBfU1RBVFVTCiAJc2xsCXQwLCB0MCwgNQpAQCAtMTkxLDcgKzE5Miw3IEBACiAJRVgJbGRjMSAkZjI2LCBTQ19GUFJFR1MrMjA4KGEwKQogCUVYCWxkYzEgJGYyOCwgU0NfRlBSRUdTKzIyNChhMCkKIAlFWAlsZGMxICRmMzAsIFNDX0ZQUkVHUysyNDAoYTApCi0JY3RjMQl0MCwgZmNyMzEKKwljdGMxCXQxLCBmY3IzMQogCWpyCXJhCiAJIGxpCXYwLCAwCQkJCQkjIHN1Y2Nlc3MKIAlFTkQoX3Jlc3RvcmVfZnBfY29udGV4dCkKQEAgLTE5OSw3ICsyMDAsNyBAQAogI2lmZGVmIENPTkZJR19NSVBTMzJfQ09NUEFUCiBMRUFGKF9yZXN0b3JlX2ZwX2NvbnRleHQzMikKIAkvKiBSZXN0b3JlIGFuIG8zMiBzaWdjb250ZXh0LiAgKi8KLQlFWAlsdyB0MCwgU0MzMl9GUENfQ1NSKGEwKQorCUVYCWx3IHQxLCBTQzMyX0ZQQ19DU1IoYTApCiAKIAltZmMwCXQwLCBDUDBfU1RBVFVTCiAJc2xsCXQwLCB0MCwgNQpAQCAtMjM5LDEyICsyNDAsMjI0IEBACiAJRVgJbGRjMSAkZjI2LCBTQzMyX0ZQUkVHUysyMDgoYTApCiAJRVgJbGRjMSAkZjI4LCBTQzMyX0ZQUkVHUysyMjQoYTApCiAJRVgJbGRjMSAkZjMwLCBTQzMyX0ZQUkVHUysyNDAoYTApCi0JY3RjMQl0MCwgZmNyMzEKKwljdGMxCXQxLCBmY3IzMQogCWpyCXJhCiAJIGxpCXYwLCAwCQkJCQkjIHN1Y2Nlc3MKIAlFTkQoX3Jlc3RvcmVfZnBfY29udGV4dDMyKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19NU0EKKworCS5tYWNybwlzYXZlX3NjX21zYXJlZwl3ciwgb2ZmLCBzYywgdG1wCisjaWZkZWYgQ09ORklHXzY0QklUCisJY29weV91X2QgXHRtcCwgXHdyLCAxCisJRVggc2QJXHRtcCwgKFxvZmYrKFx3cio4KSkoXHNjKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCisJY29weV91X3cgXHRtcCwgXHdyLCAyCisJRVggc3cJXHRtcCwgKFxvZmYrKFx3cio4KSswKShcc2MpCisJY29weV91X3cgXHRtcCwgXHdyLCAzCisJRVggc3cJXHRtcCwgKFxvZmYrKFx3cio4KSs0KShcc2MpCisjZWxzZSAvKiBDT05GSUdfQ1BVX0JJR19FTkRJQU4gKi8KKwljb3B5X3VfdyBcdG1wLCBcd3IsIDIKKwlFWCBzdwlcdG1wLCAoXG9mZisoXHdyKjgpKzQpKFxzYykKKwljb3B5X3VfdyBcdG1wLCBcd3IsIDMKKwlFWCBzdwlcdG1wLCAoXG9mZisoXHdyKjgpKzApKFxzYykKKyNlbmRpZgorCS5lbmRtCisKKy8qCisgKiBpbnQgX3NhdmVfbXNhX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgKnNjKQorICoKKyAqIFNhdmUgdGhlIHVwcGVyIDY0IGJpdHMgb2YgZWFjaCB2ZWN0b3IgcmVnaXN0ZXIgYWxvbmcgd2l0aCB0aGUgTVNBX0NTUgorICogcmVnaXN0ZXIgaW50byBzYy4gUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2Ugbm9uLXplcm8uCisgKi8KK0xFQUYoX3NhdmVfbXNhX2NvbnRleHQpCisJc2F2ZV9zY19tc2FyZWcJMCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMSwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMiwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMywgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJNCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJNSwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJNiwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJNywgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJOCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJOSwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMTAsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTExLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxMiwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMTMsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE0LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxNSwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMTYsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE3LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkxOCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMTksIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIwLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyMSwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMjIsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIzLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyNCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMjUsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI2LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkyNywgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMjgsIFNDX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI5LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkzMCwgU0NfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMzEsIFNDX01TQVJFR1MsIGEwLCB0MAorCWpyCXJhCisJIGxpCXYwLCAwCisJRU5EKF9zYXZlX21zYV9jb250ZXh0KQorCisjaWZkZWYgQ09ORklHX01JUFMzMl9DT01QQVQKKworLyoKKyAqIGludCBfc2F2ZV9tc2FfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgKnNjKQorICoKKyAqIFNhdmUgdGhlIHVwcGVyIDY0IGJpdHMgb2YgZWFjaCB2ZWN0b3IgcmVnaXN0ZXIgYWxvbmcgd2l0aCB0aGUgTVNBX0NTUgorICogcmVnaXN0ZXIgaW50byBzYy4gUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2Ugbm9uLXplcm8uCisgKi8KK0xFQUYoX3NhdmVfbXNhX2NvbnRleHQzMikKKwlzYXZlX3NjX21zYXJlZwkwLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTEsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJMiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwkzLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTQsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJNSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwk2LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTcsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJc2F2ZV9zY19tc2FyZWcJOCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlzYXZlX3NjX21zYXJlZwk5LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTEwLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTExLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTEyLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTEzLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE0LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE1LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE2LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE3LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE4LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTE5LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIwLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIxLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIyLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTIzLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI0LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI1LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI2LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI3LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI4LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTI5LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTMwLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXNhdmVfc2NfbXNhcmVnCTMxLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCWpyCXJhCisJIGxpCXYwLCAwCisJRU5EKF9zYXZlX21zYV9jb250ZXh0MzIpCisKKyNlbmRpZiAvKiBDT05GSUdfTUlQUzMyX0NPTVBBVCAqLworCisJLm1hY3JvIHJlc3RvcmVfc2NfbXNhcmVnCXdyLCBvZmYsIHNjLCB0bXAKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwlFWCBsZAlcdG1wLCAoXG9mZisoXHdyKjgpKShcc2MpCisJaW5zZXJ0X2QgXHdyLCAxLCBcdG1wCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfTElUVExFX0VORElBTikKKwlFWCBsdwlcdG1wLCAoXG9mZisoXHdyKjgpKzApKFxzYykKKwlpbnNlcnRfdyBcd3IsIDIsIFx0bXAKKwlFWCBsdwlcdG1wLCAoXG9mZisoXHdyKjgpKzQpKFxzYykKKwlpbnNlcnRfdyBcd3IsIDMsIFx0bXAKKyNlbHNlIC8qIENPTkZJR19DUFVfQklHX0VORElBTiAqLworCUVYIGx3CVx0bXAsIChcb2ZmKyhcd3IqOCkrNCkoXHNjKQorCWluc2VydF93IFx3ciwgMiwgXHRtcAorCUVYIGx3CVx0bXAsIChcb2ZmKyhcd3IqOCkrMCkoXHNjKQorCWluc2VydF93IFx3ciwgMywgXHRtcAorI2VuZGlmCisJLmVuZG0KKworLyoKKyAqIGludCBfcmVzdG9yZV9tc2FfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpCisgKi8KK0xFQUYoX3Jlc3RvcmVfbXNhX2NvbnRleHQpCisJcmVzdG9yZV9zY19tc2FyZWcJMCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMSwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMiwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMywgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJNCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJNSwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJNiwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJNywgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJOCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJOSwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTAsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTExLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxMiwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTMsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTE0LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxNSwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTYsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTE3LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxOCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMTksIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTIwLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyMSwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjIsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTIzLCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyNCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjUsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTI2LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyNywgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMjgsIFNDX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTI5LCBTQ19NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkzMCwgU0NfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMzEsIFNDX01TQVJFR1MsIGEwLCB0MAorCWpyCXJhCisJIGxpCXYwLCAwCisJRU5EKF9yZXN0b3JlX21zYV9jb250ZXh0KQorCisjaWZkZWYgQ09ORklHX01JUFMzMl9DT01QQVQKKworLyoKKyAqIGludCBfcmVzdG9yZV9tc2FfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgKnNjKQorICovCitMRUFGKF9yZXN0b3JlX21zYV9jb250ZXh0MzIpCisJcmVzdG9yZV9zY19tc2FyZWcJMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxLCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTIsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJMywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwk0LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTUsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJNiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwk3LCBTQzMyX01TQVJFR1MsIGEwLCB0MAorCXJlc3RvcmVfc2NfbXNhcmVnCTgsIFNDMzJfTVNBUkVHUywgYTAsIHQwCisJcmVzdG9yZV9zY19tc2FyZWcJOSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxMSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxMiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxMywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxNCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxNSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxNiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxNywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxOCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkxOSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyMSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyMiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyMywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyNCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyNSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyNiwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyNywgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyOCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkyOSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkzMCwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlyZXN0b3JlX3NjX21zYXJlZwkzMSwgU0MzMl9NU0FSRUdTLCBhMCwgdDAKKwlqcglyYQorCSBsaQl2MCwgMAorCUVORChfcmVzdG9yZV9tc2FfY29udGV4dDMyKQorCisjZW5kaWYgLyogQ09ORklHX01JUFMzMl9DT01QQVQgKi8KKworI2VuZGlmIC8qIENPTkZJR19DUFVfSEFTX01TQSAqLworCiAJLnNldAlyZW9yZGVyCiAKIAkudHlwZQlmYXVsdEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwppbmRleCBjYzc4ZGQ5Li5hYmFjYWM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUworKysgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwpAQCAtMjksMTggKzI5LDggQEAKICNkZWZpbmUgU1RfT0ZGIChfVEhSRUFEX1NJWkUgLSAzMiAtIFBUX1NJWkUgKyBQVF9TVEFUVVMpCiAKIC8qCi0gKiBGUFUgY29udGV4dCBpcyBzYXZlZCBpZmYgdGhlIHByb2Nlc3MgaGFzIHVzZWQgaXQncyBGUFUgaW4gdGhlIGN1cnJlbnQKLSAqIHRpbWUgc2xpY2UgYXMgaW5kaWNhdGVkIGJ5IF9USUZfVVNFREZQVS4gIEluIGFueSBjYXNlLCB0aGUgQ1UxIGJpdCBmb3IgdXNlcgotICogc3BhY2UgU1RBVFVTIHJlZ2lzdGVyIHNob3VsZCBiZSAwLCBzbyB0aGF0IGEgcHJvY2VzcyAqYWx3YXlzKiBzdGFydHMgaXRzCi0gKiB1c2VybGFuZCB3aXRoIEZQVSBkaXNhYmxlZCBhZnRlciBlYWNoIGNvbnRleHQgc3dpdGNoLgotICoKLSAqIEZQVSB3aWxsIGJlIGVuYWJsZWQgYXMgc29vbiBhcyB0aGUgcHJvY2VzcyBhY2Nlc3NlcyBGUFUgYWdhaW4sIHRocm91Z2gKLSAqIGRvX2NwdSgpIHRyYXAuCi0gKi8KLQotLyoKICAqIHRhc2tfc3RydWN0ICpyZXN1bWUodGFza19zdHJ1Y3QgKnByZXYsIHRhc2tfc3RydWN0ICpuZXh0LAotICoJCSAgICAgICBzdHJ1Y3QgdGhyZWFkX2luZm8gKm5leHRfdGksIGludCB1c2VkZnB1KQorICoJCSAgICAgICBzdHJ1Y3QgdGhyZWFkX2luZm8gKm5leHRfdGksIHMzMiBmcF9zYXZlKQogICovCiAJLmFsaWduCTUKIAlMRUFGKHJlc3VtZSkKQEAgLTUwLDIzICs0MCwzNyBAQAogCUxPTkdfUwlyYSwgVEhSRUFEX1JFRzMxKGEwKQogCiAJLyoKLQkgKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHNhdmUgRlBVIHJlZ2lzdGVycworCSAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBzYXZlIGFueSBGUCBjb250ZXh0LiBGUCBjb250ZXh0IGlzIHNhdmVkCisJICogaWZmIHRoZSBwcm9jZXNzIGhhcyB1c2VkIHRoZSBjb250ZXh0IHdpdGggdGhlIHNjYWxhciBGUFUgb3IgdGhlIE1TQQorCSAqIEFTRSBpbiB0aGUgY3VycmVudCB0aW1lIHNsaWNlLCBhcyBpbmRpY2F0ZWQgYnkgX1RJRl9VU0VERlBVIGFuZAorCSAqIF9USUZfVVNFRE1TQSByZXNwZWN0aXZlbHkuIHN3aXRjaF90byB3aWxsIGhhdmUgc2V0IGZwX3NhdmUKKwkgKiBhY2NvcmRpbmdseSB0byBhbiBGUF9TQVZFXyBlbnVtIHZhbHVlLgogCSAqLworCWJlcXoJYTMsIDJmCiAKLQliZXF6CWEzLCAxZgotCi0JUFRSX0wJdDMsIFRBU0tfVEhSRUFEX0lORk8oYTApCiAJLyoKLQkgKiBjbGVhciBzYXZlZCB1c2VyIHN0YWNrIENVMSBiaXQKKwkgKiBXZSBkby4gQ2xlYXIgdGhlIHNhdmVkIENVMSBiaXQgZm9yIHByZXYsIHN1Y2ggdGhhdCBuZXh0IHRpbWUgaXQgaXMKKwkgKiBzY2hlZHVsZWQgaXQgd2lsbCBzdGFydCBpbiB1c2VybGFuZCB3aXRoIHRoZSBGUFUgZGlzYWJsZWQuIElmIHRoZQorCSAqIHRhc2sgdXNlcyB0aGUgRlBVIHRoZW4gaXQgd2lsbCBiZSBlbmFibGVkIGFnYWluIHZpYSB0aGUgZG9fY3B1IHRyYXAuCisJICogVGhpcyBhbGxvd3MgdXMgdG8gbGF6aWx5IHJlc3RvcmUgdGhlIEZQIGNvbnRleHQuCiAJICovCisJUFRSX0wJdDMsIFRBU0tfVEhSRUFEX0lORk8oYTApCiAJTE9OR19MCXQwLCBTVF9PRkYodDMpCiAJbGkJdDEsIH5TVDBfQ1UxCiAJYW5kCXQwLCB0MCwgdDEKIAlMT05HX1MJdDAsIFNUX09GRih0MykKIAorCS8qIENoZWNrIHdoZXRoZXIgd2UncmUgc2F2aW5nIHNjYWxhciBvciB2ZWN0b3IgY29udGV4dC4gKi8KKwliZ3R6CWEzLCAxZgorCisJLyogU2F2ZSAxMjhiIE1TQSB2ZWN0b3IgY29udGV4dC4gKi8KKwltc2Ffc2F2ZV9hbGwJYTAKKwliCTJmCisKKzE6CS8qIFNhdmUgMzJiLzY0YiBzY2FsYXIgRlAgY29udGV4dC4gKi8KIAlmcHVfc2F2ZV9kb3VibGUgYTAgdDAgdDEJCSMgYzBfc3RhdHVzIHBhc3NlZCBpbiB0MAogCQkJCQkJIyBjbG9iYmVycyB0MQotMToKKzI6CiAKICNpZiBkZWZpbmVkKENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUikgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKIAlQVFJfTEEJdDgsIF9fc3RhY2tfY2hrX2d1YXJkCkBAIC0xNDEsNiArMTQ1LDI2IEBACiAJanIJcmEKIAlFTkQoX3Jlc3RvcmVfZnApCiAKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19NU0EKKworLyoKKyAqIFNhdmUgYSB0aHJlYWQncyBNU0EgdmVjdG9yIGNvbnRleHQuCisgKi8KK0xFQUYoX3NhdmVfbXNhKQorCW1zYV9zYXZlX2FsbAlhMAorCWpyCXJhCisJRU5EKF9zYXZlX21zYSkKKworLyoKKyAqIFJlc3RvcmUgYSB0aHJlYWQncyBNU0EgdmVjdG9yIGNvbnRleHQuCisgKi8KK0xFQUYoX3Jlc3RvcmVfbXNhKQorCW1zYV9yZXN0b3JlX2FsbAlhMAorCWpyCXJhCisJRU5EKF9yZXN0b3JlX21zYSkKKworI2VuZGlmCisKIC8qCiAgKiBMb2FkIHRoZSBGUFUgd2l0aCBzaWduYWxsaW5nIE5BTlMuICBUaGlzIGJpdCBwYXR0ZXJuIHdlJ3JlIHVzaW5nIGhhcwogICogdGhlIHByb3BlcnR5IHRoYXQgbm8gbWF0dGVyIHdoZXRoZXIgY29uc2lkZXJlZCBhcyBzaW5nbGUgb3IgYXMgZG91YmxlCkBAIC0yNzAsNyArMjk0LDcgQEAKIDE6CS5zZXQgICAgcG9wCiAjZW5kaWYgLyogQ09ORklHX0NQVV9NSVBTMzJfUjIgKi8KICNlbHNlCi0JLnNldAltaXBzMworCS5zZXQJYXJjaD1yNDAwMAogCWRtdGMxCXQxLCAkZjAKIAlkbXRjMQl0MSwgJGYyCiAJZG10YzEJdDEsICRmNApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LWNtcC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LWNtcC5jCmluZGV4IDU2ZGM2OTYuLjc1OGZiM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC1jbXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3J0bHgtY21wLmMKQEAgLTExMiw1ICsxMTIsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IFJUTFhfQ0hBTk5FTFM7IGkrKykKIAkJZGV2aWNlX2Rlc3Ryb3kobXRfY2xhc3MsIE1LREVWKG1ham9yLCBpKSk7CisKIAl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgUlRMWF9NT0RVTEVfTkFNRSk7CisKKwlhcHJwX2hvb2sgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LW10LmMgYi9hcmNoL21pcHMva2VybmVsL3J0bHgtbXQuYwppbmRleCA5MWQ2MWJhLi45YzFhY2EwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3J0bHgtbXQuYworKysgYi9hcmNoL21pcHMva2VybmVsL3J0bHgtbXQuYwpAQCAtMTQ0LDUgKzE0NCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgUlRMWF9DSEFOTkVMUzsgaSsrKQogCQlkZXZpY2VfZGVzdHJveShtdF9jbGFzcywgTUtERVYobWFqb3IsIGkpKTsKKwogCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCBSVExYX01PRFVMRV9OQU1FKTsKKworCWFwcnBfaG9vayA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKaW5kZXggYTViMTRmNC4uZmRjNzBiNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NS05OSwgMjAwMC0gMDIsIDA2IFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4KICAqIENvcHlyaWdodCAoQykgMjAwMSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA0IFRoaWVtbyBTZXVmZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vYXNtLmg+CkBAIC03NCwxMCArNzUsMTAgQEAKIAkuc2V0ICAgIG5vcmVvcmRlcgogCS5zZXQJbm9tYWNybwogCi0xOglsdwl0NSwgMTYodDApCQkjIGFyZ3VtZW50ICM1IGZyb20gdXNwCi00Oglsdwl0NiwgMjAodDApCQkjIGFyZ3VtZW50ICM2IGZyb20gdXNwCi0zOglsdwl0NywgMjQodDApCQkjIGFyZ3VtZW50ICM3IGZyb20gdXNwCi0yOglsdwl0OCwgMjgodDApCQkjIGFyZ3VtZW50ICM4IGZyb20gdXNwCisxOgl1c2VyX2x3KHQ1LCAxNih0MCkpCQkjIGFyZ3VtZW50ICM1IGZyb20gdXNwCis0Ogl1c2VyX2x3KHQ2LCAyMCh0MCkpCQkjIGFyZ3VtZW50ICM2IGZyb20gdXNwCiszOgl1c2VyX2x3KHQ3LCAyNCh0MCkpCQkjIGFyZ3VtZW50ICM3IGZyb20gdXNwCisyOgl1c2VyX2x3KHQ4LCAyOCh0MCkpCQkjIGFyZ3VtZW50ICM4IGZyb20gdXNwCiAKIAlzdwl0NSwgMTYoc3ApCQkjIGFyZ3VtZW50ICM1IHRvIGtzcAogCXN3CXQ2LCAyMChzcCkJCSMgYXJndW1lbnQgIzYgdG8ga3NwCkBAIC0xMTgsNyArMTE5LDE4IEBACiAJU0FWRV9TVEFUSUMKIAltb3ZlCXMwLCB0MgogCW1vdmUJYTAsIHNwCi0JamFsCXN5c2NhbGxfdHJhY2VfZW50ZXIKKworCS8qCisJICogc3lzY2FsbCBudW1iZXIgaXMgaW4gdjAgdW5sZXNzIHdlIGNhbGxlZCBzeXNjYWxsKF9fTlJfIyMjKQorCSAqIHdoZXJlIHRoZSByZWFsIHN5c2NhbGwgbnVtYmVyIGlzIGluIGEwCisJICovCisJYWRkaXUJYTEsIHYwLCAgX19OUl9PMzJfTGludXgKKwlibmV6CXYwLCAxZiAvKiBfX05SX3N5c2NhbGwgYXQgb2Zmc2V0IDAgKi8KKwlsdwlhMSwgUFRfUjQoc3ApCisKKzE6CWphbAlzeXNjYWxsX3RyYWNlX2VudGVyCisKKwlibHR6CXYwLCAyZgkJCSMgc2VjY29tcCBmYWlsZWQ/IFNraXAgc3lzY2FsbAogCiAJbW92ZQl0MCwgczAKIAlSRVNUT1JFX1NUQVRJQwpAQCAtMTM4LDcgKzE1MCw3IEBACiAJc3cJdDEsIFBUX1IwKHNwKQkJIyBzYXZlIGl0IGZvciBzeXNjYWxsIHJlc3RhcnRpbmcKIDE6CXN3CXYwLCBQVF9SMihzcCkJCSMgcmVzdWx0CiAKLQlqCXN5c2NhbGxfZXhpdAorMjoJaglzeXNjYWxsX2V4aXQKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKaW5kZXggYjU2ZTI1NC4uZGQ5OWMzMjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TCkBAIC04MCw4ICs4MCwxMSBAQAogCVNBVkVfU1RBVElDCiAJbW92ZQlzMCwgdDIKIAltb3ZlCWEwLCBzcAorCWRhZGRpdQlhMSwgdjAsIF9fTlJfNjRfTGludXgKIAlqYWwJc3lzY2FsbF90cmFjZV9lbnRlcgogCisJYmx0egl2MCwgMmYJCQkjIHNlY2NvbXAgZmFpbGVkPyBTa2lwIHN5c2NhbGwKKwogCW1vdmUJdDAsIHMwCiAJUkVTVE9SRV9TVEFUSUMKIAlsZAlhMCwgUFRfUjQoc3ApCQkjIFJlc3RvcmUgYXJndW1lbnQgcmVnaXN0ZXJzCkBAIC0xMDIsNyArMTA1LDcgQEAKIAlzZAl0MSwgUFRfUjAoc3ApCQkjIHNhdmUgaXQgZm9yIHN5c2NhbGwgcmVzdGFydGluZwogMToJc2QJdjAsIFBUX1IyKHNwKQkJIyByZXN1bHQKIAotCWoJc3lzY2FsbF9leGl0CisyOglqCXN5c2NhbGxfZXhpdAogCiBpbGxlZ2FsX3N5c2NhbGw6CiAJLyogVGhpcyBhbHNvIGlzbid0IGEgNjQtYml0IHN5c2NhbGwsIHRocm93IGFuIGVycm9yLiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUwppbmRleCBmN2U1YjcyLi5mNjhkMmY0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCkBAIC03Miw4ICs3MiwxMSBAQAogCVNBVkVfU1RBVElDCiAJbW92ZQlzMCwgdDIKIAltb3ZlCWEwLCBzcAorCWRhZGRpdQlhMSwgdjAsIF9fTlJfTjMyX0xpbnV4CiAJamFsCXN5c2NhbGxfdHJhY2VfZW50ZXIKIAorCWJsdHoJdjAsIDJmCQkJIyBzZWNjb21wIGZhaWxlZD8gU2tpcCBzeXNjYWxsCisKIAltb3ZlCXQwLCBzMAogCVJFU1RPUkVfU1RBVElDCiAJbGQJYTAsIFBUX1I0KHNwKQkJIyBSZXN0b3JlIGFyZ3VtZW50IHJlZ2lzdGVycwpAQCAtOTQsNyArOTcsNyBAQAogCXNkCXQxLCBQVF9SMChzcCkJCSMgc2F2ZSBpdCBmb3Igc3lzY2FsbCByZXN0YXJ0aW5nCiAxOglzZAl2MCwgUFRfUjIoc3ApCQkjIHJlc3VsdAogCi0JaglzeXNjYWxsX2V4aXQKKzI6CWoJc3lzY2FsbF9leGl0CiAKIG5vdF9uMzJfc2NhbGw6CiAJLyogVGhpcyBpcyBub3QgYW4gbjMyIGNvbXBhdGliaWxpdHkgc3lzY2FsbCwgcGFzcyBpdCBvbiB0bwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCmluZGV4IDY3ODg3MjdkLi43MGY2YWNlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCkBAIC0xMTIsNyArMTEyLDIwIEBACiAKIAltb3ZlCXMwLCB0MgkJCSMgU2F2ZSBzeXNjYWxsIHBvaW50ZXIKIAltb3ZlCWEwLCBzcAotCWphbAlzeXNjYWxsX3RyYWNlX2VudGVyCisJLyoKKwkgKiBzeXNjYWxsIG51bWJlciBpcyBpbiB2MCB1bmxlc3Mgd2UgY2FsbGVkIHN5c2NhbGwoX19OUl8jIyMpCisJICogd2hlcmUgdGhlIHJlYWwgc3lzY2FsbCBudW1iZXIgaXMgaW4gYTAKKwkgKiBub3RlOiBOUl9zeXNjYWxsIGlzIHRoZSBmaXJzdCBPMzIgc3lzY2FsbCBidXQgdGhlIG1hY3JvIGlzCisJICogb25seSBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGggLW1hYmk9MzIgKENPTkZJR18zMkJJVCkKKwkgKiB0aGVyZWZvcmUgX19OUl9PMzJfTGludXggaXMgdXNlZCAoNDAwMCkKKwkgKi8KKwlhZGRpdQlhMSwgdjAsICBfX05SX08zMl9MaW51eAorCWJuZXoJdjAsIDFmIC8qIF9fTlJfc3lzY2FsbCBhdCBvZmZzZXQgMCAqLworCWx3CWExLCBQVF9SNChzcCkKKworMToJamFsCXN5c2NhbGxfdHJhY2VfZW50ZXIKKworCWJsdHoJdjAsIDJmCQkJIyBzZWNjb21wIGZhaWxlZD8gU2tpcCBzeXNjYWxsCiAKIAltb3ZlCXQwLCBzMAogCVJFU1RPUkVfU1RBVElDCkBAIC0xMzYsNyArMTQ5LDcgQEAKIAlzZAl0MSwgUFRfUjAoc3ApCQkjIHNhdmUgaXQgZm9yIHN5c2NhbGwgcmVzdGFydGluZwogMToJc2QJdjAsIFBUX1IyKHNwKQkJIyByZXN1bHQKIAotCWoJc3lzY2FsbF9leGl0CisyOglqCXN5c2NhbGxfZXhpdAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNTE5OTU2My4uMzMxMzNkMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jCkBAIC02LDYgKzYsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwogICogQ29weXJpZ2h0IChDKSAxOTk0IC0gMjAwMCAgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgogICovCiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb250ZXh0X3RyYWNraW5nLmg+CkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZnB1Lmg+CisjaW5jbHVkZSA8YXNtL21zYS5oPgogI2luY2x1ZGUgPGFzbS9zaW0uaD4KICNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CkBAIC00Niw4ICs0OCw4IEBACiBleHRlcm4gYXNtbGlua2FnZSBpbnQgX3NhdmVfZnBfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKTsKIGV4dGVybiBhc21saW5rYWdlIGludCBfcmVzdG9yZV9mcF9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpOwogCi1leHRlcm4gYXNtbGlua2FnZSBpbnQgZnB1X2VtdWxhdG9yX3NhdmVfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKTsKLWV4dGVybiBhc21saW5rYWdlIGludCBmcHVfZW11bGF0b3JfcmVzdG9yZV9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpOworZXh0ZXJuIGFzbWxpbmthZ2UgaW50IF9zYXZlX21zYV9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpOworZXh0ZXJuIGFzbWxpbmthZ2UgaW50IF9yZXN0b3JlX21zYV9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpOwogCiBzdHJ1Y3Qgc2lnZnJhbWUgewogCXUzMiBzZl9hc3NbNF07CQkvKiBhcmd1bWVudCBzYXZlIHNwYWNlIGZvciBvMzIgKi8KQEAgLTY0LDE3ICs2Niw5NSBAQAogfTsKIAogLyoKKyAqIFRocmVhZCBzYXZlZCBjb250ZXh0IGNvcHkgdG8vZnJvbSBhIHNpZ25hbCBjb250ZXh0IHByZXN1bWVkIHRvIGJlIG9uIHRoZQorICogdXNlciBzdGFjaywgYW5kIHRoZXJlZm9yZSBhY2Nlc3NlZCB3aXRoIGFwcHJvcHJpYXRlIG1hY3JvcyBmcm9tIHVhY2Nlc3MuaC4KKyAqLworc3RhdGljIGludCBjb3B5X2ZwX3RvX3NpZ2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkrKykgeworCQllcnIgfD0KKwkJICAgIF9fcHV0X3VzZXIoZ2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMCksCisJCQkgICAgICAgJnNjLT5zY19mcHJlZ3NbaV0pOworCX0KKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxLCAmc2MtPnNjX2ZwY19jc3IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjb3B5X2ZwX2Zyb21fc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCXU2NCBmcHJfdmFsOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GUFVfUkVHUzsgaSsrKSB7CisJCWVyciB8PSBfX2dldF91c2VyKGZwcl92YWwsICZzYy0+c2NfZnByZWdzW2ldKTsKKwkJc2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMCwgZnByX3ZhbCk7CisJfQorCWVyciB8PSBfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZmNyMzEsICZzYy0+c2NfZnBjX2Nzcik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIHdpbGwgc2F2ZSBvbmx5IHRoZSB1cHBlciA2NCBiaXRzIG9mIHRoZSB2ZWN0b3IgcmVnaXN0ZXJzLAorICogc2luY2UgdGhlIGxvd2VyIDY0IGJpdHMgaGF2ZSBhbHJlYWR5IGJlZW4gc2F2ZWQgYXMgdGhlIHNjYWxhciBGUCBjb250ZXh0LgorICovCitzdGF0aWMgaW50IGNvcHlfbXNhX3RvX3NpZ2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkrKykgeworCQllcnIgfD0KKwkJICAgIF9fcHV0X3VzZXIoZ2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMSksCisJCQkgICAgICAgJnNjLT5zY19tc2FyZWdzW2ldKTsKKwl9CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5tc2Fjc3IsICZzYy0+c2NfbXNhX2Nzcik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNvcHlfbXNhX2Zyb21fc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCXU2NCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpKyspIHsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIodmFsLCAmc2MtPnNjX21zYXJlZ3NbaV0pOworCQlzZXRfZnByNjQoJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAxLCB2YWwpOworCX0KKwllcnIgfD0gX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1Lm1zYWNzciwgJnNjLT5zY19tc2FfY3NyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCiAgKiBIZWxwZXIgcm91dGluZXMKICAqLwotc3RhdGljIGludCBwcm90ZWN0ZWRfc2F2ZV9mcF9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCitzdGF0aWMgaW50IHByb3RlY3RlZF9zYXZlX2ZwX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywKKwkJCQkgICAgIHVuc2lnbmVkIHVzZWRfbWF0aCkKIHsKIAlpbnQgZXJyOworCWJvb2wgc2F2ZV9tc2EgPSBjcHVfaGFzX21zYSAmJiAodXNlZF9tYXRoICYgVVNFRE1BVEhfTVNBKTsKKyNpZm5kZWYgQ09ORklHX0VWQQogCXdoaWxlICgxKSB7CiAJCWxvY2tfZnB1X293bmVyKCk7Ci0JCWVyciA9IG93bl9mcHVfaW5hdG9taWMoMSk7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gc2F2ZV9mcF9jb250ZXh0KHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCi0JCXVubG9ja19mcHVfb3duZXIoKTsKKwkJaWYgKGlzX2ZwdV9vd25lcigpKSB7CisJCQllcnIgPSBzYXZlX2ZwX2NvbnRleHQoc2MpOworCQkJaWYgKHNhdmVfbXNhICYmICFlcnIpCisJCQkJZXJyID0gX3NhdmVfbXNhX2NvbnRleHQoc2MpOworCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQkJZXJyID0gY29weV9mcF90b19zaWdjb250ZXh0KHNjKTsKKwkJCWlmIChzYXZlX21zYSAmJiAhZXJyKQorCQkJCWVyciA9IGNvcHlfbXNhX3RvX3NpZ2NvbnRleHQoc2MpOworCQl9CiAJCWlmIChsaWtlbHkoIWVycikpCiAJCQlicmVhazsKIAkJLyogdG91Y2ggdGhlIHNpZ2NvbnRleHQgYW5kIHRyeSBhZ2FpbiAqLwpAQCAtODQsMTggKzE2NCw0NCBAQAogCQlpZiAoZXJyKQogCQkJYnJlYWs7CS8qIHJlYWxseSBiYWQgc2lnY29udGV4dCAqLwogCX0KKyNlbHNlCisJLyoKKwkgKiBFVkEgZG9lcyBub3QgaGF2ZSBGUFUgRVZBIGluc3RydWN0aW9ucyBzbyBzYXZpbmcgZnB1IGNvbnRleHQgZGlyZWN0bHkKKwkgKiBkb2VzIG5vdCB3b3JrLgorCSAqLworCWRpc2FibGVfbXNhKCk7CisJbG9zZV9mcHUoMSk7CisJZXJyID0gc2F2ZV9mcF9jb250ZXh0KHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCisJaWYgKHNhdmVfbXNhICYmICFlcnIpCisJCWVyciA9IGNvcHlfbXNhX3RvX3NpZ2NvbnRleHQoc2MpOworI2VuZGlmCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBwcm90ZWN0ZWRfcmVzdG9yZV9mcF9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCitzdGF0aWMgaW50IHByb3RlY3RlZF9yZXN0b3JlX2ZwX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywKKwkJCQkJdW5zaWduZWQgdXNlZF9tYXRoKQogewogCWludCBlcnIsIHRtcCBfX21heWJlX3VudXNlZDsKKwlib29sIHJlc3RvcmVfbXNhID0gY3B1X2hhc19tc2EgJiYgKHVzZWRfbWF0aCAmIFVTRURNQVRIX01TQSk7CisjaWZuZGVmIENPTkZJR19FVkEKIAl3aGlsZSAoMSkgewogCQlsb2NrX2ZwdV9vd25lcigpOwotCQllcnIgPSBvd25fZnB1X2luYXRvbWljKDApOwotCQlpZiAoIWVycikKLQkJCWVyciA9IHJlc3RvcmVfZnBfY29udGV4dChzYyk7IC8qIHRoaXMgbWlnaHQgZmFpbCAqLwotCQl1bmxvY2tfZnB1X293bmVyKCk7CisJCWlmIChpc19mcHVfb3duZXIoKSkgeworCQkJZXJyID0gcmVzdG9yZV9mcF9jb250ZXh0KHNjKTsKKwkJCWlmIChyZXN0b3JlX21zYSAmJiAhZXJyKSB7CisJCQkJZW5hYmxlX21zYSgpOworCQkJCWVyciA9IF9yZXN0b3JlX21zYV9jb250ZXh0KHNjKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2lnbmFsIGhhbmRsZXIgbWF5IGhhdmUgdXNlZCBNU0EgKi8KKwkJCQlkaXNhYmxlX21zYSgpOworCQkJfQorCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQkJZXJyID0gY29weV9mcF9mcm9tX3NpZ2NvbnRleHQoc2MpOworCQkJaWYgKCFlcnIgJiYgKHVzZWRfbWF0aCAmIFVTRURNQVRIX01TQSkpCisJCQkJZXJyID0gY29weV9tc2FfZnJvbV9zaWdjb250ZXh0KHNjKTsKKwkJfQogCQlpZiAobGlrZWx5KCFlcnIpKQogCQkJYnJlYWs7CiAJCS8qIHRvdWNoIHRoZSBzaWdjb250ZXh0IGFuZCB0cnkgYWdhaW4gKi8KQEAgLTEwNSw2ICsyMTEsMTcgQEAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwkvKiByZWFsbHkgYmFkIHNpZ2NvbnRleHQgKi8KIAl9CisjZWxzZQorCS8qCisJICogRVZBIGRvZXMgbm90IGhhdmUgRlBVIEVWQSBpbnN0cnVjdGlvbnMgc28gcmVzdG9yaW5nIGZwdSBjb250ZXh0CisJICogZGlyZWN0bHkgZG9lcyBub3Qgd29yay4KKwkgKi8KKwllbmFibGVfbXNhKCk7CisJbG9zZV9mcHUoMCk7CisJZXJyID0gcmVzdG9yZV9mcF9jb250ZXh0KHNjKTsgLyogdGhpcyBtaWdodCBmYWlsICovCisJaWYgKHJlc3RvcmVfbXNhICYmICFlcnIpCisJCWVyciA9IGNvcHlfbXNhX2Zyb21fc2lnY29udGV4dChzYyk7CisjZW5kaWYKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMzUsNyArMjUyLDggQEAKIAkJZXJyIHw9IF9fcHV0X3VzZXIocmRkc3AoRFNQX01BU0spLCAmc2MtPnNjX2RzcCk7CiAJfQogCi0JdXNlZF9tYXRoID0gISF1c2VkX21hdGgoKTsKKwl1c2VkX21hdGggPSB1c2VkX21hdGgoKSA/IFVTRURNQVRIX0ZQIDogMDsKKwl1c2VkX21hdGggfD0gdGhyZWFkX21zYV9jb250ZXh0X2xpdmUoKSA/IFVTRURNQVRIX01TQSA6IDA7CiAJZXJyIHw9IF9fcHV0X3VzZXIodXNlZF9tYXRoLCAmc2MtPnNjX3VzZWRfbWF0aCk7CiAKIAlpZiAodXNlZF9tYXRoKSB7CkBAIC0xNDMsNyArMjYxLDcgQEAKIAkJICogU2F2ZSBGUFUgc3RhdGUgdG8gc2lnbmFsIGNvbnRleHQuIFNpZ25hbCBoYW5kbGVyCiAJCSAqIHdpbGwgImluaGVyaXQiIGN1cnJlbnQgRlBVIHN0YXRlLgogCQkgKi8KLQkJZXJyIHw9IHByb3RlY3RlZF9zYXZlX2ZwX2NvbnRleHQoc2MpOworCQllcnIgfD0gcHJvdGVjdGVkX3NhdmVfZnBfY29udGV4dChzYywgdXNlZF9tYXRoKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE2OCwxNCArMjg2LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNoZWNrX2FuZF9yZXN0b3JlX2ZwX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKK2NoZWNrX2FuZF9yZXN0b3JlX2ZwX2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywgdW5zaWduZWQgdXNlZF9tYXRoKQogewogCWludCBlcnIsIHNpZzsKIAogCWVyciA9IHNpZyA9IGZwY3NyX3BlbmRpbmcoJnNjLT5zY19mcGNfY3NyKTsKIAlpZiAoZXJyID4gMCkKIAkJZXJyID0gMDsKLQllcnIgfD0gcHJvdGVjdGVkX3Jlc3RvcmVfZnBfY29udGV4dChzYyk7CisJZXJyIHw9IHByb3RlY3RlZF9yZXN0b3JlX2ZwX2NvbnRleHQoc2MsIHVzZWRfbWF0aCk7CiAJcmV0dXJuIGVyciA/OiBzaWc7CiB9CiAKQEAgLTIxNSw5ICszMzMsMTAgQEAKIAlpZiAodXNlZF9tYXRoKSB7CiAJCS8qIHJlc3RvcmUgZnB1IGNvbnRleHQgaWYgd2UgaGF2ZSB1c2VkIGl0IGJlZm9yZSAqLwogCQlpZiAoIWVycikKLQkJCWVyciA9IGNoZWNrX2FuZF9yZXN0b3JlX2ZwX2NvbnRleHQoc2MpOworCQkJZXJyID0gY2hlY2tfYW5kX3Jlc3RvcmVfZnBfY29udGV4dChzYywgdXNlZF9tYXRoKTsKIAl9IGVsc2UgewotCQkvKiBzaWduYWwgaGFuZGxlciBtYXkgaGF2ZSB1c2VkIEZQVS4gIEdpdmUgaXQgdXAuICovCisJCS8qIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlIHVzZWQgRlBVIG9yIE1TQS4gRGlzYWJsZSB0aGVtLiAqLworCQlkaXNhYmxlX21zYSgpOwogCQlsb3NlX2ZwdSgwKTsKIAl9CiAKQEAgLTU5MSwyMyArNzEwLDI2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCisjaWZuZGVmIENPTkZJR19FVkEKIHN0YXRpYyBpbnQgc21wX3NhdmVfZnBfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQogewogCXJldHVybiByYXdfY3B1X2hhc19mcHUKIAkgICAgICAgPyBfc2F2ZV9mcF9jb250ZXh0KHNjKQotCSAgICAgICA6IGZwdV9lbXVsYXRvcl9zYXZlX2NvbnRleHQoc2MpOworCSAgICAgICA6IGNvcHlfZnBfdG9fc2lnY29udGV4dChzYyk7CiB9CiAKIHN0YXRpYyBpbnQgc21wX3Jlc3RvcmVfZnBfY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQogewogCXJldHVybiByYXdfY3B1X2hhc19mcHUKIAkgICAgICAgPyBfcmVzdG9yZV9mcF9jb250ZXh0KHNjKQotCSAgICAgICA6IGZwdV9lbXVsYXRvcl9yZXN0b3JlX2NvbnRleHQoc2MpOworCSAgICAgICA6IGNvcHlfZnBfZnJvbV9zaWdjb250ZXh0KHNjKTsKIH0KKyNlbmRpZiAvKiBDT05GSUdfRVZBICovCiAjZW5kaWYKIAogc3RhdGljIGludCBzaWduYWxfc2V0dXAodm9pZCkKIHsKKyNpZm5kZWYgQ09ORklHX0VWQQogI2lmZGVmIENPTkZJR19TTVAKIAkvKiBGb3Igbm93IGp1c3QgZG8gdGhlIGNwdV9oYXNfZnB1IGNoZWNrIHdoZW4gdGhlIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCAqLwogCXNhdmVfZnBfY29udGV4dCA9IHNtcF9zYXZlX2ZwX2NvbnRleHQ7CkBAIC02MTcsOSArNzM5LDEzIEBACiAJCXNhdmVfZnBfY29udGV4dCA9IF9zYXZlX2ZwX2NvbnRleHQ7CiAJCXJlc3RvcmVfZnBfY29udGV4dCA9IF9yZXN0b3JlX2ZwX2NvbnRleHQ7CiAJfSBlbHNlIHsKLQkJc2F2ZV9mcF9jb250ZXh0ID0gZnB1X2VtdWxhdG9yX3NhdmVfY29udGV4dDsKLQkJcmVzdG9yZV9mcF9jb250ZXh0ID0gZnB1X2VtdWxhdG9yX3Jlc3RvcmVfY29udGV4dDsKKwkJc2F2ZV9mcF9jb250ZXh0ID0gY29weV9mcF9mcm9tX3NpZ2NvbnRleHQ7CisJCXJlc3RvcmVfZnBfY29udGV4dCA9IGNvcHlfZnBfdG9fc2lnY29udGV4dDsKIAl9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworI2Vsc2UKKwlzYXZlX2ZwX2NvbnRleHQgPSBjb3B5X2ZwX2Zyb21fc2lnY29udGV4dDs7CisJcmVzdG9yZV9mcF9jb250ZXh0ID0gY29weV9mcF90b19zaWdjb250ZXh0OwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYwppbmRleCAzZDYwZjc3Li4yOTlmOTU2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL3NpbS5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9mcHUuaD4KKyNpbmNsdWRlIDxhc20vbXNhLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgogI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAjaW5jbHVkZSA8YXNtL2RzcC5oPgpAQCAtNDIsOCArNDMsOCBAQAogZXh0ZXJuIGFzbWxpbmthZ2UgaW50IF9zYXZlX2ZwX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpOwogZXh0ZXJuIGFzbWxpbmthZ2UgaW50IF9yZXN0b3JlX2ZwX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpOwogCi1leHRlcm4gYXNtbGlua2FnZSBpbnQgZnB1X2VtdWxhdG9yX3NhdmVfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYyk7Ci1leHRlcm4gYXNtbGlua2FnZSBpbnQgZnB1X2VtdWxhdG9yX3Jlc3RvcmVfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYyk7CitleHRlcm4gYXNtbGlua2FnZSBpbnQgX3NhdmVfbXNhX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpOworZXh0ZXJuIGFzbWxpbmthZ2UgaW50IF9yZXN0b3JlX21zYV9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKTsKIAogLyoKICAqIEluY2x1ZGluZyA8YXNtL3VuaXN0ZC5oPiB3b3VsZCBnaXZlIHVzZSB0aGUgNjQtYml0IHN5c2NhbGwgbnVtYmVycyAuLi4KQEAgLTc4LDE3ICs3OSw5NiBAQAogfTsKIAogLyoKKyAqIFRocmVhZCBzYXZlZCBjb250ZXh0IGNvcHkgdG8vZnJvbSBhIHNpZ25hbCBjb250ZXh0IHByZXN1bWVkIHRvIGJlIG9uIHRoZQorICogdXNlciBzdGFjaywgYW5kIHRoZXJlZm9yZSBhY2Nlc3NlZCB3aXRoIGFwcHJvcHJpYXRlIG1hY3JvcyBmcm9tIHVhY2Nlc3MuaC4KKyAqLworc3RhdGljIGludCBjb3B5X2ZwX3RvX3NpZ2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpCit7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisJaW50IGluYyA9IHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0ZQUkVHUykgPyAyIDogMTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRlBVX1JFR1M7IGkgKz0gaW5jKSB7CisJCWVyciB8PQorCQkgICAgX19wdXRfdXNlcihnZXRfZnByNjQoJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAwKSwKKwkJCSAgICAgICAmc2MtPnNjX2ZwcmVnc1tpXSk7CisJfQorCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZmNyMzEsICZzYy0+c2NfZnBjX2Nzcik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNvcHlfZnBfZnJvbV9zaWdjb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCWludCBpbmMgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpID8gMiA6IDE7CisJdTY0IGZwcl92YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpICs9IGluYykgeworCQllcnIgfD0gX19nZXRfdXNlcihmcHJfdmFsLCAmc2MtPnNjX2ZwcmVnc1tpXSk7CisJCXNldF9mcHI2NCgmY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sIDAsIGZwcl92YWwpOworCX0KKwllcnIgfD0gX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxLCAmc2MtPnNjX2ZwY19jc3IpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIHNhdmUgb25seSB0aGUgdXBwZXIgNjQgYml0cyBvZiB0aGUgdmVjdG9yIHJlZ2lzdGVycywKKyAqIHNpbmNlIHRoZSBsb3dlciA2NCBiaXRzIGhhdmUgYWxyZWFkeSBiZWVuIHNhdmVkIGFzIHRoZSBzY2FsYXIgRlAgY29udGV4dC4KKyAqLworc3RhdGljIGludCBjb3B5X21zYV90b19zaWdjb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GUFVfUkVHUzsgaSsrKSB7CisJCWVyciB8PQorCQkgICAgX19wdXRfdXNlcihnZXRfZnByNjQoJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAxKSwKKwkJCSAgICAgICAmc2MtPnNjX21zYXJlZ3NbaV0pOworCX0KKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1Lm1zYWNzciwgJnNjLT5zY19tc2FfY3NyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY29weV9tc2FfZnJvbV9zaWdjb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCXU2NCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZQVV9SRUdTOyBpKyspIHsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIodmFsLCAmc2MtPnNjX21zYXJlZ3NbaV0pOworCQlzZXRfZnByNjQoJmN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAxLCB2YWwpOworCX0KKwllcnIgfD0gX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1Lm1zYWNzciwgJnNjLT5zY19tc2FfY3NyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCiAgKiBzaWdjb250ZXh0IGhhbmRsZXJzCiAgKi8KLXN0YXRpYyBpbnQgcHJvdGVjdGVkX3NhdmVfZnBfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYykKK3N0YXRpYyBpbnQgcHJvdGVjdGVkX3NhdmVfZnBfY29udGV4dDMyKHN0cnVjdCBzaWdjb250ZXh0MzIgX191c2VyICpzYywKKwkJCQkgICAgICAgdW5zaWduZWQgdXNlZF9tYXRoKQogewogCWludCBlcnI7CisJYm9vbCBzYXZlX21zYSA9IGNwdV9oYXNfbXNhICYmICh1c2VkX21hdGggJiBVU0VETUFUSF9NU0EpOwogCXdoaWxlICgxKSB7CiAJCWxvY2tfZnB1X293bmVyKCk7Ci0JCWVyciA9IG93bl9mcHVfaW5hdG9taWMoMSk7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gc2F2ZV9mcF9jb250ZXh0MzIoc2MpOyAvKiB0aGlzIG1pZ2h0IGZhaWwgKi8KLQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQlpZiAoaXNfZnB1X293bmVyKCkpIHsKKwkJCWVyciA9IHNhdmVfZnBfY29udGV4dDMyKHNjKTsKKwkJCWlmIChzYXZlX21zYSAmJiAhZXJyKQorCQkJCWVyciA9IF9zYXZlX21zYV9jb250ZXh0MzIoc2MpOworCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQkJZXJyID0gY29weV9mcF90b19zaWdjb250ZXh0MzIoc2MpOworCQkJaWYgKHNhdmVfbXNhICYmICFlcnIpCisJCQkJZXJyID0gY29weV9tc2FfdG9fc2lnY29udGV4dDMyKHNjKTsKKwkJfQogCQlpZiAobGlrZWx5KCFlcnIpKQogCQkJYnJlYWs7CiAJCS8qIHRvdWNoIHRoZSBzaWdjb250ZXh0IGFuZCB0cnkgYWdhaW4gKi8KQEAgLTEwMSwxNSArMTgxLDI5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBwcm90ZWN0ZWRfcmVzdG9yZV9mcF9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQorc3RhdGljIGludCBwcm90ZWN0ZWRfcmVzdG9yZV9mcF9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjLAorCQkJCQkgIHVuc2lnbmVkIHVzZWRfbWF0aCkKIHsKIAlpbnQgZXJyLCB0bXAgX19tYXliZV91bnVzZWQ7CisJYm9vbCByZXN0b3JlX21zYSA9IGNwdV9oYXNfbXNhICYmICh1c2VkX21hdGggJiBVU0VETUFUSF9NU0EpOwogCXdoaWxlICgxKSB7CiAJCWxvY2tfZnB1X293bmVyKCk7Ci0JCWVyciA9IG93bl9mcHVfaW5hdG9taWMoMCk7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gcmVzdG9yZV9mcF9jb250ZXh0MzIoc2MpOyAvKiB0aGlzIG1pZ2h0IGZhaWwgKi8KLQkJdW5sb2NrX2ZwdV9vd25lcigpOworCQlpZiAoaXNfZnB1X293bmVyKCkpIHsKKwkJCWVyciA9IHJlc3RvcmVfZnBfY29udGV4dDMyKHNjKTsKKwkJCWlmIChyZXN0b3JlX21zYSAmJiAhZXJyKSB7CisJCQkJZW5hYmxlX21zYSgpOworCQkJCWVyciA9IF9yZXN0b3JlX21zYV9jb250ZXh0MzIoc2MpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBzaWduYWwgaGFuZGxlciBtYXkgaGF2ZSB1c2VkIE1TQSAqLworCQkJCWRpc2FibGVfbXNhKCk7CisJCQl9CisJCQl1bmxvY2tfZnB1X293bmVyKCk7CisJCX0gZWxzZSB7CisJCQl1bmxvY2tfZnB1X293bmVyKCk7CisJCQllcnIgPSBjb3B5X2ZwX2Zyb21fc2lnY29udGV4dDMyKHNjKTsKKwkJCWlmIChyZXN0b3JlX21zYSAmJiAhZXJyKQorCQkJCWVyciA9IGNvcHlfbXNhX2Zyb21fc2lnY29udGV4dDMyKHNjKTsKKwkJfQogCQlpZiAobGlrZWx5KCFlcnIpKQogCQkJYnJlYWs7CiAJCS8qIHRvdWNoIHRoZSBzaWdjb250ZXh0IGFuZCB0cnkgYWdhaW4gKi8KQEAgLTE0Nyw3ICsyNDEsOCBAQAogCQllcnIgfD0gX19wdXRfdXNlcihtZmxvMygpLCAmc2MtPnNjX2xvMyk7CiAJfQogCi0JdXNlZF9tYXRoID0gISF1c2VkX21hdGgoKTsKKwl1c2VkX21hdGggPSB1c2VkX21hdGgoKSA/IFVTRURNQVRIX0ZQIDogMDsKKwl1c2VkX21hdGggfD0gdGhyZWFkX21zYV9jb250ZXh0X2xpdmUoKSA/IFVTRURNQVRIX01TQSA6IDA7CiAJZXJyIHw9IF9fcHV0X3VzZXIodXNlZF9tYXRoLCAmc2MtPnNjX3VzZWRfbWF0aCk7CiAKIAlpZiAodXNlZF9tYXRoKSB7CkBAIC0xNTUsMjAgKzI1MCwyMSBAQAogCQkgKiBTYXZlIEZQVSBzdGF0ZSB0byBzaWduYWwgY29udGV4dC4gIFNpZ25hbCBoYW5kbGVyCiAJCSAqIHdpbGwgImluaGVyaXQiIGN1cnJlbnQgRlBVIHN0YXRlLgogCQkgKi8KLQkJZXJyIHw9IHByb3RlY3RlZF9zYXZlX2ZwX2NvbnRleHQzMihzYyk7CisJCWVyciB8PSBwcm90ZWN0ZWRfc2F2ZV9mcF9jb250ZXh0MzIoc2MsIHVzZWRfbWF0aCk7CiAJfQogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQKLWNoZWNrX2FuZF9yZXN0b3JlX2ZwX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpCitjaGVja19hbmRfcmVzdG9yZV9mcF9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjLAorCQkJICAgICAgIHVuc2lnbmVkIHVzZWRfbWF0aCkKIHsKIAlpbnQgZXJyLCBzaWc7CiAKIAllcnIgPSBzaWcgPSBmcGNzcl9wZW5kaW5nKCZzYy0+c2NfZnBjX2Nzcik7CiAJaWYgKGVyciA+IDApCiAJCWVyciA9IDA7Ci0JZXJyIHw9IHByb3RlY3RlZF9yZXN0b3JlX2ZwX2NvbnRleHQzMihzYyk7CisJZXJyIHw9IHByb3RlY3RlZF9yZXN0b3JlX2ZwX2NvbnRleHQzMihzYywgdXNlZF9tYXRoKTsKIAlyZXR1cm4gZXJyID86IHNpZzsKIH0KIApAQCAtMjA1LDkgKzMwMSwxMCBAQAogCWlmICh1c2VkX21hdGgpIHsKIAkJLyogcmVzdG9yZSBmcHUgY29udGV4dCBpZiB3ZSBoYXZlIHVzZWQgaXQgYmVmb3JlICovCiAJCWlmICghZXJyKQotCQkJZXJyID0gY2hlY2tfYW5kX3Jlc3RvcmVfZnBfY29udGV4dDMyKHNjKTsKKwkJCWVyciA9IGNoZWNrX2FuZF9yZXN0b3JlX2ZwX2NvbnRleHQzMihzYywgdXNlZF9tYXRoKTsKIAl9IGVsc2UgewotCQkvKiBzaWduYWwgaGFuZGxlciBtYXkgaGF2ZSB1c2VkIEZQVS4gIEdpdmUgaXQgdXAuICovCisJCS8qIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlIHVzZWQgRlBVIG9yIE1TQS4gRGlzYWJsZSB0aGVtLiAqLworCQlkaXNhYmxlX21zYSgpOwogCQlsb3NlX2ZwdSgwKTsKIAl9CiAKQEAgLTU2Niw4ICs2NjMsOCBAQAogCQlzYXZlX2ZwX2NvbnRleHQzMiA9IF9zYXZlX2ZwX2NvbnRleHQzMjsKIAkJcmVzdG9yZV9mcF9jb250ZXh0MzIgPSBfcmVzdG9yZV9mcF9jb250ZXh0MzI7CiAJfSBlbHNlIHsKLQkJc2F2ZV9mcF9jb250ZXh0MzIgPSBmcHVfZW11bGF0b3Jfc2F2ZV9jb250ZXh0MzI7Ci0JCXJlc3RvcmVfZnBfY29udGV4dDMyID0gZnB1X2VtdWxhdG9yX3Jlc3RvcmVfY29udGV4dDMyOworCQlzYXZlX2ZwX2NvbnRleHQzMiA9IGNvcHlfZnBfdG9fc2lnY29udGV4dDMyOworCQlyZXN0b3JlX2ZwX2NvbnRleHQzMiA9IGNvcHlfZnBfZnJvbV9zaWdjb250ZXh0MzI7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC1jbXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNtcC5jCmluZGV4IDFiOTI1ZDguLjNlZjU1ZmI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1jbXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcC1jbXAuYwpAQCAtMzksNTcgKzM5LDkgQEAKICNpbmNsdWRlIDxhc20vYW1vbi5oPgogI2luY2x1ZGUgPGFzbS9naWMuaD4KIAotc3RhdGljIHZvaWQgaXBpX2NhbGxfZnVuY3Rpb24odW5zaWduZWQgaW50IGNwdSkKLXsKLQlwcl9kZWJ1ZygiQ1BVJWQ6ICVzIGNwdSAlZCBzdGF0dXMgJTA4eFxuIiwKLQkJIHNtcF9wcm9jZXNzb3JfaWQoKSwgX19mdW5jX18sIGNwdSwgcmVhZF9jMF9zdGF0dXMoKSk7Ci0KLQlnaWNfc2VuZF9pcGkocGxhdF9pcGlfY2FsbF9pbnRfeGxhdGUoY3B1KSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgaXBpX3Jlc2NoZWQodW5zaWduZWQgaW50IGNwdSkKLXsKLQlwcl9kZWJ1ZygiQ1BVJWQ6ICVzIGNwdSAlZCBzdGF0dXMgJTA4eFxuIiwKLQkJIHNtcF9wcm9jZXNzb3JfaWQoKSwgX19mdW5jX18sIGNwdSwgcmVhZF9jMF9zdGF0dXMoKSk7Ci0KLQlnaWNfc2VuZF9pcGkocGxhdF9pcGlfcmVzY2hlZF9pbnRfeGxhdGUoY3B1KSk7Ci19Ci0KLS8qCi0gKiBGSVhNRTogVGhpcyBpc24ndCByZXN0cmljdGVkIHRvIENNUAotICogVGhlIFNNVlAga2VybmVsIGNvdWxkIHVzZSBHSUMgaW50ZXJydXB0cyBpZiBhdmFpbGFibGUKLSAqLwotdm9pZCBjbXBfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBTTVBfQ0FMTF9GVU5DVElPTjoKLQkJaXBpX2NhbGxfZnVuY3Rpb24oY3B1KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGOgotCQlpcGlfcmVzY2hlZChjcHUpOwotCQlicmVhazsKLQl9Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNtcF9zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yX2VhY2hfY3B1KGksIG1hc2spCi0JCWNtcF9zZW5kX2lwaV9zaW5nbGUoaSwgYWN0aW9uKTsKLX0KLQogc3RhdGljIHZvaWQgY21wX2luaXRfc2Vjb25kYXJ5KHZvaWQpCiB7Ci0Jc3RydWN0IGNwdWluZm9fbWlwcyAqYyA9ICZjdXJyZW50X2NwdV9kYXRhOworCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgX19tYXliZV91bnVzZWQgPSAmY3VycmVudF9jcHVfZGF0YTsKIAogCS8qIEFzc3VtZSBHSUMgaXMgcHJlc2VudCAqLwogCWNoYW5nZV9jMF9zdGF0dXMoU1QwX0lNLCBTVEFUVVNGX0lQMyB8IFNUQVRVU0ZfSVA0IHwgU1RBVFVTRl9JUDYgfApAQCAtOTcsNyArNDksNiBAQAogCiAJLyogRW5hYmxlIHBlci1jcHUgaW50ZXJydXB0czogcGxhdGZvcm0gc3BlY2lmaWMgKi8KIAotCWMtPmNvcmUgPSAocmVhZF9jMF9lYmFzZSgpID4+IDEpICYgMHgxZmY7CiAjaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01UQykKIAlpZiAoY3B1X2hhc19taXBzbXQpCiAJCWMtPnZwZV9pZCA9IChyZWFkX2MwX3RjYmluZCgpID4+IFRDQklORF9DVVJWUEVfU0hJRlQpICYKQEAgLTIxMCw4ICsxNjEsOCBAQAogfQogCiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIGNtcF9zbXBfb3BzID0gewotCS5zZW5kX2lwaV9zaW5nbGUJPSBjbXBfc2VuZF9pcGlfc2luZ2xlLAotCS5zZW5kX2lwaV9tYXNrCQk9IGNtcF9zZW5kX2lwaV9tYXNrLAorCS5zZW5kX2lwaV9zaW5nbGUJPSBnaWNfc2VuZF9pcGlfc2luZ2xlLAorCS5zZW5kX2lwaV9tYXNrCQk9IGdpY19zZW5kX2lwaV9tYXNrLAogCS5pbml0X3NlY29uZGFyeQkJPSBjbXBfaW5pdF9zZWNvbmRhcnksCiAJLnNtcF9maW5pc2gJCT0gY21wX3NtcF9maW5pc2gsCiAJLmNwdXNfZG9uZQkJPSBjbXBfY3B1c19kb25lLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtY3BzLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1jcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzZlZWMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtY3BzLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisgKiBBdXRob3I6IFBhdWwgQnVydG9uIDxwYXVsLmJ1cnRvbkBpbWd0ZWMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZ2ljLmg+CisjaW5jbHVkZSA8YXNtL21pcHMtY20uaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1jcGMuaD4KKyNpbmNsdWRlIDxhc20vbWlwc19tdC5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zbXAtY3BzLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdWFzbS5oPgorCitzdGF0aWMgREVDTEFSRV9CSVRNQVAoY29yZV9wb3dlciwgTlJfQ1BVUyk7CisKK3N0cnVjdCBib290X2NvbmZpZyBtaXBzX2Nwc19ib290Y2ZnOworCitzdGF0aWMgdm9pZCBpbml0X2NvcmUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbnZwZXMsIHQ7CisJdTMyIG12cGNvbmYwLCB2cGVjb25mMCwgdnBlY29udHJvbCwgdGNzdGF0dXMsIHRjYmluZCwgc3RhdHVzOworCisJaWYgKCFjcHVfaGFzX21pcHNtdCkKKwkJcmV0dXJuOworCisJLyogRW50ZXIgVlBFIGNvbmZpZ3VyYXRpb24gc3RhdGUgKi8KKwlkdnBlKCk7CisJc2V0X2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOworCisJLyogUmV0cmlldmUgdGhlIGNvdW50IG9mIFZQRXMgaW4gdGhpcyBjb3JlICovCisJbXZwY29uZjAgPSByZWFkX2MwX212cGNvbmYwKCk7CisJbnZwZXMgPSAoKG12cGNvbmYwICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkgKyAxOworCXNtcF9udW1fc2libGluZ3MgPSBudnBlczsKKworCWZvciAodCA9IDE7IHQgPCBudnBlczsgdCsrKSB7CisJCS8qIFVzZSBhIDE6MSBtYXBwaW5nIG9mIFRDIGluZGV4IHRvIFZQRSBpbmRleCAqLworCQlzZXR0Yyh0KTsKKworCQkvKiBCaW5kIDEgVEMgdG8gdGhpcyBWUEUgKi8KKwkJdGNiaW5kID0gcmVhZF90Y19jMF90Y2JpbmQoKTsKKwkJdGNiaW5kICY9IH5UQ0JJTkRfQ1VSVlBFOworCQl0Y2JpbmQgfD0gdCA8PCBUQ0JJTkRfQ1VSVlBFX1NISUZUOworCQl3cml0ZV90Y19jMF90Y2JpbmQodGNiaW5kKTsKKworCQkvKiBTZXQgZXhjbHVzaXZlIFRDLCBub24tYWN0aXZlLCBtYXN0ZXIgKi8KKwkJdnBlY29uZjAgPSByZWFkX3ZwZV9jMF92cGVjb25mMCgpOworCQl2cGVjb25mMCAmPSB+KFZQRUNPTkYwX1hUQyB8IFZQRUNPTkYwX1ZQQSk7CisJCXZwZWNvbmYwIHw9IHQgPDwgVlBFQ09ORjBfWFRDX1NISUZUOworCQl2cGVjb25mMCB8PSBWUEVDT05GMF9NVlA7CisJCXdyaXRlX3ZwZV9jMF92cGVjb25mMCh2cGVjb25mMCk7CisKKwkJLyogRGVjbGFyZSBUQyBub24tYWN0aXZlLCBub24tYWxsb2NhdGFibGUgJiBpbnRlcnJ1cHQgZXhlbXB0ICovCisJCXRjc3RhdHVzID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOworCQl0Y3N0YXR1cyAmPSB+KFRDU1RBVFVTX0EgfCBUQ1NUQVRVU19EQSk7CisJCXRjc3RhdHVzIHw9IFRDU1RBVFVTX0lYTVQ7CisJCXdyaXRlX3RjX2MwX3Rjc3RhdHVzKHRjc3RhdHVzKTsKKworCQkvKiBIYWx0IHRoZSBUQyAqLworCQl3cml0ZV90Y19jMF90Y2hhbHQoVENIQUxUX0gpOworCisJCS8qIEFsbG93IG9ubHkgMSBUQyB0byBleGVjdXRlICovCisJCXZwZWNvbnRyb2wgPSByZWFkX3ZwZV9jMF92cGVjb250cm9sKCk7CisJCXZwZWNvbnRyb2wgJj0gflZQRUNPTlRST0xfVEU7CisJCXdyaXRlX3ZwZV9jMF92cGVjb250cm9sKHZwZWNvbnRyb2wpOworCisJCS8qIENvcHkgKG1vc3Qgb2YpIFN0YXR1cyBmcm9tIFZQRSAwICovCisJCXN0YXR1cyA9IHJlYWRfYzBfc3RhdHVzKCk7CisJCXN0YXR1cyAmPSB+KFNUMF9JTSB8IFNUMF9JRSB8IFNUMF9LU1UpOworCQlzdGF0dXMgfD0gU1QwX0NVMDsKKwkJd3JpdGVfdnBlX2MwX3N0YXR1cyhzdGF0dXMpOworCisJCS8qIENvcHkgQ29uZmlnIGZyb20gVlBFIDAgKi8KKwkJd3JpdGVfdnBlX2MwX2NvbmZpZyhyZWFkX2MwX2NvbmZpZygpKTsKKwkJd3JpdGVfdnBlX2MwX2NvbmZpZzcocmVhZF9jMF9jb25maWc3KCkpOworCisJCS8qIEVuc3VyZSBubyBzb2Z0d2FyZSBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nICovCisJCXdyaXRlX3ZwZV9jMF9jYXVzZSgwKTsKKworCQkvKiBTeW5jIENvdW50ICovCisJCXdyaXRlX3ZwZV9jMF9jb3VudChyZWFkX2MwX2NvdW50KCkpOworCX0KKworCS8qIExlYXZlIFZQRSBjb25maWd1cmF0aW9uIHN0YXRlICovCisJY2xlYXJfYzBfbXZwY29udHJvbChNVlBDT05UUk9MX1ZQQyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjcHNfc21wX3NldHVwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG5jb3JlcywgbnZwZXMsIGNvcmVfdnBlczsKKwlpbnQgYywgdjsKKwl1MzIgY29yZV9jZmcsICplbnRyeV9jb2RlOworCisJLyogRGV0ZWN0ICYgcmVjb3JkIFZQRSB0b3BvbG9neSAqLworCW5jb3JlcyA9IG1pcHNfY21fbnVtY29yZXMoKTsKKwlwcl9pbmZvKCJWUEUgdG9wb2xvZ3kgIik7CisJZm9yIChjID0gbnZwZXMgPSAwOyBjIDwgbmNvcmVzOyBjKyspIHsKKwkJaWYgKGNwdV9oYXNfbWlwc210ICYmIGNvbmZpZ19lbmFibGVkKENPTkZJR19NSVBTX01UX1NNUCkpIHsKKwkJCXdyaXRlX2djcl9jbF9vdGhlcihjIDw8IENNX0dDUl9DeF9PVEhFUl9DT1JFTlVNX1NIRik7CisJCQljb3JlX2NmZyA9IHJlYWRfZ2NyX2NvX2NvbmZpZygpOworCQkJY29yZV92cGVzID0gKChjb3JlX2NmZyAmIENNX0dDUl9DeF9DT05GSUdfUFZQRV9NU0spID4+CisJCQkJICAgICBDTV9HQ1JfQ3hfQ09ORklHX1BWUEVfU0hGKSArIDE7CisJCX0gZWxzZSB7CisJCQljb3JlX3ZwZXMgPSAxOworCQl9CisKKwkJcHJfY29udCgiJWMldSIsIGMgPyAnLCcgOiAneycsIGNvcmVfdnBlcyk7CisKKwkJZm9yICh2ID0gMDsgdiA8IG1pbl90KGludCwgY29yZV92cGVzLCBOUl9DUFVTIC0gbnZwZXMpOyB2KyspIHsKKwkJCWNwdV9kYXRhW252cGVzICsgdl0uY29yZSA9IGM7CisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCisJCQljcHVfZGF0YVtudnBlcyArIHZdLnZwZV9pZCA9IHY7CisjZW5kaWYKKwkJfQorCisJCW52cGVzICs9IGNvcmVfdnBlczsKKwl9CisJcHJfY29udCgifSB0b3RhbCAldVxuIiwgbnZwZXMpOworCisJLyogSW5kaWNhdGUgcHJlc2VudCBDUFVzIChDUFUgYmVpbmcgc3lub255bW91cyB3aXRoIFZQRSkgKi8KKwlmb3IgKHYgPSAwOyB2IDwgbWluX3QodW5zaWduZWQsIG52cGVzLCBOUl9DUFVTKTsgdisrKSB7CisJCXNldF9jcHVfcG9zc2libGUodiwgdHJ1ZSk7CisJCXNldF9jcHVfcHJlc2VudCh2LCB0cnVlKTsKKwkJX19jcHVfbnVtYmVyX21hcFt2XSA9IHY7CisJCV9fY3B1X2xvZ2ljYWxfbWFwW3ZdID0gdjsKKwl9CisKKwkvKiBDb3JlIDAgaXMgcG93ZXJlZCB1cCAod2UncmUgcnVubmluZyBvbiBpdCkgKi8KKwliaXRtYXBfc2V0KGNvcmVfcG93ZXIsIDAsIDEpOworCisJLyogRGlzYWJsZSBNVCAtIHdlIG9ubHkgd2FudCB0byBydW4gMSBUQyBwZXIgVlBFICovCisJaWYgKGNwdV9oYXNfbWlwc210KQorCQlkbXQoKTsKKworCS8qIEluaXRpYWxpc2UgY29yZSAwICovCisJaW5pdF9jb3JlKCk7CisKKwkvKiBQYXRjaCB0aGUgc3RhcnQgb2YgbWlwc19jcHNfY29yZV9lbnRyeSB0byBwcm92aWRlIHRoZSBDTSBiYXNlICovCisJZW50cnlfY29kZSA9ICh1MzIgKikmbWlwc19jcHNfY29yZV9lbnRyeTsKKwlVQVNNX2lfTEEoJmVudHJ5X2NvZGUsIDMsIChsb25nKW1pcHNfY21fYmFzZSk7CisKKwkvKiBNYWtlIGNvcmUgMCBjb2hlcmVudCB3aXRoIGV2ZXJ5dGhpbmcgKi8KKwl3cml0ZV9nY3JfY2xfY29oZXJlbmNlKDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY3BzX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJbWlwc19tdF9zZXRfY3B1b3B0aW9ucygpOworfQorCitzdGF0aWMgdm9pZCBib290X2NvcmUoc3RydWN0IGJvb3RfY29uZmlnICpjZmcpCit7CisJdTMyIGFjY2VzczsKKworCS8qIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgY29yZSAqLworCXdyaXRlX2djcl9jbF9vdGhlcihjZmctPmNvcmUgPDwgQ01fR0NSX0N4X09USEVSX0NPUkVOVU1fU0hGKTsKKworCS8qIFNldCBpdHMgcmVzZXQgdmVjdG9yICovCisJd3JpdGVfZ2NyX2NvX3Jlc2V0X2Jhc2UoQ0tTRUcxQUREUigodW5zaWduZWQgbG9uZyltaXBzX2Nwc19jb3JlX2VudHJ5KSk7CisKKwkvKiBFbnN1cmUgaXRzIGNvaGVyZW5jeSBpcyBkaXNhYmxlZCAqLworCXdyaXRlX2djcl9jb19jb2hlcmVuY2UoMCk7CisKKwkvKiBFbnN1cmUgdGhlIGNvcmUgY2FuIGFjY2VzcyB0aGUgR0NScyAqLworCWFjY2VzcyA9IHJlYWRfZ2NyX2FjY2VzcygpOworCWFjY2VzcyB8PSAxIDw8IChDTV9HQ1JfQUNDRVNTX0FDQ0VTU0VOX1NIRiArIGNmZy0+Y29yZSk7CisJd3JpdGVfZ2NyX2FjY2VzcyhhY2Nlc3MpOworCisJLyogQ29weSBjZmcgKi8KKwltaXBzX2Nwc19ib290Y2ZnID0gKmNmZzsKKworCWlmIChtaXBzX2NwY19wcmVzZW50KCkpIHsKKwkJLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjb3JlICovCisJCXdyaXRlX2NwY19jbF9vdGhlcihjZmctPmNvcmUgPDwgQ1BDX0N4X09USEVSX0NPUkVOVU1fU0hGKTsKKworCQkvKiBSZXNldCB0aGUgY29yZSAqLworCQl3cml0ZV9jcGNfY29fY21kKENQQ19DeF9DTURfUkVTRVQpOworCX0gZWxzZSB7CisJCS8qIFRha2UgdGhlIGNvcmUgb3V0IG9mIHJlc2V0ICovCisJCXdyaXRlX2djcl9jb19yZXNldF9yZWxlYXNlKDApOworCX0KKworCS8qIFRoZSBjb3JlIGlzIG5vdyBwb3dlcmVkIHVwICovCisJYml0bWFwX3NldChjb3JlX3Bvd2VyLCBjZmctPmNvcmUsIDEpOworfQorCitzdGF0aWMgdm9pZCBib290X3ZwZSh2b2lkICppbmZvKQoreworCXN0cnVjdCBib290X2NvbmZpZyAqY2ZnID0gaW5mbzsKKwl1MzIgdGNzdGF0dXMsIHZwZWNvbmYwOworCisJLyogRW50ZXIgVlBFIGNvbmZpZ3VyYXRpb24gc3RhdGUgKi8KKwlkdnBlKCk7CisJc2V0X2MwX212cGNvbnRyb2woTVZQQ09OVFJPTF9WUEMpOworCisJc2V0dGMoY2ZnLT52cGUpOworCisJLyogU2V0IHRoZSBUQyByZXN0YXJ0IFBDICovCisJd3JpdGVfdGNfYzBfdGNyZXN0YXJ0KCh1bnNpZ25lZCBsb25nKSZzbXBfYm9vdHN0cmFwKTsKKworCS8qIEFjdGl2YXRlIHRoZSBUQywgYWxsb3cgaW50ZXJydXB0cyAqLworCXRjc3RhdHVzID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOworCXRjc3RhdHVzICY9IH5UQ1NUQVRVU19JWE1UOworCXRjc3RhdHVzIHw9IFRDU1RBVFVTX0E7CisJd3JpdGVfdGNfYzBfdGNzdGF0dXModGNzdGF0dXMpOworCisJLyogQ2xlYXIgdGhlIFRDIGhhbHQgYml0ICovCisJd3JpdGVfdGNfYzBfdGNoYWx0KDApOworCisJLyogQWN0aXZhdGUgdGhlIFZQRSAqLworCXZwZWNvbmYwID0gcmVhZF92cGVfYzBfdnBlY29uZjAoKTsKKwl2cGVjb25mMCB8PSBWUEVDT05GMF9WUEE7CisJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHZwZWNvbmYwKTsKKworCS8qIFNldCB0aGUgc3RhY2sgJiBnbG9iYWwgcG9pbnRlciByZWdpc3RlcnMgKi8KKwl3cml0ZV90Y19ncHJfc3AoY2ZnLT5zcCk7CisJd3JpdGVfdGNfZ3ByX2dwKGNmZy0+Z3ApOworCisJLyogTGVhdmUgVlBFIGNvbmZpZ3VyYXRpb24gc3RhdGUgKi8KKwljbGVhcl9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKKworCS8qIEVuYWJsZSBvdGhlciBWUEVzIHRvIGV4ZWN1dGUgKi8KKwlldnBlKEVWUEVfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgY3BzX2Jvb3Rfc2Vjb25kYXJ5KGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwlzdHJ1Y3QgYm9vdF9jb25maWcgY2ZnOworCXVuc2lnbmVkIGludCByZW1vdGU7CisJaW50IGVycjsKKworCWNmZy5jb3JlID0gY3B1X2RhdGFbY3B1XS5jb3JlOworCWNmZy52cGUgPSBjcHVfdnBlX2lkKCZjcHVfZGF0YVtjcHVdKTsKKwljZmcucGMgPSAodW5zaWduZWQgbG9uZykmc21wX2Jvb3RzdHJhcDsKKwljZmcuc3AgPSBfX0tTVEtfVE9TKGlkbGUpOworCWNmZy5ncCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfdGhyZWFkX2luZm8oaWRsZSk7CisKKwlpZiAoIXRlc3RfYml0KGNmZy5jb3JlLCBjb3JlX3Bvd2VyKSkgeworCQkvKiBCb290IGEgVlBFIG9uIGEgcG93ZXJlZCBkb3duIGNvcmUgKi8KKwkJYm9vdF9jb3JlKCZjZmcpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNmZy5jb3JlICE9IGN1cnJlbnRfY3B1X2RhdGEuY29yZSkgeworCQkvKiBCb290IGEgVlBFIG9uIGFub3RoZXIgcG93ZXJlZCB1cCBjb3JlICovCisJCWZvciAocmVtb3RlID0gMDsgcmVtb3RlIDwgTlJfQ1BVUzsgcmVtb3RlKyspIHsKKwkJCWlmIChjcHVfZGF0YVtyZW1vdGVdLmNvcmUgIT0gY2ZnLmNvcmUpCisJCQkJY29udGludWU7CisJCQlpZiAoY3B1X29ubGluZShyZW1vdGUpKQorCQkJCWJyZWFrOworCQl9CisJCUJVR19PTihyZW1vdGUgPj0gTlJfQ1BVUyk7CisKKwkJZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKHJlbW90ZSwgYm9vdF92cGUsICZjZmcsIDEpOworCQlpZiAoZXJyKQorCQkJcGFuaWMoIkZhaWxlZCB0byBjYWxsIHJlbW90ZSBDUFVcbiIpOworCQlyZXR1cm47CisJfQorCisJQlVHX09OKCFjcHVfaGFzX21pcHNtdCk7CisKKwkvKiBCb290IGEgVlBFIG9uIHRoaXMgY29yZSAqLworCWJvb3RfdnBlKCZjZmcpOworfQorCitzdGF0aWMgdm9pZCBjcHNfaW5pdF9zZWNvbmRhcnkodm9pZCkKK3sKKwkvKiBEaXNhYmxlIE1UIC0gd2Ugb25seSB3YW50IHRvIHJ1biAxIFRDIHBlciBWUEUgKi8KKwlpZiAoY3B1X2hhc19taXBzbXQpCisJCWRtdCgpOworCisJLyogVE9ETzogcmV2aXNpdCB0aGlzIGFzc3VtcHRpb24gb25jZSBob3RwbHVnIGlzIGltcGxlbWVudGVkICovCisJaWYgKGNwdV92cGVfaWQoJmN1cnJlbnRfY3B1X2RhdGEpID09IDApCisJCWluaXRfY29yZSgpOworCisJY2hhbmdlX2MwX3N0YXR1cyhTVDBfSU0sIFNUQVRVU0ZfSVAzIHwgU1RBVFVTRl9JUDQgfAorCQkJCSBTVEFUVVNGX0lQNiB8IFNUQVRVU0ZfSVA3KTsKK30KKworc3RhdGljIHZvaWQgY3BzX3NtcF9maW5pc2godm9pZCkKK3sKKwl3cml0ZV9jMF9jb21wYXJlKHJlYWRfYzBfY291bnQoKSArICg4ICogbWlwc19ocHRfZnJlcXVlbmN5IC8gSFopKTsKKworI2lmZGVmIENPTkZJR19NSVBTX01UX0ZQQUZGCisJLyogSWYgd2UgaGF2ZSBhbiBGUFUsIGVucm9sbCBvdXJzZWx2ZXMgaW4gdGhlIEZQVS1mdWxsIG1hc2sgKi8KKwlpZiAoY3B1X2hhc19mcHUpCisJCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtdF9mcHVfY3B1bWFzayk7CisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfRlBBRkYgKi8KKworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgY3BzX2NwdXNfZG9uZSh2b2lkKQoreworfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc21wX29wcyBjcHNfc21wX29wcyA9IHsKKwkuc21wX3NldHVwCQk9IGNwc19zbXBfc2V0dXAsCisJLnByZXBhcmVfY3B1cwkJPSBjcHNfcHJlcGFyZV9jcHVzLAorCS5ib290X3NlY29uZGFyeQkJPSBjcHNfYm9vdF9zZWNvbmRhcnksCisJLmluaXRfc2Vjb25kYXJ5CQk9IGNwc19pbml0X3NlY29uZGFyeSwKKwkuc21wX2ZpbmlzaAkJPSBjcHNfc21wX2ZpbmlzaCwKKwkuc2VuZF9pcGlfc2luZ2xlCT0gZ2ljX3NlbmRfaXBpX3NpbmdsZSwKKwkuc2VuZF9pcGlfbWFzawkJPSBnaWNfc2VuZF9pcGlfbWFzaywKKwkuY3B1c19kb25lCQk9IGNwc19jcHVzX2RvbmUsCit9OworCitpbnQgcmVnaXN0ZXJfY3BzX3NtcF9vcHModm9pZCkKK3sKKwlpZiAoIW1pcHNfY21fcHJlc2VudCgpKSB7CisJCXByX3dhcm4oIk1JUFMgQ1BTIFNNUCB1bmFibGUgdG8gcHJvY2VlZCB3aXRob3V0IGEgQ01cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBjaGVjayB3ZSBoYXZlIGEgR0lDIC0gd2UgbmVlZCBvbmUgZm9yIElQSXMgKi8KKwlpZiAoIShyZWFkX2djcl9naWNfc3RhdHVzKCkgJiBDTV9HQ1JfR0lDX1NUQVRVU19FWF9NU0spKSB7CisJCXByX3dhcm4oIk1JUFMgQ1BTIFNNUCB1bmFibGUgdG8gcHJvY2VlZCB3aXRob3V0IGEgR0lDXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVnaXN0ZXJfc21wX29wcygmY3BzX3NtcF9vcHMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtZ2ljLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1naWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmIxZjkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtZ2ljLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogUGF1bCBCdXJ0b24gPHBhdWwuYnVydG9uQGltZ3RlYy5jb20+CisgKgorICogQmFzZWQgb24gc21wLWNtcC5jOgorICogIENvcHlyaWdodCAoQykgMjAwNyBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgorICogIEF1dGhvcjogQ2hyaXMgRGVhcm1hbiAoY2hyaXNAbWlwcy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKworI2luY2x1ZGUgPGFzbS9naWMuaD4KKyNpbmNsdWRlIDxhc20vc21wLW9wcy5oPgorCit2b2lkIGdpY19zZW5kX2lwaV9zaW5nbGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpbnRyOworCisJcHJfZGVidWcoIkNQVSVkOiAlcyBjcHUgJWQgYWN0aW9uICV1IHN0YXR1cyAlMDh4XG4iLAorCQkgc21wX3Byb2Nlc3Nvcl9pZCgpLCBfX2Z1bmNfXywgY3B1LCBhY3Rpb24sIHJlYWRfYzBfc3RhdHVzKCkpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFNNUF9DQUxMX0ZVTkNUSU9OOgorCQlpbnRyID0gcGxhdF9pcGlfY2FsbF9pbnRfeGxhdGUoY3B1KTsKKwkJYnJlYWs7CisKKwljYXNlIFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGOgorCQlpbnRyID0gcGxhdF9pcGlfcmVzY2hlZF9pbnRfeGxhdGUoY3B1KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlnaWNfc2VuZF9pcGkoaW50cik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkIGdpY19zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yX2VhY2hfY3B1KGksIG1hc2spCisJCWdpY19zZW5kX2lwaV9zaW5nbGUoaSwgYWN0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCmluZGV4IDBmYjhjZWYuLmY4ZTEzMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtbXQuYwpAQCAtMTEzLDI3ICsxMTMsNiBAQAogCXdyaXRlX3RjX2MwX3RjaGFsdChUQ0hBTFRfSCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVJRX0dJQwotc3RhdGljIHZvaWQgbXBfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBTTVBfQ0FMTF9GVU5DVElPTjoKLQkJZ2ljX3NlbmRfaXBpKHBsYXRfaXBpX2NhbGxfaW50X3hsYXRlKGNwdSkpOwotCQlicmVhazsKLQotCWNhc2UgU01QX1JFU0NIRURVTEVfWU9VUlNFTEY6Ci0JCWdpY19zZW5kX2lwaShwbGF0X2lwaV9yZXNjaGVkX2ludF94bGF0ZShjcHUpKTsKLQkJYnJlYWs7Ci0JfQotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIHZzbXBfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCiB7CiAJaW50IGk7CkBAIC0xNDIsNyArMTIxLDcgQEAKIAogI2lmZGVmIENPTkZJR19JUlFfR0lDCiAJaWYgKGdpY19wcmVzZW50KSB7Ci0JCW1wX3NlbmRfaXBpX3NpbmdsZShjcHUsIGFjdGlvbik7CisJCWdpY19zZW5kX2lwaV9zaW5nbGUoY3B1LCBhY3Rpb24pOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCkBAIC0zMTMsMyArMjkyLDI1IEBACiAJLnNtcF9zZXR1cAkJPSB2c21wX3NtcF9zZXR1cCwKIAkucHJlcGFyZV9jcHVzCQk9IHZzbXBfcHJlcGFyZV9jcHVzLAogfTsKKworc3RhdGljIGludCBwcm9jX2NwdWluZm9fY2hhaW5fY2FsbChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKKwl1bnNpZ25lZCBsb25nIGFjdGlvbl91bnVzZWQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHByb2NfY3B1aW5mb19ub3RpZmllcl9hcmdzICpwY24gPSBkYXRhOworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IHBjbi0+bTsKKwl1bnNpZ25lZCBsb25nIG4gPSBwY24tPm47CisKKwlpZiAoIWNwdV9oYXNfbWlwc210KQorCQlyZXR1cm4gTk9USUZZX09LOworCisJc2VxX3ByaW50ZihtLCAiVlBFXHRcdFx0OiAlZFxuIiwgY3B1X2RhdGFbbl0udnBlX2lkKTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2NfY3B1aW5mb19ub3RpZmllcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHByb2NfY3B1aW5mb19ub3RpZmllcihwcm9jX2NwdWluZm9fY2hhaW5fY2FsbCwgMCk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChwcm9jX2NwdWluZm9fbm90aWZpZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtdGMtcHJvYy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLXByb2MuYwppbmRleCBjMTBhYTg0Li4zODYzNWE5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtdGMtcHJvYy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy1wcm9jLmMKQEAgLTc3LDMgKzc3LDI2IEBACiAKIAlwcm9jX2NyZWF0ZSgic210YyIsIDA0NDQsIE5VTEwsICZzbXRjX3Byb2NfZm9wcyk7CiB9CisKK3N0YXRpYyBpbnQgcHJvY19jcHVpbmZvX2NoYWluX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCisJdW5zaWduZWQgbG9uZyBhY3Rpb25fdW51c2VkLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcm9jX2NwdWluZm9fbm90aWZpZXJfYXJncyAqcGNuID0gZGF0YTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBwY24tPm07CisJdW5zaWduZWQgbG9uZyBuID0gcGNuLT5uOworCisJaWYgKCFjcHVfaGFzX21pcHNtdCkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCXNlcV9wcmludGYobSwgIlZQRVx0XHRcdDogJWRcbiIsIGNwdV9kYXRhW25dLnZwZV9pZCk7CisJc2VxX3ByaW50ZihtLCAiVENcdFx0XHQ6ICVkXG4iLCBjcHVfZGF0YVtuXS50Y19pZCk7CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX2NwdWluZm9fbm90aWZpZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBwcm9jX2NwdWluZm9fbm90aWZpZXIocHJvY19jcHVpbmZvX2NoYWluX2NhbGwsIDApOworfQorCitzdWJzeXNfaW5pdGNhbGwocHJvY19jcHVpbmZvX25vdGlmaWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMgYi9hcmNoL21pcHMva2VybmVsL3NtdGMuYwppbmRleCBkZmMxYjkxLi5jMTY4MWQ2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtdGMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtdGMuYwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIAlpbnQgaXJxID0gTUlQU19DUFVfSVJRX0JBU0UgKyAxOwogCiAJaXJxX2VudGVyKCk7Ci0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAljZCA9ICZwZXJfY3B1KG1pcHNfY2xvY2tldmVudF9kZXZpY2UsIGNwdSk7CiAJY2QtPmV2ZW50X2hhbmRsZXIoY2QpOwogCWlycV9leGl0KCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NwcmFtLmMgYi9hcmNoL21pcHMva2VybmVsL3NwcmFtLmMKaW5kZXggYjI0MmUyYy4uNjdmMjQ5NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zcHJhbS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3ByYW0uYwpAQCAtMTk3LDE2ICsxOTcsMTcgQEAKIH0KIHZvaWQgc3ByYW1fY29uZmlnKHZvaWQpCiB7Ci0Jc3RydWN0IGNwdWluZm9fbWlwcyAqYyA9ICZjdXJyZW50X2NwdV9kYXRhOwogCXVuc2lnbmVkIGludCBjb25maWcwOwogCi0Jc3dpdGNoIChjLT5jcHV0eXBlKSB7CisJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKIAljYXNlIENQVV8yNEs6CiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV8xMDc0SzoKIAljYXNlIENQVV9JTlRFUkFQVElWOgogCWNhc2UgQ1BVX1BST0FQVElWOgorCWNhc2UgQ1BVX1A1NjAwOgogCQljb25maWcwID0gcmVhZF9jMF9jb25maWcoKTsKIAkJLyogRklYTUU6IGFkZHJlc3NlcyBhcmUgTWFsdGEgc3BlY2lmaWMgKi8KIAkJaWYgKGNvbmZpZzAgJiAoMTw8MjQpKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCmluZGV4IGI3OWQxM2YuLjRhNGY5ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogCWlmIChjcHVfaGFzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIJbGkJJVtlcnJdLCAwCQkJCVxuIgogCQkiMToJbGwJJVtvbGRdLCAoJVthZGRyXSkJCQlcbiIKIAkJIgltb3ZlCSVbdG1wXSwgJVtuZXddCQkJCVxuIgpAQCAtMTM1LDcgKzEzNSw3IEBACiAJCTogIm1lbW9yeSIpOwogCX0gZWxzZSBpZiAoY3B1X2hhc19sbHNjKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKKwkJIgkuc2V0CWFyY2g9cjQwMDAJCQkJXG4iCiAJCSIJbGkJJVtlcnJdLCAwCQkJCVxuIgogCQkiMToJbGwJJVtvbGRdLCAoJVthZGRyXSkJCQlcbiIKIAkJIgltb3ZlCSVbdG1wXSwgJVtuZXddCQkJCVxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IGUwYjQ5OTYuLjA3NGU4NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqIEtldmluIEQuIEtpc3NlbGwsIGtldmlua0BtaXBzLmNvbSBhbmQgQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcgIE1hY2llaiBXLiBSb3p5Y2tpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMTIgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtNDcsNiArNDgsNyBAQAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9taXBzbXRyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9tc2EuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KQEAgLTc3LDggKzc5LDEwIEBACiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9jcHUodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9vdih2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX3RyKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfbXNhX2ZwZSh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX2ZwZSh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX2Z0bGIodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9tc2Eodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9tZG14KHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfd2F0Y2godm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9tdCh2b2lkKTsKQEAgLTg2MSw2ICs4NjUsMTEgQEAKIAllbnVtIGN0eF9zdGF0ZSBwcmV2X3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgZXBjOwogCXUxNiBpbnN0clsyXTsKKwltbV9zZWdtZW50X3Qgc2VnOworCisJc2VnID0gZ2V0X2ZzKCk7CisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXNldF9mcyhLRVJORUxfRFMpOwogCiAJcHJldl9zdGF0ZSA9IGV4Y2VwdGlvbl9lbnRlcigpOwogCWlmIChnZXRfaXNhMTZfbW9kZShyZWdzLT5jcDBfZXBjKSkgewpAQCAtODcwLDE3ICs4NzksMTkgQEAKIAkJCWlmICgoX19nZXRfdXNlcihpbnN0clswXSwgKHUxNiBfX3VzZXIgKiltc2tfaXNhMTZfbW9kZShlcGMpKSB8fAogCQkJICAgIChfX2dldF91c2VyKGluc3RyWzFdLCAodTE2IF9fdXNlciAqKW1za19pc2ExNl9tb2RlKGVwYyArIDIpKSkpKQogCQkJCWdvdG8gb3V0X3NpZ3NlZ3Y7Ci0JCSAgICBvcGNvZGUgPSAoaW5zdHJbMF0gPDwgMTYpIHwgaW5zdHJbMV07CisJCQlvcGNvZGUgPSAoaW5zdHJbMF0gPDwgMTYpIHwgaW5zdHJbMV07CiAJCX0gZWxzZSB7Ci0JCSAgICAvKiBNSVBTMTZlIG1vZGUgKi8KLQkJICAgIGlmIChfX2dldF91c2VyKGluc3RyWzBdLCAodTE2IF9fdXNlciAqKW1za19pc2ExNl9tb2RlKGVwYykpKQorCQkJLyogTUlQUzE2ZSBtb2RlICovCisJCQlpZiAoX19nZXRfdXNlcihpbnN0clswXSwKKwkJCQkgICAgICAgKHUxNiBfX3VzZXIgKiltc2tfaXNhMTZfbW9kZShlcGMpKSkKIAkJCQlnb3RvIG91dF9zaWdzZWd2OwotCQkgICAgYmNvZGUgPSAoaW5zdHJbMF0gPj4gNikgJiAweDNmOwotCQkgICAgZG9fdHJhcF9vcl9icChyZWdzLCBiY29kZSwgIkJyZWFrIik7Ci0JCSAgICBnb3RvIG91dDsKKwkJCWJjb2RlID0gKGluc3RyWzBdID4+IDYpICYgMHgzZjsKKwkJCWRvX3RyYXBfb3JfYnAocmVncywgYmNvZGUsICJCcmVhayIpOworCQkJZ290byBvdXQ7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAoX19nZXRfdXNlcihvcGNvZGUsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGV4Y2VwdGlvbl9lcGMocmVncykpKQorCQlpZiAoX19nZXRfdXNlcihvcGNvZGUsCisJCQkgICAgICAgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgZXhjZXB0aW9uX2VwYyhyZWdzKSkpCiAJCQlnb3RvIG91dF9zaWdzZWd2OwogCX0KIApAQCAtOTE4LDYgKzkyOSw3IEBACiAJZG9fdHJhcF9vcl9icChyZWdzLCBiY29kZSwgIkJyZWFrIik7CiAKIG91dDoKKwlzZXRfZnMoc2VnKTsKIAlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKIAlyZXR1cm47CiAKQEAgLTkzMSw4ICs5NDMsMTMgQEAKIAl1MzIgb3Bjb2RlLCB0Y29kZSA9IDA7CiAJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKIAl1MTYgaW5zdHJbMl07CisJbW1fc2VnbWVudF90IHNlZzsKIAl1bnNpZ25lZCBsb25nIGVwYyA9IG1za19pc2ExNl9tb2RlKGV4Y2VwdGlvbl9lcGMocmVncykpOwogCisJc2VnID0gZ2V0X2ZzKCk7CisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXNldF9mcyhnZXRfZHMoKSk7CisKIAlwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CiAJaWYgKGdldF9pc2ExNl9tb2RlKHJlZ3MtPmNwMF9lcGMpKSB7CiAJCWlmIChfX2dldF91c2VyKGluc3RyWzBdLCAodTE2IF9fdXNlciAqKShlcGMgKyAwKSkgfHwKQEAgLTk1Myw2ICs5NzAsNyBAQAogCWRvX3RyYXBfb3JfYnAocmVncywgdGNvZGUsICJUcmFwIik7CiAKIG91dDoKKwlzZXRfZnMoc2VnKTsKIAlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKIAlyZXR1cm47CiAKQEAgLTEwNzQsNiArMTA5Miw3NiBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKK3N0YXRpYyBpbnQgZW5hYmxlX3Jlc3RvcmVfZnBfY29udGV4dChpbnQgbXNhKQoreworCWludCBlcnIsIHdhc19mcHVfb3duZXI7CisKKwlpZiAoIXVzZWRfbWF0aCgpKSB7CisJCS8qIEZpcnN0IHRpbWUgRlAgY29udGV4dCB1c2VyLiAqLworCQllcnIgPSBpbml0X2ZwdSgpOworCQlpZiAobXNhICYmICFlcnIpCisJCQllbmFibGVfbXNhKCk7CisJCWlmICghZXJyKQorCQkJc2V0X3VzZWRfbWF0aCgpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogVGhpcyB0YXNrIGhhcyBmb3JtZXJseSB1c2VkIHRoZSBGUCBjb250ZXh0LgorCSAqCisJICogSWYgdGhpcyB0aHJlYWQgaGFzIG5vIGxpdmUgTVNBIHZlY3RvciBjb250ZXh0IHRoZW4gd2UgY2FuIHNpbXBseQorCSAqIHJlc3RvcmUgdGhlIHNjYWxhciBGUCBjb250ZXh0LiBJZiBpdCBoYXMgbGl2ZSBNU0EgdmVjdG9yIGNvbnRleHQKKwkgKiAodGhhdCBpcywgaXQgaGFzIG9yIG1heSBoYXZlIHVzZWQgTVNBIHNpbmNlIGxhc3QgcGVyZm9ybWluZyBhCisJICogZnVuY3Rpb24gY2FsbCkgdGhlbiB3ZSdsbCBuZWVkIHRvIHJlc3RvcmUgdGhlIHZlY3RvciBjb250ZXh0LiBUaGlzCisJICogYXBwbGllcyBldmVuIGlmIHdlJ3JlIGN1cnJlbnRseSBvbmx5IGV4ZWN1dGluZyBhIHNjYWxhciBGUAorCSAqIGluc3RydWN0aW9uLiBUaGlzIGlzIGJlY2F1c2UgaWYgd2Ugd2VyZSB0byBsYXRlciBleGVjdXRlIGFuIE1TQQorCSAqIGluc3RydWN0aW9uIHRoZW4gd2UnZCBlaXRoZXIgaGF2ZSB0bzoKKwkgKgorCSAqICAtIFJlc3RvcmUgdGhlIHZlY3RvciBjb250ZXh0ICYgY2xvYmJlciBhbnkgcmVnaXN0ZXJzIG1vZGlmaWVkIGJ5CisJICogICAgc2NhbGFyIEZQIGluc3RydWN0aW9ucyBiZXR3ZWVuIG5vdyAmIHRoZW4uCisJICoKKwkgKiBvcgorCSAqCisJICogIC0gTm90IHJlc3RvcmUgdGhlIHZlY3RvciBjb250ZXh0ICYgbG9zZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzCisJICogICAgb2YgYWxsIHZlY3RvciByZWdpc3RlcnMuCisJICoKKwkgKiBOZWl0aGVyIG9mIHRob3NlIG9wdGlvbnMgaXMgYWNjZXB0YWJsZS4gV2UgY2Fubm90IHJlc3RvcmUgdGhlIGxlYXN0CisJICogc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgcmVnaXN0ZXJzIG5vdyAmIG9ubHkgcmVzdG9yZSB0aGUgbW9zdAorCSAqIHNpZ25pZmljYW50IGJpdHMgbGF0ZXIgYmVjYXVzZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGFueQorCSAqIHZlY3RvciByZWdpc3RlcnMgd2hvc2UgYWxpYXNlZCBGUCByZWdpc3RlciBpcyBtb2RpZmllZCBub3cgd2lsbCBoYXZlCisJICogYmVlbiB6ZXJvZWQuIFdlJ2QgaGF2ZSBubyB3YXkgdG8ga25vdyB0aGF0IHdoZW4gcmVzdG9yaW5nIHRoZSB2ZWN0b3IKKwkgKiBjb250ZXh0ICYgdGh1cyBtYXkgbG9hZCBhbiBvdXRkYXRlZCB2YWx1ZSBmb3IgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKKwkgKiBiaXRzIG9mIGEgdmVjdG9yIHJlZ2lzdGVyLgorCSAqLworCWlmICghbXNhICYmICF0aHJlYWRfbXNhX2NvbnRleHRfbGl2ZSgpKQorCQlyZXR1cm4gb3duX2ZwdSgxKTsKKworCS8qCisJICogVGhpcyB0YXNrIGlzIHVzaW5nIG9yIGhhcyBwcmV2aW91c2x5IHVzZWQgTVNBLiBUaHVzIHdlIHJlcXVpcmUKKwkgKiB0aGF0IFN0YXR1cy5GUiA9PSAxLgorCSAqLworCXdhc19mcHVfb3duZXIgPSBpc19mcHVfb3duZXIoKTsKKwllcnIgPSBvd25fZnB1KDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllbmFibGVfbXNhKCk7CisJd3JpdGVfbXNhX2NzcihjdXJyZW50LT50aHJlYWQuZnB1Lm1zYWNzcik7CisJc2V0X3RocmVhZF9mbGFnKFRJRl9VU0VETVNBKTsKKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHRoZSB0YXNrIGlzIHVzaW5nIE1TQSBhbmQgaXQgaGFzCisJICogcHJldmlvdXNseSB1c2VkIHNjYWxhciBGUCBpbiB0aGlzIHRpbWUgc2xpY2UgdGhlbiB3ZSBhbHJlYWR5IG5hdmUKKwkgKiBGUCBjb250ZXh0IHdoaWNoIHdlIHNob3VsZG4ndCBjbG9iYmVyLgorCSAqLworCWlmICghdGVzdF9hbmRfc2V0X3RocmVhZF9mbGFnKFRJRl9NU0FfQ1RYX0xJVkUpICYmIHdhc19mcHVfb3duZXIpCisJCXJldHVybiAwOworCisJLyogV2UgbmVlZCB0byByZXN0b3JlIHRoZSB2ZWN0b3IgY29udGV4dC4gKi8KKwlyZXN0b3JlX21zYShjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKwogYXNtbGlua2FnZSB2b2lkIGRvX2NwdShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAllbnVtIGN0eF9zdGF0ZSBwcmV2X3N0YXRlOwpAQCAtMTE1MywxMiArMTI0MSw3IEBACiAJCS8qIEZhbGwgdGhyb3VnaC4gICovCiAKIAljYXNlIDE6Ci0JCWlmICh1c2VkX21hdGgoKSkJLyogVXNpbmcgdGhlIEZQVSBhZ2Fpbi4JICovCi0JCQllcnIgPSBvd25fZnB1KDEpOwotCQllbHNlIHsJCQkvKiBGaXJzdCB0aW1lIEZQVSB1c2VyLgkgKi8KLQkJCWVyciA9IGluaXRfZnB1KCk7Ci0JCQlzZXRfdXNlZF9tYXRoKCk7Ci0JCX0KKwkJZXJyID0gZW5hYmxlX3Jlc3RvcmVfZnBfY29udGV4dCgwKTsKIAogCQlpZiAoIXJhd19jcHVfaGFzX2ZwdSB8fCBlcnIpIHsKIAkJCWludCBzaWc7CkBAIC0xMTgzLDYgKzEyNjYsMzcgQEAKIAlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKIH0KIAorYXNtbGlua2FnZSB2b2lkIGRvX21zYV9mcGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKKworCXByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKKwlkaWVfaWZfa2VybmVsKCJkb19tc2FfZnBlIGludm9rZWQgZnJvbSBrZXJuZWwgY29udGV4dCEiLCByZWdzKTsKKwlmb3JjZV9zaWcoU0lHRlBFLCBjdXJyZW50KTsKKwlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKK30KKworYXNtbGlua2FnZSB2b2lkIGRvX21zYShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwllbnVtIGN0eF9zdGF0ZSBwcmV2X3N0YXRlOworCWludCBlcnI7CisKKwlwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CisKKwlpZiAoIWNwdV9oYXNfbXNhIHx8IHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0ZQUkVHUykpIHsKKwkJZm9yY2Vfc2lnKFNJR0lMTCwgY3VycmVudCk7CisJCWdvdG8gb3V0OworCX0KKworCWRpZV9pZl9rZXJuZWwoImRvX21zYSBpbnZva2VkIGZyb20ga2VybmVsIGNvbnRleHQhIiwgcmVncyk7CisKKwllcnIgPSBlbmFibGVfcmVzdG9yZV9mcF9jb250ZXh0KDEpOworCWlmIChlcnIpCisJCWZvcmNlX3NpZyhTSUdJTEwsIGN1cnJlbnQpOworb3V0OgorCWV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOworfQorCiBhc21saW5rYWdlIHZvaWQgZG9fbWRteChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAllbnVtIGN0eF9zdGF0ZSBwcmV2X3N0YXRlOwpAQCAtMTMzNyw4ICsxNDUxLDEwIEBACiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV8xMDc0SzoKIAljYXNlIENQVV9JTlRFUkFQVElWOgogCWNhc2UgQ1BVX1BST0FQVElWOgorCWNhc2UgQ1BVX1A1NjAwOgogCQl7CiAjZGVmaW5lIEVSUkNUTF9QRQkweDgwMDAwMDAwCiAjZGVmaW5lIEVSUkNUTF9MMlAJMHgwMDgwMDAwMApAQCAtMjAxNyw2ICsyMTMzLDcgQEAKIAlzZXRfZXhjZXB0X3ZlY3RvcigxMSwgaGFuZGxlX2NwdSk7CiAJc2V0X2V4Y2VwdF92ZWN0b3IoMTIsIGhhbmRsZV9vdik7CiAJc2V0X2V4Y2VwdF92ZWN0b3IoMTMsIGhhbmRsZV90cik7CisJc2V0X2V4Y2VwdF92ZWN0b3IoMTQsIGhhbmRsZV9tc2FfZnBlKTsKIAogCWlmIChjdXJyZW50X2NwdV90eXBlKCkgPT0gQ1BVX1I2MDAwIHx8CiAJICAgIGN1cnJlbnRfY3B1X3R5cGUoKSA9PSBDUFVfUjYwMDBBKSB7CkBAIC0yMDQwLDYgKzIxNTcsNyBAQAogCQlzZXRfZXhjZXB0X3ZlY3RvcigxNSwgaGFuZGxlX2ZwZSk7CiAKIAlzZXRfZXhjZXB0X3ZlY3RvcigxNiwgaGFuZGxlX2Z0bGIpOworCXNldF9leGNlcHRfdmVjdG9yKDIxLCBoYW5kbGVfbXNhKTsKIAlzZXRfZXhjZXB0X3ZlY3RvcigyMiwgaGFuZGxlX21kbXgpOwogCiAJaWYgKGNwdV9oYXNfbWNoZWNrKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMKaW5kZXggYzM2OWE1ZC4uMmIzNTE3MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYworKysgYi9hcmNoL21pcHMva2VybmVsL3VuYWxpZ25lZC5jCkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMiBieSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIGFkZHJlc3MgZXJyb3IgZXhjZXB0aW9uIHdpdGggdGhlCiAgKiBzcGVjaWFsIGNhcGFiaWxpdHkgdG8gZXhlY3V0ZSBmYXVsdGluZyBpbnN0cnVjdGlvbnMgaW4gc29mdHdhcmUuICBUaGUKQEAgLTExMCw4ICsxMTEsOCBAQAogI2lmZGVmIF9fQklHX0VORElBTgogI2RlZmluZSAgICAgTG9hZEhXKGFkZHIsIHZhbHVlLCByZXMpICBcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fICgiLnNldFx0bm9hdFxuIiAgICAgICAgXAotCQkJIjE6XHRsYlx0JTAsIDAoJTIpXG4iICAgICAgICAgICAgICAgXAotCQkJIjI6XHRsYnVcdCQxLCAxKCUyKVxuXHQiICAgICAgICAgICAgXAorCQkJIjE6XHQidXNlcl9sYigiJTAiLCAiMCglMikiKSJcbiIgICAgXAorCQkJIjI6XHQidXNlcl9sYnUoIiQxIiwgIjEoJTIpIikiXG5cdCIgXAogCQkJInNsbFx0JTAsIDB4OFxuXHQiICAgICAgICAgICAgICAgICAgXAogCQkJIm9yXHQlMCwgJDFcblx0IiAgICAgICAgICAgICAgICAgICAgXAogCQkJImxpXHQlMSwgMFxuIiAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTMwLDggKzEzMSw4IEBACiAKICNkZWZpbmUgICAgIExvYWRXKGFkZHIsIHZhbHVlLCByZXMpICAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0bHdsXHQlMCwgKCUyKVxuIiAgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bHdyXHQlMCwgMyglMilcblx0IiAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbHdsKCIlMCIsICIoJTIpIikiXG4iICAgIFwKKwkJCSIyOlx0InVzZXJfbHdyKCIlMCIsICIzKCUyKSIpIlxuXHQiIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIzOlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuaW5zblxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE0OSw4ICsxNTAsOCBAQAogI2RlZmluZSAgICAgTG9hZEhXVShhZGRyLCB2YWx1ZSwgcmVzKSBcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fICggICAgICAgICAgICAgICAgICAgICAgXAogCQkJIi5zZXRcdG5vYXRcbiIgICAgICAgICAgICAgICAgICAgICAgXAotCQkJIjE6XHRsYnVcdCUwLCAwKCUyKVxuIiAgICAgICAgICAgICAgXAotCQkJIjI6XHRsYnVcdCQxLCAxKCUyKVxuXHQiICAgICAgICAgICAgXAorCQkJIjE6XHQidXNlcl9sYnUoIiUwIiwgIjAoJTIpIikiXG4iICAgXAorCQkJIjI6XHQidXNlcl9sYnUoIiQxIiwgIjEoJTIpIikiXG5cdCIgXAogCQkJInNsbFx0JTAsIDB4OFxuXHQiICAgICAgICAgICAgICAgICAgXAogCQkJIm9yXHQlMCwgJDFcblx0IiAgICAgICAgICAgICAgICAgICAgXAogCQkJImxpXHQlMSwgMFxuIiAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTcwLDggKzE3MSw4IEBACiAKICNkZWZpbmUgICAgIExvYWRXVShhZGRyLCB2YWx1ZSwgcmVzKSAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0bHdsXHQlMCwgKCUyKVxuIiAgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bHdyXHQlMCwgMyglMilcblx0IiAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbHdsKCIlMCIsICIoJTIpIikiXG4iICAgIFwKKwkJCSIyOlx0InVzZXJfbHdyKCIlMCIsICIzKCUyKSIpIlxuXHQiIFwKIAkJCSJkc2xsXHQlMCwgJTAsIDMyXG5cdCIgICAgICAgICAgICAgIFwKIAkJCSJkc3JsXHQlMCwgJTAsIDMyXG5cdCIgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIwOSw5ICsyMTAsOSBAQAogI2RlZmluZSAgICAgU3RvcmVIVyhhZGRyLCB2YWx1ZSwgcmVzKSBcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fICggICAgICAgICAgICAgICAgICAgICAgXAogCQkJIi5zZXRcdG5vYXRcbiIgICAgICAgICAgICAgICAgICAgICAgXAotCQkJIjE6XHRzYlx0JTEsIDEoJTIpXG5cdCIgICAgICAgICAgICAgXAorCQkJIjE6XHQidXNlcl9zYigiJTEiLCAiMSglMikiKSJcbiIgICAgXAogCQkJInNybFx0JDEsICUxLCAweDhcbiIgICAgICAgICAgICAgICAgXAotCQkJIjI6XHRzYlx0JDEsIDAoJTIpXG5cdCIgICAgICAgICAgICAgXAorCQkJIjI6XHQidXNlcl9zYigiJDEiLCAiMCglMikiKSJcbiIgICAgXAogCQkJIi5zZXRcdGF0XG5cdCIgICAgICAgICAgICAgICAgICAgICAgXAogCQkJImxpXHQlMCwgMFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJIjM6XG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjI5LDggKzIzMCw4IEBACiAKICNkZWZpbmUgICAgIFN0b3JlVyhhZGRyLCB2YWx1ZSwgcmVzKSAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0c3dsXHQlMSwoJTIpXG4iICAgICAgICAgICAgICAgIFwKLQkJCSIyOlx0c3dyXHQlMSwgMyglMilcblx0IiAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfc3dsKCIlMSIsICIoJTIpIikiXG4iICAgIFwKKwkJCSIyOlx0InVzZXJfc3dyKCIlMSIsICIzKCUyKSIpIlxuXHQiIFwKIAkJCSJsaVx0JTAsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIzOlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuaW5zblxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI2Nyw4ICsyNjgsOCBAQAogI2lmZGVmIF9fTElUVExFX0VORElBTgogI2RlZmluZSAgICAgTG9hZEhXKGFkZHIsIHZhbHVlLCByZXMpICBcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fICgiLnNldFx0bm9hdFxuIiAgICAgICAgXAotCQkJIjE6XHRsYlx0JTAsIDEoJTIpXG4iICAgICAgICAgICAgICAgXAotCQkJIjI6XHRsYnVcdCQxLCAwKCUyKVxuXHQiICAgICAgICAgICAgXAorCQkJIjE6XHQidXNlcl9sYigiJTAiLCAiMSglMikiKSJcbiIgICAgXAorCQkJIjI6XHQidXNlcl9sYnUoIiQxIiwgIjAoJTIpIikiXG5cdCIgXAogCQkJInNsbFx0JTAsIDB4OFxuXHQiICAgICAgICAgICAgICAgICAgXAogCQkJIm9yXHQlMCwgJDFcblx0IiAgICAgICAgICAgICAgICAgICAgXAogCQkJImxpXHQlMSwgMFxuIiAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjg3LDggKzI4OCw4IEBACiAKICNkZWZpbmUgICAgIExvYWRXKGFkZHIsIHZhbHVlLCByZXMpICAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0bHdsXHQlMCwgMyglMilcbiIgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bHdyXHQlMCwgKCUyKVxuXHQiICAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbHdsKCIlMCIsICIzKCUyKSIpIlxuIiAgIFwKKwkJCSIyOlx0InVzZXJfbHdyKCIlMCIsICIoJTIpIikiXG5cdCIgIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIzOlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuaW5zblxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMwNiw4ICszMDcsOCBAQAogI2RlZmluZSAgICAgTG9hZEhXVShhZGRyLCB2YWx1ZSwgcmVzKSBcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fICggICAgICAgICAgICAgICAgICAgICAgXAogCQkJIi5zZXRcdG5vYXRcbiIgICAgICAgICAgICAgICAgICAgICAgXAotCQkJIjE6XHRsYnVcdCUwLCAxKCUyKVxuIiAgICAgICAgICAgICAgXAotCQkJIjI6XHRsYnVcdCQxLCAwKCUyKVxuXHQiICAgICAgICAgICAgXAorCQkJIjE6XHQidXNlcl9sYnUoIiUwIiwgIjEoJTIpIikiXG4iICAgXAorCQkJIjI6XHQidXNlcl9sYnUoIiQxIiwgIjAoJTIpIikiXG5cdCIgXAogCQkJInNsbFx0JTAsIDB4OFxuXHQiICAgICAgICAgICAgICAgICAgXAogCQkJIm9yXHQlMCwgJDFcblx0IiAgICAgICAgICAgICAgICAgICAgXAogCQkJImxpXHQlMSwgMFxuIiAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzI3LDggKzMyOCw4IEBACiAKICNkZWZpbmUgICAgIExvYWRXVShhZGRyLCB2YWx1ZSwgcmVzKSAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0bHdsXHQlMCwgMyglMilcbiIgICAgICAgICAgICAgIFwKLQkJCSIyOlx0bHdyXHQlMCwgKCUyKVxuXHQiICAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfbHdsKCIlMCIsICIzKCUyKSIpIlxuIiAgIFwKKwkJCSIyOlx0InVzZXJfbHdyKCIlMCIsICIoJTIpIikiXG5cdCIgIFwKIAkJCSJkc2xsXHQlMCwgJTAsIDMyXG5cdCIgICAgICAgICAgICAgIFwKIAkJCSJkc3JsXHQlMCwgJTAsIDMyXG5cdCIgICAgICAgICAgICAgIFwKIAkJCSJsaVx0JTEsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM2Niw5ICszNjcsOSBAQAogI2RlZmluZSAgICAgU3RvcmVIVyhhZGRyLCB2YWx1ZSwgcmVzKSBcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fICggICAgICAgICAgICAgICAgICAgICAgXAogCQkJIi5zZXRcdG5vYXRcbiIgICAgICAgICAgICAgICAgICAgICAgXAotCQkJIjE6XHRzYlx0JTEsIDAoJTIpXG5cdCIgICAgICAgICAgICAgXAorCQkJIjE6XHQidXNlcl9zYigiJTEiLCAiMCglMikiKSJcbiIgICAgXAogCQkJInNybFx0JDEsJTEsIDB4OFxuIiAgICAgICAgICAgICAgICAgXAotCQkJIjI6XHRzYlx0JDEsIDEoJTIpXG5cdCIgICAgICAgICAgICAgXAorCQkJIjI6XHQidXNlcl9zYigiJDEiLCAiMSglMikiKSJcbiIgICAgXAogCQkJIi5zZXRcdGF0XG5cdCIgICAgICAgICAgICAgICAgICAgICAgXAogCQkJImxpXHQlMCwgMFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJIjM6XG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzg2LDggKzM4Nyw4IEBACiAKICNkZWZpbmUgICAgIFN0b3JlVyhhZGRyLCB2YWx1ZSwgcmVzKSAgXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSIxOlx0c3dsXHQlMSwgMyglMilcbiIgICAgICAgICAgICAgIFwKLQkJCSIyOlx0c3dyXHQlMSwgKCUyKVxuXHQiICAgICAgICAgICAgIFwKKwkJCSIxOlx0InVzZXJfc3dsKCIlMSIsICIzKCUyKSIpIlxuIiAgIFwKKwkJCSIyOlx0InVzZXJfc3dyKCIlMSIsICIoJTIpIikiXG5cdCIgIFwKIAkJCSJsaVx0JTAsIDBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIzOlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCSIuaW5zblxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQzMCw3ICs0MzEsOSBAQAogCXVuc2lnbmVkIGxvbmcgb3JpZ3BjOwogCXVuc2lnbmVkIGxvbmcgb3JpZzMxOwogCXZvaWQgX191c2VyICpmYXVsdF9hZGRyID0gTlVMTDsKLQorI2lmZGVmCUNPTkZJR19FVkEKKwltbV9zZWdtZW50X3Qgc2VnOworI2VuZGlmCiAJb3JpZ3BjID0gKHVuc2lnbmVkIGxvbmcpcGM7CiAJb3JpZzMxID0gcmVncy0+cmVnc1szMV07CiAKQEAgLTQ3NSw2ICs0NzgsODggQEAKIAkJICogVGhlIHJlbWFpbmluZyBvcGNvZGVzIGFyZSB0aGUgb25lcyB0aGF0IGFyZSByZWFsbHkgb2YKIAkJICogaW50ZXJlc3QuCiAJCSAqLworI2lmZGVmIENPTkZJR19FVkEKKwljYXNlIHNwZWMzX29wOgorCQkvKgorCQkgKiB3ZSBjYW4gbGFuZCBoZXJlIG9ubHkgZnJvbSBrZXJuZWwgYWNjZXNzaW5nIHVzZXIgbWVtb3J5LAorCQkgKiBzbyB3ZSBuZWVkIHRvICJzd2l0Y2giIHRoZSBhZGRyZXNzIGxpbWl0IHRvIHVzZXIgc3BhY2UsIHNvCisJCSAqIGFkZHJlc3MgY2hlY2sgY2FuIHdvcmsgcHJvcGVybHkuCisJCSAqLworCQlzZWcgPSBnZXRfZnMoKTsKKwkJc2V0X2ZzKFVTRVJfRFMpOworCQlzd2l0Y2ggKGluc24uc3BlYzNfZm9ybWF0LmZ1bmMpIHsKKwkJY2FzZSBsaGVfb3A6CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWRkciwgMikpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIHNpZ2J1czsKKwkJCX0KKwkJCUxvYWRIVyhhZGRyLCB2YWx1ZSwgcmVzKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIGZhdWx0OworCQkJfQorCQkJY29tcHV0ZV9yZXR1cm5fZXBjKHJlZ3MpOworCQkJcmVncy0+cmVnc1tpbnNuLnNwZWMzX2Zvcm1hdC5ydF0gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIGx3ZV9vcDoKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhZGRyLCA0KSkgeworCQkJCXNldF9mcyhzZWcpOworCQkJCWdvdG8gc2lnYnVzOworCQkJfQorCQkJCUxvYWRXKGFkZHIsIHZhbHVlLCByZXMpOworCQkJaWYgKHJlcykgeworCQkJCXNldF9mcyhzZWcpOworCQkJCWdvdG8gZmF1bHQ7CisJCQl9CisJCQljb21wdXRlX3JldHVybl9lcGMocmVncyk7CisJCQlyZWdzLT5yZWdzW2luc24uc3BlYzNfZm9ybWF0LnJ0XSA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgbGh1ZV9vcDoKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhZGRyLCAyKSkgeworCQkJCXNldF9mcyhzZWcpOworCQkJCWdvdG8gc2lnYnVzOworCQkJfQorCQkJTG9hZEhXVShhZGRyLCB2YWx1ZSwgcmVzKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIGZhdWx0OworCQkJfQorCQkJY29tcHV0ZV9yZXR1cm5fZXBjKHJlZ3MpOworCQkJcmVncy0+cmVnc1tpbnNuLnNwZWMzX2Zvcm1hdC5ydF0gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIHNoZV9vcDoKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYWRkciwgMikpIHsKKwkJCQlzZXRfZnMoc2VnKTsKKwkJCQlnb3RvIHNpZ2J1czsKKwkJCX0KKwkJCWNvbXB1dGVfcmV0dXJuX2VwYyhyZWdzKTsKKwkJCXZhbHVlID0gcmVncy0+cmVnc1tpbnNuLnNwZWMzX2Zvcm1hdC5ydF07CisJCQlTdG9yZUhXKGFkZHIsIHZhbHVlLCByZXMpOworCQkJaWYgKHJlcykgeworCQkJCXNldF9mcyhzZWcpOworCQkJCWdvdG8gZmF1bHQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBzd2Vfb3A6CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFkZHIsIDQpKSB7CisJCQkJc2V0X2ZzKHNlZyk7CisJCQkJZ290byBzaWdidXM7CisJCQl9CisJCQljb21wdXRlX3JldHVybl9lcGMocmVncyk7CisJCQl2YWx1ZSA9IHJlZ3MtPnJlZ3NbaW5zbi5zcGVjM19mb3JtYXQucnRdOworCQkJU3RvcmVXKGFkZHIsIHZhbHVlLCByZXMpOworCQkJaWYgKHJlcykgeworCQkJCXNldF9mcyhzZWcpOworCQkJCWdvdG8gZmF1bHQ7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNldF9mcyhzZWcpOworCQkJZ290byBzaWdpbGw7CisJCX0KKwkJc2V0X2ZzKHNlZyk7CisJCWJyZWFrOworI2VuZGlmCiAJY2FzZSBsaF9vcDoKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFkZHIsIDIpKQogCQkJZ290byBzaWdidXM7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvcGljdnVlX3Byb2MuYyBiL2FyY2gvbWlwcy9sYXNhdC9waWN2dWVfcHJvYy5jCmluZGV4IDYzOGM1ZGIuLjJiY2Q4MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9waWN2dWVfcHJvYy5jCisrKyBiL2FyY2gvbWlwcy9sYXNhdC9waWN2dWVfcHJvYy5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAlyZW1vdmVfcHJvY19lbnRyeSgic2Nyb2xsIiwgcHZjX2Rpc3BsYXlfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeShESVNQTEFZX0RJUl9OQU1FLCBOVUxMKTsKIAotCWRlbF90aW1lcigmdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZ0aW1lcik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHB2Y19wcm9jX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMgYi9hcmNoL21pcHMvbGliL2NzdW1fcGFydGlhbC5TCmluZGV4IGE2YWRmZmIuLjJlNDgyNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMKKysrIGIvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWwuUwpAQCAtOCw2ICs4LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIE1hY2llaiBXLiBSb3p5Y2tpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS5oPgpAQCAtMjk2LDcgKzI5Nyw3IEBACiAgKiBjaGVja3N1bSBhbmQgY29weSByb3V0aW5lcyBiYXNlZCBvbiBtZW1jcHkuUwogICoKICAqCWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc3JjLCBkc3QsIGxlbiwgc3VtKQotICoJX19jc3VtX3BhcnRpYWxfY29weV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwgZXJycCkKKyAqCV9fY3N1bV9wYXJ0aWFsX2NvcHlfa2VybmVsKHNyYywgZHN0LCBsZW4sIHN1bSwgZXJycCkKICAqCiAgKiBTZWUgIlNwZWMiIGluIG1lbWNweS5TIGZvciBkZXRhaWxzLglVbmxpa2UgX19jb3B5X3VzZXIsIGFsbAogICogZnVuY3Rpb24gaW4gdGhpcyBmaWxlIHVzZSB0aGUgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uLgpAQCAtMzI3LDIwICszMjgsNTggQEAKICAqIFRoZXNlIGhhbmRsZXJzIGRvIG5vdCBuZWVkIHRvIG92ZXJ3cml0ZSBhbnkgZGF0YS4KICAqLwogCi0jZGVmaW5lIEVYQyhpbnN0X3JlZyxhZGRyLGhhbmRsZXIpCQlcCi05OglpbnN0X3JlZywgYWRkcjsJCQkJXAotCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiOwkJXAotCVBUUgk5YiwgaGFuZGxlcjsJCQlcCi0JLnByZXZpb3VzCisvKiBJbnN0cnVjdGlvbiB0eXBlICovCisjZGVmaW5lIExEX0lOU04gMQorI2RlZmluZSBTVF9JTlNOIDIKKyNkZWZpbmUgTEVHQUNZX01PREUgMQorI2RlZmluZSBFVkFfTU9ERSAgICAyCisjZGVmaW5lIFVTRVJPUCAgIDEKKyNkZWZpbmUgS0VSTkVMT1AgMgorCisvKgorICogV3JhcHBlciB0byBhZGQgYW4gZW50cnkgaW4gdGhlIGV4Y2VwdGlvbiB0YWJsZQorICogaW4gY2FzZSB0aGUgaW5zbiBjYXVzZXMgYSBtZW1vcnkgZXhjZXB0aW9uLgorICogQXJndW1lbnRzOgorICogaW5zbiAgICA6IExvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24KKyAqIHR5cGUgICAgOiBJbnN0cnVjdGlvbiB0eXBlCisgKiByZWcgICAgIDogUmVnaXN0ZXIKKyAqIGFkZHIgICAgOiBBZGRyZXNzCisgKiBoYW5kbGVyIDogRXhjZXB0aW9uIGhhbmRsZXIKKyAqLworI2RlZmluZSBFWEMoaW5zbiwgdHlwZSwgcmVnLCBhZGRyLCBoYW5kbGVyKQlcCisJLmlmIFxtb2RlID09IExFR0FDWV9NT0RFOwkJXAorOToJCWluc24gcmVnLCBhZGRyOwkJCVwKKwkJLnNlY3Rpb24gX19leF90YWJsZSwiYSI7CVwKKwkJUFRSCTliLCBoYW5kbGVyOwkJXAorCQkucHJldmlvdXM7CQkJXAorCS8qIFRoaXMgaXMgZW5hYmxlZCBpbiBFVkEgbW9kZSAqLwlcCisJLmVsc2U7CQkJCQlcCisJCS8qIElmIGxvYWRpbmcgZnJvbSB1c2VyIG9yIHN0b3JpbmcgdG8gdXNlciAqLwlcCisJCS5pZiAoKFxmcm9tID09IFVTRVJPUCkgJiYgKHR5cGUgPT0gTERfSU5TTikpIHx8IFwKKwkJICAgICgoXHRvID09IFVTRVJPUCkgJiYgKHR5cGUgPT0gU1RfSU5TTikpOwlcCis5OgkJCV9fQlVJTERfRVZBX0lOU04oaW5zbiMjZSwgcmVnLCBhZGRyKTsJXAorCQkJLnNlY3Rpb24gX19leF90YWJsZSwiYSI7CQlcCisJCQlQVFIJOWIsIGhhbmRsZXI7CQkJXAorCQkJLnByZXZpb3VzOwkJCQlcCisJCS5lbHNlOwkJCQkJCVwKKwkJCS8qIEVWQSB3aXRob3V0IGV4Y2VwdGlvbiAqLwkJXAorCQkJaW5zbiByZWcsIGFkZHI7CQkJCVwKKwkJLmVuZGlmOwkJCQkJCVwKKwkuZW5kaWYKKworI3VuZGVmIExPQUQKIAogI2lmZGVmIFVTRV9ET1VCTEUKIAotI2RlZmluZSBMT0FEICAgbGQKLSNkZWZpbmUgTE9BREwgIGxkbAotI2RlZmluZSBMT0FEUiAgbGRyCi0jZGVmaW5lIFNUT1JFTCBzZGwKLSNkZWZpbmUgU1RPUkVSIHNkcgotI2RlZmluZSBTVE9SRSAgc2QKKyNkZWZpbmUgTE9BREsJbGQgLyogTm8gZXhjZXB0aW9uICovCisjZGVmaW5lIExPQUQocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobGQsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BREJVKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxidSwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBMT0FETChyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhsZGwsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BRFIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobGRyLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFQihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhzYiwgU1RfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRUwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2RsLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFUihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhzZHIsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkUocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2QsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKICNkZWZpbmUgQUREICAgIGRhZGR1CiAjZGVmaW5lIFNVQiAgICBkc3VidQogI2RlZmluZSBTUkwgICAgZHNybApAQCAtMzUyLDEyICszOTEsMTUgQEAKIAogI2Vsc2UKIAotI2RlZmluZSBMT0FEICAgbHcKLSNkZWZpbmUgTE9BREwgIGx3bAotI2RlZmluZSBMT0FEUiAgbHdyCi0jZGVmaW5lIFNUT1JFTCBzd2wKLSNkZWZpbmUgU1RPUkVSIHN3cgotI2RlZmluZSBTVE9SRSAgc3cKKyNkZWZpbmUgTE9BREsJbHcgLyogTm8gZXhjZXB0aW9uICovCisjZGVmaW5lIExPQUQocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobHcsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BREJVKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxidSwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBMT0FETChyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhsd2wsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BRFIocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobHdyLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFQihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhzYiwgU1RfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRUwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc3dsLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFUihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhzd3IsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkUocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc3csIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKICNkZWZpbmUgQUREICAgIGFkZHUKICNkZWZpbmUgU1VCICAgIHN1YnUKICNkZWZpbmUgU1JMICAgIHNybApAQCAtMzk2LDE0ICs0MzgsMjAgQEAKIAkuc2V0CWF0PXYxCiAjZW5kaWYKIAotTEVBRihfX2NzdW1fcGFydGlhbF9jb3B5X3VzZXIpCisJLm1hY3JvIF9fQlVJTERfQ1NVTV9QQVJUSUFMX0NPUFlfVVNFUiBtb2RlLCBmcm9tLCB0bywgX19ub2NoZWNrCisKIAlQVFJfQUREVQlBVCwgc3JjLCBsZW4JLyogU2VlICgxKSBhYm92ZS4gKi8KKwkvKiBpbml0aWFsaXplIF9fbm9jaGVjayBpZiB0aGlzIHRoZSBmaXJzdCB0aW1lIHdlIGV4ZWN1dGUgdGhpcworCSAqIG1hY3JvCisJICovCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJbW92ZQllcnJwdHIsIGE0CiAjZWxzZQogCWx3CWVycnB0ciwgMTYoc3ApCiAjZW5kaWYKLUZFWFBPUlQoY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjaykKKwkuaWYgXF9fbm9jaGVjayA9PSAxCisJRkVYUE9SVChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKQorCS5lbmRpZgogCW1vdmUJc3VtLCB6ZXJvCiAJbW92ZQlvZGQsIHplcm8KIAkvKgpAQCAtNDE5LDQ4ICs0NjcsNDggQEAKIAkgKi8KIAlzbHR1CXQyLCBsZW4sIE5CWVRFUwogCWFuZAl0MSwgZHN0LCBBRERSTUFTSwotCWJuZXoJdDIsIC5MY29weV9ieXRlc19jaGVja2xlbgorCWJuZXoJdDIsIC5MY29weV9ieXRlc19jaGVja2xlblxACiAJIGFuZAl0MCwgc3JjLCBBRERSTUFTSwogCWFuZGkJb2RkLCBkc3QsIDB4MQkJCS8qIG9kZCBidWZmZXI/ICovCi0JYm5legl0MSwgLkxkc3RfdW5hbGlnbmVkCisJYm5legl0MSwgLkxkc3RfdW5hbGlnbmVkXEAKIAkgbm9wCi0JYm5legl0MCwgLkxzcmNfdW5hbGlnbmVkX2RzdF9hbGlnbmVkCisJYm5legl0MCwgLkxzcmNfdW5hbGlnbmVkX2RzdF9hbGlnbmVkXEAKIAkvKgogCSAqIHVzZSBkZWxheSBzbG90IGZvciBmYWxsLXRocm91Z2gKIAkgKiBzcmMgYW5kIGRzdCBhcmUgYWxpZ25lZDsgbmVlZCB0byBjb21wdXRlIHJlbQogCSAqLwotLkxib3RoX2FsaWduZWQ6CisuTGJvdGhfYWxpZ25lZFxAOgogCSBTUkwJdDAsIGxlbiwgTE9HX05CWVRFUyszCSAjICszIGZvciA4IHVuaXRzL2l0ZXIKLQliZXF6CXQwLCAuTGNsZWFudXBfYm90aF9hbGlnbmVkICMgbGVuIDwgOCpOQllURVMKKwliZXF6CXQwLCAuTGNsZWFudXBfYm90aF9hbGlnbmVkXEAgIyBsZW4gPCA4Kk5CWVRFUwogCSBub3AKIAlTVUIJbGVuLCA4Kk5CWVRFUwkJIyBzdWJ0cmFjdCBoZXJlIGZvciBiZ2V6IGxvb3AKIAkuYWxpZ24JNAogMToKLUVYQygJTE9BRAl0MCwgVU5JVCgwKShzcmMpLAkuTGxfZXhjKQotRVhDKAlMT0FECXQxLCBVTklUKDEpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0MiwgVU5JVCgyKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDMsIFVOSVQoMykoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQ0LCBVTklUKDQpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0NSwgVU5JVCg1KShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDYsIFVOSVQoNikoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQ3LCBVTklUKDcpKHNyYyksCS5MbF9leGNfY29weSkKKwlMT0FEKHQwLCBVTklUKDApKHNyYyksIC5MbF9leGNcQCkKKwlMT0FEKHQxLCBVTklUKDEpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDIsIFVOSVQoMikoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTE9BRCh0MywgVU5JVCgzKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQ0LCBVTklUKDQpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDUsIFVOSVQoNSkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTE9BRCh0NiwgVU5JVCg2KShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQ3LCBVTklUKDcpKHNyYyksIC5MbF9leGNfY29weVxAKQogCVNVQglsZW4sIGxlbiwgOCpOQllURVMKIAlBREQJc3JjLCBzcmMsIDgqTkJZVEVTCi1FWEMoCVNUT1JFCXQwLCBVTklUKDApKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDAsIFVOSVQoMCkoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MCkKLUVYQygJU1RPUkUJdDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MSwgVU5JVCgxKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQxKQotRVhDKAlTVE9SRQl0MiwgVU5JVCgyKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQyLCBVTklUKDIpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDIpCi1FWEMoCVNUT1JFCXQzLCBVTklUKDMpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDMsIFVOSVQoMykoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MykKLUVYQygJU1RPUkUJdDQsIFVOSVQoNCkoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0NCwgVU5JVCg0KShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQ0KQotRVhDKAlTVE9SRQl0NSwgVU5JVCg1KShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQ1LCBVTklUKDUpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDUpCi1FWEMoCVNUT1JFCXQ2LCBVTklUKDYpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDYsIFVOSVQoNikoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0NikKLUVYQygJU1RPUkUJdDcsIFVOSVQoNykoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0NywgVU5JVCg3KShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQ3KQogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJZHN0LCBkc3QsIDgqTkJZVEVTCkBAIC00NzEsNDQgKzUxOSw0NCBAQAogCS8qCiAJICogbGVuID09IHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byBjb3B5IDwgOCpOQllURVMKIAkgKi8KLS5MY2xlYW51cF9ib3RoX2FsaWduZWQ6CisuTGNsZWFudXBfYm90aF9hbGlnbmVkXEA6CiAjZGVmaW5lIHJlbSB0NwotCWJlcXoJbGVuLCAuTGRvbmUKKwliZXF6CWxlbiwgLkxkb25lXEAKIAkgc2x0dQl0MCwgbGVuLCA0Kk5CWVRFUwotCWJuZXoJdDAsIC5MbGVzc190aGFuXzR1bml0cworCWJuZXoJdDAsIC5MbGVzc190aGFuXzR1bml0c1xACiAJIGFuZAlyZW0sIGxlbiwgKE5CWVRFUy0xKQkjIHJlbSA9IGxlbiAlIE5CWVRFUwogCS8qCiAJICogbGVuID49IDQqTkJZVEVTCiAJICovCi1FWEMoCUxPQUQJdDAsIFVOSVQoMCkoc3JjKSwJLkxsX2V4YykKLUVYQygJTE9BRAl0MSwgVU5JVCgxKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDIsIFVOSVQoMikoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQzLCBVTklUKDMpKHNyYyksCS5MbF9leGNfY29weSkKKwlMT0FEKHQwLCBVTklUKDApKHNyYyksIC5MbF9leGNcQCkKKwlMT0FEKHQxLCBVTklUKDEpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDIsIFVOSVQoMikoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTE9BRCh0MywgVU5JVCgzKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKIAlTVUIJbGVuLCBsZW4sIDQqTkJZVEVTCiAJQURECXNyYywgc3JjLCA0Kk5CWVRFUwotRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQwLCBVTklUKDApKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDApCi1FWEMoCVNUT1JFCXQxLCBVTklUKDEpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MSkKLUVYQygJU1RPUkUJdDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MiwgVU5JVCgyKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQyKQotRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQzLCBVTklUKDMpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDMpCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgNCpOQllURVMKLQliZXF6CWxlbiwgLkxkb25lCisJYmVxeglsZW4sIC5MZG9uZVxACiAJLnNldAlub3Jlb3JkZXIKLS5MbGVzc190aGFuXzR1bml0czoKKy5MbGVzc190aGFuXzR1bml0c1xAOgogCS8qCiAJICogcmVtID0gbGVuICUgTkJZVEVTCiAJICovCi0JYmVxCXJlbSwgbGVuLCAuTGNvcHlfYnl0ZXMKKwliZXEJcmVtLCBsZW4sIC5MY29weV9ieXRlc1xACiAJIG5vcAogMToKLUVYQygJTE9BRAl0MCwgMChzcmMpLAkJLkxsX2V4YykKKwlMT0FEKHQwLCAwKHNyYyksIC5MbF9leGNcQCkKIAlBREQJc3JjLCBzcmMsIE5CWVRFUwogCVNVQglsZW4sIGxlbiwgTkJZVEVTCi1FWEMoCVNUT1JFCXQwLCAwKGRzdCksCQkuTHNfZXhjKQorCVNUT1JFKHQwLCAwKGRzdCksIC5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDApCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgTkJZVEVTCkBAIC01MjcsMjAgKzU3NSwyMCBAQAogCSAqIG1vcmUgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uCiAJICovCiAjZGVmaW5lIGJpdHMgdDIKLQliZXF6CWxlbiwgLkxkb25lCisJYmVxeglsZW4sIC5MZG9uZVxACiAJIEFERAl0MSwgZHN0LCBsZW4JIyB0MSBpcyBqdXN0IHBhc3QgbGFzdCBieXRlIG9mIGRzdAogCWxpCWJpdHMsIDgqTkJZVEVTCiAJU0xMCXJlbSwgbGVuLCAzCSMgcmVtID0gbnVtYmVyIG9mIGJpdHMgdG8ga2VlcAotRVhDKAlMT0FECXQwLCAwKHNyYyksCQkuTGxfZXhjKQorCUxPQUQodDAsIDAoc3JjKSwgLkxsX2V4Y1xAKQogCVNVQgliaXRzLCBiaXRzLCByZW0gIyBiaXRzID0gbnVtYmVyIG9mIGJpdHMgdG8gZGlzY2FyZAogCVNISUZUX0RJU0NBUkQgdDAsIHQwLCBiaXRzCi1FWEMoCVNUUkVTVAl0MCwgLTEodDEpLAkJLkxzX2V4YykKKwlTVFJFU1QodDAsIC0xKHQxKSwgLkxzX2V4Y1xAKQogCVNISUZUX0RJU0NBUkRfUkVWRVJUIHQwLCB0MCwgYml0cwogCS5zZXQgcmVvcmRlcgogCUFEREMoc3VtLCB0MCkKLQliCS5MZG9uZQorCWIJLkxkb25lXEAKIAkuc2V0IG5vcmVvcmRlcgotLkxkc3RfdW5hbGlnbmVkOgorLkxkc3RfdW5hbGlnbmVkXEA6CiAJLyoKIAkgKiBkc3QgaXMgdW5hbGlnbmVkCiAJICogdDAgPSBzcmMgJiBBRERSTUFTSwpAQCAtNTUxLDI1ICs1OTksMjUgQEAKIAkgKiBTZXQgbWF0Y2ggPSAoc3JjIGFuZCBkc3QgaGF2ZSBzYW1lIGFsaWdubWVudCkKIAkgKi8KICNkZWZpbmUgbWF0Y2ggcmVtCi1FWEMoCUxERklSU1QgdDMsIEZJUlNUKDApKHNyYyksCS5MbF9leGMpCisJTERGSVJTVCh0MywgRklSU1QoMCkoc3JjKSwgLkxsX2V4Y1xAKQogCUFERAl0MiwgemVybywgTkJZVEVTCi1FWEMoCUxEUkVTVAl0MywgUkVTVCgwKShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTERSRVNUKHQzLCBSRVNUKDApKHNyYyksIC5MbF9leGNfY29weVxAKQogCVNVQgl0MiwgdDIsIHQxCSMgdDIgPSBudW1iZXIgb2YgYnl0ZXMgY29waWVkCiAJeG9yCW1hdGNoLCB0MCwgdDEKLUVYQygJU1RGSVJTVCB0MywgRklSU1QoMCkoZHN0KSwJLkxzX2V4YykKKwlTVEZJUlNUKHQzLCBGSVJTVCgwKShkc3QpLCAuTHNfZXhjXEApCiAJU0xMCXQ0LCB0MSwgMwkJIyB0NCA9IG51bWJlciBvZiBiaXRzIHRvIGRpc2NhcmQKIAlTSElGVF9ESVNDQVJEIHQzLCB0MywgdDQKIAkvKiBubyBTSElGVF9ESVNDQVJEX1JFVkVSVCB0byBoYW5kbGUgb2RkIGJ1ZmZlciBwcm9wZXJseSAqLwogCUFEREMoc3VtLCB0MykKLQliZXEJbGVuLCB0MiwgLkxkb25lCisJYmVxCWxlbiwgdDIsIC5MZG9uZVxACiAJIFNVQglsZW4sIGxlbiwgdDIKIAlBREQJZHN0LCBkc3QsIHQyCi0JYmVxegltYXRjaCwgLkxib3RoX2FsaWduZWQKKwliZXF6CW1hdGNoLCAuTGJvdGhfYWxpZ25lZFxACiAJIEFERAlzcmMsIHNyYywgdDIKIAotLkxzcmNfdW5hbGlnbmVkX2RzdF9hbGlnbmVkOgorLkxzcmNfdW5hbGlnbmVkX2RzdF9hbGlnbmVkXEA6CiAJU1JMCXQwLCBsZW4sIExPR19OQllURVMrMgkgIyArMiBmb3IgNCB1bml0cy9pdGVyCi0JYmVxegl0MCwgLkxjbGVhbnVwX3NyY191bmFsaWduZWQKKwliZXF6CXQwLCAuTGNsZWFudXBfc3JjX3VuYWxpZ25lZFxACiAJIGFuZAlyZW0sIGxlbiwgKDQqTkJZVEVTLTEpCSAjIHJlbSA9IGxlbiAlIDQqTkJZVEVTCiAxOgogLyoKQEAgLTU3OCw1MyArNjI2LDUzIEBACiAgKiBJdCdzIE9LIHRvIGxvYWQgRklSU1QoTisxKSBiZWZvcmUgUkVTVChOKSBiZWNhdXNlIHRoZSB0d28gYWRkcmVzc2VzCiAgKiBhcmUgdG8gdGhlIHNhbWUgdW5pdCAodW5sZXNzIHNyYyBpcyBhbGlnbmVkLCBidXQgaXQncyBub3QpLgogICovCi1FWEMoCUxERklSU1QgdDAsIEZJUlNUKDApKHNyYyksCS5MbF9leGMpCi1FWEMoCUxERklSU1QgdDEsIEZJUlNUKDEpKHNyYyksCS5MbF9leGNfY29weSkKKwlMREZJUlNUKHQwLCBGSVJTVCgwKShzcmMpLCAuTGxfZXhjXEApCisJTERGSVJTVCh0MSwgRklSU1QoMSkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJU1VCCWxlbiwgbGVuLCA0Kk5CWVRFUwotRVhDKAlMRFJFU1QJdDAsIFJFU1QoMCkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMRFJFU1QJdDEsIFJFU1QoMSkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMREZJUlNUIHQyLCBGSVJTVCgyKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxERklSU1QgdDMsIEZJUlNUKDMpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTERSRVNUCXQyLCBSRVNUKDIpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTERSRVNUCXQzLCBSRVNUKDMpKHNyYyksCS5MbF9leGNfY29weSkKKwlMRFJFU1QodDAsIFJFU1QoMCkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTERSRVNUKHQxLCBSRVNUKDEpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxERklSU1QodDIsIEZJUlNUKDIpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxERklSU1QodDMsIEZJUlNUKDMpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxEUkVTVCh0MiwgUkVTVCgyKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMRFJFU1QodDMsIFJFU1QoMykoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJQURECXNyYywgc3JjLCA0Kk5CWVRFUwogI2lmZGVmIENPTkZJR19DUFVfU0IxCiAJbm9wCQkJCSMgaW1wcm92ZXMgc2xvdHRpbmcKICNlbmRpZgotRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQwLCBVTklUKDApKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDApCi1FWEMoCVNUT1JFCXQxLCBVTklUKDEpKGRzdCksCS5Mc19leGMpCisJU1RPUkUodDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4Y1xAKQogCUFEREMoc3VtLCB0MSkKLUVYQygJU1RPUkUJdDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4YykKKwlTVE9SRSh0MiwgVU5JVCgyKShkc3QpLAkuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQyKQotRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjKQorCVNUT1JFKHQzLCBVTklUKDMpKGRzdCksCS5Mc19leGNcQCkKIAlBRERDKHN1bSwgdDMpCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgNCpOQllURVMKIAlibmUJbGVuLCByZW0sIDFiCiAJLnNldAlub3Jlb3JkZXIKIAotLkxjbGVhbnVwX3NyY191bmFsaWduZWQ6Ci0JYmVxeglsZW4sIC5MZG9uZQorLkxjbGVhbnVwX3NyY191bmFsaWduZWRcQDoKKwliZXF6CWxlbiwgLkxkb25lXEAKIAkgYW5kCXJlbSwgbGVuLCBOQllURVMtMSAgIyByZW0gPSBsZW4gJSBOQllURVMKLQliZXEJcmVtLCBsZW4sIC5MY29weV9ieXRlcworCWJlcQlyZW0sIGxlbiwgLkxjb3B5X2J5dGVzXEAKIAkgbm9wCiAxOgotRVhDKAlMREZJUlNUIHQwLCBGSVJTVCgwKShzcmMpLAkuTGxfZXhjKQotRVhDKAlMRFJFU1QJdDAsIFJFU1QoMCkoc3JjKSwJLkxsX2V4Y19jb3B5KQorCUxERklSU1QodDAsIEZJUlNUKDApKHNyYyksIC5MbF9leGNcQCkKKwlMRFJFU1QodDAsIFJFU1QoMCkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJQURECXNyYywgc3JjLCBOQllURVMKIAlTVUIJbGVuLCBsZW4sIE5CWVRFUwotRVhDKAlTVE9SRQl0MCwgMChkc3QpLAkJLkxzX2V4YykKKwlTVE9SRSh0MCwgMChkc3QpLCAuTHNfZXhjXEApCiAJQUREQyhzdW0sIHQwKQogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJZHN0LCBkc3QsIE5CWVRFUwogCWJuZQlsZW4sIHJlbSwgMWIKIAkuc2V0CW5vcmVvcmRlcgogCi0uTGNvcHlfYnl0ZXNfY2hlY2tsZW46Ci0JYmVxeglsZW4sIC5MZG9uZQorLkxjb3B5X2J5dGVzX2NoZWNrbGVuXEA6CisJYmVxeglsZW4sIC5MZG9uZVxACiAJIG5vcAotLkxjb3B5X2J5dGVzOgorLkxjb3B5X2J5dGVzXEA6CiAJLyogMCA8IGxlbiA8IE5CWVRFUyAgKi8KICNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KICNkZWZpbmUgU0hJRlRfU1RBUlQgMApAQCAtNjM3LDEyICs2ODUsMTIgQEAKIAlsaQl0MywgU0hJRlRfU1RBUlQgIyBzaGlmdAogLyogdXNlIC5MbF9leGNfY29weSBoZXJlIHRvIHJldHVybiBjb3JyZWN0IHN1bSBvbiBmYXVsdCAqLwogI2RlZmluZSBDT1BZX0JZVEUoTikJCQlcCi1FWEMoCWxidQl0MCwgTihzcmMpLCAuTGxfZXhjX2NvcHkpOwlcCisJTE9BREJVKHQwLCBOKHNyYyksIC5MbF9leGNfY29weVxAKTsJXAogCVNVQglsZW4sIGxlbiwgMTsJCVwKLUVYQygJc2IJdDAsIE4oZHN0KSwgLkxzX2V4Yyk7CVwKKwlTVE9SRUIodDAsIE4oZHN0KSwgLkxzX2V4Y1xAKTsJXAogCVNMTFYJdDAsIHQwLCB0MzsJCVwKIAlhZGR1CXQzLCBTSElGVF9JTkM7CQlcCi0JYmVxeglsZW4sIC5MY29weV9ieXRlc19kb25lOyBcCisJYmVxeglsZW4sIC5MY29weV9ieXRlc19kb25lXEA7IFwKIAkgb3IJdDIsIHQwCiAKIAlDT1BZX0JZVEUoMCkKQEAgLTY1MywxNCArNzAxLDE0IEBACiAJQ09QWV9CWVRFKDQpCiAJQ09QWV9CWVRFKDUpCiAjZW5kaWYKLUVYQygJbGJ1CXQwLCBOQllURVMtMihzcmMpLCAuTGxfZXhjX2NvcHkpCisJTE9BREJVKHQwLCBOQllURVMtMihzcmMpLCAuTGxfZXhjX2NvcHlcQCkKIAlTVUIJbGVuLCBsZW4sIDEKLUVYQygJc2IJdDAsIE5CWVRFUy0yKGRzdCksIC5Mc19leGMpCisJU1RPUkVCKHQwLCBOQllURVMtMihkc3QpLCAuTHNfZXhjXEApCiAJU0xMVgl0MCwgdDAsIHQzCiAJb3IJdDIsIHQwCi0uTGNvcHlfYnl0ZXNfZG9uZToKKy5MY29weV9ieXRlc19kb25lXEA6CiAJQUREQyhzdW0sIHQyKQotLkxkb25lOgorLkxkb25lXEA6CiAJLyogZm9sZCBjaGVja3N1bSAqLwogI2lmZGVmIFVTRV9ET1VCTEUKIAlkc2xsMzIJdjEsIHN1bSwgMApAQCAtNjg5LDcgKzczNyw3IEBACiAJanIJcmEKIAkuc2V0IG5vcmVvcmRlcgogCi0uTGxfZXhjX2NvcHk6CisuTGxfZXhjX2NvcHlcQDoKIAkvKgogCSAqIENvcHkgYnl0ZXMgZnJvbSBzcmMgdW50aWwgZmF1bHRpbmcgbG9hZCBhZGRyZXNzIChvciB1bnRpbCBhCiAJICogbGIgZmF1bHRzKQpAQCAtNzAwLDExICs3NDgsMTEgQEAKIAkgKgogCSAqIEFzc3VtZXMgc3JjIDwgVEhSRUFEX0JVQUREUigkMjgpCiAJICovCi0JTE9BRAl0MCwgVElfVEFTSygkMjgpCisJTE9BREsJdDAsIFRJX1RBU0soJDI4KQogCSBsaQl0MiwgU0hJRlRfU1RBUlQKLQlMT0FECXQwLCBUSFJFQURfQlVBRERSKHQwKQorCUxPQURLCXQwLCBUSFJFQURfQlVBRERSKHQwKQogMToKLUVYQygJbGJ1CXQxLCAwKHNyYyksCS5MbF9leGMpCisJTE9BREJVKHQxLCAwKHNyYyksIC5MbF9leGNcQCkKIAlBREQJc3JjLCBzcmMsIDEKIAlzYgl0MSwgMChkc3QpCSMgY2FuJ3QgZmF1bHQgLS0gd2UncmUgY29weV9mcm9tX3VzZXIKIAlTTExWCXQxLCB0MSwgdDIKQEAgLTcxNCwxMCArNzYyLDEwIEBACiAJQURECWRzdCwgZHN0LCAxCiAJYm5lCXNyYywgdDAsIDFiCiAJLnNldAlub3Jlb3JkZXIKLS5MbF9leGM6Ci0JTE9BRAl0MCwgVElfVEFTSygkMjgpCisuTGxfZXhjXEA6CisJTE9BREsJdDAsIFRJX1RBU0soJDI4KQogCSBub3AKLQlMT0FECXQwLCBUSFJFQURfQlVBRERSKHQwKQkjIHQwIGlzIGp1c3QgcGFzdCBsYXN0IGdvb2QgYWRkcmVzcworCUxPQURLCXQwLCBUSFJFQURfQlVBRERSKHQwKQkjIHQwIGlzIGp1c3QgcGFzdCBsYXN0IGdvb2QgYWRkcmVzcwogCSBub3AKIAlTVUIJbGVuLCBBVCwgdDAJCSMgbGVuIG51bWJlciBvZiB1bmNvcGllZCBieXRlcwogCS8qCkBAIC03MzMsNyArNzgxLDcgQEAKIAkgKi8KIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCiAJU1VCCXNyYywgbGVuLCAxCi0JYmVxeglsZW4sIC5MZG9uZQorCWJlcXoJbGVuLCAuTGRvbmVcQAogCS5zZXQJbm9yZW9yZGVyCiAxOglzYgl6ZXJvLCAwKGRzdCkKIAlBREQJZHN0LCBkc3QsIDEKQEAgLTc0OCwxMyArNzk2LDMxIEBACiAJIFNVQglzcmMsIHNyYywgdjEKICNlbmRpZgogCWxpCXYxLCAtRUZBVUxUCi0JYgkuTGRvbmUKKwliCS5MZG9uZVxACiAJIHN3CXYxLCAoZXJycHRyKQogCi0uTHNfZXhjOgorLkxzX2V4Y1xAOgogCWxpCXYwLCAtMSAvKiBpbnZhbGlkIGNoZWNrc3VtICovCiAJbGkJdjEsIC1FRkFVTFQKIAlqcglyYQogCSBzdwl2MSwgKGVycnB0cikKIAkuc2V0CXBvcAotCUVORChfX2NzdW1fcGFydGlhbF9jb3B5X3VzZXIpCisJLmVuZG0KKworTEVBRihfX2NzdW1fcGFydGlhbF9jb3B5X2tlcm5lbCkKKyNpZm5kZWYgQ09ORklHX0VWQQorRkVYUE9SVChfX2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIpCitGRVhQT1JUKF9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKQorI2VuZGlmCitfX0JVSUxEX0NTVU1fUEFSVElBTF9DT1BZX1VTRVIgTEVHQUNZX01PREUgVVNFUk9QIFVTRVJPUCAxCitFTkQoX19jc3VtX3BhcnRpYWxfY29weV9rZXJuZWwpCisKKyNpZmRlZiBDT05GSUdfRVZBCitMRUFGKF9fY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcikKK19fQlVJTERfQ1NVTV9QQVJUSUFMX0NPUFlfVVNFUiBFVkFfTU9ERSBLRVJORUxPUCBVU0VST1AgMAorRU5EKF9fY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcikKKworTEVBRihfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcikKK19fQlVJTERfQ1NVTV9QQVJUSUFMX0NPUFlfVVNFUiBFVkFfTU9ERSBVU0VST1AgS0VSTkVMT1AgMAorRU5EKF9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL21lbWNweS5TIGIvYXJjaC9taXBzL2xpYi9tZW1jcHkuUwppbmRleCBjNWM0MGRhLi5jMTdlZjgwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL21lbWNweS5TCisrKyBiL2FyY2gvbWlwcy9saWIvbWVtY3B5LlMKQEAgLTEwLDYgKzEwLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiBCcm9hZGNvbSwgSW5jLgogICogICBtZW1jcHkvY29weV91c2VyIGF1dGhvcjogTWFyayBWYW5kZXZvb3JkZQogICogQ29weXJpZ2h0IChDKSAyMDA3ICBNYWNpZWogVy4gUm96eWNraQorICogQ29weXJpZ2h0IChDKSAyMDE0IEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiAgKgogICogTW5lbW9uaWMgbmFtZXMgZm9yIGFyZ3VtZW50cyB0byBtZW1jcHkvX19jb3B5X3VzZXIKICAqLwpAQCAtODUsMTEgKzg2LDUxIEBACiAgKiB0aGV5J3JlIG5vdCBwcm90ZWN0ZWQuCiAgKi8KIAotI2RlZmluZSBFWEMoaW5zdF9yZWcsYWRkcixoYW5kbGVyKQkJXAotOToJaW5zdF9yZWcsIGFkZHI7CQkJCVwKLQkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIjsJCVwKLQlQVFIJOWIsIGhhbmRsZXI7CQkJXAotCS5wcmV2aW91cworLyogSW5zdHJ1Y3Rpb24gdHlwZSAqLworI2RlZmluZSBMRF9JTlNOIDEKKyNkZWZpbmUgU1RfSU5TTiAyCisvKiBQcmV0ZWNoIHR5cGUgKi8KKyNkZWZpbmUgU1JDX1BSRUZFVENIIDEKKyNkZWZpbmUgRFNUX1BSRUZFVENIIDIKKyNkZWZpbmUgTEVHQUNZX01PREUgMQorI2RlZmluZSBFVkFfTU9ERSAgICAyCisjZGVmaW5lIFVTRVJPUCAgIDEKKyNkZWZpbmUgS0VSTkVMT1AgMgorCisvKgorICogV3JhcHBlciB0byBhZGQgYW4gZW50cnkgaW4gdGhlIGV4Y2VwdGlvbiB0YWJsZQorICogaW4gY2FzZSB0aGUgaW5zbiBjYXVzZXMgYSBtZW1vcnkgZXhjZXB0aW9uLgorICogQXJndW1lbnRzOgorICogaW5zbiAgICA6IExvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24KKyAqIHR5cGUgICAgOiBJbnN0cnVjdGlvbiB0eXBlCisgKiByZWcgICAgIDogUmVnaXN0ZXIKKyAqIGFkZHIgICAgOiBBZGRyZXNzCisgKiBoYW5kbGVyIDogRXhjZXB0aW9uIGhhbmRsZXIKKyAqLworCisjZGVmaW5lIEVYQyhpbnNuLCB0eXBlLCByZWcsIGFkZHIsIGhhbmRsZXIpCQkJXAorCS5pZiBcbW9kZSA9PSBMRUdBQ1lfTU9ERTsJCQkJXAorOToJCWluc24gcmVnLCBhZGRyOwkJCQkJXAorCQkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIjsJCQlcCisJCVBUUgk5YiwgaGFuZGxlcjsJCQkJXAorCQkucHJldmlvdXM7CQkJCQlcCisJLyogVGhpcyBpcyBhc3NlbWJsZWQgaW4gRVZBIG1vZGUgKi8JCQlcCisJLmVsc2U7CQkJCQkJCVwKKwkJLyogSWYgbG9hZGluZyBmcm9tIHVzZXIgb3Igc3RvcmluZyB0byB1c2VyICovCVwKKwkJLmlmICgoXGZyb20gPT0gVVNFUk9QKSAmJiAodHlwZSA9PSBMRF9JTlNOKSkgfHwgXAorCQkgICAgKChcdG8gPT0gVVNFUk9QKSAmJiAodHlwZSA9PSBTVF9JTlNOKSk7CVwKKzk6CQkJX19CVUlMRF9FVkFfSU5TTihpbnNuIyNlLCByZWcsIGFkZHIpOwlcCisJCQkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIjsJCVwKKwkJCVBUUgk5YiwgaGFuZGxlcjsJCQlcCisJCQkucHJldmlvdXM7CQkJCVwKKwkJLmVsc2U7CQkJCQkJXAorCQkJLyoJCQkJCVwKKwkJCSAqICBTdGlsbCBpbiBFVkEsIGJ1dCBubyBuZWVkIGZvcglcCisJCQkgKiBleGNlcHRpb24gaGFuZGxlciBvciBFVkEgaW5zbglcCisJCQkgKi8JCQkJCVwKKwkJCWluc24gcmVnLCBhZGRyOwkJCQlcCisJCS5lbmRpZjsJCQkJCQlcCisJLmVuZGlmCiAKIC8qCiAgKiBPbmx5IG9uIHRoZSA2NC1iaXQga2VybmVsIHdlIGNhbiBtYWRlIHVzZSBvZiA2NC1iaXQgcmVnaXN0ZXJzLgpAQCAtMTAwLDEyICsxNDEsMTMgQEAKIAogI2lmZGVmIFVTRV9ET1VCTEUKIAotI2RlZmluZSBMT0FEICAgbGQKLSNkZWZpbmUgTE9BREwgIGxkbAotI2RlZmluZSBMT0FEUiAgbGRyCi0jZGVmaW5lIFNUT1JFTCBzZGwKLSNkZWZpbmUgU1RPUkVSIHNkcgotI2RlZmluZSBTVE9SRSAgc2QKKyNkZWZpbmUgTE9BREsgbGQgLyogTm8gZXhjZXB0aW9uICovCisjZGVmaW5lIExPQUQocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobGQsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BREwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobGRsLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURSKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxkciwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRUwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2RsLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFUihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhzZHIsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkUocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc2QsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKICNkZWZpbmUgQUREICAgIGRhZGR1CiAjZGVmaW5lIFNVQiAgICBkc3VidQogI2RlZmluZSBTUkwgICAgZHNybApAQCAtMTM2LDEyICsxNzgsMTMgQEAKIAogI2Vsc2UKIAotI2RlZmluZSBMT0FEICAgbHcKLSNkZWZpbmUgTE9BREwgIGx3bAotI2RlZmluZSBMT0FEUiAgbHdyCi0jZGVmaW5lIFNUT1JFTCBzd2wKLSNkZWZpbmUgU1RPUkVSIHN3cgotI2RlZmluZSBTVE9SRSAgc3cKKyNkZWZpbmUgTE9BREsgbHcgLyogTm8gZXhjZXB0aW9uICovCisjZGVmaW5lIExPQUQocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobHcsIExEX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgTE9BREwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMobHdsLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIExPQURSKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGx3ciwgTERfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorI2RlZmluZSBTVE9SRUwocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc3dsLCBTVF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFUihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhzd3IsIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKKyNkZWZpbmUgU1RPUkUocmVnLCBhZGRyLCBoYW5kbGVyKQlFWEMoc3csIFNUX0lOU04sIHJlZywgYWRkciwgaGFuZGxlcikKICNkZWZpbmUgQUREICAgIGFkZHUKICNkZWZpbmUgU1VCICAgIHN1YnUKICNkZWZpbmUgU1JMICAgIHNybApAQCAtMTU0LDYgKzE5NywzMyBAQAogCiAjZW5kaWYgLyogVVNFX0RPVUJMRSAqLwogCisjZGVmaW5lIExPQURCKHJlZywgYWRkciwgaGFuZGxlcikJRVhDKGxiLCBMRF9JTlNOLCByZWcsIGFkZHIsIGhhbmRsZXIpCisjZGVmaW5lIFNUT1JFQihyZWcsIGFkZHIsIGhhbmRsZXIpCUVYQyhzYiwgU1RfSU5TTiwgcmVnLCBhZGRyLCBoYW5kbGVyKQorCisjZGVmaW5lIF9QUkVGKGhpbnQsIGFkZHIsIHR5cGUpCQkJCQkJXAorCS5pZiBcbW9kZSA9PSBMRUdBQ1lfTU9ERTsJCQkJCVwKKwkJUFJFRihoaW50LCBhZGRyKTsJCQkJCVwKKwkuZWxzZTsJCQkJCQkJCVwKKwkJLmlmICgoXGZyb20gPT0gVVNFUk9QKSAmJiAodHlwZSA9PSBTUkNfUFJFRkVUQ0gpKSB8fAlcCisJCSAgICAoKFx0byA9PSBVU0VST1ApICYmICh0eXBlID09IERTVF9QUkVGRVRDSCkpOwlcCisJCQkvKgkJCQkJCVwKKwkJCSAqIFBSRUZFIGhhcyBvbmx5IDkgYml0cyBmb3IgdGhlIG9mZnNldAkJXAorCQkJICogY29tcGFyZWQgdG8gUFJFRiB3aGljaCBoYXMgMTYsIHNvIGl0IG1heQlcCisJCQkgKiBuZWVkIHRvIHVzZSB0aGUgJGF0IHJlZ2lzdGVyIGJ1dCB0aGlzCVwKKwkJCSAqIHJlZ2lzdGVyIHNob3VsZCByZW1haW4gaW50YWN0IGJlY2F1c2UgaXQncwlcCisJCQkgKiB1c2VkIGxhdGVyIG9uLiBUaGVyZWZvcmUgdXNlICR2MS4JCVwKKwkJCSAqLwkJCQkJCVwKKwkJCS5zZXQgYXQ9djE7CQkJCQlcCisJCQlQUkVGRShoaW50LCBhZGRyKTsJCQkJXAorCQkJLnNldCBub2F0OwkJCQkJXAorCQkuZWxzZTsJCQkJCQkJXAorCQkJUFJFRihoaW50LCBhZGRyKTsJCQkJXAorCQkuZW5kaWY7CQkJCQkJCVwKKwkuZW5kaWYKKworI2RlZmluZSBQUkVGUyhoaW50LCBhZGRyKSBfUFJFRihoaW50LCBhZGRyLCBTUkNfUFJFRkVUQ0gpCisjZGVmaW5lIFBSRUZEKGhpbnQsIGFkZHIpIF9QUkVGKGhpbnQsIGFkZHIsIERTVF9QUkVGRVRDSCkKKwogI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogI2RlZmluZSBMREZJUlNUIExPQURSCiAjZGVmaW5lIExEUkVTVAlMT0FETApAQCAtMTgyLDI3ICsyNTIsMjMgQEAKIAkuc2V0CWF0PXYxCiAjZW5kaWYKIAotLyoKLSAqIHQ2IGlzIHVzZWQgYXMgYSBmbGFnIHRvIG5vdGUgaW5hdG9taWMgbW9kZS4KLSAqLwotTEVBRihfX2NvcHlfdXNlcl9pbmF0b21pYykKLQliCV9fY29weV91c2VyX2NvbW1vbgotCSBsaQl0NiwgMQotCUVORChfX2NvcHlfdXNlcl9pbmF0b21pYykKLQotLyoKLSAqIEEgY29tYmluZWQgbWVtY3B5L19fY29weV91c2VyCi0gKiBfX2NvcHlfdXNlciBzZXRzIGxlbiB0byAwIGZvciBzdWNjZXNzOyBlbHNlIHRvIGFuIHVwcGVyIGJvdW5kIG9mCi0gKiB0aGUgbnVtYmVyIG9mIHVuY29waWVkIGJ5dGVzLgotICogbWVtY3B5IHNldHMgdjAgdG8gZHN0LgotICovCiAJLmFsaWduCTUKLUxFQUYobWVtY3B5KQkJCQkJLyogYTA9ZHN0IGExPXNyYyBhMj1sZW4gKi8KLQltb3ZlCXYwLCBkc3QJCQkJLyogcmV0dXJuIHZhbHVlICovCi0uTF9fbWVtY3B5OgotRkVYUE9SVChfX2NvcHlfdXNlcikKLQlsaQl0NiwgMAkvKiBub3QgaW5hdG9taWMgKi8KLV9fY29weV91c2VyX2NvbW1vbjoKKworCS8qCisJICogTWFjcm8gdG8gYnVpbGQgdGhlIF9fY29weV91c2VyIGNvbW1vbiBjb2RlCisJICogQXJndWVtZW50czoKKwkgKiBtb2RlIDogTEVHQUNZX01PREUgb3IgRVZBX01PREUKKwkgKiBmcm9tIDogU291cmNlIG9wZXJhbmQuIFVTRVJPUCBvciBLRVJORUxPUAorCSAqIHRvICAgOiBEZXN0aW5hdGlvbiBvcGVyYW5kLiBVU0VST1Agb3IgS0VSTkVMT1AKKwkgKi8KKwkubWFjcm8gX19CVUlMRF9DT1BZX1VTRVIgbW9kZSwgZnJvbSwgdG8KKworCS8qIGluaXRpYWxpemUgX19tZW1jcHkgaWYgdGhpcyB0aGUgZmlyc3QgdGltZSB3ZSBleGVjdXRlIHRoaXMgbWFjcm8gKi8KKwkuaWZub3RkZWYgX19tZW1jcHkKKwkuc2V0IF9fbWVtY3B5LCAxCisJLmhpZGRlbiBfX21lbWNweSAvKiBtYWtlIHN1cmUgaXQgZG9lcyBub3QgbGVhayAqLworCS5lbmRpZgorCiAJLyoKIAkgKiBOb3RlOiBkc3QgJiBzcmMgbWF5IGJlIHVuYWxpZ25lZCwgbGVuIG1heSBiZSAwCiAJICogVGVtcHMKQEAgLTIxNyw5NCArMjgzLDk0IEBACiAJICoKIAkgKiBJZiBsZW4gPCBOQllURVMgdXNlIGJ5dGUgb3BlcmF0aW9ucy4KIAkgKi8KLQlQUkVGKAkwLCAwKHNyYykgKQotCVBSRUYoCTEsIDAoZHN0KSApCisJUFJFRlMoCTAsIDAoc3JjKSApCisJUFJFRkQoCTEsIDAoZHN0KSApCiAJc2x0dQl0MiwgbGVuLCBOQllURVMKIAlhbmQJdDEsIGRzdCwgQUREUk1BU0sKLQlQUkVGKAkwLCAxKjMyKHNyYykgKQotCVBSRUYoCTEsIDEqMzIoZHN0KSApCi0JYm5legl0MiwgLkxjb3B5X2J5dGVzX2NoZWNrbGVuCisJUFJFRlMoCTAsIDEqMzIoc3JjKSApCisJUFJFRkQoCTEsIDEqMzIoZHN0KSApCisJYm5legl0MiwgLkxjb3B5X2J5dGVzX2NoZWNrbGVuXEAKIAkgYW5kCXQwLCBzcmMsIEFERFJNQVNLCi0JUFJFRigJMCwgMiozMihzcmMpICkKLQlQUkVGKAkxLCAyKjMyKGRzdCkgKQotCWJuZXoJdDEsIC5MZHN0X3VuYWxpZ25lZAorCVBSRUZTKAkwLCAyKjMyKHNyYykgKQorCVBSRUZEKAkxLCAyKjMyKGRzdCkgKQorCWJuZXoJdDEsIC5MZHN0X3VuYWxpZ25lZFxACiAJIG5vcAotCWJuZXoJdDAsIC5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZAorCWJuZXoJdDAsIC5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZFxACiAJLyoKIAkgKiB1c2UgZGVsYXkgc2xvdCBmb3IgZmFsbC10aHJvdWdoCiAJICogc3JjIGFuZCBkc3QgYXJlIGFsaWduZWQ7IG5lZWQgdG8gY29tcHV0ZSByZW0KIAkgKi8KLS5MYm90aF9hbGlnbmVkOgorLkxib3RoX2FsaWduZWRcQDoKIAkgU1JMCXQwLCBsZW4sIExPR19OQllURVMrMwkgIyArMyBmb3IgOCB1bml0cy9pdGVyCi0JYmVxegl0MCwgLkxjbGVhbnVwX2JvdGhfYWxpZ25lZCAjIGxlbiA8IDgqTkJZVEVTCisJYmVxegl0MCwgLkxjbGVhbnVwX2JvdGhfYWxpZ25lZFxAICMgbGVuIDwgOCpOQllURVMKIAkgYW5kCXJlbSwgbGVuLCAoOCpOQllURVMtMSkJICMgcmVtID0gbGVuICUgKDgqTkJZVEVTKQotCVBSRUYoCTAsIDMqMzIoc3JjKSApCi0JUFJFRigJMSwgMyozMihkc3QpICkKKwlQUkVGUygJMCwgMyozMihzcmMpICkKKwlQUkVGRCgJMSwgMyozMihkc3QpICkKIAkuYWxpZ24JNAogMToKIAlSMTBLQ0JBUlJJRVIoMChyYSkpCi1FWEMoCUxPQUQJdDAsIFVOSVQoMCkoc3JjKSwJLkxsX2V4YykKLUVYQygJTE9BRAl0MSwgVU5JVCgxKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDIsIFVOSVQoMikoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQzLCBVTklUKDMpKHNyYyksCS5MbF9leGNfY29weSkKKwlMT0FEKHQwLCBVTklUKDApKHNyYyksIC5MbF9leGNcQCkKKwlMT0FEKHQxLCBVTklUKDEpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDIsIFVOSVQoMikoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTE9BRCh0MywgVU5JVCgzKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKIAlTVUIJbGVuLCBsZW4sIDgqTkJZVEVTCi1FWEMoCUxPQUQJdDQsIFVOSVQoNCkoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQ3LCBVTklUKDUpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJU1RPUkUJdDAsIFVOSVQoMCkoZHN0KSwJLkxzX2V4Y19wOHUpCi1FWEMoCVNUT1JFCXQxLCBVTklUKDEpKGRzdCksCS5Mc19leGNfcDd1KQotRVhDKAlMT0FECXQwLCBVTklUKDYpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTE9BRAl0MSwgVU5JVCg3KShzcmMpLAkuTGxfZXhjX2NvcHkpCisJTE9BRCh0NCwgVU5JVCg0KShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMT0FEKHQ3LCBVTklUKDUpKHNyYyksIC5MbF9leGNfY29weVxAKQorCVNUT1JFKHQwLCBVTklUKDApKGRzdCksCS5Mc19leGNfcDh1XEApCisJU1RPUkUodDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4Y19wN3VcQCkKKwlMT0FEKHQwLCBVTklUKDYpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxPQUQodDEsIFVOSVQoNykoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJQURECXNyYywgc3JjLCA4Kk5CWVRFUwogCUFERAlkc3QsIGRzdCwgOCpOQllURVMKLUVYQygJU1RPUkUJdDIsIFVOSVQoLTYpKGRzdCksCS5Mc19leGNfcDZ1KQotRVhDKAlTVE9SRQl0MywgVU5JVCgtNSkoZHN0KSwJLkxzX2V4Y19wNXUpCi1FWEMoCVNUT1JFCXQ0LCBVTklUKC00KShkc3QpLAkuTHNfZXhjX3A0dSkKLUVYQygJU1RPUkUJdDcsIFVOSVQoLTMpKGRzdCksCS5Mc19leGNfcDN1KQotRVhDKAlTVE9SRQl0MCwgVU5JVCgtMikoZHN0KSwJLkxzX2V4Y19wMnUpCi1FWEMoCVNUT1JFCXQxLCBVTklUKC0xKShkc3QpLAkuTHNfZXhjX3AxdSkKLQlQUkVGKAkwLCA4KjMyKHNyYykgKQotCVBSRUYoCTEsIDgqMzIoZHN0KSApCisJU1RPUkUodDIsIFVOSVQoLTYpKGRzdCksIC5Mc19leGNfcDZ1XEApCisJU1RPUkUodDMsIFVOSVQoLTUpKGRzdCksIC5Mc19leGNfcDV1XEApCisJU1RPUkUodDQsIFVOSVQoLTQpKGRzdCksIC5Mc19leGNfcDR1XEApCisJU1RPUkUodDcsIFVOSVQoLTMpKGRzdCksIC5Mc19leGNfcDN1XEApCisJU1RPUkUodDAsIFVOSVQoLTIpKGRzdCksIC5Mc19leGNfcDJ1XEApCisJU1RPUkUodDEsIFVOSVQoLTEpKGRzdCksIC5Mc19leGNfcDF1XEApCisJUFJFRlMoCTAsIDgqMzIoc3JjKSApCisJUFJFRkQoCTEsIDgqMzIoZHN0KSApCiAJYm5lCWxlbiwgcmVtLCAxYgogCSBub3AKIAogCS8qCiAJICogbGVuID09IHJlbSA9PSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gY29weSA8IDgqTkJZVEVTCiAJICovCi0uTGNsZWFudXBfYm90aF9hbGlnbmVkOgotCWJlcXoJbGVuLCAuTGRvbmUKKy5MY2xlYW51cF9ib3RoX2FsaWduZWRcQDoKKwliZXF6CWxlbiwgLkxkb25lXEAKIAkgc2x0dQl0MCwgbGVuLCA0Kk5CWVRFUwotCWJuZXoJdDAsIC5MbGVzc190aGFuXzR1bml0cworCWJuZXoJdDAsIC5MbGVzc190aGFuXzR1bml0c1xACiAJIGFuZAlyZW0sIGxlbiwgKE5CWVRFUy0xKQkjIHJlbSA9IGxlbiAlIE5CWVRFUwogCS8qCiAJICogbGVuID49IDQqTkJZVEVTCiAJICovCi1FWEMoCUxPQUQJdDAsIFVOSVQoMCkoc3JjKSwJLkxsX2V4YykKLUVYQygJTE9BRAl0MSwgVU5JVCgxKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxPQUQJdDIsIFVOSVQoMikoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMT0FECXQzLCBVTklUKDMpKHNyYyksCS5MbF9leGNfY29weSkKKwlMT0FEKCB0MCwgVU5JVCgwKShzcmMpLAkuTGxfZXhjXEApCisJTE9BRCggdDEsIFVOSVQoMSkoc3JjKSwJLkxsX2V4Y19jb3B5XEApCisJTE9BRCggdDIsIFVOSVQoMikoc3JjKSwJLkxsX2V4Y19jb3B5XEApCisJTE9BRCggdDMsIFVOSVQoMykoc3JjKSwJLkxsX2V4Y19jb3B5XEApCiAJU1VCCWxlbiwgbGVuLCA0Kk5CWVRFUwogCUFERAlzcmMsIHNyYywgNCpOQllURVMKIAlSMTBLQ0JBUlJJRVIoMChyYSkpCi1FWEMoCVNUT1JFCXQwLCBVTklUKDApKGRzdCksCS5Mc19leGNfcDR1KQotRVhDKAlTVE9SRQl0MSwgVU5JVCgxKShkc3QpLAkuTHNfZXhjX3AzdSkKLUVYQygJU1RPUkUJdDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4Y19wMnUpCi1FWEMoCVNUT1JFCXQzLCBVTklUKDMpKGRzdCksCS5Mc19leGNfcDF1KQorCVNUT1JFKHQwLCBVTklUKDApKGRzdCksCS5Mc19leGNfcDR1XEApCisJU1RPUkUodDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4Y19wM3VcQCkKKwlTVE9SRSh0MiwgVU5JVCgyKShkc3QpLAkuTHNfZXhjX3AydVxAKQorCVNUT1JFKHQzLCBVTklUKDMpKGRzdCksCS5Mc19leGNfcDF1XEApCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgNCpOQllURVMKLQliZXF6CWxlbiwgLkxkb25lCisJYmVxeglsZW4sIC5MZG9uZVxACiAJLnNldAlub3Jlb3JkZXIKLS5MbGVzc190aGFuXzR1bml0czoKKy5MbGVzc190aGFuXzR1bml0c1xAOgogCS8qCiAJICogcmVtID0gbGVuICUgTkJZVEVTCiAJICovCi0JYmVxCXJlbSwgbGVuLCAuTGNvcHlfYnl0ZXMKKwliZXEJcmVtLCBsZW4sIC5MY29weV9ieXRlc1xACiAJIG5vcAogMToKIAlSMTBLQ0JBUlJJRVIoMChyYSkpCi1FWEMoCUxPQUQJdDAsIDAoc3JjKSwJCS5MbF9leGMpCisJTE9BRCh0MCwgMChzcmMpLCAuTGxfZXhjXEApCiAJQURECXNyYywgc3JjLCBOQllURVMKIAlTVUIJbGVuLCBsZW4sIE5CWVRFUwotRVhDKAlTVE9SRQl0MCwgMChkc3QpLAkJLkxzX2V4Y19wMXUpCisJU1RPUkUodDAsIDAoZHN0KSwgLkxzX2V4Y19wMXVcQCkKIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCiAJQURECWRzdCwgZHN0LCBOQllURVMKIAlibmUJcmVtLCBsZW4sIDFiCkBAIC0zMjIsMTcgKzM4OCwxNyBAQAogCSAqIG1vcmUgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uCiAJICovCiAjZGVmaW5lIGJpdHMgdDIKLQliZXF6CWxlbiwgLkxkb25lCisJYmVxeglsZW4sIC5MZG9uZVxACiAJIEFERAl0MSwgZHN0LCBsZW4JIyB0MSBpcyBqdXN0IHBhc3QgbGFzdCBieXRlIG9mIGRzdAogCWxpCWJpdHMsIDgqTkJZVEVTCiAJU0xMCXJlbSwgbGVuLCAzCSMgcmVtID0gbnVtYmVyIG9mIGJpdHMgdG8ga2VlcAotRVhDKAlMT0FECXQwLCAwKHNyYyksCQkuTGxfZXhjKQorCUxPQUQodDAsIDAoc3JjKSwgLkxsX2V4Y1xAKQogCVNVQgliaXRzLCBiaXRzLCByZW0gIyBiaXRzID0gbnVtYmVyIG9mIGJpdHMgdG8gZGlzY2FyZAogCVNISUZUX0RJU0NBUkQgdDAsIHQwLCBiaXRzCi1FWEMoCVNUUkVTVAl0MCwgLTEodDEpLAkJLkxzX2V4YykKKwlTVFJFU1QodDAsIC0xKHQxKSwgLkxzX2V4Y1xAKQogCWpyCXJhCiAJIG1vdmUJbGVuLCB6ZXJvCi0uTGRzdF91bmFsaWduZWQ6CisuTGRzdF91bmFsaWduZWRcQDoKIAkvKgogCSAqIGRzdCBpcyB1bmFsaWduZWQKIAkgKiB0MCA9IHNyYyAmIEFERFJNQVNLCkBAIC0zNDMsMjUgKzQwOSwyNSBAQAogCSAqIFNldCBtYXRjaCA9IChzcmMgYW5kIGRzdCBoYXZlIHNhbWUgYWxpZ25tZW50KQogCSAqLwogI2RlZmluZSBtYXRjaCByZW0KLUVYQygJTERGSVJTVCB0MywgRklSU1QoMCkoc3JjKSwJLkxsX2V4YykKKwlMREZJUlNUKHQzLCBGSVJTVCgwKShzcmMpLCAuTGxfZXhjXEApCiAJQURECXQyLCB6ZXJvLCBOQllURVMKLUVYQygJTERSRVNUCXQzLCBSRVNUKDApKHNyYyksCS5MbF9leGNfY29weSkKKwlMRFJFU1QodDMsIFJFU1QoMCkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJU1VCCXQyLCB0MiwgdDEJIyB0MiA9IG51bWJlciBvZiBieXRlcyBjb3BpZWQKIAl4b3IJbWF0Y2gsIHQwLCB0MQogCVIxMEtDQkFSUklFUigwKHJhKSkKLUVYQygJU1RGSVJTVCB0MywgRklSU1QoMCkoZHN0KSwJLkxzX2V4YykKLQliZXEJbGVuLCB0MiwgLkxkb25lCisJU1RGSVJTVCh0MywgRklSU1QoMCkoZHN0KSwgLkxzX2V4Y1xAKQorCWJlcQlsZW4sIHQyLCAuTGRvbmVcQAogCSBTVUIJbGVuLCBsZW4sIHQyCiAJQURECWRzdCwgZHN0LCB0MgotCWJlcXoJbWF0Y2gsIC5MYm90aF9hbGlnbmVkCisJYmVxegltYXRjaCwgLkxib3RoX2FsaWduZWRcQAogCSBBREQJc3JjLCBzcmMsIHQyCiAKLS5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZDoKKy5Mc3JjX3VuYWxpZ25lZF9kc3RfYWxpZ25lZFxAOgogCVNSTAl0MCwgbGVuLCBMT0dfTkJZVEVTKzIJICMgKzIgZm9yIDQgdW5pdHMvaXRlcgotCVBSRUYoCTAsIDMqMzIoc3JjKSApCi0JYmVxegl0MCwgLkxjbGVhbnVwX3NyY191bmFsaWduZWQKKwlQUkVGUygJMCwgMyozMihzcmMpICkKKwliZXF6CXQwLCAuTGNsZWFudXBfc3JjX3VuYWxpZ25lZFxACiAJIGFuZAlyZW0sIGxlbiwgKDQqTkJZVEVTLTEpCSAjIHJlbSA9IGxlbiAlIDQqTkJZVEVTCi0JUFJFRigJMSwgMyozMihkc3QpICkKKwlQUkVGRCgJMSwgMyozMihkc3QpICkKIDE6CiAvKgogICogQXZvaWQgY29uc2VjdXRpdmUgTEQqJ3MgdG8gdGhlIHNhbWUgcmVnaXN0ZXIgc2luY2Ugc29tZSBtaXBzCkBAIC0zNzAsNTggKzQzNiw1OCBAQAogICogYXJlIHRvIHRoZSBzYW1lIHVuaXQgKHVubGVzcyBzcmMgaXMgYWxpZ25lZCwgYnV0IGl0J3Mgbm90KS4KICAqLwogCVIxMEtDQkFSUklFUigwKHJhKSkKLUVYQygJTERGSVJTVCB0MCwgRklSU1QoMCkoc3JjKSwJLkxsX2V4YykKLUVYQygJTERGSVJTVCB0MSwgRklSU1QoMSkoc3JjKSwJLkxsX2V4Y19jb3B5KQorCUxERklSU1QodDAsIEZJUlNUKDApKHNyYyksIC5MbF9leGNcQCkKKwlMREZJUlNUKHQxLCBGSVJTVCgxKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKIAlTVUIJbGVuLCBsZW4sIDQqTkJZVEVTCi1FWEMoCUxEUkVTVAl0MCwgUkVTVCgwKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxEUkVTVAl0MSwgUkVTVCgxKShzcmMpLAkuTGxfZXhjX2NvcHkpCi1FWEMoCUxERklSU1QgdDIsIEZJUlNUKDIpKHNyYyksCS5MbF9leGNfY29weSkKLUVYQygJTERGSVJTVCB0MywgRklSU1QoMykoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMRFJFU1QJdDIsIFJFU1QoMikoc3JjKSwJLkxsX2V4Y19jb3B5KQotRVhDKAlMRFJFU1QJdDMsIFJFU1QoMykoc3JjKSwJLkxsX2V4Y19jb3B5KQotCVBSRUYoCTAsIDkqMzIoc3JjKSApCQkjIDAgaXMgUFJFRl9MT0FEICAobm90IHN0cmVhbWVkKQorCUxEUkVTVCh0MCwgUkVTVCgwKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlMRFJFU1QodDEsIFJFU1QoMSkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTERGSVJTVCh0MiwgRklSU1QoMikoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTERGSVJTVCh0MywgRklSU1QoMykoc3JjKSwgLkxsX2V4Y19jb3B5XEApCisJTERSRVNUKHQyLCBSRVNUKDIpKHNyYyksIC5MbF9leGNfY29weVxAKQorCUxEUkVTVCh0MywgUkVTVCgzKShzcmMpLCAuTGxfZXhjX2NvcHlcQCkKKwlQUkVGUygJMCwgOSozMihzcmMpICkJCSMgMCBpcyBQUkVGX0xPQUQgIChub3Qgc3RyZWFtZWQpCiAJQURECXNyYywgc3JjLCA0Kk5CWVRFUwogI2lmZGVmIENPTkZJR19DUFVfU0IxCiAJbm9wCQkJCSMgaW1wcm92ZXMgc2xvdHRpbmcKICNlbmRpZgotRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjX3A0dSkKLUVYQygJU1RPUkUJdDEsIFVOSVQoMSkoZHN0KSwJLkxzX2V4Y19wM3UpCi1FWEMoCVNUT1JFCXQyLCBVTklUKDIpKGRzdCksCS5Mc19leGNfcDJ1KQotRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjX3AxdSkKLQlQUkVGKAkxLCA5KjMyKGRzdCkgKQkJIyAxIGlzIFBSRUZfU1RPUkUgKG5vdCBzdHJlYW1lZCkKKwlTVE9SRSh0MCwgVU5JVCgwKShkc3QpLAkuTHNfZXhjX3A0dVxAKQorCVNUT1JFKHQxLCBVTklUKDEpKGRzdCksCS5Mc19leGNfcDN1XEApCisJU1RPUkUodDIsIFVOSVQoMikoZHN0KSwJLkxzX2V4Y19wMnVcQCkKKwlTVE9SRSh0MywgVU5JVCgzKShkc3QpLAkuTHNfZXhjX3AxdVxAKQorCVBSRUZEKAkxLCA5KjMyKGRzdCkgKQkJIyAxIGlzIFBSRUZfU1RPUkUgKG5vdCBzdHJlYW1lZCkKIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCiAJQURECWRzdCwgZHN0LCA0Kk5CWVRFUwogCWJuZQlsZW4sIHJlbSwgMWIKIAkuc2V0CW5vcmVvcmRlcgogCi0uTGNsZWFudXBfc3JjX3VuYWxpZ25lZDoKLQliZXF6CWxlbiwgLkxkb25lCisuTGNsZWFudXBfc3JjX3VuYWxpZ25lZFxAOgorCWJlcXoJbGVuLCAuTGRvbmVcQAogCSBhbmQJcmVtLCBsZW4sIE5CWVRFUy0xICAjIHJlbSA9IGxlbiAlIE5CWVRFUwotCWJlcQlyZW0sIGxlbiwgLkxjb3B5X2J5dGVzCisJYmVxCXJlbSwgbGVuLCAuTGNvcHlfYnl0ZXNcQAogCSBub3AKIDE6CiAJUjEwS0NCQVJSSUVSKDAocmEpKQotRVhDKAlMREZJUlNUIHQwLCBGSVJTVCgwKShzcmMpLAkuTGxfZXhjKQotRVhDKAlMRFJFU1QJdDAsIFJFU1QoMCkoc3JjKSwJLkxsX2V4Y19jb3B5KQorCUxERklSU1QodDAsIEZJUlNUKDApKHNyYyksIC5MbF9leGNcQCkKKwlMRFJFU1QodDAsIFJFU1QoMCkoc3JjKSwgLkxsX2V4Y19jb3B5XEApCiAJQURECXNyYywgc3JjLCBOQllURVMKIAlTVUIJbGVuLCBsZW4sIE5CWVRFUwotRVhDKAlTVE9SRQl0MCwgMChkc3QpLAkJLkxzX2V4Y19wMXUpCisJU1RPUkUodDAsIDAoZHN0KSwgLkxzX2V4Y19wMXVcQCkKIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCiAJQURECWRzdCwgZHN0LCBOQllURVMKIAlibmUJbGVuLCByZW0sIDFiCiAJLnNldAlub3Jlb3JkZXIKIAotLkxjb3B5X2J5dGVzX2NoZWNrbGVuOgotCWJlcXoJbGVuLCAuTGRvbmUKKy5MY29weV9ieXRlc19jaGVja2xlblxAOgorCWJlcXoJbGVuLCAuTGRvbmVcQAogCSBub3AKLS5MY29weV9ieXRlczoKKy5MY29weV9ieXRlc1xAOgogCS8qIDAgPCBsZW4gPCBOQllURVMgICovCiAJUjEwS0NCQVJSSUVSKDAocmEpKQogI2RlZmluZSBDT1BZX0JZVEUoTikJCQlcCi1FWEMoCWxiCXQwLCBOKHNyYyksIC5MbF9leGMpOwlcCisJTE9BREIodDAsIE4oc3JjKSwgLkxsX2V4Y1xAKTsJXAogCVNVQglsZW4sIGxlbiwgMTsJCVwKLQliZXF6CWxlbiwgLkxkb25lOwkJXAotRVhDKAkgc2IJdDAsIE4oZHN0KSwgLkxzX2V4Y19wMSkKKwliZXF6CWxlbiwgLkxkb25lXEA7CQlcCisJU1RPUkVCKHQwLCBOKGRzdCksIC5Mc19leGNfcDFcQCkKIAogCUNPUFlfQllURSgwKQogCUNPUFlfQllURSgxKQpAQCAtNDMxLDE2ICs0OTcsMTkgQEAKIAlDT1BZX0JZVEUoNCkKIAlDT1BZX0JZVEUoNSkKICNlbmRpZgotRVhDKAlsYgl0MCwgTkJZVEVTLTIoc3JjKSwgLkxsX2V4YykKKwlMT0FEQih0MCwgTkJZVEVTLTIoc3JjKSwgLkxsX2V4Y1xAKQogCVNVQglsZW4sIGxlbiwgMQogCWpyCXJhCi1FWEMoCSBzYgl0MCwgTkJZVEVTLTIoZHN0KSwgLkxzX2V4Y19wMSkKLS5MZG9uZToKKwlTVE9SRUIodDAsIE5CWVRFUy0yKGRzdCksIC5Mc19leGNfcDFcQCkKKy5MZG9uZVxAOgogCWpyCXJhCi0JIG5vcAorCS5pZiBfX21lbWNweSA9PSAxCiAJRU5EKG1lbWNweSkKKwkuc2V0IF9fbWVtY3B5LCAwCisJLmhpZGRlbiBfX21lbWNweQorCS5lbmRpZgogCi0uTGxfZXhjX2NvcHk6CisuTGxfZXhjX2NvcHlcQDoKIAkvKgogCSAqIENvcHkgYnl0ZXMgZnJvbSBzcmMgdW50aWwgZmF1bHRpbmcgbG9hZCBhZGRyZXNzIChvciB1bnRpbCBhCiAJICogbGIgZmF1bHRzKQpAQCAtNDUxLDI0ICs1MjAsMjQgQEAKIAkgKgogCSAqIEFzc3VtZXMgc3JjIDwgVEhSRUFEX0JVQUREUigkMjgpCiAJICovCi0JTE9BRAl0MCwgVElfVEFTSygkMjgpCisJTE9BREsJdDAsIFRJX1RBU0soJDI4KQogCSBub3AKLQlMT0FECXQwLCBUSFJFQURfQlVBRERSKHQwKQorCUxPQURLCXQwLCBUSFJFQURfQlVBRERSKHQwKQogMToKLUVYQygJbGIJdDEsIDAoc3JjKSwJLkxsX2V4YykKKwlMT0FEQih0MSwgMChzcmMpLCAuTGxfZXhjXEApCiAJQURECXNyYywgc3JjLCAxCiAJc2IJdDEsIDAoZHN0KQkjIGNhbid0IGZhdWx0IC0tIHdlJ3JlIGNvcHlfZnJvbV91c2VyCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCUFERAlkc3QsIGRzdCwgMQogCWJuZQlzcmMsIHQwLCAxYgogCS5zZXQJbm9yZW9yZGVyCi0uTGxfZXhjOgotCUxPQUQJdDAsIFRJX1RBU0soJDI4KQorLkxsX2V4Y1xAOgorCUxPQURLCXQwLCBUSV9UQVNLKCQyOCkKIAkgbm9wCi0JTE9BRAl0MCwgVEhSRUFEX0JVQUREUih0MCkJIyB0MCBpcyBqdXN0IHBhc3QgbGFzdCBnb29kIGFkZHJlc3MKKwlMT0FESwl0MCwgVEhSRUFEX0JVQUREUih0MCkJIyB0MCBpcyBqdXN0IHBhc3QgbGFzdCBnb29kIGFkZHJlc3MKIAkgbm9wCiAJU1VCCWxlbiwgQVQsIHQwCQkjIGxlbiBudW1iZXIgb2YgdW5jb3BpZWQgYnl0ZXMKLQlibmV6CXQ2LCAuTGRvbmUJLyogU2tpcCB0aGUgemVyb2luZyBwYXJ0IGlmIGluYXRvbWljICovCisJYm5legl0NiwgLkxkb25lXEAJLyogU2tpcCB0aGUgemVyb2luZyBwYXJ0IGlmIGluYXRvbWljICovCiAJLyoKIAkgKiBIZXJlJ3Mgd2hlcmUgd2UgcmVseSBvbiBzcmMgYW5kIGRzdCBiZWluZyBpbmNyZW1lbnRlZCBpbiB0YW5kZW0sCiAJICogICBTZWUgKDMpIGFib3ZlLgpAQCAtNDgyLDcgKzU1MSw3IEBACiAJICovCiAJLnNldAlyZW9yZGVyCQkJCS8qIERBRERJX1dBUiAqLwogCVNVQglzcmMsIGxlbiwgMQotCWJlcXoJbGVuLCAuTGRvbmUKKwliZXF6CWxlbiwgLkxkb25lXEAKIAkuc2V0CW5vcmVvcmRlcgogMToJc2IJemVybywgMChkc3QpCiAJQURECWRzdCwgZHN0LCAxCkBAIC01MDMsNyArNTcyLDcgQEAKIAogI2RlZmluZSBTRVhDKG4pCQkJCQkJCVwKIAkuc2V0CXJlb3JkZXI7CQkJLyogREFERElfV0FSICovIFwKLS5Mc19leGNfcCAjIyBuICMjIHU6CQkJCQkJXAorLkxzX2V4Y19wICMjIG4gIyMgdVxAOgkJCQkJCVwKIAlBREQJbGVuLCBsZW4sIG4qTkJZVEVTOwkJCQlcCiAJanIJcmE7CQkJCQkJXAogCS5zZXQJbm9yZW9yZGVyCkBAIC01MTcsMTQgKzU4NiwxNSBAQAogU0VYQygyKQogU0VYQygxKQogCi0uTHNfZXhjX3AxOgorLkxzX2V4Y19wMVxAOgogCS5zZXQJcmVvcmRlcgkJCQkvKiBEQURESV9XQVIgKi8KIAlBREQJbGVuLCBsZW4sIDEKIAlqcglyYQogCS5zZXQJbm9yZW9yZGVyCi0uTHNfZXhjOgorLkxzX2V4Y1xAOgogCWpyCXJhCiAJIG5vcAorCS5lbmRtCiAKIAkuYWxpZ24JNQogTEVBRihtZW1tb3ZlKQpAQCAtNTc1LDMgKzY0NSw3MSBAQAogCWpyCXJhCiAJIG1vdmUJYTIsIHplcm8KIAlFTkQoX19ybWVtY3B5KQorCisvKgorICogdDYgaXMgdXNlZCBhcyBhIGZsYWcgdG8gbm90ZSBpbmF0b21pYyBtb2RlLgorICovCitMRUFGKF9fY29weV91c2VyX2luYXRvbWljKQorCWIJX19jb3B5X3VzZXJfY29tbW9uCisJbGkJdDYsIDEKKwlFTkQoX19jb3B5X3VzZXJfaW5hdG9taWMpCisKKy8qCisgKiBBIGNvbWJpbmVkIG1lbWNweS9fX2NvcHlfdXNlcgorICogX19jb3B5X3VzZXIgc2V0cyBsZW4gdG8gMCBmb3Igc3VjY2VzczsgZWxzZSB0byBhbiB1cHBlciBib3VuZCBvZgorICogdGhlIG51bWJlciBvZiB1bmNvcGllZCBieXRlcy4KKyAqIG1lbWNweSBzZXRzIHYwIHRvIGRzdC4KKyAqLworCS5hbGlnbgk1CitMRUFGKG1lbWNweSkJCQkJCS8qIGEwPWRzdCBhMT1zcmMgYTI9bGVuICovCisJbW92ZQl2MCwgZHN0CQkJCS8qIHJldHVybiB2YWx1ZSAqLworLkxfX21lbWNweToKK0ZFWFBPUlQoX19jb3B5X3VzZXIpCisJbGkJdDYsIDAJLyogbm90IGluYXRvbWljICovCitfX2NvcHlfdXNlcl9jb21tb246CisJLyogTGVnYWN5IE1vZGUsIHVzZXIgPC0+IHVzZXIgKi8KKwlfX0JVSUxEX0NPUFlfVVNFUiBMRUdBQ1lfTU9ERSBVU0VST1AgVVNFUk9QCisKKyNpZmRlZiBDT05GSUdfRVZBCisKKy8qCisgKiBGb3IgRVZBIHdlIG5lZWQgZGlzdGluY3Qgc3ltYm9scyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0byB1c2VyIHNwYWNlLgorICogVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHNwZWNpZmljIEVWQSBpbnN0cnVjdGlvbnMgdG8gcGVyZm9ybSB0aGUKKyAqIHZpcnR1YWwgPC0+IHBoeXNpY2FsIHRyYW5zbGF0aW9uIHdoZW4gYSB2aXJ0dWFsIGFkZHJlc3MgaXMgYWN0dWFsbHkgaW4gdXNlcgorICogc3BhY2UKKyAqLworCitMRUFGKF9fY29weV91c2VyX2luYXRvbWljX2V2YSkKKwliICAgICAgIF9fY29weV9mcm9tX3VzZXJfY29tbW9uCisJbGkJdDYsIDEKKwlFTkQoX19jb3B5X3VzZXJfaW5hdG9taWNfZXZhKQorCisvKgorICogX19jb3B5X2Zyb21fdXNlciAoRVZBKQorICovCisKK0xFQUYoX19jb3B5X2Zyb21fdXNlcl9ldmEpCisJbGkJdDYsIDAJLyogbm90IGluYXRvbWljICovCitfX2NvcHlfZnJvbV91c2VyX2NvbW1vbjoKKwlfX0JVSUxEX0NPUFlfVVNFUiBFVkFfTU9ERSBVU0VST1AgS0VSTkVMT1AKK0VORChfX2NvcHlfZnJvbV91c2VyX2V2YSkKKworCisKKy8qCisgKiBfX2NvcHlfdG9fdXNlciAoRVZBKQorICovCisKK0xFQUYoX19jb3B5X3RvX3VzZXJfZXZhKQorX19CVUlMRF9DT1BZX1VTRVIgRVZBX01PREUgS0VSTkVMT1AgVVNFUk9QCitFTkQoX19jb3B5X3RvX3VzZXJfZXZhKQorCisvKgorICogX19jb3B5X2luX3VzZXIgKEVWQSkKKyAqLworCitMRUFGKF9fY29weV9pbl91c2VyX2V2YSkKK19fQlVJTERfQ09QWV9VU0VSIEVWQV9NT0RFIFVTRVJPUCBVU0VST1AKK0VORChfX2NvcHlfaW5fdXNlcl9ldmEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9tZW1zZXQuUyBiL2FyY2gvbWlwcy9saWIvbWVtc2V0LlMKaW5kZXggMDU4MDE5NC4uN2IwZTU0NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi9tZW1zZXQuUworKysgYi9hcmNoL21pcHMvbGliL21lbXNldC5TCkBAIC0zNCwxMyArMzQsMjcgQEAKICNkZWZpbmUgRklMTFBUUkcgdDAKICNlbmRpZgogCisjZGVmaW5lIExFR0FDWV9NT0RFIDEKKyNkZWZpbmUgRVZBX01PREUgICAgMgorCisvKgorICogTm8gbmVlZCB0byBwcm90ZWN0IGl0IHdpdGggRVZBICNpZmRlZmVyeS4gVGhlIGdlbmVyYXRlZCBibG9jayBvZiBjb2RlCisgKiB3aWxsIG5ldmVyIGJlIGFzc2VtYmxlZCBpZiBFVkEgaXMgbm90IGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgX19FVkFGWShpbnNuLCByZWcsIGFkZHIpIF9fQlVJTERfRVZBX0lOU04oaW5zbiMjZSwgcmVnLCBhZGRyKQorI2RlZmluZSBfX19CVUlMRF9FVkFfSU5TTihpbnNuLCByZWcsIGFkZHIpIF9fRVZBRlkoaW5zbiwgcmVnLCBhZGRyKQorCiAjZGVmaW5lIEVYKGluc24scmVnLGFkZHIsaGFuZGxlcikJCQlcCi05OglpbnNuCXJlZywgYWRkcjsJCQkJXAorCS5pZiBcbW9kZSA9PSBMRUdBQ1lfTU9ERTsJCQlcCis5OgkJaW5zbglyZWcsIGFkZHI7CQkJXAorCS5lbHNlOwkJCQkJCVwKKzk6CQlfX19CVUlMRF9FVkFfSU5TTihpbnNuLCByZWcsIGFkZHIpOwlcCisJLmVuZGlmOwkJCQkJCVwKIAkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIjsJCQlcCiAJUFRSCTliLCBoYW5kbGVyOwkJCQlcCiAJLnByZXZpb3VzCiAKLQkubWFjcm8JZl9maWxsNjQgZHN0LCBvZmZzZXQsIHZhbCwgZml4dXAKKwkubWFjcm8JZl9maWxsNjQgZHN0LCBvZmZzZXQsIHZhbCwgZml4dXAsIG1vZGUKIAlFWChMT05HX1MsIFx2YWwsIChcb2Zmc2V0ICsgIDAgKiBTVE9SU0laRSkoXGRzdCksIFxmaXh1cCkKIAlFWChMT05HX1MsIFx2YWwsIChcb2Zmc2V0ICsgIDEgKiBTVE9SU0laRSkoXGRzdCksIFxmaXh1cCkKIAlFWChMT05HX1MsIFx2YWwsIChcb2Zmc2V0ICsgIDIgKiBTVE9SU0laRSkoXGRzdCksIFxmaXh1cCkKQEAgLTYzLDM0ICs3NywyNCBAQAogI2VuZGlmCiAJLmVuZG0KIAotLyoKLSAqIG1lbXNldCh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCi0gKgotICogYTA6IHN0YXJ0IG9mIGFyZWEgdG8gY2xlYXIKLSAqIGExOiBjaGFyIHRvIGZpbGwgd2l0aAotICogYTI6IHNpemUgb2YgYXJlYSB0byBjbGVhcgotICovCiAJLnNldAlub3Jlb3JkZXIKIAkuYWxpZ24JNQotTEVBRihtZW1zZXQpCi0JYmVxegkJYTEsIDFmCi0JIG1vdmUJCXYwLCBhMAkJCS8qIHJlc3VsdCAqLwogCi0JYW5kaQkJYTEsIDB4ZmYJCS8qIHNwcmVhZCBmaWxsd29yZCAqLwotCUxPTkdfU0xMCQl0MSwgYTEsIDgKLQlvcgkJYTEsIHQxCi0JTE9OR19TTEwJCXQxLCBhMSwgMTYKLSNpZiBMT05HU0laRSA9PSA4Ci0Jb3IJCWExLCB0MQotCUxPTkdfU0xMCQl0MSwgYTEsIDMyCi0jZW5kaWYKLQlvcgkJYTEsIHQxCi0xOgorCS8qCisJICogTWFjcm8gdG8gZ2VuZXJhdGUgdGhlIF9fYnplcm97LF91c2VyfSBzeW1ib2wKKwkgKiBBcmd1bWVudHM6CisJICogbW9kZTogTEVHQUNZX01PREUgb3IgRVZBX01PREUKKwkgKi8KKwkubWFjcm8gX19CVUlMRF9CWkVSTyBtb2RlCisJLyogSW5pdGlhbGl6ZSBfX21lbXNldCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGNhbGwgdGhpcyBtYWNybyAqLworCS5pZm5vdGRlZiBfX21lbXNldAorCS5zZXQgX19tZW1zZXQsIDEKKwkuaGlkZGVuIF9fbWVtc2V0IC8qIE1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBsZWFrICovCisJLmVuZGlmCiAKLUZFWFBPUlQoX19iemVybykKIAlzbHRpdQkJdDAsIGEyLCBTVE9SU0laRQkvKiB2ZXJ5IHNtYWxsIHJlZ2lvbj8gKi8KLQlibmV6CQl0MCwgLkxzbWFsbF9tZW1zZXQKLQkgYW5kaQkJdDAsIGEwLCBTVE9STUFTSwkvKiBhbGlnbmVkPyAqLworCWJuZXoJCXQwLCAuTHNtYWxsX21lbXNldFxACisJYW5kaQkJdDAsIGEwLCBTVE9STUFTSwkvKiBhbGlnbmVkPyAqLwogCiAjaWZkZWYgQ09ORklHX0NQVV9NSUNST01JUFMKIAltb3ZlCQl0OCwgYTEJCQkvKiB1c2VkIGJ5ICdzd3AnIGluc3RydWN0aW9uICovCkBAIC05OCwzOSArMTAyLDM5IEBACiAjZW5kaWYKICNpZm5kZWYgQ09ORklHX0NQVV9EQURESV9XT1JLQVJPVU5EUwogCWJlcXoJCXQwLCAxZgotCSBQVFJfU1VCVQl0MCwgU1RPUlNJWkUJCS8qIGFsaWdubWVudCBpbiBieXRlcyAqLworCVBUUl9TVUJVCXQwLCBTVE9SU0laRQkJLyogYWxpZ25tZW50IGluIGJ5dGVzICovCiAjZWxzZQogCS5zZXQJCW5vYXQKIAlsaQkJQVQsIFNUT1JTSVpFCiAJYmVxegkJdDAsIDFmCi0JIFBUUl9TVUJVCXQwLCBBVAkJCS8qIGFsaWdubWVudCBpbiBieXRlcyAqLworCVBUUl9TVUJVCXQwLCBBVAkJCS8qIGFsaWdubWVudCBpbiBieXRlcyAqLwogCS5zZXQJCWF0CiAjZW5kaWYKIAogCVIxMEtDQkFSUklFUigwKHJhKSkKICNpZmRlZiBfX01JUFNFQl9fCi0JRVgoTE9OR19TX0wsIGExLCAoYTApLCAuTGZpcnN0X2ZpeHVwKQkvKiBtYWtlIHdvcmQvZHdvcmQgYWxpZ25lZCAqLworCUVYKExPTkdfU19MLCBhMSwgKGEwKSwgLkxmaXJzdF9maXh1cFxAKQkvKiBtYWtlIHdvcmQvZHdvcmQgYWxpZ25lZCAqLwogI2VuZGlmCiAjaWZkZWYgX19NSVBTRUxfXwotCUVYKExPTkdfU19SLCBhMSwgKGEwKSwgLkxmaXJzdF9maXh1cCkJLyogbWFrZSB3b3JkL2R3b3JkIGFsaWduZWQgKi8KKwlFWChMT05HX1NfUiwgYTEsIChhMCksIC5MZmlyc3RfZml4dXBcQCkJLyogbWFrZSB3b3JkL2R3b3JkIGFsaWduZWQgKi8KICNlbmRpZgogCVBUUl9TVUJVCWEwLCB0MAkJCS8qIGxvbmcgYWxpZ24gcHRyICovCiAJUFRSX0FERFUJYTIsIHQwCQkJLyogY29ycmVjdCBzaXplICovCiAKIDE6CW9yaQkJdDEsIGEyLCAweDNmCQkvKiAjIG9mIGZ1bGwgYmxvY2tzICovCiAJeG9yaQkJdDEsIDB4M2YKLQliZXF6CQl0MSwgLkxtZW1zZXRfcGFydGlhbAkvKiBubyBibG9jayB0byBmaWxsICovCi0JIGFuZGkJCXQwLCBhMiwgMHg0MC1TVE9SU0laRQorCWJlcXoJCXQxLCAuTG1lbXNldF9wYXJ0aWFsXEAJLyogbm8gYmxvY2sgdG8gZmlsbCAqLworCWFuZGkJCXQwLCBhMiwgMHg0MC1TVE9SU0laRQogCiAJUFRSX0FERFUJdDEsIGEwCQkJLyogZW5kIGFkZHJlc3MgKi8KIAkuc2V0CQlyZW9yZGVyCiAxOglQVFJfQURESVUJYTAsIDY0CiAJUjEwS0NCQVJSSUVSKDAocmEpKQotCWZfZmlsbDY0IGEwLCAtNjQsIEZJTEw2NFJHLCAuTGZ3ZF9maXh1cAorCWZfZmlsbDY0IGEwLCAtNjQsIEZJTEw2NFJHLCAuTGZ3ZF9maXh1cFxALCBcbW9kZQogCWJuZQkJdDEsIGEwLCAxYgogCS5zZXQJCW5vcmVvcmRlcgogCi0uTG1lbXNldF9wYXJ0aWFsOgorLkxtZW1zZXRfcGFydGlhbFxAOgogCVIxMEtDQkFSUklFUigwKHJhKSkKIAlQVFJfTEEJCXQxLCAyZgkJCS8qIHdoZXJlIHRvIHN0YXJ0ICovCiAjaWZkZWYgQ09ORklHX0NQVV9NSUNST01JUFMKQEAgLTE0NSw2MCArMTQ5LDEwMCBAQAogCS5zZXQJCWF0CiAjZW5kaWYKIAlqcgkJdDEKLQkgUFRSX0FERFUJYTAsIHQwCQkJLyogZGVzdCBwdHIgKi8KKwlQVFJfQUREVQlhMCwgdDAJCQkvKiBkZXN0IHB0ciAqLwogCiAJLnNldAkJcHVzaAogCS5zZXQJCW5vcmVvcmRlcgogCS5zZXQJCW5vbWFjcm8KLQlmX2ZpbGw2NCBhMCwgLTY0LCBGSUxMNjRSRywgLkxwYXJ0aWFsX2ZpeHVwCS8qIC4uLiBidXQgZmlyc3QgZG8gbG9uZ3MgLi4uICovCisJLyogLi4uIGJ1dCBmaXJzdCBkbyBsb25ncyAuLi4gKi8KKwlmX2ZpbGw2NCBhMCwgLTY0LCBGSUxMNjRSRywgLkxwYXJ0aWFsX2ZpeHVwXEAsIFxtb2RlCiAyOgkuc2V0CQlwb3AKIAlhbmRpCQlhMiwgU1RPUk1BU0sJCS8qIEF0IG1vc3Qgb25lIGxvbmcgdG8gZ28gKi8KIAogCWJlcXoJCWEyLCAxZgotCSBQVFJfQUREVQlhMCwgYTIJCQkvKiBXaGF0J3MgbGVmdCAqLworCVBUUl9BRERVCWEwLCBhMgkJCS8qIFdoYXQncyBsZWZ0ICovCiAJUjEwS0NCQVJSSUVSKDAocmEpKQogI2lmZGVmIF9fTUlQU0VCX18KLQlFWChMT05HX1NfUiwgYTEsIC0xKGEwKSwgLkxsYXN0X2ZpeHVwKQorCUVYKExPTkdfU19SLCBhMSwgLTEoYTApLCAuTGxhc3RfZml4dXBcQCkKICNlbmRpZgogI2lmZGVmIF9fTUlQU0VMX18KLQlFWChMT05HX1NfTCwgYTEsIC0xKGEwKSwgLkxsYXN0X2ZpeHVwKQorCUVYKExPTkdfU19MLCBhMSwgLTEoYTApLCAuTGxhc3RfZml4dXBcQCkKICNlbmRpZgogMToJanIJCXJhCi0JIG1vdmUJCWEyLCB6ZXJvCisJbW92ZQkJYTIsIHplcm8KIAotLkxzbWFsbF9tZW1zZXQ6CisuTHNtYWxsX21lbXNldFxAOgogCWJlcXoJCWEyLCAyZgotCSBQVFJfQUREVQl0MSwgYTAsIGEyCisJUFRSX0FERFUJdDEsIGEwLCBhMgogCiAxOglQVFJfQURESVUJYTAsIDEJCQkvKiBmaWxsIGJ5dGV3aXNlICovCiAJUjEwS0NCQVJSSUVSKDAocmEpKQogCWJuZQkJdDEsIGEwLCAxYgotCSBzYgkJYTEsIC0xKGEwKQorCXNiCQlhMSwgLTEoYTApCiAKIDI6CWpyCQlyYQkJCS8qIGRvbmUgKi8KLQkgbW92ZQkJYTIsIHplcm8KKwltb3ZlCQlhMiwgemVybworCS5pZiBfX21lbXNldCA9PSAxCiAJRU5EKG1lbXNldCkKKwkuc2V0IF9fbWVtc2V0LCAwCisJLmhpZGRlbiBfX21lbXNldAorCS5lbmRpZgogCi0uTGZpcnN0X2ZpeHVwOgorLkxmaXJzdF9maXh1cFxAOgogCWpyCXJhCi0JIG5vcAorCW5vcAogCi0uTGZ3ZF9maXh1cDoKKy5MZndkX2ZpeHVwXEA6CiAJUFRSX0wJCXQwLCBUSV9UQVNLKCQyOCkKIAlhbmRpCQlhMiwgMHgzZgogCUxPTkdfTAkJdDAsIFRIUkVBRF9CVUFERFIodDApCiAJTE9OR19BRERVCWEyLCB0MQogCWpyCQlyYQotCSBMT05HX1NVQlUJYTIsIHQwCisJTE9OR19TVUJVCWEyLCB0MAogCi0uTHBhcnRpYWxfZml4dXA6CisuTHBhcnRpYWxfZml4dXBcQDoKIAlQVFJfTAkJdDAsIFRJX1RBU0soJDI4KQogCWFuZGkJCWEyLCBTVE9STUFTSwogCUxPTkdfTAkJdDAsIFRIUkVBRF9CVUFERFIodDApCiAJTE9OR19BRERVCWEyLCB0MQogCWpyCQlyYQotCSBMT05HX1NVQlUJYTIsIHQwCisJTE9OR19TVUJVCWEyLCB0MAogCi0uTGxhc3RfZml4dXA6CisuTGxhc3RfZml4dXBcQDoKIAlqcgkJcmEKLQkgYW5kaQkJdjEsIGEyLCBTVE9STUFTSworCWFuZGkJCXYxLCBhMiwgU1RPUk1BU0sKKworCS5lbmRtCisKKy8qCisgKiBtZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQorICoKKyAqIGEwOiBzdGFydCBvZiBhcmVhIHRvIGNsZWFyCisgKiBhMTogY2hhciB0byBmaWxsIHdpdGgKKyAqIGEyOiBzaXplIG9mIGFyZWEgdG8gY2xlYXIKKyAqLworCitMRUFGKG1lbXNldCkKKwliZXF6CQlhMSwgMWYKKwltb3ZlCQl2MCwgYTAJCQkvKiByZXN1bHQgKi8KKworCWFuZGkJCWExLCAweGZmCQkvKiBzcHJlYWQgZmlsbHdvcmQgKi8KKwlMT05HX1NMTAkJdDEsIGExLCA4CisJb3IJCWExLCB0MQorCUxPTkdfU0xMCQl0MSwgYTEsIDE2CisjaWYgTE9OR1NJWkUgPT0gOAorCW9yCQlhMSwgdDEKKwlMT05HX1NMTAkJdDEsIGExLCAzMgorI2VuZGlmCisJb3IJCWExLCB0MQorMToKKyNpZm5kZWYgQ09ORklHX0VWQQorRkVYUE9SVChfX2J6ZXJvKQorI2VuZGlmCisJX19CVUlMRF9CWkVSTyBMRUdBQ1lfTU9ERQorCisjaWZkZWYgQ09ORklHX0VWQQorTEVBRihfX2J6ZXJvKQorCV9fQlVJTERfQlpFUk8gRVZBX01PREUKK0VORChfX2J6ZXJvKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL3N0cmxlbl91c2VyLlMgYi9hcmNoL21pcHMvbGliL3N0cmxlbl91c2VyLlMKaW5kZXggZTM2MmRjZC4uYmVmNjVjOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi9zdHJsZW5fdXNlci5TCisrKyBiL2FyY2gvbWlwcy9saWIvc3RybGVuX3VzZXIuUwpAQCAtMjIsMTkgKzIyLDQzIEBACiAgKgogICogUmV0dXJuIDAgZm9yIGVycm9yCiAgKi8KLUxFQUYoX19zdHJsZW5fdXNlcl9hc20pCisJLm1hY3JvIF9fQlVJTERfU1RSTEVOX0FTTSBmdW5jCitMRUFGKF9fc3RybGVuX1xmdW5jXCgpX2FzbSkKIAlMT05HX0wJCXYwLCBUSV9BRERSX0xJTUlUKCQyOCkJIyBwb2ludGVyIG9rPwogCWFuZAkJdjAsIGEwCi0JYm5legkJdjAsIC5MZmF1bHQKKwlibmV6CQl2MCwgLkxmYXVsdFxACiAKLUZFWFBPUlQoX19zdHJsZW5fdXNlcl9ub2NoZWNrX2FzbSkKK0ZFWFBPUlQoX19zdHJsZW5fXGZ1bmNcKClfbm9jaGVja19hc20pCiAJbW92ZQkJdjAsIGEwCi0xOglFWChsYnUsIHYxLCAodjApLCAuTGZhdWx0KQorLmlmZXFzICJcZnVuYyIsICJrZXJuZWwiCisxOglFWChsYnUsIHYxLCAodjApLCAuTGZhdWx0XEApCisuZWxzZQorMToJRVgobGJ1ZSwgdjEsICh2MCksIC5MZmF1bHRcQCkKKy5lbmRpZgogCVBUUl9BRERJVQl2MCwgMQogCWJuZXoJCXYxLCAxYgogCVBUUl9TVUJVCXYwLCBhMAogCWpyCQlyYQotCUVORChfX3N0cmxlbl91c2VyX2FzbSkKKwlFTkQoX19zdHJsZW5fXGZ1bmNcKClfYXNtKQogCi0uTGZhdWx0Ogltb3ZlCQl2MCwgemVybworLkxmYXVsdFxAOgltb3ZlCQl2MCwgemVybwogCWpyCQlyYQorCS5lbmRtCisKKyNpZm5kZWYgQ09ORklHX0VWQQorCS8qIFNldCBhbGlhc2VzICovCisJLmdsb2JhbCBfX3N0cmxlbl91c2VyX2FzbQorCS5nbG9iYWwgX19zdHJsZW5fdXNlcl9ub2NoZWNrX2FzbQorCS5zZXQgX19zdHJsZW5fdXNlcl9hc20sIF9fc3RybGVuX2tlcm5lbF9hc20KKwkuc2V0IF9fc3RybGVuX3VzZXJfbm9jaGVja19hc20sIF9fc3RybGVuX2tlcm5lbF9ub2NoZWNrX2FzbQorI2VuZGlmCisKK19fQlVJTERfU1RSTEVOX0FTTSBrZXJuZWwKKworI2lmZGVmIENPTkZJR19FVkEKKworCS5zZXQgcHVzaAorCS5zZXQgZXZhCitfX0JVSUxEX1NUUkxFTl9BU00gdXNlcgorCS5zZXQgcG9wCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvc3RybmNweV91c2VyLlMgYi9hcmNoL21pcHMvbGliL3N0cm5jcHlfdXNlci5TCmluZGV4IDkyODcwYjYuLmQzMzAxY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9saWIvc3RybmNweV91c2VyLlMKKysrIGIvYXJjaC9taXBzL2xpYi9zdHJuY3B5X3VzZXIuUwpAQCAtMjgsMTYgKzI4LDIxIEBACiAgKiBpdCBoYXBwZW5zIGF0IG1vc3Qgc29tZSBieXRlcyBvZiB0aGUgZXhjZXB0aW9ucyBoYW5kbGVycyB3aWxsIGJlIGNvcGllZC4KICAqLwogCi1MRUFGKF9fc3RybmNweV9mcm9tX3VzZXJfYXNtKQorCS5tYWNybyBfX0JVSUxEX1NUUk5DUFlfQVNNIGZ1bmMKK0xFQUYoX19zdHJuY3B5X2Zyb21fXGZ1bmNcKClfYXNtKQogCUxPTkdfTAkJdjAsIFRJX0FERFJfTElNSVQoJDI4KQkjIHBvaW50ZXIgb2s/CiAJYW5kCQl2MCwgYTEKLQlibmV6CQl2MCwgLkxmYXVsdAorCWJuZXoJCXYwLCAuTGZhdWx0XEAKIAotRkVYUE9SVChfX3N0cm5jcHlfZnJvbV91c2VyX25vY2hlY2tfYXNtKQorRkVYUE9SVChfX3N0cm5jcHlfZnJvbV9cZnVuY1woKV9ub2NoZWNrX2FzbSkKIAkuc2V0CQlub3Jlb3JkZXIKIAltb3ZlCQl0MCwgemVybwogCW1vdmUJCXYxLCBhMQotMToJRVgobGJ1LCB2MCwgKHYxKSwgLkxmYXVsdCkKKy5pZmVxcyAiXGZ1bmMiLCJrZXJuZWwiCisxOglFWChsYnUsIHYwLCAodjEpLCAuTGZhdWx0XEApCisuZWxzZQorMToJRVgobGJ1ZSwgdjAsICh2MSksIC5MZmF1bHRcQCkKKy5lbmRpZgogCVBUUl9BRERJVQl2MSwgMQogCVIxMEtDQkFSUklFUigwKHJhKSkKIAliZXF6CQl2MCwgMmYKQEAgLTQ3LDE1ICs1MiwzNCBAQAogCSBQVFJfQURESVUJYTAsIDEKIDI6CVBUUl9BRERVCXYwLCBhMSwgdDAKIAl4b3IJCXYwLCBhMQotCWJsdHoJCXYwLCAuTGZhdWx0CisJYmx0egkJdjAsIC5MZmF1bHRcQAogCSBub3AKIAlqcgkJcmEJCQkjIHJldHVybiBuCiAJIG1vdmUJCXYwLCB0MAotCUVORChfX3N0cm5jcHlfZnJvbV91c2VyX2FzbSkKKwlFTkQoX19zdHJuY3B5X2Zyb21fXGZ1bmNcKClfYXNtKQogCi0uTGZhdWx0OiBqcgkJcmEKKy5MZmF1bHRcQDoganIJCXJhCiAJICBsaQkJdjAsIC1FRkFVTFQKIAogCS5zZWN0aW9uCV9fZXhfdGFibGUsImEiCi0JUFRSCQkxYiwgLkxmYXVsdAorCVBUUgkJMWIsIC5MZmF1bHRcQAogCS5wcmV2aW91cworCisJLmVuZG0KKworI2lmbmRlZiBDT05GSUdfRVZBCisJLyogU2V0IGFsaWFzZXMgKi8KKwkuZ2xvYmFsIF9fc3RybmNweV9mcm9tX3VzZXJfYXNtCisJLmdsb2JhbCBfX3N0cm5jcHlfZnJvbV91c2VyX25vY2hlY2tfYXNtCisJLnNldCBfX3N0cm5jcHlfZnJvbV91c2VyX2FzbSwgX19zdHJuY3B5X2Zyb21fa2VybmVsX2FzbQorCS5zZXQgX19zdHJuY3B5X2Zyb21fdXNlcl9ub2NoZWNrX2FzbSwgX19zdHJuY3B5X2Zyb21fa2VybmVsX25vY2hlY2tfYXNtCisjZW5kaWYKKworX19CVUlMRF9TVFJOQ1BZX0FTTSBrZXJuZWwKKworI2lmZGVmIENPTkZJR19FVkEKKwkuc2V0IHB1c2gKKwkuc2V0IGV2YQorX19CVUlMRF9TVFJOQ1BZX0FTTSB1c2VyCisJLnNldCBwb3AKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9zdHJubGVuX3VzZXIuUyBiL2FyY2gvbWlwcy9saWIvc3Rybmxlbl91c2VyLlMKaW5kZXggZmNhY2VhNS4uZjNhZjY5OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi9zdHJubGVuX3VzZXIuUworKysgYi9hcmNoL21pcHMvbGliL3N0cm5sZW5fdXNlci5TCkBAIC0yNSwyMiArMjUsNDYgQEAKICAqCSBieXRlcy4JIFRoZXJlJ3Mgbm90aGluZyBzZWNyZXQgdGhlcmUuCU9uIDY0LWJpdCBhY2Nlc3NpbmcgYmV5b25kCiAgKgkgdGhlIG1heGltdW0gaXMgYSB0YWQgaGFpcmllciAuLi4KICAqLwotTEVBRihfX3N0cm5sZW5fdXNlcl9hc20pCisJLm1hY3JvIF9fQlVJTERfU1RSTkxFTl9BU00gZnVuYworTEVBRihfX3N0cm5sZW5fXGZ1bmNcKClfYXNtKQogCUxPTkdfTAkJdjAsIFRJX0FERFJfTElNSVQoJDI4KQkjIHBvaW50ZXIgb2s/CiAJYW5kCQl2MCwgYTAKLQlibmV6CQl2MCwgLkxmYXVsdAorCWJuZXoJCXYwLCAuTGZhdWx0XEAKIAotRkVYUE9SVChfX3N0cm5sZW5fdXNlcl9ub2NoZWNrX2FzbSkKK0ZFWFBPUlQoX19zdHJubGVuX1xmdW5jXCgpX25vY2hlY2tfYXNtKQogCW1vdmUJCXYwLCBhMAogCVBUUl9BRERVCWExLCBhMAkJCSMgc3RvcCBwb2ludGVyCiAxOgliZXEJCXYwLCBhMSwgMWYJCSMgbGltaXQgcmVhY2hlZD8KLQlFWChsYiwgdDAsICh2MCksIC5MZmF1bHQpCisuaWZlcXMgIlxmdW5jIiwgImtlcm5lbCIKKwlFWChsYiwgdDAsICh2MCksIC5MZmF1bHRcQCkKKy5lbHNlCisJRVgobGJlLCB0MCwgKHYwKSwgLkxmYXVsdFxAKQorLmVuZGlmCiAJUFRSX0FERElVCXYwLCAxCiAJYm5legkJdDAsIDFiCiAxOglQVFJfU1VCVQl2MCwgYTAKIAlqcgkJcmEKLQlFTkQoX19zdHJubGVuX3VzZXJfYXNtKQorCUVORChfX3N0cm5sZW5fXGZ1bmNcKClfYXNtKQogCi0uTGZhdWx0OgorLkxmYXVsdFxAOgogCW1vdmUJCXYwLCB6ZXJvCiAJanIJCXJhCisJLmVuZG0KKworI2lmbmRlZiBDT05GSUdfRVZBCisJLyogU2V0IGFsaWFzZXMgKi8KKwkuZ2xvYmFsIF9fc3Rybmxlbl91c2VyX2FzbQorCS5nbG9iYWwgX19zdHJubGVuX3VzZXJfbm9jaGVja19hc20KKwkuc2V0IF9fc3Rybmxlbl91c2VyX2FzbSwgX19zdHJubGVuX2tlcm5lbF9hc20KKwkuc2V0IF9fc3Rybmxlbl91c2VyX25vY2hlY2tfYXNtLCBfX3N0cm5sZW5fa2VybmVsX25vY2hlY2tfYXNtCisjZW5kaWYKKworX19CVUlMRF9TVFJOTEVOX0FTTSBrZXJuZWwKKworI2lmZGVmIENPTkZJR19FVkEKKworCS5zZXQgcHVzaAorCS5zZXQgZXZhCitfX0JVSUxEX1NUUk5MRU5fQVNNIHVzZXIKKwkuc2V0IHBvcAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vS2NvbmZpZyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9LY29uZmlnCmluZGV4IDI2M2JlYjkuLjczOTdiZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9LY29uZmlnCkBAIC01OSw2ICs1OSwzNiBAQAogCiAJICBUaGVzZSBmYW1pbHkgbWFjaGluZXMgaW5jbHVkZSBmdWxvb25nMmYgbWluaSBQQywgeWVlbG9vbmcyZiBub3RlYm9vaywKIAkgIExpbmdMb29uZyBhbGxpbm9uZSBQQyBhbmQgc28gZm9ydGguCisKK2NvbmZpZyBMRU1PVEVfTUFDSDNBCisJYm9vbCAiTGVtb3RlIExvb25nc29uIDNBIGZhbWlseSBtYWNoaW5lcyIKKwlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCisJc2VsZWN0IEdFTkVSSUNfSVNBX0RNQV9TVVBQT1JUX0JST0tFTgorCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKKwlzZWxlY3QgQk9PVF9FTEYzMgorCXNlbGVjdCBCT0FSRF9TQ0FDSEUKKwlzZWxlY3QgQ1NSQ19SNEsKKwlzZWxlY3QgQ0VWVF9SNEsKKwlzZWxlY3QgQ1BVX0hBU19XQgorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IElTQQorCXNlbGVjdCBIVF9QQ0kKKwlzZWxlY3QgSTgyNTkKKwlzZWxlY3QgSVJRX0NQVQorCXNlbGVjdCBOUl9DUFVTX0RFRkFVTFRfNAorCXNlbGVjdCBTWVNfSEFTX0NQVV9MT09OR1NPTjMKKwlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfSE9UUExVR19DUFUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfSElHSE1FTQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCXNlbGVjdCBMT09OR1NPTl9NQzE0NjgxOAorCXNlbGVjdCBaT05FX0RNQTMyCisJc2VsZWN0IExFRklfRklSTVdBUkVfSU5URVJGQUNFCisJaGVscAorCQlMZW1vdGUgTG9vbmdzb24gM0EgZmFtaWx5IG1hY2hpbmVzIHV0aWxpemUgdGhlIDNBIHJldmlzaW9uIG9mCisJCUxvb25nc29uIHByb2Nlc3NvciBhbmQgUlM3ODAvU0JYMDAgY2hpcHNldC4KIGVuZGNob2ljZQogCiBjb25maWcgQ1M1NTM2CkBAIC04Niw4ICsxMTYsMjUgQEAKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIEVBUkxZX1BSSU5USyB8fCBTRVJJQUxfODI1MAogCitjb25maWcgSU9NTVVfSEVMUEVSCisJYm9vbAorCitjb25maWcgTkVFRF9TR19ETUFfTEVOR1RICisJYm9vbAorCitjb25maWcgU1dJT1RMQgorCWJvb2wgIlNvZnQgSU9NTVUgU3VwcG9ydCBmb3IgQWxsLU1lbW9yeSBETUEiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDUFVfTE9PTkdTT04zCisJc2VsZWN0IElPTU1VX0hFTFBFUgorCXNlbGVjdCBORUVEX1NHX0RNQV9MRU5HVEgKKwlzZWxlY3QgTkVFRF9ETUFfTUFQX1NUQVRFCisKIGNvbmZpZyBMT09OR1NPTl9NQzE0NjgxOAogCWJvb2wKIAlkZWZhdWx0IG4KIAorY29uZmlnIExFRklfRklSTVdBUkVfSU5URVJGQUNFCisJYm9vbAorCiBlbmRpZiAjIE1BQ0hfTE9PTkdTT04KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9NYWtlZmlsZQppbmRleCAwZGMwMDU1Li43NDI5OTk0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL01ha2VmaWxlCkBAIC0xNSwzICsxNSw5IEBACiAjCiAKIG9iai0kKENPTkZJR19MRU1PVEVfTUFDSDJGKSAgKz0gbGVtb3RlLTJmLworCisjCisjIEFsbCBMb29uZ3Nvbi0zIGZhbWlseSBtYWNoaW5lcworIworCitvYmotJChDT05GSUdfQ1BVX0xPT05HU09OMykgICs9IGxvb25nc29uLTMvCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vUGxhdGZvcm0gYi9hcmNoL21pcHMvbG9vbmdzb24vUGxhdGZvcm0KaW5kZXggMjk2OTJlNS4uNjIwNTM3MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL1BsYXRmb3JtCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9QbGF0Zm9ybQpAQCAtMzAsMyArMzAsNCBAQAogY2ZsYWdzLSQoQ09ORklHX01BQ0hfTE9PTkdTT04pICs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3NvbiAtbW5vLWJyYW5jaC1saWtlbHkKIGxvYWQtJChDT05GSUdfTEVNT1RFX0ZVTE9PTkcyRSkgKz0gMHhmZmZmZmZmZjgwMTAwMDAwCiBsb2FkLSQoQ09ORklHX0xFTU9URV9NQUNIMkYpICs9IDB4ZmZmZmZmZmY4MDIwMDAwMAorbG9hZC0kKENPTkZJR19DUFVfTE9PTkdTT04zKSArPSAweGZmZmZmZmZmODAyMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vTWFrZWZpbGUgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL01ha2VmaWxlCmluZGV4IDllNDQ4NGMuLjBiYjljYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9NYWtlZmlsZQpAQCAtMjYsMyArMjYsOCBAQAogIwogCiBvYmotJChDT05GSUdfTE9PTkdTT05fU1VTUEVORCkgKz0gcG0ubworCisjCisjIEJpZyBNZW1vcnkgKFNXSU9UTEIpIFN1cHBvcnQKKyMKK29iai0kKENPTkZJR19TV0lPVExCKSArPSBkbWEtc3dpb3RsYi5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2RtYS1zd2lvdGxiLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2RtYS1zd2lvdGxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiZTAxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vZG1hLXN3aW90bGIuYwpAQCAtMCwwICsxLDEzNiBAQAorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8Ym9vdF9wYXJhbS5oPgorI2luY2x1ZGUgPGRtYS1jb2hlcmVuY2UuaD4KKworc3RhdGljIHZvaWQgKmxvb25nc29uX2RtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBnZnAsIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCXZvaWQgKnJldDsKKworCWlmIChkbWFfYWxsb2NfZnJvbV9jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsICZyZXQpKQorCQlyZXR1cm4gcmV0OworCisJLyogaWdub3JlIHJlZ2lvbiBzcGVjaWZpZXJzICovCisJZ2ZwICY9IH4oX19HRlBfRE1BIHwgX19HRlBfRE1BMzIgfCBfX0dGUF9ISUdITUVNKTsKKworI2lmZGVmIENPTkZJR19JU0EKKwlpZiAoZGV2ID09IE5VTEwpCisJCWdmcCB8PSBfX0dGUF9ETUE7CisJZWxzZQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1pPTkVfRE1BCisJaWYgKGRldi0+Y29oZXJlbnRfZG1hX21hc2sgPCBETUFfQklUX01BU0soMzIpKQorCQlnZnAgfD0gX19HRlBfRE1BOworCWVsc2UKKyNlbmRpZgorI2lmZGVmIENPTkZJR19aT05FX0RNQTMyCisJaWYgKGRldi0+Y29oZXJlbnRfZG1hX21hc2sgPCBETUFfQklUX01BU0soNDApKQorCQlnZnAgfD0gX19HRlBfRE1BMzI7CisJZWxzZQorI2VuZGlmCisJOworCWdmcCB8PSBfX0dGUF9OT1JFVFJZOworCisJcmV0ID0gc3dpb3RsYl9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsIGdmcCk7CisJbWIoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBsb29uZ3Nvbl9kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQl2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlpZiAoZG1hX3JlbGVhc2VfZnJvbV9jb2hlcmVudChkZXYsIG9yZGVyLCB2YWRkcikpCisJCXJldHVybjsKKworCXN3aW90bGJfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgbG9vbmdzb25fZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlkbWFfYWRkcl90IGRhZGRyID0gc3dpb3RsYl9tYXBfcGFnZShkZXYsIHBhZ2UsIG9mZnNldCwgc2l6ZSwKKwkJCQkJZGlyLCBhdHRycyk7CisJbWIoKTsKKwlyZXR1cm4gZGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgbG9vbmdzb25fZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJaW50IHIgPSBzd2lvdGxiX21hcF9zZ19hdHRycyhkZXYsIHNnLCBuZW50cywgZGlyLCBOVUxMKTsKKwltYigpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGxvb25nc29uX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBkbWFfaGFuZGxlLCBzaXplLCBkaXIpOworCW1iKCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvb25nc29uX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UoZGV2LCBzZywgbmVudHMsIGRpcik7CisJbWIoKTsKK30KKworc3RhdGljIGludCBsb29uZ3Nvbl9kbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlpZiAobWFzayA+IERNQV9CSVRfTUFTSyhsb29uZ3Nvbl9zeXNjb25mLmRtYV9tYXNrX2JpdHMpKSB7CisJCSpkZXYtPmRtYV9tYXNrID0gRE1BX0JJVF9NQVNLKGxvb25nc29uX3N5c2NvbmYuZG1hX21hc2tfYml0cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCSpkZXYtPmRtYV9tYXNrID0gbWFzazsKKworCXJldHVybiAwOworfQorCitkbWFfYWRkcl90IHBoeXNfdG9fZG1hKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgcGFkZHIpCit7CisJcmV0dXJuIHBhZGRyOworfQorCitwaHlzX2FkZHJfdCBkbWFfdG9fcGh5cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZGFkZHIpCit7CisJcmV0dXJuIGRhZGRyOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9tYXBfb3BzIGxvb25nc29uX2RtYV9tYXBfb3BzID0geworCS5hbGxvYyA9IGxvb25nc29uX2RtYV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZSA9IGxvb25nc29uX2RtYV9mcmVlX2NvaGVyZW50LAorCS5tYXBfcGFnZSA9IGxvb25nc29uX2RtYV9tYXBfcGFnZSwKKwkudW5tYXBfcGFnZSA9IHN3aW90bGJfdW5tYXBfcGFnZSwKKwkubWFwX3NnID0gbG9vbmdzb25fZG1hX21hcF9zZywKKwkudW5tYXBfc2cgPSBzd2lvdGxiX3VubWFwX3NnX2F0dHJzLAorCS5zeW5jX3NpbmdsZV9mb3JfY3B1ID0gc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1LAorCS5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlID0gbG9vbmdzb25fZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UsCisJLnN5bmNfc2dfZm9yX2NwdSA9IHN3aW90bGJfc3luY19zZ19mb3JfY3B1LAorCS5zeW5jX3NnX2Zvcl9kZXZpY2UgPSBsb29uZ3Nvbl9kbWFfc3luY19zZ19mb3JfZGV2aWNlLAorCS5tYXBwaW5nX2Vycm9yID0gc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvciwKKwkuZG1hX3N1cHBvcnRlZCA9IHN3aW90bGJfZG1hX3N1cHBvcnRlZCwKKwkuc2V0X2RtYV9tYXNrID0gbG9vbmdzb25fZG1hX3NldF9tYXNrCit9OworCit2b2lkIF9faW5pdCBwbGF0X3N3aW90bGJfc2V0dXAodm9pZCkKK3sKKwlzd2lvdGxiX2luaXQoMSk7CisJbWlwc19kbWFfbWFwX29wcyA9ICZsb29uZ3Nvbl9kbWFfbWFwX29wczsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vZW52LmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2Vudi5jCmluZGV4IDBhMThmY2YuLjBjNTQzZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vZW52LmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9lbnYuYwpAQCAtMTgsMjkgKzE4LDMwIEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLQogI2luY2x1ZGUgPGxvb25nc29uLmg+CisjaW5jbHVkZSA8Ym9vdF9wYXJhbS5oPgogCi11bnNpZ25lZCBsb25nIGNwdV9jbG9ja19mcmVxOwordTMyIGNwdV9jbG9ja19mcmVxOwogRVhQT1JUX1NZTUJPTChjcHVfY2xvY2tfZnJlcSk7Ci11bnNpZ25lZCBsb25nIG1lbXNpemUsIGhpZ2htZW1zaXplOworc3RydWN0IGVmaV9tZW1vcnlfbWFwX2xvb25nc29uICpsb29uZ3Nvbl9tZW1tYXA7CitzdHJ1Y3QgbG9vbmdzb25fc3lzdGVtX2NvbmZpZ3VyYXRpb24gbG9vbmdzb25fc3lzY29uZjsKIAogI2RlZmluZSBwYXJzZV9ldmVuX2VhcmxpZXIocmVzLCBvcHRpb24sIHApCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJdW5zaWduZWQgaW50IHRtcCBfX21heWJlX3VudXNlZDsJCQkJXAogCQkJCQkJCQkJXAogCWlmIChzdHJuY21wKG9wdGlvbiwgKGNoYXIgKilwLCBzdHJsZW4ob3B0aW9uKSkgPT0gMCkJCVwKLQkJdG1wID0gc3RyaWN0X3N0cnRvbCgoY2hhciAqKXAgKyBzdHJsZW4ob3B0aW9uIj0iKSwgMTAsICZyZXMpOyBcCisJCXRtcCA9IGtzdHJ0b3UzMigoY2hhciAqKXAgKyBzdHJsZW4ob3B0aW9uIj0iKSwgMTAsICZyZXMpOyBcCiB9IHdoaWxlICgwKQogCiB2b2lkIF9faW5pdCBwcm9tX2luaXRfZW52KHZvaWQpCiB7CiAJLyogcG1vbiBwYXNzZXMgYXJndW1lbnRzIGluIDMyYml0IHBvaW50ZXJzICovCi0JaW50ICpfcHJvbV9lbnZwOwotCXVuc2lnbmVkIGxvbmcgYnVzX2Nsb2NrOwogCXVuc2lnbmVkIGludCBwcm9jZXNzb3JfaWQ7CisKKyNpZm5kZWYgQ09ORklHX0xFRklfRklSTVdBUkVfSU5URVJGQUNFCisJaW50ICpfcHJvbV9lbnZwOwogCWxvbmcgbDsKIAogCS8qIGZpcm13YXJlIGFyZ3VtZW50cyBhcmUgaW5pdGlhbGl6ZWQgaW4gaGVhZC5TICovCkBAIC00OCw3ICs0OSw2IEBACiAKIAlsID0gKGxvbmcpKl9wcm9tX2VudnA7CiAJd2hpbGUgKGwgIT0gMCkgewotCQlwYXJzZV9ldmVuX2VhcmxpZXIoYnVzX2Nsb2NrLCAiYnVzY2xvY2siLCBsKTsKIAkJcGFyc2VfZXZlbl9lYXJsaWVyKGNwdV9jbG9ja19mcmVxLCAiY3B1Y2xvY2siLCBsKTsKIAkJcGFyc2VfZXZlbl9lYXJsaWVyKG1lbXNpemUsICJtZW1zaXplIiwgbCk7CiAJCXBhcnNlX2V2ZW5fZWFybGllcihoaWdobWVtc2l6ZSwgImhpZ2htZW1zaXplIiwgbCk7CkBAIC01Nyw4ICs1Nyw0OCBAQAogCX0KIAlpZiAobWVtc2l6ZSA9PSAwKQogCQltZW1zaXplID0gMjU2OwotCWlmIChidXNfY2xvY2sgPT0gMCkKLQkJYnVzX2Nsb2NrID0gNjYwMDAwMDA7CisJcHJfaW5mbygibWVtc2l6ZT0ldSwgaGlnaG1lbXNpemU9JXVcbiIsIG1lbXNpemUsIGhpZ2htZW1zaXplKTsKKyNlbHNlCisJc3RydWN0IGJvb3RfcGFyYW1zICpib290X3A7CisJc3RydWN0IGxvb25nc29uX3BhcmFtcyAqbG9vbmdzb25fcDsKKwlzdHJ1Y3QgZWZpX2NwdWluZm9fbG9vbmdzb24gKmVjcHU7CisJc3RydWN0IGlycV9zb3VyY2Vfcm91dGluZ190YWJsZSAqZWlycV9zb3VyY2U7CisKKwkvKiBmaXJtd2FyZSBhcmd1bWVudHMgYXJlIGluaXRpYWxpemVkIGluIGhlYWQuUyAqLworCWJvb3RfcCA9IChzdHJ1Y3QgYm9vdF9wYXJhbXMgKilmd19hcmcyOworCWxvb25nc29uX3AgPSAmKGJvb3RfcC0+ZWZpLnNtYmlvcy5scCk7CisKKwllY3B1ID0gKHN0cnVjdCBlZmlfY3B1aW5mb19sb29uZ3NvbiAqKQorCQkoKHU2NClsb29uZ3Nvbl9wICsgbG9vbmdzb25fcC0+Y3B1X29mZnNldCk7CisJZWlycV9zb3VyY2UgPSAoc3RydWN0IGlycV9zb3VyY2Vfcm91dGluZ190YWJsZSAqKQorCQkoKHU2NClsb29uZ3Nvbl9wICsgbG9vbmdzb25fcC0+aXJxX29mZnNldCk7CisJbG9vbmdzb25fbWVtbWFwID0gKHN0cnVjdCBlZmlfbWVtb3J5X21hcF9sb29uZ3NvbiAqKQorCQkoKHU2NClsb29uZ3Nvbl9wICsgbG9vbmdzb25fcC0+bWVtb3J5X29mZnNldCk7CisKKwljcHVfY2xvY2tfZnJlcSA9IGVjcHUtPmNwdV9jbG9ja19mcmVxOworCWxvb25nc29uX3N5c2NvbmYuY3B1dHlwZSA9IGVjcHUtPmNwdXR5cGU7CisJbG9vbmdzb25fc3lzY29uZi5ucl9jcHVzID0gZWNwdS0+bnJfY3B1czsKKwlpZiAoZWNwdS0+bnJfY3B1cyA+IE5SX0NQVVMgfHwgZWNwdS0+bnJfY3B1cyA9PSAwKQorCQlsb29uZ3Nvbl9zeXNjb25mLm5yX2NwdXMgPSBOUl9DUFVTOworCisJbG9vbmdzb25fc3lzY29uZi5wY2lfbWVtX3N0YXJ0X2FkZHIgPSBlaXJxX3NvdXJjZS0+cGNpX21lbV9zdGFydF9hZGRyOworCWxvb25nc29uX3N5c2NvbmYucGNpX21lbV9lbmRfYWRkciA9IGVpcnFfc291cmNlLT5wY2lfbWVtX2VuZF9hZGRyOworCWxvb25nc29uX3N5c2NvbmYucGNpX2lvX2Jhc2UgPSBlaXJxX3NvdXJjZS0+cGNpX2lvX3N0YXJ0X2FkZHI7CisJbG9vbmdzb25fc3lzY29uZi5kbWFfbWFza19iaXRzID0gZWlycV9zb3VyY2UtPmRtYV9tYXNrX2JpdHM7CisJaWYgKGxvb25nc29uX3N5c2NvbmYuZG1hX21hc2tfYml0cyA8IDMyIHx8CisJCWxvb25nc29uX3N5c2NvbmYuZG1hX21hc2tfYml0cyA+IDY0KQorCQlsb29uZ3Nvbl9zeXNjb25mLmRtYV9tYXNrX2JpdHMgPSAzMjsKKworCWxvb25nc29uX3N5c2NvbmYucmVzdGFydF9hZGRyID0gYm9vdF9wLT5yZXNldF9zeXN0ZW0uUmVzZXRXYXJtOworCWxvb25nc29uX3N5c2NvbmYucG93ZXJvZmZfYWRkciA9IGJvb3RfcC0+cmVzZXRfc3lzdGVtLlNodXRkb3duOworCWxvb25nc29uX3N5c2NvbmYuc3VzcGVuZF9hZGRyID0gYm9vdF9wLT5yZXNldF9zeXN0ZW0uRG9TdXNwZW5kOworCisJbG9vbmdzb25fc3lzY29uZi5odF9jb250cm9sX2Jhc2UgPSAweDkwMDAwRUZERkIwMDAwMDA7CisJbG9vbmdzb25fc3lzY29uZi52Z2FiaW9zX2FkZHIgPSBib290X3AtPmVmaS5zbWJpb3MudmdhX2Jpb3M7CisJcHJfZGVidWcoIlNodXRkb3duIEFkZHI6ICVsbHgsIFJlc3RhcnQgQWRkcjogJWxseCwgVkJJT1MgQWRkcjogJWxseFxuIiwKKwkJbG9vbmdzb25fc3lzY29uZi5wb3dlcm9mZl9hZGRyLCBsb29uZ3Nvbl9zeXNjb25mLnJlc3RhcnRfYWRkciwKKwkJbG9vbmdzb25fc3lzY29uZi52Z2FiaW9zX2FkZHIpOworI2VuZGlmCiAJaWYgKGNwdV9jbG9ja19mcmVxID09IDApIHsKIAkJcHJvY2Vzc29yX2lkID0gKCZjdXJyZW50X2NwdV9kYXRhKS0+cHJvY2Vzc29yX2lkOwogCQlzd2l0Y2ggKHByb2Nlc3Nvcl9pZCAmIFBSSURfUkVWX01BU0spIHsKQEAgLTY4LDEyICsxMDgsMTMgQEAKIAkJY2FzZSBQUklEX1JFVl9MT09OR1NPTjJGOgogCQkJY3B1X2Nsb2NrX2ZyZXEgPSA3OTcwMDAwMDA7CiAJCQlicmVhazsKKwkJY2FzZSBQUklEX1JFVl9MT09OR1NPTjNBOgorCQkJY3B1X2Nsb2NrX2ZyZXEgPSA5MDAwMDAwMDA7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWNwdV9jbG9ja19mcmVxID0gMTAwMDAwMDAwOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KLQlwcl9pbmZvKCJidXNjbG9jaz0lbGQsIGNwdWNsb2NrPSVsZCwgbWVtc2l6ZT0lbGQsIGhpZ2htZW1zaXplPSVsZFxuIiwKLQkJYnVzX2Nsb2NrLCBjcHVfY2xvY2tfZnJlcSwgbWVtc2l6ZSwgaGlnaG1lbXNpemUpOworCXByX2luZm8oIkNwdUNsb2NrID0gJXVcbiIsIGNwdV9jbG9ja19mcmVxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaW5pdC5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9pbml0LmMKaW5kZXggYWU3YWYxZi4uZjM3ZmU1NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9pbml0LmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9pbml0LmMKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxhc20vc21wLW9wcy5oPgogCiAjaW5jbHVkZSA8bG9vbmdzb24uaD4KIApAQCAtMTcsMTAgKzE4LDYgQEAKIAogdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCiB7Ci0JLyogaW5pdCBiYXNlIGFkZHJlc3Mgb2YgaW8gc3BhY2UgKi8KLQlzZXRfaW9fcG9ydF9iYXNlKCh1bnNpZ25lZCBsb25nKQotCQlpb3JlbWFwKExPT05HU09OX1BDSUlPX0JBU0UsIExPT05HU09OX1BDSUlPX1NJWkUpKTsKLQogI2lmZGVmIENPTkZJR19DUFVfU1VQUE9SVFNfQUREUldJTkNGRwogCV9sb29uZ3Nvbl9hZGRyd2luY2ZnX2Jhc2UgPSAodW5zaWduZWQgbG9uZykKIAkJaW9yZW1hcChMT09OR1NPTl9BRERSV0lOQ0ZHX0JBU0UsIExPT05HU09OX0FERFJXSU5DRkdfU0laRSk7CkBAIC0yOCwxMCArMjUsMTYgQEAKIAogCXByb21faW5pdF9jbWRsaW5lKCk7CiAJcHJvbV9pbml0X2VudigpOworCisJLyogaW5pdCBiYXNlIGFkZHJlc3Mgb2YgaW8gc3BhY2UgKi8KKwlzZXRfaW9fcG9ydF9iYXNlKCh1bnNpZ25lZCBsb25nKQorCQlpb3JlbWFwKExPT05HU09OX1BDSUlPX0JBU0UsIExPT05HU09OX1BDSUlPX1NJWkUpKTsKKwogCXByb21faW5pdF9tZW1vcnkoKTsKIAogCS8qaW5pdCB0aGUgdWFydCBiYXNlIGFkZHJlc3MgKi8KIAlwcm9tX2luaXRfdWFydF9iYXNlKCk7CisJcmVnaXN0ZXJfc21wX29wcygmbG9vbmdzb24zX3NtcF9vcHMpOwogfQogCiB2b2lkIF9faW5pdCBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWFjaHR5cGUuYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWFjaHR5cGUuYwppbmRleCA0YmVjZDRmLi4xYTQ3OTc5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21hY2h0eXBlLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9tYWNodHlwZS5jCkBAIC0yNyw2ICsyNywxMCBAQAogCVtNQUNIX0RFWFhPTl9HRElVTTJGMTBdCQkiZGV4eG9uLWdkaXVtLTJmIiwKIAlbTUFDSF9MRU1PVEVfTkFTXQkJImxlbW90ZS1uYXMtMmYiLAogCVtNQUNIX0xFTU9URV9MTDJGXQkJImxlbW90ZS1seW5sb29uZy0yZiIsCisJW01BQ0hfTEVNT1RFX0ExMDA0XQkJImxlbW90ZS0zYS1ub3RlYm9vay1hMTAwNCIsCisJW01BQ0hfTEVNT1RFX0ExMTAxXQkJImxlbW90ZS0zYS1pdHgtYTExMDEiLAorCVtNQUNIX0xFTU9URV9BMTIwMV0JCSJsZW1vdGUtMmdxLW5vdGVib29rLWExMjAxIiwKKwlbTUFDSF9MRU1PVEVfQTEyMDVdCQkibGVtb3RlLTJncS1haW8tYTEyMDUiLAogCVtNQUNIX0xPT05HU09OX0VORF0JCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21lbS5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9tZW0uYwppbmRleCA4NjI2YTQyLi5iMDFkNTI0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21lbS5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWVtLmMKQEAgLTExLDkgKzExLDE0IEBACiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAKICNpbmNsdWRlIDxsb29uZ3Nvbi5oPgorI2luY2x1ZGUgPGJvb3RfcGFyYW0uaD4KICNpbmNsdWRlIDxtZW0uaD4KICNpbmNsdWRlIDxwY2kuaD4KIAorI2lmbmRlZiBDT05GSUdfTEVGSV9GSVJNV0FSRV9JTlRFUkZBQ0UKKwordTMyIG1lbXNpemUsIGhpZ2htZW1zaXplOworCiB2b2lkIF9faW5pdCBwcm9tX2luaXRfbWVtb3J5KHZvaWQpCiB7CiAJYWRkX21lbW9yeV9yZWdpb24oMHgwLCAobWVtc2l6ZSA8PCAyMCksIEJPT1RfTUVNX1JBTSk7CkBAIC00OSw2ICs1NCw0MyBAQAogI2VuZGlmIC8qICFDT05GSUdfNjRCSVQgKi8KIH0KIAorI2Vsc2UgLyogQ09ORklHX0xFRklfRklSTVdBUkVfSU5URVJGQUNFICovCisKK3ZvaWQgX19pbml0IHByb21faW5pdF9tZW1vcnkodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgbm9kZV9pZDsKKwl1MzIgbWVtX3R5cGU7CisKKwkvKiBwYXJzZSBtZW1vcnkgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbG9vbmdzb25fbWVtbWFwLT5ucl9tYXA7IGkrKykgeworCQlub2RlX2lkID0gbG9vbmdzb25fbWVtbWFwLT5tYXBbaV0ubm9kZV9pZDsKKwkJbWVtX3R5cGUgPSBsb29uZ3Nvbl9tZW1tYXAtPm1hcFtpXS5tZW1fdHlwZTsKKworCQlpZiAobm9kZV9pZCA9PSAwKSB7CisJCQlzd2l0Y2ggKG1lbV90eXBlKSB7CisJCQljYXNlIFNZU1RFTV9SQU1fTE9XOgorCQkJCWFkZF9tZW1vcnlfcmVnaW9uKGxvb25nc29uX21lbW1hcC0+bWFwW2ldLm1lbV9zdGFydCwKKwkJCQkJKHU2NClsb29uZ3Nvbl9tZW1tYXAtPm1hcFtpXS5tZW1fc2l6ZSA8PCAyMCwKKwkJCQkJQk9PVF9NRU1fUkFNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1lTVEVNX1JBTV9ISUdIOgorCQkJCWFkZF9tZW1vcnlfcmVnaW9uKGxvb25nc29uX21lbW1hcC0+bWFwW2ldLm1lbV9zdGFydCwKKwkJCQkJKHU2NClsb29uZ3Nvbl9tZW1tYXAtPm1hcFtpXS5tZW1fc2l6ZSA8PCAyMCwKKwkJCQkJQk9PVF9NRU1fUkFNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUVNX1JFU0VSVkVEOgorCQkJCWFkZF9tZW1vcnlfcmVnaW9uKGxvb25nc29uX21lbW1hcC0+bWFwW2ldLm1lbV9zdGFydCwKKwkJCQkJKHU2NClsb29uZ3Nvbl9tZW1tYXAtPm1hcFtpXS5tZW1fc2l6ZSA8PCAyMCwKKwkJCQkJQk9PVF9NRU1fUkVTRVJWRUQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjZW5kaWYgLyogQ09ORklHX0xFRklfRklSTVdBUkVfSU5URVJGQUNFICovCisKIC8qIG92ZXJyaWRlIG9mIGFyY2gvbWlwcy9tbS9jYWNoZS5jOiBfX3VuY2FjaGVkX2FjY2VzcyAqLwogaW50IF9fdW5jYWNoZWRfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3BjaS5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9wY2kuYwppbmRleCBmYTc3ODQ0Li4wMDNhYjRlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3BjaS5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcGNpLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPHBjaS5oPgogI2luY2x1ZGUgPGxvb25nc29uLmg+CisjaW5jbHVkZSA8Ym9vdF9wYXJhbS5oPgogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGxvb25nc29uX3BjaV9tZW1fcmVzb3VyY2UgPSB7CiAJLm5hbWUJPSAicGNpIG1lbW9yeSBzcGFjZSIsCkBAIC04Miw3ICs4MywxMCBAQAogCXNldHVwX3BjaW1hcCgpOwogCiAJbG9vbmdzb25fcGNpX2NvbnRyb2xsZXIuaW9fbWFwX2Jhc2UgPSBtaXBzX2lvX3BvcnRfYmFzZTsKLQorI2lmZGVmIENPTkZJR19MRUZJX0ZJUk1XQVJFX0lOVEVSRkFDRQorCWxvb25nc29uX3BjaV9tZW1fcmVzb3VyY2Uuc3RhcnQgPSBsb29uZ3Nvbl9zeXNjb25mLnBjaV9tZW1fc3RhcnRfYWRkcjsKKwlsb29uZ3Nvbl9wY2lfbWVtX3Jlc291cmNlLmVuZCA9IGxvb25nc29uX3N5c2NvbmYucGNpX21lbV9lbmRfYWRkcjsKKyNlbmRpZgogCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKCZsb29uZ3Nvbl9wY2lfY29udHJvbGxlcik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcmVzZXQuYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcmVzZXQuYwppbmRleCA2NWJmYmI1Li5hNjA3MTVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3Jlc2V0LmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9yZXNldC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogCiAjaW5jbHVkZSA8bG9vbmdzb24uaD4KKyNpbmNsdWRlIDxib290X3BhcmFtLmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb29uZ3Nvbl9yZWJvb3Qodm9pZCkKIHsKQEAgLTM3LDE3ICszOCwzNyBAQAogCiBzdGF0aWMgdm9pZCBsb29uZ3Nvbl9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCiB7CisjaWZuZGVmIENPTkZJR19MRUZJX0ZJUk1XQVJFX0lOVEVSRkFDRQogCS8qIGRvIHByZXBhcmF0aW9uIGZvciByZWJvb3QgKi8KIAltYWNoX3ByZXBhcmVfcmVib290KCk7CiAKIAkvKiByZWJvb3QgdmlhIGp1bXBpbmcgdG8gYm9vdCBiYXNlIGFkZHJlc3MgKi8KIAlsb29uZ3Nvbl9yZWJvb3QoKTsKKyNlbHNlCisJdm9pZCAoKmZ3X3Jlc3RhcnQpKHZvaWQpID0gKHZvaWQgKilsb29uZ3Nvbl9zeXNjb25mLnJlc3RhcnRfYWRkcjsKKworCWZ3X3Jlc3RhcnQoKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoY3B1X3dhaXQpCisJCQljcHVfd2FpdCgpOworCX0KKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBsb29uZ3Nvbl9wb3dlcm9mZih2b2lkKQogeworI2lmbmRlZiBDT05GSUdfTEVGSV9GSVJNV0FSRV9JTlRFUkZBQ0UKIAltYWNoX3ByZXBhcmVfc2h1dGRvd24oKTsKIAl1bnJlYWNoYWJsZSgpOworI2Vsc2UKKwl2b2lkICgqZndfcG93ZXJvZmYpKHZvaWQpID0gKHZvaWQgKilsb29uZ3Nvbl9zeXNjb25mLnBvd2Vyb2ZmX2FkZHI7CisKKwlmd19wb3dlcm9mZigpOworCXdoaWxlICgxKSB7CisJCWlmIChjcHVfd2FpdCkKKwkJCWNwdV93YWl0KCk7CisJfQorI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGxvb25nc29uX2hhbHQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vc2VyaWFsLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3NlcmlhbC5jCmluZGV4IDVmMmI3OGEuLmJkMmI3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vc2VyaWFsLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9zZXJpYWwuYwpAQCAtMTksMTkgKzE5LDE5IEBACiAjaW5jbHVkZSA8bG9vbmdzb24uaD4KICNpbmNsdWRlIDxtYWNoaW5lLmg+CiAKLSNkZWZpbmUgUE9SVChpbnQpCQkJXAorI2RlZmluZSBQT1JUKGludCwgY2xrKQkJCVwKIHsJCQkJCQkJCVwKIAkuaXJxCQk9IGludCwJCQkJCVwKLQkudWFydGNsawk9IDE4NDMyMDAsCQkJCVwKKwkudWFydGNsawk9IGNsaywJCQkJCVwKIAkuaW90eXBlCQk9IFVQSU9fUE9SVCwJCQkJXAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCVwKIAkucmVnc2hpZnQJPSAwLAkJCQkJXAogfQogCi0jZGVmaW5lIFBPUlRfTShpbnQpCQkJCVwKKyNkZWZpbmUgUE9SVF9NKGludCwgY2xrKQkJCQlcCiB7CQkJCQkJCQlcCiAJLmlycQkJPSBNSVBTX0NQVV9JUlFfQkFTRSArIChpbnQpLAkJXAotCS51YXJ0Y2xrCT0gMzY4NjQwMCwJCQkJXAorCS51YXJ0Y2xrCT0gY2xrLAkJCQkJXAogCS5pb3R5cGUJCT0gVVBJT19NRU0sCQkJCVwKIAkubWVtYmFzZQk9ICh2b2lkIF9faW9tZW0gKilOVUxMLAkJCVwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAlcCkBAIC00MCwxMyArNDAsMTcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCB1YXJ0ODI1MF9kYXRhW11bMl0gPSB7CiAJW01BQ0hfTE9PTkdTT05fVU5LTk9XTl0JCXt9LAotCVtNQUNIX0xFTU9URV9GTDJFXQkJe1BPUlQoNCksIHt9IH0sCi0JW01BQ0hfTEVNT1RFX0ZMMkZdCQl7UE9SVCgzKSwge30gfSwKLQlbTUFDSF9MRU1PVEVfTUwyRjddCQl7UE9SVF9NKDMpLCB7fSB9LAotCVtNQUNIX0xFTU9URV9ZTDJGODldCQl7UE9SVF9NKDMpLCB7fSB9LAotCVtNQUNIX0RFWFhPTl9HRElVTTJGMTBdCQl7UE9SVF9NKDMpLCB7fSB9LAotCVtNQUNIX0xFTU9URV9OQVNdCQl7UE9SVF9NKDMpLCB7fSB9LAotCVtNQUNIX0xFTU9URV9MTDJGXQkJe1BPUlQoMyksIHt9IH0sCisJW01BQ0hfTEVNT1RFX0ZMMkVdICAgICAgICAgICAgICB7UE9SVCg0LCAxODQzMjAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfRkwyRl0gICAgICAgICAgICAgIHtQT1JUKDMsIDE4NDMyMDApLCB7fSB9LAorCVtNQUNIX0xFTU9URV9NTDJGN10gICAgICAgICAgICAge1BPUlRfTSgzLCAzNjg2NDAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfWUwyRjg5XSAgICAgICAgICAgIHtQT1JUX00oMywgMzY4NjQwMCksIHt9IH0sCisJW01BQ0hfREVYWE9OX0dESVVNMkYxMF0gICAgICAgICB7UE9SVF9NKDMsIDM2ODY0MDApLCB7fSB9LAorCVtNQUNIX0xFTU9URV9OQVNdICAgICAgICAgICAgICAge1BPUlRfTSgzLCAzNjg2NDAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfTEwyRl0gICAgICAgICAgICAgIHtQT1JUKDMsIDE4NDMyMDApLCB7fSB9LAorCVtNQUNIX0xFTU9URV9BMTAwNF0gICAgICAgICAgICAge1BPUlRfTSgyLCAzMzE3NzYwMCksIHt9IH0sCisJW01BQ0hfTEVNT1RFX0ExMTAxXSAgICAgICAgICAgICB7UE9SVF9NKDIsIDI1MDAwMDAwKSwge30gfSwKKwlbTUFDSF9MRU1PVEVfQTEyMDFdICAgICAgICAgICAgIHtQT1JUX00oMiwgMjUwMDAwMDApLCB7fSB9LAorCVtNQUNIX0xFTU9URV9BMTIwNV0gICAgICAgICAgICAge1BPUlRfTSgyLCAyNTAwMDAwMCksIHt9IH0sCiAJW01BQ0hfTE9PTkdTT05fRU5EXQkJe30sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3NldHVwLmMKaW5kZXggODIyM2Y4YS4uYmI0YWM5MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vc2V0dXAuYwpAQCAtMTgsOSArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjZW5kaWYKIAotdm9pZCAoKl9fd2JmbHVzaCkodm9pZCk7Ci1FWFBPUlRfU1lNQk9MKF9fd2JmbHVzaCk7Ci0KIHN0YXRpYyB2b2lkIHdiZmx1c2hfbG9vbmdzb24odm9pZCkKIHsKIAlhc20oIi5zZXRcdHB1c2hcblx0IgpAQCAtMzIsMTAgKzI5LDExIEBACiAJICAgICIuc2V0IG1pcHMwXG5cdCIpOwogfQogCit2b2lkICgqX193YmZsdXNoKSh2b2lkKSA9IHdiZmx1c2hfbG9vbmdzb247CitFWFBPUlRfU1lNQk9MKF9fd2JmbHVzaCk7CisKIHZvaWQgX19pbml0IHBsYXRfbWVtX3NldHVwKHZvaWQpCiB7Ci0JX193YmZsdXNoID0gd2JmbHVzaF9sb29uZ3NvbjsKLQogI2lmZGVmIENPTkZJR19WVAogI2lmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQogCWNvbnN3aXRjaHAgPSAmdmdhX2NvbjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vdWFydF9iYXNlLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3VhcnRfYmFzZS5jCmluZGV4IGUxOTJhZDAuLjFlMWVlZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vdWFydF9iYXNlLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi91YXJ0X2Jhc2UuYwpAQCAtMzUsOSArMzUsMTYgQEAKIAljYXNlIE1BQ0hfREVYWE9OX0dESVVNMkYxMDoKIAljYXNlIE1BQ0hfTEVNT1RFX05BUzoKIAlkZWZhdWx0OgotCQkvKiBUaGUgQ1BVIHByb3ZpZGVkIHNlcmlhbCBwb3J0ICovCisJCS8qIFRoZSBDUFUgcHJvdmlkZWQgc2VyaWFsIHBvcnQgKExQQykgKi8KIAkJbG9vbmdzb25fdWFydF9iYXNlID0gTE9PTkdTT05fTElPMV9CQVNFICsgMHgzZjg7CiAJCWJyZWFrOworCWNhc2UgTUFDSF9MRU1PVEVfQTEwMDQ6CisJY2FzZSBNQUNIX0xFTU9URV9BMTEwMToKKwljYXNlIE1BQ0hfTEVNT1RFX0ExMjAxOgorCWNhc2UgTUFDSF9MRU1PVEVfQTEyMDU6CisJCS8qIFRoZSBDUFUgcHJvdmlkZWQgc2VyaWFsIHBvcnQgKENQVSkgKi8KKwkJbG9vbmdzb25fdWFydF9iYXNlID0gTE9PTkdTT05fUkVHX0JBU0UgKyAweDFlMDsKKwkJYnJlYWs7CiAJfQogCiAJX2xvb25nc29uX3VhcnRfYmFzZSA9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9sb29uZ3Nvbi0zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTUyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIExvb25nc29uLTMgZmFtaWx5IG1hY2hpbmVzCisjCitvYmoteQkJCSs9IGlycS5vCisKK29iai0kKENPTkZJR19TTVApCSs9IHNtcC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9pcnEuYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9sb29uZ3Nvbi0zL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDA4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9pcnEuYwpAQCAtMCwwICsxLDEyNiBAQAorI2luY2x1ZGUgPGxvb25nc29uLmg+CisjaW5jbHVkZSA8aXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgorI2luY2x1ZGUgPGFzbS9pODI1OS5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorCit1bnNpZ25lZCBpbnQgaHRfaXJxW10gPSB7MSwgMywgNCwgNSwgNiwgNywgOCwgMTIsIDE0LCAxNX07CisKK3N0YXRpYyB2b2lkIGh0X2lycWRpc3BhdGNoKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIGlycTsKKworCWlycSA9IExPT05HU09OX0hUMV9JTlRfVkVDVE9SKDApOworCUxPT05HU09OX0hUMV9JTlRfVkVDVE9SKDApID0gaXJxOyAvKiBBY2tub3dsZWRnZSB0aGUgSVJRcyAqLworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHRfaXJxKTsgaSsrKSB7CisJCWlmIChpcnEgJiAoMHgxIDw8IGh0X2lycVtpXSkpCisJCQlkb19JUlEoaHRfaXJxW2ldKTsKKwl9Cit9CisKK3ZvaWQgbWFjaF9pcnFfZGlzcGF0Y2godW5zaWduZWQgaW50IHBlbmRpbmcpCit7CisJaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVA3KQorCQlkb19JUlEoTE9PTkdTT05fVElNRVJfSVJRKTsKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCisJZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDYpCisJCWxvb25nc29uM19pcGlfaW50ZXJydXB0KE5VTEwpOworI2VuZGlmCisJZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDMpCisJCWh0X2lycWRpc3BhdGNoKCk7CisJZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDIpCisJCWRvX0lSUShMT09OR1NPTl9VQVJUX0lSUSk7CisJZWxzZSB7CisJCXByX2VycigiJXMgOiBzcHVyaW91cyBpbnRlcnJ1cHRcbiIsIF9fZnVuY19fKTsKKwkJc3B1cmlvdXNfaW50ZXJydXB0KCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjYXNjYWRlX2lycWFjdGlvbiA9IHsKKwkuaGFuZGxlciA9IG5vX2FjdGlvbiwKKwkubmFtZSA9ICJjYXNjYWRlIiwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2xvb25nc29uX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJY2xlYXJfYzBfc3RhdHVzKDB4MTAwIDw8IChkLT5pcnEgLSBNSVBTX0NQVV9JUlFfQkFTRSkpOworCWlycV9kaXNhYmxlX2hhemFyZCgpOworCisJLyogV29ya2Fyb3VuZDogVUFSVCBJUlEgbWF5IGRlbGl2ZXIgdG8gYW55IGNvcmUgKi8KKwlpZiAoZC0+aXJxID09IExPT05HU09OX1VBUlRfSVJRKSB7CisJCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkJTE9PTkdTT05fSU5UX1JPVVRFUl9JTlRFTkNMUiA9IDEgPDwgMTA7CisJCUxPT05HU09OX0lOVF9ST1VURVJfTFBDID0gMHgxMCArICgxPDxjcHUpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHVubWFza19sb29uZ3Nvbl9pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCS8qIFdvcmthcm91bmQ6IFVBUlQgSVJRIG1heSBkZWxpdmVyIHRvIGFueSBjb3JlICovCisJaWYgKGQtPmlycSA9PSBMT09OR1NPTl9VQVJUX0lSUSkgeworCQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJCUxPT05HU09OX0lOVF9ST1VURVJfSU5URU5TRVQgPSAxIDw8IDEwOworCQlMT09OR1NPTl9JTlRfUk9VVEVSX0xQQyA9IDB4MTAgKyAoMTw8Y3B1KTsKKwl9CisKKwlzZXRfYzBfc3RhdHVzKDB4MTAwIDw8IChkLT5pcnEgLSBNSVBTX0NQVV9JUlFfQkFTRSkpOworCWlycV9lbmFibGVfaGF6YXJkKCk7Cit9CisKKyAvKiBGb3IgTUlQUyBJUlFzIHdoaWNoIHNoYXJlZCBieSBhbGwgY29yZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbG9vbmdzb25faXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIkxvb25nc29uIiwKKwkuaXJxX2Fjawk9IG1hc2tfbG9vbmdzb25faXJxLAorCS5pcnFfbWFzawk9IG1hc2tfbG9vbmdzb25faXJxLAorCS5pcnFfbWFza19hY2sJPSBtYXNrX2xvb25nc29uX2lycSwKKwkuaXJxX3VubWFzawk9IHVubWFza19sb29uZ3Nvbl9pcnEsCisJLmlycV9lb2kJPSB1bm1hc2tfbG9vbmdzb25faXJxLAorfTsKKwordm9pZCBpcnFfcm91dGVyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIHJvdXRlIExQQyBpbnQgdG8gY3B1IGNvcmUwIGludCAwICovCisJTE9PTkdTT05fSU5UX1JPVVRFUl9MUEMgPSBMT09OR1NPTl9JTlRfQ09SRTBfSU5UMDsKKwkvKiByb3V0ZSBIVDEgaW50MCB+IGludDcgdG8gY3B1IGNvcmUwIElOVDEqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCUxPT05HU09OX0lOVF9ST1VURVJfSFQxKGkpID0gTE9PTkdTT05fSU5UX0NPUkUwX0lOVDE7CisJLyogZW5hYmxlIEhUMSBpbnRlcnJ1cHQgKi8KKwlMT09OR1NPTl9IVDFfSU5UTl9FTigwKSA9IDB4ZmZmZmZmZmY7CisJLyogZW5hYmxlIHJvdXRlciBpbnRlcnJ1cHQgaW50ZW5zZXQgKi8KKwlMT09OR1NPTl9JTlRfUk9VVEVSX0lOVEVOU0VUID0KKwkJTE9PTkdTT05fSU5UX1JPVVRFUl9JTlRFTiB8ICgweGZmZmYgPDwgMTYpIHwgMHgxIDw8IDEwOworfQorCit2b2lkIF9faW5pdCBtYWNoX2luaXRfaXJxKHZvaWQpCit7CisJY2xlYXJfYzBfc3RhdHVzKFNUMF9JTSB8IFNUMF9CRVYpOworCisJaXJxX3JvdXRlcl9pbml0KCk7CisJbWlwc19jcHVfaXJxX2luaXQoKTsKKwlpbml0X2k4MjU5X2lycXMoKTsKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoTE9PTkdTT05fVUFSVF9JUlEsCisJCQkmbG9vbmdzb25faXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJLyogc2V0dXAgSFQxIGlycSAqLworCXNldHVwX2lycShMT09OR1NPTl9IVDFfSVJRLCAmY2FzY2FkZV9pcnFhY3Rpb24pOworCisJc2V0X2MwX3N0YXR1cyhTVEFUVVNGX0lQMiB8IFNUQVRVU0ZfSVA2KTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCit2b2lkIGZpeHVwX2lycXModm9pZCkKK3sKKwlpcnFfY3B1X29mZmxpbmUoKTsKKwljbGVhcl9jMF9zdGF0dXMoU1QwX0lNKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9zbXAuYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9sb29uZ3Nvbi0zL3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjVmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9zbXAuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiwgTGVtb3RlLCBJbmMuCisgKiBBdXRob3I6IENoZW4gSHVhY2FpLCBjaGVuaGNAbGVtb3RlLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxvb25nc29uLmg+CisKKyNpbmNsdWRlICJzbXAuaCIKKworREVGSU5FX1BFUl9DUFUoaW50LCBjcHVfc3RhdGUpOworREVGSU5FX1BFUl9DUFUodWludDMyX3QsIGNvcmUwX2MwY291bnQpOworCisvKiByZWFkIGEgMzJiaXQgdmFsdWUgZnJvbSBpcGkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgbG9vbmdzb24zX2lwaV9yZWFkMzIoYWRkcikgcmVhZGwoYWRkcikKKy8qIHJlYWQgYSA2NGJpdCB2YWx1ZSBmcm9tIGlwaSByZWdpc3RlciAqLworI2RlZmluZSBsb29uZ3NvbjNfaXBpX3JlYWQ2NChhZGRyKSByZWFkcShhZGRyKQorLyogd3JpdGUgYSAzMmJpdCB2YWx1ZSB0byBpcGkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgbG9vbmdzb24zX2lwaV93cml0ZTMyKGFjdGlvbiwgYWRkcikJXAorCWRvIHsJCQkJCVwKKwkJd3JpdGVsKGFjdGlvbiwgYWRkcik7CQlcCisJCV9fd2JmbHVzaCgpOwkJCVwKKwl9IHdoaWxlICgwKQorLyogd3JpdGUgYSA2NGJpdCB2YWx1ZSB0byBpcGkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgbG9vbmdzb24zX2lwaV93cml0ZTY0KGFjdGlvbiwgYWRkcikJXAorCWRvIHsJCQkJCVwKKwkJd3JpdGVxKGFjdGlvbiwgYWRkcik7CQlcCisJCV9fd2JmbHVzaCgpOwkJCVwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCAqaXBpX3NldDBfcmVnc1tdID0geworCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNFVDApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNFVDApLAorfTsKKworc3RhdGljIHZvaWQgKmlwaV9jbGVhcjBfcmVnc1tdID0geworCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAwX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTBfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTNfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIENMRUFSMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAzX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgQ0xFQVIwKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBDTEVBUjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIENMRUFSMCksCit9OworCitzdGF0aWMgdm9pZCAqaXBpX3N0YXR1czBfcmVnc1tdID0geworCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIFNUQVRVUzApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIFNUQVRVUzApLAorfTsKKworc3RhdGljIHZvaWQgKmlwaV9lbjBfcmVnc1tdID0geworCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAwX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTBfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTNfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIEVOMCksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAzX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgRU4wKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBFTjApLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIEVOMCksCit9OworCitzdGF0aWMgdm9pZCAqaXBpX21haWxib3hfYnVmW10gPSB7CisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAwX0JBU0UgKyBTTVBfQ09SRTBfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDBfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMF9CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAwX0JBU0UgKyBTTVBfQ09SRTNfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFMF9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMV9CQVNFICsgU01QX0NPUkUxX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAxX0JBU0UgKyBTTVBfQ09SRTJfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDFfQkFTRSArIFNNUF9DT1JFM19PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUwX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAyX0JBU0UgKyBTTVBfQ09SRTFfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDJfQkFTRSArIFNNUF9DT1JFMl9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQMl9CQVNFICsgU01QX0NPUkUzX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAzX0JBU0UgKyBTTVBfQ09SRTBfT0ZGU0VUICsgQlVGKSwKKwkodm9pZCAqKShTTVBfQ09SRV9HUk9VUDNfQkFTRSArIFNNUF9DT1JFMV9PRkZTRVQgKyBCVUYpLAorCSh2b2lkICopKFNNUF9DT1JFX0dST1VQM19CQVNFICsgU01QX0NPUkUyX09GRlNFVCArIEJVRiksCisJKHZvaWQgKikoU01QX0NPUkVfR1JPVVAzX0JBU0UgKyBTTVBfQ09SRTNfT0ZGU0VUICsgQlVGKSwKK307CisKKy8qCisgKiBTaW1wbGUgZW5vdWdoLCBqdXN0IHBva2UgdGhlIGFwcHJvcHJpYXRlIGlwaSByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZCBsb29uZ3NvbjNfc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCit7CisJbG9vbmdzb24zX2lwaV93cml0ZTMyKCh1MzIpYWN0aW9uLCBpcGlfc2V0MF9yZWdzW2NwdV0pOworfQorCitzdGF0aWMgdm9pZAorbG9vbmdzb24zX3NlbmRfaXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBhY3Rpb24pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykKKwkJbG9vbmdzb24zX2lwaV93cml0ZTMyKCh1MzIpYWN0aW9uLCBpcGlfc2V0MF9yZWdzW2ldKTsKK30KKwordm9pZCBsb29uZ3NvbjNfaXBpX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGludCBhY3Rpb24sIGMwY291bnQ7CisKKwkvKiBMb2FkIHRoZSBpcGkgcmVnaXN0ZXIgdG8gZmlndXJlIG91dCB3aGF0IHdlJ3JlIHN1cHBvc2VkIHRvIGRvICovCisJYWN0aW9uID0gbG9vbmdzb24zX2lwaV9yZWFkMzIoaXBpX3N0YXR1czBfcmVnc1tjcHVdKTsKKworCS8qIENsZWFyIHRoZSBpcGkgcmVnaXN0ZXIgdG8gY2xlYXIgdGhlIGludGVycnVwdCAqLworCWxvb25nc29uM19pcGlfd3JpdGUzMigodTMyKWFjdGlvbiwgaXBpX2NsZWFyMF9yZWdzW2NwdV0pOworCisJaWYgKGFjdGlvbiAmIFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGKQorCQlzY2hlZHVsZXJfaXBpKCk7CisKKwlpZiAoYWN0aW9uICYgU01QX0NBTExfRlVOQ1RJT04pCisJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworCisJaWYgKGFjdGlvbiAmIFNNUF9BU0tfQzBDT1VOVCkgeworCQlCVUdfT04oY3B1ICE9IDApOworCQljMGNvdW50ID0gcmVhZF9jMF9jb3VudCgpOworCQlmb3IgKGkgPSAxOyBpIDwgbG9vbmdzb25fc3lzY29uZi5ucl9jcHVzOyBpKyspCisJCQlwZXJfY3B1KGNvcmUwX2MwY291bnQsIGkpID0gYzBjb3VudDsKKwl9Cit9CisKKyNkZWZpbmUgTUFYX0xPT1BTIDExMTEKKy8qCisgKiBTTVAgaW5pdCBhbmQgZmluaXNoIG9uIHNlY29uZGFyeSBDUFVzCisgKi8KK3N0YXRpYyB2b2lkIGxvb25nc29uM19pbml0X3NlY29uZGFyeSh2b2lkKQoreworCWludCBpOworCXVpbnQzMl90IGluaXRjb3VudDsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGludCBpbWFzayA9IFNUQVRVU0ZfSVA3IHwgU1RBVFVTRl9JUDYgfAorCQkJICAgICBTVEFUVVNGX0lQMyB8IFNUQVRVU0ZfSVAyOworCisJLyogU2V0IGludGVycnVwdCBtYXNrLCBidXQgZG9uJ3QgZW5hYmxlICovCisJY2hhbmdlX2MwX3N0YXR1cyhTVDBfSU0sIGltYXNrKTsKKworCWZvciAoaSA9IDA7IGkgPCBsb29uZ3Nvbl9zeXNjb25mLm5yX2NwdXM7IGkrKykKKwkJbG9vbmdzb24zX2lwaV93cml0ZTMyKDB4ZmZmZmZmZmYsIGlwaV9lbjBfcmVnc1tpXSk7CisKKwlwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KSA9IENQVV9PTkxJTkU7CisKKwlpID0gMDsKKwlfX2dldF9jcHVfdmFyKGNvcmUwX2MwY291bnQpID0gMDsKKwlsb29uZ3NvbjNfc2VuZF9pcGlfc2luZ2xlKDAsIFNNUF9BU0tfQzBDT1VOVCk7CisJd2hpbGUgKCFfX2dldF9jcHVfdmFyKGNvcmUwX2MwY291bnQpKSB7CisJCWkrKzsKKwkJY3B1X3JlbGF4KCk7CisJfQorCisJaWYgKGkgPiBNQVhfTE9PUFMpCisJCWkgPSBNQVhfTE9PUFM7CisJaW5pdGNvdW50ID0gX19nZXRfY3B1X3Zhcihjb3JlMF9jMGNvdW50KSArIGk7CisJd3JpdGVfYzBfY291bnQoaW5pdGNvdW50KTsKK30KKworc3RhdGljIHZvaWQgbG9vbmdzb24zX3NtcF9maW5pc2godm9pZCkKK3sKKwl3cml0ZV9jMF9jb21wYXJlKHJlYWRfYzBfY291bnQoKSArIG1pcHNfaHB0X2ZyZXF1ZW5jeS9IWik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWxvb25nc29uM19pcGlfd3JpdGU2NCgwLAorCQkJKHZvaWQgKikoaXBpX21haWxib3hfYnVmW3NtcF9wcm9jZXNzb3JfaWQoKV0rMHgwKSk7CisJcHJfaW5mbygiQ1BVIyVkIGZpbmlzaGVkLCBDUDBfU1Q9JXhcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIHJlYWRfYzBfc3RhdHVzKCkpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbG9vbmdzb24zX3NtcF9zZXR1cCh2b2lkKQoreworCWludCBpLCBudW07CisKKwlpbml0X2NwdV9wb3NzaWJsZShjcHVfbm9uZV9tYXNrKTsKKwlzZXRfY3B1X3Bvc3NpYmxlKDAsIHRydWUpOworCisJX19jcHVfbnVtYmVyX21hcFswXSA9IDA7CisJX19jcHVfbG9naWNhbF9tYXBbMF0gPSAwOworCisJLyogRm9yIHVuaWZpZWQga2VybmVsLCBOUl9DUFVTIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlLAorCSAqIGxvb25nc29uX3N5c2NvbmYubnJfY3B1cyBpcyB0aGUgcmVhbGx5IHByZXNlbnQgdmFsdWUgKi8KKwlmb3IgKGkgPSAxLCBudW0gPSAwOyBpIDwgbG9vbmdzb25fc3lzY29uZi5ucl9jcHVzOyBpKyspIHsKKwkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKKwkJX19jcHVfbnVtYmVyX21hcFtpXSA9ICsrbnVtOworCQlfX2NwdV9sb2dpY2FsX21hcFtudW1dID0gaTsKKwl9CisJcHJfaW5mbygiRGV0ZWN0ZWQgJWkgYXZhaWxhYmxlIHNlY29uZGFyeSBDUFUocylcbiIsIG51bSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBsb29uZ3NvbjNfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlpbml0X2NwdV9wcmVzZW50KGNwdV9wb3NzaWJsZV9tYXNrKTsKKwlwZXJfY3B1KGNwdV9zdGF0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IENQVV9PTkxJTkU7Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgUEMsIFNQLCBhbmQgR1Agb2YgYSBzZWNvbmRhcnkgcHJvY2Vzc29yIGFuZCBzdGFydCBpdCBydW5pbmchCisgKi8KK3N0YXRpYyB2b2lkIGxvb25nc29uM19ib290X3NlY29uZGFyeShpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydGFyZ3NbNF07CisKKwlwcl9pbmZvKCJCb290aW5nIENQVSMlZC4uLlxuIiwgY3B1KTsKKworCS8qIHN0YXJ0YXJnc1tdIGFyZSBpbml0aWFsIFBDLCBTUCBhbmQgR1AgZm9yIHNlY29uZGFyeSBDUFUgKi8KKwlzdGFydGFyZ3NbMF0gPSAodW5zaWduZWQgbG9uZykmc21wX2Jvb3RzdHJhcDsKKwlzdGFydGFyZ3NbMV0gPSAodW5zaWduZWQgbG9uZylfX0tTVEtfVE9TKGlkbGUpOworCXN0YXJ0YXJnc1syXSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfdGhyZWFkX2luZm8oaWRsZSk7CisJc3RhcnRhcmdzWzNdID0gMDsKKworCXByX2RlYnVnKCJDUFUjJWQsIGZ1bmNfcGM9JWx4LCBzcD0lbHgsIGdwPSVseFxuIiwKKwkJCWNwdSwgc3RhcnRhcmdzWzBdLCBzdGFydGFyZ3NbMV0sIHN0YXJ0YXJnc1syXSk7CisKKwlsb29uZ3NvbjNfaXBpX3dyaXRlNjQoc3RhcnRhcmdzWzNdLCAodm9pZCAqKShpcGlfbWFpbGJveF9idWZbY3B1XSsweDE4KSk7CisJbG9vbmdzb24zX2lwaV93cml0ZTY0KHN0YXJ0YXJnc1syXSwgKHZvaWQgKikoaXBpX21haWxib3hfYnVmW2NwdV0rMHgxMCkpOworCWxvb25nc29uM19pcGlfd3JpdGU2NChzdGFydGFyZ3NbMV0sICh2b2lkICopKGlwaV9tYWlsYm94X2J1ZltjcHVdKzB4OCkpOworCWxvb25nc29uM19pcGlfd3JpdGU2NChzdGFydGFyZ3NbMF0sICh2b2lkICopKGlwaV9tYWlsYm94X2J1ZltjcHVdKzB4MCkpOworfQorCisvKgorICogRmluYWwgY2xlYW51cCBhZnRlciBhbGwgc2Vjb25kYXJpZXMgYm9vdGVkCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBsb29uZ3NvbjNfY3B1c19kb25lKHZvaWQpCit7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIGludCBsb29uZ3NvbjNfY3B1X2Rpc2FibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAoY3B1ID09IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlzZXRfY3B1X29ubGluZShjcHUsIGZhbHNlKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbGluX21hcCk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZpeHVwX2lycXMoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJZmx1c2hfY2FjaGVfYWxsKCk7CisJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgbG9vbmdzb24zX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwl3aGlsZSAocGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgIT0gQ1BVX0RFQUQpCisJCWNwdV9yZWxheCgpOworCisJbWIoKTsKK30KKworLyogVG8gc2h1dGRvd24gYSBjb3JlIGluIExvb25nc29uIDMsIHRoZSB0YXJnZXQgY29yZSBzaG91bGQgZ28gdG8gQ0tTRUcxIGFuZAorICogZmx1c2ggYWxsIEwxIGVudHJpZXMgYXQgZmlyc3QuIFRoZW4sIGFub3RoZXIgY29yZSAodXN1YWxseSBDb3JlIDApIGNhbgorICogc2FmZWx5IGRpc2FibGUgdGhlIGNsb2NrIG9mIHRoZSB0YXJnZXQgY29yZS4gbG9vbmdzb24zX3BsYXlfZGVhZCgpIGlzCisgKiBjYWxsZWQgdmlhIENLU0VHMSAodW5jYWNoZWQgYW5kIHVubW1hcGVkKSAqLworc3RhdGljIHZvaWQgbG9vbmdzb24zX3BsYXlfZGVhZChpbnQgKnN0YXRlX2FkZHIpCit7CisJcmVnaXN0ZXIgaW50IHZhbDsKKwlyZWdpc3RlciBsb25nIGNwdWlkLCBjb3JlLCBub2RlLCBjb3VudDsKKwlyZWdpc3RlciB2b2lkICphZGRyLCAqYmFzZSwgKmluaXRmdW5jOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIgICAuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgIC5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgIFxuIgorCQkiICAgbGkgJVthZGRyXSwgMHg4MDAwMDAwMCAgICAgICAgXG4iIC8qIEtTRUcwICovCisJCSIxOiBjYWNoZSAwLCAwKCVbYWRkcl0pICAgICAgICAgICBcbiIgLyogZmx1c2ggTDEgSUNhY2hlICovCisJCSIgICBjYWNoZSAwLCAxKCVbYWRkcl0pICAgICAgICAgICBcbiIKKwkJIiAgIGNhY2hlIDAsIDIoJVthZGRyXSkgICAgICAgICAgIFxuIgorCQkiICAgY2FjaGUgMCwgMyglW2FkZHJdKSAgICAgICAgICAgXG4iCisJCSIgICBjYWNoZSAxLCAwKCVbYWRkcl0pICAgICAgICAgICBcbiIgLyogZmx1c2ggTDEgRENhY2hlICovCisJCSIgICBjYWNoZSAxLCAxKCVbYWRkcl0pICAgICAgICAgICBcbiIKKwkJIiAgIGNhY2hlIDEsIDIoJVthZGRyXSkgICAgICAgICAgIFxuIgorCQkiICAgY2FjaGUgMSwgMyglW2FkZHJdKSAgICAgICAgICAgXG4iCisJCSIgICBhZGRpdSAlW3NldHNdLCAlW3NldHNdLCAtMSAgICBcbiIKKwkJIiAgIGJuZXogICVbc2V0c10sIDFiICAgICAgICAgICAgIFxuIgorCQkiICAgYWRkaXUgJVthZGRyXSwgJVthZGRyXSwgMHgyMCAgXG4iCisJCSIgICBsaSAgICAlW3ZhbF0sIDB4NyAgICAgICAgICAgICBcbiIgLyogKnN0YXRlX2FkZHIgPSBDUFVfREVBRDsgKi8KKwkJIiAgIHN3ICAgICVbdmFsXSwgKCVbc3RhdGVfYWRkcl0pIFxuIgorCQkiICAgc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICBjYWNoZSAyMSwgKCVbc3RhdGVfYWRkcl0pICAgICBcbiIgLyogZmx1c2ggZW50cnkgb2YgKnN0YXRlX2FkZHIgKi8KKwkJIiAgIC5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQk6IFthZGRyXSAiPSZyIiAoYWRkciksIFt2YWxdICI9JnIiICh2YWwpCisJCTogW3N0YXRlX2FkZHJdICJyIiAoc3RhdGVfYWRkciksCisJCSAgW3NldHNdICJyIiAoY3B1X2RhdGFbc21wX3Byb2Nlc3Nvcl9pZCgpXS5kY2FjaGUuc2V0cykpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIgICAuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAuc2V0IG1pcHM2NCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICBtZmMwICAlW2NwdWlkXSwgJDE1LCAxICAgICAgICAgICAgXG4iCisJCSIgICBhbmRpICAlW2NwdWlkXSwgMHgzZmYgICAgICAgICAgICAgXG4iCisJCSIgICBkbGkgICAlW2Jhc2VdLCAweDkwMDAwMDAwM2ZmMDEwMDAgXG4iCisJCSIgICBhbmRpICAlW2NvcmVdLCAlW2NwdWlkXSwgMHgzICAgICAgXG4iCisJCSIgICBzbGwgICAlW2NvcmVdLCA4ICAgICAgICAgICAgICAgICAgXG4iIC8qIGdldCBjb3JlIGlkICovCisJCSIgICBvciAgICAlW2Jhc2VdLCAlW2Jhc2VdLCAlW2NvcmVdICAgXG4iCisJCSIgICBhbmRpICAlW25vZGVdLCAlW2NwdWlkXSwgMHhjICAgICAgXG4iCisJCSIgICBkc2xsICAlW25vZGVdLCA0MiAgICAgICAgICAgICAgICAgXG4iIC8qIGdldCBub2RlIGlkICovCisJCSIgICBvciAgICAlW2Jhc2VdLCAlW2Jhc2VdLCAlW25vZGVdICAgXG4iCisJCSIxOiBsaSAgICAlW2NvdW50XSwgMHgxMDAgICAgICAgICAgICAgXG4iIC8qIHdhaXQgZm9yIGluaXQgbG9vcCAqLworCQkiMjogYm5leiAgJVtjb3VudF0sIDJiICAgICAgICAgICAgICAgIFxuIiAvKiBsaW1pdCBtYWlsYm94IGFjY2VzcyAqLworCQkiICAgYWRkaXUgJVtjb3VudF0sIC0xICAgICAgICAgICAgICAgIFxuIgorCQkiICAgbGQgICAgJVtpbml0ZnVuY10sIDB4MjAoJVtiYXNlXSkgIFxuIiAvKiBnZXQgUEMgdmlhIG1haWxib3ggKi8KKwkJIiAgIGJlcXogICVbaW5pdGZ1bmNdLCAxYiAgICAgICAgICAgICBcbiIKKwkJIiAgIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgIGxkICAgICRzcCwgMHgyOCglW2Jhc2VdKSAgICAgICAgICBcbiIgLyogZ2V0IFNQIHZpYSBtYWlsYm94ICovCisJCSIgICBsZCAgICAkZ3AsIDB4MzAoJVtiYXNlXSkgICAgICAgICAgXG4iIC8qIGdldCBHUCB2aWEgbWFpbGJveCAqLworCQkiICAgbGQgICAgJGExLCAweDM4KCVbYmFzZV0pICAgICAgICAgIFxuIgorCQkiICAganIgICAgJVtpbml0ZnVuY10gICAgICAgICAgICAgICAgIFxuIiAvKiBqdW1wIHRvIGluaXRpYWwgUEMgKi8KKwkJIiAgIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgIC5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJOiBbY29yZV0gIj0mciIgKGNvcmUpLCBbbm9kZV0gIj0mciIgKG5vZGUpLAorCQkgIFtiYXNlXSAiPSZyIiAoYmFzZSksIFtjcHVpZF0gIj0mciIgKGNwdWlkKSwKKwkJICBbY291bnRdICI9JnIiIChjb3VudCksIFtpbml0ZnVuY10gIj0mciIgKGluaXRmdW5jKQorCQk6IC8qIE5vIElucHV0ICovCisJCTogImExIik7Cit9CisKK3ZvaWQgcGxheV9kZWFkKHZvaWQpCit7CisJaW50ICpzdGF0ZV9hZGRyOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdm9pZCAoKnBsYXlfZGVhZF9hdF9ja3NlZzEpKGludCAqKTsKKworCWlkbGVfdGFza19leGl0KCk7CisJcGxheV9kZWFkX2F0X2Nrc2VnMSA9CisJCSh2b2lkICopQ0tTRUcxQUREUigodW5zaWduZWQgbG9uZylsb29uZ3NvbjNfcGxheV9kZWFkKTsKKwlzdGF0ZV9hZGRyID0gJnBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpOworCW1iKCk7CisJcGxheV9kZWFkX2F0X2Nrc2VnMShzdGF0ZV9hZGRyKTsKK30KKworI2RlZmluZSBDUFVfUE9TVF9ERUFEX0ZST1pFTgkoQ1BVX1BPU1RfREVBRCB8IENQVV9UQVNLU19GUk9aRU4pCitzdGF0aWMgaW50IGxvb25nc29uM19jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCisJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX1BPU1RfREVBRDoKKwljYXNlIENQVV9QT1NUX0RFQURfRlJPWkVOOgorCQlwcl9pbmZvKCJEaXNhYmxlIGNsb2NrIGZvciBDUFUjJWRcbiIsIGNwdSk7CisJCUxPT05HU09OX0NISVBDRkcwICY9IH4oMSA8PCAoMTIgKyBjcHUpKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKKwkJcHJfaW5mbygiRW5hYmxlIGNsb2NrIGZvciBDUFUjJWRcbiIsIGNwdSk7CisJCUxPT05HU09OX0NISVBDRkcwIHw9IDEgPDwgKDEyICsgY3B1KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl9sb29uZ3NvbjNfbm90aWZpZXIodm9pZCkKK3sKKwlob3RjcHVfbm90aWZpZXIobG9vbmdzb24zX2NwdV9jYWxsYmFjaywgMCk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9pbml0Y2FsbChyZWdpc3Rlcl9sb29uZ3NvbjNfbm90aWZpZXIpOworCisjZW5kaWYKKworc3RydWN0IHBsYXRfc21wX29wcyBsb29uZ3NvbjNfc21wX29wcyA9IHsKKwkuc2VuZF9pcGlfc2luZ2xlID0gbG9vbmdzb24zX3NlbmRfaXBpX3NpbmdsZSwKKwkuc2VuZF9pcGlfbWFzayA9IGxvb25nc29uM19zZW5kX2lwaV9tYXNrLAorCS5pbml0X3NlY29uZGFyeSA9IGxvb25nc29uM19pbml0X3NlY29uZGFyeSwKKwkuc21wX2ZpbmlzaCA9IGxvb25nc29uM19zbXBfZmluaXNoLAorCS5jcHVzX2RvbmUgPSBsb29uZ3NvbjNfY3B1c19kb25lLAorCS5ib290X3NlY29uZGFyeSA9IGxvb25nc29uM19ib290X3NlY29uZGFyeSwKKwkuc21wX3NldHVwID0gbG9vbmdzb24zX3NtcF9zZXR1cCwKKwkucHJlcGFyZV9jcHVzID0gbG9vbmdzb24zX3ByZXBhcmVfY3B1cywKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwkuY3B1X2Rpc2FibGUgPSBsb29uZ3NvbjNfY3B1X2Rpc2FibGUsCisJLmNwdV9kaWUgPSBsb29uZ3NvbjNfY3B1X2RpZSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9sb29uZ3Nvbi0zL3NtcC5oIGIvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvc21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1M2U4YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9sb29uZ3Nvbi0zL3NtcC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX19MT09OR1NPTl9TTVBfSF8KKyNkZWZpbmUgX19MT09OR1NPTl9TTVBfSF8KKworLyogZm9yIExvb25nc29uLTNBIHNtcCBzdXBwb3J0ICovCisKKy8qIDQgZ3JvdXBzKG5vZGVzKSBpbiBtYXhpbXVtIGluIG51bWEgY2FzZSAqLworI2RlZmluZSAgU01QX0NPUkVfR1JPVVAwX0JBU0UgICAgMHg5MDAwMDAwMDNmZjAxMDAwCisjZGVmaW5lICBTTVBfQ09SRV9HUk9VUDFfQkFTRSAgICAweDkwMDAxMDAwM2ZmMDEwMDAKKyNkZWZpbmUgIFNNUF9DT1JFX0dST1VQMl9CQVNFICAgIDB4OTAwMDIwMDAzZmYwMTAwMAorI2RlZmluZSAgU01QX0NPUkVfR1JPVVAzX0JBU0UgICAgMHg5MDAwMzAwMDNmZjAxMDAwCisKKy8qIDQgY29yZXMgaW4gZWFjaCBncm91cChub2RlKSAqLworI2RlZmluZSAgU01QX0NPUkUwX09GRlNFVCAgMHgwMDAKKyNkZWZpbmUgIFNNUF9DT1JFMV9PRkZTRVQgIDB4MTAwCisjZGVmaW5lICBTTVBfQ09SRTJfT0ZGU0VUICAweDIwMAorI2RlZmluZSAgU01QX0NPUkUzX09GRlNFVCAgMHgzMDAKKworLyogaXBpIHJlZ2lzdGVycyBvZmZzZXRzICovCisjZGVmaW5lICBTVEFUVVMwICAweDAwCisjZGVmaW5lICBFTjAgICAgICAweDA0CisjZGVmaW5lICBTRVQwICAgICAweDA4CisjZGVmaW5lICBDTEVBUjAgICAweDBjCisjZGVmaW5lICBTVEFUVVMxICAweDEwCisjZGVmaW5lICBNQVNLMSAgICAweDE0CisjZGVmaW5lICBTRVQxICAgICAweDE4CisjZGVmaW5lICBDTEVBUjEgICAweDFjCisjZGVmaW5lICBCVUYgICAgICAweDIwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21hdGgtZW11L2NwMWVtdS5jIGIvYXJjaC9taXBzL21hdGgtZW11L2NwMWVtdS5jCmluZGV4IDUwNjkyNWIuLjdiM2M5YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYworKysgYi9hcmNoL21pcHMvbWF0aC1lbXUvY3AxZW11LmMKQEAgLTg3NiwyMCArODc2LDQzIEBACiAjZW5kaWYKIH0KIAotI2RlZmluZSBTSUZST01SRUcoc2ksIHgpICgoc2kpID0gY29wMV82NGJpdCh4Y3ApIHx8ICEoeCAmIDEpID8gXAotCQkJKGludCljdHgtPmZwclt4XSA6IChpbnQpKGN0eC0+ZnByW3ggJiB+MV0gPj4gMzIpKQorI2RlZmluZSBTSUZST01SRUcoc2ksIHgpIGRvIHsJCQkJCQlcCisJaWYgKGNvcDFfNjRiaXQoeGNwKSkJCQkJCQlcCisJCShzaSkgPSBnZXRfZnByMzIoJmN0eC0+ZnByW3hdLCAwKTsJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoc2kpID0gZ2V0X2ZwcjMyKCZjdHgtPmZwclsoeCkgJiB+MV0sICh4KSAmIDEpOwkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBTSVRPUkVHKHNpLCB4KQkoY3R4LT5mcHJbeCAmIH4oY29wMV82NGJpdCh4Y3ApID09IDApXSA9IFwKLQkJCWNvcDFfNjRiaXQoeGNwKSB8fCAhKHggJiAxKSA/IFwKLQkJCWN0eC0+ZnByW3ggJiB+MV0gPj4gMzIgPDwgMzIgfCAodTMyKShzaSkgOiBcCi0JCQljdHgtPmZwclt4ICYgfjFdIDw8IDMyID4+IDMyIHwgKHU2NCkoc2kpIDw8IDMyKQorI2RlZmluZSBTSVRPUkVHKHNpLCB4KSBkbyB7CQkJCQkJXAorCWlmIChjb3AxXzY0Yml0KHhjcCkpIHsJCQkJCQlcCisJCXVuc2lnbmVkIGk7CQkJCQkJXAorCQlzZXRfZnByMzIoJmN0eC0+ZnByW3hdLCAwLCBzaSk7CQkJCVwKKwkJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUoY3R4LT5mcHJbeF0udmFsMzIpOyBpKyspCVwKKwkJCXNldF9mcHIzMigmY3R4LT5mcHJbeF0sIGksIDApOwkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCXNldF9mcHIzMigmY3R4LT5mcHJbKHgpICYgfjFdLCAoeCkgJiAxLCBzaSk7CQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBTSUZST01IUkVHKHNpLCB4KQkoKHNpKSA9IChpbnQpKGN0eC0+ZnByW3hdID4+IDMyKSkKLSNkZWZpbmUgU0lUT0hSRUcoc2ksIHgpCQkoY3R4LT5mcHJbeF0gPSBcCi0JCQkJY3R4LT5mcHJbeF0gPDwgMzIgPj4gMzIgfCAodTY0KShzaSkgPDwgMzIpCisjZGVmaW5lIFNJRlJPTUhSRUcoc2ksIHgpCSgoc2kpID0gZ2V0X2ZwcjMyKCZjdHgtPmZwclt4XSwgMSkpCiAKLSNkZWZpbmUgRElGUk9NUkVHKGRpLCB4KSAoKGRpKSA9IGN0eC0+ZnByW3ggJiB+KGNvcDFfNjRiaXQoeGNwKSA9PSAwKV0pCi0jZGVmaW5lIERJVE9SRUcoZGksIHgpCShjdHgtPmZwclt4ICYgfihjb3AxXzY0Yml0KHhjcCkgPT0gMCldID0gKGRpKSkKKyNkZWZpbmUgU0lUT0hSRUcoc2ksIHgpIGRvIHsJCQkJCQlcCisJdW5zaWduZWQgaTsJCQkJCQkJXAorCXNldF9mcHIzMigmY3R4LT5mcHJbeF0sIDEsIHNpKTsJCQkJCVwKKwlmb3IgKGkgPSAyOyBpIDwgQVJSQVlfU0laRShjdHgtPmZwclt4XS52YWwzMik7IGkrKykJCVwKKwkJc2V0X2ZwcjMyKCZjdHgtPmZwclt4XSwgaSwgMCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRElGUk9NUkVHKGRpLCB4KSBcCisJKChkaSkgPSBnZXRfZnByNjQoJmN0eC0+ZnByWyh4KSAmIH4oY29wMV82NGJpdCh4Y3ApID09IDApXSwgMCkpCisKKyNkZWZpbmUgRElUT1JFRyhkaSwgeCkgZG8gewkJCQkJCVwKKwl1bnNpZ25lZCBmcHIsIGk7CQkJCQkJXAorCWZwciA9ICh4KSAmIH4oY29wMV82NGJpdCh4Y3ApID09IDApOwkJCQlcCisJc2V0X2ZwcjY0KCZjdHgtPmZwcltmcHJdLCAwLCBkaSk7CQkJCVwKKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShjdHgtPmZwclt4XS52YWw2NCk7IGkrKykJCVwKKwkJc2V0X2ZwcjY0KCZjdHgtPmZwcltmcHJdLCBpLCAwKTsJCQlcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIFNQRlJPTVJFRyhzcCwgeCkgU0lGUk9NUkVHKChzcCkuYml0cywgeCkKICNkZWZpbmUgU1BUT1JFRyhzcCwgeCkJU0lUT1JFRygoc3ApLmJpdHMsIHgpCkBAIC0xNTM4LDEwICsxNTYxLDEwIEBACiAJCWJyZWFrOwogCX0KIAotCWNhc2UgMHg3OgkJLyogNyAqLwotCQlpZiAoTUlQU0luc3RfRlVOQyhpcikgIT0gcGZldGNoX29wKSB7CisJY2FzZSAweDM6CisJCWlmIChNSVBTSW5zdF9GVU5DKGlyKSAhPSBwZmV0Y2hfb3ApCiAJCQlyZXR1cm4gU0lHSUxMOwotCQl9CisKIAkJLyogaWdub3JlIHByZWZ4IG9wZXJhdGlvbiAqLwogCQlicmVhazsKIApAQCAtMTk2MCwxNSArMTk4MywxOCBAQAogCiAjaWYgZGVmaW5lZChfX21pcHM2NCkKIAljYXNlIGxfZm10OnsKKwkJdTY0IGJpdHM7CisJCURJRlJPTVJFRyhiaXRzLCBNSVBTSW5zdF9GUyhpcikpOworCiAJCXN3aXRjaCAoTUlQU0luc3RfRlVOQyhpcikpIHsKIAkJY2FzZSBmY3Z0c19vcDoKIAkJCS8qIGNvbnZlcnQgbG9uZyB0byBzaW5nbGUgcHJlY2lzaW9uIHJlYWwgKi8KLQkJCXJ2LnMgPSBpZWVlNzU0c3BfZmxvbmcoY3R4LT5mcHJbTUlQU0luc3RfRlMoaXIpXSk7CisJCQlydi5zID0gaWVlZTc1NHNwX2Zsb25nKGJpdHMpOwogCQkJcmZtdCA9IHNfZm10OwogCQkJZ290byBjb3Bjc3I7CiAJCWNhc2UgZmN2dGRfb3A6CiAJCQkvKiBjb252ZXJ0IGxvbmcgdG8gZG91YmxlIHByZWNpc2lvbiByZWFsICovCi0JCQlydi5kID0gaWVlZTc1NGRwX2Zsb25nKGN0eC0+ZnByW01JUFNJbnN0X0ZTKGlyKV0pOworCQkJcnYuZCA9IGllZWU3NTRkcF9mbG9uZyhiaXRzKTsKIAkJCXJmbXQgPSBkX2ZtdDsKIAkJCWdvdG8gY29wY3NyOwogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21hdGgtZW11L2tlcm5lbF9saW5rYWdlLmMgYi9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYwppbmRleCAzYWVhZTA3Li5lYjU4YTg1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYworKysgYi9hcmNoL21pcHMvbWF0aC1lbXUva2VybmVsX2xpbmthZ2UuYwpAQCAtNDAsNzggKzQwLDYgQEAKIAl9CiAKIAljdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQljdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSA9IFNJR05BTExJTkdfTkFOOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJc2V0X2ZwcjY0KCZjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgMCwgU0lHTkFMTElOR19OQU4pOwogfQotCi0KLS8qCi0gKiBFbXVsYXRvciBjb250ZXh0IHNhdmUvcmVzdG9yZSB0by9mcm9tIGEgc2lnbmFsIGNvbnRleHQKLSAqIHByZXN1bWVkIHRvIGJlIG9uIHRoZSB1c2VyIHN0YWNrLCBhbmQgdGhlcmVmb3JlIGFjY2Vzc2VkCi0gKiB3aXRoIGFwcHJvcHJpYXRlIG1hY3JvcyBmcm9tIHVhY2Nlc3MuaAotICovCi0KLWludCBmcHVfZW11bGF0b3Jfc2F2ZV9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCi17Ci0JaW50IGk7Ci0JaW50IGVyciA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQllcnIgfD0KLQkJICAgIF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sICZzYy0+c2NfZnByZWdzW2ldKTsKLQl9Ci0JZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSwgJnNjLT5zY19mcGNfY3NyKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLWludCBmcHVfZW11bGF0b3JfcmVzdG9yZV9jb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCi17Ci0JaW50IGk7Ci0JaW50IGVyciA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQllcnIgfD0KLQkJICAgIF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mcHJbaV0sICZzYy0+c2NfZnByZWdzW2ldKTsKLQl9Ci0JZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSwgJnNjLT5zY19mcGNfY3NyKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLSNpZmRlZiBDT05GSUdfNjRCSVQKLS8qCi0gKiBUaGlzIGlzIHRoZSBvMzIgdmVyc2lvbgotICovCi0KLWludCBmcHVfZW11bGF0b3Jfc2F2ZV9jb250ZXh0MzIoc3RydWN0IHNpZ2NvbnRleHQzMiBfX3VzZXIgKnNjKQotewotCWludCBpOwotCWludCBlcnIgPSAwOwotCWludCBpbmMgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9GUFJFR1MpID8gMiA6IDE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gaW5jKSB7Ci0JCWVyciB8PQotCQkgICAgX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZwcltpXSwgJnNjLT5zY19mcHJlZ3NbaV0pOwotCX0KLQllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxLCAmc2MtPnNjX2ZwY19jc3IpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotaW50IGZwdV9lbXVsYXRvcl9yZXN0b3JlX2NvbnRleHQzMihzdHJ1Y3Qgc2lnY29udGV4dDMyIF9fdXNlciAqc2MpCi17Ci0JaW50IGk7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGluYyA9IHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0ZQUkVHUykgPyAyIDogMTsKLQotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSBpbmMpIHsKLQkJZXJyIHw9Ci0JCSAgICBfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZnByW2ldLCAmc2MtPnNjX2ZwcmVnc1tpXSk7Ci0JfQotCWVyciB8PSBfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC5mcHUuZmNyMzEsICZzYy0+c2NfZnBjX2Nzcik7Ci0KLQlyZXR1cm4gZXJyOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yNGsuYyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCmluZGV4IGMxNDI1OWUuLjFjNzRhNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX01JUFNfQ01QKQorI2lmIGRlZmluZWQoQ09ORklHX01JUFNfQ01QKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0NQUykKICNkZWZpbmUgY3B1X2hhc19zYWZlX2luZGV4X2NhY2hlb3BzIDAKICNlbHNlCiAjZGVmaW5lIGNwdV9oYXNfc2FmZV9pbmRleF9jYWNoZW9wcyAxCkBAIC0xMjMsNiArMTIzLDI4IEBACiAJCXI0a19ibGFzdF9kY2FjaGVfcGFnZSA9IHI0a19ibGFzdF9kY2FjaGVfcGFnZV9kYzY0OwogfQogCisjaWZuZGVmIENPTkZJR19FVkEKKyNkZWZpbmUgcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2UgIHI0a19ibGFzdF9kY2FjaGVfcGFnZQorI2Vsc2UKKworc3RhdGljIHZvaWQgKCpyNGtfYmxhc3RfZGNhY2hlX3VzZXJfcGFnZSkodW5zaWduZWQgbG9uZyBhZGRyKTsKKworc3RhdGljIHZvaWQgcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2Vfc2V0dXAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICBkY19sc2l6ZSA9IGNwdV9kY2FjaGVfbGluZV9zaXplKCk7CisKKwlpZiAoZGNfbHNpemUgPT0gMCkKKwkJcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2UgPSAodm9pZCAqKWNhY2hlX25vb3A7CisJZWxzZSBpZiAoZGNfbHNpemUgPT0gMTYpCisJCXI0a19ibGFzdF9kY2FjaGVfdXNlcl9wYWdlID0gYmxhc3RfZGNhY2hlMTZfdXNlcl9wYWdlOworCWVsc2UgaWYgKGRjX2xzaXplID09IDMyKQorCQlyNGtfYmxhc3RfZGNhY2hlX3VzZXJfcGFnZSA9IGJsYXN0X2RjYWNoZTMyX3VzZXJfcGFnZTsKKwllbHNlIGlmIChkY19sc2l6ZSA9PSA2NCkKKwkJcjRrX2JsYXN0X2RjYWNoZV91c2VyX3BhZ2UgPSBibGFzdF9kY2FjaGU2NF91c2VyX3BhZ2U7Cit9CisKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCAoKiByNGtfYmxhc3RfZGNhY2hlX3BhZ2VfaW5kZXhlZCkodW5zaWduZWQgbG9uZyBhZGRyKTsKIAogc3RhdGljIHZvaWQgcjRrX2JsYXN0X2RjYWNoZV9wYWdlX2luZGV4ZWRfc2V0dXAodm9pZCkKQEAgLTI0NSw2ICsyNjcsMjcgQEAKIAkJcjRrX2JsYXN0X2ljYWNoZV9wYWdlID0gYmxhc3RfaWNhY2hlNjRfcGFnZTsKIH0KIAorI2lmbmRlZiBDT05GSUdfRVZBCisjZGVmaW5lIHI0a19ibGFzdF9pY2FjaGVfdXNlcl9wYWdlICByNGtfYmxhc3RfaWNhY2hlX3BhZ2UKKyNlbHNlCisKK3N0YXRpYyB2b2lkICgqcjRrX2JsYXN0X2ljYWNoZV91c2VyX3BhZ2UpKHVuc2lnbmVkIGxvbmcgYWRkcik7CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCByNGtfYmxhc3RfaWNhY2hlX3VzZXJfcGFnZV9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaWNfbHNpemUgPSBjcHVfaWNhY2hlX2xpbmVfc2l6ZSgpOworCisJaWYgKGljX2xzaXplID09IDApCisJCXI0a19ibGFzdF9pY2FjaGVfdXNlcl9wYWdlID0gKHZvaWQgKiljYWNoZV9ub29wOworCWVsc2UgaWYgKGljX2xzaXplID09IDE2KQorCQlyNGtfYmxhc3RfaWNhY2hlX3VzZXJfcGFnZSA9IGJsYXN0X2ljYWNoZTE2X3VzZXJfcGFnZTsKKwllbHNlIGlmIChpY19sc2l6ZSA9PSAzMikKKwkJcjRrX2JsYXN0X2ljYWNoZV91c2VyX3BhZ2UgPSBibGFzdF9pY2FjaGUzMl91c2VyX3BhZ2U7CisJZWxzZSBpZiAoaWNfbHNpemUgPT0gNjQpCisJCXI0a19ibGFzdF9pY2FjaGVfdXNlcl9wYWdlID0gYmxhc3RfaWNhY2hlNjRfdXNlcl9wYWdlOworfQorCisjZW5kaWYKIAogc3RhdGljIHZvaWQgKCogcjRrX2JsYXN0X2ljYWNoZV9wYWdlX2luZGV4ZWQpKHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKQEAgLTM1NSw2ICszOTgsNyBAQAogewogCXN3aXRjaCAoY3VycmVudF9jcHVfdHlwZSgpKSB7CiAJY2FzZSBDUFVfTE9PTkdTT04yOgorCWNhc2UgQ1BVX0xPT05HU09OMzoKIAljYXNlIENQVV9SNDAwMFNDOgogCWNhc2UgQ1BVX1I0MDAwTUM6CiAJY2FzZSBDUFVfUjQ0MDBTQzoKQEAgLTUxOSw3ICs1NjMsOCBAQAogCX0KIAogCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMgfHwgKGV4ZWMgJiYgIWNwdV9oYXNfaWNfZmlsbHNfZl9kYykpIHsKLQkJcjRrX2JsYXN0X2RjYWNoZV9wYWdlKGFkZHIpOworCQl2YWRkciA/IHI0a19ibGFzdF9kY2FjaGVfcGFnZShhZGRyKSA6CisJCQlyNGtfYmxhc3RfZGNhY2hlX3VzZXJfcGFnZShhZGRyKTsKIAkJaWYgKGV4ZWMgJiYgIWNwdV9pY2FjaGVfc25vb3BzX3JlbW90ZV9zdG9yZSkKIAkJCXI0a19ibGFzdF9zY2FjaGVfcGFnZShhZGRyKTsKIAl9CkBAIC01MzAsNyArNTc1LDggQEAKIAkJCWlmIChjcHVfY29udGV4dChjcHUsIG1tKSAhPSAwKQogCQkJCWRyb3BfbW11X2NvbnRleHQobW0sIGNwdSk7CiAJCX0gZWxzZQotCQkJcjRrX2JsYXN0X2ljYWNoZV9wYWdlKGFkZHIpOworCQkJdmFkZHIgPyByNGtfYmxhc3RfaWNhY2hlX3BhZ2UoYWRkcikgOgorCQkJCXI0a19ibGFzdF9pY2FjaGVfdXNlcl9wYWdlKGFkZHIpOwogCX0KIAogCWlmICh2YWRkcikgewpAQCAtNTk1LDYgKzY0MSwxNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9CisjaWZkZWYgQ09ORklHX0VWQQorCS8qCisJICogRHVlIHRvIGFsbCBwb3NzaWJsZSBzZWdtZW50IG1hcHBpbmdzLCB0aGVyZSBtaWdodCBjYWNoZSBhbGlhc2VzCisJICogY2F1c2VkIGJ5IHRoZSBib290bG9hZGVyIGJlaW5nIGluIG5vbi1FVkEgbW9kZSwgYW5kIHRoZSBDUFUgc3dpdGNoaW5nCisJICogdG8gRVZBIGR1cmluZyBlYXJseSBrZXJuZWwgaW5pdC4gSXQncyBiZXN0IHRvIGZsdXNoIHRoZSBzY2FjaGUKKwkgKiB0byBhdm9pZCBoYXZpbmcgc2Vjb25kYXJ5IGNvcmVzIGZldGNoaW5nIHN0YWxlIGRhdGEgYW5kIGxlYWQgdG8KKwkgKiBrZXJuZWwgY3Jhc2hlcy4KKwkgKi8KKwliY193YmFja19pbnYoc3RhcnQsIChlbmQgLSBzdGFydCkpOworCV9fc3luYygpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9yNGtfZmx1c2hfaWNhY2hlX3JhbmdlX2lwaSh2b2lkICphcmdzKQpAQCAtNjE3LDcgKzY3NCw3IEBACiAJaW5zdHJ1Y3Rpb25faGF6YXJkKCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCisjaWYgZGVmaW5lZChDT05GSUdfRE1BX05PTkNPSEVSRU5UKSB8fCBkZWZpbmVkKENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQpCiAKIHN0YXRpYyB2b2lkIHI0a19kbWFfY2FjaGVfd2JhY2tfaW52KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewpAQCAtNjg4LDcgKzc0NSw3IEBACiAJYmNfaW52KGFkZHIsIHNpemUpOwogCV9fc3luYygpOwogfQotI2VuZGlmIC8qIENPTkZJR19ETUFfTk9OQ09IRVJFTlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfRE1BX05PTkNPSEVSRU5UIHx8IENPTkZJR19ETUFfTUFZQkVfQ09IRVJFTlQgKi8KIAogLyoKICAqIFdoaWxlIHdlJ3JlIHByb3RlY3RlZCBhZ2FpbnN0IGJhZCB1c2VybGFuZCBhZGRyZXNzZXMgd2UgZG9uJ3QgY2FyZQpAQCAtMTAxMCw2ICsxMDY3LDMzIEBACiAJCWMtPmRjYWNoZS53YXliaXQgPSAwOwogCQlicmVhazsKIAorCWNhc2UgQ1BVX0xPT05HU09OMzoKKwkJY29uZmlnMSA9IHJlYWRfYzBfY29uZmlnMSgpOworCQlsc2l6ZSA9IChjb25maWcxID4+IDE5KSAmIDc7CisJCWlmIChsc2l6ZSkKKwkJCWMtPmljYWNoZS5saW5lc3ogPSAyIDw8IGxzaXplOworCQllbHNlCisJCQljLT5pY2FjaGUubGluZXN6ID0gMDsKKwkJYy0+aWNhY2hlLnNldHMgPSA2NCA8PCAoKGNvbmZpZzEgPj4gMjIpICYgNyk7CisJCWMtPmljYWNoZS53YXlzID0gMSArICgoY29uZmlnMSA+PiAxNikgJiA3KTsKKwkJaWNhY2hlX3NpemUgPSBjLT5pY2FjaGUuc2V0cyAqCisJCQkJCSAgYy0+aWNhY2hlLndheXMgKgorCQkJCQkgIGMtPmljYWNoZS5saW5lc3o7CisJCWMtPmljYWNoZS53YXliaXQgPSAwOworCisJCWxzaXplID0gKGNvbmZpZzEgPj4gMTApICYgNzsKKwkJaWYgKGxzaXplKQorCQkJYy0+ZGNhY2hlLmxpbmVzeiA9IDIgPDwgbHNpemU7CisJCWVsc2UKKwkJCWMtPmRjYWNoZS5saW5lc3ogPSAwOworCQljLT5kY2FjaGUuc2V0cyA9IDY0IDw8ICgoY29uZmlnMSA+PiAxMykgJiA3KTsKKwkJYy0+ZGNhY2hlLndheXMgPSAxICsgKChjb25maWcxID4+IDcpICYgNyk7CisJCWRjYWNoZV9zaXplID0gYy0+ZGNhY2hlLnNldHMgKgorCQkJCQkgIGMtPmRjYWNoZS53YXlzICoKKwkJCQkJICBjLT5kY2FjaGUubGluZXN6OworCQljLT5kY2FjaGUud2F5Yml0ID0gMDsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlpZiAoIShjb25maWcgJiBNSVBTX0NPTkZfTSkpCiAJCQlwYW5pYygiRG9uJ3Qga25vdyBob3cgdG8gcHJvYmUgUC1jYWNoZXMgb24gdGhpcyBjcHUuIik7CkBAIC0xMTEzLDEzICsxMTk3LDIxIEBACiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV8xMDc0SzoKIAljYXNlIENQVV9JTlRFUkFQVElWOgorCWNhc2UgQ1BVX1A1NjAwOgogCWNhc2UgQ1BVX1BST0FQVElWOgotCQlpZiAoY3VycmVudF9jcHVfdHlwZSgpID09IENQVV83NEspCisJY2FzZSBDUFVfTTUxNTA6CisJCWlmICgoYy0+Y3B1dHlwZSA9PSBDUFVfNzRLKSB8fCAoYy0+Y3B1dHlwZSA9PSBDUFVfMTA3NEspKQogCQkJYWxpYXNfNzRrX2VycmF0dW0oYyk7Ci0JCWlmICgocmVhZF9jMF9jb25maWc3KCkgJiAoMSA8PCAxNikpKSB7Ci0JCQkvKiBlZmZlY3RpdmVseSBwaHlzaWNhbGx5IGluZGV4ZWQgZGNhY2hlLAotCQkJICAgdGh1cyBubyB2aXJ0dWFsIGFsaWFzZXMuICovCisJCWlmICghKHJlYWRfYzBfY29uZmlnNygpICYgTUlQU19DT05GN19JQVIpICYmCisJCSAgICAoYy0+aWNhY2hlLndheXNpemUgPiBQQUdFX1NJWkUpKQorCQkJYy0+aWNhY2hlLmZsYWdzIHw9IE1JUFNfQ0FDSEVfQUxJQVNFUzsKKwkJaWYgKHJlYWRfYzBfY29uZmlnNygpICYgTUlQU19DT05GN19BUikgeworCQkJLyoKKwkJCSAqIEVmZmVjdGl2ZWx5IHBoeXNpY2FsbHkgaW5kZXhlZCBkY2FjaGUsCisJCQkgKiB0aHVzIG5vIHZpcnR1YWwgYWxpYXNlcy4KKwkJCSovCiAJCQljLT5kY2FjaGUuZmxhZ3MgfD0gTUlQU19DQUNIRV9QSU5ERVg7CiAJCQlicmVhazsKIAkJfQpAQCAtMTIzOSw2ICsxMzMxLDMzIEBACiAJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9JTkNMVVNJVkVfQ0FDSEVTOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgbG9vbmdzb24zX3NjX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb19taXBzICpjID0gJmN1cnJlbnRfY3B1X2RhdGE7CisJdW5zaWduZWQgaW50IGNvbmZpZzIsIGxzaXplOworCisJY29uZmlnMiA9IHJlYWRfYzBfY29uZmlnMigpOworCWxzaXplID0gKGNvbmZpZzIgPj4gNCkgJiAxNTsKKwlpZiAobHNpemUpCisJCWMtPnNjYWNoZS5saW5lc3ogPSAyIDw8IGxzaXplOworCWVsc2UKKwkJYy0+c2NhY2hlLmxpbmVzeiA9IDA7CisJYy0+c2NhY2hlLnNldHMgPSA2NCA8PCAoKGNvbmZpZzIgPj4gOCkgJiAxNSk7CisJYy0+c2NhY2hlLndheXMgPSAxICsgKGNvbmZpZzIgJiAxNSk7CisKKwlzY2FjaGVfc2l6ZSA9IGMtPnNjYWNoZS5zZXRzICoKKwkJCQkgIGMtPnNjYWNoZS53YXlzICoKKwkJCQkgIGMtPnNjYWNoZS5saW5lc3o7CisJLyogTG9vbmdzb24tMyBoYXMgNCBjb3JlcywgMU1CIHNjYWNoZSBmb3IgZWFjaC4gc2NhY2hlcyBhcmUgc2hhcmVkICovCisJc2NhY2hlX3NpemUgKj0gNDsKKwljLT5zY2FjaGUud2F5Yml0ID0gMDsKKwlwcl9pbmZvKCJVbmlmaWVkIHNlY29uZGFyeSBjYWNoZSAlbGRrQiAlcywgbGluZXNpemUgJWQgYnl0ZXMuXG4iLAorCSAgICAgICBzY2FjaGVfc2l6ZSA+PiAxMCwgd2F5X3N0cmluZ1tjLT5zY2FjaGUud2F5c10sIGMtPnNjYWNoZS5saW5lc3opOworCWlmIChzY2FjaGVfc2l6ZSkKKwkJYy0+b3B0aW9ucyB8PSBNSVBTX0NQVV9JTkNMVVNJVkVfQ0FDSEVTOworCXJldHVybjsKK30KKwogZXh0ZXJuIGludCByNWtfc2NfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgcm03a19zY19pbml0KHZvaWQpOwogZXh0ZXJuIGludCBtaXBzX3NjX2luaXQodm9pZCk7CkBAIC0xMjkxLDYgKzE0MTAsMTAgQEAKIAkJbG9vbmdzb24yX3NjX2luaXQoKTsKIAkJcmV0dXJuOwogCisJY2FzZSBDUFVfTE9PTkdTT04zOgorCQlsb29uZ3NvbjNfc2NfaW5pdCgpOworCQlyZXR1cm47CisKIAljYXNlIENQVV9YTFA6CiAJCS8qIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgTDIsIGZ1bGx5IGNvaGVyZW50ICovCiAJCXJldHVybjsKQEAgLTE0NjEsNiArMTU4NCwxMCBAQAogCXI0a19ibGFzdF9zY2FjaGVfcGFnZV9zZXR1cCgpOwogCXI0a19ibGFzdF9zY2FjaGVfcGFnZV9pbmRleGVkX3NldHVwKCk7CiAJcjRrX2JsYXN0X3NjYWNoZV9zZXR1cCgpOworI2lmZGVmIENPTkZJR19FVkEKKwlyNGtfYmxhc3RfZGNhY2hlX3VzZXJfcGFnZV9zZXR1cCgpOworCXI0a19ibGFzdF9pY2FjaGVfdXNlcl9wYWdlX3NldHVwKCk7CisjZW5kaWYKIAogCS8qCiAJICogU29tZSBNSVBTMzIgYW5kIE1JUFM2NCBwcm9jZXNzb3JzIGhhdmUgcGh5c2ljYWxseSBpbmRleGVkIGNhY2hlcy4KQEAgLTE0OTIsNyArMTYxOSw3IEBACiAJZmx1c2hfaWNhY2hlX3JhbmdlCT0gcjRrX2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UJPSBsb2NhbF9yNGtfZmx1c2hfaWNhY2hlX3JhbmdlOwogCi0jaWYgZGVmaW5lZChDT05GSUdfRE1BX05PTkNPSEVSRU5UKQorI2lmIGRlZmluZWQoQ09ORklHX0RNQV9OT05DT0hFUkVOVCkgfHwgZGVmaW5lZChDT05GSUdfRE1BX01BWUJFX0NPSEVSRU5UKQogCWlmIChjb2hlcmVudGlvKSB7CiAJCV9kbWFfY2FjaGVfd2JhY2tfaW52CT0gKHZvaWQgKiljYWNoZV9ub29wOwogCQlfZG1hX2NhY2hlX3diYWNrCT0gKHZvaWQgKiljYWNoZV9ub29wOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2NhY2hlLmMgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwppbmRleCBmZGU3ZTU2Li5lNDIyYjM4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vY2FjaGUuYworKysgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwpAQCAtNDksNyArNDksNyBAQAogRVhQT1JUX1NZTUJPTChmbHVzaF9kYXRhX2NhY2hlX3BhZ2UpOwogRVhQT1JUX1NZTUJPTChmbHVzaF9pY2FjaGVfYWxsKTsKIAotI2lmZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKKyNpZiBkZWZpbmVkKENPTkZJR19ETUFfTk9OQ09IRVJFTlQpIHx8IGRlZmluZWQoQ09ORklHX0RNQV9NQVlCRV9DT0hFUkVOVCkKIAogLyogRE1BIGNhY2hlIG9wZXJhdGlvbnMuICovCiB2b2lkICgqX2RtYV9jYWNoZV93YmFja19pbnYpKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CkBAIC01OCw3ICs1OCw3IEBACiAKIEVYUE9SVF9TWU1CT0woX2RtYV9jYWNoZV93YmFja19pbnYpOwogCi0jZW5kaWYgLyogQ09ORklHX0RNQV9OT05DT0hFUkVOVCAqLworI2VuZGlmIC8qIENPTkZJR19ETUFfTk9OQ09IRVJFTlQgfHwgQ09ORklHX0RNQV9NQVlCRV9DT0hFUkVOVCAqLwogCiAvKgogICogV2UgY291bGQgb3B0aW1pemUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhY2hlIGFyZ3VtZW50IGlzIG5vdCBCQ0FDSEUgYnV0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vaW5pdC5jIGIvYXJjaC9taXBzL21tL2luaXQuYwppbmRleCA2YjU5NjE3Li40ZmM3NGM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKQEAgLTQyMiwxMCArNDIyLDIwIEBACiB9CiAjZW5kaWYKIAordm9pZCAoKmZyZWVfaW5pdF9wYWdlc19ldmEpKHZvaWQgKmJlZ2luLCB2b2lkICplbmQpID0gTlVMTDsKKwogdm9pZCBfX2luaXRfcmVmb2sgZnJlZV9pbml0bWVtKHZvaWQpCiB7CiAJcHJvbV9mcmVlX3Byb21fbWVtb3J5KCk7Ci0JZnJlZV9pbml0bWVtX2RlZmF1bHQoUE9JU09OX0ZSRUVfSU5JVE1FTSk7CisJLyoKKwkgKiBMZXQgdGhlIHBsYXRmb3JtIGRlZmluZSBhIHNwZWNpZmljIGZ1bmN0aW9uIHRvIGZyZWUgdGhlCisJICogaW5pdCBzZWN0aW9uIHNpbmNlIEVWQSBtYXkgaGF2ZSB1c2VkIGFueSBwb3NzaWJsZSBtYXBwaW5nCisJICogYmV0d2VlbiB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBhZGRyZXNzZXMuCisJICovCisJaWYgKGZyZWVfaW5pdF9wYWdlc19ldmEpCisJCWZyZWVfaW5pdF9wYWdlc19ldmEoKHZvaWQgKikmX19pbml0X2JlZ2luLCAodm9pZCAqKSZfX2luaXRfZW5kKTsKKwllbHNlCisJCWZyZWVfaW5pdG1lbV9kZWZhdWx0KFBPSVNPTl9GUkVFX0lOSVRNRU0pOwogfQogCiAjaWZuZGVmIENPTkZJR19NSVBTX1BHRF9DMF9DT05URVhUCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vc2MtbWlwcy5jIGIvYXJjaC9taXBzL21tL3NjLW1pcHMuYwppbmRleCA3YTU2YWVlLi45OWViOGZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vc2MtbWlwcy5jCisrKyBiL2FyY2gvbWlwcy9tbS9zYy1taXBzLmMKQEAgLTc2LDggKzc2LDEwIEBACiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzc0SzoKIAljYXNlIENQVV8xMDA0SzoKKwljYXNlIENQVV8xMDc0SzoKIAljYXNlIENQVV9JTlRFUkFQVElWOgogCWNhc2UgQ1BVX1BST0FQVElWOgorCWNhc2UgQ1BVX1A1NjAwOgogCWNhc2UgQ1BVX0JNSVBTNTAwMDoKIAkJaWYgKGNvbmZpZzIgJiAoMSA8PCAxMikpCiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGItcjRrLmMgYi9hcmNoL21pcHMvbW0vdGxiLXI0ay5jCmluZGV4IGFlNGNhMjQuLmVlYWY1MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGItcjRrLmMKKysrIGIvYXJjaC9taXBzL21tL3RsYi1yNGsuYwpAQCAtNDgsMTMgKzQ4LDE0IEBACiAjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwogCiAvKgotICogTE9PTkdTT04yIGhhcyBhIDQgZW50cnkgaXRsYiB3aGljaCBpcyBhIHN1YnNldCBvZiBkdGxiLAotICogdW5mb3J0cnVuYXRlbHksIGl0bGIgaXMgbm90IHRvdGFsbHkgdHJhbnNwYXJlbnQgdG8gc29mdHdhcmUuCisgKiBMT09OR1NPTjIvMyBoYXMgYSA0IGVudHJ5IGl0bGIgd2hpY2ggaXMgYSBzdWJzZXQgb2YgZHRsYiwKKyAqIHVuZm9ydHVuYXRlbHksIGl0bGIgaXMgbm90IHRvdGFsbHkgdHJhbnNwYXJlbnQgdG8gc29mdHdhcmUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pdGxiKHZvaWQpCiB7CiAJc3dpdGNoIChjdXJyZW50X2NwdV90eXBlKCkpIHsKIAljYXNlIENQVV9MT09OR1NPTjI6CisJY2FzZSBDUFVfTE9PTkdTT04zOgogCQl3cml0ZV9jMF9kaWFnKDQpOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3RsYmV4LmMgYi9hcmNoL21pcHMvbW0vdGxiZXguYwppbmRleCBiMjM0YjFiLi5lZTg4MzY3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdGxiZXguYworKysgYi9hcmNoL21pcHMvbW0vdGxiZXguYwpAQCAtNTA5LDcgKzUwOSwxMCBAQAogCQlzd2l0Y2ggKGN1cnJlbnRfY3B1X3R5cGUoKSkgewogCQljYXNlIENQVV9NMTRLQzoKIAkJY2FzZSBDUFVfNzRLOgorCQljYXNlIENQVV8xMDc0SzoKIAkJY2FzZSBDUFVfUFJPQVBUSVY6CisJCWNhc2UgQ1BVX1A1NjAwOgorCQljYXNlIENQVV9NNTE1MDoKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC01NzksNiArNTgyLDcgQEAKIAljYXNlIENQVV9CTUlQUzQzODA6CiAJY2FzZSBDUFVfQk1JUFM1MDAwOgogCWNhc2UgQ1BVX0xPT05HU09OMjoKKwljYXNlIENQVV9MT09OR1NPTjM6CiAJY2FzZSBDUFVfUjU1MDA6CiAJCWlmIChtNGtjX3RsYnBfd2FyKCkpCiAJCQl1YXNtX2lfbm9wKHApOwpAQCAtNjIxLDcgKzYyNSw3IEBACiAKIAlkZWZhdWx0OgogCQlwYW5pYygiTm8gVExCIHJlZmlsbCBoYW5kbGVyIHlldCAoQ1BVIHR5cGU6ICVkKSIsCi0JCSAgICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSk7CisJCSAgICAgIGN1cnJlbnRfY3B1X3R5cGUoKSk7CiAJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtYW1vbi5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1hbW9uLmMKaW5kZXggNTkyYWMwNC4uODRhYzUyMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1hbW9uLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1hbW9uLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19NSVBTX1ZQRV9MT0FERVIKKyNpZmRlZiBDT05GSUdfTUlQU19WUEVfTE9BREVSX0NNUAogaW50IHZwZV9ydW4oc3RydWN0IHZwZSAqdikKIHsKIAlzdHJ1Y3QgdnBlX25vdGlmaWNhdGlvbnMgKm47CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWluaXQuYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW5pdC5jCmluZGV4IGZjZWJmY2UuLjRmOWU0NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW5pdC5jCkBAIC0yMCw3ICsyMCw4IEBACiAjaW5jbHVkZSA8YXNtL3NtcC1vcHMuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vZncvZncuaD4KLSNpbmNsdWRlIDxhc20vZ2NtcHJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1jbS5oPgorI2luY2x1ZGUgPGFzbS9taXBzLWNwYy5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9nZW5lcmljLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21hbHRhLmg+CiAKQEAgLTExMCw2ICsxMTEsMTEgQEAKIAlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYmFzZSwgKHVuc2lnbmVkIGxvbmcpYmFzZSArIDB4ODApOwogfQogCitwaHlzX3QgbWlwc19jcGNfZGVmYXVsdF9waHlzX2Jhc2Uodm9pZCkKK3sKKwlyZXR1cm4gQ1BDX0JBU0VfQUREUjsKK30KKwogZXh0ZXJuIHN0cnVjdCBwbGF0X3NtcF9vcHMgbXNtdGNfc21wX29wczsKIAogdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCkBAIC0yMzgsMTAgKzI0NCwyMyBAQAogCQkJICBNU0MwMV9QQ0lfU1dBUF9CWVRFU1dBUCA8PCBNU0MwMV9QQ0lfU1dBUF9NRU1fU0hGIHwKIAkJCSAgTVNDMDFfUENJX1NXQVBfQllURVNXQVAgPDwgTVNDMDFfUENJX1NXQVBfQkFSMF9TSEYpOwogI2VuZGlmCisjaWZuZGVmIENPTkZJR19FVkEKIAkJLyogRml4IHVwIHRhcmdldCBtZW1vcnkgbWFwcGluZy4gICovCiAJCU1TQ19SRUFEKE1TQzAxX1BDSV9CQVIwLCBtYXNrKTsKIAkJTVNDX1dSSVRFKE1TQzAxX1BDSV9QMlNDTVNLTCwgbWFzayAmIE1TQzAxX1BDSV9CQVIwX1NJWkVfTVNLKTsKKyNlbHNlCisJCS8qCisJCSAqIFNldHVwIHRoZSBNYWx0YSBtYXggKDJHQikgbWVtb3J5IGZvciBQQ0kgRE1BIGluIGhvc3QgYnJpZGdlCisJCSAqIGluIHRyYW5zcGFyZW50IGFkZHJlc3NpbmcgbW9kZSwgc3RhcnRpbmcgZnJvbSAweDgwMDAwMDAwLgorCQkgKi8KKwkJbWFzayA9IFBIWVNfT0ZGU0VUIHwgKDE8PDMpOworCQlNU0NfV1JJVEUoTVNDMDFfUENJX0JBUjAsIG1hc2spOwogCisJCW1hc2sgPSBQSFlTX09GRlNFVDsKKwkJTVNDX1dSSVRFKE1TQzAxX1BDSV9IRUFENCwgbWFzayk7CisJCU1TQ19XUklURShNU0MwMV9QQ0lfUDJTQ01TS0wsIG1hc2spOworCQlNU0NfV1JJVEUoTVNDMDFfUENJX1AyU0NNQVBMLCBtYXNrKTsKKyNlbmRpZgogCQkvKiBEb24ndCBoYW5kbGUgdGFyZ2V0IHJldHJpZXMgaW5kZWZpbml0ZWx5LiAgKi8KIAkJaWYgKChkYXRhICYgTVNDMDFfUENJX0NGR19NQVhSVFJZX01TSykgPT0KIAkJICAgIE1TQzAxX1BDSV9DRkdfTUFYUlRSWV9NU0spCkBAIC0yNzYsMTAgKzI5NSwxMyBAQAogCWNvbnNvbGVfY29uZmlnKCk7CiAjZW5kaWYKIAkvKiBFYXJseSBkZXRlY3Rpb24gb2YgQ01QIHN1cHBvcnQgKi8KLQlpZiAoZ2NtcF9wcm9iZShHQ01QX0JBU0VfQUREUiwgR0NNUF9BRERSU1BBQ0VfU1opKQotCQlpZiAoIXJlZ2lzdGVyX2NtcF9zbXBfb3BzKCkpCi0JCQlyZXR1cm47CisJbWlwc19jbV9wcm9iZSgpOworCW1pcHNfY3BjX3Byb2JlKCk7CiAKKwlpZiAoIXJlZ2lzdGVyX2Nwc19zbXBfb3BzKCkpCisJCXJldHVybjsKKwlpZiAoIXJlZ2lzdGVyX2NtcF9zbXBfb3BzKCkpCisJCXJldHVybjsKIAlpZiAoIXJlZ2lzdGVyX3ZzbXBfc21wX29wcygpKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW50LmMgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jCmluZGV4IGNhM2UzYTQuLmI3MWVlODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW50LmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbnQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL21pcHMtY20uaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbWFsdGEuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbWFsdGFpbnQuaD4KICNpbmNsdWRlIDxhc20vZ3Q2NDEyMC5oPgpAQCAtMzMsMTMgKzM0LDEwIEBACiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21zYzAxX3BjaS5oPgogI2luY2x1ZGUgPGFzbS9tc2MwMV9pYy5oPgogI2luY2x1ZGUgPGFzbS9naWMuaD4KLSNpbmNsdWRlIDxhc20vZ2NtcHJlZ3MuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vcnRseC5oPgogCi1pbnQgZ2NtcF9wcmVzZW50ID0gLTE7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfbXNjMDFfYml1X2Jhc2U7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBfZ2NtcF9iYXNlOwogc3RhdGljIHVuc2lnbmVkIGludCBpcGlfbWFwW05SX0NQVVNdOwogCiBzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhtaXBzX2lycV9sb2NrKTsKQEAgLTExOSw3ICsxMTcsNyBAQAogCiAJZG9fSVJRKE1BTFRBX0lOVF9CQVNFICsgaXJxKTsKIAotI2lmZGVmIE1JUFNfVlBFX0FQU1BfQVBJCisjaWZkZWYgQ09ORklHX01JUFNfVlBFX0FQU1BfQVBJX01UCiAJaWYgKGFwcnBfaG9vaykKIAkJYXBycF9ob29rKCk7CiAjZW5kaWYKQEAgLTI4OCwxMCArMjg2LDYgQEAKIAogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAogCi0KLSNkZWZpbmUgR0lDX01JUFNfQ1BVX0lQSV9SRVNDSEVEX0lSUQkzCi0jZGVmaW5lIEdJQ19NSVBTX0NQVV9JUElfQ0FMTF9JUlEJNAotCiAjZGVmaW5lIE1JUFNfQ1BVX0lQSV9SRVNDSEVEX0lSUSAwCS8qIFNXIGludCAwIGZvciByZXNjaGVkICovCiAjZGVmaW5lIENfUkVTQ0hFRCBDX1NXMAogI2RlZmluZSBNSVBTX0NQVV9JUElfQ0FMTF9JUlEgMQkJLyogU1cgaW50IDEgZm9yIHJlc2NoZWQgKi8KQEAgLTMwOCw5ICszMDIsMTYgQEAKIAlkb19JUlEoTUlQU19DUFVfSVJRX0JBU0UgKyBNSVBTX0NQVV9JUElfQ0FMTF9JUlEpOwogfQogCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01QICovCisKKyNpZmRlZiBDT05GSUdfTUlQU19HSUNfSVBJCisKKyNkZWZpbmUgR0lDX01JUFNfQ1BVX0lQSV9SRVNDSEVEX0lSUQkzCisjZGVmaW5lIEdJQ19NSVBTX0NQVV9JUElfQ0FMTF9JUlEJNAorCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXBpX3Jlc2NoZWRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLSNpZmRlZiBNSVBTX1ZQRV9BUFNQX0FQSQorI2lmZGVmIENPTkZJR19NSVBTX1ZQRV9BUFNQX0FQSV9DTVAKIAlpZiAoYXBycF9ob29rKQogCQlhcHJwX2hvb2soKTsKICNlbmRpZgpAQCAtMzM4LDcgKzMzOSw3IEBACiAJLmZsYWdzCQk9IElSUUZfUEVSQ1BVLAogCS5uYW1lCQk9ICJJUElfY2FsbCIKIH07Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01QICovCisjZW5kaWYgLyogQ09ORklHX01JUFNfR0lDX0lQSSAqLwogCiBzdGF0aWMgaW50IGdpY19yZXNjaGVkX2ludF9iYXNlOwogc3RhdGljIGludCBnaWNfY2FsbF9pbnRfYmFzZTsKQEAgLTQxOCw0OSArNDE5LDcgQEAKIH07CiAjdW5kZWYgWAogCi0vKgotICogR0NNUCBuZWVkcyB0byBiZSBkZXRlY3RlZCBiZWZvcmUgYW55IFNNUCBpbml0aWFsaXNhdGlvbgotICovCi1pbnQgX19pbml0IGdjbXBfcHJvYmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaWYgKChtaXBzX3JldmlzaW9uX3Njb25pZCAhPSBNSVBTX1JFVklTSU9OX1NDT05fUk9DSVQpICAmJgotCSAgICAobWlwc19yZXZpc2lvbl9zY29uaWQgIT0gTUlQU19SRVZJU0lPTl9TQ09OX0dUNjQxMjApKSB7Ci0JCWdjbXBfcHJlc2VudCA9IDA7Ci0JCXByX2RlYnVnKCJHQ01QIE5PVCBwcmVzZW50XG4iKTsKLQkJcmV0dXJuIGdjbXBfcHJlc2VudDsKLQl9Ci0KLQlpZiAoZ2NtcF9wcmVzZW50ID49IDApCi0JCXJldHVybiBnY21wX3ByZXNlbnQ7Ci0KLQlfZ2NtcF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXBfbm9jYWNoZShHQ01QX0JBU0VfQUREUiwKLQkJR0NNUF9BRERSU1BBQ0VfU1opOwotCV9tc2MwMV9iaXVfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwX25vY2FjaGUoTVNDMDFfQklVX1JFR19CQVNFLAotCQlNU0MwMV9CSVVfQUREUlNQQUNFX1NaKTsKLQlnY21wX3ByZXNlbnQgPSAoKEdDTVBHQ0IoR0NNUEIpICYgR0NNUF9HQ0JfR0NNUEJfR0NNUEJBU0VfTVNLKSA9PQotCQlHQ01QX0JBU0VfQUREUik7Ci0KLQlpZiAoZ2NtcF9wcmVzZW50KQotCQlwcl9kZWJ1ZygiR0NNUCBwcmVzZW50XG4iKTsKLQlyZXR1cm4gZ2NtcF9wcmVzZW50OwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBJT0NVJ3MgcHJlc2VudCAqLwotaW50IF9faW5pdCBnY21wX25pb2N1KHZvaWQpCi17Ci0JcmV0dXJuIGdjbXBfcHJlc2VudCA/ICgoR0NNUEdDQihHQykgJiBHQ01QX0dDQl9HQ19OVU1JT0NVX01TSykgPj4KLQkJR0NNUF9HQ0JfR0NfTlVNSU9DVV9TSEYpIDogMDsKLX0KLQotLyogU2V0IEdDTVAgcmVnaW9uIGF0dHJpYnV0ZXMgKi8KLXZvaWQgX19pbml0IGdjbXBfc2V0cmVnaW9uKGludCByZWdpb24sIHVuc2lnbmVkIGxvbmcgYmFzZSwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgbWFzaywgaW50IHR5cGUpCi17Ci0JR0NNUEdDQm4oQ014QkFTRSwgcmVnaW9uKSA9IGJhc2U7Ci0JR0NNUEdDQm4oQ014TUFTSywgcmVnaW9uKSA9IG1hc2sgfCB0eXBlOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVApCisjaWZkZWYgQ09ORklHX01JUFNfR0lDX0lQSQogc3RhdGljIHZvaWQgX19pbml0IGZpbGxfaXBpX21hcDEoaW50IGJhc2VpbnRyLCBpbnQgY3B1LCBpbnQgY3B1cGluKQogewogCWludCBpbnRyID0gYmFzZWludHIgKyBjcHU7CkBAIC00OTYsOCArNDU1LDggQEAKIAlpZiAoIWNwdV9oYXNfdmVpYykKIAkJbWlwc19jcHVfaXJxX2luaXQoKTsKIAotCWlmIChnY21wX3ByZXNlbnQpICB7Ci0JCUdDTVBHQ0IoR0lDQkEpID0gR0lDX0JBU0VfQUREUiB8IEdDTVBfR0NCX0dJQ0JBX0VOX01TSzsKKwlpZiAobWlwc19jbV9wcmVzZW50KCkpIHsKKwkJd3JpdGVfZ2NyX2dpY19iYXNlKEdJQ19CQVNFX0FERFIgfCBDTV9HQ1JfR0lDX0JBU0VfR0lDRU5fTVNLKTsKIAkJZ2ljX3ByZXNlbnQgPSAxOwogCX0gZWxzZSB7CiAJCWlmIChtaXBzX3JldmlzaW9uX3Njb25pZCA9PSBNSVBTX1JFVklTSU9OX1NDT05fUk9DSVQpIHsKQEAgLTU3Niw3ICs1MzUsNyBAQAogCWlmIChnaWNfcHJlc2VudCkgewogCQkvKiBGSVhNRSAqLwogCQlpbnQgaTsKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNUCkKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0dJQ19JUEkpCiAJCWdpY19jYWxsX2ludF9iYXNlID0gR0lDX05VTV9JTlRSUyAtCiAJCQkoTlJfQ1BVUyAtIG5yX2NwdV9pZHMpICogMiAtIG5yX2NwdV9pZHM7CiAJCWdpY19yZXNjaGVkX2ludF9iYXNlID0gZ2ljX2NhbGxfaW50X2Jhc2UgLSBucl9jcHVfaWRzOwpAQCAtNTg0LDE0ICs1NDMsMTQgQEAKICNlbmRpZgogCQlnaWNfaW5pdChHSUNfQkFTRV9BRERSLCBHSUNfQUREUlNQQUNFX1NaLCBnaWNfaW50cl9tYXAsCiAJCQkJQVJSQVlfU0laRShnaWNfaW50cl9tYXApLCBNSVBTX0dJQ19JUlFfQkFTRSk7Ci0JCWlmICghZ2NtcF9wcmVzZW50KSB7CisJCWlmICghbWlwc19jbV9wcmVzZW50KCkpIHsKIAkJCS8qIEVuYWJsZSB0aGUgR0lDICovCiAJCQlpID0gUkVHKF9tc2MwMV9iaXVfYmFzZSwgTVNDMDFfU0NfQ0ZHKTsKIAkJCVJFRyhfbXNjMDFfYml1X2Jhc2UsIE1TQzAxX1NDX0NGRykgPQogCQkJCShpIHwgKDB4MSA8PCBNU0MwMV9TQ19DRkdfR0lDRU5BX1NIRikpOwogCQkJcHJfZGVidWcoIkdJQyBFbmFibGVkXG4iKTsKIAkJfQotI2lmIGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01QKQorI2lmIGRlZmluZWQoQ09ORklHX01JUFNfR0lDX0lQSSkKIAkJLyogc2V0IHVwIGlwaSBpbnRlcnJ1cHRzICovCiAJCWlmIChjcHVfaGFzX3ZpbnQpIHsKIAkJCXNldF92aV9oYW5kbGVyKE1JUFNDUFVfSU5UX0lQSTAsIG1hbHRhX2lwaV9pcnFkaXNwYXRjaCk7CkBAIC03MDgsMTYgKzY2NywxNiBAQAogCS8qIFRoaXMgZHVwbGljYXRlcyB0aGUgaGFuZGxpbmcgaW4gZG9fYmUgd2hpY2ggc2VlbXMgd3JvbmcgKi8KIAlpbnQgcmV0dmFsID0gaXNfZml4dXAgPyBNSVBTX0JFX0ZJWFVQIDogTUlQU19CRV9GQVRBTDsKIAotCWlmIChnY21wX3ByZXNlbnQpIHsKLQkJdW5zaWduZWQgbG9uZyBjbV9lcnJvciA9IEdDTVBHQ0IoR0NNRUMpOwotCQl1bnNpZ25lZCBsb25nIGNtX2FkZHIgPSBHQ01QR0NCKEdDTUVBKTsKLQkJdW5zaWduZWQgbG9uZyBjbV9vdGhlciA9IEdDTVBHQ0IoR0NNRU8pOworCWlmIChtaXBzX2NtX3ByZXNlbnQoKSkgeworCQl1bnNpZ25lZCBsb25nIGNtX2Vycm9yID0gcmVhZF9nY3JfZXJyb3JfY2F1c2UoKTsKKwkJdW5zaWduZWQgbG9uZyBjbV9hZGRyID0gcmVhZF9nY3JfZXJyb3JfYWRkcigpOworCQl1bnNpZ25lZCBsb25nIGNtX290aGVyID0gcmVhZF9nY3JfZXJyb3JfbXVsdCgpOwogCQl1bnNpZ25lZCBsb25nIGNhdXNlLCBvY2F1c2U7CiAJCWNoYXIgYnVmWzI1Nl07CiAKLQkJY2F1c2UgPSAoY21fZXJyb3IgJiBHQ01QX0dDQl9HTUVDX0VSUk9SX1RZUEVfTVNLKTsKKwkJY2F1c2UgPSBjbV9lcnJvciAmIENNX0dDUl9FUlJPUl9DQVVTRV9FUlJUWVBFX01TSzsKIAkJaWYgKGNhdXNlICE9IDApIHsKLQkJCWNhdXNlID4+PSBHQ01QX0dDQl9HTUVDX0VSUk9SX1RZUEVfU0hGOworCQkJY2F1c2UgPj49IENNX0dDUl9FUlJPUl9DQVVTRV9FUlJUWVBFX1NIRjsKIAkJCWlmIChjYXVzZSA8IDE2KSB7CiAJCQkJdW5zaWduZWQgbG9uZyBjY2FfYml0cyA9IChjbV9lcnJvciA+PiAxNSkgJiA3OwogCQkJCXVuc2lnbmVkIGxvbmcgdHJfYml0cyA9IChjbV9lcnJvciA+PiAxMikgJiA3OwpAQCAtNzQ4LDggKzcwNyw4IEBACiAJCQkJCSBtY21kW2NtZF9iaXRzXSwgc3BvcnRfYml0cyk7CiAJCQl9CiAKLQkJCW9jYXVzZSA9IChjbV9vdGhlciAmIEdDTVBfR0NCX0dNRU9fRVJST1JfMk5EX01TSykgPj4KLQkJCQkgR0NNUF9HQ0JfR01FT19FUlJPUl8yTkRfU0hGOworCQkJb2NhdXNlID0gKGNtX290aGVyICYgQ01fR0NSX0VSUk9SX01VTFRfRVJSMk5EX01TSykgPj4KKwkJCQkgQ01fR0NSX0VSUk9SX01VTFRfRVJSMk5EX1NIRjsKIAogCQkJcHJfZXJyKCJDTV9FUlJPUj0lMDhseCAlcyA8JXM+XG4iLCBjbV9lcnJvciwKIAkJCSAgICAgICBjYXVzZXNbY2F1c2VdLCBidWYpOwpAQCAtNzU3LDcgKzcxNiw3IEBACiAJCQlwcl9lcnIoIkNNX09USEVSPSUwOGx4ICVzXG4iLCBjbV9vdGhlciwgY2F1c2VzW29jYXVzZV0pOwogCiAJCQkvKiByZXByaW1lIGNhdXNlIHJlZ2lzdGVyICovCi0JCQlHQ01QR0NCKEdDTUVDKSA9IDA7CisJCQl3cml0ZV9nY3JfZXJyb3JfY2F1c2UoMCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtbWVtb3J5LmMgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLW1lbW9yeS5jCmluZGV4IDFmNzNkNjMuLjZkMGY0YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtbWVtb3J5LmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1tZW1vcnkuYwpAQCAtMjQsMjIgKzI0LDMwIEBACiAvKiBkZXRlcm1pbmVkIHBoeXNpY2FsIG1lbW9yeSBzaXplLCBub3Qgb3ZlcnJpZGRlbiBieSBjb21tYW5kIGxpbmUgYXJncwkgKi8KIHVuc2lnbmVkIGxvbmcgcGh5c2ljYWxfbWVtc2l6ZSA9IDBMOwogCi1md19tZW1ibG9ja190ICogX19pbml0IGZ3X2dldG1kZXNjKHZvaWQpCitmd19tZW1ibG9ja190ICogX19pbml0IGZ3X2dldG1kZXNjKGludCBldmEpCiB7Ci0JY2hhciAqbWVtc2l6ZV9zdHIsICpwdHI7Ci0JdW5zaWduZWQgaW50IG1lbXNpemU7CisJY2hhciAqbWVtc2l6ZV9zdHIsICplbWVtc2l6ZV9zdHIgX19tYXliZV91bnVzZWQgPSBOVUxMLCAqcHRyOworCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZSwgZW1lbXNpemUgX19tYXliZV91bnVzZWQgPSAwOwogCXN0YXRpYyBjaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdIF9faW5pdGRhdGE7Ci0JbG9uZyB2YWw7CiAJaW50IHRtcDsKIAogCS8qIG90aGVyd2lzZSBsb29rIGluIHRoZSBlbnZpcm9ubWVudCAqLworCiAJbWVtc2l6ZV9zdHIgPSBmd19nZXRlbnYoIm1lbXNpemUiKTsKLQlpZiAoIW1lbXNpemVfc3RyKSB7CisJaWYgKG1lbXNpemVfc3RyKQorCQl0bXAgPSBrc3RydG9sKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7CisJaWYgKGV2YSkgeworCS8qIExvb2sgZm9yIGVtZW1zaXplIGZvciBFVkEgKi8KKwkJZW1lbXNpemVfc3RyID0gZndfZ2V0ZW52KCJlbWVtc2l6ZSIpOworCQlpZiAoZW1lbXNpemVfc3RyKQorCQkJdG1wID0ga3N0cnRvbChlbWVtc2l6ZV9zdHIsIDAsICZlbWVtc2l6ZSk7CisJfQorCWlmICghbWVtc2l6ZSAmJiAhZW1lbXNpemUpIHsKIAkJcHJfd2FybigibWVtc2l6ZSBub3Qgc2V0IGluIFlBTU9OLCBzZXQgdG8gZGVmYXVsdCAoMzJNYilcbiIpOwogCQlwaHlzaWNhbF9tZW1zaXplID0gMHgwMjAwMDAwMDsKIAl9IGVsc2UgewotCQl0bXAgPSBrc3RydG9sKG1lbXNpemVfc3RyLCAwLCAmdmFsKTsKLQkJcGh5c2ljYWxfbWVtc2l6ZSA9ICh1bnNpZ25lZCBsb25nKXZhbDsKKwkJLyogSWYgZW1lbXNpemUgaXMgc2V0LCB0aGVuIHNldCBwaHlzaWNhbF9tZW1zaXplIHRvIHRoYXQgKi8KKwkJcGh5c2ljYWxfbWVtc2l6ZSA9IGVtZW1zaXplID8gOiBtZW1zaXplOwogCX0KIAogI2lmZGVmIENPTkZJR19DUFVfQklHX0VORElBTgpAQCAtNTQsMjAgKzYyLDMwIEBACiAJcHRyID0gc3Ryc3RyKGNtZGxpbmUsICJtZW1zaXplPSIpOwogCWlmIChwdHIgJiYgKHB0ciAhPSBjbWRsaW5lKSAmJiAoKihwdHIgLSAxKSAhPSAnICcpKQogCQlwdHIgPSBzdHJzdHIocHRyLCAiIG1lbXNpemU9Iik7CisJLyogQW5kIG5vdyBsb29rIGZvciBlbWVtc2l6ZSAqLworCWlmIChldmEpIHsKKwkJcHRyID0gc3Ryc3RyKGNtZGxpbmUsICJlbWVtc2l6ZT0iKTsKKwkJaWYgKHB0ciAmJiAocHRyICE9IGNtZGxpbmUpICYmICgqKHB0ciAtIDEpICE9ICcgJykpCisJCQlwdHIgPSBzdHJzdHIocHRyLCAiIGVtZW1zaXplPSIpOworCX0KIAogCWlmIChwdHIpCi0JCW1lbXNpemUgPSBtZW1wYXJzZShwdHIgKyA4LCAmcHRyKTsKKwkJbWVtc2l6ZSA9IG1lbXBhcnNlKHB0ciArIDggKyAoZXZhID8gMSA6IDApLCAmcHRyKTsKIAllbHNlCiAJCW1lbXNpemUgPSBwaHlzaWNhbF9tZW1zaXplOwogCisJLyogTGFzdCA2NEsgZm9yIEhJR0hNRU0gYXJpdGhtZXRpY3MgKi8KKwlpZiAobWVtc2l6ZSA+IDB4N2ZmZjAwMDApCisJCW1lbXNpemUgPSAweDdmZmYwMDAwOworCiAJbWVtc2V0KG1kZXNjLCAwLCBzaXplb2YobWRlc2MpKTsKIAogCW1kZXNjWzBdLnR5cGUgPSBmd19kb250dXNlOwotCW1kZXNjWzBdLmJhc2UgPSAweDAwMDAwMDAwOworCW1kZXNjWzBdLmJhc2UgPSBQSFlTX09GRlNFVDsKIAltZGVzY1swXS5zaXplID0gMHgwMDAwMTAwMDsKIAogCW1kZXNjWzFdLnR5cGUgPSBmd19jb2RlOwotCW1kZXNjWzFdLmJhc2UgPSAweDAwMDAxMDAwOworCW1kZXNjWzFdLmJhc2UgPSBtZGVzY1swXS5iYXNlICsgMHgwMDAwMTAwMFVMOwogCW1kZXNjWzFdLnNpemUgPSAweDAwMGVmMDAwOwogCiAJLyoKQEAgLTc4LDIxICs5NiwyNyBAQAogCSAqIGRldmljZXMuCiAJICovCiAJbWRlc2NbMl0udHlwZSA9IGZ3X2RvbnR1c2U7Ci0JbWRlc2NbMl0uYmFzZSA9IDB4MDAwZjAwMDA7CisJbWRlc2NbMl0uYmFzZSA9IG1kZXNjWzBdLmJhc2UgKyAweDAwMGYwMDAwVUw7CiAJbWRlc2NbMl0uc2l6ZSA9IDB4MDAwMTAwMDA7CiAKIAltZGVzY1szXS50eXBlID0gZndfZG9udHVzZTsKLQltZGVzY1szXS5iYXNlID0gMHgwMDEwMDAwMDsKKwltZGVzY1szXS5iYXNlID0gbWRlc2NbMF0uYmFzZSArIDB4MDAxMDAwMDBVTDsKIAltZGVzY1szXS5zaXplID0gQ1BIWVNBRERSKFBGTl9BTElHTigodW5zaWduZWQgbG9uZykmX2VuZCkpIC0KLQkJbWRlc2NbM10uYmFzZTsKKwkJMHgwMDEwMDAwMFVMOwogCiAJbWRlc2NbNF0udHlwZSA9IGZ3X2ZyZWU7Ci0JbWRlc2NbNF0uYmFzZSA9IENQSFlTQUREUihQRk5fQUxJR04oJl9lbmQpKTsKLQltZGVzY1s0XS5zaXplID0gbWVtc2l6ZSAtIG1kZXNjWzRdLmJhc2U7CisJbWRlc2NbNF0uYmFzZSA9IG1kZXNjWzBdLmJhc2UgKyBDUEhZU0FERFIoUEZOX0FMSUdOKCZfZW5kKSk7CisJbWRlc2NbNF0uc2l6ZSA9IG1lbXNpemUgLSBDUEhZU0FERFIobWRlc2NbNF0uYmFzZSk7CiAKIAlyZXR1cm4gJm1kZXNjWzBdOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX2luaXRfcGFnZXNfZXZhX21hbHRhKHZvaWQgKmJlZ2luLCB2b2lkICplbmQpCit7CisJZnJlZV9pbml0X3BhZ2VzKCJ1bnVzZWQga2VybmVsIiwgX19wYV9zeW1ib2woKHVuc2lnbmVkIGxvbmcgKiliZWdpbiksCisJCQlfX3BhX3N5bWJvbCgodW5zaWduZWQgbG9uZyAqKWVuZCkpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBmd19tZW10eXBlX2NsYXNzaWZ5KHVuc2lnbmVkIGludCB0eXBlKQogewogCXN3aXRjaCAodHlwZSkgewpAQCAtMTA5LDcgKzEzMyw5IEBACiB7CiAJZndfbWVtYmxvY2tfdCAqcDsKIAotCXAgPSBmd19nZXRtZGVzYygpOworCXAgPSBmd19nZXRtZGVzYyhjb25maWdfZW5hYmxlZChDT05GSUdfRVZBKSk7CisJZnJlZV9pbml0X3BhZ2VzX2V2YSA9IChjb25maWdfZW5hYmxlZChDT05GSUdfRVZBKSA/CisJCQkgICAgICAgZnJlZV9pbml0X3BhZ2VzX2V2YV9tYWx0YSA6IE5VTEwpOwogCiAJd2hpbGUgKHAtPnNpemUpIHsKIAkJbG9uZyB0eXBlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zZXR1cC5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zZXR1cC5jCmluZGV4IGM3MmEwNjkuLmJmNjIxNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc2V0dXAuYworKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNldHVwLmMKQEAgLTI2LDEyICsyNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogI2luY2x1ZGUgPGFzbS9mdy9mdy5oPgorI2luY2x1ZGUgPGFzbS9taXBzLWNtLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbWFsdGEuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbWFsdGFpbnQuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0jaW5jbHVkZSA8YXNtL2djbXByZWdzLmg+CiAjaWZkZWYgQ09ORklHX1ZUCiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2VuZGlmCkBAIC0xMjcsNyArMTI3LDcgQEAKIAkJCQkgQk9OSVRPX1BDSU1FTUJBU0VDRkdfTUVNQkFTRTFfQ0FDSEVEKTsKIAkJCXByX2luZm8oIkVuYWJsZWQgQm9uaXRvIElPQkMgY29oZXJlbmN5XG4iKTsKIAkJfQotCX0gZWxzZSBpZiAoZ2NtcF9uaW9jdSgpICE9IDApIHsKKwl9IGVsc2UgaWYgKG1pcHNfY21fbnVtaW9jdSgpICE9IDApIHsKIAkJLyogTm90aGluZyBzcGVjaWFsIG5lZWRzIHRvIGJlIGRvbmUgdG8gZW5hYmxlIGNvaGVyZW5jeSAqLwogCQlwcl9pbmZvKCJDTVAgSU9DVSBkZXRlY3RlZFxuIik7CiAJCWlmICgoKih1bnNpZ25lZCBpbnQgKikweGJmNDAzMDAwICYgMHg4MSkgIT0gMHg4MSkgewpAQCAtMTY1LDcgKzE2NSw2IEBACiAjZW5kaWYKIH0KIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERQogc3RhdGljIHZvaWQgX19pbml0IHBjaV9jbG9ja19jaGVjayh2b2lkKQogewogCXVuc2lnbmVkIGludCBfX2lvbWVtICpqbXByX3AgPQpAQCAtMTc1LDE4ICsxNzQsMjUgQEAKIAkJMzMsIDIwLCAyNSwgMzAsIDEyLCAxNiwgMzcsIDEwCiAJfTsKIAlpbnQgcGNpY2xvY2sgPSBwY2ljbG9ja3Nbam1wcl07Ci0JY2hhciAqYXJncHRyID0gZndfZ2V0Y21kbGluZSgpOworCWNoYXIgKm9wdHB0ciwgKmFyZ3B0ciA9IGZ3X2dldGNtZGxpbmUoKTsKIAotCWlmIChwY2ljbG9jayAhPSAzMyAmJiAhc3Ryc3RyKGFyZ3B0ciwgImlkZWJ1cz0iKSkgewotCQlwcl93YXJuKCJXQVJOSU5HOiBQQ0kgY2xvY2sgaXMgJWRNSHosIHNldHRpbmcgaWRlYnVzXG4iLAorCS8qCisJICogSWYgdXNlciBwYXNzZWQgYSBwY2lfY2xvY2s9IG9wdGlvbiwgZG9uJ3QgdGFjayBvbiBhbm90aGVyIG9uZQorCSAqLworCW9wdHB0ciA9IHN0cnN0cihhcmdwdHIsICJwY2lfY2xvY2s9Iik7CisJaWYgKG9wdHB0ciAmJiAob3B0cHRyID09IGFyZ3B0ciB8fCBvcHRwdHJbLTFdID09ICcgJykpCisJCXJldHVybjsKKworCWlmIChwY2ljbG9jayAhPSAzMykgeworCQlwcl93YXJuKCJXQVJOSU5HOiBQQ0kgY2xvY2sgaXMgJWRNSHosIHNldHRpbmcgcGNpX2Nsb2NrXG4iLAogCQkJcGNpY2xvY2spOwogCQlhcmdwdHIgKz0gc3RybGVuKGFyZ3B0cik7Ci0JCXNwcmludGYoYXJncHRyLCAiIGlkZWJ1cz0lZCIsIHBjaWNsb2NrKTsKKwkJc3ByaW50ZihhcmdwdHIsICIgcGNpX2Nsb2NrPSVkIiwgcGNpY2xvY2spOwogCQlpZiAocGNpY2xvY2sgPCAyMCB8fCBwY2ljbG9jayA+IDY2KQotCQkJcHJfd2FybigiV0FSTklORzogSURFIHRpbWluZyBjYWxjdWxhdGlvbnMgd2lsbCBiZSBpbmNvcnJlY3RcbiIpOworCQkJcHJfd2FybigiV0FSTklORzogSURFIHRpbWluZyBjYWxjdWxhdGlvbnMgd2lsbCBiZSAiCisJCQkgICAgICAgICJpbmNvcnJlY3RcbiIpOwogCX0KIH0KLSNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVlQpICYmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQogc3RhdGljIHZvaWQgX19pbml0IHNjcmVlbl9pbmZvX3NldHVwKHZvaWQpCkBAIC0yNDcsNiArMjUzLDEwIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKKwlpZiAoY29uZmlnX2VuYWJsZWQoQ09ORklHX0VWQSkpCisJCS8qIEVWQSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQgaW4gbWFjaC1tYWx0YS9rZXJuZWwtaW5pdC5oICovCisJCXByX2luZm8oIkVuaGFuY2VkIFZpcnR1YWwgQWRkcmVzc2luZyAoRVZBKSBhY3RpdmF0ZWRcbiIpOworCiAJbWlwc19wY2liaW9zX2luaXQoKTsKIAogCS8qIFJlcXVlc3QgSS9PIHNwYWNlIGZvciBkZXZpY2VzIHVzZWQgb24gdGhlIE1hbHRhIGJvYXJkLiAqLwpAQCAtMjY4LDkgKzI3OCw3IEBACiAKIAlwbGF0X3NldHVwX2lvY29oZXJlbmN5KCk7CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREUKIAlwY2lfY2xvY2tfY2hlY2soKTsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfRkQKIAlmZF9hY3RpdmF0ZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy1tdGQuYyBiL2FyY2gvbWlwcy9tdGktc2VhZDMvc2VhZDMtbXRkLmMKaW5kZXggZmZhMzVmNS4uZjljODkwZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1zZWFkMy9zZWFkMy1tdGQuYworKysgYi9hcmNoL21pcHMvbXRpLXNlYWQzL3NlYWQzLW10ZC5jCkBAIC01MCw1ICs1MCw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLQotbW9kdWxlX2luaXQoc2VhZDNfbXRkX2luaXQpCitkZXZpY2VfaW5pdGNhbGwoc2VhZDNfbXRkX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IDJhODZlMzguLmU3NDczMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKQEAgLTg2LDggKzg2LDExIEBACiAJY2FzZSBDUFVfMzRLOgogCWNhc2UgQ1BVXzEwMDRLOgogCWNhc2UgQ1BVXzc0SzoKKwljYXNlIENQVV8xMDc0SzoKIAljYXNlIENQVV9JTlRFUkFQVElWOgogCWNhc2UgQ1BVX1BST0FQVElWOgorCWNhc2UgQ1BVX1A1NjAwOgorCWNhc2UgQ1BVX001MTUwOgogCWNhc2UgQ1BVX0xPT05HU09OMToKIAljYXNlIENQVV9TQjE6CiAJY2FzZSBDUFVfU0IxQToKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYwppbmRleCA0ZDk0ZDc1Li40MjgyMWFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX21pcHN4eC5jCkBAIC0zNzIsNiArMzcyLDcgQEAKIAkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzLzM0SyI7CiAJCWJyZWFrOwogCisJY2FzZSBDUFVfMTA3NEs6CiAJY2FzZSBDUFVfNzRLOgogCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvNzRLIjsKIAkJYnJlYWs7CkBAIC0zODQsNiArMzg1LDE0IEBACiAJCW9wX21vZGVsX21pcHN4eF9vcHMuY3B1X3R5cGUgPSAibWlwcy9wcm9BcHRpdiI7CiAJCWJyZWFrOwogCisJY2FzZSBDUFVfUDU2MDA6CisJCW9wX21vZGVsX21pcHN4eF9vcHMuY3B1X3R5cGUgPSAibWlwcy9QNTYwMCI7CisJCWJyZWFrOworCisJY2FzZSBDUFVfTTUxNTA6CisJCW9wX21vZGVsX21pcHN4eF9vcHMuY3B1X3R5cGUgPSAibWlwcy9NNTE1MCI7CisJCWJyZWFrOworCiAJY2FzZSBDUFVfNUtDOgogCQlvcF9tb2RlbF9taXBzeHhfb3BzLmNwdV90eXBlID0gIm1pcHMvNUsiOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCmluZGV4IDEzN2YyYTYuLmQ2MTEzOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQpAQCAtMjksNiArMjksNyBAQAogb2JqLSQoQ09ORklHX01JUFNfQ09CQUxUKQkrPSBmaXh1cC1jb2JhbHQubwogb2JqLSQoQ09ORklHX0xFTU9URV9GVUxPT05HMkUpCSs9IGZpeHVwLWZ1bG9vbmcyZS5vIG9wcy1sb29uZ3NvbjIubwogb2JqLSQoQ09ORklHX0xFTU9URV9NQUNIMkYpCSs9IGZpeHVwLWxlbW90ZTJmLm8gb3BzLWxvb25nc29uMi5vCitvYmotJChDT05GSUdfTEVNT1RFX01BQ0gzQSkJKz0gZml4dXAtbG9vbmdzb24zLm8gb3BzLWxvb25nc29uMy5vCiBvYmotJChDT05GSUdfTUlQU19NQUxUQSkJKz0gZml4dXAtbWFsdGEubyBwY2ktbWFsdGEubwogb2JqLSQoQ09ORklHX1BNQ19NU1A3MTIwX0dXKQkrPSBmaXh1cC1wbWNtc3AubyBvcHMtcG1jbXNwLm8KIG9iai0kKENPTkZJR19QTUNfTVNQNzEyMF9FVkFMKQkrPSBmaXh1cC1wbWNtc3AubyBvcHMtcG1jbXNwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtbG9vbmdzb24zLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWxvb25nc29uMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDhhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWxvb25nc29uMy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBmaXh1cC1sb29uZ3NvbjMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBMZW1vdGUsIEluYy4KKyAqIEF1dGhvcjogWGlhbmcgWXUsIHhpYW5neUBsZW1vdGUuY29tCisgKiAgICAgICAgIENoZW4gSHVhY2FpLCBjaGVuaGNAbGVtb3RlLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGJvb3RfcGFyYW0uaD4KKworc3RhdGljIHZvaWQgcHJpbnRfZml4dXBfaW5mbyhjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRGV2aWNlICV4OiV4LCBpcnEgJWRcbiIsCisJCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGRldi0+aXJxKTsKK30KKworaW50IF9faW5pdCBwY2liaW9zX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXByaW50X2ZpeHVwX2luZm8oZGV2KTsKKwlyZXR1cm4gZGV2LT5pcnE7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9maXh1cF9yYWRlb24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0KQorCQlyZXR1cm47CisKKwlpZiAoIWxvb25nc29uX3N5c2NvbmYudmdhYmlvc19hZGRyKQorCQlyZXR1cm47CisKKwlwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCA9CisJCWxvb25nc29uX3N5c2NvbmYudmdhYmlvc19hZGRyOworCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmVuZCAgID0KKwkJbG9vbmdzb25fc3lzY29uZi52Z2FiaW9zX2FkZHIgKyAyNTYqMTAyNCAtIDE7CisJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fQ09QWTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJCQVIgJWQ6IGFzc2lnbmVkICVwUiBmb3IgUmFkZW9uIFJPTVxuIiwKKwkJCVBDSV9ST01fUkVTT1VSQ0UsICZwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXSk7Cit9CisKK0RFQ0xBUkVfUENJX0ZJWFVQX0NMQVNTX0ZJTkFMKFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQU5ZX0lELAorCQkJCVBDSV9DTEFTU19ESVNQTEFZX1ZHQSwgOCwgcGNpX2ZpeHVwX3JhZGVvbik7CisKKy8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KK2ludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtbWFsdGEuYyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtbWFsdGEuYwppbmRleCA3YTBlZGE3Li4yZjllNTJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLW1hbHRhLmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1tYWx0YS5jCkBAIC01MSw2ICs1MSwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtYWx0YV9waWl4X2Z1bmMzX2Jhc2VfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKiBTZXQgYSBzYW5lIFBNIEkvTyBiYXNlIGFkZHJlc3MgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQSUlYNF9GVU5DM19QTUJBLCAweDEwMDApOworCisJLyogRW5hYmxlIGFjY2VzcyB0byB0aGUgUE0gSS9PIHJlZ2lvbiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBJSVg0X0ZVTkMzX1BNUkVHTUlTQywKKwkJCSAgICAgIFBJSVg0X0ZVTkMzX1BNUkVHTUlTQ19FTik7Cit9CisKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLAorCQkJbWFsdGFfcGlpeF9mdW5jM19iYXNlX2ZpeHVwKTsKKwogc3RhdGljIHZvaWQgbWFsdGFfcGlpeF9mdW5jMF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAl1bnNpZ25lZCBjaGFyIHJlZ192YWw7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL21zaS1vY3Rlb24uYyBiL2FyY2gvbWlwcy9wY2kvbXNpLW9jdGVvbi5jCmluZGV4IGQzN2JlMzYuLjJiOTFiMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvbXNpLW9jdGVvbi5jCisrKyBiL2FyY2gvbWlwcy9wY2kvbXNpLW9jdGVvbi5jCkBAIC0xNTAsNiArMTUwLDcgQEAKIAkJbXNnLmFkZHJlc3NfbG8gPQogCQkJKCgxMjh1bCA8PCAyMCkgKyBDVk1YX1BDSV9NU0lfUkNWKSAmIDB4ZmZmZmZmZmY7CiAJCW1zZy5hZGRyZXNzX2hpID0gKCgxMjh1bCA8PCAyMCkgKyBDVk1YX1BDSV9NU0lfUkNWKSA+PiAzMjsKKwkJYnJlYWs7CiAJY2FzZSBPQ1RFT05fRE1BX0JBUl9UWVBFX0JJRzoKIAkJLyogV2hlbiB1c2luZyBiaWcgYmFyLCBCYXIgMCBpcyBiYXNlZCBhdCAwICovCiAJCW1zZy5hZGRyZXNzX2xvID0gKDAgKyBDVk1YX1BDSV9NU0lfUkNWKSAmIDB4ZmZmZmZmZmY7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1sb29uZ3NvbjMuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLWxvb25nc29uMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWQ1NDFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BjaS9vcHMtbG9vbmdzb24zLmMKQEAgLTAsMCArMSwxMDEgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2Jvbml0bzY0Lmg+CisKKyNpbmNsdWRlIDxsb29uZ3Nvbi5oPgorCisjZGVmaW5lIFBDSV9BQ0NFU1NfUkVBRCAgMAorI2RlZmluZSBQQ0lfQUNDRVNTX1dSSVRFIDEKKworI2RlZmluZSBIVDFMT19QQ0lDRkdfQkFTRSAgICAgIDB4MWEwMDAwMDAKKyNkZWZpbmUgSFQxTE9fUENJQ0ZHX0JBU0VfVFAxICAweDFiMDAwMDAwCisKK3N0YXRpYyBpbnQgbG9vbmdzb24zX3BjaV9jb25maWdfYWNjZXNzKHVuc2lnbmVkIGNoYXIgYWNjZXNzX3R5cGUsCisJCXN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJaW50IHdoZXJlLCB1MzIgKmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBidXNudW0gPSBidXMtPm51bWJlcjsKKwl1X2ludDY0X3QgYWRkciwgdHlwZTsKKwl2b2lkICphZGRycDsKKwlpbnQgZGV2aWNlID0gUENJX1NMT1QoZGV2Zm4pOworCWludCBmdW5jdGlvbiA9IFBDSV9GVU5DKGRldmZuKTsKKwlpbnQgcmVnID0gd2hlcmUgJiB+MzsKKworCWFkZHIgPSAoYnVzbnVtIDw8IDE2KSB8IChkZXZpY2UgPDwgMTEpIHwgKGZ1bmN0aW9uIDw8IDgpIHwgcmVnOworCWlmIChidXNudW0gPT0gMCkgeworCQlpZiAoZGV2aWNlID4gMzEpCisJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCQlhZGRycCA9ICh2b2lkICopKFRPX1VOQ0FDKEhUMUxPX1BDSUNGR19CQVNFKSB8IChhZGRyICYgMHhmZmZmKSk7CisJCXR5cGUgPSAwOworCisJfSBlbHNlIHsKKwkJYWRkcnAgPSAodm9pZCAqKShUT19VTkNBQyhIVDFMT19QQ0lDRkdfQkFTRV9UUDEpIHwgKGFkZHIpKTsKKwkJdHlwZSA9IDB4MTAwMDA7CisJfQorCisJaWYgKGFjY2Vzc190eXBlID09IFBDSV9BQ0NFU1NfV1JJVEUpCisJCXdyaXRlbCgqZGF0YSwgYWRkcnApOworCWVsc2UgeworCQkqZGF0YSA9IHJlYWRsKGFkZHJwKTsKKwkJaWYgKCpkYXRhID09IDB4ZmZmZmZmZmYpIHsKKwkJCSpkYXRhID0gLTE7CisJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCQl9CisJfQorCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgbG9vbmdzb24zX3BjaV9wY2liaW9zX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisJaW50IHJldCA9IGxvb25nc29uM19wY2lfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsCisJCQlidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpOworCisJaWYgKHJldCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCXJldHVybiByZXQ7CisKKwlpZiAoc2l6ZSA9PSAxKQorCQkqdmFsID0gKGRhdGEgPj4gKCh3aGVyZSAmIDMpIDw8IDMpKSAmIDB4ZmY7CisJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkqdmFsID0gKGRhdGEgPj4gKCh3aGVyZSAmIDMpIDw8IDMpKSAmIDB4ZmZmZjsKKwllbHNlCisJCSp2YWwgPSBkYXRhOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCBsb29uZ3NvbjNfcGNpX3BjaWJpb3Nfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisJaW50IHJldDsKKworCWlmIChzaXplID09IDQpCisJCWRhdGEgPSB2YWw7CisJZWxzZSB7CisJCXJldCA9IGxvb25nc29uM19wY2lfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsCisJCQkJYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKTsKKwkJaWYgKHJldCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChzaXplID09IDEpCisJCQlkYXRhID0gKGRhdGEgJiB+KDB4ZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAorCQkJICAgICh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkJZGF0YSA9IChkYXRhICYgfigweGZmZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAorCQkJICAgICh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKKwl9CisKKwlyZXQgPSBsb29uZ3NvbjNfcGNpX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19XUklURSwKKwkJCWJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgcGNpX29wcyBsb29uZ3Nvbl9wY2lfb3BzID0geworCS5yZWFkID0gbG9vbmdzb24zX3BjaV9wY2liaW9zX3JlYWQsCisJLndyaXRlID0gbG9vbmdzb24zX3BjaV9wY2liaW9zX3dyaXRlCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktYWxjaGVteS5jIGIvYXJjaC9taXBzL3BjaS9wY2ktYWxjaGVteS5jCmluZGV4IGQxZmFlY2UuLjU2M2QxZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLWFsY2hlbXkuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1hbGNoZW15LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAorI2luY2x1ZGUgPGFzbS9kbWEtY29oZXJlbmNlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS90bGJtaXNjLmg+CiAKQEAgLTQxMSwxNyArNDEyLDE1IEBACiAJfQogCWN0eC0+YWxjaGVteV9wY2lfY3RybC5pb19tYXBfYmFzZSA9ICh1bnNpZ25lZCBsb25nKXZpcnRfaW87CiAKLSNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCiAJLyogQXUxNTAwIHJldmlzaW9ucyBvbGRlciB0aGFuIEFEIGhhdmUgYm9ya2VkIGNvaGVyZW50IFBDSSAqLwogCWlmICgoYWxjaGVteV9nZXRfY3B1dHlwZSgpID09IEFMQ0hFTVlfQ1BVX0FVMTUwMCkgJiYKLQkgICAgKHJlYWRfYzBfcHJpZCgpIDwgMHgwMTAzMDIwMikpIHsKKwkgICAgKHJlYWRfYzBfcHJpZCgpIDwgMHgwMTAzMDIwMikgJiYgIWNvaGVyZW50aW8pIHsKIAkJdmFsID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19DT05GSUcpOwogCQl2YWwgfD0gUENJX0NPTkZJR19OQzsKIAkJX19yYXdfd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgUENJX1JFR19DT05GSUcpOwogCQl3bWIoKTsKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm5vbi1jb2hlcmVudCBQQ0kgb24gQXUxNTAwIEFBL0FCL0FDXG4iKTsKIAl9Ci0jZW5kaWYKIAogCWlmIChwZC0+Ym9hcmRfbWFwX2lycSkKIAkJY3R4LT5ib2FyZF9tYXBfaXJxID0gcGQtPmJvYXJkX21hcF9pcnE7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1tYWx0YS5jIGIvYXJjaC9taXBzL3BjaS9wY2ktbWFsdGEuYwppbmRleCBmMWE3Mzg5Li5jZmJiYzNlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1tYWx0YS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLW1hbHRhLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vZ3Q2NDEyMC5oPgotI2luY2x1ZGUgPGFzbS9nY21wcmVncy5oPgorI2luY2x1ZGUgPGFzbS9taXBzLWNtLmg+CiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvYm9uaXRvNjQuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbXNjMDFfcGNpLmg+CkBAIC0yMDEsMTEgKzIwMSwxMSBAQAogCQltc2NfbWVtX3Jlc291cmNlLnN0YXJ0ID0gc3RhcnQgJiBtYXNrOwogCQltc2NfbWVtX3Jlc291cmNlLmVuZCA9IChzdGFydCAmIG1hc2spIHwgfm1hc2s7CiAJCW1zY19jb250cm9sbGVyLm1lbV9vZmZzZXQgPSAoc3RhcnQgJiBtYXNrKSAtIChtYXAgJiBtYXNrKTsKLSNpZmRlZiBDT05GSUdfTUlQU19DTVAKLQkJaWYgKGdjbXBfbmlvY3UoKSkKLQkJCWdjbXBfc2V0cmVnaW9uKDAsIHN0YXJ0LCBtYXNrLAotCQkJCUdDTVBfR0NCX0dDTVBCX0NNREVGVEdUX0lPQ1UxKTsKLSNlbmRpZgorCQlpZiAobWlwc19jbV9udW1pb2N1KCkpIHsKKwkJCXdyaXRlX2djcl9yZWcwX2Jhc2Uoc3RhcnQpOworCQkJd3JpdGVfZ2NyX3JlZzBfbWFzayhtYXNrIHwKKwkJCQkJICAgIENNX0dDUl9SRUduX01BU0tfQ01UR1RfSU9DVTApOworCQl9CiAJCU1TQ19SRUFEKE1TQzAxX1BDSV9TQzJQSU9CQVNMLCBzdGFydCk7CiAJCU1TQ19SRUFEKE1TQzAxX1BDSV9TQzJQSU9NU0tMLCBtYXNrKTsKIAkJTVNDX1JFQUQoTVNDMDFfUENJX1NDMlBJT01BUEwsIG1hcCk7CkBAIC0yMTMsMTEgKzIxMywxMSBAQAogCQltc2NfaW9fcmVzb3VyY2UuZW5kID0gKG1hcCAmIG1hc2spIHwgfm1hc2s7CiAJCW1zY19jb250cm9sbGVyLmlvX29mZnNldCA9IDA7CiAJCWlvcG9ydF9yZXNvdXJjZS5lbmQgPSB+bWFzazsKLSNpZmRlZiBDT05GSUdfTUlQU19DTVAKLQkJaWYgKGdjbXBfbmlvY3UoKSkKLQkJCWdjbXBfc2V0cmVnaW9uKDEsIHN0YXJ0LCBtYXNrLAotCQkJCUdDTVBfR0NCX0dDTVBCX0NNREVGVEdUX0lPQ1UxKTsKLSNlbmRpZgorCQlpZiAobWlwc19jbV9udW1pb2N1KCkpIHsKKwkJCXdyaXRlX2djcl9yZWcxX2Jhc2Uoc3RhcnQpOworCQkJd3JpdGVfZ2NyX3JlZzFfbWFzayhtYXNrIHwKKwkJCQkJICAgIENNX0dDUl9SRUduX01BU0tfQ01UR1RfSU9DVTApOworCQl9CiAJCS8qIElmIHJhbmdlcyBvdmVybGFwIEkvTyB0YWtlcyBwcmVjZWRlbmNlLiAgKi8KIAkJc3RhcnQgPSBzdGFydCAmIG1hc2s7CiAJCWVuZCA9IHN0YXJ0IHwgfm1hc2s7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jcy1tc3A3MXh4L21zcF9zZXR1cC5jIGIvYXJjaC9taXBzL3BtY3MtbXNwNzF4eC9tc3Bfc2V0dXAuYwppbmRleCAzOTZiMjk2Li43ZTk4MDc2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG1jcy1tc3A3MXh4L21zcF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9wbWNzLW1zcDcxeHgvbXNwX3NldHVwLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkvKiBDYWNoZSB0aGUgcmVzZXQgY29kZSBvZiB0aGlzIGZ1bmN0aW9uICovCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAogCQkiCS5zZXQJcHVzaAkJCQlcbiIKLQkJIgkuc2V0CW1pcHMzCQkJCVxuIgorCQkiCS5zZXQJYXJjaD1yNDAwMAkJCVxuIgogCQkiCWxhCSUwLHN0YXJ0cG9pbnQJCQlcbiIKIAkJIglsYQklMSxlbmRwb2ludAkJCVxuIgogCQkiCS5zZXQJcG9wCQkJCVxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3Bvd2VyL2hpYmVybmF0ZS5TIGIvYXJjaC9taXBzL3Bvd2VyL2hpYmVybmF0ZS5TCmluZGV4IDdlMDI3N2EuLjMyYTdjODIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wb3dlci9oaWJlcm5hdGUuUworKysgYi9hcmNoL21pcHMvcG93ZXIvaGliZXJuYXRlLlMKQEAgLTQzLDYgKzQzLDcgQEAKIAlibmUgdDEsIHQzLCAxYgogCVBUUl9MIHQwLCBQQkVfTkVYVCh0MCkKIAlibmV6IHQwLCAwYgorCWphbCBsb2NhbF9mbHVzaF90bGJfYWxsIC8qIEF2b2lkIFRMQiBtaXNtYXRjaCBhZnRlciBrZXJuZWwgcmVzdW1lICovCiAJUFRSX0xBIHQwLCBzYXZlZF9yZWdzCiAJUFRSX0wgcmEsIFBUX1IzMSh0MCkKIAlQVFJfTCBzcCwgUFRfUjI5KHQwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3JhbGluay9LY29uZmlnIGIvYXJjaC9taXBzL3JhbGluay9LY29uZmlnCmluZGV4IDFiZmQxYzEuLjRhMjk2NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9yYWxpbmsvS2NvbmZpZworKysgYi9hcmNoL21pcHMvcmFsaW5rL0tjb25maWcKQEAgLTIwLDE5ICsyMCwxMyBAQAogCWNvbmZpZyBTT0NfUlQzMDVYCiAJCWJvb2wgIlJUMzA1eCIKIAkJc2VsZWN0IFVTQl9BUkNIX0hBU19IQ0QKLQkJc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCi0JCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCiAJY29uZmlnIFNPQ19SVDM4ODMKIAkJYm9vbCAiUlQzODgzIgotCQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKLQkJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJCXNlbGVjdCBIV19IQVNfUENJCiAKIAljb25maWcgU09DX01UNzYyMAogCQlib29sICJNVDc2MjAiCi0JCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAogZW5kY2hvaWNlCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKaW5kZXggM2RiNjRkNS4uNThiNDBhZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCWludCBpcnEgPSBTR0lfQlVTRVJSX0lSUTsKIAogCWlycV9lbnRlcigpOwotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGlycV90b19kZXNjKGlycSkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJaXAyMl9iZV9pbnRlcnJ1cHQoaXJxKTsKIAlpcnFfZXhpdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCmluZGV4IDYwNzE5MjQuLjA0NWFhODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCWNoYXIgYzsKIAogCWlycV9lbnRlcigpOwotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGlycV90b19kZXNjKGlycSkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KGlycSk7CiAJcHJpbnRrKEtFUk5fQUxFUlQgIk9vcHMsIGdvdCA4MjU0IGludGVycnVwdC5cbiIpOwogCUFyY1JlYWQoMCwgJmMsIDEsICZjbnQpOwogCUFyY0VudGVySW50ZXJhY3RpdmVNb2RlKCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKaW5kZXggMDlkNmUxNi4uNTljZmUyNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYwpAQCAtOTUsNyArOTUsNyBAQAogCXU2NCBjdXJfaW50czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaSA9IGNwdW1hc2tfZmlyc3QobWFzayk7CisJaSA9IGNwdW1hc2tfZmlyc3RfYW5kKG1hc2ssIGNwdV9vbmxpbmVfbWFzayk7CiAKIAkvKiBDb252ZXJ0IGxvZ2ljYWwgQ1BVIHRvIHBoeXNpY2FsIENQVSAqLwogCWNwdSA9IGNwdV9sb2dpY2FsX21hcChpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYwppbmRleCA1NGUyYzRkLi43MGQ5MTgyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAlpbnQgaXJxID0gS19CQ00xNDgwX0lOVF9NQk9YXzBfMDsKIAl1bnNpZ25lZCBpbnQgYWN0aW9uOwogCi0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIAkvKiBMb2FkIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZSdyZSBzdXBwb3NlZCB0byBkbyAqLwogCWFjdGlvbiA9IChfX3Jhd19yZWFkcShtYWlsYm94XzBfcmVnc1tjcHVdKSA+PiA0OCkgJiAweGZmZmY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKaW5kZXggZmNhMGNkYi4uNmQ4ZGJhNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAl1NjQgY3VyX2ludHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWkgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOworCWkgPSBjcHVtYXNrX2ZpcnN0X2FuZChtYXNrLCBjcHVfb25saW5lX21hc2spOwogCiAJLyogQ29udmVydCBsb2dpY2FsIENQVSB0byBwaHlzaWNhbCBDUFUgKi8KIAljcHUgPSBjcHVfbG9naWNhbF9tYXAoaSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NtcC5jCmluZGV4IGQ3Yjk0MmQuLmRiOTc2MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NtcC5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlpbnQgaXJxID0gS19JTlRfTUJPWF8wOwogCXVuc2lnbmVkIGludCBhY3Rpb247CiAKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCS8qIExvYWQgdGhlIG1haWxib3ggcmVnaXN0ZXIgdG8gZmlndXJlIG91dCB3aGF0IHdlJ3JlIHN1cHBvc2VkIHRvIGRvICovCiAJYWN0aW9uID0gKF9fX19yYXdfcmVhZHEobWFpbGJveF9yZWdzW2NwdV0pID4+IDQ4KSAmIDB4ZmZmZjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggOTkyZTk4OS4uNjU0ZDViYSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDcgKzEsOSBAQAogCiBnZW5lcmljLXkgKz0gYmFycmllci5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKIGdlbmVyaWMteSArPSBleGVjLmgKIGdlbmVyaWMteSArPSBoYXNoLmgKLWdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBwcmVlbXB0LmgKK2dlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2OGFkNy4uMDAwMDAwMAotLS0gYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdXRpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvY2V2dC1tbjEwMzAwLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL2NldnQtbW4xMDMwMC5jCmluZGV4IGNjY2UzNWUuLjYwZjY0Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvY2V2dC1tbjEwMzAwLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9jZXZ0LW1uMTAzMDAuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJY2QtPnNldF9uZXh0X2V2ZW50CT0gbmV4dF9ldmVudDsKIAogCWlhY3QgPSAmcGVyX2NwdSh0aW1lcl9pcnEsIGNwdSk7Ci0JaWFjdC0+ZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQgfCBJUlFGX1RJTUVSOworCWlhY3QtPmZsYWdzID0gSVJRRl9TSEFSRUQgfCBJUlFGX1RJTUVSOwogCWlhY3QtPmhhbmRsZXIgPSB0aW1lcl9pbnRlcnJ1cHQ7CiAKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC5jCmluZGV4IGJmNmU5NDkuLjdlY2Y2OTggMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmMKQEAgLTk4NSwxNyArOTg1LDE3IEBACiAJaXJxX3NldF9jaGlwKHBvcnQtPnRtX2lycSwgJm1uMTAzMDBfc2VyaWFsX3BpYyk7CiAKIAlpZiAocmVxdWVzdF9pcnEocG9ydC0+cnhfaXJxLCBtbjEwMzAwX3NlcmlhbF9pbnRlcnJ1cHQsCi0JCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORywKKwkJCUlSUUZfTk9CQUxBTkNJTkcsCiAJCQlwb3J0LT5yeF9uYW1lLCBwb3J0KSA8IDApCiAJCWdvdG8gZXJyb3I7CiAKIAlpZiAocmVxdWVzdF9pcnEocG9ydC0+dHhfaXJxLCBtbjEwMzAwX3NlcmlhbF9pbnRlcnJ1cHQsCi0JCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORywKKwkJCUlSUUZfTk9CQUxBTkNJTkcsCiAJCQlwb3J0LT50eF9uYW1lLCBwb3J0KSA8IDApCiAJCWdvdG8gZXJyb3IyOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBvcnQtPnRtX2lycSwgbW4xMDMwMF9zZXJpYWxfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJCQlJUlFGX05PQkFMQU5DSU5HLAogCQkJcG9ydC0+dG1fbmFtZSwgcG9ydCkgPCAwKQogCQlnb3RvIGVycm9yMzsKIAltbjEwMzAwX3NlcmlhbF9tYXNrX2Fjayhwb3J0LT50bV9pcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtd2F0Y2hkb2cuYwppbmRleCBkYjY0YTcxLi5hMmQ4ZTY5IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtd2F0Y2hkb2cuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtd2F0Y2hkb2cuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJTk1JQ1IgPSBOTUlDUl9XRElGOwogCiAJbm1pX2NvdW50KHNtcF9wcm9jZXNzb3JfaWQoKSkrKzsKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBpcnFfdG9fZGVzYyhpcnEpKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwogCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9zbXAuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc21wLmMKaW5kZXggYTE3ZjljOS4uZjk4NDE5MyAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3NtcC5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzbXBfaXBpX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbG9jYWxfdGltZXJfaXBpID0gewogCS5oYW5kbGVyCT0gc21wX2lwaV90aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAorCS5mbGFncwkJPSBJUlFGX05PQkFMQU5DSU5HLAogCS5uYW1lCQk9ICJzbXAgbG9jYWwgdGltZXIgSVBJIgogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjM2NC9pcnEtZnBnYS5jIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjM2NC9pcnEtZnBnYS5jCmluZGV4IGUxNmMyMTYuLjA3M2UyY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzNjQvaXJxLWZwZ2EuYworKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzY0L2lycS1mcGdhLmMKQEAgLTc2LDcgKzc2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGZwZ2FfaXJxW10gID0gewogCVswXSA9IHsKIAkJLmhhbmRsZXIJPSBmcGdhX2ludGVycnVwdCwKLQkJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwkJLmZsYWdzCQk9IElSUUZfU0hBUkVELAogCQkubmFtZQkJPSAiZnBnYSIsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDJlNDBmMWMuLjQ4MGFmMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xMCw4ICsxMCw4IEBACiBnZW5lcmljLXkgKz0gY2FjaGVmbHVzaC5oCiBnZW5lcmljLXkgKz0gY2hlY2tzdW0uaAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCi1nZW5lcmljLXkgKz0gY21weGNoZy5oCiBnZW5lcmljLXkgKz0gY21weGNoZy1sb2NhbC5oCitnZW5lcmljLXkgKz0gY21weGNoZy5oCiBnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gY3VycmVudC5oCiBnZW5lcmljLXkgKz0gZGV2aWNlLmgKQEAgLTI1LDYgKzI1LDcgQEAKIGdlbmVyaWMteSArPSBmdHJhY2UuaAogZ2VuZXJpYy15ICs9IGZ1dGV4LmgKIGdlbmVyaWMteSArPSBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBoYXNoLmgKIGdlbmVyaWMteSArPSBod19pcnEuaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpb2N0bHMuaApAQCAtMzQsNiArMzUsNyBAQAogZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAogZ2VuZXJpYy15ICs9IGt2bV9wYXJhLmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBtbWFuLmgKIGdlbmVyaWMteSArPSBtb2R1bGUuaAogZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCkBAIC00MSw2ICs0Myw3IEBACiBnZW5lcmljLXkgKz0gcGVyY3B1LmgKIGdlbmVyaWMteSArPSBwb2xsLmgKIGdlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAogZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKIGdlbmVyaWMteSArPSBzZWN0aW9ucy5oCkBAIC01MywxMSArNTYsMTEgQEAKIGdlbmVyaWMteSArPSBzaWduYWwuaAogZ2VuZXJpYy15ICs9IHNvY2tldC5oCiBnZW5lcmljLXkgKz0gc29ja2lvcy5oCi1nZW5lcmljLXkgKz0gc3RhdGZzLmgKIGdlbmVyaWMteSArPSBzdGF0LmgKK2dlbmVyaWMteSArPSBzdGF0ZnMuaAogZ2VuZXJpYy15ICs9IHN0cmluZy5oCi1nZW5lcmljLXkgKz0gc3dpdGNoX3RvLmgKIGdlbmVyaWMteSArPSBzd2FiLmgKK2dlbmVyaWMteSArPSBzd2l0Y2hfdG8uaAogZ2VuZXJpYy15ICs9IHRlcm1iaXRzLmgKIGdlbmVyaWMteSArPSB0ZXJtaW9zLmgKIGdlbmVyaWMteSArPSB0b3BvbG9neS5oCkBAIC02OCw1ICs3MSwzIEBACiBnZW5lcmljLXkgKz0gdmdhLmgKIGdlbmVyaWMteSArPSB3b3JkLWF0LWEtdGltZS5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA3NTJjOTgxLi5lY2YyNWU2IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDkgKzEsMjkgQEAKIAorZ2VuZXJpYy15ICs9IGF1eHZlYy5oCiBnZW5lcmljLXkgKz0gYmFycmllci5oCi1nZW5lcmljLXkgKz0gd29yZC1hdC1hLXRpbWUuaCBhdXh2ZWMuaCB1c2VyLmggY3B1dGltZS5oIGVtZXJnZW5jeS1yZXN0YXJ0LmggXAotCSAgc2VnbWVudC5oIHRvcG9sb2d5LmggdmdhLmggZGV2aWNlLmggcGVyY3B1LmggaHdfaXJxLmggbXV0ZXguaCBcCi0JICBkaXY2NC5oIGlycV9yZWdzLmgga2RlYnVnLmgga3ZtX3BhcmEuaCBsb2NhbDY0LmggbG9jYWwuaCBwYXJhbS5oIFwKLQkgIHBvbGwuaCB4b3IuaCBjbGtkZXYuaCBleGVjLmgKLWdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCitnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKK2dlbmVyaWMteSArPSBkZXZpY2UuaAorZ2VuZXJpYy15ICs9IGRpdjY0LmgKK2dlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCitnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCitnZW5lcmljLXkgKz0gaHdfaXJxLmgKK2dlbmVyaWMteSArPSBpcnFfcmVncy5oCitnZW5lcmljLXkgKz0ga2RlYnVnLmgKK2dlbmVyaWMteSArPSBrdm1fcGFyYS5oCitnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCitnZW5lcmljLXkgKz0gbXV0ZXguaAorZ2VuZXJpYy15ICs9IHBhcmFtLmgKK2dlbmVyaWMteSArPSBwZXJjcHUuaAorZ2VuZXJpYy15ICs9IHBvbGwuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IHNlZ21lbnQuaAorZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKK2dlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCitnZW5lcmljLXkgKz0gdXNlci5oCitnZW5lcmljLXkgKz0gdmdhLmgKK2dlbmVyaWMteSArPSB3b3JkLWF0LWEtdGltZS5oCitnZW5lcmljLXkgKz0geG9yLmgKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCA2MzdmZTAzLi42MGQ1ZDE3IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0zMiwxNyArMzIsNiBAQAogdm9pZCBjb3B5X3VzZXJfcGFnZSh2b2lkICp2dG8sIHZvaWQgKnZmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyLAogCQkJc3RydWN0IHBhZ2UgKnBnKTsKIAotLyogI2RlZmluZSBDT05GSUdfUEFSSVNDX1RNUEFMSUFTICovCi0KLSNpZmRlZiBDT05GSUdfUEFSSVNDX1RNUEFMSUFTCi12b2lkIGNsZWFyX3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIpOwotI2RlZmluZSBjbGVhcl91c2VyX2hpZ2hwYWdlIGNsZWFyX3VzZXJfaGlnaHBhZ2UKLXN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKLXZvaWQgY29weV91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICp0bywgc3RydWN0IHBhZ2UgKmZyb20sCi0JdW5zaWduZWQgbG9uZyB2YWRkciwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotI2RlZmluZSBfX0hBVkVfQVJDSF9DT1BZX1VTRVJfSElHSFBBR0UKLSNlbmRpZgotCiAvKgogICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggMzUxNmUwYi4uNjRmMjk5MiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC0xOTEsOCArMTkxLDQgQEAKICNkZWZpbmUgYXJjaF9yZWFkX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfcmVhZF9sb2NrKGxvY2spCiAjZGVmaW5lIGFyY2hfd3JpdGVfbG9ja19mbGFncyhsb2NrLCBmbGFncykgYXJjaF93cml0ZV9sb2NrKGxvY2spCiAKLSNkZWZpbmUgYXJjaF9zcGluX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCi0jZGVmaW5lIGFyY2hfcmVhZF9yZWxheChsb2NrKQljcHVfcmVsYXgoKQotI2RlZmluZSBhcmNoX3dyaXRlX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCi0KICNlbmRpZiAvKiBfX0FTTV9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAppbmRleCA0MjcwNjc5Li4yNjVhZTUxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKQEAgLTgyOCwxMyArODI4LDEzIEBACiAjZGVmaW5lIF9fTlJfZmluaXRfbW9kdWxlCShfX05SX0xpbnV4ICsgMzMzKQogI2RlZmluZSBfX05SX3NjaGVkX3NldGF0dHIJKF9fTlJfTGludXggKyAzMzQpCiAjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YXR0cgkoX19OUl9MaW51eCArIDMzNSkKKyNkZWZpbmUgX19OUl91dGltZXMJCShfX05SX0xpbnV4ICsgMzM2KQogCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJKF9fTlJfc2NoZWRfZ2V0YXR0ciArIDEpCisjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJKF9fTlJfdXRpbWVzICsgMSkKIAogCiAjZGVmaW5lIF9fSUdOT1JFX3NlbGVjdAkJLyogbmV3c2VsZWN0ICovCiAjZGVmaW5lIF9fSUdOT1JFX2ZhZHZpc2U2NAkvKiBmYWR2aXNlNjRfNjQgKi8KLSNkZWZpbmUgX19JR05PUkVfdXRpbWVzCQkvKiB1dGltZSAqLwogCiAKICNkZWZpbmUgSFBVWF9HQVRFV0FZX0FERFIgICAgICAgMHhDMDAwMDAwNApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYwppbmRleCBhYzg3YTQwLi5hNmZmYzc3IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYwpAQCAtNTgxLDY3ICs1ODEsMyBAQAogCQlfX2ZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIFBGTl9QSFlTKHBmbikpOwogCX0KIH0KLQotI2lmZGVmIENPTkZJR19QQVJJU0NfVE1QQUxJQVMKLQotdm9pZCBjbGVhcl91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyKQotewotCXZvaWQgKnZ0bzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogQ2xlYXIgdXNpbmcgVE1QQUxJQVMgcmVnaW9uLiAgVGhlIHBhZ2UgZG9lc24ndCBuZWVkIHRvCi0JICAgYmUgZmx1c2hlZCBidXQgdGhlIGtlcm5lbCBtYXBwaW5nIG5lZWRzIHRvIGJlIHB1cmdlZC4gICovCi0KLQl2dG8gPSBrbWFwX2F0b21pYyhwYWdlKTsKLQotCS8qIFRoZSBQQS1SSVNDIDIuMCBBcmNoaXRlY3R1cmUgYm9vayBzdGF0ZXMgb24gcGFnZSBGLTY6Ci0JICAgIkJlZm9yZSBhIHdyaXRlLWNhcGFibGUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCwgKmFsbCoKLQkgICBub24tZXF1aXZhbGVudGx5LWFsaWFzZWQgdHJhbnNsYXRpb25zIG11c3QgYmUgcmVtb3ZlZAotCSAgIGZyb20gdGhlIHBhZ2UgdGFibGUgYW5kIHB1cmdlZCBmcm9tIHRoZSBUTEIuICAoTm90ZQotCSAgIHRoYXQgdGhlIGNhY2hlcyBhcmUgbm90IHJlcXVpcmVkIHRvIGJlIGZsdXNoZWQgYXQgdGhpcwotCSAgIHRpbWUuKSAgQmVmb3JlIGFueSBub24tZXF1aXZhbGVudCBhbGlhc2VkIHRyYW5zbGF0aW9uCi0JICAgaXMgcmUtZW5hYmxlZCwgdGhlIHZpcnR1YWwgYWRkcmVzcyByYW5nZSBmb3IgdGhlIHdyaXRlYWJsZQotCSAgIHBhZ2UgKHRoZSBlbnRpcmUgcGFnZSkgbXVzdCBiZSBmbHVzaGVkIGZyb20gdGhlIGNhY2hlLAotCSAgIGFuZCB0aGUgd3JpdGUtY2FwYWJsZSB0cmFuc2xhdGlvbiByZW1vdmVkIGZyb20gdGhlIHBhZ2UKLQkgICB0YWJsZSBhbmQgcHVyZ2VkIGZyb20gdGhlIFRMQi4iICAqLwotCi0JcHVyZ2Vfa2VybmVsX2RjYWNoZV9wYWdlX2FzbSgodW5zaWduZWQgbG9uZyl2dG8pOwotCXB1cmdlX3RsYl9zdGFydChmbGFncyk7Ci0JcGR0bGJfa2VybmVsKHZ0byk7Ci0JcHVyZ2VfdGxiX2VuZChmbGFncyk7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JY2xlYXJfdXNlcl9wYWdlX2FzbSh2dG8sIHZhZGRyKTsKLQlwcmVlbXB0X2VuYWJsZSgpOwotCi0JcGFnZWZhdWx0X2VuYWJsZSgpOwkJLyoga3VubWFwX2F0b21pYyhhZGRyLCBLTV9VU0VSMCk7ICovCi19Ci0KLXZvaWQgY29weV91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICp0bywgc3RydWN0IHBhZ2UgKmZyb20sCi0JdW5zaWduZWQgbG9uZyB2YWRkciwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jdm9pZCAqdmZyb20sICp2dG87Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIENvcHkgdXNpbmcgVE1QQUxJQVMgcmVnaW9uLiAgVGhpcyBoYXMgdGhlIGFkdmFudGFnZQotCSAgIHRoYXQgdGhlIGBmcm9tJyBwYWdlIGRvZXNuJ3QgbmVlZCB0byBiZSBmbHVzaGVkLiAgSG93ZXZlciwKLQkgICB0aGUgYHRvJyBwYWdlIG11c3QgYmUgZmx1c2hlZCBpbiBjb3B5X3VzZXJfcGFnZV9hc20gc2luY2UKLQkgICBpdCBjYW4gYmUgdXNlZCB0byBicmluZyBpbiBleGVjdXRhYmxlIGNvZGUuICAqLwotCi0JdmZyb20gPSBrbWFwX2F0b21pYyhmcm9tKTsKLQl2dG8gPSBrbWFwX2F0b21pYyh0byk7Ci0KLQlwdXJnZV9rZXJuZWxfZGNhY2hlX3BhZ2VfYXNtKCh1bnNpZ25lZCBsb25nKXZ0byk7Ci0JcHVyZ2VfdGxiX3N0YXJ0KGZsYWdzKTsKLQlwZHRsYl9rZXJuZWwodnRvKTsKLQlwZHRsYl9rZXJuZWwodmZyb20pOwotCXB1cmdlX3RsYl9lbmQoZmxhZ3MpOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCWNvcHlfdXNlcl9wYWdlX2FzbSh2dG8sIHZmcm9tLCB2YWRkcik7Ci0JZmx1c2hfZGNhY2hlX3BhZ2VfYXNtKF9fcGEodnRvKSwgdmFkZHIpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0KLQlwYWdlZmF1bHRfZW5hYmxlKCk7CQkvKiBrdW5tYXBfYXRvbWljKGFkZHIsIEtNX1VTRVIxKTsgKi8KLQlwYWdlZmF1bHRfZW5hYmxlKCk7CQkvKiBrdW5tYXBfYXRvbWljKGFkZHIsIEtNX1VTRVIwKTsgKi8KLX0KLQotI2VuZGlmIC8qIENPTkZJR19QQVJJU0NfVE1QQUxJQVMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYwppbmRleCA4Y2VhYzQ3Li5jZmUwNTZmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiB3aGF0ZXZlciBtYXNrIHRoZXkgc2V0LCB3ZSBqdXN0IGFsbG93IG9uZSBDUFUgKi8KLQljcHVfZGVzdCA9IGZpcnN0X2NwdSgqZGVzdCk7CisJY3B1X2Rlc3QgPSBjcHVtYXNrX2ZpcnN0X2FuZChkZXN0LCBjcHVfb25saW5lX21hc2spOwogCiAJcmV0dXJuIGNwdV9kZXN0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggOGZhM2ZiYi4uODBlNWRkMiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC00MzEsNiArNDMxLDcgQEAKIAlFTlRSWV9TQU1FKGZpbml0X21vZHVsZSkKIAlFTlRSWV9TQU1FKHNjaGVkX3NldGF0dHIpCiAJRU5UUllfU0FNRShzY2hlZF9nZXRhdHRyKQkvKiAzMzUgKi8KKwlFTlRSWV9DT01QKHV0aW1lcykKIAogCS8qIE5vdGhpbmcgeWV0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggOTU3YmYzNC4uZjNkNzg0NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTEzMCw2ICsxMzAsOCBAQAogCXNlbGVjdCBHRU5FUklDX0NNT1NfVVBEQVRFCiAJc2VsZWN0IEdFTkVSSUNfVElNRV9WU1lTQ0FMTF9PTEQKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUworCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCBpZiBTTVAKKwlzZWxlY3QgQVJDSF9IQVNfVElDS19CUk9BRENBU1QgaWYgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKIAlzZWxlY3QgR0VORVJJQ19TVFJOQ1BZX0ZST01fVVNFUgogCXNlbGVjdCBHRU5FUklDX1NUUk5MRU5fVVNFUgogCXNlbGVjdCBIQVZFX01PRF9BUkNIX1NQRUNJRklDCkBAIC02MTgsNiArNjIwLDE1IEBACiAJICBzb21lIGNvbW1hbmQtbGluZSBvcHRpb25zIGF0IGJ1aWxkIHRpbWUgYnkgZW50ZXJpbmcgdGhlbSBoZXJlLiAgSW4KIAkgIG1vc3QgY2FzZXMgeW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHRoZSByb290IGRldmljZSBoZXJlLgogCitjb25maWcgQ01ETElORV9GT1JDRQorCWJvb2wgIkFsd2F5cyB1c2UgdGhlIGRlZmF1bHQga2VybmVsIGNvbW1hbmQgc3RyaW5nIgorCWRlcGVuZHMgb24gQ01ETElORV9CT09MCisJaGVscAorCSAgQWx3YXlzIHVzZSB0aGUgZGVmYXVsdCBrZXJuZWwgY29tbWFuZCBzdHJpbmcsIGV2ZW4gaWYgdGhlIGJvb3QKKwkgIGxvYWRlciBwYXNzZXMgb3RoZXIgYXJndW1lbnRzIHRvIHRoZSBrZXJuZWwuCisJICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgY2Fubm90IG9yIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZQorCSAgY29tbWFuZC1saW5lIG9wdGlvbnMgeW91ciBib290IGxvYWRlciBwYXNzZXMgdG8gdGhlIGtlcm5lbC4KKwogY29uZmlnIEVYVFJBX1RBUkdFVFMKIAlzdHJpbmcgIkFkZGl0aW9uYWwgZGVmYXVsdCBpbWFnZSB0eXBlcyIKIAloZWxwCkBAIC03MzYsMTAgKzc0Nyw2IEBACiAJICBjb250cm9sbGVyLiAgQWxzbyBjb250YWlucyBzb21lIGNvbW1vbiBjb2RlIHVzZWQgYnkKIAkgIGRyaXZlcnMgZm9yIHNwZWNpZmljIGxvY2FsIGJ1cyBwZXJpcGhlcmFscy4KIAotY29uZmlnIEZTTF9JRkMKLQlib29sCi0gICAgICAgIGRlcGVuZHMgb24gRlNMX1NPQwotCiBjb25maWcgRlNMX0dUTQogCWJvb2wKIAlkZXBlbmRzIG9uIFBQQ184M3h4IHx8IFFVSUNDX0VOR0lORSB8fCBDUE0yCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IDkwZTlkOTUuLmExZjhjN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC01NCw3ICs1NCw3IEBACiB6bGliaGVhZGVyIDo9IGluZmZhc3QuaCBpbmZmaXhlZC5oIGluZmxhdGUuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAogemxpYmxpbnV4aGVhZGVyIDo9IHpsaWIuaCB6Y29uZi5oIHp1dGlsLmgKIAotJChhZGRwcmVmaXggJChvYmopLywkKHpsaWIpIGN1Ym9vdC1jMmsubyBndW56aXBfdXRpbC5vIG1haW4ubyBwcnBtYzI4MDAubyk6IFwKKyQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSBjdWJvb3QtYzJrLm8gZ3VuemlwX3V0aWwubyBtYWluLm8pOiBcCiAJJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJsaW51eGhlYWRlcikpICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliaGVhZGVyKSkKIAogbGliZmR0ICAgICAgIDo9IGZkdC5jIGZkdF9yby5jIGZkdF93aXAuYyBmZHRfc3cuYyBmZHRfcncuYyBmZHRfc3RyZXJyb3IuYwpAQCAtOTUsNyArOTUsNyBAQAogc3JjLXBsYXQtJChDT05GSUdfRU1CRURERUQ2eHgpICs9IGN1Ym9vdC1wcTIuYyBjdWJvb3QtbXBjNzQ0OGhwYzIuYyBcCiAJCQkJCWN1Ym9vdC1jMmsuYyBnYW1lY3ViZS1oZWFkLlMgXAogCQkJCQlnYW1lY3ViZS5jIHdpaS1oZWFkLlMgd2lpLmMgaG9sbHkuYyBcCi0JCQkJCXBycG1jMjgwMC5jIGZpeGVkLWhlYWQuUyBtdm1lNTEwMC5jCisJCQkJCWZpeGVkLWhlYWQuUyBtdm1lNTEwMC5jCiBzcmMtcGxhdC0kKENPTkZJR19BTUlHQU9ORSkgKz0gY3Vib290LWFtaWdhb25lLmMKIHNyYy1wbGF0LSQoQ09ORklHX1BQQ19QUzMpICs9IHBzMy1oZWFkLlMgcHMzLWh2Y2FsbC5TIHBzMy5jCiBzcmMtcGxhdC0kKENPTkZJR19FUEFQUl9CT09UKSArPSBlcGFwci5jIGVwYXByLXdyYXBwZXIuYwpAQCAtMjA0LDcgKzIwNCw2IEBACiBpbWFnZS0kKENPTkZJR19QUENfRUZJS0EpCQkrPSB6SW1hZ2UuY2hycAogaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpCQkrPSB6SW1hZ2UucG1hYwogaW1hZ2UtJChDT05GSUdfUFBDX0hPTExZKQkJKz0gZHRiSW1hZ2UuaG9sbHkKLWltYWdlLSQoQ09ORklHX1BQQ19QUlBNQzI4MDApCQkrPSBkdGJJbWFnZS5wcnBtYzI4MDAKIGltYWdlLSQoQ09ORklHX0RFRkFVTFRfVUlNQUdFKQkJKz0gdUltYWdlCiBpbWFnZS0kKENPTkZJR19FUEFQUl9CT09UKQkJKz0gekltYWdlLmVwYXByCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ0MjBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0NDIwc2ktcG9zdC5kdHNpCmluZGV4IDVhNjYxNWQuLjYwNTY2Zjk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0NDIwc2ktcG9zdC5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ0MjBzaS1wb3N0LmR0c2kKQEAgLTg2LDYgKzg2LDQyIEBACiAKIAljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGI0NDIwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0yLjAiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTEwMDAgMHgxMDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCisJCXN5c2Nsazogc3lzY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXN5c2Nsay0yLjAiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInN5c2NsayI7CisJCX07CisKKwkJcGxsMDogcGxsMEA4MDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODAwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDAtZGl2NCI7CisJCX07CisKKwkJcGxsMTogcGxsMUA4MjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDEiLCAicGxsMS1kaXYyIiwgInBsbDEtZGl2NCI7CisJCX07CisKKwkJbXV4MDogbXV4MEAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTIuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwwIDI+LAorCQkJCTwmcGxsMSAwPiwgPCZwbGwxIDE+LCA8JnBsbDEgMj47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwwLWRpdjQiLAorCQkJCSJwbGwxIiwgInBsbDEtZGl2MiIsICJwbGwxLWRpdjQiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgwIjsKKwkJfTsKIAl9OwogCiAJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0NDIwc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0NDIwc2ktcHJlLmR0c2kKaW5kZXggYzZlNDUxYS4uMjQxOTczMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDQyMHNpLXByZS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ0MjBzaS1wcmUuZHRzaQpAQCAtNjQsMTEgKzY0LDEzIEBACiAJCWNwdTA6IFBvd2VyUEMsZTY1MDBAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDAgMT47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwogCQl9OwogCQljcHUxOiBQb3dlclBDLGU2NTAwQDIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyIDM+OworCQkJY2xvY2tzID0gPCZtdXgwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDg2MHNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ4NjBzaS1wb3N0LmR0c2kKaW5kZXggOTgxMzk3NS4uY2JjMzU0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDg2MHNpLXBvc3QuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0ODYwc2ktcG9zdC5kdHNpCkBAIC0xMzAsNiArMTMwLDQyIEBACiAKIAljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLGI0ODYwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0yLjAiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTEwMDAgMHgxMDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCisJCXN5c2Nsazogc3lzY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXN5c2Nsay0yLjAiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInN5c2NsayI7CisJCX07CisKKwkJcGxsMDogcGxsMEA4MDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODAwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDAtZGl2NCI7CisJCX07CisKKwkJcGxsMTogcGxsMUA4MjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0yLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDEiLCAicGxsMS1kaXYyIiwgInBsbDEtZGl2NCI7CisJCX07CisKKwkJbXV4MDogbXV4MEAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTIuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwwIDI+LAorCQkJCTwmcGxsMSAwPiwgPCZwbGwxIDE+LCA8JnBsbDEgMj47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwwLWRpdjQiLAorCQkJCSJwbGwxIiwgInBsbDEtZGl2MiIsICJwbGwxLWRpdjQiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgwIjsKKwkJfTsKIAl9OwogCiAJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0ODYwc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL2I0ODYwc2ktcHJlLmR0c2kKaW5kZXggOWJjMjZiMS4uMTQyYWM4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9iNDg2MHNpLXByZS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvYjQ4NjBzaS1wcmUuZHRzaQpAQCAtNjQsMjEgKzY0LDI1IEBACiAJCWNwdTA6IFBvd2VyUEMsZTY1MDBAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDAgMT47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwogCQl9OwogCQljcHUxOiBQb3dlclBDLGU2NTAwQDIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyIDM+OworCQkJY2xvY2tzID0gPCZtdXgwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKIAkJfTsKIAkJY3B1MjogUG93ZXJQQyxlNjUwMEA0IHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8NCA1PjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CiAJCX07CiAJCWNwdTM6IFBvd2VyUEMsZTY1MDBANiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDYgNz47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXBvc3QuZHRzaQppbmRleCBkYzZjYzVhLi5lMjk4N2EzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcG9zdC5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDIwNDFzaS1wb3N0LmR0c2kKQEAgLTMwNiw4ICszMDYsNjggQEAKIAogCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCXJhbmdlcyA9IDwweDAgMHhlMTAwMCAweDEwMDA+OwogCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlzeXNjbGs6IHN5c2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1zeXNjbGstMS4wIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOworCQl9OworCisJCXBsbDA6IHBsbDBAODAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgwMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiI7CisJCX07CisKKwkJcGxsMTogcGxsMUA4MjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJfTsKKworCQltdXgwOiBtdXgwQDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7CisJCX07CisKKwkJbXV4MTogbXV4MUAyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MSI7CisJCX07CisKKwkJbXV4MjogbXV4MkA0MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg0MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJfTsKKworCQltdXgzOiBtdXgzQDYwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDYwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgzIjsKKwkJfTsKIAl9OwogCiAJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcHJlLmR0c2kKaW5kZXggN2EyNjk3ZC4uMjJmM2IxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXByZS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDIwNDFzaS1wcmUuZHRzaQpAQCAtODEsNiArODEsNyBAQAogCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CiAJCQlMMl8wOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTg5LDYgKzkwLDcgQEAKIAkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDE+OworCQkJY2xvY2tzID0gPCZtdXgxPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OwogCQkJTDJfMTogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC05Nyw2ICs5OSw3IEBACiAJCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJCUwyXzI6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTA1LDYgKzEwOCw3IEBACiAJCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwzPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mz47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKIAkJCUwyXzM6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wb3N0LmR0c2kKaW5kZXggM2ZhMWUyMi4uN2FmNmQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXBvc3QuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDQxc2ktcG9zdC5kdHNpCkBAIC0zMzMsOCArMzMzLDY5IEBACiAKIAljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQlyYW5nZXMgPSA8MHgwIDB4ZTEwMDAgMHgxMDAwPjsKIAkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJc3lzY2xrOiBzeXNjbGsgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtc3lzY2xrLTEuMCI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic3lzY2xrIjsKKwkJfTsKKworCQlwbGwwOiBwbGwwQDgwMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiOworCQl9OworCisJCXBsbDE6IHBsbDFAODIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCX07CisKKwkJbXV4MDogbXV4MEAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDAiOworCQl9OworCisJCW11eDE6IG11eDFAMjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDEiOworCQl9OworCisJCW11eDI6IG11eDJANDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4NDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDIiOworCQl9OworCisJCW11eDM6IG11eDNANjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4NjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7CisJCQljbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxIDA+LCA8JnBsbDEgMT47CisJCQljbG9jay1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiIsICJwbGwxIiwgInBsbDEtZGl2MiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDMiOworCQl9OwogCX07CiAKIAlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wcmUuZHRzaQppbmRleCBjOWNhMmMzLi40NjhlOGJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDQxc2ktcHJlLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXByZS5kdHNpCkBAIC04Miw2ICs4Miw3IEBACiAJCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwPjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKIAkJCUwyXzA6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtOTAsNiArOTEsNyBAQAogCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MT47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCQlMMl8xOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTk4LDYgKzEwMCw3IEBACiAJCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJCUwyXzI6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTA2LDYgKzEwOSw3IEBACiAJCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwzPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mz47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKIAkJCUwyXzM6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wb3N0LmR0c2kKaW5kZXggMzQ3NjlhNy4uMjQxNWUxZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXBvc3QuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A0MDgwc2ktcG9zdC5kdHNpCkBAIC0zNTMsOCArMzUzLDEyMSBAQAogCiAJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKKwkJcmFuZ2VzID0gPDB4MCAweGUxMDAwIDB4MTAwMD47CiAJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCisJCXN5c2Nsazogc3lzY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXN5c2Nsay0xLjAiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInN5c2NsayI7CisJCX07CisKKwkJcGxsMDogcGxsMEA4MDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODAwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIjsKKwkJfTsKKworCQlwbGwxOiBwbGwxQDgyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMSIsICJwbGwxLWRpdjIiOworCQl9OworCisJCXBsbDI6IHBsbDJAODQwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDg0MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwyIiwgInBsbDItZGl2MiI7CisJCX07CisKKwkJcGxsMzogcGxsM0A4NjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODYwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDMiLCAicGxsMy1kaXYyIjsKKwkJfTsKKworCQltdXgwOiBtdXgwQDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7CisJCX07CisKKwkJbXV4MTogbXV4MUAyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MSI7CisJCX07CisKKwkJbXV4MjogbXV4MkA0MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg0MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MiI7CisJCX07CisKKwkJbXV4MzogbXV4M0A2MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg2MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MyI7CisJCX07CisKKwkJbXV4NDogbXV4NEA4MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg4MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMiAwPiwgPCZwbGwyIDE+LCA8JnBsbDMgMD4sIDwmcGxsMyAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDIiLCAicGxsMi1kaXYyIiwgInBsbDMiLCAicGxsMy1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4NCI7CisJCX07CisKKwkJbXV4NTogbXV4NUBhMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHhhMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMiAwPiwgPCZwbGwyIDE+LCA8JnBsbDMgMD4sIDwmcGxsMyAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDIiLCAicGxsMi1kaXYyIiwgInBsbDMiLCAicGxsMy1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4NSI7CisJCX07CisKKwkJbXV4NjogbXV4NkBjMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHhjMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMiAwPiwgPCZwbGwyIDE+LCA8JnBsbDMgMD4sIDwmcGxsMyAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDIiLCAicGxsMi1kaXYyIiwgInBsbDMiLCAicGxsMy1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4NiI7CisJCX07CisKKwkJbXV4NzogbXV4N0BlMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHhlMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMiAwPiwgPCZwbGwyIDE+LCA8JnBsbDMgMD4sIDwmcGxsMyAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDIiLCAicGxsMi1kaXYyIiwgInBsbDMiLCAicGxsMy1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4NyI7CisJCX07CiAJfTsKIAogCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXByZS5kdHNpCmluZGV4IDQ5M2Q5YTAuLjAwNDBiNWE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A0MDgwc2ktcHJlLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXByZS5kdHNpCkBAIC04MSw2ICs4MSw3IEBACiAJCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwPjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKIAkJCUwyXzA6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtODksNiArOTAsNyBAQAogCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MT47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCQlMMl8xOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTk3LDYgKzk5LDcgQEAKIAkJY3B1MjogUG93ZXJQQyxlNTAwbWNAMiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDI+OworCQkJY2xvY2tzID0gPCZtdXgyPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OwogCQkJTDJfMjogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC0xMDUsNiArMTA4LDcgQEAKIAkJY3B1MzogUG93ZXJQQyxlNTAwbWNAMyB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDM+OworCQkJY2xvY2tzID0gPCZtdXgzPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OwogCQkJTDJfMzogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC0xMTMsNiArMTE3LDcgQEAKIAkJY3B1NDogUG93ZXJQQyxlNTAwbWNANCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDQ+OworCQkJY2xvY2tzID0gPCZtdXg0PjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzQ+OwogCQkJTDJfNDogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC0xMjEsNiArMTI2LDcgQEAKIAkJY3B1NTogUG93ZXJQQyxlNTAwbWNANSB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDU+OworCQkJY2xvY2tzID0gPCZtdXg1PjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzU+OwogCQkJTDJfNTogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC0xMjksNiArMTM1LDcgQEAKIAkJY3B1NjogUG93ZXJQQyxlNTAwbWNANiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDY+OworCQkJY2xvY2tzID0gPCZtdXg2PjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzY+OwogCQkJTDJfNjogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CkBAIC0xMzcsNiArMTQ0LDcgQEAKIAkJY3B1NzogUG93ZXJQQyxlNTAwbWNANyB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDc+OworCQkJY2xvY2tzID0gPCZtdXg3PjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzc+OwogCQkJTDJfNzogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDIwc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTAyMHNpLXBvc3QuZHRzaQppbmRleCBiYzNhZTVhLi4yOTg1ZGU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDIwc2ktcG9zdC5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wb3N0LmR0c2kKQEAgLTMzOCw4ICszMzgsNTEgQEAKIAogCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCXJhbmdlcyA9IDwweDAgMHhlMTAwMCAweDEwMDA+OwogCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlzeXNjbGs6IHN5c2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1zeXNjbGstMS4wIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOworCQl9OworCisJCXBsbDA6IHBsbDBAODAwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDgwMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1wbGwtMS4wIjsKKwkJCWNsb2NrcyA9IDwmc3lzY2xrPjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJwbGwwIiwgInBsbDAtZGl2MiI7CisJCX07CisKKwkJcGxsMTogcGxsMUA4MjAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJfTsKKworCQltdXgwOiBtdXgwQDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7CisJCX07CisKKwkJbXV4MTogbXV4MUAyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMS4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDEgMD4sIDwmcGxsMSAxPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIiwgInBsbDEiLCAicGxsMS1kaXYyIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MSI7CisJCX07CiAJfTsKIAogCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTAyMHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTAyMHNpLXByZS5kdHNpCmluZGV4IDhkZjQ3ZmMuLmZlMWEyZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wcmUuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDIwc2ktcHJlLmR0c2kKQEAgLTg4LDYgKzg4LDcgQEAKIAkJY3B1MDogUG93ZXJQQyxlNTUwMEAwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47CisJCQljbG9ja3MgPSA8Jm11eDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CiAJCQlMMl8wOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKQEAgLTk2LDYgKzk3LDcgQEAKIAkJY3B1MTogUG93ZXJQQyxlNTUwMEAxIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MT47CisJCQljbG9ja3MgPSA8Jm11eDE+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CiAJCQlMMl8xOiBsMi1jYWNoZSB7CiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwNDBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDQwc2ktcG9zdC5kdHNpCmluZGV4IGE5MTg5N2YuLjU0NmE4OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwNDBzaS1wb3N0LmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTA0MHNpLXBvc3QuZHRzaQpAQCAtMjk4LDggKzI5OCw2OSBAQAogCiAJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxwNTA0MC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKKwkJcmFuZ2VzID0gPDB4MCAweGUxMDAwIDB4MTAwMD47CiAJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCisJCXN5c2Nsazogc3lzY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXN5c2Nsay0xLjAiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInN5c2NsayI7CisJCX07CisKKwkJcGxsMDogcGxsMEA4MDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4ODAwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOworCQkJY2xvY2tzID0gPCZzeXNjbGs+OworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBsbDAiLCAicGxsMC1kaXYyIjsKKwkJfTsKKworCQlwbGwxOiBwbGwxQDgyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMSIsICJwbGwxLWRpdjIiOworCQl9OworCisJCW11eDA6IG11eDBAMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgwIjsKKwkJfTsKKworCQltdXgxOiBtdXgxQDIwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDIwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgxIjsKKwkJfTsKKworCQltdXgyOiBtdXgyQDQwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDQwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgyIjsKKwkJfTsKKworCQltdXgzOiBtdXgzQDYwIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwweDYwIDB4ND47CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOworCQkJY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxsMSAwPiwgPCZwbGwxIDE+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMSIsICJwbGwxLWRpdjIiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNtdXgzIjsKKwkJfTsKIAl9OwogCiAJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDQwc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDQwc2ktcHJlLmR0c2kKaW5kZXggNDBjYTk0My4uMzY3NDY4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTA0MHNpLXByZS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwNDBzaS1wcmUuZHRzaQpAQCAtODEsNiArODEsNyBAQAogCQljcHUwOiBQb3dlclBDLGU1NTAwQDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwPjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKIAkJCUwyXzA6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtODksNiArOTAsNyBAQAogCQljcHUxOiBQb3dlclBDLGU1NTAwQDEgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxPjsKKwkJCWNsb2NrcyA9IDwmbXV4MT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKIAkJCUwyXzE6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtOTcsNiArOTksNyBAQAogCQljcHUyOiBQb3dlclBDLGU1NTAwQDIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyPjsKKwkJCWNsb2NrcyA9IDwmbXV4Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJCUwyXzI6IGwyLWNhY2hlIHsKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwpAQCAtMTA1LDYgKzEwOCw3IEBACiAJCWNwdTM6IFBvd2VyUEMsZTU1MDBAMyB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDM+OworCQkJY2xvY2tzID0gPCZtdXgzPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OwogCQkJTDJfMzogbDItY2FjaGUgewogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3Q0MjQwc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC90NDI0MHNpLXBvc3QuZHRzaQppbmRleCA0MTQzYTk3Li5mOTlkNzRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3Q0MjQwc2ktcG9zdC5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvdDQyNDBzaS1wb3N0LmR0c2kKQEAgLTM2OSw3ICszNjksOTMgQEAKIAogCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsdDQyNDAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTIuMCI7CisJCXJhbmdlcyA9IDwweDAgMHhlMTAwMCAweDEwMDA+OwogCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJc3lzY2xrOiBzeXNjbGsgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtc3lzY2xrLTIuMCI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic3lzY2xrIjsKKwkJfTsKKworCQlwbGwwOiBwbGwwQDgwMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTIuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMC1kaXY0IjsKKwkJfTsKKworCQlwbGwxOiBwbGwxQDgyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTIuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMSIsICJwbGwxLWRpdjIiLCAicGxsMS1kaXY0IjsKKwkJfTsKKworCQlwbGwyOiBwbGwyQDg0MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4NDAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTIuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMiIsICJwbGwyLWRpdjIiLCAicGxsMi1kaXY0IjsKKwkJfTsKKworCQlwbGwzOiBwbGwzQDg2MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4NjAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTIuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMyIsICJwbGwzLWRpdjIiLCAicGxsMy1kaXY0IjsKKwkJfTsKKworCQlwbGw0OiBwbGw0QDg4MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4ODAgMHg0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTIuMCI7CisJCQljbG9ja3MgPSA8JnN5c2Nsaz47CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsNCIsICJwbGw0LWRpdjIiLCAicGxsNC1kaXY0IjsKKwkJfTsKKworCQltdXgwOiBtdXgwQDAgeworCQkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMi4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDAgMj4sCisJCQkJPCZwbGwxIDA+LCA8JnBsbDEgMT4sIDwmcGxsMSAyPiwKKwkJCQk8JnBsbDIgMD4sIDwmcGxsMiAxPiwgPCZwbGwyIDI+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMC1kaXY0IiwKKwkJCQkicGxsMSIsICJwbGwxLWRpdjIiLCAicGxsMS1kaXY0IiwKKwkJCQkicGxsMiIsICJwbGwyLWRpdjIiLCAicGxsMi1kaXY0IjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7CisJCX07CisKKwkJbXV4MTogbXV4MUAyMCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHgyMCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMi4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMCAwPiwgPCZwbGwwIDE+LCA8JnBsbDAgMj4sCisJCQkJPCZwbGwxIDA+LCA8JnBsbDEgMT4sIDwmcGxsMSAyPiwKKwkJCQk8JnBsbDIgMD4sIDwmcGxsMiAxPiwgPCZwbGwyIDI+OworCQkJY2xvY2stbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiLCAicGxsMC1kaXY0IiwKKwkJCQkicGxsMSIsICJwbGwxLWRpdjIiLCAicGxsMS1kaXY0IiwKKwkJCQkicGxsMiIsICJwbGwyLWRpdjIiLCAicGxsMi1kaXY0IjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MSI7CisJCX07CisKKwkJbXV4MjogbXV4MkA0MCB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQlyZWcgPSA8MHg0MCAweDQ+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29yZS1tdXgtMi4wIjsKKwkJCWNsb2NrcyA9IDwmcGxsMyAwPiwgPCZwbGwzIDE+LCA8JnBsbDMgMj4sCisJCQkJPCZwbGw0IDA+LCA8JnBsbDQgMT4sIDwmcGxsNCAyPjsKKwkJCWNsb2NrLW5hbWVzID0gInBsbDMiLCAicGxsMy1kaXYyIiwgInBsbDMtZGl2NCIsCisJCQkJInBsbDQiLCAicGxsNC1kaXYyIiwgInBsbDQtZGl2NCI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY211eDIiOworCQl9OwogCX07CiAKIAlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvdDQyNDBzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvdDQyNDBzaS1wcmUuZHRzaQppbmRleCBhOTNjNTVhLi4wYjhjY2M1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3Q0MjQwc2ktcHJlLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC90NDI0MHNpLXByZS5kdHNpCkBAIC02Nyw2MSArNjcsNzMgQEAKIAkJY3B1MDogUG93ZXJQQyxlNjUwMEAwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MCAxPjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKIAkJfTsKIAkJY3B1MTogUG93ZXJQQyxlNjUwMEAyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MiAzPjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKIAkJfTsKIAkJY3B1MjogUG93ZXJQQyxlNjUwMEA0IHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8NCA1PjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKIAkJfTsKIAkJY3B1MzogUG93ZXJQQyxlNjUwMEA2IHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8NiA3PjsKKwkJCWNsb2NrcyA9IDwmbXV4MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKIAkJfTsKIAkJY3B1NDogUG93ZXJQQyxlNjUwMEA4IHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8OCA5PjsKKwkJCWNsb2NrcyA9IDwmbXV4MT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJfTsKIAkJY3B1NTogUG93ZXJQQyxlNjUwMEAxMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDEwIDExPjsKKwkJCWNsb2NrcyA9IDwmbXV4MT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJfTsKIAkJY3B1NjogUG93ZXJQQyxlNjUwMEAxMiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDEyIDEzPjsKKwkJCWNsb2NrcyA9IDwmbXV4MT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJfTsKIAkJY3B1NzogUG93ZXJQQyxlNjUwMEAxNCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDE0IDE1PjsKKwkJCWNsb2NrcyA9IDwmbXV4MT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKIAkJfTsKIAkJY3B1ODogUG93ZXJQQyxlNjUwMEAxNiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDE2IDE3PjsKKwkJCWNsb2NrcyA9IDwmbXV4Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKIAkJfTsKIAkJY3B1OTogUG93ZXJQQyxlNjUwMEAxOCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDE4IDE5PjsKKwkJCWNsb2NrcyA9IDwmbXV4Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKIAkJfTsKIAkJY3B1MTA6IFBvd2VyUEMsZTY1MDBAMjAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyMCAyMT47CisJCQljbG9ja3MgPSA8Jm11eDI+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CiAJCX07CiAJCWNwdTExOiBQb3dlclBDLGU2NTAwQDIyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MjIgMjM+OworCQkJY2xvY2tzID0gPCZtdXgyPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdDQyNDBxZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3Q0MjQwcWRzLmR0cwppbmRleCA2M2U4MWIwLi45NzY4M2Y2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdDQyNDBxZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90NDI0MHFkcy5kdHMKQEAgLTE1OSw2ICsxNTksNDggQEAKIAkJCQkJCWludGVycnVwdHMgPSA8MHgxIDB4MSAwIDA+OwogCQkJCQl9OwogCQkJCX07CisKKwkJCQlpMmNAMiB7CisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJcmVnID0gPDB4Mj47CisKKwkJCQkJaW5hMjIwQDQwIHsKKwkJCQkJCWNvbXBhdGlibGUgPSAidGksaW5hMjIwIjsKKwkJCQkJCXJlZyA9IDwweDQwPjsKKwkJCQkJCXNodW50LXJlc2lzdG9yID0gPDEwMDA+OworCQkJCQl9OworCisJCQkJCWluYTIyMEA0MSB7CisJCQkJCQljb21wYXRpYmxlID0gInRpLGluYTIyMCI7CisJCQkJCQlyZWcgPSA8MHg0MT47CisJCQkJCQlzaHVudC1yZXNpc3RvciA9IDwxMDAwPjsKKwkJCQkJfTsKKworCQkJCQlpbmEyMjBANDQgeworCQkJCQkJY29tcGF0aWJsZSA9ICJ0aSxpbmEyMjAiOworCQkJCQkJcmVnID0gPDB4NDQ+OworCQkJCQkJc2h1bnQtcmVzaXN0b3IgPSA8MTAwMD47CisJCQkJCX07CisKKwkJCQkJaW5hMjIwQDQ1IHsKKwkJCQkJCWNvbXBhdGlibGUgPSAidGksaW5hMjIwIjsKKwkJCQkJCXJlZyA9IDwweDQ1PjsKKwkJCQkJCXNodW50LXJlc2lzdG9yID0gPDEwMDA+OworCQkJCQl9OworCisJCQkJCWluYTIyMEA0NiB7CisJCQkJCQljb21wYXRpYmxlID0gInRpLGluYTIyMCI7CisJCQkJCQlyZWcgPSA8MHg0Nj47CisJCQkJCQlzaHVudC1yZXNpc3RvciA9IDwxMDAwPjsKKwkJCQkJfTsKKworCQkJCQlpbmEyMjBANDcgeworCQkJCQkJY29tcGF0aWJsZSA9ICJ0aSxpbmEyMjAiOworCQkJCQkJcmVnID0gPDB4NDc+OworCQkJCQkJc2h1bnQtcmVzaXN0b3IgPSA8MTAwMD47CisJCQkJCX07CisJCQkJfTsKIAkJCX07CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9hY2FkaWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2FjYWRpYV9kZWZjb25maWcKaW5kZXggZWQzYmFiNy4uNjllMDZlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2FjYWRpYV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2FjYWRpYV9kZWZjb25maWcKQEAgLTMwLDcgKzMwLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvZXA0MDVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2VwNDA1X2RlZmNvbmZpZwppbmRleCAxNzU4MmEzLi5jZjA2ZDQyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvZXA0MDVfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9lcDQwNV9kZWZjb25maWcKQEAgLTI5LDcgKzI5LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgva2lsYXVlYV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgva2lsYXVlYV9kZWZjb25maWcKaW5kZXggZjJkNGJlOS4uNWZmMzM4ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tpbGF1ZWFfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9raWxhdWVhX2RlZmNvbmZpZwpAQCAtMzIsNyArMzIsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9tYWthbHVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L21ha2FsdV9kZWZjb25maWcKaW5kZXggNDJiOTc5My4uODQ1MDVlMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L21ha2FsdV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L21ha2FsdV9kZWZjb25maWcKQEAgLTI5LDcgKzI5LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvd2FsbnV0X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC93YWxudXRfZGVmY29uZmlnCmluZGV4IGFhMWE0Y2EuLjBhMTlmNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC93YWxudXRfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC93YWxudXRfZGVmY29uZmlnCkBAIC0yNyw3ICsyNyw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2FyY2hlc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvYXJjaGVzX2RlZmNvbmZpZwppbmRleCAzMjlmOWEzLi40NDM1NWM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvYXJjaGVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvYXJjaGVzX2RlZmNvbmZpZwpAQCAtMzEsNyArMzEsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9ibHVlc3RvbmVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2JsdWVzdG9uZV9kZWZjb25maWcKaW5kZXggMjBjOGQyNi4uY2E3ZjFmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2JsdWVzdG9uZV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2JsdWVzdG9uZV9kZWZjb25maWcKQEAgLTI2LDcgKzI2LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvY2FueW9ubGFuZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2NhbnlvbmxhbmRzX2RlZmNvbmZpZwppbmRleCBkNWJlOTNlLi43YjhhYmQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvY2FueW9ubGFuZHNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9jYW55b25sYW5kc19kZWZjb25maWcKQEAgLTMxLDcgKzMxLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvZWJvbnlfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2Vib255X2RlZmNvbmZpZwppbmRleCBmOTI2OWZjLi4zMWI1OGIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvZWJvbnlfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9lYm9ueV9kZWZjb25maWcKQEAgLTI4LDcgKzI4LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2VpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9laWdlcl9kZWZjb25maWcKaW5kZXggOWJlMDg5MC4uZmFjY2FmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2VpZ2VyX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvZWlnZXJfZGVmY29uZmlnCkBAIC0zNCw3ICszNCw2IEBACiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaWNvbl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaWNvbl9kZWZjb25maWcKaW5kZXggODJmNzMwMy4uMDU3ODJjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2ljb25fZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pY29uX2RlZmNvbmZpZwpAQCAtMzMsNyArMzMsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pc3M0NzYtc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pc3M0NzYtc21wX2RlZmNvbmZpZwppbmRleCBjYTAwY2Y3Li40OWExNTE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaXNzNDc2LXNtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2lzczQ3Ni1zbXBfZGVmY29uZmlnCkBAIC00Miw3ICs0Miw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9rYXRtYWlfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2thdG1haV9kZWZjb25maWcKaW5kZXggMTA5NTYyYy4uZjExMzc5NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2thdG1haV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2thdG1haV9kZWZjb25maWcKQEAgLTI5LDcgKzI5LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvcmFpbmllcl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvcmFpbmllcl9kZWZjb25maWcKaW5kZXggMjFjMzNmYS4uNGI5MWE0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3JhaW5pZXJfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9yYWluaWVyX2RlZmNvbmZpZwpAQCAtMzAsNyArMzAsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9yZWR3b29kX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9yZWR3b29kX2RlZmNvbmZpZwppbmRleCA0ODgwMjgxLi5iNzExM2UxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvcmVkd29vZF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3JlZHdvb2RfZGVmY29uZmlnCkBAIC0zNCw3ICszNCw2IEBACiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvc2VxdW9pYV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvc2VxdW9pYV9kZWZjb25maWcKaW5kZXggYjdhNjUzYi4uOTY0MmQ5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9zZXF1b2lhX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvc2VxdW9pYV9kZWZjb25maWcKQEAgLTMxLDcgKzMxLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfQ09OTkVDVE9SPXkKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvdGFpc2hhbl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvdGFpc2hhbl9kZWZjb25maWcKaW5kZXggMzBkZTk3Zi4uMDllMzA3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3RhaXNoYW5fZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC90YWlzaGFuX2RlZmNvbmZpZwpAQCAtMjksNyArMjksNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19DT05ORUNUT1I9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0NGST15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvd2FycF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvd2FycF9kZWZjb25maWcKaW5kZXggMTA1YmM1Ni4uNTUxZTUwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L3dhcnBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC93YXJwX2RlZmNvbmZpZwpAQCAtMzQsNyArMzQsNiBAQAogIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvY201MjAwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvY201MjAwX2RlZmNvbmZpZwppbmRleCAwYjg4YzdiLi40Zjg0YTBiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L2NtNTIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9jbTUyMDBfZGVmY29uZmlnCkBAIC0zMCw3ICszMCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L21vdGlvbnByb19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L21vdGlvbnByb19kZWZjb25maWcKaW5kZXggMGQxM2FkNy4uYzA1MzEwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9tb3Rpb25wcm9fZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvbW90aW9ucHJvX2RlZmNvbmZpZwpAQCAtMzEsNyArMzEsNiBAQAogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3BjbTAzMF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3BjbTAzMF9kZWZjb25maWcKaW5kZXggNDMwYWExOC4uMjQwMWUyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZwpAQCAtNDQsNyArNDQsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC90cW01MjAwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvdHFtNTIwMF9kZWZjb25maWcKaW5kZXggN2FmNGM1Yi4uMjFjODQxZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvdHFtNTIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC90cW01MjAwX2RlZmNvbmZpZwpAQCAtMzUsNyArMzUsNiBAQAogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L2FzcDgzNDdfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9hc3A4MzQ3X2RlZmNvbmZpZwppbmRleCBkMjc2MmQ5Li45ODVmOTVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L2FzcDgzNDdfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvYXNwODM0N19kZWZjb25maWcKQEAgLTMyLDcgKzMyLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRD15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxM19yZGJfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzEzX3JkYl9kZWZjb25maWcKaW5kZXggZTRhZDJlMi4uMGI3M2I3ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzEzX3JkYl9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzEzX3JkYl9kZWZjb25maWcKQEAgLTMwLDcgKzMwLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTVfcmRiX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxNV9yZGJfZGVmY29uZmlnCmluZGV4IDM0ZmY1NjguLjk3YWMzYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxNV9yZGJfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxNV9yZGJfZGVmY29uZmlnCkBAIC0zMCw3ICszMCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQ0ZJPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9tZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzZ4X21kc19kZWZjb25maWcKaW5kZXggMTBiNWM0Yy4uMDU3MTBiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzZ4X21kc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzZ4X21kc19kZWZjb25maWcKQEAgLTMxLDcgKzMxLDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9yZGtfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzZ4X3Jka19kZWZjb25maWcKaW5kZXggNDU5MjVkNy4uMDU0MGQ2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzZ4X3Jka19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzZ4X3Jka19kZWZjb25maWcKQEAgLTI5LDcgKzI5LDYgQEAKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L3NiYzgzNHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9zYmM4MzR4X2RlZmNvbmZpZwppbmRleCA2ZDY0NjNmLi5hM2JjZGE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L3NiYzgzNHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvc2JjODM0eF9kZWZjb25maWcKQEAgLTMxLDcgKzMxLDYgQEAKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9rc2k4NTYwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgva3NpODU2MF9kZWZjb25maWcKaW5kZXggOGY3YzEwNi4uYWVlMGQxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9rc2k4NTYwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L2tzaTg1NjBfZGVmY29uZmlnCkBAIC0yOCw3ICsyOCw2IEBACiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9wcGE4NTQ4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvcHBhODU0OF9kZWZjb25maWcKaW5kZXggYTExMzM3ZC4uZTgwYmI5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9wcGE4NTQ4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3BwYTg1NDhfZGVmY29uZmlnCkBAIC00NCw3ICs0NCw2IEBACiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX1BIWVNNQVBfT0Y9eQogCiBDT05GSUdfSTJDPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvc29jcmF0ZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9zb2NyYXRlc19kZWZjb25maWcKaW5kZXggNzc1MDZiNS4uZTUxNDc0OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9zb2NyYXRlc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9zb2NyYXRlc19kZWZjb25maWcKQEAgLTMyLDcgKzMyLDYgQEAKIENPTkZJR19DQU5fQkNNPXkKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQwX2RlZmNvbmZpZwppbmRleCBkZGNiOWYzLi41YTgwMGU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0MF9kZWZjb25maWcKQEAgLTI2LDcgKzI2LDYgQEAKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0MV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDFfZGVmY29uZmlnCmluZGV4IDk4MWFiZDYuLjJkOTM2NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0MV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQxX2RlZmNvbmZpZwpAQCAtMjYsNyArMjYsNiBAQAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQ4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU0OF9kZWZjb25maWcKaW5kZXggMzdiM2Q3Mi4uY2U4YTY3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTQ4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NDhfZGVmY29uZmlnCkBAIC0zNCw3ICszNCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxLREVWUz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NTVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTU1X2RlZmNvbmZpZwppbmRleCAzNTkzYjMyLi5hNGUxMjk3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NTVfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU1NV9kZWZjb25maWcKQEAgLTI2LDcgKzI2LDYgQEAKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU2MF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3RxbTg1NjBfZGVmY29uZmlnCmluZGV4IGRlNDEzYWMuLjM0MWFiZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvdHFtODU2MF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC90cW04NTYwX2RlZmNvbmZpZwpAQCAtMjYsNyArMjYsNiBAQAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC94ZXNfbXBjODV4eF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3hlc19tcGM4NXh4X2RlZmNvbmZpZwppbmRleCAxY2Q2ZmNiLi4wN2JiODFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3hlc19tcGM4NXh4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3hlc19tcGM4NXh4X2RlZmNvbmZpZwpAQCAtNjUsNyArNjUsNiBAQAogQ09ORklHX0lQVjY9eQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9wcGM5YV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9wcGM5YV9kZWZjb25maWcKaW5kZXggZjJmNjczNC4uZTVhNjQ4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfcHBjOWFfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3BwYzlhX2RlZmNvbmZpZwpAQCAtNzAsNyArNzAsNiBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjMzEwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzMxMF9kZWZjb25maWcKaW5kZXggYmU3MzIxOS4uODMxN2I2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjMzEwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmMzMTBfZGVmY29uZmlnCkBAIC03MCw3ICs3MCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmM2MTBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjNjEwX2RlZmNvbmZpZwppbmRleCBiM2UyYjEwLi4xMjRkNjZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmM2MTBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzYxMF9kZWZjb25maWcKQEAgLTEyMyw3ICsxMjMsNiBAQAogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9tcGM4NjEwX2hwY2RfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9tcGM4NjEwX2hwY2RfZGVmY29uZmlnCmluZGV4IGMwOTU5OGIuLmJjYmU3NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvbXBjODYxMF9ocGNkX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L21wYzg2MTBfaHBjZF9kZWZjb25maWcKQEAgLTQxLDcgKzQxLDYgQEAKIENPTkZJR19JUFY2PXkKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9zYmM4NjQxZF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L3NiYzg2NDFkX2RlZmNvbmZpZwppbmRleCAxYTYyYmFmLi4xZTE1MTU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L3NiYzg2NDFkX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L3NiYzg2NDFkX2RlZmNvbmZpZwpAQCAtMTIwLDcgKzEyMCw2IEBACiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvYzJrX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2Mya19kZWZjb25maWcKaW5kZXggNjcxYThmOS4uYzY5ZjYxNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvYzJrX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jMmtfZGVmY29uZmlnCkBAIC0xNDksNyArMTQ5LDYgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPW0KLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj1tCiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKaW5kZXggNjM1MDhkZC4uNWM3ZmExOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKQEAgLTI2LDcgKzI2LDYgQEAKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfTUFUSF9FTVVMQVRJT049eQogQ09ORklHX01BVEhfRU1VTEFUSU9OX0hXX1VOSU1QTEVNRU5URUQ9eQotQ09ORklHX0ZTTF9JRkM9eQogQ09ORklHX1BDSUVQT1JUQlVTPXkKIENPTkZJR19QQ0lfTVNJPXkKIENPTkZJR19SQVBJRElPPXkKQEAgLTYwLDcgKzU5LDYgQEAKIENPTkZJR19ERVZUTVBGUz15CiBDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpbmtzdGF0aW9uX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpbmtzdGF0aW9uX2RlZmNvbmZpZwppbmRleCA4YTg3NGI5Li4zNTM0MzUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9saW5rc3RhdGlvbl9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGlua3N0YXRpb25fZGVmY29uZmlnCkBAIC01OSw3ICs1OSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15CiBDT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcKaW5kZXggODNkMzU1MC4uMTlmMGZiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcKQEAgLTQ5LDcgKzQ5LDYgQEAKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfTUFUSF9FTVVMQVRJT049eQogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTIKLUNPTkZJR19GU0xfSUZDPXkKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9NU0k9eQogQ09ORklHX1JBUElESU89eQpAQCAtODIsNyArODEsNiBAQAogQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19ERVZUTVBGU19NT1VOVD15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnCmluZGV4IDRiNjg2MjkuLjA2MjMxMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcKQEAgLTUyLDcgKzUyLDYgQEAKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfTUFUSF9FTVVMQVRJT049eQogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTIKLUNPTkZJR19GU0xfSUZDPXkKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9NU0k9eQogQ09ORklHX1JBUElESU89eQpAQCAtODUsNyArODQsNiBAQAogQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19ERVZUTVBGU19NT1VOVD15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDB4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQweF9kZWZjb25maWcKaW5kZXggMWViMTlhYy4uNTI5MDhjNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDB4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM0MHhfZGVmY29uZmlnCkBAIC0zMyw3ICszMyw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDR4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQ0eF9kZWZjb25maWcKaW5kZXggM2I5OGQ3My4uY2NmNjZiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDR4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM0NHhfZGVmY29uZmlnCkBAIC00NCw3ICs0NCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0NPTk5FQ1RPUj15CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwppbmRleCBlMDE1ODk2Li5mMjZiMjY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCkBAIC03Myw3NCArNzMsOCBAQAogQ09ORklHX0lORVRfSVBDT01QPW0KICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15Ci1DT05GSUdfTkZfQ09OTlRSQUNLPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKLUNPTkZJR19ORl9DVF9QUk9UT19TQ1RQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfQU1BTkRBPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRlRQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSDMyMz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX05FVEJJT1NfTlM9bQotQ09ORklHX05GX0NPTk5UUkFDS19QUFRQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCi1DT05GSUdfTkZfQ1RfTkVUTElOSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUFJPWFk9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0U9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1dORVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SQVRFRVNUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE09bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU09DS0VUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzI9bQotQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KLUNPTkZJR19JUF9ORl9JUFRBQkxFUz1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQotQ09ORklHX0lQX05GX01BVENIX0VDTj1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KLUNPTkZJR19JUF9ORl9GSUxURVI9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQotQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KLUNPTkZJR19JUF9ORl9NQU5HTEU9bQotQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQotQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQotQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9bQotQ09ORklHX0lQX05GX1JBVz1tCi1DT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9BUlBGSUxURVI9bQotQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorIyBDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9bQogQ09ORklHX0JQRl9KSVQ9eQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19ERVZUTVBGUz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NGVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRlX2RlZmNvbmZpZwppbmRleCBmNjI3ZmRhLi40MzhlODEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NGVfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0ZV9kZWZjb25maWcKQEAgLTQ4LDc0ICs0OCw4IEBACiBDT05GSUdfSU5FVF9JUENPTVA9bQogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSPXkKLUNPTkZJR19ORl9DT05OVFJBQ0s9bQotQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFM9eQotQ09ORklHX05GX0NUX1BST1RPX1NDVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9bQotQ09ORklHX05GX0NPTk5UUkFDS19GVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUz1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1BQVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQotQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KLUNPTkZJR19ORl9DVF9ORVRMSU5LPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RQUk9YWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUkFDRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1M9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQT1BUU1RSSVA9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkxJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUj1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1Q9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQ0VOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFA9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TT0NLRVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQotQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BSD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQotQ09ORklHX0lQX05GX0ZJTFRFUj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQotQ09ORklHX0lQX05GX01BTkdMRT1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCi1DT05GSUdfSVBfTkZfUkFXPW0KLUNPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQotQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCi1DT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCisjIENPTkZJR19ORVRGSUxURVJfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19ERVZUTVBGU19NT1VOVD15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcnBtYzI4MDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHJwbWMyODAwX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4MGZiNi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcnBtYzI4MDBfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLUNPTkZJR19BTFRJVkVDPXkKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAotIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAotQ09ORklHX0VNQkVEREVENnh4PXkKLUNPTkZJR19QUENfUFJQTUMyODAwPXkKLUNPTkZJR19ISUdITUVNPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfSElHSF9SRVNfVElNRVJTPXkKLUNPTkZJR19CSU5GTVRfTUlTQz15Ci1DT05GSUdfU1BBUlNFX0lSUT15Ci0jIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKLUNPTkZJR19ORVQ9eQotQ09ORklHX1BBQ0tFVD15Ci1DT05GSUdfVU5JWD15Ci1DT05GSUdfWEZSTV9VU0VSPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgotQ09ORklHX01URD15Ci1DT05GSUdfTVREX0NPTkNBVD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxPQ0s9eQotQ09ORklHX01URF9DRkk9eQotQ09ORklHX01URF9KRURFQ1BST0JFPXkKLUNPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKLUNPTkZJR19NVERfUEhZU01BUF9PRj15Ci1DT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTEzMTA3MgotQ09ORklHX0lERT15Ci1DT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKLUNPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVz15Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQVRBPXkKLUNPTkZJR19TQVRBX01WPXkKLUNPTkZJR19NQUNJTlRPU0hfRFJJVkVSUz15Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19ORVRfUENJPXkKLUNPTkZJR19FMTAwPXkKLUNPTkZJR184MTM5VE9PPXkKLSMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKLUNPTkZJR19FMTAwMD15Ci1DT05GSUdfTVY2NDNYWF9FVEg9eQotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9NUFNDPXkKLUNPTkZJR19TRVJJQUxfTVBTQ19DT05TT0xFPXkKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX01WNjRYWFg9eQotQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPXkKLUNPTkZJR19ISURfRFJBR09OUklTRT15Ci1DT05GSUdfSElEX0dZUkFUSU9OPXkKLUNPTkZJR19ISURfVFdJTkhBTj15Ci1DT05GSUdfSElEX05UUklHPXkKLUNPTkZJR19ISURfT1JURUs9eQotQ09ORklHX0hJRF9QQU5USEVSTE9SRD15Ci1DT05GSUdfSElEX1BFVEFMWU5YPXkKLUNPTkZJR19ISURfU0FNU1VORz15Ci1DT05GSUdfSElEX1NPTlk9eQotQ09ORklHX0hJRF9TVU5QTFVTPXkKLUNPTkZJR19ISURfR1JFRU5BU0lBPXkKLUNPTkZJR19ISURfU01BUlRKT1lQTFVTPXkKLUNPTkZJR19ISURfVE9QU0VFRD15Ci1DT05GSUdfSElEX1RIUlVTVE1BU1RFUj15Ci1DT05GSUdfVEhSVVNUTUFTVEVSX0ZGPXkKLUNPTkZJR19ISURfWkVST1BMVVM9eQotQ09ORklHX1pFUk9QTFVTX0ZGPXkKLUNPTkZJR19VU0I9eQotQ09ORklHX1VTQl9ERVZJQ0VGUz15Ci0jIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKLUNPTkZJR19VU0JfRUhDSV9IQ0Q9eQotQ09ORklHX1VTQl9PSENJX0hDRD15Ci1DT05GSUdfUlRDX0NMQVNTPXkKLUNPTkZJR19SVENfRFJWX01BWDY5MDA9eQotQ09ORklHX0VYVDJfRlM9eQotQ09ORklHX0VYVDNfRlM9eQotIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLUNPTkZJR19DUkNfVDEwRElGPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKLSMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKaW5kZXggZTlhOGI0ZS4uOWVhODM0MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCkBAIC02NSw1NyArNjUsOCBAQAogQ09ORklHX0lORVRfSVBDT01QPW0KICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15Ci1DT05GSUdfTkZfQ09OTlRSQUNLPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKLUNPTkZJR19ORl9DVF9QUk9UT19VRFBMSVRFPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRlRQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCi1DT05GSUdfTkZfQ1RfTkVUTElOSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1dORVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SQVRFRVNUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE09bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfSVBfTkZfSVBUQUJMRVM9bQotQ09ORklHX0lQX05GX01BVENIX0FIPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9FQ049bQotQ09ORklHX0lQX05GX01BVENIX1RUTD1tCi1DT05GSUdfSVBfTkZfRklMVEVSPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCisjIENPTkZJR19ORVRGSUxURVJfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19ERVZUTVBGU19NT1VOVD15CkBAIC0zNTMsMyArMzA0LDUgQEAKIENPTkZJR19WSVJUVUFMSVpBVElPTj15CiBDT05GSUdfS1ZNX0JPT0szU182ND1tCiBDT05GSUdfS1ZNX0JPT0szU182NF9IVj15CitDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0U9eQorQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZUz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2xlX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfbGVfZGVmY29uZmlnCmluZGV4IDYyNzcxZTAuLjNjODRmOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfbGVfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfbGVfZGVmY29uZmlnCkBAIC02Nyw1NyArNjcsOCBAQAogQ09ORklHX0lORVRfSVBDT01QPW0KICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15Ci1DT05GSUdfTkZfQ09OTlRSQUNLPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKLUNPTkZJR19ORl9DVF9QUk9UT19VRFBMSVRFPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfRlRQPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCi1DT05GSUdfTkZfQ1RfTkVUTElOSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1dORVI9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SQVRFRVNUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE09bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQ9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfSVBfTkZfSVBUQUJMRVM9bQotQ09ORklHX0lQX05GX01BVENIX0FIPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9FQ049bQotQ09ORklHX0lQX05GX01BVENIX1RUTD1tCi1DT05GSUdfSVBfTkZfRklMVEVSPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCisjIENPTkZJR19ORVRGSUxURVJfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19ERVZUTVBGU19NT1VOVD15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9zdG9yY2VudGVyX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3N0b3JjZW50ZXJfZGVmY29uZmlnCmluZGV4IGViYjJhNjYuLmJhMzljNzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3N0b3JjZW50ZXJfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3N0b3JjZW50ZXJfZGVmY29uZmlnCkBAIC0zMSw3ICszMSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy90cW04eHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvdHFtOHh4X2RlZmNvbmZpZwppbmRleCA0YjZmOGJmLi43ZmUyNzdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy90cW04eHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3RxbTh4eF9kZWZjb25maWcKQEAgLTQxLDcgKzQxLDYgQEAKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKIENPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNmMwYTk1NS4uM2ZiMWJjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDcgKzEsOCBAQAogCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKK2dlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJ3c2VtLmgKIGdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gdnRpbWUuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IGE2MTNkMmMuLmIxNDJiOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTgsNyArOCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNkZWZpbmUgQ09NUEFUX1VTRVJfSFoJCTEwMAorI2lmZGVmIF9fQklHX0VORElBTl9fCiAjZGVmaW5lIENPTVBBVF9VVFNfTUFDSElORQkicHBjXDBcMCIKKyNlbHNlCisjZGVmaW5lIENPTVBBVF9VVFNfTUFDSElORQkicHBjbGVcMFwwIgorI2VuZGlmCiAKIHR5cGVkZWYgdTMyCQljb21wYXRfc2l6ZV90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9zc2l6ZV90OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaAppbmRleCA2MTdjYzc2Li5iYzIzNDc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaApAQCAtMTg5LDYgKzE4OSw3IEBACiAjZGVmaW5lCUNQVV9GVFJfSEFTX1BQUgkJCUxPTkdfQVNNX0NPTlNUKDB4MDIwMDAwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9EQVdSCQkJTE9OR19BU01fQ09OU1QoMHgwNDAwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0RBQlJYCQkJTE9OR19BU01fQ09OU1QoMHgwODAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBDUFVfRlRSX1BNQU9fQlVHCQlMT05HX0FTTV9DT05TVCgweDEwMDAwMDAwMDAwMDAwMDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTQ0NSw2ICs0NDYsNyBAQAogCSAgICBDUFVfRlRSX0lDU1dYIHwgQ1BVX0ZUUl9DRkFSIHwgQ1BVX0ZUUl9IVk1PREUgfCBDUFVfRlRSX1ZNWF9DT1BZIHwgXAogCSAgICBDUFVfRlRSX0RCRUxMIHwgQ1BVX0ZUUl9IQVNfUFBSIHwgQ1BVX0ZUUl9EQVdSIHwgXAogCSAgICBDUFVfRlRSX0FSQ0hfMjA3UyB8IENQVV9GVFJfVE1fQ09NUCkKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI4RSAoQ1BVX0ZUUlNfUE9XRVI4IHwgQ1BVX0ZUUl9QTUFPX0JVRykKICNkZWZpbmUgQ1BVX0ZUUlNfQ0VMTAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0xXU1lOQyB8IFwKIAkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKQEAgLTQ2Niw4ICs0NjgsOCBAQAogI2RlZmluZSBDUFVfRlRSU19QT1NTSUJMRQlcCiAJICAgIChDUFVfRlRSU19QT1dFUjMgfCBDUFVfRlRSU19SUzY0IHwgQ1BVX0ZUUlNfUE9XRVI0IHwJXAogCSAgICBDUFVfRlRSU19QUEM5NzAgfCBDUFVfRlRSU19QT1dFUjUgfCBDUFVfRlRSU19QT1dFUjYgfAlcCi0JICAgIENQVV9GVFJTX1BPV0VSNyB8IENQVV9GVFJTX1BPV0VSOCB8IENQVV9GVFJTX0NFTEwgfAkJXAotCSAgICBDUFVfRlRSU19QQTZUIHwgQ1BVX0ZUUl9WU1gpCisJICAgIENQVV9GVFJTX1BPV0VSNyB8IENQVV9GVFJTX1BPV0VSOEUgfCBDUFVfRlRSU19QT1dFUjggfAlcCisJICAgIENQVV9GVFJTX0NFTEwgfCBDUFVfRlRSU19QQTZUIHwgQ1BVX0ZUUl9WU1gpCiAjZW5kaWYKICNlbHNlCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0ZS5oCmluZGV4IDUxZmE0M2UuLmE1NjNkOWFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0ZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRlLmgKQEAgLTQ2LDkgKzQ2LDggQEAKICNkZWZpbmUgRVhfQ1IJCSgxICogOCkKICNkZWZpbmUgRVhfUjEwCQkoMiAqIDgpCiAjZGVmaW5lIEVYX1IxMQkJKDMgKiA4KQotI2RlZmluZSBFWF9SMTMJCSg0ICogOCkKLSNkZWZpbmUgRVhfUjE0CQkoNSAqIDgpCi0jZGVmaW5lIEVYX1IxNQkJKDYgKiA4KQorI2RlZmluZSBFWF9SMTQJCSg0ICogOCkKKyNkZWZpbmUgRVhfUjE1CQkoNSAqIDgpCiAKIC8qCiAgKiBUaGUgVExCIG1pc3MgZXhjZXB0aW9uIHVzZXMgZGlmZmVyZW50IHNsb3RzLgpAQCAtMTczLDE2ICsxNzIsNiBAQAogCWxkCXI5LEVYX1RMQl9SOShyMTIpOwkJCQkJICAgIFwKIAlsZAlyOCxFWF9UTEJfUjgocjEyKTsJCQkJCSAgICBcCiAJbXRscglyMTY7Ci0jZGVmaW5lIFRMQl9NSVNTX1BST0xPR19TVEFUU19CT0xURUQJCQkJCQkgICAgXAotCW1mbHIJcjEwOwkJCQkJCQkgICAgXAotCXN0ZAlyOCxQQUNBX0VYVExCK0VYX1RMQl9SOChyMTMpOwkJCQkgICAgXAotCXN0ZAlyOSxQQUNBX0VYVExCK0VYX1RMQl9SOShyMTMpOwkJCQkgICAgXAotCXN0ZAlyMTAsUEFDQV9FWFRMQitFWF9UTEJfTFIocjEzKTsKLSNkZWZpbmUgVExCX01JU1NfUkVTVE9SRV9TVEFUU19CT0xURUQJCQkJCSAgICAgICAgICAgIFwKLQlsZAlyMTYsUEFDQV9FWFRMQitFWF9UTEJfTFIocjEzKTsJCQkJICAgIFwKLQlsZAlyOSxQQUNBX0VYVExCK0VYX1RMQl9SOShyMTMpOwkJCQkgICAgXAotCWxkCXI4LFBBQ0FfRVhUTEIrRVhfVExCX1I4KHIxMyk7CQkJCSAgICBcCi0JbXRscglyMTY7CiAjZGVmaW5lIFRMQl9NSVNTX1NUQVRTX0QobmFtZSkJCQkJCQkgICAgXAogCWFkZGkJcjkscjEzLE1NU1RBVF9EU1RBVFMrbmFtZTsJCQkJICAgIFwKIAlibAkudGxiX3N0YXRfaW5jOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRzLmgKaW5kZXggNjY4MzA2MS4uYWVhYTU2YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0cy5oCkBAIC0xNDcsNiArMTQ3LDE0IEBACiBFTkRfRlRSX1NFQ1RJT05fTkVTVEVEKGZ0cixmdHIsOTQzKQogCiAvKgorICogU2V0IGFuIFNQUiBmcm9tIGEgcmVnaXN0ZXIgaWYgdGhlIENQVSBoYXMgdGhlIGdpdmVuIGZlYXR1cmUKKyAqLworI2RlZmluZSBPUFRfU0VUX1NQUihyYSwgc3ByLCBmdHIpCQkJCQlcCitCRUdJTl9GVFJfU0VDVElPTl9ORVNURUQoOTQzKQkJCQkJCVwKKwltdHNwcglzcHIscmE7CQkJCQkJCVwKK0VORF9GVFJfU0VDVElPTl9ORVNURUQoZnRyLGZ0ciw5NDMpCisKKy8qCiAgKiBTYXZlIGEgcmVnaXN0ZXIgdG8gdGhlIFBBQ0EgaWYgdGhlIENQVSBoYXMgdGhlIGdpdmVuIGZlYXR1cmUKICAqLwogI2RlZmluZSBPUFRfU0FWRV9SRUdfVE9fUEFDQShvZmZzZXQsIHJhLCBmdHIpCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaAppbmRleCBkOGI2MDBiLi41ZGJiYjI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCkBAIC0yNzQsNiArMjc0LDExIEBACiAvKiBQbGF0Zm9ybSBzcGVjaWZpYyBoY2FsbHMsIHVzZWQgYnkgS1ZNICovCiAjZGVmaW5lIEhfUlRBUwkJCTB4ZjAwMAogCisvKiAiUGxhdGZvcm0gc3BlY2lmaWMgaGNhbGxzIiwgcHJvdmlkZWQgYnkgUEhZUCAqLworI2RlZmluZSBIX0dFVF8yNFg3X0NBVEFMT0dfUEFHRQkweEYwNzgKKyNkZWZpbmUgSF9HRVRfMjRYN19EQVRBCQkweEYwN0MKKyNkZWZpbmUgSF9HRVRfUEVSRl9DT1VOVEVSX0lORk8JMHhGMDgwCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rZV9odl9hc20uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9va2VfaHZfYXNtLmgKaW5kZXggM2E3OWY1My4uZTVmMDQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rZV9odl9hc20uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2tlX2h2X2FzbS5oCkBAIC0zNiwyNiArMzYsMjEgQEAKICAqICAgKihyOCArIEdQUjExKSA9IHNhdmVkIHIxMQogICoKICAqIDY0LWJpdCBob3N0Ci0gKiBFeHBlY3RlZCBpbnB1dHMgKEdFTi9HREJFTEwvREJHL01DIGV4Y2VwdGlvbiB0eXBlcyk6CisgKiBFeHBlY3RlZCBpbnB1dHMgKEdFTi9HREJFTEwvREJHL0NSSVQvTUMgZXhjZXB0aW9uIHR5cGVzKToKICAqICByMTAgPSBzYXZlZCBDUgogICogIHIxMyA9IFBBQ0FfUE9JTlRFUgogICogICoocjEzICsgUEFDQV9FWCMjdHlwZSArIEVYX1IxMCkgPSBzYXZlZCByMTAKICAqICAqKHIxMyArIFBBQ0FfRVgjI3R5cGUgKyBFWF9SMTEpID0gc2F2ZWQgcjExCiAgKiAgU1BSTl9TUFJHXyMjdHlwZSMjX1NDUkFUQ0ggPSBzYXZlZCByMTMKICAqCi0gICogRXhwZWN0ZWQgaW5wdXRzIChDUklUIGV4Y2VwdGlvbiB0eXBlKToKLSAqICByMTAgPSBzYXZlZCBDUgotICogIHIxMyA9IFBBQ0FfUE9JTlRFUgotICogICoocjEzICsgUEFDQV9FWCMjdHlwZSArIEVYX1IxMCkgPSBzYXZlZCByMTAKLSAqICAqKHIxMyArIFBBQ0FfRVgjI3R5cGUgKyBFWF9SMTEpID0gc2F2ZWQgcjExCi0gKiAgKihyMTMgKyBQQUNBX0VYIyN0eXBlICsgRVhfUjEzKSA9IHNhdmVkIHIxMwotICoKICAqIEV4cGVjdGVkIGlucHV0cyAoVExCIGV4Y2VwdGlvbiB0eXBlKToKICAqICByMTAgPSBzYXZlZCBDUgorICogIHIxMiA9IGV4dGxiIHBvaW50ZXIKICAqICByMTMgPSBQQUNBX1BPSU5URVIKLSAqICAqKHIxMyArIFBBQ0FfRVgjI3R5cGUgKyBFWF9UTEJfUjEwKSA9IHNhdmVkIHIxMAotICogICoocjEzICsgUEFDQV9FWCMjdHlwZSArIEVYX1RMQl9SMTEpID0gc2F2ZWQgcjExCi0gKiAgU1BSTl9TUFJHX0dFTl9TQ1JBVENIID0gc2F2ZWQgcjEzCisgKiAgKihyMTIgKyBFWF9UTEJfUjEwKSA9IHNhdmVkIHIxMAorICogICoocjEyICsgRVhfVExCX1IxMSkgPSBzYXZlZCByMTEKKyAqICAqKHIxMiArIEVYX1RMQl9SMTMpID0gc2F2ZWQgcjEzCisgKiAgU1BSTl9TUFJHX0dFTl9TQ1JBVENIID0gc2F2ZWQgcjEyCiAgKgogICogT25seSB0aGUgYm9sdGVkIHZlcnNpb24gb2YgVExCIG1pc3MgZXhjZXB0aW9uIGhhbmRsZXJzIGlzIHN1cHBvcnRlZCBub3cuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCmluZGV4IGFkMzAyNWQuLjViNmMwM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaApAQCAtMTcwLDYgKzE3MCw5IEBACiAJaW50CQkoKnN5c3RlbV9yZXNldF9leGNlcHRpb24pKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAlpbnQgCQkoKm1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKKwkvKiBDYWxsZWQgZHVyaW5nIG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIHRvIHJldHJpdmUgZml4dXAgYWRkcmVzcy4gKi8KKwlib29sCQkoKm1jZV9jaGVja19lYXJseV9yZWNvdmVyeSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCiAJLyogTW90aGVyYm9hcmQvY2hpcHNldCBmZWF0dXJlcy4gVGhpcyBpcyBhIGtpbmQgb2YgZ2VuZXJhbCBwdXJwb3NlCiAJICogaG9vayB1c2VkIHRvIGNvbnRyb2wgc29tZSBtYWNoaW5lIHNwZWNpZmljIGZlYXR1cmVzIChsaWtlIHJlc2V0CiAJICogbGluZXMsIGNoaXAgcG93ZXIgY29udHJvbCwgZXRjLi4uKS4KQEAgLTI3OSw2ICsyODIsMTAgQEAKICNpZmRlZiBDT05GSUdfQVJDSF9SQU5ET00KIAlpbnQgKCpnZXRfcmFuZG9tX2xvbmcpKHVuc2lnbmVkIGxvbmcgKnYpOwogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQorCWludCAoKnJlbW92ZV9tZW1vcnkpKHU2NCwgdTY0KTsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIHZvaWQgZTUwMF9pZGxlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21jZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21jZS5oCmluZGV4IDhlOTllZGYuLmY5N2Q4Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tY2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWNlLmgKQEAgLTE4Nyw3ICsxODcsOCBAQAogI2RlZmluZSBNQ0VfRVZFTlRfRE9OVFJFTEVBU0UJZmFsc2UKIAogZXh0ZXJuIHZvaWQgc2F2ZV9tY2VfZXZlbnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgaGFuZGxlZCwKLQkJCSAgIHN0cnVjdCBtY2VfZXJyb3JfaW5mbyAqbWNlX2VyciwgdWludDY0X3QgYWRkcik7CisJCQkgICBzdHJ1Y3QgbWNlX2Vycm9yX2luZm8gKm1jZV9lcnIsIHVpbnQ2NF90IG5pcCwKKwkJCSAgIHVpbnQ2NF90IGFkZHIpOwogZXh0ZXJuIGludCBnZXRfbWNlX2V2ZW50KHN0cnVjdCBtYWNoaW5lX2NoZWNrX2V2ZW50ICptY2UsIGJvb2wgcmVsZWFzZSk7CiBleHRlcm4gdm9pZCByZWxlYXNlX21jZV9ldmVudCh2b2lkKTsKIGV4dGVybiB2b2lkIG1hY2hpbmVfY2hlY2tfcXVldWVfZXZlbnQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaAppbmRleCA4OWI3ODVkLi45MDFkYWM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKQEAgLTI4NywxMSArMjg3LDE0IEBACiBleHRlcm4gaW50IG1tdV92bWVtbWFwX3BzaXplOwogCiBzdHJ1Y3QgdGxiX2NvcmVfZGF0YSB7CisJLyoKKwkgKiBQZXItY29yZSBzcGlubG9jayBmb3IgZTY1MDAgVExCIGhhbmRsZXJzIChubyB0bGJzcnguKQorCSAqIE11c3QgYmUgdGhlIGZpcnN0IHN0cnVjdCBlbGVtZW50LgorCSAqLworCXU4IGxvY2s7CisKIAkvKiBGb3Igc29mdHdhcmUgd2F5IHNlbGVjdGlvbiwgYXMgb24gRnJlZXNjYWxlIFRMQjEgKi8KIAl1OCBlc2VsX25leHQsIGVzZWxfbWF4LCBlc2VsX2ZpcnN0OwotCi0JLyogUGVyLWNvcmUgc3BpbmxvY2sgZm9yIGU2NTAwIFRMQiBoYW5kbGVycyAobm8gdGxic3J4LikgKi8KLQl1OCBsb2NrOwogfTsKIAogI2lmZGVmIENPTkZJR19QUEM2NApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKaW5kZXggZWQ4MjE0Mi4uZmUyYWEwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3BhbC5oCkBAIC04Myw2ICs4Myw4IEBACiAjZGVmaW5lIE9QQUxfSU5URVJOQUxfRVJST1IJLTExCiAjZGVmaW5lIE9QQUxfQlVTWV9FVkVOVAkJLTEyCiAjZGVmaW5lIE9QQUxfSEFSRFdBUkVfRlJPWkVOCS0xMworI2RlZmluZSBPUEFMX1dST05HX1NUQVRFCS0xNAorI2RlZmluZSBPUEFMX0FTWU5DX0NPTVBMRVRJT04JLTE1CiAKIC8qIEFQSSBUb2tlbnMgKGluIHIwKSAqLwogI2RlZmluZSBPUEFMX0NPTlNPTEVfV1JJVEUJCQkxCkBAIC0xNTEsMTIgKzE1MywyNyBAQAogI2RlZmluZSBPUEFMX0xQQ19SRUFECQkJCTY3CiAjZGVmaW5lIE9QQUxfTFBDX1dSSVRFCQkJCTY4CiAjZGVmaW5lIE9QQUxfUkVUVVJOX0NQVQkJCQk2OQorI2RlZmluZSBPUEFMX0VMT0dfUkVBRAkJCQk3MQorI2RlZmluZSBPUEFMX0VMT0dfV1JJVEUJCQkJNzIKKyNkZWZpbmUgT1BBTF9FTE9HX0FDSwkJCQk3MworI2RlZmluZSBPUEFMX0VMT0dfUkVTRU5ECQkJNzQKKyNkZWZpbmUgT1BBTF9FTE9HX1NJWkUJCQkJNzUKICNkZWZpbmUgT1BBTF9GTEFTSF9WQUxJREFURQkJCTc2CiAjZGVmaW5lIE9QQUxfRkxBU0hfTUFOQUdFCQkJNzcKICNkZWZpbmUgT1BBTF9GTEFTSF9VUERBVEUJCQk3OAorI2RlZmluZSBPUEFMX1JFU1lOQ19USU1FQkFTRQkJCTc5CisjZGVmaW5lIE9QQUxfRFVNUF9JTklUCQkJCTgxCisjZGVmaW5lIE9QQUxfRFVNUF9JTkZPCQkJCTgyCisjZGVmaW5lIE9QQUxfRFVNUF9SRUFECQkJCTgzCisjZGVmaW5lIE9QQUxfRFVNUF9BQ0sJCQkJODQKICNkZWZpbmUgT1BBTF9HRVRfTVNHCQkJCTg1CiAjZGVmaW5lIE9QQUxfQ0hFQ0tfQVNZTkNfQ09NUExFVElPTgkJODYKICNkZWZpbmUgT1BBTF9TWU5DX0hPU1RfUkVCT09UCQkJODcKKyNkZWZpbmUgT1BBTF9TRU5TT1JfUkVBRAkJCTg4CisjZGVmaW5lIE9QQUxfR0VUX1BBUkFNCQkJCTg5CisjZGVmaW5lIE9QQUxfU0VUX1BBUkFNCQkJCTkwCisjZGVmaW5lIE9QQUxfRFVNUF9SRVNFTkQJCQk5MQorI2RlZmluZSBPUEFMX0RVTVBfSU5GTzIJCQkJOTQKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtMjM3LDExICsyNTQsMTQgQEAKIAlPUEFMX0VWRU5UX0VQT1cJCQk9IDB4ODAsCiAJT1BBTF9FVkVOVF9MRURfU1RBVFVTCQk9IDB4MTAwLAogCU9QQUxfRVZFTlRfUENJX0VSUk9SCQk9IDB4MjAwLAorCU9QQUxfRVZFTlRfRFVNUF9BVkFJTAkJPSAweDQwMCwKIAlPUEFMX0VWRU5UX01TR19QRU5ESU5HCQk9IDB4ODAwLAogfTsKIAogZW51bSBPcGFsTWVzc2FnZVR5cGUgewotCU9QQUxfTVNHX0FTWU5DX0NPTVAJCT0gMCwKKwlPUEFMX01TR19BU1lOQ19DT01QID0gMCwJLyogcGFyYW1zWzBdID0gdG9rZW4sIHBhcmFtc1sxXSA9IHJjLAorCQkJCQkgKiBhZGRpdGlvbmFsIHBhcmFtcyBmdW5jdGlvbi1zcGVjaWZpYworCQkJCQkgKi8KIAlPUEFMX01TR19NRU1fRVJSLAogCU9QQUxfTVNHX0VQT1csCiAJT1BBTF9NU0dfU0hVVERPV04sCkBAIC0zOTQsNiArNDE0LDEzIEBACiAJT1BBTF9MUENfRlcJPSAyLAogfTsKIAorLyogU3lzdGVtIHBhcmFtZXRlciBwZXJtaXNzaW9uICovCitlbnVtIE9wYWxTeXNwYXJhbVBlcm0geworCU9QQUxfU1lTUEFSQU1fUkVBRCAgICAgID0gMHgxLAorCU9QQUxfU1lTUEFSQU1fV1JJVEUgICAgID0gMHgyLAorCU9QQUxfU1lTUEFSQU1fUlcgICAgICAgID0gKE9QQUxfU1lTUEFSQU1fUkVBRCB8IE9QQUxfU1lTUEFSQU1fV1JJVEUpLAorfTsKKwogc3RydWN0IG9wYWxfbXNnIHsKIAl1aW50MzJfdCBtc2dfdHlwZTsKIAl1aW50MzJfdCByZXNlcnZlZDsKQEAgLTgyMywxNiArODUwLDM3IEBACiAJCSAgICAgICB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBzeik7CiBpbnQ2NF90IG9wYWxfbHBjX3JlYWQodWludDMyX3QgY2hpcF9pZCwgZW51bSBPcGFsTFBDQWRkcmVzc1R5cGUgYWRkcl90eXBlLAogCQkgICAgICB1aW50MzJfdCBhZGRyLCBfX2JlMzIgKmRhdGEsIHVpbnQzMl90IHN6KTsKKworaW50NjRfdCBvcGFsX3JlYWRfZWxvZyh1aW50NjRfdCBidWZmZXIsIHNpemVfdCBzaXplLCB1aW50NjRfdCBsb2dfaWQpOworaW50NjRfdCBvcGFsX2dldF9lbG9nX3NpemUodWludDY0X3QgKmxvZ19pZCwgc2l6ZV90ICpzaXplLCB1aW50NjRfdCAqZWxvZ190eXBlKTsKK2ludDY0X3Qgb3BhbF93cml0ZV9lbG9nKHVpbnQ2NF90IGJ1ZmZlciwgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0KTsKK2ludDY0X3Qgb3BhbF9zZW5kX2Fja19lbG9nKHVpbnQ2NF90IGxvZ19pZCk7Cit2b2lkIG9wYWxfcmVzZW5kX3BlbmRpbmdfbG9ncyh2b2lkKTsKKwogaW50NjRfdCBvcGFsX3ZhbGlkYXRlX2ZsYXNoKHVpbnQ2NF90IGJ1ZmZlciwgdWludDMyX3QgKnNpemUsIHVpbnQzMl90ICpyZXN1bHQpOwogaW50NjRfdCBvcGFsX21hbmFnZV9mbGFzaCh1aW50OF90IG9wKTsKIGludDY0X3Qgb3BhbF91cGRhdGVfZmxhc2godWludDY0X3QgYmxrX2xpc3QpOworaW50NjRfdCBvcGFsX2R1bXBfaW5pdCh1aW50OF90IGR1bXBfdHlwZSk7CitpbnQ2NF90IG9wYWxfZHVtcF9pbmZvKHVpbnQzMl90ICpkdW1wX2lkLCB1aW50MzJfdCAqZHVtcF9zaXplKTsKK2ludDY0X3Qgb3BhbF9kdW1wX2luZm8yKHVpbnQzMl90ICpkdW1wX2lkLCB1aW50MzJfdCAqZHVtcF9zaXplLCB1aW50MzJfdCAqZHVtcF90eXBlKTsKK2ludDY0X3Qgb3BhbF9kdW1wX3JlYWQodWludDMyX3QgZHVtcF9pZCwgdWludDY0X3QgYnVmZmVyKTsKK2ludDY0X3Qgb3BhbF9kdW1wX2Fjayh1aW50MzJfdCBkdW1wX2lkKTsKK2ludDY0X3Qgb3BhbF9kdW1wX3Jlc2VuZF9ub3RpZmljYXRpb24odm9pZCk7CiAKIGludDY0X3Qgb3BhbF9nZXRfbXNnKHVpbnQ2NF90IGJ1ZmZlciwgc2l6ZV90IHNpemUpOwogaW50NjRfdCBvcGFsX2NoZWNrX2NvbXBsZXRpb24odWludDY0X3QgYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdWludDY0X3QgdG9rZW4pOwogaW50NjRfdCBvcGFsX3N5bmNfaG9zdF9yZWJvb3Qodm9pZCk7CitpbnQ2NF90IG9wYWxfZ2V0X3BhcmFtKHVpbnQ2NF90IHRva2VuLCB1aW50MzJfdCBwYXJhbV9pZCwgdWludDY0X3QgYnVmZmVyLAorCQlzaXplX3QgbGVuZ3RoKTsKK2ludDY0X3Qgb3BhbF9zZXRfcGFyYW0odWludDY0X3QgdG9rZW4sIHVpbnQzMl90IHBhcmFtX2lkLCB1aW50NjRfdCBidWZmZXIsCisJCXNpemVfdCBsZW5ndGgpOworaW50NjRfdCBvcGFsX3NlbnNvcl9yZWFkKHVpbnQzMl90IHNlbnNvcl9obmRsLCBpbnQgdG9rZW4sCisJCXVpbnQzMl90ICpzZW5zb3JfZGF0YSk7CiAKIC8qIEludGVybmFsIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fb3BhbCh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fcmVjb3ZlcmFibGVfcmFuZ2VzKHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkgY29uc3QgY2hhciAqdW5hbWUsIGludCBkZXB0aCwgdm9pZCAqZGF0YSk7CiAKIGV4dGVybiBpbnQgb3BhbF9nZXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpOwogZXh0ZXJuIGludCBvcGFsX3B1dF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCB0b3RhbF9sZW4pOwpAQCAtODUzLDYgKzkwMSwxMyBAQAogZXh0ZXJuIGludCBvcGFsX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCk7CiBleHRlcm4gaW50IG9wYWxfcHV0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IHRvdGFsX2xlbik7CiAKK2V4dGVybiBpbnQgX19vcGFsX2FzeW5jX2dldF90b2tlbih2b2lkKTsKK2V4dGVybiBpbnQgb3BhbF9hc3luY19nZXRfdG9rZW5faW50ZXJydXB0aWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgX19vcGFsX2FzeW5jX3JlbGVhc2VfdG9rZW4oaW50IHRva2VuKTsKK2V4dGVybiBpbnQgb3BhbF9hc3luY19yZWxlYXNlX3Rva2VuKGludCB0b2tlbik7CitleHRlcm4gaW50IG9wYWxfYXN5bmNfd2FpdF9yZXNwb25zZSh1aW50NjRfdCB0b2tlbiwgc3RydWN0IG9wYWxfbXNnICptc2cpOworZXh0ZXJuIGludCBvcGFsX2dldF9zZW5zb3JfZGF0YSh1MzIgc2Vuc29yX2huZGwsIHUzMiAqc2Vuc29yX2RhdGEpOworCiBleHRlcm4gdm9pZCBodmNfb3BhbF9pbml0X2Vhcmx5KHZvaWQpOwogCiBzdHJ1Y3QgcnRjX3RpbWU7CkBAIC04NjEsMTAgKzkxNiwxNSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb3BhbF9nZXRfYm9vdF90aW1lKHZvaWQpOwogZXh0ZXJuIHZvaWQgb3BhbF9udnJhbV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgb3BhbF9mbGFzaF9pbml0KHZvaWQpOworZXh0ZXJuIGludCBvcGFsX2Vsb2dfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9wYWxfcGxhdGZvcm1fZHVtcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgb3BhbF9zeXNfcGFyYW1faW5pdCh2b2lkKTsKIAogZXh0ZXJuIGludCBvcGFsX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGJvb2wgb3BhbF9tY2VfY2hlY2tfZWFybHlfcmVjb3Zlcnkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBleHRlcm4gdm9pZCBvcGFsX3NodXRkb3duKHZvaWQpOworZXh0ZXJuIGludCBvcGFsX3Jlc3luY190aW1lYmFzZSh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgb3BhbF9scGNfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKaW5kZXggOWM1ZGJjMy4uOGU5NTZhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC0xMTYsOCArMTE2LDExIEBACiAJLyogU2hhcmVkIGJ5IGFsbCB0aHJlYWRzIG9mIGEgY29yZSAtLSBwb2ludHMgdG8gdGNkIG9mIGZpcnN0IHRocmVhZCAqLwogCXN0cnVjdCB0bGJfY29yZV9kYXRhICp0Y2RfcHRyOwogCi0JLyogV2UgY2FuIGhhdmUgdXAgdG8gMyBsZXZlbHMgb2YgcmVlbnRyYW5jeSBpbiB0aGUgVExCIG1pc3MgaGFuZGxlciAqLwotCXU2NCBleHRsYlszXVtFWF9UTEJfU0laRSAvIHNpemVvZih1NjQpXTsKKwkvKgorCSAqIFdlIGNhbiBoYXZlIHVwIHRvIDMgbGV2ZWxzIG9mIHJlZW50cmFuY3kgaW4gdGhlIFRMQiBtaXNzIGhhbmRsZXIsCisJICogaW4gZWFjaCBvZiBmb3VyIGV4Y2VwdGlvbiBsZXZlbHMgKG5vcm1hbCwgY3JpdCwgbWNoZWNrLCBkZWJ1ZykuCisJICovCisJdTY0IGV4dGxiWzEyXVtFWF9UTEJfU0laRSAvIHNpemVvZih1NjQpXTsKIAl1NjQgZXhtY1s4XTsJCS8qIHVzZWQgZm9yIG1hY2hpbmUgY2hlY2tzICovCiAJdTY0IGV4Y3JpdFs4XTsJCS8qIHVzZWQgZm9yIGNyaXQgaW50ZXJydXB0cyAqLwogCXU2NCBleGRiZ1s4XTsJCS8qIHVzZWQgZm9yIGRlYnVnIGludGVycnVwdHMgKi8KQEAgLTE0Niw3ICsxNDksNyBAQAogCXU4IGlvX3N5bmM7CQkJLyogd3JpdGVsKCkgbmVlZHMgc3Bpbl91bmxvY2sgc3luYyAqLwogCXU4IGlycV93b3JrX3BlbmRpbmc7CQkvKiBJUlFfV09SSyBpbnRlcnJ1cHQgd2hpbGUgc29mdC1kaXNhYmxlICovCiAJdTggbmFwX3N0YXRlX2xvc3Q7CQkvKiBOViBHUFIgdmFsdWVzIGxvc3QgaW4gcG93ZXI3X2lkbGUgKi8KLQl1NjQgc3ByZzM7CQkJLyogU2F2ZWQgdXNlci12aXNpYmxlIHNwcmcgKi8KKwl1NjQgc3ByZ192ZHNvOwkJCS8qIFNhdmVkIHVzZXItdmlzaWJsZSBzcHJnICovCiAjaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQogCXU2NCB0bV9zY3JhdGNoOyAgICAgICAgICAgICAgICAgLyogVE0gc2NyYXRjaCBhcmVhIGZvciByZWNsYWltICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3NlcnZlci5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnRfc2VydmVyLmgKaW5kZXggM2ZkMmYxYjYuLjllZDczNzE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9zZXJ2ZXIuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9zZXJ2ZXIuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPHVhcGkvYXNtL3BlcmZfZXZlbnQuaD4KIAorLyogVXBkYXRlIHBlcmZfZXZlbnRfcHJpbnRfZGVidWcoKSBpZiB0aGlzIGNoYW5nZXMgKi8KICNkZWZpbmUgTUFYX0hXRVZFTlRTCQk4CiAjZGVmaW5lIE1BWF9FVkVOVF9BTFRFUk5BVElWRVMJOAogI2RlZmluZSBNQVhfTElNSVRFRF9IV0NPVU5URVJTCTIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBiNjJkZTQzLi5kNjYwZGMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC00NTAsNiArNDUwLDcgQEAKIAogZXh0ZXJuIGludCBwb3dlcnNhdmVfbmFwOwkvKiBzZXQgaWYgbmFwIG1vZGUgY2FuIGJlIHVzZWQgaW4gaWRsZSBsb29wICovCiBleHRlcm4gdm9pZCBwb3dlcjdfbmFwKHZvaWQpOworZXh0ZXJuIHZvaWQgcG93ZXI3X3NsZWVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgZmx1c2hfaW5zdHJ1Y3Rpb25fY2FjaGUodm9pZCk7CiBleHRlcm4gdm9pZCBoYXJkX3Jlc2V0X25vdyh2b2lkKTsKIGV4dGVybiB2b2lkIHBvd2Vyb2ZmX25vdyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaAppbmRleCA5MGMwNmVjLi4xYTM2YjhlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCkBAIC01NzcsOSArNTc3LDEzIEBACiAjZGVmaW5lIFNQUk5fU1BSRzMJMHgxMTMJLyogU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyIEdlbmVyYWwgMyAqLwogI2RlZmluZSBTUFJOX1VTUFJHMwkweDEwMwkvKiBTUFJHMyB1c2Vyc3BhY2UgcmVhZCAqLwogI2RlZmluZSBTUFJOX1NQUkc0CTB4MTE0CS8qIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlciBHZW5lcmFsIDQgKi8KKyNkZWZpbmUgU1BSTl9VU1BSRzQJMHgxMDQJLyogU1BSRzQgdXNlcnNwYWNlIHJlYWQgKi8KICNkZWZpbmUgU1BSTl9TUFJHNQkweDExNQkvKiBTcGVjaWFsIFB1cnBvc2UgUmVnaXN0ZXIgR2VuZXJhbCA1ICovCisjZGVmaW5lIFNQUk5fVVNQUkc1CTB4MTA1CS8qIFNQUkc1IHVzZXJzcGFjZSByZWFkICovCiAjZGVmaW5lIFNQUk5fU1BSRzYJMHgxMTYJLyogU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyIEdlbmVyYWwgNiAqLworI2RlZmluZSBTUFJOX1VTUFJHNgkweDEwNgkvKiBTUFJHNiB1c2Vyc3BhY2UgcmVhZCAqLwogI2RlZmluZSBTUFJOX1NQUkc3CTB4MTE3CS8qIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlciBHZW5lcmFsIDcgKi8KKyNkZWZpbmUgU1BSTl9VU1BSRzcJMHgxMDcJLyogU1BSRzcgdXNlcnNwYWNlIHJlYWQgKi8KICNkZWZpbmUgU1BSTl9TUlIwCTB4MDFBCS8qIFNhdmUvUmVzdG9yZSBSZWdpc3RlciAwICovCiAjZGVmaW5lIFNQUk5fU1JSMQkweDAxQgkvKiBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSAgIFNSUjFfSVNJX05PUFQJCTB4NDAwMDAwMDAgLyogSVNJOiBOb3QgZm91bmQgaW4gaGFzaCAqLwpAQCAtNjY0LDEyICs2NjgsMTQgQEAKICNkZWZpbmUgICBNTUNSMF9QTVhFCTB4MDQwMDAwMDBVTCAvKiBwZXJmb3JtYW5jZSBtb25pdG9yIGV4Y2VwdGlvbiBlbmFibGUgKi8KICNkZWZpbmUgICBNTUNSMF9GQ0VDRQkweDAyMDAwMDAwVUwgLyogZnJlZXplIGN0cnMgb24gZW5hYmxlZCBjb25kIG9yIGV2ZW50ICovCiAjZGVmaW5lICAgTU1DUjBfVEJFRQkweDAwNDAwMDAwVUwgLyogdGltZSBiYXNlIGV4Y2VwdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgICBNTUNSMF9CSFJCQQkweDAwMjAwMDAwVUwgLyogQkhSQiBBY2Nlc3MgYWxsb3dlZCBpbiB1c2Vyc3BhY2UgKi8KICNkZWZpbmUgICBNTUNSMF9FQkUJMHgwMDEwMDAwMFVMIC8qIEV2ZW50IGJhc2VkIGJyYW5jaCBlbmFibGUgKi8KICNkZWZpbmUgICBNTUNSMF9QTUNDCTB4MDAwYzAwMDBVTCAvKiBQTUMgY29udHJvbCAqLwogI2RlZmluZSAgIE1NQ1IwX1BNQ0NfVTYJMHgwMDA4MDAwMFVMIC8qIFBNQzEtNiBhcmUgUi9XIGJ5IHVzZXIgKFBSKSAqLwogI2RlZmluZSAgIE1NQ1IwX1BNQzFDRQkweDAwMDA4MDAwVUwgLyogUE1DMSBjb3VudCBlbmFibGUqLwogI2RlZmluZSAgIE1NQ1IwX1BNQ2pDRQkweDAwMDA0MDAwVUwgLyogUE1DaiBjb3VudCBlbmFibGUqLwogI2RlZmluZSAgIE1NQ1IwX1RSSUdHRVIJMHgwMDAwMjAwMFVMIC8qIFRSSUdHRVIgZW5hYmxlICovCisjZGVmaW5lICAgTU1DUjBfUE1BT19TWU5DIDB4MDAwMDA4MDBVTCAvKiBQTVUgaW50ZXJydXB0IGlzIHN5bmNocm9ub3VzICovCiAjZGVmaW5lICAgTU1DUjBfUE1BTwkweDAwMDAwMDgwVUwgLyogcGVyZm9ybWFuY2UgbW9uaXRvciBhbGVydCBoYXMgb2NjdXJyZWQsIHNldCB0byAwIGFmdGVyIGhhbmRsaW5nIGV4Y2VwdGlvbiAqLwogI2RlZmluZSAgIE1NQ1IwX1NIUkZDCTB4MDAwMDAwNDBVTCAvKiBTSFJyZSBmcmVlemUgY29uZGl0aW9ucyBiZXR3ZWVuIHRocmVhZHMgKi8KICNkZWZpbmUgICBNTUNSMF9GQzU2CTB4MDAwMDAwMTBVTCAvKiBmcmVlemUgY291bnRlcnMgNSBhbmQgNiAqLwpAQCAtNzAzLDYgKzcwOSw3IEBACiAjZGVmaW5lIFNQUk5fRUJCSFIJODA0CS8qIEV2ZW50IGJhc2VkIGJyYW5jaCBoYW5kbGVyIHJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fRUJCUlIJODA1CS8qIEV2ZW50IGJhc2VkIGJyYW5jaCByZXR1cm4gcmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9CRVNDUgk4MDYJLyogQnJhbmNoIGV2ZW50IHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgIEJFU0NSX0dFCTB4ODAwMDAwMDAwMDAwMDAwMFVMTCAvKiBHbG9iYWwgRW5hYmxlICovCiAjZGVmaW5lIFNQUk5fV09SVAk4OTUJLyogV29ya2xvYWQgb3B0aW1pemF0aW9uIHJlZ2lzdGVyIC0gdGhyZWFkICovCiAKICNkZWZpbmUgU1BSTl9QTUMxCTc4NwpAQCAtODc5LDExICs4ODYsMTAgQEAKICAqIDY0LWJpdCBlbWJlZGRlZAogICoJLSBTUFJHMCBnZW5lcmljIGV4Y2VwdGlvbiBzY3JhdGNoCiAgKgktIFNQUkcyIFRMQiBleGNlcHRpb24gc3RhY2sKLSAqCS0gU1BSRzMgY3JpdGljYWwgZXhjZXB0aW9uIHNjcmF0Y2ggYW5kCi0gKiAgICAgICAgQ1BVIGFuZCBOVU1BIG5vZGUgZm9yIFZEU08gZ2V0Y3B1ICh1c2VyIHZpc2libGUpCisgKgktIFNQUkczIGNyaXRpY2FsIGV4Y2VwdGlvbiBzY3JhdGNoICh1c2VyIHZpc2libGUsIHNvcnJ5ISkKICAqCS0gU1BSRzQgdW51c2VkICh1c2VyIHZpc2libGUpCiAgKgktIFNQUkc2IFRMQiBtaXNzIHNjcmF0Y2ggKHVzZXIgdmlzaWJsZSwgc29ycnkgISkKLSAqCS0gU1BSRzcgY3JpdGljYWwgZXhjZXB0aW9uIHNjcmF0Y2gKKyAqCS0gU1BSRzcgQ1BVIGFuZCBOVU1BIG5vZGUgZm9yIFZEU08gZ2V0Y3B1ICh1c2VyIHZpc2libGUpCiAgKgktIFNQUkc4IG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIHNjcmF0Y2gKICAqCS0gU1BSRzkgZGVidWcgZXhjZXB0aW9uIHNjcmF0Y2gKICAqCkBAIC05NDAsNiArOTQ2LDggQEAKICNkZWZpbmUgU1BSTl9TUFJHX1NDUkFUQ0gwCVNQUk5fU1BSRzIKICNkZWZpbmUgU1BSTl9TUFJHX0hQQUNBCQlTUFJOX0hTUFJHMAogI2RlZmluZSBTUFJOX1NQUkdfSFNDUkFUQ0gwCVNQUk5fSFNQUkcxCisjZGVmaW5lIFNQUk5fU1BSR19WRFNPX1JFQUQJU1BSTl9VU1BSRzMKKyNkZWZpbmUgU1BSTl9TUFJHX1ZEU09fV1JJVEUJU1BSTl9TUFJHMwogCiAjZGVmaW5lIEdFVF9QQUNBKHJYKQkJCQkJXAogCUJFR0lOX0ZUUl9TRUNUSU9OX05FU1RFRCg2Nik7CQkJXApAQCAtOTgzLDYgKzk5MSw4IEBACiAjZGVmaW5lIFNQUk5fU1BSR19UTEJfU0NSQVRDSAlTUFJOX1NQUkc2CiAjZGVmaW5lIFNQUk5fU1BSR19HRU5fU0NSQVRDSAlTUFJOX1NQUkcwCiAjZGVmaW5lIFNQUk5fU1BSR19HREJFTExfU0NSQVRDSCBTUFJOX1NQUkdfR0VOX1NDUkFUQ0gKKyNkZWZpbmUgU1BSTl9TUFJHX1ZEU09fUkVBRAlTUFJOX1VTUFJHNworI2RlZmluZSBTUFJOX1NQUkdfVkRTT19XUklURQlTUFJOX1NQUkc3CiAKICNkZWZpbmUgU0VUX1BBQ0EoclgpCW10c3ByCVNQUk5fU1BSR19QQUNBLHJYCiAjZGVmaW5lIEdFVF9QQUNBKHJYKQltZnNwcglyWCxTUFJOX1NQUkdfUEFDQQpAQCAtMTEwMiw2ICsxMTEyLDggQEAKICNkZWZpbmUgUFZSXzg1NjAJMHg4MDIwMDAwMAogI2RlZmluZSBQVlJfVkVSX0U1MDBWMQkweDgwMjAKICNkZWZpbmUgUFZSX1ZFUl9FNTAwVjIJMHg4MDIxCisjZGVmaW5lIFBWUl9WRVJfRTUwME1DCTB4ODAyMworI2RlZmluZSBQVlJfVkVSX0U1NTAwCTB4ODAyNAogI2RlZmluZSBQVlJfVkVSX0U2NTAwCTB4ODA0MAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmgKaW5kZXggOWJkNTJjNi4uYTBlMWFkZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcnRhcy5oCkBAIC0yODMsNiArMjgzLDcgQEAKIAogI2lmZGVmIENPTkZJR19QUENfUFNFUklFUwogZXh0ZXJuIGludCBwc2VyaWVzX2RldmljZXRyZWVfdXBkYXRlKHMzMiBzY29wZSk7CitleHRlcm4gdm9pZCBwb3N0X21vYmlsaXR5X2ZpeHVwKHZvaWQpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDX1JUQVNfREFFTU9OCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggMDg0ZTA4MC4uZmY1MTA0NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMTIwLDcgKzEyMCw3IEBACiAgKiBpbiAvcHJvYy9pbnRlcnJ1cHRzIHdpbGwgYmUgd3JvbmchISEgLS1Ucm95ICovCiAjZGVmaW5lIFBQQ19NU0dfQ0FMTF9GVU5DVElPTiAgIDAKICNkZWZpbmUgUFBDX01TR19SRVNDSEVEVUxFICAgICAgMQotI2RlZmluZSBQUENfTVNHX0NBTExfRlVOQ19TSU5HTEUJMgorI2RlZmluZSBQUENfTVNHX1RJQ0tfQlJPQURDQVNUCTIKICNkZWZpbmUgUFBDX01TR19ERUJVR0dFUl9CUkVBSyAgMwogCiAvKiBmb3IgaXJxIGNvbnRyb2xsZXJzIHRoYXQgaGF2ZSBkZWRpY2F0ZWQgaXBpcyBwZXIgbWVzc2FnZSAoNCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90aW1lLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGltZS5oCmluZGV4IGMxZjI2NzYuLjFkNDI4ZTYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGltZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90aW1lLmgKQEAgLTI4LDYgKzI4LDcgQEAKIHN0cnVjdCBydGNfdGltZTsKIGV4dGVybiB2b2lkIHRvX3RtKGludCB0aW0sIHN0cnVjdCBydGNfdGltZSAqIHRtKTsKIGV4dGVybiB2b2lkIEdyZWdvcmlhbkRheShzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKK2V4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X2lwaV9oYW5kbGVyKHZvaWQpOwogCiBleHRlcm4gdm9pZCBnZW5lcmljX2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IGQwYjVmY2EuLmM5MjAyMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC05OSw3ICs5OSw2IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+Ci0jZGVmaW5lIHNtdF9jYXBhYmxlKCkJCShjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGI1YWFjZjcuLmRiYTgxNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCURFRklORShQQUNBX1NZU1RFTV9USU1FLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHN5c3RlbV90aW1lKSk7CiAJREVGSU5FKFBBQ0FfVFJBUF9TQVZFLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHRyYXBfc2F2ZSkpOwogCURFRklORShQQUNBX05BUFNUQVRFTE9TVCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBuYXBfc3RhdGVfbG9zdCkpOwotCURFRklORShQQUNBX1NQUkczLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNwcmczKSk7CisJREVGSU5FKFBBQ0FfU1BSR19WRFNPLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNwcmdfdmRzbykpOwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAJLyogUlRBUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMKaW5kZXggMjkxMmI4Ny4uNDAxOThkNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5jCkBAIC03NTYsNyArNzU2LDEwIEBACiAJY2FjaGVpbmZvX3N5c2ZzX3BvcHVsYXRlKGNwdV9pZCwgY2FjaGUpOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVIC8qIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIGNwdSBvZmZsaW5lICovCisvKiBmdW5jdGlvbnMgbmVlZGVkIHRvIHJlbW92ZSBjYWNoZSBlbnRyeSBmb3IgY3B1IG9mZmxpbmUgb3Igc3VzcGVuZC9yZXN1bWUgKi8KKworI2lmIChkZWZpbmVkKENPTkZJR19QUENfUFNFUklFUykgJiYgZGVmaW5lZChDT05GSUdfU1VTUEVORCkpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkKIAogc3RhdGljIHN0cnVjdCBjYWNoZSAqY2FjaGVfbG9va3VwX2J5X2NwdSh1bnNpZ25lZCBpbnQgY3B1X2lkKQogewpAQCAtODQzLDQgKzg0Niw0IEBACiAJaWYgKGNhY2hlKQogCQljYWNoZV9jcHVfY2xlYXIoY2FjaGUsIGNwdV9pZCk7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisjZW5kaWYgLyogKENPTkZJR19QUENfUFNFUklFUyAmJiBDT05GSUdfU1VTUEVORCkgfHwgQ09ORklHX0hPVFBMVUdfQ1BVICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggNmM4ZGQ1ZC4uYzFmYWFkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtNTEwLDcgKzUxMCw3IEBACiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDA0YjAwMDAsCiAJCS5jcHVfbmFtZQkJPSAiUE9XRVI4RSAocmF3KSIsCi0JCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfUE9XRVI4LAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSOEUsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BPV0VSOCwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzMgk9IENPTU1PTl9VU0VSMl9QT1dFUjgsCiAJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUlNfUE9XRVI4LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYwppbmRleCBmZGM2NzlkLi5iYjYxY2E1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYwpAQCAtMTQzLDEzICsxNDMsMzAgQEAKIHN0YXRpYyB2b2lkIGVlaF9lbmFibGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGVlaF9kZXYgKmVkZXYgPSBwY2lfZGV2X3RvX2VlaF9kZXYoZGV2KTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAKIAlpZiAoKGVkZXYtPm1vZGUpICYgRUVIX0RFVl9JUlFfRElTQUJMRUQpIHsKIAkJZWRldi0+bW9kZSAmPSB+RUVIX0RFVl9JUlFfRElTQUJMRUQ7Ci0KLQkJZGVzYyA9IGlycV90b19kZXNjKGRldi0+aXJxKTsKLQkJaWYgKGRlc2MgJiYgZGVzYy0+ZGVwdGggPiAwKQorCQkvKgorCQkgKiBGSVhNRSAhISEhIQorCQkgKgorCQkgKiBUaGlzIGlzIGp1c3QgYXNzIGJhY2t3YXJkcy4gVGhpcyBtYXplIGhhcworCQkgKiB1bmJhbGFuY2VkIGlycV9lbmFibGUvZGlzYWJsZSBjYWxscy4gU28gaW5zdGVhZCBvZgorCQkgKiBmaW5kaW5nIHRoZSByb290IGNhdXNlIGl0IHdvcmtzIGFyb3VuZCB0aGUgd2FybmluZworCQkgKiBpbiB0aGUgaXJxX2VuYWJsZSBjb2RlIGJ5IGNvbmRpdGlvbmFsbHkgY2FsbGluZworCQkgKiBpbnRvIGl0LgorCQkgKgorCQkgKiBUaGF0J3MganVzdCB3cm9uZy5UaGUgd2FybmluZyBpbiB0aGUgY29yZSBjb2RlIGlzCisJCSAqIHRoZXJlIHRvIHRlbGwgcGVvcGxlIHRvIGZpeCB0aGVpciBhc3N5bWV0cmllcyBpbgorCQkgKiB0aGVpciBvd24gY29kZSwgbm90IGJ5IGFidXNpbmcgdGhlIGNvcmUgaW5mb3JtYXRpb24KKwkJICogdG8gYXZvaWQgaXQuCisJCSAqCisJCSAqIEkgc28gd2lzaCB0aGF0IHRoZSBhc3N5bWV0cnkgd291bGQgYmUgdGhlIG90aGVyIHdheQorCQkgKiByb3VuZCBhbmQgYSBmZXcgbW9yZSBpcnFfZGlzYWJsZSBjYWxscyByZW5kZXIgdGhhdAorCQkgKiBzaGl0IHVudXNhYmxlIGZvcmV2ZXIuCisJCSAqCisJCSAqCXRnbHgKKwkJICovCisJCWlmIChpcnFkX2lycV9kaXNhYmxlZChpcnFfZ2V0X2lycV9kYXRhKGRldi0+aXJxKSkpCiAJCQllbmFibGVfaXJxKGRldi0+aXJxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMKaW5kZXggMDYzYjY1ZC4uYzFiZWUzYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUwpAQCAtMzQsNyArMzQsMjUwIEBACiAgKiAgICAgc3BlY2lhbCBpbnRlcnJ1cHRzIGZyb20gd2l0aGluIGEgbm9uLXN0YW5kYXJkIGxldmVsIHdpbGwgcHJvYmFibHkKICAqICAgICBibG93IHlvdSB1cAogICovCi0jZGVmaW5lCVNQRUNJQUxfRVhDX0ZSQU1FX1NJWkUJSU5UX0ZSQU1FX1NJWkUKKyNkZWZpbmUgU1BFQ0lBTF9FWENfU1JSMAkwCisjZGVmaW5lIFNQRUNJQUxfRVhDX1NSUjEJMQorI2RlZmluZSBTUEVDSUFMX0VYQ19TUFJHX0dFTgkyCisjZGVmaW5lIFNQRUNJQUxfRVhDX1NQUkdfVExCCTMKKyNkZWZpbmUgU1BFQ0lBTF9FWENfTUFTMAk0CisjZGVmaW5lIFNQRUNJQUxfRVhDX01BUzEJNQorI2RlZmluZSBTUEVDSUFMX0VYQ19NQVMyCTYKKyNkZWZpbmUgU1BFQ0lBTF9FWENfTUFTMwk3CisjZGVmaW5lIFNQRUNJQUxfRVhDX01BUzYJOAorI2RlZmluZSBTUEVDSUFMX0VYQ19NQVM3CTkKKyNkZWZpbmUgU1BFQ0lBTF9FWENfTUFTNQkxMAkvKiBFLkhWIG9ubHkgKi8KKyNkZWZpbmUgU1BFQ0lBTF9FWENfTUFTOAkxMQkvKiBFLkhWIG9ubHkgKi8KKyNkZWZpbmUgU1BFQ0lBTF9FWENfSVJRSEFQUEVORUQJMTIKKyNkZWZpbmUgU1BFQ0lBTF9FWENfREVBUgkxMworI2RlZmluZSBTUEVDSUFMX0VYQ19FU1IJCTE0CisjZGVmaW5lIFNQRUNJQUxfRVhDX1NPRlRFCTE1CisjZGVmaW5lIFNQRUNJQUxfRVhDX0NTUlIwCTE2CisjZGVmaW5lIFNQRUNJQUxfRVhDX0NTUlIxCTE3CisvKiBtdXN0IGJlIGV2ZW4gdG8ga2VlcCAxNi1ieXRlIHN0YWNrIGFsaWdubWVudCAqLworI2RlZmluZSBTUEVDSUFMX0VYQ19FTkQJCTE4CisKKyNkZWZpbmUgU1BFQ0lBTF9FWENfRlJBTUVfU0laRQkoSU5UX0ZSQU1FX1NJWkUgKyBTUEVDSUFMX0VYQ19FTkQgKiA4KQorI2RlZmluZSBTUEVDSUFMX0VYQ19GUkFNRV9PRkZTICAoSU5UX0ZSQU1FX1NJWkUgLSAyODgpCisKKyNkZWZpbmUgU1BFQ0lBTF9FWENfU1RPUkUocmVnLCBuYW1lKSBcCisJc3RkCXJlZywgKFNQRUNJQUxfRVhDXyMjbmFtZSAqIDggKyBTUEVDSUFMX0VYQ19GUkFNRV9PRkZTKShyMSkKKworI2RlZmluZSBTUEVDSUFMX0VYQ19MT0FEKHJlZywgbmFtZSkgXAorCWxkCXJlZywgKFNQRUNJQUxfRVhDXyMjbmFtZSAqIDggKyBTUEVDSUFMX0VYQ19GUkFNRV9PRkZTKShyMSkKKworc3BlY2lhbF9yZWdfc2F2ZToKKwlsYnoJcjksUEFDQUlSUUhBUFBFTkVEKHIxMykKKwlSRUNPTkNJTEVfSVJRX1NUQVRFKHIzLHI0KQorCisJLyoKKwkgKiBXZSBvbmx5IG5lZWQgKG9yIGhhdmUgc3RhY2sgc3BhY2UpIHRvIHNhdmUgdGhpcyBzdHVmZiBpZgorCSAqIHdlIGludGVycnVwdGVkIHRoZSBrZXJuZWwuCisJICovCisJbGQJcjMsX01TUihyMSkKKwlhbmRpLglyMyxyMyxNU1JfUFIKKwlibmVscgorCisJLyogQ29weSBpbmZvIGludG8gdGVtcG9yYXJ5IGV4Y2VwdGlvbiB0aHJlYWQgaW5mbyAqLworCWxkCXIxMSxQQUNBS1NBVkUocjEzKQorCUNVUlJFTlRfVEhSRUFEX0lORk8ocjExLCByMTEpCisJQ1VSUkVOVF9USFJFQURfSU5GTyhyMTIsIHIxKQorCWxkCXIxMCxUSV9GTEFHUyhyMTEpCisJc3RkCXIxMCxUSV9GTEFHUyhyMTIpCisJbGQJcjEwLFRJX1BSRUVNUFQocjExKQorCXN0ZAlyMTAsVElfUFJFRU1QVChyMTIpCisJbGQJcjEwLFRJX1RBU0socjExKQorCXN0ZAlyMTAsVElfVEFTSyhyMTIpCisKKwkvKgorCSAqIEFkdmFuY2UgdG8gdGhlIG5leHQgVExCIGV4Y2VwdGlvbiBmcmFtZSBmb3IgaGFuZGxlcgorCSAqIHR5cGVzIHRoYXQgZG9uJ3QgZG8gaXQgYXV0b21hdGljYWxseS4KKwkgKi8KKwlMT0FEX1JFR19BRERSKHIxMSxleHRsYl9sZXZlbF9leGMpCisJbHd6CXIxMiwwKHIxMSkKKwltZnNwcglyMTAsU1BSTl9TUFJHX1RMQl9FWEZSQU1FCisJYWRkCXIxMCxyMTAscjEyCisJbXRzcHIJU1BSTl9TUFJHX1RMQl9FWEZSQU1FLHIxMAorCisJLyoKKwkgKiBTYXZlIHJlZ2lzdGVycyBuZWVkZWQgdG8gYWxsb3cgbmVzdGluZyBvZiBjZXJ0YWluIGV4Y2VwdGlvbnMKKwkgKiAoc3VjaCBhcyBUTEIgbWlzc2VzKSBpbnNpZGUgc3BlY2lhbCBleGNlcHRpb24gbGV2ZWxzCisJICovCisJbWZzcHIJcjEwLFNQUk5fU1JSMAorCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxTUlIwKQorCW1mc3ByCXIxMCxTUFJOX1NSUjEKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsU1JSMSkKKwltZnNwcglyMTAsU1BSTl9TUFJHX0dFTl9TQ1JBVENICisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLFNQUkdfR0VOKQorCW1mc3ByCXIxMCxTUFJOX1NQUkdfVExCX1NDUkFUQ0gKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsU1BSR19UTEIpCisJbWZzcHIJcjEwLFNQUk5fTUFTMAorCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxNQVMwKQorCW1mc3ByCXIxMCxTUFJOX01BUzEKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsTUFTMSkKKwltZnNwcglyMTAsU1BSTl9NQVMyCisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLE1BUzIpCisJbWZzcHIJcjEwLFNQUk5fTUFTMworCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxNQVMzKQorCW1mc3ByCXIxMCxTUFJOX01BUzYKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsTUFTNikKKwltZnNwcglyMTAsU1BSTl9NQVM3CisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLE1BUzcpCitCRUdJTl9GVFJfU0VDVElPTgorCW1mc3ByCXIxMCxTUFJOX01BUzUKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsTUFTNSkKKwltZnNwcglyMTAsU1BSTl9NQVM4CisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLE1BUzgpCisKKwkvKiBNQVM1LzggY291bGQgaGF2ZSBpbmFwcHJvcHJpYXRlIHZhbHVlcyBpZiB3ZSBpbnRlcnJ1cHRlZCBLVk0gY29kZSAqLworCWxpCXIxMCwwCisJbXRzcHIJU1BSTl9NQVM1LHIxMAorCW10c3ByCVNQUk5fTUFTOCxyMTAKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0VNQl9IVikKKwlTUEVDSUFMX0VYQ19TVE9SRShyOSxJUlFIQVBQRU5FRCkKKworCW1mc3ByCXIxMCxTUFJOX0RFQVIKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsREVBUikKKwltZnNwcglyMTAsU1BSTl9FU1IKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsRVNSKQorCisJbGJ6CXIxMCxQQUNBU09GVElSUUVOKHIxMykKKwlTUEVDSUFMX0VYQ19TVE9SRShyMTAsU09GVEUpCisJbGQJcjEwLF9OSVAocjEpCisJU1BFQ0lBTF9FWENfU1RPUkUocjEwLENTUlIwKQorCWxkCXIxMCxfTVNSKHIxKQorCVNQRUNJQUxfRVhDX1NUT1JFKHIxMCxDU1JSMSkKKworCWJscgorCityZXRfZnJvbV9sZXZlbF9leGNlcHQ6CisJbGQJcjMsX01TUihyMSkKKwlhbmRpLglyMyxyMyxNU1JfUFIKKwliZXEJMWYKKwliCXJldF9mcm9tX2V4Y2VwdAorMToKKworCUxPQURfUkVHX0FERFIocjExLGV4dGxiX2xldmVsX2V4YykKKwlsd3oJcjEyLDAocjExKQorCW1mc3ByCXIxMCxTUFJOX1NQUkdfVExCX0VYRlJBTUUKKwlzdWIJcjEwLHIxMCxyMTIKKwltdHNwcglTUFJOX1NQUkdfVExCX0VYRlJBTUUscjEwCisKKwkvKgorCSAqIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgc3BlY2lhbCBsZXZlbCBleGNlcHRpb24gaW50ZXJydXB0ZWQgYQorCSAqIFRMQiBtaXNzIGhhbmRsZXIsIGFuZCBpbnNlcnRlZCB0aGUgc2FtZSBlbnRyeSB0aGF0IHRoZQorCSAqIGludGVycnVwdGVkIGhhbmRsZXIgd2FzIGFib3V0IHRvIGluc2VydC4gIE9uIENQVXMgd2l0aG91dCBUTEIKKwkgKiB3cml0ZSBjb25kaXRpb25hbCwgdGhpcyBjYW4gcmVzdWx0IGluIGEgZHVwbGljYXRlIFRMQiBlbnRyeS4KKwkgKiBXaXBlIGFsbCBub24tYm9sdGVkIGVudHJpZXMgdG8gYmUgc2FmZS4KKwkgKgorCSAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgcHJvdGVjdCBhZ2FpbnN0IGFueSBUTEIgbWlzc2VzCisJICogd2UgbWF5IHRha2UgYWNjZXNzaW5nIHRoZSBzdGFjayBmcm9tIGhlcmUgdG8gdGhlIGVuZCBvZgorCSAqIHRoZSBzcGVjaWFsIGxldmVsIGV4Y2VwdGlvbi4gIEl0J3Mgbm90IGNsZWFyIGhvdyB3ZSBjYW4KKwkgKiByZWFzb25hYmx5IHByb3RlY3QgYWdhaW5zdCB0aGF0LCBidXQgb25seSBDUFVzIHdpdGgKKwkgKiBuZWl0aGVyIFRMQiB3cml0ZSBjb25kaXRpb25hbCBub3IgYm9sdGVkIGtlcm5lbCBtZW1vcnkKKwkgKiBhcmUgYWZmZWN0ZWQuICBEbyBhbnkgc3VjaCBDUFVzIGV2ZW4gZXhpc3Q/CisJICovCisJUFBDX1RMQklMWF9BTEwoMCxSMCkKKworCVJFU1RfTlZHUFJTKHIxKQorCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsU1JSMCkKKwltdHNwcglTUFJOX1NSUjAscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsU1JSMSkKKwltdHNwcglTUFJOX1NSUjEscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsU1BSR19HRU4pCisJbXRzcHIJU1BSTl9TUFJHX0dFTl9TQ1JBVENILHIxMAorCVNQRUNJQUxfRVhDX0xPQUQocjEwLFNQUkdfVExCKQorCW10c3ByCVNQUk5fU1BSR19UTEJfU0NSQVRDSCxyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxNQVMwKQorCW10c3ByCVNQUk5fTUFTMCxyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxNQVMxKQorCW10c3ByCVNQUk5fTUFTMSxyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxNQVMyKQorCW10c3ByCVNQUk5fTUFTMixyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxNQVMzKQorCW10c3ByCVNQUk5fTUFTMyxyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxNQVM2KQorCW10c3ByCVNQUk5fTUFTNixyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxNQVM3KQorCW10c3ByCVNQUk5fTUFTNyxyMTAKK0JFR0lOX0ZUUl9TRUNUSU9OCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTNSkKKwltdHNwcglTUFJOX01BUzUscjEwCisJU1BFQ0lBTF9FWENfTE9BRChyMTAsTUFTOCkKKwltdHNwcglTUFJOX01BUzgscjEwCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9FTUJfSFYpCisKKwlsYnoJcjYsUEFDQVNPRlRJUlFFTihyMTMpCisJbGQJcjUsU09GVEUocjEpCisKKwkvKiBJbnRlcnJ1cHRzIGhhZCBiZXR0ZXIgbm90IGFscmVhZHkgYmUgZW5hYmxlZC4uLiAqLworCXR3bmVpCXI2LDAKKworCWNtcHdpCWNyMCxyNSwwCisJYmVxCTFmCisKKwlUUkFDRV9FTkFCTEVfSU5UUworCXN0YglyNSxQQUNBU09GVElSUUVOKHIxMykKKzE6CisJLyoKKwkgKiBSZXN0b3JlIFBBQ0FJUlFIQVBQRU5FRCByYXRoZXIgdGhhbiBzZXR0aW5nIGl0IGJhc2VkIG9uCisJICogdGhlIHJldHVybiBNU1JbRUVdLCBzaW5jZSB3ZSBjb3VsZCBoYXZlIGludGVycnVwdGVkCisJICogX19jaGVja19pcnFfcmVwbGF5KCkgb3Igb3RoZXIgaW5jb25zaXN0ZW50IHRyYW5zaXRvcnkKKwkgKiBzdGF0ZXMgdGhhdCBtdXN0IHJlbWFpbiB0aGF0IHdheS4KKwkgKi8KKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxJUlFIQVBQRU5FRCkKKwlzdGIJcjEwLFBBQ0FJUlFIQVBQRU5FRChyMTMpCisKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxERUFSKQorCW10c3ByCVNQUk5fREVBUixyMTAKKwlTUEVDSUFMX0VYQ19MT0FEKHIxMCxFU1IpCisJbXRzcHIJU1BSTl9FU1IscjEwCisKKwlzdGRjeC4JcjAsMCxyMQkJLyogdG8gY2xlYXIgdGhlIHJlc2VydmF0aW9uICovCisKKwlSRVNUXzRHUFJTKDIsIHIxKQorCVJFU1RfNEdQUlMoNiwgcjEpCisKKwlsZAlyMTAsX0NUUihyMSkKKwlsZAlyMTEsX1hFUihyMSkKKwltdGN0cglyMTAKKwltdHhlcglyMTEKKworCWJscgorCisubWFjcm8gcmV0X2Zyb21fbGV2ZWwgc3JyMCBzcnIxIHBhY2FfZXggc2NyYXRjaAorCWJsCXJldF9mcm9tX2xldmVsX2V4Y2VwdAorCisJbGQJcjEwLF9MSU5LKHIxKQorCWxkCXIxMSxfQ0NSKHIxKQorCWxkCXIwLEdQUjEzKHIxKQorCW10bHIJcjEwCisJbXRjcglyMTEKKworCWxkCXIxMCxHUFIxMChyMSkKKwlsZAlyMTEsR1BSMTEocjEpCisJbGQJcjEyLEdQUjEyKHIxKQorCW10c3ByCVxzY3JhdGNoLHIwCisKKwlzdGQJcjEwLFxwYWNhX2V4K0VYX1IxMChyMTMpOworCXN0ZAlyMTEsXHBhY2FfZXgrRVhfUjExKHIxMyk7CisJbGQJcjEwLF9OSVAocjEpCisJbGQJcjExLF9NU1IocjEpCisJbGQJcjAsR1BSMChyMSkKKwlsZAlyMSxHUFIxKHIxKQorCW10c3ByCVxzcnIwLHIxMAorCW10c3ByCVxzcnIxLHIxMQorCWxkCXIxMCxccGFjYV9leCtFWF9SMTAocjEzKQorCWxkCXIxMSxccGFjYV9leCtFWF9SMTEocjEzKQorCW1mc3ByCXIxMyxcc2NyYXRjaAorLmVuZG0KKworcmV0X2Zyb21fY3JpdF9leGNlcHQ6CisJcmV0X2Zyb21fbGV2ZWwgU1BSTl9DU1JSMCBTUFJOX0NTUlIxIFBBQ0FfRVhDUklUIFNQUk5fU1BSR19DUklUX1NDUkFUQ0gKKwlyZmNpCisKK3JldF9mcm9tX21jX2V4Y2VwdDoKKwlyZXRfZnJvbV9sZXZlbCBTUFJOX01DU1JSMCBTUFJOX01DU1JSMSBQQUNBX0VYTUMgU1BSTl9TUFJHX01DX1NDUkFUQ0gKKwlyZm1jaQogCiAvKiBFeGNlcHRpb24gcHJvbG9nIGNvZGUgZm9yIGFsbCBleGNlcHRpb25zICovCiAjZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0cobiwgaW50bnVtLCB0eXBlLCBhZGRpdGlvbikJICAgIAkJICAgIFwKQEAgLTQyLDcgKzI4NSw2IEBACiAJbWZzcHIJcjEzLFNQUk5fU1BSR19QQUNBOwkvKiBnZXQgUEFDQSAqLwkJCSAgICBcCiAJc3RkCXIxMCxQQUNBX0VYIyN0eXBlK0VYX1IxMChyMTMpOwkJCQkgICAgXAogCXN0ZAlyMTEsUEFDQV9FWCMjdHlwZStFWF9SMTEocjEzKTsJCQkJICAgIFwKLQlQUk9MT0dfU1RPUkVfUkVTVE9SRV9TQ1JBVENIXyMjdHlwZTsJCQkJICAgIFwKIAltZmNyCXIxMDsJCQkvKiBzYXZlIENSICovCQkJICAgIFwKIAltZnNwcglyMTEsU1BSTl8jI3R5cGUjI19TUlIxOy8qIHdoYXQgYXJlIHdlIGNvbWluZyBmcm9tICovCSAgICBcCiAJRE9fS1ZNCWludG51bSxTUFJOXyMjdHlwZSMjX1NSUjE7ICAgIC8qIEtWTSBob29rICovCQkgICAgXApAQCAtNjksMTkgKzMxMSwxOSBAQAogCiAjZGVmaW5lIENSSVRfU0VUX0tTVEFDSwkJCQkJCSAgICAgICAgICAgIFwKIAlsZAlyMSxQQUNBX0NSSVRfU1RBQ0socjEzKTsJCQkJICAgIFwKLQlzdWJpCXIxLHIxLFNQRUNJQUxfRVhDX0ZSQU1FX1NJWkU7CisJc3ViaQlyMSxyMSxTUEVDSUFMX0VYQ19GUkFNRV9TSVpFCiAjZGVmaW5lIFNQUk5fQ1JJVF9TUlIwCVNQUk5fQ1NSUjAKICNkZWZpbmUgU1BSTl9DUklUX1NSUjEJU1BSTl9DU1JSMQogCiAjZGVmaW5lIERCR19TRVRfS1NUQUNLCQkJCQkJICAgICAgICAgICAgXAogCWxkCXIxLFBBQ0FfREJHX1NUQUNLKHIxMyk7CQkJCQkgICAgXAotCXN1YmkJcjEscjEsU1BFQ0lBTF9FWENfRlJBTUVfU0laRTsKKwlzdWJpCXIxLHIxLFNQRUNJQUxfRVhDX0ZSQU1FX1NJWkUKICNkZWZpbmUgU1BSTl9EQkdfU1JSMAlTUFJOX0RTUlIwCiAjZGVmaW5lIFNQUk5fREJHX1NSUjEJU1BSTl9EU1JSMQogCiAjZGVmaW5lIE1DX1NFVF9LU1RBQ0sJCQkJCQkgICAgICAgICAgICBcCiAJbGQJcjEsUEFDQV9NQ19TVEFDSyhyMTMpOwkJCQkJICAgIFwKLQlzdWJpCXIxLHIxLFNQRUNJQUxfRVhDX0ZSQU1FX1NJWkU7CisJc3ViaQlyMSxyMSxTUEVDSUFMX0VYQ19GUkFNRV9TSVpFCiAjZGVmaW5lIFNQUk5fTUNfU1JSMAlTUFJOX01DU1JSMAogI2RlZmluZSBTUFJOX01DX1NSUjEJU1BSTl9NQ1NSUjEKIApAQCAtMTAwLDIwICszNDIsNiBAQAogI2RlZmluZSBHREJFTExfRVhDRVBUSU9OX1BST0xPRyhuLCBpbnRudW0sIGFkZGl0aW9uKQkJCSAgICBcCiAJRVhDRVBUSU9OX1BST0xPRyhuLCBpbnRudW0sIEdEQkVMTCwgYWRkaXRpb24jI19HREJFTEwobikpCiAKLS8qCi0gKiBTdG9yZSB1c2VyLXZpc2libGUgc2NyYXRjaCBpbiBQQUNBIGV4Y2VwdGlvbiBzbG90cyBhbmQgcmVzdG9yZSBwcm9wZXIgdmFsdWUKLSAqLwotI2RlZmluZSBQUk9MT0dfU1RPUkVfUkVTVE9SRV9TQ1JBVENIX0dFTgotI2RlZmluZSBQUk9MT0dfU1RPUkVfUkVTVE9SRV9TQ1JBVENIX0dEQkVMTAotI2RlZmluZSBQUk9MT0dfU1RPUkVfUkVTVE9SRV9TQ1JBVENIX0RCRwotI2RlZmluZSBQUk9MT0dfU1RPUkVfUkVTVE9SRV9TQ1JBVENIX01DCi0KLSNkZWZpbmUgUFJPTE9HX1NUT1JFX1JFU1RPUkVfU0NSQVRDSF9DUklUCQkJCSAgICBcCi0JbWZzcHIJcjEwLFNQUk5fU1BSR19DUklUX1NDUkFUQ0g7CS8qIGdldCByMTMgKi8JCSAgICBcCi0Jc3RkCXIxMCxQQUNBX0VYQ1JJVCtFWF9SMTMocjEzKTsJCQkJICAgIFwKLQlsZAlyMTEsUEFDQV9TUFJHMyhyMTMpOwkJCQkJICAgIFwKLQltdHNwcglTUFJOX1NQUkdfQ1JJVF9TQ1JBVENILHIxMTsKLQogLyogVmFyaWFudHMgb2YgdGhlICJhZGRpdGlvbiIgYXJndW1lbnQgZm9yIHRoZSBwcm9sb2cKICAqLwogI2RlZmluZSBQUk9MT0dfQURESVRJT05fTk9ORV9HRU4obikKQEAgLTE0NywxMCArMzc1LDggQEAKIAlzdGQJcjE1LFBBQ0FfRVhNQytFWF9SMTUocjEzKQogCiAKLS8qIENvcmUgZXhjZXB0aW9uIGNvZGUgZm9yIGFsbCBleGNlcHRpb25zIGV4Y2VwdCBUTEIgbWlzc2VzLgotICogWFhYOiBOZWVkcyB0byBtYWtlIFNQUk5fU1BSR19HRU4gZGVwZW5kIG9uIGV4Y2VwdGlvbiB0eXBlCi0gKi8KLSNkZWZpbmUgRVhDRVBUSU9OX0NPTU1PTihuLCBleGNmLCBpbnRzKQkJCQkJICAgIFwKKy8qIENvcmUgZXhjZXB0aW9uIGNvZGUgZm9yIGFsbCBleGNlcHRpb25zIGV4Y2VwdCBUTEIgbWlzc2VzLiAqLworI2RlZmluZSBFWENFUFRJT05fQ09NTU9OX0xWTChuLCBzY3JhdGNoLCBleGNmKQkJCQkgICAgXAogZXhjXyMjbiMjX2NvbW1vbjoJCQkJCQkJICAgIFwKIAlzdGQJcjAsR1BSMChyMSk7CQkvKiBzYXZlIHIwIGluIHN0YWNrZnJhbWUgKi8JICAgIFwKIAlzdGQJcjIsR1BSMihyMSk7CQkvKiBzYXZlIHIyIGluIHN0YWNrZnJhbWUgKi8JICAgIFwKQEAgLTE2Myw3ICszODksNyBAQAogCUFDQ09VTlRfQ1BVX1VTRVJfRU5UUlkocjEwLHIxMSk7LyogYWNjb3VudGluZyAodXNlcyBjcjArZXEpICovCSAgICBcCiAyOglsZAlyMyxleGNmK0VYX1IxMChyMTMpOwkvKiBnZXQgYmFjayByMTAgKi8JCSAgICBcCiAJbGQJcjQsZXhjZitFWF9SMTEocjEzKTsJLyogZ2V0IGJhY2sgcjExICovCQkgICAgXAotCW1mc3ByCXI1LFNQUk5fU1BSR19HRU5fU0NSQVRDSDsvKiBnZXQgYmFjayByMTMgKi8JCSAgICBcCisJbWZzcHIJcjUsc2NyYXRjaDsJCS8qIGdldCBiYWNrIHIxMyAqLwkJICAgIFwKIAlzdGQJcjEyLEdQUjEyKHIxKTsJCS8qIHNhdmUgcjEyIGluIHN0YWNrZnJhbWUgKi8JICAgIFwKIAlsZAlyMixQQUNBVE9DKHIxMyk7CS8qIGdldCBrZXJuZWwgVE9DIGludG8gcjIgKi8JICAgIFwKIAltZmxyCXI2OwkJCS8qIHNhdmUgTFIgaW4gc3RhY2tmcmFtZSAqLwkgICAgXApAQCAtMTg3LDI0ICs0MTMsMjkgQEAKIAlzdGQJcjExLFNPRlRFKHIxKTsJCS8qIGFuZCBzYXZlIGl0IHRvIHN0YWNrZnJhbWUgKi8gICAgIFwKIAlzdGQJcjEyLFNUQUNLX0ZSQU1FX09WRVJIRUFELTE2KHIxKTsgLyogbWFyayB0aGUgZnJhbWUgKi8JICAgIFwKIAlzdGQJcjMsX1RSQVAocjEpOwkJLyogc2V0IHRyYXAgbnVtYmVyCQkqLyAgXAotCXN0ZAlyMCxSRVNVTFQocjEpOwkJLyogY2xlYXIgcmVncy0+cmVzdWx0ICovCSAgICBcCi0JaW50czsKKwlzdGQJcjAsUkVTVUxUKHIxKTsJCS8qIGNsZWFyIHJlZ3MtPnJlc3VsdCAqLwogCi0vKiBWYXJpYW50cyBmb3IgdGhlICJpbnRzIiBhcmd1bWVudC4gVGhpcyBvbmUgZG9lcyBub3RoaW5nIHdoZW4gd2Ugd2FudAotICogdG8ga2VlcCBpbnRlcnJ1cHRzIGluIHRoZWlyIG9yaWdpbmFsIHN0YXRlCi0gKi8KLSNkZWZpbmUgSU5UU19LRUVQCisjZGVmaW5lIEVYQ0VQVElPTl9DT01NT04obikgXAorCUVYQ0VQVElPTl9DT01NT05fTFZMKG4sIFNQUk5fU1BSR19HRU5fU0NSQVRDSCwgUEFDQV9FWEdFTikKKyNkZWZpbmUgRVhDRVBUSU9OX0NPTU1PTl9DUklUKG4pIFwKKwlFWENFUFRJT05fQ09NTU9OX0xWTChuLCBTUFJOX1NQUkdfQ1JJVF9TQ1JBVENILCBQQUNBX0VYQ1JJVCkKKyNkZWZpbmUgRVhDRVBUSU9OX0NPTU1PTl9NQyhuKSBcCisJRVhDRVBUSU9OX0NPTU1PTl9MVkwobiwgU1BSTl9TUFJHX01DX1NDUkFUQ0gsIFBBQ0FfRVhNQykKKyNkZWZpbmUgRVhDRVBUSU9OX0NPTU1PTl9EQkcobikgXAorCUVYQ0VQVElPTl9DT01NT05fTFZMKG4sIFNQUk5fU1BSR19EQkdfU0NSQVRDSCwgUEFDQV9FWERCRykKIAotLyogVGhpcyBzZWNvbmQgdmVyc2lvbiBpcyBtZWFudCBmb3IgZXhjZXB0aW9ucyB0aGF0IGRvbid0IGltbWVkaWF0ZWx5Ci0gKiBoYXJkLWVuYWJsZS4gV2Ugc2V0IGEgYml0IGluIHBhY2EtPmlycV9oYXBwZW5lZCB0byBlbnN1cmUgdGhhdAotICogYSBzdWJzZXF1ZW50IGNhbGwgdG8gYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSgpIHdpbGwgcHJvcGVybHkKLSAqIGhhcmQtZW5hYmxlIGFuZCBhdm9pZCB0aGUgZmFzdC1wYXRoLCBhbmQgdGhlbiByZWNvbmNpbGUgaXJxIHN0YXRlLgorLyoKKyAqIFRoaXMgaXMgbWVhbnQgZm9yIGV4Y2VwdGlvbnMgdGhhdCBkb24ndCBpbW1lZGlhdGVseSBoYXJkLWVuYWJsZS4gIFdlCisgKiBzZXQgYSBiaXQgaW4gcGFjYS0+aXJxX2hhcHBlbmVkIHRvIGVuc3VyZSB0aGF0IGEgc3Vic2VxdWVudCBjYWxsIHRvCisgKiBhcmNoX2xvY2FsX2lycV9yZXN0b3JlKCkgd2lsbCBwcm9wZXJseSBoYXJkLWVuYWJsZSBhbmQgYXZvaWQgdGhlCisgKiBmYXN0LXBhdGgsIGFuZCB0aGVuIHJlY29uY2lsZSBpcnEgc3RhdGUuCiAgKi8KICNkZWZpbmUgSU5UU19ESVNBQkxFCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjMscjQpCiAKLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IGV4Y2VwdGlvbnMgdGhhdCB1c2VkIElOVFNfS0VFUCAodGhhdCBkaWQgbm90IHRvdWNoCi0gKiBpcnEgaW5kaWNhdG9ycyBpbiB0aGUgUEFDQSkuIFRoaXMgd2lsbCByZXN0b3JlIE1TUjpFRSB0byBpdCdzIHByZXZpb3VzCi0gKiB2YWx1ZQorLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IGV4Y2VwdGlvbnMgdGhhdCBkb24ndCB1c2UgSU5UU19ESVNBQkxFICh0aGF0IGRpZCBub3QKKyAqIHRvdWNoIGlycSBpbmRpY2F0b3JzIGluIHRoZSBQQUNBKS4gIFRoaXMgd2lsbCByZXN0b3JlIE1TUjpFRSB0byBpdCdzCisgKiBwcmV2aW91cyB2YWx1ZQogICoKICAqIFhYWCBJbiB0aGUgbG9uZyBydW4sIHdlIG1heSB3YW50IHRvIG9wZW4tY29kZSBpdCBpbiBvcmRlciB0byBzZXBhcmF0ZSB0aGUKICAqICAgICBsb2FkIGZyb20gdGhlIHdydGVlLCB0aHVzIGxpbWl0aW5nIHRoZSBsYXRlbmN5IGNhdXNlZCBieSB0aGUgZGVwZW5kZW5jeQpAQCAtMjYyLDcgKzQ5Myw4IEBACiAjZGVmaW5lIE1BU0tBQkxFX0VYQ0VQVElPTih0cmFwbnVtLCBpbnRudW0sIGxhYmVsLCBoZGxyLCBhY2spCQlcCiAJU1RBUlRfRVhDRVBUSU9OKGxhYmVsKTsJCQkJCQlcCiAJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0codHJhcG51bSwgaW50bnVtLCBQUk9MT0dfQURESVRJT05fTUFTS0FCTEUpXAotCUVYQ0VQVElPTl9DT01NT04odHJhcG51bSwgUEFDQV9FWEdFTiwgSU5UU19ESVNBQkxFKQkJXAorCUVYQ0VQVElPTl9DT01NT04odHJhcG51bSkJCQkJCVwKKwlJTlRTX0RJU0FCTEU7CQkJCQkJCVwKIAlhY2socjgpOwkJCQkJCQlcCiAJQ0hFQ0tfTkFQUElORygpOwkJCQkJCVwKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFEOwkJCQlcCkBAIC0yODMsOCArNTE1LDggQEAKIAkuYmFsaWduCTB4MTAwMAogCS5nbG9ibCBpbnRlcnJ1cHRfYmFzZV9ib29rM2UKIGludGVycnVwdF9iYXNlX2Jvb2szZToJCQkJCS8qIGZha2UgdHJhcCAqLwotCUVYQ0VQVElPTl9TVFVCKDB4MDAwLCBtYWNoaW5lX2NoZWNrKQkJLyogMHgwMjAwICovCi0JRVhDRVBUSU9OX1NUVUIoMHgwMjAsIGNyaXRpY2FsX2lucHV0KQkJLyogMHgwNTgwICovCisJRVhDRVBUSU9OX1NUVUIoMHgwMDAsIG1hY2hpbmVfY2hlY2spCisJRVhDRVBUSU9OX1NUVUIoMHgwMjAsIGNyaXRpY2FsX2lucHV0KQkJLyogMHgwMTAwICovCiAJRVhDRVBUSU9OX1NUVUIoMHgwNDAsIGRlYnVnX2NyaXQpCQkvKiAweDBkMDAgKi8KIAlFWENFUFRJT05fU1RVQigweDA2MCwgZGF0YV9zdG9yYWdlKQkJLyogMHgwMzAwICovCiAJRVhDRVBUSU9OX1NUVUIoMHgwODAsIGluc3RydWN0aW9uX3N0b3JhZ2UpCS8qIDB4MDQwMCAqLwpAQCAtMjk5LDggKzUzMSw4IEBACiAJRVhDRVBUSU9OX1NUVUIoMHgxYTAsIHdhdGNoZG9nKQkJCS8qIDB4MDlmMCAqLwogCUVYQ0VQVElPTl9TVFVCKDB4MWMwLCBkYXRhX3RsYl9taXNzKQogCUVYQ0VQVElPTl9TVFVCKDB4MWUwLCBpbnN0cnVjdGlvbl90bGJfbWlzcykKLQlFWENFUFRJT05fU1RVQigweDIwMCwgYWx0aXZlY191bmF2YWlsYWJsZSkJLyogMHgwZjIwICovCi0JRVhDRVBUSU9OX1NUVUIoMHgyMjAsIGFsdGl2ZWNfYXNzaXN0KQkJLyogMHgxNzAwICovCisJRVhDRVBUSU9OX1NUVUIoMHgyMDAsIGFsdGl2ZWNfdW5hdmFpbGFibGUpCisJRVhDRVBUSU9OX1NUVUIoMHgyMjAsIGFsdGl2ZWNfYXNzaXN0KQogCUVYQ0VQVElPTl9TVFVCKDB4MjYwLCBwZXJmbW9uKQogCUVYQ0VQVElPTl9TVFVCKDB4MjgwLCBkb29yYmVsbCkKIAlFWENFUFRJT05fU1RVQigweDJhMCwgZG9vcmJlbGxfY3JpdCkKQEAgLTMxNywyNSArNTQ5LDI1IEBACiAJU1RBUlRfRVhDRVBUSU9OKGNyaXRpY2FsX2lucHV0KTsKIAlDUklUX0VYQ0VQVElPTl9QUk9MT0coMHgxMDAsIEJPT0tFX0lOVEVSUlVQVF9DUklUSUNBTCwKIAkJCSAgICAgIFBST0xPR19BRERJVElPTl9OT05FKQotLy8JRVhDRVBUSU9OX0NPTU1PTigweDEwMCwgUEFDQV9FWENSSVQsIElOVFNfRElTQUJMRSkKLS8vCWJsCXNwZWNpYWxfcmVnX3NhdmVfY3JpdAotLy8JQ0hFQ0tfTkFQUElORygpOwotLy8JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotLy8JYmwJLmNyaXRpY2FsX2V4Y2VwdGlvbgotLy8JYglyZXRfZnJvbV9jcml0X2V4Y2VwdAotCWIJLgorCUVYQ0VQVElPTl9DT01NT05fQ1JJVCgweDEwMCkKKwlibAkuc2F2ZV9udmdwcnMKKwlibAlzcGVjaWFsX3JlZ19zYXZlCisJQ0hFQ0tfTkFQUElORygpOworCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAkudW5rbm93bl9leGNlcHRpb24KKwliCXJldF9mcm9tX2NyaXRfZXhjZXB0CiAKIC8qIE1hY2hpbmUgQ2hlY2sgSW50ZXJydXB0ICovCiAJU1RBUlRfRVhDRVBUSU9OKG1hY2hpbmVfY2hlY2spOwotCU1DX0VYQ0VQVElPTl9QUk9MT0coMHgyMDAsIEJPT0tFX0lOVEVSUlVQVF9NQUNISU5FX0NIRUNLLAorCU1DX0VYQ0VQVElPTl9QUk9MT0coMHgwMDAsIEJPT0tFX0lOVEVSUlVQVF9NQUNISU5FX0NIRUNLLAogCQkJICAgIFBST0xPR19BRERJVElPTl9OT05FKQotLy8JRVhDRVBUSU9OX0NPTU1PTigweDIwMCwgUEFDQV9FWE1DLCBJTlRTX0RJU0FCTEUpCi0vLwlibAlzcGVjaWFsX3JlZ19zYXZlX21jCi0vLwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0vLwlDSEVDS19OQVBQSU5HKCk7Ci0vLwlibAkubWFjaGluZV9jaGVja19leGNlcHRpb24KLS8vCWIJcmV0X2Zyb21fbWNfZXhjZXB0Ci0JYgkuCisJRVhDRVBUSU9OX0NPTU1PTl9NQygweDAwMCkKKwlibAkuc2F2ZV9udmdwcnMKKwlibAlzcGVjaWFsX3JlZ19zYXZlCisJQ0hFQ0tfTkFQUElORygpOworCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAkubWFjaGluZV9jaGVja19leGNlcHRpb24KKwliCXJldF9mcm9tX21jX2V4Y2VwdAogCiAvKiBEYXRhIFN0b3JhZ2UgSW50ZXJydXB0ICovCiAJU1RBUlRfRVhDRVBUSU9OKGRhdGFfc3RvcmFnZSkKQEAgLTM0Myw3ICs1NzUsOCBAQAogCQkJCVBST0xPR19BRERJVElPTl8yUkVHUykKIAltZnNwcglyMTQsU1BSTl9ERUFSCiAJbWZzcHIJcjE1LFNQUk5fRVNSCi0JRVhDRVBUSU9OX0NPTU1PTigweDMwMCwgUEFDQV9FWEdFTiwgSU5UU19ESVNBQkxFKQorCUVYQ0VQVElPTl9DT01NT04oMHgzMDApCisJSU5UU19ESVNBQkxFCiAJYglzdG9yYWdlX2ZhdWx0X2NvbW1vbgogCiAvKiBJbnN0cnVjdGlvbiBTdG9yYWdlIEludGVycnVwdCAqLwpAQCAtMzUyLDcgKzU4NSw4IEBACiAJCQkJUFJPTE9HX0FERElUSU9OXzJSRUdTKQogCWxpCXIxNSwwCiAJbXIJcjE0LHIxMAotCUVYQ0VQVElPTl9DT01NT04oMHg0MDAsIFBBQ0FfRVhHRU4sIElOVFNfRElTQUJMRSkKKwlFWENFUFRJT05fQ09NTU9OKDB4NDAwKQorCUlOVFNfRElTQUJMRQogCWIJc3RvcmFnZV9mYXVsdF9jb21tb24KIAogLyogRXh0ZXJuYWwgSW5wdXQgSW50ZXJydXB0ICovCkBAIC0zNjUsNyArNTk5LDcgQEAKIAkJCQlQUk9MT0dfQURESVRJT05fMlJFR1MpCiAJbWZzcHIJcjE0LFNQUk5fREVBUgogCW1mc3ByCXIxNSxTUFJOX0VTUgotCUVYQ0VQVElPTl9DT01NT04oMHg2MDAsIFBBQ0FfRVhHRU4sIElOVFNfS0VFUCkKKwlFWENFUFRJT05fQ09NTU9OKDB4NjAwKQogCWIJYWxpZ25tZW50X21vcmUJLyogbm8gcm9vbSwgZ28gb3V0IG9mIGxpbmUgKi8KIAogLyogUHJvZ3JhbSBJbnRlcnJ1cHQgKi8KQEAgLTM3Myw3ICs2MDcsOCBAQAogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKDB4NzAwLCBCT09LRV9JTlRFUlJVUFRfUFJPR1JBTSwKIAkJCQlQUk9MT0dfQURESVRJT05fMVJFRykKIAltZnNwcglyMTQsU1BSTl9FU1IKLQlFWENFUFRJT05fQ09NTU9OKDB4NzAwLCBQQUNBX0VYR0VOLCBJTlRTX0RJU0FCTEUpCisJRVhDRVBUSU9OX0NPTU1PTigweDcwMCkKKwlJTlRTX0RJU0FCTEUKIAlzdGQJcjE0LF9EU0lTUihyMSkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJbGQJcjE0LFBBQ0FfRVhHRU4rRVhfUjE0KHIxMykKQEAgLTM4Niw3ICs2MjEsNyBAQAogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKDB4ODAwLCBCT09LRV9JTlRFUlJVUFRfRlBfVU5BVkFJTCwKIAkJCQlQUk9MT0dfQURESVRJT05fTk9ORSkKIAkvKiB3ZSBjYW4gcHJvYmFibHkgZG8gYSBzaG9ydGVyIGV4Y2VwdGlvbiBlbnRyeSBmb3IgdGhhdCBvbmUuLi4gKi8KLQlFWENFUFRJT05fQ09NTU9OKDB4ODAwLCBQQUNBX0VYR0VOLCBJTlRTX0tFRVApCisJRVhDRVBUSU9OX0NPTU1PTigweDgwMCkKIAlsZAlyMTIsX01TUihyMSkKIAlhbmRpLglyMCxyMTIsTVNSX1BSOwogCWJlcS0JMWYKQEAgLTQwMyw3ICs2MzgsNyBAQAogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKDB4MjAwLCBCT09LRV9JTlRFUlJVUFRfU1BFX0FMVElWRUNfVU5BVkFJTCwKIAkJCQlQUk9MT0dfQURESVRJT05fTk9ORSkKIAkvKiB3ZSBjYW4gcHJvYmFibHkgZG8gYSBzaG9ydGVyIGV4Y2VwdGlvbiBlbnRyeSBmb3IgdGhhdCBvbmUuLi4gKi8KLQlFWENFUFRJT05fQ09NTU9OKDB4MjAwLCBQQUNBX0VYR0VOLCBJTlRTX0tFRVApCisJRVhDRVBUSU9OX0NPTU1PTigweDIwMCkKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogQkVHSU5fRlRSX1NFQ1RJT04KIAlsZAlyMTIsX01TUihyMSkKQEAgLTQyNSw3ICs2NjAsOCBAQAogCU5PUk1BTF9FWENFUFRJT05fUFJPTE9HKDB4MjIwLAogCQkJCUJPT0tFX0lOVEVSUlVQVF9TUEVfRlBfREFUQV9BTFRJVkVDX0FTU0lTVCwKIAkJCQlQUk9MT0dfQURESVRJT05fTk9ORSkKLQlFWENFUFRJT05fQ09NTU9OKDB4MjIwLCBQQUNBX0VYR0VOLCBJTlRTX0RJU0FCTEUpCisJRVhDRVBUSU9OX0NPTU1PTigweDIyMCkKKwlJTlRTX0RJU0FCTEUKIAlibAkuc2F2ZV9udmdwcnMKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAjaWZkZWYgQ09ORklHX0FMVElWRUMKQEAgLTQ1MCwxMyArNjg2LDE3IEBACiAJU1RBUlRfRVhDRVBUSU9OKHdhdGNoZG9nKTsKIAlDUklUX0VYQ0VQVElPTl9QUk9MT0coMHg5ZjAsIEJPT0tFX0lOVEVSUlVQVF9XQVRDSERPRywKIAkJCSAgICAgIFBST0xPR19BRERJVElPTl9OT05FKQotLy8JRVhDRVBUSU9OX0NPTU1PTigweDlmMCwgUEFDQV9FWENSSVQsIElOVFNfRElTQUJMRSkKLS8vCWJsCXNwZWNpYWxfcmVnX3NhdmVfY3JpdAotLy8JQ0hFQ0tfTkFQUElORygpOwotLy8JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotLy8JYmwJLnVua25vd25fZXhjZXB0aW9uCi0vLwliCXJldF9mcm9tX2NyaXRfZXhjZXB0Ci0JYgkuCisJRVhDRVBUSU9OX0NPTU1PTl9DUklUKDB4OWYwKQorCWJsCS5zYXZlX252Z3BycworCWJsCXNwZWNpYWxfcmVnX3NhdmUKKwlDSEVDS19OQVBQSU5HKCk7CisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorI2lmZGVmIENPTkZJR19CT09LRV9XRFQKKwlibAkuV2F0Y2hkb2dFeGNlcHRpb24KKyNlbHNlCisJYmwJLnVua25vd25fZXhjZXB0aW9uCisjZW5kaWYKKwliCXJldF9mcm9tX2NyaXRfZXhjZXB0CiAKIC8qIFN5c3RlbSBDYWxsIEludGVycnVwdCAqLwogCVNUQVJUX0VYQ0VQVElPTihzeXN0ZW1fY2FsbCkKQEAgLTQ3MCw3ICs3MTAsOCBAQAogCVNUQVJUX0VYQ0VQVElPTihhcF91bmF2YWlsYWJsZSk7CiAJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0coMHhmMjAsIEJPT0tFX0lOVEVSUlVQVF9BUF9VTkFWQUlMLAogCQkJCVBST0xPR19BRERJVElPTl9OT05FKQotCUVYQ0VQVElPTl9DT01NT04oMHhmMjAsIFBBQ0FfRVhHRU4sIElOVFNfRElTQUJMRSkKKwlFWENFUFRJT05fQ09NTU9OKDB4ZjIwKQorCUlOVFNfRElTQUJMRQogCWJsCS5zYXZlX252Z3BycwogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlibAkudW5rbm93bl9leGNlcHRpb24KQEAgLTUxMyw3ICs3NTQsNyBAQAogCW10Y3IJcjEwCiAJbGQJcjEwLFBBQ0FfRVhDUklUK0VYX1IxMChyMTMpCS8qIHJlc3RvcmUgcmVnaXN0ZXJzICovCiAJbGQJcjExLFBBQ0FfRVhDUklUK0VYX1IxMShyMTMpCi0JbGQJcjEzLFBBQ0FfRVhDUklUK0VYX1IxMyhyMTMpCisJbWZzcHIJcjEzLFNQUk5fU1BSR19DUklUX1NDUkFUQ0gKIAlyZmNpCiAKIAkvKiBOb3JtYWwgZGVidWcgZXhjZXB0aW9uICovCkBAIC01MjYsMTAgKzc2Nyw4IEBACiAJLyogTm93IHdlIG1hc2ggdXAgdGhpbmdzIHRvIG1ha2UgaXQgbG9vayBsaWtlIHdlIGFyZSBjb21pbmcgb24gYQogCSAqIG5vcm1hbCBleGNlcHRpb24KIAkgKi8KLQlsZAlyMTUsUEFDQV9FWENSSVQrRVhfUjEzKHIxMykKLQltdHNwcglTUFJOX1NQUkdfR0VOX1NDUkFUQ0gscjE1CiAJbWZzcHIJcjE0LFNQUk5fREJTUgotCUVYQ0VQVElPTl9DT01NT04oMHhkMDAsIFBBQ0FfRVhDUklULCBJTlRTX0RJU0FCTEUpCisJRVhDRVBUSU9OX0NPTU1PTl9DUklUKDB4ZDAwKQogCXN0ZAlyMTQsX0RTSVNSKHIxKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAltcglyNCxyMTQKQEAgLTU5MiwxMCArODMxLDkgQEAKIAkvKiBOb3cgd2UgbWFzaCB1cCB0aGluZ3MgdG8gbWFrZSBpdCBsb29rIGxpa2Ugd2UgYXJlIGNvbWluZyBvbiBhCiAJICogbm9ybWFsIGV4Y2VwdGlvbgogCSAqLwotCW1mc3ByCXIxNSxTUFJOX1NQUkdfREJHX1NDUkFUQ0gKLQltdHNwcglTUFJOX1NQUkdfR0VOX1NDUkFUQ0gscjE1CiAJbWZzcHIJcjE0LFNQUk5fREJTUgotCUVYQ0VQVElPTl9DT01NT04oMHhkMDgsIFBBQ0FfRVhEQkcsIElOVFNfRElTQUJMRSkKKwlFWENFUFRJT05fQ09NTU9OX0RCRygweGQwOCkKKwlJTlRTX0RJU0FCTEUKIAlzdGQJcjE0LF9EU0lTUihyMSkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJbXIJcjQscjE0CkBAIC02MDgsNyArODQ2LDggQEAKIAlTVEFSVF9FWENFUFRJT04ocGVyZm1vbik7CiAJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0coMHgyNjAsIEJPT0tFX0lOVEVSUlVQVF9QRVJGT1JNQU5DRV9NT05JVE9SLAogCQkJCVBST0xPR19BRERJVElPTl9OT05FKQotCUVYQ0VQVElPTl9DT01NT04oMHgyNjAsIFBBQ0FfRVhHRU4sIElOVFNfRElTQUJMRSkKKwlFWENFUFRJT05fQ09NTU9OKDB4MjYwKQorCUlOVFNfRElTQUJMRQogCUNIRUNLX05BUFBJTkcoKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlibAkucGVyZm9ybWFuY2VfbW9uaXRvcl9leGNlcHRpb24KQEAgLTYyMiwxMyArODYxLDEzIEBACiAJU1RBUlRfRVhDRVBUSU9OKGRvb3JiZWxsX2NyaXQpOwogCUNSSVRfRVhDRVBUSU9OX1BST0xPRygweDJhMCwgQk9PS0VfSU5URVJSVVBUX0RPT1JCRUxMX0NSSVRJQ0FMLAogCQkJICAgICAgUFJPTE9HX0FERElUSU9OX05PTkUpCi0vLwlFWENFUFRJT05fQ09NTU9OKDB4MmEwLCBQQUNBX0VYQ1JJVCwgSU5UU19ESVNBQkxFKQotLy8JYmwJc3BlY2lhbF9yZWdfc2F2ZV9jcml0Ci0vLwlDSEVDS19OQVBQSU5HKCk7Ci0vLwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0vLwlibAkuZG9vcmJlbGxfY3JpdGljYWxfZXhjZXB0aW9uCi0vLwliCXJldF9mcm9tX2NyaXRfZXhjZXB0Ci0JYgkuCisJRVhDRVBUSU9OX0NPTU1PTl9DUklUKDB4MmEwKQorCWJsCS5zYXZlX252Z3BycworCWJsCXNwZWNpYWxfcmVnX3NhdmUKKwlDSEVDS19OQVBQSU5HKCk7CisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCS51bmtub3duX2V4Y2VwdGlvbgorCWIJcmV0X2Zyb21fY3JpdF9leGNlcHQKIAogLyoKICAqCUd1ZXN0IGRvb3JiZWxsIGludGVycnVwdApAQCAtNjM3LDcgKzg3Niw3IEBACiAJU1RBUlRfRVhDRVBUSU9OKGd1ZXN0X2Rvb3JiZWxsKTsKIAlHREJFTExfRVhDRVBUSU9OX1BST0xPRygweDJjMCwgQk9PS0VfSU5URVJSVVBUX0dVRVNUX0RCRUxMLAogCQkJICAgICAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLQlFWENFUFRJT05fQ09NTU9OKDB4MmMwLCBQQUNBX0VYR0VOLCBJTlRTX0tFRVApCisJRVhDRVBUSU9OX0NPTU1PTigweDJjMCkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJLnNhdmVfbnZncHJzCiAJSU5UU19SRVNUT1JFX0hBUkQKQEAgLTY0OCwxOSArODg3LDE5IEBACiAJU1RBUlRfRVhDRVBUSU9OKGd1ZXN0X2Rvb3JiZWxsX2NyaXQpOwogCUNSSVRfRVhDRVBUSU9OX1BST0xPRygweDJlMCwgQk9PS0VfSU5URVJSVVBUX0dVRVNUX0RCRUxMX0NSSVQsCiAJCQkgICAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLS8vCUVYQ0VQVElPTl9DT01NT04oMHgyZTAsIFBBQ0FfRVhDUklULCBJTlRTX0RJU0FCTEUpCi0vLwlibAlzcGVjaWFsX3JlZ19zYXZlX2NyaXQKLS8vCUNIRUNLX05BUFBJTkcoKTsKLS8vCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLS8vCWJsCS5ndWVzdF9kb29yYmVsbF9jcml0aWNhbF9leGNlcHRpb24KLS8vCWIJcmV0X2Zyb21fY3JpdF9leGNlcHQKLQliCS4KKwlFWENFUFRJT05fQ09NTU9OX0NSSVQoMHgyZTApCisJYmwJLnNhdmVfbnZncHJzCisJYmwJc3BlY2lhbF9yZWdfc2F2ZQorCUNIRUNLX05BUFBJTkcoKTsKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJYmwJLnVua25vd25fZXhjZXB0aW9uCisJYglyZXRfZnJvbV9jcml0X2V4Y2VwdAogCiAvKiBIeXBlcnZpc29yIGNhbGwgKi8KIAlTVEFSVF9FWENFUFRJT04oaHlwZXJjYWxsKTsKIAlOT1JNQUxfRVhDRVBUSU9OX1BST0xPRygweDMxMCwgQk9PS0VfSU5URVJSVVBUX0hWX1NZU0NBTEwsCiAJCQkgICAgICAgIFBST0xPR19BRERJVElPTl9OT05FKQotCUVYQ0VQVElPTl9DT01NT04oMHgzMTAsIFBBQ0FfRVhHRU4sIElOVFNfS0VFUCkKKwlFWENFUFRJT05fQ09NTU9OKDB4MzEwKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlibAkuc2F2ZV9udmdwcnMKIAlJTlRTX1JFU1RPUkVfSEFSRApAQCAtNjcxLDcgKzkxMCw3IEBACiAJU1RBUlRfRVhDRVBUSU9OKGVocHJpdik7CiAJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0coMHgzMjAsIEJPT0tFX0lOVEVSUlVQVF9IVl9QUklWLAogCQkJICAgICAgICBQUk9MT0dfQURESVRJT05fTk9ORSkKLQlFWENFUFRJT05fQ09NTU9OKDB4MzIwLCBQQUNBX0VYR0VOLCBJTlRTX0tFRVApCisJRVhDRVBUSU9OX0NPTU1PTigweDMyMCkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJLnNhdmVfbnZncHJzCiAJSU5UU19SRVNUT1JFX0hBUkQKQEAgLTY4Miw3ICs5MjEsNyBAQAogCVNUQVJUX0VYQ0VQVElPTihscmF0X2Vycm9yKTsKIAlOT1JNQUxfRVhDRVBUSU9OX1BST0xPRygweDM0MCwgQk9PS0VfSU5URVJSVVBUX0xSQVRfRVJST1IsCiAJCQkgICAgICAgIFBST0xPR19BRERJVElPTl9OT05FKQotCUVYQ0VQVElPTl9DT01NT04oMHgzNDAsIFBBQ0FfRVhHRU4sIElOVFNfS0VFUCkKKwlFWENFUFRJT05fQ09NTU9OKDB4MzQwKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlibAkuc2F2ZV9udmdwcnMKIAlJTlRTX1JFU1RPUkVfSEFSRApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCmluZGV4IDM4ZDUwNzMuLmQ5YzY1MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKQEAgLTEyMSw5ICsxMjEsMTAgQEAKIAljbXB3aQljcjEscjEzLDIKIAkvKiBUb3RhbCBsb3NzIG9mIEhWIHN0YXRlIGlzIGZhdGFsLCB3ZSBjb3VsZCB0cnkgdG8gdXNlIHRoZQogCSAqIFBJUiB0byBsb2NhdGUgYSBQQUNBLCB0aGVuIHVzZSBhbiBlbWVyZ2VuY3kgc3RhY2sgZXRjLi4uCi0JICogYnV0IGZvciBub3csIGxldCdzIGp1c3Qgc3RheSBzdHVjayBoZXJlCisJICogT1BBTCB2MyBiYXNlZCBwb3dlcm52IHBsYXRmb3JtcyBoYXZlIG5ldyBpZGxlIHN0YXRlcworCSAqIHdoaWNoIGZhbGwgaW4gdGhpcyBjYXRhZ29yeS4KIAkgKi8KLQliZ3QJY3IxLC4KKwliZ3QJY3IxLDhmCiAJR0VUX1BBQ0EocjEzKQogCiAjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfSFZfUE9TU0lCTEUKQEAgLTE0MSw2ICsxNDIsMTEgQEAKIAliZXEJY3IxLDJmCiAJYgkucG93ZXI3X3dha2V1cF9ub2xvc3MKIDI6CWIJLnBvd2VyN193YWtldXBfbG9zcworCisJLyogRmFzdCBTbGVlcCB3YWtldXAgb24gUG93ZXJOViAqLworODoJR0VUX1BBQ0EocjEzKQorCWIgCS5wb3dlcjdfd2FrZXVwX3RiX2xvc3MKKwogOToKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0hWTU9ERSB8IENQVV9GVFJfQVJDSF8yMDYpCiAjZW5kaWYgLyogQ09ORklHX1BQQ19QN19OQVAgKi8KQEAgLTE2NCwxMyArMTcwLDE4IEBACiAJICovCiAJbWZzcHIJcjEzLFNQUk5fU1JSMQogCXJsd2lubS4JcjEzLHIxMyw0Ny0zMSwzMCwzMQorCU9QVF9HRVRfU1BSKHIxMywgU1BSTl9DRkFSLCBDUFVfRlRSX0NGQVIpCiAJYmVxCTlmCiAKKwltZnNwcglyMTMsU1BSTl9TUlIxCisJcmx3aW5tLglyMTMscjEzLDQ3LTMxLDMwLDMxCiAJLyogd2FraW5nIHVwIGZyb20gcG93ZXJzYXZlIChuYXApIHN0YXRlICovCiAJY21wd2kJY3IxLHIxMywyCiAJLyogVG90YWwgbG9zcyBvZiBIViBzdGF0ZSBpcyBmYXRhbC4gbGV0J3MganVzdCBzdGF5IHN0dWNrIGhlcmUgKi8KKwlPUFRfR0VUX1NQUihyMTMsIFNQUk5fQ0ZBUiwgQ1BVX0ZUUl9DRkFSKQogCWJndAljcjEsLgogOToKKwlPUFRfU0VUX1NQUihyMTMsIFNQUk5fQ0ZBUiwgQ1BVX0ZUUl9DRkFSKQogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfSFZNT0RFIHwgQ1BVX0ZUUl9BUkNIXzIwNikKICNlbmRpZiAvKiBDT05GSUdfUFBDX1A3X05BUCAqLwogCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYTUMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI3LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI3LlMKaW5kZXggM2ZkZWYwZi4uYzNhYjg2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjcuUwpAQCAtMTcsMjAgKzE3LDMxIEBACiAjaW5jbHVkZSA8YXNtL3BwYy1vcGNvZGUuaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3NfYXNtLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KIAogI3VuZGVmIERFQlVHCiAKKy8qIElkbGUgc3RhdGUgZW50cnkgcm91dGluZXMgKi8KKworI2RlZmluZQlJRExFX1NUQVRFX0VOVEVSX1NFUShJRExFX0lOU1QpCQkJCVwKKwkvKiBNYWdpYyBOQVAvU0xFRVAvV0lOS0xFIG1vZGUgZW50ZXIgc2VxdWVuY2UgKi8JXAorCXN0ZAlyMCwwKHIxKTsJCQkJCVwKKwlwdGVzeW5jOwkJCQkJCVwKKwlsZAlyMCwwKHIxKTsJCQkJCVwKKzE6CWNtcAljcjAscjAscjA7CQkJCQlcCisJYm5lCTFiOwkJCQkJCVwKKwlJRExFX0lOU1Q7CQkJCQkJXAorCWIJLgorCiAJLnRleHQKIAotX0dMT0JBTChwb3dlcjdfaWRsZSkKLQkvKiBOb3cgY2hlY2sgaWYgdXNlciBvciBhcmNoIGVuYWJsZWQgTkFQIG1vZGUgKi8KLQlMT0FEX1JFR19BRERSQkFTRShyMyxwb3dlcnNhdmVfbmFwKQotCWx3eglyNCxBRERST0ZGKHBvd2Vyc2F2ZV9uYXApKHIzKQotCWNtcHdpCTAscjQsMAotCWJlcWxyCi0JLyogZmFsbCB0aHJvdWdoICovCi0KLV9HTE9CQUwocG93ZXI3X25hcCkKKy8qCisgKiBQYXNzIHJlcXVlc3RlZCBzdGF0ZSBpbiByMzoKKyAqIAkwIC0gbmFwCisgKiAJMSAtIHNsZWVwCisgKi8KK19HTE9CQUwocG93ZXI3X3Bvd2Vyc2F2ZV9jb21tb24pCisJLyogVXNlIHIzIHRvIHBhc3Mgc3RhdGUgbmFwL3NsZWVwL3dpbmtsZSAqLwogCS8qIE5BUCBpcyBhIHN0YXRlIGxvc3MsIHdlIGNyZWF0ZSBhIHJlZ3MgZnJhbWUgb24gdGhlCiAJICogc3RhY2ssIGZpbGwgaXQgdXAgd2l0aCB0aGUgc3RhdGUgd2UgY2FyZSBhYm91dCBhbmQKIAkgKiBzdGljayBhIHBvaW50ZXIgdG8gaXQgaW4gUEFDQVIxLiBXZSByZWFsbHkgb25seQpAQCAtNzksOCArOTAsOCBAQAogCS8qIENvbnRpbnVlIHNhdmluZyBzdGF0ZSAqLwogCVNBVkVfR1BSKDIsIHIxKQogCVNBVkVfTlZHUFJTKHIxKQotCW1mY3IJcjMKLQlzdGQJcjMsX0NDUihyMSkKKwltZmNyCXI0CisJc3RkCXI0LF9DQ1IocjEpCiAJc3RkCXI5LF9NU1IocjEpCiAJc3RkCXIxLFBBQ0FSMShyMTMpCiAKQEAgLTkwLDE1ICsxMDEsNTYgQEAKIAlsaQlyNCxLVk1fSFdUSFJFQURfSU5fTkFQCiAJc3RiCXI0LEhTVEFURV9IV1RIUkVBRF9TVEFURShyMTMpCiAjZW5kaWYKKwljbXB3aQljcjAscjMsMQorCWJlcQkyZgorCUlETEVfU1RBVEVfRU5URVJfU0VRKFBQQ19OQVApCisJLyogTm8gcmV0dXJuICovCisyOglJRExFX1NUQVRFX0VOVEVSX1NFUShQUENfU0xFRVApCisJLyogTm8gcmV0dXJuICovCiAKLQkvKiBNYWdpYyBOQVAgbW9kZSBlbnRlciBzZXF1ZW5jZSAqLwotCXN0ZAlyMCwwKHIxKQotCXB0ZXN5bmMKLQlsZAlyMCwwKHIxKQotMToJY21wCWNyMCxyMCxyMAotCWJuZQkxYgotCVBQQ19OQVAKLQliCS4KK19HTE9CQUwocG93ZXI3X2lkbGUpCisJLyogTm93IGNoZWNrIGlmIHVzZXIgb3IgYXJjaCBlbmFibGVkIE5BUCBtb2RlICovCisJTE9BRF9SRUdfQUREUkJBU0UocjMscG93ZXJzYXZlX25hcCkKKwlsd3oJcjQsQUREUk9GRihwb3dlcnNhdmVfbmFwKShyMykKKwljbXB3aQkwLHI0LDAKKwliZXFscgorCS8qIGZhbGwgdGhyb3VnaCAqLworCitfR0xPQkFMKHBvd2VyN19uYXApCisJbGkJcjMsMAorCWIJcG93ZXI3X3Bvd2Vyc2F2ZV9jb21tb24KKwkvKiBObyByZXR1cm4gKi8KKworX0dMT0JBTChwb3dlcjdfc2xlZXApCisJbGkJcjMsMQorCWIJcG93ZXI3X3Bvd2Vyc2F2ZV9jb21tb24KKwkvKiBObyByZXR1cm4gKi8KKworX0dMT0JBTChwb3dlcjdfd2FrZXVwX3RiX2xvc3MpCisJbGQJcjIsUEFDQVRPQyhyMTMpOworCWxkCXIxLFBBQ0FSMShyMTMpCisKKwkvKiBUaW1lIGJhc2UgcmUtc3luYyAqLworCWxpCXIwLE9QQUxfUkVTWU5DX1RJTUVCQVNFCisJTE9BRF9SRUdfQUREUihyMTEsb3BhbCk7CisJbGQJcjEyLDgocjExKTsKKwlsZAlyMiwwKHIxMSk7CisJbXRjdHIJcjEyCisJYmN0cmwKKworCS8qIFRPRE86IENoZWNrIHIzIGZvciBmYWlsdXJlICovCisKKwlSRVNUX05WR1BSUyhyMSkKKwlSRVNUX0dQUigyLCByMSkKKwlsZAlyMyxfQ0NSKHIxKQorCWxkCXI0LF9NU1IocjEpCisJbGQJcjUsX05JUChyMSkKKwlhZGRpCXIxLHIxLElOVF9GUkFNRV9TSVpFCisJbXRjcglyMworCW1mc3ByCXIzLFNQUk5fU1JSMQkJLyogUmV0dXJuIFNSUjEgKi8KKwltdHNwcglTUFJOX1NSUjEscjQKKwltdHNwcglTUFJOX1NSUjAscjUKKwlyZmlkCiAKIF9HTE9CQUwocG93ZXI3X3dha2V1cF9sb3NzKQogCWxkCXIxLFBBQ0FSMShyMTMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCAxZDA4NDhiLi5jYTFjZDc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTQ2NSw3ICs0NjUsNiBAQAogCiB2b2lkIF9fZG9faXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCiAJaXJxX2VudGVyKCk7CkBAIC00ODcsMTEgKzQ4Niw4IEBACiAJLyogQW5kIGZpbmFsbHkgcHJvY2VzcyBpdCAqLwogCWlmICh1bmxpa2VseShpcnEgPT0gTk9fSVJRKSkKIAkJX19nZXRfY3B1X3ZhcihpcnFfc3RhdCkuc3B1cmlvdXNfaXJxcysrOwotCWVsc2UgewotCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQkJaWYgKGxpa2VseShkZXNjKSkKLQkJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKLQl9CisJZWxzZQorCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAogCXRyYWNlX2lycV9leGl0KHJlZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21jZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tY2UuYwppbmRleCBjYWRlZjdlLi5hN2ZkNGNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21jZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWNlLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAqLwogdm9pZCBzYXZlX21jZV9ldmVudChzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBoYW5kbGVkLAogCQkgICAgc3RydWN0IG1jZV9lcnJvcl9pbmZvICptY2VfZXJyLAotCQkgICAgdWludDY0X3QgYWRkcikKKwkJICAgIHVpbnQ2NF90IG5pcCwgdWludDY0X3QgYWRkcikKIHsKIAl1aW50NjRfdCBzcnIxOwogCWludCBpbmRleCA9IF9fZ2V0X2NwdV92YXIobWNlX25lc3RfY291bnQpKys7CkBAIC04Niw3ICs4Niw3IEBACiAKIAkvKiBQb3B1bGF0ZSBnZW5lcmljIG1hY2hpbmUgY2hlY2sgaW5mbyAqLwogCW1jZS0+dmVyc2lvbiA9IE1DRV9WMTsKLQltY2UtPnNycjAgPSByZWdzLT5uaXA7CisJbWNlLT5zcnIwID0gbmlwOwogCW1jZS0+c3JyMSA9IHJlZ3MtPm1zcjsKIAltY2UtPmdwcjMgPSByZWdzLT5ncHJbM107CiAJbWNlLT5pbl91c2UgPSAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tY2VfcG93ZXIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWNlX3Bvd2VyLmMKaW5kZXggMjdjOTNmNC4uYWE5YWZmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tY2VfcG93ZXIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21jZV9wb3dlci5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogCiAvKiBmbHVzaCBTTEJzIGFuZCByZWxvYWQgKi8KIHN0YXRpYyB2b2lkIGZsdXNoX2FuZF9yZWxvYWRfc2xiKHZvaWQpCkBAIC0xOTcsMTMgKzE5OCwzMiBAQAogCX0KIH0KIAorc3RhdGljIGxvbmcgbWNlX2hhbmRsZV91ZV9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlsb25nIGhhbmRsZWQgPSAwOworCisJLyoKKwkgKiBPbiBzcGVjaWZpYyBTQ09NIHJlYWQgdmlhIE1NSU8gd2UgbWF5IGdldCBhIG1hY2hpbmUgY2hlY2sKKwkgKiBleGNlcHRpb24gd2l0aCBTUlIwIHBvaW50aW5nIGluc2lkZSBvcGFsLiBJZiB0aGF0IGlzIHRoZQorCSAqIGNhc2UgT1BBTCBtYXkgaGF2ZSByZWNvdmVyeSBhZGRyZXNzIHRvIHJlLXJlYWQgU0NPTSBkYXRhIGluCisJICogZGlmZmVyZW50IHdheSBhbmQgaGVuY2Ugd2UgY2FuIHJlY292ZXIgZnJvbSB0aGlzIE1DLgorCSAqLworCisJaWYgKHBwY19tZC5tY2VfY2hlY2tfZWFybHlfcmVjb3ZlcnkpIHsKKwkJaWYgKHBwY19tZC5tY2VfY2hlY2tfZWFybHlfcmVjb3ZlcnkocmVncykpCisJCQloYW5kbGVkID0gMTsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKIGxvbmcgX19tYWNoaW5lX2NoZWNrX2Vhcmx5X3JlYWxtb2RlX3A3KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVpbnQ2NF90IHNycjEsIGFkZHI7CisJdWludDY0X3Qgc3JyMSwgbmlwLCBhZGRyOwogCWxvbmcgaGFuZGxlZCA9IDE7CiAJc3RydWN0IG1jZV9lcnJvcl9pbmZvIG1jZV9lcnJvcl9pbmZvID0geyAwIH07CiAKIAlzcnIxID0gcmVncy0+bXNyOworCW5pcCA9IHJlZ3MtPm5pcDsKIAogCS8qCiAJICogSGFuZGxlIG1lbW9yeSBlcnJvcnMgZGVwZW5kaW5nIHdoZXRoZXIgdGhpcyB3YXMgYSBsb2FkL3N0b3JlIG9yCkBAIC0yMjEsNyArMjQxLDExIEBACiAJCWFkZHIgPSByZWdzLT5uaXA7CiAJfQogCi0Jc2F2ZV9tY2VfZXZlbnQocmVncywgaGFuZGxlZCwgJm1jZV9lcnJvcl9pbmZvLCBhZGRyKTsKKwkvKiBIYW5kbGUgVUUgZXJyb3IuICovCisJaWYgKG1jZV9lcnJvcl9pbmZvLmVycm9yX3R5cGUgPT0gTUNFX0VSUk9SX1RZUEVfVUUpCisJCWhhbmRsZWQgPSBtY2VfaGFuZGxlX3VlX2Vycm9yKHJlZ3MpOworCisJc2F2ZV9tY2VfZXZlbnQocmVncywgaGFuZGxlZCwgJm1jZV9lcnJvcl9pbmZvLCBuaXAsIGFkZHIpOwogCXJldHVybiBoYW5kbGVkOwogfQogCkBAIC0yNjMsMTEgKzI4NywxMiBAQAogCiBsb25nIF9fbWFjaGluZV9jaGVja19lYXJseV9yZWFsbW9kZV9wOChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl1aW50NjRfdCBzcnIxLCBhZGRyOworCXVpbnQ2NF90IHNycjEsIG5pcCwgYWRkcjsKIAlsb25nIGhhbmRsZWQgPSAxOwogCXN0cnVjdCBtY2VfZXJyb3JfaW5mbyBtY2VfZXJyb3JfaW5mbyA9IHsgMCB9OwogCiAJc3JyMSA9IHJlZ3MtPm1zcjsKKwluaXAgPSByZWdzLT5uaXA7CiAKIAlpZiAoUDdfU1JSMV9NQ19MT0FEU1RPUkUoc3JyMSkpIHsKIAkJaGFuZGxlZCA9IG1jZV9oYW5kbGVfZGVycm9yX3A4KHJlZ3MtPmRzaXNyKTsKQEAgLTI3OSw2ICszMDQsMTAgQEAKIAkJYWRkciA9IHJlZ3MtPm5pcDsKIAl9CiAKLQlzYXZlX21jZV9ldmVudChyZWdzLCBoYW5kbGVkLCAmbWNlX2Vycm9yX2luZm8sIGFkZHIpOworCS8qIEhhbmRsZSBVRSBlcnJvci4gKi8KKwlpZiAobWNlX2Vycm9yX2luZm8uZXJyb3JfdHlwZSA9PSBNQ0VfRVJST1JfVFlQRV9VRSkKKwkJaGFuZGxlZCA9IG1jZV9oYW5kbGVfdWVfZXJyb3IocmVncyk7CisKKwlzYXZlX21jZV9ldmVudChyZWdzLCBoYW5kbGVkLCAmbWNlX2Vycm9yX2luZm8sIG5pcCwgYWRkcik7CiAJcmV0dXJuIGhhbmRsZWQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwppbmRleCBhOWUzMTFmLi4yYTQ3NzkwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKQEAgLTIwOCw3ICsyMDgsNiBAQAogCQkJICB1bnNpZ25lZCBsb25nIGluX2RldmZuKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsbjsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhvc2Vfbm9kZTsKIApAQCAtMjMwLDggKzIyOSw3IEBACiAJICogdXNlZCBvbiBwcmUtZG9tYWlucyBzZXR1cC4gV2UgcmV0dXJuIHRoZSBmaXJzdCBtYXRjaAogCSAqLwogCi0JZm9yIChsbiA9IHBjaV9yb290X2J1c2VzLm5leHQ7IGxuICE9ICZwY2lfcm9vdF9idXNlczsgbG4gPSBsbi0+bmV4dCkgewotCQlidXMgPSBwY2lfYnVzX2IobG4pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpIHsKIAkJaWYgKGluX2J1cyA+PSBidXMtPm51bWJlciAmJiBpbl9idXMgPD0gYnVzLT5idXNuX3Jlcy5lbmQpCiAJCQlicmVhazsKIAkJYnVzID0gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKaW5kZXggZjU4YzBkMy4uZDcxMWI3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKQEAgLTc1Miw2ICs3NTIsMTEgQEAKIAlzcGlubmluZ19zZWNvbmRhcmllcyA9IGJvb3RfY3B1X2NvdW50IC0gMTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCisJLyogU2NhbiBhbmQgYnVpbGQgdGhlIGxpc3Qgb2YgbWFjaGluZSBjaGVjayByZWNvdmVyYWJsZSByYW5nZXMgKi8KKwlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX3JlY292ZXJhYmxlX3JhbmdlcywgTlVMTCk7CisjZW5kaWYKKwogCURCRygiIDwtIGVhcmx5X2luaXRfZGV2dHJlZSgpXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwppbmRleCA0Y2Y2NzRkLi5mMzg2Mjk2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwpAQCAtMTAxMywxMiArMTAxMywxMyBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiBXZSBhc3N1bWUgdG8gYmUgcGFzc2VkIGJpZyBlbmRpYW4gYXJndW1lbnRzICovCiBhc21saW5rYWdlIGludCBwcGNfcnRhcyhzdHJ1Y3QgcnRhc19hcmdzIF9fdXNlciAqdWFyZ3MpCiB7CiAJc3RydWN0IHJ0YXNfYXJncyBhcmdzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJY2hhciAqYnVmZl9jb3B5LCAqZXJyYnVmID0gTlVMTDsKLQlpbnQgbmFyZ3M7CisJaW50IG5hcmdzLCBucmV0LCB0b2tlbjsKIAlpbnQgcmM7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCkBAIC0xMDI3LDEwICsxMDI4LDEzIEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmdzLCB1YXJncywgMyAqIHNpemVvZih1MzIpKSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCW5hcmdzID0gYXJncy5uYXJnczsKKwluYXJncyA9IGJlMzJfdG9fY3B1KGFyZ3MubmFyZ3MpOworCW5yZXQgID0gYmUzMl90b19jcHUoYXJncy5ucmV0KTsKKwl0b2tlbiA9IGJlMzJfdG9fY3B1KGFyZ3MudG9rZW4pOworCiAJaWYgKG5hcmdzID4gQVJSQVlfU0laRShhcmdzLmFyZ3MpCi0JICAgIHx8IGFyZ3MubnJldCA+IEFSUkFZX1NJWkUoYXJncy5hcmdzKQotCSAgICB8fCBuYXJncyArIGFyZ3MubnJldCA+IEFSUkFZX1NJWkUoYXJncy5hcmdzKSkKKwkgICAgfHwgbnJldCA+IEFSUkFZX1NJWkUoYXJncy5hcmdzKQorCSAgICB8fCBuYXJncyArIG5yZXQgPiBBUlJBWV9TSVpFKGFyZ3MuYXJncykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogQ29weSBpbiBhcmdzLiAqLwpAQCAtMTAzOCwxNCArMTA0MiwxNCBAQAogCQkJICAgbmFyZ3MgKiBzaXplb2YocnRhc19hcmdfdCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGFyZ3MudG9rZW4gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpCisJaWYgKHRva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWFyZ3MucmV0cyA9ICZhcmdzLmFyZ3NbbmFyZ3NdOwotCW1lbXNldChhcmdzLnJldHMsIDAsIGFyZ3MubnJldCAqIHNpemVvZihydGFzX2FyZ190KSk7CisJbWVtc2V0KGFyZ3MucmV0cywgMCwgbnJldCAqIHNpemVvZihydGFzX2FyZ190KSk7CiAKIAkvKiBOZWVkIHRvIGhhbmRsZSBpYm0sc3VzcGVuZF9tZSBjYWxsIHNwZWNpYWxseSAqLwotCWlmIChhcmdzLnRva2VuID09IGlibV9zdXNwZW5kX21lX3Rva2VuKSB7CisJaWYgKHRva2VuID09IGlibV9zdXNwZW5kX21lX3Rva2VuKSB7CiAJCXJjID0gcnRhc19pYm1fc3VzcGVuZF9tZSgmYXJncyk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKQEAgLTEwNjIsNyArMTA2Niw3IEBACiAKIAkvKiBBIC0xIHJldHVybiBjb2RlIGluZGljYXRlcyB0aGF0IHRoZSBsYXN0IGNvbW1hbmQgY291bGRuJ3QKIAkgICBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgaGFyZHdhcmUgZXJyb3IuICovCi0JaWYgKGFyZ3MucmV0c1swXSA9PSAtMSkKKwlpZiAoYmUzMl90b19jcHUoYXJncy5yZXRzWzBdKSA9PSAtMSkKIAkJZXJyYnVmID0gX19mZXRjaF9ydGFzX2xhc3RfZXJyb3IoYnVmZl9jb3B5KTsKIAogCXVubG9ja19ydGFzKGZsYWdzKTsKQEAgLTEwNzcsNyArMTA4MSw3IEBACiAJLyogQ29weSBvdXQgYXJncy4gKi8KIAlpZiAoY29weV90b191c2VyKHVhcmdzLT5hcmdzICsgbmFyZ3MsCiAJCQkgYXJncy5hcmdzICsgbmFyZ3MsCi0JCQkgYXJncy5ucmV0ICogc2l6ZW9mKHJ0YXNfYXJnX3QpKSAhPSAwKQorCQkJIG5yZXQgKiBzaXplb2YocnRhc19hcmdfdCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggZjVmMTFhNy4uNDkzMzkwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMTAyLDYgKzEwMiw4IEBACiB7CiAJaW50IGNwdTsKIAorCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgdGxiX2NvcmVfZGF0YSwgbG9jaykgIT0gMCk7CisKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCWludCBmaXJzdCA9IGNwdV9maXJzdF90aHJlYWRfc2libGluZyhjcHUpOwogCkBAIC01NTIsMTQgKzU1NCwyMCBAQAogc3RhdGljIHZvaWQgX19pbml0IGV4Y19sdmxfZWFybHlfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgc3A7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQljcml0aXJxX2N0eFtpXSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKLQkJCV9fdmEobWVtYmxvY2tfYWxsb2MoVEhSRUFEX1NJWkUsIFRIUkVBRF9TSVpFKSk7Ci0JCWRiZ2lycV9jdHhbaV0gPSAoc3RydWN0IHRocmVhZF9pbmZvICopCi0JCQlfX3ZhKG1lbWJsb2NrX2FsbG9jKFRIUkVBRF9TSVpFLCBUSFJFQURfU0laRSkpOwotCQltY2hlY2tpcnFfY3R4W2ldID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQotCQkJX192YShtZW1ibG9ja19hbGxvYyhUSFJFQURfU0laRSwgVEhSRUFEX1NJWkUpKTsKKwkJc3AgPSBtZW1ibG9ja19hbGxvYyhUSFJFQURfU0laRSwgVEhSRUFEX1NJWkUpOworCQljcml0aXJxX2N0eFtpXSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKilfX3ZhKHNwKTsKKwkJcGFjYVtpXS5jcml0X2tzdGFjayA9IF9fdmEoc3AgKyBUSFJFQURfU0laRSk7CisKKwkJc3AgPSBtZW1ibG9ja19hbGxvYyhUSFJFQURfU0laRSwgVEhSRUFEX1NJWkUpOworCQlkYmdpcnFfY3R4W2ldID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKV9fdmEoc3ApOworCQlwYWNhW2ldLmRiZ19rc3RhY2sgPSBfX3ZhKHNwICsgVEhSRUFEX1NJWkUpOworCisJCXNwID0gbWVtYmxvY2tfYWxsb2MoVEhSRUFEX1NJWkUsIFRIUkVBRF9TSVpFKTsKKwkJbWNoZWNraXJxX2N0eFtpXSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKilfX3ZhKHNwKTsKKwkJcGFjYVtpXS5tY19rc3RhY2sgPSBfX3ZhKHNwICsgVEhSRUFEX1NJWkUpOwogCX0KIAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9ERUJVR19MVkxfRVhDKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IGFjMjYyMWEuLmUyYTQyMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtMTQ1LDkgKzE0Niw5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgY2FsbF9mdW5jdGlvbl9zaW5nbGVfYWN0aW9uKGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaXJxcmV0dXJuX3QgdGlja19icm9hZGNhc3RfaXBpX2FjdGlvbihpbnQgaXJxLCB2b2lkICpkYXRhKQogewotCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCgpOworCXRpY2tfYnJvYWRjYXN0X2lwaV9oYW5kbGVyKCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xNjgsMTQgKzE2OSwxNCBAQAogc3RhdGljIGlycV9oYW5kbGVyX3Qgc21wX2lwaV9hY3Rpb25bXSA9IHsKIAlbUFBDX01TR19DQUxMX0ZVTkNUSU9OXSA9ICBjYWxsX2Z1bmN0aW9uX2FjdGlvbiwKIAlbUFBDX01TR19SRVNDSEVEVUxFXSA9IHJlc2NoZWR1bGVfYWN0aW9uLAotCVtQUENfTVNHX0NBTExfRlVOQ19TSU5HTEVdID0gY2FsbF9mdW5jdGlvbl9zaW5nbGVfYWN0aW9uLAorCVtQUENfTVNHX1RJQ0tfQlJPQURDQVNUXSA9IHRpY2tfYnJvYWRjYXN0X2lwaV9hY3Rpb24sCiAJW1BQQ19NU0dfREVCVUdHRVJfQlJFQUtdID0gZGVidWdfaXBpX2FjdGlvbiwKIH07CiAKIGNvbnN0IGNoYXIgKnNtcF9pcGlfbmFtZVtdID0gewogCVtQUENfTVNHX0NBTExfRlVOQ1RJT05dID0gICJpcGkgY2FsbCBmdW5jdGlvbiIsCiAJW1BQQ19NU0dfUkVTQ0hFRFVMRV0gPSAiaXBpIHJlc2NoZWR1bGUiLAotCVtQUENfTVNHX0NBTExfRlVOQ19TSU5HTEVdID0gImlwaSBjYWxsIGZ1bmN0aW9uIHNpbmdsZSIsCisJW1BQQ19NU0dfVElDS19CUk9BRENBU1RdID0gImlwaSB0aWNrLWJyb2FkY2FzdCIsCiAJW1BQQ19NU0dfREVCVUdHRVJfQlJFQUtdID0gImlwaSBkZWJ1Z2dlciIsCiB9OwogCkBAIC0yNTEsOCArMjUyLDggQEAKIAkJCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KCk7CiAJCWlmIChhbGwgJiBJUElfTUVTU0FHRShQUENfTVNHX1JFU0NIRURVTEUpKQogCQkJc2NoZWR1bGVyX2lwaSgpOwotCQlpZiAoYWxsICYgSVBJX01FU1NBR0UoUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFKSkKLQkJCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCgpOworCQlpZiAoYWxsICYgSVBJX01FU1NBR0UoUFBDX01TR19USUNLX0JST0FEQ0FTVCkpCisJCQl0aWNrX2Jyb2FkY2FzdF9pcGlfaGFuZGxlcigpOwogCQlpZiAoYWxsICYgSVBJX01FU1NBR0UoUFBDX01TR19ERUJVR0dFUl9CUkVBSykpCiAJCQlkZWJ1Z19pcGlfYWN0aW9uKDAsIE5VTEwpOwogCX0gd2hpbGUgKGluZm8tPm1lc3NhZ2VzKTsKQEAgLTI4MCw3ICsyODEsNyBAQAogCiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSkKIHsKLQlkb19tZXNzYWdlX3Bhc3MoY3B1LCBQUENfTVNHX0NBTExfRlVOQ19TSU5HTEUpOworCWRvX21lc3NhZ2VfcGFzcyhjcHUsIFBQQ19NU0dfQ0FMTF9GVU5DVElPTik7CiB9CiAKIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCkBAIC0yOTEsNiArMjkyLDE2IEBACiAJCWRvX21lc3NhZ2VfcGFzcyhjcHUsIFBQQ19NU0dfQ0FMTF9GVU5DVElPTik7CiB9CiAKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKK3ZvaWQgdGlja19icm9hZGNhc3QoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCit7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spCisJCWRvX21lc3NhZ2VfcGFzcyhjcHUsIFBQQ19NU0dfVElDS19CUk9BRENBU1QpOworfQorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR0dFUikgfHwgZGVmaW5lZChDT05GSUdfS0VYRUMpCiB2b2lkIHNtcF9zZW5kX2RlYnVnZ2VyX2JyZWFrKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IGIzZGFiMjAuLjEyMmE1ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KQEAgLTEwNiw3ICsxMDcsNyBAQAogCS5pcnEgICAgICAgICAgICA9IDAsCiAJLnNldF9uZXh0X2V2ZW50ID0gZGVjcmVtZW50ZXJfc2V0X25leHRfZXZlbnQsCiAJLnNldF9tb2RlICAgICAgID0gZGVjcmVtZW50ZXJfc2V0X21vZGUsCi0JLmZlYXR1cmVzICAgICAgID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKKwkuZmVhdHVyZXMgICAgICAgPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UIHwgQ0xPQ0tfRVZUX0ZFQVRfQzNTVE9QLAogfTsKIEVYUE9SVF9TWU1CT0woZGVjcmVtZW50ZXJfY2xvY2tldmVudCk7CiAKQEAgLTQ3OCw0NyArNDc5LDEzIEBACiAKICNlbmRpZiAvKiBDT05GSUdfSVJRX1dPUksgKi8KIAotLyoKLSAqIHRpbWVyX2ludGVycnVwdCAtIGdldHMgY2FsbGVkIHdoZW4gdGhlIGRlY3JlbWVudGVyIG92ZXJmbG93cywKLSAqIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KLSAqLwotdm9pZCB0aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQordm9pZCBfX3RpbWVyX2ludGVycnVwdCh2b2lkKQogewotCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwogCXU2NCAqbmV4dF90YiA9ICZfX2dldF9jcHVfdmFyKGRlY3JlbWVudGVyc19uZXh0X3RiKTsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmX19nZXRfY3B1X3ZhcihkZWNyZW1lbnRlcnMpOwogCXU2NCBub3c7CiAKLQkvKiBFbnN1cmUgYSBwb3NpdGl2ZSB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoZSBkZWNyZW1lbnRlciwgb3IgZWxzZQotCSAqIHNvbWUgQ1BVcyB3aWxsIGNvbnRpbnVlIHRvIHRha2UgZGVjcmVtZW50ZXIgZXhjZXB0aW9ucy4KLQkgKi8KLQlzZXRfZGVjKERFQ1JFTUVOVEVSX01BWCk7Ci0KLQkvKiBTb21lIGltcGxlbWVudGF0aW9ucyBvZiBob3RwbHVnIHdpbGwgZ2V0IHRpbWVyIGludGVycnVwdHMgd2hpbGUKLQkgKiBvZmZsaW5lLCBqdXN0IGlnbm9yZSB0aGVzZSBhbmQgd2UgYWxzbyBuZWVkIHRvIHNldAotCSAqIGRlY3JlbWVudGVyc19uZXh0X3RiIGFzIE1BWCB0byBtYWtlIHN1cmUgX19jaGVja19pcnFfcmVwbGF5Ci0JICogZG9uJ3QgcmVwbGF5IHRpbWVyIGludGVycnVwdCB3aGVuIHJldHVybiwgb3RoZXJ3aXNlIHdlJ2xsIHRyYXAKLQkgKiBoZXJlIGluZmluaXRlbHkgOigKLQkgKi8KLQlpZiAoIWNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkgewotCQkqbmV4dF90YiA9IH4odTY0KTA7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBDb25kaXRpb25hbGx5IGhhcmQtZW5hYmxlIGludGVycnVwdHMgbm93IHRoYXQgdGhlIERFQyBoYXMgYmVlbgotCSAqIGJ1bXBlZCB0byBpdHMgbWF4aW11bSB2YWx1ZQotCSAqLwotCW1heV9oYXJkX2lycV9lbmFibGUoKTsKLQotCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmIGRlZmluZWQoQ09ORklHX1BNQUMpCi0JaWYgKGF0b21pY19yZWFkKCZwcGNfbl9sb3N0X2ludGVycnVwdHMpICE9IDApCi0JCWRvX0lSUShyZWdzKTsKLSNlbmRpZgotCi0Jb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7Ci0JaXJxX2VudGVyKCk7Ci0KIAl0cmFjZV90aW1lcl9pbnRlcnJ1cHRfZW50cnkocmVncyk7CiAKIAlpZiAodGVzdF9pcnFfd29ya19wZW5kaW5nKCkpIHsKQEAgLTU1MSw3ICs1MTgsNDggQEAKICNlbmRpZgogCiAJdHJhY2VfdGltZXJfaW50ZXJydXB0X2V4aXQocmVncyk7Cit9CiAKKy8qCisgKiB0aW1lcl9pbnRlcnJ1cHQgLSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBkZWNyZW1lbnRlciBvdmVyZmxvd3MsCisgKiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3ZvaWQgdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7CisJdTY0ICpuZXh0X3RiID0gJl9fZ2V0X2NwdV92YXIoZGVjcmVtZW50ZXJzX25leHRfdGIpOworCisJLyogRW5zdXJlIGEgcG9zaXRpdmUgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGUgZGVjcmVtZW50ZXIsIG9yIGVsc2UKKwkgKiBzb21lIENQVXMgd2lsbCBjb250aW51ZSB0byB0YWtlIGRlY3JlbWVudGVyIGV4Y2VwdGlvbnMuCisJICovCisJc2V0X2RlYyhERUNSRU1FTlRFUl9NQVgpOworCisJLyogU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgaG90cGx1ZyB3aWxsIGdldCB0aW1lciBpbnRlcnJ1cHRzIHdoaWxlCisJICogb2ZmbGluZSwganVzdCBpZ25vcmUgdGhlc2UgYW5kIHdlIGFsc28gbmVlZCB0byBzZXQKKwkgKiBkZWNyZW1lbnRlcnNfbmV4dF90YiBhcyBNQVggdG8gbWFrZSBzdXJlIF9fY2hlY2tfaXJxX3JlcGxheQorCSAqIGRvbid0IHJlcGxheSB0aW1lciBpbnRlcnJ1cHQgd2hlbiByZXR1cm4sIG90aGVyd2lzZSB3ZSdsbCB0cmFwCisJICogaGVyZSBpbmZpbml0ZWx5IDooCisJICovCisJaWYgKCFjcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpIHsKKwkJKm5leHRfdGIgPSB+KHU2NCkwOworCQlyZXR1cm47CisJfQorCisJLyogQ29uZGl0aW9uYWxseSBoYXJkLWVuYWJsZSBpbnRlcnJ1cHRzIG5vdyB0aGF0IHRoZSBERUMgaGFzIGJlZW4KKwkgKiBidW1wZWQgdG8gaXRzIG1heGltdW0gdmFsdWUKKwkgKi8KKwltYXlfaGFyZF9pcnFfZW5hYmxlKCk7CisKKworI2lmIGRlZmluZWQoQ09ORklHX1BQQzMyKSAmJiBkZWZpbmVkKENPTkZJR19QTUFDKQorCWlmIChhdG9taWNfcmVhZCgmcHBjX25fbG9zdF9pbnRlcnJ1cHRzKSAhPSAwKQorCQlkb19JUlEocmVncyk7CisjZW5kaWYKKworCW9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOworCWlycV9lbnRlcigpOworCisJX190aW1lcl9pbnRlcnJ1cHQoKTsKIAlpcnFfZXhpdCgpOwogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CkBAIC04MjUsNiArODMzLDE1IEBACiAJCWRlY3JlbWVudGVyX3NldF9uZXh0X2V2ZW50KERFQ1JFTUVOVEVSX01BWCwgZGV2KTsKIH0KIAorLyogSW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSB0aW1lciBicm9hZGNhc3QgSVBJICovCit2b2lkIHRpY2tfYnJvYWRjYXN0X2lwaV9oYW5kbGVyKHZvaWQpCit7CisJdTY0ICpuZXh0X3RiID0gJl9fZ2V0X2NwdV92YXIoZGVjcmVtZW50ZXJzX25leHRfdGIpOworCisJKm5leHRfdGIgPSBnZXRfdGJfb3JfcnRjKCk7CisJX190aW1lcl9pbnRlcnJ1cHQoKTsKK30KKwogc3RhdGljIHZvaWQgcmVnaXN0ZXJfZGVjcmVtZW50ZXJfY2xvY2tldmVudChpbnQgY3B1KQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRlYyA9ICZwZXJfY3B1KGRlY3JlbWVudGVycywgY3B1KTsKQEAgLTkyOCw2ICs5NDUsNyBAQAogCWNsb2Nrc291cmNlX2luaXQoKTsKIAogCWluaXRfZGVjcmVtZW50ZXJfY2xvY2tldmVudCgpOworCXRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3QoKTsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggMzNjZDdhMC4uZGY4NmYwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMTM3OSw4ICsxMzc5LDkgQEAKIAlpZiAoIWFyY2hfaXJxX2Rpc2FibGVkX3JlZ3MocmVncykpCiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCXByX2VycigiJXNGYWNpbGl0eSAnJXMnIHVuYXZhaWxhYmxlLCBleGNlcHRpb24gYXQgMHglbHgsIE1TUj0lbHhcbiIsCi0JICAgICAgIGh2ID8gIkh5cGVydmlzb3IgIiA6ICIiLCBmYWNpbGl0eSwgcmVncy0+bmlwLCByZWdzLT5tc3IpOworCXByX2Vycl9yYXRlbGltaXRlZCgKKwkJIiVzRmFjaWxpdHkgJyVzJyB1bmF2YWlsYWJsZSwgZXhjZXB0aW9uIGF0IDB4JWx4LCBNU1I9JWx4XG4iLAorCQlodiA/ICJIeXBlcnZpc29yICIgOiAiIiwgZmFjaWxpdHksIHJlZ3MtPm5pcCwgcmVncy0+bXNyKTsKIAogCWlmICh1c2VyX21vZGUocmVncykpIHsKIAkJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIElMTF9JTExPUEMsIHJlZ3MtPm5pcCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCmluZGV4IDA5NGU0NWMuLmNlNzRjMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCkBAIC03MTUsOCArNzE1LDggQEAKIAl1bnNpZ25lZCBsb25nIGNwdSwgbm9kZSwgdmFsOwogCiAJLyoKLQkgKiBTUFJHMyBjb250YWlucyB0aGUgQ1BVIGluIHRoZSBib3R0b20gMTYgYml0cyBhbmQgdGhlIE5VTUEgbm9kZSBpbgotCSAqIHRoZSBuZXh0IDE2IGJpdHMuIFRoZSBWRFNPIHVzZXMgdGhpcyB0byBpbXBsZW1lbnQgZ2V0Y3B1KCkuCisJICogU1BSR19WRFNPIGNvbnRhaW5zIHRoZSBDUFUgaW4gdGhlIGJvdHRvbSAxNiBiaXRzIGFuZCB0aGUgTlVNQSBub2RlCisJICogaW4gdGhlIG5leHQgMTYgYml0cy4gIFRoZSBWRFNPIHVzZXMgdGhpcyB0byBpbXBsZW1lbnQgZ2V0Y3B1KCkuCiAJICovCiAJY3B1ID0gZ2V0X2NwdSgpOwogCVdBUk5fT05fT05DRShjcHUgPiAweGZmZmYpOwpAQCAtNzI1LDggKzcyNSw4IEBACiAJV0FSTl9PTl9PTkNFKG5vZGUgPiAweGZmZmYpOwogCiAJdmFsID0gKGNwdSAmIDB4ZmZmKSB8ICgobm9kZSAmIDB4ZmZmZikgPDwgMTYpOwotCW10c3ByKFNQUk5fU1BSRzMsIHZhbCk7Ci0JZ2V0X3BhY2EoKS0+c3ByZzMgPSB2YWw7CisJbXRzcHIoU1BSTl9TUFJHX1ZEU09fV1JJVEUsIHZhbCk7CisJZ2V0X3BhY2EoKS0+c3ByZ192ZHNvID0gdmFsOwogCiAJcHV0X2NwdSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi9nZXRjcHUuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL2dldGNwdS5TCmluZGV4IDQ3YWZkMDguLjIzZWI5YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL2dldGNwdS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL2dldGNwdS5TCkBAIC0yOSw3ICsyOSw3IEBACiAgKi8KIFZfRlVOQ1RJT05fQkVHSU4oX19rZXJuZWxfZ2V0Y3B1KQogICAuY2ZpX3N0YXJ0cHJvYwotCW1mc3ByCXI1LFNQUk5fVVNQUkczCisJbWZzcHIJcjUsU1BSTl9TUFJHX1ZEU09fUkVBRAogCWNtcGRpCWNyMCxyMywwCiAJY21wZGkJY3IxLHI0LDAKIAljbHJsd2kgIHI2LHI1LDE2CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9nZXRjcHUuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L2dldGNwdS5TCmluZGV4IDQ3YWZkMDguLjIzZWI5YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L2dldGNwdS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L2dldGNwdS5TCkBAIC0yOSw3ICsyOSw3IEBACiAgKi8KIFZfRlVOQ1RJT05fQkVHSU4oX19rZXJuZWxfZ2V0Y3B1KQogICAuY2ZpX3N0YXJ0cHJvYwotCW1mc3ByCXI1LFNQUk5fVVNQUkczCisJbWZzcHIJcjUsU1BSTl9TUFJHX1ZEU09fUkVBRAogCWNtcGRpCWNyMCxyMywwCiAJY21wZGkJY3IxLHI0LDAKIAljbHJsd2kgIHI2LHI1LDE2CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwppbmRleCA4MjZkOGJkOS4uOTA0YzY2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCkBAIC0xNDMyLDcgKzE0MzIsOCBAQAogCiAJCS8qIG5lZWRlZCB0byBlbnN1cmUgcHJvcGVyIG9wZXJhdGlvbiBvZiBjb2hlcmVudCBhbGxvY2F0aW9ucwogCQkgKiBsYXRlciwgaW4gY2FzZSBkcml2ZXIgZG9lc24ndCBzZXQgaXQgZXhwbGljaXRseSAqLwotCQlkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KCZ2aW9kZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJCXZpb2Rldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDY0KTsKKwkJdmlvZGV2LT5kZXYuZG1hX21hc2sgPSAmdmlvZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2s7CiAJfQogCiAJLyogcmVnaXN0ZXIgd2l0aCBnZW5lcmljIGRldmljZSBmcmFtZXdvcmsgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUwppbmRleCBlNjZkNGVjLi41M2Q2NDdmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCkBAIC03NSw4ICs3NSw4IEBACiBFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwN1MpCiAKIAkvKiBSZXN0b3JlIFNQUkczICovCi0JbGQJcjMsUEFDQV9TUFJHMyhyMTMpCi0JbXRzcHIJU1BSTl9TUFJHMyxyMworCWxkCXIzLFBBQ0FfU1BSR19WRFNPKHIxMykKKwltdHNwcglTUFJOX1NQUkdfVkRTT19XUklURSxyMwogCiAJLyogUmVsb2FkIHRoZSBob3N0J3MgUE1VIHJlZ2lzdGVycyAqLwogCWxkCXIzLCBQQUNBTFBQQUNBUFRSKHIxMykJLyogaXMgdGhlIGhvc3QgdXNpbmcgdGhlIFBNVT8gKi8KQEAgLTE1MDQsNzMgKzE1MDQsNiBAQAogMToJYWRkaQlyOCxyOCwxNgogCS5lbmRyCiAKLQkvKiBTYXZlIERFQyAqLwotCW1mc3ByCXI1LFNQUk5fREVDCi0JbWZ0YglyNgotCWV4dHN3CXI1LHI1Ci0JYWRkCXI1LHI1LHI2Ci0Jc3RkCXI1LFZDUFVfREVDX0VYUElSRVMocjkpCi0KLUJFR0lOX0ZUUl9TRUNUSU9OCi0JYgk4ZgotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfQVJDSF8yMDdTKQotCS8qIFR1cm4gb24gVE0gc28gd2UgY2FuIGFjY2VzcyBURkhBUi9URklBUi9URVhBU1IgKi8KLQltZm1zcglyOAotCWxpCXIwLCAxCi0JcmxkaW1pCXI4LCByMCwgTVNSX1RNX0xHLCA2My1NU1JfVE1fTEcKLQltdG1zcmQJcjgKLQotCS8qIFNhdmUgUE9XRVI4LXNwZWNpZmljIHJlZ2lzdGVycyAqLwotCW1mc3ByCXI1LCBTUFJOX0lBTVIKLQltZnNwcglyNiwgU1BSTl9QU1BCCi0JbWZzcHIJcjcsIFNQUk5fRlNDUgotCXN0ZAlyNSwgVkNQVV9JQU1SKHI5KQotCXN0dwlyNiwgVkNQVV9QU1BCKHI5KQotCXN0ZAlyNywgVkNQVV9GU0NSKHI5KQotCW1mc3ByCXI1LCBTUFJOX0lDCi0JbWZzcHIJcjYsIFNQUk5fVlRCCi0JbWZzcHIJcjcsIFNQUk5fVEFSCi0Jc3RkCXI1LCBWQ1BVX0lDKHI5KQotCXN0ZAlyNiwgVkNQVV9WVEIocjkpCi0Jc3RkCXI3LCBWQ1BVX1RBUihyOSkKLSNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCi0JbWZzcHIJcjUsIFNQUk5fVEZIQVIKLQltZnNwcglyNiwgU1BSTl9URklBUgotCW1mc3ByCXI3LCBTUFJOX1RFWEFTUgotCXN0ZAlyNSwgVkNQVV9URkhBUihyOSkKLQlzdGQJcjYsIFZDUFVfVEZJQVIocjkpCi0Jc3RkCXI3LCBWQ1BVX1RFWEFTUihyOSkKLSNlbmRpZgotCW1mc3ByCXI4LCBTUFJOX0VCQkhSCi0Jc3RkCXI4LCBWQ1BVX0VCQkhSKHI5KQotCW1mc3ByCXI1LCBTUFJOX0VCQlJSCi0JbWZzcHIJcjYsIFNQUk5fQkVTQ1IKLQltZnNwcglyNywgU1BSTl9DU0lHUgotCW1mc3ByCXI4LCBTUFJOX1RBQ1IKLQlzdGQJcjUsIFZDUFVfRUJCUlIocjkpCi0Jc3RkCXI2LCBWQ1BVX0JFU0NSKHI5KQotCXN0ZAlyNywgVkNQVV9DU0lHUihyOSkKLQlzdGQJcjgsIFZDUFVfVEFDUihyOSkKLQltZnNwcglyNSwgU1BSTl9UQ1NDUgotCW1mc3ByCXI2LCBTUFJOX0FDT1AKLQltZnNwcglyNywgU1BSTl9QSUQKLQltZnNwcglyOCwgU1BSTl9XT1JUCi0Jc3RkCXI1LCBWQ1BVX1RDU0NSKHI5KQotCXN0ZAlyNiwgVkNQVV9BQ09QKHI5KQotCXN0dwlyNywgVkNQVV9HVUVTVF9QSUQocjkpCi0Jc3RkCXI4LCBWQ1BVX1dPUlQocjkpCi04OgotCi0JLyogU2F2ZSBhbmQgcmVzZXQgQU1SIGFuZCBVQU1PUiBiZWZvcmUgdHVybmluZyBvbiB0aGUgTU1VICovCi1CRUdJTl9GVFJfU0VDVElPTgotCW1mc3ByCXI1LFNQUk5fQU1SCi0JbWZzcHIJcjYsU1BSTl9VQU1PUgotCXN0ZAlyNSxWQ1BVX0FNUihyOSkKLQlzdGQJcjYsVkNQVV9VQU1PUihyOSkKLQlsaQlyNiwwCi0JbXRzcHIJU1BSTl9BTVIscjYKLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQotCiAJLyogVW5zZXQgZ3Vlc3QgbW9kZSAqLwogCWxpCXIwLCBLVk1fR1VFU1RfTU9ERV9OT05FCiAJc3RiCXIwLCBIU1RBVEVfSU5fR1VFU1QocjEzKQpAQCAtMjIwMyw3ICsyMTM2LDcgQEAKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FMVElWRUMpCiAjZW5kaWYKIAltZnNwcglyNixTUFJOX1ZSU0FWRQotCXN0dwlyNixWQ1BVX1ZSU0FWRShyMykKKwlzdHcJcjYsVkNQVV9WUlNBVkUocjMxKQogCW10bHIJcjMwCiAJbXRtc3JkCXI1CiAJaXN5bmMKQEAgLTIyNDAsNyArMjE3Myw3IEBACiAJYmwJLmxvYWRfdnJfc3RhdGUKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FMVElWRUMpCiAjZW5kaWYKLQlsd3oJcjcsVkNQVV9WUlNBVkUocjQpCisJbHd6CXI3LFZDUFVfVlJTQVZFKHIzMSkKIAltdHNwcglTUFJOX1ZSU0FWRSxyNwogCW10bHIJcjMwCiAJbXIJcjQscjMxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMKaW5kZXggZjc3OTQ1MC4uMzUzM2M5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaW50ZXJydXB0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2ludGVycnVwdHMuUwpAQCAtMTUzLDggKzE1Myw4IEBACiAJICogUmVsb2FkIGtlcm5lbCBTUFJHMyB2YWx1ZS4KIAkgKiBObyBuZWVkIHRvIHNhdmUgZ3Vlc3QgdmFsdWUgYXMgdXNlcm1vZGUgY2FuJ3QgbW9kaWZ5IFNQUkczLgogCSAqLwotCWxkCXIzLCBQQUNBX1NQUkczKHIxMykKLQltdHNwcglTUFJOX1NQUkczLCByMworCWxkCXIzLCBQQUNBX1NQUkdfVkRTTyhyMTMpCisJbXRzcHIJU1BSTl9TUFJHX1ZEU09fV1JJVEUsIHIzCiAjZW5kaWYgLyogQ09ORklHX1BQQ19CT09LM1NfNjQgKi8KIAogCS8qIFI3ID0gdmNwdSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZWh2X2ludGVycnVwdHMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2Vodl9pbnRlcnJ1cHRzLlMKaW5kZXggZTQxODVmNi4uYTE3MTJiOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZWh2X2ludGVycnVwdHMuUworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlaHZfaW50ZXJydXB0cy5TCkBAIC0yMjksMTcgKzIyOSwyMCBAQAogCXN0dwlyMTAsIFZDUFVfQ1IocjQpCiAJUFBDX1NUTCByMTEsIFZDUFVfR1BSKFI0KShyNCkKIAlQUENfU1RMCXI1LCBWQ1BVX0dQUihSNSkocjQpCi0JLmlmIFx0eXBlID09IEVYX0NSSVQKLQlQUENfTEwJcjUsIChccGFjYV9leCArIEVYX1IxMykocjEzKQotCS5lbHNlCi0JbWZzcHIJcjUsIFxzY3JhdGNoCi0JLmVuZGlmCiAJUFBDX1NUTAlyNiwgVkNQVV9HUFIoUjYpKHI0KQogCVBQQ19TVEwJcjgsIFZDUFVfR1BSKFI4KShyNCkKIAlQUENfU1RMCXI5LCBWQ1BVX0dQUihSOSkocjQpCi0JUFBDX1NUTCByNSwgVkNQVV9HUFIoUjEzKShyNCkKKwkuaWYgXHR5cGUgPT0gRVhfVExCCisJUFBDX0xMCXI1LCBFWF9UTEJfUjEzKHIxMikKKwlQUENfTEwJcjYsIEVYX1RMQl9SMTAocjEyKQorCVBQQ19MTAlyOCwgRVhfVExCX1IxMShyMTIpCisJbWZzcHIJcjEyLCBcc2NyYXRjaAorCS5lbHNlCisJbWZzcHIJcjUsIFxzY3JhdGNoCiAJUFBDX0xMCXI2LCAoXHBhY2FfZXggKyBcZXhfcjEwKShyMTMpCiAJUFBDX0xMCXI4LCAoXHBhY2FfZXggKyBcZXhfcjExKShyMTMpCisJLmVuZGlmCisJUFBDX1NUTCByNSwgVkNQVV9HUFIoUjEzKShyNCkKIAlQUENfU1RMIHIzLCBWQ1BVX0dQUihSMykocjQpCiAJUFBDX1NUTCByNywgVkNQVV9HUFIoUjcpKHI0KQogCVBQQ19TVEwgcjEyLCBWQ1BVX0dQUihSMTIpKHI0KQpAQCAtNDM1LDEwICs0MzgsMTYgQEAKIAlQUENfU1RMCXI1LCBWQ1BVX0xSKHI0KQogCW1mc3ByCXI3LCBTUFJOX1NQUkc1CiAJc3R3CXIzLCBWQ1BVX1ZSU0FWRShyNCkKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwlQUENfTEwJcjMsIFBBQ0FfU1BSR19WRFNPKHIxMykKKyNlbmRpZgogCVBQQ19TVEQocjYsIFZDUFVfU0hBUkVEX1NQUkc0LCByMTEpCiAJbWZzcHIJcjgsIFNQUk5fU1BSRzYKIAlQUENfU1REKHI3LCBWQ1BVX1NIQVJFRF9TUFJHNSwgcjExKQogCW1mc3ByCXI5LCBTUFJOX1NQUkc3CisjaWZkZWYgQ09ORklHXzY0QklUCisJbXRzcHIJU1BSTl9TUFJHX1ZEU09fV1JJVEUsIHIzCisjZW5kaWYKIAlQUENfU1REKHI4LCBWQ1BVX1NIQVJFRF9TUFJHNiwgcjExKQogCW1meGVyCXIzCiAJUFBDX1NURChyOSwgVkNQVV9TSEFSRURfU1BSRzcsIHIxMSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvbWVtY3B5XzY0LlMgYi9hcmNoL3Bvd2VycGMvbGliL21lbWNweV82NC5TCmluZGV4IGQyYmJiYzguLjcyYWQwNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvbWVtY3B5XzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9tZW1jcHlfNjQuUwpAQCAtMTQsNyArMTQsOSBAQAogQkVHSU5fRlRSX1NFQ1RJT04KIAlzdGQJcjMsNDgocjEpCS8qIHNhdmUgZGVzdGluYXRpb24gcG9pbnRlciBmb3IgcmV0dXJuIHZhbHVlICovCiBGVFJfU0VDVElPTl9FTFNFCisjaWZuZGVmIFNFTEZURVNUCiAJYgltZW1jcHlfcG93ZXI3CisjZW5kaWYKIEFMVF9GVFJfU0VDVElPTl9FTkRfSUZDTFIoQ1BVX0ZUUl9WTVhfQ09QWSkKIAlQUENfTVRPQ1JGKDB4MDEscjUpCiAJY21wbGRpCWNyMSxyNSwxNgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDRiNWNkNWMuLjJjOGU5MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTEzOSw5ICsxMzksMTQgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKKwlpbnQgcmV0OwogCiAJem9uZSA9IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShzdGFydF9wZm4pKTsKLQlyZXR1cm4gX19yZW1vdmVfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0ID0gX19yZW1vdmVfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJaWYgKCFyZXQgJiYgKHBwY19tZC5yZW1vdmVfbWVtb3J5KSkKKwkJcmV0ID0gcHBjX21kLnJlbW92ZV9tZW1vcnkoc3RhcnQsIHNpemUpOworCisJcmV0dXJuIHJldDsKIH0KICNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKaW5kZXggNjJiZjVlOC4uZjZjZTFmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCkBAIC02NDcsNiArNjQ3LDExIEBACiAJCWlmIChvbGQgJiBfUEFHRV9IQVNIUFRFKQogCQkJaHB0ZV9kb19odWdlcGFnZV9mbHVzaCh2bWEtPnZtX21tLCBhZGRyZXNzLCBwbWRwKTsKIAl9CisJLyoKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBnZW5lcmljIGNvZGUgdGhhdCByZWx5IG9uIElSUSBkaXNhYmxpbmcKKwkgKiB0byBwcmV2ZW50IGEgcGFyYWxsZWwgVEhQIHNwbGl0IHdvcmsgYXMgZXhwZWN0ZWQuCisJICovCisJa2lja19hbGxfY3B1c19zeW5jKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCmluZGV4IGM5NWViMzIuLjM1NmU4YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCkBAIC0zOSwzNyArMzksNDkgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyoKKyAqIE5vdGUgdGhhdCwgdW5saWtlIG5vbi1ib2x0ZWQgaGFuZGxlcnMsIFRMQl9FWEZSQU1FIGlzIG5vdAorICogbW9kaWZpZWQgYnkgdGhlIFRMQiBtaXNzIGhhbmRsZXJzIHRoZW1zZWx2ZXMsIHNpbmNlIHRoZSBUTEIgbWlzcworICogaGFuZGxlciBjb2RlIHdpbGwgbm90IGl0c2VsZiBjYXVzZSBhIHJlY3Vyc2l2ZSBUTEIgbWlzcy4KKyAqCisgKiBUTEJfRVhGUkFNRSB3aWxsIGJlIG1vZGlmaWVkIHdoZW4gY3JpdC9tYy9kZWJ1ZyBleGNlcHRpb25zIGFyZQorICogZW50ZXJlZC9leGl0ZWQuCisgKi8KIC5tYWNybyB0bGJfcHJvbG9nX2JvbHRlZCBpbnRudW0gYWRkcgotCW10c3ByCVNQUk5fU1BSR19HRU5fU0NSQVRDSCxyMTMKKwltdHNwcglTUFJOX1NQUkdfR0VOX1NDUkFUQ0gscjEyCisJbWZzcHIJcjEyLFNQUk5fU1BSR19UTEJfRVhGUkFNRQorCXN0ZAlyMTMsRVhfVExCX1IxMyhyMTIpCisJc3RkCXIxMCxFWF9UTEJfUjEwKHIxMikKIAltZnNwcglyMTMsU1BSTl9TUFJHX1BBQ0EKLQlzdGQJcjEwLFBBQ0FfRVhUTEIrRVhfVExCX1IxMChyMTMpCisKIAltZmNyCXIxMAotCXN0ZAlyMTEsUEFDQV9FWFRMQitFWF9UTEJfUjExKHIxMykKKwlzdGQJcjExLEVYX1RMQl9SMTEocjEyKQogI2lmZGVmIENPTkZJR19LVk1fQk9PS0VfSFYKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJbWZzcHIJcjExLCBTUFJOX1NSUjEKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0VNQl9IVikKICNlbmRpZgogCURPX0tWTQlcaW50bnVtLCBTUFJOX1NSUjEKLQlzdGQJcjE2LFBBQ0FfRVhUTEIrRVhfVExCX1IxNihyMTMpCisJc3RkCXIxNixFWF9UTEJfUjE2KHIxMikKIAltZnNwcglyMTYsXGFkZHIJCS8qIGdldCBmYXVsdGluZyBhZGRyZXNzICovCi0Jc3RkCXIxNCxQQUNBX0VYVExCK0VYX1RMQl9SMTQocjEzKQorCXN0ZAlyMTQsRVhfVExCX1IxNChyMTIpCiAJbGQJcjE0LFBBQ0FQR0QocjEzKQotCXN0ZAlyMTUsUEFDQV9FWFRMQitFWF9UTEJfUjE1KHIxMykKLQlzdGQJcjEwLFBBQ0FfRVhUTEIrRVhfVExCX0NSKHIxMykKLQlUTEJfTUlTU19QUk9MT0dfU1RBVFNfQk9MVEVECisJc3RkCXIxNSxFWF9UTEJfUjE1KHIxMikKKwlzdGQJcjEwLEVYX1RMQl9DUihyMTIpCisJVExCX01JU1NfUFJPTE9HX1NUQVRTCiAuZW5kbQogCiAubWFjcm8gdGxiX2VwaWxvZ19ib2x0ZWQKLQlsZAlyMTQsUEFDQV9FWFRMQitFWF9UTEJfQ1IocjEzKQotCWxkCXIxMCxQQUNBX0VYVExCK0VYX1RMQl9SMTAocjEzKQotCWxkCXIxMSxQQUNBX0VYVExCK0VYX1RMQl9SMTEocjEzKQorCWxkCXIxNCxFWF9UTEJfQ1IocjEyKQorCWxkCXIxMCxFWF9UTEJfUjEwKHIxMikKKwlsZAlyMTEsRVhfVExCX1IxMShyMTIpCisJbGQJcjEzLEVYX1RMQl9SMTMocjEyKQogCW10Y3IJcjE0Ci0JbGQJcjE0LFBBQ0FfRVhUTEIrRVhfVExCX1IxNChyMTMpCi0JbGQJcjE1LFBBQ0FfRVhUTEIrRVhfVExCX1IxNShyMTMpCi0JVExCX01JU1NfUkVTVE9SRV9TVEFUU19CT0xURUQKLQlsZAlyMTYsUEFDQV9FWFRMQitFWF9UTEJfUjE2KHIxMykKLQltZnNwcglyMTMsU1BSTl9TUFJHX0dFTl9TQ1JBVENICisJbGQJcjE0LEVYX1RMQl9SMTQocjEyKQorCWxkCXIxNSxFWF9UTEJfUjE1KHIxMikKKwlUTEJfTUlTU19SRVNUT1JFX1NUQVRTCisJbGQJcjE2LEVYX1RMQl9SMTYocjEyKQorCW1mc3ByCXIxMixTUFJOX1NQUkdfR0VOX1NDUkFUQ0gKIC5lbmRtCiAKIC8qIERhdGEgVExCIG1pc3MgKi8KQEAgLTI4NCw3ICsyOTYsNyBAQAogICogcjE0ID0gcGFnZSB0YWJsZSBiYXNlCiAgKiByMTMgPSBQQUNBCiAgKiByMTEgPSB0bGJfcGVyX2NvcmUgcHRyCi0gKiByMTAgPSBjcmFwIChmcmVlIHRvIHVzZSkKKyAqIHIxMCA9IGNwdSBudW1iZXIKICAqLwogdGxiX21pc3NfY29tbW9uX2U2NTAwOgogCS8qCkBAIC0yOTMsMTUgKzMwNSwxOCBAQAogCSAqCiAJICogTUFTNjpJTkQgc2hvdWxkIGJlIGFscmVhZHkgc2V0IGJhc2VkIG9uIE1BUzQKIAkgKi8KLQlhZGRpCXIxMCxyMTEsVENEX0xPQ0sKLTE6CWxiYXJ4CXIxNSwwLHIxMAorMToJbGJhcngJcjE1LDAscjExCisJbGh6CXIxMCxQQUNBUEFDQUlOREVYKHIxMykKIAljbXBkaQlyMTUsMAorCWNtcGRpCWNyMSxyMTUsMQkvKiBzZXQgY3IxLmVxID0gMCBmb3Igbm9uLXJlY3Vyc2l2ZSAqLwogCWJuZQkyZgotCWxpCXIxNSwxCi0Jc3RiY3guCXIxNSwwLHIxMAorCXN0YmN4LglyMTAsMCxyMTEKIAlibmUJMWIKKzM6CiAJLnN1YnNlY3Rpb24gMQotMjoJbGJ6CXIxNSwwKHIxMCkKKzI6CWNtcGQJY3IxLHIxNSxyMTAJLyogcmVjdXJzaXZlIGxvY2sgZHVlIHRvIG1jaGVjay9jcml0L2V0Yz8gKi8KKwliZXEJY3IxLDNiCQkvKiB1bmxvY2sgd2lsbCBoYXBwZW4gaWYgY3IxLmVxID0gMCAqLworCWxieglyMTUsMChyMTEpCiAJY21wZGkJcjE1LDAKIAlibmUJMmIKIAliCTFiCkBAIC0zNzksOSArMzk0LDExIEBACiAKIHRsYl9taXNzX2RvbmVfZTY1MDA6CiAJLm1hY3JvCXRsYl91bmxvY2tfZTY1MDAKKwliZXEJY3IxLDFmCQkvKiBubyB1bmxvY2sgaWYgbG9jayB3YXMgcmVjdXJzaXZlbHkgZ3JhYmJlZCAqLwogCWxpCXIxNSwwCiAJaXN5bmMKLQlzdGIJcjE1LFRDRF9MT0NLKHIxMSkKKwlzdGIJcjE1LDAocjExKQorMToKIAkuZW5kbQogCiAJdGxiX3VubG9ja19lNjUwMApAQCAtMTA5MSw3ICsxMTA4LDggQEAKIAlsZAlyMTEsUEFDQVRPQyhyMTMpCiAJbGQJcjExLGxpbmVhcl9tYXBfdG9wQGdvdChyMTEpCiAJbGQJcjEwLDAocjExKQotCWNtcGxkCWNyMCxyMTAscjE2CisJdG92aXJ0KDEwLDEwKQorCWNtcGxkCWNyMCxyMTYscjEwCiAJYmdlCXRsYl9sb2FkX2xpbmVhcl9mYXVsdAogCiAJLyogTUFTMSBuZWVkIHdob2xlIG5ldyBzZXR1cC4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCmluZGV4IGIzN2E1OGUuLmFlM2Q1YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwpAQCAtMTQ0LDYgKzE0NCwxNSBAQAogaW50IGJvb2szZV9odHdfbW9kZTsJCS8qIEhXIHRhYmxld2Fsaz8gIFZhbHVlIGlzIFBQQ19IVFdfKiAqLwogdW5zaWduZWQgbG9uZyBsaW5lYXJfbWFwX3RvcDsJLyogVG9wIG9mIGxpbmVhciBtYXBwaW5nICovCiAKKworLyoKKyAqIE51bWJlciBvZiBieXRlcyB0byBhZGQgdG8gU1BSTl9TUFJHX1RMQl9FWEZSQU1FIG9uIGNyaXQvbWNoZWNrL2RlYnVnCisgKiBleGNlcHRpb25zLiAgVGhpcyBpcyB1c2VkIGZvciBib2x0ZWQgYW5kIGU2NTAwIFRMQiBtaXNzIGhhbmRsZXJzIHdoaWNoCisgKiBkbyBub3QgbW9kaWZ5IHRoaXMgU1BSRyBpbiB0aGUgVExCIG1pc3MgY29kZTsgZm9yIG90aGVyIFRMQiBtaXNzIGhhbmRsZXJzLAorICogdGhpcyBpcyBzZXQgdG8gemVyby4KKyAqLworaW50IGV4dGxiX2xldmVsX2V4YzsKKwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCkBAIC01NTksNiArNTY4LDcgQEAKIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCiAJY2FzZSBQUENfSFRXX0U2NTAwOgorCQlleHRsYl9sZXZlbF9leGMgPSBFWF9UTEJfU0laRTsKIAkJcGF0Y2hfZXhjZXB0aW9uKDB4MWMwLCBleGNfZGF0YV90bGJfbWlzc19lNjUwMF9ib29rM2UpOwogCQlwYXRjaF9leGNlcHRpb24oMHgxZTAsIGV4Y19pbnN0cnVjdGlvbl90bGJfbWlzc19lNjUwMF9ib29rM2UpOwogCQlicmVhazsKQEAgLTY1Miw2ICs2NjIsNyBAQAogCQltZW1ibG9ja19lbmZvcmNlX21lbW9yeV9saW1pdChsaW5lYXJfbWFwX3RvcCk7CiAKIAkJaWYgKGJvb2szZV9odHdfbW9kZSA9PSBQUENfSFRXX05PTkUpIHsKKwkJCWV4dGxiX2xldmVsX2V4YyA9IEVYX1RMQl9TSVpFOwogCQkJcGF0Y2hfZXhjZXB0aW9uKDB4MWMwLCBleGNfZGF0YV90bGJfbWlzc19ib2x0ZWRfYm9vazNlKTsKIAkJCXBhdGNoX2V4Y2VwdGlvbigweDFlMCwKIAkJCQlleGNfaW5zdHJ1Y3Rpb25fdGxiX21pc3NfYm9sdGVkX2Jvb2szZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wZXJmL01ha2VmaWxlCmluZGV4IDYwZDcxZWUuLmY5YzA4M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wZXJmL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL01ha2VmaWxlCkBAIC0xMSw1ICsxMSw3IEBACiBvYmotJChDT05GSUdfRlNMX0VNQl9QRVJGX0VWRU5UKSArPSBjb3JlLWZzbC1lbWIubwogb2JqLSQoQ09ORklHX0ZTTF9FTUJfUEVSRl9FVkVOVF9FNTAwKSArPSBlNTAwLXBtdS5vIGU2NTAwLXBtdS5vCiAKK29iai0kKENPTkZJR19IVl9QRVJGX0NUUlMpICs9IGh2LTI0eDcubyBodi1ncGNpLm8gaHYtY29tbW9uLm8KKwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gJChvYmo2NC15KQogb2JqLSQoQ09ORklHX1BQQzMyKQkJKz0gJChvYmozMi15KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvY29yZS1ib29rM3MuYyBiL2FyY2gvcG93ZXJwYy9wZXJmL2NvcmUtYm9vazNzLmMKaW5kZXggNjdjZjIyMC4uNDUyMGM5MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BlcmYvY29yZS1ib29rM3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9jb3JlLWJvb2szcy5jCkBAIC03OCw2ICs3OCw3IEBACiAjZGVmaW5lIE1NQ1IwX0ZDNTYJCTAKICNkZWZpbmUgTU1DUjBfUE1BTwkJMAogI2RlZmluZSBNTUNSMF9FQkUJCTAKKyNkZWZpbmUgTU1DUjBfQkhSQkEJCTAKICNkZWZpbmUgTU1DUjBfUE1DQwkJMAogI2RlZmluZSBNTUNSMF9QTUNDX1U2CQkwCiAKQEAgLTEyMCw2ICsxMjEsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHBvd2VyX3BtdV9iaHJiX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KSB7fQogdm9pZCBwb3dlcl9wbXVfZmx1c2hfYnJhbmNoX3N0YWNrKHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgcG93ZXJfcG11X2JocmJfcmVhZChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1aHcpIHt9CitzdGF0aWMgdm9pZCBwbWFvX3Jlc3RvcmVfd29ya2Fyb3VuZChib29sIGViYikgeyB9CiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAKIHN0YXRpYyBib29sIHJlZ3NfdXNlX3NpYXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC01MDIsOCArNTA0LDExIEBACiAJCWlmICghbGVhZGVyLT5hdHRyLnBpbm5lZCB8fCAhbGVhZGVyLT5hdHRyLmV4Y2x1c2l2ZSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChldmVudC0+YXR0ci5pbmhlcml0IHx8IGV2ZW50LT5hdHRyLnNhbXBsZV9wZXJpb2QgfHwKLQkJICAgIGV2ZW50LT5hdHRyLmVuYWJsZV9vbl9leGVjIHx8IGV2ZW50LT5hdHRyLmZyZXEpCisJCWlmIChldmVudC0+YXR0ci5mcmVxIHx8CisJCSAgICBldmVudC0+YXR0ci5pbmhlcml0IHx8CisJCSAgICBldmVudC0+YXR0ci5zYW1wbGVfdHlwZSB8fAorCQkgICAgZXZlbnQtPmF0dHIuc2FtcGxlX3BlcmlvZCB8fAorCQkgICAgZXZlbnQtPmF0dHIuZW5hYmxlX29uX2V4ZWMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTU0MiwxMyArNTQ3LDIxIEBACiAJaWYgKCFlYmIpCiAJCWdvdG8gb3V0OwogCi0JLyogRW5hYmxlIEVCQiBhbmQgcmVhZC93cml0ZSB0byBhbGwgNiBQTUNzIGZvciB1c2Vyc3BhY2UgKi8KLQltbWNyMCB8PSBNTUNSMF9FQkUgfCBNTUNSMF9QTUNDX1U2OworCS8qIEVuYWJsZSBFQkIgYW5kIHJlYWQvd3JpdGUgdG8gYWxsIDYgUE1DcyBhbmQgQkhSQiBmb3IgdXNlcnNwYWNlICovCisJbW1jcjAgfD0gTU1DUjBfRUJFIHwgTU1DUjBfQkhSQkEgfCBNTUNSMF9QTUNDX1U2OwogCi0JLyogQWRkIGFueSBiaXRzIGZyb20gdGhlIHVzZXIgcmVnLCBGQyBvciBQTUFPICovCisJLyoKKwkgKiBBZGQgYW55IGJpdHMgZnJvbSB0aGUgdXNlciBNTUNSMCwgRkMgb3IgUE1BTy4gVGhpcyBpcyBjb21wYXRpYmxlCisJICogd2l0aCBwbWFvX3Jlc3RvcmVfd29ya2Fyb3VuZCgpIGJlY2F1c2Ugd2UgbWF5IGFkZCBQTUFPIGJ1dCB3ZSBuZXZlcgorCSAqIGNsZWFyIGl0IGhlcmUuCisJICovCiAJbW1jcjAgfD0gY3VycmVudC0+dGhyZWFkLm1tY3IwOwogCi0JLyogQmUgY2FyZWZ1bCBub3QgdG8gc2V0IFBNWEUgaWYgdXNlcnNwYWNlIGhhZCBpdCBjbGVhcmVkICovCisJLyoKKwkgKiBCZSBjYXJlZnVsIG5vdCB0byBzZXQgUE1YRSBpZiB1c2Vyc3BhY2UgaGFkIGl0IGNsZWFyZWQuIFRoaXMgaXMgYWxzbworCSAqIGNvbXBhdGlibGUgd2l0aCBwbWFvX3Jlc3RvcmVfd29ya2Fyb3VuZCgpIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkKKwkgKiBjbGVhcmVkIFBNWEUgYW5kIHdlIGxlYXZlIFBNQU8gYWxvbmUuCisJICovCiAJaWYgKCEoY3VycmVudC0+dGhyZWFkLm1tY3IwICYgTU1DUjBfUE1YRSkpCiAJCW1tY3IwICY9IH5NTUNSMF9QTVhFOwogCkBAIC01NTksMTQgKzU3Miw5NSBAQAogb3V0OgogCXJldHVybiBtbWNyMDsKIH0KKworc3RhdGljIHZvaWQgcG1hb19yZXN0b3JlX3dvcmthcm91bmQoYm9vbCBlYmIpCit7CisJdW5zaWduZWQgcG1jc1s2XTsKKworCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUE1BT19CVUcpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE9uIFBPV0VSOEUgdGhlcmUgaXMgYSBoYXJkd2FyZSBkZWZlY3Qgd2hpY2ggYWZmZWN0cyB0aGUgUE1VIGNvbnRleHQKKwkgKiBzd2l0Y2ggbG9naWMsIGllLiBwb3dlcl9wbXVfZGlzYWJsZS9lbmFibGUoKS4KKwkgKgorCSAqIFdoZW4gYSBjb3VudGVyIG92ZXJmbG93cyBQTVhFIGlzIGNsZWFyZWQgYW5kIEZDL1BNQU8gaXMgc2V0IGluIE1NQ1IwCisJICogYnkgdGhlIGhhcmR3YXJlLiBTb21ldGltZSBsYXRlciB0aGUgYWN0dWFsIFBNVSBleGNlcHRpb24gaXMKKwkgKiBkZWxpdmVyZWQuCisJICoKKwkgKiBJZiB3ZSBjb250ZXh0IHN3aXRjaCwgb3Igc2ltcGx5IGRpc2FibGUvZW5hYmxlLCB0aGUgUE1VIHByaW9yIHRvIHRoZQorCSAqIGV4Y2VwdGlvbiBhcnJpdmluZywgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIGxvc3Qgd2hlbiB3ZSBjbGVhciBQTUFPLgorCSAqCisJICogV2hlbiB3ZSByZWVuYWJsZSB0aGUgUE1VLCB3ZSB3aWxsIHdyaXRlIHRoZSBzYXZlZCBNTUNSMCB3aXRoIFBNQU8KKwkgKiBzZXQsIGFuZCB0aGlzIF9zaG91bGRfIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbi4gSG93ZXZlciBiZWNhdXNlIG9mIHRoZQorCSAqIGRlZmVjdCBubyBleGNlcHRpb24gaXMgZ2VuZXJhdGVkIHdoZW4gd2Ugd3JpdGUgUE1BTywgYW5kIHdlIGdldAorCSAqIHN0dWNrIHdpdGggbm8gY291bnRlcnMgY291bnRpbmcgYnV0IG5vIGV4Y2VwdGlvbiBkZWxpdmVyZWQuCisJICoKKwkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBkZXRlY3QgdGhpcyBjYXNlIGFuZCB0d2VhayB0aGUgaGFyZHdhcmUgdG8KKwkgKiBjcmVhdGUgYW5vdGhlciBwZW5kaW5nIFBNVSBleGNlcHRpb24uCisJICoKKwkgKiBXZSBkbyB0aGF0IGJ5IHNldHRpbmcgdXAgUE1DNiAoY3ljbGVzKSBmb3IgYW4gaW1taW5lbnQgb3ZlcmZsb3cgYW5kCisJICogZW5hYmxpbmcgdGhlIFBNVS4gVGhhdCBjYXVzZXMgYSBuZXcgZXhjZXB0aW9uIHRvIGJlIGdlbmVyYXRlZCBpbiB0aGUKKwkgKiBjaGlwLCBidXQgd2UgZG9uJ3QgdGFrZSBpdCB5ZXQgYmVjYXVzZSB3ZSBoYXZlIGludGVycnVwdHMgaGFyZAorCSAqIGRpc2FibGVkLiBXZSB0aGVuIHdyaXRlIGJhY2sgdGhlIFBNVSBzdGF0ZSBhcyB3ZSB3YW50IGl0IHRvIGJlIHNlZW4KKwkgKiBieSB0aGUgZXhjZXB0aW9uIGhhbmRsZXIuIFdoZW4gd2UgcmVlbmFibGUgaW50ZXJydXB0cyB0aGUgZXhjZXB0aW9uCisJICogaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBhbmQgc2VlIHRoZSBjb3JyZWN0IHN0YXRlLgorCSAqCisJICogVGhlIGxvZ2ljIGlzIHRoZSBzYW1lIGZvciBFQkIsIGV4Y2VwdCB0aGF0IHRoZSBleGNlcHRpb24gaXMgZ2F0ZWQgYnkKKwkgKiB1cyBoYXZpbmcgaW50ZXJydXB0cyBoYXJkIGRpc2FibGVkIGFzIHdlbGwgYXMgdGhlIGZhY3QgdGhhdCB3ZSBhcmUKKwkgKiBub3QgaW4gdXNlcnNwYWNlLiBUaGUgZXhjZXB0aW9uIGlzIGZpbmFsbHkgZGVsaXZlcmVkIHdoZW4gd2UgcmV0dXJuCisJICogdG8gdXNlcnNwYWNlLgorCSAqLworCisJLyogT25seSBpZiBQTUFPIGlzIHNldCBhbmQgUE1BT19TWU5DIGlzIGNsZWFyICovCisJaWYgKChjdXJyZW50LT50aHJlYWQubW1jcjAgJiAoTU1DUjBfUE1BTyB8IE1NQ1IwX1BNQU9fU1lOQykpICE9IE1NQ1IwX1BNQU8pCisJCXJldHVybjsKKworCS8qIElmIHdlJ3JlIGRvaW5nIEVCQiwgb25seSBpZiBCRVNDUltHRV0gaXMgc2V0ICovCisJaWYgKGViYiAmJiAhKGN1cnJlbnQtPnRocmVhZC5iZXNjciAmIEJFU0NSX0dFKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBhcmUgYWxyZWFkeSBzb2Z0LWRpc2FibGVkIGluIHBvd2VyX3BtdV9lbmFibGUoKS4gV2UgbmVlZCB0byBoYXJkCisJICogZW5hYmxlIHRvIGFjdHVhbGx5IHByZXZlbnQgdGhlIFBNVSBleGNlcHRpb24gZnJvbSBmaXJpbmcuCisJICovCisJaGFyZF9pcnFfZGlzYWJsZSgpOworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IGdyb3NzLCBidXQgd2Uga25vdyB3ZSdyZSBvbiBQT1dFUjhFIGFuZCBoYXZlIDYgUE1Dcy4KKwkgKiBVc2luZyByZWFkL3dyaXRlX3BtYygpIGluIGEgZm9yIGxvb3AgYWRkcyAxMiBmdW5jdGlvbiBjYWxscyBhbmQKKwkgKiBhbG1vc3QgZG91YmxlcyBvdXIgY29kZSBzaXplLgorCSAqLworCXBtY3NbMF0gPSBtZnNwcihTUFJOX1BNQzEpOworCXBtY3NbMV0gPSBtZnNwcihTUFJOX1BNQzIpOworCXBtY3NbMl0gPSBtZnNwcihTUFJOX1BNQzMpOworCXBtY3NbM10gPSBtZnNwcihTUFJOX1BNQzQpOworCXBtY3NbNF0gPSBtZnNwcihTUFJOX1BNQzUpOworCXBtY3NbNV0gPSBtZnNwcihTUFJOX1BNQzYpOworCisJLyogRW5zdXJlIGFsbCBmcmVlemUgYml0cyBhcmUgdW5zZXQgKi8KKwltdHNwcihTUFJOX01NQ1IyLCAwKTsKKworCS8qIFNldCB1cCBQTUM2IHRvIG92ZXJmbG93IGluIG9uZSBjeWNsZSAqLworCW10c3ByKFNQUk5fUE1DNiwgMHg3RkZGRkZGRSk7CisKKwkvKiBFbmFibGUgZXhjZXB0aW9ucyBhbmQgdW5mcmVlemUgUE1DNiAqLworCW10c3ByKFNQUk5fTU1DUjAsIE1NQ1IwX1BNWEUgfCBNTUNSMF9QTUNqQ0UgfCBNTUNSMF9QTUFPKTsKKworCS8qIE5vdyB3ZSBuZWVkIHRvIHJlZnJlZXplIGFuZCByZXN0b3JlIHRoZSBQTUNzICovCisJbXRzcHIoU1BSTl9NTUNSMCwgTU1DUjBfRkMgfCBNTUNSMF9QTUFPKTsKKworCW10c3ByKFNQUk5fUE1DMSwgcG1jc1swXSk7CisJbXRzcHIoU1BSTl9QTUMyLCBwbWNzWzFdKTsKKwltdHNwcihTUFJOX1BNQzMsIHBtY3NbMl0pOworCW10c3ByKFNQUk5fUE1DNCwgcG1jc1szXSk7CisJbXRzcHIoU1BSTl9QTUM1LCBwbWNzWzRdKTsKKwltdHNwcihTUFJOX1BNQzYsIHBtY3NbNV0pOworfQogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiBzdGF0aWMgdm9pZCBwZXJmX2V2ZW50X2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKLXZvaWQgcGVyZl9ldmVudF9wcmludF9kZWJ1Zyh2b2lkKQotewotfQotCiAvKgogICogUmVhZCBvbmUgcGVyZm9ybWFuY2UgbW9uaXRvciBjb3VudGVyIChQTUMpLgogICovCkBAIC02NDUsNiArNzM5LDU3IEBACiAJfQogfQogCisvKiBDYWxsZWQgZnJvbSBzeXNycV9oYW5kbGVfc2hvd3JlZ3MoKSAqLwordm9pZCBwZXJmX2V2ZW50X3ByaW50X2RlYnVnKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzZGFyLCBzaWVyLCBmbGFnczsKKwl1MzIgcG1jc1tNQVhfSFdFVkVOVFNdOworCWludCBpOworCisJaWYgKCFwcG11LT5uX2NvdW50ZXIpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXByX2luZm8oIkNQVTogJWQgUE1VIHJlZ2lzdGVycywgcHBtdSA9ICVzIG5fY291bnRlcnMgPSAlZCIsCisJCSBzbXBfcHJvY2Vzc29yX2lkKCksIHBwbXUtPm5hbWUsIHBwbXUtPm5fY291bnRlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHBtdS0+bl9jb3VudGVyOyBpKyspCisJCXBtY3NbaV0gPSByZWFkX3BtYyhpICsgMSk7CisKKwlmb3IgKDsgaSA8IE1BWF9IV0VWRU5UUzsgaSsrKQorCQlwbWNzW2ldID0gMHhkZWFkYmVlZjsKKworCXByX2luZm8oIlBNQzE6ICAlMDh4IFBNQzI6ICUwOHggUE1DMzogJTA4eCBQTUM0OiAlMDh4XG4iLAorCQkgcG1jc1swXSwgcG1jc1sxXSwgcG1jc1syXSwgcG1jc1szXSk7CisKKwlpZiAocHBtdS0+bl9jb3VudGVyID4gNCkKKwkJcHJfaW5mbygiUE1DNTogICUwOHggUE1DNjogJTA4eCBQTUM3OiAlMDh4IFBNQzg6ICUwOHhcbiIsCisJCQkgcG1jc1s0XSwgcG1jc1s1XSwgcG1jc1s2XSwgcG1jc1s3XSk7CisKKwlwcl9pbmZvKCJNTUNSMDogJTAxNmx4IE1NQ1IxOiAlMDE2bHggTU1DUkE6ICUwMTZseFxuIiwKKwkJbWZzcHIoU1BSTl9NTUNSMCksIG1mc3ByKFNQUk5fTU1DUjEpLCBtZnNwcihTUFJOX01NQ1JBKSk7CisKKwlzZGFyID0gc2llciA9IDA7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJc2RhciA9IG1mc3ByKFNQUk5fU0RBUik7CisKKwlpZiAocHBtdS0+ZmxhZ3MgJiBQUE1VX0hBU19TSUVSKQorCQlzaWVyID0gbWZzcHIoU1BSTl9TSUVSKTsKKworCWlmIChwcG11LT5mbGFncyAmIFBQTVVfRUJCKSB7CisJCXByX2luZm8oIk1NQ1IyOiAlMDE2bHggRUJCSFI6ICUwMTZseFxuIiwKKwkJCW1mc3ByKFNQUk5fTU1DUjIpLCBtZnNwcihTUFJOX0VCQkhSKSk7CisJCXByX2luZm8oIkVCQlJSOiAlMDE2bHggQkVTQ1I6ICUwMTZseFxuIiwKKwkJCW1mc3ByKFNQUk5fRUJCUlIpLCBtZnNwcihTUFJOX0JFU0NSKSk7CisJfQorI2VuZGlmCisJcHJfaW5mbygiU0lBUjogICUwMTZseCBTREFSOiAgJTAxNmx4IFNJRVI6ICAlMDE2bHhcbiIsCisJCW1mc3ByKFNQUk5fU0lBUiksIHNkYXIsIHNpZXIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCiAvKgogICogQ2hlY2sgaWYgYSBzZXQgb2YgZXZlbnRzIGNhbiBhbGwgZ28gb24gdGhlIFBNVSBhdCBvbmNlLgogICogSWYgdGhleSBjYW4ndCwgdGhpcyB3aWxsIGxvb2sgYXQgYWx0ZXJuYXRpdmUgY29kZXMgZm9yIHRoZSBldmVudHMKQEAgLTk3MywxMSArMTExOCwxMiBAQAogCQl9CiAKIAkJLyoKLQkJICogU2V0IHRoZSAnZnJlZXplIGNvdW50ZXJzJyBiaXQsIGNsZWFyIEVCRS9QTUNDL1BNQU8vRkM1Ni4KKwkJICogU2V0IHRoZSAnZnJlZXplIGNvdW50ZXJzJyBiaXQsIGNsZWFyIEVCRS9CSFJCQS9QTUNDL1BNQU8vRkM1NgogCQkgKi8KIAkJdmFsICA9IG1tY3IwID0gbWZzcHIoU1BSTl9NTUNSMCk7CiAJCXZhbCB8PSBNTUNSMF9GQzsKLQkJdmFsICY9IH4oTU1DUjBfRUJFIHwgTU1DUjBfUE1DQyB8IE1NQ1IwX1BNQU8gfCBNTUNSMF9GQzU2KTsKKwkJdmFsICY9IH4oTU1DUjBfRUJFIHwgTU1DUjBfQkhSQkEgfCBNTUNSMF9QTUNDIHwgTU1DUjBfUE1BTyB8CisJCQkgTU1DUjBfRkM1Nik7CiAKIAkJLyoKIAkJICogVGhlIGJhcnJpZXIgaXMgdG8gbWFrZSBzdXJlIHRoZSBtdHNwciBoYXMgYmVlbgpAQCAtMTE0NCw2ICsxMjkwLDggQEAKIAljcHVody0+bW1jclswXSB8PSBNTUNSMF9QTVhFIHwgTU1DUjBfRkNFQ0U7CiAKICBvdXRfZW5hYmxlOgorCXBtYW9fcmVzdG9yZV93b3JrYXJvdW5kKGViYik7CisKIAltbWNyMCA9IGViYl9zd2l0Y2hfaW4oZWJiLCBjcHVody0+bW1jclswXSk7CiAKIAltYigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny1jYXRhbG9nLmggYi9hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LWNhdGFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWIxOWRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny1jYXRhbG9nLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBMSU5VWF9QT1dFUlBDX1BFUkZfSFZfMjRYN19DQVRBTE9HX0hfCisjZGVmaW5lIExJTlVYX1BPV0VSUENfUEVSRl9IVl8yNFg3X0NBVEFMT0dfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEZyb20gZG9jdW1lbnQgIjI0eDcgRXZlbnQgYW5kIEdyb3VwIENhdGFsb2cgRm9ybWF0cyBQcm9wb3NhbCIgdjAuMTUgKi8KKworc3RydWN0IGh2XzI0eDdfY2F0YWxvZ19wYWdlXzAgeworI2RlZmluZSBIVl8yNFg3X0NBVEFMT0dfTUFHSUMgMHgzMjM0NzgzNyAvKiAiMjR4NyIgaW4gQVNDSUkgKi8KKwlfX2JlMzIgbWFnaWM7CisJX19iZTMyIGxlbmd0aDsgLyogSW4gNDA5NiBieXRlIHBhZ2VzICovCisJX19iZTY0IHZlcnNpb247IC8qIFhYWDogYXJiaXRyYXJ5PyB3aGF0J3MgdGhlIG1lYW5pbmcvdXNlYWdlL3B1cnBvc2U/ICovCisJX191OCBidWlsZF90aW1lX3N0YW1wWzE2XTsgLyogIllZWVlNTURESEhNTVNTXDBcMCIgKi8KKwlfX3U4IHJlc2VydmVkMlszMl07CisJX19iZTE2IHNjaGVtYV9kYXRhX29mZnM7IC8qIGluIDQwOTYgYnl0ZSBwYWdlcyAqLworCV9fYmUxNiBzY2hlbWFfZGF0YV9sZW47ICAvKiBpbiA0MDk2IGJ5dGUgcGFnZXMgKi8KKwlfX2JlMTYgc2NoZW1hX2VudHJ5X2NvdW50OworCV9fdTggcmVzZXJ2ZWQzWzJdOworCV9fYmUxNiBldmVudF9kYXRhX29mZnM7CisJX19iZTE2IGV2ZW50X2RhdGFfbGVuOworCV9fYmUxNiBldmVudF9lbnRyeV9jb3VudDsKKwlfX3U4IHJlc2VydmVkNFsyXTsKKwlfX2JlMTYgZ3JvdXBfZGF0YV9vZmZzOyAvKiBpbiA0MDk2IGJ5dGUgcGFnZXMgKi8KKwlfX2JlMTYgZ3JvdXBfZGF0YV9sZW47ICAvKiBpbiA0MDk2IGJ5dGUgcGFnZXMgKi8KKwlfX2JlMTYgZ3JvdXBfZW50cnlfY291bnQ7CisJX191OCByZXNlcnZlZDVbMl07CisJX19iZTE2IGZvcm11bGFfZGF0YV9vZmZzOyAvKiBpbiA0MDk2IGJ5dGUgcGFnZXMgKi8KKwlfX2JlMTYgZm9ybXVsYV9kYXRhX2xlbjsgIC8qIGluIDQwOTYgYnl0ZSBwYWdlcyAqLworCV9fYmUxNiBmb3JtdWxhX2VudHJ5X2NvdW50OworCV9fdTggcmVzZXJ2ZWQ2WzJdOworfSBfX3BhY2tlZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3YzkxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBIeXBlcnZpc29yIHN1cHBsaWVkICIyNHg3IiBwZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQKKyAqCisgKiBBdXRob3I6IENvZHkgUCBTY2hhZmVyIDxjb2R5QGxpbnV4LnZuZXQuaWJtLmNvbT4KKyAqIENvcHlyaWdodCAyMDE0IElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgImh2LTI0eDc6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImh2LTI0eDcuaCIKKyNpbmNsdWRlICJodi0yNHg3LWNhdGFsb2cuaCIKKyNpbmNsdWRlICJodi1jb21tb24uaCIKKworLyoKKyAqIFRPRE86IE1lcmdpbmcgZXZlbnRzOgorICogLSBUaGluayBvZiB0aGUgaGNhbGwgYXMgYW4gaW50ZXJmYWNlIHRvIGEgNGQgYXJyYXkgb2YgY291bnRlcnM6CisgKiAgIC0geCA9IGRvbWFpbnMKKyAqICAgLSB5ID0gaW5kZXhlcyBpbiB0aGUgZG9tYWluIChjb3JlLCBjaGlwLCB2Y3B1LCBub2RlLCBldGMpCisgKiAgIC0geiA9IG9mZnNldCBpbnRvIHRoZSBjb3VudGVyIHNwYWNlCisgKiAgIC0gdyA9IGxwYXJzIChndWVzdCB2bXMsICJsb2dpY2FsIHBhcnRpdGlvbnMiKQorICogLSBBIHNpbmdsZSByZXF1ZXN0IGlzOiB4LHkseV9sYXN0LHosel9sYXN0LHcsd19sYXN0CisgKiAgIC0gdGhpcyBtZWFucyB3ZSBjYW4gcmV0cmlldmUgYSByZWN0YW5nbGUgb2YgY291bnRlcnMgaW4geSx6IGZvciBhIHNpbmdsZSB4LgorICoKKyAqIC0gVGhpbmdzIHRvIGNvbnNpZGVyIChpZ25vcmluZyB3KToKKyAqICAgLSBpbnB1dCAgY29zdF9wZXJfcmVxdWVzdCA9IDE2CisgKiAgIC0gb3V0cHV0IGNvc3RfcGVyX3Jlc3VsdCh5cyx6cykgID0gOCArIDggKiB5cyArIHlzICogenMKKyAqICAgLSBsaW1pdGVkIG51bWJlciBvZiByZXF1ZXN0cyBwZXIgaGNhbGwgKG11c3QgZml0IGludG8gNEsgYnl0ZXMpCisgKiAgICAgLSA0ayA9IDE2IFtidWZmZXIgaGVhZGVyXSAtIDE2IFtyZXF1ZXN0IHNpemVdICogcmVxdWVzdF9jb3VudAorICogICAgIC0gMjU1IHJlcXVlc3RzIHBlciBoY2FsbAorICogICAtIHNvbWV0aW1lcyBpdCB3aWxsIGJlIG1vcmUgZWZmaWNpZW50IHRvIHJlYWQgZXh0cmEgZGF0YSBhbmQgZGlzY2FyZAorICovCisKKy8qCisgKiBFeGFtcGxlIHVzYWdlOgorICogIHBlcmYgc3RhdCAtZSAnaHZfMjR4Ny9kb21haW49MixvZmZzZXQ9OCxzdGFydGluZ19pbmRleD0wLGxwYXI9MHhmZmZmZmZmZi8nCisgKi8KKworLyogdTMgMC02LCBvbmUgb2YgSFZfMjRYN19QRVJGX0RPTUFJTiAqLworRVZFTlRfREVGSU5FX1JBTkdFX0ZPUk1BVChkb21haW4sIGNvbmZpZywgMCwgMyk7CisvKiB1MTYgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQoc3RhcnRpbmdfaW5kZXgsIGNvbmZpZywgMTYsIDMxKTsKKy8qIHUzMiwgc2VlICJkYXRhX29mZnNldCIgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQob2Zmc2V0LCBjb25maWcsIDMyLCA2Myk7CisvKiB1MTYgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQobHBhciwgY29uZmlnMSwgMCwgMTUpOworCitFVkVOVF9ERUZJTkVfUkFOR0UocmVzZXJ2ZWQxLCBjb25maWcsICAgNCwgMTUpOworRVZFTlRfREVGSU5FX1JBTkdFKHJlc2VydmVkMiwgY29uZmlnMSwgMTYsIDYzKTsKK0VWRU5UX0RFRklORV9SQU5HRShyZXNlcnZlZDMsIGNvbmZpZzIsICAwLCA2Myk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmb3JtYXRfYXR0cnNbXSA9IHsKKwkmZm9ybWF0X2F0dHJfZG9tYWluLmF0dHIsCisJJmZvcm1hdF9hdHRyX29mZnNldC5hdHRyLAorCSZmb3JtYXRfYXR0cl9zdGFydGluZ19pbmRleC5hdHRyLAorCSZmb3JtYXRfYXR0cl9scGFyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IGZvcm1hdF9hdHRycywKK307CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaHZfcGFnZV9jYWNoZTsKKworLyoKKyAqIHJlYWRfb2Zmc2V0X2RhdGEgLSBjb3B5IGRhdGEgZnJvbSBvbmUgYnVmZmVyIHRvIGFub3RoZXIgd2hpbGUgdHJlYXRpbmcgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgc291cmNlIGJ1ZmZlciBhcyBhIHNtYWxsIHZpZXcgb24gdGhlIHRvdGFsIGF2YWxpYWJsZQorICogICAgICAgICAgICAgICAgICAgIHNvdXJjZSBkYXRhLgorICoKKyAqIEBkZXN0OiBidWZmZXIgdG8gY29weSBpbnRvCisgKiBAZGVzdF9sZW46IGxlbmd0aCBvZiBAZGVzdCBpbiBieXRlcworICogQHJlcXVlc3RlZF9vZmZzZXQ6IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBzb3VyY2UgZGF0YSB3ZSB3YW50LiBNdXN0IGJlID4gMAorICogQHNyYzogYnVmZmVyIHRvIGNvcHkgZGF0YSBmcm9tCisgKiBAc3JjX2xlbjogbGVuZ3RoIG9mIEBzcmMgaW4gYnl0ZXMKKyAqIEBzb3VyY2Vfb2Zmc2V0OiB0aGUgb2Zmc2V0IGluIHRoZSBzb3JjZSBkYXRhIHRoYXQgKHNyYyxzcmNfbGVuKSByZWZlcnMgdG8uCisgKiAgICAgICAgICAgICAgICAgTXVzdCBiZSA+IDAKKyAqCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYXNjaWkgYXJ0IHNob3dzIHRoZSB2YXJpb3VzIGJ1ZmZlciBwb3NzaXRpb25pbmcgd2UgbmVlZCB0bworICogaGFuZGxlLCBhc3NpZ25zIHNvbWUgYXJiaXRyYXJ5IHZhcmlibGVzIHRvIHBvaW50cyBvbiB0aGUgYnVmZmVyLCBhbmQgdGhlbgorICogc2hvd3MgaG93IHdlIGZpZGRsZSB3aXRoIHRob3NlIHZhbHVlcyB0byBnZXQgdGhpbmdzIHdlIGNhcmUgYWJvdXQgKGNvcHkKKyAqIHN0YXJ0IGluIHNyYyBhbmQgY29weSBsZW4pCisgKgorICogcyA9IEBzcmMgYnVmZmVyCisgKiBkID0gQGRlc3QgYnVmZmVyCisgKiAnLicgYXJlYXMgaW4gZCBhcmUgd3JpdHRlbiB0by4KKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgdQorICogICB4ICAgICAgICAgdwkgdiAgegorICogZCAgICAgICAgICAgfC4uLi4uLi4uLnwKKyAqIHMgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogICAgICAgICAgICAgICAgICAgICAgdQorICogICB4ICAgICAgICAgdwl6ICAgICB2CisgKiBkICAgICAgICAgICB8Li4uLi4uLi4tLS0tLS18CisgKiBzIHwtLS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogICB4ICAgICAgICAgdyAgICAgICAgdSx6LHYKKyAqIGQgICAgICAgICAgIHwuLi4uLi4uLnwKKyAqIHMgfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiAgIHgsdyAgICAgICAgICAgICAgICB1LHYsegorICogZCB8Li4uLi4uLi4uLi4uLi4uLi4ufAorICogcyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorICoKKyAqICAgeCAgICAgICAgdQorICogICB3ICAgICAgICB2CQl6CisgKiBkIHwuLi4uLi4uLnwKKyAqIHMgfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiAgIHggICAgICB6ICAgdyAgICAgIHYKKyAqIGQgICAgICAgICAgICB8LS0tLS0tfAorICogcyB8LS0tLS0tfAorICoKKyAqIHggPSBzb3VyY2Vfb2Zmc2V0CisgKiB3ID0gcmVxdWVzdGVkX29mZnNldAorICogeiA9IHNvdXJjZV9vZmZzZXQgKyBzcmNfbGVuCisgKiB2ID0gcmVxdWVzdGVkX29mZnNldCArIGRlc3RfbGVuCisgKgorICogd19vZmZzZXRfaW5fcyA9IHcgLSB4ID0gcmVxdWVzdGVkX29mZnNldCAtIHNvdXJjZV9vZmZzZXQKKyAqIHpfb2Zmc2V0X2luX3MgPSB6IC0geCA9IHNyY19sZW4KKyAqIHZfb2Zmc2V0X2luX3MgPSB2IC0geCA9IHJlcXVlc3Rfb2Zmc2V0ICsgZGVzdF9sZW4gLSBzcmNfbGVuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHJlYWRfb2Zmc2V0X2RhdGEodm9pZCAqZGVzdCwgc2l6ZV90IGRlc3RfbGVuLAorCQkJCWxvZmZfdCByZXF1ZXN0ZWRfb2Zmc2V0LCB2b2lkICpzcmMsCisJCQkJc2l6ZV90IHNyY19sZW4sIGxvZmZfdCBzb3VyY2Vfb2Zmc2V0KQoreworCXNpemVfdCB3X29mZnNldF9pbl9zID0gcmVxdWVzdGVkX29mZnNldCAtIHNvdXJjZV9vZmZzZXQ7CisJc2l6ZV90IHpfb2Zmc2V0X2luX3MgPSBzcmNfbGVuOworCXNpemVfdCB2X29mZnNldF9pbl9zID0gcmVxdWVzdGVkX29mZnNldCArIGRlc3RfbGVuIC0gc3JjX2xlbjsKKwlzaXplX3QgdV9vZmZzZXRfaW5fcyA9IG1pbih6X29mZnNldF9pbl9zLCB2X29mZnNldF9pbl9zKTsKKwlzaXplX3QgY29weV9sZW4gPSB1X29mZnNldF9pbl9zIC0gd19vZmZzZXRfaW5fczsKKworCWlmIChyZXF1ZXN0ZWRfb2Zmc2V0IDwgMCB8fCBzb3VyY2Vfb2Zmc2V0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoel9vZmZzZXRfaW5fcyA8PSB3X29mZnNldF9pbl9zKQorCQlyZXR1cm4gMDsKKworCW1lbWNweShkZXN0LCBzcmMgKyB3X29mZnNldF9pbl9zLCBjb3B5X2xlbik7CisJcmV0dXJuIGNvcHlfbGVuOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoX2dldF8yNHg3X2NhdGFsb2dfcGFnZShjaGFyIHBhZ2Vbc3RhdGljIDQwOTZdLAorCQkJCQkgICAgIHUzMiB2ZXJzaW9uLCB1MzIgaW5kZXgpCit7CisJV0FSTl9PTighSVNfQUxJR05FRCgodW5zaWduZWQgbG9uZylwYWdlLCA0MDk2KSk7CisJcmV0dXJuIHBscGFyX2hjYWxsX25vcmV0cyhIX0dFVF8yNFg3X0NBVEFMT0dfUEFHRSwKKwkJCXZpcnRfdG9fcGh5cyhwYWdlKSwKKwkJCXZlcnNpb24sCisJCQlpbmRleCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNhdGFsb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsCisJCQkgICAgbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgaHJldDsKKwlzc2l6ZV90IHJldCA9IDA7CisJc2l6ZV90IGNhdGFsb2dfbGVuID0gMCwgY2F0YWxvZ19wYWdlX2xlbiA9IDAsIHBhZ2VfY291bnQgPSAwOworCWxvZmZfdCBwYWdlX29mZnNldCA9IDA7CisJdWludDMyX3QgY2F0YWxvZ192ZXJzaW9uX251bSA9IDA7CisJdm9pZCAqcGFnZSA9IGttZW1fY2FjaGVfYWxsb2MoaHZfcGFnZV9jYWNoZSwgR0ZQX1VTRVIpOworCXN0cnVjdCBodl8yNHg3X2NhdGFsb2dfcGFnZV8wICpwYWdlXzAgPSBwYWdlOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlocmV0ID0gaF9nZXRfMjR4N19jYXRhbG9nX3BhZ2UocGFnZSwgMCwgMCk7CisJaWYgKGhyZXQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlX2ZyZWU7CisJfQorCisJY2F0YWxvZ192ZXJzaW9uX251bSA9IGJlMzJfdG9fY3B1KHBhZ2VfMC0+dmVyc2lvbik7CisJY2F0YWxvZ19wYWdlX2xlbiA9IGJlMzJfdG9fY3B1KHBhZ2VfMC0+bGVuZ3RoKTsKKwljYXRhbG9nX2xlbiA9IGNhdGFsb2dfcGFnZV9sZW4gKiA0MDk2OworCisJcGFnZV9vZmZzZXQgPSBvZmZzZXQgLyA0MDk2OworCXBhZ2VfY291bnQgID0gY291bnQgIC8gNDA5NjsKKworCWlmIChwYWdlX29mZnNldCA+PSBjYXRhbG9nX3BhZ2VfbGVuKQorCQlnb3RvIGVfZnJlZTsKKworCWlmIChwYWdlX29mZnNldCAhPSAwKSB7CisJCWhyZXQgPSBoX2dldF8yNHg3X2NhdGFsb2dfcGFnZShwYWdlLCBjYXRhbG9nX3ZlcnNpb25fbnVtLAorCQkJCQkgICAgICAgcGFnZV9vZmZzZXQpOworCQlpZiAoaHJldCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZV9mcmVlOworCQl9CisJfQorCisJcmV0ID0gcmVhZF9vZmZzZXRfZGF0YShidWYsIGNvdW50LCBvZmZzZXQsCisJCQkJcGFnZSwgNDA5NiwgcGFnZV9vZmZzZXQgKiA0MDk2KTsKK2VfZnJlZToKKwlpZiAoaHJldCkKKwkJcHJfZXJyKCJoX2dldF8yNHg3X2NhdGFsb2dfcGFnZSh2ZXI9JWQsIHBhZ2U9JWxsZCkgZmFpbGVkOiByYz0lbGRcbiIsCisJCQkJY2F0YWxvZ192ZXJzaW9uX251bSwgcGFnZV9vZmZzZXQsIGhyZXQpOworCWtmcmVlKHBhZ2UpOworCisJcHJfZGV2ZWwoImNhdGFsb2dfcmVhZDogb2Zmc2V0PSVsbGQoJWxsZCkgY291bnQ9JXp1KCV6dSkgY2F0YWxvZ19sZW49JXp1KCV6dSkgPT4gJXpkXG4iLAorCQkJb2Zmc2V0LCBwYWdlX29mZnNldCwgY291bnQsIHBhZ2VfY291bnQsIGNhdGFsb2dfbGVuLAorCQkJY2F0YWxvZ19wYWdlX2xlbiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUEFHRV8wX0FUVFIoX25hbWUsIF9mbXQsIF9leHByKQkJCQlcCitzdGF0aWMgc3NpemVfdCBfbmFtZSMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCVwKKwkJCSAgICBjaGFyICpidWYpCQkJCVwKK3sJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGhyZXQ7CQkJCQlcCisJc3NpemVfdCByZXQgPSAwOwkJCQkJXAorCXZvaWQgKnBhZ2UgPSBrbWVtX2NhY2hlX2FsbG9jKGh2X3BhZ2VfY2FjaGUsIEdGUF9VU0VSKTsJXAorCXN0cnVjdCBodl8yNHg3X2NhdGFsb2dfcGFnZV8wICpwYWdlXzAgPSBwYWdlOwkJXAorCWlmICghcGFnZSkJCQkJCQlcCisJCXJldHVybiAtRU5PTUVNOwkJCQkJXAorCWhyZXQgPSBoX2dldF8yNHg3X2NhdGFsb2dfcGFnZShwYWdlLCAwLCAwKTsJCVwKKwlpZiAoaHJldCkgewkJCQkJCVwKKwkJcmV0ID0gLUVJTzsJCQkJCVwKKwkJZ290byBlX2ZyZWU7CQkJCQlcCisJfQkJCQkJCQlcCisJcmV0ID0gc3ByaW50ZihidWYsIF9mbXQsIF9leHByKTsJCQlcCitlX2ZyZWU6CQkJCQkJCQlcCisJa2ZyZWUocGFnZSk7CQkJCQkJXAorCXJldHVybiByZXQ7CQkJCQkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JPKF9uYW1lKQorCitQQUdFXzBfQVRUUihjYXRhbG9nX3ZlcnNpb24sICIlbGxkXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWJlMzJfdG9fY3B1KHBhZ2VfMC0+dmVyc2lvbikpOworUEFHRV8wX0FUVFIoY2F0YWxvZ19sZW4sICIlbGxkXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWJlMzJfdG9fY3B1KHBhZ2VfMC0+bGVuZ3RoKSAqIDQwOTYpOworc3RhdGljIEJJTl9BVFRSX1JPKGNhdGFsb2csIDAvKiByZWFsIGxlbmd0aCB2YXJpZXMgKi8pOworCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmlmX2Jpbl9hdHRyc1tdID0geworCSZiaW5fYXR0cl9jYXRhbG9nLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfY2F0YWxvZ19sZW4uYXR0ciwKKwkmZGV2X2F0dHJfY2F0YWxvZ192ZXJzaW9uLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlmX2dyb3VwID0geworCS5uYW1lID0gImludGVyZmFjZSIsCisJLmJpbl9hdHRycyA9IGlmX2Jpbl9hdHRycywKKwkuYXR0cnMgPSBpZl9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRyX2dyb3Vwc1tdID0geworCSZmb3JtYXRfZ3JvdXAsCisJJmlmX2dyb3VwLAorCU5VTEwsCit9OworCitzdGF0aWMgYm9vbCBpc19waHlzaWNhbF9kb21haW4oaW50IGRvbWFpbikKK3sKKwlyZXR1cm4gIGRvbWFpbiA9PSBIVl8yNFg3X1BFUkZfRE9NQUlOX1BIWVNJQ0FMX0NISVAgfHwKKwkJZG9tYWluID09IEhWXzI0WDdfUEVSRl9ET01BSU5fUEhZU0lDQUxfQ09SRTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2luZ2xlXzI0eDdfcmVxdWVzdCh1OCBkb21haW4sIHUzMiBvZmZzZXQsIHUxNiBpeCwKKwkJCQkJIHUxNiBscGFyLCB1NjQgKnJlcywKKwkJCQkJIGJvb2wgc3VjY2Vzc19leHBlY3RlZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCS8qCisJICogcmVxdWVzdF9idWZmZXIgYW5kIHJlc3VsdF9idWZmZXIgYXJlIG5vdCByZXF1aXJlZCB0byBiZSA0ayBhbGlnbmVkLAorCSAqIGJ1dCBhcmUgbm90IGFsbG93ZWQgdG8gY3Jvc3MgYW55IDRrIGJvdW5kYXJ5LiBBbGlnbmluZyB0aGVtIHRvIDRrIGlzCisJICogdGhlIHNpbXBsZXN0IHdheSB0byBlbnN1cmUgdGhhdC4KKwkgKi8KKwlzdHJ1Y3QgcmVxYiB7CisJCXN0cnVjdCBodl8yNHg3X3JlcXVlc3RfYnVmZmVyIGJ1ZjsKKwkJc3RydWN0IGh2XzI0eDdfcmVxdWVzdCByZXE7CisJfSBfX3BhY2tlZCBfX2FsaWduZWQoNDA5NikgcmVxdWVzdF9idWZmZXIgPSB7CisJCS5idWYgPSB7CisJCQkuaW50ZXJmYWNlX3ZlcnNpb24gPSBIVl8yNFg3X0lGX1ZFUlNJT05fQ1VSUkVOVCwKKwkJCS5udW1fcmVxdWVzdHMgPSAxLAorCQl9LAorCQkucmVxID0geworCQkJLnBlcmZvcm1hbmNlX2RvbWFpbiA9IGRvbWFpbiwKKwkJCS5kYXRhX3NpemUgPSBjcHVfdG9fYmUxNig4KSwKKwkJCS5kYXRhX29mZnNldCA9IGNwdV90b19iZTMyKG9mZnNldCksCisJCQkuc3RhcnRpbmdfbHBhcl9peCA9IGNwdV90b19iZTE2KGxwYXIpLAorCQkJLm1heF9udW1fbHBhcnMgPSBjcHVfdG9fYmUxNigxKSwKKwkJCS5zdGFydGluZ19peCA9IGNwdV90b19iZTE2KGl4KSwKKwkJCS5tYXhfaXggPSBjcHVfdG9fYmUxNigxKSwKKwkJfQorCX07CisKKwlzdHJ1Y3QgcmVzYiB7CisJCXN0cnVjdCBodl8yNHg3X2RhdGFfcmVzdWx0X2J1ZmZlciBidWY7CisJCXN0cnVjdCBodl8yNHg3X3Jlc3VsdCByZXM7CisJCXN0cnVjdCBodl8yNHg3X3Jlc3VsdF9lbGVtZW50IGVsZW07CisJCV9fYmU2NCByZXN1bHQ7CisJfSBfX3BhY2tlZCBfX2FsaWduZWQoNDA5NikgcmVzdWx0X2J1ZmZlciA9IHt9OworCisJcmV0ID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfR0VUXzI0WDdfREFUQSwKKwkJCXZpcnRfdG9fcGh5cygmcmVxdWVzdF9idWZmZXIpLCBzaXplb2YocmVxdWVzdF9idWZmZXIpLAorCQkJdmlydF90b19waHlzKCZyZXN1bHRfYnVmZmVyKSwgIHNpemVvZihyZXN1bHRfYnVmZmVyKSk7CisKKwlpZiAocmV0KSB7CisJCWlmIChzdWNjZXNzX2V4cGVjdGVkKQorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJoY2FsbCBmYWlsZWQ6ICVkICUjeCAlI3ggJWQgPT4gMHglbHggKCVsZCkgZGV0YWlsPTB4JXggZmFpbGluZyBpeD0leFxuIiwKKwkJCQkJZG9tYWluLCBvZmZzZXQsIGl4LCBscGFyLAorCQkJCQlyZXQsIHJldCwKKwkJCQkJcmVzdWx0X2J1ZmZlci5idWYuZGV0YWlsZWRfcmMsCisJCQkJCXJlc3VsdF9idWZmZXIuYnVmLmZhaWxpbmdfcmVxdWVzdF9peCk7CisJCXJldHVybiByZXQ7CisJfQorCisJKnJlcyA9IGJlNjRfdG9fY3B1KHJlc3VsdF9idWZmZXIucmVzdWx0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBldmVudF8yNHg3X3JlcXVlc3Qoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgKnJlcywKKwkJYm9vbCBzdWNjZXNzX2V4cGVjdGVkKQoreworCXJldHVybiBzaW5nbGVfMjR4N19yZXF1ZXN0KGV2ZW50X2dldF9kb21haW4oZXZlbnQpLAorCQkJCWV2ZW50X2dldF9vZmZzZXQoZXZlbnQpLAorCQkJCWV2ZW50X2dldF9zdGFydGluZ19pbmRleChldmVudCksCisJCQkJZXZlbnRfZ2V0X2xwYXIoZXZlbnQpLAorCQkJCXJlcywKKwkJCQlzdWNjZXNzX2V4cGVjdGVkKTsKK30KKworc3RhdGljIGludCBoXzI0eDdfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh2X3BlcmZfY2FwcyBjYXBzOworCXVuc2lnbmVkIGRvbWFpbjsKKwl1bnNpZ25lZCBsb25nIGhyZXQ7CisJdTY0IGN0OworCisJLyogTm90IG91ciBldmVudCAqLworCWlmIChldmVudC0+YXR0ci50eXBlICE9IGV2ZW50LT5wbXUtPnR5cGUpCisJCXJldHVybiAtRU5PRU5UOworCisJLyogVW51c2VkIGFyZWFzIG11c3QgYmUgMCAqLworCWlmIChldmVudF9nZXRfcmVzZXJ2ZWQxKGV2ZW50KSB8fAorCSAgICBldmVudF9nZXRfcmVzZXJ2ZWQyKGV2ZW50KSB8fAorCSAgICBldmVudF9nZXRfcmVzZXJ2ZWQzKGV2ZW50KSkgeworCQlwcl9kZXZlbCgicmVzZXJ2ZWQgc2V0IHdoZW4gZm9yYmlkZGVuIDB4JWxseCgweCVsbHgpIDB4JWxseCgweCVsbHgpIDB4JWxseCgweCVsbHgpXG4iLAorCQkJCWV2ZW50LT5hdHRyLmNvbmZpZywKKwkJCQlldmVudF9nZXRfcmVzZXJ2ZWQxKGV2ZW50KSwKKwkJCQlldmVudC0+YXR0ci5jb25maWcxLAorCQkJCWV2ZW50X2dldF9yZXNlcnZlZDIoZXZlbnQpLAorCQkJCWV2ZW50LT5hdHRyLmNvbmZpZzIsCisJCQkJZXZlbnRfZ2V0X3Jlc2VydmVkMyhldmVudCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB1bnN1cHBvcnRlZCBtb2RlcyBhbmQgZmlsdGVycyAqLworCWlmIChldmVudC0+YXR0ci5leGNsdWRlX3VzZXIgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2h2ICAgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2hvc3QgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2d1ZXN0ICB8fAorCSAgICBpc19zYW1wbGluZ19ldmVudChldmVudCkpIC8qIG5vIHNhbXBsaW5nICovCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbm8gYnJhbmNoIHNhbXBsaW5nICovCisJaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBvZmZzZXQgbXVzdCBiZSA4IGJ5dGUgYWxpZ25lZCAqLworCWlmIChldmVudF9nZXRfb2Zmc2V0KGV2ZW50KSAlIDgpIHsKKwkJcHJfZGV2ZWwoImJhZCBhbGlnbm1lbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEb21haW5zIGFib3ZlIDYgYXJlIGludmFsaWQgKi8KKwlkb21haW4gPSBldmVudF9nZXRfZG9tYWluKGV2ZW50KTsKKwlpZiAoZG9tYWluID4gNikgeworCQlwcl9kZXZlbCgiaW52YWxpZCBkb21haW4gJWRcbiIsIGRvbWFpbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhyZXQgPSBodl9wZXJmX2NhcHNfZ2V0KCZjYXBzKTsKKwlpZiAoaHJldCkgeworCQlwcl9kZXZlbCgiY291bGQgbm90IGdldCBjYXBhYmlsaXRpZXM6IHJjPSVsZFxuIiwgaHJldCk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFBIWVNJQ0FMIGRvbWFpbnMgJiBvdGhlciBscGFycyByZXF1aXJlIGV4dHJhIGNhcGFiaWxpdGllcyAqLworCWlmICghY2Fwcy5jb2xsZWN0X3ByaXZpbGVnZWQgJiYgKGlzX3BoeXNpY2FsX2RvbWFpbihkb21haW4pIHx8CisJCShldmVudF9nZXRfbHBhcihldmVudCkgIT0gZXZlbnRfZ2V0X2xwYXJfbWF4KCkpKSkgeworCQlwcl9kZXZlbCgiaHYgcGVybWlzaW9ucyBkaXNhbGxvdzogaXNfcGh5c2ljYWxfZG9tYWluOiVkLCBscGFyPTB4JWxseFxuIiwKKwkJCQlpc19waHlzaWNhbF9kb21haW4oZG9tYWluKSwKKwkJCQlldmVudF9nZXRfbHBhcihldmVudCkpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKiBzZWUgaWYgdGhlIGV2ZW50IGNvbXBsYWlucyAqLworCWlmIChldmVudF8yNHg3X3JlcXVlc3QoZXZlbnQsICZjdCwgZmFsc2UpKSB7CisJCXByX2RldmVsKCJ0ZXN0IGhjYWxsIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTY0IGhfMjR4N19nZXRfdmFsdWUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCXU2NCBjdDsKKwlyZXQgPSBldmVudF8yNHg3X3JlcXVlc3QoZXZlbnQsICZjdCwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJLyogV2UgY2hlY2tlZCB0aGlzIGluIGV2ZW50IGluaXQsIHNob3VsZG4ndCBmYWlsIGhlcmUuLi4gKi8KKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY3Q7Cit9CisKK3N0YXRpYyB2b2lkIGhfMjR4N19ldmVudF91cGRhdGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXM2NCBwcmV2OworCXU2NCBub3c7CisJbm93ID0gaF8yNHg3X2dldF92YWx1ZShldmVudCk7CisJcHJldiA9IGxvY2FsNjRfeGNoZygmZXZlbnQtPmh3LnByZXZfY291bnQsIG5vdyk7CisJbG9jYWw2NF9hZGQobm93IC0gcHJldiwgJmV2ZW50LT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIGhfMjR4N19ldmVudF9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBQRVJGX0VGX1JFTE9BRCkKKwkJbG9jYWw2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCBoXzI0eDdfZ2V0X3ZhbHVlKGV2ZW50KSk7Cit9CisKK3N0YXRpYyB2b2lkIGhfMjR4N19ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCWhfMjR4N19ldmVudF91cGRhdGUoZXZlbnQpOworfQorCitzdGF0aWMgaW50IGhfMjR4N19ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgUEVSRl9FRl9TVEFSVCkKKwkJaF8yNHg3X2V2ZW50X3N0YXJ0KGV2ZW50LCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoXzI0eDdfZXZlbnRfaWR4KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbXUgaF8yNHg3X3BtdSA9IHsKKwkudGFza19jdHhfbnIgPSBwZXJmX2ludmFsaWRfY29udGV4dCwKKworCS5uYW1lID0gImh2XzI0eDciLAorCS5hdHRyX2dyb3VwcyA9IGF0dHJfZ3JvdXBzLAorCS5ldmVudF9pbml0ICA9IGhfMjR4N19ldmVudF9pbml0LAorCS5hZGQgICAgICAgICA9IGhfMjR4N19ldmVudF9hZGQsCisJLmRlbCAgICAgICAgID0gaF8yNHg3X2V2ZW50X3N0b3AsCisJLnN0YXJ0ICAgICAgID0gaF8yNHg3X2V2ZW50X3N0YXJ0LAorCS5zdG9wICAgICAgICA9IGhfMjR4N19ldmVudF9zdG9wLAorCS5yZWFkICAgICAgICA9IGhfMjR4N19ldmVudF91cGRhdGUsCisJLmV2ZW50X2lkeCAgID0gaF8yNHg3X2V2ZW50X2lkeCwKK307CisKK3N0YXRpYyBpbnQgaHZfMjR4N19pbml0KHZvaWQpCit7CisJaW50IHI7CisJdW5zaWduZWQgbG9uZyBocmV0OworCXN0cnVjdCBodl9wZXJmX2NhcHMgY2FwczsKKworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSkgeworCQlwcl9pbmZvKCJub3QgYSB2aXJ0dWFsaXplZCBzeXN0ZW0sIG5vdCBlbmFibGluZ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWhyZXQgPSBodl9wZXJmX2NhcHNfZ2V0KCZjYXBzKTsKKwlpZiAoaHJldCkgeworCQlwcl9pbmZvKCJjb3VsZCBub3Qgb2J0YWluIGNhcGFiaWxpdGllcywgZXJyb3IgMHglODBseCwgbm90IGVuYWJsaW5nXG4iLAorCQkJCWhyZXQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlodl9wYWdlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImh2LXBhZ2UtNDA5NiIsIDQwOTYsIDQwOTYsIDAsIE5VTEwpOworCWlmICghaHZfcGFnZV9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyID0gcGVyZl9wbXVfcmVnaXN0ZXIoJmhfMjR4N19wbXUsIGhfMjR4N19wbXUubmFtZSwgLTEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwoaHZfMjR4N19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuaCBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBlYmNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5oCkBAIC0wLDAgKzEsMTA5IEBACisjaWZuZGVmIExJTlVYX1BPV0VSUENfUEVSRl9IVl8yNFg3X0hfCisjZGVmaW5lIExJTlVYX1BPV0VSUENfUEVSRl9IVl8yNFg3X0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaHZfMjR4N19yZXF1ZXN0IHsKKwkvKiBQSFlTSUNBTCBkb21haW5zIHJlcXVpcmUgZW5hYmxpbmcgdmlhIHBoeXAvaG1jLiAqLworI2RlZmluZSBIVl8yNFg3X1BFUkZfRE9NQUlOX1BIWVNJQ0FMX0NISVAgMHgwMQorI2RlZmluZSBIVl8yNFg3X1BFUkZfRE9NQUlOX1BIWVNJQ0FMX0NPUkUgMHgwMgorI2RlZmluZSBIVl8yNFg3X1BFUkZfRE9NQUlOX1ZJUlRVQUxfUFJPQ0VTU09SX0hPTUVfQ09SRSAgIDB4MDMKKyNkZWZpbmUgSFZfMjRYN19QRVJGX0RPTUFJTl9WSVJUVUFMX1BST0NFU1NPUl9IT01FX0NISVAgICAweDA0CisjZGVmaW5lIEhWXzI0WDdfUEVSRl9ET01BSU5fVklSVFVBTF9QUk9DRVNTT1JfSE9NRV9OT0RFICAgMHgwNQorI2RlZmluZSBIVl8yNFg3X1BFUkZfRE9NQUlOX1ZJUlRVQUxfUFJPQ0VTU09SX1JFTU9URV9OT0RFIDB4MDYKKwlfX3U4IHBlcmZvcm1hbmNlX2RvbWFpbjsKKwlfX3U4IHJlc2VydmVkWzB4MV07CisKKwkvKiBieXRlcyB0byByZWFkIHN0YXJ0aW5nIGF0IEBkYXRhX29mZnNldC4gbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggKi8KKwlfX2JlMTYgZGF0YV9zaXplOworCisJLyoKKwkgKiBieXRlIG9mZnNldCB3aXRoaW4gdGhlIHBlcmYgZG9tYWluIHRvIHJlYWQgZnJvbS4gbXVzdCBiZSA4IGJ5dGUKKwkgKiBhbGlnbmVkCisJICovCisJX19iZTMyIGRhdGFfb2Zmc2V0OworCisJLyoKKwkgKiBvbmx5IHZhbGlkIGZvciBWSVJUVUFMX1BST0NFU1NPUiBkb21haW5zLCBpZ25vcmVkIGZvciBvdGhlcnMuCisJICogLTEgbWVhbnMgImN1cnJlbnQgcGFydGl0aW9uIG9ubHkiCisJICogIEVuYWJsaW5nIHZpYSBwaHlwL2htYyByZXF1aXJlZCBmb3Igbm9uLSItMSIgdmFsdWVzLiAwIGZvcmJpZGRlbgorCSAqICB1bmxlc3MgcmVxdWVzdG9yIGlzIDAuCisJICovCisJX19iZTE2IHN0YXJ0aW5nX2xwYXJfaXg7CisKKwkvKgorCSAqIElnbm9yZWQgd2hlbiBAc3RhcnRpbmdfbHBhcl9peCA9PSAtMQorCSAqIElnbm9yZWQgd2hlbiBAcGVyZm9ybWFuY2VfZG9tYWluIGlzIG5vdCBWSVJUVUFMX1BST0NFU1NPUl8qCisJICogLTEgbWVhbnMgImluZmluaXRlIiBvciBhbGwKKwkgKi8KKwlfX2JlMTYgbWF4X251bV9scGFyczsKKworCS8qIGNoaXAsIGNvcmUsIG9yIHZpcnR1YWwgcHJvY2Vzc29yIGJhc2VkIG9uIEBwZXJmb3JtYW5jZV9kb21haW4gKi8KKwlfX2JlMTYgc3RhcnRpbmdfaXg7CisJX19iZTE2IG1heF9peDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBodl8yNHg3X3JlcXVlc3RfYnVmZmVyIHsKKwkvKiAwIC0gPyAqLworCS8qIDEgLSA/ICovCisjZGVmaW5lIEhWXzI0WDdfSUZfVkVSU0lPTl9DVVJSRU5UIDB4MDEKKwlfX3U4IGludGVyZmFjZV92ZXJzaW9uOworCV9fdTggbnVtX3JlcXVlc3RzOworCV9fdTggcmVzZXJ2ZWRbMHhFXTsKKwlzdHJ1Y3QgaHZfMjR4N19yZXF1ZXN0IHJlcXVlc3RzW107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaHZfMjR4N19yZXN1bHRfZWxlbWVudCB7CisJX19iZTE2IGxwYXJfaXg7CisKKwkvKgorCSAqIHJlcHJlc2VudHMgdGhlIGNvcmUsIGNoaXAsIG9yIHZpcnR1YWwgcHJvY2Vzc29yIGJhc2VkIG9uIHRoZQorCSAqIHJlcXVlc3QncyBAcGVyZm9ybWFuY2VfZG9tYWluCisJICovCisJX19iZTE2IGRvbWFpbl9peDsKKworCS8qIC0xIGlmIEBwZXJmb3JtYW5jZV9kb21haW4gZG9lcyBub3QgcmVmZXIgdG8gYSB2aXJ0dWFsIHByb2Nlc3NvciAqLworCV9fYmUzMiBscGFyX2NmZ19pbnN0YW5jZV9pZDsKKworCS8qIHNpemUgPSBAcmVzdWx0X2VsZW1lbnRfZGF0YV9zaXplIG9mIGNvaW50YWluaW5nIHJlc3VsdC4gKi8KKwlfX3U4IGVsZW1lbnRfZGF0YVtdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGh2XzI0eDdfcmVzdWx0IHsKKwlfX3U4IHJlc3VsdF9peDsKKworCS8qCisJICogMCA9IG5vdCBhbGwgcmVzdWx0IGVsZW1lbnRzIGZpdCBpbnRvIHRoZSBidWZmZXIsIGFkZGl0aW9uYWwgcmVxdWVzdHMKKwkgKiAgICAgcmVxdWlyZWQKKwkgKiAxID0gYWxsIHJlc3VsdCBlbGVtZW50cyB3ZXJlIHJldHVybmVkCisJICovCisJX191OCByZXN1bHRzX2NvbXBsZXRlOworCV9fYmUxNiBudW1fZWxlbWVudHNfcmV0dXJuZWQ7CisKKwkvKiBUaGlzIGlzIGEgY29weSBvZiBAZGF0YV9zaXplIGZyb20gdGhlIGNvcmVzcG9uZGluZyBodl8yNHg3X3JlcXVlc3QgKi8KKwlfX2JlMTYgcmVzdWx0X2VsZW1lbnRfZGF0YV9zaXplOworCV9fdTggcmVzZXJ2ZWRbMHgyXTsKKworCS8qIFdBUk5JTkc6IG9ubHkgdmFsaWQgZm9yIGZpcnN0IHJlc3VsdCBlbGVtZW50IGR1ZSB0byB2YXJpYWJsZSBzaXplcworCSAqICAgICAgICAgIG9mIHJlc3VsdCBlbGVtZW50cyAqLworCS8qIHN0cnVjdCBodl8yNHg3X3Jlc3VsdF9lbGVtZW50W0BudW1fZWxlbWVudHNfcmV0dXJuZWRdICovCisJc3RydWN0IGh2XzI0eDdfcmVzdWx0X2VsZW1lbnQgZWxlbWVudHNbXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBodl8yNHg3X2RhdGFfcmVzdWx0X2J1ZmZlciB7CisJLyogU2VlIHZlcnNpb25pbmcgZm9yIHJlcXVlc3QgYnVmZmVyICovCisJX191OCBpbnRlcmZhY2VfdmVyc2lvbjsKKworCV9fdTggbnVtX3Jlc3VsdHM7CisJX191OCByZXNlcnZlZFsweDFdOworCV9fdTggZmFpbGluZ19yZXF1ZXN0X2l4OworCV9fYmUzMiBkZXRhaWxlZF9yYzsKKwlfX2JlNjQgY2VjX2NmZ19pbnN0YW5jZV9pZDsKKwlfX2JlNjQgY2F0YWxvZ192ZXJzaW9uX251bTsKKwlfX3U4IHJlc2VydmVkMlsweDhdOworCS8qIFdBUk5JTkc6IG9ubHkgdmFsaWQgZm9yIHRoZSBmaXJzdCByZXN1bHQgZHVlIHRvIHZhcmlhYmxlIHNpemVzIG9mCisJICoJICAgIHJlc3VsdHMgKi8KKwlzdHJ1Y3QgaHZfMjR4N19yZXN1bHQgcmVzdWx0c1tdOyAvKiBbQG51bV9yZXN1bHRzXSAqLworfSBfX3BhY2tlZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9odi1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZTAyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1jb21tb24uYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorCisjaW5jbHVkZSAiaHYtZ3BjaS5oIgorI2luY2x1ZGUgImh2LWNvbW1vbi5oIgorCit1bnNpZ25lZCBsb25nIGh2X3BlcmZfY2Fwc19nZXQoc3RydWN0IGh2X3BlcmZfY2FwcyAqY2FwcykKK3sKKwl1bnNpZ25lZCBsb25nIHI7CisJc3RydWN0IHAgeworCQlzdHJ1Y3QgaHZfZ2V0X3BlcmZfY291bnRlcl9pbmZvX3BhcmFtcyBwYXJhbXM7CisJCXN0cnVjdCBjdl9zeXN0ZW1fcGVyZm9ybWFuY2VfY2FwYWJpbGl0aWVzIGNhcHM7CisJfSBfX3BhY2tlZCBfX2FsaWduZWQoc2l6ZW9mKHVpbnQ2NF90KSk7CisKKwlzdHJ1Y3QgcCBhcmcgPSB7CisJCS5wYXJhbXMgPSB7CisJCQkuY291bnRlcl9yZXF1ZXN0ID0gY3B1X3RvX2JlMzIoCisJCQkJCUNJUl9TWVNURU1fUEVSRk9STUFOQ0VfQ0FQQUJJTElUSUVTKSwKKwkJCS5zdGFydGluZ19pbmRleCA9IGNwdV90b19iZTMyKC0xKSwKKwkJCS5jb3VudGVyX2luZm9fdmVyc2lvbl9pbiA9IDAsCisJCX0KKwl9OworCisJciA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0dFVF9QRVJGX0NPVU5URVJfSU5GTywKKwkJCSAgICAgICB2aXJ0X3RvX3BoeXMoJmFyZyksIHNpemVvZihhcmcpKTsKKworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXByX2RldmVsKCJjYXBhYmlsaXR5X21hc2s6IDB4JXhcbiIsIGFyZy5jYXBzLmNhcGFiaWxpdHlfbWFzayk7CisKKwljYXBzLT52ZXJzaW9uID0gYXJnLnBhcmFtcy5jb3VudGVyX2luZm9fdmVyc2lvbl9vdXQ7CisJY2Fwcy0+Y29sbGVjdF9wcml2aWxlZ2VkID0gISFhcmcuY2Fwcy5wZXJmX2NvbGxlY3RfcHJpdmlsZWdlZDsKKwljYXBzLT5nYSA9ICEhKGFyZy5jYXBzLmNhcGFiaWxpdHlfbWFzayAmIENWX0NNX0dBKTsKKwljYXBzLT5leHBhbmRlZCA9ICEhKGFyZy5jYXBzLmNhcGFiaWxpdHlfbWFzayAmIENWX0NNX0VYUEFOREVEKTsKKwljYXBzLT5sYWIgPSAhIShhcmcuY2Fwcy5jYXBhYmlsaXR5X21hc2sgJiBDVl9DTV9MQUIpOworCisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9odi1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzljZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1jb21tb24uaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIExJTlVYX1BPV0VSUENfUEVSRl9IVl9DT01NT05fSF8KKyNkZWZpbmUgTElOVVhfUE9XRVJQQ19QRVJGX0hWX0NPTU1PTl9IXworCisjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBodl9wZXJmX2NhcHMgeworCXUxNiB2ZXJzaW9uOworCXUxNiBjb2xsZWN0X3ByaXZpbGVnZWQ6MSwKKwkgICAgZ2E6MSwKKwkgICAgZXhwYW5kZWQ6MSwKKwkgICAgbGFiOjEsCisJICAgIHVudXNlZDoxMjsKK307CisKK3Vuc2lnbmVkIGxvbmcgaHZfcGVyZl9jYXBzX2dldChzdHJ1Y3QgaHZfcGVyZl9jYXBzICpjYXBzKTsKKworCisjZGVmaW5lIEVWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQobmFtZSwgYXR0cl92YXIsIGJpdF9zdGFydCwgYml0X2VuZCkJXAorUE1VX0ZPUk1BVF9BVFRSKG5hbWUsICNhdHRyX3ZhciAiOiIgI2JpdF9zdGFydCAiLSIgI2JpdF9lbmQpOwkJXAorRVZFTlRfREVGSU5FX1JBTkdFKG5hbWUsIGF0dHJfdmFyLCBiaXRfc3RhcnQsIGJpdF9lbmQpCisKKyNkZWZpbmUgRVZFTlRfREVGSU5FX1JBTkdFKG5hbWUsIGF0dHJfdmFyLCBiaXRfc3RhcnQsIGJpdF9lbmQpCVwKK3N0YXRpYyB1NjQgZXZlbnRfZ2V0XyMjbmFtZSMjX21heCh2b2lkKQkJCQkJXAorewkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oKGJpdF9zdGFydCA+IGJpdF9lbmQpCQkJCVwKKwkJICAgIHx8IChiaXRfZW5kID49IChzaXplb2YoMXVsbCkgKiA4KSkpOwkJXAorCXJldHVybiAoKCgxdWxsIDw8IChiaXRfZW5kIC0gYml0X3N0YXJ0KSkgLSAxKSA8PCAxKSArIDE7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgdTY0IGV2ZW50X2dldF8jI25hbWUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIChldmVudC0+YXR0ci5hdHRyX3ZhciA+PiAoYml0X3N0YXJ0KSkgJgkJCVwKKwkJZXZlbnRfZ2V0XyMjbmFtZSMjX21heCgpOwkJCQlcCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvaHYtZ3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtZ3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGJhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBIeXBlcnZpc29yIHN1cHBsaWVkICJncGNpIiAoImdldCBwZXJmb3JtYW5jZSBjb3VudGVyIGluZm8iKSBwZXJmb3JtYW5jZQorICogY291bnRlciBzdXBwb3J0CisgKgorICogQXV0aG9yOiBDb2R5IFAgU2NoYWZlciA8Y29keUBsaW51eC52bmV0LmlibS5jb20+CisgKiBDb3B5cmlnaHQgMjAxNCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJodi1ncGNpOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJodi1ncGNpLmgiCisjaW5jbHVkZSAiaHYtY29tbW9uLmgiCisKKy8qCisgKiBFeGFtcGxlIHVzYWdlOgorICogIHBlcmYgc3RhdCAtZSAnaHZfZ3BjaS9jb3VudGVyX2luZm9fdmVyc2lvbj0zLG9mZnNldD0wLGxlbmd0aD04LAorICoJCSAgc2Vjb25kYXJ5X2luZGV4PTAsc3RhcnRpbmdfaW5kZXg9MHhmZmZmZmZmZixyZXF1ZXN0PTB4MTAvJyAuLi4KKyAqLworCisvKiB1MzIgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQocmVxdWVzdCwgY29uZmlnLCAwLCAzMSk7CisvKiB1MzIgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQoc3RhcnRpbmdfaW5kZXgsIGNvbmZpZywgMzIsIDYzKTsKKy8qIHUxNiAqLworRVZFTlRfREVGSU5FX1JBTkdFX0ZPUk1BVChzZWNvbmRhcnlfaW5kZXgsIGNvbmZpZzEsIDAsIDE1KTsKKy8qIHU4ICovCitFVkVOVF9ERUZJTkVfUkFOR0VfRk9STUFUKGNvdW50ZXJfaW5mb192ZXJzaW9uLCBjb25maWcxLCAxNiwgMjMpOworLyogdTgsIGJ5dGVzIG9mIGRhdGEgKDEtOCkgKi8KK0VWRU5UX0RFRklORV9SQU5HRV9GT1JNQVQobGVuZ3RoLCBjb25maWcxLCAyNCwgMzEpOworLyogdTMyLCBieXRlIG9mZnNldCAqLworRVZFTlRfREVGSU5FX1JBTkdFX0ZPUk1BVChvZmZzZXQsIGNvbmZpZzEsIDMyLCA2Myk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmb3JtYXRfYXR0cnNbXSA9IHsKKwkmZm9ybWF0X2F0dHJfcmVxdWVzdC5hdHRyLAorCSZmb3JtYXRfYXR0cl9zdGFydGluZ19pbmRleC5hdHRyLAorCSZmb3JtYXRfYXR0cl9zZWNvbmRhcnlfaW5kZXguYXR0ciwKKwkmZm9ybWF0X2F0dHJfY291bnRlcl9pbmZvX3ZlcnNpb24uYXR0ciwKKworCSZmb3JtYXRfYXR0cl9vZmZzZXQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfbGVuZ3RoLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IGZvcm1hdF9hdHRycywKK307CisKKyNkZWZpbmUgSFZfQ0FQU19BVFRSKF9uYW1lLCBfZm9ybWF0KQkJCQlcCitzdGF0aWMgc3NpemVfdCBfbmFtZSMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJICAgIGNoYXIgKnBhZ2UpCQkJCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaHZfcGVyZl9jYXBzIGNhcHM7CQkJCVwKKwl1bnNpZ25lZCBsb25nIGhyZXQgPSBodl9wZXJmX2NhcHNfZ2V0KCZjYXBzKTsJCVwKKwlpZiAoaHJldCkJCQkJCQlcCisJCXJldHVybiAtRUlPOwkJCQkJXAorCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYocGFnZSwgX2Zvcm1hdCwgY2Fwcy5fbmFtZSk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgaHZfY2Fwc19hdHRyXyMjX25hbWUgPSBfX0FUVFJfUk8oX25hbWUpCisKK3N0YXRpYyBzc2l6ZV90IGtlcm5lbF92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIjB4JXhcbiIsIENPVU5URVJfSU5GT19WRVJTSU9OX0NVUlJFTlQpOworfQorCitERVZJQ0VfQVRUUl9STyhrZXJuZWxfdmVyc2lvbik7CitIVl9DQVBTX0FUVFIodmVyc2lvbiwgIjB4JXhcbiIpOworSFZfQ0FQU19BVFRSKGdhLCAiJWRcbiIpOworSFZfQ0FQU19BVFRSKGV4cGFuZGVkLCAiJWRcbiIpOworSFZfQ0FQU19BVFRSKGxhYiwgIiVkXG4iKTsKK0hWX0NBUFNfQVRUUihjb2xsZWN0X3ByaXZpbGVnZWQsICIlZFxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbnRlcmZhY2VfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfa2VybmVsX3ZlcnNpb24uYXR0ciwKKwkmaHZfY2Fwc19hdHRyX3ZlcnNpb24uYXR0ciwKKwkmaHZfY2Fwc19hdHRyX2dhLmF0dHIsCisJJmh2X2NhcHNfYXR0cl9leHBhbmRlZC5hdHRyLAorCSZodl9jYXBzX2F0dHJfbGFiLmF0dHIsCisJJmh2X2NhcHNfYXR0cl9jb2xsZWN0X3ByaXZpbGVnZWQuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW50ZXJmYWNlX2dyb3VwID0geworCS5uYW1lID0gImludGVyZmFjZSIsCisJLmF0dHJzID0gaW50ZXJmYWNlX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJfZ3JvdXBzW10gPSB7CisJJmZvcm1hdF9ncm91cCwKKwkmaW50ZXJmYWNlX2dyb3VwLAorCU5VTEwsCit9OworCisjZGVmaW5lIEdQQ0lfTUFYX0RBVEFfQllURVMgXAorCSgxMDI0IC0gc2l6ZW9mKHN0cnVjdCBodl9nZXRfcGVyZl9jb3VudGVyX2luZm9fcGFyYW1zKSkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2luZ2xlX2dwY2lfcmVxdWVzdCh1MzIgcmVxLCB1MzIgc3RhcnRpbmdfaW5kZXgsCisJCXUxNiBzZWNvbmRhcnlfaW5kZXgsIHU4IHZlcnNpb25faW4sIHUzMiBvZmZzZXQsIHU4IGxlbmd0aCwKKwkJdTY0ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwlzaXplX3QgaTsKKwl1NjQgY291bnQ7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaHZfZ2V0X3BlcmZfY291bnRlcl9pbmZvX3BhcmFtcyBwYXJhbXM7CisJCXVpbnQ4X3QgYnl0ZXNbR1BDSV9NQVhfREFUQV9CWVRFU107CisJfSBfX3BhY2tlZCBfX2FsaWduZWQoc2l6ZW9mKHVpbnQ2NF90KSkgYXJnID0geworCQkucGFyYW1zID0geworCQkJLmNvdW50ZXJfcmVxdWVzdCA9IGNwdV90b19iZTMyKHJlcSksCisJCQkuc3RhcnRpbmdfaW5kZXggPSBjcHVfdG9fYmUzMihzdGFydGluZ19pbmRleCksCisJCQkuc2Vjb25kYXJ5X2luZGV4ID0gY3B1X3RvX2JlMTYoc2Vjb25kYXJ5X2luZGV4KSwKKwkJCS5jb3VudGVyX2luZm9fdmVyc2lvbl9pbiA9IHZlcnNpb25faW4sCisJCX0KKwl9OworCisJcmV0ID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfR0VUX1BFUkZfQ09VTlRFUl9JTkZPLAorCQkJdmlydF90b19waHlzKCZhcmcpLCBzaXplb2YoYXJnKSk7CisJaWYgKHJldCkgeworCQlwcl9kZXZlbCgiaGNhbGwgZmFpbGVkOiAweCVseFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIHdlIHZlcmlmeSBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgd2l0aGluIHRoZSB6ZXJvZWQgYnVmZmVyIGF0IGV2ZW50CisJICogaW5pdC4KKwkgKi8KKwljb3VudCA9IDA7CisJZm9yIChpID0gb2Zmc2V0OyBpIDwgb2Zmc2V0ICsgbGVuZ3RoOyBpKyspCisJCWNvdW50IHw9IGFyZy5ieXRlc1tpXSA8PCAoaSAtIG9mZnNldCk7CisKKwkqdmFsdWUgPSBjb3VudDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTY0IGhfZ3BjaV9nZXRfdmFsdWUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXU2NCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIHJldCA9IHNpbmdsZV9ncGNpX3JlcXVlc3QoZXZlbnRfZ2V0X3JlcXVlc3QoZXZlbnQpLAorCQkJCQlldmVudF9nZXRfc3RhcnRpbmdfaW5kZXgoZXZlbnQpLAorCQkJCQlldmVudF9nZXRfc2Vjb25kYXJ5X2luZGV4KGV2ZW50KSwKKwkJCQkJZXZlbnRfZ2V0X2NvdW50ZXJfaW5mb192ZXJzaW9uKGV2ZW50KSwKKwkJCQkJZXZlbnRfZ2V0X29mZnNldChldmVudCksCisJCQkJCWV2ZW50X2dldF9sZW5ndGgoZXZlbnQpLAorCQkJCQkmY291bnQpOworCWlmIChyZXQpCisJCXJldHVybiAwOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgaF9ncGNpX2V2ZW50X3VwZGF0ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJczY0IHByZXY7CisJdTY0IG5vdyA9IGhfZ3BjaV9nZXRfdmFsdWUoZXZlbnQpOworCXByZXYgPSBsb2NhbDY0X3hjaGcoJmV2ZW50LT5ody5wcmV2X2NvdW50LCBub3cpOworCWxvY2FsNjRfYWRkKG5vdyAtIHByZXYsICZldmVudC0+Y291bnQpOworfQorCitzdGF0aWMgdm9pZCBoX2dwY2lfZXZlbnRfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJbG9jYWw2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCBoX2dwY2lfZ2V0X3ZhbHVlKGV2ZW50KSk7Cit9CisKK3N0YXRpYyB2b2lkIGhfZ3BjaV9ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCWhfZ3BjaV9ldmVudF91cGRhdGUoZXZlbnQpOworfQorCitzdGF0aWMgaW50IGhfZ3BjaV9ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgUEVSRl9FRl9TVEFSVCkKKwkJaF9ncGNpX2V2ZW50X3N0YXJ0KGV2ZW50LCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoX2dwY2lfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJdTY0IGNvdW50OworCXU4IGxlbmd0aDsKKworCS8qIE5vdCBvdXIgZXZlbnQgKi8KKwlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBldmVudC0+cG11LT50eXBlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIGNvbmZpZzIgaXMgdW51c2VkICovCisJaWYgKGV2ZW50LT5hdHRyLmNvbmZpZzIpIHsKKwkJcHJfZGV2ZWwoImNvbmZpZzIgc2V0IHdoZW4gcmVzZXJ2ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB1bnN1cHBvcnRlZCBtb2RlcyBhbmQgZmlsdGVycyAqLworCWlmIChldmVudC0+YXR0ci5leGNsdWRlX3VzZXIgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2h2ICAgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2hvc3QgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2d1ZXN0ICB8fAorCSAgICBpc19zYW1wbGluZ19ldmVudChldmVudCkpIC8qIG5vIHNhbXBsaW5nICovCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbm8gYnJhbmNoIHNhbXBsaW5nICovCisJaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlsZW5ndGggPSBldmVudF9nZXRfbGVuZ3RoKGV2ZW50KTsKKwlpZiAobGVuZ3RoIDwgMSB8fCBsZW5ndGggPiA4KSB7CisJCXByX2RldmVsKCJsZW5ndGggaW52YWxpZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGxhc3QgYnl0ZSB3aXRoaW4gdGhlIGJ1ZmZlcj8gKi8KKwlpZiAoKGV2ZW50X2dldF9vZmZzZXQoZXZlbnQpICsgbGVuZ3RoKSA+IEdQQ0lfTUFYX0RBVEFfQllURVMpIHsKKwkJcHJfZGV2ZWwoInJlcXVlc3Qgb3V0c2lkZSBvZiBidWZmZXI6ICV6dSA+ICV6dVxuIiwKKwkJCQkoc2l6ZV90KWV2ZW50X2dldF9vZmZzZXQoZXZlbnQpICsgbGVuZ3RoLAorCQkJCUdQQ0lfTUFYX0RBVEFfQllURVMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgcmVxdWVzdCB3b3Jrcy4uLiAqLworCWlmIChzaW5nbGVfZ3BjaV9yZXF1ZXN0KGV2ZW50X2dldF9yZXF1ZXN0KGV2ZW50KSwKKwkJCQlldmVudF9nZXRfc3RhcnRpbmdfaW5kZXgoZXZlbnQpLAorCQkJCWV2ZW50X2dldF9zZWNvbmRhcnlfaW5kZXgoZXZlbnQpLAorCQkJCWV2ZW50X2dldF9jb3VudGVyX2luZm9fdmVyc2lvbihldmVudCksCisJCQkJZXZlbnRfZ2V0X29mZnNldChldmVudCksCisJCQkJbGVuZ3RoLAorCQkJCSZjb3VudCkpIHsKKwkJcHJfZGV2ZWwoImdwY2kgaGNhbGwgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaF9ncGNpX2V2ZW50X2lkeChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG11IGhfZ3BjaV9wbXUgPSB7CisJLnRhc2tfY3R4X25yID0gcGVyZl9pbnZhbGlkX2NvbnRleHQsCisKKwkubmFtZSA9ICJodl9ncGNpIiwKKwkuYXR0cl9ncm91cHMgPSBhdHRyX2dyb3VwcywKKwkuZXZlbnRfaW5pdCAgPSBoX2dwY2lfZXZlbnRfaW5pdCwKKwkuYWRkICAgICAgICAgPSBoX2dwY2lfZXZlbnRfYWRkLAorCS5kZWwgICAgICAgICA9IGhfZ3BjaV9ldmVudF9zdG9wLAorCS5zdGFydCAgICAgICA9IGhfZ3BjaV9ldmVudF9zdGFydCwKKwkuc3RvcCAgICAgICAgPSBoX2dwY2lfZXZlbnRfc3RvcCwKKwkucmVhZCAgICAgICAgPSBoX2dwY2lfZXZlbnRfdXBkYXRlLAorCS5ldmVudF9pZHggICA9IGhfZ3BjaV9ldmVudF9pZHgsCit9OworCitzdGF0aWMgaW50IGh2X2dwY2lfaW5pdCh2b2lkKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgaHJldDsKKwlzdHJ1Y3QgaHZfcGVyZl9jYXBzIGNhcHM7CisKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpIHsKKwkJcHJfaW5mbygibm90IGEgdmlydHVhbGl6ZWQgc3lzdGVtLCBub3QgZW5hYmxpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlocmV0ID0gaHZfcGVyZl9jYXBzX2dldCgmY2Fwcyk7CisJaWYgKGhyZXQpIHsKKwkJcHJfaW5mbygiY291bGQgbm90IG9idGFpbiBjYXBhYmlsaXRpZXMsIGVycm9yIDB4JTgwbHgsIG5vdCBlbmFibGluZ1xuIiwKKwkJCQlocmV0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJciA9IHBlcmZfcG11X3JlZ2lzdGVyKCZoX2dwY2lfcG11LCBoX2dwY2lfcG11Lm5hbWUsIC0xKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKworZGV2aWNlX2luaXRjYWxsKGh2X2dwY2lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmggYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1ZjQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LWdwY2kuaApAQCAtMCwwICsxLDczIEBACisjaWZuZGVmIExJTlVYX1BPV0VSUENfUEVSRl9IVl9HUENJX0hfCisjZGVmaW5lIExJTlVYX1BPV0VSUENfUEVSRl9IVl9HUENJX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBGcm9tIHRoZSBkb2N1bWVudCAiSF9HZXRQZXJmb3JtYW5jZUNvdW50ZXJJbmZvIEludGVyZmFjZSIgdjEuMDcgKi8KKworLyogSF9HRVRfUEVSRl9DT1VOVEVSX0lORk8gYXJndW1lbnQgKi8KK3N0cnVjdCBodl9nZXRfcGVyZl9jb3VudGVyX2luZm9fcGFyYW1zIHsKKwlfX2JlMzIgY291bnRlcl9yZXF1ZXN0OyAvKiBJICovCisJX19iZTMyIHN0YXJ0aW5nX2luZGV4OyAgLyogSU8gKi8KKwlfX2JlMTYgc2Vjb25kYXJ5X2luZGV4OyAvKiBJTyAqLworCV9fYmUxNiByZXR1cm5lZF92YWx1ZXM7IC8qIE8gKi8KKwlfX2JlMzIgZGV0YWlsX3JjOyAvKiBPLCBvbmx5IG5lZWRlZCB3aGVuIGNhbGxlZCB2aWEgKl9ub3JldHMoKSAqLworCisJLyoKKwkgKiBPLCBzaXplIGVhY2ggb2YgY291bnRlcl92YWx1ZSBlbGVtZW50IGluIGJ5dGVzLCBvbmx5IHNldCBmb3IgdmVyc2lvbgorCSAqID49IDB4MworCSAqLworCV9fYmUxNiBjdl9lbGVtZW50X3NpemU7CisKKwkvKiBJLCAwICh6ZXJvKSBmb3IgdmVyc2lvbnMgPCAweDMgKi8KKwlfX3U4IGNvdW50ZXJfaW5mb192ZXJzaW9uX2luOworCisJLyogTywgMCAoemVybykgaWYgdmVyc2lvbiA8IDB4My4gTXVzdCBiZSBzZXQgdG8gMCB3aGVuIG1ha2luZyBoY2FsbCAqLworCV9fdTggY291bnRlcl9pbmZvX3ZlcnNpb25fb3V0OworCV9fdTggcmVzZXJ2ZWRbMHhDXTsKKwlfX3U4IGNvdW50ZXJfdmFsdWVbXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBjb3VudGVyIGluZm8gdmVyc2lvbiA9PiBmdyB2ZXJzaW9uL3JlZmVyZW5jZSAoc3BlYyB2ZXJzaW9uKQorICoKKyAqIDggPT4gcG93ZXI4ICgxLjA3KQorICogWzcgaXMgc2tpcHBlZCBieSBzcGVjIDEuMDddCisgKiA2ID0+IFRMQklFICgxLjA3KQorICogNSA9PiB2N3I3bTAucGh5cCAoMS4wNSkKKyAqIFs0IHNraXBwZWRdCisgKiAzID0+IHY3cjZtMC5waHlwICg/KQorICogWzEsMiBza2lwcGVkXQorICogMCA9PiB2N3J7MiwzLDR9bTAucGh5cCAoPykKKyAqLworI2RlZmluZSBDT1VOVEVSX0lORk9fVkVSU0lPTl9DVVJSRU5UIDB4OAorCisvKgorICogVGhlc2UgZGV0ZXJtaW5lIHRoZSBjb3VudGVyX3ZhbHVlW10gbGF5b3V0IGFuZCB0aGUgbWVhbmluZyBvZiBzdGFydGluZ19pbmRleAorICogYW5kIHNlY29uZGFyeV9pbmRleC4KKyAqCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCBAc2Vjb25kYXJ5X2luZGV4IGlzIHVudXNlZCBhbmQgaWdub3JlZC4KKyAqLworZW51bSBjb3VudGVyX2luZm9fcmVxdWVzdHMgeworCisJLyogR0VORVJBTCAqLworCisJLyogQHN0YXJ0aW5nX2luZGV4OiBtdXN0IGJlIC0xICh0byByZWZlciB0byB0aGUgY3VycmVudCBwYXJ0aXRpb24pCisJICovCisJQ0lSX1NZU1RFTV9QRVJGT1JNQU5DRV9DQVBBQklMSVRJRVMgPSAwWDQwLAorfTsKKworc3RydWN0IGN2X3N5c3RlbV9wZXJmb3JtYW5jZV9jYXBhYmlsaXRpZXMgeworCS8qIElmICE9IDAsIGFsbG93ZWQgdG8gY29sbGVjdCBkYXRhIGZyb20gb3RoZXIgcGFydGl0aW9ucyAqLworCV9fdTggcGVyZl9jb2xsZWN0X3ByaXZpbGVnZWQ7CisKKwkvKiBUaGVzZSBmb2xsb3dpbmcgYXJlIG9ubHkgdmFsaWQgaWYgY291bnRlcl9pbmZvX3ZlcnNpb24gPj0gMHgzICovCisjZGVmaW5lIENWX0NNX0dBICAgICAgICgxIDw8IDcpCisjZGVmaW5lIENWX0NNX0VYUEFOREVEICgxIDw8IDYpCisjZGVmaW5lIENWX0NNX0xBQiAgICAgICgxIDw8IDUpCisJLyogcmVtYWluaW5nIGJpdHMgYXJlIHJlc2VydmVkICovCisJX191OCBjYXBhYmlsaXR5X21hc2s7CisJX191OCByZXNlcnZlZFsweEVdOworfSBfX3BhY2tlZDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjctZXZlbnRzLWxpc3QuaCBiL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyNy1ldmVudHMtbGlzdC5oCmluZGV4IDY4Nzc5MGEuLjY0ZjEzZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyNy1ldmVudHMtbGlzdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyNy1ldmVudHMtbGlzdC5oCkBAIC01NDYsMyArNTQ2LDEzIEBACiBFVkVOVChQTV9EVExCX01JU1NfMTZNLCAgICAgICAgICAgICAgICAgICAgICAgMHg0YzA1ZSkKIEVWRU5UKFBNX0xTVTFfTE1RX0xIUl9NRVJHRSwgICAgICAgICAgICAgICAgICAweDBkMDlhKQogRVZFTlQoUE1fSUZVX0ZJTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNjYpCitFVkVOVChQTV8xVEhSRF9DT05fUlVOX0lOU1RSLCAgICAgICAgICAgICAgICAgMHgzMDA2MikKK0VWRU5UKFBNX0NNUExVX1NUQUxMX0NPVU5ULCAgICAgICAgICAgICAgICAgICAweDQwMDBCKQorRVZFTlQoUE1fTUVNMF9QQl9SRF9DTCwgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwODMpCitFVkVOVChQTV9USFJEXzFfUlVOX0NZQywgICAgICAgICAgICAgICAgICAgICAgMHgxMDA2MCkKK0VWRU5UKFBNX1RIUkRfMl9DT05DX1JVTl9JTlNUUiwgICAgICAgICAgICAgICAweDQwMDYyKQorRVZFTlQoUE1fVEhSRF8yX1JVTl9DWUMsICAgICAgICAgICAgICAgICAgICAgIDB4MjAwNjApCitFVkVOVChQTV9USFJEXzNfQ09OQ19SVU5fSU5TVCwgICAgICAgICAgICAgICAgMHgxMDA2MikKK0VWRU5UKFBNX1RIUkRfM19SVU5fQ1lDLCAgICAgICAgICAgICAgICAgICAgICAweDMwMDYwKQorRVZFTlQoUE1fVEhSRF80X0NPTkNfUlVOX0lOU1QsICAgICAgICAgICAgICAgIDB4MjAwNjIpCitFVkVOVChQTV9USFJEXzRfUlVOX0NZQywgICAgICAgICAgICAgICAgICAgICAgMHg0MDA2MCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyOC1wbXUuYyBiL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyOC1wbXUuYwppbmRleCA5NmNlZTIwLi5mZTI3NjNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjgtcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvcG93ZXI4LXBtdS5jCkBAIC0xMCw2ICsxMCw4IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkJInBvd2VyOC1wbXU6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CkBAIC02Miw5ICs2NCwxMSBAQAogICoKICAqICAgICAgICA2MCAgICAgICAgNTYgICAgICAgIDUyICAgICAgICA0OCAgICAgICAgNDQgICAgICAgIDQwICAgICAgICAzNiAgICAgICAgMzIKICAqIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfAotICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgICAgIHRocmVzaF9jbXAgICAgIF0gICBbICB0aHJlc2hfY3RsICAgXQotICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgKi0gRUJCIChMaW51eCkgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoIHN0YXJ0L3N0b3AgT1IgRkFCIG1hdGNoIC0qCisgKiAgIHwgfCBbIF0gICAgICAgICAgICAgICAgICAgICAgICAgICBbICAgICAgdGhyZXNoX2NtcCAgICAgXSAgIFsgIHRocmVzaF9jdGwgICBdCisgKiAgIHwgfCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICB8IHwgICotIElGTSAoTGludXgpICAgICAgICAgICAgICAgICB0aHJlc2ggc3RhcnQvc3RvcCBPUiBGQUIgbWF0Y2ggLSoKKyAqICAgfCAqLSBCSFJCIChMaW51eCkKKyAqICAgKi0gRUJCIChMaW51eCkKICAqCiAgKiAgICAgICAgMjggICAgICAgIDI0ICAgICAgICAyMCAgICAgICAgMTYgICAgICAgIDEyICAgICAgICAgOCAgICAgICAgIDQgICAgICAgICAwCiAgKiB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwKQEAgLTExNCw5ICsxMTgsMTggQEAKICAqCU1NQ1JBWzU3OjU5XSA9IHNhbXBsZVswOjJdCShSQU5EX1NBTVBfRUxJRykKIMKgKglNTUNSQVs2MTo2Ml0gPSBzYW1wbGVbMzo0XQkoUkFORF9TQU1QX01PREUpCiAgKgorICogaWYgRUJCIGFuZCBCSFJCOgorICoJTU1DUkFbMzI6MzNdID0gSUZNCisgKgogICovCiAKICNkZWZpbmUgRVZFTlRfRUJCX01BU0sJCTF1bGwKKyNkZWZpbmUgRVZFTlRfRUJCX1NISUZUCQlQRVJGX0VWRU5UX0NPTkZJR19FQkJfU0hJRlQKKyNkZWZpbmUgRVZFTlRfQkhSQl9NQVNLCQkxdWxsCisjZGVmaW5lIEVWRU5UX0JIUkJfU0hJRlQJNjIKKyNkZWZpbmUgRVZFTlRfV0FOVFNfQkhSQgkoRVZFTlRfQkhSQl9NQVNLIDw8IEVWRU5UX0JIUkJfU0hJRlQpCisjZGVmaW5lIEVWRU5UX0lGTV9NQVNLCQkzdWxsCisjZGVmaW5lIEVWRU5UX0lGTV9TSElGVAkJNjAKICNkZWZpbmUgRVZFTlRfVEhSX0NNUF9TSElGVAk0MAkvKiBUaHJlc2hvbGQgQ01QIHZhbHVlICovCiAjZGVmaW5lIEVWRU5UX1RIUl9DTVBfTUFTSwkweDNmZgogI2RlZmluZSBFVkVOVF9USFJfQ1RMX1NISUZUCTMyCS8qIFRocmVzaG9sZCBjb250cm9sIHZhbHVlIChzdGFydC9zdG9wKSAqLwpAQCAtMTQxLDYgKzE1NCwxMiBAQAogI2RlZmluZSBFVkVOVF9JU19NQVJLRUQJCShFVkVOVF9NQVJLRURfTUFTSyA8PCBFVkVOVF9NQVJLRURfU0hJRlQpCiAjZGVmaW5lIEVWRU5UX1BTRUxfTUFTSwkJMHhmZgkvKiBQTUN4U0VMIHZhbHVlICovCiAKKy8qIEJpdHMgZGVmaW5lZCBieSBMaW51eCAqLworI2RlZmluZSBFVkVOVF9MSU5VWF9NQVNLCVwKKwkoKEVWRU5UX0VCQl9NQVNLICA8PCBFVkVOVF9FQkJfU0hJRlQpCQkJfAlcCisJIChFVkVOVF9CSFJCX01BU0sgPDwgRVZFTlRfQkhSQl9TSElGVCkJCQl8CVwKKwkgKEVWRU5UX0lGTV9NQVNLICA8PCBFVkVOVF9JRk1fU0hJRlQpKQorCiAjZGVmaW5lIEVWRU5UX1ZBTElEX01BU0sJXAogCSgoRVZFTlRfVEhSRVNIX01BU0sgICAgPDwgRVZFTlRfVEhSRVNIX1NISUZUKQkJfAlcCiAJIChFVkVOVF9TQU1QTEVfTUFTSyAgICA8PCBFVkVOVF9TQU1QTEVfU0hJRlQpCQl8CVwKQEAgLTE0OSw3ICsxNjgsNyBAQAogCSAoRVZFTlRfVU5JVF9NQVNLICAgICAgPDwgRVZFTlRfVU5JVF9TSElGVCkJCXwJXAogCSAoRVZFTlRfQ09NQklORV9NQVNLICAgPDwgRVZFTlRfQ09NQklORV9TSElGVCkJCXwJXAogCSAoRVZFTlRfTUFSS0VEX01BU0sgICAgPDwgRVZFTlRfTUFSS0VEX1NISUZUKQkJfAlcCi0JIChFVkVOVF9FQkJfTUFTSyAgICAgICA8PCBQRVJGX0VWRU5UX0NPTkZJR19FQkJfU0hJRlQpCXwJXAorCSAgRVZFTlRfTElOVVhfTUFTSwkJCQkJfAlcCiAJICBFVkVOVF9QU0VMX01BU0spCiAKIC8qIE1NQ1JBIElGTSBiaXRzIC0gUE9XRVI4ICovCkBAIC0xNzMsMTAgKzE5MiwxMSBAQAogICoKICAqICAgICAgICAyOCAgICAgICAgMjQgICAgICAgIDIwICAgICAgICAxNiAgICAgICAgMTIgICAgICAgICA4ICAgICAgICAgNCAgICAgICAgIDAKICAqIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfCAtIC0gLSAtIHwgLSAtIC0gLSB8IC0gLSAtIC0gfAotICogICAgICAgICAgICAgICAgICAgfCAgIFsgXSAgIFsgIHNhbXBsZSBdICAgWyAgICAgXSAgIFs2XSBbNV0gICBbNF0gWzNdICAgWzJdIFsxXQotICogICAgICAgICAgICAgIEVCQiAtKiAgICB8ICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgIENvdW50IG9mIGV2ZW50cyBmb3IgZWFjaCBQTUMuCi0gKiAgICAgIEwxIEkvRCBxdWFsaWZpZXIgLSogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LgorICogICAgICAgICAgICAgICBbIF0gfCAgIFsgXSAgIFsgIHNhbXBsZSBdICAgWyAgICAgXSAgIFs2XSBbNV0gICBbNF0gWzNdICAgWzJdIFsxXQorICogICAgICAgICAgICAgICAgfCAgfCAgICB8ICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICBCSFJCIElGTSAtKiAgfCAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgIENvdW50IG9mIGV2ZW50cyBmb3IgZWFjaCBQTUMuCisgKiAgICAgICAgICAgICAgRUJCIC0qICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LgorICogICAgICBMMSBJL0QgcXVhbGlmaWVyIC0qICAgICAgICAgICAgICAgICAgICAgfAogICogICAgICAgICAgICAgICAgICAgICBuYyAtIG51bWJlciBvZiBjb3VudGVycyAtKgogICoKICAqIFRoZSBQTUMgZmllbGRzIFAxLi5QNiwgYW5kIE5DLCBhcmUgYWRkZXIgZmllbGRzLiBBcyB3ZSBhY2N1bXVsYXRlIGNvbnN0cmFpbnRzCkBAIC0xOTUsNiArMjE1LDkgQEAKICNkZWZpbmUgQ05TVF9FQkJfVkFMKHYpCQkoKCh2KSAmIEVWRU5UX0VCQl9NQVNLKSA8PCAyNCkKICNkZWZpbmUgQ05TVF9FQkJfTUFTSwkJQ05TVF9FQkJfVkFMKEVWRU5UX0VCQl9NQVNLKQogCisjZGVmaW5lIENOU1RfSUZNX1ZBTCh2KQkJKCgodikgJiBFVkVOVF9JRk1fTUFTSykgPDwgMjUpCisjZGVmaW5lIENOU1RfSUZNX01BU0sJCUNOU1RfSUZNX1ZBTChFVkVOVF9JRk1fTUFTSykKKwogI2RlZmluZSBDTlNUX0wxX1FVQUxfVkFMKHYpCSgoKHYpICYgMykgPDwgMjIpCiAjZGVmaW5lIENOU1RfTDFfUVVBTF9NQVNLCUNOU1RfTDFfUVVBTF9WQUwoMykKIApAQCAtMjQxLDYgKzI2NCw3IEBACiAjZGVmaW5lIE1NQ1JBX1RIUl9TRUxfU0hJRlQJCTE2CiAjZGVmaW5lIE1NQ1JBX1RIUl9DTVBfU0hJRlQJCTMyCiAjZGVmaW5lIE1NQ1JBX1NEQVJfTU9ERV9UTEIJCSgxdWxsIDw8IDQyKQorI2RlZmluZSBNTUNSQV9JRk1fU0hJRlQJCQkzMAogCiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBldmVudF9pc19mYWJfbWF0Y2godTY0IGV2ZW50KQpAQCAtMjY1LDIwICsyODksMjIgQEAKIAlwbWMgICA9IChldmVudCA+PiBFVkVOVF9QTUNfU0hJRlQpICAgICAgICAmIEVWRU5UX1BNQ19NQVNLOwogCXVuaXQgID0gKGV2ZW50ID4+IEVWRU5UX1VOSVRfU0hJRlQpICAgICAgICYgRVZFTlRfVU5JVF9NQVNLOwogCWNhY2hlID0gKGV2ZW50ID4+IEVWRU5UX0NBQ0hFX1NFTF9TSElGVCkgICYgRVZFTlRfQ0FDSEVfU0VMX01BU0s7Ci0JZWJiICAgPSAoZXZlbnQgPj4gUEVSRl9FVkVOVF9DT05GSUdfRUJCX1NISUZUKSAmIEVWRU5UX0VCQl9NQVNLOwotCi0JLyogQ2xlYXIgdGhlIEVCQiBiaXQgaW4gdGhlIGV2ZW50LCBzbyBldmVudCBjaGVja3Mgd29yayBiZWxvdyAqLwotCWV2ZW50ICY9IH4oRVZFTlRfRUJCX01BU0sgPDwgUEVSRl9FVkVOVF9DT05GSUdfRUJCX1NISUZUKTsKKwllYmIgICA9IChldmVudCA+PiBFVkVOVF9FQkJfU0hJRlQpICAgICAgICAmIEVWRU5UX0VCQl9NQVNLOwogCiAJaWYgKHBtYykgeworCQl1NjQgYmFzZV9ldmVudDsKKwogCQlpZiAocG1jID4gNikKIAkJCXJldHVybiAtMTsKIAorCQkvKiBJZ25vcmUgTGludXggZGVmaW5lZCBiaXRzIHdoZW4gY2hlY2tpbmcgZXZlbnQgYmVsb3cgKi8KKwkJYmFzZV9ldmVudCA9IGV2ZW50ICYgfkVWRU5UX0xJTlVYX01BU0s7CisKKwkJaWYgKHBtYyA+PSA1ICYmIGJhc2VfZXZlbnQgIT0gMHg1MDBmYSAmJiBiYXNlX2V2ZW50ICE9IDB4NjAwZjQpCisJCQlyZXR1cm4gLTE7CisKIAkJbWFzayAgfD0gQ05TVF9QTUNfTUFTSyhwbWMpOwogCQl2YWx1ZSB8PSBDTlNUX1BNQ19WQUwocG1jKTsKLQotCQlpZiAocG1jID49IDUgJiYgZXZlbnQgIT0gMHg1MDBmYSAmJiBldmVudCAhPSAweDYwMGY0KQotCQkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChwbWMgPD0gNCkgewpAQCAtMjk5LDkgKzMyNSwxMCBAQAogCQkgKiBIViB3cml0YWJsZSwgYW5kIHRoZXJlIGlzIG5vIEFQSSBmb3IgZ3Vlc3Qga2VybmVscyB0byBtb2RpZnkKIAkJICogaXQuIFRoZSBzb2x1dGlvbiBpcyBmb3IgdGhlIGh5cGVydmlzb3IgdG8gaW5pdGlhbGlzZSB0aGUKIAkJICogZmllbGQgdG8gemVyb2VzLCBhbmQgZm9yIHVzIHRvIG9ubHkgZXZlciBhbGxvdyBldmVudHMgdGhhdAotCQkgKiBoYXZlIGEgY2FjaGUgc2VsZWN0b3Igb2YgemVyby4KKwkJICogaGF2ZSBhIGNhY2hlIHNlbGVjdG9yIG9mIHplcm8uIFRoZSBiYW5rIHNlbGVjdG9yIChiaXQgMykgaXMKKwkJICogaXJyZWxldmFudCwgYXMgbG9uZyBhcyB0aGUgcmVzdCBvZiB0aGUgdmFsdWUgaXMgMC4KIAkJICovCi0JCWlmIChjYWNoZSkKKwkJaWYgKGNhY2hlICYgMHg3KQogCQkJcmV0dXJuIC0xOwogCiAJfSBlbHNlIGlmIChldmVudCAmIEVWRU5UX0lTX0wxKSB7CkBAIC0zNDIsNiArMzY5LDE1IEBACiAJCS8qIEVCQiBldmVudHMgbXVzdCBzcGVjaWZ5IHRoZSBQTUMgKi8KIAkJcmV0dXJuIC0xOwogCisJaWYgKGV2ZW50ICYgRVZFTlRfV0FOVFNfQkhSQikgeworCQlpZiAoIWViYikKKwkJCS8qIE9ubHkgRUJCIGV2ZW50cyBjYW4gcmVxdWVzdCBCSFJCICovCisJCQlyZXR1cm4gLTE7CisKKwkJbWFzayAgfD0gQ05TVF9JRk1fTUFTSzsKKwkJdmFsdWUgfD0gQ05TVF9JRk1fVkFMKGV2ZW50ID4+IEVWRU5UX0lGTV9TSElGVCk7CisJfQorCiAJLyoKIAkgKiBBbGwgZXZlbnRzIG11c3QgYWdyZWUgb24gRUJCLCBlaXRoZXIgYWxsIHJlcXVlc3QgaXQgb3Igbm9uZS4KIAkgKiBFQkIgZXZlbnRzIGFyZSBwaW5uZWQgJiBleGNsdXNpdmUsIHNvIHRoaXMgc2hvdWxkIG5ldmVyIGFjdHVhbGx5CkBAIC00MzEsNiArNDY3LDExIEBACiAJCQltbWNyYSB8PSB2YWwgPDwgTU1DUkFfVEhSX0NNUF9TSElGVDsKIAkJfQogCisJCWlmIChldmVudFtpXSAmIEVWRU5UX1dBTlRTX0JIUkIpIHsKKwkJCXZhbCA9IChldmVudFtpXSA+PiBFVkVOVF9JRk1fU0hJRlQpICYgRVZFTlRfSUZNX01BU0s7CisJCQltbWNyYSB8PSB2YWwgPDwgTU1DUkFfSUZNX1NISUZUOworCQl9CisKIAkJaHdjW2ldID0gcG1jIC0gMTsKIAl9CiAKQEAgLTc3NCw2ICs4MTUsOSBAQAogCS8qIFRlbGwgdXNlcnNwYWNlIHRoYXQgRUJCIGlzIHN1cHBvcnRlZCAqLwogCWN1cl9jcHVfc3BlYy0+Y3B1X3VzZXJfZmVhdHVyZXMyIHw9IFBQQ19GRUFUVVJFMl9FQkI7CiAKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUE1BT19CVUcpKQorCQlwcl9pbmZvKCJQTUFPIHJlc3RvcmUgd29ya2Fyb3VuZCBhY3RpdmUuXG4iKTsKKwogCXJldHVybiAwOwogfQogZWFybHlfaW5pdGNhbGwoaW5pdF9wb3dlcjhfcG11KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnCmluZGV4IGQ2Yzc1MDYuLmRjMWEyNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvS2NvbmZpZwpAQCAtMjY1LDcgKzI2NSw2IEBACiAJc2VsZWN0IFBQQ19GUFUKIAlzZWxlY3QgSUJNNDQwRVBfRVJSNDIKIAlzZWxlY3QgSUJNX0VNQUNfWk1JSQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCiBjb25maWcgNDQwRVBYCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2MyOTNwY2llLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvYzI5M3BjaWUuYwppbmRleCAyMTNkNWI4Li44NDQ3NmI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvYzI5M3BjaWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvYzI5M3BjaWUuYwpAQCAtNjgsNiArNjgsNyBAQAogCS5pbml0X0lSUQkJPSBjMjkzX3BjaWVfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb21tb24uYwppbmRleCAzYjA4NWM3Li5iNTY0YjVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvbW1vbi5jCkBAIC0xMDcsNiArMTA3LDEyIEBACiAJcWVfcmVzZXQoKTsKIAlvZl9ub2RlX3B1dChucCk7CiAKK30KKwordm9pZCBfX2luaXQgbXBjODV4eF9xZV9wYXJfaW9faW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJwYXJfaW8iKTsKIAlpZiAobnApIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICp1Y2M7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29yZW5ldF9nZW5lcmljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29yZW5ldF9nZW5lcmljLmMKaW5kZXggZmJkODcxZS4uOGU0YjFlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZ2VuZXJpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2dlbmVyaWMuYwpAQCAtMjYsMTEgKzI2LDEzIEBACiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KICNpbmNsdWRlIDxhc20vbXBpYy5oPgogI2luY2x1ZGUgPGFzbS9laHZfcGljLmg+CisjaW5jbHVkZSA8YXNtL3FlX2ljLmg+CiAKICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KICNpbmNsdWRlICJzbXAuaCIKKyNpbmNsdWRlICJtcGM4NXh4LmgiCiAKIHZvaWQgX19pbml0IGNvcmVuZXRfZ2VuX3BpY19pbml0KHZvaWQpCiB7CkBAIC0zOCw2ICs0MCw4IEBACiAJdW5zaWduZWQgaW50IGZsYWdzID0gTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19TSU5HTEVfREVTVF9DUFUgfAogCQlNUElDX05PX1JFU0VUOwogCisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwogCWlmIChwcGNfbWQuZ2V0X2lycSA9PSBtcGljX2dldF9jb3JlaW50X2lycSkKIAkJZmxhZ3MgfD0gTVBJQ19FTkFCTEVfQ09SRUlOVDsKIApAQCAtNDUsNiArNDksMTMgQEAKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAogCW1waWNfaW5pdChtcGljKTsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxxZS1pYyIpOworCWlmIChucCkgeworCQlxZV9pY19pbml0KG5wLCAwLCBxZV9pY19jYXNjYWRlX2xvd19tcGljLAorCQkJCXFlX2ljX2Nhc2NhZGVfaGlnaF9tcGljKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KIH0KIAogLyoKQEAgLTU3LDYgKzY4LDggQEAKIAlzd2lvdGxiX2RldGVjdF80ZygpOwogCiAJcHJfaW5mbygiJXMgYm9hcmQgZnJvbSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvclxuIiwgcHBjX21kLm5hbWUpOworCisJbXBjODV4eF9xZV9pbml0KCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2RldmljZV9pZHNbXSA9IHsKQEAgLTgxLDYgKzk0LDkgQEAKIAl7CiAJCS5jb21wYXRpYmxlCT0gImZzbCxxb3JpcS1wY2llLXYzLjAiLAogCX0sCisJeworCQkuY29tcGF0aWJsZQk9ICJmc2wscWUiLAorCX0sCiAJLyogVGhlIGZvbGxvd2luZyB0d28gYXJlIGZvciB0aGUgRnJlZXNjYWxlIGh5cGVydmlzb3IgKi8KIAl7CiAJCS5uYW1lCQk9ICJoeXBlcnZpc29yIiwKQEAgLTE2Myw2ICsxNzksNyBAQAogCS5pbml0X0lSUQkJPSBjb3JlbmV0X2dlbl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfY29yZWludF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvZ2VfaW1wM2EuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9nZV9pbXAzYS5jCmluZGV4IGU2Mjg1YWUuLjExNzkwZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9nZV9pbXAzYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9nZV9pbXAzYS5jCkBAIC0yMTUsNiArMjE1LDcgQEAKIAkuc2hvd19jcHVpbmZvCQk9IGdlX2ltcDNhX3Nob3dfY3B1aW5mbywKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1MzZfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTM2X2RzLmMKaW5kZXggMTVjZTRiNS4uYTM3OGJhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1MzZfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODUzNl9kcy5jCkBAIC03Niw2ICs3Niw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1MzZfZHNfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCmluZGV4IGZjNTFkZDQuLjM5MDU2ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaApAQCAtMTAsOCArMTAsMTAgQEAKIAogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIGV4dGVybiB2b2lkIG1wYzg1eHhfcWVfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG1wYzg1eHhfcWVfcGFyX2lvX2luaXQodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBtcGM4NXh4X3FlX2luaXQodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgbXBjODV4eF9xZV9wYXJfaW9faW5pdCh2b2lkKSB7fQogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwppbmRleCA3YTMxYTBlLi5iMDc1M2UyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwpAQCAtMzg1LDYgKzM4NSw3IEBACiAjaWZkZWYgQ09ORklHX1BDSQogCS5yZXN0YXJ0CT0gbXBjODV4eF9jZHNfcmVzdGFydCwKIAkucGNpYmlvc19maXh1cF9idXMJPSBtcGM4NXh4X2Nkc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZWxzZQogCS5yZXN0YXJ0CT0gZnNsX3JzdGNyX3Jlc3RhcnQsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCmluZGV4IDllYmI5MWUuLmZmZGYwMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfZHNfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTIyMyw2ICsyMjQsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X2RzX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0yMzcsNiArMjM5LDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9kc19waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYwppbmRleCAzNGYzYzVlLi5hMzkyZTk0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYwpAQCAtMjM5LDYgKzIzOSw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAogCW1wYzg1eHhfcWVfaW5pdCgpOworCW1wYzg1eHhfcWVfcGFyX2lvX2luaXQoKTsKIAltcGM4NXh4X21kc19yZXNldF91Y2NfcGh5cygpOwogCiAJaWYgKG1hY2hpbmVfaXMocDEwMjFfbWRzKSkgewpAQCAtMzkxLDYgKzM5Miw3IEBACiAJLnByb2dyZXNzCT0gdWRiZ19wcm9ncmVzcywKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiB9OwogCkBAIC00MTIsNiArNDE0LDcgQEAKIAkucHJvZ3Jlc3MJPSB1ZGJnX3Byb2dyZXNzLAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIH07CiAKQEAgLTQzNCw2ICs0MzcsNyBAQAogCS5wcm9ncmVzcwk9IHVkYmdfcHJvZ3Jlc3MsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYwppbmRleCBlMTViZGQxLi5lMzU4YmVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYwpAQCAtODYsMTAgKzg2LDYgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfcmRiX3NldHVwX2FyY2godm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCi0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLSNlbmRpZgotCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCJtcGM4NXh4X3JkYl9zZXR1cF9hcmNoKCkiLCAwKTsKIApAQCAtOTksOCArOTUsMTAgQEAKIAogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIAltcGM4NXh4X3FlX2luaXQoKTsKKwltcGM4NXh4X3FlX3Bhcl9pb19pbml0KCk7CiAjaWYgZGVmaW5lZChDT05GSUdfVUNDX0dFVEgpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9RRSkKIAlpZiAobWFjaGluZV9pcyhwMTAyNV9yZGIpKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAKIAkJc3RydWN0IGNjc3JfZ3V0cyBfX2lvbWVtICpndXRzOwogCkBAIC0yMzMsNiArMjMxLDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZGJfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTI0Nyw2ICsyNDYsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X3JkYl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMjYxLDYgKzI2MSw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0yNzUsNiArMjc2LDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZGJfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTI4OSw2ICsyOTEsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X3JkYl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMzAzLDYgKzMwNiw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0zMTcsNiArMzIxLDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZGJfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKQEAgLTMzMSw2ICszMzYsNyBAQAogCS5pbml0X0lSUQkJPSBtcGM4NXh4X3JkYl9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMzQ1LDYgKzM1MSw3IEBACiAJLmluaXRfSVJRCQk9IG1wYzg1eHhfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0zNTksNiArMzY2LDcgQEAKIAkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZGJfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAxMHJkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDEwcmRiLmMKaW5kZXggZDZhM2RkMy4uYWQxYTNkNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDEwcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDEwcmRiLmMKQEAgLTc4LDYgKzc4LDcgQEAKIAkuaW5pdF9JUlEJCT0gcDEwMTBfcmRiX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9kcy5jCmluZGV4IGU2MTFlNzkuLjZhYzk4NmQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYwpAQCAtNTY3LDYgKzU2Nyw3IEBACiAJLmluaXRfSVJRCQk9IHAxMDIyX2RzX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiCT0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX3Jkay5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX3Jkay5jCmluZGV4IDhjOTI5NzEuLjdhMTgwZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9yZGsuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfcmRrLmMKQEAgLTE0Nyw2ICsxNDcsNyBAQAogCS5pbml0X0lSUQkJPSBwMTAyMl9yZGtfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyM19yZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyM19yZHMuYwppbmRleCAyYWU5ZDQ5Li4wZTYxNDAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjNfcmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIzX3Jkcy5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIAkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiB9OwogCkBAIC0xNDAsNSArMTQxLDYgQEAKIAkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3FlbXVfZTUwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3FlbXVfZTUwMC5jCmluZGV4IDVjZWZjNWEuLjdmMjY3MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9xZW11X2U1MDAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcWVtdV9lNTAwLmMKQEAgLTY2LDYgKzY2LDcgQEAKIAkuaW5pdF9JUlEJCT0gcWVtdV9lNTAwX3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9jb3JlaW50X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTQ4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU0OC5jCmluZGV4IGY2MjEyMTguLmIwNzIxNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTQ4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NDguYwpAQCAtMTM1LDYgKzEzNSw3IEBACiAJLnJlc3RhcnQJPSBmc2xfcnN0Y3JfcmVzdGFydCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmNhbGlicmF0ZV9kZWNyID0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJPSB1ZGJnX3Byb2dyZXNzLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3R3cl9wMTAyeC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3R3cl9wMTAyeC5jCmluZGV4IGMyNWZmMTAuLjFlYWRiNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90d3JfcDEwMnguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHdyX3AxMDJ4LmMKQEAgLTc3LDYgKzc3LDcgQEAKIAogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIAltcGM4NXh4X3FlX2luaXQoKTsKKwltcGM4NXh4X3FlX3Bhcl9pb19pbml0KCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19VQ0NfR0VUSCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX1FFKQogCWlmIChtYWNoaW5lX2lzKHR3cl9wMTAyNSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC94ZXNfbXBjODV4eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3hlc19tcGM4NXh4LmMKaW5kZXggZGNiZjdlNC4uMWE5YzEwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3hlc19tcGM4NXh4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3hlc19tcGM4NXh4LmMKQEAgLTE3MCw2ICsxNzAsNyBAQAogCS5pbml0X0lSUQkJPSB4ZXNfbXBjODV4eF9waWNfaW5pdCwKICNpZmRlZiBDT05GSUdfUENJCiAJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorCS5wY2liaW9zX2ZpeHVwX3BoYiAgICAgID0gZnNsX3BjaWJpb3NfZml4dXBfcGhiLAogI2VuZGlmCiAJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LApAQCAtMTg0LDYgKzE4NSw3IEBACiAJLmluaXRfSVJRCQk9IHhlc19tcGM4NXh4X3BpY19pbml0LAogI2lmZGVmIENPTkZJR19QQ0kKIAkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisJLnBjaWJpb3NfZml4dXBfcGhiICAgICAgPSBmc2xfcGNpYmlvc19maXh1cF9waGIsCiAjZW5kaWYKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCkBAIC0xOTgsNiArMjAwLDcgQEAKIAkuaW5pdF9JUlEJCT0geGVzX21wYzg1eHhfcGljX2luaXQsCiAjaWZkZWYgQ09ORklHX1BDSQogCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKwkucGNpYmlvc19maXh1cF9waGIgICAgICA9IGZzbF9wY2liaW9zX2ZpeHVwX3BoYiwKICNlbmRpZgogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYwppbmRleCAyZDQyZjNiLi44YTEwNmI0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIHsKIAlpaWNfcmVxdWVzdF9pcGkoUFBDX01TR19DQUxMX0ZVTkNUSU9OKTsKIAlpaWNfcmVxdWVzdF9pcGkoUFBDX01TR19SRVNDSEVEVUxFKTsKLQlpaWNfcmVxdWVzdF9pcGkoUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFKTsKKwlpaWNfcmVxdWVzdF9pcGkoUFBDX01TR19USUNLX0JST0FEQ0FTVCk7CiAJaWljX3JlcXVlc3RfaXBpKFBQQ19NU0dfREVCVUdHRVJfQlJFQUspOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jCmluZGV4IDQ5MzE4MzguLjRhMGE2NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jCkBAIC04Myw3ICs4Myw2IEBACiAjZGVmaW5lIE1JTl9TUFVfVElNRVNMSUNFCW1heCg1ICogSFogLyAoMTAwMCAqIFNQVVNDSEVEX1RJQ0spLCAxKQogI2RlZmluZSBERUZfU1BVX1RJTUVTTElDRQkoMTAwICogSFogLyAoMTAwMCAqIFNQVVNDSEVEX1RJQ0spKQogCi0jZGVmaW5lIE1BWF9VU0VSX1BSSU8JCShNQVhfUFJJTyAtIE1BWF9SVF9QUklPKQogI2RlZmluZSBTQ0FMRV9QUklPKHgsIHByaW8pIFwKIAltYXgoeCAqIChNQVhfUFJJTyAtIHByaW8pIC8gKE1BWF9VU0VSX1BSSU8gLyAyKSwgTUlOX1NQVV9USU1FU0xJQ0UpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwppbmRleCA2ZDNjN2E5Li4yYTcwMjRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCkBAIC0zNCw3ICszNCw2IEBACiAJc2VsZWN0IFRTSTEwOF9CUklER0UKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKLQlzZWxlY3QgVFNJMTA4X0JSSURHRQogCWhlbHAKIAkgIFNlbGVjdCBNUEM3NDQ4SFBDMiBpZiBjb25maWd1cmluZyBmb3IgRnJlZXNjYWxlIE1QQzc0NDhIUEMyIChUYWlnYSkKIAkgIHBsYXRmb3JtCkBAIC00NCwxOSArNDMsMTAgQEAKIAlkZXBlbmRzIG9uIEVNQkVEREVENnh4CiAJc2VsZWN0IFRTSTEwOF9CUklER0UKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKLQlzZWxlY3QgVFNJMTA4X0JSSURHRQogCWhlbHAKIAkgIFNlbGVjdCBQUENfSE9MTFkgaWYgY29uZmlndXJpbmcgZm9yIGFuIElCTSA3NTBHWC9DTCBFdmFsCiAJICBCb2FyZCB3aXRoIFRTSTEwOC85IGJyaWRnZSAoSGlja29yeS9Ib2xseSkKIAotY29uZmlnIFBQQ19QUlBNQzI4MDAKLQlib29sICJNb3Rvcm9sYS1QclBNQzI4MDAiCi0JZGVwZW5kcyBvbiBFTUJFRERFRDZ4eAotCXNlbGVjdCBNVjY0WDYwCi0Jc2VsZWN0IE5PVF9DT0hFUkVOVF9DQUNIRQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1vdG9yb2xhIFByUE1DMjgwMCBib2FyZAotCiBjb25maWcgUFBDX0MySwogCWJvb2wgIlNCUy9HRUZhbnVjIEMySyBib2FyZCIKIAlkZXBlbmRzIG9uIEVNQkVEREVENnh4CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9NYWtlZmlsZQppbmRleCBjZGQ0OGQ0Li5mMTI2YTJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvTWFrZWZpbGUKQEAgLTUsNyArNSw2IEBACiBvYmotJChDT05GSUdfTElOS1NUQVRJT04pCSs9IGxpbmtzdGF0aW9uLm8gbHNfdWFydC5vCiBvYmotJChDT05GSUdfU1RPUkNFTlRFUikJKz0gc3RvcmNlbnRlci5vCiBvYmotJChDT05GSUdfUFBDX0hPTExZKQkJKz0gaG9sbHkubwotb2JqLSQoQ09ORklHX1BQQ19QUlBNQzI4MDApCSs9IHBycG1jMjgwMC5vCiBvYmotJChDT05GSUdfUFBDX0MySykJCSs9IGMyay5vCiBvYmotJChDT05GSUdfVVNCR0VDS09fVURCRykJKz0gdXNiZ2Vja29fdWRiZy5vCiBvYmotJChDT05GSUdfR0FNRUNVQkVfQ09NTU9OKQkrPSBmbGlwcGVyLXBpYy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3BycG1jMjgwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9wcnBtYzI4MDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1NWYwOC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3BycG1jMjgwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBCb2FyZCBzZXR1cCByb3V0aW5lcyBmb3IgdGhlIE1vdG9yb2xhIFByUE1DMjgwMAotICoKLSAqIEF1dGhvcjogRGFsZSBGYXJuc3dvcnRoIDxkYWxlQGZhcm5zd29ydGgub3JnPgotICoKLSAqIDIwMDcgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotCi0jaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KLQotI2luY2x1ZGUgPHN5c2Rldi9tdjY0eDYwLmg+Ci0KLSNkZWZpbmUgTVY2NHg2MF9NUFBfQ05UTF8wCTB4MDAwMAotI2RlZmluZSBNVjY0eDYwX01QUF9DTlRMXzIJMHgwMDA4Ci0KLSNkZWZpbmUgTVY2NHg2MF9HUFBfSU9fQ05UTAkweDAwMDAKLSNkZWZpbmUgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTAkweDAwMTAKLSNkZWZpbmUgTVY2NHg2MF9HUFBfVkFMVUVfU0VUCTB4MDAxOAotCi0jZGVmaW5lIFBMQVRGT1JNX05BTUVfTUFYCTMyCi0KLXN0YXRpYyBjaGFyIHBycG1jMjgwMF9wbGF0Zm9ybV9uYW1lW1BMQVRGT1JNX05BTUVfTUFYXTsKLQotc3RhdGljIHZvaWQgX19pb21lbSAqbXY2NHg2MF9tcHBfcmVnX2Jhc2U7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICptdjY0eDYwX2dwcF9yZWdfYmFzZTsKLQotc3RhdGljIHZvaWQgX19pbml0IHBycG1jMjgwMF9zZXR1cF9hcmNoKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlwaHlzX2FkZHJfdCBwYWRkcjsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnJlZzsKLQotCS8qCi0JICogaW9yZW1hcCBtcHAgYW5kIGdwcCByZWdpc3RlcnMgaW4gY2FzZSB0aGV5IGFyZSBsYXRlcgotCSAqIG5lZWRlZCBieSBwcnBtYzI4MDBfcmVzZXRfYm9hcmQoKS4KLQkgKi8KLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJtYXJ2ZWxsLG12NjQzNjAtbXBwIik7Ci0JcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7Ci0JcGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhucCwgcmVnKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0JbXY2NHg2MF9tcHBfcmVnX2Jhc2UgPSBpb3JlbWFwKHBhZGRyLCByZWdbMV0pOwotCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAibWFydmVsbCxtdjY0MzYwLWdwcCIpOwotCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCXBhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MobnAsIHJlZyk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCW12NjR4NjBfZ3BwX3JlZ19iYXNlID0gaW9yZW1hcChwYWRkciwgcmVnWzFdKTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLQltdjY0eDYwX3BjaV9pbml0KCk7Ci0jZW5kaWYKLQotCXByaW50aygiTW90b3JvbGEgJXNcbiIsIHBycG1jMjgwMF9wbGF0Zm9ybV9uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgcHJwbWMyODAwX3Jlc2V0X2JvYXJkKHZvaWQpCi17Ci0JdTMyIHRlbXA7Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0JdGVtcCA9IGluX2xlMzIobXY2NHg2MF9tcHBfcmVnX2Jhc2UgKyBNVjY0eDYwX01QUF9DTlRMXzApOwotCXRlbXAgJj0gMHhGRkZGMEZGRjsKLQlvdXRfbGUzMihtdjY0eDYwX21wcF9yZWdfYmFzZSArIE1WNjR4NjBfTVBQX0NOVExfMCwgdGVtcCk7Ci0KLQl0ZW1wID0gaW5fbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0xFVkVMX0NOVEwpOwotCXRlbXAgfD0gMHgwMDAwMDAwNDsKLQlvdXRfbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0xFVkVMX0NOVEwsIHRlbXApOwotCi0JdGVtcCA9IGluX2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9JT19DTlRMKTsKLQl0ZW1wIHw9IDB4MDAwMDAwMDQ7Ci0Jb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9JT19DTlRMLCB0ZW1wKTsKLQotCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfbXBwX3JlZ19iYXNlICsgTVY2NHg2MF9NUFBfQ05UTF8yKTsKLQl0ZW1wICY9IDB4RkZGRjBGRkY7Ci0Jb3V0X2xlMzIobXY2NHg2MF9tcHBfcmVnX2Jhc2UgKyBNVjY0eDYwX01QUF9DTlRMXzIsIHRlbXApOwotCi0JdGVtcCA9IGluX2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMKTsKLQl0ZW1wIHw9IDB4MDAwODAwMDA7Ci0Jb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMLCB0ZW1wKTsKLQotCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU9fQ05UTCk7Ci0JdGVtcCB8PSAweDAwMDgwMDAwOwotCW91dF9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU9fQ05UTCwgdGVtcCk7Ci0KLQlvdXRfbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX1ZBTFVFX1NFVCwgMHgwMDA4MDAwNCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBycG1jMjgwMF9yZXN0YXJ0KGNoYXIgKmNtZCkKLXsKLQl2b2xhdGlsZSB1bG9uZyBpID0gMTAwMDAwMDA7Ci0KLQlwcnBtYzI4MDBfcmVzZXRfYm9hcmQoKTsKLQotCXdoaWxlIChpLS0gPiAwKTsKLQlwYW5pYygicmVzdGFydCBmYWlsZWRcbiIpOwotfQotCi0jaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQotI2RlZmluZSBQUFJQTTI4MDBfQ09IRVJFTkNZX1NFVFRJTkcgIm9mZiIKLSNlbHNlCi0jZGVmaW5lIFBQUlBNMjgwMF9DT0hFUkVOQ1lfU0VUVElORyAib24iCi0jZW5kaWYKLQotdm9pZCBwcnBtYzI4MDBfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKLXsKLQlzZXFfcHJpbnRmKG0sICJWZW5kb3JcdFx0OiBNb3Rvcm9sYVxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiY29oZXJlbmN5XHQ6ICVzXG4iLCBQUFJQTTI4MDBfQ09IRVJFTkNZX1NFVFRJTkcpOwotfQotCi0vKgotICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHBycG1jMjgwMF9wcm9iZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQl1bnNpZ25lZCBsb25nIGxlbiA9IFBMQVRGT1JNX05BTUVfTUFYOwotCXZvaWQgKm07Ci0KLQlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAibW90b3JvbGEsUHJQTUMyODAwIikpCi0JCXJldHVybiAwOwotCi0JLyogVXBkYXRlIHBwY19tZC5uYW1lIHdpdGggbmFtZSBmcm9tIGR0ICovCi0JbSA9IG9mX2dldF9mbGF0X2R0X3Byb3Aocm9vdCwgIm1vZGVsIiwgJmxlbik7Ci0JaWYgKG0pCi0JCXN0cm5jcHkocHJwbWMyODAwX3BsYXRmb3JtX25hbWUsIG0sCi0JCQltaW4oKGludClsZW4sIFBMQVRGT1JNX05BTUVfTUFYIC0gMSkpOwotCi0JX3NldF9MMkNSKF9nZXRfTDJDUigpIHwgTDJDUl9MMkUpOwotCXJldHVybiAxOwotfQotCi1kZWZpbmVfbWFjaGluZShwcnBtYzI4MDApewotCS5uYW1lCQkJPSBwcnBtYzI4MDBfcGxhdGZvcm1fbmFtZSwKLQkucHJvYmUJCQk9IHBycG1jMjgwMF9wcm9iZSwKLQkuc2V0dXBfYXJjaAkJPSBwcnBtYzI4MDBfc2V0dXBfYXJjaCwKLQkuaW5pdF9lYXJseQkJPSBtdjY0eDYwX2luaXRfZWFybHksCi0JLnNob3dfY3B1aW5mbwkJPSBwcnBtYzI4MDBfc2hvd19jcHVpbmZvLAotCS5pbml0X0lSUQkJPSBtdjY0eDYwX2luaXRfaXJxLAotCS5nZXRfaXJxCQk9IG12NjR4NjBfZ2V0X2lycSwKLQkucmVzdGFydAkJPSBwcnBtYzI4MDBfcmVzdGFydCwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKLX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUKaW5kZXggOGQ3NjdmZC4uZjMyNGVhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9NYWtlZmlsZQpAQCAtMSw2ICsxLDYgQEAKLW9iai15CQkJKz0gc2V0dXAubyBvcGFsLXRha2VvdmVyLm8gb3BhbC13cmFwcGVycy5vIG9wYWwubworb2JqLXkJCQkrPSBzZXR1cC5vIG9wYWwtdGFrZW92ZXIubyBvcGFsLXdyYXBwZXJzLm8gb3BhbC5vIG9wYWwtYXN5bmMubwogb2JqLXkJCQkrPSBvcGFsLXJ0Yy5vIG9wYWwtbnZyYW0ubyBvcGFsLWxwYy5vIG9wYWwtZmxhc2gubwotb2JqLXkJCQkrPSBybmcubworb2JqLXkJCQkrPSBybmcubyBvcGFsLWVsb2cubyBvcGFsLWR1bXAubyBvcGFsLXN5c3BhcmFtLm8gb3BhbC1zZW5zb3IubwogCiBvYmotJChDT05GSUdfU01QKQkrPSBzbXAubwogb2JqLSQoQ09ORklHX1BDSSkJKz0gcGNpLm8gcGNpLXA1aW9jMi5vIHBjaS1pb2RhLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWFzeW5jLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1hc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMGMxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1hc3luYy5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogUG93ZXJOViBPUEFMIGFzeW5jaHJvbm91cyBjb21wbGV0aW9uIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKworI2RlZmluZSBOX0FTWU5DX0NPTVBMRVRJT05TCTY0CisKK3N0YXRpYyBERUNMQVJFX0JJVE1BUChvcGFsX2FzeW5jX2NvbXBsZXRlX21hcCwgTl9BU1lOQ19DT01QTEVUSU9OUykgPSB7fjBVTH07CitzdGF0aWMgREVDTEFSRV9CSVRNQVAob3BhbF9hc3luY190b2tlbl9tYXAsIE5fQVNZTkNfQ09NUExFVElPTlMpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG9wYWxfYXN5bmNfd2FpdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG9wYWxfYXN5bmNfY29tcF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIG9wYWxfYXN5bmNfc2VtOworc3RhdGljIHN0cnVjdCBvcGFsX21zZyAqb3BhbF9hc3luY19yZXNwb25zZXM7CitzdGF0aWMgdW5zaWduZWQgaW50IG9wYWxfbWF4X2FzeW5jX3Rva2VuczsKKworaW50IF9fb3BhbF9hc3luY19nZXRfdG9rZW4odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0b2tlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvcGFsX2FzeW5jX2NvbXBfbG9jaywgZmxhZ3MpOworCXRva2VuID0gZmluZF9maXJzdF9iaXQob3BhbF9hc3luY19jb21wbGV0ZV9tYXAsIG9wYWxfbWF4X2FzeW5jX3Rva2Vucyk7CisJaWYgKHRva2VuID49IG9wYWxfbWF4X2FzeW5jX3Rva2VucykgeworCQl0b2tlbiA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdCh0b2tlbiwgb3BhbF9hc3luY190b2tlbl9tYXApKSB7CisJCXRva2VuID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlfX2NsZWFyX2JpdCh0b2tlbiwgb3BhbF9hc3luY19jb21wbGV0ZV9tYXApOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BhbF9hc3luY19jb21wX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdG9rZW47Cit9CisKK2ludCBvcGFsX2FzeW5jX2dldF90b2tlbl9pbnRlcnJ1cHRpYmxlKHZvaWQpCit7CisJaW50IHRva2VuOworCisJLyogV2FpdCB1bnRpbCBhIHRva2VuIGlzIGF2YWlsYWJsZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJm9wYWxfYXN5bmNfc2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXRva2VuID0gX19vcGFsX2FzeW5jX2dldF90b2tlbigpOworCWlmICh0b2tlbiA8IDApCisJCXVwKCZvcGFsX2FzeW5jX3NlbSk7CisKKwlyZXR1cm4gdG9rZW47Cit9CisKK2ludCBfX29wYWxfYXN5bmNfcmVsZWFzZV90b2tlbihpbnQgdG9rZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0b2tlbiA8IDAgfHwgdG9rZW4gPj0gb3BhbF9tYXhfYXN5bmNfdG9rZW5zKSB7CisJCXByX2VycigiJXM6IFBhc3NlZCB0b2tlbiBpcyBvdXQgb2YgcmFuZ2UsIHRva2VuICVkXG4iLAorCQkJCV9fZnVuY19fLCB0b2tlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZvcGFsX2FzeW5jX2NvbXBfbG9jaywgZmxhZ3MpOworCV9fc2V0X2JpdCh0b2tlbiwgb3BhbF9hc3luY19jb21wbGV0ZV9tYXApOworCV9fY2xlYXJfYml0KHRva2VuLCBvcGFsX2FzeW5jX3Rva2VuX21hcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BhbF9hc3luY19jb21wX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQgb3BhbF9hc3luY19yZWxlYXNlX3Rva2VuKGludCB0b2tlbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19vcGFsX2FzeW5jX3JlbGVhc2VfdG9rZW4odG9rZW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl1cCgmb3BhbF9hc3luY19zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBvcGFsX2FzeW5jX3dhaXRfcmVzcG9uc2UodWludDY0X3QgdG9rZW4sIHN0cnVjdCBvcGFsX21zZyAqbXNnKQoreworCWlmICh0b2tlbiA+PSBvcGFsX21heF9hc3luY190b2tlbnMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCB0b2tlbiBwYXNzZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFtc2cpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBtZXNzYWdlIHBvaW50ZXIgcGFzc2VkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdhaXRfZXZlbnQob3BhbF9hc3luY193YWl0LCB0ZXN0X2JpdCh0b2tlbiwgb3BhbF9hc3luY19jb21wbGV0ZV9tYXApKTsKKwltZW1jcHkobXNnLCAmb3BhbF9hc3luY19yZXNwb25zZXNbdG9rZW5dLCBzaXplb2YoKm1zZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BhbF9hc3luY19jb21wX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCXVuc2lnbmVkIGxvbmcgbXNnX3R5cGUsIHZvaWQgKm1zZykKK3sKKwlzdHJ1Y3Qgb3BhbF9tc2cgKmNvbXBfbXNnID0gbXNnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobXNnX3R5cGUgIT0gT1BBTF9NU0dfQVNZTkNfQ09NUCkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoJm9wYWxfYXN5bmNfcmVzcG9uc2VzW2NvbXBfbXNnLT5wYXJhbXNbMF1dLCBjb21wX21zZywKKwkJCXNpemVvZigqY29tcF9tc2cpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3BhbF9hc3luY19jb21wX2xvY2ssIGZsYWdzKTsKKwlfX3NldF9iaXQoY29tcF9tc2ctPnBhcmFtc1swXSwgb3BhbF9hc3luY19jb21wbGV0ZV9tYXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wYWxfYXN5bmNfY29tcF9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZvcGFsX2FzeW5jX3dhaXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb3BhbF9hc3luY19jb21wX25iID0geworCQkubm90aWZpZXJfY2FsbAk9IG9wYWxfYXN5bmNfY29tcF9ldmVudCwKKwkJLm5leHQJCT0gTlVMTCwKKwkJLnByaW9yaXR5CT0gMCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9wYWxfYXN5bmNfY29tcF9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpvcGFsX25vZGU7CisJY29uc3QgX19iZTMyICphc3luYzsKKwlpbnQgZXJyOworCisJb3BhbF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbCIpOworCWlmICghb3BhbF9ub2RlKSB7CisJCXByX2VycigiJXM6IE9wYWwgbm9kZSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJYXN5bmMgPSBvZl9nZXRfcHJvcGVydHkob3BhbF9ub2RlLCAib3BhbC1tc2ctYXN5bmMtbnVtIiwgTlVMTCk7CisJaWYgKCFhc3luYykgeworCQlwcl9lcnIoIiVzOiAlcyBoYXMgbm8gb3BhbC1tc2ctYXN5bmMtbnVtXG4iLAorCQkJCV9fZnVuY19fLCBvcGFsX25vZGUtPmZ1bGxfbmFtZSk7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X29wYWxfbm9kZTsKKwl9CisKKwlvcGFsX21heF9hc3luY190b2tlbnMgPSBiZTMyX3RvX2NwdXAoYXN5bmMpOworCWlmIChvcGFsX21heF9hc3luY190b2tlbnMgPiBOX0FTWU5DX0NPTVBMRVRJT05TKQorCQlvcGFsX21heF9hc3luY190b2tlbnMgPSBOX0FTWU5DX0NPTVBMRVRJT05TOworCisJZXJyID0gb3BhbF9tZXNzYWdlX25vdGlmaWVyX3JlZ2lzdGVyKE9QQUxfTVNHX0FTWU5DX0NPTVAsCisJCQkmb3BhbF9hc3luY19jb21wX25iKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiJXM6IENhbid0IHJlZ2lzdGVyIE9QQUwgZXZlbnQgbm90aWZpZXIgKCVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgZXJyKTsKKwkJZ290byBvdXRfb3BhbF9ub2RlOworCX0KKworCW9wYWxfYXN5bmNfcmVzcG9uc2VzID0ga3phbGxvYygKKwkJCXNpemVvZigqb3BhbF9hc3luY19yZXNwb25zZXMpICogb3BhbF9tYXhfYXN5bmNfdG9rZW5zLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFvcGFsX2FzeW5jX3Jlc3BvbnNlcykgeworCQlwcl9lcnIoIiVzOiBPdXQgb2YgbWVtb3J5LCBmYWlsZWQgdG8gZG8gYXN5bmNocm9ub3VzICIKKwkJCQkiY29tcGxldGlvbiBpbml0XG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X29wYWxfbm9kZTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRvIDEgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHRva2VucyBhdmFpbGFibGUsIGFzIHdlIG1heQorCSAqIHJlcXVpcmUgdG8gcG9wIG9uZSBkdXJpbmcgZW1lcmdlbmN5IHRocm91Z2ggc3luY2hyb25vdXMgY2FsbCB0bworCSAqIF9fb3BhbF9hc3luY19nZXRfdG9rZW4oKQorCSAqLworCXNlbWFfaW5pdCgmb3BhbF9hc3luY19zZW0sIG9wYWxfbWF4X2FzeW5jX3Rva2VucyAtIDEpOworCitvdXRfb3BhbF9ub2RlOgorCW9mX25vZGVfcHV0KG9wYWxfbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK3N1YnN5c19pbml0Y2FsbChvcGFsX2FzeW5jX2NvbXBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1kdW1wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NjdjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWR1bXAuYwpAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqIFBvd2VyTlYgT1BBTCBEdW1wIEludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAyMDEzLDIwMTQgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKKyNkZWZpbmUgRFVNUF9UWVBFX0ZTUAkweDAxCisKK3N0cnVjdCBkdW1wX29iaiB7CisJc3RydWN0IGtvYmplY3QgIGtvYmo7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHVtcF9hdHRyOworCXVpbnQzMl90CWlkOyAgLyogYmVjb21lcyBvYmplY3QgbmFtZSAqLworCXVpbnQzMl90CXR5cGU7CisJdWludDMyX3QJc2l6ZTsKKwljaGFyCQkqYnVmZmVyOworfTsKKyNkZWZpbmUgdG9fZHVtcF9vYmooeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkdW1wX29iaiwga29iaikKKworc3RydWN0IGR1bXBfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBkdW1wX29iaiAqZHVtcCwgc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBkdW1wX29iaiAqZHVtcCwgc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK307CisjZGVmaW5lIHRvX2R1bXBfYXR0cih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGR1bXBfYXR0cmlidXRlLCBhdHRyKQorCitzdGF0aWMgc3NpemVfdCBkdW1wX2lkX3Nob3coc3RydWN0IGR1bXBfb2JqICpkdW1wX29iaiwKKwkJCSAgICBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIGR1bXBfb2JqLT5pZCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkdW1wX3R5cGVfdG9fc3RyaW5nKHVpbnQzMl90IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAweDAxOiByZXR1cm4gIlNQIER1bXAiOworCWNhc2UgMHgwMjogcmV0dXJuICJTeXN0ZW0vUGxhdGZvcm0gRHVtcCI7CisJY2FzZSAweDAzOiByZXR1cm4gIlNNQSBEdW1wIjsKKwlkZWZhdWx0OiByZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIHNzaXplX3QgZHVtcF90eXBlX3Nob3coc3RydWN0IGR1bXBfb2JqICpkdW1wX29iaiwKKwkJCSAgICAgIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwkKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4ICVzXG4iLCBkdW1wX29iai0+dHlwZSwKKwkJICAgICAgIGR1bXBfdHlwZV90b19zdHJpbmcoZHVtcF9vYmotPnR5cGUpKTsKK30KKworc3RhdGljIHNzaXplX3QgZHVtcF9hY2tfc2hvdyhzdHJ1Y3QgZHVtcF9vYmogKmR1bXBfb2JqLAorCQkJICAgICBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJhY2sgLSBhY2tub3dsZWRnZSBkdW1wXG4iKTsKK30KKworLyoKKyAqIFNlbmQgYWNrbm93bGVkZ2VtZW50IHRvIE9QQUwKKyAqLworc3RhdGljIGludDY0X3QgZHVtcF9zZW5kX2Fjayh1aW50MzJfdCBkdW1wX2lkKQoreworCWludCByYzsKKworCXJjID0gb3BhbF9kdW1wX2FjayhkdW1wX2lkKTsKKwlpZiAocmMpCisJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gc2VuZCBhY2sgdG8gRHVtcCBJRCAweCV4ICglZClcbiIsCisJCQlfX2Z1bmNfXywgZHVtcF9pZCwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcmVsZWFzZV9rb2JqKHZvaWQgKmtvYmopCit7CisJa29iamVjdF9wdXQoKHN0cnVjdCBrb2JqZWN0ICopa29iaik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfYWNrX3N0b3JlKHN0cnVjdCBkdW1wX29iaiAqZHVtcF9vYmosCisJCQkgICAgICBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQpCit7CisJZHVtcF9zZW5kX2FjayhkdW1wX29iai0+aWQpOworCXN5c2ZzX3NjaGVkdWxlX2NhbGxiYWNrKCZkdW1wX29iai0+a29iaiwgZGVsYXlfcmVsZWFzZV9rb2JqLAorCQkJCSZkdW1wX29iai0+a29iaiwgVEhJU19NT0RVTEUpOworCXJldHVybiBjb3VudDsKK30KKworLyogQXR0cmlidXRlcyBvZiBhIGR1bXAKKyAqIFRoZSBiaW5hcnkgYXR0cmlidXRlIG9mIHRoZSBkdW1wIGl0c2VsZiBpcyBkeW5hbWljCisgKiBkdWUgdG8gdGhlIGR5bmFtaWMgc2l6ZSBvZiB0aGUgZHVtcAorICovCitzdGF0aWMgc3RydWN0IGR1bXBfYXR0cmlidXRlIGlkX2F0dHJpYnV0ZSA9CisJX19BVFRSKGlkLCAwNjY2LCBkdW1wX2lkX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSB0eXBlX2F0dHJpYnV0ZSA9CisJX19BVFRSKHR5cGUsIDA2NjYsIGR1bXBfdHlwZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgYWNrX2F0dHJpYnV0ZSA9CisJX19BVFRSKGFja25vd2xlZGdlLCAwNjYwLCBkdW1wX2Fja19zaG93LCBkdW1wX2Fja19zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGluaXRfZHVtcF9zaG93KHN0cnVjdCBkdW1wX29iaiAqZHVtcF9vYmosCisJCQkgICAgICBzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAtIGluaXRpYXRlIGR1bXBcbiIpOworfQorCitzdGF0aWMgaW50NjRfdCBkdW1wX2ZpcHNfaW5pdCh1aW50OF90IHR5cGUpCit7CisJaW50IHJjOworCisJcmMgPSBvcGFsX2R1bXBfaW5pdCh0eXBlKTsKKwlpZiAocmMpCisJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gaW5pdGlhdGUgRmlwUyBkdW1wICglZClcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgaW5pdF9kdW1wX3N0b3JlKHN0cnVjdCBkdW1wX29iaiAqZHVtcF9vYmosCisJCQkgICAgICAgc3RydWN0IGR1bXBfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJZHVtcF9maXBzX2luaXQoRFVNUF9UWVBFX0ZTUCk7CisJcHJfaW5mbygiJXM6IEluaXRpYXRlZCBGU1AgZHVtcFxuIiwgX19mdW5jX18pOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkdW1wX2F0dHJpYnV0ZSBpbml0aWF0ZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihpbml0aWF0ZV9kdW1wLCAwNjAwLCBpbml0X2R1bXBfc2hvdywgaW5pdF9kdW1wX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmluaXRpYXRlX2F0dHJzW10gPSB7CisJJmluaXRpYXRlX2F0dHJpYnV0ZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbml0aWF0ZV9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGluaXRpYXRlX2F0dHJzLAorfTsKKworc3RhdGljIHN0cnVjdCBrc2V0ICpkdW1wX2tzZXQ7CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKKwlzdHJ1Y3QgZHVtcF9vYmogKmR1bXA7CisKKwlhdHRyaWJ1dGUgPSB0b19kdW1wX2F0dHIoYXR0cik7CisJZHVtcCA9IHRvX2R1bXBfb2JqKGtvYmopOworCisJaWYgKCFhdHRyaWJ1dGUtPnNob3cpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGF0dHJpYnV0ZS0+c2hvdyhkdW1wLCBhdHRyaWJ1dGUsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgZHVtcF9hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKKwlzdHJ1Y3QgZHVtcF9vYmogKmR1bXA7CisKKwlhdHRyaWJ1dGUgPSB0b19kdW1wX2F0dHIoYXR0cik7CisJZHVtcCA9IHRvX2R1bXBfb2JqKGtvYmopOworCisJaWYgKCFhdHRyaWJ1dGUtPnN0b3JlKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhdHRyaWJ1dGUtPnN0b3JlKGR1bXAsIGF0dHJpYnV0ZSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBkdW1wX3N5c2ZzX29wcyA9IHsKKwkuc2hvdyA9IGR1bXBfYXR0cl9zaG93LAorCS5zdG9yZSA9IGR1bXBfYXR0cl9zdG9yZSwKK307CisKK3N0YXRpYyB2b2lkIGR1bXBfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgZHVtcF9vYmogKmR1bXA7CisKKwlkdW1wID0gdG9fZHVtcF9vYmooa29iaik7CisJdmZyZWUoZHVtcC0+YnVmZmVyKTsKKwlrZnJlZShkdW1wKTsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmR1bXBfZGVmYXVsdF9hdHRyc1tdID0geworCSZpZF9hdHRyaWJ1dGUuYXR0ciwKKwkmdHlwZV9hdHRyaWJ1dGUuYXR0ciwKKwkmYWNrX2F0dHJpYnV0ZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBkdW1wX2t0eXBlID0geworCS5zeXNmc19vcHMgPSAmZHVtcF9zeXNmc19vcHMsCisJLnJlbGVhc2UgPSAmZHVtcF9yZWxlYXNlLAorCS5kZWZhdWx0X2F0dHJzID0gZHVtcF9kZWZhdWx0X2F0dHJzLAorfTsKKworc3RhdGljIHZvaWQgZnJlZV9kdW1wX3NnX2xpc3Qoc3RydWN0IG9wYWxfc2dfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgb3BhbF9zZ19saXN0ICpzZzE7CisJd2hpbGUgKGxpc3QpIHsKKwkJc2cxID0gbGlzdC0+bmV4dDsKKwkJa2ZyZWUobGlzdCk7CisJCWxpc3QgPSBzZzE7CisJfQorCWxpc3QgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG9wYWxfc2dfbGlzdCAqZHVtcF9kYXRhX3RvX3NnbGlzdChzdHJ1Y3QgZHVtcF9vYmogKmR1bXApCit7CisJc3RydWN0IG9wYWxfc2dfbGlzdCAqc2cxLCAqbGlzdCA9IE5VTEw7CisJdm9pZCAqYWRkcjsKKwlpbnQ2NF90IHNpemU7CisKKwlhZGRyID0gZHVtcC0+YnVmZmVyOworCXNpemUgPSBkdW1wLT5zaXplOworCisJc2cxID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghc2cxKQorCQlnb3RvIG5vbWVtOworCisJbGlzdCA9IHNnMTsKKwlzZzEtPm51bV9lbnRyaWVzID0gMDsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJLyogVHJhbnNsYXRlIHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzICovCisJCXNnMS0+ZW50cnlbc2cxLT5udW1fZW50cmllc10uZGF0YSA9CisJCQkodm9pZCAqKSh2bWFsbG9jX3RvX3BmbihhZGRyKSA8PCBQQUdFX1NISUZUKTsKKworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXNnMS0+ZW50cnlbc2cxLT5udW1fZW50cmllc10ubGVuZ3RoID0gUEFHRV9TSVpFOworCQllbHNlCisJCQlzZzEtPmVudHJ5W3NnMS0+bnVtX2VudHJpZXNdLmxlbmd0aCA9IHNpemU7CisKKwkJc2cxLT5udW1fZW50cmllcysrOworCQlpZiAoc2cxLT5udW1fZW50cmllcyA+PSBTR19FTlRSSUVTX1BFUl9OT0RFKSB7CisJCQlzZzEtPm5leHQgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXNnMS0+bmV4dCkKKwkJCQlnb3RvIG5vbWVtOworCisJCQlzZzEgPSBzZzEtPm5leHQ7CisJCQlzZzEtPm51bV9lbnRyaWVzID0gMDsKKwkJfQorCQlhZGRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCXJldHVybiBsaXN0OworCitub21lbToKKwlwcl9lcnIoIiVzIDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIiwgX19mdW5jX18pOworCWZyZWVfZHVtcF9zZ19saXN0KGxpc3QpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzZ2xpc3RfdG9fcGh5X2FkZHIoc3RydWN0IG9wYWxfc2dfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgb3BhbF9zZ19saXN0ICpzZywgKm5leHQ7CisKKwlmb3IgKHNnID0gbGlzdDsgc2c7IHNnID0gbmV4dCkgeworCQluZXh0ID0gc2ctPm5leHQ7CisJCS8qIERvbid0IHRyYW5zbGF0ZSBOVUxMIHBvaW50ZXIgZm9yIGxhc3QgZW50cnkgKi8KKwkJaWYgKHNnLT5uZXh0KQorCQkJc2ctPm5leHQgPSAoc3RydWN0IG9wYWxfc2dfbGlzdCAqKV9fcGEoc2ctPm5leHQpOworCQllbHNlCisJCQlzZy0+bmV4dCA9IE5VTEw7CisKKwkJLyogQ29udmVydCBudW1fZW50cmllcyB0byBsZW5ndGggKi8KKwkJc2ctPm51bV9lbnRyaWVzID0KKwkJCXNnLT5udW1fZW50cmllcyAqIHNpemVvZihzdHJ1Y3Qgb3BhbF9zZ19lbnRyeSkgKyAxNjsKKwl9Cit9CisKK3N0YXRpYyBpbnQ2NF90IGR1bXBfcmVhZF9pbmZvKHVpbnQzMl90ICppZCwgdWludDMyX3QgKnNpemUsIHVpbnQzMl90ICp0eXBlKQoreworCWludCByYzsKKwkqdHlwZSA9IDB4ZmZmZmZmZmY7CisKKwlyYyA9IG9wYWxfZHVtcF9pbmZvMihpZCwgc2l6ZSwgdHlwZSk7CisKKwlpZiAocmMgPT0gT1BBTF9QQVJBTUVURVIpCisJCXJjID0gb3BhbF9kdW1wX2luZm8oaWQsIHNpemUpOworCisJaWYgKHJjKQorCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIGdldCBkdW1wIGluZm8gKCVkKVxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50NjRfdCBkdW1wX3JlYWRfZGF0YShzdHJ1Y3QgZHVtcF9vYmogKmR1bXApCit7CisJc3RydWN0IG9wYWxfc2dfbGlzdCAqbGlzdDsKKwl1aW50NjRfdCBhZGRyOworCWludDY0X3QgcmM7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKwlkdW1wLT5idWZmZXIgPSB2emFsbG9jKFBBR0VfQUxJR04oZHVtcC0+c2l6ZSkpOworCWlmICghZHVtcC0+YnVmZmVyKSB7CisJCXByX2VycigiJXMgOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogR2VuZXJhdGUgU0cgbGlzdCAqLworCWxpc3QgPSBkdW1wX2RhdGFfdG9fc2dsaXN0KGR1bXApOworCWlmICghbGlzdCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRyYW5zbGF0ZSBzZyBsaXN0IGFkZHIgdG8gcmVhbCBhZGRyZXNzICovCisJc2dsaXN0X3RvX3BoeV9hZGRyKGxpc3QpOworCisJLyogRmlyc3QgZW50cnkgYWRkcmVzcyAqLworCWFkZHIgPSBfX3BhKGxpc3QpOworCisJLyogRmV0Y2ggZGF0YSAqLworCXJjID0gT1BBTF9CVVNZX0VWRU5UOworCXdoaWxlIChyYyA9PSBPUEFMX0JVU1kgfHwgcmMgPT0gT1BBTF9CVVNZX0VWRU5UKSB7CisJCXJjID0gb3BhbF9kdW1wX3JlYWQoZHVtcC0+aWQsIGFkZHIpOworCQlpZiAocmMgPT0gT1BBTF9CVVNZX0VWRU5UKSB7CisJCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworCQkJbXNsZWVwKDIwKTsKKwkJfQorCX0KKworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MgJiYgcmMgIT0gT1BBTF9QQVJUSUFMKQorCQlwcl93YXJuKCIlczogRXh0cmFjdCBkdW1wIGZhaWxlZCBmb3IgSUQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBkdW1wLT5pZCk7CisKKwkvKiBGcmVlIFNHIGxpc3QgKi8KKwlmcmVlX2R1bXBfc2dfbGlzdChsaXN0KTsKKworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgZHVtcF9hdHRyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGVwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZmZlciwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmM7CisKKwlzdHJ1Y3QgZHVtcF9vYmogKmR1bXAgPSB0b19kdW1wX29iaihrb2JqKTsKKworCWlmICghZHVtcC0+YnVmZmVyKSB7CisJCXJjID0gZHVtcF9yZWFkX2RhdGEoZHVtcCk7CisKKwkJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUyAmJiByYyAhPSBPUEFMX1BBUlRJQUwpIHsKKwkJCXZmcmVlKGR1bXAtPmJ1ZmZlcik7CisJCQlkdW1wLT5idWZmZXIgPSBOVUxMOworCisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAocmMgPT0gT1BBTF9QQVJUSUFMKSB7CisJCQkvKiBPbiBhIHBhcnRpYWwgcmVhZCwgd2UganVzdCByZXR1cm4gRUlPCisJCQkgKiBhbmQgcmVseSBvbiB1c2Vyc3BhY2UgdG8gYXNrIHVzIHRvIHRyeQorCQkJICogYWdhaW4uCisJCQkgKi8KKwkJCXByX2luZm8oIiVzOiBQbGF0Zm9ybSBkdW1wIHBhcnRpYWxseSByZWFkLklEID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgZHVtcC0+aWQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwltZW1jcHkoYnVmZmVyLCBkdW1wLT5idWZmZXIgKyBwb3MsIGNvdW50KTsKKworCS8qIFlvdSBtYXkgdGhpbmsgd2UgY291bGQgZnJlZSB0aGUgZHVtcCBidWZmZXIgbm93IGFuZCByZXRyaWV2ZQorCSAqIGl0IGFnYWluIGxhdGVyIGlmIG5lZWRlZCwgYnV0IGR1ZSB0byBjdXJyZW50IGZpcm13YXJlIGxpbWl0YXRpb24sCisJICogdGhhdCdzIG5vdCB0aGUgY2FzZS4gU28sIG9uY2UgcmVhZCBpbnRvIHVzZXJzcGFjZSBvbmNlLAorCSAqIHdlIGtlZXAgdGhlIGR1bXAgYXJvdW5kIHVudGlsIGl0J3MgYWNrbm93bGVkZ2VkIGJ5IHVzZXJzcGFjZS4KKwkgKi8KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkdW1wX29iaiAqY3JlYXRlX2R1bXBfb2JqKHVpbnQzMl90IGlkLCBzaXplX3Qgc2l6ZSwKKwkJCQkJdWludDMyX3QgdHlwZSkKK3sKKwlzdHJ1Y3QgZHVtcF9vYmogKmR1bXA7CisJaW50IHJjOworCisJZHVtcCA9IGt6YWxsb2Moc2l6ZW9mKCpkdW1wKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkdW1wKQorCQlyZXR1cm4gTlVMTDsKKworCWR1bXAtPmtvYmoua3NldCA9IGR1bXBfa3NldDsKKworCWtvYmplY3RfaW5pdCgmZHVtcC0+a29iaiwgJmR1bXBfa3R5cGUpOworCisJc3lzZnNfYmluX2F0dHJfaW5pdCgmZHVtcC0+ZHVtcF9hdHRyKTsKKworCWR1bXAtPmR1bXBfYXR0ci5hdHRyLm5hbWUgPSAiZHVtcCI7CisJZHVtcC0+ZHVtcF9hdHRyLmF0dHIubW9kZSA9IDA0MDA7CisJZHVtcC0+ZHVtcF9hdHRyLnNpemUgPSBzaXplOworCWR1bXAtPmR1bXBfYXR0ci5yZWFkID0gZHVtcF9hdHRyX3JlYWQ7CisKKwlkdW1wLT5pZCA9IGlkOworCWR1bXAtPnNpemUgPSBzaXplOworCWR1bXAtPnR5cGUgPSB0eXBlOworCisJcmMgPSBrb2JqZWN0X2FkZCgmZHVtcC0+a29iaiwgTlVMTCwgIjB4JXgtMHgleCIsIHR5cGUsIGlkKTsKKwlpZiAocmMpIHsKKwkJa29iamVjdF9wdXQoJmR1bXAtPmtvYmopOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZHVtcC0+a29iaiwgJmR1bXAtPmR1bXBfYXR0cik7CisJaWYgKHJjKSB7CisJCWtvYmplY3RfcHV0KCZkdW1wLT5rb2JqKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJfaW5mbygiJXM6IE5ldyBwbGF0Zm9ybSBkdW1wLiBJRCA9IDB4JXggU2l6ZSAldVxuIiwKKwkJX19mdW5jX18sIGR1bXAtPmlkLCBkdW1wLT5zaXplKTsKKworCWtvYmplY3RfdWV2ZW50KCZkdW1wLT5rb2JqLCBLT0JKX0FERCk7CisKKwlyZXR1cm4gZHVtcDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2R1bXAodm9pZCkKK3sKKwlpbnQgcmM7CisJdWludDMyX3QgZHVtcF9pZCwgZHVtcF9zaXplLCBkdW1wX3R5cGU7CisJc3RydWN0IGR1bXBfb2JqICpkdW1wOworCWNoYXIgbmFtZVsyMl07CisKKwlyYyA9IGR1bXBfcmVhZF9pbmZvKCZkdW1wX2lkLCAmZHVtcF9zaXplLCAmZHVtcF90eXBlKTsKKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKQorCQlyZXR1cm4gcmM7CisKKwlzcHJpbnRmKG5hbWUsICIweCV4LTB4JXgiLCBkdW1wX3R5cGUsIGR1bXBfaWQpOworCisJLyogd2UgbWF5IGdldCBub3RpZmllZCB0d2ljZSwgbGV0J3MgaGFuZGxlCisJICogdGhhdCBncmFjZWZ1bGx5IGFuZCBub3QgY3JlYXRlIHR3byBjb25mbGljdGluZworCSAqIGVudHJpZXMuCisJICovCisJaWYgKGtzZXRfZmluZF9vYmooZHVtcF9rc2V0LCBuYW1lKSkKKwkJcmV0dXJuIDA7CisKKwlkdW1wID0gY3JlYXRlX2R1bXBfb2JqKGR1bXBfaWQsIGR1bXBfc2l6ZSwgZHVtcF90eXBlKTsKKwlpZiAoIWR1bXApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXByb2Nlc3NfZHVtcCgpOworfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKGR1bXBfd29yaywgZHVtcF93b3JrX2ZuKTsKKworc3RhdGljIHZvaWQgc2NoZWR1bGVfcHJvY2Vzc19kdW1wKHZvaWQpCit7CisJc2NoZWR1bGVfd29yaygmZHVtcF93b3JrKTsKK30KKworLyoKKyAqIE5ldyBkdW1wIGF2YWlsYWJsZSBub3RpZmljYXRpb24KKyAqCisgKiBPbmNlIHdlIGdldCBub3RpZmljYXRpb24sIHdlIGFkZCBzeXNmcyBlbnRyaWVzIGZvciBpdC4KKyAqIFdlIG9ubHkgZmV0Y2ggdGhlIGR1bXAgb24gZGVtYW5kLCBhbmQgY3JlYXRlIHN5c2ZzIGFzeW5jaHJvbm91c2x5LgorICovCitzdGF0aWMgaW50IGR1bXBfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudHMsIHZvaWQgKmNoYW5nZSkKK3sKKwlpZiAoZXZlbnRzICYgT1BBTF9FVkVOVF9EVU1QX0FWQUlMKQorCQlzY2hlZHVsZV9wcm9jZXNzX2R1bXAoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGR1bXBfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgID0gZHVtcF9ldmVudCwKKwkubmV4dCAgICAgICAgICAgPSBOVUxMLAorCS5wcmlvcml0eSAgICAgICA9IDAKK307CisKK3ZvaWQgX19pbml0IG9wYWxfcGxhdGZvcm1fZHVtcF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJZHVtcF9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiZHVtcCIsIE5VTEwsIG9wYWxfa29iaik7CisJaWYgKCFkdW1wX2tzZXQpIHsKKwkJcHJfd2FybigiJXM6IEZhaWxlZCB0byBjcmVhdGUgZHVtcCBrc2V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZHVtcF9rc2V0LT5rb2JqLCAmaW5pdGlhdGVfYXR0cl9ncm91cCk7CisJaWYgKHJjKSB7CisJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGluaXRpYXRlIGR1bXAgYXR0ciBncm91cFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJa29iamVjdF9wdXQoJmR1bXBfa3NldC0+a29iaik7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IG9wYWxfbm90aWZpZXJfcmVnaXN0ZXIoJmR1bXBfbmIpOworCWlmIChyYykgeworCQlwcl93YXJuKCIlczogQ2FuJ3QgcmVnaXN0ZXIgT1BBTCBldmVudCBub3RpZmllciAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuOworCX0KKworCW9wYWxfZHVtcF9yZXNlbmRfbm90aWZpY2F0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3MzU1YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWVsb2cuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIEVycm9yIGxvZyBzdXBwb3J0IG9uIFBvd2VyTlYuCisgKgorICogQ29weXJpZ2h0IDIwMTMsMjAxNCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorCitzdHJ1Y3QgZWxvZ19vYmogeworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgcmF3X2F0dHI7CisJdWludDY0X3QgaWQ7CisJdWludDY0X3QgdHlwZTsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICpidWZmZXI7Cit9OworI2RlZmluZSB0b19lbG9nX29iaih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGVsb2dfb2JqLCBrb2JqKQorCitzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGVsb2dfb2JqICplbG9nLCBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGVsb2dfb2JqICplbG9nLCBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworfTsKKyNkZWZpbmUgdG9fZWxvZ19hdHRyKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUsIGF0dHIpCisKK3N0YXRpYyBzc2l6ZV90IGVsb2dfaWRfc2hvdyhzdHJ1Y3QgZWxvZ19vYmogKmVsb2dfb2JqLAorCQkJICAgIHN0cnVjdCBlbG9nX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglbGx4XG4iLCBlbG9nX29iai0+aWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZWxvZ190eXBlX3RvX3N0cmluZyh1aW50NjRfdCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMDogcmV0dXJuICJQRUwiOworCWRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBlbG9nX3R5cGVfc2hvdyhzdHJ1Y3QgZWxvZ19vYmogKmVsb2dfb2JqLAorCQkJICAgICAgc3RydWN0IGVsb2dfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWxseCAlc1xuIiwKKwkJICAgICAgIGVsb2dfb2JqLT50eXBlLAorCQkgICAgICAgZWxvZ190eXBlX3RvX3N0cmluZyhlbG9nX29iai0+dHlwZSkpOworfQorCitzdGF0aWMgc3NpemVfdCBlbG9nX2Fja19zaG93KHN0cnVjdCBlbG9nX29iaiAqZWxvZ19vYmosCisJCQkgICAgIHN0cnVjdCBlbG9nX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImFjayAtIGFja25vd2xlZGdlIGxvZyBtZXNzYWdlXG4iKTsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcmVsZWFzZV9rb2JqKHZvaWQgKmtvYmopCit7CisJa29iamVjdF9wdXQoKHN0cnVjdCBrb2JqZWN0ICopa29iaik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVsb2dfYWNrX3N0b3JlKHN0cnVjdCBlbG9nX29iaiAqZWxvZ19vYmosCisJCQkgICAgICBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQpCit7CisJb3BhbF9zZW5kX2Fja19lbG9nKGVsb2dfb2JqLT5pZCk7CisJc3lzZnNfc2NoZWR1bGVfY2FsbGJhY2soJmVsb2dfb2JqLT5rb2JqLCBkZWxheV9yZWxlYXNlX2tvYmosCisJCQkJJmVsb2dfb2JqLT5rb2JqLCBUSElTX01PRFVMRSk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGVsb2dfYXR0cmlidXRlIGlkX2F0dHJpYnV0ZSA9CisJX19BVFRSKGlkLCAwNjY2LCBlbG9nX2lkX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBlbG9nX2F0dHJpYnV0ZSB0eXBlX2F0dHJpYnV0ZSA9CisJX19BVFRSKHR5cGUsIDA2NjYsIGVsb2dfdHlwZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZWxvZ19hdHRyaWJ1dGUgYWNrX2F0dHJpYnV0ZSA9CisJX19BVFRSKGFja25vd2xlZGdlLCAwNjYwLCBlbG9nX2Fja19zaG93LCBlbG9nX2Fja19zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3Qga3NldCAqZWxvZ19rc2V0OworCitzdGF0aWMgc3NpemVfdCBlbG9nX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGVsb2dfYXR0cmlidXRlICphdHRyaWJ1dGU7CisJc3RydWN0IGVsb2dfb2JqICplbG9nOworCisJYXR0cmlidXRlID0gdG9fZWxvZ19hdHRyKGF0dHIpOworCWVsb2cgPSB0b19lbG9nX29iaihrb2JqKTsKKworCWlmICghYXR0cmlidXRlLT5zaG93KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhdHRyaWJ1dGUtPnNob3coZWxvZywgYXR0cmlidXRlLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBlbG9nX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGVsb2dfYXR0cmlidXRlICphdHRyaWJ1dGU7CisJc3RydWN0IGVsb2dfb2JqICplbG9nOworCisJYXR0cmlidXRlID0gdG9fZWxvZ19hdHRyKGF0dHIpOworCWVsb2cgPSB0b19lbG9nX29iaihrb2JqKTsKKworCWlmICghYXR0cmlidXRlLT5zdG9yZSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYXR0cmlidXRlLT5zdG9yZShlbG9nLCBhdHRyaWJ1dGUsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgZWxvZ19zeXNmc19vcHMgPSB7CisJLnNob3cgPSBlbG9nX2F0dHJfc2hvdywKKwkuc3RvcmUgPSBlbG9nX2F0dHJfc3RvcmUsCit9OworCitzdGF0aWMgdm9pZCBlbG9nX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGVsb2dfb2JqICplbG9nOworCisJZWxvZyA9IHRvX2Vsb2dfb2JqKGtvYmopOworCWtmcmVlKGVsb2ctPmJ1ZmZlcik7CisJa2ZyZWUoZWxvZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICplbG9nX2RlZmF1bHRfYXR0cnNbXSA9IHsKKwkmaWRfYXR0cmlidXRlLmF0dHIsCisJJnR5cGVfYXR0cmlidXRlLmF0dHIsCisJJmFja19hdHRyaWJ1dGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZWxvZ19rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJmVsb2dfc3lzZnNfb3BzLAorCS5yZWxlYXNlID0gJmVsb2dfcmVsZWFzZSwKKwkuZGVmYXVsdF9hdHRycyA9IGVsb2dfZGVmYXVsdF9hdHRycywKK307CisKKy8qIE1heGltdW0gc2l6ZSBvZiBhIHNpbmdsZSBsb2cgb24gRlNQIGlzIDE2S0IgKi8KKyNkZWZpbmUgT1BBTF9NQVhfRVJSTE9HX1NJWkUJMTYzODQKKworc3RhdGljIHNzaXplX3QgcmF3X2F0dHJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZmZlciwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoreworCWludCBvcGFsX3JjOworCisJc3RydWN0IGVsb2dfb2JqICplbG9nID0gdG9fZWxvZ19vYmooa29iaik7CisKKwkvKiBXZSBtYXkgaGF2ZSBoYWQgYW4gZXJyb3IgcmVhZGluZyBiZWZvcmUsIHNvIGxldCdzIHJldHJ5ICovCisJaWYgKCFlbG9nLT5idWZmZXIpIHsKKwkJZWxvZy0+YnVmZmVyID0ga3phbGxvYyhlbG9nLT5zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlbG9nLT5idWZmZXIpCisJCQlyZXR1cm4gLUVJTzsKKworCQlvcGFsX3JjID0gb3BhbF9yZWFkX2Vsb2coX19wYShlbG9nLT5idWZmZXIpLAorCQkJCQkgZWxvZy0+c2l6ZSwgZWxvZy0+aWQpOworCQlpZiAob3BhbF9yYyAhPSBPUEFMX1NVQ0NFU1MpIHsKKwkJCXByX2VycigiRUxPRzogbG9nIHJlYWQgZmFpbGVkIGZvciBsb2ctaWQ9JWxseFxuIiwKKwkJCSAgICAgICBlbG9nLT5pZCk7CisJCQlrZnJlZShlbG9nLT5idWZmZXIpOworCQkJZWxvZy0+YnVmZmVyID0gTlVMTDsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJbWVtY3B5KGJ1ZmZlciwgZWxvZy0+YnVmZmVyICsgcG9zLCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWxvZ19vYmogKmNyZWF0ZV9lbG9nX29iaih1aW50NjRfdCBpZCwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHR5cGUpCit7CisJc3RydWN0IGVsb2dfb2JqICplbG9nOworCWludCByYzsKKworCWVsb2cgPSBremFsbG9jKHNpemVvZigqZWxvZyksIEdGUF9LRVJORUwpOworCWlmICghZWxvZykKKwkJcmV0dXJuIE5VTEw7CisKKwllbG9nLT5rb2JqLmtzZXQgPSBlbG9nX2tzZXQ7CisKKwlrb2JqZWN0X2luaXQoJmVsb2ctPmtvYmosICZlbG9nX2t0eXBlKTsKKworCXN5c2ZzX2Jpbl9hdHRyX2luaXQoJmVsb2ctPnJhd19hdHRyKTsKKworCWVsb2ctPnJhd19hdHRyLmF0dHIubmFtZSA9ICJyYXciOworCWVsb2ctPnJhd19hdHRyLmF0dHIubW9kZSA9IDA0MDA7CisJZWxvZy0+cmF3X2F0dHIuc2l6ZSA9IHNpemU7CisJZWxvZy0+cmF3X2F0dHIucmVhZCA9IHJhd19hdHRyX3JlYWQ7CisKKwllbG9nLT5pZCA9IGlkOworCWVsb2ctPnNpemUgPSBzaXplOworCWVsb2ctPnR5cGUgPSB0eXBlOworCisJZWxvZy0+YnVmZmVyID0ga3phbGxvYyhlbG9nLT5zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChlbG9nLT5idWZmZXIpIHsKKwkJcmMgPSBvcGFsX3JlYWRfZWxvZyhfX3BhKGVsb2ctPmJ1ZmZlciksCisJCQkJCSBlbG9nLT5zaXplLCBlbG9nLT5pZCk7CisJCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpIHsKKwkJCXByX2VycigiRUxPRzogbG9nIHJlYWQgZmFpbGVkIGZvciBsb2ctaWQ9JWxseFxuIiwKKwkJCSAgICAgICBlbG9nLT5pZCk7CisJCQlrZnJlZShlbG9nLT5idWZmZXIpOworCQkJZWxvZy0+YnVmZmVyID0gTlVMTDsKKwkJfQorCX0KKworCXJjID0ga29iamVjdF9hZGQoJmVsb2ctPmtvYmosIE5VTEwsICIweCVsbHgiLCBpZCk7CisJaWYgKHJjKSB7CisJCWtvYmplY3RfcHV0KCZlbG9nLT5rb2JqKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmMgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmVsb2ctPmtvYmosICZlbG9nLT5yYXdfYXR0cik7CisJaWYgKHJjKSB7CisJCWtvYmplY3RfcHV0KCZlbG9nLT5rb2JqKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJa29iamVjdF91ZXZlbnQoJmVsb2ctPmtvYmosIEtPQkpfQUREKTsKKworCXJldHVybiBlbG9nOworfQorCitzdGF0aWMgdm9pZCBlbG9nX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXNpemVfdCBlbG9nX3NpemU7CisJdWludDY0X3QgbG9nX2lkOworCXVpbnQ2NF90IGVsb2dfdHlwZTsKKwlpbnQgcmM7CisJY2hhciBuYW1lWzIrMTYrMV07CisKKwlyYyA9IG9wYWxfZ2V0X2Vsb2dfc2l6ZSgmbG9nX2lkLCAmZWxvZ19zaXplLCAmZWxvZ190eXBlKTsKKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKSB7CisJCXByX2VycigiRUxPRzogT3BhbCBsb2cgcmVhZCBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJQlVHX09OKGVsb2dfc2l6ZSA+IE9QQUxfTUFYX0VSUkxPR19TSVpFKTsKKworCWlmIChlbG9nX3NpemUgPj0gT1BBTF9NQVhfRVJSTE9HX1NJWkUpCisJCWVsb2dfc2l6ZSAgPSAgT1BBTF9NQVhfRVJSTE9HX1NJWkU7CisKKwlzcHJpbnRmKG5hbWUsICIweCVsbHgiLCBsb2dfaWQpOworCisJLyogd2UgbWF5IGdldCBub3RpZmllZCB0d2ljZSwgbGV0J3MgaGFuZGxlCisJICogdGhhdCBncmFjZWZ1bGx5IGFuZCBub3QgY3JlYXRlIHR3byBjb25mbGljdGluZworCSAqIGVudHJpZXMuCisJICovCisJaWYgKGtzZXRfZmluZF9vYmooZWxvZ19rc2V0LCBuYW1lKSkKKwkJcmV0dXJuOworCisJY3JlYXRlX2Vsb2dfb2JqKGxvZ19pZCwgZWxvZ19zaXplLCBlbG9nX3R5cGUpOworfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKGVsb2dfd29yaywgZWxvZ193b3JrX2ZuKTsKKworc3RhdGljIGludCBlbG9nX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJdW5zaWduZWQgbG9uZyBldmVudHMsIHZvaWQgKmNoYW5nZSkKK3sKKwkvKiBjaGVjayBmb3IgZXJyb3IgbG9nIGV2ZW50ICovCisJaWYgKGV2ZW50cyAmIE9QQUxfRVZFTlRfRVJST1JfTE9HX0FWQUlMKQorCQlzY2hlZHVsZV93b3JrKCZlbG9nX3dvcmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGVsb2dfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgID0gZWxvZ19ldmVudCwKKwkubmV4dCAgICAgICAgICAgPSBOVUxMLAorCS5wcmlvcml0eSAgICAgICA9IDAKK307CisKK2ludCBfX2luaXQgb3BhbF9lbG9nX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAwOworCisJZWxvZ19rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiZWxvZyIsIE5VTEwsIG9wYWxfa29iaik7CisJaWYgKCFlbG9nX2tzZXQpIHsKKwkJcHJfd2FybigiJXM6IGZhaWxlZCB0byBjcmVhdGUgZWxvZyBrc2V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyYyA9IG9wYWxfbm90aWZpZXJfcmVnaXN0ZXIoJmVsb2dfbmIpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBDYW4ndCByZWdpc3RlciBPUEFMIGV2ZW50IG5vdGlmaWVyICglZClcbiIsCisJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBXZSBhcmUgbm93IHJlYWR5IHRvIHB1bGwgZXJyb3IgbG9ncyBmcm9tIG9wYWwuICovCisJb3BhbF9yZXNlbmRfcGVuZGluZ19sb2dzKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXNlbnNvci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtc2Vuc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzY2M5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXNlbnNvci5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBQb3dlck5WIHNlbnNvciBjb2RlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIElCTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKK3N0YXRpYyBERUZJTkVfTVVURVgob3BhbF9zZW5zb3JfbXV0ZXgpOworCisvKgorICogVGhpcyB3aWxsIHJldHVybiBzZW5zb3IgaW5mb3JtYXRpb24gdG8gZHJpdmVyIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgc2Vuc29yCisgKiBoYW5kbGUuIEEgaGFuZGxlIGlzIGFuIG9wYXF1ZSBpZCBmb3IgdGhlIHBvd2VybnYsIHJlYWQgYnkgdGhlIGRyaXZlciBmcm9tIHRoZQorICogZGV2aWNlIHRyZWUuLgorICovCitpbnQgb3BhbF9nZXRfc2Vuc29yX2RhdGEodTMyIHNlbnNvcl9obmRsLCB1MzIgKnNlbnNvcl9kYXRhKQoreworCWludCByZXQsIHRva2VuOworCXN0cnVjdCBvcGFsX21zZyBtc2c7CisKKwl0b2tlbiA9IG9wYWxfYXN5bmNfZ2V0X3Rva2VuX2ludGVycnVwdGlibGUoKTsKKwlpZiAodG9rZW4gPCAwKSB7CisJCXByX2VycigiJXM6IENvdWxkbid0IGdldCB0aGUgdG9rZW4sIHJldHVybmluZ1xuIiwgX19mdW5jX18pOworCQlyZXQgPSB0b2tlbjsKKwkJZ290byBvdXQ7CisJfQorCisJbXV0ZXhfbG9jaygmb3BhbF9zZW5zb3JfbXV0ZXgpOworCXJldCA9IG9wYWxfc2Vuc29yX3JlYWQoc2Vuc29yX2huZGwsIHRva2VuLCBzZW5zb3JfZGF0YSk7CisJaWYgKHJldCAhPSBPUEFMX0FTWU5DX0NPTVBMRVRJT04pCisJCWdvdG8gb3V0X3Rva2VuOworCisJcmV0ID0gb3BhbF9hc3luY193YWl0X3Jlc3BvbnNlKHRva2VuLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byB3YWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UsICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIG91dF90b2tlbjsKKwl9CisKKwlyZXQgPSBtc2cucGFyYW1zWzFdOworCitvdXRfdG9rZW46CisJbXV0ZXhfdW5sb2NrKCZvcGFsX3NlbnNvcl9tdXRleCk7CisJb3BhbF9hc3luY19yZWxlYXNlX3Rva2VuKHRva2VuKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob3BhbF9nZXRfc2Vuc29yX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtc3lzcGFyYW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXN5c3BhcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXN5c3BhcmFtLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBQb3dlck5WIHN5c3RlbSBwYXJhbWV0ZXIgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBJQk0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorCisjZGVmaW5lIE1BWF9QQVJBTV9EQVRBX0xFTgk2NAorCitzdGF0aWMgREVGSU5FX01VVEVYKG9wYWxfc3lzcGFyYW1fbXV0ZXgpOworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpzeXNwYXJhbV9rb2JqOworc3RhdGljIHZvaWQgKnBhcmFtX2RhdGFfYnVmOworCitzdHJ1Y3QgcGFyYW1fYXR0ciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBwYXJhbV9pZDsKKwl1MzIgcGFyYW1fc2l6ZTsKKwlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUga29ial9hdHRyOworfTsKKworc3RhdGljIGludCBvcGFsX2dldF9zeXNfcGFyYW0odTMyIHBhcmFtX2lkLCB1MzIgbGVuZ3RoLCB2b2lkICpidWZmZXIpCit7CisJc3RydWN0IG9wYWxfbXNnIG1zZzsKKwlpbnQgcmV0LCB0b2tlbjsKKworCXRva2VuID0gb3BhbF9hc3luY19nZXRfdG9rZW5faW50ZXJydXB0aWJsZSgpOworCWlmICh0b2tlbiA8IDApIHsKKwkJaWYgKHRva2VuICE9IC1FUkVTVEFSVFNZUykKKwkJCXByX2VycigiJXM6IENvdWxkbid0IGdldCB0aGUgdG9rZW4sIHJldHVybmluZ1xuIiwKKwkJCQkJX19mdW5jX18pOworCQlyZXQgPSB0b2tlbjsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb3BhbF9nZXRfcGFyYW0odG9rZW4sIHBhcmFtX2lkLCAodTY0KWJ1ZmZlciwgbGVuZ3RoKTsKKwlpZiAocmV0ICE9IE9QQUxfQVNZTkNfQ09NUExFVElPTikKKwkJZ290byBvdXRfdG9rZW47CisKKwlyZXQgPSBvcGFsX2FzeW5jX3dhaXRfcmVzcG9uc2UodG9rZW4sICZtc2cpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHdhaXQgZm9yIHRoZSBhc3luYyByZXNwb25zZSwgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gb3V0X3Rva2VuOworCX0KKworCXJldCA9IG1zZy5wYXJhbXNbMV07CisKK291dF90b2tlbjoKKwlvcGFsX2FzeW5jX3JlbGVhc2VfdG9rZW4odG9rZW4pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3BhbF9zZXRfc3lzX3BhcmFtKHUzMiBwYXJhbV9pZCwgdTMyIGxlbmd0aCwgdm9pZCAqYnVmZmVyKQoreworCXN0cnVjdCBvcGFsX21zZyBtc2c7CisJaW50IHJldCwgdG9rZW47CisKKwl0b2tlbiA9IG9wYWxfYXN5bmNfZ2V0X3Rva2VuX2ludGVycnVwdGlibGUoKTsKKwlpZiAodG9rZW4gPCAwKSB7CisJCWlmICh0b2tlbiAhPSAtRVJFU1RBUlRTWVMpCisJCQlwcl9lcnIoIiVzOiBDb3VsZG4ndCBnZXQgdGhlIHRva2VuLCByZXR1cm5pbmdcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gdG9rZW47CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9wYWxfc2V0X3BhcmFtKHRva2VuLCBwYXJhbV9pZCwgKHU2NClidWZmZXIsIGxlbmd0aCk7CisKKwlpZiAocmV0ICE9IE9QQUxfQVNZTkNfQ09NUExFVElPTikKKwkJZ290byBvdXRfdG9rZW47CisKKwlyZXQgPSBvcGFsX2FzeW5jX3dhaXRfcmVzcG9uc2UodG9rZW4sICZtc2cpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHdhaXQgZm9yIHRoZSBhc3luYyByZXNwb25zZSwgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gb3V0X3Rva2VuOworCX0KKworCXJldCA9IG1zZy5wYXJhbXNbMV07CisKK291dF90b2tlbjoKKwlvcGFsX2FzeW5jX3JlbGVhc2VfdG9rZW4odG9rZW4pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN5c19wYXJhbV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmtvYmpfYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwYXJhbV9hdHRyICphdHRyID0gY29udGFpbmVyX29mKGtvYmpfYXR0ciwgc3RydWN0IHBhcmFtX2F0dHIsCisJCQlrb2JqX2F0dHIpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZvcGFsX3N5c3BhcmFtX211dGV4KTsKKwlyZXQgPSBvcGFsX2dldF9zeXNfcGFyYW0oYXR0ci0+cGFyYW1faWQsIGF0dHItPnBhcmFtX3NpemUsCisJCQlwYXJhbV9kYXRhX2J1Zik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwltZW1jcHkoYnVmLCBwYXJhbV9kYXRhX2J1ZiwgYXR0ci0+cGFyYW1fc2l6ZSk7CisKK291dDoKKwltdXRleF91bmxvY2soJm9wYWxfc3lzcGFyYW1fbXV0ZXgpOworCXJldHVybiByZXQgPyByZXQgOiBhdHRyLT5wYXJhbV9zaXplOworfQorCitzdGF0aWMgc3NpemVfdCBzeXNfcGFyYW1fc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqa29ial9hdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGFyYW1fYXR0ciAqYXR0ciA9IGNvbnRhaW5lcl9vZihrb2JqX2F0dHIsIHN0cnVjdCBwYXJhbV9hdHRyLAorCQkJa29ial9hdHRyKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmb3BhbF9zeXNwYXJhbV9tdXRleCk7CisJbWVtY3B5KHBhcmFtX2RhdGFfYnVmLCBidWYsIGNvdW50KTsKKwlyZXQgPSBvcGFsX3NldF9zeXNfcGFyYW0oYXR0ci0+cGFyYW1faWQsIGF0dHItPnBhcmFtX3NpemUsCisJCQlwYXJhbV9kYXRhX2J1Zik7CisJbXV0ZXhfdW5sb2NrKCZvcGFsX3N5c3BhcmFtX211dGV4KTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7Cit9CisKK3ZvaWQgX19pbml0IG9wYWxfc3lzX3BhcmFtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnN5c3BhcmFtOworCXN0cnVjdCBwYXJhbV9hdHRyICphdHRyOworCXUzMiAqaWQsICpzaXplOworCWludCBjb3VudCwgaTsKKwl1OCAqcGVybTsKKworCWlmICghb3BhbF9rb2JqKSB7CisJCXByX3dhcm4oIlNZU1BBUkFNOiBvcGFsIGtvYmplY3QgaXMgbm90IGF2YWlsYWJsZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXN5c3BhcmFtX2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJzeXNwYXJhbXMiLCBvcGFsX2tvYmopOworCWlmICghc3lzcGFyYW1fa29iaikgeworCQlwcl9lcnIoIlNZU1BBUkFNOiBGYWlsZWQgdG8gY3JlYXRlIHN5c3BhcmFtIGtvYmplY3RcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBiaWcgZW5vdWdoIGJ1ZmZlciBmb3IgYW55IGdldC9zZXQgdHJhbnNhY3Rpb25zICovCisJcGFyYW1fZGF0YV9idWYgPSBremFsbG9jKE1BWF9QQVJBTV9EQVRBX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbV9kYXRhX2J1ZikgeworCQlwcl9lcnIoIlNZU1BBUkFNOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwYXJhbSBkYXRhICIKKwkJCQkiYnVmXG4iKTsKKwkJZ290byBvdXRfa29ial9wdXQ7CisJfQorCisJc3lzcGFyYW0gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFsL3N5c3BhcmFtcyIpOworCWlmICghc3lzcGFyYW0pIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogT3BhbCBzeXNwYXJhbSBub2RlIG5vdCBmb3VuZFxuIik7CisJCWdvdG8gb3V0X3BhcmFtX2J1ZjsKKwl9CisKKwlpZiAoIW9mX2RldmljZV9pc19jb21wYXRpYmxlKHN5c3BhcmFtLCAiaWJtLG9wYWwtc3lzcGFyYW1zIikpIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogT3BhbCBzeXNwYXJhbSBub2RlIG5vdCBjb21wYXRpYmxlXG4iKTsKKwkJZ290byBvdXRfbm9kZV9wdXQ7CisJfQorCisJLyogTnVtYmVyIG9mIHBhcmFtZXRlcnMgZXhwb3NlZCB0aHJvdWdoIERUICovCisJY291bnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHN5c3BhcmFtLCAicGFyYW0tbmFtZSIpOworCWlmIChjb3VudCA8IDApIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogTm8gc3RyaW5nIGZvdW5kIG9mIHByb3BlcnR5IHBhcmFtLW5hbWUgaW4gIgorCQkJCSJ0aGUgbm9kZSAlc1xuIiwgc3lzcGFyYW0tPm5hbWUpOworCQlnb3RvIG91dF9ub2RlX3B1dDsKKwl9CisKKwlpZCA9IGt6YWxsb2Moc2l6ZW9mKCppZCkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZCkgeworCQlwcl9lcnIoIlNZU1BBUkFNOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHJlYWQgcGFyYW1ldGVyICIKKwkJCQkiaWRcbiIpOworCQlnb3RvIG91dF9ub2RlX3B1dDsKKwl9CisKKwlzaXplID0ga3phbGxvYyhzaXplb2YoKnNpemUpICogY291bnQsIEdGUF9LRVJORUwpOworCWlmICghc2l6ZSkgeworCQlwcl9lcnIoIlNZU1BBUkFNOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHJlYWQgcGFyYW1ldGVyICIKKwkJCQkic2l6ZVxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaWQ7CisJfQorCisJcGVybSA9IGt6YWxsb2Moc2l6ZW9mKCpwZXJtKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBlcm0pIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSB0byByZWFkIHN1cHBvcnRlZCAiCisJCQkJImFjdGlvbiBvbiB0aGUgcGFyYW1ldGVyIik7CisJCWdvdG8gb3V0X2ZyZWVfc2l6ZTsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoc3lzcGFyYW0sICJwYXJhbS1pZCIsIGlkLCBjb3VudCkpIHsKKwkJcHJfZXJyKCJTWVNQQVJBTTogTWlzc2luZyBwcm9wZXJ0eSBwYXJhbS1pZCBpbiB0aGUgRFRcbiIpOworCQlnb3RvIG91dF9mcmVlX3Blcm07CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHN5c3BhcmFtLCAicGFyYW0tbGVuIiwgc2l6ZSwgY291bnQpKSB7CisJCXByX2VycigiU1lTUEFSQU06IE1pc3NpbmcgcHJvcGVyeSBwYXJhbS1sZW4gaW4gdGhlIERUXG4iKTsKKwkJZ290byBvdXRfZnJlZV9wZXJtOworCX0KKworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkoc3lzcGFyYW0sICJwYXJhbS1wZXJtIiwgcGVybSwgY291bnQpKSB7CisJCXByX2VycigiU1lTUEFSQU06IE1pc3NpbmcgcHJvcGVyeSBwYXJhbS1wZXJtIGluIHRoZSBEVFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfcGVybTsKKwl9CisKKwlhdHRyID0ga3phbGxvYyhzaXplb2YoKmF0dHIpICogY291bnQsIEdGUF9LRVJORUwpOworCWlmICghYXR0cikgeworCQlwcl9lcnIoIlNZU1BBUkFNOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwYXJhbWV0ZXIgIgorCQkJCSJhdHRyaWJ1dGVzXG4iKTsKKwkJZ290byBvdXRfZnJlZV9wZXJtOworCX0KKworCS8qIEZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXJzLCBwb3B1bGF0ZSB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlzeXNmc19hdHRyX2luaXQoJmF0dHJbaV0ua29ial9hdHRyLmF0dHIpOworCQlhdHRyW2ldLnBhcmFtX2lkID0gaWRbaV07CisJCWF0dHJbaV0ucGFyYW1fc2l6ZSA9IHNpemVbaV07CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChzeXNwYXJhbSwgInBhcmFtLW5hbWUiLCBpLAorCQkJCSZhdHRyW2ldLmtvYmpfYXR0ci5hdHRyLm5hbWUpKQorCQkJY29udGludWU7CisKKwkJLyogSWYgdGhlIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgb3IgcmVhZC13cml0ZSAqLworCQlzd2l0Y2ggKHBlcm1baV0gJiAzKSB7CisJCWNhc2UgT1BBTF9TWVNQQVJBTV9SRUFEOgorCQkJYXR0cltpXS5rb2JqX2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwkJCWJyZWFrOworCQljYXNlIE9QQUxfU1lTUEFSQU1fV1JJVEU6CisJCQlhdHRyW2ldLmtvYmpfYXR0ci5hdHRyLm1vZGUgPSBTX0lXVUdPOworCQkJYnJlYWs7CisJCWNhc2UgT1BBTF9TWVNQQVJBTV9SVzoKKwkJCWF0dHJbaV0ua29ial9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR08gfCBTX0lXVUdPOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWF0dHJbaV0ua29ial9hdHRyLnNob3cgPSBzeXNfcGFyYW1fc2hvdzsKKwkJYXR0cltpXS5rb2JqX2F0dHIuc3RvcmUgPSBzeXNfcGFyYW1fc3RvcmU7CisKKwkJaWYgKHN5c2ZzX2NyZWF0ZV9maWxlKHN5c3BhcmFtX2tvYmosICZhdHRyW2ldLmtvYmpfYXR0ci5hdHRyKSkgeworCQkJcHJfZXJyKCJTWVNQQVJBTTogRmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlICVzXG4iLAorCQkJCQlhdHRyW2ldLmtvYmpfYXR0ci5hdHRyLm5hbWUpOworCQkJZ290byBvdXRfZnJlZV9hdHRyOworCQl9CisJfQorCisJa2ZyZWUocGVybSk7CisJa2ZyZWUoc2l6ZSk7CisJa2ZyZWUoaWQpOworCW9mX25vZGVfcHV0KHN5c3BhcmFtKTsKKwlyZXR1cm47CisKK291dF9mcmVlX2F0dHI6CisJa2ZyZWUoYXR0cik7CitvdXRfZnJlZV9wZXJtOgorCWtmcmVlKHBlcm0pOworb3V0X2ZyZWVfc2l6ZToKKwlrZnJlZShzaXplKTsKK291dF9mcmVlX2lkOgorCWtmcmVlKGlkKTsKK291dF9ub2RlX3B1dDoKKwlvZl9ub2RlX3B1dChzeXNwYXJhbSk7CitvdXRfcGFyYW1fYnVmOgorCWtmcmVlKHBhcmFtX2RhdGFfYnVmKTsKK291dF9rb2JqX3B1dDoKKwlrb2JqZWN0X3B1dChzeXNwYXJhbV9rb2JqKTsKK291dDoKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUwppbmRleCAzZTg4MjljLi5iYjkwZjlhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKQEAgLTEyMyw5ICsxMjMsMjQgQEAKIE9QQUxfQ0FMTChvcGFsX2xwY19yZWFkLAkJCU9QQUxfTFBDX1JFQUQpOwogT1BBTF9DQUxMKG9wYWxfbHBjX3dyaXRlLAkJCU9QQUxfTFBDX1dSSVRFKTsKIE9QQUxfQ0FMTChvcGFsX3JldHVybl9jcHUsCQkJT1BBTF9SRVRVUk5fQ1BVKTsKK09QQUxfQ0FMTChvcGFsX3JlYWRfZWxvZywJCQlPUEFMX0VMT0dfUkVBRCk7CitPUEFMX0NBTEwob3BhbF9zZW5kX2Fja19lbG9nLAkJCU9QQUxfRUxPR19BQ0spOworT1BBTF9DQUxMKG9wYWxfZ2V0X2Vsb2dfc2l6ZSwJCQlPUEFMX0VMT0dfU0laRSk7CitPUEFMX0NBTEwob3BhbF9yZXNlbmRfcGVuZGluZ19sb2dzLAkJT1BBTF9FTE9HX1JFU0VORCk7CitPUEFMX0NBTEwob3BhbF93cml0ZV9lbG9nLAkJCU9QQUxfRUxPR19XUklURSk7CiBPUEFMX0NBTEwob3BhbF92YWxpZGF0ZV9mbGFzaCwJCQlPUEFMX0ZMQVNIX1ZBTElEQVRFKTsKIE9QQUxfQ0FMTChvcGFsX21hbmFnZV9mbGFzaCwJCQlPUEFMX0ZMQVNIX01BTkFHRSk7CiBPUEFMX0NBTEwob3BhbF91cGRhdGVfZmxhc2gsCQkJT1BBTF9GTEFTSF9VUERBVEUpOworT1BBTF9DQUxMKG9wYWxfcmVzeW5jX3RpbWViYXNlLAkJCU9QQUxfUkVTWU5DX1RJTUVCQVNFKTsKK09QQUxfQ0FMTChvcGFsX2R1bXBfaW5pdCwJCQlPUEFMX0RVTVBfSU5JVCk7CitPUEFMX0NBTEwob3BhbF9kdW1wX2luZm8sCQkJT1BBTF9EVU1QX0lORk8pOworT1BBTF9DQUxMKG9wYWxfZHVtcF9pbmZvMiwJCQlPUEFMX0RVTVBfSU5GTzIpOworT1BBTF9DQUxMKG9wYWxfZHVtcF9yZWFkLAkJCU9QQUxfRFVNUF9SRUFEKTsKK09QQUxfQ0FMTChvcGFsX2R1bXBfYWNrLAkJCU9QQUxfRFVNUF9BQ0spOwogT1BBTF9DQUxMKG9wYWxfZ2V0X21zZywJCQkJT1BBTF9HRVRfTVNHKTsKIE9QQUxfQ0FMTChvcGFsX2NoZWNrX2NvbXBsZXRpb24sCQlPUEFMX0NIRUNLX0FTWU5DX0NPTVBMRVRJT04pOworT1BBTF9DQUxMKG9wYWxfZHVtcF9yZXNlbmRfbm90aWZpY2F0aW9uLAlPUEFMX0RVTVBfUkVTRU5EKTsKIE9QQUxfQ0FMTChvcGFsX3N5bmNfaG9zdF9yZWJvb3QsCQlPUEFMX1NZTkNfSE9TVF9SRUJPT1QpOworT1BBTF9DQUxMKG9wYWxfc2Vuc29yX3JlYWQsCQkJT1BBTF9TRU5TT1JfUkVBRCk7CitPUEFMX0NBTEwob3BhbF9nZXRfcGFyYW0sCQkJT1BBTF9HRVRfUEFSQU0pOworT1BBTF9DQUxMKG9wYWxfc2V0X3BhcmFtLAkJCU9QQUxfU0VUX1BBUkFNKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC5jCmluZGV4IDY1NDk5YWQuLmU5MmYyZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxhc20vb3BhbC5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KQEAgLTMzLDggKzM0LDE4IEBACiBzdHJ1Y3Qgb3BhbCB7CiAJdTY0IGJhc2U7CiAJdTY0IGVudHJ5OworCXU2NCBzaXplOwogfSBvcGFsOwogCitzdHJ1Y3QgbWNoZWNrX3JlY292ZXJhYmxlX3JhbmdlIHsKKwl1NjQgc3RhcnRfYWRkcjsKKwl1NjQgZW5kX2FkZHI7CisJdTY0IHJlY292ZXJfYWRkcjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWNoZWNrX3JlY292ZXJhYmxlX3JhbmdlICptY19yZWNvdmVyYWJsZV9yYW5nZTsKK3N0YXRpYyBpbnQgbWNfcmVjb3ZlcmFibGVfcmFuZ2VfbGVuOworCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpvcGFsX25vZGU7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG9wYWxfd3JpdGVfbG9jayk7CiBleHRlcm4gdTY0IG9wYWxfbWNfc2Vjb25kYXJ5X2hhbmRsZXJbXTsKQEAgLTQ5LDI1ICs2MCwyOSBAQAogaW50IF9faW5pdCBlYXJseV9pbml0X2R0X3NjYW5fb3BhbCh1bnNpZ25lZCBsb25nIG5vZGUsCiAJCQkJICAgY29uc3QgY2hhciAqdW5hbWUsIGludCBkZXB0aCwgdm9pZCAqZGF0YSkKIHsKLQljb25zdCB2b2lkICpiYXNlcCwgKmVudHJ5cDsKLQl1bnNpZ25lZCBsb25nIGJhc2VzeiwgZW50cnlzejsKKwljb25zdCB2b2lkICpiYXNlcCwgKmVudHJ5cCwgKnNpemVwOworCXVuc2lnbmVkIGxvbmcgYmFzZXN6LCBlbnRyeXN6LCBydW50aW1lc3o7CiAKIAlpZiAoZGVwdGggIT0gMSB8fCBzdHJjbXAodW5hbWUsICJpYm0sb3BhbCIpICE9IDApCiAJCXJldHVybiAwOwogCiAJYmFzZXAgID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAib3BhbC1iYXNlLWFkZHJlc3MiLCAmYmFzZXN6KTsKIAllbnRyeXAgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJvcGFsLWVudHJ5LWFkZHJlc3MiLCAmZW50cnlzeik7CisJc2l6ZXAgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJvcGFsLXJ1bnRpbWUtc2l6ZSIsICZydW50aW1lc3opOwogCi0JaWYgKCFiYXNlcCB8fCAhZW50cnlwKQorCWlmICghYmFzZXAgfHwgIWVudHJ5cCB8fCAhc2l6ZXApCiAJCXJldHVybiAxOwogCiAJb3BhbC5iYXNlID0gb2ZfcmVhZF9udW1iZXIoYmFzZXAsIGJhc2Vzei80KTsKIAlvcGFsLmVudHJ5ID0gb2ZfcmVhZF9udW1iZXIoZW50cnlwLCBlbnRyeXN6LzQpOworCW9wYWwuc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKHNpemVwLCBydW50aW1lc3ovNCk7CiAKIAlwcl9kZWJ1ZygiT1BBTCBCYXNlICA9IDB4JWxseCAoYmFzZXA9JXAgYmFzZXN6PSVsZClcbiIsCiAJCSBvcGFsLmJhc2UsIGJhc2VwLCBiYXNlc3opOwogCXByX2RlYnVnKCJPUEFMIEVudHJ5ID0gMHglbGx4IChlbnRyeXA9JXAgYmFzZXN6PSVsZClcbiIsCiAJCSBvcGFsLmVudHJ5LCBlbnRyeXAsIGVudHJ5c3opOworCXByX2RlYnVnKCJPUEFMIEVudHJ5ID0gMHglbGx4IChzaXplcD0lcCBydW50aW1lc3o9JWxkKVxuIiwKKwkJIG9wYWwuc2l6ZSwgc2l6ZXAsIHJ1bnRpbWVzeik7CiAKIAlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfT1BBTDsKIAlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsICJpYm0sb3BhbC12MyIpKSB7CkBAIC04NCw2ICs5OSw1MyBAQAogCXJldHVybiAxOwogfQogCitpbnQgX19pbml0IGVhcmx5X2luaXRfZHRfc2Nhbl9yZWNvdmVyYWJsZV9yYW5nZXModW5zaWduZWQgbG9uZyBub2RlLAorCQkJCSAgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBpLCBzaXplOworCWNvbnN0IF9fYmUzMiAqcHJvcDsKKworCWlmIChkZXB0aCAhPSAxIHx8IHN0cmNtcCh1bmFtZSwgImlibSxvcGFsIikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcm9wID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAibWNoZWNrLXJlY292ZXJhYmxlLXJhbmdlcyIsICZzaXplKTsKKworCWlmICghcHJvcCkKKwkJcmV0dXJuIDE7CisKKwlwcl9kZWJ1ZygiRm91bmQgbWFjaGluZSBjaGVjayByZWNvdmVyYWJsZSByYW5nZXMuXG4iKTsKKworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCB0aGUgTUMgcmVjb3ZlcmFibGUgcmFuZ2VzLiBXZSB3b3VsZCBiZQorCSAqIGFjY2Vzc2luZyB0aGVtIGluIHJlYWwgbW9kZSwgaGVuY2UgaXQgbmVlZHMgdG8gYmUgd2l0aGluCisJICogUk1PIHJlZ2lvbi4KKwkgKi8KKwltY19yZWNvdmVyYWJsZV9yYW5nZSA9X192YShtZW1ibG9ja19hbGxvY19iYXNlKHNpemUsIF9fYWxpZ25vZl9fKHU2NCksCisJCQkJCQkJcHBjNjRfcm1hX3NpemUpKTsKKwltZW1zZXQobWNfcmVjb3ZlcmFibGVfcmFuZ2UsIDAsIHNpemUpOworCisJLyoKKwkgKiBFYWNoIHJlY292ZXJhYmxlIGFkZHJlc3MgZW50cnkgaXMgYW4gKHN0YXJ0IGFkZHJlc3MsbGVuLAorCSAqIHJlY292ZXIgYWRkcmVzcykgcGFpciwgKiAyIGNlbGxzIGVhY2gsIHRvdGFsbGluZyA0IGNlbGxzIHBlciBlbnRyeS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIChzaXplb2YoKnByb3ApICogNSk7IGkrKykgeworCQltY19yZWNvdmVyYWJsZV9yYW5nZVtpXS5zdGFydF9hZGRyID0KKwkJCQkJb2ZfcmVhZF9udW1iZXIocHJvcCArIChpICogNSkgKyAwLCAyKTsKKwkJbWNfcmVjb3ZlcmFibGVfcmFuZ2VbaV0uZW5kX2FkZHIgPQorCQkJCQltY19yZWNvdmVyYWJsZV9yYW5nZVtpXS5zdGFydF9hZGRyICsKKwkJCQkJb2ZfcmVhZF9udW1iZXIocHJvcCArIChpICogNSkgKyAyLCAxKTsKKwkJbWNfcmVjb3ZlcmFibGVfcmFuZ2VbaV0ucmVjb3Zlcl9hZGRyID0KKwkJCQkJb2ZfcmVhZF9udW1iZXIocHJvcCArIChpICogNSkgKyAzLCAyKTsKKworCQlwcl9kZWJ1ZygiTWFjaGluZSBjaGVjayByZWNvdmVyYWJsZSByYW5nZTogJWxseC4uJWxseDogJWxseFxuIiwKKwkJCQltY19yZWNvdmVyYWJsZV9yYW5nZVtpXS5zdGFydF9hZGRyLAorCQkJCW1jX3JlY292ZXJhYmxlX3JhbmdlW2ldLmVuZF9hZGRyLAorCQkJCW1jX3JlY292ZXJhYmxlX3JhbmdlW2ldLnJlY292ZXJfYWRkcik7CisJfQorCW1jX3JlY292ZXJhYmxlX3JhbmdlX2xlbiA9IGk7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG9wYWxfcmVnaXN0ZXJfZXhjZXB0aW9uX2hhbmRsZXJzKHZvaWQpCiB7CiAjaWZkZWYgX19CSUdfRU5ESUFOX18KQEAgLTQwMSw2ICs0NjMsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVpbnQ2NF90IGZpbmRfcmVjb3ZlcnlfYWRkcmVzcyh1aW50NjRfdCBuaXApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWNfcmVjb3ZlcmFibGVfcmFuZ2VfbGVuOyBpKyspCisJCWlmICgobmlwID49IG1jX3JlY292ZXJhYmxlX3JhbmdlW2ldLnN0YXJ0X2FkZHIpICYmCisJCSAgICAobmlwIDwgbWNfcmVjb3ZlcmFibGVfcmFuZ2VbaV0uZW5kX2FkZHIpKQorCQkgICAgcmV0dXJuIG1jX3JlY292ZXJhYmxlX3JhbmdlW2ldLnJlY292ZXJfYWRkcjsKKwlyZXR1cm4gMDsKK30KKworYm9vbCBvcGFsX21jZV9jaGVja19lYXJseV9yZWNvdmVyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1aW50NjRfdCByZWNvdmVyX2FkZHIgPSAwOworCisJaWYgKCFvcGFsLmJhc2UgfHwgIW9wYWwuc2l6ZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKHJlZ3MtPm5pcCA+PSBvcGFsLmJhc2UpICYmCisJCQkocmVncy0+bmlwIDw9IChvcGFsLmJhc2UgKyBvcGFsLnNpemUpKSkKKwkJcmVjb3Zlcl9hZGRyID0gZmluZF9yZWNvdmVyeV9hZGRyZXNzKHJlZ3MtPm5pcCk7CisKKwkvKgorCSAqIFNldHVwIHJlZ3MtPm5pcCB0byByZmkgaW50byBmaXh1cCBhZGRyZXNzLgorCSAqLworCWlmIChyZWNvdmVyX2FkZHIpCisJCXJlZ3MtPm5pcCA9IHJlY292ZXJfYWRkcjsKKworb3V0OgorCXJldHVybiAhIXJlY292ZXJfYWRkcjsKK30KKwogc3RhdGljIGlycXJldHVybl90IG9wYWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJX19iZTY0IGV2ZW50czsKQEAgLTQ3Miw4ICs1NjYsMTQgQEAKIAkvKiBDcmVhdGUgIm9wYWwiIGtvYmplY3QgdW5kZXIgL3N5cy9maXJtd2FyZSAqLwogCXJjID0gb3BhbF9zeXNmc19pbml0KCk7CiAJaWYgKHJjID09IDApIHsKKwkJLyogU2V0dXAgZXJyb3IgbG9nIGludGVyZmFjZSAqLworCQlyYyA9IG9wYWxfZWxvZ19pbml0KCk7CiAJCS8qIFNldHVwIGNvZGUgdXBkYXRlIGludGVyZmFjZSAqLwogCQlvcGFsX2ZsYXNoX2luaXQoKTsKKwkJLyogU2V0dXAgcGxhdGZvcm0gZHVtcCBleHRyYWN0IGludGVyZmFjZSAqLworCQlvcGFsX3BsYXRmb3JtX2R1bXBfaW5pdCgpOworCQkvKiBTZXR1cCBzeXN0ZW0gcGFyYW1ldGVycyBpbnRlcmZhY2UgKi8KKwkJb3BhbF9zeXNfcGFyYW1faW5pdCgpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc2V0dXAuYwppbmRleCAxMTBmNGZiLi42MWNmOGZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc2V0dXAuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CkBAIC0xODgsNiArMTg3LDcgQEAKIAlwcGNfbWQucG93ZXJfb2ZmID0gcG52X3Bvd2VyX29mZjsKIAlwcGNfbWQuaGFsdCA9IHBudl9oYWx0OwogCXBwY19tZC5tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbiA9IG9wYWxfbWFjaGluZV9jaGVjazsKKwlwcGNfbWQubWNlX2NoZWNrX2Vhcmx5X3JlY292ZXJ5ID0gb3BhbF9tY2VfY2hlY2tfZWFybHlfcmVjb3Zlcnk7CiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlZfUlRBUwpAQCAtMjI1LDE2ICsyMjUsNiBAQAogCXJldHVybiAxOwogfQogCi12b2lkIHBvd2VybnZfaWRsZSh2b2lkKQotewotCS8qIEhvb2sgdG8gY3B1aWRsZSBmcmFtZXdvcmsgaWYgYXZhaWxhYmxlLCBlbHNlCi0JICogY2FsbCBvbiBkZWZhdWx0IHBsYXRmb3JtIGlkbGUgY29kZQotCSAqLwotCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKSB7Ci0JCXBvd2VyN19pZGxlKCk7Ci0JfQotfQotCiBkZWZpbmVfbWFjaGluZShwb3dlcm52KSB7CiAJLm5hbWUJCQk9ICJQb3dlck5WIiwKIAkucHJvYmUJCQk9IHBudl9wcm9iZSwKQEAgLTI0NCw3ICsyMzQsNyBAQAogCS5zaG93X2NwdWluZm8JCT0gcG52X3Nob3dfY3B1aW5mbywKIAkucHJvZ3Jlc3MJCT0gcG52X3Byb2dyZXNzLAogCS5tYWNoaW5lX3NodXRkb3duCT0gcG52X3NodXRkb3duLAotCS5wb3dlcl9zYXZlICAgICAgICAgICAgID0gcG93ZXJudl9pZGxlLAorCS5wb3dlcl9zYXZlICAgICAgICAgICAgID0gcG93ZXI3X2lkbGUsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCiAJLmRtYV9zZXRfbWFzawkJPSBwbnZfZG1hX3NldF9tYXNrLAogI2lmZGVmIENPTkZJR19LRVhFQwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKaW5kZXggZTg3YzE5NC4uNTZmMjc0MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCkBAIC0yLDEwICsyLDggQEAKIAlib29sICJTb255IFBTMyIKIAlkZXBlbmRzIG9uIFBQQzY0ICYmIFBQQ19CT09LM1MKIAlzZWxlY3QgUFBDX0NFTEwKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgVVNCX09IQ0lfTElUVExFX0VORElBTgogCXNlbGVjdCBVU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCiAJc2VsZWN0IFBQQ19QQ0lfQ0hPSUNFCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwppbmRleCA0YjM1MTY2Li5iMzU4YmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwpAQCAtNzYsNyArNzYsNyBAQAogCiAJCUJVSUxEX0JVR19PTihQUENfTVNHX0NBTExfRlVOQ1RJT04gICAgIT0gMCk7CiAJCUJVSUxEX0JVR19PTihQUENfTVNHX1JFU0NIRURVTEUgICAgICAgIT0gMSk7Ci0JCUJVSUxEX0JVR19PTihQUENfTVNHX0NBTExfRlVOQ19TSU5HTEUgIT0gMik7CisJCUJVSUxEX0JVR19PTihQUENfTVNHX1RJQ0tfQlJPQURDQVNUICAgIT0gMik7CiAJCUJVSUxEX0JVR19PTihQUENfTVNHX0RFQlVHR0VSX0JSRUFLICAgIT0gMyk7CiAKIAkJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCmluZGV4IDgwYjFkNTcuLjJjYjhiNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCkBAIC0xMTEsNiArMTExLDE4IEBACiAJICB3aWxsIGJlIHJldXNlZCBmb3Igb3RoZXIgTFBBUnMuIFRoZSBpbnRlcmZhY2UgYWxsb3dzIGZpcm13YXJlIHRvCiAJICBiYWxhbmNlIG1lbW9yeSBhY3Jvc3MgbWFueSBMUEFScy4KIAorY29uZmlnIEhWX1BFUkZfQ1RSUworICAgICAgIGJvb2wgIkh5cGVydmlzb3Igc3VwcGxpZWQgUE1VIGV2ZW50cyAoMjR4NyAmIEdQQ0kpIgorICAgICAgIGRlZmF1bHQgeQorICAgICAgIGRlcGVuZHMgb24gUEVSRl9FVkVOVFMgJiYgUFBDX1BTRVJJRVMKKyAgICAgICBoZWxwCisJICBFbmFibGUgYWNjZXNzIHRvIGh5cGVydmlzb3Igc3VwcGxpZWQgY291bnRlcnMgaW4gcGVyZi4gQ3VycmVudGx5LAorCSAgdGhpcyBlbmFibGVzIGNvZGUgdGhhdCB1c2VzIHRoZSBoY2FsbCBHZXRQZXJmQ291bnRlckluZm8gYW5kIDI0eDcKKwkgIGludGVyZmFjZXMgdG8gcmV0cmlldmUgY291bnRlcnMuIEdQQ0kgZXhpc3RzIG9uIFBvd2VyIDYgYW5kIGxhdGVyCisJICBzeXN0ZW1zLiAyNHg3IGlzIGF2YWlsYWJsZSBvbiBQb3dlciA4IHN5c3RlbXMuCisKKyAgICAgICAgICBJZiB1bnN1cmUsIHNlbGVjdCBZLgorCiBjb25maWcgRFRMCiAJYm9vbCAiRGlzcGF0Y2ggVHJhY2UgTG9nIgogCWRlcGVuZHMgb24gUFBDX1NQTFBBUiAmJiBERUJVR19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwppbmRleCAwZWE5OWUzLi45YjhlMDUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwpAQCAtNDIwLDQgKzQyMCw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLWFyY2hfaW5pdGNhbGwocHNlcmllc19jcHVfaG90cGx1Z19pbml0KTsKK21hY2hpbmVfYXJjaF9pbml0Y2FsbChwc2VyaWVzLCBwc2VyaWVzX2NwdV9ob3RwbHVnX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctbWVtb3J5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1tZW1vcnkuYwppbmRleCA5NTkwZGJiLi41NzNiNDg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1tZW1vcnkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1tZW1vcnkuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpAQCAtNzUsNTAgKzc2LDEzIEBACiB9CiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQotc3RhdGljIGludCBwc2VyaWVzX3JlbW92ZV9tZW1ibG9jayh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBtZW1ibG9ja19zaXplKQorc3RhdGljIGludCBwc2VyaWVzX3JlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBzdGFydF9wZm47Ci0Jc3RydWN0IHpvbmUgKnpvbmU7CiAJaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHNlY3Rpb247Ci0JdW5zaWduZWQgbG9uZyBzZWN0aW9uc190b19yZW1vdmU7CiAKLQlzdGFydF9wZm4gPSBiYXNlID4+IFBBR0VfU0hJRlQ7Ci0KLQlpZiAoIXBmbl92YWxpZChzdGFydF9wZm4pKSB7Ci0JCW1lbWJsb2NrX3JlbW92ZShiYXNlLCBtZW1ibG9ja19zaXplKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jem9uZSA9IHBhZ2Vfem9uZShwZm5fdG9fcGFnZShzdGFydF9wZm4pKTsKLQotCS8qCi0JICogUmVtb3ZlIHNlY3Rpb24gbWFwcGluZ3MgYW5kIHN5c2ZzIGVudHJpZXMgZm9yIHRoZQotCSAqIHNlY3Rpb24gb2YgdGhlIG1lbW9yeSB3ZSBhcmUgcmVtb3ZpbmcuCi0JICoKLQkgKiBOT1RFOiBJZGVhbGx5LCB0aGlzIHNob3VsZCBiZSBkb25lIGluIGdlbmVyaWMgY29kZSBsaWtlCi0JICogcmVtb3ZlX21lbW9yeSgpLiBCdXQgcmVtb3ZlX21lbW9yeSgpIGdldHMgY2FsbGVkIGJ5IHdyaXRpbmcKLQkgKiB0byBzeXNmcyAic3RhdGUiIGZpbGUgYW5kIHdlIGNhbid0IHJlbW92ZSBzeXNmcyBlbnRyaWVzCi0JICogd2hpbGUgd3JpdGluZyB0byBpdC4gU28gd2UgaGF2ZSB0byBkZWZlciBpdCB0byBoZXJlLgotCSAqLwotCXNlY3Rpb25zX3RvX3JlbW92ZSA9IChtZW1ibG9ja19zaXplID4+IFBBR0VfU0hJRlQpIC8gUEFHRVNfUEVSX1NFQ1RJT047Ci0JZm9yIChzZWN0aW9uID0gMDsgc2VjdGlvbiA8IHNlY3Rpb25zX3RvX3JlbW92ZTsgc2VjdGlvbisrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gc3RhcnRfcGZuICsgc2VjdGlvbiAqIFBBR0VTX1BFUl9TRUNUSU9OOwotCQlyZXQgPSBfX3JlbW92ZV9wYWdlcyh6b25lLCBwZm4sIFBBR0VTX1BFUl9TRUNUSU9OKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGUgbWVtb3J5IHJlZ2lvbnMgZm9yIG1lbW9yeSByZW1vdmUKLQkgKi8KLQltZW1ibG9ja19yZW1vdmUoYmFzZSwgbWVtYmxvY2tfc2l6ZSk7Ci0KLQkvKgotCSAqIFJlbW92ZSBodGFiIGJvbHRlZCBtYXBwaW5ncyBmb3IgdGhpcyBzZWN0aW9uIG9mIG1lbW9yeQotCSAqLwotCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShiYXNlKTsKLQlyZXQgPSByZW1vdmVfc2VjdGlvbl9tYXBwaW5nKHN0YXJ0LCBzdGFydCArIG1lbWJsb2NrX3NpemUpOworCS8qIFJlbW92ZSBodGFiIGJvbHRlZCBtYXBwaW5ncyBmb3IgdGhpcyBzZWN0aW9uIG9mIG1lbW9yeSAqLworCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShzdGFydCk7CisJcmV0ID0gcmVtb3ZlX3NlY3Rpb25fbWFwcGluZyhzdGFydCwgc3RhcnQgKyBzaXplKTsKIAogCS8qIEVuc3VyZSBhbGwgdm1hbGxvYyBtYXBwaW5ncyBhcmUgZmx1c2hlZCBpbiBjYXNlIHRoZXkgYWxzbwogCSAqIGhpdCB0aGF0IHNlY3Rpb24gb2YgbWVtb3J5CkBAIC0xMjgsNyArOTIsMzQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBzZXJpZXNfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIGludCBwc2VyaWVzX3JlbW92ZV9tZW1ibG9jayh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBtZW1ibG9ja19zaXplKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tfc3osIHN0YXJ0X3BmbjsKKwlpbnQgc2VjdGlvbnNfcGVyX2Jsb2NrOworCWludCBpLCBuaWQ7CisKKwlzdGFydF9wZm4gPSBiYXNlID4+IFBBR0VfU0hJRlQ7CisKKwlpZiAoIXBmbl92YWxpZChzdGFydF9wZm4pKSB7CisJCW1lbWJsb2NrX3JlbW92ZShiYXNlLCBtZW1ibG9ja19zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYmxvY2tfc3ogPSBtZW1vcnlfYmxvY2tfc2l6ZV9ieXRlcygpOworCXNlY3Rpb25zX3Blcl9ibG9jayA9IGJsb2NrX3N6IC8gTUlOX01FTU9SWV9CTE9DS19TSVpFOworCW5pZCA9IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKGJhc2UpOworCisJZm9yIChpID0gMDsgaSA8IHNlY3Rpb25zX3Blcl9ibG9jazsgaSsrKSB7CisJCXJlbW92ZV9tZW1vcnkobmlkLCBiYXNlLCBNSU5fTUVNT1JZX0JMT0NLX1NJWkUpOworCQliYXNlICs9IE1JTl9NRU1PUllfQkxPQ0tfU0laRTsKKwl9CisKKwkvKiBVcGRhdGUgbWVtb3J5IHJlZ2lvbnMgZm9yIG1lbW9yeSByZW1vdmUgKi8KKwltZW1ibG9ja19yZW1vdmUoYmFzZSwgbWVtYmxvY2tfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHNlcmllc19yZW1vdmVfbWVtX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAljb25zdCBjaGFyICp0eXBlOwogCWNvbnN0IHVuc2lnbmVkIGludCAqcmVnczsKQEAgLTE1Myw4ICsxNDQsOCBAQAogCWJhc2UgPSAqKHVuc2lnbmVkIGxvbmcgKilyZWdzOwogCWxtYl9zaXplID0gcmVnc1szXTsKIAotCXJldCA9IHBzZXJpZXNfcmVtb3ZlX21lbWJsb2NrKGJhc2UsIGxtYl9zaXplKTsKLQlyZXR1cm4gcmV0OworCXBzZXJpZXNfcmVtb3ZlX21lbWJsb2NrKGJhc2UsIGxtYl9zaXplKTsKKwlyZXR1cm4gMDsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBwc2VyaWVzX3JlbW92ZV9tZW1ibG9jayh1bnNpZ25lZCBsb25nIGJhc2UsCkBAIC0xNjIsMTMgKzE1MywxMyBAQAogewogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IHBzZXJpZXNfcmVtb3ZlX21lbW9yeShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIGlubGluZSBpbnQgcHNlcmllc19yZW1vdmVfbWVtX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RSRU1PVkUgKi8KIAotc3RhdGljIGludCBwc2VyaWVzX2FkZF9tZW1vcnkoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyBpbnQgcHNlcmllc19hZGRfbWVtX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAljb25zdCBjaGFyICp0eXBlOwogCWNvbnN0IHVuc2lnbmVkIGludCAqcmVnczsKQEAgLTI1NCwxMCArMjQ1LDEwIEBACiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgT0ZfUkVDT05GSUdfQVRUQUNIX05PREU6Ci0JCWVyciA9IHBzZXJpZXNfYWRkX21lbW9yeShub2RlKTsKKwkJZXJyID0gcHNlcmllc19hZGRfbWVtX25vZGUobm9kZSk7CiAJCWJyZWFrOwogCWNhc2UgT0ZfUkVDT05GSUdfREVUQUNIX05PREU6Ci0JCWVyciA9IHBzZXJpZXNfcmVtb3ZlX21lbW9yeShub2RlKTsKKwkJZXJyID0gcHNlcmllc19yZW1vdmVfbWVtX25vZGUobm9kZSk7CiAJCWJyZWFrOwogCWNhc2UgT0ZfUkVDT05GSUdfVVBEQVRFX1BST1BFUlRZOgogCQlwciA9IChzdHJ1Y3Qgb2ZfcHJvcF9yZWNvbmZpZyAqKW5vZGU7CkBAIC0yNzcsNiArMjY4LDEwIEBACiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCiAJCW9mX3JlY29uZmlnX25vdGlmaWVyX3JlZ2lzdGVyKCZwc2VyaWVzX21lbV9uYik7CiAKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQorCXBwY19tZC5yZW1vdmVfbWVtb3J5ID0gcHNlcmllc19yZW1vdmVfbWVtb3J5OworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHBzZXJpZXMsIHBzZXJpZXNfbWVtb3J5X2hvdHBsdWdfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tb2JpbGl0eS5jCmluZGV4IGNkZTRlMGEuLmJkZTdlYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tb2JpbGl0eS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tb2JpbGl0eS5jCkBAIC0yOTAsMTMgKzI5MCw2IEBACiAJaW50IHJjOwogCWludCBhY3RpdmF0ZV9md190b2tlbjsKIAotCXJjID0gcHNlcmllc19kZXZpY2V0cmVlX3VwZGF0ZShNSUdSQVRJT05fU0NPUEUpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkluaXRpYWwgcG9zdC1tb2JpbGl0eSBkZXZpY2UgdHJlZSB1cGRhdGUgIgotCQkgICAgICAgImZhaWxlZDogJWRcbiIsIHJjKTsKLQkJcmV0dXJuOwotCX0KLQogCWFjdGl2YXRlX2Z3X3Rva2VuID0gcnRhc190b2tlbigiaWJtLGFjdGl2YXRlLWZpcm13YXJlIik7CiAJaWYgKGFjdGl2YXRlX2Z3X3Rva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IG1ha2UgcG9zdC1tb2JpbGl0eSAiCkBAIC0zMDQsMTYgKzI5NywxNyBAQAogCQlyZXR1cm47CiAJfQogCi0JcmMgPSBydGFzX2NhbGwoYWN0aXZhdGVfZndfdG9rZW4sIDAsIDEsIE5VTEwpOwotCWlmICghcmMpIHsKLQkJcmMgPSBwc2VyaWVzX2RldmljZXRyZWVfdXBkYXRlKE1JR1JBVElPTl9TQ09QRSk7Ci0JCWlmIChyYykKLQkJCXByaW50ayhLRVJOX0VSUiAiU2Vjb25kYXJ5IHBvc3QtbW9iaWxpdHkgZGV2aWNlIHRyZWUgIgotCQkJICAgICAgICJ1cGRhdGUgZmFpbGVkOiAlZFxuIiwgcmMpOwotCX0gZWxzZSB7CisJZG8geworCQlyYyA9IHJ0YXNfY2FsbChhY3RpdmF0ZV9md190b2tlbiwgMCwgMSwgTlVMTCk7CisJfSB3aGlsZSAocnRhc19idXN5X2RlbGF5KHJjKSk7CisKKwlpZiAocmMpCiAJCXByaW50ayhLRVJOX0VSUiAiUG9zdC1tb2JpbGl0eSBhY3RpdmF0ZS1mdyBmYWlsZWQ6ICVkXG4iLCByYyk7Ci0JCXJldHVybjsKLQl9CisKKwlyYyA9IHBzZXJpZXNfZGV2aWNldHJlZV91cGRhdGUoTUlHUkFUSU9OX1NDT1BFKTsKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAiUG9zdC1tb2JpbGl0eSBkZXZpY2UgdHJlZSB1cGRhdGUgIgorCQkJImZhaWxlZDogJWRcbiIsIHJjKTsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwppbmRleCBlZmU2MTM3Li4yMDNjYmYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCkBAIC0zNywxNSArMzcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9idXMgKnRtcDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c2RuOwogCiAJYnVzZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKIAlpZiAoYnVzZG4gPT0gZG4pCiAJCXJldHVybiBidXM7CiAKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmJ1cy0+Y2hpbGRyZW4pIHsKLQkJY2hpbGQgPSBmaW5kX2J1c19hbW9uZ19jaGlsZHJlbihwY2lfYnVzX2IodG1wKSwgZG4pOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQljaGlsZCA9IGZpbmRfYnVzX2Ftb25nX2NoaWxkcmVuKHRtcCwgZG4pOwogCQlpZiAoY2hpbGQpCiAJCQlicmVhazsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCA5NzJkZjBmZi4uMmRiOGNjNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKQEAgLTM5LDcgKzM5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIApAQCAtMzU2LDI5ICszNTUsMjQgQEAKIAogc3RhdGljIHZvaWQgcHNlcmllc19scGFyX2lkbGUodm9pZCkKIHsKLQkvKiBUaGlzIHdvdWxkIGNhbGwgb24gdGhlIGNwdWlkbGUgZnJhbWV3b3JrLCBhbmQgdGhlIGJhY2stZW5kIHBzZXJpZXMKLQkgKiBkcml2ZXIgdG8gIGdvIHRvIGlkbGUgc3RhdGVzCisJLyoKKwkgKiBEZWZhdWx0IGhhbmRsZXIgdG8gZ28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5IGFuZCBwb3NzaWJseQorCSAqIGxvdyBwb3dlciBtb2RlIGJ5IGNlZGVpbmcgcHJvY2Vzc29yIHRvIGh5cGVydmlzb3IKIAkgKi8KLQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkgewotCQkvKiBPbiBlcnJvciwgZXhlY3V0ZSBkZWZhdWx0IGhhbmRsZXIKLQkJICogdG8gZ28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5IGFuZCBwb3NzaWJseQotCQkgKiBsb3cgcG93ZXIgbW9kZSBieSBjZWRlaW5nIHByb2Nlc3NvciB0byBoeXBlcnZpc29yCi0JCSAqLwogCi0JCS8qIEluZGljYXRlIHRvIGh5cGVydmlzb3IgdGhhdCB3ZSBhcmUgaWRsZS4gKi8KLQkJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKKwkvKiBJbmRpY2F0ZSB0byBoeXBlcnZpc29yIHRoYXQgd2UgYXJlIGlkbGUuICovCisJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKIAotCQkvKgotCQkgKiBZaWVsZCB0aGUgcHJvY2Vzc29yIHRvIHRoZSBoeXBlcnZpc29yLiAgV2UgcmV0dXJuIGlmCi0JCSAqIGFuIGV4dGVybmFsIGludGVycnVwdCBvY2N1cnMgKHdoaWNoIGFyZSBkcml2ZW4gcHJpb3IKLQkJICogdG8gcmV0dXJuaW5nIGhlcmUpIG9yIGlmIGEgcHJvZCBvY2N1cnMgZnJvbSBhbm90aGVyCi0JCSAqIHByb2Nlc3Nvci4gV2hlbiByZXR1cm5pbmcgaGVyZSwgZXh0ZXJuYWwgaW50ZXJydXB0cwotCQkgKiBhcmUgZW5hYmxlZC4KLQkJICovCi0JCWNlZGVfcHJvY2Vzc29yKCk7CisJLyoKKwkgKiBZaWVsZCB0aGUgcHJvY2Vzc29yIHRvIHRoZSBoeXBlcnZpc29yLiAgV2UgcmV0dXJuIGlmCisJICogYW4gZXh0ZXJuYWwgaW50ZXJydXB0IG9jY3VycyAod2hpY2ggYXJlIGRyaXZlbiBwcmlvcgorCSAqIHRvIHJldHVybmluZyBoZXJlKSBvciBpZiBhIHByb2Qgb2NjdXJzIGZyb20gYW5vdGhlcgorCSAqIHByb2Nlc3Nvci4gV2hlbiByZXR1cm5pbmcgaGVyZSwgZXh0ZXJuYWwgaW50ZXJydXB0cworCSAqIGFyZSBlbmFibGVkLgorCSAqLworCWNlZGVfcHJvY2Vzc29yKCk7CiAKLQkJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKLQl9CisJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zdXNwZW5kLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jCmluZGV4IDE2YTI1NTIuLmI4N2I5NzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zdXNwZW5kLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS90b3BvbG9neS5oPgorI2luY2x1ZGUgIi4uLy4uL2tlcm5lbC9jYWNoZWluZm8uaCIKIAogc3RhdGljIHU2NCBzdHJlYW1faWQ7CiBzdGF0aWMgc3RydWN0IGRldmljZSBzdXNwZW5kX2RldjsKQEAgLTc5LDYgKzgwLDIzIEBACiB9CiAKIC8qKgorICogcHNlcmllc19zdXNwZW5kX2VuYWJsZV9pcnFzCisgKgorICogUG9zdCBzdXNwZW5kIGNvbmZpZ3VyYXRpb24gdXBkYXRlcworICoKKyAqKi8KK3N0YXRpYyB2b2lkIHBzZXJpZXNfc3VzcGVuZF9lbmFibGVfaXJxcyh2b2lkKQoreworCS8qCisJICogVXBkYXRlIGNvbmZpZ3VyYXRpb24gd2hpY2ggY2FuIGJlIG1vZGlmaWVkIGJhc2VkIG9uIGRldmljZSB0cmVlCisJICogY2hhbmdlcyBkdXJpbmcgcmVzdW1lLgorCSAqLworCWNhY2hlaW5mb19jcHVfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpOworCXBvc3RfbW9iaWxpdHlfZml4dXAoKTsKKwljYWNoZWluZm9fY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCisvKioKICAqIHBzZXJpZXNfc3VzcGVuZF9lbnRlciAtIEZpbmFsIHBoYXNlIG9mIGhpYmVybmF0aW9uCiAgKgogICogUmV0dXJuIHZhbHVlOgpAQCAtMTc0LDcgKzE5MiwzMCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGhpYmVybmF0ZSwgU19JV1VTUiwgTlVMTCwgc3RvcmVfaGliZXJuYXRlKTsKKyNkZWZpbmUgVVNFUl9EVF9VUERBVEUJMAorI2RlZmluZSBLRVJOX0RUX1VQREFURQkxCisKKy8qKgorICogc2hvd19oaWJlcm5hdGUgLSBSZXBvcnQgZGV2aWNlIHRyZWUgdXBkYXRlIHJlc3BvbnNpYmlsdHkKKyAqIEBkZXY6CQlzdWJzeXMgcm9vdCBkZXZpY2UKKyAqIEBhdHRyOgkJZGV2aWNlIGF0dHJpYnV0ZSBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqCisgKiBSZXBvcnQgd2hldGhlciBhIGRldmljZSB0cmVlIHVwZGF0ZSBpcyBwZXJmb3JtZWQgYnkgdGhlIGtlcm5lbCBhZnRlciBhCisgKiByZXN1bWUsIG9yIGlmIGRybWdyIG11c3QgY29vcmRpbmF0ZSB0aGUgdXBkYXRlIGZyb20gdXNlciBzcGFjZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwIGlmIGRybWdyIGlzIHRvIGluaXRpYXRlIHVwZGF0ZSwgYW5kIDEgb3RoZXJ3aXNlCisgKiovCitzdGF0aWMgc3NpemVfdCBzaG93X2hpYmVybmF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgS0VSTl9EVF9VUERBVEUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoaGliZXJuYXRlLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgc2hvd19oaWJlcm5hdGUsIHN0b3JlX2hpYmVybmF0ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc3VzcGVuZF9zdWJzeXMgPSB7CiAJLm5hbWUgPSAicG93ZXIiLApAQCAtMjM1LDYgKzI3Niw3IEBACiAJCXJldHVybiByYzsKIAogCXBwY19tZC5zdXNwZW5kX2Rpc2FibGVfY3B1ID0gcHNlcmllc19zdXNwZW5kX2NwdTsKKwlwcGNfbWQuc3VzcGVuZF9lbmFibGVfaXJxcyA9IHBzZXJpZXNfc3VzcGVuZF9lbmFibGVfaXJxczsKIAlzdXNwZW5kX3NldF9vcHMoJnBzZXJpZXNfc3VzcGVuZF9vcHMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggZjY3YWM5MC4uYWZiY2MzNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC0yMSw3ICsyMSw2IEBACiBvYmotJChDT05GSUdfRlNMX1BDSSkJCSs9IGZzbF9wY2kubyAkKGZzbC1tc2ktb2JqLXkpCiBvYmotJChDT05GSUdfRlNMX1BNQykJCSs9IGZzbF9wbWMubwogb2JqLSQoQ09ORklHX0ZTTF9MQkMpCQkrPSBmc2xfbGJjLm8KLW9iai0kKENPTkZJR19GU0xfSUZDKQkJKz0gZnNsX2lmYy5vCiBvYmotJChDT05GSUdfRlNMX0dUTSkJCSs9IGZzbF9ndG0ubwogb2JqLSQoQ09ORklHX0ZTTF84NVhYX0NBQ0hFX1NSQU0pCSs9IGZzbF84NXh4X2wyY3Rsci5vIGZzbF84NXh4X2NhY2hlX3NyYW0ubwogb2JqLSQoQ09ORklHX1NJTVBMRV9HUElPKQkrPSBzaW1wbGVfZ3Bpby5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2Vodl9waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jCmluZGV4IGI3NDA4NWMuLjJkMjBmMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jCkBAIC0yOCw4ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL2Vodl9waWMuaD4KICNpbmNsdWRlIDxhc20vZnNsX2hjYWxscy5oPgogCi0jaW5jbHVkZSAiLi4vLi4vLi4va2VybmVsL2lycS9zZXR0aW5ncy5oIgotCiBzdGF0aWMgc3RydWN0IGVodl9waWMgKmdsb2JhbF9laHZfcGljOwogc3RhdGljIERFRklORV9TUElOTE9DSyhlaHZfcGljX2xvY2spOwogCkBAIC0xMTMsMTcgKzExMSwxMyBAQAogaW50IGVodl9waWNfc2V0X2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKIHsKIAl1bnNpZ25lZCBpbnQgc3JjID0gdmlycV90b19odyhkLT5pcnEpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGQtPmlycSk7CiAJdW5zaWduZWQgaW50IHZlY3ByaSwgdm9sZCwgdm5ldywgcHJpbywgY3B1X2Rlc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChmbG93X3R5cGUgPT0gSVJRX1RZUEVfTk9ORSkKIAkJZmxvd190eXBlID0gSVJRX1RZUEVfTEVWRUxfTE9XOwogCi0JaXJxX3NldHRpbmdzX2Nscl9sZXZlbChkZXNjKTsKLQlpcnFfc2V0dGluZ3Nfc2V0X3RyaWdnZXJfbWFzayhkZXNjLCBmbG93X3R5cGUpOwotCWlmIChmbG93X3R5cGUgJiAoSVJRX1RZUEVfTEVWRUxfSElHSCB8IElSUV9UWVBFX0xFVkVMX0xPVykpCi0JCWlycV9zZXR0aW5nc19zZXRfbGV2ZWwoZGVzYyk7CisJaXJxZF9zZXRfdHJpZ2dlcl90eXBlKGQsIGZsb3dfdHlwZSk7CiAKIAl2ZWNwcmkgPSBlaHZfcGljX3R5cGVfdG9fdmVjcHJpKGZsb3dfdHlwZSk7CiAKQEAgLTE0NCw3ICsxMzgsNyBAQAogCWV2X2ludF9zZXRfY29uZmlnKHNyYywgdmVjcHJpLCBwcmlvLCBjcHVfZGVzdCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaHZfcGljX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gSVJRX1NFVF9NQVNLX09LX05PQ09QWTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBlaHZfcGljX2lycV9jaGlwID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfaWZjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9pZmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjODg1Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9pZmMuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYwotICoKLSAqIEZyZWVzY2FsZSBJbnRlZ3JhdGVkIEZsYXNoIENvbnRyb2xsZXIKLSAqCi0gKiBBdXRob3I6IERpcGVuIER1ZGhhdCA8RGlwZW4uRHVkaGF0QGZyZWVzY2FsZS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vZnNsX2lmYy5oPgotCi1zdHJ1Y3QgZnNsX2lmY19jdHJsICpmc2xfaWZjX2N0cmxfZGV2OwotRVhQT1JUX1NZTUJPTChmc2xfaWZjX2N0cmxfZGV2KTsKLQotLyoKLSAqIGNvbnZlcnRfaWZjX2FkZHJlc3MgLSBjb252ZXJ0IHRoZSBiYXNlIGFkZHJlc3MKLSAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJhbmsKLSAqLwotdW5zaWduZWQgaW50IGNvbnZlcnRfaWZjX2FkZHJlc3MocGh5c19hZGRyX3QgYWRkcl9iYXNlKQotewotCXJldHVybiBhZGRyX2Jhc2UgJiBDU1BSX0JBOwotfQotRVhQT1JUX1NZTUJPTChjb252ZXJ0X2lmY19hZGRyZXNzKTsKLQotLyoKLSAqIGZzbF9pZmNfZmluZCAtIGZpbmQgSUZDIGJhbmsKLSAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJhbmsKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIElGQyBiYW5rcyBjb21wYXJpbmcgIkJhc2UgYWRkcmVzcyIgZmllbGQgb2YgdGhlIENTUFIKLSAqIHJlZ2lzdGVycyB3aXRoIHRoZSBzdXBwbGllZCBhZGRyX2Jhc2UgYXJndW1lbnQuIFdoZW4gYmFzZXMgbWF0Y2ggdGhpcwotICogZnVuY3Rpb24gcmV0dXJucyBiYW5rIG51bWJlciAoc3RhcnRpbmcgd2l0aCAwKSwgb3RoZXJ3aXNlIGl0IHJldHVybnMKLSAqIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlLgotICovCi1pbnQgZnNsX2lmY19maW5kKHBoeXNfYWRkcl90IGFkZHJfYmFzZSkKLXsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoIWZzbF9pZmNfY3RybF9kZXYgfHwgIWZzbF9pZmNfY3RybF9kZXYtPnJlZ3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX2lmY19jdHJsX2Rldi0+cmVncy0+Y3Nwcl9jcyk7IGkrKykgewotCQl1MzIgY3NwciA9IGluX2JlMzIoJmZzbF9pZmNfY3RybF9kZXYtPnJlZ3MtPmNzcHJfY3NbaV0uY3Nwcik7Ci0JCWlmIChjc3ByICYgQ1NQUl9WICYmIChjc3ByICYgQ1NQUl9CQSkgPT0KLQkJCQljb252ZXJ0X2lmY19hZGRyZXNzKGFkZHJfYmFzZSkpCi0JCQlyZXR1cm4gaTsKLQl9Ci0KLQlyZXR1cm4gLUVOT0VOVDsKLX0KLUVYUE9SVF9TWU1CT0woZnNsX2lmY19maW5kKTsKLQotc3RhdGljIGludCBmc2xfaWZjX2N0cmxfaW5pdChzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsKQotewotCXN0cnVjdCBmc2xfaWZjX3JlZ3MgX19pb21lbSAqaWZjID0gY3RybC0+cmVnczsKLQotCS8qCi0JICogQ2xlYXIgYWxsIHRoZSBjb21tb24gc3RhdHVzIGFuZCBldmVudCByZWdpc3RlcnMKLQkgKi8KLQlpZiAoaW5fYmUzMigmaWZjLT5jbV9ldnRlcl9zdGF0KSAmIElGQ19DTV9FVlRFUl9TVEFUX0NTRVIpCi0JCW91dF9iZTMyKCZpZmMtPmNtX2V2dGVyX3N0YXQsIElGQ19DTV9FVlRFUl9TVEFUX0NTRVIpOwotCi0JLyogZW5hYmxlIGFsbCBlcnJvciBhbmQgZXZlbnRzICovCi0Jb3V0X2JlMzIoJmlmYy0+Y21fZXZ0ZXJfZW4sIElGQ19DTV9FVlRFUl9FTl9DU0VSRU4pOwotCi0JLyogZW5hYmxlIGFsbCBlcnJvciBhbmQgZXZlbnQgaW50ZXJydXB0cyAqLwotCW91dF9iZTMyKCZpZmMtPmNtX2V2dGVyX2ludHJfZW4sIElGQ19DTV9FVlRFUl9JTlRSX0VOX0NTRVJJUkVOKTsKLQlvdXRfYmUzMigmaWZjLT5jbV9lcmF0dHIwLCAweDApOwotCW91dF9iZTMyKCZpZmMtPmNtX2VyYXR0cjEsIDB4MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmc2xfaWZjX2N0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7Ci0KLQlmcmVlX2lycShjdHJsLT5uYW5kX2lycSwgY3RybCk7Ci0JZnJlZV9pcnEoY3RybC0+aXJxLCBjdHJsKTsKLQotCWlycV9kaXNwb3NlX21hcHBpbmcoY3RybC0+bmFuZF9pcnEpOwotCWlycV9kaXNwb3NlX21hcHBpbmcoY3RybC0+aXJxKTsKLQotCWlvdW5tYXAoY3RybC0+cmVncyk7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKLQlrZnJlZShjdHJsKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogTkFORCBldmVudHMgYXJlIHNwbGl0IGJldHdlZW4gYW4gb3BlcmF0aW9uYWwgaW50ZXJydXB0IHdoaWNoIG9ubHkKLSAqIHJlY2VpdmVzIE9QQywgYW5kIGFuIGVycm9yIGludGVycnVwdCB0aGF0IHJlY2VpdmVzIGV2ZXJ5dGhpbmcgZWxzZSwKLSAqIGluY2x1ZGluZyBub24tTkFORCBlcnJvcnMuICBXaGljaGV2ZXIgaW50ZXJydXB0IGdldHMgdG8gaXQgZmlyc3QKLSAqIHJlY29yZHMgdGhlIHN0YXR1cyBhbmQgd2FrZXMgdGhlIHdhaXQgcXVldWUuCi0gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmFuZF9pcnFfbG9jayk7Ci0KLXN0YXRpYyB1MzIgY2hlY2tfbmFuZF9zdGF0KHN0cnVjdCBmc2xfaWZjX2N0cmwgKmN0cmwpCi17Ci0Jc3RydWN0IGZzbF9pZmNfcmVncyBfX2lvbWVtICppZmMgPSBjdHJsLT5yZWdzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHN0YXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmFuZF9pcnFfbG9jaywgZmxhZ3MpOwotCi0Jc3RhdCA9IGluX2JlMzIoJmlmYy0+aWZjX25hbmQubmFuZF9ldnRlcl9zdGF0KTsKLQlpZiAoc3RhdCkgewotCQlvdXRfYmUzMigmaWZjLT5pZmNfbmFuZC5uYW5kX2V2dGVyX3N0YXQsIHN0YXQpOwotCQljdHJsLT5uYW5kX3N0YXQgPSBzdGF0OwotCQl3YWtlX3VwKCZjdHJsLT5uYW5kX3dhaXQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5hbmRfaXJxX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBzdGF0OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2lmY19uYW5kX2lycShpbnQgaXJxbm8sIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRhdGE7Ci0KLQlpZiAoY2hlY2tfbmFuZF9zdGF0KGN0cmwpKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLS8qCi0gKiBOT1RFOiBUaGlzIGludGVycnVwdCBpcyB1c2VkIHRvIHJlcG9ydCBpZmMgZXZlbnRzIG9mIHZhcmlvdXMga2luZHMsCi0gKiBzdWNoIGFzIHRyYW5zYWN0aW9uIGVycm9ycyBvbiB0aGUgY2hpcHNlbGVjdHMuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBmc2xfaWZjX2N0cmxfaXJxKGludCBpcnFubywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsID0gZGF0YTsKLQlzdHJ1Y3QgZnNsX2lmY19yZWdzIF9faW9tZW0gKmlmYyA9IGN0cmwtPnJlZ3M7Ci0JdTMyIGVycl9heGlpZCwgZXJyX3NyY2lkLCBzdGF0dXMsIGNzX2VyciwgZXJyX2FkZHI7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0KLQkvKiByZWFkIGZvciBjaGlwIHNlbGVjdCBlcnJvciAqLwotCWNzX2VyciA9IGluX2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCk7Ci0JaWYgKGNzX2VycikgewotCQlkZXZfZXJyKGN0cmwtPmRldiwgInRyYW5zYWN0aW9uIHNlbnQgdG8gSUZDIGlzIG5vdCBtYXBwZWQgdG8iCi0JCQkJImFueSBtZW1vcnkgYmFuayAweCUwOFhcbiIsIGNzX2Vycik7Ci0JCS8qIGNsZWFyIHRoZSBjaGlwIHNlbGVjdCBlcnJvciAqLwotCQlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9zdGF0LCBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKTsKLQotCQkvKiByZWFkIGVycm9yIGF0dHJpYnV0ZSByZWdpc3RlcnMgcHJpbnQgdGhlIGVycm9yIGluZm9ybWF0aW9uICovCi0JCXN0YXR1cyA9IGluX2JlMzIoJmlmYy0+Y21fZXJhdHRyMCk7Ci0JCWVycl9hZGRyID0gaW5fYmUzMigmaWZjLT5jbV9lcmF0dHIxKTsKLQotCQlpZiAoc3RhdHVzICYgSUZDX0NNX0VSQVRUUjBfRVJUWVBfUkVBRCkKLQkJCWRldl9lcnIoY3RybC0+ZGV2LCAiUmVhZCB0cmFuc2FjdGlvbiBlcnJvciIKLQkJCQkiQ01fRVJBVFRSMCAweCUwOFhcbiIsIHN0YXR1cyk7Ci0JCWVsc2UKLQkJCWRldl9lcnIoY3RybC0+ZGV2LCAiV3JpdGUgdHJhbnNhY3Rpb24gZXJyb3IiCi0JCQkJIkNNX0VSQVRUUjAgMHglMDhYXG4iLCBzdGF0dXMpOwotCi0JCWVycl9heGlpZCA9IChzdGF0dXMgJiBJRkNfQ01fRVJBVFRSMF9FUkFJRCkgPj4KLQkJCQkJSUZDX0NNX0VSQVRUUjBfRVJBSURfU0hJRlQ7Ci0JCWRldl9lcnIoY3RybC0+ZGV2LCAiQVhJIElEIG9mIHRoZSBlcnJvciIKLQkJCQkJInRyYW5zYWN0aW9uIDB4JTA4WFxuIiwgZXJyX2F4aWlkKTsKLQotCQllcnJfc3JjaWQgPSAoc3RhdHVzICYgSUZDX0NNX0VSQVRUUjBfRVNSQ0lEKSA+PgotCQkJCQlJRkNfQ01fRVJBVFRSMF9FU1JDSURfU0hJRlQ7Ci0JCWRldl9lcnIoY3RybC0+ZGV2LCAiU1JDIElEIG9mIHRoZSBlcnJvciIKLQkJCQkJInRyYW5zYWN0aW9uIDB4JTA4WFxuIiwgZXJyX3NyY2lkKTsKLQotCQlkZXZfZXJyKGN0cmwtPmRldiwgIlRyYW5zYWN0aW9uIEFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBlcnJvciIKLQkJCQkJIkVSQUREUiAweCUwOFhcbiIsIGVycl9hZGRyKTsKLQotCQlyZXQgPSBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAoY2hlY2tfbmFuZF9zdGF0KGN0cmwpKQotCQlyZXQgPSBJUlFfSEFORExFRDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBmc2xfaWZjX2N0cmxfcHJvYmUKLSAqCi0gKiBjYWxsZWQgYnkgZGV2aWNlIGxheWVyIHdoZW4gaXQgZmluZHMgYSBkZXZpY2UgbWF0Y2hpbmcKLSAqIG9uZSBvdXIgZHJpdmVyIGNhbiBoYW5kbGVkLiBUaGlzIGNvZGUgYWxsb2NhdGVzIGFsbCBvZgotICogdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yIHRoZSBjb250cm9sbGVyIG9ubHkuICBUaGUKLSAqIHJlc291cmNlcyBmb3IgdGhlIE5BTkQgYmFua3MgdGhlbXNlbHZlcyBhcmUgYWxsb2NhdGVkCi0gKiBpbiB0aGUgY2hpcCBwcm9iZSBmdW5jdGlvbi4KLSovCi1zdGF0aWMgaW50IGZzbF9pZmNfY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQotCWRldl9pbmZvKCZkZXYtPmRldiwgIkZyZWVzY2FsZSBJbnRlZ3JhdGVkIEZsYXNoIENvbnRyb2xsZXJcbiIpOwotCi0JZnNsX2lmY19jdHJsX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpmc2xfaWZjX2N0cmxfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmc2xfaWZjX2N0cmxfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGZzbF9pZmNfY3RybF9kZXYpOwotCi0JLyogSU9NQVAgdGhlIGVudGlyZSBJRkMgcmVnaW9uICovCi0JZnNsX2lmY19jdHJsX2Rldi0+cmVncyA9IG9mX2lvbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDApOwotCWlmICghZnNsX2lmY19jdHJsX2Rldi0+cmVncykgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIGdldCB0aGUgQ29udHJvbGxlciBsZXZlbCBpcnEgKi8KLQlmc2xfaWZjX2N0cmxfZGV2LT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPmRldi5vZl9ub2RlLCAwKTsKLQlpZiAoZnNsX2lmY19jdHJsX2Rldi0+aXJxID09IE5PX0lSUSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxIHJlc291cmNlICIKLQkJCQkJCQkiZm9yIElGQ1xuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIGdldCB0aGUgbmFuZCBtYWNoaW5lIGlycSAqLwotCWZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxID0KLQkJCWlycV9vZl9wYXJzZV9hbmRfbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDEpOwotCi0JZnNsX2lmY19jdHJsX2Rldi0+ZGV2ID0gJmRldi0+ZGV2OwotCi0JcmV0ID0gZnNsX2lmY19jdHJsX2luaXQoZnNsX2lmY19jdHJsX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZnNsX2lmY19jdHJsX2Rldi0+bmFuZF93YWl0KTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKGZzbF9pZmNfY3RybF9kZXYtPmlycSwgZnNsX2lmY19jdHJsX2lycSwgSVJRRl9TSEFSRUQsCi0JCQkgICJmc2wtaWZjIiwgZnNsX2lmY19jdHJsX2Rldik7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsCi0JCQlmc2xfaWZjX2N0cmxfZGV2LT5pcnEpOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCi0JaWYgKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxLCBmc2xfaWZjX25hbmRfaXJxLAotCQkJCTAsICJmc2wtaWZjLW5hbmQiLCBmc2xfaWZjX2N0cmxfZGV2KTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLAotCQkJCWZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxKTsKLQkJCWdvdG8gZXJyX25hbmRpcnE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyX25hbmRpcnE6Ci0JZnJlZV9pcnEoZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEsIGZzbF9pZmNfY3RybF9kZXYpOwotCWlycV9kaXNwb3NlX21hcHBpbmcoZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEpOwotZXJyX2lycToKLQlmcmVlX2lycShmc2xfaWZjX2N0cmxfZGV2LT5pcnEsIGZzbF9pZmNfY3RybF9kZXYpOwotCWlycV9kaXNwb3NlX21hcHBpbmcoZnNsX2lmY19jdHJsX2Rldi0+aXJxKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfaWZjX21hdGNoW10gPSB7Ci0JewotCQkuY29tcGF0aWJsZSA9ICJmc2wsaWZjIiwKLQl9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX2lmY19jdHJsX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJmc2wtaWZjIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gZnNsX2lmY19tYXRjaCwKLQl9LAotCS5wcm9iZSAgICAgICA9IGZzbF9pZmNfY3RybF9wcm9iZSwKLQkucmVtb3ZlICAgICAgPSBmc2xfaWZjX2N0cmxfcmVtb3ZlLAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfaWZjX2N0cmxfZHJpdmVyKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3IiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIEludGVncmF0ZWQgRmxhc2ggQ29udHJvbGxlciBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMKaW5kZXggYTYyNWRjZi4uM2Y0MTVlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMKQEAgLTIyLDEwICsyMiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC04NjgsNiArODcxLDE0IEBACiAKIAkJcGNpX2J1c19yZWFkX2NvbmZpZ19kd29yZChob3NlLT5idXMsCiAJCQlQQ0lfREVWRk4oMCwgMCksIFBDSV9CQVNFX0FERFJFU1NfMCwgJmJhc2UpOworCisJCS8qCisJCSAqIEZvciBQRVhDU1JCQVIsIGJpdCAzLTAgaW5kaWNhdGUgcHJlZmV0Y2hhYmxlIGFuZAorCQkgKiBhZGRyZXNzIHR5cGUuIFNvIHdoZW4gZ2V0dGluZyBiYXNlIGFkZHJlc3MsIHRoZXNlCisJCSAqIGJpdHMgc2hvdWxkIGJlIG1hc2tlZAorCQkgKi8KKwkJYmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCiAJCXJldHVybiBiYXNlOwogCX0KICNlbmRpZgpAQCAtMTA4NiwxMCArMTA5NywxNTkgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpcnFyZXR1cm5fdCBmc2xfcGNpX3BtZV9oYW5kbGUoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRldl9pZDsKKwlzdHJ1Y3QgY2Nzcl9wY2kgX19pb21lbSAqcGNpID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBkcjsKKworCWRyID0gaW5fYmUzMigmcGNpLT5wZXhfcG1lX21lc19kcik7CisJaWYgKCFkcikKKwkJcmV0dXJuIElSUV9OT05FOworCisJb3V0X2JlMzIoJnBjaS0+cGV4X3BtZV9tZXNfZHIsIGRyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBmc2xfcGNpX3BtZV9wcm9iZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc3RydWN0IGNjc3JfcGNpIF9faW9tZW0gKnBjaTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWludCBwbWVfaXJxOworCWludCByZXM7CisJdTE2IHBtczsKKworCS8qIEdldCBob3NlJ3MgcGNpX2RldiAqLworCWRldiA9IGxpc3RfZmlyc3RfZW50cnkoJmhvc2UtPmJ1cy0+ZGV2aWNlcywgdHlwZW9mKCpkZXYpLCBidXNfbGlzdCk7CisKKwkvKiBQTUUgRGlzYWJsZSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZGV2LT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgJnBtcyk7CisJcG1zICY9IH5QQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsIHBtcyk7CisKKwlwbWVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoaG9zZS0+ZG4sIDApOworCWlmICghcG1lX2lycSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBtYXAgUE1FIGludGVycnVwdC5cbiIpOworCisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmVzID0gZGV2bV9yZXF1ZXN0X2lycShob3NlLT5wYXJlbnQsIHBtZV9pcnEsCisJCQlmc2xfcGNpX3BtZV9oYW5kbGUsCisJCQlJUlFGX1NIQVJFRCwKKwkJCSJbUENJXSBQTUUiLCBob3NlKTsKKwlpZiAocmVzIDwgMCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIlVuYWJsZSB0byByZXF1aWVzdCBpcnEgJWQgZm9yIFBNRVxuIiwgcG1lX2lycSk7CisJCWlycV9kaXNwb3NlX21hcHBpbmcocG1lX2lycSk7CisKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCisJLyogRW5hYmxlIFBUT0QsIEVOTDIzRCAmIEVYTDIzRCAqLworCW91dF9iZTMyKCZwY2ktPnBleF9wbWVfbWVzX2Rpc3IsIDApOworCXNldGJpdHMzMigmcGNpLT5wZXhfcG1lX21lc19kaXNyLAorCQkgIFBNRV9ESVNSX0VOX1BUT0QgfCBQTUVfRElTUl9FTl9FTkwyM0QgfCBQTUVfRElTUl9FTl9FWEwyM0QpOworCisJb3V0X2JlMzIoJnBjaS0+cGV4X3BtZV9tZXNfaWVyLCAwKTsKKwlzZXRiaXRzMzIoJnBjaS0+cGV4X3BtZV9tZXNfaWVyLAorCQkgIFBNRV9ESVNSX0VOX1BUT0QgfCBQTUVfRElTUl9FTl9FTkwyM0QgfCBQTUVfRElTUl9FTl9FWEwyM0QpOworCisJLyogUE1FIEVuYWJsZSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZGV2LT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgJnBtcyk7CisJcG1zIHw9IFBDSV9QTV9DVFJMX1BNRV9FTkFCTEU7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgZGV2LT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgcG1zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3BtZV90dXJub2ZmX21lc3NhZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXN0cnVjdCBjY3NyX3BjaSBfX2lvbWVtICpwY2kgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJdTMyIGRyOworCWludCBpOworCisJLyogU2VuZCBQTUVfVHVybl9PZmYgTWVzc2FnZSBSZXF1ZXN0ICovCisJc2V0Yml0czMyKCZwY2ktPnBleF9wbWNyLCBQRVhfUE1DUl9QVE9NUik7CisKKwkvKiBXYWl0IHRydW4gb2ZmIGRvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTUwOyBpKyspIHsKKwkJZHIgPSBpbl9iZTMyKCZwY2ktPnBleF9wbWVfbWVzX2RyKTsKKwkJaWYgKGRyKSB7CisJCQlvdXRfYmUzMigmcGNpLT5wZXhfcG1lX21lc19kciwgZHIpOworCQkJYnJlYWs7CisJCX0KKworCQl1ZGVsYXkoMTAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmc2xfcGNpX3N5c2NvcmVfZG9fc3VzcGVuZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc2VuZF9wbWVfdHVybm9mZl9tZXNzYWdlKGhvc2UpOworfQorCitzdGF0aWMgaW50IGZzbF9wY2lfc3lzY29yZV9zdXNwZW5kKHZvaWQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQorCQlmc2xfcGNpX3N5c2NvcmVfZG9fc3VzcGVuZChob3NlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfcGNpX3N5c2NvcmVfZG9fcmVzdW1lKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlzdHJ1Y3QgY2Nzcl9wY2kgX19pb21lbSAqcGNpID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBkcjsKKwlpbnQgaTsKKworCS8qIFNlbmQgRXhpdCBMMiBTdGF0ZSBNZXNzYWdlICovCisJc2V0Yml0czMyKCZwY2ktPnBleF9wbWNyLCBQRVhfUE1DUl9FWEwyUyk7CisKKwkvKiBXYWl0IGV4aXQgZG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCAxNTA7IGkrKykgeworCQlkciA9IGluX2JlMzIoJnBjaS0+cGV4X3BtZV9tZXNfZHIpOworCQlpZiAoZHIpIHsKKwkJCW91dF9iZTMyKCZwY2ktPnBleF9wbWVfbWVzX2RyLCBkcik7CisJCQlicmVhazsKKwkJfQorCisJCXVkZWxheSgxMDAwKTsKKwl9CisKKwlzZXR1cF9wY2lfYXRtdShob3NlKTsKK30KKworc3RhdGljIHZvaWQgZnNsX3BjaV9zeXNjb3JlX3Jlc3VtZSh2b2lkKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKKwkJZnNsX3BjaV9zeXNjb3JlX2RvX3Jlc3VtZShob3NlKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBwY2lfc3lzY29yZV9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBmc2xfcGNpX3N5c2NvcmVfc3VzcGVuZCwKKwkucmVzdW1lID0gZnNsX3BjaV9zeXNjb3JlX3Jlc3VtZSwKK307CisjZW5kaWYKKwordm9pZCBmc2xfcGNpYmlvc19maXh1cF9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCit7CisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisJZnNsX3BjaV9wbWVfcHJvYmUocGhiKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW50IGZzbF9wY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlpbnQgcmV0OwogCiAJbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXJldCA9IGZzbF9hZGRfYnJpZGdlKHBkZXYsIGZzbF9wY2lfcHJpbWFyeSA9PSBub2RlKTsKQEAgLTEwOTksNDIgKzEyNTksOSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGZzbF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0Jc3RydWN0IHJlc291cmNlIHBjaV9yc3JjOwotCi0JaG9zZSA9IHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShkZXYtPm9mX25vZGUpOwotCWlmICghaG9zZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYtPm9mX25vZGUsIDAsICZwY2lfcnNyYykpIHsKLQkJZGV2X2VycihkZXYsICJHZXQgcGNpIHJlZ2lzdGVyIGJhc2UgZmFpbGVkLiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlzZXR1cF9wY2lfYXRtdShob3NlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcGNpX3BtX29wcyA9IHsKLQkucmVzdW1lID0gZnNsX3BjaV9yZXN1bWUsCi19OwotCi0jZGVmaW5lIFBDSV9QTV9PUFMgKCZwY2lfcG1fb3BzKQotCi0jZWxzZQotCi0jZGVmaW5lIFBDSV9QTV9PUFMgTlVMTAotCi0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX3BjaV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiZnNsLXBjaSIsCi0JCS5wbSA9IFBDSV9QTV9PUFMsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHBjaV9pZHMsCiAJfSwKIAkucHJvYmUgPSBmc2xfcGNpX3Byb2JlLApAQCAtMTE0Miw2ICsxMjY5LDkgQEAKIAogc3RhdGljIGludCBfX2luaXQgZnNsX3BjaV9pbml0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnBjaV9zeXNjb3JlX3BtX29wcyk7CisjZW5kaWYKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmc2xfcGNpX2RyaXZlcik7CiB9CiBhcmNoX2luaXRjYWxsKGZzbF9wY2lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5oCmluZGV4IDhkNDU1ZGYuLmMxY2VjNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5oCkBAIC0zMiw2ICszMiwxMyBAQAogI2RlZmluZSBQSVdBUl9XUklURV9TTk9PUAkweDAwMDA1MDAwCiAjZGVmaW5lIFBJV0FSX1NaX01BU0sgICAgICAgICAgMHgwMDAwMDAzZgogCisjZGVmaW5lIFBFWF9QTUNSX1BUT01SCQkweDEKKyNkZWZpbmUgUEVYX1BNQ1JfRVhMMlMJCTB4MgorCisjZGVmaW5lIFBNRV9ESVNSX0VOX1BUT0QJMHgwMDAwODAwMAorI2RlZmluZSBQTUVfRElTUl9FTl9FTkwyM0QJMHgwMDAwMjAwMAorI2RlZmluZSBQTUVfRElTUl9FTl9FWEwyM0QJMHgwMDAwMTAwMAorCiAvKiBQQ0kvUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IHJlZyAqLwogc3RydWN0IHBjaV9vdXRib3VuZF93aW5kb3dfcmVncyB7CiAJX19iZTMyCXBvdGFyOwkvKiAweC4wIC0gT3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAqLwpAQCAtMTExLDYgKzExOCw3IEBACiAKIGV4dGVybiBpbnQgZnNsX2FkZF9icmlkZ2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGlzX3ByaW1hcnkpOwogZXh0ZXJuIHZvaWQgZnNsX3BjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOworZXh0ZXJuIHZvaWQgZnNsX3BjaWJpb3NfZml4dXBfcGhiKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKIGV4dGVybiBpbnQgbXBjODN4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKIHU2NCBmc2xfcGNpX2ltbXJiYXJfYmFzZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKaW5kZXggYjA3OTA5OC4uMDg1MDRlNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwpAQCAtMTcxLDcgKzE3MSwxMSBAQAogI2RlZmluZSBSRUcJCSIlLjhseCIKICNlbmRpZgogCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyNkZWZpbmUgR0VUV09SRCh2KQkoKCh2KVszXSA8PCAyNCkgKyAoKHYpWzJdIDw8IDE2KSArICgodilbMV0gPDwgOCkgKyAodilbMF0pCisjZWxzZQogI2RlZmluZSBHRVRXT1JEKHYpCSgoKHYpWzBdIDw8IDI0KSArICgodilbMV0gPDwgMTYpICsgKCh2KVsyXSA8PCA4KSArICh2KVszXSkKKyNlbmRpZgogCiAjZGVmaW5lIGlzeGRpZ2l0KGMpCSgoJzAnIDw9IChjKSAmJiAoYykgPD0gJzknKSBcCiAJCQkgfHwgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdmJykgXApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCA2NWEwNzc1Li45NTNmMTdjOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTExNyw2ICsxMTcsNyBAQAogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUCisJc2VsZWN0IEhBVkVfRlVURVhfQ01QWENIRyBpZiBGVVRFWAogCXNlbGVjdCBIQVZFX0tFUk5FTF9CWklQMgogCXNlbGVjdCBIQVZFX0tFUk5FTF9HWklQCiAJc2VsZWN0IEhBVkVfS0VSTkVMX0xaNApAQCAtMTQwLDYgKzE0MSw3IEBACiAJc2VsZWN0IE9MRF9TSUdBQ1RJT04KIAlzZWxlY3QgT0xEX1NJR1NVU1BFTkQzCiAJc2VsZWN0IFNZU0NUTF9FWENFUFRJT05fVFJBQ0UKKwlzZWxlY3QgVFRZCiAJc2VsZWN0IFZJUlRfQ1BVX0FDQ09VTlRJTkcKIAlzZWxlY3QgVklSVF9UT19CVVMKIApAQCAtNDE1LDYgKzQxNywxMCBAQAogY29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkUKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBBUkNIX0VOQUJMRV9TUExJVF9QTURfUFRMT0NLCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gNjRCSVQKKwogY29uZmlnIEZPUkNFX01BWF9aT05FT1JERVIKIAlpbnQKIAlkZWZhdWx0ICI5IgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX29zLmMgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfb3MuYwppbmRleCBkZThlMmIzLi42OWIyM2IyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfb3MuYworKysgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfb3MuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJaW50IHJjLCBtYXhfc2l6ZTsKIAogCW1heF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhcHBsZGF0YV9vc19kYXRhKSArCi0JCSAgIChOUl9DUFVTICogc2l6ZW9mKHN0cnVjdCBhcHBsZGF0YV9vc19wZXJfY3B1KSk7CisJCSAgIChudW1fcG9zc2libGVfY3B1cygpICogc2l6ZW9mKHN0cnVjdCBhcHBsZGF0YV9vc19wZXJfY3B1KSk7CiAJaWYgKG1heF9zaXplID4gQVBQTERBVEFfTUFYX1JFQ19TSVpFKSB7CiAJCXByX2VycigiTWF4aW11bSBPUyByZWNvcmQgc2l6ZSAlaSBleGNlZWRzIHRoZSBtYXhpbXVtICIKIAkJICAgICAgICJyZWNvcmQgc2l6ZSAlaVxuIiwgbWF4X3NpemUsIEFQUExEQVRBX01BWF9SRUNfU0laRSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9kZWZhdWx0X2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnCmluZGV4IGUwYWYyZWUuLmRkYWFlMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnCkBAIC00Niw2ICs0Niw3IEBACiBDT05GSUdfQ0ZRX0dST1VQX0lPU0NIRUQ9eQogQ09ORklHX0RFRkFVTFRfREVBRExJTkU9eQogQ09ORklHX01BUkNIX1o5XzEwOT15CitDT05GSUdfTlJfQ1BVUz0yNTYKIENPTkZJR19QUkVFTVBUPXkKIENPTkZJR19IWl8xMDA9eQogQ09ORklHX01FTU9SWV9IT1RQTFVHPXkKQEAgLTU4LDcgKzU5LDYgQEAKIENPTkZJR19IT1RQTFVHX1BDSV9TMzkwPXkKIENPTkZJR19DSFNDX1NDSD15CiBDT05GSUdfQ1JBU0hfRFVNUD15Ci1DT05GSUdfWkZDUERVTVA9eQogIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAogQ09ORklHX0JJTkZNVF9NSVNDPW0KIENPTkZJR19ISUJFUk5BVElPTj15CkBAIC0xMDEsNyArMTAxLDYgQEAKIENPTkZJR19UQ1BfQ09OR19ZRUFIPW0KIENPTkZJR19UQ1BfQ09OR19JTExJTk9JUz1tCiBDT05GSUdfSVBWNj15Ci1DT05GSUdfSVBWNl9QUklWQUNZPXkKIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKIENPTkZJR19JTkVUNl9BSD1tCiBDT05GSUdfSU5FVDZfRVNQPW0KQEAgLTExMSw2ICsxMTAsNyBAQAogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049bQorQ09ORklHX0lQVjZfVlRJPW0KIENPTkZJR19JUFY2X1NJVD1tCiBDT05GSUdfSVBWNl9HUkU9bQogQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTPXkKQEAgLTEzNSw3ICsxMzUsMTcgQEAKIENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD1tCiBDT05GSUdfTkZfQ1RfTkVUTElOSz1tCiBDT05GSUdfTkZfQ1RfTkVUTElOS19USU1FT1VUPW0KLUNPTkZJR19ORVRGSUxURVJfVFBST1hZPW0KK0NPTkZJR19ORl9UQUJMRVM9bQorQ09ORklHX05GVF9FWFRIRFI9bQorQ09ORklHX05GVF9NRVRBPW0KK0NPTkZJR19ORlRfQ1Q9bQorQ09ORklHX05GVF9SQlRSRUU9bQorQ09ORklHX05GVF9IQVNIPW0KK0NPTkZJR19ORlRfQ09VTlRFUj1tCitDT05GSUdfTkZUX0xPRz1tCitDT05GSUdfTkZUX0xJTUlUPW0KK0NPTkZJR19ORlRfTkFUPW0KK0NPTkZJR19ORlRfQ09NUEFUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfU0VUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0FVRElUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NIRUNLU1VNPW0KQEAgLTIwNCw3ICsyMTQsOSBAQAogQ09ORklHX0lQX1NFVF9IQVNIX0lQUE9SVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfSVBQT1JUSVA9bQogQ09ORklHX0lQX1NFVF9IQVNIX0lQUE9SVE5FVD1tCitDT05GSUdfSVBfU0VUX0hBU0hfTkVUUE9SVE5FVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUPW0KK0NPTkZJR19JUF9TRVRfSEFTSF9ORVRORVQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX05FVFBPUlQ9bQogQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFPW0KIENPTkZJR19JUF9TRVRfTElTVF9TRVQ9bQpAQCAtMjI3LDYgKzIzOSwxMSBAQAogQ09ORklHX0lQX1ZTX1BFX1NJUD1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQ9bQogIyBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19ORl9UQUJMRVNfSVBWND1tCitDT05GSUdfTkZUX1JFSkVDVF9JUFY0PW0KK0NPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCitDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY0PW0KK0NPTkZJR19ORl9UQUJMRVNfQVJQPW0KIENPTkZJR19JUF9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQX05GX01BVENIX0VDTj1tCkBAIC0yNDksNiArMjY2LDkgQEAKIENPTkZJR19JUF9ORl9BUlBGSUxURVI9bQogQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KK0NPTkZJR19ORl9UQUJMRVNfSVBWNj1tCitDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQorQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQogQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND1tCkBAIC0yNjgsNiArMjg4LDcgQEAKIENPTkZJR19ORl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19JUDZfTkZfVEFSR0VUX05QVD1tCitDT05GSUdfTkZfVEFCTEVTX0JSSURHRT1tCiBDT05GSUdfTkVUX1NDVFBQUk9CRT1tCiBDT05GSUdfUkRTPW0KIENPTkZJR19SRFNfUkRNQT1tCkBAIC0zMTQsNiArMzM1LDcgQEAKIENPTkZJR19ORVRfQ0xTX1JTVlA2PW0KIENPTkZJR19ORVRfQ0xTX0ZMT1c9bQogQ09ORklHX05FVF9DTFNfQ0dST1VQPXkKK0NPTkZJR19ORVRfQ0xTX0JQRj1tCiBDT05GSUdfTkVUX0NMU19BQ1Q9eQogQ09ORklHX05FVF9BQ1RfUE9MSUNFPW0KIENPTkZJR19ORVRfQUNUX0dBQ1Q9bQpAQCAtMzgxLDggKzQwMyw4IEBACiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KIENPTkZJR19ETV9NSVJST1I9bQotQ09ORklHX0RNX1JBSUQ9bQogQ09ORklHX0RNX0xPR19VU0VSU1BBQ0U9bQorQ09ORklHX0RNX1JBSUQ9bQogQ09ORklHX0RNX1pFUk89bQogQ09ORklHX0RNX01VTFRJUEFUSD1tCiBDT05GSUdfRE1fTVVMVElQQVRIX1FMPW0KQEAgLTQzNCw3ICs0NTYsNiBAQAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CiBDT05GSUdfU09GVF9XQVRDSERPRz1tCi1DT05GSUdfWlZNX1dBVENIRE9HPW0KICMgQ09ORklHX0hJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfSU5GSU5JQkFORD1tCkBAIC01MzQsMTMgKzU1NSwyMyBAQAogQ09ORklHX01BR0lDX1NZU1JRPXkKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFQlVHX1BBR0VBTExPQz15CitDT05GSUdfREVCVUdfT0JKRUNUUz15CitDT05GSUdfREVCVUdfT0JKRUNUU19TRUxGVEVTVD15CitDT05GSUdfREVCVUdfT0JKRUNUU19GUkVFPXkKK0NPTkZJR19ERUJVR19PQkpFQ1RTX1RJTUVSUz15CitDT05GSUdfREVCVUdfT0JKRUNUU19XT1JLPXkKK0NPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEPXkKK0NPTkZJR19ERUJVR19PQkpFQ1RTX1BFUkNQVV9DT1VOVEVSPXkKIENPTkZJR19TTFVCX0RFQlVHX09OPXkKIENPTkZJR19TTFVCX1NUQVRTPXkKK0NPTkZJR19ERUJVR19LTUVNTEVBSz15CiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0U9eQogQ09ORklHX0RFQlVHX1ZNPXkKIENPTkZJR19ERUJVR19WTV9SQj15CiBDT05GSUdfTUVNT1JZX05PVElGSUVSX0VSUk9SX0lOSkVDVD1tCiBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTPXkKK0NPTkZJR19ERUJVR19TSElSUT15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CiBDT05GSUdfVElNRVJfU1RBVFM9eQogQ09ORklHX0RFQlVHX1JUX01VVEVYRVM9eQogQ09ORklHX1JUX01VVEVYX1RFU1RFUj15CkBAIC01NzMsOSArNjA0LDExIEBACiBDT05GSUdfQkxLX0RFVl9JT19UUkFDRT15CiAjIENPTkZJR19LUFJPQkVfRVZFTlQgaXMgbm90IHNldAogQ09ORklHX0xLRFRNPW0KK0NPTkZJR19URVNUX0xJU1RfU09SVD15CiBDT05GSUdfS1BST0JFU19TQU5JVFlfVEVTVD15Ci1DT05GSUdfUkJUUkVFX1RFU1Q9bQorQ09ORklHX1JCVFJFRV9URVNUPXkKIENPTkZJR19JTlRFUlZBTF9UUkVFX1RFU1Q9bQorQ09ORklHX1BFUkNQVV9URVNUPW0KIENPTkZJR19BVE9NSUM2NF9TRUxGVEVTVD15CiBDT05GSUdfRE1BX0FQSV9ERUJVRz15CiAjIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKQEAgLTYzOCw3ICs2NzEsNiBAQAogQ09ORklHX0NSWVBUT19HSEFTSF9TMzkwPW0KIENPTkZJR19BU1lNTUVUUklDX0tFWV9UWVBFPW0KIENPTkZJR19BU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRT1tCi1DT05GSUdfUFVCTElDX0tFWV9BTEdPX1JTQT1tCiBDT05GSUdfWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVI9bQogQ09ORklHX0NSQzc9bQogQ09ORklHX0NSQzg9bQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZ2Nvdl9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZwppbmRleCBiOWY2YjRjLi5jODFhNzRlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZwpAQCAtNDYsNiArNDYsNyBAQAogQ09ORklHX0NGUV9HUk9VUF9JT1NDSEVEPXkKIENPTkZJR19ERUZBVUxUX0RFQURMSU5FPXkKIENPTkZJR19NQVJDSF9aOV8xMDk9eQorQ09ORklHX05SX0NQVVM9MjU2CiBDT05GSUdfSFpfMTAwPXkKIENPTkZJR19NRU1PUllfSE9UUExVRz15CiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRT15CkBAIC01Niw3ICs1Nyw2IEBACiBDT05GSUdfSE9UUExVR19QQ0lfUzM5MD15CiBDT05GSUdfQ0hTQ19TQ0g9eQogQ09ORklHX0NSQVNIX0RVTVA9eQotQ09ORklHX1pGQ1BEVU1QPXkKICMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfSElCRVJOQVRJT049eQpAQCAtOTksNyArOTksNiBAQAogQ09ORklHX1RDUF9DT05HX1lFQUg9bQogQ09ORklHX1RDUF9DT05HX0lMTElOT0lTPW0KIENPTkZJR19JUFY2PXkKLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQogQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQogQ09ORklHX0lORVQ2X0FIPW0KIENPTkZJR19JTkVUNl9FU1A9bQpAQCAtMTA5LDYgKzEwOCw3IEBACiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTj1tCitDT05GSUdfSVBWNl9WVEk9bQogQ09ORklHX0lQVjZfU0lUPW0KIENPTkZJR19JUFY2X0dSRT1tCiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQpAQCAtMTMzLDcgKzEzMywxNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9DVF9ORVRMSU5LPW0KIENPTkZJR19ORl9DVF9ORVRMSU5LX1RJTUVPVVQ9bQotQ09ORklHX05FVEZJTFRFUl9UUFJPWFk9bQorQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZUX0VYVEhEUj1tCitDT05GSUdfTkZUX01FVEE9bQorQ09ORklHX05GVF9DVD1tCitDT05GSUdfTkZUX1JCVFJFRT1tCitDT05GSUdfTkZUX0hBU0g9bQorQ09ORklHX05GVF9DT1VOVEVSPW0KK0NPTkZJR19ORlRfTE9HPW0KK0NPTkZJR19ORlRfTElNSVQ9bQorQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQVVESVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMjAyLDcgKzIxMiw5IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfSVBQT1JUPW0KIENPTkZJR19JUF9TRVRfSEFTSF9JUFBPUlRJUD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfSVBQT1JUTkVUPW0KK0NPTkZJR19JUF9TRVRfSEFTSF9ORVRQT1JUTkVUPW0KIENPTkZJR19JUF9TRVRfSEFTSF9ORVQ9bQorQ09ORklHX0lQX1NFVF9IQVNIX05FVE5FVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUUE9SVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCkBAIC0yMjUsNiArMjM3LDExIEBACiBDT05GSUdfSVBfVlNfUEVfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCiAjIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgaXMgbm90IHNldAorQ09ORklHX05GX1RBQkxFU19JUFY0PW0KK0NPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQorQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KK0NPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQorQ09ORklHX05GX1RBQkxFU19BUlA9bQogQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIENPTkZJR19JUF9ORl9NQVRDSF9BSD1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KQEAgLTI0Nyw2ICsyNjQsOSBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQorQ09ORklHX05GX1RBQkxFU19JUFY2PW0KK0NPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCitDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQNl9ORl9NQVRDSF9BSD1tCiBDT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KQEAgLTI2Niw2ICsyODYsNyBAQAogQ09ORklHX05GX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfVEFSR0VUX01BU1FVRVJBREU9bQogQ09ORklHX0lQNl9ORl9UQVJHRVRfTlBUPW0KK0NPTkZJR19ORl9UQUJMRVNfQlJJREdFPW0KIENPTkZJR19ORVRfU0NUUFBST0JFPW0KIENPTkZJR19SRFM9bQogQ09ORklHX1JEU19SRE1BPW0KQEAgLTMxMSw2ICszMzIsNyBAQAogQ09ORklHX05FVF9DTFNfUlNWUDY9bQogQ09ORklHX05FVF9DTFNfRkxPVz1tCiBDT05GSUdfTkVUX0NMU19DR1JPVVA9eQorQ09ORklHX05FVF9DTFNfQlBGPW0KIENPTkZJR19ORVRfQ0xTX0FDVD15CiBDT05GSUdfTkVUX0FDVF9QT0xJQ0U9bQogQ09ORklHX05FVF9BQ1RfR0FDVD1tCkBAIC0zNzgsOCArNDAwLDggQEAKIENPTkZJR19ETV9DUllQVD1tCiBDT05GSUdfRE1fU05BUFNIT1Q9bQogQ09ORklHX0RNX01JUlJPUj1tCi1DT05GSUdfRE1fUkFJRD1tCiBDT05GSUdfRE1fTE9HX1VTRVJTUEFDRT1tCitDT05GSUdfRE1fUkFJRD1tCiBDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRE1fTVVMVElQQVRIPW0KIENPTkZJR19ETV9NVUxUSVBBVEhfUUw9bQpAQCAtNDMxLDcgKzQ1Myw2IEBACiBDT05GSUdfV0FUQ0hET0c9eQogQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKIENPTkZJR19TT0ZUX1dBVENIRE9HPW0KLUNPTkZJR19aVk1fV0FUQ0hET0c9bQogIyBDT05GSUdfSElEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19JTkZJTklCQU5EPW0KQEAgLTU0MCw2ICs1NjEsNyBAQAogQ09ORklHX0xLRFRNPW0KIENPTkZJR19SQlRSRUVfVEVTVD1tCiBDT05GSUdfSU5URVJWQUxfVFJFRV9URVNUPW0KK0NPTkZJR19QRVJDUFVfVEVTVD1tCiBDT05GSUdfQVRPTUlDNjRfU0VMRlRFU1Q9eQogIyBDT05GSUdfU1RSSUNUX0RFVk1FTSBpcyBub3Qgc2V0CiBDT05GSUdfUzM5MF9QVERVTVA9eQpAQCAtNjAxLDcgKzYyMyw2IEBACiBDT05GSUdfQ1JZUFRPX0dIQVNIX1MzOTA9bQogQ09ORklHX0FTWU1NRVRSSUNfS0VZX1RZUEU9bQogQ09ORklHX0FTWU1NRVRSSUNfUFVCTElDX0tFWV9TVUJUWVBFPW0KLUNPTkZJR19QVUJMSUNfS0VZX0FMR09fUlNBPW0KIENPTkZJR19YNTA5X0NFUlRJRklDQVRFX1BBUlNFUj1tCiBDT05GSUdfQ1JDNz1tCiBDT05GSUdfQ1JDOD1tCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9wZXJmb3JtYW5jZV9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9wZXJmb3JtYW5jZV9kZWZjb25maWcKaW5kZXggOTEwODdiNC4uYjViYThmZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvcGVyZm9ybWFuY2VfZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9jb25maWdzL3BlcmZvcm1hbmNlX2RlZmNvbmZpZwpAQCAtNDQsNiArNDQsNyBAQAogQ09ORklHX0NGUV9HUk9VUF9JT1NDSEVEPXkKIENPTkZJR19ERUZBVUxUX0RFQURMSU5FPXkKIENPTkZJR19NQVJDSF9aOV8xMDk9eQorQ09ORklHX05SX0NQVVM9MjU2CiBDT05GSUdfSFpfMTAwPXkKIENPTkZJR19NRU1PUllfSE9UUExVRz15CiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRT15CkBAIC01NCw3ICs1NSw2IEBACiBDT05GSUdfSE9UUExVR19QQ0lfUzM5MD15CiBDT05GSUdfQ0hTQ19TQ0g9eQogQ09ORklHX0NSQVNIX0RVTVA9eQotQ09ORklHX1pGQ1BEVU1QPXkKICMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfSElCRVJOQVRJT049eQpAQCAtOTcsNyArOTcsNiBAQAogQ09ORklHX1RDUF9DT05HX1lFQUg9bQogQ09ORklHX1RDUF9DT05HX0lMTElOT0lTPW0KIENPTkZJR19JUFY2PXkKLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQogQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQogQ09ORklHX0lORVQ2X0FIPW0KIENPTkZJR19JTkVUNl9FU1A9bQpAQCAtMTA3LDYgKzEwNiw3IEBACiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCiBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTj1tCitDT05GSUdfSVBWNl9WVEk9bQogQ09ORklHX0lQVjZfU0lUPW0KIENPTkZJR19JUFY2X0dSRT1tCiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQpAQCAtMTMxLDcgKzEzMSwxNyBAQAogQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KIENPTkZJR19ORl9DVF9ORVRMSU5LPW0KIENPTkZJR19ORl9DVF9ORVRMSU5LX1RJTUVPVVQ9bQotQ09ORklHX05FVEZJTFRFUl9UUFJPWFk9bQorQ09ORklHX05GX1RBQkxFUz1tCitDT05GSUdfTkZUX0VYVEhEUj1tCitDT05GSUdfTkZUX01FVEE9bQorQ09ORklHX05GVF9DVD1tCitDT05GSUdfTkZUX1JCVFJFRT1tCitDT05GSUdfTkZUX0hBU0g9bQorQ09ORklHX05GVF9DT1VOVEVSPW0KK0NPTkZJR19ORlRfTE9HPW0KK0NPTkZJR19ORlRfTElNSVQ9bQorQ09ORklHX05GVF9OQVQ9bQorQ09ORklHX05GVF9DT01QQVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQVVESVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpAQCAtMjAwLDcgKzIxMCw5IEBACiBDT05GSUdfSVBfU0VUX0hBU0hfSVBQT1JUPW0KIENPTkZJR19JUF9TRVRfSEFTSF9JUFBPUlRJUD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfSVBQT1JUTkVUPW0KK0NPTkZJR19JUF9TRVRfSEFTSF9ORVRQT1JUTkVUPW0KIENPTkZJR19JUF9TRVRfSEFTSF9ORVQ9bQorQ09ORklHX0lQX1NFVF9IQVNIX05FVE5FVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUUE9SVD1tCiBDT05GSUdfSVBfU0VUX0hBU0hfTkVUSUZBQ0U9bQogQ09ORklHX0lQX1NFVF9MSVNUX1NFVD1tCkBAIC0yMjMsNiArMjM1LDExIEBACiBDT05GSUdfSVBfVlNfUEVfU0lQPW0KIENPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCiAjIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgaXMgbm90IHNldAorQ09ORklHX05GX1RBQkxFU19JUFY0PW0KK0NPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQorQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KK0NPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQorQ09ORklHX05GX1RBQkxFU19BUlA9bQogQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIENPTkZJR19JUF9ORl9NQVRDSF9BSD1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KQEAgLTI0NSw2ICsyNjIsOSBAQAogQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiBDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQorQ09ORklHX05GX1RBQkxFU19JUFY2PW0KK0NPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCitDT05GSUdfTkZUX0NIQUlOX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQNl9ORl9NQVRDSF9BSD1tCiBDT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KQEAgLTI2NCw2ICsyODQsNyBAQAogQ09ORklHX05GX05BVF9JUFY2PW0KIENPTkZJR19JUDZfTkZfVEFSR0VUX01BU1FVRVJBREU9bQogQ09ORklHX0lQNl9ORl9UQVJHRVRfTlBUPW0KK0NPTkZJR19ORl9UQUJMRVNfQlJJREdFPW0KIENPTkZJR19ORVRfU0NUUFBST0JFPW0KIENPTkZJR19SRFM9bQogQ09ORklHX1JEU19SRE1BPW0KQEAgLTMwOSw2ICszMzAsNyBAQAogQ09ORklHX05FVF9DTFNfUlNWUDY9bQogQ09ORklHX05FVF9DTFNfRkxPVz1tCiBDT05GSUdfTkVUX0NMU19DR1JPVVA9eQorQ09ORklHX05FVF9DTFNfQlBGPW0KIENPTkZJR19ORVRfQ0xTX0FDVD15CiBDT05GSUdfTkVUX0FDVF9QT0xJQ0U9bQogQ09ORklHX05FVF9BQ1RfR0FDVD1tCkBAIC0zNzYsOCArMzk4LDggQEAKIENPTkZJR19ETV9DUllQVD1tCiBDT05GSUdfRE1fU05BUFNIT1Q9bQogQ09ORklHX0RNX01JUlJPUj1tCi1DT05GSUdfRE1fUkFJRD1tCiBDT05GSUdfRE1fTE9HX1VTRVJTUEFDRT1tCitDT05GSUdfRE1fUkFJRD1tCiBDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRE1fTVVMVElQQVRIPW0KIENPTkZJR19ETV9NVUxUSVBBVEhfUUw9bQpAQCAtNDI5LDcgKzQ1MSw2IEBACiBDT05GSUdfV0FUQ0hET0c9eQogQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKIENPTkZJR19TT0ZUX1dBVENIRE9HPW0KLUNPTkZJR19aVk1fV0FUQ0hET0c9bQogIyBDT05GSUdfSElEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19JTkZJTklCQU5EPW0KQEAgLTUzMiw2ICs1NTMsNyBAQAogQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQogIyBDT05GSUdfS1BST0JFX0VWRU5UIGlzIG5vdCBzZXQKIENPTkZJR19MS0RUTT1tCitDT05GSUdfUEVSQ1BVX1RFU1Q9bQogQ09ORklHX0FUT01JQzY0X1NFTEZURVNUPXkKICMgQ09ORklHX1NUUklDVF9ERVZNRU0gaXMgbm90IHNldAogQ09ORklHX1MzOTBfUFREVU1QPXkKQEAgLTU5Myw3ICs2MTUsNiBAQAogQ09ORklHX0NSWVBUT19HSEFTSF9TMzkwPW0KIENPTkZJR19BU1lNTUVUUklDX0tFWV9UWVBFPW0KIENPTkZJR19BU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRT1tCi1DT05GSUdfUFVCTElDX0tFWV9BTEdPX1JTQT1tCiBDT05GSUdfWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVI9bQogQ09ORklHX0NSQzc9bQogQ09ORklHX0NSQzg9bQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvemZjcGR1bXBfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvemZjcGR1bXBfZGVmY29uZmlnCmluZGV4IGQ3MjVjNGQuLmNlZjA3M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL3pmY3BkdW1wX2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvY29uZmlncy96ZmNwZHVtcF9kZWZjb25maWcKQEAgLTE5LDcgKzE5LDYgQEAKICMgQ09ORklHX0NIU0NfU0NIIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDTV9CVVMgaXMgbm90IHNldAogQ09ORklHX0NSQVNIX0RVTVA9eQotQ09ORklHX1pGQ1BEVU1QPXkKICMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAogIyBDT05GSUdfSVVDViBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwppbmRleCAzM2Y1NzUxLi40NTU3Y2I3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTQwLDYgKzQwLDcgQEAKIENPTkZJR19JQk1fUEFSVElUSU9OPXkKIENPTkZJR19ERUZBVUxUX0RFQURMSU5FPXkKIENPTkZJR19NQVJDSF9aMTk2PXkKK0NPTkZJR19OUl9DUFVTPTI1NgogQ09ORklHX0haXzEwMD15CiBDT05GSUdfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX01FTU9SWV9IT1RSRU1PVkU9eQpAQCAtMTIyLDIyICsxMjMsMzEgQEAKIENPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQogQ09ORklHX0hVR0VUTEJGUz15CiAjIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19VTlVTRURfU1lNQk9MUz15CitDT05GSUdfREVCVUdfU0VDVElPTl9NSVNNQVRDSD15CiBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfREVCVUdfUEFHRUFMTE9DPXkKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19USU1FUl9TVEFUUz15CitDT05GSUdfREVCVUdfUlRfTVVURVhFUz15CiBDT05GSUdfUFJPVkVfTE9DS0lORz15CiBDT05GSUdfTE9DS19TVEFUPXkKIENPTkZJR19ERUJVR19MT0NLREVQPXkKK0NPTkZJR19ERUJVR19BVE9NSUNfU0xFRVA9eQorQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQ9eQogQ09ORklHX0RFQlVHX0xJU1Q9eQorQ09ORklHX0RFQlVHX1NHPXkKIENPTkZJR19ERUJVR19OT1RJRklFUlM9eQogQ09ORklHX1BST1ZFX1JDVT15CiBDT05GSUdfUkNVX0NQVV9TVEFMTF9USU1FT1VUPTYwCiBDT05GSUdfUkNVX1RSQUNFPXkKIENPTkZJR19MQVRFTkNZVE9QPXkKK0NPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15CiBDT05GSUdfQkxLX0RFVl9JT19UUkFDRT15CiBDT05GSUdfS1BST0JFU19TQU5JVFlfVEVTVD15CiAjIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TMzkwX1BURFVNUD15CiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCiBDT05GSUdfQ1JZUFRPX0FVVEhFTkM9bQogQ09ORklHX0NSWVBUT19URVNUPW0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9oeXBmcy9oeXBmc192bS5jIGIvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX3ZtLmMKaW5kZXggMjQ5MDhjZS4uMzIwNDBhYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX3ZtLmMKKysrIGIvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX3ZtLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAlfX3UzMiBwY3B1czsKIAlfX3UzMiBsY3B1czsKIAlfX3UzMiB2Y3B1czsKLQlfX3UzMiBjcHVfbWluOworCV9fdTMyIG9jcHVzOwogCV9fdTMyIGNwdV9tYXg7CiAJX191MzIgY3B1X3NoYXJlczsKIAlfX3UzMiBjcHVfdXNlX3NhbXA7CkBAIC0xNDIsNyArMTQyLDEyIEBACiAJQVRUUklCVVRFKGNwdXNfZGlyLCAiY2FwcGVkIiwgY2FwcGVkX3ZhbHVlKTsKIAlBVFRSSUJVVEUoY3B1c19kaXIsICJkZWRpY2F0ZWQiLCBkZWRpY2F0ZWRfZmxhZyk7CiAJQVRUUklCVVRFKGNwdXNfZGlyLCAiY291bnQiLCBkYXRhLT52Y3B1cyk7Ci0JQVRUUklCVVRFKGNwdXNfZGlyLCAid2VpZ2h0X21pbiIsIGRhdGEtPmNwdV9taW4pOworCS8qCisJICogTm90ZTogVGhlICJ3ZWlnaHRfbWluIiBhdHRyaWJ1dGUgZ290IHRoZSB3cm9uZyBuYW1lLgorCSAqIFRoZSB2YWx1ZSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2Ygbm9uLXN0b3BwZWQgKG9wZXJhdGluZykKKwkgKiBDUFVTLgorCSAqLworCUFUVFJJQlVURShjcHVzX2RpciwgIndlaWdodF9taW4iLCBkYXRhLT5vY3B1cyk7CiAJQVRUUklCVVRFKGNwdXNfZGlyLCAid2VpZ2h0X21heCIsIGRhdGEtPmNwdV9tYXgpOwogCUFUVFJJQlVURShjcHVzX2RpciwgIndlaWdodF9jdXIiLCBkYXRhLT5jcHVfc2hhcmVzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggODM4NmE0YS4uNTc4OTJhOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDYgKzEsNyBAQAogCiAKIGdlbmVyaWMteSArPSBjbGtkZXYuaAotZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IHRyYWNlX2Nsb2NrLmgKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9haXJxLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYWlycS5oCmluZGV4IDRiYmI1OTUuLmJkOTNmZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9haXJxLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2FpcnEuaApAQCAtNDQsMTEgKzQ0LDIxIEBACiAKIHN0cnVjdCBhaXJxX2l2ICphaXJxX2l2X2NyZWF0ZSh1bnNpZ25lZCBsb25nIGJpdHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBhaXJxX2l2X3JlbGVhc2Uoc3RydWN0IGFpcnFfaXYgKml2KTsKLXVuc2lnbmVkIGxvbmcgYWlycV9pdl9hbGxvY19iaXQoc3RydWN0IGFpcnFfaXYgKml2KTsKLXZvaWQgYWlycV9pdl9mcmVlX2JpdChzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgYml0KTsKK3Vuc2lnbmVkIGxvbmcgYWlycV9pdl9hbGxvYyhzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgbnVtKTsKK3ZvaWQgYWlycV9pdl9mcmVlKHN0cnVjdCBhaXJxX2l2ICppdiwgdW5zaWduZWQgbG9uZyBiaXQsIHVuc2lnbmVkIGxvbmcgbnVtKTsKIHVuc2lnbmVkIGxvbmcgYWlycV9pdl9zY2FuKHN0cnVjdCBhaXJxX2l2ICppdiwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFpcnFfaXZfYWxsb2NfYml0KHN0cnVjdCBhaXJxX2l2ICppdikKK3sKKwlyZXR1cm4gYWlycV9pdl9hbGxvYyhpdiwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhaXJxX2l2X2ZyZWVfYml0KHN0cnVjdCBhaXJxX2l2ICppdiwgdW5zaWduZWQgbG9uZyBiaXQpCit7CisJYWlycV9pdl9mcmVlKGl2LCBiaXQsIDEpOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWlycV9pdl9lbmQoc3RydWN0IGFpcnFfaXYgKml2KQogewogCXJldHVybiBpdi0+ZW5kOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2JpdG9wcy5oCmluZGV4IDZlNmFkMDYuLmVjNWVmODkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTEzLDkgKzEzLDkgQEAKICAqCiAgKiBUaGUgYml0b3AgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHRvIHdvcmsgb24gdW5zaWduZWQgbG9uZ3MsIHNvIGZvciBhbgogICogczM5MHggc3lzdGVtIHRoZSBiaXRzIGVuZCB1cCBudW1iZXJlZDoKLSAqICAgfDYzLi4uLi4uLi4uLi4uLi4wfDEyNy4uLi4uLi4uLi4uLjY0fDE5MS4uLi4uLi4uLi4uMTI4fDI1NS4uLi4uLi4uLi4uMTk2fAorICogICB8NjMuLi4uLi4uLi4uLi4uLjB8MTI3Li4uLi4uLi4uLi4uNjR8MTkxLi4uLi4uLi4uLi4xMjh8MjU1Li4uLi4uLi4uLi4xOTJ8CiAgKiBhbmQgb24gczM5MDoKLSAqICAgfDMxLi4uLi4wfDYzLi4uLjMxfDk1Li4uLjY0fDEyNy4uLjk2fDE1OS4uMTI4fDE5MS4uMTYwfDIyMy4uMTkyfDI1NS4uMjI0fAorICogICB8MzEuLi4uLjB8NjMuLi4uMzJ8OTUuLi4uNjR8MTI3Li4uOTZ8MTU5Li4xMjh8MTkxLi4xNjB8MjIzLi4xOTJ8MjU1Li4yMjR8CiAgKgogICogVGhlcmUgYXJlIGEgZmV3IGxpdHRsZS1lbmRpYW4gbWFjcm9zIHVzZWQgbW9zdGx5IGZvciBmaWxlc3lzdGVtCiAgKiBiaXRtYXBzLCB0aGVzZSB3b3JrIG9uIHNpbWlsYXIgYml0IGFycmF5cyBsYXlvdXRzLCBidXQKQEAgLTMwLDcgKzMwLDcgQEAKICAqIG9uIGFuIHMzOTB4IHN5c3RlbSB0aGUgYml0cyBhcmUgbnVtYmVyZWQ6CiAgKiAgIHwwLi4uLi4uLi4uLi4uLi42M3w2NC4uLi4uLi4uLi4uLjEyN3wxMjguLi4uLi4uLi4uLjE5MXwxOTIuLi4uLi4uLi4uLjI1NXwKICAqIGFuZCBvbiBzMzkwOgotICogICB8MC4uLi4uMzF8MzEuLi4uNjN8NjQuLi4uOTV8OTYuLi4xMjd8MTI4Li4xNTl8MTYwLi4xOTF8MTkyLi4yMjN8MjI0Li4yNTV8CisgKiAgIHwwLi4uLi4zMXwzMi4uLi42M3w2NC4uLi45NXw5Ni4uLjEyN3wxMjguLjE1OXwxNjAuLjE5MXwxOTIuLjIyM3wyMjQuLjI1NXwKICAqCiAgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgYml0IDAtNjMgKDY0Yikgb3IgMC0zMSAoMzJiKSBpbiB0aGUgYml0CiAgKiBudW1iZXIgZmllbGQgbmVlZHMgdG8gYmUgcmV2ZXJzZWQgY29tcGFyZWQgdG8gdGhlIExTQjAgZW5jb2RlZCBiaXQKQEAgLTMwNCw3ICszMDQsNyBAQAogICogT24gYW4gczM5MHggc3lzdGVtIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKICAqICAgfDAuLi4uLi4uLi4uLi4uLjYzfDY0Li4uLi4uLi4uLi4uMTI3fDEyOC4uLi4uLi4uLi4uMTkxfDE5Mi4uLi4uLi4uLi4uMjU1fAogICogYW5kIG9uIHMzOTA6Ci0gKiAgIHwwLi4uLi4zMXwzMS4uLi42M3w2NC4uLi45NXw5Ni4uLjEyN3wxMjguLjE1OXwxNjAuLjE5MXwxOTIuLjIyM3wyMjQuLjI1NXwKKyAqICAgfDAuLi4uLjMxfDMyLi4uLjYzfDY0Li4uLjk1fDk2Li4uMTI3fDEyOC4uMTU5fDE2MC4uMTkxfDE5Mi4uMjIzfDIyNC4uMjU1fAogICovCiB1bnNpZ25lZCBsb25nIGZpbmRfZmlyc3RfYml0X2ludihjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogdW5zaWduZWQgbG9uZyBmaW5kX25leHRfYml0X2ludihjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3ZGV2LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3ZGV2LmgKaW5kZXggZjIwMWFmOC4uYTljMmMwNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2Rldi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dkZXYuaApAQCAtMjE5LDcgKzIxOSw5IEBACiAjZGVmaW5lIHRvX2Njd2RldihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IGNjd19kZXZpY2UsIGRldikKICNkZWZpbmUgdG9fY2N3ZHJ2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgY2N3X2RyaXZlciwgZHJpdmVyKQogCi1leHRlcm4gc3RydWN0IGNjd19kZXZpY2UgKmNjd19kZXZpY2VfcHJvYmVfY29uc29sZSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgY2N3X2RldmljZSAqY2N3X2RldmljZV9jcmVhdGVfY29uc29sZShzdHJ1Y3QgY2N3X2RyaXZlciAqKTsKK2V4dGVybiB2b2lkIGNjd19kZXZpY2VfZGVzdHJveV9jb25zb2xlKHN0cnVjdCBjY3dfZGV2aWNlICopOworZXh0ZXJuIGludCBjY3dfZGV2aWNlX2VuYWJsZV9jb25zb2xlKHN0cnVjdCBjY3dfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgY2N3X2RldmljZV93YWl0X2lkbGUoc3RydWN0IGNjd19kZXZpY2UgKik7CiBleHRlcm4gaW50IGNjd19kZXZpY2VfZm9yY2VfY29uc29sZShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2dyb3VwLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3Z3JvdXAuaAppbmRleCAyMzcyM2NlLi42ZTY3MGY4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3Z3JvdXAuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3Z3JvdXAuaApAQCAtMjMsNiArMjMsNyBAQAogCXVuc2lnbmVkIGludCBjb3VudDsKIAlzdHJ1Y3QgZGV2aWNlCWRldjsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldlswXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdW5ncm91cF93b3JrOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hlY2tzdW0uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmluZGV4IDRmNTdhNGYuLjc0MDM2NDggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCkBAIC00NCwyMiArNDQsMTUgQEAKICAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqCi0gKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCi0gKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KKyAqIENvcHkgZnJvbSB1c2Vyc3BhY2UgYW5kIGNvbXB1dGUgY2hlY2tzdW0uCiAgKi8KIHN0YXRpYyBpbmxpbmUgX193c3VtCiBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZXJyX3B0cikKIHsKLQlpbnQgbWlzc2luZzsKLQotCW1pc3NpbmcgPSBjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKTsKLQlpZiAobWlzc2luZykgewotCQltZW1zZXQoZHN0ICsgbGVuIC0gbWlzc2luZywgMCwgbWlzc2luZyk7CisJaWYgKHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pKSkKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwotCX0KLQkJCiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IDVkN2U4Y2YuLmQzNTBlZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTgsNyArOCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAKICNkZWZpbmUgX19UWVBFX0lTX1BUUih0KSAoIV9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AodHlwZW9mKDA/KHQpMDowVUxMKSwgdTY0KSkKLSNkZWZpbmUgX19TQ19ERUxPVVNFKHQsdikgKHQpKF9fVFlQRV9JU19QVFIodCkgPyAoKHYpICYgMHg3ZmZmZmZmZikgOiAodikpCisKKyNkZWZpbmUgX19TQ19ERUxPVVNFKHQsdikgKHsgXAorCUJVSUxEX0JVR19PTihzaXplb2YodCkgPiA0ICYmICFfX1RZUEVfSVNfUFRSKHQpKTsgXAorCSh0KShfX1RZUEVfSVNfUFRSKHQpID8gKCh2KSAmIDB4N2ZmZmZmZmYpIDogKHYpKTsgXAorfSkKIAogI2RlZmluZSBQU1czMl9NQVNLX1BFUgkJMHg0MDAwMDAwMFVMCiAjZGVmaW5lIFBTVzMyX01BU0tfREFUCQkweDA0MDAwMDAwVUwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mdXRleC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Z1dGV4LmgKaW5kZXggNTFiY2FhMC4uZmRhNDZiZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Z1dGV4LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Z1dGV4LmgKQEAgLTUsNyArNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAotc3RhdGljIGlubGluZSBpbnQgZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIHUzMiBfX3VzZXIgKnVhZGRyKQoraW50IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHUzMiAqdXZhbCwgdTMyIF9fdXNlciAqdWFkZHIsIHUzMiBvbGR2YWwsIHUzMiBuZXd2YWwpOworaW50IF9fZnV0ZXhfYXRvbWljX29wX2ludXNlcihpbnQgb3AsIHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgb3BhcmcsIGludCAqb2xkKTsKKworc3RhdGljIGlubGluZSBpbnQgZnV0ZXhfYXRvbWljX29wX2ludXNlcihpbnQgZW5jb2RlZF9vcCwgdTMyIF9fdXNlciAqdWFkZHIpCiB7CiAJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKIAlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CkBAIC0xNyw3ICsyMCw3IEBACiAJCW9wYXJnID0gMSA8PCBvcGFyZzsKIAogCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JcmV0ID0gdWFjY2Vzcy5mdXRleF9hdG9taWNfb3Aob3AsIHVhZGRyLCBvcGFyZywgJm9sZHZhbCk7CisJcmV0ID0gX19mdXRleF9hdG9taWNfb3BfaW51c2VyKG9wLCB1YWRkciwgb3BhcmcsICZvbGR2YWwpOwogCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAogCWlmICghcmV0KSB7CkBAIC0zNCwxMCArMzcsNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHUzMiAqdXZhbCwgdTMyIF9fdXNlciAqdWFkZHIsCi0JCQkJCQl1MzIgb2xkdmFsLCB1MzIgbmV3dmFsKQotewotCXJldHVybiB1YWNjZXNzLmZ1dGV4X2F0b21pY19jbXB4Y2hnKHV2YWwsIHVhZGRyLCBvbGR2YWwsIG5ld3ZhbCk7Ci19Ci0KICNlbmRpZiAvKiBfQVNNX1MzOTBfRlVURVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCBlZWYzZGQzLi45YmY5NWJiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaApAQCAtMTA2LDcgKzEwNiw5IEBACiAJX191NjQJZ2JlYTsJCQkvKiAweDAxODAgKi8KIAlfX3U4CXJlc2VydmVkMTg4WzI0XTsJLyogMHgwMTg4ICovCiAJX191MzIJZmFjOwkJCS8qIDB4MDFhMCAqLwotCV9fdTgJcmVzZXJ2ZWQxYTRbNjhdOwkvKiAweDAxYTQgKi8KKwlfX3U4CXJlc2VydmVkMWE0WzIwXTsJLyogMHgwMWE0ICovCisJX191NjQJY2JybG87CQkJLyogMHgwMWI4ICovCisJX191OAlyZXNlcnZlZDFjMFs0MF07CS8qIDB4MDFjMCAqLwogCV9fdTY0CWl0ZGJhOwkJCS8qIDB4MDFlOCAqLwogCV9fdTgJcmVzZXJ2ZWQxZjBbMTZdOwkvKiAweDAxZjAgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CkBAIC0xNTUsNiArMTU3LDcgQEAKIAl1MzIgaW5zdHJ1Y3Rpb25fc3RzaTsKIAl1MzIgaW5zdHJ1Y3Rpb25fc3RmbDsKIAl1MzIgaW5zdHJ1Y3Rpb25fdHByb3Q7CisJdTMyIGluc3RydWN0aW9uX2Vzc2E7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3Bfc2Vuc2U7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3Bfc2Vuc2VfcnVubmluZzsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9leHRlcm5hbF9jYWxsOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCA1ZDFmOTUwLi4zODE0OWI2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtNDgsMTMgKzQ4LDQyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCiAJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCWNwdW1hc2tfc2V0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG1tX2NwdW1hc2sobmV4dCkpOwotCXVwZGF0ZV9tbShuZXh0LCB0c2spOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAocHJldiA9PSBuZXh0KQorCQlyZXR1cm47CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZuZXh0LT5jb250ZXh0LmF0dGFjaF9jb3VudCkgPj4gMTYpIHsKKwkJLyogRGVsYXkgdXBkYXRlX21tIHVudGlsIGFsbCBUTEIgZmx1c2hlcyBhcmUgZG9uZS4gKi8KKwkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9UTEJfV0FJVCk7CisJfSBlbHNlIHsKKwkJY3B1bWFza19zZXRfY3B1KGNwdSwgbW1fY3B1bWFzayhuZXh0KSk7CisJCXVwZGF0ZV9tbShuZXh0LCB0c2spOworCQlpZiAobmV4dC0+Y29udGV4dC5mbHVzaF9tbSkKKwkJCS8qIEZsdXNoIHBlbmRpbmcgVExCcyAqLworCQkJX190bGJfZmx1c2hfbW0obmV4dCk7CisJfQogCWF0b21pY19kZWMoJnByZXYtPmNvbnRleHQuYXR0YWNoX2NvdW50KTsKIAlXQVJOX09OKGF0b21pY19yZWFkKCZwcmV2LT5jb250ZXh0LmF0dGFjaF9jb3VudCkgPCAwKTsKLQlhdG9taWNfaW5jKCZuZXh0LT5jb250ZXh0LmF0dGFjaF9jb3VudCk7Ci0JLyogQ2hlY2sgZm9yIFRMQnMgbm90IGZsdXNoZWQgeWV0ICovCi0JX190bGJfZmx1c2hfbW1fbGF6eShuZXh0KTsKK30KKworI2RlZmluZSBmaW5pc2hfYXJjaF9wb3N0X2xvY2tfc3dpdGNoIGZpbmlzaF9hcmNoX3Bvc3RfbG9ja19zd2l0Y2gKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaW5pc2hfYXJjaF9wb3N0X2xvY2tfc3dpdGNoKHZvaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdHNrLT5tbTsKKworCWlmICghdGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfVExCX1dBSVQpKQorCQlyZXR1cm47CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1RMQl9XQUlUKTsKKwl3aGlsZSAoYXRvbWljX3JlYWQoJm1tLT5jb250ZXh0LmF0dGFjaF9jb3VudCkgPj4gMTYpCisJCWNwdV9yZWxheCgpOworCisJY3B1bWFza19zZXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1fY3B1bWFzayhtbSkpOworCXVwZGF0ZV9tbShtbSwgdHNrKTsKKwlpZiAobW0tPmNvbnRleHQuZmx1c2hfbW0pCisJCV9fdGxiX2ZsdXNoX21tKG1tKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogfQogCiAjZGVmaW5lIGVudGVyX2xhenlfdGxiKG1tLHRzaykJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKaW5kZXggZTE0MDhkZC4uODg0MDE3YyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC0yMiw2ICsyMiw3IEBACiB2b2lkIHBhZ2VfdGFibGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcgKik7CiB2b2lkIHBhZ2VfdGFibGVfZnJlZV9yY3Uoc3RydWN0IG1tdV9nYXRoZXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKIAordm9pZCBwYWdlX3RhYmxlX3Jlc2V0X3Bnc3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBpbnQgc2V0X2d1ZXN0X3N0b3JhZ2Vfa2V5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgIHVuc2lnbmVkIGxvbmcga2V5LCBib29sIG5xKTsKIApAQCAtOTEsMTEgKzkyLDIyIEBACiBzdGF0aWMgaW5saW5lIHBtZF90ICpwbWRfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHZtYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nICp0YWJsZSA9IGNyc3RfdGFibGVfYWxsb2MobW0pOwotCWlmICh0YWJsZSkKLQkJY3JzdF90YWJsZV9pbml0KHRhYmxlLCBfU0VHTUVOVF9FTlRSWV9FTVBUWSk7CisKKwlpZiAoIXRhYmxlKQorCQlyZXR1cm4gTlVMTDsKKwljcnN0X3RhYmxlX2luaXQodGFibGUsIF9TRUdNRU5UX0VOVFJZX0VNUFRZKTsKKwlpZiAoIXBndGFibGVfcG1kX3BhZ2VfY3Rvcih2aXJ0X3RvX3BhZ2UodGFibGUpKSkgeworCQljcnN0X3RhYmxlX2ZyZWUobW0sIHRhYmxlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCXJldHVybiAocG1kX3QgKikgdGFibGU7CiB9Ci0jZGVmaW5lIHBtZF9mcmVlKG1tLCBwbWQpIGNyc3RfdGFibGVfZnJlZShtbSwgKHVuc2lnbmVkIGxvbmcgKikgcG1kKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQpCit7CisJcGd0YWJsZV9wbWRfcGFnZV9kdG9yKHZpcnRfdG9fcGFnZShwbWQpKTsKKwljcnN0X3RhYmxlX2ZyZWUobW0sICh1bnNpZ25lZCBsb25nICopIHBtZCk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QsIHB1ZF90ICpwdWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAyMjA0NDAwLi4xYWI3NWVhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTIyOSw2ICsyMjksNyBAQAogI2RlZmluZSBfUEFHRV9SRUFECTB4MDEwCQkvKiBTVyBwdGUgcmVhZCBiaXQgKi8KICNkZWZpbmUgX1BBR0VfV1JJVEUJMHgwMjAJCS8qIFNXIHB0ZSB3cml0ZSBiaXQgKi8KICNkZWZpbmUgX1BBR0VfU1BFQ0lBTAkweDA0MAkJLyogU1cgYXNzb2NpYXRlZCB3aXRoIHNwZWNpYWwgcGFnZSAqLworI2RlZmluZSBfUEFHRV9VTlVTRUQJMHgwODAJCS8qIFNXIGJpdCBmb3IgcGdzdGUgdXNhZ2Ugc3RhdGUgKi8KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NQRUNJQUwKIAogLyogU2V0IG9mIGJpdHMgbm90IGNoYW5nZWQgaW4gcHRlX21vZGlmeSAqLwpAQCAtMzk0LDYgKzM5NSwxMiBAQAogCiAjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKKy8qIEd1ZXN0IFBhZ2UgU3RhdGUgdXNlZCBmb3IgdmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgX1BHU1RFX0dQU19aRVJPCQkweDAwMDAwMDAwODAwMDAwMDBVTAorI2RlZmluZSBfUEdTVEVfR1BTX1VTQUdFX01BU0sJMHgwMDAwMDAwMDAzMDAwMDAwVUwKKyNkZWZpbmUgX1BHU1RFX0dQU19VU0FHRV9TVEFCTEUgMHgwMDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgX1BHU1RFX0dQU19VU0FHRV9VTlVTRUQgMHgwMDAwMDAwMDAxMDAwMDAwVUwKKwogLyoKICAqIEEgdXNlciBwYWdlIHRhYmxlIHBvaW50ZXIgaGFzIHRoZSBzcGFjZS1zd2l0Y2gtZXZlbnQgYml0LCB0aGUKICAqIHByaXZhdGUtc3BhY2UtY29udHJvbCBiaXQgYW5kIHRoZSBzdG9yYWdlLWFsdGVyYXRpb24tZXZlbnQtY29udHJvbApAQCAtNjE3LDYgKzYyNCwxNCBAQAogCXJldHVybiBwdGVfdmFsKHB0ZSkgPT0gX1BBR0VfSU5WQUxJRDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcHRlX3N3YXAocHRlX3QgcHRlKQoreworCS8qIEJpdCBwYXR0ZXJuOiAocHRlICYgMHg2MDMpID09IDB4NDAyICovCisJcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiAoX1BBR0VfSU5WQUxJRCB8IF9QQUdFX1BST1RFQ1QgfAorCQkJCV9QQUdFX1RZUEUgfCBfUEFHRV9QUkVTRU5UKSkKKwkJPT0gKF9QQUdFX0lOVkFMSUQgfCBfUEFHRV9UWVBFKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQogewogCS8qIEJpdCBwYXR0ZXJuOiAocHRlICYgMHg2MDEpID09IDB4NjAwICovCkBAIC04MjEsMjAgKzgzNiwyMCBAQAogdW5zaWduZWQgbG9uZyBfX2dtYXBfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZ21hcCAqKTsKIHVuc2lnbmVkIGxvbmcgZ21hcF9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBnbWFwICopOwogdm9pZCBnbWFwX2Rpc2NhcmQodW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIHRvLCBzdHJ1Y3QgZ21hcCAqKTsKK3ZvaWQgX19nbWFwX3phcCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBnbWFwICopOwogCiB2b2lkIGdtYXBfcmVnaXN0ZXJfaXB0ZV9ub3RpZmllcihzdHJ1Y3QgZ21hcF9ub3RpZmllciAqKTsKIHZvaWQgZ21hcF91bnJlZ2lzdGVyX2lwdGVfbm90aWZpZXIoc3RydWN0IGdtYXBfbm90aWZpZXIgKik7CiBpbnQgZ21hcF9pcHRlX25vdGlmeShzdHJ1Y3QgZ21hcCAqLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbik7Ci12b2lkIGdtYXBfZG9faXB0ZV9ub3RpZnkoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICopOwordm9pZCBnbWFwX2RvX2lwdGVfbm90aWZ5KHN0cnVjdCBtbV9zdHJ1Y3QgKiwgcHRlX3QgKik7CiAKIHN0YXRpYyBpbmxpbmUgcGdzdGVfdCBwZ3N0ZV9pcHRlX25vdGlmeShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCQkJdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCQlwdGVfdCAqcHRlcCwgcGdzdGVfdCBwZ3N0ZSkKIHsKICNpZmRlZiBDT05GSUdfUEdTVEUKIAlpZiAocGdzdGVfdmFsKHBnc3RlKSAmIFBHU1RFX0lOX0JJVCkgewogCQlwZ3N0ZV92YWwocGdzdGUpICY9IH5QR1NURV9JTl9CSVQ7Ci0JCWdtYXBfZG9faXB0ZV9ub3RpZnkobW0sIGFkZHIsIHB0ZXApOworCQlnbWFwX2RvX2lwdGVfbm90aWZ5KG1tLCBwdGVwKTsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gcGdzdGU7CkBAIC04NTIsNiArODY3LDcgQEAKIAogCWlmIChtbV9oYXNfcGdzdGUobW0pKSB7CiAJCXBnc3RlID0gcGdzdGVfZ2V0X2xvY2socHRlcCk7CisJCXBnc3RlX3ZhbChwZ3N0ZSkgJj0gfl9QR1NURV9HUFNfWkVSTzsKIAkJcGdzdGVfc2V0X2tleShwdGVwLCBwZ3N0ZSwgZW50cnkpOwogCQlwZ3N0ZV9zZXRfcHRlKHB0ZXAsIGVudHJ5KTsKIAkJcGdzdGVfc2V0X3VubG9jayhwdGVwLCBwZ3N0ZSk7CkBAIC04ODEsNiArODk3LDEyIEBACiAJcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ZT1VORykgIT0gMDsKIH0KIAorI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfVU5VU0VECitzdGF0aWMgaW5saW5lIGludCBwdGVfdW51c2VkKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVU5VU0VEOworfQorCiAvKgogICogcGdkL3BtZC9wdGUgbW9kaWZpY2F0aW9uIGZ1bmN0aW9ucwogICovCkBAIC0xMDM0LDMwICsxMDU2LDQxIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQogewotCWlmICghKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfSU5WQUxJRCkpIHsKKwl1bnNpZ25lZCBsb25nIHB0byA9ICh1bnNpZ25lZCBsb25nKSBwdGVwOworCiAjaWZuZGVmIENPTkZJR182NEJJVAotCQkvKiBwdG8gbXVzdCBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIHNlZ21lbnQgdGFibGUgKi8KLQkJcHRlX3QgKnB0byA9IChwdGVfdCAqKSAoKCh1bnNpZ25lZCBsb25nKSBwdGVwKSAmIDB4N2ZmZmZjMDApOwotI2Vsc2UKLQkJLyogaXB0ZSBpbiB6YXJjaCBtb2RlIGNhbiBkbyB0aGUgbWF0aCAqLwotCQlwdGVfdCAqcHRvID0gcHRlcDsKKwkvKiBwdG8gaW4gRVNBIG1vZGUgbXVzdCBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIHNlZ21lbnQgdGFibGUgKi8KKwlwdG8gJj0gMHg3ZmZmZmMwMDsKICNlbmRpZgotCQlhc20gdm9sYXRpbGUoCi0JCQkiCWlwdGUJJTIsJTMiCi0JCQk6ICI9bSIgKCpwdGVwKSA6ICJtIiAoKnB0ZXApLAotCQkJICAiYSIgKHB0byksICJhIiAoYWRkcmVzcykpOwotCX0KKwkvKiBJbnZhbGlkYXRpb24gKyBnbG9iYWwgVExCIGZsdXNoIGZvciB0aGUgcHRlICovCisJYXNtIHZvbGF0aWxlKAorCQkiCWlwdGUJJTIsJTMiCisJCTogIj1tIiAoKnB0ZXApIDogIm0iICgqcHRlcCksICJhIiAocHRvKSwgImEiIChhZGRyZXNzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX2ZsdXNoX2RpcmVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXApCit7CisJaWYgKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfSU5WQUxJRCkKKwkJcmV0dXJuOworCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlcF9mbHVzaF9sYXp5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXApCiB7Ci0JaW50IGFjdGl2ZSA9IChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pID8gMSA6IDA7CisJaW50IGFjdGl2ZSwgY291bnQ7CiAKLQlpZiAoYXRvbWljX3JlYWQoJm1tLT5jb250ZXh0LmF0dGFjaF9jb3VudCkgPiBhY3RpdmUpCi0JCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOwotCWVsc2UKKwlpZiAocHRlX3ZhbCgqcHRlcCkgJiBfUEFHRV9JTlZBTElEKQorCQlyZXR1cm47CisJYWN0aXZlID0gKG1tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkgPyAxIDogMDsKKwljb3VudCA9IGF0b21pY19hZGRfcmV0dXJuKDB4MTAwMDAsICZtbS0+Y29udGV4dC5hdHRhY2hfY291bnQpOworCWlmICgoY291bnQgJiAweGZmZmYpIDw9IGFjdGl2ZSkgeworCQlwdGVfdmFsKCpwdGVwKSB8PSBfUEFHRV9JTlZBTElEOwogCQltbS0+Y29udGV4dC5mbHVzaF9tbSA9IDE7CisJfSBlbHNlCisJCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOworCWF0b21pY19zdWIoMHgxMDAwMCwgJm1tLT5jb250ZXh0LmF0dGFjaF9jb3VudCk7CiB9CiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwpAQCAtMTA3MCwxMSArMTEwMywxMSBAQAogCiAJaWYgKG1tX2hhc19wZ3N0ZSh2bWEtPnZtX21tKSkgewogCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOwotCQlwZ3N0ZSA9IHBnc3RlX2lwdGVfbm90aWZ5KHZtYS0+dm1fbW0sIGFkZHIsIHB0ZXAsIHBnc3RlKTsKKwkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeSh2bWEtPnZtX21tLCBwdGVwLCBwZ3N0ZSk7CiAJfQogCiAJcHRlID0gKnB0ZXA7Ci0JX19wdGVwX2lwdGUoYWRkciwgcHRlcCk7CisJcHRlcF9mbHVzaF9kaXJlY3Qodm1hLT52bV9tbSwgYWRkciwgcHRlcCk7CiAJeW91bmcgPSBwdGVfeW91bmcocHRlKTsKIAlwdGUgPSBwdGVfbWtvbGQocHRlKTsKIApAQCAtMTExNiw3ICsxMTQ5LDcgQEAKIAogCWlmIChtbV9oYXNfcGdzdGUobW0pKSB7CiAJCXBnc3RlID0gcGdzdGVfZ2V0X2xvY2socHRlcCk7Ci0JCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkobW0sIGFkZHJlc3MsIHB0ZXAsIHBnc3RlKTsKKwkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeShtbSwgcHRlcCwgcGdzdGUpOwogCX0KIAogCXB0ZSA9ICpwdGVwOwpAQCAtMTE0MCwxMiArMTE3MywxMSBAQAogCiAJaWYgKG1tX2hhc19wZ3N0ZShtbSkpIHsKIAkJcGdzdGUgPSBwZ3N0ZV9nZXRfbG9jayhwdGVwKTsKLQkJcGdzdGVfaXB0ZV9ub3RpZnkobW0sIGFkZHJlc3MsIHB0ZXAsIHBnc3RlKTsKKwkJcGdzdGVfaXB0ZV9ub3RpZnkobW0sIHB0ZXAsIHBnc3RlKTsKIAl9CiAKIAlwdGUgPSAqcHRlcDsKIAlwdGVwX2ZsdXNoX2xhenkobW0sIGFkZHJlc3MsIHB0ZXApOwotCXB0ZV92YWwoKnB0ZXApIHw9IF9QQUdFX0lOVkFMSUQ7CiAKIAlpZiAobW1faGFzX3Bnc3RlKG1tKSkgewogCQlwZ3N0ZSA9IHBnc3RlX3VwZGF0ZV9hbGwoJnB0ZSwgcGdzdGUpOwpAQCAtMTE3OCwxNCArMTIxMCwxNyBAQAogCiAJaWYgKG1tX2hhc19wZ3N0ZSh2bWEtPnZtX21tKSkgewogCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOwotCQlwZ3N0ZSA9IHBnc3RlX2lwdGVfbm90aWZ5KHZtYS0+dm1fbW0sIGFkZHJlc3MsIHB0ZXAsIHBnc3RlKTsKKwkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeSh2bWEtPnZtX21tLCBwdGVwLCBwZ3N0ZSk7CiAJfQogCiAJcHRlID0gKnB0ZXA7Ci0JX19wdGVwX2lwdGUoYWRkcmVzcywgcHRlcCk7CisJcHRlcF9mbHVzaF9kaXJlY3Qodm1hLT52bV9tbSwgYWRkcmVzcywgcHRlcCk7CiAJcHRlX3ZhbCgqcHRlcCkgPSBfUEFHRV9JTlZBTElEOwogCiAJaWYgKG1tX2hhc19wZ3N0ZSh2bWEtPnZtX21tKSkgeworCQlpZiAoKHBnc3RlX3ZhbChwZ3N0ZSkgJiBfUEdTVEVfR1BTX1VTQUdFX01BU0spID09CisJCSAgICBfUEdTVEVfR1BTX1VTQUdFX1VOVVNFRCkKKwkJCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VTlVTRUQ7CiAJCXBnc3RlID0gcGdzdGVfdXBkYXRlX2FsbCgmcHRlLCBwZ3N0ZSk7CiAJCXBnc3RlX3NldF91bmxvY2socHRlcCwgcGdzdGUpOwogCX0KQEAgLTEyMDksNyArMTI0NCw3IEBACiAKIAlpZiAoIWZ1bGwgJiYgbW1faGFzX3Bnc3RlKG1tKSkgewogCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOwotCQlwZ3N0ZSA9IHBnc3RlX2lwdGVfbm90aWZ5KG1tLCBhZGRyZXNzLCBwdGVwLCBwZ3N0ZSk7CisJCXBnc3RlID0gcGdzdGVfaXB0ZV9ub3RpZnkobW0sIHB0ZXAsIHBnc3RlKTsKIAl9CiAKIAlwdGUgPSAqcHRlcDsKQEAgLTEyMzQsNyArMTI2OSw3IEBACiAJaWYgKHB0ZV93cml0ZShwdGUpKSB7CiAJCWlmIChtbV9oYXNfcGdzdGUobW0pKSB7CiAJCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOwotCQkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeShtbSwgYWRkcmVzcywgcHRlcCwgcGdzdGUpOworCQkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeShtbSwgcHRlcCwgcGdzdGUpOwogCQl9CiAKIAkJcHRlcF9mbHVzaF9sYXp5KG1tLCBhZGRyZXNzLCBwdGVwKTsKQEAgLTEyNjAsMTAgKzEyOTUsMTAgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKG1tX2hhc19wZ3N0ZSh2bWEtPnZtX21tKSkgewogCQlwZ3N0ZSA9IHBnc3RlX2dldF9sb2NrKHB0ZXApOwotCQlwZ3N0ZSA9IHBnc3RlX2lwdGVfbm90aWZ5KHZtYS0+dm1fbW0sIGFkZHJlc3MsIHB0ZXAsIHBnc3RlKTsKKwkJcGdzdGUgPSBwZ3N0ZV9pcHRlX25vdGlmeSh2bWEtPnZtX21tLCBwdGVwLCBwZ3N0ZSk7CiAJfQogCi0JX19wdGVwX2lwdGUoYWRkcmVzcywgcHRlcCk7CisJcHRlcF9mbHVzaF9kaXJlY3Qodm1hLT52bV9tbSwgYWRkcmVzcywgcHRlcCk7CiAKIAlpZiAobW1faGFzX3Bnc3RlKHZtYS0+dm1fbW0pKSB7CiAJCXBnc3RlX3NldF9wdGUocHRlcCwgZW50cnkpOwpAQCAtMTQ0NywxMiArMTQ4MiwxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHBtZHBfZmx1c2hfbGF6eShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQogewotCWludCBhY3RpdmUgPSAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKSA/IDEgOiAwOworCWludCBhY3RpdmUsIGNvdW50OwogCi0JaWYgKChhdG9taWNfcmVhZCgmbW0tPmNvbnRleHQuYXR0YWNoX2NvdW50KSAmIDB4ZmZmZikgPiBhY3RpdmUpCi0JCV9fcG1kX2lkdGUoYWRkcmVzcywgcG1kcCk7Ci0JZWxzZQorCWFjdGl2ZSA9IChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pID8gMSA6IDA7CisJY291bnQgPSBhdG9taWNfYWRkX3JldHVybigweDEwMDAwLCAmbW0tPmNvbnRleHQuYXR0YWNoX2NvdW50KTsKKwlpZiAoKGNvdW50ICYgMHhmZmZmKSA8PSBhY3RpdmUpIHsKKwkJcG1kX3ZhbCgqcG1kcCkgfD0gX1NFR01FTlRfRU5UUllfSU5WQUxJRDsKIAkJbW0tPmNvbnRleHQuZmx1c2hfbW0gPSAxOworCX0gZWxzZQorCQlfX3BtZF9pZHRlKGFkZHJlc3MsIHBtZHApOworCWF0b21pY19zdWIoMHgxMDAwMCwgJm1tLT5jb250ZXh0LmF0dGFjaF9jb3VudCk7CiB9CiAKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCA5YzgyY2ViLi5mNDc4M2MwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC04Myw2ICs4Myw3IEBACiAgKiBUaGVzZSBhcmUgZGVmaW5lZCBhcyBwZXIgbGludXgvcHRyYWNlLmgsIHdoaWNoIHNlZS4KICAqLwogI2RlZmluZSBhcmNoX2hhc19zaW5nbGVfc3RlcCgpCSgxKQorI2RlZmluZSBhcmNoX2hhc19ibG9ja19zdGVwKCkJKDEpCiAKICNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICgoKHJlZ3MpLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgIT0gMCkKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wc3cuYWRkciAmIFBTV19BRERSX0lOU04pCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2NscC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NjbHAuaAppbmRleCBhYmFjYTIyLi4yZjVlOTkzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2NscC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zY2xwLmgKQEAgLTQ2LDYgKzQ2LDcgQEAKIGludCBzY2xwX2NwdV9kZWNvbmZpZ3VyZSh1OCBjcHUpOwogdW5zaWduZWQgbG9uZyBsb25nIHNjbHBfZ2V0X3JubWF4KHZvaWQpOwogdW5zaWduZWQgbG9uZyBsb25nIHNjbHBfZ2V0X3J6bSh2b2lkKTsKK3Vuc2lnbmVkIGludCBzY2xwX2dldF9tYXhfY3B1KHZvaWQpOwogaW50IHNjbHBfc2RpYXNfYmxrX2NvdW50KHZvaWQpOwogaW50IHNjbHBfc2RpYXNfY29weSh2b2lkICpkZXN0LCBpbnQgYmxrX251bSwgaW50IG5yX2Jsa3MpOwogaW50IHNjbHBfY2hwX2NvbmZpZ3VyZShzdHJ1Y3QgY2hwX2lkIGNocGlkKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NldHVwLmgKaW5kZXggOTRjZmJlNC4uNDA2ZjNhMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTU5LDcgKzU5LDYgQEAKICNkZWZpbmUgTUFDSElORV9GTEFHX0RJQUc0NAkoMVVMIDw8IDQpCiAjZGVmaW5lIE1BQ0hJTkVfRkxBR19JRFRFCSgxVUwgPDwgNSkKICNkZWZpbmUgTUFDSElORV9GTEFHX0RJQUc5QwkoMVVMIDw8IDYpCi0jZGVmaW5lIE1BQ0hJTkVfRkxBR19NVkNPUwkoMVVMIDw8IDcpCiAjZGVmaW5lIE1BQ0hJTkVfRkxBR19LVk0JKDFVTCA8PCA4KQogI2RlZmluZSBNQUNISU5FX0ZMQUdfRVNPUAkoMVVMIDw8IDkpCiAjZGVmaW5lIE1BQ0hJTkVfRkxBR19FREFUMQkoMVVMIDw8IDEwKQpAQCAtODUsNyArODQsNiBAQAogI2RlZmluZSBNQUNISU5FX0hBU19JRFRFCSgwKQogI2RlZmluZSBNQUNISU5FX0hBU19ESUFHNDQJKDEpCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX01WUEcJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX01WUEcpCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX01WQ09TCSgwKQogI2RlZmluZSBNQUNISU5FX0hBU19FREFUMQkoMCkKICNkZWZpbmUgTUFDSElORV9IQVNfRURBVDIJKDApCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0xQUAkJKDApCkBAIC05OCw3ICs5Niw2IEBACiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0lEVEUJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX0lEVEUpCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0RJQUc0NAkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfRElBRzQ0KQogI2RlZmluZSBNQUNISU5FX0hBU19NVlBHCSgxKQotI2RlZmluZSBNQUNISU5FX0hBU19NVkNPUwkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfTVZDT1MpCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0VEQVQxCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19FREFUMSkKICNkZWZpbmUgTUFDSElORV9IQVNfRURBVDIJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX0VEQVQyKQogI2RlZmluZSBNQUNISU5FX0hBU19MUFAJCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19MUFApCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDEwZTBmY2QuLjNjY2Q3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC04MSw2ICs4MSw3IEBACiAjZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FCTEJLyogY2FsbGJhY2sgYmVmb3JlIHJldHVybmluZyB0byB1c2VyICovCiAjZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkyCS8qIHNpZ25hbCBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCisjZGVmaW5lIFRJRl9UTEJfV0FJVAkJNAkvKiB3YWl0IGZvciBUTEIgZmx1c2ggY29tcGxldGlvbiAqLwogI2RlZmluZSBUSUZfUEVSX1RSQVAJCTYJLyogZGVsaXZlciBzaWd0cmFwIG9uIHJldHVybiB0byB1c2VyICovCiAjZGVmaW5lIFRJRl9NQ0NLX1BFTkRJTkcJNwkvKiBtYWNoaW5lIGNoZWNrIGhhbmRsaW5nIGlzIHBlbmRpbmcgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UJOAkvKiBzeXNjYWxsIHRyYWNlIGFjdGl2ZSAqLwpAQCAtOTEsMTEgKzkyLDEzIEBACiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE4CS8qIGlzIHRlcm1pbmF0aW5nIGR1ZSB0byBPT00ga2lsbGVyICovCiAjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJMTkJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwoKSAqLwogI2RlZmluZSBUSUZfU0lOR0xFX1NURVAJCTIwCS8qIFRoaXMgdGFzayBpcyBzaW5nbGUgc3RlcHBlZCAqLworI2RlZmluZSBUSUZfQkxPQ0tfU1RFUAkJMjEJLyogVGhpcyB0YXNrIGlzIGJsb2NrIHN0ZXBwZWQgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTEwJCSgxPDxUSUZfU1lTQ0FMTCkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQorI2RlZmluZSBfVElGX1RMQl9XQUlUCQkoMTw8VElGX1RMQl9XQUlUKQogI2RlZmluZSBfVElGX1BFUl9UUkFQCQkoMTw8VElGX1BFUl9UUkFQKQogI2RlZmluZSBfVElGX01DQ0tfUEVORElORwkoMTw8VElGX01DQ0tfUEVORElORykKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDc5MzMwYWYuLjQxMzNiM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtOTIsMzMgKzkyLDU4IEBACiAjZGVmaW5lIEFSQ0hfSEFTX1NPUlRfRVhUQUJMRQogI2RlZmluZSBBUkNIX0hBU19TRUFSQ0hfRVhUQUJMRQogCi1zdHJ1Y3QgdWFjY2Vzc19vcHMgewotCXNpemVfdCAoKmNvcHlfZnJvbV91c2VyKShzaXplX3QsIGNvbnN0IHZvaWQgX191c2VyICosIHZvaWQgKik7Ci0Jc2l6ZV90ICgqY29weV90b191c2VyKShzaXplX3QsIHZvaWQgX191c2VyICosIGNvbnN0IHZvaWQgKik7Ci0Jc2l6ZV90ICgqY29weV9pbl91c2VyKShzaXplX3QsIHZvaWQgX191c2VyICosIGNvbnN0IHZvaWQgX191c2VyICopOwotCXNpemVfdCAoKmNsZWFyX3VzZXIpKHNpemVfdCwgdm9pZCBfX3VzZXIgKik7Ci0Jc2l6ZV90ICgqc3Rybmxlbl91c2VyKShzaXplX3QsIGNvbnN0IGNoYXIgX191c2VyICopOwotCXNpemVfdCAoKnN0cm5jcHlfZnJvbV91c2VyKShzaXplX3QsIGNvbnN0IGNoYXIgX191c2VyICosIGNoYXIgKik7Ci0JaW50ICgqZnV0ZXhfYXRvbWljX29wKShpbnQgb3AsIHUzMiBfX3VzZXIgKiwgaW50IG9wYXJnLCBpbnQgKm9sZCk7Ci0JaW50ICgqZnV0ZXhfYXRvbWljX2NtcHhjaGcpKHUzMiAqLCB1MzIgX191c2VyICosIHUzMiBvbGQsIHUzMiBuZXcpOwotfTsKK2ludCBfX2hhbmRsZV9mYXVsdCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpOwogCi1leHRlcm4gc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3M7Ci1leHRlcm4gc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3NfbXZjb3M7Ci1leHRlcm4gc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3NfcHQ7CisvKioKKyAqIF9fY29weV9mcm9tX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCisgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgorICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQG46CSAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuCVRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKKyAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICoKKyAqIElmIHNvbWUgZGF0YSBjb3VsZCBub3QgYmUgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFkIHRoZSBjb3BpZWQKKyAqIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHplcm8gYnl0ZXMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBuKTsKIAotZXh0ZXJuIGludCBfX2hhbmRsZV9mYXVsdCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpOworLyoqCisgKiBfX2NvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCisgKiBAbjoJICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4JVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCisgKgorICogQ29weSBkYXRhIGZyb20ga2VybmVsIHNwYWNlIHRvIHVzZXIgc3BhY2UuICBDYWxsZXIgbXVzdCBjaGVjaworICogdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIGFjY2Vzc19vaygpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgorICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCisgKi8KK3Vuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIG4pOwogCi1zdGF0aWMgaW5saW5lIGludCBfX3B1dF91c2VyX2ZuKHNpemVfdCBzaXplLCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQorI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgorI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKKworc3RhdGljIGlubGluZSBpbnQgX19wdXRfdXNlcl9mbih2b2lkICp4LCB2b2lkIF9fdXNlciAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0Jc2l6ZSA9IHVhY2Nlc3MuY29weV90b191c2VyKHNpemUsIHB0ciwgeCk7Ci0JcmV0dXJuIHNpemUgPyAtRUZBVUxUIDogc2l6ZTsKKwlzaXplID0gX19jb3B5X3RvX3VzZXIocHRyLCB4LCBzaXplKTsKKwlyZXR1cm4gc2l6ZSA/IC1FRkFVTFQgOiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX2dldF91c2VyX2ZuKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQorc3RhdGljIGlubGluZSBpbnQgX19nZXRfdXNlcl9mbih2b2lkICp4LCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0Jc2l6ZSA9IHVhY2Nlc3MuY29weV9mcm9tX3VzZXIoc2l6ZSwgcHRyLCB4KTsKLQlyZXR1cm4gc2l6ZSA/IC1FRkFVTFQgOiBzaXplOworCXNpemUgPSBfX2NvcHlfZnJvbV91c2VyKHgsIHB0ciwgc2l6ZSk7CisJcmV0dXJuIHNpemUgPyAtRUZBVUxUIDogMDsKIH0KIAogLyoKQEAgLTEzNSw4ICsxNjAsOCBAQAogCWNhc2UgMjoJCQkJCQkJXAogCWNhc2UgNDoJCQkJCQkJXAogCWNhc2UgODoJCQkJCQkJXAotCQlfX3B1X2VyciA9IF9fcHV0X3VzZXJfZm4oc2l6ZW9mICgqKHB0cikpLAlcCi0JCQkJCSBwdHIsICZfX3gpOwkJXAorCQlfX3B1X2VyciA9IF9fcHV0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAorCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCWJyZWFrOwkJCQkJCVwKIAlkZWZhdWx0OgkJCQkJCVwKIAkJX19wdXRfdXNlcl9iYWQoKTsJCQkJXApAQCAtMTUyLDcgKzE3Nyw3IEBACiB9KQogCiAKLWV4dGVybiBpbnQgX19wdXRfdXNlcl9iYWQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK2ludCBfX3B1dF91c2VyX2JhZCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwogCiAjZGVmaW5lIF9fZ2V0X3VzZXIoeCwgcHRyKQkJCQkJXAogKHsJCQkJCQkJCVwKQEAgLTE2MSwyOSArMTg2LDI5IEBACiAJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQlcCiAJY2FzZSAxOiB7CQkJCQkJXAogCQl1bnNpZ25lZCBjaGFyIF9feDsJCQkJXAotCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oc2l6ZW9mICgqKHB0cikpLAlcCi0JCQkJCSBwdHIsICZfX3gpOwkJXAorCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAorCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXAogCWNhc2UgMjogewkJCQkJCVwKIAkJdW5zaWduZWQgc2hvcnQgX194OwkJCQlcCi0JCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbihzaXplb2YgKCoocHRyKSksCVwKLQkJCQkJIHB0ciwgJl9feCk7CQlcCisJCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbigmX194LCBwdHIsCQlcCisJCQkJCSBzaXplb2YoKihwdHIpKSk7CVwKIAkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSAqKSAmX194OwlcCiAJCWJyZWFrOwkJCQkJCVwKIAl9OwkJCQkJCQlcCiAJY2FzZSA0OiB7CQkJCQkJXAogCQl1bnNpZ25lZCBpbnQgX194OwkJCQlcCi0JCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbihzaXplb2YgKCoocHRyKSksCVwKLQkJCQkJIHB0ciwgJl9feCk7CQlcCisJCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbigmX194LCBwdHIsCQlcCisJCQkJCSBzaXplb2YoKihwdHIpKSk7CVwKIAkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSAqKSAmX194OwlcCiAJCWJyZWFrOwkJCQkJCVwKIAl9OwkJCQkJCQlcCiAJY2FzZSA4OiB7CQkJCQkJXAogCQl1bnNpZ25lZCBsb25nIGxvbmcgX194OwkJCQlcCi0JCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbihzaXplb2YgKCoocHRyKSksCVwKLQkJCQkJIHB0ciwgJl9feCk7CQlcCisJCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbigmX194LCBwdHIsCQlcCisJCQkJCSBzaXplb2YoKihwdHIpKSk7CVwKIAkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSAqKSAmX194OwlcCiAJCWJyZWFrOwkJCQkJCVwKIAl9OwkJCQkJCQlcCkBAIC0yMDAsMzUgKzIyNSwxMiBAQAogCV9fZ2V0X3VzZXIoeCwgcHRyKTsJCQkJCVwKIH0pCiAKLWV4dGVybiBpbnQgX19nZXRfdXNlcl9iYWQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK2ludCBfX2dldF91c2VyX2JhZCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwogCiAjZGVmaW5lIF9fcHV0X3VzZXJfdW5hbGlnbmVkIF9fcHV0X3VzZXIKICNkZWZpbmUgX19nZXRfdXNlcl91bmFsaWduZWQgX19nZXRfdXNlcgogCiAvKioKLSAqIF9fY29weV90b191c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGludG8gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgotICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCi0gKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KLSAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIENvcHkgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKLSAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KLSAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCi1fX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlyZXR1cm4gdWFjY2Vzcy5jb3B5X3RvX3VzZXIobiwgdG8sIGZyb20pOwotfQotCi0jZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljIF9fY29weV90b191c2VyCi0jZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMgX19jb3B5X2Zyb21fdXNlcgotCi0vKioKICAqIGNvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UuCiAgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KICAqIEBmcm9tOiBTb3VyY2UgYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgpAQCAtMjQ4LDMwICsyNTAsNyBAQAogCXJldHVybiBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbik7CiB9CiAKLS8qKgotICogX19jb3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBmcm9tIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KLSAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCi0gKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCi0gKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCi0gKgotICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KLSAqCi0gKiBDb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCi0gKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCi0gKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KLSAqCi0gKiBJZiBzb21lIGRhdGEgY291bGQgbm90IGJlIGNvcGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgY29waWVkCi0gKiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZSB1c2luZyB6ZXJvIGJ5dGVzLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCi1fX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQotewotCXJldHVybiB1YWNjZXNzLmNvcHlfZnJvbV91c2VyKG4sIGZyb20sIHRvKTsKLX0KLQotZXh0ZXJuIHZvaWQgY29weV9mcm9tX3VzZXJfb3ZlcmZsb3codm9pZCkKK3ZvaWQgY29weV9mcm9tX3VzZXJfb3ZlcmZsb3codm9pZCkKICNpZmRlZiBDT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKIF9fY29tcGlsZXRpbWVfd2FybmluZygiY29weV9mcm9tX3VzZXIoKSBidWZmZXIgc2l6ZSBpcyBub3QgcHJvdmFibHkgY29ycmVjdCIpCiAjZW5kaWYKQEAgLTMwNiwxMSArMjg1LDggQEAKIAlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKLV9fY29weV9pbl91c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlyZXR1cm4gdWFjY2Vzcy5jb3B5X2luX3VzZXIobiwgdG8sIGZyb20pOwotfQordW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK19fY29weV9pbl91c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIGNvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCkBAIC0zMjIsMTggKzI5OCwyMiBAQAogLyoKICAqIENvcHkgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgogICovCisKK2xvbmcgX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpOworCiBzdGF0aWMgaW5saW5lIGxvbmcgX19tdXN0X2NoZWNrCiBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCiB7CiAJbWlnaHRfZmF1bHQoKTsKLQlyZXR1cm4gdWFjY2Vzcy5zdHJuY3B5X2Zyb21fdXNlcihjb3VudCwgc3JjLCBkc3QpOworCXJldHVybiBfX3N0cm5jcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICogc3JjLCB1bnNpZ25lZCBsb25nIG4pCit1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJbWlnaHRfZmF1bHQoKTsKLQlyZXR1cm4gdWFjY2Vzcy5zdHJubGVuX3VzZXIobiwgc3JjKTsKKwlyZXR1cm4gX19zdHJubGVuX3VzZXIoc3JjLCBuKTsKIH0KIAogLyoqCkBAIC0zNTUsMjEgKzMzNSwxNCBAQAogLyoKICAqIFplcm8gVXNlcnNwYWNlCiAgKi8KK3Vuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKLV9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlyZXR1cm4gdWFjY2Vzcy5jbGVhcl91c2VyKG4sIHRvKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawotY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAltaWdodF9mYXVsdCgpOwotCXJldHVybiB1YWNjZXNzLmNsZWFyX3VzZXIobiwgdG8pOworCXJldHVybiBfX2NsZWFyX3VzZXIodG8sIG4pOwogfQogCi1leHRlcm4gaW50IGNvcHlfdG9fdXNlcl9yZWFsKHZvaWQgX191c2VyICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7Ci1leHRlcm4gaW50IGNvcHlfZnJvbV91c2VyX3JlYWwodm9pZCAqZGVzdCwgdm9pZCBfX3VzZXIgKnNyYywgc2l6ZV90IGNvdW50KTsKK2ludCBjb3B5X3RvX3VzZXJfcmVhbCh2b2lkIF9fdXNlciAqZGVzdCwgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIAogI2VuZGlmIC8qIF9fUzM5MF9VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLmgKaW5kZXggN2UwYjQ5OC4uYTE1MGY0ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLmgKQEAgLTQwMyw2ICs0MDMsMTIgQEAKICNkZWZpbmUgUFRSQUNFX1RFX0FCT1JUX1JBTkQJICAgICAgMHg1MDExCiAKIC8qCisgKiBUaGUgbnVtYmVycyBjaG9zZW4gaGVyZSBhcmUgc29tZXdoYXQgYXJiaXRyYXJ5IGJ1dCBhYnNvbHV0ZWx5IE1VU1QKKyAqIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBudW1iZXIgYXNzaWduZWQgaW4gPGxpbnV4L3B0cmFjZS5oPi4KKyAqLworI2RlZmluZSBQVFJBQ0VfU0lOR0xFQkxPQ0sJMTIJLyogcmVzdW1lIGV4ZWN1dGlvbiB1bnRpbCBuZXh0IGJyYW5jaCAqLworCisvKgogICogUFRfUFJPVCBkZWZpbml0aW9uIGlzIGxvb3NlbHkgYmFzZWQgb24gaHBwYSBic2QgZGVmaW5pdGlvbiBpbgogICogZ2RiL2hwcGFiLW5hdC5jCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IDFiM2FjMDkuLmE5NWM0Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNDcsOSArNDcsOCBAQAogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBzdXNwZW5kLm8gc3dzdXNwX2FzbTY0Lm8KIG9iai0kKENPTkZJR19BVURJVCkJCSs9IGF1ZGl0Lm8KIGNvbXBhdC1vYmotJChDT05GSUdfQVVESVQpCSs9IGNvbXBhdF9hdWRpdC5vCi1vYmotJChDT05GSUdfQ09NUEFUKQkJKz0gY29tcGF0X2xpbnV4Lm8gY29tcGF0X3NpZ25hbC5vIFwKLQkJCQkJY29tcGF0X3dyYXBwZXIubyBjb21wYXRfZXhlY19kb21haW4ubyBcCi0JCQkJCSQoY29tcGF0LW9iai15KQorb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdF9saW51eC5vIGNvbXBhdF9zaWduYWwubworb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdF93cmFwcGVyLm8gJChjb21wYXQtb2JqLXkpCiAKIG9iai0kKENPTkZJR19TVEFDS1RSQUNFKQkrPSBzdGFja3RyYWNlLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9leGVjX2RvbWFpbi5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfZXhlY19kb21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1ZmFiZC4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9leGVjX2RvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIFN1cHBvcnQgZm9yIDMyLWJpdCBMaW51eCBmb3IgUzM5MCBwZXJzb25hbGl0eS4KLSAqCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAKLSAqIEF1dGhvcihzKTogR2VyaGFyZCBUb25uICh0b25AZGUuaWJtLmNvbSkKLSAqCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi1zdGF0aWMgc3RydWN0IGV4ZWNfZG9tYWluIHMzOTBfZXhlY19kb21haW47Ci0KLXN0YXRpYyBpbnQgX19pbml0IHMzOTBfaW5pdCAodm9pZCkKLXsKLQlzMzkwX2V4ZWNfZG9tYWluLm5hbWUgPSAiTGludXgvczM5MCI7Ci0JczM5MF9leGVjX2RvbWFpbi5oYW5kbGVyID0gTlVMTDsKLQlzMzkwX2V4ZWNfZG9tYWluLnBlcnNfbG93ID0gUEVSX0xJTlVYMzI7Ci0JczM5MF9leGVjX2RvbWFpbi5wZXJzX2hpZ2ggPSBQRVJfTElOVVgzMjsKLQlzMzkwX2V4ZWNfZG9tYWluLnNpZ25hbF9tYXAgPSBkZWZhdWx0X2V4ZWNfZG9tYWluLnNpZ25hbF9tYXA7Ci0JczM5MF9leGVjX2RvbWFpbi5zaWduYWxfaW52bWFwID0gZGVmYXVsdF9leGVjX2RvbWFpbi5zaWduYWxfaW52bWFwOwotCXJlZ2lzdGVyX2V4ZWNfZG9tYWluKCZzMzkwX2V4ZWNfZG9tYWluKTsKLQlyZXR1cm4gMDsKLX0KLQotX19pbml0Y2FsbChzMzkwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKaW5kZXggZGIwMjA1Mi4uY2EzODEzOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCkBAIC04Niw0OCArODYsNTEgQEAKICNkZWZpbmUgU0VUX1NUQVRfVUlEKHN0YXQsIHVpZCkJCShzdGF0KS5zdF91aWQgPSBoaWdoMmxvd3VpZCh1aWQpCiAjZGVmaW5lIFNFVF9TVEFUX0dJRChzdGF0LCBnaWQpCQkoc3RhdCkuc3RfZ2lkID0gaGlnaDJsb3dnaWQoZ2lkKQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfY2hvd24xNihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCB1MTYgdXNlciwgdTE2IGdyb3VwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX2Nob3duMTYsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLAorCQkgICAgICAgdTE2LCB1c2VyLCB1MTYsIGdyb3VwKQogewogCXJldHVybiBzeXNfY2hvd24oZmlsZW5hbWUsIGxvdzJoaWdodWlkKHVzZXIpLCBsb3cyaGlnaGdpZChncm91cCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfbGNob3duMTYoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgdTE2IHVzZXIsIHUxNiBncm91cCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoczM5MF9sY2hvd24xNiwgY29uc3QgY2hhciBfX3VzZXIgKiwKKwkJICAgICAgIGZpbGVuYW1lLCB1MTYsIHVzZXIsIHUxNiwgZ3JvdXApCiB7CiAJcmV0dXJuIHN5c19sY2hvd24oZmlsZW5hbWUsIGxvdzJoaWdodWlkKHVzZXIpLCBsb3cyaGlnaGdpZChncm91cCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZmNob3duMTYodW5zaWduZWQgaW50IGZkLCB1MTYgdXNlciwgdTE2IGdyb3VwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzMzkwX2ZjaG93bjE2LCB1bnNpZ25lZCBpbnQsIGZkLCB1MTYsIHVzZXIsIHUxNiwgZ3JvdXApCiB7CiAJcmV0dXJuIHN5c19mY2hvd24oZmQsIGxvdzJoaWdodWlkKHVzZXIpLCBsb3cyaGlnaGdpZChncm91cCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0cmVnaWQxNih1MTYgcmdpZCwgdTE2IGVnaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHMzOTBfc2V0cmVnaWQxNiwgdTE2LCByZ2lkLCB1MTYsIGVnaWQpCiB7CiAJcmV0dXJuIHN5c19zZXRyZWdpZChsb3cyaGlnaGdpZChyZ2lkKSwgbG93MmhpZ2hnaWQoZWdpZCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0Z2lkMTYodTE2IGdpZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoczM5MF9zZXRnaWQxNiwgdTE2LCBnaWQpCiB7CiAJcmV0dXJuIHN5c19zZXRnaWQoKGdpZF90KWdpZCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXRyZXVpZDE2KHUxNiBydWlkLCB1MTYgZXVpZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoczM5MF9zZXRyZXVpZDE2LCB1MTYsIHJ1aWQsIHUxNiwgZXVpZCkKIHsKIAlyZXR1cm4gc3lzX3NldHJldWlkKGxvdzJoaWdodWlkKHJ1aWQpLCBsb3cyaGlnaHVpZChldWlkKSk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXR1aWQxNih1MTYgdWlkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShzMzkwX3NldHVpZDE2LCB1MTYsIHVpZCkKIHsKIAlyZXR1cm4gc3lzX3NldHVpZCgodWlkX3QpdWlkKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NldHJlc3VpZDE2KHUxNiBydWlkLCB1MTYgZXVpZCwgdTE2IHN1aWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfc2V0cmVzdWlkMTYsIHUxNiwgcnVpZCwgdTE2LCBldWlkLCB1MTYsIHN1aWQpCiB7CiAJcmV0dXJuIHN5c19zZXRyZXN1aWQobG93MmhpZ2h1aWQocnVpZCksIGxvdzJoaWdodWlkKGV1aWQpLAotCQlsb3cyaGlnaHVpZChzdWlkKSk7CisJCQkgICAgIGxvdzJoaWdodWlkKHN1aWQpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldHJlc3VpZDE2KHUxNiBfX3VzZXIgKnJ1aWRwLCB1MTYgX191c2VyICpldWlkcCwgdTE2IF9fdXNlciAqc3VpZHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfZ2V0cmVzdWlkMTYsIHUxNiBfX3VzZXIgKiwgcnVpZHAsCisJCSAgICAgICB1MTYgX191c2VyICosIGV1aWRwLCB1MTYgX191c2VyICosIHN1aWRwKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7CiAJaW50IHJldHZhbDsKQEAgLTE0NCwxMyArMTQ3LDE0IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NldHJlc2dpZDE2KHUxNiByZ2lkLCB1MTYgZWdpZCwgdTE2IHNnaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfc2V0cmVzZ2lkMTYsIHUxNiwgcmdpZCwgdTE2LCBlZ2lkLCB1MTYsIHNnaWQpCiB7CiAJcmV0dXJuIHN5c19zZXRyZXNnaWQobG93MmhpZ2hnaWQocmdpZCksIGxvdzJoaWdoZ2lkKGVnaWQpLAotCQlsb3cyaGlnaGdpZChzZ2lkKSk7CisJCQkgICAgIGxvdzJoaWdoZ2lkKHNnaWQpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldHJlc2dpZDE2KHUxNiBfX3VzZXIgKnJnaWRwLCB1MTYgX191c2VyICplZ2lkcCwgdTE2IF9fdXNlciAqc2dpZHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfZ2V0cmVzZ2lkMTYsIHUxNiBfX3VzZXIgKiwgcmdpZHAsCisJCSAgICAgICB1MTYgX191c2VyICosIGVnaWRwLCB1MTYgX191c2VyICosIHNnaWRwKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7CiAJaW50IHJldHZhbDsKQEAgLTE2NywxMiArMTcxLDEyIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NldGZzdWlkMTYodTE2IHVpZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoczM5MF9zZXRmc3VpZDE2LCB1MTYsIHVpZCkKIHsKIAlyZXR1cm4gc3lzX3NldGZzdWlkKCh1aWRfdCl1aWQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0ZnNnaWQxNih1MTYgZ2lkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShzMzkwX3NldGZzZ2lkMTYsIHUxNiwgZ2lkKQogewogCXJldHVybiBzeXNfc2V0ZnNnaWQoKGdpZF90KWdpZCk7CiB9CkBAIC0yMTUsNyArMjE5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgX191c2VyICpncm91cGxpc3QpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHMzOTBfZ2V0Z3JvdXBzMTYsIGludCwgZ2lkc2V0c2l6ZSwgdTE2IF9fdXNlciAqLCBncm91cGxpc3QpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKIAlpbnQgaTsKQEAgLTI0MCw3ICsyNDQsNyBAQAogCXJldHVybiBpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0Z3JvdXBzMTYoaW50IGdpZHNldHNpemUsIHUxNiBfX3VzZXIgKmdyb3VwbGlzdCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoczM5MF9zZXRncm91cHMxNiwgaW50LCBnaWRzZXRzaXplLCB1MTYgX191c2VyICosIGdyb3VwbGlzdCkKIHsKIAlzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ3JvdXBfaW5mbzsKIAlpbnQgcmV0dmFsOwpAQCAtMjY1LDIyICsyNjksMjIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0dWlkMTYodm9pZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTAoczM5MF9nZXR1aWQxNikKIHsKIAlyZXR1cm4gaGlnaDJsb3d1aWQoZnJvbV9rdWlkX211bmdlZChjdXJyZW50X3VzZXJfbnMoKSwgY3VycmVudF91aWQoKSkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0ZXVpZDE2KHZvaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUwKHMzOTBfZ2V0ZXVpZDE2KQogewogCXJldHVybiBoaWdoMmxvd3VpZChmcm9tX2t1aWRfbXVuZ2VkKGN1cnJlbnRfdXNlcl9ucygpLCBjdXJyZW50X2V1aWQoKSkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0Z2lkMTYodm9pZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTAoczM5MF9nZXRnaWQxNikKIHsKIAlyZXR1cm4gaGlnaDJsb3dnaWQoZnJvbV9rZ2lkX211bmdlZChjdXJyZW50X3VzZXJfbnMoKSwgY3VycmVudF9naWQoKSkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0ZWdpZDE2KHZvaWQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUwKHMzOTBfZ2V0ZWdpZDE2KQogewogCXJldHVybiBoaWdoMmxvd2dpZChmcm9tX2tnaWRfbXVuZ2VkKGN1cnJlbnRfdXNlcl9ucygpLCBjdXJyZW50X2VnaWQoKSkpOwogfQpAQCAtMjk1LDQxICsyOTksMzUgQEAKIH0KICNlbmRpZgogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfdHJ1bmNhdGU2NChjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIHVuc2lnbmVkIGxvbmcgaGlnaCwgdW5zaWduZWQgbG9uZyBsb3cpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfdHJ1bmNhdGU2NCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgdTMyLCBoaWdoLCB1MzIsIGxvdykKIHsKLQlpZiAoKGludCloaWdoIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZQotCQlyZXR1cm4gc3lzX3RydW5jYXRlKHBhdGgsIChoaWdoIDw8IDMyKSB8IGxvdyk7CisJcmV0dXJuIHN5c190cnVuY2F0ZShwYXRoLCAodW5zaWduZWQgbG9uZyloaWdoIDw8IDMyIHwgbG93KTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2Z0cnVuY2F0ZTY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgbG9uZyBoaWdoLCB1bnNpZ25lZCBsb25nIGxvdykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoczM5MF9mdHJ1bmNhdGU2NCwgdW5zaWduZWQgaW50LCBmZCwgdTMyLCBoaWdoLCB1MzIsIGxvdykKIHsKLQlpZiAoKGludCloaWdoIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZQotCQlyZXR1cm4gc3lzX2Z0cnVuY2F0ZShmZCwgKGhpZ2ggPDwgMzIpIHwgbG93KTsKKwlyZXR1cm4gc3lzX2Z0cnVuY2F0ZShmZCwgKHVuc2lnbmVkIGxvbmcpaGlnaCA8PCAzMiB8IGxvdyk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9wcmVhZDY0KHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKnVidWYsCi0JCQkJc2l6ZV90IGNvdW50LCB1MzIgcG9zaGksIHUzMiBwb3NsbykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUoczM5MF9wcmVhZDY0LCB1bnNpZ25lZCBpbnQsIGZkLCBjaGFyIF9fdXNlciAqLCB1YnVmLAorCQkgICAgICAgY29tcGF0X3NpemVfdCwgY291bnQsIHUzMiwgaGlnaCwgdTMyLCBsb3cpCiB7CiAJaWYgKChjb21wYXRfc3NpemVfdCkgY291bnQgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gc3lzX3ByZWFkNjQoZmQsIHVidWYsIGNvdW50LCAoKGxvZmZfdClBQShwb3NoaSkgPDwgMzIpIHwgQUEocG9zbG8pKTsKKwlyZXR1cm4gc3lzX3ByZWFkNjQoZmQsIHVidWYsIGNvdW50LCAodW5zaWduZWQgbG9uZyloaWdoIDw8IDMyIHwgbG93KTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3B3cml0ZTY0KHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCi0JCQkJc2l6ZV90IGNvdW50LCB1MzIgcG9zaGksIHUzMiBwb3NsbykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUoczM5MF9wd3JpdGU2NCwgdW5zaWduZWQgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgdWJ1ZiwKKwkJICAgICAgIGNvbXBhdF9zaXplX3QsIGNvdW50LCB1MzIsIGhpZ2gsIHUzMiwgbG93KQogewogCWlmICgoY29tcGF0X3NzaXplX3QpIGNvdW50IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIHN5c19wd3JpdGU2NChmZCwgdWJ1ZiwgY291bnQsICgobG9mZl90KUFBKHBvc2hpKSA8PCAzMikgfCBBQShwb3NsbykpOworCXJldHVybiBzeXNfcHdyaXRlNjQoZmQsIHVidWYsIGNvdW50LCAodW5zaWduZWQgbG9uZyloaWdoIDw8IDMyIHwgbG93KTsKIH0KIAotYXNtbGlua2FnZSBjb21wYXRfc3NpemVfdCBzeXMzMl9yZWFkYWhlYWQoaW50IGZkLCB1MzIgb2ZmaGksIHUzMiBvZmZsbywgczMyIGNvdW50KQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChzMzkwX3JlYWRhaGVhZCwgaW50LCBmZCwgdTMyLCBoaWdoLCB1MzIsIGxvdywgczMyLCBjb3VudCkKIHsKLQlyZXR1cm4gc3lzX3JlYWRhaGVhZChmZCwgKChsb2ZmX3QpQUEob2ZmaGkpIDw8IDMyKSB8IEFBKG9mZmxvKSwgY291bnQpOworCXJldHVybiBzeXNfcmVhZGFoZWFkKGZkLCAodW5zaWduZWQgbG9uZyloaWdoIDw8IDMyIHwgbG93LCBjb3VudCk7CiB9CiAKIHN0cnVjdCBzdGF0NjRfZW11MzEgewpAQCAtMzgxLDcgKzM3OSw3IEBACiAJcmV0dXJuIGNvcHlfdG9fdXNlcih1YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7IAogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc3RhdDY0KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICogc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoczM5MF9zdGF0NjQsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCByZXQgPSB2ZnNfc3RhdChmaWxlbmFtZSwgJnN0YXQpOwpAQCAtMzkwLDcgKzM4OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX2xzdGF0NjQoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKiBzdGF0YnVmKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihzMzkwX2xzdGF0NjQsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCByZXQgPSB2ZnNfbHN0YXQoZmlsZW5hbWUsICZzdGF0KTsKQEAgLTM5OSw3ICszOTcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9mc3RhdDY0KHVuc2lnbmVkIGxvbmcgZmQsIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICogc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoczM5MF9mc3RhdDY0LCB1bnNpZ25lZCBpbnQsIGZkLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCByZXQgPSB2ZnNfZnN0YXQoZmQsICZzdGF0KTsKQEAgLTQwOCw4ICs0MDYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9mc3RhdGF0NjQodW5zaWduZWQgaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLAotCQkJCXN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyKiBzdGF0YnVmLCBpbnQgZmxhZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTQoczM5MF9mc3RhdGF0NjQsIHVuc2lnbmVkIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICosIHN0YXRidWYsIGludCwgZmxhZykKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAlpbnQgZXJyb3I7CkBAIC00MzUsNyArNDMzLDcgQEAKIAljb21wYXRfdWxvbmdfdCBvZmZzZXQ7CiB9OwogCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgb2xkMzJfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIF9fdXNlciAqYXJnKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShzMzkwX29sZF9tbWFwLCBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIF9fdXNlciAqLCBhcmcpCiB7CiAJc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBhOwogCkBAIC00NDcsNyArNDQ1LDcgQEAKIAkJCSAgICAgIGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfbW1hcDIoc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKmFyZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoczM5MF9tbWFwMiwgc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKiwgYXJnKQogewogCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgYTsKIApAQCAtNDU2LDcgKzQ1NCw3IEBACiAJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfcmVhZCh1bnNpZ25lZCBpbnQgZmQsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfcmVhZCwgdW5zaWduZWQgaW50LCBmZCwgY2hhciBfX3VzZXIgKiwgYnVmLCBjb21wYXRfc2l6ZV90LCBjb3VudCkKIHsKIAlpZiAoKGNvbXBhdF9zc2l6ZV90KSBjb3VudCA8IDApCiAJCXJldHVybiAtRUlOVkFMOyAKQEAgLTQ2NCw3ICs0NjIsNyBAQAogCXJldHVybiBzeXNfcmVhZChmZCwgYnVmLCBjb3VudCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl93cml0ZSh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHMzOTBfd3JpdGUsIHVuc2lnbmVkIGludCwgZmQsIGNvbnN0IGNoYXIgX191c2VyICosIGJ1ZiwgY29tcGF0X3NpemVfdCwgY291bnQpCiB7CiAJaWYgKChjb21wYXRfc3NpemVfdCkgY291bnQgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsgCkBAIC00NzgsMTQgKzQ3NiwxMyBAQAogICogYmVjYXVzZSB0aGUgMzEgYml0IHZhbHVlcyBkaWZmZXIgZnJvbSB0aGUgNjQgYml0IHZhbHVlcy4KICAqLwogCi1hc21saW5rYWdlIGxvbmcKLXN5czMyX2ZhZHZpc2U2NChpbnQgZmQsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBsZW4sIGludCBhZHZpc2UpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHMzOTBfZmFkdmlzZTY0LCBpbnQsIGZkLCB1MzIsIGhpZ2gsIHUzMiwgbG93LCBjb21wYXRfc2l6ZV90LCBsZW4sIGludCwgYWR2aXNlKQogewogCWlmIChhZHZpc2UgPT0gNCkKIAkJYWR2aXNlID0gUE9TSVhfRkFEVl9ET05UTkVFRDsKIAllbHNlIGlmIChhZHZpc2UgPT0gNSkKIAkJYWR2aXNlID0gUE9TSVhfRkFEVl9OT1JFVVNFOwotCXJldHVybiBzeXNfZmFkdmlzZTY0KGZkLCBvZmZzZXQsIGxlbiwgYWR2aXNlKTsKKwlyZXR1cm4gc3lzX2ZhZHZpc2U2NChmZCwgKHVuc2lnbmVkIGxvbmcpaGlnaCA8PCAzMiB8IGxvdywgbGVuLCBhZHZpc2UpOwogfQogCiBzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgewpAQCAtNDk1LDggKzQ5Miw3IEBACiAJaW50IGFkdmljZTsKIH07CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzMzJfZmFkdmlzZTY0XzY0KHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBfX3VzZXIgKmFyZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUxKHMzOTBfZmFkdmlzZTY0XzY0LCBzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgX191c2VyICosIGFyZ3MpCiB7CiAJc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIGE7CiAKQEAgLTUwOCwzICs1MDQsMTcgQEAKIAkJYS5hZHZpY2UgPSBQT1NJWF9GQURWX05PUkVVU0U7CiAJcmV0dXJuIHN5c19mYWR2aXNlNjRfNjQoYS5mZCwgYS5vZmZzZXQsIGEubGVuLCBhLmFkdmljZSk7CiB9CisKK0NPTVBBVF9TWVNDQUxMX0RFRklORTYoczM5MF9zeW5jX2ZpbGVfcmFuZ2UsIGludCwgZmQsIHUzMiwgb2ZmaGlnaCwgdTMyLCBvZmZsb3csCisJCSAgICAgICB1MzIsIG5oaWdoLCB1MzIsIG5sb3csIHVuc2lnbmVkIGludCwgZmxhZ3MpCit7CisJcmV0dXJuIHN5c19zeW5jX2ZpbGVfcmFuZ2UoZmQsICgobG9mZl90KW9mZmhpZ2ggPDwgMzIpICsgb2ZmbG93LAorCQkJCSAgICgodTY0KW5oaWdoIDw8IDMyKSArIG5sb3csIGZsYWdzKTsKK30KKworQ09NUEFUX1NZU0NBTExfREVGSU5FNihzMzkwX2ZhbGxvY2F0ZSwgaW50LCBmZCwgaW50LCBtb2RlLCB1MzIsIG9mZmhpZ2gsIHUzMiwgb2ZmbG93LAorCQkgICAgICAgdTMyLCBsZW5oaWdoLCB1MzIsIGxlbmxvdykKK3sKKwlyZXR1cm4gc3lzX2ZhbGxvY2F0ZShmZCwgbW9kZSwgKChsb2ZmX3Qpb2ZmaGlnaCA8PCAzMikgKyBvZmZsb3csCisJCQkgICAgICgodTY0KWxlbmhpZ2ggPDwgMzIpICsgbGVubG93KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmggYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5oCmluZGV4IDFiZmRhM2UuLjM5ZGRmZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmgKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaApAQCAtNzYsNDYgKzc2LDQzIEBACiBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxOwogc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzOwogCi1sb25nIHN5czMyX2Nob3duMTYoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgdTE2IHVzZXIsIHUxNiBncm91cCk7Ci1sb25nIHN5czMyX2xjaG93bjE2KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIHUxNiB1c2VyLCB1MTYgZ3JvdXApOwotbG9uZyBzeXMzMl9mY2hvd24xNih1bnNpZ25lZCBpbnQgZmQsIHUxNiB1c2VyLCB1MTYgZ3JvdXApOwotbG9uZyBzeXMzMl9zZXRyZWdpZDE2KHUxNiByZ2lkLCB1MTYgZWdpZCk7Ci1sb25nIHN5czMyX3NldGdpZDE2KHUxNiBnaWQpOwotbG9uZyBzeXMzMl9zZXRyZXVpZDE2KHUxNiBydWlkLCB1MTYgZXVpZCk7Ci1sb25nIHN5czMyX3NldHVpZDE2KHUxNiB1aWQpOwotbG9uZyBzeXMzMl9zZXRyZXN1aWQxNih1MTYgcnVpZCwgdTE2IGV1aWQsIHUxNiBzdWlkKTsKLWxvbmcgc3lzMzJfZ2V0cmVzdWlkMTYodTE2IF9fdXNlciAqcnVpZCwgdTE2IF9fdXNlciAqZXVpZCwgdTE2IF9fdXNlciAqc3VpZCk7Ci1sb25nIHN5czMyX3NldHJlc2dpZDE2KHUxNiByZ2lkLCB1MTYgZWdpZCwgdTE2IHNnaWQpOwotbG9uZyBzeXMzMl9nZXRyZXNnaWQxNih1MTYgX191c2VyICpyZ2lkLCB1MTYgX191c2VyICplZ2lkLCB1MTYgX191c2VyICpzZ2lkKTsKLWxvbmcgc3lzMzJfc2V0ZnN1aWQxNih1MTYgdWlkKTsKLWxvbmcgc3lzMzJfc2V0ZnNnaWQxNih1MTYgZ2lkKTsKLWxvbmcgc3lzMzJfZ2V0Z3JvdXBzMTYoaW50IGdpZHNldHNpemUsIHUxNiBfX3VzZXIgKmdyb3VwbGlzdCk7Ci1sb25nIHN5czMyX3NldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgX191c2VyICpncm91cGxpc3QpOwotbG9uZyBzeXMzMl9nZXR1aWQxNih2b2lkKTsKLWxvbmcgc3lzMzJfZ2V0ZXVpZDE2KHZvaWQpOwotbG9uZyBzeXMzMl9nZXRnaWQxNih2b2lkKTsKLWxvbmcgc3lzMzJfZ2V0ZWdpZDE2KHZvaWQpOwotbG9uZyBzeXMzMl90cnVuY2F0ZTY0KGNvbnN0IGNoYXIgX191c2VyICogcGF0aCwgdW5zaWduZWQgbG9uZyBoaWdoLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGxvdyk7Ci1sb25nIHN5czMyX2Z0cnVuY2F0ZTY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgbG9uZyBoaWdoLCB1bnNpZ25lZCBsb25nIGxvdyk7Ci1sb25nIHN5czMyX2luaXRfbW9kdWxlKHZvaWQgX191c2VyICp1bW9kLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1YXJncyk7Ci1sb25nIHN5czMyX2RlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciBfX3VzZXIgKm5hbWVfdXNlciwgdW5zaWduZWQgaW50IGZsYWdzKTsKLWxvbmcgc3lzMzJfcHJlYWQ2NCh1bnNpZ25lZCBpbnQgZmQsIGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY291bnQsCi0JCSAgIHUzMiBwb3NoaSwgdTMyIHBvc2xvKTsKLWxvbmcgc3lzMzJfcHdyaXRlNjQodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKLQkJICAgIHNpemVfdCBjb3VudCwgdTMyIHBvc2hpLCB1MzIgcG9zbG8pOwotY29tcGF0X3NzaXplX3Qgc3lzMzJfcmVhZGFoZWFkKGludCBmZCwgdTMyIG9mZmhpLCB1MzIgb2ZmbG8sIHMzMiBjb3VudCk7Ci1sb25nIHN5czMyX3N0YXQ2NChjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqIHN0YXRidWYpOwotbG9uZyBzeXMzMl9sc3RhdDY0KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsCi0JCSAgIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICogc3RhdGJ1Zik7Ci1sb25nIHN5czMyX2ZzdGF0NjQodW5zaWduZWQgbG9uZyBmZCwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKiBzdGF0YnVmKTsKLWxvbmcgc3lzMzJfZnN0YXRhdDY0KHVuc2lnbmVkIGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwKLQkJICAgICBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciogc3RhdGJ1ZiwgaW50IGZsYWcpOwotdW5zaWduZWQgbG9uZyBvbGQzMl9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3RfZW11MzEgX191c2VyICphcmcpOwotbG9uZyBzeXMzMl9tbWFwMihzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIF9fdXNlciAqYXJnKTsKLWxvbmcgc3lzMzJfcmVhZCh1bnNpZ25lZCBpbnQgZmQsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQpOwotbG9uZyBzeXMzMl93cml0ZSh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQpOwotbG9uZyBzeXMzMl9mYWR2aXNlNjQoaW50IGZkLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbGVuLCBpbnQgYWR2aXNlKTsKLWxvbmcgc3lzMzJfZmFkdmlzZTY0XzY0KHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBfX3VzZXIgKmFyZ3MpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfY2hvd24xNihjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHUxNiB1c2VyLCB1MTYgZ3JvdXApOworbG9uZyBjb21wYXRfc3lzX3MzOTBfbGNob3duMTYoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCB1MTYgdXNlciwgdTE2IGdyb3VwKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2ZjaG93bjE2KHVuc2lnbmVkIGludCBmZCwgdTE2IHVzZXIsIHUxNiBncm91cCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9zZXRyZWdpZDE2KHUxNiByZ2lkLCB1MTYgZWdpZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9zZXRnaWQxNih1MTYgZ2lkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3NldHJldWlkMTYodTE2IHJ1aWQsIHUxNiBldWlkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3NldHVpZDE2KHUxNiB1aWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc2V0cmVzdWlkMTYodTE2IHJ1aWQsIHUxNiBldWlkLCB1MTYgc3VpZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9nZXRyZXN1aWQxNih1MTYgX191c2VyICpydWlkLCB1MTYgX191c2VyICpldWlkLCB1MTYgX191c2VyICpzdWlkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3NldHJlc2dpZDE2KHUxNiByZ2lkLCB1MTYgZWdpZCwgdTE2IHNnaWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfZ2V0cmVzZ2lkMTYodTE2IF9fdXNlciAqcmdpZCwgdTE2IF9fdXNlciAqZWdpZCwgdTE2IF9fdXNlciAqc2dpZCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9zZXRmc3VpZDE2KHUxNiB1aWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc2V0ZnNnaWQxNih1MTYgZ2lkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2dldGdyb3VwczE2KGludCBnaWRzZXRzaXplLCB1MTYgX191c2VyICpncm91cGxpc3QpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc2V0Z3JvdXBzMTYoaW50IGdpZHNldHNpemUsIHUxNiBfX3VzZXIgKmdyb3VwbGlzdCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9nZXR1aWQxNih2b2lkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2dldGV1aWQxNih2b2lkKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2dldGdpZDE2KHZvaWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfZ2V0ZWdpZDE2KHZvaWQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfdHJ1bmNhdGU2NChjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgdTMyIGhpZ2gsIHUzMiBsb3cpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfZnRydW5jYXRlNjQodW5zaWduZWQgaW50IGZkLCB1MzIgaGlnaCwgdTMyIGxvdyk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9wcmVhZDY0KHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKnVidWYsIGNvbXBhdF9zaXplX3QgY291bnQsIHUzMiBoaWdoLCB1MzIgbG93KTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3B3cml0ZTY0KHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIGNvbXBhdF9zaXplX3QgY291bnQsIHUzMiBoaWdoLCB1MzIgbG93KTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3JlYWRhaGVhZChpbnQgZmQsIHUzMiBoaWdoLCB1MzIgbG93LCBzMzIgY291bnQpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfc3RhdDY0KGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NF9lbXUzMSBfX3VzZXIgKnN0YXRidWYpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfbHN0YXQ2NChjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjRfZW11MzEgX191c2VyICpzdGF0YnVmKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2ZzdGF0NjQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqc3RhdGJ1Zik7Citsb25nIGNvbXBhdF9zeXNfczM5MF9mc3RhdGF0NjQodW5zaWduZWQgaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0X2VtdTMxIF9fdXNlciAqc3RhdGJ1ZiwgaW50IGZsYWcpOworbG9uZyBjb21wYXRfc3lzX3MzOTBfb2xkX21tYXAoc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSBfX3VzZXIgKmFyZyk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9tbWFwMihzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIF9fdXNlciAqYXJnKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX3JlYWQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqIGJ1ZiwgY29tcGF0X3NpemVfdCBjb3VudCk7Citsb25nIGNvbXBhdF9zeXNfczM5MF93cml0ZSh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBjb21wYXRfc2l6ZV90IGNvdW50KTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2ZhZHZpc2U2NChpbnQgZmQsIHUzMiBoaWdoLCB1MzIgbG93LCBjb21wYXRfc2l6ZV90IGxlbiwgaW50IGFkdmlzZSk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9mYWR2aXNlNjRfNjQoc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIF9fdXNlciAqYXJncyk7Citsb25nIGNvbXBhdF9zeXNfczM5MF9zeW5jX2ZpbGVfcmFuZ2UoaW50IGZkLCB1MzIgb2ZmaGlnaCwgdTMyIG9mZmxvdywgdTMyIG5oaWdoLCB1MzIgbmxvdywgdW5zaWduZWQgaW50IGZsYWdzKTsKK2xvbmcgY29tcGF0X3N5c19zMzkwX2ZhbGxvY2F0ZShpbnQgZmQsIGludCBtb2RlLCB1MzIgb2ZmaGlnaCwgdTMyIG9mZmxvdywgdTMyIGxlbmhpZ2gsIHUzMiBsZW5sb3cpOworbG9uZyBjb21wYXRfc3lzX3NpZ3JldHVybih2b2lkKTsKK2xvbmcgY29tcGF0X3N5c19ydF9zaWdyZXR1cm4odm9pZCk7CisKICNlbmRpZiAvKiBfQVNNX1MzOTBYX1MzOTBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwppbmRleCA4Yjg0YmMzLi43ZGY1ZWQ5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zaWdyZXR1cm4odm9pZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTAoc2lncmV0dXJuKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXNpZ2ZyYW1lMzIgX191c2VyICpmcmFtZSA9IChzaWdmcmFtZTMyIF9fdXNlciAqKXJlZ3MtPmdwcnNbMTVdOwpAQCAtMjYwLDcgKzI2MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9ydF9zaWdyZXR1cm4odm9pZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTAocnRfc2lncmV0dXJuKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXJ0X3NpZ2ZyYW1lMzIgX191c2VyICpmcmFtZSA9IChydF9zaWdmcmFtZTMyIF9fdXNlciAqKXJlZ3MtPmdwcnNbMTVdOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQ4OTQ5Li4wMDAwMDAwCi0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUworKysgL2Rldi9udWxsCkBAIC0xLDE0MjUgKzAsMCBAQAotLyoKLSogICAgd3JhcHBlciBmb3IgMzEgYml0IGNvbXBhdGlibGUgc3lzdGVtIGNhbGxzLgotKgotKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDYKLSogICAgQXV0aG9yKHMpOiBHZXJoYXJkIFRvbm4gKHRvbkBkZS5pYm0uY29tKSwKLSoJCVRob21hcyBTcGF0emllciAodHNwYXRAZGUuaWJtLmNvbSkKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0KLUVOVFJZKHN5czMyX2V4aXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c19leGl0CQkjIGJyYW5jaCB0byBzeXNfZXhpdAotCi1FTlRSWShzeXMzMl9yZWFkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JamcJc3lzMzJfcmVhZAkJIyBicmFuY2ggdG8gc3lzX3JlYWQKLQotRU5UUlkoc3lzMzJfd3JpdGVfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKLQlqZwlzeXMzMl93cml0ZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfY2xvc2Vfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfY2xvc2UJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2NyZWF0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlqZwlzeXNfY3JlYXQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2xpbmtfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlqZwlzeXNfbGluawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfdW5saW5rX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX3VubGluawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfY2hkaXJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlqZwlzeXNfY2hkaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3RpbWVfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBpbnQgKgotCWpnCWNvbXBhdF9zeXNfdGltZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbWtub2Rfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWxsZ2ZyCSVyNCwlcjQJCQkjIGRldgotCWpnCXN5c19ta25vZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfY2htb2Rfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyBtb2RlX3QKLQlqZwlzeXNfY2htb2QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2xjaG93bjE2X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90Ci0JbGxnZnIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90Ci0JamcJc3lzMzJfbGNob3duMTYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9nZXRwaWRfd3JhcHBlcgkJCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfbW91bnRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyBjaGFyICoKLQlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxndHIJJXI2LCVyNgkJCSMgdm9pZCAqCi0JamcJY29tcGF0X3N5c19tb3VudAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9vbGR1bW91bnRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlqZwlzeXNfb2xkdW1vdW50CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXR1aWQxNl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWpnCXN5czMyX3NldHVpZDE2CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfZ2V0dWlkMTZfd3JhcHBlcgkJCSMgdm9pZAotCi1FTlRSWShzeXMzMl9wdHJhY2Vfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGxvbmcKLQlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKLQlsbGd0cgklcjQsJXI0CQkJIyBsb25nCi0JbGxnZnIJJXI1LCVyNQkJCSMgbG9uZwotCWpnCWNvbXBhdF9zeXNfcHRyYWNlCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2FsYXJtX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2FsYXJtCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX3V0aW1lX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF91dGltYnVmICoKLQlqZwljb21wYXRfc3lzX3V0aW1lCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2FjY2Vzc193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX2FjY2VzcwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbmljZV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX25pY2UJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9zeW5jX3dyYXBwZXIJCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfa2lsbF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlqZwlzeXNfa2lsbAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcmVuYW1lX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX3JlbmFtZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbWtkaXJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c19ta2RpcgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcm1kaXJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlqZwlzeXNfcm1kaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2R1cF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19kdXAJCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9waXBlX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgdTMyICoKLQlqZwlzeXNfcGlwZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c190aW1lc193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBjb21wYXRfdG1zICoKLQlqZwljb21wYXRfc3lzX3RpbWVzCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2Jya193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfYnJrCQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0Z2lkMTZfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QKLQlqZwlzeXMzMl9zZXRnaWQxNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotI3N5czMyX2dldGdpZDE2X3dyYXBwZXIJCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfc2lnbmFsX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBfX3NpZ2hhbmRsZXJfdAotCWpnCXN5c19zaWduYWwKLQotI3N5czMyX2dldGV1aWQxNl93cmFwcGVyCQkjIHZvaWQKLQotI3N5czMyX2dldGVnaWQxNl93cmFwcGVyCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfYWNjdF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWpnCXN5c19hY2N0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl91bW91bnRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWpnCXN5c191bW91bnQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfaW9jdGxfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKLQlqZwljb21wYXRfc3lzX2lvY3RsCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfZmNudGxfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JamcJY29tcGF0X3N5c19mY250bAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRwZ2lkX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWxnZnIJJXIzLCVyMwkJCSMgcGlkX3QKLQlqZwlzeXNfc2V0cGdpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfdW1hc2tfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c191bWFzawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfY2hyb290X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JamcJc3lzX2Nocm9vdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfdXN0YXRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBkZXZfdAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCB1c3RhdCAqCi0JamcJY29tcGF0X3N5c191c3RhdAotCi1FTlRSWShzeXMzMl9kdXAyX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2R1cDIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9nZXRwcGlkX3dyYXBwZXIJCQkjIHZvaWQKLQotI3N5czMyX2dldHBncnBfd3JhcHBlcgkJCSMgdm9pZAotCi0jc3lzMzJfc2V0c2lkX3dyYXBwZXIJCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfc2V0cmV1aWQxNl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWpnCXN5czMyX3NldHJldWlkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0cmVnaWQxNl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAotCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAotCWpnCXN5czMyX3NldHJlZ2lkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX3NpZ3N1c3BlbmRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGxnZnIJJXI0LCVyNAkJCSMgb2xkX3NpZ3NldF90Ci0JamcJc3lzX3NpZ3N1c3BlbmQKLQotRU5UUlkoY29tcGF0X3N5c19zaWdwZW5kaW5nX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29tcGF0X29sZF9zaWdzZXRfdCAqCi0JamcJY29tcGF0X3N5c19zaWdwZW5kaW5nCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldGhvc3RuYW1lX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlqZwlzeXNfc2V0aG9zdG5hbWUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfc2V0cmxpbWl0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHJsaW1pdF9lbXUzMSAqCi0JamcJY29tcGF0X3N5c19zZXRybGltaXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHJsaW1pdF9lbXUzMSAqCi0JamcJY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0ICMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfZ2V0cmxpbWl0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHJsaW1pdF9lbXUzMSAqCi0JamcJY29tcGF0X3N5c19nZXRybGltaXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbW1hcDJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxICoKLQlqZwlzeXMzMl9tbWFwMgkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHRpbWV2YWxfZW11MzEgKgotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCB0aW1lem9uZSAqCi0JamcJY29tcGF0X3N5c19nZXR0aW1lb2ZkYXkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19zZXR0aW1lb2ZkYXlfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgdGltZXZhbF9lbXUzMSAqCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHRpbWV6b25lICoKLQlqZwljb21wYXRfc3lzX3NldHRpbWVvZmRheQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9nZXRncm91cHMxNl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90ICoKLQlqZwlzeXMzMl9nZXRncm91cHMxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRncm91cHMxNl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90ICoKLQlqZwlzeXMzMl9zZXRncm91cHMxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zeW1saW5rX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX3N5bWxpbmsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3JlYWRsaW5rX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfcmVhZGxpbmsJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3VzZWxpYl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c191c2VsaWIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3N3YXBvbl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3N3YXBvbgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcmVib290X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyNSwlcjUJCQkjIHZvaWQgKgotCWpnCXN5c19yZWJvb3QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKG9sZDMyX3JlYWRkaXJfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyB2b2lkICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKLQlqZwljb21wYXRfc3lzX29sZF9yZWFkZGlyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKG9sZDMyX21tYXBfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxICoKLQlqZwlvbGQzMl9tbWFwCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9tdW5tYXBfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90Ci0JamcJc3lzX211bm1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZmNobW9kX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgbW9kZV90Ci0JamcJc3lzX2ZjaG1vZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZmNob3duMTZfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyBjb21wYXRfdWlkX3QKLQlsbGdmcgklcjQsJXI0CQkJIyBjb21wYXRfdWlkX3QKLQlqZwlzeXMzMl9mY2hvd24xNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0cHJpb3JpdHlfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX2dldHByaW9yaXR5CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRwcmlvcml0eV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c19zZXRwcmlvcml0eQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19zdGF0ZnNfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3N0YXRmcyAqCi0JamcJY29tcGF0X3N5c19zdGF0ZnMJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19mc3RhdGZzX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9zdGF0ZnMgKgotCWpnCWNvbXBhdF9zeXNfZnN0YXRmcwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX3NvY2tldGNhbGxfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHUzMiAqCi0JamcJY29tcGF0X3N5c19zb2NrZXRjYWxsCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3N5c2xvZ193cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfc3lzbG9nCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX25ld3N0YXRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3Qgc3RhdF9lbXUzMSAqCi0JamcJY29tcGF0X3N5c19uZXdzdGF0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfbmV3bHN0YXRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3Qgc3RhdF9lbXUzMSAqCi0JamcJY29tcGF0X3N5c19uZXdsc3RhdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShjb21wYXRfc3lzX25ld2ZzdGF0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXRfZW11MzEgKgotCWpnCWNvbXBhdF9zeXNfbmV3ZnN0YXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotI3N5czMyX3ZoYW5ndXBfd3JhcHBlcgkJCSMgdm9pZAotCi1FTlRSWShzeXMzMl9zd2Fwb2ZmX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX3N3YXBvZmYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfc3lzaW5mb193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBzeXNpbmZvX2VtdTMxICoKLQlqZwljb21wYXRfc3lzX3N5c2luZm8JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZnN5bmNfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfZnN5bmMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9zaWdyZXR1cm5fd3JhcHBlcgkJIyBkb25lIGluIHNpZ3JldHVybl9nbHVlCi0KLSNzeXMzMl9jbG9uZV93cmFwcGVyCQkJIyBkb25lIGluIGNsb25lX2dsdWUKLQotRU5UUlkoc3lzMzJfc2V0ZG9tYWlubmFtZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3NldGRvbWFpbm5hbWUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbmV3dW5hbWVfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgbmV3X3V0c25hbWUgKgotCWpnCXN5c19uZXd1bmFtZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19hZGp0aW1leF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBjb21wYXRfdGltZXggKgotCWpnCWNvbXBhdF9zeXNfYWRqdGltZXgJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbXByb3RlY3Rfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nIChhY3R1YWxseSBwb2ludGVyCi0JbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90Ci0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5c19tcHJvdGVjdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX2luaXRfbW9kdWxlX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgdm9pZCAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ3RyCSVyNCwlcjQJCQkjIGNoYXIgKgotCWpnCXN5c19pbml0X21vZHVsZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX2RlbGV0ZV9tb2R1bGVfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfZGVsZXRlX21vZHVsZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9xdW90YWN0bF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHFpZF90Ci0JbGxndHIJJXI1LCVyNQkJCSMgY2FkZHJfdAotCWpnCXN5c19xdW90YWN0bAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0cGdpZF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKLQlqZwlzeXNfZ2V0cGdpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZmNoZGlyX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2ZjaGRpcgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfYmRmbHVzaF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGdmcgklcjMsJXIzCQkJIyBsb25nCi0JamcJc3lzX2JkZmx1c2gJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3N5c2ZzX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5c19zeXNmcwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcGVyc29uYWxpdHlfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfczM5MF9wZXJzb25hbGl0eQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90Ci0JamcJc3lzMzJfc2V0ZnN1aWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRmc2dpZDE2X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90Ci0JamcJc3lzMzJfc2V0ZnNnaWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9sbHNlZWtfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ3RyCSVyNSwlcjUJCQkjIGxvZmZfdCAqCi0JbGxnZnIJJXI2LCVyNgkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2xsc2VlawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0ZGVudHNfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyB2b2lkICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKLQlqZwljb21wYXRfc3lzX2dldGRlbnRzCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKGNvbXBhdF9zeXNfc2VsZWN0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb21wYXRfZmRfc2V0ICoKLQlsbGd0cgklcjQsJXI0CQkJIyBjb21wYXRfZmRfc2V0ICoKLQlsbGd0cgklcjUsJXI1CQkJIyBjb21wYXRfZmRfc2V0ICoKLQlsbGd0cgklcjYsJXI2CQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgKgotCWpnCWNvbXBhdF9zeXNfc2VsZWN0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2Zsb2NrX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2Zsb2NrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9tc3luY193cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c19tc3luYwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19yZWFkdl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWpnCWNvbXBhdF9zeXNfcmVhZHYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c193cml0ZXZfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwljb21wYXRfc3lzX3dyaXRldgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9nZXRzaWRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JamcJc3lzX2dldHNpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZmRhdGFzeW5jX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2ZkYXRhc3luYwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbWxvY2tfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90Ci0JamcJc3lzX21sb2NrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9tdW5sb2NrX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAotCWpnCXN5c19tdW5sb2NrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9tbG9ja2FsbF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX21sb2NrYWxsCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi0jc3lzMzJfbXVubG9ja2FsbF93cmFwcGVyCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfc2NoZWRfc2V0cGFyYW1fd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHNjaGVkX3BhcmFtICoKLQlqZwlzeXNfc2NoZWRfc2V0cGFyYW0JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2NoZWRfZ2V0cGFyYW1fd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHNjaGVkX3BhcmFtICoKLQlqZwlzeXNfc2NoZWRfZ2V0cGFyYW0JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2NoZWRfc2V0c2NoZWR1bGVyX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBwaWRfdAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IHNjaGVkX3BhcmFtICoKLQlqZwlzeXNfc2NoZWRfc2V0c2NoZWR1bGVyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NjaGVkX2dldHNjaGVkdWxlcl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKLQlqZwlzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9zY2hlZF95aWVsZF93cmFwcGVyCQkjIHZvaWQKLQotRU5UUlkoc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19uYW5vc2xlZXBfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlqZwljb21wYXRfc3lzX25hbm9zbGVlcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbXJlbWFwX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfbXJlbWFwCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRyZXN1aWQxNl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAotCWpnCXN5czMyX3NldHJlc3VpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldHJlc3VpZDE2X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90ICoKLQlsbGd0cgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAqCi0JamcJc3lzMzJfZ2V0cmVzdWlkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcG9sbF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBwb2xsZmQgKgotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX3BvbGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldHJlc2dpZDE2X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90Ci0JbGxnZnIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90Ci0JbGxnZnIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90Ci0JamcJc3lzMzJfc2V0cmVzZ2lkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0cmVzZ2lkMTZfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QgKgotCWxsZ3RyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCi0JbGxndHIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90ICoKLQlqZwlzeXMzMl9nZXRyZXNnaWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9wcmN0bF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI2LCVyNgkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5c19wcmN0bAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotI3N5czMyX3J0X3NpZ3JldHVybl93cmFwcGVyCQkjIGRvbmUgaW4gcnRfc2lncmV0dXJuX2dsdWUKLQotRU5UUlkoc3lzMzJfcHJlYWQ2NF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAotCWxsZ2ZyCSVyNSwlcjUJCQkjIHUzMgotCWxsZ2ZyCSVyNiwlcjYJCQkjIHUzMgotCWpnCXN5czMyX3ByZWFkNjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3B3cml0ZTY0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JbGxnZnIJJXI1LCVyNQkJCSMgdTMyCi0JbGxnZnIJJXI2LCVyNgkJCSMgdTMyCi0JamcJc3lzMzJfcHdyaXRlNjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2Nob3duMTZfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKLQlsbGdmcgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QKLQlqZwlzeXMzMl9jaG93bjE2CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9nZXRjd2Rfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCi0JamcJc3lzX2dldGN3ZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfY2FwZ2V0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY2FwX3VzZXJfaGVhZGVyX3QKLQlsbGd0cgklcjMsJXIzCQkJIyBjYXBfdXNlcl9kYXRhX3QKLQlqZwlzeXNfY2FwZ2V0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9jYXBzZXRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjYXBfdXNlcl9oZWFkZXJfdAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNhcF91c2VyX2RhdGFfdAotCWpnCXN5c19jYXBzZXQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl92Zm9ya193cmFwcGVyCQkJIyBkb25lIGluIHZmb3JrX2dsdWUKLQotRU5UUlkoc3lzMzJfdHJ1bmNhdGU2NF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JamcJc3lzMzJfdHJ1bmNhdGU2NAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9mdHJ1bmNhdGU2NF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCi0JamcJc3lzMzJfZnRydW5jYXRlNjQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfbGNob3duX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKLQlsbGdmcgklcjQsJXI0CQkJIyBnaWRfdAotCWpnCXN5c19sY2hvd24JCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLSNzeXMzMl9nZXR1aWRfd3JhcHBlcgkJCSMgdm9pZAotI3N5czMyX2dldGdpZF93cmFwcGVyCQkJIyB2b2lkCi0jc3lzMzJfZ2V0ZXVpZF93cmFwcGVyCQkJIyB2b2lkCi0jc3lzMzJfZ2V0ZWdpZF93cmFwcGVyCQkJIyB2b2lkCi0KLUVOVFJZKHN5czMyX3NldHJldWlkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdWlkX3QKLQlsbGdmcgklcjMsJXIzCQkJIyB1aWRfdAotCWpnCXN5c19zZXRyZXVpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0cmVnaWRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBnaWRfdAotCWxsZ2ZyCSVyMywlcjMJCQkjIGdpZF90Ci0JamcJc3lzX3NldHJlZ2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9nZXRncm91cHNfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGdpZF90ICoKLQlqZwlzeXNfZ2V0Z3JvdXBzCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXRncm91cHNfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGdpZF90ICoKLQlqZwlzeXNfc2V0Z3JvdXBzCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9mY2hvd25fd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGdmcgklcjMsJXIzCQkJIyB1aWRfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIGdpZF90Ci0JamcJc3lzX2ZjaG93bgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0cmVzdWlkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdWlkX3QKLQlsbGdmcgklcjMsJXIzCQkJIyB1aWRfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVpZF90Ci0JamcJc3lzX3NldHJlc3VpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0cmVzdWlkX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgdWlkX3QgKgotCWxsZ3RyCSVyMywlcjMJCQkjIHVpZF90ICoKLQlsbGd0cgklcjQsJXI0CQkJIyB1aWRfdCAqCi0JamcJc3lzX2dldHJlc3VpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0cmVzZ2lkX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgZ2lkX3QKLQlsbGdmcgklcjMsJXIzCQkJIyBnaWRfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIGdpZF90Ci0JamcJc3lzX3NldHJlc2dpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZ2V0cmVzZ2lkX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgZ2lkX3QgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGdpZF90ICoKLQlsbGd0cgklcjQsJXI0CQkJIyBnaWRfdCAqCi0JamcJc3lzX2dldHJlc2dpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfY2hvd25fd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyB1aWRfdAotCWxsZ2ZyCSVyNCwlcjQJCQkjIGdpZF90Ci0JamcJc3lzX2Nob3duCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXR1aWRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1aWRfdAotCWpnCXN5c19zZXR1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX3NldGdpZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIGdpZF90Ci0JamcJc3lzX3NldGdpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0ZnN1aWRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1aWRfdAotCWpnCXN5c19zZXRmc3VpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0ZnNnaWRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyBnaWRfdAotCWpnCXN5c19zZXRmc2dpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfcGl2b3Rfcm9vdF93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c19waXZvdF9yb290CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9taW5jb3JlX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAotCWxsZ3RyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGNoYXIgKgotCWpnCXN5c19taW5jb3JlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9tYWR2aXNlX3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX21hZHZpc2UJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2dldGRlbnRzNjRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyB2b2lkICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfZ2V0ZGVudHM2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19mY250bDY0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwotCWpnCWNvbXBhdF9zeXNfZmNudGw2NAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zdGF0NjRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3Qgc3RhdDY0ICoKLQlqZwlzeXMzMl9zdGF0NjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2xzdGF0NjRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3Qgc3RhdDY0ICoKLQlqZwlzeXMzMl9sc3RhdDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zdGltZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGxvbmcgKgotCWpnCWNvbXBhdF9zeXNfc3RpbWUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfZnN0YXQ2NF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3Qgc3RhdDY0ICoKLQlqZwlzeXMzMl9mc3RhdDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9zZXR4YXR0cl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHZvaWQgKgotCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAotCWxnZnIJJXI2LCVyNgkJCSMgaW50Ci0JamcJc3lzX3NldHhhdHRyCi0KLUVOVFJZKHN5czMyX2xzZXR4YXR0cl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHZvaWQgKgotCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAotCWxnZnIJJXI2LCVyNgkJCSMgaW50Ci0JamcJc3lzX2xzZXR4YXR0cgotCi1FTlRSWShzeXMzMl9mc2V0eGF0dHJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHZvaWQgKgotCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAotCWxnZnIJJXI2LCVyNgkJCSMgaW50Ci0JamcJc3lzX2ZzZXR4YXR0cgotCi1FTlRSWShzeXMzMl9nZXR4YXR0cl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHZvaWQgKgotCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAotCWpnCXN5c19nZXR4YXR0cgotCi1FTlRSWShzeXMzMl9sZ2V0eGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKLQlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKLQlqZwlzeXNfbGdldHhhdHRyCi0KLUVOVFJZKHN5czMyX2ZnZXR4YXR0cl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgdm9pZCAqCi0JbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90Ci0JamcJc3lzX2ZnZXR4YXR0cgotCi1FTlRSWShzeXMzMl9saXN0eGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKLQlqZwlzeXNfbGlzdHhhdHRyCi0KLUVOVFJZKHN5czMyX2xsaXN0eGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKLQlqZwlzeXNfbGxpc3R4YXR0cgotCi1FTlRSWShzeXMzMl9mbGlzdHhhdHRyX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKLQlqZwlzeXNfZmxpc3R4YXR0cgotCi1FTlRSWShzeXMzMl9yZW1vdmV4YXR0cl93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgotCWpnCXN5c19yZW1vdmV4YXR0cgotCi1FTlRSWShzeXMzMl9scmVtb3ZleGF0dHJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlqZwlzeXNfbHJlbW92ZXhhdHRyCi0KLUVOVFJZKHN5czMyX2ZyZW1vdmV4YXR0cl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JamcJc3lzX2ZyZW1vdmV4YXR0cgotCi1FTlRSWShzeXMzMl9zY2hlZF9zZXRhZmZpbml0eV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZyAqCi0JamcJY29tcGF0X3N5c19zY2hlZF9zZXRhZmZpbml0eQotCi1FTlRSWShzeXMzMl9zY2hlZF9nZXRhZmZpbml0eV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZyAqCi0JamcJY29tcGF0X3N5c19zY2hlZF9nZXRhZmZpbml0eQotCi1FTlRSWShzeXMzMl9leGl0X2dyb3VwX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlqZwlzeXNfZXhpdF9ncm91cAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzMzJfc2V0X3RpZF9hZGRyZXNzX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgaW50ICoKLQlqZwlzeXNfc2V0X3RpZF9hZGRyZXNzCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19lcG9sbF9jcmVhdGVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWpnCXN5c19lcG9sbF9jcmVhdGUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX2Vwb2xsX2N0bF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBlcG9sbF9ldmVudCAqCi0JamcJc3lzX2Vwb2xsX2N0bAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX2Vwb2xsX3dhaXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBlcG9sbF9ldmVudCAqCi0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlsZ2ZyCSVyNSwlcjUJCQkjIGludAotCWpnCXN5c19lcG9sbF93YWl0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9mYWR2aXNlNjRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCXNsbGcJJXIzLCVyMywzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGxvZmZfdAotCW9yCSVyMywlcjQJCQkjIGdldCBsb3cgd29yZCBvZiA2NGJpdCBsb2ZmX3QKLQlsbGdmcgklcjQsJXI1CQkJIyBzaXplX3QgKHVuc2lnbmVkIGxvbmcpCi0JbGdmcgklcjUsJXI2CQkJIyBpbnQKLQlqZwlzeXMzMl9mYWR2aXNlNjQKLQotRU5UUlkoc3lzMzJfZmFkdmlzZTY0XzY0X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzICoKLQlqZwlzeXMzMl9mYWR2aXNlNjRfNjQKLQotRU5UUlkoc3lzMzJfY2xvY2tfc2V0dGltZV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgY2xvY2tpZF90IChpbnQpCi0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JamcJY29tcGF0X3N5c19jbG9ja19zZXR0aW1lCi0KLUVOVFJZKHN5czMyX2Nsb2NrX2dldHRpbWVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGNsb2NraWRfdCAoaW50KQotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgotCWpnCWNvbXBhdF9zeXNfY2xvY2tfZ2V0dGltZQotCi1FTlRSWShzeXMzMl9jbG9ja19nZXRyZXNfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGNsb2NraWRfdCAoaW50KQotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgotCWpnCWNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzCi0KLUVOVFJZKHN5czMyX2Nsb2NrX25hbm9zbGVlcF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgY2xvY2tpZF90IChpbnQpCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlqZwljb21wYXRfc3lzX2Nsb2NrX25hbm9zbGVlcAotCi1FTlRSWShzeXMzMl90aW1lcl9jcmVhdGVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHRpbWVyX3QgKGludCkKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50ICoKLQlsbGd0cgklcjQsJXI0CQkJIyB0aW1lcl90ICoKLQlqZwljb21wYXRfc3lzX3RpbWVyX2NyZWF0ZQotCi1FTlRSWShzeXMzMl90aW1lcl9zZXR0aW1lX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCi0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgKgotCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyAqCi0JamcJY29tcGF0X3N5c190aW1lcl9zZXR0aW1lCi0KLUVOVFJZKHN5czMyX3RpbWVyX2dldHRpbWVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHRpbWVyX3QgKGludCkKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgKgotCWpnCWNvbXBhdF9zeXNfdGltZXJfZ2V0dGltZQotCi1FTlRSWShzeXMzMl90aW1lcl9nZXRvdmVycnVuX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCi0JamcJc3lzX3RpbWVyX2dldG92ZXJydW4KLQotRU5UUlkoc3lzMzJfdGltZXJfZGVsZXRlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCi0JamcJc3lzX3RpbWVyX2RlbGV0ZQotCi1FTlRSWShzeXMzMl9pb19zZXR1cF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIHUzMiAqCi0JamcJY29tcGF0X3N5c19pb19zZXR1cAotCi1FTlRSWShzeXMzMl9pb19kZXN0cm95X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgKGFpb19jb250ZXh0X3QpIHUzMgotCWpnCXN5c19pb19kZXN0cm95Ci0KLUVOVFJZKHN5czMyX2lvX2dldGV2ZW50c193cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKLQlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKLQlsZ2ZyCSVyNCwlcjQJCQkjIGxvbmcKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgaW9fZXZlbnQgKgotCWxsZ3RyCSVyNiwlcjYJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgotCWpnCWNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzCi0KLUVOVFJZKHN5czMyX2lvX3N1Ym1pdF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKLQlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgaW9jYiAqKgotCWpnCWNvbXBhdF9zeXNfaW9fc3VibWl0Ci0KLUVOVFJZKHN5czMyX2lvX2NhbmNlbF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgaW9jYiAqCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGlvX2V2ZW50ICoKLQlqZwlzeXNfaW9fY2FuY2VsCi0KLUVOVFJZKGNvbXBhdF9zeXNfc3RhdGZzNjRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyBjb21wYXRfc2l6ZV90Ci0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCAqCi0JamcJY29tcGF0X3N5c19zdGF0ZnM2NAotCi1FTlRSWShjb21wYXRfc3lzX2ZzdGF0ZnM2NF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludCBmZAotCWxsZ2ZyCSVyMywlcjMJCQkjIGNvbXBhdF9zaXplX3QKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0ICoKLQlqZwljb21wYXRfc3lzX2ZzdGF0ZnM2NAotCi1FTlRSWShjb21wYXRfc3lzX21xX29wZW5fd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWxsZ2ZyCSVyNCwlcjQJCQkjIG1vZGVfdAotCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBjb21wYXRfbXFfYXR0ciAqCi0JamcJY29tcGF0X3N5c19tcV9vcGVuCi0KLUVOVFJZKHN5czMyX21xX3VubGlua193cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c19tcV91bmxpbmsKLQotRU5UUlkoY29tcGF0X3N5c19tcV90aW1lZHNlbmRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXI2LCVyNgkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JamcJY29tcGF0X3N5c19tcV90aW1lZHNlbmQKLQotRU5UUlkoY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90Ci0JbGxndHIJJXI1LCVyNQkJCSMgdW5zaWduZWQgaW50ICoKLQlsbGd0cgklcjYsJXI2CQkJIyBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKLQlqZwljb21wYXRfc3lzX21xX3RpbWVkcmVjZWl2ZQotCi1FTlRSWShjb21wYXRfc3lzX21xX25vdGlmeV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgbXFkX3QKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50ICoKLQlqZwljb21wYXRfc3lzX21xX25vdGlmeQotCi1FTlRSWShjb21wYXRfc3lzX21xX2dldHNldGF0dHJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9tcV9hdHRyICoKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X21xX2F0dHIgKgotCWpnCWNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cgotCi1FTlRSWShjb21wYXRfc3lzX2FkZF9rZXlfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyBjb25zdCB2b2lkICoKLQlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKLQlsbGdmcgklcjYsJXI2CQkJIyAoa2V5X3NlcmlhbF90KSB1MzIKLQlqZwlzeXNfYWRkX2tleQotCi1FTlRSWShjb21wYXRfc3lzX3JlcXVlc3Rfa2V5X3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgY29uc3Qgdm9pZCAqCi0JbGxnZnIJJXI1LCVyNQkJCSMgKGtleV9zZXJpYWxfdCkgdTMyCi0JamcJc3lzX3JlcXVlc3Rfa2V5Ci0KLUVOVFJZKHN5czMyX3JlbWFwX2ZpbGVfcGFnZXNfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI2LCVyNgkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5c19yZW1hcF9maWxlX3BhZ2VzCi0KLUVOVFJZKGNvbXBhdF9zeXNfa2V4ZWNfbG9hZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGtleGVjX3NlZ21lbnQgKgotCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwljb21wYXRfc3lzX2tleGVjX2xvYWQKLQotRU5UUlkoc3lzX2lvcHJpb19zZXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfaW9wcmlvX3NldAotCi1FTlRSWShzeXNfaW9wcmlvX2dldF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlqZwlzeXNfaW9wcmlvX2dldAotCi1FTlRSWShzeXNfaW5vdGlmeV9hZGRfd2F0Y2hfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHUzMgotCWpnCXN5c19pbm90aWZ5X2FkZF93YXRjaAotCi1FTlRSWShzeXNfaW5vdGlmeV9ybV93YXRjaF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdTMyCi0JamcJc3lzX2lub3RpZnlfcm1fd2F0Y2gKLQotRU5UUlkoc3lzX21rZGlyYXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX21rZGlyYXQKLQotRU5UUlkoc3lzX21rbm9kYXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX21rbm9kYXQKLQotRU5UUlkoc3lzX2ZjaG93bmF0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyB1aWRfdAotCWxsZ2ZyCSVyNSwlcjUJCQkjIGdpZF90Ci0JbGdmcgklcjYsJXI2CQkJIyBpbnQKLQlqZwlzeXNfZmNob3duYXQKLQotRU5UUlkoY29tcGF0X3N5c19mdXRpbWVzYXRfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgdGltZXZhbCAqCi0JamcJY29tcGF0X3N5c19mdXRpbWVzYXQKLQotRU5UUlkoc3lzMzJfZnN0YXRhdDY0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IHN0YXQ2NCAqCi0JbGdmcgklcjUsJXI1CQkJIyBpbnQKLQlqZwlzeXMzMl9mc3RhdGF0NjQKLQotRU5UUlkoc3lzX3VubGlua2F0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c191bmxpbmthdAotCi1FTlRSWShzeXNfcmVuYW1lYXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JbGxndHIJJXI1LCVyNQkJCSMgY29uc3QgY2hhciAqCi0JamcJc3lzX3JlbmFtZWF0Ci0KLUVOVFJZKHN5c19saW5rYXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JbGxndHIJJXI1LCVyNQkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjYsJXI2CQkJIyBpbnQKLQlqZwlzeXNfbGlua2F0Ci0KLUVOVFJZKHN5c19zeW1saW5rYXRfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsZ2ZyCSVyMywlcjMJCQkjIGludAotCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbnN0IGNoYXIgKgotCWpnCXN5c19zeW1saW5rYXQKLQotRU5UUlkoc3lzX3JlYWRsaW5rYXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIGNoYXIgKgotCWxnZnIJJXI1LCVyNQkJCSMgaW50Ci0JamcJc3lzX3JlYWRsaW5rYXQKLQotRU5UUlkoc3lzX2ZjaG1vZGF0X3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjQsJXI0CQkJIyBtb2RlX3QKLQlqZwlzeXNfZmNobW9kYXQKLQotRU5UUlkoc3lzX2ZhY2Nlc3NhdF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCi0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlqZwlzeXNfZmFjY2Vzc2F0Ci0KLUVOVFJZKGNvbXBhdF9zeXNfcHNlbGVjdDZfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGZkX3NldCAqCi0JbGxndHIJJXI0LCVyNAkJCSMgZmRfc2V0ICoKLQlsbGd0cgklcjUsJXI1CQkJIyBmZF9zZXQgKgotCWxsZ3RyCSVyNiwlcjYJCQkjIHN0cnVjdCB0aW1lc3BlYyAqCi0JbGxndAklcjAsMTY0KCVyMTUpCQkjIHZvaWQgKgotCXN0ZwklcjAsMTYwKCVyMTUpCi0JamcJY29tcGF0X3N5c19wc2VsZWN0NgotCi1FTlRSWShjb21wYXRfc3lzX3Bwb2xsX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHBvbGxmZCAqCi0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IHRpbWVzcGVjICoKLQlsbGd0cgklcjUsJXI1CQkJIyBjb25zdCBzaWdzZXRfdCAqCi0JbGxnZnIJJXI2LCVyNgkJCSMgc2l6ZV90Ci0JamcJY29tcGF0X3N5c19wcG9sbAotCi1FTlRSWShzeXNfdW5zaGFyZV93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKLQlqZwlzeXNfdW5zaGFyZQotCi1FTlRSWShzeXNfc3BsaWNlX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlsbGd0cgklcjMsJXIzCQkJIyBsb2ZmX3QgKgotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JbGxndHIJJXI1LCVyNQkJCSMgbG9mZl90ICoKLQlsbGdmcgklcjYsJXI2CQkJIyBzaXplX3QKLQlsbGdmCSVyMCwxNjQoJXIxNSkJCSMgdW5zaWduZWQgaW50Ci0Jc3RnCSVyMCwxNjAoJXIxNSkKLQlqZwlzeXNfc3BsaWNlCi0KLUVOVFJZKHN5c19zeW5jX2ZpbGVfcmFuZ2Vfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCXNsbGcJJXIzLCVyMywzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGxvZmZfdAotCW9yCSVyMywlcjQJCQkjIGdldCBsb3cgd29yZCBvZiA2NGJpdCBsb2ZmX3QKLQlzbGxnCSVyNCwlcjUsMzIJCSMgZ2V0IGhpZ2ggd29yZCBvZiA2NGJpdCBsb2ZmX3QKLQlvcgklcjQsJXI2CQkJIyBnZXQgbG93IHdvcmQgb2YgNjRiaXQgbG9mZl90Ci0JbGxnZgklcjUsMTY0KCVyMTUpCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19zeW5jX2ZpbGVfcmFuZ2UKLQotRU5UUlkoc3lzX3RlZV93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKLQlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBpbnQKLQlqZwlzeXNfdGVlCi0KLUVOVFJZKHN5c19nZXRjcHVfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyB1bnNpZ25lZCAqCi0JbGxndHIJJXIzLCVyMwkJCSMgdW5zaWduZWQgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBnZXRjcHVfY2FjaGUgKgotCWpnCXN5c19nZXRjcHUKLQotRU5UUlkoY29tcGF0X3N5c191dGltZXNfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKLQlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgKgotCWpnCWNvbXBhdF9zeXNfdXRpbWVzCi0KLUVOVFJZKGNvbXBhdF9zeXNfdXRpbWVuc2F0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCi0JbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCi0JbGdmcgklcjUsJXI1CQkJIyBpbnQKLQlqZwljb21wYXRfc3lzX3V0aW1lbnNhdAotCi1FTlRSWShzeXNfZXZlbnRmZF93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWpnCXN5c19ldmVudGZkCi0KLUVOVFJZKHN5c19mYWxsb2NhdGVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0Jc2xsZwklcjQsJXI0LDMyCQkjIGdldCBoaWdoIHdvcmQgb2YgNjRiaXQgbG9mZl90Ci0JbHIJJXI0LCVyNQkJCSMgZ2V0IGxvdyB3b3JkIG9mIDY0Yml0IGxvZmZfdAotCXNsbGcJJXI1LCVyNiwzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGxvZmZfdAotCWwJJXI1LDE2NCglcjE1KQkJIyBnZXQgbG93IHdvcmQgb2YgNjRiaXQgbG9mZl90Ci0JamcJc3lzX2ZhbGxvY2F0ZQotCi1FTlRSWShzeXNfdGltZXJmZF9jcmVhdGVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3RpbWVyZmRfY3JlYXRlCi0KLUVOVFJZKHN5c19ldmVudGZkMl93cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX2V2ZW50ZmQyCi0KLUVOVFJZKHN5c19pbm90aWZ5X2luaXQxX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlqZwlzeXNfaW5vdGlmeV9pbml0MQotCi1FTlRSWShzeXNfcGlwZTJfd3JhcHBlcikKLQlsbGd0cgklcjIsJXIyCQkJIyB1MzIgKgotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3BpcGUyCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfZHVwM193cmFwcGVyKQotCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX2R1cDMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19lcG9sbF9jcmVhdGUxX3dyYXBwZXIpCi0JbGdmcgklcjIsJXIyCQkJIyBpbnQKLQlqZwlzeXNfZXBvbGxfY3JlYXRlMQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXMzMl9yZWFkYWhlYWRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ2ZyCSVyMywlcjMJCQkjIHUzMgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHUzMgotCWxnZnIJJXI1LCVyNQkJCSMgczMyCi0JamcJc3lzMzJfcmVhZGFoZWFkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfdGtpbGxfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGdmcgklcjMsJXIzCQkJIyBpbnQKLQlqZwlzeXNfdGtpbGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c190Z2tpbGxfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGdmcgklcjMsJXIzCQkJIyBwaWRfdAotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JamcJc3lzX3Rna2lsbAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoY29tcGF0X3N5c19rZXljdGxfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1MzIKLQlsbGdmcgklcjMsJXIzCQkJIyB1MzIKLQlsbGdmcgklcjQsJXI0CQkJIyB1MzIKLQlsbGdmcgklcjUsJXI1CQkJIyB1MzIKLQlsbGdmcgklcjYsJXI2CQkJIyB1MzIKLQlqZwljb21wYXRfc3lzX2tleWN0bAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfcGVyZl9ldmVudF9vcGVuX3dyYXBwZXIpCi0JbGxndHIJJXIyLCVyMgkJCSMgY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqCi0JbGdmcgklcjMsJXIzCQkJIyBwaWRfdAotCWxnZnIJJXI0LCVyNAkJCSMgaW50Ci0JbGdmcgklcjUsJXI1CQkJIyBpbnQKLQlsbGdmcgklcjYsJXI2CQkJIyB1bnNpZ25lZCBsb25nCi0JamcJc3lzX3BlcmZfZXZlbnRfb3BlbgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfY2xvbmVfd3JhcHBlcikKLQlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ3RyCSVyNCwlcjQJCQkjIGludCAqCi0JbGxndHIJJXI1LCVyNQkJCSMgaW50ICoKLQlqZwlzeXNfY2xvbmUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5czMyX2V4ZWN2ZV93cmFwcGVyKQotCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbXBhdF91cHRyX3QgKgotCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbXBhdF91cHRyX3QgKgotCWpnCWNvbXBhdF9zeXNfZXhlY3ZlCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCi0KLUVOVFJZKHN5c19mYW5vdGlmeV9pbml0X3dyYXBwZXIpCi0JbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50Ci0JbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX2Zhbm90aWZ5X2luaXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKLQotRU5UUlkoc3lzX3BybGltaXQ2NF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKLQlsbGd0cgklcjQsJXI0CQkJIyBjb25zdCBzdHJ1Y3QgcmxpbWl0NjQgX191c2VyICoKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgcmxpbWl0NjQgX191c2VyICoKLQlqZwlzeXNfcHJsaW1pdDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAotCi1FTlRSWShzeXNfbmFtZV90b19oYW5kbGVfYXRfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgX191c2VyICoKLQlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgZmlsZV9oYW5kbGUgX191c2VyICoKLQlsbGd0cgklcjUsJXI1CQkJIyBpbnQgX191c2VyICoKLQlsZ2ZyCSVyNiwlcjYJCQkjIGludAotCWpnCXN5c19uYW1lX3RvX2hhbmRsZV9hdAotCi1FTlRSWShjb21wYXRfc3lzX2Nsb2NrX2FkanRpbWVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGNsb2NraWRfdCAoaW50KQotCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXggX191c2VyICoKLQlqZwljb21wYXRfc3lzX2Nsb2NrX2FkanRpbWUKLQotRU5UUlkoc3lzX3N5bmNmc193cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgaW50Ci0JamcJc3lzX3N5bmNmcwotCi1FTlRSWShzeXNfc2V0bnNfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3NldG5zCi0KLUVOVFJZKGNvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgY29tcGF0X3BpZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqCi0JbGxnZnIJJXI2LCVyNgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2YJJXIwLDE2NCglcjE1KQkJIyB1bnNpZ25lZCBsb25nCi0Jc3RnCSVyMCwxNjAoJXIxNSkKLQlqZwljb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYKLQotRU5UUlkoY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgY29tcGF0X3BpZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKgotCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKLQlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqCi0JbGxnZnIJJXI2LCVyNgkJCSMgdW5zaWduZWQgbG9uZwotCWxsZ2YJJXIwLDE2NCglcjE1KQkJIyB1bnNpZ25lZCBsb25nCi0Jc3RnCSVyMCwxNjAoJXIxNSkKLQlqZwljb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2Ci0KLUVOVFJZKHN5c19zMzkwX3J1bnRpbWVfaW5zdHJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxnZnIJJXIzLCVyMwkJCSMgaW50Ci0JamcJc3lzX3MzOTBfcnVudGltZV9pbnN0cgotCi1FTlRSWShzeXNfa2NtcF93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKLQlsZ2ZyCSVyMywlcjMJCQkjIHBpZF90Ci0JbGdmcgklcjQsJXI0CQkJIyBpbnQKLQlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBsb25nCi0JbGxnZnIJJXI2LCVyNgkJCSMgdW5zaWduZWQgbG9uZwotCWpnCXN5c19rY21wCi0KLUVOVFJZKHN5c19maW5pdF9tb2R1bGVfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIGludAotCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgX191c2VyICoKLQlsZ2ZyCSVyNCwlcjQJCQkjIGludAotCWpnCXN5c19maW5pdF9tb2R1bGUKLQotRU5UUlkoc3lzX3NjaGVkX3NldGF0dHJfd3JhcHBlcikKLQlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90Ci0JbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHNjaGVkX2F0dHIgX191c2VyICoKLQlqZwlzeXNfc2NoZWRfc2V0YXR0cgotCi1FTlRSWShzeXNfc2NoZWRfZ2V0YXR0cl93cmFwcGVyKQotCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKLQlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyIF9fdXNlciAqCi0JbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50Ci0JamcJc3lzX3NjaGVkX2dldGF0dHIKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjRjMzlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogIENvbXBhdCBzeXRlbSBjYWxsIHdyYXBwZXJzLgorICoKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAxNAorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImVudHJ5LmgiCisKKyNkZWZpbmUgQ09NUEFUX1NZU0NBTExfV1JBUDEobmFtZSwgLi4uKSBcCisJQ09NUEFUX1NZU0NBTExfV1JBUHgoMSwgXyMjbmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5lIENPTVBBVF9TWVNDQUxMX1dSQVAyKG5hbWUsIC4uLikgXAorCUNPTVBBVF9TWVNDQUxMX1dSQVB4KDIsIF8jI25hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9XUkFQMyhuYW1lLCAuLi4pIFwKKwlDT01QQVRfU1lTQ0FMTF9XUkFQeCgzLCBfIyNuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09NUEFUX1NZU0NBTExfV1JBUDQobmFtZSwgLi4uKSBcCisJQ09NUEFUX1NZU0NBTExfV1JBUHgoNCwgXyMjbmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5lIENPTVBBVF9TWVNDQUxMX1dSQVA1KG5hbWUsIC4uLikgXAorCUNPTVBBVF9TWVNDQUxMX1dSQVB4KDUsIF8jI25hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBDT01QQVRfU1lTQ0FMTF9XUkFQNihuYW1lLCAuLi4pIFwKKwlDT01QQVRfU1lTQ0FMTF9XUkFQeCg2LCBfIyNuYW1lLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX1NDX0NPTVBBVF9UWVBFKHQsIGEpIFwKKwlfX3R5cGVvZihfX2J1aWx0aW5fY2hvb3NlX2V4cHIoc2l6ZW9mKHQpID4gNCwgMEwsICh0KTApKSBhCisKKyNkZWZpbmUgX19TQ19DT01QQVRfQ0FTVCh0LCBhKQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWxvbmcgX19SZVMgPSBhOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKChzaXplb2YodCkgPiA0KSAmJiAhX19UWVBFX0lTX0wodCkgJiYJCVwKKwkJICAgICAhX19UWVBFX0lTX1VMKHQpICYmICFfX1RZUEVfSVNfUFRSKHQpKTsJCVwKKwlpZiAoX19UWVBFX0lTX0wodCkpCQkJCQkJXAorCQlfX1JlUyA9IChzMzIpYTsJCQkJCQlcCisJaWYgKF9fVFlQRV9JU19VTCh0KSkJCQkJCQlcCisJCV9fUmVTID0gKHUzMilhOwkJCQkJCVwKKwlpZiAoX19UWVBFX0lTX1BUUih0KSkJCQkJCQlcCisJCV9fUmVTID0gYSAmIDB4N2ZmZmZmZmY7CQkJCQlcCisJKHQpX19SZVM7CQkJCQkJCVwKK30pCisKKy8qCisgKiBUaGUgQ09NUEFUX1NZU0NBTExfV1JBUCBtYWNybyBnZW5lcmF0ZXMgc3lzdGVtIGNhbGwgd3JhcHBlcnMgdG8gYmUgdXNlZCBieQorICogY29tcGF0IHRhc2tzLiBUaGVzZSB3cmFwcGVycyB3aWxsIG9ubHkgYmUgdXNlZCBmb3Igc3lzdGVtIGNhbGxzIHdoZXJlIG9ubHkKKyAqIHRoZSBzeXN0ZW0gY2FsbCBhcmd1bWVudHMgbmVlZCBzaWduIG9yIHplcm8gZXh0ZW5zaW9uIG9yIHplcm9pbmcgb2YgdGhlIHVwcGVyCisgKiAzMyBiaXRzIG9mIHBvaW50ZXJzLgorICogTm90ZTogc2luY2UgdGhlIHdyYXBwZXIgZnVuY3Rpb24gd2lsbCBhZnRlcndhcmRzIGNhbGwgYSBzeXN0ZW0gY2FsbCB3aGljaAorICogYWdhaW4gcGVyZm9ybXMgemVybyBhbmQgc2lnbiBleHRlbnNpb24gZm9yIGFsbCBzeXN0ZW0gY2FsbCBhcmd1bWVudHMgd2l0aAorICogYSBzaXplIG9mIGxlc3MgdGhhbiBlaWdodCBieXRlcywgdGhlc2UgY29tcGF0IHdyYXBwZXJzIG9ubHkgdG91Y2ggdGhvc2UKKyAqIHN5c3RlbSBjYWxsIGFyZ3VtZW50cyB3aXRoIGEgc2l6ZSBvZiBlaWdodCBieXRlcyAoKHVuc2lnbmVkKSBsb25nIGFuZAorICogcG9pbnRlcnMpLiBaZXJvIGFuZCBzaWduIGV4dGVuc2lvbiBmb3IgZS5nLiBpbnQgcGFyYW1ldGVycyB3aWxsIGJlIGRvbmUgYnkKKyAqIHRoZSByZWd1bGFyIHN5c3RlbSBjYWxsIHdyYXBwZXJzLgorICovCisjZGVmaW5lIENPTVBBVF9TWVNDQUxMX1dSQVB4KHgsIG5hbWUsIC4uLikJCQkJCVwKKwlhc21saW5rYWdlIGxvbmcgc3lzIyNuYW1lKF9fTUFQKHgsX19TQ19ERUNMLF9fVkFfQVJHU19fKSk7CQlcCisJYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXMjI25hbWUoX19NQVAoeCxfX1NDX0NPTVBBVF9UWVBFLF9fVkFfQVJHU19fKSk7XAorCWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzIyNuYW1lKF9fTUFQKHgsX19TQ19DT01QQVRfVFlQRSxfX1ZBX0FSR1NfXykpCVwKKwl7CQkJCQkJCQkJXAorCQlyZXR1cm4gc3lzIyNuYW1lKF9fTUFQKHgsX19TQ19DT01QQVRfQ0FTVCxfX1ZBX0FSR1NfXykpOwlcCisJfQorCitDT01QQVRfU1lTQ0FMTF9XUkFQMShleGl0LCBpbnQsIGVycm9yX2NvZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoY2xvc2UsIHVuc2lnbmVkIGludCwgZmQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoY3JlYXQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGxpbmssIGNvbnN0IGNoYXIgX191c2VyICosIG9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICosIG5ld25hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEodW5saW5rLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShjaGRpciwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDMobWtub2QsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCB1bW9kZV90LCBtb2RlLCB1bnNpZ25lZCwgZGV2KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGNobW9kLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdW1vZGVfdCwgbW9kZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShvbGR1bW91bnQsIGNoYXIgX191c2VyICosIG5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoYWxhcm0sIHVuc2lnbmVkIGludCwgc2Vjb25kcyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihhY2Nlc3MsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBpbnQsIG1vZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEobmljZSwgaW50LCBpbmNyZW1lbnQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoa2lsbCwgaW50LCBwaWQsIGludCwgc2lnKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHJlbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKiwgb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3bmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihta2RpciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsIHVtb2RlX3QsIG1vZGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEocm1kaXIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGR1cCwgdW5zaWduZWQgaW50LCBmaWxkZXMpOworQ09NUEFUX1NZU0NBTExfV1JBUDEocGlwZSwgaW50IF9fdXNlciAqLCBmaWxkZXMpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoYnJrLCB1bnNpZ25lZCBsb25nLCBicmspOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc2lnbmFsLCBpbnQsIHNpZywgX19zaWdoYW5kbGVyX3QsIGhhbmRsZXIpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoYWNjdCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMih1bW91bnQsIGNoYXIgX191c2VyICosIG5hbWUsIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc2V0cGdpZCwgcGlkX3QsIHBpZCwgcGlkX3QsIHBnaWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDEodW1hc2ssIGludCwgbWFzayk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShjaHJvb3QsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGR1cDIsIHVuc2lnbmVkIGludCwgb2xkZmQsIHVuc2lnbmVkIGludCwgbmV3ZmQpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoc2lnc3VzcGVuZCwgaW50LCB1bnVzZWQxLCBpbnQsIHVudXNlZDIsIG9sZF9zaWdzZXRfdCwgbWFzayk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihzZXRob3N0bmFtZSwgY2hhciBfX3VzZXIgKiwgbmFtZSwgaW50LCBsZW4pOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc3ltbGluaywgY29uc3QgY2hhciBfX3VzZXIgKiwgb2xkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXcpOworQ09NUEFUX1NZU0NBTExfV1JBUDMocmVhZGxpbmssIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNoYXIgX191c2VyICosIGJ1ZiwgaW50LCBidWZzaXopOworQ09NUEFUX1NZU0NBTExfV1JBUDEodXNlbGliLCBjb25zdCBjaGFyIF9fdXNlciAqLCBsaWJyYXJ5KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHN3YXBvbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUsIGludCwgc3dhcF9mbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChyZWJvb3QsIGludCwgbWFnaWMxLCBpbnQsIG1hZ2ljMiwgdW5zaWduZWQgaW50LCBjbWQsIHZvaWQgX191c2VyICosIGFyZyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihtdW5tYXAsIHVuc2lnbmVkIGxvbmcsIGFkZHIsIHNpemVfdCwgbGVuKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGZjaG1vZCwgdW5zaWduZWQgaW50LCBmZCwgdW1vZGVfdCwgbW9kZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihnZXRwcmlvcml0eSwgaW50LCB3aGljaCwgaW50LCB3aG8pOworQ09NUEFUX1NZU0NBTExfV1JBUDMoc2V0cHJpb3JpdHksIGludCwgd2hpY2gsIGludCwgd2hvLCBpbnQsIG5pY2V2YWwpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoc3lzbG9nLCBpbnQsIHR5cGUsIGNoYXIgX191c2VyICosIGJ1ZiwgaW50LCBsZW4pOworQ09NUEFUX1NZU0NBTExfV1JBUDEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoZnN5bmMsIHVuc2lnbmVkIGludCwgZmQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc2V0ZG9tYWlubmFtZSwgY2hhciBfX3VzZXIgKiwgbmFtZSwgaW50LCBsZW4pOworQ09NUEFUX1NZU0NBTExfV1JBUDEobmV3dW5hbWUsIHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKiwgbmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhtcHJvdGVjdCwgdW5zaWduZWQgbG9uZywgc3RhcnQsIHNpemVfdCwgbGVuLCB1bnNpZ25lZCBsb25nLCBwcm90KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGluaXRfbW9kdWxlLCB2b2lkIF9fdXNlciAqLCB1bW9kLCB1bnNpZ25lZCBsb25nLCBsZW4sIGNvbnN0IGNoYXIgX191c2VyICosIHVhcmdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGRlbGV0ZV9tb2R1bGUsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWVfdXNlciwgdW5zaWduZWQgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChxdW90YWN0bCwgdW5zaWduZWQgaW50LCBjbWQsIGNvbnN0IGNoYXIgX191c2VyICosIHNwZWNpYWwsIHFpZF90LCBpZCwgdm9pZCBfX3VzZXIgKiwgYWRkcik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShnZXRwZ2lkLCBwaWRfdCwgcGlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGZjaGRpciwgdW5zaWduZWQgaW50LCBmZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihiZGZsdXNoLCBpbnQsIGZ1bmMsIGxvbmcsIGRhdGEpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoc3lzZnMsIGludCwgb3B0aW9uLCB1bnNpZ25lZCBsb25nLCBhcmcxLCB1bnNpZ25lZCBsb25nLCBhcmcyKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHMzOTBfcGVyc29uYWxpdHksIHVuc2lnbmVkIGludCwgcGVyc29uYWxpdHkpOworQ09NUEFUX1NZU0NBTExfV1JBUDUobGxzZWVrLCB1bnNpZ25lZCBpbnQsIGZkLCB1bnNpZ25lZCBsb25nLCBoaWdoLCB1bnNpZ25lZCBsb25nLCBsb3csIGxvZmZfdCBfX3VzZXIgKiwgcmVzdWx0LCB1bnNpZ25lZCBpbnQsIHdoZW5jZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihmbG9jaywgdW5zaWduZWQgaW50LCBmZCwgdW5zaWduZWQgaW50LCBjbWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDMobXN5bmMsIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbiwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShnZXRzaWQsIHBpZF90LCBwaWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoZmRhdGFzeW5jLCB1bnNpZ25lZCBpbnQsIGZkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKG1sb2NrLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgc2l6ZV90LCBsZW4pOworQ09NUEFUX1NZU0NBTExfV1JBUDIobXVubG9jaywgdW5zaWduZWQgbG9uZywgc3RhcnQsIHNpemVfdCwgbGVuKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKG1sb2NrYWxsLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNjaGVkX3NldHBhcmFtLCBwaWRfdCwgcGlkLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICosIHBhcmFtKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNjaGVkX2dldHBhcmFtLCBwaWRfdCwgcGlkLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICosIHBhcmFtKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHNjaGVkX3NldHNjaGVkdWxlciwgcGlkX3QsIHBpZCwgaW50LCBwb2xpY3ksIHN0cnVjdCBzY2hlZF9wYXJhbSBfX3VzZXIgKiwgcGFyYW0pOworQ09NUEFUX1NZU0NBTExfV1JBUDEoc2NoZWRfZ2V0c2NoZWR1bGVyLCBwaWRfdCwgcGlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHNjaGVkX2dldF9wcmlvcml0eV9tYXgsIGludCwgcG9saWN5KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHNjaGVkX2dldF9wcmlvcml0eV9taW4sIGludCwgcG9saWN5KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KG1yZW1hcCwgdW5zaWduZWQgbG9uZywgYWRkciwgdW5zaWduZWQgbG9uZywgb2xkX2xlbiwgdW5zaWduZWQgbG9uZywgbmV3X2xlbiwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHVuc2lnbmVkIGxvbmcsIG5ld19hZGRyKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHBvbGwsIHN0cnVjdCBwb2xsZmQgX191c2VyICosIHVmZHMsIHVuc2lnbmVkIGludCwgbmZkcywgaW50LCB0aW1lb3V0KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KHByY3RsLCBpbnQsIG9wdGlvbiwgdW5zaWduZWQgbG9uZywgYXJnMiwgdW5zaWduZWQgbG9uZywgYXJnMywgdW5zaWduZWQgbG9uZywgYXJnNCwgdW5zaWduZWQgbG9uZywgYXJnNSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihnZXRjd2QsIGNoYXIgX191c2VyICosIGJ1ZiwgdW5zaWduZWQgbG9uZywgc2l6ZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihjYXBnZXQsIGNhcF91c2VyX2hlYWRlcl90LCBoZWFkZXIsIGNhcF91c2VyX2RhdGFfdCwgZGF0YXB0cik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihjYXBzZXQsIGNhcF91c2VyX2hlYWRlcl90LCBoZWFkZXIsIGNvbnN0IGNhcF91c2VyX2RhdGFfdCwgZGF0YSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhsY2hvd24sIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCB1aWRfdCwgdXNlciwgZ2lkX3QsIGdyb3VwKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHNldHJldWlkLCB1aWRfdCwgcnVpZCwgdWlkX3QsIGV1aWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc2V0cmVnaWQsIGdpZF90LCByZ2lkLCBnaWRfdCwgZWdpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihnZXRncm91cHMsIGludCwgZ2lkc2V0c2l6ZSwgZ2lkX3QgX191c2VyICosIGdyb3VwbGlzdCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihzZXRncm91cHMsIGludCwgZ2lkc2V0c2l6ZSwgZ2lkX3QgX191c2VyICosIGdyb3VwbGlzdCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhmY2hvd24sIHVuc2lnbmVkIGludCwgZmQsIHVpZF90LCB1c2VyLCBnaWRfdCwgZ3JvdXApOworQ09NUEFUX1NZU0NBTExfV1JBUDMoc2V0cmVzdWlkLCB1aWRfdCwgcnVpZCwgdWlkX3QsIGV1aWQsIHVpZF90LCBzdWlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGdldHJlc3VpZCwgdWlkX3QgX191c2VyICosIHJ1aWQsIHVpZF90IF9fdXNlciAqLCBldWlkLCB1aWRfdCBfX3VzZXIgKiwgc3VpZCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhzZXRyZXNnaWQsIGdpZF90LCByZ2lkLCBnaWRfdCwgZWdpZCwgZ2lkX3QsIHNnaWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoZ2V0cmVzZ2lkLCBnaWRfdCBfX3VzZXIgKiwgcmdpZCwgZ2lkX3QgX191c2VyICosIGVnaWQsIGdpZF90IF9fdXNlciAqLCBzZ2lkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGNob3duLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdWlkX3QsIHVzZXIsIGdpZF90LCBncm91cCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzZXR1aWQsIHVpZF90LCB1aWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDEoc2V0Z2lkLCBnaWRfdCwgZ2lkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHNldGZzdWlkLCB1aWRfdCwgdWlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHNldGZzZ2lkLCBnaWRfdCwgZ2lkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHBpdm90X3Jvb3QsIGNvbnN0IGNoYXIgX191c2VyICosIG5ld19yb290LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwdXRfb2xkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKG1pbmNvcmUsIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbiwgdW5zaWduZWQgY2hhciBfX3VzZXIgKiwgdmVjKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKG1hZHZpc2UsIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbiwgaW50LCBiZWhhdmlvcik7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShzZXR4YXR0ciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiwgdmFsdWUsIHNpemVfdCwgc2l6ZSwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShsc2V0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUsIGNvbnN0IHZvaWQgX191c2VyICosIHZhbHVlLCBzaXplX3QsIHNpemUsIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDUoZnNldHhhdHRyLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCBjb25zdCB2b2lkIF9fdXNlciAqLCB2YWx1ZSwgc2l6ZV90LCBzaXplLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGdldGRlbnRzNjQsIHVuc2lnbmVkIGludCwgZmQsIHN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KGdldHhhdHRyLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRoLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCB2b2lkIF9fdXNlciAqLCB2YWx1ZSwgc2l6ZV90LCBzaXplKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KGxnZXR4YXR0ciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSwgdm9pZCBfX3VzZXIgKiwgdmFsdWUsIHNpemVfdCwgc2l6ZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChmZ2V0eGF0dHIsIGludCwgZmQsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUsIHZvaWQgX191c2VyICosIHZhbHVlLCBzaXplX3QsIHNpemUpOworQ09NUEFUX1NZU0NBTExfV1JBUDMobGlzdHhhdHRyLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRoLCBjaGFyIF9fdXNlciAqLCBsaXN0LCBzaXplX3QsIHNpemUpOworQ09NUEFUX1NZU0NBTExfV1JBUDMobGxpc3R4YXR0ciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgY2hhciBfX3VzZXIgKiwgbGlzdCwgc2l6ZV90LCBzaXplKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGZsaXN0eGF0dHIsIGludCwgZmQsIGNoYXIgX191c2VyICosIGxpc3QsIHNpemVfdCwgc2l6ZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihyZW1vdmV4YXR0ciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihscmVtb3ZleGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoZnJlbW92ZXhhdHRyLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGV4aXRfZ3JvdXAsIGludCwgZXJyb3JfY29kZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzZXRfdGlkX2FkZHJlc3MsIGludCBfX3VzZXIgKiwgdGlkcHRyKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGVwb2xsX2NyZWF0ZSwgaW50LCBzaXplKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KGVwb2xsX2N0bCwgaW50LCBlcGZkLCBpbnQsIG9wLCBpbnQsIGZkLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICosIGV2ZW50KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KGVwb2xsX3dhaXQsIGludCwgZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqLCBldmVudHMsIGludCwgbWF4ZXZlbnRzLCBpbnQsIHRpbWVvdXQpOworQ09NUEFUX1NZU0NBTExfV1JBUDEodGltZXJfZ2V0b3ZlcnJ1biwgdGltZXJfdCwgdGltZXJfaWQpOworQ09NUEFUX1NZU0NBTExfV1JBUDEodGltZXJfZGVsZXRlLCBjb21wYXRfdGltZXJfdCwgY29tcGF0X3RpbWVyX2lkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGlvX2Rlc3Ryb3ksIGFpb19jb250ZXh0X3QsIGN0eCk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhpb19jYW5jZWwsIGFpb19jb250ZXh0X3QsIGN0eF9pZCwgc3RydWN0IGlvY2IgX191c2VyICosIGlvY2IsIHN0cnVjdCBpb19ldmVudCBfX3VzZXIgKiwgcmVzdWx0KTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKG1xX3VubGluaywgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShhZGRfa2V5LCBjb25zdCBjaGFyIF9fdXNlciAqLCB0cCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZHNjLCBjb25zdCB2b2lkIF9fdXNlciAqLCBwbGQsIHNpemVfdCwgbGVuLCBrZXlfc2VyaWFsX3QsIGlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KHJlcXVlc3Rfa2V5LCBjb25zdCBjaGFyIF9fdXNlciAqLCB0cCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZHNjLCBjb25zdCBjaGFyIF9fdXNlciAqLCBpbmZvLCBrZXlfc2VyaWFsX3QsIGlkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KHJlbWFwX2ZpbGVfcGFnZXMsIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCB1bnNpZ25lZCBsb25nLCBzaXplLCB1bnNpZ25lZCBsb25nLCBwcm90LCB1bnNpZ25lZCBsb25nLCBwZ29mZiwgdW5zaWduZWQgbG9uZywgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDMoaW9wcmlvX3NldCwgaW50LCB3aGljaCwgaW50LCB3aG8sIGludCwgaW9wcmlvKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGlvcHJpb19nZXQsIGludCwgd2hpY2gsIGludCwgd2hvKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGlub3RpZnlfYWRkX3dhdGNoLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRoLCB1MzIsIG1hc2spOworQ09NUEFUX1NZU0NBTExfV1JBUDIoaW5vdGlmeV9ybV93YXRjaCwgaW50LCBmZCwgX19zMzIsIHdkKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKG1rZGlyYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChta25vZGF0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHVtb2RlX3QsIG1vZGUsIHVuc2lnbmVkLCBkZXYpOworQ09NUEFUX1NZU0NBTExfV1JBUDUoZmNob3duYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdWlkX3QsIHVzZXIsIGdpZF90LCBncm91cCwgaW50LCBmbGFnKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHVubGlua2F0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsIGludCwgZmxhZyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChyZW5hbWVhdCwgaW50LCBvbGRkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIG9sZG5hbWUsIGludCwgbmV3ZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KGxpbmthdCwgaW50LCBvbGRkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIG9sZG5hbWUsIGludCwgbmV3ZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHN5bWxpbmthdCwgY29uc3QgY2hhciBfX3VzZXIgKiwgb2xkbmFtZSwgaW50LCBuZXdkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIG5ld25hbWUpOworQ09NUEFUX1NZU0NBTExfV1JBUDQocmVhZGxpbmthdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNoYXIgX191c2VyICosIGJ1ZiwgaW50LCBidWZzaXopOworQ09NUEFUX1NZU0NBTExfV1JBUDMoZmNobW9kYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdW1vZGVfdCwgbW9kZSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhmYWNjZXNzYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgaW50LCBtb2RlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKHVuc2hhcmUsIHVuc2lnbmVkIGxvbmcsIHVuc2hhcmVfZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDYoc3BsaWNlLCBpbnQsIGZkX2luLCBsb2ZmX3QgX191c2VyICosIG9mZl9pbiwgaW50LCBmZF9vdXQsIGxvZmZfdCBfX3VzZXIgKiwgb2ZmX291dCwgc2l6ZV90LCBsZW4sIHVuc2lnbmVkIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDQodGVlLCBpbnQsIGZkaW4sIGludCwgZmRvdXQsIHNpemVfdCwgbGVuLCB1bnNpZ25lZCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKGdldGNwdSwgdW5zaWduZWQgX191c2VyICosIGNwdSwgdW5zaWduZWQgX191c2VyICosIG5vZGUsIHN0cnVjdCBnZXRjcHVfY2FjaGUgX191c2VyICosIGNhY2hlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGV2ZW50ZmQsIHVuc2lnbmVkIGludCwgY291bnQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIodGltZXJmZF9jcmVhdGUsIGludCwgY2xvY2tpZCwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMihldmVudGZkMiwgdW5zaWduZWQgaW50LCBjb3VudCwgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShpbm90aWZ5X2luaXQxLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHBpcGUyLCBpbnQgX191c2VyICosIGZpbGRlcywgaW50LCBmbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhkdXAzLCB1bnNpZ25lZCBpbnQsIG9sZGZkLCB1bnNpZ25lZCBpbnQsIG5ld2ZkLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAxKGVwb2xsX2NyZWF0ZTEsIGludCwgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDIodGtpbGwsIGludCwgcGlkLCBpbnQsIHNpZyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyh0Z2tpbGwsIGludCwgdGdpZCwgaW50LCBwaWQsIGludCwgc2lnKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA1KHBlcmZfZXZlbnRfb3Blbiwgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBfX3VzZXIgKiwgYXR0cl91cHRyLCBwaWRfdCwgcGlkLCBpbnQsIGNwdSwgaW50LCBncm91cF9mZCwgdW5zaWduZWQgbG9uZywgZmxhZ3MpOworQ09NUEFUX1NZU0NBTExfV1JBUDUoY2xvbmUsIHVuc2lnbmVkIGxvbmcsIG5ld3NwLCB1bnNpZ25lZCBsb25nLCBjbG9uZV9mbGFncywgaW50IF9fdXNlciAqLCBwYXJlbnRfdGlkcHRyLCBpbnQgX191c2VyICosIGNoaWxkX3RpZHB0ciwgaW50LCB0bHNfdmFsKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKGZhbm90aWZ5X2luaXQsIHVuc2lnbmVkIGludCwgZmxhZ3MsIHVuc2lnbmVkIGludCwgZXZlbnRfZl9mbGFncyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNChwcmxpbWl0NjQsIHBpZF90LCBwaWQsIHVuc2lnbmVkIGludCwgcmVzb3VyY2UsIGNvbnN0IHN0cnVjdCBybGltaXQ2NCBfX3VzZXIgKiwgbmV3X3JsaW0sIHN0cnVjdCBybGltaXQ2NCBfX3VzZXIgKiwgb2xkX3JsaW0pOworQ09NUEFUX1NZU0NBTExfV1JBUDUobmFtZV90b19oYW5kbGVfYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCBzdHJ1Y3QgZmlsZV9oYW5kbGUgX191c2VyICosIGhhbmRsZSwgaW50IF9fdXNlciAqLCBtbnRfaWQsIGludCwgZmxhZyk7CitDT01QQVRfU1lTQ0FMTF9XUkFQMShzeW5jZnMsIGludCwgZmQpOworQ09NUEFUX1NZU0NBTExfV1JBUDIoc2V0bnMsIGludCwgZmQsIGludCwgbnN0eXBlKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAyKHMzOTBfcnVudGltZV9pbnN0ciwgaW50LCBjb21tYW5kLCBpbnQsIHNpZ251bSk7CitDT01QQVRfU1lTQ0FMTF9XUkFQNShrY21wLCBwaWRfdCwgcGlkMSwgcGlkX3QsIHBpZDIsIGludCwgdHlwZSwgdW5zaWduZWQgbG9uZywgaWR4MSwgdW5zaWduZWQgbG9uZywgaWR4Mik7CitDT01QQVRfU1lTQ0FMTF9XUkFQMyhmaW5pdF9tb2R1bGUsIGludCwgZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHVhcmdzLCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVAzKHNjaGVkX3NldGF0dHIsIHBpZF90LCBwaWQsIHN0cnVjdCBzY2hlZF9hdHRyIF9fdXNlciAqLCBhdHRyLCB1bnNpZ25lZCBpbnQsIGZsYWdzKTsKK0NPTVBBVF9TWVNDQUxMX1dSQVA0KHNjaGVkX2dldGF0dHIsIHBpZF90LCBwaWQsIHN0cnVjdCBzY2hlZF9hdHRyIF9fdXNlciAqLCBhdHRyLCB1bnNpZ25lZCBpbnQsIHNpemUsIHVuc2lnbmVkIGludCwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCmluZGV4IGZjYTIwYjUuLjZiNTk0NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKQEAgLTM4MCw4ICszODAsNiBAQAogCQlTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyB8PSBNQUNISU5FX0ZMQUdfRURBVDI7CiAJaWYgKHRlc3RfZmFjaWxpdHkoMykpCiAJCVMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzIHw9IE1BQ0hJTkVfRkxBR19JRFRFOwotCWlmICh0ZXN0X2ZhY2lsaXR5KDI3KSkKLQkJUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgfD0gTUFDSElORV9GTEFHX01WQ09TOwogCWlmICh0ZXN0X2ZhY2lsaXR5KDQwKSkKIAkJUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgfD0gTUFDSElORV9GTEFHX0xQUDsKIAlpZiAodGVzdF9mYWNpbGl0eSg1MCkgJiYgdGVzdF9mYWNpbGl0eSg3MykpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKaW5kZXggMGRjMmI2ZC4uNTI2ZDM3MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwpAQCAtNDMsNiArNDMsNyBAQAogCQkgX1RJRl9NQ0NLX1BFTkRJTkcpCiBfVElGX1RSQUNFICAgID0gKF9USUZfU1lTQ0FMTF9UUkFDRSB8IF9USUZfU1lTQ0FMTF9BVURJVCB8IF9USUZfU0VDQ09NUCB8IFwKIAkJIF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UKQorX1RJRl9UUkFOU0ZFUiA9IChfVElGX01DQ0tfUEVORElORyB8IF9USUZfVExCX1dBSVQpCiAKIFNUQUNLX1NISUZUID0gUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUgogU1RBQ0tfU0laRSAgPSAxIDw8IFNUQUNLX1NISUZUCkBAIC0xNTksMTAgKzE2MCwxMiBAQAogCWxjdGwJJWM0LCVjNCxfX1RBU0tfcGlkKCVyMykJCSMgbG9hZCBwaWQgdG8gY29udHJvbCByZWcuIDQKIAltdmMJX19MQ19DVVJSRU5UX1BJRCg0LCVyMCksX19UQVNLX3BpZCglcjMpCSMgc3RvcmUgcGlkIG9mIG5leHQKIAlsCSVyMTUsX19USFJFQURfa3NwKCVyMykJCSMgbG9hZCBrZXJuZWwgc3RhY2sgb2YgbmV4dAotCXRtCV9fVElfZmxhZ3MrMyglcjQpLF9USUZfTUNDS19QRU5ESU5HICMgbWFjaGluZSBjaGVjayBwZW5kaW5nPworCWxoaQklcjYsX1RJRl9UUkFOU0ZFUgkJIyB0cmFuc2ZlciBUSUYgYml0cworCW4JJXI2LF9fVElfZmxhZ3MoJXI0KQkJIyBpc29sYXRlIFRJRiBiaXRzCiAJanoJMGYKLQluaQlfX1RJX2ZsYWdzKzMoJXI0KSwyNTUtX1RJRl9NQ0NLX1BFTkRJTkcJIyBjbGVhciBmbGFnIGluIHByZXYKLQlvaQlfX1RJX2ZsYWdzKzMoJXI1KSxfVElGX01DQ0tfUEVORElORwkjIHNldCBpdCBpbiBuZXh0CisJbwklcjYsX19USV9mbGFncyglcjUpCQkjIHNldCBUSUYgYml0cyBvZiBuZXh0CisJc3QJJXI2LF9fVElfZmxhZ3MoJXI1KQorCW5pCV9fVElfZmxhZ3MrMyglcjQpLDI1NS1fVElGX1RSQU5TRkVSICMgY2xlYXIgVElGIGJpdHMgb2YgcHJldgogMDoJbG0JJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCSMgbG9hZCBncHJzIG9mIG5leHQgdGFzawogCWJyCSVyMTQKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oCmluZGV4IGNiNTMzZjcuLjZhYzc4MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaAorKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LmgKQEAgLTY3LDkgKzY3LDcgQEAKIHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJnczsKIHN0cnVjdCBvbGRfc2lnYWN0aW9uOwogCi1sb25nIHN5c19zaWdyZXR1cm4odm9pZCk7Ci1sb25nIHN5c19ydF9zaWdyZXR1cm4odm9pZCk7Ci1sb25nIHN5czMyX3NpZ3JldHVybih2b2lkKTsKLWxvbmcgc3lzMzJfcnRfc2lncmV0dXJuKHZvaWQpOworbG9uZyBzeXNfczM5MF9wZXJzb25hbGl0eSh1bnNpZ25lZCBpbnQgcGVyc29uYWxpdHkpOworbG9uZyBzeXNfczM5MF9ydW50aW1lX2luc3RyKGludCBjb21tYW5kLCBpbnQgc2lnbnVtKTsKIAogI2VuZGlmIC8qIF9FTlRSWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCmluZGV4IDM4NGU2MDkuLmUwOWRiZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCkBAIC00OCw2ICs0OCw3IEBACiAJCSBfVElGX01DQ0tfUEVORElORykKIF9USUZfVFJBQ0UgICAgPSAoX1RJRl9TWVNDQUxMX1RSQUNFIHwgX1RJRl9TWVNDQUxMX0FVRElUIHwgX1RJRl9TRUNDT01QIHwgXAogCQkgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQpCitfVElGX1RSQU5TRkVSID0gKF9USUZfTUNDS19QRU5ESU5HIHwgX1RJRl9UTEJfV0FJVCkKIAogI2RlZmluZSBCQVNFRChuYW1lKSBuYW1lLXN5c3RlbV9jYWxsKCVyMTMpCiAKQEAgLTE4OSwxMCArMTkwLDEyIEBACiAJbGN0bAklYzQsJWM0LF9fVEFTS19waWQoJXIzKQkJIyBsb2FkIHBpZCB0byBjb250cm9sIHJlZy4gNAogCW12YwlfX0xDX0NVUlJFTlRfUElEKzQoNCwlcjApLF9fVEFTS19waWQoJXIzKSAjIHN0b3JlIHBpZCBvZiBuZXh0CiAJbGcJJXIxNSxfX1RIUkVBRF9rc3AoJXIzKQkJIyBsb2FkIGtlcm5lbCBzdGFjayBvZiBuZXh0Ci0JdG0JX19USV9mbGFncys3KCVyNCksX1RJRl9NQ0NLX1BFTkRJTkcgIyBtYWNoaW5lIGNoZWNrIHBlbmRpbmc/CisJbGxpbGwJJXI2LF9USUZfVFJBTlNGRVIJCSMgdHJhbnNmZXIgVElGIGJpdHMKKwluZwklcjYsX19USV9mbGFncyglcjQpCQkjIGlzb2xhdGUgVElGIGJpdHMKIAlqegkwZgotCW5pCV9fVElfZmxhZ3MrNyglcjQpLDI1NS1fVElGX01DQ0tfUEVORElORwkjIGNsZWFyIGZsYWcgaW4gcHJldgotCW9pCV9fVElfZmxhZ3MrNyglcjUpLF9USUZfTUNDS19QRU5ESU5HCSMgc2V0IGl0IGluIG5leHQKKwlvZwklcjYsX19USV9mbGFncyglcjUpCQkjIHNldCBUSUYgYml0cyBvZiBuZXh0CisJc3RnCSVyNixfX1RJX2ZsYWdzKCVyNSkKKwluaQlfX1RJX2ZsYWdzKzcoJXI0KSwyNTUtX1RJRl9UUkFOU0ZFUiAjIGNsZWFyIFRJRiBiaXRzIG9mIHByZXYKIDA6CWxtZwklcjYsJXIxNSxfX1NGX0dQUlMoJXIxNSkJIyBsb2FkIGdwcnMgb2YgbmV4dCB0YXNrCiAJYnIJJXIxNAogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2lycS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwppbmRleCBiYjI3YTI2Li5hNzcwYmU5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2lycS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgogI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvczM5MC9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDVkMmRmYTMuLjYxNTk1YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJCSAgICAgICA6IFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMOwogfQogCi12b2lkIHByaW50X2RlYnVnX2NmKHZvaWQpCitzdGF0aWMgdm9pZCBwcmludF9kZWJ1Z19jZih2b2lkKQogewogCXN0cnVjdCBjcHVtZl9jdHJfaW5mbyBjZl9pbmZvOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBmNmJlNjA4Li40YWM4ZmFmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTg1LDcgKzg1LDEwIEBACiAKIAkvKiBtZXJnZSBUSUZfU0lOR0xFX1NURVAgaW50byB1c2VyIHNwZWNpZmllZCBQRVIgcmVnaXN0ZXJzLiAqLwogCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFX1NURVApKSB7Ci0JCW5ldy5jb250cm9sIHw9IFBFUl9FVkVOVF9JRkVUQ0g7CisJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfQkxPQ0tfU1RFUCkpCisJCQluZXcuY29udHJvbCB8PSBQRVJfRVZFTlRfQlJBTkNIOworCQllbHNlCisJCQluZXcuY29udHJvbCB8PSBQRVJfRVZFTlRfSUZFVENIOwogI2lmZGVmIENPTkZJR182NEJJVAogCQluZXcuY29udHJvbCB8PSBQRVJfQ09OVFJPTF9TVVNQRU5TSU9OOwogCQluZXcuY29udHJvbCB8PSBQRVJfRVZFTlRfVFJBTlNBQ1RJT05fRU5EOwpAQCAtMTA3LDE0ICsxMTAsMjIgQEAKIAogdm9pZCB1c2VyX2VuYWJsZV9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9CTE9DS19TVEVQKTsKIAlzZXRfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVfU1RFUCk7CiB9CiAKIHZvaWQgdXNlcl9kaXNhYmxlX3NpbmdsZV9zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0JMT0NLX1NURVApOwogCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFX1NURVApOwogfQogCit2b2lkIHVzZXJfZW5hYmxlX2Jsb2NrX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRV9TVEVQKTsKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9CTE9DS19TVEVQKTsKK30KKwogLyoKICAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCAwOWUyZjQ2Li5mNzBmMjQ4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vaXBsLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZmFjaWxpdHkuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC02NSwxMiArNjQsNiBAQAogI2luY2x1ZGUgImVudHJ5LmgiCiAKIC8qCi0gKiBVc2VyIGNvcHkgb3BlcmF0aW9ucy4KLSAqLwotc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3M7Ci1FWFBPUlRfU1lNQk9MKHVhY2Nlc3MpOwotCi0vKgogICogTWFjaGluZSBzZXR1cC4uCiAgKi8KIHVuc2lnbmVkIGludCBjb25zb2xlX21vZGUgPSAwOwpAQCAtMjk0LDE0ICsyODcsNiBAQAogfQogZWFybHlfcGFyYW0oInZtYWxsb2MiLCBwYXJzZV92bWFsbG9jKTsKIAotc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfdXNlcl9tb2RlKGNoYXIgKnApCi17Ci0JaWYgKCFwIHx8IHN0cmNtcChwLCAicHJpbWFyeSIpID09IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotZWFybHlfcGFyYW0oInVzZXJfbW9kZSIsIGVhcmx5X3BhcnNlX3VzZXJfbW9kZSk7Ci0KIHZvaWQgKnJlc3RhcnRfc3RhY2sgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKTsKIAogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2xvd2NvcmUodm9pZCkKQEAgLTEwMDksOCArOTk0LDYgQEAKIAlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7CiAJaW5pdF9tbS5icmsgPSAodW5zaWduZWQgbG9uZykgJl9lbmQ7CiAKLQl1YWNjZXNzID0gTUFDSElORV9IQVNfTVZDT1MgPyB1YWNjZXNzX212Y29zIDogdWFjY2Vzc19wdDsKLQogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAJZGV0ZWN0X21lbW9yeV9sYXlvdXQobWVtb3J5X2NodW5rLCBtZW1vcnlfZW5kKTsKIAlvc19pbmZvX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCmluZGV4IGE3MTI1YjYuLjg4Mjc4ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpAQCAtNzczLDExICs3NzMsMTEgQEAKIAogdm9pZCBfX2luaXQgc21wX2ZpbGxfcG9zc2libGVfbWFzayh2b2lkKQogewotCXVuc2lnbmVkIGludCBwb3NzaWJsZSwgY3B1OworCXVuc2lnbmVkIGludCBwb3NzaWJsZSwgc2NscCwgY3B1OwogCi0JcG9zc2libGUgPSBzZXR1cF9wb3NzaWJsZV9jcHVzOwotCWlmICghcG9zc2libGUpCi0JCXBvc3NpYmxlID0gTUFDSElORV9JU19WTSA/IDY0IDogbnJfY3B1X2lkczsKKwlzY2xwID0gc2NscF9nZXRfbWF4X2NwdSgpID86IG5yX2NwdV9pZHM7CisJcG9zc2libGUgPSBzZXR1cF9wb3NzaWJsZV9jcHVzID86IG5yX2NwdV9pZHM7CisJcG9zc2libGUgPSBtaW4ocG9zc2libGUsIHNjbHApOwogCWZvciAoY3B1ID0gMDsgY3B1IDwgcG9zc2libGUgJiYgY3B1IDwgbnJfY3B1X2lkczsgY3B1KyspCiAJCXNldF9jcHVfcG9zc2libGUoY3B1LCB0cnVlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCAxNDM5OTIxLi41NDJlZjQ4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCkBAIC05LDM0OSArOSwzNDkgQEAKICNkZWZpbmUgTklfU1lTQ0FMTCBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLHN5c19uaV9zeXNjYWxsLHN5c19uaV9zeXNjYWxsKQogCiBOSV9TWVNDQUxMCQkJCQkJCS8qIDAgKi8KLVNZU0NBTEwoc3lzX2V4aXQsc3lzX2V4aXQsc3lzMzJfZXhpdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfZXhpdCxzeXNfZXhpdCxjb21wYXRfc3lzX2V4aXQpCiBTWVNDQUxMKHN5c19mb3JrLHN5c19mb3JrLHN5c19mb3JrKQotU1lTQ0FMTChzeXNfcmVhZCxzeXNfcmVhZCxzeXMzMl9yZWFkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c193cml0ZSxzeXNfd3JpdGUsc3lzMzJfd3JpdGVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3JlYWQsc3lzX3JlYWQsY29tcGF0X3N5c19zMzkwX3JlYWQpCitTWVNDQUxMKHN5c193cml0ZSxzeXNfd3JpdGUsY29tcGF0X3N5c19zMzkwX3dyaXRlKQogU1lTQ0FMTChzeXNfb3BlbixzeXNfb3Blbixjb21wYXRfc3lzX29wZW4pCQkJLyogNSAqLwotU1lTQ0FMTChzeXNfY2xvc2Usc3lzX2Nsb3NlLHN5czMyX2Nsb3NlX3dyYXBwZXIpCitTWVNDQUxMKHN5c19jbG9zZSxzeXNfY2xvc2UsY29tcGF0X3N5c19jbG9zZSkKIFNZU0NBTEwoc3lzX3Jlc3RhcnRfc3lzY2FsbCxzeXNfcmVzdGFydF9zeXNjYWxsLHN5c19yZXN0YXJ0X3N5c2NhbGwpCi1TWVNDQUxMKHN5c19jcmVhdCxzeXNfY3JlYXQsc3lzMzJfY3JlYXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2xpbmssc3lzX2xpbmssc3lzMzJfbGlua193cmFwcGVyKQotU1lTQ0FMTChzeXNfdW5saW5rLHN5c191bmxpbmssc3lzMzJfdW5saW5rX3dyYXBwZXIpCQkvKiAxMCAqLwotU1lTQ0FMTChzeXNfZXhlY3ZlLHN5c19leGVjdmUsc3lzMzJfZXhlY3ZlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19jaGRpcixzeXNfY2hkaXIsc3lzMzJfY2hkaXJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3RpbWUsc3lzX25pX3N5c2NhbGwsc3lzMzJfdGltZV93cmFwcGVyKQkJLyogb2xkIHRpbWUgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfbWtub2Qsc3lzX21rbm9kLHN5czMyX21rbm9kX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19jaG1vZCxzeXNfY2htb2Qsc3lzMzJfY2htb2Rfd3JhcHBlcikJCS8qIDE1ICovCi1TWVNDQUxMKHN5c19sY2hvd24xNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9sY2hvd24xNl93cmFwcGVyKQkvKiBvbGQgbGNob3duMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19jcmVhdCxzeXNfY3JlYXQsY29tcGF0X3N5c19jcmVhdCkKK1NZU0NBTEwoc3lzX2xpbmssc3lzX2xpbmssY29tcGF0X3N5c19saW5rKQorU1lTQ0FMTChzeXNfdW5saW5rLHN5c191bmxpbmssY29tcGF0X3N5c191bmxpbmspCQkvKiAxMCAqLworU1lTQ0FMTChzeXNfZXhlY3ZlLHN5c19leGVjdmUsY29tcGF0X3N5c19leGVjdmUpCitTWVNDQUxMKHN5c19jaGRpcixzeXNfY2hkaXIsY29tcGF0X3N5c19jaGRpcikKK1NZU0NBTEwoc3lzX3RpbWUsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c190aW1lKQkJLyogb2xkIHRpbWUgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfbWtub2Qsc3lzX21rbm9kLGNvbXBhdF9zeXNfbWtub2QpCitTWVNDQUxMKHN5c19jaG1vZCxzeXNfY2htb2QsY29tcGF0X3N5c19jaG1vZCkJCQkvKiAxNSAqLworU1lTQ0FMTChzeXNfbGNob3duMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2xjaG93bjE2KQkvKiBvbGQgbGNob3duMTYgc3lzY2FsbCovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBicmVhayBzeXNjYWxsIGhvbGRlciAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc3RhdCBzeXNjYWxsIGhvbGRlciAqLwogU1lTQ0FMTChzeXNfbHNlZWssc3lzX2xzZWVrLGNvbXBhdF9zeXNfbHNlZWspCiBTWVNDQUxMKHN5c19nZXRwaWQsc3lzX2dldHBpZCxzeXNfZ2V0cGlkKQkJCS8qIDIwICovCi1TWVNDQUxMKHN5c19tb3VudCxzeXNfbW91bnQsc3lzMzJfbW91bnRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX29sZHVtb3VudCxzeXNfb2xkdW1vdW50LHN5czMyX29sZHVtb3VudF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0dWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0dWlkMTZfd3JhcHBlcikJLyogb2xkIHNldHVpZDE2IHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfZ2V0dWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0dWlkMTYpCQkvKiBvbGQgZ2V0dWlkMTYgc3lzY2FsbCovCi1TWVNDQUxMKHN5c19zdGltZSxzeXNfbmlfc3lzY2FsbCxzeXMzMl9zdGltZV93cmFwcGVyKQkJLyogMjUgb2xkIHN0aW1lIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3B0cmFjZSxzeXNfcHRyYWNlLHN5czMyX3B0cmFjZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfYWxhcm0sc3lzX2FsYXJtLHN5czMyX2FsYXJtX3dyYXBwZXIpCitTWVNDQUxMKHN5c19tb3VudCxzeXNfbW91bnQsY29tcGF0X3N5c19tb3VudCkKK1NZU0NBTEwoc3lzX29sZHVtb3VudCxzeXNfb2xkdW1vdW50LGNvbXBhdF9zeXNfb2xkdW1vdW50KQorU1lTQ0FMTChzeXNfc2V0dWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldHVpZDE2KQkvKiBvbGQgc2V0dWlkMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19nZXR1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0dWlkMTYpCS8qIG9sZCBnZXR1aWQxNiBzeXNjYWxsKi8KK1NZU0NBTEwoc3lzX3N0aW1lLHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfc3RpbWUpCQkvKiAyNSBvbGQgc3RpbWUgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfcHRyYWNlLHN5c19wdHJhY2UsY29tcGF0X3N5c19wdHJhY2UpCitTWVNDQUxMKHN5c19hbGFybSxzeXNfYWxhcm0sY29tcGF0X3N5c19hbGFybSkKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIGZzdGF0IHN5c2NhbGwgKi8KIFNZU0NBTEwoc3lzX3BhdXNlLHN5c19wYXVzZSxzeXNfcGF1c2UpCi1TWVNDQUxMKHN5c191dGltZSxzeXNfdXRpbWUsY29tcGF0X3N5c191dGltZV93cmFwcGVyKQkJLyogMzAgKi8KK1NZU0NBTEwoc3lzX3V0aW1lLHN5c191dGltZSxjb21wYXRfc3lzX3V0aW1lKQkJLyogMzAgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHN0dHkgc3lzY2FsbCAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgZ3R0eSBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19hY2Nlc3Msc3lzX2FjY2VzcyxzeXMzMl9hY2Nlc3Nfd3JhcHBlcikKLVNZU0NBTEwoc3lzX25pY2Usc3lzX25pY2Usc3lzMzJfbmljZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfYWNjZXNzLHN5c19hY2Nlc3MsY29tcGF0X3N5c19hY2Nlc3MpCitTWVNDQUxMKHN5c19uaWNlLHN5c19uaWNlLGNvbXBhdF9zeXNfbmljZSkKIE5JX1NZU0NBTEwJCQkJCQkJLyogMzUgb2xkIGZ0aW1lIHN5c2NhbGwgKi8KIFNZU0NBTEwoc3lzX3N5bmMsc3lzX3N5bmMsc3lzX3N5bmMpCi1TWVNDQUxMKHN5c19raWxsLHN5c19raWxsLHN5czMyX2tpbGxfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3JlbmFtZSxzeXNfcmVuYW1lLHN5czMyX3JlbmFtZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfbWtkaXIsc3lzX21rZGlyLHN5czMyX21rZGlyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19ybWRpcixzeXNfcm1kaXIsc3lzMzJfcm1kaXJfd3JhcHBlcikJCS8qIDQwICovCi1TWVNDQUxMKHN5c19kdXAsc3lzX2R1cCxzeXMzMl9kdXBfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3BpcGUsc3lzX3BpcGUsc3lzMzJfcGlwZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfdGltZXMsc3lzX3RpbWVzLGNvbXBhdF9zeXNfdGltZXNfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2tpbGwsc3lzX2tpbGwsY29tcGF0X3N5c19raWxsKQorU1lTQ0FMTChzeXNfcmVuYW1lLHN5c19yZW5hbWUsY29tcGF0X3N5c19yZW5hbWUpCitTWVNDQUxMKHN5c19ta2RpcixzeXNfbWtkaXIsY29tcGF0X3N5c19ta2RpcikKK1NZU0NBTEwoc3lzX3JtZGlyLHN5c19ybWRpcixjb21wYXRfc3lzX3JtZGlyKQkJLyogNDAgKi8KK1NZU0NBTEwoc3lzX2R1cCxzeXNfZHVwLGNvbXBhdF9zeXNfZHVwKQorU1lTQ0FMTChzeXNfcGlwZSxzeXNfcGlwZSxjb21wYXRfc3lzX3BpcGUpCitTWVNDQUxMKHN5c190aW1lcyxzeXNfdGltZXMsY29tcGF0X3N5c190aW1lcykKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHByb2Ygc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfYnJrLHN5c19icmssc3lzMzJfYnJrX3dyYXBwZXIpCQkJLyogNDUgKi8KLVNZU0NBTEwoc3lzX3NldGdpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldGdpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRnaWQxNiBzeXNjYWxsKi8KLVNZU0NBTEwoc3lzX2dldGdpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2dldGdpZDE2KQkJLyogb2xkIGdldGdpZDE2IHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfc2lnbmFsLHN5c19zaWduYWwsc3lzMzJfc2lnbmFsX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19nZXRldWlkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0ZXVpZDE2KQkJLyogb2xkIGdldGV1aWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19nZXRlZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0ZWdpZDE2KQkJLyogNTAgb2xkIGdldGVnaWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19hY2N0LHN5c19hY2N0LHN5czMyX2FjY3Rfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3Vtb3VudCxzeXNfdW1vdW50LHN5czMyX3Vtb3VudF93cmFwcGVyKQorU1lTQ0FMTChzeXNfYnJrLHN5c19icmssY29tcGF0X3N5c19icmspCQkJCS8qIDQ1ICovCitTWVNDQUxMKHN5c19zZXRnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0Z2lkMTYpCS8qIG9sZCBzZXRnaWQxNiBzeXNjYWxsKi8KK1NZU0NBTEwoc3lzX2dldGdpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9nZXRnaWQxNikJLyogb2xkIGdldGdpZDE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfc2lnbmFsLHN5c19zaWduYWwsY29tcGF0X3N5c19zaWduYWwpCitTWVNDQUxMKHN5c19nZXRldWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldGV1aWQxNikJLyogb2xkIGdldGV1aWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19nZXRlZ2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldGVnaWQxNikJLyogNTAgb2xkIGdldGVnaWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19hY2N0LHN5c19hY2N0LGNvbXBhdF9zeXNfYWNjdCkKK1NZU0NBTEwoc3lzX3Vtb3VudCxzeXNfdW1vdW50LGNvbXBhdF9zeXNfdW1vdW50KQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgbG9jayBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19pb2N0bCxzeXNfaW9jdGwsY29tcGF0X3N5c19pb2N0bF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmNudGwsc3lzX2ZjbnRsLGNvbXBhdF9zeXNfZmNudGxfd3JhcHBlcikJCS8qIDU1ICovCitTWVNDQUxMKHN5c19pb2N0bCxzeXNfaW9jdGwsY29tcGF0X3N5c19pb2N0bCkKK1NZU0NBTEwoc3lzX2ZjbnRsLHN5c19mY250bCxjb21wYXRfc3lzX2ZjbnRsKQkJLyogNTUgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogaW50ZWwgbXB4IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3NldHBnaWQsc3lzX3NldHBnaWQsc3lzMzJfc2V0cGdpZF93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0cGdpZCxzeXNfc2V0cGdpZCxjb21wYXRfc3lzX3NldHBnaWQpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCB1bGltaXQgc3lzY2FsbCAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgdW5hbWUgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfdW1hc2ssc3lzX3VtYXNrLHN5czMyX3VtYXNrX3dyYXBwZXIpCQkvKiA2MCAqLwotU1lTQ0FMTChzeXNfY2hyb290LHN5c19jaHJvb3Qsc3lzMzJfY2hyb290X3dyYXBwZXIpCi1TWVNDQUxMKHN5c191c3RhdCxzeXNfdXN0YXQsc3lzMzJfdXN0YXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2R1cDIsc3lzX2R1cDIsc3lzMzJfZHVwMl93cmFwcGVyKQorU1lTQ0FMTChzeXNfdW1hc2ssc3lzX3VtYXNrLGNvbXBhdF9zeXNfdW1hc2spCQkJLyogNjAgKi8KK1NZU0NBTEwoc3lzX2Nocm9vdCxzeXNfY2hyb290LGNvbXBhdF9zeXNfY2hyb290KQorU1lTQ0FMTChzeXNfdXN0YXQsc3lzX3VzdGF0LGNvbXBhdF9zeXNfdXN0YXQpCitTWVNDQUxMKHN5c19kdXAyLHN5c19kdXAyLGNvbXBhdF9zeXNfZHVwMikKIFNZU0NBTEwoc3lzX2dldHBwaWQsc3lzX2dldHBwaWQsc3lzX2dldHBwaWQpCiBTWVNDQUxMKHN5c19nZXRwZ3JwLHN5c19nZXRwZ3JwLHN5c19nZXRwZ3JwKQkJCS8qIDY1ICovCiBTWVNDQUxMKHN5c19zZXRzaWQsc3lzX3NldHNpZCxzeXNfc2V0c2lkKQogU1lTQ0FMTChzeXNfc2lnYWN0aW9uLHN5c19zaWdhY3Rpb24sY29tcGF0X3N5c19zaWdhY3Rpb24pCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBzZ2V0bWFzayBzeXNjYWxsKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHNzZXRtYXNrIHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfc2V0cmV1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRyZXVpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRyZXVpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3NldHJlZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0cmVnaWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0cmVnaWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zaWdzdXNwZW5kLHN5c19zaWdzdXNwZW5kLHN5c19zaWdzdXNwZW5kX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zaWdwZW5kaW5nLHN5c19zaWdwZW5kaW5nLGNvbXBhdF9zeXNfc2lncGVuZGluZ193cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0aG9zdG5hbWUsc3lzX3NldGhvc3RuYW1lLHN5czMyX3NldGhvc3RuYW1lX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRybGltaXQsc3lzX3NldHJsaW1pdCxjb21wYXRfc3lzX3NldHJsaW1pdF93cmFwcGVyKQkvKiA3NSAqLwotU1lTQ0FMTChzeXNfb2xkX2dldHJsaW1pdCxzeXNfZ2V0cmxpbWl0LGNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0cmV1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmV1aWQxNikgLyogb2xkIHNldHJldWlkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc2V0cmVnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmVnaWQxNikgLyogb2xkIHNldHJlZ2lkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc2lnc3VzcGVuZCxzeXNfc2lnc3VzcGVuZCxjb21wYXRfc3lzX3NpZ3N1c3BlbmQpCitTWVNDQUxMKHN5c19zaWdwZW5kaW5nLHN5c19zaWdwZW5kaW5nLGNvbXBhdF9zeXNfc2lncGVuZGluZykKK1NZU0NBTEwoc3lzX3NldGhvc3RuYW1lLHN5c19zZXRob3N0bmFtZSxjb21wYXRfc3lzX3NldGhvc3RuYW1lKQorU1lTQ0FMTChzeXNfc2V0cmxpbWl0LHN5c19zZXRybGltaXQsY29tcGF0X3N5c19zZXRybGltaXQpCS8qIDc1ICovCitTWVNDQUxMKHN5c19vbGRfZ2V0cmxpbWl0LHN5c19nZXRybGltaXQsY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0KQogU1lTQ0FMTChzeXNfZ2V0cnVzYWdlLHN5c19nZXRydXNhZ2UsY29tcGF0X3N5c19nZXRydXNhZ2UpCi1TWVNDQUxMKHN5c19nZXR0aW1lb2ZkYXksc3lzX2dldHRpbWVvZmRheSxjb21wYXRfc3lzX2dldHRpbWVvZmRheV93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0dGltZW9mZGF5LHN5c19zZXR0aW1lb2ZkYXksY29tcGF0X3N5c19zZXR0aW1lb2ZkYXlfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2dldGdyb3VwczE2LHN5c19uaV9zeXNjYWxsLHN5czMyX2dldGdyb3VwczE2X3dyYXBwZXIpCS8qIDgwIG9sZCBnZXRncm91cHMxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zZXRncm91cHMxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRncm91cHMxNl93cmFwcGVyKQkvKiBvbGQgc2V0Z3JvdXBzMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfZ2V0dGltZW9mZGF5LHN5c19nZXR0aW1lb2ZkYXksY29tcGF0X3N5c19nZXR0aW1lb2ZkYXkpCitTWVNDQUxMKHN5c19zZXR0aW1lb2ZkYXksc3lzX3NldHRpbWVvZmRheSxjb21wYXRfc3lzX3NldHRpbWVvZmRheSkKK1NZU0NBTEwoc3lzX2dldGdyb3VwczE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9nZXRncm91cHMxNikJLyogODAgb2xkIGdldGdyb3VwczE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3NldGdyb3VwczE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXRncm91cHMxNikJLyogb2xkIHNldGdyb3VwczE2IHN5c2NhbGwgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHNlbGVjdCBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zeW1saW5rLHN5c19zeW1saW5rLHN5czMyX3N5bWxpbmtfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3N5bWxpbmssc3lzX3N5bWxpbmssY29tcGF0X3N5c19zeW1saW5rKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgbHN0YXQgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfcmVhZGxpbmssc3lzX3JlYWRsaW5rLHN5czMyX3JlYWRsaW5rX3dyYXBwZXIpCS8qIDg1ICovCi1TWVNDQUxMKHN5c191c2VsaWIsc3lzX3VzZWxpYixzeXMzMl91c2VsaWJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3N3YXBvbixzeXNfc3dhcG9uLHN5czMyX3N3YXBvbl93cmFwcGVyKQotU1lTQ0FMTChzeXNfcmVib290LHN5c19yZWJvb3Qsc3lzMzJfcmVib290X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLHN5c19uaV9zeXNjYWxsLG9sZDMyX3JlYWRkaXJfd3JhcHBlcikJLyogb2xkIHJlYWRkaXIgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfb2xkX21tYXAsc3lzX29sZF9tbWFwLG9sZDMyX21tYXBfd3JhcHBlcikJCS8qIDkwICovCi1TWVNDQUxMKHN5c19tdW5tYXAsc3lzX211bm1hcCxzeXMzMl9tdW5tYXBfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3JlYWRsaW5rLHN5c19yZWFkbGluayxjb21wYXRfc3lzX3JlYWRsaW5rKQkJLyogODUgKi8KK1NZU0NBTEwoc3lzX3VzZWxpYixzeXNfdXNlbGliLGNvbXBhdF9zeXNfdXNlbGliKQorU1lTQ0FMTChzeXNfc3dhcG9uLHN5c19zd2Fwb24sY29tcGF0X3N5c19zd2Fwb24pCitTWVNDQUxMKHN5c19yZWJvb3Qsc3lzX3JlYm9vdCxjb21wYXRfc3lzX3JlYm9vdCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19vbGRfcmVhZGRpcikJLyogb2xkIHJlYWRkaXIgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfb2xkX21tYXAsc3lzX29sZF9tbWFwLGNvbXBhdF9zeXNfczM5MF9vbGRfbW1hcCkJLyogOTAgKi8KK1NZU0NBTEwoc3lzX211bm1hcCxzeXNfbXVubWFwLGNvbXBhdF9zeXNfbXVubWFwKQogU1lTQ0FMTChzeXNfdHJ1bmNhdGUsc3lzX3RydW5jYXRlLGNvbXBhdF9zeXNfdHJ1bmNhdGUpCiBTWVNDQUxMKHN5c19mdHJ1bmNhdGUsc3lzX2Z0cnVuY2F0ZSxjb21wYXRfc3lzX2Z0cnVuY2F0ZSkKLVNZU0NBTEwoc3lzX2ZjaG1vZCxzeXNfZmNobW9kLHN5czMyX2ZjaG1vZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmNob3duMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZmNob3duMTZfd3JhcHBlcikJLyogOTUgb2xkIGZjaG93bjE2IHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfZ2V0cHJpb3JpdHksc3lzX2dldHByaW9yaXR5LHN5czMyX2dldHByaW9yaXR5X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRwcmlvcml0eSxzeXNfc2V0cHJpb3JpdHksc3lzMzJfc2V0cHJpb3JpdHlfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2ZjaG1vZCxzeXNfZmNobW9kLGNvbXBhdF9zeXNfZmNobW9kKQorU1lTQ0FMTChzeXNfZmNob3duMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2ZjaG93bjE2KQkvKiA5NSBvbGQgZmNob3duMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19nZXRwcmlvcml0eSxzeXNfZ2V0cHJpb3JpdHksY29tcGF0X3N5c19nZXRwcmlvcml0eSkKK1NZU0NBTEwoc3lzX3NldHByaW9yaXR5LHN5c19zZXRwcmlvcml0eSxjb21wYXRfc3lzX3NldHByaW9yaXR5KQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgcHJvZmlsIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3N0YXRmcyxzeXNfc3RhdGZzLGNvbXBhdF9zeXNfc3RhdGZzX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mc3RhdGZzLHN5c19mc3RhdGZzLGNvbXBhdF9zeXNfZnN0YXRmc193cmFwcGVyKQkvKiAxMDAgKi8KK1NZU0NBTEwoc3lzX3N0YXRmcyxzeXNfc3RhdGZzLGNvbXBhdF9zeXNfc3RhdGZzKQorU1lTQ0FMTChzeXNfZnN0YXRmcyxzeXNfZnN0YXRmcyxjb21wYXRfc3lzX2ZzdGF0ZnMpCS8qIDEwMCAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBpb3Blcm0gZm9yIGkzODYgKi8KLVNZU0NBTEwoc3lzX3NvY2tldGNhbGwsc3lzX3NvY2tldGNhbGwsY29tcGF0X3N5c19zb2NrZXRjYWxsX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zeXNsb2csc3lzX3N5c2xvZyxzeXMzMl9zeXNsb2dfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NvY2tldGNhbGwsc3lzX3NvY2tldGNhbGwsY29tcGF0X3N5c19zb2NrZXRjYWxsKQorU1lTQ0FMTChzeXNfc3lzbG9nLHN5c19zeXNsb2csY29tcGF0X3N5c19zeXNsb2cpCiBTWVNDQUxMKHN5c19zZXRpdGltZXIsc3lzX3NldGl0aW1lcixjb21wYXRfc3lzX3NldGl0aW1lcikKIFNZU0NBTEwoc3lzX2dldGl0aW1lcixzeXNfZ2V0aXRpbWVyLGNvbXBhdF9zeXNfZ2V0aXRpbWVyKQkvKiAxMDUgKi8KLVNZU0NBTEwoc3lzX25ld3N0YXQsc3lzX25ld3N0YXQsY29tcGF0X3N5c19uZXdzdGF0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19uZXdsc3RhdCxzeXNfbmV3bHN0YXQsY29tcGF0X3N5c19uZXdsc3RhdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbmV3ZnN0YXQsc3lzX25ld2ZzdGF0LGNvbXBhdF9zeXNfbmV3ZnN0YXRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX25ld3N0YXQsc3lzX25ld3N0YXQsY29tcGF0X3N5c19uZXdzdGF0KQorU1lTQ0FMTChzeXNfbmV3bHN0YXQsc3lzX25ld2xzdGF0LGNvbXBhdF9zeXNfbmV3bHN0YXQpCitTWVNDQUxMKHN5c19uZXdmc3RhdCxzeXNfbmV3ZnN0YXQsY29tcGF0X3N5c19uZXdmc3RhdCkKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHVuYW1lIHN5c2NhbGwgKi8KIFNZU0NBTEwoc3lzX2xvb2t1cF9kY29va2llLHN5c19sb29rdXBfZGNvb2tpZSxjb21wYXRfc3lzX2xvb2t1cF9kY29va2llKQkvKiAxMTAgKi8KIFNZU0NBTEwoc3lzX3ZoYW5ndXAsc3lzX3ZoYW5ndXAsc3lzX3ZoYW5ndXApCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCAiaWRsZSIgc3lzdGVtIGNhbGwgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogdm04Nm9sZCBmb3IgaTM4NiAqLwogU1lTQ0FMTChzeXNfd2FpdDQsc3lzX3dhaXQ0LGNvbXBhdF9zeXNfd2FpdDQpCi1TWVNDQUxMKHN5c19zd2Fwb2ZmLHN5c19zd2Fwb2ZmLHN5czMyX3N3YXBvZmZfd3JhcHBlcikJCS8qIDExNSAqLwotU1lTQ0FMTChzeXNfc3lzaW5mbyxzeXNfc3lzaW5mbyxjb21wYXRfc3lzX3N5c2luZm9fd3JhcHBlcikKK1NZU0NBTEwoc3lzX3N3YXBvZmYsc3lzX3N3YXBvZmYsY29tcGF0X3N5c19zd2Fwb2ZmKQkJLyogMTE1ICovCitTWVNDQUxMKHN5c19zeXNpbmZvLHN5c19zeXNpbmZvLGNvbXBhdF9zeXNfc3lzaW5mbykKIFNZU0NBTEwoc3lzX3MzOTBfaXBjLHN5c19zMzkwX2lwYyxjb21wYXRfc3lzX3MzOTBfaXBjKQotU1lTQ0FMTChzeXNfZnN5bmMsc3lzX2ZzeW5jLHN5czMyX2ZzeW5jX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zaWdyZXR1cm4sc3lzX3NpZ3JldHVybixzeXMzMl9zaWdyZXR1cm4pCi1TWVNDQUxMKHN5c19jbG9uZSxzeXNfY2xvbmUsc3lzX2Nsb25lX3dyYXBwZXIpCQkJLyogMTIwICovCi1TWVNDQUxMKHN5c19zZXRkb21haW5uYW1lLHN5c19zZXRkb21haW5uYW1lLHN5czMyX3NldGRvbWFpbm5hbWVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX25ld3VuYW1lLHN5c19uZXd1bmFtZSxzeXMzMl9uZXd1bmFtZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfZnN5bmMsc3lzX2ZzeW5jLGNvbXBhdF9zeXNfZnN5bmMpCitTWVNDQUxMKHN5c19zaWdyZXR1cm4sc3lzX3NpZ3JldHVybixjb21wYXRfc3lzX3NpZ3JldHVybikKK1NZU0NBTEwoc3lzX2Nsb25lLHN5c19jbG9uZSxjb21wYXRfc3lzX2Nsb25lKQkJCS8qIDEyMCAqLworU1lTQ0FMTChzeXNfc2V0ZG9tYWlubmFtZSxzeXNfc2V0ZG9tYWlubmFtZSxjb21wYXRfc3lzX3NldGRvbWFpbm5hbWUpCitTWVNDQUxMKHN5c19uZXd1bmFtZSxzeXNfbmV3dW5hbWUsY29tcGF0X3N5c19uZXd1bmFtZSkKIE5JX1NZU0NBTEwJCQkJCQkJLyogbW9kaWZ5X2xkdCBmb3IgaTM4NiAqLwotU1lTQ0FMTChzeXNfYWRqdGltZXgsc3lzX2FkanRpbWV4LGNvbXBhdF9zeXNfYWRqdGltZXhfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21wcm90ZWN0LHN5c19tcHJvdGVjdCxzeXMzMl9tcHJvdGVjdF93cmFwcGVyKQkvKiAxMjUgKi8KK1NZU0NBTEwoc3lzX2FkanRpbWV4LHN5c19hZGp0aW1leCxjb21wYXRfc3lzX2FkanRpbWV4KQorU1lTQ0FMTChzeXNfbXByb3RlY3Qsc3lzX21wcm90ZWN0LGNvbXBhdF9zeXNfbXByb3RlY3QpCQkvKiAxMjUgKi8KIFNZU0NBTEwoc3lzX3NpZ3Byb2NtYXNrLHN5c19zaWdwcm9jbWFzayxjb21wYXRfc3lzX3NpZ3Byb2NtYXNrKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgImNyZWF0ZSBtb2R1bGUiICovCi1TWVNDQUxMKHN5c19pbml0X21vZHVsZSxzeXNfaW5pdF9tb2R1bGUsc3lzX2luaXRfbW9kdWxlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19kZWxldGVfbW9kdWxlLHN5c19kZWxldGVfbW9kdWxlLHN5c19kZWxldGVfbW9kdWxlX3dyYXBwZXIpCitTWVNDQUxMKHN5c19pbml0X21vZHVsZSxzeXNfaW5pdF9tb2R1bGUsY29tcGF0X3N5c19pbml0X21vZHVsZSkKK1NZU0NBTEwoc3lzX2RlbGV0ZV9tb2R1bGUsc3lzX2RlbGV0ZV9tb2R1bGUsY29tcGF0X3N5c19kZWxldGVfbW9kdWxlKQogTklfU1lTQ0FMTAkJCQkJCQkvKiAxMzA6IG9sZCBnZXRfa2VybmVsX3N5bXMgKi8KLVNZU0NBTEwoc3lzX3F1b3RhY3RsLHN5c19xdW90YWN0bCxzeXMzMl9xdW90YWN0bF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZ2V0cGdpZCxzeXNfZ2V0cGdpZCxzeXMzMl9nZXRwZ2lkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mY2hkaXIsc3lzX2ZjaGRpcixzeXMzMl9mY2hkaXJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2JkZmx1c2gsc3lzX2JkZmx1c2gsc3lzMzJfYmRmbHVzaF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc3lzZnMsc3lzX3N5c2ZzLHN5czMyX3N5c2ZzX3dyYXBwZXIpCQkvKiAxMzUgKi8KLVNZU0NBTEwoc3lzX3BlcnNvbmFsaXR5LHN5c19zMzkwX3BlcnNvbmFsaXR5LHN5czMyX3BlcnNvbmFsaXR5X3dyYXBwZXIpCitTWVNDQUxMKHN5c19xdW90YWN0bCxzeXNfcXVvdGFjdGwsY29tcGF0X3N5c19xdW90YWN0bCkKK1NZU0NBTEwoc3lzX2dldHBnaWQsc3lzX2dldHBnaWQsY29tcGF0X3N5c19nZXRwZ2lkKQorU1lTQ0FMTChzeXNfZmNoZGlyLHN5c19mY2hkaXIsY29tcGF0X3N5c19mY2hkaXIpCitTWVNDQUxMKHN5c19iZGZsdXNoLHN5c19iZGZsdXNoLGNvbXBhdF9zeXNfYmRmbHVzaCkKK1NZU0NBTEwoc3lzX3N5c2ZzLHN5c19zeXNmcyxjb21wYXRfc3lzX3N5c2ZzKQkJLyogMTM1ICovCitTWVNDQUxMKHN5c19wZXJzb25hbGl0eSxzeXNfczM5MF9wZXJzb25hbGl0eSxjb21wYXRfc3lzX3MzOTBfcGVyc29uYWxpdHkpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIGZvciBhZnNfc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc2V0ZnN1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRmc3VpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3NldGZzZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0ZnNnaWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19sbHNlZWssc3lzX2xsc2VlayxzeXMzMl9sbHNlZWtfd3JhcHBlcikJCS8qIDE0MCAqLwotU1lTQ0FMTChzeXNfZ2V0ZGVudHMsc3lzX2dldGRlbnRzLHN5czMyX2dldGRlbnRzX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZWxlY3Qsc3lzX3NlbGVjdCxjb21wYXRfc3lzX3NlbGVjdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmxvY2ssc3lzX2Zsb2NrLHN5czMyX2Zsb2NrX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19tc3luYyxzeXNfbXN5bmMsc3lzMzJfbXN5bmNfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3JlYWR2LHN5c19yZWFkdixjb21wYXRfc3lzX3JlYWR2X3dyYXBwZXIpCQkvKiAxNDUgKi8KLVNZU0NBTEwoc3lzX3dyaXRldixzeXNfd3JpdGV2LGNvbXBhdF9zeXNfd3JpdGV2X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19nZXRzaWQsc3lzX2dldHNpZCxzeXMzMl9nZXRzaWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZkYXRhc3luYyxzeXNfZmRhdGFzeW5jLHN5czMyX2ZkYXRhc3luY193cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0ZnN1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0ZnN1aWQxNikJLyogb2xkIHNldGZzdWlkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc2V0ZnNnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0ZnNnaWQxNikJLyogb2xkIHNldGZzZ2lkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfbGxzZWVrLHN5c19sbHNlZWssY29tcGF0X3N5c19sbHNlZWspCQkvKiAxNDAgKi8KK1NZU0NBTEwoc3lzX2dldGRlbnRzLHN5c19nZXRkZW50cyxjb21wYXRfc3lzX2dldGRlbnRzKQorU1lTQ0FMTChzeXNfc2VsZWN0LHN5c19zZWxlY3QsY29tcGF0X3N5c19zZWxlY3QpCitTWVNDQUxMKHN5c19mbG9jayxzeXNfZmxvY2ssY29tcGF0X3N5c19mbG9jaykKK1NZU0NBTEwoc3lzX21zeW5jLHN5c19tc3luYyxjb21wYXRfc3lzX21zeW5jKQorU1lTQ0FMTChzeXNfcmVhZHYsc3lzX3JlYWR2LGNvbXBhdF9zeXNfcmVhZHYpCQkvKiAxNDUgKi8KK1NZU0NBTEwoc3lzX3dyaXRldixzeXNfd3JpdGV2LGNvbXBhdF9zeXNfd3JpdGV2KQorU1lTQ0FMTChzeXNfZ2V0c2lkLHN5c19nZXRzaWQsY29tcGF0X3N5c19nZXRzaWQpCitTWVNDQUxMKHN5c19mZGF0YXN5bmMsc3lzX2ZkYXRhc3luYyxjb21wYXRfc3lzX2ZkYXRhc3luYykKIFNZU0NBTEwoc3lzX3N5c2N0bCxzeXNfc3lzY3RsLGNvbXBhdF9zeXNfc3lzY3RsKQotU1lTQ0FMTChzeXNfbWxvY2ssc3lzX21sb2NrLHN5czMyX21sb2NrX3dyYXBwZXIpCQkvKiAxNTAgKi8KLVNZU0NBTEwoc3lzX211bmxvY2ssc3lzX211bmxvY2ssc3lzMzJfbXVubG9ja193cmFwcGVyKQotU1lTQ0FMTChzeXNfbWxvY2thbGwsc3lzX21sb2NrYWxsLHN5czMyX21sb2NrYWxsX3dyYXBwZXIpCitTWVNDQUxMKHN5c19tbG9jayxzeXNfbWxvY2ssY29tcGF0X3N5c19tbG9jaykJCQkvKiAxNTAgKi8KK1NZU0NBTEwoc3lzX211bmxvY2ssc3lzX211bmxvY2ssY29tcGF0X3N5c19tdW5sb2NrKQorU1lTQ0FMTChzeXNfbWxvY2thbGwsc3lzX21sb2NrYWxsLGNvbXBhdF9zeXNfbWxvY2thbGwpCiBTWVNDQUxMKHN5c19tdW5sb2NrYWxsLHN5c19tdW5sb2NrYWxsLHN5c19tdW5sb2NrYWxsKQotU1lTQ0FMTChzeXNfc2NoZWRfc2V0cGFyYW0sc3lzX3NjaGVkX3NldHBhcmFtLHN5czMyX3NjaGVkX3NldHBhcmFtX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zY2hlZF9nZXRwYXJhbSxzeXNfc2NoZWRfZ2V0cGFyYW0sc3lzMzJfc2NoZWRfZ2V0cGFyYW1fd3JhcHBlcikJLyogMTU1ICovCi1TWVNDQUxMKHN5c19zY2hlZF9zZXRzY2hlZHVsZXIsc3lzX3NjaGVkX3NldHNjaGVkdWxlcixzeXMzMl9zY2hlZF9zZXRzY2hlZHVsZXJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NjaGVkX2dldHNjaGVkdWxlcixzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyLHN5czMyX3NjaGVkX2dldHNjaGVkdWxlcl93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2NoZWRfc2V0cGFyYW0sc3lzX3NjaGVkX3NldHBhcmFtLGNvbXBhdF9zeXNfc2NoZWRfc2V0cGFyYW0pCitTWVNDQUxMKHN5c19zY2hlZF9nZXRwYXJhbSxzeXNfc2NoZWRfZ2V0cGFyYW0sY29tcGF0X3N5c19zY2hlZF9nZXRwYXJhbSkJLyogMTU1ICovCitTWVNDQUxMKHN5c19zY2hlZF9zZXRzY2hlZHVsZXIsc3lzX3NjaGVkX3NldHNjaGVkdWxlcixjb21wYXRfc3lzX3NjaGVkX3NldHNjaGVkdWxlcikKK1NZU0NBTEwoc3lzX3NjaGVkX2dldHNjaGVkdWxlcixzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyLGNvbXBhdF9zeXNfc2NoZWRfZ2V0c2NoZWR1bGVyKQogU1lTQ0FMTChzeXNfc2NoZWRfeWllbGQsc3lzX3NjaGVkX3lpZWxkLHN5c19zY2hlZF95aWVsZCkKLVNZU0NBTEwoc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbixzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbixzeXMzMl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluX3dyYXBwZXIpCS8qIDE2MCAqLworU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCxzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCxjb21wYXRfc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgpCitTWVNDQUxMKHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluLHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluLGNvbXBhdF9zeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikJLyogMTYwICovCiBTWVNDQUxMKHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwsc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCxjb21wYXRfc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCkKLVNZU0NBTEwoc3lzX25hbm9zbGVlcCxzeXNfbmFub3NsZWVwLGNvbXBhdF9zeXNfbmFub3NsZWVwX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19tcmVtYXAsc3lzX21yZW1hcCxzeXMzMl9tcmVtYXBfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldHJlc3VpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldHJlc3VpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRyZXN1aWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19nZXRyZXN1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRyZXN1aWQxNl93cmFwcGVyKQkvKiAxNjUgb2xkIGdldHJlc3VpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX25hbm9zbGVlcCxzeXNfbmFub3NsZWVwLGNvbXBhdF9zeXNfbmFub3NsZWVwKQorU1lTQ0FMTChzeXNfbXJlbWFwLHN5c19tcmVtYXAsY29tcGF0X3N5c19tcmVtYXApCitTWVNDQUxMKHN5c19zZXRyZXN1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmVzdWlkMTYpCS8qIG9sZCBzZXRyZXN1aWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19nZXRyZXN1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0cmVzdWlkMTYpCS8qIDE2NSBvbGQgZ2V0cmVzdWlkMTYgc3lzY2FsbCAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBmb3Igdm04NiAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc3lzX3F1ZXJ5X21vZHVsZSAqLwotU1lTQ0FMTChzeXNfcG9sbCxzeXNfcG9sbCxzeXMzMl9wb2xsX3dyYXBwZXIpCitTWVNDQUxMKHN5c19wb2xsLHN5c19wb2xsLGNvbXBhdF9zeXNfcG9sbCkKIE5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIG5mc3NlcnZjdGwgKi8KLVNZU0NBTEwoc3lzX3NldHJlc2dpZDE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldHJlc2dpZDE2X3dyYXBwZXIpCS8qIDE3MCBvbGQgc2V0cmVzZ2lkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfZ2V0cmVzZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0cmVzZ2lkMTZfd3JhcHBlcikJLyogb2xkIGdldHJlc2dpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3ByY3RsLHN5c19wcmN0bCxzeXMzMl9wcmN0bF93cmFwcGVyKQotU1lTQ0FMTChzeXNfcnRfc2lncmV0dXJuLHN5c19ydF9zaWdyZXR1cm4sc3lzMzJfcnRfc2lncmV0dXJuKQorU1lTQ0FMTChzeXNfc2V0cmVzZ2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldHJlc2dpZDE2KQkvKiAxNzAgb2xkIHNldHJlc2dpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2dldHJlc2dpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9nZXRyZXNnaWQxNikJLyogb2xkIGdldHJlc2dpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3ByY3RsLHN5c19wcmN0bCxjb21wYXRfc3lzX3ByY3RsKQorU1lTQ0FMTChzeXNfcnRfc2lncmV0dXJuLHN5c19ydF9zaWdyZXR1cm4sY29tcGF0X3N5c19ydF9zaWdyZXR1cm4pCiBTWVNDQUxMKHN5c19ydF9zaWdhY3Rpb24sc3lzX3J0X3NpZ2FjdGlvbixjb21wYXRfc3lzX3J0X3NpZ2FjdGlvbikKIFNZU0NBTEwoc3lzX3J0X3NpZ3Byb2NtYXNrLHN5c19ydF9zaWdwcm9jbWFzayxjb21wYXRfc3lzX3J0X3NpZ3Byb2NtYXNrKSAvKiAxNzUgKi8KIFNZU0NBTEwoc3lzX3J0X3NpZ3BlbmRpbmcsc3lzX3J0X3NpZ3BlbmRpbmcsY29tcGF0X3N5c19ydF9zaWdwZW5kaW5nKQogU1lTQ0FMTChzeXNfcnRfc2lndGltZWR3YWl0LHN5c19ydF9zaWd0aW1lZHdhaXQsY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXQpCiBTWVNDQUxMKHN5c19ydF9zaWdxdWV1ZWluZm8sc3lzX3J0X3NpZ3F1ZXVlaW5mbyxjb21wYXRfc3lzX3J0X3NpZ3F1ZXVlaW5mbykKIFNZU0NBTEwoc3lzX3J0X3NpZ3N1c3BlbmQsc3lzX3J0X3NpZ3N1c3BlbmQsY29tcGF0X3N5c19ydF9zaWdzdXNwZW5kKQotU1lTQ0FMTChzeXNfcHJlYWQ2NCxzeXNfcHJlYWQ2NCxzeXMzMl9wcmVhZDY0X3dyYXBwZXIpCQkvKiAxODAgKi8KLVNZU0NBTEwoc3lzX3B3cml0ZTY0LHN5c19wd3JpdGU2NCxzeXMzMl9wd3JpdGU2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfY2hvd24xNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9jaG93bjE2X3dyYXBwZXIpCS8qIG9sZCBjaG93bjE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2dldGN3ZCxzeXNfZ2V0Y3dkLHN5czMyX2dldGN3ZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfY2FwZ2V0LHN5c19jYXBnZXQsc3lzMzJfY2FwZ2V0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19jYXBzZXQsc3lzX2NhcHNldCxzeXMzMl9jYXBzZXRfd3JhcHBlcikJCS8qIDE4NSAqLworU1lTQ0FMTChzeXNfcHJlYWQ2NCxzeXNfcHJlYWQ2NCxjb21wYXRfc3lzX3MzOTBfcHJlYWQ2NCkJCS8qIDE4MCAqLworU1lTQ0FMTChzeXNfcHdyaXRlNjQsc3lzX3B3cml0ZTY0LGNvbXBhdF9zeXNfczM5MF9wd3JpdGU2NCkKK1NZU0NBTEwoc3lzX2Nob3duMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2Nob3duMTYpCS8qIG9sZCBjaG93bjE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2dldGN3ZCxzeXNfZ2V0Y3dkLGNvbXBhdF9zeXNfZ2V0Y3dkKQorU1lTQ0FMTChzeXNfY2FwZ2V0LHN5c19jYXBnZXQsY29tcGF0X3N5c19jYXBnZXQpCitTWVNDQUxMKHN5c19jYXBzZXQsc3lzX2NhcHNldCxjb21wYXRfc3lzX2NhcHNldCkJCS8qIDE4NSAqLwogU1lTQ0FMTChzeXNfc2lnYWx0c3RhY2ssc3lzX3NpZ2FsdHN0YWNrLGNvbXBhdF9zeXNfc2lnYWx0c3RhY2spCiBTWVNDQUxMKHN5c19zZW5kZmlsZSxzeXNfc2VuZGZpbGU2NCxjb21wYXRfc3lzX3NlbmRmaWxlKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBzdHJlYW1zMSAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBzdHJlYW1zMiAqLwogU1lTQ0FMTChzeXNfdmZvcmssc3lzX3Zmb3JrLHN5c192Zm9yaykJCQkJLyogMTkwICovCi1TWVNDQUxMKHN5c19nZXRybGltaXQsc3lzX2dldHJsaW1pdCxjb21wYXRfc3lzX2dldHJsaW1pdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbW1hcDIsc3lzX21tYXAyLHN5czMyX21tYXAyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c190cnVuY2F0ZTY0LHN5c19uaV9zeXNjYWxsLHN5czMyX3RydW5jYXRlNjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Z0cnVuY2F0ZTY0LHN5c19uaV9zeXNjYWxsLHN5czMyX2Z0cnVuY2F0ZTY0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zdGF0NjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfc3RhdDY0X3dyYXBwZXIpCQkvKiAxOTUgKi8KLVNZU0NBTEwoc3lzX2xzdGF0NjQsc3lzX25pX3N5c2NhbGwsc3lzMzJfbHN0YXQ2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZnN0YXQ2NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl9mc3RhdDY0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19sY2hvd24sc3lzX2xjaG93bixzeXMzMl9sY2hvd25fd3JhcHBlcikKK1NZU0NBTEwoc3lzX2dldHJsaW1pdCxzeXNfZ2V0cmxpbWl0LGNvbXBhdF9zeXNfZ2V0cmxpbWl0KQorU1lTQ0FMTChzeXNfbW1hcDIsc3lzX21tYXAyLGNvbXBhdF9zeXNfczM5MF9tbWFwMikKK1NZU0NBTEwoc3lzX3RydW5jYXRlNjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3RydW5jYXRlNjQpCitTWVNDQUxMKHN5c19mdHJ1bmNhdGU2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZnRydW5jYXRlNjQpCitTWVNDQUxMKHN5c19zdGF0NjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3N0YXQ2NCkJCS8qIDE5NSAqLworU1lTQ0FMTChzeXNfbHN0YXQ2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfbHN0YXQ2NCkKK1NZU0NBTEwoc3lzX2ZzdGF0NjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2ZzdGF0NjQpCitTWVNDQUxMKHN5c19sY2hvd24sc3lzX2xjaG93bixjb21wYXRfc3lzX2xjaG93bikKIFNZU0NBTEwoc3lzX2dldHVpZCxzeXNfZ2V0dWlkLHN5c19nZXR1aWQpCiBTWVNDQUxMKHN5c19nZXRnaWQsc3lzX2dldGdpZCxzeXNfZ2V0Z2lkKQkJCS8qIDIwMCAqLwogU1lTQ0FMTChzeXNfZ2V0ZXVpZCxzeXNfZ2V0ZXVpZCxzeXNfZ2V0ZXVpZCkKIFNZU0NBTEwoc3lzX2dldGVnaWQsc3lzX2dldGVnaWQsc3lzX2dldGVnaWQpCi1TWVNDQUxMKHN5c19zZXRyZXVpZCxzeXNfc2V0cmV1aWQsc3lzMzJfc2V0cmV1aWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldHJlZ2lkLHN5c19zZXRyZWdpZCxzeXMzMl9zZXRyZWdpZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZ2V0Z3JvdXBzLHN5c19nZXRncm91cHMsc3lzMzJfZ2V0Z3JvdXBzX3dyYXBwZXIpCS8qIDIwNSAqLwotU1lTQ0FMTChzeXNfc2V0Z3JvdXBzLHN5c19zZXRncm91cHMsc3lzMzJfc2V0Z3JvdXBzX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mY2hvd24sc3lzX2ZjaG93bixzeXMzMl9mY2hvd25fd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldHJlc3VpZCxzeXNfc2V0cmVzdWlkLHN5czMyX3NldHJlc3VpZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZ2V0cmVzdWlkLHN5c19nZXRyZXN1aWQsc3lzMzJfZ2V0cmVzdWlkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRyZXNnaWQsc3lzX3NldHJlc2dpZCxzeXMzMl9zZXRyZXNnaWRfd3JhcHBlcikJLyogMjEwICovCi1TWVNDQUxMKHN5c19nZXRyZXNnaWQsc3lzX2dldHJlc2dpZCxzeXMzMl9nZXRyZXNnaWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Nob3duLHN5c19jaG93bixzeXMzMl9jaG93bl93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0dWlkLHN5c19zZXR1aWQsc3lzMzJfc2V0dWlkX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXRnaWQsc3lzX3NldGdpZCxzeXMzMl9zZXRnaWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NldGZzdWlkLHN5c19zZXRmc3VpZCxzeXMzMl9zZXRmc3VpZF93cmFwcGVyKQkvKiAyMTUgKi8KLVNZU0NBTEwoc3lzX3NldGZzZ2lkLHN5c19zZXRmc2dpZCxzeXMzMl9zZXRmc2dpZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfcGl2b3Rfcm9vdCxzeXNfcGl2b3Rfcm9vdCxzeXMzMl9waXZvdF9yb290X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19taW5jb3JlLHN5c19taW5jb3JlLHN5czMyX21pbmNvcmVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21hZHZpc2Usc3lzX21hZHZpc2Usc3lzMzJfbWFkdmlzZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfZ2V0ZGVudHM2NCxzeXNfZ2V0ZGVudHM2NCxzeXMzMl9nZXRkZW50czY0X3dyYXBwZXIpCS8qIDIyMCAqLwotU1lTQ0FMTChzeXNfZmNudGw2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX2ZjbnRsNjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3JlYWRhaGVhZCxzeXNfcmVhZGFoZWFkLHN5czMyX3JlYWRhaGVhZF93cmFwcGVyKQorU1lTQ0FMTChzeXNfc2V0cmV1aWQsc3lzX3NldHJldWlkLGNvbXBhdF9zeXNfc2V0cmV1aWQpCitTWVNDQUxMKHN5c19zZXRyZWdpZCxzeXNfc2V0cmVnaWQsY29tcGF0X3N5c19zZXRyZWdpZCkKK1NZU0NBTEwoc3lzX2dldGdyb3VwcyxzeXNfZ2V0Z3JvdXBzLGNvbXBhdF9zeXNfZ2V0Z3JvdXBzKQkvKiAyMDUgKi8KK1NZU0NBTEwoc3lzX3NldGdyb3VwcyxzeXNfc2V0Z3JvdXBzLGNvbXBhdF9zeXNfc2V0Z3JvdXBzKQorU1lTQ0FMTChzeXNfZmNob3duLHN5c19mY2hvd24sY29tcGF0X3N5c19mY2hvd24pCitTWVNDQUxMKHN5c19zZXRyZXN1aWQsc3lzX3NldHJlc3VpZCxjb21wYXRfc3lzX3NldHJlc3VpZCkKK1NZU0NBTEwoc3lzX2dldHJlc3VpZCxzeXNfZ2V0cmVzdWlkLGNvbXBhdF9zeXNfZ2V0cmVzdWlkKQorU1lTQ0FMTChzeXNfc2V0cmVzZ2lkLHN5c19zZXRyZXNnaWQsY29tcGF0X3N5c19zZXRyZXNnaWQpCS8qIDIxMCAqLworU1lTQ0FMTChzeXNfZ2V0cmVzZ2lkLHN5c19nZXRyZXNnaWQsY29tcGF0X3N5c19nZXRyZXNnaWQpCitTWVNDQUxMKHN5c19jaG93bixzeXNfY2hvd24sY29tcGF0X3N5c19jaG93bikKK1NZU0NBTEwoc3lzX3NldHVpZCxzeXNfc2V0dWlkLGNvbXBhdF9zeXNfc2V0dWlkKQorU1lTQ0FMTChzeXNfc2V0Z2lkLHN5c19zZXRnaWQsY29tcGF0X3N5c19zZXRnaWQpCitTWVNDQUxMKHN5c19zZXRmc3VpZCxzeXNfc2V0ZnN1aWQsY29tcGF0X3N5c19zZXRmc3VpZCkJLyogMjE1ICovCitTWVNDQUxMKHN5c19zZXRmc2dpZCxzeXNfc2V0ZnNnaWQsY29tcGF0X3N5c19zZXRmc2dpZCkKK1NZU0NBTEwoc3lzX3Bpdm90X3Jvb3Qsc3lzX3Bpdm90X3Jvb3QsY29tcGF0X3N5c19waXZvdF9yb290KQorU1lTQ0FMTChzeXNfbWluY29yZSxzeXNfbWluY29yZSxjb21wYXRfc3lzX21pbmNvcmUpCitTWVNDQUxMKHN5c19tYWR2aXNlLHN5c19tYWR2aXNlLGNvbXBhdF9zeXNfbWFkdmlzZSkKK1NZU0NBTEwoc3lzX2dldGRlbnRzNjQsc3lzX2dldGRlbnRzNjQsY29tcGF0X3N5c19nZXRkZW50czY0KQkvKiAyMjAgKi8KK1NZU0NBTEwoc3lzX2ZjbnRsNjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19mY250bDY0KQorU1lTQ0FMTChzeXNfcmVhZGFoZWFkLHN5c19yZWFkYWhlYWQsY29tcGF0X3N5c19zMzkwX3JlYWRhaGVhZCkKIFNZU0NBTEwoc3lzX3NlbmRmaWxlNjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zZW5kZmlsZTY0KQotU1lTQ0FMTChzeXNfc2V0eGF0dHIsc3lzX3NldHhhdHRyLHN5czMyX3NldHhhdHRyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19sc2V0eGF0dHIsc3lzX2xzZXR4YXR0cixzeXMzMl9sc2V0eGF0dHJfd3JhcHBlcikJLyogMjI1ICovCi1TWVNDQUxMKHN5c19mc2V0eGF0dHIsc3lzX2ZzZXR4YXR0cixzeXMzMl9mc2V0eGF0dHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2dldHhhdHRyLHN5c19nZXR4YXR0cixzeXMzMl9nZXR4YXR0cl93cmFwcGVyKQotU1lTQ0FMTChzeXNfbGdldHhhdHRyLHN5c19sZ2V0eGF0dHIsc3lzMzJfbGdldHhhdHRyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mZ2V0eGF0dHIsc3lzX2ZnZXR4YXR0cixzeXMzMl9mZ2V0eGF0dHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2xpc3R4YXR0cixzeXNfbGlzdHhhdHRyLHN5czMyX2xpc3R4YXR0cl93cmFwcGVyKQkvKiAyMzAgKi8KLVNZU0NBTEwoc3lzX2xsaXN0eGF0dHIsc3lzX2xsaXN0eGF0dHIsc3lzMzJfbGxpc3R4YXR0cl93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmxpc3R4YXR0cixzeXNfZmxpc3R4YXR0cixzeXMzMl9mbGlzdHhhdHRyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19yZW1vdmV4YXR0cixzeXNfcmVtb3ZleGF0dHIsc3lzMzJfcmVtb3ZleGF0dHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2xyZW1vdmV4YXR0cixzeXNfbHJlbW92ZXhhdHRyLHN5czMyX2xyZW1vdmV4YXR0cl93cmFwcGVyKQotU1lTQ0FMTChzeXNfZnJlbW92ZXhhdHRyLHN5c19mcmVtb3ZleGF0dHIsc3lzMzJfZnJlbW92ZXhhdHRyX3dyYXBwZXIpCS8qIDIzNSAqLworU1lTQ0FMTChzeXNfc2V0eGF0dHIsc3lzX3NldHhhdHRyLGNvbXBhdF9zeXNfc2V0eGF0dHIpCitTWVNDQUxMKHN5c19sc2V0eGF0dHIsc3lzX2xzZXR4YXR0cixjb21wYXRfc3lzX2xzZXR4YXR0cikJLyogMjI1ICovCitTWVNDQUxMKHN5c19mc2V0eGF0dHIsc3lzX2ZzZXR4YXR0cixjb21wYXRfc3lzX2ZzZXR4YXR0cikKK1NZU0NBTEwoc3lzX2dldHhhdHRyLHN5c19nZXR4YXR0cixjb21wYXRfc3lzX2dldHhhdHRyKQorU1lTQ0FMTChzeXNfbGdldHhhdHRyLHN5c19sZ2V0eGF0dHIsY29tcGF0X3N5c19sZ2V0eGF0dHIpCitTWVNDQUxMKHN5c19mZ2V0eGF0dHIsc3lzX2ZnZXR4YXR0cixjb21wYXRfc3lzX2ZnZXR4YXR0cikKK1NZU0NBTEwoc3lzX2xpc3R4YXR0cixzeXNfbGlzdHhhdHRyLGNvbXBhdF9zeXNfbGlzdHhhdHRyKQkvKiAyMzAgKi8KK1NZU0NBTEwoc3lzX2xsaXN0eGF0dHIsc3lzX2xsaXN0eGF0dHIsY29tcGF0X3N5c19sbGlzdHhhdHRyKQorU1lTQ0FMTChzeXNfZmxpc3R4YXR0cixzeXNfZmxpc3R4YXR0cixjb21wYXRfc3lzX2ZsaXN0eGF0dHIpCitTWVNDQUxMKHN5c19yZW1vdmV4YXR0cixzeXNfcmVtb3ZleGF0dHIsY29tcGF0X3N5c19yZW1vdmV4YXR0cikKK1NZU0NBTEwoc3lzX2xyZW1vdmV4YXR0cixzeXNfbHJlbW92ZXhhdHRyLGNvbXBhdF9zeXNfbHJlbW92ZXhhdHRyKQorU1lTQ0FMTChzeXNfZnJlbW92ZXhhdHRyLHN5c19mcmVtb3ZleGF0dHIsY29tcGF0X3N5c19mcmVtb3ZleGF0dHIpCS8qIDIzNSAqLwogU1lTQ0FMTChzeXNfZ2V0dGlkLHN5c19nZXR0aWQsc3lzX2dldHRpZCkKLVNZU0NBTEwoc3lzX3RraWxsLHN5c190a2lsbCxzeXNfdGtpbGxfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3RraWxsLHN5c190a2lsbCxjb21wYXRfc3lzX3RraWxsKQogU1lTQ0FMTChzeXNfZnV0ZXgsc3lzX2Z1dGV4LGNvbXBhdF9zeXNfZnV0ZXgpCi1TWVNDQUxMKHN5c19zY2hlZF9zZXRhZmZpbml0eSxzeXNfc2NoZWRfc2V0YWZmaW5pdHksc3lzMzJfc2NoZWRfc2V0YWZmaW5pdHlfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NjaGVkX2dldGFmZmluaXR5LHN5c19zY2hlZF9nZXRhZmZpbml0eSxzeXMzMl9zY2hlZF9nZXRhZmZpbml0eV93cmFwcGVyKQkvKiAyNDAgKi8KLVNZU0NBTEwoc3lzX3Rna2lsbCxzeXNfdGdraWxsLHN5c190Z2tpbGxfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NjaGVkX3NldGFmZmluaXR5LHN5c19zY2hlZF9zZXRhZmZpbml0eSxjb21wYXRfc3lzX3NjaGVkX3NldGFmZmluaXR5KQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0YWZmaW5pdHksc3lzX3NjaGVkX2dldGFmZmluaXR5LGNvbXBhdF9zeXNfc2NoZWRfZ2V0YWZmaW5pdHkpCS8qIDI0MCAqLworU1lTQ0FMTChzeXNfdGdraWxsLHN5c190Z2tpbGwsY29tcGF0X3N5c190Z2tpbGwpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIHJlc2VydmVkIGZvciBUVVggKi8KLVNZU0NBTEwoc3lzX2lvX3NldHVwLHN5c19pb19zZXR1cCxzeXMzMl9pb19zZXR1cF93cmFwcGVyKQotU1lTQ0FMTChzeXNfaW9fZGVzdHJveSxzeXNfaW9fZGVzdHJveSxzeXMzMl9pb19kZXN0cm95X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19pb19nZXRldmVudHMsc3lzX2lvX2dldGV2ZW50cyxzeXMzMl9pb19nZXRldmVudHNfd3JhcHBlcikJLyogMjQ1ICovCi1TWVNDQUxMKHN5c19pb19zdWJtaXQsc3lzX2lvX3N1Ym1pdCxzeXMzMl9pb19zdWJtaXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2lvX2NhbmNlbCxzeXNfaW9fY2FuY2VsLHN5czMyX2lvX2NhbmNlbF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZXhpdF9ncm91cCxzeXNfZXhpdF9ncm91cCxzeXMzMl9leGl0X2dyb3VwX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19lcG9sbF9jcmVhdGUsc3lzX2Vwb2xsX2NyZWF0ZSxzeXNfZXBvbGxfY3JlYXRlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19lcG9sbF9jdGwsc3lzX2Vwb2xsX2N0bCxzeXNfZXBvbGxfY3RsX3dyYXBwZXIpCS8qIDI1MCAqLwotU1lTQ0FMTChzeXNfZXBvbGxfd2FpdCxzeXNfZXBvbGxfd2FpdCxzeXNfZXBvbGxfd2FpdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0X3RpZF9hZGRyZXNzLHN5c19zZXRfdGlkX2FkZHJlc3Msc3lzMzJfc2V0X3RpZF9hZGRyZXNzX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zMzkwX2ZhZHZpc2U2NCxzeXNfZmFkdmlzZTY0XzY0LHN5czMyX2ZhZHZpc2U2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfdGltZXJfY3JlYXRlLHN5c190aW1lcl9jcmVhdGUsc3lzMzJfdGltZXJfY3JlYXRlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c190aW1lcl9zZXR0aW1lLHN5c190aW1lcl9zZXR0aW1lLHN5czMyX3RpbWVyX3NldHRpbWVfd3JhcHBlcikJLyogMjU1ICovCi1TWVNDQUxMKHN5c190aW1lcl9nZXR0aW1lLHN5c190aW1lcl9nZXR0aW1lLHN5czMyX3RpbWVyX2dldHRpbWVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3RpbWVyX2dldG92ZXJydW4sc3lzX3RpbWVyX2dldG92ZXJydW4sc3lzMzJfdGltZXJfZ2V0b3ZlcnJ1bl93cmFwcGVyKQotU1lTQ0FMTChzeXNfdGltZXJfZGVsZXRlLHN5c190aW1lcl9kZWxldGUsc3lzMzJfdGltZXJfZGVsZXRlX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19jbG9ja19zZXR0aW1lLHN5c19jbG9ja19zZXR0aW1lLHN5czMyX2Nsb2NrX3NldHRpbWVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Nsb2NrX2dldHRpbWUsc3lzX2Nsb2NrX2dldHRpbWUsc3lzMzJfY2xvY2tfZ2V0dGltZV93cmFwcGVyKQkvKiAyNjAgKi8KLVNZU0NBTEwoc3lzX2Nsb2NrX2dldHJlcyxzeXNfY2xvY2tfZ2V0cmVzLHN5czMyX2Nsb2NrX2dldHJlc193cmFwcGVyKQotU1lTQ0FMTChzeXNfY2xvY2tfbmFub3NsZWVwLHN5c19jbG9ja19uYW5vc2xlZXAsc3lzMzJfY2xvY2tfbmFub3NsZWVwX3dyYXBwZXIpCitTWVNDQUxMKHN5c19pb19zZXR1cCxzeXNfaW9fc2V0dXAsY29tcGF0X3N5c19pb19zZXR1cCkKK1NZU0NBTEwoc3lzX2lvX2Rlc3Ryb3ksc3lzX2lvX2Rlc3Ryb3ksY29tcGF0X3N5c19pb19kZXN0cm95KQorU1lTQ0FMTChzeXNfaW9fZ2V0ZXZlbnRzLHN5c19pb19nZXRldmVudHMsY29tcGF0X3N5c19pb19nZXRldmVudHMpCS8qIDI0NSAqLworU1lTQ0FMTChzeXNfaW9fc3VibWl0LHN5c19pb19zdWJtaXQsY29tcGF0X3N5c19pb19zdWJtaXQpCitTWVNDQUxMKHN5c19pb19jYW5jZWwsc3lzX2lvX2NhbmNlbCxjb21wYXRfc3lzX2lvX2NhbmNlbCkKK1NZU0NBTEwoc3lzX2V4aXRfZ3JvdXAsc3lzX2V4aXRfZ3JvdXAsY29tcGF0X3N5c19leGl0X2dyb3VwKQorU1lTQ0FMTChzeXNfZXBvbGxfY3JlYXRlLHN5c19lcG9sbF9jcmVhdGUsY29tcGF0X3N5c19lcG9sbF9jcmVhdGUpCitTWVNDQUxMKHN5c19lcG9sbF9jdGwsc3lzX2Vwb2xsX2N0bCxjb21wYXRfc3lzX2Vwb2xsX2N0bCkJLyogMjUwICovCitTWVNDQUxMKHN5c19lcG9sbF93YWl0LHN5c19lcG9sbF93YWl0LGNvbXBhdF9zeXNfZXBvbGxfd2FpdCkKK1NZU0NBTEwoc3lzX3NldF90aWRfYWRkcmVzcyxzeXNfc2V0X3RpZF9hZGRyZXNzLGNvbXBhdF9zeXNfc2V0X3RpZF9hZGRyZXNzKQorU1lTQ0FMTChzeXNfczM5MF9mYWR2aXNlNjQsc3lzX2ZhZHZpc2U2NF82NCxjb21wYXRfc3lzX3MzOTBfZmFkdmlzZTY0KQorU1lTQ0FMTChzeXNfdGltZXJfY3JlYXRlLHN5c190aW1lcl9jcmVhdGUsY29tcGF0X3N5c190aW1lcl9jcmVhdGUpCitTWVNDQUxMKHN5c190aW1lcl9zZXR0aW1lLHN5c190aW1lcl9zZXR0aW1lLGNvbXBhdF9zeXNfdGltZXJfc2V0dGltZSkJLyogMjU1ICovCitTWVNDQUxMKHN5c190aW1lcl9nZXR0aW1lLHN5c190aW1lcl9nZXR0aW1lLGNvbXBhdF9zeXNfdGltZXJfZ2V0dGltZSkKK1NZU0NBTEwoc3lzX3RpbWVyX2dldG92ZXJydW4sc3lzX3RpbWVyX2dldG92ZXJydW4sY29tcGF0X3N5c190aW1lcl9nZXRvdmVycnVuKQorU1lTQ0FMTChzeXNfdGltZXJfZGVsZXRlLHN5c190aW1lcl9kZWxldGUsY29tcGF0X3N5c190aW1lcl9kZWxldGUpCitTWVNDQUxMKHN5c19jbG9ja19zZXR0aW1lLHN5c19jbG9ja19zZXR0aW1lLGNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZSkKK1NZU0NBTEwoc3lzX2Nsb2NrX2dldHRpbWUsc3lzX2Nsb2NrX2dldHRpbWUsY29tcGF0X3N5c19jbG9ja19nZXR0aW1lKQkvKiAyNjAgKi8KK1NZU0NBTEwoc3lzX2Nsb2NrX2dldHJlcyxzeXNfY2xvY2tfZ2V0cmVzLGNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzKQorU1lTQ0FMTChzeXNfY2xvY2tfbmFub3NsZWVwLHN5c19jbG9ja19uYW5vc2xlZXAsY29tcGF0X3N5c19jbG9ja19uYW5vc2xlZXApCiBOSV9TWVNDQUxMCQkJCQkJCS8qIHJlc2VydmVkIGZvciB2c2VydmVyICovCi1TWVNDQUxMKHN5c19zMzkwX2ZhZHZpc2U2NF82NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl9mYWR2aXNlNjRfNjRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3N0YXRmczY0LHN5c19zdGF0ZnM2NCxjb21wYXRfc3lzX3N0YXRmczY0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mc3RhdGZzNjQsc3lzX2ZzdGF0ZnM2NCxjb21wYXRfc3lzX2ZzdGF0ZnM2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfcmVtYXBfZmlsZV9wYWdlcyxzeXNfcmVtYXBfZmlsZV9wYWdlcyxzeXMzMl9yZW1hcF9maWxlX3BhZ2VzX3dyYXBwZXIpCitTWVNDQUxMKHN5c19zMzkwX2ZhZHZpc2U2NF82NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZmFkdmlzZTY0XzY0KQorU1lTQ0FMTChzeXNfc3RhdGZzNjQsc3lzX3N0YXRmczY0LGNvbXBhdF9zeXNfc3RhdGZzNjQpCitTWVNDQUxMKHN5c19mc3RhdGZzNjQsc3lzX2ZzdGF0ZnM2NCxjb21wYXRfc3lzX2ZzdGF0ZnM2NCkKK1NZU0NBTEwoc3lzX3JlbWFwX2ZpbGVfcGFnZXMsc3lzX3JlbWFwX2ZpbGVfcGFnZXMsY29tcGF0X3N5c19yZW1hcF9maWxlX3BhZ2VzKQogTklfU1lTQ0FMTAkJCQkJCQkvKiAyNjggc3lzX21iaW5kICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIDI2OSBzeXNfZ2V0X21lbXBvbGljeSAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiAyNzAgc3lzX3NldF9tZW1wb2xpY3kgKi8KLVNZU0NBTEwoc3lzX21xX29wZW4sc3lzX21xX29wZW4sY29tcGF0X3N5c19tcV9vcGVuX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19tcV91bmxpbmssc3lzX21xX3VubGluayxzeXMzMl9tcV91bmxpbmtfd3JhcHBlcikKLVNZU0NBTEwoc3lzX21xX3RpbWVkc2VuZCxzeXNfbXFfdGltZWRzZW5kLGNvbXBhdF9zeXNfbXFfdGltZWRzZW5kX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19tcV90aW1lZHJlY2VpdmUsc3lzX21xX3RpbWVkcmVjZWl2ZSxjb21wYXRfc3lzX21xX3RpbWVkcmVjZWl2ZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfbXFfbm90aWZ5LHN5c19tcV9ub3RpZnksY29tcGF0X3N5c19tcV9ub3RpZnlfd3JhcHBlcikgLyogMjc1ICovCi1TWVNDQUxMKHN5c19tcV9nZXRzZXRhdHRyLHN5c19tcV9nZXRzZXRhdHRyLGNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cl93cmFwcGVyKQotU1lTQ0FMTChzeXNfa2V4ZWNfbG9hZCxzeXNfa2V4ZWNfbG9hZCxjb21wYXRfc3lzX2tleGVjX2xvYWRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2FkZF9rZXksc3lzX2FkZF9rZXksY29tcGF0X3N5c19hZGRfa2V5X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19yZXF1ZXN0X2tleSxzeXNfcmVxdWVzdF9rZXksY29tcGF0X3N5c19yZXF1ZXN0X2tleV93cmFwcGVyKQotU1lTQ0FMTChzeXNfa2V5Y3RsLHN5c19rZXljdGwsY29tcGF0X3N5c19rZXljdGxfd3JhcHBlcikJCS8qIDI4MCAqLworU1lTQ0FMTChzeXNfbXFfb3BlbixzeXNfbXFfb3Blbixjb21wYXRfc3lzX21xX29wZW4pCitTWVNDQUxMKHN5c19tcV91bmxpbmssc3lzX21xX3VubGluayxjb21wYXRfc3lzX21xX3VubGluaykKK1NZU0NBTEwoc3lzX21xX3RpbWVkc2VuZCxzeXNfbXFfdGltZWRzZW5kLGNvbXBhdF9zeXNfbXFfdGltZWRzZW5kKQorU1lTQ0FMTChzeXNfbXFfdGltZWRyZWNlaXZlLHN5c19tcV90aW1lZHJlY2VpdmUsY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUpCitTWVNDQUxMKHN5c19tcV9ub3RpZnksc3lzX21xX25vdGlmeSxjb21wYXRfc3lzX21xX25vdGlmeSkgLyogMjc1ICovCitTWVNDQUxMKHN5c19tcV9nZXRzZXRhdHRyLHN5c19tcV9nZXRzZXRhdHRyLGNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cikKK1NZU0NBTEwoc3lzX2tleGVjX2xvYWQsc3lzX2tleGVjX2xvYWQsY29tcGF0X3N5c19rZXhlY19sb2FkKQorU1lTQ0FMTChzeXNfYWRkX2tleSxzeXNfYWRkX2tleSxjb21wYXRfc3lzX2FkZF9rZXkpCitTWVNDQUxMKHN5c19yZXF1ZXN0X2tleSxzeXNfcmVxdWVzdF9rZXksY29tcGF0X3N5c19yZXF1ZXN0X2tleSkKK1NZU0NBTEwoc3lzX2tleWN0bCxzeXNfa2V5Y3RsLGNvbXBhdF9zeXNfa2V5Y3RsKQkJLyogMjgwICovCiBTWVNDQUxMKHN5c193YWl0aWQsc3lzX3dhaXRpZCxjb21wYXRfc3lzX3dhaXRpZCkKLVNZU0NBTEwoc3lzX2lvcHJpb19zZXQsc3lzX2lvcHJpb19zZXQsc3lzX2lvcHJpb19zZXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2lvcHJpb19nZXQsc3lzX2lvcHJpb19nZXQsc3lzX2lvcHJpb19nZXRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2lvcHJpb19zZXQsc3lzX2lvcHJpb19zZXQsY29tcGF0X3N5c19pb3ByaW9fc2V0KQorU1lTQ0FMTChzeXNfaW9wcmlvX2dldCxzeXNfaW9wcmlvX2dldCxjb21wYXRfc3lzX2lvcHJpb19nZXQpCiBTWVNDQUxMKHN5c19pbm90aWZ5X2luaXQsc3lzX2lub3RpZnlfaW5pdCxzeXNfaW5vdGlmeV9pbml0KQotU1lTQ0FMTChzeXNfaW5vdGlmeV9hZGRfd2F0Y2gsc3lzX2lub3RpZnlfYWRkX3dhdGNoLHN5c19pbm90aWZ5X2FkZF93YXRjaF93cmFwcGVyKQkvKiAyODUgKi8KLVNZU0NBTEwoc3lzX2lub3RpZnlfcm1fd2F0Y2gsc3lzX2lub3RpZnlfcm1fd2F0Y2gsc3lzX2lub3RpZnlfcm1fd2F0Y2hfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2lub3RpZnlfYWRkX3dhdGNoLHN5c19pbm90aWZ5X2FkZF93YXRjaCxjb21wYXRfc3lzX2lub3RpZnlfYWRkX3dhdGNoKQkvKiAyODUgKi8KK1NZU0NBTEwoc3lzX2lub3RpZnlfcm1fd2F0Y2gsc3lzX2lub3RpZnlfcm1fd2F0Y2gsY29tcGF0X3N5c19pbm90aWZ5X3JtX3dhdGNoKQogTklfU1lTQ0FMTAkJCQkJCQkvKiAyODcgc3lzX21pZ3JhdGVfcGFnZXMgKi8KIFNZU0NBTEwoc3lzX29wZW5hdCxzeXNfb3BlbmF0LGNvbXBhdF9zeXNfb3BlbmF0KQotU1lTQ0FMTChzeXNfbWtkaXJhdCxzeXNfbWtkaXJhdCxzeXNfbWtkaXJhdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbWtub2RhdCxzeXNfbWtub2RhdCxzeXNfbWtub2RhdF93cmFwcGVyKQkvKiAyOTAgKi8KLVNZU0NBTEwoc3lzX2ZjaG93bmF0LHN5c19mY2hvd25hdCxzeXNfZmNob3duYXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Z1dGltZXNhdCxzeXNfZnV0aW1lc2F0LGNvbXBhdF9zeXNfZnV0aW1lc2F0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19mc3RhdGF0NjQsc3lzX25ld2ZzdGF0YXQsc3lzMzJfZnN0YXRhdDY0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c191bmxpbmthdCxzeXNfdW5saW5rYXQsc3lzX3VubGlua2F0X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19yZW5hbWVhdCxzeXNfcmVuYW1lYXQsc3lzX3JlbmFtZWF0X3dyYXBwZXIpCS8qIDI5NSAqLwotU1lTQ0FMTChzeXNfbGlua2F0LHN5c19saW5rYXQsc3lzX2xpbmthdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfc3ltbGlua2F0LHN5c19zeW1saW5rYXQsc3lzX3N5bWxpbmthdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfcmVhZGxpbmthdCxzeXNfcmVhZGxpbmthdCxzeXNfcmVhZGxpbmthdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmNobW9kYXQsc3lzX2ZjaG1vZGF0LHN5c19mY2htb2RhdF93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmFjY2Vzc2F0LHN5c19mYWNjZXNzYXQsc3lzX2ZhY2Nlc3NhdF93cmFwcGVyKQkvKiAzMDAgKi8KLVNZU0NBTEwoc3lzX3BzZWxlY3Q2LHN5c19wc2VsZWN0Nixjb21wYXRfc3lzX3BzZWxlY3Q2X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19wcG9sbCxzeXNfcHBvbGwsY29tcGF0X3N5c19wcG9sbF93cmFwcGVyKQotU1lTQ0FMTChzeXNfdW5zaGFyZSxzeXNfdW5zaGFyZSxzeXNfdW5zaGFyZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfbWtkaXJhdCxzeXNfbWtkaXJhdCxjb21wYXRfc3lzX21rZGlyYXQpCitTWVNDQUxMKHN5c19ta25vZGF0LHN5c19ta25vZGF0LGNvbXBhdF9zeXNfbWtub2RhdCkJLyogMjkwICovCitTWVNDQUxMKHN5c19mY2hvd25hdCxzeXNfZmNob3duYXQsY29tcGF0X3N5c19mY2hvd25hdCkKK1NZU0NBTEwoc3lzX2Z1dGltZXNhdCxzeXNfZnV0aW1lc2F0LGNvbXBhdF9zeXNfZnV0aW1lc2F0KQorU1lTQ0FMTChzeXNfZnN0YXRhdDY0LHN5c19uZXdmc3RhdGF0LGNvbXBhdF9zeXNfczM5MF9mc3RhdGF0NjQpCitTWVNDQUxMKHN5c191bmxpbmthdCxzeXNfdW5saW5rYXQsY29tcGF0X3N5c191bmxpbmthdCkKK1NZU0NBTEwoc3lzX3JlbmFtZWF0LHN5c19yZW5hbWVhdCxjb21wYXRfc3lzX3JlbmFtZWF0KQkvKiAyOTUgKi8KK1NZU0NBTEwoc3lzX2xpbmthdCxzeXNfbGlua2F0LGNvbXBhdF9zeXNfbGlua2F0KQorU1lTQ0FMTChzeXNfc3ltbGlua2F0LHN5c19zeW1saW5rYXQsY29tcGF0X3N5c19zeW1saW5rYXQpCitTWVNDQUxMKHN5c19yZWFkbGlua2F0LHN5c19yZWFkbGlua2F0LGNvbXBhdF9zeXNfcmVhZGxpbmthdCkKK1NZU0NBTEwoc3lzX2ZjaG1vZGF0LHN5c19mY2htb2RhdCxjb21wYXRfc3lzX2ZjaG1vZGF0KQorU1lTQ0FMTChzeXNfZmFjY2Vzc2F0LHN5c19mYWNjZXNzYXQsY29tcGF0X3N5c19mYWNjZXNzYXQpCS8qIDMwMCAqLworU1lTQ0FMTChzeXNfcHNlbGVjdDYsc3lzX3BzZWxlY3Q2LGNvbXBhdF9zeXNfcHNlbGVjdDYpCitTWVNDQUxMKHN5c19wcG9sbCxzeXNfcHBvbGwsY29tcGF0X3N5c19wcG9sbCkKK1NZU0NBTEwoc3lzX3Vuc2hhcmUsc3lzX3Vuc2hhcmUsY29tcGF0X3N5c191bnNoYXJlKQogU1lTQ0FMTChzeXNfc2V0X3JvYnVzdF9saXN0LHN5c19zZXRfcm9idXN0X2xpc3QsY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3QpCiBTWVNDQUxMKHN5c19nZXRfcm9idXN0X2xpc3Qsc3lzX2dldF9yb2J1c3RfbGlzdCxjb21wYXRfc3lzX2dldF9yb2J1c3RfbGlzdCkKLVNZU0NBTEwoc3lzX3NwbGljZSxzeXNfc3BsaWNlLHN5c19zcGxpY2Vfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3N5bmNfZmlsZV9yYW5nZSxzeXNfc3luY19maWxlX3JhbmdlLHN5c19zeW5jX2ZpbGVfcmFuZ2Vfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3RlZSxzeXNfdGVlLHN5c190ZWVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3NwbGljZSxzeXNfc3BsaWNlLGNvbXBhdF9zeXNfc3BsaWNlKQorU1lTQ0FMTChzeXNfc3luY19maWxlX3JhbmdlLHN5c19zeW5jX2ZpbGVfcmFuZ2UsY29tcGF0X3N5c19zMzkwX3N5bmNfZmlsZV9yYW5nZSkKK1NZU0NBTEwoc3lzX3RlZSxzeXNfdGVlLGNvbXBhdF9zeXNfdGVlKQogU1lTQ0FMTChzeXNfdm1zcGxpY2Usc3lzX3Ztc3BsaWNlLGNvbXBhdF9zeXNfdm1zcGxpY2UpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIDMxMCBzeXNfbW92ZV9wYWdlcyAqLwotU1lTQ0FMTChzeXNfZ2V0Y3B1LHN5c19nZXRjcHUsc3lzX2dldGNwdV93cmFwcGVyKQorU1lTQ0FMTChzeXNfZ2V0Y3B1LHN5c19nZXRjcHUsY29tcGF0X3N5c19nZXRjcHUpCiBTWVNDQUxMKHN5c19lcG9sbF9wd2FpdCxzeXNfZXBvbGxfcHdhaXQsY29tcGF0X3N5c19lcG9sbF9wd2FpdCkKLVNZU0NBTEwoc3lzX3V0aW1lcyxzeXNfdXRpbWVzLGNvbXBhdF9zeXNfdXRpbWVzX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zMzkwX2ZhbGxvY2F0ZSxzeXNfZmFsbG9jYXRlLHN5c19mYWxsb2NhdGVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3V0aW1lbnNhdCxzeXNfdXRpbWVuc2F0LGNvbXBhdF9zeXNfdXRpbWVuc2F0X3dyYXBwZXIpCS8qIDMxNSAqLworU1lTQ0FMTChzeXNfdXRpbWVzLHN5c191dGltZXMsY29tcGF0X3N5c191dGltZXMpCitTWVNDQUxMKHN5c19zMzkwX2ZhbGxvY2F0ZSxzeXNfZmFsbG9jYXRlLGNvbXBhdF9zeXNfczM5MF9mYWxsb2NhdGUpCitTWVNDQUxMKHN5c191dGltZW5zYXQsc3lzX3V0aW1lbnNhdCxjb21wYXRfc3lzX3V0aW1lbnNhdCkJLyogMzE1ICovCiBTWVNDQUxMKHN5c19zaWduYWxmZCxzeXNfc2lnbmFsZmQsY29tcGF0X3N5c19zaWduYWxmZCkKIE5JX1NZU0NBTEwJCQkJCQkvKiAzMTcgb2xkIHN5c190aW1lcl9mZCAqLwotU1lTQ0FMTChzeXNfZXZlbnRmZCxzeXNfZXZlbnRmZCxzeXNfZXZlbnRmZF93cmFwcGVyKQotU1lTQ0FMTChzeXNfdGltZXJmZF9jcmVhdGUsc3lzX3RpbWVyZmRfY3JlYXRlLHN5c190aW1lcmZkX2NyZWF0ZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfZXZlbnRmZCxzeXNfZXZlbnRmZCxjb21wYXRfc3lzX2V2ZW50ZmQpCitTWVNDQUxMKHN5c190aW1lcmZkX2NyZWF0ZSxzeXNfdGltZXJmZF9jcmVhdGUsY29tcGF0X3N5c190aW1lcmZkX2NyZWF0ZSkKIFNZU0NBTEwoc3lzX3RpbWVyZmRfc2V0dGltZSxzeXNfdGltZXJmZF9zZXR0aW1lLGNvbXBhdF9zeXNfdGltZXJmZF9zZXR0aW1lKSAvKiAzMjAgKi8KIFNZU0NBTEwoc3lzX3RpbWVyZmRfZ2V0dGltZSxzeXNfdGltZXJmZF9nZXR0aW1lLGNvbXBhdF9zeXNfdGltZXJmZF9nZXR0aW1lKQogU1lTQ0FMTChzeXNfc2lnbmFsZmQ0LHN5c19zaWduYWxmZDQsY29tcGF0X3N5c19zaWduYWxmZDQpCi1TWVNDQUxMKHN5c19ldmVudGZkMixzeXNfZXZlbnRmZDIsc3lzX2V2ZW50ZmQyX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19pbm90aWZ5X2luaXQxLHN5c19pbm90aWZ5X2luaXQxLHN5c19pbm90aWZ5X2luaXQxX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19waXBlMixzeXNfcGlwZTIsc3lzX3BpcGUyX3dyYXBwZXIpIC8qIDMyNSAqLwotU1lTQ0FMTChzeXNfZHVwMyxzeXNfZHVwMyxzeXNfZHVwM193cmFwcGVyKQotU1lTQ0FMTChzeXNfZXBvbGxfY3JlYXRlMSxzeXNfZXBvbGxfY3JlYXRlMSxzeXNfZXBvbGxfY3JlYXRlMV93cmFwcGVyKQorU1lTQ0FMTChzeXNfZXZlbnRmZDIsc3lzX2V2ZW50ZmQyLGNvbXBhdF9zeXNfZXZlbnRmZDIpCitTWVNDQUxMKHN5c19pbm90aWZ5X2luaXQxLHN5c19pbm90aWZ5X2luaXQxLGNvbXBhdF9zeXNfaW5vdGlmeV9pbml0MSkKK1NZU0NBTEwoc3lzX3BpcGUyLHN5c19waXBlMixjb21wYXRfc3lzX3BpcGUyKSAvKiAzMjUgKi8KK1NZU0NBTEwoc3lzX2R1cDMsc3lzX2R1cDMsY29tcGF0X3N5c19kdXAzKQorU1lTQ0FMTChzeXNfZXBvbGxfY3JlYXRlMSxzeXNfZXBvbGxfY3JlYXRlMSxjb21wYXRfc3lzX2Vwb2xsX2NyZWF0ZTEpCiBTWVNDQUxMKHN5c19wcmVhZHYsc3lzX3ByZWFkdixjb21wYXRfc3lzX3ByZWFkdikKIFNZU0NBTEwoc3lzX3B3cml0ZXYsc3lzX3B3cml0ZXYsY29tcGF0X3N5c19wd3JpdGV2KQogU1lTQ0FMTChzeXNfcnRfdGdzaWdxdWV1ZWluZm8sc3lzX3J0X3Rnc2lncXVldWVpbmZvLGNvbXBhdF9zeXNfcnRfdGdzaWdxdWV1ZWluZm8pIC8qIDMzMCAqLwotU1lTQ0FMTChzeXNfcGVyZl9ldmVudF9vcGVuLHN5c19wZXJmX2V2ZW50X29wZW4sc3lzX3BlcmZfZXZlbnRfb3Blbl93cmFwcGVyKQotU1lTQ0FMTChzeXNfZmFub3RpZnlfaW5pdCxzeXNfZmFub3RpZnlfaW5pdCxzeXNfZmFub3RpZnlfaW5pdF93cmFwcGVyKQorU1lTQ0FMTChzeXNfcGVyZl9ldmVudF9vcGVuLHN5c19wZXJmX2V2ZW50X29wZW4sY29tcGF0X3N5c19wZXJmX2V2ZW50X29wZW4pCitTWVNDQUxMKHN5c19mYW5vdGlmeV9pbml0LHN5c19mYW5vdGlmeV9pbml0LGNvbXBhdF9zeXNfZmFub3RpZnlfaW5pdCkKIFNZU0NBTEwoc3lzX2Zhbm90aWZ5X21hcmssc3lzX2Zhbm90aWZ5X21hcmssY29tcGF0X3N5c19mYW5vdGlmeV9tYXJrKQotU1lTQ0FMTChzeXNfcHJsaW1pdDY0LHN5c19wcmxpbWl0NjQsc3lzX3BybGltaXQ2NF93cmFwcGVyKQotU1lTQ0FMTChzeXNfbmFtZV90b19oYW5kbGVfYXQsc3lzX25hbWVfdG9faGFuZGxlX2F0LHN5c19uYW1lX3RvX2hhbmRsZV9hdF93cmFwcGVyKSAvKiAzMzUgKi8KK1NZU0NBTEwoc3lzX3BybGltaXQ2NCxzeXNfcHJsaW1pdDY0LGNvbXBhdF9zeXNfcHJsaW1pdDY0KQorU1lTQ0FMTChzeXNfbmFtZV90b19oYW5kbGVfYXQsc3lzX25hbWVfdG9faGFuZGxlX2F0LGNvbXBhdF9zeXNfbmFtZV90b19oYW5kbGVfYXQpIC8qIDMzNSAqLwogU1lTQ0FMTChzeXNfb3Blbl9ieV9oYW5kbGVfYXQsc3lzX29wZW5fYnlfaGFuZGxlX2F0LGNvbXBhdF9zeXNfb3Blbl9ieV9oYW5kbGVfYXQpCi1TWVNDQUxMKHN5c19jbG9ja19hZGp0aW1lLHN5c19jbG9ja19hZGp0aW1lLGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfc3luY2ZzLHN5c19zeW5jZnMsc3lzX3N5bmNmc193cmFwcGVyKQotU1lTQ0FMTChzeXNfc2V0bnMsc3lzX3NldG5zLHN5c19zZXRuc193cmFwcGVyKQotU1lTQ0FMTChzeXNfcHJvY2Vzc192bV9yZWFkdixzeXNfcHJvY2Vzc192bV9yZWFkdixjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHZfd3JhcHBlcikgLyogMzQwICovCi1TWVNDQUxMKHN5c19wcm9jZXNzX3ZtX3dyaXRldixzeXNfcHJvY2Vzc192bV93cml0ZXYsY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldl93cmFwcGVyKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxzeXNfczM5MF9ydW50aW1lX2luc3RyLHN5c19zMzkwX3J1bnRpbWVfaW5zdHJfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2tjbXAsc3lzX2tjbXAsc3lzX2tjbXBfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2Zpbml0X21vZHVsZSxzeXNfZmluaXRfbW9kdWxlLHN5c19maW5pdF9tb2R1bGVfd3JhcHBlcikKLVNZU0NBTEwoc3lzX3NjaGVkX3NldGF0dHIsc3lzX3NjaGVkX3NldGF0dHIsc3lzX3NjaGVkX3NldGF0dHJfd3JhcHBlcikgLyogMzQ1ICovCi1TWVNDQUxMKHN5c19zY2hlZF9nZXRhdHRyLHN5c19zY2hlZF9nZXRhdHRyLHN5c19zY2hlZF9nZXRhdHRyX3dyYXBwZXIpCitTWVNDQUxMKHN5c19jbG9ja19hZGp0aW1lLHN5c19jbG9ja19hZGp0aW1lLGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZSkKK1NZU0NBTEwoc3lzX3N5bmNmcyxzeXNfc3luY2ZzLGNvbXBhdF9zeXNfc3luY2ZzKQorU1lTQ0FMTChzeXNfc2V0bnMsc3lzX3NldG5zLGNvbXBhdF9zeXNfc2V0bnMpCitTWVNDQUxMKHN5c19wcm9jZXNzX3ZtX3JlYWR2LHN5c19wcm9jZXNzX3ZtX3JlYWR2LGNvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdikgLyogMzQwICovCitTWVNDQUxMKHN5c19wcm9jZXNzX3ZtX3dyaXRldixzeXNfcHJvY2Vzc192bV93cml0ZXYsY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldikKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsc3lzX3MzOTBfcnVudGltZV9pbnN0cixjb21wYXRfc3lzX3MzOTBfcnVudGltZV9pbnN0cikKK1NZU0NBTEwoc3lzX2tjbXAsc3lzX2tjbXAsY29tcGF0X3N5c19rY21wKQorU1lTQ0FMTChzeXNfZmluaXRfbW9kdWxlLHN5c19maW5pdF9tb2R1bGUsY29tcGF0X3N5c19maW5pdF9tb2R1bGUpCitTWVNDQUxMKHN5c19zY2hlZF9zZXRhdHRyLHN5c19zY2hlZF9zZXRhdHRyLGNvbXBhdF9zeXNfc2NoZWRfc2V0YXR0cikgLyogMzQ1ICovCitTWVNDQUxMKHN5c19zY2hlZF9nZXRhdHRyLHN5c19zY2hlZF9nZXRhdHRyLGNvbXBhdF9zeXNfc2NoZWRfZ2V0YXR0cikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCA0YjJlM2UzLi42Mjk4ZmVkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90b3BvbG9neS5jCkBAIC00NTEsNyArNDUxLDYgQEAKIAl9CiAJc2V0X3RvcG9sb2d5X3RpbWVyKCk7CiBvdXQ6Ci0JdXBkYXRlX2NwdV9tYXNrcygpOwogCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoY3B1X3N1YnN5cy5kZXZfcm9vdCwgJmRldl9hdHRyX2Rpc3BhdGNoaW5nKTsKIH0KIGRldmljZV9pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vZGlhZy5jIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKaW5kZXggODIxNmMwZS4uNmY5Y2ZhNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9kaWFnLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdmlydGlvLWNjdy5oPgogI2luY2x1ZGUgImt2bS1zMzkwLmgiCiAjaW5jbHVkZSAidHJhY2UuaCIKQEAgLTg2LDkgKzg3LDExIEBACiAJc3dpdGNoIChzdWJjb2RlKSB7CiAJY2FzZSAzOgogCQl2Y3B1LT5ydW4tPnMzOTBfcmVzZXRfZmxhZ3MgPSBLVk1fUzM5MF9SRVNFVF9DTEVBUjsKKwkJcGFnZV90YWJsZV9yZXNldF9wZ3N0ZShjdXJyZW50LT5tbSwgMCwgVEFTS19TSVpFKTsKIAkJYnJlYWs7CiAJY2FzZSA0OgogCQl2Y3B1LT5ydW4tPnMzOTBfcmVzZXRfZmxhZ3MgPSAwOworCQlwYWdlX3RhYmxlX3Jlc2V0X3Bnc3RlKGN1cnJlbnQtPm1tLCAwLCBUQVNLX1NJWkUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKaW5kZXggZTA2NzZmMy4uMTBiNWRiMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCisrKyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwpAQCAtNjgsNiArNjgsNyBAQAogCXsgImluc3RydWN0aW9uX3N0b3JhZ2Vfa2V5IiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3N0b3JhZ2Vfa2V5KSB9LAogCXsgImluc3RydWN0aW9uX3N0c2NoIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3N0c2NoKSB9LAogCXsgImluc3RydWN0aW9uX2Noc2MiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fY2hzYykgfSwKKwl7ICJpbnN0cnVjdGlvbl9lc3NhIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX2Vzc2EpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fc3RzaSIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zdHNpKSB9LAogCXsgImluc3RydWN0aW9uX3N0ZmwiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc3RmbCkgfSwKIAl7ICJpbnN0cnVjdGlvbl90cHJvdCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl90cHJvdCkgfSwKQEAgLTI4Myw3ICsyODQsMTEgQEAKIAlpZiAoa3ZtX2lzX3Vjb250cm9sKHZjcHUtPmt2bSkpCiAJCWdtYXBfZnJlZSh2Y3B1LT5hcmNoLmdtYXApOwogCisJaWYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5jYnJsbykKKwkJX19mcmVlX3BhZ2UoX19wZm5fdG9fcGFnZSgKKwkJCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2JybG8gPj4gUEFHRV9TSElGVCkpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykodmNwdS0+YXJjaC5zaWVfYmxvY2spKTsKKwogCWt2bV92Y3B1X3VuaW5pdCh2Y3B1KTsKIAlrbWVtX2NhY2hlX2ZyZWUoa3ZtX3ZjcHVfY2FjaGUsIHZjcHUpOwogfQpAQCAtMzkwLDYgKzM5NSw4IEBACiAKIGludCBrdm1fYXJjaF92Y3B1X3NldHVwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlzdHJ1Y3QgcGFnZSAqY2JybDsKKwogCWF0b21pY19zZXQoJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5jcHVmbGFncywgQ1BVU1RBVF9aQVJDSCB8CiAJCQkJCQkgICAgQ1BVU1RBVF9TTSB8CiAJCQkJCQkgICAgQ1BVU1RBVF9TVE9QUEVEIHwKQEAgLTQwMSw2ICs0MDgsMTQgQEAKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiMiAgPSA4OwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2EgICA9IDB4QzEwMDIwMDFVOwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5mYWMgICA9IChpbnQpIChsb25nKSB2ZmFjaWxpdGllczsKKwlpZiAoa3ZtX2VuYWJsZWRfY21tYSgpKSB7CisJCWNicmwgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKGNicmwpIHsKKwkJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2IyIHw9IDB4ODA7CisJCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiMiAmPSB+MHgwODsKKwkJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5jYnJsbyA9IHBhZ2VfdG9fcGh5cyhjYnJsKTsKKwkJfQorCX0KIAlocnRpbWVyX2luaXQoJnZjcHUtPmFyY2guY2tjX3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CiAJdGFza2xldF9pbml0KCZ2Y3B1LT5hcmNoLnRhc2tsZXQsIGt2bV9zMzkwX3Rhc2tsZXQsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHZjcHUpOwpAQCAtNzYxLDYgKzc3NiwxNiBAQAogCXJldHVybiByYzsKIH0KIAorYm9vbCBrdm1fZW5hYmxlZF9jbW1hKHZvaWQpCit7CisJaWYgKCFNQUNISU5FX0lTX0xQQVIpCisJCXJldHVybiBmYWxzZTsKKwkvKiBvbmx5IGVuYWJsZSBmb3IgejEwIGFuZCBsYXRlciAqLworCWlmICghTUFDSElORV9IQVNfRURBVDEpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIGludCBfX3ZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpbnQgcmMsIGV4aXRfcmVhc29uOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCmluZGV4IGY5NTU5YjAuLjU2NDUxNGY0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCkBAIC0xNTYsNiArMTU2LDggQEAKIHZvaWQgczM5MF92Y3B1X3VuYmxvY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQgZXhpdF9zaWUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQgZXhpdF9zaWVfc3luYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworLyogYXJlIHdlIGdvaW5nIHRvIHN1cHBvcnQgY21tYT8gKi8KK2Jvb2wga3ZtX2VuYWJsZWRfY21tYSh2b2lkKTsKIC8qIGltcGxlbWVudGVkIGluIGRpYWcuYyAqLwogaW50IGt2bV9zMzkwX2hhbmRsZV9kaWFnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vcHJpdi5jIGIvYXJjaC9zMzkwL2t2bS9wcml2LmMKaW5kZXggNzViZWVhNi4uYWFjYjZiMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9wcml2LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9wcml2LmMKQEAgLTYzNiw4ICs2MzYsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBoYW5kbGVfZXNzYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJLyogZW50cmllcyBleHBlY3RlZCB0byBiZSAxRkYgKi8KKwlpbnQgZW50cmllcyA9ICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2JybG8gJiB+UEFHRV9NQVNLKSA+PiAzOworCXVuc2lnbmVkIGxvbmcgKmNicmxvLCBjYnJsZTsKKwlzdHJ1Y3QgZ21hcCAqZ21hcDsKKwlpbnQgaTsKKworCVZDUFVfRVZFTlQodmNwdSwgNSwgImNtbWEgcmVsZWFzZSAlZCBwYWdlcyIsIGVudHJpZXMpOworCWdtYXAgPSB2Y3B1LT5hcmNoLmdtYXA7CisJdmNwdS0+c3RhdC5pbnN0cnVjdGlvbl9lc3NhKys7CisJaWYgKCFrdm1fZW5hYmxlZF9jbW1hKCkgfHwgIXZjcHUtPmFyY2guc2llX2Jsb2NrLT5jYnJsbykKKwkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fT1BFUkFUSU9OKTsKKworCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQorCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9QUklWSUxFR0VEX09QKTsKKworCWlmICgoKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGIgJiAweGYwMDAwMDAwKSA+PiAyOCkgPiA2KQorCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9TUEVDSUZJQ0FUSU9OKTsKKworCS8qIFJld2luZCBQU1cgdG8gcmVwZWF0IHRoZSBFU1NBIGluc3RydWN0aW9uICovCisJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cuYWRkciA9CisJCV9fcmV3aW5kX3Bzdyh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdywgNCk7CisJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmNicmxvICY9IFBBR0VfTUFTSzsJLyogcmVzZXQgbmNlbyAqLworCWNicmxvID0gcGh5c190b192aXJ0KHZjcHUtPmFyY2guc2llX2Jsb2NrLT5jYnJsbyk7CisJZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyArK2kpIHsKKwkJY2JybGUgPSBjYnJsb1tpXTsKKwkJaWYgKHVubGlrZWx5KGNicmxlICYgflBBR0VfTUFTSyB8fCBjYnJsZSA8IDIgKiBQQUdFX1NJWkUpKQorCQkJLyogaW52YWxpZCBlbnRyeSAqLworCQkJYnJlYWs7CisJCS8qIHRyeSB0byBmcmVlIGJhY2tpbmcgKi8KKwkJX19nbWFwX3phcChjYnJsZSwgZ21hcCk7CisJfQorCXVwX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CisJaWYgKGkgPCBlbnRyaWVzKQorCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9TUEVDSUZJQ0FUSU9OKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IGludGVyY2VwdF9oYW5kbGVyX3QgYjlfaGFuZGxlcnNbMjU2XSA9IHsKIAlbMHg4ZF0gPSBoYW5kbGVfZXBzdywKKwlbMHhhYl0gPSBoYW5kbGVfZXNzYSwKIAlbMHhhZl0gPSBoYW5kbGVfcGZtZiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvTWFrZWZpbGUgYi9hcmNoL3MzOTAvbGliL01ha2VmaWxlCmluZGV4IGIwNjg3MjkuLmUzZmZmZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZQpAQCAtMiw4ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHMzOTAtc3BlY2lmaWMgbGlicmFyeSBmaWxlcy4uCiAjCiAKLWxpYi15ICs9IGRlbGF5Lm8gc3RyaW5nLm8gdWFjY2Vzc19wdC5vIGZpbmQubworbGliLXkgKz0gZGVsYXkubyBzdHJpbmcubyB1YWNjZXNzX3B0Lm8gdWFjY2Vzc19tdmNvcy5vIGZpbmQubwogb2JqLSQoQ09ORklHXzMyQklUKSArPSBkaXY2NC5vIHFybm5kLm8gdWNtcGRpMi5vIG1lbTMyLm8KIG9iai0kKENPTkZJR182NEJJVCkgKz0gbWVtNjQubwotbGliLSQoQ09ORklHXzY0QklUKSArPSB1YWNjZXNzX212Y29zLm8KIGxpYi0kKENPTkZJR19TTVApICs9IHNwaW5sb2NrLm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvZmluZC5jIGIvYXJjaC9zMzkwL2xpYi9maW5kLmMKaW5kZXggNjIwZDM0ZC4uOTIyMDAzYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9maW5kLmMKKysrIGIvYXJjaC9zMzkwL2xpYi9maW5kLmMKQEAgLTQsNyArNCw3IEBACiAgKiBPbiBzMzkweCB0aGUgYml0cyBhcmUgbnVtYmVyZWQ6CiAgKiAgIHwwLi4uLi4uLi4uLi4uLi42M3w2NC4uLi4uLi4uLi4uLjEyN3wxMjguLi4uLi4uLi4uLjE5MXwxOTIuLi4uLi4uLi4uLjI1NXwKICAqIGFuZCBvbiBzMzkwOgotICogICB8MC4uLi4uMzF8MzEuLi4uNjN8NjQuLi4uOTV8OTYuLi4xMjd8MTI4Li4xNTl8MTYwLi4xOTF8MTkyLi4yMjN8MjI0Li4yNTV8CisgKiAgIHwwLi4uLi4zMXwzMi4uLi42M3w2NC4uLi45NXw5Ni4uLjEyN3wxMjguLjE1OXwxNjAuLjE5MXwxOTIuLjIyM3wyMjQuLjI1NXwKICAqCiAgKiBUaGUgcmVhc29uIGZvciB0aGlzIGJpdCBudW1iZXJpbmcgaXMgdGhlIGZhY3QgdGhhdCB0aGUgaGFyZHdhcmUgc2V0cyBiaXRzCiAgKiBpbiBhIGJpdG1hcCBzdGFydGluZyBhdCBiaXQgMCAoTVNCKSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBzY2FuIHRoZSBiaXRtYXAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5oIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzLmgKaW5kZXggYjFhMjIxNy4uYzdlMGU4MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5oCisrKyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5oCkBAIC02LDcgKzYsMTEgQEAKICNpZm5kZWYgX19BUkNIX1MzOTBfTElCX1VBQ0NFU1NfSAogI2RlZmluZSBfX0FSQ0hfUzM5MF9MSUJfVUFDQ0VTU19ICiAKLWV4dGVybiBpbnQgZnV0ZXhfYXRvbWljX29wX3B0KGludCwgdTMyIF9fdXNlciAqLCBpbnQsIGludCAqKTsKLWV4dGVybiBpbnQgZnV0ZXhfYXRvbWljX2NtcHhjaGdfcHQodTMyICosIHUzMiBfX3VzZXIgKiwgdTMyLCB1MzIpOwordW5zaWduZWQgbG9uZyBjb3B5X2Zyb21fdXNlcl9wdCh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcl9wdCh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIGNvcHlfaW5fdXNlcl9wdCh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwordW5zaWduZWQgbG9uZyBjbGVhcl91c2VyX3B0KHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKTsKK3Vuc2lnbmVkIGxvbmcgc3Rybmxlbl91c2VyX3B0KGNvbnN0IGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOworbG9uZyBzdHJuY3B5X2Zyb21fdXNlcl9wdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpOwogCiAjZW5kaWYgLyogX19BUkNIX1MzOTBfTElCX1VBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwppbmRleCA0Yjc5OTNiLi5hZTk3YjhkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwpAQCAtNiw4ICs2LDExIEBACiAgKgkJIEdlcmFsZCBTY2hhZWZlciAoZ2VyYWxkLnNjaGFlZmVyQGRlLmlibS5jb20pCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9mYWNpbGl0eS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Z1dGV4Lmg+CiAjaW5jbHVkZSAidWFjY2Vzcy5oIgpAQCAtMjYsNyArMjksMTAgQEAKICNkZWZpbmUgU0xSCSJzbGdyIgogI2VuZGlmCiAKLXN0YXRpYyBzaXplX3QgY29weV9mcm9tX3VzZXJfbXZjb3Moc2l6ZV90IHNpemUsIGNvbnN0IHZvaWQgX191c2VyICpwdHIsIHZvaWQgKngpCitzdGF0aWMgc3RydWN0IHN0YXRpY19rZXkgaGF2ZV9tdmNvcyA9IFNUQVRJQ19LRVlfSU5JVF9UUlVFOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXJfbXZjb3Modm9pZCAqeCwgY29uc3Qgdm9pZCBfX3VzZXIgKnB0ciwKKwkJCQkJCSB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcwIGFzbSgiMCIpID0gMHg4MVVMOwogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKQEAgLTY1LDcgKzcxLDE2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBzaXplX3QgY29weV90b191c2VyX212Y29zKHNpemVfdCBzaXplLCB2b2lkIF9fdXNlciAqcHRyLCBjb25zdCB2b2lkICp4KQordW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWlmIChzdGF0aWNfa2V5X3RydWUoJmhhdmVfbXZjb3MpKQorCQlyZXR1cm4gY29weV9mcm9tX3VzZXJfbXZjb3ModG8sIGZyb20sIG4pOworCXJldHVybiBjb3B5X2Zyb21fdXNlcl9wdCh0bywgZnJvbSwgbik7Cit9CitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXIpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV90b191c2VyX212Y29zKHZvaWQgX191c2VyICpwdHIsIGNvbnN0IHZvaWQgKngsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcwIGFzbSgiMCIpID0gMHg4MTAwMDBVTDsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CkBAIC05NCw4ICsxMDksMTYgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIHNpemVfdCBjb3B5X2luX3VzZXJfbXZjb3Moc2l6ZV90IHNpemUsIHZvaWQgX191c2VyICp0bywKLQkJCQkgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20pCit1bnNpZ25lZCBsb25nIF9fY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWlmIChzdGF0aWNfa2V5X3RydWUoJmhhdmVfbXZjb3MpKQorCQlyZXR1cm4gY29weV90b191c2VyX212Y29zKHRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gY29weV90b191c2VyX3B0KHRvLCBmcm9tLCBuKTsKK30KK0VYUE9SVF9TWU1CT0woX19jb3B5X3RvX3VzZXIpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9pbl91c2VyX212Y29zKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcwIGFzbSgiMCIpID0gMHg4MTAwODFVTDsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CkBAIC0xMTcsNyArMTQwLDE1IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBzaXplX3QgY2xlYXJfdXNlcl9tdmNvcyhzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnRvKQordW5zaWduZWQgbG9uZyBfX2NvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJaWYgKHN0YXRpY19rZXlfdHJ1ZSgmaGF2ZV9tdmNvcykpCisJCXJldHVybiBjb3B5X2luX3VzZXJfbXZjb3ModG8sIGZyb20sIG4pOworCXJldHVybiBjb3B5X2luX3VzZXJfcHQodG8sIGZyb20sIG4pOworfQorRVhQT1JUX1NZTUJPTChfX2NvcHlfaW5fdXNlcik7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjbGVhcl91c2VyX212Y29zKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20oIjAiKSA9IDB4ODEwMDAwVUw7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwpAQCAtMTQ1LDE3ICsxNzYsMjYgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIHNpemVfdCBzdHJubGVuX3VzZXJfbXZjb3Moc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjKQordW5zaWduZWQgbG9uZyBfX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0Jc2l6ZV90IGRvbmUsIGxlbiwgb2Zmc2V0LCBsZW5fc3RyOworCWlmIChzdGF0aWNfa2V5X3RydWUoJmhhdmVfbXZjb3MpKQorCQlyZXR1cm4gY2xlYXJfdXNlcl9tdmNvcyh0bywgc2l6ZSk7CisJcmV0dXJuIGNsZWFyX3VzZXJfcHQodG8sIHNpemUpOworfQorRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXIpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3Rybmxlbl91c2VyX212Y29zKGNvbnN0IGNoYXIgX191c2VyICpzcmMsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZG9uZSwgbGVuLCBvZmZzZXQsIGxlbl9zdHI7CiAJY2hhciBidWZbMjU2XTsKIAogCWRvbmUgPSAwOwogCWRvIHsKLQkJb2Zmc2V0ID0gKHNpemVfdClzcmMgJiB+UEFHRV9NQVNLOworCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylzcmMgJiB+UEFHRV9NQVNLOwogCQlsZW4gPSBtaW4oMjU2VUwsIFBBR0VfU0laRSAtIG9mZnNldCk7CiAJCWxlbiA9IG1pbihjb3VudCAtIGRvbmUsIGxlbik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcl9tdmNvcyhsZW4sIHNyYywgYnVmKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyX212Y29zKGJ1Ziwgc3JjLCBsZW4pKQogCQkJcmV0dXJuIDA7CiAJCWxlbl9zdHIgPSBzdHJubGVuKGJ1ZiwgbGVuKTsKIAkJZG9uZSArPSBsZW5fc3RyOwpAQCAtMTY0LDE4ICsyMDQsMjYgQEAKIAlyZXR1cm4gZG9uZSArIDE7CiB9CiAKLXN0YXRpYyBzaXplX3Qgc3RybmNweV9mcm9tX3VzZXJfbXZjb3Moc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLAotCQkJCSAgICAgIGNoYXIgKmRzdCkKK3Vuc2lnbmVkIGxvbmcgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlzaXplX3QgZG9uZSwgbGVuLCBvZmZzZXQsIGxlbl9zdHI7CisJaWYgKHN0YXRpY19rZXlfdHJ1ZSgmaGF2ZV9tdmNvcykpCisJCXJldHVybiBzdHJubGVuX3VzZXJfbXZjb3Moc3JjLCBjb3VudCk7CisJcmV0dXJuIHN0cm5sZW5fdXNlcl9wdChzcmMsIGNvdW50KTsKK30KK0VYUE9SVF9TWU1CT0woX19zdHJubGVuX3VzZXIpOwogCi0JaWYgKHVubGlrZWx5KCFjb3VudCkpCitzdGF0aWMgaW5saW5lIGxvbmcgc3RybmNweV9mcm9tX3VzZXJfbXZjb3MoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLAorCQkJCQkgICBsb25nIGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZG9uZSwgbGVuLCBvZmZzZXQsIGxlbl9zdHI7CisKKwlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybiAwOwogCWRvbmUgPSAwOwogCWRvIHsKLQkJb2Zmc2V0ID0gKHNpemVfdClzcmMgJiB+UEFHRV9NQVNLOworCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylzcmMgJiB+UEFHRV9NQVNLOwogCQlsZW4gPSBtaW4oY291bnQgLSBkb25lLCBQQUdFX1NJWkUgLSBvZmZzZXQpOwotCQlpZiAoY29weV9mcm9tX3VzZXJfbXZjb3MobGVuLCBzcmMsIGRzdCkpCisJCWlmIChjb3B5X2Zyb21fdXNlcl9tdmNvcyhkc3QsIHNyYywgbGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlsZW5fc3RyID0gc3Rybmxlbihkc3QsIGxlbik7CiAJCWRvbmUgKz0gbGVuX3N0cjsKQEAgLTE4NSwxMyArMjMzLDMxIEBACiAJcmV0dXJuIGRvbmU7CiB9CiAKLXN0cnVjdCB1YWNjZXNzX29wcyB1YWNjZXNzX212Y29zID0gewotCS5jb3B5X2Zyb21fdXNlciA9IGNvcHlfZnJvbV91c2VyX212Y29zLAotCS5jb3B5X3RvX3VzZXIgPSBjb3B5X3RvX3VzZXJfbXZjb3MsCi0JLmNvcHlfaW5fdXNlciA9IGNvcHlfaW5fdXNlcl9tdmNvcywKLQkuY2xlYXJfdXNlciA9IGNsZWFyX3VzZXJfbXZjb3MsCi0JLnN0cm5sZW5fdXNlciA9IHN0cm5sZW5fdXNlcl9tdmNvcywKLQkuc3RybmNweV9mcm9tX3VzZXIgPSBzdHJuY3B5X2Zyb21fdXNlcl9tdmNvcywKLQkuZnV0ZXhfYXRvbWljX29wID0gZnV0ZXhfYXRvbWljX29wX3B0LAotCS5mdXRleF9hdG9taWNfY21weGNoZyA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX3B0LAotfTsKK2xvbmcgX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCit7CisJaWYgKHN0YXRpY19rZXlfdHJ1ZSgmaGF2ZV9tdmNvcykpCisJCXJldHVybiBzdHJuY3B5X2Zyb21fdXNlcl9tdmNvcyhkc3QsIHNyYywgY291bnQpOworCXJldHVybiBzdHJuY3B5X2Zyb21fdXNlcl9wdChkc3QsIHNyYywgY291bnQpOworfQorRVhQT1JUX1NZTUJPTChfX3N0cm5jcHlfZnJvbV91c2VyKTsKKworLyoKKyAqIFRoZSB1YWNjZXNzIHBhZ2UgdGFiZSB3YWxrIHZhcmlhbnQgY2FuIGJlIGVuZm9yY2VkIHdpdGggdGhlICJ1YWNjZXNzcHQiCisgKiBrZXJuZWwgcGFyYW1ldGVyLiBUaGlzIGlzIG1haW5seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICovCitzdGF0aWMgaW50IGZvcmNlX3VhY2Nlc3NfcHQgX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdWFjY2Vzc19wdChjaGFyICpfX3VudXNlZCkKK3sKKwlmb3JjZV91YWNjZXNzX3B0ID0gMTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJ1YWNjZXNzcHQiLCBwYXJzZV91YWNjZXNzX3B0KTsKKworc3RhdGljIGludCBfX2luaXQgdWFjY2Vzc19pbml0KHZvaWQpCit7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHXzMyQklUKSB8fCBmb3JjZV91YWNjZXNzX3B0IHx8ICF0ZXN0X2ZhY2lsaXR5KDI3KSkKKwkJc3RhdGljX2tleV9zbG93X2RlYygmaGF2ZV9tdmNvcyk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9pbml0Y2FsbCh1YWNjZXNzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYwppbmRleCA2MWViY2M5Li44ZDM5NzYwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYwpAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZSBTTFIJInNsZ3IiCiAjZW5kaWYKIAotc3RhdGljIHNpemVfdCBzdHJubGVuX2tlcm5lbChzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgX191c2VyICpzcmMpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdHJubGVuX2tlcm5lbChjb25zdCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20oIjAiKSA9IDBVTDsKIAl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7CkBAIC00Miw4ICs0Miw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc2l6ZV90IGNvcHlfaW5fa2VybmVsKHNpemVfdCBjb3VudCwgdm9pZCBfX3VzZXIgKnRvLAotCQkJICAgICBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvcHlfaW5fa2VybmVsKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAxOwogCkBAIC0xNDYsOCArMTQ2LDggQEAKIAogI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHNpemVfdCBfX3VzZXJfY29weV9wdCh1bnNpZ25lZCBsb25nIHVhZGRyLCB2b2lkICprcHRyLAotCQkJCQkgICAgIHNpemVfdCBuLCBpbnQgd3JpdGVfdXNlcikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3VzZXJfY29weV9wdCh1bnNpZ25lZCBsb25nIHVhZGRyLCB2b2lkICprcHRyLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIG4sIGludCB3cml0ZV91c2VyKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGRvbmUsIHNpemUsIGthZGRyOwpAQCAtMTg5LDggKzE4OSw3IEBACiAgKiBEbyBEQVQgZm9yIHVzZXIgYWRkcmVzcyBieSBwYWdlIHRhYmxlIHdhbGssIHJldHVybiBrZXJuZWwgYWRkcmVzcy4KICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggY3VycmVudC0+bW0tPnBhZ2VfdGFibGVfbG9jayBoZWxkLgogICovCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19kYXRfdXNlcl9hZGRyKHVuc2lnbmVkIGxvbmcgdWFkZHIsCi0JCQkJCQkgICAgIGludCB3cml0ZSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2RhdF91c2VyX2FkZHIodW5zaWduZWQgbG9uZyB1YWRkciwgaW50IHdyaXRlKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJdW5zaWduZWQgbG9uZyBrYWRkcjsKQEAgLTIxMSwyOSArMjEwLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzaXplX3QgY29weV9mcm9tX3VzZXJfcHQoc2l6ZV90IG4sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB2b2lkICp0bykKK3Vuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXJfcHQodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0Jc2l6ZV90IHJjOworCXVuc2lnbmVkIGxvbmcgcmM7CiAKIAlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkKLQkJcmV0dXJuIGNvcHlfaW5fa2VybmVsKG4sICh2b2lkIF9fdXNlciAqKSB0bywgZnJvbSk7CisJCXJldHVybiBjb3B5X2luX2tlcm5lbCgodm9pZCBfX3VzZXIgKikgdG8sIGZyb20sIG4pOwogCXJjID0gX191c2VyX2NvcHlfcHQoKHVuc2lnbmVkIGxvbmcpIGZyb20sIHRvLCBuLCAwKTsKIAlpZiAodW5saWtlbHkocmMpKQogCQltZW1zZXQodG8gKyBuIC0gcmMsIDAsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzaXplX3QgY29weV90b191c2VyX3B0KHNpemVfdCBuLCB2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20pCit1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcl9wdCh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkKLQkJcmV0dXJuIGNvcHlfaW5fa2VybmVsKG4sIHRvLCAodm9pZCBfX3VzZXIgKikgZnJvbSk7CisJCXJldHVybiBjb3B5X2luX2tlcm5lbCh0bywgKHZvaWQgX191c2VyICopIGZyb20sIG4pOwogCXJldHVybiBfX3VzZXJfY29weV9wdCgodW5zaWduZWQgbG9uZykgdG8sICh2b2lkICopIGZyb20sIG4sIDEpOwogfQogCi1zdGF0aWMgc2l6ZV90IGNsZWFyX3VzZXJfcHQoc2l6ZV90IG4sIHZvaWQgX191c2VyICp0bykKK3Vuc2lnbmVkIGxvbmcgY2xlYXJfdXNlcl9wdCh2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAl2b2lkICp6cGFnZSA9ICh2b2lkICopIGVtcHR5X3plcm9fcGFnZTsKLQlsb25nIGRvbmUsIHNpemUsIHJldDsKKwl1bnNpZ25lZCBsb25nIGRvbmUsIHNpemUsIHJldDsKIAogCWRvbmUgPSAwOwogCWRvIHsKQEAgLTI0Miw3ICsyNDEsNyBAQAogCQllbHNlCiAJCQlzaXplID0gbiAtIGRvbmU7CiAJCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKQotCQkJcmV0ID0gY29weV9pbl9rZXJuZWwobiwgdG8sICh2b2lkIF9fdXNlciAqKSB6cGFnZSk7CisJCQlyZXQgPSBjb3B5X2luX2tlcm5lbCh0bywgKHZvaWQgX191c2VyICopIHpwYWdlLCBuKTsKIAkJZWxzZQogCQkJcmV0ID0gX191c2VyX2NvcHlfcHQoKHVuc2lnbmVkIGxvbmcpIHRvLCB6cGFnZSwgc2l6ZSwgMSk7CiAJCWRvbmUgKz0gc2l6ZTsKQEAgLTI1MywxNyArMjUyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzaXplX3Qgc3Rybmxlbl91c2VyX3B0KHNpemVfdCBjb3VudCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYykKK3Vuc2lnbmVkIGxvbmcgc3Rybmxlbl91c2VyX3B0KGNvbnN0IGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyB1YWRkciA9ICh1bnNpZ25lZCBsb25nKSBzcmM7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgZG9uZSwgbGVuLCBrYWRkcjsKLQlzaXplX3QgbGVuX3N0cjsKKwl1bnNpZ25lZCBsb25nIGxlbl9zdHI7CiAKIAlpZiAodW5saWtlbHkoIWNvdW50KSkKIAkJcmV0dXJuIDA7CiAJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpCi0JCXJldHVybiBzdHJubGVuX2tlcm5lbChjb3VudCwgc3JjKTsKKwkJcmV0dXJuIHN0cm5sZW5fa2VybmVsKHNyYywgY291bnQpOwogCWlmICghbW0pCiAJCXJldHVybiAwOwogCWRvbmUgPSAwOwpAQCAtMjg5LDE5ICsyODgsMTggQEAKIAlnb3RvIHJldHJ5OwogfQogCi1zdGF0aWMgc2l6ZV90IHN0cm5jcHlfZnJvbV91c2VyX3B0KHNpemVfdCBjb3VudCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywKLQkJCQkgICBjaGFyICpkc3QpCitsb25nIHN0cm5jcHlfZnJvbV91c2VyX3B0KGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKIHsKLQlzaXplX3QgZG9uZSwgbGVuLCBvZmZzZXQsIGxlbl9zdHI7CisJdW5zaWduZWQgbG9uZyBkb25lLCBsZW4sIG9mZnNldCwgbGVuX3N0cjsKIAotCWlmICh1bmxpa2VseSghY291bnQpKQorCWlmICh1bmxpa2VseShjb3VudCA8PSAwKSkKIAkJcmV0dXJuIDA7CiAJZG9uZSA9IDA7CiAJZG8gewotCQlvZmZzZXQgPSAoc2l6ZV90KXNyYyAmIH5QQUdFX01BU0s7CisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKXNyYyAmIH5QQUdFX01BU0s7CiAJCWxlbiA9IG1pbihjb3VudCAtIGRvbmUsIFBBR0VfU0laRSAtIG9mZnNldCk7CiAJCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSB7Ci0JCQlpZiAoY29weV9pbl9rZXJuZWwobGVuLCAodm9pZCBfX3VzZXIgKikgZHN0LCBzcmMpKQorCQkJaWYgKGNvcHlfaW5fa2VybmVsKCh2b2lkIF9fdXNlciAqKSBkc3QsIHNyYywgbGVuKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfSBlbHNlIHsKIAkJCWlmIChfX3VzZXJfY29weV9wdCgodW5zaWduZWQgbG9uZykgc3JjLCBkc3QsIGxlbiwgMCkpCkBAIC0zMTUsOCArMzEzLDggQEAKIAlyZXR1cm4gZG9uZTsKIH0KIAotc3RhdGljIHNpemVfdCBjb3B5X2luX3VzZXJfcHQoc2l6ZV90IG4sIHZvaWQgX191c2VyICp0bywKLQkJCSAgICAgIGNvbnN0IHZvaWQgX191c2VyICpmcm9tKQordW5zaWduZWQgbG9uZyBjb3B5X2luX3VzZXJfcHQodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0X21heCwgdWFkZHIsIGRvbmUsIHNpemUsIGVycm9yX2NvZGU7CkBAIC0zMjYsNyArMzI0LDcgQEAKIAlpbnQgd3JpdGVfdXNlcjsKIAogCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKQotCQlyZXR1cm4gY29weV9pbl9rZXJuZWwobiwgdG8sIGZyb20pOworCQlyZXR1cm4gY29weV9pbl9rZXJuZWwodG8sIGZyb20sIG4pOwogCWlmICghbW0pCiAJCXJldHVybiBuOwogCWRvbmUgPSAwOwpAQCAtNDExLDcgKzQwOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGZ1dGV4X2F0b21pY19vcF9wdChpbnQgb3AsIHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgb3BhcmcsIGludCAqb2xkKQoraW50IF9fZnV0ZXhfYXRvbWljX29wX2ludXNlcihpbnQgb3AsIHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgb3BhcmcsIGludCAqb2xkKQogewogCWludCByZXQ7CiAKQEAgLTQ0OSw4ICs0NDcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBmdXRleF9hdG9taWNfY21weGNoZ19wdCh1MzIgKnV2YWwsIHUzMiBfX3VzZXIgKnVhZGRyLAotCQkJICAgIHUzMiBvbGR2YWwsIHUzMiBuZXd2YWwpCitpbnQgZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModTMyICp1dmFsLCB1MzIgX191c2VyICp1YWRkciwKKwkJCQkgIHUzMiBvbGR2YWwsIHUzMiBuZXd2YWwpCiB7CiAJaW50IHJldDsKIApAQCAtNDcxLDE0ICs0NjksMyBAQAogCXB1dF9wYWdlKHZpcnRfdG9fcGFnZSh1YWRkcikpOwogCXJldHVybiByZXQ7CiB9Ci0KLXN0cnVjdCB1YWNjZXNzX29wcyB1YWNjZXNzX3B0ID0gewotCS5jb3B5X2Zyb21fdXNlcgkJPSBjb3B5X2Zyb21fdXNlcl9wdCwKLQkuY29weV90b191c2VyCQk9IGNvcHlfdG9fdXNlcl9wdCwKLQkuY29weV9pbl91c2VyCQk9IGNvcHlfaW5fdXNlcl9wdCwKLQkuY2xlYXJfdXNlcgkJPSBjbGVhcl91c2VyX3B0LAotCS5zdHJubGVuX3VzZXIJCT0gc3Rybmxlbl91c2VyX3B0LAotCS5zdHJuY3B5X2Zyb21fdXNlcgk9IHN0cm5jcHlfZnJvbV91c2VyX3B0LAotCS5mdXRleF9hdG9taWNfb3AJPSBmdXRleF9hdG9taWNfb3BfcHQsCi0JLmZ1dGV4X2F0b21pY19jbXB4Y2hnCT0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfcHQsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL21hY2Nlc3MuYyBiL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKaW5kZXggZDFlMGUwYy4uMmEyZTM1NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL21hY2Nlc3MuYworKysgYi9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIC8qCiAgKiBDb3B5IG1lbW9yeSBmcm9tIGtlcm5lbCAocmVhbCkgdG8gdXNlciAodmlydHVhbCkKICAqLwotaW50IGNvcHlfdG9fdXNlcl9yZWFsKHZvaWQgX191c2VyICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCkKK2ludCBjb3B5X3RvX3VzZXJfcmVhbCh2b2lkIF9fdXNlciAqZGVzdCwgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWludCBvZmZzID0gMCwgc2l6ZSwgcmM7CiAJY2hhciAqYnVmOwpAQCAtMTUyLDMyICsxNTIsNiBAQAogfQogCiAvKgotICogQ29weSBtZW1vcnkgZnJvbSB1c2VyICh2aXJ0dWFsKSB0byBrZXJuZWwgKHJlYWwpCi0gKi8KLWludCBjb3B5X2Zyb21fdXNlcl9yZWFsKHZvaWQgKmRlc3QsIHZvaWQgX191c2VyICpzcmMsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgb2ZmcyA9IDAsIHNpemUsIHJjOwotCWNoYXIgKmJ1ZjsKLQotCWJ1ZiA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmMgPSAtRUZBVUxUOwotCXdoaWxlIChvZmZzIDwgY291bnQpIHsKLQkJc2l6ZSA9IG1pbihQQUdFX1NJWkUsIGNvdW50IC0gb2Zmcyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHNyYyArIG9mZnMsIHNpemUpKQotCQkJZ290byBvdXQ7Ci0JCWlmIChtZW1jcHlfcmVhbChkZXN0ICsgb2ZmcywgYnVmLCBzaXplKSkKLQkJCWdvdG8gb3V0OwotCQlvZmZzICs9IHNpemU7Ci0JfQotCXJjID0gMDsKLW91dDoKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgogICogQ2hlY2sgaWYgcGh5c2ljYWwgYWRkcmVzcyBpcyB3aXRoaW4gcHJlZml4IG9yIHplcm8gcGFnZQogICovCiBzdGF0aWMgaW50IGlzX3N3YXBwZWQodW5zaWduZWQgbG9uZyBhZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3BndGFibGUuYyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKaW5kZXggMzU4NGVkOS4uNzk2YzkzMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3BndGFibGUuYworKysgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcXVpY2tsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpAQCAtNTk0LDYgKzU5NSw4MiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ21hcF9mYXVsdCk7CiAKK3N0YXRpYyB2b2lkIGdtYXBfemFwX3N3YXBfZW50cnkoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWlmICghbm9uX3N3YXBfZW50cnkoZW50cnkpKQorCQlkZWNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpOworCWVsc2UgaWYgKGlzX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBtaWdyYXRpb25fZW50cnlfdG9fcGFnZShlbnRyeSk7CisKKwkJaWYgKFBhZ2VBbm9uKHBhZ2UpKQorCQkJZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7CisJCWVsc2UKKwkJCWRlY19tbV9jb3VudGVyKG1tLCBNTV9GSUxFUEFHRVMpOworCX0KKwlmcmVlX3N3YXBfYW5kX2NhY2hlKGVudHJ5KTsKK30KKworLyoqCisgKiBUaGUgbW0tPm1tYXBfc2VtIGxvY2sgbXVzdCBiZSBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGdtYXBfemFwX3VudXNlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXVuc2lnbmVkIGxvbmcgcHRldiwgcGdzdGV2OworCXNwaW5sb2NrX3QgKnB0bDsKKwlwZ3N0ZV90IHBnc3RlOworCXB0ZV90ICpwdGVwLCBwdGU7CisKKwlwdGVwID0gZ2V0X2xvY2tlZF9wdGUobW0sIGFkZHJlc3MsICZwdGwpOworCWlmICh1bmxpa2VseSghcHRlcCkpCisJCXJldHVybjsKKwlwdGUgPSAqcHRlcDsKKwlpZiAoIXB0ZV9zd2FwKHB0ZSkpCisJCWdvdG8gb3V0X3B0ZTsKKwkvKiBaYXAgdW51c2VkIGFuZCBsb2dpY2FsbHktemVybyBwYWdlcyAqLworCXBnc3RlID0gcGdzdGVfZ2V0X2xvY2socHRlcCk7CisJcGdzdGV2ID0gcGdzdGVfdmFsKHBnc3RlKTsKKwlwdGV2ID0gcHRlX3ZhbChwdGUpOworCWlmICgoKHBnc3RldiAmIF9QR1NURV9HUFNfVVNBR0VfTUFTSykgPT0gX1BHU1RFX0dQU19VU0FHRV9VTlVTRUQpIHx8CisJICAgICgocGdzdGV2ICYgX1BHU1RFX0dQU19aRVJPKSAmJiAocHRldiAmIF9QQUdFX0lOVkFMSUQpKSkgeworCQlnbWFwX3phcF9zd2FwX2VudHJ5KHB0ZV90b19zd3BfZW50cnkocHRlKSwgbW0pOworCQlwdGVfY2xlYXIobW0sIGFkZHJlc3MsIHB0ZXApOworCX0KKwlwZ3N0ZV9zZXRfdW5sb2NrKHB0ZXAsIHBnc3RlKTsKK291dF9wdGU6CisJcHRlX3VubWFwX3VubG9jaygqcHRlcCwgcHRsKTsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQgd2l0aCBtbWFwX3NlbSBoZWxkCisgKi8KK3ZvaWQgX19nbWFwX3phcCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBnbWFwICpnbWFwKQoreworCXVuc2lnbmVkIGxvbmcgKnRhYmxlLCAqc2VnbWVudF9wdHI7CisJdW5zaWduZWQgbG9uZyBzZWdtZW50LCBwZ3N0ZXYsIHB0ZXY7CisJc3RydWN0IGdtYXBfcGd0YWJsZSAqbXA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlzZWdtZW50X3B0ciA9IGdtYXBfdGFibGVfd2FsayhhZGRyZXNzLCBnbWFwKTsKKwlpZiAoSVNfRVJSKHNlZ21lbnRfcHRyKSkKKwkJcmV0dXJuOworCXNlZ21lbnQgPSAqc2VnbWVudF9wdHI7CisJaWYgKHNlZ21lbnQgJiBfU0VHTUVOVF9FTlRSWV9JTlZBTElEKQorCQlyZXR1cm47CisJcGFnZSA9IHBmbl90b19wYWdlKHNlZ21lbnQgPj4gUEFHRV9TSElGVCk7CisJbXAgPSAoc3RydWN0IGdtYXBfcGd0YWJsZSAqKSBwYWdlLT5pbmRleDsKKwlhZGRyZXNzID0gbXAtPnZtYWRkciB8IChhZGRyZXNzICYgflBNRF9NQVNLKTsKKwkvKiBQYWdlIHRhYmxlIGlzIHByZXNlbnQgKi8KKwl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopKHNlZ21lbnQgJiBfU0VHTUVOVF9FTlRSWV9PUklHSU4pOworCXRhYmxlID0gdGFibGUgKyAoKGFkZHJlc3MgPj4gMTIpICYgMHhmZik7CisJcGdzdGV2ID0gdGFibGVbUFRSU19QRVJfUFRFXTsKKwlwdGV2ID0gdGFibGVbMF07CisJLyogcXVpY2sgY2hlY2ssIGNoZWNrZWQgYWdhaW4gd2l0aCBsb2NrcyBoZWxkICovCisJaWYgKCgocGdzdGV2ICYgX1BHU1RFX0dQU19VU0FHRV9NQVNLKSA9PSBfUEdTVEVfR1BTX1VTQUdFX1VOVVNFRCkgfHwKKwkgICAgKChwZ3N0ZXYgJiBfUEdTVEVfR1BTX1pFUk8pICYmIChwdGV2ICYgX1BBR0VfSU5WQUxJRCkpKQorCQlnbWFwX3phcF91bnVzZWQoZ21hcC0+bW0sIGFkZHJlc3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19nbWFwX3phcCk7CisKIHZvaWQgZ21hcF9kaXNjYXJkKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyB0bywgc3RydWN0IGdtYXAgKmdtYXApCiB7CiAKQEAgLTY3MSw3ICs3NDgsNyBAQAogLyoqCiAgKiBnbWFwX2lwdGVfbm90aWZ5IC0gbWFyayBhIHJhbmdlIG9mIHB0ZXMgZm9yIGludmFsaWRhdGlvbiBub3RpZmljYXRpb24KICAqIEBnbWFwOiBwb2ludGVyIHRvIGd1ZXN0IG1hcHBpbmcgbWV0YSBkYXRhIHN0cnVjdHVyZQotICogQGFkZHJlc3M6IHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgYWRkcmVzcyBzcGFjZQorICogQHN0YXJ0OiB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2UKICAqIEBsZW46IHNpemUgb2YgYXJlYQogICoKICAqIFJldHVybnMgMCBpZiBmb3IgZWFjaCBwYWdlIGluIHRoZSBnaXZlbiByYW5nZSBhIGdtYXAgbWFwcGluZyBleGlzdHMgYW5kCkBAIC03MjUsMTMgKzgwMiwxMiBAQAogLyoqCiAgKiBnbWFwX2RvX2lwdGVfbm90aWZ5IC0gY2FsbCBhbGwgaW52YWxpZGF0aW9uIGNhbGxiYWNrcyBmb3IgYSBzcGVjaWZpYyBwdGUuCiAgKiBAbW06IHBvaW50ZXIgdG8gdGhlIHByb2Nlc3MgbW1fc3RydWN0Ci0gKiBAYWRkcjogdmlydHVhbCBhZGRyZXNzIGluIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UKICAqIEBwdGU6IHBvaW50ZXIgdG8gdGhlIHBhZ2UgdGFibGUgZW50cnkKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIHdpdGggdGhlIHBhZ2UgdGFibGUgbG9jayBoZWxkCiAgKiBmb3IgdGhlIHB0ZSB0byBub3RpZnkuCiAgKi8KLXZvaWQgZ21hcF9kb19pcHRlX25vdGlmeShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlKQordm9pZCBnbWFwX2RvX2lwdGVfbm90aWZ5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQogewogCXVuc2lnbmVkIGxvbmcgc2VnbWVudF9vZmZzZXQ7CiAJc3RydWN0IGdtYXBfbm90aWZpZXIgKm5iOwpAQCAtODAyLDYgKzg3OCw3OCBAQAogCV9fZnJlZV9wYWdlKHBhZ2UpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGFnZV90YWJsZV9yZXNldF9wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQlwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXB0ZV90ICpzdGFydF9wdGUsICpwdGU7CisJc3BpbmxvY2tfdCAqcHRsOworCXBnc3RlX3QgcGdzdGU7CisKKwlzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsICZwdGwpOworCXB0ZSA9IHN0YXJ0X3B0ZTsKKwlkbyB7CisJCXBnc3RlID0gcGdzdGVfZ2V0X2xvY2socHRlKTsKKwkJcGdzdGVfdmFsKHBnc3RlKSAmPSB+X1BHU1RFX0dQU19VU0FHRV9NQVNLOworCQlwZ3N0ZV9zZXRfdW5sb2NrKHB0ZSwgcGdzdGUpOworCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOworCXB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGwpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYWdlX3RhYmxlX3Jlc2V0X3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCXB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCXBtZF90ICpwbWQ7CisKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJZG8geworCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKKwkJCWNvbnRpbnVlOworCQluZXh0ID0gcGFnZV90YWJsZV9yZXNldF9wdGUobW0sIHBtZCwgYWRkciwgbmV4dCk7CisJfSB3aGlsZSAocG1kKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhZ2VfdGFibGVfcmVzZXRfcHVkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJcGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIG5leHQ7CisJcHVkX3QgKnB1ZDsKKworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKKwlkbyB7CisJCW5leHQgPSBwdWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQorCQkJY29udGludWU7CisJCW5leHQgPSBwYWdlX3RhYmxlX3Jlc2V0X3BtZChtbSwgcHVkLCBhZGRyLCBuZXh0KTsKKwl9IHdoaWxlIChwdWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKKworCXJldHVybiBhZGRyOworfQorCit2b2lkIHBhZ2VfdGFibGVfcmVzZXRfcGdzdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIG5leHQ7CisJcGdkX3QgKnBnZDsKKworCWFkZHIgPSBzdGFydDsKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcik7CisJZG8geworCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwZ2Rfbm9uZV9vcl9jbGVhcl9iYWQocGdkKSkKKwkJCWNvbnRpbnVlOworCQluZXh0ID0gcGFnZV90YWJsZV9yZXNldF9wdWQobW0sIHBnZCwgYWRkciwgbmV4dCk7CisJfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0wocGFnZV90YWJsZV9yZXNldF9wZ3N0ZSk7CisKIGludCBzZXRfZ3Vlc3Rfc3RvcmFnZV9rZXkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgdW5zaWduZWQgbG9uZyBrZXksIGJvb2wgbnEpCiB7CkBAIC0xMjQ4LDcgKzEzOTYsNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxoID0gKHN0cnVjdCBsaXN0X2hlYWQgKikgcGd0YWJsZTsKIAotCWFzc2VydF9zcGluX2xvY2tlZCgmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKHBtZF9sb2NrcHRyKG1tLCBwbWRwKSk7CiAKIAkvKiBGSUZPICovCiAJaWYgKCFwbWRfaHVnZV9wdGUobW0sIHBtZHApKQpAQCAtMTI2NCw3ICsxNDEyLDcgQEAKIAlwZ3RhYmxlX3QgcGd0YWJsZTsKIAlwdGVfdCAqcHRlcDsKIAotCWFzc2VydF9zcGluX2xvY2tlZCgmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKHBtZF9sb2NrcHRyKG1tLCBwbWRwKSk7CiAKIAkvKiBGSUZPICovCiAJcGd0YWJsZSA9IHBtZF9odWdlX3B0ZShtbSwgcG1kcCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvcGNpL3BjaS5jIGIvYXJjaC9zMzkwL3BjaS9wY2kuYwppbmRleCA2NjY3MGZmLi4xZGYxZDI5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvcGNpL3BjaS5jCisrKyBiL2FyY2gvczM5MC9wY2kvcGNpLmMKQEAgLTY4NiwyNyArNjg2LDEzIEBACiBpbnQgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbWFzaykKIHsKIAlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSBnZXRfemRldihwZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQl1MTYgY21kOwotCWludCBpOwogCiAJemRldi0+cGRldiA9IHBkZXY7CiAJenBjaV9kZWJ1Z19pbml0X2RldmljZSh6ZGV2KTsKIAl6cGNpX2ZtYl9lbmFibGVfZGV2aWNlKHpkZXYpOwogCXpwY2lfbWFwX3Jlc291cmNlcyh6ZGV2KTsKIAotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlmb3IgKGkgPSAwOyBpIDwgUENJX0JBUl9DT1VOVDsgaSsrKSB7Ci0JCXJlcyA9ICZwZGV2LT5yZXNvdXJjZVtpXTsKLQotCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQl9Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCXJldHVybiAwOworCXJldHVybiBwY2lfZW5hYmxlX3Jlc291cmNlcyhwZGV2LCBtYXNrKTsKIH0KIAogdm9pZCBwY2liaW9zX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL3BjaS9wY2lfZGVidWcuYyBiL2FyY2gvczM5MC9wY2kvcGNpX2RlYnVnLmMKaW5kZXggNzVjNjliNC4uYzVjNjY4NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL3BjaS9wY2lfZGVidWcuYworKysgYi9hcmNoL3MzOTAvcGNpL3BjaV9kZWJ1Zy5jCkBAIC0xMzksNyArMTM5LDcgQEAKIGludCBfX2luaXQgenBjaV9kZWJ1Z19pbml0KHZvaWQpCiB7CiAJLyogZXZlbnQgdHJhY2UgYnVmZmVyICovCi0JcGNpX2RlYnVnX21zZ19pZCA9IGRlYnVnX3JlZ2lzdGVyKCJwY2lfbXNnIiwgMTYsIDEsIDE2ICogc2l6ZW9mKGxvbmcpKTsKKwlwY2lfZGVidWdfbXNnX2lkID0gZGVidWdfcmVnaXN0ZXIoInBjaV9tc2ciLCA4LCAxLCA4ICogc2l6ZW9mKGxvbmcpKTsKIAlpZiAoIXBjaV9kZWJ1Z19tc2dfaWQpCiAJCXJldHVybiAtRUlOVkFMOwogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcocGNpX2RlYnVnX21zZ19pZCwgJmRlYnVnX3NwcmludGZfdmlldyk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvcGNpL3BjaV9zeXNmcy5jIGIvYXJjaC9zMzkwL3BjaS9wY2lfc3lzZnMuYwppbmRleCBjZjhhMTJmLi5hYjRhOTEzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvcGNpL3BjaV9zeXNmcy5jCisrKyBiL2FyY2gvczM5MC9wY2kvcGNpX3N5c2ZzLmMKQEAgLTQ4LDI5ICs0OCwyNyBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKHBmZ2lkLCBTX0lSVUdPLCBzaG93X3BmZ2lkLCBOVUxMKTsKIAotc3RhdGljIHZvaWQgcmVjb3Zlcl9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWNvdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IGdldF96ZGV2KHBkZXYpOwogCWludCByZXQ7CiAKKwlpZiAoIWRldmljZV9yZW1vdmVfZmlsZV9zZWxmKGRldiwgYXR0cikpCisJCXJldHVybiBjb3VudDsKKwogCXBjaV9zdG9wX2FuZF9yZW1vdmVfYnVzX2RldmljZShwZGV2KTsKIAlyZXQgPSB6cGNpX2Rpc2FibGVfZGV2aWNlKHpkZXYpOwogCWlmIChyZXQpCi0JCXJldHVybjsKKwkJcmV0dXJuIHJldDsKIAogCXJldCA9IHpwY2lfZW5hYmxlX2RldmljZSh6ZGV2KTsKIAlpZiAocmV0KQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAlwY2lfcmVzY2FuX2J1cyh6ZGV2LT5idXMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9yZWNvdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCByYyA9IGRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIHJlY292ZXJfY2FsbGJhY2spOwotCXJldHVybiByYyA/IHJjIDogY291bnQ7CisJcmV0dXJuIGNvdW50OwogfQogc3RhdGljIERFVklDRV9BVFRSKHJlY292ZXIsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3JlY292ZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDE0NmI5ZDUuLjJmOTQ3YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDEwICsxLDEyIEBACiAKIGhlYWRlci15ICs9CiAKKwogZ2VuZXJpYy15ICs9IGJhcnJpZXIuaAogZ2VuZXJpYy15ICs9IGNsa2Rldi5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCiBnZW5lcmljLXkgKz0gaGFzaC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjZWQ5OS4uMDAwMDAwMAotLS0gYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NDT1JFX0NQVVRJTUVfSAotI2RlZmluZSBfQVNNX1NDT1JFX0NQVVRJTUVfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgotCi0jZW5kaWYgLyogX0FTTV9TQ09SRV9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCA2MzU3NzEwLi4xMzk5MzgzIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0xMjMsMTUgKzEyMyw2IEBACiBjb25maWcgU1lTX1NVUFBPUlRTX1BDSQogCWJvb2wKIAotY29uZmlnIFNZU19TVVBQT1JUU19DTVQKLQlib29sCi0KLWNvbmZpZyBTWVNfU1VQUE9SVFNfTVRVMgotCWJvb2wKLQotY29uZmlnIFNZU19TVVBQT1JUU19UTVUKLQlib29sCi0KIGNvbmZpZyBTVEFDS1RSQUNFX1NVUFBPUlQKIAlkZWZfYm9vbCB5CiAKQEAgLTE5MSwxNCArMTgyLDE0IEBACiAJYm9vbAogCXNlbGVjdCBDUFVfSEFTX0lOVEVWVAogCXNlbGVjdCBDUFVfSEFTX1NSX1JCCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19UTVUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX1RNVQogCiBjb25maWcgQ1BVX1NINAogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKIAlzZWxlY3QgQ1BVX0hBU19TUl9SQgogCXNlbGVjdCBDUFVfSEFTX0ZQVSBpZiAhQ1BVX1NINEFMX0RTUAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfVE1VCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUyBpZiBNTVUKIAogY29uZmlnIENQVV9TSDRBCkBAIC0yMTMsNyArMjA0LDcgQEAKIGNvbmZpZyBDUFVfU0g1CiAJYm9vbAogCXNlbGVjdCBDUFVfSEFTX0ZQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfVE1VCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9UTVUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUyBpZiBNTVUKIAogY29uZmlnIENQVV9TSFgyCkBAIC0yNTAsNyArMjQxLDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc2MTkKIAlib29sICJTdXBwb3J0IFNINzYxOSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDIKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAKICMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKIApAQCAtMjU4LDUwICsyNDksNTAgQEAKIAlib29sICJTdXBwb3J0IFNINzIwMSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAgCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjAzCiAJYm9vbCAiU3VwcG9ydCBTSDcyMDMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQogCXNlbGVjdCBDUFVfSEFTX0ZQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjA2CiAJYm9vbCAiU3VwcG9ydCBTSDcyMDYgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX01UVTIKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzI2MwogCWJvb2wgIlN1cHBvcnQgU0g3MjYzIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMkEKIAlzZWxlY3QgQ1BVX0hBU19GUFUKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9NVFUyCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyNjQKIAlib29sICJTdXBwb3J0IFNINzI2NCBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCXNlbGVjdCBQSU5DVFJMCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyNjkKIAlib29sICJTdXBwb3J0IFNINzI2OSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCXNlbGVjdCBQSU5DVFJMCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9NWEcKIAlib29sICJTdXBwb3J0IE1YLUcgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCWhlbHAKIAkgIFNlbGVjdCBNWC1HIGlmIHJ1bm5pbmcgb24gYW4gUjhBMDMwMjJCRyBwYXJ0LgogCkBAIC0zNTQsOSArMzQ1LDggQEAKIAlib29sICJTdXBwb3J0IFNINzcyMCBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDMKIAlzZWxlY3QgQ1BVX0hBU19EU1AKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCiAJc2VsZWN0IFVTQl9PSENJX1NIIGlmIFVTQl9PSENJX0hDRAogCXNlbGVjdCBQSU5DVFJMCiAJaGVscApAQCAtMzY2LDggKzM1Niw3IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc3MjEgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gzCiAJc2VsZWN0IENQVV9IQVNfRFNQCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAloZWxwCiAJICBTZWxlY3QgU0g3NzIxIGlmIHlvdSBoYXZlIGEgU0gzLURTUCBTSDc3MjEgQ1BVLgpAQCAtNDIyLDcgKzQxMSw3IEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfU0hNT0JJTEUKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAJaGVscApAQCAtNDM0LDcgKzQyMyw3IEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfU0hNT0JJTEUKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAJaGVscApAQCAtNDQ1LDggKzQzNCw2IEBACiAJc2VsZWN0IENQVV9TSDRBCiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFBJTkNUUkwKIAloZWxwCiAJICBTZWxlY3QgU0g3NzM0IGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3MzQgQ1BVLgpAQCAtNDU2LDggKzQ0Myw2IEBACiAJc2VsZWN0IENQVV9TSDRBCiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFBJTkNUUkwKIAloZWxwCiAJICBTZWxlY3QgU0g3NzU3IGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3NTcgQ1BVLgpAQCAtNDY1LDcgKzQ1MCw2IEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzYzCiAJYm9vbCAiU3VwcG9ydCBTSDc3NjMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0QQotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQogCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAloZWxwCiAJICBTZWxlY3QgU0g3NzYzIGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3NjMoUjVTNzc2MzEpIENQVS4KQEAgLTQ5NCw5ICs0NzgsNyBAQAogCXNlbGVjdCBDUFVfSEFTX1BURUFFWAogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCBpZiBTTVAKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKLQlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECi0Jc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFVTQl9FSENJX1NIIGlmIFVTQl9FSENJX0hDRAogCXNlbGVjdCBQSU5DVFJMCiAKQEAgLTUxNCw3ICs0OTYsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g3MzQzIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINEFMX0RTUAogCXNlbGVjdCBBUkNIX1NITU9CSUxFCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzIyCiAJYm9vbCAiU3VwcG9ydCBTSDc3MjIgcHJvY2Vzc29yIgpAQCAtNTIzLDcgKzUwNSw3IEBACiAJc2VsZWN0IEFSQ0hfU0hNT0JJTEUKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJc2VsZWN0IFNZU19TVVBQT1JUU19OVU1BCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NIX0NNVAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAKQEAgLTUzNCw3ICs1MTYsNyBAQAogCXNlbGVjdCBBUkNIX1NITU9CSUxFCiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTlVNQQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKIAogZW5kY2hvaWNlCiAKQEAgLTU2NywyNyArNTQ5LDYgQEAKIAogbWVudSAiVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24iCiAKLWNvbmZpZyBTSF9USU1FUl9UTVUKLQlib29sICJUTVUgdGltZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX1RNVQotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyB0aGUgYnVpbGQgb2YgdGhlIFRNVSB0aW1lciBkcml2ZXIuCi0KLWNvbmZpZyBTSF9USU1FUl9DTVQKLQlib29sICJDTVQgdGltZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX0NNVAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiB0aGUgQ01UIHRpbWVyIGRyaXZlci4KLQotY29uZmlnIFNIX1RJTUVSX01UVTIKLQlib29sICJNVFUyIHRpbWVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19NVFUyCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIHRoZSBNVFUyIHRpbWVyIGRyaXZlci4KLQogY29uZmlnIFNIX1BDTEtfRlJFUQogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKIAlkZXBlbmRzIG9uIFNIX0NMS19DUEdfTEVHQUNZCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKaW5kZXggNWJjM2ExNS4uODVkNTI1NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYwpAQCAtODYxLDE0ICs4NjEsMTIgQEAKIAkuY2FyZAkJPSAiRlNJQi1EQTcyMTAiLAogCS5jb2RlYwkJPSAiZGE3MjEwLjAtMDAxYSIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaS4wIiwKLQkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0kyUywKKwkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLmNwdV9kYWkgPSB7CiAJCS5uYW1lCT0gImZzaWItZGFpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMgfCBTTkRfU09DX0RBSUZNVF9JQl9ORiwKIAl9LAogCS5jb2RlY19kYWkgPSB7CiAJCS5uYW1lCT0gImRhNzIxMC1oaWZpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKaW5kZXggMjFlNDIzMC4uMTE2MmJjNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKQEAgLTMwNCwxNCArMzA0LDEyIEBACiAJLmNhcmQJCT0gIkZTSUEtQUs0NjQyIiwKIAkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTIiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kuMCIsCi0JLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0osCisJLmRhaWZtdAkJPSBTTkRfU09DX0RBSUZNVF9MRUZUX0ogfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5jcHVfZGFpID0gewogCQkubmFtZQk9ICJmc2lhLWRhaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZQk9ICJhazQ2NDItaGlmaSIsCi0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkuc3lzY2xrCT0gMTEyODk2MDAsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCA2MGVkM2UxLi4xYmMwOWVlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTE4NiwxMSArMTg2LDYgQEAKIAlyZXR1cm4gc3RhcnQ7CiB9CiAKLWludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCi17Ci0JcmV0dXJuIHBjaV9lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzayk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdAogcGNpYmlvc19idXNfcmVwb3J0X3N0YXR1c19lYXJseShzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UsCiAJCQkJaW50IHRvcF9idXMsIGludCBjdXJyZW50X2J1cywKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMGNkNzE5OC4uYzE5ZTQ3ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTgsMTggKzgsMjEgQEAKIGdlbmVyaWMteSArPSBlcnJuby5oCiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gZmNudGwuaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpcGNidWYuaAogZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKIGdlbmVyaWMteSArPSBrdm1fcGFyYS5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAogZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCitnZW5lcmljLXkgKz0gbW1hbi5oCitnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBwYXJhbS5oCiBnZW5lcmljLXkgKz0gcGFycG9ydC5oCiBnZW5lcmljLXkgKz0gcGVyY3B1LmgKIGdlbmVyaWMteSArPSBwb2xsLmgKLWdlbmVyaWMteSArPSBtbWFuLmgKLWdlbmVyaWMteSArPSBtc2didWYuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCiBnZW5lcmljLXkgKz0gc2VtYnVmLmgKQEAgLTM0LDUgKzM3LDMgQEAKIGdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCiBnZW5lcmljLXkgKz0gdWNvbnRleHQuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pZGxlLmMgYi9hcmNoL3NoL2tlcm5lbC9pZGxlLmMKaW5kZXggMmVhNDQ4My4uYmU2MTZlZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaWRsZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lkbGUuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CkBAIC00MCw4ICszOSw3IEBACiAKIHZvaWQgYXJjaF9jcHVfaWRsZSh2b2lkKQogewotCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKQotCQlzaF9pZGxlKCk7CisJc2hfaWRsZSgpOwogfQogCiB2b2lkIF9faW5pdCBzZWxlY3RfaWRsZV9yb3V0aW5lKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pcnEuYyBiL2FyY2gvc2gva2VybmVsL2lycS5jCmluZGV4IDA4MzM3MzYuLjY1YTFlY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lycS5jCkBAIC0yMTcsMTkgKzIxNyw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyB2b2lkIHJvdXRlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBjcHUpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZGF0YSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJJUlEldTogbW92aW5nIGZyb20gY3B1JXUgdG8gY3B1JXVcbiIsCi0JICAgICAgIGlycSwgZGF0YS0+bm9kZSwgY3B1KTsKLQotCXJhd19zcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKLQljaGlwLT5pcnFfc2V0X2FmZmluaXR5KGRhdGEsIGNwdW1hc2tfb2YoY3B1KSwgZmFsc2UpOwotCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOwotfQotCiAvKgogICogVGhlIENQVSBoYXMgYmVlbiBtYXJrZWQgb2ZmbGluZS4gIE1pZ3JhdGUgSVJRcyBvZmYgdGhpcyBDUFUuICBJZgogICogdGhlIGFmZmluaXR5IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBvdGhlciBDUFVzLCBmb3JjZSB0aGVtIG9udG8gYW55CkBAIC0yNTAsMTEgKzIzNyw4IEBACiAJCQkJCQkgICAgaXJxLCBjcHUpOwogCiAJCQkJY3B1bWFza19zZXRhbGwoZGF0YS0+YWZmaW5pdHkpOwotCQkJCW5ld2NwdSA9IGNwdW1hc2tfYW55X2FuZChkYXRhLT5hZmZpbml0eSwKLQkJCQkJCQkgY3B1X29ubGluZV9tYXNrKTsKIAkJCX0KLQotCQkJcm91dGVfaXJxKGRhdGEsIGlycSwgbmV3Y3B1KTsKKwkJCWlycV9zZXRfYWZmaW5pdHkoaXJxLCBkYXRhLT5hZmZpbml0eSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDRiNjBhMGMuLmE0NTgyMTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC02LDE1ICs2LDE2IEBACiBnZW5lcmljLXkgKz0gZGl2NjQuaAogZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKIGdlbmVyaWMteSArPSBleGVjLmgKLWdlbmVyaWMteSArPSBsaW5rYWdlLmgKLWdlbmVyaWMteSArPSBsb2NhbDY0LmgKLWdlbmVyaWMteSArPSBtdXRleC5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAorZ2VuZXJpYy15ICs9IGxpbmthZ2UuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1vZHVsZS5oCitnZW5lcmljLXkgKz0gbXV0ZXguaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHNlcmlhbC5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHR5cGVzLmgKIGdlbmVyaWMteSArPSB3b3JkLWF0LWEtdGltZS5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaAppbmRleCBkZDNiZWY0Li4wNTcxMDM5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmgKQEAgLTMyLDcgKzMyLDYgQEAKIAogREVDTEFSRV9QRVJfQ1BVKGNwdW1hc2tfdCwgY3B1X3NpYmxpbmdfbWFwKTsKIGV4dGVybiBjcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdOwotZXh0ZXJuIGludCBzcGFyYzY0X211bHRpX2NvcmU7CiAKIGV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSk7CiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RvcG9sb2d5XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RvcG9sb2d5XzY0LmgKaW5kZXggMTc1NDM5MC4uYTJkMTBmYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90b3BvbG9neV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdG9wb2xvZ3lfNjQuaApAQCAtNDIsOCArNDIsNiBAQAogI2RlZmluZSB0b3BvbG9neV9jb3JlX2lkKGNwdSkJCQkoY3B1X2RhdGEoY3B1KS5jb3JlX2lkKQogI2RlZmluZSB0b3BvbG9neV9jb3JlX2NwdW1hc2soY3B1KQkJKCZjcHVfY29yZV9tYXBbY3B1XSkKICNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soY3B1KQkJKCZwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSkKLSNkZWZpbmUgbWNfY2FwYWJsZSgpCQkJCShzcGFyYzY0X211bHRpX2NvcmUpCi0jZGVmaW5lIHNtdF9jYXBhYmxlKCkJCQkJKHNwYXJjNjRfbXVsdGlfY29yZSkKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIGV4dGVybiBjcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMKaW5kZXggODhhYWFhNS4uZTE2YzQxNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jCkBAIC05OSwxMSArOTksNiBAQAogCXJldHVybiByZXMtPnN0YXJ0OwogfQogCi1pbnQgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQotewotCXJldHVybiBwY2lfZW5hYmxlX3Jlc291cmNlcyhkZXYsIG1hc2spOwotfQotCiAvKiBpbi9vdXQgcm91dGluZXMgdGFrZW4gZnJvbSBwY2ljLmMKICAqCiAgKiBUaGlzIHByb2JhYmx5IGJlbG9uZ3MgaGVyZSByYXRoZXIgdGhhbiBpb3BvcnQuYyBiZWNhdXNlCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYwppbmRleCBiOTBiZjIzLi5hMWE0NDAwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKQEAgLTg5NiwxMCArODk2LDYgQEAKIAogCW1kZXNjX2l0ZXJhdGVfb3Zlcl9jcHVzKGZpbGxfaW5fb25lX2NwdSwgTlVMTCwgbWFzayk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0Jc3BhcmM2NF9tdWx0aV9jb3JlID0gMTsKLSNlbmRpZgotCiAJaHAgPSBtZGVzY19ncmFiKCk7CiAKIAlzZXRfY29yZV9pZHMoaHApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IDMyYTI4MGUuLmQ3YjQ5NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTU4LDkgKzU4LDEyIEBACiB7CiAJaWYgKHRsYl90eXBlICE9IGh5cGVydmlzb3IpIHsKIAkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIHBzdGF0ZTsKIAorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKICAgICAgICAgICAgICAgICAvKiBUaGUgc3VuNHYgc2xlZXBpbmcgY29kZSByZXF1aXJlcyB0aGF0IHdlIGhhdmUgUFNUQVRFLklFIGNsZWFyZWQgb3ZlcgogICAgICAgICAgICAgICAgICAqIHRoZSBjcHUgc2xlZXAgaHlwZXJ2aXNvciBjYWxsLgogICAgICAgICAgICAgICAgICAqLwpAQCAtODIsNyArODUsNiBAQAogCQkJOiAiPSZyIiAocHN0YXRlKQogCQkJOiAiaSIgKFBTVEFURV9JRSkpOwogCX0KLQlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYwppbmRleCA2YjM5MTI1Li45YTY5MGQzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jCkBAIC01NTUsOSArNTU1LDYgQEAKIAogCQljcHVfZGF0YShjcHVpZCkuY29yZV9pZCA9IHBvcnRpZCArIDE7CiAJCWNwdV9kYXRhKGNwdWlkKS5wcm9jX2lkID0gcG9ydGlkOwotI2lmZGVmIENPTkZJR19TTVAKLQkJc3BhcmM2NF9tdWx0aV9jb3JlID0gMTsKLSNlbmRpZgogCX0gZWxzZSB7CiAJCWNwdV9kYXRhKGNwdWlkKS5kY2FjaGVfc2l6ZSA9CiAJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJkY2FjaGUtc2l6ZSIsIDE2ICogMTAyNCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCmluZGV4IGIwODUzMTEuLjk3ODEwNDggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCkBAIC01Myw4ICs1Myw2IEBACiAKICNpbmNsdWRlICJjcHVtYXAuaCIKIAotaW50IHNwYXJjNjRfbXVsdGlfY29yZSBfX3JlYWRfbW9zdGx5OwotCiBERUZJTkVfUEVSX0NQVShjcHVtYXNrX3QsIGNwdV9zaWJsaW5nX21hcCkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c2NhbGxzLlMKaW5kZXggODc3MjlmZi4uMzNhMTdlNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzY2FsbHMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0xODksNyArMTg5LDggQEAKIAkgbW92CSVpMCwgJWw1CQkJCSEgSUVVMQogNToJY2FsbAklbDcJCQkJCSEgQ1RJCUdyb3VwIGJyayBmb3JjZWQKIAkgc3JsCSVpNSwgMCwgJW81CQkJCSEgSUVVMQotCWJhLGEscHQJJXhjYywgM2YKKwliYSxwdAkleGNjLCAzZgorCSBzcmEJJW8wLCAwLCAlbzAKIAogCS8qIExpbnV4IG5hdGl2ZSBzeXN0ZW0gY2FsbHMgZW50ZXIgaGVyZS4uLiAqLwogCS5hbGlnbgkzMgpAQCAtMjE3LDcgKzIxOCw2IEBACiAzOglzdHgJJW8wLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X0kwXQogcmV0X3N5c19jYWxsOgogCWxkeAlbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1RTVEFURV0sICVnMwotCXNyYQklbzAsIDAsICVvMAogCW1vdgkldWxvKFRTVEFURV9YQ0FSUlkgfCBUU1RBVEVfSUNBUlJZKSwgJWcyCiAJc2xseAklZzIsIDMyLCAlZzIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCmluZGV4IGIzOTdlMDUuLjNmZGRmNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKQEAgLTczMiw3ICs3MzIsNyBAQAogCWlycV9lbnRlcigpOwogCiAJbG9jYWxfY3B1X2RhdGEoKS5pcnEwX2lycXMrKzsKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoMCwgaXJxX3RvX2Rlc2MoMCkpOworCWtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KDApOwogCiAJaWYgKHVubGlrZWx5KCFldnQtPmV2ZW50X2hhbmRsZXIpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vdHNiLmMgYi9hcmNoL3NwYXJjL21tL3RzYi5jCmluZGV4IDNiM2EzNjAuLmY1ZDUwNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vdHNiLmMKKysrIGIvYXJjaC9zcGFyYy9tbS90c2IuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJCXByb21faGFsdCgpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0c2JfY2FjaGVfbmFtZXMpOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBzaXplID0gODE5MiA8PCBpOwogCQljb25zdCBjaGFyICpuYW1lID0gdHNiX2NhY2hlX25hbWVzW2ldOwogCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAzNzkzYzc1Li4wYWE1Njc1IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTExLDYgKzExLDcgQEAKIGdlbmVyaWMteSArPSBleGVjLmgKIGdlbmVyaWMteSArPSBmYi5oCiBnZW5lcmljLXkgKz0gZmNudGwuaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGh3X2lycS5oCiBnZW5lcmljLXkgKz0gaW9jdGwuaAogZ2VuZXJpYy15ICs9IGlvY3Rscy5oCkBAIC0xOCwxMiArMTksMTQgQEAKIGdlbmVyaWMteSArPSBpcnFfcmVncy5oCiBnZW5lcmljLXkgKz0gbG9jYWwuaAogZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBtdXRleC5oCiBnZW5lcmljLXkgKz0gcGFyYW0uaAogZ2VuZXJpYy15ICs9IHBhcnBvcnQuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHBvc2l4X3R5cGVzLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCkBAIC0zOCw1ICs0MSwzIEBACiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHR5cGVzLmgKIGdlbmVyaWMteSArPSB4b3IuaAotZ2VuZXJpYy15ICs9IHByZWVtcHQuaAotZ2VuZXJpYy15ICs9IGhhc2guaApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9wY2lfZ3guYyBiL2FyY2gvdGlsZS9rZXJuZWwvcGNpX2d4LmMKaW5kZXggYTk3YTY0NS4uMDc3YjdiYyAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9wY2lfZ3guYworKysgYi9hcmNoL3RpbGUva2VybmVsL3BjaV9neC5jCkBAIC0xMDY1LDE4ICsxMDY1LDYgQEAKIH0KIAogLyoKLSAqIEVuYWJsZSBtZW1vcnkgYWRkcmVzcyBkZWNvZGluZywgYXMgYXBwcm9wcmlhdGUsIGZvciB0aGUKLSAqIGRldmljZSBkZXNjcmliZWQgYnkgdGhlICdkZXYnIHN0cnVjdC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBnZW5lcmljIFBDSSBsYXllciwgYW5kIGNhbiBiZSBjYWxsZWQKLSAqIGZvciBicmlkZ2VzIG9yIGVuZHBvaW50cy4KLSAqLwotaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKLX0KLQotLyoKICAqIENhbGxlZCBmb3IgZWFjaCBkZXZpY2UgYWZ0ZXIgUENJIHNldHVwIGlzIGRvbmUuCiAgKiBXZSBpbml0aWFsaXplIHRoZSBQQ0kgZGV2aWNlIGNhcGFiaWxpdGllcyBjb25zZXJ2YXRpdmVseSwgYXNzdW1pbmcgdGhhdAogICogYWxsIGRldmljZXMgY2FuIG9ubHkgYWRkcmVzcyB0aGUgMzItYml0IERNQSBzcGFjZS4gVGhlIGV4Y2VwdGlvbiBoZXJlIGlzCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDg4YTMzMGQuLmE1ZTRiNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDggKzEsMjggQEAKLWdlbmVyaWMteSArPSBidWcuaCBjcHV0aW1lLmggZGV2aWNlLmggZW1lcmdlbmN5LXJlc3RhcnQuaCBmdXRleC5oIGhhcmRpcnEuaAotZ2VuZXJpYy15ICs9IGh3X2lycS5oIGlycV9yZWdzLmgga2RlYnVnLmggcGVyY3B1Lmggc2VjdGlvbnMuaCB0b3BvbG9neS5oIHhvci5oCi1nZW5lcmljLXkgKz0gZnRyYWNlLmggcGNpLmggaW8uaCBwYXJhbS5oIGRlbGF5LmggbXV0ZXguaCBjdXJyZW50LmggZXhlYy5oCi1nZW5lcmljLXkgKz0gc3dpdGNoX3RvLmggY2xrZGV2LmgKLWdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gYmFycmllci5oCitnZW5lcmljLXkgKz0gYnVnLmgKK2dlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IGN1cnJlbnQuaAorZ2VuZXJpYy15ICs9IGRlbGF5LmgKK2dlbmVyaWMteSArPSBkZXZpY2UuaAorZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKK2dlbmVyaWMteSArPSBleGVjLmgKK2dlbmVyaWMteSArPSBmdHJhY2UuaAorZ2VuZXJpYy15ICs9IGZ1dGV4LmgKK2dlbmVyaWMteSArPSBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBoYXNoLmgKK2dlbmVyaWMteSArPSBod19pcnEuaAorZ2VuZXJpYy15ICs9IGlvLmgKK2dlbmVyaWMteSArPSBpcnFfcmVncy5oCitnZW5lcmljLXkgKz0ga2RlYnVnLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAorZ2VuZXJpYy15ICs9IG11dGV4LmgKK2dlbmVyaWMteSArPSBwYXJhbS5oCitnZW5lcmljLXkgKz0gcGNpLmgKK2dlbmVyaWMteSArPSBwZXJjcHUuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAorZ2VuZXJpYy15ICs9IHNlY3Rpb25zLmgKK2dlbmVyaWMteSArPSBzd2l0Y2hfdG8uaAorZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKK2dlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCitnZW5lcmljLXkgKz0geG9yLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvdW5pY29yZTMyL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAzZWY0ZjlkLi4xZTVmYjg3IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xNiw2ICsxNiw3IEBACiBnZW5lcmljLXkgKz0gZnRyYWNlLmgKIGdlbmVyaWMteSArPSBmdXRleC5oCiBnZW5lcmljLXkgKz0gaGFyZGlycS5oCitnZW5lcmljLXkgKz0gaGFzaC5oCiBnZW5lcmljLXkgKz0gaHdfaXJxLmgKIGdlbmVyaWMteSArPSBpb2N0bC5oCiBnZW5lcmljLXkgKz0gaW9jdGxzLmgKQEAgLTI0LDYgKzI1LDcgQEAKIGdlbmVyaWMteSArPSBrZGVidWcuaAogZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAogZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBtY3Nfc3BpbmxvY2suaAogZ2VuZXJpYy15ICs9IG1tYW4uaAogZ2VuZXJpYy15ICs9IG1vZHVsZS5oCiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKQEAgLTMyLDYgKzM0LDcgQEAKIGdlbmVyaWMteSArPSBwZXJjcHUuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHBvc2l4X3R5cGVzLmgKK2dlbmVyaWMteSArPSBwcmVlbXB0LmgKIGdlbmVyaWMteSArPSByZXNvdXJjZS5oCiBnZW5lcmljLXkgKz0gc2NhdHRlcmxpc3QuaAogZ2VuZXJpYy15ICs9IHNlY3Rpb25zLmgKQEAgLTYwLDUgKzYzLDMgQEAKIGdlbmVyaWMteSArPSB1c2VyLmgKIGdlbmVyaWMteSArPSB2Z2EuaAogZ2VuZXJpYy15ICs9IHhvci5oCi1nZW5lcmljLXkgKz0gcHJlZW1wdC5oCi1nZW5lcmljLXkgKz0gaGFzaC5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCAwYWY1MjUwLi5mNzMwNzE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTEwNyw5ICsxMDcsOSBAQAogCXNlbGVjdCBIQVZFX0FSQ0hfU09GVF9ESVJUWQogCXNlbGVjdCBDTE9DS1NPVVJDRV9XQVRDSERPRwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCi0Jc2VsZWN0IEFSQ0hfQ0xPQ0tTT1VSQ0VfREFUQSBpZiBYODZfNjQKKwlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUIGlmIFg4Nl82NCB8fCAoWDg2XzMyICYmIFg4Nl9MT0NBTF9BUElDKQotCXNlbGVjdCBHRU5FUklDX1RJTUVfVlNZU0NBTEwgaWYgWDg2XzY0CisJc2VsZWN0IEdFTkVSSUNfVElNRV9WU1lTQ0FMTAogCXNlbGVjdCBLVElNRV9TQ0FMQVIgaWYgWDg2XzMyCiAJc2VsZWN0IEdFTkVSSUNfU1RSTkNQWV9GUk9NX1VTRVIKIAlzZWxlY3QgR0VORVJJQ19TVFJOTEVOX1VTRVIKQEAgLTEyNyw2ICsxMjcsNyBAQAogCXNlbGVjdCBIQVZFX0RFQlVHX1NUQUNLT1ZFUkZMT1cKIAlzZWxlY3QgSEFWRV9JUlFfRVhJVF9PTl9JUlFfU1RBQ0sgaWYgWDg2XzY0CiAJc2VsZWN0IEhBVkVfQ0NfU1RBQ0tQUk9URUNUT1IKKwlzZWxlY3QgR0VORVJJQ19DUFVfQVVUT1BST0JFCiAKIGNvbmZpZyBJTlNUUlVDVElPTl9ERUNPREVSCiAJZGVmX2Jvb2wgeQpAQCAtMTk1LDkgKzE5Niw2IEBACiBjb25maWcgQVJDSF9IQVNfQ0FDSEVfTElORV9TSVpFCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgQVJDSF9IQVNfQ1BVX0FVVE9QUk9CRQotCWRlZl9ib29sIHkKLQogY29uZmlnIEhBVkVfU0VUVVBfUEVSX0NQVV9BUkVBCiAJZGVmX2Jvb2wgeQogCkBAIC0zNDYsMTIgKzM0NCw5IEBACiAJICBmb3IgdGhlIGZvbGxvd2luZyAobm9uLVBDKSAzMiBiaXQgeDg2IHBsYXRmb3JtczoKIAkJR29sZGZpc2ggKEFuZHJvaWQgZW11bGF0b3IpCiAJCUFNRCBFbGFuCi0JCU5VTUFRIChJQk0vU2VxdWVudCkKIAkJUkRDIFItMzIxeCBTb0MKIAkJU0dJIDMyMC81NDAgKFZpc3VhbCBXb3Jrc3RhdGlvbikKIAkJU1RBMlgxMS1iYXNlZCAoZS5nLiBOb3J0aHZpbGxlKQotCQlTdW1taXQvRVhBIChJQk0geDQ0MCkKLQkJVW5pc3lzIEVTNzAwMCBJQTMyIHNlcmllcwogCQlNb29yZXN0b3duIE1JRCBkZXZpY2VzCiAKIAkgIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzeXN0ZW1zLCBvciBpZiB5b3Ugd2FudCB0byBidWlsZCBhCkBAIC00ODksNDkgKzQ4NCwyMiBAQAogCWRlcGVuZHMgb24gWDg2XzMyICYmIFNNUAogCWRlcGVuZHMgb24gWDg2X0VYVEVOREVEX1BMQVRGT1JNCiAJLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gY29tcGlsZXMgaW4gdGhlIE5VTUFRLCBTdW1taXQsIGJpZ3NtcCwgRVM3MDAwLAotCSAgU1RBMlgxMSwgZGVmYXVsdCBzdWJhcmNoaXRlY3R1cmVzLiAgSXQgaXMgaW50ZW5kZWQgZm9yIGEgZ2VuZXJpYwotCSAgYmluYXJ5IGtlcm5lbC4gSWYgeW91IHNlbGVjdCB0aGVtIGFsbCwga2VybmVsIHdpbGwgcHJvYmUgaXQKLQkgIG9uZSBieSBvbmUgYW5kIHdpbGwgZmFsbGJhY2sgdG8gZGVmYXVsdC4KKwkgIFRoaXMgb3B0aW9uIGNvbXBpbGVzIGluIHRoZSBiaWdzbXAgYW5kIFNUQTJYMTEgZGVmYXVsdAorCSAgc3ViYXJjaGl0ZWN0dXJlcy4gIEl0IGlzIGludGVuZGVkIGZvciBhIGdlbmVyaWMgYmluYXJ5CisJICBrZXJuZWwuIElmIHlvdSBzZWxlY3QgdGhlbSBhbGwsIGtlcm5lbCB3aWxsIHByb2JlIGl0IG9uZSBieQorCSAgb25lIGFuZCB3aWxsIGZhbGxiYWNrIHRvIGRlZmF1bHQuCiAKICMgQWxwaGFiZXRpY2FsbHkgc29ydGVkIGxpc3Qgb2YgTm9uIHN0YW5kYXJkIDMyIGJpdCBwbGF0Zm9ybXMKIAotY29uZmlnIFg4Nl9OVU1BUQotCWJvb2wgIk5VTUFRIChJQk0vU2VxdWVudCkiCi0JZGVwZW5kcyBvbiBYODZfMzJfTk9OX1NUQU5EQVJECi0JZGVwZW5kcyBvbiBQQ0kKLQlzZWxlY3QgTlVNQQotCXNlbGVjdCBYODZfTVBQQVJTRQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGlzIHVzZWQgZm9yIGdldHRpbmcgTGludXggdG8gcnVuIG9uIGEgTlVNQVEgKElCTS9TZXF1ZW50KQotCSAgTlVNQSBtdWx0aXF1YWQgYm94LiBUaGlzIGNoYW5nZXMgdGhlIHdheSB0aGF0IHByb2Nlc3NvcnMgYXJlCi0JICBib290c3RyYXBwZWQsIGFuZCB1c2VzIENsdXN0ZXJlZCBMb2dpY2FsIEFQSUMgYWRkcmVzc2luZyBtb2RlIGluc3RlYWQKLQkgIG9mIEZsYXQgTG9naWNhbC4gIFlvdSB3aWxsIG5lZWQgYSBuZXcgbHlueGVyLmVsZiBmaWxlIHRvIGZsYXNoIHlvdXIKLQkgIGZpcm13YXJlIHdpdGggLSBzZW5kIGVtYWlsIHRvIDxNYXJ0aW4uQmxpZ2hAdXMuaWJtLmNvbT4uCi0KIGNvbmZpZyBYODZfU1VQUE9SVFNfTUVNT1JZX0ZBSUxVUkUKIAlkZWZfYm9vbCB5CiAJIyBNQ0UgY29kZSBjYWxscyBtZW1vcnlfZmFpbHVyZSgpOgogCWRlcGVuZHMgb24gWDg2X01DRQogCSMgT24gMzItYml0IHRoaXMgYWRkcyB0b28gYmlnIG9mIE5PREVTX1NISUZUIGFuZCB3ZSBydW4gb3V0IG9mIHBhZ2UgZmxhZ3M6Ci0JZGVwZW5kcyBvbiAhWDg2X05VTUFRCiAJIyBPbiAzMi1iaXQgU1BBUlNFTUVNIGFkZHMgdG9vIGJpZyBvZiBTRUNUSU9OU19XSURUSDoKIAlkZXBlbmRzIG9uIFg4Nl82NCB8fCAhU1BBUlNFTUVNCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTUVNT1JZX0ZBSUxVUkUKIAotY29uZmlnIFg4Nl9WSVNXUwotCWJvb2wgIlNHSSAzMjAvNTQwIChWaXN1YWwgV29ya3N0YXRpb24pIgotCWRlcGVuZHMgb24gWDg2XzMyICYmIFBDSSAmJiBYODZfTVBQQVJTRSAmJiBQQ0lfR09ESVJFQ1QKLQlkZXBlbmRzIG9uIFg4Nl8zMl9OT05fU1RBTkRBUkQKLQktLS1oZWxwLS0tCi0JICBUaGUgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBzZXJpZXMgaXMgYW4gSUEzMi1iYXNlZCB3b3Jrc3RhdGlvbgotCSAgYmFzZWQgb24gU0dJIHN5c3RlbXMgY2hpcHMgd2l0aCBzb21lIGxlZ2FjeSBQQyBoYXJkd2FyZSBhdHRhY2hlZC4KLQotCSAgU2F5IFkgaGVyZSB0byBjcmVhdGUgYSBrZXJuZWwgdG8gcnVuIG9uIHRoZSBTR0kgMzIwIG9yIDU0MC4KLQotCSAgQSBrZXJuZWwgY29tcGlsZWQgZm9yIHRoZSBWaXN1YWwgV29ya3N0YXRpb24gd2lsbCBydW4gb24gZ2VuZXJhbAotCSAgUENzIGFzIHdlbGwuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQ+IGZvciBkZXRhaWxzLgotCiBjb25maWcgU1RBMlgxMQogCWJvb2wgIlNUQTJYMTEgQ29tcGFuaW9uIENoaXAgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFg4Nl8zMl9OT05fU1RBTkRBUkQgJiYgUENJCkBAIC01NDgsMjAgKzUxNiw2IEBACiAJICBvcHRpb24gaXMgc2VsZWN0ZWQgdGhlIGtlcm5lbCB3aWxsIHN0aWxsIGJlIGFibGUgdG8gYm9vdCBvbgogCSAgc3RhbmRhcmQgUEMgbWFjaGluZXMuCiAKLWNvbmZpZyBYODZfU1VNTUlUCi0JYm9vbCAiU3VtbWl0L0VYQSAoSUJNIHg0NDApIgotCWRlcGVuZHMgb24gWDg2XzMyX05PTl9TVEFOREFSRAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGlzIG5lZWRlZCBmb3IgSUJNIHN5c3RlbXMgdGhhdCB1c2UgdGhlIFN1bW1pdC9FWEEgY2hpcHNldC4KLQkgIEluIHBhcnRpY3VsYXIsIGl0IGlzIG5lZWRlZCBmb3IgdGhlIHg0NDAuCi0KLWNvbmZpZyBYODZfRVM3MDAwCi0JYm9vbCAiVW5pc3lzIEVTNzAwMCBJQTMyIHNlcmllcyIKLQlkZXBlbmRzIG9uIFg4Nl8zMl9OT05fU1RBTkRBUkQgJiYgWDg2X0JJR1NNUAotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgZm9yIFVuaXN5cyBFUzcwMDAgc3lzdGVtcy4gIFNheSAnWScgaGVyZSBpZiB0aGlzIGtlcm5lbCBpcwotCSAgc3VwcG9zZWQgdG8gcnVuIG9uIGFuIElBMzItYmFzZWQgVW5pc3lzIEVTNzAwMCBzeXN0ZW0uCi0KIGNvbmZpZyBYODZfMzJfSVJJUwogCXRyaXN0YXRlICJFdXJvYnJhaWxsZS9JcmlzIHBvd2Vyb2ZmIG1vZHVsZSIKIAlkZXBlbmRzIG9uIFg4Nl8zMgpAQCAtNjg0LDE0ICs2MzgsNiBAQAogCSAgICAgICAgbWVtdGVzdD00LCBtZWFuIGRvIDQgdGVzdCBwYXR0ZXJucy4KIAkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCiAKLWNvbmZpZyBYODZfU1VNTUlUX05VTUEKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBYODZfMzIgJiYgTlVNQSAmJiBYODZfMzJfTk9OX1NUQU5EQVJECi0KLWNvbmZpZyBYODZfQ1lDTE9ORV9USU1FUgotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFg4Nl9TVU1NSVQKLQogc291cmNlICJhcmNoL3g4Ni9LY29uZmlnLmNwdSIKIAogY29uZmlnIEhQRVRfVElNRVIKQEAgLTgyMCw3ICs3NjYsNyBAQAogCXJhbmdlIDIgODE5MiBpZiBTTVAgJiYgIU1BWFNNUCAmJiBDUFVNQVNLX09GRlNUQUNLICYmIFg4Nl82NAogCWRlZmF1bHQgIjEiIGlmICFTTVAKIAlkZWZhdWx0ICI4MTkyIiBpZiBNQVhTTVAKLQlkZWZhdWx0ICIzMiIgaWYgU01QICYmIChYODZfTlVNQVEgfHwgWDg2X1NVTU1JVCB8fCBYODZfQklHU01QIHx8IFg4Nl9FUzcwMDApCisJZGVmYXVsdCAiMzIiIGlmIFNNUCAmJiBYODZfQklHU01QCiAJZGVmYXVsdCAiOCIgaWYgU01QCiAJLS0taGVscC0tLQogCSAgVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIENQVXMgd2hpY2ggdGhpcwpAQCAtODg0LDEwICs4MzAsNiBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl82NCB8fCBTTVAgfHwgWDg2XzMyX05PTl9TVEFOREFSRCB8fCBYODZfVVBfSU9BUElDIHx8IFBDSV9NU0kKIAotY29uZmlnIFg4Nl9WSVNXU19BUElDCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gWDg2XzMyICYmIFg4Nl9WSVNXUwotCiBjb25maWcgWDg2X1JFUk9VVEVfRk9SX0JST0tFTl9CT09UX0lSUVMKIAlib29sICJSZXJvdXRlIGZvciBicm9rZW4gYm9vdCBJUlFzIgogCWRlcGVuZHMgb24gWDg2X0lPX0FQSUMKQEAgLTExMDUsMTMgKzEwNDcsMTEgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJIaWdoIE1lbW9yeSBTdXBwb3J0IgotCWRlZmF1bHQgSElHSE1FTTY0RyBpZiBYODZfTlVNQVEKIAlkZWZhdWx0IEhJR0hNRU00RwogCWRlcGVuZHMgb24gWDg2XzMyCiAKIGNvbmZpZyBOT0hJR0hNRU0KIAlib29sICJvZmYiCi0JZGVwZW5kcyBvbiAhWDg2X05VTUFRCiAJLS0taGVscC0tLQogCSAgTGludXggY2FuIHVzZSB1cCB0byA2NCBHaWdhYnl0ZXMgb2YgcGh5c2ljYWwgbWVtb3J5IG9uIHg4NiBzeXN0ZW1zLgogCSAgSG93ZXZlciwgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgMzItYml0IHg4NiBwcm9jZXNzb3JzIGlzIG9ubHkgNApAQCAtMTE0OCw3ICsxMDg4LDYgQEAKIAogY29uZmlnIEhJR0hNRU00RwogCWJvb2wgIjRHQiIKLQlkZXBlbmRzIG9uICFYODZfTlVNQVEKIAktLS1oZWxwLS0tCiAJICBTZWxlY3QgdGhpcyBpZiB5b3UgaGF2ZSBhIDMyLWJpdCBwcm9jZXNzb3IgYW5kIGJldHdlZW4gMSBhbmQgNAogCSAgZ2lnYWJ5dGVzIG9mIHBoeXNpY2FsIFJBTS4KQEAgLTEyNDAsOCArMTE3OSw4IEBACiBjb25maWcgTlVNQQogCWJvb2wgIk51bWEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0IgogCWRlcGVuZHMgb24gU01QCi0JZGVwZW5kcyBvbiBYODZfNjQgfHwgKFg4Nl8zMiAmJiBISUdITUVNNjRHICYmIChYODZfTlVNQVEgfHwgWDg2X0JJR1NNUCB8fCBYODZfU1VNTUlUICYmIEFDUEkpKQotCWRlZmF1bHQgeSBpZiAoWDg2X05VTUFRIHx8IFg4Nl9TVU1NSVQgfHwgWDg2X0JJR1NNUCkKKwlkZXBlbmRzIG9uIFg4Nl82NCB8fCAoWDg2XzMyICYmIEhJR0hNRU02NEcgJiYgWDg2X0JJR1NNUCkKKwlkZWZhdWx0IHkgaWYgWDg2X0JJR1NNUAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBOVU1BIChOb24gVW5pZm9ybSBNZW1vcnkgQWNjZXNzKSBzdXBwb3J0LgogCkBAIC0xMjUyLDE1ICsxMTkxLDExIEBACiAJICBGb3IgNjQtYml0IHRoaXMgaXMgcmVjb21tZW5kZWQgaWYgdGhlIHN5c3RlbSBpcyBJbnRlbCBDb3JlIGk3CiAJICAob3IgbGF0ZXIpLCBBTUQgT3B0ZXJvbiwgb3IgRU02NFQgTlVNQS4KIAotCSAgRm9yIDMyLWJpdCB0aGlzIGlzIG9ubHkgbmVlZGVkIG9uIChyYXJlKSAzMi1iaXQtb25seSBwbGF0Zm9ybXMKLQkgIHRoYXQgc3VwcG9ydCBOVU1BIHRvcG9sb2dpZXMsIHN1Y2ggYXMgTlVNQVEgLyBTdW1taXQsIG9yIGlmIHlvdQotCSAgYm9vdCBhIDMyLWJpdCBrZXJuZWwgb24gYSA2NC1iaXQgTlVNQSBwbGF0Zm9ybS4KKwkgIEZvciAzMi1iaXQgdGhpcyBpcyBvbmx5IG5lZWRlZCBpZiB5b3UgYm9vdCBhIDMyLWJpdAorCSAga2VybmVsIG9uIGEgNjQtYml0IE5VTUEgcGxhdGZvcm0uCiAKIAkgIE90aGVyd2lzZSwgeW91IHNob3VsZCBzYXkgTi4KIAotY29tbWVudCAiTlVNQSAoU3VtbWl0KSByZXF1aXJlcyBTTVAsIDY0R0IgaGlnaG1lbSBzdXBwb3J0LCBBQ1BJIgotCWRlcGVuZHMgb24gWDg2XzMyICYmIFg4Nl9TVU1NSVQgJiYgKCFISUdITUVNNjRHIHx8ICFBQ1BJKQotCiBjb25maWcgQU1EX05VTUEKIAlkZWZfYm9vbCB5CiAJcHJvbXB0ICJPbGQgc3R5bGUgQU1EIE9wdGVyb24gTlVNQSBkZXRlY3Rpb24iCkBAIC0xMzAyLDcgKzEyMzcsNiBAQAogCXJhbmdlIDEgMTAKIAlkZWZhdWx0ICIxMCIgaWYgTUFYU01QCiAJZGVmYXVsdCAiNiIgaWYgWDg2XzY0Ci0JZGVmYXVsdCAiNCIgaWYgWDg2X05VTUFRCiAJZGVmYXVsdCAiMyIKIAlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKIAktLS1oZWxwLS0tCkBAIC0xNTg1LDYgKzE1MTksMjAgQEAKIAogCSAgU2VlIERvY3VtZW50YXRpb24vZWZpLXN0dWIudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCitjb25maWcgRUZJX01JWEVECisJYm9vbCAiRUZJIG1peGVkLW1vZGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEVGSV9TVFVCICYmIFg4Nl82NAorCS0tLWhlbHAtLS0KKwkgICBFbmFibGluZyB0aGlzIGZlYXR1cmUgYWxsb3dzIGEgNjQtYml0IGtlcm5lbCB0byBiZSBib290ZWQKKwkgICBvbiBhIDMyLWJpdCBmaXJtd2FyZSwgcHJvdmlkZWQgdGhhdCB5b3VyIENQVSBzdXBwb3J0cyA2NC1iaXQKKwkgICBtb2RlLgorCisJICAgTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBib290IGEgbWl4ZWQtbW9kZSBlbmFibGVkCisJICAga2VybmVsIHZpYSB0aGUgRUZJIGJvb3Qgc3R1YiAtIGEgYm9vdGxvYWRlciB0aGF0IHN1cHBvcnRzCisJICAgdGhlIEVGSSBoYW5kb3ZlciBwcm90b2NvbCBtdXN0IGJlIHVzZWQuCisKKwkgICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgU0VDQ09NUAogCWRlZl9ib29sIHkKIAlwcm9tcHQgIkVuYWJsZSBzZWNjb21wIHRvIHNhZmVseSBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSIKQEAgLTE4MzYsMTcgKzE3ODQsMjkgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBDT01QQVRfVkRTTwotCWRlZl9ib29sIHkKLQlwcm9tcHQgIkNvbXBhdCBWRFNPIHN1cHBvcnQiCisJZGVmX2Jvb2wgbgorCXByb21wdCAiRGlzYWJsZSB0aGUgMzItYml0IHZEU08gKG5lZWRlZCBmb3IgZ2xpYmMgMi4zLjMpIgogCWRlcGVuZHMgb24gWDg2XzMyIHx8IElBMzJfRU1VTEFUSU9OCiAJLS0taGVscC0tLQotCSAgTWFwIHRoZSAzMi1iaXQgVkRTTyB0byB0aGUgcHJlZGljdGFibGUgb2xkLXN0eWxlIGFkZHJlc3MgdG9vLgorCSAgQ2VydGFpbiBidWdneSB2ZXJzaW9ucyBvZiBnbGliYyB3aWxsIGNyYXNoIGlmIHRoZXkgYXJlCisJICBwcmVzZW50ZWQgd2l0aCBhIDMyLWJpdCB2RFNPIHRoYXQgaXMgbm90IG1hcHBlZCBhdCB0aGUgYWRkcmVzcworCSAgaW5kaWNhdGVkIGluIGl0cyBzZWdtZW50IHRhYmxlLgogCi0JICBTYXkgTiBoZXJlIGlmIHlvdSBhcmUgcnVubmluZyBhIHN1ZmZpY2llbnRseSByZWNlbnQgZ2xpYmMKLQkgIHZlcnNpb24gKDIuMy4zIG9yIGxhdGVyKSwgdG8gcmVtb3ZlIHRoZSBoaWdoLW1hcHBlZAotCSAgVkRTTyBtYXBwaW5nIGFuZCB0byBleGNsdXNpdmVseSB1c2UgdGhlIHJhbmRvbWl6ZWQgVkRTTy4KKwkgIFRoZSBidWcgd2FzIGludHJvZHVjZWQgYnkgZjg2NjMxNGI4OWQ1Njg0NWY1NWU2ZjM2NWUxOGIzMWVjOTc4ZWMzYQorCSAgYW5kIGZpeGVkIGJ5IDNiM2RkYjRmN2RiOThlYzllOTEyY2NkZjU0ZDM1ZGY0YWEzMGUwNGEgYW5kCisJICA0OWFkNTcyYTcwYjhhZWI5MWU1NzQ4M2ExMWRkMWI3N2UzMWM0NDY4LiAgR2xpYmMgMi4zLjMgaXMKKwkgIHRoZSBvbmx5IHJlbGVhc2VkIHZlcnNpb24gd2l0aCB0aGUgYnVnLCBidXQgT3BlblNVU0UgOQorCSAgY29udGFpbnMgYSBidWdneSAiZ2xpYmMgMi4zLjIiLgogCi0JICBJZiB1bnN1cmUsIHNheSBZLgorCSAgVGhlIHN5bXB0b20gb2YgdGhlIGJ1ZyBpcyB0aGF0IGV2ZXJ5dGhpbmcgY3Jhc2hlcyBvbiBzdGFydHVwLCBzYXlpbmc6CisJICBkbF9tYWluOiBBc3NlcnRpb24gYCh2b2lkICopIHBoLT5wX3ZhZGRyID09IF9ydGxkX2xvY2FsLl9kbF9zeXNpbmZvX2RzbycgZmFpbGVkIQorCisJICBTYXlpbmcgWSBoZXJlIGNoYW5nZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHZkc28zMiBib290CisJICBvcHRpb24gZnJvbSAxIHRvIDAsIHdoaWNoIHR1cm5zIG9mZiB0aGUgMzItYml0IHZEU08gZW50aXJlbHkuCisJICBUaGlzIHdvcmtzIGFyb3VuZCB0aGUgZ2xpYmMgYnVnIGJ1dCBodXJ0cyBwZXJmb3JtYW5jZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTjogaWYgeW91IGFyZSBjb21waWxpbmcgeW91ciBvd24ga2VybmVsLCB5b3UKKwkgIGFyZSB1bmxpa2VseSB0byBiZSB1c2luZyBhIGJ1Z2d5IHZlcnNpb24gb2YgZ2xpYmMuCiAKIGNvbmZpZyBDTURMSU5FX0JPT0wKIAlib29sICJCdWlsdC1pbiBrZXJuZWwgY29tbWFuZCBsaW5lIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZy5jcHUgYi9hcmNoL3g4Ni9LY29uZmlnLmNwdQppbmRleCBmM2FhZjIzLi42OTgzMzE0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnLmNwdQorKysgYi9hcmNoL3g4Ni9LY29uZmlnLmNwdQpAQCAtMzU5LDcgKzM1OSw3IEBACiAKIGNvbmZpZyBYODZfVFNDCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gKChNV0lOQ0hJUDNEIHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNSzggfHwgTVZJQUMzXzIgfHwgTVZJQUM3IHx8IE1HRU9ERUdYMSB8fCBNR0VPREVfTFggfHwgTUNPUkUyIHx8IE1BVE9NKSAmJiAhWDg2X05VTUFRKSB8fCBYODZfNjQKKwlkZXBlbmRzIG9uIChNV0lOQ0hJUDNEIHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNSzggfHwgTVZJQUMzXzIgfHwgTVZJQUM3IHx8IE1HRU9ERUdYMSB8fCBNR0VPREVfTFggfHwgTUNPUkUyIHx8IE1BVE9NKSB8fCBYODZfNjQKIAogY29uZmlnIFg4Nl9DTVBYQ0hHNjQKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZwppbmRleCAzMjFhNTJjLi42MWJkMmFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gveDg2L0tjb25maWcuZGVidWcKQEAgLTgxLDYgKzgxLDE1IEBACiAJICBrZXJuZWwuCiAJICBJZiBpbiBkb3VidCwgc2F5ICJOIgogCitjb25maWcgRUZJX1BHVF9EVU1QCisJYm9vbCAiRHVtcCB0aGUgRUZJIHBhZ2V0YWJsZSIKKwlkZXBlbmRzIG9uIEVGSSAmJiBYODZfUFREVU1QCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHRoaXMgaWYgeW91IHdhbnQgdG8gZHVtcCB0aGUgRUZJIHBhZ2UgdGFibGUgYmVmb3JlCisJICBlbmFibGluZyB2aXJ0dWFsIG1vZGUuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGVidWcgbWlzY2VsbGFuZW91cworCSAgaXNzdWVzIHdpdGggdGhlIG1hcHBpbmcgb2YgdGhlIEVGSSBydW50aW1lIHJlZ2lvbnMgaW50byB0aGF0CisJICB0YWJsZS4KKwogY29uZmlnIERFQlVHX1JPREFUQQogCWJvb2wgIldyaXRlIHByb3RlY3Qga2VybmVsIHJlYWQtb25seSBkYXRhIHN0cnVjdHVyZXMiCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9NYWtlZmlsZSBiL2FyY2gveDg2L01ha2VmaWxlCmluZGV4IGVlZGE0M2EuLjNiOTM0OGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L01ha2VmaWxlCkBAIC04Miw4ICs4Miw4IEBACiAgICAgICAgIEtCVUlMRF9BRkxBR1MgKz0gLW02NAogICAgICAgICBLQlVJTERfQ0ZMQUdTICs9IC1tNjQKIAotICAgICAgICAjIERvbid0IGF1dG9nZW5lcmF0ZSBNTVggb3IgU1NFIGluc3RydWN0aW9ucwotICAgICAgICBLQlVJTERfQ0ZMQUdTICs9IC1tbm8tbW14IC1tbm8tc3NlCisgICAgICAgICMgRG9uJ3QgYXV0b2dlbmVyYXRlIHRyYWRpdGlvbmFsIHg4NywgTU1YIG9yIFNTRSBpbnN0cnVjdGlvbnMKKyAgICAgICAgS0JVSUxEX0NGTEFHUyArPSAtbW5vLW1teCAtbW5vLXNzZSAtbW5vLTgwMzg3IC1tbm8tZnAtcmV0LWluLTM4NwogCiAJIyBVc2UgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MyBpZiBzdXBwb3J0ZWQuCiAJS0JVSUxEX0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTMpCkBAIC0xNTIsNiArMTUyLDcgQEAKIAogIyBkb2VzIGJpbnV0aWxzIHN1cHBvcnQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zPwogYXNpbnN0ciA6PSAkKGNhbGwgYXMtaW5zdHIsZnhzYXZlcSAoJXJheCksLURDT05GSUdfQVNfRlhTQVZFUT0xKQorYXNpbnN0ciArPSAkKGNhbGwgYXMtaW5zdHIsY3JjMzJsICVlYXgkKGNvbW1hKSVlYXgsLURDT05GSUdfQVNfQ1JDMzI9MSkKIGF2eF9pbnN0ciA6PSAkKGNhbGwgYXMtaW5zdHIsdnhvcnBzICV5bW0wJChjb21tYSkleW1tMSQoY29tbWEpJXltbTIsLURDT05GSUdfQVNfQVZYPTEpCiBhdngyX2luc3RyIDo9JChjYWxsIGFzLWluc3RyLHZwYnJvYWRjYXN0YiAleG1tMCQoY29tbWEpJXltbTEsLURDT05GSUdfQVNfQVZYMj0xKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L01ha2VmaWxlIGIvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQppbmRleCA4NzhkZjdlLi5hYmI5ZWJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKQEAgLTgwLDcgKzgwLDcgQEAKICQob2JqKS92b2Zmc2V0Lmg6IHZtbGludXggRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCx2b2Zmc2V0KQogCi1zZWQtem9mZnNldCA6PSAtZSAncy9eXChbMC05YS1mQS1GXSpcKSAuIFwoc3RhcnR1cF8zMlx8c3RhcnR1cF82NFx8ZWZpX3BlX2VudHJ5XHxlZmlfc3R1Yl9lbnRyeVx8aW5wdXRfZGF0YVx8X2VuZFx8el8uKlwpJCQvXCNkZWZpbmUgWk9fXDIgMHhcMS9wJworc2VkLXpvZmZzZXQgOj0gLWUgJ3MvXlwoWzAtOWEtZkEtRl0qXCkgLiBcKHN0YXJ0dXBfMzJcfHN0YXJ0dXBfNjRcfGVmaTMyX3N0dWJfZW50cnlcfGVmaTY0X3N0dWJfZW50cnlcfGVmaV9wZV9lbnRyeVx8aW5wdXRfZGF0YVx8X2VuZFx8el8uKlwpJCQvXCNkZWZpbmUgWk9fXDIgMHhcMS9wJwogCiBxdWlldF9jbWRfem9mZnNldCA9IFpPRkZTRVQgJEAKICAgICAgIGNtZF96b2Zmc2V0ID0gJChOTSkgJDwgfCBzZWQgLW4gJChzZWQtem9mZnNldCkgPiAkQApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9ib290LmggYi9hcmNoL3g4Ni9ib290L2Jvb3QuaAppbmRleCA1MGY4YzVlLi5iZDQ5ZWM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2Jvb3QuaAorKysgYi9hcmNoL3g4Ni9ib290L2Jvb3QuaApAQCAtMTc3LDE0ICsxNzcsNiBAQAogfQogCiAvKiBOb3RlOiB0aGVzZSBvbmx5IHJldHVybiB0cnVlL2ZhbHNlLCBub3QgYSBzaWduZWQgcmV0dXJuIHZhbHVlISAqLwotc3RhdGljIGlubGluZSBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbikKLXsKLQl1OCBkaWZmOwotCWFzbSgicmVwZTsgY21wc2I7IHNldG56ICUwIgotCSAgICA6ICI9cW0iIChkaWZmKSwgIitEIiAoczEpLCAiK1MiIChzMiksICIrYyIgKGxlbikpOwotCXJldHVybiBkaWZmOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBtZW1jbXBfZnMoY29uc3Qgdm9pZCAqczEsIGFkZHJfdCBzMiwgc2l6ZV90IGxlbikKIHsKIAl1OCBkaWZmOwpAQCAtMjI4LDExICsyMjAsNiBAQAogdm9pZCAqY29weV9mcm9tX2ZzKHZvaWQgKmRzdCwgYWRkcl90IHNyYywgc2l6ZV90IGxlbik7CiB2b2lkIGNvcHlfdG9fZ3MoYWRkcl90IGRzdCwgdm9pZCAqc3JjLCBzaXplX3QgbGVuKTsKIHZvaWQgKmNvcHlfZnJvbV9ncyh2b2lkICpkc3QsIGFkZHJfdCBzcmMsIHNpemVfdCBsZW4pOwotdm9pZCAqbWVtY3B5KHZvaWQgKmRzdCwgdm9pZCAqc3JjLCBzaXplX3QgbGVuKTsKLXZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbGVuKTsKLQotI2RlZmluZSBtZW1jcHkoZCxzLGwpIF9fYnVpbHRpbl9tZW1jcHkoZCxzLGwpCi0jZGVmaW5lIG1lbXNldChkLGMsbCkgX19idWlsdGluX21lbXNldChkLGMsbCkKIAogLyogYTIwLmMgKi8KIGludCBlbmFibGVfYTIwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYwppbmRleCBhNzY3N2JhLi4xZTYxNDYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYwpAQCAtMTksMTEgKzE5LDI3MyBAQAogCiBzdGF0aWMgZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGU7CiAKK3N0YXRpYyBzdHJ1Y3QgZWZpX2NvbmZpZyAqZWZpX2Vhcmx5OworCisjZGVmaW5lIGVmaV9jYWxsX2Vhcmx5KGYsIC4uLikJCQkJCQlcCisJZWZpX2Vhcmx5LT5jYWxsKGVmaV9lYXJseS0+ZiwgX19WQV9BUkdTX18pOworCisjZGVmaW5lIEJPT1RfU0VSVklDRVMoYml0cykJCQkJCQlcCitzdGF0aWMgdm9pZCBzZXR1cF9ib290X3NlcnZpY2VzIyNiaXRzKHN0cnVjdCBlZmlfY29uZmlnICpjKQkJXAorewkJCQkJCQkJCVwKKwllZmlfc3lzdGVtX3RhYmxlXyMjYml0cyMjX3QgKnRhYmxlOwkJCQlcCisJZWZpX2Jvb3Rfc2VydmljZXNfIyNiaXRzIyNfdCAqYnQ7CQkJCVwKKwkJCQkJCQkJCVwKKwl0YWJsZSA9ICh0eXBlb2YodGFibGUpKXN5c190YWJsZTsJCQkJXAorCQkJCQkJCQkJXAorCWMtPnRleHRfb3V0cHV0ID0gdGFibGUtPmNvbl9vdXQ7CQkJCVwKKwkJCQkJCQkJCVwKKwlidCA9ICh0eXBlb2YoYnQpKSh1bnNpZ25lZCBsb25nKSh0YWJsZS0+Ym9vdHRpbWUpOwkJXAorCQkJCQkJCQkJXAorCWMtPmFsbG9jYXRlX3Bvb2wgPSBidC0+YWxsb2NhdGVfcG9vbDsJCQkJXAorCWMtPmFsbG9jYXRlX3BhZ2VzID0gYnQtPmFsbG9jYXRlX3BhZ2VzOwkJCQlcCisJYy0+Z2V0X21lbW9yeV9tYXAgPSBidC0+Z2V0X21lbW9yeV9tYXA7CQkJCVwKKwljLT5mcmVlX3Bvb2wgPSBidC0+ZnJlZV9wb29sOwkJCQkJXAorCWMtPmZyZWVfcGFnZXMgPSBidC0+ZnJlZV9wYWdlczsJCQkJCVwKKwljLT5sb2NhdGVfaGFuZGxlID0gYnQtPmxvY2F0ZV9oYW5kbGU7CQkJCVwKKwljLT5oYW5kbGVfcHJvdG9jb2wgPSBidC0+aGFuZGxlX3Byb3RvY29sOwkJCVwKKwljLT5leGl0X2Jvb3Rfc2VydmljZXMgPSBidC0+ZXhpdF9ib290X3NlcnZpY2VzOwkJCVwKK30KK0JPT1RfU0VSVklDRVMoMzIpOworQk9PVF9TRVJWSUNFUyg2NCk7CisKK3N0YXRpYyB2b2lkIGVmaV9wcmludGsoZWZpX3N5c3RlbV90YWJsZV90ICosIGNoYXIgKik7CitzdGF0aWMgdm9pZCBlZmlfY2hhcjE2X3ByaW50ayhlZmlfc3lzdGVtX3RhYmxlX3QgKiwgZWZpX2NoYXIxNl90ICopOworCitzdGF0aWMgZWZpX3N0YXR1c190CitfX2ZpbGVfc2l6ZTMyKHZvaWQgKl9fZmgsIGVmaV9jaGFyMTZfdCAqZmlsZW5hbWVfMTYsCisJICAgICAgdm9pZCAqKmhhbmRsZSwgdTY0ICpmaWxlX3N6KQoreworCWVmaV9maWxlX2hhbmRsZV8zMl90ICpoLCAqZmggPSBfX2ZoOworCWVmaV9maWxlX2luZm9fdCAqaW5mbzsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV9ndWlkX3QgaW5mb19ndWlkID0gRUZJX0ZJTEVfSU5GT19JRDsKKwl1MzIgaW5mb19zejsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZylmaC0+b3BlbiwgZmgsICZoLCBmaWxlbmFtZV8xNiwKKwkJCQkgRUZJX0ZJTEVfTU9ERV9SRUFELCAodTY0KTApOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiKTsKKwkJZWZpX2NoYXIxNl9wcmludGsoc3lzX3RhYmxlLCBmaWxlbmFtZV8xNik7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkqaGFuZGxlID0gaDsKKworCWluZm9fc3ogPSAwOworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZyloLT5nZXRfaW5mbywgaCwgJmluZm9fZ3VpZCwKKwkJCQkgJmluZm9fc3osIE5VTEwpOworCWlmIChzdGF0dXMgIT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gZ2V0IGZpbGUgaW5mbyBzaXplXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKK2dyb3c6CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLAorCQkJCWluZm9fc3osICh2b2lkICoqKSZpbmZvKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGFsbG9jIG1lbSBmb3IgZmlsZSBpbmZvXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoKHVuc2lnbmVkIGxvbmcpaC0+Z2V0X2luZm8sIGgsICZpbmZvX2d1aWQsCisJCQkJICZpbmZvX3N6LCBpbmZvKTsKKwlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgaW5mbyk7CisJCWdvdG8gZ3JvdzsKKwl9CisKKwkqZmlsZV9zeiA9IGluZm8tPmZpbGVfc2l6ZTsKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIGluZm8pOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gZ2V0IGluaXRyZCBpbmZvXG4iKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK19fZmlsZV9zaXplNjQodm9pZCAqX19maCwgZWZpX2NoYXIxNl90ICpmaWxlbmFtZV8xNiwKKwkgICAgICB2b2lkICoqaGFuZGxlLCB1NjQgKmZpbGVfc3opCit7CisJZWZpX2ZpbGVfaGFuZGxlXzY0X3QgKmgsICpmaCA9IF9fZmg7CisJZWZpX2ZpbGVfaW5mb190ICppbmZvOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX2d1aWRfdCBpbmZvX2d1aWQgPSBFRklfRklMRV9JTkZPX0lEOworCXUzMiBpbmZvX3N6OworCisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKCh1bnNpZ25lZCBsb25nKWZoLT5vcGVuLCBmaCwgJmgsIGZpbGVuYW1lXzE2LAorCQkJCSBFRklfRklMRV9NT0RFX1JFQUQsICh1NjQpMCk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIpOworCQllZmlfY2hhcjE2X3ByaW50ayhzeXNfdGFibGUsIGZpbGVuYW1lXzE2KTsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCSpoYW5kbGUgPSBoOworCisJaW5mb19zeiA9IDA7CisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKCh1bnNpZ25lZCBsb25nKWgtPmdldF9pbmZvLCBoLCAmaW5mb19ndWlkLAorCQkJCSAmaW5mb19zeiwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBFRklfQlVGRkVSX1RPT19TTUFMTCkgeworCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIkZhaWxlZCB0byBnZXQgZmlsZSBpbmZvIHNpemVcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworZ3JvdzoKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wb29sLCBFRklfTE9BREVSX0RBVEEsCisJCQkJaW5mb19zeiwgKHZvaWQgKiopJmluZm8pOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gYWxsb2MgbWVtIGZvciBmaWxlIGluZm9cbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZyloLT5nZXRfaW5mbywgaCwgJmluZm9fZ3VpZCwKKwkJCQkgJmluZm9fc3osIGluZm8pOworCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKwkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBpbmZvKTsKKwkJZ290byBncm93OworCX0KKworCSpmaWxlX3N6ID0gaW5mby0+ZmlsZV9zaXplOworCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgaW5mbyk7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIkZhaWxlZCB0byBnZXQgaW5pdHJkIGluZm9cbiIpOworCisJcmV0dXJuIHN0YXR1czsKK30KK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2VmaV9maWxlX3NpemUoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGUsIHZvaWQgKl9fZmgsCisJICAgICAgZWZpX2NoYXIxNl90ICpmaWxlbmFtZV8xNiwgdm9pZCAqKmhhbmRsZSwgdTY0ICpmaWxlX3N6KQoreworCWlmIChlZmlfZWFybHktPmlzNjQpCisJCXJldHVybiBfX2ZpbGVfc2l6ZTY0KF9fZmgsIGZpbGVuYW1lXzE2LCBoYW5kbGUsIGZpbGVfc3opOworCisJcmV0dXJuIF9fZmlsZV9zaXplMzIoX19maCwgZmlsZW5hbWVfMTYsIGhhbmRsZSwgZmlsZV9zeik7Cit9CisKK3N0YXRpYyBpbmxpbmUgZWZpX3N0YXR1c190CitlZmlfZmlsZV9yZWFkKHZvaWQgKl9fZmgsIHZvaWQgKmhhbmRsZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdm9pZCAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZ1bmM7CisKKwlpZiAoZWZpX2Vhcmx5LT5pczY0KSB7CisJCWVmaV9maWxlX2hhbmRsZV82NF90ICpmaCA9IF9fZmg7CisKKwkJZnVuYyA9ICh1bnNpZ25lZCBsb25nKWZoLT5yZWFkOworCQlyZXR1cm4gZWZpX2Vhcmx5LT5jYWxsKGZ1bmMsIGhhbmRsZSwgc2l6ZSwgYWRkcik7CisJfSBlbHNlIHsKKwkJZWZpX2ZpbGVfaGFuZGxlXzMyX3QgKmZoID0gX19maDsKKworCQlmdW5jID0gKHVuc2lnbmVkIGxvbmcpZmgtPnJlYWQ7CisJCXJldHVybiBlZmlfZWFybHktPmNhbGwoZnVuYywgaGFuZGxlLCBzaXplLCBhZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgZWZpX3N0YXR1c190IGVmaV9maWxlX2Nsb3NlKHZvaWQgKl9fZmgsIHZvaWQgKmhhbmRsZSkKK3sKKwlpZiAoZWZpX2Vhcmx5LT5pczY0KSB7CisJCWVmaV9maWxlX2hhbmRsZV82NF90ICpmaCA9IF9fZmg7CisKKwkJcmV0dXJuIGVmaV9lYXJseS0+Y2FsbCgodW5zaWduZWQgbG9uZylmaC0+Y2xvc2UsIGhhbmRsZSk7CisJfSBlbHNlIHsKKwkJZWZpX2ZpbGVfaGFuZGxlXzMyX3QgKmZoID0gX19maDsKKworCQlyZXR1cm4gZWZpX2Vhcmx5LT5jYWxsKCh1bnNpZ25lZCBsb25nKWZoLT5jbG9zZSwgaGFuZGxlKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgZWZpX3N0YXR1c190IF9fb3Blbl92b2x1bWUzMih2b2lkICpfX2ltYWdlLCB2b2lkICoqX19maCkKK3sKKwllZmlfZmlsZV9pb19pbnRlcmZhY2VfdCAqaW87CisJZWZpX2xvYWRlZF9pbWFnZV8zMl90ICppbWFnZSA9IF9faW1hZ2U7CisJZWZpX2ZpbGVfaGFuZGxlXzMyX3QgKmZoOworCWVmaV9ndWlkX3QgZnNfcHJvdG8gPSBFRklfRklMRV9TWVNURU1fR1VJRDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXZvaWQgKmhhbmRsZSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaW1hZ2UtPmRldmljZV9oYW5kbGU7CisJdW5zaWduZWQgbG9uZyBmdW5jOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoYW5kbGUsCisJCQkJJmZzX3Byb3RvLCAodm9pZCAqKikmaW8pOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gaGFuZGxlIGZzX3Byb3RvXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlmdW5jID0gKHVuc2lnbmVkIGxvbmcpaW8tPm9wZW5fdm9sdW1lOworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChmdW5jLCBpbywgJmZoKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIkZhaWxlZCB0byBvcGVuIHZvbHVtZVxuIik7CisKKwkqX19maCA9IGZoOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZWZpX3N0YXR1c190IF9fb3Blbl92b2x1bWU2NCh2b2lkICpfX2ltYWdlLCB2b2lkICoqX19maCkKK3sKKwllZmlfZmlsZV9pb19pbnRlcmZhY2VfdCAqaW87CisJZWZpX2xvYWRlZF9pbWFnZV82NF90ICppbWFnZSA9IF9faW1hZ2U7CisJZWZpX2ZpbGVfaGFuZGxlXzY0X3QgKmZoOworCWVmaV9ndWlkX3QgZnNfcHJvdG8gPSBFRklfRklMRV9TWVNURU1fR1VJRDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXZvaWQgKmhhbmRsZSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaW1hZ2UtPmRldmljZV9oYW5kbGU7CisJdW5zaWduZWQgbG9uZyBmdW5jOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoYW5kbGUsCisJCQkJJmZzX3Byb3RvLCAodm9pZCAqKikmaW8pOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gaGFuZGxlIGZzX3Byb3RvXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlmdW5jID0gKHVuc2lnbmVkIGxvbmcpaW8tPm9wZW5fdm9sdW1lOworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChmdW5jLCBpbywgJmZoKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQllZmlfcHJpbnRrKHN5c190YWJsZSwgIkZhaWxlZCB0byBvcGVuIHZvbHVtZVxuIik7CisKKwkqX19maCA9IGZoOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZWZpX3N0YXR1c190CitlZmlfb3Blbl92b2x1bWUoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGUsIHZvaWQgKl9faW1hZ2UsIHZvaWQgKipfX2ZoKQoreworCWlmIChlZmlfZWFybHktPmlzNjQpCisJCXJldHVybiBfX29wZW5fdm9sdW1lNjQoX19pbWFnZSwgX19maCk7CisKKwlyZXR1cm4gX19vcGVuX3ZvbHVtZTMyKF9faW1hZ2UsIF9fZmgpOworfQorCitzdGF0aWMgdm9pZCBlZmlfY2hhcjE2X3ByaW50ayhlZmlfc3lzdGVtX3RhYmxlX3QgKnRhYmxlLCBlZmlfY2hhcjE2X3QgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIG91dHB1dF9zdHJpbmc7CisJc2l6ZV90IG9mZnNldDsKKworCWlmIChlZmlfZWFybHktPmlzNjQpIHsKKwkJc3RydWN0IGVmaV9zaW1wbGVfdGV4dF9vdXRwdXRfcHJvdG9jb2xfNjQgKm91dDsKKwkJdTY0ICpmdW5jOworCisJCW9mZnNldCA9IG9mZnNldG9mKHR5cGVvZigqb3V0KSwgb3V0cHV0X3N0cmluZyk7CisJCW91dHB1dF9zdHJpbmcgPSBlZmlfZWFybHktPnRleHRfb3V0cHV0ICsgb2Zmc2V0OworCQlmdW5jID0gKHU2NCAqKW91dHB1dF9zdHJpbmc7CisKKwkJZWZpX2Vhcmx5LT5jYWxsKCpmdW5jLCBlZmlfZWFybHktPnRleHRfb3V0cHV0LCBzdHIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBlZmlfc2ltcGxlX3RleHRfb3V0cHV0X3Byb3RvY29sXzMyICpvdXQ7CisJCXUzMiAqZnVuYzsKKworCQlvZmZzZXQgPSBvZmZzZXRvZih0eXBlb2YoKm91dCksIG91dHB1dF9zdHJpbmcpOworCQlvdXRwdXRfc3RyaW5nID0gZWZpX2Vhcmx5LT50ZXh0X291dHB1dCArIG9mZnNldDsKKwkJZnVuYyA9ICh1MzIgKilvdXRwdXRfc3RyaW5nOworCisJCWVmaV9lYXJseS0+Y2FsbCgqZnVuYywgZWZpX2Vhcmx5LT50ZXh0X291dHB1dCwgc3RyKTsKKwl9Cit9CiAKICNpbmNsdWRlICIuLi8uLi8uLi8uLi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktc3R1Yi1oZWxwZXIuYyIKIAotCi0KIHN0YXRpYyB2b2lkIGZpbmRfYml0cyh1bnNpZ25lZCBsb25nIG1hc2ssIHU4ICpwb3MsIHU4ICpzaXplKQogewogCXU4IGZpcnN0LCBsZW47CkBAIC00Nyw0OCArMzA5LDg3IEBACiAJKnNpemUgPSBsZW47CiB9CiAKLXN0YXRpYyBlZmlfc3RhdHVzX3Qgc2V0dXBfZWZpX3BjaShzdHJ1Y3QgYm9vdF9wYXJhbXMgKnBhcmFtcykKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK19fc2V0dXBfZWZpX3BjaTMyKGVmaV9wY2lfaW9fcHJvdG9jb2xfMzIgKnBjaSwgc3RydWN0IHBjaV9zZXR1cF9yb20gKipfX3JvbSkKIHsKLQllZmlfcGNpX2lvX3Byb3RvY29sICpwY2k7CisJc3RydWN0IHBjaV9zZXR1cF9yb20gKnJvbSA9IE5VTEw7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKLQl2b2lkICoqcGNpX2hhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdWludDY0X3QgYXR0cmlidXRlczsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChwY2ktPmF0dHJpYnV0ZXMsIHBjaSwKKwkJCQkgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25HZXQsIDAsIDAsCisJCQkJICZhdHRyaWJ1dGVzKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKCFwY2ktPnJvbWltYWdlIHx8ICFwY2ktPnJvbXNpemUpCisJCXJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisKKwlzaXplID0gcGNpLT5yb21zaXplICsgc2l6ZW9mKCpyb20pOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLCBzaXplLCAmcm9tKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJbWVtc2V0KHJvbSwgMCwgc2l6ZW9mKCpyb20pKTsKKworCXJvbS0+ZGF0YS50eXBlID0gU0VUVVBfUENJOworCXJvbS0+ZGF0YS5sZW4gPSBzaXplIC0gc2l6ZW9mKHN0cnVjdCBzZXR1cF9kYXRhKTsKKwlyb20tPmRhdGEubmV4dCA9IDA7CisJcm9tLT5wY2lsZW4gPSBwY2ktPnJvbXNpemU7CisJKl9fcm9tID0gcm9tOworCisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKHBjaS0+cGNpLnJlYWQsIHBjaSwgRWZpUGNpSW9XaWR0aFVpbnQxNiwKKwkJCQkgUENJX1ZFTkRPUl9JRCwgMSwgJihyb20tPnZlbmRvcikpOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZ290byBmcmVlX3N0cnVjdDsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChwY2ktPnBjaS5yZWFkLCBwY2ksIEVmaVBjaUlvV2lkdGhVaW50MTYsCisJCQkJIFBDSV9ERVZJQ0VfSUQsIDEsICYocm9tLT5kZXZpZCkpOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZ290byBmcmVlX3N0cnVjdDsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChwY2ktPmdldF9sb2NhdGlvbiwgcGNpLCAmKHJvbS0+c2VnbWVudCksCisJCQkJICYocm9tLT5idXMpLCAmKHJvbS0+ZGV2aWNlKSwgJihyb20tPmZ1bmN0aW9uKSk7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlnb3RvIGZyZWVfc3RydWN0OworCisJbWVtY3B5KHJvbS0+cm9tZGF0YSwgcGNpLT5yb21pbWFnZSwgcGNpLT5yb21zaXplKTsKKwlyZXR1cm4gc3RhdHVzOworCitmcmVlX3N0cnVjdDoKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIHJvbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorc2V0dXBfZWZpX3BjaTMyKHN0cnVjdCBib290X3BhcmFtcyAqcGFyYW1zLCB2b2lkICoqcGNpX2hhbmRsZSwKKwkJdW5zaWduZWQgbG9uZyBzaXplKQoreworCWVmaV9wY2lfaW9fcHJvdG9jb2xfMzIgKnBjaSA9IE5VTEw7CiAJZWZpX2d1aWRfdCBwY2lfcHJvdG8gPSBFRklfUENJX0lPX1BST1RPQ09MX0dVSUQ7Ci0JdW5zaWduZWQgbG9uZyBucl9wY2ksIHNpemUgPSAwOwotCWludCBpOworCXUzMiAqaGFuZGxlcyA9ICh1MzIgKikodW5zaWduZWQgbG9uZylwY2lfaGFuZGxlOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBucl9wY2k7CiAJc3RydWN0IHNldHVwX2RhdGEgKmRhdGE7CisJaW50IGk7CiAKIAlkYXRhID0gKHN0cnVjdCBzZXR1cF9kYXRhICopKHVuc2lnbmVkIGxvbmcpcGFyYW1zLT5oZHIuc2V0dXBfZGF0YTsKIAogCXdoaWxlIChkYXRhICYmIGRhdGEtPm5leHQpCiAJCWRhdGEgPSAoc3RydWN0IHNldHVwX2RhdGEgKikodW5zaWduZWQgbG9uZylkYXRhLT5uZXh0OwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czUoc3lzX3RhYmxlLT5ib290dGltZS0+bG9jYXRlX2hhbmRsZSwKLQkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLCAmcGNpX3Byb3RvLAotCQkJCU5VTEwsICZzaXplLCBwY2lfaGFuZGxlKTsKLQotCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQkJRUZJX0xPQURFUl9EQVRBLCBzaXplLCAmcGNpX2hhbmRsZSk7Ci0KLQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKLQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czUoc3lzX3RhYmxlLT5ib290dGltZS0+bG9jYXRlX2hhbmRsZSwKLQkJCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwgJnBjaV9wcm90bywKLQkJCQkJTlVMTCwgJnNpemUsIHBjaV9oYW5kbGUpOwotCX0KLQotCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCi0JCWdvdG8gZnJlZV9oYW5kbGU7Ci0KLQlucl9wY2kgPSBzaXplIC8gc2l6ZW9mKHZvaWQgKik7CisJbnJfcGNpID0gc2l6ZSAvIHNpemVvZih1MzIpOwogCWZvciAoaSA9IDA7IGkgPCBucl9wY2k7IGkrKykgewotCQl2b2lkICpoID0gcGNpX2hhbmRsZVtpXTsKLQkJdWludDY0X3QgYXR0cmlidXRlczsKLQkJc3RydWN0IHBjaV9zZXR1cF9yb20gKnJvbTsKKwkJc3RydWN0IHBjaV9zZXR1cF9yb20gKnJvbSA9IE5VTEw7CisJCXUzMiBoID0gaGFuZGxlc1tpXTsKIAotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGUtPmJvb3R0aW1lLT5oYW5kbGVfcHJvdG9jb2wsCi0JCQkJCWgsICZwY2lfcHJvdG8sICZwY2kpOworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGgsCisJCQkJCSZwY2lfcHJvdG8sICh2b2lkICoqKSZwY2kpOwogCiAJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCQljb250aW51ZTsKQEAgLTk2LDU3ICszOTcsMTAgQEAKIAkJaWYgKCFwY2kpCiAJCQljb250aW51ZTsKIAotI2lmZGVmIENPTkZJR19YODZfNjQKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czQocGNpLT5hdHRyaWJ1dGVzLCBwY2ksCi0JCQkJCUVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uR2V0LCAwLAotCQkJCQkmYXR0cmlidXRlcyk7Ci0jZWxzZQotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShwY2ktPmF0dHJpYnV0ZXMsIHBjaSwKLQkJCQkJRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25HZXQsIDAsIDAsCi0JCQkJCSZhdHRyaWJ1dGVzKTsKLSNlbmRpZgorCQlzdGF0dXMgPSBfX3NldHVwX2VmaV9wY2kzMihwY2ksICZyb20pOwogCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQkJY29udGludWU7CiAKLQkJaWYgKCFwY2ktPnJvbWltYWdlIHx8ICFwY2ktPnJvbXNpemUpCi0JCQljb250aW51ZTsKLQotCQlzaXplID0gcGNpLT5yb21zaXplICsgc2l6ZW9mKCpyb20pOwotCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJRUZJX0xPQURFUl9EQVRBLCBzaXplLCAmcm9tKTsKLQotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQkJY29udGludWU7Ci0KLQkJcm9tLT5kYXRhLnR5cGUgPSBTRVRVUF9QQ0k7Ci0JCXJvbS0+ZGF0YS5sZW4gPSBzaXplIC0gc2l6ZW9mKHN0cnVjdCBzZXR1cF9kYXRhKTsKLQkJcm9tLT5kYXRhLm5leHQgPSAwOwotCQlyb20tPnBjaWxlbiA9IHBjaS0+cm9tc2l6ZTsKLQotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShwY2ktPnBjaS5yZWFkLCBwY2ksCi0JCQkJCUVmaVBjaUlvV2lkdGhVaW50MTYsIFBDSV9WRU5ET1JfSUQsCi0JCQkJCTEsICYocm9tLT52ZW5kb3IpKTsKLQotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQkJZ290byBmcmVlX3N0cnVjdDsKLQotCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShwY2ktPnBjaS5yZWFkLCBwY2ksCi0JCQkJCUVmaVBjaUlvV2lkdGhVaW50MTYsIFBDSV9ERVZJQ0VfSUQsCi0JCQkJCTEsICYocm9tLT5kZXZpZCkpOwotCi0JCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCi0JCQlnb3RvIGZyZWVfc3RydWN0OwotCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM1KHBjaS0+Z2V0X2xvY2F0aW9uLCBwY2ksCi0JCQkJCSYocm9tLT5zZWdtZW50KSwgJihyb20tPmJ1cyksCi0JCQkJCSYocm9tLT5kZXZpY2UpLCAmKHJvbS0+ZnVuY3Rpb24pKTsKLQotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQkJZ290byBmcmVlX3N0cnVjdDsKLQotCQltZW1jcHkocm9tLT5yb21kYXRhLCBwY2ktPnJvbWltYWdlLCBwY2ktPnJvbXNpemUpOwotCiAJCWlmIChkYXRhKQogCQkJZGF0YS0+bmV4dCA9ICh1bnNpZ25lZCBsb25nKXJvbTsKIAkJZWxzZQpAQCAtMTU0LDEwNSArNDA4LDE1NSBAQAogCiAJCWRhdGEgPSAoc3RydWN0IHNldHVwX2RhdGEgKilyb207CiAKLQkJY29udGludWU7Ci0JZnJlZV9zdHJ1Y3Q6Ci0JCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZS0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgcm9tKTsKIAl9CiAKLWZyZWVfaGFuZGxlOgotCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZS0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgcGNpX2hhbmRsZSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotLyoKLSAqIFNlZSBpZiB3ZSBoYXZlIEdyYXBoaWNzIE91dHB1dCBQcm90b2NvbAotICovCi1zdGF0aWMgZWZpX3N0YXR1c190IHNldHVwX2dvcChzdHJ1Y3Qgc2NyZWVuX2luZm8gKnNpLCBlZmlfZ3VpZF90ICpwcm90bywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK19fc2V0dXBfZWZpX3BjaTY0KGVmaV9wY2lfaW9fcHJvdG9jb2xfNjQgKnBjaSwgc3RydWN0IHBjaV9zZXR1cF9yb20gKipfX3JvbSkKIHsKLQlzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbCAqZ29wLCAqZmlyc3RfZ29wOwotCXN0cnVjdCBlZmlfcGl4ZWxfYml0bWFzayBwaXhlbF9pbmZvOwotCXVuc2lnbmVkIGxvbmcgbnJfZ29wczsKKwlzdHJ1Y3QgcGNpX3NldHVwX3JvbSAqcm9tOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7Ci0Jdm9pZCAqKmdvcF9oYW5kbGU7Ci0JdTE2IHdpZHRoLCBoZWlnaHQ7Ci0JdTMyIGZiX2Jhc2UsIGZiX3NpemU7Ci0JdTMyIHBpeGVsc19wZXJfc2Nhbl9saW5lOwotCWludCBwaXhlbF9mb3JtYXQ7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVpbnQ2NF90IGF0dHJpYnV0ZXM7CiAKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMyhzeXNfdGFibGUtPmJvb3R0aW1lLT5hbGxvY2F0ZV9wb29sLAotCQkJCUVGSV9MT0FERVJfREFUQSwgc2l6ZSwgJmdvcF9oYW5kbGUpOworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChwY2ktPmF0dHJpYnV0ZXMsIHBjaSwKKwkJCQkgRWZpUGNpSW9BdHRyaWJ1dGVPcGVyYXRpb25HZXQsIDAsCisJCQkJICZhdHRyaWJ1dGVzKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlyZXR1cm4gc3RhdHVzOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czUoc3lzX3RhYmxlLT5ib290dGltZS0+bG9jYXRlX2hhbmRsZSwKLQkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLCBwcm90bywKLQkJCQlOVUxMLCAmc2l6ZSwgZ29wX2hhbmRsZSk7CisJaWYgKCFwY2ktPnJvbWltYWdlIHx8ICFwY2ktPnJvbXNpemUpCisJCXJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisKKwlzaXplID0gcGNpLT5yb21zaXplICsgc2l6ZW9mKCpyb20pOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLCBzaXplLCAmcm9tKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQlnb3RvIGZyZWVfaGFuZGxlOworCQlyZXR1cm4gc3RhdHVzOwogCi0JZmlyc3RfZ29wID0gTlVMTDsKKwlyb20tPmRhdGEudHlwZSA9IFNFVFVQX1BDSTsKKwlyb20tPmRhdGEubGVuID0gc2l6ZSAtIHNpemVvZihzdHJ1Y3Qgc2V0dXBfZGF0YSk7CisJcm9tLT5kYXRhLm5leHQgPSAwOworCXJvbS0+cGNpbGVuID0gcGNpLT5yb21zaXplOworCSpfX3JvbSA9IHJvbTsKIAotCW5yX2dvcHMgPSBzaXplIC8gc2l6ZW9mKHZvaWQgKik7Ci0JZm9yIChpID0gMDsgaSA8IG5yX2dvcHM7IGkrKykgewotCQlzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9tb2RlX2luZm8gKmluZm87Ci0JCWVmaV9ndWlkX3QgY29ub3V0X3Byb3RvID0gRUZJX0NPTlNPTEVfT1VUX0RFVklDRV9HVUlEOwotCQlib29sIGNvbm91dF9mb3VuZCA9IGZhbHNlOwotCQl2b2lkICpkdW1teTsKLQkJdm9pZCAqaCA9IGdvcF9oYW5kbGVbaV07CisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKHBjaS0+cGNpLnJlYWQsIHBjaSwgRWZpUGNpSW9XaWR0aFVpbnQxNiwKKwkJCQkgUENJX1ZFTkRPUl9JRCwgMSwgJihyb20tPnZlbmRvcikpOwogCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmhhbmRsZV9wcm90b2NvbCwKLQkJCQkJaCwgcHJvdG8sICZnb3ApOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZnJlZV9zdHJ1Y3Q7CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwocGNpLT5wY2kucmVhZCwgcGNpLCBFZmlQY2lJb1dpZHRoVWludDE2LAorCQkJCSBQQ0lfREVWSUNFX0lELCAxLCAmKHJvbS0+ZGV2aWQpKTsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZnJlZV9zdHJ1Y3Q7CisKKwlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwocGNpLT5nZXRfbG9jYXRpb24sIHBjaSwgJihyb20tPnNlZ21lbnQpLAorCQkJCSAmKHJvbS0+YnVzKSwgJihyb20tPmRldmljZSksICYocm9tLT5mdW5jdGlvbikpOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZ290byBmcmVlX3N0cnVjdDsKKworCW1lbWNweShyb20tPnJvbWRhdGEsIHBjaS0+cm9taW1hZ2UsIHBjaS0+cm9tc2l6ZSk7CisJcmV0dXJuIHN0YXR1czsKKworZnJlZV9zdHJ1Y3Q6CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCByb20pOworCXJldHVybiBzdGF0dXM7CisKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorc2V0dXBfZWZpX3BjaTY0KHN0cnVjdCBib290X3BhcmFtcyAqcGFyYW1zLCB2b2lkICoqcGNpX2hhbmRsZSwKKwkJdW5zaWduZWQgbG9uZyBzaXplKQoreworCWVmaV9wY2lfaW9fcHJvdG9jb2xfNjQgKnBjaSA9IE5VTEw7CisJZWZpX2d1aWRfdCBwY2lfcHJvdG8gPSBFRklfUENJX0lPX1BST1RPQ09MX0dVSUQ7CisJdTY0ICpoYW5kbGVzID0gKHU2NCAqKSh1bnNpZ25lZCBsb25nKXBjaV9oYW5kbGU7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIG5yX3BjaTsKKwlzdHJ1Y3Qgc2V0dXBfZGF0YSAqZGF0YTsKKwlpbnQgaTsKKworCWRhdGEgPSAoc3RydWN0IHNldHVwX2RhdGEgKikodW5zaWduZWQgbG9uZylwYXJhbXMtPmhkci5zZXR1cF9kYXRhOworCisJd2hpbGUgKGRhdGEgJiYgZGF0YS0+bmV4dCkKKwkJZGF0YSA9IChzdHJ1Y3Qgc2V0dXBfZGF0YSAqKSh1bnNpZ25lZCBsb25nKWRhdGEtPm5leHQ7CisKKwlucl9wY2kgPSBzaXplIC8gc2l6ZW9mKHU2NCk7CisJZm9yIChpID0gMDsgaSA8IG5yX3BjaTsgaSsrKSB7CisJCXN0cnVjdCBwY2lfc2V0dXBfcm9tICpyb20gPSBOVUxMOworCQl1NjQgaCA9IGhhbmRsZXNbaV07CisKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoLAorCQkJCQkmcGNpX3Byb3RvLCAodm9pZCAqKikmcGNpKTsKKwogCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQkJY29udGludWU7CiAKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+aGFuZGxlX3Byb3RvY29sLAotCQkJCQloLCAmY29ub3V0X3Byb3RvLCAmZHVtbXkpOworCQlpZiAoIXBjaSkKKwkJCWNvbnRpbnVlOwogCi0JCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpCi0JCQljb25vdXRfZm91bmQgPSB0cnVlOworCQlzdGF0dXMgPSBfX3NldHVwX2VmaV9wY2k2NChwY2ksICZyb20pOworCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQkJY29udGludWU7CiAKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czQoZ29wLT5xdWVyeV9tb2RlLCBnb3AsCi0JCQkJCWdvcC0+bW9kZS0+bW9kZSwgJnNpemUsICZpbmZvKTsKLQkJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUyAmJiAoIWZpcnN0X2dvcCB8fCBjb25vdXRfZm91bmQpKSB7Ci0JCQkvKgotCQkJICogU3lzdGVtcyB0aGF0IHVzZSB0aGUgVUVGSSBDb25zb2xlIFNwbGl0dGVyIG1heQotCQkJICogcHJvdmlkZSBtdWx0aXBsZSBHT1AgZGV2aWNlcywgbm90IGFsbCBvZiB3aGljaCBhcmUKLQkJCSAqIGJhY2tlZCBieSByZWFsIGhhcmR3YXJlLiBUaGUgd29ya2Fyb3VuZCBpcyB0byBzZWFyY2gKLQkJCSAqIGZvciBhIEdPUCBpbXBsZW1lbnRpbmcgdGhlIENvbk91dCBwcm90b2NvbCwgYW5kIGlmCi0JCQkgKiBvbmUgaXNuJ3QgZm91bmQsIHRvIGp1c3QgZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBHT1AuCi0JCQkgKi8KLQkJCXdpZHRoID0gaW5mby0+aG9yaXpvbnRhbF9yZXNvbHV0aW9uOwotCQkJaGVpZ2h0ID0gaW5mby0+dmVydGljYWxfcmVzb2x1dGlvbjsKLQkJCWZiX2Jhc2UgPSBnb3AtPm1vZGUtPmZyYW1lX2J1ZmZlcl9iYXNlOwotCQkJZmJfc2l6ZSA9IGdvcC0+bW9kZS0+ZnJhbWVfYnVmZmVyX3NpemU7Ci0JCQlwaXhlbF9mb3JtYXQgPSBpbmZvLT5waXhlbF9mb3JtYXQ7Ci0JCQlwaXhlbF9pbmZvID0gaW5mby0+cGl4ZWxfaW5mb3JtYXRpb247Ci0JCQlwaXhlbHNfcGVyX3NjYW5fbGluZSA9IGluZm8tPnBpeGVsc19wZXJfc2Nhbl9saW5lOworCQlpZiAoZGF0YSkKKwkJCWRhdGEtPm5leHQgPSAodW5zaWduZWQgbG9uZylyb207CisJCWVsc2UKKwkJCXBhcmFtcy0+aGRyLnNldHVwX2RhdGEgPSAodW5zaWduZWQgbG9uZylyb207CiAKLQkJCS8qCi0JCQkgKiBPbmNlIHdlJ3ZlIGZvdW5kIGEgR09QIHN1cHBvcnRpbmcgQ29uT3V0LAotCQkJICogZG9uJ3QgYm90aGVyIGxvb2tpbmcgYW55IGZ1cnRoZXIuCi0JCQkgKi8KLQkJCWZpcnN0X2dvcCA9IGdvcDsKLQkJCWlmIChjb25vdXRfZm91bmQpCi0JCQkJYnJlYWs7Ci0JCX0KKwkJZGF0YSA9IChzdHJ1Y3Qgc2V0dXBfZGF0YSAqKXJvbTsKKwogCX0KIAotCS8qIERpZCB3ZSBmaW5kIGFueSBHT1BzPyAqLwotCWlmICghZmlyc3RfZ29wKQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3Qgc2V0dXBfZWZpX3BjaShzdHJ1Y3QgYm9vdF9wYXJhbXMgKnBhcmFtcykKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXZvaWQgKipwY2lfaGFuZGxlID0gTlVMTDsKKwllZmlfZ3VpZF90IHBjaV9wcm90byA9IEVGSV9QQ0lfSU9fUFJPVE9DT0xfR1VJRDsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSAwOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkobG9jYXRlX2hhbmRsZSwKKwkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLAorCQkJCSZwY2lfcHJvdG8sIE5VTEwsICZzaXplLCBwY2lfaGFuZGxlKTsKKworCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwKKwkJCQkJRUZJX0xPQURFUl9EQVRBLAorCQkJCQlzaXplLCAodm9pZCAqKikmcGNpX2hhbmRsZSk7CisKKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkobG9jYXRlX2hhbmRsZSwKKwkJCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwgJnBjaV9wcm90bywKKwkJCQkJTlVMTCwgJnNpemUsIHBjaV9oYW5kbGUpOworCX0KKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCWdvdG8gZnJlZV9oYW5kbGU7CiAKLQkvKiBFRkkgZnJhbWVidWZmZXIgKi8KLQlzaS0+b3JpZ192aWRlb19pc1ZHQSA9IFZJREVPX1RZUEVfRUZJOworCWlmIChlZmlfZWFybHktPmlzNjQpCisJCXN0YXR1cyA9IHNldHVwX2VmaV9wY2k2NChwYXJhbXMsIHBjaV9oYW5kbGUsIHNpemUpOworCWVsc2UKKwkJc3RhdHVzID0gc2V0dXBfZWZpX3BjaTMyKHBhcmFtcywgcGNpX2hhbmRsZSwgc2l6ZSk7CiAKLQlzaS0+bGZiX3dpZHRoID0gd2lkdGg7Ci0Jc2ktPmxmYl9oZWlnaHQgPSBoZWlnaHQ7Ci0Jc2ktPmxmYl9iYXNlID0gZmJfYmFzZTsKLQlzaS0+cGFnZXMgPSAxOworZnJlZV9oYW5kbGU6CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBwY2lfaGFuZGxlKTsKKwlyZXR1cm4gc3RhdHVzOworfQogCitzdGF0aWMgdm9pZAorc2V0dXBfcGl4ZWxfaW5mbyhzdHJ1Y3Qgc2NyZWVuX2luZm8gKnNpLCB1MzIgcGl4ZWxzX3Blcl9zY2FuX2xpbmUsCisJCSBzdHJ1Y3QgZWZpX3BpeGVsX2JpdG1hc2sgcGl4ZWxfaW5mbywgaW50IHBpeGVsX2Zvcm1hdCkKK3sKIAlpZiAocGl4ZWxfZm9ybWF0ID09IFBJWEVMX1JHQl9SRVNFUlZFRF84QklUX1BFUl9DT0xPUikgewogCQlzaS0+bGZiX2RlcHRoID0gMzI7CiAJCXNpLT5sZmJfbGluZWxlbmd0aCA9IHBpeGVsc19wZXJfc2Nhbl9saW5lICogNDsKQEAgLTI5Nyw2MiArNjAxLDI3NCBAQAogCQlzaS0+cnN2ZF9zaXplID0gMDsKIAkJc2ktPnJzdmRfcG9zID0gMDsKIAl9Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK19fZ29wX3F1ZXJ5MzIoc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfMzIgKmdvcDMyLAorCSAgICAgIHN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X21vZGVfaW5mbyAqKmluZm8sCisJICAgICAgdW5zaWduZWQgbG9uZyAqc2l6ZSwgdTMyICpmYl9iYXNlKQoreworCXN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sX21vZGVfMzIgKm1vZGU7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIG07CisKKwltID0gZ29wMzItPm1vZGU7CisJbW9kZSA9IChzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF9tb2RlXzMyICopbTsKKworCXN0YXR1cyA9IGVmaV9lYXJseS0+Y2FsbChnb3AzMi0+cXVlcnlfbW9kZSwgZ29wMzIsCisJCQkJIG1vZGUtPm1vZGUsIHNpemUsIGluZm8pOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwkqZmJfYmFzZSA9IG1vZGUtPmZyYW1lX2J1ZmZlcl9iYXNlOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK3NldHVwX2dvcDMyKHN0cnVjdCBzY3JlZW5faW5mbyAqc2ksIGVmaV9ndWlkX3QgKnByb3RvLAorCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKipnb3BfaGFuZGxlKQoreworCXN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sXzMyICpnb3AzMiwgKmZpcnN0X2dvcDsKKwl1bnNpZ25lZCBsb25nIG5yX2dvcHM7CisJdTE2IHdpZHRoLCBoZWlnaHQ7CisJdTMyIHBpeGVsc19wZXJfc2Nhbl9saW5lOworCXUzMiBmYl9iYXNlOworCXN0cnVjdCBlZmlfcGl4ZWxfYml0bWFzayBwaXhlbF9pbmZvOworCWludCBwaXhlbF9mb3JtYXQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1MzIgKmhhbmRsZXMgPSAodTMyICopKHVuc2lnbmVkIGxvbmcpZ29wX2hhbmRsZTsKKwlpbnQgaTsKKworCWZpcnN0X2dvcCA9IE5VTEw7CisJZ29wMzIgPSBOVUxMOworCisJbnJfZ29wcyA9IHNpemUgLyBzaXplb2YodTMyKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZ29wczsgaSsrKSB7CisJCXN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X21vZGVfaW5mbyAqaW5mbyA9IE5VTEw7CisJCWVmaV9ndWlkX3QgY29ub3V0X3Byb3RvID0gRUZJX0NPTlNPTEVfT1VUX0RFVklDRV9HVUlEOworCQlib29sIGNvbm91dF9mb3VuZCA9IGZhbHNlOworCQl2b2lkICpkdW1teSA9IE5VTEw7CisJCXUzMiBoID0gaGFuZGxlc1tpXTsKKworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGgsCisJCQkJCXByb3RvLCAodm9pZCAqKikmZ29wMzIpOworCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQkJY29udGludWU7CisKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoaGFuZGxlX3Byb3RvY29sLCBoLAorCQkJCQkmY29ub3V0X3Byb3RvLCAmZHVtbXkpOworCQlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTKQorCQkJY29ub3V0X2ZvdW5kID0gdHJ1ZTsKKworCQlzdGF0dXMgPSBfX2dvcF9xdWVyeTMyKGdvcDMyLCAmaW5mbywgJnNpemUsICZmYl9iYXNlKTsKKwkJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUyAmJiAoIWZpcnN0X2dvcCB8fCBjb25vdXRfZm91bmQpKSB7CisJCQkvKgorCQkJICogU3lzdGVtcyB0aGF0IHVzZSB0aGUgVUVGSSBDb25zb2xlIFNwbGl0dGVyIG1heQorCQkJICogcHJvdmlkZSBtdWx0aXBsZSBHT1AgZGV2aWNlcywgbm90IGFsbCBvZiB3aGljaCBhcmUKKwkJCSAqIGJhY2tlZCBieSByZWFsIGhhcmR3YXJlLiBUaGUgd29ya2Fyb3VuZCBpcyB0byBzZWFyY2gKKwkJCSAqIGZvciBhIEdPUCBpbXBsZW1lbnRpbmcgdGhlIENvbk91dCBwcm90b2NvbCwgYW5kIGlmCisJCQkgKiBvbmUgaXNuJ3QgZm91bmQsIHRvIGp1c3QgZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBHT1AuCisJCQkgKi8KKwkJCXdpZHRoID0gaW5mby0+aG9yaXpvbnRhbF9yZXNvbHV0aW9uOworCQkJaGVpZ2h0ID0gaW5mby0+dmVydGljYWxfcmVzb2x1dGlvbjsKKwkJCXBpeGVsX2Zvcm1hdCA9IGluZm8tPnBpeGVsX2Zvcm1hdDsKKwkJCXBpeGVsX2luZm8gPSBpbmZvLT5waXhlbF9pbmZvcm1hdGlvbjsKKwkJCXBpeGVsc19wZXJfc2Nhbl9saW5lID0gaW5mby0+cGl4ZWxzX3Blcl9zY2FuX2xpbmU7CisKKwkJCS8qCisJCQkgKiBPbmNlIHdlJ3ZlIGZvdW5kIGEgR09QIHN1cHBvcnRpbmcgQ29uT3V0LAorCQkJICogZG9uJ3QgYm90aGVyIGxvb2tpbmcgYW55IGZ1cnRoZXIuCisJCQkgKi8KKwkJCWZpcnN0X2dvcCA9IGdvcDMyOworCQkJaWYgKGNvbm91dF9mb3VuZCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qIERpZCB3ZSBmaW5kIGFueSBHT1BzPyAqLworCWlmICghZmlyc3RfZ29wKQorCQlnb3RvIG91dDsKKworCS8qIEVGSSBmcmFtZWJ1ZmZlciAqLworCXNpLT5vcmlnX3ZpZGVvX2lzVkdBID0gVklERU9fVFlQRV9FRkk7CisKKwlzaS0+bGZiX3dpZHRoID0gd2lkdGg7CisJc2ktPmxmYl9oZWlnaHQgPSBoZWlnaHQ7CisJc2ktPmxmYl9iYXNlID0gZmJfYmFzZTsKKwlzaS0+cGFnZXMgPSAxOworCisJc2V0dXBfcGl4ZWxfaW5mbyhzaSwgcGl4ZWxzX3Blcl9zY2FuX2xpbmUsIHBpeGVsX2luZm8sIHBpeGVsX2Zvcm1hdCk7CiAKIAlzaS0+bGZiX3NpemUgPSBzaS0+bGZiX2xpbmVsZW5ndGggKiBzaS0+bGZiX2hlaWdodDsKIAogCXNpLT5jYXBhYmlsaXRpZXMgfD0gVklERU9fQ0FQQUJJTElUWV9TS0lQX1FVSVJLUzsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQogCi1mcmVlX2hhbmRsZToKLQllZmlfY2FsbF9waHlzMShzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIGdvcF9oYW5kbGUpOworc3RhdGljIGVmaV9zdGF0dXNfdAorX19nb3BfcXVlcnk2NChzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF82NCAqZ29wNjQsCisJICAgICAgc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfbW9kZV9pbmZvICoqaW5mbywKKwkgICAgICB1bnNpZ25lZCBsb25nICpzaXplLCB1MzIgKmZiX2Jhc2UpCit7CisJc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfbW9kZV82NCAqbW9kZTsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgbTsKKworCW0gPSBnb3A2NC0+bW9kZTsKKwltb2RlID0gKHN0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sX21vZGVfNjQgKiltOworCisJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKGdvcDY0LT5xdWVyeV9tb2RlLCBnb3A2NCwKKwkJCQkgbW9kZS0+bW9kZSwgc2l6ZSwgaW5mbyk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCSpmYl9iYXNlID0gbW9kZS0+ZnJhbWVfYnVmZmVyX2Jhc2U7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorc2V0dXBfZ29wNjQoc3RydWN0IHNjcmVlbl9pbmZvICpzaSwgZWZpX2d1aWRfdCAqcHJvdG8sCisJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqKmdvcF9oYW5kbGUpCit7CisJc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfNjQgKmdvcDY0LCAqZmlyc3RfZ29wOworCXVuc2lnbmVkIGxvbmcgbnJfZ29wczsKKwl1MTYgd2lkdGgsIGhlaWdodDsKKwl1MzIgcGl4ZWxzX3Blcl9zY2FuX2xpbmU7CisJdTMyIGZiX2Jhc2U7CisJc3RydWN0IGVmaV9waXhlbF9iaXRtYXNrIHBpeGVsX2luZm87CisJaW50IHBpeGVsX2Zvcm1hdDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXU2NCAqaGFuZGxlcyA9ICh1NjQgKikodW5zaWduZWQgbG9uZylnb3BfaGFuZGxlOworCWludCBpOworCisJZmlyc3RfZ29wID0gTlVMTDsKKwlnb3A2NCA9IE5VTEw7CisKKwlucl9nb3BzID0gc2l6ZSAvIHNpemVvZih1NjQpOworCWZvciAoaSA9IDA7IGkgPCBucl9nb3BzOyBpKyspIHsKKwkJc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfbW9kZV9pbmZvICppbmZvID0gTlVMTDsKKwkJZWZpX2d1aWRfdCBjb25vdXRfcHJvdG8gPSBFRklfQ09OU09MRV9PVVRfREVWSUNFX0dVSUQ7CisJCWJvb2wgY29ub3V0X2ZvdW5kID0gZmFsc2U7CisJCXZvaWQgKmR1bW15ID0gTlVMTDsKKwkJdTY0IGggPSBoYW5kbGVzW2ldOworCisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaCwKKwkJCQkJcHJvdG8sICh2b2lkICoqKSZnb3A2NCk7CisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQljb250aW51ZTsKKworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGgsCisJCQkJCSZjb25vdXRfcHJvdG8sICZkdW1teSk7CisJCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpCisJCQljb25vdXRfZm91bmQgPSB0cnVlOworCisJCXN0YXR1cyA9IF9fZ29wX3F1ZXJ5NjQoZ29wNjQsICZpbmZvLCAmc2l6ZSwgJmZiX2Jhc2UpOworCQlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTICYmICghZmlyc3RfZ29wIHx8IGNvbm91dF9mb3VuZCkpIHsKKwkJCS8qCisJCQkgKiBTeXN0ZW1zIHRoYXQgdXNlIHRoZSBVRUZJIENvbnNvbGUgU3BsaXR0ZXIgbWF5CisJCQkgKiBwcm92aWRlIG11bHRpcGxlIEdPUCBkZXZpY2VzLCBub3QgYWxsIG9mIHdoaWNoIGFyZQorCQkJICogYmFja2VkIGJ5IHJlYWwgaGFyZHdhcmUuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHNlYXJjaAorCQkJICogZm9yIGEgR09QIGltcGxlbWVudGluZyB0aGUgQ29uT3V0IHByb3RvY29sLCBhbmQgaWYKKwkJCSAqIG9uZSBpc24ndCBmb3VuZCwgdG8ganVzdCBmYWxsIGJhY2sgdG8gdGhlIGZpcnN0IEdPUC4KKwkJCSAqLworCQkJd2lkdGggPSBpbmZvLT5ob3Jpem9udGFsX3Jlc29sdXRpb247CisJCQloZWlnaHQgPSBpbmZvLT52ZXJ0aWNhbF9yZXNvbHV0aW9uOworCQkJcGl4ZWxfZm9ybWF0ID0gaW5mby0+cGl4ZWxfZm9ybWF0OworCQkJcGl4ZWxfaW5mbyA9IGluZm8tPnBpeGVsX2luZm9ybWF0aW9uOworCQkJcGl4ZWxzX3Blcl9zY2FuX2xpbmUgPSBpbmZvLT5waXhlbHNfcGVyX3NjYW5fbGluZTsKKworCQkJLyoKKwkJCSAqIE9uY2Ugd2UndmUgZm91bmQgYSBHT1Agc3VwcG9ydGluZyBDb25PdXQsCisJCQkgKiBkb24ndCBib3RoZXIgbG9va2luZyBhbnkgZnVydGhlci4KKwkJCSAqLworCQkJZmlyc3RfZ29wID0gZ29wNjQ7CisJCQlpZiAoY29ub3V0X2ZvdW5kKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyogRGlkIHdlIGZpbmQgYW55IEdPUHM/ICovCisJaWYgKCFmaXJzdF9nb3ApCisJCWdvdG8gb3V0OworCisJLyogRUZJIGZyYW1lYnVmZmVyICovCisJc2ktPm9yaWdfdmlkZW9faXNWR0EgPSBWSURFT19UWVBFX0VGSTsKKworCXNpLT5sZmJfd2lkdGggPSB3aWR0aDsKKwlzaS0+bGZiX2hlaWdodCA9IGhlaWdodDsKKwlzaS0+bGZiX2Jhc2UgPSBmYl9iYXNlOworCXNpLT5wYWdlcyA9IDE7CisKKwlzZXR1cF9waXhlbF9pbmZvKHNpLCBwaXhlbHNfcGVyX3NjYW5fbGluZSwgcGl4ZWxfaW5mbywgcGl4ZWxfZm9ybWF0KTsKKworCXNpLT5sZmJfc2l6ZSA9IHNpLT5sZmJfbGluZWxlbmd0aCAqIHNpLT5sZmJfaGVpZ2h0OworCisJc2ktPmNhcGFiaWxpdGllcyB8PSBWSURFT19DQVBBQklMSVRZX1NLSVBfUVVJUktTOworb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCi0gKiBTZWUgaWYgd2UgaGF2ZSBVbml2ZXJzYWwgR3JhcGhpY3MgQWRhcHRlciAoVUdBKSBwcm90b2NvbAorICogU2VlIGlmIHdlIGhhdmUgR3JhcGhpY3MgT3V0cHV0IFByb3RvY29sCiAgKi8KLXN0YXRpYyBlZmlfc3RhdHVzX3Qgc2V0dXBfdWdhKHN0cnVjdCBzY3JlZW5faW5mbyAqc2ksIGVmaV9ndWlkX3QgKnVnYV9wcm90bywKK3N0YXRpYyBlZmlfc3RhdHVzX3Qgc2V0dXBfZ29wKHN0cnVjdCBzY3JlZW5faW5mbyAqc2ksIGVmaV9ndWlkX3QgKnByb3RvLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXN0cnVjdCBlZmlfdWdhX2RyYXdfcHJvdG9jb2wgKnVnYSwgKmZpcnN0X3VnYTsKLQl1bnNpZ25lZCBsb25nIG5yX3VnYXM7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKLQl1MzIgd2lkdGgsIGhlaWdodDsKLQl2b2lkICoqdWdhX2hhbmRsZSA9IE5VTEw7Ci0JaW50IGk7CisJdm9pZCAqKmdvcF9oYW5kbGUgPSBOVUxMOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQlFRklfTE9BREVSX0RBVEEsIHNpemUsICZ1Z2FfaGFuZGxlKTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wb29sLCBFRklfTE9BREVSX0RBVEEsCisJCQkJc2l6ZSwgKHZvaWQgKiopJmdvcF9oYW5kbGUpOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCXJldHVybiBzdGF0dXM7CiAKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzNShzeXNfdGFibGUtPmJvb3R0aW1lLT5sb2NhdGVfaGFuZGxlLAotCQkJCUVGSV9MT0NBVEVfQllfUFJPVE9DT0wsIHVnYV9wcm90bywKLQkJCQlOVUxMLCAmc2l6ZSwgdWdhX2hhbmRsZSk7CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkobG9jYXRlX2hhbmRsZSwKKwkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLAorCQkJCXByb3RvLCBOVUxMLCAmc2l6ZSwgZ29wX2hhbmRsZSk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJZ290byBmcmVlX2hhbmRsZTsKIAotCWZpcnN0X3VnYSA9IE5VTEw7CisJaWYgKGVmaV9lYXJseS0+aXM2NCkKKwkJc3RhdHVzID0gc2V0dXBfZ29wNjQoc2ksIHByb3RvLCBzaXplLCBnb3BfaGFuZGxlKTsKKwllbHNlCisJCXN0YXR1cyA9IHNldHVwX2dvcDMyKHNpLCBwcm90bywgc2l6ZSwgZ29wX2hhbmRsZSk7CiAKLQlucl91Z2FzID0gc2l6ZSAvIHNpemVvZih2b2lkICopOworZnJlZV9oYW5kbGU6CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBnb3BfaGFuZGxlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitzZXR1cF91Z2EzMih2b2lkICoqdWdhX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKK3sKKwlzdHJ1Y3QgZWZpX3VnYV9kcmF3X3Byb3RvY29sICp1Z2EgPSBOVUxMLCAqZmlyc3RfdWdhOworCWVmaV9ndWlkX3QgdWdhX3Byb3RvID0gRUZJX1VHQV9QUk9UT0NPTF9HVUlEOworCXVuc2lnbmVkIGxvbmcgbnJfdWdhczsKKwl1MzIgKmhhbmRsZXMgPSAodTMyICopdWdhX2hhbmRsZTs7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwlpbnQgaTsKKworCWZpcnN0X3VnYSA9IE5VTEw7CisJbnJfdWdhcyA9IHNpemUgLyBzaXplb2YodTMyKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfdWdhczsgaSsrKSB7CiAJCWVmaV9ndWlkX3QgcGNpaW9fcHJvdG8gPSBFRklfUENJX0lPX1BST1RPQ09MX0dVSUQ7Ci0JCXZvaWQgKmhhbmRsZSA9IHVnYV9oYW5kbGVbaV07CiAJCXUzMiB3LCBoLCBkZXB0aCwgcmVmcmVzaDsKIAkJdm9pZCAqcGNpaW87CisJCXUzMiBoYW5kbGUgPSBoYW5kbGVzW2ldOwogCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKHN5c190YWJsZS0+Ym9vdHRpbWUtPmhhbmRsZV9wcm90b2NvbCwKLQkJCQkJaGFuZGxlLCB1Z2FfcHJvdG8sICZ1Z2EpOworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShoYW5kbGVfcHJvdG9jb2wsIGhhbmRsZSwKKwkJCQkJJnVnYV9wcm90bywgKHZvaWQgKiopJnVnYSk7CiAJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCQljb250aW51ZTsKIAotCQllZmlfY2FsbF9waHlzMyhzeXNfdGFibGUtPmJvb3R0aW1lLT5oYW5kbGVfcHJvdG9jb2wsCi0JCQkgICAgICAgaGFuZGxlLCAmcGNpaW9fcHJvdG8sICZwY2lpbyk7CisJCWVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaGFuZGxlLCAmcGNpaW9fcHJvdG8sICZwY2lpbyk7CiAKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czUodWdhLT5nZXRfbW9kZSwgdWdhLCAmdywgJmgsCi0JCQkJCSZkZXB0aCwgJnJlZnJlc2gpOworCQlzdGF0dXMgPSBlZmlfZWFybHktPmNhbGwoKHVuc2lnbmVkIGxvbmcpdWdhLT5nZXRfbW9kZSwgdWdhLAorCQkJCQkgJncsICZoLCAmZGVwdGgsICZyZWZyZXNoKTsKIAkJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUyAmJiAoIWZpcnN0X3VnYSB8fCBwY2lpbykpIHsKLQkJCXdpZHRoID0gdzsKLQkJCWhlaWdodCA9IGg7CisJCQkqd2lkdGggPSB3OworCQkJKmhlaWdodCA9IGg7CiAKIAkJCS8qCiAJCQkgKiBPbmNlIHdlJ3ZlIGZvdW5kIGEgVUdBIHN1cHBvcnRpbmcgUENJSU8sCkBAIC0zNjUsNyArODgxLDg0IEBACiAJCX0KIAl9CiAKLQlpZiAoIWZpcnN0X3VnYSkKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitzZXR1cF91Z2E2NCh2b2lkICoqdWdhX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKK3sKKwlzdHJ1Y3QgZWZpX3VnYV9kcmF3X3Byb3RvY29sICp1Z2EgPSBOVUxMLCAqZmlyc3RfdWdhOworCWVmaV9ndWlkX3QgdWdhX3Byb3RvID0gRUZJX1VHQV9QUk9UT0NPTF9HVUlEOworCXVuc2lnbmVkIGxvbmcgbnJfdWdhczsKKwl1NjQgKmhhbmRsZXMgPSAodTY0ICopdWdhX2hhbmRsZTs7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwlpbnQgaTsKKworCWZpcnN0X3VnYSA9IE5VTEw7CisJbnJfdWdhcyA9IHNpemUgLyBzaXplb2YodTY0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfdWdhczsgaSsrKSB7CisJCWVmaV9ndWlkX3QgcGNpaW9fcHJvdG8gPSBFRklfUENJX0lPX1BST1RPQ09MX0dVSUQ7CisJCXUzMiB3LCBoLCBkZXB0aCwgcmVmcmVzaDsKKwkJdm9pZCAqcGNpaW87CisJCXU2NCBoYW5kbGUgPSBoYW5kbGVzW2ldOworCisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaGFuZGxlLAorCQkJCQkmdWdhX3Byb3RvLCAodm9pZCAqKikmdWdhKTsKKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCisJCWVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaGFuZGxlLCAmcGNpaW9fcHJvdG8sICZwY2lpbyk7CisKKwkJc3RhdHVzID0gZWZpX2Vhcmx5LT5jYWxsKCh1bnNpZ25lZCBsb25nKXVnYS0+Z2V0X21vZGUsIHVnYSwKKwkJCQkJICZ3LCAmaCwgJmRlcHRoLCAmcmVmcmVzaCk7CisJCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgJiYgKCFmaXJzdF91Z2EgfHwgcGNpaW8pKSB7CisJCQkqd2lkdGggPSB3OworCQkJKmhlaWdodCA9IGg7CisKKwkJCS8qCisJCQkgKiBPbmNlIHdlJ3ZlIGZvdW5kIGEgVUdBIHN1cHBvcnRpbmcgUENJSU8sCisJCQkgKiBkb24ndCBib3RoZXIgbG9va2luZyBhbnkgZnVydGhlci4KKwkJCSAqLworCQkJaWYgKHBjaWlvKQorCQkJCWJyZWFrOworCisJCQlmaXJzdF91Z2EgPSB1Z2E7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogU2VlIGlmIHdlIGhhdmUgVW5pdmVyc2FsIEdyYXBoaWNzIEFkYXB0ZXIgKFVHQSkgcHJvdG9jb2wKKyAqLworc3RhdGljIGVmaV9zdGF0dXNfdCBzZXR1cF91Z2Eoc3RydWN0IHNjcmVlbl9pbmZvICpzaSwgZWZpX2d1aWRfdCAqdWdhX3Byb3RvLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIHdpZHRoLCBoZWlnaHQ7CisJdm9pZCAqKnVnYV9oYW5kbGUgPSBOVUxMOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLAorCQkJCXNpemUsICh2b2lkICoqKSZ1Z2FfaGFuZGxlKTsKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkobG9jYXRlX2hhbmRsZSwKKwkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLAorCQkJCXVnYV9wcm90bywgTlVMTCwgJnNpemUsIHVnYV9oYW5kbGUpOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZnJlZV9oYW5kbGU7CisKKwloZWlnaHQgPSAwOworCXdpZHRoID0gMDsKKworCWlmIChlZmlfZWFybHktPmlzNjQpCisJCXN0YXR1cyA9IHNldHVwX3VnYTY0KHVnYV9oYW5kbGUsIHNpemUsICZ3aWR0aCwgJmhlaWdodCk7CisJZWxzZQorCQlzdGF0dXMgPSBzZXR1cF91Z2EzMih1Z2FfaGFuZGxlLCBzaXplLCAmd2lkdGgsICZoZWlnaHQpOworCisJaWYgKCF3aWR0aCAmJiAhaGVpZ2h0KQogCQlnb3RvIGZyZWVfaGFuZGxlOwogCiAJLyogRUZJIGZyYW1lYnVmZmVyICovCkBAIC0zODQsOSArOTc3LDggQEAKIAlzaS0+cnN2ZF9zaXplID0gODsKIAlzaS0+cnN2ZF9wb3MgPSAyNDsKIAotCiBmcmVlX2hhbmRsZToKLQllZmlfY2FsbF9waHlzMShzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIHVnYV9oYW5kbGUpOworCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgdWdhX2hhbmRsZSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDA0LDI5ICs5OTYsMjggQEAKIAltZW1zZXQoc2ksIDAsIHNpemVvZigqc2kpKTsKIAogCXNpemUgPSAwOwotCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM1KHN5c190YWJsZS0+Ym9vdHRpbWUtPmxvY2F0ZV9oYW5kbGUsCi0JCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwgJmdyYXBoaWNzX3Byb3RvLAotCQkJCU5VTEwsICZzaXplLCBnb3BfaGFuZGxlKTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShsb2NhdGVfaGFuZGxlLAorCQkJCUVGSV9MT0NBVEVfQllfUFJPVE9DT0wsCisJCQkJJmdyYXBoaWNzX3Byb3RvLCBOVUxMLCAmc2l6ZSwgZ29wX2hhbmRsZSk7CiAJaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkKIAkJc3RhdHVzID0gc2V0dXBfZ29wKHNpLCAmZ3JhcGhpY3NfcHJvdG8sIHNpemUpOwogCiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewogCQlzaXplID0gMDsKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czUoc3lzX3RhYmxlLT5ib290dGltZS0+bG9jYXRlX2hhbmRsZSwKLQkJCQkJRUZJX0xPQ0FURV9CWV9QUk9UT0NPTCwgJnVnYV9wcm90bywKLQkJCQkJTlVMTCwgJnNpemUsIHVnYV9oYW5kbGUpOworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShsb2NhdGVfaGFuZGxlLAorCQkJCQlFRklfTE9DQVRFX0JZX1BST1RPQ09MLAorCQkJCQkmdWdhX3Byb3RvLCBOVUxMLCAmc2l6ZSwgdWdhX2hhbmRsZSk7CiAJCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpCiAJCQlzZXR1cF91Z2Eoc2ksICZ1Z2FfcHJvdG8sIHNpemUpOwogCX0KIH0KIAotCiAvKgogICogQmVjYXVzZSB0aGUgeDg2IGJvb3QgY29kZSBleHBlY3RzIHRvIGJlIHBhc3NlZCBhIGJvb3RfcGFyYW1zIHdlCiAgKiBuZWVkIHRvIGNyZWF0ZSBvbmUgb3Vyc2VsdmVzICh1c3VhbGx5IHRoZSBib290bG9hZGVyIHdvdWxkIGNyZWF0ZQogICogb25lIGZvciB1cykuCiAgKi8KLXN0cnVjdCBib290X3BhcmFtcyAqbWFrZV9ib290X3BhcmFtcyh2b2lkICpoYW5kbGUsIGVmaV9zeXN0ZW1fdGFibGVfdCAqX3RhYmxlKQorc3RydWN0IGJvb3RfcGFyYW1zICptYWtlX2Jvb3RfcGFyYW1zKHN0cnVjdCBlZmlfY29uZmlnICpjKQogewogCXN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wYXJhbXM7CiAJc3RydWN0IHN5c19kZXNjX3RhYmxlICpzZHQ7CkBAIC00MzQsNyArMTAyNSw3IEBACiAJc3RydWN0IHNldHVwX2hlYWRlciAqaGRyOwogCXN0cnVjdCBlZmlfaW5mbyAqZWZpOwogCWVmaV9sb2FkZWRfaW1hZ2VfdCAqaW1hZ2U7Ci0Jdm9pZCAqb3B0aW9uczsKKwl2b2lkICpvcHRpb25zLCAqaGFuZGxlOwogCWVmaV9ndWlkX3QgcHJvdG8gPSBMT0FERURfSU1BR0VfUFJPVE9DT0xfR1VJRDsKIAlpbnQgb3B0aW9uc19zaXplID0gMDsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwpAQCAtNDQ1LDE0ICsxMDM2LDIxIEBACiAJdW5zaWduZWQgbG9uZyByYW1kaXNrX2FkZHI7CiAJdW5zaWduZWQgbG9uZyByYW1kaXNrX3NpemU7CiAKLQlzeXNfdGFibGUgPSBfdGFibGU7CisJZWZpX2Vhcmx5ID0gYzsKKwlzeXNfdGFibGUgPSAoZWZpX3N5c3RlbV90YWJsZV90ICopKHVuc2lnbmVkIGxvbmcpZWZpX2Vhcmx5LT50YWJsZTsKKwloYW5kbGUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWVmaV9lYXJseS0+aW1hZ2VfaGFuZGxlOwogCiAJLyogQ2hlY2sgaWYgd2Ugd2VyZSBib290ZWQgYnkgdGhlIEVGSSBmaXJtd2FyZSAqLwogCWlmIChzeXNfdGFibGUtPmhkci5zaWduYXR1cmUgIT0gRUZJX1NZU1RFTV9UQUJMRV9TSUdOQVRVUkUpCiAJCXJldHVybiBOVUxMOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+aGFuZGxlX3Byb3RvY29sLAotCQkJCWhhbmRsZSwgJnByb3RvLCAodm9pZCAqKSZpbWFnZSk7CisJaWYgKGVmaV9lYXJseS0+aXM2NCkKKwkJc2V0dXBfYm9vdF9zZXJ2aWNlczY0KGVmaV9lYXJseSk7CisJZWxzZQorCQlzZXR1cF9ib290X3NlcnZpY2VzMzIoZWZpX2Vhcmx5KTsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGhhbmRsZV9wcm90b2NvbCwgaGFuZGxlLAorCQkJCSZwcm90bywgKHZvaWQgKikmaW1hZ2UpOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKIAkJZWZpX3ByaW50ayhzeXNfdGFibGUsICJGYWlsZWQgdG8gZ2V0IGhhbmRsZSBmb3IgTE9BREVEX0lNQUdFX1BST1RPQ09MXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC02NDEsMTQgKzEyMzksMTMgQEAKIAkJc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpICogbnJfZGVzYzsKIAogCWlmICgqZTgyMGV4dCkgewotCQllZmlfY2FsbF9waHlzMShzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wsICplODIwZXh0KTsKKwkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCAqZTgyMGV4dCk7CiAJCSplODIwZXh0ID0gTlVMTDsKIAkJKmU4MjBleHRfc2l6ZSA9IDA7CiAJfQogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQlFRklfTE9BREVSX0RBVEEsIHNpemUsIGU4MjBleHQpOwotCisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLAorCQkJCXNpemUsICh2b2lkICoqKWU4MjBleHQpOwogCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpCiAJCSplODIwZXh0X3NpemUgPSBzaXplOwogCkBAIC02NTYsMTIgKzEyNTMsMTMgQEAKIH0KIAogc3RhdGljIGVmaV9zdGF0dXNfdCBleGl0X2Jvb3Qoc3RydWN0IGJvb3RfcGFyYW1zICpib290X3BhcmFtcywKLQkJCSAgICAgIHZvaWQgKmhhbmRsZSkKKwkJCSAgICAgIHZvaWQgKmhhbmRsZSwgYm9vbCBpczY0KQogewogCXN0cnVjdCBlZmlfaW5mbyAqZWZpID0gJmJvb3RfcGFyYW1zLT5lZmlfaW5mbzsKIAl1bnNpZ25lZCBsb25nIG1hcF9zeiwga2V5LCBkZXNjX3NpemU7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1lbV9tYXA7CiAJc3RydWN0IHNldHVwX2RhdGEgKmU4MjBleHQ7CisJY29uc3QgY2hhciAqc2lnbmF0dXJlOwogCV9fdTMyIGU4MjBleHRfc2l6ZTsKIAlfX3UzMiBucl9kZXNjLCBwcmV2X25yX2Rlc2M7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKQEAgLTY5MSwxMSArMTI4OSwxMyBAQAogCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQkJZ290byBmcmVlX21lbV9tYXA7CiAKLQkJZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlLT5ib290dGltZS0+ZnJlZV9wb29sLCBtZW1fbWFwKTsKKwkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtZW1fbWFwKTsKIAkJZ290byBnZXRfbWFwOyAvKiBBbGxvY2F0ZWQgbWVtb3J5LCBnZXQgbWFwIGFnYWluICovCiAJfQogCi0JbWVtY3B5KCZlZmktPmVmaV9sb2FkZXJfc2lnbmF0dXJlLCBFRklfTE9BREVSX1NJR05BVFVSRSwgc2l6ZW9mKF9fdTMyKSk7CisJc2lnbmF0dXJlID0gaXM2NCA/IEVGSTY0X0xPQURFUl9TSUdOQVRVUkUgOiBFRkkzMl9MT0FERVJfU0lHTkFUVVJFOworCW1lbWNweSgmZWZpLT5lZmlfbG9hZGVyX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCBzaXplb2YoX191MzIpKTsKKwogCWVmaS0+ZWZpX3N5c3RhYiA9ICh1bnNpZ25lZCBsb25nKXN5c190YWJsZTsKIAllZmktPmVmaV9tZW1kZXNjX3NpemUgPSBkZXNjX3NpemU7CiAJZWZpLT5lZmlfbWVtZGVzY192ZXJzaW9uID0gZGVzY192ZXJzaW9uOwpAQCAtNzA4LDggKzEzMDgsNyBAQAogI2VuZGlmCiAKIAkvKiBNaWdodCBhcyB3ZWxsIGV4aXQgYm9vdCBzZXJ2aWNlcyBub3cgKi8KLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMihzeXNfdGFibGUtPmJvb3R0aW1lLT5leGl0X2Jvb3Rfc2VydmljZXMsCi0JCQkJaGFuZGxlLCBrZXkpOworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGV4aXRfYm9vdF9zZXJ2aWNlcywgaGFuZGxlLCBrZXkpOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKIAkJLyoKIAkJICogRXhpdEJvb3RTZXJ2aWNlcygpIHdpbGwgZmFpbCBpZiBhbnkgb2YgdGhlIGV2ZW50CkBAIC03MjIsNyArMTMyMSw3IEBACiAJCQlnb3RvIGZyZWVfbWVtX21hcDsKIAogCQljYWxsZWRfZXhpdCA9IHRydWU7Ci0JCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZS0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgbWVtX21hcCk7CisJCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbWVtX21hcCk7CiAJCWdvdG8gZ2V0X21hcDsKIAl9CiAKQEAgLTczNiwyMyArMTMzNSwzMSBAQAogCXJldHVybiBFRklfU1VDQ0VTUzsKIAogZnJlZV9tZW1fbWFwOgotCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZS0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwgbWVtX21hcCk7CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtZW1fbWFwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0KIC8qCiAgKiBPbiBzdWNjZXNzIHdlIHJldHVybiBhIHBvaW50ZXIgdG8gYSBib290X3BhcmFtcyBzdHJ1Y3R1cmUsIGFuZCBOVUxMCiAgKiBvbiBmYWlsdXJlLgogICovCi1zdHJ1Y3QgYm9vdF9wYXJhbXMgKmVmaV9tYWluKHZvaWQgKmhhbmRsZSwgZWZpX3N5c3RlbV90YWJsZV90ICpfdGFibGUsCitzdHJ1Y3QgYm9vdF9wYXJhbXMgKmVmaV9tYWluKHN0cnVjdCBlZmlfY29uZmlnICpjLAogCQkJICAgICBzdHJ1Y3QgYm9vdF9wYXJhbXMgKmJvb3RfcGFyYW1zKQogewotCXN0cnVjdCBkZXNjX3B0ciAqZ2R0OworCXN0cnVjdCBkZXNjX3B0ciAqZ2R0ID0gTlVMTDsKIAllZmlfbG9hZGVkX2ltYWdlX3QgKmltYWdlOwogCXN0cnVjdCBzZXR1cF9oZWFkZXIgKmhkciA9ICZib290X3BhcmFtcy0+aGRyOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCXZvaWQgKmhhbmRsZTsKKwllZmlfc3lzdGVtX3RhYmxlX3QgKl90YWJsZTsKKwlib29sIGlzNjQ7CisKKwllZmlfZWFybHkgPSBjOworCisJX3RhYmxlID0gKGVmaV9zeXN0ZW1fdGFibGVfdCAqKSh1bnNpZ25lZCBsb25nKWVmaV9lYXJseS0+dGFibGU7CisJaGFuZGxlID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyllZmlfZWFybHktPmltYWdlX2hhbmRsZTsKKwlpczY0ID0gZWZpX2Vhcmx5LT5pczY0OwogCiAJc3lzX3RhYmxlID0gX3RhYmxlOwogCkBAIC03NjAsMTMgKzEzNjcsMTcgQEAKIAlpZiAoc3lzX3RhYmxlLT5oZHIuc2lnbmF0dXJlICE9IEVGSV9TWVNURU1fVEFCTEVfU0lHTkFUVVJFKQogCQlnb3RvIGZhaWw7CiAKKwlpZiAoaXM2NCkKKwkJc2V0dXBfYm9vdF9zZXJ2aWNlczY0KGVmaV9lYXJseSk7CisJZWxzZQorCQlzZXR1cF9ib290X3NlcnZpY2VzMzIoZWZpX2Vhcmx5KTsKKwogCXNldHVwX2dyYXBoaWNzKGJvb3RfcGFyYW1zKTsKIAogCXNldHVwX2VmaV9wY2koYm9vdF9wYXJhbXMpOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlLT5ib290dGltZS0+YWxsb2NhdGVfcG9vbCwKLQkJCQlFRklfTE9BREVSX0RBVEEsIHNpemVvZigqZ2R0KSwKLQkJCQkodm9pZCAqKikmZ2R0KTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wb29sLCBFRklfTE9BREVSX0RBVEEsCisJCQkJc2l6ZW9mKCpnZHQpLCAodm9pZCAqKikmZ2R0KTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CiAJCWVmaV9wcmludGsoc3lzX3RhYmxlLCAiRmFpbGVkIHRvIGFsbG9jIG1lbSBmb3IgZ2R0IHN0cnVjdHVyZVxuIik7CiAJCWdvdG8gZmFpbDsKQEAgLTc5Nyw3ICsxNDA4LDcgQEAKIAkJaGRyLT5jb2RlMzJfc3RhcnQgPSBiemltYWdlX2FkZHI7CiAJfQogCi0Jc3RhdHVzID0gZXhpdF9ib290KGJvb3RfcGFyYW1zLCBoYW5kbGUpOworCXN0YXR1cyA9IGV4aXRfYm9vdChib290X3BhcmFtcywgaGFuZGxlLCBpczY0KTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlnb3RvIGZhaWw7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9lYm9vdC5oIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmgKaW5kZXggODFiNmI2NS4uYzg4YzMxZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmgKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmgKQEAgLTM3LDYgKzM3LDI0IEBACiAJdTMyIHBpeGVsc19wZXJfc2Nhbl9saW5lOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfbW9kZV8zMiB7CisJdTMyIG1heF9tb2RlOworCXUzMiBtb2RlOworCXUzMiBpbmZvOworCXUzMiBzaXplX29mX2luZm87CisJdTY0IGZyYW1lX2J1ZmZlcl9iYXNlOworCXUzMiBmcmFtZV9idWZmZXJfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfZ3JhcGhpY3Nfb3V0cHV0X3Byb3RvY29sX21vZGVfNjQgeworCXUzMiBtYXhfbW9kZTsKKwl1MzIgbW9kZTsKKwl1NjQgaW5mbzsKKwl1NjQgc2l6ZV9vZl9pbmZvOworCXU2NCBmcmFtZV9idWZmZXJfYmFzZTsKKwl1NjQgZnJhbWVfYnVmZmVyX3NpemU7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF9tb2RlIHsKIAl1MzIgbWF4X21vZGU7CiAJdTMyIG1vZGU7CkBAIC00Niw2ICs2NCwyMCBAQAogCXVuc2lnbmVkIGxvbmcgZnJhbWVfYnVmZmVyX3NpemU7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF8zMiB7CisJdTMyIHF1ZXJ5X21vZGU7CisJdTMyIHNldF9tb2RlOworCXUzMiBibHQ7CisJdTMyIG1vZGU7Cit9OworCitzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbF82NCB7CisJdTY0IHF1ZXJ5X21vZGU7CisJdTY0IHNldF9tb2RlOworCXU2NCBibHQ7CisJdTY0IG1vZGU7Cit9OworCiBzdHJ1Y3QgZWZpX2dyYXBoaWNzX291dHB1dF9wcm90b2NvbCB7CiAJdm9pZCAqcXVlcnlfbW9kZTsKIAl1bnNpZ25lZCBsb25nIHNldF9tb2RlOwpAQCAtNTMsMTAgKzg1LDM4IEBACiAJc3RydWN0IGVmaV9ncmFwaGljc19vdXRwdXRfcHJvdG9jb2xfbW9kZSAqbW9kZTsKIH07CiAKK3N0cnVjdCBlZmlfdWdhX2RyYXdfcHJvdG9jb2xfMzIgeworCXUzMiBnZXRfbW9kZTsKKwl1MzIgc2V0X21vZGU7CisJdTMyIGJsdDsKK307CisKK3N0cnVjdCBlZmlfdWdhX2RyYXdfcHJvdG9jb2xfNjQgeworCXU2NCBnZXRfbW9kZTsKKwl1NjQgc2V0X21vZGU7CisJdTY0IGJsdDsKK307CisKIHN0cnVjdCBlZmlfdWdhX2RyYXdfcHJvdG9jb2wgewogCXZvaWQgKmdldF9tb2RlOwogCXZvaWQgKnNldF9tb2RlOwogCXZvaWQgKmJsdDsKIH07CiAKK3N0cnVjdCBlZmlfY29uZmlnIHsKKwl1NjQgaW1hZ2VfaGFuZGxlOworCXU2NCB0YWJsZTsKKwl1NjQgYWxsb2NhdGVfcG9vbDsKKwl1NjQgYWxsb2NhdGVfcGFnZXM7CisJdTY0IGdldF9tZW1vcnlfbWFwOworCXU2NCBmcmVlX3Bvb2w7CisJdTY0IGZyZWVfcGFnZXM7CisJdTY0IGxvY2F0ZV9oYW5kbGU7CisJdTY0IGhhbmRsZV9wcm90b2NvbDsKKwl1NjQgZXhpdF9ib290X3NlcnZpY2VzOworCXU2NCB0ZXh0X291dHB1dDsKKwllZmlfc3RhdHVzX3QgKCpjYWxsKSh1bnNpZ25lZCBsb25nLCAuLi4pOworCWJvb2wgaXM2NDsKK30gX19wYWNrZWQ7CisKICNlbmRpZiAvKiBCT09UX0NPTVBSRVNTRURfRUJPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2VmaV9zdHViXzY0LlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWZpX3N0dWJfNjQuUwppbmRleCBjZWRjNjBkLi43ZmYzNjMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWZpX3N0dWJfNjQuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWZpX3N0dWJfNjQuUwpAQCAtMSArMSwzMCBAQAorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KKwogI2luY2x1ZGUgIi4uLy4uL3BsYXRmb3JtL2VmaS9lZmlfc3R1Yl82NC5TIgorCisjaWZkZWYgQ09ORklHX0VGSV9NSVhFRAorCS5jb2RlNjQKKwkudGV4dAorRU5UUlkoZWZpNjRfdGh1bmspCisJcHVzaAklcmJwCisJcHVzaAklcmJ4CisKKwlzdWJxCSQxNiwgJXJzcAorCWxlYXEJZWZpX2V4aXQzMiglcmlwKSwgJXJheAorCW1vdmwJJWVheCwgOCglcnNwKQorCWxlYXEJZWZpX2dkdDY0KCVyaXApLCAlcmF4CisJbW92bAklZWF4LCA0KCVyc3ApCisJbW92bAklZWF4LCAyKCVyYXgpCQkvKiBGaXh1cCB0aGUgZ2R0IGJhc2UgYWRkcmVzcyAqLworCWxlYXEJZWZpMzJfYm9vdF9nZHQoJXJpcCksICVyYXgKKwltb3ZsCSVlYXgsICglcnNwKQorCisJY2FsbAlfX2VmaTY0X3RodW5rCisKKwlhZGRxCSQxNiwgJXJzcAorCXBvcAklcmJ4CisJcG9wCSVyYnAKKwlyZXQKK0VORFBST0MoZWZpNjRfdGh1bmspCisjZW5kaWYgLyogQ09ORklHX0VGSV9NSVhFRCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKaW5kZXggOTExNmFhYy4uZGU5ZDQyMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCkBAIC00MiwyNiArNDIsNTMgQEAKIEVOVFJZKGVmaV9wZV9lbnRyeSkKIAlhZGQJJDB4NCwgJWVzcAogCisJY2FsbAkxZgorMToJcG9wbAklZXNpCisJc3VibAkkMWIsICVlc2kKKworCXBvcGwJJWVjeAorCW1vdmwJJWVjeCwgZWZpMzJfY29uZmlnKCVlc2kpCS8qIEhhbmRsZSAqLworCXBvcGwJJWVjeAorCW1vdmwJJWVjeCwgZWZpMzJfY29uZmlnKzgoJWVzaSkJLyogRUZJIFN5c3RlbSB0YWJsZSBwb2ludGVyICovCisKKwkvKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkgKi8KKwlsZWFsCWVmaTMyX2NvbmZpZyglZXNpKSwgJWVheAorCWFkZAklZXNpLCA4OCglZWF4KQorCXB1c2hsCSVlYXgKKwogCWNhbGwJbWFrZV9ib290X3BhcmFtcwogCWNtcGwJJDAsICVlYXgKLQlqZQkxZgotCW1vdmwJMHg0KCVlc3ApLCAlZXNpCi0JbW92bAkoJWVzcCksICVlY3gKKwlqZQlmYWlsCisJcG9wbAklZWN4CiAJcHVzaGwJJWVheAotCXB1c2hsCSVlc2kKIAlwdXNobAklZWN4Ci0Jc3ViCSQweDQsICVlc3AKKwlqbXAJMmYJCS8qIFNraXAgZWZpX2NvbmZpZyBpbml0aWFsaXphdGlvbiAqLwogCi1FTlRSWShlZmlfc3R1Yl9lbnRyeSkKK0VOVFJZKGVmaTMyX3N0dWJfZW50cnkpCiAJYWRkCSQweDQsICVlc3AKKwlwb3BsCSVlY3gKKwlwb3BsCSVlZHgKKworCWNhbGwJMWYKKzE6CXBvcGwJJWVzaQorCXN1YmwJJDFiLCAlZXNpCisKKwltb3ZsCSVlY3gsIGVmaTMyX2NvbmZpZyglZXNpKQkvKiBIYW5kbGUgKi8KKwltb3ZsCSVlZHgsIGVmaTMyX2NvbmZpZys4KCVlc2kpCS8qIEVGSSBTeXN0ZW0gdGFibGUgcG9pbnRlciAqLworCisJLyogUmVsb2NhdGUgZWZpX2NvbmZpZy0+Y2FsbCgpICovCisJbGVhbAllZmkzMl9jb25maWcoJWVzaSksICVlYXgKKwlhZGQJJWVzaSwgODgoJWVheCkKKwlwdXNobAklZWF4CisyOgogCWNhbGwJZWZpX21haW4KIAljbXBsCSQwLCAlZWF4CiAJbW92bAklZWF4LCAlZXNpCiAJam5lCTJmCi0xOgorZmFpbDoKIAkvKiBFRkkgaW5pdCBmYWlsZWQsIHNvIGhhbmcuICovCiAJaGx0Ci0Jam1wCTFiCisJam1wCWZhaWwKIDI6CiAJY2FsbAkzZgogMzoKQEAgLTIwMiw2ICsyMjksMTUgQEAKIAl4b3JsCSVlYngsICVlYngKIAlqbXAJKiVlYXgKIAorI2lmZGVmIENPTkZJR19FRklfU1RVQgorCS5kYXRhCitlZmkzMl9jb25maWc6CisJLmZpbGwgMTEsOCwwCisJLmxvbmcgZWZpX2NhbGxfcGh5cworCS5sb25nIDAKKwkuYnl0ZSAwCisjZW5kaWYKKwogLyoKICAqIFN0YWNrIGFuZCBoZWFwIGZvciB1bmNvbXByZXNzaW9uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCmluZGV4IGM1YzFhZTAuLjU3ZTU4YTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwpAQCAtMTEzLDcgKzExMyw4IEBACiAJbGdkdAlnZHQoJWVicCkKIAogCS8qIEVuYWJsZSBQQUUgbW9kZSAqLwotCW1vdmwJJChYODZfQ1I0X1BBRSksICVlYXgKKwltb3ZsCSVjcjQsICVlYXgKKwlvcmwJJFg4Nl9DUjRfUEFFLCAlZWF4CiAJbW92bAklZWF4LCAlY3I0CiAKICAvKgpAQCAtMTc4LDYgKzE3OSwxMyBAQAogCSAqLwogCXB1c2hsCSRfX0tFUk5FTF9DUwogCWxlYWwJc3RhcnR1cF82NCglZWJwKSwgJWVheAorI2lmZGVmIENPTkZJR19FRklfTUlYRUQKKwltb3ZsCWVmaTMyX2NvbmZpZyglZWJwKSwgJWVieAorCWNtcAkkMCwgJWVieAorCWp6CTFmCisJbGVhbAloYW5kb3Zlcl9lbnRyeSglZWJwKSwgJWVheAorMToKKyNlbmRpZgogCXB1c2hsCSVlYXgKIAogCS8qIEVudGVyIHBhZ2VkIHByb3RlY3RlZCBNb2RlLCBhY3RpdmF0aW5nIExvbmcgTW9kZSAqLwpAQCAtMTg4LDYgKzE5NiwzMCBAQAogCWxyZXQKIEVORFBST0Moc3RhcnR1cF8zMikKIAorI2lmZGVmIENPTkZJR19FRklfTUlYRUQKKwkub3JnIDB4MTkwCitFTlRSWShlZmkzMl9zdHViX2VudHJ5KQorCWFkZAkkMHg0LCAlZXNwCQkvKiBEaXNjYXJkIHJldHVybiBhZGRyZXNzICovCisJcG9wbAklZWN4CisJcG9wbAklZWR4CisJcG9wbAklZXNpCisKKwlsZWFsCShCUF9zY3JhdGNoKzQpKCVlc2kpLCAlZXNwCisJY2FsbAkxZgorMToJcG9wCSVlYnAKKwlzdWJsCSQxYiwgJWVicAorCisJbW92bAklZWN4LCBlZmkzMl9jb25maWcoJWVicCkKKwltb3ZsCSVlZHgsIGVmaTMyX2NvbmZpZys4KCVlYnApCisJc2dkdGwJZWZpMzJfYm9vdF9nZHQoJWVicCkKKworCWxlYWwJZWZpMzJfY29uZmlnKCVlYnApLCAlZWF4CisJbW92bAklZWF4LCBlZmlfY29uZmlnKCVlYnApCisKKwlqbXAJc3RhcnR1cF8zMgorRU5EUFJPQyhlZmkzMl9zdHViX2VudHJ5KQorI2VuZGlmCisKIAkuY29kZTY0CiAJLm9yZyAweDIwMAogRU5UUlkoc3RhcnR1cF82NCkKQEAgLTIwOSwyNiArMjQxLDQ4IEBACiAJam1wCXByZWZlcnJlZF9hZGRyCiAKIEVOVFJZKGVmaV9wZV9lbnRyeSkKLQltb3YJJXJjeCwgJXJkaQotCW1vdgklcmR4LCAlcnNpCi0JcHVzaHEJJXJkaQotCXB1c2hxCSVyc2kKKwltb3ZxCSVyY3gsIGVmaTY0X2NvbmZpZyglcmlwKQkvKiBIYW5kbGUgKi8KKwltb3ZxCSVyZHgsIGVmaTY0X2NvbmZpZys4KCVyaXApIC8qIEVGSSBTeXN0ZW0gdGFibGUgcG9pbnRlciAqLworCisJbGVhcQllZmk2NF9jb25maWcoJXJpcCksICVyYXgKKwltb3ZxCSVyYXgsIGVmaV9jb25maWcoJXJpcCkKKworCWNhbGwJMWYKKzE6CXBvcHEJJXJicAorCXN1YnEJJDFiLCAlcmJwCisKKwkvKgorCSAqIFJlbG9jYXRlIGVmaV9jb25maWctPmNhbGwoKS4KKwkgKi8KKwlhZGRxCSVyYnAsIGVmaTY0X2NvbmZpZys4OCglcmlwKQorCisJbW92cQklcmF4LCAlcmRpCiAJY2FsbAltYWtlX2Jvb3RfcGFyYW1zCiAJY21wcQkkMCwlcmF4Ci0JamUJMWYKLQltb3YJJXJheCwgJXJkeAotCXBvcHEJJXJzaQotCXBvcHEJJXJkaQorCWplCWZhaWwKKwltb3YJJXJheCwgJXJzaQorCWptcAkyZgkJLyogU2tpcCB0aGUgcmVsb2NhdGlvbiAqLwogCi1FTlRSWShlZmlfc3R1Yl9lbnRyeSkKK2hhbmRvdmVyX2VudHJ5OgorCWNhbGwJMWYKKzE6CXBvcHEJJXJicAorCXN1YnEJJDFiLCAlcmJwCisKKwkvKgorCSAqIFJlbG9jYXRlIGVmaV9jb25maWctPmNhbGwoKS4KKwkgKi8KKwltb3ZxCWVmaV9jb25maWcoJXJpcCksICVyYXgKKwlhZGRxCSVyYnAsIDg4KCVyYXgpCisyOgorCW1vdnEJZWZpX2NvbmZpZyglcmlwKSwgJXJkaQogCWNhbGwJZWZpX21haW4KIAltb3ZxCSVyYXgsJXJzaQogCWNtcHEJJDAsJXJheAogCWpuZQkyZgotMToKK2ZhaWw6CiAJLyogRUZJIGluaXQgZmFpbGVkLCBzbyBoYW5nLiAqLwogCWhsdAotCWptcAkxYgorCWptcAlmYWlsCiAyOgogCWNhbGwJM2YKIDM6CkBAIC0zMDcsNiArMzYxLDIwIEBACiAJbGVhcQlyZWxvY2F0ZWQoJXJieCksICVyYXgKIAlqbXAJKiVyYXgKIAorI2lmZGVmIENPTkZJR19FRklfU1RVQgorCS5vcmcgMHgzOTAKK0VOVFJZKGVmaTY0X3N0dWJfZW50cnkpCisJbW92cQklcmRpLCBlZmk2NF9jb25maWcoJXJpcCkJLyogSGFuZGxlICovCisJbW92cQklcnNpLCBlZmk2NF9jb25maWcrOCglcmlwKSAvKiBFRkkgU3lzdGVtIHRhYmxlIHBvaW50ZXIgKi8KKworCWxlYXEJZWZpNjRfY29uZmlnKCVyaXApLCAlcmF4CisJbW92cQklcmF4LCBlZmlfY29uZmlnKCVyaXApCisKKwltb3ZxCSVyZHgsICVyc2kKKwlqbXAJaGFuZG92ZXJfZW50cnkKK0VORFBST0MoZWZpNjRfc3R1Yl9lbnRyeSkKKyNlbmRpZgorCiAJLnRleHQKIHJlbG9jYXRlZDoKIApAQCAtMzcyLDYgKzQ0MCwyNSBAQAogCS5xdWFkICAgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIFRTIGNvbnRpbnVlZCAqLwogZ2R0X2VuZDoKIAorI2lmZGVmIENPTkZJR19FRklfU1RVQgorZWZpX2NvbmZpZzoKKwkucXVhZAkwCisKKyNpZmRlZiBDT05GSUdfRUZJX01JWEVECisJLmdsb2JhbCBlZmkzMl9jb25maWcKK2VmaTMyX2NvbmZpZzoKKwkuZmlsbAkxMSw4LDAKKwkucXVhZAllZmk2NF90aHVuaworCS5ieXRlCTAKKyNlbmRpZgorCisJLmdsb2JhbCBlZmk2NF9jb25maWcKK2VmaTY0X2NvbmZpZzoKKwkuZmlsbAkxMSw4LDAKKwkucXVhZAllZmlfY2FsbDYKKwkuYnl0ZQkxCisjZW5kaWYgLyogQ09ORklHX0VGSV9TVFVCICovCisKIC8qCiAgKiBTdGFjayBhbmQgaGVhcCBmb3IgdW5jb21wcmVzc2lvbgogICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCAxOTZlYWYzLi4xNzY4NDYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgIi4uL3N0cmluZy5oIgogCiAvKiBXQVJOSU5HISEKICAqIFRoaXMgY29kZSBpcyBjb21waWxlZCB3aXRoIC1mUElDIGFuZCBpdCBpcyByZWxvY2F0ZWQgZHluYW1pY2FsbHkKQEAgLTk3LDggKzk4LDE0IEBACiAgKi8KICNkZWZpbmUgU1RBVElDCQlzdGF0aWMKIAotI3VuZGVmIG1lbXNldAogI3VuZGVmIG1lbWNweQorCisvKgorICogVXNlIGEgbm9ybWFsIGRlZmluaXRpb24gb2YgbWVtc2V0KCkgZnJvbSBzdHJpbmcuYy4gVGhlcmUgYXJlIGFscmVhZHkKKyAqIGluY2x1ZGVkIGhlYWRlciBmaWxlcyB3aGljaCBleHBlY3QgYSBkZWZpbml0aW9uIG9mIG1lbXNldCgpIGFuZCBieQorICogdGhlIHRpbWUgd2UgZGVmaW5lIG1lbXNldCBtYWNybywgaXQgaXMgdG9vIGxhdGUuCisgKi8KKyN1bmRlZiBtZW1zZXQKICNkZWZpbmUgbWVtemVybyhzLCBuKQltZW1zZXQoKHMpLCAwLCAobikpCiAKIApAQCAtMTA5LDkgKzExNiw2IEBACiAgKi8KIHN0cnVjdCBib290X3BhcmFtcyAqcmVhbF9tb2RlOwkJLyogUG9pbnRlciB0byByZWFsLW1vZGUgZGF0YSAqLwogCi12b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsKLXZvaWQgKm1lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKTsKLQogbWVtcHRyIGZyZWVfbWVtX3B0cjsKIG1lbXB0ciBmcmVlX21lbV9lbmRfcHRyOwogCkBAIC0yMTYsNDUgKzIyMCw2IEBACiAJb3V0YigweGZmICYgKHBvcyA+PiAxKSwgdmlkcG9ydCsxKTsKIH0KIAotdm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgbikKLXsKLQlpbnQgaTsKLQljaGFyICpzcyA9IHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQlzc1tpXSA9IGM7Ci0JcmV0dXJuIHM7Ci19Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotdm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCi17Ci0JaW50IGQwLCBkMSwgZDI7Ci0JYXNtIHZvbGF0aWxlKAotCQkicmVwIDsgbW92c2xcblx0IgotCQkibW92bCAlNCwlJWVjeFxuXHQiCi0JCSJyZXAgOyBtb3ZzYlxuXHQiCi0JCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mUyIgKGQyKQotCQk6ICIwIiAobiA+PiAyKSwgImciIChuICYgMyksICIxIiAoZGVzdCksICIyIiAoc3JjKQotCQk6ICJtZW1vcnkiKTsKLQotCXJldHVybiBkZXN0OwotfQotI2Vsc2UKLXZvaWQgKm1lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQotewotCWxvbmcgZDAsIGQxLCBkMjsKLQlhc20gdm9sYXRpbGUoCi0JCSJyZXAgOyBtb3ZzcVxuXHQiCi0JCSJtb3ZxICU0LCUlcmN4XG5cdCIKLQkJInJlcCA7IG1vdnNiXG5cdCIKLQkJOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZTIiAoZDIpCi0JCTogIjAiIChuID4+IDMpLCAiZyIgKG4gJiA3KSwgIjEiIChkZXN0KSwgIjIiIChzcmMpCi0JCTogIm1lbW9yeSIpOwotCi0JcmV0dXJuIGRlc3Q7Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgZXJyb3IoY2hhciAqeCkKIHsKIAllcnJvcl9wdXRzdHIoIlxuXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9zdHJpbmcuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9zdHJpbmcuYwppbmRleCBmZmI5YzVjLi5mM2M1N2UzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jCkBAIC0xLDExICsxLDQ1IEBACiAjaW5jbHVkZSAibWlzYy5oIgotCi1pbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbikKLXsKLQl1OCBkaWZmOwotCWFzbSgicmVwZTsgY21wc2I7IHNldG56ICUwIgotCSAgICA6ICI9cW0iIChkaWZmKSwgIitEIiAoczEpLCAiK1MiIChzMiksICIrYyIgKGxlbikpOwotCXJldHVybiBkaWZmOwotfQotCiAjaW5jbHVkZSAiLi4vc3RyaW5nLmMiCisKKy8qIG1pc2MuaCBtaWdodCBwdWxsIGluIHN0cmluZ18zMi5oIHdoaWNoIGhhcyBhIG1hY3JvIGZvciBtZW1jcHkuIHVuZGVmIHRoYXQgKi8KKyN1bmRlZiBtZW1jcHkKKworI2lmZGVmIENPTkZJR19YODZfMzIKK3ZvaWQgKm1lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCWludCBkMCwgZDEsIGQyOworCWFzbSB2b2xhdGlsZSgKKwkJInJlcCA7IG1vdnNsXG5cdCIKKwkJIm1vdmwgJTQsJSVlY3hcblx0IgorCQkicmVwIDsgbW92c2Jcblx0IgorCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikKKwkJOiAiMCIgKG4gPj4gMiksICJnIiAobiAmIDMpLCAiMSIgKGRlc3QpLCAiMiIgKHNyYykKKwkJOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbHNlCit2b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwlsb25nIGQwLCBkMSwgZDI7CisJYXNtIHZvbGF0aWxlKAorCQkicmVwIDsgbW92c3Fcblx0IgorCQkibW92cSAlNCwlJXJjeFxuXHQiCisJCSJyZXAgOyBtb3ZzYlxuXHQiCisJCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mUyIgKGQyKQorCQk6ICIwIiAobiA+PiAzKSwgImciIChuICYgNyksICIxIiAoZGVzdCksICIyIiAoc3JjKQorCQk6ICJtZW1vcnkiKTsKKworCXJldHVybiBkZXN0OworfQorI2VuZGlmCisKK3ZvaWQgKm1lbXNldCh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJaW50IGk7CisJY2hhciAqc3MgPSBzOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJc3NbaV0gPSBjOworCXJldHVybiBzOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jcHVjaGVjay5jIGIvYXJjaC94ODYvYm9vdC9jcHVjaGVjay5jCmluZGV4IDEwMGE5YTEuLjFmZDdkNTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY3B1Y2hlY2suYworKysgYi9hcmNoL3g4Ni9ib290L2NwdWNoZWNrLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CiAjaW5jbHVkZSA8YXNtL3JlcXVpcmVkLWZlYXR1cmVzLmg+CiAjaW5jbHVkZSA8YXNtL21zci1pbmRleC5oPgorI2luY2x1ZGUgInN0cmluZy5oIgogCiBzdGF0aWMgdTMyIGVycl9mbGFnc1tOQ0FQSU5UU107CiAKQEAgLTY3LDYgKzY4LDEzIEBACiAJICAgICAgIGNwdV92ZW5kb3JbMl0gPT0gQTMyKCdNJywgJ3gnLCAnOCcsICc2Jyk7CiB9CiAKK3N0YXRpYyBpbnQgaXNfaW50ZWwodm9pZCkKK3sKKwlyZXR1cm4gY3B1X3ZlbmRvclswXSA9PSBBMzIoJ0cnLCAnZScsICduJywgJ3UnKSAmJgorCSAgICAgICBjcHVfdmVuZG9yWzFdID09IEEzMignaScsICduJywgJ2UnLCAnSScpICYmCisJICAgICAgIGNwdV92ZW5kb3JbMl0gPT0gQTMyKCduJywgJ3QnLCAnZScsICdsJyk7Cit9CisKIC8qIFJldHVybnMgYSBiaXRtYXNrIG9mIHdoaWNoIHdvcmRzIHdlIGhhdmUgZXJyb3IgYml0cyBpbiAqLwogc3RhdGljIGludCBjaGVja19jcHVmbGFncyh2b2lkKQogewpAQCAtMTUzLDYgKzE2MSwxOSBAQAogCQlhc20oIndybXNyIiA6IDogImEiIChlYXgpLCAiZCIgKGVkeCksICJjIiAoZWN4KSk7CiAKIAkJZXJyID0gY2hlY2tfY3B1ZmxhZ3MoKTsKKwl9IGVsc2UgaWYgKGVyciA9PSAweDAxICYmCisJCSAgICEoZXJyX2ZsYWdzWzBdICYgfigxIDw8IFg4Nl9GRUFUVVJFX1BBRSkpICYmCisJCSAgIGlzX2ludGVsKCkgJiYgY3B1LmxldmVsID09IDYgJiYKKwkJICAgKGNwdS5tb2RlbCA9PSA5IHx8IGNwdS5tb2RlbCA9PSAxMykpIHsKKwkJLyogUEFFIGlzIGRpc2FibGVkIG9uIHRoaXMgUGVudGl1bSBNIGJ1dCBjYW4gYmUgZm9yY2VkICovCisJCWlmIChjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woImZvcmNlcGFlIikpIHsKKwkJCXB1dHMoIldBUk5JTkc6IEZvcmNpbmcgUEFFIGluIENQVSBmbGFnc1xuIik7CisJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX1BBRSwgY3B1LmZsYWdzKTsKKwkJCWVyciA9IGNoZWNrX2NwdWZsYWdzKCk7CisJCX0KKwkJZWxzZSB7CisJCQlwdXRzKCJXQVJOSU5HOiBQQUUgZGlzYWJsZWQuIFVzZSBwYXJhbWV0ZXIgJ2ZvcmNlcGFlJyB0byBlbmFibGUgYXQgeW91ciBvd24gcmlzayFcbiIpOworCQl9CiAJfQogCiAJaWYgKGVycl9mbGFnc19wdHIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2VkZC5jIGIvYXJjaC94ODYvYm9vdC9lZGQuYwppbmRleCBjNTAxYTViLi4yMjNlNDI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2VkZC5jCisrKyBiL2FyY2gveDg2L2Jvb3QvZWRkLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgImJvb3QuaCIKICNpbmNsdWRlIDxsaW51eC9lZGQuaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX0VERCkgfHwgZGVmaW5lZChDT05GSUdfRUREX01PRFVMRSkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9oZWFkZXIuUyBiL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMKaW5kZXggZWMzYjhiYS4uMGNhOWE1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9oZWFkZXIuUworKysgYi9hcmNoL3g4Ni9ib290L2hlYWRlci5TCkBAIC0yODMsNyArMjgzLDcgQEAKIAkjIFBhcnQgMiBvZiB0aGUgaGVhZGVyLCBmcm9tIHRoZSBvbGQgc2V0dXAuUwogCiAJCS5hc2NpaQkiSGRyUyIJCSMgaGVhZGVyIHNpZ25hdHVyZQotCQkud29yZAkweDAyMGMJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCisJCS53b3JkCTB4MDIwZAkJIyBoZWFkZXIgdmVyc2lvbiBudW1iZXIgKD49IDB4MDEwNSkKIAkJCQkJIyBvciBlbHNlIG9sZCBsb2FkbGluLTEuNSB3aWxsIGZhaWwpCiAJCS5nbG9ibCByZWFsbW9kZV9zd3RjaAogcmVhbG1vZGVfc3d0Y2g6CS53b3JkCTAsIDAJCSMgZGVmYXVsdF9zd2l0Y2gsIFNFVFVQU0VHCkBAIC0zNTAsNyArMzUwLDcgQEAKIAkJCQkJIyBjYW4gYmUgbG9jYXRlZCBhbnl3aGVyZSBpbgogCQkJCQkjIGxvdyBtZW1vcnkgMHgxMDAwMCBvciBoaWdoZXIuCiAKLXJhbWRpc2tfbWF4OgkubG9uZyAweDdmZmZmZmZmCitpbml0cmRfYWRkcl9tYXg6IC5sb25nIDB4N2ZmZmZmZmYKIAkJCQkJIyAoSGVhZGVyIHZlcnNpb24gMHgwMjAzIG9yIGxhdGVyKQogCQkJCQkjIFRoZSBoaWdoZXN0IHNhZmUgYWRkcmVzcyBmb3IKIAkJCQkJIyB0aGUgY29udGVudHMgb2YgYW4gaW5pdHJkCkBAIC0zNzUsNyArMzc1LDggQEAKICMgZGVmaW5lIFhMRjAgMAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19SRUxPQ0FUQUJMRSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorI2lmIGRlZmluZWQoQ09ORklHX1JFTE9DQVRBQkxFKSAmJiBkZWZpbmVkKENPTkZJR19YODZfNjQpICYmIFwKKwkhZGVmaW5lZChDT05GSUdfRUZJX01JWEVEKQogICAgLyoga2VybmVsL2Jvb3RfcGFyYW0vcmFtZGlzayBjb3VsZCBiZSBsb2FkZWQgYWJvdmUgNGcgKi8KICMgZGVmaW5lIFhMRjEgWExGX0NBTl9CRV9MT0FERURfQUJPVkVfNEcKICNlbHNlCkBAIC0zODMsMTAgKzM4NCwxNCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRUZJX1NUVUIKLSMgaWZkZWYgQ09ORklHX1g4Nl82NAotIyAgZGVmaW5lIFhMRjIzIFhMRl9FRklfSEFORE9WRVJfNjQJCS8qIDY0LWJpdCBFRkkgaGFuZG92ZXIgb2sgKi8KKyMgaWZkZWYgQ09ORklHX0VGSV9NSVhFRAorIyAgZGVmaW5lIFhMRjIzIChYTEZfRUZJX0hBTkRPVkVSXzMyfFhMRl9FRklfSEFORE9WRVJfNjQpCiAjIGVsc2UKLSMgIGRlZmluZSBYTEYyMyBYTEZfRUZJX0hBTkRPVkVSXzMyCQkvKiAzMi1iaXQgRUZJIGhhbmRvdmVyIG9rICovCisjICBpZmRlZiBDT05GSUdfWDg2XzY0CisjICAgZGVmaW5lIFhMRjIzIFhMRl9FRklfSEFORE9WRVJfNjQJCS8qIDY0LWJpdCBFRkkgaGFuZG92ZXIgb2sgKi8KKyMgIGVsc2UKKyMgICBkZWZpbmUgWExGMjMgWExGX0VGSV9IQU5ET1ZFUl8zMgkJLyogMzItYml0IEVGSSBoYW5kb3ZlciBvayAqLworIyAgZW5kaWYKICMgZW5kaWYKICNlbHNlCiAjIGRlZmluZSBYTEYyMyAwCkBAIC00MjYsMTMgKzQzMSw3IEBACiAjZGVmaW5lIElOSVRfU0laRSBWT19JTklUX1NJWkUKICNlbmRpZgogaW5pdF9zaXplOgkJLmxvbmcgSU5JVF9TSVpFCQkjIGtlcm5lbCBpbml0aWFsaXphdGlvbiBzaXplCi1oYW5kb3Zlcl9vZmZzZXQ6Ci0jaWZkZWYgQ09ORklHX0VGSV9TVFVCCi0gIAkJCS5sb25nIDB4MzAJCSMgb2Zmc2V0IHRvIHRoZSBoYW5kb3ZlcgotCQkJCQkJIyBwcm90b2NvbCBlbnRyeSBwb2ludAotI2Vsc2UKLQkJCS5sb25nIDAKLSNlbmRpZgoraGFuZG92ZXJfb2Zmc2V0OgkubG9uZyAwCQkJIyBGaWxsZWQgaW4gYnkgYnVpbGQuYwogCiAjIEVuZCBvZiBzZXR1cCBoZWFkZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9tYWluLmMgYi9hcmNoL3g4Ni9ib290L21haW4uYwppbmRleCBjZjYwODNkLi5mZDZjOWYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L21haW4uYworKysgYi9hcmNoL3g4Ni9ib290L21haW4uYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlICJib290LmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCiAKIHN0cnVjdCBib290X3BhcmFtcyBib290X3BhcmFtcyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3JlZ3MuYyBiL2FyY2gveDg2L2Jvb3QvcmVncy5jCmluZGV4IDk1ODAxOWIuLmMwZmIzNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvcmVncy5jCisrKyBiL2FyY2gveDg2L2Jvb3QvcmVncy5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJvb3QuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogdm9pZCBpbml0cmVncyhzdHJ1Y3QgYmlvc3JlZ3MgKnJlZykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMgYi9hcmNoL3g4Ni9ib290L3N0cmluZy5jCmluZGV4IDU3NGRlZGYuLjUzMzkwNDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMKKysrIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuYwpAQCAtMTQsNiArMTQsMjAgQEAKIAogI2luY2x1ZGUgImJvb3QuaCIKIAorLyoKKyAqIFRoaXMgZmlsZSBnZXRzIGluY2x1ZGVkIGluIGNvbXByZXNzZWQvc3RyaW5nLmMgd2hpY2ggbWlnaHQgcHVsbCBpbgorICogc3RyaW5nXzMyLmggYW5kIHdoaWNoIGluIHR1cm4gbWFwcyBtZW1jbXAgdG8gX19idWlsdGluX21lbWNtcCgpLiBVbmRvCisgKiB0aGF0IGZpcnN0LgorICovCisjdW5kZWYgbWVtY21wCitpbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbikKK3sKKwl1OCBkaWZmOworCWFzbSgicmVwZTsgY21wc2I7IHNldG56ICUwIgorCSAgICA6ICI9cW0iIChkaWZmKSwgIitEIiAoczEpLCAiK1MiIChzMiksICIrYyIgKGxlbikpOworCXJldHVybiBkaWZmOworfQorCiBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpCiB7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqczEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXN0cjE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3N0cmluZy5oIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjVlODIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIEJPT1RfU1RSSU5HX0gKKyNkZWZpbmUgQk9PVF9TVFJJTkdfSAorCisvKiBVbmRlZiBhbnkgb2YgdGhlc2UgbWFjcm9zIGNvbWluZyBmcm9tIHN0cmluZ18zMi5oLiAqLworI3VuZGVmIG1lbWNweQorI3VuZGVmIG1lbXNldAorI3VuZGVmIG1lbWNtcAorCit2b2lkICptZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pOwordm9pZCAqbWVtc2V0KHZvaWQgKmRzdCwgaW50IGMsIHNpemVfdCBsZW4pOworaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pOworCisvKgorICogQWNjZXNzIGJ1aWx0aW4gdmVyc2lvbiBieSBkZWZhdWx0LiBJZiBvbmUgbmVlZHMgdG8gdXNlIG9wdGltaXplZCB2ZXJzaW9uLAorICogZG8gInVuZGVmIG1lbWNweSIgaW4gLmMgZmlsZSBhbmQgbGluayBhZ2FpbnN0IHJpZ2h0IHN0cmluZy5jCisgKi8KKyNkZWZpbmUgbWVtY3B5KGQscyxsKSBfX2J1aWx0aW5fbWVtY3B5KGQscyxsKQorI2RlZmluZSBtZW1zZXQoZCxjLGwpIF9fYnVpbHRpbl9tZW1zZXQoZCxjLGwpCisjZGVmaW5lIG1lbWNtcAlfX2J1aWx0aW5fbWVtY21wCisKKyNlbmRpZiAvKiBCT09UX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3Rvb2xzL2J1aWxkLmMgYi9hcmNoL3g4Ni9ib290L3Rvb2xzL2J1aWxkLmMKaW5kZXggOGUxNWIyMi4uMWEyZjIxMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC90b29scy9idWlsZC5jCisrKyBiL2FyY2gveDg2L2Jvb3QvdG9vbHMvYnVpbGQuYwpAQCAtNTMsNyArNTMsOCBAQAogCiAjZGVmaW5lIFBFQ09GRl9SRUxPQ19SRVNFUlZFIDB4MjAKIAotdW5zaWduZWQgbG9uZyBlZmlfc3R1Yl9lbnRyeTsKK3Vuc2lnbmVkIGxvbmcgZWZpMzJfc3R1Yl9lbnRyeTsKK3Vuc2lnbmVkIGxvbmcgZWZpNjRfc3R1Yl9lbnRyeTsKIHVuc2lnbmVkIGxvbmcgZWZpX3BlX2VudHJ5OwogdW5zaWduZWQgbG9uZyBzdGFydHVwXzY0OwogCkBAIC0yMTksNiArMjIwLDUyIEBACiAJdXBkYXRlX3BlY29mZl9zZWN0aW9uX2hlYWRlcigiLnRleHQiLCB0ZXh0X3N0YXJ0LCB0ZXh0X3N6KTsKIH0KIAorc3RhdGljIGludCByZXNlcnZlX3BlY29mZl9yZWxvY19zZWN0aW9uKGludCBjKQoreworCS8qIFJlc2VydmUgMHgyMCBieXRlcyBmb3IgLnJlbG9jIHNlY3Rpb24gKi8KKwltZW1zZXQoYnVmK2MsIDAsIFBFQ09GRl9SRUxPQ19SRVNFUlZFKTsKKwlyZXR1cm4gUEVDT0ZGX1JFTE9DX1JFU0VSVkU7Cit9CisKK3N0YXRpYyB2b2lkIGVmaV9zdHViX2RlZmF1bHRzKHZvaWQpCit7CisJLyogRGVmYXVsdHMgZm9yIG9sZCBrZXJuZWwgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJZWZpX3BlX2VudHJ5ID0gMHgxMDsKKyNlbHNlCisJZWZpX3BlX2VudHJ5ID0gMHgyMTA7CisJc3RhcnR1cF82NCA9IDB4MjAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGVmaV9zdHViX2VudHJ5X3VwZGF0ZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGVmaTMyX3N0dWJfZW50cnk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLyogWWVzLCB0aGlzIGlzIHJlYWxseSBob3cgd2UgZGVmaW5lZCBpdCA6KCAqLworCWFkZHIgPSBlZmk2NF9zdHViX2VudHJ5IC0gMHgyMDA7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FRklfTUlYRUQKKwlpZiAoZWZpMzJfc3R1Yl9lbnRyeSAhPSBhZGRyKQorCQlkaWUoIjMyLWJpdCBhbmQgNjQtYml0IEVGSSBlbnRyeSBwb2ludHMgZG8gbm90IG1hdGNoXG4iKTsKKyNlbmRpZgorCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmYnVmWzB4MjY0XSk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfcGVjb2ZmX3NldHVwX2FuZF9yZWxvYyh1bnNpZ25lZCBpbnQgc2l6ZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfcGVjb2ZmX3RleHQodW5zaWduZWQgaW50IHRleHRfc3RhcnQsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZpbGVfc3opIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgZWZpX3N0dWJfZGVmYXVsdHModm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBlZmlfc3R1Yl9lbnRyeV91cGRhdGUodm9pZCkge30KKworc3RhdGljIGlubGluZSBpbnQgcmVzZXJ2ZV9wZWNvZmZfcmVsb2Nfc2VjdGlvbihpbnQgYykKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZiAvKiBDT05GSUdfRUZJX1NUVUIgKi8KIAogCkBAIC0yNTAsNyArMjk3LDggQEAKIAlwID0gKGNoYXIgKilidWY7CiAKIAl3aGlsZSAocCAmJiAqcCkgewotCQlQQVJTRV9aT0ZTKHAsIGVmaV9zdHViX2VudHJ5KTsKKwkJUEFSU0VfWk9GUyhwLCBlZmkzMl9zdHViX2VudHJ5KTsKKwkJUEFSU0VfWk9GUyhwLCBlZmk2NF9zdHViX2VudHJ5KTsKIAkJUEFSU0VfWk9GUyhwLCBlZmlfcGVfZW50cnkpOwogCQlQQVJTRV9aT0ZTKHAsIHN0YXJ0dXBfNjQpOwogCkBAIC0yNzEsMTUgKzMxOSw3IEBACiAJdm9pZCAqa2VybmVsOwogCXUzMiBjcmMgPSAweGZmZmZmZmZmVUw7CiAKLQkvKiBEZWZhdWx0cyBmb3Igb2xkIGtlcm5lbCAqLwotI2lmZGVmIENPTkZJR19YODZfMzIKLQllZmlfcGVfZW50cnkgPSAweDEwOwotCWVmaV9zdHViX2VudHJ5ID0gMHgzMDsKLSNlbHNlCi0JZWZpX3BlX2VudHJ5ID0gMHgyMTA7Ci0JZWZpX3N0dWJfZW50cnkgPSAweDIzMDsKLQlzdGFydHVwXzY0ID0gMHgyMDA7Ci0jZW5kaWYKKwllZmlfc3R1Yl9kZWZhdWx0cygpOwogCiAJaWYgKGFyZ2MgIT0gNSkKIAkJdXNhZ2UoKTsKQEAgLTMwMiwxMSArMzQyLDcgQEAKIAkJZGllKCJCb290IGJsb2NrIGhhc24ndCBnb3QgYm9vdCBmbGFnICgweEFBNTUpIik7CiAJZmNsb3NlKGZpbGUpOwogCi0jaWZkZWYgQ09ORklHX0VGSV9TVFVCCi0JLyogUmVzZXJ2ZSAweDIwIGJ5dGVzIGZvciAucmVsb2Mgc2VjdGlvbiAqLwotCW1lbXNldChidWYrYywgMCwgUEVDT0ZGX1JFTE9DX1JFU0VSVkUpOwotCWMgKz0gUEVDT0ZGX1JFTE9DX1JFU0VSVkU7Ci0jZW5kaWYKKwljICs9IHJlc2VydmVfcGVjb2ZmX3JlbG9jX3NlY3Rpb24oYyk7CiAKIAkvKiBQYWQgdW51c2VkIHNwYWNlIHdpdGggemVyb3MgKi8KIAlzZXR1cF9zZWN0b3JzID0gKGMgKyA1MTEpIC8gNTEyOwpAQCAtMzE1LDkgKzM1MSw3IEBACiAJaSA9IHNldHVwX3NlY3RvcnMqNTEyOwogCW1lbXNldChidWYrYywgMCwgaS1jKTsKIAotI2lmZGVmIENPTkZJR19FRklfU1RVQgogCXVwZGF0ZV9wZWNvZmZfc2V0dXBfYW5kX3JlbG9jKGkpOwotI2VuZGlmCiAKIAkvKiBTZXQgdGhlIGRlZmF1bHQgcm9vdCBkZXZpY2UgKi8KIAlwdXRfdW5hbGlnbmVkX2xlMTYoREVGQVVMVF9ST09UX0RFViwgJmJ1Zls1MDhdKTsKQEAgLTM0MiwxNCArMzc2LDkgQEAKIAlidWZbMHgxZjFdID0gc2V0dXBfc2VjdG9ycy0xOwogCXB1dF91bmFsaWduZWRfbGUzMihzeXNfc2l6ZSwgJmJ1ZlsweDFmNF0pOwogCi0jaWZkZWYgQ09ORklHX0VGSV9TVFVCCiAJdXBkYXRlX3BlY29mZl90ZXh0KHNldHVwX3NlY3RvcnMgKiA1MTIsIHN6ICsgaSArICgoc3lzX3NpemUgKiAxNikgLSBzeikpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl82NCAvKiBZZXMsIHRoaXMgaXMgcmVhbGx5IGhvdyB3ZSBkZWZpbmVkIGl0IDooICovCi0JZWZpX3N0dWJfZW50cnkgLT0gMHgyMDA7Ci0jZW5kaWYKLQlwdXRfdW5hbGlnbmVkX2xlMzIoZWZpX3N0dWJfZW50cnksICZidWZbMHgyNjRdKTsKLSNlbmRpZgorCWVmaV9zdHViX2VudHJ5X3VwZGF0ZSgpOwogCiAJY3JjID0gcGFydGlhbF9jcmMzMihidWYsIGksIGNyYyk7CiAJaWYgKGZ3cml0ZShidWYsIDEsIGksIGRlc3QpICE9IGkpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCmluZGV4IDExZThjNmUuLmJhM2UxMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCisrKyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiYm9vdC5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAjaW5jbHVkZSAidmVzYS5oIgorI2luY2x1ZGUgInN0cmluZy5oIgogCiAvKiBWRVNBIGluZm9ybWF0aW9uICovCiBzdGF0aWMgc3RydWN0IHZlc2FfZ2VuZXJhbF9pbmZvIHZnaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA3ZjY2OTg1Li40YWNkZGM0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC01LDMgKzUsNSBAQAogZ2VuaGRyLXkgKz0gdW5pc3RkX3gzMi5oCiAKIGdlbmVyaWMteSArPSBjbGtkZXYuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IG1jc19zcGlubG9jay5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKaW5kZXggMWQyMDkxYS4uMTliMGViYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaApAQCAtOTMsOSArOTMsNiBAQAogCXJldHVybiAwOwogfQogI2VuZGlmCi1leHRlcm4gdm9pZCB4YXBpY193YWl0X2ljcl9pZGxlKHZvaWQpOwotZXh0ZXJuIHUzMiBzYWZlX3hhcGljX3dhaXRfaWNyX2lkbGUodm9pZCk7Ci1leHRlcm4gdm9pZCB4YXBpY19pY3Jfd3JpdGUodTMyLCB1MzIpOwogZXh0ZXJuIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50KTsKIAogc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9hcGljX21lbV93cml0ZSh1MzIgcmVnLCB1MzIgdikKQEAgLTE4NCw3ICsxODEsNiBAQAogZXh0ZXJuIGludCB4MmFwaWNfcHJlZW5hYmxlZDsKIGV4dGVybiB2b2lkIGNoZWNrX3gyYXBpYyh2b2lkKTsKIGV4dGVybiB2b2lkIGVuYWJsZV94MmFwaWModm9pZCk7Ci1leHRlcm4gdm9pZCB4MmFwaWNfaWNyX3dyaXRlKHUzMiBsb3csIHUzMiBpZCk7CiBzdGF0aWMgaW5saW5lIGludCB4MmFwaWNfZW5hYmxlZCh2b2lkKQogewogCXU2NCBtc3I7CkBAIC0yMjEsNyArMjE3LDYgQEAKIHsKIH0KIAotI2RlZmluZQlub3gyYXBpYwkwCiAjZGVmaW5lCXgyYXBpY19wcmVlbmFibGVkIDAKICNkZWZpbmUJeDJhcGljX3N1cHBvcnRlZCgpCTAKICNlbmRpZgpAQCAtMzUxLDcgKzM0Niw3IEBACiAJaW50IHRyYW1wb2xpbmVfcGh5c19sb3c7CiAJaW50IHRyYW1wb2xpbmVfcGh5c19oaWdoOwogCi0Jdm9pZCAoKndhaXRfZm9yX2luaXRfZGVhc3NlcnQpKGF0b21pY190ICpkZWFzc2VydCk7CisJYm9vbCB3YWl0X2Zvcl9pbml0X2RlYXNzZXJ0OwogCXZvaWQgKCpzbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMpKHZvaWQpOwogCXZvaWQgKCppbnF1aXJlX3JlbW90ZV9hcGljKShpbnQgYXBpY2lkKTsKIApAQCAtNTE3LDEzICs1MTIsNiBAQAogZXh0ZXJuIGludCBkZWZhdWx0X2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IHBoeXNfYXBpY2lkKTsKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVmYXVsdF93YWl0X2Zvcl9pbml0X2RlYXNzZXJ0KGF0b21pY190ICpkZWFzc2VydCkKLXsKLQl3aGlsZSAoIWF0b21pY19yZWFkKGRlYXNzZXJ0KSkKLQkJY3B1X3JlbGF4KCk7Ci0JcmV0dXJuOwotfQotCiBleHRlcm4gdm9pZCBnZW5lcmljX2JpZ3NtcF9wcm9iZSh2b2lkKTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaAppbmRleCAxNmE1N2Y0Li5lZGE4MWRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmgKQEAgLTMsOCArMyw2IEBACiAjaWZuZGVmIF9BU01fWDg2X0NMT0NLU09VUkNFX0gKICNkZWZpbmUgX0FTTV9YODZfQ0xPQ0tTT1VSQ0VfSAogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCiAjZGVmaW5lIFZDTE9DS19OT05FIDAgIC8qIE5vIHZEU08gY2xvY2sgYXZhaWxhYmxlLgkqLwogI2RlZmluZSBWQ0xPQ0tfVFNDICAxICAvKiB2RFNPIHNob3VsZCB1c2UgdnJlYWRfdHNjLgkqLwogI2RlZmluZSBWQ0xPQ0tfSFBFVCAyICAvKiB2RFNPIHNob3VsZCB1c2UgdnJlYWRfaHBldC4JKi8KQEAgLTE0LDYgKzEyLDQgQEAKIAlpbnQgdmNsb2NrX21vZGU7CiB9OwogCi0jZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLwotCiAjZW5kaWYgLyogX0FTTV9YODZfQ0xPQ0tTT1VSQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCmluZGV4IGUwOTlmOTUuLmUyNjVmZjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfUEFUCQkoMCozMisxNikgLyogUGFnZSBBdHRyaWJ1dGUgVGFibGUgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUFNFMzYJKDAqMzIrMTcpIC8qIDM2LWJpdCBQU0VzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BOCQkoMCozMisxOCkgLyogUHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0xGTFNICSgwKjMyKzE5KSAvKiAiY2xmbHVzaCIgQ0xGTFVTSCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMVVNICSgwKjMyKzE5KSAvKiBDTEZMVVNIIGluc3RydWN0aW9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0RTCQkoMCozMisyMSkgLyogImR0cyIgRGVidWcgU3RvcmUgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQUNQSQkoMCozMisyMikgLyogQUNQSSB2aWEgTVNSICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01NWAkJKDAqMzIrMjMpIC8qIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLwpAQCAtMjE3LDkgKzIxNywxNCBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9JTlZQQ0lECSg5KjMyKzEwKSAvKiBJbnZhbGlkYXRlIFByb2Nlc3NvciBDb250ZXh0IElEICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1JUTQkJKDkqMzIrMTEpIC8qIFJlc3RyaWN0ZWQgVHJhbnNhY3Rpb25hbCBNZW1vcnkgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTVBYCQkoOSozMisxNCkgLyogTWVtb3J5IFByb3RlY3Rpb24gRXh0ZW5zaW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMkYJKDkqMzIrMTYpIC8qIEFWWC01MTIgRm91bmRhdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9SRFNFRUQJKDkqMzIrMTgpIC8qIFRoZSBSRFNFRUQgaW5zdHJ1Y3Rpb24gKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQURYCQkoOSozMisxOSkgLyogVGhlIEFEQ1ggYW5kIEFET1ggaW5zdHJ1Y3Rpb25zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1NNQVAJKDkqMzIrMjApIC8qIFN1cGVydmlzb3IgTW9kZSBBY2Nlc3MgUHJldmVudGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMVVNIT1BUCSg5KjMyKzIzKSAvKiBDTEZMVVNIT1BUIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMlBGCSg5KjMyKzI2KSAvKiBBVlgtNTEyIFByZWZldGNoICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMkVSCSg5KjMyKzI3KSAvKiBBVlgtNTEyIEV4cG9uZW50aWFsIGFuZCBSZWNpcHJvY2FsICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMkNECSg5KjMyKzI4KSAvKiBBVlgtNTEyIENvbmZsaWN0IERldGVjdGlvbiAqLwogCiAvKgogICogQlVHIHdvcmQocykKQEAgLTMxMyw3ICszMTgsNyBAQAogI2RlZmluZSBjcHVfaGFzX3BtbV9lbmFibGVkCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QTU1fRU4pCiAjZGVmaW5lIGNwdV9oYXNfZHMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9EUykKICNkZWZpbmUgY3B1X2hhc19wZWJzCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfUEVCUykKLSNkZWZpbmUgY3B1X2hhc19jbGZsdXNoCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFNIKQorI2RlZmluZSBjcHVfaGFzX2NsZmx1c2gJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIKQogI2RlZmluZSBjcHVfaGFzX2J0cwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0JUUykKICNkZWZpbmUgY3B1X2hhc19nYnBhZ2VzCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfR0JQQUdFUykKICNkZWZpbmUgY3B1X2hhc19hcmNoX3BlcmZtb24JYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikKQEAgLTU0MSw2ICs1NDYsMTMgQEAKICNkZWZpbmUgc3RhdGljX2NwdV9oYXNfYnVnKGJpdCkJc3RhdGljX2NwdV9oYXMoKGJpdCkpCiAjZGVmaW5lIGJvb3RfY3B1X2hhc19idWcoYml0KQljcHVfaGFzX2J1ZygmYm9vdF9jcHVfZGF0YSwgKGJpdCkpCiAKKyNkZWZpbmUgTUFYX0NQVV9GRUFUVVJFUwkoTkNBUElOVFMgKiAzMikKKyNkZWZpbmUgY3B1X2hhdmVfZmVhdHVyZQlib290X2NwdV9oYXMKKworI2RlZmluZSBDUFVfRkVBVFVSRV9UWVBFRk1UCSJ4ODYsdmVuJTA0WGZhbSUwNFhtb2QlMDRYIgorI2RlZmluZSBDUFVfRkVBVFVSRV9UWVBFVkFMCWJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciwgYm9vdF9jcHVfZGF0YS54ODYsIFwKKwkJCQlib290X2NwdV9kYXRhLng4Nl9tb2RlbAorCiAjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX0FTU0VNQkxZX18pICovCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9DUFVGRUFUVVJFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2OGFkNy4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaAppbmRleCBhY2Q4NmM4Li4wODY5NDM0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaApAQCAtMTksOSArMTksMTEgQEAKICAqLwogI2RlZmluZSBFRklfT0xEX01FTU1BUAkJRUZJX0FSQ0hfMQogCisjZGVmaW5lIEVGSTMyX0xPQURFUl9TSUdOQVRVUkUJIkVMMzIiCisjZGVmaW5lIEVGSTY0X0xPQURFUl9TSUdOQVRVUkUJIkVMNjQiCisKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAKLSNkZWZpbmUgRUZJX0xPQURFUl9TSUdOQVRVUkUJIkVMMzIiCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFzbWxpbmthZ2UgZWZpX2NhbGxfcGh5cyh2b2lkICosIC4uLik7CiAKQEAgLTU3LDggKzU5LDYgQEAKIAogI2Vsc2UgLyogIUNPTkZJR19YODZfMzIgKi8KIAotI2RlZmluZSBFRklfTE9BREVSX1NJR05BVFVSRQkiRUw2NCIKLQogZXh0ZXJuIHU2NCBlZmlfY2FsbDAodm9pZCAqZnApOwogZXh0ZXJuIHU2NCBlZmlfY2FsbDEodm9pZCAqZnAsIHU2NCBhcmcxKTsKIGV4dGVybiB1NjQgZWZpX2NhbGwyKHZvaWQgKmZwLCB1NjQgYXJnMSwgdTY0IGFyZzIpOwpAQCAtMTE5LDcgKzExOSw2IEBACiAjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogCiBleHRlcm4gaW50IGFkZF9lZmlfbWVtbWFwOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeDg2X2VmaV9mYWNpbGl0eTsKIGV4dGVybiBzdHJ1Y3QgZWZpX3NjcmF0Y2ggZWZpX3NjcmF0Y2g7CiBleHRlcm4gdm9pZCBlZmlfc2V0X2V4ZWN1dGFibGUoZWZpX21lbW9yeV9kZXNjX3QgKm1kLCBib29sIGV4ZWN1dGFibGUpOwogZXh0ZXJuIGludCBlZmlfbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uodm9pZCk7CkBAIC0xMzAsMTAgKzEyOSwxMiBAQAogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tYXBfcmVnaW9uKGVmaV9tZW1vcnlfZGVzY190ICptZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX21hcF9yZWdpb25fZml4ZWQoZWZpX21lbW9yeV9kZXNjX3QgKm1kKTsKIGV4dGVybiB2b2lkIGVmaV9zeW5jX2xvd19rZXJuZWxfbWFwcGluZ3Modm9pZCk7Ci1leHRlcm4gdm9pZCBlZmlfc2V0dXBfcGFnZV90YWJsZXModm9pZCk7CitleHRlcm4gaW50IGVmaV9zZXR1cF9wYWdlX3RhYmxlcyh1bnNpZ25lZCBsb25nIHBhX21lbW1hcCwgdW5zaWduZWQgbnVtX3BhZ2VzKTsKK2V4dGVybiB2b2lkIGVmaV9jbGVhbnVwX3BhZ2VfdGFibGVzKHVuc2lnbmVkIGxvbmcgcGFfbWVtbWFwLCB1bnNpZ25lZCBudW1fcGFnZXMpOwogZXh0ZXJuIHZvaWQgX19pbml0IG9sZF9tYXBfcmVnaW9uKGVmaV9tZW1vcnlfZGVzY190ICptZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgcnVudGltZV9jb2RlX3BhZ2VfbWtleGVjKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9ydW50aW1lX21rZXhlYyh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBlZmlfZHVtcF9wYWdldGFibGUodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX2FwcGx5X21lbW1hcF9xdWlya3Modm9pZCk7CiAKIHN0cnVjdCBlZmlfc2V0dXBfZGF0YSB7CkBAIC0xNTMsOCArMTU0LDQwIEBACiAJcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX1g4Nl82NCkgPT0gZWZpX2VuYWJsZWQoRUZJXzY0QklUKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGVmaV9ydW50aW1lX3N1cHBvcnRlZCh2b2lkKQoreworCWlmIChlZmlfaXNfbmF0aXZlKCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0VGSV9NSVhFRCkgJiYgIWVmaV9lbmFibGVkKEVGSV9PTERfTUVNTUFQKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIGV4dGVybiBzdHJ1Y3QgY29uc29sZSBlYXJseV9lZmlfY29uc29sZTsKIGV4dGVybiB2b2lkIHBhcnNlX2VmaV9zZXR1cCh1NjQgcGh5c19hZGRyLCB1MzIgZGF0YV9sZW4pOworCisjaWZkZWYgQ09ORklHX0VGSV9NSVhFRAorZXh0ZXJuIHZvaWQgZWZpX3RodW5rX3J1bnRpbWVfc2V0dXAodm9pZCk7CitleHRlcm4gZWZpX3N0YXR1c190IGVmaV90aHVua19zZXRfdmlydHVhbF9hZGRyZXNzX21hcCgKKwl2b2lkICpwaHlzX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwLAorCXVuc2lnbmVkIGxvbmcgbWVtb3J5X21hcF9zaXplLAorCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLAorCXUzMiBkZXNjcmlwdG9yX3ZlcnNpb24sCisJZWZpX21lbW9yeV9kZXNjX3QgKnZpcnR1YWxfbWFwKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZWZpX3RodW5rX3J1bnRpbWVfc2V0dXAodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgZWZpX3N0YXR1c190IGVmaV90aHVua19zZXRfdmlydHVhbF9hZGRyZXNzX21hcCgKKwl2b2lkICpwaHlzX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwLAorCXVuc2lnbmVkIGxvbmcgbWVtb3J5X21hcF9zaXplLAorCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLAorCXUzMiBkZXNjcmlwdG9yX3ZlcnNpb24sCisJZWZpX21lbW9yeV9kZXNjX3QgKnZpcnR1YWxfbWFwKQoreworCXJldHVybiBFRklfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBDT05GSUdfRUZJX01JWEVEICovCiAjZWxzZQogLyoKICAqIElGIEVGSSBpcyBub3QgY29uZmlndXJlZCwgaGF2ZSB0aGUgRUZJIGNhbGxzIHJldHVybiAtRU5PU1lTLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCA5Yzk5OWMxLi4yYzcxMTgyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMjgxLDE2ICsyODEsMTIgQEAKIAogI2RlZmluZSBTVEFDS19STkRfTUFTSyAoMHg3ZmYpCiAKLSNkZWZpbmUgVkRTT19ISUdIX0JBU0UJCShfX2ZpeF90b192aXJ0KEZJWF9WRFNPKSkKLQogI2RlZmluZSBBUkNIX0RMSU5GTwkJQVJDSF9ETElORk9fSUEzMih2ZHNvX2VuYWJsZWQpCiAKIC8qIHVwZGF0ZSBBVF9WRUNUT1JfU0laRV9BUkNIIGlmIHRoZSBudW1iZXIgb2YgTkVXX0FVWF9FTlQgZW50cmllcyBjaGFuZ2VzICovCiAKICNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KIAotI2RlZmluZSBWRFNPX0hJR0hfQkFTRQkJMHhmZmZmZTAwMFUgLyogQ09ORklHX0NPTVBBVF9WRFNPIGFkZHJlc3MgKi8KLQogLyogMUdCIGZvciA2NGJpdCwgOE1CIGZvciAzMmJpdCAqLwogI2RlZmluZSBTVEFDS19STkRfTUFTSyAodGVzdF90aHJlYWRfZmxhZyhUSUZfQUREUjMyKSA/IDB4N2ZmIDogMHgzZmZmZmYpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZml4bWFwLmgKaW5kZXggNzI1MmNkMy4uOGRjZDM1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZml4bWFwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZml4bWFwLmgKQEAgLTQwLDE1ICs0MCw4IEBACiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fRklYQUREUl9UT1A7CiAjZGVmaW5lIEZJWEFERFJfVE9QCSgodW5zaWduZWQgbG9uZylfX0ZJWEFERFJfVE9QKQotCi0jZGVmaW5lIEZJWEFERFJfVVNFUl9TVEFSVCAgICAgX19maXhfdG9fdmlydChGSVhfVkRTTykKLSNkZWZpbmUgRklYQUREUl9VU0VSX0VORCAgICAgICBfX2ZpeF90b192aXJ0KEZJWF9WRFNPIC0gMSkKICNlbHNlCiAjZGVmaW5lIEZJWEFERFJfVE9QCShWU1lTQ0FMTF9FTkQtUEFHRV9TSVpFKQotCi0vKiBPbmx5IGNvdmVycyAzMmJpdCB2c3lzY2FsbHMgY3VycmVudGx5LiBOZWVkIGFub3RoZXIgc2V0IGZvciA2NGJpdC4gKi8KLSNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUCSgodW5zaWduZWQgbG9uZylWU1lTQ0FMTDMyX1ZTWVNDQUxMKQotI2RlZmluZSBGSVhBRERSX1VTRVJfRU5ECShGSVhBRERSX1VTRVJfU1RBUlQgKyBQQUdFX1NJWkUpCiAjZW5kaWYKIAogCkBAIC03NCw3ICs2Nyw2IEBACiBlbnVtIGZpeGVkX2FkZHJlc3NlcyB7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCUZJWF9IT0xFLAotCUZJWF9WRFNPLAogI2Vsc2UKIAlWU1lTQ0FMTF9MQVNUX1BBR0UsCiAJVlNZU0NBTExfRklSU1RfUEFHRSA9IFZTWVNDQUxMX0xBU1RfUEFHRQpAQCAtOTgsMTIgKzkwLDYgQEAKIAlGSVhfSU9fQVBJQ19CQVNFXzAsCiAJRklYX0lPX0FQSUNfQkFTRV9FTkQgPSBGSVhfSU9fQVBJQ19CQVNFXzAgKyBNQVhfSU9fQVBJQ1MgLSAxLAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1g4Nl9WSVNXU19BUElDCi0JRklYX0NPX0NQVSwJLyogQ29iYWx0IHRpbWVyICovCi0JRklYX0NPX0FQSUMsCS8qIENvYmFsdCBBUElDIFJlZGlyZWN0aW9uIFRhYmxlICovCi0JRklYX0xJX1BDSUEsCS8qIExpdGhpdW0gUENJIEJyaWRnZSBBICovCi0JRklYX0xJX1BDSUIsCS8qIExpdGhpdW0gUENJIEJyaWRnZSBCICovCi0jZW5kaWYKIAlGSVhfUk9fSURULAkvKiBWaXJ0dWFsIG1hcHBpbmcgZm9yIHJlYWQtb25seSBJRFQgKi8KICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJRklYX0tNQVBfQkVHSU4sCS8qIHJlc2VydmVkIHB0ZSdzIGZvciB0ZW1wb3Jhcnkga2VybmVsIG1hcHBpbmdzICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mbG9wcHkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Zsb3BweS5oCmluZGV4IGQzZDc0NjkuLjFjN2VlZmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Zsb3BweS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Zsb3BweS5oCkBAIC0xNDUsMTAgKzE0NSwxMCBAQAogewogCWlmIChjYW5fdXNlX3ZpcnR1YWxfZG1hKQogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2hhcmRpbnQsCi0JCQkJICAgSVJRRl9ESVNBQkxFRCwgImZsb3BweSIsIE5VTEwpOworCQkJCSAgIDAsICJmbG9wcHkiLCBOVUxMKTsKIAllbHNlCiAJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaW50ZXJydXB0LAotCQkJCSAgIElSUUZfRElTQUJMRUQsICJmbG9wcHkiLCBOVUxMKTsKKwkJCQkgICAwLCAiZmxvcHB5IiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9tZW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oCmluZGV4IGFiMGFlMWEuLjIzMDg1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKQEAgLTMzLDYgKzMzLDkgQEAKICNpZmRlZiBDT05GSUdfWDg2X01DRV9USFJFU0hPTEQKIAl1bnNpZ25lZCBpbnQgaXJxX3RocmVzaG9sZF9jb3VudDsKICNlbmRpZgorI2lmIElTX0VOQUJMRUQoQ09ORklHX0hZUEVSVikgfHwgZGVmaW5lZChDT05GSUdfWEVOKQorCXVuc2lnbmVkIGludCBpcnFfaHZfY2FsbGJhY2tfY291bnQ7CisjZW5kaWYKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkIGlycV9jcHVzdGF0X3Q7CiAKIERFQ0xBUkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChpcnFfY3B1c3RhdF90LCBpcnFfc3RhdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oCmluZGV4IDY3ZDY5YjguLmEzMDdiNzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oCkBAIC05OCw3ICs5OCw2IEBACiAjZGVmaW5lIElPX0FQSUNfSVJRKHgpICgoKHgpID49IE5SX0lSUVNfTEVHQUNZKSB8fCAoKDE8PCh4KSkgJiBpb19hcGljX2lycXMpKQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9fYXBpY19pcnFzOwogCi1leHRlcm4gdm9pZCBpbml0X1ZJU1dTX0FQSUNfaXJxcyh2b2lkKTsKIGV4dGVybiB2b2lkIHNldHVwX0lPX0FQSUModm9pZCk7CiBleHRlcm4gdm9pZCBkaXNhYmxlX0lPX0FQSUModm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKaW5kZXggOGE5YjNlMi4uMWVjOTkwYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKQEAgLTExLDkgKzExLDYgQEAKICNpZmRlZiBDT05GSUdfTlVNQQogZXh0ZXJuIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW107CiAjZGVmaW5lIE5PREVfREFUQShuaWQpCShub2RlX2RhdGFbbmlkXSkKLQotI2luY2x1ZGUgPGFzbS9udW1hcS5oPgotCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAogI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjLmgKaW5kZXggM2U2YjQ5Mi4uZjVhNjE3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjLmgKQEAgLTI1LDEyICsyNSw2IEBACiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgZGVmX3RvX2JpZ3NtcDsKIAotI2lmZGVmIENPTkZJR19YODZfTlVNQVEKLWV4dGVybiBpbnQgbXBfYnVzX2lkX3RvX25vZGVbTUFYX01QX0JVU1NFU107Ci1leHRlcm4gaW50IG1wX2J1c19pZF90b19sb2NhbFtNQVhfTVBfQlVTU0VTXTsKLWV4dGVybiBpbnQgcXVhZF9sb2NhbF90b19tcF9idXNfaWQgW05SX0NQVVMvNF1bNF07Ci0jZW5kaWYKLQogI2Vsc2UgLyogQ09ORklHX1g4Nl82NDogKi8KIAogI2RlZmluZSBNQVhfTVBfQlVTU0VTCQkyNTYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zaHlwZXJ2LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc2h5cGVydi5oCmluZGV4IGNkOWM0MTkuLmMxNjMyMTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zaHlwZXJ2LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNoeXBlcnYuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX0FTTV9YODZfTVNIWVBFUl9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGFzbS9oeXBlcnYuaD4KIAogc3RydWN0IG1zX2h5cGVydl9pbmZvIHsKQEAgLTE2LDYgKzE3LDcgQEAKICNkZWZpbmUgdHJhY2VfaHlwZXJ2X2NhbGxiYWNrX3ZlY3RvciBoeXBlcnZfY2FsbGJhY2tfdmVjdG9yCiAjZW5kaWYKIHZvaWQgaHlwZXJ2X3ZlY3Rvcl9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXZvaWQgaHZfcmVnaXN0ZXJfdm1idXNfaGFuZGxlcihpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwordm9pZCBodl9zZXR1cF92bWJ1c19pcnEodm9pZCAoKmhhbmRsZXIpKHZvaWQpKTsKK3ZvaWQgaHZfcmVtb3ZlX3ZtYnVzX2lycSh2b2lkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oCmluZGV4IGUxMzliMTMuLmRlMzZmMjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oCkBAIC0yMTQsNiArMjE0LDggQEAKIAogc3RydWN0IG1zciAqbXNyc19hbGxvYyh2b2lkKTsKIHZvaWQgbXNyc19mcmVlKHN0cnVjdCBtc3IgKm1zcnMpOworaW50IG1zcl9zZXRfYml0KHUzMiBtc3IsIHU4IGJpdCk7CitpbnQgbXNyX2NsZWFyX2JpdCh1MzIgbXNyLCB1OCBiaXQpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogaW50IHJkbXNyX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgKmwsIHUzMiAqaCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCmluZGV4IDg2ZjkzMDEuLjVmMmZjNDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9OTUlfSAogI2RlZmluZSBfQVNNX1g4Nl9OTUlfSAogCisjaW5jbHVkZSA8bGludXgvaXJxX3dvcmsuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTM4LDYgKzM5LDggQEAKIHN0cnVjdCBubWlhY3Rpb24gewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlubWlfaGFuZGxlcl90CQloYW5kbGVyOworCXU2NAkJCW1heF9kdXJhdGlvbjsKKwlzdHJ1Y3QgaXJxX3dvcmsJCWlycV93b3JrOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCWNvbnN0IGNoYXIJCSpuYW1lOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFxLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hcS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2IzYzMyLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIFdyaXR0ZW4gYnk6IFBhdHJpY2lhIEdhdWdoZW4sIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiwgSUJNIENvcnAuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiBTZW5kIGZlZWRiYWNrIHRvIDxnb25lQHVzLmlibS5jb20+Ci0gKi8KLQotI2lmbmRlZiBfQVNNX1g4Nl9OVU1BUV9ICi0jZGVmaW5lIF9BU01fWDg2X05VTUFRX0gKLQotI2lmZGVmIENPTkZJR19YODZfTlVNQVEKLQotZXh0ZXJuIGludCBmb3VuZF9udW1hcTsKLWV4dGVybiBpbnQgbnVtYXFfbnVtYV9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBwY2lfbnVtYXFfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgKnhxdWFkX3BvcnRpbzsKLQotI2RlZmluZSBYUVVBRF9QT1JUSU9fQkFTRSAweGZlNDAwMDAwCi0jZGVmaW5lIFhRVUFEX1BPUlRJT19RVUFEIDB4NDAwMDAgIC8qIDI1NmsgcGVyIHF1YWQuICovCi0jZGVmaW5lIFhRVUFEX1BPUlRfQUREUihwb3J0LCBxdWFkKSAoeHF1YWRfcG9ydGlvICsgKFhRVUFEX1BPUlRJT19RVUFEKnF1YWQpICsgcG9ydCkKLQotLyoKLSAqIFNZU19DRkdfREFUQV9QUklWX0FERFIsIHN0cnVjdCBlYWNocXVhZG1lbSwgYW5kIHN0cnVjdCBzeXNfY2ZnX2RhdGEgYXJlIHRoZQotICovCi0jZGVmaW5lIFNZU19DRkdfREFUQV9QUklWX0FERFIJCTB4MDAwOWQwMDAgLyogcGxhY2UgZm9yIHNjZCBpbiBwcml2YXRlCi0JCQkJCQkgICAgICBxdWFkIHNwYWNlICovCi0KLS8qCi0gKiBDb21tdW5pY2F0aW9uIGFyZWEgZm9yIGVhY2ggcHJvY2Vzc29yIG9uIGx5bnhlci1wcm9jZXNzb3IgdGVzdHMuCi0gKgotICogTk9URTogSWYgeW91IGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGlzIGVhY2hwcm9jIHN0cnVjdHVyZSB5b3UgbmVlZAotICogICAgICAgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIGZvciBFQUNIX1FVQURfU0laRS4KLSAqLwotc3RydWN0IGVhY2hxdWFkbWVtIHsKLQl1bnNpZ25lZCBpbnQJcHJpdl9tZW1fc3RhcnQ7CQkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBwcml2YXRlIG1lbW9yeS4gKi8KLQkJCQkJCS8qIFRoaXMgaXMgYWx3YXlzIDAuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJcHJpdl9tZW1fc2l6ZTsJCS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgKi8KLQkJCQkJCS8qIHByaXZhdGUgbWVtb3J5LiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWxvd19zaHJkX21lbV9zdHJwX3N0YXJ0Oy8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyAqLwotCQkJCQkJLyogcXVhZCdzIGxvdyBzaGFyZWQgYmxvY2sgKi8KLQkJCQkJCS8qICh1bnRyYW5zbGF0ZWQpLiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWxvd19zaHJkX21lbV9zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgbG93IHNoYXJlZCBtZW1vcnkgKi8KLQkJCQkJCS8qICh1bnRyYW5zbGF0ZWQpLiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWxvd19zaHJkX21lbV9zaXplOwkvKiBTaXplIG9mIHRoaXMgcXVhZCdzIGxvdyAqLwotCQkJCQkJLyogc2hhcmVkIG1lbW9yeS4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlsbW1pb19jb3BiX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBsb2NhbCBtZW1vcnkgKi8KLQkJCQkJCS8qIG1hcHBlZCBJL08gaW4gdGhlICovCi0JCQkJCQkvKiBjb21wYXRpYmlsaXR5IE9QQi4gKi8KLQkJCQkJCS8qIEluIE1CLiAqLwotCXVuc2lnbmVkIGludAlsbW1pb19jb3BiX3NpemU7CS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgbG9jYWwgKi8KLQkJCQkJCS8qIG1lbW9yeSBtYXBwZWQgSS9PIGluIHRoZSAqLwotCQkJCQkJLyogY29tcGF0aWJpbGl0eSBPUEIuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJbG1taW9fbm9wYl9zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgbG9jYWwgbWVtb3J5ICovCi0JCQkJCQkvKiBtYXBwZWQgSS9PIGluIHRoZSAqLwotCQkJCQkJLyogbm9uLWNvbXBhdGliaWxpdHkgT1BCLiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CWxtbWlvX25vcGJfc2l6ZTsJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyBsb2NhbCAqLwotCQkJCQkJLyogbWVtb3J5IG1hcHBlZCBJL08gaW4gdGhlICovCi0JCQkJCQkvKiBub24tY29tcGF0aWJpbGl0eSBPUEIuICovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJaW9fYXBpY18wX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIEkvTyAqLwotCQkJCQkJLyogQVBJQyAwLiAqLwotCXVuc2lnbmVkIGludAlpb19hcGljXzBfc3o7CQkvKiBTaXplIEkvTyBBUElDIDAuICovCi0JdW5zaWduZWQgaW50CWlvX2FwaWNfMV9zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBJL08gKi8KLQkJCQkJCS8qIEFQSUMgMS4gKi8KLQl1bnNpZ25lZCBpbnQJaW9fYXBpY18xX3N6OwkJLyogU2l6ZSBJL08gQVBJQyAxLiAqLwotCXVuc2lnbmVkIGludAloaV9zaHJkX21lbV9zdGFydDsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzICovCi0JCQkJCQkvKiBxdWFkJ3MgaGlnaCBzaGFyZWQgbWVtb3J5LiovCi0JCQkJCQkvKiBJbiBNQi4gKi8KLQl1bnNpZ25lZCBpbnQJaGlfc2hyZF9tZW1fc2l6ZTsJLyogU2l6ZSBvZiB0aGlzIHF1YWQncyBoaWdoICovCi0JCQkJCQkvKiBzaGFyZWQgbWVtb3J5LiAqLwotCQkJCQkJLyogSW4gTUIuICovCi0JdW5zaWduZWQgaW50CW1wc190YWJsZV9hZGRyOwkJLyogQWRkcmVzcyBvZiB0aGlzIHF1YWQncyAqLwotCQkJCQkJLyogTVBTIHRhYmxlcyBmcm9tIEJJT1MsICovCi0JCQkJCQkvKiBpbiBzeXN0ZW0gc3BhY2UuKi8KLQl1bnNpZ25lZCBpbnQJbGNsX01EQ19waW9fYWRkcjsJLyogUG9ydC1JL08gYWRkcmVzcyBmb3IgKi8KLQkJCQkJCS8qIGxvY2FsIGFjY2VzcyBvZiBNREMuICovCi0JdW5zaWduZWQgaW50CXJtdF9NRENfbW1waW9fYWRkcjsJLyogTU0tUG9ydC1JL08gYWRkcmVzcyBmb3IgKi8KLQkJCQkJCS8qIHJlbW90ZSBhY2Nlc3Mgb2YgTURDLiAqLwotCXVuc2lnbmVkIGludAltbV9wb3J0X2lvX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBtZW1vcnkgbWFwcGVkIFBvcnQgKi8KLQkJCQkJCS8qIEkvTyBzcGFjZS4gKi8KLQl1bnNpZ25lZCBpbnQJbW1fcG9ydF9pb19zaXplOwkvKiBTaXplIG9mIHRoaXMgcXVhZCdzIG1lbW9yeSovCi0JCQkJCQkvKiBtYXBwZWQgUG9ydCBJL08gc3BhY2UuICovCi0JdW5zaWduZWQgaW50CW1tX3JtdF9pb19hcGljX3N0YXJ0OwkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBtZW1vcnkgbWFwcGVkICovCi0JCQkJCQkvKiByZW1vdGUgSS9PIEFQSUMgc3BhY2UuICovCi0JdW5zaWduZWQgaW50CW1tX3JtdF9pb19hcGljX3NpemU7CS8qIFNpemUgb2YgdGhpcyBxdWFkJ3MgbWVtb3J5Ki8KLQkJCQkJCS8qIG1hcHBlZCByZW1vdGUgSS9PIEFQSUMgKi8KLQkJCQkJCS8qIHNwYWNlLiAqLwotCXVuc2lnbmVkIGludAltbV9pc2Ffc3RhcnQ7CQkvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgKi8KLQkJCQkJCS8qIHF1YWQncyBtZW1vcnkgbWFwcGVkIElTQSAqLwotCQkJCQkJLyogc3BhY2UgKGNvbnRhaW5zIE1EQyAqLwotCQkJCQkJLyogbWVtb3J5IHNwYWNlKS4gKi8KLQl1bnNpZ25lZCBpbnQJbW1faXNhX3NpemU7CQkvKiBTaXplIG9mIHRoaXMgcXVhZCdzIG1lbW9yeSovCi0JCQkJCQkvKiBtYXBwZWQgSVNBIHNwYWNlIChjb250YWlucyovCi0JCQkJCQkvKiBNREMgbWVtb3J5IHNwYWNlKS4gKi8KLQl1bnNpZ25lZCBpbnQJcm10X3FtaV9hZGRyOwkJLyogUmVtb3RlIGFkZHIgdG8gYWNjZXNzIFFNSS4qLwotCXVuc2lnbmVkIGludAlsY2xfcW1pX2FkZHI7CQkvKiBMb2NhbCBhZGRyIHRvIGFjY2VzcyBRTUkuICovCi19OwotCi0vKgotICogTm90ZTogVGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBOT1QgYmUgY2hhbmdlZCB1bmxlc3MgdGhlIG11bHRpcHJvYyBhbmQKLSAqIE9TIGFyZSBjaGFuZ2VkIHRvIHJlZmxlY3QgdGhlIG5ldyBzdHJ1Y3R1cmUuCi0gKi8KLXN0cnVjdCBzeXNfY2ZnX2RhdGEgewotCXVuc2lnbmVkIGludAlxdWFkX2lkOwotCXVuc2lnbmVkIGludAlic3BfcHJvY19pZDsgLyogQm9vdCBTdHJhcCBQcm9jZXNzb3IgaW4gdGhpcyBxdWFkLiAqLwotCXVuc2lnbmVkIGludAlzY2RfdmVyc2lvbjsgLyogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyB0YWJsZS4gKi8KLQl1bnNpZ25lZCBpbnQJZmlyc3RfcXVhZF9pZDsKLQl1bnNpZ25lZCBpbnQJcXVhZHNfcHJlc2VudDMxXzA7IC8qIDEgYml0IGZvciBlYWNoIHF1YWQgKi8KLQl1bnNpZ25lZCBpbnQJcXVhZHNfcHJlc2VudDYzXzMyOyAvKiAxIGJpdCBmb3IgZWFjaCBxdWFkICovCi0JdW5zaWduZWQgaW50CWNvbmZpZ19mbGFnczsKLQl1bnNpZ25lZCBpbnQJYm9vdF9mbGFnczsKLQl1bnNpZ25lZCBpbnQJY3NyX3N0YXJ0X2FkZHI7IC8qIEFic29sdXRlIHZhbHVlIChub3QgaW4gTUIpICovCi0JdW5zaWduZWQgaW50CWNzcl9zaXplOyAvKiBBYnNvbHV0ZSB2YWx1ZSAobm90IGluIE1CKSAqLwotCXVuc2lnbmVkIGludAlsY2xfYXBpY19zdGFydF9hZGRyOyAvKiBBYnNvbHV0ZSB2YWx1ZSAobm90IGluIE1CKSAqLwotCXVuc2lnbmVkIGludAlsY2xfYXBpY19zaXplOyAvKiBBYnNvbHV0ZSB2YWx1ZSAobm90IGluIE1CKSAqLwotCXVuc2lnbmVkIGludAlsb3dfc2hyZF9tZW1fYmFzZTsgLyogMCBvciA1MTJNQiBvciAxR0IgKi8KLQl1bnNpZ25lZCBpbnQJbG93X3NocmRfbWVtX3F1YWRfb2Zmc2V0OyAvKiAwLDEyOE0sMjU2TSw1MTJNLDFHICovCi0JCQkJCS8qIG1heSBub3QgYmUgdG90YWxseSBwb3B1bGF0ZWQgKi8KLQl1bnNpZ25lZCBpbnQJc3BsaXRfbWVtX2VuYmw7IC8qIDAgZm9yIG5vIGxvdyBzaGFyZWQgbWVtb3J5ICovCi0JdW5zaWduZWQgaW50CW1taW9fc3o7IC8qIFNpemUgb2YgdG90YWwgc3lzdGVtIG1lbW9yeSBtYXBwZWQgSS9PICovCi0JCQkJIC8qIChpbiBNQikuICovCi0JdW5zaWduZWQgaW50CXF1YWRfc3Bpbl9sb2NrOyAvKiBTcGFyZSBsb2NhdGlvbiB1c2VkIGZvciBxdWFkICovCi0JCQkJCS8qIGJyaW5ndXAuICovCi0JdW5zaWduZWQgaW50CW5vbnplcm81NTsgLyogRm9yIGNoZWNrc3VtbWluZy4gKi8KLQl1bnNpZ25lZCBpbnQJbm9uemVyb2FhOyAvKiBGb3IgY2hlY2tzdW1taW5nLiAqLwotCXVuc2lnbmVkIGludAlzY2RfbWFnaWNfbnVtYmVyOwotCXVuc2lnbmVkIGludAlzeXN0ZW1fdHlwZTsKLQl1bnNpZ25lZCBpbnQJY2hlY2tzdW07Ci0JLyoKLQkgKgltZW1vcnkgY29uZmlndXJhdGlvbiBhcmVhIGZvciBlYWNoIHF1YWQKLQkgKi8KLQlzdHJ1Y3QJCWVhY2hxdWFkbWVtIGVxW01BWF9OVU1OT0RFU107CS8qIGluZGV4ZWQgYnkgcXVhZCBpZCAqLwotfTsKLQotdm9pZCBudW1hcV90c2NfZGlzYWJsZSh2b2lkKTsKLQotI2VuZGlmIC8qIENPTkZJR19YODZfTlVNQVEgKi8KLSNlbmRpZiAvKiBfQVNNX1g4Nl9OVU1BUV9IICovCi0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggMWFjNjExNC4uOTZhZTRmNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpLmgKQEAgLTI2LDExICsyNiw2IEBACiBleHRlcm4gaW50IG5vaW9hcGljcXVpcms7CiBleHRlcm4gaW50IG5vaW9hcGljcmVyb3V0ZTsKIAotLyogc2NhbiBhIGJ1cyBhZnRlciBhbGxvY2F0aW5nIGEgcGNpX3N5c2RhdGEgZm9yIGl0ICovCi1leHRlcm4gc3RydWN0IHBjaV9idXMgKnBjaV9zY2FuX2J1c19vbl9ub2RlKGludCBidXNubywgc3RydWN0IHBjaV9vcHMgKm9wcywKLQkJCQkJICAgIGludCBub2RlKTsKLWV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShpbnQgYnVzbm8pOwotCiAjaWZkZWYgQ09ORklHX1BDSQogCiAjaWZkZWYgQ09ORklHX1BDSV9ET01BSU5TCkBAIC03MCw3ICs2NSw3IEBACiAKIGV4dGVybiBpbnQgcGNpYmlvc19lbmFibGVkOwogdm9pZCBwY2liaW9zX2NvbmZpZ19pbml0KHZvaWQpOwotc3RydWN0IHBjaV9idXMgKnBjaWJpb3Nfc2Nhbl9yb290KGludCBidXMpOwordm9pZCBwY2liaW9zX3NjYW5fcm9vdChpbnQgYnVzKTsKIAogdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA1YWQzOGFkLi5iNDU5ZGRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0xNSw5ICsxNSwxMCBAQAogCSA6IChwcm90KSkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLQogI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgogCit2b2lkIHB0ZHVtcF93YWxrX3BnZF9sZXZlbChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHBnZF90ICpwZ2QpOworCiAvKgogICogWkVST19QQUdFIGlzIGEgZ2xvYmFsIHNoYXJlZCBwYWdlIHRoYXQgaXMgYWx3YXlzIHplcm86IHVzZWQKICAqIGZvciB6ZXJvLW1hcHBlZCBtZW1vcnkgYXJlYXMgZXRjLi4KQEAgLTQ0NSwyMCArNDQ2LDEwIEBACiAJcmV0dXJuIGEucHRlID09IGIucHRlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwdGV2YWxfcHJlc2VudChwdGV2YWxfdCBwdGV2YWwpCi17Ci0JLyoKLQkgKiBZZXMgTGludXMsIF9QQUdFX1BST1ROT05FID09IF9QQUdFX05VTUEuIEV4cHJlc3NpbmcgaXQgdGhpcwotCSAqIHdheSBjbGVhcmx5IHN0YXRlcyB0aGF0IHRoZSBpbnRlbnQgaXMgdGhhdCBwcm90bm9uZSBhbmQgbnVtYQotCSAqIGhpbnRpbmcgcHRlcyBhcmUgY29uc2lkZXJlZCBwcmVzZW50IGZvciB0aGUgcHVycG9zZXMgb2YKLQkgKiBwYWdldGFibGUgb3BlcmF0aW9ucyBsaWtlIHphcHBpbmcsIHByb3RlY3Rpb24gY2hhbmdlcywgZ3VwIGV0Yy4KLQkgKi8KLQlyZXR1cm4gcHRldmFsICYgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9QUk9UTk9ORSB8IF9QQUdFX05VTUEpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVfcHJlc2VudChwdGVfdCBhKQogewotCXJldHVybiBwdGV2YWxfcHJlc2VudChwdGVfZmxhZ3MoYSkpOworCXJldHVybiBwdGVfZmxhZ3MoYSkgJiAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1BST1ROT05FIHwKKwkJCSAgICAgICBfUEFHRV9OVU1BKTsKIH0KIAogI2RlZmluZSBwdGVfYWNjZXNzaWJsZSBwdGVfYWNjZXNzaWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCmluZGV4IDFhYTljY2QuLmViM2Q0NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKQEAgLTIxNCwxMyArMjE0LDggQEAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAjZGVmaW5lIF9fUEFHRV9LRVJORUxfSURFTlRfTEFSR0VfRVhFQwlfX1BBR0VfS0VSTkVMX0xBUkdFX0VYRUMKICNlbHNlCi0vKgotICogRm9yIFBERV9JREVOVF9BVFRSIGluY2x1ZGUgVVNFUiBiaXQuIEFzIHRoZSBQREUgYW5kIFBURSBwcm90ZWN0aW9uCi0gKiBiaXRzIGFyZSBjb21iaW5lZCwgdGhpcyB3aWxsIGFsb3cgdXNlciB0byBhY2Nlc3MgdGhlIGhpZ2ggYWRkcmVzcyBtYXBwZWQKLSAqIFZEU08gaW4gdGhlIHByZXNlbmNlIG9mIENPTkZJR19DT01QQVRfVkRTTwotICovCiAjZGVmaW5lIFBURV9JREVOVF9BVFRSCSAweDAwMwkJLyogUFJFU0VOVCtSVyAqLwotI2RlZmluZSBQREVfSURFTlRfQVRUUgkgMHgwNjcJCS8qIFBSRVNFTlQrUlcrVVNFUitESVJUWStBQ0NFU1NFRCAqLworI2RlZmluZSBQREVfSURFTlRfQVRUUgkgMHgwNjMJCS8qIFBSRVNFTlQrUlcrRElSVFkrQUNDRVNTRUQgKi8KICNkZWZpbmUgUEdEX0lERU5UX0FUVFIJIDB4MDAxCQkvKiBQUkVTRU5UIChubyBvdGhlciBhdHRyaWJ1dGVzKSAqLwogI2VuZGlmCiAKQEAgLTM4Miw5ICszNzcsMTMgQEAKICAqIGFzIGEgcHRlIHRvby4KICAqLwogZXh0ZXJuIHB0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCAqbGV2ZWwpOworZXh0ZXJuIHB0ZV90ICpsb29rdXBfYWRkcmVzc19pbl9wZ2QocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKmxldmVsKTsKIGV4dGVybiBwaHlzX2FkZHJfdCBzbG93X3ZpcnRfdG9fcGh5cyh2b2lkICpfX2FkZHJlc3MpOwogZXh0ZXJuIGludCBrZXJuZWxfbWFwX3BhZ2VzX2luX3BnZChwZ2RfdCAqcGdkLCB1NjQgcGZuLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJICAgdW5zaWduZWQgbnVtcGFnZXMsIHVuc2lnbmVkIGxvbmcgcGFnZV9mbGFncyk7Cit2b2lkIGtlcm5lbF91bm1hcF9wYWdlc19pbl9wZ2QocGdkX3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCSAgICAgICB1bnNpZ25lZCBudW1wYWdlcyk7CiAjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX0FTTV9YODZfUEdUQUJMRV9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggZmRlZGQzOC4uYTRlYTAyMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTQ0OSw2ICs0NDksMTUgQEAKIH07CiBERUNMQVJFX1BFUl9DUFVfQUxJR05FRChzdHJ1Y3Qgc3RhY2tfY2FuYXJ5LCBzdGFja19jYW5hcnkpOwogI2VuZGlmCisvKgorICogcGVyLUNQVSBJUlEgaGFuZGxpbmcgc3RhY2tzCisgKi8KK3N0cnVjdCBpcnFfc3RhY2sgeworCXUzMiAgICAgICAgICAgICAgICAgICAgIHN0YWNrW1RIUkVBRF9TSVpFL3NpemVvZih1MzIpXTsKK30gX19hbGlnbmVkKFRIUkVBRF9TSVpFKTsKKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBpcnFfc3RhY2sgKiwgaGFyZGlycV9zdGFjayk7CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IGlycV9zdGFjayAqLCBzb2Z0aXJxX3N0YWNrKTsKICNlbmRpZgkvKiBYODZfNjQgKi8KIAogZXh0ZXJuIHVuc2lnbmVkIGludCB4c3RhdGVfc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGQ2MmM5ZjguLjkyNjRmMDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMzksMTIgKzM5LDYgQEAKIAogdm9pZCBzZXR1cF9iaW9zX2NvcnJ1cHRpb25fY2hlY2sodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X1ZJU1dTCi1leHRlcm4gdm9pZCB2aXN3c19lYXJseV9kZXRlY3Qodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHZpc3dzX2Vhcmx5X2RldGVjdCh2b2lkKSB7IH0KLSNlbmRpZgotCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzYXZlZF92aWRlb19tb2RlOwogCiBleHRlcm4gdm9pZCByZXNlcnZlX3N0YW5kYXJkX2lvX3Jlc291cmNlcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwZWNpYWxfaW5zbnMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwZWNpYWxfaW5zbnMuaAppbmRleCA2NDVjYWQyLi5lODIwYzA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGVjaWFsX2luc25zLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oCkBAIC0xOTEsNiArMTkxLDE0IEBACiAJYXNtIHZvbGF0aWxlKCJjbGZsdXNoICUwIiA6ICIrbSIgKCoodm9sYXRpbGUgY2hhciBfX2ZvcmNlICopX19wKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGZsdXNob3B0KHZvbGF0aWxlIHZvaWQgKl9fcCkKK3sKKwlhbHRlcm5hdGl2ZV9pbygiLmJ5dGUgIiBfX3N0cmluZ2lmeShOT1BfRFNfUFJFRklYKSAiOyBjbGZsdXNoICVQMCIsCisJCSAgICAgICAiLmJ5dGUgMHg2NjsgY2xmbHVzaCAlUDAiLAorCQkgICAgICAgWDg2X0ZFQVRVUkVfQ0xGTFVTSE9QVCwKKwkJICAgICAgICIrbSIgKCoodm9sYXRpbGUgY2hhciBfX2ZvcmNlICopX19wKSk7Cit9CisKICNkZWZpbmUgbm9wKCkgYXNtIHZvbGF0aWxlICgibm9wIikKIAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBlMTk0MGMwLi40N2U1ZGUyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BlcmNwdS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCiAvKgpAQCAtMzIsMTIgKzMzLDYgQEAKIAltbV9zZWdtZW50X3QJCWFkZHJfbGltaXQ7CiAJc3RydWN0IHJlc3RhcnRfYmxvY2sgICAgcmVzdGFydF9ibG9jazsKIAl2b2lkIF9fdXNlcgkJKnN5c2VudGVyX3JldHVybjsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgcHJldmlvdXNfZXNwOyAgIC8qIEVTUCBvZiB0aGUgcHJldmlvdXMgc3RhY2sgaW4KLQkJCQkJCSAgIGNhc2Ugb2YgbmVzdGVkIChJUlEpIHN0YWNrcwotCQkJCQkJKi8KLQlfX3U4CQkJc3VwZXJ2aXNvcl9zdGFja1swXTsKLSNlbmRpZgogCXVuc2lnbmVkIGludAkJc2lnX29uX3VhY2Nlc3NfZXJyb3I6MTsKIAl1bnNpZ25lZCBpbnQJCXVhY2Nlc3NfZXJyOjE7CS8qIHVhY2Nlc3MgZmFpbGVkICovCiB9OwpAQCAtMTUzLDkgKzE0OCw5IEBACiAjZGVmaW5lIF9USUZfV09SS19DVFhTV19QUkVWIChfVElGX1dPUktfQ1RYU1d8X1RJRl9VU0VSX1JFVFVSTl9OT1RJRlkpCiAjZGVmaW5lIF9USUZfV09SS19DVFhTV19ORVhUIChfVElGX1dPUktfQ1RYU1cpCiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCisjZGVmaW5lIFNUQUNLX1dBUk4JCShUSFJFQURfU0laRS84KQorI2RlZmluZSBLRVJORUxfU1RBQ0tfT0ZGU0VUCSg1KihCSVRTX1BFUl9MT05HLzgpKQogCi0jZGVmaW5lIFNUQUNLX1dBUk4JKFRIUkVBRF9TSVpFLzgpCiAvKgogICogbWFjcm9zL2Z1bmN0aW9ucyBmb3IgZ2FpbmluZyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKICAqCkBAIC0xNjMsNDIgKzE1OCw2IEBACiAgKi8KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNkZWZpbmUgY3VycmVudF9zdGFja19wb2ludGVyICh7CQlcCi0JdW5zaWduZWQgbG9uZyBzcDsJCQlcCi0JYXNtKCJtb3YgJSVlc3AsJTAiIDogIj1nIiAoc3ApKTsJXAotCXNwOwkJCQkJXAotfSkKLQotLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEMgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKLQkJKGN1cnJlbnRfc3RhY2tfcG9pbnRlciAmIH4oVEhSRUFEX1NJWkUgLSAxKSk7Ci19Ci0KLSNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KLQotLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEFTTSAqLwotI2RlZmluZSBHRVRfVEhSRUFEX0lORk8ocmVnKQkgXAotCW1vdmwgJC1USFJFQURfU0laRSwgcmVnOyBcCi0JYW5kbCAlZXNwLCByZWcKLQotLyogdXNlIHRoaXMgb25lIGlmIHJlZyBhbHJlYWR5IGNvbnRhaW5zICVlc3AgKi8KLSNkZWZpbmUgR0VUX1RIUkVBRF9JTkZPX1dJVEhfRVNQKHJlZykgXAotCWFuZGwgJC1USFJFQURfU0laRSwgcmVnCi0KLSNlbmRpZgotCi0jZWxzZSAvKiBYODZfMzIgKi8KLQotI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KLSNkZWZpbmUgS0VSTkVMX1NUQUNLX09GRlNFVCAoNSo4KQotCi0vKgotICogbWFjcm9zL2Z1bmN0aW9ucyBmb3IgZ2FpbmluZyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSAqIHByZWVtcHRfY291bnQgbmVlZHMgdG8gYmUgMSBpbml0aWFsbHksIHVudGlsIHRoZSBzY2hlZHVsZXIgaXMgZnVuY3Rpb25hbC4KLSAqLwotI2lmbmRlZiBfX0FTU0VNQkxZX18KIERFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBrZXJuZWxfc3RhY2spOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQpAQCAtMjEzLDggKzE3Miw4IEBACiAKIC8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBBU00gKi8KICNkZWZpbmUgR0VUX1RIUkVBRF9JTkZPKHJlZykgXAotCW1vdnEgUEVSX0NQVV9WQVIoa2VybmVsX3N0YWNrKSxyZWcgOyBcCi0Jc3VicSAkKFRIUkVBRF9TSVpFLUtFUk5FTF9TVEFDS19PRkZTRVQpLHJlZworCV9BU01fTU9WIFBFUl9DUFVfVkFSKGtlcm5lbF9zdGFjaykscmVnIDsgXAorCV9BU01fU1VCICQoVEhSRUFEX1NJWkUtS0VSTkVMX1NUQUNLX09GRlNFVCkscmVnIDsKIAogLyoKICAqIFNhbWUgaWYgUEVSX0NQVV9WQVIoa2VybmVsX3N0YWNrKSBpcywgcGVyaGFwcyB3aXRoIHNvbWUgb2Zmc2V0LCBhbHJlYWR5IGluCkBAIC0yMjQsOCArMTgzLDYgQEAKIAogI2VuZGlmCiAKLSNlbmRpZiAvKiAhWDg2XzMyICovCi0KIC8qCiAgKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgogICoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IGQzNWYyNGUuLjBlOGYwNGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtMTE5LDkgKzExOSwxMCBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9jb3JlZ3JvdXBfbWFzayhpbnQgY3B1KTsKIAotI2lmZGVmIEVOQUJMRV9UT1BPX0RFRklORVMKICNkZWZpbmUgdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChjcHUpCShjcHVfZGF0YShjcHUpLnBoeXNfcHJvY19pZCkKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9pZChjcHUpCQkJKGNwdV9kYXRhKGNwdSkuY3B1X2NvcmVfaWQpCisKKyNpZmRlZiBFTkFCTEVfVE9QT19ERUZJTkVTCiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfY3B1bWFzayhjcHUpCQkocGVyX2NwdShjcHVfY29yZV9tYXAsIGNwdSkpCiAjZGVmaW5lIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkJCShwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSkKICNlbmRpZgpAQCAtMTMxLDI1ICsxMzIsNyBAQAogfQogCiBzdHJ1Y3QgcGNpX2J1czsKK2ludCB4ODZfcGNpX3Jvb3RfYnVzX25vZGUoaW50IGJ1cyk7CiB2b2lkIHg4Nl9wY2lfcm9vdF9idXNfcmVzb3VyY2VzKGludCBidXMsIHN0cnVjdCBsaXN0X2hlYWQgKnJlc291cmNlcyk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIG1jX2NhcGFibGUoKQkoKGJvb3RfY3B1X2RhdGEueDg2X21heF9jb3JlcyA+IDEpICYmIFwKLQkJCShjcHVtYXNrX3dlaWdodChjcHVfY29yZV9tYXNrKDApKSAhPSBucl9jcHVfaWRzKSkKLSNkZWZpbmUgc210X2NhcGFibGUoKQkJCShzbXBfbnVtX3NpYmxpbmdzID4gMSkKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiBpbnQgZ2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0pOwotZXh0ZXJuIHZvaWQgc2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0sIGludCBub2RlKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBnZXRfbXBfYnVzX3RvX25vZGUoaW50IGJ1c251bSkKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbXBfYnVzX3RvX25vZGUoaW50IGJ1c251bSwgaW50IG5vZGUpCi17Ci19Ci0jZW5kaWYKLQogI2VuZGlmIC8qIF9BU01fWDg2X1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggYzJhNDgxMy4uM2Y1NTZjNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTIzLDYgKzIzLDkgQEAKICMgIGluY2x1ZGUgPGFzbS91bmlzdGRfNjQuaD4KICMgIGluY2x1ZGUgPGFzbS91bmlzdGRfNjRfeDMyLmg+CiAjICBkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FCisjICBkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19HRVRERU5UUzY0CisjICBkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19QUkVBRFY2NAorIyAgZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFdSSVRFVjY0CiAKICMgZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oCmluZGV4IGZkZGI1M2QuLmQxZGM1NTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmgKQEAgLTEsOCArMSw0NSBAQAogI2lmbmRlZiBfQVNNX1g4Nl9WRFNPX0gKICNkZWZpbmUgX0FTTV9YODZfVkRTT19ICiAKKyNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworI2lmZGVmIF9fQVNTRU1CTEVSX18KKworI2RlZmluZSBERUZJTkVfVkRTT19JTUFHRShzeW1uYW1lLCBmaWxlbmFtZSkJCQkJXAorX19QQUdFX0FMSUdORURfREFUQSA7CQkJCQkJCVwKKwkuZ2xvYmwgc3ltbmFtZSMjX3N0YXJ0LCBzeW1uYW1lIyNfZW5kIDsJCQkJXAorCS5hbGlnbiBQQUdFX1NJWkUgOwkJCQkJCVwKKwlzeW1uYW1lIyNfc3RhcnQ6IDsJCQkJCQlcCisJLmluY2JpbiBmaWxlbmFtZSA7CQkJCQkJXAorCXN5bW5hbWUjI19lbmQ6IDsJCQkJCQlcCisJLmFsaWduIFBBR0VfU0laRSAvKiBleHRyYSBkYXRhIGhlcmUgbGVha3MgdG8gdXNlcnNwYWNlLiAqLyA7CVwKKwkJCQkJCQkJCVwKKy5wcmV2aW91cyA7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJLmdsb2JsIHN5bW5hbWUjI19wYWdlcyA7CQkJCQlcCisJLmJzcyA7CQkJCQkJCQlcCisJLmFsaWduIDggOwkJCQkJCQlcCisJLnR5cGUgc3ltbmFtZSMjX3BhZ2VzLCBAb2JqZWN0IDsJCQkJXAorCXN5bW5hbWUjI19wYWdlczogOwkJCQkJCVwKKwkuemVybyAoc3ltbmFtZSMjX2VuZCAtIHN5bW5hbWUjI19zdGFydCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFICogKEJJVFNfUEVSX0xPTkcgLyA4KSA7IFwKKwkuc2l6ZSBzeW1uYW1lIyNfcGFnZXMsIC4tc3ltbmFtZSMjX3BhZ2VzCisKKyNlbHNlCisKKyNkZWZpbmUgREVDTEFSRV9WRFNPX0lNQUdFKHN5bW5hbWUpCQkJCVwKKwlleHRlcm4gY2hhciBzeW1uYW1lIyNfc3RhcnRbXSwgc3ltbmFtZSMjX2VuZFtdOwkJXAorCWV4dGVybiBzdHJ1Y3QgcGFnZSAqc3ltbmFtZSMjX3BhZ2VzW10KKwogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19DT01QQVQKLWV4dGVybiBjb25zdCBjaGFyIFZEU08zMl9QUkVMSU5LW107CisKKyNpbmNsdWRlIDxhc20vdmRzbzMyLmg+CisKK0RFQ0xBUkVfVkRTT19JTUFHRSh2ZHNvMzJfaW50ODApOworI2lmZGVmIENPTkZJR19DT01QQVQKK0RFQ0xBUkVfVkRTT19JTUFHRSh2ZHNvMzJfc3lzY2FsbCk7CisjZW5kaWYKK0RFQ0xBUkVfVkRTT19JTUFHRSh2ZHNvMzJfc3lzZW50ZXIpOwogCiAvKgogICogR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSB2RFNPIGltYWdlLCBmaW5kIHRoZSBwb2ludGVyIHRvIFZEU08zMl9uYW1lCkBAIC0xMSw4ICs0OCw3IEBACiAjZGVmaW5lIFZEU08zMl9TWU1CT0woYmFzZSwgbmFtZSkJCQkJCVwKICh7CQkJCQkJCQkJXAogCWV4dGVybiBjb25zdCBjaGFyIFZEU08zMl8jI25hbWVbXTsJCQkJXAotCSh2b2lkIF9fdXNlciAqKShWRFNPMzJfIyNuYW1lIC0gVkRTTzMyX1BSRUxJTksgKwkJXAotCQkJKHVuc2lnbmVkIGxvbmcpKGJhc2UpKTsJCQkJXAorCSh2b2lkIF9fdXNlciAqKShWRFNPMzJfIyNuYW1lICsgKHVuc2lnbmVkIGxvbmcpKGJhc2UpKTsJCVwKIH0pCiAjZW5kaWYKIApAQCAtMjMsMTIgKzU5LDggQEAKIGV4dGVybiB2b2lkIF9fdXNlciBfX2tlcm5lbF9zaWdyZXR1cm47CiBleHRlcm4gdm9pZCBfX3VzZXIgX19rZXJuZWxfcnRfc2lncmV0dXJuOwogCi0vKgotICogVGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCBieSB2ZHNvMzIuUyB0byBtYXJrIHRoZSBib3VuZHMKLSAqIG9mIHRoZSBFTEYgRFNPIGltYWdlcyBpbmNsdWRlZCB0aGVyZWluLgotICovCi1leHRlcm4gY29uc3QgY2hhciB2ZHNvMzJfaW50ODBfc3RhcnQsIHZkc28zMl9pbnQ4MF9lbmQ7Ci1leHRlcm4gY29uc3QgY2hhciB2ZHNvMzJfc3lzY2FsbF9zdGFydCwgdmRzbzMyX3N5c2NhbGxfZW5kOwotZXh0ZXJuIGNvbnN0IGNoYXIgdmRzbzMyX3N5c2VudGVyX3N0YXJ0LCB2ZHNvMzJfc3lzZW50ZXJfZW5kOwordm9pZCBfX2luaXQgcGF0Y2hfdmRzbzMyKHZvaWQgKnZkc28sIHNpemVfdCBsZW4pOworCisjZW5kaWYgLyogX19BU1NFTUJMRVJfXyAqLwogCiAjZW5kaWYgLyogX0FTTV9YODZfVkRTT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZmI3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvMzIuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9BU01fWDg2X1ZEU08zMl9ICisjZGVmaW5lIF9BU01fWDg2X1ZEU08zMl9ICisKKyNkZWZpbmUgVkRTT19CQVNFX1BBR0UJMAorI2RlZmluZSBWRFNPX1ZWQVJfUEFHRQkxCisjZGVmaW5lIFZEU09fSFBFVF9QQUdFCTIKKyNkZWZpbmUgVkRTT19QQUdFUwkzCisjZGVmaW5lIFZEU09fUFJFVl9QQUdFUwkyCisjZGVmaW5lIFZEU09fT0ZGU0VUKHgpCSgoeCkgKiBQQUdFX1NJWkUpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmd0b2QuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZndG9kLmgKaW5kZXggNDZlMjRkMy4uM2MzMzY2YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmd0b2QuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92Z3RvZC5oCkBAIC0xLDMwICsxLDczIEBACiAjaWZuZGVmIF9BU01fWDg2X1ZHVE9EX0gKICNkZWZpbmUgX0FTTV9YODZfVkdUT0RfSAogCi0jaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogCisjaWZkZWYgQlVJTERfVkRTTzMyXzY0Cit0eXBlZGVmIHU2NCBndG9kX2xvbmdfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZ3RvZF9sb25nX3Q7CisjZW5kaWYKKy8qCisgKiB2c3lzY2FsbF9ndG9kX2RhdGEgd2lsbCBiZSBhY2Nlc3NlZCBieSAzMiBhbmQgNjQgYml0IGNvZGUgYXQgdGhlIHNhbWUgdGltZQorICogc28gYmUgY2FyZWZ1bGwgYnkgbW9kaWZ5aW5nIHRoaXMgc3RydWN0dXJlLgorICovCiBzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhIHsKLQlzZXFjb3VudF90CXNlcTsKKwl1bnNpZ25lZCBzZXE7CiAKLQlzdHJ1Y3QgeyAvKiBleHRyYWN0IG9mIGEgY2xvY2tzb3VyY2Ugc3RydWN0ICovCi0JCWludCB2Y2xvY2tfbW9kZTsKLQkJY3ljbGVfdAljeWNsZV9sYXN0OwotCQljeWNsZV90CW1hc2s7Ci0JCXUzMgltdWx0OwotCQl1MzIJc2hpZnQ7Ci0JfSBjbG9jazsKKwlpbnQgdmNsb2NrX21vZGU7CisJY3ljbGVfdAljeWNsZV9sYXN0OworCWN5Y2xlX3QJbWFzazsKKwl1MzIJbXVsdDsKKwl1MzIJc2hpZnQ7CiAKIAkvKiBvcGVuIGNvZGVkICdzdHJ1Y3QgdGltZXNwZWMnICovCi0JdGltZV90CQl3YWxsX3RpbWVfc2VjOwogCXU2NAkJd2FsbF90aW1lX3Nuc2VjOworCWd0b2RfbG9uZ190CXdhbGxfdGltZV9zZWM7CisJZ3RvZF9sb25nX3QJbW9ub3RvbmljX3RpbWVfc2VjOwogCXU2NAkJbW9ub3RvbmljX3RpbWVfc25zZWM7Ci0JdGltZV90CQltb25vdG9uaWNfdGltZV9zZWM7CisJZ3RvZF9sb25nX3QJd2FsbF90aW1lX2NvYXJzZV9zZWM7CisJZ3RvZF9sb25nX3QJd2FsbF90aW1lX2NvYXJzZV9uc2VjOworCWd0b2RfbG9uZ190CW1vbm90b25pY190aW1lX2NvYXJzZV9zZWM7CisJZ3RvZF9sb25nX3QJbW9ub3RvbmljX3RpbWVfY29hcnNlX25zZWM7CiAKLQlzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwotCXN0cnVjdCB0aW1lc3BlYyB3YWxsX3RpbWVfY29hcnNlOwotCXN0cnVjdCB0aW1lc3BlYyBtb25vdG9uaWNfdGltZV9jb2Fyc2U7CisJaW50CQl0el9taW51dGVzd2VzdDsKKwlpbnQJCXR6X2RzdHRpbWU7CiB9OwogZXh0ZXJuIHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgdnN5c2NhbGxfZ3RvZF9kYXRhOwogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGd0b2RfcmVhZF9iZWdpbihjb25zdCBzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhICpzKQoreworCXVuc2lnbmVkIHJldDsKKworcmVwZWF0OgorCXJldCA9IEFDQ0VTU19PTkNFKHMtPnNlcSk7CisJaWYgKHVubGlrZWx5KHJldCAmIDEpKSB7CisJCWNwdV9yZWxheCgpOworCQlnb3RvIHJlcGVhdDsKKwl9CisJc21wX3JtYigpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGd0b2RfcmVhZF9yZXRyeShjb25zdCBzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhICpzLAorCQkJCQl1bnNpZ25lZCBzdGFydCkKK3sKKwlzbXBfcm1iKCk7CisJcmV0dXJuIHVubGlrZWx5KHMtPnNlcSAhPSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBndG9kX3dyaXRlX2JlZ2luKHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgKnMpCit7CisJKytzLT5zZXE7CisJc21wX3dtYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3RvZF93cml0ZV9lbmQoc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSAqcykKK3sKKwlzbXBfd21iKCk7CisJKytzLT5zZXE7Cit9CisKICNlbmRpZiAvKiBfQVNNX1g4Nl9WR1RPRF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9jb2JhbHQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL2NvYmFsdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRiMzc2Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL2NvYmFsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9YODZfVklTV1NfQ09CQUxUX0gKLSNkZWZpbmUgX0FTTV9YODZfVklTV1NfQ09CQUxUX0gKLQotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLQotLyoKLSAqIENvYmFsdCBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIHN5c3RlbSBBU0lDCi0gKi8gCi0KLSNkZWZpbmUgQ09fQ1BVX05VTV9QSFlTIDB4MWUwMAotI2RlZmluZSBDT19DUFVfVEFCX1BIWVMgKENPX0NQVV9OVU1fUEhZUyArIDIpCi0KLSNkZWZpbmUgQ09fQ1BVX01BWCA0Ci0KLSNkZWZpbmUJQ09fQ1BVX1BIWVMJCTB4YzIwMDAwMDAKLSNkZWZpbmUJQ09fQVBJQ19QSFlTCQkweGM0MDAwMDAwCi0KLS8qIHNlZSBzZXRfZml4bWFwKCkgYW5kIGFzbS9maXhtYXAuaCAqLwotI2RlZmluZQlDT19DUFVfVkFERFIJCShmaXhfdG9fdmlydChGSVhfQ09fQ1BVKSkKLSNkZWZpbmUJQ09fQVBJQ19WQUREUgkJKGZpeF90b192aXJ0KEZJWF9DT19BUElDKSkKLQotLyogQ29iYWx0IENQVSByZWdpc3RlcnMgLS0gcmVsYXRpdmUgdG8gQ09fQ1BVX1ZBRERSLCB1c2UgY29fY3B1XyooKSAqLwotI2RlZmluZQlDT19DUFVfUkVWCQkweDA4Ci0jZGVmaW5lCUNPX0NQVV9DVFJMCQkweDEwCi0jZGVmaW5lCUNPX0NQVV9TVEFUCQkweDIwCi0jZGVmaW5lCUNPX0NQVV9USU1FVkFMCQkweDMwCi0KLS8qIENPX0NQVV9DVFJMIGJpdHMgKi8KLSNkZWZpbmUJQ09fQ1RSTF9USU1FUlVOCQkweDA0CQkvKiAwID09IGRpc2FibGVkICovCi0jZGVmaW5lCUNPX0NUUkxfVElNRU1BU0sJMHgwOAkJLyogMCA9PSB1bm1hc2tlZCAqLwotCi0vKiBDT19DUFVfU1RBVFVTIGJpdHMgKi8KLSNkZWZpbmUJQ09fU1RBVF9USU1FSU5UUgkweDAyCS8qIChyKSAxID09IGludCBwZW5kLCAodykgMCA9PSBjbGVhciAqLwotCi0vKiBDT19DUFVfVElNRVZBTCB2YWx1ZSAqLwotI2RlZmluZQlDT19USU1FX0haCQkxMDAwMDAwMDAJLyogQ29iYWx0IGNvcmUgcmF0ZSAqLwotCi0vKiBDb2JhbHQgQVBJQyByZWdpc3RlcnMgLS0gcmVsYXRpdmUgdG8gQ09fQVBJQ19WQUREUiwgdXNlIGNvX2FwaWNfKigpICovCi0jZGVmaW5lCUNPX0FQSUNfSEkobikJCSgoKG4pICogMHgxMCkgKyA0KQotI2RlZmluZQlDT19BUElDX0xPKG4pCQkoKG4pICogMHgxMCkKLSNkZWZpbmUJQ09fQVBJQ19JRAkJMHgwZmZjCi0KLS8qIENPX0FQSUNfSUQgYml0cyAqLwotI2RlZmluZQlDT19BUElDX0VOQUJMRQkJMHgwMDAwMDEwMAotCi0vKiBDT19BUElDX0xPIGJpdHMgKi8KLSNkZWZpbmUJQ09fQVBJQ19NQVNLCQkweDAwMDEwMDAwCS8qIDAgPSBlbmFibGVkICovCi0jZGVmaW5lCUNPX0FQSUNfTEVWRUwJCTB4MDAwMDgwMDAJLyogMCA9IGVkZ2UgKi8KLQotLyoKLSAqIFdoZXJlIHRoaW5ncyBhcmUgcGh5c2ljYWxseSB3aXJlZCB0byBDb2JhbHQKLSAqICNkZWZpbmVzIHdpdGggbm8gYm9hcmQgXzx0eXBlPl88cmV2Pl8gYXJlIGNvbW1vbiB0byBhbGwgKHRodXMgZmFyKQotICovCi0jZGVmaW5lCUNPX0FQSUNfSURFMAkJNAotI2RlZmluZSBDT19BUElDX0lERTEJCTIJCS8qIE9ubHkgb24gMzIwICovCi0KLSNkZWZpbmUJQ09fQVBJQ184MjU5CQkxMgkJLyogc2VyaWFsLCBmbG9wcHksIHBhci1sLWwgKi8KLQotLyogTGl0aGl1bSBQQ0kgQnJpZGdlIEEgLS0gInRoZSBvbmUgd2l0aCA4MjU1NyBFdGhlcm5ldCIgKi8KLSNkZWZpbmUJQ09fQVBJQ19QQ0lBX0JBU0UwCTAgLyogYW5kIDEgKi8JLyogc2xvdCAwLCBsaW5lIDAgKi8KLSNkZWZpbmUJQ09fQVBJQ19QQ0lBX0JBU0UxMjMJNSAvKiBhbmQgNiAqLwkvKiBzbG90IDAsIGxpbmUgMSAqLwotCi0jZGVmaW5lCUNPX0FQSUNfUElJWDRfVVNCCTcJCS8qIHRoaXMgb25lIGlzIHdlaXJkICovCi0KLS8qIExpdGhpdW0gUENJIEJyaWRnZSBCIC0tICJ0aGUgb25lIHdpdGggUElJWDQiICovCi0jZGVmaW5lCUNPX0FQSUNfUENJQl9CQVNFMAk4IC8qIGFuZCA5LTEyICovLyogc2xvdCAwLCBsaW5lIDAgKi8KLSNkZWZpbmUJQ09fQVBJQ19QQ0lCX0JBU0UxMjMJMTMgLyogMTQuMTUgKi8JLyogc2xvdCAwLCBsaW5lIDEgKi8KLQotI2RlZmluZQlDT19BUElDX1ZJRE9VVDAJCTE2Ci0jZGVmaW5lCUNPX0FQSUNfVklET1VUMQkJMTcKLSNkZWZpbmUJQ09fQVBJQ19WSURJTjAJCTE4Ci0jZGVmaW5lCUNPX0FQSUNfVklESU4xCQkxOQotCi0jZGVmaW5lCUNPX0FQSUNfTElfQVVESU8JMjIKLQotI2RlZmluZQlDT19BUElDX0FTCQkyNAotI2RlZmluZQlDT19BUElDX1JFCQkyNQotCi0jZGVmaW5lIENPX0FQSUNfQ1BVCQkyOAkJLyogVGltZXIgYW5kIENhY2hlIGludGVycnVwdCAqLwotI2RlZmluZQlDT19BUElDX05NSQkJMjkKLSNkZWZpbmUJQ09fQVBJQ19MQVNUCQlDT19BUElDX05NSQotCi0vKgotICogVGhpcyBpcyBob3cgaXJxcyBhcmUgYXNzaWduZWQgb24gdGhlIFZpc3VhbCBXb3Jrc3RhdGlvbi4KLSAqIExlZ2FjeSBkZXZpY2VzIGdldCBpcnEncyAxLTE1IChzeXN0ZW0gY2xvY2sgaXMgMCBhbmQgaXMgQ09fQVBJQ19DUFUpLgotICogQWxsIG90aGVyIGRldmljZXMgKGluY2x1ZGluZyBQQ0kpIGdvIHRvIENvYmFsdCBhbmQgYXJlIGlycSdzIDE2IG9uIHVwLgotICovCi0jZGVmaW5lCUNPX0lSUV9BUElDMAkxNgkJCS8qIGlycSBvZiBhcGljIGVudHJ5IDAgKi8KLSNkZWZpbmUJSVNfQ09fQVBJQyhpcnEpCSgoaXJxKSA+PSBDT19JUlFfQVBJQzApCi0jZGVmaW5lCUNPX0lSUShhcGljKQkoQ09fSVJRX0FQSUMwICsgKGFwaWMpKQkvKiBhcGljIGVudCB0byBpcnEgKi8KLSNkZWZpbmUJQ09fQVBJQyhpcnEpCSgoaXJxKSAtIENPX0lSUV9BUElDMCkJLyogaXJxIHRvIGFwaWMgZW50ICovCi0jZGVmaW5lIENPX0lSUV9JREUwCTE0CQkJLyoga25vd2xlZGdlIG9mLi4uICovCi0jZGVmaW5lIENPX0lSUV9JREUxCTE1CQkJLyogLi4uIGlkZSBkcml2ZXIgZGVmYXVsdHMhICovCi0jZGVmaW5lCUNPX0lSUV84MjU5CUNPX0lSUShDT19BUElDXzgyNTkpCi0KLSNpZmRlZiBDT05GSUdfWDg2X1ZJU1dTX0FQSUMKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb19jcHVfd3JpdGUodW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGxvbmcgdikKLXsKLQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKENPX0NQVV9WQUREUityZWcpKT12OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29fY3B1X3JlYWQodW5zaWduZWQgbG9uZyByZWcpCi17Ci0JcmV0dXJuICooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoQ09fQ1BVX1ZBRERSK3JlZykpOwotfSAgICAgICAgICAgIAotICAgICAgICAgICAgIAotc3RhdGljIGlubGluZSB2b2lkIGNvX2FwaWNfd3JpdGUodW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGxvbmcgdikKLXsKLQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKENPX0FQSUNfVkFERFIrcmVnKSk9djsKLX0gICAgICAgICAgICAKLSAgICAgICAgICAgICAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb19hcGljX3JlYWQodW5zaWduZWQgbG9uZyByZWcpCi17Ci0JcmV0dXJuICooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoQ09fQVBJQ19WQUREUityZWcpKTsKLX0KLSNlbmRpZgotCi1leHRlcm4gY2hhciB2aXN3c19ib2FyZF90eXBlOwotCi0jZGVmaW5lCVZJU1dTXzMyMAkwCi0jZGVmaW5lCVZJU1dTXzU0MAkxCi0KLWV4dGVybiBjaGFyIHZpc3dzX2JvYXJkX3JldjsKLQotZXh0ZXJuIGludCBwY2lfdmlzd3NfaW5pdCh2b2lkKTsKLQotI2VuZGlmIC8qIF9BU01fWDg2X1ZJU1dTX0NPQkFMVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9saXRoaXVtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9saXRoaXVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMGQ4OWIuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvbGl0aGl1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9WSVNXU19MSVRISVVNX0gKLSNkZWZpbmUgX0FTTV9YODZfVklTV1NfTElUSElVTV9ICi0KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0KLS8qCi0gKiBMaXRoaXVtIGlzIHRoZSBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIEkvTyBBU0lDCi0gKi8KLQotI2RlZmluZQlMSV9QQ0lfQV9QSFlTCQkweGZjMDAwMDAwCS8qIEVuZXQgaXMgZGV2IDMgKi8KLSNkZWZpbmUJTElfUENJX0JfUEhZUwkJMHhmZDAwMDAwMAkvKiBQSUlYNCBpcyBoZXJlICovCi0KLS8qIHNlZSBzZXRfZml4bWFwKCkgYW5kIGFzbS9maXhtYXAuaCAqLwotI2RlZmluZSBMSV9QQ0lBX1ZBRERSICAgKGZpeF90b192aXJ0KEZJWF9MSV9QQ0lBKSkKLSNkZWZpbmUgTElfUENJQl9WQUREUiAgIChmaXhfdG9fdmlydChGSVhfTElfUENJQikpCi0KLS8qIE5vdCBhIHN0YW5kYXJkIFBDST8gKG5vdCBpbiBsaW51eC9wY2kuaCkgKi8KLSNkZWZpbmUJTElfUENJX0JVU05VTQkweDQ0CQkJLyogbG84OiBwcmltYXJ5LCBoaTg6IHN1YiAqLwotI2RlZmluZSBMSV9QQ0lfSU5URU4gICAgMHg0NgotCi0vKiBMSV9QQ0lfSU5URU5UIGJpdHMgKi8KLSNkZWZpbmUJTElfSU5UQV8wCTB4MDAwMQotI2RlZmluZQlMSV9JTlRBXzEJMHgwMDAyCi0jZGVmaW5lCUxJX0lOVEFfMgkweDAwMDQKLSNkZWZpbmUJTElfSU5UQV8zCTB4MDAwOAotI2RlZmluZQlMSV9JTlRBXzQJMHgwMDEwCi0jZGVmaW5lCUxJX0lOVEIJCTB4MDAyMAotI2RlZmluZQlMSV9JTlRDCQkweDAwNDAKLSNkZWZpbmUJTElfSU5URAkJMHgwMDgwCi0KLS8qIE1vcmUgc3BlY2lhbCBwdXJwb3NlIG1hY3Jvcy4uLiAqLwotc3RhdGljIGlubGluZSB2b2lkIGxpX3BjaWFfd3JpdGUxNih1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgc2hvcnQgdikKLXsKLQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShMSV9QQ0lBX1ZBRERSK3JlZykpPXY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgbGlfcGNpYV9yZWFkMTYodW5zaWduZWQgbG9uZyByZWcpCi17Ci0JIHJldHVybiAqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShMSV9QQ0lBX1ZBRERSK3JlZykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGlfcGNpYl93cml0ZTE2KHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBzaG9ydCB2KQotewotCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKExJX1BDSUJfVkFERFIrcmVnKSk9djsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBsaV9wY2liX3JlYWQxNih1bnNpZ25lZCBsb25nIHJlZykKLXsKLQlyZXR1cm4gKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoTElfUENJQl9WQUREUityZWcpKTsKLX0KLQotI2VuZGlmIC8qIF9BU01fWDg2X1ZJU1dTX0xJVEhJVU1fSCAqLwotCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9waWl4NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmlzd3MvcGlpeDQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhZjRkMy4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9waWl4NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9YODZfVklTV1NfUElJWDRfSAotI2RlZmluZSBfQVNNX1g4Nl9WSVNXU19QSUlYNF9ICi0KLS8qCi0gKiBQSUlYNCBhcyB1c2VkIG9uIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zCi0gKi8KLQotI2RlZmluZQlQSUlYX1BNX1NUQVJUCQkweDBGODAKLQotI2RlZmluZQlTSU9fR1BJT19TVEFSVAkJMHgwRkMwCi0KLSNkZWZpbmUJU0lPX1BNX1NUQVJUCQkweDBGQzgKLQotI2RlZmluZQlQTUJBU0UJCQlQSUlYX1BNX1NUQVJUCi0jZGVmaW5lCUdQSVJFRzAJCQkoUE1CQVNFKzB4MzApCi0jZGVmaW5lCUdQSVJFRyh4KQkJKEdQSVJFRzArKCh4KS84KSkKLSNkZWZpbmUJR1BJQklUKHgpCQkoMSA8PCAoKHgpJTgpKQotCi0jZGVmaW5lCVBJSVhfR1BJX0JEX0lEMQkJMTgKLSNkZWZpbmUJUElJWF9HUElfQkRfSUQyCQkxOQotI2RlZmluZQlQSUlYX0dQSV9CRF9JRDMJCTIwCi0jZGVmaW5lCVBJSVhfR1BJX0JEX0lENAkJMjEKLSNkZWZpbmUJUElJWF9HUElfQkRfUkVHCQlHUElSRUcoUElJWF9HUElfQkRfSUQxKQotI2RlZmluZQlQSUlYX0dQSV9CRF9NQVNLCShHUElCSVQoUElJWF9HUElfQkRfSUQxKSB8IFwKLQkJCQlHUElCSVQoUElJWF9HUElfQkRfSUQyKSB8IFwKLQkJCQlHUElCSVQoUElJWF9HUElfQkRfSUQzKSB8IFwKLQkJCQlHUElCSVQoUElJWF9HUElfQkRfSUQ0KSApCi0KLSNkZWZpbmUJUElJWF9HUElfQkRfU0hJRlQJKFBJSVhfR1BJX0JEX0lEMSAlIDgpCi0KLSNkZWZpbmUJU0lPX0lOREVYCQkweDJlCi0jZGVmaW5lCVNJT19EQVRBCQkweDJmCi0KLSNkZWZpbmUJU0lPX0RFVl9TRUwJCTB4NwotI2RlZmluZQlTSU9fREVWX0VOQgkJMHgzMAotI2RlZmluZQlTSU9fREVWX01TQgkJMHg2MAotI2RlZmluZQlTSU9fREVWX0xTQgkJMHg2MQotCi0jZGVmaW5lCVNJT19HUF9ERVYJCTB4NwotCi0jZGVmaW5lCVNJT19HUF9CQVNFCQlTSU9fR1BJT19TVEFSVAotI2RlZmluZQlTSU9fR1BfTVNCCQkoU0lPX0dQX0JBU0U+PjgpCi0jZGVmaW5lCVNJT19HUF9MU0IJCShTSU9fR1BfQkFTRSYweGZmKQotCi0jZGVmaW5lCVNJT19HUF9EQVRBMQkJKFNJT19HUF9CQVNFKzApCi0KLSNkZWZpbmUJU0lPX1BNX0RFVgkJMHg4Ci0KLSNkZWZpbmUJU0lPX1BNX0JBU0UJCVNJT19QTV9TVEFSVAotI2RlZmluZQlTSU9fUE1fTVNCCQkoU0lPX1BNX0JBU0U+PjgpCi0jZGVmaW5lCVNJT19QTV9MU0IJCShTSU9fUE1fQkFTRSYweGZmKQotI2RlZmluZQlTSU9fUE1fSU5ERVgJCShTSU9fUE1fQkFTRSswKQotI2RlZmluZQlTSU9fUE1fREFUQQkJKFNJT19QTV9CQVNFKzEpCi0KLSNkZWZpbmUJU0lPX1BNX0ZFUjIJCTB4MQotCi0jZGVmaW5lCVNJT19QTV9HUF9FTgkJMHg4MAotCi0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGRldi9yZWcgd2hlcmUgZ2VuZXJhdGluZyBhIGNvbmZpZyBjeWNsZSB3aWxsCi0gKiByZXN1bHQgaW4gYSBQQ0kgc3BlY2lhbCBjeWNsZS4KLSAqLwotI2RlZmluZSBTUEVDSUFMX0RFVgkJMHhmZgotI2RlZmluZSBTUEVDSUFMX1JFRwkJMHgwMAotCi0vKgotICogUElJWDQgbmVlZHMgdG8gc2VlIGEgc3BlY2lhbCBjeWNsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZGF0YQotICogdG8gYmUgY29udmluY2VkIHRoZSBwcm9jZXNzb3IgaGFzIGdvbmUgaW50byB0aGUgc3RvcCBncmFudAotICogc3RhdGUuICBQSUlYNCBpbnNpc3RzIG9uIHNlZWluZyB0aGlzIGJlZm9yZSBpdCB3aWxsIHBvd2VyCi0gKiBkb3duIGEgc3lzdGVtLgotICovCi0jZGVmaW5lIFBJSVhfU1BFQ0lBTF9TVE9QCQkweDAwMTIwMDAyCi0KLSNkZWZpbmUgUElJWDRfUkVTRVRfUE9SVAkweGNmOQotI2RlZmluZSBQSUlYNF9SRVNFVF9WQUwJCTB4NgotCi0jZGVmaW5lIFBNU1RTX1BPUlQJCTB4ZjgwCS8vIDIgYnl0ZXMJUE0gU3RhdHVzCi0jZGVmaW5lIFBNRU5fUE9SVAkJMHhmODIJLy8gMiBieXRlcwlQTSBFbmFibGUKLSNkZWZpbmUJUE1DTlRSTF9QT1JUCQkweGY4NAkvLyAyIGJ5dGVzCVBNIENvbnRyb2wKLQotI2RlZmluZSBQTV9TVVNQRU5EX0VOQUJMRQkweDIwMDAJLy8gc3RhcnQgc2VxdWVuY2UgdG8gc3VzcGVuZCBzdGF0ZQotCi0vKgotICogUE1TVFMgYW5kIFBNRU4gSS9PIGJpdCBkZWZpbml0aW9ucy4KLSAqIChCaXRzIGFyZSB0aGUgc2FtZSBpbiBib3RoIHJlZ2lzdGVycykKLSAqLwotI2RlZmluZSBQTV9TVFNfUlNNCQkoMTw8MTUpCS8vIFJlc3VtZSBTdGF0dXMKLSNkZWZpbmUgUE1fU1RTX1BXUkJUTk9SCQkoMTw8MTEpCS8vIFBvd2VyIEJ1dHRvbiBPdmVycmlkZQotI2RlZmluZSBQTV9TVFNfUlRDCQkoMTw8MTApCS8vIFJUQyBzdGF0dXMKLSNkZWZpbmUgUE1fU1RTX1BXUkJUTgkJKDE8PDgpCS8vIFBvd2VyIEJ1dHRvbiBQcmVzc2VkPwotI2RlZmluZSBQTV9TVFNfR0JMCQkoMTw8NSkJLy8gR2xvYmFsIFN0YXR1cwotI2RlZmluZSBQTV9TVFNfQk0JCSgxPDw0KQkvLyBCdXMgTWFzdGVyIFN0YXR1cwotI2RlZmluZSBQTV9TVFNfVE1ST0YJCSgxPDwwKQkvLyBUaW1lciBPdmVyZmxvdyBTdGF0dXMuCi0KLS8qCi0gKiBTdG9wIGNsb2NrIEdQSSByZWdpc3RlcgotICovCi0jZGVmaW5lIFBJSVhfR1BJUkVHMAkJCSgweGY4MCArIDB4MzApCi0KLS8qCi0gKiBTdG9wIGNsb2NrIEdQSSBiaXQgaW4gR1BJUkVHMAotICovCi0jZGVmaW5lCVBJSVhfR1BJX1NUUENMSwkJMHg0CS8vIFNUUENMSyBzaWduYWwgcm91dGVkIGJhY2sgaW4KLQotI2VuZGlmIC8qIF9BU01fWDg2X1ZJU1dTX1BJSVg0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL3NnaXZ3LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92aXN3cy9zZ2l2dy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmJmNjNlLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zpc3dzL3NnaXZ3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qCi0gKiBGcmFtZSBidWZmZXIgcG9zaXRpb24gYW5kIHNpemU6Ci0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIHNnaXZ3ZmJfbWVtX3BoeXM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdnZhci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdnZhci5oCmluZGV4IGQ3NmFjNDAuLjA4MWQ5MDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Z2YXIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92dmFyLmgKQEAgLTE2LDggKzE2LDggQEAKICAqIHlvdSBtZXNzIHVwLCB0aGUgbGlua2VyIHdpbGwgY2F0Y2ggaXQuKQogICovCiAKLS8qIEJhc2UgYWRkcmVzcyBvZiB2dmFycy4gIFRoaXMgaXMgbm90IEFCSS4gKi8KLSNkZWZpbmUgVlZBUl9BRERSRVNTICgtMTAqMTAyNCoxMDI0IC0gNDA5NikKKyNpZm5kZWYgX0FTTV9YODZfVlZBUl9ICisjZGVmaW5lIF9BU01fWDg2X1ZWQVJfSAogCiAjaWYgZGVmaW5lZChfX1ZWQVJfS0VSTkVMX0xEUykKIApAQCAtMjksMTYgKzI5LDM1IEBACiAKICNlbHNlCiAKKyNpZmRlZiBCVUlMRF9WRFNPMzIKKworI2RlZmluZSBERUNMQVJFX1ZWQVIob2Zmc2V0LCB0eXBlLCBuYW1lKQkJCQlcCisJZXh0ZXJuIHR5cGUgdnZhcl8gIyMgbmFtZSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpOworCisjZGVmaW5lIFZWQVIobmFtZSkgKHZ2YXJfICMjIG5hbWUpCisKKyNlbHNlCisKK2V4dGVybiBjaGFyIF9fdnZhcl9wYWdlOworCisvKiBCYXNlIGFkZHJlc3Mgb2YgdnZhcnMuICBUaGlzIGlzIG5vdCBBQkkuICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorI2RlZmluZSBWVkFSX0FERFJFU1MgKC0xMCoxMDI0KjEwMjQgLSA0MDk2KQorI2Vsc2UKKyNkZWZpbmUgVlZBUl9BRERSRVNTICgmX192dmFyX3BhZ2UpCisjZW5kaWYKKwogI2RlZmluZSBERUNMQVJFX1ZWQVIob2Zmc2V0LCB0eXBlLCBuYW1lKQkJCQlcCiAJc3RhdGljIHR5cGUgY29uc3QgKiBjb25zdCB2dmFyYWRkcl8gIyMgbmFtZSA9CQkJXAogCQkodm9pZCAqKShWVkFSX0FERFJFU1MgKyAob2Zmc2V0KSk7CiAKKyNkZWZpbmUgVlZBUihuYW1lKSAoKnZ2YXJhZGRyXyAjIyBuYW1lKQorI2VuZGlmCisKICNkZWZpbmUgREVGSU5FX1ZWQVIodHlwZSwgbmFtZSkJCQkJCQlcCiAJdHlwZSBuYW1lCQkJCQkJCVwKIAlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIudnZhcl8iICNuYW1lKSwgYWxpZ25lZCgxNikpKSBfX3Zpc2libGUKIAotI2RlZmluZSBWVkFSKG5hbWUpICgqdnZhcmFkZHJfICMjIG5hbWUpCi0KICNlbmRpZgogCiAvKiBERUNMQVJFX1ZWQVIob2Zmc2V0LCB0eXBlLCBuYW1lKSAqLwpAQCAtNDgsMyArNjcsNSBAQAogREVDTEFSRV9WVkFSKDEyOCwgc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSwgdnN5c2NhbGxfZ3RvZF9kYXRhKQogCiAjdW5kZWYgREVDTEFSRV9WVkFSCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veHNhdmUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hzYXZlLmgKaW5kZXggNTU0NzM4OS4uNmMxZDc0MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veHNhdmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94c2F2ZS5oCkBAIC02LDExICs2LDE0IEBACiAKICNkZWZpbmUgWFNUQVRFX0NQVUlECQkweDAwMDAwMDBkCiAKLSNkZWZpbmUgWFNUQVRFX0ZQCTB4MQotI2RlZmluZSBYU1RBVEVfU1NFCTB4MgotI2RlZmluZSBYU1RBVEVfWU1NCTB4NAotI2RlZmluZSBYU1RBVEVfQk5EUkVHUwkweDgKLSNkZWZpbmUgWFNUQVRFX0JORENTUgkweDEwCisjZGVmaW5lIFhTVEFURV9GUAkJMHgxCisjZGVmaW5lIFhTVEFURV9TU0UJCTB4MgorI2RlZmluZSBYU1RBVEVfWU1NCQkweDQKKyNkZWZpbmUgWFNUQVRFX0JORFJFR1MJCTB4OAorI2RlZmluZSBYU1RBVEVfQk5EQ1NSCQkweDEwCisjZGVmaW5lIFhTVEFURV9PUE1BU0sJCTB4MjAKKyNkZWZpbmUgWFNUQVRFX1pNTV9IaTI1NgkweDQwCisjZGVmaW5lIFhTVEFURV9IaTE2X1pNTQkJMHg4MAogCiAjZGVmaW5lIFhTVEFURV9GUFNTRQkoWFNUQVRFX0ZQIHwgWFNUQVRFX1NTRSkKIApAQCAtMjMsNyArMjYsOCBAQAogI2RlZmluZSBYU0FWRV9ZTU1fT0ZGU0VUICAgIChYU0FWRV9IRFJfU0laRSArIFhTQVZFX0hEUl9PRkZTRVQpCiAKIC8qIFN1cHBvcnRlZCBmZWF0dXJlcyB3aGljaCBzdXBwb3J0IGxhenkgc3RhdGUgc2F2aW5nICovCi0jZGVmaW5lIFhTVEFURV9MQVpZCShYU1RBVEVfRlAgfCBYU1RBVEVfU1NFIHwgWFNUQVRFX1lNTSkKKyNkZWZpbmUgWFNUQVRFX0xBWlkJKFhTVEFURV9GUCB8IFhTVEFURV9TU0UgfCBYU1RBVEVfWU1NCQkgICAgICBcCisJCQl8IFhTVEFURV9PUE1BU0sgfCBYU1RBVEVfWk1NX0hpMjU2IHwgWFNUQVRFX0hpMTZfWk1NKQogCiAvKiBTdXBwb3J0ZWQgZmVhdHVyZXMgd2hpY2ggcmVxdWlyZSBlYWdlciBzdGF0ZSBzYXZpbmcgKi8KICNkZWZpbmUgWFNUQVRFX0VBR0VSCShYU1RBVEVfQk5EUkVHUyB8IFhTVEFURV9CTkRDU1IpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21zci1pbmRleC5oIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tc3ItaW5kZXguaAppbmRleCBjMTlmYzYwLi40OTI0ZjRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21zci1pbmRleC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbXNyLWluZGV4LmgKQEAgLTM2OCwzMyArMzY4LDU4IEBACiAjZGVmaW5lIFRIRVJNX0xPR19USFJFU0hPTEQxICAgICAgICAgICAoMSA8PCA5KQogCiAvKiBNSVNDX0VOQUJMRSBiaXRzOiBhcmNoaXRlY3R1cmFsICovCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZBU1RfU1RSSU5HCSgxVUxMIDw8IDApCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RDQwkJKDFVTEwgPDwgMSkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU1PTgkJKDFVTEwgPDwgNykKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQlRTX1VOQVZBSUwJKDFVTEwgPDwgMTEpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTAkoMVVMTCA8PCAxMikKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU5IQU5DRURfU1BFRURTVEVQCSgxVUxMIDw8IDE2KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9NV0FJVAkJKDFVTEwgPDwgMTgpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0xJTUlUX0NQVUlECSgxVUxMIDw8IDIyKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YVFBSX0RJU0FCTEUJKDFVTEwgPDwgMjMpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1hEX0RJU0FCTEUJCSgxVUxMIDw8IDM0KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklOR19CSVQJCTAKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkFTVF9TVFJJTkcJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZBU1RfU1RSSU5HX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVENDX0JJVAkJCTEKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVENDCQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVENDX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU1PTl9CSVQJCQk3CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VNT04JCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9FTU9OX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQlRTX1VOQVZBSUxfQklUCQkxMQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9CVFNfVU5BVkFJTAkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQlRTX1VOQVZBSUxfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUxfQklUCQkxMgorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUwJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTF9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VOSEFOQ0VEX1NQRUVEU1RFUF9CSVQJMTYKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU5IQU5DRURfU1BFRURTVEVQCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9FTkhBTkNFRF9TUEVFRFNURVBfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9NV0FJVF9CSVQJCQkxOAorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9NV0FJVAkJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX01XQUlUX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTElNSVRfQ1BVSURfQklUCQkyMgorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MSU1JVF9DUFVJRAkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTElNSVRfQ1BVSURfQklUKTsKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWFRQUl9ESVNBQkxFX0JJVAkJMjMKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWFRQUl9ESVNBQkxFCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YVFBSX0RJU0FCTEVfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YRF9ESVNBQkxFX0JJVAkJMzQKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWERfRElTQUJMRQkJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX1hEX0RJU0FCTEVfQklUKQogCiAvKiBNSVNDX0VOQUJMRSBiaXRzOiBtb2RlbC1zcGVjaWZpYywgbWVhbmluZyBtYXkgdmFyeSBmcm9tIGNvcmUgdG8gY29yZSAqLwotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YODdfQ09NUEFUCQkoMVVMTCA8PCAyKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UTTEJCSgxVUxMIDw8IDMpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQTElUX0xPQ0tfRElTQUJMRQkoMVVMTCA8PCA0KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MM0NBQ0hFX0RJU0FCTEUJKDFVTEwgPDwgNikKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1VQUFJFU1NfTE9DSwkoMVVMTCA8PCA4KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QUkVGRVRDSF9ESVNBQkxFCSgxVUxMIDw8IDkpCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlIJCSgxVUxMIDw8IDEwKQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX01VTFRJUExFWAkoMVVMTCA8PCAxMCkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0yCQkoMVVMTCA8PCAxMykKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQURKX1BSRUZfRElTQUJMRQkoMVVMTCA8PCAxOSkKLSNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BFRURTVEVQX0xPQ0sJKDFVTEwgPDwgMjApCi0jZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0wxRF9DT05URVhUCSgxVUxMIDw8IDI0KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9EQ1VfUFJFRl9ESVNBQkxFCSgxVUxMIDw8IDM3KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UVVJCT19ESVNBQkxFCSgxVUxMIDw8IDM4KQotI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9JUF9QUkVGX0RJU0FCTEUJKDFVTEwgPDwgMzkpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1g4N19DT01QQVRfQklUCQkyCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1g4N19DT01QQVQJCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YODdfQ09NUEFUX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0xX0JJVAkJCTMKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0xCQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0xX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BMSVRfTE9DS19ESVNBQkxFX0JJVAk0CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQTElUX0xPQ0tfRElTQUJMRQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BMSVRfTE9DS19ESVNBQkxFX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTDNDQUNIRV9ESVNBQkxFX0JJVAk2CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0wzQ0FDSEVfRElTQUJMRQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTDNDQUNIRV9ESVNBQkxFX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1VQUFJFU1NfTE9DS19CSVQJCTgKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1VQUFJFU1NfTE9DSwkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1VQUFJFU1NfTE9DS19CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1BSRUZFVENIX0RJU0FCTEVfQklUCTkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUFJFRkVUQ0hfRElTQUJMRQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUFJFRkVUQ0hfRElTQUJMRV9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlJfQklUCQkJMTAKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkVSUgkJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlJfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX01VTFRJUExFWF9CSVQJCTEwCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlJfTVVMVElQTEVYCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX01VTFRJUExFWF9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RNMl9CSVQJCQkxMworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UTTIJCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UTTJfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9BREpfUFJFRl9ESVNBQkxFX0JJVAkxOQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9BREpfUFJFRl9ESVNBQkxFCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9BREpfUFJFRl9ESVNBQkxFX0JJVCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BFRURTVEVQX0xPQ0tfQklUCQkyMAorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9TUEVFRFNURVBfTE9DSwkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BFRURTVEVQX0xPQ0tfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MMURfQ09OVEVYVF9CSVQJCTI0CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0wxRF9DT05URVhUCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MMURfQ09OVEVYVF9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0RDVV9QUkVGX0RJU0FCTEVfQklUCTM3CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0RDVV9QUkVGX0RJU0FCTEUJCSgxVUxMIDw8IE1TUl9JQTMyX01JU0NfRU5BQkxFX0RDVV9QUkVGX0RJU0FCTEVfQklUKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UVVJCT19ESVNBQkxFX0JJVAkJMzgKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVFVSQk9fRElTQUJMRQkJKDFVTEwgPDwgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVFVSQk9fRElTQUJMRV9CSVQpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0lQX1BSRUZfRElTQUJMRV9CSVQJMzkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfSVBfUFJFRl9ESVNBQkxFCQkoMVVMTCA8PCBNU1JfSUEzMl9NSVNDX0VOQUJMRV9JUF9QUkVGX0RJU0FCTEVfQklUKQogCiAjZGVmaW5lIE1TUl9JQTMyX1RTQ19ERUFETElORQkJMHgwMDAwMDZFMAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2I2NDhjOC4uZjRkOTYwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogb2JqLXkJCQkrPSBwcm9iZV9yb21zLm8KIG9iai0kKENPTkZJR19YODZfMzIpCSs9IGkzODZfa3N5bXNfMzIubwogb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gc3lzX3g4Nl82NC5vIHg4NjY0X2tzeW1zXzY0Lm8KLW9iai15CQkJKz0gc3lzY2FsbF8kKEJJVFMpLm8KK29iai15CQkJKz0gc3lzY2FsbF8kKEJJVFMpLm8gdnN5c2NhbGxfZ3RvZC5vCiBvYmotJChDT05GSUdfWDg2XzY0KQkrPSB2c3lzY2FsbF82NC5vCiBvYmotJChDT05GSUdfWDg2XzY0KQkrPSB2c3lzY2FsbF9lbXVfNjQubwogb2JqLSQoQ09ORklHX1NZU0ZTKQkrPSBrc3lzZnMubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDEyM2Y5ZTMuLjg2MjgxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTYwOSwxMCArNjA5LDEwIEBACiAJaW50IG5pZDsKIAogCW5pZCA9IGFjcGlfZ2V0X25vZGUoaGFuZGxlKTsKLQlpZiAobmlkID09IC0xIHx8ICFub2RlX29ubGluZShuaWQpKQotCQlyZXR1cm47Ci0Jc2V0X2FwaWNpZF90b19ub2RlKHBoeXNpZCwgbmlkKTsKLQludW1hX3NldF9ub2RlKGNwdSwgbmlkKTsKKwlpZiAobmlkICE9IC0xKSB7CisJCXNldF9hcGljaWRfdG9fbm9kZShwaHlzaWQsIG5pZCk7CisJCW51bWFfc2V0X25vZGUoY3B1LCBuaWQpOworCX0KICNlbmRpZgogfQogCkBAIC05MDMsMTAgKzkwMyw2IEBACiAjaWZkZWYJQ09ORklHX1g4Nl9JT19BUElDCiAjZGVmaW5lIE1QX0lTQV9CVVMJCTAKIAotI2lmZGVmIENPTkZJR19YODZfRVM3MDAwCi1leHRlcm4gaW50IGVzNzAwMF9wbGF0OwotI2VuZGlmCi0KIHZvaWQgX19pbml0IG1wX292ZXJyaWRlX2xlZ2FjeV9pcnEodTggYnVzX2lycSwgdTggcG9sYXJpdHksIHU4IHRyaWdnZXIsIHUzMiBnc2kpCiB7CiAJaW50IGlvYXBpYzsKQEAgLTk1NiwxNCArOTUyLDYgQEAKIAlzZXRfYml0KE1QX0lTQV9CVVMsIG1wX2J1c19ub3RfcGNpKTsKIAlwcl9kZWJ1ZygiQnVzICMlZCBpcyBJU0FcbiIsIE1QX0lTQV9CVVMpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl9FUzcwMDAKLQkvKgotCSAqIE9sZGVyIGdlbmVyYXRpb25zIG9mIEVTNzAwMCBoYXZlIG5vIGxlZ2FjeSBpZGVudGl0eSBtYXBwaW5ncwotCSAqLwotCWlmIChlczcwMDBfcGxhdCA9PSAxKQotCQlyZXR1cm47Ci0jZW5kaWYKLQogCS8qCiAJICogVXNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUlFzIDAtMTUuICBVbmxlc3MKIAkgKiBvdmVycmlkZGVuIGJ5IChNQURUKSBpbnRlcnJ1cHQgc291cmNlIG92ZXJyaWRlIGVudHJpZXMuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMKaW5kZXggZGVjOGRlNC4uZjA0ZGJiMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYwpAQCAtMjIsNiArMjIsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX00xMEhfRjMpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTTMwSF9OQl9GMykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9OQl9GMykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YzKSB9LAogCXt9CiB9OwogRVhQT1JUX1NZTUJPTChhbWRfbmJfbWlzY19pZHMpOwpAQCAtMzAsNiArMzEsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0Y0KSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX00zMEhfTkJfRjQpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjQpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GNCkgfSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYwppbmRleCBmZDk3MmEzLi45ZmE4YWEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8YXNtL2U4MjAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTU0LDE4ICs1Myw2IEBACiAKIGludCBmaXhfYXBlcnR1cmUgX19pbml0ZGF0YSA9IDE7CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ2FydF9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJHQVJUIiwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbnNlcnRfYXBlcnR1cmVfcmVzb3VyY2UodTMyIGFwZXJfYmFzZSwgdTMyIGFwZXJfc2l6ZSkKLXsKLQlnYXJ0X3Jlc291cmNlLnN0YXJ0ID0gYXBlcl9iYXNlOwotCWdhcnRfcmVzb3VyY2UuZW5kID0gYXBlcl9iYXNlICsgYXBlcl9zaXplIC0gMTsKLQlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmZ2FydF9yZXNvdXJjZSk7Ci19Ci0KIC8qIFRoaXMgY29kZSBydW5zIGJlZm9yZSB0aGUgUENJIHN1YnN5c3RlbSBpcyBpbml0aWFsaXplZCwgc28ganVzdAogICAgYWNjZXNzIHRoZSBub3J0aGJyaWRnZSBkaXJlY3RseS4gKi8KIApAQCAtOTYsNyArODMsNiBAQAogCW1lbWJsb2NrX3Jlc2VydmUoYWRkciwgYXBlcl9zaXplKTsKIAlwcmludGsoS0VSTl9JTkZPICJNYXBwaW5nIGFwZXJ0dXJlIG92ZXIgJWQgS0Igb2YgUkFNIEAgJWx4XG4iLAogCQkJYXBlcl9zaXplID4+IDEwLCBhZGRyKTsKLQlpbnNlcnRfYXBlcnR1cmVfcmVzb3VyY2UoKHUzMilhZGRyLCBhcGVyX3NpemUpOwogCXJlZ2lzdGVyX25vc2F2ZV9yZWdpb24oYWRkciA+PiBQQUdFX1NISUZULAogCQkJICAgICAgIChhZGRyK2FwZXJfc2l6ZSkgPj4gUEFHRV9TSElGVCk7CiAKQEAgLTQ0NCwxMiArNDMwLDggQEAKIAogb3V0OgogCWlmICghZml4ICYmICFmYWxsYmFja19hcGVyX2ZvcmNlKSB7Ci0JCWlmIChsYXN0X2FwZXJfYmFzZSkgewotCQkJdW5zaWduZWQgbG9uZyBuID0gKDMyICogMTAyNCAqIDEwMjQpIDw8IGxhc3RfYXBlcl9vcmRlcjsKLQotCQkJaW5zZXJ0X2FwZXJ0dXJlX3Jlc291cmNlKCh1MzIpbGFzdF9hcGVyX2Jhc2UsIG4pOworCQlpZiAobGFzdF9hcGVyX2Jhc2UpCiAJCQlyZXR1cm4gMTsKLQkJfQogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL2FwaWMvTWFrZWZpbGUKaW5kZXggMGFlMDMyMy4uZGNiNWIxNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvTWFrZWZpbGUKQEAgLTE4LDEwICsxOCw3IEBACiBlbmRpZgogCiAjIEFQSUMgcHJvYmUgd2lsbCBkZXBlbmQgb24gdGhlIGxpc3Rpbmcgb3JkZXIgaGVyZQotb2JqLSQoQ09ORklHX1g4Nl9OVU1BUSkJCSs9IG51bWFxXzMyLm8KLW9iai0kKENPTkZJR19YODZfU1VNTUlUKQkrPSBzdW1taXRfMzIubwogb2JqLSQoQ09ORklHX1g4Nl9CSUdTTVApCSs9IGJpZ3NtcF8zMi5vCi1vYmotJChDT05GSUdfWDg2X0VTNzAwMCkJKz0gZXM3MDAwXzMyLm8KIAogIyBGb3IgMzJiaXQsIHByb2JlXzMyIG5lZWQgdG8gYmUgbGlzdGVkIGxhc3QKIG9iai0kKENPTkZJR19YODZfTE9DQUxfQVBJQykJKz0gcHJvYmVfJChCSVRTKS5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKaW5kZXggN2YyNmM5YS4uNDgxYWUzOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwpAQCAtMTMzLDYgKzEzMywxMCBAQAogICogKzE9Zm9yY2UtZW5hYmxlCiAgKi8KIHN0YXRpYyBpbnQgZm9yY2VfZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YTsKKworLyogQ29udHJvbCB3aGV0aGVyIHgyQVBJQyBtb2RlIGlzIGVuYWJsZWQgb3Igbm90ICovCitzdGF0aWMgYm9vbCBub3gyYXBpYyBfX2luaXRkYXRhOworCiAvKgogICogQVBJQyBjb21tYW5kIGxpbmUgcGFyYW1ldGVycwogICovCkBAIC0xNjIsOCArMTY2LDcgQEAKIC8qIHgyYXBpYyBlbmFibGVkIGJlZm9yZSBPUyBoYW5kb3ZlciAqLwogaW50IHgyYXBpY19wcmVlbmFibGVkOwogc3RhdGljIGludCB4MmFwaWNfZGlzYWJsZWQ7Ci1zdGF0aWMgaW50IG5veDJhcGljOwotc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm94MmFwaWMoY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfbm94MmFwaWMoY2hhciAqc3RyKQogewogCWlmICh4MmFwaWNfZW5hYmxlZCgpKSB7CiAJCWludCBhcGljaWQgPSBuYXRpdmVfYXBpY19tc3JfcmVhZChBUElDX0lEKTsKQEAgLTE3OCw3ICsxODEsNyBAQAogCX0gZWxzZQogCQlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX1gyQVBJQyk7CiAKLQlub3gyYXBpYyA9IDE7CisJbm94MmFwaWMgPSB0cnVlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yODMsOCArMjg2LDEyIEBACiAKIHZvaWQgbmF0aXZlX2FwaWNfaWNyX3dyaXRlKHUzMiBsb3csIHUzMiBpZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWFwaWNfd3JpdGUoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKGlkKSk7CiAJYXBpY193cml0ZShBUElDX0lDUiwgbG93KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHU2NCBuYXRpdmVfYXBpY19pY3JfcmVhZCh2b2lkKQpAQCAtMjEyOSw3ICsyMTM2LDYgQEAKIAkgKgogCSAqIC0gYXJjaC94ODYva2VybmVsL21wcGFyc2UuYzogTVBfcHJvY2Vzc29yX2luZm8oKQogCSAqIC0gYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3kuYzogYW1kX251bWFfaW5pdCgpCi0JICogLSBhcmNoL3g4Ni9wbGF0Zm9ybS92aXN3cy92aXN3c19xdWlya3MuYzogTVBfcHJvY2Vzc29yX2luZm8oKQogCSAqCiAJICogVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aXRoIHRoZSBtb2RpZmllZAogCSAqIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZC4gU28sIGRpc2FibGVkX2NwdV9hcGljaWQga2VybmVsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCmluZGV4IDJjNjIxYTYuLjdjMWIyOTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKIAkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBOVUxMLAorCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGZhbHNlLAogCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAogCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IGRlZmF1bHRfaW5xdWlyZV9yZW1vdGVfYXBpYywKIApAQCAtMzE0LDcgKzMxNCw3IEBACiAKIAkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19MT1csCiAJLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0hJR0gsCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gTlVMTCwKKwkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBmYWxzZSwKIAkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKIAkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBkZWZhdWx0X2lucXVpcmVfcmVtb3RlX2FwaWMsCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19ub29wLmMKaW5kZXggMTkxY2U3NS4uOGM3Yzk4MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19ub29wLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19ub29wLmMKQEAgLTE3Miw4ICsxNzIsNyBAQAogCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKIAkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKIAotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IE5VTEwsCi0KKwkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBmYWxzZSwKIAkuc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljCT0gTlVMTCwKIAkuaW5xdWlyZV9yZW1vdGVfYXBpYwkJPSBOVUxMLAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMKaW5kZXggM2U2N2Y5ZS4uYTViNDVkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJLndha2V1cF9zZWNvbmRhcnlfY3B1CQk9IG51bWFjaGlwX3dha2V1cF9zZWNvbmRhcnksCiAJLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfTE9XLAogCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19ISUdILAotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IE5VTEwsCisJLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZmFsc2UsCiAJLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IE5VTEwsCiAJLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gTlVMTCwgLyogUkVNUkQgbm90IHN1cHBvcnRlZCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2JpZ3NtcF8zMi5jCmluZGV4IGQ1MGUzNjQuLmU0ODQwYWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2JpZ3NtcF8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2JpZ3NtcF8zMi5jCkBAIC0xOTksOCArMTk5LDcgQEAKIAkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19MT1csCiAJLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0hJR0gsCiAKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBkZWZhdWx0X3dhaXRfZm9yX2luaXRfZGVhc3NlcnQsCi0KKwkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSB0cnVlLAogCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAogCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IGRlZmF1bHRfaW5xdWlyZV9yZW1vdGVfYXBpYywKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9lczcwMDBfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1MjI0Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9lczcwMDBfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDc0NiArMCwwIEBACi0vKgotICogV3JpdHRlbiBieTogR2FycnkgRm9yc2dyZW4sIFVuaXN5cyBDb3Jwb3JhdGlvbgotICogICAgICAgICAgICAgTmF0YWxpZSBQcm90YXNldmljaCwgVW5pc3lzIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGNvbmZpZ3VyZSBhbmQgaW50ZXJmYWNlCi0gKiB3aXRoIFVuaXN5cyBFUzcwMDAgc2VyaWVzIGhhcmR3YXJlIHN5c3RlbSBtYW5hZ2VyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBVbmlzeXMgQ29ycG9yYXRpb24uCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDksIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCi0gKgotICogICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBVbmlzeXMgQ29ycG9yYXRpb24sIFRvd25zaGlwIExpbmUgJiBVbmlvbiBNZWV0aW5nCi0gKiBSb2Fkcy1BLCBVbmlzeXMgV2F5LCBCbHVlIEJlbGwsIFBlbm5zeWx2YW5pYSwgMTk0MjQsIG9yOgotICoKLSAqIGh0dHA6Ly93d3cudW5pc3lzLmNvbQotICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L25taS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vbXBzcGVjLmg+Ci0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KLSNpbmNsdWRlIDxhc20vaXBpLmg+Ci0KLS8qCi0gKiBFUzcwMDAgY2hpcHNldHMKLSAqLwotCi0jZGVmaW5lIE5PTl9VTklTWVMJCQkwCi0jZGVmaW5lIEVTNzAwMF9DTEFTU0lDCQkJMQotI2RlZmluZSBFUzcwMDBfWk9SUk8JCQkyCi0KLSNkZWZpbmUJTUlQX1JFRwkJCQkxCi0jZGVmaW5lCU1JUF9QU0FJX1JFRwkJCTQKLQotI2RlZmluZQlNSVBfQlVTWQkJCTEKLSNkZWZpbmUJTUlQX1NQSU4JCQkweGYwMDAwCi0jZGVmaW5lCU1JUF9WQUxJRAkJCTB4MDEwMDAwMDAwMDAwMDAwMFVMTAotI2RlZmluZQlNSVBfU1dfQVBJQwkJCTB4MTAyMGIKLQotI2RlZmluZQlNSVBfUE9SVCh2YWwpCQkJKCh2YWwgPj4gMzIpICYgMHhmZmZmKQotCi0jZGVmaW5lCU1JUF9SRF9MTyh2YWwpCQkJKHZhbCAmIDB4ZmZmZmZmZmYpCi0KLXN0cnVjdCBtaXBfcmVnIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDAwOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJb2ZmXzB4MDg7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgxMDsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDE4OwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJb2ZmXzB4MjA7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlvZmZfMHgyODsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW9mZl8weDMwOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJb2ZmXzB4Mzg7Ci19OwotCi1zdHJ1Y3QgbWlwX3JlZ19pbmZvIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCW1pcF9pbmZvOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJZGVsaXZlcnlfaW5mbzsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCWhvc3RfcmVnOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJbWlwX3JlZzsKLX07Ci0KLXN0cnVjdCBwc2FpIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcJCWVudHJ5X3R5cGU7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlhZGRyOwotCXVuc2lnbmVkIGxvbmcgbG9uZwkJYmVwX2FkZHI7Ci19OwotCi0jaWZkZWYgQ09ORklHX0FDUEkKLQotc3RydWN0IGVzNzAwMF9vZW1fdGFibGUgewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcglIZWFkZXI7Ci0JdTMyCQkJCU9FTVRhYmxlQWRkcjsKLQl1MzIJCQkJT0VNVGFibGVTaXplOwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlvZW1fYWRkclg7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZwkJCW9lbV9zaXplOwotCi0jZW5kaWYKLQotLyoKLSAqIEVTNzAwMCBHbG9iYWxzCi0gKi8KLQotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJCSpwc2FpOwotc3RhdGljIHN0cnVjdCBtaXBfcmVnCQkJKm1pcF9yZWc7Ci1zdGF0aWMgc3RydWN0IG1pcF9yZWcJCQkqaG9zdF9yZWc7Ci1zdGF0aWMgaW50IAkJCQltaXBfcG9ydDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nCQkJbWlwX2FkZHI7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZwkJCWhvc3RfYWRkcjsKLQotaW50CQkJCQllczcwMDBfcGxhdDsKLQotLyoKLSAqIEdTSSBvdmVycmlkZSBmb3IgRVM3MDAwIHBsYXRmb3Jtcy4KLSAqLwotCi0KLXN0YXRpYyBpbnQgd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX21pcChpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGVpcCkKLXsKLQl1bnNpZ25lZCBsb25nIHZlY3QgPSAwLCBwc2FpdmFsID0gMDsKLQotCWlmIChwc2FpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCXZlY3QgPSAoKHVuc2lnbmVkIGxvbmcpX19wYShlaXApLzB4MTAwMCkgPDwgMTY7Ci0JcHNhaXZhbCA9ICgweDEwMDAwMDAgfCB2ZWN0IHwgY3B1KTsKLQotCXdoaWxlICgqcHNhaSAmIDB4MTAwMDAwMCkKLQkJOwotCi0JKnBzYWkgPSBwc2FpdmFsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2FwaWNfaXNfY2x1c3Rlcih2b2lkKQotewotCS8qIE1QRU5USVVNSUlJICovCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYKLQkgICAgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID49IDcgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPD0gMTEpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF91bmlzeXModm9pZCkKLXsKLQkvKgotCSAqIERldGVybWluZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRVM3MDAwIGN1cnJlbnRseSBydW5uaW5nLgotCSAqCi0JICogZXM3MDAwX3BsYXQgPSAxIGlmIHRoZSBtYWNoaW5lIGlzIGEgNXh4IEVTNzAwMCBib3gKLQkgKiBlczcwMDBfcGxhdCA9IDIgaWYgdGhlIG1hY2hpbmUgaXMgYSB4ODZfNjQgRVM3MDAwIGJveAotCSAqCi0JICovCi0JaWYgKCEoYm9vdF9jcHVfZGF0YS54ODYgPD0gMTUgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPD0gMikpCi0JCWVzNzAwMF9wbGF0ID0gRVM3MDAwX1pPUlJPOwotCWVsc2UKLQkJZXM3MDAwX3BsYXQgPSBFUzcwMDBfQ0xBU1NJQzsKLX0KLQotLyoKLSAqIFBhcnNlIHRoZSBPRU0gVGFibGU6Ci0gKi8KLXN0YXRpYyBpbnQgcGFyc2VfdW5pc3lzX29lbShjaGFyICpvZW1wdHIpCi17Ci0JaW50CQkJaTsKLQlpbnQgCQkJc3VjY2VzcyA9IDA7Ci0JdW5zaWduZWQgY2hhcgkJdHlwZSwgc2l6ZTsKLQl1bnNpZ25lZCBsb25nCQl2YWw7Ci0JY2hhcgkJCSp0cCA9IE5VTEw7Ci0Jc3RydWN0IHBzYWkJCSpwc2FpcCA9IE5VTEw7Ci0Jc3RydWN0IG1pcF9yZWdfaW5mbyAJKm1pOwotCXN0cnVjdCBtaXBfcmVnCQkqaG9zdCwgKm1pcDsKLQotCXRwID0gb2VtcHRyOwotCi0JdHAgKz0gODsKLQotCWZvciAoaSA9IDA7IGkgPD0gNjsgaSsrKSB7Ci0JCXR5cGUgPSAqdHArKzsKLQkJc2l6ZSA9ICp0cCsrOwotCQl0cCAtPSAyOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBNSVBfUkVHOgotCQkJbWkgPSAoc3RydWN0IG1pcF9yZWdfaW5mbyAqKXRwOwotCQkJdmFsID0gTUlQX1JEX0xPKG1pLT5ob3N0X3JlZyk7Ci0JCQlob3N0X2FkZHIgPSB2YWw7Ci0JCQlob3N0ID0gKHN0cnVjdCBtaXBfcmVnICopdmFsOwotCQkJaG9zdF9yZWcgPSBfX3ZhKGhvc3QpOwotCQkJdmFsID0gTUlQX1JEX0xPKG1pLT5taXBfcmVnKTsKLQkJCW1pcF9wb3J0ID0gTUlQX1BPUlQobWktPm1pcF9pbmZvKTsKLQkJCW1pcF9hZGRyID0gdmFsOwotCQkJbWlwID0gKHN0cnVjdCBtaXBfcmVnICopdmFsOwotCQkJbWlwX3JlZyA9IF9fdmEobWlwKTsKLQkJCXByX2RlYnVnKCJob3N0X3JlZyA9IDB4JWx4XG4iLAotCQkJCSAodW5zaWduZWQgbG9uZylob3N0X3JlZyk7Ci0JCQlwcl9kZWJ1ZygibWlwX3JlZyA9IDB4JWx4XG4iLAotCQkJCSAodW5zaWduZWQgbG9uZyltaXBfcmVnKTsKLQkJCXN1Y2Nlc3MrKzsKLQkJCWJyZWFrOwotCQljYXNlIE1JUF9QU0FJX1JFRzoKLQkJCXBzYWlwID0gKHN0cnVjdCBwc2FpICopdHA7Ci0JCQlpZiAodHAgIT0gTlVMTCkgewotCQkJCWlmIChwc2FpcC0+YWRkcikKLQkJCQkJcHNhaSA9IF9fdmEocHNhaXAtPmFkZHIpOwotCQkJCWVsc2UKLQkJCQkJcHNhaSA9IE5VTEw7Ci0JCQkJc3VjY2VzcysrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQl0cCArPSBzaXplOwotCX0KLQotCWlmIChzdWNjZXNzIDwgMikKLQkJZXM3MDAwX3BsYXQgPSBOT05fVU5JU1lTOwotCWVsc2UKLQkJc2V0dXBfdW5pc3lzKCk7Ci0KLQlyZXR1cm4gZXM3MDAwX3BsYXQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQUNQSQotc3RhdGljIGludCBfX2luaXQgZmluZF91bmlzeXNfYWNwaV9vZW1fdGFibGUodW5zaWduZWQgbG9uZyAqb2VtX2FkZHIpCi17Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOwotCXN0cnVjdCBlczcwMDBfb2VtX3RhYmxlICp0YWJsZTsKLQlhY3BpX3NpemUgdGJsX3NpemU7Ci0JYWNwaV9zdGF0dXMgcmV0OwotCWludCBpID0gMDsKLQotCWZvciAoOzspIHsKLQkJcmV0ID0gYWNwaV9nZXRfdGFibGVfd2l0aF9zaXplKCJPRU0xIiwgaSsrLCAmaGVhZGVyLCAmdGJsX3NpemUpOwotCQlpZiAoIUFDUElfU1VDQ0VTUyhyZXQpKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghbWVtY21wKChjaGFyICopICZoZWFkZXItPm9lbV9pZCwgIlVOSVNZUyIsIDYpKQotCQkJYnJlYWs7Ci0KLQkJZWFybHlfYWNwaV9vc191bm1hcF9tZW1vcnkoaGVhZGVyLCB0Ymxfc2l6ZSk7Ci0JfQotCi0JdGFibGUgPSAodm9pZCAqKWhlYWRlcjsKLQotCW9lbV9hZGRyWAk9IHRhYmxlLT5PRU1UYWJsZUFkZHI7Ci0Jb2VtX3NpemUJPSB0YWJsZS0+T0VNVGFibGVTaXplOwotCi0JZWFybHlfYWNwaV9vc191bm1hcF9tZW1vcnkoaGVhZGVyLCB0Ymxfc2l6ZSk7Ci0KLQkqb2VtX2FkZHIJPSAodW5zaWduZWQgbG9uZylfX2FjcGlfbWFwX3RhYmxlKG9lbV9hZGRyWCwgb2VtX3NpemUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB1bm1hcF91bmlzeXNfYWNwaV9vZW1fdGFibGUodW5zaWduZWQgbG9uZyBvZW1fYWRkcikKLXsKLQlpZiAoIW9lbV9hZGRyKQotCQlyZXR1cm47Ci0KLQlfX2FjcGlfdW5tYXBfdGFibGUoKGNoYXIgKilvZW1fYWRkciwgb2VtX3NpemUpOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9jaGVja19kc2R0KHZvaWQpCi17Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKLQotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfdGFibGVfaGVhZGVyKEFDUElfU0lHX0RTRFQsIDAsICZoZWFkZXIpKSAmJgotCSAgICAhc3RybmNtcChoZWFkZXIub2VtX2lkLCAiVU5JU1lTIiwgNikpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVzNzAwMF9hY3BpX3JldDsKLQotLyogSG9vayBmcm9tIGdlbmVyaWMgQUNQSSB0YWJsZXMuYyAqLwotc3RhdGljIGludCBfX2luaXQgZXM3MDAwX2FjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBvZW1fYWRkciA9IDA7Ci0JaW50IGNoZWNrX2RzZHQ7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBjaGVjayBkc2R0IGF0IGZpcnN0IHRvIGF2b2lkIGNsZWFyIGZpeF9tYXAgZm9yIG9lbV9hZGRyICovCi0JY2hlY2tfZHNkdCA9IGVzNzAwMF9jaGVja19kc2R0KCk7Ci0KLQlpZiAoIWZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKCZvZW1fYWRkcikpIHsKLQkJaWYgKGNoZWNrX2RzZHQpIHsKLQkJCXJldCA9IHBhcnNlX3VuaXN5c19vZW0oKGNoYXIgKilvZW1fYWRkcik7Ci0JCX0gZWxzZSB7Ci0JCQlzZXR1cF91bmlzeXMoKTsKLQkJCXJldCA9IDE7Ci0JCX0KLQkJLyoKLQkJICogd2UgbmVlZCB0byB1bm1hcCBpdAotCQkgKi8KLQkJdW5tYXBfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKG9lbV9hZGRyKTsKLQl9Ci0KLQllczcwMDBfYWNwaV9yZXQgPSByZXQ7Ci0KLQlyZXR1cm4gcmV0ICYmICFlczcwMDBfYXBpY19pc19jbHVzdGVyKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2FjcGlfbWFkdF9vZW1fY2hlY2tfY2x1c3RlcihjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKLXsKLQlpbnQgcmV0ID0gZXM3MDAwX2FjcGlfcmV0OwotCi0JcmV0dXJuIHJldCAmJiBlczcwMDBfYXBpY19pc19jbHVzdGVyKCk7Ci19Ci0KLSNlbHNlIC8qICFDT05GSUdfQUNQSTogKi8KLXN0YXRpYyBpbnQgZXM3MDAwX2FjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2FjcGlfbWFkdF9vZW1fY2hlY2tfY2x1c3RlcihjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiAhQ09ORklHX0FDUEkgKi8KLQotc3RhdGljIHZvaWQgZXM3MDAwX3NwaW4oaW50IG4pCi17Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGkrKyA8IG4pCi0JCXJlcF9ub3AoKTsKLX0KLQotc3RhdGljIGludCBlczcwMDBfbWlwX3dyaXRlKHN0cnVjdCBtaXBfcmVnICptaXBfcmVnKQotewotCWludCBzdGF0dXMgPSAwOwotCWludCBzcGluOwotCi0Jc3BpbiA9IE1JUF9TUElOOwotCXdoaWxlICgoaG9zdF9yZWctPm9mZl8weDM4ICYgTUlQX1ZBTElEKSAhPSAwKSB7Ci0JCWlmICgtLXNwaW4gPD0gMCkgewotCQkJV0FSTigxLAkiVGltZW91dCB3YWl0aW5nIGZvciBIb3N0IFZhbGlkIEZsYWdcbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVzNzAwMF9zcGluKE1JUF9TUElOKTsKLQl9Ci0KLQltZW1jcHkoaG9zdF9yZWcsIG1pcF9yZWcsIHNpemVvZihzdHJ1Y3QgbWlwX3JlZykpOwotCW91dGIoMSwgbWlwX3BvcnQpOwotCi0Jc3BpbiA9IE1JUF9TUElOOwotCi0Jd2hpbGUgKChtaXBfcmVnLT5vZmZfMHgzOCAmIE1JUF9WQUxJRCkgPT0gMCkgewotCQlpZiAoLS1zcGluIDw9IDApIHsKLQkJCVdBUk4oMSwJIlRpbWVvdXQgd2FpdGluZyBmb3IgTUlQIFZhbGlkIEZsYWdcbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVzNzAwMF9zcGluKE1JUF9TUElOKTsKLQl9Ci0KLQlzdGF0dXMgPSAobWlwX3JlZy0+b2ZmXzB4MDAgJiAweGZmZmYwMDAwMDAwMDAwVUxMKSA+PiA0ODsKLQltaXBfcmVnLT5vZmZfMHgzOCAmPSB+TUlQX1ZBTElEOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgZXM3MDAwX2VuYWJsZV9hcGljX21vZGUodm9pZCkKLXsKLQlzdHJ1Y3QgbWlwX3JlZyBlczcwMDBfbWlwX3JlZzsKLQlpbnQgbWlwX3N0YXR1czsKLQotCWlmICghZXM3MDAwX3BsYXQpCi0JCXJldHVybjsKLQotCXByX2luZm8oIkVuYWJsaW5nIEFQSUMgbW9kZS5cbiIpOwotCW1lbXNldCgmZXM3MDAwX21pcF9yZWcsIDAsIHNpemVvZihzdHJ1Y3QgbWlwX3JlZykpOwotCWVzNzAwMF9taXBfcmVnLm9mZl8weDAwID0gTUlQX1NXX0FQSUM7Ci0JZXM3MDAwX21pcF9yZWcub2ZmXzB4MzggPSBNSVBfVkFMSUQ7Ci0KLQl3aGlsZSAoKG1pcF9zdGF0dXMgPSBlczcwMDBfbWlwX3dyaXRlKCZlczcwMDBfbWlwX3JlZykpICE9IDApCi0JCVdBUk4oMSwgIkNvbW1hbmQgZmFpbGVkLCBzdGF0dXMgPSAleFxuIiwgbWlwX3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF93YWl0X2Zvcl9pbml0X2RlYXNzZXJ0KGF0b21pY190ICpkZWFzc2VydCkKLXsKLQl3aGlsZSAoIWF0b21pY19yZWFkKGRlYXNzZXJ0KSkKLQkJY3B1X3JlbGF4KCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZXM3MDAwX2dldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKLXsKLQlyZXR1cm4gKHggPj4gMjQpICYgMHhGRjsKLX0KLQotc3RhdGljIHZvaWQgZXM3MDAwX3NlbmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX3NlcXVlbmNlX3BoeXMobWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIHZvaWQgZXM3MDAwX3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKLXsKLQlkZWZhdWx0X3NlbmRfSVBJX21hc2tfYWxsYnV0c2VsZl9waHlzKGNwdV9vbmxpbmVfbWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIHZvaWQgZXM3MDAwX3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQotewotCWVzNzAwMF9zZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGludCBlczcwMDBfYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqdGFyZ2V0X2NwdXNfY2x1c3Rlcih2b2lkKQotewotCXJldHVybiBjcHVfYWxsX21hc2s7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZXM3MDAwX3RhcmdldF9jcHVzKHZvaWQpCi17Ci0JcmV0dXJuIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXM3MDAwX2NoZWNrX2FwaWNpZF91c2VkKHBoeXNpZF9tYXNrX3QgKm1hcCwgaW50IGFwaWNpZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXM3MDAwX2NoZWNrX2FwaWNpZF9wcmVzZW50KGludCBiaXQpCi17Ci0JcmV0dXJuIHBoeXNpZF9pc3NldChiaXQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKLX0KLQotc3RhdGljIGludCBlczcwMDBfZWFybHlfbG9naWNhbF9hcGljaWQoaW50IGNwdSkKLXsKLQkvKiBvbiBlczcwMDAsIGxvZ2ljYWwgYXBpY2lkIGlzIHRoZSBzYW1lIGFzIHBoeXNpY2FsICovCi0JcmV0dXJuIGVhcmx5X3Blcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgY3B1KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY3VsYXRlX2xkcihpbnQgY3B1KQotewotCXVuc2lnbmVkIGxvbmcgaWQgPSBwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIGNwdSk7Ci0KLQlyZXR1cm4gU0VUX0FQSUNfTE9HSUNBTF9JRChpZCk7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gSUQuCi0gKgotICogSW50ZWwgcmVjb21tZW5kcyB0byBzZXQgREZSLCBMZFIgYW5kIFRQUiBiZWZvcmUgZW5hYmxpbmcKLSAqIGFuIEFQSUMuICBTZWUgZS5nLiAiQVAtMzg4IDgyNDg5RFggVXNlcidzIE1hbnVhbCIgKEludGVsCi0gKiBkb2N1bWVudCBudW1iZXIgMjkyMTE2KS4gIFNvIGhlcmUgaXQgZ29lcy4uLgotICovCi1zdGF0aWMgdm9pZCBlczcwMDBfaW5pdF9hcGljX2xkcl9jbHVzdGVyKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWFwaWNfd3JpdGUoQVBJQ19ERlIsIEFQSUNfREZSX0NMVVNURVIpOwotCXZhbCA9IGNhbGN1bGF0ZV9sZHIoY3B1KTsKLQlhcGljX3dyaXRlKEFQSUNfTERSLCB2YWwpOwotfQotCi1zdGF0aWMgdm9pZCBlczcwMDBfaW5pdF9hcGljX2xkcih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlhcGljX3dyaXRlKEFQSUNfREZSLCBBUElDX0RGUl9GTEFUKTsKLQl2YWwgPSBjYWxjdWxhdGVfbGRyKGNwdSk7Ci0JYXBpY193cml0ZShBUElDX0xEUiwgdmFsKTsKLX0KLQotc3RhdGljIHZvaWQgZXM3MDAwX3NldHVwX2FwaWNfcm91dGluZyh2b2lkKQotewotCWludCBhcGljID0gcGVyX2NwdSh4ODZfYmlvc19jcHVfYXBpY2lkLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCi0JcHJfaW5mbygiRW5hYmxpbmcgQVBJQyBtb2RlOiAgJXMuIFVzaW5nICVkIEkvTyBBUElDcywgdGFyZ2V0IGNwdXMgJWx4XG4iLAotCQkoYXBpY192ZXJzaW9uW2FwaWNdID09IDB4MTQpID8KLQkJCSJQaHlzaWNhbCBDbHVzdGVyIiA6ICJMb2dpY2FsIENsdXN0ZXIiLAotCQlucl9pb2FwaWNzLCBjcHVtYXNrX2JpdHMoZXM3MDAwX3RhcmdldF9jcHVzKCkpWzBdKTsKLX0KLQotc3RhdGljIGludCBlczcwMDBfY3B1X3ByZXNlbnRfdG9fYXBpY2lkKGludCBtcHNfY3B1KQotewotCWlmICghbXBzX2NwdSkKLQkJcmV0dXJuIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKLQllbHNlIGlmIChtcHNfY3B1IDwgbnJfY3B1X2lkcykKLQkJcmV0dXJuIHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgbXBzX2NwdSk7Ci0JZWxzZQotCQlyZXR1cm4gQkFEX0FQSUNJRDsKLX0KLQotc3RhdGljIGludCBjcHVfaWQ7Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9hcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IHBoeXNfYXBpY2lkLCBwaHlzaWRfbWFza190ICpyZXRtYXApCi17Ci0JcGh5c2lkX3NldF9tYXNrX29mX3BoeXNpZChjcHVfaWQsIHJldG1hcCk7Ci0JKytjcHVfaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzNzAwMF9pb2FwaWNfcGh5c19pZF9tYXAocGh5c2lkX21hc2tfdCAqcGh5c19tYXAsIHBoeXNpZF9tYXNrX3QgKnJldG1hcCkKLXsKLQkvKiBGb3IgY2x1c3RlcmVkIHdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byBkbyB0aGlzIHlldCAtIGhhY2sgKi8KLQlwaHlzaWRzX3Byb21vdGUoMHhGRkwsIHJldG1hcCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXM3MDAwX2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IGNwdV9waHlzaWNhbF9hcGljaWQpCi17Ci0JYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gcmVhZF9hcGljX2lkKCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1lczcwMDBfY3B1X21hc2tfdG9fYXBpY2lkKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLCB1bnNpZ25lZCBpbnQgKmRlc3RfaWQpCi17Ci0JdW5zaWduZWQgaW50IHJvdW5kID0gMDsKLQl1bnNpZ25lZCBpbnQgY3B1LCB1bmluaXRpYWxpemVkX3ZhcihhcGljaWQpOwotCi0JLyoKLQkgKiBUaGUgY3B1cyBpbiB0aGUgbWFzayBtdXN0IGFsbCBiZSBvbiB0aGUgYXBpYyBjbHVzdGVyLgotCSAqLwotCWZvcl9lYWNoX2NwdV9hbmQoY3B1LCBjcHVtYXNrLCBjcHVfb25saW5lX21hc2spIHsKLQkJaW50IG5ld19hcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIGNwdSk7Ci0KLQkJaWYgKHJvdW5kICYmIEFQSUNfQ0xVU1RFUihhcGljaWQpICE9IEFQSUNfQ0xVU1RFUihuZXdfYXBpY2lkKSkgewotCQkJV0FSTigxLCAiTm90IGEgdmFsaWQgbWFzayEiKTsKLQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYXBpY2lkIHw9IG5ld19hcGljaWQ7Ci0JCXJvdW5kKys7Ci0JfQotCWlmICghcm91bmQpCi0JCXJldHVybiAtRUlOVkFMOwotCSpkZXN0X2lkID0gYXBpY2lkOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1lczcwMDBfY3B1X21hc2tfdG9fYXBpY2lkX2FuZChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqaW5tYXNrLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFuZG1hc2ssCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgKmFwaWNpZCkKLXsKLQljcHVtYXNrX3Zhcl90IGNwdW1hc2s7Ci0JKmFwaWNpZCA9IGVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgMCk7Ci0KLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZjcHVtYXNrLCBHRlBfQVRPTUlDKSkKLQkJcmV0dXJuIDA7Ci0KLQljcHVtYXNrX2FuZChjcHVtYXNrLCBpbm1hc2ssIGFuZG1hc2spOwotCWVzNzAwMF9jcHVfbWFza190b19hcGljaWQoY3B1bWFzaywgYXBpY2lkKTsKLQotCWZyZWVfY3B1bWFza192YXIoY3B1bWFzayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlczcwMDBfcGh5c19wa2dfaWQoaW50IGNwdWlkX2FwaWMsIGludCBpbmRleF9tc2IpCi17Ci0JcmV0dXJuIGNwdWlkX2FwaWMgPj4gaW5kZXhfbXNiOwotfQotCi1zdGF0aWMgaW50IHByb2JlX2VzNzAwMCh2b2lkKQotewotCS8qIHByb2JlZCBsYXRlciBpbiBtcHRhYmxlL0FDUEkgaG9va3MgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlczcwMDBfbXBzX3JldDsKLXN0YXRpYyBpbnQgZXM3MDAwX21wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sCi0JCWNoYXIgKnByb2R1Y3RpZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChtcGMtPm9lbXB0cikgewotCQlzdHJ1Y3QgbXBjX29lbXRhYmxlICpvZW1fdGFibGUgPQotCQkJKHN0cnVjdCBtcGNfb2VtdGFibGUgKiltcGMtPm9lbXB0cjsKLQotCQlpZiAoIXN0cm5jbXAob2VtLCAiVU5JU1lTIiwgNikpCi0JCQlyZXQgPSBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX3RhYmxlKTsKLQl9Ci0KLQllczcwMDBfbXBzX3JldCA9IHJldDsKLQotCXJldHVybiByZXQgJiYgIWVzNzAwMF9hcGljX2lzX2NsdXN0ZXIoKTsKLX0KLQotc3RhdGljIGludCBlczcwMDBfbXBzX29lbV9jaGVja19jbHVzdGVyKHN0cnVjdCBtcGNfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQljaGFyICpwcm9kdWN0aWQpCi17Ci0JaW50IHJldCA9IGVzNzAwMF9tcHNfcmV0OwotCi0JcmV0dXJuIHJldCAmJiBlczcwMDBfYXBpY19pc19jbHVzdGVyKCk7Ci19Ci0KLS8qIFdlJ3ZlIGJlZW4gd2FybmVkIGJ5IGEgZmFsc2UgcG9zaXRpdmUgd2FybmluZy5Vc2UgX19yZWZkYXRhIHRvIGtlZXAgY2FsbS4gKi8KLXN0YXRpYyBzdHJ1Y3QgYXBpYyBfX3JlZmRhdGEgYXBpY19lczcwMDBfY2x1c3RlciA9IHsKLQotCS5uYW1lCQkJCT0gImVzNzAwMCIsCi0JLnByb2JlCQkJCT0gcHJvYmVfZXM3MDAwLAotCS5hY3BpX21hZHRfb2VtX2NoZWNrCQk9IGVzNzAwMF9hY3BpX21hZHRfb2VtX2NoZWNrX2NsdXN0ZXIsCi0JLmFwaWNfaWRfdmFsaWQJCQk9IGRlZmF1bHRfYXBpY19pZF92YWxpZCwKLQkuYXBpY19pZF9yZWdpc3RlcmVkCQk9IGVzNzAwMF9hcGljX2lkX3JlZ2lzdGVyZWQsCi0KLQkuaXJxX2RlbGl2ZXJ5X21vZGUJCT0gZGVzdF9Mb3dlc3RQcmlvLAotCS8qIGxvZ2ljYWwgZGVsaXZlcnkgYnJvYWRjYXN0IHRvIGFsbCBwcm9jczogKi8KLQkuaXJxX2Rlc3RfbW9kZQkJCT0gMSwKLQotCS50YXJnZXRfY3B1cwkJCT0gdGFyZ2V0X2NwdXNfY2x1c3RlciwKLQkuZGlzYWJsZV9lc3IJCQk9IDEsCi0JLmRlc3RfbG9naWNhbAkJCT0gMCwKLQkuY2hlY2tfYXBpY2lkX3VzZWQJCT0gZXM3MDAwX2NoZWNrX2FwaWNpZF91c2VkLAotCS5jaGVja19hcGljaWRfcHJlc2VudAkJPSBlczcwMDBfY2hlY2tfYXBpY2lkX3ByZXNlbnQsCi0KLQkudmVjdG9yX2FsbG9jYXRpb25fZG9tYWluCT0gZmxhdF92ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4sCi0JLmluaXRfYXBpY19sZHIJCQk9IGVzNzAwMF9pbml0X2FwaWNfbGRyX2NsdXN0ZXIsCi0KLQkuaW9hcGljX3BoeXNfaWRfbWFwCQk9IGVzNzAwMF9pb2FwaWNfcGh5c19pZF9tYXAsCi0JLnNldHVwX2FwaWNfcm91dGluZwkJPSBlczcwMDBfc2V0dXBfYXBpY19yb3V0aW5nLAotCS5tdWx0aV90aW1lcl9jaGVjawkJPSBOVUxMLAotCS5jcHVfcHJlc2VudF90b19hcGljaWQJCT0gZXM3MDAwX2NwdV9wcmVzZW50X3RvX2FwaWNpZCwKLQkuYXBpY2lkX3RvX2NwdV9wcmVzZW50CQk9IGVzNzAwMF9hcGljaWRfdG9fY3B1X3ByZXNlbnQsCi0JLnNldHVwX3BvcnRpb19yZW1hcAkJPSBOVUxMLAotCS5jaGVja19waHlzX2FwaWNpZF9wcmVzZW50CT0gZXM3MDAwX2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQsCi0JLmVuYWJsZV9hcGljX21vZGUJCT0gZXM3MDAwX2VuYWJsZV9hcGljX21vZGUsCi0JLnBoeXNfcGtnX2lkCQkJPSBlczcwMDBfcGh5c19wa2dfaWQsCi0JLm1wc19vZW1fY2hlY2sJCQk9IGVzNzAwMF9tcHNfb2VtX2NoZWNrX2NsdXN0ZXIsCi0KLQkuZ2V0X2FwaWNfaWQJCQk9IGVzNzAwMF9nZXRfYXBpY19pZCwKLQkuc2V0X2FwaWNfaWQJCQk9IE5VTEwsCi0JLmFwaWNfaWRfbWFzawkJCT0gMHhGRiA8PCAyNCwKLQotCS5jcHVfbWFza190b19hcGljaWRfYW5kCQk9IGVzNzAwMF9jcHVfbWFza190b19hcGljaWRfYW5kLAotCi0JLnNlbmRfSVBJX21hc2sJCQk9IGVzNzAwMF9zZW5kX0lQSV9tYXNrLAotCS5zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGYJPSBOVUxMLAotCS5zZW5kX0lQSV9hbGxidXRzZWxmCQk9IGVzNzAwMF9zZW5kX0lQSV9hbGxidXRzZWxmLAotCS5zZW5kX0lQSV9hbGwJCQk9IGVzNzAwMF9zZW5kX0lQSV9hbGwsCi0JLnNlbmRfSVBJX3NlbGYJCQk9IGRlZmF1bHRfc2VuZF9JUElfc2VsZiwKLQotCS53YWtldXBfc2Vjb25kYXJ5X2NwdQkJPSB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfbWlwLAotCi0JLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gMHg0NjcsCi0JLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IDB4NDY5LAotCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gTlVMTCwKLQotCS8qIE5vdGhpbmcgdG8gZG8gZm9yIG1vc3QgcGxhdGZvcm1zLCBzaW5jZSBjbGVhcmVkIGJ5IHRoZSBJTklUIGN5Y2xlOiAqLwotCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAotCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IGRlZmF1bHRfaW5xdWlyZV9yZW1vdGVfYXBpYywKLQotCS5yZWFkCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3JlYWQsCi0JLndyaXRlCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5lb2lfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuaWNyX3JlYWQJCQk9IG5hdGl2ZV9hcGljX2ljcl9yZWFkLAotCS5pY3Jfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX2ljcl93cml0ZSwKLQkud2FpdF9pY3JfaWRsZQkJCT0gbmF0aXZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQkuc2FmZV93YWl0X2ljcl9pZGxlCQk9IG5hdGl2ZV9zYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQotCS54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQJPSBlczcwMDBfZWFybHlfbG9naWNhbF9hcGljaWQsCi19OwotCi1zdGF0aWMgc3RydWN0IGFwaWMgX19yZWZkYXRhIGFwaWNfZXM3MDAwID0gewotCi0JLm5hbWUJCQkJPSAiZXM3MDAwIiwKLQkucHJvYmUJCQkJPSBwcm9iZV9lczcwMDAsCi0JLmFjcGlfbWFkdF9vZW1fY2hlY2sJCT0gZXM3MDAwX2FjcGlfbWFkdF9vZW1fY2hlY2ssCi0JLmFwaWNfaWRfdmFsaWQJCQk9IGRlZmF1bHRfYXBpY19pZF92YWxpZCwKLQkuYXBpY19pZF9yZWdpc3RlcmVkCQk9IGVzNzAwMF9hcGljX2lkX3JlZ2lzdGVyZWQsCi0KLQkuaXJxX2RlbGl2ZXJ5X21vZGUJCT0gZGVzdF9GaXhlZCwKLQkvKiBwaHlzIGRlbGl2ZXJ5IHRvIHRhcmdldCBDUFVzOiAqLwotCS5pcnFfZGVzdF9tb2RlCQkJPSAwLAotCi0JLnRhcmdldF9jcHVzCQkJPSBlczcwMDBfdGFyZ2V0X2NwdXMsCi0JLmRpc2FibGVfZXNyCQkJPSAxLAotCS5kZXN0X2xvZ2ljYWwJCQk9IDAsCi0JLmNoZWNrX2FwaWNpZF91c2VkCQk9IGVzNzAwMF9jaGVja19hcGljaWRfdXNlZCwKLQkuY2hlY2tfYXBpY2lkX3ByZXNlbnQJCT0gZXM3MDAwX2NoZWNrX2FwaWNpZF9wcmVzZW50LAotCi0JLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbgk9IGZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAotCS5pbml0X2FwaWNfbGRyCQkJPSBlczcwMDBfaW5pdF9hcGljX2xkciwKLQotCS5pb2FwaWNfcGh5c19pZF9tYXAJCT0gZXM3MDAwX2lvYXBpY19waHlzX2lkX21hcCwKLQkuc2V0dXBfYXBpY19yb3V0aW5nCQk9IGVzNzAwMF9zZXR1cF9hcGljX3JvdXRpbmcsCi0JLm11bHRpX3RpbWVyX2NoZWNrCQk9IE5VTEwsCi0JLmNwdV9wcmVzZW50X3RvX2FwaWNpZAkJPSBlczcwMDBfY3B1X3ByZXNlbnRfdG9fYXBpY2lkLAotCS5hcGljaWRfdG9fY3B1X3ByZXNlbnQJCT0gZXM3MDAwX2FwaWNpZF90b19jcHVfcHJlc2VudCwKLQkuc2V0dXBfcG9ydGlvX3JlbWFwCQk9IE5VTEwsCi0JLmNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQJPSBlczcwMDBfY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudCwKLQkuZW5hYmxlX2FwaWNfbW9kZQkJPSBlczcwMDBfZW5hYmxlX2FwaWNfbW9kZSwKLQkucGh5c19wa2dfaWQJCQk9IGVzNzAwMF9waHlzX3BrZ19pZCwKLQkubXBzX29lbV9jaGVjawkJCT0gZXM3MDAwX21wc19vZW1fY2hlY2ssCi0KLQkuZ2V0X2FwaWNfaWQJCQk9IGVzNzAwMF9nZXRfYXBpY19pZCwKLQkuc2V0X2FwaWNfaWQJCQk9IE5VTEwsCi0JLmFwaWNfaWRfbWFzawkJCT0gMHhGRiA8PCAyNCwKLQotCS5jcHVfbWFza190b19hcGljaWRfYW5kCQk9IGVzNzAwMF9jcHVfbWFza190b19hcGljaWRfYW5kLAotCi0JLnNlbmRfSVBJX21hc2sJCQk9IGVzNzAwMF9zZW5kX0lQSV9tYXNrLAotCS5zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGYJPSBOVUxMLAotCS5zZW5kX0lQSV9hbGxidXRzZWxmCQk9IGVzNzAwMF9zZW5kX0lQSV9hbGxidXRzZWxmLAotCS5zZW5kX0lQSV9hbGwJCQk9IGVzNzAwMF9zZW5kX0lQSV9hbGwsCi0JLnNlbmRfSVBJX3NlbGYJCQk9IGRlZmF1bHRfc2VuZF9JUElfc2VsZiwKLQotCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IDB4NDY3LAotCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSAweDQ2OSwKLQotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGVzNzAwMF93YWl0X2Zvcl9pbml0X2RlYXNzZXJ0LAotCi0JLyogTm90aGluZyB0byBkbyBmb3IgbW9zdCBwbGF0Zm9ybXMsIHNpbmNlIGNsZWFyZWQgYnkgdGhlIElOSVQgY3ljbGU6ICovCi0JLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IE5VTEwsCi0JLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gZGVmYXVsdF9pbnF1aXJlX3JlbW90ZV9hcGljLAotCi0JLnJlYWQJCQkJPSBuYXRpdmVfYXBpY19tZW1fcmVhZCwKLQkud3JpdGUJCQkJPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCi0JLmVvaV93cml0ZQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5pY3JfcmVhZAkJCT0gbmF0aXZlX2FwaWNfaWNyX3JlYWQsCi0JLmljcl93cml0ZQkJCT0gbmF0aXZlX2FwaWNfaWNyX3dyaXRlLAotCS53YWl0X2ljcl9pZGxlCQkJPSBuYXRpdmVfYXBpY193YWl0X2ljcl9pZGxlLAotCS5zYWZlX3dhaXRfaWNyX2lkbGUJCT0gbmF0aXZlX3NhZmVfYXBpY193YWl0X2ljcl9pZGxlLAotCi0JLng4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZAk9IGVzNzAwMF9lYXJseV9sb2dpY2FsX2FwaWNpZCwKLX07Ci0KLS8qCi0gKiBOZWVkIHRvIGNoZWNrIGZvciBlczcwMDAgZm9sbG93ZWQgYnkgZXM3MDAwX2NsdXN0ZXIsIHNvIHRoaXMgb3JkZXIKLSAqIGluIGFwaWNfZHJpdmVycyBpcyBpbXBvcnRhbnQuCi0gKi8KLWFwaWNfZHJpdmVycyhhcGljX2VzNzAwMCwgYXBpY19lczcwMDBfY2x1c3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9udW1hcV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbnVtYXFfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0MmU4Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9udW1hcV8zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qCi0gKiBXcml0dGVuIGJ5OiBQYXRyaWNpYSBHYXVnaGVuLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgotICogQ29weXJpZ2h0IChDKSAyMDA5LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogU2VuZCBmZWVkYmFjayB0byA8Z29uZUB1cy5pYm0uY29tPgotICovCi0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW16b25lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KLSNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9lODIwLmg+Ci0jaW5jbHVkZSA8YXNtL2lwaS5oPgotCi1pbnQgZm91bmRfbnVtYXE7Ci0KLS8qCi0gKiBIYXZlIHRvIG1hdGNoIHRyYW5zbGF0aW9uIHRhYmxlIGVudHJpZXMgdG8gbWFpbiB0YWJsZSBlbnRyaWVzIGJ5IGNvdW50ZXIKLSAqIGhlbmNlIHRoZSBtcGNfcmVjb3JkIHZhcmlhYmxlIC4uLi4gY2FuJ3Qgc2VlIGEgbGVzcyBkaXNndXN0aW5nIHdheSBvZgotICogZG9pbmcgdGhpcyAuLi4uCi0gKi8KLXN0cnVjdCBtcGNfdHJhbnMgewotCXVuc2lnbmVkIGNoYXIJCQltcGNfdHlwZTsKLQl1bnNpZ25lZCBjaGFyCQkJdHJhbnNfbGVuOwotCXVuc2lnbmVkIGNoYXIJCQl0cmFuc190eXBlOwotCXVuc2lnbmVkIGNoYXIJCQl0cmFuc19xdWFkOwotCXVuc2lnbmVkIGNoYXIJCQl0cmFuc19nbG9iYWw7Ci0JdW5zaWduZWQgY2hhcgkJCXRyYW5zX2xvY2FsOwotCXVuc2lnbmVkIHNob3J0CQkJdHJhbnNfcmVzZXJ2ZWQ7Ci19OwotCi1zdGF0aWMgaW50CQkJCW1wY19yZWNvcmQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXBjX3RyYW5zCQkJKnRyYW5zbGF0aW9uX3RhYmxlW01BWF9NUENfRU5UUlldOwotCi1pbnQJCQkJCW1wX2J1c19pZF90b19ub2RlW01BWF9NUF9CVVNTRVNdOwotaW50CQkJCQltcF9idXNfaWRfdG9fbG9jYWxbTUFYX01QX0JVU1NFU107Ci1pbnQJCQkJCXF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkW05SX0NQVVMvNF1bNF07Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3JlZ2lzdGVyX25vZGUoaW50IG5vZGUsIHN0cnVjdCBzeXNfY2ZnX2RhdGEgKnNjZCkKLXsKLQlzdHJ1Y3QgZWFjaHF1YWRtZW0gKmVxID0gc2NkLT5lcSArIG5vZGU7Ci0JdTY0IHN0YXJ0ID0gKHU2NCkoZXEtPmhpX3NocmRfbWVtX3N0YXJ0IC0gZXEtPnByaXZfbWVtX3NpemUpIDw8IDIwOwotCXU2NCBlbmQgPSAodTY0KShlcS0+aGlfc2hyZF9tZW1fc3RhcnQgKyBlcS0+aGlfc2hyZF9tZW1fc2l6ZSkgPDwgMjA7Ci0JaW50IHJldDsKLQotCW5vZGVfc2V0KG5vZGUsIG51bWFfbm9kZXNfcGFyc2VkKTsKLQlyZXQgPSBudW1hX2FkZF9tZW1ibGsobm9kZSwgc3RhcnQsIGVuZCk7Ci0JQlVHX09OKHJldCA8IDApOwotfQotCi0vKgotICogRnVuY3Rpb246IHNtcF9kdW1wX3FjdCgpCi0gKgotICogRGVzY3JpcHRpb246IGdldHMgbWVtb3J5IGxheW91dCBmcm9tIHRoZSBxdWFkIGNvbmZpZyB0YWJsZS4gIFRoaXMKLSAqIGZ1bmN0aW9uIGFsc28gdXBkYXRlcyBudW1hX25vZGVzX3BhcnNlZCB3aXRoIHRoZSBub2RlcyAocXVhZHMpIHByZXNlbnQuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfZHVtcF9xY3Qodm9pZCkKLXsKLQlzdHJ1Y3Qgc3lzX2NmZ19kYXRhICpzY2Q7Ci0JaW50IG5vZGU7Ci0KLQlzY2QgPSAodm9pZCAqKV9fdmEoU1lTX0NGR19EQVRBX1BSSVZfQUREUik7Ci0KLQlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKLQkJaWYgKHNjZC0+cXVhZHNfcHJlc2VudDMxXzAgJiAoMSA8PCBub2RlKSkKLQkJCW51bWFxX3JlZ2lzdGVyX25vZGUobm9kZSwgc2NkKTsKLQl9Ci19Ci0KLXZvaWQgbnVtYXFfdHNjX2Rpc2FibGUodm9pZCkKLXsKLQlpZiAoIWZvdW5kX251bWFxKQotCQlyZXR1cm47Ci0KLQlpZiAobnVtX29ubGluZV9ub2RlcygpID4gMSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQVE6IGRpc2FibGluZyBUU0NcbiIpOwotCQlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX1RTQyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbnVtYXFfdHNjX2luaXQodm9pZCkKLXsKLQludW1hcV90c2NfZGlzYWJsZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZW5lcmF0ZV9sb2dpY2FsX2FwaWNpZChpbnQgcXVhZCwgaW50IHBoeXNfYXBpY2lkKQotewotCXJldHVybiAocXVhZCA8PCA0KSArIChwaHlzX2FwaWNpZCA/IHBoeXNfYXBpY2lkIDw8IDEgOiAxKTsKLX0KLQotLyogeDg2X3F1aXJrcyBtZW1iZXIgKi8KLXN0YXRpYyBpbnQgbXBjX2FwaWNfaWQoc3RydWN0IG1wY19jcHUgKm0pCi17Ci0JaW50IHF1YWQgPSB0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXS0+dHJhbnNfcXVhZDsKLQlpbnQgbG9naWNhbF9hcGljaWQgPSBnZW5lcmF0ZV9sb2dpY2FsX2FwaWNpZChxdWFkLCBtLT5hcGljaWQpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcKLQkJIlByb2Nlc3NvciAjJWQgJXU6JXUgQVBJQyB2ZXJzaW9uICVkIChxdWFkICVkLCBhcGljICVkKVxuIiwKLQkJIG0tPmFwaWNpZCwgKG0tPmNwdWZlYXR1cmUgJiBDUFVfRkFNSUxZX01BU0spID4+IDgsCi0JCShtLT5jcHVmZWF0dXJlICYgQ1BVX01PREVMX01BU0spID4+IDQsCi0JCSBtLT5hcGljdmVyLCBxdWFkLCBsb2dpY2FsX2FwaWNpZCk7Ci0KLQlyZXR1cm4gbG9naWNhbF9hcGljaWQ7Ci19Ci0KLS8qIHg4Nl9xdWlya3MgbWVtYmVyICovCi1zdGF0aWMgdm9pZCBtcGNfb2VtX2J1c19pbmZvKHN0cnVjdCBtcGNfYnVzICptLCBjaGFyICpuYW1lKQotewotCWludCBxdWFkID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX3F1YWQ7Ci0JaW50IGxvY2FsID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX2xvY2FsOwotCi0JbXBfYnVzX2lkX3RvX25vZGVbbS0+YnVzaWRdID0gcXVhZDsKLQltcF9idXNfaWRfdG9fbG9jYWxbbS0+YnVzaWRdID0gbG9jYWw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCdXMgIyVkIGlzICVzIChub2RlICVkKVxuIiwgbS0+YnVzaWQsIG5hbWUsIHF1YWQpOwotfQotCi0vKiB4ODZfcXVpcmtzIG1lbWJlciAqLwotc3RhdGljIHZvaWQgbXBjX29lbV9wY2lfYnVzKHN0cnVjdCBtcGNfYnVzICptKQotewotCWludCBxdWFkID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX3F1YWQ7Ci0JaW50IGxvY2FsID0gdHJhbnNsYXRpb25fdGFibGVbbXBjX3JlY29yZF0tPnRyYW5zX2xvY2FsOwotCi0JcXVhZF9sb2NhbF90b19tcF9idXNfaWRbcXVhZF1bbG9jYWxdID0gbS0+YnVzaWQ7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSBtcHBhcnNlIGNvZGUuCi0gKiBtb2RlID0gMDogcHJlc2NhbgotICogbW9kZSA9IDE6IG9uZSBtcGMgZW50cnkgc2Nhbm5lZAotICovCi1zdGF0aWMgdm9pZCBudW1hcV9tcGNfcmVjb3JkKHVuc2lnbmVkIGludCBtb2RlKQotewotCWlmICghbW9kZSkKLQkJbXBjX3JlY29yZCA9IDA7Ci0JZWxzZQotCQltcGNfcmVjb3JkKys7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBNUF90cmFuc2xhdGlvbl9pbmZvKHN0cnVjdCBtcGNfdHJhbnMgKm0pCi17Ci0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAiVHJhbnNsYXRpb246IHJlY29yZCAlZCwgdHlwZSAlZCwgcXVhZCAlZCwgZ2xvYmFsICVkLCBsb2NhbCAlZFxuIiwKLQkgICAgICAgbXBjX3JlY29yZCwgbS0+dHJhbnNfdHlwZSwgbS0+dHJhbnNfcXVhZCwgbS0+dHJhbnNfZ2xvYmFsLAotCSAgICAgICBtLT50cmFuc19sb2NhbCk7Ci0KLQlpZiAobXBjX3JlY29yZCA+PSBNQVhfTVBDX0VOVFJZKQotCQlwcmludGsoS0VSTl9FUlIgIk1BWF9NUENfRU5UUlkgZXhjZWVkZWQhXG4iKTsKLQllbHNlCi0JCXRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdID0gbTsgLyogc3Rhc2ggdGhpcyBmb3IgbGF0ZXIgKi8KLQotCWlmIChtLT50cmFuc19xdWFkIDwgTUFYX05VTU5PREVTICYmICFub2RlX29ubGluZShtLT50cmFuc19xdWFkKSkKLQkJbm9kZV9zZXRfb25saW5lKG0tPnRyYW5zX3F1YWQpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBtcGZfY2hlY2tzdW0odW5zaWduZWQgY2hhciAqbXAsIGludCBsZW4pCi17Ci0JaW50IHN1bSA9IDA7Ci0KLQl3aGlsZSAobGVuLS0pCi0JCXN1bSArPSAqbXArKzsKLQotCXJldHVybiBzdW0gJiAweEZGOwotfQotCi0vKgotICogUmVhZC9wYXJzZSB0aGUgTVBDIG9lbSB0YWJsZXMKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHNtcF9yZWFkX21wY19vZW0oc3RydWN0IG1wY190YWJsZSAqbXBjKQotewotCXN0cnVjdCBtcGNfb2VtdGFibGUgKm9lbXRhYmxlID0gKHZvaWQgKikobG9uZyltcGMtPm9lbXB0cjsKLQlpbnQgY291bnQgPSBzaXplb2YoKm9lbXRhYmxlKTsJLyogdGhlIGhlYWRlciBzaXplICovCi0JdW5zaWduZWQgY2hhciAqb2VtcHRyID0gKCh1bnNpZ25lZCBjaGFyICopb2VtdGFibGUpICsgY291bnQ7Ci0KLQltcGNfcmVjb3JkID0gMDsKLQlwcmludGsoS0VSTl9JTkZPCi0JCSJGb3VuZCBhbiBPRU0gTVBDIHRhYmxlIGF0ICU4cCAtIHBhcnNpbmcgaXQuLi5cbiIsIG9lbXRhYmxlKTsKLQotCWlmIChtZW1jbXAob2VtdGFibGUtPnNpZ25hdHVyZSwgTVBDX09FTV9TSUdOQVRVUkUsIDQpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJTTVAgbXBjIG9lbXRhYmxlOiBiYWQgc2lnbmF0dXJlIFslYyVjJWMlY10hXG4iLAotCQkgICAgICAgb2VtdGFibGUtPnNpZ25hdHVyZVswXSwgb2VtdGFibGUtPnNpZ25hdHVyZVsxXSwKLQkJICAgICAgIG9lbXRhYmxlLT5zaWduYXR1cmVbMl0sIG9lbXRhYmxlLT5zaWduYXR1cmVbM10pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW9lbXRhYmxlLCBvZW10YWJsZS0+bGVuZ3RoKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTTVAgb2VtIG1wdGFibGU6IGNoZWNrc3VtIGVycm9yIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl3aGlsZSAoY291bnQgPCBvZW10YWJsZS0+bGVuZ3RoKSB7Ci0JCXN3aXRjaCAoKm9lbXB0cikgewotCQljYXNlIE1QX1RSQU5TTEFUSU9OOgotCQkJewotCQkJCXN0cnVjdCBtcGNfdHJhbnMgKm0gPSAodm9pZCAqKW9lbXB0cjsKLQotCQkJCU1QX3RyYW5zbGF0aW9uX2luZm8obSk7Ci0JCQkJb2VtcHRyICs9IHNpemVvZigqbSk7Ci0JCQkJY291bnQgKz0gc2l6ZW9mKCptKTsKLQkJCQkrK21wY19yZWNvcmQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIlVucmVjb2duaXNlZCBPRU0gdGFibGUgZW50cnkgdHlwZSEgLSAlZFxuIiwKLQkJCSAgICAgICAoaW50KSpvZW1wdHIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgX19pbml0IHZvaWQgZWFybHlfY2hlY2tfbnVtYXEodm9pZCkKLXsKLQkvKgotCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246Ci0JICovCi0JaWYgKHNtcF9mb3VuZF9jb25maWcpCi0JCWVhcmx5X2dldF9zbXBfY29uZmlnKCk7Ci0KLQlpZiAoZm91bmRfbnVtYXEpIHsKLQkJeDg2X2luaXQubXBwYXJzZS5tcGNfcmVjb3JkID0gbnVtYXFfbXBjX3JlY29yZDsKLQkJeDg2X2luaXQubXBwYXJzZS5zZXR1cF9pb2FwaWNfaWRzID0geDg2X2luaXRfbm9vcDsKLQkJeDg2X2luaXQubXBwYXJzZS5tcGNfYXBpY19pZCA9IG1wY19hcGljX2lkOwotCQl4ODZfaW5pdC5tcHBhcnNlLnNtcF9yZWFkX21wY19vZW0gPSBzbXBfcmVhZF9tcGNfb2VtOwotCQl4ODZfaW5pdC5tcHBhcnNlLm1wY19vZW1fcGNpX2J1cyA9IG1wY19vZW1fcGNpX2J1czsKLQkJeDg2X2luaXQubXBwYXJzZS5tcGNfb2VtX2J1c19pbmZvID0gbXBjX29lbV9idXNfaW5mbzsKLQkJeDg2X2luaXQudGltZXJzLnRzY19wcmVfaW5pdCA9IG51bWFxX3RzY19pbml0OwotCQl4ODZfaW5pdC5wY2kuaW5pdCA9IHBjaV9udW1hcV9pbml0OwotCX0KLX0KLQotaW50IF9faW5pdCBudW1hcV9udW1hX2luaXQodm9pZCkKLXsKLQllYXJseV9jaGVja19udW1hcSgpOwotCWlmICghZm91bmRfbnVtYXEpCi0JCXJldHVybiAtRU5PRU5UOwotCXNtcF9kdW1wX3FjdCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgTlVNQVFfQVBJQ19ERlJfVkFMVUUJKEFQSUNfREZSX0NMVVNURVIpCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG51bWFxX2dldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKLXsKLQlyZXR1cm4gKHggPj4gMjQpICYgMHgwRjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NlbmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX3NlcXVlbmNlX2xvZ2ljYWwobWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKLXsKLQlkZWZhdWx0X3NlbmRfSVBJX21hc2tfYWxsYnV0c2VsZl9sb2dpY2FsKGNwdV9vbmxpbmVfbWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQotewotCW51bWFxX3NlbmRfSVBJX21hc2soY3B1X29ubGluZV9tYXNrLCB2ZWN0b3IpOwotfQotCi0jZGVmaW5lIE5VTUFRX1RSQU1QT0xJTkVfUEhZU19MT1cJKDB4OCkKLSNkZWZpbmUgTlVNQVFfVFJBTVBPTElORV9QSFlTX0hJR0gJKDB4YSkKLQotLyoKLSAqIEJlY2F1c2Ugd2UgdXNlIE5NSXMgcmF0aGVyIHRoYW4gdGhlIElOSVQtU1RBUlRVUCBzZXF1ZW5jZSB0bwotICogYm9vdHN0cmFwIHRoZSBDUFVzLCB0aGUgQVBJQyBtYXkgYmUgaW4gYSB3ZWlyZCBzdGF0ZS4gS2ljayBpdDoKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX3NtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYyh2b2lkKQotewotCWNsZWFyX2xvY2FsX0FQSUMoKTsKLX0KLQotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbnVtYXFfdGFyZ2V0X2NwdXModm9pZCkKLXsKLQlyZXR1cm4gY3B1X2FsbF9tYXNrOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBudW1hcV9jaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190ICptYXAsIGludCBhcGljaWQpCi17Ci0JcmV0dXJuIHBoeXNpZF9pc3NldChhcGljaWQsICptYXApOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbnVtYXFfY2hlY2tfYXBpY2lkX3ByZXNlbnQoaW50IGJpdCkKLXsKLQlyZXR1cm4gcGh5c2lkX2lzc2V0KGJpdCwgcGh5c19jcHVfcHJlc2VudF9tYXApOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBudW1hcV9hcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX2luaXRfYXBpY19sZHIodm9pZCkKLXsKLQkvKiBBbHJlYWR5IGRvbmUgaW4gTlVNQS1RIGZpcm13YXJlICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudW1hcV9zZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPCi0JCSJFbmFibGluZyBBUElDIG1vZGU6ICBOVU1BLVEuICBVc2luZyAlZCBJL08gQVBJQ3NcbiIsCi0JCW5yX2lvYXBpY3MpOwotfQotCi0vKgotICogU2tpcCBhZGRpbmcgdGhlIHRpbWVyIGludCBvbiBzZWNvbmRhcnkgbm9kZXMsIHdoaWNoIGNhdXNlcwotICogYSBzbWFsbCBidXQgcGFpbmZ1bCByaWZ0IGluIHRoZSB0aW1lLXNwYWNlIGNvbnRpbnV1bS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgbnVtYXFfbXVsdGlfdGltZXJfY2hlY2soaW50IGFwaWMsIGludCBpcnEpCi17Ci0JcmV0dXJuIGFwaWMgIT0gMCAmJiBpcnEgPT0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG51bWFxX2lvYXBpY19waHlzX2lkX21hcChwaHlzaWRfbWFza190ICpwaHlzX21hcCwgcGh5c2lkX21hc2tfdCAqcmV0bWFwKQotewotCS8qIFdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byBkbyB0aGlzIHlldCAtIGhhY2sgKi8KLQlyZXR1cm4gcGh5c2lkc19wcm9tb3RlKDB4RlVMLCByZXRtYXApOwotfQotCi0vKgotICogU3VwcG9ydGluZyBvdmVyIDYwIGNwdXMgb24gTlVNQS1RIHJlcXVpcmVzIGEgbG9jYWxpdHktZGVwZW5kZW50Ci0gKiBjcHUgdG8gQVBJQyBJRCByZWxhdGlvbiB0byBwcm9wZXJseSBpbnRlcmFjdCB3aXRoIHRoZSBpbnRlbGxpZ2VudAotICogbW9kZSBvZiB0aGUgY2x1c3RlciBjb250cm9sbGVyLgotICovCi1zdGF0aWMgaW5saW5lIGludCBudW1hcV9jcHVfcHJlc2VudF90b19hcGljaWQoaW50IG1wc19jcHUpCi17Ci0JaWYgKG1wc19jcHUgPCA2MCkKLQkJcmV0dXJuICgobXBzX2NwdSA+PiAyKSA8PCA0KSB8ICgxIDw8IChtcHNfY3B1ICYgMHgzKSk7Ci0JZWxzZQotCQlyZXR1cm4gQkFEX0FQSUNJRDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbnVtYXFfYXBpY2lkX3RvX25vZGUoaW50IGxvZ2ljYWxfYXBpY2lkKQotewotCXJldHVybiBsb2dpY2FsX2FwaWNpZCA+PiA0OwotfQotCi1zdGF0aWMgaW50IG51bWFxX251bWFfY3B1X25vZGUoaW50IGNwdSkKLXsKLQlpbnQgbG9naWNhbF9hcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIGNwdSk7Ci0KLQlpZiAobG9naWNhbF9hcGljaWQgIT0gQkFEX0FQSUNJRCkKLQkJcmV0dXJuIG51bWFxX2FwaWNpZF90b19ub2RlKGxvZ2ljYWxfYXBpY2lkKTsKLQlyZXR1cm4gTlVNQV9OT19OT0RFOwotfQotCi1zdGF0aWMgdm9pZCBudW1hcV9hcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IGxvZ2ljYWxfYXBpY2lkLCBwaHlzaWRfbWFza190ICpyZXRtYXApCi17Ci0JaW50IG5vZGUgPSBudW1hcV9hcGljaWRfdG9fbm9kZShsb2dpY2FsX2FwaWNpZCk7Ci0JaW50IGNwdSA9IF9fZmZzKGxvZ2ljYWxfYXBpY2lkICYgMHhmKTsKLQotCXBoeXNpZF9zZXRfbWFza19vZl9waHlzaWQoY3B1ICsgNCpub2RlLCByZXRtYXApOwotfQotCi0vKiBXaGVyZSB0aGUgSU8gYXJlYSB3YXMgbWFwcGVkIG9uIG11bHRpcXVhZCwgYWx3YXlzIDAgb3RoZXJ3aXNlICovCi12b2lkICp4cXVhZF9wb3J0aW87Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG51bWFxX2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IHBoeXNfYXBpY2lkKQotewotCXJldHVybiAxOwotfQotCi0vKgotICogV2UgdXNlIHBoeXNpY2FsIGFwaWNpZHMgaGVyZSwgbm90IGxvZ2ljYWwsIHNvIGp1c3QgcmV0dXJuIHRoZSBkZWZhdWx0Ci0gKiBwaHlzaWNhbCBicm9hZGNhc3QgdG8gc3RvcCBwZW9wbGUgZnJvbSBicmVha2luZyB1cwotICovCi1zdGF0aWMgaW50Ci1udW1hcV9jcHVfbWFza190b19hcGljaWRfYW5kKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYW5kbWFzaywKLQkJCSAgICAgdW5zaWduZWQgaW50ICphcGljaWQpCi17Ci0JKmFwaWNpZCA9IDB4MEY7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIE5vIE5VTUEtUSBib3ggaGFzIGEgSFQgQ1BVLCBidXQgaXQgY2FuJ3QgaHVydCB0byB1c2UgdGhlIGRlZmF1bHQgY29kZS4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG51bWFxX3BoeXNfcGtnX2lkKGludCBjcHVpZF9hcGljLCBpbnQgaW5kZXhfbXNiKQotewotCXJldHVybiBjcHVpZF9hcGljID4+IGluZGV4X21zYjsKLX0KLQotc3RhdGljIGludAotbnVtYXFfbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIGNoYXIgKm9lbSwgY2hhciAqcHJvZHVjdGlkKQotewotCWlmIChzdHJuY21wKG9lbSwgIklCTSBOVU1BIiwgOCkpCi0JCXByaW50ayhLRVJOX0VSUiAiV2FybmluZyEgTm90IGEgTlVNQS1RIHN5c3RlbSFcbiIpOwotCWVsc2UKLQkJZm91bmRfbnVtYXEgPSAxOwotCi0JcmV0dXJuIGZvdW5kX251bWFxOwotfQotCi1zdGF0aWMgaW50IHByb2JlX251bWFxKHZvaWQpCi17Ci0JLyogYWxyZWFkeSBrbm93IGZyb20gZ2V0X21lbWNmZ19udW1hcSgpICovCi0JcmV0dXJuIGZvdW5kX251bWFxOwotfQotCi1zdGF0aWMgdm9pZCBudW1hcV9zZXR1cF9wb3J0aW9fcmVtYXAodm9pZCkKLXsKLQlpbnQgbnVtX3F1YWRzID0gbnVtX29ubGluZV9ub2RlcygpOwotCi0JaWYgKG51bV9xdWFkcyA8PSAxKQotCQlyZXR1cm47Ci0KLQlwcmludGsoS0VSTl9JTkZPCi0JCSJSZW1hcHBpbmcgY3Jvc3MtcXVhZCBwb3J0IEkvTyBmb3IgJWQgcXVhZHNcbiIsIG51bV9xdWFkcyk7Ci0KLQl4cXVhZF9wb3J0aW8gPSBpb3JlbWFwKFhRVUFEX1BPUlRJT19CQVNFLCBudW1fcXVhZHMqWFFVQURfUE9SVElPX1FVQUQpOwotCi0JcHJpbnRrKEtFUk5fSU5GTwotCQkieHF1YWRfcG9ydGlvIHZhZGRyIDB4JTA4bHgsIGxlbiAlMDhseFxuIiwKLQkJKHVfbG9uZykgeHF1YWRfcG9ydGlvLCAodV9sb25nKSBudW1fcXVhZHMqWFFVQURfUE9SVElPX1FVQUQpOwotfQotCi0vKiBVc2UgX19yZWZkYXRhIHRvIGtlZXAgZmFsc2UgcG9zaXRpdmUgd2FybmluZyBjYWxtLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXBpYyBfX3JlZmRhdGEgYXBpY19udW1hcSA9IHsKLQotCS5uYW1lCQkJCT0gIk5VTUFRIiwKLQkucHJvYmUJCQkJPSBwcm9iZV9udW1hcSwKLQkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBOVUxMLAotCS5hcGljX2lkX3ZhbGlkCQkJPSBkZWZhdWx0X2FwaWNfaWRfdmFsaWQsCi0JLmFwaWNfaWRfcmVnaXN0ZXJlZAkJPSBudW1hcV9hcGljX2lkX3JlZ2lzdGVyZWQsCi0KLQkuaXJxX2RlbGl2ZXJ5X21vZGUJCT0gZGVzdF9Mb3dlc3RQcmlvLAotCS8qIHBoeXNpY2FsIGRlbGl2ZXJ5IG9uIExPQ0FMIHF1YWQ6ICovCi0JLmlycV9kZXN0X21vZGUJCQk9IDAsCi0KLQkudGFyZ2V0X2NwdXMJCQk9IG51bWFxX3RhcmdldF9jcHVzLAotCS5kaXNhYmxlX2VzcgkJCT0gMSwKLQkuZGVzdF9sb2dpY2FsCQkJPSBBUElDX0RFU1RfTE9HSUNBTCwKLQkuY2hlY2tfYXBpY2lkX3VzZWQJCT0gbnVtYXFfY2hlY2tfYXBpY2lkX3VzZWQsCi0JLmNoZWNrX2FwaWNpZF9wcmVzZW50CQk9IG51bWFxX2NoZWNrX2FwaWNpZF9wcmVzZW50LAotCi0JLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbgk9IGZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAotCS5pbml0X2FwaWNfbGRyCQkJPSBudW1hcV9pbml0X2FwaWNfbGRyLAotCi0JLmlvYXBpY19waHlzX2lkX21hcAkJPSBudW1hcV9pb2FwaWNfcGh5c19pZF9tYXAsCi0JLnNldHVwX2FwaWNfcm91dGluZwkJPSBudW1hcV9zZXR1cF9hcGljX3JvdXRpbmcsCi0JLm11bHRpX3RpbWVyX2NoZWNrCQk9IG51bWFxX211bHRpX3RpbWVyX2NoZWNrLAotCS5jcHVfcHJlc2VudF90b19hcGljaWQJCT0gbnVtYXFfY3B1X3ByZXNlbnRfdG9fYXBpY2lkLAotCS5hcGljaWRfdG9fY3B1X3ByZXNlbnQJCT0gbnVtYXFfYXBpY2lkX3RvX2NwdV9wcmVzZW50LAotCS5zZXR1cF9wb3J0aW9fcmVtYXAJCT0gbnVtYXFfc2V0dXBfcG9ydGlvX3JlbWFwLAotCS5jaGVja19waHlzX2FwaWNpZF9wcmVzZW50CT0gbnVtYXFfY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudCwKLQkuZW5hYmxlX2FwaWNfbW9kZQkJPSBOVUxMLAotCS5waHlzX3BrZ19pZAkJCT0gbnVtYXFfcGh5c19wa2dfaWQsCi0JLm1wc19vZW1fY2hlY2sJCQk9IG51bWFxX21wc19vZW1fY2hlY2ssCi0KLQkuZ2V0X2FwaWNfaWQJCQk9IG51bWFxX2dldF9hcGljX2lkLAotCS5zZXRfYXBpY19pZAkJCT0gTlVMTCwKLQkuYXBpY19pZF9tYXNrCQkJPSAweDBGIDw8IDI0LAotCi0JLmNwdV9tYXNrX3RvX2FwaWNpZF9hbmQJCT0gbnVtYXFfY3B1X21hc2tfdG9fYXBpY2lkX2FuZCwKLQotCS5zZW5kX0lQSV9tYXNrCQkJPSBudW1hcV9zZW5kX0lQSV9tYXNrLAotCS5zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGYJPSBOVUxMLAotCS5zZW5kX0lQSV9hbGxidXRzZWxmCQk9IG51bWFxX3NlbmRfSVBJX2FsbGJ1dHNlbGYsCi0JLnNlbmRfSVBJX2FsbAkJCT0gbnVtYXFfc2VuZF9JUElfYWxsLAotCS5zZW5kX0lQSV9zZWxmCQkJPSBkZWZhdWx0X3NlbmRfSVBJX3NlbGYsCi0KLQkud2FrZXVwX3NlY29uZGFyeV9jcHUJCT0gd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX25taSwKLQkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBOVU1BUV9UUkFNUE9MSU5FX1BIWVNfTE9XLAotCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBOVU1BUV9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQotCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmUgYmVjYXVzZSB3ZSB1c2UgTk1JJ3MgdG8gYm9vdCBpbnN0ZWFkICovCi0JLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gTlVMTCwKLQotCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBudW1hcV9zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMsCi0JLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gTlVMTCwKLQotCS5yZWFkCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3JlYWQsCi0JLndyaXRlCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5lb2lfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuaWNyX3JlYWQJCQk9IG5hdGl2ZV9hcGljX2ljcl9yZWFkLAotCS5pY3Jfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX2ljcl93cml0ZSwKLQkud2FpdF9pY3JfaWRsZQkJCT0gbmF0aXZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQkuc2FmZV93YWl0X2ljcl9pZGxlCQk9IG5hdGl2ZV9zYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQotCS54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQJPSBub29wX3g4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZCwKLQkueDg2XzMyX251bWFfY3B1X25vZGUJCT0gbnVtYXFfbnVtYV9jcHVfbm9kZSwKLX07Ci0KLWFwaWNfZHJpdmVyKGFwaWNfbnVtYXEpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKaW5kZXggZWIzNWVmOS4uY2NlYjM1MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCkBAIC0xMTksOCArMTE5LDcgQEAKIAkudHJhbXBvbGluZV9waHlzX2xvdwkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19MT1csCiAJLnRyYW1wb2xpbmVfcGh5c19oaWdoCQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0hJR0gsCiAKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBkZWZhdWx0X3dhaXRfZm9yX2luaXRfZGVhc3NlcnQsCi0KKwkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSB0cnVlLAogCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAogCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IGRlZmF1bHRfaW5xdWlyZV9yZW1vdGVfYXBpYywKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxNDZmOS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKgotICogSUJNIFN1bW1pdC1TcGVjaWZpYyBDb2RlCi0gKgotICogV3JpdHRlbiBCeTogTWF0dGhldyBEb2Jzb24sIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGNvbHBhdGNoQHVzLmlibS5jb20+Ci0gKgotICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgInN1bW1pdDogJXM6ICIgZm10LCBfX2Z1bmNfXwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYmlvc19lYmRhLmg+Ci0KLS8qCi0gKiBBUElDIGRyaXZlciBmb3IgdGhlIElCTSAiU3VtbWl0IiBjaGlwc2V0LgotICovCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KLSNpbmNsdWRlIDxhc20vbXBzcGVjLmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+Ci0jaW5jbHVkZSA8YXNtL2lwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotCi1zdGF0aWMgdW5zaWduZWQgc3VtbWl0X2dldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKLXsKLQlyZXR1cm4gKHggPj4gMjQpICYgMHhGRjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN1bW1pdF9zZW5kX0lQSV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBpbnQgdmVjdG9yKQotewotCWRlZmF1bHRfc2VuZF9JUElfbWFza19zZXF1ZW5jZV9sb2dpY2FsKG1hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1bW1pdF9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCi17Ci0JZGVmYXVsdF9zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGZfbG9naWNhbChjcHVfb25saW5lX21hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1bW1pdF9zZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKLXsKLQlzdW1taXRfc2VuZF9JUElfbWFzayhjcHVfb25saW5lX21hc2ssIHZlY3Rvcik7Ci19Ci0KLSNpbmNsdWRlIDxhc20vdHNjLmg+Ci0KLWV4dGVybiBpbnQgdXNlX2N5Y2xvbmU7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X1NVTU1JVF9OVU1BCi1zdGF0aWMgdm9pZCBzZXR1cF9zdW1taXQodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3N1bW1pdCh2b2lkKSB7fQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc3VtbWl0X21wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sCi0JCWNoYXIgKnByb2R1Y3RpZCkKLXsKLQlpZiAoIXN0cm5jbXAob2VtLCAiSUJNIEVOU1ciLCA4KSAmJgotCQkJKCFzdHJuY21wKHByb2R1Y3RpZCwgIlZJR0lMIFNNUCIsIDkpCi0JCQkgfHwgIXN0cm5jbXAocHJvZHVjdGlkLCAiRVhBIiwgMykKLQkJCSB8fCAhc3RybmNtcChwcm9kdWN0aWQsICJSVVRITEVTUyBTTVAiLCAxMikpKXsKLQkJbWFya190c2NfdW5zdGFibGUoIlN1bW1pdCBiYXNlZCBzeXN0ZW0iKTsKLQkJdXNlX2N5Y2xvbmUgPSAxOyAvKmVuYWJsZSBjeWNsb25lLXRpbWVyKi8KLQkJc2V0dXBfc3VtbWl0KCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogSG9vayBmcm9tIGdlbmVyaWMgQUNQSSB0YWJsZXMuYyAqLwotc3RhdGljIGludCBzdW1taXRfYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKLXsKLQlpZiAoIXN0cm5jbXAob2VtX2lkLCAiSUJNIiwgMykgJiYKLQkgICAgKCFzdHJuY21wKG9lbV90YWJsZV9pZCwgIlNFUlZJR0lMIiwgOCkKLQkgICAgIHx8ICFzdHJuY21wKG9lbV90YWJsZV9pZCwgIkVYQSIsIDMpKSl7Ci0JCW1hcmtfdHNjX3Vuc3RhYmxlKCJTdW1taXQgYmFzZWQgc3lzdGVtIik7Ci0JCXVzZV9jeWNsb25lID0gMTsgLyplbmFibGUgY3ljbG9uZS10aW1lciovCi0JCXNldHVwX3N1bW1pdCgpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCByaW9fdGFibGVfaGRyIHsKLQl1bnNpZ25lZCBjaGFyIHZlcnNpb247ICAgICAgLyogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSAgICAgICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAzIGFkZHMgY2hhc3Npc19udW0gJiBXUF9pbmRleCAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIG51bV9zY2FsX2RldjsgLyogIyBvZiBTY2FsYWJpbGl0eSBkZXZpY2VzIChUd2lzdGVycyBmb3IgVmlnaWwpICAgKi8KLQl1bnNpZ25lZCBjaGFyIG51bV9yaW9fZGV2OyAgLyogIyBvZiBSSU8gSS9PIGRldmljZXMgKEN5Y2xvbmVzIGFuZCBXaW5uaXBlZ3MpICAgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBzY2FsX2RldGFpbCB7Ci0JdW5zaWduZWQgY2hhciBub2RlX2lkOyAgICAgIC8qIFNjYWxhYmlsaXR5IE5vZGUgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgbG9uZyBDQkFSOyAgICAgICAgIC8qIEFkZHJlc3Mgb2YgMU1CIHJlZ2lzdGVyIHNwYWNlICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MG5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkY9Tm9uZSAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MHBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBwb3J0MW5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkYgPSBOb25lICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MXBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBwb3J0Mm5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkYgPSBOb25lICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MnBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBjaGFzc2lzX251bTsgIC8qIDEgYmFzZWQgQ2hhc3NpcyBudW1iZXIgKDEgPSBib290IG5vZGUpICAgICAgICAgICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgcmlvX2RldGFpbCB7Ci0JdW5zaWduZWQgY2hhciBub2RlX2lkOyAgICAgIC8qIFJJTyBOb2RlIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgbG9uZyBCQkFSOyAgICAgICAgIC8qIEFkZHJlc3Mgb2YgMU1CIHJlZ2lzdGVyIHNwYWNlICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciB0eXBlOyAgICAgICAgIC8qIFR5cGUgb2YgZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBvd25lcl9pZDsgICAgIC8qIEZvciBXUEVHOiBOb2RlIElEIG9mIEN5Y2xvbmUgdGhhdCBvd25zIHRoaXMgV1BFRyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICBOb2RlIElEIG9mIFR3aXN0ZXIgdGhhdCBvd25zIHRoaXMgQ1lDICovCi0JdW5zaWduZWQgY2hhciBwb3J0MG5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkY9Tm9uZSAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MHBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBwb3J0MW5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkY9Tm9uZSAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MXBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBmaXJzdF9zbG90OyAgIC8qIEZvciBXUEVHOiBMb3dlc3Qgc2xvdCBudW1iZXIgYmVsb3cgdGhpcyBXUEVHICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBzdGF0dXM7ICAgICAgIC8qIEZvciBXUEVHOiBCaXQgMCA9IDEgOiB0aGUgWEFQSUMgaXMgdXNlZCAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICA9IDAgOiB0aGUgWEFQSUMgaXMgbm90IHVzZWQsIGllOiovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgaW50cyBmd2RlZCB0byBhbm90aGVyIFhBUElDICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICBCaXRzMTo3IFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICBCaXRzMDo3IFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBXUF9pbmRleDsgICAgIC8qIEZvciBXUEVHOiBXUEVHIGluc3RhbmNlIGluZGV4IC0gbG93ZXIgb25lcyBoYXZlICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICBsb3dlciBzbG90IG51bWJlcnMvUENJIGJ1cyBudW1iZXJzICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICBObyBtZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBjaGFzc2lzX251bTsgIC8qIDEgYmFzZWQgQ2hhc3NpcyBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBMb29rT3V0IFdQRUdzIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4cGFuc2lvbiBDaGFzc2lzICMsIGVudW1lcmF0ZWQgZnJvbSBCb290ICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vZGUgV1BFRyBleHRlcm5hbCBwb3J0LCB0aGVuIEJvb3QgTm9kZSBDWUMgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIHBvcnQsIHRoZW4gTmV4dCBWaWdpbCBjaGFzc2lzIFdQRUcgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIHBvcnQsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoYXJlZCBMb29rb3V0cyBoYXZlIG9ubHkgMSBjaGFzc2lzIG51bWJlciAodGhlICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IG9uZSBhc3NpZ25lZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLXR5cGVkZWYgZW51bSB7Ci0JQ29tcGF0VHdpc3RlciA9IDAsICAvKiBDb21wYXRpYmlsaXR5IFR3aXN0ZXIgICAgICAgICAgICAgICAqLwotCUFsdFR3aXN0ZXIgICAgPSAxLCAgLyogQWx0ZXJuYXRlIFR3aXN0ZXIgb2YgaW50ZXJuYWwgOC13YXkgKi8KLQlDb21wYXRDeWNsb25lID0gMiwgIC8qIENvbXBhdGliaWxpdHkgQ3ljbG9uZSAgICAgICAgICAgICAgICovCi0JQWx0Q3ljbG9uZSAgICA9IDMsICAvKiBBbHRlcm5hdGUgQ3ljbG9uZSBvZiBpbnRlcm5hbCA4LXdheSAqLwotCUNvbXBhdFdQRUcgICAgPSA0LCAgLyogQ29tcGF0aWJpbGl0eSBXUEVHICAgICAgICAgICAgICAgICAgKi8KLQlBbHRXUEVHICAgICAgID0gNSwgIC8qIFNlY29uZCBQbGFuYXIgV1BFRyAgICAgICAgICAgICAgICAgICovCi0JTG9va091dEFXUEVHICA9IDYsICAvKiBMb29rT3V0IFdQRUcgICAgICAgICAgICAgICAgICAgICAgICAqLwotCUxvb2tPdXRCV1BFRyAgPSA3LCAgLyogTG9va091dCBXUEVHICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gbm9kZV90eXBlOwotCi1zdGF0aWMgaW5saW5lIGludCBpc19XUEVHKHN0cnVjdCByaW9fZGV0YWlsICpyaW8pewotCXJldHVybiAocmlvLT50eXBlID09IENvbXBhdFdQRUcgfHwgcmlvLT50eXBlID09IEFsdFdQRUcgfHwKLQkJcmlvLT50eXBlID09IExvb2tPdXRBV1BFRyB8fCByaW8tPnR5cGUgPT0gTG9va091dEJXUEVHKTsKLX0KLQotI2RlZmluZSBTVU1NSVRfQVBJQ19ERlJfVkFMVUUJKEFQSUNfREZSX0NMVVNURVIpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqc3VtbWl0X3RhcmdldF9jcHVzKHZvaWQpCi17Ci0JLyogQ1BVX01BU0tfQUxMICgweGZmKSBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ciB3aXRoCi0JICogZGVzdF9Mb3dlc3RQcmlvIG1vZGUgbG9naWNhbCBjbHVzdGVyZWQgYXBpYyBpbnRlcnJ1cHQgcm91dGluZwotCSAqIEp1c3Qgc3RhcnQgb24gY3B1IDAuICBJUlEgYmFsYW5jaW5nIHdpbGwgc3ByZWFkIGxvYWQKLQkgKi8KLQlyZXR1cm4gY3B1bWFza19vZigwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3VtbWl0X2NoZWNrX2FwaWNpZF91c2VkKHBoeXNpZF9tYXNrX3QgKm1hcCwgaW50IGFwaWNpZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogd2UgZG9uJ3QgdXNlIHRoZSBwaHlzX2NwdV9wcmVzZW50X21hcCB0byBpbmRpY2F0ZSBhcGljaWQgcHJlc2VuY2UgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN1bW1pdF9jaGVja19hcGljaWRfcHJlc2VudChpbnQgYml0KQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHN1bW1pdF9lYXJseV9sb2dpY2FsX2FwaWNpZChpbnQgY3B1KQotewotCWludCBjb3VudCA9IDA7Ci0JdTggbXlfaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fYXBpY2lkLCBjcHUpOwotCXU4IG15X2NsdXN0ZXIgPSBBUElDX0NMVVNURVIobXlfaWQpOwotI2lmZGVmIENPTkZJR19TTVAKLQl1OCBsaWQ7Ci0JaW50IGk7Ci0KLQkvKiBDcmVhdGUgbG9naWNhbCBBUElDIElEcyBieSBjb3VudGluZyBDUFVzIGFscmVhZHkgaW4gY2x1c3Rlci4gKi8KLQlmb3IgKGNvdW50ID0gMCwgaSA9IG5yX2NwdV9pZHM7IC0taSA+PSAwOyApIHsKLQkJbGlkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCBpKTsKLQkJaWYgKGxpZCAhPSBCQURfQVBJQ0lEICYmIEFQSUNfQ0xVU1RFUihsaWQpID09IG15X2NsdXN0ZXIpCi0JCQkrK2NvdW50OwotCX0KLSNlbmRpZgotCS8qIFdlIG9ubHkgaGF2ZSBhIDQgd2lkZSBiaXRtYXAgaW4gY2x1c3RlciBtb2RlLiAgSWYgYSBkZXJhbmdlZAotCSAqIEJJT1MgcHV0cyA1IENQVXMgaW4gb25lIEFQSUMgY2x1c3Rlciwgd2UncmUgaG9zZWQuICovCi0JQlVHX09OKGNvdW50ID49IFhBUElDX0RFU1RfQ1BVU19TSElGVCk7Ci0JcmV0dXJuIG15X2NsdXN0ZXIgfCAoMVVMIDw8IGNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgc3VtbWl0X2luaXRfYXBpY19sZHIodm9pZCkKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXVuc2lnbmVkIGxvbmcgaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIGNwdSk7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQlhcGljX3dyaXRlKEFQSUNfREZSLCBTVU1NSVRfQVBJQ19ERlJfVkFMVUUpOwotCXZhbCA9IGFwaWNfcmVhZChBUElDX0xEUikgJiB+QVBJQ19MRFJfTUFTSzsKLQl2YWwgfD0gU0VUX0FQSUNfTE9HSUNBTF9JRChpZCk7Ci0JYXBpY193cml0ZShBUElDX0xEUiwgdmFsKTsKLX0KLQotc3RhdGljIGludCBzdW1taXRfYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1bW1pdF9zZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKLXsKLQlwcl9pbmZvKCJFbmFibGluZyBBUElDIG1vZGU6ICBTdW1taXQuICBVc2luZyAlZCBJL08gQVBJQ3NcbiIsCi0JCW5yX2lvYXBpY3MpOwotfQotCi1zdGF0aWMgaW50IHN1bW1pdF9jcHVfcHJlc2VudF90b19hcGljaWQoaW50IG1wc19jcHUpCi17Ci0JaWYgKG1wc19jcHUgPCBucl9jcHVfaWRzKQotCQlyZXR1cm4gKGludClwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIG1wc19jcHUpOwotCWVsc2UKLQkJcmV0dXJuIEJBRF9BUElDSUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1bW1pdF9pb2FwaWNfcGh5c19pZF9tYXAocGh5c2lkX21hc2tfdCAqcGh5c19pZF9tYXAsIHBoeXNpZF9tYXNrX3QgKnJldG1hcCkKLXsKLQkvKiBGb3IgY2x1c3RlcmVkIHdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byBkbyB0aGlzIHlldCAtIGhhY2sgKi8KLQlwaHlzaWRzX3Byb21vdGUoMHgwRkwsIHJldG1hcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1bW1pdF9hcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IGFwaWNpZCwgcGh5c2lkX21hc2tfdCAqcmV0bWFwKQotewotCXBoeXNpZF9zZXRfbWFza19vZl9waHlzaWQoMCwgcmV0bWFwKTsKLX0KLQotc3RhdGljIGludCBzdW1taXRfY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudChpbnQgcGh5c2ljYWxfYXBpY2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotc3VtbWl0X2NwdV9tYXNrX3RvX2FwaWNpZChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywgdW5zaWduZWQgaW50ICpkZXN0X2lkKQotewotCXVuc2lnbmVkIGludCByb3VuZCA9IDA7Ci0JdW5zaWduZWQgaW50IGNwdSwgYXBpY2lkID0gMDsKLQotCS8qCi0JICogVGhlIGNwdXMgaW4gdGhlIG1hc2sgbXVzdCBhbGwgYmUgb24gdGhlIGFwaWMgY2x1c3Rlci4KLQkgKi8KLQlmb3JfZWFjaF9jcHVfYW5kKGNwdSwgY3B1bWFzaywgY3B1X29ubGluZV9tYXNrKSB7Ci0JCWludCBuZXdfYXBpY2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkLCBjcHUpOwotCi0JCWlmIChyb3VuZCAmJiBBUElDX0NMVVNURVIoYXBpY2lkKSAhPSBBUElDX0NMVVNURVIobmV3X2FwaWNpZCkpIHsKLQkJCXByX2VycigiTm90IGEgdmFsaWQgbWFzayFcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYXBpY2lkIHw9IG5ld19hcGljaWQ7Ci0JCXJvdW5kKys7Ci0JfQotCWlmICghcm91bmQpCi0JCXJldHVybiAtRUlOVkFMOwotCSpkZXN0X2lkID0gYXBpY2lkOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1zdW1taXRfY3B1X21hc2tfdG9fYXBpY2lkX2FuZChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqaW5tYXNrLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFuZG1hc2ssCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgKmFwaWNpZCkKLXsKLQljcHVtYXNrX3Zhcl90IGNwdW1hc2s7Ci0JKmFwaWNpZCA9IGVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgMCk7Ci0KLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZjcHVtYXNrLCBHRlBfQVRPTUlDKSkKLQkJcmV0dXJuIDA7Ci0KLQljcHVtYXNrX2FuZChjcHVtYXNrLCBpbm1hc2ssIGFuZG1hc2spOwotCXN1bW1pdF9jcHVfbWFza190b19hcGljaWQoY3B1bWFzaywgYXBpY2lkKTsKLQotCWZyZWVfY3B1bWFza192YXIoY3B1bWFzayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGNwdWlkIHJldHVybnMgdGhlIHZhbHVlIGxhdGNoZWQgaW4gdGhlIEhXIGF0IHJlc2V0LCBub3QgdGhlIEFQSUMgSUQKLSAqIHJlZ2lzdGVyJ3MgdmFsdWUuICBGb3IgYW55IGJveCB3aG9zZSBCSU9TIGNoYW5nZXMgQVBJQyBJRHMsIGxpa2UKLSAqIGNsdXN0ZXJlZCBBUElDIHN5c3RlbXMsIHdlIG11c3QgdXNlIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZC4KLSAqCi0gKiBTZWUgSW50ZWwncyBJQS0zMiBTVyBEZXYncyBNYW51YWwgVm9sMiB1bmRlciBDUFVJRC4KLSAqLwotc3RhdGljIGludCBzdW1taXRfcGh5c19wa2dfaWQoaW50IGNwdWlkX2FwaWMsIGludCBpbmRleF9tc2IpCi17Ci0JcmV0dXJuIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpID4+IGluZGV4X21zYjsKLX0KLQotc3RhdGljIGludCBwcm9iZV9zdW1taXQodm9pZCkKLXsKLQkvKiBwcm9iZWQgbGF0ZXIgaW4gbXB0YWJsZS9BQ1BJIGhvb2tzICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfWDg2X1NVTU1JVF9OVU1BCi1zdGF0aWMgc3RydWN0IHJpb190YWJsZV9oZHIgKnJpb190YWJsZV9oZHI7Ci1zdGF0aWMgc3RydWN0IHNjYWxfZGV0YWlsICAgKnNjYWxfZGV2c1tNQVhfTlVNTk9ERVNdOwotc3RhdGljIHN0cnVjdCByaW9fZGV0YWlsICAgICpyaW9fZGV2c1tNQVhfTlVNTk9ERVMqNF07Ci0KLSNpZm5kZWYgQ09ORklHX1g4Nl9OVU1BUQotc3RhdGljIGludCBtcF9idXNfaWRfdG9fbm9kZVtNQVhfTVBfQlVTU0VTXTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHNldHVwX3BjaV9ub2RlX21hcF9mb3Jfd3BlZyhpbnQgd3BlZ19udW0sIGludCBsYXN0X2J1cykKLXsKLQlpbnQgdHdpc3RlciA9IDAsIG5vZGUgPSAwOwotCWludCBpLCBidXMsIG51bV9idXNlczsKLQotCWZvciAoaSA9IDA7IGkgPCByaW9fdGFibGVfaGRyLT5udW1fcmlvX2RldjsgaSsrKSB7Ci0JCWlmIChyaW9fZGV2c1tpXS0+bm9kZV9pZCA9PSByaW9fZGV2c1t3cGVnX251bV0tPm93bmVyX2lkKSB7Ci0JCQl0d2lzdGVyID0gcmlvX2RldnNbaV0tPm93bmVyX2lkOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGkgPT0gcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXYpIHsKLQkJcHJfZXJyKCJDb3VsZG4ndCBmaW5kIG93bmVyIEN5Y2xvbmUgZm9yIFdpbm5pcGVnIVxuIik7Ci0JCXJldHVybiBsYXN0X2J1czsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2OyBpKyspIHsKLQkJaWYgKHNjYWxfZGV2c1tpXS0+bm9kZV9pZCA9PSB0d2lzdGVyKSB7Ci0JCQlub2RlID0gc2NhbF9kZXZzW2ldLT5ub2RlX2lkOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGkgPT0gcmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2KSB7Ci0JCXByX2VycigiQ291bGRuJ3QgZmluZCBvd25lciBUd2lzdGVyIGZvciBDeWNsb25lIVxuIik7Ci0JCXJldHVybiBsYXN0X2J1czsKLQl9Ci0KLQlzd2l0Y2ggKHJpb19kZXZzW3dwZWdfbnVtXS0+dHlwZSkgewotCWNhc2UgQ29tcGF0V1BFRzoKLQkJLyoKLQkJICogVGhlIENvbXBhdGliaWxpdHkgV2lubmlwZWcgY29udHJvbHMgdGhlIDIgbGVnYWN5IGJ1c2VzLAotCQkgKiB0aGUgNjZNSHogUENJIGJ1cyBbMiBzbG90c10gYW5kIHRoZSAyICJleHRyYSIgYnVzZXMgaW4gY2FzZQotCQkgKiBhIFBDSS1QQ0kgYnJpZGdlIGNhcmQgaXMgdXNlZCBpbiBlaXRoZXIgc2xvdDogdG90YWwgNSBidXNlcy4KLQkJICovCi0JCW51bV9idXNlcyA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgQWx0V1BFRzoKLQkJLyoKLQkJICogVGhlIEFsdGVybmF0ZSBXaW5uaXBlZyBjb250cm9scyB0aGUgMiAxMzNNSHogYnVzZXMgWzEgc2xvdAotCQkgKiBlYWNoXSwgdGhlaXIgMiAiZXh0cmEiIGJ1c2VzLCB0aGUgMTAwTUh6IGJ1cyBbMiBzbG90c10gYW5kCi0JCSAqIHRoZSAiZXh0cmEiIGJ1c2VzIGZvciBlYWNoIG9mIHRob3NlIHNsb3RzOiB0b3RhbCA3IGJ1c2VzLgotCQkgKi8KLQkJbnVtX2J1c2VzID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBMb29rT3V0QVdQRUc6Ci0JY2FzZSBMb29rT3V0QldQRUc6Ci0JCS8qCi0JCSAqIEEgTG9va291dCBXaW5uaXBlZyBjb250cm9scyAzIDEwME1IeiBidXNlcyBbMiBzbG90cyBlYWNoXQotCQkgKiAmIHRoZSAiZXh0cmEiIGJ1c2VzIGZvciBlYWNoIG9mIHRob3NlIHNsb3RzOiB0b3RhbCA5IGJ1c2VzLgotCQkgKi8KLQkJbnVtX2J1c2VzID0gOTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfaW5mbygiVW5zdXBwb3J0ZWQgV2lubmlwZWcgdHlwZSFcbiIpOwotCQlyZXR1cm4gbGFzdF9idXM7Ci0JfQotCi0JZm9yIChidXMgPSBsYXN0X2J1czsgYnVzIDwgbGFzdF9idXMgKyBudW1fYnVzZXM7IGJ1cysrKQotCQltcF9idXNfaWRfdG9fbm9kZVtidXNdID0gbm9kZTsKLQlyZXR1cm4gYnVzOwotfQotCi1zdGF0aWMgaW50IGJ1aWxkX2RldGFpbF9hcnJheXModm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHB0cjsKLQlpbnQgaSwgc2NhbF9kZXRhaWxfc2l6ZSwgcmlvX2RldGFpbF9zaXplOwotCi0JaWYgKHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldiA+IE1BWF9OVU1OT0RFUykgewotCQlwcl93YXJuKCJNQVhfTlVNTk9ERVMgdG9vIGxvdyEgIERlZmluZWQgYXMgJWQsIGJ1dCBzeXN0ZW0gaGFzICVkIG5vZGVzXG4iLAotCQkJTUFYX05VTU5PREVTLCByaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKHJpb190YWJsZV9oZHItPnZlcnNpb24pIHsKLQlkZWZhdWx0OgotCQlwcl93YXJuKCJJbnZhbGlkIFJpbyBHcmFuZGUgVGFibGUgVmVyc2lvbjogJWRcbiIsCi0JCQlyaW9fdGFibGVfaGRyLT52ZXJzaW9uKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSAyOgotCQlzY2FsX2RldGFpbF9zaXplID0gMTE7Ci0JCXJpb19kZXRhaWxfc2l6ZSA9IDEzOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXNjYWxfZGV0YWlsX3NpemUgPSAxMjsKLQkJcmlvX2RldGFpbF9zaXplID0gMTU7Ci0JCWJyZWFrOwotCX0KLQotCXB0ciA9ICh1bnNpZ25lZCBsb25nKXJpb190YWJsZV9oZHIgKyAzOwotCWZvciAoaSA9IDA7IGkgPCByaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXY7IGkrKywgcHRyICs9IHNjYWxfZGV0YWlsX3NpemUpCi0JCXNjYWxfZGV2c1tpXSA9IChzdHJ1Y3Qgc2NhbF9kZXRhaWwgKilwdHI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXY7IGkrKywgcHRyICs9IHJpb19kZXRhaWxfc2l6ZSkKLQkJcmlvX2RldnNbaV0gPSAoc3RydWN0IHJpb19kZXRhaWwgKilwdHI7Ci0KLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBzZXR1cF9zdW1taXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nCQlwdHI7Ci0JdW5zaWduZWQgc2hvcnQJCW9mZnNldDsKLQlpbnQJCQlpLCBuZXh0X3dwZWcsIG5leHRfYnVzID0gMDsKLQotCS8qIFRoZSBwb2ludGVyIHRvIHRoZSBFQkRBIGlzIHN0b3JlZCBpbiB0aGUgd29yZCBAIHBoeXMgMHg0MEUoNDA6MEUpICovCi0JcHRyID0gZ2V0X2Jpb3NfZWJkYSgpOwotCXB0ciA9ICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwdHIpOwotCi0JcmlvX3RhYmxlX2hkciA9IE5VTEw7Ci0Jb2Zmc2V0ID0gMHgxODA7Ci0Jd2hpbGUgKG9mZnNldCkgewotCQkvKiBUaGUgYmxvY2sgaWQgaXMgc3RvcmVkIGluIHRoZSAybmQgd29yZCAqLwotCQlpZiAoKigodW5zaWduZWQgc2hvcnQgKikocHRyICsgb2Zmc2V0ICsgMikpID09IDB4NDc1MikgewotCQkJLyogc2V0IHRoZSBwb2ludGVyIHBhc3QgdGhlIG9mZnNldCAmIGJsb2NrIGlkICovCi0JCQlyaW9fdGFibGVfaGRyID0gKHN0cnVjdCByaW9fdGFibGVfaGRyICopKHB0ciArIG9mZnNldCArIDQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogVGhlIG5leHQgb2Zmc2V0IGlzIHN0b3JlZCBpbiB0aGUgMXN0IHdvcmQuICAwIG1lYW5zIG5vIG1vcmUgKi8KLQkJb2Zmc2V0ID0gKigodW5zaWduZWQgc2hvcnQgKikocHRyICsgb2Zmc2V0KSk7Ci0JfQotCWlmICghcmlvX3RhYmxlX2hkcikgewotCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgUmlvIEdyYW5kZSBUYWJsZSBpbiBFQkRBIC0gYmFpbGluZyFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFidWlsZF9kZXRhaWxfYXJyYXlzKCkpCi0JCXJldHVybjsKLQotCS8qIFRoZSBmaXJzdCBXaW5uaXBlZyB3ZSdyZSBsb29raW5nIGZvciBoYXMgYW4gaW5kZXggb2YgMCAqLwotCW5leHRfd3BlZyA9IDA7Ci0JZG8gewotCQlmb3IgKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXY7IGkrKykgewotCQkJaWYgKGlzX1dQRUcocmlvX2RldnNbaV0pICYmIHJpb19kZXZzW2ldLT5XUF9pbmRleCA9PSBuZXh0X3dwZWcpIHsKLQkJCQkvKiBJdCdzIHRoZSBXaW5uaXBlZyB3ZSdyZSBsb29raW5nIGZvciEgKi8KLQkJCQluZXh0X2J1cyA9IHNldHVwX3BjaV9ub2RlX21hcF9mb3Jfd3BlZyhpLCBuZXh0X2J1cyk7Ci0JCQkJbmV4dF93cGVnKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogSWYgd2UgZ28gdGhyb3VnaCBhbGwgUmlvIGRldmljZXMgYW5kIGRvbid0IGZpbmQgb25lIHdpdGgKLQkJICogdGhlIG5leHQgaW5kZXgsIGl0IG1lYW5zIHdlJ3ZlIGZvdW5kIGFsbCB0aGUgV2lubmlwZWdzLAotCQkgKiBhbmQgdGh1cyBhbGwgdGhlIFBDSSBidXNlcy4KLQkJICovCi0JCWlmIChpID09IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2KQotCQkJbmV4dF93cGVnID0gMDsKLQl9IHdoaWxlIChuZXh0X3dwZWcgIT0gMCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfc3VtbWl0ID0gewotCi0JLm5hbWUJCQkJPSAic3VtbWl0IiwKLQkucHJvYmUJCQkJPSBwcm9iZV9zdW1taXQsCi0JLmFjcGlfbWFkdF9vZW1fY2hlY2sJCT0gc3VtbWl0X2FjcGlfbWFkdF9vZW1fY2hlY2ssCi0JLmFwaWNfaWRfdmFsaWQJCQk9IGRlZmF1bHRfYXBpY19pZF92YWxpZCwKLQkuYXBpY19pZF9yZWdpc3RlcmVkCQk9IHN1bW1pdF9hcGljX2lkX3JlZ2lzdGVyZWQsCi0KLQkuaXJxX2RlbGl2ZXJ5X21vZGUJCT0gZGVzdF9Mb3dlc3RQcmlvLAotCS8qIGxvZ2ljYWwgZGVsaXZlcnkgYnJvYWRjYXN0IHRvIGFsbCBDUFVzOiAqLwotCS5pcnFfZGVzdF9tb2RlCQkJPSAxLAotCi0JLnRhcmdldF9jcHVzCQkJPSBzdW1taXRfdGFyZ2V0X2NwdXMsCi0JLmRpc2FibGVfZXNyCQkJPSAxLAotCS5kZXN0X2xvZ2ljYWwJCQk9IEFQSUNfREVTVF9MT0dJQ0FMLAotCS5jaGVja19hcGljaWRfdXNlZAkJPSBzdW1taXRfY2hlY2tfYXBpY2lkX3VzZWQsCi0JLmNoZWNrX2FwaWNpZF9wcmVzZW50CQk9IHN1bW1pdF9jaGVja19hcGljaWRfcHJlc2VudCwKLQotCS52ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4JPSBmbGF0X3ZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiwKLQkuaW5pdF9hcGljX2xkcgkJCT0gc3VtbWl0X2luaXRfYXBpY19sZHIsCi0KLQkuaW9hcGljX3BoeXNfaWRfbWFwCQk9IHN1bW1pdF9pb2FwaWNfcGh5c19pZF9tYXAsCi0JLnNldHVwX2FwaWNfcm91dGluZwkJPSBzdW1taXRfc2V0dXBfYXBpY19yb3V0aW5nLAotCS5tdWx0aV90aW1lcl9jaGVjawkJPSBOVUxMLAotCS5jcHVfcHJlc2VudF90b19hcGljaWQJCT0gc3VtbWl0X2NwdV9wcmVzZW50X3RvX2FwaWNpZCwKLQkuYXBpY2lkX3RvX2NwdV9wcmVzZW50CQk9IHN1bW1pdF9hcGljaWRfdG9fY3B1X3ByZXNlbnQsCi0JLnNldHVwX3BvcnRpb19yZW1hcAkJPSBOVUxMLAotCS5jaGVja19waHlzX2FwaWNpZF9wcmVzZW50CT0gc3VtbWl0X2NoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQsCi0JLmVuYWJsZV9hcGljX21vZGUJCT0gTlVMTCwKLQkucGh5c19wa2dfaWQJCQk9IHN1bW1pdF9waHlzX3BrZ19pZCwKLQkubXBzX29lbV9jaGVjawkJCT0gc3VtbWl0X21wc19vZW1fY2hlY2ssCi0KLQkuZ2V0X2FwaWNfaWQJCQk9IHN1bW1pdF9nZXRfYXBpY19pZCwKLQkuc2V0X2FwaWNfaWQJCQk9IE5VTEwsCi0JLmFwaWNfaWRfbWFzawkJCT0gMHhGRiA8PCAyNCwKLQotCS5jcHVfbWFza190b19hcGljaWRfYW5kCQk9IHN1bW1pdF9jcHVfbWFza190b19hcGljaWRfYW5kLAotCi0JLnNlbmRfSVBJX21hc2sJCQk9IHN1bW1pdF9zZW5kX0lQSV9tYXNrLAotCS5zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGYJPSBOVUxMLAotCS5zZW5kX0lQSV9hbGxidXRzZWxmCQk9IHN1bW1pdF9zZW5kX0lQSV9hbGxidXRzZWxmLAotCS5zZW5kX0lQSV9hbGwJCQk9IHN1bW1pdF9zZW5kX0lQSV9hbGwsCi0JLnNlbmRfSVBJX3NlbGYJCQk9IGRlZmF1bHRfc2VuZF9JUElfc2VsZiwKLQotCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKLQkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGRlZmF1bHRfd2FpdF9mb3JfaW5pdF9kZWFzc2VydCwKLQotCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAotCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IGRlZmF1bHRfaW5xdWlyZV9yZW1vdGVfYXBpYywKLQotCS5yZWFkCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3JlYWQsCi0JLndyaXRlCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAotCS5lb2lfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX21lbV93cml0ZSwKLQkuaWNyX3JlYWQJCQk9IG5hdGl2ZV9hcGljX2ljcl9yZWFkLAotCS5pY3Jfd3JpdGUJCQk9IG5hdGl2ZV9hcGljX2ljcl93cml0ZSwKLQkud2FpdF9pY3JfaWRsZQkJCT0gbmF0aXZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQkuc2FmZV93YWl0X2ljcl9pZGxlCQk9IG5hdGl2ZV9zYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKLQotCS54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQJPSBzdW1taXRfZWFybHlfbG9naWNhbF9hcGljaWQsCi19OwotCi1hcGljX2RyaXZlcihhcGljX3N1bW1pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYwppbmRleCBjYWM4NWVlLi5lNjY3NjZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKQEAgLTI3OSw3ICsyNzksNyBAQAogCiAJLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfTE9XLAogCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19ISUdILAotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IE5VTEwsCisJLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZmFsc2UsCiAJLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IE5VTEwsCiAJLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gTlVMTCwKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3BoeXMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19waHlzLmMKaW5kZXggZGUyMzFlMy4uNmQ2MDBlYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3BoeXMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIAogCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKIAkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKLQkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBOVUxMLAorCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IGZhbHNlLAogCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAogCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IE5VTEwsCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IGQyNjNiMTMuLjc4MzQzODkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJLndha2V1cF9zZWNvbmRhcnlfY3B1CQk9IHV2X3dha2V1cF9zZWNvbmRhcnksCiAJLnRyYW1wb2xpbmVfcGh5c19sb3cJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfTE9XLAogCS50cmFtcG9saW5lX3BoeXNfaGlnaAkJPSBERUZBVUxUX1RSQU1QT0xJTkVfUEhZU19ISUdILAotCS53YWl0X2Zvcl9pbml0X2RlYXNzZXJ0CQk9IE5VTEwsCisJLndhaXRfZm9yX2luaXRfZGVhc3NlcnQJCT0gZmFsc2UsCiAJLnNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYwk9IE5VTEwsCiAJLmlucXVpcmVfcmVtb3RlX2FwaWMJCT0gTlVMTCwKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKaW5kZXggYzY3ZmZhNi4uY2U4YjhmZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAkgKi8KIAlXQVJOX09OQ0UoMSwgIldBUk5JTkc6IFRoaXMgY29tYmluYXRpb24gb2YgQU1EIgogCQkiIHByb2Nlc3NvcnMgaXMgbm90IHN1aXRhYmxlIGZvciBTTVAuXG4iKTsKLQlhZGRfdGFpbnQoVEFJTlRfVU5TQUZFX1NNUCwgTE9DS0RFUF9OT1dfVU5SRUxJQUJMRSk7CisJYWRkX3RhaW50KFRBSU5UX0NQVV9PVVRfT0ZfU1BFQywgTE9DS0RFUF9OT1dfVU5SRUxJQUJMRSk7CiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfYW1kX2s3KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKQEAgLTIzMyw5ICsyMzMsNyBAQAogCWlmIChjLT54ODZfbW9kZWwgPj0gNiAmJiBjLT54ODZfbW9kZWwgPD0gMTApIHsKIAkJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1hNTSkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIGRpc2FibGVkIEs3L1NTRSBTdXBwb3J0LlxuIik7Ci0JCQlyZG1zcihNU1JfSzdfSFdDUiwgbCwgaCk7Ci0JCQlsICY9IH4weDAwMDA4MDAwOwotCQkJd3Jtc3IoTVNSX0s3X0hXQ1IsIGwsIGgpOworCQkJbXNyX2NsZWFyX2JpdChNU1JfSzdfSFdDUiwgMTUpOwogCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfWE1NKTsKIAkJfQogCX0KQEAgLTUwOSwxNCArNTA3LDggQEAKICNlbmRpZgogCiAJLyogRjE2aCBlcnJhdHVtIDc5MywgQ1ZFLTIwMTMtNjg4NSAqLwotCWlmIChjLT54ODYgPT0gMHgxNiAmJiBjLT54ODZfbW9kZWwgPD0gMHhmKSB7Ci0JCXU2NCB2YWw7Ci0KLQkJcmRtc3JsKE1TUl9BTUQ2NF9MU19DRkcsIHZhbCk7Ci0JCWlmICghKHZhbCAmIEJJVCgxNSkpKQotCQkJd3Jtc3JsKE1TUl9BTUQ2NF9MU19DRkcsIHZhbCB8IEJJVCgxNSkpOwotCX0KLQorCWlmIChjLT54ODYgPT0gMHgxNiAmJiBjLT54ODZfbW9kZWwgPD0gMHhmKQorCQltc3Jfc2V0X2JpdChNU1JfQU1ENjRfTFNfQ0ZHLCAxNSk7CiB9CiAKIHN0YXRpYyBjb25zdCBpbnQgYW1kX2VycmF0dW1fMzgzW107CkBAIC01MzYsMTEgKzUyOCw4IEBACiAJICogRXJyYXRhIDYzIGZvciBTSC1CMyBzdGVwcGluZ3MKIAkgKiBFcnJhdGEgMTIyIGZvciBhbGwgc3RlcHBpbmdzIChGKyBoYXZlIGl0IGRpc2FibGVkIGJ5IGRlZmF1bHQpCiAJICovCi0JaWYgKGMtPng4NiA9PSAweGYpIHsKLQkJcmRtc3JsKE1TUl9LN19IV0NSLCB2YWx1ZSk7Ci0JCXZhbHVlIHw9IDEgPDwgNjsKLQkJd3Jtc3JsKE1TUl9LN19IV0NSLCB2YWx1ZSk7Ci0JfQorCWlmIChjLT54ODYgPT0gMHhmKQorCQltc3Jfc2V0X2JpdChNU1JfSzdfSFdDUiwgNik7CiAjZW5kaWYKIAogCWVhcmx5X2luaXRfYW1kKGMpOwpAQCAtNjIzLDE0ICs2MTIsMTEgQEAKIAkgICAgKGMtPng4Nl9tb2RlbCA+PSAweDEwKSAmJiAoYy0+eDg2X21vZGVsIDw9IDB4MWYpICYmCiAJICAgICFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1RPUE9FWFQpKSB7CiAKLQkJaWYgKCFyZG1zcmxfc2FmZSgweGMwMDExMDA1LCAmdmFsdWUpKSB7Ci0JCQl2YWx1ZSB8PSAxVUxMIDw8IDU0OwotCQkJd3Jtc3JsX3NhZmUoMHhjMDAxMTAwNSwgdmFsdWUpOworCQlpZiAobXNyX3NldF9iaXQoMHhjMDAxMTAwNSwgNTQpID4gMCkgewogCQkJcmRtc3JsKDB4YzAwMTEwMDUsIHZhbHVlKTsKLQkJCWlmICh2YWx1ZSAmICgxVUxMIDw8IDU0KSkgeworCQkJaWYgKHZhbHVlICYgQklUXzY0KDU0KSkgewogCQkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1RPUE9FWFQpOwotCQkJCXByaW50ayhLRVJOX0lORk8gRldfSU5GTyAiQ1BVOiBSZS1lbmFibGluZyAiCi0JCQkJICAiZGlzYWJsZWQgVG9wb2xvZ3kgRXh0ZW5zaW9ucyBTdXBwb3J0XG4iKTsKKwkJCQlwcl9pbmZvKEZXX0lORk8gIkNQVTogUmUtZW5hYmxpbmcgZGlzYWJsZWQgVG9wb2xvZ3kgRXh0ZW5zaW9ucyBTdXBwb3J0LlxuIik7CiAJCQl9CiAJCX0KIAl9CkBAIC03MDksMTkgKzY5NSwxMiBAQAogCQkgKiBEaXNhYmxlIEdBUlQgVExCIFdhbGsgRXJyb3JzIG9uIEZhbTEwaC4gV2UgZG8gdGhpcyBoZXJlCiAJCSAqIGJlY2F1c2UgdGhpcyBpcyBhbHdheXMgbmVlZGVkIHdoZW4gR0FSVCBpcyBlbmFibGVkLCBldmVuIGluIGEKIAkJICoga2VybmVsIHdoaWNoIGhhcyBubyBNQ0Ugc3VwcG9ydCBidWlsdCBpbi4KLQkJICogQklPUyBzaG91bGQgZGlzYWJsZSBHYXJ0VGxiV2xrIEVycm9ycyB0aGVtc2VsZi4gSWYKLQkJICogaXQgZG9lc24ndCBkbyBpdCBoZXJlIGFzIHN1Z2dlc3RlZCBieSB0aGUgQktERy4KKwkJICogQklPUyBzaG91bGQgZGlzYWJsZSBHYXJ0VGxiV2xrIEVycm9ycyBhbHJlYWR5LiBJZgorCQkgKiBpdCBkb2Vzbid0LCBkbyBpdCBoZXJlIGFzIHN1Z2dlc3RlZCBieSB0aGUgQktERy4KIAkJICoKIAkJICogRml4ZXM6IGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzMwMTIKIAkJICovCi0JCXU2NCBtYXNrOwotCQlpbnQgZXJyOwotCi0JCWVyciA9IHJkbXNybF9zYWZlKE1TUl9BTUQ2NF9NQ3hfTUFTSyg0KSwgJm1hc2spOwotCQlpZiAoZXJyID09IDApIHsKLQkJCW1hc2sgfD0gKDEgPDwgMTApOwotCQkJd3Jtc3JsX3NhZmUoTVNSX0FNRDY0X01DeF9NQVNLKDQpLCBtYXNrKTsKLQkJfQorCQltc3Jfc2V0X2JpdChNU1JfQU1ENjRfTUN4X01BU0soNCksIDEwKTsKIAogCQkvKgogCQkgKiBPbiBmYW1pbHkgMTBoIEJJT1MgbWF5IG5vdCBoYXZlIHByb3Blcmx5IGVuYWJsZWQgV0MrIHN1cHBvcnQsCkBAIC03MzMsMTAgKzcxMiw3IEBACiAJCSAqIE5PVEU6IHdlIHdhbnQgdG8gdXNlIHRoZSBfc2FmZSBhY2Nlc3NvcnMgc28gYXMgbm90IHRvICNHUCBrdm0KIAkJICogZ3Vlc3RzIG9uIG9sZGVyIGt2bSBob3N0cy4KIAkJICovCi0KLQkJcmRtc3JsX3NhZmUoTVNSX0FNRDY0X0JVX0NGRzIsICZ2YWx1ZSk7Ci0JCXZhbHVlICY9IH4oMVVMTCA8PCAyNCk7Ci0JCXdybXNybF9zYWZlKE1TUl9BTUQ2NF9CVV9DRkcyLCB2YWx1ZSk7CisJCW1zcl9jbGVhcl9iaXQoTVNSX0FNRDY0X0JVX0NGRzIsIDI0KTsKIAogCQlpZiAoY3B1X2hhc19hbWRfZXJyYXR1bShjLCBhbWRfZXJyYXR1bV8zODMpKQogCQkJc2V0X2NwdV9idWcoYywgWDg2X0JVR19BTURfVExCX01NQVRDSCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCA4ZTI4YmYyLi5hMTM1MjM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTEwMjUsNyArMTAyNSw4IEBACiAKIHN0YXRpYyBfX2luaXQgaW50IHNldHVwX25vY2xmbHVzaChjaGFyICphcmcpCiB7Ci0Jc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9DTEZMU0gpOworCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfQ0xGTFVTSCk7CisJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9DTEZMVVNIT1BUKTsKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoIm5vY2xmbHVzaCIsIHNldHVwX25vY2xmbHVzaCk7CkBAIC0xMDc4LDYgKzEwNzksMTAgQEAKIH0KIF9fc2V0dXAoImNsZWFyY3B1aWQ9Iiwgc2V0dXBfZGlzYWJsZWNwdWlkKTsKIAorREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywga2VybmVsX3N0YWNrKSA9CisJKHVuc2lnbmVkIGxvbmcpJmluaXRfdGhyZWFkX3VuaW9uIC0gS0VSTkVMX1NUQUNLX09GRlNFVCArIFRIUkVBRF9TSVpFOworRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGtlcm5lbF9zdGFjayk7CisKICNpZmRlZiBDT05GSUdfWDg2XzY0CiBzdHJ1Y3QgZGVzY19wdHIgaWR0X2Rlc2NyID0geyBOUl9WRUNUT1JTICogMTYgLSAxLCAodW5zaWduZWQgbG9uZykgaWR0X3RhYmxlIH07CiBzdHJ1Y3QgZGVzY19wdHIgZGVidWdfaWR0X2Rlc2NyID0geyBOUl9WRUNUT1JTICogMTYgLSAxLApAQCAtMTA5NCwxMCArMTA5OSw2IEBACiAJJmluaXRfdGFzazsKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChjdXJyZW50X3Rhc2spOwogCi1ERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBrZXJuZWxfc3RhY2spID0KLQkodW5zaWduZWQgbG9uZykmaW5pdF90aHJlYWRfdW5pb24gLSBLRVJORUxfU1RBQ0tfT0ZGU0VUICsgVEhSRUFEX1NJWkU7Ci1FWFBPUlRfUEVSX0NQVV9TWU1CT0woa2VybmVsX3N0YWNrKTsKLQogREVGSU5FX1BFUl9DUFUoY2hhciAqLCBpcnFfc3RhY2tfcHRyKSA9CiAJaW5pdF9wZXJfY3B1X3ZhcihpcnFfc3RhY2tfdW5pb24uaXJxX3N0YWNrKSArIElSUV9TVEFDS19TSVpFIC0gNjQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCA1Y2Q5YmZhLi5hODAwMjkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC0zMSwxMSArMzEsOCBAQAogCiAJLyogVW5tYXNrIENQVUlEIGxldmVscyBpZiBtYXNrZWQ6ICovCiAJaWYgKGMtPng4NiA+IDYgfHwgKGMtPng4NiA9PSA2ICYmIGMtPng4Nl9tb2RlbCA+PSAweGQpKSB7Ci0JCXJkbXNybChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbWlzY19lbmFibGUpOwotCi0JCWlmIChtaXNjX2VuYWJsZSAmIE1TUl9JQTMyX01JU0NfRU5BQkxFX0xJTUlUX0NQVUlEKSB7Ci0JCQltaXNjX2VuYWJsZSAmPSB+TVNSX0lBMzJfTUlTQ19FTkFCTEVfTElNSVRfQ1BVSUQ7Ci0JCQl3cm1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlKTsKKwkJaWYgKG1zcl9jbGVhcl9iaXQoTVNSX0lBMzJfTUlTQ19FTkFCTEUsCisJCQkJICBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MSU1JVF9DUFVJRF9CSVQpID4gMCkgewogCQkJYy0+Y3B1aWRfbGV2ZWwgPSBjcHVpZF9lYXgoMCk7CiAJCQlnZXRfY3B1X2NhcChjKTsKIAkJfQpAQCAtMTI5LDE2ICsxMjYsMTAgQEAKIAkgKiBJbmdvIE1vbG5hciByZXBvcnRlZCBhIFBlbnRpdW0gRCAobW9kZWwgNikgYW5kIGEgWGVvbgogCSAqIChtb2RlbCAyKSB3aXRoIHRoZSBzYW1lIHByb2JsZW0uCiAJICovCi0JaWYgKGMtPng4NiA9PSAxNSkgewotCQlyZG1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlKTsKLQotCQlpZiAobWlzY19lbmFibGUgJiBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklORykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAia21lbWNoZWNrOiBEaXNhYmxpbmcgZmFzdCBzdHJpbmcgb3BlcmF0aW9uc1xuIik7Ci0KLQkJCW1pc2NfZW5hYmxlICY9IH5NU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklORzsKLQkJCXdybXNybChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbWlzY19lbmFibGUpOwotCQl9Ci0JfQorCWlmIChjLT54ODYgPT0gMTUpCisJCWlmIChtc3JfY2xlYXJfYml0KE1TUl9JQTMyX01JU0NfRU5BQkxFLAorCQkJCSAgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkFTVF9TVFJJTkdfQklUKSA+IDApCisJCQlwcl9pbmZvKCJrbWVtY2hlY2s6IERpc2FibGluZyBmYXN0IHN0cmluZyBvcGVyYXRpb25zXG4iKTsKICNlbmRpZgogCiAJLyoKQEAgLTE5NSwxMCArMTg2LDE2IEBACiAJfQogfQogCitzdGF0aWMgaW50IGZvcmNlcGFlOworc3RhdGljIGludCBfX2luaXQgZm9yY2VwYWVfc2V0dXAoY2hhciAqX191bnVzZWQpCit7CisJZm9yY2VwYWUgPSAxOworCXJldHVybiAxOworfQorX19zZXR1cCgiZm9yY2VwYWUiLCBmb3JjZXBhZV9zZXR1cCk7CisKIHN0YXRpYyB2b2lkIGludGVsX3dvcmthcm91bmRzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKLQl1bnNpZ25lZCBsb25nIGxvLCBoaTsKLQogI2lmZGVmIENPTkZJR19YODZfRjAwRl9CVUcKIAkvKgogCSAqIEFsbCBjdXJyZW50IG1vZGVscyBvZiBQZW50aXVtIGFuZCBQZW50aXVtIHdpdGggTU1YIHRlY2hub2xvZ3kgQ1BVcwpAQCAtMjI1LDE2ICsyMjIsMjYgQEAKIAkJY2xlYXJfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9TRVApOwogCiAJLyoKKwkgKiBQQUUgQ1BVSUQgaXNzdWU6IG1hbnkgUGVudGl1bSBNIHJlcG9ydCBubyBQQUUgYnV0IG1heSBoYXZlIGEKKwkgKiBmdW5jdGlvbmFsbHkgdXNhYmxlIFBBRSBpbXBsZW1lbnRhdGlvbi4KKwkgKiBGb3JjZWZ1bGx5IGVuYWJsZSBQQUUgaWYga2VybmVsIHBhcmFtZXRlciAiZm9yY2VwYWUiIGlzIHByZXNlbnQuCisJICovCisJaWYgKGZvcmNlcGFlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBBRSBmb3JjZWQhXG4iKTsKKwkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUEFFKTsKKwkJYWRkX3RhaW50KFRBSU5UX0NQVV9PVVRfT0ZfU1BFQywgTE9DS0RFUF9OT1dfVU5SRUxJQUJMRSk7CisJfQorCisJLyoKIAkgKiBQNCBYZW9uIGVycmF0YSAwMzcgd29ya2Fyb3VuZC4KIAkgKiBIYXJkd2FyZSBwcmVmZXRjaGVyIG1heSBjYXVzZSBzdGFsZSBkYXRhIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBjYWNoZS4KIAkgKi8KIAlpZiAoKGMtPng4NiA9PSAxNSkgJiYgKGMtPng4Nl9tb2RlbCA9PSAxKSAmJiAoYy0+eDg2X21hc2sgPT0gMSkpIHsKLQkJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvLCBoaSk7Ci0JCWlmICgobG8gJiBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QUkVGRVRDSF9ESVNBQkxFKSA9PSAwKSB7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyAiQ1BVOiBDMCBzdGVwcGluZyBQNCBYZW9uIGRldGVjdGVkLlxuIik7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyAiQ1BVOiBEaXNhYmxpbmcgaGFyZHdhcmUgcHJlZmV0Y2hpbmcgKEVycmF0YSAwMzcpXG4iKTsKLQkJCWxvIHw9IE1TUl9JQTMyX01JU0NfRU5BQkxFX1BSRUZFVENIX0RJU0FCTEU7Ci0JCQl3cm1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbG8sIGhpKTsKKwkJaWYgKG1zcl9zZXRfYml0KE1TUl9JQTMyX01JU0NfRU5BQkxFLAorCQkJCU1TUl9JQTMyX01JU0NfRU5BQkxFX1BSRUZFVENIX0RJU0FCTEVfQklUKQorCQkgICAgPiAwKSB7CisJCQlwcl9pbmZvKCJDUFU6IEMwIHN0ZXBwaW5nIFA0IFhlb24gZGV0ZWN0ZWQuXG4iKTsKKwkJCXByX2luZm8oIkNQVTogRGlzYWJsaW5nIGhhcmR3YXJlIHByZWZldGNoaW5nIChFcnJhdGEgMDM3KVxuIik7CiAJCX0KIAl9CiAKQEAgLTI2NywxMCArMjc0LDYgQEAKIAl9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfTlVNQVEKLQludW1hcV90c2NfZGlzYWJsZSgpOwotI2VuZGlmCi0KIAlpbnRlbF9zbXBfY2hlY2soYyk7CiB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tYXRjaC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tYXRjaC5jCmluZGV4IDM2NTY1MzcuLmFmYTlmMGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWF0Y2guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21hdGNoLmMKQEAgLTQ3LDQ1ICs0NywzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKHg4Nl9tYXRjaF9jcHUpOwotCi1zc2l6ZV90IGFyY2hfcHJpbnRfY3B1X21vZGFsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljaGFyICpidWZwdHIpCi17Ci0JaW50IHNpemUgPSBQQUdFX1NJWkU7Ci0JaW50IGksIG47Ci0JY2hhciAqYnVmID0gYnVmcHRyOwotCi0JbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIng4NmNwdTp2ZW5kb3I6JTA0WDpmYW1pbHk6JTA0WDoiCi0JCSAgICAgIm1vZGVsOiUwNFg6ZmVhdHVyZToiLAotCQlib290X2NwdV9kYXRhLng4Nl92ZW5kb3IsCi0JCWJvb3RfY3B1X2RhdGEueDg2LAotCQlib290X2NwdV9kYXRhLng4Nl9tb2RlbCk7Ci0Jc2l6ZSAtPSBuOwotCWJ1ZiArPSBuOwotCXNpemUgLT0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFMqMzI7IGkrKykgewotCQlpZiAoYm9vdF9jcHVfaGFzKGkpKSB7Ci0JCQluID0gc25wcmludGYoYnVmLCBzaXplLCAiLCUwNFgiLCBpKTsKLQkJCWlmIChuID49IHNpemUpIHsKLQkJCQlXQVJOKDEsICJ4ODYgZmVhdHVyZXMgb3ZlcmZsb3cgcGFnZVxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzaXplIC09IG47Ci0JCQlidWYgKz0gbjsKLQkJfQotCX0KLQkqYnVmKysgPSAnXG4nOwotCXJldHVybiBidWYgLSBidWZwdHI7Ci19Ci0KLWludCBhcmNoX2NwdV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCi17Ci0JY2hhciAqYnVmID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmIChidWYpIHsKLQkJYXJjaF9wcmludF9jcHVfbW9kYWxpYXMoTlVMTCwgTlVMTCwgYnVmKTsKLQkJYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9JXMiLCBidWYpOwotCQlrZnJlZShidWYpOwotCX0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYwppbmRleCA5ZjdjYTI2Li43NmY5OGZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgogI2luY2x1ZGUgPGFzbS9oeXBlcnYuaD4KQEAgLTI2LDEwICsyNyw1MCBAQAogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAKIHN0cnVjdCBtc19oeXBlcnZfaW5mbyBtc19oeXBlcnY7CiBFWFBPUlRfU1lNQk9MX0dQTChtc19oeXBlcnYpOwogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSFlQRVJWKQorc3RhdGljIHZvaWQgKCp2bWJ1c19oYW5kbGVyKSh2b2lkKTsKKwordm9pZCBoeXBlcnZfdmVjdG9yX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOworCisJaXJxX2VudGVyKCk7CisJZXhpdF9pZGxlKCk7CisKKwlpbmNfaXJxX3N0YXQoaXJxX2h2X2NhbGxiYWNrX2NvdW50KTsKKwlpZiAodm1idXNfaGFuZGxlcikKKwkJdm1idXNfaGFuZGxlcigpOworCisJaXJxX2V4aXQoKTsKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworfQorCit2b2lkIGh2X3NldHVwX3ZtYnVzX2lycSh2b2lkICgqaGFuZGxlcikodm9pZCkpCit7CisJdm1idXNfaGFuZGxlciA9IGhhbmRsZXI7CisJLyoKKwkgKiBTZXR1cCB0aGUgSURUIGZvciBoeXBlcnZpc29yIGNhbGxiYWNrLiBQcmV2ZW50IHJlYWxsb2NhdGlvbgorCSAqIGF0IG1vZHVsZSByZWxvYWQuCisJICovCisJaWYgKCF0ZXN0X2JpdChIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKSkKKwkJYWxsb2NfaW50cl9nYXRlKEhZUEVSVklTT1JfQ0FMTEJBQ0tfVkVDVE9SLAorCQkJCWh5cGVydl9jYWxsYmFja192ZWN0b3IpOworfQorCit2b2lkIGh2X3JlbW92ZV92bWJ1c19pcnEodm9pZCkKK3sKKwkvKiBXZSBoYXZlIG5vIHdheSB0byBkZWFsbG9jYXRlIHRoZSBpbnRlcnJ1cHQgZ2F0ZSAqLworCXZtYnVzX2hhbmRsZXIgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaHZfc2V0dXBfdm1idXNfaXJxKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGh2X3JlbW92ZV92bWJ1c19pcnEpOworI2VuZGlmCisKIHN0YXRpYyB1aW50MzJfdCAgX19pbml0IG1zX2h5cGVydl9wbGF0Zm9ybSh2b2lkKQogewogCXUzMiBlYXg7CkBAIC0xMDUsNiArMTQ2LDExIEBACiAKIAlpZiAobXNfaHlwZXJ2LmZlYXR1cmVzICYgSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVF9BVkFJTEFCTEUpCiAJCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZoeXBlcnZfY3MsIE5TRUNfUEVSX1NFQy8xMDApOworCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJbm9fdGltZXJfY2hlY2sgPSAxOworI2VuZGlmCisKIH0KIAogY29uc3QgX19yZWZjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX21zX2h5cGVydiA9IHsKQEAgLTExMyw0MSArMTU5LDMgQEAKIAkuaW5pdF9wbGF0Zm9ybQkJPSBtc19oeXBlcnZfaW5pdF9wbGF0Zm9ybSwKIH07CiBFWFBPUlRfU1lNQk9MKHg4Nl9oeXBlcl9tc19oeXBlcnYpOwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSFlQRVJWKQotc3RhdGljIGludCB2bWJ1c19pcnEgPSAtMTsKLXN0YXRpYyBpcnFfaGFuZGxlcl90IHZtYnVzX2lzcjsKLQotdm9pZCBodl9yZWdpc3Rlcl92bWJ1c19oYW5kbGVyKGludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlcikKLXsKLQkvKgotCSAqIFNldHVwIHRoZSBJRFQgZm9yIGh5cGVydmlzb3IgY2FsbGJhY2suCi0JICovCi0JYWxsb2NfaW50cl9nYXRlKEhZUEVSVklTT1JfQ0FMTEJBQ0tfVkVDVE9SLCBoeXBlcnZfY2FsbGJhY2tfdmVjdG9yKTsKLQotCXZtYnVzX2lycSA9IGlycTsKLQl2bWJ1c19pc3IgPSBoYW5kbGVyOwotfQotCi12b2lkIGh5cGVydl92ZWN0b3JfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwotCi0JaXJxX2VudGVyKCk7Ci0JZXhpdF9pZGxlKCk7Ci0KLQlkZXNjID0gaXJxX3RvX2Rlc2Modm1idXNfaXJxKTsKLQotCWlmIChkZXNjKQotCQlnZW5lcmljX2hhbmRsZV9pcnFfZGVzYyh2bWJ1c19pcnEsIGRlc2MpOwotCi0JaXJxX2V4aXQoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwotfQotI2Vsc2UKLXZvaWQgaHZfcmVnaXN0ZXJfdm1idXNfaGFuZGxlcihpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIpCi17Ci19Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0xfR1BMKGh2X3JlZ2lzdGVyX3ZtYnVzX2hhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwppbmRleCA3OWY5Zjg0Li5hZTQwN2Y3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwpAQCAtODkyLDcgKzg5Miw2IEBACiAJCSAqIGh3X3BlcmZfZ3JvdXBfc2NoZWRfaW4oKSBvciB4ODZfcG11X2VuYWJsZSgpCiAJCSAqCiAJCSAqIHN0ZXAxOiBzYXZlIGV2ZW50cyBtb3ZpbmcgdG8gbmV3IGNvdW50ZXJzCi0JCSAqIHN0ZXAyOiByZXByb2dyYW0gbW92ZWQgZXZlbnRzIGludG8gbmV3IGNvdW50ZXJzCiAJCSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgbl9ydW5uaW5nOyBpKyspIHsKIAkJCWV2ZW50ID0gY3B1Yy0+ZXZlbnRfbGlzdFtpXTsKQEAgLTkxOCw2ICs5MTcsOSBAQAogCQkJeDg2X3BtdV9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7CiAJCX0KIAorCQkvKgorCQkgKiBzdGVwMjogcmVwcm9ncmFtIG1vdmVkIGV2ZW50cyBpbnRvIG5ldyBjb3VudGVycworCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IGNwdWMtPm5fZXZlbnRzOyBpKyspIHsKIAkJCWV2ZW50ID0gY3B1Yy0+ZXZlbnRfbGlzdFtpXTsKIAkJCWh3YyA9ICZldmVudC0+aHc7CkBAIC0xMDQzLDcgKzEwNDUsNyBAQAogCS8qCiAJICogSWYgZ3JvdXAgZXZlbnRzIHNjaGVkdWxpbmcgdHJhbnNhY3Rpb24gd2FzIHN0YXJ0ZWQsCiAJICogc2tpcCB0aGUgc2NoZWR1bGFiaWxpdHkgdGVzdCBoZXJlLCBpdCB3aWxsIGJlIHBlcmZvcm1lZAotCSAqIGF0IGNvbW1pdCB0aW1lICgtPmNvbW1pdF90eG4pIGFzIGEgd2hvbGUKKwkgKiBhdCBjb21taXQgdGltZSAoLT5jb21taXRfdHhuKSBhcyBhIHdob2xlLgogCSAqLwogCWlmIChjcHVjLT5ncm91cF9mbGFnICYgUEVSRl9FVkVOVF9UWE4pCiAJCWdvdG8gZG9uZV9jb2xsZWN0OwpAQCAtMTA1OCw2ICsxMDYwLDEwIEBACiAJbWVtY3B5KGNwdWMtPmFzc2lnbiwgYXNzaWduLCBuKnNpemVvZihpbnQpKTsKIAogZG9uZV9jb2xsZWN0OgorCS8qCisJICogQ29tbWl0IHRoZSBjb2xsZWN0X2V2ZW50cygpIHN0YXRlLiBTZWUgeDg2X3BtdV9kZWwoKSBhbmQKKwkgKiB4ODZfcG11XypfdHhuKCkuCisJICovCiAJY3B1Yy0+bl9ldmVudHMgPSBuOwogCWNwdWMtPm5fYWRkZWQgKz0gbiAtIG4wOwogCWNwdWMtPm5fdHhuICs9IG4gLSBuMDsKQEAgLTExODMsMjggKzExODksMzggQEAKIAkgKiBJZiB3ZSdyZSBjYWxsZWQgZHVyaW5nIGEgdHhuLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgogCSAqIFRoZSBldmVudHMgbmV2ZXIgZ290IHNjaGVkdWxlZCBhbmQgLT5jYW5jZWxfdHhuIHdpbGwgdHJ1bmNhdGUKIAkgKiB0aGUgZXZlbnRfbGlzdC4KKwkgKgorCSAqIFhYWCBhc3N1bWVzIGFueSAtPmRlbCgpIGNhbGxlZCBkdXJpbmcgYSBUWE4gd2lsbCBvbmx5IGJlIG9uCisJICogYW4gZXZlbnQgYWRkZWQgZHVyaW5nIHRoYXQgc2FtZSBUWE4uCiAJICovCiAJaWYgKGNwdWMtPmdyb3VwX2ZsYWcgJiBQRVJGX0VWRU5UX1RYTikKIAkJcmV0dXJuOwogCisJLyoKKwkgKiBOb3QgYSBUWE4sIHRoZXJlZm9yZSBjbGVhbnVwIHByb3Blcmx5LgorCSAqLwogCXg4Nl9wbXVfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOwogCiAJZm9yIChpID0gMDsgaSA8IGNwdWMtPm5fZXZlbnRzOyBpKyspIHsKLQkJaWYgKGV2ZW50ID09IGNwdWMtPmV2ZW50X2xpc3RbaV0pIHsKLQotCQkJaWYgKGkgPj0gY3B1Yy0+bl9ldmVudHMgLSBjcHVjLT5uX2FkZGVkKQotCQkJCS0tY3B1Yy0+bl9hZGRlZDsKLQotCQkJaWYgKHg4Nl9wbXUucHV0X2V2ZW50X2NvbnN0cmFpbnRzKQotCQkJCXg4Nl9wbXUucHV0X2V2ZW50X2NvbnN0cmFpbnRzKGNwdWMsIGV2ZW50KTsKLQotCQkJd2hpbGUgKCsraSA8IGNwdWMtPm5fZXZlbnRzKQotCQkJCWNwdWMtPmV2ZW50X2xpc3RbaS0xXSA9IGNwdWMtPmV2ZW50X2xpc3RbaV07Ci0KLQkJCS0tY3B1Yy0+bl9ldmVudHM7CisJCWlmIChldmVudCA9PSBjcHVjLT5ldmVudF9saXN0W2ldKQogCQkJYnJlYWs7Ci0JCX0KIAl9CisKKwlpZiAoV0FSTl9PTl9PTkNFKGkgPT0gY3B1Yy0+bl9ldmVudHMpKSAvKiBjYWxsZWQgLT5kZWwoKSB3aXRob3V0IC0+YWRkKCkgPyAqLworCQlyZXR1cm47CisKKwkvKiBJZiB3ZSBoYXZlIGEgbmV3bHkgYWRkZWQgZXZlbnQ7IG1ha2Ugc3VyZSB0byBkZWNyZWFzZSBuX2FkZGVkLiAqLworCWlmIChpID49IGNwdWMtPm5fZXZlbnRzIC0gY3B1Yy0+bl9hZGRlZCkKKwkJLS1jcHVjLT5uX2FkZGVkOworCisJaWYgKHg4Nl9wbXUucHV0X2V2ZW50X2NvbnN0cmFpbnRzKQorCQl4ODZfcG11LnB1dF9ldmVudF9jb25zdHJhaW50cyhjcHVjLCBldmVudCk7CisKKwkvKiBEZWxldGUgdGhlIGFycmF5IGVudHJ5LiAqLworCXdoaWxlICgrK2kgPCBjcHVjLT5uX2V2ZW50cykKKwkJY3B1Yy0+ZXZlbnRfbGlzdFtpLTFdID0gY3B1Yy0+ZXZlbnRfbGlzdFtpXTsKKwktLWNwdWMtPm5fZXZlbnRzOworCiAJcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOwogfQogCkBAIC0xNTk4LDcgKzE2MTQsOCBAQAogewogCV9fdGhpc19jcHVfYW5kKGNwdV9od19ldmVudHMuZ3JvdXBfZmxhZywgflBFUkZfRVZFTlRfVFhOKTsKIAkvKgotCSAqIFRydW5jYXRlIHRoZSBjb2xsZWN0ZWQgZXZlbnRzLgorCSAqIFRydW5jYXRlIGNvbGxlY3RlZCBhcnJheSBieSB0aGUgbnVtYmVyIG9mIGV2ZW50cyBhZGRlZCBpbiB0aGlzCisJICogdHJhbnNhY3Rpb24uIFNlZSB4ODZfcG11X2FkZCgpIGFuZCB4ODZfcG11XypfdHhuKCkuCiAJICovCiAJX190aGlzX2NwdV9zdWIoY3B1X2h3X2V2ZW50cy5uX2FkZGVkLCBfX3RoaXNfY3B1X3JlYWQoY3B1X2h3X2V2ZW50cy5uX3R4bikpOwogCV9fdGhpc19jcHVfc3ViKGNwdV9od19ldmVudHMubl9ldmVudHMsIF9fdGhpc19jcHVfcmVhZChjcHVfaHdfZXZlbnRzLm5fdHhuKSk7CkBAIC0xNjA5LDYgKzE2MjYsOCBAQAogICogQ29tbWl0IGdyb3VwIGV2ZW50cyBzY2hlZHVsaW5nIHRyYW5zYWN0aW9uCiAgKiBQZXJmb3JtIHRoZSBncm91cCBzY2hlZHVsYWJpbGl0eSB0ZXN0IGFzIGEgd2hvbGUKICAqIFJldHVybiAwIGlmIHN1Y2Nlc3MKKyAqCisgKiBEb2VzIG5vdCBjYW5jZWwgdGhlIHRyYW5zYWN0aW9uIG9uIGZhaWx1cmU7IGV4cGVjdHMgdGhlIGNhbGxlciB0byBkbyB0aGlzLgogICovCiBzdGF0aWMgaW50IHg4Nl9wbXVfY29tbWl0X3R4bihzdHJ1Y3QgcG11ICpwbXUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCmluZGV4IDQ5NzJjMjQuLjNiMmY5YmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCkBAIC0xMzAsOSArMTMwLDExIEBACiAJdW5zaWduZWQgbG9uZwkJcnVubmluZ1tCSVRTX1RPX0xPTkdTKFg4Nl9QTUNfSURYX01BWCldOwogCWludAkJCWVuYWJsZWQ7CiAKLQlpbnQJCQluX2V2ZW50czsKLQlpbnQJCQluX2FkZGVkOwotCWludAkJCW5fdHhuOworCWludAkJCW5fZXZlbnRzOyAvKiB0aGUgIyBvZiBldmVudHMgaW4gdGhlIGJlbG93IGFycmF5cyAqLworCWludAkJCW5fYWRkZWQ7ICAvKiB0aGUgIyBsYXN0IGV2ZW50cyBpbiB0aGUgYmVsb3cgYXJyYXlzOworCQkJCQkgICAgIHRoZXkndmUgbmV2ZXIgYmVlbiBlbmFibGVkIHlldCAqLworCWludAkJCW5fdHhuOyAgICAvKiB0aGUgIyBsYXN0IGV2ZW50cyBpbiB0aGUgYmVsb3cgYXJyYXlzOworCQkJCQkgICAgIGFkZGVkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCiAJaW50CQkJYXNzaWduW1g4Nl9QTUNfSURYX01BWF07IC8qIGV2ZW50IHRvIGNvdW50ZXIgYXNzaWdubWVudCAqLwogCXU2NAkJCXRhZ3NbWDg2X1BNQ19JRFhfTUFYXTsKIAlzdHJ1Y3QgcGVyZl9ldmVudAkqZXZlbnRfbGlzdFtYODZfUE1DX0lEWF9NQVhdOyAvKiBpbiBlbmFibGVkIG9yZGVyICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfdW5jb3JlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfdW5jb3JlLmMKaW5kZXggMDQ3ZjU0MC4uYmQyMjUzZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX3VuY29yZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmUuYwpAQCAtNjYsNiArNjYsNDcgQEAKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIobWFzazAsIG1hc2swLCAiY29uZmlnMjowLTMxIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKG1hc2sxLCBtYXNrMSwgImNvbmZpZzI6MzItNjMiKTsKIAorc3RhdGljIHZvaWQgdW5jb3JlX3BtdV9zdGFydF9ocnRpbWVyKHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gpOworc3RhdGljIHZvaWQgdW5jb3JlX3BtdV9jYW5jZWxfaHJ0aW1lcihzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94KTsKK3N0YXRpYyB2b2lkIHVuY29yZV9wZXJmX2V2ZW50X3VwZGF0ZShzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworc3RhdGljIHZvaWQgdW5jb3JlX3BtdV9ldmVudF9yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3BtdSAqdW5jb3JlX2V2ZW50X3RvX3BtdShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihldmVudC0+cG11LCBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3BtdSwgcG11KTsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICoKK3VuY29yZV9wbXVfdG9fYm94KHN0cnVjdCBpbnRlbF91bmNvcmVfcG11ICpwbXUsIGludCBjcHUpCit7CisJc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveDsKKworCWJveCA9ICpwZXJfY3B1X3B0cihwbXUtPmJveCwgY3B1KTsKKwlpZiAoYm94KQorCQlyZXR1cm4gYm94OworCisJcmF3X3NwaW5fbG9jaygmdW5jb3JlX2JveF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJveCwgJnBtdS0+Ym94X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGJveC0+cGh5c19pZCA9PSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGNwdSkpIHsKKwkJCWF0b21pY19pbmMoJmJveC0+cmVmY250KTsKKwkJCSpwZXJfY3B1X3B0cihwbXUtPmJveCwgY3B1KSA9IGJveDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJhd19zcGluX3VubG9jaygmdW5jb3JlX2JveF9sb2NrKTsKKworCXJldHVybiAqcGVyX2NwdV9wdHIocG11LT5ib3gsIGNwdSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqdW5jb3JlX2V2ZW50X3RvX2JveChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJLyoKKwkgKiBwZXJmIGNvcmUgc2NoZWR1bGVzIGV2ZW50IG9uIHRoZSBiYXNpcyBvZiBjcHUsIHVuY29yZSBldmVudHMgYXJlCisJICogY29sbGVjdGVkIGJ5IG9uZSBvZiB0aGUgY3B1cyBpbnNpZGUgYSBwaHlzaWNhbCBwYWNrYWdlLgorCSAqLworCXJldHVybiB1bmNvcmVfcG11X3RvX2JveCh1bmNvcmVfZXZlbnRfdG9fcG11KGV2ZW50KSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKwogc3RhdGljIHU2NCB1bmNvcmVfbXNyX3JlYWRfY291bnRlcihzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJdTY0IGNvdW50OwpAQCAtMTYzOSw2ICsxNjgwLDM0OSBAQAogCSZzbmJfdW5jb3JlX2Nib3gsCiAJTlVMTCwKIH07CisKK2VudW0geworCVNOQl9QQ0lfVU5DT1JFX0lNQywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdW5jb3JlX2V2ZW50X2Rlc2Mgc25iX3VuY29yZV9pbWNfZXZlbnRzW10gPSB7CisJSU5URUxfVU5DT1JFX0VWRU5UX0RFU0MoZGF0YV9yZWFkcywgICJldmVudD0weDAxIiksCisJSU5URUxfVU5DT1JFX0VWRU5UX0RFU0MoZGF0YV9yZWFkcy5zY2FsZSwgIjYuMTAzNTE1NjI1ZS01IiksCisJSU5URUxfVU5DT1JFX0VWRU5UX0RFU0MoZGF0YV9yZWFkcy51bml0LCAiTWlCIiksCisKKwlJTlRFTF9VTkNPUkVfRVZFTlRfREVTQyhkYXRhX3dyaXRlcywgImV2ZW50PTB4MDIiKSwKKwlJTlRFTF9VTkNPUkVfRVZFTlRfREVTQyhkYXRhX3dyaXRlcy5zY2FsZSwgIjYuMTAzNTE1NjI1ZS01IiksCisJSU5URUxfVU5DT1JFX0VWRU5UX0RFU0MoZGF0YV93cml0ZXMudW5pdCwgIk1pQiIpLAorCisJeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfSwKK307CisKKyNkZWZpbmUgU05CX1VOQ09SRV9QQ0lfSU1DX0VWRU5UX01BU0sJCTB4ZmYKKyNkZWZpbmUgU05CX1VOQ09SRV9QQ0lfSU1DX0JBUl9PRkZTRVQJCTB4NDgKKworLyogcGFnZSBzaXplIG11bHRpcGxlIGNvdmVyaW5nIGFsbCBjb25maWcgcmVncyAqLworI2RlZmluZSBTTkJfVU5DT1JFX1BDSV9JTUNfTUFQX1NJWkUJCTB4NjAwMAorCisjZGVmaW5lIFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1JFQURTCQkweDEKKyNkZWZpbmUgU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfUkVBRFNfQkFTRQkweDUwNTAKKyNkZWZpbmUgU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfV1JJVEVTCQkweDIKKyNkZWZpbmUgU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfV1JJVEVTX0JBU0UJMHg1MDU0CisjZGVmaW5lIFNOQl9VTkNPUkVfUENJX0lNQ19DVFJfQkFTRQkJU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfUkVBRFNfQkFTRQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc25iX3VuY29yZV9pbWNfZm9ybWF0c19hdHRyW10gPSB7CisJJmZvcm1hdF9hdHRyX2V2ZW50LmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNuYl91bmNvcmVfaW1jX2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IHNuYl91bmNvcmVfaW1jX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyB2b2lkIHNuYl91bmNvcmVfaW1jX2luaXRfYm94KHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBib3gtPnBjaV9kZXY7CisJaW50IHdoZXJlID0gU05CX1VOQ09SRV9QQ0lfSU1DX0JBUl9PRkZTRVQ7CisJcmVzb3VyY2Vfc2l6ZV90IGFkZHI7CisJdTMyIHBjaV9kd29yZDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSwgJnBjaV9kd29yZCk7CisJYWRkciA9IHBjaV9kd29yZDsKKworI2lmZGVmIENPTkZJR19QSFlTX0FERFJfVF82NEJJVAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSArIDQsICZwY2lfZHdvcmQpOworCWFkZHIgfD0gKChyZXNvdXJjZV9zaXplX3QpcGNpX2R3b3JkIDw8IDMyKTsKKyNlbmRpZgorCisJYWRkciAmPSB+KFBBR0VfU0laRSAtIDEpOworCisJYm94LT5pb19hZGRyID0gaW9yZW1hcChhZGRyLCBTTkJfVU5DT1JFX1BDSV9JTUNfTUFQX1NJWkUpOworCWJveC0+aHJ0aW1lcl9kdXJhdGlvbiA9IFVOQ09SRV9TTkJfSU1DX0hSVElNRVJfSU5URVJWQUw7Cit9CisKK3N0YXRpYyB2b2lkIHNuYl91bmNvcmVfaW1jX2VuYWJsZV9ib3goc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCkKK3t9CisKK3N0YXRpYyB2b2lkIHNuYl91bmNvcmVfaW1jX2Rpc2FibGVfYm94KHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gpCit7fQorCitzdGF0aWMgdm9pZCBzbmJfdW5jb3JlX2ltY19lbmFibGVfZXZlbnQoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQore30KKworc3RhdGljIHZvaWQgc25iX3VuY29yZV9pbWNfZGlzYWJsZV9ldmVudChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7fQorCitzdGF0aWMgdTY0IHNuYl91bmNvcmVfaW1jX3JlYWRfY291bnRlcihzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwlyZXR1cm4gKHU2NCkqKHVuc2lnbmVkIGludCAqKShib3gtPmlvX2FkZHIgKyBod2MtPmV2ZW50X2Jhc2UpOworfQorCisvKgorICogY3VzdG9tIGV2ZW50X2luaXQoKSBmdW5jdGlvbiBiZWNhdXNlIHdlIGRlZmluZSBvdXIgb3duIGZpeGVkLCBmcmVlCisgKiBydW5uaW5nIGNvdW50ZXJzLCBzbyB3ZSBkbyBub3Qgd2FudCB0byBjb25mbGljdCB3aXRoIGdlbmVyaWMgdW5jb3JlCisgKiBsb2dpYy4gQWxzbyBzaW1wbGlmaWVzIHByb2Nlc3NpbmcKKyAqLworc3RhdGljIGludCBzbmJfdW5jb3JlX2ltY19ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlX3BtdSAqcG11OworCXN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3g7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisJdTY0IGNmZyA9IGV2ZW50LT5hdHRyLmNvbmZpZyAmIFNOQl9VTkNPUkVfUENJX0lNQ19FVkVOVF9NQVNLOworCWludCBpZHgsIGJhc2U7CisKKwlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBldmVudC0+cG11LT50eXBlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXBtdSA9IHVuY29yZV9ldmVudF90b19wbXUoZXZlbnQpOworCS8qIG5vIGRldmljZSBmb3VuZCBmb3IgdGhpcyBwbXUgKi8KKwlpZiAocG11LT5mdW5jX2lkIDwgMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwkvKiBTYW1wbGluZyBub3Qgc3VwcG9ydGVkIHlldCAqLworCWlmIChod2MtPnNhbXBsZV9wZXJpb2QpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdW5zdXBwb3J0ZWQgbW9kZXMgYW5kIGZpbHRlcnMgKi8KKwlpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV91c2VyICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9odiAgICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0ICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ndWVzdCAgfHwKKwkgICAgZXZlbnQtPmF0dHIuc2FtcGxlX3BlcmlvZCkgLyogbm8gc2FtcGxpbmcgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFBsYWNlIGFsbCB1bmNvcmUgZXZlbnRzIGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgcGFja2FnZQorCSAqIG9udG8gYSBzaW5nbGUgY3B1CisJICovCisJaWYgKGV2ZW50LT5jcHUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNoZWNrIG9ubHkgc3VwcG9ydGVkIGJpdHMgYXJlIHNldCAqLworCWlmIChldmVudC0+YXR0ci5jb25maWcgJiB+U05CX1VOQ09SRV9QQ0lfSU1DX0VWRU5UX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJYm94ID0gdW5jb3JlX3BtdV90b19ib3gocG11LCBldmVudC0+Y3B1KTsKKwlpZiAoIWJveCB8fCBib3gtPmNwdSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZXZlbnQtPmNwdSA9IGJveC0+Y3B1OworCisJZXZlbnQtPmh3LmlkeCA9IC0xOworCWV2ZW50LT5ody5sYXN0X3RhZyA9IH4wVUxMOworCWV2ZW50LT5ody5leHRyYV9yZWcuaWR4ID0gRVhUUkFfUkVHX05PTkU7CisJZXZlbnQtPmh3LmJyYW5jaF9yZWcuaWR4ID0gRVhUUkFfUkVHX05PTkU7CisJLyoKKwkgKiBjaGVjayBldmVudCBpcyBrbm93biAod2hpdGVsaXN0LCBkZXRlcm1pbmVzIGNvdW50ZXIpCisJICovCisJc3dpdGNoIChjZmcpIHsKKwljYXNlIFNOQl9VTkNPUkVfUENJX0lNQ19EQVRBX1JFQURTOgorCQliYXNlID0gU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfUkVBRFNfQkFTRTsKKwkJaWR4ID0gVU5DT1JFX1BNQ19JRFhfRklYRUQ7CisJCWJyZWFrOworCWNhc2UgU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfV1JJVEVTOgorCQliYXNlID0gU05CX1VOQ09SRV9QQ0lfSU1DX0RBVEFfV1JJVEVTX0JBU0U7CisJCWlkeCA9IFVOQ09SRV9QTUNfSURYX0ZJWEVEICsgMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogbXVzdCBiZSBkb25lIGJlZm9yZSB2YWxpZGF0ZV9ncm91cCAqLworCWV2ZW50LT5ody5ldmVudF9iYXNlID0gYmFzZTsKKwlldmVudC0+aHcuY29uZmlnID0gY2ZnOworCWV2ZW50LT5ody5pZHggPSBpZHg7CisKKwkvKiBubyBncm91cCB2YWxpZGF0aW9uIG5lZWRlZCwgd2UgaGF2ZSBmcmVlIHJ1bm5pbmcgY291bnRlcnMgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuYl91bmNvcmVfaW1jX2h3X2NvbmZpZyhzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuYl91bmNvcmVfaW1jX2V2ZW50X3N0YXJ0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3ggPSB1bmNvcmVfZXZlbnRfdG9fYm94KGV2ZW50KTsKKwl1NjQgY291bnQ7CisKKwlpZiAoV0FSTl9PTl9PTkNFKCEoZXZlbnQtPmh3LnN0YXRlICYgUEVSRl9IRVNfU1RPUFBFRCkpKQorCQlyZXR1cm47CisKKwlldmVudC0+aHcuc3RhdGUgPSAwOworCWJveC0+bl9hY3RpdmUrKzsKKworCWxpc3RfYWRkX3RhaWwoJmV2ZW50LT5hY3RpdmVfZW50cnksICZib3gtPmFjdGl2ZV9saXN0KTsKKworCWNvdW50ID0gc25iX3VuY29yZV9pbWNfcmVhZF9jb3VudGVyKGJveCwgZXZlbnQpOworCWxvY2FsNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgY291bnQpOworCisJaWYgKGJveC0+bl9hY3RpdmUgPT0gMSkKKwkJdW5jb3JlX3BtdV9zdGFydF9ocnRpbWVyKGJveCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuYl91bmNvcmVfaW1jX2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCA9IHVuY29yZV9ldmVudF90b19ib3goZXZlbnQpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCisJaWYgKCEoaHdjLT5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpKSB7CisJCWJveC0+bl9hY3RpdmUtLTsKKworCQlXQVJOX09OX09OQ0UoaHdjLT5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpOworCQlod2MtPnN0YXRlIHw9IFBFUkZfSEVTX1NUT1BQRUQ7CisKKwkJbGlzdF9kZWwoJmV2ZW50LT5hY3RpdmVfZW50cnkpOworCisJCWlmIChib3gtPm5fYWN0aXZlID09IDApCisJCQl1bmNvcmVfcG11X2NhbmNlbF9ocnRpbWVyKGJveCk7CisJfQorCisJaWYgKChmbGFncyAmIFBFUkZfRUZfVVBEQVRFKSAmJiAhKGh3Yy0+c3RhdGUgJiBQRVJGX0hFU19VUFRPREFURSkpIHsKKwkJLyoKKwkJICogRHJhaW4gdGhlIHJlbWFpbmluZyBkZWx0YSBjb3VudCBvdXQgb2YgYSBldmVudAorCQkgKiB0aGF0IHdlIGFyZSBkaXNhYmxpbmc6CisJCSAqLworCQl1bmNvcmVfcGVyZl9ldmVudF91cGRhdGUoYm94LCBldmVudCk7CisJCWh3Yy0+c3RhdGUgfD0gUEVSRl9IRVNfVVBUT0RBVEU7CisJfQorfQorCitzdGF0aWMgaW50IHNuYl91bmNvcmVfaW1jX2V2ZW50X2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94ID0gdW5jb3JlX2V2ZW50X3RvX2JveChldmVudCk7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwlpZiAoIWJveCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlod2MtPnN0YXRlID0gUEVSRl9IRVNfVVBUT0RBVEUgfCBQRVJGX0hFU19TVE9QUEVEOworCWlmICghKGZsYWdzICYgUEVSRl9FRl9TVEFSVCkpCisJCWh3Yy0+c3RhdGUgfD0gUEVSRl9IRVNfQVJDSDsKKworCXNuYl91bmNvcmVfaW1jX2V2ZW50X3N0YXJ0KGV2ZW50LCAwKTsKKworCWJveC0+bl9ldmVudHMrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmJfdW5jb3JlX2ltY19ldmVudF9kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCA9IHVuY29yZV9ldmVudF90b19ib3goZXZlbnQpOworCWludCBpOworCisJc25iX3VuY29yZV9pbWNfZXZlbnRfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOworCisJZm9yIChpID0gMDsgaSA8IGJveC0+bl9ldmVudHM7IGkrKykgeworCQlpZiAoZXZlbnQgPT0gYm94LT5ldmVudF9saXN0W2ldKSB7CisJCQktLWJveC0+bl9ldmVudHM7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzbmJfcGNpMnBoeV9tYXBfaW5pdChpbnQgZGV2aWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJaW50IGJ1czsKKworCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIGRldmlkLCBkZXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT1RUWTsKKworCWJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CisKKwlwY2lidXNfdG9fcGh5c2lkW2J1c10gPSAwOworCisJcGNpX2Rldl9wdXQoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBtdSBzbmJfdW5jb3JlX2ltY19wbXUgPSB7CisJLnRhc2tfY3R4X25yCT0gcGVyZl9pbnZhbGlkX2NvbnRleHQsCisJLmV2ZW50X2luaXQJPSBzbmJfdW5jb3JlX2ltY19ldmVudF9pbml0LAorCS5hZGQJCT0gc25iX3VuY29yZV9pbWNfZXZlbnRfYWRkLAorCS5kZWwJCT0gc25iX3VuY29yZV9pbWNfZXZlbnRfZGVsLAorCS5zdGFydAkJPSBzbmJfdW5jb3JlX2ltY19ldmVudF9zdGFydCwKKwkuc3RvcAkJPSBzbmJfdW5jb3JlX2ltY19ldmVudF9zdG9wLAorCS5yZWFkCQk9IHVuY29yZV9wbXVfZXZlbnRfcmVhZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX29wcyBzbmJfdW5jb3JlX2ltY19vcHMgPSB7CisJLmluaXRfYm94CT0gc25iX3VuY29yZV9pbWNfaW5pdF9ib3gsCisJLmVuYWJsZV9ib3gJPSBzbmJfdW5jb3JlX2ltY19lbmFibGVfYm94LAorCS5kaXNhYmxlX2JveAk9IHNuYl91bmNvcmVfaW1jX2Rpc2FibGVfYm94LAorCS5kaXNhYmxlX2V2ZW50CT0gc25iX3VuY29yZV9pbWNfZGlzYWJsZV9ldmVudCwKKwkuZW5hYmxlX2V2ZW50CT0gc25iX3VuY29yZV9pbWNfZW5hYmxlX2V2ZW50LAorCS5od19jb25maWcJPSBzbmJfdW5jb3JlX2ltY19od19jb25maWcsCisJLnJlYWRfY291bnRlcgk9IHNuYl91bmNvcmVfaW1jX3JlYWRfY291bnRlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc25iX3VuY29yZV9pbWMgPSB7CisJLm5hbWUJCT0gImltYyIsCisJLm51bV9jb3VudGVycyAgID0gMiwKKwkubnVtX2JveGVzCT0gMSwKKwkuZml4ZWRfY3RyX2JpdHMJPSAzMiwKKwkuZml4ZWRfY3RyCT0gU05CX1VOQ09SRV9QQ0lfSU1DX0NUUl9CQVNFLAorCS5ldmVudF9kZXNjcwk9IHNuYl91bmNvcmVfaW1jX2V2ZW50cywKKwkuZm9ybWF0X2dyb3VwCT0gJnNuYl91bmNvcmVfaW1jX2Zvcm1hdF9ncm91cCwKKwkucGVyZl9jdHIJPSBTTkJfVU5DT1JFX1BDSV9JTUNfREFUQV9SRUFEU19CQVNFLAorCS5ldmVudF9tYXNrCT0gU05CX1VOQ09SRV9QQ0lfSU1DX0VWRU5UX01BU0ssCisJLm9wcwkJPSAmc25iX3VuY29yZV9pbWNfb3BzLAorCS5wbXUJCT0gJnNuYl91bmNvcmVfaW1jX3BtdSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgKnNuYl9wY2lfdW5jb3Jlc1tdID0geworCVtTTkJfUENJX1VOQ09SRV9JTUNdCT0gJnNuYl91bmNvcmVfaW1jLAorCU5VTEwsCit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoc25iX3VuY29yZV9wY2lfaWRzKSA9IHsKKwl7IC8qIElNQyAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfU05CX0lNQyksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0RBVEEoU05CX1BDSV9VTkNPUkVfSU1DLCAwKSwKKwl9LAorCXsgLyogZW5kOiBhbGwgemVyb2VzICovIH0sCit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaXZiX3VuY29yZV9wY2lfaWRzKSA9IHsKKwl7IC8qIElNQyAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSVZCX0lNQyksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0RBVEEoU05CX1BDSV9VTkNPUkVfSU1DLCAwKSwKKwl9LAorCXsgLyogZW5kOiBhbGwgemVyb2VzICovIH0sCit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaHN3X3VuY29yZV9wY2lfaWRzKSA9IHsKKwl7IC8qIElNQyAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSFNXX0lNQyksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0RBVEEoU05CX1BDSV9VTkNPUkVfSU1DLCAwKSwKKwl9LAorCXsgLyogZW5kOiBhbGwgemVyb2VzICovIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc25iX3VuY29yZV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJzbmJfdW5jb3JlIiwKKwkuaWRfdGFibGUJPSBzbmJfdW5jb3JlX3BjaV9pZHMsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXZiX3VuY29yZV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJpdmJfdW5jb3JlIiwKKwkuaWRfdGFibGUJPSBpdmJfdW5jb3JlX3BjaV9pZHMsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaHN3X3VuY29yZV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJoc3dfdW5jb3JlIiwKKwkuaWRfdGFibGUJPSBoc3dfdW5jb3JlX3BjaV9pZHMsCit9OworCiAvKiBlbmQgb2YgU2FuZHkgQnJpZGdlIHVuY29yZSBzdXBwb3J0ICovCiAKIC8qIE5laGFsZW0gdW5jb3JlIHN1cHBvcnQgKi8KQEAgLTI3ODksNiArMzE3Myw3IEBACiBzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgdW5jb3JlX3BtdV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICpocnRpbWVyKQogewogCXN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3g7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGJpdDsKIApAQCAtMjgwMSwxOSArMzE4NiwyNyBAQAogCSAqLwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAorCS8qCisJICogaGFuZGxlIGJveGVzIHdpdGggYW4gYWN0aXZlIGV2ZW50IGxpc3QgYXMgb3Bwb3NlZCB0byBhY3RpdmUKKwkgKiBjb3VudGVycworCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZib3gtPmFjdGl2ZV9saXN0LCBhY3RpdmVfZW50cnkpIHsKKwkJdW5jb3JlX3BlcmZfZXZlbnRfdXBkYXRlKGJveCwgZXZlbnQpOworCX0KKwogCWZvcl9lYWNoX3NldF9iaXQoYml0LCBib3gtPmFjdGl2ZV9tYXNrLCBVTkNPUkVfUE1DX0lEWF9NQVgpCiAJCXVuY29yZV9wZXJmX2V2ZW50X3VwZGF0ZShib3gsIGJveC0+ZXZlbnRzW2JpdF0pOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JaHJ0aW1lcl9mb3J3YXJkX25vdyhocnRpbWVyLCBuc190b19rdGltZShVTkNPUkVfUE1VX0hSVElNRVJfSU5URVJWQUwpKTsKKwlocnRpbWVyX2ZvcndhcmRfbm93KGhydGltZXIsIG5zX3RvX2t0aW1lKGJveC0+aHJ0aW1lcl9kdXJhdGlvbikpOwogCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CiB9CiAKIHN0YXRpYyB2b2lkIHVuY29yZV9wbXVfc3RhcnRfaHJ0aW1lcihzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94KQogewogCV9faHJ0aW1lcl9zdGFydF9yYW5nZV9ucygmYm94LT5ocnRpbWVyLAotCQkJbnNfdG9fa3RpbWUoVU5DT1JFX1BNVV9IUlRJTUVSX0lOVEVSVkFMKSwgMCwKKwkJCW5zX3RvX2t0aW1lKGJveC0+aHJ0aW1lcl9kdXJhdGlvbiksIDAsCiAJCQlIUlRJTUVSX01PREVfUkVMX1BJTk5FRCwgMCk7CiB9CiAKQEAgLTI4NDcsNDUgKzMyNDAsMTQgQEAKIAlib3gtPmNwdSA9IC0xOwogCWJveC0+cGh5c19pZCA9IC0xOwogCisJLyogc2V0IGRlZmF1bHQgaHJ0aW1lciB0aW1lb3V0ICovCisJYm94LT5ocnRpbWVyX2R1cmF0aW9uID0gVU5DT1JFX1BNVV9IUlRJTUVSX0lOVEVSVkFMOworCisJSU5JVF9MSVNUX0hFQUQoJmJveC0+YWN0aXZlX2xpc3QpOworCiAJcmV0dXJuIGJveDsKIH0KIAotc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICoKLXVuY29yZV9wbXVfdG9fYm94KHN0cnVjdCBpbnRlbF91bmNvcmVfcG11ICpwbXUsIGludCBjcHUpCi17Ci0Jc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveDsKLQotCWJveCA9ICpwZXJfY3B1X3B0cihwbXUtPmJveCwgY3B1KTsKLQlpZiAoYm94KQotCQlyZXR1cm4gYm94OwotCi0JcmF3X3NwaW5fbG9jaygmdW5jb3JlX2JveF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJveCwgJnBtdS0+Ym94X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJveC0+cGh5c19pZCA9PSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGNwdSkpIHsKLQkJCWF0b21pY19pbmMoJmJveC0+cmVmY250KTsKLQkJCSpwZXJfY3B1X3B0cihwbXUtPmJveCwgY3B1KSA9IGJveDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJhd19zcGluX3VubG9jaygmdW5jb3JlX2JveF9sb2NrKTsKLQotCXJldHVybiAqcGVyX2NwdV9wdHIocG11LT5ib3gsIGNwdSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3BtdSAqdW5jb3JlX2V2ZW50X3RvX3BtdShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihldmVudC0+cG11LCBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3BtdSwgcG11KTsKLX0KLQotc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICp1bmNvcmVfZXZlbnRfdG9fYm94KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKLXsKLQkvKgotCSAqIHBlcmYgY29yZSBzY2hlZHVsZXMgZXZlbnQgb24gdGhlIGJhc2lzIG9mIGNwdSwgdW5jb3JlIGV2ZW50cyBhcmUKLQkgKiBjb2xsZWN0ZWQgYnkgb25lIG9mIHRoZSBjcHVzIGluc2lkZSBhIHBoeXNpY2FsIHBhY2thZ2UuCi0JICovCi0JcmV0dXJuIHVuY29yZV9wbXVfdG9fYm94KHVuY29yZV9ldmVudF90b19wbXUoZXZlbnQpLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotfQotCiBzdGF0aWMgaW50CiB1bmNvcmVfY29sbGVjdF9ldmVudHMoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmxlYWRlciwgYm9vbCBkb2dycCkKIHsKQEAgLTMyNzksMTYgKzM2NDEsMjEgQEAKIHsKIAlpbnQgcmV0OwogCi0JcG11LT5wbXUgPSAoc3RydWN0IHBtdSkgewotCQkuYXR0cl9ncm91cHMJPSBwbXUtPnR5cGUtPmF0dHJfZ3JvdXBzLAotCQkudGFza19jdHhfbnIJPSBwZXJmX2ludmFsaWRfY29udGV4dCwKLQkJLmV2ZW50X2luaXQJPSB1bmNvcmVfcG11X2V2ZW50X2luaXQsCi0JCS5hZGQJCT0gdW5jb3JlX3BtdV9ldmVudF9hZGQsCi0JCS5kZWwJCT0gdW5jb3JlX3BtdV9ldmVudF9kZWwsCi0JCS5zdGFydAkJPSB1bmNvcmVfcG11X2V2ZW50X3N0YXJ0LAotCQkuc3RvcAkJPSB1bmNvcmVfcG11X2V2ZW50X3N0b3AsCi0JCS5yZWFkCQk9IHVuY29yZV9wbXVfZXZlbnRfcmVhZCwKLQl9OworCWlmICghcG11LT50eXBlLT5wbXUpIHsKKwkJcG11LT5wbXUgPSAoc3RydWN0IHBtdSkgeworCQkJLmF0dHJfZ3JvdXBzCT0gcG11LT50eXBlLT5hdHRyX2dyb3VwcywKKwkJCS50YXNrX2N0eF9ucgk9IHBlcmZfaW52YWxpZF9jb250ZXh0LAorCQkJLmV2ZW50X2luaXQJPSB1bmNvcmVfcG11X2V2ZW50X2luaXQsCisJCQkuYWRkCQk9IHVuY29yZV9wbXVfZXZlbnRfYWRkLAorCQkJLmRlbAkJPSB1bmNvcmVfcG11X2V2ZW50X2RlbCwKKwkJCS5zdGFydAkJPSB1bmNvcmVfcG11X2V2ZW50X3N0YXJ0LAorCQkJLnN0b3AJCT0gdW5jb3JlX3BtdV9ldmVudF9zdG9wLAorCQkJLnJlYWQJCT0gdW5jb3JlX3BtdV9ldmVudF9yZWFkLAorCQl9OworCX0gZWxzZSB7CisJCXBtdS0+cG11ID0gKnBtdS0+dHlwZS0+cG11OworCQlwbXUtPnBtdS5hdHRyX2dyb3VwcyA9IHBtdS0+dHlwZS0+YXR0cl9ncm91cHM7CisJfQogCiAJaWYgKHBtdS0+dHlwZS0+bnVtX2JveGVzID09IDEpIHsKIAkJaWYgKHN0cmxlbihwbXUtPnR5cGUtPm5hbWUpID4gMCkKQEAgLTM1MDIsNiArMzg2OSwyOCBAQAogCQlwY2lfdW5jb3JlcyA9IGl2dF9wY2lfdW5jb3JlczsKIAkJdW5jb3JlX3BjaV9kcml2ZXIgPSAmaXZ0X3VuY29yZV9wY2lfZHJpdmVyOwogCQlicmVhazsKKwljYXNlIDQyOiAvKiBTYW5keSBCcmlkZ2UgKi8KKwkJcmV0ID0gc25iX3BjaTJwaHlfbWFwX2luaXQoUENJX0RFVklDRV9JRF9JTlRFTF9TTkJfSU1DKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXBjaV91bmNvcmVzID0gc25iX3BjaV91bmNvcmVzOworCQl1bmNvcmVfcGNpX2RyaXZlciA9ICZzbmJfdW5jb3JlX3BjaV9kcml2ZXI7CisJCWJyZWFrOworCWNhc2UgNTg6IC8qIEl2eSBCcmlkZ2UgKi8KKwkJcmV0ID0gc25iX3BjaTJwaHlfbWFwX2luaXQoUENJX0RFVklDRV9JRF9JTlRFTF9JVkJfSU1DKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXBjaV91bmNvcmVzID0gc25iX3BjaV91bmNvcmVzOworCQl1bmNvcmVfcGNpX2RyaXZlciA9ICZpdmJfdW5jb3JlX3BjaV9kcml2ZXI7CisJCWJyZWFrOworCWNhc2UgNjA6IC8qIEhhc3dlbGwgKi8KKwljYXNlIDY5OiAvKiBIYXN3ZWxsIENlbGVyb24gKi8KKwkJcmV0ID0gc25iX3BjaTJwaHlfbWFwX2luaXQoUENJX0RFVklDRV9JRF9JTlRFTF9IU1dfSU1DKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXBjaV91bmNvcmVzID0gc25iX3BjaV91bmNvcmVzOworCQl1bmNvcmVfcGNpX2RyaXZlciA9ICZoc3dfdW5jb3JlX3BjaV9kcml2ZXI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwogCX0KQEAgLTM3NzMsNyArNDE2Miw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHVuY29yZV9jcHVfaW5pdCh2b2lkKQogewotCWludCByZXQsIGNwdSwgbWF4X2NvcmVzOworCWludCByZXQsIG1heF9jb3JlczsKIAogCW1heF9jb3JlcyA9IGJvb3RfY3B1X2RhdGEueDg2X21heF9jb3JlczsKIAlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsKSB7CkBAIC0zODE3LDI5ICs0MjA2LDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JZ2V0X29ubGluZV9jcHVzKCk7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlpbnQgaSwgcGh5c19pZCA9IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoY3B1KTsKLQotCQlmb3JfZWFjaF9jcHUoaSwgJnVuY29yZV9jcHVfbWFzaykgewotCQkJaWYgKHBoeXNfaWQgPT0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChpKSkgewotCQkJCXBoeXNfaWQgPSAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocGh5c19pZCA8IDApCi0JCQljb250aW51ZTsKLQotCQl1bmNvcmVfY3B1X3ByZXBhcmUoY3B1LCBwaHlzX2lkKTsKLQkJdW5jb3JlX2V2ZW50X2luaXRfY3B1KGNwdSk7Ci0JfQotCW9uX2VhY2hfY3B1KHVuY29yZV9jcHVfc2V0dXAsIE5VTEwsIDEpOwotCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZ1bmNvcmVfY3B1X25iKTsKLQotCXB1dF9vbmxpbmVfY3B1cygpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4NjgsNiArNDIzNCw0MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgdW5jb3JlX2NwdW1hc2tfaW5pdCh2b2lkKQoreworCWludCBjcHU7CisKKwkvKgorCSAqIG9ueSBpbnZva2Ugb25jZSBmcm9tIG1zciBvciBwY2kgaW5pdCBjb2RlCisJICovCisJaWYgKCFjcHVtYXNrX2VtcHR5KCZ1bmNvcmVfY3B1X21hc2spKQorCQlyZXR1cm47CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWludCBpLCBwaHlzX2lkID0gdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChjcHUpOworCisJCWZvcl9lYWNoX2NwdShpLCAmdW5jb3JlX2NwdV9tYXNrKSB7CisJCQlpZiAocGh5c19pZCA9PSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGkpKSB7CisJCQkJcGh5c19pZCA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChwaHlzX2lkIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCXVuY29yZV9jcHVfcHJlcGFyZShjcHUsIHBoeXNfaWQpOworCQl1bmNvcmVfZXZlbnRfaW5pdF9jcHUoY3B1KTsKKwl9CisJb25fZWFjaF9jcHUodW5jb3JlX2NwdV9zZXR1cCwgTlVMTCwgMSk7CisKKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnVuY29yZV9jcHVfbmIpOworCisJcHV0X29ubGluZV9jcHVzKCk7Cit9CisKKwogc3RhdGljIGludCBfX2luaXQgaW50ZWxfdW5jb3JlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtMzg4Niw2ICs0Mjg3LDcgQEAKIAkJdW5jb3JlX3BjaV9leGl0KCk7CiAJCWdvdG8gZmFpbDsKIAl9CisJdW5jb3JlX2NwdW1hc2tfaW5pdCgpOwogCiAJdW5jb3JlX3BtdXNfcmVnaXN0ZXIoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmUuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmUuaAppbmRleCBhODBhYjcxLi45MDIzNmYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfdW5jb3JlLmgKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX3VuY29yZS5oCkBAIC02LDYgKzYsNyBAQAogCiAjZGVmaW5lIFVOQ09SRV9QTVVfTkFNRV9MRU4JCTMyCiAjZGVmaW5lIFVOQ09SRV9QTVVfSFJUSU1FUl9JTlRFUlZBTAkoNjBMTCAqIE5TRUNfUEVSX1NFQykKKyNkZWZpbmUgVU5DT1JFX1NOQl9JTUNfSFJUSU1FUl9JTlRFUlZBTCAoNVVMTCAqIE5TRUNfUEVSX1NFQykKIAogI2RlZmluZSBVTkNPUkVfRklYRURfRVZFTlQJCTB4ZmYKICNkZWZpbmUgVU5DT1JFX1BNQ19JRFhfTUFYX0dFTkVSSUMJOApAQCAtNDQwLDYgKzQ0MSw3IEBACiAJc3RydWN0IGludGVsX3VuY29yZV9vcHMgKm9wczsKIAlzdHJ1Y3QgdW5jb3JlX2V2ZW50X2Rlc2MgKmV2ZW50X2Rlc2NzOwogCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJfZ3JvdXBzWzRdOworCXN0cnVjdCBwbXUgKnBtdTsgLyogZm9yIGN1c3RvbSBwbXUgb3BzICovCiB9OwogCiAjZGVmaW5lIHBtdV9ncm91cCBhdHRyX2dyb3Vwc1swXQpAQCAtNDg4LDggKzQ5MCwxMSBAQAogCXU2NCB0YWdzW1VOQ09SRV9QTUNfSURYX01BWF07CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CiAJc3RydWN0IGludGVsX3VuY29yZV9wbXUgKnBtdTsKKwl1NjQgaHJ0aW1lcl9kdXJhdGlvbjsgLyogaHJ0aW1lciB0aW1lb3V0IGZvciB0aGlzIGJveCAqLwogCXN0cnVjdCBocnRpbWVyIGhydGltZXI7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2xpc3Q7CisJdm9pZCAqaW9fYWRkcjsKIAlzdHJ1Y3QgaW50ZWxfdW5jb3JlX2V4dHJhX3JlZyBzaGFyZWRfcmVnc1swXTsKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKaW5kZXggMzQ4NmU2Ni4uNWQ0NjZiNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMKQEAgLTEyNTcsNyArMTI1NywyNCBAQAogCQkJcGFzcysrOwogCQkJZ290byBhZ2FpbjsKIAkJfQotCisJCS8qCisJCSAqIFBlcmYgZG9lcyB0ZXN0IHJ1bnMgdG8gc2VlIGlmIGEgd2hvbGUgZ3JvdXAgY2FuIGJlIGFzc2lnbmVkCisJCSAqIHRvZ2V0aGVyIHN1Y2Nlc2Z1bGx5LiAgVGhlcmUgY2FuIGJlIG11bHRpcGxlIHJvdW5kcyBvZiB0aGlzLgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBwNF9wbXVfc3dhcF9jb25maWdfdHMgdG91Y2hlcyB0aGUgaHdjLT5jb25maWcKKwkJICogYml0cywgc3VjaCB0aGF0IHRoZSBuZXh0IHJvdW5kIG9mIGdyb3VwIGFzc2lnbm1lbnRzIHdpbGwKKwkJICogY2F1c2UgdGhlIGFib3ZlIHA0X3Nob3VsZF9zd2FwX3RzIHRvIHBhc3MgaW5zdGVhZCBvZiBmYWlsLgorCQkgKiBUaGlzIGxlYWRzIHRvIGNvdW50ZXJzIGV4Y2x1c2l2ZSB0byB0aHJlYWQwIGJlaW5nIHVzZWQgYnkKKwkJICogdGhyZWFkMS4KKwkJICoKKwkJICogU29sdmUgdGhpcyB3aXRoIGEgY2hlYXAgaGFjaywgcmVzZXQgdGhlIGlkeCBiYWNrIHRvIC0xIHRvCisJCSAqIGZvcmNlIGEgbmV3IGxvb2t1cCAocDRfbmV4dF9jbnRyKSB0byBnZXQgdGhlIHJpZ2h0IGNvdW50ZXIKKwkJICogZm9yIHRoZSByaWdodCB0aHJlYWQuCisJCSAqCisJCSAqIFRoaXMgcHJvYmFibHkgZG9lc24ndCBjb21wbHkgd2l0aCB0aGUgZ2VuZXJhbCBzcGlyaXQgb2YgaG93CisJCSAqIHBlcmYgd2FudHMgdG8gd29yaywgYnV0IFA0IGlzIHNwZWNpYWwuIDotKAorCQkgKi8KKwkJaWYgKHA0X3Nob3VsZF9zd2FwX3RzKGh3Yy0+Y29uZmlnLCBjcHUpKQorCQkJaHdjLT5pZHggPSAtMTsKIAkJcDRfcG11X3N3YXBfY29uZmlnX3RzKGh3YywgY3B1KTsKIAkJaWYgKGFzc2lnbikKIAkJCWFzc2lnbltpXSA9IGNudHJfaWR4OwpAQCAtMTMyMiw2ICsxMzM5LDcgQEAKIF9faW5pdCBpbnQgcDRfcG11X2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCWludCBpLCByZWc7CiAKIAkvKiBJZiB3ZSBnZXQgc3RyaXBwZWQgLS0gaW5kZXhpbmcgZmFpbHMgKi8KIAlCVUlMRF9CVUdfT04oQVJDSF9QNF9NQVhfQ0NDUiA+IElOVEVMX1BNQ19NQVhfR0VORVJJQyk7CkBAIC0xMzQwLDUgKzEzNTgsMTkgQEAKIAogCXg4Nl9wbXUgPSBwNF9wbXU7CiAKKwkvKgorCSAqIEV2ZW4gdGhvdWdoIHRoZSBjb3VudGVycyBhcmUgY29uZmlndXJlZCB0byBpbnRlcnJ1cHQgYSBwYXJ0aWN1bGFyCisJICogbG9naWNhbCBwcm9jZXNzb3Igd2hlbiBhbiBvdmVyZmxvdyBoYXBwZW5zLCB0ZXN0aW5nIGhhcyBzaG93biB0aGF0CisJICogb24ga2R1bXAga2VybmVscyAod2hpY2ggdXNlcyBhIHNpbmdsZSBjcHUpLCB0aHJlYWQxJ3MgY291bnRlcgorCSAqIGNvbnRpbnVlcyB0byBydW4gYW5kIHdpbGwgcmVwb3J0IGFuIE5NSSBvbiB0aHJlYWQwLiAgRHVlIHRvIHRoZQorCSAqIG92ZXJmbG93IGJ1ZywgdGhpcyBsZWFkcyB0byBhIHN0cmVhbSBvZiB1bmtub3duIE5NSXMuCisJICoKKwkgKiBTb2x2ZSB0aGlzIGJ5IHplcm8naW5nIG91dCB0aGUgcmVnaXN0ZXJzIHRvIG1pbWljIGEgcmVzZXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IHg4Nl9wbXUubnVtX2NvdW50ZXJzOyBpKyspIHsKKwkJcmVnID0geDg2X3BtdV9jb25maWdfYWRkcihpKTsKKwkJd3Jtc3JsX3NhZmUocmVnLCAwVUxMKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC94ODYva2VybmVsL2NyYXNoLmMKaW5kZXggYTU3OTAyZS4uNTA3ZGU4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NyYXNoLmMKQEAgLTU3LDkgKzU3LDcgQEAKIHsKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJc3RydWN0IHB0X3JlZ3MgZml4ZWRfcmVnczsKLSNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgogCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpKSB7CiAJCWNyYXNoX2ZpeHVwX3NzX2VzcCgmZml4ZWRfcmVncywgcmVncyk7CiAJCXJlZ3MgPSAmZml4ZWRfcmVnczsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwppbmRleCBmMmExNzcwLi41YWJkNGNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCkBAIC0xNiwxMiArMTYsMzUgQEAKIAogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKK3N0YXRpYyB2b2lkICppc19pcnFfc3RhY2sodm9pZCAqcCwgdm9pZCAqaXJxKQoreworCWlmIChwIDwgaXJxIHx8IHAgPj0gKGlycSArIFRIUkVBRF9TSVpFKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGlycSArIFRIUkVBRF9TSVpFOworfQorCisKK3N0YXRpYyB2b2lkICppc19oYXJkaXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBpbnQgY3B1KQoreworCXZvaWQgKmlycSA9IHBlcl9jcHUoaGFyZGlycV9zdGFjaywgY3B1KTsKKworCXJldHVybiBpc19pcnFfc3RhY2soc3RhY2ssIGlycSk7Cit9CisKK3N0YXRpYyB2b2lkICppc19zb2Z0aXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBpbnQgY3B1KQoreworCXZvaWQgKmlycSA9IHBlcl9jcHUoc29mdGlycV9zdGFjaywgY3B1KTsKKworCXJldHVybiBpc19pcnFfc3RhY2soc3RhY2ssIGlycSk7Cit9CiAKIHZvaWQgZHVtcF90cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKIAkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCiB7CisJY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOwogCWludCBncmFwaCA9IDA7CisJdTMyICpwcmV2X2VzcDsKIAogCWlmICghdGFzaykKIAkJdGFzayA9IGN1cnJlbnQ7CkBAIC0zMCw3ICs1Myw3IEBACiAJCXVuc2lnbmVkIGxvbmcgZHVtbXk7CiAKIAkJc3RhY2sgPSAmZHVtbXk7Ci0JCWlmICh0YXNrICYmIHRhc2sgIT0gY3VycmVudCkKKwkJaWYgKHRhc2sgIT0gY3VycmVudCkKIAkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7CiAJfQogCkBAIC0zOSwxOCArNjIsMzEgQEAKIAogCWZvciAoOzspIHsKIAkJc3RydWN0IHRocmVhZF9pbmZvICpjb250ZXh0OworCQl2b2lkICplbmRfc3RhY2s7CiAKLQkJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKLQkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKLQkJYnAgPSBvcHMtPndhbGtfc3RhY2soY29udGV4dCwgc3RhY2ssIGJwLCBvcHMsIGRhdGEsIE5VTEwsICZncmFwaCk7CisJCWVuZF9zdGFjayA9IGlzX2hhcmRpcnFfc3RhY2soc3RhY2ssIGNwdSk7CisJCWlmICghZW5kX3N0YWNrKQorCQkJZW5kX3N0YWNrID0gaXNfc29mdGlycV9zdGFjayhzdGFjaywgY3B1KTsKIAotCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopY29udGV4dC0+cHJldmlvdXNfZXNwOworCQljb250ZXh0ID0gdGFza190aHJlYWRfaW5mbyh0YXNrKTsKKwkJYnAgPSBvcHMtPndhbGtfc3RhY2soY29udGV4dCwgc3RhY2ssIGJwLCBvcHMsIGRhdGEsCisJCQkJICAgICBlbmRfc3RhY2ssICZncmFwaCk7CisKKwkJLyogU3RvcCBpZiBub3Qgb24gaXJxIHN0YWNrICovCisJCWlmICghZW5kX3N0YWNrKQorCQkJYnJlYWs7CisKKwkJLyogVGhlIHByZXZpb3VzIGVzcCBpcyBzYXZlZCBvbiB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLworCQlwcmV2X2VzcCA9ICh1MzIgKikoZW5kX3N0YWNrIC0gVEhSRUFEX1NJWkUpOworCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopKnByZXZfZXNwOwogCQlpZiAoIXN0YWNrKQogCQkJYnJlYWs7CisKIAkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKIAkJCWJyZWFrOwogCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAl9CisJcHV0X2NwdSgpOwogfQogRVhQT1JUX1NZTUJPTChkdW1wX3RyYWNlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IGFkZGIyMDcuLjFhYmNiNTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTEwNCw2ICsxMDQsNDQgQEAKIAlyZXR1cm4gKHN0YWNrID49IGlycV9zdGFjayAmJiBzdGFjayA8IGlycV9zdGFja19lbmQpOwogfQogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBpcnFfc3RhY2tfc2l6ZSA9CisJKElSUV9TVEFDS19TSVpFIC0gNjQpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCitlbnVtIHN0YWNrX3R5cGUgeworCVNUQUNLX0lTX1VOS05PV04sCisJU1RBQ0tfSVNfTk9STUFMLAorCVNUQUNLX0lTX0VYQ0VQVElPTiwKKwlTVEFDS19JU19JUlEsCit9OworCitzdGF0aWMgZW51bSBzdGFja190eXBlCithbmFseXplX3N0YWNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3RhY2ssCisJICAgICAgdW5zaWduZWQgbG9uZyAqKnN0YWNrX2VuZCwgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLAorCSAgICAgIHVuc2lnbmVkICp1c2VkLCBjaGFyICoqaWQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJYWRkciA9ICgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRhc2spID09IGFkZHIpCisJCXJldHVybiBTVEFDS19JU19OT1JNQUw7CisKKwkqc3RhY2tfZW5kID0gaW5fZXhjZXB0aW9uX3N0YWNrKGNwdSwgKHVuc2lnbmVkIGxvbmcpc3RhY2ssCisJCQkJCXVzZWQsIGlkKTsKKwlpZiAoKnN0YWNrX2VuZCkKKwkJcmV0dXJuIFNUQUNLX0lTX0VYQ0VQVElPTjsKKworCWlmICghaXJxX3N0YWNrKQorCQlyZXR1cm4gU1RBQ0tfSVNfTk9STUFMOworCisJKnN0YWNrX2VuZCA9IGlycV9zdGFjazsKKwlpcnFfc3RhY2sgPSBpcnFfc3RhY2sgLSBpcnFfc3RhY2tfc2l6ZTsKKworCWlmIChpbl9pcnFfc3RhY2soc3RhY2ssIGlycV9zdGFjaywgKnN0YWNrX2VuZCkpCisJCXJldHVybiBTVEFDS19JU19JUlE7CisKKwlyZXR1cm4gU1RBQ0tfSVNfVU5LTk9XTjsKK30KKwogLyoKICAqIHg4Ni02NCBjYW4gaGF2ZSB1cCB0byB0aHJlZSBrZXJuZWwgc3RhY2tzOgogICogcHJvY2VzcyBzdGFjawpAQCAtMTE2LDEyICsxNTQsMTIgQEAKIAkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCiB7CiAJY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOwotCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFja19lbmQgPQotCQkodW5zaWduZWQgbG9uZyAqKXBlcl9jcHUoaXJxX3N0YWNrX3B0ciwgY3B1KTsKLQl1bnNpZ25lZCB1c2VkID0gMDsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvOwotCWludCBncmFwaCA9IDA7CisJdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSk7CiAJdW5zaWduZWQgbG9uZyBkdW1teTsKKwl1bnNpZ25lZCB1c2VkID0gMDsKKwlpbnQgZ3JhcGggPSAwOworCWludCBkb25lID0gMDsKIAogCWlmICghdGFzaykKIAkJdGFzayA9IGN1cnJlbnQ7CkBAIC0xNDMsNDkgKzE4MSw2MSBAQAogCSAqIGV4Y2VwdGlvbnMKIAkgKi8KIAl0aW5mbyA9IHRhc2tfdGhyZWFkX2luZm8odGFzayk7Ci0JZm9yICg7OykgeworCXdoaWxlICghZG9uZSkgeworCQl1bnNpZ25lZCBsb25nICpzdGFja19lbmQ7CisJCWVudW0gc3RhY2tfdHlwZSBzdHlwZTsKIAkJY2hhciAqaWQ7Ci0JCXVuc2lnbmVkIGxvbmcgKmVzdGFja19lbmQ7Ci0JCWVzdGFja19lbmQgPSBpbl9leGNlcHRpb25fc3RhY2soY3B1LCAodW5zaWduZWQgbG9uZylzdGFjaywKLQkJCQkJCSZ1c2VkLCAmaWQpOwogCi0JCWlmIChlc3RhY2tfZW5kKSB7CisJCXN0eXBlID0gYW5hbHl6ZV9zdGFjayhjcHUsIHRhc2ssIHN0YWNrLCAmc3RhY2tfZW5kLAorCQkJCSAgICAgIGlycV9zdGFjaywgJnVzZWQsICZpZCk7CisKKwkJLyogRGVmYXVsdCBmaW5pc2ggdW5sZXNzIHNwZWNpZmllZCB0byBjb250aW51ZSAqLworCQlkb25lID0gMTsKKworCQlzd2l0Y2ggKHN0eXBlKSB7CisKKwkJLyogQnJlYWsgb3V0IGVhcmx5IGlmIHdlIGFyZSBvbiB0aGUgdGhyZWFkIHN0YWNrICovCisJCWNhc2UgU1RBQ0tfSVNfTk9STUFMOgorCQkJYnJlYWs7CisKKwkJY2FzZSBTVEFDS19JU19FWENFUFRJT046CisKIAkJCWlmIChvcHMtPnN0YWNrKGRhdGEsIGlkKSA8IDApCiAJCQkJYnJlYWs7CiAKIAkJCWJwID0gb3BzLT53YWxrX3N0YWNrKHRpbmZvLCBzdGFjaywgYnAsIG9wcywKLQkJCQkJICAgICBkYXRhLCBlc3RhY2tfZW5kLCAmZ3JhcGgpOworCQkJCQkgICAgIGRhdGEsIHN0YWNrX2VuZCwgJmdyYXBoKTsKIAkJCW9wcy0+c3RhY2soZGF0YSwgIjxFT0U+Iik7CiAJCQkvKgogCQkJICogV2UgbGluayB0byB0aGUgbmV4dCBzdGFjayB2aWEgdGhlCiAJCQkgKiBzZWNvbmQtdG8tbGFzdCBwb2ludGVyIChpbmRleCAtMiB0byBlbmQpIGluIHRoZQogCQkJICogZXhjZXB0aW9uIHN0YWNrOgogCQkJICovCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIGVzdGFja19lbmRbLTJdOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGlycV9zdGFja19lbmQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFjazsKLQkJCWlycV9zdGFjayA9IGlycV9zdGFja19lbmQgLQotCQkJCShJUlFfU1RBQ0tfU0laRSAtIDY0KSAvIHNpemVvZigqaXJxX3N0YWNrKTsKKwkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgc3RhY2tfZW5kWy0yXTsKKwkJCWRvbmUgPSAwOworCQkJYnJlYWs7CiAKLQkJCWlmIChpbl9pcnFfc3RhY2soc3RhY2ssIGlycV9zdGFjaywgaXJxX3N0YWNrX2VuZCkpIHsKLQkJCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQotCQkJCQlicmVhazsKLQkJCQlicCA9IG9wcy0+d2Fsa19zdGFjayh0aW5mbywgc3RhY2ssIGJwLAotCQkJCQlvcHMsIGRhdGEsIGlycV9zdGFja19lbmQsICZncmFwaCk7Ci0JCQkJLyoKLQkJCQkgKiBXZSBsaW5rIHRvIHRoZSBuZXh0IHN0YWNrICh3aGljaCB3b3VsZCBiZQotCQkJCSAqIHRoZSBwcm9jZXNzIHN0YWNrIG5vcm1hbGx5KSB0aGUgbGFzdAotCQkJCSAqIHBvaW50ZXIgKGluZGV4IC0xIHRvIGVuZCkgaW4gdGhlIElSUSBzdGFjazoKLQkJCQkgKi8KLQkJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIChpcnFfc3RhY2tfZW5kWy0xXSk7Ci0JCQkJaXJxX3N0YWNrX2VuZCA9IE5VTEw7Ci0JCQkJb3BzLT5zdGFjayhkYXRhLCAiRU9JIik7Ci0JCQkJY29udGludWU7Ci0JCQl9CisJCWNhc2UgU1RBQ0tfSVNfSVJROgorCisJCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQorCQkJCWJyZWFrOworCQkJYnAgPSBvcHMtPndhbGtfc3RhY2sodGluZm8sIHN0YWNrLCBicCwKKwkJCQkgICAgIG9wcywgZGF0YSwgc3RhY2tfZW5kLCAmZ3JhcGgpOworCQkJLyoKKwkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgKHdoaWNoIHdvdWxkIGJlCisJCQkgKiB0aGUgcHJvY2VzcyBzdGFjayBub3JtYWxseSkgdGhlIGxhc3QKKwkJCSAqIHBvaW50ZXIgKGluZGV4IC0xIHRvIGVuZCkgaW4gdGhlIElSUSBzdGFjazoKKwkJCSAqLworCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoc3RhY2tfZW5kWy0xXSk7CisJCQlpcnFfc3RhY2sgPSBOVUxMOworCQkJb3BzLT5zdGFjayhkYXRhLCAiRU9JIik7CisJCQlkb25lID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBQ0tfSVNfVU5LTk9XTjoKKwkJCW9wcy0+c3RhY2soZGF0YSwgIlVOSyIpOworCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwppbmRleCBiYzRhMDg4Li42ZDdkNWExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC0yMDMsMTggKzIwMywxNSBAQAogCXJldmlzaW9uID0gcmVhZF9wY2lfY29uZmlnX2J5dGUobnVtLCBzbG90LCBmdW5jLCBQQ0lfUkVWSVNJT05fSUQpOwogCiAJLyoKLSAJICogUmV2aXNpb24gMTMgb2YgYWxsIHRyaWdnZXJpbmcgZGV2aWNlcyBpZCBpbiB0aGlzIHF1aXJrIGhhdmUKLQkgKiBhIHByb2JsZW0gZHJhaW5pbmcgaW50ZXJydXB0cyB3aGVuIGlycSByZW1hcHBpbmcgaXMgZW5hYmxlZCwKLQkgKiBhbmQgc2hvdWxkIGJlIGZsYWdnZWQgYXMgYnJva2VuLiAgQWRkaXRpb25hbGx5IHJldmlzaW9ucyAweDEyCi0JICogYW5kIDB4MjIgb2YgZGV2aWNlIGlkIDB4MzQwNSBoYXMgdGhpcyBwcm9ibGVtLgorCSAqIFJldmlzaW9uIDw9IDEzIG9mIGFsbCB0cmlnZ2VyaW5nIGRldmljZXMgaWQgaW4gdGhpcyBxdWlyaworCSAqIGhhdmUgYSBwcm9ibGVtIGRyYWluaW5nIGludGVycnVwdHMgd2hlbiBpcnEgcmVtYXBwaW5nIGlzCisJICogZW5hYmxlZCwgYW5kIHNob3VsZCBiZSBmbGFnZ2VkIGFzIGJyb2tlbi4gQWRkaXRpb25hbGx5CisJICogcmV2aXNpb24gMHgyMiBvZiBkZXZpY2UgaWQgMHgzNDA1IGhhcyB0aGlzIHByb2JsZW0uCiAJICovCi0JaWYgKHJldmlzaW9uID09IDB4MTMpCisJaWYgKHJldmlzaW9uIDw9IDB4MTMpCiAJCXNldF9pcnFfcmVtYXBwaW5nX2Jyb2tlbigpOwotCWVsc2UgaWYgKChkZXZpY2UgPT0gMHgzNDA1KSAmJgotCSAgICAoKHJldmlzaW9uID09IDB4MTIpIHx8Ci0JICAgICAocmV2aXNpb24gPT0gMHgyMikpKQorCWVsc2UgaWYgKGRldmljZSA9PSAweDM0MDUgJiYgcmV2aXNpb24gPT0gMHgyMikKIAkJc2V0X2lycV9yZW1hcHBpbmdfYnJva2VuKCk7Ci0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCmluZGV4IGRhODVhOGUuLjkzZWVkMTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwpAQCAtNTIxLDcgKzUyMSw3IEBACiB7CiAKIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGhwZXRfaW50ZXJydXB0X2hhbmRsZXIsCi0JCQlJUlFGX1RJTUVSIHwgSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJCQlJUlFGX1RJTUVSIHwgSVJRRl9OT0JBTEFOQ0lORywKIAkJCWRldi0+bmFtZSwgZGV2KSkKIAkJcmV0dXJuIC0xOwogCkBAIC02OTksNyArNjk5LDcgQEAKIAkJLyogRklYTUU6IGFkZCBzY2hlZHVsZV93b3JrX29uKCkgKi8KIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKGNwdSwgJndvcmsud29yaywgMCk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndvcmsuY29tcGxldGUpOwotCQlkZXN0cm95X3RpbWVyX29uX3N0YWNrKCZ3b3JrLndvcmsudGltZXIpOworCQlkZXN0cm95X2RlbGF5ZWRfd29ya19vbl9zdGFjaygmd29yay53b3JrKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfREVBRDoKIAkJaWYgKGhkZXYpIHsKQEAgLTc1Miw5ICs3NTIsNyBAQAogCS5tYXNrCQk9IEhQRVRfTUFTSywKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJLnJlc3VtZQkJPSBocGV0X3Jlc3VtZV9jb3VudGVyLAotI2lmZGVmIENPTkZJR19YODZfNjQKIAkuYXJjaGRhdGEJPSB7IC52Y2xvY2tfbW9kZSA9IFZDTE9DS19IUEVUIH0sCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgaHBldF9jbG9ja3NvdXJjZV9yZWdpc3Rlcih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycS5jIGIvYXJjaC94ODYva2VybmVsL2lycS5jCmluZGV4IGQ5OWYzMWQuLjQyODA1ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKQEAgLTEyNSw2ICsxMjUsMTIgQEAKIAkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBwZXJfY3B1KG1jZV9wb2xsX2NvdW50LCBqKSk7CiAJc2VxX3ByaW50ZihwLCAiICBNYWNoaW5lIGNoZWNrIHBvbGxzXG4iKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0hZUEVSVikgfHwgZGVmaW5lZChDT05GSUdfWEVOKQorCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIlRIUiIpOworCWZvcl9lYWNoX29ubGluZV9jcHUoaikKKwkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmlycV9odl9jYWxsYmFja19jb3VudCk7CisJc2VxX3ByaW50ZihwLCAiICBIeXBlcnZpc29yIGNhbGxiYWNrIGludGVycnVwdHNcbiIpOworI2VuZGlmCiAJc2VxX3ByaW50ZihwLCAiJSpzOiAlMTB1XG4iLCBwcmVjLCAiRVJSIiwgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKICNpZiBkZWZpbmVkKENPTkZJR19YODZfSU9fQVBJQykKIAlzZXFfcHJpbnRmKHAsICIlKnM6ICUxMHVcbiIsIHByZWMsICJNSVMiLCBhdG9taWNfcmVhZCgmaXJxX21pc19jb3VudCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2lycV8zMi5jCmluZGV4IGQ3ZmNiZWQuLjYzY2U4MzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzMyLmMKQEAgLTU1LDE2ICs1NSw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfc3RhY2tfb3ZlcmZsb3codm9pZCkgeyB9CiAjZW5kaWYKIAotLyoKLSAqIHBlci1DUFUgSVJRIGhhbmRsaW5nIGNvbnRleHRzICh0aHJlYWQgaW5mb3JtYXRpb24gYW5kIHN0YWNrKQotICovCi11bmlvbiBpcnFfY3R4IHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gICAgICB0aW5mbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBzdGFja1tUSFJFQURfU0laRS9zaXplb2YodTMyKV07Ci19IF9fYXR0cmlidXRlX18oKGFsaWduZWQoVEhSRUFEX1NJWkUpKSk7Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bmlvbiBpcnFfY3R4ICosIGhhcmRpcnFfY3R4KTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bmlvbiBpcnFfY3R4ICosIHNvZnRpcnFfY3R4KTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBpcnFfc3RhY2sgKiwgaGFyZGlycV9zdGFjayk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXJxX3N0YWNrICosIHNvZnRpcnFfc3RhY2spOwogCiBzdGF0aWMgdm9pZCBjYWxsX29uX3N0YWNrKHZvaWQgKmZ1bmMsIHZvaWQgKnN0YWNrKQogewpAQCAtNzcsMTQgKzY5LDI2IEBACiAJCSAgICAgOiAibWVtb3J5IiwgImNjIiwgImVkeCIsICJlY3giLCAiZWF4Iik7CiB9CiAKKy8qIGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlciBmcm9tIEMgKi8KKyNkZWZpbmUgY3VycmVudF9zdGFja19wb2ludGVyICh7CQlcCisJdW5zaWduZWQgbG9uZyBzcDsJCQlcCisJYXNtKCJtb3YgJSVlc3AsJTAiIDogIj1nIiAoc3ApKTsJXAorCXNwOwkJCQkJXAorfSkKKworc3RhdGljIGlubGluZSB2b2lkICpjdXJyZW50X3N0YWNrKHZvaWQpCit7CisJcmV0dXJuICh2b2lkICopKGN1cnJlbnRfc3RhY2tfcG9pbnRlciAmIH4oVEhSRUFEX1NJWkUgLSAxKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50CiBleGVjdXRlX29uX2lycV9zdGFjayhpbnQgb3ZlcmZsb3csIHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGlycSkKIHsKLQl1bmlvbiBpcnFfY3R4ICpjdXJjdHgsICppcnFjdHg7Ci0JdTMyICppc3AsIGFyZzEsIGFyZzI7CisJc3RydWN0IGlycV9zdGFjayAqY3Vyc3RrLCAqaXJxc3RrOworCXUzMiAqaXNwLCAqcHJldl9lc3AsIGFyZzEsIGFyZzI7CiAKLQljdXJjdHggPSAodW5pb24gaXJxX2N0eCAqKSBjdXJyZW50X3RocmVhZF9pbmZvKCk7Ci0JaXJxY3R4ID0gX190aGlzX2NwdV9yZWFkKGhhcmRpcnFfY3R4KTsKKwljdXJzdGsgPSAoc3RydWN0IGlycV9zdGFjayAqKSBjdXJyZW50X3N0YWNrKCk7CisJaXJxc3RrID0gX190aGlzX2NwdV9yZWFkKGhhcmRpcnFfc3RhY2spOwogCiAJLyoKIAkgKiB0aGlzIGlzIHdoZXJlIHdlIHN3aXRjaCB0byB0aGUgSVJRIHN0YWNrLiBIb3dldmVyLCBpZiB3ZSBhcmUKQEAgLTkyLDEzICs5NiwxNCBAQAogCSAqIGhhbmRsZXIpIHdlIGNhbid0IGRvIHRoYXQgYW5kIGp1c3QgaGF2ZSB0byBrZWVwIHVzaW5nIHRoZQogCSAqIGN1cnJlbnQgc3RhY2sgKHdoaWNoIGlzIHRoZSBpcnEgc3RhY2sgYWxyZWFkeSBhZnRlciBhbGwpCiAJICovCi0JaWYgKHVubGlrZWx5KGN1cmN0eCA9PSBpcnFjdHgpKQorCWlmICh1bmxpa2VseShjdXJzdGsgPT0gaXJxc3RrKSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIElSUSBzdGFjayAqLwotCWlzcCA9ICh1MzIgKikgKChjaGFyICopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKLQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRpbmZvLnRhc2s7Ci0JaXJxY3R4LT50aW5mby5wcmV2aW91c19lc3AgPSBjdXJyZW50X3N0YWNrX3BvaW50ZXI7CisJaXNwID0gKHUzMiAqKSAoKGNoYXIgKilpcnFzdGsgKyBzaXplb2YoKmlycXN0aykpOworCisJLyogU2F2ZSB0aGUgbmV4dCBlc3AgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgKi8KKwlwcmV2X2VzcCA9ICh1MzIgKilpcnFzdGs7CisJKnByZXZfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOwogCiAJaWYgKHVubGlrZWx5KG92ZXJmbG93KSkKIAkJY2FsbF9vbl9zdGFjayhwcmludF9zdGFja19vdmVyZmxvdywgaXNwKTsKQEAgLTExOCw0NiArMTIzLDQwIEBACiAgKi8KIHZvaWQgaXJxX2N0eF9pbml0KGludCBjcHUpCiB7Ci0JdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCXN0cnVjdCBpcnFfc3RhY2sgKmlycXN0azsKIAotCWlmIChwZXJfY3B1KGhhcmRpcnFfY3R4LCBjcHUpKQorCWlmIChwZXJfY3B1KGhhcmRpcnFfc3RhY2ssIGNwdSkpCiAJCXJldHVybjsKIAotCWlycWN0eCA9IHBhZ2VfYWRkcmVzcyhhbGxvY19wYWdlc19ub2RlKGNwdV90b19ub2RlKGNwdSksCisJaXJxc3RrID0gcGFnZV9hZGRyZXNzKGFsbG9jX3BhZ2VzX25vZGUoY3B1X3RvX25vZGUoY3B1KSwKIAkJCQkJICAgICAgIFRIUkVBRElORk9fR0ZQLAogCQkJCQkgICAgICAgVEhSRUFEX1NJWkVfT1JERVIpKTsKLQltZW1zZXQoJmlycWN0eC0+dGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKLQlpcnFjdHgtPnRpbmZvLmNwdQkJPSBjcHU7Ci0JaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0CT0gTUFLRV9NTV9TRUcoMCk7CisJcGVyX2NwdShoYXJkaXJxX3N0YWNrLCBjcHUpID0gaXJxc3RrOwogCi0JcGVyX2NwdShoYXJkaXJxX2N0eCwgY3B1KSA9IGlycWN0eDsKLQotCWlycWN0eCA9IHBhZ2VfYWRkcmVzcyhhbGxvY19wYWdlc19ub2RlKGNwdV90b19ub2RlKGNwdSksCisJaXJxc3RrID0gcGFnZV9hZGRyZXNzKGFsbG9jX3BhZ2VzX25vZGUoY3B1X3RvX25vZGUoY3B1KSwKIAkJCQkJICAgICAgIFRIUkVBRElORk9fR0ZQLAogCQkJCQkgICAgICAgVEhSRUFEX1NJWkVfT1JERVIpKTsKLQltZW1zZXQoJmlycWN0eC0+dGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKLQlpcnFjdHgtPnRpbmZvLmNwdQkJPSBjcHU7Ci0JaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0CT0gTUFLRV9NTV9TRUcoMCk7Ci0KLQlwZXJfY3B1KHNvZnRpcnFfY3R4LCBjcHUpID0gaXJxY3R4OworCXBlcl9jcHUoc29mdGlycV9zdGFjaywgY3B1KSA9IGlycXN0azsKIAogCXByaW50ayhLRVJOX0RFQlVHICJDUFUgJXUgaXJxc3RhY2tzLCBoYXJkPSVwIHNvZnQ9JXBcbiIsCi0JICAgICAgIGNwdSwgcGVyX2NwdShoYXJkaXJxX2N0eCwgY3B1KSwgIHBlcl9jcHUoc29mdGlycV9jdHgsIGNwdSkpOworCSAgICAgICBjcHUsIHBlcl9jcHUoaGFyZGlycV9zdGFjaywgY3B1KSwgIHBlcl9jcHUoc29mdGlycV9zdGFjaywgY3B1KSk7CiB9CiAKIHZvaWQgZG9fc29mdGlycV9vd25fc3RhY2sodm9pZCkKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cmN0eDsKLQl1bmlvbiBpcnFfY3R4ICppcnFjdHg7Ci0JdTMyICppc3A7CisJc3RydWN0IHRocmVhZF9pbmZvICpjdXJzdGs7CisJc3RydWN0IGlycV9zdGFjayAqaXJxc3RrOworCXUzMiAqaXNwLCAqcHJldl9lc3A7CiAKLQljdXJjdHggPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7Ci0JaXJxY3R4ID0gX190aGlzX2NwdV9yZWFkKHNvZnRpcnFfY3R4KTsKLQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRhc2s7Ci0JaXJxY3R4LT50aW5mby5wcmV2aW91c19lc3AgPSBjdXJyZW50X3N0YWNrX3BvaW50ZXI7CisJY3Vyc3RrID0gY3VycmVudF9zdGFjaygpOworCWlycXN0ayA9IF9fdGhpc19jcHVfcmVhZChzb2Z0aXJxX3N0YWNrKTsKIAogCS8qIGJ1aWxkIHRoZSBzdGFjayBmcmFtZSBvbiB0aGUgc29mdGlycSBzdGFjayAqLwotCWlzcCA9ICh1MzIgKikgKChjaGFyICopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKKwlpc3AgPSAodTMyICopICgoY2hhciAqKWlycXN0ayArIHNpemVvZigqaXJxc3RrKSk7CisKKwkvKiBQdXNoIHRoZSBwcmV2aW91cyBlc3Agb250byB0aGUgc3RhY2sgKi8KKwlwcmV2X2VzcCA9ICh1MzIgKilpcnFzdGs7CisJKnByZXZfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOwogCiAJY2FsbF9vbl9zdGFjayhfX2RvX3NvZnRpcnEsIGlzcCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMThiZTE4OS4uZTY5Zjk4OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtNDMsMTMgKzQ0LDUyIEBACiB9IHdoaWxlICgwKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUkFORE9NSVpFX0JBU0UKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9sb2FkX29mZnNldDsKK3N0YXRpYyBpbnQgcmFuZG9taXplX21vZHVsZXMgPSAxOworCisvKiBNdXRleCBwcm90ZWN0cyB0aGUgbW9kdWxlX2xvYWRfb2Zmc2V0LiAqLworc3RhdGljIERFRklORV9NVVRFWChtb2R1bGVfa2FzbHJfbXV0ZXgpOworCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9ub2thc2xyKGNoYXIgKnApCit7CisJcmFuZG9taXplX21vZHVsZXMgPSAwOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm5va2FzbHIiLCBwYXJzZV9ub2thc2xyKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IGdldF9tb2R1bGVfbG9hZF9vZmZzZXQodm9pZCkKK3sKKwlpZiAocmFuZG9taXplX21vZHVsZXMpIHsKKwkJbXV0ZXhfbG9jaygmbW9kdWxlX2thc2xyX211dGV4KTsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBtb2R1bGVfbG9hZF9vZmZzZXQgdGhlIGZpcnN0IHRpbWUgdGhpcworCQkgKiBjb2RlIGlzIGNhbGxlZC4gT25jZSBjYWxjdWxhdGVkIGl0IHN0YXlzIHRoZSBzYW1lIHVudGlsCisJCSAqIHJlYm9vdC4KKwkJICovCisJCWlmIChtb2R1bGVfbG9hZF9vZmZzZXQgPT0gMCkKKwkJCW1vZHVsZV9sb2FkX29mZnNldCA9CisJCQkJKGdldF9yYW5kb21faW50KCkgJSAxMDI0ICsgMSkgKiBQQUdFX1NJWkU7CisJCW11dGV4X3VubG9jaygmbW9kdWxlX2thc2xyX211dGV4KTsKKwl9CisJcmV0dXJuIG1vZHVsZV9sb2FkX29mZnNldDsKK30KKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgZ2V0X21vZHVsZV9sb2FkX29mZnNldCh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKIHZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaWYgKFBBR0VfQUxJR04oc2l6ZSkgPiBNT0RVTEVTX0xFTikKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIF9fdm1hbGxvY19ub2RlX3JhbmdlKHNpemUsIDEsIE1PRFVMRVNfVkFERFIsIE1PRFVMRVNfRU5ELAotCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLCBQQUdFX0tFUk5FTF9FWEVDLAotCQkJCU5VTUFfTk9fTk9ERSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwlyZXR1cm4gX192bWFsbG9jX25vZGVfcmFuZ2Uoc2l6ZSwgMSwKKwkJCQkgICAgTU9EVUxFU19WQUREUiArIGdldF9tb2R1bGVfbG9hZF9vZmZzZXQoKSwKKwkJCQkgICAgTU9EVUxFU19FTkQsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLAorCQkJCSAgICBQQUdFX0tFUk5FTF9FWEVDLCBOVU1BX05PX05PREUsCisJCQkJICAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMKaW5kZXggNmZjYjQ5Yy4uYjQ4NzJiOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL25taS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ubWkuYwpAQCAtODcsNiArODcsNyBAQAogI2RlZmluZSBubWlfdG9fZGVzYyh0eXBlKSAoJm5taV9kZXNjW3R5cGVdKQogCiBzdGF0aWMgdTY0IG5taV9sb25nZXN0X25zID0gMSAqIE5TRUNfUEVSX01TRUM7CisKIHN0YXRpYyBpbnQgX19pbml0IG5taV93YXJuaW5nX2RlYnVnZnModm9pZCkKIHsKIAlkZWJ1Z2ZzX2NyZWF0ZV91NjQoIm5taV9sb25nZXN0X25zIiwgMDY0NCwKQEAgLTk1LDYgKzk2LDIwIEBACiB9CiBmc19pbml0Y2FsbChubWlfd2FybmluZ19kZWJ1Z2ZzKTsKIAorc3RhdGljIHZvaWQgbm1pX21heF9oYW5kbGVyKHN0cnVjdCBpcnFfd29yayAqdykKK3sKKwlzdHJ1Y3Qgbm1pYWN0aW9uICphID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBubWlhY3Rpb24sIGlycV93b3JrKTsKKwlpbnQgcmVtYWluZGVyX25zLCBkZWNpbWFsX21zZWNzOworCXU2NCB3aG9sZV9tc2VjcyA9IEFDQ0VTU19PTkNFKGEtPm1heF9kdXJhdGlvbik7CisKKwlyZW1haW5kZXJfbnMgPSBkb19kaXYod2hvbGVfbXNlY3MsICgxMDAwICogMTAwMCkpOworCWRlY2ltYWxfbXNlY3MgPSByZW1haW5kZXJfbnMgLyAxMDAwOworCisJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fSU5GTworCQkiSU5GTzogTk1JIGhhbmRsZXIgKCVwcykgdG9vayB0b28gbG9uZyB0byBydW46ICVsbGQuJTAzZCBtc2Vjc1xuIiwKKwkJYS0+aGFuZGxlciwgd2hvbGVfbXNlY3MsIGRlY2ltYWxfbXNlY3MpOworfQorCiBzdGF0aWMgaW50IF9fa3Byb2JlcyBubWlfaGFuZGxlKHVuc2lnbmVkIGludCB0eXBlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgYm9vbCBiMmIpCiB7CiAJc3RydWN0IG5taV9kZXNjICpkZXNjID0gbm1pX3RvX2Rlc2ModHlwZSk7CkBAIC0xMTAsMjYgKzEyNSwyMCBAQAogCSAqIHRvIGhhbmRsZSB0aG9zZSBzaXR1YXRpb25zLgogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGEsICZkZXNjLT5oZWFkLCBsaXN0KSB7Ci0JCXU2NCBiZWZvcmUsIGRlbHRhLCB3aG9sZV9tc2VjczsKLQkJaW50IHJlbWFpbmRlcl9ucywgZGVjaW1hbF9tc2VjcywgdGhpc2hhbmRsZWQ7CisJCWludCB0aGlzaGFuZGxlZDsKKwkJdTY0IGRlbHRhOwogCi0JCWJlZm9yZSA9IHNjaGVkX2Nsb2NrKCk7CisJCWRlbHRhID0gc2NoZWRfY2xvY2soKTsKIAkJdGhpc2hhbmRsZWQgPSBhLT5oYW5kbGVyKHR5cGUsIHJlZ3MpOwogCQloYW5kbGVkICs9IHRoaXNoYW5kbGVkOwotCQlkZWx0YSA9IHNjaGVkX2Nsb2NrKCkgLSBiZWZvcmU7CisJCWRlbHRhID0gc2NoZWRfY2xvY2soKSAtIGRlbHRhOwogCQl0cmFjZV9ubWlfaGFuZGxlcihhLT5oYW5kbGVyLCAoaW50KWRlbHRhLCB0aGlzaGFuZGxlZCk7CiAKLQkJaWYgKGRlbHRhIDwgbm1pX2xvbmdlc3RfbnMpCisJCWlmIChkZWx0YSA8IG5taV9sb25nZXN0X25zIHx8IGRlbHRhIDwgYS0+bWF4X2R1cmF0aW9uKQogCQkJY29udGludWU7CiAKLQkJbm1pX2xvbmdlc3RfbnMgPSBkZWx0YTsKLQkJd2hvbGVfbXNlY3MgPSBkZWx0YTsKLQkJcmVtYWluZGVyX25zID0gZG9fZGl2KHdob2xlX21zZWNzLCAoMTAwMCAqIDEwMDApKTsKLQkJZGVjaW1hbF9tc2VjcyA9IHJlbWFpbmRlcl9ucyAvIDEwMDA7Ci0JCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KLQkJCSJJTkZPOiBOTUkgaGFuZGxlciAoJXBzKSB0b29rIHRvbyBsb25nIHRvIHJ1bjogIgotCQkJIiVsbGQuJTAzZCBtc2Vjc1xuIiwgYS0+aGFuZGxlciwgd2hvbGVfbXNlY3MsCi0JCQlkZWNpbWFsX21zZWNzKTsKKwkJYS0+bWF4X2R1cmF0aW9uID0gZGVsdGE7CisJCWlycV93b3JrX3F1ZXVlKCZhLT5pcnFfd29yayk7CiAJfQogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNDYsNiArMTU1LDggQEAKIAlpZiAoIWFjdGlvbi0+aGFuZGxlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpbml0X2lycV93b3JrKCZhY3Rpb24tPmlycV93b3JrLCBubWlfbWF4X2hhbmRsZXIpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCAzZmI4ZDk1Li40NTA1ZTJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI5OCwxMCArMjk4LDcgQEAKICAqLwogdm9pZCBhcmNoX2NwdV9pZGxlKHZvaWQpCiB7Ci0JaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpCi0JCXg4Nl9pZGxlKCk7Ci0JZWxzZQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJeDg2X2lkbGUoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IDBkZTQzZTkuLjdiYzg2YmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtMzE0LDYgKzMxNCwxMCBAQAogCSAqLwogCWFyY2hfZW5kX2NvbnRleHRfc3dpdGNoKG5leHRfcCk7CiAKKwl0aGlzX2NwdV93cml0ZShrZXJuZWxfc3RhY2ssCisJCSAgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKG5leHRfcCkgKworCQkgIFRIUkVBRF9TSVpFIC0gS0VSTkVMX1NUQUNLX09GRlNFVCk7CisKIAkvKgogCSAqIFJlc3RvcmUgJWdzIGlmIG5lZWRlZCAod2hpY2ggaXMgY29tbW9uKQogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDc0NjFmNTAuLjY3OGMwYWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTE4NCwxNCArMTg0LDE0IEBACiB7CiAJdW5zaWduZWQgbG9uZyBjb250ZXh0ID0gKHVuc2lnbmVkIGxvbmcpcmVncyAmIH4oVEhSRUFEX1NJWkUgLSAxKTsKIAl1bnNpZ25lZCBsb25nIHNwID0gKHVuc2lnbmVkIGxvbmcpJnJlZ3MtPnNwOwotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm87CisJdTMyICpwcmV2X2VzcDsKIAogCWlmIChjb250ZXh0ID09IChzcCAmIH4oVEhSRUFEX1NJWkUgLSAxKSkpCiAJCXJldHVybiBzcDsKIAotCXRpbmZvID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKWNvbnRleHQ7Ci0JaWYgKHRpbmZvLT5wcmV2aW91c19lc3ApCi0JCXJldHVybiB0aW5mby0+cHJldmlvdXNfZXNwOworCXByZXZfZXNwID0gKHUzMiAqKShjb250ZXh0KTsKKwlpZiAocHJldl9lc3ApCisJCXJldHVybiAodW5zaWduZWQgbG9uZylwcmV2X2VzcDsKIAogCXJldHVybiAodW5zaWduZWQgbG9uZylyZWdzOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCmluZGV4IGM3NTJjYjQuLjY1NGI0NjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKQEAgLTQ2NCw5ICs0NjQsMTIgQEAKICAqIDIpIElmIHN0aWxsIGFsaXZlLCB3cml0ZSB0byB0aGUga2V5Ym9hcmQgY29udHJvbGxlcgogICogMykgSWYgc3RpbGwgYWxpdmUsIHdyaXRlIHRvIHRoZSBBQ1BJIHJlYm9vdCByZWdpc3RlciBhZ2FpbgogICogNCkgSWYgc3RpbGwgYWxpdmUsIHdyaXRlIHRvIHRoZSBrZXlib2FyZCBjb250cm9sbGVyIGFnYWluCisgKiA1KSBJZiBzdGlsbCBhbGl2ZSwgY2FsbCB0aGUgRUZJIHJ1bnRpbWUgc2VydmljZSB0byByZWJvb3QKKyAqIDYpIElmIHN0aWxsIGFsaXZlLCB3cml0ZSB0byB0aGUgUENJIElPIHBvcnQgMHhDRjkgdG8gcmVib290CisgKiA3KSBJZiBzdGlsbCBhbGl2ZSwgaW5mb3JtIEJJT1MgdG8gZG8gYSBwcm9wZXIgcmVib290CiAgKgogICogSWYgdGhlIG1hY2hpbmUgaXMgc3RpbGwgYWxpdmUgYXQgdGhpcyBzdGFnZSwgaXQgZ2l2ZXMgdXAuIFdlIGRlZmF1bHQgdG8KLSAqIGZvbGxvd2luZyB0aGUgc2FtZSBwYXR0ZXJuLCBleGNlcHQgdGhhdCBpZiB3ZSdyZSBzdGlsbCBhbGl2ZSBhZnRlciAoNCkgd2UnbGwKKyAqIGZvbGxvd2luZyB0aGUgc2FtZSBwYXR0ZXJuLCBleGNlcHQgdGhhdCBpZiB3ZSdyZSBzdGlsbCBhbGl2ZSBhZnRlciAoNykgd2UnbGwKICAqIHRyeSB0byBmb3JjZSBhIHRyaXBsZSBmYXVsdCBhbmQgdGhlbiBjeWNsZSBiZXR3ZWVuIGhpdHRpbmcgdGhlIGtleWJvYXJkCiAgKiBjb250cm9sbGVyIGFuZCBkb2luZyB0aGF0CiAgKi8KQEAgLTUwMiw3ICs1MDUsNyBAQAogCQkJCWF0dGVtcHQgPSAxOwogCQkJCXJlYm9vdF90eXBlID0gQk9PVF9BQ1BJOwogCQkJfSBlbHNlIHsKLQkJCQlyZWJvb3RfdHlwZSA9IEJPT1RfVFJJUExFOworCQkJCXJlYm9vdF90eXBlID0gQk9PVF9FRkk7CiAJCQl9CiAJCQlicmVhazsKIApAQCAtNTEwLDEzICs1MTMsMTUgQEAKIAkJCWxvYWRfaWR0KCZub19pZHQpOwogCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImludDMiKTsKIAorCQkJLyogV2UncmUgcHJvYmFibHkgZGVhZCBhZnRlciB0aGlzLCBidXQuLi4gKi8KIAkJCXJlYm9vdF90eXBlID0gQk9PVF9LQkQ7CiAJCQlicmVhazsKIAogCQljYXNlIEJPT1RfQklPUzoKIAkJCW1hY2hpbmVfcmVhbF9yZXN0YXJ0KE1SUl9CSU9TKTsKIAotCQkJcmVib290X3R5cGUgPSBCT09UX0tCRDsKKwkJCS8qIFdlJ3JlIHByb2JhYmx5IGRlYWQgYWZ0ZXIgdGhpcywgYnV0Li4uICovCisJCQlyZWJvb3RfdHlwZSA9IEJPT1RfVFJJUExFOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBCT09UX0FDUEk6CkBAIC01MzAsNyArNTM1LDcgQEAKIAkJCQkJCSBFRklfUkVTRVRfV0FSTSA6CiAJCQkJCQkgRUZJX1JFU0VUX0NPTEQsCiAJCQkJCQkgRUZJX1NVQ0NFU1MsIDAsIE5VTEwpOwotCQkJcmVib290X3R5cGUgPSBCT09UX0tCRDsKKwkJCXJlYm9vdF90eXBlID0gQk9PVF9DRjlfQ09ORDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQk9PVF9DRjk6CkBAIC01NDgsNyArNTUzLDcgQEAKIAkJCQlvdXRiKGNmOXxyZWJvb3RfY29kZSwgMHhjZjkpOwogCQkJCXVkZWxheSg1MCk7CiAJCQl9Ci0JCQlyZWJvb3RfdHlwZSA9IEJPT1RfS0JEOworCQkJcmVib290X3R5cGUgPSBCT09UX0JJT1M7CiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94ODYva2VybmVsL3NldHVwLmMKaW5kZXggY2U3Mjk2NC4uMDljNzZkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwLmMKQEAgLTg2OSw3ICs4NjksNiBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCW1lbWNweSgmYm9vdF9jcHVfZGF0YSwgJm5ld19jcHVfZGF0YSwgc2l6ZW9mKG5ld19jcHVfZGF0YSkpOwotCXZpc3dzX2Vhcmx5X2RldGVjdCgpOwogCiAJLyoKIAkgKiBjb3B5IGtlcm5lbCBhZGRyZXNzIHJhbmdlIGVzdGFibGlzaGVkIHNvIGZhciBhbmQgc3dpdGNoCkBAIC05MjYsMTEgKzkyNSwxMSBAQAogI2lmZGVmIENPTkZJR19FRkkKIAlpZiAoIXN0cm5jbXAoKGNoYXIgKikmYm9vdF9wYXJhbXMuZWZpX2luZm8uZWZpX2xvYWRlcl9zaWduYXR1cmUsCiAJCSAgICAgIkVMMzIiLCA0KSkgewotCQlzZXRfYml0KEVGSV9CT09ULCAmeDg2X2VmaV9mYWNpbGl0eSk7CisJCXNldF9iaXQoRUZJX0JPT1QsICZlZmkuZmxhZ3MpOwogCX0gZWxzZSBpZiAoIXN0cm5jbXAoKGNoYXIgKikmYm9vdF9wYXJhbXMuZWZpX2luZm8uZWZpX2xvYWRlcl9zaWduYXR1cmUsCiAJCSAgICAgIkVMNjQiLCA0KSkgewotCQlzZXRfYml0KEVGSV9CT09ULCAmeDg2X2VmaV9mYWNpbGl0eSk7Ci0JCXNldF9iaXQoRUZJXzY0QklULCAmeDg2X2VmaV9mYWNpbGl0eSk7CisJCXNldF9iaXQoRUZJX0JPT1QsICZlZmkuZmxhZ3MpOworCQlzZXRfYml0KEVGSV82NEJJVCwgJmVmaS5mbGFncyk7CiAJfQogCiAJaWYgKGVmaV9lbmFibGVkKEVGSV9CT09UKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGEzMmRhODAuLjM0ODI2OTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMTIyLDggKzEyMiw5IEBACiAJICogU2luY2UgQ1BVMCBpcyBub3Qgd2FrZW5lZCB1cCBieSBJTklULCBpdCBkb2Vzbid0IHdhaXQgZm9yIHRoZSBJUEkuCiAJICovCiAJY3B1aWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaWYgKGFwaWMtPndhaXRfZm9yX2luaXRfZGVhc3NlcnQgJiYgY3B1aWQgIT0gMCkKLQkJYXBpYy0+d2FpdF9mb3JfaW5pdF9kZWFzc2VydCgmaW5pdF9kZWFzc2VydGVkKTsKKwlpZiAoYXBpYy0+d2FpdF9mb3JfaW5pdF9kZWFzc2VydCAmJiBjcHVpZCkKKwkJd2hpbGUgKCFhdG9taWNfcmVhZCgmaW5pdF9kZWFzc2VydGVkKSkKKwkJCWNwdV9yZWxheCgpOwogCiAJLyoKIAkgKiAoVGhpcyB3b3JrcyBldmVuIGlmIHRoZSBBUElDIGlzIG5vdCBlbmFibGVkLikKQEAgLTcwMSwxMSArNzAyLDE1IEBACiAJaW50IGlkOwogCWludCBib290X2Vycm9yOwogCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKIAkvKgogCSAqIFdha2UgdXAgQVAgYnkgSU5JVCwgSU5JVCwgU1RBUlRVUCBzZXF1ZW5jZS4KIAkgKi8KLQlpZiAoY3B1KQotCQlyZXR1cm4gd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX2luaXQoYXBpY2lkLCBzdGFydF9pcCk7CisJaWYgKGNwdSkgeworCQlib290X2Vycm9yID0gd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX2luaXQoYXBpY2lkLCBzdGFydF9pcCk7CisJCWdvdG8gb3V0OworCX0KIAogCS8qCiAJICogV2FrZSB1cCBCU1AgYnkgbm1pLgpAQCAtNzI1LDYgKzczMCw5IEBACiAJCWJvb3RfZXJyb3IgPSB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfbm1pKGlkLCBzdGFydF9pcCk7CiAJfQogCitvdXQ6CisJcHJlZW1wdF9lbmFibGUoKTsKKwogCXJldHVybiBib290X2Vycm9yOwogfQogCkBAIC03NTgsMTAgKzc2NiwxMCBAQAogI2Vsc2UKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcoaWRsZSwgVElGX0ZPUkspOwogCWluaXRpYWxfZ3MgPSBwZXJfY3B1X29mZnNldChjcHUpOworI2VuZGlmCiAJcGVyX2NwdShrZXJuZWxfc3RhY2ssIGNwdSkgPQogCQkodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgLQogCQlLRVJORUxfU1RBQ0tfT0ZGU0VUICsgVEhSRUFEX1NJWkU7Ci0jZW5kaWYKIAllYXJseV9nZHRfZGVzY3IuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWdldF9jcHVfZ2R0X3RhYmxlKGNwdSk7CiAJaW5pdGlhbF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpc3RhcnRfc2Vjb25kYXJ5OwogCXN0YWNrX3N0YXJ0ICA9IGlkbGUtPnRocmVhZC5zcDsKQEAgLTEzNzksNyArMTM4Nyw3IEBACiAKIAlpZiAoIXRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9NV0FJVCkpCiAJCXJldHVybjsKLQlpZiAoIXRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMU0gpKQorCWlmICghdGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxVU0gpKQogCQlyZXR1cm47CiAJaWYgKF9fdGhpc19jcHVfcmVhZChjcHVfaW5mby5jcHVpZF9sZXZlbCkgPCBDUFVJRF9NV0FJVF9MRUFGKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jIGIvYXJjaC94ODYva2VybmVsL3RpbWUuYwppbmRleCAyNGQzYzkxLi5iZjdlZjVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vdGltZS5oPgogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAotREVGSU5FX1ZWQVIodm9sYXRpbGUgdW5zaWduZWQgbG9uZywgamlmZmllcykgPSBJTklUSUFMX0pJRkZJRVM7CitfX3Zpc2libGUgREVGSU5FX1ZWQVIodm9sYXRpbGUgdW5zaWduZWQgbG9uZywgamlmZmllcykgPSBJTklUSUFMX0pJRkZJRVM7CiAjZW5kaWYKIAogdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNjIsNyArNjIsNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEwICA9IHsKIAkuaGFuZGxlciA9IHRpbWVyX2ludGVycnVwdCwKLQkuZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORyB8IElSUUZfSVJRUE9MTCB8IElSUUZfVElNRVIsCisJLmZsYWdzID0gSVJRRl9OT0JBTEFOQ0lORyB8IElSUUZfSVJRUE9MTCB8IElSUUZfVElNRVIsCiAJLm5hbWUgPSAidGltZXIiCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKaW5kZXggN2E5Mjk2YS4uNTdlNWNlMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RzYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwpAQCAtOTg0LDkgKzk4NCw3IEBACiAJLm1hc2sgICAgICAgICAgICAgICAgICAgPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKIAkuZmxhZ3MgICAgICAgICAgICAgICAgICA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTIHwKIAkJCQkgIENMT0NLX1NPVVJDRV9NVVNUX1ZFUklGWSwKLSNpZmRlZiBDT05GSUdfWDg2XzY0CiAJLmFyY2hkYXRhICAgICAgICAgICAgICAgPSB7IC52Y2xvY2tfbW9kZSA9IFZDTE9DS19UU0MgfSwKLSNlbmRpZgogfTsKIAogdm9pZCBtYXJrX3RzY191bnN0YWJsZShjaGFyICpyZWFzb24pCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGRhNmIzNWEuLjQ5ZWRmMmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xNDcsNyArMTQ3LDYgQEAKIAkJX2VkYXRhID0gLjsKIAl9IDpkYXRhCiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0CiAKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfX3Z2YXJfcGFnZSA9IC47CkBAIC0xNjUsMTIgKzE2NCwxNSBAQAogI3VuZGVmIF9fVlZBUl9LRVJORUxfTERTCiAjdW5kZWYgRU1JVF9WVkFSCiAKKwkJLyoKKwkJICogUGFkIHRoZSByZXN0IG9mIHRoZSBwYWdlIHdpdGggemVyb3MuICBPdGhlcndpc2UgdGhlIGxvYWRlcgorCQkgKiBjYW4gbGVhdmUgZ2FyYmFnZSBoZXJlLgorCQkgKi8KKwkJLiA9IF9fdnZhcl9iZWdpbm5pbmdfaGFjayArIFBBR0VfU0laRTsKIAl9IDpkYXRhCiAKICAgICAgICAuID0gQUxJR04oX192dmFyX3BhZ2UgKyBQQUdFX1NJWkUsIFBBR0VfU0laRSk7CiAKLSNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCi0KIAkvKiBJbml0IGNvZGUgYW5kIGRhdGEgLSB3aWxsIGJlIGZyZWVkIGFmdGVyIGluaXQgKi8KIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAkuaW5pdC5iZWdpbiA6IEFUKEFERFIoLmluaXQuYmVnaW4pIC0gTE9BRF9PRkZTRVQpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF82NC5jIGIvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMKaW5kZXggMWY5NmY5My4uOWVhMjg3NjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF82NC5jCkBAIC00NywxNCArNDcsMTIgQEAKICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+Ci0jaW5jbHVkZSA8YXNtL3ZndG9kLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgInZzeXNjYWxsX3RyYWNlLmgiCiAKIERFRklORV9WVkFSKGludCwgdmdldGNwdV9tb2RlKTsKLURFRklORV9WVkFSKHN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEsIHZzeXNjYWxsX2d0b2RfZGF0YSk7CiAKIHN0YXRpYyBlbnVtIHsgRU1VTEFURSwgTkFUSVZFLCBOT05FIH0gdnN5c2NhbGxfbW9kZSA9IEVNVUxBVEU7CiAKQEAgLTc3LDQ4ICs3NSw2IEBACiB9CiBlYXJseV9wYXJhbSgidnN5c2NhbGwiLCB2c3lzY2FsbF9zZXR1cCk7CiAKLXZvaWQgdXBkYXRlX3ZzeXNjYWxsX3R6KHZvaWQpCi17Ci0JdnN5c2NhbGxfZ3RvZF9kYXRhLnN5c190eiA9IHN5c190ejsKLX0KLQotdm9pZCB1cGRhdGVfdnN5c2NhbGwoc3RydWN0IHRpbWVrZWVwZXIgKnRrKQotewotCXN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgKnZkYXRhID0gJnZzeXNjYWxsX2d0b2RfZGF0YTsKLQotCXdyaXRlX3NlcWNvdW50X2JlZ2luKCZ2ZGF0YS0+c2VxKTsKLQotCS8qIGNvcHkgdnN5c2NhbGwgZGF0YSAqLwotCXZkYXRhLT5jbG9jay52Y2xvY2tfbW9kZQk9IHRrLT5jbG9jay0+YXJjaGRhdGEudmNsb2NrX21vZGU7Ci0JdmRhdGEtPmNsb2NrLmN5Y2xlX2xhc3QJCT0gdGstPmNsb2NrLT5jeWNsZV9sYXN0OwotCXZkYXRhLT5jbG9jay5tYXNrCQk9IHRrLT5jbG9jay0+bWFzazsKLQl2ZGF0YS0+Y2xvY2subXVsdAkJPSB0ay0+bXVsdDsKLQl2ZGF0YS0+Y2xvY2suc2hpZnQJCT0gdGstPnNoaWZ0OwotCi0JdmRhdGEtPndhbGxfdGltZV9zZWMJCT0gdGstPnh0aW1lX3NlYzsKLQl2ZGF0YS0+d2FsbF90aW1lX3Nuc2VjCQk9IHRrLT54dGltZV9uc2VjOwotCi0JdmRhdGEtPm1vbm90b25pY190aW1lX3NlYwk9IHRrLT54dGltZV9zZWMKLQkJCQkJKyB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYwk9IHRrLT54dGltZV9uc2VjCi0JCQkJCSsgKHRrLT53YWxsX3RvX21vbm90b25pYy50dl9uc2VjCi0JCQkJCQk8PCB0ay0+c2hpZnQpOwotCXdoaWxlICh2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgPj0KLQkJCQkJKCgodTY0KU5TRUNfUEVSX1NFQykgPDwgdGstPnNoaWZ0KSkgewotCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgLT0KLQkJCQkJKCh1NjQpTlNFQ19QRVJfU0VDKSA8PCB0ay0+c2hpZnQ7Ci0JCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zZWMrKzsKLQl9Ci0KLQl2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZS50dl9zZWMJPSB0ay0+eHRpbWVfc2VjOwotCXZkYXRhLT53YWxsX3RpbWVfY29hcnNlLnR2X25zZWMJPSAobG9uZykodGstPnh0aW1lX25zZWMgPj4gdGstPnNoaWZ0KTsKLQotCXZkYXRhLT5tb25vdG9uaWNfdGltZV9jb2Fyc2UJPSB0aW1lc3BlY19hZGQodmRhdGEtPndhbGxfdGltZV9jb2Fyc2UsCi0JCQkJCQkJdGstPndhbGxfdG9fbW9ub3RvbmljKTsKLQotCXdyaXRlX3NlcWNvdW50X2VuZCgmdmRhdGEtPnNlcSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHdhcm5fYmFkX3ZzeXNjYWxsKGNvbnN0IGNoYXIgKmxldmVsLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCSAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCiB7CkBAIC0zNzQsNyArMzMwLDYgQEAKIHsKIAlleHRlcm4gY2hhciBfX3ZzeXNjYWxsX3BhZ2U7CiAJdW5zaWduZWQgbG9uZyBwaHlzYWRkcl92c3lzY2FsbCA9IF9fcGFfc3ltYm9sKCZfX3ZzeXNjYWxsX3BhZ2UpOwotCWV4dGVybiBjaGFyIF9fdnZhcl9wYWdlOwogCXVuc2lnbmVkIGxvbmcgcGh5c2FkZHJfdnZhcl9wYWdlID0gX19wYV9zeW1ib2woJl9fdnZhcl9wYWdlKTsKIAogCV9fc2V0X2ZpeG1hcChWU1lTQ0FMTF9GSVJTVF9QQUdFLCBwaHlzYWRkcl92c3lzY2FsbCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF9ndG9kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfZ3RvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzZlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfZ3RvZC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYSBBcmNhbmdlbGkgPGFuZHJlYUBzdXNlLmRlPiBTdVNFCisgKiAgQ29weXJpZ2h0IDIwMDMgQW5kaSBLbGVlbiwgU3VTRSBMYWJzLgorICoKKyAqICBNb2RpZmllZCBmb3IgeDg2IDMyIGJpdCBhcmNoaXRlY3R1cmUgYnkKKyAqICBTdGVmYW5pIFNlaWJvbGQgPHN0ZWZhbmlAc2VpYm9sZC5uZXQ+CisgKiAgc3BvbnNvcmVkIGJ5IFJvaGRlICYgU2Nod2FyeiBHbWJIICYgQ28uIEtHIE11bmljaC9HZXJtYW55CisgKgorICogIFRoYW5rcyB0byBocGFAdHJhbnNtZXRhLmNvbSBmb3Igc29tZSB1c2VmdWwgaGludC4KKyAqICBTcGVjaWFsIHRoYW5rcyB0byBJbmdvIE1vbG5hciBmb3IgaGlzIGVhcmx5IGV4cGVyaWVuY2Ugd2l0aAorICogIGEgZGlmZmVyZW50IHZzeXNjYWxsIGltcGxlbWVudGF0aW9uIGZvciBMaW51eC9JQTMyIGFuZCBmb3IgdGhlIG5hbWUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1la2VlcGVyX2ludGVybmFsLmg+CisjaW5jbHVkZSA8YXNtL3ZndG9kLmg+CisjaW5jbHVkZSA8YXNtL3Z2YXIuaD4KKworREVGSU5FX1ZWQVIoc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSwgdnN5c2NhbGxfZ3RvZF9kYXRhKTsKKwordm9pZCB1cGRhdGVfdnN5c2NhbGxfdHoodm9pZCkKK3sKKwl2c3lzY2FsbF9ndG9kX2RhdGEudHpfbWludXRlc3dlc3QgPSBzeXNfdHoudHpfbWludXRlc3dlc3Q7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLnR6X2RzdHRpbWUgPSBzeXNfdHoudHpfZHN0dGltZTsKK30KKwordm9pZCB1cGRhdGVfdnN5c2NhbGwoc3RydWN0IHRpbWVrZWVwZXIgKnRrKQoreworCXN0cnVjdCB2c3lzY2FsbF9ndG9kX2RhdGEgKnZkYXRhID0gJnZzeXNjYWxsX2d0b2RfZGF0YTsKKworCWd0b2Rfd3JpdGVfYmVnaW4odmRhdGEpOworCisJLyogY29weSB2c3lzY2FsbCBkYXRhICovCisJdmRhdGEtPnZjbG9ja19tb2RlCT0gdGstPmNsb2NrLT5hcmNoZGF0YS52Y2xvY2tfbW9kZTsKKwl2ZGF0YS0+Y3ljbGVfbGFzdAk9IHRrLT5jbG9jay0+Y3ljbGVfbGFzdDsKKwl2ZGF0YS0+bWFzawkJPSB0ay0+Y2xvY2stPm1hc2s7CisJdmRhdGEtPm11bHQJCT0gdGstPm11bHQ7CisJdmRhdGEtPnNoaWZ0CQk9IHRrLT5zaGlmdDsKKworCXZkYXRhLT53YWxsX3RpbWVfc2VjCQk9IHRrLT54dGltZV9zZWM7CisJdmRhdGEtPndhbGxfdGltZV9zbnNlYwkJPSB0ay0+eHRpbWVfbnNlYzsKKworCXZkYXRhLT5tb25vdG9uaWNfdGltZV9zZWMJPSB0ay0+eHRpbWVfc2VjCisJCQkJCSsgdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKKwl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMJPSB0ay0+eHRpbWVfbnNlYworCQkJCQkrICh0ay0+d2FsbF90b19tb25vdG9uaWMudHZfbnNlYworCQkJCQkJPDwgdGstPnNoaWZ0KTsKKwl3aGlsZSAodmRhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjID49CisJCQkJCSgoKHU2NClOU0VDX1BFUl9TRUMpIDw8IHRrLT5zaGlmdCkpIHsKKwkJdmRhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjIC09CisJCQkJCSgodTY0KU5TRUNfUEVSX1NFQykgPDwgdGstPnNoaWZ0OworCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc2VjKys7CisJfQorCisJdmRhdGEtPndhbGxfdGltZV9jb2Fyc2Vfc2VjCT0gdGstPnh0aW1lX3NlYzsKKwl2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9uc2VjCT0gKGxvbmcpKHRrLT54dGltZV9uc2VjID4+IHRrLT5zaGlmdCk7CisKKwl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX3NlYyA9CisJCXZkYXRhLT53YWxsX3RpbWVfY29hcnNlX3NlYyArIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9zZWM7CisJdmRhdGEtPm1vbm90b25pY190aW1lX2NvYXJzZV9uc2VjID0KKwkJdmRhdGEtPndhbGxfdGltZV9jb2Fyc2VfbnNlYyArIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9uc2VjOworCisJd2hpbGUgKHZkYXRhLT5tb25vdG9uaWNfdGltZV9jb2Fyc2VfbnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKKwkJdmRhdGEtPm1vbm90b25pY190aW1lX2NvYXJzZV9uc2VjIC09IE5TRUNfUEVSX1NFQzsKKwkJdmRhdGEtPm1vbm90b25pY190aW1lX2NvYXJzZV9zZWMrKzsKKwl9CisKKwlndG9kX3dyaXRlX2VuZCh2ZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vY3B1aWQuYyBiL2FyY2gveDg2L2t2bS9jcHVpZC5jCmluZGV4IGM2OTc2MjUuLmU1NTAzZDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9jcHVpZC5jCisrKyBiL2FyY2gveDg2L2t2bS9jcHVpZC5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJRihUU0MpIHwgRihNU1IpIHwgRihQQUUpIHwgRihNQ0UpIHwKIAkJRihDWDgpIHwgRihBUElDKSB8IDAgLyogUmVzZXJ2ZWQgKi8gfCBGKFNFUCkgfAogCQlGKE1UUlIpIHwgRihQR0UpIHwgRihNQ0EpIHwgRihDTU9WKSB8Ci0JCUYoUEFUKSB8IEYoUFNFMzYpIHwgMCAvKiBQU04gKi8gfCBGKENMRkxTSCkgfAorCQlGKFBBVCkgfCBGKFBTRTM2KSB8IDAgLyogUFNOICovIHwgRihDTEZMVVNIKSB8CiAJCTAgLyogUmVzZXJ2ZWQsIERTLCBBQ1BJICovIHwgRihNTVgpIHwKIAkJRihGWFNSKSB8IEYoWE1NKSB8IEYoWE1NMikgfCBGKFNFTEZTTk9PUCkgfAogCQkwIC8qIEhUVCwgVE0sIFJlc2VydmVkLCBQQkUgKi87CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvaGFzaC5jIGIvYXJjaC94ODYvbGliL2hhc2guYwppbmRleCAzMDU2NzAyLi5mZjRmYTUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvaGFzaC5jCisrKyBiL2FyY2gveDg2L2xpYi9oYXNoLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgpAQCAtMzksNyArNDAsMTEgQEAKIAogc3RhdGljIGlubGluZSB1MzIgY3JjMzJfdTMyKHUzMiBjcmMsIHUzMiB2YWwpCiB7CisjaWZkZWYgQ09ORklHX0FTX0NSQzMyCiAJYXNtICgiY3JjMzJsICUxLCUwXG4iIDogIityIiAoY3JjKSA6ICJybSIgKHZhbCkpOworI2Vsc2UKKwlhc20gKCIuYnl0ZSAweGYyLCAweDBmLCAweDM4LCAweGYxLCAweGMxIiA6ICIrYSIgKGNyYykgOiAiYyIgKHZhbCkpOworI2VuZGlmCiAJcmV0dXJuIGNyYzsKIH0KIApAQCAtNDksMTkgKzU0LDE4IEBACiAJdTMyIGksIHRtcCA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gNDsgaSsrKQotCQlzZWVkID0gY3JjMzJfdTMyKCpwMzIrKywgc2VlZCk7CisJCXNlZWQgPSBjcmMzMl91MzIoc2VlZCwgKnAzMisrKTsKIAotCXN3aXRjaCAoMyAtIChsZW4gJiAweDAzKSkgewotCWNhc2UgMDoKKwlzd2l0Y2ggKGxlbiAmIDMpIHsKKwljYXNlIDM6CiAJCXRtcCB8PSAqKChjb25zdCB1OCAqKSBwMzIgKyAyKSA8PCAxNjsKIAkJLyogZmFsbHRocm91Z2ggKi8KLQljYXNlIDE6CisJY2FzZSAyOgogCQl0bXAgfD0gKigoY29uc3QgdTggKikgcDMyICsgMSkgPDwgODsKIAkJLyogZmFsbHRocm91Z2ggKi8KLQljYXNlIDI6CisJY2FzZSAxOgogCQl0bXAgfD0gKigoY29uc3QgdTggKikgcDMyKTsKLQkJc2VlZCA9IGNyYzMyX3UzMih0bXAsIHNlZWQpOwotCWRlZmF1bHQ6CisJCXNlZWQgPSBjcmMzMl91MzIoc2VlZCwgdG1wKTsKIAkJYnJlYWs7CiAJfQogCkBAIC03NCwxMiArNzgsMTIgQEAKIAl1MzIgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJc2VlZCA9IGNyYzMyX3UzMigqcDMyKyssIHNlZWQpOworCQlzZWVkID0gY3JjMzJfdTMyKHNlZWQsICpwMzIrKyk7CiAKIAlyZXR1cm4gc2VlZDsKIH0KIAotdm9pZCBzZXR1cF9hcmNoX2Zhc3RfaGFzaChzdHJ1Y3QgZmFzdF9oYXNoX29wcyAqb3BzKQordm9pZCBfX2luaXQgc2V0dXBfYXJjaF9mYXN0X2hhc2goc3RydWN0IGZhc3RfaGFzaF9vcHMgKm9wcykKIHsKIAlpZiAoY3B1X2hhc194bW00XzIpIHsKIAkJb3BzLT5oYXNoICA9IGludGVsX2NyYzRfMl9oYXNoOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21lbWNweV8zMi5jIGIvYXJjaC94ODYvbGliL21lbWNweV8zMi5jCmluZGV4IGU3ODc2MWQuLmE0MDRiNGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tZW1jcHlfMzIuYworKysgYi9hcmNoL3g4Ni9saWIvbWVtY3B5XzMyLmMKQEAgLTQsNyArNCw3IEBACiAjdW5kZWYgbWVtY3B5CiAjdW5kZWYgbWVtc2V0CiAKLXZvaWQgKm1lbWNweSh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgc2l6ZV90IG4pCitfX3Zpc2libGUgdm9pZCAqbWVtY3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbikKIHsKICNpZmRlZiBDT05GSUdfWDg2X1VTRV8zRE5PVwogCXJldHVybiBfX21lbWNweTNkKHRvLCBmcm9tLCBuKTsKQEAgLTE0LDEzICsxNCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTChtZW1jcHkpOwogCi12b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBjb3VudCkKK19fdmlzaWJsZSB2b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBjb3VudCkKIHsKIAlyZXR1cm4gX19tZW1zZXQocywgYywgY291bnQpOwogfQogRVhQT1JUX1NZTUJPTChtZW1zZXQpOwogCi12b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCitfX3Zpc2libGUgdm9pZCAqbWVtbW92ZSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQogewogCWludCBkMCxkMSxkMixkMyxkNCxkNTsKIAljaGFyICpyZXQgPSBkZXN0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21zci5jIGIvYXJjaC94ODYvbGliL21zci5jCmluZGV4IDhmOGVlYmQuLmRiOWRiNDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tc3IuYworKysgYi9hcmNoL3g4Ni9saWIvbXNyLmMKQEAgLTgsNyArOCw3IEBACiAKIAltc3JzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBtc3IpOwogCWlmICghbXNycykgewotCQlwcl93YXJuaW5nKCIlczogZXJyb3IgYWxsb2NhdGluZyBtc3JzXG4iLCBfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBlcnJvciBhbGxvY2F0aW5nIG1zcnNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yMSwzICsyMSw5MCBAQAogCWZyZWVfcGVyY3B1KG1zcnMpOwogfQogRVhQT1JUX1NZTUJPTChtc3JzX2ZyZWUpOworCisvKioKKyAqIFJlYWQgYW4gTVNSIHdpdGggZXJyb3IgaGFuZGxpbmcKKyAqCisgKiBAbXNyOiBNU1IgdG8gcmVhZAorICogQG06IHZhbHVlIHRvIHJlYWQgaW50bworICoKKyAqIEl0IHJldHVybnMgcmVhZCBkYXRhIG9ubHkgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBvdXRwdXQKKyAqIGFyZ3VtZW50IEBtLgorICoKKyAqLworaW50IG1zcl9yZWFkKHUzMiBtc3IsIHN0cnVjdCBtc3IgKm0pCit7CisJaW50IGVycjsKKwl1NjQgdmFsOworCisJZXJyID0gcmRtc3JsX3NhZmUobXNyLCAmdmFsKTsKKwlpZiAoIWVycikKKwkJbS0+cSA9IHZhbDsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogV3JpdGUgYW4gTVNSIHdpdGggZXJyb3IgaGFuZGxpbmcKKyAqCisgKiBAbXNyOiBNU1IgdG8gd3JpdGUKKyAqIEBtOiB2YWx1ZSB0byB3cml0ZQorICovCitpbnQgbXNyX3dyaXRlKHUzMiBtc3IsIHN0cnVjdCBtc3IgKm0pCit7CisJcmV0dXJuIHdybXNybF9zYWZlKG1zciwgbS0+cSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fZmxpcF9iaXQodTMyIG1zciwgdTggYml0LCBib29sIHNldCkKK3sKKwlzdHJ1Y3QgbXNyIG0sIG0xOworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKGJpdCA+IDYzKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbXNyX3JlYWQobXNyLCAmbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW0xID0gbTsKKwlpZiAoc2V0KQorCQltMS5xIHw9ICBCSVRfNjQoYml0KTsKKwllbHNlCisJCW0xLnEgJj0gfkJJVF82NChiaXQpOworCisJaWYgKG0xLnEgPT0gbS5xKQorCQlyZXR1cm4gMDsKKworCWVyciA9IG1zcl93cml0ZShtc3IsICZtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogU2V0IEBiaXQgaW4gYSBNU1IgQG1zci4KKyAqCisgKiBSZXR2YWw6CisgKiA8IDA6IEFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KKyAqID0gMDogQml0IHdhcyBhbHJlYWR5IHNldC4KKyAqID4gMDogSGFyZHdhcmUgYWNjZXB0ZWQgdGhlIE1TUiB3cml0ZS4KKyAqLworaW50IG1zcl9zZXRfYml0KHUzMiBtc3IsIHU4IGJpdCkKK3sKKwlyZXR1cm4gX19mbGlwX2JpdChtc3IsIGJpdCwgdHJ1ZSk7Cit9CisKKy8qKgorICogQ2xlYXIgQGJpdCBpbiBhIE1TUiBAbXNyLgorICoKKyAqIFJldHZhbDoKKyAqIDwgMDogQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkLgorICogPSAwOiBCaXQgd2FzIGFscmVhZHkgY2xlYXJlZC4KKyAqID4gMDogSGFyZHdhcmUgYWNjZXB0ZWQgdGhlIE1TUiB3cml0ZS4KKyAqLworaW50IG1zcl9jbGVhcl9iaXQodTMyIG1zciwgdTggYml0KQoreworCXJldHVybiBfX2ZsaXBfYml0KG1zciwgYml0LCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYyBiL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jCmluZGV4IDAwMDJhM2EuLjIwNjIxZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jCisrKyBiL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jCkBAIC0zMCw2ICszMCw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzOwogCXVuc2lnbmVkIGxvbmcgY3VycmVudF9hZGRyZXNzOwogCWNvbnN0IHN0cnVjdCBhZGRyX21hcmtlciAqbWFya2VyOworCWJvb2wgdG9fZG1lc2c7CiB9OwogCiBzdHJ1Y3QgYWRkcl9tYXJrZXIgewpAQCAtODgsMTAgKzg5LDI4IEBACiAjZGVmaW5lIFBVRF9MRVZFTF9NVUxUIChQVFJTX1BFUl9QTUQgKiBQTURfTEVWRUxfTVVMVCkKICNkZWZpbmUgUEdEX0xFVkVMX01VTFQgKFBUUlNfUEVSX1BVRCAqIFBVRF9MRVZFTF9NVUxUKQogCisjZGVmaW5lIHB0X2R1bXBfc2VxX3ByaW50ZihtLCB0b19kbWVzZywgZm10LCBhcmdzLi4uKQkJXAorKHsJCQkJCQkJCVwKKwlpZiAodG9fZG1lc2cpCQkJCQlcCisJCXByaW50ayhLRVJOX0lORk8gZm10LCAjI2FyZ3MpOwkJCVwKKwllbHNlCQkJCQkJCVwKKwkJaWYgKG0pCQkJCQkJXAorCQkJc2VxX3ByaW50ZihtLCBmbXQsICMjYXJncyk7CQlcCit9KQorCisjZGVmaW5lIHB0X2R1bXBfY29udF9wcmludGYobSwgdG9fZG1lc2csIGZtdCwgYXJncy4uLikJCVwKKyh7CQkJCQkJCQlcCisJaWYgKHRvX2RtZXNnKQkJCQkJXAorCQlwcmludGsoS0VSTl9DT05UIGZtdCwgIyNhcmdzKTsJCQlcCisJZWxzZQkJCQkJCQlcCisJCWlmIChtKQkJCQkJCVwKKwkJCXNlcV9wcmludGYobSwgZm10LCAjI2FyZ3MpOwkJXAorfSkKKwogLyoKICAqIFByaW50IGEgcmVhZGFibGUgZm9ybSBvZiBhIHBncHJvdF90IHRvIHRoZSBzZXFfZmlsZQogICovCi1zdGF0aWMgdm9pZCBwcmludGtfcHJvdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHBncHJvdF90IHByb3QsIGludCBsZXZlbCkKK3N0YXRpYyB2b2lkIHByaW50a19wcm90KHN0cnVjdCBzZXFfZmlsZSAqbSwgcGdwcm90X3QgcHJvdCwgaW50IGxldmVsLCBib29sIGRtc2cpCiB7CiAJcGdwcm90dmFsX3QgcHIgPSBwZ3Byb3RfdmFsKHByb3QpOwogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGV2ZWxfbmFtZVtdID0KQEAgLTk5LDQ3ICsxMTgsNDcgQEAKIAogCWlmICghcGdwcm90X3ZhbChwcm90KSkgewogCQkvKiBOb3QgcHJlc2VudCAqLwotCQlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgICAgICAgICAgICAgICAgICIpOworCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICIgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwogCX0gZWxzZSB7CiAJCWlmIChwciAmIF9QQUdFX1VTRVIpCi0JCQlzZXFfcHJpbnRmKG0sICJVU1IgIik7CisJCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICJVU1IgIik7CiAJCWVsc2UKLQkJCXNlcV9wcmludGYobSwgIiAgICAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIiAgICAiKTsKIAkJaWYgKHByICYgX1BBR0VfUlcpCi0JCQlzZXFfcHJpbnRmKG0sICJSVyAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIlJXICIpOwogCQllbHNlCi0JCQlzZXFfcHJpbnRmKG0sICJybyAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgInJvICIpOwogCQlpZiAocHIgJiBfUEFHRV9QV1QpCi0JCQlzZXFfcHJpbnRmKG0sICJQV1QgIik7CisJCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICJQV1QgIik7CiAJCWVsc2UKLQkJCXNlcV9wcmludGYobSwgIiAgICAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIiAgICAiKTsKIAkJaWYgKHByICYgX1BBR0VfUENEKQotCQkJc2VxX3ByaW50ZihtLCAiUENEICIpOworCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiUENEICIpOwogCQllbHNlCi0JCQlzZXFfcHJpbnRmKG0sICIgICAgIik7CisJCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICIgICAgIik7CiAKIAkJLyogQml0IDkgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgb24gbGV2ZWwgMyB2cyA0ICovCiAJCWlmIChsZXZlbCA8PSAzKSB7CiAJCQlpZiAocHIgJiBfUEFHRV9QU0UpCi0JCQkJc2VxX3ByaW50ZihtLCAiUFNFICIpOworCQkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIlBTRSAiKTsKIAkJCWVsc2UKLQkJCQlzZXFfcHJpbnRmKG0sICIgICAgIik7CisJCQkJcHRfZHVtcF9jb250X3ByaW50ZihtLCBkbXNnLCAiICAgICIpOwogCQl9IGVsc2UgewogCQkJaWYgKHByICYgX1BBR0VfUEFUKQotCQkJCXNlcV9wcmludGYobSwgInBhdCAiKTsKKwkJCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICJwYXQgIik7CiAJCQllbHNlCi0JCQkJc2VxX3ByaW50ZihtLCAiICAgICIpOworCQkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIiAgICAiKTsKIAkJfQogCQlpZiAocHIgJiBfUEFHRV9HTE9CQUwpCi0JCQlzZXFfcHJpbnRmKG0sICJHTEIgIik7CisJCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIGRtc2csICJHTEIgIik7CiAJCWVsc2UKLQkJCXNlcV9wcmludGYobSwgIiAgICAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIiAgICAiKTsKIAkJaWYgKHByICYgX1BBR0VfTlgpCi0JCQlzZXFfcHJpbnRmKG0sICJOWCAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIk5YICIpOwogCQllbHNlCi0JCQlzZXFfcHJpbnRmKG0sICJ4ICAiKTsKKwkJCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgInggICIpOwogCX0KLQlzZXFfcHJpbnRmKG0sICIlc1xuIiwgbGV2ZWxfbmFtZVtsZXZlbF0pOworCXB0X2R1bXBfY29udF9wcmludGYobSwgZG1zZywgIiVzXG4iLCBsZXZlbF9uYW1lW2xldmVsXSk7CiB9CiAKIC8qCkBAIC0xNzgsNyArMTk3LDggQEAKIAkJc3QtPmN1cnJlbnRfcHJvdCA9IG5ld19wcm90OwogCQlzdC0+bGV2ZWwgPSBsZXZlbDsKIAkJc3QtPm1hcmtlciA9IGFkZHJlc3NfbWFya2VyczsKLQkJc2VxX3ByaW50ZihtLCAiLS0tWyAlcyBdLS0tXG4iLCBzdC0+bWFya2VyLT5uYW1lKTsKKwkJcHRfZHVtcF9zZXFfcHJpbnRmKG0sIHN0LT50b19kbWVzZywgIi0tLVsgJXMgXS0tLVxuIiwKKwkJCQkgICBzdC0+bWFya2VyLT5uYW1lKTsKIAl9IGVsc2UgaWYgKHByb3QgIT0gY3VyIHx8IGxldmVsICE9IHN0LT5sZXZlbCB8fAogCQkgICBzdC0+Y3VycmVudF9hZGRyZXNzID49IHN0LT5tYXJrZXJbMV0uc3RhcnRfYWRkcmVzcykgewogCQljb25zdCBjaGFyICp1bml0ID0gdW5pdHM7CkBAIC0xODgsMTcgKzIwOCwxNyBAQAogCQkvKgogCQkgKiBOb3cgcHJpbnQgdGhlIGFjdHVhbCBmaW5pc2hlZCBzZXJpZXMKIAkJICovCi0JCXNlcV9wcmludGYobSwgIjB4JTAqbHgtMHglMCpseCAgICIsCi0JCQkgICB3aWR0aCwgc3QtPnN0YXJ0X2FkZHJlc3MsCi0JCQkgICB3aWR0aCwgc3QtPmN1cnJlbnRfYWRkcmVzcyk7CisJCXB0X2R1bXBfc2VxX3ByaW50ZihtLCBzdC0+dG9fZG1lc2csICAiMHglMCpseC0weCUwKmx4ICAgIiwKKwkJCQkgICB3aWR0aCwgc3QtPnN0YXJ0X2FkZHJlc3MsCisJCQkJICAgd2lkdGgsIHN0LT5jdXJyZW50X2FkZHJlc3MpOwogCiAJCWRlbHRhID0gKHN0LT5jdXJyZW50X2FkZHJlc3MgLSBzdC0+c3RhcnRfYWRkcmVzcykgPj4gMTA7CiAJCXdoaWxlICghKGRlbHRhICYgMTAyMykgJiYgdW5pdFsxXSkgewogCQkJZGVsdGEgPj49IDEwOwogCQkJdW5pdCsrOwogCQl9Ci0JCXNlcV9wcmludGYobSwgIiU5bHUlYyAiLCBkZWx0YSwgKnVuaXQpOwotCQlwcmludGtfcHJvdChtLCBzdC0+Y3VycmVudF9wcm90LCBzdC0+bGV2ZWwpOworCQlwdF9kdW1wX2NvbnRfcHJpbnRmKG0sIHN0LT50b19kbWVzZywgIiU5bHUlYyAiLCBkZWx0YSwgKnVuaXQpOworCQlwcmludGtfcHJvdChtLCBzdC0+Y3VycmVudF9wcm90LCBzdC0+bGV2ZWwsIHN0LT50b19kbWVzZyk7CiAKIAkJLyoKIAkJICogV2UgcHJpbnQgbWFya2VycyBmb3Igc3BlY2lhbCBhcmVhcyBvZiBhZGRyZXNzIHNwYWNlLApAQCAtMjA3LDcgKzIyNyw4IEBACiAJCSAqLwogCQlpZiAoc3QtPmN1cnJlbnRfYWRkcmVzcyA+PSBzdC0+bWFya2VyWzFdLnN0YXJ0X2FkZHJlc3MpIHsKIAkJCXN0LT5tYXJrZXIrKzsKLQkJCXNlcV9wcmludGYobSwgIi0tLVsgJXMgXS0tLVxuIiwgc3QtPm1hcmtlci0+bmFtZSk7CisJCQlwdF9kdW1wX3NlcV9wcmludGYobSwgc3QtPnRvX2RtZXNnLCAiLS0tWyAlcyBdLS0tXG4iLAorCQkJCQkgICBzdC0+bWFya2VyLT5uYW1lKTsKIAkJfQogCiAJCXN0LT5zdGFydF9hZGRyZXNzID0gc3QtPmN1cnJlbnRfYWRkcmVzczsKQEAgLTI5Niw3ICszMTcsNyBAQAogI2RlZmluZSBwZ2Rfbm9uZShhKSAgcHVkX25vbmUoX19wdWQocGdkX3ZhbChhKSkpCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgd2Fsa19wZ2RfbGV2ZWwoc3RydWN0IHNlcV9maWxlICptKQordm9pZCBwdGR1bXBfd2Fsa19wZ2RfbGV2ZWwoc3RydWN0IHNlcV9maWxlICptLCBwZ2RfdCAqcGdkKQogewogI2lmZGVmIENPTkZJR19YODZfNjQKIAlwZ2RfdCAqc3RhcnQgPSAocGdkX3QgKikgJmluaXRfbGV2ZWw0X3BndDsKQEAgLTMwNCw5ICszMjUsMTIgQEAKIAlwZ2RfdCAqc3RhcnQgPSBzd2FwcGVyX3BnX2RpcjsKICNlbmRpZgogCWludCBpOwotCXN0cnVjdCBwZ19zdGF0ZSBzdDsKKwlzdHJ1Y3QgcGdfc3RhdGUgc3QgPSB7fTsKIAotCW1lbXNldCgmc3QsIDAsIHNpemVvZihzdCkpOworCWlmIChwZ2QpIHsKKwkJc3RhcnQgPSBwZ2Q7CisJCXN0LnRvX2RtZXNnID0gdHJ1ZTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUEdEOyBpKyspIHsKIAkJc3QuY3VycmVudF9hZGRyZXNzID0gbm9ybWFsaXplX2FkZHIoaSAqIFBHRF9MRVZFTF9NVUxUKTsKQEAgLTMzMSw3ICszNTUsNyBAQAogCiBzdGF0aWMgaW50IHB0ZHVtcF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQl3YWxrX3BnZF9sZXZlbChtKTsKKwlwdGR1bXBfd2Fsa19wZ2RfbGV2ZWwobSwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ZhdWx0LmMgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCmluZGV4IGExMGM4YzcuLjhlNTcyMjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODYvbW0vZmF1bHQuYwpAQCAtNTg0LDggKzU4NCwxMyBAQAogCiAJaWYgKGVycm9yX2NvZGUgJiBQRl9JTlNUUikgewogCQl1bnNpZ25lZCBpbnQgbGV2ZWw7CisJCXBnZF90ICpwZ2Q7CisJCXB0ZV90ICpwdGU7CiAKLQkJcHRlX3QgKnB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHJlc3MsICZsZXZlbCk7CisJCXBnZCA9IF9fdmEocmVhZF9jcjMoKSAmIFBIWVNJQ0FMX1BBR0VfTUFTSyk7CisJCXBnZCArPSBwZ2RfaW5kZXgoYWRkcmVzcyk7CisKKwkJcHRlID0gbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZCwgYWRkcmVzcywgJmxldmVsKTsKIAogCQlpZiAocHRlICYmIHB0ZV9wcmVzZW50KCpwdGUpICYmICFwdGVfZXhlYygqcHRlKSkKIAkJCXByaW50ayhueF93YXJuaW5nLCBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgY3VycmVudF91aWQoKSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYS5jIGIvYXJjaC94ODYvbW0vbnVtYS5jCmluZGV4IDI3YWEwNDU1Li4xZDA0NWY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hLmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYS5jCkBAIC02ODcsMTAgKzY4Nyw2IEBACiB2b2lkIF9faW5pdCB4ODZfbnVtYV9pbml0KHZvaWQpCiB7CiAJaWYgKCFudW1hX29mZikgewotI2lmZGVmIENPTkZJR19YODZfTlVNQVEKLQkJaWYgKCFudW1hX2luaXQobnVtYXFfbnVtYV9pbml0KSkKLQkJCXJldHVybjsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAkJaWYgKCFudW1hX2luaXQoeDg2X2FjcGlfbnVtYV9pbml0KSkKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCmluZGV4IGIzYjE5ZjQuLmFlMjQyYTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC94ODYvbW0vcGFnZWF0dHIuYwpAQCAtMTI2LDggKzEyNiw4IEBACiAgKiBAdmFkZHI6CXZpcnR1YWwgc3RhcnQgYWRkcmVzcwogICogQHNpemU6CW51bWJlciBvZiBieXRlcyB0byBmbHVzaAogICoKLSAqIGNsZmx1c2ggaXMgYW4gdW5vcmRlcmVkIGluc3RydWN0aW9uIHdoaWNoIG5lZWRzIGZlbmNpbmcgd2l0aCBtZmVuY2UKLSAqIHRvIGF2b2lkIG9yZGVyaW5nIGlzc3Vlcy4KKyAqIGNsZmx1c2hvcHQgaXMgYW4gdW5vcmRlcmVkIGluc3RydWN0aW9uIHdoaWNoIG5lZWRzIGZlbmNpbmcgd2l0aCBtZmVuY2Ugb3IKKyAqIHNmZW5jZSB0byBhdm9pZCBvcmRlcmluZyBpc3N1ZXMuCiAgKi8KIHZvaWQgY2xmbHVzaF9jYWNoZV9yYW5nZSh2b2lkICp2YWRkciwgdW5zaWduZWQgaW50IHNpemUpCiB7CkBAIC0xMzYsMTEgKzEzNiwxMSBAQAogCW1iKCk7CiAKIAlmb3IgKDsgdmFkZHIgPCB2ZW5kOyB2YWRkciArPSBib290X2NwdV9kYXRhLng4Nl9jbGZsdXNoX3NpemUpCi0JCWNsZmx1c2godmFkZHIpOworCQljbGZsdXNob3B0KHZhZGRyKTsKIAkvKgogCSAqIEZsdXNoIGFueSBwb3NzaWJsZSBmaW5hbCBwYXJ0aWFsIGNhY2hlbGluZToKIAkgKi8KLQljbGZsdXNoKHZlbmQpOworCWNsZmx1c2hvcHQodmVuZCk7CiAKIAltYigpOwogfQpAQCAtMzIzLDggKzMyMywxMiBAQAogCXJldHVybiBwcm90OwogfQogCi1zdGF0aWMgcHRlX3QgKl9fbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmxldmVsKQorLyoKKyAqIExvb2t1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBzcGVjaWZpYyBwZ2QuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBhbmQgdGhlIGxldmVsIG9mIHRoZSBtYXBwaW5nLgorICovCitwdGVfdCAqbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCSAgICAgdW5zaWduZWQgaW50ICpsZXZlbCkKIHsKIAlwdWRfdCAqcHVkOwogCXBtZF90ICpwbWQ7CkBAIC0zNjUsNyArMzY5LDcgQEAKICAqLwogcHRlX3QgKmxvb2t1cF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50ICpsZXZlbCkKIHsKLSAgICAgICAgcmV0dXJuIF9fbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF9vZmZzZXRfayhhZGRyZXNzKSwgYWRkcmVzcywgbGV2ZWwpOworICAgICAgICByZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkKHBnZF9vZmZzZXRfayhhZGRyZXNzKSwgYWRkcmVzcywgbGV2ZWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobG9va3VwX2FkZHJlc3MpOwogCkBAIC0zNzMsNyArMzc3LDcgQEAKIAkJCQkgIHVuc2lnbmVkIGludCAqbGV2ZWwpCiB7CiAgICAgICAgIGlmIChjcGEtPnBnZCkKLQkJcmV0dXJuIF9fbG9va3VwX2FkZHJlc3NfaW5fcGdkKGNwYS0+cGdkICsgcGdkX2luZGV4KGFkZHJlc3MpLAorCQlyZXR1cm4gbG9va3VwX2FkZHJlc3NfaW5fcGdkKGNwYS0+cGdkICsgcGdkX2luZGV4KGFkZHJlc3MpLAogCQkJCQkgICAgICAgYWRkcmVzcywgbGV2ZWwpOwogCiAgICAgICAgIHJldHVybiBsb29rdXBfYWRkcmVzcyhhZGRyZXNzLCBsZXZlbCk7CkBAIC02OTIsNiArNjk2LDE4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIHRyeV90b19mcmVlX3B1ZF9wYWdlKHB1ZF90ICpwdWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUFVEOyBpKyspCisJCWlmICghcHVkX25vbmUocHVkW2ldKSkKKwkJCXJldHVybiBmYWxzZTsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdWQpOworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgYm9vbCB1bm1hcF9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJcHRlX3QgKnB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgc3RhcnQpOwpAQCAtODA1LDYgKzgyMSwxNiBAQAogCSAqLwogfQogCitzdGF0aWMgdm9pZCB1bm1hcF9wZ2RfcmFuZ2UocGdkX3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJcGdkX3QgKnBnZF9lbnRyeSA9IHJvb3QgKyBwZ2RfaW5kZXgoYWRkcik7CisKKwl1bm1hcF9wdWRfcmFuZ2UocGdkX2VudHJ5LCBhZGRyLCBlbmQpOworCisJaWYgKHRyeV90b19mcmVlX3B1ZF9wYWdlKChwdWRfdCAqKXBnZF9wYWdlX3ZhZGRyKCpwZ2RfZW50cnkpKSkKKwkJcGdkX2NsZWFyKHBnZF9lbnRyeSk7Cit9CisKIHN0YXRpYyBpbnQgYWxsb2NfcHRlX3BhZ2UocG1kX3QgKnBtZCkKIHsKIAlwdGVfdCAqcHRlID0gKHB0ZV90ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9OT1RSQUNLKTsKQEAgLTk5OSw5ICsxMDI1LDggQEAKIHN0YXRpYyBpbnQgcG9wdWxhdGVfcGdkKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJcGdwcm90X3QgcGdwcm90ID0gX19wZ3Byb3QoX0tFUk5QR19UQUJMRSk7Ci0JYm9vbCBhbGxvY2RfcGdkID0gZmFsc2U7Ci0JcGdkX3QgKnBnZF9lbnRyeTsKIAlwdWRfdCAqcHVkID0gTlVMTDsJLyogc2h1dCB1cCBnY2MgKi8KKwlwZ2RfdCAqcGdkX2VudHJ5OwogCWludCByZXQ7CiAKIAlwZ2RfZW50cnkgPSBjcGEtPnBnZCArIHBnZF9pbmRleChhZGRyKTsKQEAgLTEwMTUsNyArMTA0MCw2IEBACiAJCQlyZXR1cm4gLTE7CiAKIAkJc2V0X3BnZChwZ2RfZW50cnksIF9fcGdkKF9fcGEocHVkKSB8IF9LRVJOUEdfVEFCTEUpKTsKLQkJYWxsb2NkX3BnZCA9IHRydWU7CiAJfQogCiAJcGdwcm90X3ZhbChwZ3Byb3QpICY9IH5wZ3Byb3RfdmFsKGNwYS0+bWFza19jbHIpOwpAQCAtMTAyMywxOSArMTA0NywxMSBAQAogCiAJcmV0ID0gcG9wdWxhdGVfcHVkKGNwYSwgYWRkciwgcGdkX2VudHJ5LCBwZ3Byb3QpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXVubWFwX3B1ZF9yYW5nZShwZ2RfZW50cnksIGFkZHIsCisJCXVubWFwX3BnZF9yYW5nZShjcGEtPnBnZCwgYWRkciwKIAkJCQlhZGRyICsgKGNwYS0+bnVtcGFnZXMgPDwgUEFHRV9TSElGVCkpOwotCi0JCWlmIChhbGxvY2RfcGdkKSB7Ci0JCQkvKgotCQkJICogSWYgSSBhbGxvY2F0ZWQgdGhpcyBQVUQgcGFnZSwgSSBjYW4ganVzdCBhcyB3ZWxsCi0JCQkgKiBmcmVlIGl0IGluIHRoaXMgZXJyb3IgcGF0aC4KLQkJCSAqLwotCQkJcGdkX2NsZWFyKHBnZF9lbnRyeSk7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHVkKTsKLQkJfQogCQlyZXR1cm4gcmV0OwogCX0KKwogCWNwYS0+bnVtcGFnZXMgPSByZXQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzc3LDEwICsxMzkzLDEwIEBACiAJY2FjaGUgPSBjYWNoZV9hdHRyKG1hc2tfc2V0KTsKIAogCS8qCi0JICogT24gc3VjY2VzcyB3ZSB1c2UgY2xmbHVzaCwgd2hlbiB0aGUgQ1BVIHN1cHBvcnRzIGl0IHRvCi0JICogYXZvaWQgdGhlIHdiaW5kdi4gSWYgdGhlIENQVSBkb2VzIG5vdCBzdXBwb3J0IGl0IGFuZCBpbiB0aGUKKwkgKiBPbiBzdWNjZXNzIHdlIHVzZSBDTEZMVVNILCB3aGVuIHRoZSBDUFUgc3VwcG9ydHMgaXQgdG8KKwkgKiBhdm9pZCB0aGUgV0JJTlZELiBJZiB0aGUgQ1BVIGRvZXMgbm90IHN1cHBvcnQgaXQgYW5kIGluIHRoZQogCSAqIGVycm9yIGNhc2Ugd2UgZmFsbCBiYWNrIHRvIGNwYV9mbHVzaF9hbGwgKHdoaWNoIHVzZXMKLQkgKiB3YmluZHYpOgorCSAqIFdCSU5WRCk6CiAJICovCiAJaWYgKCFyZXQgJiYgY3B1X2hhc19jbGZsdXNoKSB7CiAJCWlmIChjcGEuZmxhZ3MgJiAoQ1BBX1BBR0VTX0FSUkFZIHwgQ1BBX0FSUkFZKSkgewpAQCAtMTg2MSw2ICsxODc3LDEyIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAordm9pZCBrZXJuZWxfdW5tYXBfcGFnZXNfaW5fcGdkKHBnZF90ICpyb290LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkgICAgICAgdW5zaWduZWQgbnVtcGFnZXMpCit7CisJdW5tYXBfcGdkX3JhbmdlKHJvb3QsIGFkZHJlc3MsIGFkZHJlc3MgKyAobnVtcGFnZXMgPDwgUEFHRV9TSElGVCkpOworfQorCiAvKgogICogVGhlIHRlc3RjYXNlcyB1c2UgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZG4ndAogICogYmUgZXhwb3NlZCB0byB0aGUgcmVzdCBvZiB0aGUga2VybmVsLiBJbmNsdWRlIHRoZXNlIGRpcmVjdGx5IGhlcmUuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9zcmF0LmMgYi9hcmNoL3g4Ni9tbS9zcmF0LmMKaW5kZXggMTk1M2U5Yy4uNjYzMzhhNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vc3JhdC5jCisrKyBiL2FyY2gveDg2L21tL3NyYXQuYwpAQCAtNTIsMTIgKzUyLDE4IEBACiAJaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2xpdC0+bG9jYWxpdHlfY291bnQ7IGkrKykgewotCQlpZiAocHhtX3RvX25vZGUoaSkgPT0gTlVNQV9OT19OT0RFKQorCQljb25zdCBpbnQgZnJvbV9ub2RlID0gcHhtX3RvX25vZGUoaSk7CisKKwkJaWYgKGZyb21fbm9kZSA9PSBOVU1BX05PX05PREUpCiAJCQljb250aW51ZTsKKwogCQlmb3IgKGogPSAwOyBqIDwgc2xpdC0+bG9jYWxpdHlfY291bnQ7IGorKykgewotCQkJaWYgKHB4bV90b19ub2RlKGopID09IE5VTUFfTk9fTk9ERSkKKwkJCWNvbnN0IGludCB0b19ub2RlID0gcHhtX3RvX25vZGUoaik7CisKKwkJCWlmICh0b19ub2RlID09IE5VTUFfTk9fTk9ERSkKIAkJCQljb250aW51ZTsKLQkJCW51bWFfc2V0X2Rpc3RhbmNlKHB4bV90b19ub2RlKGkpLCBweG1fdG9fbm9kZShqKSwKKworCQkJbnVtYV9zZXRfZGlzdGFuY2UoZnJvbV9ub2RlLCB0b19ub2RlLAogCQkJCXNsaXQtPmVudHJ5W3NsaXQtPmxvY2FsaXR5X2NvdW50ICogaSArIGpdKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9NYWtlZmlsZSBiL2FyY2gveDg2L3BjaS9NYWtlZmlsZQppbmRleCBlMDYzZWVkLi41YzZmYzM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGNpL01ha2VmaWxlCkBAIC0xMyw5ICsxMyw2IEBACiAKIG9iai0kKENPTkZJR19TVEEyWDExKSAgICAgICAgICAgKz0gc3RhMngxMS1maXh1cC5vCiAKLW9iai0kKENPTkZJR19YODZfVklTV1MpCQkrPSB2aXN3cy5vCi0KLW9iai0kKENPTkZJR19YODZfTlVNQVEpCQkrPSBudW1hcV8zMi5vCiBvYmotJChDT05GSUdfWDg2X05VTUFDSElQKQkrPSBudW1hY2hpcC5vCiAKIG9iai0kKENPTkZJR19YODZfSU5URUxfTUlEKQkrPSBpbnRlbF9taWRfcGNpLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hY3BpLmMgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCmluZGV4IDRmMjVlYzAuLjAxZWRhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hY3BpLmMKKysrIGIvYXJjaC94ODYvcGNpL2FjcGkuYwpAQCAtMjE4LDkgKzIxOCw4IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGFjcGlfc3RhdHVzCi1yZXNvdXJjZV90b19hZGRyKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqYWRkcikKK3N0YXRpYyBhY3BpX3N0YXR1cyByZXNvdXJjZV90b19hZGRyKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICphZGRyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCAqbWVtb3J5MjQ7CkBAIC0yNjUsOCArMjY0LDcgQEAKIAlyZXR1cm4gQUVfRVJST1I7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotY291bnRfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFjcGlfcmVzLCB2b2lkICpkYXRhKQorc3RhdGljIGFjcGlfc3RhdHVzIGNvdW50X3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICphY3BpX3Jlcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IGRhdGE7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHI7CkBAIC0yNzgsOCArMjc2LDcgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cwotc2V0dXBfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFjcGlfcmVzLCB2b2lkICpkYXRhKQorc3RhdGljIGFjcGlfc3RhdHVzIHNldHVwX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICphY3BpX3Jlcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IGRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC00MzUsOSArNDMyLDkgQEAKIAlfX3JlbGVhc2VfcGNpX3Jvb3RfaW5mbyhpbmZvKTsKIH0KIAotc3RhdGljIHZvaWQKLXByb2JlX3BjaV9yb290X2luZm8oc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAotCQkgICAgaW50IGJ1c251bSwgaW50IGRvbWFpbikKK3N0YXRpYyB2b2lkIHByb2JlX3BjaV9yb290X2luZm8oc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCQkJaW50IGJ1c251bSwgaW50IGRvbWFpbikKIHsKIAlzaXplX3Qgc2l6ZTsKIApAQCAtNDczLDE2ICs0NzAsMTMgQEAKIHN0cnVjdCBwY2lfYnVzICpwY2lfYWNwaV9zY2FuX3Jvb3Qoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSByb290LT5kZXZpY2U7Ci0Jc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8gPSBOVUxMOworCXN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvOwogCWludCBkb21haW4gPSByb290LT5zZWdtZW50OwogCWludCBidXNudW0gPSByb290LT5zZWNvbmRhcnkuc3RhcnQ7CiAJTElTVF9IRUFEKHJlc291cmNlcyk7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKIAlzdHJ1Y3QgcGNpX3N5c2RhdGEgKnNkOwogCWludCBub2RlOwotI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKLQlpbnQgcHhtOwotI2VuZGlmCiAKIAlpZiAocGNpX2lnbm9yZV9zZWcpCiAJCWRvbWFpbiA9IDA7CkBAIC00OTQsMTkgKzQ4OCwxMiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlub2RlID0gLTE7Ci0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCXB4bSA9IGFjcGlfZ2V0X3B4bShkZXZpY2UtPmhhbmRsZSk7Ci0JaWYgKHB4bSA+PSAwKQotCQlub2RlID0gcHhtX3RvX25vZGUocHhtKTsKLQlpZiAobm9kZSAhPSAtMSkKLQkJc2V0X21wX2J1c190b19ub2RlKGJ1c251bSwgbm9kZSk7Ci0JZWxzZQotI2VuZGlmCi0JCW5vZGUgPSBnZXRfbXBfYnVzX3RvX25vZGUoYnVzbnVtKTsKKwlub2RlID0gYWNwaV9nZXRfbm9kZShkZXZpY2UtPmhhbmRsZSk7CisJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQorCQlub2RlID0geDg2X3BjaV9yb290X2J1c19ub2RlKGJ1c251bSk7CiAKLQlpZiAobm9kZSAhPSAtMSAmJiAhbm9kZV9vbmxpbmUobm9kZSkpCi0JCW5vZGUgPSAtMTsKKwlpZiAobm9kZSAhPSBOVU1BX05PX05PREUgJiYgIW5vZGVfb25saW5lKG5vZGUpKQorCQlub2RlID0gTlVNQV9OT19OT0RFOwogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKSB7CkBAIC01MTksMTUgKzUwNiwxMiBAQAogCXNkLT5kb21haW4gPSBkb21haW47CiAJc2QtPm5vZGUgPSBub2RlOwogCXNkLT5jb21wYW5pb24gPSBkZXZpY2U7Ci0JLyoKLQkgKiBNYXliZSB0aGUgZGVzaXJlZCBwY2kgYnVzIGhhcyBiZWVuIGFscmVhZHkgc2Nhbm5lZC4gSW4gc3VjaCBjYXNlCi0JICogaXQgaXMgdW5uZWNlc3NhcnkgdG8gc2NhbiB0aGUgcGNpIGJ1cyB3aXRoIHRoZSBnaXZlbiBkb21haW4sYnVzbnVtLgotCSAqLworCiAJYnVzID0gcGNpX2ZpbmRfYnVzKGRvbWFpbiwgYnVzbnVtKTsKIAlpZiAoYnVzKSB7CiAJCS8qCi0JCSAqIElmIHRoZSBkZXNpcmVkIGJ1cyBleGl0cywgdGhlIGNvbnRlbnQgb2YgYnVzLT5zeXNkYXRhIHdpbGwKLQkJICogYmUgcmVwbGFjZWQgYnkgc2QuCisJCSAqIElmIHRoZSBkZXNpcmVkIGJ1cyBoYXMgYmVlbiBzY2FubmVkIGFscmVhZHksIHJlcGxhY2UKKwkJICogaXRzIGJ1cy0+c3lzZGF0YS4KIAkJICovCiAJCW1lbWNweShidXMtPnN5c2RhdGEsIHNkLCBzaXplb2YoKnNkKSk7CiAJCWtmcmVlKGluZm8pOwpAQCAtNTcyLDE1ICs1NTYsOCBAQAogCQkJcGNpZV9idXNfY29uZmlndXJlX3NldHRpbmdzKGNoaWxkKTsKIAl9CiAKLQlpZiAoYnVzICYmIG5vZGUgIT0gLTEpIHsKLSNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JCWlmIChweG0gPj0gMCkKLQkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LAotCQkJCSAgICJvbiBOVU1BIG5vZGUgJWQgKHB4bSAlZClcbiIsIG5vZGUsIHB4bSk7Ci0jZWxzZQorCWlmIChidXMgJiYgbm9kZSAhPSBOVU1BX05PX05PREUpCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAib24gTlVNQSBub2RlICVkXG4iLCBub2RlKTsKLSNlbmRpZgotCX0KIAogCXJldHVybiBidXM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jIGIvYXJjaC94ODYvcGNpL2FtZF9idXMuYwppbmRleCBhNDhiZTk4Li5hMzEzYTdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCisrKyBiL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKQEAgLTQ0LDE1ICs0NCw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfbXBfYnVzX3JhbmdlX3RvX25vZGUoaW50IG1pbl9idXMsIGludCBtYXhfYnVzLCBpbnQgbm9kZSkKLXsKLSNpZmRlZiBDT05GSUdfTlVNQQotCWludCBqOwotCi0JZm9yIChqID0gbWluX2J1czsgaiA8PSBtYXhfYnVzOyBqKyspCi0JCXNldF9tcF9idXNfdG9fbm9kZShqLCBub2RlKTsKLSNlbmRpZgotfQogLyoqCiAgKiBlYXJseV9maWxsX21wX2J1c190b19ub2RlKCkKICAqIGNhbGxlZCBiZWZvcmUgcGNpYmlvc19zY2FuX3Jvb3QgYW5kIHBjaV9zY2FuX2J1cwpAQCAtMTE3LDcgKzEwOCw2IEBACiAJCW1pbl9idXMgPSAocmVnID4+IDE2KSAmIDB4ZmY7CiAJCW1heF9idXMgPSAocmVnID4+IDI0KSAmIDB4ZmY7CiAJCW5vZGUgPSAocmVnID4+IDQpICYgMHgwNzsKLQkJc2V0X21wX2J1c19yYW5nZV90b19ub2RlKG1pbl9idXMsIG1heF9idXMsIG5vZGUpOwogCQlsaW5rID0gKHJlZyA+PiA4KSAmIDB4MDM7CiAKIAkJaW5mbyA9IGFsbG9jX3BjaV9yb290X2luZm8obWluX2J1cywgbWF4X2J1cywgbm9kZSwgbGluayk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYnVzX251bWEuYyBiL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jCmluZGV4IGMyNzM1ZmUuLmYzYTJjZmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jCisrKyBiL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jCkBAIC0xMCw5ICsxMCw2IEBACiB7CiAJc3RydWN0IHBjaV9yb290X2luZm8gKmluZm87CiAKLQlpZiAobGlzdF9lbXB0eSgmcGNpX3Jvb3RfaW5mb3MpKQotCQlyZXR1cm4gTlVMTDsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJnBjaV9yb290X2luZm9zLCBsaXN0KQogCQlpZiAoaW5mby0+YnVzbi5zdGFydCA9PSBidXMpCiAJCQlyZXR1cm4gaW5mbzsKQEAgLTIwLDYgKzE3LDE2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK2ludCB4ODZfcGNpX3Jvb3RfYnVzX25vZGUoaW50IGJ1cykKK3sKKwlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IHg4Nl9maW5kX3BjaV9yb290X2luZm8oYnVzKTsKKworCWlmICghaW5mbykKKwkJcmV0dXJuIE5VTUFfTk9fTk9ERTsKKworCXJldHVybiBpbmZvLT5ub2RlOworfQorCiB2b2lkIHg4Nl9wY2lfcm9vdF9idXNfcmVzb3VyY2VzKGludCBidXMsIHN0cnVjdCBsaXN0X2hlYWQgKnJlc291cmNlcykKIHsKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbyA9IHg4Nl9maW5kX3BjaV9yb290X2luZm8oYnVzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCA5ODFjMmRiLi4wNTlhNzZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCkBAIC00NTYsMTkgKzQ1NiwyNSBAQAogCWRtaV9jaGVja19zeXN0ZW0ocGNpcHJvYmVfZG1pX3RhYmxlKTsKIH0KIAotc3RydWN0IHBjaV9idXMgKnBjaWJpb3Nfc2Nhbl9yb290KGludCBidXNudW0pCit2b2lkIHBjaWJpb3Nfc2Nhbl9yb290KGludCBidXNudW0pCiB7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcGNpX3N5c2RhdGEgKnNkOworCUxJU1RfSEVBRChyZXNvdXJjZXMpOwogCi0Jd2hpbGUgKChidXMgPSBwY2lfZmluZF9uZXh0X2J1cyhidXMpKSAhPSBOVUxMKSB7Ci0JCWlmIChidXMtPm51bWJlciA9PSBidXNudW0pIHsKLQkJCS8qIEFscmVhZHkgc2Nhbm5lZCAqLwotCQkJcmV0dXJuIGJ1czsKLQkJfQorCXNkID0ga3phbGxvYyhzaXplb2YoKnNkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogT09NLCBza2lwcGluZyBQQ0kgYnVzICUwMnhcbiIsIGJ1c251bSk7CisJCXJldHVybjsKIAl9Ci0KLQlyZXR1cm4gcGNpX3NjYW5fYnVzX29uX25vZGUoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLAotCQkJCQlnZXRfbXBfYnVzX3RvX25vZGUoYnVzbnVtKSk7CisJc2QtPm5vZGUgPSB4ODZfcGNpX3Jvb3RfYnVzX25vZGUoYnVzbnVtKTsKKwl4ODZfcGNpX3Jvb3RfYnVzX3Jlc291cmNlcyhidXNudW0sICZyZXNvdXJjZXMpOworCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIChidXMgJTAyeClcbiIsIGJ1c251bSk7CisJYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBzZCwgJnJlc291cmNlcyk7CisJaWYgKCFidXMpIHsKKwkJcGNpX2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VzKTsKKwkJa2ZyZWUoc2QpOworCX0KIH0KIAogdm9pZCBfX2luaXQgcGNpYmlvc19zZXRfY2FjaGVfbGluZV9zaXplKHZvaWQpCkBAIC01NjEsNyArNTY3LDYgQEAKIAkJcGNpX3Byb2JlIHw9IFBDSV9QUk9CRV9OT0VBUkxZOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0jaWZuZGVmIENPTkZJR19YODZfVklTV1MKIAllbHNlIGlmICghc3RyY21wKHN0ciwgInVzZXBpcnFtYXNrIikpIHsKIAkJcGNpX3Byb2JlIHw9IFBDSV9VU0VfUElSUV9NQVNLOwogCQlyZXR1cm4gTlVMTDsKQEAgLTU3MSw5ICs1NzYsNyBAQAogCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAibGFzdGJ1cz0iLCA4KSkgewogCQlwY2liaW9zX2xhc3RfYnVzID0gc2ltcGxlX3N0cnRvbChzdHIrOCwgTlVMTCwgMCk7CiAJCXJldHVybiBOVUxMOwotCX0KLSNlbmRpZgotCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAicm9tIikpIHsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAicm9tIikpIHsKIAkJcGNpX3Byb2JlIHw9IFBDSV9BU1NJR05fUk9NUzsKIAkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vcm9tIikpIHsKQEAgLTY3NywxMDUgKzY4MCwzIEBACiAJZWxzZQogCQlyZXR1cm4gMDsKIH0KLQotc3RydWN0IHBjaV9idXMgKnBjaV9zY2FuX2J1c19vbl9ub2RlKGludCBidXNubywgc3RydWN0IHBjaV9vcHMgKm9wcywgaW50IG5vZGUpCi17Ci0JTElTVF9IRUFEKHJlc291cmNlcyk7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7Ci0Jc3RydWN0IHBjaV9zeXNkYXRhICpzZDsKLQotCS8qCi0JICogQWxsb2NhdGUgcGVyLXJvb3QtYnVzIChub3QgcGVyIGJ1cykgYXJjaC1zcGVjaWZpYyBkYXRhLgotCSAqIFRPRE86IGxlYWs7IHRoaXMgbWVtb3J5IGlzIG5ldmVyIGZyZWVkLgotCSAqIEl0J3MgYXJndWFibGUgd2hldGhlciBpdCdzIHdvcnRoIHRoZSB0cm91YmxlIHRvIGNhcmUuCi0JICovCi0Jc2QgPSBremFsbG9jKHNpemVvZigqc2QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBPT00sIHNraXBwaW5nIFBDSSBidXMgJTAyeFxuIiwgYnVzbm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2QtPm5vZGUgPSBub2RlOwotCXg4Nl9wY2lfcm9vdF9idXNfcmVzb3VyY2VzKGJ1c25vLCAmcmVzb3VyY2VzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZSAoYnVzICUwMngpXG4iLCBidXNubyk7Ci0JYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgYnVzbm8sIG9wcywgc2QsICZyZXNvdXJjZXMpOwotCWlmICghYnVzKSB7Ci0JCXBjaV9mcmVlX3Jlc291cmNlX2xpc3QoJnJlc291cmNlcyk7Ci0JCWtmcmVlKHNkKTsKLQl9Ci0KLQlyZXR1cm4gYnVzOwotfQotCi1zdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShpbnQgYnVzbm8pCi17Ci0JcmV0dXJuIHBjaV9zY2FuX2J1c19vbl9ub2RlKGJ1c25vLCAmcGNpX3Jvb3Rfb3BzLCAtMSk7Ci19Ci0KLS8qCi0gKiBOVU1BIGluZm8gZm9yIFBDSSBidXNzZXMKLSAqCi0gKiBFYXJseSBhcmNoIGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gcmVhc29uYWJsZSB2YWx1ZXMgaGVyZS4KLSAqIEEgbm9kZSBpZCBvZiAiLTEiIG1lYW5zICJ1c2UgY3VycmVudCBub2RlIi4gIEluIG90aGVyIHdvcmRzLCBpZiBhIGJ1cwotICogaGFzIGEgLTEgbm9kZSBpZCwgaXQncyBub3QgdGlnaHRseSBjb3VwbGVkIHRvIGFueSBwYXJ0aWN1bGFyIGNodW5rCi0gKiBvZiBtZW1vcnkgKGFzIGlzIHRoZSBjYXNlIG9uIHNvbWUgTmVoYWxlbSBzeXN0ZW1zKS4KLSAqLwotI2lmZGVmIENPTkZJR19OVU1BCi0KLSNkZWZpbmUgQlVTX05SIDI1NgotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCi1zdGF0aWMgaW50IG1wX2J1c190b19ub2RlW0JVU19OUl0gPSB7Ci0JWzAgLi4uIEJVU19OUiAtIDFdID0gLTEKLX07Ci0KLXZvaWQgc2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0sIGludCBub2RlKQotewotCWlmIChidXNudW0gPj0gMCAmJiAgYnVzbnVtIDwgQlVTX05SKQotCQltcF9idXNfdG9fbm9kZVtidXNudW1dID0gbm9kZTsKLX0KLQotaW50IGdldF9tcF9idXNfdG9fbm9kZShpbnQgYnVzbnVtKQotewotCWludCBub2RlID0gLTE7Ci0KLQlpZiAoYnVzbnVtIDwgMCB8fCBidXNudW0gPiAoQlVTX05SIC0gMSkpCi0JCXJldHVybiBub2RlOwotCi0Jbm9kZSA9IG1wX2J1c190b19ub2RlW2J1c251bV07Ci0KLQkvKgotCSAqIGxldCBudW1hX25vZGVfaWQgdG8gZGVjaWRlIGl0IGxhdGVyIGluIGRtYV9hbGxvY19wYWdlcwotCSAqIGlmIHRoZXJlIGlzIG5vIHJhbSBvbiB0aGF0IG5vZGUKLQkgKi8KLQlpZiAobm9kZSAhPSAtMSAmJiAhbm9kZV9vbmxpbmUobm9kZSkpCi0JCW5vZGUgPSAtMTsKLQotCXJldHVybiBub2RlOwotfQotCi0jZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCi0KLXN0YXRpYyBpbnQgbXBfYnVzX3RvX25vZGVbQlVTX05SXSA9IHsKLQlbMCAuLi4gQlVTX05SIC0gMV0gPSAtMQotfTsKLQotdm9pZCBzZXRfbXBfYnVzX3RvX25vZGUoaW50IGJ1c251bSwgaW50IG5vZGUpCi17Ci0JaWYgKGJ1c251bSA+PSAwICYmICBidXNudW0gPCBCVVNfTlIpCi0JbXBfYnVzX3RvX25vZGVbYnVzbnVtXSA9ICh1bnNpZ25lZCBjaGFyKSBub2RlOwotfQotCi1pbnQgZ2V0X21wX2J1c190b19ub2RlKGludCBidXNudW0pCi17Ci0JaW50IG5vZGU7Ci0KLQlpZiAoYnVzbnVtIDwgMCB8fCBidXNudW0gPiAoQlVTX05SIC0gMSkpCi0JCXJldHVybiAwOwotCW5vZGUgPSBtcF9idXNfdG9fbm9kZVtidXNudW1dOwotCXJldHVybiBub2RlOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwotCi0jZW5kaWYgLyogQ09ORklHX05VTUEgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9maXh1cC5jIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKaW5kZXggYmNhOWU4NS4uOTRhZTlhZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2ZpeHVwLmMKKysrIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKQEAgLTI1LDkgKzI1LDkgQEAKIAkJZGV2X2RiZygmZC0+ZGV2LCAiaTQ1ME5YIFBYQiAlZDogJTAyeC8lMDJ4LyUwMnhcbiIsIHB4YiwgYnVzbm8sCiAJCQlzdWJhLCBzdWJiKTsKIAkJaWYgKGJ1c25vKQotCQkJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShidXNubyk7CS8qIEJ1cyBBICovCisJCQlwY2liaW9zX3NjYW5fcm9vdChidXNubyk7CS8qIEJ1cyBBICovCiAJCWlmIChzdWJhIDwgc3ViYikKLQkJCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoc3ViYSsxKTsJLyogQnVzIEIgKi8KKwkJCXBjaWJpb3Nfc2Nhbl9yb290KHN1YmErMSk7CS8qIEJ1cyBCICovCiAJfQogCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKIH0KQEAgLTQyLDcgKzQyLDcgQEAKIAl1OCBidXNubzsKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCAweDRhLCAmYnVzbm8pOwogCWRldl9pbmZvKCZkLT5kZXYsICJpNDQwS1gvR1ggaG9zdCBicmlkZ2U7IHNlY29uZGFyeSBidXMgJTAyeFxuIiwgYnVzbm8pOwotCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoYnVzbm8pOworCXBjaWJpb3Nfc2Nhbl9yb290KGJ1c25vKTsKIAlwY2liaW9zX2xhc3RfYnVzID0gLTE7CiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1NEdYLCBwY2lfZml4dXBfaTQ1MGd4KTsKQEAgLTMxMyw5ICszMTMsMTAgQEAKICAqIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgYm9vdCB2aWRlbwogICogY2FyZCB3aXRoIHRoaXMgY29weS4gT24gbGFwdG9wcyB0aGlzIGNvcHkgaGFzIHRvIGJlIHVzZWQgc2luY2UKICAqIHRoZSBtYWluIFJPTSBtYXkgYmUgY29tcHJlc3NlZCBvciBjb21iaW5lZCB3aXRoIGFub3RoZXIgaW1hZ2UuCi0gKiBTZWUgcGNpX21hcF9yb20oKSBmb3IgdXNlIG9mIHRoaXMgZmxhZy4gSU9SRVNPVVJDRV9ST01fU0hBRE9XCi0gKiBpcyBtYXJrZWQgaGVyZSBzaW5jZSB0aGUgYm9vdCB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB0aGUgb25seSBlbmFibGVkCi0gKiB2aWRlbyBkZXZpY2UgYXQgdGhpcyBwb2ludC4KKyAqIFNlZSBwY2lfbWFwX3JvbSgpIGZvciB1c2Ugb2YgdGhpcyBmbGFnLiBCZWZvcmUgbWFya2luZyB0aGUgZGV2aWNlCisgKiB3aXRoIElPUkVTT1VSQ0VfUk9NX1NIQURPVyBjaGVjayBpZiBhIHZnYV9kZWZhdWx0X2RldmljZSBpcyBhbHJlYWR5IHNldAorICogYnkgZWl0aGVyIGFyY2ggY2RlIG9yIHZnYS1hcmJpdHJhdGlvbiwgaWYgc28gb25seSBhcHBseSB0aGUgZml4dXAgdG8gdGhpcworICogYWxyZWFkeSBkZXRlcm1pbmVkIHByaW1hcnkgdmlkZW8gY2FyZC4KICAqLwogCiBzdGF0aWMgdm9pZCBwY2lfZml4dXBfdmlkZW8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC0zNDYsMTIgKzM0NywxMyBAQAogCQl9CiAJCWJ1cyA9IGJ1cy0+cGFyZW50OwogCX0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbmZpZyk7Ci0JaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKLQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fU0hBRE9XOwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJCb290IHZpZGVvIGRldmljZVxuIik7Ci0JCWlmICghdmdhX2RlZmF1bHRfZGV2aWNlKCkpCisJaWYgKCF2Z2FfZGVmYXVsdF9kZXZpY2UoKSB8fCBwZGV2ID09IHZnYV9kZWZhdWx0X2RldmljZSgpKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29uZmlnKTsKKwkJaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKKwkJCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX1NIQURPVzsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgIkJvb3QgdmlkZW8gZGV2aWNlXG4iKTsKIAkJCXZnYV9zZXRfZGVmYXVsdF9kZXZpY2UocGRldik7CisJCX0KIAl9CiB9CiBERUNMQVJFX1BDSV9GSVhVUF9DTEFTU19GSU5BTChQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2lycS5jIGIvYXJjaC94ODYvcGNpL2lycS5jCmluZGV4IDM3MmU5YjguLjg0MTEyZjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pcnEuYworKysgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKQEAgLTEzNiwxMyArMTM2LDkgQEAKIAkJYnVzbWFwW2UtPmJ1c10gPSAxOwogCX0KIAlmb3IgKGkgPSAxOyBpIDwgMjU2OyBpKyspIHsKLQkJaW50IG5vZGU7CiAJCWlmICghYnVzbWFwW2ldIHx8IHBjaV9maW5kX2J1cygwLCBpKSkKIAkJCWNvbnRpbnVlOwotCQlub2RlID0gZ2V0X21wX2J1c190b19ub2RlKGkpOwotCQlpZiAocGNpX3NjYW5fYnVzX29uX25vZGUoaSwgJnBjaV9yb290X29wcywgbm9kZSkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IERpc2NvdmVyZWQgcHJpbWFyeSBwZWVyICIKLQkJCSAgICAgICAiYnVzICUwMnggW0lSUV1cbiIsIGkpOworCQlwY2liaW9zX3NjYW5fcm9vdChpKTsKIAl9CiAJcGNpYmlvc19sYXN0X2J1cyA9IC0xOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2xlZ2FjeS5jIGIvYXJjaC94ODYvcGNpL2xlZ2FjeS5jCmluZGV4IDRkYjk2ZmIuLjViNjYyYzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9sZWdhY3kuYworKysgYi9hcmNoL3g4Ni9wY2kvbGVnYWN5LmMKQEAgLTM3LDE5ICszNywxNyBAQAogdm9pZCBwY2liaW9zX3NjYW5fc3BlY2lmaWNfYnVzKGludCBidXNuKQogewogCWludCBkZXZmbjsKLQlsb25nIG5vZGU7CiAJdTMyIGw7CiAKIAlpZiAocGNpX2ZpbmRfYnVzKDAsIGJ1c24pKQogCQlyZXR1cm47CiAKLQlub2RlID0gZ2V0X21wX2J1c190b19ub2RlKGJ1c24pOwogCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDI1NjsgZGV2Zm4gKz0gOCkgewogCQlpZiAoIXJhd19wY2lfcmVhZCgwLCBidXNuLCBkZXZmbiwgUENJX1ZFTkRPUl9JRCwgMiwgJmwpICYmCiAJCSAgICBsICE9IDB4MDAwMCAmJiBsICE9IDB4ZmZmZikgewogCQkJREJHKCJGb3VuZCBkZXZpY2UgYXQgJTAyeDolMDJ4IFslMDR4XVxuIiwgYnVzbiwgZGV2Zm4sIGwpOwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBEaXNjb3ZlcmVkIHBlZXIgYnVzICUwMnhcbiIsIGJ1c24pOwotCQkJcGNpX3NjYW5fYnVzX29uX25vZGUoYnVzbiwgJnBjaV9yb290X29wcywgbm9kZSk7CisJCQlwY2liaW9zX3NjYW5fcm9vdChidXNuKTsKIAkJCXJldHVybjsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9udW1hcV8zMi5jIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzIyOWYuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIG51bWFxXzMyLmMgLSBMb3ctbGV2ZWwgUENJIGFjY2VzcyBmb3IgTlVNQS1RIG1hY2hpbmVzCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgotI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL21wc3BlYy5oPgotI2luY2x1ZGUgPGFzbS9wY2lfeDg2Lmg+Ci0jaW5jbHVkZSA8YXNtL251bWFxLmg+Ci0KLSNkZWZpbmUgQlVTMlFVQUQoZ2xvYmFsKSAobXBfYnVzX2lkX3RvX25vZGVbZ2xvYmFsXSkKLQotI2RlZmluZSBCVVMyTE9DQUwoZ2xvYmFsKSAobXBfYnVzX2lkX3RvX2xvY2FsW2dsb2JhbF0pCi0KLSNkZWZpbmUgUVVBRExPQ0FMMkJVUyhxdWFkLGxvY2FsKSAocXVhZF9sb2NhbF90b19tcF9idXNfaWRbcXVhZF1bbG9jYWxdKQotCi0jZGVmaW5lIFBDSV9DT05GMV9NUV9BRERSRVNTKGJ1cywgZGV2Zm4sIHJlZykgXAotCSgweDgwMDAwMDAwIHwgKEJVUzJMT0NBTChidXMpIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8IChyZWcgJiB+MykpCi0KLXN0YXRpYyB2b2lkIHdyaXRlX2NmOCh1bnNpZ25lZCBidXMsIHVuc2lnbmVkIGRldmZuLCB1bnNpZ25lZCByZWcpCi17Ci0JdW5zaWduZWQgdmFsID0gUENJX0NPTkYxX01RX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKTsKLQlpZiAoeHF1YWRfcG9ydGlvKQotCQl3cml0ZWwodmFsLCBYUVVBRF9QT1JUX0FERFIoMHhjZjgsIEJVUzJRVUFEKGJ1cykpKTsKLQllbHNlCi0JCW91dGwodmFsLCAweENGOCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpX2NvbmYxX21xX3JlYWQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKLQkJCSAgICAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgKnZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9pZCAqYWRyIF9faW9tZW0gPSBYUVVBRF9QT1JUX0FERFIoMHhjZmMsIEJVUzJRVUFEKGJ1cykpOwotCi0JV0FSTl9PTihzZWcpOwotCWlmICghdmFsdWUgfHwgKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7Ci0KLQl3cml0ZV9jZjgoYnVzLCBkZXZmbiwgcmVnKTsKLQotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJKnZhbHVlID0gcmVhZGIoYWRyICsgKHJlZyAmIDMpKTsKLQkJZWxzZQotCQkJKnZhbHVlID0gaW5iKDB4Q0ZDICsgKHJlZyAmIDMpKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJKnZhbHVlID0gcmVhZHcoYWRyICsgKHJlZyAmIDIpKTsKLQkJZWxzZQotCQkJKnZhbHVlID0gaW53KDB4Q0ZDICsgKHJlZyAmIDIpKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJKnZhbHVlID0gcmVhZGwoYWRyKTsKLQkJZWxzZQotCQkJKnZhbHVlID0gaW5sKDB4Q0ZDKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpX2NvbmYxX21xX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZvaWQgKmFkciBfX2lvbWVtID0gWFFVQURfUE9SVF9BRERSKDB4Y2ZjLCBCVVMyUVVBRChidXMpKTsKLQotCVdBUk5fT04oc2VnKTsKLQlpZiAoKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwotCi0Jd3JpdGVfY2Y4KGJ1cywgZGV2Zm4sIHJlZyk7Ci0KLQlzd2l0Y2ggKGxlbikgewotCWNhc2UgMToKLQkJaWYgKHhxdWFkX3BvcnRpbykKLQkJCXdyaXRlYih2YWx1ZSwgYWRyICsgKHJlZyAmIDMpKTsKLQkJZWxzZQotCQkJb3V0YigodTgpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDMpKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJd3JpdGV3KHZhbHVlLCBhZHIgKyAocmVnICYgMikpOwotCQllbHNlCi0JCQlvdXR3KCh1MTYpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDIpKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZiAoeHF1YWRfcG9ydGlvKQotCQkJd3JpdGVsKHZhbHVlLCBhZHIgKyByZWcpOwotCQllbHNlCi0JCQlvdXRsKCh1MzIpdmFsdWUsIDB4Q0ZDKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSN1bmRlZiBQQ0lfQ09ORjFfTVFfQUREUkVTUwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9kaXJlY3RfY29uZjFfbXEgPSB7Ci0JLnJlYWQJPSBwY2lfY29uZjFfbXFfcmVhZCwKLQkud3JpdGUJPSBwY2lfY29uZjFfbXFfd3JpdGUKLX07Ci0KLQotc3RhdGljIHZvaWQgcGNpX2ZpeHVwX2k0NTBueChzdHJ1Y3QgcGNpX2RldiAqZCkKLXsKLQkvKgotCSAqIGk0NTBOWCAtLSBGaW5kIGFuZCBzY2FuIGFsbCBzZWNvbmRhcnkgYnVzZXMgb24gYWxsIFBYQidzLgotCSAqLwotCWludCBweGIsIHJlZzsKLQl1OCBidXNubywgc3ViYSwgc3ViYjsKLQlpbnQgcXVhZCA9IEJVUzJRVUFEKGQtPmJ1cy0+bnVtYmVyKTsKLQotCWRldl9pbmZvKCZkLT5kZXYsICJzZWFyY2hpbmcgZm9yIGk0NTBOWCBob3N0IGJyaWRnZXNcbiIpOwotCXJlZyA9IDB4ZDA7Ci0JZm9yKHB4Yj0wOyBweGI8MjsgcHhiKyspIHsKLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZidXNubyk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYSk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYik7Ci0JCWRldl9kYmcoJmQtPmRldiwgImk0NTBOWCBQWEIgJWQ6ICUwMngvJTAyeC8lMDJ4XG4iLAotCQkJcHhiLCBidXNubywgc3ViYSwgc3ViYik7Ci0JCWlmIChidXNubykgewotCQkJLyogQnVzIEEgKi8KLQkJCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoUVVBRExPQ0FMMkJVUyhxdWFkLCBidXNubykpOwotCQl9Ci0JCWlmIChzdWJhIDwgc3ViYikgewotCQkJLyogQnVzIEIgKi8KLQkJCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEoUVVBRExPQ0FMMkJVUyhxdWFkLCBzdWJhKzEpKTsKLQkJfQotCX0KLQlwY2liaW9zX2xhc3RfYnVzID0gLTE7Ci19Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MU5YLCBwY2lfZml4dXBfaTQ1MG54KTsKLQotaW50IF9faW5pdCBwY2lfbnVtYXFfaW5pdCh2b2lkKQotewotCWludCBxdWFkOwotCi0JcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMV9tcTsKLQotCXBjaWJpb3Nfc2Nhbl9yb290KDApOwotCWlmIChudW1fb25saW5lX25vZGVzKCkgPiAxKQotCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShxdWFkKSB7Ci0JCQlpZiAocXVhZCA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJcHJpbnRrKCJTY2FubmluZyBQQ0kgYnVzICVkIGZvciBxdWFkICVkXG4iLCAKLQkJCQlRVUFETE9DQUwyQlVTKHF1YWQsMCksIHF1YWQpOwotCQkJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShRVUFETE9DQUwyQlVTKHF1YWQsIDApKTsKLQkJfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3Zpc3dzLmMgYi9hcmNoL3g4Ni9wY2kvdmlzd3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2ZDJhNi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9wY2kvdmlzd3MuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKglMb3ctTGV2ZWwgUENJIFN1cHBvcnQgZm9yIFNHSSBWaXN1YWwgV29ya3N0YXRpb24KLSAqCi0gKgkoYykgMTk5OS0tMjAwMCBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KLSNpbmNsdWRlIDxhc20vdmlzd3MvY29iYWx0Lmg+Ci0jaW5jbHVkZSA8YXNtL3Zpc3dzL2xpdGhpdW0uaD4KLQotc3RhdGljIGludCBwY2lfdmlzd3NfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgdm9pZCBwY2lfdmlzd3NfZGlzYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9Ci0KLS8qIGludCAoKnBjaWJpb3NfZW5hYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldikgPSAmcGNpX3Zpc3dzX2VuYWJsZV9pcnE7ICovCi0vKiB2b2lkICgqcGNpYmlvc19kaXNhYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldikgPSAmcGNpX3Zpc3dzX2Rpc2FibGVfaXJxOyAqLwotCi0vKiB2b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkge30gKi8KLQotCi11bnNpZ25lZCBpbnQgcGNpX2J1czAsIHBjaV9idXMxOwotCi1zdGF0aWMgaW50IF9faW5pdCB2aXN3c19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlpbnQgaXJxLCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwotCi0JcGluLS07Ci0KLQkvKiBOb3RoaW5nIHVzZWZ1bCBhdCBQSUlYNCBwaW4gMSAqLwotCWlmIChidXMgPT0gcGNpX2J1czAgJiYgc2xvdCA9PSA0ICYmIHBpbiA9PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBQSUlYNCBVU0IgaXMgb24gQnVzIDAsIFNsb3QgNCwgTGluZSAzICovCi0JaWYgKGJ1cyA9PSBwY2lfYnVzMCAmJiBzbG90ID09IDQgJiYgcGluID09IDMpIHsKLQkJaXJxID0gQ09fSVJRKENPX0FQSUNfUElJWDRfVVNCKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogRmlyc3QgcGluIHNwcmVhZCBkb3duIDEgQVBJQyBlbnRyeSBwZXIgc2xvdCAqLwotCWlmIChwaW4gPT0gMCkgewotCQlpcnEgPSBDT19JUlEoKGJ1cyA9PSBwY2lfYnVzMCA/IENPX0FQSUNfUENJQl9CQVNFMCA6Ci0JCQkJCQlDT19BUElDX1BDSUFfQkFTRTApICsgc2xvdCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIGxpbmVzIDEsMiwzIGZyb20gYW55IHNsb3QgaXMgc2hhcmVkIGluIHRoaXMgdHdpcmx5IHBhdHRlcm4gKi8KLQlpZiAoYnVzID09IHBjaV9idXMxKSB7Ci0JCS8qIGxpbmVzIDEtMyBmcm9tIGRldmljZXMgMCAxIHJvdGF0ZSBvdmVyIDIgYXBpYyBlbnRyaWVzICovCi0JCWlycSA9IENPX0lSUShDT19BUElDX1BDSUFfQkFTRTEyMyArICgoc2xvdCArIChwaW4gLSAxKSkgJSAyKSk7Ci0JfSBlbHNlIHsgLyogYnVzID09IHBjaV9idXMwICovCi0JCS8qIGxpbmVzIDEtMyBmcm9tIGRldmljZXMgMC0zIHJvdGF0ZSBvdmVyIDMgYXBpYyBlbnRyaWVzICovCi0JCWlmIChzbG90ID09IDApCi0JCQlzbG90ID0gMzsgLyogc2FtZSBwYXR0ZXJuICovCi0JCWlycSA9IENPX0lSUShDT19BUElDX1BDSUFfQkFTRTEyMyArICgoMyAtIHNsb3QpICsgKHBpbiAtIDEpICUgMykpOwotCX0KLW91dDoKLQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBCdXMgJWQgU2xvdCAlZCBMaW5lICVkIC0+IElSUSAlZFxuIiwgYnVzLCBzbG90LCBwaW4sIGlycSk7Ci0JcmV0dXJuIGlycTsKLX0KLQotaW50IF9faW5pdCBwY2lfdmlzd3NfaW5pdCh2b2lkKQotewotCXBjaWJpb3NfZW5hYmxlX2lycSA9ICZwY2lfdmlzd3NfZW5hYmxlX2lycTsKLQlwY2liaW9zX2Rpc2FibGVfaXJxID0gJnBjaV92aXN3c19kaXNhYmxlX2lycTsKLQotCS8qIFRoZSBWSVNXUyBzdXBwb3J0cyBjb25maWd1cmF0aW9uIGFjY2VzcyB0eXBlIDEgb25seSAqLwotCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgfCBQQ0lfUFJPQkVfQ09ORjEpICYKLQkJICAgIH4oUENJX1BST0JFX0JJT1MgfCBQQ0lfUFJPQkVfQ09ORjIpOwotCi0JcGNpX2J1czAgPSBsaV9wY2liX3JlYWQxNihMSV9QQ0lfQlVTTlVNKSAmIDB4ZmY7Ci0JcGNpX2J1czEgPSBsaV9wY2lhX3JlYWQxNihMSV9QQ0lfQlVTTlVNKSAmIDB4ZmY7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IExpdGhpdW0gYnJpZGdlIEEgYnVzOiAldSwgIgotCQkiYnJpZGdlIEIgKFBJSVg0KSBidXM6ICV1XG4iLCBwY2lfYnVzMSwgcGNpX2J1czApOwotCi0JcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMTsKLQlwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKHBjaV9idXMwKTsKLQlwY2lfc2Nhbl9idXNfd2l0aF9zeXNkYXRhKHBjaV9idXMxKTsKLQlwY2lfZml4dXBfaXJxcyhwY2lfY29tbW9uX3N3aXp6bGUsIHZpc3dzX21hcF9pcnEpOwotCXBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KCk7Ci0JLyogUmVxdWVzdCBidXMgc2NhbiAqLwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQppbmRleCAyMDM0MmQ0Li44NWFmZGUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQpAQCAtOSw1ICs5LDQgQEAKIG9iai15CSs9IHNjeDIwMC8KIG9iai15CSs9IHNmaS8KIG9iai15CSs9IHRzNTUwMC8KLW9iai15CSs9IHZpc3dzLwogb2JqLXkJKz0gdXYvCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvTWFrZWZpbGUKaW5kZXggYjdiMGIzNS4uZDUxMDQ1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9NYWtlZmlsZQpAQCAtMSwzICsxLDQgQEAKIG9iai0kKENPTkZJR19FRkkpIAkJKz0gZWZpLm8gZWZpXyQoQklUUykubyBlZmlfc3R1Yl8kKEJJVFMpLm8KIG9iai0kKENPTkZJR19BQ1BJX0JHUlQpICs9IGVmaS1iZ3J0Lm8KIG9iai0kKENPTkZJR19FQVJMWV9QUklOVEtfRUZJKQkrPSBlYXJseV9wcmludGsubworb2JqLSQoQ09ORklHX0VGSV9NSVhFRCkJCSs9IGVmaV90aHVua18kKEJJVFMpLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCBiOTdhY2VjLi4zNzgxZGQzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC02OCw5ICs2OCw3IEBACiBzdGF0aWMgc3RydWN0IGVmaSBlZmlfcGh5cyBfX2luaXRkYXRhOwogc3RhdGljIGVmaV9zeXN0ZW1fdGFibGVfdCBlZmlfc3lzdGFiIF9faW5pdGRhdGE7CiAKLXVuc2lnbmVkIGxvbmcgeDg2X2VmaV9mYWNpbGl0eTsKLQotc3RhdGljIF9faW5pdGRhdGEgZWZpX2NvbmZpZ190YWJsZV90eXBlX3QgYXJjaF90YWJsZXNbXSA9IHsKK3N0YXRpYyBlZmlfY29uZmlnX3RhYmxlX3R5cGVfdCBhcmNoX3RhYmxlc1tdIF9faW5pdGRhdGEgPSB7CiAjaWZkZWYgQ09ORklHX1g4Nl9VVgogCXtVVl9TWVNURU1fVEFCTEVfR1VJRCwgIlVWc3lzdGFiIiwgJmVmaS51dl9zeXN0YWJ9LAogI2VuZGlmCkBAIC03OSwxNiArNzcsNyBAQAogCiB1NjQgZWZpX3NldHVwOwkJLyogZWZpIHNldHVwX2RhdGEgcGh5c2ljYWwgYWRkcmVzcyAqLwogCi0vKgotICogUmV0dXJucyAxIGlmICdmYWNpbGl0eScgaXMgZW5hYmxlZCwgMCBvdGhlcndpc2UuCi0gKi8KLWludCBlZmlfZW5hYmxlZChpbnQgZmFjaWxpdHkpCi17Ci0JcmV0dXJuIHRlc3RfYml0KGZhY2lsaXR5LCAmeDg2X2VmaV9mYWNpbGl0eSkgIT0gMDsKLX0KLUVYUE9SVF9TWU1CT0woZWZpX2VuYWJsZWQpOwotCi1zdGF0aWMgYm9vbCBfX2luaXRkYXRhIGRpc2FibGVfcnVudGltZSA9IGZhbHNlOworc3RhdGljIGJvb2wgZGlzYWJsZV9ydW50aW1lIF9faW5pdGRhdGEgPSBmYWxzZTsKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX25vZWZpKGNoYXIgKmFyZykKIHsKIAlkaXNhYmxlX3J1bnRpbWUgPSB0cnVlOwpAQCAtMjU3LDI3ICsyNDYsMTIgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgZWZpX3N0YXR1c190IF9faW5pdCBwaHlzX2VmaV9nZXRfdGltZShlZmlfdGltZV90ICp0bSwKLQkJCQkJICAgICBlZmlfdGltZV9jYXBfdCAqdGMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQllZmlfc3RhdHVzX3Qgc3RhdHVzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0JZWZpX2NhbGxfcGh5c19wcmVsb2coKTsKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMihlZmlfcGh5cy5nZXRfdGltZSwgdmlydF90b19waHlzKHRtKSwKLQkJCQl2aXJ0X3RvX3BoeXModGMpKTsKLQllZmlfY2FsbF9waHlzX2VwaWxvZygpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQogaW50IGVmaV9zZXRfcnRjX21tc3MoY29uc3Qgc3RydWN0IHRpbWVzcGVjICpub3cpCiB7CiAJdW5zaWduZWQgbG9uZyBub3d0aW1lID0gbm93LT50dl9zZWM7Ci0JZWZpX3N0YXR1c190IAlzdGF0dXM7Ci0JZWZpX3RpbWVfdCAJZWZ0OwotCWVmaV90aW1lX2NhcF90IAljYXA7CisJZWZpX3N0YXR1c190CXN0YXR1czsKKwllZmlfdGltZV90CWVmdDsKKwllZmlfdGltZV9jYXBfdAljYXA7CiAJc3RydWN0IHJ0Y190aW1lCXRtOwogCiAJc3RhdHVzID0gZWZpLmdldF90aW1lKCZlZnQsICZjYXApOwpAQCAtMjk1LDkgKzI2OSw4IEBACiAJCWVmdC5zZWNvbmQgPSB0bS50bV9zZWM7CiAJCWVmdC5uYW5vc2Vjb25kID0gMDsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlczogSW52YWxpZCBFRkkgUlRDIHZhbHVlOiB3cml0ZSBvZiAlbHggdG8gRUZJIFJUQyBmYWlsZWRcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIG5vd3RpbWUpOworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIEVGSSBSVEMgdmFsdWU6IHdyaXRlIG9mICVseCB0byBFRkkgUlRDIGZhaWxlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBub3d0aW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNDEzLDggKzM4Niw3IEBACiAJICAgICBwIDwgbWVtbWFwLm1hcF9lbmQ7CiAJICAgICBwICs9IG1lbW1hcC5kZXNjX3NpemUsIGkrKykgewogCQltZCA9IHA7Ci0JCXByX2luZm8oIm1lbSUwMnU6IHR5cGU9JXUsIGF0dHI9MHglbGx4LCAiCi0JCQkicmFuZ2U9WzB4JTAxNmxseC0weCUwMTZsbHgpICglbGx1TUIpXG4iLAorCQlwcl9pbmZvKCJtZW0lMDJ1OiB0eXBlPSV1LCBhdHRyPTB4JWxseCwgcmFuZ2U9WzB4JTAxNmxseC0weCUwMTZsbHgpICglbGx1TUIpXG4iLAogCQkJaSwgbWQtPnR5cGUsIG1kLT5hdHRyaWJ1dGUsIG1kLT5waHlzX2FkZHIsCiAJCQltZC0+cGh5c19hZGRyICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpLAogCQkJKG1kLT5udW1fcGFnZXMgPj4gKDIwIC0gRUZJX1BBR0VfU0hJRlQpKSk7CkBAIC00NDYsOSArNDE4LDggQEAKIAkJCW1lbWJsb2NrX2lzX3JlZ2lvbl9yZXNlcnZlZChzdGFydCwgc2l6ZSkpIHsKIAkJCS8qIENvdWxkIG5vdCByZXNlcnZlLCBza2lwIGl0ICovCiAJCQltZC0+bnVtX3BhZ2VzID0gMDsKLQkJCW1lbWJsb2NrX2RiZygiQ291bGQgbm90IHJlc2VydmUgYm9vdCByYW5nZSAiCi0JCQkJCSJbMHglMDEwbGx4LTB4JTAxMGxseF1cbiIsCi0JCQkJCQlzdGFydCwgc3RhcnQrc2l6ZS0xKTsKKwkJCW1lbWJsb2NrX2RiZygiQ291bGQgbm90IHJlc2VydmUgYm9vdCByYW5nZSBbMHglMDEwbGx4LTB4JTAxMGxseF1cbiIsCisJCQkJICAgICBzdGFydCwgc3RhcnQrc2l6ZS0xKTsKIAkJfSBlbHNlCiAJCQltZW1ibG9ja19yZXNlcnZlKHN0YXJ0LCBzaXplKTsKIAl9CkBAIC00NTYsNyArNDI3LDcgQEAKIAogdm9pZCBfX2luaXQgZWZpX3VubWFwX21lbW1hcCh2b2lkKQogewotCWNsZWFyX2JpdChFRklfTUVNTUFQLCAmeDg2X2VmaV9mYWNpbGl0eSk7CisJY2xlYXJfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOwogCWlmIChtZW1tYXAubWFwKSB7CiAJCWVhcmx5X2lvdW5tYXAobWVtbWFwLm1hcCwgbWVtbWFwLm5yX21hcCAqIG1lbW1hcC5kZXNjX3NpemUpOwogCQltZW1tYXAubWFwID0gTlVMTDsKQEAgLTQ2Nyw5ICs0MzgsNiBAQAogewogCXZvaWQgKnA7CiAKLQlpZiAoIWVmaV9pc19uYXRpdmUoKSkKLQkJcmV0dXJuOwotCiAJZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKIAkJZWZpX21lbW9yeV9kZXNjX3QgKm1kID0gcDsKIAkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKQEAgLTU4NCwxNyArNTUyLDY2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoKGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiA+PiAxNikgPT0gMCkKLQkJcHJfZXJyKCJXYXJuaW5nOiBTeXN0ZW0gdGFibGUgdmVyc2lvbiAiCi0JCSAgICAgICAiJWQuJTAyZCwgZXhwZWN0ZWQgMS4wMCBvciBncmVhdGVyIVxuIiwKKwkJcHJfZXJyKCJXYXJuaW5nOiBTeXN0ZW0gdGFibGUgdmVyc2lvbiAlZC4lMDJkLCBleHBlY3RlZCAxLjAwIG9yIGdyZWF0ZXIhXG4iLAogCQkgICAgICAgZWZpLnN5c3RhYi0+aGRyLnJldmlzaW9uID4+IDE2LAogCQkgICAgICAgZWZpLnN5c3RhYi0+aGRyLnJldmlzaW9uICYgMHhmZmZmKTsKIAorCXNldF9iaXQoRUZJX1NZU1RFTV9UQUJMRVMsICZlZmkuZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVmaV9ydW50aW1lX2luaXQzMih2b2lkKQoreworCWVmaV9ydW50aW1lX3NlcnZpY2VzXzMyX3QgKnJ1bnRpbWU7CisKKwlydW50aW1lID0gZWFybHlfaW9yZW1hcCgodW5zaWduZWQgbG9uZyllZmkuc3lzdGFiLT5ydW50aW1lLAorCQkJc2l6ZW9mKGVmaV9ydW50aW1lX3NlcnZpY2VzXzMyX3QpKTsKKwlpZiAoIXJ1bnRpbWUpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgbWFwIHRoZSBydW50aW1lIHNlcnZpY2UgdGFibGUhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBXZSB3aWxsIG9ubHkgbmVlZCAqZWFybHkqIGFjY2VzcyB0byB0aGUgZm9sbG93aW5nIHR3bworCSAqIEVGSSBydW50aW1lIHNlcnZpY2VzIGJlZm9yZSBzZXRfdmlydHVhbF9hZGRyZXNzX21hcAorCSAqIGlzIGludm9rZWQuCisJICovCisJZWZpX3BoeXMuc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAgPQorCQkJKGVmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcF90ICopCisJCQkodW5zaWduZWQgbG9uZylydW50aW1lLT5zZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKKwllYXJseV9pb3VubWFwKHJ1bnRpbWUsIHNpemVvZihlZmlfcnVudGltZV9zZXJ2aWNlc18zMl90KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZWZpX3J1bnRpbWVfaW5pdDY0KHZvaWQpCit7CisJZWZpX3J1bnRpbWVfc2VydmljZXNfNjRfdCAqcnVudGltZTsKKworCXJ1bnRpbWUgPSBlYXJseV9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKWVmaS5zeXN0YWItPnJ1bnRpbWUsCisJCQlzaXplb2YoZWZpX3J1bnRpbWVfc2VydmljZXNfNjRfdCkpOworCWlmICghcnVudGltZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgdGhlIHJ1bnRpbWUgc2VydmljZSB0YWJsZSFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFdlIHdpbGwgb25seSBuZWVkICplYXJseSogYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcgdHdvCisJICogRUZJIHJ1bnRpbWUgc2VydmljZXMgYmVmb3JlIHNldF92aXJ0dWFsX2FkZHJlc3NfbWFwCisJICogaXMgaW52b2tlZC4KKwkgKi8KKwllZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9CisJCQkoZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwX3QgKikKKwkJCSh1bnNpZ25lZCBsb25nKXJ1bnRpbWUtPnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwOworCWVhcmx5X2lvdW5tYXAocnVudGltZSwgc2l6ZW9mKGVmaV9ydW50aW1lX3NlcnZpY2VzXzY0X3QpKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBlZmlfcnVudGltZV9pbml0KHZvaWQpCiB7Ci0JZWZpX3J1bnRpbWVfc2VydmljZXNfdCAqcnVudGltZTsKKwlpbnQgcnY7CiAKIAkvKgogCSAqIENoZWNrIG91dCB0aGUgcnVudGltZSBzZXJ2aWNlcyB0YWJsZS4gV2UgbmVlZCB0byBtYXAKQEAgLTYwMiwyNyArNjE5LDE1IEBACiAJICogYWRkcmVzcyBvZiBzZXZlcmFsIG9mIHRoZSBFRkkgcnVudGltZSBmdW5jdGlvbnMsIG5lZWRlZCB0bwogCSAqIHNldCB0aGUgZmlybXdhcmUgaW50byB2aXJ0dWFsIG1vZGUuCiAJICovCi0JcnVudGltZSA9IGVhcmx5X2lvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZWZpLnN5c3RhYi0+cnVudGltZSwKLQkJCQlzaXplb2YoZWZpX3J1bnRpbWVfc2VydmljZXNfdCkpOwotCWlmICghcnVudGltZSkgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgdGhlIHJ1bnRpbWUgc2VydmljZSB0YWJsZSFcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JLyoKLQkgKiBXZSB3aWxsIG9ubHkgbmVlZCAqZWFybHkqIGFjY2VzcyB0byB0aGUgZm9sbG93aW5nCi0JICogdHdvIEVGSSBydW50aW1lIHNlcnZpY2VzIGJlZm9yZSBzZXRfdmlydHVhbF9hZGRyZXNzX21hcAotCSAqIGlzIGludm9rZWQuCi0JICovCi0JZWZpX3BoeXMuZ2V0X3RpbWUgPSAoZWZpX2dldF90aW1lX3QgKilydW50aW1lLT5nZXRfdGltZTsKLQllZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9Ci0JCShlZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXBfdCAqKQotCQlydW50aW1lLT5zZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKLQkvKgotCSAqIE1ha2UgZWZpX2dldF90aW1lIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGVudGVyaW5nCi0JICogdmlydHVhbCBtb2RlLgotCSAqLwotCWVmaS5nZXRfdGltZSA9IHBoeXNfZWZpX2dldF90aW1lOwotCWVhcmx5X2lvdW5tYXAocnVudGltZSwgc2l6ZW9mKGVmaV9ydW50aW1lX3NlcnZpY2VzX3QpKTsKKwlpZiAoZWZpX2VuYWJsZWQoRUZJXzY0QklUKSkKKwkJcnYgPSBlZmlfcnVudGltZV9pbml0NjQoKTsKKwllbHNlCisJCXJ2ID0gZWZpX3J1bnRpbWVfaW5pdDMyKCk7CisKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCXNldF9iaXQoRUZJX1JVTlRJTUVfU0VSVklDRVMsICZlZmkuZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NDEsNiArNjQ2LDggQEAKIAlpZiAoYWRkX2VmaV9tZW1tYXApCiAJCWRvX2FkZF9lZmlfbWVtbWFwKCk7CiAKKwlzZXRfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcyMyw3ICs3MzAsNyBAQAogCWlmIChlZmlfc3lzdGFiX2luaXQoZWZpX3BoeXMuc3lzdGFiKSkKIAkJcmV0dXJuOwogCi0Jc2V0X2JpdChFRklfU1lTVEVNX1RBQkxFUywgJng4Nl9lZmlfZmFjaWxpdHkpOworCXNldF9iaXQoRUZJX1NZU1RFTV9UQUJMRVMsICZlZmkuZmxhZ3MpOwogCiAJZWZpLmNvbmZpZ190YWJsZSA9ICh1bnNpZ25lZCBsb25nKWVmaS5zeXN0YWItPnRhYmxlczsKIAllZmkuZndfdmVuZG9yCSA9ICh1bnNpZ25lZCBsb25nKWVmaS5zeXN0YWItPmZ3X3ZlbmRvcjsKQEAgLTc1MSwyNCArNzU4LDIxIEBACiAJaWYgKGVmaV9jb25maWdfaW5pdChhcmNoX3RhYmxlcykpCiAJCXJldHVybjsKIAotCXNldF9iaXQoRUZJX0NPTkZJR19UQUJMRVMsICZ4ODZfZWZpX2ZhY2lsaXR5KTsKLQogCS8qCiAJICogTm90ZTogV2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgcnVudGltZSBzZXJ2aWNlcyBvbiBhbiBFRkkKIAkgKiB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIGtlcm5lbCAzMi82NC1iaXQgbW9kZS4KIAkgKi8KIAotCWlmICghZWZpX2lzX25hdGl2ZSgpKQorCWlmICghZWZpX3J1bnRpbWVfc3VwcG9ydGVkKCkpCiAJCXByX2luZm8oIk5vIEVGSSBydW50aW1lIGR1ZSB0byAzMi82NC1iaXQgbWlzbWF0Y2ggd2l0aCBrZXJuZWxcbiIpOwogCWVsc2UgewogCQlpZiAoZGlzYWJsZV9ydW50aW1lIHx8IGVmaV9ydW50aW1lX2luaXQoKSkKIAkJCXJldHVybjsKLQkJc2V0X2JpdChFRklfUlVOVElNRV9TRVJWSUNFUywgJng4Nl9lZmlfZmFjaWxpdHkpOwogCX0KIAlpZiAoZWZpX21lbW1hcF9pbml0KCkpCiAJCXJldHVybjsKIAotCXNldF9iaXQoRUZJX01FTU1BUCwgJng4Nl9lZmlfZmFjaWxpdHkpOworCXNldF9iaXQoRUZJX01FTU1BUCwgJmVmaS5mbGFncyk7CiAKIAlwcmludF9lZmlfbWVtbWFwKCk7CiB9CkBAIC04NDUsNiArODQ5LDIyIEBACiAJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1kLT5waHlzX2FkZHIpOwogfQogCitzdGF0aWMgdm9pZCBuYXRpdmVfcnVudGltZV9zZXR1cCh2b2lkKQoreworCWVmaS5nZXRfdGltZSA9IHZpcnRfZWZpX2dldF90aW1lOworCWVmaS5zZXRfdGltZSA9IHZpcnRfZWZpX3NldF90aW1lOworCWVmaS5nZXRfd2FrZXVwX3RpbWUgPSB2aXJ0X2VmaV9nZXRfd2FrZXVwX3RpbWU7CisJZWZpLnNldF93YWtldXBfdGltZSA9IHZpcnRfZWZpX3NldF93YWtldXBfdGltZTsKKwllZmkuZ2V0X3ZhcmlhYmxlID0gdmlydF9lZmlfZ2V0X3ZhcmlhYmxlOworCWVmaS5nZXRfbmV4dF92YXJpYWJsZSA9IHZpcnRfZWZpX2dldF9uZXh0X3ZhcmlhYmxlOworCWVmaS5zZXRfdmFyaWFibGUgPSB2aXJ0X2VmaV9zZXRfdmFyaWFibGU7CisJZWZpLmdldF9uZXh0X2hpZ2hfbW9ub19jb3VudCA9IHZpcnRfZWZpX2dldF9uZXh0X2hpZ2hfbW9ub19jb3VudDsKKwllZmkucmVzZXRfc3lzdGVtID0gdmlydF9lZmlfcmVzZXRfc3lzdGVtOworCWVmaS5xdWVyeV92YXJpYWJsZV9pbmZvID0gdmlydF9lZmlfcXVlcnlfdmFyaWFibGVfaW5mbzsKKwllZmkudXBkYXRlX2NhcHN1bGUgPSB2aXJ0X2VmaV91cGRhdGVfY2Fwc3VsZTsKKwllZmkucXVlcnlfY2Fwc3VsZV9jYXBzID0gdmlydF9lZmlfcXVlcnlfY2Fwc3VsZV9jYXBzOworfQorCiAvKiBNZXJnZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlICovCiBzdGF0aWMgdm9pZCBfX2luaXQgZWZpX21lcmdlX3JlZ2lvbnModm9pZCkKIHsKQEAgLTg5Miw4ICs5MTIsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgc2F2ZV9ydW50aW1lX21hcCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHNhdmVfcnVudGltZV9tYXAodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfS0VYRUMKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAJdm9pZCAqdG1wLCAqcCwgKnEgPSBOVUxMOwogCWludCBjb3VudCA9IDA7CkBAIC05MTUsNDEgKzkzNiw0NyBAQAogCX0KIAogCWVmaV9ydW50aW1lX21hcF9zZXR1cChxLCBjb3VudCwgbWVtbWFwLmRlc2Nfc2l6ZSk7CisJcmV0dXJuOwogCi0JcmV0dXJuIDA7CiBvdXQ6CiAJa2ZyZWUocSk7Ci0JcmV0dXJuIC1FTk9NRU07CisJcHJfZXJyKCJFcnJvciBzYXZpbmcgcnVudGltZSBtYXAsIGVmaSBydW50aW1lIG9uIGtleGVjIG5vbi1mdW5jdGlvbmFsISFcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkICpyZWFsbG9jX3BhZ2VzKHZvaWQgKm9sZF9tZW1tYXAsIGludCBvbGRfc2hpZnQpCit7CisJdm9pZCAqcmV0OworCisJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9sZF9zaGlmdCArIDEpOworCWlmICghcmV0KQorCQlnb3RvIG91dDsKKworCS8qCisJICogQSBmaXJzdC10aW1lIGFsbG9jYXRpb24gZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGNvcHkuCisJICovCisJaWYgKCFvbGRfbWVtbWFwKQorCQlyZXR1cm4gcmV0OworCisJbWVtY3B5KHJldCwgb2xkX21lbW1hcCwgUEFHRV9TSVpFIDw8IG9sZF9zaGlmdCk7CisKK291dDoKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW9sZF9tZW1tYXAsIG9sZF9zaGlmdCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIE1hcCBlZmkgcmVnaW9ucyB3aGljaCB3ZXJlIHBhc3NlZCB2aWEgc2V0dXBfZGF0YS4gVGhlIHZpcnRfYWRkciBpcyBhIGZpeGVkCi0gKiBhZGRyIHdoaWNoIHdhcyB1c2VkIGluIGZpcnN0IGtlcm5lbCBvZiBhIGtleGVjIGJvb3QuCisgKiBNYXAgdGhlIGVmaSBtZW1vcnkgcmFuZ2VzIG9mIHRoZSBydW50aW1lIHNlcnZpY2VzIGFuZCB1cGRhdGUgbmV3X21tYXAgd2l0aAorICogdmlydHVhbCBhZGRyZXNzZXMuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBlZmlfbWFwX3JlZ2lvbnNfZml4ZWQodm9pZCkKK3N0YXRpYyB2b2lkICogX19pbml0IGVmaV9tYXBfcmVnaW9ucyhpbnQgKmNvdW50LCBpbnQgKnBnX3NoaWZ0KQogewotCXZvaWQgKnA7CisJdm9pZCAqcCwgKm5ld19tZW1tYXAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbGVmdCA9IDA7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwogCiAJZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKIAkJbWQgPSBwOwotCQllZmlfbWFwX3JlZ2lvbl9maXhlZChtZCk7IC8qIEZJWE1FOiBhZGQgZXJyb3IgaGFuZGxpbmcgKi8KLQkJZ2V0X3N5c3RhYl92aXJ0X2FkZHIobWQpOwotCX0KLQotfQotCi0vKgotICogTWFwIGVmaSBtZW1vcnkgcmFuZ2VzIGZvciBydW50aW1lIHNlcml2Y2UgYW5kIHVwZGF0ZSBuZXdfbWVtbWFwIHdpdGggdmlydHVhbAotICogYWRkcmVzc2VzLgotICovCi1zdGF0aWMgdm9pZCAqIF9faW5pdCBlZmlfbWFwX3JlZ2lvbnMoaW50ICpjb3VudCkKLXsKLQllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7Ci0Jdm9pZCAqcCwgKnRtcCwgKm5ld19tZW1tYXAgPSBOVUxMOwotCi0JZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKLQkJbWQgPSBwOwogCQlpZiAoIShtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9SVU5USU1FKSkgewogI2lmZGVmIENPTkZJR19YODZfNjQKIAkJCWlmIChtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19DT0RFICYmCkBAIC05NjEsMjAgKzk4OCw4MCBAQAogCQllZmlfbWFwX3JlZ2lvbihtZCk7CiAJCWdldF9zeXN0YWJfdmlydF9hZGRyKG1kKTsKIAotCQl0bXAgPSBrcmVhbGxvYyhuZXdfbWVtbWFwLCAoKmNvdW50ICsgMSkgKiBtZW1tYXAuZGVzY19zaXplLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIXRtcCkKLQkJCWdvdG8gb3V0OwotCQluZXdfbWVtbWFwID0gdG1wOworCQlpZiAobGVmdCA8IG1lbW1hcC5kZXNjX3NpemUpIHsKKwkJCW5ld19tZW1tYXAgPSByZWFsbG9jX3BhZ2VzKG5ld19tZW1tYXAsICpwZ19zaGlmdCk7CisJCQlpZiAoIW5ld19tZW1tYXApCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCWxlZnQgKz0gUEFHRV9TSVpFIDw8ICpwZ19zaGlmdDsKKwkJCSgqcGdfc2hpZnQpKys7CisJCX0KKwogCQltZW1jcHkobmV3X21lbW1hcCArICgqY291bnQgKiBtZW1tYXAuZGVzY19zaXplKSwgbWQsCiAJCSAgICAgICBtZW1tYXAuZGVzY19zaXplKTsKKworCQlsZWZ0IC09IG1lbW1hcC5kZXNjX3NpemU7CiAJCSgqY291bnQpKys7CiAJfQogCiAJcmV0dXJuIG5ld19tZW1tYXA7Ci1vdXQ6Ci0Ja2ZyZWUobmV3X21lbW1hcCk7Ci0JcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBrZXhlY19lbnRlcl92aXJ0dWFsX21vZGUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfS0VYRUMKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJdm9pZCAqcDsKKworCWVmaS5zeXN0YWIgPSBOVUxMOworCisJLyoKKwkgKiBXZSBkb24ndCBkbyB2aXJ0dWFsIG1vZGUsIHNpbmNlIHdlIGRvbid0IGRvIHJ1bnRpbWUgc2VydmljZXMsIG9uCisJICogbm9uLW5hdGl2ZSBFRkkKKwkgKi8KKwlpZiAoIWVmaV9pc19uYXRpdmUoKSkgeworCQllZmlfdW5tYXBfbWVtbWFwKCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSogTWFwIGVmaSByZWdpb25zIHdoaWNoIHdlcmUgcGFzc2VkIHZpYSBzZXR1cF9kYXRhLiBUaGUgdmlydF9hZGRyIGlzIGEKKwkqIGZpeGVkIGFkZHIgd2hpY2ggd2FzIHVzZWQgaW4gZmlyc3Qga2VybmVsIG9mIGEga2V4ZWMgYm9vdC4KKwkqLworCWZvciAocCA9IG1lbW1hcC5tYXA7IHAgPCBtZW1tYXAubWFwX2VuZDsgcCArPSBtZW1tYXAuZGVzY19zaXplKSB7CisJCW1kID0gcDsKKwkJZWZpX21hcF9yZWdpb25fZml4ZWQobWQpOyAvKiBGSVhNRTogYWRkIGVycm9yIGhhbmRsaW5nICovCisJCWdldF9zeXN0YWJfdmlydF9hZGRyKG1kKTsKKwl9CisKKwlzYXZlX3J1bnRpbWVfbWFwKCk7CisKKwlCVUdfT04oIWVmaS5zeXN0YWIpOworCisJZWZpX3N5bmNfbG93X2tlcm5lbF9tYXBwaW5ncygpOworCisJLyoKKwkgKiBOb3cgdGhhdCBFRkkgaXMgaW4gdmlydHVhbCBtb2RlLCB1cGRhdGUgdGhlIGZ1bmN0aW9uCisJICogcG9pbnRlcnMgaW4gdGhlIHJ1bnRpbWUgc2VydmljZSB0YWJsZSB0byB0aGUgbmV3IHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqCisJICogQ2FsbCBFRkkgc2VydmljZXMgdGhyb3VnaCB3cmFwcGVyIGZ1bmN0aW9ucy4KKwkgKi8KKwllZmkucnVudGltZV92ZXJzaW9uID0gZWZpX3N5c3RhYi5oZHIucmV2aXNpb247CisKKwluYXRpdmVfcnVudGltZV9zZXR1cCgpOworCisJZWZpLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwID0gTlVMTDsKKworCWlmIChlZmlfZW5hYmxlZChFRklfT0xEX01FTU1BUCkgJiYgKF9fc3VwcG9ydGVkX3B0ZV9tYXNrICYgX1BBR0VfTlgpKQorCQlydW50aW1lX2NvZGVfcGFnZV9ta2V4ZWMoKTsKKworCS8qIGNsZWFuIERVTU1ZIG9iamVjdCAqLworCWVmaS5zZXRfdmFyaWFibGUoZWZpX2R1bW15X25hbWUsICZFRklfRFVNTVlfR1VJRCwKKwkJCSBFRklfVkFSSUFCTEVfTk9OX1ZPTEFUSUxFIHwKKwkJCSBFRklfVkFSSUFCTEVfQk9PVFNFUlZJQ0VfQUNDRVNTIHwKKwkJCSBFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1MsCisJCQkgMCwgTlVMTCk7CisjZW5kaWYKIH0KIAogLyoKQEAgLTk5Niw1NyArMTA4Myw1MyBAQAogICoKICAqIFNwZWNpYWxseSBmb3Iga2V4ZWMgYm9vdCwgZWZpIHJ1bnRpbWUgbWFwcyBpbiBwcmV2aW91cyBrZXJuZWwgc2hvdWxkCiAgKiBiZSBwYXNzZWQgaW4gdmlhIHNldHVwX2RhdGEuIEluIHRoYXQgY2FzZSBydW50aW1lIHJhbmdlcyB3aWxsIGJlIG1hcHBlZAotICogdG8gdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzZXMgYXMgdGhlIGZpcnN0IGtlcm5lbC4KKyAqIHRvIHRoZSBzYW1lIHZpcnR1YWwgYWRkcmVzc2VzIGFzIHRoZSBmaXJzdCBrZXJuZWwsIHNlZQorICoga2V4ZWNfZW50ZXJfdmlydHVhbF9tb2RlKCkuCiAgKi8KLXZvaWQgX19pbml0IGVmaV9lbnRlcl92aXJ0dWFsX21vZGUodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2VmaV9lbnRlcl92aXJ0dWFsX21vZGUodm9pZCkKIHsKLQllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWludCBjb3VudCA9IDAsIHBnX3NoaWZ0ID0gMDsKIAl2b2lkICpuZXdfbWVtbWFwID0gTlVMTDsKLQlpbnQgZXJyLCBjb3VudCA9IDA7CisJZWZpX3N0YXR1c190IHN0YXR1czsKIAogCWVmaS5zeXN0YWIgPSBOVUxMOwogCi0JLyoKLQkgKiBXZSBkb24ndCBkbyB2aXJ0dWFsIG1vZGUsIHNpbmNlIHdlIGRvbid0IGRvIHJ1bnRpbWUgc2VydmljZXMsIG9uCi0JICogbm9uLW5hdGl2ZSBFRkkKLQkgKi8KLQlpZiAoIWVmaV9pc19uYXRpdmUoKSkgewotCQllZmlfdW5tYXBfbWVtbWFwKCk7CisJZWZpX21lcmdlX3JlZ2lvbnMoKTsKKwluZXdfbWVtbWFwID0gZWZpX21hcF9yZWdpb25zKCZjb3VudCwgJnBnX3NoaWZ0KTsKKwlpZiAoIW5ld19tZW1tYXApIHsKKwkJcHJfZXJyKCJFcnJvciByZWFsbG9jYXRpbmcgbWVtb3J5LCBFRkkgcnVudGltZSBub24tZnVuY3Rpb25hbCFcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGVmaV9zZXR1cCkgewotCQllZmlfbWFwX3JlZ2lvbnNfZml4ZWQoKTsKLQl9IGVsc2UgewotCQllZmlfbWVyZ2VfcmVnaW9ucygpOwotCQluZXdfbWVtbWFwID0gZWZpX21hcF9yZWdpb25zKCZjb3VudCk7Ci0JCWlmICghbmV3X21lbW1hcCkgewotCQkJcHJfZXJyKCJFcnJvciByZWFsbG9jYXRpbmcgbWVtb3J5LCBFRkkgcnVudGltZSBub24tZnVuY3Rpb25hbCFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZXJyID0gc2F2ZV9ydW50aW1lX21hcCgpOwotCWlmIChlcnIpCi0JCXByX2VycigiRXJyb3Igc2F2aW5nIHJ1bnRpbWUgbWFwLCBlZmkgcnVudGltZSBvbiBrZXhlYyBub24tZnVuY3Rpb25hbCEhXG4iKTsKKwlzYXZlX3J1bnRpbWVfbWFwKCk7CiAKIAlCVUdfT04oIWVmaS5zeXN0YWIpOwogCi0JZWZpX3NldHVwX3BhZ2VfdGFibGVzKCk7CisJaWYgKGVmaV9zZXR1cF9wYWdlX3RhYmxlcyhfX3BhKG5ld19tZW1tYXApLCAxIDw8IHBnX3NoaWZ0KSkKKwkJcmV0dXJuOworCiAJZWZpX3N5bmNfbG93X2tlcm5lbF9tYXBwaW5ncygpOworCWVmaV9kdW1wX3BhZ2V0YWJsZSgpOwogCi0JaWYgKCFlZmlfc2V0dXApIHsKKwlpZiAoZWZpX2lzX25hdGl2ZSgpKSB7CiAJCXN0YXR1cyA9IHBoeXNfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAotCQkJbWVtbWFwLmRlc2Nfc2l6ZSAqIGNvdW50LAotCQkJbWVtbWFwLmRlc2Nfc2l6ZSwKLQkJCW1lbW1hcC5kZXNjX3ZlcnNpb24sCi0JCQkoZWZpX21lbW9yeV9kZXNjX3QgKilfX3BhKG5ld19tZW1tYXApKTsKKwkJCQltZW1tYXAuZGVzY19zaXplICogY291bnQsCisJCQkJbWVtbWFwLmRlc2Nfc2l6ZSwKKwkJCQltZW1tYXAuZGVzY192ZXJzaW9uLAorCQkJCShlZmlfbWVtb3J5X2Rlc2NfdCAqKV9fcGEobmV3X21lbW1hcCkpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGVmaV90aHVua19zZXRfdmlydHVhbF9hZGRyZXNzX21hcCgKKwkJCQllZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCwKKwkJCQltZW1tYXAuZGVzY19zaXplICogY291bnQsCisJCQkJbWVtbWFwLmRlc2Nfc2l6ZSwKKwkJCQltZW1tYXAuZGVzY192ZXJzaW9uLAorCQkJCShlZmlfbWVtb3J5X2Rlc2NfdCAqKV9fcGEobmV3X21lbW1hcCkpOworCX0KIAotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCQlwcl9hbGVydCgiVW5hYmxlIHRvIHN3aXRjaCBFRkkgaW50byB2aXJ0dWFsIG1vZGUgKHN0YXR1cz0lbHgpIVxuIiwKLQkJCQkgc3RhdHVzKTsKLQkJCXBhbmljKCJFRkkgY2FsbCB0byBTZXRWaXJ0dWFsQWRkcmVzc01hcCgpIGZhaWxlZCEiKTsKLQkJfQorCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJcHJfYWxlcnQoIlVuYWJsZSB0byBzd2l0Y2ggRUZJIGludG8gdmlydHVhbCBtb2RlIChzdGF0dXM9JWx4KSFcbiIsCisJCQkgc3RhdHVzKTsKKwkJcGFuaWMoIkVGSSBjYWxsIHRvIFNldFZpcnR1YWxBZGRyZXNzTWFwKCkgZmFpbGVkISIpOwogCX0KIAogCS8qCkBAIC0xMDU2LDIzICsxMTM5LDQzIEBACiAJICogQ2FsbCBFRkkgc2VydmljZXMgdGhyb3VnaCB3cmFwcGVyIGZ1bmN0aW9ucy4KIAkgKi8KIAllZmkucnVudGltZV92ZXJzaW9uID0gZWZpX3N5c3RhYi5oZHIucmV2aXNpb247Ci0JZWZpLmdldF90aW1lID0gdmlydF9lZmlfZ2V0X3RpbWU7Ci0JZWZpLnNldF90aW1lID0gdmlydF9lZmlfc2V0X3RpbWU7Ci0JZWZpLmdldF93YWtldXBfdGltZSA9IHZpcnRfZWZpX2dldF93YWtldXBfdGltZTsKLQllZmkuc2V0X3dha2V1cF90aW1lID0gdmlydF9lZmlfc2V0X3dha2V1cF90aW1lOwotCWVmaS5nZXRfdmFyaWFibGUgPSB2aXJ0X2VmaV9nZXRfdmFyaWFibGU7Ci0JZWZpLmdldF9uZXh0X3ZhcmlhYmxlID0gdmlydF9lZmlfZ2V0X25leHRfdmFyaWFibGU7Ci0JZWZpLnNldF92YXJpYWJsZSA9IHZpcnRfZWZpX3NldF92YXJpYWJsZTsKLQllZmkuZ2V0X25leHRfaGlnaF9tb25vX2NvdW50ID0gdmlydF9lZmlfZ2V0X25leHRfaGlnaF9tb25vX2NvdW50OwotCWVmaS5yZXNldF9zeXN0ZW0gPSB2aXJ0X2VmaV9yZXNldF9zeXN0ZW07CisKKwlpZiAoZWZpX2lzX25hdGl2ZSgpKQorCQluYXRpdmVfcnVudGltZV9zZXR1cCgpOworCWVsc2UKKwkJZWZpX3RodW5rX3J1bnRpbWVfc2V0dXAoKTsKKwogCWVmaS5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9IE5VTEw7Ci0JZWZpLnF1ZXJ5X3ZhcmlhYmxlX2luZm8gPSB2aXJ0X2VmaV9xdWVyeV92YXJpYWJsZV9pbmZvOwotCWVmaS51cGRhdGVfY2Fwc3VsZSA9IHZpcnRfZWZpX3VwZGF0ZV9jYXBzdWxlOwotCWVmaS5xdWVyeV9jYXBzdWxlX2NhcHMgPSB2aXJ0X2VmaV9xdWVyeV9jYXBzdWxlX2NhcHM7CiAKIAllZmlfcnVudGltZV9ta2V4ZWMoKTsKIAotCWtmcmVlKG5ld19tZW1tYXApOworCS8qCisJICogV2UgbWFwcGVkIHRoZSBkZXNjcmlwdG9yIGFycmF5IGludG8gdGhlIEVGSSBwYWdldGFibGUgYWJvdmUgYnV0IHdlJ3JlCisJICogbm90IHVubWFwcGluZyBpdCBoZXJlLiBIZXJlJ3Mgd2h5OgorCSAqCisJICogV2UncmUgY29weWluZyBzZWxlY3QgUEdEcyBmcm9tIHRoZSBrZXJuZWwgcGFnZSB0YWJsZSB0byB0aGUgRUZJIHBhZ2UKKwkgKiB0YWJsZSBhbmQgd2hlbiB3ZSBkbyBzbyBhbmQgbWFrZSBjaGFuZ2VzIHRvIHRob3NlIFBHRHMgbGlrZSB1bm1hcHBpbmcKKwkgKiBzdHVmZiBmcm9tIHRoZW0sIHRob3NlIGNoYW5nZXMgYXBwZWFyIGluIHRoZSBrZXJuZWwgcGFnZSB0YWJsZSBhbmQgd2UKKwkgKiBnbyBib29tLgorCSAqCisJICogRnJvbSBzZXR1cF9yZWFsX21vZGUoKToKKwkgKgorCSAqIC4uLgorCSAqIHRyYW1wb2xpbmVfcGdkWzBdID0gaW5pdF9sZXZlbDRfcGd0W3BnZF9pbmRleChfX1BBR0VfT0ZGU0VUKV0ucGdkOworCSAqCisJICogSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UsIG91ciBhbGxvY2F0aW9uIGlzIGluIFBHRCAwIG9mIHRoZSBFRkkgcGFnZQorCSAqIHRhYmxlIGJ1dCB3ZSd2ZSBjb3BpZWQgdGhhdCBQR0QgZnJvbSBQR0RbMjcyXSBvZiB0aGUgRUZJIHBhZ2UgdGFibGU6CisJICoKKwkgKglwZ2RfaW5kZXgoX19QQUdFX09GRlNFVCA9IDB4ZmZmZjg4MDAwMDAwMDAwMCkgPSAyNzIKKwkgKgorCSAqIHdoZXJlIHRoZSBkaXJlY3QgbWVtb3J5IG1hcHBpbmcgaW4ga2VybmVsIHNwYWNlIGlzLgorCSAqCisJICogbmV3X21lbW1hcCdzIFZBIGNvbWVzIGZyb20gdGhhdCBkaXJlY3QgbWFwcGluZyBhbmQgdGh1cyBjbGVhcmluZyBpdCwKKwkgKiBpdCB3b3VsZCBnZXQgY2xlYXJlZCBpbiB0aGUga2VybmVsIHBhZ2UgdGFibGUgdG9vLgorCSAqCisJICogZWZpX2NsZWFudXBfcGFnZV90YWJsZXMoX19wYShuZXdfbWVtbWFwKSwgMSA8PCBwZ19zaGlmdCk7CisJICovCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXdfbWVtbWFwLCBwZ19zaGlmdCk7CiAKIAkvKiBjbGVhbiBEVU1NWSBvYmplY3QgKi8KIAllZmkuc2V0X3ZhcmlhYmxlKGVmaV9kdW1teV9uYW1lLCAmRUZJX0RVTU1ZX0dVSUQsCkBAIC0xMDgyLDYgKzExODUsMTQgQEAKIAkJCSAwLCBOVUxMKTsKIH0KIAordm9pZCBfX2luaXQgZWZpX2VudGVyX3ZpcnR1YWxfbW9kZSh2b2lkKQoreworCWlmIChlZmlfc2V0dXApCisJCWtleGVjX2VudGVyX3ZpcnR1YWxfbW9kZSgpOworCWVsc2UKKwkJX19lZmlfZW50ZXJfdmlydHVhbF9tb2RlKCk7Cit9CisKIC8qCiAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gb2J0YWluIG1lbW9yeSB0eXBlcyBhbmQgYXR0cmlidXRlcwogICovCkBAIC0xMTE5LDkgKzEyMzAsOCBAQAogfQogCiAvKgotICogU29tZSBmaXJtd2FyZSBoYXMgc2VyaW91cyBwcm9ibGVtcyB3aGVuIHVzaW5nIG1vcmUgdGhhbiA1MCUgb2YgdGhlIEVGSQotICogdmFyaWFibGUgc3RvcmUsIGkuZS4gaXQgdHJpZ2dlcnMgYnVncyB0aGF0IGNhbiBicmljayBtYWNoaW5lcy4gRW5zdXJlIHRoYXQKLSAqIHdlIG5ldmVyIHVzZSBtb3JlIHRoYW4gdGhpcyBzYWZlIGxpbWl0LgorICogU29tZSBmaXJtd2FyZSBpbXBsZW1lbnRhdGlvbnMgcmVmdXNlIHRvIGJvb3QgaWYgdGhlcmUncyBpbnN1ZmZpY2llbnQgc3BhY2UKKyAqIGluIHRoZSB2YXJpYWJsZSBzdG9yZS4gRW5zdXJlIHRoYXQgd2UgbmV2ZXIgdXNlIG1vcmUgdGhhbiBhIHNhZmUgbGltaXQuCiAgKgogICogUmV0dXJuIEVGSV9TVUNDRVNTIGlmIGl0IGlzIHNhZmUgdG8gd3JpdGUgJ3NpemUnIGJ5dGVzIHRvIHRoZSB2YXJpYWJsZQogICogc3RvcmUuCkBAIC0xMTQwLDEwICsxMjUwLDkgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAogCS8qCi0JICogU29tZSBmaXJtd2FyZSBpbXBsZW1lbnRhdGlvbnMgcmVmdXNlIHRvIGJvb3QgaWYgdGhlcmUncyBpbnN1ZmZpY2llbnQKLQkgKiBzcGFjZSBpbiB0aGUgdmFyaWFibGUgc3RvcmUuIFdlIGFjY291bnQgZm9yIHRoYXQgYnkgcmVmdXNpbmcgdGhlCi0JICogd3JpdGUgaWYgcGVybWl0dGluZyBpdCB3b3VsZCByZWR1Y2UgdGhlIGF2YWlsYWJsZSBzcGFjZSB0byB1bmRlcgotCSAqIDVLQi4gVGhpcyBmaWd1cmUgd2FzIHByb3ZpZGVkIGJ5IFNhbXN1bmcsIHNvIHNob3VsZCBiZSBzYWZlLgorCSAqIFdlIGFjY291bnQgZm9yIHRoYXQgYnkgcmVmdXNpbmcgdGhlIHdyaXRlIGlmIHBlcm1pdHRpbmcgaXQgd291bGQKKwkgKiByZWR1Y2UgdGhlIGF2YWlsYWJsZSBzcGFjZSB0byB1bmRlciA1S0IuIFRoaXMgZmlndXJlIHdhcyBwcm92aWRlZCBieQorCSAqIFNhbXN1bmcsIHNvIHNob3VsZCBiZSBzYWZlLgogCSAqLwogCWlmICgocmVtYWluaW5nX3NpemUgLSBzaXplIDwgRUZJX01JTl9SRVNFUlZFKSAmJgogCQkhZWZpX25vX3N0b3JhZ2VfcGFyYW5vaWEpIHsKQEAgLTEyMDYsNyArMTMxNSw3IEBACiAJCXN0cisrOwogCiAJaWYgKCFzdHJuY21wKHN0ciwgIm9sZF9tYXAiLCA3KSkKLQkJc2V0X2JpdChFRklfT0xEX01FTU1BUCwgJng4Nl9lZmlfZmFjaWxpdHkpOworCQlzZXRfYml0KEVGSV9PTERfTUVNTUFQLCAmZWZpLmZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIxOSw3ICsxMzI4LDcgQEAKIAkgKiBmaXJtd2FyZS9rZXJuZWwgYXJjaGl0ZWN0dXJlcyBzaW5jZSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBydW50aW1lCiAJICogc2VydmljZXMuCiAJICovCi0JaWYgKCFlZmlfaXNfbmF0aXZlKCkpIHsKKwlpZiAoIWVmaV9ydW50aW1lX3N1cHBvcnRlZCgpKSB7CiAJCXByX2luZm8oImVmaTogU2V0dXAgZG9uZSwgZGlzYWJsaW5nIGR1ZSB0byAzMi82NC1iaXQgbWlzbWF0Y2hcbiIpOwogCQllZmlfdW5tYXBfbWVtbWFwKCk7CiAJfQpAQCAtMTIyOCw1ICsxMzM3LDUgQEAKIAkgKiBVViBkb2Vzbid0IHN1cHBvcnQgdGhlIG5ldyBFRkkgcGFnZXRhYmxlIG1hcHBpbmcgeWV0LgogCSAqLwogCWlmIChpc191dl9zeXN0ZW0oKSkKLQkJc2V0X2JpdChFRklfT0xEX01FTU1BUCwgJng4Nl9lZmlfZmFjaWxpdHkpOworCQlzZXRfYml0KEVGSV9PTERfTUVNTUFQLCAmZWZpLmZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfMzIuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfMzIuYwppbmRleCAwYjc0Y2RmLi45ZWUzNDkxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jCkBAIC00MCw3ICs0MCwxMiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZWZpX3J0X2VmbGFnczsKIAogdm9pZCBlZmlfc3luY19sb3dfa2VybmVsX21hcHBpbmdzKHZvaWQpIHt9Ci12b2lkIGVmaV9zZXR1cF9wYWdlX3RhYmxlcyh2b2lkKSB7fQordm9pZCBfX2luaXQgZWZpX2R1bXBfcGFnZXRhYmxlKHZvaWQpIHt9CitpbnQgZWZpX3NldHVwX3BhZ2VfdGFibGVzKHVuc2lnbmVkIGxvbmcgcGFfbWVtbWFwLCB1bnNpZ25lZCBudW1fcGFnZXMpCit7CisJcmV0dXJuIDA7Cit9Cit2b2lkIGVmaV9jbGVhbnVwX3BhZ2VfdGFibGVzKHVuc2lnbmVkIGxvbmcgcGFfbWVtbWFwLCB1bnNpZ25lZCBudW1fcGFnZXMpIHt9CiAKIHZvaWQgX19pbml0IGVmaV9tYXBfcmVnaW9uKGVmaV9tZW1vcnlfZGVzY190ICptZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfNjQuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfNjQuYwppbmRleCAwYzJhMjM0Li4yOTBkMzk3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL3JlYWxtb2RlLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIAogc3RhdGljIHBnZF90ICpzYXZlX3BnZCBfX2luaXRkYXRhOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZWZpX2ZsYWdzIF9faW5pdGRhdGE7CkBAIC01OCw3ICs1OSw4IEBACiAJdTY0IHByZXZfY3IzOwogCXBnZF90ICplZmlfcGd0OwogCWJvb2wgdXNlX3BnZDsKLX07CisJdTY0IHBoeXNfc3RhY2s7Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfY29kZV9tYXBwaW5nX3NldF9leGVjKGludCBleGVjdXRhYmxlKQogewpAQCAtMTM3LDEyICsxMzksNjQgQEAKIAkJc2l6ZW9mKHBnZF90KSAqIG51bV9wZ2RzKTsKIH0KIAotdm9pZCBlZmlfc2V0dXBfcGFnZV90YWJsZXModm9pZCkKK2ludCBlZmlfc2V0dXBfcGFnZV90YWJsZXModW5zaWduZWQgbG9uZyBwYV9tZW1tYXAsIHVuc2lnbmVkIG51bV9wYWdlcykKIHsKLQllZmlfc2NyYXRjaC5lZmlfcGd0ID0gKHBnZF90ICopKHVuc2lnbmVkIGxvbmcpcmVhbF9tb2RlX2hlYWRlci0+dHJhbXBvbGluZV9wZ2Q7CisJdW5zaWduZWQgbG9uZyB0ZXh0OworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIG5wYWdlczsKKwlwZ2RfdCAqcGdkOwogCi0JaWYgKCFlZmlfZW5hYmxlZChFRklfT0xEX01FTU1BUCkpCi0JCWVmaV9zY3JhdGNoLnVzZV9wZ2QgPSB0cnVlOworCWlmIChlZmlfZW5hYmxlZChFRklfT0xEX01FTU1BUCkpCisJCXJldHVybiAwOworCisJZWZpX3NjcmF0Y2guZWZpX3BndCA9IChwZ2RfdCAqKSh1bnNpZ25lZCBsb25nKXJlYWxfbW9kZV9oZWFkZXItPnRyYW1wb2xpbmVfcGdkOworCXBnZCA9IF9fdmEoZWZpX3NjcmF0Y2guZWZpX3BndCk7CisKKwkvKgorCSAqIEl0IGNhbiBoYXBwZW4gdGhhdCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBuZXdfbWVtbWFwIGxhbmRzIGluIG1lbW9yeQorCSAqIHdoaWNoIGlzIG5vdCBtYXBwZWQgaW4gdGhlIEVGSSBwYWdlIHRhYmxlLiBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbworCSAqIGFuZCBpZGVudC1tYXAgdGhvc2UgcGFnZXMgY29udGFpbmluZyB0aGUgbWFwIGJlZm9yZSBjYWxsaW5nCisJICogcGh5c19lZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAoKS4KKwkgKi8KKwlpZiAoa2VybmVsX21hcF9wYWdlc19pbl9wZ2QocGdkLCBwYV9tZW1tYXAsIHBhX21lbW1hcCwgbnVtX3BhZ2VzLCBfUEFHRV9OWCkpIHsKKwkJcHJfZXJyKCJFcnJvciBpZGVudC1tYXBwaW5nIG5ldyBtZW1tYXAgKDB4JWx4KSFcbiIsIHBhX21lbW1hcCk7CisJCXJldHVybiAxOworCX0KKworCWVmaV9zY3JhdGNoLnVzZV9wZ2QgPSB0cnVlOworCisJLyoKKwkgKiBXaGVuIG1ha2luZyBjYWxscyB0byB0aGUgZmlybXdhcmUgZXZlcnl0aGluZyBuZWVkcyB0byBiZSAxOjEKKwkgKiBtYXBwZWQgYW5kIGFkZHJlc3NhYmxlIHdpdGggMzItYml0IHBvaW50ZXJzLiBNYXAgdGhlIGtlcm5lbAorCSAqIHRleHQgYW5kIGFsbG9jYXRlIGEgbmV3IHN0YWNrIGJlY2F1c2Ugd2UgY2FuJ3QgcmVseSBvbiB0aGUKKwkgKiBzdGFjayBwb2ludGVyIGJlaW5nIDwgNEdCLgorCSAqLworCWlmICghSVNfRU5BQkxFRChDT05GSUdfRUZJX01JWEVEKSkKKwkJcmV0dXJuIDA7CisKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX0RNQTMyKTsKKwlpZiAoIXBhZ2UpCisJCXBhbmljKCJVbmFibGUgdG8gYWxsb2NhdGUgRUZJIHJ1bnRpbWUgc3RhY2sgPCA0R0JcbiIpOworCisJZWZpX3NjcmF0Y2gucGh5c19zdGFjayA9IHZpcnRfdG9fcGh5cyhwYWdlX2FkZHJlc3MocGFnZSkpOworCWVmaV9zY3JhdGNoLnBoeXNfc3RhY2sgKz0gUEFHRV9TSVpFOyAvKiBzdGFjayBncm93cyBkb3duICovCisKKwlucGFnZXMgPSAoX2VuZCAtIF90ZXh0KSA+PiBQQUdFX1NISUZUOworCXRleHQgPSBfX3BhKF90ZXh0KTsKKworCWlmIChrZXJuZWxfbWFwX3BhZ2VzX2luX3BnZChwZ2QsIHRleHQgPj4gUEFHRV9TSElGVCwgdGV4dCwgbnBhZ2VzLCAwKSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBtYXAga2VybmVsIHRleHQgMToxXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZWZpX2NsZWFudXBfcGFnZV90YWJsZXModW5zaWduZWQgbG9uZyBwYV9tZW1tYXAsIHVuc2lnbmVkIG51bV9wYWdlcykKK3sKKwlwZ2RfdCAqcGdkID0gKHBnZF90ICopX192YShyZWFsX21vZGVfaGVhZGVyLT50cmFtcG9saW5lX3BnZCk7CisKKwlrZXJuZWxfdW5tYXBfcGFnZXNfaW5fcGdkKHBnZCwgcGFfbWVtbWFwLCBudW1fcGFnZXMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgX19tYXBfcmVnaW9uKGVmaV9tZW1vcnlfZGVzY190ICptZCwgdTY0IHZhKQpAQCAtMTczLDYgKzIyNywxNiBAQAogCSAqLwogCV9fbWFwX3JlZ2lvbihtZCwgbWQtPnBoeXNfYWRkcik7CiAKKwkvKgorCSAqIEVuZm9yY2UgdGhlIDE6MSBtYXBwaW5nIGFzIHRoZSBkZWZhdWx0IHZpcnR1YWwgYWRkcmVzcyB3aGVuCisJICogYm9vdGluZyBpbiBFRkkgbWl4ZWQgbW9kZSwgYmVjYXVzZSBldmVuIHRob3VnaCB3ZSBtYXkgYmUKKwkgKiBydW5uaW5nIGEgNjQtYml0IGtlcm5lbCwgdGhlIGZpcm13YXJlIG1heSBvbmx5IGJlIDMyLWJpdC4KKwkgKi8KKwlpZiAoIWVmaV9pc19uYXRpdmUgKCkgJiYgSVNfRU5BQkxFRChDT05GSUdfRUZJX01JWEVEKSkgeworCQltZC0+dmlydF9hZGRyID0gbWQtPnBoeXNfYWRkcjsKKwkJcmV0dXJuOworCX0KKwogCWVmaV92YSAtPSBzaXplOwogCiAJLyogSXMgUEEgMk0tYWxpZ25lZD8gKi8KQEAgLTI0MiwzICszMDYsMjk5IEBACiAJaWYgKF9fc3VwcG9ydGVkX3B0ZV9tYXNrICYgX1BBR0VfTlgpCiAJCXJ1bnRpbWVfY29kZV9wYWdlX21rZXhlYygpOwogfQorCit2b2lkIF9faW5pdCBlZmlfZHVtcF9wYWdldGFibGUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfRUZJX1BHVF9EVU1QCisJcGdkX3QgKnBnZCA9IChwZ2RfdCAqKV9fdmEocmVhbF9tb2RlX2hlYWRlci0+dHJhbXBvbGluZV9wZ2QpOworCisJcHRkdW1wX3dhbGtfcGdkX2xldmVsKE5VTEwsIHBnZCk7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19FRklfTUlYRUQKK2V4dGVybiBlZmlfc3RhdHVzX3QgZWZpNjRfdGh1bmsodTMyLCAuLi4pOworCisjZGVmaW5lIHJ1bnRpbWVfc2VydmljZTMyKGZ1bmMpCQkJCQkJIFwKKyh7CQkJCQkJCQkJIFwKKwl1MzIgdGFibGUgPSAodTMyKSh1bnNpZ25lZCBsb25nKWVmaS5zeXN0YWI7CQkJIFwKKwl1MzIgKnJ0LCAqX19fZjsJCQkJCQkJIFwKKwkJCQkJCQkJCSBcCisJcnQgPSAodTMyICopKHRhYmxlICsgb2Zmc2V0b2YoZWZpX3N5c3RlbV90YWJsZV8zMl90LCBydW50aW1lKSk7CSBcCisJX19fZiA9ICh1MzIgKikoKnJ0ICsgb2Zmc2V0b2YoZWZpX3J1bnRpbWVfc2VydmljZXNfMzJfdCwgZnVuYykpOyBcCisJKl9fX2Y7CQkJCQkJCQkgXAorfSkKKworLyoKKyAqIFN3aXRjaCB0byB0aGUgRUZJIHBhZ2UgdGFibGVzIGVhcmx5IHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGUgMToxCisgKiBydW50aW1lIHNlcnZpY2VzIG1hcHBpbmdzIHdoaWNoIGFyZSBub3QgbWFwcGVkIGluIGFueSBvdGhlciBwYWdlCisgKiB0YWJsZXMuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bnRpbWVfc2VydmljZTMyKCkuCisgKgorICogQWxzbywgZGlzYWJsZSBpbnRlcnJ1cHRzIGJlY2F1c2UgdGhlIElEVCBwb2ludHMgdG8gNjQtYml0IGhhbmRsZXJzLAorICogd2hpY2ggYXJlbid0IGdvaW5nIHRvIGZ1bmN0aW9uIGNvcnJlY3RseSB3aGVuIHdlIHN3aXRjaCB0byAzMi1iaXQuCisgKi8KKyNkZWZpbmUgZWZpX3RodW5rKGYsIC4uLikJCQkJCQlcCisoewkJCQkJCQkJCVwKKwllZmlfc3RhdHVzX3QgX19zOwkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJCVwKKwl1MzIgZnVuYzsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWVmaV9zeW5jX2xvd19rZXJuZWxfbWFwcGluZ3MoKTsJCQkJCVwKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CQkJCQkJXAorCQkJCQkJCQkJXAorCWVmaV9zY3JhdGNoLnByZXZfY3IzID0gcmVhZF9jcjMoKTsJCQkJXAorCXdyaXRlX2NyMygodW5zaWduZWQgbG9uZyllZmlfc2NyYXRjaC5lZmlfcGd0KTsJCQlcCisJX19mbHVzaF90bGJfYWxsKCk7CQkJCQkJXAorCQkJCQkJCQkJXAorCWZ1bmMgPSBydW50aW1lX3NlcnZpY2UzMihmKTsJCQkJCVwKKwlfX3MgPSBlZmk2NF90aHVuayhmdW5jLCBfX1ZBX0FSR1NfXyk7CQkJXAorCQkJCQkJCQkJXAorCXdyaXRlX2NyMyhlZmlfc2NyYXRjaC5wcmV2X2NyMyk7CQkJCVwKKwlfX2ZsdXNoX3RsYl9hbGwoKTsJCQkJCQlcCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkJCQkJXAorCQkJCQkJCQkJXAorCV9fczsJCQkJCQkJCVwKK30pCisKK2VmaV9zdGF0dXNfdCBlZmlfdGh1bmtfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAoCisJdm9pZCAqcGh5c19zZXRfdmlydHVhbF9hZGRyZXNzX21hcCwKKwl1bnNpZ25lZCBsb25nIG1lbW9yeV9tYXBfc2l6ZSwKKwl1bnNpZ25lZCBsb25nIGRlc2NyaXB0b3Jfc2l6ZSwKKwl1MzIgZGVzY3JpcHRvcl92ZXJzaW9uLAorCWVmaV9tZW1vcnlfZGVzY190ICp2aXJ0dWFsX21hcCkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGZ1bmM7CisKKwllZmlfc3luY19sb3dfa2VybmVsX21hcHBpbmdzKCk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZWZpX3NjcmF0Y2gucHJldl9jcjMgPSByZWFkX2NyMygpOworCXdyaXRlX2NyMygodW5zaWduZWQgbG9uZyllZmlfc2NyYXRjaC5lZmlfcGd0KTsKKwlfX2ZsdXNoX3RsYl9hbGwoKTsKKworCWZ1bmMgPSAodTMyKSh1bnNpZ25lZCBsb25nKXBoeXNfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXA7CisJc3RhdHVzID0gZWZpNjRfdGh1bmsoZnVuYywgbWVtb3J5X21hcF9zaXplLCBkZXNjcmlwdG9yX3NpemUsCisJCQkgICAgIGRlc2NyaXB0b3JfdmVyc2lvbiwgdmlydHVhbF9tYXApOworCisJd3JpdGVfY3IzKGVmaV9zY3JhdGNoLnByZXZfY3IzKTsKKwlfX2ZsdXNoX3RsYl9hbGwoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190IGVmaV90aHVua19nZXRfdGltZShlZmlfdGltZV90ICp0bSwgZWZpX3RpbWVfY2FwX3QgKnRjKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTMyIHBoeXNfdG0sIHBoeXNfdGM7CisKKwlzcGluX2xvY2soJnJ0Y19sb2NrKTsKKworCXBoeXNfdG0gPSB2aXJ0X3RvX3BoeXModG0pOworCXBoeXNfdGMgPSB2aXJ0X3RvX3BoeXModGMpOworCisJc3RhdHVzID0gZWZpX3RodW5rKGdldF90aW1lLCBwaHlzX3RtLCBwaHlzX3RjKTsKKworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190IGVmaV90aHVua19zZXRfdGltZShlZmlfdGltZV90ICp0bSkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBwaHlzX3RtOworCisJc3Bpbl9sb2NrKCZydGNfbG9jayk7CisKKwlwaHlzX3RtID0gdmlydF90b19waHlzKHRtKTsKKworCXN0YXR1cyA9IGVmaV90aHVuayhzZXRfdGltZSwgcGh5c190bSk7CisKKwlzcGluX3VubG9jaygmcnRjX2xvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorZWZpX3RodW5rX2dldF93YWtldXBfdGltZShlZmlfYm9vbF90ICplbmFibGVkLCBlZmlfYm9vbF90ICpwZW5kaW5nLAorCQkJICBlZmlfdGltZV90ICp0bSkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBwaHlzX2VuYWJsZWQsIHBoeXNfcGVuZGluZywgcGh5c190bTsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCisJcGh5c19lbmFibGVkID0gdmlydF90b19waHlzKGVuYWJsZWQpOworCXBoeXNfcGVuZGluZyA9IHZpcnRfdG9fcGh5cyhwZW5kaW5nKTsKKwlwaHlzX3RtID0gdmlydF90b19waHlzKHRtKTsKKworCXN0YXR1cyA9IGVmaV90aHVuayhnZXRfd2FrZXVwX3RpbWUsIHBoeXNfZW5hYmxlZCwKKwkJCSAgICAgcGh5c19wZW5kaW5nLCBwaHlzX3RtKTsKKworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitlZmlfdGh1bmtfc2V0X3dha2V1cF90aW1lKGVmaV9ib29sX3QgZW5hYmxlZCwgZWZpX3RpbWVfdCAqdG0pCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1MzIgcGh5c190bTsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCisJcGh5c190bSA9IHZpcnRfdG9fcGh5cyh0bSk7CisKKwlzdGF0dXMgPSBlZmlfdGh1bmsoc2V0X3dha2V1cF90aW1lLCBlbmFibGVkLCBwaHlzX3RtKTsKKworCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2VmaV90aHVua19nZXRfdmFyaWFibGUoZWZpX2NoYXIxNl90ICpuYW1lLCBlZmlfZ3VpZF90ICp2ZW5kb3IsCisJCSAgICAgICB1MzIgKmF0dHIsIHVuc2lnbmVkIGxvbmcgKmRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBwaHlzX25hbWUsIHBoeXNfdmVuZG9yLCBwaHlzX2F0dHI7CisJdTMyIHBoeXNfZGF0YV9zaXplLCBwaHlzX2RhdGE7CisKKwlwaHlzX2RhdGFfc2l6ZSA9IHZpcnRfdG9fcGh5cyhkYXRhX3NpemUpOworCXBoeXNfdmVuZG9yID0gdmlydF90b19waHlzKHZlbmRvcik7CisJcGh5c19uYW1lID0gdmlydF90b19waHlzKG5hbWUpOworCXBoeXNfYXR0ciA9IHZpcnRfdG9fcGh5cyhhdHRyKTsKKwlwaHlzX2RhdGEgPSB2aXJ0X3RvX3BoeXMoZGF0YSk7CisKKwlzdGF0dXMgPSBlZmlfdGh1bmsoZ2V0X3ZhcmlhYmxlLCBwaHlzX25hbWUsIHBoeXNfdmVuZG9yLAorCQkJICAgcGh5c19hdHRyLCBwaHlzX2RhdGFfc2l6ZSwgcGh5c19kYXRhKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2VmaV90aHVua19zZXRfdmFyaWFibGUoZWZpX2NoYXIxNl90ICpuYW1lLCBlZmlfZ3VpZF90ICp2ZW5kb3IsCisJCSAgICAgICB1MzIgYXR0ciwgdW5zaWduZWQgbG9uZyBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCit7CisJdTMyIHBoeXNfbmFtZSwgcGh5c192ZW5kb3IsIHBoeXNfZGF0YTsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCisJcGh5c19uYW1lID0gdmlydF90b19waHlzKG5hbWUpOworCXBoeXNfdmVuZG9yID0gdmlydF90b19waHlzKHZlbmRvcik7CisJcGh5c19kYXRhID0gdmlydF90b19waHlzKGRhdGEpOworCisJLyogSWYgZGF0YV9zaXplIGlzID4gc2l6ZW9mKHUzMikgd2UndmUgZ290IHByb2JsZW1zICovCisJc3RhdHVzID0gZWZpX3RodW5rKHNldF92YXJpYWJsZSwgcGh5c19uYW1lLCBwaHlzX3ZlbmRvciwKKwkJCSAgIGF0dHIsIGRhdGFfc2l6ZSwgcGh5c19kYXRhKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2VmaV90aHVua19nZXRfbmV4dF92YXJpYWJsZSh1bnNpZ25lZCBsb25nICpuYW1lX3NpemUsCisJCQkgICAgZWZpX2NoYXIxNl90ICpuYW1lLAorCQkJICAgIGVmaV9ndWlkX3QgKnZlbmRvcikKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBwaHlzX25hbWVfc2l6ZSwgcGh5c19uYW1lLCBwaHlzX3ZlbmRvcjsKKworCXBoeXNfbmFtZV9zaXplID0gdmlydF90b19waHlzKG5hbWVfc2l6ZSk7CisJcGh5c192ZW5kb3IgPSB2aXJ0X3RvX3BoeXModmVuZG9yKTsKKwlwaHlzX25hbWUgPSB2aXJ0X3RvX3BoeXMobmFtZSk7CisKKwlzdGF0dXMgPSBlZmlfdGh1bmsoZ2V0X25leHRfdmFyaWFibGUsIHBoeXNfbmFtZV9zaXplLAorCQkJICAgcGh5c19uYW1lLCBwaHlzX3ZlbmRvcik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitlZmlfdGh1bmtfZ2V0X25leHRfaGlnaF9tb25vX2NvdW50KHUzMiAqY291bnQpCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1MzIgcGh5c19jb3VudDsKKworCXBoeXNfY291bnQgPSB2aXJ0X3RvX3BoeXMoY291bnQpOworCXN0YXR1cyA9IGVmaV90aHVuayhnZXRfbmV4dF9oaWdoX21vbm9fY291bnQsIHBoeXNfY291bnQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK2VmaV90aHVua19yZXNldF9zeXN0ZW0oaW50IHJlc2V0X3R5cGUsIGVmaV9zdGF0dXNfdCBzdGF0dXMsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwgZWZpX2NoYXIxNl90ICpkYXRhKQoreworCXUzMiBwaHlzX2RhdGE7CisKKwlwaHlzX2RhdGEgPSB2aXJ0X3RvX3BoeXMoZGF0YSk7CisKKwllZmlfdGh1bmsocmVzZXRfc3lzdGVtLCByZXNldF90eXBlLCBzdGF0dXMsIGRhdGFfc2l6ZSwgcGh5c19kYXRhKTsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorZWZpX3RodW5rX3VwZGF0ZV9jYXBzdWxlKGVmaV9jYXBzdWxlX2hlYWRlcl90ICoqY2Fwc3VsZXMsCisJCQkgdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyBzZ19saXN0KQoreworCS8qCisJICogVG8gcHJvcGVybHkgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uIHdlIHdvdWxkIG5lZWQgdG8gcmVwYWNrYWdlCisJICogJ2NhcHN1bGVzJyBiZWNhdXNlIHRoZSBmaXJtd2FyZSBkb2Vzbid0IHVuZGVyc3RhbmQgNjQtYml0CisJICogcG9pbnRlcnMuCisJICovCisJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorZWZpX3RodW5rX3F1ZXJ5X3ZhcmlhYmxlX2luZm8odTMyIGF0dHIsIHU2NCAqc3RvcmFnZV9zcGFjZSwKKwkJCSAgICAgIHU2NCAqcmVtYWluaW5nX3NwYWNlLAorCQkJICAgICAgdTY0ICptYXhfdmFyaWFibGVfc2l6ZSkKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBwaHlzX3N0b3JhZ2UsIHBoeXNfcmVtYWluaW5nLCBwaHlzX21heDsKKworCWlmIChlZmkucnVudGltZV92ZXJzaW9uIDwgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQorCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOworCisJcGh5c19zdG9yYWdlID0gdmlydF90b19waHlzKHN0b3JhZ2Vfc3BhY2UpOworCXBoeXNfcmVtYWluaW5nID0gdmlydF90b19waHlzKHJlbWFpbmluZ19zcGFjZSk7CisJcGh5c19tYXggPSB2aXJ0X3RvX3BoeXMobWF4X3ZhcmlhYmxlX3NpemUpOworCisJc3RhdHVzID0gZWZpX3RodW5rKHF1ZXJ5X3ZhcmlhYmxlX2luZm8sIGF0dHIsIHBoeXNfc3RvcmFnZSwKKwkJCSAgIHBoeXNfcmVtYWluaW5nLCBwaHlzX21heCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitlZmlfdGh1bmtfcXVlcnlfY2Fwc3VsZV9jYXBzKGVmaV9jYXBzdWxlX2hlYWRlcl90ICoqY2Fwc3VsZXMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHU2NCAqbWF4X3NpemUsCisJCQkgICAgIGludCAqcmVzZXRfdHlwZSkKK3sKKwkvKgorCSAqIFRvIHByb3Blcmx5IHN1cHBvcnQgdGhpcyBmdW5jdGlvbiB3ZSB3b3VsZCBuZWVkIHRvIHJlcGFja2FnZQorCSAqICdjYXBzdWxlcycgYmVjYXVzZSB0aGUgZmlybXdhcmUgZG9lc24ndCB1bmRlcnN0YW5kIDY0LWJpdAorCSAqIHBvaW50ZXJzLgorCSAqLworCXJldHVybiBFRklfVU5TVVBQT1JURUQ7Cit9CisKK3ZvaWQgZWZpX3RodW5rX3J1bnRpbWVfc2V0dXAodm9pZCkKK3sKKwllZmkuZ2V0X3RpbWUgPSBlZmlfdGh1bmtfZ2V0X3RpbWU7CisJZWZpLnNldF90aW1lID0gZWZpX3RodW5rX3NldF90aW1lOworCWVmaS5nZXRfd2FrZXVwX3RpbWUgPSBlZmlfdGh1bmtfZ2V0X3dha2V1cF90aW1lOworCWVmaS5zZXRfd2FrZXVwX3RpbWUgPSBlZmlfdGh1bmtfc2V0X3dha2V1cF90aW1lOworCWVmaS5nZXRfdmFyaWFibGUgPSBlZmlfdGh1bmtfZ2V0X3ZhcmlhYmxlOworCWVmaS5nZXRfbmV4dF92YXJpYWJsZSA9IGVmaV90aHVua19nZXRfbmV4dF92YXJpYWJsZTsKKwllZmkuc2V0X3ZhcmlhYmxlID0gZWZpX3RodW5rX3NldF92YXJpYWJsZTsKKwllZmkuZ2V0X25leHRfaGlnaF9tb25vX2NvdW50ID0gZWZpX3RodW5rX2dldF9uZXh0X2hpZ2hfbW9ub19jb3VudDsKKwllZmkucmVzZXRfc3lzdGVtID0gZWZpX3RodW5rX3Jlc2V0X3N5c3RlbTsKKwllZmkucXVlcnlfdmFyaWFibGVfaW5mbyA9IGVmaV90aHVua19xdWVyeV92YXJpYWJsZV9pbmZvOworCWVmaS51cGRhdGVfY2Fwc3VsZSA9IGVmaV90aHVua191cGRhdGVfY2Fwc3VsZTsKKwllZmkucXVlcnlfY2Fwc3VsZV9jYXBzID0gZWZpX3RodW5rX3F1ZXJ5X2NhcHN1bGVfY2FwczsKK30KKyNlbmRpZiAvKiBDT05GSUdfRUZJX01JWEVEICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpX3N0dWJfNjQuUyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfc3R1Yl82NC5TCmluZGV4IDg4MDczYjEuLmUwOTg0ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfc3R1Yl82NC5TCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfc3R1Yl82NC5TCkBAIC03LDYgKzcsMTAgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KKyNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgogCiAjZGVmaW5lIFNBVkVfWE1NCQkJXAogCW1vdiAlcnNwLCAlcmF4OwkJCVwKQEAgLTE2NCw3ICsxNjgsMTY5IEBACiAJcmV0CiBFTkRQUk9DKGVmaV9jYWxsNikKIAorI2lmZGVmIENPTkZJR19FRklfTUlYRUQKKworLyoKKyAqIFdlIHJ1biB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIDE6MSBtYXBwaW5nLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIHdpdGggYSAxOjEgbWFwcGVkIHN0YWNrLgorICovCitFTlRSWShfX2VmaTY0X3RodW5rKQorCW1vdmwJJWRzLCAlZWF4CisJcHVzaAklcmF4CisJbW92bAklZXMsICVlYXgKKwlwdXNoCSVyYXgKKwltb3ZsCSVzcywgJWVheAorCXB1c2gJJXJheAorCisJc3VicQkkMzIsICVyc3AKKwltb3ZsCSVlc2ksIDB4MCglcnNwKQorCW1vdmwJJWVkeCwgMHg0KCVyc3ApCisJbW92bAklZWN4LCAweDgoJXJzcCkKKwltb3ZxCSVyOCwgJXJzaQorCW1vdmwJJWVzaSwgMHhjKCVyc3ApCisJbW92cQklcjksICVyc2kKKwltb3ZsCSVlc2ksICAweDEwKCVyc3ApCisKKwlzZ2R0CXNhdmVfZ2R0KCVyaXApCisKKwlsZWFxCTFmKCVyaXApLCAlcmJ4CisJbW92cQklcmJ4LCBmdW5jX3J0X3B0ciglcmlwKQorCisJLyogU3dpdGNoIHRvIGdkdCB3aXRoIDMyLWJpdCBzZWdtZW50cyAqLworCW1vdmwJNjQoJXJzcCksICVlYXgKKwlsZ2R0CSglcmF4KQorCisJbGVhcQllZmlfZW50ZXIzMiglcmlwKSwgJXJheAorCXB1c2hxCSRfX0tFUk5FTF9DUworCXB1c2hxCSVyYXgKKwlscmV0cQorCisxOglhZGRxCSQzMiwgJXJzcAorCisJbGdkdAlzYXZlX2dkdCglcmlwKQorCisJcG9wCSVyYngKKwltb3ZsCSVlYngsICVzcworCXBvcAklcmJ4CisJbW92bAklZWJ4LCAlZXMKKwlwb3AJJXJieAorCW1vdmwJJWVieCwgJWRzCisKKwkvKgorCSAqIENvbnZlcnQgMzItYml0IHN0YXR1cyBjb2RlIGludG8gNjQtYml0LgorCSAqLworCXRlc3QJJXJheCwgJXJheAorCWp6CTFmCisJbW92bAklZWF4LCAlZWN4CisJYW5kbAkkMHgwZmZmZmZmZiwgJWVjeAorCWFuZGwJJDB4ZjAwMDAwMDAsICVlYXgKKwlzaGwJJDMyLCAlcmF4CisJb3IJJXJjeCwgJXJheAorMToKKwlyZXQKK0VORFBST0MoX19lZmk2NF90aHVuaykKKworRU5UUlkoZWZpX2V4aXQzMikKKwltb3ZxCWZ1bmNfcnRfcHRyKCVyaXApLCAlcmF4CisJcHVzaAklcmF4CisJbW92CSVyZGksICVyYXgKKwlyZXQKK0VORFBST0MoZWZpX2V4aXQzMikKKworCS5jb2RlMzIKKy8qCisgKiBFRkkgc2VydmljZSBwb2ludGVyIG11c3QgYmUgaW4gJWVkaS4KKyAqCisgKiBUaGUgc3RhY2sgc2hvdWxkIHJlcHJlc2VudCB0aGUgMzItYml0IGNhbGxpbmcgY29udmVudGlvbi4KKyAqLworRU5UUlkoZWZpX2VudGVyMzIpCisJbW92bAkkX19LRVJORUxfRFMsICVlYXgKKwltb3ZsCSVlYXgsICVkcworCW1vdmwJJWVheCwgJWVzCisJbW92bAklZWF4LCAlc3MKKworCS8qIFJlbG9hZCBwZ3RhYmxlcyAqLworCW1vdmwJJWNyMywgJWVheAorCW1vdmwJJWVheCwgJWNyMworCisJLyogRGlzYWJsZSBwYWdpbmcgKi8KKwltb3ZsCSVjcjAsICVlYXgKKwlidHJsCSRYODZfQ1IwX1BHX0JJVCwgJWVheAorCW1vdmwJJWVheCwgJWNyMAorCisJLyogRGlzYWJsZSBsb25nIG1vZGUgdmlhIEVGRVIgKi8KKwltb3ZsCSRNU1JfRUZFUiwgJWVjeAorCXJkbXNyCisJYnRybAkkX0VGRVJfTE1FLCAlZWF4CisJd3Jtc3IKKworCWNhbGwJKiVlZGkKKworCS8qIFdlIG11c3QgcHJlc2VydmUgcmV0dXJuIHZhbHVlICovCisJbW92bAklZWF4LCAlZWRpCisKKwkvKgorCSAqIFNvbWUgZmlybXdhcmUgd2lsbCByZXR1cm4gd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuIEJlIHN1cmUgdG8KKwkgKiBkaXNhYmxlIHRoZW0gYmVmb3JlIHdlIHN3aXRjaCBHRFRzLgorCSAqLworCWNsaQorCisJbW92bAk2OCglZXNwKSwgJWVheAorCW1vdmwJJWVheCwgMiglZWF4KQorCWxnZHRsCSglZWF4KQorCisJbW92bAklY3I0LCAlZWF4CisJYnRzbAkkKFg4Nl9DUjRfUEFFX0JJVCksICVlYXgKKwltb3ZsCSVlYXgsICVjcjQKKworCW1vdmwJJWNyMywgJWVheAorCW1vdmwJJWVheCwgJWNyMworCisJbW92bAkkTVNSX0VGRVIsICVlY3gKKwlyZG1zcgorCWJ0c2wJJF9FRkVSX0xNRSwgJWVheAorCXdybXNyCisKKwl4b3JsCSVlYXgsICVlYXgKKwlsbGR0CSVheAorCisJbW92bAk3MiglZXNwKSwgJWVheAorCXB1c2hsCSRfX0tFUk5FTF9DUworCXB1c2hsCSVlYXgKKworCS8qIEVuYWJsZSBwYWdpbmcgKi8KKwltb3ZsCSVjcjAsICVlYXgKKwlidHNsCSRYODZfQ1IwX1BHX0JJVCwgJWVheAorCW1vdmwJJWVheCwgJWNyMAorCWxyZXQKK0VORFBST0MoZWZpX2VudGVyMzIpCisKKwkuZGF0YQorCS5iYWxpZ24JOAorCS5nbG9iYWwJZWZpMzJfYm9vdF9nZHQKK2VmaTMyX2Jvb3RfZ2R0Ogkud29yZAkwCisJCS5xdWFkCTAKKworc2F2ZV9nZHQ6CS53b3JkCTAKKwkJLnF1YWQJMAorZnVuY19ydF9wdHI6CS5xdWFkCTAKKworCS5nbG9iYWwgZWZpX2dkdDY0CitlZmlfZ2R0NjQ6CisJLndvcmQJZWZpX2dkdDY0X2VuZCAtIGVmaV9nZHQ2NAorCS5sb25nCTAJCQkvKiBGaWxsZWQgb3V0IGJ5IHVzZXIgKi8KKwkud29yZAkwCisJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwCS8qIE5VTEwgZGVzY3JpcHRvciAqLworCS5xdWFkCTB4MDBhZjlhMDAwMDAwZmZmZgkvKiBfX0tFUk5FTF9DUyAqLworCS5xdWFkCTB4MDBjZjkyMDAwMDAwZmZmZgkvKiBfX0tFUk5FTF9EUyAqLworCS5xdWFkCTB4MDA4MDg5MDAwMDAwMDAwMAkvKiBUUyBkZXNjcmlwdG9yICovCisJLnF1YWQgICAweDAwMDAwMDAwMDAwMDAwMDAJLyogVFMgY29udGludWVkICovCitlZmlfZ2R0NjRfZW5kOgorI2VuZGlmIC8qIENPTkZJR19FRklfTUlYRUQgKi8KKwogCS5kYXRhCiBFTlRSWShlZmlfc2NyYXRjaCkKIAkuZmlsbCAzLDgsMAogCS5ieXRlIDAKKwkucXVhZCAwCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpX3RodW5rXzY0LlMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpX3RodW5rXzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNmZhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfdGh1bmtfNjQuUwpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgTWF0dCBGbGVtaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgorCisJLnRleHQKKwkuY29kZTY0CitFTlRSWShlZmk2NF90aHVuaykKKwlwdXNoCSVyYnAKKwlwdXNoCSVyYngKKworCS8qCisJICogU3dpdGNoIHRvIDE6MSBtYXBwZWQgMzItYml0IHN0YWNrIHBvaW50ZXIuCisJICovCisJbW92cQklcnNwLCBlZmlfc2F2ZWRfc3AoJXJpcCkKKwltb3ZxCWVmaV9zY3JhdGNoKzI1KCVyaXApLCAlcnNwCisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUga2VybmVsIHRleHQuCisJICovCisJbW92cQkkX19TVEFSVF9LRVJORUxfbWFwLCAlcmF4CisJc3VicQlwaHlzX2Jhc2UoJXJpcCksICVyYXgKKworCS8qCisJICogUHVzaCBzb21lIHBoeXNpY2FsIGFkZHJlc3NlcyBvbnRvIHRoZSBzdGFjay4gVGhpcyBpcyBlYXNpZXIKKwkgKiB0byBkbyBub3cgaW4gYSBjb2RlNjQgc2VjdGlvbiB3aGlsZSB0aGUgYXNzZW1ibGVyIGNhbiBhZGRyZXNzCisJICogNjQtYml0IHZhbHVlcy4gTm90ZSB0aGF0IGFsbCB0aGUgYWRkcmVzc2VzIG9uIHRoZSBzdGFjayBhcmUKKwkgKiAzMi1iaXQuCisJICovCisJc3VicQkkMTYsICVyc3AKKwlsZWFxCWVmaV9leGl0MzIoJXJpcCksICVyYngKKwlzdWJxCSVyYXgsICVyYngKKwltb3ZsCSVlYngsIDgoJXJzcCkKKwlsZWFxCWVmaV9nZHQ2NCglcmlwKSwgJXJieAorCXN1YnEJJXJheCwgJXJieAorCW1vdmwJJWVieCwgMiglZWJ4KQorCW1vdmwJJWVieCwgNCglcnNwKQorCWxlYXEJZWZpX2dkdDMyKCVyaXApLCAlcmJ4CisJc3VicQklcmF4LCAlcmJ4CisJbW92bAklZWJ4LCAyKCVlYngpCisJbW92bAklZWJ4LCAoJXJzcCkKKworCWxlYXEJX19lZmk2NF90aHVuayglcmlwKSwgJXJieAorCXN1YnEJJXJheCwgJXJieAorCWNhbGwJKiVyYngKKworCW1vdnEJZWZpX3NhdmVkX3NwKCVyaXApLCAlcnNwCisJcG9wCSVyYngKKwlwb3AJJXJicAorCXJldHEKK0VORFBST0MoZWZpNjRfdGh1bmspCisKKwkuZGF0YQorZWZpX2dkdDMyOgorCS53b3JkIAllZmlfZ2R0MzJfZW5kIC0gZWZpX2dkdDMyCisJLmxvbmcJMAkJCS8qIEZpbGxlZCBvdXQgYWJvdmUgKi8KKwkud29yZAkwCisJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwCS8qIE5VTEwgZGVzY3JpcHRvciAqLworCS5xdWFkCTB4MDBjZjlhMDAwMDAwZmZmZgkvKiBfX0tFUk5FTF9DUyAqLworCS5xdWFkCTB4MDBjZjkzMDAwMDAwZmZmZgkvKiBfX0tFUk5FTF9EUyAqLworZWZpX2dkdDMyX2VuZDoKKworZWZpX3NhdmVkX3NwOgkJLnF1YWQgMApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vdHM1NTAwL3RzNTUwMC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vdHM1NTAwL3RzNTUwMC5jCmluZGV4IDM5ZmViYjIuLjk0NzFiOTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL3RzNTUwMC90czU1MDAuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS90czU1MDAvdHM1NTAwLmMKQEAgLTg4LDcgKzg4LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmc7CiAJY29uc3Qgc3NpemVfdCBvZmZzZXQ7Ci19IHRzNTUwMF9zaWduYXR1cmVzW10gX19pbml0ZGF0YSA9IHsKK30gdHM1NTAwX3NpZ25hdHVyZXNbXSBfX2luaXRjb25zdCA9IHsKIAl7ICJUUy01eDAwIEFNRCBFbGFuIiwgMHhiMTQgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3Zpc3dzL01ha2VmaWxlIGIvYXJjaC94ODYvcGxhdGZvcm0vdmlzd3MvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmMxN2EuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdmlzd3MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vYmotJChDT05GSUdfWDg2X1ZJU1dTKQkrPSB2aXN3c19xdWlya3MubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vdmlzd3Mvdmlzd3NfcXVpcmtzLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS92aXN3cy92aXN3c19xdWlya3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkOGEzOS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS92aXN3cy92aXN3c19xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vKgotICogIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc3VwcG9ydCBhbmQgcXVpcmtzLCB1bm1haW50YWluZWQuCi0gKgotICogIFNwbGl0IG91dCBmcm9tIHNldHVwLmMgYnkgZGF2ZWpAc3VzZS5kZQotICoKLSAqCUNvcHlyaWdodCAoQykgMTk5OSBCZW50IEhhZ2VtYXJrLCBJbmdvIE1vbG5hcgotICoKLSAqICBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIGludGVycnVwdCBjb250cm9sbGVyCi0gKgotICogIFRoZSBDb2JhbHQgc3lzdGVtIEFTSUMgaW4gdGhlIFZpc3VhbCBXb3Jrc3RhdGlvbiBjb250YWlucyBhICJDb2JhbHQiIEFQSUMKLSAqICB3aGljaCBzZXJ2ZXMgYXMgdGhlIG1haW4gaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gdGhlIHN5c3RlbS4gIE5vbi1sZWdhY3kKLSAqICBoYXJkd2FyZSBpbiB0aGUgc3lzdGVtIHVzZXMgdGhpcyBjb250cm9sbGVyIGRpcmVjdGx5LiAgTGVnYWN5IGRldmljZXMKLSAqICBhcmUgY29ubmVjdGVkIHRvIHRoZSBQSUlYNCB3aGljaCBpbiB0dXJuIGhhcyBpdHMgODI1OShzKSBjb25uZWN0ZWQgdG8KLSAqICBhIG9mIHRoZSBDb2JhbHQgQVBJQyBlbnRyeS4KLSAqCi0gKiAgMDkvMDIvMjAwMCAtIFVwZGF0ZWQgZm9yIDIuNCBieSBqYmFybmVzQHNnaS5jb20KLSAqCi0gKiAgMjUvMTEvMjAwMiAtIFVwZGF0ZWQgZm9yIDIuNSBieSBBbmRyZXkgUGFuaW4gPHBhemtlQG9yYml0YTEucnU+Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0KLSNpbmNsdWRlIDxhc20vdmlzd3MvY29iYWx0Lmg+Ci0jaW5jbHVkZSA8YXNtL3Zpc3dzL3BpaXg0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL2U4MjAuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLQotI2luY2x1ZGUgPGFzbS9pODI1OS5oPgotI2luY2x1ZGUgPGFzbS9pcnFfdmVjdG9ycy5oPgotI2luY2x1ZGUgPGFzbS92aXN3cy9saXRoaXVtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KLQotZXh0ZXJuIGludCBub19icm9hZGNhc3Q7Ci0KLWNoYXIgdmlzd3NfYm9hcmRfdHlwZQk9IC0xOwotY2hhciB2aXN3c19ib2FyZF9yZXYJPSAtMTsKLQotc3RhdGljIHZvaWQgX19pbml0IHZpc3dzX3RpbWVfaW5pdCh2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gIlN0YXJ0aW5nIENvYmFsdCBUaW1lciBzeXN0ZW0gY2xvY2tcbiIpOwotCi0JLyogU2V0IHRoZSBjb3VudGRvd24gdmFsdWUgKi8KLQljb19jcHVfd3JpdGUoQ09fQ1BVX1RJTUVWQUwsIENPX1RJTUVfSFovSFopOwotCi0JLyogU3RhcnQgdGhlIHRpbWVyICovCi0JY29fY3B1X3dyaXRlKENPX0NQVV9DVFJMLCBjb19jcHVfcmVhZChDT19DUFVfQ1RSTCkgfCBDT19DVFJMX1RJTUVSVU4pOwotCi0JLyogRW5hYmxlICh1bm1hc2spIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KLQljb19jcHVfd3JpdGUoQ09fQ1BVX0NUUkwsIGNvX2NwdV9yZWFkKENPX0NQVV9DVFJMKSAmIH5DT19DVFJMX1RJTUVNQVNLKTsKLQotCXNldHVwX2RlZmF1bHRfdGltZXJfaXJxKCk7Ci19Ci0KLS8qIFJlcGxhY2VzIHRoZSBkZWZhdWx0IGluaXRfSVNBX2lycXMgaW4gdGhlIGdlbmVyaWMgc2V0dXAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCB2aXN3c19wcmVfaW50cl9pbml0KHZvaWQpOwotCi0vKiBRdWlyayBmb3IgbWFjaGluZSBzcGVjaWZpYyBtZW1vcnkgc2V0dXAuICovCi0KLSNkZWZpbmUgTUIgKDEwMjQgKiAxMDI0KQotCi11bnNpZ25lZCBsb25nIHNnaXZ3ZmJfbWVtX3BoeXM7Ci11bnNpZ25lZCBsb25nIHNnaXZ3ZmJfbWVtX3NpemU7Ci1FWFBPUlRfU1lNQk9MKHNnaXZ3ZmJfbWVtX3BoeXMpOwotRVhQT1JUX1NZTUJPTChzZ2l2d2ZiX21lbV9zaXplKTsKLQotbG9uZyBsb25nIG1lbV9zaXplIF9faW5pdGRhdGEgPSAwOwotCi1zdGF0aWMgY2hhciAqIF9faW5pdCB2aXN3c19tZW1vcnlfc2V0dXAodm9pZCkKLXsKLQlsb25nIGxvbmcgZ2Z4X21lbV9zaXplID0gOCAqIE1COwotCi0JbWVtX3NpemUgPSBib290X3BhcmFtcy5hbHRfbWVtX2s7Ci0KLQlpZiAoIW1lbV9zaXplKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkJvb3Rsb2FkZXIgZGlkbid0IHNldCBtZW1vcnkgc2l6ZSwgdXBncmFkZSBpdCAhXG4iKTsKLQkJbWVtX3NpemUgPSAxMjggKiBNQjsKLQl9Ci0KLQkvKgotCSAqIHRoaXMgaGFyZGNvZGVzIHRoZSBncmFwaGljcyBtZW1vcnkgdG8gOCBNQgotCSAqIGl0IHJlYWxseSBzaG91bGQgYmUgc2l6ZWQgZHluYW1pY2FsbHkgKG9yIGF0IGxlYXN0Ci0JICogc2V0IGFzIGEgYm9vdCBwYXJhbSkKLQkgKi8KLQlpZiAoIXNnaXZ3ZmJfbWVtX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGVmYXVsdGluZyB0byA4IE1CIGZyYW1lYnVmZmVyIHNpemVcbiIpOwotCQlzZ2l2d2ZiX21lbV9zaXplID0gOCAqIE1COwotCX0KLQotCS8qCi0JICogVHJpbSB0byBuZWFyZXN0IE1CCi0JICovCi0Jc2dpdndmYl9tZW1fc2l6ZSAmPSB+KCgxIDw8IDIwKSAtIDEpOwotCXNnaXZ3ZmJfbWVtX3BoeXMgPSBtZW1fc2l6ZSAtIGdmeF9tZW1fc2l6ZTsKLQotCWU4MjBfYWRkX3JlZ2lvbigwLCBMT1dNRU1TSVpFKCksIEU4MjBfUkFNKTsKLQllODIwX2FkZF9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIC0gc2dpdndmYl9tZW1fc2l6ZSAtIEhJR0hfTUVNT1JZLCBFODIwX1JBTSk7Ci0JZTgyMF9hZGRfcmVnaW9uKHNnaXZ3ZmJfbWVtX3BoeXMsIHNnaXZ3ZmJfbWVtX3NpemUsIEU4MjBfUkVTRVJWRUQpOwotCi0JcmV0dXJuICJQUk9NIjsKLX0KLQotc3RhdGljIHZvaWQgdmlzd3NfbWFjaGluZV9lbWVyZ2VuY3lfcmVzdGFydCh2b2lkKQotewotCS8qCi0JICogVmlzdWFsIFdvcmtzdGF0aW9ucyByZXN0YXJ0IGFmdGVyIHRoaXMKLQkgKiByZWdpc3RlciBpcyBwb2tlZCBvbiB0aGUgUElJWDQKLQkgKi8KLQlvdXRiKFBJSVg0X1JFU0VUX1ZBTCwgUElJWDRfUkVTRVRfUE9SVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpc3dzX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQgcG1fc3RhdHVzOwotLyoJZXh0ZXJuIHVuc2lnbmVkIGludCBwY2lfYnVzMDsgKi8KLQotCXdoaWxlICgocG1fc3RhdHVzID0gaW53KFBNU1RTX1BPUlQpKSAmIDB4MTAwKQotCQlvdXR3KHBtX3N0YXR1cywgUE1TVFNfUE9SVCk7Ci0KLQlvdXR3KFBNX1NVU1BFTkRfRU5BQkxFLCBQTUNOVFJMX1BPUlQpOwotCi0JbWRlbGF5KDEwKTsKLQotI2RlZmluZSBQQ0lfQ09ORjFfQUREUkVTUyhidXMsIGRldmZuLCByZWcpIFwKLQkoMHg4MDAwMDAwMCB8IChidXMgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgKHJlZyAmIH4zKSkKLQotLyoJb3V0bChQQ0lfQ09ORjFfQUREUkVTUyhwY2lfYnVzMCwgU1BFQ0lBTF9ERVYsIFNQRUNJQUxfUkVHKSwgMHhDRjgpOyAqLwotCW91dGwoUElJWF9TUEVDSUFMX1NUT1AsIDB4Q0ZDKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHZpc3dzX2dldF9zbXBfY29uZmlnKHVuc2lnbmVkIGludCBlYXJseSkKLXsKLX0KLQotLyoKLSAqIFRoZSBWaXN1YWwgV29ya3N0YXRpb24gaXMgSW50ZWwgTVAgY29tcGxpYW50IGluIHRoZSBoYXJkd2FyZQotICogc2Vuc2UsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgYSBCSU9TKC1jb25maWd1cmF0aW9uIHRhYmxlKS4KLSAqIE5vIHByb2JsZW0gZm9yIExpbnV4LgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBNUF9wcm9jZXNzb3JfaW5mbyhzdHJ1Y3QgbXBjX2NwdSAqbSkKLXsKLQlpbnQgdmVyLCBsb2dpY2FsX2FwaWNpZDsKLQlwaHlzaWRfbWFza190IGFwaWNfY3B1czsKLQotCWlmICghKG0tPmNwdWZsYWcgJiBDUFVfRU5BQkxFRCkpCi0JCXJldHVybjsKLQotCWxvZ2ljYWxfYXBpY2lkID0gbS0+YXBpY2lkOwotCXByaW50ayhLRVJOX0lORk8gIiVzQ1BVICMlZCAldToldSBBUElDIHZlcnNpb24gJWRcbiIsCi0JICAgICAgIG0tPmNwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUiA/ICJCb290dXAgIiA6ICIiLAotCSAgICAgICBtLT5hcGljaWQsIChtLT5jcHVmZWF0dXJlICYgQ1BVX0ZBTUlMWV9NQVNLKSA+PiA4LAotCSAgICAgICAobS0+Y3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKSA+PiA0LCBtLT5hcGljdmVyKTsKLQotCWlmIChtLT5jcHVmbGFnICYgQ1BVX0JPT1RQUk9DRVNTT1IpCi0JCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG0tPmFwaWNpZDsKLQotCXZlciA9IG0tPmFwaWN2ZXI7Ci0JaWYgKCh2ZXIgPj0gMHgxNCAmJiBtLT5hcGljaWQgPj0gMHhmZikgfHwgbS0+YXBpY2lkID49IDB4ZikgewotCQlwcmludGsoS0VSTl9FUlIgIlByb2Nlc3NvciAjJWQgSU5WQUxJRC4gKE1heCBJRDogJWQpLlxuIiwKLQkJCW0tPmFwaWNpZCwgTUFYX0xPQ0FMX0FQSUMpOwotCQlyZXR1cm47Ci0JfQotCi0JYXBpYy0+YXBpY2lkX3RvX2NwdV9wcmVzZW50KG0tPmFwaWNpZCwgJmFwaWNfY3B1cyk7Ci0JcGh5c2lkc19vcihwaHlzX2NwdV9wcmVzZW50X21hcCwgcGh5c19jcHVfcHJlc2VudF9tYXAsIGFwaWNfY3B1cyk7Ci0JLyoKLQkgKiBWYWxpZGF0ZSB2ZXJzaW9uCi0JICovCi0JaWYgKHZlciA9PSAweDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgQVBJQyB2ZXJzaW9uIGlzIDAgZm9yIENQVSMlZCEgIgotCQkJImZpeGluZyB1cCB0byAweDEwLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsCi0JCQltLT5hcGljaWQpOwotCQl2ZXIgPSAweDEwOwotCX0KLQlhcGljX3ZlcnNpb25bbS0+YXBpY2lkXSA9IHZlcjsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHZpc3dzX2ZpbmRfc21wX2NvbmZpZyh2b2lkKQotewotCXN0cnVjdCBtcGNfY3B1ICptcCA9IHBoeXNfdG9fdmlydChDT19DUFVfVEFCX1BIWVMpOwotCXVuc2lnbmVkIHNob3J0IG5jcHVzID0gcmVhZHcocGh5c190b192aXJ0KENPX0NQVV9OVU1fUEhZUykpOwotCi0JaWYgKG5jcHVzID4gQ09fQ1BVX01BWCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJmaW5kX3Zpc3dzX3NtcDogZ290IGNwdSBjb3VudCBvZiAlZCBhdCAlcFxuIiwKLQkJCW5jcHVzLCBtcCk7Ci0KLQkJbmNwdXMgPSBDT19DUFVfTUFYOwotCX0KLQotCWlmIChuY3B1cyA+IHNldHVwX21heF9jcHVzKQotCQluY3B1cyA9IHNldHVwX21heF9jcHVzOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0Jc21wX2ZvdW5kX2NvbmZpZyA9IDE7Ci0jZW5kaWYKLQl3aGlsZSAobmNwdXMtLSkKLQkJTVBfcHJvY2Vzc29yX2luZm8obXArKyk7Ci0KLQltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKLX0KLQotc3RhdGljIHZvaWQgdmlzd3NfdHJhcF9pbml0KHZvaWQpOwotCi12b2lkIF9faW5pdCB2aXN3c19lYXJseV9kZXRlY3Qodm9pZCkKLXsKLQlpbnQgcmF3OwotCi0Jdmlzd3NfYm9hcmRfdHlwZSA9IChjaGFyKShpbmJfcChQSUlYX0dQSV9CRF9SRUcpICYgUElJWF9HUElfQkRfUkVHKQotCQkJCQkJCSA+PiBQSUlYX0dQSV9CRF9TSElGVDsKLQotCWlmICh2aXN3c19ib2FyZF90eXBlIDwgMCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBzZXR1cCBmdW5jdGlvbnMKLQkgKi8KLQl4ODZfaW5pdC5yZXNvdXJjZXMubWVtb3J5X3NldHVwID0gdmlzd3NfbWVtb3J5X3NldHVwOwotCXg4Nl9pbml0Lm1wcGFyc2UuZ2V0X3NtcF9jb25maWcgPSB2aXN3c19nZXRfc21wX2NvbmZpZzsKLQl4ODZfaW5pdC5tcHBhcnNlLmZpbmRfc21wX2NvbmZpZyA9IHZpc3dzX2ZpbmRfc21wX2NvbmZpZzsKLQl4ODZfaW5pdC5pcnFzLnByZV92ZWN0b3JfaW5pdCA9IHZpc3dzX3ByZV9pbnRyX2luaXQ7Ci0JeDg2X2luaXQuaXJxcy50cmFwX2luaXQgPSB2aXN3c190cmFwX2luaXQ7Ci0JeDg2X2luaXQudGltZXJzLnRpbWVyX2luaXQgPSB2aXN3c190aW1lX2luaXQ7Ci0JeDg2X2luaXQucGNpLmluaXQgPSBwY2lfdmlzd3NfaW5pdDsKLQl4ODZfaW5pdC5wY2kuaW5pdF9pcnEgPSB4ODZfaW5pdF9ub29wOwotCi0JLyoKLQkgKiBJbnN0YWxsIHJlYm9vdCBxdWlya3M6Ci0JICovCi0JcG1fcG93ZXJfb2ZmCQkJPSB2aXN3c19tYWNoaW5lX3Bvd2VyX29mZjsKLQltYWNoaW5lX29wcy5lbWVyZ2VuY3lfcmVzdGFydAk9IHZpc3dzX21hY2hpbmVfZW1lcmdlbmN5X3Jlc3RhcnQ7Ci0KLQkvKgotCSAqIERvIG5vdCB1c2UgYnJvYWRjYXN0IElQSXM6Ci0JICovCi0Jbm9fYnJvYWRjYXN0ID0gMDsKLQotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwotCS8qCi0JICogVHVybiBvZmYgSU8tQVBJQyBkZXRlY3Rpb24gYW5kIGluaXRpYWxpemF0aW9uOgotCSAqLwotCXNraXBfaW9hcGljX3NldHVwCQk9IDE7Ci0jZW5kaWYKLQotCS8qCi0JICogR2V0IEJvYXJkIHJldi4KLQkgKiBGaXJzdCwgd2UgaGF2ZSB0byBpbml0aWFsaXplIHRoZSAzMDcgcGFydCB0byBhbGxvdyB1cyBhY2Nlc3MKLQkgKiB0byB0aGUgR1BJTyByZWdpc3RlcnMuICBMZXQncyBtYXAgdGhlbSBhdCAweDBmYzAgd2hpY2ggaXMgcmlnaHQKLQkgKiBhZnRlciB0aGUgUElJWDQgUE0gc2VjdGlvbi4KLQkgKi8KLQlvdXRiX3AoU0lPX0RFVl9TRUwsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKFNJT19HUF9ERVYsIFNJT19EQVRBKTsJLyogVGFsayB0byBHUElPIHJlZ3MuICovCi0KLQlvdXRiX3AoU0lPX0RFVl9NU0IsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKFNJT19HUF9NU0IsIFNJT19EQVRBKTsJLyogTVNCIG9mIEdQSU8gYmFzZSBhZGRyZXNzICovCi0KLQlvdXRiX3AoU0lPX0RFVl9MU0IsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKFNJT19HUF9MU0IsIFNJT19EQVRBKTsJLyogTFNCIG9mIEdQSU8gYmFzZSBhZGRyZXNzICovCi0KLQlvdXRiX3AoU0lPX0RFVl9FTkIsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKDEsIFNJT19EQVRBKTsJCS8qIEVuYWJsZSBHUElPIHJlZ2lzdGVycy4gKi8KLQotCS8qCi0JICogTm93LCB3ZSBoYXZlIHRvIG1hcCB0aGUgcG93ZXIgbWFuYWdlbWVudCBzZWN0aW9uIHRvIHdyaXRlCi0JICogYSBiaXQgd2hpY2ggZW5hYmxlcyBhY2Nlc3MgdG8gdGhlIEdQSU8gcmVnaXN0ZXJzLgotCSAqIFdoYXQgbHVuYXRpYyBjYW1lIHVwIHdpdGggdGhpcyBzaGl0PwotCSAqLwotCW91dGJfcChTSU9fREVWX1NFTCwgU0lPX0lOREVYKTsKLQlvdXRiX3AoU0lPX1BNX0RFViwgU0lPX0RBVEEpOwkvKiBUYWxrIHRvIEdQSU8gcmVncy4gKi8KLQotCW91dGJfcChTSU9fREVWX01TQiwgU0lPX0lOREVYKTsKLQlvdXRiX3AoU0lPX1BNX01TQiwgU0lPX0RBVEEpOwkvKiBNU0Igb2YgUE0gYmFzZSBhZGRyZXNzICovCi0KLQlvdXRiX3AoU0lPX0RFVl9MU0IsIFNJT19JTkRFWCk7Ci0Jb3V0Yl9wKFNJT19QTV9MU0IsIFNJT19EQVRBKTsJLyogTFNCIG9mIFBNIGJhc2UgYWRkcmVzcyAqLwotCi0Jb3V0Yl9wKFNJT19ERVZfRU5CLCBTSU9fSU5ERVgpOwotCW91dGJfcCgxLCBTSU9fREFUQSk7CQkvKiBFbmFibGUgUE0gcmVnaXN0ZXJzLiAqLwotCi0JLyoKLQkgKiBOb3csIHdyaXRlIHRoZSBQTSByZWdpc3RlciB3aGljaCBlbmFibGVzIHRoZSBHUElPIHJlZ2lzdGVycy4KLQkgKi8KLQlvdXRiX3AoU0lPX1BNX0ZFUjIsIFNJT19QTV9JTkRFWCk7Ci0Jb3V0Yl9wKFNJT19QTV9HUF9FTiwgU0lPX1BNX0RBVEEpOwotCi0JLyoKLQkgKiBOb3csIGluaXRpYWxpemUgdGhlIEdQSU8gcmVnaXN0ZXJzLgotCSAqIFdlIHdhbnQgdGhlbSBhbGwgdG8gYmUgaW5wdXRzIHdoaWNoIGlzIHRoZQotCSAqIHBvd2VyIG9uIGRlZmF1bHQsIHNvIGxldCdzIGxlYXZlIHRoZW0gYWxvbmUuCi0JICogU28sIGxldCdzIGp1c3QgcmVhZCB0aGUgYm9hcmQgcmV2IQotCSAqLwotCXJhdyA9IGluYl9wKFNJT19HUF9EQVRBMSk7Ci0JcmF3ICY9IDB4N2Y7CS8qIDcgYml0cyBvZiB2YWxpZCBib2FyZCByZXZpc2lvbiBJRC4gKi8KLQotCWlmICh2aXN3c19ib2FyZF90eXBlID09IFZJU1dTXzMyMCkgewotCQlpZiAocmF3IDwgMHg2KSB7Ci0JCQl2aXN3c19ib2FyZF9yZXYgPSA0OwotCQl9IGVsc2UgaWYgKHJhdyA8IDB4YykgewotCQkJdmlzd3NfYm9hcmRfcmV2ID0gNTsKLQkJfSBlbHNlIHsKLQkJCXZpc3dzX2JvYXJkX3JldiA9IDY7Ci0JCX0KLQl9IGVsc2UgaWYgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfNTQwKSB7Ci0JCQl2aXN3c19ib2FyZF9yZXYgPSAyOwotCQl9IGVsc2UgewotCQkJdmlzd3NfYm9hcmRfcmV2ID0gcmF3OwotCQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJTaWxpY29uIEdyYXBoaWNzIFZpc3VhbCBXb3Jrc3RhdGlvbiAlcyAocmV2ICVkKSBkZXRlY3RlZFxuIiwKLQkgICAgICAgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfMzIwID8gIjMyMCIgOgotCSAgICAgICAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU181NDAgPyAiNTQwIiA6Ci0JCSJ1bmtub3duIikpLCB2aXN3c19ib2FyZF9yZXYpOwotfQotCi0jZGVmaW5lIEEwMTIzNCAoTElfSU5UQV8wIHwgTElfSU5UQV8xIHwgTElfSU5UQV8yIHwgTElfSU5UQV8zIHwgTElfSU5UQV80KQotI2RlZmluZSBCQ0QgKExJX0lOVEIgfCBMSV9JTlRDIHwgTElfSU5URCkKLSNkZWZpbmUgQUxMREVWUyAoQTAxMjM0IHwgQkNEKQotCi1zdGF0aWMgX19pbml0IHZvaWQgbGl0aGl1bV9pbml0KHZvaWQpCi17Ci0Jc2V0X2ZpeG1hcChGSVhfTElfUENJQSwgTElfUENJX0FfUEhZUyk7Ci0Jc2V0X2ZpeG1hcChGSVhfTElfUENJQiwgTElfUENJX0JfUEhZUyk7Ci0KLQlpZiAoKGxpX3BjaWFfcmVhZDE2KFBDSV9WRU5ET1JfSUQpICE9IFBDSV9WRU5ET1JfSURfU0dJKSB8fAotCSAgICAobGlfcGNpYV9yZWFkMTYoUENJX0RFVklDRV9JRCkgIT0gUENJX0RFVklDRV9JRF9TR0lfTElUSElVTSkpIHsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkxpdGhpdW0gaG9zdGJyaWRnZSAlYyBub3QgZm91bmRcbiIsICdBJyk7Ci0vKgkJcGFuaWMoIlRoaXMgbWFjaGluZSBpcyBub3QgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiAzMjAvNTQwIik7ICovCi0JfQotCi0JaWYgKChsaV9wY2liX3JlYWQxNihQQ0lfVkVORE9SX0lEKSAhPSBQQ0lfVkVORE9SX0lEX1NHSSkgfHwKLQkgICAgKGxpX3BjaWJfcmVhZDE2KFBDSV9ERVZJQ0VfSUQpICE9IFBDSV9ERVZJQ0VfSURfU0dJX0xJVEhJVU0pKSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJMaXRoaXVtIGhvc3RicmlkZ2UgJWMgbm90IGZvdW5kXG4iLCAnQicpOwotLyoJCXBhbmljKCJUaGlzIG1hY2hpbmUgaXMgbm90IFNHSSBWaXN1YWwgV29ya3N0YXRpb24gMzIwLzU0MCIpOyAqLwotCX0KLQotCWxpX3BjaWFfd3JpdGUxNihMSV9QQ0lfSU5URU4sIEFMTERFVlMpOwotCWxpX3BjaWJfd3JpdGUxNihMSV9QQ0lfSU5URU4sIEFMTERFVlMpOwotfQotCi1zdGF0aWMgX19pbml0IHZvaWQgY29iYWx0X2luaXQodm9pZCkKLXsKLQkvKgotCSAqIE9uIG5vcm1hbCBTTVAgUEMgdGhpcyBpcyB1c2VkIG9ubHkgd2l0aCBTTVAsIGJ1dCB3ZSBoYXZlIHRvCi0JICogdXNlIGl0IGFuZCBzZXQgaXQgdXAgaGVyZSB0byBzdGFydCB0aGUgQ29iYWx0IGNsb2NrCi0JICovCi0Jc2V0X2ZpeG1hcChGSVhfQVBJQ19CQVNFLCBBUElDX0RFRkFVTFRfUEhZU19CQVNFKTsKLQlzZXR1cF9sb2NhbF9BUElDKCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTG9jYWwgQVBJQyBWZXJzaW9uICUjeCwgSUQgJSN4XG4iLAotCQkodW5zaWduZWQgaW50KWFwaWNfcmVhZChBUElDX0xWUiksCi0JCSh1bnNpZ25lZCBpbnQpYXBpY19yZWFkKEFQSUNfSUQpKTsKLQotCXNldF9maXhtYXAoRklYX0NPX0NQVSwgQ09fQ1BVX1BIWVMpOwotCXNldF9maXhtYXAoRklYX0NPX0FQSUMsIENPX0FQSUNfUEhZUyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ29iYWx0IFJldmlzaW9uICUjbHgsIEFQSUMgSUQgJSNseFxuIiwKLQkJY29fY3B1X3JlYWQoQ09fQ1BVX1JFViksIGNvX2FwaWNfcmVhZChDT19BUElDX0lEKSk7Ci0KLQkvKiBFbmFibGUgQ29iYWx0IEFQSUMgYmVpbmcgY2FyZWZ1bCB0byBOT1QgY2hhbmdlIHRoZSBJRCEgKi8KLQljb19hcGljX3dyaXRlKENPX0FQSUNfSUQsIGNvX2FwaWNfcmVhZChDT19BUElDX0lEKSB8IENPX0FQSUNfRU5BQkxFKTsKLQotCXByaW50ayhLRVJOX0lORk8gIkNvYmFsdCBBUElDIGVuYWJsZWQ6IElEIHJlZyAlI2x4XG4iLAotCQljb19hcGljX3JlYWQoQ09fQVBJQ19JRCkpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdmlzd3NfdHJhcF9pbml0KHZvaWQpCi17Ci0JbGl0aGl1bV9pbml0KCk7Ci0JY29iYWx0X2luaXQoKTsKLX0KLQotLyoKLSAqIElSUSBjb250cm9sbGVyIC8gQVBJQyBzdXBwb3J0OgotICovCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29iYWx0X2xvY2spOwotCi0vKgotICogU2V0IHRoZSBnaXZlbiBDb2JhbHQgQVBJQyBSZWRpcmVjdGlvbiBUYWJsZSBlbnRyeSB0byBwb2ludAotICogdG8gdGhlIGdpdmVuIElEVCB2ZWN0b3IvaW5kZXguCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb19hcGljX3NldChpbnQgZW50cnksIGludCBpcnEpCi17Ci0JY29fYXBpY193cml0ZShDT19BUElDX0xPKGVudHJ5KSwgQ09fQVBJQ19MRVZFTCB8IChpcnEgKyBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpKTsKLQljb19hcGljX3dyaXRlKENPX0FQSUNfSEkoZW50cnkpLCAwKTsKLX0KLQotLyoKLSAqIENvYmFsdCAoSU8pLUFQSUMgZnVuY3Rpb25zIHRvIGhhbmRsZSBQQ0kgZGV2aWNlcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY29fYXBpY19pZGUwX2hhY2sodm9pZCkKLXsKLQlleHRlcm4gY2hhciB2aXN3c19ib2FyZF90eXBlOwotCWV4dGVybiBjaGFyIHZpc3dzX2JvYXJkX3JldjsKLQotCWlmICh2aXN3c19ib2FyZF90eXBlID09IFZJU1dTXzMyMCAmJiB2aXN3c19ib2FyZF9yZXYgPT0gNSkKLQkJcmV0dXJuIDU7Ci0JcmV0dXJuIENPX0FQSUNfSURFMDsKLX0KLQotc3RhdGljIGludCBpc19jb19hcGljKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKElTX0NPX0FQSUMoaXJxKSkKLQkJcmV0dXJuIENPX0FQSUMoaXJxKTsKLQotCXN3aXRjaCAoaXJxKSB7Ci0JCWNhc2UgMDogcmV0dXJuIENPX0FQSUNfQ1BVOwotCQljYXNlIENPX0lSUV9JREUwOiByZXR1cm4gY29fYXBpY19pZGUwX2hhY2soKTsKLQkJY2FzZSBDT19JUlFfSURFMTogcmV0dXJuIENPX0FQSUNfSURFMTsKLQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCX0KLX0KLQotCi0vKgotICogVGhpcyBpcyB0aGUgU0dJIENvYmFsdCAoSU8tKUFQSUM6Ci0gKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV9jb2JhbHRfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQljb19hcGljX3NldChpc19jb19hcGljKGRhdGEtPmlycSksIGRhdGEtPmlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfY29iYWx0X2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JaW50IGVudHJ5ID0gaXNfY29fYXBpYyhkYXRhLT5pcnEpOwotCi0JY29fYXBpY193cml0ZShDT19BUElDX0xPKGVudHJ5KSwgQ09fQVBJQ19NQVNLKTsKLQljb19hcGljX3JlYWQoQ09fQVBJQ19MTyhlbnRyeSkpOwotfQotCi1zdGF0aWMgdm9pZCBhY2tfY29iYWx0X2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOwotCWRpc2FibGVfY29iYWx0X2lycShkYXRhKTsKLQlhcGljX3dyaXRlKEFQSUNfRU9JLCBBUElDX0VPSV9BQ0spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY29iYWx0X2lycV90eXBlID0gewotCS5uYW1lCQk9ICJDb2JhbHQtQVBJQyIsCi0JLmlycV9lbmFibGUJPSBlbmFibGVfY29iYWx0X2lycSwKLQkuaXJxX2Rpc2FibGUJPSBkaXNhYmxlX2NvYmFsdF9pcnEsCi0JLmlycV9hY2sJPSBhY2tfY29iYWx0X2lycSwKLX07Ci0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIFBJSVg0LWJhc2VkIDgyNTkgdGhhdCBpcyB3aXJlZCB1cCBpbmRpcmVjdGx5IHRvIENvYmFsdAotICogLS0gbm90IHRoZSBtYW5uZXIgZXhwZWN0ZWQgYnkgdGhlIGNvZGUgaW4gaTgyNTkuYy4KLSAqCi0gKiB0aGVyZSBpcyBhICdtYXN0ZXInIHBoeXNpY2FsIGludGVycnVwdCBzb3VyY2UgdGhhdCBnZXRzIHNlbnQgdG8KLSAqIHRoZSBDUFUuIEJ1dCBpbiB0aGUgY2hpcHNldCB0aGVyZSBhcmUgdmFyaW91cyAndmlydHVhbCcgaW50ZXJydXB0cwotICogd2FpdGluZyB0byBiZSBoYW5kbGVkLiBXZSByZXByZXNlbnQgdGhpcyB0byBMaW51eCB0aHJvdWdoIGEgJ21hc3RlcicKLSAqIGludGVycnVwdCBjb250cm9sbGVyIHR5cGUsIGFuZCB0aHJvdWdoIGEgc3BlY2lhbCB2aXJ0dWFsIGludGVycnVwdC0KLSAqIGNvbnRyb2xsZXIuIERldmljZSBkcml2ZXJzIG9ubHkgc2VlIHRoZSB2aXJ0dWFsIGludGVycnVwdCBzb3VyY2VzLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfcGlpeDRfbWFzdGVyX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JbGVnYWN5X3BpYy0+aW5pdCgwKTsKLQllbmFibGVfY29iYWx0X2lycShkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwaWl4NF9tYXN0ZXJfaXJxX3R5cGUgPSB7Ci0JLm5hbWUJCT0gIlBJSVg0LW1hc3RlciIsCi0JLmlycV9zdGFydHVwCT0gc3RhcnR1cF9waWl4NF9tYXN0ZXJfaXJxLAotCS5pcnFfYWNrCT0gYWNrX2NvYmFsdF9pcnEsCi19OwotCi1zdGF0aWMgdm9pZCBwaWk0X21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKSB7IH0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwaWl4NF92aXJ0dWFsX2lycV90eXBlID0gewotCS5uYW1lCQk9ICJQSUlYNC12aXJ0dWFsIiwKLQkuaXJxX21hc2sJPSBwaWk0X21hc2ssCi19OwotCi0vKgotICogUElJWDQtODI1OSBtYXN0ZXIvdmlydHVhbCBmdW5jdGlvbnMgdG8gaGFuZGxlIGludGVycnVwdCByZXF1ZXN0cwotICogZnJvbSBsZWdhY3kgZGV2aWNlczogZmxvcHB5LCBwYXJhbGxlbCwgc2VyaWFsLCBydGMuCi0gKgotICogTm9uZSBvZiB0aGVzZSBnZXQgQ29iYWx0IEFQSUMgZW50cmllcywgbmVpdGhlciBkbyB0aGV5IGhhdmUgSURUCi0gKiBlbnRyaWVzLiBUaGVzZSBpbnRlcnJ1cHRzIGFyZSBwdXJlbHkgdmlydHVhbCBhbmQgZGlzdHJpYnV0ZWQgZnJvbQotICogdGhlICdtYXN0ZXInIGludGVycnVwdCBzb3VyY2U6IENPX0lSUV84MjU5LgotICoKLSAqIFdoZW4gdGhlIDgyNTkgaW50ZXJydXB0cyBpdHMgaGFuZGxlciBmaWd1cmVzIG91dCB3aGljaCBvZiB0aGVzZQotICogZGV2aWNlcyBpcyBpbnRlcnJ1cHRpbmcgYW5kIGRpc3BhdGNoZXMgdG8gaXRzIGhhbmRsZXIuCi0gKgotICogQ0FSRUZVTDogZGV2aWNlcyBzZWUgdGhlICd2aXJ0dWFsJyBpbnRlcnJ1cHQgb25seS4gVGh1cyBkaXNhYmxlLwotICogZW5hYmxlX2lycSBnZXRzIHRoZSByaWdodCBpcnEuIFRoaXMgJ21hc3RlcicgaXJxIGlzIG5ldmVyIGRpcmVjdGx5Ci0gKiBtYW5pcHVsYXRlZCBieSBhbnkgZHJpdmVyLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgcGlpeDRfbWFzdGVyX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlYWxpcnE7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7Ci0KLQkvKiBGaW5kIG91dCB3aGF0J3MgaW50ZXJydXB0aW5nIGluIHRoZSBQSUlYNCBtYXN0ZXIgODI1OSAqLwotCW91dGIoMHgwYywgMHgyMCk7CQkvKiBPQ1czIFBvbGwgY29tbWFuZCAqLwotCXJlYWxpcnEgPSBpbmIoMHgyMCk7Ci0KLQkvKgotCSAqIEJpdCA3ID09IDAgbWVhbnMgaW52YWxpZC9zcHVyaW91cwotCSAqLwotCWlmICh1bmxpa2VseSghKHJlYWxpcnEgJiAweDgwKSkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCXJlYWxpcnEgJj0gNzsKLQotCWlmICh1bmxpa2VseShyZWFsaXJxID09IDIpKSB7Ci0JCW91dGIoMHgwYywgMHhhMCk7Ci0JCXJlYWxpcnEgPSBpbmIoMHhhMCk7Ci0KLQkJaWYgKHVubGlrZWx5KCEocmVhbGlycSAmIDB4ODApKSkKLQkJCWdvdG8gb3V0X3VubG9jazsKLQotCQlyZWFsaXJxID0gKHJlYWxpcnEgJiA3KSArIDg7Ci0JfQotCi0JLyogbWFzayBhbmQgYWNrIGludGVycnVwdCAqLwotCWNhY2hlZF9pcnFfbWFzayB8PSAxIDw8IHJlYWxpcnE7Ci0JaWYgKHVubGlrZWx5KHJlYWxpcnEgPiA3KSkgewotCQlpbmIoMHhhMSk7Ci0JCW91dGIoY2FjaGVkX3NsYXZlX21hc2ssIDB4YTEpOwotCQlvdXRiKDB4NjAgKyAocmVhbGlycSAmIDcpLCAweGEwKTsKLQkJb3V0YigweDYwICsgMiwgMHgyMCk7Ci0JfSBlbHNlIHsKLQkJaW5iKDB4MjEpOwotCQlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgMHgyMSk7Ci0JCW91dGIoMHg2MCArIHJlYWxpcnEsIDB4MjApOwotCX0KLQotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBoYW5kbGUgdGhpcyAndmlydHVhbCBpbnRlcnJ1cHQnIGFzIGEgQ29iYWx0IG9uZSBub3cuCi0JICovCi0JZ2VuZXJpY19oYW5kbGVfaXJxKHJlYWxpcnEpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotCi1vdXRfdW5sb2NrOgotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWFzdGVyX2FjdGlvbiA9IHsKLQkuaGFuZGxlciA9CXBpaXg0X21hc3Rlcl9pbnRyLAotCS5uYW1lID0JCSJQSUlYNC04MjU5IiwKLQkuZmxhZ3MgPQlJUlFGX05PX1RIUkVBRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNhc2NhZGVfYWN0aW9uID0gewotCS5oYW5kbGVyID0gCW5vX2FjdGlvbiwKLQkubmFtZSA9CQkiY2FzY2FkZSIsCi0JLmZsYWdzID0JSVJRRl9OT19USFJFQUQsCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BpaXg0X3ZpcnR1YWxfaXJxX3R5cGUodm9pZCkKLXsKLQlwaWl4NF92aXJ0dWFsX2lycV90eXBlLmlycV9lbmFibGUgPSBpODI1OUFfY2hpcC5pcnFfdW5tYXNrOwotCXBpaXg0X3ZpcnR1YWxfaXJxX3R5cGUuaXJxX2Rpc2FibGUgPSBpODI1OUFfY2hpcC5pcnFfbWFzazsKLQlwaWl4NF92aXJ0dWFsX2lycV90eXBlLmlycV91bm1hc2sgPSBpODI1OUFfY2hpcC5pcnFfdW5tYXNrOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdmlzd3NfcHJlX2ludHJfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0Jc2V0X3BpaXg0X3ZpcnR1YWxfaXJxX3R5cGUoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBDT19JUlFfQVBJQzAgKyBDT19BUElDX0xBU1QgKyAxOyBpKyspIHsKLQkJc3RydWN0IGlycV9jaGlwICpjaGlwID0gTlVMTDsKLQotCQlpZiAoaSA9PSAwKQotCQkJY2hpcCA9ICZjb2JhbHRfaXJxX3R5cGU7Ci0JCWVsc2UgaWYgKGkgPT0gQ09fSVJRX0lERTApCi0JCQljaGlwID0gJmNvYmFsdF9pcnFfdHlwZTsKLQkJZWxzZSBpZiAoaSA9PSBDT19JUlFfSURFMSkKLQkJCWNoaXAgPSAmY29iYWx0X2lycV90eXBlOwotCQllbHNlIGlmIChpID09IENPX0lSUV84MjU5KQotCQkJY2hpcCA9ICZwaWl4NF9tYXN0ZXJfaXJxX3R5cGU7Ci0JCWVsc2UgaWYgKGkgPCBDT19JUlFfQVBJQzApCi0JCQljaGlwID0gJnBpaXg0X3ZpcnR1YWxfaXJxX3R5cGU7Ci0JCWVsc2UgaWYgKElTX0NPX0FQSUMoaSkpCi0JCQljaGlwID0gJmNvYmFsdF9pcnFfdHlwZTsKLQotCQlpZiAoY2hpcCkKLQkJCWlycV9zZXRfY2hpcChpLCBjaGlwKTsKLQl9Ci0KLQlzZXR1cF9pcnEoQ09fSVJRXzgyNTksICZtYXN0ZXJfYWN0aW9uKTsKLQlzZXR1cF9pcnEoMiwgJmNhc2NhZGVfYWN0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Rvb2xzL3JlbG9jcy5jIGIvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmMKaW5kZXggY2ZiZGJkYi4uYmJiMWQyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmMKKysrIGIvYXJjaC94ODYvdG9vbHMvcmVsb2NzLmMKQEAgLTY5LDggKzY5LDggQEAKIAkiX19wZXJfY3B1X2xvYWR8IgogCSJpbml0X3Blcl9jcHVfXy4qfCIKIAkiX19lbmRfcm9kYXRhX2hwYWdlX2FsaWdufCIKLQkiX192dmFyX3BhZ2V8IgogI2VuZGlmCisJIl9fdnZhcl9wYWdlfCIKIAkiX2VuZCkkIgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby9NYWtlZmlsZSBiL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUKaW5kZXggZmQxNGJlMS4uYzU4MGQxMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCkBAIC0yLDYgKzIsOCBAQAogIyBCdWlsZGluZyB2RFNPIGltYWdlcyBmb3IgeDg2LgogIwogCitLQlVJTERfQ0ZMQUdTICs9ICQoRElTQUJMRV9MVE8pCisKIFZEU082NC0kKENPTkZJR19YODZfNjQpCQk6PSB5CiBWRFNPWDMyLSQoQ09ORklHX1g4Nl9YMzJfQUJJKQk6PSB5CiBWRFNPMzItJChDT05GSUdfWDg2XzMyKQkJOj0geQpAQCAtMjEsNyArMjMsOCBAQAogdm9iajY0cyA6PSAkKGZpbHRlci1vdXQgJCh2b2JqeDMycy1jb21wYXQpLCQodm9ianMteSkpCiAKICMgZmlsZXMgdG8gbGluayBpbnRvIGtlcm5lbAotb2JqLSQoVkRTTzY0LXkpCQkJKz0gdm1hLm8gdmRzby5vCitvYmoteQkJCQkrPSB2bWEubworb2JqLSQoVkRTTzY0LXkpCQkJKz0gdmRzby5vCiBvYmotJChWRFNPWDMyLXkpCQkrPSB2ZHNveDMyLm8KIG9iai0kKFZEU08zMi15KQkJCSs9IHZkc28zMi5vIHZkc28zMi1zZXR1cC5vCiAKQEAgLTM1LDcgKzM4LDggQEAKIAogVkRTT19MREZMQUdTX3Zkc28ubGRzID0gLW02NCAtV2wsLXNvbmFtZT1saW51eC12ZHNvLnNvLjEgXAogCQkJLVdsLC0tbm8tdW5kZWZpbmVkIFwKLQkJICAgICAgCS1XbCwteixtYXgtcGFnZS1zaXplPTQwOTYgLVdsLC16LGNvbW1vbi1wYWdlLXNpemU9NDA5NgorCQkJLVdsLC16LG1heC1wYWdlLXNpemU9NDA5NiAtV2wsLXosY29tbW9uLXBhZ2Utc2l6ZT00MDk2IFwKKwkJCSQoRElTQUJMRV9MVE8pCiAKICQob2JqKS92ZHNvLm86ICQoc3JjKS92ZHNvLlMgJChvYmopL3Zkc28uc28KIApAQCAtMTI3LDcgKzEzMSw3IEBACiB2ZHNvMzItaW1hZ2VzCQkJPSAkKHZkc28zMi5zby15OiU9dmRzbzMyLSUuc28pCiAKIENQUEZMQUdTX3Zkc28zMi5sZHMgPSAkKENQUEZMQUdTX3Zkc28ubGRzKQotVkRTT19MREZMQUdTX3Zkc28zMi5sZHMgPSAtbTMyIC1XbCwtc29uYW1lPWxpbnV4LWdhdGUuc28uMQorVkRTT19MREZMQUdTX3Zkc28zMi5sZHMgPSAtbTMyIC1XbCwtbSxlbGZfaTM4NiAtV2wsLXNvbmFtZT1saW51eC1nYXRlLnNvLjEKIAogIyBUaGlzIG1ha2VzIHN1cmUgdGhlICQob2JqKSBzdWJkaXJlY3RvcnkgZXhpc3RzIGV2ZW4gdGhvdWdoIHZkc28zMi8KICMgaXMgbm90IGEga2J1aWxkIHN1Yi1tYWtlIHN1YmRpcmVjdG9yeS4KQEAgLTEzNSw3ICsxMzksNyBAQAogCiB0YXJnZXRzICs9IHZkc28zMi92ZHNvMzIubGRzCiB0YXJnZXRzICs9ICQodmRzbzMyLWltYWdlcykgJCh2ZHNvMzItaW1hZ2VzOj0uZGJnKQotdGFyZ2V0cyArPSB2ZHNvMzIvbm90ZS5vICQodmRzbzMyLnNvLXk6JT12ZHNvMzIvJS5vKQordGFyZ2V0cyArPSB2ZHNvMzIvbm90ZS5vIHZkc28zMi92Y2xvY2tfZ2V0dGltZS5vICQodmRzbzMyLnNvLXk6JT12ZHNvMzIvJS5vKQogCiBleHRyYS15CSs9ICQodmRzbzMyLWltYWdlcykKIApAQCAtMTQ1LDggKzE0OSwxOSBAQAogJCh2ZHNvMzItaW1hZ2VzOiU9JChvYmopLyUuZGJnKTogS0JVSUxEX0FGTEFHUyA9ICQoS0JVSUxEX0FGTEFHU18zMikKICQodmRzbzMyLWltYWdlczolPSQob2JqKS8lLmRiZyk6IGFzZmxhZ3MtJChDT05GSUdfWDg2XzY0KSArPSAtbTMyCiAKK0tCVUlMRF9DRkxBR1NfMzIgOj0gJChmaWx0ZXItb3V0IC1tNjQsJChLQlVJTERfQ0ZMQUdTKSkKK0tCVUlMRF9DRkxBR1NfMzIgOj0gJChmaWx0ZXItb3V0IC1tY21vZGVsPWtlcm5lbCwkKEtCVUlMRF9DRkxBR1NfMzIpKQorS0JVSUxEX0NGTEFHU18zMiA6PSAkKGZpbHRlci1vdXQgLWZuby1waWMsJChLQlVJTERfQ0ZMQUdTXzMyKSkKK0tCVUlMRF9DRkxBR1NfMzIgOj0gJChmaWx0ZXItb3V0IC1tZmVudHJ5LCQoS0JVSUxEX0NGTEFHU18zMikpCitLQlVJTERfQ0ZMQUdTXzMyICs9IC1tMzIgLW1zb2Z0LWZsb2F0IC1tcmVncGFybT0wIC1mcGljCitLQlVJTERfQ0ZMQUdTXzMyICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQorS0JVSUxEX0NGTEFHU18zMiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZm9wdGltaXplLXNpYmxpbmctY2FsbHMpCitLQlVJTERfQ0ZMQUdTXzMyICs9IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCiskKHZkc28zMi1pbWFnZXM6JT0kKG9iaikvJS5kYmcpOiBLQlVJTERfQ0ZMQUdTID0gJChLQlVJTERfQ0ZMQUdTXzMyKQorCiAkKHZkc28zMi1pbWFnZXM6JT0kKG9iaikvJS5kYmcpOiAkKG9iaikvdmRzbzMyLSUuc28uZGJnOiBGT1JDRSBcCiAJCQkJICQob2JqKS92ZHNvMzIvdmRzbzMyLmxkcyBcCisJCQkJICQob2JqKS92ZHNvMzIvdmNsb2NrX2dldHRpbWUubyBcCiAJCQkJICQob2JqKS92ZHNvMzIvbm90ZS5vIFwKIAkJCQkgJChvYmopL3Zkc28zMi8lLm8KIAkkKGNhbGwgaWZfY2hhbmdlZCx2ZHNvKQpAQCAtMTgxLDcgKzE5Niw4IEBACiAJCSAgICAgICAtV2wsLVQsJChmaWx0ZXIgJS5sZHMsJF4pICQoZmlsdGVyICUubywkXikgJiYgXAogCQkgc2ggJChzcmN0cmVlKS8kKHNyYykvY2hlY2t1bmRlZi5zaCAnJChOTSknICckQCcKIAotVkRTT19MREZMQUdTID0gLWZQSUMgLXNoYXJlZCAkKGNhbGwgY2MtbGRvcHRpb24sIC1XbCQoY29tbWEpLS1oYXNoLXN0eWxlPXN5c3YpCitWRFNPX0xERkxBR1MgPSAtZlBJQyAtc2hhcmVkICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikgXAorCQkkKExUT19DRkxBR1MpCiBHQ09WX1BST0ZJTEUgOj0gbgogCiAjCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3ZjbG9ja19nZXR0aW1lLmMgYi9hcmNoL3g4Ni92ZHNvL3ZjbG9ja19nZXR0aW1lLmMKaW5kZXggZWI1ZDdhNS4uMTZkNjg2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92Y2xvY2tfZ2V0dGltZS5jCisrKyBiL2FyY2gveDg2L3Zkc28vdmNsb2NrX2dldHRpbWUuYwpAQCAtNCw2ICs0LDkgQEAKICAqCiAgKiBGYXN0IHVzZXIgY29udGV4dCBpbXBsZW1lbnRhdGlvbiBvZiBjbG9ja19nZXR0aW1lLCBnZXR0aW1lb2ZkYXksIGFuZCB0aW1lLgogICoKKyAqIDMyIEJpdCBjb21wYXQgbGF5ZXIgYnkgU3RlZmFuaSBTZWlib2xkIDxzdGVmYW5pQHNlaWJvbGQubmV0PgorICogIHNwb25zb3JlZCBieSBSb2hkZSAmIFNjaHdhcnogR21iSCAmIENvLiBLRyBNdW5pY2gvR2VybWFueQorICoKICAqIFRoZSBjb2RlIHNob3VsZCBoYXZlIG5vIGludGVybmFsIHVucmVzb2x2ZWQgcmVsb2NhdGlvbnMuCiAgKiBDaGVjayB3aXRoIHJlYWRlbGYgYWZ0ZXIgY2hhbmdpbmcuCiAgKi8KQEAgLTExLDU2ICsxNCw1NSBAQAogLyogRGlzYWJsZSBwcm9maWxpbmcgZm9yIHVzZXJzcGFjZSBjb2RlOiAqLwogI2RlZmluZSBESVNBQkxFX0JSQU5DSF9QUk9GSUxJTkcKIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3ZndG9kLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNpbmNsdWRlIDxhc20vdnZhci5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHZjbG9jay5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNkZWZpbmUgZ3RvZCAoJlZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKSkKIAotbm90cmFjZSBzdGF0aWMgY3ljbGVfdCB2cmVhZF90c2Modm9pZCkKK2V4dGVybiBpbnQgX192ZHNvX2Nsb2NrX2dldHRpbWUoY2xvY2tpZF90IGNsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2V4dGVybiBpbnQgX192ZHNvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopOworZXh0ZXJuIHRpbWVfdCBfX3Zkc29fdGltZSh0aW1lX3QgKnQpOworCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfaHBldF9jb3VudGVyKGNvbnN0IHZvbGF0aWxlIHZvaWQgKmFkZHIpCiB7Ci0JY3ljbGVfdCByZXQ7Ci0JdTY0IGxhc3Q7Ci0KLQkvKgotCSAqIEVtcGlyaWNhbGx5LCBhIGZlbmNlIChvZiB0eXBlIHRoYXQgZGVwZW5kcyBvbiB0aGUgQ1BVKQotCSAqIGJlZm9yZSByZHRzYyBpcyBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgcmR0c2MgaXMgb3JkZXJlZAotCSAqIHdpdGggcmVzcGVjdCB0byBsb2Fkcy4gIFRoZSB2YXJpb3VzIENQVSBtYW51YWxzIGFyZSB1bmNsZWFyCi0JICogYXMgdG8gd2hldGhlciByZHRzYyBjYW4gYmUgcmVvcmRlcmVkIHdpdGggbGF0ZXIgbG9hZHMsCi0JICogYnV0IG5vIG9uZSBoYXMgZXZlciBzZWVuIGl0IGhhcHBlbi4KLQkgKi8KLQlyZHRzY19iYXJyaWVyKCk7Ci0JcmV0ID0gKGN5Y2xlX3QpdmdldF9jeWNsZXMoKTsKLQotCWxhc3QgPSBWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkuY2xvY2suY3ljbGVfbGFzdDsKLQotCWlmIChsaWtlbHkocmV0ID49IGxhc3QpKQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBHQ0MgbGlrZXMgdG8gZ2VuZXJhdGUgY21vdiBoZXJlLCBidXQgdGhpcyBicmFuY2ggaXMgZXh0cmVtZWx5Ci0JICogcHJlZGljdGFibGUgKGl0J3MganVzdCBhIGZ1bmNpdG9uIG9mIHRpbWUgYW5kIHRoZSBsaWtlbHkgaXMKLQkgKiB2ZXJ5IGxpa2VseSkgYW5kIHRoZXJlJ3MgYSBkYXRhIGRlcGVuZGVuY2UsIHNvIGZvcmNlIEdDQwotCSAqIHRvIGdlbmVyYXRlIGEgYnJhbmNoIGluc3RlYWQuICBJIGRvbid0IGJhcnJpZXIoKSBiZWNhdXNlCi0JICogd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCBhIGJhcnJpZXIsIGFuZCBpZiB0aGlzIGZ1bmN0aW9uCi0JICogZXZlciBnZXRzIGlubGluZWQgaXQgd2lsbCBnZW5lcmF0ZSB3b3JzZSBjb2RlLgotCSAqLwotCWFzbSB2b2xhdGlsZSAoIiIpOwotCXJldHVybiBsYXN0OworCXJldHVybiAqKGNvbnN0IHZvbGF0aWxlIHUzMiAqKSAoYWRkciArIEhQRVRfQ09VTlRFUik7CiB9CisjZW5kaWYKKworI2lmbmRlZiBCVUlMRF9WRFNPMzIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vcHZjbG9jay5oPgogCiBzdGF0aWMgbm90cmFjZSBjeWNsZV90IHZyZWFkX2hwZXQodm9pZCkKIHsKLQlyZXR1cm4gcmVhZGwoKGNvbnN0IHZvaWQgX19pb21lbSAqKWZpeF90b192aXJ0KFZTWVNDQUxMX0hQRVQpICsgSFBFVF9DT1VOVEVSKTsKKwlyZXR1cm4gcmVhZF9ocGV0X2NvdW50ZXIoKGNvbnN0IHZvaWQgKilmaXhfdG9fdmlydChWU1lTQ0FMTF9IUEVUKSk7Cit9CisKK25vdHJhY2Ugc3RhdGljIGxvbmcgdmRzb19mYWxsYmFja19nZXR0aW1lKGxvbmcgY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJbG9uZyByZXQ7CisJYXNtKCJzeXNjYWxsIiA6ICI9YSIgKHJldCkgOgorCSAgICAiMCIgKF9fTlJfY2xvY2tfZ2V0dGltZSksICJEIiAoY2xvY2spLCAiUyIgKHRzKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmV0OworfQorCitub3RyYWNlIHN0YXRpYyBsb25nIHZkc29fZmFsbGJhY2tfZ3RvZChzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCit7CisJbG9uZyByZXQ7CisKKwlhc20oInN5c2NhbGwiIDogIj1hIiAocmV0KSA6CisJICAgICIwIiAoX19OUl9nZXR0aW1lb2ZkYXkpLCAiRCIgKHR2KSwgIlMiICh0eikgOiAibWVtb3J5Iik7CisJcmV0dXJuIHJldDsKIH0KIAogI2lmZGVmIENPTkZJR19QQVJBVklSVF9DTE9DSwpAQCAtMTI0LDcgKzEyNiw3IEBACiAJCSptb2RlID0gVkNMT0NLX05PTkU7CiAKIAkvKiByZWZlciB0byB0c2MuYyByZWFkX3RzYygpIGNvbW1lbnQgZm9yIHJhdGlvbmFsZSAqLwotCWxhc3QgPSBWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkuY2xvY2suY3ljbGVfbGFzdDsKKwlsYXN0ID0gZ3RvZC0+Y3ljbGVfbGFzdDsKIAogCWlmIChsaWtlbHkocmV0ID49IGxhc3QpKQogCQlyZXR1cm4gcmV0OwpAQCAtMTMzLDExICsxMzUsMzAgQEAKIH0KICNlbmRpZgogCisjZWxzZQorCitleHRlcm4gdTggaHBldF9wYWdlCisJX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKTsKKworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCitzdGF0aWMgbm90cmFjZSBjeWNsZV90IHZyZWFkX2hwZXQodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9ocGV0X2NvdW50ZXIoKGNvbnN0IHZvaWQgKikoJmhwZXRfcGFnZSkpOworfQorI2VuZGlmCisKIG5vdHJhY2Ugc3RhdGljIGxvbmcgdmRzb19mYWxsYmFja19nZXR0aW1lKGxvbmcgY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHMpCiB7CiAJbG9uZyByZXQ7Ci0JYXNtKCJzeXNjYWxsIiA6ICI9YSIgKHJldCkgOgotCSAgICAiMCIgKF9fTlJfY2xvY2tfZ2V0dGltZSksIkQiIChjbG9jayksICJTIiAodHMpIDogIm1lbW9yeSIpOworCisJYXNtKAorCQkibW92ICUlZWJ4LCAlJWVkeCBcbiIKKwkJIm1vdiAlMiwgJSVlYnggXG4iCisJCSJjYWxsIFZEU08zMl92c3lzY2FsbCBcbiIKKwkJIm1vdiAlJWVkeCwgJSVlYnggXG4iCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoX19OUl9jbG9ja19nZXR0aW1lKSwgImciIChjbG9jayksICJjIiAodHMpCisJCTogIm1lbW9yeSIsICJlZHgiKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDUsMjggKzE2Niw3OSBAQAogewogCWxvbmcgcmV0OwogCi0JYXNtKCJzeXNjYWxsIiA6ICI9YSIgKHJldCkgOgotCSAgICAiMCIgKF9fTlJfZ2V0dGltZW9mZGF5KSwgIkQiICh0diksICJTIiAodHopIDogIm1lbW9yeSIpOworCWFzbSgKKwkJIm1vdiAlJWVieCwgJSVlZHggXG4iCisJCSJtb3YgJTIsICUlZWJ4IFxuIgorCQkiY2FsbCBWRFNPMzJfdnN5c2NhbGwgXG4iCisJCSJtb3YgJSVlZHgsICUlZWJ4IFxuIgorCQk6ICI9YSIgKHJldCkKKwkJOiAiMCIgKF9fTlJfZ2V0dGltZW9mZGF5KSwgImciICh0diksICJjIiAodHopCisJCTogIm1lbW9yeSIsICJlZHgiKTsKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUX0NMT0NLCisKK3N0YXRpYyBub3RyYWNlIGN5Y2xlX3QgdnJlYWRfcHZjbG9jayhpbnQgKm1vZGUpCit7CisJKm1vZGUgPSBWQ0xPQ0tfTk9ORTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjZW5kaWYKKworbm90cmFjZSBzdGF0aWMgY3ljbGVfdCB2cmVhZF90c2Modm9pZCkKK3sKKwljeWNsZV90IHJldDsKKwl1NjQgbGFzdDsKKworCS8qCisJICogRW1waXJpY2FsbHksIGEgZmVuY2UgKG9mIHR5cGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBDUFUpCisJICogYmVmb3JlIHJkdHNjIGlzIGVub3VnaCB0byBlbnN1cmUgdGhhdCByZHRzYyBpcyBvcmRlcmVkCisJICogd2l0aCByZXNwZWN0IHRvIGxvYWRzLiAgVGhlIHZhcmlvdXMgQ1BVIG1hbnVhbHMgYXJlIHVuY2xlYXIKKwkgKiBhcyB0byB3aGV0aGVyIHJkdHNjIGNhbiBiZSByZW9yZGVyZWQgd2l0aCBsYXRlciBsb2FkcywKKwkgKiBidXQgbm8gb25lIGhhcyBldmVyIHNlZW4gaXQgaGFwcGVuLgorCSAqLworCXJkdHNjX2JhcnJpZXIoKTsKKwlyZXQgPSAoY3ljbGVfdClfX25hdGl2ZV9yZWFkX3RzYygpOworCisJbGFzdCA9IGd0b2QtPmN5Y2xlX2xhc3Q7CisKKwlpZiAobGlrZWx5KHJldCA+PSBsYXN0KSkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogR0NDIGxpa2VzIHRvIGdlbmVyYXRlIGNtb3YgaGVyZSwgYnV0IHRoaXMgYnJhbmNoIGlzIGV4dHJlbWVseQorCSAqIHByZWRpY3RhYmxlIChpdCdzIGp1c3QgYSBmdW5jaXRvbiBvZiB0aW1lIGFuZCB0aGUgbGlrZWx5IGlzCisJICogdmVyeSBsaWtlbHkpIGFuZCB0aGVyZSdzIGEgZGF0YSBkZXBlbmRlbmNlLCBzbyBmb3JjZSBHQ0MKKwkgKiB0byBnZW5lcmF0ZSBhIGJyYW5jaCBpbnN0ZWFkLiAgSSBkb24ndCBiYXJyaWVyKCkgYmVjYXVzZQorCSAqIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgYSBiYXJyaWVyLCBhbmQgaWYgdGhpcyBmdW5jdGlvbgorCSAqIGV2ZXIgZ2V0cyBpbmxpbmVkIGl0IHdpbGwgZ2VuZXJhdGUgd29yc2UgY29kZS4KKwkgKi8KKwlhc20gdm9sYXRpbGUgKCIiKTsKKwlyZXR1cm4gbGFzdDsKK30KIAogbm90cmFjZSBzdGF0aWMgaW5saW5lIHU2NCB2Z2V0c25zKGludCAqbW9kZSkKIHsKLQlsb25nIHY7CisJdTY0IHY7CiAJY3ljbGVzX3QgY3ljbGVzOwotCWlmIChndG9kLT5jbG9jay52Y2xvY2tfbW9kZSA9PSBWQ0xPQ0tfVFNDKQorCisJaWYgKGd0b2QtPnZjbG9ja19tb2RlID09IFZDTE9DS19UU0MpCiAJCWN5Y2xlcyA9IHZyZWFkX3RzYygpOwotCWVsc2UgaWYgKGd0b2QtPmNsb2NrLnZjbG9ja19tb2RlID09IFZDTE9DS19IUEVUKQorI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJZWxzZSBpZiAoZ3RvZC0+dmNsb2NrX21vZGUgPT0gVkNMT0NLX0hQRVQpCiAJCWN5Y2xlcyA9IHZyZWFkX2hwZXQoKTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19QQVJBVklSVF9DTE9DSwotCWVsc2UgaWYgKGd0b2QtPmNsb2NrLnZjbG9ja19tb2RlID09IFZDTE9DS19QVkNMT0NLKQorCWVsc2UgaWYgKGd0b2QtPnZjbG9ja19tb2RlID09IFZDTE9DS19QVkNMT0NLKQogCQljeWNsZXMgPSB2cmVhZF9wdmNsb2NrKG1vZGUpOwogI2VuZGlmCiAJZWxzZQogCQlyZXR1cm4gMDsKLQl2ID0gKGN5Y2xlcyAtIGd0b2QtPmNsb2NrLmN5Y2xlX2xhc3QpICYgZ3RvZC0+Y2xvY2subWFzazsKLQlyZXR1cm4gdiAqIGd0b2QtPmNsb2NrLm11bHQ7CisJdiA9IChjeWNsZXMgLSBndG9kLT5jeWNsZV9sYXN0KSAmIGd0b2QtPm1hc2s7CisJcmV0dXJuIHYgKiBndG9kLT5tdWx0OwogfQogCiAvKiBDb2RlIHNpemUgZG9lc24ndCBtYXR0ZXIgKHZkc28gaXMgNGsgYW55d2F5KSBhbmQgdGhpcyBpcyBmYXN0ZXIuICovCkBAIC0xNzYsMTA2ICsyNDgsMTAyIEBACiAJdTY0IG5zOwogCWludCBtb2RlOwogCi0JdHMtPnR2X25zZWMgPSAwOwogCWRvIHsKLQkJc2VxID0gcmF3X3JlYWRfc2VxY291bnRfYmVnaW4oJmd0b2QtPnNlcSk7Ci0JCW1vZGUgPSBndG9kLT5jbG9jay52Y2xvY2tfbW9kZTsKKwkJc2VxID0gZ3RvZF9yZWFkX2JlZ2luKGd0b2QpOworCQltb2RlID0gZ3RvZC0+dmNsb2NrX21vZGU7CiAJCXRzLT50dl9zZWMgPSBndG9kLT53YWxsX3RpbWVfc2VjOwogCQlucyA9IGd0b2QtPndhbGxfdGltZV9zbnNlYzsKIAkJbnMgKz0gdmdldHNucygmbW9kZSk7Ci0JCW5zID4+PSBndG9kLT5jbG9jay5zaGlmdDsKLQl9IHdoaWxlICh1bmxpa2VseShyZWFkX3NlcWNvdW50X3JldHJ5KCZndG9kLT5zZXEsIHNlcSkpKTsKKwkJbnMgPj49IGd0b2QtPnNoaWZ0OworCX0gd2hpbGUgKHVubGlrZWx5KGd0b2RfcmVhZF9yZXRyeShndG9kLCBzZXEpKSk7CiAKLQl0aW1lc3BlY19hZGRfbnModHMsIG5zKTsKKwl0cy0+dHZfc2VjICs9IF9faXRlcl9kaXZfdTY0X3JlbShucywgTlNFQ19QRVJfU0VDLCAmbnMpOworCXRzLT50dl9uc2VjID0gbnM7CisKIAlyZXR1cm4gbW9kZTsKIH0KIAotbm90cmFjZSBzdGF0aWMgaW50IGRvX21vbm90b25pYyhzdHJ1Y3QgdGltZXNwZWMgKnRzKQorbm90cmFjZSBzdGF0aWMgaW50IF9fYWx3YXlzX2lubGluZSBkb19tb25vdG9uaWMoc3RydWN0IHRpbWVzcGVjICp0cykKIHsKIAl1bnNpZ25lZCBsb25nIHNlcTsKIAl1NjQgbnM7CiAJaW50IG1vZGU7CiAKLQl0cy0+dHZfbnNlYyA9IDA7CiAJZG8gewotCQlzZXEgPSByYXdfcmVhZF9zZXFjb3VudF9iZWdpbigmZ3RvZC0+c2VxKTsKLQkJbW9kZSA9IGd0b2QtPmNsb2NrLnZjbG9ja19tb2RlOworCQlzZXEgPSBndG9kX3JlYWRfYmVnaW4oZ3RvZCk7CisJCW1vZGUgPSBndG9kLT52Y2xvY2tfbW9kZTsKIAkJdHMtPnR2X3NlYyA9IGd0b2QtPm1vbm90b25pY190aW1lX3NlYzsKIAkJbnMgPSBndG9kLT5tb25vdG9uaWNfdGltZV9zbnNlYzsKIAkJbnMgKz0gdmdldHNucygmbW9kZSk7Ci0JCW5zID4+PSBndG9kLT5jbG9jay5zaGlmdDsKLQl9IHdoaWxlICh1bmxpa2VseShyZWFkX3NlcWNvdW50X3JldHJ5KCZndG9kLT5zZXEsIHNlcSkpKTsKLQl0aW1lc3BlY19hZGRfbnModHMsIG5zKTsKKwkJbnMgPj49IGd0b2QtPnNoaWZ0OworCX0gd2hpbGUgKHVubGlrZWx5KGd0b2RfcmVhZF9yZXRyeShndG9kLCBzZXEpKSk7CisKKwl0cy0+dHZfc2VjICs9IF9faXRlcl9kaXZfdTY0X3JlbShucywgTlNFQ19QRVJfU0VDLCAmbnMpOworCXRzLT50dl9uc2VjID0gbnM7CiAKIAlyZXR1cm4gbW9kZTsKIH0KIAotbm90cmFjZSBzdGF0aWMgaW50IGRvX3JlYWx0aW1lX2NvYXJzZShzdHJ1Y3QgdGltZXNwZWMgKnRzKQorbm90cmFjZSBzdGF0aWMgdm9pZCBkb19yZWFsdGltZV9jb2Fyc2Uoc3RydWN0IHRpbWVzcGVjICp0cykKIHsKIAl1bnNpZ25lZCBsb25nIHNlcTsKIAlkbyB7Ci0JCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50X2JlZ2luKCZndG9kLT5zZXEpOwotCQl0cy0+dHZfc2VjID0gZ3RvZC0+d2FsbF90aW1lX2NvYXJzZS50dl9zZWM7Ci0JCXRzLT50dl9uc2VjID0gZ3RvZC0+d2FsbF90aW1lX2NvYXJzZS50dl9uc2VjOwotCX0gd2hpbGUgKHVubGlrZWx5KHJlYWRfc2VxY291bnRfcmV0cnkoJmd0b2QtPnNlcSwgc2VxKSkpOwotCXJldHVybiAwOworCQlzZXEgPSBndG9kX3JlYWRfYmVnaW4oZ3RvZCk7CisJCXRzLT50dl9zZWMgPSBndG9kLT53YWxsX3RpbWVfY29hcnNlX3NlYzsKKwkJdHMtPnR2X25zZWMgPSBndG9kLT53YWxsX3RpbWVfY29hcnNlX25zZWM7CisJfSB3aGlsZSAodW5saWtlbHkoZ3RvZF9yZWFkX3JldHJ5KGd0b2QsIHNlcSkpKTsKIH0KIAotbm90cmFjZSBzdGF0aWMgaW50IGRvX21vbm90b25pY19jb2Fyc2Uoc3RydWN0IHRpbWVzcGVjICp0cykKK25vdHJhY2Ugc3RhdGljIHZvaWQgZG9fbW9ub3RvbmljX2NvYXJzZShzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewogCXVuc2lnbmVkIGxvbmcgc2VxOwogCWRvIHsKLQkJc2VxID0gcmF3X3JlYWRfc2VxY291bnRfYmVnaW4oJmd0b2QtPnNlcSk7Ci0JCXRzLT50dl9zZWMgPSBndG9kLT5tb25vdG9uaWNfdGltZV9jb2Fyc2UudHZfc2VjOwotCQl0cy0+dHZfbnNlYyA9IGd0b2QtPm1vbm90b25pY190aW1lX2NvYXJzZS50dl9uc2VjOwotCX0gd2hpbGUgKHVubGlrZWx5KHJlYWRfc2VxY291bnRfcmV0cnkoJmd0b2QtPnNlcSwgc2VxKSkpOwotCi0JcmV0dXJuIDA7CisJCXNlcSA9IGd0b2RfcmVhZF9iZWdpbihndG9kKTsKKwkJdHMtPnR2X3NlYyA9IGd0b2QtPm1vbm90b25pY190aW1lX2NvYXJzZV9zZWM7CisJCXRzLT50dl9uc2VjID0gZ3RvZC0+bW9ub3RvbmljX3RpbWVfY29hcnNlX25zZWM7CisJfSB3aGlsZSAodW5saWtlbHkoZ3RvZF9yZWFkX3JldHJ5KGd0b2QsIHNlcSkpKTsKIH0KIAogbm90cmFjZSBpbnQgX192ZHNvX2Nsb2NrX2dldHRpbWUoY2xvY2tpZF90IGNsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewotCWludCByZXQgPSBWQ0xPQ0tfTk9ORTsKLQogCXN3aXRjaCAoY2xvY2spIHsKIAljYXNlIENMT0NLX1JFQUxUSU1FOgotCQlyZXQgPSBkb19yZWFsdGltZSh0cyk7CisJCWlmIChkb19yZWFsdGltZSh0cykgPT0gVkNMT0NLX05PTkUpCisJCQlnb3RvIGZhbGxiYWNrOwogCQlicmVhazsKIAljYXNlIENMT0NLX01PTk9UT05JQzoKLQkJcmV0ID0gZG9fbW9ub3RvbmljKHRzKTsKKwkJaWYgKGRvX21vbm90b25pYyh0cykgPT0gVkNMT0NLX05PTkUpCisJCQlnb3RvIGZhbGxiYWNrOwogCQlicmVhazsKIAljYXNlIENMT0NLX1JFQUxUSU1FX0NPQVJTRToKLQkJcmV0dXJuIGRvX3JlYWx0aW1lX2NvYXJzZSh0cyk7CisJCWRvX3JlYWx0aW1lX2NvYXJzZSh0cyk7CisJCWJyZWFrOwogCWNhc2UgQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRToKLQkJcmV0dXJuIGRvX21vbm90b25pY19jb2Fyc2UodHMpOworCQlkb19tb25vdG9uaWNfY29hcnNlKHRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBmYWxsYmFjazsKIAl9CiAKLQlpZiAocmV0ID09IFZDTE9DS19OT05FKQotCQlyZXR1cm4gdmRzb19mYWxsYmFja19nZXR0aW1lKGNsb2NrLCB0cyk7CiAJcmV0dXJuIDA7CitmYWxsYmFjazoKKwlyZXR1cm4gdmRzb19mYWxsYmFja19nZXR0aW1lKGNsb2NrLCB0cyk7CiB9CiBpbnQgY2xvY2tfZ2V0dGltZShjbG9ja2lkX3QsIHN0cnVjdCB0aW1lc3BlYyAqKQogCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Zkc29fY2xvY2tfZ2V0dGltZSIpKSk7CiAKIG5vdHJhY2UgaW50IF9fdmRzb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQogewotCWxvbmcgcmV0ID0gVkNMT0NLX05PTkU7Ci0KIAlpZiAobGlrZWx5KHR2ICE9IE5VTEwpKSB7Ci0JCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgdGltZXZhbCwgdHZfdXNlYykgIT0KLQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHRpbWVzcGVjLCB0dl9uc2VjKSB8fAotCQkJICAgICBzaXplb2YoKnR2KSAhPSBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSk7Ci0JCXJldCA9IGRvX3JlYWx0aW1lKChzdHJ1Y3QgdGltZXNwZWMgKil0dik7CisJCWlmICh1bmxpa2VseShkb19yZWFsdGltZSgoc3RydWN0IHRpbWVzcGVjICopdHYpID09IFZDTE9DS19OT05FKSkKKwkJCXJldHVybiB2ZHNvX2ZhbGxiYWNrX2d0b2QodHYsIHR6KTsKIAkJdHYtPnR2X3VzZWMgLz0gMTAwMDsKIAl9CiAJaWYgKHVubGlrZWx5KHR6ICE9IE5VTEwpKSB7Ci0JCS8qIEF2b2lkIG1lbWNweS4gU29tZSBvbGQgY29tcGlsZXJzIGZhaWwgdG8gaW5saW5lIGl0ICovCi0JCXR6LT50el9taW51dGVzd2VzdCA9IGd0b2QtPnN5c190ei50el9taW51dGVzd2VzdDsKLQkJdHotPnR6X2RzdHRpbWUgPSBndG9kLT5zeXNfdHoudHpfZHN0dGltZTsKKwkJdHotPnR6X21pbnV0ZXN3ZXN0ID0gZ3RvZC0+dHpfbWludXRlc3dlc3Q7CisJCXR6LT50el9kc3R0aW1lID0gZ3RvZC0+dHpfZHN0dGltZTsKIAl9CiAKLQlpZiAocmV0ID09IFZDTE9DS19OT05FKQotCQlyZXR1cm4gdmRzb19mYWxsYmFja19ndG9kKHR2LCB0eik7CiAJcmV0dXJuIDA7CiB9CiBpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqKQpAQCAtMjg3LDggKzM1NSw4IEBACiAgKi8KIG5vdHJhY2UgdGltZV90IF9fdmRzb190aW1lKHRpbWVfdCAqdCkKIHsKLQkvKiBUaGlzIGlzIGF0b21pYyBvbiB4ODZfNjQgc28gd2UgZG9uJ3QgbmVlZCBhbnkgbG9ja3MuICovCi0JdGltZV90IHJlc3VsdCA9IEFDQ0VTU19PTkNFKFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS53YWxsX3RpbWVfc2VjKTsKKwkvKiBUaGlzIGlzIGF0b21pYyBvbiB4ODYgc28gd2UgZG9uJ3QgbmVlZCBhbnkgbG9ja3MuICovCisJdGltZV90IHJlc3VsdCA9IEFDQ0VTU19PTkNFKGd0b2QtPndhbGxfdGltZV9zZWMpOwogCiAJaWYgKHQpCiAJCSp0ID0gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvLWxheW91dC5sZHMuUyBiL2FyY2gveDg2L3Zkc28vdmRzby1sYXlvdXQubGRzLlMKaW5kZXggNjM0YTJjZi4uMmUyNjNmMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92ZHNvLWxheW91dC5sZHMuUworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28tbGF5b3V0Lmxkcy5TCkBAIC02LDcgKzYsMjUgQEAKIAogU0VDVElPTlMKIHsKLQkuID0gVkRTT19QUkVMSU5LICsgU0laRU9GX0hFQURFUlM7CisjaWZkZWYgQlVJTERfVkRTTzMyCisjaW5jbHVkZSA8YXNtL3Zkc28zMi5oPgorCisJLmhwZXRfc2VjdCA6IHsKKwkJaHBldF9wYWdlID0gLiAtIFZEU09fT0ZGU0VUKFZEU09fSFBFVF9QQUdFKTsKKwl9IDp0ZXh0IDpocGV0X3NlY3QKKworCS52dmFyX3NlY3QgOiB7CisJCXZ2YXIgPSAuIC0gVkRTT19PRkZTRVQoVkRTT19WVkFSX1BBR0UpOworCisJLyogUGxhY2UgYWxsIHZ2YXJzIGF0IHRoZSBvZmZzZXRzIGluIGFzbS92dmFyLmguICovCisjZGVmaW5lIEVNSVRfVlZBUihuYW1lLCBvZmZzZXQpIHZ2YXJfICMjIG5hbWUgPSB2dmFyICsgb2Zmc2V0OworI2RlZmluZSBfX1ZWQVJfS0VSTkVMX0xEUworI2luY2x1ZGUgPGFzbS92dmFyLmg+CisjdW5kZWYgX19WVkFSX0tFUk5FTF9MRFMKKyN1bmRlZiBFTUlUX1ZWQVIKKwl9IDp0ZXh0IDp2dmFyX3NlY3QKKyNlbmRpZgorCS4gPSBTSVpFT0ZfSEVBREVSUzsKIAogCS5oYXNoCQk6IHsgKiguaGFzaCkgfQkJCTp0ZXh0CiAJLmdudS5oYXNoCTogeyAqKC5nbnUuaGFzaCkgfQpAQCAtNDQsNiArNjIsMTEgQEAKIAkuID0gQUxJR04oMHgxMDApOwogCiAJLnRleHQJCTogeyAqKC50ZXh0KikgfQkJCTp0ZXh0CT0weDkwOTA5MDkwCisKKwkvRElTQ0FSRC8gOiB7CisJCSooLmRpc2NhcmQpCisJCSooLmRpc2NhcmQuKikKKwl9CiB9CiAKIC8qCkBAIC02MSw0ICs4NCw4IEBACiAJZHluYW1pYwkJUFRfRFlOQU1JQwlGTEFHUyg0KTsJCS8qIFBGX1IgKi8KIAlub3RlCQlQVF9OT1RFCQlGTEFHUyg0KTsJCS8qIFBGX1IgKi8KIAllaF9mcmFtZV9oZHIJUFRfR05VX0VIX0ZSQU1FOworI2lmZGVmIEJVSUxEX1ZEU08zMgorCXZ2YXJfc2VjdAlQVF9OVUxMCQlGTEFHUyg0KTsJCS8qIFBGX1IgKi8KKwlocGV0X3NlY3QJUFRfTlVMTAkJRkxBR1MoNCk7CQkvKiBQRl9SICovCisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzby5TIGIvYXJjaC94ODYvdmRzby92ZHNvLlMKaW5kZXggMWUxM2ViOC4uYmUzZjIzYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92ZHNvLlMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvLlMKQEAgLTEsMjEgKzEsMyBAQAotI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAKLV9fUEFHRV9BTElHTkVEX0RBVEEKLQotCS5nbG9ibCB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZAotCS5hbGlnbiBQQUdFX1NJWkUKLXZkc29fc3RhcnQ6Ci0JLmluY2JpbiAiYXJjaC94ODYvdmRzby92ZHNvLnNvIgotdmRzb19lbmQ6Ci0JLmFsaWduIFBBR0VfU0laRSAvKiBleHRyYSBkYXRhIGhlcmUgbGVha3MgdG8gdXNlcnNwYWNlLiAqLwotCi0ucHJldmlvdXMKLQotCS5nbG9ibCB2ZHNvX3BhZ2VzCi0JLmJzcwotCS5hbGlnbiA4Ci0JLnR5cGUgdmRzb19wYWdlcywgQG9iamVjdAotdmRzb19wYWdlczoKLQkuemVybyAodmRzb19lbmQgLSB2ZHNvX3N0YXJ0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkUgKiA4Ci0JLnNpemUgdmRzb19wYWdlcywgLi12ZHNvX3BhZ2VzCitERUZJTkVfVkRTT19JTUFHRSh2ZHNvLCAiYXJjaC94ODYvdmRzby92ZHNvLnNvIikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jCmluZGV4IGQ2YmZiODcuLjAwMzQ4OTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvMzItc2V0dXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vbXNyLmg+CkBAIC0yNSwxNyArMjYsMTQgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgotCi1lbnVtIHsKLQlWRFNPX0RJU0FCTEVEID0gMCwKLQlWRFNPX0VOQUJMRUQgPSAxLAotCVZEU09fQ09NUEFUID0gMiwKLX07CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisjaW5jbHVkZSA8YXNtL3Z2YXIuaD4KIAogI2lmZGVmIENPTkZJR19DT01QQVRfVkRTTwotI2RlZmluZSBWRFNPX0RFRkFVTFQJVkRTT19DT01QQVQKKyNkZWZpbmUgVkRTT19ERUZBVUxUCTAKICNlbHNlCi0jZGVmaW5lIFZEU09fREVGQVVMVAlWRFNPX0VOQUJMRUQKKyNkZWZpbmUgVkRTT19ERUZBVUxUCTEKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApAQCAtNDQsMTMgKzQyLDYgQEAKICNlbmRpZgogCiAvKgotICogVGhpcyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwcmVsaW5rZWQgYWRkcmVzc2VzIGluIHRoZSB2RFNPIGltYWdlcwotICogYW5kIHRoZSBWRFNPX0hJR0hfQkFTRSBhZGRyZXNzIHdoZXJlIENPTkZJR19DT01QQVRfVkRTTyBwbGFjZXMgdGhlIHZEU08KLSAqIGluIHRoZSB1c2VyIGFkZHJlc3Mgc3BhY2UuCi0gKi8KLSNkZWZpbmUgVkRTT19BRERSX0FESlVTVAkoVkRTT19ISUdIX0JBU0UgLSAodW5zaWduZWQgbG9uZylWRFNPMzJfUFJFTElOSykKLQotLyoKICAqIFNob3VsZCB0aGUga2VybmVsIG1hcCBhIFZEU08gcGFnZSBpbnRvIHByb2Nlc3NlcyBhbmQgcGFzcyBpdHMKICAqIGFkZHJlc3MgZG93biB0byBnbGliYyB1cG9uIGV4ZWMoKT8KICAqLwpAQCAtNjAsNiArNTEsOSBAQAogewogCXZkc29fZW5hYmxlZCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOwogCisJaWYgKHZkc29fZW5hYmxlZCA+IDEpCisJCXByX3dhcm4oInZkc28zMiB2YWx1ZXMgb3RoZXIgdGhhbiAwIGFuZCAxIGFyZSBubyBsb25nZXIgYWxsb3dlZDsgdmRzbyBkaXNhYmxlZFxuIik7CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtNzYsMTI0ICs3MCw4IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh2ZHNvX2VuYWJsZWQpOwogI2VuZGlmCiAKLXN0YXRpYyBfX2luaXQgdm9pZCByZWxvY19zeW10YWIoRWxmMzJfRWhkciAqZWhkciwKLQkJCQl1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHNpemUpCi17Ci0JRWxmMzJfU3ltICpzeW0gPSAodm9pZCAqKWVoZHIgKyBvZmZzZXQ7Ci0JdW5zaWduZWQgbnN5bSA9IHNpemUgLyBzaXplb2YoKnN5bSk7Ci0JdW5zaWduZWQgaTsKLQotCWZvcihpID0gMDsgaSA8IG5zeW07IGkrKywgc3ltKyspIHsKLQkJaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGIHx8Ci0JCSAgICBzeW0tPnN0X3NobmR4ID09IFNITl9BQlMpCi0JCQljb250aW51ZTsgIC8qIHNraXAgKi8KLQotCQlpZiAoc3ltLT5zdF9zaG5keCA+IFNITl9MT1JFU0VSVkUpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIlZEU086IHVuZXhwZWN0ZWQgc3Rfc2huZHggJXhcbiIsCi0JCQkgICAgICAgc3ltLT5zdF9zaG5keCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXN3aXRjaChFTEZfU1RfVFlQRShzeW0tPnN0X2luZm8pKSB7Ci0JCWNhc2UgU1RUX09CSkVDVDoKLQkJY2FzZSBTVFRfRlVOQzoKLQkJY2FzZSBTVFRfU0VDVElPTjoKLQkJY2FzZSBTVFRfRklMRToKLQkJCXN5bS0+c3RfdmFsdWUgKz0gVkRTT19BRERSX0FESlVTVDsKLQkJfQotCX0KLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIHJlbG9jX2R5bihFbGYzMl9FaGRyICplaGRyLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JRWxmMzJfRHluICpkeW4gPSAodm9pZCAqKWVoZHIgKyBvZmZzZXQ7Ci0KLQlmb3IoOyBkeW4tPmRfdGFnICE9IERUX05VTEw7IGR5bisrKQotCQlzd2l0Y2goZHluLT5kX3RhZykgewotCQljYXNlIERUX1BMVEdPVDoKLQkJY2FzZSBEVF9IQVNIOgotCQljYXNlIERUX1NUUlRBQjoKLQkJY2FzZSBEVF9TWU1UQUI6Ci0JCWNhc2UgRFRfUkVMQToKLQkJY2FzZSBEVF9JTklUOgotCQljYXNlIERUX0ZJTkk6Ci0JCWNhc2UgRFRfUkVMOgotCQljYXNlIERUX0RFQlVHOgotCQljYXNlIERUX0pNUFJFTDoKLQkJY2FzZSBEVF9WRVJTWU06Ci0JCWNhc2UgRFRfVkVSREVGOgotCQljYXNlIERUX1ZFUk5FRUQ6Ci0JCWNhc2UgRFRfQUREUlJOR0xPIC4uLiBEVF9BRERSUk5HSEk6Ci0JCQkvKiBkZWZpbml0ZWx5IHBvaW50ZXJzIG5lZWRpbmcgcmVsb2NhdGlvbiAqLwotCQkJZHluLT5kX3VuLmRfcHRyICs9IFZEU09fQUREUl9BREpVU1Q7Ci0JCQlicmVhazsKLQotCQljYXNlIERUX0VOQ09ESU5HIC4uLiBPTERfRFRfTE9PUy0xOgotCQljYXNlIERUX0xPT1MgLi4uIERUX0hJT1MtMToKLQkJCS8qIFRhZ3MgYWJvdmUgRFRfRU5DT0RJTkcgYXJlIHBvaW50ZXJzIGlmCi0JCQkgICB0aGV5J3JlIGV2ZW4gKi8KLQkJCWlmIChkeW4tPmRfdGFnID49IERUX0VOQ09ESU5HICYmCi0JCQkgICAgKGR5bi0+ZF90YWcgJiAxKSA9PSAwKQotCQkJCWR5bi0+ZF91bi5kX3B0ciArPSBWRFNPX0FERFJfQURKVVNUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBEVF9WRVJERUZOVU06Ci0JCWNhc2UgRFRfVkVSTkVFRE5VTToKLQkJY2FzZSBEVF9GTEFHU18xOgotCQljYXNlIERUX1JFTEFDT1VOVDoKLQkJY2FzZSBEVF9SRUxDT1VOVDoKLQkJY2FzZSBEVF9WQUxSTkdMTyAuLi4gRFRfVkFMUk5HSEk6Ci0JCQkvKiBkZWZpbml0ZWx5IG5vdCBwb2ludGVycyAqLwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPTERfRFRfTE9PUyAuLi4gRFRfTE9PUy0xOgotCQljYXNlIERUX0hJT1MgLi4uIERUX1ZBTFJOR0xPLTE6Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoZHluLT5kX3RhZyA+IERUX0VOQ09ESU5HKQotCQkJCXByaW50ayhLRVJOX0lORk8gIlZEU086IHVuZXhwZWN0ZWQgRFRfdGFnICV4XG4iLAotCQkJCSAgICAgICBkeW4tPmRfdGFnKTsKLQkJCWJyZWFrOwotCQl9Ci19Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCByZWxvY2F0ZV92ZHNvKEVsZjMyX0VoZHIgKmVoZHIpCi17Ci0JRWxmMzJfUGhkciAqcGhkcjsKLQlFbGYzMl9TaGRyICpzaGRyOwotCWludCBpOwotCi0JQlVHX09OKG1lbWNtcChlaGRyLT5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDAgfHwKLQkgICAgICAgIWVsZl9jaGVja19hcmNoX2lhMzIoZWhkcikgfHwKLQkgICAgICAgZWhkci0+ZV90eXBlICE9IEVUX0RZTik7Ci0KLQllaGRyLT5lX2VudHJ5ICs9IFZEU09fQUREUl9BREpVU1Q7Ci0KLQkvKiByZWJhc2UgcGhkcnMgKi8KLQlwaGRyID0gKHZvaWQgKillaGRyICsgZWhkci0+ZV9waG9mZjsKLQlmb3IgKGkgPSAwOyBpIDwgZWhkci0+ZV9waG51bTsgaSsrKSB7Ci0JCXBoZHJbaV0ucF92YWRkciArPSBWRFNPX0FERFJfQURKVVNUOwotCi0JCS8qIHJlbG9jYXRlIGR5bmFtaWMgc3R1ZmYgKi8KLQkJaWYgKHBoZHJbaV0ucF90eXBlID09IFBUX0RZTkFNSUMpCi0JCQlyZWxvY19keW4oZWhkciwgcGhkcltpXS5wX29mZnNldCk7Ci0JfQotCi0JLyogcmViYXNlIHNlY3Rpb25zICovCi0Jc2hkciA9ICh2b2lkICopZWhkciArIGVoZHItPmVfc2hvZmY7Ci0JZm9yKGkgPSAwOyBpIDwgZWhkci0+ZV9zaG51bTsgaSsrKSB7Ci0JCWlmICghKHNoZHJbaV0uc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKQotCQkJY29udGludWU7Ci0KLQkJc2hkcltpXS5zaF9hZGRyICs9IFZEU09fQUREUl9BREpVU1Q7Ci0KLQkJaWYgKHNoZHJbaV0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCIHx8Ci0JCSAgICBzaGRyW2ldLnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKLQkJCXJlbG9jX3N5bXRhYihlaGRyLCBzaGRyW2ldLnNoX29mZnNldCwKLQkJCQkgICAgIHNoZHJbaV0uc2hfc2l6ZSk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnZkc28zMl9wYWdlc1sxXTsKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqKnZkc28zMl9wYWdlczsKK3N0YXRpYyB1bnNpZ25lZCB2ZHNvMzJfc2l6ZTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKIApAQCAtMjEyLDEyICs5MCw2IEBACiAJd3Jtc3JsKE1TUl9DU1RBUiwgaWEzMl9jc3Rhcl90YXJnZXQpOwogfQogCi0jZGVmaW5lIGNvbXBhdF91c2VzX3ZtYQkJMQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFwX2NvbXBhdF92ZHNvKGludCBtYXApCi17Ci19Ci0KICNlbHNlICAvKiBDT05GSUdfWDg2XzMyICovCiAKICNkZWZpbmUgdmRzbzMyX3N5c2VudGVyKCkJKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TRVApKQpAQCAtMjQxLDY0ICsxMTMsMzYgQEAKIAlwdXRfY3B1KCk7CQogfQogCi1zdGF0aWMgc3RydWN0IHZtX2FyZWFfc3RydWN0IGdhdGVfdm1hOwotCi1zdGF0aWMgaW50IF9faW5pdCBnYXRlX3ZtYV9pbml0KHZvaWQpCi17Ci0JZ2F0ZV92bWEudm1fbW0gPSBOVUxMOwotCWdhdGVfdm1hLnZtX3N0YXJ0ID0gRklYQUREUl9VU0VSX1NUQVJUOwotCWdhdGVfdm1hLnZtX2VuZCA9IEZJWEFERFJfVVNFUl9FTkQ7Ci0JZ2F0ZV92bWEudm1fZmxhZ3MgPSBWTV9SRUFEIHwgVk1fTUFZUkVBRCB8IFZNX0VYRUMgfCBWTV9NQVlFWEVDOwotCWdhdGVfdm1hLnZtX3BhZ2VfcHJvdCA9IF9fUDEwMTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIGNvbXBhdF91c2VzX3ZtYQkJMAotCi1zdGF0aWMgdm9pZCBtYXBfY29tcGF0X3Zkc28oaW50IG1hcCkKLXsKLQlzdGF0aWMgaW50IHZkc29fbWFwcGVkOwotCi0JaWYgKG1hcCA9PSB2ZHNvX21hcHBlZCkKLQkJcmV0dXJuOwotCi0JdmRzb19tYXBwZWQgPSBtYXA7Ci0KLQlfX3NldF9maXhtYXAoRklYX1ZEU08sIHBhZ2VfdG9fcGZuKHZkc28zMl9wYWdlc1swXSkgPDwgUEFHRV9TSElGVCwKLQkJICAgICBtYXAgPyBQQUdFX1JFQURPTkxZX0VYRUMgOiBQQUdFX05PTkUpOwotCi0JLyogZmx1c2ggc3RyYXkgdGxicyAqLwotCWZsdXNoX3RsYl9hbGwoKTsKLX0KLQogI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KIAogaW50IF9faW5pdCBzeXNlbnRlcl9zZXR1cCh2b2lkKQogewotCXZvaWQgKnN5c2NhbGxfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwotCWNvbnN0IHZvaWQgKnZzeXNjYWxsOwotCXNpemVfdCB2c3lzY2FsbF9sZW47CisJY2hhciAqdmRzbzMyX3N0YXJ0LCAqdmRzbzMyX2VuZDsKKwlpbnQgbnBhZ2VzLCBpOwogCi0JdmRzbzMyX3BhZ2VzWzBdID0gdmlydF90b19wYWdlKHN5c2NhbGxfcGFnZSk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JZ2F0ZV92bWFfaW5pdCgpOwotI2VuZGlmCi0KKyNpZmRlZiBDT05GSUdfQ09NUEFUCiAJaWYgKHZkc28zMl9zeXNjYWxsKCkpIHsKLQkJdnN5c2NhbGwgPSAmdmRzbzMyX3N5c2NhbGxfc3RhcnQ7Ci0JCXZzeXNjYWxsX2xlbiA9ICZ2ZHNvMzJfc3lzY2FsbF9lbmQgLSAmdmRzbzMyX3N5c2NhbGxfc3RhcnQ7Ci0JfSBlbHNlIGlmICh2ZHNvMzJfc3lzZW50ZXIoKSl7Ci0JCXZzeXNjYWxsID0gJnZkc28zMl9zeXNlbnRlcl9zdGFydDsKLQkJdnN5c2NhbGxfbGVuID0gJnZkc28zMl9zeXNlbnRlcl9lbmQgLSAmdmRzbzMyX3N5c2VudGVyX3N0YXJ0OworCQl2ZHNvMzJfc3RhcnQgPSB2ZHNvMzJfc3lzY2FsbF9zdGFydDsKKwkJdmRzbzMyX2VuZCA9IHZkc28zMl9zeXNjYWxsX2VuZDsKKwkJdmRzbzMyX3BhZ2VzID0gdmRzbzMyX3N5c2NhbGxfcGFnZXM7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAodmRzbzMyX3N5c2VudGVyKCkpIHsKKwkJdmRzbzMyX3N0YXJ0ID0gdmRzbzMyX3N5c2VudGVyX3N0YXJ0OworCQl2ZHNvMzJfZW5kID0gdmRzbzMyX3N5c2VudGVyX2VuZDsKKwkJdmRzbzMyX3BhZ2VzID0gdmRzbzMyX3N5c2VudGVyX3BhZ2VzOwogCX0gZWxzZSB7Ci0JCXZzeXNjYWxsID0gJnZkc28zMl9pbnQ4MF9zdGFydDsKLQkJdnN5c2NhbGxfbGVuID0gJnZkc28zMl9pbnQ4MF9lbmQgLSAmdmRzbzMyX2ludDgwX3N0YXJ0OworCQl2ZHNvMzJfc3RhcnQgPSB2ZHNvMzJfaW50ODBfc3RhcnQ7CisJCXZkc28zMl9lbmQgPSB2ZHNvMzJfaW50ODBfZW5kOworCQl2ZHNvMzJfcGFnZXMgPSB2ZHNvMzJfaW50ODBfcGFnZXM7CiAJfQogCi0JbWVtY3B5KHN5c2NhbGxfcGFnZSwgdnN5c2NhbGwsIHZzeXNjYWxsX2xlbik7Ci0JcmVsb2NhdGVfdmRzbyhzeXNjYWxsX3BhZ2UpOworCW5wYWdlcyA9ICgodmRzbzMyX2VuZCAtIHZkc28zMl9zdGFydCkgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKKwl2ZHNvMzJfc2l6ZSA9IG5wYWdlcyA8PCBQQUdFX1NISUZUOworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykKKwkJdmRzbzMyX3BhZ2VzW2ldID0gdmlydF90b19wYWdlKHZkc28zMl9zdGFydCArIGkqUEFHRV9TSVpFKTsKKworCXBhdGNoX3Zkc28zMih2ZHNvMzJfc3RhcnQsIHZkc28zMl9zaXplKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzA5LDQ4ICsxNTMsNzMgQEAKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAlpbnQgcmV0ID0gMDsKLQlib29sIGNvbXBhdDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAogI2lmZGVmIENPTkZJR19YODZfWDMyX0FCSQogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9YMzIpKQogCQlyZXR1cm4geDMyX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoYnBybSwgdXNlc19pbnRlcnApOwogI2VuZGlmCiAKLQlpZiAodmRzb19lbmFibGVkID09IFZEU09fRElTQUJMRUQpCisJaWYgKHZkc29fZW5hYmxlZCAhPSAxKSAgLyogT3RoZXIgdmFsdWVzIGFsbCBtZWFuICJkaXNhYmxlZCIgKi8KIAkJcmV0dXJuIDA7CiAKIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCi0JLyogVGVzdCBjb21wYXQgbW9kZSBvbmNlIGhlcmUsIGluIGNhc2Ugc29tZW9uZQotCSAgIGNoYW5nZXMgaXQgdmlhIHN5c2N0bCAqLwotCWNvbXBhdCA9ICh2ZHNvX2VuYWJsZWQgPT0gVkRTT19DT01QQVQpOwotCi0JbWFwX2NvbXBhdF92ZHNvKGNvbXBhdCk7Ci0KLQlpZiAoY29tcGF0KQotCQlhZGRyID0gVkRTT19ISUdIX0JBU0U7Ci0JZWxzZSB7Ci0JCWFkZHIgPSBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCAwLCBQQUdFX1NJWkUsIDAsIDApOwotCQlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKSB7Ci0JCQlyZXQgPSBhZGRyOwotCQkJZ290byB1cF9mYWlsOwotCQl9CisJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIDAsIHZkc28zMl9zaXplICsgVkRTT19PRkZTRVQoVkRTT19QUkVWX1BBR0VTKSwgMCwgMCk7CisJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkgeworCQlyZXQgPSBhZGRyOworCQlnb3RvIHVwX2ZhaWw7CiAJfQogCisJYWRkciArPSBWRFNPX09GRlNFVChWRFNPX1BSRVZfUEFHRVMpOworCiAJY3VycmVudC0+bW0tPmNvbnRleHQudmRzbyA9ICh2b2lkICopYWRkcjsKIAotCWlmIChjb21wYXRfdXNlc192bWEgfHwgIWNvbXBhdCkgewotCQkvKgotCQkgKiBNQVlXUklURSB0byBhbGxvdyBnZGIgdG8gQ09XIGFuZCBzZXQgYnJlYWtwb2ludHMKLQkJICovCi0JCXJldCA9IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKG1tLCBhZGRyLCBQQUdFX1NJWkUsCi0JCQkJCSAgICAgIFZNX1JFQUR8Vk1fRVhFQ3wKLQkJCQkJICAgICAgVk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDLAotCQkJCQkgICAgICB2ZHNvMzJfcGFnZXMpOworCS8qCisJICogTUFZV1JJVEUgdG8gYWxsb3cgZ2RiIHRvIENPVyBhbmQgc2V0IGJyZWFrcG9pbnRzCisJICovCisJcmV0ID0gaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcobW0sCisJCQlhZGRyLAorCQkJdmRzbzMyX3NpemUsCisJCQlWTV9SRUFEfFZNX0VYRUN8CisJCQlWTV9NQVlSRUFEfFZNX01BWVdSSVRFfFZNX01BWUVYRUMsCisJCQl2ZHNvMzJfcGFnZXMpOworCisJaWYgKHJldCkKKwkJZ290byB1cF9mYWlsOworCisJdm1hID0gX2luc3RhbGxfc3BlY2lhbF9tYXBwaW5nKG1tLAorCQkJYWRkciAtICBWRFNPX09GRlNFVChWRFNPX1BSRVZfUEFHRVMpLAorCQkJVkRTT19PRkZTRVQoVkRTT19QUkVWX1BBR0VTKSwKKwkJCVZNX1JFQUQsCisJCQlOVUxMKTsKKworCWlmIChJU19FUlIodm1hKSkgeworCQlyZXQgPSBQVFJfRVJSKHZtYSk7CisJCWdvdG8gdXBfZmFpbDsKKwl9CisKKwlyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLAorCQlhZGRyIC0gVkRTT19PRkZTRVQoVkRTT19WVkFSX1BBR0UpLAorCQlfX3BhX3N5bWJvbCgmX192dmFyX3BhZ2UpID4+IFBBR0VfU0hJRlQsCisJCVBBR0VfU0laRSwKKwkJUEFHRV9SRUFET05MWSk7CisKKwlpZiAocmV0KQorCQlnb3RvIHVwX2ZhaWw7CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorCWlmIChocGV0X2FkZHJlc3MpIHsKKwkJcmV0ID0gaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwKKwkJCWFkZHIgLSBWRFNPX09GRlNFVChWRFNPX0hQRVRfUEFHRSksCisJCQlocGV0X2FkZHJlc3MgPj4gUEFHRV9TSElGVCwKKwkJCVBBR0VfU0laRSwKKwkJCXBncHJvdF9ub25jYWNoZWQoUEFHRV9SRUFET05MWSkpOwogCiAJCWlmIChyZXQpCiAJCQlnb3RvIHVwX2ZhaWw7CiAJfQorI2VuZGlmCiAKIAljdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c2VudGVyX3JldHVybiA9CiAJCVZEU08zMl9TWU1CT0woYWRkciwgU1lTRU5URVJfUkVUVVJOKTsKQEAgLTQxMSwyMCArMjgwLDEyIEBACiAKIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZ2V0X2dhdGVfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCS8qCi0JICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBjb3JyZXNwb25kaW5nIHRhc2sgd2FzIGNyZWF0ZWQgaW4gY29tcGF0IHZkc28KLQkgKiBtb2RlLgotCSAqLwotCWlmIChtbSAmJiBtbS0+Y29udGV4dC52ZHNvID09ICh2b2lkICopVkRTT19ISUdIX0JBU0UpCi0JCXJldHVybiAmZ2F0ZV92bWE7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIGludCBpbl9nYXRlX2FyZWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQljb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IGdldF9nYXRlX3ZtYShtbSk7Ci0KLQlyZXR1cm4gdm1hICYmIGFkZHIgPj0gdm1hLT52bV9zdGFydCAmJiBhZGRyIDwgdm1hLT52bV9lbmQ7CisJcmV0dXJuIDA7CiB9CiAKIGludCBpbl9nYXRlX2FyZWFfbm9fbW0odW5zaWduZWQgbG9uZyBhZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvMzIuUyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyLlMKaW5kZXggMmNlNWY4Mi4uMDE4YmNkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92ZHNvMzIuUworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi5TCkBAIC0xLDIyICsxLDkgQEAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAotX19JTklUREFUQQorREVGSU5FX1ZEU09fSU1BR0UodmRzbzMyX2ludDgwLCAiYXJjaC94ODYvdmRzby92ZHNvMzItaW50ODAuc28iKQogCi0JLmdsb2JsIHZkc28zMl9pbnQ4MF9zdGFydCwgdmRzbzMyX2ludDgwX2VuZAotdmRzbzMyX2ludDgwX3N0YXJ0OgotCS5pbmNiaW4gImFyY2gveDg2L3Zkc28vdmRzbzMyLWludDgwLnNvIgotdmRzbzMyX2ludDgwX2VuZDoKLQotCS5nbG9ibCB2ZHNvMzJfc3lzY2FsbF9zdGFydCwgdmRzbzMyX3N5c2NhbGxfZW5kCi12ZHNvMzJfc3lzY2FsbF9zdGFydDoKICNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmluY2JpbiAiYXJjaC94ODYvdmRzby92ZHNvMzItc3lzY2FsbC5zbyIKK0RFRklORV9WRFNPX0lNQUdFKHZkc28zMl9zeXNjYWxsLCAiYXJjaC94ODYvdmRzby92ZHNvMzItc3lzY2FsbC5zbyIpCiAjZW5kaWYKLXZkc28zMl9zeXNjYWxsX2VuZDoKIAotCS5nbG9ibCB2ZHNvMzJfc3lzZW50ZXJfc3RhcnQsIHZkc28zMl9zeXNlbnRlcl9lbmQKLXZkc28zMl9zeXNlbnRlcl9zdGFydDoKLQkuaW5jYmluICJhcmNoL3g4Ni92ZHNvL3Zkc28zMi1zeXNlbnRlci5zbyIKLXZkc28zMl9zeXNlbnRlcl9lbmQ6Ci0KLV9fRklOSVQKK0RFRklORV9WRFNPX0lNQUdFKHZkc28zMl9zeXNlbnRlciwgImFyY2gveDg2L3Zkc28vdmRzbzMyLXN5c2VudGVyLnNvIikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzbzMyL3ZjbG9ja19nZXR0aW1lLmMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi92Y2xvY2tfZ2V0dGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NWNjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi92Y2xvY2tfZ2V0dGltZS5jCkBAIC0wLDAgKzEsMzAgQEAKKyNkZWZpbmUgQlVJTERfVkRTTzMyCisKKyNpZm5kZWYgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFCisjdW5kZWYgQ09ORklHX09QVElNSVpFX0lOTElOSU5HCisjZW5kaWYKKworI3VuZGVmIENPTkZJR19YODZfUFBST19GRU5DRQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisvKgorICogaW4gY2FzZSBvZiBhIDMyIGJpdCBWRFNPIGZvciBhIDY0IGJpdCBrZXJuZWwgZmFrZSBhIDMyIGJpdCBrZXJuZWwKKyAqIGNvbmZpZ3VyYXRpb24KKyAqLworI3VuZGVmIENPTkZJR182NEJJVAorI3VuZGVmIENPTkZJR19YODZfNjQKKyN1bmRlZiBDT05GSUdfSUxMRUdBTF9QT0lOVEVSX1ZBTFVFCisjdW5kZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCisjdW5kZWYgQ09ORklHX05SX0NQVVMKKworI2RlZmluZSBDT05GSUdfWDg2XzMyIDEKKyNkZWZpbmUgQ09ORklHX1BBR0VfT0ZGU0VUIDAKKyNkZWZpbmUgQ09ORklHX0lMTEVHQUxfUE9JTlRFUl9WQUxVRSAwCisjZGVmaW5lIENPTkZJR19OUl9DUFVTIDEKKworI2RlZmluZSBCVUlMRF9WRFNPMzJfNjQKKworI2VuZGlmCisKKyNpbmNsdWRlICIuLi92Y2xvY2tfZ2V0dGltZS5jIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvMzIvdmRzbzMyLmxkcy5TIGIvYXJjaC94ODYvdmRzby92ZHNvMzIvdmRzbzMyLmxkcy5TCmluZGV4IDk3NjEyNGIuLmFhZGI4YjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzbzMyL3Zkc28zMi5sZHMuUworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi92ZHNvMzIubGRzLlMKQEAgLTgsNyArOCwxMSBAQAogICogdmFsdWVzIHZpc2libGUgdXNpbmcgdGhlIGFzbS14ODYvdmRzby5oIG1hY3JvcyBmcm9tIHRoZSBrZXJuZWwgcHJvcGVyLgogICovCiAKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjZGVmaW5lIEJVSUxEX1ZEU08zMgogI2RlZmluZSBWRFNPX1BSRUxJTksgMAorCiAjaW5jbHVkZSAiLi4vdmRzby1sYXlvdXQubGRzLlMiCiAKIC8qIFRoZSBFTEYgZW50cnkgcG9pbnQgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBBVF9TWVNJTkZPIHZhbHVlLiAgKi8KQEAgLTE5LDYgKzIzLDEzIEBACiAgKi8KIFZFUlNJT04KIHsKKwlMSU5VWF8yLjYgeworCWdsb2JhbDoKKwkJX192ZHNvX2Nsb2NrX2dldHRpbWU7CisJCV9fdmRzb19nZXR0aW1lb2ZkYXk7CisJCV9fdmRzb190aW1lOworCX07CisKIAlMSU5VWF8yLjUgewogCWdsb2JhbDoKIAkJX19rZXJuZWxfdnN5c2NhbGw7CkBAIC0zMSw3ICs0Miw5IEBACiAvKgogICogU3ltYm9scyB3ZSBkZWZpbmUgaGVyZSBjYWxsZWQgVkRTTyogZ2V0IHRoZWlyIHZhbHVlcyBpbnRvIHZkc28zMi1zeW1zLmguCiAgKi8KLVZEU08zMl9QUkVMSU5LCQk9IFZEU09fUFJFTElOSzsKIFZEU08zMl92c3lzY2FsbAkJPSBfX2tlcm5lbF92c3lzY2FsbDsKIFZEU08zMl9zaWdyZXR1cm4JPSBfX2tlcm5lbF9zaWdyZXR1cm47CiBWRFNPMzJfcnRfc2lncmV0dXJuCT0gX19rZXJuZWxfcnRfc2lncmV0dXJuOworVkRTTzMyX2Nsb2NrX2dldHRpbWUJPSBjbG9ja19nZXR0aW1lOworVkRTTzMyX2dldHRpbWVvZmRheQk9IGdldHRpbWVvZmRheTsKK1ZEU08zMl90aW1lCQk9IHRpbWU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc294MzIuUyBiL2FyY2gveDg2L3Zkc28vdmRzb3gzMi5TCmluZGV4IDI5NWYxYzcuLmY0YWEzNGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzb3gzMi5TCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzb3gzMi5TCkBAIC0xLDIxICsxLDMgQEAKLSNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vdmRzby5oPgogCi1fX1BBR0VfQUxJR05FRF9EQVRBCi0KLQkuZ2xvYmwgdmRzb3gzMl9zdGFydCwgdmRzb3gzMl9lbmQKLQkuYWxpZ24gUEFHRV9TSVpFCi12ZHNveDMyX3N0YXJ0OgotCS5pbmNiaW4gImFyY2gveDg2L3Zkc28vdmRzb3gzMi5zbyIKLXZkc294MzJfZW5kOgotCS5hbGlnbiBQQUdFX1NJWkUgLyogZXh0cmEgZGF0YSBoZXJlIGxlYWtzIHRvIHVzZXJzcGFjZS4gKi8KLQotLnByZXZpb3VzCi0KLQkuZ2xvYmwgdmRzb3gzMl9wYWdlcwotCS5ic3MKLQkuYWxpZ24gOAotCS50eXBlIHZkc294MzJfcGFnZXMsIEBvYmplY3QKLXZkc294MzJfcGFnZXM6Ci0JLnplcm8gKHZkc294MzJfZW5kIC0gdmRzb3gzMl9zdGFydCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFICogOAotCS5zaXplIHZkc294MzJfcGFnZXMsIC4tdmRzb3gzMl9wYWdlcworREVGSU5FX1ZEU09fSU1BR0UodmRzb3gzMiwgImFyY2gveDg2L3Zkc28vdmRzb3gzMi5zbyIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jIGIvYXJjaC94ODYvdmRzby92bWEuYwppbmRleCA0MzFlODc1Li4xYWQxMDI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jCisrKyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKQEAgLTE2LDIwICsxNiwyMiBAQAogI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKIHVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IHZkc29fZW5hYmxlZCA9IDE7CiAKLWV4dGVybiBjaGFyIHZkc29fc3RhcnRbXSwgdmRzb19lbmRbXTsKK0RFQ0xBUkVfVkRTT19JTUFHRSh2ZHNvKTsKIGV4dGVybiB1bnNpZ25lZCBzaG9ydCB2ZHNvX3N5bmNfY3B1aWQ7Ci0KLWV4dGVybiBzdHJ1Y3QgcGFnZSAqdmRzb19wYWdlc1tdOwogc3RhdGljIHVuc2lnbmVkIHZkc29fc2l6ZTsKIAogI2lmZGVmIENPTkZJR19YODZfWDMyX0FCSQotZXh0ZXJuIGNoYXIgdmRzb3gzMl9zdGFydFtdLCB2ZHNveDMyX2VuZFtdOwotZXh0ZXJuIHN0cnVjdCBwYWdlICp2ZHNveDMyX3BhZ2VzW107CitERUNMQVJFX1ZEU09fSU1BR0UodmRzb3gzMik7CiBzdGF0aWMgdW5zaWduZWQgdmRzb3gzMl9zaXplOworI2VuZGlmCisjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pbml0IHBhdGNoX3Zkc294MzIodm9pZCAqdmRzbywgc2l6ZV90IGxlbikKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfMzIpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9YMzJfQUJJKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQ09NUEFUKQordm9pZCBfX2luaXQgcGF0Y2hfdmRzbzMyKHZvaWQgKnZkc28sIHNpemVfdCBsZW4pCiB7CiAJRWxmMzJfRWhkciAqaGRyID0gdmRzbzsKIAlFbGYzMl9TaGRyICpzZWNoZHJzLCAqYWx0X3NlYyA9IDA7CkBAIC01Miw3ICs1NCw3IEBACiAJfQogCiAJLyogSWYgd2UgZ2V0IGhlcmUsIGl0J3MgcHJvYmFibHkgYSBidWcuICovCi0JcHJfd2FybmluZygicGF0Y2hfdmRzb3gzMjogLmFsdGluc3RydWN0aW9ucyBub3QgZm91bmRcbiIpOworCXByX3dhcm5pbmcoInBhdGNoX3Zkc28zMjogLmFsdGluc3RydWN0aW9ucyBub3QgZm91bmRcbiIpOwogCXJldHVybjsgIC8qIG5vdGhpbmcgdG8gcGF0Y2ggKi8KIAogZm91bmQ6CkBAIC02MSw2ICs2Myw3IEBACiB9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKIHN0YXRpYyB2b2lkIF9faW5pdCBwYXRjaF92ZHNvNjQodm9pZCAqdmRzbywgc2l6ZV90IGxlbikKIHsKIAlFbGY2NF9FaGRyICpoZHIgPSB2ZHNvOwpAQCAtMTA0LDcgKzEwNyw3IEBACiAJCXZkc29fcGFnZXNbaV0gPSB2aXJ0X3RvX3BhZ2UodmRzb19zdGFydCArIGkqUEFHRV9TSVpFKTsKIAogI2lmZGVmIENPTkZJR19YODZfWDMyX0FCSQotCXBhdGNoX3Zkc294MzIodmRzb3gzMl9zdGFydCwgdmRzb3gzMl9lbmQgLSB2ZHNveDMyX3N0YXJ0KTsKKwlwYXRjaF92ZHNvMzIodmRzb3gzMl9zdGFydCwgdmRzb3gzMl9lbmQgLSB2ZHNveDMyX3N0YXJ0KTsKIAlucGFnZXMgPSAodmRzb3gzMl9lbmQgLSB2ZHNveDMyX3N0YXJ0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CiAJdmRzb3gzMl9zaXplID0gbnBhZ2VzIDw8IFBBR0VfU0hJRlQ7CiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQpAQCAtMjA0LDMgKzIwNyw0IEBACiAJcmV0dXJuIDA7CiB9CiBfX3NldHVwKCJ2ZHNvPSIsIHZkc29fc2V0dXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vS2NvbmZpZyBiL2FyY2gveDg2L3hlbi9LY29uZmlnCmluZGV4IDAxYjkwMjYuLjljNTBjYzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9LY29uZmlnCisrKyBiL2FyY2gveDg2L3hlbi9LY29uZmlnCkBAIC03LDcgKzcsNyBAQAogCWRlcGVuZHMgb24gUEFSQVZJUlQKIAlzZWxlY3QgUEFSQVZJUlRfQ0xPQ0sKIAlzZWxlY3QgWEVOX0hBVkVfUFZNTVUKLQlkZXBlbmRzIG9uIFg4Nl82NCB8fCAoWDg2XzMyICYmIFg4Nl9QQUUgJiYgIVg4Nl9WSVNXUykKKwlkZXBlbmRzIG9uIFg4Nl82NCB8fCAoWDg2XzMyICYmIFg4Nl9QQUUpCiAJZGVwZW5kcyBvbiBYODZfVFNDCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgTGludXggWGVuIHBvcnQuICBFbmFibGluZyB0aGlzIHdpbGwgYWxsb3cgdGhlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggMjU2MjgyZS4uODZlMDJlYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiAvKiBBc3N1bWUgcHRldmFsX3QgaXMgZXF1aXZhbGVudCB0byBhbGwgdGhlIG90aGVyICp2YWxfdCB0eXBlcy4gKi8KIHN0YXRpYyBwdGV2YWxfdCBwdGVfbWZuX3RvX3BmbihwdGV2YWxfdCB2YWwpCiB7Ci0JaWYgKHB0ZXZhbF9wcmVzZW50KHZhbCkpIHsKKwlpZiAodmFsICYgX1BBR0VfUFJFU0VOVCkgewogCQl1bnNpZ25lZCBsb25nIG1mbiA9ICh2YWwgJiBQVEVfUEZOX01BU0spID4+IFBBR0VfU0hJRlQ7CiAJCXVuc2lnbmVkIGxvbmcgcGZuID0gbWZuX3RvX3BmbihtZm4pOwogCkBAIC0zODEsNyArMzgxLDcgQEAKIAogc3RhdGljIHB0ZXZhbF90IHB0ZV9wZm5fdG9fbWZuKHB0ZXZhbF90IHZhbCkKIHsKLQlpZiAocHRldmFsX3ByZXNlbnQodmFsKSkgeworCWlmICh2YWwgJiBfUEFHRV9QUkVTRU5UKSB7CiAJCXVuc2lnbmVkIGxvbmcgcGZuID0gKHZhbCAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKIAkJcHRldmFsX3QgZmxhZ3MgPSB2YWwgJiBQVEVfRkxBR1NfTUFTSzsKIAkJdW5zaWduZWQgbG9uZyBtZm47CkBAIC0yMDU4LDcgKzIwNTgsNiBAQAogCWNhc2UgRklYX1JPX0lEVDoKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJY2FzZSBGSVhfV1BfVEVTVDoKLQljYXNlIEZJWF9WRFNPOgogIyBpZmRlZiBDT05GSUdfSElHSE1FTQogCWNhc2UgRklYX0tNQVBfQkVHSU4gLi4uIEZJWF9LTUFQX0VORDoKICMgZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zcGlubG9jay5jIGIvYXJjaC94ODYveGVuL3NwaW5sb2NrLmMKaW5kZXggNTgxNTIxYy4uNGQzYWNjMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NwaW5sb2NrLmMKKysrIGIvYXJjaC94ODYveGVuL3NwaW5sb2NrLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0Ja3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7CisJa3N0YXRfaW5jcl9pcnFfdGhpc19jcHUoaXJxKTsKIG91dDoKIAljcHVtYXNrX2NsZWFyX2NwdShjcHUsICZ3YWl0aW5nX2NwdXMpOwogCXctPmxvY2sgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDBhMzM3ZTQuLmMzZDIwYmEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTksNiArOSw3IEBACiBnZW5lcmljLXkgKz0gZXhlYy5oCiBnZW5lcmljLXkgKz0gZmNudGwuaAogZ2VuZXJpYy15ICs9IGhhcmRpcnEuaAorZ2VuZXJpYy15ICs9IGhhc2guaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpcnFfcmVncy5oCiBnZW5lcmljLXkgKz0ga2RlYnVnLmgKQEAgLTE3LDcgKzE4LDkgQEAKIGdlbmVyaWMteSArPSBsaW5rYWdlLmgKIGdlbmVyaWMteSArPSBsb2NhbC5oCiBnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbWNzX3NwaW5sb2NrLmgKIGdlbmVyaWMteSArPSBwZXJjcHUuaAorZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCiBnZW5lcmljLXkgKz0gc2VjdGlvbnMuaApAQCAtMjcsNSArMzAsMyBAQAogZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKIGdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCiBnZW5lcmljLXkgKz0geG9yLmgKLWdlbmVyaWMteSArPSBwcmVlbXB0LmgKLWdlbmVyaWMteSArPSBoYXNoLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9pcnEuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9pcnEuYwppbmRleCA0ODI4NjhhLi4zZWVlOTRmIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL2lycS5jCkBAIC0xNTUsMTggKzE1NSw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyB2b2lkIHJvdXRlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBjcHUpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCWlmIChjaGlwLT5pcnFfc2V0X2FmZmluaXR5KQotCQljaGlwLT5pcnFfc2V0X2FmZmluaXR5KGRhdGEsIGNwdW1hc2tfb2YoY3B1KSwgZmFsc2UpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci19Ci0KIC8qCiAgKiBUaGUgQ1BVIGhhcyBiZWVuIG1hcmtlZCBvZmZsaW5lLiAgTWlncmF0ZSBJUlFzIG9mZiB0aGlzIENQVS4gIElmCiAgKiB0aGUgYWZmaW5pdHkgc2V0dGluZ3MgZG8gbm90IGFsbG93IG90aGVyIENQVXMsIGZvcmNlIHRoZW0gb250byBhbnkKQEAgLTE3NSwxMCArMTYzLDkgQEAKIHZvaWQgbWlncmF0ZV9pcnFzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGksIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAKLQlmb3JfZWFjaF9pcnFfZGVzYyhpLCBkZXNjKSB7Ci0JCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9kZXNjX2dldF9pcnFfZGF0YShkZXNjKTsKKwlmb3JfZWFjaF9hY3RpdmVfaXJxKGkpIHsKKwkJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpKTsKIAkJdW5zaWduZWQgaW50IG5ld2NwdTsKIAogCQlpZiAoaXJxZF9pc19wZXJfY3B1KGRhdGEpKQpAQCAtMTk0LDExICsxODEsOCBAQAogCQkJCQkgICAgaSwgY3B1KTsKIAogCQkJY3B1bWFza19zZXRhbGwoZGF0YS0+YWZmaW5pdHkpOwotCQkJbmV3Y3B1ID0gY3B1bWFza19hbnlfYW5kKGRhdGEtPmFmZmluaXR5LAotCQkJCQkJIGNwdV9vbmxpbmVfbWFzayk7CiAJCX0KLQotCQlyb3V0ZV9pcnEoZGF0YSwgaSwgbmV3Y3B1KTsKKwkJaXJxX3NldF9hZmZpbml0eShpLCBkYXRhLT5hZmZpbml0eSk7CiAJfQogfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jCmluZGV4IDRlNDkxZDkuLmI2ZTk1YjUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuYworKysgYi9ibG9jay9ibGstY2dyb3VwLmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCSAqIHVuZGVyIHF1ZXVlX2xvY2suICBJZiBpdCdzIG5vdCBwb2ludGluZyB0byBAYmxrZyBub3csIGl0IG5ldmVyCiAJICogd2lsbC4gIEhpbnQgYXNzaWdubWVudCBpdHNlbGYgY2FuIHJhY2Ugc2FmZWx5LgogCSAqLwotCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KGJsa2NnLT5ibGtnX2hpbnQpID09IGJsa2cpCisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihibGtjZy0+YmxrZ19oaW50KSA9PSBibGtnKQogCQlyY3VfYXNzaWduX3BvaW50ZXIoYmxrY2ctPmJsa2dfaGludCwgTlVMTCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNvcmUuYyBiL2Jsb2NrL2Jsay1jb3JlLmMKaW5kZXggODUzZjkyNy4uZTQ1YjMyMSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNvcmUuYworKysgYi9ibG9jay9ibGstY29yZS5jCkBAIC02OTMsMjAgKzY5MywxMSBAQAogCWlmICghdW5pbml0X3EpCiAJCXJldHVybiBOVUxMOwogCi0JdW5pbml0X3EtPmZsdXNoX3JxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVuaW5pdF9xLT5mbHVzaF9ycSkKLQkJZ290byBvdXRfY2xlYW51cF9xdWV1ZTsKLQogCXEgPSBibGtfaW5pdF9hbGxvY2F0ZWRfcXVldWUodW5pbml0X3EsIHJmbiwgbG9jayk7CiAJaWYgKCFxKQotCQlnb3RvIG91dF9mcmVlX2ZsdXNoX3JxOwotCXJldHVybiBxOworCQlibGtfY2xlYW51cF9xdWV1ZSh1bmluaXRfcSk7CiAKLW91dF9mcmVlX2ZsdXNoX3JxOgotCWtmcmVlKHVuaW5pdF9xLT5mbHVzaF9ycSk7Ci1vdXRfY2xlYW51cF9xdWV1ZToKLQlibGtfY2xlYW51cF9xdWV1ZSh1bmluaXRfcSk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHE7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19pbml0X3F1ZXVlX25vZGUpOwogCkBAIC03MTcsOSArNzA4LDEzIEBACiAJaWYgKCFxKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChibGtfaW5pdF9ybCgmcS0+cm9vdF9ybCwgcSwgR0ZQX0tFUk5FTCkpCisJcS0+Zmx1c2hfcnEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVxdWVzdCksIEdGUF9LRVJORUwpOworCWlmICghcS0+Zmx1c2hfcnEpCiAJCXJldHVybiBOVUxMOwogCisJaWYgKGJsa19pbml0X3JsKCZxLT5yb290X3JsLCBxLCBHRlBfS0VSTkVMKSkKKwkJZ290byBmYWlsOworCiAJcS0+cmVxdWVzdF9mbgkJPSByZm47CiAJcS0+cHJlcF9ycV9mbgkJPSBOVUxMOwogCXEtPnVucHJlcF9ycV9mbgkJPSBOVUxMOwpAQCAtNzQyLDEyICs3MzcsMTYgQEAKIAkvKiBpbml0IGVsZXZhdG9yICovCiAJaWYgKGVsZXZhdG9yX2luaXQocSwgTlVMTCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZxLT5zeXNmc19sb2NrKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAltdXRleF91bmxvY2soJnEtPnN5c2ZzX2xvY2spOwogCiAJcmV0dXJuIHE7CisKK2ZhaWw6CisJa2ZyZWUocS0+Zmx1c2hfcnEpOworCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChibGtfaW5pdF9hbGxvY2F0ZWRfcXVldWUpOwogCkBAIC0yMzU0LDcgKzIzNTMsNyBAQAogCWlmICghcmVxLT5iaW8pCiAJCXJldHVybiBmYWxzZTsKIAotCXRyYWNlX2Jsb2NrX3JxX2NvbXBsZXRlKHJlcS0+cSwgcmVxKTsKKwl0cmFjZV9ibG9ja19ycV9jb21wbGV0ZShyZXEtPnEsIHJlcSwgbnJfYnl0ZXMpOwogCiAJLyoKIAkgKiBGb3IgZnMgcmVxdWVzdHMsIHJxIGlzIGp1c3QgY2FycmllciBvZiBpbmRlcGVuZGVudCBiaW8ncwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWZsdXNoLmMgYi9ibG9jay9ibGstZmx1c2guYwppbmRleCBmNTk4Zjc5Li40M2U2YjQ3IDEwMDY0NAotLS0gYS9ibG9jay9ibGstZmx1c2guYworKysgYi9ibG9jay9ibGstZmx1c2guYwpAQCAtMTQwLDE0ICsxNDAsMTcgQEAKIAlibGtfbXFfaW5zZXJ0X3JlcXVlc3QocnEsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBib29sIGJsa19mbHVzaF9xdWV1ZV9ycShzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgYm9vbCBibGtfZmx1c2hfcXVldWVfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBib29sIGFkZF9mcm9udCkKIHsKIAlpZiAocnEtPnEtPm1xX29wcykgewogCQlJTklUX1dPUksoJnJxLT5tcV9mbHVzaF93b3JrLCBtcV9mbHVzaF9ydW4pOwogCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsocnEtPnEsICZycS0+bXFfZmx1c2hfd29yayk7CiAJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmcnEtPnEtPnF1ZXVlX2hlYWQpOworCQlpZiAoYWRkX2Zyb250KQorCQkJbGlzdF9hZGQoJnJxLT5xdWV1ZWxpc3QsICZycS0+cS0+cXVldWVfaGVhZCk7CisJCWVsc2UKKwkJCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZycS0+cS0+cXVldWVfaGVhZCk7CiAJCXJldHVybiB0cnVlOwogCX0KIH0KQEAgLTE5Myw3ICsxOTYsNyBAQAogCiAJY2FzZSBSRVFfRlNFUV9EQVRBOgogCQlsaXN0X21vdmVfdGFpbCgmcnEtPmZsdXNoLmxpc3QsICZxLT5mbHVzaF9kYXRhX2luX2ZsaWdodCk7Ci0JCXF1ZXVlZCA9IGJsa19mbHVzaF9xdWV1ZV9ycShycSk7CisJCXF1ZXVlZCA9IGJsa19mbHVzaF9xdWV1ZV9ycShycSwgdHJ1ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBSRVFfRlNFUV9ET05FOgpAQCAtMzI2LDcgKzMyOSw3IEBACiAJcS0+Zmx1c2hfcnEtPnJxX2Rpc2sgPSBmaXJzdF9ycS0+cnFfZGlzazsKIAlxLT5mbHVzaF9ycS0+ZW5kX2lvID0gZmx1c2hfZW5kX2lvOwogCi0JcmV0dXJuIGJsa19mbHVzaF9xdWV1ZV9ycShxLT5mbHVzaF9ycSk7CisJcmV0dXJuIGJsa19mbHVzaF9xdWV1ZV9ycShxLT5mbHVzaF9ycSwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCBmbHVzaF9kYXRhX2VuZF9pbyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvcikKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2MuYyBiL2Jsb2NrL2Jsay1pb2MuYwppbmRleCAyNDJkZjAxLi4xYTI3ZjQ1IDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW9jLmMKKysrIGIvYmxvY2svYmxrLWlvYy5jCkBAIC02OCw3ICs2OCw3IEBACiAJICogdW5kZXIgcXVldWVfbG9jay4gIElmIGl0J3Mgbm90IHBvaW50aW5nIHRvIEBpY3Egbm93LCBpdCBuZXZlcgogCSAqIHdpbGwuICBIaW50IGFzc2lnbm1lbnQgaXRzZWxmIGNhbiByYWNlIHNhZmVseS4KIAkgKi8KLQlpZiAocmN1X2RlcmVmZXJlbmNlX3Jhdyhpb2MtPmljcV9oaW50KSA9PSBpY3EpCisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihpb2MtPmljcV9oaW50KSA9PSBpY3EpCiAJCXJjdV9hc3NpZ25fcG9pbnRlcihpb2MtPmljcV9oaW50LCBOVUxMKTsKIAogCWlvY19leGl0X2ljcShpY3EpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvcG9sbC5jIGIvYmxvY2svYmxrLWlvcG9sbC5jCmluZGV4IDE4NTViZjUuLmMxMWQyNGUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1pb3BvbGwuYworKysgYi9ibG9jay9ibGstaW9wb2xsLmMKQEAgLTE0LDkgKzE0LDYgQEAKIAogI2luY2x1ZGUgImJsay5oIgogCi1pbnQgYmxrX2lvcG9sbF9lbmFibGVkID0gMTsKLUVYUE9SVF9TWU1CT0woYmxrX2lvcG9sbF9lbmFibGVkKTsKLQogc3RhdGljIHVuc2lnbmVkIGludCBibGtfaW9wb2xsX2J1ZGdldCBfX3JlYWRfbW9zdGx5ID0gMjU2OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgYmxrX2NwdV9pb3BvbGwpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1xLWNwdW1hcC5jIGIvYmxvY2svYmxrLW1xLWNwdW1hcC5jCmluZGV4IGY4NzIxMjcuLjA5NzkyMTMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tcS1jcHVtYXAuYworKysgYi9ibG9jay9ibGstbXEtY3B1bWFwLmMKQEAgLTksMTUgKzksNiBAQAogI2luY2x1ZGUgImJsay5oIgogI2luY2x1ZGUgImJsay1tcS5oIgogCi1zdGF0aWMgdm9pZCBzaG93X21hcCh1bnNpZ25lZCBpbnQgKm1hcCwgdW5zaWduZWQgaW50IG5yKQotewotCWludCBpOwotCi0JcHJfaW5mbygiYmxrLW1xOiBDUFUgLT4gcXVldWUgbWFwXG4iKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCi0JCXByX2luZm8oIiAgQ1BVJTJ1IC0+IFF1ZXVlICV1XG4iLCBpLCBtYXBbaV0pOwotfQotCiBzdGF0aWMgaW50IGNwdV90b19xdWV1ZV9pbmRleCh1bnNpZ25lZCBpbnQgbnJfY3B1cywgdW5zaWduZWQgaW50IG5yX3F1ZXVlcywKIAkJCSAgICAgIGNvbnN0IGludCBjcHUpCiB7CkBAIC04NSw3ICs3Niw2IEBACiAJCQltYXBbaV0gPSBtYXBbZmlyc3Rfc2libGluZ107CiAJfQogCi0Jc2hvd19tYXAobWFwLCBucl9jcHVzKTsKIAlmcmVlX2NwdW1hc2tfdmFyKGNwdXMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1xLXN5c2ZzLmMgYi9ibG9jay9ibGstbXEtc3lzZnMuYwppbmRleCBiOTFjZTc1Li5iMGJhMjY0IDEwMDY0NAotLS0gYS9ibG9jay9ibGstbXEtc3lzZnMuYworKysgYi9ibG9jay9ibGstbXEtc3lzZnMuYwpAQCAtMjQ0LDYgKzI0NCwzMiBAQAogCXJldHVybiBibGtfbXFfdGFnX3N5c2ZzX3Nob3coaGN0eC0+dGFncywgcGFnZSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGJsa19tcV9od19zeXNmc19jcHVzX3Nob3coc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIGNoYXIgKnBhZ2UpCit7CisJdW5zaWduZWQgaW50IGksIHF1ZXVlX251bSwgZmlyc3QgPSAxOworCXNzaXplX3QgcmV0ID0gMDsKKworCWJsa19tcV9kaXNhYmxlX2hvdHBsdWcoKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQlxdWV1ZV9udW0gPSBoY3R4LT5xdWV1ZS0+bXFfbWFwW2ldOworCQlpZiAocXVldWVfbnVtICE9IGhjdHgtPnF1ZXVlX251bSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChmaXJzdCkKKwkJCXJldCArPSBzcHJpbnRmKHJldCArIHBhZ2UsICIldSIsIGkpOworCQllbHNlCisJCQlyZXQgKz0gc3ByaW50ZihyZXQgKyBwYWdlLCAiLCAldSIsIGkpOworCisJCWZpcnN0ID0gMDsKKwl9CisKKwlibGtfbXFfZW5hYmxlX2hvdHBsdWcoKTsKKworCXJldCArPSBzcHJpbnRmKHJldCArIHBhZ2UsICJcbiIpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYmxrX21xX2N0eF9zeXNmc19lbnRyeSBibGtfbXFfc3lzZnNfZGlzcGF0Y2hlZCA9IHsKIAkuYXR0ciA9IHsubmFtZSA9ICJkaXNwYXRjaGVkIiwgLm1vZGUgPSBTX0lSVUdPIH0sCiAJLnNob3cgPSBibGtfbXFfc3lzZnNfZGlzcGF0Y2hlZF9zaG93LApAQCAtMjk0LDYgKzMyMCwxMCBAQAogCS5hdHRyID0gey5uYW1lID0gInRhZ3MiLCAubW9kZSA9IFNfSVJVR08gfSwKIAkuc2hvdyA9IGJsa19tcV9od19zeXNmc190YWdzX3Nob3csCiB9Oworc3RhdGljIHN0cnVjdCBibGtfbXFfaHdfY3R4X3N5c2ZzX2VudHJ5IGJsa19tcV9od19zeXNmc19jcHVzID0geworCS5hdHRyID0gey5uYW1lID0gImNwdV9saXN0IiwgLm1vZGUgPSBTX0lSVUdPIH0sCisJLnNob3cgPSBibGtfbXFfaHdfc3lzZnNfY3B1c19zaG93LAorfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRlZmF1bHRfaHdfY3R4X2F0dHJzW10gPSB7CiAJJmJsa19tcV9od19zeXNmc19xdWV1ZWQuYXR0ciwKQEAgLTMwMiw2ICszMzIsNyBAQAogCSZibGtfbXFfaHdfc3lzZnNfcGVuZGluZy5hdHRyLAogCSZibGtfbXFfaHdfc3lzZnNfaXBpLmF0dHIsCiAJJmJsa19tcV9od19zeXNmc190YWdzLmF0dHIsCisJJmJsa19tcV9od19zeXNmc19jcHVzLmF0dHIsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5jIGIvYmxvY2svYmxrLW1xLmMKaW5kZXggODgzZjcyMC4uYjFiY2M2MSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmMKKysrIGIvYmxvY2svYmxrLW1xLmMKQEAgLTMyMCw3ICszMjAsNyBAQAogCQlycS0+Y3NkLmZ1bmMgPSBfX2Jsa19tcV9jb21wbGV0ZV9yZXF1ZXN0X3JlbW90ZTsKIAkJcnEtPmNzZC5pbmZvID0gcnE7CiAJCXJxLT5jc2QuZmxhZ3MgPSAwOwotCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjdHgtPmNwdSwgJnJxLT5jc2QsIDApOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoY3R4LT5jcHUsICZycS0+Y3NkKTsKIAl9IGVsc2UgewogCQlycS0+cS0+c29mdGlycV9kb25lX2ZuKHJxKTsKIAl9CkBAIC01MTQsNyArNTE0LDcgQEAKIAlMSVNUX0hFQUQocnFfbGlzdCk7CiAJaW50IGJpdCwgcXVldWVkOwogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KEJMS19NUV9TX1NUT1BQRUQsICZoY3R4LT5mbGFncykpKQorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+c3RhdGUpKSkKIAkJcmV0dXJuOwogCiAJaGN0eC0+cnVuKys7CkBAIC02MDMsNyArNjAzLDcgQEAKIAogdm9pZCBibGtfbXFfcnVuX2h3X3F1ZXVlKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCBib29sIGFzeW5jKQogewotCWlmICh1bmxpa2VseSh0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+ZmxhZ3MpKSkKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPnN0YXRlKSkpCiAJCXJldHVybjsKIAogCWlmICghYXN5bmMpCkBAIC02MjMsNyArNjIzLDcgQEAKIAlxdWV1ZV9mb3JfZWFjaF9od19jdHgocSwgaGN0eCwgaSkgewogCQlpZiAoKCFibGtfbXFfaGN0eF9oYXNfcGVuZGluZyhoY3R4KSAmJgogCQkgICAgbGlzdF9lbXB0eV9jYXJlZnVsKCZoY3R4LT5kaXNwYXRjaCkpIHx8Ci0JCSAgICB0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+ZmxhZ3MpKQorCQkgICAgdGVzdF9iaXQoQkxLX01RX1NfU1RPUFBFRCwgJmhjdHgtPnN0YXRlKSkKIAkJCWNvbnRpbnVlOwogCiAJCWJsa19tcV9ydW5faHdfcXVldWUoaGN0eCwgYXN5bmMpOwpAQCAtOTk0LDggKzk5NCw0NiBAQAogCWJsa19tcV9wdXRfY3R4KGN0eCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJsa19tcV9pbml0X2h3X2NvbW1hbmRzKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LAotCQkJCSAgICB2b2lkICgqaW5pdCkodm9pZCAqLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLAorc3RhdGljIGludCBibGtfbXFfaW5pdF9od19jb21tYW5kcyhzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKKwkJCQkgICBpbnQgKCppbml0KSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCisJCQkJCXN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksCisJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBoY3R4LT5xdWV1ZV9kZXB0aDsgaSsrKSB7CisJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGhjdHgtPnJxc1tpXTsKKworCQlyZXQgPSBpbml0KGRhdGEsIGhjdHgsIHJxLCBpKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBibGtfbXFfaW5pdF9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCSBpbnQgKCppbml0KSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCisJCQkJCXN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksCisJCQkgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCXF1ZXVlX2Zvcl9lYWNoX2h3X2N0eChxLCBoY3R4LCBpKSB7CisJCXJldCA9IGJsa19tcV9pbml0X2h3X2NvbW1hbmRzKGhjdHgsIGluaXQsIGRhdGEpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYmxrX21xX2luaXRfY29tbWFuZHMpOworCitzdGF0aWMgdm9pZCBibGtfbXFfZnJlZV9od19jb21tYW5kcyhzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKKwkJCQkgICAgdm9pZCAoKmZyZWUpKHZvaWQgKiwgc3RydWN0IGJsa19tcV9od19jdHggKiwKIAkJCQkJc3RydWN0IHJlcXVlc3QgKiwgdW5zaWduZWQgaW50KSwKIAkJCQkgICAgdm9pZCAqZGF0YSkKIHsKQEAgLTEwMDQsMTIgKzEwNDIsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaGN0eC0+cXVldWVfZGVwdGg7IGkrKykgewogCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBoY3R4LT5ycXNbaV07CiAKLQkJaW5pdChkYXRhLCBoY3R4LCBycSwgaSk7CisJCWZyZWUoZGF0YSwgaGN0eCwgcnEsIGkpOwogCX0KIH0KIAotdm9pZCBibGtfbXFfaW5pdF9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKLQkJCSAgdm9pZCAoKmluaXQpKHZvaWQgKiwgc3RydWN0IGJsa19tcV9od19jdHggKiwKK3ZvaWQgYmxrX21xX2ZyZWVfY29tbWFuZHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkgIHZvaWQgKCpmcmVlKSh2b2lkICosIHN0cnVjdCBibGtfbXFfaHdfY3R4ICosCiAJCQkJCXN0cnVjdCByZXF1ZXN0ICosIHVuc2lnbmVkIGludCksCiAJCQkgIHZvaWQgKmRhdGEpCiB7CkBAIC0xMDE3LDkgKzEwNTUsOSBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJcXVldWVfZm9yX2VhY2hfaHdfY3R4KHEsIGhjdHgsIGkpCi0JCWJsa19tcV9pbml0X2h3X2NvbW1hbmRzKGhjdHgsIGluaXQsIGRhdGEpOworCQlibGtfbXFfZnJlZV9od19jb21tYW5kcyhoY3R4LCBmcmVlLCBkYXRhKTsKIH0KLUVYUE9SVF9TWU1CT0woYmxrX21xX2luaXRfY29tbWFuZHMpOworRVhQT1JUX1NZTUJPTChibGtfbXFfZnJlZV9jb21tYW5kcyk7CiAKIHN0YXRpYyB2b2lkIGJsa19tcV9mcmVlX3JxX21hcChzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCkKIHsKQEAgLTE0MzAsNiArMTQ2OCwxNiBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKK3ZvaWQgYmxrX21xX2Rpc2FibGVfaG90cGx1Zyh2b2lkKQoreworCW11dGV4X2xvY2soJmFsbF9xX211dGV4KTsKK30KKwordm9pZCBibGtfbXFfZW5hYmxlX2hvdHBsdWcodm9pZCkKK3sKKwltdXRleF91bmxvY2soJmFsbF9xX211dGV4KTsKK30KKwogc3RhdGljIGludCBfX2luaXQgYmxrX21xX2luaXQodm9pZCkKIHsKIAlibGtfbXFfY3B1X2luaXQoKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5oIGIvYmxvY2svYmxrLW1xLmgKaW5kZXggNzJiZWJhMS4uZWJiZTZiYSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmgKKysrIGIvYmxvY2svYmxrLW1xLmgKQEAgLTM5LDYgKzM5LDggQEAKIHZvaWQgYmxrX21xX3JlZ2lzdGVyX2NwdV9ub3RpZmllcihzdHJ1Y3QgYmxrX21xX2NwdV9ub3RpZmllciAqbm90aWZpZXIpOwogdm9pZCBibGtfbXFfdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoc3RydWN0IGJsa19tcV9jcHVfbm90aWZpZXIgKm5vdGlmaWVyKTsKIHZvaWQgYmxrX21xX2NwdV9pbml0KHZvaWQpOwordm9pZCBibGtfbXFfZW5hYmxlX2hvdHBsdWcodm9pZCk7Cit2b2lkIGJsa19tcV9kaXNhYmxlX2hvdHBsdWcodm9pZCk7CiAKIC8qCiAgKiBDUFUgLT4gcXVldWUgbWFwcGluZ3MKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMgYi9ibG9jay9ibGstc29mdGlycS5jCmluZGV4IDU3NzkwYzEuLmViZDZiNmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKKysrIGIvYmxvY2svYmxrLXNvZnRpcnEuYwpAQCAtMzAsOCArMzAsOCBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmbG9jYWxfbGlzdCkpIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJxOwogCi0JCXJxID0gbGlzdF9lbnRyeShsb2NhbF9saXN0Lm5leHQsIHN0cnVjdCByZXF1ZXN0LCBjc2QubGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJxLT5jc2QubGlzdCk7CisJCXJxID0gbGlzdF9lbnRyeShsb2NhbF9saXN0Lm5leHQsIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZycS0+cXVldWVsaXN0KTsKIAkJcnEtPnEtPnNvZnRpcnFfZG9uZV9mbihycSk7CiAJfQogfQpAQCAtNDUsOSArNDUsMTQgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlsaXN0ID0gdGhpc19jcHVfcHRyKCZibGtfY3B1X2RvbmUpOwotCWxpc3RfYWRkX3RhaWwoJnJxLT5jc2QubGlzdCwgbGlzdCk7CisJLyoKKwkgKiBXZSByZXVzZSBxdWV1ZWxpc3QgZm9yIGEgbGlzdCBvZiByZXF1ZXN0cyB0byBwcm9jZXNzLiBTaW5jZSB0aGUKKwkgKiBxdWV1ZWxpc3QgaXMgdXNlZCBieSB0aGUgYmxvY2sgbGF5ZXIgb25seSBmb3IgcmVxdWVzdHMgd2FpdGluZyB0byBiZQorCSAqIHN1Ym1pdHRlZCB0byB0aGUgZGV2aWNlIGl0IGlzIHVudXNlZCBub3cuCisJICovCisJbGlzdF9hZGRfdGFpbCgmcnEtPnF1ZXVlbGlzdCwgbGlzdCk7CiAKLQlpZiAobGlzdC0+bmV4dCA9PSAmcnEtPmNzZC5saXN0KQorCWlmIChsaXN0LT5uZXh0ID09ICZycS0+cXVldWVsaXN0KQogCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTY1LDcgKzcwLDcgQEAKIAkJZGF0YS0+aW5mbyA9IHJxOwogCQlkYXRhLT5mbGFncyA9IDA7CiAKLQkJX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBkYXRhLCAwKTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGNwdSwgZGF0YSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTM2LDcgKzE0MSw3IEBACiAJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiBkb19sb2NhbDoKIAkJbGlzdCA9IHRoaXNfY3B1X3B0cigmYmxrX2NwdV9kb25lKTsKLQkJbGlzdF9hZGRfdGFpbCgmcmVxLT5jc2QubGlzdCwgbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWVsaXN0LCBsaXN0KTsKIAogCQkvKgogCQkgKiBpZiB0aGUgbGlzdCBvbmx5IGNvbnRhaW5zIG91ciBqdXN0IGFkZGVkIHJlcXVlc3QsCkBAIC0xNDQsNyArMTQ5LDcgQEAKIAkJICogZW50cmllcyB0aGVyZSwgc29tZW9uZSBhbHJlYWR5IHJhaXNlZCB0aGUgaXJxIGJ1dCBpdAogCQkgKiBoYXNuJ3QgcnVuIHlldC4KIAkJICovCi0JCWlmIChsaXN0LT5uZXh0ID09ICZyZXEtPmNzZC5saXN0KQorCQlpZiAobGlzdC0+bmV4dCA9PSAmcmVxLT5xdWV1ZWxpc3QpCiAJCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKIAl9IGVsc2UgaWYgKHJhaXNlX2Jsa19pcnEoY2NwdSwgcmVxKSkKIAkJZ290byBkb19sb2NhbDsKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDc0NDgzM2IuLjU4NzNlNGEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMjM2NywxMCArMjM2NywxMCBAQAogCSAqIHJlcG9zaXRpb24gaW4gZmlmbyBpZiBuZXh0IGlzIG9sZGVyIHRoYW4gcnEKIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJnJxLT5xdWV1ZWxpc3QpICYmICFsaXN0X2VtcHR5KCZuZXh0LT5xdWV1ZWxpc3QpICYmCi0JICAgIHRpbWVfYmVmb3JlKHJxX2ZpZm9fdGltZShuZXh0KSwgcnFfZmlmb190aW1lKHJxKSkgJiYKKwkgICAgdGltZV9iZWZvcmUobmV4dC0+Zmlmb190aW1lLCBycS0+Zmlmb190aW1lKSAmJgogCSAgICBjZnFxID09IFJRX0NGUVEobmV4dCkpIHsKIAkJbGlzdF9tb3ZlKCZycS0+cXVldWVsaXN0LCAmbmV4dC0+cXVldWVsaXN0KTsKLQkJcnFfc2V0X2ZpZm9fdGltZShycSwgcnFfZmlmb190aW1lKG5leHQpKTsKKwkJcnEtPmZpZm9fdGltZSA9IG5leHQtPmZpZm9fdGltZTsKIAl9CiAKIAlpZiAoY2ZxcS0+bmV4dF9ycSA9PSBuZXh0KQpAQCAtMjgxNCw3ICsyODE0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlycSA9IHJxX2VudHJ5X2ZpZm8oY2ZxcS0+Zmlmby5uZXh0KTsKLQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcnFfZmlmb190aW1lKHJxKSkpCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJxLT5maWZvX3RpbWUpKQogCQlycSA9IE5VTEw7CiAKIAljZnFfbG9nX2NmcXEoY2ZxcS0+Y2ZxZCwgY2ZxcSwgImZpZm89JXAiLCBycSk7CkBAIC0zOTI3LDcgKzM5MjcsNyBAQAogCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiaW5zZXJ0X3JlcXVlc3QiKTsKIAljZnFfaW5pdF9wcmlvX2RhdGEoY2ZxcSwgUlFfQ0lDKHJxKSk7CiAKLQlycV9zZXRfZmlmb190aW1lKHJxLCBqaWZmaWVzICsgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlW3JxX2lzX3N5bmMocnEpXSk7CisJcnEtPmZpZm9fdGltZSA9IGppZmZpZXMgKyBjZnFkLT5jZnFfZmlmb19leHBpcmVbcnFfaXNfc3luYyhycSldOwogCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZjZnFxLT5maWZvKTsKIAljZnFfYWRkX3JxX3JiKHJxKTsKIAljZnFnX3N0YXRzX3VwZGF0ZV9pb19hZGQoUlFfQ0ZRRyhycSksIGNmcWQtPnNlcnZpbmdfZ3JvdXAsCmRpZmYgLS1naXQgYS9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKaW5kZXggOWVmNjY0MC4uYTc1M2RmMiAxMDA2NDQKLS0tIGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJLyoKIAkgKiBzZXQgZXhwaXJlIHRpbWUgYW5kIGFkZCB0byBmaWZvIGxpc3QKIAkgKi8KLQlycV9zZXRfZmlmb190aW1lKHJxLCBqaWZmaWVzICsgZGQtPmZpZm9fZXhwaXJlW2RhdGFfZGlyXSk7CisJcnEtPmZpZm9fdGltZSA9IGppZmZpZXMgKyBkZC0+Zmlmb19leHBpcmVbZGF0YV9kaXJdOwogCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZkZC0+Zmlmb19saXN0W2RhdGFfZGlyXSk7CiB9CiAKQEAgLTE3NCw5ICsxNzQsOSBAQAogCSAqIGFuZCBtb3ZlIGludG8gbmV4dCBwb3NpdGlvbiAobmV4dCB3aWxsIGJlIGRlbGV0ZWQpIGluIGZpZm8KIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJnJlcS0+cXVldWVsaXN0KSAmJiAhbGlzdF9lbXB0eSgmbmV4dC0+cXVldWVsaXN0KSkgewotCQlpZiAodGltZV9iZWZvcmUocnFfZmlmb190aW1lKG5leHQpLCBycV9maWZvX3RpbWUocmVxKSkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKG5leHQtPmZpZm9fdGltZSwgcmVxLT5maWZvX3RpbWUpKSB7CiAJCQlsaXN0X21vdmUoJnJlcS0+cXVldWVsaXN0LCAmbmV4dC0+cXVldWVsaXN0KTsKLQkJCXJxX3NldF9maWZvX3RpbWUocmVxLCBycV9maWZvX3RpbWUobmV4dCkpOworCQkJcmVxLT5maWZvX3RpbWUgPSBuZXh0LT5maWZvX3RpbWU7CiAJCX0KIAl9CiAKQEAgLTIzMCw3ICsyMzAsNyBAQAogCS8qCiAJICogcnEgaXMgZXhwaXJlZCEKIAkgKi8KLQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBycV9maWZvX3RpbWUocnEpKSkKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBycS0+Zmlmb190aW1lKSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2Jsb2NrL3BhcnRpdGlvbnMvYXRhcmkuaCBiL2Jsb2NrL3BhcnRpdGlvbnMvYXRhcmkuaAppbmRleCBmZTJkMzJhLi5mMmVjNDNiIDEwMDY0NAotLS0gYS9ibG9jay9wYXJ0aXRpb25zL2F0YXJpLmgKKysrIGIvYmxvY2svcGFydGl0aW9ucy9hdGFyaS5oCkBAIC0xMSw2ICsxMSw4IEBACiAgKiBieSBHdWVudGhlciBLZWxsZXRlciAoZ3VlbnRoZXJAcG9vbC5pbmZvcm1hdGlrLnJ3dGgtYWFjaGVuLmRlKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiBzdHJ1Y3QgcGFydGl0aW9uX2luZm8KIHsKICAgdTggZmxnOwkJCS8qIGJpdCAwOiBhY3RpdmU7IGJpdCA3OiBib290YWJsZSAqLwpAQCAtMjksNiArMzEsNiBAQAogICB1MzIgYnNsX3N0OwkJCS8qIHN0YXJ0IG9mIGJhZCBzZWN0b3IgbGlzdCAqLwogICB1MzIgYnNsX2NudDsJCQkvKiBsZW5ndGggb2YgYmFkIHNlY3RvciBsaXN0ICovCiAgIHUxNiBjaGVja3N1bTsJCQkvKiBjaGVja3N1bSBmb3IgYm9vdGFibGUgZGlza3MgKi8KLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworfSBfX3BhY2tlZDsKIAogaW50IGF0YXJpX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL3BhcnRpdGlvbnMvZWZpLmggYi9ibG9jay9wYXJ0aXRpb25zL2VmaS5oCmluZGV4IDRlZmNhZmIuLmFiZDBiMTkyIDEwMDY0NAotLS0gYS9ibG9jay9wYXJ0aXRpb25zL2VmaS5oCisrKyBiL2Jsb2NrL3BhcnRpdGlvbnMvZWZpLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKICNkZWZpbmUgTVNET1NfTUJSX1NJR05BVFVSRSAweGFhNTUKICNkZWZpbmUgRUZJX1BNQlJfT1NUWVBFX0VGSSAweEVGCkBAIC04NywxMyArODgsMTMgQEAKIAkgKgogCSAqIHVpbnQ4X3QJCXJlc2VydmVkMlsgQmxvY2tTaXplIC0gOTIgXTsKIAkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGdwdF9oZWFkZXI7Cit9IF9fcGFja2VkIGdwdF9oZWFkZXI7CiAKIHR5cGVkZWYgc3RydWN0IF9ncHRfZW50cnlfYXR0cmlidXRlcyB7CiAJdTY0IHJlcXVpcmVkX3RvX2Z1bmN0aW9uOjE7CiAJdTY0IHJlc2VydmVkOjQ3OwogICAgICAgICB1NjQgdHlwZV9ndWlkX3NwZWNpZmljOjE2OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZ3B0X2VudHJ5X2F0dHJpYnV0ZXM7Cit9IF9fcGFja2VkIGdwdF9lbnRyeV9hdHRyaWJ1dGVzOwogCiB0eXBlZGVmIHN0cnVjdCBfZ3B0X2VudHJ5IHsKIAllZmlfZ3VpZF90IHBhcnRpdGlvbl90eXBlX2d1aWQ7CkBAIC0xMDIsNyArMTAzLDcgQEAKIAlfX2xlNjQgZW5kaW5nX2xiYTsKIAlncHRfZW50cnlfYXR0cmlidXRlcyBhdHRyaWJ1dGVzOwogCWVmaV9jaGFyMTZfdCBwYXJ0aXRpb25fbmFtZVs3MiAvIHNpemVvZiAoZWZpX2NoYXIxNl90KV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBncHRfZW50cnk7Cit9IF9fcGFja2VkIGdwdF9lbnRyeTsKIAogdHlwZWRlZiBzdHJ1Y3QgX2dwdF9tYnJfcmVjb3JkIHsKIAl1OAlib290X2luZGljYXRvcjsgLyogdW51c2VkIGJ5IEVGSSwgc2V0IHRvIDB4ODAgZm9yIGJvb3RhYmxlICovCkBAIC0xMjQsNyArMTI1LDcgQEAKIAlfX2xlMTYgdW5rbm93bjsKIAlncHRfbWJyX3JlY29yZCBwYXJ0aXRpb25fcmVjb3JkWzRdOwogCV9fbGUxNiBzaWduYXR1cmU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsZWdhY3lfbWJyOworfSBfX3BhY2tlZCBsZWdhY3lfbWJyOwogCiAvKiBGdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgZWZpX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL3BhcnRpdGlvbnMva2FybWEuYyBiL2Jsb2NrL3BhcnRpdGlvbnMva2FybWEuYwppbmRleCAwZWExOTMxLi45NzIxZmE1IDEwMDY0NAotLS0gYS9ibG9jay9wYXJ0aXRpb25zL2thcm1hLmMKKysrIGIvYmxvY2svcGFydGl0aW9ucy9rYXJtYS5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSAiY2hlY2suaCIKICNpbmNsdWRlICJrYXJtYS5oIgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKIGludCBrYXJtYV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSkKIHsKQEAgLTI2LDcgKzI3LDcgQEAKIAkJfSBkX3BhcnRpdGlvbnNbMl07CiAJCXU4IGRfYmxhbmtbMjA4XTsKIAkJX19sZTE2IGRfbWFnaWM7Ci0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqbGFiZWw7CisJfSBfX3BhY2tlZCAqbGFiZWw7CiAJc3RydWN0IGRfcGFydGl0aW9uICpwOwogCiAJZGF0YSA9IHJlYWRfcGFydF9zZWN0b3Ioc3RhdGUsIDAsICZzZWN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCBiMzEzOGZiLi4wYTBhOTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC01Miw2ICs1Miw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zcGkvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3NwbWkvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL2hzaS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcHBzL0tjb25maWciCkBAIC0xNzAsNCArMTcyLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3Bvd2VyY2FwL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tY2IvS2NvbmZpZyIKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggOGUzYjhiMC4uZTNjZWQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC02Niw2ICs2Niw3IEBACiBvYmotJChDT05GSUdfVEFSR0VUX0NPUkUpCSs9IHRhcmdldC8KIG9iai0kKENPTkZJR19NVEQpCQkrPSBtdGQvCiBvYmotJChDT05GSUdfU1BJKQkJKz0gc3BpLworb2JqLSQoQ09ORklHX1NQTUkpCQkrPSBzcG1pLwogb2JqLXkJCQkJKz0gaHNpLwogb2JqLXkJCQkJKz0gbmV0Lwogb2JqLSQoQ09ORklHX0FUTSkJCSs9IGF0bS8KQEAgLTE1NSwzICsxNTYsNCBAQAogb2JqLSQoQ09ORklHX05UQikJCSs9IG50Yi8KIG9iai0kKENPTkZJR19GTUMpCQkrPSBmbWMvCiBvYmotJChDT05GSUdfUE9XRVJDQVApCQkrPSBwb3dlcmNhcC8KK29iai0kKENPTkZJR19NQ0IpCQkrPSBtY2IvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbnVtYS5jIGIvZHJpdmVycy9hY3BpL251bWEuYwppbmRleCA5ZTY4MTZlLi4yNGI1NDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbnVtYS5jCisrKyBiL2RyaXZlcnMvYWNwaS9udW1hLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlyZXR1cm4gbm9kZV90b19weG1fbWFwW25vZGVdOwogfQogCi12b2lkIF9fYWNwaV9tYXBfcHhtX3RvX25vZGUoaW50IHB4bSwgaW50IG5vZGUpCitzdGF0aWMgdm9pZCBfX2FjcGlfbWFwX3B4bV90b19ub2RlKGludCBweG0sIGludCBub2RlKQogewogCWlmIChweG1fdG9fbm9kZV9tYXBbcHhtXSA9PSBOVU1BX05PX05PREUgfHwgbm9kZSA8IHB4bV90b19ub2RlX21hcFtweG1dKQogCQlweG1fdG9fbm9kZV9tYXBbcHhtXSA9IG5vZGU7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2luaXQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKQordm9pZCBfX2luaXQgX193ZWFrCiBhY3BpX251bWFfeDJhcGljX2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfc3JhdF94MmFwaWNfY3B1X2FmZmluaXR5ICpwYSkKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWApAQCAtMzE0LDcgKzMxNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhY3BpX2dldF9weG0oYWNwaV9oYW5kbGUgaCkKK3N0YXRpYyBpbnQgYWNwaV9nZXRfcHhtKGFjcGlfaGFuZGxlIGgpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIHB4bTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC0zMzEsMTQgKzMzMSwxNCBAQAogCXJldHVybiAtMTsKIH0KIAotaW50IGFjcGlfZ2V0X25vZGUoYWNwaV9oYW5kbGUgKmhhbmRsZSkKK2ludCBhY3BpX2dldF9ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlpbnQgcHhtLCBub2RlID0gTlVNQV9OT19OT0RFOworCWludCBweG07CiAKIAlweG0gPSBhY3BpX2dldF9weG0oaGFuZGxlKTsKLQlpZiAocHhtID49IDAgJiYgcHhtIDwgTUFYX1BYTV9ET01BSU5TKQotCQlub2RlID0gYWNwaV9tYXBfcHhtX3RvX25vZGUocHhtKTsKKwlpZiAocHhtIDwgMCB8fCBweG0gPj0gTUFYX1BYTV9ET01BSU5TKQorCQlyZXR1cm4gTlVNQV9OT19OT0RFOwogCi0JcmV0dXJuIG5vZGU7CisJcmV0dXJuIGFjcGlfbWFwX3B4bV90b19ub2RlKHB4bSk7CiB9CiBFWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvS2NvbmZpZyBiL2RyaXZlcnMvYXRhL0tjb25maWcKaW5kZXggODY4NDI5YS4uMjBlMDNhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2F0YS9LY29uZmlnCkBAIC0xMSwxMyArMTEsMTMgQEAKIAkgIHRvIHVwZGF0ZSB0aGUgUEFUQV9QTEFURk9STSBlbnRyeS4KIAogbWVudWNvbmZpZyBBVEEKLQl0cmlzdGF0ZSAiU2VyaWFsIEFUQSBhbmQgUGFyYWxsZWwgQVRBIGRyaXZlcnMiCisJdHJpc3RhdGUgIlNlcmlhbCBBVEEgYW5kIFBhcmFsbGVsIEFUQSBkcml2ZXJzIChsaWJhdGEpIgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJZGVwZW5kcyBvbiBCTE9DSwogCWRlcGVuZHMgb24gIShNMzJSIHx8IE02OEsgfHwgUzM5MCkgfHwgQlJPS0VOCiAJc2VsZWN0IFNDU0kKIAktLS1oZWxwLS0tCi0JICBJZiB5b3Ugd2FudCB0byB1c2UgYSBBVEEgaGFyZCBkaXNrLCBBVEEgdGFwZSBkcml2ZSwgQVRBIENELVJPTSBvcgorCSAgSWYgeW91IHdhbnQgdG8gdXNlIGFuIEFUQSBoYXJkIGRpc2ssIEFUQSB0YXBlIGRyaXZlLCBBVEEgQ0QtUk9NIG9yCiAJICBhbnkgb3RoZXIgQVRBIGRldmljZSB1bmRlciBMaW51eCwgc2F5IFkgYW5kIG1ha2Ugc3VyZSB0aGF0IHlvdSBrbm93CiAJICB0aGUgbmFtZSBvZiB5b3VyIEFUQSBob3N0IGFkYXB0ZXIgKHRoZSBjYXJkIGluc2lkZSB5b3VyIGNvbXB1dGVyCiAJICB0aGF0ICJzcGVha3MiIHRoZSBBVEEgcHJvdG9jb2wsIGFsc28gY2FsbGVkIEFUQSBjb250cm9sbGVyKSwKQEAgLTYwLDcgKzYwLDcgQEAKIAogY29uZmlnIFNBVEFfWlBPREQKIAlib29sICJTQVRBIFplcm8gUG93ZXIgT3B0aWNhbCBEaXNjIERyaXZlIChaUE9ERCkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQV9BQ1BJCisJZGVwZW5kcyBvbiBBVEFfQUNQSSAmJiBQTV9SVU5USU1FCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBTQVRBIFplcm8gUG93ZXIgT3B0aWNhbCBEaXNjCkBAIC05NywxNSArOTcsNDggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEFIQ0lfREE4NTAKKwl0cmlzdGF0ZSAiRGFWaW5jaSBEQTg1MCBBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9EQTg1MAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIERhVmluY2kgREE4NTAgU29DJ3MKKwkgIG9uYm9hcmQgQUhDSSBTQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUhDSV9TVAorCXRyaXN0YXRlICJTVCBBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1RJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBTVCBBSENJIFNBVEEgY29udHJvbGxlci4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIEFIQ0lfSU1YCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBpLk1YIEFIQ0kgU0FUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0FUQV9BSENJX1BMQVRGT1JNICYmIE1GRF9TWVNDT04KKwlkZXBlbmRzIG9uIE1GRF9TWVNDT04KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgaS5NWCBTb0MncwogCSAgb25ib2FyZCBBSENJIFNBVEEuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBBSENJX1NVTlhJCisJdHJpc3RhdGUgIkFsbHdpbm5lciBzdW54aSBBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgc3VueGkgU29DJ3MKKwkgIG9uYm9hcmQgQUhDSSBTQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQUhDSV9YR0VORQorCXRyaXN0YXRlICJBUE0gWC1HZW5lIDYuMEdicHMgQUhDSSBTQVRBIGhvc3QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJNNjQgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IFBIWV9YR0VORQorCWhlbHAKKwkgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBBUE0gWC1HZW5lIFNvQyBTQVRBIGhvc3QgY29udHJvbGxlci4KKwogY29uZmlnIFNBVEFfRlNMCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSAzLjBHYnBzIFNBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZTTF9TT0MKQEAgLTIzOSw2ICsyNzIsNyBAQAogCiBjb25maWcgU0FUQV9ISUdIQkFOSwogCXRyaXN0YXRlICJDYWx4ZWRhIEhpZ2hiYW5rIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfSElHSEJBTksgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQ2FseGVkYSBIaWdoYmFuayBTb0MncwogCSAgb25ib2FyZCBTQVRBLgpAQCAtMjQ3LDYgKzI4MSw4IEBACiAKIGNvbmZpZyBTQVRBX01WCiAJdHJpc3RhdGUgIk1hcnZlbGwgU0FUQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJIHx8IEFSQ0hfRE9WRSB8fCBBUkNIX0tJUktXT09EIHx8IEFSQ0hfTVY3OFhYMCB8fCBcCisJCSAgIEFSQ0hfTVZFQlUgfHwgQVJDSF9PUklPTjVYIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBHRU5FUklDX1BIWQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgU2VyaWFsIEFUQSBmYW1pbHkuCkBAIC0yNzMsNiArMzA5LDcgQEAKIAogY29uZmlnIFNBVEFfUkNBUgogCXRyaXN0YXRlICJSZW5lc2FzIFItQ2FyIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU0hNT0JJTEUgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBSZW5lc2FzIFItQ2FyIFNlcmlhbCBBVEEuCiAKQEAgLTM1Miw2ICszODksNyBAQAogCiBjb25maWcgUEFUQV9BUkFTQU5fQ0YKIAl0cmlzdGF0ZSAiQVJBU0FOIENvbXBhY3RGbGFzaCBQQVRBIENvbnRyb2xsZXIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1BFQVIxM1hYIHx8IENPTVBJTEVfVEVTVAogCWRlcGVuZHMgb24gRE1BREVWSUNFUwogCXNlbGVjdCBETUFfRU5HSU5FCiAJaGVscApAQCAtNDAzLDcgKzQ0MSw3IEBACiAKIGNvbmZpZyBQQVRBX0NTNTUyMAogCXRyaXN0YXRlICJDUzU1MTAvNTUyMCBQQVRBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDeXJpeCA1NTEwLzU1MjAKIAkgIGNvbXBhbmlvbiBjaGlwIHVzZWQgd2l0aCB0aGUgTWVkaWFHWC9HZW9kZSBwcm9jZXNzb3IgZmFtaWx5LgpAQCAtNDEyLDcgKzQ1MCw3IEBACiAKIGNvbmZpZyBQQVRBX0NTNTUzMAogCXRyaXN0YXRlICJDUzU1MzAgUEFUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBDT01QSUxFX1RFU1QpCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQ3lyaXgvTmF0U2VtaS9BTUQgQ1M1NTMwCiAJICBjb21wYW5pb24gY2hpcCB1c2VkIHdpdGggdGhlIE1lZGlhR1gvR2VvZGUgcHJvY2Vzc29yIGZhbWlseS4KQEAgLTQyMSw3ICs0NTksNyBAQAogCiBjb25maWcgUEFUQV9DUzU1MzUKIAl0cmlzdGF0ZSAiQ1M1NTM1IFBBVEEgc3VwcG9ydCAoRXhwZXJpbWVudGFsKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgIVg4Nl82NAorCWRlcGVuZHMgb24gUENJICYmIFg4Nl8zMgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE5hdFNlbWkvQU1EIENTNTUzNQogCSAgY29tcGFuaW9uIGNoaXAgdXNlZCB3aXRoIHRoZSBHZW9kZSBwcm9jZXNzb3IgZmFtaWx5LgpAQCAtNDMwLDcgKzQ2OCw3IEBACiAKIGNvbmZpZyBQQVRBX0NTNTUzNgogCXRyaXN0YXRlICJDUzU1MzYgUEFUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBNSVBTIHx8IENPTVBJTEVfVEVTVCkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBTUQgQ1M1NTM2CiAJICBjb21wYW5pb24gY2hpcCB1c2VkIHdpdGggdGhlIEdlb2RlIExYIHByb2Nlc3NvciBmYW1pbHkuCkBAIC02NjYsNyArNzA0LDcgQEAKIAogY29uZmlnIFBBVEFfU0MxMjAwCiAJdHJpc3RhdGUgIlNDMTIwMCBQQVRBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBOYXRTZW1pL0FNRCBTQzEyMDAgU29DCiAJICBjb21wYW5pb24gY2hpcCB1c2VkIHdpdGggdGhlIEdlb2RlIHByb2Nlc3NvciBmYW1pbHkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9NYWtlZmlsZSBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCmluZGV4IDQ2NTE4YzYuLjQ0YzgwMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCkBAIC00LDEzICs0LDE3IEBACiAjIG5vbi1TRkYgaW50ZXJmYWNlCiBvYmotJChDT05GSUdfU0FUQV9BSENJKQkJKz0gYWhjaS5vIGxpYmFoY2kubwogb2JqLSQoQ09ORklHX1NBVEFfQUNBUkRfQUhDSSkJKz0gYWNhcmQtYWhjaS5vIGxpYmFoY2kubwotb2JqLSQoQ09ORklHX1NBVEFfQUhDSV9QTEFURk9STSkgKz0gYWhjaV9wbGF0Zm9ybS5vIGxpYmFoY2kubworb2JqLSQoQ09ORklHX1NBVEFfQUhDSV9QTEFURk9STSkgKz0gYWhjaV9wbGF0Zm9ybS5vIGxpYmFoY2kubyBsaWJhaGNpX3BsYXRmb3JtLm8KIG9iai0kKENPTkZJR19TQVRBX0ZTTCkJCSs9IHNhdGFfZnNsLm8KIG9iai0kKENPTkZJR19TQVRBX0lOSUMxNjJYKQkrPSBzYXRhX2luaWMxNjJ4Lm8KIG9iai0kKENPTkZJR19TQVRBX1NJTDI0KQkrPSBzYXRhX3NpbDI0Lm8KIG9iai0kKENPTkZJR19TQVRBX0RXQykJCSs9IHNhdGFfZHdjXzQ2MGV4Lm8KIG9iai0kKENPTkZJR19TQVRBX0hJR0hCQU5LKQkrPSBzYXRhX2hpZ2hiYW5rLm8gbGliYWhjaS5vCi1vYmotJChDT05GSUdfQUhDSV9JTVgpCQkrPSBhaGNpX2lteC5vCitvYmotJChDT05GSUdfQUhDSV9EQTg1MCkJKz0gYWhjaV9kYTg1MC5vIGxpYmFoY2kubyBsaWJhaGNpX3BsYXRmb3JtLm8KK29iai0kKENPTkZJR19BSENJX0lNWCkJCSs9IGFoY2lfaW14Lm8gbGliYWhjaS5vIGxpYmFoY2lfcGxhdGZvcm0ubworb2JqLSQoQ09ORklHX0FIQ0lfU1VOWEkpCSs9IGFoY2lfc3VueGkubyBsaWJhaGNpLm8gbGliYWhjaV9wbGF0Zm9ybS5vCitvYmotJChDT05GSUdfQUhDSV9TVCkJCSs9IGFoY2lfc3QubyBsaWJhaGNpLm8gbGliYWhjaV9wbGF0Zm9ybS5vCitvYmotJChDT05GSUdfQUhDSV9YR0VORSkJKz0gYWhjaV94Z2VuZS5vIGxpYmFoY2kubyBsaWJhaGNpX3BsYXRmb3JtLm8KIAogIyBTRkYgdy8gY3VzdG9tIERNQQogb2JqLSQoQ09ORklHX1BEQ19BRE1BKQkJKz0gcGRjX2FkbWEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jIGIvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jCmluZGV4IGZkNjY1ZDkuLmI1MTYwNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FjYXJkLWFoY2kuYworKysgYi9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2kuYyBiL2RyaXZlcnMvYXRhL2FoY2kuYwppbmRleCBjODFkODA5Li41YTBiZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaS5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC01NzgsNiArNTc3LDcgQEAKIAkJCQkgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJYm9vbCBvbmxpbmU7CiAJaW50IHJjOwogCkBAIC01ODgsNyArNTg4LDcgQEAKIAlyYyA9IHNhdGFfbGlua19oYXJkcmVzZXQobGluaywgc2F0YV9laGNfZGViX3RpbWluZygmbGluay0+ZWhfY29udGV4dCksCiAJCQkJIGRlYWRsaW5lLCAmb25saW5lLCBOVUxMKTsKIAotCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKKwlocHJpdi0+c3RhcnRfZW5naW5lKGFwKTsKIAogCURQUklOVEsoIkVYSVQsIHJjPSVkLCBjbGFzcz0ldVxuIiwgcmMsICpjbGFzcyk7CiAKQEAgLTYwMyw2ICs2MDMsNyBAQAogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl1OCAqZDJoX2ZpcyA9IHBwLT5yeF9maXMgKyBSWF9GSVNfRDJIX1JFRzsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCWJvb2wgb25saW5lOwpAQCAtNjE4LDcgKzYxOSw3IEBACiAJcmMgPSBzYXRhX2xpbmtfaGFyZHJlc2V0KGxpbmssIHNhdGFfZWhjX2RlYl90aW1pbmcoJmxpbmstPmVoX2NvbnRleHQpLAogCQkJCSBkZWFkbGluZSwgJm9ubGluZSwgTlVMTCk7CiAKLQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CiAKIAkvKiBUaGUgcHNldWRvIGNvbmZpZ3VyYXRpb24gZGV2aWNlIG9uIFNJTUc0NzI2IGF0dGFjaGVkIHRvCiAJICogQVNVUyBQNVctREggRGVsdXhlIGRvZXNuJ3Qgc2VuZCBzaWduYXR1cmUgRklTIGFmdGVyCkBAIC0xMTY1LDEzICsxMTY2LDEzIEBACiBzdGF0aWMgaW50IGFoY2lfaW5pdF9pbnRlcnJ1cHRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgbl9wb3J0cywKIAkJCSBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQogewotCWludCByYywgbnZlYzsKKwlpbnQgbnZlYzsKIAogCWlmIChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX01TSSkKIAkJZ290byBpbnR4OwogCi0JcmMgPSBwY2lfbXNpX3ZlY19jb3VudChwZGV2KTsKLQlpZiAocmMgPCAwKQorCW52ZWMgPSBwY2lfbXNpX3ZlY19jb3VudChwZGV2KTsKKwlpZiAobnZlYyA8IDApCiAJCWdvdG8gaW50eDsKIAogCS8qCkBAIC0xMTc5LDIxICsxMTgwLDE5IEBACiAJICogTWVzc2FnZSBtb2RlIGNvdWxkIGJlIGVuZm9yY2VkLiBJbiB0aGlzIGNhc2UgYXNzdW1lIHRoYXQgYWR2YW50YWdlCiAJICogb2YgbXVsdGlwZSBNU0lzIGlzIG5lZ2F0ZWQgYW5kIHVzZSBzaW5nbGUgTVNJIG1vZGUgaW5zdGVhZC4KIAkgKi8KLQlpZiAocmMgPCBuX3BvcnRzKQorCWlmIChudmVjIDwgbl9wb3J0cykKIAkJZ290byBzaW5nbGVfbXNpOwogCi0JbnZlYyA9IHJjOwotCXJjID0gcGNpX2VuYWJsZV9tc2lfYmxvY2socGRldiwgbnZlYyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbnR4OwotCWVsc2UgaWYgKHJjID4gMCkKKwludmVjID0gcGNpX2VuYWJsZV9tc2lfcmFuZ2UocGRldiwgbnZlYywgbnZlYyk7CisJaWYgKG52ZWMgPT0gLUVOT1NQQykKIAkJZ290byBzaW5nbGVfbXNpOworCWVsc2UgaWYgKG52ZWMgPCAwKQorCQlnb3RvIGludHg7CiAKIAlyZXR1cm4gbnZlYzsKIAogc2luZ2xlX21zaToKLQlyYyA9IHBjaV9lbmFibGVfbXNpKHBkZXYpOwotCWlmIChyYykKKwlpZiAocGNpX2VuYWJsZV9tc2kocGRldikpCiAJCWdvdG8gaW50eDsKIAlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5oIGIvZHJpdmVycy9hdGEvYWhjaS5oCmluZGV4IDIyODllZmQuLjUxYWYyNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuaAorKysgYi9kcml2ZXJzL2F0YS9haGNpLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KIAogLyogRW5jbG9zdXJlIE1hbmFnZW1lbnQgQ29udHJvbCAqLwogI2RlZmluZSBFTV9DVFJMX01TR19UWVBFICAgICAgICAgICAgICAweDAwMGYwMDAwCkBAIC01MSw2ICs1Myw3IEBACiAKIGVudW0gewogCUFIQ0lfTUFYX1BPUlRTCQk9IDMyLAorCUFIQ0lfTUFYX0NMS1MJCT0gMywKIAlBSENJX01BWF9TRwkJPSAxNjgsIC8qIGhhcmR3YXJlIG1heCBpcyA2NEsgKi8KIAlBSENJX0RNQV9CT1VOREFSWQk9IDB4ZmZmZmZmZmYsCiAJQUhDSV9NQVhfQ01EUwkJPSAzMiwKQEAgLTMyMSw4ICszMjQsMTcgQEAKIAl1MzIgCQkJZW1fbG9jOyAvKiBlbmNsb3N1cmUgbWFuYWdlbWVudCBsb2NhdGlvbiAqLwogCXUzMgkJCWVtX2J1Zl9zejsJLyogRU0gYnVmZmVyIHNpemUgaW4gYnl0ZSAqLwogCXUzMgkJCWVtX21zZ190eXBlOwkvKiBFTSBtZXNzYWdlIHR5cGUgKi8KLQlzdHJ1Y3QgY2xrCQkqY2xrOwkJLyogT25seSBmb3IgcGxhdGZvcm1zIHN1cHBvcnRpbmcgY2xrICovCisJYm9vbAkJCWdvdF9ydW50aW1lX3BtOyAvKiBEaWQgd2UgZG8gcG1fcnVudGltZV9nZXQ/ICovCisJc3RydWN0IGNsawkJKmNsa3NbQUhDSV9NQVhfQ0xLU107IC8qIE9wdGlvbmFsICovCisJc3RydWN0IHJlZ3VsYXRvcgkqdGFyZ2V0X3B3cjsJLyogT3B0aW9uYWwgKi8KKwlzdHJ1Y3QgcGh5CQkqcGh5OwkJLyogSWYgcGxhdGZvcm0gdXNlcyBwaHkgKi8KIAl2b2lkCQkJKnBsYXRfZGF0YTsJLyogT3RoZXIgcGxhdGZvcm0gZGF0YSAqLworCS8qCisJICogT3B0aW9uYWwgYWhjaV9zdGFydF9lbmdpbmUgb3ZlcnJpZGUsIGlmIG5vdCBzZXQgdGhpcyBnZXRzIHNldCB0byB0aGUKKwkgKiBkZWZhdWx0IGFoY2lfc3RhcnRfZW5naW5lIGR1cmluZyBhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcsIHRoaXMgY2FuCisJICogYmUgb3ZlcnJpZGRlbiBhbnl0aW1lIGJlZm9yZSB0aGUgaG9zdCBpcyBhY3RpdmF0ZWQuCisJICovCisJdm9pZAkJCSgqc3RhcnRfZW5naW5lKShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIH07CiAKIGV4dGVybiBpbnQgYWhjaV9pZ25vcmVfc3NzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaV9kYTg1MC5jIGIvZHJpdmVycy9hdGEvYWhjaV9kYTg1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODM2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9haGNpX2RhODUwLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBEYVZpbmNpIERBODUwIEFIQ0kgU0FUQSBwbGF0Zm9ybSBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L2FoY2lfcGxhdGZvcm0uaD4KKyNpbmNsdWRlICJhaGNpLmgiCisKKy8qIFNBVEEgUEhZIENvbnRyb2wgUmVnaXN0ZXIgb2Zmc2V0IGZyb20gQUhDSSBiYXNlICovCisjZGVmaW5lIFNBVEFfUDBQSFlDUl9SRUcJMHgxNzgKKworI2RlZmluZSBTQVRBX1BIWV9NUFkoeCkJCSgoeCkgPDwgMCkKKyNkZWZpbmUgU0FUQV9QSFlfTE9TKHgpCQkoKHgpIDw8IDYpCisjZGVmaW5lIFNBVEFfUEhZX1JYQ0RSKHgpCSgoeCkgPDwgMTApCisjZGVmaW5lIFNBVEFfUEhZX1JYRVEoeCkJKCh4KSA8PCAxMykKKyNkZWZpbmUgU0FUQV9QSFlfVFhTV0lORyh4KQkoKHgpIDw8IDE5KQorI2RlZmluZSBTQVRBX1BIWV9FTlBMTCh4KQkoKHgpIDw8IDMxKQorCisvKgorICogVGhlIG11bHRpcGxpZXIgbmVlZGVkIGZvciAxLjVHSHogUExMIG91dHB1dC4KKyAqCisgKiBOT1RFOiBUaGlzIGlzIGN1cnJlbnRseSBoYXJkY29kZWQgdG8gYmUgc3VpdGFibGUgZm9yIDEwME1IeiBjcnlzdGFsCisgKiBmcmVxdWVuY3kgKHdoaWNoIGlzIHVzZWQgYnkgREE4NTAgRVZNIGJvYXJkKSBhbmQgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZAorICogaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoaXMgZHJpdmVyIG9uIHNvbWUgb3RoZXIgYm9hcmQuCisgKi8KKyNkZWZpbmUgREE4NTBfU0FUQV9DTEtfTVVMVElQTElFUgk3CisKK3N0YXRpYyB2b2lkIGRhODUwX3NhdGFfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqcHdyZG5fcmVnLAorCQkJICAgIHZvaWQgX19pb21lbSAqYWhjaV9iYXNlKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBFbmFibGUgU0FUQSBjbG9jayByZWNlaXZlciAqLworCXZhbCA9IHJlYWRsKHB3cmRuX3JlZyk7CisJdmFsICY9IH5CSVQoMCk7CisJd3JpdGVsKHZhbCwgcHdyZG5fcmVnKTsKKworCXZhbCA9IFNBVEFfUEhZX01QWShEQTg1MF9TQVRBX0NMS19NVUxUSVBMSUVSICsgMSkgfCBTQVRBX1BIWV9MT1MoMSkgfAorCSAgICAgIFNBVEFfUEhZX1JYQ0RSKDQpIHwgU0FUQV9QSFlfUlhFUSgxKSB8IFNBVEFfUEhZX1RYU1dJTkcoMykgfAorCSAgICAgIFNBVEFfUEhZX0VOUExMKDEpOworCisJd3JpdGVsKHZhbCwgYWhjaV9iYXNlICsgU0FUQV9QMFBIWUNSX1JFRyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX2RhODUwX3BvcnRfaW5mbyA9IHsKKwkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKKwkucGlvX21hc2sJPSBBVEFfUElPNCwKKwkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAorCS5wb3J0X29wcwk9ICZhaGNpX3BsYXRmb3JtX29wcywKK307CisKK3N0YXRpYyBpbnQgYWhjaV9kYTg1MF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKnB3cmRuX3JlZzsKKwlpbnQgcmM7CisKKwlocHJpdiA9IGFoY2lfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyhwZGV2KTsKKwlpZiAoSVNfRVJSKGhwcml2KSkKKwkJcmV0dXJuIFBUUl9FUlIoaHByaXYpOworCisJcmMgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAoIXJlcykKKwkJZ290byBkaXNhYmxlX3Jlc291cmNlczsKKworCXB3cmRuX3JlZyA9IGRldm1faW9yZW1hcChkZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwd3Jkbl9yZWcpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlkYTg1MF9zYXRhX2luaXQoZGV2LCBwd3Jkbl9yZWcsIGhwcml2LT5tbWlvKTsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QocGRldiwgaHByaXYsICZhaGNpX2RhODUwX3BvcnRfaW5mbywgMCwgMCk7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCisJcmV0dXJuIDA7CitkaXNhYmxlX3Jlc291cmNlczoKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhaGNpX2RhODUwX3BtX29wcywgYWhjaV9wbGF0Zm9ybV9zdXNwZW5kLAorCQkJIGFoY2lfcGxhdGZvcm1fcmVzdW1lKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWhjaV9kYTg1MF9kcml2ZXIgPSB7CisJLnByb2JlID0gYWhjaV9kYTg1MF9wcm9iZSwKKwkucmVtb3ZlID0gYXRhX3BsYXRmb3JtX3JlbW92ZV9vbmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWhjaV9kYTg1MCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmYWhjaV9kYTg1MF9wbV9vcHMsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFoY2lfZGE4NTBfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYVZpbmNpIERBODUwIEFIQ0kgU0FUQSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGIuem9sbmllcmtpZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2lfaW14LmMgYi9kcml2ZXJzL2F0YS9haGNpX2lteC5jCmluZGV4IGRkNGQ2ZjcuLjQ5N2M3YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2lfaW14LmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaV9pbXguYwpAQCAtNDIsMTMgKzQyLDcgQEAKIHN0cnVjdCBpbXhfYWhjaV9wcml2IHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphaGNpX3BkZXY7CiAJZW51bSBhaGNpX2lteF90eXBlIHR5cGU7Ci0KLQkvKiBpLk1YNTMgY2xvY2sgKi8KLQlzdHJ1Y3QgY2xrICpzYXRhX2dhdGVfY2xrOwotCS8qIENvbW1vbiBjbG9jayAqLwotCXN0cnVjdCBjbGsgKnNhdGFfcmVmX2NsazsKIAlzdHJ1Y3QgY2xrICphaGJfY2xrOwotCiAJc3RydWN0IHJlZ21hcCAqZ3ByOwogCWJvb2wgbm9fZGV2aWNlOwogCWJvb2wgZmlyc3RfdGltZTsKQEAgLTU4LDI4OCArNTIsMzIgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChob3RwbHVnLCBhaGNpX2lteF9ob3RwbHVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhob3RwbHVnLCAiQUhDSSBJTVggaG90LXBsdWcgc3VwcG9ydCAoMD1Eb24ndCBzdXBwb3J0LCAxPXN1cHBvcnQpIik7CiAKLXN0YXRpYyBpbnQgaW14X3NhdGFfY2xvY2tfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGFoY2lfaW14X2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOworCitzdGF0aWMgaW50IGlteF9zYXRhX2VuYWJsZShzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQogewotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CiAJaW50IHJldDsKIAotCWlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNTMpIHsKLQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGlteHByaXYtPnNhdGFfZ2F0ZV9jbGspOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihkZXYsICJwcmVwYXJlLWVuYWJsZSBzYXRhX2dhdGUgY2xvY2sgZXJyOiVkXG4iLAotCQkJCXJldCk7CisJaWYgKGlteHByaXYtPm5vX2RldmljZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaHByaXYtPnRhcmdldF9wd3IpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShocHJpdi0+dGFyZ2V0X3B3cik7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQl9CiAJfQogCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGlteHByaXYtPnNhdGFfcmVmX2Nsayk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJwcmVwYXJlLWVuYWJsZSBzYXRhX3JlZiBjbG9jayBlcnI6JWRcbiIsCi0JCQlyZXQpOwotCQlnb3RvIGNsa19lcnI7Ci0JfQotCi0JaWYgKGlteHByaXYtPnR5cGUgPT0gQUhDSV9JTVg2USkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14cHJpdi0+Z3ByLCBJT01VWENfR1BSMTMsCi0JCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTiwKLQkJCQkgICBJTVg2UV9HUFIxM19TQVRBX01QTExfQ0xLX0VOKTsKLQl9Ci0KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0KLQlyZXR1cm4gMDsKLQotY2xrX2VycjoKLQlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaW14cHJpdi0+c2F0YV9nYXRlX2Nsayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaW14X3NhdGFfY2xvY2tfZGlzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlteF9haGNpX3ByaXYgKmlteHByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCi0JaWYgKGlteHByaXYtPnR5cGUgPT0gQUhDSV9JTVg2USkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14cHJpdi0+Z3ByLCBJT01VWENfR1BSMTMsCi0JCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTiwKLQkJCQkgICAhSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTik7Ci0JfQotCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGlteHByaXYtPnNhdGFfcmVmX2Nsayk7Ci0KLQlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaW14cHJpdi0+c2F0YV9nYXRlX2Nsayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFoY2lfaW14X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQl1MzIgcmVnX3ZhbDsKLQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShhcC0+ZGV2KTsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGhwcml2LT5tbWlvOwotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gZGV2X2dldF9kcnZkYXRhKGFwLT5kZXYtPnBhcmVudCk7Ci0KLQlhaGNpX2Vycm9yX2hhbmRsZXIoYXApOwotCi0JaWYgKCEoaW14cHJpdi0+Zmlyc3RfdGltZSkgfHwgYWhjaV9pbXhfaG90cGx1ZykKLQkJcmV0dXJuOwotCi0JaW14cHJpdi0+Zmlyc3RfdGltZSA9IGZhbHNlOwotCi0JYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgRU5BQkxFRCkKLQkJcmV0dXJuOwotCS8qCi0JICogRGlzYWJsZSBsaW5rIHRvIHNhdmUgcG93ZXIuICBBbiBpbXggYWhjaSBwb3J0IGNhbid0IGJlIHJlY292ZXJlZAotCSAqIHdpdGhvdXQgZnVsbCByZXNldCBvbmNlIHRoZSBwZGRxIG1vZGUgaXMgZW5hYmxlZCBtYWtpbmcgaXQKLQkgKiBpbXBvc3NpYmxlIHRvIHVzZSBhcyBwYXJ0IG9mIGxpYmF0YSBMUE0uCi0JICovCi0JcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQT1JUX1BIWV9DVEwpOwotCXdyaXRlbChyZWdfdmFsIHwgUE9SVF9QSFlfQ1RMX1BERFFfTE9DLCBtbWlvICsgUE9SVF9QSFlfQ1RMKTsKLQlpbXhfc2F0YV9jbG9ja19kaXNhYmxlKGFwLT5kZXYpOwotCWlteHByaXYtPm5vX2RldmljZSA9IHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQgYWhjaV9pbXhfc29mdHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCi17Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gZGV2X2dldF9kcnZkYXRhKGFwLT5kZXYtPnBhcmVudCk7Ci0JaW50IHJldCA9IC1FSU87Ci0KLQlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQotCQlyZXQgPSBhaGNpX3BtcF9yZXRyeV9zcnN0X29wcy5zb2Z0cmVzZXQobGluaywgY2xhc3MsIGRlYWRsaW5lKTsKLQllbHNlIGlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpCi0JCXJldCA9IGFoY2lfb3BzLnNvZnRyZXNldChsaW5rLCBjbGFzcywgZGVhZGxpbmUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfaW14X29wcyA9IHsKLQkuaW5oZXJpdHMJPSAmYWhjaV9wbGF0Zm9ybV9vcHMsCi0JLmVycm9yX2hhbmRsZXIJPSBhaGNpX2lteF9lcnJvcl9oYW5kbGVyLAotCS5zb2Z0cmVzZXQJPSBhaGNpX2lteF9zb2Z0cmVzZXQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9pbXhfcG9ydF9pbmZvID0gewotCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAotCS5waW9fbWFzawk9IEFUQV9QSU80LAotCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCi0JLnBvcnRfb3BzCT0gJmFoY2lfaW14X29wcywKLX07Ci0KLXN0YXRpYyBpbnQgaW14X3NhdGFfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqbW1pbykKLXsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVnX3ZhbDsKLQlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0KLQlyZXQgPSBpbXhfc2F0YV9jbG9ja19lbmFibGUoZGV2KTsKKwlyZXQgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9jbGtzKGhwcml2KTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcjsKIAotCS8qCi0JICogQ29uZmlndXJlIHRoZSBIV0lOSVQgYml0cyBvZiB0aGUgSE9TVF9DQVAgYW5kIEhPU1RfUE9SVFNfSU1QTCwKLQkgKiBhbmQgSVAgdmVuZG9yIHNwZWNpZmljIHJlZ2lzdGVyIEhPU1RfVElNRVIxTVMuCi0JICogQ29uZmlndXJlIENBUF9TU1MgKHN1cHBvcnQgc3RhZ2VyZWQgc3BpbiB1cCkuCi0JICogSW1wbGVtZW50IHRoZSBwb3J0MC4KLQkgKiBHZXQgdGhlIGFoYiBjbG9jayByYXRlLCBhbmQgY29uZmlndXJlIHRoZSBUSU1FUjFNUyByZWdpc3Rlci4KLQkgKi8KLQlyZWdfdmFsID0gcmVhZGwobW1pbyArIEhPU1RfQ0FQKTsKLQlpZiAoIShyZWdfdmFsICYgSE9TVF9DQVBfU1NTKSkgewotCQlyZWdfdmFsIHw9IEhPU1RfQ0FQX1NTUzsKLQkJd3JpdGVsKHJlZ192YWwsIG1taW8gKyBIT1NUX0NBUCk7Ci0JfQotCXJlZ192YWwgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKLQlpZiAoIShyZWdfdmFsICYgMHgxKSkgewotCQlyZWdfdmFsIHw9IDB4MTsKLQkJd3JpdGVsKHJlZ192YWwsIG1taW8gKyBIT1NUX1BPUlRTX0lNUEwpOwotCX0KLQotCXJlZ192YWwgPSBjbGtfZ2V0X3JhdGUoaW14cHJpdi0+YWhiX2NsaykgLyAxMDAwOwotCXdyaXRlbChyZWdfdmFsLCBtbWlvICsgSE9TVF9USU1FUjFNUyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW14X3NhdGFfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW14X3NhdGFfY2xvY2tfZGlzYWJsZShkZXYpOwotfQotCi1zdGF0aWMgaW50IGlteF9haGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gIGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0KLQkvKgotCSAqIElmIG5vX2RldmljZSBpcyBzZXQsIFRoZSBDTEtzIGhhZCBiZWVuIGdhdGVkIG9mZiBpbiB0aGUKLQkgKiBpbml0aWFsaXphdGlvbiBzbyBkb24ndCBkbyBpdCBhZ2FpbiBoZXJlLgotCSAqLwotCWlmICghaW14cHJpdi0+bm9fZGV2aWNlKQotCQlpbXhfc2F0YV9jbG9ja19kaXNhYmxlKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbXhfYWhjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2ID0gIGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWlteHByaXYtPm5vX2RldmljZSkKLQkJcmV0ID0gaW14X3NhdGFfY2xvY2tfZW5hYmxlKGRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSBpbXhfc2F0YV9wZGF0YSA9IHsKLQkuaW5pdAkJPSBpbXhfc2F0YV9pbml0LAotCS5leGl0CQk9IGlteF9zYXRhX2V4aXQsCi0JLmF0YV9wb3J0X2luZm8JPSAmYWhjaV9pbXhfcG9ydF9pbmZvLAotCS5zdXNwZW5kCT0gaW14X2FoY2lfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGlteF9haGNpX3Jlc3VtZSwKLQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X2FoY2lfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNTMgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNlEgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfYWhjaV9vZl9tYXRjaCk7Ci0KLXN0YXRpYyBpbnQgaW14X2FoY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqbWVtLCAqaXJxLCByZXNbMl07Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7Ci0JZW51bSBhaGNpX2lteF90eXBlIHR5cGU7Ci0JY29uc3Qgc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBOVUxMOwotCXN0cnVjdCBpbXhfYWhjaV9wcml2ICppbXhwcml2OwotCXN0cnVjdCBkZXZpY2UgKmFoY2lfZGV2OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFoY2lfcGRldjsKLQlpbnQgcmV0OwotCi0Jb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UoaW14X2FoY2lfb2ZfbWF0Y2gsIGRldik7Ci0JaWYgKCFvZl9pZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0eXBlID0gKGVudW0gYWhjaV9pbXhfdHlwZSlvZl9pZC0+ZGF0YTsKLQlwZGF0YSA9ICZpbXhfc2F0YV9wZGF0YTsKLQotCWlteHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlteHByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteHByaXYpIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBhbGxvYyBhaGNpX2hvc3RfcHJpdlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWFoY2lfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiYWhjaSIsIC0xKTsKLQlpZiAoIWFoY2lfcGRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlhaGNpX2RldiA9ICZhaGNpX3BkZXYtPmRldjsKLQlhaGNpX2Rldi0+cGFyZW50ID0gZGV2OwotCi0JaW14cHJpdi0+bm9fZGV2aWNlID0gZmFsc2U7Ci0JaW14cHJpdi0+Zmlyc3RfdGltZSA9IHRydWU7Ci0JaW14cHJpdi0+dHlwZSA9IHR5cGU7Ci0KLQlpbXhwcml2LT5haGJfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImFoYiIpOwotCWlmIChJU19FUlIoaW14cHJpdi0+YWhiX2NsaykpIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgYWhiIGNsb2NrLlxuIik7Ci0JCXJldCA9IFBUUl9FUlIoaW14cHJpdi0+YWhiX2Nsayk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlpZiAodHlwZSA9PSBBSENJX0lNWDUzKSB7Ci0JCWlteHByaXYtPnNhdGFfZ2F0ZV9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAic2F0YV9nYXRlIik7Ci0JCWlmIChJU19FUlIoaW14cHJpdi0+c2F0YV9nYXRlX2NsaykpIHsKLQkJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IHNhdGFfZ2F0ZSBjbG9jay5cbiIpOwotCQkJcmV0ID0gUFRSX0VSUihpbXhwcml2LT5zYXRhX2dhdGVfY2xrKTsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCX0KLQotCWlteHByaXYtPnNhdGFfcmVmX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJzYXRhX3JlZiIpOwotCWlmIChJU19FUlIoaW14cHJpdi0+c2F0YV9yZWZfY2xrKSkgewotCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBzYXRhX3JlZiBjbG9jay5cbiIpOwotCQlyZXQgPSBQVFJfRVJSKGlteHByaXYtPnNhdGFfcmVmX2Nsayk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlpbXhwcml2LT5haGNpX3BkZXYgPSBhaGNpX3BkZXY7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW14cHJpdik7Ci0KLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7Ci0JaWYgKCFtZW0gfHwgIWlycSkgewotCQlkZXZfZXJyKGRldiwgIm5vIG1taW8vaXJxIHJlc291cmNlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXJlc1swXSA9ICptZW07Ci0JcmVzWzFdID0gKmlycTsKLQotCWFoY2lfZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0JYWhjaV9kZXYtPmRtYV9tYXNrID0gJmFoY2lfZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKLQlhaGNpX2Rldi0+b2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKLQotCWlmICh0eXBlID09IEFIQ0lfSU1YNlEpIHsKLQkJaW14cHJpdi0+Z3ByID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgKLQkJCQkJCQkiZnNsLGlteDZxLWlvbXV4Yy1ncHIiKTsKLQkJaWYgKElTX0VSUihpbXhwcml2LT5ncHIpKSB7Ci0JCQlkZXZfZXJyKGRldiwKLQkJCQkiZmFpbGVkIHRvIGZpbmQgZnNsLGlteDZxLWlvbXV4LWdwciByZWdtYXBcbiIpOwotCQkJcmV0ID0gUFRSX0VSUihpbXhwcml2LT5ncHIpOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0KKwlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDZRKSB7CiAJCS8qCi0JCSAqIFNldCBQSFkgUGFyZW1ldGVycywgdHdvIHN0ZXBzIHRvIGNvbmZpZ3VyZSB0aGUgR1BSMTMsCisJCSAqIHNldCBQSFkgUGFyZW1ldGVycywgdHdvIHN0ZXBzIHRvIGNvbmZpZ3VyZSB0aGUgR1BSMTMsCiAJCSAqIG9uZSB3cml0ZSBmb3IgcmVzdCBvZiBwYXJhbWV0ZXJzLCBtYXNrIG9mIGZpcnN0IHdyaXRlCi0JCSAqIGlzIDB4MDdmZmZmZmUsIGFuZCB0aGUgb3RoZXIgb25lIHdyaXRlIGZvciBzZXR0aW5nCi0JCSAqIHRoZSBtcGxsX2Nsa19lbiBoYXBwZW5zIGluIGlteF9zYXRhX2Nsb2NrX2VuYWJsZSgpLgorCQkgKiBpcyAweDA3ZmZmZmZmLCBhbmQgdGhlIG90aGVyIG9uZSB3cml0ZSBmb3Igc2V0dGluZworCQkgKiB0aGUgbXBsbF9jbGtfZW4uCiAJCSAqLwogCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14cHJpdi0+Z3ByLCBJT01VWENfR1BSMTMsCiAJCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9SWF9FUV9WQUxfTUFTSyB8CkBAIC0zNjAsNDIgKzk4LDIyOSBAQAogCQkJCSAgIElNWDZRX0dQUjEzX1NBVEFfVFhfQVRURU5fOV8xNiB8CiAJCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9UWF9CT09TVF8zXzMzX0RCIHwKIAkJCQkgICBJTVg2UV9HUFIxM19TQVRBX1RYX0xWTF8xXzAyNV9WKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteHByaXYtPmdwciwgSU9NVVhDX0dQUjEzLAorCQkJCSAgIElNWDZRX0dQUjEzX1NBVEFfTVBMTF9DTEtfRU4sCisJCQkJICAgSU1YNlFfR1BSMTNfU0FUQV9NUExMX0NMS19FTik7CiAJfQogCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoYWhjaV9wZGV2LCByZXMsIDIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX291dDsKLQotCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShhaGNpX3BkZXYsIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfb3V0OwotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhaGNpX3BkZXYpOwotCWlmIChyZXQpIHsKLWVycl9vdXQ6Ci0JCXBsYXRmb3JtX2RldmljZV9wdXQoYWhjaV9wZGV2KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCiAJcmV0dXJuIDA7CisKK2Rpc2FibGVfcmVndWxhdG9yOgorCWlmIChocHJpdi0+dGFyZ2V0X3B3cikKKwkJcmVndWxhdG9yX2Rpc2FibGUoaHByaXYtPnRhcmdldF9wd3IpOworCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpbXhfYWhjaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGlteF9zYXRhX2Rpc2FibGUoc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKIHsKLQlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFoY2lfcGRldiA9IGlteHByaXYtPmFoY2lfcGRldjsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CiAKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhaGNpX3BkZXYpOworCWlmIChpbXhwcml2LT5ub19kZXZpY2UpCisJCXJldHVybjsKKworCWlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpIHsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteHByaXYtPmdwciwgSU9NVVhDX0dQUjEzLAorCQkJCSAgIElNWDZRX0dQUjEzX1NBVEFfTVBMTF9DTEtfRU4sCisJCQkJICAgIUlNWDZRX0dQUjEzX1NBVEFfTVBMTF9DTEtfRU4pOworCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKGhwcml2KTsKKworCWlmIChocHJpdi0+dGFyZ2V0X3B3cikKKwkJcmVndWxhdG9yX2Rpc2FibGUoaHByaXYtPnRhcmdldF9wd3IpOworfQorCitzdGF0aWMgdm9pZCBhaGNpX2lteF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTMyIHJlZ192YWw7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoYXAtPmRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBocHJpdi0+bW1pbzsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CisKKwlhaGNpX2Vycm9yX2hhbmRsZXIoYXApOworCisJaWYgKCEoaW14cHJpdi0+Zmlyc3RfdGltZSkgfHwgYWhjaV9pbXhfaG90cGx1ZykKKwkJcmV0dXJuOworCisJaW14cHJpdi0+Zmlyc3RfdGltZSA9IGZhbHNlOworCisJYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgRU5BQkxFRCkKKwkJcmV0dXJuOworCS8qCisJICogRGlzYWJsZSBsaW5rIHRvIHNhdmUgcG93ZXIuICBBbiBpbXggYWhjaSBwb3J0IGNhbid0IGJlIHJlY292ZXJlZAorCSAqIHdpdGhvdXQgZnVsbCByZXNldCBvbmNlIHRoZSBwZGRxIG1vZGUgaXMgZW5hYmxlZCBtYWtpbmcgaXQKKwkgKiBpbXBvc3NpYmxlIHRvIHVzZSBhcyBwYXJ0IG9mIGxpYmF0YSBMUE0uCisJICovCisJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQT1JUX1BIWV9DVEwpOworCXdyaXRlbChyZWdfdmFsIHwgUE9SVF9QSFlfQ1RMX1BERFFfTE9DLCBtbWlvICsgUE9SVF9QSFlfQ1RMKTsKKwlpbXhfc2F0YV9kaXNhYmxlKGhwcml2KTsKKwlpbXhwcml2LT5ub19kZXZpY2UgPSB0cnVlOworfQorCitzdGF0aWMgaW50IGFoY2lfaW14X3NvZnRyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoYXAtPmRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW14X2FoY2lfcHJpdiAqaW14cHJpdiA9IGhwcml2LT5wbGF0X2RhdGE7CisJaW50IHJldCA9IC1FSU87CisKKwlpZiAoaW14cHJpdi0+dHlwZSA9PSBBSENJX0lNWDUzKQorCQlyZXQgPSBhaGNpX3BtcF9yZXRyeV9zcnN0X29wcy5zb2Z0cmVzZXQobGluaywgY2xhc3MsIGRlYWRsaW5lKTsKKwllbHNlIGlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpCisJCXJldCA9IGFoY2lfb3BzLnNvZnRyZXNldChsaW5rLCBjbGFzcywgZGVhZGxpbmUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfaW14X29wcyA9IHsKKwkuaW5oZXJpdHMJPSAmYWhjaV9vcHMsCisJLmhvc3Rfc3RvcAk9IGFoY2lfaW14X2hvc3Rfc3RvcCwKKwkuZXJyb3JfaGFuZGxlcgk9IGFoY2lfaW14X2Vycm9yX2hhbmRsZXIsCisJLnNvZnRyZXNldAk9IGFoY2lfaW14X3NvZnRyZXNldCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX2lteF9wb3J0X2luZm8gPSB7CisJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCisJLnBpb19tYXNrCT0gQVRBX1BJTzQsCisJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKKwkucG9ydF9vcHMJPSAmYWhjaV9pbXhfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X2FoY2lfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNTMgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1haGNpIiwgLmRhdGEgPSAodm9pZCAqKUFIQ0lfSU1YNlEgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfYWhjaV9vZl9tYXRjaCk7CisKK3N0YXRpYyBpbnQgaW14X2FoY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7CisJc3RydWN0IGlteF9haGNpX3ByaXYgKmlteHByaXY7CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisJaW50IHJldDsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGlteF9haGNpX29mX21hdGNoLCBkZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJaW14cHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW14cHJpdiksIEdGUF9LRVJORUwpOworCWlmICghaW14cHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbXhwcml2LT5ub19kZXZpY2UgPSBmYWxzZTsKKwlpbXhwcml2LT5maXJzdF90aW1lID0gdHJ1ZTsKKwlpbXhwcml2LT50eXBlID0gKGVudW0gYWhjaV9pbXhfdHlwZSlvZl9pZC0+ZGF0YTsKKwlpbXhwcml2LT5haGJfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImFoYiIpOworCWlmIChJU19FUlIoaW14cHJpdi0+YWhiX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgYWhiIGNsb2NrLlxuIik7CisJCXJldHVybiBQVFJfRVJSKGlteHByaXYtPmFoYl9jbGspOworCX0KKworCWlmIChpbXhwcml2LT50eXBlID09IEFIQ0lfSU1YNlEpIHsKKwkJaW14cHJpdi0+Z3ByID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgKKwkJCQkJCQkiZnNsLGlteDZxLWlvbXV4Yy1ncHIiKTsKKwkJaWYgKElTX0VSUihpbXhwcml2LT5ncHIpKSB7CisJCQlkZXZfZXJyKGRldiwKKwkJCQkiZmFpbGVkIHRvIGZpbmQgZnNsLGlteDZxLWlvbXV4LWdwciByZWdtYXBcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoaW14cHJpdi0+Z3ByKTsKKwkJfQorCX0KKworCWhwcml2ID0gYWhjaV9wbGF0Zm9ybV9nZXRfcmVzb3VyY2VzKHBkZXYpOworCWlmIChJU19FUlIoaHByaXYpKQorCQlyZXR1cm4gUFRSX0VSUihocHJpdik7CisKKwlocHJpdi0+cGxhdF9kYXRhID0gaW14cHJpdjsKKworCXJldCA9IGlteF9zYXRhX2VuYWJsZShocHJpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQ29uZmlndXJlIHRoZSBIV0lOSVQgYml0cyBvZiB0aGUgSE9TVF9DQVAgYW5kIEhPU1RfUE9SVFNfSU1QTCwKKwkgKiBhbmQgSVAgdmVuZG9yIHNwZWNpZmljIHJlZ2lzdGVyIEhPU1RfVElNRVIxTVMuCisJICogQ29uZmlndXJlIENBUF9TU1MgKHN1cHBvcnQgc3RhZ2VyZWQgc3BpbiB1cCkuCisJICogSW1wbGVtZW50IHRoZSBwb3J0MC4KKwkgKiBHZXQgdGhlIGFoYiBjbG9jayByYXRlLCBhbmQgY29uZmlndXJlIHRoZSBUSU1FUjFNUyByZWdpc3Rlci4KKwkgKi8KKwlyZWdfdmFsID0gcmVhZGwoaHByaXYtPm1taW8gKyBIT1NUX0NBUCk7CisJaWYgKCEocmVnX3ZhbCAmIEhPU1RfQ0FQX1NTUykpIHsKKwkJcmVnX3ZhbCB8PSBIT1NUX0NBUF9TU1M7CisJCXdyaXRlbChyZWdfdmFsLCBocHJpdi0+bW1pbyArIEhPU1RfQ0FQKTsKKwl9CisJcmVnX3ZhbCA9IHJlYWRsKGhwcml2LT5tbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwlpZiAoIShyZWdfdmFsICYgMHgxKSkgeworCQlyZWdfdmFsIHw9IDB4MTsKKwkJd3JpdGVsKHJlZ192YWwsIGhwcml2LT5tbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwl9CisKKwlyZWdfdmFsID0gY2xrX2dldF9yYXRlKGlteHByaXYtPmFoYl9jbGspIC8gMTAwMDsKKwl3cml0ZWwocmVnX3ZhbCwgaHByaXYtPm1taW8gKyBIT1NUX1RJTUVSMU1TKTsKKworCXJldCA9IGFoY2lfcGxhdGZvcm1faW5pdF9ob3N0KHBkZXYsIGhwcml2LCAmYWhjaV9pbXhfcG9ydF9pbmZvLCAwLCAwKTsKKwlpZiAocmV0KQorCQlpbXhfc2F0YV9kaXNhYmxlKGhwcml2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaW14X2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKworCWlteF9zYXRhX2Rpc2FibGUoaHByaXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGlteF9haGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlteF9zYXRhX2Rpc2FibGUoaHByaXYpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaW14X2FoY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBpbXhfc2F0YV9lbmFibGUoaHByaXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYWhjaV9wbGF0Zm9ybV9yZXN1bWVfaG9zdChkZXYpOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhaGNpX2lteF9wbV9vcHMsIGlteF9haGNpX3N1c3BlbmQsIGlteF9haGNpX3Jlc3VtZSk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlteF9haGNpX2RyaXZlciA9IHsKIAkucHJvYmUgPSBpbXhfYWhjaV9wcm9iZSwKLQkucmVtb3ZlID0gaW14X2FoY2lfcmVtb3ZlLAorCS5yZW1vdmUgPSBhdGFfcGxhdGZvcm1fcmVtb3ZlX29uZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJhaGNpLWlteCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBpbXhfYWhjaV9vZl9tYXRjaCwKKwkJLnBtID0gJmFoY2lfaW14X3BtX29wcywKIAl9LAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaW14X2FoY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYwppbmRleCA0YjIzMWJhLi5lZjY3ZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaV9wbGF0Zm9ybS5jCkBAIC0xMiwxMzUgKzEyLDM2IEBACiAgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvYWhjaV9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgImFoY2kuaCIKIAotc3RhdGljIHZvaWQgYWhjaV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKLQotZW51bSBhaGNpX3R5cGUgewotCUFIQ0ksCQkvKiBzdGFuZGFyZCBwbGF0Zm9ybSBhaGNpICovCi0JSU1YNTNfQUhDSSwJLyogYWhjaSBvbiBpLm14NTMgKi8KLQlTVFJJQ1RfQUhDSSwJLyogZGVsYXllZCBETUEgZW5naW5lIHN0YXJ0ICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBhaGNpX2RldnR5cGVbXSA9IHsKLQl7Ci0JCS5uYW1lID0gImFoY2kiLAotCQkuZHJpdmVyX2RhdGEgPSBBSENJLAotCX0sIHsKLQkJLm5hbWUgPSAiaW14NTMtYWhjaSIsCi0JCS5kcml2ZXJfZGF0YSA9IElNWDUzX0FIQ0ksCi0JfSwgewotCQkubmFtZSA9ICJzdHJpY3QtYWhjaSIsCi0JCS5kcml2ZXJfZGF0YSA9IFNUUklDVF9BSENJLAotCX0sIHsKLQkJLyogc2VudGluZWwgKi8KLQl9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgYWhjaV9kZXZ0eXBlKTsKLQotc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWhjaV9wbGF0Zm9ybV9vcHMgPSB7Ci0JLmluaGVyaXRzCT0gJmFoY2lfb3BzLAotCS5ob3N0X3N0b3AJPSBhaGNpX2hvc3Rfc3RvcCwKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX29wcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhaGNpX3BsYXRmb3JtX3JldHJ5X3Nyc3Rfb3BzID0gewotCS5pbmhlcml0cwk9ICZhaGNpX3BtcF9yZXRyeV9zcnN0X29wcywKLQkuaG9zdF9zdG9wCT0gYWhjaV9ob3N0X3N0b3AsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9wb3J0X2luZm9bXSA9IHsKLQkvKiBieSBmZWF0dXJlcyAqLwotCVtBSENJXSA9IHsKLQkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCi0JCS5waW9fbWFzawk9IEFUQV9QSU80LAotCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAotCQkucG9ydF9vcHMJPSAmYWhjaV9wbGF0Zm9ybV9vcHMsCi0JfSwKLQlbSU1YNTNfQUhDSV0gPSB7Ci0JCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAotCQkucGlvX21hc2sJPSBBVEFfUElPNCwKLQkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKLQkJLnBvcnRfb3BzCT0gJmFoY2lfcGxhdGZvcm1fcmV0cnlfc3JzdF9vcHMsCi0JfSwKLQlbU1RSSUNUX0FIQ0ldID0gewotCQlBSENJX0hGTEFHUwkoQUhDSV9IRkxBR19ERUxBWV9FTkdJTkUpLAotCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKLQkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCi0JCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCi0JCS5wb3J0X29wcwk9ICZhaGNpX3BsYXRmb3JtX29wcywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYWhjaV9wbGF0Zm9ybV9zaHQgPSB7Ci0JQUhDSV9TSFQoImFoY2lfcGxhdGZvcm0iKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX3BvcnRfaW5mbyA9IHsKKwkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKKwkucGlvX21hc2sJPSBBVEFfUElPNCwKKwkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAorCS5wb3J0X29wcwk9ICZhaGNpX3BsYXRmb3JtX29wcywKIH07CiAKIHN0YXRpYyBpbnQgYWhjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0JY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gYWhjaV9wb3J0X2luZm9baWQgPyBpZC0+ZHJpdmVyX2RhdGEgOiAwXTsKLQljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwaSwgTlVMTCB9OwogCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0OwotCXN0cnVjdCByZXNvdXJjZSAqbWVtOwotCWludCBpcnE7Ci0JaW50IG5fcG9ydHM7Ci0JaW50IGk7CiAJaW50IHJjOwogCi0JbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIW1lbSkgewotCQlkZXZfZXJyKGRldiwgIm5vIG1taW8gc3BhY2VcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaHByaXYgPSBhaGNpX3BsYXRmb3JtX2dldF9yZXNvdXJjZXMocGRldik7CisJaWYgKElTX0VSUihocHJpdikpCisJCXJldHVybiBQVFJfRVJSKGhwcml2KTsKIAotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8PSAwKSB7Ci0JCWRldl9lcnIoZGV2LCAibm8gaXJxXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5hdGFfcG9ydF9pbmZvKQotCQlwaSA9ICpwZGF0YS0+YXRhX3BvcnRfaW5mbzsKLQotCWhwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpocHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghaHByaXYpIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBhbGxvYyBhaGNpX2hvc3RfcHJpdlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWhwcml2LT5mbGFncyB8PSAodW5zaWduZWQgbG9uZylwaS5wcml2YXRlX2RhdGE7Ci0KLQlocHJpdi0+bW1pbyA9IGRldm1faW9yZW1hcChkZXYsIG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7Ci0JaWYgKCFocHJpdi0+bW1pbykgewotCQlkZXZfZXJyKGRldiwgImNhbid0IG1hcCAlcFJcbiIsIG1lbSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWhwcml2LT5jbGsgPSBjbGtfZ2V0KGRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihocHJpdi0+Y2xrKSkgewotCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCBjbG9ja1xuIik7Ci0JfSBlbHNlIHsKLQkJcmMgPSBjbGtfcHJlcGFyZV9lbmFibGUoaHByaXYtPmNsayk7Ci0JCWlmIChyYykgewotCQkJZGV2X2VycihkZXYsICJjbG9jayBwcmVwYXJlIGVuYWJsZSBmYWlsZWQiKTsKLQkJCWdvdG8gZnJlZV9jbGs7Ci0JCX0KLQl9CisJcmMgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJLyoKIAkgKiBTb21lIHBsYXRmb3JtcyBtaWdodCBuZWVkIHRvIHByZXBhcmUgZm9yIG1taW8gcmVnaW9uIGFjY2VzcywKQEAgLTE1MSw2OSArNTIsMTAgQEAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQpIHsKIAkJcmMgPSBwZGF0YS0+aW5pdChkZXYsIGhwcml2LT5tbWlvKTsKIAkJaWYgKHJjKQotCQkJZ290byBkaXNhYmxlX3VucHJlcGFyZV9jbGs7CisJCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOwogCX0KIAotCWFoY2lfc2F2ZV9pbml0aWFsX2NvbmZpZyhkZXYsIGhwcml2LAotCQlwZGF0YSA/IHBkYXRhLT5mb3JjZV9wb3J0X21hcCA6IDAsCi0JCXBkYXRhID8gcGRhdGEtPm1hc2tfcG9ydF9tYXAgIDogMCk7Ci0KLQkvKiBwcmVwYXJlIGhvc3QgKi8KLQlpZiAoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX05DUSkKLQkJcGkuZmxhZ3MgfD0gQVRBX0ZMQUdfTkNROwotCi0JaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9QTVApCi0JCXBpLmZsYWdzIHw9IEFUQV9GTEFHX1BNUDsKLQotCWFoY2lfc2V0X2VtX21lc3NhZ2VzKGhwcml2LCAmcGkpOwotCi0JLyogQ0FQLk5QIHNvbWV0aW1lcyBpbmRpY2F0ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZW5hYmxlZAotCSAqIHBvcnQsIGF0IG90aGVyIHRpbWVzLCB0aGF0IG9mIHRoZSBsYXN0IHBvc3NpYmxlIHBvcnQsIHNvCi0JICogZGV0ZXJtaW5pbmcgdGhlIG1heGltdW0gcG9ydCBudW1iZXIgcmVxdWlyZXMgbG9va2luZyBhdAotCSAqIGJvdGggQ0FQLk5QIGFuZCBwb3J0X21hcC4KLQkgKi8KLQluX3BvcnRzID0gbWF4KGFoY2lfbnJfcG9ydHMoaHByaXYtPmNhcCksIGZscyhocHJpdi0+cG9ydF9tYXApKTsKLQotCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbyhkZXYsIHBwaSwgbl9wb3J0cyk7Ci0JaWYgKCFob3N0KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwZGF0YV9leGl0OwotCX0KLQotCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhwcml2OwotCi0JaWYgKCEoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX1NTUykgfHwgYWhjaV9pZ25vcmVfc3NzKQotCQlob3N0LT5mbGFncyB8PSBBVEFfSE9TVF9QQVJBTExFTF9TQ0FOOwotCWVsc2UKLQkJZGV2X2luZm8oZGV2LCAiU1NTIGZsYWcgc2V0LCBwYXJhbGxlbCBidXMgc2NhbiBkaXNhYmxlZFxuIik7Ci0KLQlpZiAocGkuZmxhZ3MgJiBBVEFfRkxBR19FTSkKLQkJYWhjaV9yZXNldF9lbShob3N0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKLQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOwotCi0JCWF0YV9wb3J0X2Rlc2MoYXAsICJtbWlvICVwUiIsIG1lbSk7Ci0JCWF0YV9wb3J0X2Rlc2MoYXAsICJwb3J0IDB4JXgiLCAweDEwMCArIGFwLT5wb3J0X25vICogMHg4MCk7Ci0KLQkJLyogc2V0IGVuY2xvc3VyZSBtYW5hZ2VtZW50IG1lc3NhZ2UgdHlwZSAqLwotCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRU0pCi0JCQlhcC0+ZW1fbWVzc2FnZV90eXBlID0gaHByaXYtPmVtX21zZ190eXBlOwotCi0JCS8qIGRpc2FibGVkL25vdC1pbXBsZW1lbnRlZCBwb3J0ICovCi0JCWlmICghKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKLQkJCWFwLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOwotCX0KLQotCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKGhvc3QpOwotCWlmIChyYykKLQkJZ290byBwZGF0YV9leGl0OwotCi0JYWhjaV9pbml0X2NvbnRyb2xsZXIoaG9zdCk7Ci0JYWhjaV9wcmludF9pbmZvKGhvc3QsICJwbGF0Zm9ybSIpOwotCi0JcmMgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEsIGFoY2lfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSAgICAgICAmYWhjaV9wbGF0Zm9ybV9zaHQpOworCXJjID0gYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QocGRldiwgaHByaXYsICZhaGNpX3BvcnRfaW5mbywgMCwgMCk7CiAJaWYgKHJjKQogCQlnb3RvIHBkYXRhX2V4aXQ7CiAKQEAgLTIyMSwxMTUgKzYzLDE5IEBACiBwZGF0YV9leGl0OgogCWlmIChwZGF0YSAmJiBwZGF0YS0+ZXhpdCkKIAkJcGRhdGEtPmV4aXQoZGV2KTsKLWRpc2FibGVfdW5wcmVwYXJlX2NsazoKLQlpZiAoIUlTX0VSUihocHJpdi0+Y2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhwcml2LT5jbGspOwotZnJlZV9jbGs6Ci0JaWYgKCFJU19FUlIoaHByaXYtPmNsaykpCi0JCWNsa19wdXQoaHByaXYtPmNsayk7CitkaXNhYmxlX3Jlc291cmNlczoKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBob3N0LT5kZXY7Ci0Jc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0Jc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKLQotCWlmIChwZGF0YSAmJiBwZGF0YS0+ZXhpdCkKLQkJcGRhdGEtPmV4aXQoZGV2KTsKLQotCWlmICghSVNfRVJSKGhwcml2LT5jbGspKSB7Ci0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShocHJpdi0+Y2xrKTsKLQkJY2xrX3B1dChocHJpdi0+Y2xrKTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgYWhjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKLQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGhwcml2LT5tbWlvOwotCXUzMiBjdGw7Ci0JaW50IHJjOwotCi0JaWYgKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfTk9fU1VTUEVORCkgewotCQlkZXZfZXJyKGRldiwgImZpcm13YXJlIHVwZGF0ZSByZXF1aXJlZCBmb3Igc3VzcGVuZC9yZXN1bWVcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIEFIQ0kgc3BlYyByZXYxLjEgc2VjdGlvbiA4LjMuMzoKLQkgKiBTb2Z0d2FyZSBtdXN0IGRpc2FibGUgaW50ZXJydXB0cyBwcmlvciB0byByZXF1ZXN0aW5nIGEKLQkgKiB0cmFuc2l0aW9uIG9mIHRoZSBIQkEgdG8gRDMgc3RhdGUuCi0JICovCi0JY3RsID0gcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsKLQljdGwgJj0gfkhPU1RfSVJRX0VOOwotCXdyaXRlbChjdGwsIG1taW8gKyBIT1NUX0NUTCk7Ci0JcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsgLyogZmx1c2ggKi8KLQotCXJjID0gYXRhX2hvc3Rfc3VzcGVuZChob3N0LCBQTVNHX1NVU1BFTkQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5zdXNwZW5kKQotCQlyZXR1cm4gcGRhdGEtPnN1c3BlbmQoZGV2KTsKLQotCWlmICghSVNfRVJSKGhwcml2LT5jbGspKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaHByaXYtPmNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhaGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmM7Ci0KLQlpZiAoIUlTX0VSUihocHJpdi0+Y2xrKSkgewotCQlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZShocHJpdi0+Y2xrKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGRldiwgImNsb2NrIHByZXBhcmUgZW5hYmxlIGZhaWxlZCIpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5yZXN1bWUpIHsKLQkJcmMgPSBwZGF0YS0+cmVzdW1lKGRldik7Ci0JCWlmIChyYykKLQkJCWdvdG8gZGlzYWJsZV91bnByZXBhcmVfY2xrOwotCX0KLQotCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKLQkJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIoaG9zdCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZGlzYWJsZV91bnByZXBhcmVfY2xrOwotCi0JCWFoY2lfaW5pdF9jb250cm9sbGVyKGhvc3QpOwotCX0KLQotCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKLQotCXJldHVybiAwOwotCi1kaXNhYmxlX3VucHJlcGFyZV9jbGs6Ci0JaWYgKCFJU19FUlIoaHByaXYtPmNsaykpCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShocHJpdi0+Y2xrKTsKLQotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYWhjaV9wbV9vcHMsIGFoY2lfc3VzcGVuZCwgYWhjaV9yZXN1bWUpOworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGFoY2lfcG1fb3BzLCBhaGNpX3BsYXRmb3JtX3N1c3BlbmQsCisJCQkgYWhjaV9wbGF0Zm9ybV9yZXN1bWUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhaGNpX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzbnBzLHNwZWFyLWFoY2kiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic25wcyxleHlub3M1NDQwLWFoY2kiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiaWJtLDQ3Nmd0ci1haGNpIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNucHMsZHdjLWFoY2kiLCB9LAogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFoY2lfb2ZfbWF0Y2gpOwpAQCAtMzQzLDcgKzg5LDYgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gYWhjaV9vZl9tYXRjaCwKIAkJLnBtID0gJmFoY2lfcG1fb3BzLAogCX0sCi0JLmlkX3RhYmxlCT0gYWhjaV9kZXZ0eXBlLAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWhjaV9kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpX3N0LmMgYi9kcml2ZXJzL2F0YS9haGNpX3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMjIyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL2FoY2lfc3QuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTVE1pY3JvZWxlY3Ryb25pY3MgTGltaXRlZAorICoKKyAqIEF1dGhvcnM6IEZyYW5jZXNjbyBWaXJsaW56aSA8ZnJhbmNlc2NvLnZpcmxpbnppQHN0LmNvbT4KKyAqCSAgICBBbGV4YW5kcmUgVG9yZ3VlIDxhbGV4YW5kcmUudG9yZ3VlQHN0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9haGNpX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJhaGNpLmgiCisKKyNkZWZpbmUgU1RfQUhDSV9PT0JSCQkJMHhiYworI2RlZmluZSBTVF9BSENJX09PQlJfV0UJCQlCSVQoMzEpCisjZGVmaW5lIFNUX0FIQ0lfT09CUl9DV01JTl9TSElGVAkyNAorI2RlZmluZSBTVF9BSENJX09PQlJfQ1dNQVhfU0hJRlQJMTYKKyNkZWZpbmUgU1RfQUhDSV9PT0JSX0NJTUlOX1NISUZUCTgKKyNkZWZpbmUgU1RfQUhDSV9PT0JSX0NJTUFYX1NISUZUCTAKKworc3RydWN0IHN0X2FoY2lfZHJ2X2RhdGEgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFoY2k7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnB3cjsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqc3dfcnN0OworCXN0cnVjdCByZXNldF9jb250cm9sICpwd3JfcnN0OworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7Cit9OworCitzdGF0aWMgdm9pZCBzdF9haGNpX2NvbmZpZ3VyZV9vb2Iodm9pZCBfX2lvbWVtICptbWlvKQoreworCXVuc2lnbmVkIGxvbmcgb2xkX3ZhbCwgbmV3X3ZhbDsKKworCW5ld192YWwgPSAoMHgwMiA8PCBTVF9BSENJX09PQlJfQ1dNSU5fU0hJRlQpIHwKKwkJICAoMHgwNCA8PCBTVF9BSENJX09PQlJfQ1dNQVhfU0hJRlQpIHwKKwkJICAoMHgwOCA8PCBTVF9BSENJX09PQlJfQ0lNSU5fU0hJRlQpIHwKKwkJICAoMHgwQyA8PCBTVF9BSENJX09PQlJfQ0lNQVhfU0hJRlQpOworCisJb2xkX3ZhbCA9IHJlYWRsKG1taW8gKyBTVF9BSENJX09PQlIpOworCXdyaXRlbChvbGRfdmFsIHwgU1RfQUhDSV9PT0JSX1dFLCBtbWlvICsgU1RfQUhDSV9PT0JSKTsKKwl3cml0ZWwobmV3X3ZhbCB8IFNUX0FIQ0lfT09CUl9XRSwgbW1pbyArIFNUX0FIQ0lfT09CUik7CisJd3JpdGVsKG5ld192YWwsIG1taW8gKyBTVF9BSENJX09PQlIpOworfQorCitzdGF0aWMgaW50IHN0X2FoY2lfZGVhc3NlcnRfcmVzZXRzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RfYWhjaV9kcnZfZGF0YSAqZHJ2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKGRydl9kYXRhLT5wd3IpIHsKKwkJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChkcnZfZGF0YS0+cHdyKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gYnJpbmcgb3V0IG9mIHB3cmR3blxuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJc3RfYWhjaV9jb25maWd1cmVfb29iKGRydl9kYXRhLT5ocHJpdi0+bW1pbyk7CisKKwlpZiAoZHJ2X2RhdGEtPnN3X3JzdCkgeworCQllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KGRydl9kYXRhLT5zd19yc3QpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBicmluZyBvdXQgb2Ygc3ctcnN0XG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAoZHJ2X2RhdGEtPnB3cl9yc3QpIHsKKwkJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChkcnZfZGF0YS0+cHdyX3JzdCk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGJyaW5nIG91dCBvZiBwd3ItcnN0XG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RfYWhjaV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaG9zdC0+ZGV2OworCXN0cnVjdCBzdF9haGNpX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnI7CisKKwlpZiAoZHJ2X2RhdGEtPnB3cikgeworCQllcnIgPSByZXNldF9jb250cm9sX2Fzc2VydChkcnZfZGF0YS0+cHdyKTsKKwkJaWYgKGVycikKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHB3cmR3blxuIik7CisJfQorCisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7Cit9CisKK3N0YXRpYyBpbnQgc3RfYWhjaV9wcm9iZV9yZXNldHMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3RfYWhjaV9kcnZfZGF0YSAqZHJ2X2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRydl9kYXRhLT5wd3IgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJwd3ItZHduIik7CisJaWYgKElTX0VSUihkcnZfZGF0YS0+cHdyKSkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicG93ZXIgcmVzZXQgY29udHJvbCBub3QgZGVmaW5lZFxuIik7CisJCWRydl9kYXRhLT5wd3IgPSBOVUxMOworCX0KKworCWRydl9kYXRhLT5zd19yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJzdy1yc3QiKTsKKwlpZiAoSVNfRVJSKGRydl9kYXRhLT5zd19yc3QpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzb2Z0IHJlc2V0IGNvbnRyb2wgbm90IGRlZmluZWRcbiIpOworCQlkcnZfZGF0YS0+c3dfcnN0ID0gTlVMTDsKKwl9CisKKwlkcnZfZGF0YS0+cHdyX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgInB3ci1yc3QiKTsKKwlpZiAoSVNfRVJSKGRydl9kYXRhLT5wd3JfcnN0KSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwb3dlciBzb2Z0IHJlc2V0IGNvbnRyb2wgbm90IGRlZmluZWRcbiIpOworCQlkcnZfZGF0YS0+cHdyX3JzdCA9IE5VTEw7CisJfQorCisJcmV0dXJuIHN0X2FoY2lfZGVhc3NlcnRfcmVzZXRzKCZwZGV2LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc3RfYWhjaV9wb3J0X29wcyA9IHsKKwkuaW5oZXJpdHMJPSAmYWhjaV9wbGF0Zm9ybV9vcHMsCisJLmhvc3Rfc3RvcAk9IHN0X2FoY2lfaG9zdF9zdG9wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHN0X2FoY2lfcG9ydF9pbmZvID0geworCS5mbGFncyAgICAgICAgICA9IEFIQ0lfRkxBR19DT01NT04sCisJLnBpb19tYXNrICAgICAgID0gQVRBX1BJTzQsCisJLnVkbWFfbWFzayAgICAgID0gQVRBX1VETUE2LAorCS5wb3J0X29wcyAgICAgICA9ICZzdF9haGNpX3BvcnRfb3BzLAorfTsKKworc3RhdGljIGludCBzdF9haGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHN0X2FoY2lfZHJ2X2RhdGEgKmRydl9kYXRhOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7CisJaW50IGVycjsKKworCWRydl9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJ2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydl9kYXRhKTsKKworCWhwcml2ID0gYWhjaV9wbGF0Zm9ybV9nZXRfcmVzb3VyY2VzKHBkZXYpOworCWlmIChJU19FUlIoaHByaXYpKQorCQlyZXR1cm4gUFRSX0VSUihocHJpdik7CisKKwlkcnZfZGF0YS0+aHByaXYgPSBocHJpdjsKKworCWVyciA9IHN0X2FoY2lfcHJvYmVfcmVzZXRzKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhaGNpX3BsYXRmb3JtX2luaXRfaG9zdChwZGV2LCBocHJpdiwgJnN0X2FoY2lfcG9ydF9pbmZvLCAwLCAwKTsKKwlpZiAoZXJyKSB7CisJCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHN0X2FoY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0X2FoY2lfZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGRydl9kYXRhLT5ocHJpdjsKKwlpbnQgZXJyOworCisJZXJyID0gYWhjaV9wbGF0Zm9ybV9zdXNwZW5kX2hvc3QoZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGRydl9kYXRhLT5wd3IpIHsKKwkJZXJyID0gcmVzZXRfY29udHJvbF9hc3NlcnQoZHJ2X2RhdGEtPnB3cik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHB3cmR3biIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RfYWhjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzdF9haGNpX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBkcnZfZGF0YS0+aHByaXY7CisJaW50IGVycjsKKworCWVyciA9IGFoY2lfcGxhdGZvcm1fZW5hYmxlX3Jlc291cmNlcyhocHJpdik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHN0X2FoY2lfZGVhc3NlcnRfcmVzZXRzKGRldik7CisJaWYgKGVycikgeworCQlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gYWhjaV9wbGF0Zm9ybV9yZXN1bWVfaG9zdChkZXYpOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzdF9haGNpX3BtX29wcywgc3RfYWhjaV9zdXNwZW5kLCBzdF9haGNpX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X2FoY2lfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0LGFoY2kiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN0X2FoY2lfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdF9haGNpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzdF9haGNpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzdF9haGNpX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHN0X2FoY2lfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gc3RfYWhjaV9wcm9iZSwKKwkucmVtb3ZlID0gYXRhX3BsYXRmb3JtX3JlbW92ZV9vbmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdF9haGNpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRyZSBUb3JndWUgPGFsZXhhbmRyZS50b3JndWVAc3QuY29tPiIpOworTU9EVUxFX0FVVEhPUigiRnJhbmNlc2NvIFZpcmxpbnppIDxmcmFuY2VzY28udmlybGluemlAc3QuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVE1pY3JvZWxlY3Ryb25pY3MgU0FUQSBBSENJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaV9zdW54aS5jIGIvZHJpdmVycy9hdGEvYWhjaV9zdW54aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDNmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9haGNpX3N1bnhpLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBBbGx3aW5uZXIgc3VueGkgQUhDSSBTQVRBIHBsYXRmb3JtIGRyaXZlcgorICogQ29weXJpZ2h0IDIwMTMgT2xsaXZlciBTY2hpbmFnbCA8b2xpdmVyQHNjaGluYWdsLm5sPgorICogQ29weXJpZ2h0IDIwMTQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgQUhDSSBTQVRBIHBsYXRmb3JtIGRyaXZlciBieSBKZWZmIEdhcnppayBhbmQgQW50b24gVm9yb250c292CisgKiBCYXNlZCBvbiBjb2RlIGZyb20gQWxsd2lubmVyIFRlY2hub2xvZ3kgQ28uLCBMdGQuIDx3d3cuYWxsd2lubmVydGVjaC5jb20+LAorICogRGFuaWVsIFdhbmcgPGRhbmllbHdhbmdAYWxsd2lubmVydGVjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FoY2lfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgImFoY2kuaCIKKworI2RlZmluZSBBSENJX0JJU1RBRlIJMHgwMGEwCisjZGVmaW5lIEFIQ0lfQklTVENSCTB4MDBhNAorI2RlZmluZSBBSENJX0JJU1RGQ1RSCTB4MDBhOAorI2RlZmluZSBBSENJX0JJU1RTUgkweDAwYWMKKyNkZWZpbmUgQUhDSV9CSVNUREVDUgkweDAwYjAKKyNkZWZpbmUgQUhDSV9ESUFHTlIwCTB4MDBiNAorI2RlZmluZSBBSENJX0RJQUdOUjEJMHgwMGI4CisjZGVmaW5lIEFIQ0lfT09CUgkweDAwYmMKKyNkZWZpbmUgQUhDSV9QSFlDUzBSCTB4MDBjMAorI2RlZmluZSBBSENJX1BIWUNTMVIJMHgwMGM0CisjZGVmaW5lIEFIQ0lfUEhZQ1MyUgkweDAwYzgKKyNkZWZpbmUgQUhDSV9USU1FUjFNUwkweDAwZTAKKyNkZWZpbmUgQUhDSV9HUEFSQU0xUgkweDAwZTgKKyNkZWZpbmUgQUhDSV9HUEFSQU0yUgkweDAwZWMKKyNkZWZpbmUgQUhDSV9QUEFSQU1SCTB4MDBmMAorI2RlZmluZSBBSENJX1RFU1RSCTB4MDBmNAorI2RlZmluZSBBSENJX1ZFUlNJT05SCTB4MDBmOAorI2RlZmluZSBBSENJX0lEUgkweDAwZmMKKyNkZWZpbmUgQUhDSV9SV0NSCTB4MDBmYworI2RlZmluZSBBSENJX1AwRE1BQ1IJMHgwMTcwCisjZGVmaW5lIEFIQ0lfUDBQSFlDUgkweDAxNzgKKyNkZWZpbmUgQUhDSV9QMFBIWVNSCTB4MDE3YworCitzdGF0aWMgdm9pZCBzdW54aV9jbHJiaXRzKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgY2xyX3ZhbCkKK3sKKwl1MzIgcmVnX3ZhbDsKKworCXJlZ192YWwgPSByZWFkbChyZWcpOworCXJlZ192YWwgJj0gfihjbHJfdmFsKTsKKwl3cml0ZWwocmVnX3ZhbCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc3VueGlfc2V0Yml0cyh2b2lkIF9faW9tZW0gKnJlZywgdTMyIHNldF92YWwpCit7CisJdTMyIHJlZ192YWw7CisKKwlyZWdfdmFsID0gcmVhZGwocmVnKTsKKwlyZWdfdmFsIHw9IHNldF92YWw7CisJd3JpdGVsKHJlZ192YWwsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1bnhpX2NscnNldGJpdHModm9pZCBfX2lvbWVtICpyZWcsIHUzMiBjbHJfdmFsLCB1MzIgc2V0X3ZhbCkKK3sKKwl1MzIgcmVnX3ZhbDsKKworCXJlZ192YWwgPSByZWFkbChyZWcpOworCXJlZ192YWwgJj0gfihjbHJfdmFsKTsKKwlyZWdfdmFsIHw9IHNldF92YWw7CisJd3JpdGVsKHJlZ192YWwsIHJlZyk7Cit9CisKK3N0YXRpYyB1MzIgc3VueGlfZ2V0Yml0cyh2b2lkIF9faW9tZW0gKnJlZywgdTggbWFzaywgdTggc2hpZnQpCit7CisJcmV0dXJuIChyZWFkbChyZWcpID4+IHNoaWZ0KSAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgYWhjaV9zdW54aV9waHlfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UpCit7CisJdTMyIHJlZ192YWw7CisJaW50IHRpbWVvdXQ7CisKKwkvKiBUaGlzIG1hZ2ljIGlzIGZyb20gdGhlIG9yaWdpbmFsIGNvZGUgKi8KKwl3cml0ZWwoMCwgcmVnX2Jhc2UgKyBBSENJX1JXQ1IpOworCW1zbGVlcCg1KTsKKworCXN1bnhpX3NldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMVIsIEJJVCgxOSkpOworCXN1bnhpX2NscnNldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMFIsCisJCQkgKDB4NyA8PCAyNCksCisJCQkgKDB4NSA8PCAyNCkgfCBCSVQoMjMpIHwgQklUKDE4KSk7CisJc3VueGlfY2xyc2V0Yml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MxUiwKKwkJCSAoMHgzIDw8IDE2KSB8ICgweDFmIDw8IDgpIHwgKDB4MyA8PCA2KSwKKwkJCSAoMHgyIDw8IDE2KSB8ICgweDYgPDwgOCkgfCAoMHgyIDw8IDYpKTsKKwlzdW54aV9zZXRiaXRzKHJlZ19iYXNlICsgQUhDSV9QSFlDUzFSLCBCSVQoMjgpIHwgQklUKDE1KSk7CisJc3VueGlfY2xyYml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MxUiwgQklUKDE5KSk7CisJc3VueGlfY2xyc2V0Yml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MwUiwKKwkJCSAoMHg3IDw8IDIwKSwgKDB4MyA8PCAyMCkpOworCXN1bnhpX2NscnNldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMlIsCisJCQkgKDB4MWYgPDwgNSksICgweDE5IDw8IDUpKTsKKwltc2xlZXAoNSk7CisKKwlzdW54aV9zZXRiaXRzKHJlZ19iYXNlICsgQUhDSV9QSFlDUzBSLCAoMHgxIDw8IDE5KSk7CisKKwl0aW1lb3V0ID0gMjUwOyAvKiBQb3dlciB1cCB0YWtlcyBhcHJveCA1MCB1cyAqLworCWRvIHsKKwkJcmVnX3ZhbCA9IHN1bnhpX2dldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMFIsIDB4NywgMjgpOworCQlpZiAocmVnX3ZhbCA9PSAweDAyKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tdGltZW91dCA9PSAwKSB7CisJCQlkZXZfZXJyKGRldiwgIlBIWSBwb3dlciB1cCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgxKTsKKworCXN1bnhpX3NldGJpdHMocmVnX2Jhc2UgKyBBSENJX1BIWUNTMlIsICgweDEgPDwgMjQpKTsKKworCXRpbWVvdXQgPSAxMDA7IC8qIENhbGlicmF0aW9uIHRha2VzIGFwcm94IDEwIHVzICovCisJZG8geworCQlyZWdfdmFsID0gc3VueGlfZ2V0Yml0cyhyZWdfYmFzZSArIEFIQ0lfUEhZQ1MyUiwgMHgxLCAyNCk7CisJCWlmIChyZWdfdmFsID09IDB4MDApCisJCQlicmVhazsKKworCQlpZiAoLS10aW1lb3V0ID09IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiUEhZIGNhbGlicmF0aW9uIGZhaWxlZC5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJdWRlbGF5KDEpOworCX0gd2hpbGUgKDEpOworCisJbXNsZWVwKDE1KTsKKworCXdyaXRlbCgweDcsIHJlZ19iYXNlICsgQUhDSV9SV0NSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaGNpX3N1bnhpX3N0YXJ0X2VuZ2luZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCisJLyogU2V0dXAgRE1BIGJlZm9yZSBETUEgc3RhcnQgKi8KKwlzdW54aV9jbHJzZXRiaXRzKGhwcml2LT5tbWlvICsgQUhDSV9QMERNQUNSLCAweDAwMDBmZjAwLCAweDAwMDA0NDAwKTsKKworCS8qIFN0YXJ0IERNQSAqLworCXN1bnhpX3NldGJpdHMocG9ydF9tbWlvICsgUE9SVF9DTUQsIFBPUlRfQ01EX1NUQVJUKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGFoY2lfc3VueGlfcG9ydF9pbmZvID0geworCUFIQ0lfSEZMQUdTKEFIQ0lfSEZMQUdfMzJCSVRfT05MWSB8IEFIQ0lfSEZMQUdfTk9fTVNJIHwKKwkJCSAgQUhDSV9IRkxBR19OT19QTVAgfCBBSENJX0hGTEFHX1lFU19OQ1EpLAorCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OIHwgQVRBX0ZMQUdfTkNRLAorCS5waW9fbWFzawk9IEFUQV9QSU80LAorCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCisJLnBvcnRfb3BzCT0gJmFoY2lfcGxhdGZvcm1fb3BzLAorfTsKKworc3RhdGljIGludCBhaGNpX3N1bnhpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2OworCWludCByYzsKKworCWhwcml2ID0gYWhjaV9wbGF0Zm9ybV9nZXRfcmVzb3VyY2VzKHBkZXYpOworCWlmIChJU19FUlIoaHByaXYpKQorCQlyZXR1cm4gUFRSX0VSUihocHJpdik7CisKKwlocHJpdi0+c3RhcnRfZW5naW5lID0gYWhjaV9zdW54aV9zdGFydF9lbmdpbmU7CisKKwlyYyA9IGFoY2lfcGxhdGZvcm1fZW5hYmxlX3Jlc291cmNlcyhocHJpdik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGFoY2lfc3VueGlfcGh5X2luaXQoZGV2LCBocHJpdi0+bW1pbyk7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCisJcmMgPSBhaGNpX3BsYXRmb3JtX2luaXRfaG9zdChwZGV2LCBocHJpdiwgJmFoY2lfc3VueGlfcG9ydF9pbmZvLCAwLCAwKTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9yZXNvdXJjZXM6CisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGFoY2lfc3VueGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCWludCByYzsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gYWhjaV9zdW54aV9waHlfaW5pdChkZXYsIGhwcml2LT5tbWlvKTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlyYyA9IGFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3QoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9yZXNvdXJjZXM6CisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7CisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhaGNpX3N1bnhpX3BtX29wcywgYWhjaV9wbGF0Zm9ybV9zdXNwZW5kLAorCQkJIGFoY2lfc3VueGlfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWhjaV9zdW54aV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1haGNpIiwgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWhjaV9zdW54aV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFoY2lfc3VueGlfZHJpdmVyID0geworCS5wcm9iZSA9IGFoY2lfc3VueGlfcHJvYmUsCisJLnJlbW92ZSA9IGF0YV9wbGF0Zm9ybV9yZW1vdmVfb25lLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFoY2ktc3VueGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gYWhjaV9zdW54aV9vZl9tYXRjaCwKKwkJLnBtID0gJmFoY2lfc3VueGlfcG1fb3BzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhaGNpX3N1bnhpX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQWxsd2lubmVyIHN1bnhpIEFIQ0kgU0FUQSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk9sbGl2ZXIgU2NoaW5hZ2wgPG9saXZlckBzY2hpbmFnbC5ubD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2lfeGdlbmUuYyBiL2RyaXZlcnMvYXRhL2FoY2lfeGdlbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M4OWJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGEvYWhjaV94Z2VuZS5jCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQXBwbGllZE1pY3JvIFgtR2VuZSBTb0MgU0FUQSBIb3N0IENvbnRyb2xsZXIgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBBcHBsaWVkIE1pY3JvIENpcmN1aXRzIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IExvYyBIbyA8bGhvQGFwbS5jb20+CisgKiAgICAgICAgIFR1YW4gUGhhbiA8dHBoYW5AYXBtLmNvbT4KKyAqICAgICAgICAgU3VtYW4gVHJpcGF0aGkgPHN0cmlwYXRoaUBhcG0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogTk9URTogUE0gc3VwcG9ydCBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9haGNpX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlICJhaGNpLmgiCisKKy8qIE1heCAjIG9mIGRpc2sgcGVyIGEgY29udHJvbGxlciAqLworI2RlZmluZSBNQVhfQUhDSV9DSE5fUEVSQ1RSCQkyCisKKy8qIE1VWCBDU1IgKi8KKyNkZWZpbmUgU0FUQV9FTkVUX0NPTkZJR19SRUcJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIENGR19TQVRBX0VORVRfU0VMRUNUX01BU0sJMHgwMDAwMDAwMQorCisvKiBTQVRBIGNvcmUgaG9zdCBjb250cm9sbGVyIENTUiAqLworI2RlZmluZSBTTFZSREVSUkFUVFJJQlVURVMJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU0xWV1JFUlJBVFRSSUJVVEVTCQkweDAwMDAwMDA0CisjZGVmaW5lIE1TVFJERVJSQVRUUklCVVRFUwkJMHgwMDAwMDAwOAorI2RlZmluZSBNU1RXUkVSUkFUVFJJQlVURVMJCTB4MDAwMDAwMGMKKyNkZWZpbmUgQlVTQ1RMUkVHCQkJMHgwMDAwMDAxNAorI2RlZmluZSBJT0ZNU1RSV0FVWAkJCTB4MDAwMDAwMTgKKyNkZWZpbmUgSU5UU1RBVFVTTUFTSwkJCTB4MDAwMDAwMmMKKyNkZWZpbmUgRVJSSU5UU1RBVFVTCQkJMHgwMDAwMDAzMAorI2RlZmluZSBFUlJJTlRTVEFUVVNNQVNLCQkweDAwMDAwMDM0CisKKy8qIFNBVEEgaG9zdCBBSENJIENTUiAqLworI2RlZmluZSBQT1JUQ0ZHCQkJCTB4MDAwMDAwYTQKKyNkZWZpbmUgIFBPUlRBRERSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwM2YpIHwgKCgodTMyKShzcmMpKSAmIDB4MDAwMDAwM2YpKQorI2RlZmluZSBQT1JUUEhZMUNGRwkJMHgwMDAwMDBhOAorI2RlZmluZSBQT1JUUEhZMUNGR19GUkNQSFlSRFlfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDEwMDAwMCkgfCAoKCh1MzIpKHNyYykgPDwgMHgxNCkgJiAweDAwMTAwMDAwKSkKKyNkZWZpbmUgUE9SVFBIWTJDRkcJCQkweDAwMDAwMGFjCisjZGVmaW5lIFBPUlRQSFkzQ0ZHCQkJMHgwMDAwMDBiMAorI2RlZmluZSBQT1JUUEhZNENGRwkJCTB4MDAwMDAwYjQKKyNkZWZpbmUgUE9SVFBIWTVDRkcJCQkweDAwMDAwMGI4CisjZGVmaW5lIFNDVEwwCQkJCTB4MDAwMDAxMkMKKyNkZWZpbmUgUE9SVFBIWTVDRkdfUlRDSEdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHhmZmYwMDAwMCkgfCAoKCh1MzIpKHNyYykgPDwgMHgxNCkgJiAweGZmZjAwMDAwKSkKKyNkZWZpbmUgUE9SVEFYSUNGR19FTl9DT05URVhUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDEwMDAwMDApIHwgKCgodTMyKShzcmMpIDw8IDB4MTgpICYgMHgwMTAwMDAwMCkpCisjZGVmaW5lIFBPUlRBWElDRkcJCQkweDAwMDAwMGJjCisjZGVmaW5lIFBPUlRBWElDRkdfT1VUVFJBTlNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMGYwMDAwMCkgfCAoKCh1MzIpKHNyYykgPDwgMHgxNCkgJiAweDAwZjAwMDAwKSkKKworLyogU0FUQSBob3N0IGNvbnRyb2xsZXIgQVhJIENTUiAqLworI2RlZmluZSBJTlRfU0xWX1RNT01BU0sJCQkweDAwMDAwMDEwCisKKy8qIFNBVEEgZGlhZ25vc3RpYyBDU1IgKi8KKyNkZWZpbmUgQ0ZHX01FTV9SQU1fU0hVVERPV04JCTB4MDAwMDAwNzAKKyNkZWZpbmUgQkxPQ0tfTUVNX1JEWQkJCTB4MDAwMDAwNzQKKworc3RydWN0IHhnZW5lX2FoY2lfY29udGV4dCB7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICpjc3JfY29yZTsJCS8qIENvcmUgQ1NSIGFkZHJlc3Mgb2YgSVAgKi8KKwl2b2lkIF9faW9tZW0gKmNzcl9kaWFnOwkJLyogRGlhZyBDU1IgYWRkcmVzcyBvZiBJUCAqLworCXZvaWQgX19pb21lbSAqY3NyX2F4aTsJCS8qIEFYSSBDU1IgYWRkcmVzcyBvZiBJUCAqLworCXZvaWQgX19pb21lbSAqY3NyX211eDsJCS8qIE1VWCBDU1IgYWRkcmVzcyBvZiBJUCAqLworfTsKKworc3RhdGljIGludCB4Z2VuZV9haGNpX2luaXRfbWVtcmFtKHN0cnVjdCB4Z2VuZV9haGNpX2NvbnRleHQgKmN0eCkKK3sKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUmVsZWFzZSBtZW1vcnkgZnJvbSBzaHV0ZG93blxuIik7CisJd3JpdGVsKDB4MCwgY3R4LT5jc3JfZGlhZyArIENGR19NRU1fUkFNX1NIVVRET1dOKTsKKwlyZWFkbChjdHgtPmNzcl9kaWFnICsgQ0ZHX01FTV9SQU1fU0hVVERPV04pOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwltc2xlZXAoMSk7CS8qIHJlc2V0IG1heSB0YWtlIHVwIHRvIDFtcyAqLworCWlmIChyZWFkbChjdHgtPmNzcl9kaWFnICsgQkxPQ0tfTUVNX1JEWSkgIT0gMHhGRkZGRkZGRikgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiZmFpbGVkIHRvIHJlbGVhc2UgbWVtb3J5IGZyb20gc2h1dGRvd25cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogeGdlbmVfYWhjaV9yZWFkX2lkIC0gUmVhZCBJRCBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBkZXZpY2UKKyAqIEBkZXY6IGRldmljZQorICogQHRmOiBwcm9wb3NlZCB0YXNrZmlsZQorICogQGlkOiBkYXRhIGJ1ZmZlcgorICoKKyAqIFRoaXMgY3VzdG9tIHJlYWQgSUQgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIEhXCisgKiBkb2VzIG5vdCBzdXBwb3J0IERFVlNMUCBhbmQgdGhlIGNvbnRyb2xsZXIgc3RhdGUgbWFjaGluZSBtYXkgZ2V0IHN0dWNrCisgKiBhZnRlciBwcm9jZXNzaW5nIHRoZSBJRCBxdWVyeSBjb21tYW5kLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHhnZW5lX2FoY2lfcmVhZF9pZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTE2ICppZCkKK3sKKwl1MzIgZXJyX21hc2s7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShkZXYtPmxpbmstPmFwKTsKKworCWVycl9tYXNrID0gYXRhX2RvX2Rldl9yZWFkX2lkKGRldiwgdGYsIGlkKTsKKwlpZiAoZXJyX21hc2spCisJCXJldHVybiBlcnJfbWFzazsKKworCS8qCisJICogTWFzayByZXNlcnZlZCBhcmVhLiBXb3JkNzggc3BlYyBvZiBMaW5rIFBvd2VyIE1hbmFnZW1lbnQKKwkgKiBiaXQxNS04OiByZXNlcnZlZAorCSAqIGJpdDc6IE5DUSBhdXRvc2VuY2UKKwkgKiBiaXQ2OiBTb2Z0d2FyZSBzZXR0aW5ncyBwcmVzZXJ2YXRpb24gc3VwcG9ydGVkCisJICogYml0NTogcmVzZXJ2ZWQKKwkgKiBiaXQ0OiBJbi1vcmRlciBzYXRhIGRlbGl2ZXJ5IHN1cHBvcnRlZAorCSAqIGJpdDM6IERJUE0gcmVxdWVzdHMgc3VwcG9ydGVkCisJICogYml0MjogRE1BIFNldHVwIEZJUyBBdXRvLUFjdGl2YXRlIG9wdGltaXphdGlvbiBzdXBwb3J0ZWQKKwkgKiBiaXQxOiBETUEgU2V0dXAgRklYIG5vbi1aZXJvIGJ1ZmZlciBvZmZzZXRzIHN1cHBvcnRlZAorCSAqIGJpdDA6IFJlc2VydmVkCisJICoKKwkgKiBDbGVhciByZXNlcnZlZCBiaXQgOCAoREVWU0xQIGJpdCkgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBERVZTTFAKKwkgKi8KKwlpZFtBVEFfSURfRkVBVFVSRV9TVVBQXSAmPSB+KDEgPDwgOCk7CisKKwkvKgorCSAqIER1ZSB0byBIVyBlcnJhdGEsIHJlc3RhcnQgdGhlIHBvcnQgaWYgbm8gb3RoZXIgY29tbWFuZCBhY3RpdmUuCisJICogT3RoZXJ3aXNlIHRoZSBjb250cm9sbGVyIG1heSBnZXQgc3R1Y2suCisJICovCisJaWYgKCFyZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSkpIHsKKwkJd3JpdGVsKFBPUlRfQ01EX0ZJU19SWCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQlyZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7CS8qIEZvcmNlIGEgYmFycmllciAqLworCQl3cml0ZWwoUE9SVF9DTURfRklTX1JYIHwgUE9SVF9DTURfU1RBUlQsIHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOwkvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2FoY2lfc2V0X3BoeV9jZmcoc3RydWN0IHhnZW5lX2FoY2lfY29udGV4dCAqY3R4LCBpbnQgY2hhbm5lbCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBjdHgtPmhwcml2LT5tbWlvOworCXUzMiB2YWw7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAicG9ydCBjb25maWd1cmUgbW1pbyAweCVwIGNoYW5uZWwgJWRcbiIsCisJCW1taW8sIGNoYW5uZWwpOworCXZhbCA9IHJlYWRsKG1taW8gKyBQT1JUQ0ZHKTsKKwl2YWwgPSBQT1JUQUREUl9TRVQodmFsLCBjaGFubmVsID09IDAgPyAyIDogMyk7CisJd3JpdGVsKHZhbCwgbW1pbyArIFBPUlRDRkcpOworCXJlYWRsKG1taW8gKyBQT1JUQ0ZHKTsgIC8qIEZvcmNlIGEgYmFycmllciAqLworCS8qIERpc2FibGUgZml4IHJhdGUgKi8KKwl3cml0ZWwoMHgwMDAxZmZmZSwgbW1pbyArIFBPUlRQSFkxQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTFDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHg1MDE4NDYxYywgbW1pbyArIFBPUlRQSFkyQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTJDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHgxYzA4MTkwNywgbW1pbyArIFBPUlRQSFkzQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTNDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHgxYzA4MDgxNSwgbW1pbyArIFBPUlRQSFk0Q0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTRDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwkvKiBTZXQgd2luZG93IG5lZ290aWF0aW9uICovCisJdmFsID0gcmVhZGwobW1pbyArIFBPUlRQSFk1Q0ZHKTsKKwl2YWwgPSBQT1JUUEhZNUNGR19SVENIR19TRVQodmFsLCAweDMwMCk7CisJd3JpdGVsKHZhbCwgbW1pbyArIFBPUlRQSFk1Q0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVFBIWTVDRkcpOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl2YWwgPSByZWFkbChtbWlvICsgUE9SVEFYSUNGRyk7CisJdmFsID0gUE9SVEFYSUNGR19FTl9DT05URVhUX1NFVCh2YWwsIDB4MSk7IC8qIEVuYWJsZSBjb250ZXh0IG1nbXQgKi8KKwl2YWwgPSBQT1JUQVhJQ0ZHX09VVFRSQU5TX1NFVCh2YWwsIDB4ZSk7IC8qIFNldCBvdXRzdGFuZGluZyAqLworCXdyaXRlbCh2YWwsIG1taW8gKyBQT1JUQVhJQ0ZHKTsKKwlyZWFkbChtbWlvICsgUE9SVEFYSUNGRyk7IC8qIEZvcmNlIGEgYmFycmllciAqLworfQorCisvKioKKyAqIHhnZW5lX2FoY2lfZG9faGFyZHJlc2V0IC0gSXNzdWUgdGhlIGFjdHVhbCBDT01SRVNFVAorICogQGxpbms6IGxpbmsgdG8gcmVzZXQKKyAqIEBkZWFkbGluZTogZGVhZGxpbmUgamlmZmllcyBmb3IgdGhlIG9wZXJhdGlvbgorICogQG9ubGluZTogUmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIGlmIGRldmljZSBvbmxpbmUKKyAqCisgKiBEdWUgdG8gdGhlIGxpbWl0YXRpb24gb2YgdGhlIGhhcmR3YXJlIFBIWSwgYSBkaWZmZXJlbmNlIHNldCBvZiBzZXR0aW5nIGlzCisgKiByZXF1aXJlZCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGlzayBzcGVlZCAtIEdlbjMgKDYuMEdicHMpLCBHZW4yICgzLjBHYnBzKSwKKyAqIGFuZCBHZW4xICgxLjVHYnBzKS4gT3RoZXJ3aXNlIGR1cmluZyBsb25nIElPIHN0cmVzcyB0ZXN0LCB0aGUgUEhZIHdpbGwKKyAqIHJlcG9ydCBkaXNwYXJpdHkgZXJyb3IgYW5kIGV0Yy4gSW4gYWRkaXRpb24sIGR1cmluZyBDT01SRVNFVCwgdGhlcmUgY2FuCisgKiBiZSBlcnJvciByZXBvcnRlZCBpbiB0aGUgcmVnaXN0ZXIgUE9SVF9TQ1JfRVJSLiBGb3IgU0VSUl9ESVNQQVJJVFkgYW5kCisgKiBTRVJSXzEwQl84Ql9FUlIsIHRoZSBQSFkgcmVjZWl2ZXIgbGluZSBtdXN0IGJlIHJlc2V0ZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGFsZ29yaXRobSBpcyBmb2xsb3dlZCB0byBwcm9wZXIgY29uZmlndXJlIHRoZSBoYXJkd2FyZSBQSFkgZHVyaW5nIENPTVJFU0VUOgorICoKKyAqIEFsZyBQYXJ0IDE6CisgKiAxLiBTdGFydCB0aGUgUEhZIGF0IEdlbjMgc3BlZWQgKGRlZmF1bHQgc2V0dGluZykKKyAqIDIuIElzc3VlIHRoZSBDT01SRVNFVAorICogMy4gSWYgbm8gbGluaywgZ28gdG8gQWxnIFBhcnQgMworICogNC4gSWYgbGluayB1cCwgZGV0ZXJtaW5lIGlmIHRoZSBuZWdvdGlhdGVkIHNwZWVkIG1hdGNoZXMgdGhlIFBIWQorICogICAgY29uZmlndXJlZCBzcGVlZAorICogNS4gSWYgdGhleSBtYXRjaGVkLCBnbyB0byBBbGcgUGFydCAyCisgKiA2LiBJZiB0aGV5IGRvIG5vdCBtYXRjaGVkIGFuZCBmaXJzdCB0aW1lLCBjb25maWd1cmUgdGhlIFBIWSBmb3IgdGhlIGxpbmtlZAorICogICAgdXAgZGlzayBzcGVlZCBhbmQgcmVwZWF0IHN0ZXAgMgorICogNy4gR28gdG8gQWxnIFBhcnQgMgorICoKKyAqIEFsZyBQYXJ0IDI6CisgKiAxLiBPbiBsaW5rIHVwLCBpZiB0aGVyZSBhcmUgYW55IFNFUlJfRElTUEFSSVRZIGFuZCBTRVJSXzEwQl84Ql9FUlIgZXJyb3IKKyAqICAgIHJlcG9ydGVkIGluIHRoZSByZWdpc3RlciBQT1JUX1NDUl9FUlIsIHRoZW4gcmVzZXQgdGhlIFBIWSByZWNlaXZlciBsaW5lCisgKiAyLiBHbyB0byBBbGcgUGFydCAzCisgKgorICogQWxnIFBhcnQgMzoKKyAqIDEuIENsZWFyIGFueSBwZW5kaW5nIGZyb20gcmVnaXN0ZXIgUE9SVF9TQ1JfRVJSLgorICoKKyAqIE5PVEU6IEZvciB0aGUgaW5pdGlhbCB2ZXJzaW9uLCB3ZSB3aWxsIE5PVCBzdXBwb3J0IEdlbjEvR2VuMi4gSW4gYWRkaXRpb24KKyAqICAgICAgIGFuZCB1bnRpbCB0aGUgdW5kZXJseWluZyBQSFkgc3VwcG9ydHMgYW4gbWV0aG9kIHRvIHJlc2V0IHRoZSByZWNlaXZlcgorICogICAgICAgbGluZSwgb24gZGV0ZWN0aW9uIG9mIFNFUlJfRElTUEFSSVRZIG9yIFNFUlJfMTBCXzhCX0VSUiBlcnJvcnMsCisgKiAgICAgICBhbiB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkLgorICovCitzdGF0aWMgaW50IHhnZW5lX2FoY2lfZG9faGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCQkgICB1bnNpZ25lZCBsb25nIGRlYWRsaW5lLCBib29sICpvbmxpbmUpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqdGltaW5nID0gc2F0YV9laGNfZGViX3RpbWluZygmbGluay0+ZWhfY29udGV4dCk7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB4Z2VuZV9haGNpX2NvbnRleHQgKmN0eCA9IGhwcml2LT5wbGF0X2RhdGE7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdTggKmQyaF9maXMgPSBwcC0+cnhfZmlzICsgUlhfRklTX0QySF9SRUc7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKwlpbnQgcmM7CisJdTMyIHZhbDsKKworCS8qIGNsZWFyIEQySCByZWNlcHRpb24gYXJlYSB0byBwcm9wZXJseSB3YWl0IGZvciBEMkggRklTICovCisJYXRhX3RmX2luaXQobGluay0+ZGV2aWNlLCAmdGYpOworCXRmLmNvbW1hbmQgPSBBVEFfQlVTWTsKKwlhdGFfdGZfdG9fZmlzKCZ0ZiwgMCwgMCwgZDJoX2Zpcyk7CisJcmMgPSBzYXRhX2xpbmtfaGFyZHJlc2V0KGxpbmssIHRpbWluZywgZGVhZGxpbmUsIG9ubGluZSwKKwkJCQkgYWhjaV9jaGVja19yZWFkeSk7CisKKwl2YWwgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9FUlIpOworCWlmICh2YWwgJiAoU0VSUl9ESVNQQVJJVFkgfCBTRVJSXzEwQl84Ql9FUlIpKQorCQlkZXZfd2FybihjdHgtPmRldiwgImxpbmsgaGFzIGVycm9yXG4iKTsKKworCS8qIGNsZWFyIGFsbCBlcnJvcnMgaWYgYW55IHBlbmRpbmcgKi8KKwl2YWwgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9FUlIpOworCXdyaXRlbCh2YWwsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9oYXJkcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzLAorCQkJCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOworICAgICAgICBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKKwlib29sIG9ubGluZTsKKwlpbnQgcmM7CisJdTMyIHBvcnRjbWRfc2F2ZWQ7CisJdTMyIHBvcnRjbGJfc2F2ZWQ7CisJdTMyIHBvcnRjbGJoaV9zYXZlZDsKKwl1MzIgcG9ydHJ4ZmlzX3NhdmVkOworCXUzMiBwb3J0cnhmaXNoaV9zYXZlZDsKKworCS8qIEFzIGhhcmRyZXNldCByZXNldHMgdGhlc2UgQ1NSLCBzYXZlIGl0IHRvIHJlc3RvcmUgbGF0ZXIgKi8KKwlwb3J0Y21kX3NhdmVkID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXBvcnRjbGJfc2F2ZWQgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsKKwlwb3J0Y2xiaGlfc2F2ZWQgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSX0hJKTsKKwlwb3J0cnhmaXNfc2F2ZWQgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsKKwlwb3J0cnhmaXNoaV9zYXZlZCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfRklTX0FERFJfSEkpOworCisJYWhjaV9zdG9wX2VuZ2luZShhcCk7CisKKwlyYyA9IHhnZW5lX2FoY2lfZG9faGFyZHJlc2V0KGxpbmssIGRlYWRsaW5lLCAmb25saW5lKTsKKworCS8qIEFzIGNvbnRyb2xsZXIgaGFyZHJlc2V0IGNsZWFycyB0aGVtLCByZXN0b3JlIHRoZW0gKi8KKwl3cml0ZWwocG9ydGNtZF9zYXZlZCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXdyaXRlbChwb3J0Y2xiX3NhdmVkLCBwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsKKwl3cml0ZWwocG9ydGNsYmhpX3NhdmVkLCBwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSX0hJKTsKKwl3cml0ZWwocG9ydHJ4ZmlzX3NhdmVkLCBwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsKKwl3cml0ZWwocG9ydHJ4ZmlzaGlfc2F2ZWQsIHBvcnRfbW1pbyArIFBPUlRfRklTX0FERFJfSEkpOworCisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CisKKwlpZiAob25saW5lKQorCQkqY2xhc3MgPSBhaGNpX2Rldl9jbGFzc2lmeShhcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2FoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhocHJpdik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyB4Z2VuZV9haGNpX29wcyA9IHsKKwkuaW5oZXJpdHMgPSAmYWhjaV9vcHMsCisJLmhvc3Rfc3RvcCA9IHhnZW5lX2FoY2lfaG9zdF9zdG9wLAorCS5oYXJkcmVzZXQgPSB4Z2VuZV9haGNpX2hhcmRyZXNldCwKKwkucmVhZF9pZCA9IHhnZW5lX2FoY2lfcmVhZF9pZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB4Z2VuZV9haGNpX3BvcnRfaW5mbyA9IHsKKwlBSENJX0hGTEFHUyhBSENJX0hGTEFHX05PX1BNUCB8IEFIQ0lfSEZMQUdfWUVTX05DUSksCisJLmZsYWdzID0gQUhDSV9GTEFHX0NPTU1PTiB8IEFUQV9GTEFHX05DUSwKKwkucGlvX21hc2sgPSBBVEFfUElPNCwKKwkudWRtYV9tYXNrID0gQVRBX1VETUE2LAorCS5wb3J0X29wcyA9ICZ4Z2VuZV9haGNpX29wcywKK307CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9od19pbml0KHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYpCit7CisJc3RydWN0IHhnZW5lX2FoY2lfY29udGV4dCAqY3R4ID0gaHByaXYtPnBsYXRfZGF0YTsKKwlpbnQgaTsKKwlpbnQgcmM7CisJdTMyIHZhbDsKKworCS8qIFJlbW92ZSBJUCBSQU0gb3V0IG9mIHNodXRkb3duICovCisJcmMgPSB4Z2VuZV9haGNpX2luaXRfbWVtcmFtKGN0eCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FIQ0lfQ0hOX1BFUkNUUjsgaSsrKQorCQl4Z2VuZV9haGNpX3NldF9waHlfY2ZnKGN0eCwgaSk7CisKKwkvKiBBWEkgZGlzYWJsZSBNYXNrICovCisJd3JpdGVsKDB4ZmZmZmZmZmYsIGhwcml2LT5tbWlvICsgSE9TVF9JUlFfU1RBVCk7CisJcmVhZGwoaHByaXYtPm1taW8gKyBIT1NUX0lSUV9TVEFUKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisJd3JpdGVsKDAsIGN0eC0+Y3NyX2NvcmUgKyBJTlRTVEFUVVNNQVNLKTsKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9jb3JlICsgSU5UU1RBVFVTTUFTSyk7IC8qIEZvcmNlIGEgYmFycmllciAqLworCWRldl9kYmcoY3R4LT5kZXYsICJ0b3AgbGV2ZWwgaW50ZXJydXB0IG1hc2sgMHglWCB2YWx1ZSAweCUwOFhcbiIsCisJCUlOVFNUQVRVU01BU0ssIHZhbCk7CisKKwl3cml0ZWwoMHgwLCBjdHgtPmNzcl9jb3JlICsgRVJSSU5UU1RBVFVTTUFTSyk7CisJcmVhZGwoY3R4LT5jc3JfY29yZSArIEVSUklOVFNUQVRVU01BU0spOyAvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwl3cml0ZWwoMHgwLCBjdHgtPmNzcl9heGkgKyBJTlRfU0xWX1RNT01BU0spOworCXJlYWRsKGN0eC0+Y3NyX2F4aSArIElOVF9TTFZfVE1PTUFTSyk7CisKKwkvKiBFbmFibGUgQVhJIEludGVycnVwdCAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBjdHgtPmNzcl9jb3JlICsgU0xWUkRFUlJBVFRSSUJVVEVTKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgY3R4LT5jc3JfY29yZSArIFNMVldSRVJSQVRUUklCVVRFUyk7CisJd3JpdGVsKDB4ZmZmZmZmZmYsIGN0eC0+Y3NyX2NvcmUgKyBNU1RSREVSUkFUVFJJQlVURVMpOworCXdyaXRlbCgweGZmZmZmZmZmLCBjdHgtPmNzcl9jb3JlICsgTVNUV1JFUlJBVFRSSUJVVEVTKTsKKworCS8qIEVuYWJsZSBjb2hlcmVuY3kgKi8KKwl2YWwgPSByZWFkbChjdHgtPmNzcl9jb3JlICsgQlVTQ1RMUkVHKTsKKwl2YWwgJj0gfjB4MDAwMDAwMDI7ICAgICAvKiBFbmFibGUgd3JpdGUgY29oZXJlbmN5ICovCisJdmFsICY9IH4weDAwMDAwMDAxOyAgICAgLyogRW5hYmxlIHJlYWQgY29oZXJlbmN5ICovCisJd3JpdGVsKHZhbCwgY3R4LT5jc3JfY29yZSArIEJVU0NUTFJFRyk7CisKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9jb3JlICsgSU9GTVNUUldBVVgpOworCXZhbCB8PSAoMSA8PCAzKTsgICAgICAgIC8qIEVuYWJsZSByZWFkIGNvaGVyZW5jeSAqLworCXZhbCB8PSAoMSA8PCA5KTsgICAgICAgIC8qIEVuYWJsZSB3cml0ZSBjb2hlcmVuY3kgKi8KKwl3cml0ZWwodmFsLCBjdHgtPmNzcl9jb3JlICsgSU9GTVNUUldBVVgpOworCXZhbCA9IHJlYWRsKGN0eC0+Y3NyX2NvcmUgKyBJT0ZNU1RSV0FVWCk7CisJZGV2X2RiZyhjdHgtPmRldiwgImNvaGVyZW5jeSAweCVYIHZhbHVlIDB4JTA4WFxuIiwKKwkJSU9GTVNUUldBVVgsIHZhbCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9tdXhfc2VsZWN0KHN0cnVjdCB4Z2VuZV9haGNpX2NvbnRleHQgKmN0eCkKK3sKKwl1MzIgdmFsOworCisJLyogQ2hlY2sgZm9yIG9wdGlvbmFsIE1VWCByZXNvdXJjZSAqLworCWlmIChJU19FUlIoY3R4LT5jc3JfbXV4KSkKKwkJcmV0dXJuIDA7CisKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9tdXggKyBTQVRBX0VORVRfQ09ORklHX1JFRyk7CisJdmFsICY9IH5DRkdfU0FUQV9FTkVUX1NFTEVDVF9NQVNLOworCXdyaXRlbCh2YWwsIGN0eC0+Y3NyX211eCArIFNBVEFfRU5FVF9DT05GSUdfUkVHKTsKKwl2YWwgPSByZWFkbChjdHgtPmNzcl9tdXggKyBTQVRBX0VORVRfQ09ORklHX1JFRyk7CisJcmV0dXJuIHZhbCAmIENGR19TQVRBX0VORVRfU0VMRUNUX01BU0sgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfYWhjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgeGdlbmVfYWhjaV9jb250ZXh0ICpjdHg7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJjOworCisJaHByaXYgPSBhaGNpX3BsYXRmb3JtX2dldF9yZXNvdXJjZXMocGRldik7CisJaWYgKElTX0VSUihocHJpdikpCisJCXJldHVybiBQVFJfRVJSKGhwcml2KTsKKworCWN0eCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJaHByaXYtPnBsYXRfZGF0YSA9IGN0eDsKKwljdHgtPmhwcml2ID0gaHByaXY7CisJY3R4LT5kZXYgPSBkZXY7CisKKwkvKiBSZXRyaWV2ZSB0aGUgSVAgY29yZSByZXNvdXJjZSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJY3R4LT5jc3JfY29yZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihjdHgtPmNzcl9jb3JlKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5jc3JfY29yZSk7CisKKwkvKiBSZXRyaWV2ZSB0aGUgSVAgZGlhZ25vc3RpYyByZXNvdXJjZSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJY3R4LT5jc3JfZGlhZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihjdHgtPmNzcl9kaWFnKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5jc3JfZGlhZyk7CisKKwkvKiBSZXRyaWV2ZSB0aGUgSVAgQVhJIHJlc291cmNlICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAzKTsKKwljdHgtPmNzcl9heGkgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoY3R4LT5jc3JfYXhpKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5jc3JfYXhpKTsKKworCS8qIFJldHJpZXZlIHRoZSBvcHRpb25hbCBJUCBtdXggcmVzb3VyY2UgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDQpOworCWN0eC0+Y3NyX211eCA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisKKwlkZXZfZGJnKGRldiwgIlZBZGRyIDB4JXAgTW1pbyBWQWRkciAweCVwXG4iLCBjdHgtPmNzcl9jb3JlLAorCQlocHJpdi0+bW1pbyk7CisKKwkvKiBTZWxlY3QgQVRBICovCisJaWYgKChyYyA9IHhnZW5lX2FoY2lfbXV4X3NlbGVjdChjdHgpKSkgeworCQlkZXZfZXJyKGRldiwgIlNBVEEgbXV4IHNlbGVjdGlvbiBmYWlsZWQgZXJyb3IgJWRcbiIsIHJjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRHVlIHRvIGVycmF0YSwgSFcgcmVxdWlyZXMgZnVsbCB0b2dnbGUgdHJhbnNpdGlvbiAqLworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfY2xrcyhocHJpdik7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKGhwcml2KTsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlpZiAocmMpCisJCWdvdG8gZGlzYWJsZV9yZXNvdXJjZXM7CisKKwkvKiBDb25maWd1cmUgdGhlIGhvc3QgY29udHJvbGxlciAqLworCXhnZW5lX2FoY2lfaHdfaW5pdChocHJpdik7CisKKwkvKgorCSAqIFNldHVwIERNQSBtYXNrLiBUaGlzIGlzIHByZWxpbWluYXJ5IHVudGlsIHRoZSBETUEgcmFuZ2UgaXMgc29ydGVkCisJICogb3V0LgorCSAqLworCXJjID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBzZXQgZG1hIG1hc2tcbiIpOworCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCX0KKworCXJjID0gYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QocGRldiwgaHByaXYsICZ4Z2VuZV9haGNpX3BvcnRfaW5mbywgMCwgMCk7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCisJZGV2X2RiZyhkZXYsICJYLUdlbmUgU0FUQSBob3N0IGNvbnRyb2xsZXIgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworCitkaXNhYmxlX3Jlc291cmNlczoKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnZW5lX2FoY2lfb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWFoY2kifSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4Z2VuZV9haGNpX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGdlbmVfYWhjaV9kcml2ZXIgPSB7CisJLnByb2JlID0geGdlbmVfYWhjaV9wcm9iZSwKKwkucmVtb3ZlID0gYXRhX3BsYXRmb3JtX3JlbW92ZV9vbmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGdlbmUtYWhjaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB4Z2VuZV9haGNpX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHhnZW5lX2FoY2lfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUE0gWC1HZW5lIEFIQ0kgU0FUQSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxvYyBIbyA8bGhvQGFwbS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC40Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwppbmRleCA3ZDE5NjY1Li45NDk4YTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYWhjaS5jIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCmluZGV4IDM2NjA1YWIuLjZiZDRmNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhaGNpLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM5NCw2ICszOTMsOSBAQAogICoKICAqCUlmIGluY29uc2lzdGVudCwgY29uZmlnIHZhbHVlcyBhcmUgZml4ZWQgdXAgYnkgdGhpcyBmdW5jdGlvbi4KICAqCisgKglJZiBpdCBpcyBub3Qgc2V0IGFscmVhZHkgdGhpcyBmdW5jdGlvbiBzZXRzIGhwcml2LT5zdGFydF9lbmdpbmUgdG8KKyAqCWFoY2lfc3RhcnRfZW5naW5lLgorICoKICAqCUxPQ0tJTkc6CiAgKglOb25lLgogICovCkBAIC01MDAsNiArNTAyLDkgQEAKIAlocHJpdi0+Y2FwID0gY2FwOwogCWhwcml2LT5jYXAyID0gY2FwMjsKIAlocHJpdi0+cG9ydF9tYXAgPSBwb3J0X21hcDsKKworCWlmICghaHByaXYtPnN0YXJ0X2VuZ2luZSkKKwkJaHByaXYtPnN0YXJ0X2VuZ2luZSA9IGFoY2lfc3RhcnRfZW5naW5lOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9zYXZlX2luaXRpYWxfY29uZmlnKTsKIApAQCAtNzY2LDcgKzc3MSw3IEBACiAKIAkvKiBlbmFibGUgRE1BICovCiAJaWYgKCEoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19ERUxBWV9FTkdJTkUpKQotCQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCiAJLyogdHVybiBvbiBMRURzICovCiAJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0VNKSB7CkBAIC0xMDMyLDEyICsxMDM3LDEzIEBACiBzdGF0aWMgc3NpemVfdCBhaGNpX2xlZF9zdG9yZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCBjaGFyICpidWYsCiAJCQkJc2l6ZV90IHNpemUpCiB7Ci0JaW50IHN0YXRlOworCXVuc2lnbmVkIGludCBzdGF0ZTsKIAlpbnQgcG1wOwogCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBhaGNpX2VtX3ByaXYgKmVtcDsKIAotCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwlpZiAoa3N0cnRvdWludChidWYsIDAsICZzdGF0ZSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGdldCB0aGUgc2xvdCBudW1iZXIgZnJvbSB0aGUgbWVzc2FnZSAqLwogCXBtcCA9IChzdGF0ZSAmIEVNX01TR19MRURfUE1QX1NMT1QpID4+IDg7CkBAIC0xMjM0LDcgKzEyNDAsNyBAQAogCiAJLyogcmVzdGFydCBlbmdpbmUgKi8KICBvdXRfcmVzdGFydDoKLQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9raWNrX2VuZ2luZSk7CkBAIC0xMzg3LDggKzEzOTMsOCBAQAogCXJldHVybiBhdGFfY2hlY2tfcmVhZHkoc3RhdHVzKTsKIH0KIAotaW50IGFoY2lfcG1wX3JldHJ5X3NvZnRyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MsCi0JCQkJdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3N0YXRpYyBpbnQgYWhjaV9wbXBfcmV0cnlfc29mdHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CkBAIC0xNDI2LDYgKzE0MzIsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRpbWluZyA9IHNhdGFfZWhjX2RlYl90aW1pbmcoJmxpbmstPmVoX2NvbnRleHQpOwogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl1OCAqZDJoX2ZpcyA9IHBwLT5yeF9maXMgKyBSWF9GSVNfRDJIX1JFRzsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCWJvb2wgb25saW5lOwpAQCAtMTQ0Myw3ICsxNDUwLDcgQEAKIAlyYyA9IHNhdGFfbGlua19oYXJkcmVzZXQobGluaywgdGltaW5nLCBkZWFkbGluZSwgJm9ubGluZSwKIAkJCQkgYWhjaV9jaGVja19yZWFkeSk7CiAKLQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJaHByaXYtPnN0YXJ0X2VuZ2luZShhcCk7CiAKIAlpZiAob25saW5lKQogCQkqY2xhc3MgPSBhaGNpX2Rldl9jbGFzc2lmeShhcCk7CkBAIC0xNjI5LDcgKzE2MzYsNyBAQAogCX0KIAogCWlmIChpcnFfc3RhdCAmIFBPUlRfSVJRX1VOS19GSVMpIHsKLQkJdTMyICp1bmsgPSAodTMyICopKHBwLT5yeF9maXMgKyBSWF9GSVNfVU5LKTsKKwkJdTMyICp1bmsgPSBwcC0+cnhfZmlzICsgUlhfRklTX1VOSzsKIAogCQlhY3RpdmVfZWhpLT5lcnJfbWFzayB8PSBBQ19FUlJfSFNNOwogCQlhY3RpdmVfZWhpLT5hY3Rpb24gfD0gQVRBX0VIX1JFU0VUOwpAQCAtMjAwNywxMCArMjAxNCwxMiBAQAogCiB2b2lkIGFoY2lfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogeworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCiAJaWYgKCEoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19GUk9aRU4pKSB7CiAJCS8qIHJlc3RhcnQgZW5naW5lICovCiAJCWFoY2lfc3RvcF9lbmdpbmUoYXApOwotCQlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CisJCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCX0KIAogCXNhdGFfcG1wX2Vycm9yX2hhbmRsZXIoYXApOwpAQCAtMjAzMSw2ICsyMDQwLDcgQEAKIAogc3RhdGljIHZvaWQgYWhjaV9zZXRfYWdncmVzc2l2ZV9kZXZzbHAoc3RydWN0IGF0YV9wb3J0ICphcCwgYm9vbCBzbGVlcCkKIHsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gYXAtPmxpbmsuZGV2aWNlOwogCXUzMiBkZXZzbHAsIGRtLCBkaXRvLCBtZGF0LCBkZXRvOwpAQCAtMjA5NCw3ICsyMTA0LDcgQEAKIAkJICAgUE9SVF9ERVZTTFBfQURTRSk7CiAJd3JpdGVsKGRldnNscCwgcG9ydF9tbWlvICsgUE9SVF9ERVZTTFApOwogCi0JYWhjaV9zdGFydF9lbmdpbmUoYXApOworCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCiAJLyogZW5hYmxlIGRldmljZSBzbGVlcCBmZWF0dXJlIGZvciB0aGUgZHJpdmUgKi8KIAllcnJfbWFzayA9IGF0YV9kZXZfc2V0X2ZlYXR1cmUoZGV2LApAQCAtMjEwNiw2ICsyMTE2LDcgQEAKIAogc3RhdGljIHZvaWQgYWhjaV9lbmFibGVfZmJzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CiAJdTMyIGZiczsKQEAgLTIxMzQsMTEgKzIxNDUsMTIgQEAKIAl9IGVsc2UKIAkJZGV2X2VycihhcC0+aG9zdC0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBGQlNcbiIpOwogCi0JYWhjaV9zdGFydF9lbmdpbmUoYXApOworCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogfQogCiBzdGF0aWMgdm9pZCBhaGNpX2Rpc2FibGVfZmJzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CiAJdTMyIGZiczsKQEAgLTIxNjYsNyArMjE3OCw3IEBACiAJCXBwLT5mYnNfZW5hYmxlZCA9IGZhbHNlOwogCX0KIAotCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKKwlocHJpdi0+c3RhcnRfZW5naW5lKGFwKTsKIH0KIAogc3RhdGljIHZvaWQgYWhjaV9wbXBfYXR0YWNoKHN0cnVjdCBhdGFfcG9ydCAqYXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhaGNpX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2F0YS9saWJhaGNpX3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiM2E4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL2xpYmFoY2lfcGxhdGZvcm0uYwpAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqIEFIQ0kgU0FUQSBwbGF0Zm9ybSBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSAgUmVkIEhhdCwgSW5jLgorICogICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgKiBDb3B5cmlnaHQgMjAxMCAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgTExDLgorICogICBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L2FoY2lfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgImFoY2kuaCIKKworc3RhdGljIHZvaWQgYWhjaV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKKworc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWhjaV9wbGF0Zm9ybV9vcHMgPSB7CisJLmluaGVyaXRzCT0gJmFoY2lfb3BzLAorCS5ob3N0X3N0b3AJPSBhaGNpX2hvc3Rfc3RvcCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX29wcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFoY2lfcGxhdGZvcm1fc2h0ID0geworCUFIQ0lfU0hUKCJhaGNpX3BsYXRmb3JtIiksCit9OworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZW5hYmxlX2Nsa3MgLSBFbmFibGUgcGxhdGZvcm0gY2xvY2tzCisgKiBAaHByaXY6IGhvc3QgcHJpdmF0ZSBhcmVhIHRvIHN0b3JlIGNvbmZpZyB2YWx1ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgYWxsIHRoZSBjbGtzIGZvdW5kIGluIGhwcml2LT5jbGtzLCBzdGFydGluZyBhdAorICogaW5kZXggMC4gSWYgYW55IGNsayBmYWlscyB0byBlbmFibGUgaXQgZGlzYWJsZXMgYWxsIHRoZSBjbGtzIGFscmVhZHkKKyAqIGVuYWJsZWQgaW4gcmV2ZXJzZSBvcmRlciwgYW5kIHRoZW4gcmV0dXJucyBhbiBlcnJvci4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fZW5hYmxlX2Nsa3Moc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKK3sKKwlpbnQgYywgcmM7CisKKwlmb3IgKGMgPSAwOyBjIDwgQUhDSV9NQVhfQ0xLUyAmJiBocHJpdi0+Y2xrc1tjXTsgYysrKSB7CisJCXJjID0gY2xrX3ByZXBhcmVfZW5hYmxlKGhwcml2LT5jbGtzW2NdKTsKKwkJaWYgKHJjKQorCQkJZ290byBkaXNhYmxlX3VucHJlcGFyZV9jbGs7CisJfQorCXJldHVybiAwOworCitkaXNhYmxlX3VucHJlcGFyZV9jbGs6CisJd2hpbGUgKC0tYyA+PSAwKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaHByaXYtPmNsa3NbY10pOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fZW5hYmxlX2Nsa3MpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzIC0gRGlzYWJsZSBwbGF0Zm9ybSBjbG9ja3MKKyAqIEBocHJpdjogaG9zdCBwcml2YXRlIGFyZWEgdG8gc3RvcmUgY29uZmlnIHZhbHVlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgYWxsIHRoZSBjbGtzIGZvdW5kIGluIGhwcml2LT5jbGtzLCBpbiByZXZlcnNlCisgKiBvcmRlciBvZiBhaGNpX3BsYXRmb3JtX2VuYWJsZV9jbGtzIChzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSkuCisgKi8KK3ZvaWQgYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX2Nsa3Moc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKK3sKKwlpbnQgYzsKKworCWZvciAoYyA9IEFIQ0lfTUFYX0NMS1MgLSAxOyBjID49IDA7IGMtLSkKKwkJaWYgKGhwcml2LT5jbGtzW2NdKQorCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhwcml2LT5jbGtzW2NdKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKTsKKworLyoqCisgKiBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMgLSBFbmFibGUgcGxhdGZvcm0gcmVzb3VyY2VzCisgKiBAaHByaXY6IGhvc3QgcHJpdmF0ZSBhcmVhIHRvIHN0b3JlIGNvbmZpZyB2YWx1ZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgYWxsIGFoY2lfcGxhdGZvcm0gbWFuYWdlZCByZXNvdXJjZXMgaW4gdGhlCisgKiBmb2xsb3dpbmcgb3JkZXI6CisgKiAxKSBSZWd1bGF0b3IKKyAqIDIpIENsb2NrcyAodGhyb3VnaCBhaGNpX3BsYXRmb3JtX2VuYWJsZV9jbGtzKQorICogMykgUGh5CisgKgorICogSWYgcmVzb3VyY2UgZW5hYmxpbmcgZmFpbHMgYXQgYW55IHBvaW50IHRoZSBwcmV2aW91cyBlbmFibGVkIHJlc291cmNlcworICogYXJlIGRpc2FibGVkIGluIHJldmVyc2Ugb3JkZXIuCisgKgorICogUkVUVVJOUzoKKyAqIDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK2ludCBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKK3sKKwlpbnQgcmM7CisKKwlpZiAoaHByaXYtPnRhcmdldF9wd3IpIHsKKwkJcmMgPSByZWd1bGF0b3JfZW5hYmxlKGhwcml2LT50YXJnZXRfcHdyKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfY2xrcyhocHJpdik7CisJaWYgKHJjKQorCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yOworCisJaWYgKGhwcml2LT5waHkpIHsKKwkJcmMgPSBwaHlfaW5pdChocHJpdi0+cGh5KTsKKwkJaWYgKHJjKQorCQkJZ290byBkaXNhYmxlX2Nsa3M7CisKKwkJcmMgPSBwaHlfcG93ZXJfb24oaHByaXYtPnBoeSk7CisJCWlmIChyYykgeworCQkJcGh5X2V4aXQoaHByaXYtPnBoeSk7CisJCQlnb3RvIGRpc2FibGVfY2xrczsKKwkJfQorCX0KKworCXJldHVybiAwOworCitkaXNhYmxlX2Nsa3M6CisJYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX2Nsa3MoaHByaXYpOworCitkaXNhYmxlX3JlZ3VsYXRvcjoKKwlpZiAoaHByaXYtPnRhcmdldF9wd3IpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGhwcml2LT50YXJnZXRfcHdyKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMgLSBEaXNhYmxlIHBsYXRmb3JtIHJlc291cmNlcworICogQGhwcml2OiBob3N0IHByaXZhdGUgYXJlYSB0byBzdG9yZSBjb25maWcgdmFsdWVzCisgKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBhbGwgYWhjaV9wbGF0Zm9ybSBtYW5hZ2VkIHJlc291cmNlcyBpbiB0aGUKKyAqIGZvbGxvd2luZyBvcmRlcjoKKyAqIDEpIFBoeQorICogMikgQ2xvY2tzICh0aHJvdWdoIGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKQorICogMykgUmVndWxhdG9yCisgKi8KK3ZvaWQgYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyhzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQoreworCWlmIChocHJpdi0+cGh5KSB7CisJCXBoeV9wb3dlcl9vZmYoaHByaXYtPnBoeSk7CisJCXBoeV9leGl0KGhwcml2LT5waHkpOworCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9jbGtzKGhwcml2KTsKKworCWlmIChocHJpdi0+dGFyZ2V0X3B3cikKKwkJcmVndWxhdG9yX2Rpc2FibGUoaHByaXYtPnRhcmdldF9wd3IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wbGF0Zm9ybV9kaXNhYmxlX3Jlc291cmNlcyk7CisKK3N0YXRpYyB2b2lkIGFoY2lfcGxhdGZvcm1fcHV0X3Jlc291cmNlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gcmVzOworCWludCBjOworCisJaWYgKGhwcml2LT5nb3RfcnVudGltZV9wbSkgeworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCX0KKworCWZvciAoYyA9IDA7IGMgPCBBSENJX01BWF9DTEtTICYmIGhwcml2LT5jbGtzW2NdOyBjKyspCisJCWNsa19wdXQoaHByaXYtPmNsa3NbY10pOworfQorCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyAtIEdldCBwbGF0Zm9ybSByZXNvdXJjZXMKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdG8gZ2V0IHJlc291cmNlcyBmb3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbiBhaGNpX2hvc3RfcHJpdiBzdHJ1Y3QsIGFuZCBnZXRzIHRoZSBmb2xsb3dpbmcKKyAqIHJlc291cmNlcywgc3RvcmluZyBhIHJlZmVyZW5jZSB0byB0aGVtIGluc2lkZSB0aGUgcmV0dXJuZWQgc3RydWN0OgorICoKKyAqIDEpIG1taW8gcmVnaXN0ZXJzIChJT1JFU09VUkNFX01FTSAwLCBtYW5kYXRvcnkpCisgKiAyKSByZWd1bGF0b3IgZm9yIGNvbnRyb2xsaW5nIHRoZSB0YXJnZXRzIHBvd2VyIChvcHRpb25hbCkKKyAqIDMpIDAgLSBBSENJX01BWF9DTEtTIGNsb2NrcywgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXZzIGRldmljZXRyZWUgbm9kZSwKKyAqICAgIG9yIGZvciBub24gZGV2aWNldHJlZSBlbmFibGVkIHBsYXRmb3JtcyBhIHNpbmdsZSBjbG9jaworICoJNCkgcGh5IChvcHRpb25hbCkKKyAqCisgKiBSRVRVUk5TOgorICogVGhlIGFsbG9jYXRlZCBhaGNpX2hvc3RfcHJpdiBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gRVJSX1BUUiB2YWx1ZQorICovCitzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmFoY2lfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IGksIHJjID0gLUVOT01FTTsKKworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoZGV2LCBOVUxMLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlocHJpdiA9IGRldnJlc19hbGxvYyhhaGNpX3BsYXRmb3JtX3B1dF9yZXNvdXJjZXMsIHNpemVvZigqaHByaXYpLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwcml2KQorCQlnb3RvIGVycl9vdXQ7CisKKwlkZXZyZXNfYWRkKGRldiwgaHByaXYpOworCisJaHByaXYtPm1taW8gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LAorCQkJICAgICAgcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKSk7CisJaWYgKElTX0VSUihocHJpdi0+bW1pbykpIHsKKwkJZGV2X2VycihkZXYsICJubyBtbWlvIHNwYWNlXG4iKTsKKwkJcmMgPSBQVFJfRVJSKGhwcml2LT5tbWlvKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWhwcml2LT50YXJnZXRfcHdyID0gZGV2bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKGRldiwgInRhcmdldCIpOworCWlmIChJU19FUlIoaHByaXYtPnRhcmdldF9wd3IpKSB7CisJCXJjID0gUFRSX0VSUihocHJpdi0+dGFyZ2V0X3B3cik7CisJCWlmIChyYyA9PSAtRVBST0JFX0RFRkVSKQorCQkJZ290byBlcnJfb3V0OworCQlocHJpdi0+dGFyZ2V0X3B3ciA9IE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFIQ0lfTUFYX0NMS1M7IGkrKykgeworCQkvKgorCQkgKiBGb3Igbm93IHdlIG11c3QgdXNlIGNsa19nZXQoZGV2LCBOVUxMKSBmb3IgdGhlIGZpcnN0IGNsb2NrLAorCQkgKiBiZWNhdXNlIHNvbWUgcGxhdGZvcm1zIChkYTg1MCwgc3BlYXIxM3h4KSBhcmUgbm90IHlldAorCQkgKiBjb252ZXJ0ZWQgdG8gdXNlIGRldmljZXRyZWUgZm9yIGNsb2Nrcy4gIEZvciBuZXcgcGxhdGZvcm1zCisJCSAqIHRoaXMgaXMgZXF1aXZhbGVudCB0byBvZl9jbGtfZ2V0KGRldi0+b2Zfbm9kZSwgMCkuCisJCSAqLworCQlpZiAoaSA9PSAwKQorCQkJY2xrID0gY2xrX2dldChkZXYsIE5VTEwpOworCQllbHNlCisJCQljbGsgPSBvZl9jbGtfZ2V0KGRldi0+b2Zfbm9kZSwgaSk7CisKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlyYyA9IFBUUl9FUlIoY2xrKTsKKwkJCWlmIChyYyA9PSAtRVBST0JFX0RFRkVSKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCWJyZWFrOworCQl9CisJCWhwcml2LT5jbGtzW2ldID0gY2xrOworCX0KKworCWhwcml2LT5waHkgPSBkZXZtX3BoeV9nZXQoZGV2LCAic2F0YS1waHkiKTsKKwlpZiAoSVNfRVJSKGhwcml2LT5waHkpKSB7CisJCXJjID0gUFRSX0VSUihocHJpdi0+cGh5KTsKKwkJc3dpdGNoIChyYykgeworCQljYXNlIC1FTk9ERVY6CisJCWNhc2UgLUVOT1NZUzoKKwkJCS8qIGNvbnRpbnVlIG5vcm1hbGx5ICovCisJCQlocHJpdi0+cGh5ID0gTlVMTDsKKwkJCWJyZWFrOworCisJCWNhc2UgLUVQUk9CRV9ERUZFUjoKKwkJCWdvdG8gZXJyX291dDsKKworCQlkZWZhdWx0OgorCQkJZGV2X2VycihkZXYsICJjb3VsZG4ndCBnZXQgc2F0YS1waHlcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJaHByaXYtPmdvdF9ydW50aW1lX3BtID0gdHJ1ZTsKKworCWRldnJlc19yZW1vdmVfZ3JvdXAoZGV2LCBOVUxMKTsKKwlyZXR1cm4gaHByaXY7CisKK2Vycl9vdXQ6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoZGV2LCBOVUxMKTsKKwlyZXR1cm4gRVJSX1BUUihyYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX2dldF9yZXNvdXJjZXMpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1faW5pdF9ob3N0IC0gQnJpbmcgdXAgYW4gYWhjaS1wbGF0Zm9ybSBob3N0CisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIgZm9yIHRoZSBob3N0CisgKiBAaHByaXY6IGFoY2ktaG9zdCBwcml2YXRlIGRhdGEgZm9yIHRoZSBob3N0CisgKiBAcGlfdGVtcGxhdGU6IHRlbXBsYXRlIGZvciB0aGUgYXRhX3BvcnRfaW5mbyB0byB1c2UKKyAqIEBmb3JjZV9wb3J0X21hcDogcGFyYW0gcGFzc2VkIHRvIGFoY2lfc2F2ZV9pbml0aWFsX2NvbmZpZworICogQG1hc2tfcG9ydF9tYXA6IHBhcmFtIHBhc3NlZCB0byBhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIHRoZSB1c3VhbCBzdGVwcyBuZWVkZWQgdG8gYnJpbmcgdXAgYW4KKyAqIGFoY2ktcGxhdGZvcm0gaG9zdCwgbm90ZSBhbnkgbmVjZXNzYXJ5IHJlc291cmNlcyAoaWUgY2xrcywgcGh5LCBldGMuKQorICogbXVzdCBiZSBpbml0aWFsaXplZCAvIGVuYWJsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1faW5pdF9ob3N0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGlfdGVtcGxhdGUsCisJCQkgICAgdW5zaWduZWQgaW50IGZvcmNlX3BvcnRfbWFwLAorCQkJICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnRfbWFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSAqcGlfdGVtcGxhdGU7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJaW50IGksIGlycSwgbl9wb3J0cywgcmM7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPD0gMCkgeworCQlkZXZfZXJyKGRldiwgIm5vIGlycVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHByZXBhcmUgaG9zdCAqLworCWhwcml2LT5mbGFncyB8PSAodW5zaWduZWQgbG9uZylwaS5wcml2YXRlX2RhdGE7CisKKwlhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcoZGV2LCBocHJpdiwgZm9yY2VfcG9ydF9tYXAsIG1hc2tfcG9ydF9tYXApOworCisJaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9OQ1EpCisJCXBpLmZsYWdzIHw9IEFUQV9GTEFHX05DUTsKKworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfUE1QKQorCQlwaS5mbGFncyB8PSBBVEFfRkxBR19QTVA7CisKKwlhaGNpX3NldF9lbV9tZXNzYWdlcyhocHJpdiwgJnBpKTsKKworCS8qIENBUC5OUCBzb21ldGltZXMgaW5kaWNhdGUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVuYWJsZWQKKwkgKiBwb3J0LCBhdCBvdGhlciB0aW1lcywgdGhhdCBvZiB0aGUgbGFzdCBwb3NzaWJsZSBwb3J0LCBzbworCSAqIGRldGVybWluaW5nIHRoZSBtYXhpbXVtIHBvcnQgbnVtYmVyIHJlcXVpcmVzIGxvb2tpbmcgYXQKKwkgKiBib3RoIENBUC5OUCBhbmQgcG9ydF9tYXAuCisJICovCisJbl9wb3J0cyA9IG1heChhaGNpX25yX3BvcnRzKGhwcml2LT5jYXApLCBmbHMoaHByaXYtPnBvcnRfbWFwKSk7CisKKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oZGV2LCBwcGksIG5fcG9ydHMpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlob3N0LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCWlmICghKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9TU1MpIHx8IGFoY2lfaWdub3JlX3NzcykKKwkJaG9zdC0+ZmxhZ3MgfD0gQVRBX0hPU1RfUEFSQUxMRUxfU0NBTjsKKwllbHNlCisJCWRldl9pbmZvKGRldiwgIlNTUyBmbGFnIHNldCwgcGFyYWxsZWwgYnVzIHNjYW4gZGlzYWJsZWRcbiIpOworCisJaWYgKHBpLmZsYWdzICYgQVRBX0ZMQUdfRU0pCisJCWFoY2lfcmVzZXRfZW0oaG9zdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKKworCQlhdGFfcG9ydF9kZXNjKGFwLCAibW1pbyAlcFIiLAorCQkJICAgICAgcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKSk7CisJCWF0YV9wb3J0X2Rlc2MoYXAsICJwb3J0IDB4JXgiLCAweDEwMCArIGFwLT5wb3J0X25vICogMHg4MCk7CisKKwkJLyogc2V0IGVuY2xvc3VyZSBtYW5hZ2VtZW50IG1lc3NhZ2UgdHlwZSAqLworCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRU0pCisJCQlhcC0+ZW1fbWVzc2FnZV90eXBlID0gaHByaXYtPmVtX21zZ190eXBlOworCisJCS8qIGRpc2FibGVkL25vdC1pbXBsZW1lbnRlZCBwb3J0ICovCisJCWlmICghKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKKwkJCWFwLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOworCX0KKworCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKGhvc3QpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJYWhjaV9pbml0X2NvbnRyb2xsZXIoaG9zdCk7CisJYWhjaV9wcmludF9pbmZvKGhvc3QsICJwbGF0Zm9ybSIpOworCisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIGlycSwgYWhjaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmYWhjaV9wbGF0Zm9ybV9zaHQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wbGF0Zm9ybV9pbml0X2hvc3QpOworCitzdGF0aWMgdm9pZCBhaGNpX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaG9zdC0+ZGV2OworCXN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCisJCXBkYXRhLT5leGl0KGRldik7CisKKwlhaGNpX3BsYXRmb3JtX2Rpc2FibGVfcmVzb3VyY2VzKGhwcml2KTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorLyoqCisgKiBhaGNpX3BsYXRmb3JtX3N1c3BlbmRfaG9zdCAtIFN1c3BlbmQgYW4gYWhjaS1wbGF0Zm9ybSBob3N0CisgKiBAZGV2OiBkZXZpY2UgcG9pbnRlciBmb3IgdGhlIGhvc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIHRoZSB1c3VhbCBzdGVwcyBuZWVkZWQgdG8gc3VzcGVuZCBhbgorICogYWhjaS1wbGF0Zm9ybSBob3N0LCBub3RlIGFueSBuZWNlc3NhcnkgcmVzb3VyY2VzIChpZSBjbGtzLCBwaHksIGV0Yy4pCisgKiBtdXN0IGJlIGRpc2FibGVkIGFmdGVyIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhwcml2LT5tbWlvOworCXUzMiBjdGw7CisKKwlpZiAoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19TVVNQRU5EKSB7CisJCWRldl9lcnIoZGV2LCAiZmlybXdhcmUgdXBkYXRlIHJlcXVpcmVkIGZvciBzdXNwZW5kL3Jlc3VtZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogQUhDSSBzcGVjIHJldjEuMSBzZWN0aW9uIDguMy4zOgorCSAqIFNvZnR3YXJlIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIHByaW9yIHRvIHJlcXVlc3RpbmcgYQorCSAqIHRyYW5zaXRpb24gb2YgdGhlIEhCQSB0byBEMyBzdGF0ZS4KKwkgKi8KKwljdGwgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOworCWN0bCAmPSB+SE9TVF9JUlFfRU47CisJd3JpdGVsKGN0bCwgbW1pbyArIEhPU1RfQ1RMKTsKKwlyZWFkbChtbWlvICsgSE9TVF9DVEwpOyAvKiBmbHVzaCAqLworCisJcmV0dXJuIGF0YV9ob3N0X3N1c3BlbmQoaG9zdCwgUE1TR19TVVNQRU5EKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KTsKKworLyoqCisgKiBhaGNpX3BsYXRmb3JtX3Jlc3VtZV9ob3N0IC0gUmVzdW1lIGFuIGFoY2ktcGxhdGZvcm0gaG9zdAorICogQGRldjogZGV2aWNlIHBvaW50ZXIgZm9yIHRoZSBob3N0CisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCB0aGUgdXN1YWwgc3RlcHMgbmVlZGVkIHRvIHJlc3VtZSBhbiBhaGNpLXBsYXRmb3JtCisgKiBob3N0LCBub3RlIGFueSBuZWNlc3NhcnkgcmVzb3VyY2VzIChpZSBjbGtzLCBwaHksIGV0Yy4pICBtdXN0IGJlCisgKiBpbml0aWFsaXplZCAvIGVuYWJsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3Qoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByYzsKKworCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKKwkJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIoaG9zdCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlhaGNpX2luaXRfY29udHJvbGxlcihob3N0KTsKKwl9CisKKwlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3QpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fc3VzcGVuZCAtIFN1c3BlbmQgYW4gYWhjaS1wbGF0Zm9ybSBkZXZpY2UKKyAqIEBkZXY6IHRoZSBwbGF0Zm9ybSBkZXZpY2UgdG8gc3VzcGVuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3VzcGVuZHMgdGhlIGhvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UsIGZvbGxvd2VkIGJ5CisgKiBkaXNhYmxpbmcgYWxsIHRoZSByZXNvdXJjZXMgb2YgdGhlIGRldmljZS4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmM7CisKKwlyYyA9IGFoY2lfcGxhdGZvcm1fc3VzcGVuZF9ob3N0KGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPnN1c3BlbmQpIHsKKwkJcmMgPSBwZGF0YS0+c3VzcGVuZChkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIHJlc3VtZV9ob3N0OworCX0KKworCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCisJcmV0dXJuIDA7CisKK3Jlc3VtZV9ob3N0OgorCWFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3QoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BsYXRmb3JtX3N1c3BlbmQpOworCisvKioKKyAqIGFoY2lfcGxhdGZvcm1fcmVzdW1lIC0gUmVzdW1lIGFuIGFoY2ktcGxhdGZvcm0gZGV2aWNlCisgKiBAZGV2OiB0aGUgcGxhdGZvcm0gZGV2aWNlIHRvIHJlc3VtZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBhbGwgdGhlIHJlc291cmNlcyBvZiB0aGUgZGV2aWNlIGZvbGxvd2VkIGJ5CisgKiByZXN1bWluZyB0aGUgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IGFoY2lfcGxhdGZvcm1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCWludCByYzsKKworCXJjID0gYWhjaV9wbGF0Zm9ybV9lbmFibGVfcmVzb3VyY2VzKGhwcml2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwZGF0YSAmJiBwZGF0YS0+cmVzdW1lKSB7CisJCXJjID0gcGRhdGEtPnJlc3VtZShkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIGRpc2FibGVfcmVzb3VyY2VzOworCX0KKworCXJjID0gYWhjaV9wbGF0Zm9ybV9yZXN1bWVfaG9zdChkZXYpOworCWlmIChyYykKKwkJZ290byBkaXNhYmxlX3Jlc291cmNlczsKKworCS8qIFdlIHJlc3VtZWQgc28gdXBkYXRlIFBNIHJ1bnRpbWUgc3RhdGUgKi8KKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJcmV0dXJuIDA7CisKK2Rpc2FibGVfcmVzb3VyY2VzOgorCWFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoaHByaXYpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wbGF0Zm9ybV9yZXN1bWUpOworI2VuZGlmCisKK01PRFVMRV9ERVNDUklQVElPTigiQUhDSSBTQVRBIHBsYXRmb3JtIGxpYnJhcnkiKTsKK01PRFVMRV9BVVRIT1IoIkFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKaW5kZXggYWNiOTVkZmYuLjk3YTE0ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwpAQCAtODUzLDYgKzg1Myw3IEBACiAJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmssIEFMTCkgewogCQkJYXRhX2FjcGlfY2xlYXJfZ3RmKGRldik7CiAJCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikgJiYKKwkJCSAgICBhdGFfZGV2X2FjcGlfaGFuZGxlKGRldikgJiYKIAkJCSAgICBhdGFfZGV2X2dldF9HVEYoZGV2LCBOVUxMKSA+PSAwKQogCQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0FDUElfUEVORElORzsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggOGNiMjUyMi4uMzQ0MDZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC01MzUyLDIyICs1MzUyLDE3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgYXRhX3BvcnRfcmVxdWVzdF9wbShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYWN0aW9uLCB1bnNpZ25lZCBpbnQgZWhpX2ZsYWdzLAotCQkJICAgICAgIGludCAqYXN5bmMpCitzdGF0aWMgdm9pZCBhdGFfcG9ydF9yZXF1ZXN0X3BtKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHBtX21lc3NhZ2VfdCBtZXNnLAorCQkJCXVuc2lnbmVkIGludCBhY3Rpb24sIHVuc2lnbmVkIGludCBlaGlfZmxhZ3MsCisJCQkJYm9vbCBhc3luYykKIHsKIAlzdHJ1Y3QgYXRhX2xpbmsgKmxpbms7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmMgPSAwOwogCiAJLyogUHJldmlvdXMgcmVzdW1lIG9wZXJhdGlvbiBtaWdodCBzdGlsbCBiZSBpbgogCSAqIHByb2dyZXNzLiAgV2FpdCBmb3IgUE1fUEVORElORyB0byBjbGVhci4KIAkgKi8KIAlpZiAoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19QTV9QRU5ESU5HKSB7Ci0JCWlmIChhc3luYykgewotCQkJKmFzeW5jID0gLUVBR0FJTjsKLQkJCXJldHVybiAwOwotCQl9CiAJCWF0YV9wb3J0X3dhaXRfZWgoYXApOwogCQlXQVJOX09OKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfUE1fUEVORElORyk7CiAJfQpAQCAtNTM3NiwxMSArNTM3MSw2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAogCWFwLT5wbV9tZXNnID0gbWVzZzsKLQlpZiAoYXN5bmMpCi0JCWFwLT5wbV9yZXN1bHQgPSBhc3luYzsKLQllbHNlCi0JCWFwLT5wbV9yZXN1bHQgPSAmcmM7Ci0KIAlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19QTV9QRU5ESU5HOwogCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBIT1NUX0ZJUlNUKSB7CiAJCWxpbmstPmVoX2luZm8uYWN0aW9uIHw9IGFjdGlvbjsKQEAgLTUzOTEsODcgKzUzODEsODEgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIHdhaXQgYW5kIGNoZWNrIHJlc3VsdCAqLwogCWlmICghYXN5bmMpIHsKIAkJYXRhX3BvcnRfd2FpdF9laChhcCk7CiAJCVdBUk5fT04oYXAtPnBmbGFncyAmIEFUQV9QRkxBR19QTV9QRU5ESU5HKTsKIAl9Ci0KLQlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgX19hdGFfcG9ydF9zdXNwZW5kX2NvbW1vbihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZywgaW50ICphc3luYykKKy8qCisgKiBPbiBzb21lIGhhcmR3YXJlLCBkZXZpY2UgZmFpbHMgdG8gcmVzcG9uZCBhZnRlciBzcHVuIGRvd24gZm9yIHN1c3BlbmQuICBBcworICogdGhlIGRldmljZSB3b24ndCBiZSB1c2VkIGJlZm9yZSBiZWluZyByZXN1bWVkLCB3ZSBkb24ndCBuZWVkIHRvIHRvdWNoIHRoZQorICogZGV2aWNlLiAgQXNrIEVIIHRvIHNraXAgdGhlIHVzdWFsIHN0dWZmIGFuZCBwcm9jZWVkIGRpcmVjdGx5IHRvIHN1c3BlbmQuCisgKgorICogaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUubGludXguaWRlLzQ2NzY0CisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXRhX3BvcnRfc3VzcGVuZF9laGkgPSBBVEFfRUhJX1FVSUVUCisJCQkJCQkgfCBBVEFfRUhJX05PX0FVVE9QU1kKKwkJCQkJCSB8IEFUQV9FSElfTk9fUkVDT1ZFUlk7CisKK3N0YXRpYyB2b2lkIGF0YV9wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpCiB7Ci0JLyoKLQkgKiBPbiBzb21lIGhhcmR3YXJlLCBkZXZpY2UgZmFpbHMgdG8gcmVzcG9uZCBhZnRlciBzcHVuIGRvd24KLQkgKiBmb3Igc3VzcGVuZC4gIEFzIHRoZSBkZXZpY2Ugd29uJ3QgYmUgdXNlZCBiZWZvcmUgYmVpbmcKLQkgKiByZXN1bWVkLCB3ZSBkb24ndCBuZWVkIHRvIHRvdWNoIHRoZSBkZXZpY2UuICBBc2sgRUggdG8gc2tpcAotCSAqIHRoZSB1c3VhbCBzdHVmZiBhbmQgcHJvY2VlZCBkaXJlY3RseSB0byBzdXNwZW5kLgotCSAqCi0JICogaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUubGludXguaWRlLzQ2NzY0Ci0JICovCi0JdW5zaWduZWQgaW50IGVoaV9mbGFncyA9IEFUQV9FSElfUVVJRVQgfCBBVEFfRUhJX05PX0FVVE9QU1kgfAotCQkJCSBBVEFfRUhJX05PX1JFQ09WRVJZOwotCXJldHVybiBhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCAwLCBlaGlfZmxhZ3MsIGFzeW5jKTsKKwlhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCAwLCBhdGFfcG9ydF9zdXNwZW5kX2VoaSwgZmFsc2UpOwogfQogCi1zdGF0aWMgaW50IGF0YV9wb3J0X3N1c3BlbmRfY29tbW9uKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCitzdGF0aWMgdm9pZCBhdGFfcG9ydF9zdXNwZW5kX2FzeW5jKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCWF0YV9wb3J0X3JlcXVlc3RfcG0oYXAsIG1lc2csIDAsIGF0YV9wb3J0X3N1c3BlbmRfZWhpLCB0cnVlKTsKK30KKworc3RhdGljIGludCBhdGFfcG9ydF9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gdG9fYXRhX3BvcnQoZGV2KTsKIAotCXJldHVybiBfX2F0YV9wb3J0X3N1c3BlbmRfY29tbW9uKGFwLCBtZXNnLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBhdGFfcG9ydF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKIAlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gYXRhX3BvcnRfc3VzcGVuZF9jb21tb24oZGV2LCBQTVNHX1NVU1BFTkQpOworCWF0YV9wb3J0X3N1c3BlbmQoYXAsIFBNU0dfU1VTUEVORCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRhX3BvcnRfZG9fZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYXRhX3BvcnRfc3VzcGVuZF9jb21tb24oZGV2LCBQTVNHX0ZSRUVaRSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXRhX3BvcnRfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBhdGFfcG9ydF9zdXNwZW5kX2NvbW1vbihkZXYsIFBNU0dfSElCRVJOQVRFKTsKLX0KLQotc3RhdGljIGludCBfX2F0YV9wb3J0X3Jlc3VtZV9jb21tb24oc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2csCi0JCQkJICAgIGludCAqYXN5bmMpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCBBVEFfRUhfUkVTRVQsCi0JCUFUQV9FSElfTk9fQVVUT1BTWSB8IEFUQV9FSElfUVVJRVQsIGFzeW5jKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXRhX3BvcnRfcmVzdW1lX2NvbW1vbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQorc3RhdGljIGludCBhdGFfcG9ydF9wbV9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSB0b19hdGFfcG9ydChkZXYpOwogCi0JcmV0dXJuIF9fYXRhX3BvcnRfcmVzdW1lX2NvbW1vbihhcCwgbWVzZywgTlVMTCk7CisJaWYgKHBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCisJCXJldHVybiAwOworCisJYXRhX3BvcnRfc3VzcGVuZChhcCwgUE1TR19GUkVFWkUpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0YV9wb3J0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGF0YV9wb3J0X3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpbnQgcmM7CisJYXRhX3BvcnRfc3VzcGVuZCh0b19hdGFfcG9ydChkZXYpLCBQTVNHX0hJQkVSTkFURSk7CisJcmV0dXJuIDA7Cit9CiAKLQlyYyA9IGF0YV9wb3J0X3Jlc3VtZV9jb21tb24oZGV2LCBQTVNHX1JFU1VNRSk7Ci0JaWYgKCFyYykgewotCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKLQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JfQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdGFfcG9ydF9yZXN1bWVfZWhpID0gQVRBX0VISV9OT19BVVRPUFNZCisJCQkJCQl8IEFUQV9FSElfUVVJRVQ7CiAKLQlyZXR1cm4gcmM7CitzdGF0aWMgdm9pZCBhdGFfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJYXRhX3BvcnRfcmVxdWVzdF9wbShhcCwgbWVzZywgQVRBX0VIX1JFU0VULCBhdGFfcG9ydF9yZXN1bWVfZWhpLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9wb3J0X3Jlc3VtZV9hc3luYyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlhdGFfcG9ydF9yZXF1ZXN0X3BtKGFwLCBtZXNnLCBBVEFfRUhfUkVTRVQsIGF0YV9wb3J0X3Jlc3VtZV9laGksIHRydWUpOworfQorCitzdGF0aWMgaW50IGF0YV9wb3J0X3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYXRhX3BvcnRfcmVzdW1lX2FzeW5jKHRvX2F0YV9wb3J0KGRldiksIFBNU0dfUkVTVU1FKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNTUwMCwyMSArNTQ4NCwyMyBAQAogCiBzdGF0aWMgaW50IGF0YV9wb3J0X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGF0YV9wb3J0X3N1c3BlbmRfY29tbW9uKGRldiwgUE1TR19BVVRPX1NVU1BFTkQpOworCWF0YV9wb3J0X3N1c3BlbmQodG9fYXRhX3BvcnQoZGV2KSwgUE1TR19BVVRPX1NVU1BFTkQpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGF0YV9wb3J0X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gYXRhX3BvcnRfcmVzdW1lX2NvbW1vbihkZXYsIFBNU0dfQVVUT19SRVNVTUUpOworCWF0YV9wb3J0X3Jlc3VtZSh0b19hdGFfcG9ydChkZXYpLCBQTVNHX0FVVE9fUkVTVU1FKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGF0YV9wb3J0X3BtX29wcyA9IHsKLQkuc3VzcGVuZCA9IGF0YV9wb3J0X3N1c3BlbmQsCi0JLnJlc3VtZSA9IGF0YV9wb3J0X3Jlc3VtZSwKLQkuZnJlZXplID0gYXRhX3BvcnRfZG9fZnJlZXplLAotCS50aGF3ID0gYXRhX3BvcnRfcmVzdW1lLAotCS5wb3dlcm9mZiA9IGF0YV9wb3J0X3Bvd2Vyb2ZmLAotCS5yZXN0b3JlID0gYXRhX3BvcnRfcmVzdW1lLAorCS5zdXNwZW5kID0gYXRhX3BvcnRfcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gYXRhX3BvcnRfcG1fcmVzdW1lLAorCS5mcmVlemUgPSBhdGFfcG9ydF9wbV9mcmVlemUsCisJLnRoYXcgPSBhdGFfcG9ydF9wbV9yZXN1bWUsCisJLnBvd2Vyb2ZmID0gYXRhX3BvcnRfcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBhdGFfcG9ydF9wbV9yZXN1bWUsCiAKIAkucnVudGltZV9zdXNwZW5kID0gYXRhX3BvcnRfcnVudGltZV9zdXNwZW5kLAogCS5ydW50aW1lX3Jlc3VtZSA9IGF0YV9wb3J0X3J1bnRpbWVfcmVzdW1lLApAQCAtNTUyNiwxOCArNTUxMiwxNyBAQAogICogbGV2ZWwuIHNhcyBzdXNwZW5kL3Jlc3VtZSBpcyBhc3luYyB0byBhbGxvdyBwYXJhbGxlbCBwb3J0IHJlY292ZXJ5CiAgKiBzaW5jZSBzYXMgaGFzIG11bHRpcGxlIGF0YV9wb3J0IGluc3RhbmNlcyBwZXIgU2NzaV9Ib3N0LgogICovCi1pbnQgYXRhX3Nhc19wb3J0X2FzeW5jX3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYykKK3ZvaWQgYXRhX3Nhc19wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlyZXR1cm4gX19hdGFfcG9ydF9zdXNwZW5kX2NvbW1vbihhcCwgUE1TR19TVVNQRU5ELCBhc3luYyk7CisJYXRhX3BvcnRfc3VzcGVuZF9hc3luYyhhcCwgUE1TR19TVVNQRU5EKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zYXNfcG9ydF9hc3luY19zdXNwZW5kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zYXNfcG9ydF9zdXNwZW5kKTsKIAotaW50IGF0YV9zYXNfcG9ydF9hc3luY19yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYykKK3ZvaWQgYXRhX3Nhc19wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXJldHVybiBfX2F0YV9wb3J0X3Jlc3VtZV9jb21tb24oYXAsIFBNU0dfUkVTVU1FLCBhc3luYyk7CisJYXRhX3BvcnRfcmVzdW1lX2FzeW5jKGFwLCBQTVNHX1JFU1VNRSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2FzX3BvcnRfYXN5bmNfcmVzdW1lKTsKLQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Nhc19wb3J0X3Jlc3VtZSk7CiAKIC8qKgogICoJYXRhX2hvc3Rfc3VzcGVuZCAtIHN1c3BlbmQgaG9zdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCA2ZDg3NTcwLi42NzYwZmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtOTUsMTIgKzk1LDEzIEBACiAgKiByZXByZXNlbnRzIHRpbWVvdXQgZm9yIHRoYXQgdHJ5LiAgVGhlIGZpcnN0IHRyeSBjYW4gYmUgc29mdCBvcgogICogaGFyZHJlc2V0LiAgQWxsIG90aGVycyBhcmUgaGFyZHJlc2V0IGlmIGF2YWlsYWJsZS4gIEluIG1vc3QgY2FzZXMKICAqIHRoZSBmaXJzdCByZXNldCB3LyAxMHNlYyB0aW1lb3V0IHNob3VsZCBzdWNjZWVkLiAgRm9sbG93aW5nIGVudHJpZXMKLSAqIGFyZSBtb3N0bHkgZm9yIGVycm9yIGhhbmRsaW5nLCBob3RwbHVnIGFuZCByZXRhcmRlZCBkZXZpY2VzLgorICogYXJlIG1vc3RseSBmb3IgZXJyb3IgaGFuZGxpbmcsIGhvdHBsdWcgYW5kIHRob3NlIG91dGxpZXIgZGV2aWNlcyB0aGF0CisgKiB0YWtlIGFuIGV4Y2VwdGlvbmFsbHkgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSByZXNldC4KICAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgYXRhX2VoX3Jlc2V0X3RpbWVvdXRzW10gPSB7CiAJMTAwMDAsCS8qIG1vc3QgZHJpdmVzIHNwaW4gdXAgYnkgMTBzZWMgKi8KIAkxMDAwMCwJLyogPiA5OSUgd29ya2luZyBkcml2ZXMgc3BpbiB1cCBiZWZvcmUgMjBzZWMgKi8KLQkzNTAwMCwJLyogZ2l2ZSA+IDMwIHNlY3Mgb2YgaWRsZW5lc3MgZm9yIHJldGFyZGVkIGRldmljZXMgKi8KKwkzNTAwMCwJLyogZ2l2ZSA+IDMwIHNlY3Mgb2YgaWRsZW5lc3MgZm9yIG91dGxpZXIgZGV2aWNlcyAqLwogCSA1MDAwLAkvKiBhbmQgc3dlZXQgb25lIGxhc3QgY2hhbmNlICovCiAJVUxPTkdfTUFYLCAvKiA+IDEgbWluIGhhcyBlbGFwc2VkLCBnaXZlIHVwICovCiB9OwpAQCAtNDA2OSw3ICs0MDcwLDcgQEAKIAogCWF0YV9hY3BpX3NldF9zdGF0ZShhcCwgYXAtPnBtX21lc2cpOwogIG91dDoKLQkvKiByZXBvcnQgcmVzdWx0ICovCisJLyogdXBkYXRlIHRoZSBmbGFncyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CiAKIAlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfUE1fUEVORElORzsKQEAgLTQwNzgsMTEgKzQwNzksNiBAQAogCWVsc2UgaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKQogCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CiAKLQlpZiAoYXAtPnBtX3Jlc3VsdCkgewotCQkqYXAtPnBtX3Jlc3VsdCA9IHJjOwotCQlhcC0+cG1fcmVzdWx0ID0gTlVMTDsKLQl9Ci0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm47CkBAIC00MTM0LDEzICs0MTMwLDkgQEAKIAkvKiB0ZWxsIEFDUEkgdGhhdCB3ZSdyZSByZXN1bWluZyAqLwogCWF0YV9hY3BpX29uX3Jlc3VtZShhcCk7CiAKLQkvKiByZXBvcnQgcmVzdWx0ICovCisJLyogdXBkYXRlIHRoZSBmbGFncyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CiAJYXAtPnBmbGFncyAmPSB+KEFUQV9QRkxBR19QTV9QRU5ESU5HIHwgQVRBX1BGTEFHX1NVU1BFTkRFRCk7Ci0JaWYgKGFwLT5wbV9yZXN1bHQpIHsKLQkJKmFwLT5wbV9yZXN1bHQgPSByYzsKLQkJYXAtPnBtX3Jlc3VsdCA9IE5VTEw7Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS16cG9kZC5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXpwb2RkLmMKaW5kZXggODg5NDljNi4uZjNhNjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXpwb2RkLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXpwb2RkLmMKQEAgLTg1LDIxICs4NSw2IEBACiAJCXJldHVybiBPRERfTUVDSF9UWVBFX1VOU1VQUE9SVEVEOwogfQogCi1zdGF0aWMgYm9vbCBvZGRfY2FuX3Bvd2Vyb2ZmKHN0cnVjdCBhdGFfZGV2aWNlICphdGFfZGV2KQotewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2OwotCi0JaGFuZGxlID0gYXRhX2Rldl9hY3BpX2hhbmRsZShhdGFfZGV2KTsKLQlpZiAoIWhhbmRsZSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmYWNwaV9kZXYpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gYWNwaV9kZXZpY2VfY2FuX3Bvd2Vyb2ZmKGFjcGlfZGV2KTsKLX0KLQogLyogVGVzdCBpZiBPREQgaXMgemVybyBwb3dlciByZWFkeSBieSBzZW5zZSBjb2RlICovCiBzdGF0aWMgYm9vbCB6cHJlYWR5KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7CkBAIC0yNjcsMTMgKzI1MiwxMSBAQAogCiB2b2lkIHpwb2RkX2luaXQoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBBQ1BJX0NPTVBBTklPTigmZGV2LT50ZGV2KTsKIAllbnVtIG9kZF9tZWNoX3R5cGUgbWVjaF90eXBlOwogCXN0cnVjdCB6cG9kZCAqenBvZGQ7CiAKLQlpZiAoZGV2LT56cG9kZCkKLQkJcmV0dXJuOwotCi0JaWYgKCFvZGRfY2FuX3Bvd2Vyb2ZmKGRldikpCisJaWYgKGRldi0+enBvZGQgfHwgIWFkZXYgfHwgIWFjcGlfZGV2aWNlX2Nhbl9wb3dlcm9mZihhZGV2KSkKIAkJcmV0dXJuOwogCiAJbWVjaF90eXBlID0genBvZGRfZ2V0X21lY2hfdHlwZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hY3BpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FjcGkuYwppbmRleCA2MmM5YWM4Li41MTA4Yjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FjcGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FjcGkuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCmluZGV4IGQyM2UyYjMuLjEyMDZmYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FyYXNhbl9jZi5jIGIvZHJpdmVycy9hdGEvcGF0YV9hcmFzYW5fY2YuYwppbmRleCA3MzQ5MmRkLi42ZmFjNTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FyYXNhbl9jZi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJhc2FuX2NmLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCiBzdGF0aWMgdm9pZCBkbWFfY2FsbGJhY2sodm9pZCAqZGV2KQogewotCXN0cnVjdCBhcmFzYW5fY2ZfZGV2ICphY2RldiA9IChzdHJ1Y3QgYXJhc2FuX2NmX2RldiAqKSBkZXY7CisJc3RydWN0IGFyYXNhbl9jZl9kZXYgKmFjZGV2ID0gZGV2OwogCiAJY29tcGxldGUoJmFjZGV2LT5kbWFfY29tcGxldGlvbik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKaW5kZXggMTU4MWRlZS4uM2FhNGU2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdDkxLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYwppbmRleCBkNjNlZThmLi5lOWM4NzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYwpAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwppbmRleCAyNGU1MTA1Li4zMGZhNGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdHA4Njd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYwppbmRleCAyY2E1MDI2Li43ZTczYTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NDAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjQwLmMKaW5kZXggOGZiNjllNS4uNTdmMWJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NDAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0MC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYwppbmRleCAxMjc1YThkLi42YmNhMzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKaW5kZXggZjEwYmFhYi4uYmNkZTRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jCmluZGV4IGYwN2YyMjkuLjhhZmU4NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYwppbmRleCA5OTdlMTZhLi4yYzA5ODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM2LmMKaW5kZXggMDQ0ODg2MC4uMzJkZGNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNi5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCmluZGV4IDgxMGJjOTkuLjM0MzViZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jIGIvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKaW5kZXggM2MxMmZkNy4uZjQ0MDg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfZXA5M3h4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2VwOTN4eC5jCmluZGV4IDk4MGI4OGUuLmNhZDlkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfZXA5M3h4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9lcDkzeHguYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggMzViNTIxMy4uOGU3NmY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCmluZGV4IGE5ZDc0ZWYuLjNiYTg0M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCmluZGV4IDRiZTAzOTguLmI5M2MwZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCmluZGV4IDg1Y2YyODYuLjI1NWM1YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2lteC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pbXguYwppbmRleCBiMGIxOGVjLi5lMDg3MmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2lteC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaW14LmMKQEAgLTE1LDcgKzE1LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgpAQCAtMTAwLDEzICs5OSw5IEBACiAJc3RydWN0IHJlc291cmNlICppb19yZXM7CiAJaW50IHJldDsKIAotCWlvX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKGlvX3JlcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKIAogCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKIAkJCQlzaXplb2Yoc3RydWN0IHBhdGFfaW14X3ByaXYpLCBHRlBfS0VSTkVMKTsKQEAgLTEzNiwxMSArMTMxLDEwIEBACiAJYXAtPnBpb19tYXNrID0gQVRBX1BJTzA7CiAJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX1NMQVZFX1BPU1M7CiAKLQlwcml2LT5ob3N0X3JlZ3MgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgaW9fcmVzLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShpb19yZXMpKTsKLQlpZiAoIXByaXYtPmhvc3RfcmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIElPL0NUTCBiYXNlXG4iKTsKLQkJcmV0ID0gLUVCVVNZOworCWlvX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcHJpdi0+aG9zdF9yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIGlvX3Jlcyk7CisJaWYgKElTX0VSUihwcml2LT5ob3N0X3JlZ3MpKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+aG9zdF9yZWdzKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYwppbmRleCAyYThkZDk1Li44MTM2OWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCmluZGV4IDU4MWUwNGQuLmRjM2Q3ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwpAQCAtNzIsNyArNzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jIGIvZHJpdmVycy9hdGEvcGF0YV9qbWljcm9uLmMKaW5kZXggNzZlNzM5YjAuLmIxY2ZhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwppbmRleCBiZTgxNjQyLi5iY2UyYThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKQEAgLTkxNiw3ICs5MTYsNiBAQAogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQkJcmV0dXJuIEJJT1M7CiAJCX0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAogCWlmIChodDY1NjBhICYgbWFzaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKaW5kZXggYTRmNWU3OC4uNmJhZDNkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYwppbmRleCAxZjVmMjhiLi5mMzlhNTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jIGIvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKaW5kZXggYWQxYTBmZS4uZTNiOTcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCmluZGV4IDk1MTNlMDcuLjU2MjAxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKaW5kZXggMGM0MjRkYS4uNjE1NGMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDE1LmMgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYwppbmRleCAxNmRjM2E2Li5kNDRkZjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwppbmRleCBkNzdiMmUxLi4zMTliNjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwppbmRleCA0ZWE3MGNkLi5mYjA0MmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCmluZGV4IDc4ZWRlM2YuLmJiNzFlYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCmluZGV4IDQwMjU0ZjQuLmJjYzRiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYwpAQCAtMjYsNyArMjYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCmluZGV4IDlkODc0YzguLjExNTFmMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMnh4X29sZC5jCmluZGV4IGMzNGZjNTAuLmRlZmEwNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDJ4eF9vbGQuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BpY2NvbG8uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGljY29sby5jCmluZGV4IDJiZWI2YjUuLjBiNDZiZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGljY29sby5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGljY29sby5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwppbmRleCAwMjc5NDg4Li5hNTU3OWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9hdGEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcHhhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3B4YS5jCmluZGV4IGE2ZjA1YWMuLjczMjU5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcHhhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9weGEuYwpAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwppbmRleCBmNTgyYmExLi5iZTNmMTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcmRjLmMKaW5kZXggNzlhOTcwZi4uNTIxYjIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JkYy5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYwppbmRleCAwNDBiMDkzLi5jYWVkYzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKaW5kZXggY2UyZjgyOC4uOTZhMjMyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCmluZGV4IGYzNWYxNWYuLmYxZjViNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zY2MuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2guYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NoLmMKaW5kZXggZDM4MzBjNC4uNWExY2RlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjaC5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKaW5kZXggOTZjNmE3OS4uZTI3ZjMxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCBjNGIwYjA3Li43M2ZlMzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKaW5kZXggMWU4MzYzNi4uNzhkOTEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKaW5kZXggNjgxNjkxMS4uOTAwZjBlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCmluZGV4IDk0NDczZGEuLjdiYzc4ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCmluZGV4IGMzYWI5YTYuLmY2Yzk2MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV92aWEuYwpAQCAtNTUsNyArNTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGRjX2FkbWEuYyBiL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMKaW5kZXggOGVhNmU2YS4uZjEwNjMxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGRjX2FkbWEuYworKysgYi9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwppbmRleCA1MjM1MjRiLi4wYmIyY2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CkBAIC00NjIsOCArNDYxLDcgQEAKIAlpbnQgY2hhbjsKIAl1MzIgdGZyX3JlZywgZXJyX3JlZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2ID0KLQkJKHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKiloc2Rldl9pbnN0YW5jZTsKKwlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldiA9IGhzZGV2X2luc3RhbmNlOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IChzdHJ1Y3QgYXRhX2hvc3QgKiloc2Rldi0+aG9zdDsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2VfcG9ydCAqaHNkZXZwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9oaWdoYmFuay5jIGIvZHJpdmVycy9hdGEvc2F0YV9oaWdoYmFuay5jCmluZGV4IDg3MGIxMWUuLjY1OTY1Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfaGlnaGJhbmsuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX2hpZ2hiYW5rLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMTQyLDcgKzE0MSw3IEBACiAJCQkJCXNzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gIGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVjeF9wbGF0X2RhdGEgKnBkYXRhID0gKHN0cnVjdCBlY3hfcGxhdF9kYXRhICopIGhwcml2LT5wbGF0X2RhdGE7CisJc3RydWN0IGVjeF9wbGF0X2RhdGEgKnBkYXRhID0gaHByaXYtPnBsYXRfZGF0YTsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwbXAsIGk7CkBAIC00MDMsNiArNDAyLDcgQEAKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB0aW1pbmdbXSA9IHsgNSwgMTAwLCA1MDB9OwogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl1OCAqZDJoX2ZpcyA9IHBwLT5yeF9maXMgKyBSWF9GSVNfRDJIX1JFRzsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCWJvb2wgb25saW5lOwpAQCAtNDMxLDcgKzQzMSw3IEBACiAJCQlicmVhazsKIAl9IHdoaWxlICghb25saW5lICYmIHJldHJ5LS0pOwogCi0JYWhjaV9zdGFydF9lbmdpbmUoYXApOworCWhwcml2LT5zdGFydF9lbmdpbmUoYXApOwogCiAJaWYgKG9ubGluZSkKIAkJKmNsYXNzID0gYWhjaV9kZXZfY2xhc3NpZnkoYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IGQ3NGRlZjguLmJhNWYyNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggOTdmNGFjYi4uMzYzODg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYyBiL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYwppbmRleCAzYjBkZDU3Li45YTZiZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3FzdG9yLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9xc3Rvci5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwuYwppbmRleCBiNzY5NWU4Li4zMDYyZjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCmluZGV4IDFhZDJmNjIuLmI1MTM0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKaW5kZXggZGM0ZjcwMS4uYzYzMGZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zeDQuYwppbmRleCA5OTQ3MDEwLi4zOWI1ZGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMKQEAgLTgyLDcgKzgyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMDIxLDggKzEwMjAsNyBAQAogCWlkeCsrOwogCWRpc3QgPSAoKGxvbmcpICh3aW5kb3dfc2l6ZSAtIChvZmZzZXQgKyBzaXplKSkpID49IDAgPyBzaXplIDoKIAkJKGxvbmcpICh3aW5kb3dfc2l6ZSAtIG9mZnNldCk7Ci0JbWVtY3B5X2Zyb21pbygoY2hhciAqKSBwc291cmNlLCAoY2hhciAqKSAoZGltbV9tbWlvICsgb2Zmc2V0IC8gNCksCi0JCSAgICAgIGRpc3QpOworCW1lbWNweV9mcm9taW8ocHNvdXJjZSwgZGltbV9tbWlvICsgb2Zmc2V0IC8gNCwgZGlzdCk7CiAKIAlwc291cmNlICs9IGRpc3Q7CiAJc2l6ZSAtPSBkaXN0OwpAQCAtMTAzMSw4ICsxMDI5LDcgQEAKIAkJcmVhZGwobW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOwogCQl3cml0ZWwoKChpZHgpIDw8IHBhZ2VfbWFzayksIG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CiAJCXJlYWRsKG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7Ci0JCW1lbWNweV9mcm9taW8oKGNoYXIgKikgcHNvdXJjZSwgKGNoYXIgKikgKGRpbW1fbW1pbyksCi0JCQkgICAgICB3aW5kb3dfc2l6ZSAvIDQpOworCQltZW1jcHlfZnJvbWlvKHBzb3VyY2UsIGRpbW1fbW1pbywgd2luZG93X3NpemUgLyA0KTsKIAkJcHNvdXJjZSArPSB3aW5kb3dfc2l6ZTsKIAkJc2l6ZSAtPSB3aW5kb3dfc2l6ZTsKIAkJaWR4Kys7CkBAIC0xMDQzLDggKzEwNDAsNyBAQAogCQlyZWFkbChtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CiAJCXdyaXRlbCgoKGlkeCkgPDwgcGFnZV9tYXNrKSwgbW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKIAkJcmVhZGwobW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKLQkJbWVtY3B5X2Zyb21pbygoY2hhciAqKSBwc291cmNlLCAoY2hhciAqKSAoZGltbV9tbWlvKSwKLQkJCSAgICAgIHNpemUgLyA0KTsKKwkJbWVtY3B5X2Zyb21pbyhwc291cmNlLCBkaW1tX21taW8sIHNpemUgLyA0KTsKIAl9CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3VsaS5jCmluZGV4IDZkNjQ4OTEuLjA4Zjk4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV91bGkuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYyBiL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKaW5kZXggODdmMDU2ZS4uZjcyZTg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwppbmRleCA0NGYzMDRiLi4yOWU4NDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9LY29uZmlnIGIvZHJpdmVycy9iYXNlL0tjb25maWcKaW5kZXggZWMzNmU3Ny4uOGZhOGRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL0tjb25maWcKKysrIGIvZHJpdmVycy9iYXNlL0tjb25maWcKQEAgLTE4NSw2ICsxODUsOSBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAorY29uZmlnIEdFTkVSSUNfQ1BVX0FVVE9QUk9CRQorCWJvb2wKKwogY29uZmlnIFNPQ19CVVMKIAlib29sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCmluZGV4IGVjYzE5MjkuLmI4NGNhOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwpAQCAtMTIsNyArMTIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDJiNTY3MTcuLjBkZDY1MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CkBAIC01NzEsNiArNTcwLDIzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVtb3ZlX2ZpbGUpOwogCiAvKioKKyAqIGRldmljZV9yZW1vdmVfZmlsZV9zZWxmIC0gcmVtb3ZlIHN5c2ZzIGF0dHJpYnV0ZSBmaWxlIGZyb20gaXRzIG93biBtZXRob2QuCisgKiBAZGV2OiBkZXZpY2UuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSBkZXNjcmlwdG9yLgorICoKKyAqIFNlZSBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBmb3IgZGV0YWlscy4KKyAqLworYm9vbCBkZXZpY2VfcmVtb3ZlX2ZpbGVfc2VsZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCWlmIChkZXYpCisJCXJldHVybiBzeXNmc19yZW1vdmVfZmlsZV9zZWxmKCZkZXYtPmtvYmosICZhdHRyLT5hdHRyKTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKTsKKworLyoqCiAgKiBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlIC0gY3JlYXRlIHN5c2ZzIGJpbmFyeSBhdHRyaWJ1dGUgZmlsZSBmb3IgZGV2aWNlLgogICogQGRldjogZGV2aWNlLgogICogQGF0dHI6IGRldmljZSBiaW5hcnkgYXR0cmlidXRlIGRlc2NyaXB0b3IuCkBAIC0yMDAzLDcgKzIwMTksNiBAQAogCQlzcGluX2xvY2soJmRldmljZXNfa3NldC0+bGlzdF9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmRldmljZXNfa3NldC0+bGlzdF9sb2NrKTsKLQlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiB9CiAKIC8qCkBAIC0yMDU4LDcgKzIwNzMsNiBAQAogCiAJcmV0dXJuIHBvczsKIH0KLUVYUE9SVF9TWU1CT0woY3JlYXRlX3N5c2xvZ19oZWFkZXIpOwogCiBpbnQgZGV2X3ZwcmludGtfZW1pdChpbnQgbGV2ZWwsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJICAgICBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jcHUuYyBiL2RyaXZlcnMvYmFzZS9jcHUuYwppbmRleCBmNDgzNzBkLi4wMDZiMWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY3B1LmMKKysrIGIvZHJpdmVycy9iYXNlL2NwdS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZmVhdHVyZS5oPgogCiAjaW5jbHVkZSAiYmFzZS5oIgogCkBAIC0yODYsNiArMjg3LDQxIEBACiAJICovCiB9CiAKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCitzdGF0aWMgc3NpemVfdCBwcmludF9jcHVfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJc3NpemVfdCBuOworCXUzMiBpOworCisJbiA9IHNwcmludGYoYnVmLCAiY3B1OnR5cGU6IiBDUFVfRkVBVFVSRV9UWVBFRk1UICI6ZmVhdHVyZToiLAorCQkgICAgQ1BVX0ZFQVRVUkVfVFlQRVZBTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NQVV9GRUFUVVJFUzsgaSsrKQorCQlpZiAoY3B1X2hhdmVfZmVhdHVyZShpKSkgeworCQkJaWYgKFBBR0VfU0laRSA8IG4gKyBzaXplb2YoIixYWFhYXG4iKSkgeworCQkJCVdBUk4oMSwgIkNQVSBmZWF0dXJlcyBvdmVyZmxvdyBwYWdlXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW4gKz0gc3ByaW50ZigmYnVmW25dLCAiLCUwNFgiLCBpKTsKKwkJfQorCWJ1ZltuKytdID0gJ1xuJzsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBjcHVfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCWNoYXIgKmJ1ZiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmKSB7CisJCXByaW50X2NwdV9tb2RhbGlhcyhOVUxMLCBOVUxMLCBidWYpOworCQlhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz0lcyIsIGJ1Zik7CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qCiAgKiByZWdpc3Rlcl9jcHUgLSBTZXR1cCBhIHN5c2ZzIGRldmljZSBmb3IgYSBDUFUuCiAgKiBAY3B1IC0gY3B1LT5ob3RwbHVnZ2FibGUgZmllbGQgc2V0IHRvIDEgd2lsbCBnZW5lcmF0ZSBhIGNvbnRyb2wgZmlsZSBpbgpAQCAtMzA2LDggKzM0Miw4IEBACiAJY3B1LT5kZXYub2ZmbGluZV9kaXNhYmxlZCA9ICFjcHUtPmhvdHBsdWdnYWJsZTsKIAljcHUtPmRldi5vZmZsaW5lID0gIWNwdV9vbmxpbmUobnVtKTsKIAljcHUtPmRldi5vZl9ub2RlID0gb2ZfZ2V0X2NwdV9ub2RlKG51bSwgTlVMTCk7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfSEFTX0NQVV9BVVRPUFJPQkUKLQljcHUtPmRldi5idXMtPnVldmVudCA9IGFyY2hfY3B1X3VldmVudDsKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCisJY3B1LT5kZXYuYnVzLT51ZXZlbnQgPSBjcHVfdWV2ZW50OwogI2VuZGlmCiAJY3B1LT5kZXYuZ3JvdXBzID0gY29tbW9uX2NwdV9hdHRyX2dyb3VwczsKIAlpZiAoY3B1LT5ob3RwbHVnZ2FibGUpCkBAIC0zMzAsOCArMzY2LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdldF9jcHVfZGV2aWNlKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX0hBU19DUFVfQVVUT1BST0JFCi1zdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIDA0NDQsIGFyY2hfcHJpbnRfY3B1X21vZGFsaWFzLCBOVUxMKTsKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCitzdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIDA0NDQsIHByaW50X2NwdV9tb2RhbGlhcywgTlVMTCk7CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNwdV9yb290X2F0dHJzW10gPSB7CkBAIC0zNDQsNyArMzgwLDcgQEAKIAkmY3B1X2F0dHJzWzJdLmF0dHIuYXR0ciwKIAkmZGV2X2F0dHJfa2VybmVsX21heC5hdHRyLAogCSZkZXZfYXR0cl9vZmZsaW5lLmF0dHIsCi0jaWZkZWYgQ09ORklHX0FSQ0hfSEFTX0NQVV9BVVRPUFJPQkUKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DUFVfQVVUT1BST0JFCiAJJmRldl9hdHRyX21vZGFsaWFzLmF0dHIsCiAjZW5kaWYKIAlOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGV2cmVzLmMgYi9kcml2ZXJzL2Jhc2UvZGV2cmVzLmMKaW5kZXggNTQ1YzRkZS4uZGI0ZTI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RldnJlcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZXZyZXMuYwpAQCAtNzkxLDYgKzc5MSwzMiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9rbWFsbG9jKTsKIAogLyoqCisgKiBkZXZtX2tzdHJkdXAgLSBBbGxvY2F0ZSByZXNvdXJjZSBtYW5hZ2VkIHNwYWNlIGFuZAorICogICAgICAgICAgICAgICAgY29weSBhbiBleGlzdGluZyBzdHJpbmcgaW50byB0aGF0LgorICogQGRldjogRGV2aWNlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IKKyAqIEBzOiB0aGUgc3RyaW5nIHRvIGR1cGxpY2F0ZQorICogQGdmcDogdGhlIEdGUCBtYXNrIHVzZWQgaW4gdGhlIGRldm1fa21hbGxvYygpIGNhbGwgd2hlbgorICogICAgICAgYWxsb2NhdGluZyBtZW1vcnkKKyAqIFJFVFVSTlM6CisgKiBQb2ludGVyIHRvIGFsbG9jYXRlZCBzdHJpbmcgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICovCitjaGFyICpkZXZtX2tzdHJkdXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpzLCBnZnBfdCBnZnApCit7CisJc2l6ZV90IHNpemU7CisJY2hhciAqYnVmOworCisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCXNpemUgPSBzdHJsZW4ocykgKyAxOworCWJ1ZiA9IGRldm1fa21hbGxvYyhkZXYsIHNpemUsIGdmcCk7CisJaWYgKGJ1ZikKKwkJbWVtY3B5KGJ1Ziwgcywgc2l6ZSk7CisJcmV0dXJuIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fa3N0cmR1cCk7CisKKy8qKgogICogZGV2bV9rZnJlZSAtIFJlc291cmNlLW1hbmFnZWQga2ZyZWUKICAqIEBkZXY6IERldmljZSB0aGlzIG1lbW9yeSBiZWxvbmdzIHRvCiAgKiBAcDogTWVtb3J5IHRvIGZyZWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWEtYnVmLmMgYi9kcml2ZXJzL2Jhc2UvZG1hLWJ1Zi5jCmluZGV4IDYxZDZkNjIuLmVhNzc3MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtYnVmLmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYS1idWYuYwpAQCAtMjUxLDkgKzI1MSw4IEBACiAgKiBAZG1hYnVmOglbaW5dCWJ1ZmZlciB0byBhdHRhY2ggZGV2aWNlIHRvLgogICogQGRldjoJW2luXQlkZXZpY2UgdG8gYmUgYXR0YWNoZWQuCiAgKgotICogUmV0dXJucyBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICogZm9yIHRoaXMgYXR0YWNobWVudDsgbWF5IHJldHVybiBuZWdhdGl2ZQotICogZXJyb3IgY29kZXMuCi0gKgorICogUmV0dXJucyBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICogZm9yIHRoaXMgYXR0YWNobWVudDsgcmV0dXJucyBFUlJfUFRSIG9uCisgKiBlcnJvci4KICAqLwogc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqZG1hX2J1Zl9hdHRhY2goc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0zMTksOSArMzE4LDggQEAKICAqIEBhdHRhY2g6CVtpbl0JYXR0YWNobWVudCB3aG9zZSBzY2F0dGVybGlzdCBpcyB0byBiZSByZXR1cm5lZAogICogQGRpcmVjdGlvbjoJW2luXQlkaXJlY3Rpb24gb2YgRE1BIHRyYW5zZmVyCiAgKgotICogUmV0dXJucyBzZ190YWJsZSBjb250YWluaW5nIHRoZSBzY2F0dGVybGlzdCB0byBiZSByZXR1cm5lZDsgbWF5IHJldHVybiBOVUxMCi0gKiBvciBFUlJfUFRSLgotICoKKyAqIFJldHVybnMgc2dfdGFibGUgY29udGFpbmluZyB0aGUgc2NhdHRlcmxpc3QgdG8gYmUgcmV0dXJuZWQ7IHJldHVybnMgRVJSX1BUUgorICogb24gZXJyb3IuCiAgKi8KIHN0cnVjdCBzZ190YWJsZSAqZG1hX2J1Zl9tYXBfYXR0YWNobWVudChzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2gsCiAJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKQEAgLTMzNCw2ICszMzIsOCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCXNnX3RhYmxlID0gYXR0YWNoLT5kbWFidWYtPm9wcy0+bWFwX2RtYV9idWYoYXR0YWNoLCBkaXJlY3Rpb24pOworCWlmICghc2dfdGFibGUpCisJCXNnX3RhYmxlID0gRVJSX1BUUigtRU5PTUVNKTsKIAogCXJldHVybiBzZ190YWJsZTsKIH0KQEAgLTU0NCw2ICs1NDQsOCBAQAogICogVGhlc2UgY2FsbHMgYXJlIG9wdGlvbmFsIGluIGRyaXZlcnMuIFRoZSBpbnRlbmRlZCB1c2UgZm9yIHRoZW0KICAqIGlzIGZvciBtYXBwaW5nIG9iamVjdHMgbGluZWFyIGluIGtlcm5lbCBzcGFjZSBmb3IgaGlnaCB1c2Ugb2JqZWN0cy4KICAqIFBsZWFzZSBhdHRlbXB0IHRvIHVzZSBrbWFwL2t1bm1hcCBiZWZvcmUgdGhpbmtpbmcgYWJvdXQgdGhlc2UgaW50ZXJmYWNlcy4KKyAqCisgKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAgKi8KIHZvaWQgKmRtYV9idWZfdm1hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmKQogewpAQCAtNTY2LDcgKzU2OCw5IEBACiAJQlVHX09OKGRtYWJ1Zi0+dm1hcF9wdHIpOwogCiAJcHRyID0gZG1hYnVmLT5vcHMtPnZtYXAoZG1hYnVmKTsKLQlpZiAoSVNfRVJSX09SX05VTEwocHRyKSkKKwlpZiAoV0FSTl9PTl9PTkNFKElTX0VSUihwdHIpKSkKKwkJcHRyID0gTlVMTDsKKwlpZiAoIXB0cikKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJZG1hYnVmLT52bWFwX3B0ciA9IHB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggYzMwZGY1MGUuLmQyNzZlMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC02NDksNyArNjQ5LDkgQEAKIAkJCSAqIHNlZSB0aGUgbWFwcGVkICdidWYtPmRhdGEnIG9uY2UgdGhlIGxvYWRpbmcKIAkJCSAqIGlzIGNvbXBsZXRlZC4KIAkJCSAqICovCi0JCQlmd19tYXBfcGFnZXNfYnVmKGZ3X2J1Zik7CisJCQlpZiAoZndfbWFwX3BhZ2VzX2J1Zihmd19idWYpKQorCQkJCWRldl9lcnIoZGV2LCAiJXM6IG1hcCBwYWdlcyBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKIAkJCWxpc3RfZGVsX2luaXQoJmZ3X2J1Zi0+cGVuZGluZ19saXN0KTsKIAkJCWNvbXBsZXRlX2FsbCgmZndfYnVmLT5jb21wbGV0aW9uKTsKIAkJCWJyZWFrOwpAQCAtOTAwLDcgKzkwMiw4IEBACiAJCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKGZfZGV2LCBmYWxzZSk7CiAJCWRldl9kYmcoZl9kZXYsICJmaXJtd2FyZTogcmVxdWVzdGluZyAlc1xuIiwgYnVmLT5md19pZCk7CiAJCWlmICh0aW1lb3V0ICE9IE1BWF9TQ0hFRFVMRV9USU1FT1VUKQotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmd19wcml2LT50aW1lb3V0X3dvcmssIHRpbWVvdXQpOworCQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJCSAgICZmd19wcml2LT50aW1lb3V0X3dvcmssIHRpbWVvdXQpOwogCiAJCWtvYmplY3RfdWV2ZW50KCZmd19wcml2LT5kZXYua29iaiwgS09CSl9BREQpOwogCX0KQEAgLTkwOCw2ICs5MTEsOCBAQAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJ1Zi0+Y29tcGxldGlvbik7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZ3X3ByaXYtPnRpbWVvdXRfd29yayk7CisJaWYgKCFidWYtPmRhdGEpCisJCXJldHZhbCA9IC1FTk9NRU07CiAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZl9kZXYsICZkZXZfYXR0cl9sb2FkaW5nKTsKIGVycl9kZWxfYmluX2F0dHI6CkBAIC0xNTcwLDggKzE1NzUsOCBAQAogICovCiBzdGF0aWMgdm9pZCBkZXZpY2VfdW5jYWNoZV9md19pbWFnZXNfZGVsYXkodW5zaWduZWQgbG9uZyBkZWxheSkKIHsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ3X2NhY2hlLndvcmssCi0JCQltc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZmd19jYWNoZS53b3JrLAorCQkJICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogfQogCiBzdGF0aWMgaW50IGZ3X3BtX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmeV9ibG9jaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9ub2RlLmMgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jCmluZGV4IGJjOWY0M2IuLjhmN2VkOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9ub2RlLmMKKysrIGIvZHJpdmVycy9iYXNlL25vZGUuYwpAQCAtNTk5LDcgKzU5OSwxMSBAQAogCiB2b2lkIHVucmVnaXN0ZXJfb25lX25vZGUoaW50IG5pZCkKIHsKKwlpZiAoIW5vZGVfZGV2aWNlc1tuaWRdKQorCQlyZXR1cm47CisKIAl1bnJlZ2lzdGVyX25vZGUobm9kZV9kZXZpY2VzW25pZF0pOworCWtmcmVlKG5vZGVfZGV2aWNlc1tuaWRdKTsKIAlub2RlX2RldmljZXNbbmlkXSA9IE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggYmM3ODg0OC4uZTcxNDcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTQ4MSwxMSArNDgxLDEwIEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKF9kZXYpOwogCWludCByZXQ7CiAKLQlpZiAoQUNQSV9IQU5ETEUoX2RldikpCi0JCWFjcGlfZGV2X3BtX2F0dGFjaChfZGV2LCB0cnVlKTsKKwlhY3BpX2Rldl9wbV9hdHRhY2goX2RldiwgdHJ1ZSk7CiAKIAlyZXQgPSBkcnYtPnByb2JlKGRldik7Ci0JaWYgKHJldCAmJiBBQ1BJX0hBTkRMRShfZGV2KSkKKwlpZiAocmV0KQogCQlhY3BpX2Rldl9wbV9kZXRhY2goX2RldiwgdHJ1ZSk7CiAKIAlpZiAoZHJ2LT5wcmV2ZW50X2RlZmVycmVkX3Byb2JlICYmIHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CkBAIC01MDgsOCArNTA3LDcgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gZHJ2LT5yZW1vdmUoZGV2KTsKLQlpZiAoQUNQSV9IQU5ETEUoX2RldikpCi0JCWFjcGlfZGV2X3BtX2RldGFjaChfZGV2LCB0cnVlKTsKKwlhY3BpX2Rldl9wbV9kZXRhY2goX2RldiwgdHJ1ZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTIwLDggKzUxOCw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKF9kZXYpOwogCiAJZHJ2LT5zaHV0ZG93bihkZXYpOwotCWlmIChBQ1BJX0hBTkRMRShfZGV2KSkKLQkJYWNwaV9kZXZfcG1fZGV0YWNoKF9kZXYsIHRydWUpOworCWFjcGlfZGV2X3BtX2RldGFjaChfZGV2LCB0cnVlKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMKaW5kZXggZTg3MGJiZS4uYjk5ZTZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYwpAQCAtNiw3ICs2LDYgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jCmluZGV4IDVkYTkxNDAuLmRmMmU1ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9jb21tb24uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY29tbW9uLmMKQEAgLTYsNyArNiw2IEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMKaW5kZXggZGMxMjdlNS4uNmY1NDk2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYwpAQCAtNiw3ICs2LDYgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW5fZ292ZXJub3IuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW5fZ292ZXJub3IuYwppbmRleCAyOGRlZTMwLi5hMDg5ZTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluX2dvdmVybm9yLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbl9nb3Zlcm5vci5jCkBAIC02LDcgKzYsNiBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jCmluZGV4IGZhNDE4NzQuLjI1NTM4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oCmluZGV4IDMzNDE0YjEuLjdkMTMyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmgKQEAgLTEzNCw2ICsxMzQsOCBAQAogCiAJLyogaWYgc2V0LCBjb252ZXJ0cyBidWxrIHJ3IHRvIHNpbmdsZSBydyAqLwogCWJvb2wgdXNlX3NpbmdsZV9ydzsKKwkvKiBpZiBzZXQsIHRoZSBkZXZpY2Ugc3VwcG9ydHMgbXVsdGkgd3JpdGUgbW9kZSAqLworCWJvb2wgY2FuX211bHRpX3dyaXRlOwogCiAJc3RydWN0IHJiX3Jvb3QgcmFuZ2VfdHJlZTsKIAl2b2lkICpzZWxlY3Rvcl93b3JrX2J1ZjsJLyogU2NyYXRjaCBidWZmZXIgdXNlZCBmb3Igc2VsZWN0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwppbmRleCBkNGRkNzcxLi4yOWI0MTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCkBAIC0yNDksMTEgKzI0OSwxMiBAQAogewogCXVuc2lnbmVkIGludCByZWc7CiAKLQlmb3IgKHJlZyA9IG1pbjsgcmVnIDw9IG1heDsgcmVnKyspIHsKKwlmb3IgKHJlZyA9IG1pbjsgcmVnIDw9IG1heDsgcmVnICs9IG1hcC0+cmVnX3N0cmlkZSkgewogCQl1bnNpZ25lZCBpbnQgdmFsOwogCQlpbnQgcmV0OwogCi0JCWlmIChyZWdtYXBfdm9sYXRpbGUobWFwLCByZWcpKQorCQlpZiAocmVnbWFwX3ZvbGF0aWxlKG1hcCwgcmVnKSB8fAorCQkgICAgIXJlZ21hcF93cml0ZWFibGUobWFwLCByZWcpKQogCQkJY29udGludWU7CiAKIAkJcmV0ID0gcmVnY2FjaGVfcmVhZChtYXAsIHJlZywgJnZhbCk7CkBAIC0zMTIsMTAgKzMxMyw2IEBACiAJLyogQXBwbHkgYW55IHBhdGNoIGZpcnN0ICovCiAJbWFwLT5jYWNoZV9ieXBhc3MgPSAxOwogCWZvciAoaSA9IDA7IGkgPCBtYXAtPnBhdGNoX3JlZ3M7IGkrKykgewotCQlpZiAobWFwLT5wYXRjaFtpXS5yZWcgJSBtYXAtPnJlZ19zdHJpZGUpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQogCQlyZXQgPSBfcmVnbWFwX3dyaXRlKG1hcCwgbWFwLT5wYXRjaFtpXS5yZWcsIG1hcC0+cGF0Y2hbaV0uZGVmKTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKG1hcC0+ZGV2LCAiRmFpbGVkIHRvIHdyaXRlICV4ID0gJXg6ICVkXG4iLApAQCAtNjM2LDEwICs2MzMsMTAgQEAKIAlpZiAoKmRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQljb3VudCA9IGN1ciAtIGJhc2U7CisJY291bnQgPSAoY3VyIC0gYmFzZSkgLyBtYXAtPnJlZ19zdHJpZGU7CiAKIAlkZXZfZGJnKG1hcC0+ZGV2LCAiV3JpdGluZyAlenUgYnl0ZXMgZm9yICVkIHJlZ2lzdGVycyBmcm9tIDB4JXgtMHgleFxuIiwKLQkJY291bnQgKiB2YWxfYnl0ZXMsIGNvdW50LCBiYXNlLCBjdXIgLSAxKTsKKwkJY291bnQgKiB2YWxfYnl0ZXMsIGNvdW50LCBiYXNlLCBjdXIgLSBtYXAtPnJlZ19zdHJpZGUpOwogCiAJbWFwLT5jYWNoZV9ieXBhc3MgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMKaW5kZXggYzU0NzFjZC4uNDVkODEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYwpAQCAtNTExLDcgKzUxMSw3IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgicmFuZ2UiLCAwNDAwLCBtYXAtPmRlYnVnZnMsCiAJCQkgICAgbWFwLCAmcmVnbWFwX3JlZ19yYW5nZXNfZm9wcyk7CiAKLQlpZiAobWFwLT5tYXhfcmVnaXN0ZXIpIHsKKwlpZiAobWFwLT5tYXhfcmVnaXN0ZXIgfHwgcmVnbWFwX3JlYWRhYmxlKG1hcCwgMCkpIHsKIAkJZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXJzIiwgMDQwMCwgbWFwLT5kZWJ1Z2ZzLAogCQkJCSAgICBtYXAsICZyZWdtYXBfbWFwX2ZvcHMpOwogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhY2Nlc3MiLCAwNDAwLCBtYXAtPmRlYnVnZnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pMmMuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCmluZGV4IGZhNmJmNTIuLmViZDE4OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiBzdGF0aWMgaW50IHJlZ21hcF9pMmNfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtaXJxLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYwppbmRleCA4MjY5MjA2Li5lZGY4OGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1pcnEuYwpAQCAtMzY4LDggKzM2OCw2IEBACiAJaWYgKCFkKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCSpkYXRhID0gZDsKLQogCWQtPnN0YXR1c19idWYgPSBremFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICogY2hpcC0+bnVtX3JlZ3MsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFkLT5zdGF0dXNfYnVmKQpAQCAtNTA2LDYgKzUwNCw4IEBACiAJCWdvdG8gZXJyX2RvbWFpbjsKIAl9CiAKKwkqZGF0YSA9IGQ7CisKIAlyZXR1cm4gMDsKIAogZXJyX2RvbWFpbjoKQEAgLTUzMyw3ICs1MzMsNyBAQAogCQlyZXR1cm47CiAKIAlmcmVlX2lycShpcnEsIGQpOwotCS8qIFdlIHNob3VsZCB1bm1hcCB0aGUgZG9tYWluIGJ1dC4uLiAqLworCWlycV9kb21haW5fcmVtb3ZlKGQtPmRvbWFpbik7CiAJa2ZyZWUoZC0+d2FrZV9idWYpOwogCWtmcmVlKGQtPm1hc2tfYnVmX2RlZik7CiAJa2ZyZWUoZC0+bWFza19idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtbW1pby5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtbW1pby5jCmluZGV4IDgxZjk3NzUuLjFlMDNlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLW1taW8uYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1tbWlvLmMKQEAgLTE4LDcgKzE4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtMjYsMTAgKzI1LDQ3IEBACiAKIHN0cnVjdCByZWdtYXBfbW1pb19jb250ZXh0IHsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgcmVnX2J5dGVzOwogCXVuc2lnbmVkIHZhbF9ieXRlczsKKwl1bnNpZ25lZCBwYWRfYnl0ZXM7CiAJc3RydWN0IGNsayAqY2xrOwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIHJlZ21hcF9tbWlvX3JlZ3NpemVfY2hlY2soc2l6ZV90IHJlZ19zaXplKQoreworCXN3aXRjaCAocmVnX3NpemUpIHsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgNDoKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwljYXNlIDg6CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgaW50IHJlZ21hcF9tbWlvX3JlZ2JpdHNfY2hlY2soc2l6ZV90IHJlZ19iaXRzKQoreworCXN3aXRjaCAocmVnX2JpdHMpIHsKKwljYXNlIDg6CisJY2FzZSAxNjoKKwljYXNlIDMyOgorI2lmZGVmIENPTkZJR182NEJJVAorCWNhc2UgNjQ6CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnbWFwX21taW9fY291bnRfY2hlY2soc2l6ZV90IGNvdW50KQoreworCUJVR19PTihjb3VudCAlIDIgIT0gMCk7Cit9CisKIHN0YXRpYyBpbnQgcmVnbWFwX21taW9fZ2F0aGVyX3dyaXRlKHZvaWQgKmNvbnRleHQsCiAJCQkJICAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAogCQkJCSAgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKQEAgLTM4LDcgKzc0LDcgQEAKIAl1MzIgb2Zmc2V0OwogCWludCByZXQ7CiAKLQlCVUdfT04ocmVnX3NpemUgIT0gNCk7CisJcmVnbWFwX21taW9fcmVnc2l6ZV9jaGVjayhyZWdfc2l6ZSk7CiAKIAlpZiAoIUlTX0VSUihjdHgtPmNsaykpIHsKIAkJcmV0ID0gY2xrX2VuYWJsZShjdHgtPmNsayk7CkBAIC04MSw5ICsxMTcsMTMgQEAKIAogc3RhdGljIGludCByZWdtYXBfbW1pb193cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCiB7Ci0JQlVHX09OKGNvdW50IDwgNCk7CisJc3RydWN0IHJlZ21hcF9tbWlvX2NvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisJdTMyIG9mZnNldCA9IGN0eC0+cmVnX2J5dGVzICsgY3R4LT5wYWRfYnl0ZXM7CiAKLQlyZXR1cm4gcmVnbWFwX21taW9fZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIDQsIGRhdGEgKyA0LCBjb3VudCAtIDQpOworCXJlZ21hcF9tbWlvX2NvdW50X2NoZWNrKGNvdW50KTsKKworCXJldHVybiByZWdtYXBfbW1pb19nYXRoZXJfd3JpdGUoY29udGV4dCwgZGF0YSwgY3R4LT5yZWdfYnl0ZXMsCisJCQkJCWRhdGEgKyBvZmZzZXQsIGNvdW50IC0gb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCByZWdtYXBfbW1pb19yZWFkKHZvaWQgKmNvbnRleHQsCkBAIC05NCw3ICsxMzQsNyBAQAogCXUzMiBvZmZzZXQ7CiAJaW50IHJldDsKIAotCUJVR19PTihyZWdfc2l6ZSAhPSA0KTsKKwlyZWdtYXBfbW1pb19yZWdzaXplX2NoZWNrKHJlZ19zaXplKTsKIAogCWlmICghSVNfRVJSKGN0eC0+Y2xrKSkgewogCQlyZXQgPSBjbGtfZW5hYmxlKGN0eC0+Y2xrKTsKQEAgLTE2NSw4ICsyMDUsOSBAQAogCWludCBtaW5fc3RyaWRlOwogCWludCByZXQ7CiAKLQlpZiAoY29uZmlnLT5yZWdfYml0cyAhPSAzMikKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJcmV0ID0gcmVnbWFwX21taW9fcmVnYml0c19jaGVjayhjb25maWctPnJlZ19iaXRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCiAJaWYgKGNvbmZpZy0+cGFkX2JpdHMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjA5LDYgKzI1MCw4IEBACiAKIAljdHgtPnJlZ3MgPSByZWdzOwogCWN0eC0+dmFsX2J5dGVzID0gY29uZmlnLT52YWxfYml0cyAvIDg7CisJY3R4LT5yZWdfYnl0ZXMgPSBjb25maWctPnJlZ19iaXRzIC8gODsKKwljdHgtPnBhZF9ieXRlcyA9IGNvbmZpZy0+cGFkX2JpdHMgLyA4OwogCWN0eC0+Y2xrID0gRVJSX1BUUigtRU5PREVWKTsKIAogCWlmIChjbGtfaWQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLXNwaS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKaW5kZXggMzdmMTJhZS4uMGViMzA5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BpLmMKQEAgLTEyLDcgKzEyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BtaS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3BtaS5jCmluZGV4IGFjMjM5MTAuLmQ3MDI2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLXNwbWkuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1zcG1pLmMKQEAgLTIyLDY5ICsyMiwyMzUgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLXN0YXRpYyBpbnQgcmVnbWFwX3NwbWlfcmVhZCh2b2lkICpjb250ZXh0LAotCQkJICAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAotCQkJICAgIHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQorc3RhdGljIGludCByZWdtYXBfc3BtaV9iYXNlX3JlYWQodm9pZCAqY29udGV4dCwKKwkJCQkgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCisJCQkJIHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQogewotCUJVR19PTihyZWdfc2l6ZSAhPSAyKTsKLQlyZXR1cm4gc3BtaV9leHRfcmVnaXN0ZXJfcmVhZGwoY29udGV4dCwgKih1MTYgKilyZWcsCi0JCQkJICAgICAgIHZhbCwgdmFsX3NpemUpOworCXU4IGFkZHIgPSAqKHU4ICopcmVnOworCWludCBlcnIgPSAwOworCisJQlVHX09OKHJlZ19zaXplICE9IDEpOworCisJd2hpbGUgKHZhbF9zaXplLS0gJiYgIWVycikKKwkJZXJyID0gc3BtaV9yZWdpc3Rlcl9yZWFkKGNvbnRleHQsIGFkZHIrKywgdmFsKyspOworCisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWdtYXBfc3BtaV9nYXRoZXJfd3JpdGUodm9pZCAqY29udGV4dCwKLQkJCQkgICAgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCi0JCQkJICAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQorc3RhdGljIGludCByZWdtYXBfc3BtaV9iYXNlX2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAorCQkJCQkgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCisJCQkJCSBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKIHsKLQlCVUdfT04ocmVnX3NpemUgIT0gMik7Ci0JcmV0dXJuIHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlbChjb250ZXh0LCAqKHUxNiAqKXJlZywgdmFsLCB2YWxfc2l6ZSk7CisJY29uc3QgdTggKmRhdGEgPSB2YWw7CisJdTggYWRkciA9ICoodTggKilyZWc7CisJaW50IGVyciA9IDA7CisKKwlCVUdfT04ocmVnX3NpemUgIT0gMSk7CisKKwkvKgorCSAqIFNQTUkgZGVmaW5lcyBhIG1vcmUgYmFuZHdpZHRoLWVmZmljaWVudCAnUmVnaXN0ZXIgMCBXcml0ZScgc2VxdWVuY2UsCisJICogdXNlIGl0IHdoZW4gcG9zc2libGUuCisJICovCisJaWYgKGFkZHIgPT0gMCAmJiB2YWxfc2l6ZSkgeworCQllcnIgPSBzcG1pX3JlZ2lzdGVyX3plcm9fd3JpdGUoY29udGV4dCwgKmRhdGEpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWRhdGErKzsKKwkJYWRkcisrOworCQl2YWxfc2l6ZS0tOworCX0KKworCXdoaWxlICh2YWxfc2l6ZSkgeworCQllcnIgPSBzcG1pX3JlZ2lzdGVyX3dyaXRlKGNvbnRleHQsIGFkZHIsICpkYXRhKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKworCQlkYXRhKys7CisJCWFkZHIrKzsKKwkJdmFsX3NpemUtLTsKKwl9CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWdtYXBfc3BtaV93cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLAotCQkJICAgICBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHJlZ21hcF9zcG1pX2Jhc2Vfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIHNpemVfdCBjb3VudCkKIHsKLQlCVUdfT04oY291bnQgPCAyKTsKLQlyZXR1cm4gcmVnbWFwX3NwbWlfZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIDIsIGRhdGEgKyAyLCBjb3VudCAtIDIpOworCUJVR19PTihjb3VudCA8IDEpOworCXJldHVybiByZWdtYXBfc3BtaV9iYXNlX2dhdGhlcl93cml0ZShjb250ZXh0LCBkYXRhLCAxLCBkYXRhICsgMSwKKwkJCQkJICAgICBjb3VudCAtIDEpOwogfQogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9idXMgcmVnbWFwX3NwbWkgPSB7Ci0JLnJlYWQJCQkJPSByZWdtYXBfc3BtaV9yZWFkLAotCS53cml0ZQkJCQk9IHJlZ21hcF9zcG1pX3dyaXRlLAotCS5nYXRoZXJfd3JpdGUJCQk9IHJlZ21hcF9zcG1pX2dhdGhlcl93cml0ZSwKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfc3BtaV9iYXNlID0geworCS5yZWFkCQkJCT0gcmVnbWFwX3NwbWlfYmFzZV9yZWFkLAorCS53cml0ZQkJCQk9IHJlZ21hcF9zcG1pX2Jhc2Vfd3JpdGUsCisJLmdhdGhlcl93cml0ZQkJCT0gcmVnbWFwX3NwbWlfYmFzZV9nYXRoZXJfd3JpdGUsCiAJLnJlZ19mb3JtYXRfZW5kaWFuX2RlZmF1bHQJPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKIAkudmFsX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdAk9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAogfTsKIAogLyoqCi0gKiByZWdtYXBfaW5pdF9zcG1pKCk6IEluaXRpYWxpemUgcmVnaXN0ZXIgbWFwCi0gKgotICogQHNkZXY6IERldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCi0gKiBAY29uZmlnOiBDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKKyAqIHJlZ21hcF9pbml0X3NwbWlfYmFzZSgpOiBDcmVhdGUgcmVnbWFwIGZvciB0aGUgQmFzZSByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CVNQTUkgZGV2aWNlIHRoYXQgd2lsbCBiZSBpbnRlcmFjdGVkIHdpdGgKKyAqIEBjb25maWc6CUNvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAogICoKICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyIHRvCiAgKiBhIHN0cnVjdCByZWdtYXAuCiAgKi8KLXN0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAotCQkJCWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKIHsKLQlyZXR1cm4gcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pLCBzZGV2LCBjb25maWcpOworCXJldHVybiByZWdtYXBfaW5pdCgmc2Rldi0+ZGV2LCAmcmVnbWFwX3NwbWlfYmFzZSwgc2RldiwgY29uZmlnKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9pbml0X3NwbWkpOworRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2luaXRfc3BtaV9iYXNlKTsKIAogLyoqCi0gKiBkZXZtX3JlZ21hcF9pbml0X3NwbWkoKTogSW5pdGlhbGlzZSBtYW5hZ2VkIHJlZ2lzdGVyIG1hcAotICoKLSAqIEBzZGV2OiBEZXZpY2UgdGhhdCB3aWxsIGJlIGludGVyYWN0ZWQgd2l0aAotICogQGNvbmZpZzogQ29uZmlndXJhdGlvbiBmb3IgcmVnaXN0ZXIgbWFwCisgKiBkZXZtX3JlZ21hcF9pbml0X3NwbWlfYmFzZSgpOiBDcmVhdGUgbWFuYWdlZCByZWdtYXAgZm9yIEJhc2UgcmVnaXN0ZXIgc3BhY2UKKyAqIEBzZGV2OglTUE1JIGRldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCisgKiBAY29uZmlnOglDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKICAqCiAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gRVJSX1BUUigpIG9uIGVycm9yIG9yIGEgdmFsaWQgcG9pbnRlcgogICogdG8gYSBzdHJ1Y3QgcmVnbWFwLiAgVGhlIHJlZ21hcCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgYnkgdGhlCiAgKiBkZXZpY2UgbWFuYWdlbWVudCBjb2RlLgogICovCi1zdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X3NwbWkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIGRldm1fcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pX2Jhc2UsIHNkZXYsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlZ21hcF9pbml0X3NwbWlfYmFzZSk7CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X3JlYWQodm9pZCAqY29udGV4dCwKKwkJCQljb25zdCB2b2lkICpyZWcsIHNpemVfdCByZWdfc2l6ZSwKKwkJCQl2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzaXplX3QgbGVuOworCXUxNiBhZGRyOworCisJQlVHX09OKHJlZ19zaXplICE9IDIpOworCisJYWRkciA9ICoodTE2ICopcmVnOworCisJLyoKKwkgKiBTcGxpdCBhY2Nlc3NlcyBpbnRvIHR3byB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbW9yZQorCSAqIGJhbmR3aWR0aC1lZmZpY2llbnQgJ0V4dGVuZGVkIFJlZ2lzdGVyIFJlYWQnIGNvbW1hbmQgd2hlbiBwb3NzaWJsZQorCSAqLworCXdoaWxlIChhZGRyIDw9IDB4RkYgJiYgdmFsX3NpemUpIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCB2YWxfc2l6ZSwgMTYpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWQoY29udGV4dCwgYWRkciwgdmFsLCBsZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCisJd2hpbGUgKHZhbF9zaXplKSB7CisJCWxlbiA9IG1pbl90KHNpemVfdCwgdmFsX3NpemUsIDgpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKGNvbnRleHQsIGFkZHIsIHZhbCwgdmFsX3NpemUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAorCQkJCQljb25zdCB2b2lkICpyZWcsIHNpemVfdCByZWdfc2l6ZSwKKwkJCQkJY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX3NpemUpCit7CisJaW50IGVyciA9IDA7CisJc2l6ZV90IGxlbjsKKwl1MTYgYWRkcjsKKworCUJVR19PTihyZWdfc2l6ZSAhPSAyKTsKKworCWFkZHIgPSAqKHUxNiAqKXJlZzsKKworCXdoaWxlIChhZGRyIDw9IDB4RkYgJiYgdmFsX3NpemUpIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCB2YWxfc2l6ZSwgMTYpOworCisJCWVyciA9IHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlKGNvbnRleHQsIGFkZHIsIHZhbCwgbGVuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKworCQlhZGRyICs9IGxlbjsKKwkJdmFsICs9IGxlbjsKKwkJdmFsX3NpemUgLT0gbGVuOworCX0KKworCXdoaWxlICh2YWxfc2l6ZSkgeworCQlsZW4gPSBtaW5fdChzaXplX3QsIHZhbF9zaXplLCA4KTsKKworCQllcnIgPSBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoY29udGV4dCwgYWRkciwgdmFsLCBsZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWFkZHIgKz0gbGVuOworCQl2YWwgKz0gbGVuOworCQl2YWxfc2l6ZSAtPSBsZW47CisJfQorCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwbWlfZXh0X3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlCVUdfT04oY291bnQgPCAyKTsKKwlyZXR1cm4gcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZShjb250ZXh0LCBkYXRhLCAyLCBkYXRhICsgMiwKKwkJCQkJICAgIGNvdW50IC0gMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfc3BtaV9leHQgPSB7CisJLnJlYWQJCQkJPSByZWdtYXBfc3BtaV9leHRfcmVhZCwKKwkud3JpdGUJCQkJPSByZWdtYXBfc3BtaV9leHRfd3JpdGUsCisJLmdhdGhlcl93cml0ZQkJCT0gcmVnbWFwX3NwbWlfZXh0X2dhdGhlcl93cml0ZSwKKwkucmVnX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdAk9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorCS52YWxfZm9ybWF0X2VuZGlhbl9kZWZhdWx0CT0gUkVHTUFQX0VORElBTl9OQVRJVkUsCit9OworCisvKioKKyAqIHJlZ21hcF9pbml0X3NwbWlfZXh0KCk6IENyZWF0ZSByZWdtYXAgZm9yIEV4dCByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CURldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCisgKiBAY29uZmlnOglDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gRVJSX1BUUigpIG9uIGVycm9yIG9yIGEgdmFsaWQgcG9pbnRlciB0bworICogYSBzdHJ1Y3QgcmVnbWFwLgorICovCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2V4dChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIHJlZ21hcF9pbml0KCZzZGV2LT5kZXYsICZyZWdtYXBfc3BtaV9leHQsIHNkZXYsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfaW5pdF9zcG1pX2V4dCk7CisKKy8qKgorICogZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2V4dCgpOiBDcmVhdGUgbWFuYWdlZCByZWdtYXAgZm9yIEV4dCByZWdpc3RlciBzcGFjZQorICogQHNkZXY6CVNQTUkgZGV2aWNlIHRoYXQgd2lsbCBiZSBpbnRlcmFjdGVkIHdpdGgKKyAqIEBjb25maWc6CUNvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyCisgKiB0byBhIHN0cnVjdCByZWdtYXAuICBUaGUgcmVnbWFwIHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCBieSB0aGUKKyAqIGRldmljZSBtYW5hZ2VtZW50IGNvZGUuCisgKi8KK3N0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfc3BtaV9leHQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKIHsKLQlyZXR1cm4gZGV2bV9yZWdtYXBfaW5pdCgmc2Rldi0+ZGV2LCAmcmVnbWFwX3NwbWksIHNkZXYsIGNvbmZpZyk7CisJcmV0dXJuIGRldm1fcmVnbWFwX2luaXQoJnNkZXYtPmRldiwgJnJlZ21hcF9zcG1pX2V4dCwgc2RldiwgY29uZmlnKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRldm1fcmVnbWFwX2luaXRfc3BtaSk7CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlZ21hcF9pbml0X3NwbWlfZXh0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMKaW5kZXggNmExOTUxNS4uZDBhMDcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCkBAIC0zODAsNiArMzgwLDI4IEBACiAJa2ZyZWUobWFwLT5zZWxlY3Rvcl93b3JrX2J1Zik7CiB9CiAKK2ludCByZWdtYXBfYXR0YWNoX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgcmVnbWFwICoqbTsKKworCW1hcC0+ZGV2ID0gZGV2OworCisJcmVnbWFwX2RlYnVnZnNfaW5pdChtYXAsIGNvbmZpZy0+bmFtZSk7CisKKwkvKiBBZGQgYSBkZXZyZXMgcmVzb3VyY2UgZm9yIGRldl9nZXRfcmVnbWFwKCkgKi8KKwltID0gZGV2cmVzX2FsbG9jKGRldl9nZXRfcmVnbWFwX3JlbGVhc2UsIHNpemVvZigqbSksIEdGUF9LRVJORUwpOworCWlmICghbSkgeworCQlyZWdtYXBfZGVidWdmc19leGl0KG1hcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkqbSA9IG1hcDsKKwlkZXZyZXNfYWRkKGRldiwgbSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9hdHRhY2hfZGV2KTsKKwogLyoqCiAgKiByZWdtYXBfaW5pdCgpOiBJbml0aWFsaXNlIHJlZ2lzdGVyIG1hcAogICoKQEAgLTM5Nyw3ICs0MTksNyBAQAogCQkJICAgdm9pZCAqYnVzX2NvbnRleHQsCiAJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKQogewotCXN0cnVjdCByZWdtYXAgKm1hcCwgKiptOworCXN0cnVjdCByZWdtYXAgKm1hcDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAllbnVtIHJlZ21hcF9lbmRpYW4gcmVnX2VuZGlhbiwgdmFsX2VuZGlhbjsKIAlpbnQgaSwgajsKQEAgLTQzOSw2ICs0NjEsNyBAQAogCWVsc2UKIAkJbWFwLT5yZWdfc3RyaWRlID0gMTsKIAltYXAtPnVzZV9zaW5nbGVfcncgPSBjb25maWctPnVzZV9zaW5nbGVfcnc7CisJbWFwLT5jYW5fbXVsdGlfd3JpdGUgPSBjb25maWctPmNhbl9tdWx0aV93cml0ZTsKIAltYXAtPmRldiA9IGRldjsKIAltYXAtPmJ1cyA9IGJ1czsKIAltYXAtPmJ1c19jb250ZXh0ID0gYnVzX2NvbnRleHQ7CkBAIC03MTgsNyArNzQxLDcgQEAKIAkJbmV3LT53aW5kb3dfc3RhcnQgPSByYW5nZV9jZmctPndpbmRvd19zdGFydDsKIAkJbmV3LT53aW5kb3dfbGVuID0gcmFuZ2VfY2ZnLT53aW5kb3dfbGVuOwogCi0JCWlmIChfcmVnbWFwX3JhbmdlX2FkZChtYXAsIG5ldykgPT0gZmFsc2UpIHsKKwkJaWYgKCFfcmVnbWFwX3JhbmdlX2FkZChtYXAsIG5ldykpIHsKIAkJCWRldl9lcnIobWFwLT5kZXYsICJGYWlsZWQgdG8gYWRkIHJhbmdlICVkXG4iLCBpKTsKIAkJCWtmcmVlKG5ldyk7CiAJCQlnb3RvIGVycl9yYW5nZTsKQEAgLTczNCwyNSArNzU3LDE4IEBACiAJCX0KIAl9CiAKLQlyZWdtYXBfZGVidWdmc19pbml0KG1hcCwgY29uZmlnLT5uYW1lKTsKLQogCXJldCA9IHJlZ2NhY2hlX2luaXQobWFwLCBjb25maWcpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJfcmFuZ2U7CiAKLQkvKiBBZGQgYSBkZXZyZXMgcmVzb3VyY2UgZm9yIGRldl9nZXRfcmVnbWFwKCkgKi8KLQltID0gZGV2cmVzX2FsbG9jKGRldl9nZXRfcmVnbWFwX3JlbGVhc2UsIHNpemVvZigqbSksIEdGUF9LRVJORUwpOwotCWlmICghbSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kZWJ1Z2ZzOwotCX0KLQkqbSA9IG1hcDsKLQlkZXZyZXNfYWRkKGRldiwgbSk7CisJaWYgKGRldikKKwkJcmV0ID0gcmVnbWFwX2F0dGFjaF9kZXYoZGV2LCBtYXAsIGNvbmZpZyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyX3JlZ2NhY2hlOwogCiAJcmV0dXJuIG1hcDsKIAotZXJyX2RlYnVnZnM6Ci0JcmVnbWFwX2RlYnVnZnNfZXhpdChtYXApOworZXJyX3JlZ2NhY2hlOgogCXJlZ2NhY2hlX2V4aXQobWFwKTsKIGVycl9yYW5nZToKIAlyZWdtYXBfcmFuZ2VfZXhpdChtYXApOwpAQCAtMTUyMCwxMiArMTUzNiwxMiBAQAogCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOwogCS8qCiAJICogU29tZSBkZXZpY2VzIGRvbid0IHN1cHBvcnQgYnVsayB3cml0ZSwgZm9yCiAJICogdGhlbSB3ZSBoYXZlIGEgc2VyaWVzIG9mIHNpbmdsZSB3cml0ZSBvcGVyYXRpb25zLgogCSAqLwogCWlmICghbWFwLT5idXMgfHwgbWFwLT51c2Vfc2luZ2xlX3J3KSB7CisJCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKIAkJZm9yIChpID0gMDsgaSA8IHZhbF9jb3VudDsgaSsrKSB7CiAJCQl1bnNpZ25lZCBpbnQgaXZhbDsKIApAQCAtMTU1NCwzMSArMTU3MCwyMzkgQEAKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQlnb3RvIG91dDsKIAkJfQorb3V0OgorCQltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIAl9IGVsc2UgewogCQl2b2lkICp3dmFsOwogCiAJCXd2YWwgPSBrbWVtZHVwKHZhbCwgdmFsX2NvdW50ICogdmFsX2J5dGVzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF3dmFsKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwogCQkJZGV2X2VycihtYXAtPmRldiwgIkVycm9yIGluIG1lbW9yeSBhbGxvY2F0aW9uXG4iKTsKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IHZhbF9jb3VudCAqIHZhbF9ieXRlczsgaSArPSB2YWxfYnl0ZXMpCiAJCQltYXAtPmZvcm1hdC5wYXJzZV9pbnBsYWNlKHd2YWwgKyBpKTsKIAorCQltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7CiAJCXJldCA9IF9yZWdtYXBfcmF3X3dyaXRlKG1hcCwgcmVnLCB3dmFsLCB2YWxfYnl0ZXMgKiB2YWxfY291bnQpOworCQltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIAogCQlrZnJlZSh3dmFsKTsKIAl9Ci1vdXQ6Ci0JbWFwLT51bmxvY2sobWFwLT5sb2NrX2FyZyk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9idWxrX3dyaXRlKTsKIAogLyoKKyAqIF9yZWdtYXBfcmF3X211bHRpX3JlZ193cml0ZSgpCisgKgorICogdGhlIChyZWdpc3RlcixuZXd2YWx1ZSkgcGFpcnMgaW4gcmVncyBoYXZlIG5vdCBiZWVuIGZvcm1hdHRlZCwgYnV0CisgKiB0aGV5IGFyZSBhbGwgaW4gdGhlIHNhbWUgcGFnZSBhbmQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gYmVpbmcgcGFnZQorICogcmVsYXRpdmUuIFRoZSBwYWdlIHJlZ2lzdGVyIGhhcyBiZWVuIHdyaXR0ZW4gaWYgdGhhdCB3YXMgbmVjY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgKnJlZ3MsCisJCQkJICAgICAgIHNpemVfdCBudW1fcmVncykKK3sKKwlpbnQgcmV0OworCXZvaWQgKmJ1ZjsKKwlpbnQgaTsKKwl1OCAqdTg7CisJc2l6ZV90IHZhbF9ieXRlcyA9IG1hcC0+Zm9ybWF0LnZhbF9ieXRlczsKKwlzaXplX3QgcmVnX2J5dGVzID0gbWFwLT5mb3JtYXQucmVnX2J5dGVzOworCXNpemVfdCBwYWRfYnl0ZXMgPSBtYXAtPmZvcm1hdC5wYWRfYnl0ZXM7CisJc2l6ZV90IHBhaXJfc2l6ZSA9IHJlZ19ieXRlcyArIHBhZF9ieXRlcyArIHZhbF9ieXRlczsKKwlzaXplX3QgbGVuID0gcGFpcl9zaXplICogbnVtX3JlZ3M7CisKKwlidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogV2UgaGF2ZSB0byBsaW5lYXJpc2UgYnkgaGFuZC4gKi8KKworCXU4ID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJaW50IHJlZyA9IHJlZ3NbaV0ucmVnOworCQlpbnQgdmFsID0gcmVnc1tpXS5kZWY7CisJCXRyYWNlX3JlZ21hcF9od193cml0ZV9zdGFydChtYXAtPmRldiwgcmVnLCAxKTsKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyh1OCwgcmVnLCBtYXAtPnJlZ19zaGlmdCk7CisJCXU4ICs9IHJlZ19ieXRlcyArIHBhZF9ieXRlczsKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3ZhbCh1OCwgdmFsLCAwKTsKKwkJdTggKz0gdmFsX2J5dGVzOworCX0KKwl1OCA9IGJ1ZjsKKwkqdTggfD0gbWFwLT53cml0ZV9mbGFnX21hc2s7CisKKwlyZXQgPSBtYXAtPmJ1cy0+d3JpdGUobWFwLT5idXNfY29udGV4dCwgYnVmLCBsZW4pOworCisJa2ZyZWUoYnVmKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CisJCWludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJdHJhY2VfcmVnbWFwX2h3X3dyaXRlX2RvbmUobWFwLT5kZXYsIHJlZywgMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX3JlZ21hcF9yZWdpc3Rlcl9wYWdlKHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCQkgIHN0cnVjdCByZWdtYXBfcmFuZ2Vfbm9kZSAqcmFuZ2UpCit7CisJdW5zaWduZWQgaW50IHdpbl9wYWdlID0gKHJlZyAtIHJhbmdlLT5yYW5nZV9taW4pIC8gcmFuZ2UtPndpbmRvd19sZW47CisKKwlyZXR1cm4gd2luX3BhZ2U7Cit9CisKK3N0YXRpYyBpbnQgX3JlZ21hcF9yYW5nZV9tdWx0aV9wYWdlZF9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCQkgICAgICAgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAorCQkJCQkgICAgICAgc2l6ZV90IG51bV9yZWdzKQoreworCWludCByZXQ7CisJaW50IGksIG47CisJc3RydWN0IHJlZ19kZWZhdWx0ICpiYXNlOworCXVuc2lnbmVkIGludCB0aGlzX3BhZ2U7CisJLyoKKwkgKiB0aGUgc2V0IG9mIHJlZ2lzdGVycyBhcmUgbm90IG5lY2Nlc3NhcmlseSBpbiBvcmRlciwgYnV0CisJICogc2luY2UgdGhlIG9yZGVyIG9mIHdyaXRlIG11c3QgYmUgcHJlc2VydmVkIHRoaXMgYWxnb3JpdGhtCisJICogY2hvcHMgdGhlIHNldCBlYWNoIHRpbWUgdGhlIHBhZ2UgY2hhbmdlcworCSAqLworCWJhc2UgPSByZWdzOworCWZvciAoaSA9IDAsIG4gPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKywgbisrKSB7CisJCXVuc2lnbmVkIGludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJc3RydWN0IHJlZ21hcF9yYW5nZV9ub2RlICpyYW5nZTsKKworCQlyYW5nZSA9IF9yZWdtYXBfcmFuZ2VfbG9va3VwKG1hcCwgcmVnKTsKKwkJaWYgKHJhbmdlKSB7CisJCQl1bnNpZ25lZCBpbnQgd2luX3BhZ2UgPSBfcmVnbWFwX3JlZ2lzdGVyX3BhZ2UobWFwLCByZWcsCisJCQkJCQkJCSAgICAgIHJhbmdlKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQl0aGlzX3BhZ2UgPSB3aW5fcGFnZTsKKwkJCWlmICh3aW5fcGFnZSAhPSB0aGlzX3BhZ2UpIHsKKwkJCQl0aGlzX3BhZ2UgPSB3aW5fcGFnZTsKKwkJCQlyZXQgPSBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUobWFwLCBiYXNlLCBuKTsKKwkJCQlpZiAocmV0ICE9IDApCisJCQkJCXJldHVybiByZXQ7CisJCQkJYmFzZSArPSBuOworCQkJCW4gPSAwOworCQkJfQorCQkJcmV0ID0gX3JlZ21hcF9zZWxlY3RfcGFnZShtYXAsICZiYXNlW25dLnJlZywgcmFuZ2UsIDEpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKG4gPiAwKQorCQlyZXR1cm4gX3JlZ21hcF9yYXdfbXVsdGlfcmVnX3dyaXRlKG1hcCwgYmFzZSwgbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKKwkJCQkgICBzaXplX3QgbnVtX3JlZ3MpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmICghbWFwLT5jYW5fbXVsdGlfd3JpdGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFtYXAtPmZvcm1hdC5wYXJzZV9pbnBsYWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXAtPndyaXRlYWJsZV9yZWcpCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CisJCQlpbnQgcmVnID0gcmVnc1tpXS5yZWc7CisJCQlpZiAoIW1hcC0+d3JpdGVhYmxlX3JlZyhtYXAtPmRldiwgcmVnKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCWlmICghbWFwLT5jYWNoZV9ieXBhc3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCB2YWwgPSByZWdzW2ldLmRlZjsKKwkJCXVuc2lnbmVkIGludCByZWcgPSByZWdzW2ldLnJlZzsKKwkJCXJldCA9IHJlZ2NhY2hlX3dyaXRlKG1hcCwgcmVnLCB2YWwpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIobWFwLT5kZXYsCisJCQkJIkVycm9yIGluIGNhY2hpbmcgb2YgcmVnaXN0ZXI6ICV4IHJldDogJWRcbiIsCisJCQkJCQkJCXJlZywgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCWlmIChtYXAtPmNhY2hlX29ubHkpIHsKKwkJCW1hcC0+Y2FjaGVfZGlydHkgPSB0cnVlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlXQVJOX09OKCFtYXAtPmJ1cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgcmVnID0gcmVnc1tpXS5yZWc7CisJCXN0cnVjdCByZWdtYXBfcmFuZ2Vfbm9kZSAqcmFuZ2U7CisJCXJhbmdlID0gX3JlZ21hcF9yYW5nZV9sb29rdXAobWFwLCByZWcpOworCQlpZiAocmFuZ2UpIHsKKwkJCXNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IHJlZ19kZWZhdWx0KSpudW1fcmVnczsKKwkJCXN0cnVjdCByZWdfZGVmYXVsdCAqYmFzZSA9IGttZW1kdXAocmVncywgbGVuLAorCQkJCQkJCSAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFiYXNlKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gX3JlZ21hcF9yYW5nZV9tdWx0aV9wYWdlZF9yZWdfd3JpdGUobWFwLCBiYXNlLAorCQkJCQkJCQkgIG51bV9yZWdzKTsKKwkJCWtmcmVlKGJhc2UpOworCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiBfcmVnbWFwX3Jhd19tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7Cit9CisKKy8qCiAgKiByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKCk6IFdyaXRlIG11bHRpcGxlIHJlZ2lzdGVycyB0byB0aGUgZGV2aWNlCiAgKgorICogd2hlcmUgdGhlIHNldCBvZiByZWdpc3Rlcix2YWx1ZSBwYWlycyBhcmUgc3VwcGxpZWQgaW4gYW55IG9yZGVyLAorICogcG9zc2libHkgbm90IGFsbCBpbiBhIHNpbmdsZSByYW5nZS4KKyAqCisgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KKyAqIEByZWdzOiBBcnJheSBvZiBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgcmVnaXN0ZXIsdmFsdWUgdG8gYmUgd3JpdHRlbgorICogQG51bV9yZWdzOiBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHdyaXRlCisgKgorICogVGhlICdub3JtYWwnIGJsb2NrIHdyaXRlIG1vZGUgd2lsbCBzZW5kIHVsdGltYXRlbHkgc2VuZCBkYXRhIG9uIHRoZQorICogdGFyZ2V0IGJ1cyBhcyBSLFYxLFYyLFYzLC4uLFZuIHdoZXJlIHN1Y2Nlc3NpdmVseSBoaWdlciByZWdpc3RlcnMgYXJlCisgKiBhZGRyZXNzZWQuIEhvd2V2ZXIsIHRoaXMgYWx0ZXJuYXRpdmUgYmxvY2sgbXVsdGkgd3JpdGUgbW9kZSB3aWxsIHNlbmQKKyAqIHRoZSBkYXRhIGFzIFIxLFYxLFIyLFYyLC4uLFJuLFZuIG9uIHRoZSB0YXJnZXQgYnVzLiBUaGUgdGFyZ2V0IGRldmljZQorICogbXVzdCBvZiBjb3Vyc2Ugc3VwcG9ydCB0aGUgbW9kZS4KKyAqCisgKiBBIHZhbHVlIG9mIHplcm8gd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHdpbGwgYmUKKyAqIHJldHVybmVkIGluIGVycm9yIGNhc2VzLgorICovCitpbnQgcmVnbWFwX211bHRpX3JlZ193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKKwkJCSAgIGludCBudW1fcmVncykKK3sKKwlpbnQgcmV0OworCisJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisKKwltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKTsKKworLyoKKyAqIHJlZ21hcF9tdWx0aV9yZWdfd3JpdGVfYnlwYXNzZWQoKTogV3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgYnV0IG5vdCB0aGUgY2FjaGUKKyAqCiAgKiB3aGVyZSB0aGUgc2V0IG9mIHJlZ2lzdGVyIGFyZSBzdXBwbGllZCBpbiBhbnkgb3JkZXIKICAqCiAgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KQEAgLTE1OTIsMzAgKzE4MTYsMjcgQEAKICAqIEEgdmFsdWUgb2YgemVybyB3aWxsIGJlIHJldHVybmVkIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gd2lsbAogICogYmUgcmV0dXJuZWQgaW4gZXJyb3IgY2FzZXMuCiAgKi8KLWludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAotCQkJCWludCBudW1fcmVncykKK2ludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlX2J5cGFzc2VkKHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAorCQkJCSAgICBpbnQgbnVtX3JlZ3MpCiB7Ci0JaW50IHJldCA9IDAsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgewotCQlpbnQgcmVnID0gcmVnc1tpXS5yZWc7Ci0JCWlmIChyZWcgJSBtYXAtPnJlZ19zdHJpZGUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaW50IHJldDsKKwlib29sIGJ5cGFzczsKIAogCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7Ci0JCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYpOwotCQlpZiAocmV0ICE9IDApCi0JCQlnb3RvIG91dDsKLQl9Ci1vdXQ6CisJYnlwYXNzID0gbWFwLT5jYWNoZV9ieXBhc3M7CisJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisKKwltYXAtPmNhY2hlX2J5cGFzcyA9IGJ5cGFzczsKKwogCW1hcC0+dW5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9tdWx0aV9yZWdfd3JpdGUpOworRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX211bHRpX3JlZ193cml0ZV9ieXBhc3NlZCk7CiAKIC8qKgogICogcmVnbWFwX3Jhd193cml0ZV9hc3luYygpOiBXcml0ZSByYXcgdmFsdWVzIHRvIG9uZSBvciBtb3JlIHJlZ2lzdGVycwpAQCAtMTczNiw2ICsxOTU3LDkgQEAKIAlpZiAobWFwLT5jYWNoZV9vbmx5KQogCQlyZXR1cm4gLUVCVVNZOwogCisJaWYgKCFyZWdtYXBfcmVhZGFibGUobWFwLCByZWcpKQorCQlyZXR1cm4gLUVJTzsKKwogCXJldCA9IG1hcC0+cmVnX3JlYWQoY29udGV4dCwgcmVnLCB2YWwpOwogCWlmIChyZXQgPT0gMCkgewogI2lmZGVmIExPR19ERVZJQ0UKQEAgLTE5NjYsOSArMjE5MCwxMSBAQAogCiAJaWYgKHRtcCAhPSBvcmlnKSB7CiAJCXJldCA9IF9yZWdtYXBfd3JpdGUobWFwLCByZWcsIHRtcCk7Ci0JCSpjaGFuZ2UgPSB0cnVlOworCQlpZiAoY2hhbmdlKQorCQkJKmNoYW5nZSA9IHRydWU7CiAJfSBlbHNlIHsKLQkJKmNoYW5nZSA9IGZhbHNlOworCQlpZiAoY2hhbmdlKQorCQkJKmNoYW5nZSA9IGZhbHNlOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xOTg3LDExICsyMjEzLDEwIEBACiBpbnQgcmVnbWFwX3VwZGF0ZV9iaXRzKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKIAkJICAgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQogewotCWJvb2wgY2hhbmdlOwogCWludCByZXQ7CiAKIAltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7Ci0JcmV0ID0gX3JlZ21hcF91cGRhdGVfYml0cyhtYXAsIHJlZywgbWFzaywgdmFsLCAmY2hhbmdlKTsKKwlyZXQgPSBfcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwsIE5VTEwpOwogCW1hcC0+dW5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIwMTYsMTQgKzIyNDEsMTMgQEAKIGludCByZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbCkKIHsKLQlib29sIGNoYW5nZTsKIAlpbnQgcmV0OwogCiAJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOwogCiAJbWFwLT5hc3luYyA9IHRydWU7CiAKLQlyZXQgPSBfcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwsICZjaGFuZ2UpOworCXJldCA9IF9yZWdtYXBfdXBkYXRlX2JpdHMobWFwLCByZWcsIG1hc2ssIHZhbCwgTlVMTCk7CiAKIAltYXAtPmFzeW5jID0gZmFsc2U7CiAKQEAgLTIxNzMsMzUgKzIzOTcsMjEgQEAKICAqIGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkuICBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvIGFwcGx5CiAgKiBjb3JyZWN0aW9ucyB0byBiZSBhcHBsaWVkIHRvIHRoZSBkZXZpY2UgZGVmYXVsdHMgb24gc3RhcnR1cCwgc3VjaAogICogYXMgdGhlIHVwZGF0ZXMgc29tZSB2ZW5kb3JzIHByb3ZpZGUgdG8gdW5kb2N1bWVudGVkIHJlZ2lzdGVycy4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkCisgKiBjb25jdXJyZW50bHkgd2l0aCBlaXRoZXIgaXRzZWxmIG9yIHJlZ2NhY2hlX3N5bmMoKS4KICAqLwogaW50IHJlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcmVncywKIAkJCSAgaW50IG51bV9yZWdzKQogewogCXN0cnVjdCByZWdfZGVmYXVsdCAqcDsKLQlpbnQgaSwgcmV0OworCWludCByZXQ7CiAJYm9vbCBieXBhc3M7CiAKIAlpZiAoV0FSTl9PTkNFKG51bV9yZWdzIDw9IDAsICJpbnZhbGlkIHJlZ2lzdGVycyBudW1iZXIgKCVkKVxuIiwKIAkgICAgbnVtX3JlZ3MpKQogCQlyZXR1cm4gMDsKIAotCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKLQotCWJ5cGFzcyA9IG1hcC0+Y2FjaGVfYnlwYXNzOwotCi0JbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOwotCW1hcC0+YXN5bmMgPSB0cnVlOwotCi0JLyogV3JpdGUgb3V0IGZpcnN0OyBpdCdzIHVzZWZ1bCB0byBhcHBseSBldmVuIGlmIHdlIGZhaWwgbGF0ZXIuICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKLQkJcmV0ID0gX3JlZ21hcF93cml0ZShtYXAsIHJlZ3NbaV0ucmVnLCByZWdzW2ldLmRlZik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2VycihtYXAtPmRldiwgIkZhaWxlZCB0byB3cml0ZSAleCA9ICV4OiAlZFxuIiwKLQkJCQlyZWdzW2ldLnJlZywgcmVnc1tpXS5kZWYsIHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQogCXAgPSBrcmVhbGxvYyhtYXAtPnBhdGNoLAogCQkgICAgIHNpemVvZihzdHJ1Y3QgcmVnX2RlZmF1bHQpICogKG1hcC0+cGF0Y2hfcmVncyArIG51bV9yZWdzKSwKIAkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTIyMTAsOSArMjQyMCwyMCBAQAogCQltYXAtPnBhdGNoID0gcDsKIAkJbWFwLT5wYXRjaF9yZWdzICs9IG51bV9yZWdzOwogCX0gZWxzZSB7Ci0JCXJldCA9IC1FTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKKworCWJ5cGFzcyA9IG1hcC0+Y2FjaGVfYnlwYXNzOworCisJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOworCW1hcC0+YXN5bmMgPSB0cnVlOworCisJcmV0ID0gX3JlZ21hcF9tdWx0aV9yZWdfd3JpdGUobWFwLCByZWdzLCBudW1fcmVncyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dDsKKwogb3V0OgogCW1hcC0+YXN5bmMgPSBmYWxzZTsKIAltYXAtPmNhY2hlX2J5cGFzcyA9IGJ5cGFzczsKQEAgLTIyNDAsNiArMjQ2MSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2dldF92YWxfYnl0ZXMpOwogCitpbnQgcmVnbWFwX3BhcnNlX3ZhbChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCAqdmFsKQoreworCWlmICghbWFwLT5mb3JtYXQucGFyc2VfdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBtYXAtPmZvcm1hdC5wYXJzZV92YWwoYnVmKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX3BhcnNlX3ZhbCk7CisKIHN0YXRpYyBpbnQgX19pbml0IHJlZ21hcF9pbml0Y2FsbCh2b2lkKQogewogCXJlZ21hcF9kZWJ1Z2ZzX2luaXRjYWxsKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCmluZGV4IDk0ZmZlZTMuLmFkOWQxNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCkBAIC0yMyw3ICsyMyw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMgYi9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jCmluZGV4IGViMzk1MDEuLjEyNWQ4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMKKysrIGIvZHJpdmVycy9ibG9jay9EQUM5NjAuYwpAQCAtNjQxMSwxMiArNjQxMSwxMiBAQAogCQkJCQkuU2NhdHRlckdhdGhlclNlZ21lbnRzWzBdCiAJCQkJCS5TZWdtZW50Qnl0ZUNvdW50ID0KIAkgICAgQ29tbWFuZE1haWxib3gtPkNvbnRyb2xsZXJJbmZvLkRhdGFUcmFuc2ZlclNpemU7Ci0JICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7Ci0JICB3aGlsZSAoQ29udHJvbGxlci0+VjIuTmV3Q29udHJvbGxlckluZm9ybWF0aW9uLT5QaHlzaWNhbFNjYW5BY3RpdmUpCi0JICAgIHsKLQkgICAgICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7Ci0JICAgICAgc2xlZXBfb25fdGltZW91dCgmQ29udHJvbGxlci0+Q29tbWFuZFdhaXRRdWV1ZSwgSFopOwotCSAgICB9CisJICB3aGlsZSAoMSkgeworCSAgICBEQUM5NjBfRXhlY3V0ZUNvbW1hbmQoQ29tbWFuZCk7CisJICAgIGlmICghQ29udHJvbGxlci0+VjIuTmV3Q29udHJvbGxlckluZm9ybWF0aW9uLT5QaHlzaWNhbFNjYW5BY3RpdmUpCisJCWJyZWFrOworCSAgICBtc2xlZXAoMTAwMCk7CisJICB9CiAJICBEQUM5NjBfVXNlckNyaXRpY2FsKCJEaXNjb3ZlcnkgQ29tcGxldGVkXG4iLCBDb250cm9sbGVyKTsKICAJfQogICAgIH0KQEAgLTcwMzUsMTggKzcwMzUsMTYgQEAKIAkJRXJyb3JDb2RlID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJfQotCXdoaWxlIChDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPlN0YXR1c0NoYW5nZUNvdW50ZXIKLQkgICAgICAgPT0gSGVhbHRoU3RhdHVzQnVmZmVyLlN0YXR1c0NoYW5nZUNvdW50ZXIgJiYKLQkgICAgICAgQ29udHJvbGxlci0+VjIuSGVhbHRoU3RhdHVzQnVmZmVyLT5OZXh0RXZlbnRTZXF1ZW5jZU51bWJlcgotCSAgICAgICA9PSBIZWFsdGhTdGF0dXNCdWZmZXIuTmV4dEV2ZW50U2VxdWVuY2VOdW1iZXIpCi0JICB7Ci0JICAgIGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmQ29udHJvbGxlci0+SGVhbHRoU3RhdHVzV2FpdFF1ZXVlLAotCQkJCQkgICBEQUM5NjBfTW9uaXRvcmluZ1RpbWVySW50ZXJ2YWwpOwotCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkgICAgCUVycm9yQ29kZSA9IC1FSU5UUjsKLQkgICAgCWJyZWFrOwotCSAgICB9Ci0JICB9CisJRXJyb3JDb2RlID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoQ29udHJvbGxlci0+SGVhbHRoU3RhdHVzV2FpdFF1ZXVlLAorCQkJIShDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPlN0YXR1c0NoYW5nZUNvdW50ZXIKKwkJCSAgICA9PSBIZWFsdGhTdGF0dXNCdWZmZXIuU3RhdHVzQ2hhbmdlQ291bnRlciAmJgorCQkJICBDb250cm9sbGVyLT5WMi5IZWFsdGhTdGF0dXNCdWZmZXItPk5leHRFdmVudFNlcXVlbmNlTnVtYmVyCisJCQkgICAgPT0gSGVhbHRoU3RhdHVzQnVmZmVyLk5leHRFdmVudFNlcXVlbmNlTnVtYmVyKSwKKwkJCURBQzk2MF9Nb25pdG9yaW5nVGltZXJJbnRlcnZhbCk7CisJaWYgKEVycm9yQ29kZSA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJRXJyb3JDb2RlID0gLUVJTlRSOworCQlicmVhazsKKwl9CiAJaWYgKGNvcHlfdG9fdXNlcihHZXRIZWFsdGhTdGF0dXMuSGVhbHRoU3RhdHVzQnVmZmVyLAogCQkJIENvbnRyb2xsZXItPlYyLkhlYWx0aFN0YXR1c0J1ZmZlciwKIAkJCSBzaXplb2YoREFDOTYwX1YyX0hlYWx0aFN0YXR1c0J1ZmZlcl9UKSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCmluZGV4IDBlMzBjNmUuLjk2YjYyOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCkBAIC02OCw2ICs2OCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9hdGFmZC5oPgogI2luY2x1ZGUgPGFzbS9hdGFmZHJlZy5oPgpAQCAtMzAxLDcgKzMwMyw3IEBACiAvKiBTeW5jaHJvbml6YXRpb24gb2YgRkRDIGFjY2Vzcy4gKi8KIHN0YXRpYyB2b2xhdGlsZSBpbnQgZmRjX2J1c3kgPSAwOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGZkY193YWl0KTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChmb3JtYXRfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGZvcm1hdF93YWl0KTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbmdlZF9mbG9wcGllcyA9IDB4ZmYsIGZha2VfY2hhbmdlID0gMDsKICNkZWZpbmUJQ0hFQ0tfQ0hBTkdFX0RFTEFZCUhaLzIKQEAgLTYwOCw3ICs2MTAsNyBAQAogCWlmIChJc0Zvcm1hdHRpbmcpIHsKIAkJSXNGb3JtYXR0aW5nID0gMDsKIAkJRm9ybWF0RXJyb3IgPSAxOwotCQl3YWtlX3VwKCAmZm9ybWF0X3dhaXQgKTsKKwkJY29tcGxldGUoJmZvcm1hdF93YWl0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjUwLDkgKzY1Miw4IEBACiAJRFBSSU5UKCgiZG9fZm9ybWF0KCBkcj0lZCB0cj0lZCBoZT0lZCBvZmZzPSVkIClcbiIsCiAJCWRyaXZlLCBkZXNjLT50cmFjaywgZGVzYy0+aGVhZCwgZGVzYy0+c2VjdF9vZmZzZXQgKSk7CiAKKwl3YWl0X2V2ZW50KGZkY193YWl0LCBjbXB4Y2hnKCZmZGNfYnVzeSwgMCwgMSkgPT0gMCk7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXdoaWxlKCBmZGNfYnVzeSApIHNsZWVwX29uKCAmZmRjX3dhaXQgKTsKLQlmZGNfYnVzeSA9IDE7CiAJc3RkbWFfbG9jayhmbG9wcHlfaXJxLCBOVUxMKTsKIAlhdGFyaV90dXJub25faXJxKCBJUlFfTUZQX0ZEQyApOyAvKiBzaG91bGQgYmUgYWxyZWFkeSwganVzdCB0byBiZSBzdXJlICovCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNzA2LDcgKzcwNyw3IEBACiAJUmVxU2lkZSAgPSBkZXNjLT5oZWFkOwogCWRvX2ZkX2FjdGlvbiggZHJpdmUgKTsKIAotCXNsZWVwX29uKCAmZm9ybWF0X3dhaXQgKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmb3JtYXRfd2FpdCk7CiAKIAlyZWRvX2ZkX3JlcXVlc3QoKTsKIAlyZXR1cm4oIEZvcm1hdEVycm9yID8gLUVJTyA6IDAgKTsJCkBAIC0xMjI5LDcgKzEyMzAsNyBAQAogCQlnb3RvIGVycl9lbmQ7CiAJfQogCi0Jd2FrZV91cCggJmZvcm1hdF93YWl0ICk7CisJY29tcGxldGUoJmZvcm1hdF93YWl0KTsKIAlyZXR1cm47CiAKICAgZXJyX2VuZDoKQEAgLTE0OTcsOCArMTQ5OCw3IEBACiB2b2lkIGRvX2ZkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCURQUklOVCgoImRvX2ZkX3JlcXVlc3QgZm9yIHBpZCAlZFxuIixjdXJyZW50LT5waWQpKTsKLQl3aGlsZSggZmRjX2J1c3kgKSBzbGVlcF9vbiggJmZkY193YWl0ICk7Ci0JZmRjX2J1c3kgPSAxOworCXdhaXRfZXZlbnQoZmRjX3dhaXQsIGNtcHhjaGcoJmZkY19idXN5LCAwLCAxKSA9PSAwKTsKIAlzdGRtYV9sb2NrKGZsb3BweV9pcnEsIE5VTEwpOwogCiAJYXRhcmlfZGlzYWJsZV9pcnEoIElSUV9NRlBfRkRDICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggMDM2ZThhYi4uNzM4OTRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtNDA5MiwxMSArNDA5Miw5IEBACiAJCWlmIChlcnIgPiAwKSB7CiAJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAogCQkJCSJvbmx5ICVkIE1TSS1YIHZlY3RvcnMgYXZhaWxhYmxlXG4iLCBlcnIpOwotCQkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKIAkJCQkiTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCQlnb3RvIGRlZmF1bHRfaW50X21vZGU7CiAJCX0KIAl9CiAJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaC0+cGRldiwgUENJX0NBUF9JRF9NU0kpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9hY3Rsb2cuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCmluZGV4IGE5YjEzZjIuLjkwYWU0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCkBAIC05NSwzNCArOTUsMzYgQEAKIAogc3RydWN0IHVwZGF0ZV9vZGJtX3dvcmsgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAl1bnNpZ25lZCBpbnQgZW5yOwogfTsKIAogc3RydWN0IHVwZGF0ZV9hbF93b3JrIHsKIAlzdHJ1Y3QgZHJiZF93b3JrIHc7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CiAJaW50IGVycjsKIH07CiAKIAotdm9pZCAqZHJiZF9tZF9nZXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkICpkcmJkX21kX2dldF9idWZmZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHI7CiAKLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwKLQkJICAgKHIgPSBhdG9taWNfY21weGNoZygmbWRldi0+bWRfaW9faW5fdXNlLCAwLCAxKSkgPT0gMCB8fAotCQkgICBtZGV2LT5zdGF0ZS5kaXNrIDw9IERfRkFJTEVEKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LAorCQkgICAociA9IGF0b21pY19jbXB4Y2hnKCZkZXZpY2UtPm1kX2lvX2luX3VzZSwgMCwgMSkpID09IDAgfHwKKwkJICAgZGV2aWNlLT5zdGF0ZS5kaXNrIDw9IERfRkFJTEVEKTsKIAotCXJldHVybiByID8gTlVMTCA6IHBhZ2VfYWRkcmVzcyhtZGV2LT5tZF9pb19wYWdlKTsKKwlyZXR1cm4gciA/IE5VTEwgOiBwYWdlX2FkZHJlc3MoZGV2aWNlLT5tZF9pb19wYWdlKTsKIH0KIAotdm9pZCBkcmJkX21kX3B1dF9idWZmZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9tZF9wdXRfYnVmZmVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtZGV2LT5tZF9pb19pbl91c2UpKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZpY2UtPm1kX2lvX2luX3VzZSkpCisJCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAotdm9pZCB3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCit2b2lkIHdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRvbmUpCiB7CiAJbG9uZyBkdDsKQEAgLTEzNCwxNSArMTM2LDE1IEBACiAJaWYgKGR0ID09IDApCiAJCWR0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAKLQlkdCA9IHdhaXRfZXZlbnRfdGltZW91dChtZGV2LT5taXNjX3dhaXQsCi0JCQkqZG9uZSB8fCB0ZXN0X2JpdChGT1JDRV9ERVRBQ0gsICZtZGV2LT5mbGFncyksIGR0KTsKKwlkdCA9IHdhaXRfZXZlbnRfdGltZW91dChkZXZpY2UtPm1pc2Nfd2FpdCwKKwkJCSpkb25lIHx8IHRlc3RfYml0KEZPUkNFX0RFVEFDSCwgJmRldmljZS0+ZmxhZ3MpLCBkdCk7CiAJaWYgKGR0ID09IDApIHsKLQkJZGV2X2VycihERVYsICJtZXRhLWRhdGEgSU8gb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7Ci0JCWRyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIDEsIERSQkRfRk9SQ0VfREVUQUNIKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YS1kYXRhIElPIG9wZXJhdGlvbiB0aW1lZCBvdXRcbiIpOworCQlkcmJkX2Noa19pb19lcnJvcihkZXZpY2UsIDEsIERSQkRfRk9SQ0VfREVUQUNIKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfbWRfc3luY19wYWdlX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkJIHN0cnVjdCBwYWdlICpwYWdlLCBzZWN0b3JfdCBzZWN0b3IsCiAJCQkJIGludCBydywgaW50IHNpemUpCkBAIC0xNTAsMTAgKzE1MiwxMCBAQAogCXN0cnVjdCBiaW8gKmJpbzsKIAlpbnQgZXJyOwogCi0JbWRldi0+bWRfaW8uZG9uZSA9IDA7Ci0JbWRldi0+bWRfaW8uZXJyb3IgPSAtRU5PREVWOworCWRldmljZS0+bWRfaW8uZG9uZSA9IDA7CisJZGV2aWNlLT5tZF9pby5lcnJvciA9IC1FTk9ERVY7CiAKLQlpZiAoKHJ3ICYgV1JJVEUpICYmICF0ZXN0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncykpCisJaWYgKChydyAmIFdSSVRFKSAmJiAhdGVzdF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncykpCiAJCXJ3IHw9IFJFUV9GVUEgfCBSRVFfRkxVU0g7CiAJcncgfD0gUkVRX1NZTkM7CiAKQEAgLTE2Myw2OSArMTY1LDY5IEBACiAJZXJyID0gLUVJTzsKIAlpZiAoYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgc2l6ZSwgMCkgIT0gc2l6ZSkKIAkJZ290byBvdXQ7Ci0JYmlvLT5iaV9wcml2YXRlID0gJm1kZXYtPm1kX2lvOworCWJpby0+YmlfcHJpdmF0ZSA9ICZkZXZpY2UtPm1kX2lvOwogCWJpby0+YmlfZW5kX2lvID0gZHJiZF9tZF9pb19jb21wbGV0ZTsKIAliaW8tPmJpX3J3ID0gcnc7CiAKLQlpZiAoIShydyAmIFdSSVRFKSAmJiBtZGV2LT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYgbWRldi0+bGRldiA9PSBOVUxMKQorCWlmICghKHJ3ICYgV1JJVEUpICYmIGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTICYmIGRldmljZS0+bGRldiA9PSBOVUxMKQogCQkvKiBzcGVjaWFsIGNhc2UsIGRyYmRfbWRfcmVhZCgpIGR1cmluZyBkcmJkX2FkbV9hdHRhY2goKTogbm8gZ2V0X2xkZXYgKi8KIAkJOwotCWVsc2UgaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKKwllbHNlIGlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKIAkJLyogQ29ycmVzcG9uZGluZyBwdXRfbGRldiBpbiBkcmJkX21kX2lvX2NvbXBsZXRlKCkgKi8KLQkJZGV2X2VycihERVYsICJBU1NFUlQgRkFJTEVEOiBnZXRfbGRldl9pZl9zdGF0ZSgpID09IDEgaW4gX2RyYmRfbWRfc3luY19wYWdlX2lvKClcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJBU1NFUlQgRkFJTEVEOiBnZXRfbGRldl9pZl9zdGF0ZSgpID09IDEgaW4gX2RyYmRfbWRfc3luY19wYWdlX2lvKClcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CiAKIAliaW9fZ2V0KGJpbyk7IC8qIG9uZSBiaW9fcHV0KCkgaXMgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLwotCWF0b21pY19pbmMoJm1kZXYtPm1kX2lvX2luX3VzZSk7IC8qIGRyYmRfbWRfcHV0X2J1ZmZlcigpIGlzIGluIHRoZSBjb21wbGV0aW9uIGhhbmRsZXIgKi8KLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKQorCWF0b21pY19pbmMoJmRldmljZS0+bWRfaW9faW5fdXNlKTsgLyogZHJiZF9tZF9wdXRfYnVmZmVyKCkgaXMgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLworCWlmIChkcmJkX2luc2VydF9mYXVsdChkZXZpY2UsIChydyAmIFdSSVRFKSA/IERSQkRfRkFVTFRfTURfV1IgOiBEUkJEX0ZBVUxUX01EX1JEKSkKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJZWxzZQogCQlzdWJtaXRfYmlvKHJ3LCBiaW8pOwotCXdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChtZGV2LCBiZGV2LCAmbWRldi0+bWRfaW8uZG9uZSk7CisJd2FpdF91bnRpbF9kb25lX29yX2ZvcmNlX2RldGFjaGVkKGRldmljZSwgYmRldiwgJmRldmljZS0+bWRfaW8uZG9uZSk7CiAJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX1VQVE9EQVRFKSkKLQkJZXJyID0gbWRldi0+bWRfaW8uZXJyb3I7CisJCWVyciA9IGRldmljZS0+bWRfaW8uZXJyb3I7CiAKICBvdXQ6CiAJYmlvX3B1dChiaW8pOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldiwKK2ludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCQkgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgcncpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgcGFnZSAqaW9wID0gbWRldi0+bWRfaW9fcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqaW9wID0gZGV2aWNlLT5tZF9pb19wYWdlOwogCi0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPm1kX2lvX2luX3VzZSkgPT0gMSk7CisJRF9BU1NFUlQoZGV2aWNlLCBhdG9taWNfcmVhZCgmZGV2aWNlLT5tZF9pb19pbl91c2UpID09IDEpOwogCiAJQlVHX09OKCFiZGV2LT5tZF9iZGV2KTsKIAotCWRldl9kYmcoREVWLCAibWV0YV9kYXRhIGlvOiAlcyBbJWRdOiVzKCwlbGx1cywlcykgJXBTXG4iLAorCWRyYmRfZGJnKGRldmljZSwgIm1ldGFfZGF0YSBpbzogJXMgWyVkXTolcygsJWxsdXMsJXMpICVwU1xuIiwKIAkgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgX19mdW5jX18sCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgKHJ3ICYgV1JJVEUpID8gIldSSVRFIiA6ICJSRUFEIiwKIAkgICAgICh2b2lkKilfUkVUX0lQXyApOwogCiAJaWYgKHNlY3RvciA8IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGJkZXYpIHx8CiAJICAgIHNlY3RvciArIDcgPiBkcmJkX21kX2xhc3Rfc2VjdG9yKGJkZXYpKQotCQlkZXZfYWxlcnQoREVWLCAiJXMgWyVkXTolcygsJWxsdXMsJXMpIG91dCBvZiByYW5nZSBtZCBhY2Nlc3MhXG4iLAorCQlkcmJkX2FsZXJ0KGRldmljZSwgIiVzIFslZF06JXMoLCVsbHVzLCVzKSBvdXQgb2YgcmFuZ2UgbWQgYWNjZXNzIVxuIiwKIAkJICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIF9fZnVuY19fLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCAocncgJiBXUklURSkgPyAiV1JJVEUiIDogIlJFQUQiKTsKIAogCS8qIHdlIGRvIGFsbCBvdXIgbWV0YSBkYXRhIElPIGluIGFsaWduZWQgNGsgYmxvY2tzLiAqLwotCWVyciA9IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhtZGV2LCBiZGV2LCBpb3AsIHNlY3RvciwgcncsIDQwOTYpOworCWVyciA9IF9kcmJkX21kX3N5bmNfcGFnZV9pbyhkZXZpY2UsIGJkZXYsIGlvcCwgc2VjdG9yLCBydywgNDA5Nik7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKERFViwgImRyYmRfbWRfc3luY19wYWdlX2lvKCwlbGx1cywlcykgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfbWRfc3luY19wYWdlX2lvKCwlbGx1cywlcykgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgKHJ3ICYgV1JJVEUpID8gIldSSVRFIiA6ICJSRUFEIiwgZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBibV9leHRlbnQgKmZpbmRfYWN0aXZlX3Jlc3luY19leHRlbnQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IGVucikKK3N0YXRpYyBzdHJ1Y3QgYm1fZXh0ZW50ICpmaW5kX2FjdGl2ZV9yZXN5bmNfZXh0ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yKQogewogCXN0cnVjdCBsY19lbGVtZW50ICp0bXA7Ci0JdG1wID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIGVuci9BTF9FWFRfUEVSX0JNX1NFQ1QpOworCXRtcCA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVuci9BTF9FWFRfUEVSX0JNX1NFQ1QpOwogCWlmICh1bmxpa2VseSh0bXAgIT0gTlVMTCkpIHsKIAkJc3RydWN0IGJtX2V4dGVudCAgKmJtX2V4dCA9IGxjX2VudHJ5KHRtcCwgc3RydWN0IGJtX2V4dGVudCwgbGNlKTsKIAkJaWYgKHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSkKQEAgLTIzNCw0NyArMjM2LDQ4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbGNfZWxlbWVudCAqX2FsX2dldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgZW5yLCBib29sIG5vbmJsb2NrKQorc3RhdGljIHN0cnVjdCBsY19lbGVtZW50ICpfYWxfZ2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yLCBib29sIG5vbmJsb2NrKQogewogCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCWludCB3YWtlOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JYm1fZXh0ID0gZmluZF9hY3RpdmVfcmVzeW5jX2V4dGVudChtZGV2LCBlbnIpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJYm1fZXh0ID0gZmluZF9hY3RpdmVfcmVzeW5jX2V4dGVudChkZXZpY2UsIGVucik7CiAJaWYgKGJtX2V4dCkgewogCQl3YWtlID0gIXRlc3RfYW5kX3NldF9iaXQoQk1FX1BSSU9SSVRZLCAmYm1fZXh0LT5mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJaWYgKHdha2UpCi0JCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZiAobm9uYmxvY2spCi0JCWFsX2V4dCA9IGxjX3RyeV9nZXQobWRldi0+YWN0X2xvZywgZW5yKTsKKwkJYWxfZXh0ID0gbGNfdHJ5X2dldChkZXZpY2UtPmFjdF9sb2csIGVucik7CiAJZWxzZQotCQlhbF9leHQgPSBsY19nZXQobWRldi0+YWN0X2xvZywgZW5yKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQlhbF9leHQgPSBsY19nZXQoZGV2aWNlLT5hY3RfbG9nLCBlbnIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlyZXR1cm4gYWxfZXh0OwogfQogCi1ib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCitib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKQogewogCS8qIGZvciBiaW9zIGNyb3NzaW5nIGFjdGl2aXR5IGxvZyBleHRlbnQgYm91bmRhcmllcywKIAkgKiB3ZSBtYXkgbmVlZCB0byBhY3RpdmF0ZSB0d28gZXh0ZW50cyBpbiBvbmUgZ28gKi8KIAl1bnNpZ25lZCBmaXJzdCA9IGktPnNlY3RvciA+PiAoQUxfRVhURU5UX1NISUZULTkpOwogCXVuc2lnbmVkIGxhc3QgPSBpLT5zaXplID09IDAgPyBmaXJzdCA6IChpLT5zZWN0b3IgKyAoaS0+c2l6ZSA+PiA5KSAtIDEpID4+IChBTF9FWFRFTlRfU0hJRlQtOSk7CiAKLQlEX0FTU0VSVCgodW5zaWduZWQpKGxhc3QgLSBmaXJzdCkgPD0gMSk7Ci0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPmxvY2FsX2NudCkgPiAwKTsKKwlEX0FTU0VSVChkZXZpY2UsICh1bnNpZ25lZCkobGFzdCAtIGZpcnN0KSA8PSAxKTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCkgPiAwKTsKIAogCS8qIEZJWE1FIGZpZ3VyZSBvdXQgYSBmYXN0IHBhdGggZm9yIGJpb3MgY3Jvc3NpbmcgQUwgZXh0ZW50IGJvdW5kYXJpZXMgKi8KIAlpZiAoZmlyc3QgIT0gbGFzdCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIF9hbF9nZXQobWRldiwgZmlyc3QsIHRydWUpOworCXJldHVybiBfYWxfZ2V0KGRldmljZSwgZmlyc3QsIHRydWUpOwogfQogCi1ib29sIGRyYmRfYWxfYmVnaW5faW9fcHJlcGFyZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK3N0YXRpYworYm9vbCBkcmJkX2FsX2JlZ2luX2lvX3ByZXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKQogewogCS8qIGZvciBiaW9zIGNyb3NzaW5nIGFjdGl2aXR5IGxvZyBleHRlbnQgYm91bmRhcmllcywKIAkgKiB3ZSBtYXkgbmVlZCB0byBhY3RpdmF0ZSB0d28gZXh0ZW50cyBpbiBvbmUgZ28gKi8KQEAgLTI4MywyMCArMjg2LDIwIEBACiAJdW5zaWduZWQgZW5yOwogCWJvb2wgbmVlZF90cmFuc2FjdGlvbiA9IGZhbHNlOwogCi0JRF9BU1NFUlQoZmlyc3QgPD0gbGFzdCk7Ci0JRF9BU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPmxvY2FsX2NudCkgPiAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGZpcnN0IDw9IGxhc3QpOworCURfQVNTRVJUKGRldmljZSwgYXRvbWljX3JlYWQoJmRldmljZS0+bG9jYWxfY250KSA+IDApOwogCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7Ci0JCXdhaXRfZXZlbnQobWRldi0+YWxfd2FpdCwKLQkJCQkoYWxfZXh0ID0gX2FsX2dldChtZGV2LCBlbnIsIGZhbHNlKSkgIT0gTlVMTCk7CisJCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LAorCQkJCShhbF9leHQgPSBfYWxfZ2V0KGRldmljZSwgZW5yLCBmYWxzZSkpICE9IE5VTEwpOwogCQlpZiAoYWxfZXh0LT5sY19udW1iZXIgIT0gZW5yKQogCQkJbmVlZF90cmFuc2FjdGlvbiA9IHRydWU7CiAJfQogCXJldHVybiBuZWVkX3RyYW5zYWN0aW9uOwogfQogCi1zdGF0aWMgaW50IGFsX3dyaXRlX3RyYW5zYWN0aW9uKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGJvb2wgZGVsZWdhdGUpOworc3RhdGljIGludCBhbF93cml0ZV90cmFuc2FjdGlvbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSk7CiAKIC8qIFdoZW4gY2FsbGVkIHRocm91Z2ggZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSwgd2UgbXVzdCBkZWxlZ2F0ZQogICogYWN0aXZpdHkgbG9nIEkvTyB0byB0aGUgd29ya2VyIHRocmVhZDogYSBmdXJ0aGVyIHJlcXVlc3QKQEAgLTMxMCw1OCArMzEzLDU4IEBACiAvKgogICogQGRlbGVnYXRlOiAgIGRlbGVnYXRlIGFjdGl2aXR5IGxvZyBJL08gdG8gdGhlIHdvcmtlciB0aHJlYWQKICAqLwotdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBib29sIGRlbGVnYXRlKQordm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSkKIHsKIAlib29sIGxvY2tlZCA9IGZhbHNlOwogCi0JQlVHX09OKGRlbGVnYXRlICYmIGN1cnJlbnQgPT0gbWRldi0+dGNvbm4tPndvcmtlci50YXNrKTsKKwlCVUdfT04oZGVsZWdhdGUgJiYgY3VycmVudCA9PSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53b3JrZXIudGFzayk7CiAKIAkvKiBTZXJpYWxpemUgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLgogCSAqIFRoaXMgdXNlcyB0ZXN0X2FuZF9zZXRfYml0LCBtZW1vcnkgYmFycmllciBpcyBpbXBsaWNpdC4KIAkgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsCi0JCQltZGV2LT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMgPT0gMCB8fAotCQkJKGxvY2tlZCA9IGxjX3RyeV9sb2NrX2Zvcl90cmFuc2FjdGlvbihtZGV2LT5hY3RfbG9nKSkpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LAorCQkJZGV2aWNlLT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMgPT0gMCB8fAorCQkJKGxvY2tlZCA9IGxjX3RyeV9sb2NrX2Zvcl90cmFuc2FjdGlvbihkZXZpY2UtPmFjdF9sb2cpKSk7CiAKIAlpZiAobG9ja2VkKSB7CiAJCS8qIERvdWJsZSBjaGVjazogaXQgbWF5IGhhdmUgYmVlbiBjb21taXR0ZWQgYnkgc29tZW9uZSBlbHNlLAogCQkgKiB3aGlsZSB3ZSBoYXZlIGJlZW4gd2FpdGluZyBmb3IgdGhlIGxvY2suICovCi0JCWlmIChtZGV2LT5hY3RfbG9nLT5wZW5kaW5nX2NoYW5nZXMpIHsKKwkJaWYgKGRldmljZS0+YWN0X2xvZy0+cGVuZGluZ19jaGFuZ2VzKSB7CiAJCQlib29sIHdyaXRlX2FsX3VwZGF0ZXM7CiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+YWxfdXBkYXRlczsKKwkJCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJCWlmICh3cml0ZV9hbF91cGRhdGVzKQotCQkJCWFsX3dyaXRlX3RyYW5zYWN0aW9uKG1kZXYsIGRlbGVnYXRlKTsKLQkJCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJCWFsX3dyaXRlX3RyYW5zYWN0aW9uKGRldmljZSwgZGVsZWdhdGUpOworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJCS8qIEZJWE1FCiAJCQlpZiAoZXJyKQogCQkJCXdlIG5lZWQgYW4gImxjX2NhbmNlbCIgaGVyZTsKIAkJCSovCi0JCQlsY19jb21taXR0ZWQobWRldi0+YWN0X2xvZyk7Ci0JCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJbGNfY29tbWl0dGVkKGRldmljZS0+YWN0X2xvZyk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJCX0KLQkJbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOwotCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJbGNfdW5sb2NrKGRldmljZS0+YWN0X2xvZyk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJfQogfQogCiAvKgogICogQGRlbGVnYXRlOiAgIGRlbGVnYXRlIGFjdGl2aXR5IGxvZyBJL08gdG8gdGhlIHdvcmtlciB0aHJlYWQKICAqLwotdm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX2ludGVydmFsICppLCBib29sIGRlbGVnYXRlKQordm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSkKIHsKLQlCVUdfT04oZGVsZWdhdGUgJiYgY3VycmVudCA9PSBtZGV2LT50Y29ubi0+d29ya2VyLnRhc2spOworCUJVR19PTihkZWxlZ2F0ZSAmJiBjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAotCWlmIChkcmJkX2FsX2JlZ2luX2lvX3ByZXBhcmUobWRldiwgaSkpCi0JCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KG1kZXYsIGRlbGVnYXRlKTsKKwlpZiAoZHJiZF9hbF9iZWdpbl9pb19wcmVwYXJlKGRldmljZSwgaSkpCisJCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KGRldmljZSwgZGVsZWdhdGUpOwogfQogCi1pbnQgZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK2ludCBkcmJkX2FsX2JlZ2luX2lvX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKIHsKLQlzdHJ1Y3QgbHJ1X2NhY2hlICphbCA9IG1kZXYtPmFjdF9sb2c7CisJc3RydWN0IGxydV9jYWNoZSAqYWwgPSBkZXZpY2UtPmFjdF9sb2c7CiAJLyogZm9yIGJpb3MgY3Jvc3NpbmcgYWN0aXZpdHkgbG9nIGV4dGVudCBib3VuZGFyaWVzLAogCSAqIHdlIG1heSBuZWVkIHRvIGFjdGl2YXRlIHR3byBleHRlbnRzIGluIG9uZSBnbyAqLwogCXVuc2lnbmVkIGZpcnN0ID0gaS0+c2VjdG9yID4+IChBTF9FWFRFTlRfU0hJRlQtOSk7CkBAIC0zNzAsNyArMzczLDcgQEAKIAl1bnNpZ25lZCBhdmFpbGFibGVfdXBkYXRlX3Nsb3RzOwogCXVuc2lnbmVkIGVucjsKIAotCURfQVNTRVJUKGZpcnN0IDw9IGxhc3QpOworCURfQVNTRVJUKGRldmljZSwgZmlyc3QgPD0gbGFzdCk7CiAKIAlucl9hbF9leHRlbnRzID0gMSArIGxhc3QgLSBmaXJzdDsgLyogd29yc3QgY2FzZTogYWxsIHRvdWNoZWQgZXh0ZW5kcyBhcmUgY29sZC4gKi8KIAlhdmFpbGFibGVfdXBkYXRlX3Nsb3RzID0gbWluKGFsLT5ucl9lbGVtZW50cyAtIGFsLT51c2VkLApAQCAtMzg1LDcgKzM4OCw3IEBACiAJLyogSXMgcmVzeW5jIGFjdGl2ZSBpbiB0aGlzIGFyZWE/ICovCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICp0bXA7Ci0JCXRtcCA9IGxjX2ZpbmQobWRldi0+cmVzeW5jLCBlbnIvQUxfRVhUX1BFUl9CTV9TRUNUKTsKKwkJdG1wID0gbGNfZmluZChkZXZpY2UtPnJlc3luYywgZW5yL0FMX0VYVF9QRVJfQk1fU0VDVCk7CiAJCWlmICh1bmxpa2VseSh0bXAgIT0gTlVMTCkpIHsKIAkJCXN0cnVjdCBibV9leHRlbnQgICpibV9leHQgPSBsY19lbnRyeSh0bXAsIHN0cnVjdCBibV9leHRlbnQsIGxjZSk7CiAJCQlpZiAodGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKSB7CkBAIC00MDEsMTQgKzQwNCwxNCBAQAogCSAqIHRoaXMgaGFzIHRvIGJlIHN1Y2Nlc3NmdWwuICovCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7CiAJCXN0cnVjdCBsY19lbGVtZW50ICphbF9leHQ7Ci0JCWFsX2V4dCA9IGxjX2dldF9jdW11bGF0aXZlKG1kZXYtPmFjdF9sb2csIGVucik7CisJCWFsX2V4dCA9IGxjX2dldF9jdW11bGF0aXZlKGRldmljZS0+YWN0X2xvZywgZW5yKTsKIAkJaWYgKCFhbF9leHQpCi0JCQlkZXZfaW5mbyhERVYsICJMT0dJQyBCVUcgZm9yIGVucj0ldVxuIiwgZW5yKTsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJMT0dJQyBCVUcgZm9yIGVucj0ldVxuIiwgZW5yKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZHJiZF9hbF9jb21wbGV0ZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK3ZvaWQgZHJiZF9hbF9jb21wbGV0ZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCiB7CiAJLyogZm9yIGJpb3MgY3Jvc3NpbmcgYWN0aXZpdHkgbG9nIGV4dGVudCBib3VuZGFyaWVzLAogCSAqIHdlIG1heSBuZWVkIHRvIGFjdGl2YXRlIHR3byBleHRlbnRzIGluIG9uZSBnbyAqLwpAQCAtNDE4LDE5ICs0MjEsMTkgQEAKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqZXh0ZW50OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEX0FTU0VSVChmaXJzdCA8PSBsYXN0KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCURfQVNTRVJUKGRldmljZSwgZmlyc3QgPD0gbGFzdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiAJZm9yIChlbnIgPSBmaXJzdDsgZW5yIDw9IGxhc3Q7IGVucisrKSB7Ci0JCWV4dGVudCA9IGxjX2ZpbmQobWRldi0+YWN0X2xvZywgZW5yKTsKKwkJZXh0ZW50ID0gbGNfZmluZChkZXZpY2UtPmFjdF9sb2csIGVucik7CiAJCWlmICghZXh0ZW50KSB7Ci0JCQlkZXZfZXJyKERFViwgImFsX2NvbXBsZXRlX2lvKCkgY2FsbGVkIG9uIGluYWN0aXZlIGV4dGVudCAldVxuIiwgZW5yKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImFsX2NvbXBsZXRlX2lvKCkgY2FsbGVkIG9uIGluYWN0aXZlIGV4dGVudCAldVxuIiwgZW5yKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWxjX3B1dChtZGV2LT5hY3RfbG9nLCBleHRlbnQpOworCQlsY19wdXQoZGV2aWNlLT5hY3RfbG9nLCBleHRlbnQpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbF9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAogI2lmIChQQUdFX1NISUZUICsgMykgPCAoQUxfRVhURU5UX1NISUZUIC0gQk1fQkxPQ0tfU0hJRlQpCkBAIC00NjAsMTMgKzQ2MywxMyBAQAogCQkgKEJNX0VYVF9TSElGVCAtIEJNX0JMT0NLX1NISUZUKSk7CiB9CiAKLXN0YXRpYyBzZWN0b3JfdCBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3Ioc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBzZWN0b3JfdCBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JY29uc3QgdW5zaWduZWQgaW50IHN0cmlwZXMgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVzOwotCWNvbnN0IHVuc2lnbmVkIGludCBzdHJpcGVfc2l6ZV80a0IgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80azsKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RyaXBlcyA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlczsKKwljb25zdCB1bnNpZ25lZCBpbnQgc3RyaXBlX3NpemVfNGtCID0gZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80azsKIAogCS8qIHRyYW5zYWN0aW9uIG51bWJlciwgbW9kdWxvIG9uLWRpc2sgcmluZyBidWZmZXIgd3JhcCBhcm91bmQgKi8KLQl1bnNpZ25lZCBpbnQgdCA9IG1kZXYtPmFsX3RyX251bWJlciAlIChtZGV2LT5sZGV2LT5tZC5hbF9zaXplXzRrKTsKKwl1bnNpZ25lZCBpbnQgdCA9IGRldmljZS0+YWxfdHJfbnVtYmVyICUgKGRldmljZS0+bGRldi0+bWQuYWxfc2l6ZV80ayk7CiAKIAkvKiAuLi4gdG8gYWxpZ25lZCA0ayBvbiBkaXNrIGJsb2NrICovCiAJdCA9ICgodCAlIHN0cmlwZXMpICogc3RyaXBlX3NpemVfNGtCKSArIHQvc3RyaXBlczsKQEAgLTQ3NSwxMSArNDc4LDExIEBACiAJdCAqPSA4OwogCiAJLyogLi4uIHBsdXMgb2Zmc2V0IHRvIHRoZSBvbiBkaXNrIHBvc2l0aW9uICovCi0JcmV0dXJuIG1kZXYtPmxkZXYtPm1kLm1kX29mZnNldCArIG1kZXYtPmxkZXYtPm1kLmFsX29mZnNldCArIHQ7CisJcmV0dXJuIGRldmljZS0+bGRldi0+bWQubWRfb2Zmc2V0ICsgZGV2aWNlLT5sZGV2LT5tZC5hbF9vZmZzZXQgKyB0OwogfQogCiBzdGF0aWMgaW50Ci1fYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK19hbF93cml0ZV90cmFuc2FjdGlvbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWxfdHJhbnNhY3Rpb25fb25fZGlzayAqYnVmZmVyOwogCXN0cnVjdCBsY19lbGVtZW50ICplOwpAQCAtNDg5LDMxICs0OTIsMzEgQEAKIAl1bnNpZ25lZCBjcmMgPSAwOwogCWludCBlcnIgPSAwOwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgewotCQlkZXZfZXJyKERFViwgImRpc2sgaXMgJXMsIGNhbm5vdCBzdGFydCBhbCB0cmFuc2FjdGlvblxuIiwKLQkJCWRyYmRfZGlza19zdHIobWRldi0+c3RhdGUuZGlzaykpOworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkcmJkX2VycihkZXZpY2UsICJkaXNrIGlzICVzLCBjYW5ub3Qgc3RhcnQgYWwgdHJhbnNhY3Rpb25cbiIsCisJCQlkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUuZGlzaykpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBUaGUgYml0bWFwIHdyaXRlIG1heSBoYXZlIGZhaWxlZCwgY2F1c2luZyBhIHN0YXRlIGNoYW5nZS4gKi8KLQlpZiAobWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKSB7Ci0JCWRldl9lcnIoREVWLAorCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCkgeworCQlkcmJkX2VycihkZXZpY2UsCiAJCQkiZGlzayBpcyAlcywgY2Fubm90IHdyaXRlIGFsIHRyYW5zYWN0aW9uXG4iLAotCQkJZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQkJZHJiZF9kaXNrX3N0cihkZXZpY2UtPnN0YXRlLmRpc2spKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBwcm90ZWN0cyBtZF9pb19idWZmZXIsIGFsX3RyX2N5Y2xlLCAuLi4gKi8KKwlidWZmZXIgPSBkcmJkX21kX2dldF9idWZmZXIoZGV2aWNlKTsgLyogcHJvdGVjdHMgbWRfaW9fYnVmZmVyLCBhbF90cl9jeWNsZSwgLi4uICovCiAJaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycihERVYsICJkaXNrIGZhaWxlZCB3aGlsZSB3YWl0aW5nIGZvciBtZF9pbyBidWZmZXJcbiIpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiZGlzayBmYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IgbWRfaW8gYnVmZmVyXG4iKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKCpidWZmZXIpKTsKIAlidWZmZXItPm1hZ2ljID0gY3B1X3RvX2JlMzIoRFJCRF9BTF9NQUdJQyk7Ci0JYnVmZmVyLT50cl9udW1iZXIgPSBjcHVfdG9fYmUzMihtZGV2LT5hbF90cl9udW1iZXIpOworCWJ1ZmZlci0+dHJfbnVtYmVyID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5hbF90cl9udW1iZXIpOwogCiAJaSA9IDA7CiAKQEAgLTUyMSw4ICs1MjQsOCBAQAogCSAqIG9uY2Ugd2Ugc2V0IHRoZSBMQ19MT0NLRUQgLS0gZnJvbSBkcmJkX2FsX2JlZ2luX2lvKCksCiAJICogbGNfdHJ5X2xvY2tfZm9yX3RyYW5zYWN0aW9uKCkgLS0sIHNvbWVvbmUgbWF5IHN0aWxsCiAJICogYmUgaW4gdGhlIHByb2Nlc3Mgb2YgY2hhbmdpbmcgaXQuICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmbWRldi0+YWN0X2xvZy0+dG9fYmVfY2hhbmdlZCwgbGlzdCkgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmZGV2aWNlLT5hY3RfbG9nLT50b19iZV9jaGFuZ2VkLCBsaXN0KSB7CiAJCWlmIChpID09IEFMX1VQREFURVNfUEVSX1RSQU5TQUNUSU9OKSB7CiAJCQlpKys7CiAJCQlicmVhazsKQEAgLTUzMCwxMSArNTMzLDExIEBACiAJCWJ1ZmZlci0+dXBkYXRlX3Nsb3RfbnJbaV0gPSBjcHVfdG9fYmUxNihlLT5sY19pbmRleCk7CiAJCWJ1ZmZlci0+dXBkYXRlX2V4dGVudF9ucltpXSA9IGNwdV90b19iZTMyKGUtPmxjX25ld19udW1iZXIpOwogCQlpZiAoZS0+bGNfbnVtYmVyICE9IExDX0ZSRUUpCi0JCQlkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KG1kZXYsCisJCQlkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KGRldmljZSwKIAkJCQkJYWxfZXh0ZW50X3RvX2JtX3BhZ2UoZS0+bGNfbnVtYmVyKSk7CiAJCWkrKzsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJQlVHX09OKGkgPiBBTF9VUERBVEVTX1BFUl9UUkFOU0FDVElPTik7CiAKIAlidWZmZXItPm5fdXBkYXRlcyA9IGNwdV90b19iZTE2KGkpOwpAQCAtNTQzLDQ4ICs1NDYsNDggQEAKIAkJYnVmZmVyLT51cGRhdGVfZXh0ZW50X25yW2ldID0gY3B1X3RvX2JlMzIoTENfRlJFRSk7CiAJfQogCi0JYnVmZmVyLT5jb250ZXh0X3NpemUgPSBjcHVfdG9fYmUxNihtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW50cyk7Ci0JYnVmZmVyLT5jb250ZXh0X3N0YXJ0X3Nsb3RfbnIgPSBjcHVfdG9fYmUxNihtZGV2LT5hbF90cl9jeWNsZSk7CisJYnVmZmVyLT5jb250ZXh0X3NpemUgPSBjcHVfdG9fYmUxNihkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKTsKKwlidWZmZXItPmNvbnRleHRfc3RhcnRfc2xvdF9uciA9IGNwdV90b19iZTE2KGRldmljZS0+YWxfdHJfY3ljbGUpOwogCiAJbXggPSBtaW5fdChpbnQsIEFMX0NPTlRFWFRfUEVSX1RSQU5TQUNUSU9OLAotCQkgICBtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW50cyAtIG1kZXYtPmFsX3RyX2N5Y2xlKTsKKwkJICAgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50cyAtIGRldmljZS0+YWxfdHJfY3ljbGUpOwogCWZvciAoaSA9IDA7IGkgPCBteDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGlkeCA9IG1kZXYtPmFsX3RyX2N5Y2xlICsgaTsKLQkJZXh0ZW50X25yID0gbGNfZWxlbWVudF9ieV9pbmRleChtZGV2LT5hY3RfbG9nLCBpZHgpLT5sY19udW1iZXI7CisJCXVuc2lnbmVkIGlkeCA9IGRldmljZS0+YWxfdHJfY3ljbGUgKyBpOworCQlleHRlbnRfbnIgPSBsY19lbGVtZW50X2J5X2luZGV4KGRldmljZS0+YWN0X2xvZywgaWR4KS0+bGNfbnVtYmVyOwogCQlidWZmZXItPmNvbnRleHRbaV0gPSBjcHVfdG9fYmUzMihleHRlbnRfbnIpOwogCX0KIAlmb3IgKDsgaSA8IEFMX0NPTlRFWFRfUEVSX1RSQU5TQUNUSU9OOyBpKyspCiAJCWJ1ZmZlci0+Y29udGV4dFtpXSA9IGNwdV90b19iZTMyKExDX0ZSRUUpOwogCi0JbWRldi0+YWxfdHJfY3ljbGUgKz0gQUxfQ09OVEVYVF9QRVJfVFJBTlNBQ1RJT047Ci0JaWYgKG1kZXYtPmFsX3RyX2N5Y2xlID49IG1kZXYtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKQotCQltZGV2LT5hbF90cl9jeWNsZSA9IDA7CisJZGV2aWNlLT5hbF90cl9jeWNsZSArPSBBTF9DT05URVhUX1BFUl9UUkFOU0FDVElPTjsKKwlpZiAoZGV2aWNlLT5hbF90cl9jeWNsZSA+PSBkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzKQorCQlkZXZpY2UtPmFsX3RyX2N5Y2xlID0gMDsKIAotCXNlY3RvciA9IGFsX3RyX251bWJlcl90b19vbl9kaXNrX3NlY3RvcihtZGV2KTsKKwlzZWN0b3IgPSBhbF90cl9udW1iZXJfdG9fb25fZGlza19zZWN0b3IoZGV2aWNlKTsKIAogCWNyYyA9IGNyYzMyYygwLCBidWZmZXIsIDQwOTYpOwogCWJ1ZmZlci0+Y3JjMzJjID0gY3B1X3RvX2JlMzIoY3JjKTsKIAotCWlmIChkcmJkX2JtX3dyaXRlX2hpbnRlZChtZGV2KSkKKwlpZiAoZHJiZF9ibV93cml0ZV9oaW50ZWQoZGV2aWNlKSkKIAkJZXJyID0gLUVJTzsKIAllbHNlIHsKIAkJYm9vbCB3cml0ZV9hbF91cGRhdGVzOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXdyaXRlX2FsX3VwZGF0ZXMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+YWxfdXBkYXRlczsKKwkJd3JpdGVfYWxfdXBkYXRlcyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmFsX3VwZGF0ZXM7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlpZiAod3JpdGVfYWxfdXBkYXRlcykgewotCQkJaWYgKGRyYmRfbWRfc3luY19wYWdlX2lvKG1kZXYsIG1kZXYtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CisJCQlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CiAJCQkJZXJyID0gLUVJTzsKLQkJCQlkcmJkX2Noa19pb19lcnJvcihtZGV2LCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOworCQkJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbWRldi0+YWxfdHJfbnVtYmVyKys7Ci0JCQkJbWRldi0+YWxfd3JpdF9jbnQrKzsKKwkJCQlkZXZpY2UtPmFsX3RyX251bWJlcisrOworCQkJCWRldmljZS0+YWxfd3JpdF9jbnQrKzsKIAkJCX0KIAkJfQogCX0KIAotCWRyYmRfbWRfcHV0X2J1ZmZlcihtZGV2KTsKLQlwdXRfbGRldihtZGV2KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTU5MywxMCArNTk2LDEwIEBACiBzdGF0aWMgaW50IHdfYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfd29yayAqdywgaW50IHVudXNlZCkKIHsKIAlzdHJ1Y3QgdXBkYXRlX2FsX3dvcmsgKmF3ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCB1cGRhdGVfYWxfd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBhdy0+ZGV2aWNlOwogCWludCBlcnI7CiAKLQllcnIgPSBfYWxfd3JpdGVfdHJhbnNhY3Rpb24obWRldik7CisJZXJyID0gX2FsX3dyaXRlX3RyYW5zYWN0aW9uKGRldmljZSk7CiAJYXctPmVyciA9IGVycjsKIAljb21wbGV0ZSgmYXctPmV2ZW50KTsKIApAQCAtNjA2LDYzICs2MDksNjQgQEAKIC8qIENhbGxzIGZyb20gd29ya2VyIGNvbnRleHQgKHNlZSB3X3Jlc3RhcnRfZGlza19pbygpKSBuZWVkIHRvIHdyaXRlIHRoZQogICAgdHJhbnNhY3Rpb24gZGlyZWN0bHkuIE90aGVycyBjYW1lIHRocm91Z2ggZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSwKICAgIHRob3NlIG5lZWQgdG8gZGVsZWdhdGUgaXQgdG8gdGhlIHdvcmtlci4gKi8KLXN0YXRpYyBpbnQgYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgYm9vbCBkZWxlZ2F0ZSkKK3N0YXRpYyBpbnQgYWxfd3JpdGVfdHJhbnNhY3Rpb24oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGJvb2wgZGVsZWdhdGUpCiB7CiAJaWYgKGRlbGVnYXRlKSB7CiAJCXN0cnVjdCB1cGRhdGVfYWxfd29yayBhbF93b3JrOwogCQlpbml0X2NvbXBsZXRpb24oJmFsX3dvcmsuZXZlbnQpOwogCQlhbF93b3JrLncuY2IgPSB3X2FsX3dyaXRlX3RyYW5zYWN0aW9uOwotCQlhbF93b3JrLncubWRldiA9IG1kZXY7Ci0JCWRyYmRfcXVldWVfd29ya19mcm9udCgmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmYWxfd29yay53KTsKKwkJYWxfd29yay5kZXZpY2UgPSBkZXZpY2U7CisJCWRyYmRfcXVldWVfd29ya19mcm9udCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJICAgICAgJmFsX3dvcmsudyk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFsX3dvcmsuZXZlbnQpOwogCQlyZXR1cm4gYWxfd29yay5lcnI7CiAJfSBlbHNlCi0JCXJldHVybiBfYWxfd3JpdGVfdHJhbnNhY3Rpb24obWRldik7CisJCXJldHVybiBfYWxfd3JpdGVfdHJhbnNhY3Rpb24oZGV2aWNlKTsKIH0KIAotc3RhdGljIGludCBfdHJ5X2xjX2RlbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgbGNfZWxlbWVudCAqYWxfZXh0KQorc3RhdGljIGludCBfdHJ5X2xjX2RlbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxjX2VsZW1lbnQgKmFsX2V4dCkKIHsKIAlpbnQgcnY7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCXJ2ID0gKGFsX2V4dC0+cmVmY250ID09IDApOwogCWlmIChsaWtlbHkocnYpKQotCQlsY19kZWwobWRldi0+YWN0X2xvZywgYWxfZXh0KTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQlsY19kZWwoZGV2aWNlLT5hY3RfbG9nLCBhbF9leHQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX2FsX3NocmluaygpIC0gUmVtb3ZlcyBhbGwgYWN0aXZlIGV4dGVudHMgZm9ybSB0aGUgYWN0aXZpdHkgbG9nCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBSZW1vdmVzIGFsbCBhY3RpdmUgZXh0ZW50cyBmb3JtIHRoZSBhY3Rpdml0eSBsb2csIHdhaXRpbmcgdW50aWwKICAqIHRoZSByZWZlcmVuY2UgY291bnQgb2YgZWFjaCBlbnRyeSBkcm9wcGVkIHRvIDAgZmlyc3QsIG9mIGNvdXJzZS4KICAqCi0gKiBZb3UgbmVlZCB0byBsb2NrIG1kZXYtPmFjdF9sb2cgd2l0aCBsY190cnlfbG9jaygpIC8gbGNfdW5sb2NrKCkKKyAqIFlvdSBuZWVkIHRvIGxvY2sgZGV2aWNlLT5hY3RfbG9nIHdpdGggbGNfdHJ5X2xvY2soKSAvIGxjX3VubG9jaygpCiAgKi8KLXZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmFsX2V4dDsKIAlpbnQgaTsKIAotCURfQVNTRVJUKHRlc3RfYml0KF9fTENfTE9DS0VELCAmbWRldi0+YWN0X2xvZy0+ZmxhZ3MpKTsKKwlEX0FTU0VSVChkZXZpY2UsIHRlc3RfYml0KF9fTENfTE9DS0VELCAmZGV2aWNlLT5hY3RfbG9nLT5mbGFncykpOwogCi0JZm9yIChpID0gMDsgaSA8IG1kZXYtPmFjdF9sb2ctPm5yX2VsZW1lbnRzOyBpKyspIHsKLQkJYWxfZXh0ID0gbGNfZWxlbWVudF9ieV9pbmRleChtZGV2LT5hY3RfbG9nLCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50czsgaSsrKSB7CisJCWFsX2V4dCA9IGxjX2VsZW1lbnRfYnlfaW5kZXgoZGV2aWNlLT5hY3RfbG9nLCBpKTsKIAkJaWYgKGFsX2V4dC0+bGNfbnVtYmVyID09IExDX0ZSRUUpCiAJCQljb250aW51ZTsKLQkJd2FpdF9ldmVudChtZGV2LT5hbF93YWl0LCBfdHJ5X2xjX2RlbChtZGV2LCBhbF9leHQpKTsKKwkJd2FpdF9ldmVudChkZXZpY2UtPmFsX3dhaXQsIF90cnlfbGNfZGVsKGRldmljZSwgYWxfZXh0KSk7CiAJfQogCi0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAotaW50IGRyYmRfaW5pdGlhbGl6ZV9hbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB2b2lkICpidWZmZXIpCitpbnQgZHJiZF9pbml0aWFsaXplX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB2b2lkICpidWZmZXIpCiB7CiAJc3RydWN0IGFsX3RyYW5zYWN0aW9uX29uX2Rpc2sgKmFsID0gYnVmZmVyOwotCXN0cnVjdCBkcmJkX21kICptZCA9ICZtZGV2LT5sZGV2LT5tZDsKKwlzdHJ1Y3QgZHJiZF9tZCAqbWQgPSAmZGV2aWNlLT5sZGV2LT5tZDsKIAlzZWN0b3JfdCBhbF9iYXNlID0gbWQtPm1kX29mZnNldCArIG1kLT5hbF9vZmZzZXQ7CiAJaW50IGFsX3NpemVfNGsgPSBtZC0+YWxfc3RyaXBlcyAqIG1kLT5hbF9zdHJpcGVfc2l6ZV80azsKIAlpbnQgaTsKQEAgLTY3Myw3ICs2NzcsNyBAQAogCWFsLT5jcmMzMmMgPSBjcHVfdG9fYmUzMihjcmMzMmMoMCwgYWwsIDQwOTYpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBhbF9zaXplXzRrOyBpKyspIHsKLQkJaW50IGVyciA9IGRyYmRfbWRfc3luY19wYWdlX2lvKG1kZXYsIG1kZXYtPmxkZXYsIGFsX2Jhc2UgKyBpICogOCwgV1JJVEUpOworCQlpbnQgZXJyID0gZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIGFsX2Jhc2UgKyBpICogOCwgV1JJVEUpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC02ODMsMzIgKzY4NywzMiBAQAogc3RhdGljIGludCB3X3VwZGF0ZV9vZGJtKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7CiAJc3RydWN0IHVwZGF0ZV9vZGJtX3dvcmsgKnVkdyA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgdXBkYXRlX29kYm1fd29yaywgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSB1ZHctPmRldmljZTsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liID0geyAuc2liX3JlYXNvbiA9IFNJQl9TWU5DX1BST0dSRVNTLCB9OwogCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgeworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl93YXJuKERFViwgIkNhbiBub3QgdXBkYXRlIG9uIGRpc2sgYml0bWFwLCBsb2NhbCBJTyBkaXNhYmxlZC5cbiIpOworCQkJZHJiZF93YXJuKGRldmljZSwgIkNhbiBub3QgdXBkYXRlIG9uIGRpc2sgYml0bWFwLCBsb2NhbCBJTyBkaXNhYmxlZC5cbiIpOwogCQlrZnJlZSh1ZHcpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkcmJkX2JtX3dyaXRlX3BhZ2UobWRldiwgcnNfZXh0ZW50X3RvX2JtX3BhZ2UodWR3LT5lbnIpKTsKLQlwdXRfbGRldihtZGV2KTsKKwlkcmJkX2JtX3dyaXRlX3BhZ2UoZGV2aWNlLCByc19leHRlbnRfdG9fYm1fcGFnZSh1ZHctPmVucikpOworCXB1dF9sZGV2KGRldmljZSk7CiAKIAlrZnJlZSh1ZHcpOwogCi0JaWYgKGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpIDw9IG1kZXYtPnJzX2ZhaWxlZCkgewotCQlzd2l0Y2ggKG1kZXYtPnN0YXRlLmNvbm4pIHsKKwlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA8PSBkZXZpY2UtPnJzX2ZhaWxlZCkgeworCQlzd2l0Y2ggKGRldmljZS0+c3RhdGUuY29ubikgewogCQljYXNlIENfU1lOQ19TT1VSQ0U6ICBjYXNlIENfU1lOQ19UQVJHRVQ6CiAJCWNhc2UgQ19QQVVTRURfU1lOQ19TOiBjYXNlIENfUEFVU0VEX1NZTkNfVDoKLQkJCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCQkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAkJZGVmYXVsdDoKIAkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KIAkJCWJyZWFrOwogCQl9CiAJfQotCWRyYmRfYmNhc3RfZXZlbnQobWRldiwgJnNpYik7CisJZHJiZF9iY2FzdF9ldmVudChkZXZpY2UsICZzaWIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MjAsNyArNzI0LDcgQEAKICAqCiAgKiBUT0RPIHdpbGwgYmUgb2Jzb2xldGVkIG9uY2Ugd2UgaGF2ZSBhIGNhY2hpbmcgbHJ1IG9mIHRoZSBvbiBkaXNrIGJpdG1hcAogICovCi1zdGF0aWMgdm9pZCBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwKK3N0YXRpYyB2b2lkIGRyYmRfdHJ5X2NsZWFyX29uX2Rpc2tfYm0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICAgICBpbnQgY291bnQsIGludCBzdWNjZXNzKQogewogCXN0cnVjdCBsY19lbGVtZW50ICplOwpAQCAtNzI4LDEzICs3MzIsMTMgQEAKIAogCXVuc2lnbmVkIGludCBlbnI7CiAKLQlEX0FTU0VSVChhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSk7CisJRF9BU1NFUlQoZGV2aWNlLCBhdG9taWNfcmVhZCgmZGV2aWNlLT5sb2NhbF9jbnQpKTsKIAogCS8qIEkgc2ltcGx5IGFzc3VtZSB0aGF0IGEgc2VjdG9yL3NpemUgcGFpciBuZXZlciBjcm9zc2VzCiAJICogYSAxNiBNQiBleHRlbnQgYm9yZGVyLiAoQ3VycmVudGx5IHRoaXMgaXMgdHJ1ZS4uLikgKi8KIAllbnIgPSBCTV9TRUNUX1RPX0VYVChzZWN0b3IpOwogCi0JZSA9IGxjX2dldChtZGV2LT5yZXN5bmMsIGVucik7CisJZSA9IGxjX2dldChkZXZpY2UtPnJlc3luYywgZW5yKTsKIAlpZiAoZSkgewogCQlzdHJ1Y3QgYm1fZXh0ZW50ICpleHQgPSBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpOwogCQlpZiAoZXh0LT5sY2UubGNfbnVtYmVyID09IGVucikgewpAQCAtNzQzLDEyICs3NDcsMTIgQEAKIAkJCWVsc2UKIAkJCQlleHQtPnJzX2ZhaWxlZCArPSBjb3VudDsKIAkJCWlmIChleHQtPnJzX2xlZnQgPCBleHQtPnJzX2ZhaWxlZCkgewotCQkJCWRldl93YXJuKERFViwgIkJBRCEgc2VjdG9yPSVsbHVzIGVucj0ldSByc19sZWZ0PSVkICIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiQkFEISBzZWN0b3I9JWxsdXMgZW5yPSV1IHJzX2xlZnQ9JWQgIgogCQkJCSAgICAicnNfZmFpbGVkPSVkIGNvdW50PSVkIGNzdGF0ZT0lc1xuIiwKIAkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLAogCQkJCSAgICAgZXh0LT5sY2UubGNfbnVtYmVyLCBleHQtPnJzX2xlZnQsCiAJCQkJICAgICBleHQtPnJzX2ZhaWxlZCwgY291bnQsCi0JCQkJICAgICBkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pKTsKKwkJCQkgICAgIGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAKIAkJCQkvKiBXZSBkb24ndCBleHBlY3QgdG8gYmUgYWJsZSB0byBjbGVhciBtb3JlIGJpdHMKIAkJCQkgKiB0aGFuIGhhdmUgYmVlbiBzZXQgd2hlbiB3ZSBvcmlnaW5hbGx5IGNvdW50ZWQKQEAgLTc1Niw3ICs3NjAsNyBAQAogCQkJCSAqIFdoYXRldmVyIHRoZSByZWFzb24gKGRpc2Nvbm5lY3QgZHVyaW5nIHJlc3luYywKIAkJCQkgKiBkZWxheWVkIGxvY2FsIGNvbXBsZXRpb24gb2YgYW4gYXBwbGljYXRpb24gd3JpdGUpLAogCQkJCSAqIHRyeSB0byBmaXggaXQgdXAgYnkgcmVjb3VudGluZyBoZXJlLiAqLwotCQkJCWV4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCQlleHQtPnJzX2xlZnQgPSBkcmJkX2JtX2Vfd2VpZ2h0KGRldmljZSwgZW5yKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIE5vcm1hbGx5IHRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlLApAQCAtNzY1LDE2ICs3NjksMTYgQEAKIAkJCSAqIEJ1dCBtYXliZSBhbiBhcHBsaWNhdGlvbiB3cml0ZSBmaW5pc2hlZCwgYW5kIHdlIHNldAogCQkJICogc29tZXRoaW5nIG91dHNpZGUgdGhlIHJlc3luYyBscnVfY2FjaGUgaW4gc3luYy4KIAkJCSAqLwotCQkJaW50IHJzX2xlZnQgPSBkcmJkX2JtX2Vfd2VpZ2h0KG1kZXYsIGVucik7CisJCQlpbnQgcnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJaWYgKGV4dC0+ZmxhZ3MgIT0gMCkgewotCQkJCWRldl93YXJuKERFViwgImNoYW5naW5nIHJlc3luYyBsY2U6ICVkWyV1OyUwMmx4XSIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiY2hhbmdpbmcgcmVzeW5jIGxjZTogJWRbJXU7JTAybHhdIgogCQkJCSAgICAgIiAtPiAlZFsldTswMF1cbiIsCiAJCQkJICAgICBleHQtPmxjZS5sY19udW1iZXIsIGV4dC0+cnNfbGVmdCwKIAkJCQkgICAgIGV4dC0+ZmxhZ3MsIGVuciwgcnNfbGVmdCk7CiAJCQkJZXh0LT5mbGFncyA9IDA7CiAJCQl9CiAJCQlpZiAoZXh0LT5yc19mYWlsZWQpIHsKLQkJCQlkZXZfd2FybihERVYsICJLaWNraW5nIHJlc3luY19scnUgZWxlbWVudCBlbnI9JXUgIgorCQkJCWRyYmRfd2FybihkZXZpY2UsICJLaWNraW5nIHJlc3luY19scnUgZWxlbWVudCBlbnI9JXUgIgogCQkJCSAgICAgIm91dCB3aXRoIHJzX2ZhaWxlZD0lZFxuIiwKIAkJCQkgICAgIGV4dC0+bGNlLmxjX251bWJlciwgZXh0LT5yc19mYWlsZWQpOwogCQkJfQpAQCAtNzgyLDkgKzc4Niw5IEBACiAJCQlleHQtPnJzX2ZhaWxlZCA9IHN1Y2Nlc3MgPyAwIDogY291bnQ7CiAJCQkvKiB3ZSBkb24ndCBrZWVwIGEgcGVyc2lzdGVudCBsb2cgb2YgdGhlIHJlc3luYyBscnUsCiAJCQkgKiB3ZSBjYW4gY29tbWl0IGFueSBjaGFuZ2UgcmlnaHQgYXdheS4gKi8KLQkJCWxjX2NvbW1pdHRlZChtZGV2LT5yZXN5bmMpOworCQkJbGNfY29tbWl0dGVkKGRldmljZS0+cmVzeW5jKTsKIAkJfQotCQlsY19wdXQobWRldi0+cmVzeW5jLCAmZXh0LT5sY2UpOworCQlsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZleHQtPmxjZSk7CiAJCS8qIG5vIHJhY2UsIHdlIGFyZSB3aXRoaW4gdGhlIGFsX2xvY2shICovCiAKIAkJaWYgKGV4dC0+cnNfbGVmdCA9PSBleHQtPnJzX2ZhaWxlZCkgewpAQCAtNzk0LDMyICs3OTgsMzMgQEAKIAkJCWlmICh1ZHcpIHsKIAkJCQl1ZHctPmVuciA9IGV4dC0+bGNlLmxjX251bWJlcjsKIAkJCQl1ZHctPncuY2IgPSB3X3VwZGF0ZV9vZGJtOwotCQkJCXVkdy0+dy5tZGV2ID0gbWRldjsKLQkJCQlkcmJkX3F1ZXVlX3dvcmtfZnJvbnQoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnVkdy0+dyk7CisJCQkJdWR3LT5kZXZpY2UgPSBkZXZpY2U7CisJCQkJZHJiZF9xdWV1ZV93b3JrX2Zyb250KCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSAgICAgICZ1ZHctPncpOwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfd2FybihERVYsICJDb3VsZCBub3Qga21hbGxvYyBhbiB1ZHdcbiIpOworCQkJCWRyYmRfd2FybihkZXZpY2UsICJDb3VsZCBub3Qga21hbGxvYyBhbiB1ZHdcbiIpOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJZGV2X2VycihERVYsICJsY19nZXQoKSBmYWlsZWQhIGxvY2tlZD0lZC8lZCBmbGFncz0lbHVcbiIsCi0JCSAgICBtZGV2LT5yZXN5bmNfbG9ja2VkLAotCQkgICAgbWRldi0+cmVzeW5jLT5ucl9lbGVtZW50cywKLQkJICAgIG1kZXYtPnJlc3luYy0+ZmxhZ3MpOworCQlkcmJkX2VycihkZXZpY2UsICJsY19nZXQoKSBmYWlsZWQhIGxvY2tlZD0lZC8lZCBmbGFncz0lbHVcbiIsCisJCSAgICBkZXZpY2UtPnJlc3luY19sb2NrZWQsCisJCSAgICBkZXZpY2UtPnJlc3luYy0+bnJfZWxlbWVudHMsCisJCSAgICBkZXZpY2UtPnJlc3luYy0+ZmxhZ3MpOwogCX0KIH0KIAotdm9pZCBkcmJkX2FkdmFuY2VfcnNfbWFya3Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBzdGlsbF90b19nbykKK3ZvaWQgZHJiZF9hZHZhbmNlX3JzX21hcmtzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHN0aWxsX3RvX2dvKQogewogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQl1bnNpZ25lZCBsb25nIGxhc3QgPSBtZGV2LT5yc19tYXJrX3RpbWVbbWRldi0+cnNfbGFzdF9tYXJrXTsKLQlpbnQgbmV4dCA9IChtZGV2LT5yc19sYXN0X21hcmsgKyAxKSAlIERSQkRfU1lOQ19NQVJLUzsKKwl1bnNpZ25lZCBsb25nIGxhc3QgPSBkZXZpY2UtPnJzX21hcmtfdGltZVtkZXZpY2UtPnJzX2xhc3RfbWFya107CisJaW50IG5leHQgPSAoZGV2aWNlLT5yc19sYXN0X21hcmsgKyAxKSAlIERSQkRfU1lOQ19NQVJLUzsKIAlpZiAodGltZV9hZnRlcl9lcShub3csIGxhc3QgKyBEUkJEX1NZTkNfTUFSS19TVEVQKSkgewotCQlpZiAobWRldi0+cnNfbWFya19sZWZ0W21kZXYtPnJzX2xhc3RfbWFya10gIT0gc3RpbGxfdG9fZ28gJiYKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19UICYmCi0JCSAgICBtZGV2LT5zdGF0ZS5jb25uICE9IENfUEFVU0VEX1NZTkNfUykgewotCQkJbWRldi0+cnNfbWFya190aW1lW25leHRdID0gbm93OwotCQkJbWRldi0+cnNfbWFya19sZWZ0W25leHRdID0gc3RpbGxfdG9fZ287Ci0JCQltZGV2LT5yc19sYXN0X21hcmsgPSBuZXh0OworCQlpZiAoZGV2aWNlLT5yc19tYXJrX2xlZnRbZGV2aWNlLT5yc19sYXN0X21hcmtdICE9IHN0aWxsX3RvX2dvICYmCisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19UICYmCisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19QQVVTRURfU1lOQ19TKSB7CisJCQlkZXZpY2UtPnJzX21hcmtfdGltZVtuZXh0XSA9IG5vdzsKKwkJCWRldmljZS0+cnNfbWFya19sZWZ0W25leHRdID0gc3RpbGxfdG9fZ287CisJCQlkZXZpY2UtPnJzX2xhc3RfbWFyayA9IG5leHQ7CiAJCX0KIAl9CiB9CkBAIC04MzEsNyArODM2LDcgQEAKICAqIGNhbGxlZCBieSB3b3JrZXIgb24gQ19TWU5DX1RBUkdFVCBhbmQgcmVjZWl2ZXIgb24gU3luY1NvdXJjZS4KICAqCiAgKi8KLXZvaWQgX19kcmJkX3NldF9pbl9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsCit2b2lkIF9fZHJiZF9zZXRfaW5fc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwKIAkJICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IHVuc2lnbmVkIGludCBsaW5lKQogewogCS8qIElzIGNhbGxlZCBmcm9tIHdvcmtlciBhbmQgcmVjZWl2ZXIgY29udGV4dCBfb25seV8gKi8KQEAgLTg0MiwxNSArODQ3LDE1IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChzaXplIDw9IDAgfHwgIUlTX0FMSUdORUQoc2l6ZSwgNTEyKSB8fCBzaXplID4gRFJCRF9NQVhfQklPX1NJWkUpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3NldF9pbl9zeW5jOiBzZWN0b3I9JWxsdXMgc2l6ZT0lZCBub25zZW5zZSFcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2V0X2luX3N5bmM6IHNlY3Rvcj0lbGx1cyBzaXplPSVkIG5vbnNlbnNlIVxuIiwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvciwgc2l6ZSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJcmV0dXJuOyAvKiBubyBkaXNrLCBubyBtZXRhZGF0YSwgbm8gYml0bWFwIHRvIGNsZWFyIGJpdHMgaW4gKi8KIAotCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJZXNlY3RvciA9IHNlY3RvciArIChzaXplID4+IDkpIC0gMTsKIAogCWlmICghZXhwZWN0KHNlY3RvciA8IG5yX3NlY3RvcnMpKQpAQCAtODc4LDIxICs4ODMsMjEgQEAKIAkgKiBvaywgKGNhcGFjaXR5ICYgNykgIT0gMCBzb21ldGltZXMsIGJ1dCB3aG8gY2FyZXMuLi4KIAkgKiB3ZSBjb3VudCByc197dG90YWwsbGVmdH0gaW4gYml0cywgbm90IHNlY3RvcnMuCiAJICovCi0JY291bnQgPSBkcmJkX2JtX2NsZWFyX2JpdHMobWRldiwgc2JuciwgZWJucik7CisJY291bnQgPSBkcmJkX2JtX2NsZWFyX2JpdHMoZGV2aWNlLCBzYm5yLCBlYm5yKTsKIAlpZiAoY291bnQpIHsKLQkJZHJiZF9hZHZhbmNlX3JzX21hcmtzKG1kZXYsIGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKLQkJZHJiZF90cnlfY2xlYXJfb25fZGlza19ibShtZGV2LCBzZWN0b3IsIGNvdW50LCB0cnVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCQlkcmJkX2FkdmFuY2VfcnNfbWFya3MoZGV2aWNlLCBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOworCQlkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKGRldmljZSwgc2VjdG9yLCBjb3VudCwgdHJ1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiAJCS8qIGp1c3Qgd2FrZV91cCB1bmNvbmRpdGlvbmFsIG5vdywgdmFyaW91cyBsY19jaGFnZWQoKSwKIAkJICogbGNfcHV0KCkgaW4gZHJiZF90cnlfY2xlYXJfb25fZGlza19ibSgpLiAqLwogCQl3YWtlX3VwID0gMTsKIAl9CiBvdXQ6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlpZiAod2FrZV91cCkKLQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiB9CiAKIC8qCkBAIC05MDMsNyArOTA4LDcgQEAKICAqIGNhbGxlZCBieSB0bF9jbGVhciBhbmQgZHJiZF9zZW5kX2RibG9jayAoPT1kcmJkX21ha2VfcmVxdWVzdCkuCiAgKiBzbyB0aGlzIGNhbiBiZSBfYW55XyBwcm9jZXNzLgogICovCi1pbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAoraW50IF9fZHJiZF9zZXRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsCiAJCQkgICAgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpCiB7CiAJdW5zaWduZWQgbG9uZyBzYm5yLCBlYm5yLCBmbGFnczsKQEAgLTkxNiwxNSArOTIxLDE1IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHNpemUgPCAwIHx8ICFJU19BTElHTkVEKHNpemUsIDUxMikgfHwgc2l6ZSA+IERSQkRfTUFYX0JJT19TSVpFKSB7Ci0JCWRldl9lcnIoREVWLCAic2VjdG9yOiAlbGx1cywgc2l6ZTogJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgInNlY3RvcjogJWxsdXMsIHNpemU6ICVkXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJcmV0dXJuIDA7IC8qIG5vIGRpc2ssIG5vIG1ldGFkYXRhLCBubyBiaXRtYXAgdG8gc2V0IGJpdHMgaW4gKi8KIAotCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCW5yX3NlY3RvcnMgPSBkcmJkX2dldF9jYXBhY2l0eShkZXZpY2UtPnRoaXNfYmRldik7CiAJZXNlY3RvciA9IHNlY3RvciArIChzaXplID4+IDkpIC0gMTsKIAogCWlmICghZXhwZWN0KHNlY3RvciA8IG5yX3NlY3RvcnMpKQpAQCAtOTM5LDU1ICs5NDQsNTUgQEAKIAogCS8qIG9rLCAoY2FwYWNpdHkgJiA3KSAhPSAwIHNvbWV0aW1lcywgYnV0IHdobyBjYXJlcy4uLgogCSAqIHdlIGNvdW50IHJzX3t0b3RhbCxsZWZ0fSBpbiBiaXRzLCBub3Qgc2VjdG9ycy4gICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKLQljb3VudCA9IGRyYmRfYm1fc2V0X2JpdHMobWRldiwgc2JuciwgZWJucik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOworCWNvdW50ID0gZHJiZF9ibV9zZXRfYml0cyhkZXZpY2UsIHNibnIsIGVibnIpOwogCiAJZW5yID0gQk1fU0VDVF9UT19FWFQoc2VjdG9yKTsKLQllID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIGVucik7CisJZSA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJaWYgKGUpCiAJCWxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSktPnJzX2xlZnQgKz0gY291bnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+YWxfbG9jaywgZmxhZ3MpOwogCiBvdXQ6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljCi1zdHJ1Y3QgYm1fZXh0ZW50ICpfYm1lX2dldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgZW5yKQorc3RydWN0IGJtX2V4dGVudCAqX2JtZV9nZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBlbnIpCiB7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmU7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCWludCB3YWtldXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgcnNfZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKLQlpZiAobWRldi0+cmVzeW5jX2xvY2tlZCA+IG1kZXYtPnJlc3luYy0+bnJfZWxlbWVudHMvMikgewotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJaWYgKGRldmljZS0+cmVzeW5jX2xvY2tlZCA+IGRldmljZS0+cmVzeW5jLT5ucl9lbGVtZW50cy8yKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWUgPSBsY19nZXQobWRldi0+cmVzeW5jLCBlbnIpOworCWUgPSBsY19nZXQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCWlmIChibV9leHQpIHsKIAkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciAhPSBlbnIpIHsKLQkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJYm1fZXh0LT5yc19mYWlsZWQgPSAwOwotCQkJbGNfY29tbWl0dGVkKG1kZXYtPnJlc3luYyk7CisJCQlsY19jb21taXR0ZWQoZGV2aWNlLT5yZXN5bmMpOwogCQkJd2FrZXVwID0gMTsKIAkJfQogCQlpZiAoYm1fZXh0LT5sY2UucmVmY250ID09IDEpCi0JCQltZGV2LT5yZXN5bmNfbG9ja2VkKys7CisJCQlkZXZpY2UtPnJlc3luY19sb2NrZWQrKzsKIAkJc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncyk7CiAJfQotCXJzX2ZsYWdzID0gbWRldi0+cmVzeW5jLT5mbGFnczsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXJzX2ZsYWdzID0gZGV2aWNlLT5yZXN5bmMtPmZsYWdzOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAod2FrZXVwKQotCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAogCWlmICghYm1fZXh0KSB7CiAJCWlmIChyc19mbGFncyAmIExDX1NUQVJWSU5HKQotCQkJZGV2X3dhcm4oREVWLCAiSGF2ZSB0byB3YWl0IGZvciBlbGVtZW50IgorCQkJZHJiZF93YXJuKGRldmljZSwgIkhhdmUgdG8gd2FpdCBmb3IgZWxlbWVudCIKIAkJCSAgICAgIiAocmVzeW5jIExSVSB0b28gc21hbGw/KVxuIik7CiAJCUJVR19PTihyc19mbGFncyAmIExDX0xPQ0tFRCk7CiAJfQpAQCAtOTk1LDI1ICsxMDAwLDI1IEBACiAJcmV0dXJuIGJtX2V4dDsKIH0KIAotc3RhdGljIGludCBfaXNfaW5fYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IGVucikKK3N0YXRpYyBpbnQgX2lzX2luX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgZW5yKQogewogCWludCBydjsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCXJ2ID0gbGNfaXNfdXNlZChtZGV2LT5hY3RfbG9nLCBlbnIpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwlydiA9IGxjX2lzX3VzZWQoZGV2aWNlLT5hY3RfbG9nLCBlbnIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBkcmJkX3JzX2JlZ2luX2lvKCkgLSBHZXRzIGFuIGV4dGVudCBpbiB0aGUgcmVzeW5jIExSVSBjYWNoZSBhbmQgc2V0cyBpdCB0byBCTUVfTE9DS0VECi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICoKICAqIFRoaXMgZnVuY3Rpb25zIHNsZWVwcyBvbiBhbF93YWl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlRSIGlmIGludGVycnVwdGVkLgogICovCi1pbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpCitpbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKQogewogCXVuc2lnbmVkIGludCBlbnIgPSBCTV9TRUNUX1RPX0VYVChzZWN0b3IpOwogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKQEAgLTEwMjIsOCArMTAyNyw4IEBACiAJCQkgMjAwIHRpbWVzIC0+IDIwIHNlY29uZHMuICovCiAKIHJldHJ5OgotCXNpZyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShtZGV2LT5hbF93YWl0LAotCQkJKGJtX2V4dCA9IF9ibWVfZ2V0KG1kZXYsIGVucikpKTsKKwlzaWcgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2aWNlLT5hbF93YWl0LAorCQkJKGJtX2V4dCA9IF9ibWVfZ2V0KGRldmljZSwgZW5yKSkpOwogCWlmIChzaWcpCiAJCXJldHVybiAtRUlOVFI7CiAKQEAgLTEwMzEsMjQgKzEwMzYsMjQgQEAKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUxfRVhUX1BFUl9CTV9TRUNUOyBpKyspIHsKLQkJc2lnID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG1kZXYtPmFsX3dhaXQsCi0JCQkJCSAgICAgICAhX2lzX2luX2FsKG1kZXYsIGVuciAqIEFMX0VYVF9QRVJfQk1fU0VDVCArIGkpIHx8CisJCXNpZyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXZpY2UtPmFsX3dhaXQsCisJCQkJCSAgICAgICAhX2lzX2luX2FsKGRldmljZSwgZW5yICogQUxfRVhUX1BFUl9CTV9TRUNUICsgaSkgfHwKIAkJCQkJICAgICAgIHRlc3RfYml0KEJNRV9QUklPUklUWSwgJmJtX2V4dC0+ZmxhZ3MpKTsKIAogCQlpZiAoc2lnIHx8ICh0ZXN0X2JpdChCTUVfUFJJT1JJVFksICZibV9leHQtPmZsYWdzKSAmJiBzYSkpIHsKLQkJCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCQkJaWYgKGxjX3B1dChtZGV2LT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkgeworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwkJCWlmIChsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkgewogCQkJCWJtX2V4dC0+ZmxhZ3MgPSAwOyAvKiBjbGVhcnMgQk1FX05PX1dSSVRFUyBhbmQgZXZlbnR1YWxseSBCTUVfUFJJT1JJVFkgKi8KLQkJCQltZGV2LT5yZXN5bmNfbG9ja2VkLS07Ci0JCQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCQkJZGV2aWNlLT5yZXN5bmNfbG9ja2VkLS07CisJCQkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJCQlpZiAoc2lnKQogCQkJCXJldHVybiAtRUlOVFI7CiAJCQlpZiAoc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaLzEwKSkKIAkJCQlyZXR1cm4gLUVJTlRSOwogCQkJaWYgKHNhICYmIC0tc2EgPT0gMCkKLQkJCQlkZXZfd2FybihERVYsImRyYmRfcnNfYmVnaW5faW8oKSBzdGVwcGVkIGFzaWRlIGZvciAyMHNlYy4iCisJCQkJZHJiZF93YXJuKGRldmljZSwgImRyYmRfcnNfYmVnaW5faW8oKSBzdGVwcGVkIGFzaWRlIGZvciAyMHNlYy4iCiAJCQkJCSAiUmVzeW5jIHN0YWxsZWQ/XG4iKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTEwNTksMTQgKzEwNjQsMTQgQEAKIAogLyoqCiAgKiBkcmJkX3RyeV9yc19iZWdpbl9pbygpIC0gR2V0cyBhbiBleHRlbnQgaW4gdGhlIHJlc3luYyBMUlUgY2FjaGUsIGRvZXMgbm90IHNsZWVwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICoKICAqIEdldHMgYW4gZXh0ZW50IGluIHRoZSByZXN5bmMgTFJVIGNhY2hlLCBzZXRzIGl0IHRvIEJNRV9OT19XUklURVMsIHRoZW4KICAqIHRyaWVzIHRvIHNldCBpdCB0byBCTUVfTE9DS0VELiBSZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCBhbmQgLUVBR0FJTgogICogaWYgdGhlcmUgaXMgc3RpbGwgYXBwbGljYXRpb24gSU8gZ29pbmcgb24gaW4gdGhpcyBhcmVhLgogICovCi1pbnQgZHJiZF90cnlfcnNfYmVnaW5faW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQoraW50IGRyYmRfdHJ5X3JzX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpCiB7CiAJdW5zaWduZWQgaW50IGVuciA9IEJNX1NFQ1RfVE9fRVhUKHNlY3Rvcik7CiAJY29uc3QgdW5zaWduZWQgaW50IGFsX2VuciA9IGVucipBTF9FWFRfUEVSX0JNX1NFQ1Q7CkBAIC0xMDc0LDggKzEwNzksOCBAQAogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCWlmIChtZGV2LT5yZXN5bmNfd2VuciAhPSBMQ19GUkVFICYmIG1kZXYtPnJlc3luY193ZW5yICE9IGVucikgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJaWYgKGRldmljZS0+cmVzeW5jX3dlbnIgIT0gTENfRlJFRSAmJiBkZXZpY2UtPnJlc3luY193ZW5yICE9IGVucikgewogCQkvKiBpbiBjYXNlIHlvdSBoYXZlIHZlcnkgaGVhdnkgc2NhdHRlcmVkIGlvLCBpdCBtYXkKIAkJICogc3RhbGwgdGhlIHN5bmNlciB1bmRlZmluZWQgaWYgd2UgZ2l2ZSB1cCB0aGUgcmVmIGNvdW50CiAJCSAqIHdoZW4gd2UgdHJ5IGFnYWluIGFuZCByZXF1ZXVlLgpAQCAtMTA4OSwxOTMgKzEwOTQsMTkzIEBACiAJCSAqIHRoZSBsY19wdXQgaGVyZS4uLgogCQkgKiB3ZSBhbHNvIGhhdmUgdG8gd2FrZV91cAogCQkgKi8KLQkJZSA9IGxjX2ZpbmQobWRldi0+cmVzeW5jLCBtZGV2LT5yZXN5bmNfd2Vucik7CisJCWUgPSBsY19maW5kKGRldmljZS0+cmVzeW5jLCBkZXZpY2UtPnJlc3luY193ZW5yKTsKIAkJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCQlpZiAoYm1fZXh0KSB7Ci0JCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCURfQVNTRVJUKHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSk7CisJCQlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpOworCQkJRF9BU1NFUlQoZGV2aWNlLCB0ZXN0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpOwogCQkJY2xlYXJfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKTsKLQkJCW1kZXYtPnJlc3luY193ZW5yID0gTENfRlJFRTsKLQkJCWlmIChsY19wdXQobWRldi0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApCi0JCQkJbWRldi0+cmVzeW5jX2xvY2tlZC0tOwotCQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCQlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwkJCWlmIChsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSkgPT0gMCkKKwkJCQlkZXZpY2UtPnJlc3luY19sb2NrZWQtLTsKKwkJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfYWxlcnQoREVWLCAiTE9HSUMgQlVHXG4iKTsKKwkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiTE9HSUMgQlVHXG4iKTsKIAkJfQogCX0KIAkvKiBUUlkuICovCi0JZSA9IGxjX3RyeV9nZXQobWRldi0+cmVzeW5jLCBlbnIpOworCWUgPSBsY190cnlfZ2V0KGRldmljZS0+cmVzeW5jLCBlbnIpOwogCWJtX2V4dCA9IGUgPyBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpIDogTlVMTDsKIAlpZiAoYm1fZXh0KSB7CiAJCWlmICh0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpCiAJCQlnb3RvIHByb2NlZWQ7CiAJCWlmICghdGVzdF9hbmRfc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpIHsKLQkJCW1kZXYtPnJlc3luY19sb2NrZWQrKzsKKwkJCWRldmljZS0+cmVzeW5jX2xvY2tlZCsrOwogCQl9IGVsc2UgewogCQkJLyogd2UgZGlkIHNldCB0aGUgQk1FX05PX1dSSVRFUywKIAkJCSAqIGJ1dCB0aGVuIGNvdWxkIG5vdCBzZXQgQk1FX0xPQ0tFRCwKIAkJCSAqIHNvIHdlIHRyaWVkIGFnYWluLgogCQkJICogZHJvcCB0aGUgZXh0cmEgcmVmZXJlbmNlLiAqLwogCQkJYm1fZXh0LT5sY2UucmVmY250LS07Ci0JCQlEX0FTU0VSVChibV9leHQtPmxjZS5yZWZjbnQgPiAwKTsKKwkJCURfQVNTRVJUKGRldmljZSwgYm1fZXh0LT5sY2UucmVmY250ID4gMCk7CiAJCX0KIAkJZ290byBjaGVja19hbDsKIAl9IGVsc2UgewogCQkvKiBkbyB3ZSByYXRoZXIgd2FudCB0byB0cnkgbGF0ZXI/ICovCi0JCWlmIChtZGV2LT5yZXN5bmNfbG9ja2VkID4gbWRldi0+cmVzeW5jLT5ucl9lbGVtZW50cy0zKQorCQlpZiAoZGV2aWNlLT5yZXN5bmNfbG9ja2VkID4gZGV2aWNlLT5yZXN5bmMtPm5yX2VsZW1lbnRzLTMpCiAJCQlnb3RvIHRyeV9hZ2FpbjsKIAkJLyogRG8gb3IgZG8gbm90LiBUaGVyZSBpcyBubyB0cnkuIC0tIFlvZGEgKi8KLQkJZSA9IGxjX2dldChtZGV2LT5yZXN5bmMsIGVucik7CisJCWUgPSBsY19nZXQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJCWJtX2V4dCA9IGUgPyBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpIDogTlVMTDsKIAkJaWYgKCFibV9leHQpIHsKLQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcnNfZmxhZ3MgPSBtZGV2LT5yZXN5bmMtPmZsYWdzOworCQkJY29uc3QgdW5zaWduZWQgbG9uZyByc19mbGFncyA9IGRldmljZS0+cmVzeW5jLT5mbGFnczsKIAkJCWlmIChyc19mbGFncyAmIExDX1NUQVJWSU5HKQotCQkJCWRldl93YXJuKERFViwgIkhhdmUgdG8gd2FpdCBmb3IgZWxlbWVudCIKKwkJCQlkcmJkX3dhcm4oZGV2aWNlLCAiSGF2ZSB0byB3YWl0IGZvciBlbGVtZW50IgogCQkJCSAgICAgIiAocmVzeW5jIExSVSB0b28gc21hbGw/KVxuIik7CiAJCQlCVUdfT04ocnNfZmxhZ3MgJiBMQ19MT0NLRUQpOwogCQkJZ290byB0cnlfYWdhaW47CiAJCX0KIAkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciAhPSBlbnIpIHsKLQkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQobWRldiwgZW5yKTsKKwkJCWJtX2V4dC0+cnNfbGVmdCA9IGRyYmRfYm1fZV93ZWlnaHQoZGV2aWNlLCBlbnIpOwogCQkJYm1fZXh0LT5yc19mYWlsZWQgPSAwOwotCQkJbGNfY29tbWl0dGVkKG1kZXYtPnJlc3luYyk7Ci0JCQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKLQkJCURfQVNTRVJUKHRlc3RfYml0KEJNRV9MT0NLRUQsICZibV9leHQtPmZsYWdzKSA9PSAwKTsKKwkJCWxjX2NvbW1pdHRlZChkZXZpY2UtPnJlc3luYyk7CisJCQl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOworCQkJRF9BU1NFUlQoZGV2aWNlLCB0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykgPT0gMCk7CiAJCX0KIAkJc2V0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncyk7Ci0JCURfQVNTRVJUKGJtX2V4dC0+bGNlLnJlZmNudCA9PSAxKTsKLQkJbWRldi0+cmVzeW5jX2xvY2tlZCsrOworCQlEX0FTU0VSVChkZXZpY2UsIGJtX2V4dC0+bGNlLnJlZmNudCA9PSAxKTsKKwkJZGV2aWNlLT5yZXN5bmNfbG9ja2VkKys7CiAJCWdvdG8gY2hlY2tfYWw7CiAJfQogY2hlY2tfYWw6CiAJZm9yIChpID0gMDsgaSA8IEFMX0VYVF9QRVJfQk1fU0VDVDsgaSsrKSB7Ci0JCWlmIChsY19pc191c2VkKG1kZXYtPmFjdF9sb2csIGFsX2VucitpKSkKKwkJaWYgKGxjX2lzX3VzZWQoZGV2aWNlLT5hY3RfbG9nLCBhbF9lbnIraSkpCiAJCQlnb3RvIHRyeV9hZ2FpbjsKIAl9CiAJc2V0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncyk7CiBwcm9jZWVkOgotCW1kZXYtPnJlc3luY193ZW5yID0gTENfRlJFRTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCWRldmljZS0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlyZXR1cm4gMDsKIAogdHJ5X2FnYWluOgogCWlmIChibV9leHQpCi0JCW1kZXYtPnJlc3luY193ZW5yID0gZW5yOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCWRldmljZS0+cmVzeW5jX3dlbnIgPSBlbnI7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCXJldHVybiAtRUFHQUlOOwogfQogCi12b2lkIGRyYmRfcnNfY29tcGxldGVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQordm9pZCBkcmJkX3JzX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpCiB7CiAJdW5zaWduZWQgaW50IGVuciA9IEJNX1NFQ1RfVE9fRVhUKHNlY3Rvcik7CiAJc3RydWN0IGxjX2VsZW1lbnQgKmU7CiAJc3RydWN0IGJtX2V4dGVudCAqYm1fZXh0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOwotCWUgPSBsY19maW5kKG1kZXYtPnJlc3luYywgZW5yKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CisJZSA9IGxjX2ZpbmQoZGV2aWNlLT5yZXN5bmMsIGVucik7CiAJYm1fZXh0ID0gZSA/IGxjX2VudHJ5KGUsIHN0cnVjdCBibV9leHRlbnQsIGxjZSkgOiBOVUxMOwogCWlmICghYm1fZXh0KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFsX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJkcmJkX3JzX2NvbXBsZXRlX2lvKCkgY2FsbGVkLCBidXQgZXh0ZW50IG5vdCBmb3VuZFxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3JzX2NvbXBsZXRlX2lvKCkgY2FsbGVkLCBidXQgZXh0ZW50IG5vdCBmb3VuZFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoYm1fZXh0LT5sY2UucmVmY250ID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YWxfbG9jaywgZmxhZ3MpOwotCQlkZXZfZXJyKERFViwgImRyYmRfcnNfY29tcGxldGVfaW8oLCVsbHUgWz0ldV0pIGNhbGxlZCwgIgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmFsX2xvY2ssIGZsYWdzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiZHJiZF9yc19jb21wbGV0ZV9pbygsJWxsdSBbPSV1XSkgY2FsbGVkLCAiCiAJCSAgICAiYnV0IHJlZmNudCBpcyAwIT9cbiIsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgZW5yKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChsY19wdXQobWRldi0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApIHsKKwlpZiAobGNfcHV0KGRldmljZS0+cmVzeW5jLCAmYm1fZXh0LT5sY2UpID09IDApIHsKIAkJYm1fZXh0LT5mbGFncyA9IDA7IC8qIGNsZWFyIEJNRV9MT0NLRUQsIEJNRV9OT19XUklURVMgYW5kIEJNRV9QUklPUklUWSAqLwotCQltZGV2LT5yZXN5bmNfbG9ja2VkLS07Ci0JCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCQlkZXZpY2UtPnJlc3luY19sb2NrZWQtLTsKKwkJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5hbF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgogICogZHJiZF9yc19jYW5jZWxfYWxsKCkgLSBSZW1vdmVzIGFsbCBleHRlbnRzIGZyb20gdGhlIHJlc3luYyBMUlUgKGV2ZW4gQk1FX0xPQ0tFRCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi12b2lkIGRyYmRfcnNfY2FuY2VsX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX3JzX2NhbmNlbF9hbGwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0ZBSUxFRCkpIHsgLyogTWFrZXMgc3VyZSAtPnJlc3luYyBpcyB0aGVyZS4gKi8KLQkJbGNfcmVzZXQobWRldi0+cmVzeW5jKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7IC8qIE1ha2VzIHN1cmUgLT5yZXN5bmMgaXMgdGhlcmUuICovCisJCWxjX3Jlc2V0KGRldmljZS0+cmVzeW5jKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9Ci0JbWRldi0+cmVzeW5jX2xvY2tlZCA9IDA7Ci0JbWRldi0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0Jd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJZGV2aWNlLT5yZXN5bmNfbG9ja2VkID0gMDsKKwlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKIH0KIAogLyoqCiAgKiBkcmJkX3JzX2RlbF9hbGwoKSAtIEdyYWNlZnVsbHkgcmVtb3ZlIGFsbCBleHRlbnRzIGZyb20gdGhlIHJlc3luYyBMUlUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIC1FQUdBSU4gaWYgYXQgbGVhc3Qgb25lIHJlZmVyZW5jZSBjb3VudCB3YXMKICAqIG5vdCB6ZXJvLgogICovCi1pbnQgZHJiZF9yc19kZWxfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9yc19kZWxfYWxsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBsY19lbGVtZW50ICplOwogCXN0cnVjdCBibV9leHRlbnQgKmJtX2V4dDsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9GQUlMRUQpKSB7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CiAJCS8qIG9rLCAtPnJlc3luYyBpcyB0aGVyZS4gKi8KLQkJZm9yIChpID0gMDsgaSA8IG1kZXYtPnJlc3luYy0+bnJfZWxlbWVudHM7IGkrKykgewotCQkJZSA9IGxjX2VsZW1lbnRfYnlfaW5kZXgobWRldi0+cmVzeW5jLCBpKTsKKwkJZm9yIChpID0gMDsgaSA8IGRldmljZS0+cmVzeW5jLT5ucl9lbGVtZW50czsgaSsrKSB7CisJCQllID0gbGNfZWxlbWVudF9ieV9pbmRleChkZXZpY2UtPnJlc3luYywgaSk7CiAJCQlibV9leHQgPSBsY19lbnRyeShlLCBzdHJ1Y3QgYm1fZXh0ZW50LCBsY2UpOwogCQkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciA9PSBMQ19GUkVFKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGJtX2V4dC0+bGNlLmxjX251bWJlciA9PSBtZGV2LT5yZXN5bmNfd2VucikgewotCQkJCWRldl9pbmZvKERFViwgImRyb3BwaW5nICV1IGluIGRyYmRfcnNfZGVsX2FsbCwgYXBwYXJlbnRseSIKKwkJCWlmIChibV9leHQtPmxjZS5sY19udW1iZXIgPT0gZGV2aWNlLT5yZXN5bmNfd2VucikgeworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJkcm9wcGluZyAldSBpbiBkcmJkX3JzX2RlbF9hbGwsIGFwcGFyZW50bHkiCiAJCQkJICAgICAiIGdvdCAnc3luY2VkJyBieSBhcHBsaWNhdGlvbiBpb1xuIiwKLQkJCQkgICAgIG1kZXYtPnJlc3luY193ZW5yKTsKLQkJCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCQlEX0FTU0VSVCh0ZXN0X2JpdChCTUVfTk9fV1JJVEVTLCAmYm1fZXh0LT5mbGFncykpOworCQkJCSAgICAgZGV2aWNlLT5yZXN5bmNfd2Vucik7CisJCQkJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQk1FX0xPQ0tFRCwgJmJtX2V4dC0+ZmxhZ3MpKTsKKwkJCQlEX0FTU0VSVChkZXZpY2UsIHRlc3RfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKSk7CiAJCQkJY2xlYXJfYml0KEJNRV9OT19XUklURVMsICZibV9leHQtPmZsYWdzKTsKLQkJCQltZGV2LT5yZXN5bmNfd2VuciA9IExDX0ZSRUU7Ci0JCQkJbGNfcHV0KG1kZXYtPnJlc3luYywgJmJtX2V4dC0+bGNlKTsKKwkJCQlkZXZpY2UtPnJlc3luY193ZW5yID0gTENfRlJFRTsKKwkJCQlsY19wdXQoZGV2aWNlLT5yZXN5bmMsICZibV9leHQtPmxjZSk7CiAJCQl9CiAJCQlpZiAoYm1fZXh0LT5sY2UucmVmY250ICE9IDApIHsKLQkJCQlkZXZfaW5mbyhERVYsICJSZXRyeWluZyBkcmJkX3JzX2RlbF9hbGwoKSBsYXRlci4gIgorCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXRyeWluZyBkcmJkX3JzX2RlbF9hbGwoKSBsYXRlci4gIgogCQkJCSAgICAgInJlZmNudD0lZFxuIiwgYm1fZXh0LT5sY2UucmVmY250KTsKLQkJCQlwdXRfbGRldihtZGV2KTsKLQkJCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCQkJCXB1dF9sZGV2KGRldmljZSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCQkJCXJldHVybiAtRUFHQUlOOwogCQkJfQotCQkJRF9BU1NFUlQoIXRlc3RfYml0KEJNRV9MT0NLRUQsICZibV9leHQtPmZsYWdzKSk7Ci0JCQlEX0FTU0VSVCghdGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKTsKLQkJCWxjX2RlbChtZGV2LT5yZXN5bmMsICZibV9leHQtPmxjZSk7CisJCQlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCTUVfTE9DS0VELCAmYm1fZXh0LT5mbGFncykpOworCQkJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQk1FX05PX1dSSVRFUywgJmJtX2V4dC0+ZmxhZ3MpKTsKKwkJCWxjX2RlbChkZXZpY2UtPnJlc3luYywgJmJtX2V4dC0+bGNlKTsKIAkJfQotCQlEX0FTU0VSVChtZGV2LT5yZXN5bmMtPnVzZWQgPT0gMCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+cmVzeW5jLT51c2VkID09IDApOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOwotCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogZHJiZF9yc19mYWlsZWRfaW8oKSAtIFJlY29yZCBpbmZvcm1hdGlvbiBvbiBhIGZhaWx1cmUgdG8gcmVzeW5jIHRoZSBzcGVjaWZpZWQgYmxvY2tzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBzZWN0b3I6CVRoZSBzZWN0b3IgbnVtYmVyLgogICogQHNpemU6CVNpemUgb2YgZmFpbGVkIElPIG9wZXJhdGlvbiwgaW4gYnl0ZS4KICAqLwotdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQordm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAkvKiBJcyBjYWxsZWQgZnJvbSB3b3JrZXIgYW5kIHJlY2VpdmVyIGNvbnRleHQgX29ubHlfICovCiAJdW5zaWduZWQgbG9uZyBzYm5yLCBlYm5yLCBsYm5yOwpAQCAtMTI4NCwxMSArMTI4OSwxMSBAQAogCWludCB3YWtlX3VwID0gMDsKIAogCWlmIChzaXplIDw9IDAgfHwgIUlTX0FMSUdORUQoc2l6ZSwgNTEyKSB8fCBzaXplID4gRFJCRF9NQVhfQklPX1NJWkUpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3JzX2ZhaWxlZF9pbzogc2VjdG9yPSVsbHVzIHNpemU9JWQgbm9uc2Vuc2UhXG4iLAorCQlkcmJkX2VycihkZXZpY2UsICJkcmJkX3JzX2ZhaWxlZF9pbzogc2VjdG9yPSVsbHVzIHNpemU9JWQgbm9uc2Vuc2UhXG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuOwogCX0KLQlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KTsKKwlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCWVzZWN0b3IgPSBzZWN0b3IgKyAoc2l6ZSA+PiA5KSAtIDE7CiAKIAlpZiAoIWV4cGVjdChzZWN0b3IgPCBucl9zZWN0b3JzKSkKQEAgLTEzMTYsMjEgKzEzMjEsMjEgQEAKIAkgKiBvaywgKGNhcGFjaXR5ICYgNykgIT0gMCBzb21ldGltZXMsIGJ1dCB3aG8gY2FyZXMuLi4KIAkgKiB3ZSBjb3VudCByc197dG90YWwsbGVmdH0gaW4gYml0cywgbm90IHNlY3RvcnMuCiAJICovCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JY291bnQgPSBkcmJkX2JtX2NvdW50X2JpdHMobWRldiwgc2JuciwgZWJucik7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKKwljb3VudCA9IGRyYmRfYm1fY291bnRfYml0cyhkZXZpY2UsIHNibnIsIGVibnIpOwogCWlmIChjb3VudCkgewotCQltZGV2LT5yc19mYWlsZWQgKz0gY291bnQ7CisJCWRldmljZS0+cnNfZmFpbGVkICs9IGNvdW50OwogCi0JCWlmIChnZXRfbGRldihtZGV2KSkgewotCQkJZHJiZF90cnlfY2xlYXJfb25fZGlza19ibShtZGV2LCBzZWN0b3IsIGNvdW50LCBmYWxzZSk7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWRyYmRfdHJ5X2NsZWFyX29uX2Rpc2tfYm0oZGV2aWNlLCBzZWN0b3IsIGNvdW50LCBmYWxzZSk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQl9CiAKIAkJLyoganVzdCB3YWtlX3VwIHVuY29uZGl0aW9uYWwgbm93LCB2YXJpb3VzIGxjX2NoYWdlZCgpLAogCQkgKiBsY19wdXQoKSBpbiBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKCkuICovCiAJCXdha2VfdXAgPSAxOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAod2FrZV91cCkKLQkJd2FrZV91cCgmbWRldi0+YWxfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9iaXRtYXAuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCmluZGV4IDU5N2YxMTEuLjFhYTI5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jCkBAIC0xMTMsNTQgKzExMyw1NCBAQAogfTsKIAogI2RlZmluZSBibV9wcmludF9sb2NrX2luZm8obSkgX19ibV9wcmludF9sb2NrX2luZm8obSwgX19mdW5jX18pCi1zdGF0aWMgdm9pZCBfX2JtX3ByaW50X2xvY2tfaW5mbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCBjaGFyICpmdW5jKQorc3RhdGljIHZvaWQgX19ibV9wcmludF9sb2NrX2luZm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmZ1bmMpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWlmICghX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKIAkJcmV0dXJuOwotCWRldl9lcnIoREVWLCAiRklYTUUgJXMgaW4gJXMsIGJpdG1hcCBsb2NrZWQgZm9yICclcycgYnkgJXNcbiIsCi0JCWRyYmRfdGFza190b190aHJlYWRfbmFtZShtZGV2LT50Y29ubiwgY3VycmVudCksCi0JCWZ1bmMsIGItPmJtX3doeSA/OiAiPyIsCi0JCWRyYmRfdGFza190b190aHJlYWRfbmFtZShtZGV2LT50Y29ubiwgYi0+Ym1fdGFzaykpOworCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FICVzWyVkXSBpbiAlcywgYml0bWFwIGxvY2tlZCBmb3IgJyVzJyBieSAlc1slZF1cbiIsCisJCSBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwKKwkJIGZ1bmMsIGItPmJtX3doeSA/OiAiPyIsCisJCSBiLT5ibV90YXNrLT5jb21tLCB0YXNrX3BpZF9ucihiLT5ibV90YXNrKSk7CiB9CiAKLXZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKQordm9pZCBkcmJkX2JtX2xvY2soc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAlpbnQgdHJ5bG9ja19mYWlsZWQ7CiAKIAlpZiAoIWIpIHsKLQkJZGV2X2VycihERVYsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV9sb2NrIT9cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV9sb2NrIT9cbiIpOwogCQlyZXR1cm47CiAJfQogCiAJdHJ5bG9ja19mYWlsZWQgPSAhbXV0ZXhfdHJ5bG9jaygmYi0+Ym1fY2hhbmdlKTsKIAogCWlmICh0cnlsb2NrX2ZhaWxlZCkgewotCQlkZXZfd2FybihERVYsICIlcyBnb2luZyB0byAnJXMnIGJ1dCBiaXRtYXAgYWxyZWFkeSBsb2NrZWQgZm9yICclcycgYnkgJXNcbiIsCi0JCQkgZHJiZF90YXNrX3RvX3RocmVhZF9uYW1lKG1kZXYtPnRjb25uLCBjdXJyZW50KSwKLQkJCSB3aHksIGItPmJtX3doeSA/OiAiPyIsCi0JCQkgZHJiZF90YXNrX3RvX3RocmVhZF9uYW1lKG1kZXYtPnRjb25uLCBiLT5ibV90YXNrKSk7CisJCWRyYmRfd2FybihkZXZpY2UsICIlc1slZF0gZ29pbmcgdG8gJyVzJyBidXQgYml0bWFwIGFscmVhZHkgbG9ja2VkIGZvciAnJXMnIGJ5ICVzWyVkXVxuIiwKKwkJCSAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksCisJCQkgIHdoeSwgYi0+Ym1fd2h5ID86ICI/IiwKKwkJCSAgYi0+Ym1fdGFzay0+Y29tbSwgdGFza19waWRfbnIoYi0+Ym1fdGFzaykpOwogCQltdXRleF9sb2NrKCZiLT5ibV9jaGFuZ2UpOwogCX0KIAlpZiAoQk1fTE9DS0VEX01BU0sgJiBiLT5ibV9mbGFncykKLQkJZGV2X2VycihERVYsICJGSVhNRSBiaXRtYXAgYWxyZWFkeSBsb2NrZWQgaW4gYm1fbG9ja1xuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FIGJpdG1hcCBhbHJlYWR5IGxvY2tlZCBpbiBibV9sb2NrXG4iKTsKIAliLT5ibV9mbGFncyB8PSBmbGFncyAmIEJNX0xPQ0tFRF9NQVNLOwogCiAJYi0+Ym1fd2h5ICA9IHdoeTsKIAliLT5ibV90YXNrID0gY3VycmVudDsKIH0KIAotdm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFiKSB7Ci0JCWRldl9lcnIoREVWLCAiRklYTUUgbm8gYml0bWFwIGluIGRyYmRfYm1fdW5sb2NrIT9cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBubyBiaXRtYXAgaW4gZHJiZF9ibV91bmxvY2shP1xuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIShCTV9MT0NLRURfTUFTSyAmIG1kZXYtPmJpdG1hcC0+Ym1fZmxhZ3MpKQotCQlkZXZfZXJyKERFViwgIkZJWE1FIGJpdG1hcCBub3QgbG9ja2VkIGluIGJtX3VubG9ja1xuIik7CisJaWYgKCEoQk1fTE9DS0VEX01BU0sgJiBkZXZpY2UtPmJpdG1hcC0+Ym1fZmxhZ3MpKQorCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSBiaXRtYXAgbm90IGxvY2tlZCBpbiBibV91bmxvY2tcbiIpOwogCiAJYi0+Ym1fZmxhZ3MgJj0gfkJNX0xPQ0tFRF9NQVNLOwogCWItPmJtX3doeSAgPSBOVUxMOwpAQCAtMjExLDE5ICsyMTEsMTkgQEAKIC8qIEFzIGlzIHZlcnkgdW5saWtlbHkgdGhhdCB0aGUgc2FtZSBwYWdlIGlzIHVuZGVyIElPIGZyb20gbW9yZSB0aGFuIG9uZQogICogY29udGV4dCwgd2UgY2FuIGdldCBhd2F5IHdpdGggYSBiaXQgcGVyIHBhZ2UgYW5kIG9uZSB3YWl0IHF1ZXVlIHBlciBiaXRtYXAuCiAgKi8KLXN0YXRpYyB2b2lkIGJtX3BhZ2VfbG9ja19pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcGFnZV9ucikKK3N0YXRpYyB2b2lkIGJtX3BhZ2VfbG9ja19pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHBhZ2VfbnIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXZvaWQgKmFkZHIgPSAmcGFnZV9wcml2YXRlKGItPmJtX3BhZ2VzW3BhZ2VfbnJdKTsKIAl3YWl0X2V2ZW50KGItPmJtX2lvX3dhaXQsICF0ZXN0X2FuZF9zZXRfYml0KEJNX1BBR0VfSU9fTE9DSywgYWRkcikpOwogfQogCi1zdGF0aWMgdm9pZCBibV9wYWdlX3VubG9ja19pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcGFnZV9ucikKK3N0YXRpYyB2b2lkIGJtX3BhZ2VfdW5sb2NrX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcGFnZV9ucikKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdm9pZCAqYWRkciA9ICZwYWdlX3ByaXZhdGUoYi0+Ym1fcGFnZXNbcGFnZV9ucl0pOwogCWNsZWFyX2JpdF91bmxvY2soQk1fUEFHRV9JT19MT0NLLCBhZGRyKTsKLQl3YWtlX3VwKCZtZGV2LT5iaXRtYXAtPmJtX2lvX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+Yml0bWFwLT5ibV9pb193YWl0KTsKIH0KIAogLyogc2V0IF9iZWZvcmVfIHN1Ym1pdF9pbywgc28gaXQgbWF5IGJlIHJlc2V0IGR1ZSB0byBiZWluZyBjaGFuZ2VkCkBAIC0yNDIsMjIgKzI0MiwyMiBAQAogCiAvKioKICAqIGRyYmRfYm1fbWFya19mb3Jfd3JpdGVvdXQoKSAtIG1hcmsgYSBwYWdlIHdpdGggYSAiaGludCIgdG8gYmUgY29uc2lkZXJlZCBmb3Igd3JpdGVvdXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHBhZ2VfbnI6CXRoZSBiaXRtYXAgcGFnZSB0byBtYXJrIHdpdGggdGhlICJoaW50IiBmbGFnCiAgKgogICogRnJvbSB3aXRoaW4gYW4gYWN0aXZpdHkgbG9nIHRyYW5zYWN0aW9uLCB3ZSBtYXJrIGEgZmV3IHBhZ2VzIHdpdGggdGhlc2UKICAqIGhpbnRzLCB0aGVuIGNhbGwgZHJiZF9ibV93cml0ZV9oaW50ZWQoKSwgd2hpY2ggd2lsbCBvbmx5IHdyaXRlIG91dCBjaGFuZ2VkCiAgKiBwYWdlcyB3aGljaCBhcmUgZmxhZ2dlZCB3aXRoIHRoaXMgbWFyay4KICAqLwotdm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBwYWdlX25yKQordm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcGFnZV9ucikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpZiAocGFnZV9uciA+PSBtZGV2LT5iaXRtYXAtPmJtX251bWJlcl9vZl9wYWdlcykgewotCQlkZXZfd2FybihERVYsICJCQUQ6IHBhZ2VfbnI6ICV1LCBudW1iZXJfb2ZfcGFnZXM6ICV1XG4iLAotCQkJIHBhZ2VfbnIsIChpbnQpbWRldi0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpOworCWlmIChwYWdlX25yID49IGRldmljZS0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIkJBRDogcGFnZV9ucjogJXUsIG51bWJlcl9vZl9wYWdlczogJXVcbiIsCisJCQkgcGFnZV9uciwgKGludClkZXZpY2UtPmJpdG1hcC0+Ym1fbnVtYmVyX29mX3BhZ2VzKTsKIAkJcmV0dXJuOwogCX0KLQlwYWdlID0gbWRldi0+Yml0bWFwLT5ibV9wYWdlc1twYWdlX25yXTsKKwlwYWdlID0gZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzW3BhZ2VfbnJdOwogCXNldF9iaXQoQk1fUEFHRV9ISU5UX1dSSVRFT1VULCAmcGFnZV9wcml2YXRlKHBhZ2UpKTsKIH0KIApAQCAtMzQwLDcgKzM0MCw3IEBACiAKIC8qCiAgKiBhY3R1YWxseSBtb3N0IGZ1bmN0aW9ucyBoZXJlaW4gc2hvdWxkIHRha2UgYSBzdHJ1Y3QgZHJiZF9iaXRtYXAqLCBub3QgYQotICogc3RydWN0IGRyYmRfY29uZiosIGJ1dCBmb3IgdGhlIGRlYnVnIG1hY3JvcyBJIGxpa2UgdG8gaGF2ZSB0aGUgbWRldiBhcm91bmQKKyAqIHN0cnVjdCBkcmJkX2RldmljZSosIGJ1dCBmb3IgdGhlIGRlYnVnIG1hY3JvcyBJIGxpa2UgdG8gaGF2ZSB0aGUgZGV2aWNlIGFyb3VuZAogICogdG8gYmUgYWJsZSB0byByZXBvcnQgZGV2aWNlIHNwZWNpZmljLgogICovCiAKQEAgLTQzNiwxMSArNDM2LDExIEBACiAKIC8qCiAgKiBjYWxsZWQgb24gZHJpdmVyIGluaXQgb25seS4gVE9ETyBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgY3JlYXRlZC4KLSAqIGFsbG9jYXRlcyB0aGUgZHJiZF9iaXRtYXAsIGFuZCBzdG9yZXMgaXQgaW4gbWRldi0+Yml0bWFwLgorICogYWxsb2NhdGVzIHRoZSBkcmJkX2JpdG1hcCwgYW5kIHN0b3JlcyBpdCBpbiBkZXZpY2UtPmJpdG1hcC4KICAqLwotaW50IGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJV0FSTl9PTihiICE9IE5VTEwpOwogCWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9iaXRtYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWIpCkBAIC00NDksMjggKzQ0OSwyOCBAQAogCW11dGV4X2luaXQoJmItPmJtX2NoYW5nZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYi0+Ym1faW9fd2FpdCk7CiAKLQltZGV2LT5iaXRtYXAgPSBiOworCWRldmljZS0+Yml0bWFwID0gYjsKIAogCXJldHVybiAwOwogfQogCi1zZWN0b3JfdCBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzZWN0b3JfdCBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWlmICghZXhwZWN0KG1kZXYtPmJpdG1hcCkpCisJaWYgKCFleHBlY3QoZGV2aWNlLT5iaXRtYXApKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gbWRldi0+Yml0bWFwLT5ibV9kZXZfY2FwYWNpdHk7CisJcmV0dXJuIGRldmljZS0+Yml0bWFwLT5ibV9kZXZfY2FwYWNpdHk7CiB9CiAKIC8qIGNhbGxlZCBvbiBkcml2ZXIgdW5sb2FkLiBUT0RPOiBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgZGVzdHJveWVkLgogICovCi12b2lkIGRyYmRfYm1fY2xlYW51cChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX2NsZWFudXAoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKCFleHBlY3QobWRldi0+Yml0bWFwKSkKKwlpZiAoIWV4cGVjdChkZXZpY2UtPmJpdG1hcCkpCiAJCXJldHVybjsKLQlibV9mcmVlX3BhZ2VzKG1kZXYtPmJpdG1hcC0+Ym1fcGFnZXMsIG1kZXYtPmJpdG1hcC0+Ym1fbnVtYmVyX29mX3BhZ2VzKTsKLQlibV92a19mcmVlKG1kZXYtPmJpdG1hcC0+Ym1fcGFnZXMsIChCTV9QX1ZNQUxMT0NFRCAmIG1kZXYtPmJpdG1hcC0+Ym1fZmxhZ3MpKTsKLQlrZnJlZShtZGV2LT5iaXRtYXApOwotCW1kZXYtPmJpdG1hcCA9IE5VTEw7CisJYm1fZnJlZV9wYWdlcyhkZXZpY2UtPmJpdG1hcC0+Ym1fcGFnZXMsIGRldmljZS0+Yml0bWFwLT5ibV9udW1iZXJfb2ZfcGFnZXMpOworCWJtX3ZrX2ZyZWUoZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzLCAoQk1fUF9WTUFMTE9DRUQgJiBkZXZpY2UtPmJpdG1hcC0+Ym1fZmxhZ3MpKTsKKwlrZnJlZShkZXZpY2UtPmJpdG1hcCk7CisJZGV2aWNlLT5iaXRtYXAgPSBOVUxMOwogfQogCiAvKgpAQCAtNjMxLDkgKzYzMSw5IEBACiAgKiBJbiBjYXNlIHRoaXMgaXMgYWN0dWFsbHkgYSByZXNpemUsIHdlIGNvcHkgdGhlIG9sZCBiaXRtYXAgaW50byB0aGUgbmV3IG9uZS4KICAqIE90aGVyd2lzZSwgdGhlIGJpdG1hcCBpcyBpbml0aWFsaXplZCB0byBhbGwgYml0cyBzZXQuCiAgKi8KLWludCBkcmJkX2JtX3Jlc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IHNldF9uZXdfYml0cykKK2ludCBkcmJkX2JtX3Jlc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3QgY2FwYWNpdHksIGludCBzZXRfbmV3X2JpdHMpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgYml0cywgd29yZHMsIG93b3Jkcywgb2JpdHM7CiAJdW5zaWduZWQgbG9uZyB3YW50LCBoYXZlLCBvbnBhZ2VzOyAvKiBudW1iZXIgb2YgcGFnZXMgKi8KIAlzdHJ1Y3QgcGFnZSAqKm5wYWdlcywgKipvcGFnZXMgPSBOVUxMOwpAQCAtNjQzLDkgKzY0Myw5IEBACiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZHJiZF9ibV9sb2NrKG1kZXYsICJyZXNpemUiLCBCTV9MT0NLRURfTUFTSyk7CisJZHJiZF9ibV9sb2NrKGRldmljZSwgInJlc2l6ZSIsIEJNX0xPQ0tFRF9NQVNLKTsKIAotCWRldl9pbmZvKERFViwgImRyYmRfYm1fcmVzaXplIGNhbGxlZCB3aXRoIGNhcGFjaXR5ID09ICVsbHVcbiIsCisJZHJiZF9pbmZvKGRldmljZSwgImRyYmRfYm1fcmVzaXplIGNhbGxlZCB3aXRoIGNhcGFjaXR5ID09ICVsbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWNhcGFjaXR5KTsKIAogCWlmIChjYXBhY2l0eSA9PSBiLT5ibV9kZXZfY2FwYWNpdHkpCkBAIC02NzgsMTIgKzY3OCwxMiBAQAogCSovCiAJd29yZHMgPSBBTElHTihiaXRzLCA2NCkgPj4gTE4yX0JQTDsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQl1NjQgYml0c19vbl9kaXNrID0gZHJiZF9tZF9vbl9kaXNrX2JpdHMobWRldi0+bGRldik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCXU2NCBiaXRzX29uX2Rpc2sgPSBkcmJkX21kX29uX2Rpc2tfYml0cyhkZXZpY2UtPmxkZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlpZiAoYml0cyA+IGJpdHNfb25fZGlzaykgewotCQkJZGV2X2luZm8oREVWLCAiYml0cyA9ICVsdVxuIiwgYml0cyk7Ci0JCQlkZXZfaW5mbyhERVYsICJiaXRzX29uX2Rpc2sgPSAlbGx1XG4iLCBiaXRzX29uX2Rpc2spOworCQkJZHJiZF9pbmZvKGRldmljZSwgImJpdHMgPSAlbHVcbiIsIGJpdHMpOworCQkJZHJiZF9pbmZvKGRldmljZSwgImJpdHNfb25fZGlzayA9ICVsbHVcbiIsIGJpdHNfb25fZGlzayk7CiAJCQllcnIgPSAtRU5PU1BDOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTY5MiwxMCArNjkyLDEwIEBACiAJd2FudCA9IEFMSUdOKHdvcmRzKnNpemVvZihsb25nKSwgUEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOwogCWhhdmUgPSBiLT5ibV9udW1iZXJfb2ZfcGFnZXM7CiAJaWYgKHdhbnQgPT0gaGF2ZSkgewotCQlEX0FTU0VSVChiLT5ibV9wYWdlcyAhPSBOVUxMKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBiLT5ibV9wYWdlcyAhPSBOVUxMKTsKIAkJbnBhZ2VzID0gYi0+Ym1fcGFnZXM7CiAJfSBlbHNlIHsKLQkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KG1kZXYsIERSQkRfRkFVTFRfQk1fQUxMT0MpKQorCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQoZGV2aWNlLCBEUkJEX0ZBVUxUX0JNX0FMTE9DKSkKIAkJCW5wYWdlcyA9IE5VTEw7CiAJCWVsc2UKIAkJCW5wYWdlcyA9IGJtX3JlYWxsb2NfcGFnZXMoYiwgd2FudCk7CkBAIC03NDIsMTAgKzc0MiwxMCBAQAogCQlibV92a19mcmVlKG9wYWdlcywgb3BhZ2VzX3ZtYWxsb2NlZCk7CiAJaWYgKCFncm93aW5nKQogCQliLT5ibV9zZXQgPSBibV9jb3VudF9iaXRzKGIpOwotCWRldl9pbmZvKERFViwgInJlc3luYyBiaXRtYXA6IGJpdHM9JWx1IHdvcmRzPSVsdSBwYWdlcz0lbHVcbiIsIGJpdHMsIHdvcmRzLCB3YW50KTsKKwlkcmJkX2luZm8oZGV2aWNlLCAicmVzeW5jIGJpdG1hcDogYml0cz0lbHUgd29yZHM9JWx1IHBhZ2VzPSVsdVxuIiwgYml0cywgd29yZHMsIHdhbnQpOwogCiAgb3V0OgotCWRyYmRfYm1fdW5sb2NrKG1kZXYpOworCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzU3LDkgKzc1Nyw5IEBACiAgKgogICogbWF5YmUgYm1fc2V0IHNob3VsZCBiZSBhdG9taWNfdCA/CiAgKi8KLXVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit1bnNpZ25lZCBsb25nIF9kcmJkX2JtX3RvdGFsX3dlaWdodChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyBzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTc3NSwyMCArNzc1LDIwIEBACiAJcmV0dXJuIHM7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZHJiZF9ibV90b3RhbF93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3Vuc2lnbmVkIGxvbmcgZHJiZF9ibV90b3RhbF93ZWlnaHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBzOwogCS8qIGlmIEkgZG9uJ3QgaGF2ZSBhIGRpc2ssIEkgZG9uJ3Qga25vdyBhYm91dCBvdXQtb2Ytc3luYyBzdGF0dXMgKi8KLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkKIAkJcmV0dXJuIDA7Ci0JcyA9IF9kcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KTsKLQlwdXRfbGRldihtZGV2KTsKKwlzID0gX2RyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSk7CisJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gczsKIH0KIAotc2l6ZV90IGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3NpemVfdCBkcmJkX2JtX3dvcmRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAlpZiAoIWV4cGVjdChiKSkKIAkJcmV0dXJuIDA7CiAJaWYgKCFleHBlY3QoYi0+Ym1fcGFnZXMpKQpAQCAtNzk3LDkgKzc5Nyw5IEBACiAJcmV0dXJuIGItPmJtX3dvcmRzOwogfQogCi11bnNpZ25lZCBsb25nIGRyYmRfYm1fYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordW5zaWduZWQgbG9uZyBkcmJkX2JtX2JpdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWlmICghZXhwZWN0KGIpKQogCQlyZXR1cm4gMDsKIApAQCAtODExLDEwICs4MTEsMTAgQEAKICAqIGJpdG1hcCBtdXN0IGJlIGxvY2tlZCBieSBkcmJkX2JtX2xvY2suCiAgKiBjdXJyZW50bHkgb25seSB1c2VkIGZyb20gcmVjZWl2ZV9iaXRtYXAuCiAgKi8KLXZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG51bWJlciwKK3ZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBudW1iZXIsCiAJCQl1bnNpZ25lZCBsb25nICpidWZmZXIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciwgKmJtOwogCXVuc2lnbmVkIGxvbmcgd29yZCwgYml0czsKIAl1bnNpZ25lZCBpbnQgaWR4OwpAQCAtODYwLDEwICs4NjAsMTAgQEAKIC8qIGNvcHkgbnVtYmVyIHdvcmRzIGZyb20gdGhlIGJpdG1hcCBzdGFydGluZyBhdCBvZmZzZXQgaW50byB0aGUgYnVmZmVyLgogICogYnVmZmVyW2ldIHdpbGwgYmUgbGl0dGxlIGVuZGlhbiB1bnNpZ25lZCBsb25nLgogICovCi12b2lkIGRyYmRfYm1fZ2V0X2xlbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbnVtYmVyLAordm9pZCBkcmJkX2JtX2dldF9sZWwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBudW1iZXIsCiAJCSAgICAgdW5zaWduZWQgbG9uZyAqYnVmZmVyKQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHIsICpibTsKIAlzaXplX3QgZW5kLCBkb19ub3c7CiAKQEAgLTg3OCw3ICs4NzgsNyBAQAogCWlmICgob2Zmc2V0ID49IGItPmJtX3dvcmRzKSB8fAogCSAgICAoZW5kICAgID4gIGItPmJtX3dvcmRzKSB8fAogCSAgICAobnVtYmVyIDw9IDApKQotCQlkZXZfZXJyKERFViwgIm9mZnNldD0lbHUgbnVtYmVyPSVsdSBibV93b3Jkcz0lbHVcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIm9mZnNldD0lbHUgbnVtYmVyPSVsdSBibV93b3Jkcz0lbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZykJb2Zmc2V0LAogCQkJKHVuc2lnbmVkIGxvbmcpCW51bWJlciwKIAkJCSh1bnNpZ25lZCBsb25nKSBiLT5ibV93b3Jkcyk7CkBAIC04OTcsOSArODk3LDkgQEAKIH0KIAogLyogc2V0IGFsbCBiaXRzIGluIHRoZSBiaXRtYXAgKi8KLXZvaWQgZHJiZF9ibV9zZXRfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfYm1fc2V0X2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybjsKIAlpZiAoIWV4cGVjdChiLT5ibV9wYWdlcykpCkBAIC05MTMsOSArOTEzLDkgQEAKIH0KIAogLyogY2xlYXIgYWxsIGJpdHMgaW4gdGhlIGJpdG1hcCAqLwotdm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJaWYgKCFleHBlY3QoYikpCiAJCXJldHVybjsKIAlpZiAoIWV4cGVjdChiLT5ibV9wYWdlcykpCkBAIC05MjgsNyArOTI4LDcgQEAKIH0KIAogc3RydWN0IGJtX2Fpb19jdHggewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJYXRvbWljX3QgaW5fZmxpZ2h0OwogCXVuc2lnbmVkIGludCBkb25lOwogCXVuc2lnbmVkIGZsYWdzOwpAQCAtOTQzLDcgKzk0Myw3IEBACiB7CiAJc3RydWN0IGJtX2Fpb19jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYm1fYWlvX2N0eCwga3JlZik7CiAKLQlwdXRfbGRldihjdHgtPm1kZXYpOworCXB1dF9sZGV2KGN0eC0+ZGV2aWNlKTsKIAlrZnJlZShjdHgpOwogfQogCkBAIC05NTEsOCArOTUxLDggQEAKIHN0YXRpYyB2b2lkIGJtX2FzeW5jX2lvX2NvbXBsZXRlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQogewogCXN0cnVjdCBibV9haW9fY3R4ICpjdHggPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGN0eC0+bWRldjsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBjdHgtPmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBpbnQgaWR4ID0gYm1fcGFnZV90b19pZHgoYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZSk7CiAJaW50IHVwdG9kYXRlID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpOwogCkBAIC05NjYsNyArOTY2LDcgQEAKIAogCWlmICgoY3R4LT5mbGFncyAmIEJNX0FJT19DT1BZX1BBR0VTKSA9PSAwICYmCiAJICAgICFibV90ZXN0X3BhZ2VfdW5jaGFuZ2VkKGItPmJtX3BhZ2VzW2lkeF0pKQotCQlkZXZfd2FybihERVYsICJiaXRtYXAgcGFnZSBpZHggJXUgY2hhbmdlZCBkdXJpbmcgSU8hXG4iLCBpZHgpOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiYml0bWFwIHBhZ2UgaWR4ICV1IGNoYW5nZWQgZHVyaW5nIElPIVxuIiwgaWR4KTsKIAogCWlmIChlcnJvcikgewogCQkvKiBjdHggZXJyb3Igd2lsbCBob2xkIHRoZSBjb21wbGV0ZWQtbGFzdCBub24temVybyBlcnJvciBjb2RlLApAQCAtOTc2LDE0ICs5NzYsMTQgQEAKIAkJLyogTm90IGlkZW50aWNhbCB0byBvbiBkaXNrIHZlcnNpb24gb2YgaXQuCiAJCSAqIElzIEJNX1BBR0VfSU9fRVJST1IgZW5vdWdoPyAqLwogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiSU8gRVJST1IgJWQgb24gYml0bWFwIHBhZ2UgaWR4ICV1XG4iLAorCQkJZHJiZF9lcnIoZGV2aWNlLCAiSU8gRVJST1IgJWQgb24gYml0bWFwIHBhZ2UgaWR4ICV1XG4iLAogCQkJCQllcnJvciwgaWR4KTsKIAl9IGVsc2UgewogCQlibV9jbGVhcl9wYWdlX2lvX2VycihiLT5ibV9wYWdlc1tpZHhdKTsKLQkJZHluYW1pY19kZXZfZGJnKERFViwgImJpdG1hcCBwYWdlIGlkeCAldSBjb21wbGV0ZWRcbiIsIGlkeCk7CisJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAiYml0bWFwIHBhZ2UgaWR4ICV1IGNvbXBsZXRlZFxuIiwgaWR4KTsKIAl9CiAKLQlibV9wYWdlX3VubG9ja19pbyhtZGV2LCBpZHgpOworCWJtX3BhZ2VfdW5sb2NrX2lvKGRldmljZSwgaWR4KTsKIAogCWlmIChjdHgtPmZsYWdzICYgQk1fQUlPX0NPUFlfUEFHRVMpCiAJCW1lbXBvb2xfZnJlZShiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlLCBkcmJkX21kX2lvX3BhZ2VfcG9vbCk7CkBAIC05OTIsNyArOTkyLDcgQEAKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjdHgtPmluX2ZsaWdodCkpIHsKIAkJY3R4LT5kb25lID0gMTsKLQkJd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCQlrcmVmX3B1dCgmY3R4LT5rcmVmLCAmYm1fYWlvX2N0eF9kZXN0cm95KTsKIAl9CiB9CkBAIC0xMDAwLDIzICsxMDAwLDIzIEBACiBzdGF0aWMgdm9pZCBibV9wYWdlX2lvX2FzeW5jKHN0cnVjdCBibV9haW9fY3R4ICpjdHgsIGludCBwYWdlX25yLCBpbnQgcncpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IGJpb19hbGxvY19kcmJkKEdGUF9OT0lPKTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gY3R4LT5tZGV2OwotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGN0eC0+ZGV2aWNlOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGludCBsZW47CiAKIAlzZWN0b3JfdCBvbl9kaXNrX3NlY3RvciA9Ci0JCW1kZXYtPmxkZXYtPm1kLm1kX29mZnNldCArIG1kZXYtPmxkZXYtPm1kLmJtX29mZnNldDsKKwkJZGV2aWNlLT5sZGV2LT5tZC5tZF9vZmZzZXQgKyBkZXZpY2UtPmxkZXYtPm1kLmJtX29mZnNldDsKIAlvbl9kaXNrX3NlY3RvciArPSAoKHNlY3Rvcl90KXBhZ2VfbnIpIDw8IChQQUdFX1NISUZULTkpOwogCiAJLyogdGhpcyBtaWdodCBoYXBwZW4gd2l0aCB2ZXJ5IHNtYWxsCiAJICogZmxleGlibGUgZXh0ZXJuYWwgbWV0YSBkYXRhIGRldmljZSwKIAkgKiBvciB3aXRoIFBBR0VfU0laRSA+IDRrICovCiAJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBQQUdFX1NJWkUsCi0JCShkcmJkX21kX2xhc3Rfc2VjdG9yKG1kZXYtPmxkZXYpIC0gb25fZGlza19zZWN0b3IgKyAxKTw8OSk7CisJCShkcmJkX21kX2xhc3Rfc2VjdG9yKGRldmljZS0+bGRldikgLSBvbl9kaXNrX3NlY3RvciArIDEpPDw5KTsKIAogCS8qIHNlcmlhbGl6ZSBJTyBvbiB0aGlzIHBhZ2UgKi8KLQlibV9wYWdlX2xvY2tfaW8obWRldiwgcGFnZV9ucik7CisJYm1fcGFnZV9sb2NrX2lvKGRldmljZSwgcGFnZV9ucik7CiAJLyogYmVmb3JlIG1lbWNweSBhbmQgc3VibWl0LAogCSAqIHNvIGl0IGNhbiBiZSByZWRpcnRpZWQgYW55IHRpbWUgKi8KIAlibV9zZXRfcGFnZV91bmNoYW5nZWQoYi0+Ym1fcGFnZXNbcGFnZV9ucl0pOwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAkJYm1fc3RvcmVfcGFnZV9pZHgocGFnZSwgcGFnZV9ucik7CiAJfSBlbHNlCiAJCXBhZ2UgPSBiLT5ibV9wYWdlc1twYWdlX25yXTsKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5tZF9iZGV2OworCWJpby0+YmlfYmRldiA9IGRldmljZS0+bGRldi0+bWRfYmRldjsKIAliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gb25fZGlza19zZWN0b3I7CiAJLyogYmlvX2FkZF9wYWdlIG9mIGEgc2luZ2xlIHBhZ2UgdG8gYW4gZW1wdHkgYmlvIHdpbGwgYWx3YXlzIHN1Y2NlZWQsCiAJICogYWNjb3JkaW5nIHRvIGFwaS4gIERvIHdlIHdhbnQgdG8gYXNzZXJ0IHRoYXQ/ICovCkBAIC0xMDM1LDI0ICsxMDM1LDI0IEBACiAJYmlvLT5iaV9wcml2YXRlID0gY3R4OwogCWJpby0+YmlfZW5kX2lvID0gYm1fYXN5bmNfaW9fY29tcGxldGU7CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKSB7CisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgKHJ3ICYgV1JJVEUpID8gRFJCRF9GQVVMVF9NRF9XUiA6IERSQkRfRkFVTFRfTURfUkQpKSB7CiAJCWJpby0+YmlfcncgfD0gcnc7CiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogCX0gZWxzZSB7CiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CiAJCS8qIHRoaXMgc2hvdWxkIG5vdCBjb3VudCBhcyB1c2VyIGFjdGl2aXR5IGFuZCBjYXVzZSB0aGUKIAkJICogcmVzeW5jIHRvIHRocm90dGxlIC0tIHNlZSBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oKS4gKi8KLQkJYXRvbWljX2FkZChsZW4gPj4gOSwgJm1kZXYtPnJzX3NlY3RfZXYpOworCQlhdG9taWNfYWRkKGxlbiA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2V2KTsKIAl9CiB9CiAKIC8qCiAgKiBibV9ydzogcmVhZC93cml0ZSB0aGUgd2hvbGUgYml0bWFwIGZyb20vdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCiAgKi8KLXN0YXRpYyBpbnQgYm1fcncoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHJ3LCB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgbGF6eV93cml0ZW91dF91cHBlcl9pZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQorc3RhdGljIGludCBibV9ydyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHJ3LCB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgbGF6eV93cml0ZW91dF91cHBlcl9pZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXN0cnVjdCBibV9haW9fY3R4ICpjdHg7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBudW1fcGFnZXMsIGksIGNvdW50ID0gMDsKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAljaGFyIHBwYlsxMF07CkBAIC0xMDcyLDcgKzEwNzIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCSpjdHggPSAoc3RydWN0IGJtX2Fpb19jdHgpIHsKLQkJLm1kZXYgPSBtZGV2LAorCQkuZGV2aWNlID0gZGV2aWNlLAogCQkuaW5fZmxpZ2h0ID0gQVRPTUlDX0lOSVQoMSksCiAJCS5kb25lID0gMCwKIAkJLmZsYWdzID0gZmxhZ3MsCkBAIC0xMDgwLDggKzEwODAsOCBAQAogCQkua3JlZiA9IHsgQVRPTUlDX0lOSVQoMikgfSwKIAl9OwogCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsgIC8qIHB1dCBpcyBpbiBibV9haW9fY3R4X2Rlc3Ryb3koKSAqLwotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBibV9ydygpXG4iKTsKKwlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9BVFRBQ0hJTkcpKSB7ICAvKiBwdXQgaXMgaW4gYm1fYWlvX2N0eF9kZXN0cm95KCkgKi8KKwkJZHJiZF9lcnIoZGV2aWNlLCAiQVNTRVJUIEZBSUxFRDogZ2V0X2xkZXZfaWZfc3RhdGUoKSA9PSAxIGluIGJtX3J3KClcbiIpOwogCQlrZnJlZShjdHgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xMTA2LDE0ICsxMTA2LDE0IEBACiAKIAkJCWlmICghKGZsYWdzICYgQk1fV1JJVEVfQUxMX1BBR0VTKSAmJgogCQkJICAgIGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQoYi0+Ym1fcGFnZXNbaV0pKSB7Ci0JCQkJZHluYW1pY19kZXZfZGJnKERFViwgInNraXBwZWQgYm0gd3JpdGUgZm9yIGlkeCAldVxuIiwgaSk7CisJCQkJZHluYW1pY19kcmJkX2RiZyhkZXZpY2UsICJza2lwcGVkIGJtIHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJLyogZHVyaW5nIGxhenkgd3JpdGVvdXQsCiAJCQkgKiBpZ25vcmUgdGhvc2UgcGFnZXMgbm90IG1hcmtlZCBmb3IgbGF6eSB3cml0ZW91dC4gKi8KIAkJCWlmIChsYXp5X3dyaXRlb3V0X3VwcGVyX2lkeCAmJgogCQkJICAgICFibV90ZXN0X3BhZ2VfbGF6eV93cml0ZW91dChiLT5ibV9wYWdlc1tpXSkpIHsKLQkJCQlkeW5hbWljX2Rldl9kYmcoREVWLCAic2tpcHBlZCBibSBsYXp5IHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOworCQkJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAic2tpcHBlZCBibSBsYXp5IHdyaXRlIGZvciBpZHggJXVcbiIsIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0xMTMyLDE5ICsxMTMyLDE5IEBACiAJICogImluX2ZsaWdodCByZWFjaGVkIHplcm8sIGFsbCBkb25lIiBldmVudC4KIAkgKi8KIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmN0eC0+aW5fZmxpZ2h0KSkKLQkJd2FpdF91bnRpbF9kb25lX29yX2ZvcmNlX2RldGFjaGVkKG1kZXYsIG1kZXYtPmxkZXYsICZjdHgtPmRvbmUpOworCQl3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYsICZjdHgtPmRvbmUpOwogCWVsc2UKIAkJa3JlZl9wdXQoJmN0eC0+a3JlZiwgJmJtX2Fpb19jdHhfZGVzdHJveSk7CiAKIAkvKiBzdW1tYXJ5IGZvciBnbG9iYWwgYml0bWFwIElPICovCiAJaWYgKGZsYWdzID09IDApCi0JCWRldl9pbmZvKERFViwgImJpdG1hcCAlcyBvZiAldSBwYWdlcyB0b29rICVsdSBqaWZmaWVzXG4iLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiYml0bWFwICVzIG9mICV1IHBhZ2VzIHRvb2sgJWx1IGppZmZpZXNcbiIsCiAJCQkgcncgPT0gV1JJVEUgPyAiV1JJVEUiIDogIlJFQUQiLAogCQkJIGNvdW50LCBqaWZmaWVzIC0gbm93KTsKIAogCWlmIChjdHgtPmVycm9yKSB7Ci0JCWRldl9hbGVydChERVYsICJ3ZSBoYWQgYXQgbGVhc3Qgb25lIE1EIElPIEVSUk9SIGR1cmluZyBiaXRtYXAgSU9cbiIpOwotCQlkcmJkX2Noa19pb19lcnJvcihtZGV2LCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOworCQlkcmJkX2FsZXJ0KGRldmljZSwgIndlIGhhZCBhdCBsZWFzdCBvbmUgTUQgSU8gRVJST1IgZHVyaW5nIGJpdG1hcCBJT1xuIik7CisJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJZXJyID0gLUVJTzsgLyogY3R4LT5lcnJvciA/ICovCiAJfQogCkBAIC0xMTUzLDE2ICsxMTUzLDE2IEBACiAKIAlub3cgPSBqaWZmaWVzOwogCWlmIChydyA9PSBXUklURSkgewotCQlkcmJkX21kX2ZsdXNoKG1kZXYpOworCQlkcmJkX21kX2ZsdXNoKGRldmljZSk7CiAJfSBlbHNlIC8qIHJ3ID09IFJFQUQgKi8gewogCQliLT5ibV9zZXQgPSBibV9jb3VudF9iaXRzKGIpOwotCQlkZXZfaW5mbyhERVYsICJyZWNvdW50aW5nIG9mIHNldCBiaXRzIHRvb2sgYWRkaXRpb25hbCAlbHUgamlmZmllc1xuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgInJlY291bnRpbmcgb2Ygc2V0IGJpdHMgdG9vayBhZGRpdGlvbmFsICVsdSBqaWZmaWVzXG4iLAogCQkgICAgIGppZmZpZXMgLSBub3cpOwogCX0KIAlub3cgPSBiLT5ibV9zZXQ7CiAKIAlpZiAoZmxhZ3MgPT0gMCkKLQkJZGV2X2luZm8oREVWLCAiJXMgKCVsdSBiaXRzKSBtYXJrZWQgb3V0LW9mLXN5bmMgYnkgb24gZGlzayBiaXQtbWFwLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIiVzICglbHUgYml0cykgbWFya2VkIG91dC1vZi1zeW5jIGJ5IG9uIGRpc2sgYml0LW1hcC5cbiIsCiAJCSAgICAgcHBzaXplKHBwYiwgbm93IDw8IChCTV9CTE9DS19TSElGVC0xMCkpLCBub3cpOwogCiAJa3JlZl9wdXQoJmN0eC0+a3JlZiwgJmJtX2Fpb19jdHhfZGVzdHJveSk7CkBAIC0xMTcxLDQ4ICsxMTcxLDM4IEBACiAKIC8qKgogICogZHJiZF9ibV9yZWFkKCkgLSBSZWFkIHRoZSB3aG9sZSBiaXRtYXAgZnJvbSBpdHMgb24gZGlzayBsb2NhdGlvbi4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi1pbnQgZHJiZF9ibV9yZWFkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFJFQUQsIDAsIDApOworCXJldHVybiBibV9ydyhkZXZpY2UsIFJFQUQsIDAsIDApOwogfQogCiAvKioKICAqIGRyYmRfYm1fd3JpdGUoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIG9ubHkgd3JpdGUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCBJTy4KICAqLwotaW50IGRyYmRfYm1fd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCitpbnQgZHJiZF9ibV93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCAwLCAwKTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgMCwgMCk7CiB9CiAKIC8qKgogICogZHJiZF9ibV93cml0ZV9hbGwoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIHdyaXRlIGFsbCBwYWdlcy4KICAqLwotaW50IGRyYmRfYm1fd3JpdGVfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfYWxsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCkKIHsKLQlyZXR1cm4gYm1fcncobWRldiwgV1JJVEUsIEJNX1dSSVRFX0FMTF9QQUdFUywgMCk7Ci19Ci0KLS8qKgotICogZHJiZF9ibV9sYXp5X3dyaXRlX291dCgpIC0gV3JpdGUgYml0bWFwIHBhZ2VzIDAgdG8gQHVwcGVyX2lkeC0xLCBpZiB0aGV5IGhhdmUgY2hhbmdlZC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KLSAqIEB1cHBlcl9pZHg6CTA6IHdyaXRlIGFsbCBjaGFuZ2VkIHBhZ2VzOyArdmU6IHBhZ2UgaW5kZXggdG8gc3RvcCBzY2FubmluZyBmb3IgY2hhbmdlZCBwYWdlcwotICovCi1pbnQgZHJiZF9ibV93cml0ZV9sYXp5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIHVwcGVyX2lkeCkgX19tdXN0X2hvbGQobG9jYWwpCi17Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCBCTV9BSU9fQ09QWV9QQUdFUywgdXBwZXJfaWR4KTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgQk1fV1JJVEVfQUxMX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX2NvcHlfcGFnZXMoKSAtIFdyaXRlIHRoZSB3aG9sZSBiaXRtYXAgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBXaWxsIG9ubHkgd3JpdGUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCBJTy4KICAqIEluIGNvbnRyYXN0IHRvIGRyYmRfYm1fd3JpdGUoKSwgdGhpcyB3aWxsIGNvcHkgdGhlIGJpdG1hcCBwYWdlcwpAQCAtMTIyMSwyMyArMTIxMSwyMyBAQAogICogdmVyaWZ5IGlzIGFib3J0ZWQgZHVlIHRvIGEgZmFpbGVkIHBlZXIgZGlzaywgd2hpbGUgbG9jYWwgSU8gY29udGludWVzLCBvcgogICogcGVuZGluZyByZXN5bmMgYWNrcyBhcmUgc3RpbGwgYmVpbmcgcHJvY2Vzc2VkLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9jb3B5X3BhZ2VzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfY29weV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JcmV0dXJuIGJtX3J3KG1kZXYsIFdSSVRFLCBCTV9BSU9fQ09QWV9QQUdFUywgMCk7CisJcmV0dXJuIGJtX3J3KGRldmljZSwgV1JJVEUsIEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX2hpbnRlZCgpIC0gV3JpdGUgYml0bWFwIHBhZ2VzIHdpdGggImhpbnQiIG1hcmtzLCBpZiB0aGV5IGhhdmUgY2hhbmdlZC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCitpbnQgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewotCXJldHVybiBibV9ydyhtZGV2LCBXUklURSwgQk1fQUlPX1dSSVRFX0hJTlRFRCB8IEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKKwlyZXR1cm4gYm1fcncoZGV2aWNlLCBXUklURSwgQk1fQUlPX1dSSVRFX0hJTlRFRCB8IEJNX0FJT19DT1BZX1BBR0VTLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JtX3dyaXRlX3BhZ2UoKSAtIFdyaXRlcyBhIFBBR0VfU0laRSBhbGlnbmVkIHBpZWNlIG9mIGJpdG1hcAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAaWR4OgliaXRtYXAgcGFnZSBpbmRleAogICoKICAqIFdlIGRvbid0IHdhbnQgdG8gc3BlY2lhbCBjYXNlIG9uIGxvZ2ljYWxfYmxvY2tfc2l6ZSBvZiB0aGUgYmFja2VuZCBkZXZpY2UsCkBAIC0xMjQ3LDEzICsxMjM3LDEzIEBACiAgKiBJbiBjYXNlIHRoaXMgYmVjb21lcyBhbiBpc3N1ZSBvbiBzeXN0ZW1zIHdpdGggbGFyZ2VyIFBBR0VfU0laRSwKICAqIHdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGFnYWluIHRvIHdyaXRlIDRrIGFsaWduZWQgNGsgcGllY2VzLgogICovCi1pbnQgZHJiZF9ibV93cml0ZV9wYWdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKQoraW50IGRyYmRfYm1fd3JpdGVfcGFnZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgaW50IGlkeCkgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJc3RydWN0IGJtX2Fpb19jdHggKmN0eDsKIAlpbnQgZXJyOwogCi0JaWYgKGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQobWRldi0+Yml0bWFwLT5ibV9wYWdlc1tpZHhdKSkgewotCQlkeW5hbWljX2Rldl9kYmcoREVWLCAic2tpcHBlZCBibSBwYWdlIHdyaXRlIGZvciBpZHggJXVcbiIsIGlkeCk7CisJaWYgKGJtX3Rlc3RfcGFnZV91bmNoYW5nZWQoZGV2aWNlLT5iaXRtYXAtPmJtX3BhZ2VzW2lkeF0pKSB7CisJCWR5bmFtaWNfZHJiZF9kYmcoZGV2aWNlLCAic2tpcHBlZCBibSBwYWdlIHdyaXRlIGZvciBpZHggJXVcbiIsIGlkeCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTI2Miw3ICsxMjUyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkqY3R4ID0gKHN0cnVjdCBibV9haW9fY3R4KSB7Ci0JCS5tZGV2ID0gbWRldiwKKwkJLmRldmljZSA9IGRldmljZSwKIAkJLmluX2ZsaWdodCA9IEFUT01JQ19JTklUKDEpLAogCQkuZG9uZSA9IDAsCiAJCS5mbGFncyA9IEJNX0FJT19DT1BZX1BBR0VTLApAQCAtMTI3MCwyMSArMTI2MCwyMSBAQAogCQkua3JlZiA9IHsgQVRPTUlDX0lOSVQoMikgfSwKIAl9OwogCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsgIC8qIHB1dCBpcyBpbiBibV9haW9fY3R4X2Rlc3Ryb3koKSAqLwotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBkcmJkX2JtX3dyaXRlX3BhZ2UoKVxuIik7CisJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkgeyAgLyogcHV0IGlzIGluIGJtX2Fpb19jdHhfZGVzdHJveSgpICovCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQ6IGdldF9sZGV2X2lmX3N0YXRlKCkgPT0gMSBpbiBkcmJkX2JtX3dyaXRlX3BhZ2UoKVxuIik7CiAJCWtmcmVlKGN0eCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWJtX3BhZ2VfaW9fYXN5bmMoY3R4LCBpZHgsIFdSSVRFX1NZTkMpOwotCXdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChtZGV2LCBtZGV2LT5sZGV2LCAmY3R4LT5kb25lKTsKKwl3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoZGV2aWNlLCBkZXZpY2UtPmxkZXYsICZjdHgtPmRvbmUpOwogCiAJaWYgKGN0eC0+ZXJyb3IpCi0JCWRyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIDEsIERSQkRfTUVUQV9JT19FUlJPUik7CisJCWRyYmRfY2hrX2lvX2Vycm9yKGRldmljZSwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKIAkJLyogdGhhdCBjYXVzZXMgdXMgdG8gZGV0YWNoLCBzbyB0aGUgaW4gbWVtb3J5IGJpdG1hcCB3aWxsIGJlCiAJCSAqIGdvbmUgaW4gYSBtb21lbnQgYXMgd2VsbC4gKi8KIAotCW1kZXYtPmJtX3dyaXRfY250Kys7CisJZGV2aWNlLT5ibV93cml0X2NudCsrOwogCWVyciA9IGF0b21pY19yZWFkKCZjdHgtPmluX2ZsaWdodCkgPyAtRUlPIDogY3R4LT5lcnJvcjsKIAlrcmVmX3B1dCgmY3R4LT5rcmVmLCAmYm1fYWlvX2N0eF9kZXN0cm95KTsKIAlyZXR1cm4gZXJyOwpAQCAtMTI5OCwxNyArMTI4OCwxNyBAQAogICoKICAqIHRoaXMgcmV0dXJucyBhIGJpdCBudW1iZXIsIE5PVCBhIHNlY3RvciEKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19ibV9maW5kX25leHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBibV9mbywKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGJtX2ZvLAogCWNvbnN0IGludCBmaW5kX3plcm9fYml0KQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBiaXRfb2Zmc2V0OwogCXVuc2lnbmVkIGk7CiAKIAogCWlmIChibV9mbyA+IGItPmJtX2JpdHMpIHsKLQkJZGV2X2VycihERVYsICJibV9mbz0lbHUgYm1fYml0cz0lbHVcbiIsIGJtX2ZvLCBiLT5ibV9iaXRzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiYm1fZm89JWx1IGJtX2JpdHM9JWx1XG4iLCBibV9mbywgYi0+Ym1fYml0cyk7CiAJCWJtX2ZvID0gRFJCRF9FTkRfT0ZfQklUTUFQOwogCX0gZWxzZSB7CiAJCXdoaWxlIChibV9mbyA8IGItPmJtX2JpdHMpIHsKQEAgLTEzMzgsMTAgKzEzMjgsMTAgQEAKIAlyZXR1cm4gYm1fZm87CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHVuc2lnbmVkIGxvbmcgYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCXVuc2lnbmVkIGxvbmcgYm1fZm8sIGNvbnN0IGludCBmaW5kX3plcm9fYml0KQogewotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nIGkgPSBEUkJEX0VORF9PRl9CSVRNQVA7CiAKIAlpZiAoIWV4cGVjdChiKSkKQEAgLTEzNTEsMzkgKzEzNDEsMzkgQEAKIAogCXNwaW5fbG9ja19pcnEoJmItPmJtX2xvY2spOwogCWlmIChCTV9ET05UX1RFU1QgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAotCWkgPSBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgZmluZF96ZXJvX2JpdCk7CisJaSA9IF9fYm1fZmluZF9uZXh0KGRldmljZSwgYm1fZm8sIGZpbmRfemVyb19iaXQpOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAlyZXR1cm4gaTsKIH0KIAotdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKQordW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQlyZXR1cm4gYm1fZmluZF9uZXh0KG1kZXYsIGJtX2ZvLCAwKTsKKwlyZXR1cm4gYm1fZmluZF9uZXh0KGRldmljZSwgYm1fZm8sIDApOwogfQogCiAjaWYgMAogLyogbm90IHlldCBuZWVkZWQgZm9yIGFueXRoaW5nLiAqLwotdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dF96ZXJvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCit1bnNpZ25lZCBsb25nIGRyYmRfYm1fZmluZF9uZXh0X3plcm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCiB7Ci0JcmV0dXJuIGJtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMSk7CisJcmV0dXJuIGJtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAxKTsKIH0KICNlbmRpZgogCiAvKiBkb2VzIG5vdCBzcGluX2xvY2tfaXJxc2F2ZS4KICAqIHlvdSBtdXN0IHRha2UgZHJiZF9ibV9sb2NrKCkgZmlyc3QgKi8KLXVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgYm1fZm8pCit1bnNpZ25lZCBsb25nIF9kcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQkvKiBXQVJOX09OKCEoQk1fRE9OVF9TRVQgJiBtZGV2LT5iLT5ibV9mbGFncykpOyAqLwotCXJldHVybiBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMCk7CisJLyogV0FSTl9PTighKEJNX0RPTlRfU0VUICYgZGV2aWNlLT5iLT5ibV9mbGFncykpOyAqLworCXJldHVybiBfX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAwKTsKIH0KIAotdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKQordW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBibV9mbykKIHsKLQkvKiBXQVJOX09OKCEoQk1fRE9OVF9TRVQgJiBtZGV2LT5iLT5ibV9mbGFncykpOyAqLwotCXJldHVybiBfX2JtX2ZpbmRfbmV4dChtZGV2LCBibV9mbywgMSk7CisJLyogV0FSTl9PTighKEJNX0RPTlRfU0VUICYgZGV2aWNlLT5iLT5ibV9mbGFncykpOyAqLworCXJldHVybiBfX2JtX2ZpbmRfbmV4dChkZXZpY2UsIGJtX2ZvLCAxKTsKIH0KIAogLyogcmV0dXJucyBudW1iZXIgb2YgYml0cyBhY3R1YWxseSBjaGFuZ2VkLgpAQCAtMTM5MiwxMCArMTM4MiwxMCBAQAogICogd2FudHMgYml0bnIsIG5vdCBzZWN0b3IuCiAgKiBleHBlY3RlZCB0byBiZSBjYWxsZWQgZm9yIG9ubHkgYSBmZXcgYml0cyAoZSAtIHMgYWJvdXQgQklUU19QRVJfTE9ORykuCiAgKiBNdXN0IGhvbGQgYml0bWFwIGxvY2sgYWxyZWFkeS4gKi8KLXN0YXRpYyBpbnQgX19ibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCitzdGF0aWMgaW50IF9fYm1fY2hhbmdlX2JpdHNfdG8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywKIAl1bnNpZ25lZCBsb25nIGUsIGludCB2YWwpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBiaXRucjsKIAl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlX25yID0gLTFVOwpAQCAtMTQwMyw3ICsxMzkzLDcgQEAKIAlpbnQgY2hhbmdlZF90b3RhbCA9IDA7CiAKIAlpZiAoZSA+PSBiLT5ibV9iaXRzKSB7Ci0JCWRldl9lcnIoREVWLCAiQVNTRVJUIEZBSUxFRDogYml0X3M9JWx1IGJpdF9lPSVsdSBibV9iaXRzPSVsdVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQVNTRVJUIEZBSUxFRDogYml0X3M9JWx1IGJpdF9lPSVsdSBibV9iaXRzPSVsdVxuIiwKIAkJCQlzLCBlLCBiLT5ibV9iaXRzKTsKIAkJZSA9IGItPmJtX2JpdHMgPyBiLT5ibV9iaXRzIC0xIDogMDsKIAl9CkBAIC0xNDQxLDExICsxNDMxLDExIEBACiAgKiBmb3IgdmFsICE9IDAsIHdlIGNoYW5nZSAwIC0+IDEsIHJldHVybiBjb2RlIHBvc2l0aXZlCiAgKiBmb3IgdmFsID09IDAsIHdlIGNoYW5nZSAxIC0+IDAsIHJldHVybiBjb2RlIG5lZ2F0aXZlCiAgKiB3YW50cyBiaXRuciwgbm90IHNlY3RvciAqLwotc3RhdGljIGludCBibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCitzdGF0aWMgaW50IGJtX2NoYW5nZV9iaXRzX3RvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCiAJY29uc3QgdW5zaWduZWQgbG9uZyBlLCBpbnQgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBjID0gMDsKIAogCWlmICghZXhwZWN0KGIpKQpAQCAtMTQ1NSwyNCArMTQ0NSwyNCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmItPmJtX2xvY2ssIGZsYWdzKTsKIAlpZiAoKHZhbCA/IEJNX0RPTlRfU0VUIDogQk1fRE9OVF9DTEVBUikgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAotCWMgPSBfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIHZhbCk7CisJYyA9IF9fYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCB2YWwpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYi0+Ym1fbG9jaywgZmxhZ3MpOwogCXJldHVybiBjOwogfQogCiAvKiByZXR1cm5zIG51bWJlciBvZiBiaXRzIGNoYW5nZWQgMCAtPiAxICovCi1pbnQgZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKK2ludCBkcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKIHsKLQlyZXR1cm4gYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJcmV0dXJuIGJtX2NoYW5nZV9iaXRzX3RvKGRldmljZSwgcywgZSwgMSk7CiB9CiAKIC8qIHJldHVybnMgbnVtYmVyIG9mIGJpdHMgY2hhbmdlZCAxIC0+IDAgKi8KLWludCBkcmJkX2JtX2NsZWFyX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCitpbnQgZHJiZF9ibV9jbGVhcl9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nIHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZSkKIHsKLQlyZXR1cm4gLWJtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIDApOworCXJldHVybiAtYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCAwKTsKIH0KIAogLyogc2V0cyBhbGwgYml0cyBpbiBmdWxsIHdvcmRzLApAQCAtMTUwNCw3ICsxNDk0LDcgQEAKICAqIFlvdSBtdXN0IGZpcnN0IGRyYmRfYm1fbG9jaygpLgogICogQ2FuIGJlIGNhbGxlZCB0byBzZXQgdGhlIHdob2xlIGJpdG1hcCBpbiBvbmUgZ28uCiAgKiBTZXRzIGJpdHMgZnJvbSBzIHRvIGUgX2luY2x1c2l2ZV8uICovCi12b2lkIF9kcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKQordm9pZCBfZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCiB7CiAJLyogRmlyc3Qgc2V0X2JpdCBmcm9tIHRoZSBmaXJzdCBiaXQgKHMpCiAJICogdXAgdG8gdGhlIG5leHQgbG9uZyBib3VuZGFyeSAoc2wpLApAQCAtMTUxNCw3ICsxNTA0LDcgQEAKIAkgKiBEbyBub3QgdXNlIG1lbXNldCwgYmVjYXVzZSB3ZSBtdXN0IGFjY291bnQgZm9yIGNoYW5nZXMsCiAJICogc28gd2UgbmVlZCB0byBsb29wIG92ZXIgdGhlIHdvcmRzIHdpdGggaHdlaWdodCgpIGFueXdheXMuCiAJICovCi0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCXVuc2lnbmVkIGxvbmcgc2wgPSBBTElHTihzLEJJVFNfUEVSX0xPTkcpOwogCXVuc2lnbmVkIGxvbmcgZWwgPSAoZSsxKSAmIH4oKHVuc2lnbmVkIGxvbmcpQklUU19QRVJfTE9ORy0xKTsKIAlpbnQgZmlyc3RfcGFnZTsKQEAgLTE1MjYsNyArMTUxNiw3IEBACiAJaWYgKGUgLSBzIDw9IDMqQklUU19QRVJfTE9ORykgewogCQkvKiBkb24ndCBib3RoZXI7IGVsIGFuZCBzbCBtYXkgZXZlbiBiZSB3cm9uZy4gKi8KIAkJc3Bpbl9sb2NrX2lycSgmYi0+Ym1fbG9jayk7Ci0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJCV9fYm1fY2hhbmdlX2JpdHNfdG8oZGV2aWNlLCBzLCBlLCAxKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1MzcsNyArMTUyNyw3IEBACiAKIAkvKiBiaXRzIGZpbGxpbmcgdGhlIGN1cnJlbnQgbG9uZyAqLwogCWlmIChzbCkKLQkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBzLCBzbC0xLCAxKTsKKwkJX19ibV9jaGFuZ2VfYml0c190byhkZXZpY2UsIHMsIHNsLTEsIDEpOwogCiAJZmlyc3RfcGFnZSA9IHNsID4+ICgzICsgUEFHRV9TSElGVCk7CiAJbGFzdF9wYWdlID0gZWwgPj4gKDMgKyBQQUdFX1NISUZUKTsKQEAgLTE1NDksNyArMTUzOSw3IEBACiAKIAkvKiBmaXJzdCBhbmQgZnVsbCBwYWdlcywgdW5sZXNzIGZpcnN0IHBhZ2UgPT0gbGFzdCBwYWdlICovCiAJZm9yIChwYWdlX25yID0gZmlyc3RfcGFnZTsgcGFnZV9uciA8IGxhc3RfcGFnZTsgcGFnZV9ucisrKSB7Ci0JCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShtZGV2LT5iaXRtYXAsIHBhZ2VfbnIsIGZpcnN0X3dvcmQsIGxhc3Rfd29yZCk7CisJCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShkZXZpY2UtPmJpdG1hcCwgcGFnZV9uciwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWZpcnN0X3dvcmQgPSAwOwpAQCAtMTU2NSw3ICsxNTU1LDcgQEAKIAkgKiBhcyB3ZSBkaWQgbm90IGFsbG9jYXRlIGl0LCBpdCBpcyBub3QgcHJlc2VudCBpbiBiaXRtYXAtPmJtX3BhZ2VzLgogCSAqLwogCWlmIChsYXN0X3dvcmQpCi0JCWJtX3NldF9mdWxsX3dvcmRzX3dpdGhpbl9vbmVfcGFnZShtZGV2LT5iaXRtYXAsIGxhc3RfcGFnZSwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKKwkJYm1fc2V0X2Z1bGxfd29yZHNfd2l0aGluX29uZV9wYWdlKGRldmljZS0+Yml0bWFwLCBsYXN0X3BhZ2UsIGZpcnN0X3dvcmQsIGxhc3Rfd29yZCk7CiAKIAkvKiBwb3NzaWJseSB0cmFpbGluZyBiaXRzLgogCSAqIGV4YW1wbGU6IChlICYgNjMpID09IDYzLCBlbCB3aWxsIGJlIGUrMS4KQEAgLTE1NzMsNyArMTU2Myw3IEBACiAJICogaXQgd291bGQgdHJpZ2dlciBhbiBhc3NlcnQgaW4gX19ibV9jaGFuZ2VfYml0c190bygpCiAJICovCiAJaWYgKGVsIDw9IGUpCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgZWwsIGUsIDEpOworCQlfX2JtX2NoYW5nZV9iaXRzX3RvKGRldmljZSwgZWwsIGUsIDEpOwogCXNwaW5fdW5sb2NrX2lycSgmYi0+Ym1fbG9jayk7CiB9CiAKQEAgLTE1ODQsMTAgKzE1NzQsMTAgQEAKICAqICAwIC4uLiBiaXQgbm90IHNldAogICogLTEgLi4uIGZpcnN0IG91dCBvZiBib3VuZHMgYWNjZXNzLCBzdG9wIHRlc3RpbmcgZm9yIGJpdHMhCiAgKi8KLWludCBkcmJkX2JtX3Rlc3RfYml0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgYml0bnIpCitpbnQgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBiaXRucikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKKwlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBkZXZpY2UtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nICpwX2FkZHI7CiAJaW50IGk7CiAKQEAgLTE1OTgsNyArMTU4OCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYi0+Ym1fbG9jaywgZmxhZ3MpOwogCWlmIChCTV9ET05UX1RFU1QgJiBiLT5ibV9mbGFncykKLQkJYm1fcHJpbnRfbG9ja19pbmZvKG1kZXYpOworCQlibV9wcmludF9sb2NrX2luZm8oZGV2aWNlKTsKIAlpZiAoYml0bnIgPCBiLT5ibV9iaXRzKSB7CiAJCXBfYWRkciA9IGJtX21hcF9waWR4KGIsIGJtX2JpdF90b19wYWdlX2lkeChiLCBiaXRucikpOwogCQlpID0gdGVzdF9iaXRfbGUoYml0bnIgJiBCSVRTX1BFUl9QQUdFX01BU0ssIHBfYWRkcikgPyAxIDogMDsKQEAgLTE2MDYsNyArMTU5Niw3IEBACiAJfSBlbHNlIGlmIChiaXRuciA9PSBiLT5ibV9iaXRzKSB7CiAJCWkgPSAtMTsKIAl9IGVsc2UgeyAvKiAoYml0bnIgPiBiLT5ibV9iaXRzKSAqLwotCQlkZXZfZXJyKERFViwgImJpdG5yPSVsdSA+IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CisJCWRyYmRfZXJyKGRldmljZSwgImJpdG5yPSVsdSA+IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CiAJCWkgPSAwOwogCX0KIApAQCAtMTYxNSwxMCArMTYwNSwxMCBAQAogfQogCiAvKiByZXR1cm5zIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgcmFuZ2UgW3MsIGVdICovCi1pbnQgZHJiZF9ibV9jb3VudF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKQoraW50IGRyYmRfYm1fY291bnRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CisJc3RydWN0IGRyYmRfYml0bWFwICpiID0gZGV2aWNlLT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyAqcF9hZGRyID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGJpdG5yOwogCXVuc2lnbmVkIGludCBwYWdlX25yID0gLTFVOwpAQCAtMTYzNSw3ICsxNjI1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJaWYgKEJNX0RPTlRfVEVTVCAmIGItPmJtX2ZsYWdzKQotCQlibV9wcmludF9sb2NrX2luZm8obWRldik7CisJCWJtX3ByaW50X2xvY2tfaW5mbyhkZXZpY2UpOwogCWZvciAoYml0bnIgPSBzOyBiaXRuciA8PSBlOyBiaXRucisrKSB7CiAJCXVuc2lnbmVkIGludCBpZHggPSBibV9iaXRfdG9fcGFnZV9pZHgoYiwgYml0bnIpOwogCQlpZiAocGFnZV9uciAhPSBpZHgpIHsKQEAgLTE2NDcsNyArMTYzNyw3IEBACiAJCWlmIChleHBlY3QoYml0bnIgPCBiLT5ibV9iaXRzKSkKIAkJCWMgKz0gKDAgIT0gdGVzdF9iaXRfbGUoYml0bnIgLSAocGFnZV9uciA8PCAoUEFHRV9TSElGVCszKSksIHBfYWRkcikpOwogCQllbHNlCi0JCQlkZXZfZXJyKERFViwgImJpdG5yPSVsdSBibV9iaXRzPSVsdVxuIiwgYml0bnIsIGItPmJtX2JpdHMpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiYml0bnI9JWx1IGJtX2JpdHM9JWx1XG4iLCBiaXRuciwgYi0+Ym1fYml0cyk7CiAJfQogCWlmIChwX2FkZHIpCiAJCWJtX3VubWFwKHBfYWRkcik7CkBAIC0xNjcwLDkgKzE2NjAsOSBAQAogICogcmVmZXJlbmNlIGNvdW50IG9mIHNvbWUgYml0bWFwIGV4dGVudCBlbGVtZW50IGZyb20gc29tZSBscnUgaW5zdGVhZC4uLgogICoKICAqLwotaW50IGRyYmRfYm1fZV93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBlbnIpCitpbnQgZHJiZF9ibV9lX3dlaWdodChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBlbnIpCiB7Ci0Jc3RydWN0IGRyYmRfYml0bWFwICpiID0gbWRldi0+Yml0bWFwOworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IGRldmljZS0+Yml0bWFwOwogCWludCBjb3VudCwgcywgZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgKnBfYWRkciwgKmJtOwpAQCAtMTY4NCw3ICsxNjc0LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJaWYgKEJNX0RPTlRfVEVTVCAmIGItPmJtX2ZsYWdzKQotCQlibV9wcmludF9sb2NrX2luZm8obWRldik7CisJCWJtX3ByaW50X2xvY2tfaW5mbyhkZXZpY2UpOwogCiAJcyA9IFMyVyhlbnIpOwogCWUgPSBtaW4oKHNpemVfdClTMlcoZW5yKzEpLCBiLT5ibV93b3Jkcyk7CkBAIC0xNjk3LDcgKzE2ODcsNyBAQAogCQkJY291bnQgKz0gaHdlaWdodF9sb25nKCpibSsrKTsKIAkJYm1fdW5tYXAocF9hZGRyKTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKERFViwgInN0YXJ0IG9mZnNldCAoJWQpIHRvbyBsYXJnZSBpbiBkcmJkX2JtX2Vfd2VpZ2h0XG4iLCBzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAic3RhcnQgb2Zmc2V0ICglZCkgdG9vIGxhcmdlIGluIGRyYmRfYm1fZV93ZWlnaHRcbiIsIHMpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiLT5ibV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAppbmRleCAwZTA2ZjBjLi5lNzA5M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaApAQCAtNDUsNyArNDUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvZHJiZF9nZW5sX2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RyYmQuaD4KKyNpbmNsdWRlICJkcmJkX3N0cmluZ3MuaCIKICNpbmNsdWRlICJkcmJkX3N0YXRlLmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogCiAjaWZkZWYgX19DSEVDS0VSX18KICMgZGVmaW5lIF9fcHJvdGVjdGVkX2J5KHgpICAgICAgIF9fYXR0cmlidXRlX18oKHJlcXVpcmVfY29udGV4dCh4LDEsOTk5LCJyZHdyIikpKQpAQCAtNjUsNiArNjcsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBtaW5vcl9jb3VudDsKIGV4dGVybiBib29sIGRpc2FibGVfc2VuZHBhZ2U7CiBleHRlcm4gYm9vbCBhbGxvd19vb3M7Cit2b2lkIHRsX2Fib3J0X2Rpc2tfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogCiAjaWZkZWYgQ09ORklHX0RSQkRfRkFVTFRfSU5KRUNUSU9OCiBleHRlcm4gaW50IGVuYWJsZV9mYXVsdHM7CkBAIC05NSwyNSArOTgsNjAgQEAKIAogI2RlZmluZSBVVUlEX05FV19CTV9PRkZTRVQgKCh1NjQpMHgwMDAxMDAwMDAwMDAwMDAwVUxMKQogCi1zdHJ1Y3QgZHJiZF9jb25mOwotc3RydWN0IGRyYmRfdGNvbm47CitzdHJ1Y3QgZHJiZF9kZXZpY2U7CitzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uOwogCisjZGVmaW5lIF9fZHJiZF9wcmludGtfZGV2aWNlKGxldmVsLCBkZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWRldl9wcmludGsobGV2ZWwsIGRpc2tfdG9fZGV2KChkZXZpY2UpLT52ZGlzayksIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgX19kcmJkX3ByaW50a19wZWVyX2RldmljZShsZXZlbCwgcGVlcl9kZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWRldl9wcmludGsobGV2ZWwsIGRpc2tfdG9fZGV2KChwZWVyX2RldmljZSktPmRldmljZS0+dmRpc2spLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIF9fZHJiZF9wcmludGtfcmVzb3VyY2UobGV2ZWwsIHJlc291cmNlLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsobGV2ZWwgImRyYmQgJXM6ICIgZm10LCAocmVzb3VyY2UpLT5uYW1lLCAjIyBhcmdzKQorI2RlZmluZSBfX2RyYmRfcHJpbnRrX2Nvbm5lY3Rpb24obGV2ZWwsIGNvbm5lY3Rpb24sIGZtdCwgYXJncy4uLikgXAorCXByaW50ayhsZXZlbCAiZHJiZCAlczogIiBmbXQsIChjb25uZWN0aW9uKS0+cmVzb3VyY2UtPm5hbWUsICMjIGFyZ3MpCiAKLS8qIHRvIHNob3J0ZW4gZGV2X3dhcm4oREVWLCAibXNnIik7IGFuZCByZWxhdGl2ZXMgc3RhdGVtZW50cyAqLwotI2RlZmluZSBERVYgKGRpc2tfdG9fZGV2KG1kZXYtPnZkaXNrKSkKK3ZvaWQgZHJiZF9wcmludGtfd2l0aF93cm9uZ19vYmplY3RfdHlwZSh2b2lkKTsKIAotI2RlZmluZSBjb25uX3ByaW50ayhMRVZFTCwgVENPTk4sIEZNVCwgQVJHUy4uLikgXAotCXByaW50ayhMRVZFTCAiZC1jb24gJXM6ICIgRk1ULCBUQ09OTi0+bmFtZSAsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fYWxlcnQoVENPTk4sIEZNVCwgQVJHUy4uLikgIGNvbm5fcHJpbnRrKEtFUk5fQUxFUlQsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fY3JpdChUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fQ1JJVCwgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9lcnIoVENPTk4sIEZNVCwgQVJHUy4uLikgICAgY29ubl9wcmludGsoS0VSTl9FUlIsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5fd2FybihUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fV0FSTklORywgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9ub3RpY2UoVENPTk4sIEZNVCwgQVJHUy4uLikgY29ubl9wcmludGsoS0VSTl9OT1RJQ0UsIFRDT05OLCBGTVQsICMjIEFSR1MpCi0jZGVmaW5lIGNvbm5faW5mbyhUQ09OTiwgRk1ULCBBUkdTLi4uKSAgIGNvbm5fcHJpbnRrKEtFUk5fSU5GTywgVENPTk4sIEZNVCwgIyMgQVJHUykKLSNkZWZpbmUgY29ubl9kYmcoVENPTk4sIEZNVCwgQVJHUy4uLikgICAgY29ubl9wcmludGsoS0VSTl9ERUJVRywgVENPTk4sIEZNVCwgIyMgQVJHUykKKyNkZWZpbmUgX19kcmJkX3ByaW50a19pZl9zYW1lX3R5cGUob2JqLCB0eXBlLCBmdW5jLCBsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJKF9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AodHlwZW9mKG9iaiksIHR5cGUpIHx8IFwKKwkgX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCh0eXBlb2Yob2JqKSwgY29uc3QgdHlwZSkpLCBcCisJZnVuYyhsZXZlbCwgKGNvbnN0IHR5cGUpKG9iaiksIGZtdCwgIyMgYXJncykKIAotI2RlZmluZSBEX0FTU0VSVChleHApCWlmICghKGV4cCkpIFwKLQkgZGV2X2VycihERVYsICJBU1NFUlQoICIgI2V4cCAiICkgaW4gJXM6JWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgZHJiZF9wcmludGsobGV2ZWwsIG9iaiwgZm10LCBhcmdzLi4uKSBcCisJX19idWlsdGluX2Nob29zZV9leHByKCBcCisJICBfX2RyYmRfcHJpbnRrX2lmX3NhbWVfdHlwZShvYmosIHN0cnVjdCBkcmJkX2RldmljZSAqLCBcCisJCQkgICAgIF9fZHJiZF9wcmludGtfZGV2aWNlLCBsZXZlbCwgZm10LCAjIyBhcmdzKSwgXAorCSAgX19idWlsdGluX2Nob29zZV9leHByKCBcCisJICAgIF9fZHJiZF9wcmludGtfaWZfc2FtZV90eXBlKG9iaiwgc3RydWN0IGRyYmRfcmVzb3VyY2UgKiwgXAorCQkJICAgICAgIF9fZHJiZF9wcmludGtfcmVzb3VyY2UsIGxldmVsLCBmbXQsICMjIGFyZ3MpLCBcCisJICAgIF9fYnVpbHRpbl9jaG9vc2VfZXhwciggXAorCSAgICAgIF9fZHJiZF9wcmludGtfaWZfc2FtZV90eXBlKG9iaiwgc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqLCBcCisJCQkJIF9fZHJiZF9wcmludGtfY29ubmVjdGlvbiwgbGV2ZWwsIGZtdCwgIyMgYXJncyksIFwKKwkgICAgICBfX2J1aWx0aW5fY2hvb3NlX2V4cHIoIFwKKwkJX19kcmJkX3ByaW50a19pZl9zYW1lX3R5cGUob2JqLCBzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBcCisJCQkJIF9fZHJiZF9wcmludGtfcGVlcl9kZXZpY2UsIGxldmVsLCBmbXQsICMjIGFyZ3MpLCBcCisJCWRyYmRfcHJpbnRrX3dpdGhfd3Jvbmdfb2JqZWN0X3R5cGUoKSkpKSkKKworI2RlZmluZSBkcmJkX2RiZyhvYmosIGZtdCwgYXJncy4uLikgXAorCWRyYmRfcHJpbnRrKEtFUk5fREVCVUcsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2FsZXJ0KG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9BTEVSVCwgb2JqLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIGRyYmRfZXJyKG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9FUlIsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX3dhcm4ob2JqLCBmbXQsIGFyZ3MuLi4pIFwKKwlkcmJkX3ByaW50ayhLRVJOX1dBUk5JTkcsIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2luZm8ob2JqLCBmbXQsIGFyZ3MuLi4pIFwKKwlkcmJkX3ByaW50ayhLRVJOX0lORk8sIG9iaiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBkcmJkX2VtZXJnKG9iaiwgZm10LCBhcmdzLi4uKSBcCisJZHJiZF9wcmludGsoS0VSTl9FTUVSRywgb2JqLCBmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgZHluYW1pY19kcmJkX2RiZyhkZXZpY2UsIGZtdCwgYXJncy4uLikgXAorCWR5bmFtaWNfZGV2X2RiZyhkaXNrX3RvX2RldihkZXZpY2UtPnZkaXNrKSwgZm10LCAjIyBhcmdzKQorCisjZGVmaW5lIERfQVNTRVJUKGRldmljZSwgZXhwKQlkbyB7IFwKKwlpZiAoIShleHApKSBcCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCggIiAjZXhwICIgKSBpbiAlczolZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCX0gd2hpbGUgKDApCiAKIC8qKgogICogZXhwZWN0ICAtICBNYWtlIGFuIGFzc2VydGlvbgpAQCAtMTIzLDcgKzE2MSw3IEBACiAjZGVmaW5lIGV4cGVjdChleHApICh7CQkJCQkJCQlcCiAJCWJvb2wgX2Jvb2wgPSAoZXhwKTsJCQkJCQlcCiAJCWlmICghX2Jvb2wpCQkJCQkJCVwKLQkJCWRldl9lcnIoREVWLCAiQVNTRVJUSU9OICVzIEZBSUxFRCBpbiAlc1xuIiwJCVwKKwkJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVElPTiAlcyBGQUlMRUQgaW4gJXNcbiIsCQlcCiAJCQkgICAgICAgICNleHAsIF9fZnVuY19fKTsJCQkJXAogCQlfYm9vbDsJCQkJCQkJCVwKIAkJfSkKQEAgLTE0NSwxNCArMTgzLDE0IEBACiB9OwogCiBleHRlcm4gdW5zaWduZWQgaW50Ci1fZHJiZF9pbnNlcnRfZmF1bHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IHR5cGUpOworX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgdHlwZSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1kcmJkX2luc2VydF9mYXVsdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSkgeworZHJiZF9pbnNlcnRfZmF1bHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCB0eXBlKSB7CiAjaWZkZWYgQ09ORklHX0RSQkRfRkFVTFRfSU5KRUNUSU9OCiAJcmV0dXJuIGZhdWx0X3JhdGUgJiYKIAkJKGVuYWJsZV9mYXVsdHMgJiAoMTw8dHlwZSkpICYmCi0JCV9kcmJkX2luc2VydF9mYXVsdChtZGV2LCB0eXBlKTsKKwkJX2RyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgdHlwZSk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC0xNjQsNzQgKzIwMiw4IEBACiAjZGVmaW5lIGRpdl9mbG9vcihBLCBCKSAoKEEpLyhCKSkKIAogZXh0ZXJuIHN0cnVjdCByYXRlbGltaXRfc3RhdGUgZHJiZF9yYXRlbGltaXRfc3RhdGU7Ci1leHRlcm4gc3RydWN0IGlkciBtaW5vcnM7IC8qIFJDVSwgdXBkYXRlczogZ2VubF9sb2NrKCkgKi8KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRyYmRfdGNvbm5zOyAvKiBSQ1UsIHVwZGF0ZXM6IGdlbmxfbG9jaygpICovCi0KLS8qIG9uIHRoZSB3aXJlICovCi1lbnVtIGRyYmRfcGFja2V0IHsKLQkvKiByZWNlaXZlciAoZGF0YSBzb2NrZXQpICovCi0JUF9EQVRBCQkgICAgICA9IDB4MDAsCi0JUF9EQVRBX1JFUExZCSAgICAgID0gMHgwMSwgLyogUmVzcG9uc2UgdG8gUF9EQVRBX1JFUVVFU1QgKi8KLQlQX1JTX0RBVEFfUkVQTFkJICAgICAgPSAweDAyLCAvKiBSZXNwb25zZSB0byBQX1JTX0RBVEFfUkVRVUVTVCAqLwotCVBfQkFSUklFUgkgICAgICA9IDB4MDMsCi0JUF9CSVRNQVAJICAgICAgPSAweDA0LAotCVBfQkVDT01FX1NZTkNfVEFSR0VUICA9IDB4MDUsCi0JUF9CRUNPTUVfU1lOQ19TT1VSQ0UgID0gMHgwNiwKLQlQX1VOUExVR19SRU1PVEUJICAgICAgPSAweDA3LCAvKiBVc2VkIGF0IHZhcmlvdXMgdGltZXMgdG8gaGludCB0aGUgcGVlciAqLwotCVBfREFUQV9SRVFVRVNUCSAgICAgID0gMHgwOCwgLyogVXNlZCB0byBhc2sgZm9yIGEgZGF0YSBibG9jayAqLwotCVBfUlNfREFUQV9SRVFVRVNUICAgICA9IDB4MDksIC8qIFVzZWQgdG8gYXNrIGZvciBhIGRhdGEgYmxvY2sgZm9yIHJlc3luYyAqLwotCVBfU1lOQ19QQVJBTQkgICAgICA9IDB4MGEsCi0JUF9QUk9UT0NPTAkgICAgICA9IDB4MGIsCi0JUF9VVUlEUwkJICAgICAgPSAweDBjLAotCVBfU0laRVMJCSAgICAgID0gMHgwZCwKLQlQX1NUQVRFCQkgICAgICA9IDB4MGUsCi0JUF9TWU5DX1VVSUQJICAgICAgPSAweDBmLAotCVBfQVVUSF9DSEFMTEVOR0UgICAgICA9IDB4MTAsCi0JUF9BVVRIX1JFU1BPTlNFCSAgICAgID0gMHgxMSwKLQlQX1NUQVRFX0NIR19SRVEJICAgICAgPSAweDEyLAotCi0JLyogYXNlbmRlciAobWV0YSBzb2NrZXQgKi8KLQlQX1BJTkcJCSAgICAgID0gMHgxMywKLQlQX1BJTkdfQUNLCSAgICAgID0gMHgxNCwKLQlQX1JFQ1ZfQUNLCSAgICAgID0gMHgxNSwgLyogVXNlZCBpbiBwcm90b2NvbCBCICovCi0JUF9XUklURV9BQ0sJICAgICAgPSAweDE2LCAvKiBVc2VkIGluIHByb3RvY29sIEMgKi8KLQlQX1JTX1dSSVRFX0FDSwkgICAgICA9IDB4MTcsIC8qIElzIGEgUF9XUklURV9BQ0ssIGFkZGl0aW9uYWxseSBjYWxsIHNldF9pbl9zeW5jKCkuICovCi0JUF9TVVBFUlNFREVECSAgICAgID0gMHgxOCwgLyogVXNlZCBpbiBwcm90byBDLCB0d28tcHJpbWFyaWVzIGNvbmZsaWN0IGRldGVjdGlvbiAqLwotCVBfTkVHX0FDSwkgICAgICA9IDB4MTksIC8qIFNlbnQgaWYgbG9jYWwgZGlzayBpcyB1bnVzYWJsZSAqLwotCVBfTkVHX0RSRVBMWQkgICAgICA9IDB4MWEsIC8qIExvY2FsIGRpc2sgaXMgYnJva2VuLi4uICovCi0JUF9ORUdfUlNfRFJFUExZCSAgICAgID0gMHgxYiwgLyogTG9jYWwgZGlzayBpcyBicm9rZW4uLi4gKi8KLQlQX0JBUlJJRVJfQUNLCSAgICAgID0gMHgxYywKLQlQX1NUQVRFX0NIR19SRVBMWSAgICAgPSAweDFkLAotCi0JLyogIm5ldyIgY29tbWFuZHMsIG5vIGxvbmdlciBmaXR0aW5nIGludG8gdGhlIG9yZGVyaW5nIHNjaGVtZSBhYm92ZSAqLwotCi0JUF9PVl9SRVFVRVNUCSAgICAgID0gMHgxZSwgLyogZGF0YSBzb2NrZXQgKi8KLQlQX09WX1JFUExZCSAgICAgID0gMHgxZiwKLQlQX09WX1JFU1VMVAkgICAgICA9IDB4MjAsIC8qIG1ldGEgc29ja2V0ICovCi0JUF9DU1VNX1JTX1JFUVVFU1QgICAgID0gMHgyMSwgLyogZGF0YSBzb2NrZXQgKi8KLQlQX1JTX0lTX0lOX1NZTkMJICAgICAgPSAweDIyLCAvKiBtZXRhIHNvY2tldCAqLwotCVBfU1lOQ19QQVJBTTg5CSAgICAgID0gMHgyMywgLyogZGF0YSBzb2NrZXQsIHByb3RvY29sIHZlcnNpb24gODkgcmVwbGFjZW1lbnQgZm9yIFBfU1lOQ19QQVJBTSAqLwotCVBfQ09NUFJFU1NFRF9CSVRNQVAgICA9IDB4MjQsIC8qIGNvbXByZXNzZWQgb3Igb3RoZXJ3aXNlIGVuY29kZWQgYml0bWFwIHRyYW5zZmVyICovCi0JLyogUF9DS1BUX0ZFTkNFX1JFUSAgICAgID0gMHgyNSwgKiBjdXJyZW50bHkgcmVzZXJ2ZWQgZm9yIHByb3RvY29sIEQgKi8KLQkvKiBQX0NLUFRfRElTQUJMRV9SRVEgICAgPSAweDI2LCAqIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgcHJvdG9jb2wgRCAqLwotCVBfREVMQVlfUFJPQkUgICAgICAgICA9IDB4MjcsIC8qIGlzIHVzZWQgb24gQk9USCBzb2NrZXRzICovCi0JUF9PVVRfT0ZfU1lOQyAgICAgICAgID0gMHgyOCwgLyogTWFyayBhcyBvdXQgb2Ygc3luYyAoT3V0cnVubmluZyksIGRhdGEgc29ja2V0ICovCi0JUF9SU19DQU5DRUwgICAgICAgICAgID0gMHgyOSwgLyogbWV0YTogVXNlZCB0byBjYW5jZWwgUlNfREFUQV9SRVFVRVNUIHBhY2tldCBieSBTeW5jU291cmNlICovCi0JUF9DT05OX1NUX0NIR19SRVEgICAgID0gMHgyYSwgLyogZGF0YSBzb2NrOiBDb25uZWN0aW9uIHdpZGUgc3RhdGUgcmVxdWVzdCAqLwotCVBfQ09OTl9TVF9DSEdfUkVQTFkgICA9IDB4MmIsIC8qIG1ldGEgc29jazogQ29ubmVjdGlvbiBzaWRlIHN0YXRlIHJlcSByZXBseSAqLwotCVBfUkVUUllfV1JJVEUJICAgICAgPSAweDJjLCAvKiBQcm90b2NvbCBDOiByZXRyeSBjb25mbGljdGluZyB3cml0ZSByZXF1ZXN0ICovCi0JUF9QUk9UT0NPTF9VUERBVEUgICAgID0gMHgyZCwgLyogZGF0YSBzb2NrOiBpcyB1c2VkIGluIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zICovCi0KLQlQX01BWV9JR05PUkUJICAgICAgPSAweDEwMCwgLyogRmxhZyB0byB0ZXN0IGlmIChjbWQgPiBQX01BWV9JR05PUkUpIC4uLiAqLwotCVBfTUFYX09QVF9DTUQJICAgICAgPSAweDEwMSwKLQotCS8qIHNwZWNpYWwgY29tbWFuZCBpZHMgZm9yIGhhbmRzaGFrZSAqLwotCi0JUF9JTklUSUFMX01FVEEJICAgICAgPSAweGZmZjEsIC8qIEZpcnN0IFBhY2tldCBvbiB0aGUgTWV0YVNvY2sgKi8KLQlQX0lOSVRJQUxfREFUQQkgICAgICA9IDB4ZmZmMiwgLyogRmlyc3QgUGFja2V0IG9uIHRoZSBTb2NrZXQgKi8KLQotCVBfQ09OTkVDVElPTl9GRUFUVVJFUyA9IDB4ZmZmZQkvKiBGSVhFRCBmb3IgdGhlIG5leHQgY2VudHVyeSEgKi8KLX07CitleHRlcm4gc3RydWN0IGlkciBkcmJkX2RldmljZXM7IC8qIFJDVSwgdXBkYXRlczogZ2VubF9sb2NrKCkgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRyYmRfcmVzb3VyY2VzOyAvKiBSQ1UsIHVwZGF0ZXM6IGdlbmxfbG9jaygpICovCiAKIGV4dGVybiBjb25zdCBjaGFyICpjbWRuYW1lKGVudW0gZHJiZF9wYWNrZXQgY21kKTsKIApAQCAtMjUzLDcgKzIyNSw3IEBACiAJdW5zaWduZWQgYnl0ZXNbMl07CiB9OwogCi1leHRlcm4gdm9pZCBJTkZPX2JtX3hmZXJfc3RhdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2V4dGVybiB2b2lkIElORk9fYm1feGZlcl9zdGF0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJY29uc3QgY2hhciAqZGlyZWN0aW9uLCBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYm1feGZlcl9jdHhfYml0X3RvX3dvcmRfb2Zmc2V0KHN0cnVjdCBibV94ZmVyX2N0eCAqYykKQEAgLTI3NSwyMzMgKzI0Nyw3IEBACiAjZW5kaWYKIH0KIAotI2lmbmRlZiBfX3BhY2tlZAotI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBmb3IgYSBwYWNrZXQgb24gdGhlIHdpcmUuCi0gKiBUaGUgYnl0ZW9yZGVyIGlzIHRoZSBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKiAgICAgKGV4Y2VwdCBibG9ja19pZCBhbmQgYmFycmllciBmaWVsZHMuCi0gKgl0aGVzZSBhcmUgcG9pbnRlcnMgdG8gbG9jYWwgc3RydWN0cwotICoJYW5kIGhhdmUgbm8gcmVsZXZhbmNlIGZvciB0aGUgcGFydG5lciwKLSAqCXdoaWNoIGp1c3QgZWNob2VzIHRoZW0gYXMgcmVjZWl2ZWQuKQotICoKLSAqIE5PVEUgdGhhdCB0aGUgcGF5bG9hZCBzdGFydHMgYXQgYSBsb25nIGFsaWduZWQgb2Zmc2V0LAotICogcmVnYXJkbGVzcyBvZiAzMiBvciA2NCBiaXQgYXJjaCEKLSAqLwotc3RydWN0IHBfaGVhZGVyODAgewotCXUzMgkgIG1hZ2ljOwotCXUxNgkgIGNvbW1hbmQ7Ci0JdTE2CSAgbGVuZ3RoOwkvKiBieXRlcyBvZiBkYXRhIGFmdGVyIHRoaXMgaGVhZGVyICovCi19IF9fcGFja2VkOwotCi0vKiBIZWFkZXIgZm9yIGJpZyBwYWNrZXRzLCBVc2VkIGZvciBkYXRhIHBhY2tldHMgZXhjZWVkaW5nIDY0a0IgKi8KLXN0cnVjdCBwX2hlYWRlcjk1IHsKLQl1MTYJICBtYWdpYzsJLyogdXNlIERSQkRfTUFHSUNfQklHIGhlcmUgKi8KLQl1MTYJICBjb21tYW5kOwotCXUzMgkgIGxlbmd0aDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2hlYWRlcjEwMCB7Ci0JdTMyCSAgbWFnaWM7Ci0JdTE2CSAgdm9sdW1lOwotCXUxNgkgIGNvbW1hbmQ7Ci0JdTMyCSAgbGVuZ3RoOwotCXUzMgkgIHBhZDsKLX0gX19wYWNrZWQ7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotCi0vKiB0aGVzZSBkZWZpbmVzIG11c3Qgbm90IGJlIGNoYW5nZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgcHJvdG9jb2wgdmVyc2lvbiAqLwotI2RlZmluZSBEUF9IQVJEQkFSUklFUgkgICAgICAxIC8qIGRlcHJpY2F0ZWQgKi8KLSNkZWZpbmUgRFBfUldfU1lOQwkgICAgICAyIC8qIGVxdWFscyBSRVFfU1lOQyAgICAqLwotI2RlZmluZSBEUF9NQVlfU0VUX0lOX1NZTkMgICAgNAotI2RlZmluZSBEUF9VTlBMVUcgICAgICAgICAgICAgOCAvKiBub3QgdXNlZCBhbnltb3JlICAgKi8KLSNkZWZpbmUgRFBfRlVBICAgICAgICAgICAgICAgMTYgLyogZXF1YWxzIFJFUV9GVUEgICAgICovCi0jZGVmaW5lIERQX0ZMVVNIICAgICAgICAgICAgIDMyIC8qIGVxdWFscyBSRVFfRkxVU0ggICAqLwotI2RlZmluZSBEUF9ESVNDQVJEICAgICAgICAgICA2NCAvKiBlcXVhbHMgUkVRX0RJU0NBUkQgKi8KLSNkZWZpbmUgRFBfU0VORF9SRUNFSVZFX0FDSyAxMjggLyogVGhpcyBpcyBhIHByb3RvIEIgd3JpdGUgcmVxdWVzdCAqLwotI2RlZmluZSBEUF9TRU5EX1dSSVRFX0FDSyAgIDI1NiAvKiBUaGlzIGlzIGEgcHJvdG8gQyB3cml0ZSByZXF1ZXN0ICovCi0KLXN0cnVjdCBwX2RhdGEgewotCXU2NAkgICAgc2VjdG9yOyAgICAvKiA2NCBiaXRzIHNlY3RvciBudW1iZXIgKi8KLQl1NjQJICAgIGJsb2NrX2lkOyAgLyogdG8gaWRlbnRpZnkgdGhlIHJlcXVlc3QgaW4gcHJvdG9jb2wgQiZDICovCi0JdTMyCSAgICBzZXFfbnVtOwotCXUzMgkgICAgZHBfZmxhZ3M7Ci19IF9fcGFja2VkOwotCi0vKgotICogY29tbWFuZHMgd2hpY2ggc2hhcmUgYSBzdHJ1Y3Q6Ci0gKiAgcF9ibG9ja19hY2s6Ci0gKiAgIFBfUkVDVl9BQ0sgKHByb3RvIEIpLCBQX1dSSVRFX0FDSyAocHJvdG8gQyksCi0gKiAgIFBfU1VQRVJTRURFRCAocHJvdG8gQywgdHdvLXByaW1hcmllcyBjb25mbGljdCBkZXRlY3Rpb24pCi0gKiAgcF9ibG9ja19yZXE6Ci0gKiAgIFBfREFUQV9SRVFVRVNULCBQX1JTX0RBVEFfUkVRVUVTVAotICovCi1zdHJ1Y3QgcF9ibG9ja19hY2sgewotCXU2NAkgICAgc2VjdG9yOwotCXU2NAkgICAgYmxvY2tfaWQ7Ci0JdTMyCSAgICBibGtzaXplOwotCXUzMgkgICAgc2VxX251bTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2Jsb2NrX3JlcSB7Ci0JdTY0IHNlY3RvcjsKLQl1NjQgYmxvY2tfaWQ7Ci0JdTMyIGJsa3NpemU7Ci0JdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCi19IF9fcGFja2VkOwotCi0vKgotICogY29tbWFuZHMgd2l0aCB0aGVpciBvd24gc3RydWN0IGZvciBhZGRpdGlvbmFsIGZpZWxkczoKLSAqICAgUF9DT05ORUNUSU9OX0ZFQVRVUkVTCi0gKiAgIFBfQkFSUklFUgotICogICBQX0JBUlJJRVJfQUNLCi0gKiAgIFBfU1lOQ19QQVJBTQotICogICBSZXBvcnRQYXJhbXMKLSAqLwotCi1zdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzIHsKLQl1MzIgcHJvdG9jb2xfbWluOwotCXUzMiBmZWF0dXJlX2ZsYWdzOwotCXUzMiBwcm90b2NvbF9tYXg7Ci0KLQkvKiBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCBmb3IgZnV0dXJlIGVuaGFuY2VtZW50cwotCSAqIGZvciBub3csIGZlYXR1cmVfZmxhZ3MgYW5kIHRoZSByZXNlcnZlZCBhcnJheSBzaGFsbCBiZSB6ZXJvLgotCSAqLwotCi0JdTMyIF9wYWQ7Ci0JdTY0IHJlc2VydmVkWzddOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHBfYmFycmllciB7Ci0JdTMyIGJhcnJpZXI7CS8qIGJhcnJpZXIgbnVtYmVyIF9oYW5kbGVfIG9ubHkgKi8KLQl1MzIgcGFkOwkvKiB0byBtdWx0aXBsZSBvZiA4IEJ5dGUgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2JhcnJpZXJfYWNrIHsKLQl1MzIgYmFycmllcjsKLQl1MzIgc2V0X3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yc19wYXJhbSB7Ci0JdTMyIHJlc3luY19yYXRlOwotCi0JICAgICAgLyogU2luY2UgcHJvdG9jb2wgdmVyc2lvbiA4OCBhbmQgaGlnaGVyLiAqLwotCWNoYXIgdmVyaWZ5X2FsZ1swXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3JzX3BhcmFtXzg5IHsKLQl1MzIgcmVzeW5jX3JhdGU7Ci0gICAgICAgIC8qIHByb3RvY29sIHZlcnNpb24gODk6ICovCi0JY2hhciB2ZXJpZnlfYWxnW1NIQVJFRF9TRUNSRVRfTUFYXTsKLQljaGFyIGNzdW1zX2FsZ1tTSEFSRURfU0VDUkVUX01BWF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yc19wYXJhbV85NSB7Ci0JdTMyIHJlc3luY19yYXRlOwotCWNoYXIgdmVyaWZ5X2FsZ1tTSEFSRURfU0VDUkVUX01BWF07Ci0JY2hhciBjc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOwotCXUzMiBjX3BsYW5fYWhlYWQ7Ci0JdTMyIGNfZGVsYXlfdGFyZ2V0OwotCXUzMiBjX2ZpbGxfdGFyZ2V0OwotCXUzMiBjX21heF9yYXRlOwotfSBfX3BhY2tlZDsKLQotZW51bSBkcmJkX2Nvbm5fZmxhZ3MgewotCUNGX0RJU0NBUkRfTVlfREFUQSA9IDEsCi0JQ0ZfRFJZX1JVTiA9IDIsCi19OwotCi1zdHJ1Y3QgcF9wcm90b2NvbCB7Ci0JdTMyIHByb3RvY29sOwotCXUzMiBhZnRlcl9zYl8wcDsKLQl1MzIgYWZ0ZXJfc2JfMXA7Ci0JdTMyIGFmdGVyX3NiXzJwOwotCXUzMiBjb25uX2ZsYWdzOwotCXUzMiB0d29fcHJpbWFyaWVzOwotCi0gICAgICAgICAgICAgIC8qIFNpbmNlIHByb3RvY29sIHZlcnNpb24gODcgYW5kIGhpZ2hlci4gKi8KLQljaGFyIGludGVncml0eV9hbGdbMF07Ci0KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3V1aWRzIHsKLQl1NjQgdXVpZFtVSV9FWFRFTkRFRF9TSVpFXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3JzX3V1aWQgewotCXU2NAkgICAgdXVpZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3NpemVzIHsKLQl1NjQJICAgIGRfc2l6ZTsgIC8qIHNpemUgb2YgZGlzayAqLwotCXU2NAkgICAgdV9zaXplOyAgLyogdXNlciByZXF1ZXN0ZWQgc2l6ZSAqLwotCXU2NAkgICAgY19zaXplOyAgLyogY3VycmVudCBleHBvcnRlZCBzaXplICovCi0JdTMyCSAgICBtYXhfYmlvX3NpemU7ICAvKiBNYXhpbWFsIHNpemUgb2YgYSBCSU8gKi8KLQl1MTYJICAgIHF1ZXVlX29yZGVyX3R5cGU7ICAvKiBub3QgeWV0IGltcGxlbWVudGVkIGluIERSQkQqLwotCXUxNgkgICAgZGRzX2ZsYWdzOyAvKiB1c2UgZW51bSBkZHNfZmxhZ3MgaGVyZS4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX3N0YXRlIHsKLQl1MzIJICAgIHN0YXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHBfcmVxX3N0YXRlIHsKLQl1MzIJICAgIG1hc2s7Ci0JdTMyCSAgICB2YWw7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgewotCXUzMgkgICAgcmV0Y29kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2RyYmQwNl9wYXJhbSB7Ci0JdTY0CSAgc2l6ZTsKLQl1MzIJICBzdGF0ZTsKLQl1MzIJICBibGtzaXplOwotCXUzMgkgIHByb3RvY29sOwotCXUzMgkgIHZlcnNpb247Ci0JdTMyCSAgZ2VuX2NudFs1XTsKLQl1MzIJICBiaXRfbWFwX2dlbls1XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBwX2Jsb2NrX2Rlc2MgewotCXU2NCBzZWN0b3I7Ci0JdTMyIGJsa3NpemU7Ci0JdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCi19IF9fcGFja2VkOwotCi0vKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmNvZGluZyBmaWVsZC4KLSAqIEJ1bXAgcHJvdG8gdmVyc2lvbiB3aGVuIGNoYW5naW5nIHRoaXMuICovCi1lbnVtIGRyYmRfYml0bWFwX2NvZGUgewotCS8qIFJMRV9WTElfQnl0ZXMgPSAwLAotCSAqIGFuZCBvdGhlciBiaXQgdmFyaWFudHMgaGFkIGJlZW4gZGVmaW5lZCBkdXJpbmcKLQkgKiBhbGdvcml0aG0gZXZhbHVhdGlvbi4gKi8KLQlSTEVfVkxJX0JpdHMgPSAyLAotfTsKLQotc3RydWN0IHBfY29tcHJlc3NlZF9ibSB7Ci0JLyogKGVuY29kaW5nICYgMHgwZik6IGFjdHVhbCBlbmNvZGluZywgc2VlIGVudW0gZHJiZF9iaXRtYXBfY29kZQotCSAqIChlbmNvZGluZyAmIDB4ODApOiBwb2xhcml0eSAoc2V0L3Vuc2V0KSBvZiBmaXJzdCBydW5sZW5ndGgKLQkgKiAoKGVuY29kaW5nID4+IDQpICYgMHgwNyk6IHBhZF9iaXRzLCBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzCi0JICogdXNlZCB0byBwYWQgdXAgdG8gaGVhZC5sZW5ndGggYnl0ZXMKLQkgKi8KLQl1OCBlbmNvZGluZzsKLQotCXU4IGNvZGVbMF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcF9kZWxheV9wcm9iZTkzIHsKLQl1MzIgICAgIHNlcV9udW07IC8qIHNlcXVlbmNlIG51bWJlciB0byBtYXRjaCB0aGUgdHdvIHByb2JlIHBhY2tldHMgKi8KLQl1MzIgICAgIG9mZnNldDsgIC8qIHVzZWNzIHRoZSBwcm9iZSBnb3Qgc2VudCBhZnRlciB0aGUgcmVmZXJlbmNlIHRpbWUgcG9pbnQgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBCaXRtYXAgcGFja2V0cyBuZWVkIHRvIGZpdCB3aXRoaW4gYSBzaW5nbGUgcGFnZSBvbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciwKLSAqIHNvIHdlIGFyZSBsaW1pdGVkIHRvIDQgS2lCIChhbmQgbm90IHRvIFBBR0VfU0laRSwgd2hpY2ggY2FuIGJlIGJpZ2dlcikuCi0gKi8KLSNkZWZpbmUgRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgNDA5NgorZXh0ZXJuIHVuc2lnbmVkIGludCBkcmJkX2hlYWRlcl9zaXplKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGVudW0gZHJiZF90aHJlYWRfc3RhdGUgewpAQCAtNTE3LDkgKzI2MywxMCBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHN0b3A7CiAJZW51bSBkcmJkX3RocmVhZF9zdGF0ZSB0X3N0YXRlOwogCWludCAoKmZ1bmN0aW9uKSAoc3RydWN0IGRyYmRfdGhyZWFkICopOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAlpbnQgcmVzZXRfY3B1X21hc2s7Ci0JY2hhciBuYW1lWzldOworCWNvbnN0IGNoYXIgKm5hbWU7CiB9OwogCiBzdGF0aWMgaW5saW5lIGVudW0gZHJiZF90aHJlYWRfc3RhdGUgZ2V0X3Rfc3RhdGUoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCkBAIC01MzUsMTggKzI4MiwyMCBAQAogc3RydWN0IGRyYmRfd29yayB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCAoKmNiKShzdHJ1Y3QgZHJiZF93b3JrICosIGludCBjYW5jZWwpOwotCXVuaW9uIHsKLQkJc3RydWN0IGRyYmRfY29uZiAqbWRldjsKLQkJc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOwotCX07Cit9OworCitzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yayB7CisJc3RydWN0IGRyYmRfd29yayB3OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogfTsKIAogI2luY2x1ZGUgImRyYmRfaW50ZXJ2YWwuaCIKIAotZXh0ZXJuIGludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX2ludGVydmFsICopOworZXh0ZXJuIGludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKik7CiAKIHN0cnVjdCBkcmJkX3JlcXVlc3QgewogCXN0cnVjdCBkcmJkX3dvcmsgdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAogCS8qIGlmIGxvY2FsIElPIGlzIG5vdCBhbGxvd2VkLCB3aWxsIGJlIE5VTEwuCiAJICogaWYgbG9jYWwgSU8gX2lzXyBhbGxvd2VkLCBob2xkcyB0aGUgbG9jYWxseSBzdWJtaXR0ZWQgYmlvIGNsb25lLApAQCAtNTc5LDcgKzMyOCw3IEBACiB9OwogCiBzdHJ1Y3QgZHJiZF9lcG9jaCB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGludCBiYXJyaWVyX25yOwogCWF0b21pY190IGVwb2NoX3NpemU7IC8qIGluY3JlYXNlZCBvbiBldmVyeSByZXF1ZXN0IGFkZGVkLiAqLwpAQCAtNTg3LDYgKzMzNiwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwogCisvKiBQcm90b3R5cGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gZGVmaW5lZCBpbiBkcmJkX3JlY2VpdmVyLmMgKi8KK2ludCBkcmJkZF9pbml0KHN0cnVjdCBkcmJkX3RocmVhZCAqKTsKK2ludCBkcmJkX2FzZW5kZXIoc3RydWN0IGRyYmRfdGhyZWFkICopOworCiAvKiBkcmJkX2Vwb2NoIGZsYWcgYml0cyAqLwogZW51bSB7CiAJREVfSEFWRV9CQVJSSUVSX05VTUJFUiwKQEAgLTU5OSwxMSArMzUyLDYgQEAKIAlFVl9DTEVBTlVQID0gMzIsIC8qIHVzZWQgYXMgZmxhZyAqLwogfTsKIAotc3RydWN0IGRyYmRfd3FfYmFycmllciB7Ci0Jc3RydWN0IGRyYmRfd29yayB3OwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci19OwotCiBzdHJ1Y3QgZGlnZXN0X2luZm8gewogCWludCBkaWdlc3Rfc2l6ZTsKIAl2b2lkICpkaWdlc3Q7CkBAIC02MTEsNiArMzU5LDcgQEAKIAogc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0IHsKIAlzdHJ1Y3QgZHJiZF93b3JrIHc7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCXN0cnVjdCBkcmJkX2Vwb2NoICplcG9jaDsgLyogZm9yIHdyaXRlcyAqLwogCXN0cnVjdCBwYWdlICpwYWdlczsKIAlhdG9taWNfdCBwZW5kaW5nX2Jpb3M7CkBAIC02NjMsNyArNDEyLDcgQEAKICNkZWZpbmUgRUVfU0VORF9XUklURV9BQ0sJKDE8PF9fRUVfU0VORF9XUklURV9BQ0spCiAjZGVmaW5lIEVFX0lOX0lOVEVSVkFMX1RSRUUJKDE8PF9fRUVfSU5fSU5URVJWQUxfVFJFRSkKIAotLyogZmxhZyBiaXRzIHBlciBtZGV2ICovCisvKiBmbGFnIGJpdHMgcGVyIGRldmljZSAqLwogZW51bSB7CiAJVU5QTFVHX1JFTU9URSwJCS8qIHNlbmRpbmcgYSAiVW5wbHVnUmVtb3RlIiBjb3VsZCBoZWxwICovCiAJTURfRElSVFksCQkvKiBjdXJyZW50IHV1aWRzIGFuZCBmbGFncyBub3QgeWV0IG9uIGRpc2sgKi8KQEAgLTY5NSw3ICs0NDQsNyBAQAogCVJFQURfQkFMQU5DRV9SUiwKIH07CiAKLXN0cnVjdCBkcmJkX2JpdG1hcDsgLyogb3BhcXVlIGZvciBkcmJkX2NvbmYgKi8KK3N0cnVjdCBkcmJkX2JpdG1hcDsgLyogb3BhcXVlIGZvciBkcmJkX2RldmljZSAqLwogCiAvKiBkZWZpbml0aW9uIG9mIGJpdHMgaW4gYm1fZmxhZ3MgdG8gYmUgdXNlZCBpbiBkcmJkX2JtX2xvY2sKICAqIGFuZCBkcmJkX2JpdG1hcF9pbyBhbmQgZnJpZW5kcy4gKi8KQEAgLTc2OSw3ICs1MTgsNyBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJhY2tpbmdfYmRldjsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZF9iZGV2OwogCXN0cnVjdCBkcmJkX21kIG1kOwotCXN0cnVjdCBkaXNrX2NvbmYgKmRpc2tfY29uZjsgLyogUkNVLCBmb3IgdXBkYXRlczogbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlICovCisJc3RydWN0IGRpc2tfY29uZiAqZGlza19jb25mOyAvKiBSQ1UsIGZvciB1cGRhdGVzOiByZXNvdXJjZS0+Y29uZl91cGRhdGUgKi8KIAlzZWN0b3JfdCBrbm93bl9zaXplOyAvKiBsYXN0IGtub3duIHNpemUgb2YgdGhhdCBiYWNraW5nIGRldmljZSAqLwogfTsKIApAQCAtNzgyLDggKzUzMSw4IEBACiAJc3RydWN0IGRyYmRfd29yayB3OwogCWNoYXIgKndoeTsKIAllbnVtIGJtX2ZsYWcgZmxhZ3M7Ci0JaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotCXZvaWQgKCpkb25lKShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcnYpOworCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CisJdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgcnYpOwogfTsKIAogZW51bSB3cml0ZV9vcmRlcmluZ19lIHsKQEAgLTgwMCw3ICs1NDksNyBAQAogfTsKIGV4dGVybiBzdHJ1Y3QgZmlmb19idWZmZXIgKmZpZm9fYWxsb2MoaW50IGZpZm9fc2l6ZSk7CiAKLS8qIGZsYWcgYml0cyBwZXIgdGNvbm4gKi8KKy8qIGZsYWcgYml0cyBwZXIgY29ubmVjdGlvbiAqLwogZW51bSB7CiAJTkVUX0NPTkdFU1RFRCwJCS8qIFRoZSBkYXRhIHNvY2tldCBpcyBjb25nZXN0ZWQgKi8KIAlSRVNPTFZFX0NPTkZMSUNUUywJLyogU2V0IG9uIG9uZSBub2RlLCBjbGVhcmVkIG9uIHRoZSBwZWVyISAqLwpAQCAtODIyLDIzICs1NzEsMzUgQEAKIAlESVNDT05ORUNUX1NFTlQsCiB9OwogCi1zdHJ1Y3QgZHJiZF90Y29ubiB7CQkJLyogaXMgYSByZXNvdXJjZSBmcm9tIHRoZSBjb25maWcgZmlsZSAqLwotCWNoYXIgKm5hbWU7CQkJLyogUmVzb3VyY2UgbmFtZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYWxsX3Rjb25uOwkvKiBsaW5rZWQgb24gZ2xvYmFsIGRyYmRfdGNvbm5zICovCitzdHJ1Y3QgZHJiZF9yZXNvdXJjZSB7CisJY2hhciAqbmFtZTsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwotCXN0cnVjdCBpZHIgdm9sdW1lczsJCS8qIDx0Y29ubiwgdm5yPiB0byBtZGV2IG1hcHBpbmcgKi8KLQllbnVtIGRyYmRfY29ubnMgY3N0YXRlOwkJLyogT25seSBDX1NUQU5EQUxPTkUgdG8gQ19XRl9SRVBPUlRfUEFSQU1TICovCisJc3RydWN0IGlkciBkZXZpY2VzOwkJLyogdm9sdW1lIG51bWJlciB0byBkZXZpY2UgbWFwcGluZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7CisJc3RydWN0IGxpc3RfaGVhZCByZXNvdXJjZXM7CisJc3RydWN0IHJlc19vcHRzIHJlc19vcHRzOworCXN0cnVjdCBtdXRleCBjb25mX3VwZGF0ZTsJLyogbXV0ZXggZm9yIHJlYWR5LWNvcHktdXBkYXRlIG9mIG5ldF9jb25mIGFuZCBkaXNrX2NvbmYgKi8KKwlzcGlubG9ja190IHJlcV9sb2NrOworCiAJdW5zaWduZWQgc3VzcDoxOwkJLyogSU8gc3VzcGVuZGVkIGJ5IHVzZXIgKi8KIAl1bnNpZ25lZCBzdXNwX25vZDoxOwkJLyogSU8gc3VzcGVuZGVkIGJlY2F1c2Ugbm8gZGF0YSAqLwogCXVuc2lnbmVkIHN1c3BfZmVuOjE7CQkvKiBJTyBzdXNwZW5kZWQgYmVjYXVzZSBmZW5jZSBwZWVyIGhhbmRsZXIgcnVucyAqLworCisJY3B1bWFza192YXJfdCBjcHVfbWFzazsKK307CisKK3N0cnVjdCBkcmJkX2Nvbm5lY3Rpb24geworCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGlkciBwZWVyX2RldmljZXM7CS8qIHZvbHVtZSBudW1iZXIgdG8gcGVlciBkZXZpY2UgbWFwcGluZyAqLworCWVudW0gZHJiZF9jb25ucyBjc3RhdGU7CQkvKiBPbmx5IENfU1RBTkRBTE9ORSB0byBDX1dGX1JFUE9SVF9QQVJBTVMgKi8KIAlzdHJ1Y3QgbXV0ZXggY3N0YXRlX211dGV4OwkvKiBQcm90ZWN0cyBncmFjZWZ1bCBkaXNjb25uZWN0cyAqLwogCXVuc2lnbmVkIGludCBjb25uZWN0X2NudDsJLyogSW5jIGVhY2ggdGltZSBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgKi8KIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5ldF9jb25mICpuZXRfY29uZjsJLyogY29udGVudCBwcm90ZWN0ZWQgYnkgcmN1ICovCi0Jc3RydWN0IG11dGV4IGNvbmZfdXBkYXRlOwkvKiBtdXRleCBmb3IgcmVhZHktY29weS11cGRhdGUgb2YgbmV0X2NvbmYgYW5kIGRpc2tfY29uZiAqLwogCXdhaXRfcXVldWVfaGVhZF90IHBpbmdfd2FpdDsJLyogV29rZW4gdXBvbiByZWNlcHRpb24gb2YgYSBwaW5nLCBhbmQgYSBzdGF0ZSBjaGFuZ2UgKi8KLQlzdHJ1Y3QgcmVzX29wdHMgcmVzX29wdHM7CiAKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBteV9hZGRyOwogCWludCBteV9hZGRyX2xlbjsKQEAgLTg1MSwxMiArNjEyLDEwIEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3JlY2VpdmVkOwkvKiBpbiBqaWZmaWVzLCBlaXRoZXIgc29ja2V0ICovCiAJdW5zaWduZWQgaW50IGtvX2NvdW50OwogCi0Jc3BpbmxvY2tfdCByZXFfbG9jazsKLQogCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNmZXJfbG9nOwkvKiBhbGwgcmVxdWVzdHMgbm90IHlldCBmdWxseSBwcm9jZXNzZWQgKi8KIAogCXN0cnVjdCBjcnlwdG9faGFzaCAqY3JhbV9obWFjX3RmbTsKLQlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmludGVncml0eV90Zm07ICAvKiBjaGVja3N1bXMgd2UgY29tcHV0ZSwgdXBkYXRlcyBwcm90ZWN0ZWQgYnkgdGNvbm4tPmRhdGEtPm11dGV4ICovCisJc3RydWN0IGNyeXB0b19oYXNoICppbnRlZ3JpdHlfdGZtOyAgLyogY2hlY2tzdW1zIHdlIGNvbXB1dGUsIHVwZGF0ZXMgcHJvdGVjdGVkIGJ5IGNvbm5lY3Rpb24tPmRhdGEtPm11dGV4ICovCiAJc3RydWN0IGNyeXB0b19oYXNoICpwZWVyX2ludGVncml0eV90Zm07ICAvKiBjaGVja3N1bXMgd2UgdmVyaWZ5LCBvbmx5IGFjY2Vzc2VkIGZyb20gcmVjZWl2ZXIgdGhyZWFkICAqLwogCXN0cnVjdCBjcnlwdG9faGFzaCAqY3N1bXNfdGZtOwogCXN0cnVjdCBjcnlwdG9faGFzaCAqdmVyaWZ5X3RmbTsKQEAgLTg3NSw3ICs2MzQsNiBAQAogCXN0cnVjdCBkcmJkX3RocmVhZCByZWNlaXZlcjsKIAlzdHJ1Y3QgZHJiZF90aHJlYWQgd29ya2VyOwogCXN0cnVjdCBkcmJkX3RocmVhZCBhc2VuZGVyOwotCWNwdW1hc2tfdmFyX3QgY3B1X21hc2s7CiAKIAkvKiBzZW5kZXIgc2lkZSAqLwogCXN0cnVjdCBkcmJkX3dvcmtfcXVldWUgc2VuZGVyX3dvcms7CkBAIC05MDMsOCArNjYxLDE1IEBACiAJc3RydWN0IGxpc3RfaGVhZCB3cml0ZXM7CiB9OwogCi1zdHJ1Y3QgZHJiZF9jb25mIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CitzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSB7CisJc3RydWN0IGxpc3RfaGVhZCBwZWVyX2RldmljZXM7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKK307CisKK3N0cnVjdCBkcmJkX2RldmljZSB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBsaXN0X2hlYWQgcGVlcl9kZXZpY2VzOwogCWludCB2bnI7CQkJLyogdm9sdW1lIG51bWJlciB3aXRoaW4gdGhlIGNvbm5lY3Rpb24gKi8KIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCkBAIC05MjAsMTEgKzY4NSwxMSBAQAogCXN0cnVjdCBnZW5kaXNrCSAgICAqdmRpc2s7CiAKIAl1bnNpZ25lZCBsb25nIGxhc3RfcmVhdHRhY2hfamlmOwotCXN0cnVjdCBkcmJkX3dvcmsgIHJlc3luY193b3JrLAotCQkJICB1bnBsdWdfd29yaywKLQkJCSAgZ29fZGlza2xlc3MsCi0JCQkgIG1kX3N5bmNfd29yaywKLQkJCSAgc3RhcnRfcmVzeW5jX3dvcms7CisJc3RydWN0IGRyYmRfd29yayByZXN5bmNfd29yazsKKwlzdHJ1Y3QgZHJiZF93b3JrIHVucGx1Z193b3JrOworCXN0cnVjdCBkcmJkX3dvcmsgZ29fZGlza2xlc3M7CisJc3RydWN0IGRyYmRfd29yayBtZF9zeW5jX3dvcms7CisJc3RydWN0IGRyYmRfd29yayBzdGFydF9yZXN5bmNfd29yazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCByZXN5bmNfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QgbWRfc3luY190aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFydF9yZXN5bmNfdGltZXI7CkBAIC0xMDMwLDcgKzc5NSw3IEBACiAJc3RydWN0IGJtX2lvX3dvcmsgYm1faW9fd29yazsKIAl1NjQgZWRfdXVpZDsgLyogVVVJRCBvZiB0aGUgZXhwb3NlZCBkYXRhICovCiAJc3RydWN0IG11dGV4IG93bl9zdGF0ZV9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggKnN0YXRlX211dGV4OyAvKiBlaXRoZXIgb3duX3N0YXRlX211dGV4IG9yIG1kZXYtPnRjb25uLT5jc3RhdGVfbXV0ZXggKi8KKwlzdHJ1Y3QgbXV0ZXggKnN0YXRlX211dGV4OyAvKiBlaXRoZXIgb3duX3N0YXRlX211dGV4IG9yIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmNzdGF0ZV9tdXRleCAqLwogCWNoYXIgY29uZ2VzdGlvbl9yZWFzb247ICAvKiBXaHkgd2Ugd2hlcmUgY29uZ2VzdGVkLi4uICovCiAJYXRvbWljX3QgcnNfc2VjdF9pbjsgLyogZm9yIGluY29taW5nIHJlc3luYyBkYXRhIHJhdGUsIFN5bmNUYXJnZXQgKi8KIAlhdG9taWNfdCByc19zZWN0X2V2OyAvKiBmb3Igc3VibWl0dGVkIHJlc3luYyBkYXRhIHJhdGUsIGJvdGggKi8KQEAgLTEwMzgsNyArODAzLDcgQEAKIAlpbnQgcnNfbGFzdF9ldmVudHM7ICAvKiBjb3VudGVyIG9mIHJlYWQgb3Igd3JpdGUgImV2ZW50cyIgKHVuaXQgc2VjdG9ycykKIAkJCSAgICAgICogb24gdGhlIGxvd2VyIGxldmVsIGRldmljZSB3aGVuIHdlIGxhc3QgbG9va2VkLiAqLwogCWludCBjX3N5bmNfcmF0ZTsgLyogY3VycmVudCByZXN5bmMgcmF0ZSBhZnRlciBzeW5jZXIgdGhyb3R0bGUgbWFnaWMgKi8KLQlzdHJ1Y3QgZmlmb19idWZmZXIgKnJzX3BsYW5fczsgLyogY29ycmVjdGlvbiB2YWx1ZXMgb2YgcmVzeW5jIHBsYW5lciAoUkNVLCB0Y29ubi0+Y29ubl91cGRhdGUpICovCisJc3RydWN0IGZpZm9fYnVmZmVyICpyc19wbGFuX3M7IC8qIGNvcnJlY3Rpb24gdmFsdWVzIG9mIHJlc3luYyBwbGFuZXIgKFJDVSwgY29ubmVjdGlvbi0+Y29ubl91cGRhdGUpICovCiAJaW50IHJzX2luX2ZsaWdodDsgLyogcmVzeW5jIHNlY3RvcnMgaW4gZmxpZ2h0ICh0byBwcm94eSwgaW4gcHJveHkgYW5kIGZyb20gcHJveHkpICovCiAJYXRvbWljX3QgYXBfaW5fZmxpZ2h0OyAvKiBBcHAgc2VjdG9ycyBpbiBmbGlnaHQgKHdhaXRpbmcgZm9yIGFjaykgKi8KIAl1bnNpZ25lZCBpbnQgcGVlcl9tYXhfYmlvX3NpemU7CkBAIC0xMDQ5LDE5ICs4MTQsNDYgQEAKIAlzdHJ1Y3Qgc3VibWl0X3dvcmtlciBzdWJtaXQ7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkcmJkX2NvbmYgKm1pbm9yX3RvX21kZXYodW5zaWduZWQgaW50IG1pbm9yKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9kZXZpY2UgKm1pbm9yX3RvX2RldmljZSh1bnNpZ25lZCBpbnQgbWlub3IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZHJiZF9jb25mICopaWRyX2ZpbmQoJm1pbm9ycywgbWlub3IpOworCXJldHVybiAoc3RydWN0IGRyYmRfZGV2aWNlICopaWRyX2ZpbmQoJmRyYmRfZGV2aWNlcywgbWlub3IpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZGV2X3RvX21pbm9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpmaXJzdF9wZWVyX2RldmljZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlyZXR1cm4gbWRldi0+bWlub3I7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnkoJmRldmljZS0+cGVlcl9kZXZpY2VzLCBzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSwgcGVlcl9kZXZpY2VzKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9jb25mICp2bnJfdG9fbWRldihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGludCB2bnIpCisjZGVmaW5lIGZvcl9lYWNoX3Jlc291cmNlKHJlc291cmNlLCBfcmVzb3VyY2VzKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXNvdXJjZSwgX3Jlc291cmNlcywgcmVzb3VyY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3Jlc291cmNlX3JjdShyZXNvdXJjZSwgX3Jlc291cmNlcykgXAorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJlc291cmNlLCBfcmVzb3VyY2VzLCByZXNvdXJjZXMpCisKKyNkZWZpbmUgZm9yX2VhY2hfcmVzb3VyY2Vfc2FmZShyZXNvdXJjZSwgdG1wLCBfcmVzb3VyY2VzKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlc291cmNlLCB0bXAsIF9yZXNvdXJjZXMsIHJlc291cmNlcykKKworI2RlZmluZSBmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmcmVzb3VyY2UtPmNvbm5lY3Rpb25zLCBjb25uZWN0aW9ucykKKworI2RlZmluZSBmb3JfZWFjaF9jb25uZWN0aW9uX3JjdShjb25uZWN0aW9uLCByZXNvdXJjZSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvbm5lY3Rpb24sICZyZXNvdXJjZS0+Y29ubmVjdGlvbnMsIGNvbm5lY3Rpb25zKQorCisjZGVmaW5lIGZvcl9lYWNoX2Nvbm5lY3Rpb25fc2FmZShjb25uZWN0aW9uLCB0bXAsIHJlc291cmNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm5lY3Rpb24sIHRtcCwgJnJlc291cmNlLT5jb25uZWN0aW9ucywgY29ubmVjdGlvbnMpCisKKyNkZWZpbmUgZm9yX2VhY2hfcGVlcl9kZXZpY2UocGVlcl9kZXZpY2UsIGRldmljZSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnkocGVlcl9kZXZpY2UsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3BlZXJfZGV2aWNlX3JjdShwZWVyX2RldmljZSwgZGV2aWNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocGVlcl9kZXZpY2UsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCisjZGVmaW5lIGZvcl9lYWNoX3BlZXJfZGV2aWNlX3NhZmUocGVlcl9kZXZpY2UsIHRtcCwgZGV2aWNlKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfZGV2aWNlLCB0bXAsICZkZXZpY2UtPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2VzKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkZXZpY2VfdG9fbWlub3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZHJiZF9jb25mICopaWRyX2ZpbmQoJnRjb25uLT52b2x1bWVzLCB2bnIpOworCXJldHVybiBkZXZpY2UtPm1pbm9yOwogfQogCiAvKgpAQCAtMTA3NSw5NiArODY3LDkzIEBACiAJRERTRl9OT19SRVNZTkMgPSAyLCAvKiBEbyBub3QgcnVuIGEgcmVzeW5jIGZvciB0aGUgbmV3IHNwYWNlICovCiB9OwogCi1leHRlcm4gdm9pZCBkcmJkX2luaXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9pbml0X3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiBleHRlcm4gaW50ICBkcmJkX3RocmVhZF9zdGFydChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CiBleHRlcm4gdm9pZCBfZHJiZF90aHJlYWRfc3RvcChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSwgaW50IHJlc3RhcnQsIGludCB3YWl0KTsKLWV4dGVybiBjaGFyICpkcmJkX3Rhc2tfdG9fdGhyZWFkX25hbWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogI2lmZGVmIENPTkZJR19TTVAKIGV4dGVybiB2b2lkIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7Ci1leHRlcm4gdm9pZCBkcmJkX2NhbGNfY3B1X21hc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKICNlbHNlCiAjZGVmaW5lIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShBKSAoe30pCi0jZGVmaW5lIGRyYmRfY2FsY19jcHVfbWFzayhBKSAoe30pCiAjZW5kaWYKLWV4dGVybiB2b2lkIHRsX3JlbGVhc2Uoc3RydWN0IGRyYmRfdGNvbm4gKiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCitleHRlcm4gdm9pZCB0bF9yZWxlYXNlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0X3NpemUpOwotZXh0ZXJuIHZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfdGNvbm4gKik7Ci1leHRlcm4gdm9pZCBkcmJkX2ZyZWVfc29jayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZXh0ZXJuIGludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorZXh0ZXJuIHZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqKTsKK2V4dGVybiB2b2lkIGRyYmRfZnJlZV9zb2NrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIGludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywKIAkJICAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfYWxsKHN0cnVjdCBkcmJkX3Rjb25uICosIHN0cnVjdCBzb2NrZXQgKiwgdm9pZCAqLCBzaXplX3QsCitleHRlcm4gaW50IGRyYmRfc2VuZF9hbGwoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqLCBzdHJ1Y3Qgc29ja2V0ICosIHZvaWQgKiwgc2l6ZV90LAogCQkJIHVuc2lnbmVkKTsKIAotZXh0ZXJuIGludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9wYWNrZXQgY21kKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3Byb3RvY29sKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfc2l6ZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHRyaWdnZXJfcmVwbHksIGVudW0gZGRzX2ZsYWdzIGZsYWdzKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgcyk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfc3luY19wYXJhbShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfc2VuZF9iX2FjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHUzMiBiYXJyaWVyX25yLAorZXh0ZXJuIGludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCk7CitleHRlcm4gaW50IGRyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3V1aWRzKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOworZXh0ZXJuIGludCBkcmJkX3NlbmRfdXVpZHNfc2tpcF9pbml0aWFsX3N5bmMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9zaXplcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBpbnQgdHJpZ2dlcl9yZXBseSwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MpOworZXh0ZXJuIGludCBkcmJkX3NlbmRfc3RhdGUoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSBzKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9zeW5jX3BhcmFtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2JfYWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHUzMiBiYXJyaWVyX25yLAogCQkJICAgIHUzMiBzZXRfc2l6ZSk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9hY2soc3RydWN0IGRyYmRfY29uZiAqLCBlbnVtIGRyYmRfcGFja2V0LAorZXh0ZXJuIGludCBkcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGVudW0gZHJiZF9wYWNrZXQsCiAJCQkgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICopOwotZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2Fja19ycChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2V4dGVybiB2b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgZW51bSBkcmJkX3BhY2tldCwKIAkJCSAgICAgc3RydWN0IHBfYmxvY2tfcmVxICpycCk7Ci1leHRlcm4gdm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAorZXh0ZXJuIHZvaWQgZHJiZF9zZW5kX2Fja19kcChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBlbnVtIGRyYmRfcGFja2V0LAogCQkJICAgICBzdHJ1Y3QgcF9kYXRhICpkcCwgaW50IGRhdGFfc2l6ZSk7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9hY2tfZXgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3BhY2tldCBjbWQsCitleHRlcm4gaW50IGRyYmRfc2VuZF9hY2tfZXgoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgZW51bSBkcmJkX3BhY2tldCwKIAkJCSAgICBzZWN0b3JfdCBzZWN0b3IsIGludCBibGtzaXplLCB1NjQgYmxvY2tfaWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICopOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfYmxvY2soc3RydWN0IGRyYmRfY29uZiAqLCBlbnVtIGRyYmRfcGFja2V0LAorZXh0ZXJuIGludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2Jsb2NrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGVudW0gZHJiZF9wYWNrZXQsCiAJCQkgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBjbWQsCitleHRlcm4gaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIGludCBjbWQsCiAJCQkgICAgICBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLCB1NjQgYmxvY2tfaWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsCitleHRlcm4gaW50IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICBpbnQgc2l6ZSwgdm9pZCAqZGlnZXN0LCBpbnQgZGlnZXN0X3NpemUsCiAJCQkJICAgZW51bSBkcmJkX3BhY2tldCBjbWQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LHNlY3Rvcl90IHNlY3RvcixpbnQgc2l6ZSk7CitleHRlcm4gaW50IGRyYmRfc2VuZF9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICosIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpOwogCi1leHRlcm4gaW50IGRyYmRfc2VuZF9iaXRtYXAoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOwotZXh0ZXJuIHZvaWQgY29ubl9zZW5kX3NyX3JlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOworZXh0ZXJuIGludCBkcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB2b2lkIGRyYmRfc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBlbnVtIGRyYmRfc3RhdGVfcnYgcmV0Y29kZSk7CitleHRlcm4gdm9pZCBjb25uX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpOwogZXh0ZXJuIHZvaWQgZHJiZF9mcmVlX2JjKHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpsZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfbWRldl9jbGVhbnVwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotdm9pZCBkcmJkX3ByaW50X3V1aWRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKnRleHQpOworZXh0ZXJuIHZvaWQgZHJiZF9kZXZpY2VfY2xlYW51cChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7Cit2b2lkIGRyYmRfcHJpbnRfdXVpZHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKnRleHQpOwogCi1leHRlcm4gdm9pZCBjb25uX21kX3N5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdm9pZCAqYnVmZmVyKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgIGRyYmRfbWRfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIF9kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfdXVpZF9uZXdfY3VycmVudChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0X2JtKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgX19kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiB2b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWdzKSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX21kX2NsZWFyX2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWdzKV9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiB2b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHZvaWQgKmJ1ZmZlcik7CitleHRlcm4gdm9pZCBkcmJkX21kX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCAgZHJiZF9tZF9yZWFkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldik7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBfZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGlkeCwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF91dWlkX25ld19jdXJyZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfc2V0X2JtKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCk7CitleHRlcm4gdm9pZCBfX2RyYmRfdXVpZF9zZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBmbGFncykgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZ3MpX19tdXN0X2hvbGQobG9jYWwpOwogZXh0ZXJuIGludCBkcmJkX21kX3Rlc3RfZmxhZyhzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqLCBpbnQpOwogI2lmbmRlZiBEUkJEX0RFQlVHX01EX1NZTkMKLWV4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKK2V4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAjZWxzZQogI2RlZmluZSBkcmJkX21kX21hcmtfZGlydHkobSkJZHJiZF9tZF9tYXJrX2RpcnR5XyhtLCBfX0xJTkVfXyAsIF9fZnVuY19fICkKLWV4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eV8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2V4dGVybiB2b2lkIGRyYmRfbWRfbWFya19kaXJ0eV8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCXVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKTsKICNlbmRpZgotZXh0ZXJuIHZvaWQgZHJiZF9xdWV1ZV9iaXRtYXBfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKLQkJCQkgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2NvbmYgKiksCi0JCQkJIHZvaWQgKCpkb25lKShzdHJ1Y3QgZHJiZF9jb25mICosIGludCksCitleHRlcm4gdm9pZCBkcmJkX3F1ZXVlX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJCQkgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKKwkJCQkgdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpLAogCQkJCSBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncyk7Ci1leHRlcm4gaW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCi0JCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAorZXh0ZXJuIGludCBkcmJkX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKIAkJY2hhciAqd2h5LCBlbnVtIGJtX2ZsYWcgZmxhZ3MpOwotZXh0ZXJuIGludCBkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAotCQlpbnQgKCppb19mbikoc3RydWN0IGRyYmRfY29uZiAqKSwKK2V4dGVybiBpbnQgZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCisJCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiksCiAJCWNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKTsKLWV4dGVybiBpbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX2JtaW9fY2xlYXJfbl93cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfbGRldl9kZXN0cm95KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIGludCBkcmJkX2JtaW9fc2V0X25fd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX2JtaW9fY2xlYXJfbl93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAKIC8qIE1ldGEgZGF0YSBsYXlvdXQKICAqCkBAIC0xMzUwLDUyICsxMTM5LDUyIEBACiAjZGVmaW5lIERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVCAoMVUgPDwgMTUpIC8qIEhlYWRlciA4MCBvbmx5IGFsbG93cyBwYWNrZXRzIHVwIHRvIDMyS2lCIGRhdGEgKi8KICNkZWZpbmUgRFJCRF9NQVhfQklPX1NJWkVfUDk1ICAgICgxVSA8PCAxNykgLyogUHJvdG9jb2wgOTUgdG8gOTkgYWxsb3dzIGJpb3MgdXAgdG8gMTI4S2lCICovCiAKLWV4dGVybiBpbnQgIGRyYmRfYm1faW5pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fcmVzaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvcnMsIGludCBzZXRfbmV3X2JpdHMpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhbnVwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9zZXRfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhcl9hbGwoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gaW50ICBkcmJkX2JtX2luaXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCAgZHJiZF9ibV9yZXNpemUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvcnMsIGludCBzZXRfbmV3X2JpdHMpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9jbGVhbnVwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB2b2lkIGRyYmRfYm1fc2V0X2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX2JtX2NsZWFyX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAvKiBzZXQvY2xlYXIvdGVzdCBvbmx5IGEgZmV3IGJpdHMgYXQgYSB0aW1lICovCiBleHRlcm4gaW50ICBkcmJkX2JtX3NldF9iaXRzKAotCQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIHMsIHVuc2lnbmVkIGxvbmcgZSk7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHMsIHVuc2lnbmVkIGxvbmcgZSk7CiBleHRlcm4gaW50ICBkcmJkX2JtX2NsZWFyX2JpdHMoCi0JCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGxvbmcgcywgdW5zaWduZWQgbG9uZyBlKTsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgcywgdW5zaWduZWQgbG9uZyBlKTsKIGV4dGVybiBpbnQgZHJiZF9ibV9jb3VudF9iaXRzKAotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcywgY29uc3QgdW5zaWduZWQgbG9uZyBlKTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpOwogLyogYm1fc2V0X2JpdHMgdmFyaWFudCBmb3IgdXNlIHdoaWxlIGhvbGRpbmcgZHJiZF9ibV9sb2NrLAogICogbWF5IHByb2Nlc3MgdGhlIHdob2xlIGJpdG1hcCBpbiBvbmUgZ28gKi8KLWV4dGVybiB2b2lkIF9kcmJkX2JtX3NldF9iaXRzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitleHRlcm4gdm9pZCBfZHJiZF9ibV9zZXRfYml0cyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJY29uc3QgdW5zaWduZWQgbG9uZyBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGUpOwotZXh0ZXJuIGludCAgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJpdG5yKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fZV93ZWlnaHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBlbnIpOwotZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9wYWdlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gdm9pZCBkcmJkX2JtX21hcmtfZm9yX3dyaXRlb3V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBwYWdlX25yKTsKLWV4dGVybiBpbnQgIGRyYmRfYm1fd3JpdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIGludCBkcmJkX2JtX3dyaXRlX2FsbChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCk7Ci1leHRlcm4gaW50ICBkcmJkX2JtX3dyaXRlX2NvcHlfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHNpemVfdAkgICAgIGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkcmJkX2JtX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gc2VjdG9yX3QgICAgICBkcmJkX2JtX2NhcGFjaXR5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIGludCAgZHJiZF9ibV90ZXN0X2JpdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgbG9uZyBiaXRucik7CitleHRlcm4gaW50ICBkcmJkX2JtX2Vfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGVucik7CitleHRlcm4gaW50ICBkcmJkX2JtX3dyaXRlX3BhZ2Uoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBpZHgpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgIGRyYmRfYm1fcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9tYXJrX2Zvcl93cml0ZW91dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHBhZ2VfbnIpOworZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIGludCAgZHJiZF9ibV93cml0ZV9oaW50ZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgZHJiZF9ibV93cml0ZV9hbGwoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKTsKK2V4dGVybiBpbnQgIGRyYmRfYm1fd3JpdGVfY29weV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHNpemVfdAkgICAgIGRyYmRfYm1fd29yZHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJiZF9ibV9iaXRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiBzZWN0b3JfdCAgICAgIGRyYmRfYm1fY2FwYWNpdHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogCiAjZGVmaW5lIERSQkRfRU5EX09GX0JJVE1BUAkofih1bnNpZ25lZCBsb25nKTApCi1leHRlcm4gdW5zaWduZWQgbG9uZyBkcmJkX2JtX2ZpbmRfbmV4dChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fZmluZF9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKIC8qIGJtX2ZpbmRfbmV4dCB2YXJpYW50cyBmb3IgdXNlIHdoaWxlIHlvdSBob2xkIGRyYmRfYm1fbG9jaygpICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBibV9mbyk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHRfemVybyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bnNpZ25lZCBsb25nIGJtX2ZvKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9kcmJkX2JtX3RvdGFsX3dlaWdodChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX2JtX3JzX2RvbmUoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfZHJiZF9ibV9maW5kX25leHQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fZmluZF9uZXh0X3plcm8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgYm1fZm8pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2RyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRyYmRfYm1fdG90YWxfd2VpZ2h0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiBpbnQgZHJiZF9ibV9yc19kb25lKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIC8qIGZvciByZWNlaXZlX2JpdG1hcCAqLwotZXh0ZXJuIHZvaWQgZHJiZF9ibV9tZXJnZV9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwKK2V4dGVybiB2b2lkIGRyYmRfYm1fbWVyZ2VfbGVsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzaXplX3Qgb2Zmc2V0LAogCQlzaXplX3QgbnVtYmVyLCB1bnNpZ25lZCBsb25nICpidWZmZXIpOwogLyogZm9yIF9kcmJkX3NlbmRfYml0bWFwICovCi1leHRlcm4gdm9pZCBkcmJkX2JtX2dldF9sZWwoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2l6ZV90IG9mZnNldCwKK2V4dGVybiB2b2lkIGRyYmRfYm1fZ2V0X2xlbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2l6ZV90IG9mZnNldCwKIAkJc2l6ZV90IG51bWJlciwgdW5zaWduZWQgbG9uZyAqYnVmZmVyKTsKIAotZXh0ZXJuIHZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNoYXIgKndoeSwgZW51bSBibV9mbGFnIGZsYWdzKTsKLWV4dGVybiB2b2lkIGRyYmRfYm1fdW5sb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9ibV9sb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncyk7CitleHRlcm4gdm9pZCBkcmJkX2JtX3VubG9jayhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CiAvKiBkcmJkX21haW4uYyAqLwogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmRyYmRfcmVxdWVzdF9jYWNoZTsKQEAgLTE0MzksMzUgKzEyMjgsNDAgQEAKIAogZXh0ZXJuIHJ3bG9ja190IGdsb2JhbF9zdGF0ZV9sb2NrOwogCi1leHRlcm4gaW50IGNvbm5fbG93ZXN0X21pbm9yKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1lbnVtIGRyYmRfcmV0X2NvZGUgY29ubl9uZXdfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgbWlub3IsIGludCB2bnIpOwotZXh0ZXJuIHZvaWQgZHJiZF9taW5vcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKTsKK2V4dGVybiBpbnQgY29ubl9sb3dlc3RfbWlub3Ioc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgdW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdm5yKTsKK2V4dGVybiB2b2lkIGRyYmRfZGVzdHJveV9kZXZpY2Uoc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHZvaWQgZHJiZF9kZWxldGVfZGV2aWNlKHN0cnVjdCBkcmJkX2RldmljZSAqbWRldik7CiAKLWV4dGVybiBpbnQgc2V0X3Jlc291cmNlX29wdGlvbnMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcmVzX29wdHMgKnJlc19vcHRzKTsKLWV4dGVybiBzdHJ1Y3QgZHJiZF90Y29ubiAqY29ubl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cyk7Ci1leHRlcm4gdm9pZCBjb25uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpOwotc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKK2V4dGVybiBzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqZHJiZF9jcmVhdGVfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcmJkX2ZyZWVfcmVzb3VyY2Uoc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlKTsKKworZXh0ZXJuIGludCBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpOworZXh0ZXJuIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpOworZXh0ZXJuIHZvaWQgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24oc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKIAkJCQkJICAgIHZvaWQgKnBlZXJfYWRkciwgaW50IHBlZXJfYWRkcl9sZW4pOwotZXh0ZXJuIHZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOworZXh0ZXJuIHN0cnVjdCBkcmJkX3Jlc291cmNlICpkcmJkX2ZpbmRfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2Uoc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIAogZXh0ZXJuIGludCBwcm9jX2RldGFpbHM7CiAKIC8qIGRyYmRfcmVxICovCiBleHRlcm4gdm9pZCBkb19zdWJtaXQoc3RydWN0IHdvcmtfc3RydWN0ICp3cyk7Ci1leHRlcm4gdm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGJpbyAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9fZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICosIHN0cnVjdCBiaW8gKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBkcmJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKLWV4dGVybiBpbnQgZHJiZF9yZWFkX3JlbW90ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIGludCBkcmJkX3JlYWRfcmVtb3RlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOwogZXh0ZXJuIGludCBkcmJkX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBidmVjX21lcmdlX2RhdGEgKmJ2bSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMpOwogZXh0ZXJuIGludCBpc192YWxpZF9hcl9oYW5kbGUoc3RydWN0IGRyYmRfcmVxdWVzdCAqLCBzZWN0b3JfdCk7CiAKIAogLyogZHJiZF9ubC5jICovCiBleHRlcm4gaW50IGRyYmRfbXNnX3B1dF9pbmZvKGNvbnN0IGNoYXIgKmluZm8pOwotZXh0ZXJuIHZvaWQgZHJiZF9zdXNwZW5kX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitleHRlcm4gdm9pZCBkcmJkX3N1c3BlbmRfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOwogZXh0ZXJuIGNoYXIgKnBwc2l6ZShjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKTsKLWV4dGVybiBzZWN0b3JfdCBkcmJkX25ld19kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICosIHNlY3Rvcl90LCBpbnQpOworZXh0ZXJuIHNlY3Rvcl90IGRyYmRfbmV3X2Rldl9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqLCBzZWN0b3JfdCwgaW50KTsKIGVudW0gZGV0ZXJtaW5lX2Rldl9zaXplIHsKIAlEU19FUlJPUl9TSFJJTksgPSAtMywKIAlEU19FUlJPUl9TUEFDRV9NRCA9IC0yLApAQCAtMTQ3OCw0OCArMTI3Miw0NyBAQAogCURTX0dSRVdfRlJPTV9aRVJPID0gMywKIH07CiBleHRlcm4gZW51bSBkZXRlcm1pbmVfZGV2X3NpemUKLWRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKHN0cnVjdCBkcmJkX2NvbmYgKiwgZW51bSBkZHNfZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKikgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KHN0cnVjdCBkcmJkX2NvbmYgKik7Ci1leHRlcm4gdm9pZCBkcmJkX3JlY29uc2lkZXJfbWF4X2Jpb19zaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBkcmJkX3NldF9yb2xlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitkcmJkX2RldGVybWluZV9kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgZW51bSBkZHNfZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKikgX19tdXN0X2hvbGQobG9jYWwpOworZXh0ZXJuIHZvaWQgcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KHN0cnVjdCBkcmJkX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIGRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBkcmJkX3NldF9yb2xlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQllbnVtIGRyYmRfcm9sZSBuZXdfcm9sZSwKIAkJCQkJaW50IGZvcmNlKTsKLWV4dGVybiBib29sIGNvbm5fdHJ5X291dGRhdGVfcGVlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZXh0ZXJuIHZvaWQgY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfa2hlbHBlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjaGFyICpjbWQpOworZXh0ZXJuIGJvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIHZvaWQgY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZXh0ZXJuIGludCBkcmJkX2toZWxwZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKmNtZCk7CiAKIC8qIGRyYmRfd29ya2VyLmMgKi8KIGV4dGVybiBpbnQgZHJiZF93b3JrZXIoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpOwotZW51bSBkcmJkX3JldF9jb2RlIGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBvX21pbm9yKTsKLXZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiB2b2lkIGRyYmRfc3RhcnRfcmVzeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9jb25ucyBzaWRlKTsKLWV4dGVybiB2b2lkIHJlc3VtZV9uZXh0X3NnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgc3VzcGVuZF9vdGhlcl9zZyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KTsKLWV4dGVybiBpbnQgZHJiZF9yZXN5bmNfZmluaXNoZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldik7CitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9yZXN5bmNfYWZ0ZXJfdmFsaWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBvX21pbm9yKTsKK3ZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX3N0YXJ0X3Jlc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Nvbm5zIHNpZGUpOworZXh0ZXJuIHZvaWQgcmVzdW1lX25leHRfc2coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHZvaWQgc3VzcGVuZF9vdGhlcl9zZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gaW50IGRyYmRfcmVzeW5jX2ZpbmlzaGVkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIC8qIG1heWJlIHJhdGhlciBkcmJkX21haW4uYyA/ICovCi1leHRlcm4gdm9pZCAqZHJiZF9tZF9nZXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIHZvaWQgZHJiZF9tZF9wdXRfYnVmZmVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgKmRyYmRfbWRfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX21kX3B1dF9idWZmZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX21kX3N5bmNfcGFnZV9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHJ3KTsKLWV4dGVybiB2b2lkIGRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQoc3RydWN0IGRyYmRfY29uZiAqLCBzZWN0b3JfdCwgaW50KTsKLWV4dGVybiB2b2lkIHdhaXRfdW50aWxfZG9uZV9vcl9mb3JjZV9kZXRhY2hlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIHZvaWQgZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc2VjdG9yX3QsIGludCk7CitleHRlcm4gdm9pZCB3YWl0X3VudGlsX2RvbmVfb3JfZm9yY2VfZGV0YWNoZWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCXN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2LCB1bnNpZ25lZCBpbnQgKmRvbmUpOwotZXh0ZXJuIHZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworZXh0ZXJuIHZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG92X291dF9vZl9zeW5jX3ByaW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgb3Zfb3V0X29mX3N5bmNfcHJpbnQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKG1kZXYtPm92X2xhc3Rfb29zX3NpemUpIHsKLQkJZGV2X2VycihERVYsICJPdXQgb2Ygc3luYzogc3RhcnQ9JWxsdSwgc2l6ZT0lbHUgKHNlY3RvcnMpXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+b3ZfbGFzdF9vb3Nfc3RhcnQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSk7CisJaWYgKGRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSkgeworCQlkcmJkX2VycihkZXZpY2UsICJPdXQgb2Ygc3luYzogc3RhcnQ9JWxsdSwgc2l6ZT0lbHUgKHNlY3RvcnMpXG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWNlLT5vdl9sYXN0X29vc19zdGFydCwKKwkJICAgICAodW5zaWduZWQgbG9uZylkZXZpY2UtPm92X2xhc3Rfb29zX3NpemUpOwogCX0KLQltZGV2LT5vdl9sYXN0X29vc19zaXplPTA7CisJZGV2aWNlLT5vdl9sYXN0X29vc19zaXplID0gMDsKIH0KIAogCi1leHRlcm4gdm9pZCBkcmJkX2NzdW1fYmlvKHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGNyeXB0b19oYXNoICosIHN0cnVjdCBiaW8gKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGRyYmRfY3N1bV9lZShzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBjcnlwdG9faGFzaCAqLAotCQkJIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgZHJiZF9jc3VtX2JpbyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKiwgc3RydWN0IGJpbyAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgZHJiZF9jc3VtX2VlKHN0cnVjdCBjcnlwdG9faGFzaCAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwgdm9pZCAqKTsKIC8qIHdvcmtlciBjYWxsYmFja3MgKi8KIGV4dGVybiBpbnQgd19lX2VuZF9kYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfZV9lbmRfcnNkYXRhX3JlcShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CkBAIC0xNTI5LDEwICsxMzIyLDggQEAKIGV4dGVybiBpbnQgd19vdl9maW5pc2hlZChzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfcmVzeW5jX3RpbWVyKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19zZW5kX3dyaXRlX2hpbnQoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwotZXh0ZXJuIGludCB3X21ha2VfcmVzeW5jX3JlcXVlc3Qoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwogZXh0ZXJuIGludCB3X3NlbmRfZGJsb2NrKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19zZW5kX3JlYWRfcmVxKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKLWV4dGVybiBpbnQgd19wcmV2X3dvcmtfZG9uZShzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiBleHRlcm4gaW50IHdfZV9yZWlzc3VlKHN0cnVjdCBkcmJkX3dvcmsgKiwgaW50KTsKIGV4dGVybiBpbnQgd19yZXN0YXJ0X2Rpc2tfaW8oc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwogZXh0ZXJuIGludCB3X3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfd29yayAqLCBpbnQpOwpAQCAtMTU0MiwyNyArMTMzMywyNCBAQAogZXh0ZXJuIHZvaWQgc3RhcnRfcmVzeW5jX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qIGRyYmRfcmVjZWl2ZXIuYyAqLwotZXh0ZXJuIGludCBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKTsKLWV4dGVybiBpbnQgZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKiwKK2V4dGVybiBpbnQgZHJiZF9yZWNlaXZlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CitleHRlcm4gaW50IGRyYmRfYXNlbmRlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSk7CitleHRlcm4gaW50IGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKTsKK2V4dGVybiBpbnQgZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqLAogCQkJCSAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwgY29uc3QgdW5zaWduZWQsCiAJCQkJICAgIGNvbnN0IGludCk7Ci1leHRlcm4gaW50IGRyYmRfZnJlZV9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgbGlzdF9oZWFkICopOwotZXh0ZXJuIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqZHJiZF9hbGxvY19wZWVyX3JlcShzdHJ1Y3QgZHJiZF9jb25mICosIHU2NCwKK2V4dGVybiBpbnQgZHJiZF9mcmVlX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgc3RydWN0IGxpc3RfaGVhZCAqKTsKK2V4dGVybiBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKmRyYmRfYWxsb2NfcGVlcl9yZXEoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdTY0LAogCQkJCQkJICAgICBzZWN0b3JfdCwgdW5zaWduZWQgaW50LAogCQkJCQkJICAgICBnZnBfdCkgX19tdXN0X2hvbGQobG9jYWwpOwotZXh0ZXJuIHZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfY29uZiAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwKK2V4dGVybiB2b2lkIF9fZHJiZF9mcmVlX3BlZXJfcmVxKHN0cnVjdCBkcmJkX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKiwKIAkJCQkgaW50KTsKICNkZWZpbmUgZHJiZF9mcmVlX3BlZXJfcmVxKG0sZSkgX19kcmJkX2ZyZWVfcGVlcl9yZXEobSwgZSwgMCkKICNkZWZpbmUgZHJiZF9mcmVlX25ldF9wZWVyX3JlcShtLGUpIF9fZHJiZF9mcmVlX3BlZXJfcmVxKG0sIGUsIDEpCi1leHRlcm4gc3RydWN0IHBhZ2UgKmRyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqLCB1bnNpZ25lZCBpbnQsIGJvb2wpOwotZXh0ZXJuIHZvaWQgZHJiZF9zZXRfcmVjdl90Y3Eoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IHRjcV9lbmFibGVkKTsKLWV4dGVybiB2b2lkIF9kcmJkX2NsZWFyX2RvbmVfZWUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGxpc3RfaGVhZCAqdG9fYmVfZnJlZWQpOwotZXh0ZXJuIHZvaWQgY29ubl9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiBpbnQgZHJiZF9jb25uZWN0ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKLXsKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZShtZGV2LT50Y29ubik7Ci19CitleHRlcm4gc3RydWN0IHBhZ2UgKmRyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKiwgdW5zaWduZWQgaW50LCBib29sKTsKK2V4dGVybiB2b2lkIGRyYmRfc2V0X3JlY3ZfdGNxKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgdGNxX2VuYWJsZWQpOworZXh0ZXJuIHZvaWQgX2RyYmRfY2xlYXJfZG9uZV9lZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9fYmVfZnJlZWQpOworZXh0ZXJuIGludCBkcmJkX2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqKTsKIAogLyogWWVzLCB0aGVyZSBpcyBrZXJuZWxfc2V0c29ja29wdCwgYnV0IG9ubHkgc2luY2UgMi42LjE4LgogICogU28gd2UgaGF2ZSBvdXIgb3duIGNvcHkgb2YgaXQgaGVyZS4gKi8KQEAgLTE2MTMsNyArMTQwMSw3IEBACiAJCQkoY2hhciopJnZhbCwgc2l6ZW9mKHZhbCkpOwogfQogCi12b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3byk7Cit2b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIHdyaXRlX29yZGVyaW5nX2Ugd28pOwogCiAvKiBkcmJkX3Byb2MuYyAqLwogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHJiZF9wcm9jOwpAQCAtMTYyMiwyOSArMTQxMCwyOSBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfcm9sZV9zdHIoZW51bSBkcmJkX3JvbGUgcyk7CiAKIC8qIGRyYmRfYWN0bG9nLmMgKi8KLWV4dGVybiBpbnQgZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBib29sIGRlbGVnYXRlKTsKLWV4dGVybiBib29sIGRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpOwotZXh0ZXJuIHZvaWQgZHJiZF9hbF9iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FsX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX2ludGVydmFsICppKTsKLWV4dGVybiB2b2lkIGRyYmRfcnNfY29tcGxldGVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKTsKLWV4dGVybiBpbnQgZHJiZF9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpOwotZXh0ZXJuIGludCBkcmJkX3RyeV9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IpOwotZXh0ZXJuIHZvaWQgZHJiZF9yc19jYW5jZWxfYWxsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGludCBkcmJkX3JzX2RlbF9hbGwoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorZXh0ZXJuIGludCBkcmJkX2FsX2JlZ2luX2lvX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgYm9vbCBkZWxlZ2F0ZSk7CitleHRlcm4gYm9vbCBkcmJkX2FsX2JlZ2luX2lvX2Zhc3RwYXRoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSwgYm9vbCBkZWxlZ2F0ZSk7CitleHRlcm4gdm9pZCBkcmJkX2FsX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSk7CitleHRlcm4gdm9pZCBkcmJkX3JzX2NvbXBsZXRlX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpOworZXh0ZXJuIGludCBkcmJkX3JzX2JlZ2luX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzZWN0b3JfdCBzZWN0b3IpOworZXh0ZXJuIGludCBkcmJkX3RyeV9yc19iZWdpbl9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKTsKK2V4dGVybiB2b2lkIGRyYmRfcnNfY2FuY2VsX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gaW50IGRyYmRfcnNfZGVsX2FsbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gdm9pZCBkcmJkX3JzX2ZhaWxlZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBkcmJkX2FkdmFuY2VfcnNfbWFya3Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBzdGlsbF90b19nbyk7Ci1leHRlcm4gdm9pZCBfX2RyYmRfc2V0X2luX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLAorZXh0ZXJuIHZvaWQgZHJiZF9hZHZhbmNlX3JzX21hcmtzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBsb25nIHN0aWxsX3RvX2dvKTsKK2V4dGVybiB2b2lkIF9fZHJiZF9zZXRfaW5fc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAogCQlpbnQgc2l6ZSwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpOwotI2RlZmluZSBkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSkgXAotCV9fZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXykKLWV4dGVybiBpbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisjZGVmaW5lIGRyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHNpemUpIFwKKwlfX2RyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXykKK2V4dGVybiBpbnQgX19kcmJkX3NldF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAogCQlpbnQgc2l6ZSwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgdW5zaWduZWQgaW50IGxpbmUpOwotI2RlZmluZSBkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCBzZWN0b3IsIHNpemUpIFwKLQlfX2RyYmRfc2V0X291dF9vZl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQotZXh0ZXJuIHZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci1leHRlcm4gaW50IGRyYmRfaW5pdGlhbGl6ZV9hbChzdHJ1Y3QgZHJiZF9jb25mICosIHZvaWQgKik7CisjZGVmaW5lIGRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKSBcCisJX19kcmJkX3NldF9vdXRfb2Zfc3luYyhkZXZpY2UsIHNlY3Rvciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQorZXh0ZXJuIHZvaWQgZHJiZF9hbF9zaHJpbmsoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGludCBkcmJkX2luaXRpYWxpemVfYWwoc3RydWN0IGRyYmRfZGV2aWNlICosIHZvaWQgKik7CiAKIC8qIGRyYmRfbmwuYyAqLwogLyogc3RhdGUgaW5mbyBicm9hZGNhc3QgKi8KQEAgLTE2NjEsNyArMTQ0OSw3IEBACiAJCX07CiAJfTsKIH07Ci12b2lkIGRyYmRfYmNhc3RfZXZlbnQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3Qgc3RydWN0IHNpYl9pbmZvICpzaWIpOwordm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBzdHJ1Y3Qgc2liX2luZm8gKnNpYik7CiAKIC8qCiAgKiBpbmxpbmUgaGVscGVyIGZ1bmN0aW9ucwpAQCAtMTY5MCwyNiArMTQ3OCwyNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGVudW0gZHJiZF9zdGF0ZV9ydgotX2RyYmRfc2V0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCitfZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzLCBzdHJ1Y3QgY29tcGxldGlvbiAqZG9uZSkKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKIAlyZWFkX2xvY2soJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlydiA9IF9fZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIGZsYWdzLCBkb25lKTsKKwlydiA9IF9fZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZmxhZ3MsIGRvbmUpOwogCXJlYWRfdW5sb2NrKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5pb24gZHJiZF9zdGF0ZSBkcmJkX3JlYWRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdW5pb24gZHJiZF9zdGF0ZSBkcmJkX3JlYWRfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKIAl1bmlvbiBkcmJkX3N0YXRlIHJ2OwogCi0JcnYuaSA9IG1kZXYtPnN0YXRlLmk7Ci0JcnYuc3VzcCA9IG1kZXYtPnRjb25uLT5zdXNwOwotCXJ2LnN1c3Bfbm9kID0gbWRldi0+dGNvbm4tPnN1c3Bfbm9kOwotCXJ2LnN1c3BfZmVuID0gbWRldi0+dGNvbm4tPnN1c3BfZmVuOworCXJ2LmkgPSBkZXZpY2UtPnN0YXRlLmk7CisJcnYuc3VzcCA9IHJlc291cmNlLT5zdXNwOworCXJ2LnN1c3Bfbm9kID0gcmVzb3VyY2UtPnN1c3Bfbm9kOworCXJ2LnN1c3BfZmVuID0gcmVzb3VyY2UtPnN1c3BfZmVuOwogCiAJcmV0dXJuIHJ2OwogfQpAQCAtMTcyMiwyMiArMTUxMSwyMiBAQAogfTsKIAogI2RlZmluZSBfX2RyYmRfY2hrX2lvX2Vycm9yKG0sZikgX19kcmJkX2Noa19pb19lcnJvcl8obSxmLCBfX2Z1bmNfXykKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RyYmRfY2hrX2lvX2Vycm9yXyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIF9fZHJiZF9jaGtfaW9fZXJyb3JfKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQllbnVtIGRyYmRfZm9yY2VfZGV0YWNoX2ZsYWdzIGRmLAogCQljb25zdCBjaGFyICp3aGVyZSkKIHsKIAllbnVtIGRyYmRfaW9fZXJyb3JfcCBlcDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQllcCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5vbl9pb19lcnJvcjsKKwllcCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPm9uX2lvX2Vycm9yOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoZXApIHsKIAljYXNlIEVQX1BBU1NfT046IC8qIEZJWE1FIHdvdWxkIHRoaXMgYmUgYmV0dGVyIG5hbWVkICJJZ25vcmUiPyAqLwogCQlpZiAoZGYgPT0gRFJCRF9SRUFEX0VSUk9SIHx8IGRmID09IERSQkRfV1JJVEVfRVJST1IpIHsKIAkJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJCWRldl9lcnIoREVWLCAiTG9jYWwgSU8gZmFpbGVkIGluICVzLlxuIiwgd2hlcmUpOwotCQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPiBEX0lOQ09OU0lTVEVOVCkKLQkJCQlfZHJiZF9zZXRfc3RhdGUoX05TKG1kZXYsIGRpc2ssIERfSU5DT05TSVNURU5UKSwgQ1NfSEFSRCwgTlVMTCk7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiTG9jYWwgSU8gZmFpbGVkIGluICVzLlxuIiwgd2hlcmUpOworCQkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA+IERfSU5DT05TSVNURU5UKQorCQkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBkaXNrLCBEX0lOQ09OU0lTVEVOVCksIENTX0hBUkQsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KIAkJLyogTk9URSBmYWxsIHRocm91Z2ggZm9yIERSQkRfTUVUQV9JT19FUlJPUiBvciBEUkJEX0ZPUkNFX0RFVEFDSCAqLwpAQCAtMTc2MywxNCArMTU1MiwxNCBAQAogCQkgKiB3ZSByZWFkIG1ldGEgZGF0YSBvbmx5IG9uY2UgZHVyaW5nIGF0dGFjaCwKIAkJICogd2hpY2ggd2lsbCBmYWlsIGluIGNhc2Ugb2YgZXJyb3JzLgogCQkgKi8KLQkJc2V0X2JpdChXQVNfSU9fRVJST1IsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoV0FTX0lPX0VSUk9SLCAmZGV2aWNlLT5mbGFncyk7CiAJCWlmIChkZiA9PSBEUkJEX1JFQURfRVJST1IpCi0JCQlzZXRfYml0KFdBU19SRUFEX0VSUk9SLCAmbWRldi0+ZmxhZ3MpOworCQkJc2V0X2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOwogCQlpZiAoZGYgPT0gRFJCRF9GT1JDRV9ERVRBQ0gpCi0JCQlzZXRfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKTsKLQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPiBEX0ZBSUxFRCkgewotCQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBkaXNrLCBEX0ZBSUxFRCksIENTX0hBUkQsIE5VTEwpOwotCQkJZGV2X2VycihERVYsCisJCQlzZXRfYml0KEZPUkNFX0RFVEFDSCwgJmRldmljZS0+ZmxhZ3MpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9GQUlMRUQpIHsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBkaXNrLCBEX0ZBSUxFRCksIENTX0hBUkQsIE5VTEwpOworCQkJZHJiZF9lcnIoZGV2aWNlLAogCQkJCSJMb2NhbCBJTyBmYWlsZWQgaW4gJXMuIERldGFjaGluZy4uLlxuIiwgd2hlcmUpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTc3OSwyMSArMTU2OCwyMSBAQAogCiAvKioKICAqIGRyYmRfY2hrX2lvX2Vycm9yOiBIYW5kbGUgdGhlIG9uX2lvX2Vycm9yIHNldHRpbmcsIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhbGwgaW8gY29tcGxldGlvbiBoYW5kbGVycwotICogQG1kZXY6CSBEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CSBEUkJEIGRldmljZS4KICAqIEBlcnJvcjoJIEVycm9yIGNvZGUgcGFzc2VkIHRvIHRoZSBJTyBjb21wbGV0aW9uIGNhbGxiYWNrCiAgKiBAZm9yY2VkZXRhY2g6IEZvcmNlIGRldGFjaC4gSS5lLiB0aGUgZXJyb3IgaGFwcGVuZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSBtZXRhIGRhdGEKICAqCiAgKiBTZWUgYWxzbyBkcmJkX21haW4uYzphZnRlcl9zdGF0ZV9jaCgpIGlmIChvcy5kaXNrID4gRF9GQUlMRUQgJiYgbnMuZGlzayA9PSBEX0ZBSUxFRCkKICAqLwogI2RlZmluZSBkcmJkX2Noa19pb19lcnJvcihtLGUsZikgZHJiZF9jaGtfaW9fZXJyb3JfKG0sZSxmLCBfX2Z1bmNfXykKLXN0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX2Noa19pb19lcnJvcl8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX2Noa19pb19lcnJvcl8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJaW50IGVycm9yLCBlbnVtIGRyYmRfZm9yY2VfZGV0YWNoX2ZsYWdzIGZvcmNlZGV0YWNoLCBjb25zdCBjaGFyICp3aGVyZSkKIHsKIAlpZiAoZXJyb3IpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOwotCQlfX2RyYmRfY2hrX2lvX2Vycm9yXyhtZGV2LCBmb3JjZWRldGFjaCwgd2hlcmUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3JfKGRldmljZSwgZm9yY2VkZXRhY2gsIHdoZXJlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTE5MTYsMzEgKzE3MDUsMzMgQEAKIAl3YWtlX3VwKCZxLT5xX3dhaXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9hc2VuZGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2V4dGVybiB2b2lkIGRyYmRfZmx1c2hfd29ya3F1ZXVlKHN0cnVjdCBkcmJkX3dvcmtfcXVldWUgKndvcmtfcXVldWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgd2FrZV9hc2VuZGVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JaWYgKHRlc3RfYml0KFNJR05BTF9BU0VOREVSLCAmdGNvbm4tPmZsYWdzKSkKLQkJZm9yY2Vfc2lnKERSQkRfU0lHLCB0Y29ubi0+YXNlbmRlci50YXNrKTsKKwlpZiAodGVzdF9iaXQoU0lHTkFMX0FTRU5ERVIsICZjb25uZWN0aW9uLT5mbGFncykpCisJCWZvcmNlX3NpZyhEUkJEX1NJRywgY29ubmVjdGlvbi0+YXNlbmRlci50YXNrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJlcXVlc3RfcGluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcmVxdWVzdF9waW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc2V0X2JpdChTRU5EX1BJTkcsICZ0Y29ubi0+ZmxhZ3MpOwotCXdha2VfYXNlbmRlcih0Y29ubik7CisJc2V0X2JpdChTRU5EX1BJTkcsICZjb25uZWN0aW9uLT5mbGFncyk7CisJd2FrZV9hc2VuZGVyKGNvbm5lY3Rpb24pOwogfQogCi1leHRlcm4gdm9pZCAqY29ubl9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfdGNvbm4gKiwgc3RydWN0IGRyYmRfc29ja2V0ICopOwotZXh0ZXJuIHZvaWQgKmRyYmRfcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX2NvbmYgKiwgc3RydWN0IGRyYmRfc29ja2V0ICopOwotZXh0ZXJuIGludCBjb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF90Y29ubiAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKiwKK2V4dGVybiB2b2lkICpjb25uX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHN0cnVjdCBkcmJkX3NvY2tldCAqKTsKK2V4dGVybiB2b2lkICpkcmJkX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKik7CitleHRlcm4gaW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgc3RydWN0IGRyYmRfc29ja2V0ICosCiAJCQkgICAgIGVudW0gZHJiZF9wYWNrZXQsIHVuc2lnbmVkIGludCwgdm9pZCAqLAogCQkJICAgICB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25mICosIHN0cnVjdCBkcmJkX3NvY2tldCAqLAorZXh0ZXJuIGludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKiwKIAkJCSAgICAgZW51bSBkcmJkX3BhY2tldCwgdW5zaWduZWQgaW50LCB2b2lkICosCiAJCQkgICAgIHVuc2lnbmVkIGludCk7CiAKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWV4dGVybiBpbnQgZHJiZF9zZW5kX3BpbmdfYWNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1leHRlcm4gaW50IGRyYmRfc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKLWV4dGVybiBpbnQgY29ubl9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF90Y29ubiAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitleHRlcm4gaW50IGRyYmRfc2VuZF9waW5nX2FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2V4dGVybiBpbnQgZHJiZF9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqLCB1bmlvbiBkcmJkX3N0YXRlLCB1bmlvbiBkcmJkX3N0YXRlKTsKK2V4dGVybiBpbnQgY29ubl9zZW5kX3N0YXRlX3JlcShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHVuaW9uIGRyYmRfc3RhdGUsIHVuaW9uIGRyYmRfc3RhdGUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJiZF90aHJlYWRfc3RvcChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKQEAgLTE5NzksMjIgKzE3NzAsMjIgQEAKICAqICBfcmVxX21vZChyZXEsIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKQogICogICAgIFtmcm9tIHRsX2NsZWFyX2JhcnJpZXJdCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbmNfYXBfcGVuZGluZyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGluY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWF0b21pY19pbmMoJm1kZXYtPmFwX3BlbmRpbmdfY250KTsKKwlhdG9taWNfaW5jKCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KTsKIH0KIAogI2RlZmluZSBFUlJfSUZfQ05UX0lTX05FR0FUSVZFKHdoaWNoLCBmdW5jLCBsaW5lKQkJCVwKLQlpZiAoYXRvbWljX3JlYWQoJm1kZXYtPndoaWNoKSA8IDApCQkJCVwKLQkJZGV2X2VycihERVYsICJpbiAlczolZDogIiAjd2hpY2ggIiA9ICVkIDwgMCAhXG4iLAlcCisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPndoaWNoKSA8IDApCQkJCVwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiaW4gJXM6JWQ6ICIgI3doaWNoICIgPSAlZCA8IDAgIVxuIiwJXAogCQkJZnVuYywgbGluZSwJCQkJCVwKLQkJCWF0b21pY19yZWFkKCZtZGV2LT53aGljaCkpCisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT53aGljaCkpCiAKLSNkZWZpbmUgZGVjX2FwX3BlbmRpbmcobWRldikgX2RlY19hcF9wZW5kaW5nKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfYXBfcGVuZGluZyhkZXZpY2UpIF9kZWNfYXBfcGVuZGluZyhkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY19hcF9wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRldi0+YXBfcGVuZGluZ19jbnQpKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KSkKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCUVSUl9JRl9DTlRfSVNfTkVHQVRJVkUoYXBfcGVuZGluZ19jbnQsIGZ1bmMsIGxpbmUpOwogfQogCkBAIC0yMDA0LDE1ICsxNzk1LDE1IEBACiAgKiBDX1NZTkNfU09VUkNFIHNlbmRzIFBfUlNfREFUQV9SRVBMWSAgIChhbmQgZXhwZWN0cyBQX1dSSVRFX0FDSyB3aXRoIElEX1NZTkNFUikKICAqCQkJCQkgICAob3IgUF9ORUdfQUNLIHdpdGggSURfU1lOQ0VSKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX3JzX3BlbmRpbmcoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfcnNfcGVuZGluZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlhdG9taWNfaW5jKCZtZGV2LT5yc19wZW5kaW5nX2NudCk7CisJYXRvbWljX2luYygmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiB9CiAKLSNkZWZpbmUgZGVjX3JzX3BlbmRpbmcobWRldikgX2RlY19yc19wZW5kaW5nKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY19yc19wZW5kaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfcnNfcGVuZGluZyhkZXZpY2UpIF9kZWNfcnNfcGVuZGluZyhkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY19yc19wZW5kaW5nKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlhdG9taWNfZGVjKCZtZGV2LT5yc19wZW5kaW5nX2NudCk7CisJYXRvbWljX2RlYygmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiAJRVJSX0lGX0NOVF9JU19ORUdBVElWRShyc19wZW5kaW5nX2NudCwgZnVuYywgbGluZSk7CiB9CiAKQEAgLTIwMjUsMTAzICsxODE2LDEwNCBAQAogICogIHJlY2VpdmVfRGF0YVJlcXVlc3QgKHJlY2VpdmVfUlNEYXRhUmVxdWVzdCkgd2UgbmVlZCB0byBzZW5kIGJhY2sgUF9EQVRBCiAgKiAgcmVjZWl2ZV9CYXJyaWVyXyoJd2UgbmVlZCB0byBzZW5kIGEgUF9CQVJSSUVSX0FDSwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX3VuYWNrZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfdW5hY2tlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlhdG9taWNfaW5jKCZtZGV2LT51bmFja2VkX2NudCk7CisJYXRvbWljX2luYygmZGV2aWNlLT51bmFja2VkX2NudCk7CiB9CiAKLSNkZWZpbmUgZGVjX3VuYWNrZWQobWRldikgX2RlY191bmFja2VkKG1kZXYsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX2RlY191bmFja2VkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQorI2RlZmluZSBkZWNfdW5hY2tlZChkZXZpY2UpIF9kZWNfdW5hY2tlZChkZXZpY2UsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCitzdGF0aWMgaW5saW5lIHZvaWQgX2RlY191bmFja2VkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlhdG9taWNfZGVjKCZtZGV2LT51bmFja2VkX2NudCk7CisJYXRvbWljX2RlYygmZGV2aWNlLT51bmFja2VkX2NudCk7CiAJRVJSX0lGX0NOVF9JU19ORUdBVElWRSh1bmFja2VkX2NudCwgZnVuYywgbGluZSk7CiB9CiAKLSNkZWZpbmUgc3ViX3VuYWNrZWQobWRldiwgbikgX3N1Yl91bmFja2VkKG1kZXYsIG4sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi1zdGF0aWMgaW5saW5lIHZvaWQgX3N1Yl91bmFja2VkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBuLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKKyNkZWZpbmUgc3ViX3VuYWNrZWQoZGV2aWNlLCBuKSBfc3ViX3VuYWNrZWQoZGV2aWNlLCBuLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorc3RhdGljIGlubGluZSB2b2lkIF9zdWJfdW5hY2tlZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IG4sIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQogewotCWF0b21pY19zdWIobiwgJm1kZXYtPnVuYWNrZWRfY250KTsKKwlhdG9taWNfc3ViKG4sICZkZXZpY2UtPnVuYWNrZWRfY250KTsKIAlFUlJfSUZfQ05UX0lTX05FR0FUSVZFKHVuYWNrZWRfY250LCBmdW5jLCBsaW5lKTsKIH0KIAogLyoqCi0gKiBnZXRfbGRldigpIC0gSW5jcmVhc2UgdGhlIHJlZiBjb3VudCBvbiBtZGV2LT5sZGV2LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbGRldgorICogZ2V0X2xkZXYoKSAtIEluY3JlYXNlIHRoZSByZWYgY291bnQgb24gZGV2aWNlLT5sZGV2LiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMgbm8gbGRldgogICogQE06CQlEUkJEIGRldmljZS4KICAqCi0gKiBZb3UgaGF2ZSB0byBjYWxsIHB1dF9sZGV2KCkgd2hlbiBmaW5pc2hlZCB3b3JraW5nIHdpdGggbWRldi0+bGRldi4KKyAqIFlvdSBoYXZlIHRvIGNhbGwgcHV0X2xkZXYoKSB3aGVuIGZpbmlzaGVkIHdvcmtpbmcgd2l0aCBkZXZpY2UtPmxkZXYuCiAgKi8KICNkZWZpbmUgZ2V0X2xkZXYoTSkgX19jb25kX2xvY2sobG9jYWwsIF9nZXRfbGRldl9pZl9zdGF0ZShNLERfSU5DT05TSVNURU5UKSkKICNkZWZpbmUgZ2V0X2xkZXZfaWZfc3RhdGUoTSxNSU5TKSBfX2NvbmRfbG9jayhsb2NhbCwgX2dldF9sZGV2X2lmX3N0YXRlKE0sTUlOUykpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbGRldihzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIHB1dF9sZGV2KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWludCBpID0gYXRvbWljX2RlY19yZXR1cm4oJm1kZXYtPmxvY2FsX2NudCk7CisJaW50IGkgPSBhdG9taWNfZGVjX3JldHVybigmZGV2aWNlLT5sb2NhbF9jbnQpOwogCiAJLyogVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gc29tZSBlbmRpbyBoYW5kbGVyLAogCSAqIHNvIHdlIG11c3Qgbm90IHNsZWVwIGhlcmUuICovCiAKIAlfX3JlbGVhc2UobG9jYWwpOwotCURfQVNTRVJUKGkgPj0gMCk7CisJRF9BU1NFUlQoZGV2aWNlLCBpID49IDApOwogCWlmIChpID09IDApIHsKLQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTKQogCQkJLyogZXZlbiBpbnRlcm5hbCByZWZlcmVuY2VzIGdvbmUsIHNhZmUgdG8gZGVzdHJveSAqLwotCQkJZHJiZF9sZGV2X2Rlc3Ryb3kobWRldik7Ci0JCWlmIChtZGV2LT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKSB7CisJCQlkcmJkX2xkZXZfZGVzdHJveShkZXZpY2UpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKSB7CiAJCQkvKiBhbGwgYXBwbGljYXRpb24gSU8gcmVmZXJlbmNlcyBnb25lLiAqLwotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEdPX0RJU0tMRVNTLCAmbWRldi0+ZmxhZ3MpKQotCQkJCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+Z29fZGlza2xlc3MpOworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEdPX0RJU0tMRVNTLCAmZGV2aWNlLT5mbGFncykpCisJCQkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSZkZXZpY2UtPmdvX2Rpc2tsZXNzKTsKIAkJfQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAJfQogfQogCiAjaWZuZGVmIF9fQ0hFQ0tFUl9fCi1zdGF0aWMgaW5saW5lIGludCBfZ2V0X2xkZXZfaWZfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKK3N0YXRpYyBpbmxpbmUgaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKIHsKIAlpbnQgaW9fYWxsb3dlZDsKIAogCS8qIG5ldmVyIGdldCBhIHJlZmVyZW5jZSB3aGlsZSBEX0RJU0tMRVNTICovCi0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUykKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MpCiAJCXJldHVybiAwOwogCi0JYXRvbWljX2luYygmbWRldi0+bG9jYWxfY250KTsKLQlpb19hbGxvd2VkID0gKG1kZXYtPnN0YXRlLmRpc2sgPj0gbWlucyk7CisJYXRvbWljX2luYygmZGV2aWNlLT5sb2NhbF9jbnQpOworCWlvX2FsbG93ZWQgPSAoZGV2aWNlLT5zdGF0ZS5kaXNrID49IG1pbnMpOwogCWlmICghaW9fYWxsb3dlZCkKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJcmV0dXJuIGlvX2FsbG93ZWQ7CiB9CiAjZWxzZQotZXh0ZXJuIGludCBfZ2V0X2xkZXZfaWZfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucyk7CitleHRlcm4gaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucyk7CiAjZW5kaWYKIAogLyogeW91IG11c3QgaGF2ZSBhbiAiZ2V0X2xkZXYiIHJlZmVyZW5jZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIGRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJdW5zaWduZWQgbG9uZyAqYml0c19sZWZ0LCB1bnNpZ25lZCBpbnQgKnBlcl9taWxfZG9uZSkKIHsKIAkvKiB0aGlzIGlzIHRvIGJyZWFrIGl0IGF0IGNvbXBpbGUgdGltZSB3aGVuIHdlIGNoYW5nZSB0aGF0LCBpbiBjYXNlIHdlCiAJICogd2FudCB0byBzdXBwb3J0IG1vcmUgdGhhbiAoMTw8MzIpIGJpdHMgb24gYSAzMmJpdCBhcmNoLiAqLwotCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBtZGV2LT5yc190b3RhbCk7CisJdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGRldmljZS0+cnNfdG90YWwpOwogCiAJLyogbm90ZTogYm90aCByc190b3RhbCBhbmQgcnNfbGVmdCBhcmUgaW4gYml0cywgaS5lLiBpbgogCSAqIHVuaXRzIG9mIEJNX0JMT0NLX1NJWkUuCiAJICogZm9yIHRoZSBwZXJjZW50YWdlLCB3ZSBkb24ndCBjYXJlLiAqLwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCSpiaXRzX2xlZnQgPSBtZGV2LT5vdl9sZWZ0OworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkKKwkJKmJpdHNfbGVmdCA9IGRldmljZS0+b3ZfbGVmdDsKIAllbHNlCi0JCSpiaXRzX2xlZnQgPSBkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSAtIG1kZXYtPnJzX2ZhaWxlZDsKKwkJKmJpdHNfbGVmdCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgLSBkZXZpY2UtPnJzX2ZhaWxlZDsKIAkvKiA+PiAxMCB0byBwcmV2ZW50IG92ZXJmbG93LAogCSAqICsxIHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybyAqLwotCWlmICgqYml0c19sZWZ0ID4gbWRldi0+cnNfdG90YWwpIHsKKwlpZiAoKmJpdHNfbGVmdCA+IGRldmljZS0+cnNfdG90YWwpIHsKIAkJLyogZG9oLiBtYXliZSBhIGxvZ2ljIGJ1ZyBzb21ld2hlcmUuCiAJCSAqIG1heSBhbHNvIGJlIGp1c3QgYSByYWNlIGNvbmRpdGlvbgogCQkgKiBiZXR3ZWVuIHRoaXMgYW5kIGEgZGlzY29ubmVjdCBkdXJpbmcgc3luYy4KIAkJICogZm9yIG5vdywganVzdCBwcmV2ZW50IGluLWtlcm5lbCBidWZmZXIgb3ZlcmZsb3cuCiAJCSAqLwogCQlzbXBfcm1iKCk7Ci0JCWRldl93YXJuKERFViwgImNzOiVzIHJzX2xlZnQ9JWx1ID4gcnNfdG90YWw9JWx1IChyc19mYWlsZWQgJWx1KVxuIiwKLQkJCQlkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pLAotCQkJCSpiaXRzX2xlZnQsIG1kZXYtPnJzX3RvdGFsLCBtZGV2LT5yc19mYWlsZWQpOworCQlkcmJkX3dhcm4oZGV2aWNlLCAiY3M6JXMgcnNfbGVmdD0lbHUgPiByc190b3RhbD0lbHUgKHJzX2ZhaWxlZCAlbHUpXG4iLAorCQkJCWRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSwKKwkJCQkqYml0c19sZWZ0LCBkZXZpY2UtPnJzX3RvdGFsLCBkZXZpY2UtPnJzX2ZhaWxlZCk7CiAJCSpwZXJfbWlsX2RvbmUgPSAwOwogCX0gZWxzZSB7CiAJCS8qIE1ha2Ugc3VyZSB0aGUgZGl2aXNpb24gaGFwcGVucyBpbiBsb25nIGNvbnRleHQuCkBAIC0yMTMzLDkgKzE5MjUsOSBAQAogCQkgKiBOb3RlOiBjdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBzdWNoIGxhcmdlIGJpdG1hcHMgb24gMzJiaXQKIAkJICogYXJjaCBhbnl3YXlzLCBidXQgbm8gaGFybSBkb25lIHRvIGJlIHByZXBhcmVkIGZvciBpdCBoZXJlLgogCQkgKi8KLQkJdW5zaWduZWQgaW50IHNoaWZ0ID0gbWRldi0+cnNfdG90YWwgPiBVSU5UX01BWCA/IDE2IDogMTA7CisJCXVuc2lnbmVkIGludCBzaGlmdCA9IGRldmljZS0+cnNfdG90YWwgPiBVSU5UX01BWCA/IDE2IDogMTA7CiAJCXVuc2lnbmVkIGxvbmcgbGVmdCA9ICpiaXRzX2xlZnQgPj4gc2hpZnQ7Ci0JCXVuc2lnbmVkIGxvbmcgdG90YWwgPSAxVUwgKyAobWRldi0+cnNfdG90YWwgPj4gc2hpZnQpOworCQl1bnNpZ25lZCBsb25nIHRvdGFsID0gMVVMICsgKGRldmljZS0+cnNfdG90YWwgPj4gc2hpZnQpOwogCQl1bnNpZ25lZCBsb25nIHRtcCA9IDEwMDBVTCAtIGxlZnQgKiAxMDAwVUwvdG90YWw7CiAJCSpwZXJfbWlsX2RvbmUgPSB0bXA7CiAJfQpAQCAtMjE0NSwyMiArMTkzNywyMiBAQAogLyogdGhpcyB0aHJvdHRsZXMgb24tdGhlLWZseSBhcHBsaWNhdGlvbiByZXF1ZXN0cwogICogYWNjb3JkaW5nIHRvIG1heF9idWZmZXJzIHNldHRpbmdzOwogICogbWF5YmUgcmUtaW1wbGVtZW50IHVzaW5nIHNlbWFwaG9yZXM/ICovCi1zdGF0aWMgaW5saW5lIGludCBkcmJkX2dldF9tYXhfYnVmZmVycyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9nZXRfbWF4X2J1ZmZlcnMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgbXhiOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCW14YiA9IG5jID8gbmMtPm1heF9idWZmZXJzIDogMTAwMDAwMDsgIC8qIGFyYml0cmFyeSBsaW1pdCBvbiBvcGVuIHJlcXVlc3RzICovCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gbXhiOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkcmJkX3N0YXRlX2lzX3N0YWJsZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9zdGF0ZV9pc19zdGFibGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JdW5pb24gZHJiZF9kZXZfc3RhdGUgcyA9IG1kZXYtPnN0YXRlOworCXVuaW9uIGRyYmRfZGV2X3N0YXRlIHMgPSBkZXZpY2UtPnN0YXRlOwogCiAJLyogRE8gTk9UIGFkZCBhIGRlZmF1bHQgY2xhdXNlLCB3ZSB3YW50IHRoZSBjb21waWxlciB0byB3YXJuIHVzCiAJICogZm9yIGFueSBuZXdseSBpbnRyb2R1Y2VkIHN0YXRlIHdlIG1heSBoYXZlIGZvcmdvdHRlbiB0byBhZGQgaGVyZSAqLwpAQCAtMjE5NCw3ICsxOTg2LDcgQEAKIAogCQkvKiBBbGxvdyBJTyBpbiBCTSBleGNoYW5nZSBzdGF0ZXMgd2l0aCBuZXcgcHJvdG9jb2xzICovCiAJY2FzZSBDX1dGX0JJVE1BUF9TOgotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2KQorCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCiAJCQlyZXR1cm4gMDsKIAkJYnJlYWs7CiAKQEAgLTIyMjgsMjAgKzIwMjAsMjAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHJiZF9zdXNwZW5kZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgaW50IGRyYmRfc3VzcGVuZGVkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IGRldmljZS0+cmVzb3VyY2U7CiAKLQlyZXR1cm4gdGNvbm4tPnN1c3AgfHwgdGNvbm4tPnN1c3BfZmVuIHx8IHRjb25uLT5zdXNwX25vZDsKKwlyZXR1cm4gcmVzb3VyY2UtPnN1c3AgfHwgcmVzb3VyY2UtPnN1c3BfZmVuIHx8IHJlc291cmNlLT5zdXNwX25vZDsKIH0KIAotc3RhdGljIGlubGluZSBib29sIG1heV9pbmNfYXBfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgbWF5X2luY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKG1kZXYpOworCWludCBteGIgPSBkcmJkX2dldF9tYXhfYnVmZmVycyhkZXZpY2UpOwogCi0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKQorCWlmIChkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHRlc3RfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KFNVU1BFTkRfSU8sICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogdG8gYXZvaWQgcG90ZW50aWFsIGRlYWRsb2NrIG9yIGJpdG1hcCBjb3JydXB0aW9uLApAQCAtMjI0OSwzMiArMjA0MSwzMiBAQAogCSAqIHRvIHN0YXJ0IGR1cmluZyAic3RhYmxlIiBzdGF0ZXMuICovCiAKIAkvKiBubyBuZXcgaW8gYWNjZXB0ZWQgd2hlbiBhdHRhY2hpbmcgb3IgZGV0YWNoaW5nIHRoZSBkaXNrICovCi0JaWYgKCFkcmJkX3N0YXRlX2lzX3N0YWJsZShtZGV2KSkKKwlpZiAoIWRyYmRfc3RhdGVfaXNfc3RhYmxlKGRldmljZSkpCiAJCXJldHVybiBmYWxzZTsKIAogCS8qIHNpbmNlIHNvbWUgb2xkZXIga2VybmVscyBkb24ndCBoYXZlIGF0b21pY19hZGRfdW5sZXNzLAogCSAqIGFuZCB3ZSBhcmUgd2l0aGluIHRoZSBzcGlubG9jayBhbnl3YXlzLCB3ZSBoYXZlIHRoaXMgd29ya2Fyb3VuZC4gICovCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSA+IG14YikKKwlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+YXBfYmlvX2NudCkgPiBteGIpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAodGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaW5jX2FwX2Jpb19jb25kKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgaW5jX2FwX2Jpb19jb25kKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWJvb2wgcnYgPSBmYWxzZTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JcnYgPSBtYXlfaW5jX2FwX2JpbyhtZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcnYgPSBtYXlfaW5jX2FwX2JpbyhkZXZpY2UpOwogCWlmIChydikKLQkJYXRvbWljX2luYygmbWRldi0+YXBfYmlvX2NudCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlhdG9taWNfaW5jKCZkZXZpY2UtPmFwX2Jpb19jbnQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX2FwX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGluY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJLyogd2Ugd2FpdCBoZXJlCiAJICogICAgYXMgbG9uZyBhcyB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZApAQCAtMjI4NCw0MiArMjA3Niw0NCBAQAogCSAqIHRvIGF2b2lkIHJhY2VzIHdpdGggdGhlIHJlY29ubmVjdCBjb2RlLAogCSAqIHdlIG5lZWQgdG8gYXRvbWljX2luYyB3aXRoaW4gdGhlIHNwaW5sb2NrLiAqLwogCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsIGluY19hcF9iaW9fY29uZChtZGV2KSk7CisJd2FpdF9ldmVudChkZXZpY2UtPm1pc2Nfd2FpdCwgaW5jX2FwX2Jpb19jb25kKGRldmljZSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVjX2FwX2JpbyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGRlY19hcF9iaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKG1kZXYpOwotCWludCBhcF9iaW8gPSBhdG9taWNfZGVjX3JldHVybigmbWRldi0+YXBfYmlvX2NudCk7CisJaW50IG14YiA9IGRyYmRfZ2V0X21heF9idWZmZXJzKGRldmljZSk7CisJaW50IGFwX2JpbyA9IGF0b21pY19kZWNfcmV0dXJuKCZkZXZpY2UtPmFwX2Jpb19jbnQpOwogCi0JRF9BU1NFUlQoYXBfYmlvID49IDApOworCURfQVNTRVJUKGRldmljZSwgYXBfYmlvID49IDApOwogCi0JaWYgKGFwX2JpbyA9PSAwICYmIHRlc3RfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKSkgewotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQklUTUFQX0lPX1FVRVVFRCwgJm1kZXYtPmZsYWdzKSkKLQkJCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+Ym1faW9fd29yay53KTsKKwlpZiAoYXBfYmlvID09IDAgJiYgdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpIHsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZkZXZpY2UtPmZsYWdzKSkKKwkJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+CisJCQkJY29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJJmRldmljZS0+Ym1faW9fd29yay53KTsKIAl9CiAKIAkvKiB0aGlzIGN1cnJlbnRseSBkb2VzIHdha2VfdXAgZm9yIGV2ZXJ5IGRlY19hcF9iaW8hCiAJICogbWF5YmUgcmF0aGVyIGludHJvZHVjZSBzb21lIHR5cGUgb2YgaHlzdGVyZXNpcz8KIAkgKiBlLmcuIChhcF9iaW8gPT0gbXhiLzIgfHwgYXBfYmlvID09IDApID8gKi8KIAlpZiAoYXBfYmlvIDwgbXhiKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW5saW5lIGJvb2wgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlyZXR1cm4gbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5NyAmJgotCQltZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uICE9IDEwMDsKKwlyZXR1cm4gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk3ICYmCisJCWZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiAhPSAxMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfc2V0X2VkX3V1aWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IHZhbCkKK3N0YXRpYyBpbmxpbmUgaW50IGRyYmRfc2V0X2VkX3V1aWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHU2NCB2YWwpCiB7Ci0JaW50IGNoYW5nZWQgPSBtZGV2LT5lZF91dWlkICE9IHZhbDsKLQltZGV2LT5lZF91dWlkID0gdmFsOworCWludCBjaGFuZ2VkID0gZGV2aWNlLT5lZF91dWlkICE9IHZhbDsKKwlkZXZpY2UtPmVkX3V1aWQgPSB2YWw7CiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRyYmRfcXVldWVfb3JkZXJfdHlwZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGlubGluZSBpbnQgZHJiZF9xdWV1ZV9vcmRlcl90eXBlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIHNvcnJ5LCB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3b3JraW5nIGltcGxlbWVudGF0aW9uCiAJICogb2YgZGlzdHJpYnV0ZWQgVENRIHN0dWZmICovCkBAIC0yMzI5LDIzICsyMTIzLDI5IEBACiAJcmV0dXJuIFFVRVVFX09SREVSRURfTk9ORTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRyYmRfbWRfZmx1c2goc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX21kX2ZsdXNoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCByOwogCi0JaWYgKG1kZXYtPmxkZXYgPT0gTlVMTCkgewotCQlkZXZfd2FybihERVYsICJtZGV2LT5sZGV2ID09IE5VTEwgaW4gZHJiZF9tZF9mbHVzaFxuIik7CisJaWYgKGRldmljZS0+bGRldiA9PSBOVUxMKSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJkZXZpY2UtPmxkZXYgPT0gTlVMTCBpbiBkcmJkX21kX2ZsdXNoXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICh0ZXN0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlyID0gYmxrZGV2X2lzc3VlX2ZsdXNoKG1kZXYtPmxkZXYtPm1kX2JkZXYsIEdGUF9OT0lPLCBOVUxMKTsKKwlyID0gYmxrZGV2X2lzc3VlX2ZsdXNoKGRldmljZS0+bGRldi0+bWRfYmRldiwgR0ZQX05PSU8sIE5VTEwpOwogCWlmIChyKSB7Ci0JCXNldF9iaXQoTURfTk9fRlVBLCAmbWRldi0+ZmxhZ3MpOwotCQlkZXZfZXJyKERFViwgIm1ldGEgZGF0YSBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQsIGRpc2FibGluZyBtZC1mbHVzaGVzXG4iLCByKTsKKwkJc2V0X2JpdChNRF9OT19GVUEsICZkZXZpY2UtPmZsYWdzKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YSBkYXRhIGZsdXNoIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCwgZGlzYWJsaW5nIG1kLWZsdXNoZXNcbiIsIHIpOwogCX0KIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpmaXJzdF9jb25uZWN0aW9uKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmcmVzb3VyY2UtPmNvbm5lY3Rpb25zLAorCQkJCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMKaW5kZXggOTI5NDY4ZS4uMzMxZTVjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX21haW4uYwpAQCAtNTIsMTYgKzUyLDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9kcmJkX2xpbWl0cy5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiIC8qIG9ubHkgZm9yIF9yZXFfbW9kIGluIHRsX3JlbGVhc2UgYW5kIHRsX2NsZWFyICovCiAKICNpbmNsdWRlICJkcmJkX3ZsaS5oIgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGRyYmRfbWFpbl9tdXRleCk7Ci1pbnQgZHJiZGRfaW5pdChzdHJ1Y3QgZHJiZF90aHJlYWQgKik7Ci1pbnQgZHJiZF93b3JrZXIoc3RydWN0IGRyYmRfdGhyZWFkICopOwotaW50IGRyYmRfYXNlbmRlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKik7Ci0KLWludCBkcmJkX2luaXQodm9pZCk7CiBzdGF0aWMgaW50IGRyYmRfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpOwogc3RhdGljIHZvaWQgZHJiZF9yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpnZCwgZm1vZGVfdCBtb2RlKTsKIHN0YXRpYyBpbnQgd19tZF9zeW5jKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpOwpAQCAtMTE4LDggKzExNCw4IEBACiAvKiBpbiAyLjYueCwgb3VyIGRldmljZSBtYXBwaW5nIGFuZCBjb25maWcgaW5mbyBjb250YWlucyBvdXIgdmlydHVhbCBnZW5kaXNrcwogICogYXMgbWVtYmVyICJzdHJ1Y3QgZ2VuZGlzayAqdmRpc2s7IgogICovCi1zdHJ1Y3QgaWRyIG1pbm9yczsKLXN0cnVjdCBsaXN0X2hlYWQgZHJiZF90Y29ubnM7ICAvKiBsaXN0IG9mIHN0cnVjdCBkcmJkX3Rjb25uICovCitzdHJ1Y3QgaWRyIGRyYmRfZGV2aWNlczsKK3N0cnVjdCBsaXN0X2hlYWQgZHJiZF9yZXNvdXJjZXM7CiAKIHN0cnVjdCBrbWVtX2NhY2hlICpkcmJkX3JlcXVlc3RfY2FjaGU7CiBzdHJ1Y3Qga21lbV9jYWNoZSAqZHJiZF9lZV9jYWNoZTsJLyogcGVlciByZXF1ZXN0cyAqLwpAQCAtMTY2LDE1ICsxNjIsMTUgQEAKIC8qIFdoZW4gY2hlY2tpbmcgd2l0aCBzcGFyc2UsIGFuZCB0aGlzIGlzIGFuIGlubGluZSBmdW5jdGlvbiwgc3BhcnNlIHdpbGwKICAgIGdpdmUgdG9ucyBvZiBmYWxzZSBwb3NpdGl2ZXMuIFdoZW4gdGhpcyBpcyBhIHJlYWwgZnVuY3Rpb25zIHNwYXJzZSB3b3Jrcy4KICAqLwotaW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfZGlza19zdGF0ZSBtaW5zKQoraW50IF9nZXRfbGRldl9pZl9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX2Rpc2tfc3RhdGUgbWlucykKIHsKIAlpbnQgaW9fYWxsb3dlZDsKIAotCWF0b21pY19pbmMoJm1kZXYtPmxvY2FsX2NudCk7Ci0JaW9fYWxsb3dlZCA9IChtZGV2LT5zdGF0ZS5kaXNrID49IG1pbnMpOworCWF0b21pY19pbmMoJmRldmljZS0+bG9jYWxfY250KTsKKwlpb19hbGxvd2VkID0gKGRldmljZS0+c3RhdGUuZGlzayA+PSBtaW5zKTsKIAlpZiAoIWlvX2FsbG93ZWQpIHsKLQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1kZXYtPmxvY2FsX2NudCkpCi0JCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2aWNlLT5sb2NhbF9jbnQpKQorCQkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCX0KIAlyZXR1cm4gaW9fYWxsb3dlZDsKIH0KQEAgLTE4Myw3ICsxNzksNyBAQAogCiAvKioKICAqIHRsX3JlbGVhc2UoKSAtIG1hcmsgYXMgQkFSUklFUl9BQ0tFRCBhbGwgcmVxdWVzdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNmZXIgbG9nIGVwb2NoCi0gKiBAdGNvbm46CURSQkQgY29ubmVjdGlvbi4KKyAqIEBjb25uZWN0aW9uOglEUkJEIGNvbm5lY3Rpb24uCiAgKiBAYmFycmllcl9ucjoJRXhwZWN0ZWQgaWRlbnRpZmllciBvZiB0aGUgRFJCRCB3cml0ZSBiYXJyaWVyIHBhY2tldC4KICAqIEBzZXRfc2l6ZToJRXhwZWN0ZWQgbnVtYmVyIG9mIHJlcXVlc3RzIGJlZm9yZSB0aGF0IGJhcnJpZXIuCiAgKgpAQCAtMTkxLDcgKzE4Nyw3IEBACiAgKiBlcG9jaCBvZiBub3QgeWV0IGJhcnJpZXItYWNrZWQgcmVxdWVzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCBjYXVzZSBhCiAgKiB0ZXJtaW5hdGlvbiBvZiB0aGUgY29ubmVjdGlvbi4KICAqLwotdm9pZCB0bF9yZWxlYXNlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCit2b2lkIHRsX3JlbGVhc2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgaW50IGJhcnJpZXJfbnIsCiAJCXVuc2lnbmVkIGludCBzZXRfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyOwpAQCAtMTk5LDExICsxOTUsMTEgQEAKIAlpbnQgZXhwZWN0X2Vwb2NoID0gMDsKIAlpbnQgZXhwZWN0X3NpemUgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJLyogZmluZCBvbGRlc3Qgbm90IHlldCBiYXJyaWVyLWFja2VkIHdyaXRlIHJlcXVlc3QsCiAJICogY291bnQgd3JpdGVzIGluIGl0cyBlcG9jaC4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZ0Y29ubi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmNvbm5lY3Rpb24tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKIAkJY29uc3QgdW5zaWduZWQgcyA9IHItPnJxX3N0YXRlOwogCQlpZiAoIXJlcSkgewogCQkJaWYgKCEocyAmIFJRX1dSSVRFKSkKQEAgLTIyOCwxOCArMjI0LDE4IEBACiAKIAkvKiBmaXJzdCBzb21lIHBhcmFub2lhIGNvZGUgKi8KIAlpZiAocmVxID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkLCBidXQgbm8gZXBvY2ggaW4gdGwhP1xuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQsIGJ1dCBubyBlcG9jaCBpbiB0bCE/XG4iLAogCQkJIGJhcnJpZXJfbnIpOwogCQlnb3RvIGJhaWw7CiAJfQogCWlmIChleHBlY3RfZXBvY2ggIT0gYmFycmllcl9ucikgewotCQljb25uX2Vycih0Y29ubiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQsIGV4cGVjdGVkICMldSFcbiIsCisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkLCBleHBlY3RlZCAjJXUhXG4iLAogCQkJIGJhcnJpZXJfbnIsIGV4cGVjdF9lcG9jaCk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKIAlpZiAoZXhwZWN0X3NpemUgIT0gc2V0X3NpemUpIHsKLQkJY29ubl9lcnIodGNvbm4sICJCQUQhIEJhcnJpZXJBY2sgIyV1IHJlY2VpdmVkIHdpdGggbl93cml0ZXM9JXUsIGV4cGVjdGVkIG5fd3JpdGVzPSV1IVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkJBRCEgQmFycmllckFjayAjJXUgcmVjZWl2ZWQgd2l0aCBuX3dyaXRlcz0ldSwgZXhwZWN0ZWQgbl93cml0ZXM9JXUhXG4iLAogCQkJIGJhcnJpZXJfbnIsIHNldF9zaXplLCBleHBlY3Rfc2l6ZSk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0yNDgsOTAgKzI0NCw5MSBAQAogCS8qIHRoaXMgZXh0cmEgbGlzdCB3YWxrIHJlc3RhcnQgaXMgcGFyYW5vaWEsCiAJICogdG8gY2F0Y2ggcmVxdWVzdHMgYmVpbmcgYmFycmllci1hY2tlZCAidW5leHBlY3RlZGx5Ii4KIAkgKiBJdCB1c3VhbGx5IHNob3VsZCBmaW5kIHRoZSBzYW1lIHJlcSBhZ2Fpbiwgb3Igc29tZSBSRUFEIHByZWNlZGluZyBpdC4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnRjb25uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKIAkJaWYgKHJlcS0+ZXBvY2ggPT0gZXhwZWN0X2Vwb2NoKQogCQkJYnJlYWs7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2Zyb20ocmVxLCByLCAmdGNvbm4tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShyZXEsIHIsICZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CiAJCWlmIChyZXEtPmVwb2NoICE9IGV4cGVjdF9lcG9jaCkKIAkJCWJyZWFrOwogCQlfcmVxX21vZChyZXEsIEJBUlJJRVJfQUNLRUQpOwogCX0KLQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuOwogCiBiYWlsOgotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfUFJPVE9DT0xfRVJST1IpLCBDU19IQVJEKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfUFJPVE9DT0xfRVJST1IpLCBDU19IQVJEKTsKIH0KIAogCiAvKioKICAqIF90bF9yZXN0YXJ0KCkgLSBXYWxrcyB0aGUgdHJhbnNmZXIgbG9nLCBhbmQgYXBwbGllcyBhbiBhY3Rpb24gdG8gYWxsIHJlcXVlc3RzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEB3aGF0OiAgICAgICBUaGUgYWN0aW9uL2V2ZW50IHRvIHBlcmZvcm0gd2l0aCBhbGwgcmVxdWVzdCBvYmplY3RzCiAgKgogICogQHdoYXQgbWlnaHQgYmUgb25lIG9mIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HLCBSRVNFTkQsIEZBSUxfRlJPWkVOX0RJU0tfSU8sCiAgKiBSRVNUQVJUX0ZST1pFTl9ESVNLX0lPLgogICovCiAvKiBtdXN0IGhvbGQgcmVzb3VyY2UtPnJlcV9sb2NrICovCi12b2lkIF90bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQordm9pZCBfdGxfcmVzdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqcjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHIsICZ0Y29ubi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykKIAkJX3JlcV9tb2QocmVxLCB3aGF0KTsKIH0KIAotdm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KQordm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCkKIHsKLQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCV90bF9yZXN0YXJ0KHRjb25uLCB3aGF0KTsKLQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfdGxfcmVzdGFydChjb25uZWN0aW9uLCB3aGF0KTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiB9CiAKIC8qKgogICogdGxfY2xlYXIoKSAtIENsZWFycyBhbGwgcmVxdWVzdHMgYW5kICZzdHJ1Y3QgZHJiZF90bF9lcG9jaCBvYmplY3RzIG91dCBvZiB0aGUgVEwKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwZWVyIHdhcyBsb3N0LiBUaGUgc3RvcmFnZSBjb3ZlcmVkCiAgKiBieSB0aGUgcmVxdWVzdHMgb24gdGhlIHRyYW5zZmVyIGdldHMgbWFya2VkIGFzIG91ciBvZiBzeW5jLiBDYWxsZWQgZnJvbSB0aGUKICAqIHJlY2VpdmVyIHRocmVhZCBhbmQgdGhlIHdvcmtlciB0aHJlYWQuCiAgKi8KLXZvaWQgdGxfY2xlYXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCB0bF9jbGVhcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXRsX3Jlc3RhcnQodGNvbm4sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKKwl0bF9yZXN0YXJ0KGNvbm5lY3Rpb24sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKIH0KIAogLyoqCi0gKiB0bF9hYm9ydF9kaXNrX2lvKCkgLSBBYm9ydCBkaXNrIEkvTyBmb3IgYWxsIHJlcXVlc3RzIGZvciBhIGNlcnRhaW4gbWRldiBpbiB0aGUgVEwKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIHRsX2Fib3J0X2Rpc2tfaW8oKSAtIEFib3J0IGRpc2sgSS9PIGZvciBhbGwgcmVxdWVzdHMgZm9yIGEgY2VydGFpbiBkZXZpY2UgaW4gdGhlIFRMCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqLwotdm9pZCB0bF9hYm9ydF9kaXNrX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIHRsX2Fib3J0X2Rpc2tfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqcjsKIAotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgciwgJnRjb25uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByLCAmY29ubmVjdGlvbi0+dHJhbnNmZXJfbG9nLCB0bF9yZXF1ZXN0cykgewogCQlpZiAoIShyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORykpCiAJCQljb250aW51ZTsKLQkJaWYgKHJlcS0+dy5tZGV2ICE9IG1kZXYpCisJCWlmIChyZXEtPmRldmljZSAhPSBkZXZpY2UpCiAJCQljb250aW51ZTsKIAkJX3JlcV9tb2QocmVxLCBBQk9SVF9ESVNLX0lPKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogc3RhdGljIGludCBkcmJkX3RocmVhZF9zZXR1cCh2b2lkICphcmcpCiB7CiAJc3RydWN0IGRyYmRfdGhyZWFkICp0aGkgPSAoc3RydWN0IGRyYmRfdGhyZWFkICopIGFyZzsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IHRoaS0+cmVzb3VyY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwogCiAJc25wcmludGYoY3VycmVudC0+Y29tbSwgc2l6ZW9mKGN1cnJlbnQtPmNvbW0pLCAiZHJiZF8lY18lcyIsCi0JCSB0aGktPm5hbWVbMF0sIHRoaS0+dGNvbm4tPm5hbWUpOworCQkgdGhpLT5uYW1lWzBdLAorCQkgcmVzb3VyY2UtPm5hbWUpOwogCiByZXN0YXJ0OgogCXJldHZhbCA9IHRoaS0+ZnVuY3Rpb24odGhpKTsKQEAgLTM0OSw3ICszNDYsNyBAQAogCSAqLwogCiAJaWYgKHRoaS0+dF9zdGF0ZSA9PSBSRVNUQVJUSU5HKSB7Ci0JCWNvbm5faW5mbyh0Y29ubiwgIlJlc3RhcnRpbmcgJXMgdGhyZWFkXG4iLCB0aGktPm5hbWUpOworCQlkcmJkX2luZm8ocmVzb3VyY2UsICJSZXN0YXJ0aW5nICVzIHRocmVhZFxuIiwgdGhpLT5uYW1lKTsKIAkJdGhpLT50X3N0YXRlID0gUlVOTklORzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAkJZ290byByZXN0YXJ0OwpAQCAtMzYxLDI5ICszNTgsMzIgQEAKIAljb21wbGV0ZV9hbGwoJnRoaS0+c3RvcCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAotCWNvbm5faW5mbyh0Y29ubiwgIlRlcm1pbmF0aW5nICVzXG4iLCBjdXJyZW50LT5jb21tKTsKKwlkcmJkX2luZm8ocmVzb3VyY2UsICJUZXJtaW5hdGluZyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAKIAkvKiBSZWxlYXNlIG1vZCByZWZlcmVuY2UgdGFrZW4gd2hlbiB0aHJlYWQgd2FzIHN0YXJ0ZWQgKi8KIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJa3JlZl9wdXQoJnRoaS0+Y29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOworCWtyZWZfcHV0KCZyZXNvdXJjZS0+a3JlZiwgZHJiZF9kZXN0cm95X3Jlc291cmNlKTsKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3RocmVhZF9pbml0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfdGhyZWFkICp0aGksCi0JCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3QgZHJiZF90aHJlYWQgKiksIGNoYXIgKm5hbWUpCitzdGF0aWMgdm9pZCBkcmJkX3RocmVhZF9pbml0KHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgc3RydWN0IGRyYmRfdGhyZWFkICp0aGksCisJCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3QgZHJiZF90aHJlYWQgKiksIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJnRoaS0+dF9sb2NrKTsKIAl0aGktPnRhc2sgICAgPSBOVUxMOwogCXRoaS0+dF9zdGF0ZSA9IE5PTkU7CiAJdGhpLT5mdW5jdGlvbiA9IGZ1bmM7Ci0JdGhpLT50Y29ubiA9IHRjb25uOwotCXN0cm5jcHkodGhpLT5uYW1lLCBuYW1lLCBBUlJBWV9TSVpFKHRoaS0+bmFtZSkpOworCXRoaS0+cmVzb3VyY2UgPSByZXNvdXJjZTsKKwl0aGktPmNvbm5lY3Rpb24gPSBOVUxMOworCXRoaS0+bmFtZSA9IG5hbWU7CiB9CiAKIGludCBkcmJkX3RocmVhZF9zdGFydChzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IHRoaS0+cmVzb3VyY2U7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zOTMsMTcgKzM5MywxOSBAQAogCiAJc3dpdGNoICh0aGktPnRfc3RhdGUpIHsKIAljYXNlIE5PTkU6Ci0JCWNvbm5faW5mbyh0Y29ubiwgIlN0YXJ0aW5nICVzIHRocmVhZCAoZnJvbSAlcyBbJWRdKVxuIiwKKwkJZHJiZF9pbmZvKHJlc291cmNlLCAiU3RhcnRpbmcgJXMgdGhyZWFkIChmcm9tICVzIFslZF0pXG4iLAogCQkJIHRoaS0+bmFtZSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAogCQkvKiBHZXQgcmVmIG9uIG1vZHVsZSBmb3IgdGhyZWFkIC0gdGhpcyBpcyByZWxlYXNlZCB3aGVuIHRocmVhZCBleGl0cyAqLwogCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkgewotCQkJY29ubl9lcnIodGNvbm4sICJGYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgaW4gZHJiZF90aHJlYWRfc3RhcnRcbiIpOworCQkJZHJiZF9lcnIocmVzb3VyY2UsICJGYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgaW4gZHJiZF90aHJlYWRfc3RhcnRcbiIpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpLT50X2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCi0JCWtyZWZfZ2V0KCZ0aGktPnRjb25uLT5rcmVmKTsKKwkJa3JlZl9nZXQoJnJlc291cmNlLT5rcmVmKTsKKwkJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJCWtyZWZfZ2V0KCZ0aGktPmNvbm5lY3Rpb24tPmtyZWYpOwogCiAJCWluaXRfY29tcGxldGlvbigmdGhpLT5zdG9wKTsKIAkJdGhpLT5yZXNldF9jcHVfbWFzayA9IDE7CkBAIC00MTIsMTIgKzQxNCwxNCBAQAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOyAvKiBvdGhlcncuIG1heSBnZXQgLUVSRVNUQVJUTk9JTlRSICovCiAKIAkJbnQgPSBrdGhyZWFkX2NyZWF0ZShkcmJkX3RocmVhZF9zZXR1cCwgKHZvaWQgKikgdGhpLAotCQkJCSAgICAiZHJiZF8lY18lcyIsIHRoaS0+bmFtZVswXSwgdGhpLT50Y29ubi0+bmFtZSk7CisJCQkJICAgICJkcmJkXyVjXyVzIiwgdGhpLT5uYW1lWzBdLCB0aGktPnJlc291cmNlLT5uYW1lKTsKIAogCQlpZiAoSVNfRVJSKG50KSkgewotCQkJY29ubl9lcnIodGNvbm4sICJDb3VsZG4ndCBzdGFydCB0aHJlYWRcbiIpOworCQkJZHJiZF9lcnIocmVzb3VyY2UsICJDb3VsZG4ndCBzdGFydCB0aHJlYWRcbiIpOwogCi0JCQlrcmVmX3B1dCgmdGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOworCQkJaWYgKHRoaS0+Y29ubmVjdGlvbikKKwkJCQlrcmVmX3B1dCgmdGhpLT5jb25uZWN0aW9uLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCQlrcmVmX3B1dCgmcmVzb3VyY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9yZXNvdXJjZSk7CiAJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNDI5LDcgKzQzMyw3IEBACiAJCWJyZWFrOwogCWNhc2UgRVhJVElORzoKIAkJdGhpLT50X3N0YXRlID0gUkVTVEFSVElORzsKLQkJY29ubl9pbmZvKHRjb25uLCAiUmVzdGFydGluZyAlcyB0aHJlYWQgKGZyb20gJXMgWyVkXSlcbiIsCisJCWRyYmRfaW5mbyhyZXNvdXJjZSwgIlJlc3RhcnRpbmcgJXMgdGhyZWFkIChmcm9tICVzIFslZF0pXG4iLAogCQkJCXRoaS0+bmFtZSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBSVU5OSU5HOgpAQCAtNDc4LDY1ICs0ODIsNjAgQEAKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmdGhpLT5zdG9wKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkcmJkX3RocmVhZCAqZHJiZF90YXNrX3RvX3RocmVhZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK2ludCBjb25uX2xvd2VzdF9taW5vcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX3RocmVhZCAqdGhpID0KLQkJdGFzayA9PSB0Y29ubi0+cmVjZWl2ZXIudGFzayA/ICZ0Y29ubi0+cmVjZWl2ZXIgOgotCQl0YXNrID09IHRjb25uLT5hc2VuZGVyLnRhc2sgID8gJnRjb25uLT5hc2VuZGVyIDoKLQkJdGFzayA9PSB0Y29ubi0+d29ya2VyLnRhc2sgICA/ICZ0Y29ubi0+d29ya2VyIDogTlVMTDsKLQotCXJldHVybiB0aGk7Ci19Ci0KLWNoYXIgKmRyYmRfdGFza190b190aHJlYWRfbmFtZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSA9IGRyYmRfdGFza190b190aHJlYWQodGNvbm4sIHRhc2spOwotCXJldHVybiB0aGkgPyB0aGktPm5hbWUgOiB0YXNrLT5jb21tOwotfQotCi1pbnQgY29ubl9sb3dlc3RfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQotewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7Ci0JaW50IHZuciA9IDAsIG07CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCWludCB2bnIgPSAwLCBtaW5vciA9IC0xOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW1kZXYgPSBpZHJfZ2V0X25leHQoJnRjb25uLT52b2x1bWVzLCAmdm5yKTsKLQltID0gbWRldiA/IG1kZXZfdG9fbWlub3IobWRldikgOiAtMTsKKwlwZWVyX2RldmljZSA9IGlkcl9nZXRfbmV4dCgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCAmdm5yKTsKKwlpZiAocGVlcl9kZXZpY2UpCisJCW1pbm9yID0gZGV2aWNlX3RvX21pbm9yKHBlZXJfZGV2aWNlLT5kZXZpY2UpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIG07CisJcmV0dXJuIG1pbm9yOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUAogLyoqCiAgKiBkcmJkX2NhbGNfY3B1X21hc2soKSAtIEdlbmVyYXRlIENQVSBtYXNrcywgc3ByZWFkIG92ZXIgYWxsIENQVXMKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KICAqCi0gKiBGb3JjZXMgYWxsIHRocmVhZHMgb2YgYSBkZXZpY2Ugb250byB0aGUgc2FtZSBDUFUuIFRoaXMgaXMgYmVuZWZpY2lhbCBmb3IKKyAqIEZvcmNlcyBhbGwgdGhyZWFkcyBvZiBhIHJlc291cmNlIG9udG8gdGhlIHNhbWUgQ1BVLiBUaGlzIGlzIGJlbmVmaWNpYWwgZm9yCiAgKiBEUkJEJ3MgcGVyZm9ybWFuY2UuIE1heSBiZSBvdmVyd3JpdHRlbiBieSB1c2VyJ3MgY29uZmlndXJhdGlvbi4KICAqLwotdm9pZCBkcmJkX2NhbGNfY3B1X21hc2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgZHJiZF9jYWxjX2NwdV9tYXNrKGNwdW1hc2tfdmFyX3QgKmNwdV9tYXNrKQogewotCWludCBvcmQsIGNwdTsKKwl1bnNpZ25lZCBpbnQgKnJlc291cmNlc19wZXJfY3B1LCBtaW5faW5kZXggPSB+MDsKIAotCS8qIHVzZXIgb3ZlcnJpZGUuICovCi0JaWYgKGNwdW1hc2tfd2VpZ2h0KHRjb25uLT5jcHVfbWFzaykpCi0JCXJldHVybjsKKwlyZXNvdXJjZXNfcGVyX2NwdSA9IGt6YWxsb2MobnJfY3B1X2lkcyAqIHNpemVvZigqcmVzb3VyY2VzX3Blcl9jcHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzb3VyY2VzX3Blcl9jcHUpIHsKKwkJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCQl1bnNpZ25lZCBpbnQgY3B1LCBtaW4gPSB+MDsKIAotCW9yZCA9IGNvbm5fbG93ZXN0X21pbm9yKHRjb25uKSAlIGNwdW1hc2tfd2VpZ2h0KGNwdV9vbmxpbmVfbWFzayk7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKG9yZC0tID09IDApIHsKLQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHRjb25uLT5jcHVfbWFzayk7Ci0JCQlyZXR1cm47CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yX2VhY2hfcmVzb3VyY2VfcmN1KHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJCWZvcl9lYWNoX2NwdShjcHUsIHJlc291cmNlLT5jcHVfbWFzaykKKwkJCQlyZXNvdXJjZXNfcGVyX2NwdVtjcHVdKys7CiAJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQlpZiAocmVzb3VyY2VzX3Blcl9jcHVbY3B1XSA8IG1pbikgeworCQkJCW1pbiA9IHJlc291cmNlc19wZXJfY3B1W2NwdV07CisJCQkJbWluX2luZGV4ID0gY3B1OworCQkJfQorCQl9CisJCWtmcmVlKHJlc291cmNlc19wZXJfY3B1KTsKIAl9Ci0JLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCi0JY3B1bWFza19zZXRhbGwodGNvbm4tPmNwdV9tYXNrKTsKKwlpZiAobWluX2luZGV4ID09IH4wKSB7CisJCWNwdW1hc2tfc2V0YWxsKCpjcHVfbWFzayk7CisJCXJldHVybjsKKwl9CisJY3B1bWFza19zZXRfY3B1KG1pbl9pbmRleCwgKmNwdV9tYXNrKTsKIH0KIAogLyoqCiAgKiBkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoKSAtIG1vZGlmaWVzIHRoZSBjcHUgbWFzayBvZiB0aGUgX2N1cnJlbnRfIHRocmVhZAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAdGhpOglkcmJkX3RocmVhZCBvYmplY3QKICAqCiAgKiBjYWxsIGluIHRoZSAibWFpbiBsb29wIiBvZiBfYWxsXyB0aHJlYWRzLCBubyBuZWVkIGZvciBhbnkgbXV0ZXgsIGN1cnJlbnQgd29uJ3QgZGllCkBAIC01NDQsMTMgKzU0MywxNiBAQAogICovCiB2b2lkIGRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdShzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UgPSB0aGktPnJlc291cmNlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CiAKIAlpZiAoIXRoaS0+cmVzZXRfY3B1X21hc2spCiAJCXJldHVybjsKIAl0aGktPnJlc2V0X2NwdV9tYXNrID0gMDsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihwLCB0aGktPnRjb25uLT5jcHVfbWFzayk7CisJc2V0X2NwdXNfYWxsb3dlZF9wdHIocCwgcmVzb3VyY2UtPmNwdV9tYXNrKTsKIH0KKyNlbHNlCisjZGVmaW5lIGRyYmRfY2FsY19jcHVfbWFzayhBKSAoe30pCiAjZW5kaWYKIAogLyoqCkBAIC01NjAsOSArNTYyLDkgQEAKICAqIHdvcmQgYWxpZ25lZCBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4gIChUaGUgYml0bWFwIHNlbmQgYW5kIHJlY2VpdmUgY29kZQogICogcmVsaWVzIG9uIHRoaXMuKQogICovCi11bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCit1bnNpZ25lZCBpbnQgZHJiZF9oZWFkZXJfc2l6ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWlmICh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDEwMCkgeworCWlmIChjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CiAJCUJVSUxEX0JVR19PTighSVNfQUxJR05FRChzaXplb2Yoc3RydWN0IHBfaGVhZGVyMTAwKSwgOCkpOwogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBwX2hlYWRlcjEwMCk7CiAJfSBlbHNlIHsKQEAgLTYwMCw0NCArNjAyLDQ0IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcF9oZWFkZXIxMDApOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHByZXBhcmVfaGVhZGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgaW50IHZuciwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJlcGFyZV9oZWFkZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZuciwKIAkJCQkgICB2b2lkICpidWZmZXIsIGVudW0gZHJiZF9wYWNrZXQgY21kLCBpbnQgc2l6ZSkKIHsKLQlpZiAodGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDApCisJaWYgKGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDApCiAJCXJldHVybiBwcmVwYXJlX2hlYWRlcjEwMChidWZmZXIsIGNtZCwgc2l6ZSwgdm5yKTsKLQllbHNlIGlmICh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1ICYmCisJZWxzZSBpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1ICYmCiAJCSBzaXplID4gRFJCRF9NQVhfU0laRV9IODBfUEFDS0VUKQogCQlyZXR1cm4gcHJlcGFyZV9oZWFkZXI5NShidWZmZXIsIGNtZCwgc2l6ZSk7CiAJZWxzZQogCQlyZXR1cm4gcHJlcGFyZV9oZWFkZXI4MChidWZmZXIsIGNtZCwgc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkICpfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwKK3N0YXRpYyB2b2lkICpfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCiAJCQkJICAgIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaykKIHsKIAlpZiAoIXNvY2stPnNvY2tldCkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHNvY2stPnNidWYgKyBkcmJkX2hlYWRlcl9zaXplKHRjb25uKTsKKwlyZXR1cm4gc29jay0+c2J1ZiArIGRyYmRfaGVhZGVyX3NpemUoY29ubmVjdGlvbik7CiB9CiAKLXZvaWQgKmNvbm5fcHJlcGFyZV9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQordm9pZCAqY29ubl9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQogewogCXZvaWQgKnA7CiAKIAltdXRleF9sb2NrKCZzb2NrLT5tdXRleCk7Ci0JcCA9IF9fY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spOworCXAgPSBfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqZHJiZF9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrKQordm9pZCAqZHJiZF9wcmVwYXJlX2NvbW1hbmQoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2spCiB7Ci0JcmV0dXJuIGNvbm5fcHJlcGFyZV9jb21tYW5kKG1kZXYtPnRjb25uLCBzb2NrKTsKKwlyZXR1cm4gY29ubl9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIHNvY2spOwogfQogCi1zdGF0aWMgaW50IF9fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgaW50IHZuciwKK3N0YXRpYyBpbnQgX19zZW5kX2NvbW1hbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZuciwKIAkJCSAgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJCSAgdW5zaWduZWQgaW50IGhlYWRlcl9zaXplLCB2b2lkICpkYXRhLAogCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSkKQEAgLTY1NCw4MiArNjU2LDgyIEBACiAJICovCiAJbXNnX2ZsYWdzID0gZGF0YSA/IE1TR19NT1JFIDogMDsKIAotCWhlYWRlcl9zaXplICs9IHByZXBhcmVfaGVhZGVyKHRjb25uLCB2bnIsIHNvY2stPnNidWYsIGNtZCwKKwloZWFkZXJfc2l6ZSArPSBwcmVwYXJlX2hlYWRlcihjb25uZWN0aW9uLCB2bnIsIHNvY2stPnNidWYsIGNtZCwKIAkJCQkgICAgICBoZWFkZXJfc2l6ZSArIHNpemUpOwotCWVyciA9IGRyYmRfc2VuZF9hbGwodGNvbm4sIHNvY2stPnNvY2tldCwgc29jay0+c2J1ZiwgaGVhZGVyX3NpemUsCisJZXJyID0gZHJiZF9zZW5kX2FsbChjb25uZWN0aW9uLCBzb2NrLT5zb2NrZXQsIHNvY2stPnNidWYsIGhlYWRlcl9zaXplLAogCQkJICAgIG1zZ19mbGFncyk7CiAJaWYgKGRhdGEgJiYgIWVycikKLQkJZXJyID0gZHJiZF9zZW5kX2FsbCh0Y29ubiwgc29jay0+c29ja2V0LCBkYXRhLCBzaXplLCAwKTsKKwkJZXJyID0gZHJiZF9zZW5kX2FsbChjb25uZWN0aW9uLCBzb2NrLT5zb2NrZXQsIGRhdGEsIHNpemUsIDApOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19jb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKK3N0YXRpYyBpbnQgX19jb25uX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2ssCiAJCQkgICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJCSAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKLQlyZXR1cm4gX19zZW5kX2NvbW1hbmQodGNvbm4sIDAsIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOworCXJldHVybiBfX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCAwLCBzb2NrLCBjbWQsIGhlYWRlcl9zaXplLCBkYXRhLCBzaXplKTsKIH0KIAotaW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrLAoraW50IGNvbm5fc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IF9fY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOworCWVyciA9IF9fY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgY21kLCBoZWFkZXJfc2l6ZSwgZGF0YSwgc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGRyYmRfc2VuZF9jb21tYW5kKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKK2ludCBkcmJkX3NlbmRfY29tbWFuZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJICAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQsIHVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSwKIAkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsCi0JCQkgICAgIGRhdGEsIHNpemUpOworCWVyciA9IF9fc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwZWVyX2RldmljZS0+ZGV2aWNlLT52bnIsCisJCQkgICAgIHNvY2ssIGNtZCwgaGVhZGVyX3NpemUsIGRhdGEsIHNpemUpOwogCW11dGV4X3VubG9jaygmc29jay0+bXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX3NlbmRfcGluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitpbnQgZHJiZF9zZW5kX3Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spKQorCXNvY2sgPSAmY29ubmVjdGlvbi0+bWV0YTsKKwlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spKQogCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIFBfUElORywgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIFBfUElORywgMCwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfcGluZ19hY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraW50IGRyYmRfc2VuZF9waW5nX2FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAotCXNvY2sgPSAmdGNvbm4tPm1ldGE7Ci0JaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jaykpCisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaykpCiAJCXJldHVybiAtRUlPOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9QSU5HX0FDSywgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIFBfUElOR19BQ0ssIDAsIE5VTEwsIDApOwogfQogCi1pbnQgZHJiZF9zZW5kX3N5bmNfcGFyYW0oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX3NlbmRfc3luY19wYXJhbShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JzX3BhcmFtXzk1ICpwOwogCWludCBzaXplOwotCWNvbnN0IGludCBhcHYgPSBtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uOworCWNvbnN0IGludCBhcHYgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uOwogCWVudW0gZHJiZF9wYWNrZXQgY21kOwogCXN0cnVjdCBuZXRfY29uZiAqbmM7CiAJc3RydWN0IGRpc2tfY29uZiAqZGM7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAKIAlzaXplID0gYXB2IDw9IDg3ID8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtKQogCQk6IGFwdiA9PSA4OCA/IHNpemVvZihzdHJ1Y3QgcF9yc19wYXJhbSkKQEAgLTc0MiwxNCArNzQ0LDE0IEBACiAJLyogaW5pdGlhbGl6ZSB2ZXJpZnlfYWxnIGFuZCBjc3Vtc19hbGcgKi8KIAltZW1zZXQocC0+dmVyaWZ5X2FsZywgMCwgMiAqIFNIQVJFRF9TRUNSRVRfTUFYKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpOworCWlmIChnZXRfbGRldihwZWVyX2RldmljZS0+ZGV2aWNlKSkgeworCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+ZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpOwogCQlwLT5yZXN5bmNfcmF0ZSA9IGNwdV90b19iZTMyKGRjLT5yZXN5bmNfcmF0ZSk7CiAJCXAtPmNfcGxhbl9haGVhZCA9IGNwdV90b19iZTMyKGRjLT5jX3BsYW5fYWhlYWQpOwogCQlwLT5jX2RlbGF5X3RhcmdldCA9IGNwdV90b19iZTMyKGRjLT5jX2RlbGF5X3RhcmdldCk7CiAJCXAtPmNfZmlsbF90YXJnZXQgPSBjcHVfdG9fYmUzMihkYy0+Y19maWxsX3RhcmdldCk7CiAJCXAtPmNfbWF4X3JhdGUgPSBjcHVfdG9fYmUzMihkYy0+Y19tYXhfcmF0ZSk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihwZWVyX2RldmljZS0+ZGV2aWNlKTsKIAl9IGVsc2UgewogCQlwLT5yZXN5bmNfcmF0ZSA9IGNwdV90b19iZTMyKERSQkRfUkVTWU5DX1JBVEVfREVGKTsKIAkJcC0+Y19wbGFuX2FoZWFkID0gY3B1X3RvX2JlMzIoRFJCRF9DX1BMQU5fQUhFQURfREVGKTsKQEAgLTc2NCwzMyArNzY2LDMzIEBACiAJCXN0cmNweShwLT5jc3Vtc19hbGcsIG5jLT5jc3Vtc19hbGcpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIGNtZCwgc2l6ZSwgTlVMTCwgMCk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBjbWQsIHNpemUsIE5VTEwsIDApOwogfQogCi1pbnQgX19kcmJkX3NlbmRfcHJvdG9jb2woc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCkKK2ludCBfX2RyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBlbnVtIGRyYmRfcGFja2V0IGNtZCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcHJvdG9jb2wgKnA7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgc2l6ZSwgY2Y7CiAKLQlzb2NrID0gJnRjb25uLT5kYXRhOwotCXAgPSBfX2Nvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IF9fY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAotCWlmIChuYy0+dGVudGF0aXZlICYmIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MikgeworCWlmIChuYy0+dGVudGF0aXZlICYmIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkyKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQltdXRleF91bmxvY2soJnNvY2stPm11dGV4KTsKLQkJY29ubl9lcnIodGNvbm4sICItLWRyeS1ydW4gaXMgbm90IHN1cHBvcnRlZCBieSBwZWVyIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICItLWRyeS1ydW4gaXMgbm90IHN1cHBvcnRlZCBieSBwZWVyIik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlzaXplID0gc2l6ZW9mKCpwKTsKLQlpZiAodGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4NykKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg3KQogCQlzaXplICs9IHN0cmxlbihuYy0+aW50ZWdyaXR5X2FsZykgKyAxOwogCiAJcC0+cHJvdG9jb2wgICAgICA9IGNwdV90b19iZTMyKG5jLT53aXJlX3Byb3RvY29sKTsKQEAgLTgwNSwxMjggKzgwNywxMzEgQEAKIAkJY2YgfD0gQ0ZfRFJZX1JVTjsKIAlwLT5jb25uX2ZsYWdzICAgID0gY3B1X3RvX2JlMzIoY2YpOwogCi0JaWYgKHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODcpCisJaWYgKGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4NykKIAkJc3RyY3B5KHAtPmludGVncml0eV9hbGcsIG5jLT5pbnRlZ3JpdHlfYWxnKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJldHVybiBfX2Nvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIHNpemUsIE5VTEwsIDApOworCXJldHVybiBfX2Nvbm5fc2VuZF9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2ssIGNtZCwgc2l6ZSwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfcHJvdG9jb2woc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQoraW50IGRyYmRfc2VuZF9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWludCBlcnI7CiAKLQltdXRleF9sb2NrKCZ0Y29ubi0+ZGF0YS5tdXRleCk7Ci0JZXJyID0gX19kcmJkX3NlbmRfcHJvdG9jb2wodGNvbm4sIFBfUFJPVE9DT0wpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCWVyciA9IF9fZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24sIFBfUFJPVE9DT0wpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgX2RyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1NjQgdXVpZF9mbGFncykKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHU2NCB1dWlkX2ZsYWdzKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfdXVpZHMgKnA7CiAJaW50IGk7CiAKLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX05FR09USUFUSU5HKSkKIAkJcmV0dXJuIDA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAJZm9yIChpID0gVUlfQ1VSUkVOVDsgaSA8IFVJX1NJWkU7IGkrKykKLQkJcC0+dXVpZFtpXSA9IGNwdV90b19iZTY0KG1kZXYtPmxkZXYtPm1kLnV1aWRbaV0pOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwkJcC0+dXVpZFtpXSA9IGNwdV90b19iZTY0KGRldmljZS0+bGRldi0+bWQudXVpZFtpXSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAKLQltZGV2LT5jb21tX2JtX3NldCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpOwotCXAtPnV1aWRbVUlfU0laRV0gPSBjcHVfdG9fYmU2NChtZGV2LT5jb21tX2JtX3NldCk7CisJZGV2aWNlLT5jb21tX2JtX3NldCA9IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSk7CisJcC0+dXVpZFtVSV9TSVpFXSA9IGNwdV90b19iZTY0KGRldmljZS0+Y29tbV9ibV9zZXQpOwogCXJjdV9yZWFkX2xvY2soKTsKLQl1dWlkX2ZsYWdzIHw9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT5kaXNjYXJkX215X2RhdGEgPyAxIDogMDsKKwl1dWlkX2ZsYWdzIHw9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5kaXNjYXJkX215X2RhdGEgPyAxIDogMDsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQl1dWlkX2ZsYWdzIHw9IHRlc3RfYml0KENSQVNIRURfUFJJTUFSWSwgJm1kZXYtPmZsYWdzKSA/IDIgOiAwOwotCXV1aWRfZmxhZ3MgfD0gbWRldi0+bmV3X3N0YXRlX3RtcC5kaXNrID09IERfSU5DT05TSVNURU5UID8gNCA6IDA7CisJdXVpZF9mbGFncyB8PSB0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKSA/IDIgOiAwOworCXV1aWRfZmxhZ3MgfD0gZGV2aWNlLT5uZXdfc3RhdGVfdG1wLmRpc2sgPT0gRF9JTkNPTlNJU1RFTlQgPyA0IDogMDsKIAlwLT51dWlkW1VJX0ZMQUdTXSA9IGNwdV90b19iZTY0KHV1aWRfZmxhZ3MpOwogCi0JcHV0X2xkZXYobWRldik7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfVVVJRFMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXB1dF9sZGV2KGRldmljZSk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1VVSURTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfc2VuZF91dWlkcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7Ci0JcmV0dXJuIF9kcmJkX3NlbmRfdXVpZHMobWRldiwgMCk7CisJcmV0dXJuIF9kcmJkX3NlbmRfdXVpZHMocGVlcl9kZXZpY2UsIDApOwogfQogCi1pbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9zZW5kX3V1aWRzX3NraXBfaW5pdGlhbF9zeW5jKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKLQlyZXR1cm4gX2RyYmRfc2VuZF91dWlkcyhtZGV2LCA4KTsKKwlyZXR1cm4gX2RyYmRfc2VuZF91dWlkcyhwZWVyX2RldmljZSwgOCk7CiB9CiAKLXZvaWQgZHJiZF9wcmludF91dWlkcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCBjaGFyICp0ZXh0KQordm9pZCBkcmJkX3ByaW50X3V1aWRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICp0ZXh0KQogewotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgewotCQl1NjQgKnV1aWQgPSBtZGV2LT5sZGV2LT5tZC51dWlkOwotCQlkZXZfaW5mbyhERVYsICIlcyAlMDE2bGxYOiUwMTZsbFg6JTAxNmxsWDolMDE2bGxYXG4iLAorCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCXU2NCAqdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZDsKKwkJZHJiZF9pbmZvKGRldmljZSwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFhcbiIsCiAJCSAgICAgdGV4dCwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXV1aWRbVUlfQ1VSUkVOVF0sCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0JJVE1BUF0sCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0hJU1RPUllfU1RBUlRdLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdXVpZFtVSV9ISVNUT1JZX0VORF0pOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9IGVsc2UgewotCQlkZXZfaW5mbyhERVYsICIlcyBlZmZlY3RpdmUgZGF0YSB1dWlkOiAlMDE2bGxYXG4iLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiJXMgZWZmZWN0aXZlIGRhdGEgdXVpZDogJTAxNmxsWFxuIiwKIAkJCQl0ZXh0LAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+ZWRfdXVpZCk7CisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPmVkX3V1aWQpOwogCX0KIH0KIAotdm9pZCBkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JzX3V1aWQgKnA7CiAJdTY0IHV1aWQ7CiAKLQlEX0FTU0VSVChtZGV2LT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSk7CisJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9VUF9UT19EQVRFKTsKIAotCXV1aWQgPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07CisJdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdOwogCWlmICh1dWlkICYmIHV1aWQgIT0gVVVJRF9KVVNUX0NSRUFURUQpCiAJCXV1aWQgPSB1dWlkICsgVVVJRF9ORVdfQk1fT0ZGU0VUOwogCWVsc2UKIAkJZ2V0X3JhbmRvbV9ieXRlcygmdXVpZCwgc2l6ZW9mKHU2NCkpOwotCWRyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCB1dWlkKTsKLQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJ1cGRhdGVkIHN5bmMgVVVJRCIpOwotCWRyYmRfbWRfc3luYyhtZGV2KTsKKwlkcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCB1dWlkKTsKKwlkcmJkX3ByaW50X3V1aWRzKGRldmljZSwgInVwZGF0ZWQgc3luYyBVVUlEIik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKHApIHsKIAkJcC0+dXVpZCA9IGNwdV90b19iZTY0KHV1aWQpOwotCQlkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NZTkNfVVVJRCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJCWRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NZTkNfVVVJRCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiAJfQogfQogCi1pbnQgZHJiZF9zZW5kX3NpemVzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCB0cmlnZ2VyX3JlcGx5LCBlbnVtIGRkc19mbGFncyBmbGFncykKK2ludCBkcmJkX3NlbmRfc2l6ZXMoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBpbnQgdHJpZ2dlcl9yZXBseSwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9zaXplcyAqcDsKIAlzZWN0b3JfdCBkX3NpemUsIHVfc2l6ZTsKIAlpbnQgcV9vcmRlcl90eXBlOwogCXVuc2lnbmVkIGludCBtYXhfYmlvX3NpemU7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9ORUdPVElBVElORykpIHsKLQkJRF9BU1NFUlQobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKLQkJZF9zaXplID0gZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG1kZXYtPmxkZXYpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOworCQlkX3NpemUgPSBkcmJkX2dldF9tYXhfY2FwYWNpdHkoZGV2aWNlLT5sZGV2KTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQl1X3NpemUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOworCQl1X3NpemUgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlxX29yZGVyX3R5cGUgPSBkcmJkX3F1ZXVlX29yZGVyX3R5cGUobWRldik7Ci0JCW1heF9iaW9fc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CisJCXFfb3JkZXJfdHlwZSA9IGRyYmRfcXVldWVfb3JkZXJfdHlwZShkZXZpY2UpOworCQltYXhfYmlvX3NpemUgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CiAJCW1heF9iaW9fc2l6ZSA9IG1pbihtYXhfYmlvX3NpemUsIERSQkRfTUFYX0JJT19TSVpFKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfSBlbHNlIHsKIAkJZF9zaXplID0gMDsKIAkJdV9zaXplID0gMDsKQEAgLTkzNCw0NSArOTM5LDQ1IEBACiAJCW1heF9iaW9fc2l6ZSA9IERSQkRfTUFYX0JJT19TSVpFOyAvKiAuLi4gbXVsdGlwbGUgQklPcyBwZXIgcGVlcl9yZXF1ZXN0ICovCiAJfQogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8PSA5NCkKKwlpZiAocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8PSA5NCkKIAkJbWF4X2Jpb19zaXplID0gbWluKG1heF9iaW9fc2l6ZSwgRFJCRF9NQVhfU0laRV9IODBfUEFDS0VUKTsKLQllbHNlIGlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKQorCWVsc2UgaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApCiAJCW1heF9iaW9fc2l6ZSA9IG1pbihtYXhfYmlvX3NpemUsIERSQkRfTUFYX0JJT19TSVpFX1A5NSk7CiAKIAlwLT5kX3NpemUgPSBjcHVfdG9fYmU2NChkX3NpemUpOwogCXAtPnVfc2l6ZSA9IGNwdV90b19iZTY0KHVfc2l6ZSk7Ci0JcC0+Y19zaXplID0gY3B1X3RvX2JlNjQodHJpZ2dlcl9yZXBseSA/IDAgOiBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKTsKKwlwLT5jX3NpemUgPSBjcHVfdG9fYmU2NCh0cmlnZ2VyX3JlcGx5ID8gMCA6IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSk7CiAJcC0+bWF4X2Jpb19zaXplID0gY3B1X3RvX2JlMzIobWF4X2Jpb19zaXplKTsKIAlwLT5xdWV1ZV9vcmRlcl90eXBlID0gY3B1X3RvX2JlMTYocV9vcmRlcl90eXBlKTsKIAlwLT5kZHNfZmxhZ3MgPSBjcHVfdG9fYmUxNihmbGFncyk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfU0laRVMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9TSVpFUywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qKgogICogZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUoKSAtIFNlbmRzIHRoZSBkcmJkIHN0YXRlIHRvIHRoZSBwZWVyCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAcGVlcl9kZXZpY2U6CURSQkQgcGVlciBkZXZpY2UuCiAgKi8KLWludCBkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfc3RhdGUgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKLQlwLT5zdGF0ZSA9IGNwdV90b19iZTMyKG1kZXYtPnN0YXRlLmkpOyAvKiBXaXRoaW4gdGhlIHNlbmQgbXV0ZXggKi8KLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9TVEFURSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcC0+c3RhdGUgPSBjcHVfdG9fYmUzMihwZWVyX2RldmljZS0+ZGV2aWNlLT5zdGF0ZS5pKTsgLyogV2l0aGluIHRoZSBzZW5kIG11dGV4ICovCisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyoqCiAgKiBkcmJkX3NlbmRfc3RhdGUoKSAtIEFmdGVyIGEgc3RhdGUgY2hhbmdlLCBzZW5kcyB0aGUgbmV3IHN0YXRlIHRvIHRoZSBwZWVyCi0gKiBAbWRldjogICAgICBEUkJEIGRldmljZS4KKyAqIEBwZWVyX2RldmljZTogICAgICBEUkJEIHBlZXIgZGV2aWNlLgogICogQHN0YXRlOiAgICAgdGhlIHN0YXRlIHRvIHNlbmQsIG5vdCBuZWNlc3NhcmlseSB0aGUgY3VycmVudCBzdGF0ZS4KICAqCiAgKiBFYWNoIHN0YXRlIGNoYW5nZSBxdWV1ZXMgYW4gImFmdGVyX3N0YXRlX2NoIiB3b3JrLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkKQEAgLTk4MCw3MyArOTg1LDczIEBACiAgKiBiZXR3ZWVuIHF1ZXVpbmcgYW5kIHByb2Nlc3Npbmcgb2YgdGhlIGFmdGVyX3N0YXRlX2NoIHdvcmssIHdlIHN0aWxsCiAgKiB3YW50IHRvIHNlbmQgZWFjaCBpbnRlcm1lZGlhcnkgc3RhdGUgaW4gdGhlIG9yZGVyIGl0IG9jY3VycmVkLgogICovCi1pbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgc3RhdGUpCitpbnQgZHJiZF9zZW5kX3N0YXRlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfc3RhdGUgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5kYXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAlwLT5zdGF0ZSA9IGNwdV90b19iZTMyKHN0YXRlLmkpOyAvKiBXaXRoaW4gdGhlIHNlbmQgbXV0ZXggKi8KLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgUF9TVEFURSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGRyYmRfc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKK2ludCBkcmJkX3NlbmRfc3RhdGVfcmVxKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcmVxX3N0YXRlICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+bWFzayA9IGNwdV90b19iZTMyKG1hc2suaSk7CiAJcC0+dmFsID0gY3B1X3RvX2JlMzIodmFsLmkpOwotCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NUQVRFX0NIR19SRVEsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9TVEFURV9DSEdfUkVRLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotaW50IGNvbm5fc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQoraW50IGNvbm5fc2VuZF9zdGF0ZV9yZXEoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKIAllbnVtIGRyYmRfcGFja2V0IGNtZDsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfcmVxX3N0YXRlICpwOwogCi0JY21kID0gdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/IFBfU1RBVEVfQ0hHX1JFUSA6IFBfQ09OTl9TVF9DSEdfUkVROwotCXNvY2sgPSAmdGNvbm4tPmRhdGE7Ci0JcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKTsKKwljbWQgPSBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVEgOiBQX0NPTk5fU1RfQ0hHX1JFUTsKKwlzb2NrID0gJmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+bWFzayA9IGNwdV90b19iZTMyKG1hc2suaSk7CiAJcC0+dmFsID0gY3B1X3RvX2JlMzIodmFsLmkpOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAotdm9pZCBkcmJkX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpCit2b2lkIGRyYmRfc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIGVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgKnA7CiAKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5tZXRhOwotCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChtZGV2LCBzb2NrKTsKKwlzb2NrID0gJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5tZXRhOworCXAgPSBkcmJkX3ByZXBhcmVfY29tbWFuZChwZWVyX2RldmljZSwgc29jayk7CiAJaWYgKHApIHsKIAkJcC0+cmV0Y29kZSA9IGNwdV90b19iZTMyKHJldGNvZGUpOwotCQlkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1NUQVRFX0NIR19SRVBMWSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJCWRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBQX1NUQVRFX0NIR19SRVBMWSwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiAJfQogfQogCi12b2lkIGNvbm5fc2VuZF9zcl9yZXBseShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlKQordm9pZCBjb25uX3NlbmRfc3JfcmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgZW51bSBkcmJkX3N0YXRlX3J2IHJldGNvZGUpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCXN0cnVjdCBwX3JlcV9zdGF0ZV9yZXBseSAqcDsKLQllbnVtIGRyYmRfcGFja2V0IGNtZCA9IHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVBMWSA6IFBfQ09OTl9TVF9DSEdfUkVQTFk7CisJZW51bSBkcmJkX3BhY2tldCBjbWQgPSBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDAgPyBQX1NUQVRFX0NIR19SRVBMWSA6IFBfQ09OTl9TVF9DSEdfUkVQTFk7CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jayk7CisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKTsKIAlpZiAocCkgewogCQlwLT5yZXRjb2RlID0gY3B1X3RvX2JlMzIocmV0Y29kZSk7Ci0JCWNvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOworCQljb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOwogCX0KIH0KIApAQCAtMTA2Nyw3ICsxMDcyLDcgQEAKIAlwLT5lbmNvZGluZyA9IChwLT5lbmNvZGluZyAmICh+MHg3IDw8IDQpKSB8IChuIDw8IDQpOwogfQogCi1pbnQgZmlsbF9iaXRtYXBfcmxlX2JpdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbnQgZmlsbF9iaXRtYXBfcmxlX2JpdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkgc3RydWN0IHBfY29tcHJlc3NlZF9ibSAqcCwKIAkJCSB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCSBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpCkBAIC0xMDgyLDkgKzEwODcsOSBAQAogCiAJLyogbWF5IHdlIHVzZSB0aGlzIGZlYXR1cmU/ICovCiAJcmN1X3JlYWRfbG9jaygpOwotCXVzZV9ybGUgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dXNlX3JsZTsKKwl1c2VfcmxlID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPm5ldF9jb25mKS0+dXNlX3JsZTsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlpZiAoIXVzZV9ybGUgfHwgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkwKQorCWlmICghdXNlX3JsZSB8fCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoYy0+Yml0X29mZnNldCA+PSBjLT5ibV9iaXRzKQpAQCAtMTEwNCw4ICsxMTA5LDggQEAKIAkvKiBzZWUgaG93IG11Y2ggcGxhaW4gYml0cyB3ZSBjYW4gc3R1ZmYgaW50byBvbmUgcGFja2V0CiAJICogdXNpbmcgUkxFIGFuZCBWTEkuICovCiAJZG8gewotCQl0bXAgPSAodG9nZ2xlID09IDApID8gX2RyYmRfYm1fZmluZF9uZXh0X3plcm8obWRldiwgYy0+Yml0X29mZnNldCkKLQkJCQkgICAgOiBfZHJiZF9ibV9maW5kX25leHQobWRldiwgYy0+Yml0X29mZnNldCk7CisJCXRtcCA9ICh0b2dnbGUgPT0gMCkgPyBfZHJiZF9ibV9maW5kX25leHRfemVybyhkZXZpY2UsIGMtPmJpdF9vZmZzZXQpCisJCQkJICAgIDogX2RyYmRfYm1fZmluZF9uZXh0KGRldmljZSwgYy0+Yml0X29mZnNldCk7CiAJCWlmICh0bXAgPT0gLTFVTCkKIAkJCXRtcCA9IGMtPmJtX2JpdHM7CiAJCXJsID0gdG1wIC0gYy0+Yml0X29mZnNldDsKQEAgLTExMjUsNyArMTEzMCw3IEBACiAJCS8qIHBhcmFub2lhOiBjYXRjaCB6ZXJvIHJ1bmxlbmd0aC4KIAkJICogY2FuIG9ubHkgaGFwcGVuIGlmIGJpdG1hcCBpcyBtb2RpZmllZCB3aGlsZSB3ZSBzY2FuIGl0LiAqLwogCQlpZiAocmwgPT0gMCkgewotCQkJZGV2X2VycihERVYsICJ1bmV4cGVjdGVkIHplcm8gcnVubGVuZ3RoIHdoaWxlIGVuY29kaW5nIGJpdG1hcCAiCisJCQlkcmJkX2VycihkZXZpY2UsICJ1bmV4cGVjdGVkIHplcm8gcnVubGVuZ3RoIHdoaWxlIGVuY29kaW5nIGJpdG1hcCAiCiAJCQkgICAgInQ6JXUgYm86JWx1XG4iLCB0b2dnbGUsIGMtPmJpdF9vZmZzZXQpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xMTM0LDcgKzExMzksNyBAQAogCQlpZiAoYml0cyA9PSAtRU5PQlVGUykgLyogYnVmZmVyIGZ1bGwgKi8KIAkJCWJyZWFrOwogCQlpZiAoYml0cyA8PSAwKSB7Ci0JCQlkZXZfZXJyKERFViwgImVycm9yIHdoaWxlIGVuY29kaW5nIGJpdG1hcDogJWRcbiIsIGJpdHMpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiZXJyb3Igd2hpbGUgZW5jb2RpbmcgYml0bWFwOiAlZFxuIiwgYml0cyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC0xMTcxLDIxICsxMTc2LDIxIEBACiAgKiBjb2RlIHVwb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotc2VuZF9iaXRtYXBfcmxlX29yX3BsYWluKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBibV94ZmVyX2N0eCAqYykKK3NlbmRfYml0bWFwX3JsZV9vcl9wbGFpbihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGJtX3hmZXJfY3R4ICpjKQogewotCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKG1kZXYtPnRjb25uKTsKKwlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2sgPSAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAgPSBzb2NrLT5zYnVmICsgaGVhZGVyX3NpemU7CiAJaW50IGxlbiwgZXJyOwogCi0JbGVuID0gZmlsbF9iaXRtYXBfcmxlX2JpdHMobWRldiwgcCwKKwlsZW4gPSBmaWxsX2JpdG1hcF9ybGVfYml0cyhkZXZpY2UsIHAsCiAJCQlEUkJEX1NPQ0tFVF9CVUZGRVJfU0laRSAtIGhlYWRlcl9zaXplIC0gc2l6ZW9mKCpwKSwgYyk7CiAJaWYgKGxlbiA8IDApCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGxlbikgewogCQlkY2JwX3NldF9jb2RlKHAsIFJMRV9WTElfQml0cyk7Ci0JCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssCisJCWVyciA9IF9fc2VuZF9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLAogCQkJCSAgICAgUF9DT01QUkVTU0VEX0JJVE1BUCwgc2l6ZW9mKCpwKSArIGxlbiwKIAkJCQkgICAgIE5VTEwsIDApOwogCQljLT5wYWNrZXRzWzBdKys7CkBAIC0xMjA1LDggKzEyMTAsOCBAQAogCQkJCSAgYy0+Ym1fd29yZHMgLSBjLT53b3JkX29mZnNldCk7CiAJCWxlbiA9IG51bV93b3JkcyAqIHNpemVvZigqcCk7CiAJCWlmIChsZW4pCi0JCQlkcmJkX2JtX2dldF9sZWwobWRldiwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7Ci0JCWVyciA9IF9fc2VuZF9jb21tYW5kKG1kZXYtPnRjb25uLCBtZGV2LT52bnIsIHNvY2ssIFBfQklUTUFQLCBsZW4sIE5VTEwsIDApOworCQkJZHJiZF9ibV9nZXRfbGVsKGRldmljZSwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CisJCWVyciA9IF9fc2VuZF9jb21tYW5kKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLCBQX0JJVE1BUCwgbGVuLCBOVUxMLCAwKTsKIAkJYy0+d29yZF9vZmZzZXQgKz0gbnVtX3dvcmRzOwogCQljLT5iaXRfb2Zmc2V0ID0gYy0+d29yZF9vZmZzZXQgKiBCSVRTX1BFUl9MT05HOwogCkBAIC0xMjE4LDcgKzEyMjMsNyBAQAogCX0KIAlpZiAoIWVycikgewogCQlpZiAobGVuID09IDApIHsKLQkJCUlORk9fYm1feGZlcl9zdGF0cyhtZGV2LCAic2VuZCIsIGMpOworCQkJSU5GT19ibV94ZmVyX3N0YXRzKGRldmljZSwgInNlbmQiLCBjKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UKIAkJCXJldHVybiAxOwpAQCAtMTIyNywxMjggKzEyMzIsMTI4IEBACiB9CiAKIC8qIFNlZSB0aGUgY29tbWVudCBhdCByZWNlaXZlX2JpdG1hcCgpICovCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IF9kcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBibV94ZmVyX2N0eCBjOwogCWludCBlcnI7CiAKLQlpZiAoIWV4cGVjdChtZGV2LT5iaXRtYXApKQorCWlmICghZXhwZWN0KGRldmljZS0+Yml0bWFwKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfRlVMTF9TWU5DKSkgewotCQkJZGV2X2luZm8oREVWLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBNREZfRnVsbFN5bmMgd2FzIHNldC5cbiIpOwotCQkJZHJiZF9ibV9zZXRfYWxsKG1kZXYpOwotCQkJaWYgKGRyYmRfYm1fd3JpdGUobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcoZGV2aWNlLT5sZGV2LCBNREZfRlVMTF9TWU5DKSkgeworCQkJZHJiZF9pbmZvKGRldmljZSwgIldyaXRpbmcgdGhlIHdob2xlIGJpdG1hcCwgTURGX0Z1bGxTeW5jIHdhcyBzZXQuXG4iKTsKKwkJCWRyYmRfYm1fc2V0X2FsbChkZXZpY2UpOworCQkJaWYgKGRyYmRfYm1fd3JpdGUoZGV2aWNlKSkgewogCQkJCS8qIHdyaXRlX2JtIGRpZCBmYWlsISBMZWF2ZSBmdWxsIHN5bmMgZmxhZyBzZXQgaW4gTWV0YSBQX0RBVEEKIAkJCQkgKiBidXQgb3RoZXJ3aXNlIHByb2Nlc3MgYXMgcGVyIG5vcm1hbCAtIG5lZWQgdG8gdGVsbCBvdGhlcgogCQkJCSAqIHNpZGUgdGhhdCBhIGZ1bGwgcmVzeW5jIGlzIHJlcXVpcmVkISAqLwotCQkJCWRldl9lcnIoREVWLCAiRmFpbGVkIHRvIHdyaXRlIGJpdG1hcCB0byBkaXNrIVxuIik7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRmFpbGVkIHRvIHdyaXRlIGJpdG1hcCB0byBkaXNrIVxuIik7CiAJCQl9IGVsc2UgewotCQkJCWRyYmRfbWRfY2xlYXJfZmxhZyhtZGV2LCBNREZfRlVMTF9TWU5DKTsKLQkJCQlkcmJkX21kX3N5bmMobWRldik7CisJCQkJZHJiZF9tZF9jbGVhcl9mbGFnKGRldmljZSwgTURGX0ZVTExfU1lOQyk7CisJCQkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJCQl9CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJYyA9IChzdHJ1Y3QgYm1feGZlcl9jdHgpIHsKLQkJLmJtX2JpdHMgPSBkcmJkX2JtX2JpdHMobWRldiksCi0JCS5ibV93b3JkcyA9IGRyYmRfYm1fd29yZHMobWRldiksCisJCS5ibV9iaXRzID0gZHJiZF9ibV9iaXRzKGRldmljZSksCisJCS5ibV93b3JkcyA9IGRyYmRfYm1fd29yZHMoZGV2aWNlKSwKIAl9OwogCiAJZG8gewotCQllcnIgPSBzZW5kX2JpdG1hcF9ybGVfb3JfcGxhaW4obWRldiwgJmMpOworCQllcnIgPSBzZW5kX2JpdG1hcF9ybGVfb3JfcGxhaW4oZGV2aWNlLCAmYyk7CiAJfSB3aGlsZSAoZXJyID4gMCk7CiAKIAlyZXR1cm4gZXJyID09IDA7CiB9CiAKLWludCBkcmJkX3NlbmRfYml0bWFwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9zZW5kX2JpdG1hcChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7CisJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrID0gJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGE7CiAJaW50IGVyciA9IC0xOwogCiAJbXV0ZXhfbG9jaygmc29jay0+bXV0ZXgpOwogCWlmIChzb2NrLT5zb2NrZXQpCi0JCWVyciA9ICFfZHJiZF9zZW5kX2JpdG1hcChtZGV2KTsKKwkJZXJyID0gIV9kcmJkX3NlbmRfYml0bWFwKGRldmljZSk7CiAJbXV0ZXhfdW5sb2NrKCZzb2NrLT5tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBkcmJkX3NlbmRfYl9hY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1MzIgYmFycmllcl9uciwgdTMyIHNldF9zaXplKQordm9pZCBkcmJkX3NlbmRfYl9hY2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTMyIGJhcnJpZXJfbnIsIHUzMiBzZXRfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmFycmllcl9hY2sgKnA7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUykKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TKQogCQlyZXR1cm47CiAKLQlzb2NrID0gJnRjb25uLT5tZXRhOwotCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jayk7CisJc29jayA9ICZjb25uZWN0aW9uLT5tZXRhOworCXAgPSBjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybjsKIAlwLT5iYXJyaWVyID0gYmFycmllcl9ucjsKIAlwLT5zZXRfc2l6ZSA9IGNwdV90b19iZTMyKHNldF9zaXplKTsKLQljb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9CQVJSSUVSX0FDSywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9CQVJSSUVSX0FDSywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qKgogICogX2RyYmRfc2VuZF9hY2soKSAtIFNlbmRzIGFuIGFjayBwYWNrZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGNtZDoJUGFja2V0IGNvbW1hbmQgY29kZS4KICAqIEBzZWN0b3I6CXNlY3RvciwgbmVlZHMgdG8gYmUgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyCiAgKiBAYmxrc2l6ZToJc2l6ZSBpbiBieXRlLCBuZWVkcyB0byBiZSBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIKICAqIEBibG9ja19pZDoJSWQsIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcgogICovCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAorc3RhdGljIGludCBfZHJiZF9zZW5kX2FjayhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIGVudW0gZHJiZF9wYWNrZXQgY21kLAogCQkJICB1NjQgc2VjdG9yLCB1MzIgYmxrc2l6ZSwgdTY0IGJsb2NrX2lkKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnA7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQorCWlmIChwZWVyX2RldmljZS0+ZGV2aWNlLT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQpCiAJCXJldHVybiAtRUlPOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+bWV0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bWV0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gc2VjdG9yOwogCXAtPmJsb2NrX2lkID0gYmxvY2tfaWQ7CiAJcC0+Ymxrc2l6ZSA9IGJsa3NpemU7Ci0JcC0+c2VxX251bSA9IGNwdV90b19iZTMyKGF0b21pY19pbmNfcmV0dXJuKCZtZGV2LT5wYWNrZXRfc2VxKSk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CisJcC0+c2VxX251bSA9IGNwdV90b19iZTMyKGF0b21pY19pbmNfcmV0dXJuKCZwZWVyX2RldmljZS0+ZGV2aWNlLT5wYWNrZXRfc2VxKSk7CisJcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrLCBjbWQsIHNpemVvZigqcCksIE5VTEwsIDApOwogfQogCiAvKiBkcC0+c2VjdG9yIGFuZCBkcC0+YmxvY2tfaWQgYWxyZWFkeS9zdGlsbCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsCiAgKiBkYXRhX3NpemUgaXMgcGF5bG9hZCBzaXplIGFjY29yZGluZyB0byBkcC0+aGVhZCwKICAqIGFuZCBtYXkgbmVlZCB0byBiZSBjb3JyZWN0ZWQgZm9yIGRpZ2VzdCBzaXplLiAqLwotdm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAordm9pZCBkcmJkX3NlbmRfYWNrX2RwKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgZW51bSBkcmJkX3BhY2tldCBjbWQsCiAJCSAgICAgIHN0cnVjdCBwX2RhdGEgKmRwLCBpbnQgZGF0YV9zaXplKQogewotCWlmIChtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKQotCQlkYXRhX3NpemUgLT0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKTsKLQlfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsIGRwLT5zZWN0b3IsIGNwdV90b19iZTMyKGRhdGFfc2l6ZSksCisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pCisJCWRhdGFfc2l6ZSAtPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pOworCV9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsIGRwLT5zZWN0b3IsIGNwdV90b19iZTMyKGRhdGFfc2l6ZSksCiAJCSAgICAgICBkcC0+YmxvY2tfaWQpOwogfQogCi12b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3BhY2tldCBjbWQsCit2b2lkIGRyYmRfc2VuZF9hY2tfcnAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICAgICAgc3RydWN0IHBfYmxvY2tfcmVxICpycCkKIHsKLQlfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsIHJwLT5zZWN0b3IsIHJwLT5ibGtzaXplLCBycC0+YmxvY2tfaWQpOworCV9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsIHJwLT5zZWN0b3IsIHJwLT5ibGtzaXplLCBycC0+YmxvY2tfaWQpOwogfQogCiAvKioKICAqIGRyYmRfc2VuZF9hY2soKSAtIFNlbmRzIGFuIGFjayBwYWNrZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZQorICogQGRldmljZToJRFJCRCBkZXZpY2UKICAqIEBjbWQ6CXBhY2tldCBjb21tYW5kIGNvZGUKICAqIEBwZWVyX3JlcToJcGVlciByZXF1ZXN0CiAgKi8KLWludCBkcmJkX3NlbmRfYWNrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGVudW0gZHJiZF9wYWNrZXQgY21kLAoraW50IGRyYmRfc2VuZF9hY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewotCXJldHVybiBfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsCisJcmV0dXJuIF9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsCiAJCQkgICAgICBjcHVfdG9fYmU2NChwZWVyX3JlcS0+aS5zZWN0b3IpLAogCQkJICAgICAgY3B1X3RvX2JlMzIocGVlcl9yZXEtPmkuc2l6ZSksCiAJCQkgICAgICBwZWVyX3JlcS0+YmxvY2tfaWQpOwpAQCAtMTM1NiwzMiArMTM2MSwzMiBAQAogCiAvKiBUaGlzIGZ1bmN0aW9uIG1pc3VzZXMgdGhlIGJsb2NrX2lkIGZpZWxkIHRvIHNpZ25hbCBpZiB0aGUgYmxvY2tzCiAgKiBhcmUgaXMgc3luYyBvciBub3QuICovCi1pbnQgZHJiZF9zZW5kX2Fja19leChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2ludCBkcmJkX3NlbmRfYWNrX2V4KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgZW51bSBkcmJkX3BhY2tldCBjbWQsCiAJCSAgICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgYmxrc2l6ZSwgdTY0IGJsb2NrX2lkKQogewotCXJldHVybiBfZHJiZF9zZW5kX2FjayhtZGV2LCBjbWQsCisJcmV0dXJuIF9kcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBjbWQsCiAJCQkgICAgICBjcHVfdG9fYmU2NChzZWN0b3IpLAogCQkJICAgICAgY3B1X3RvX2JlMzIoYmxrc2l6ZSksCiAJCQkgICAgICBjcHVfdG9fYmU2NChibG9ja19pZCkpOwogfQogCi1pbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBjbWQsCitpbnQgZHJiZF9zZW5kX2RyZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgaW50IGNtZCwKIAkJICAgICAgIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsIHU2NCBibG9ja19pZCkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfcmVxICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gY3B1X3RvX2JlNjQoc2VjdG9yKTsKIAlwLT5ibG9ja19pZCA9IGJsb2NrX2lkOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihzaXplKTsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgY21kLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKLWludCBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAoraW50IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwKIAkJCSAgICB2b2lkICpkaWdlc3QsIGludCBkaWdlc3Rfc2l6ZSwgZW51bSBkcmJkX3BhY2tldCBjbWQpCiB7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwpAQCAtMTM4OSw2NCArMTM5NCw2MyBAQAogCiAJLyogRklYTUU6IFB1dCB0aGUgZGlnZXN0IGludG8gdGhlIHByZWFsbG9jYXRlZCBzb2NrZXQgYnVmZmVyLiAgKi8KIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHNlY3Rvcik7CiAJcC0+YmxvY2tfaWQgPSBJRF9TWU5DRVIgLyogdW51c2VkICovOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihzaXplKTsKLQlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQobWRldiwgc29jaywgY21kLCBzaXplb2YoKnApLAotCQkJCSBkaWdlc3QsIGRpZ2VzdF9zaXplKTsKKwlyZXR1cm4gZHJiZF9zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2ssIGNtZCwgc2l6ZW9mKCpwKSwgZGlnZXN0LCBkaWdlc3Rfc2l6ZSk7CiB9CiAKLWludCBkcmJkX3NlbmRfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQoraW50IGRyYmRfc2VuZF9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfcmVxICpwOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87CiAJcC0+c2VjdG9yID0gY3B1X3RvX2JlNjQoc2VjdG9yKTsKIAlwLT5ibG9ja19pZCA9IElEX1NZTkNFUiAvKiB1bnVzZWQgKi87CiAJcC0+Ymxrc2l6ZSA9IGNwdV90b19iZTMyKHNpemUpOwotCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX09WX1JFUVVFU1QsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9PVl9SRVFVRVNULCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyogY2FsbGVkIG9uIHNuZHRpbWVvCiAgKiByZXR1cm5zIGZhbHNlIGlmIHdlIHNob3VsZCByZXRyeSwKICAqIHRydWUgaWYgd2UgdGhpbmsgY29ubmVjdGlvbiBpcyBkZWFkCiAgKi8KLXN0YXRpYyBpbnQgd2Vfc2hvdWxkX2Ryb3BfdGhlX2Nvbm5lY3Rpb24oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQorc3RhdGljIGludCB3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewogCWludCBkcm9wX2l0OwotCS8qIGxvbmcgZWxhcHNlZCA9IChsb25nKShqaWZmaWVzIC0gbWRldi0+bGFzdF9yZWNlaXZlZCk7ICovCisJLyogbG9uZyBlbGFwc2VkID0gKGxvbmcpKGppZmZpZXMgLSBkZXZpY2UtPmxhc3RfcmVjZWl2ZWQpOyAqLwogCi0JZHJvcF9pdCA9ICAgdGNvbm4tPm1ldGEuc29ja2V0ID09IHNvY2sKLQkJfHwgIXRjb25uLT5hc2VuZGVyLnRhc2sKLQkJfHwgZ2V0X3Rfc3RhdGUoJnRjb25uLT5hc2VuZGVyKSAhPSBSVU5OSU5HCi0JCXx8IHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVM7CisJZHJvcF9pdCA9ICAgY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQgPT0gc29jaworCQl8fCAhY29ubmVjdGlvbi0+YXNlbmRlci50YXNrCisJCXx8IGdldF90X3N0YXRlKCZjb25uZWN0aW9uLT5hc2VuZGVyKSAhPSBSVU5OSU5HCisJCXx8IGNvbm5lY3Rpb24tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUzsKIAogCWlmIChkcm9wX2l0KQogCQlyZXR1cm4gdHJ1ZTsKIAotCWRyb3BfaXQgPSAhLS10Y29ubi0+a29fY291bnQ7CisJZHJvcF9pdCA9ICEtLWNvbm5lY3Rpb24tPmtvX2NvdW50OwogCWlmICghZHJvcF9pdCkgewotCQljb25uX2Vycih0Y29ubiwgIlslcy8lZF0gc29ja19zZW5kbXNnIHRpbWUgZXhwaXJlZCwga28gPSAldVxuIiwKLQkJCSBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHRjb25uLT5rb19jb3VudCk7Ci0JCXJlcXVlc3RfcGluZyh0Y29ubik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJbJXMvJWRdIHNvY2tfc2VuZG1zZyB0aW1lIGV4cGlyZWQsIGtvID0gJXVcbiIsCisJCQkgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBjb25uZWN0aW9uLT5rb19jb3VudCk7CisJCXJlcXVlc3RfcGluZyhjb25uZWN0aW9uKTsKIAl9CiAKLQlyZXR1cm4gZHJvcF9pdDsgLyogJiYgKG1kZXYtPnN0YXRlID09IFJfUFJJTUFSWSkgKi87CisJcmV0dXJuIGRyb3BfaXQ7IC8qICYmIChkZXZpY2UtPnN0YXRlID09IFJfUFJJTUFSWSkgKi87CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfdXBkYXRlX2Nvbmdlc3RlZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgdm9pZCBkcmJkX3VwZGF0ZV9jb25nZXN0ZWQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSB0Y29ubi0+ZGF0YS5zb2NrZXQtPnNrOworCXN0cnVjdCBzb2NrICpzayA9IGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LT5zazsKIAlpZiAoc2stPnNrX3dtZW1fcXVldWVkID4gc2stPnNrX3NuZGJ1ZiAqIDQgLyA1KQotCQlzZXRfYml0KE5FVF9DT05HRVNURUQsICZ0Y29ubi0+ZmxhZ3MpOworCQlzZXRfYml0KE5FVF9DT05HRVNURUQsICZjb25uZWN0aW9uLT5mbGFncyk7CiB9CiAKIC8qIFRoZSBpZGVhIG9mIHNlbmRwYWdlIHNlZW1zIHRvIGJlIHRvIHB1dCBzb21lIGtpbmQgb2YgcmVmZXJlbmNlCkBAIC0xNDcwLDI2ICsxNDc0LDI2IEBACiAgKiBBcyBhIHdvcmthcm91bmQsIHdlIGRpc2FibGUgc2VuZHBhZ2Ugb24gcGFnZXMKICAqIHdpdGggcGFnZV9jb3VudCA9PSAwIG9yIFBhZ2VTbGFiLgogICovCi1zdGF0aWMgaW50IF9kcmJkX25vX3NlbmRfcGFnZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0YXRpYyBpbnQgX2RyYmRfbm9fc2VuZF9wYWdlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkgICAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbXNnX2ZsYWdzKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2tldDsKIAl2b2lkICphZGRyOwogCWludCBlcnI7CiAKLQlzb2NrZXQgPSBtZGV2LT50Y29ubi0+ZGF0YS5zb2NrZXQ7CisJc29ja2V0ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGEuc29ja2V0OwogCWFkZHIgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OwotCWVyciA9IGRyYmRfc2VuZF9hbGwobWRldi0+dGNvbm4sIHNvY2tldCwgYWRkciwgc2l6ZSwgbXNnX2ZsYWdzKTsKKwllcnIgPSBkcmJkX3NlbmRfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBzb2NrZXQsIGFkZHIsIHNpemUsIG1zZ19mbGFncyk7CiAJa3VubWFwKHBhZ2UpOwogCWlmICghZXJyKQotCQltZGV2LT5zZW5kX2NudCArPSBzaXplID4+IDk7CisJCXBlZXJfZGV2aWNlLT5kZXZpY2UtPnNlbmRfY250ICs9IHNpemUgPj4gOTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfcGFnZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF9wYWdlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCSAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbXNnX2ZsYWdzKQogewotCXN0cnVjdCBzb2NrZXQgKnNvY2tldCA9IG1kZXYtPnRjb25uLT5kYXRhLnNvY2tldDsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQ7CiAJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CiAJaW50IGxlbiA9IHNpemU7CiAJaW50IGVyciA9IC1FSU87CkBAIC0xNTAxLDEwICsxNTA1LDEwIEBACiAJICogX19wYWdlX2NhY2hlX3JlbGVhc2UgYSBwYWdlIHRoYXQgd291bGQgYWN0dWFsbHkgc3RpbGwgYmUgcmVmZXJlbmNlZAogCSAqIGJ5IHNvbWVvbmUsIGxlYWRpbmcgdG8gc29tZSBvYnNjdXJlIGRlbGF5ZWQgT29wcyBzb21ld2hlcmUgZWxzZS4gKi8KIAlpZiAoZGlzYWJsZV9zZW5kcGFnZSB8fCAocGFnZV9jb3VudChwYWdlKSA8IDEpIHx8IFBhZ2VTbGFiKHBhZ2UpKQotCQlyZXR1cm4gX2RyYmRfbm9fc2VuZF9wYWdlKG1kZXYsIHBhZ2UsIG9mZnNldCwgc2l6ZSwgbXNnX2ZsYWdzKTsKKwkJcmV0dXJuIF9kcmJkX25vX3NlbmRfcGFnZShwZWVyX2RldmljZSwgcGFnZSwgb2Zmc2V0LCBzaXplLCBtc2dfZmxhZ3MpOwogCiAJbXNnX2ZsYWdzIHw9IE1TR19OT1NJR05BTDsKLQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQobWRldi0+dGNvbm4pOworCWRyYmRfdXBkYXRlX2Nvbmdlc3RlZChwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJZG8gewogCQlpbnQgc2VudDsKQEAgLTE1MTIsMTEgKzE1MTYsMTEgQEAKIAkJc2VudCA9IHNvY2tldC0+b3BzLT5zZW5kcGFnZShzb2NrZXQsIHBhZ2UsIG9mZnNldCwgbGVuLCBtc2dfZmxhZ3MpOwogCQlpZiAoc2VudCA8PSAwKSB7CiAJCQlpZiAoc2VudCA9PSAtRUFHQUlOKSB7Ci0JCQkJaWYgKHdlX3Nob3VsZF9kcm9wX3RoZV9jb25uZWN0aW9uKG1kZXYtPnRjb25uLCBzb2NrZXQpKQorCQkJCWlmICh3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgc29ja2V0KSkKIAkJCQkJYnJlYWs7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlkZXZfd2FybihERVYsICIlczogc2l6ZT0lZCBsZW49JWQgc2VudD0lZFxuIiwKKwkJCWRyYmRfd2FybihwZWVyX2RldmljZS0+ZGV2aWNlLCAiJXM6IHNpemU9JWQgbGVuPSVkIHNlbnQ9JWRcbiIsCiAJCQkgICAgIF9fZnVuY19fLCAoaW50KXNpemUsIGxlbiwgc2VudCk7CiAJCQlpZiAoc2VudCA8IDApCiAJCQkJZXJyID0gc2VudDsKQEAgLTE1MjQsMTggKzE1MjgsMTggQEAKIAkJfQogCQlsZW4gICAgLT0gc2VudDsKIAkJb2Zmc2V0ICs9IHNlbnQ7Ci0JfSB3aGlsZSAobGVuID4gMCAvKiBUSElOSyAmJiBtZGV2LT5jc3RhdGUgPj0gQ19DT05ORUNURUQqLyk7CisJfSB3aGlsZSAobGVuID4gMCAvKiBUSElOSyAmJiBkZXZpY2UtPmNzdGF0ZSA+PSBDX0NPTk5FQ1RFRCovKTsKIAlzZXRfZnMob2xkZnMpOwotCWNsZWFyX2JpdChORVRfQ09OR0VTVEVELCAmbWRldi0+dGNvbm4tPmZsYWdzKTsKKwljbGVhcl9iaXQoTkVUX0NPTkdFU1RFRCwgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncyk7CiAKIAlpZiAobGVuID09IDApIHsKIAkJZXJyID0gMDsKLQkJbWRldi0+c2VuZF9jbnQgKz0gc2l6ZSA+PiA5OworCQlwZWVyX2RldmljZS0+ZGV2aWNlLT5zZW5kX2NudCArPSBzaXplID4+IDk7CiAJfQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfc2VuZF9iaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIGludCBfZHJiZF9zZW5kX2JpbyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKQEAgLTE1NDQsNyArMTU0OCw3IEBACiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpdGVyKSB7CiAJCWludCBlcnI7CiAKLQkJZXJyID0gX2RyYmRfbm9fc2VuZF9wYWdlKG1kZXYsIGJ2ZWMuYnZfcGFnZSwKKwkJZXJyID0gX2RyYmRfbm9fc2VuZF9wYWdlKHBlZXJfZGV2aWNlLCBidmVjLmJ2X3BhZ2UsCiAJCQkJCSBidmVjLmJ2X29mZnNldCwgYnZlYy5idl9sZW4sCiAJCQkJCSBiaW9faXRlcl9sYXN0KGJ2ZWMsIGl0ZXIpCiAJCQkJCSA/IDAgOiBNU0dfTU9SRSk7CkBAIC0xNTU0LDcgKzE1NTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9kcmJkX3NlbmRfemNfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgX2RyYmRfc2VuZF96Y19iaW8oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGJpb192ZWMgYnZlYzsKIAlzdHJ1Y3QgYnZlY19pdGVyIGl0ZXI7CkBAIC0xNTYzLDcgKzE1NjcsNyBAQAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQlpbnQgZXJyOwogCi0JCWVyciA9IF9kcmJkX3NlbmRfcGFnZShtZGV2LCBidmVjLmJ2X3BhZ2UsCisJCWVyciA9IF9kcmJkX3NlbmRfcGFnZShwZWVyX2RldmljZSwgYnZlYy5idl9wYWdlLAogCQkJCSAgICAgIGJ2ZWMuYnZfb2Zmc2V0LCBidmVjLmJ2X2xlbiwKIAkJCQkgICAgICBiaW9faXRlcl9sYXN0KGJ2ZWMsIGl0ZXIpID8gMCA6IE1TR19NT1JFKTsKIAkJaWYgKGVycikKQEAgLTE1NzIsNyArMTU3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX2RyYmRfc2VuZF96Y19lZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGludCBfZHJiZF9zZW5kX3pjX2VlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwKIAkJCSAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gcGVlcl9yZXEtPnBhZ2VzOwpAQCAtMTU4Myw3ICsxNTg3LDcgQEAKIAlwYWdlX2NoYWluX2Zvcl9lYWNoKHBhZ2UpIHsKIAkJdW5zaWduZWQgbCA9IG1pbl90KHVuc2lnbmVkLCBsZW4sIFBBR0VfU0laRSk7CiAKLQkJZXJyID0gX2RyYmRfc2VuZF9wYWdlKG1kZXYsIHBhZ2UsIDAsIGwsCisJCWVyciA9IF9kcmJkX3NlbmRfcGFnZShwZWVyX2RldmljZSwgcGFnZSwgMCwgbCwKIAkJCQkgICAgICBwYWdlX2NoYWluX25leHQocGFnZSkgPyBNU0dfTU9SRSA6IDApOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTE1OTIsOSArMTU5Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgYmlvX2ZsYWdzX3RvX3dpcmUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgbG9uZyBiaV9ydykKK3N0YXRpYyB1MzIgYmlvX2ZsYWdzX3RvX3dpcmUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5zaWduZWQgbG9uZyBiaV9ydykKIHsKLQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5NSkKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDk1KQogCQlyZXR1cm4gIChiaV9ydyAmIFJFUV9TWU5DID8gRFBfUldfU1lOQyA6IDApIHwKIAkJCShiaV9ydyAmIFJFUV9GVUEgPyBEUF9GVUEgOiAwKSB8CiAJCQkoYmlfcncgJiBSRVFfRkxVU0ggPyBEUF9GTFVTSCA6IDApIHwKQEAgLTE2MDYsMjggKzE2MTAsMzAgQEAKIC8qIFVzZWQgdG8gc2VuZCB3cml0ZSByZXF1ZXN0cwogICogUl9QUklNQVJZIC0+IFBlZXIJKFBfREFUQSkKICAqLwotaW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQoraW50IGRyYmRfc2VuZF9kYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9kYXRhICpwOwogCXVuc2lnbmVkIGludCBkcF9mbGFncyA9IDA7CiAJaW50IGRnczsKIAlpbnQgZXJyOwogCi0Jc29jayA9ICZtZGV2LT50Y29ubi0+ZGF0YTsKLQlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jayk7Ci0JZGdzID0gbWRldi0+dGNvbm4tPmludGVncml0eV90Zm0gPyBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CisJc29jayA9ICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gZHJiZF9wcmVwYXJlX2NvbW1hbmQocGVlcl9kZXZpY2UsIHNvY2spOworCWRncyA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtID8KKwkgICAgICBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CiAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHJlcS0+aS5zZWN0b3IpOwogCXAtPmJsb2NrX2lkID0gKHVuc2lnbmVkIGxvbmcpcmVxOwotCXAtPnNlcV9udW0gPSBjcHVfdG9fYmUzMihhdG9taWNfaW5jX3JldHVybigmbWRldi0+cGFja2V0X3NlcSkpOwotCWRwX2ZsYWdzID0gYmlvX2ZsYWdzX3RvX3dpcmUobWRldiwgcmVxLT5tYXN0ZXJfYmlvLT5iaV9ydyk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgotCSAgICBtZGV2LT5zdGF0ZS5jb25uIDw9IENfUEFVU0VEX1NZTkNfVCkKKwlwLT5zZXFfbnVtID0gY3B1X3RvX2JlMzIoYXRvbWljX2luY19yZXR1cm4oJmRldmljZS0+cGFja2V0X3NlcSkpOworCWRwX2ZsYWdzID0gYmlvX2ZsYWdzX3RvX3dpcmUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIHJlcS0+bWFzdGVyX2Jpby0+YmlfcncpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPD0gQ19QQVVTRURfU1lOQ19UKQogCQlkcF9mbGFncyB8PSBEUF9NQVlfU0VUX0lOX1NZTkM7Ci0JaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKSB7CiAJCWlmIChyZXEtPnJxX3N0YXRlICYgUlFfRVhQX1JFQ0VJVkVfQUNLKQogCQkJZHBfZmxhZ3MgfD0gRFBfU0VORF9SRUNFSVZFX0FDSzsKIAkJaWYgKHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKQpAQCAtMTYzNSw4ICsxNjQxLDggQEAKIAl9CiAJcC0+ZHBfZmxhZ3MgPSBjcHVfdG9fYmUzMihkcF9mbGFncyk7CiAJaWYgKGRncykKLQkJZHJiZF9jc3VtX2JpbyhtZGV2LCBtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSwgcmVxLT5tYXN0ZXJfYmlvLCBwICsgMSk7Ci0JZXJyID0gX19zZW5kX2NvbW1hbmQobWRldi0+dGNvbm4sIG1kZXYtPnZuciwgc29jaywgUF9EQVRBLCBzaXplb2YoKnApICsgZGdzLCBOVUxMLCByZXEtPmkuc2l6ZSk7CisJCWRyYmRfY3N1bV9iaW8ocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludGVncml0eV90Zm0sIHJlcS0+bWFzdGVyX2JpbywgcCArIDEpOworCWVyciA9IF9fc2VuZF9jb21tYW5kKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBkZXZpY2UtPnZuciwgc29jaywgUF9EQVRBLCBzaXplb2YoKnApICsgZGdzLCBOVUxMLCByZXEtPmkuc2l6ZSk7CiAJaWYgKCFlcnIpIHsKIAkJLyogRm9yIHByb3RvY29sIEEsIHdlIGhhdmUgdG8gbWVtY3B5IHRoZSBwYXlsb2FkIGludG8KIAkJICogc29ja2V0IGJ1ZmZlcnMsIGFzIHdlIG1heSBjb21wbGV0ZSByaWdodCBhd2F5CkBAIC0xNjUwLDE4ICsxNjU2LDE4IEBACiAJCSAqIHJlY2VpdmluZyBzaWRlLCB3ZSBzdXJlIGhhdmUgZGV0ZWN0ZWQgY29ycnVwdGlvbiBlbHNld2hlcmUuCiAJCSAqLwogCQlpZiAoIShyZXEtPnJxX3N0YXRlICYgKFJRX0VYUF9SRUNFSVZFX0FDSyB8IFJRX0VYUF9XUklURV9BQ0spKSB8fCBkZ3MpCi0JCQllcnIgPSBfZHJiZF9zZW5kX2JpbyhtZGV2LCByZXEtPm1hc3Rlcl9iaW8pOworCQkJZXJyID0gX2RyYmRfc2VuZF9iaW8ocGVlcl9kZXZpY2UsIHJlcS0+bWFzdGVyX2Jpbyk7CiAJCWVsc2UKLQkJCWVyciA9IF9kcmJkX3NlbmRfemNfYmlvKG1kZXYsIHJlcS0+bWFzdGVyX2Jpbyk7CisJCQllcnIgPSBfZHJiZF9zZW5kX3pjX2JpbyhwZWVyX2RldmljZSwgcmVxLT5tYXN0ZXJfYmlvKTsKIAogCQkvKiBkb3VibGUgY2hlY2sgZGlnZXN0LCBzb21ldGltZXMgYnVmZmVycyBoYXZlIGJlZW4gbW9kaWZpZWQgaW4gZmxpZ2h0LiAqLwogCQlpZiAoZGdzID4gMCAmJiBkZ3MgPD0gNjQpIHsKIAkJCS8qIDY0IGJ5dGUsIDUxMiBiaXQsIGlzIHRoZSBsYXJnZXN0IGRpZ2VzdCBzaXplCiAJCQkgKiBjdXJyZW50bHkgc3VwcG9ydGVkIGluIGtlcm5lbCBjcnlwdG8uICovCiAJCQl1bnNpZ25lZCBjaGFyIGRpZ2VzdFs2NF07Ci0JCQlkcmJkX2NzdW1fYmlvKG1kZXYsIG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtLCByZXEtPm1hc3Rlcl9iaW8sIGRpZ2VzdCk7CisJCQlkcmJkX2NzdW1fYmlvKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtLCByZXEtPm1hc3Rlcl9iaW8sIGRpZ2VzdCk7CiAJCQlpZiAobWVtY21wKHAgKyAxLCBkaWdlc3QsIGRncykpIHsKLQkJCQlkZXZfd2FybihERVYsCisJCQkJZHJiZF93YXJuKGRldmljZSwKIAkJCQkJIkRpZ2VzdCBtaXNtYXRjaCwgYnVmZmVyIG1vZGlmaWVkIGJ5IHVwcGVyIGxheWVycyBkdXJpbmcgd3JpdGU6ICVsbHVzICsldVxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CiAJCQl9CkBAIC0xNjc4LDE4ICsxNjg0LDIwIEBACiAgKiAgUGVlciAgICAgICAtPiAoZGlza2xlc3MpIFJfUFJJTUFSWSAgIChQX0RBVEFfUkVQTFkpCiAgKiAgQ19TWU5DX1NPVVJDRSAtPiBDX1NZTkNfVEFSR0VUICAgICAgICAgKFBfUlNfREFUQV9SRVBMWSkKICAqLwotaW50IGRyYmRfc2VuZF9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKK2ludCBkcmJkX3NlbmRfYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBlbnVtIGRyYmRfcGFja2V0IGNtZCwKIAkJICAgIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9kYXRhICpwOwogCWludCBlcnI7CiAJaW50IGRnczsKIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAotCWRncyA9IG1kZXYtPnRjb25uLT5pbnRlZ3JpdHlfdGZtID8gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSkgOiAwOworCWRncyA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtID8KKwkgICAgICBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKSA6IDA7CiAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwpAQCAtMTY5OCwyNyArMTcwNiwyNyBAQAogCXAtPnNlcV9udW0gPSAwOyAgLyogdW51c2VkICovCiAJcC0+ZHBfZmxhZ3MgPSAwOwogCWlmIChkZ3MpCi0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+aW50ZWdyaXR5X3RmbSwgcGVlcl9yZXEsIHAgKyAxKTsKLQllcnIgPSBfX3NlbmRfY29tbWFuZChtZGV2LT50Y29ubiwgbWRldi0+dm5yLCBzb2NrLCBjbWQsIHNpemVvZigqcCkgKyBkZ3MsIE5VTEwsIHBlZXJfcmVxLT5pLnNpemUpOworCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludGVncml0eV90Zm0sIHBlZXJfcmVxLCBwICsgMSk7CisJZXJyID0gX19zZW5kX2NvbW1hbmQocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIGRldmljZS0+dm5yLCBzb2NrLCBjbWQsIHNpemVvZigqcCkgKyBkZ3MsIE5VTEwsIHBlZXJfcmVxLT5pLnNpemUpOwogCWlmICghZXJyKQotCQllcnIgPSBfZHJiZF9zZW5kX3pjX2VlKG1kZXYsIHBlZXJfcmVxKTsKKwkJZXJyID0gX2RyYmRfc2VuZF96Y19lZShwZWVyX2RldmljZSwgcGVlcl9yZXEpOwogCW11dGV4X3VubG9jaygmc29jay0+bXV0ZXgpOyAgLyogbG9ja2VkIGJ5IGRyYmRfcHJlcGFyZV9jb21tYW5kKCkgKi8KIAogCXJldHVybiBlcnI7CiB9CiAKLWludCBkcmJkX3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQoraW50IGRyYmRfc2VuZF9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJc3RydWN0IHBfYmxvY2tfZGVzYyAqcDsKIAotCXNvY2sgPSAmbWRldi0+dGNvbm4tPmRhdGE7Ci0JcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKG1kZXYsIHNvY2spOworCXNvY2sgPSAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmRhdGE7CisJcCA9IGRyYmRfcHJlcGFyZV9jb21tYW5kKHBlZXJfZGV2aWNlLCBzb2NrKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXAtPnNlY3RvciA9IGNwdV90b19iZTY0KHJlcS0+aS5zZWN0b3IpOwogCXAtPmJsa3NpemUgPSBjcHVfdG9fYmUzMihyZXEtPmkuc2l6ZSk7Ci0JcmV0dXJuIGRyYmRfc2VuZF9jb21tYW5kKG1kZXYsIHNvY2ssIFBfT1VUX09GX1NZTkMsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChwZWVyX2RldmljZSwgc29jaywgUF9PVVRfT0ZfU1lOQywgc2l6ZW9mKCpwKSwgTlVMTCwgMCk7CiB9CiAKIC8qCkBAIC0xNzM3LDcgKzE3NDUsNyBAQAogLyoKICAqIHlvdSBtdXN0IGhhdmUgZG93bigpZWQgdGhlIGFwcHJvcHJpYXRlIFttXXNvY2tfbXV0ZXggZWxzZXdoZXJlIQogICovCi1pbnQgZHJiZF9zZW5kKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaywKK2ludCBkcmJkX3NlbmQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywKIAkgICAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpCiB7CiAJc3RydWN0IGt2ZWMgaW92OwpAQCAtMTc1OCwxMSArMTc2NiwxMSBAQAogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CiAJbXNnLm1zZ19mbGFncyAgICAgID0gbXNnX2ZsYWdzIHwgTVNHX05PU0lHTkFMOwogCi0JaWYgKHNvY2sgPT0gdGNvbm4tPmRhdGEuc29ja2V0KSB7CisJaWYgKHNvY2sgPT0gY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQl0Y29ubi0+a29fY291bnQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+a29fY291bnQ7CisJCWNvbm5lY3Rpb24tPmtvX2NvdW50ID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKS0+a29fY291bnQ7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQodGNvbm4pOworCQlkcmJkX3VwZGF0ZV9jb25nZXN0ZWQoY29ubmVjdGlvbik7CiAJfQogCWRvIHsKIAkJLyogU1RSQU5HRQpAQCAtMTc3Niw3ICsxNzg0LDcgQEAKICAqLwogCQlydiA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpb3YsIDEsIHNpemUpOwogCQlpZiAocnYgPT0gLUVBR0FJTikgewotCQkJaWYgKHdlX3Nob3VsZF9kcm9wX3RoZV9jb25uZWN0aW9uKHRjb25uLCBzb2NrKSkKKwkJCWlmICh3ZV9zaG91bGRfZHJvcF90aGVfY29ubmVjdGlvbihjb25uZWN0aW9uLCBzb2NrKSkKIAkJCQlicmVhazsKIAkJCWVsc2UKIAkJCQljb250aW51ZTsKQEAgLTE3OTIsMTcgKzE4MDAsMTcgQEAKIAkJaW92Lmlvdl9sZW4gIC09IHJ2OwogCX0gd2hpbGUgKHNlbnQgPCBzaXplKTsKIAotCWlmIChzb2NrID09IHRjb25uLT5kYXRhLnNvY2tldCkKLQkJY2xlYXJfYml0KE5FVF9DT05HRVNURUQsICZ0Y29ubi0+ZmxhZ3MpOworCWlmIChzb2NrID09IGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0KQorCQljbGVhcl9iaXQoTkVUX0NPTkdFU1RFRCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCWlmIChydiA8PSAwKSB7CiAJCWlmIChydiAhPSAtRUFHQUlOKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIiVzX3NlbmRtc2cgcmV0dXJuZWQgJWRcbiIsCi0JCQkJIHNvY2sgPT0gdGNvbm4tPm1ldGEuc29ja2V0ID8gIm1zb2NrIiA6ICJzb2NrIiwKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlc19zZW5kbXNnIHJldHVybmVkICVkXG4iLAorCQkJCSBzb2NrID09IGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0ID8gIm1zb2NrIiA6ICJzb2NrIiwKIAkJCQkgcnYpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0JST0tFTl9QSVBFKSwgQ1NfSEFSRCk7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOwogCQl9IGVsc2UKLQkJCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19USU1FT1VUKSwgQ1NfSEFSRCk7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19USU1FT1VUKSwgQ1NfSEFSRCk7CiAJfQogCiAJcmV0dXJuIHNlbnQ7CkBAIC0xODEzLDEyICsxODIxLDEyIEBACiAgKgogICogUmV0dXJucyAwIHVwb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZSBvdGhlcndpc2UuCiAgKi8KLWludCBkcmJkX3NlbmRfYWxsKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmZmVyLAoraW50IGRyYmRfc2VuZF9hbGwoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmZmVyLAogCQkgIHNpemVfdCBzaXplLCB1bnNpZ25lZCBtc2dfZmxhZ3MpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfc2VuZCh0Y29ubiwgc29jaywgYnVmZmVyLCBzaXplLCBtc2dfZmxhZ3MpOworCWVyciA9IGRyYmRfc2VuZChjb25uZWN0aW9uLCBzb2NrLCBidWZmZXIsIHNpemUsIG1zZ19mbGFncyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKGVyciAhPSBzaXplKQpAQCAtMTgyOCwxNiArMTgzNiwxNiBAQAogCiBzdGF0aWMgaW50IGRyYmRfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBydiA9IDA7CiAKIAltdXRleF9sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQkvKiB0byBoYXZlIGEgc3RhYmxlIG1kZXYtPnN0YXRlLnJvbGUKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwkvKiB0byBoYXZlIGEgc3RhYmxlIGRldmljZS0+c3RhdGUucm9sZQogCSAqIGFuZCBubyByYWNlIHdpdGggdXBkYXRpbmcgb3Blbl9jbnQgKi8KIAotCWlmIChtZGV2LT5zdGF0ZS5yb2xlICE9IFJfUFJJTUFSWSkgeworCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9QUklNQVJZKSB7CiAJCWlmIChtb2RlICYgRk1PREVfV1JJVEUpCiAJCQlydiA9IC1FUk9GUzsKIAkJZWxzZSBpZiAoIWFsbG93X29vcykKQEAgLTE4NDUsOCArMTg1Myw4IEBACiAJfQogCiAJaWYgKCFydikKLQkJbWRldi0+b3Blbl9jbnQrKzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJZGV2aWNlLT5vcGVuX2NudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwogCiAJcmV0dXJuIHJ2OwpAQCAtMTg1NCwxNyArMTg2MiwxNyBAQAogCiBzdGF0aWMgdm9pZCBkcmJkX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmdkLCBmbW9kZV90IG1vZGUpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGdkLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBnZC0+cHJpdmF0ZV9kYXRhOwogCW11dGV4X2xvY2soJmRyYmRfbWFpbl9tdXRleCk7Ci0JbWRldi0+b3Blbl9jbnQtLTsKKwlkZXZpY2UtPm9wZW5fY250LS07CiAJbXV0ZXhfdW5sb2NrKCZkcmJkX21haW5fbXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIHZvaWQgZHJiZF9zZXRfZGVmYXVsdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJLyogQmV3YXJlISBUaGUgYWN0dWFsIGxheW91dCBkaWZmZXJzCiAJICogYmV0d2VlbiBiaWcgZW5kaWFuIGFuZCBsaXR0bGUgZW5kaWFuICovCi0JbWRldi0+c3RhdGUgPSAodW5pb24gZHJiZF9kZXZfc3RhdGUpIHsKKwlkZXZpY2UtPnN0YXRlID0gKHVuaW9uIGRyYmRfZGV2X3N0YXRlKSB7CiAJCXsgLnJvbGUgPSBSX1NFQ09OREFSWSwKIAkJICAucGVlciA9IFJfVU5LTk9XTiwKIAkJICAuY29ubiA9IENfU1RBTkRBTE9ORSwKQEAgLTE4NzMsMTMwICsxODgxLDEyMyBAQAogCQl9IH07CiB9CiAKLXZvaWQgZHJiZF9pbml0X3NldF9kZWZhdWx0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2luaXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIHRoZSBtZW1zZXQoLDAsKSBkaWQgbW9zdCBvZiB0aGlzLgogCSAqIG5vdGU6IG9ubHkgYXNzaWdubWVudHMsIG5vIGFsbG9jYXRpb24gaW4gaGVyZSAqLwogCi0JZHJiZF9zZXRfZGVmYXVsdHMobWRldik7CisJZHJiZF9zZXRfZGVmYXVsdHMoZGV2aWNlKTsKIAotCWF0b21pY19zZXQoJm1kZXYtPmFwX2Jpb19jbnQsIDApOwotCWF0b21pY19zZXQoJm1kZXYtPmFwX3BlbmRpbmdfY250LCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19wZW5kaW5nX2NudCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+dW5hY2tlZF9jbnQsIDApOwotCWF0b21pY19zZXQoJm1kZXYtPmxvY2FsX2NudCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cHBfaW5fdXNlX2J5X25ldCwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cnNfc2VjdF9pbiwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+cnNfc2VjdF9ldiwgMCk7Ci0JYXRvbWljX3NldCgmbWRldi0+YXBfaW5fZmxpZ2h0LCAwKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5tZF9pb19pbl91c2UsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+YXBfYmlvX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT51bmFja2VkX2NudCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5sb2NhbF9jbnQsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+cHBfaW5fdXNlX2J5X25ldCwgMCk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19zZWN0X2luLCAwKTsKKwlhdG9taWNfc2V0KCZkZXZpY2UtPnJzX3NlY3RfZXYsIDApOworCWF0b21pY19zZXQoJmRldmljZS0+YXBfaW5fZmxpZ2h0LCAwKTsKKwlhdG9taWNfc2V0KCZkZXZpY2UtPm1kX2lvX2luX3VzZSwgMCk7CiAKLQltdXRleF9pbml0KCZtZGV2LT5vd25fc3RhdGVfbXV0ZXgpOwotCW1kZXYtPnN0YXRlX211dGV4ID0gJm1kZXYtPm93bl9zdGF0ZV9tdXRleDsKKwltdXRleF9pbml0KCZkZXZpY2UtPm93bl9zdGF0ZV9tdXRleCk7CisJZGV2aWNlLT5zdGF0ZV9tdXRleCA9ICZkZXZpY2UtPm93bl9zdGF0ZV9tdXRleDsKIAotCXNwaW5fbG9ja19pbml0KCZtZGV2LT5hbF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+YWN0aXZlX2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+c3luY19lZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm1kZXYtPmRvbmVfZWUpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5yZWFkX2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+bmV0X2VlKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+cmVzeW5jX3JlYWRzKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+cmVzeW5jX3dvcmsubGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJm1kZXYtPnVucGx1Z193b3JrLmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5nb19kaXNrbGVzcy5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+bWRfc3luY193b3JrLmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZtZGV2LT5zdGFydF9yZXN5bmNfd29yay5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+Ym1faW9fd29yay53Lmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmFjdGl2ZV9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+c3luY19lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+ZG9uZV9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cmVhZF9lZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+bmV0X2VlKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5yZXN5bmNfcmVhZHMpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnJlc3luY193b3JrLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnVucGx1Z193b3JrLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmdvX2Rpc2tsZXNzLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPm1kX3N5bmNfd29yay5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5zdGFydF9yZXN5bmNfd29yay5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5ibV9pb193b3JrLncubGlzdCk7CiAKLQltZGV2LT5yZXN5bmNfd29yay5jYiAgPSB3X3Jlc3luY190aW1lcjsKLQltZGV2LT51bnBsdWdfd29yay5jYiAgPSB3X3NlbmRfd3JpdGVfaGludDsKLQltZGV2LT5nb19kaXNrbGVzcy5jYiAgPSB3X2dvX2Rpc2tsZXNzOwotCW1kZXYtPm1kX3N5bmNfd29yay5jYiA9IHdfbWRfc3luYzsKLQltZGV2LT5ibV9pb193b3JrLncuY2IgPSB3X2JpdG1hcF9pbzsKLQltZGV2LT5zdGFydF9yZXN5bmNfd29yay5jYiA9IHdfc3RhcnRfcmVzeW5jOworCWRldmljZS0+cmVzeW5jX3dvcmsuY2IgID0gd19yZXN5bmNfdGltZXI7CisJZGV2aWNlLT51bnBsdWdfd29yay5jYiAgPSB3X3NlbmRfd3JpdGVfaGludDsKKwlkZXZpY2UtPmdvX2Rpc2tsZXNzLmNiICA9IHdfZ29fZGlza2xlc3M7CisJZGV2aWNlLT5tZF9zeW5jX3dvcmsuY2IgPSB3X21kX3N5bmM7CisJZGV2aWNlLT5ibV9pb193b3JrLncuY2IgPSB3X2JpdG1hcF9pbzsKKwlkZXZpY2UtPnN0YXJ0X3Jlc3luY193b3JrLmNiID0gd19zdGFydF9yZXN5bmM7CiAKLQltZGV2LT5yZXN5bmNfd29yay5tZGV2ICA9IG1kZXY7Ci0JbWRldi0+dW5wbHVnX3dvcmsubWRldiAgPSBtZGV2OwotCW1kZXYtPmdvX2Rpc2tsZXNzLm1kZXYgID0gbWRldjsKLQltZGV2LT5tZF9zeW5jX3dvcmsubWRldiA9IG1kZXY7Ci0JbWRldi0+Ym1faW9fd29yay53Lm1kZXYgPSBtZGV2OwotCW1kZXYtPnN0YXJ0X3Jlc3luY193b3JrLm1kZXYgPSBtZGV2OworCWluaXRfdGltZXIoJmRldmljZS0+cmVzeW5jX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZkZXZpY2UtPm1kX3N5bmNfdGltZXIpOworCWluaXRfdGltZXIoJmRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIpOworCWRldmljZS0+cmVzeW5jX3RpbWVyLmZ1bmN0aW9uID0gcmVzeW5jX3RpbWVyX2ZuOworCWRldmljZS0+cmVzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+bWRfc3luY190aW1lci5mdW5jdGlvbiA9IG1kX3N5bmNfdGltZXJfZm47CisJZGV2aWNlLT5tZF9zeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmZ1bmN0aW9uID0gc3RhcnRfcmVzeW5jX3RpbWVyX2ZuOworCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOworCWRldmljZS0+cmVxdWVzdF90aW1lci5mdW5jdGlvbiA9IHJlcXVlc3RfdGltZXJfZm47CisJZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2aWNlOwogCi0JaW5pdF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyKTsKLQlpbml0X3RpbWVyKCZtZGV2LT5tZF9zeW5jX3RpbWVyKTsKLQlpbml0X3RpbWVyKCZtZGV2LT5zdGFydF9yZXN5bmNfdGltZXIpOwotCWluaXRfdGltZXIoJm1kZXYtPnJlcXVlc3RfdGltZXIpOwotCW1kZXYtPnJlc3luY190aW1lci5mdW5jdGlvbiA9IHJlc3luY190aW1lcl9mbjsKLQltZGV2LT5yZXN5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPm1kX3N5bmNfdGltZXIuZnVuY3Rpb24gPSBtZF9zeW5jX3RpbWVyX2ZuOwotCW1kZXYtPm1kX3N5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPnN0YXJ0X3Jlc3luY190aW1lci5mdW5jdGlvbiA9IHN0YXJ0X3Jlc3luY190aW1lcl9mbjsKLQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OwotCW1kZXYtPnJlcXVlc3RfdGltZXIuZnVuY3Rpb24gPSByZXF1ZXN0X3RpbWVyX2ZuOwotCW1kZXYtPnJlcXVlc3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGV2OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZS0+bWlzY193YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2UtPnN0YXRlX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZS0+ZWVfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2aWNlLT5hbF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2UtPnNlcV93YWl0KTsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1kZXYtPm1pc2Nfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+c3RhdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+ZWVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+YWxfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+c2VxX3dhaXQpOwotCi0JbWRldi0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOwotCW1kZXYtPnBlZXJfbWF4X2Jpb19zaXplID0gRFJCRF9NQVhfQklPX1NJWkVfU0FGRTsKLQltZGV2LT5sb2NhbF9tYXhfYmlvX3NpemUgPSBEUkJEX01BWF9CSU9fU0laRV9TQUZFOworCWRldmljZS0+cmVzeW5jX3dlbnIgPSBMQ19GUkVFOworCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBEUkJEX01BWF9CSU9fU0laRV9TQUZFOworCWRldmljZS0+bG9jYWxfbWF4X2Jpb19zaXplID0gRFJCRF9NQVhfQklPX1NJWkVfU0FGRTsKIH0KIAotdm9pZCBkcmJkX21kZXZfY2xlYW51cChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2RldmljZV9jbGVhbnVwKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBpOwotCWlmIChtZGV2LT50Y29ubi0+cmVjZWl2ZXIudF9zdGF0ZSAhPSBOT05FKQotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQ6IHJlY2VpdmVyIHRfc3RhdGUgPT0gJWQgZXhwZWN0ZWQgMC5cbiIsCi0JCQkJbWRldi0+dGNvbm4tPnJlY2VpdmVyLnRfc3RhdGUpOworCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5yZWNlaXZlci50X3N0YXRlICE9IE5PTkUpCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQ6IHJlY2VpdmVyIHRfc3RhdGUgPT0gJWQgZXhwZWN0ZWQgMC5cbiIsCisJCQkJZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cmVjZWl2ZXIudF9zdGF0ZSk7CiAKLQltZGV2LT5hbF93cml0X2NudCAgPQotCW1kZXYtPmJtX3dyaXRfY250ICA9Ci0JbWRldi0+cmVhZF9jbnQgICAgID0KLQltZGV2LT5yZWN2X2NudCAgICAgPQotCW1kZXYtPnNlbmRfY250ICAgICA9Ci0JbWRldi0+d3JpdF9jbnQgICAgID0KLQltZGV2LT5wX3NpemUgICAgICAgPQotCW1kZXYtPnJzX3N0YXJ0ICAgICA9Ci0JbWRldi0+cnNfdG90YWwgICAgID0KLQltZGV2LT5yc19mYWlsZWQgICAgPSAwOwotCW1kZXYtPnJzX2xhc3RfZXZlbnRzID0gMDsKLQltZGV2LT5yc19sYXN0X3NlY3RfZXYgPSAwOworCWRldmljZS0+YWxfd3JpdF9jbnQgID0KKwlkZXZpY2UtPmJtX3dyaXRfY250ICA9CisJZGV2aWNlLT5yZWFkX2NudCAgICAgPQorCWRldmljZS0+cmVjdl9jbnQgICAgID0KKwlkZXZpY2UtPnNlbmRfY250ICAgICA9CisJZGV2aWNlLT53cml0X2NudCAgICAgPQorCWRldmljZS0+cF9zaXplICAgICAgID0KKwlkZXZpY2UtPnJzX3N0YXJ0ICAgICA9CisJZGV2aWNlLT5yc190b3RhbCAgICAgPQorCWRldmljZS0+cnNfZmFpbGVkICAgID0gMDsKKwlkZXZpY2UtPnJzX2xhc3RfZXZlbnRzID0gMDsKKwlkZXZpY2UtPnJzX2xhc3Rfc2VjdF9ldiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IERSQkRfU1lOQ19NQVJLUzsgaSsrKSB7Ci0JCW1kZXYtPnJzX21hcmtfbGVmdFtpXSA9IDA7Ci0JCW1kZXYtPnJzX21hcmtfdGltZVtpXSA9IDA7CisJCWRldmljZS0+cnNfbWFya19sZWZ0W2ldID0gMDsKKwkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSAwOwogCX0KLQlEX0FTU0VSVChtZGV2LT50Y29ubi0+bmV0X2NvbmYgPT0gTlVMTCk7CisJRF9BU1NFUlQoZGV2aWNlLCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZiA9PSBOVUxMKTsKIAotCWRyYmRfc2V0X215X2NhcGFjaXR5KG1kZXYsIDApOwotCWlmIChtZGV2LT5iaXRtYXApIHsKKwlkcmJkX3NldF9teV9jYXBhY2l0eShkZXZpY2UsIDApOworCWlmIChkZXZpY2UtPmJpdG1hcCkgewogCQkvKiBtYXliZSBuZXZlciBhbGxvY2F0ZWQuICovCi0JCWRyYmRfYm1fcmVzaXplKG1kZXYsIDAsIDEpOwotCQlkcmJkX2JtX2NsZWFudXAobWRldik7CisJCWRyYmRfYm1fcmVzaXplKGRldmljZSwgMCwgMSk7CisJCWRyYmRfYm1fY2xlYW51cChkZXZpY2UpOwogCX0KIAotCWRyYmRfZnJlZV9iYyhtZGV2LT5sZGV2KTsKLQltZGV2LT5sZGV2ID0gTlVMTDsKKwlkcmJkX2ZyZWVfYmMoZGV2aWNlLT5sZGV2KTsKKwlkZXZpY2UtPmxkZXYgPSBOVUxMOwogCi0JY2xlYXJfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQUxfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncyk7CiAKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5hY3RpdmVfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5zeW5jX2VlKSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+ZG9uZV9lZSkpOwotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlYWRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5uZXRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5yZXN5bmNfcmVhZHMpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmsucSkpOwotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlc3luY193b3JrLmxpc3QpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT51bnBsdWdfd29yay5saXN0KSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+Z29fZGlza2xlc3MubGlzdCkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5hY3RpdmVfZWUpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+c3luY19lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5kb25lX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnJlYWRfZWUpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+bmV0X2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnJlc3luY19yZWFkcykpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5yZXN5bmNfd29yay5saXN0KSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPnVucGx1Z193b3JrLmxpc3QpKTsKKwlEX0FTU0VSVChkZXZpY2UsIGxpc3RfZW1wdHkoJmRldmljZS0+Z29fZGlza2xlc3MubGlzdCkpOwogCi0JZHJiZF9zZXRfZGVmYXVsdHMobWRldik7CisJZHJiZF9zZXRfZGVmYXVsdHMoZGV2aWNlKTsKIH0KIAogCkBAIC0yMDExLDcgKzIwMTIsNyBAQAogCQlkcmJkX3BwX3ZhY2FudC0tOwogCX0KIAotCS8qIERfQVNTRVJUKGF0b21pY19yZWFkKCZkcmJkX3BwX3ZhY2FudCk9PTApOyAqLworCS8qIERfQVNTRVJUKGRldmljZSwgYXRvbWljX3JlYWQoJmRyYmRfcHBfdmFjYW50KT09MCk7ICovCiAKIAlpZiAoZHJiZF9tZF9pb19iaW9fc2V0KQogCQliaW9zZXRfZnJlZShkcmJkX21kX2lvX2Jpb19zZXQpOwpAQCAtMjEzMSw2OSArMjEzMiw3MyBAQAogCS5ub3RpZmllcl9jYWxsID0gZHJiZF9ub3RpZnlfc3lzLAogfTsKIAotc3RhdGljIHZvaWQgZHJiZF9yZWxlYXNlX2FsbF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfcmVsZWFzZV9hbGxfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBycjsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+YWN0aXZlX2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gYWN0aXZlIGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBhY3RpdmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+c3luY19lZSk7CisJcnIgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKGRldmljZSwgJmRldmljZS0+c3luY19lZSk7CiAJaWYgKHJyKQotCQlkZXZfZXJyKERFViwgIiVkIEVFcyBpbiBzeW5jIGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBzeW5jIGxpc3QgZm91bmQhXG4iLCBycik7CiAKLQlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMobWRldiwgJm1kZXYtPnJlYWRfZWUpOworCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhkZXZpY2UsICZkZXZpY2UtPnJlYWRfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gcmVhZCBsaXN0IGZvdW5kIVxuIiwgcnIpOworCQlkcmJkX2VycihkZXZpY2UsICIlZCBFRXMgaW4gcmVhZCBsaXN0IGZvdW5kIVxuIiwgcnIpOwogCi0JcnIgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKG1kZXYsICZtZGV2LT5kb25lX2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5kb25lX2VlKTsKIAlpZiAocnIpCi0JCWRldl9lcnIoREVWLCAiJWQgRUVzIGluIGRvbmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiJWQgRUVzIGluIGRvbmUgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIAotCXJyID0gZHJiZF9mcmVlX3BlZXJfcmVxcyhtZGV2LCAmbWRldi0+bmV0X2VlKTsKKwlyciA9IGRyYmRfZnJlZV9wZWVyX3JlcXMoZGV2aWNlLCAmZGV2aWNlLT5uZXRfZWUpOwogCWlmIChycikKLQkJZGV2X2VycihERVYsICIlZCBFRXMgaW4gbmV0IGxpc3QgZm91bmQhXG4iLCBycik7CisJCWRyYmRfZXJyKGRldmljZSwgIiVkIEVFcyBpbiBuZXQgbGlzdCBmb3VuZCFcbiIsIHJyKTsKIH0KIAogLyogY2F1dGlvbi4gbm8gbG9ja2luZy4gKi8KLXZvaWQgZHJiZF9taW5vcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQordm9pZCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKHN0cnVjdCBrcmVmICprcmVmKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfY29uZiwga3JlZik7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfZGV2aWNlLCBrcmVmKTsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UgPSBkZXZpY2UtPnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAKLQlkZWxfdGltZXJfc3luYygmbWRldi0+cmVxdWVzdF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmRldmljZS0+cmVxdWVzdF90aW1lcik7CiAKIAkvKiBwYXJhbm9pYSBhc3NlcnRzICovCi0JRF9BU1NFUlQobWRldi0+b3Blbl9jbnQgPT0gMCk7CisJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPm9wZW5fY250ID09IDApOwogCS8qIGVuZCBwYXJhbm9pYSBhc3NlcnRzICovCiAKIAkvKiBjbGVhbnVwIHN0dWZmIHRoYXQgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZHVyaW5nCiAJICogZGV2aWNlIChyZS0pY29uZmlndXJhdGlvbiBvciBzdGF0ZSBjaGFuZ2VzICovCiAKLQlpZiAobWRldi0+dGhpc19iZGV2KQotCQliZHB1dChtZGV2LT50aGlzX2JkZXYpOworCWlmIChkZXZpY2UtPnRoaXNfYmRldikKKwkJYmRwdXQoZGV2aWNlLT50aGlzX2JkZXYpOwogCi0JZHJiZF9mcmVlX2JjKG1kZXYtPmxkZXYpOwotCW1kZXYtPmxkZXYgPSBOVUxMOworCWRyYmRfZnJlZV9iYyhkZXZpY2UtPmxkZXYpOworCWRldmljZS0+bGRldiA9IE5VTEw7CiAKLQlkcmJkX3JlbGVhc2VfYWxsX3BlZXJfcmVxcyhtZGV2KTsKKwlkcmJkX3JlbGVhc2VfYWxsX3BlZXJfcmVxcyhkZXZpY2UpOwogCi0JbGNfZGVzdHJveShtZGV2LT5hY3RfbG9nKTsKLQlsY19kZXN0cm95KG1kZXYtPnJlc3luYyk7CisJbGNfZGVzdHJveShkZXZpY2UtPmFjdF9sb2cpOworCWxjX2Rlc3Ryb3koZGV2aWNlLT5yZXN5bmMpOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQkvKiBtZGV2LT5wX3V1aWQgPSBOVUxMOyAqLworCWtmcmVlKGRldmljZS0+cF91dWlkKTsKKwkvKiBkZXZpY2UtPnBfdXVpZCA9IE5VTEw7ICovCiAKLQlpZiAobWRldi0+Yml0bWFwKSAvKiBzaG91bGQgbm8gbG9uZ2VyIGJlIHRoZXJlLiAqLwotCQlkcmJkX2JtX2NsZWFudXAobWRldik7Ci0JX19mcmVlX3BhZ2UobWRldi0+bWRfaW9fcGFnZSk7Ci0JcHV0X2Rpc2sobWRldi0+dmRpc2spOwotCWJsa19jbGVhbnVwX3F1ZXVlKG1kZXYtPnJxX3F1ZXVlKTsKLQlrZnJlZShtZGV2LT5yc19wbGFuX3MpOwotCWtmcmVlKG1kZXYpOworCWlmIChkZXZpY2UtPmJpdG1hcCkgLyogc2hvdWxkIG5vIGxvbmdlciBiZSB0aGVyZS4gKi8KKwkJZHJiZF9ibV9jbGVhbnVwKGRldmljZSk7CisJX19mcmVlX3BhZ2UoZGV2aWNlLT5tZF9pb19wYWdlKTsKKwlwdXRfZGlzayhkZXZpY2UtPnZkaXNrKTsKKwlibGtfY2xlYW51cF9xdWV1ZShkZXZpY2UtPnJxX3F1ZXVlKTsKKwlrZnJlZShkZXZpY2UtPnJzX3BsYW5fcyk7CisJa2ZyZWUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CisJa2ZyZWUoZGV2aWNlKTsKIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKKwlrcmVmX3B1dCgmcmVzb3VyY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9yZXNvdXJjZSk7CiB9CiAKIC8qIE9uZSBnbG9iYWwgcmV0cnkgdGhyZWFkLCBpZiB3ZSBuZWVkIHRvIHB1c2ggYmFjayBzb21lIGJpbyBhbmQgaGF2ZSBpdApAQCAtMjIxOCwxOSArMjIyMywxOSBAQAogCXNwaW5fdW5sb2NrX2lycSgmcmV0cnktPmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCAmd3JpdGVzLCB0bF9yZXF1ZXN0cykgewotCQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJCXN0cnVjdCBiaW8gKmJpbyA9IHJlcS0+bWFzdGVyX2JpbzsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gcmVxLT5zdGFydF90aW1lOwogCQlib29sIGV4cGVjdGVkOwogCi0JCWV4cGVjdGVkID0gCisJCWV4cGVjdGVkID0KIAkJCWV4cGVjdChhdG9taWNfcmVhZCgmcmVxLT5jb21wbGV0aW9uX3JlZikgPT0gMCkgJiYKIAkJCWV4cGVjdChyZXEtPnJxX3N0YXRlICYgUlFfUE9TVFBPTkVEKSAmJgogCQkJZXhwZWN0KChyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORykgPT0gMCB8fAogCQkJCShyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfQUJPUlRFRCkgIT0gMCk7CiAKIAkJaWYgKCFleHBlY3RlZCkKLQkJCWRldl9lcnIoREVWLCAicmVxPSVwIGNvbXBsZXRpb25fcmVmPSVkIHJxX3N0YXRlPSV4XG4iLAorCQkJZHJiZF9lcnIoZGV2aWNlLCAicmVxPSVwIGNvbXBsZXRpb25fcmVmPSVkIHJxX3N0YXRlPSV4XG4iLAogCQkJCXJlcSwgYXRvbWljX3JlYWQoJnJlcS0+Y29tcGxldGlvbl9yZWYpLAogCQkJCXJlcS0+cnFfc3RhdGUpOwogCkBAIC0yMjU0LDggKzIyNTksOCBAQAogCiAJCS8qIFdlIGFyZSBub3QganVzdCBkb2luZyBnZW5lcmljX21ha2VfcmVxdWVzdCgpLAogCQkgKiBhcyB3ZSB3YW50IHRvIGtlZXAgdGhlIHN0YXJ0X3RpbWUgaW5mb3JtYXRpb24uICovCi0JCWluY19hcF9iaW8obWRldik7Ci0JCV9fZHJiZF9tYWtlX3JlcXVlc3QobWRldiwgYmlvLCBzdGFydF90aW1lKTsKKwkJaW5jX2FwX2JpbyhkZXZpY2UpOworCQlfX2RyYmRfbWFrZV9yZXF1ZXN0KGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIAl9CiB9CiAKQEAgLTIyNjksMTcgKzIyNzQsMzggQEAKIAkvKiBEcm9wIHRoZSBleHRyYSByZWZlcmVuY2UgdGhhdCB3b3VsZCBvdGhlcndpc2UKIAkgKiBoYXZlIGJlZW4gZHJvcHBlZCBieSBjb21wbGV0ZV9tYXN0ZXJfYmlvLgogCSAqIGRvX3JldHJ5KCkgbmVlZHMgdG8gZ3JhYiBhIG5ldyBvbmUuICovCi0JZGVjX2FwX2JpbyhyZXEtPncubWRldik7CisJZGVjX2FwX2JpbyhyZXEtPmRldmljZSk7CiAKIAlxdWV1ZV93b3JrKHJldHJ5LndxLCAmcmV0cnkud29ya2VyKTsKIH0KIAordm9pZCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBkcmJkX3Jlc291cmNlLCBrcmVmKTsKKworCWlkcl9kZXN0cm95KCZyZXNvdXJjZS0+ZGV2aWNlcyk7CisJZnJlZV9jcHVtYXNrX3ZhcihyZXNvdXJjZS0+Y3B1X21hc2spOworCWtmcmVlKHJlc291cmNlLT5uYW1lKTsKKwlrZnJlZShyZXNvdXJjZSk7Cit9CisKK3ZvaWQgZHJiZF9mcmVlX3Jlc291cmNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCAqdG1wOworCisJZm9yX2VhY2hfY29ubmVjdGlvbl9zYWZlKGNvbm5lY3Rpb24sIHRtcCwgcmVzb3VyY2UpIHsKKwkJbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmNvbm5lY3Rpb25zKTsKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKKwl9CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworfQogCiBzdGF0aWMgdm9pZCBkcmJkX2NsZWFudXAodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgKnRtcDsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsICp0bXA7CiAKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZHJiZF9ub3RpZmllcik7CiAKQEAgLTIyOTksMjYgKzIzMjUsMTkgQEAKIAogCWRyYmRfZ2VubF91bnJlZ2lzdGVyKCk7CiAKLQlpZHJfZm9yX2VhY2hfZW50cnkoJm1pbm9ycywgbWRldiwgaSkgewotCQlpZHJfcmVtb3ZlKCZtaW5vcnMsIG1kZXZfdG9fbWlub3IobWRldikpOwotCQlpZHJfcmVtb3ZlKCZtZGV2LT50Y29ubi0+dm9sdW1lcywgbWRldi0+dm5yKTsKLQkJZGVzdHJveV93b3JrcXVldWUobWRldi0+c3VibWl0LndxKTsKLQkJZGVsX2dlbmRpc2sobWRldi0+dmRpc2spOwotCQkvKiBzeW5jaHJvbml6ZV9yY3UoKTsgTm8gb3RoZXIgdGhyZWFkcyBydW5uaW5nIGF0IHRoaXMgcG9pbnQgKi8KLQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOwotCX0KKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgZGV2aWNlLCBpKQorCQlkcmJkX2RlbGV0ZV9kZXZpY2UoZGV2aWNlKTsKIAogCS8qIG5vdCBfcmN1IHNpbmNlLCBubyBvdGhlciB1cGRhdGVyIGFueW1vcmUuIEdlbmwgYWxyZWFkeSB1bnJlZ2lzdGVyZWQgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGNvbm4sIHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkJbGlzdF9kZWwoJnRjb25uLT5hbGxfdGNvbm4pOyAvKiBub3QgX3JjdSBubyBwcm9jLCBub3Qgb3RoZXIgdGhyZWFkcyAqLwotCQkvKiBzeW5jaHJvbml6ZV9yY3UoKTsgKi8KLQkJa3JlZl9wdXQoJnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlmb3JfZWFjaF9yZXNvdXJjZV9zYWZlKHJlc291cmNlLCB0bXAsICZkcmJkX3Jlc291cmNlcykgeworCQlsaXN0X2RlbCgmcmVzb3VyY2UtPnJlc291cmNlcyk7CisJCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CiAJfQogCiAJZHJiZF9kZXN0cm95X21lbXBvb2xzKCk7CiAJdW5yZWdpc3Rlcl9ibGtkZXYoRFJCRF9NQUpPUiwgImRyYmQiKTsKIAotCWlkcl9kZXN0cm95KCZtaW5vcnMpOworCWlkcl9kZXN0cm95KCZkcmJkX2RldmljZXMpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZHJiZDogbW9kdWxlIGNsZWFudXAgZG9uZS5cbiIpOwogfQpAQCAtMjMzMiw0OSArMjM1MSw1MCBAQAogICovCiBzdGF0aWMgaW50IGRyYmRfY29uZ2VzdGVkKHZvaWQgKmNvbmdlc3RlZF9kYXRhLCBpbnQgYmRpX2JpdHMpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IGNvbmdlc3RlZF9kYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gY29uZ2VzdGVkX2RhdGE7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJY2hhciByZWFzb24gPSAnLSc7CiAJaW50IHIgPSAwOwogCi0JaWYgKCFtYXlfaW5jX2FwX2JpbyhtZGV2KSkgeworCWlmICghbWF5X2luY19hcF9iaW8oZGV2aWNlKSkgewogCQkvKiBEUkJEIGhhcyBmcm96ZW4gSU8gKi8KIAkJciA9IGJkaV9iaXRzOwogCQlyZWFzb24gPSAnZCc7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICh0ZXN0X2JpdChDQUxMQkFDS19QRU5ESU5HLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChDQUxMQkFDS19QRU5ESU5HLCAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZmxhZ3MpKSB7CiAJCXIgfD0gKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCk7CiAJCS8qIFdpdGhvdXQgZ29vZCBsb2NhbCBkYXRhLCB3ZSB3b3VsZCBuZWVkIHRvIHJlYWQgZnJvbSByZW1vdGUsCiAJCSAqIGFuZCB0aGF0IHdvdWxkIG5lZWQgdGhlIHdvcmtlciB0aHJlYWQgYXMgd2VsbCwgd2hpY2ggaXMKIAkJICogY3VycmVudGx5IGJsb2NrZWQgd2FpdGluZyBmb3IgdGhhdCB1c2VybW9kZSBoZWxwZXIgdG8KIAkJICogZmluaXNoLgogCQkgKi8KLQkJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX1VQX1RPX0RBVEUpKQorCQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9VUF9UT19EQVRFKSkKIAkJCXIgfD0gKDEgPDwgQkRJX3N5bmNfY29uZ2VzdGVkKTsKIAkJZWxzZQotCQkJcHV0X2xkZXYobWRldik7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQlyICY9IGJkaV9iaXRzOwogCQlyZWFzb24gPSAnYyc7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlxID0gYmRldl9nZXRfcXVldWUobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlxID0gYmRldl9nZXRfcXVldWUoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCQlyID0gYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgYmRpX2JpdHMpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJaWYgKHIpCiAJCQlyZWFzb24gPSAnYic7CiAJfQogCi0JaWYgKGJkaV9iaXRzICYgKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCkgJiYgdGVzdF9iaXQoTkVUX0NPTkdFU1RFRCwgJm1kZXYtPnRjb25uLT5mbGFncykpIHsKKwlpZiAoYmRpX2JpdHMgJiAoMSA8PCBCRElfYXN5bmNfY29uZ2VzdGVkKSAmJgorCSAgICB0ZXN0X2JpdChORVRfQ09OR0VTVEVELCAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZmxhZ3MpKSB7CiAJCXIgfD0gKDEgPDwgQkRJX2FzeW5jX2Nvbmdlc3RlZCk7CiAJCXJlYXNvbiA9IHJlYXNvbiA9PSAnYicgPyAnYScgOiAnbic7CiAJfQogCiBvdXQ6Ci0JbWRldi0+Y29uZ2VzdGlvbl9yZWFzb24gPSByZWFzb247CisJZGV2aWNlLT5jb25nZXN0aW9uX3JlYXNvbiA9IHJlYXNvbjsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMjM4NSw0NSArMjQwNSw3MiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndxLT5xX3dhaXQpOwogfQogCi1zdHJ1Y3QgZHJiZF90Y29ubiAqY29ubl9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQorc3RydWN0IGNvbXBsZXRpb25fd29yayB7CisJc3RydWN0IGRyYmRfd29yayB3OworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Cit9OworCitzdGF0aWMgaW50IHdfY29tcGxldGUoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGNvbXBsZXRpb25fd29yayAqY29tcGxldGlvbl93b3JrID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBjb21wbGV0aW9uX3dvcmssIHcpOworCisJY29tcGxldGUoJmNvbXBsZXRpb25fd29yay0+ZG9uZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZHJiZF9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfd29ya19xdWV1ZSAqd29ya19xdWV1ZSkKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbl93b3JrIGNvbXBsZXRpb25fd29yazsKKworCWNvbXBsZXRpb25fd29yay53LmNiID0gd19jb21wbGV0ZTsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXBsZXRpb25fd29yay5kb25lKTsKKwlkcmJkX3F1ZXVlX3dvcmsod29ya19xdWV1ZSwgJmNvbXBsZXRpb25fd29yay53KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uX3dvcmsuZG9uZSk7Cit9CisKK3N0cnVjdCBkcmJkX3Jlc291cmNlICpkcmJkX2ZpbmRfcmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2U7CiAKIAlpZiAoIW5hbWUgfHwgIW5hbWVbMF0pCiAJCXJldHVybiBOVUxMOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRjb25uLCAmZHJiZF90Y29ubnMsIGFsbF90Y29ubikgewotCQlpZiAoIXN0cmNtcCh0Y29ubi0+bmFtZSwgbmFtZSkpIHsKLQkJCWtyZWZfZ2V0KCZ0Y29ubi0+a3JlZik7CisJZm9yX2VhY2hfcmVzb3VyY2VfcmN1KHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJaWYgKCFzdHJjbXAocmVzb3VyY2UtPm5hbWUsIG5hbWUpKSB7CisJCQlrcmVmX2dldCgmcmVzb3VyY2UtPmtyZWYpOwogCQkJZ290byBmb3VuZDsKIAkJfQogCX0KLQl0Y29ubiA9IE5VTEw7CisJcmVzb3VyY2UgPSBOVUxMOwogZm91bmQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHRjb25uOworCXJldHVybiByZXNvdXJjZTsKIH0KIAotc3RydWN0IGRyYmRfdGNvbm4gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKK3N0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5fZ2V0X2J5X2FkZHJzKHZvaWQgKm15X2FkZHIsIGludCBteV9hZGRyX2xlbiwKIAkJCQkgICAgIHZvaWQgKnBlZXJfYWRkciwgaW50IHBlZXJfYWRkcl9sZW4pCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRjb25uLCAmZHJiZF90Y29ubnMsIGFsbF90Y29ubikgewotCQlpZiAodGNvbm4tPm15X2FkZHJfbGVuID09IG15X2FkZHJfbGVuICYmCi0JCSAgICB0Y29ubi0+cGVlcl9hZGRyX2xlbiA9PSBwZWVyX2FkZHJfbGVuICYmCi0JCSAgICAhbWVtY21wKCZ0Y29ubi0+bXlfYWRkciwgbXlfYWRkciwgbXlfYWRkcl9sZW4pICYmCi0JCSAgICAhbWVtY21wKCZ0Y29ubi0+cGVlcl9hZGRyLCBwZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pKSB7Ci0JCQlrcmVmX2dldCgmdGNvbm4tPmtyZWYpOwotCQkJZ290byBmb3VuZDsKKwlmb3JfZWFjaF9yZXNvdXJjZV9yY3UocmVzb3VyY2UsICZkcmJkX3Jlc291cmNlcykgeworCQlmb3JfZWFjaF9jb25uZWN0aW9uX3JjdShjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQkJaWYgKGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID09IG15X2FkZHJfbGVuICYmCisJCQkgICAgY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbiA9PSBwZWVyX2FkZHJfbGVuICYmCisJCQkgICAgIW1lbWNtcCgmY29ubmVjdGlvbi0+bXlfYWRkciwgbXlfYWRkciwgbXlfYWRkcl9sZW4pICYmCisJCQkgICAgIW1lbWNtcCgmY29ubmVjdGlvbi0+cGVlcl9hZGRyLCBwZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pKSB7CisJCQkJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CiAJCX0KIAl9Ci0JdGNvbm4gPSBOVUxMOworCWNvbm5lY3Rpb24gPSBOVUxMOwogZm91bmQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHRjb25uOworCXJldHVybiBjb25uZWN0aW9uOwogfQogCiBzdGF0aWMgaW50IGRyYmRfYWxsb2Nfc29ja2V0KHN0cnVjdCBkcmJkX3NvY2tldCAqc29ja2V0KQpAQCAtMjQ0MywyOSArMjQ5MCwzMCBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc29ja2V0LT5yYnVmKTsKIH0KIAotdm9pZCBjb25uX2ZyZWVfY3J5cHRvKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3ZvaWQgY29ubl9mcmVlX2NyeXB0byhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWRyYmRfZnJlZV9zb2NrKHRjb25uKTsKKwlkcmJkX2ZyZWVfc29jayhjb25uZWN0aW9uKTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPmNzdW1zX3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+dmVyaWZ5X3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+Y3JhbV9obWFjX3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+aW50ZWdyaXR5X3RmbSk7Ci0JY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKTsKLQlrZnJlZSh0Y29ubi0+aW50X2RpZ19pbik7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfdnYpOworCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOworCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSk7CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5pbnRlZ3JpdHlfdGZtKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ19pbik7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ192dik7CiAKLQl0Y29ubi0+Y3N1bXNfdGZtID0gTlVMTDsKLQl0Y29ubi0+dmVyaWZ5X3RmbSA9IE5VTEw7Ci0JdGNvbm4tPmNyYW1faG1hY190Zm0gPSBOVUxMOwotCXRjb25uLT5pbnRlZ3JpdHlfdGZtID0gTlVMTDsKLQl0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gTlVMTDsKLQl0Y29ubi0+aW50X2RpZ19pbiA9IE5VTEw7Ci0JdGNvbm4tPmludF9kaWdfdnYgPSBOVUxMOworCWNvbm5lY3Rpb24tPmNzdW1zX3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+aW50ZWdyaXR5X3RmbSA9IE5VTEw7CisJY29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gTlVMTDsKKwljb25uZWN0aW9uLT5pbnRfZGlnX2luID0gTlVMTDsKKwljb25uZWN0aW9uLT5pbnRfZGlnX3Z2ID0gTlVMTDsKIH0KIAotaW50IHNldF9yZXNvdXJjZV9vcHRpb25zKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cykKK2ludCBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCByZXNfb3B0cyAqcmVzX29wdHMpCiB7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAljcHVtYXNrX3Zhcl90IG5ld19jcHVfbWFzazsKIAlpbnQgZXJyOwogCkBAIC0yNDc4LDIyICsyNTI2LDI0IEBACiAKIAkvKiBzaWxlbnRseSBpZ25vcmUgY3B1IG1hc2sgb24gVVAga2VybmVsICovCiAJaWYgKG5yX2NwdV9pZHMgPiAxICYmIHJlc19vcHRzLT5jcHVfbWFza1swXSAhPSAwKSB7Ci0JCS8qIEZJWE1FOiBHZXQgcmlkIG9mIGNvbnN0YW50IDMyIGhlcmUgKi8KLQkJZXJyID0gYml0bWFwX3BhcnNlKHJlc19vcHRzLT5jcHVfbWFzaywgMzIsCisJCWVyciA9IGJpdG1hcF9wYXJzZShyZXNfb3B0cy0+Y3B1X21hc2ssIERSQkRfQ1BVX01BU0tfU0laRSwKIAkJCQkgICBjcHVtYXNrX2JpdHMobmV3X2NwdV9tYXNrKSwgbnJfY3B1X2lkcyk7CiAJCWlmIChlcnIpIHsKLQkJCWNvbm5fd2Fybih0Y29ubiwgImJpdG1hcF9wYXJzZSgpIGZhaWxlZCB3aXRoICVkXG4iLCBlcnIpOworCQkJZHJiZF93YXJuKHJlc291cmNlLCAiYml0bWFwX3BhcnNlKCkgZmFpbGVkIHdpdGggJWRcbiIsIGVycik7CiAJCQkvKiByZXRjb2RlID0gRVJSX0NQVV9NQVNLX1BBUlNFOyAqLwogCQkJZ290byBmYWlsOwogCQl9CiAJfQotCXRjb25uLT5yZXNfb3B0cyA9ICpyZXNfb3B0czsKLQlpZiAoIWNwdW1hc2tfZXF1YWwodGNvbm4tPmNwdV9tYXNrLCBuZXdfY3B1X21hc2spKSB7Ci0JCWNwdW1hc2tfY29weSh0Y29ubi0+Y3B1X21hc2ssIG5ld19jcHVfbWFzayk7Ci0JCWRyYmRfY2FsY19jcHVfbWFzayh0Y29ubik7Ci0JCXRjb25uLT5yZWNlaXZlci5yZXNldF9jcHVfbWFzayA9IDE7Ci0JCXRjb25uLT5hc2VuZGVyLnJlc2V0X2NwdV9tYXNrID0gMTsKLQkJdGNvbm4tPndvcmtlci5yZXNldF9jcHVfbWFzayA9IDE7CisJcmVzb3VyY2UtPnJlc19vcHRzID0gKnJlc19vcHRzOworCWlmIChjcHVtYXNrX2VtcHR5KG5ld19jcHVfbWFzaykpCisJCWRyYmRfY2FsY19jcHVfbWFzaygmbmV3X2NwdV9tYXNrKTsKKwlpZiAoIWNwdW1hc2tfZXF1YWwocmVzb3VyY2UtPmNwdV9tYXNrLCBuZXdfY3B1X21hc2spKSB7CisJCWNwdW1hc2tfY29weShyZXNvdXJjZS0+Y3B1X21hc2ssIG5ld19jcHVfbWFzayk7CisJCWZvcl9lYWNoX2Nvbm5lY3Rpb25fcmN1KGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCQljb25uZWN0aW9uLT5yZWNlaXZlci5yZXNldF9jcHVfbWFzayA9IDE7CisJCQljb25uZWN0aW9uLT5hc2VuZGVyLnJlc2V0X2NwdV9tYXNrID0gMTsKKwkJCWNvbm5lY3Rpb24tPndvcmtlci5yZXNldF9jcHVfbWFzayA9IDE7CisJCX0KIAl9CiAJZXJyID0gMDsKIApAQCAtMjUwMywxNDYgKzI1NTMsMTc3IEBACiAKIH0KIAotLyogY2FsbGVyIG11c3QgYmUgdW5kZXIgZ2VubF9sb2NrKCkgKi8KLXN0cnVjdCBkcmJkX3Rjb25uICpjb25uX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcmVzX29wdHMgKnJlc19vcHRzKQorc3RydWN0IGRyYmRfcmVzb3VyY2UgKmRyYmRfY3JlYXRlX3Jlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKIAotCXRjb25uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfdGNvbm4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uKQotCQlyZXR1cm4gTlVMTDsKLQotCXRjb25uLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uLT5uYW1lKQorCXJlc291cmNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc291cmNlKQogCQlnb3RvIGZhaWw7CisJcmVzb3VyY2UtPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghcmVzb3VyY2UtPm5hbWUpCisJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlOworCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZyZXNvdXJjZS0+Y3B1X21hc2ssIEdGUF9LRVJORUwpKQorCQlnb3RvIGZhaWxfZnJlZV9uYW1lOworCWtyZWZfaW5pdCgmcmVzb3VyY2UtPmtyZWYpOworCWlkcl9pbml0KCZyZXNvdXJjZS0+ZGV2aWNlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5jb25uZWN0aW9ucyk7CisJbGlzdF9hZGRfdGFpbF9yY3UoJnJlc291cmNlLT5yZXNvdXJjZXMsICZkcmJkX3Jlc291cmNlcyk7CisJbXV0ZXhfaW5pdCgmcmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwlzcGluX2xvY2tfaW5pdCgmcmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlyZXR1cm4gcmVzb3VyY2U7CiAKLQlpZiAoZHJiZF9hbGxvY19zb2NrZXQoJnRjb25uLT5kYXRhKSkKLQkJZ290byBmYWlsOwotCWlmIChkcmJkX2FsbG9jX3NvY2tldCgmdGNvbm4tPm1ldGEpKQotCQlnb3RvIGZhaWw7Ci0KLQlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmdGNvbm4tPmNwdV9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJZ290byBmYWlsOwotCi0JaWYgKHNldF9yZXNvdXJjZV9vcHRpb25zKHRjb25uLCByZXNfb3B0cykpCi0JCWdvdG8gZmFpbDsKLQotCXRjb25uLT5jdXJyZW50X2Vwb2NoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjb25uLT5jdXJyZW50X2Vwb2NoKQotCQlnb3RvIGZhaWw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdGNvbm4tPnRyYW5zZmVyX2xvZyk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOwotCXRjb25uLT5lcG9jaHMgPSAxOwotCXNwaW5fbG9ja19pbml0KCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JdGNvbm4tPndyaXRlX29yZGVyaW5nID0gV09fYmRldl9mbHVzaDsKLQotCXRjb25uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IGZhbHNlOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSAwOwotCXRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKLQotCXRjb25uLT5jc3RhdGUgPSBDX1NUQU5EQUxPTkU7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPmNzdGF0ZV9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRjb25uLT5yZXFfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPmNvbmZfdXBkYXRlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0Y29ubi0+cGluZ193YWl0KTsKLQlpZHJfaW5pdCgmdGNvbm4tPnZvbHVtZXMpOwotCi0JZHJiZF9pbml0X3dvcmtxdWV1ZSgmdGNvbm4tPnNlbmRlcl93b3JrKTsKLQltdXRleF9pbml0KCZ0Y29ubi0+ZGF0YS5tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmdGNvbm4tPm1ldGEubXV0ZXgpOwotCi0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT5yZWNlaXZlciwgZHJiZGRfaW5pdCwgInJlY2VpdmVyIik7Ci0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT53b3JrZXIsIGRyYmRfd29ya2VyLCAid29ya2VyIik7Ci0JZHJiZF90aHJlYWRfaW5pdCh0Y29ubiwgJnRjb25uLT5hc2VuZGVyLCBkcmJkX2FzZW5kZXIsICJhc2VuZGVyIik7Ci0KLQlrcmVmX2luaXQoJnRjb25uLT5rcmVmKTsKLQlsaXN0X2FkZF90YWlsX3JjdSgmdGNvbm4tPmFsbF90Y29ubiwgJmRyYmRfdGNvbm5zKTsKLQotCXJldHVybiB0Y29ubjsKLQorZmFpbF9mcmVlX25hbWU6CisJa2ZyZWUocmVzb3VyY2UtPm5hbWUpOworZmFpbF9mcmVlX3Jlc291cmNlOgorCWtmcmVlKHJlc291cmNlKTsKIGZhaWw6Ci0Ja2ZyZWUodGNvbm4tPmN1cnJlbnRfZXBvY2gpOwotCWZyZWVfY3B1bWFza192YXIodGNvbm4tPmNwdV9tYXNrKTsKLQlkcmJkX2ZyZWVfc29ja2V0KCZ0Y29ubi0+bWV0YSk7Ci0JZHJiZF9mcmVlX3NvY2tldCgmdGNvbm4tPmRhdGEpOwotCWtmcmVlKHRjb25uLT5uYW1lKTsKLQlrZnJlZSh0Y29ubik7Ci0KIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBjb25uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCisvKiBjYWxsZXIgbXVzdCBiZSB1bmRlciBnZW5sX2xvY2soKSAqLworc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc19vcHRzICpyZXNfb3B0cykKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfdGNvbm4sIGtyZWYpOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCi0JaWYgKGF0b21pY19yZWFkKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkgIT0gIDApCi0JCWNvbm5fZXJyKHRjb25uLCAiZXBvY2hfc2l6ZTolZFxuIiwgYXRvbWljX3JlYWQoJnRjb25uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplKSk7Ci0Ja2ZyZWUodGNvbm4tPmN1cnJlbnRfZXBvY2gpOworCWNvbm5lY3Rpb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm4gTlVMTDsKIAotCWlkcl9kZXN0cm95KCZ0Y29ubi0+dm9sdW1lcyk7CisJaWYgKGRyYmRfYWxsb2Nfc29ja2V0KCZjb25uZWN0aW9uLT5kYXRhKSkKKwkJZ290byBmYWlsOworCWlmIChkcmJkX2FsbG9jX3NvY2tldCgmY29ubmVjdGlvbi0+bWV0YSkpCisJCWdvdG8gZmFpbDsKIAotCWZyZWVfY3B1bWFza192YXIodGNvbm4tPmNwdV9tYXNrKTsKLQlkcmJkX2ZyZWVfc29ja2V0KCZ0Y29ubi0+bWV0YSk7Ci0JZHJiZF9mcmVlX3NvY2tldCgmdGNvbm4tPmRhdGEpOwotCWtmcmVlKHRjb25uLT5uYW1lKTsKLQlrZnJlZSh0Y29ubi0+aW50X2RpZ19pbik7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfdnYpOwotCWtmcmVlKHRjb25uKTsKKwljb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gpCisJCWdvdG8gZmFpbDsKKworCUlOSVRfTElTVF9IRUFEKCZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2cpOworCisJSU5JVF9MSVNUX0hFQUQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOworCWNvbm5lY3Rpb24tPmVwb2NocyA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOworCWNvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nID0gV09fYmRldl9mbHVzaDsKKworCWNvbm5lY3Rpb24tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0ID0gZmFsc2U7CisJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yID0gMDsKKwljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKKworCXJlc291cmNlID0gZHJiZF9jcmVhdGVfcmVzb3VyY2UobmFtZSk7CisJaWYgKCFyZXNvdXJjZSkKKwkJZ290byBmYWlsOworCisJY29ubmVjdGlvbi0+Y3N0YXRlID0gQ19TVEFOREFMT05FOworCW11dGV4X2luaXQoJmNvbm5lY3Rpb24tPmNzdGF0ZV9tdXRleCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY29ubmVjdGlvbi0+cGluZ193YWl0KTsKKwlpZHJfaW5pdCgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzKTsKKworCWRyYmRfaW5pdF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKKwltdXRleF9pbml0KCZjb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKKwltdXRleF9pbml0KCZjb25uZWN0aW9uLT5tZXRhLm11dGV4KTsKKworCWRyYmRfdGhyZWFkX2luaXQocmVzb3VyY2UsICZjb25uZWN0aW9uLT5yZWNlaXZlciwgZHJiZF9yZWNlaXZlciwgInJlY2VpdmVyIik7CisJY29ubmVjdGlvbi0+cmVjZWl2ZXIuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZHJiZF90aHJlYWRfaW5pdChyZXNvdXJjZSwgJmNvbm5lY3Rpb24tPndvcmtlciwgZHJiZF93b3JrZXIsICJ3b3JrZXIiKTsKKwljb25uZWN0aW9uLT53b3JrZXIuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZHJiZF90aHJlYWRfaW5pdChyZXNvdXJjZSwgJmNvbm5lY3Rpb24tPmFzZW5kZXIsIGRyYmRfYXNlbmRlciwgImFzZW5kZXIiKTsKKwljb25uZWN0aW9uLT5hc2VuZGVyLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisJa3JlZl9pbml0KCZjb25uZWN0aW9uLT5rcmVmKTsKKworCWNvbm5lY3Rpb24tPnJlc291cmNlID0gcmVzb3VyY2U7CisKKwlpZiAoc2V0X3Jlc291cmNlX29wdGlvbnMocmVzb3VyY2UsIHJlc19vcHRzKSkKKwkJZ290byBmYWlsX3Jlc291cmNlOworCisJa3JlZl9nZXQoJnJlc291cmNlLT5rcmVmKTsKKwlsaXN0X2FkZF90YWlsX3JjdSgmY29ubmVjdGlvbi0+Y29ubmVjdGlvbnMsICZyZXNvdXJjZS0+Y29ubmVjdGlvbnMpOworCXJldHVybiBjb25uZWN0aW9uOworCitmYWlsX3Jlc291cmNlOgorCWxpc3RfZGVsKCZyZXNvdXJjZS0+cmVzb3VyY2VzKTsKKwlkcmJkX2ZyZWVfcmVzb3VyY2UocmVzb3VyY2UpOworZmFpbDoKKwlrZnJlZShjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoKTsKKwlkcmJkX2ZyZWVfc29ja2V0KCZjb25uZWN0aW9uLT5tZXRhKTsKKwlkcmJkX2ZyZWVfc29ja2V0KCZjb25uZWN0aW9uLT5kYXRhKTsKKwlrZnJlZShjb25uZWN0aW9uKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotaW50IGluaXRfc3VibWl0dGVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfY29ubmVjdGlvbiwga3JlZik7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gY29ubmVjdGlvbi0+cmVzb3VyY2U7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpICE9ICAwKQorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXBvY2hfc2l6ZTolZFxuIiwgYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKTsKKwlrZnJlZShjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoKTsKKworCWlkcl9kZXN0cm95KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMpOworCisJZHJiZF9mcmVlX3NvY2tldCgmY29ubmVjdGlvbi0+bWV0YSk7CisJZHJiZF9mcmVlX3NvY2tldCgmY29ubmVjdGlvbi0+ZGF0YSk7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ19pbik7CisJa2ZyZWUoY29ubmVjdGlvbi0+aW50X2RpZ192dik7CisJa2ZyZWUoY29ubmVjdGlvbik7CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworfQorCitzdGF0aWMgaW50IGluaXRfc3VibWl0dGVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCS8qIG9wZW5jb2RlZCBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgpLAogCSAqIHRvIGJlIGFibGUgdG8gc2F5ICJkcmJkJWQiLCAuLi4sIG1pbm9yICovCi0JbWRldi0+c3VibWl0LndxID0gYWxsb2Nfd29ya3F1ZXVlKCJkcmJkJXVfc3VibWl0IiwKLQkJCVdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwgbWRldi0+bWlub3IpOwotCWlmICghbWRldi0+c3VibWl0LndxKQorCWRldmljZS0+c3VibWl0LndxID0gYWxsb2Nfd29ya3F1ZXVlKCJkcmJkJXVfc3VibWl0IiwKKwkJCVdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwgZGV2aWNlLT5taW5vcik7CisJaWYgKCFkZXZpY2UtPnN1Ym1pdC53cSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlJTklUX1dPUksoJm1kZXYtPnN1Ym1pdC53b3JrZXIsIGRvX3N1Ym1pdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmbWRldi0+c3VibWl0LndyaXRlcyk7CisJSU5JVF9XT1JLKCZkZXZpY2UtPnN1Ym1pdC53b3JrZXIsIGRvX3N1Ym1pdCk7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+c3VibWl0LmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMpOwogCXJldHVybiAwOwogfQogCi1lbnVtIGRyYmRfcmV0X2NvZGUgY29ubl9uZXdfbWlub3Ioc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bnNpZ25lZCBpbnQgbWlub3IsIGludCB2bnIpCitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwgdW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdm5yKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsICp0bXBfcGVlcl9kZXZpY2U7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7Ci0JaW50IHZucl9nb3QgPSB2bnI7Ci0JaW50IG1pbm9yX2dvdCA9IG1pbm9yOworCWludCBpZDsKIAllbnVtIGRyYmRfcmV0X2NvZGUgZXJyID0gRVJSX05PTUVNOwogCi0JbWRldiA9IG1pbm9yX3RvX21kZXYobWlub3IpOwotCWlmIChtZGV2KQorCWRldmljZSA9IG1pbm9yX3RvX2RldmljZShtaW5vcik7CisJaWYgKGRldmljZSkKIAkJcmV0dXJuIEVSUl9NSU5PUl9FWElTVFM7CiAKIAkvKiBHRlBfS0VSTkVMLCB3ZSBhcmUgb3V0c2lkZSBvZiBhbGwgd3JpdGUtb3V0IHBhdGhzICovCi0JbWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcmJkX2NvbmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1kZXYpCisJZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2UpCiAJCXJldHVybiBFUlJfTk9NRU07CisJa3JlZl9pbml0KCZkZXZpY2UtPmtyZWYpOwogCi0Ja3JlZl9nZXQoJnRjb25uLT5rcmVmKTsKLQltZGV2LT50Y29ubiA9IHRjb25uOworCWtyZWZfZ2V0KCZyZXNvdXJjZS0+a3JlZik7CisJZGV2aWNlLT5yZXNvdXJjZSA9IHJlc291cmNlOworCWRldmljZS0+bWlub3IgPSBtaW5vcjsKKwlkZXZpY2UtPnZuciA9IHZucjsKIAotCW1kZXYtPm1pbm9yID0gbWlub3I7Ci0JbWRldi0+dm5yID0gdm5yOwotCi0JZHJiZF9pbml0X3NldF9kZWZhdWx0cyhtZGV2KTsKKwlkcmJkX2luaXRfc2V0X2RlZmF1bHRzKGRldmljZSk7CiAKIAlxID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwogCWlmICghcSkKIAkJZ290byBvdXRfbm9fcTsKLQltZGV2LT5ycV9xdWV1ZSA9IHE7Ci0JcS0+cXVldWVkYXRhICAgPSBtZGV2OworCWRldmljZS0+cnFfcXVldWUgPSBxOworCXEtPnF1ZXVlZGF0YSAgID0gZGV2aWNlOwogCiAJZGlzayA9IGFsbG9jX2Rpc2soMSk7CiAJaWYgKCFkaXNrKQogCQlnb3RvIG91dF9ub19kaXNrOwotCW1kZXYtPnZkaXNrID0gZGlzazsKKwlkZXZpY2UtPnZkaXNrID0gZGlzazsKIAogCXNldF9kaXNrX3JvKGRpc2ssIHRydWUpOwogCkBAIC0yNjUxLDE0ICsyNzMyLDE0IEBACiAJZGlzay0+Zmlyc3RfbWlub3IgPSBtaW5vcjsKIAlkaXNrLT5mb3BzID0gJmRyYmRfb3BzOwogCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAiZHJiZCVkIiwgbWlub3IpOwotCWRpc2stPnByaXZhdGVfZGF0YSA9IG1kZXY7CisJZGlzay0+cHJpdmF0ZV9kYXRhID0gZGV2aWNlOwogCi0JbWRldi0+dGhpc19iZGV2ID0gYmRnZXQoTUtERVYoRFJCRF9NQUpPUiwgbWlub3IpKTsKKwlkZXZpY2UtPnRoaXNfYmRldiA9IGJkZ2V0KE1LREVWKERSQkRfTUFKT1IsIG1pbm9yKSk7CiAJLyogd2UgaGF2ZSBubyBwYXJ0aXRpb25zLiB3ZSBjb250YWluIG9ubHkgb3Vyc2VsdmVzLiAqLwotCW1kZXYtPnRoaXNfYmRldi0+YmRfY29udGFpbnMgPSBtZGV2LT50aGlzX2JkZXY7CisJZGV2aWNlLT50aGlzX2JkZXYtPmJkX2NvbnRhaW5zID0gZGV2aWNlLT50aGlzX2JkZXY7CiAKIAlxLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IGRyYmRfY29uZ2VzdGVkOwotCXEtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBtZGV2OworCXEtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBkZXZpY2U7CiAKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHEsIGRyYmRfbWFrZV9yZXF1ZXN0KTsKIAlibGtfcXVldWVfZmx1c2gocSwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSk7CkBAIC0yNjY3LDcwICsyNzQ4LDEyNSBAQAogCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhxLCBEUkJEX01BWF9CSU9fU0laRV9TQUZFID4+IDgpOwogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocSwgQkxLX0JPVU5DRV9BTlkpOwogCWJsa19xdWV1ZV9tZXJnZV9idmVjKHEsIGRyYmRfbWVyZ2VfYnZlYyk7Ci0JcS0+cXVldWVfbG9jayA9ICZtZGV2LT50Y29ubi0+cmVxX2xvY2s7IC8qIG5lZWRlZCBzaW5jZSB3ZSB1c2UgKi8KKwlxLT5xdWV1ZV9sb2NrID0gJnJlc291cmNlLT5yZXFfbG9jazsKIAotCW1kZXYtPm1kX2lvX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCWlmICghbWRldi0+bWRfaW9fcGFnZSkKKwlkZXZpY2UtPm1kX2lvX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlLT5tZF9pb19wYWdlKQogCQlnb3RvIG91dF9ub19pb19wYWdlOwogCi0JaWYgKGRyYmRfYm1faW5pdChtZGV2KSkKKwlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpCiAJCWdvdG8gb3V0X25vX2JpdG1hcDsKLQltZGV2LT5yZWFkX3JlcXVlc3RzID0gUkJfUk9PVDsKLQltZGV2LT53cml0ZV9yZXF1ZXN0cyA9IFJCX1JPT1Q7CisJZGV2aWNlLT5yZWFkX3JlcXVlc3RzID0gUkJfUk9PVDsKKwlkZXZpY2UtPndyaXRlX3JlcXVlc3RzID0gUkJfUk9PVDsKIAotCW1pbm9yX2dvdCA9IGlkcl9hbGxvYygmbWlub3JzLCBtZGV2LCBtaW5vciwgbWlub3IgKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAobWlub3JfZ290IDwgMCkgewotCQlpZiAobWlub3JfZ290ID09IC1FTk9TUEMpIHsKKwlpZCA9IGlkcl9hbGxvYygmZHJiZF9kZXZpY2VzLCBkZXZpY2UsIG1pbm9yLCBtaW5vciArIDEsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApIHsKKwkJaWYgKGlkID09IC1FTk9TUEMpIHsKIAkJCWVyciA9IEVSUl9NSU5PUl9FWElTVFM7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygicmVxdWVzdGVkIG1pbm9yIGV4aXN0cyBhbHJlYWR5Iik7CiAJCX0KIAkJZ290byBvdXRfbm9fbWlub3JfaWRyOwogCX0KKwlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKIAotCXZucl9nb3QgPSBpZHJfYWxsb2MoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIsIHZuciArIDEsIEdGUF9LRVJORUwpOwotCWlmICh2bnJfZ290IDwgMCkgewotCQlpZiAodm5yX2dvdCA9PSAtRU5PU1BDKSB7Ci0JCQllcnIgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOwotCQkJZHJiZF9tc2dfcHV0X2luZm8oInJlcXVlc3RlZCB2b2x1bWUgZXhpc3RzIGFscmVhZHkiKTsKKwlpZCA9IGlkcl9hbGxvYygmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZSwgdm5yLCB2bnIgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPCAwKSB7CisJCWlmIChpZCA9PSAtRU5PU1BDKSB7CisJCQllcnIgPSBFUlJfTUlOT1JfRVhJU1RTOworCQkJZHJiZF9tc2dfcHV0X2luZm8oInJlcXVlc3RlZCBtaW5vciBleGlzdHMgYWxyZWFkeSIpOwogCQl9CiAJCWdvdG8gb3V0X2lkcl9yZW1vdmVfbWlub3I7CiAJfQorCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCi0JaWYgKGluaXRfc3VibWl0dGVyKG1kZXYpKSB7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cGVlcl9kZXZpY2VzKTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCXBlZXJfZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZWVyX2RldmljZSkKKwkJCWdvdG8gb3V0X2lkcl9yZW1vdmVfZnJvbV9yZXNvdXJjZTsKKwkJcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQlwZWVyX2RldmljZS0+ZGV2aWNlID0gZGV2aWNlOworCisJCWxpc3RfYWRkKCZwZWVyX2RldmljZS0+cGVlcl9kZXZpY2VzLCAmZGV2aWNlLT5wZWVyX2RldmljZXMpOworCQlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKKworCQlpZCA9IGlkcl9hbGxvYygmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yLCB2bnIgKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlkIDwgMCkgeworCQkJaWYgKGlkID09IC1FTk9TUEMpIHsKKwkJCQllcnIgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOworCQkJCWRyYmRfbXNnX3B1dF9pbmZvKCJyZXF1ZXN0ZWQgdm9sdW1lIGV4aXN0cyBhbHJlYWR5Iik7CisJCQl9CisJCQlnb3RvIG91dF9pZHJfcmVtb3ZlX2Zyb21fcmVzb3VyY2U7CisJCX0KKwkJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCX0KKworCWlmIChpbml0X3N1Ym1pdHRlcihkZXZpY2UpKSB7CiAJCWVyciA9IEVSUl9OT01FTTsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVuYWJsZSB0byBjcmVhdGUgc3VibWl0IHdvcmtxdWV1ZSIpOwogCQlnb3RvIG91dF9pZHJfcmVtb3ZlX3ZvbDsKIAl9CiAKIAlhZGRfZGlzayhkaXNrKTsKLQlrcmVmX2luaXQoJm1kZXYtPmtyZWYpOyAvKiBvbmUgcmVmIGZvciBib3RoIGlkcnMgYW5kIHRoZSB0aGUgYWRkX2Rpc2sgKi8KIAogCS8qIGluaGVyaXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgKi8KLQltZGV2LT5zdGF0ZS5jb25uID0gdGNvbm4tPmNzdGF0ZTsKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCWRyYmRfY29ubmVjdGVkKG1kZXYpOworCWRldmljZS0+c3RhdGUuY29ubiA9IGZpcnN0X2Nvbm5lY3Rpb24ocmVzb3VyY2UpLT5jc3RhdGU7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJZm9yX2VhY2hfcGVlcl9kZXZpY2UocGVlcl9kZXZpY2UsIGRldmljZSkKKwkJCWRyYmRfY29ubmVjdGVkKHBlZXJfZGV2aWNlKTsKKwl9CiAKIAlyZXR1cm4gTk9fRVJST1I7CiAKIG91dF9pZHJfcmVtb3ZlX3ZvbDoKLQlpZHJfcmVtb3ZlKCZ0Y29ubi0+dm9sdW1lcywgdm5yX2dvdCk7CisJaWRyX3JlbW92ZSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCB2bnIpOworb3V0X2lkcl9yZW1vdmVfZnJvbV9yZXNvdXJjZToKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCXBlZXJfZGV2aWNlID0gaWRyX2ZpbmQoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgdm5yKTsKKwkJaWYgKHBlZXJfZGV2aWNlKSB7CisJCQlpZHJfcmVtb3ZlKCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHZucik7CisJCQlrcmVmX3B1dCgmY29ubmVjdGlvbi0+a3JlZiwgZHJiZF9kZXN0cm95X2Nvbm5lY3Rpb24pOworCQl9CisJfQorCWZvcl9lYWNoX3BlZXJfZGV2aWNlX3NhZmUocGVlcl9kZXZpY2UsIHRtcF9wZWVyX2RldmljZSwgZGV2aWNlKSB7CisJCWxpc3RfZGVsKCZwZWVyX2RldmljZS0+cGVlcl9kZXZpY2VzKTsKKwkJa2ZyZWUocGVlcl9kZXZpY2UpOworCX0KKwlpZHJfcmVtb3ZlKCZyZXNvdXJjZS0+ZGV2aWNlcywgdm5yKTsKIG91dF9pZHJfcmVtb3ZlX21pbm9yOgotCWlkcl9yZW1vdmUoJm1pbm9ycywgbWlub3JfZ290KTsKKwlpZHJfcmVtb3ZlKCZkcmJkX2RldmljZXMsIG1pbm9yKTsKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIG91dF9ub19taW5vcl9pZHI6Ci0JZHJiZF9ibV9jbGVhbnVwKG1kZXYpOworCWRyYmRfYm1fY2xlYW51cChkZXZpY2UpOwogb3V0X25vX2JpdG1hcDoKLQlfX2ZyZWVfcGFnZShtZGV2LT5tZF9pb19wYWdlKTsKKwlfX2ZyZWVfcGFnZShkZXZpY2UtPm1kX2lvX3BhZ2UpOwogb3V0X25vX2lvX3BhZ2U6CiAJcHV0X2Rpc2soZGlzayk7CiBvdXRfbm9fZGlzazoKIAlibGtfY2xlYW51cF9xdWV1ZShxKTsKIG91dF9ub19xOgotCWtmcmVlKG1kZXYpOwotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworCWtmcmVlKGRldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIAordm9pZCBkcmJkX2RlbGV0ZV9kZXZpY2Uoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gZGV2aWNlLT5yZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCWludCByZWZzID0gMzsKKworCWZvcl9lYWNoX2Nvbm5lY3Rpb24oY29ubmVjdGlvbiwgcmVzb3VyY2UpIHsKKwkJaWRyX3JlbW92ZSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBkZXZpY2UtPnZucik7CisJCXJlZnMrKzsKKwl9CisJaWRyX3JlbW92ZSgmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZS0+dm5yKTsKKwlpZHJfcmVtb3ZlKCZkcmJkX2RldmljZXMsIGRldmljZV90b19taW5vcihkZXZpY2UpKTsKKwlkZWxfZ2VuZGlzayhkZXZpY2UtPnZkaXNrKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKwlrcmVmX3N1YigmZGV2aWNlLT5rcmVmLCByZWZzLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKK30KKwogaW50IF9faW5pdCBkcmJkX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwpAQCAtMjc2MSwxMCArMjg5NywxMCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRyYmRfcHBfd2FpdCk7CiAKIAlkcmJkX3Byb2MgPSBOVUxMOyAvKiBwbGF5IHNhZmUgZm9yIGRyYmRfY2xlYW51cCAqLwotCWlkcl9pbml0KCZtaW5vcnMpOworCWlkcl9pbml0KCZkcmJkX2RldmljZXMpOwogCiAJcndsb2NrX2luaXQoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmZHJiZF90Y29ubnMpOworCUlOSVRfTElTVF9IRUFEKCZkcmJkX3Jlc291cmNlcyk7CiAKIAllcnIgPSBkcmJkX2dlbmxfcmVnaXN0ZXIoKTsKIAlpZiAoZXJyKSB7CkBAIC0yODIyLDM3ICsyOTU4LDM5IEBACiAJa2ZyZWUobGRldik7CiB9CiAKLXZvaWQgZHJiZF9mcmVlX3NvY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBkcmJkX2ZyZWVfc29jayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWlmICh0Y29ubi0+ZGF0YS5zb2NrZXQpIHsKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOwotCQlrZXJuZWxfc29ja19zaHV0ZG93bih0Y29ubi0+ZGF0YS5zb2NrZXQsIFNIVVRfUkRXUik7Ci0JCXNvY2tfcmVsZWFzZSh0Y29ubi0+ZGF0YS5zb2NrZXQpOwotCQl0Y29ubi0+ZGF0YS5zb2NrZXQgPSBOVUxMOwotCQltdXRleF91bmxvY2soJnRjb25uLT5kYXRhLm11dGV4KTsKKwlpZiAoY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpIHsKKwkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CisJCWtlcm5lbF9zb2NrX3NodXRkb3duKGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LCBTSFVUX1JEV1IpOworCQlzb2NrX3JlbGVhc2UoY29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpOworCQljb25uZWN0aW9uLT5kYXRhLnNvY2tldCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAJfQotCWlmICh0Y29ubi0+bWV0YS5zb2NrZXQpIHsKLQkJbXV0ZXhfbG9jaygmdGNvbm4tPm1ldGEubXV0ZXgpOwotCQlrZXJuZWxfc29ja19zaHV0ZG93bih0Y29ubi0+bWV0YS5zb2NrZXQsIFNIVVRfUkRXUik7Ci0JCXNvY2tfcmVsZWFzZSh0Y29ubi0+bWV0YS5zb2NrZXQpOwotCQl0Y29ubi0+bWV0YS5zb2NrZXQgPSBOVUxMOwotCQltdXRleF91bmxvY2soJnRjb25uLT5tZXRhLm11dGV4KTsKKwlpZiAoY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQpIHsKKwkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+bWV0YS5tdXRleCk7CisJCWtlcm5lbF9zb2NrX3NodXRkb3duKGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LCBTSFVUX1JEV1IpOworCQlzb2NrX3JlbGVhc2UoY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQpOworCQljb25uZWN0aW9uLT5tZXRhLnNvY2tldCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+bWV0YS5tdXRleCk7CiAJfQogfQogCiAvKiBtZXRhIGRhdGEgbWFuYWdlbWVudCAqLwogCi12b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCit2b2lkIGNvbm5fbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX21kX3N5bmMobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9tZF9zeW5jKGRldmljZSk7CisJCWtyZWZfcHV0KCZkZXZpY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9kZXZpY2UpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMjg4Myw3ICszMDIxLDcgQEAKIAogCiAKLXZvaWQgZHJiZF9tZF93cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB2b2lkICpiKQordm9pZCBkcmJkX21kX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB2b2lkICpiKQogewogCXN0cnVjdCBtZXRhX2RhdGFfb25fZGlzayAqYnVmZmVyID0gYjsKIAlzZWN0b3JfdCBzZWN0b3I7CkBAIC0yODkxLDM5ICszMDI5LDM5IEBACiAKIAltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoKmJ1ZmZlcikpOwogCi0JYnVmZmVyLT5sYV9zaXplX3NlY3QgPSBjcHVfdG9fYmU2NChkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKTsKKwlidWZmZXItPmxhX3NpemVfc2VjdCA9IGNwdV90b19iZTY0KGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSk7CiAJZm9yIChpID0gVUlfQ1VSUkVOVDsgaSA8IFVJX1NJWkU7IGkrKykKLQkJYnVmZmVyLT51dWlkW2ldID0gY3B1X3RvX2JlNjQobWRldi0+bGRldi0+bWQudXVpZFtpXSk7Ci0JYnVmZmVyLT5mbGFncyA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmZsYWdzKTsKKwkJYnVmZmVyLT51dWlkW2ldID0gY3B1X3RvX2JlNjQoZGV2aWNlLT5sZGV2LT5tZC51dWlkW2ldKTsKKwlidWZmZXItPmZsYWdzID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5sZGV2LT5tZC5mbGFncyk7CiAJYnVmZmVyLT5tYWdpYyA9IGNwdV90b19iZTMyKERSQkRfTURfTUFHSUNfODRfVU5DTEVBTik7CiAKLQlidWZmZXItPm1kX3NpemVfc2VjdCAgPSBjcHVfdG9fYmUzMihtZGV2LT5sZGV2LT5tZC5tZF9zaXplX3NlY3QpOwotCWJ1ZmZlci0+YWxfb2Zmc2V0ICAgICA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmFsX29mZnNldCk7Ci0JYnVmZmVyLT5hbF9ucl9leHRlbnRzID0gY3B1X3RvX2JlMzIobWRldi0+YWN0X2xvZy0+bnJfZWxlbWVudHMpOworCWJ1ZmZlci0+bWRfc2l6ZV9zZWN0ICA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQubWRfc2l6ZV9zZWN0KTsKKwlidWZmZXItPmFsX29mZnNldCAgICAgPSBjcHVfdG9fYmUzMihkZXZpY2UtPmxkZXYtPm1kLmFsX29mZnNldCk7CisJYnVmZmVyLT5hbF9ucl9leHRlbnRzID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW50cyk7CiAJYnVmZmVyLT5ibV9ieXRlc19wZXJfYml0ID0gY3B1X3RvX2JlMzIoQk1fQkxPQ0tfU0laRSk7Ci0JYnVmZmVyLT5kZXZpY2VfdXVpZCA9IGNwdV90b19iZTY0KG1kZXYtPmxkZXYtPm1kLmRldmljZV91dWlkKTsKKwlidWZmZXItPmRldmljZV91dWlkID0gY3B1X3RvX2JlNjQoZGV2aWNlLT5sZGV2LT5tZC5kZXZpY2VfdXVpZCk7CiAKLQlidWZmZXItPmJtX29mZnNldCA9IGNwdV90b19iZTMyKG1kZXYtPmxkZXYtPm1kLmJtX29mZnNldCk7Ci0JYnVmZmVyLT5sYV9wZWVyX21heF9iaW9fc2l6ZSA9IGNwdV90b19iZTMyKG1kZXYtPnBlZXJfbWF4X2Jpb19zaXplKTsKKwlidWZmZXItPmJtX29mZnNldCA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYm1fb2Zmc2V0KTsKKwlidWZmZXItPmxhX3BlZXJfbWF4X2Jpb19zaXplID0gY3B1X3RvX2JlMzIoZGV2aWNlLT5wZWVyX21heF9iaW9fc2l6ZSk7CiAKLQlidWZmZXItPmFsX3N0cmlwZXMgPSBjcHVfdG9fYmUzMihtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVzKTsKLQlidWZmZXItPmFsX3N0cmlwZV9zaXplXzRrID0gY3B1X3RvX2JlMzIobWRldi0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGspOworCWJ1ZmZlci0+YWxfc3RyaXBlcyA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlcyk7CisJYnVmZmVyLT5hbF9zdHJpcGVfc2l6ZV80ayA9IGNwdV90b19iZTMyKGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGspOwogCi0JRF9BU1NFUlQoZHJiZF9tZF9zcyhtZGV2LT5sZGV2KSA9PSBtZGV2LT5sZGV2LT5tZC5tZF9vZmZzZXQpOwotCXNlY3RvciA9IG1kZXYtPmxkZXYtPm1kLm1kX29mZnNldDsKKwlEX0FTU0VSVChkZXZpY2UsIGRyYmRfbWRfc3MoZGV2aWNlLT5sZGV2KSA9PSBkZXZpY2UtPmxkZXYtPm1kLm1kX29mZnNldCk7CisJc2VjdG9yID0gZGV2aWNlLT5sZGV2LT5tZC5tZF9vZmZzZXQ7CiAKLQlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8obWRldiwgbWRldi0+bGRldiwgc2VjdG9yLCBXUklURSkpIHsKKwlpZiAoZHJiZF9tZF9zeW5jX3BhZ2VfaW8oZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHNlY3RvciwgV1JJVEUpKSB7CiAJCS8qIHRoaXMgd2FzIGEgdHJ5IGFueXdheXMgLi4uICovCi0JCWRldl9lcnIoREVWLCAibWV0YSBkYXRhIHVwZGF0ZSBmYWlsZWQhXG4iKTsKLQkJZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgMSwgRFJCRF9NRVRBX0lPX0VSUk9SKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAibWV0YSBkYXRhIHVwZGF0ZSBmYWlsZWQhXG4iKTsKKwkJZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCAxLCBEUkJEX01FVEFfSU9fRVJST1IpOwogCX0KIH0KIAogLyoqCiAgKiBkcmJkX21kX3N5bmMoKSAtIFdyaXRlcyB0aGUgbWV0YSBkYXRhIHN1cGVyIGJsb2NrIGlmIHRoZSBNRF9ESVJUWSBmbGFnIGJpdCBpcyBzZXQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICovCi12b2lkIGRyYmRfbWRfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX21kX3N5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG1ldGFfZGF0YV9vbl9kaXNrICpidWZmZXI7CiAKQEAgLTI5MzEsMzIgKzMwNjksMzIgQEAKIAlCVUlMRF9CVUdfT04oVUlfU0laRSAhPSA0KTsKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBtZXRhX2RhdGFfb25fZGlzaykgIT0gNDA5Nik7CiAKLQlkZWxfdGltZXIoJm1kZXYtPm1kX3N5bmNfdGltZXIpOworCWRlbF90aW1lcigmZGV2aWNlLT5tZF9zeW5jX3RpbWVyKTsKIAkvKiB0aW1lciBtYXkgYmUgcmVhcm1lZCBieSBkcmJkX21kX21hcmtfZGlydHkoKSBub3cuICovCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTURfRElSVFksICZtZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJLyogV2UgdXNlIGhlcmUgRF9GQUlMRUQgYW5kIG5vdCBEX0FUVEFDSElORyBiZWNhdXNlIHdlIHRyeSB0byB3cml0ZQogCSAqIG1ldGFkYXRhIGV2ZW4gaWYgd2UgZGV0YWNoIGR1ZSB0byBhIGRpc2sgZmFpbHVyZSEgKi8KLQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkKKwlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKQogCQlyZXR1cm47CiAKLQlidWZmZXIgPSBkcmJkX21kX2dldF9idWZmZXIobWRldik7CisJYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKGRldmljZSk7CiAJaWYgKCFidWZmZXIpCiAJCWdvdG8gb3V0OwogCi0JZHJiZF9tZF93cml0ZShtZGV2LCBidWZmZXIpOworCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCi0JLyogVXBkYXRlIG1kZXYtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCwKKwkvKiBVcGRhdGUgZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3QsCiAJICogc2luY2Ugd2UgdXBkYXRlZCBpdCBvbiBtZXRhZGF0YS4gKi8KLQltZGV2LT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpOworCWRldmljZS0+bGRldi0+bWQubGFfc2l6ZV9zZWN0ID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCi0JZHJiZF9tZF9wdXRfYnVmZmVyKG1kZXYpOworCWRyYmRfbWRfcHV0X2J1ZmZlcihkZXZpY2UpOwogb3V0OgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGNoZWNrX2FjdGl2aXR5X2xvZ19zdHJpcGVfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IG1ldGFfZGF0YV9vbl9kaXNrICpvbl9kaXNrLAogCQlzdHJ1Y3QgZHJiZF9tZCAqaW5fY29yZSkKIHsKQEAgLTI5OTYsMTIgKzMxMzQsMTIgQEAKIAogCXJldHVybiAwOwogZXJyOgotCWRldl9lcnIoREVWLCAiaW52YWxpZCBhY3Rpdml0eSBsb2cgc3RyaXBpbmc6IGFsX3N0cmlwZXM9JXUsIGFsX3N0cmlwZV9zaXplXzRrPSV1XG4iLAorCWRyYmRfZXJyKGRldmljZSwgImludmFsaWQgYWN0aXZpdHkgbG9nIHN0cmlwaW5nOiBhbF9zdHJpcGVzPSV1LCBhbF9zdHJpcGVfc2l6ZV80az0ldVxuIiwKIAkJCWFsX3N0cmlwZXMsIGFsX3N0cmlwZV9zaXplXzRrKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBjaGVja19vZmZzZXRzX2FuZF9zaXplcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldikKK3N0YXRpYyBpbnQgY2hlY2tfb2Zmc2V0c19hbmRfc2l6ZXMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2KQogewogCXNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkoYmRldi0+bWRfYmRldik7CiAJc3RydWN0IGRyYmRfbWQgKmluX2NvcmUgPSAmYmRldi0+bWQ7CkBAIC0zMDY4LDcgKzMyMDYsNyBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JZGV2X2VycihERVYsICJtZXRhIGRhdGEgb2Zmc2V0cyBkb24ndCBtYWtlIHNlbnNlOiBpZHg9JWQgIgorCWRyYmRfZXJyKGRldmljZSwgIm1ldGEgZGF0YSBvZmZzZXRzIGRvbid0IG1ha2Ugc2Vuc2U6IGlkeD0lZCAiCiAJCQkiYWxfcz0ldSwgYWxfc3o0az0ldSwgYWxfb2Zmc2V0PSVkLCBibV9vZmZzZXQ9JWQsICIKIAkJCSJtZF9zaXplX3NlY3Q9JXUsIGxhX3NpemU9JWxsdSwgbWRfY2FwYWNpdHk9JWxsdVxuIiwKIAkJCWluX2NvcmUtPm1ldGFfZGV2X2lkeCwKQEAgLTMwODMsMjUgKzMyMjEsMjUgQEAKIAogLyoqCiAgKiBkcmJkX21kX3JlYWQoKSAtIFJlYWRzIGluIHRoZSBtZXRhIGRhdGEgc3VwZXIgYmxvY2sKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGJkZXY6CURldmljZSBmcm9tIHdoaWNoIHRoZSBtZXRhIGRhdGEgc2hvdWxkIGJlIHJlYWQgaW4uCiAgKgogICogUmV0dXJuIE5PX0VSUk9SIG9uIHN1Y2Nlc3MsIGFuZCBhbiBlbnVtIGRyYmRfcmV0X2NvZGUgaW4gY2FzZQogICogc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAgKgogICogQ2FsbGVkIGV4YWN0bHkgb25jZSBkdXJpbmcgZHJiZF9hZG1fYXR0YWNoKCksIHdoaWxlIHN0aWxsIGJlaW5nIERfRElTS0xFU1MsCi0gKiBldmVuIGJlZm9yZSBAYmRldiBpcyBhc3NpZ25lZCB0byBAbWRldi0+bGRldi4KKyAqIGV2ZW4gYmVmb3JlIEBiZGV2IGlzIGFzc2lnbmVkIHRvIEBkZXZpY2UtPmxkZXYuCiAgKi8KLWludCBkcmJkX21kX3JlYWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYpCitpbnQgZHJiZF9tZF9yZWFkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldikKIHsKIAlzdHJ1Y3QgbWV0YV9kYXRhX29uX2Rpc2sgKmJ1ZmZlcjsKIAl1MzIgbWFnaWMsIGZsYWdzOwogCWludCBpLCBydiA9IE5PX0VSUk9SOwogCi0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9ESVNLTEVTUykKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrICE9IERfRElTS0xFU1MpCiAJCXJldHVybiBFUlJfRElTS19DT05GSUdVUkVEOwogCi0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOworCWJ1ZmZlciA9IGRyYmRfbWRfZ2V0X2J1ZmZlcihkZXZpY2UpOwogCWlmICghYnVmZmVyKQogCQlyZXR1cm4gRVJSX05PTUVNOwogCkBAIC0zMTEwLDEwICszMjQ4LDEwIEBACiAJYmRldi0+bWQubWV0YV9kZXZfaWR4ID0gYmRldi0+ZGlza19jb25mLT5tZXRhX2Rldl9pZHg7CiAJYmRldi0+bWQubWRfb2Zmc2V0ID0gZHJiZF9tZF9zcyhiZGV2KTsKIAotCWlmIChkcmJkX21kX3N5bmNfcGFnZV9pbyhtZGV2LCBiZGV2LCBiZGV2LT5tZC5tZF9vZmZzZXQsIFJFQUQpKSB7CisJaWYgKGRyYmRfbWRfc3luY19wYWdlX2lvKGRldmljZSwgYmRldiwgYmRldi0+bWQubWRfb2Zmc2V0LCBSRUFEKSkgewogCQkvKiBOT1RFOiBjYW4ndCBkbyBub3JtYWwgZXJyb3IgcHJvY2Vzc2luZyBoZXJlIGFzIHRoaXMgaXMKIAkJICAgY2FsbGVkIEJFRk9SRSBkaXNrIGlzIGF0dGFjaGVkICovCi0JCWRldl9lcnIoREVWLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBtZXRhZGF0YS5cbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJFcnJvciB3aGlsZSByZWFkaW5nIG1ldGFkYXRhLlxuIik7CiAJCXJ2ID0gRVJSX0lPX01EX0RJU0s7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxMjMsNyArMzI2MSw3IEBACiAJaWYgKG1hZ2ljID09IERSQkRfTURfTUFHSUNfODRfVU5DTEVBTiB8fAogCSAgICAobWFnaWMgPT0gRFJCRF9NRF9NQUdJQ18wOCAmJiAhKGZsYWdzICYgTURGX0FMX0NMRUFOKSkpIHsKIAkJCS8qIGJ0dzogdGhhdCdzIEFjdGl2aXR5IExvZyBjbGVhbiwgbm90ICJhbGwiIGNsZWFuLiAqLwotCQlkZXZfZXJyKERFViwgIkZvdW5kIHVuY2xlYW4gbWV0YSBkYXRhLiBEaWQgeW91IFwiZHJiZGFkbSBhcHBseS1hbFwiP1xuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkZvdW5kIHVuY2xlYW4gbWV0YSBkYXRhLiBEaWQgeW91IFwiZHJiZGFkbSBhcHBseS1hbFwiP1xuIik7CiAJCXJ2ID0gRVJSX01EX1VOQ0xFQU47CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxMzEsMTQgKzMyNjksMTQgQEAKIAlydiA9IEVSUl9NRF9JTlZBTElEOwogCWlmIChtYWdpYyAhPSBEUkJEX01EX01BR0lDXzA4KSB7CiAJCWlmIChtYWdpYyA9PSBEUkJEX01EX01BR0lDXzA3KQotCQkJZGV2X2VycihERVYsICJGb3VuZCBvbGQgKDAuNykgbWV0YSBkYXRhIG1hZ2ljLiBEaWQgeW91IFwiZHJiZGFkbSBjcmVhdGUtbWRcIj9cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiRm91bmQgb2xkICgwLjcpIG1ldGEgZGF0YSBtYWdpYy4gRGlkIHlvdSBcImRyYmRhZG0gY3JlYXRlLW1kXCI/XG4iKTsKIAkJZWxzZQotCQkJZGV2X2VycihERVYsICJNZXRhIGRhdGEgbWFnaWMgbm90IGZvdW5kLiBEaWQgeW91IFwiZHJiZGFkbSBjcmVhdGUtbWRcIj9cbiIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiTWV0YSBkYXRhIG1hZ2ljIG5vdCBmb3VuZC4gRGlkIHlvdSBcImRyYmRhZG0gY3JlYXRlLW1kXCI/XG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJaWYgKGJlMzJfdG9fY3B1KGJ1ZmZlci0+Ym1fYnl0ZXNfcGVyX2JpdCkgIT0gQk1fQkxPQ0tfU0laRSkgewotCQlkZXZfZXJyKERFViwgInVuZXhwZWN0ZWQgYm1fYnl0ZXNfcGVyX2JpdDogJXUgKGV4cGVjdGVkICV1KVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBibV9ieXRlc19wZXJfYml0OiAldSAoZXhwZWN0ZWQgJXUpXG4iLAogCQkgICAgYmUzMl90b19jcHUoYnVmZmVyLT5ibV9ieXRlc19wZXJfYml0KSwgQk1fQkxPQ0tfU0laRSk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMxNTUsMTgyICszMjkzLDE4MiBAQAogCWJkZXYtPm1kLmFsX29mZnNldCA9IGJlMzJfdG9fY3B1KGJ1ZmZlci0+YWxfb2Zmc2V0KTsKIAliZGV2LT5tZC5ibV9vZmZzZXQgPSBiZTMyX3RvX2NwdShidWZmZXItPmJtX29mZnNldCk7CiAKLQlpZiAoY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKG1kZXYsIGJ1ZmZlciwgJmJkZXYtPm1kKSkKKwlpZiAoY2hlY2tfYWN0aXZpdHlfbG9nX3N0cmlwZV9zaXplKGRldmljZSwgYnVmZmVyLCAmYmRldi0+bWQpKQogCQlnb3RvIGVycjsKLQlpZiAoY2hlY2tfb2Zmc2V0c19hbmRfc2l6ZXMobWRldiwgYmRldikpCisJaWYgKGNoZWNrX29mZnNldHNfYW5kX3NpemVzKGRldmljZSwgYmRldikpCiAJCWdvdG8gZXJyOwogCiAJaWYgKGJlMzJfdG9fY3B1KGJ1ZmZlci0+Ym1fb2Zmc2V0KSAhPSBiZGV2LT5tZC5ibV9vZmZzZXQpIHsKLQkJZGV2X2VycihERVYsICJ1bmV4cGVjdGVkIGJtX29mZnNldDogJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBibV9vZmZzZXQ6ICVkIChleHBlY3RlZCAlZClcbiIsCiAJCSAgICBiZTMyX3RvX2NwdShidWZmZXItPmJtX29mZnNldCksIGJkZXYtPm1kLmJtX29mZnNldCk7CiAJCWdvdG8gZXJyOwogCX0KIAlpZiAoYmUzMl90b19jcHUoYnVmZmVyLT5tZF9zaXplX3NlY3QpICE9IGJkZXYtPm1kLm1kX3NpemVfc2VjdCkgewotCQlkZXZfZXJyKERFViwgInVuZXhwZWN0ZWQgbWRfc2l6ZTogJXUgKGV4cGVjdGVkICV1KVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAidW5leHBlY3RlZCBtZF9zaXplOiAldSAoZXhwZWN0ZWQgJXUpXG4iLAogCQkgICAgYmUzMl90b19jcHUoYnVmZmVyLT5tZF9zaXplX3NlY3QpLCBiZGV2LT5tZC5tZF9zaXplX3NlY3QpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlydiA9IE5PX0VSUk9SOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkgewogCQl1bnNpZ25lZCBpbnQgcGVlcjsKIAkJcGVlciA9IGJlMzJfdG9fY3B1KGJ1ZmZlci0+bGFfcGVlcl9tYXhfYmlvX3NpemUpOwogCQlwZWVyID0gbWF4KHBlZXIsIERSQkRfTUFYX0JJT19TSVpFX1NBRkUpOwotCQltZGV2LT5wZWVyX21heF9iaW9fc2l6ZSA9IHBlZXI7CisJCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBwZWVyOwogCX0KLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAKICBlcnI6Ci0JZHJiZF9tZF9wdXRfYnVmZmVyKG1kZXYpOworCWRyYmRfbWRfcHV0X2J1ZmZlcihkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiAvKioKICAqIGRyYmRfbWRfbWFya19kaXJ0eSgpIC0gTWFyayBtZXRhIGRhdGEgc3VwZXIgYmxvY2sgYXMgZGlydHkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENhbGwgdGhpcyBmdW5jdGlvbiBpZiB5b3UgY2hhbmdlIGFueXRoaW5nIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8KICAqIHRoZSBtZXRhLWRhdGEgc3VwZXIgYmxvY2suIFRoaXMgZnVuY3Rpb24gc2V0cyBNRF9ESVJUWSwgYW5kIHN0YXJ0cyBhCiAgKiB0aW1lciB0aGF0IGVuc3VyZXMgdGhhdCB3aXRoaW4gZml2ZSBzZWNvbmRzIHlvdSBoYXZlIHRvIGNhbGwgZHJiZF9tZF9zeW5jKCkuCiAgKi8KICNpZmRlZiBERUJVRwotdm9pZCBkcmJkX21kX21hcmtfZGlydHlfKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKQordm9pZCBkcmJkX21kX21hcmtfZGlydHlfKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuYykKIHsKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZtZGV2LT5mbGFncykpIHsKLQkJbW9kX3RpbWVyKCZtZGV2LT5tZF9zeW5jX3RpbWVyLCBqaWZmaWVzICsgSFopOwotCQltZGV2LT5sYXN0X21kX21hcmtfZGlydHkubGluZSA9IGxpbmU7Ci0JCW1kZXYtPmxhc3RfbWRfbWFya19kaXJ0eS5mdW5jID0gZnVuYzsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkgeworCQltb2RfdGltZXIoJmRldmljZS0+bWRfc3luY190aW1lciwgamlmZmllcyArIEhaKTsKKwkJZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkubGluZSA9IGxpbmU7CisJCWRldmljZS0+bGFzdF9tZF9tYXJrX2RpcnR5LmZ1bmMgPSBmdW5jOwogCX0KIH0KICNlbHNlCi12b2lkIGRyYmRfbWRfbWFya19kaXJ0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX21kX21hcmtfZGlydHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE1EX0RJUlRZLCAmbWRldi0+ZmxhZ3MpKQotCQltb2RfdGltZXIoJm1kZXYtPm1kX3N5bmNfdGltZXIsIGppZmZpZXMgKyA1KkhaKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTURfRElSVFksICZkZXZpY2UtPmZsYWdzKSkKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPm1kX3N5bmNfdGltZXIsIGppZmZpZXMgKyA1KkhaKTsKIH0KICNlbmRpZgogCi12b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCit2b2lkIGRyYmRfdXVpZF9tb3ZlX2hpc3Rvcnkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCWludCBpOwogCiAJZm9yIChpID0gVUlfSElTVE9SWV9TVEFSVDsgaSA8IFVJX0hJU1RPUllfRU5EOyBpKyspCi0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbaSsxXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbaV07CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtpKzFdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW2ldOwogfQogCi12b2lkIF9fZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgX19kcmJkX3V1aWRfc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKIHsKIAlpZiAoaWR4ID09IFVJX0NVUlJFTlQpIHsKLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSkKIAkJCXZhbCB8PSAxOwogCQllbHNlCiAJCQl2YWwgJj0gfigodTY0KTEpOwogCi0JCWRyYmRfc2V0X2VkX3V1aWQobWRldiwgdmFsKTsKKwkJZHJiZF9zZXRfZWRfdXVpZChkZXZpY2UsIHZhbCk7CiAJfQogCi0JbWRldi0+bGRldi0+bWQudXVpZFtpZHhdID0gdmFsOwotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKKwlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaWR4XSA9IHZhbDsKKwlkcmJkX21kX21hcmtfZGlydHkoZGV2aWNlKTsKIH0KIAotdm9pZCBfZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgX2RyYmRfdXVpZF9zZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOwotCV9fZHJiZF91dWlkX3NldChtZGV2LCBpZHgsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgaWR4LCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgaWR4LCB1NjQgdmFsKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgZHJiZF91dWlkX3NldChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGlkeCwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7Ci0JaWYgKG1kZXYtPmxkZXYtPm1kLnV1aWRbaWR4XSkgewotCQlkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gbWRldi0+bGRldi0+bWQudXVpZFtpZHhdOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCWlmIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbaWR4XSkgeworCQlkcmJkX3V1aWRfbW92ZV9oaXN0b3J5KGRldmljZSk7CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpZHhdOwogCX0KLQlfX2RyYmRfdXVpZF9zZXQobWRldiwgaWR4LCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCV9fZHJiZF91dWlkX3NldChkZXZpY2UsIGlkeCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOwogfQogCiAvKioKICAqIGRyYmRfdXVpZF9uZXdfY3VycmVudCgpIC0gQ3JlYXRlcyBhIG5ldyBjdXJyZW50IFVVSUQKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENyZWF0ZXMgYSBuZXcgY3VycmVudCBVVUlELCBhbmQgcm90YXRlcyB0aGUgb2xkIGN1cnJlbnQgVVVJRCBpbnRvCiAgKiB0aGUgYml0bWFwIHNsb3QuIENhdXNlcyBhbiBpbmNyZW1lbnRhbCByZXN5bmMgdXBvbiBuZXh0IGNvbm5lY3QuCiAgKi8KLXZvaWQgZHJiZF91dWlkX25ld19jdXJyZW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQordm9pZCBkcmJkX3V1aWRfbmV3X2N1cnJlbnQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXU2NCB2YWw7CiAJdW5zaWduZWQgbG9uZyBsb25nIGJtX3V1aWQ7CiAKIAlnZXRfcmFuZG9tX2J5dGVzKCZ2YWwsIHNpemVvZih1NjQpKTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7Ci0JYm1fdXVpZCA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJYm1fdXVpZCA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdOwogCiAJaWYgKGJtX3V1aWQpCi0JCWRldl93YXJuKERFViwgImJtIFVVSUQgd2FzIGFscmVhZHkgc2V0OiAlbGxYXG4iLCBibV91dWlkKTsKKwkJZHJiZF93YXJuKGRldmljZSwgImJtIFVVSUQgd2FzIGFscmVhZHkgc2V0OiAlbGxYXG4iLCBibV91dWlkKTsKIAotCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF07Ci0JX19kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0NVUlJFTlQsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5sZGV2LT5tZC51dWlkX2xvY2spOworCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdOworCV9fZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0NVUlJFTlQsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CiAKLQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJuZXcgY3VycmVudCBVVUlEIik7CisJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJuZXcgY3VycmVudCBVVUlEIik7CiAJLyogZ2V0IGl0IHRvIHN0YWJsZSBzdG9yYWdlIF9ub3dfICovCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogfQogCi12b2lkIGRyYmRfdXVpZF9zZXRfYm0oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IHZhbCkgX19tdXN0X2hvbGQobG9jYWwpCit2b2lkIGRyYmRfdXVpZF9zZXRfYm0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHU2NCB2YWwpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWYgKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIHZhbCA9PSAwKQorCWlmIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIHZhbCA9PSAwKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiAJaWYgKHZhbCA9PSAwKSB7Ci0JCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkobWRldik7Ci0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07Ci0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IDA7CisJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkoZGV2aWNlKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF07CisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID0gMDsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIGxvbmcgYm1fdXVpZCA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGJtX3V1aWQgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKIAkJaWYgKGJtX3V1aWQpCi0JCQlkZXZfd2FybihERVYsICJibSBVVUlEIHdhcyBhbHJlYWR5IHNldDogJWxsWFxuIiwgYm1fdXVpZCk7CisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiYm0gVVVJRCB3YXMgYWxyZWFkeSBzZXQ6ICVsbFhcbiIsIGJtX3V1aWQpOwogCi0JCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IHZhbCAmIH4oKHU2NCkxKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPSB2YWwgJiB+KCh1NjQpMSk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrLCBmbGFncyk7CiAKLQlkcmJkX21kX21hcmtfZGlydHkobWRldik7CisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CiB9CiAKIC8qKgogICogZHJiZF9ibWlvX3NldF9uX3dyaXRlKCkgLSBpb19mbiBmb3IgZHJiZF9xdWV1ZV9iaXRtYXBfaW8oKSBvciBkcmJkX2JpdG1hcF9pbygpCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBTZXRzIGFsbCBiaXRzIGluIHRoZSBiaXRtYXAgYW5kIHdyaXRlcyB0aGUgd2hvbGUgYml0bWFwIHRvIHN0YWJsZSBzdG9yYWdlLgogICovCi1pbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9ibWlvX3NldF9uX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBydiA9IC1FSU87CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKSB7Ci0JCWRyYmRfbWRfc2V0X2ZsYWcobWRldiwgTURGX0ZVTExfU1lOQyk7Ci0JCWRyYmRfbWRfc3luYyhtZGV2KTsKLQkJZHJiZF9ibV9zZXRfYWxsKG1kZXYpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkgeworCQlkcmJkX21kX3NldF9mbGFnKGRldmljZSwgTURGX0ZVTExfU1lOQyk7CisJCWRyYmRfbWRfc3luYyhkZXZpY2UpOworCQlkcmJkX2JtX3NldF9hbGwoZGV2aWNlKTsKIAotCQlydiA9IGRyYmRfYm1fd3JpdGUobWRldik7CisJCXJ2ID0gZHJiZF9ibV93cml0ZShkZXZpY2UpOwogCiAJCWlmICghcnYpIHsKLQkJCWRyYmRfbWRfY2xlYXJfZmxhZyhtZGV2LCBNREZfRlVMTF9TWU5DKTsKLQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWRyYmRfbWRfY2xlYXJfZmxhZyhkZXZpY2UsIE1ERl9GVUxMX1NZTkMpOworCQkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJCX0KIAotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gcnY7CkBAIC0zMzM4LDE5ICszNDc2LDE5IEBACiAKIC8qKgogICogZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUoKSAtIGlvX2ZuIGZvciBkcmJkX3F1ZXVlX2JpdG1hcF9pbygpIG9yIGRyYmRfYml0bWFwX2lvKCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENsZWFycyBhbGwgYml0cyBpbiB0aGUgYml0bWFwIGFuZCB3cml0ZXMgdGhlIHdob2xlIGJpdG1hcCB0byBzdGFibGUgc3RvcmFnZS4KICAqLwotaW50IGRyYmRfYm1pb19jbGVhcl9uX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitpbnQgZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJ2ID0gLUVJTzsKIAotCWRyYmRfcmVzdW1lX2FsKG1kZXYpOwotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKLQkJZHJiZF9ibV9jbGVhcl9hbGwobWRldik7Ci0JCXJ2ID0gZHJiZF9ibV93cml0ZShtZGV2KTsKLQkJcHV0X2xkZXYobWRldik7CisJZHJiZF9yZXN1bWVfYWwoZGV2aWNlKTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJZHJiZF9ibV9jbGVhcl9hbGwoZGV2aWNlKTsKKwkJcnYgPSBkcmJkX2JtX3dyaXRlKGRldmljZSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJcmV0dXJuIHJ2OwpAQCAtMzM1OCw1MCArMzQ5Niw1MiBAQAogCiBzdGF0aWMgaW50IHdfYml0bWFwX2lvKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7Ci0Jc3RydWN0IGJtX2lvX3dvcmsgKndvcmsgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJtX2lvX3dvcmssIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX2RldmljZSwgYm1faW9fd29yay53KTsKKwlzdHJ1Y3QgYm1faW9fd29yayAqd29yayA9ICZkZXZpY2UtPmJtX2lvX3dvcms7CiAJaW50IHJ2ID0gLUVJTzsKIAotCURfQVNTRVJUKGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpID09IDApOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfYm1fbG9jayhtZGV2LCB3b3JrLT53aHksIHdvcmstPmZsYWdzKTsKLQkJcnYgPSB3b3JrLT5pb19mbihtZGV2KTsKLQkJZHJiZF9ibV91bmxvY2sobWRldik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfYm1fbG9jayhkZXZpY2UsIHdvcmstPndoeSwgd29yay0+ZmxhZ3MpOworCQlydiA9IHdvcmstPmlvX2ZuKGRldmljZSk7CisJCWRyYmRfYm1fdW5sb2NrKGRldmljZSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCi0JY2xlYXJfYml0X3VubG9jayhCSVRNQVBfSU8sICZtZGV2LT5mbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwljbGVhcl9iaXRfdW5sb2NrKEJJVE1BUF9JTywgJmRldmljZS0+ZmxhZ3MpOworCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIAogCWlmICh3b3JrLT5kb25lKQotCQl3b3JrLT5kb25lKG1kZXYsIHJ2KTsKKwkJd29yay0+ZG9uZShkZXZpY2UsIHJ2KTsKIAotCWNsZWFyX2JpdChCSVRNQVBfSU9fUVVFVUVELCAmbWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChCSVRNQVBfSU9fUVVFVUVELCAmZGV2aWNlLT5mbGFncyk7CiAJd29yay0+d2h5ID0gTlVMTDsKIAl3b3JrLT5mbGFncyA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX2xkZXZfZGVzdHJveShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlsY19kZXN0cm95KG1kZXYtPnJlc3luYyk7Ci0JbWRldi0+cmVzeW5jID0gTlVMTDsKLQlsY19kZXN0cm95KG1kZXYtPmFjdF9sb2cpOwotCW1kZXYtPmFjdF9sb2cgPSBOVUxMOworCWxjX2Rlc3Ryb3koZGV2aWNlLT5yZXN5bmMpOworCWRldmljZS0+cmVzeW5jID0gTlVMTDsKKwlsY19kZXN0cm95KGRldmljZS0+YWN0X2xvZyk7CisJZGV2aWNlLT5hY3RfbG9nID0gTlVMTDsKIAlfX25vX3dhcm4obG9jYWwsCi0JCWRyYmRfZnJlZV9iYyhtZGV2LT5sZGV2KTsKLQkJbWRldi0+bGRldiA9IE5VTEw7KTsKKwkJZHJiZF9mcmVlX2JjKGRldmljZS0+bGRldik7CisJCWRldmljZS0+bGRldiA9IE5VTEw7KTsKIAotCWNsZWFyX2JpdChHT19ESVNLTEVTUywgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoR09fRElTS0xFU1MsICZkZXZpY2UtPmZsYWdzKTsKIH0KIAogc3RhdGljIGludCB3X2dvX2Rpc2tsZXNzKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCBnb19kaXNrbGVzcyk7CiAKLQlEX0FTU0VSVChtZGV2LT5zdGF0ZS5kaXNrID09IERfRkFJTEVEKTsKKwlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0ZBSUxFRCk7CiAJLyogd2UgY2Fubm90IGFzc2VydCBsb2NhbF9jbnQgPT0gMCBoZXJlLCBhcyBnZXRfbGRldl9pZl9zdGF0ZSB3aWxsCiAJICogaW5jL2RlYyBpdCBmcmVxdWVudGx5LiBPbmNlIHdlIGFyZSBEX0RJU0tMRVNTLCBubyBvbmUgd2lsbCB0b3VjaAogCSAqIHRoZSBwcm90ZWN0ZWQgbWVtYmVycyBhbnltb3JlLCB0aG91Z2gsIHNvIG9uY2UgcHV0X2xkZXYgcmVhY2hlcyB6ZXJvCkBAIC0zNDIwLDI3ICszNTYwLDI3IEBACiAJICogV2Ugc3RpbGwgbmVlZCB0byBjaGVjayBpZiBib3RoIGJpdG1hcCBhbmQgbGRldiBhcmUgcHJlc2VudCwgd2UgbWF5CiAJICogZW5kIHVwIGhlcmUgYWZ0ZXIgYSBmYWlsZWQgYXR0YWNoLCBiZWZvcmUgbGRldiB3YXMgZXZlbiBhc3NpZ25lZC4KIAkgKi8KLQlpZiAobWRldi0+Yml0bWFwICYmIG1kZXYtPmxkZXYpIHsKKwlpZiAoZGV2aWNlLT5iaXRtYXAgJiYgZGV2aWNlLT5sZGV2KSB7CiAJCS8qIEFuIGludGVycnVwdGVkIHJlc3luYyBvciBzaW1pbGFyIGlzIGFsbG93ZWQgdG8gcmVjb3VudHMgYml0cwogCQkgKiB3aGlsZSB3ZSBkZXRhY2guCiAJCSAqIEFueSBtb2RpZmljYXRpb25zIHdvdWxkIG5vdCBiZSBleHBlY3RlZCBhbnltb3JlLCB0aG91Z2guCiAJCSAqLwotCQlpZiAoZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIobWRldiwgZHJiZF9ibV93cml0ZSwKKwkJaWYgKGRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKGRldmljZSwgZHJiZF9ibV93cml0ZSwKIAkJCQkJImRldGFjaCIsIEJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpKSB7Ci0JCQlpZiAodGVzdF9iaXQoV0FTX1JFQURfRVJST1IsICZtZGV2LT5mbGFncykpIHsKLQkJCQlkcmJkX21kX3NldF9mbGFnKG1kZXYsIE1ERl9GVUxMX1NZTkMpOwotCQkJCWRyYmRfbWRfc3luYyhtZGV2KTsKKwkJCWlmICh0ZXN0X2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCQkJZHJiZF9tZF9zZXRfZmxhZyhkZXZpY2UsIE1ERl9GVUxMX1NZTkMpOworCQkJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCQkJfQogCQl9CiAJfQogCi0JZHJiZF9mb3JjZV9zdGF0ZShtZGV2LCBOUyhkaXNrLCBEX0RJU0tMRVNTKSk7CisJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiBkcmJkX3F1ZXVlX2JpdG1hcF9pbygpIC0gUXVldWVzIGFuIElPIG9wZXJhdGlvbiBvbiB0aGUgd2hvbGUgYml0bWFwCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBpb19mbjoJSU8gY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYml0bWFwIElPIGlzIHBvc3NpYmxlCiAgKiBAZG9uZToJY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBiaXRtYXAgSU8gd2FzIHBlcmZvcm1lZAogICogQHdoeToJRGVzY3JpcHRpdmUgdGV4dCBvZiB0aGUgcmVhc29uIGZvciBkb2luZyB0aGUgSU8KQEAgLTM0NTAsNzYgKzM1OTAsNzcgQEAKICAqIGNhbGxlZCBmcm9tIHdvcmtlciBjb250ZXh0LiBJdCBNVVNUIE5PVCBiZSB1c2VkIHdoaWxlIGEgcHJldmlvdXMgc3VjaAogICogd29yayBpcyBzdGlsbCBwZW5kaW5nIQogICovCi12b2lkIGRyYmRfcXVldWVfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCi0JCQkgIGludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAotCQkJICB2b2lkICgqZG9uZSkoc3RydWN0IGRyYmRfY29uZiAqLCBpbnQpLAordm9pZCBkcmJkX3F1ZXVlX2JpdG1hcF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKKwkJCSAgaW50ICgqaW9fZm4pKHN0cnVjdCBkcmJkX2RldmljZSAqKSwKKwkJCSAgdm9pZCAoKmRvbmUpKHN0cnVjdCBkcmJkX2RldmljZSAqLCBpbnQpLAogCQkJICBjaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncykKIHsKLQlEX0FTU0VSVChjdXJyZW50ID09IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJRF9BU1NFUlQoZGV2aWNlLCBjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAotCURfQVNTRVJUKCF0ZXN0X2JpdChCSVRNQVBfSU9fUVVFVUVELCAmbWRldi0+ZmxhZ3MpKTsKLQlEX0FTU0VSVCghdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5ibV9pb193b3JrLncubGlzdCkpOwotCWlmIChtZGV2LT5ibV9pb193b3JrLndoeSkKLQkJZGV2X2VycihERVYsICJGSVhNRSBnb2luZyB0byBxdWV1ZSAnJXMnIGJ1dCAnJXMnIHN0aWxsIHBlbmRpbmc/XG4iLAotCQkJd2h5LCBtZGV2LT5ibV9pb193b3JrLndoeSk7CisJRF9BU1NFUlQoZGV2aWNlLCAhdGVzdF9iaXQoQklUTUFQX0lPX1FVRVVFRCwgJmRldmljZS0+ZmxhZ3MpKTsKKwlEX0FTU0VSVChkZXZpY2UsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmJtX2lvX3dvcmsudy5saXN0KSk7CisJaWYgKGRldmljZS0+Ym1faW9fd29yay53aHkpCisJCWRyYmRfZXJyKGRldmljZSwgIkZJWE1FIGdvaW5nIHRvIHF1ZXVlICclcycgYnV0ICclcycgc3RpbGwgcGVuZGluZz9cbiIsCisJCQl3aHksIGRldmljZS0+Ym1faW9fd29yay53aHkpOwogCi0JbWRldi0+Ym1faW9fd29yay5pb19mbiA9IGlvX2ZuOwotCW1kZXYtPmJtX2lvX3dvcmsuZG9uZSA9IGRvbmU7Ci0JbWRldi0+Ym1faW9fd29yay53aHkgPSB3aHk7Ci0JbWRldi0+Ym1faW9fd29yay5mbGFncyA9IGZsYWdzOworCWRldmljZS0+Ym1faW9fd29yay5pb19mbiA9IGlvX2ZuOworCWRldmljZS0+Ym1faW9fd29yay5kb25lID0gZG9uZTsKKwlkZXZpY2UtPmJtX2lvX3dvcmsud2h5ID0gd2h5OworCWRldmljZS0+Ym1faW9fd29yay5mbGFncyA9IGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlzZXRfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKTsKLQlpZiAoYXRvbWljX3JlYWQoJm1kZXYtPmFwX2Jpb19jbnQpID09IDApIHsKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZtZGV2LT5mbGFncykpCi0JCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJm1kZXYtPmJtX2lvX3dvcmsudyk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXNldF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpID09IDApIHsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJJVE1BUF9JT19RVUVVRUQsICZkZXZpY2UtPmZsYWdzKSkKKwkJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJCSZkZXZpY2UtPmJtX2lvX3dvcmsudyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogLyoqCiAgKiBkcmJkX2JpdG1hcF9pbygpIC0gIERvZXMgYW4gSU8gb3BlcmF0aW9uIG9uIHRoZSB3aG9sZSBiaXRtYXAKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGlvX2ZuOglJTyBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBiaXRtYXAgSU8gaXMgcG9zc2libGUKICAqIEB3aHk6CURlc2NyaXB0aXZlIHRleHQgb2YgdGhlIHJlYXNvbiBmb3IgZG9pbmcgdGhlIElPCiAgKgogICogZnJlZXplcyBhcHBsaWNhdGlvbiBJTyB3aGlsZSB0aGF0IHRoZSBhY3R1YWwgSU8gb3BlcmF0aW9ucyBydW5zLiBUaGlzCiAgKiBmdW5jdGlvbnMgTUFZIE5PVCBiZSBjYWxsZWQgZnJvbSB3b3JrZXIgY29udGV4dC4KICAqLwotaW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAoraW50IGRyYmRfYml0bWFwX2lvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgKCppb19mbikoc3RydWN0IGRyYmRfZGV2aWNlICopLAogCQljaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncykKIHsKIAlpbnQgcnY7CiAKLQlEX0FTU0VSVChjdXJyZW50ICE9IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJRF9BU1NFUlQoZGV2aWNlLCBjdXJyZW50ICE9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAogCWlmICgoZmxhZ3MgJiBCTV9MT0NLRURfU0VUX0FMTE9XRUQpID09IDApCi0JCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKKwkJZHJiZF9zdXNwZW5kX2lvKGRldmljZSk7CiAKLQlkcmJkX2JtX2xvY2sobWRldiwgd2h5LCBmbGFncyk7Ci0JcnYgPSBpb19mbihtZGV2KTsKLQlkcmJkX2JtX3VubG9jayhtZGV2KTsKKwlkcmJkX2JtX2xvY2soZGV2aWNlLCB3aHksIGZsYWdzKTsKKwlydiA9IGlvX2ZuKGRldmljZSk7CisJZHJiZF9ibV91bmxvY2soZGV2aWNlKTsKIAogCWlmICgoZmxhZ3MgJiBCTV9MT0NLRURfU0VUX0FMTE9XRUQpID09IDApCi0JCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCQlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCi12b2lkIGRyYmRfbWRfc2V0X2ZsYWcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IGZsYWcpIF9fbXVzdF9ob2xkKGxvY2FsKQordm9pZCBkcmJkX21kX3NldF9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZykgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JaWYgKChtZGV2LT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IGZsYWcpIHsKLQkJZHJiZF9tZF9tYXJrX2RpcnR5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC5mbGFncyB8PSBmbGFnOworCWlmICgoZGV2aWNlLT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IGZsYWcpIHsKKwkJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgfD0gZmxhZzsKIAl9CiB9CiAKLXZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBmbGFnKSBfX211c3RfaG9sZChsb2NhbCkKK3ZvaWQgZHJiZF9tZF9jbGVhcl9mbGFnKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgZmxhZykgX19tdXN0X2hvbGQobG9jYWwpCiB7Ci0JaWYgKChtZGV2LT5sZGV2LT5tZC5mbGFncyAmIGZsYWcpICE9IDApIHsKLQkJZHJiZF9tZF9tYXJrX2RpcnR5KG1kZXYpOwotCQltZGV2LT5sZGV2LT5tZC5mbGFncyAmPSB+ZmxhZzsKKwlpZiAoKGRldmljZS0+bGRldi0+bWQuZmxhZ3MgJiBmbGFnKSAhPSAwKSB7CisJCWRyYmRfbWRfbWFya19kaXJ0eShkZXZpY2UpOworCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzICY9IH5mbGFnOwogCX0KIH0KIGludCBkcmJkX21kX3Rlc3RfZmxhZyhzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiAqYmRldiwgaW50IGZsYWcpCkBAIC0zNTI5LDIzICszNjcwLDI1IEBACiAKIHN0YXRpYyB2b2lkIG1kX3N5bmNfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOwogCiAJLyogbXVzdCBub3QgZG91YmxlLXF1ZXVlISAqLwotCWlmIChsaXN0X2VtcHR5KCZtZGV2LT5tZF9zeW5jX3dvcmsubGlzdCkpCi0JCWRyYmRfcXVldWVfd29ya19mcm9udCgmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+bWRfc3luY193b3JrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5tZF9zeW5jX3dvcmsubGlzdCkpCisJCWRyYmRfcXVldWVfd29ya19mcm9udCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJICAgICAgJmRldmljZS0+bWRfc3luY193b3JrKTsKIH0KIAogc3RhdGljIGludCB3X21kX3N5bmMoc3RydWN0IGRyYmRfd29yayAqdywgaW50IHVudXNlZCkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIG1kX3N5bmNfd29yayk7CiAKLQlkZXZfd2FybihERVYsICJtZF9zeW5jX3RpbWVyIGV4cGlyZWQhIFdvcmtlciBjYWxscyBkcmJkX21kX3N5bmMoKS5cbiIpOworCWRyYmRfd2FybihkZXZpY2UsICJtZF9zeW5jX3RpbWVyIGV4cGlyZWQhIFdvcmtlciBjYWxscyBkcmJkX21kX3N5bmMoKS5cbiIpOwogI2lmZGVmIERFQlVHCi0JZGV2X3dhcm4oREVWLCAibGFzdCBtZF9tYXJrX2RpcnR5OiAlczoldVxuIiwKLQkJbWRldi0+bGFzdF9tZF9tYXJrX2RpcnR5LmZ1bmMsIG1kZXYtPmxhc3RfbWRfbWFya19kaXJ0eS5saW5lKTsKKwlkcmJkX3dhcm4oZGV2aWNlLCAibGFzdCBtZF9tYXJrX2RpcnR5OiAlczoldVxuIiwKKwkJZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkuZnVuYywgZGV2aWNlLT5sYXN0X21kX21hcmtfZGlydHkubGluZSk7CiAjZW5kaWYKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2MjEsMTggKzM3NjQsMTggQEAKIAogLyoqCiAgKiBkcmJkX3dhaXRfbWlzYyAgLSAgd2FpdCBmb3IgYSByZXF1ZXN0IHRvIG1ha2UgcHJvZ3Jlc3MKLSAqIEBtZGV2OglkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKiBAZGV2aWNlOglkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CiAgKiBAaToJCXRoZSBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCBlbWJlZGRlZCBpbiBzdHJ1Y3QgZHJiZF9yZXF1ZXN0IG9yCiAgKgkJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0CiAgKi8KLWludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaSkKK2ludCBkcmJkX3dhaXRfbWlzYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkpCiB7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlsb25nIHRpbWVvdXQ7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJaWYgKCFuYykgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC0zNjQwLDE0ICszNzgzLDE0IEBACiAJdGltZW91dCA9IG5jLT5rb19jb3VudCA/IG5jLT50aW1lb3V0ICogSFogLyAxMCAqIG5jLT5rb19jb3VudCA6IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JLyogSW5kaWNhdGUgdG8gd2FrZSB1cCBtZGV2LT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLworCS8qIEluZGljYXRlIHRvIHdha2UgdXAgZGV2aWNlLT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLwogCWktPndhaXRpbmcgPSB0cnVlOwotCXByZXBhcmVfdG9fd2FpdCgmbWRldi0+bWlzY193YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJcHJlcGFyZV90b193YWl0KCZkZXZpY2UtPm1pc2Nfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JZmluaXNoX3dhaXQoJm1kZXYtPm1pc2Nfd2FpdCwgJndhaXQpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKCF0aW1lb3V0IHx8IG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKKwlmaW5pc2hfd2FpdCgmZGV2aWNlLT5taXNjX3dhaXQsICZ3YWl0KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJaWYgKCF0aW1lb3V0IHx8IGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0zNzAzLDIwICszODQ2LDIwIEBACiB9CiAKIHVuc2lnbmVkIGludAotX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCB0eXBlKQorX2RyYmRfaW5zZXJ0X2ZhdWx0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzdGF0aWMgc3RydWN0IGZhdWx0X3JhbmRvbV9zdGF0ZSBycnMgPSB7MCwgMH07CiAKIAl1bnNpZ25lZCBpbnQgcmV0ID0gKAogCQkoZmF1bHRfZGV2cyA9PSAwIHx8Ci0JCQkoKDEgPDwgbWRldl90b19taW5vcihtZGV2KSkgJiBmYXVsdF9kZXZzKSAhPSAwKSAmJgorCQkJKCgxIDw8IGRldmljZV90b19taW5vcihkZXZpY2UpKSAmIGZhdWx0X2RldnMpICE9IDApICYmCiAJCSgoKF9kcmJkX2ZhdWx0X3JhbmRvbSgmcnJzKSAlIDEwMCkgKyAxKSA8PSBmYXVsdF9yYXRlKSk7CiAKIAlpZiAocmV0KSB7CiAJCWZhdWx0X2NvdW50Kys7CiAKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfd2FybihERVYsICIqKipTaW11bGF0aW5nICVzIGZhaWx1cmVcbiIsCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiKioqU2ltdWxhdGluZyAlcyBmYWlsdXJlXG4iLAogCQkJCV9kcmJkX2ZhdWx0X3N0cih0eXBlKSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9ubC5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbmwuYwppbmRleCBjNzA2ZDUwLi41MjY0MTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9ubC5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX25sLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlICJkcmJkX2ludC5oIgorI2luY2x1ZGUgImRyYmRfcHJvdG9jb2wuaCIKICNpbmNsdWRlICJkcmJkX3JlcS5oIgogI2luY2x1ZGUgImRyYmRfd3JhcHBlcnMuaCIKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CkBAIC00NCw4ICs0NSw4IEBACiAvLyBpbnQgZHJiZF9hZG1fY3JlYXRlX3Jlc291cmNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwogLy8gaW50IGRyYmRfYWRtX2RlbGV0ZV9yZXNvdXJjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAotaW50IGRyYmRfYWRtX2FkZF9taW5vcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKLWludCBkcmJkX2FkbV9kZWxldGVfbWlub3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CitpbnQgZHJiZF9hZG1fbmV3X21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IGRyYmRfYWRtX2RlbF9taW5vcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAogaW50IGRyYmRfYWRtX25ld19yZXNvdXJjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCBkcmJkX2FkbV9kZWxfcmVzb3VyY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CkBAIC0xMDIsOCArMTAzLDkgQEAKIAkvKiBwb2ludGVyIGludG8gcmVwbHkgYnVmZmVyICovCiAJc3RydWN0IGRyYmRfZ2VubG1zZ2hkciAqcmVwbHlfZGg7CiAJLyogcmVzb2x2ZWQgZnJvbSBhdHRyaWJ1dGVzLCBpZiBwb3NzaWJsZSAqLwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogfSBhZG1fY3R4OwogCiBzdGF0aWMgdm9pZCBkcmJkX2FkbV9zZW5kX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCkBAIC0yMDIsNjIgKzIwNCw2NyBAQAogCQlhZG1fY3R4Lm15X2FkZHIgPSBuZXN0ZWRfYXR0cl90YltfX25sYV90eXBlKFRfY3R4X215X2FkZHIpXTsKIAkJYWRtX2N0eC5wZWVyX2FkZHIgPSBuZXN0ZWRfYXR0cl90YltfX25sYV90eXBlKFRfY3R4X3BlZXJfYWRkcildOwogCQlpZiAoKGFkbV9jdHgubXlfYWRkciAmJgotCQkgICAgIG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA+IHNpemVvZihhZG1fY3R4LnRjb25uLT5teV9hZGRyKSkgfHwKKwkJICAgICBubGFfbGVuKGFkbV9jdHgubXlfYWRkcikgPiBzaXplb2YoYWRtX2N0eC5jb25uZWN0aW9uLT5teV9hZGRyKSkgfHwKIAkJICAgIChhZG1fY3R4LnBlZXJfYWRkciAmJgotCQkgICAgIG5sYV9sZW4oYWRtX2N0eC5wZWVyX2FkZHIpID4gc2l6ZW9mKGFkbV9jdHgudGNvbm4tPnBlZXJfYWRkcikpKSB7CisJCSAgICAgbmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikgPiBzaXplb2YoYWRtX2N0eC5jb25uZWN0aW9uLT5wZWVyX2FkZHIpKSkgewogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCX0KIAogCWFkbV9jdHgubWlub3IgPSBkX2luLT5taW5vcjsKLQlhZG1fY3R4Lm1kZXYgPSBtaW5vcl90b19tZGV2KGRfaW4tPm1pbm9yKTsKLQlhZG1fY3R4LnRjb25uID0gY29ubl9nZXRfYnlfbmFtZShhZG1fY3R4LnJlc291cmNlX25hbWUpOworCWFkbV9jdHguZGV2aWNlID0gbWlub3JfdG9fZGV2aWNlKGRfaW4tPm1pbm9yKTsKKwlpZiAoYWRtX2N0eC5yZXNvdXJjZV9uYW1lKSB7CisJCWFkbV9jdHgucmVzb3VyY2UgPSBkcmJkX2ZpbmRfcmVzb3VyY2UoYWRtX2N0eC5yZXNvdXJjZV9uYW1lKTsKKwl9CiAKLQlpZiAoIWFkbV9jdHgubWRldiAmJiAoZmxhZ3MgJiBEUkJEX0FETV9ORUVEX01JTk9SKSkgeworCWlmICghYWRtX2N0eC5kZXZpY2UgJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9NSU5PUikpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVua25vd24gbWlub3IiKTsKIAkJcmV0dXJuIEVSUl9NSU5PUl9JTlZBTElEOwogCX0KLQlpZiAoIWFkbV9jdHgudGNvbm4gJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSkpIHsKKwlpZiAoIWFkbV9jdHgucmVzb3VyY2UgJiYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSkpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oInVua25vd24gcmVzb3VyY2UiKTsKKwkJaWYgKGFkbV9jdHgucmVzb3VyY2VfbmFtZSkKKwkJCXJldHVybiBFUlJfUkVTX05PVF9LTk9XTjsKIAkJcmV0dXJuIEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJfQogCiAJaWYgKGZsYWdzICYgRFJCRF9BRE1fTkVFRF9DT05ORUNUSU9OKSB7Ci0JCWlmIChhZG1fY3R4LnRjb25uICYmICEoZmxhZ3MgJiBEUkJEX0FETV9ORUVEX1JFU09VUkNFKSkgeworCQlpZiAoYWRtX2N0eC5yZXNvdXJjZSkgewogCQkJZHJiZF9tc2dfcHV0X2luZm8oIm5vIHJlc291cmNlIG5hbWUgZXhwZWN0ZWQiKTsKIAkJCXJldHVybiBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQl9Ci0JCWlmIChhZG1fY3R4Lm1kZXYpIHsKKwkJaWYgKGFkbV9jdHguZGV2aWNlKSB7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygibm8gbWlub3IgbnVtYmVyIGV4cGVjdGVkIik7CiAJCQlyZXR1cm4gRVJSX0lOVkFMSURfUkVRVUVTVDsKIAkJfQogCQlpZiAoYWRtX2N0eC5teV9hZGRyICYmIGFkbV9jdHgucGVlcl9hZGRyKQotCQkJYWRtX2N0eC50Y29ubiA9IGNvbm5fZ2V0X2J5X2FkZHJzKG5sYV9kYXRhKGFkbV9jdHgubXlfYWRkciksCisJCQlhZG1fY3R4LmNvbm5lY3Rpb24gPSBjb25uX2dldF9ieV9hZGRycyhubGFfZGF0YShhZG1fY3R4Lm15X2FkZHIpLAogCQkJCQkJCSAgbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpLAogCQkJCQkJCSAgbmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLAogCQkJCQkJCSAgbmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikpOwotCQlpZiAoIWFkbV9jdHgudGNvbm4pIHsKKwkJaWYgKCFhZG1fY3R4LmNvbm5lY3Rpb24pIHsKIAkJCWRyYmRfbXNnX3B1dF9pbmZvKCJ1bmtub3duIGNvbm5lY3Rpb24iKTsKIAkJCXJldHVybiBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQl9CiAJfQogCiAJLyogc29tZSBtb3JlIHBhcmFub2lhLCBpZiB0aGUgcmVxdWVzdCB3YXMgb3Zlci1kZXRlcm1pbmVkICovCi0JaWYgKGFkbV9jdHgubWRldiAmJiBhZG1fY3R4LnRjb25uICYmCi0JICAgIGFkbV9jdHgubWRldi0+dGNvbm4gIT0gYWRtX2N0eC50Y29ubikgewotCQlwcl93YXJuaW5nKCJyZXF1ZXN0OiBtaW5vcj0ldSwgcmVzb3VyY2U9JXM7IGJ1dCB0aGF0IG1pbm9yIGJlbG9uZ3MgdG8gY29ubmVjdGlvbiAlc1xuIiwKLQkJCQlhZG1fY3R4Lm1pbm9yLCBhZG1fY3R4LnJlc291cmNlX25hbWUsCi0JCQkJYWRtX2N0eC5tZGV2LT50Y29ubi0+bmFtZSk7CisJaWYgKGFkbV9jdHguZGV2aWNlICYmIGFkbV9jdHgucmVzb3VyY2UgJiYKKwkgICAgYWRtX2N0eC5kZXZpY2UtPnJlc291cmNlICE9IGFkbV9jdHgucmVzb3VyY2UpIHsKKwkJcHJfd2FybmluZygicmVxdWVzdDogbWlub3I9JXUsIHJlc291cmNlPSVzOyBidXQgdGhhdCBtaW5vciBiZWxvbmdzIHRvIHJlc291cmNlICVzXG4iLAorCQkJCWFkbV9jdHgubWlub3IsIGFkbV9jdHgucmVzb3VyY2UtPm5hbWUsCisJCQkJYWRtX2N0eC5kZXZpY2UtPnJlc291cmNlLT5uYW1lKTsKIAkJZHJiZF9tc2dfcHV0X2luZm8oIm1pbm9yIGV4aXN0cyBpbiBkaWZmZXJlbnQgcmVzb3VyY2UiKTsKIAkJcmV0dXJuIEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJfQotCWlmIChhZG1fY3R4Lm1kZXYgJiYKKwlpZiAoYWRtX2N0eC5kZXZpY2UgJiYKIAkgICAgYWRtX2N0eC52b2x1bWUgIT0gVk9MVU1FX1VOU1BFQ0lGSUVEICYmCi0JICAgIGFkbV9jdHgudm9sdW1lICE9IGFkbV9jdHgubWRldi0+dm5yKSB7CisJICAgIGFkbV9jdHgudm9sdW1lICE9IGFkbV9jdHguZGV2aWNlLT52bnIpIHsKIAkJcHJfd2FybmluZygicmVxdWVzdDogbWlub3I9JXUsIHZvbHVtZT0ldTsgYnV0IHRoYXQgbWlub3IgaXMgdm9sdW1lICV1IGluICVzXG4iLAogCQkJCWFkbV9jdHgubWlub3IsIGFkbV9jdHgudm9sdW1lLAotCQkJCWFkbV9jdHgubWRldi0+dm5yLCBhZG1fY3R4Lm1kZXYtPnRjb25uLT5uYW1lKTsKKwkJCQlhZG1fY3R4LmRldmljZS0+dm5yLAorCQkJCWFkbV9jdHguZGV2aWNlLT5yZXNvdXJjZS0+bmFtZSk7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKCJtaW5vciBleGlzdHMgYXMgZGlmZmVyZW50IHZvbHVtZSIpOwogCQlyZXR1cm4gRVJSX0lOVkFMSURfUkVRVUVTVDsKIAl9CkBAIC0yNzIsOSArMjc5LDEzIEBACiAKIHN0YXRpYyBpbnQgZHJiZF9hZG1fZmluaXNoKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sIGludCByZXRjb2RlKQogewotCWlmIChhZG1fY3R4LnRjb25uKSB7Ci0JCWtyZWZfcHV0KCZhZG1fY3R4LnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKLQkJYWRtX2N0eC50Y29ubiA9IE5VTEw7CisJaWYgKGFkbV9jdHguY29ubmVjdGlvbikgeworCQlrcmVmX3B1dCgmYWRtX2N0eC5jb25uZWN0aW9uLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCWFkbV9jdHguY29ubmVjdGlvbiA9IE5VTEw7CisJfQorCWlmIChhZG1fY3R4LnJlc291cmNlKSB7CisJCWtyZWZfcHV0KCZhZG1fY3R4LnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOworCQlhZG1fY3R4LnJlc291cmNlID0gTlVMTDsKIAl9CiAKIAlpZiAoIWFkbV9jdHgucmVwbHlfc2tiKQpAQCAtMjg1LDM0ICsyOTYsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfa2hlbHBlcl9lbnYoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBjaGFyICoqZW52cCkKK3N0YXRpYyB2b2lkIHNldHVwX2toZWxwZXJfZW52KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGNoYXIgKiplbnZwKQogewogCWNoYXIgKmFmczsKIAogCS8qIEZJWE1FOiBBIGZ1dHVyZSB2ZXJzaW9uIHdpbGwgbm90IGFsbG93IHRoaXMgY2FzZS4gKi8KLQlpZiAodGNvbm4tPm15X2FkZHJfbGVuID09IDAgfHwgdGNvbm4tPnBlZXJfYWRkcl9sZW4gPT0gMCkKKwlpZiAoY29ubmVjdGlvbi0+bXlfYWRkcl9sZW4gPT0gMCB8fCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuID09IDApCiAJCXJldHVybjsKIAotCXN3aXRjaCAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmdGNvbm4tPnBlZXJfYWRkciktPnNhX2ZhbWlseSkgeworCXN3aXRjaCAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2FfZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUNjoKIAkJYWZzID0gImlwdjYiOwogCQlzbnByaW50ZihlbnZwWzRdLCA2MCwgIkRSQkRfUEVFUl9BRERSRVNTPSVwSTYiLAotCQkJICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbjZfYWRkcik7CisJCQkgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZjb25uZWN0aW9uLT5wZWVyX2FkZHIpLT5zaW42X2FkZHIpOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ6CiAJCWFmcyA9ICJpcHY0IjsKIAkJc25wcmludGYoZW52cFs0XSwgNjAsICJEUkJEX1BFRVJfQUREUkVTUz0lcEk0IiwKLQkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbl9hZGRyKTsKKwkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2luX2FkZHIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlhZnMgPSAic3NvY2tzIjsKIAkJc25wcmludGYoZW52cFs0XSwgNjAsICJEUkJEX1BFRVJfQUREUkVTUz0lcEk0IiwKLQkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmdGNvbm4tPnBlZXJfYWRkciktPnNpbl9hZGRyKTsKKwkJCSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29ubmVjdGlvbi0+cGVlcl9hZGRyKS0+c2luX2FkZHIpOwogCX0KIAlzbnByaW50ZihlbnZwWzNdLCAyMCwgIkRSQkRfUEVFUl9BRj0lcyIsIGFmcyk7CiB9CiAKLWludCBkcmJkX2toZWxwZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY2hhciAqY21kKQoraW50IGRyYmRfa2hlbHBlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY2hhciAqY21kKQogewogCWNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsCiAJCQkiVEVSTT1saW51eCIsCkBAIC0zMjIsMzkgKzMzMywzOSBAQAogCQkJTlVMTCB9OwogCWNoYXIgbWJbMTJdOwogCWNoYXIgKmFyZ3ZbXSA9IHt1c2VybW9kZV9oZWxwZXIsIGNtZCwgbWIsIE5VTEwgfTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3Qgc2liX2luZm8gc2liOwogCWludCByZXQ7CiAKLQlpZiAoY3VycmVudCA9PSB0Y29ubi0+d29ya2VyLnRhc2spCi0JCXNldF9iaXQoQ0FMTEJBQ0tfUEVORElORywgJnRjb25uLT5mbGFncyk7CisJaWYgKGN1cnJlbnQgPT0gY29ubmVjdGlvbi0+d29ya2VyLnRhc2spCisJCXNldF9iaXQoQ0FMTEJBQ0tfUEVORElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCXNucHJpbnRmKG1iLCAxMiwgIm1pbm9yLSVkIiwgbWRldl90b19taW5vcihtZGV2KSk7Ci0Jc2V0dXBfa2hlbHBlcl9lbnYodGNvbm4sIGVudnApOworCXNucHJpbnRmKG1iLCAxMiwgIm1pbm9yLSVkIiwgZGV2aWNlX3RvX21pbm9yKGRldmljZSkpOworCXNldHVwX2toZWxwZXJfZW52KGNvbm5lY3Rpb24sIGVudnApOwogCiAJLyogVGhlIGhlbHBlciBtYXkgdGFrZSBzb21lIHRpbWUuCiAJICogd3JpdGUgb3V0IGFueSB1bnN5bmNlZCBtZXRhIGRhdGEgY2hhbmdlcyBub3cgKi8KLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlkZXZfaW5mbyhERVYsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXNcbiIsIHVzZXJtb2RlX2hlbHBlciwgY21kLCBtYik7CisJZHJiZF9pbmZvKGRldmljZSwgImhlbHBlciBjb21tYW5kOiAlcyAlcyAlc1xuIiwgdXNlcm1vZGVfaGVscGVyLCBjbWQsIG1iKTsKIAlzaWIuc2liX3JlYXNvbiA9IFNJQl9IRUxQRVJfUFJFOwogCXNpYi5oZWxwZXJfbmFtZSA9IGNtZDsKLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAlyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKHVzZXJtb2RlX2hlbHBlciwgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7CiAJaWYgKHJldCkKLQkJZGV2X3dhcm4oREVWLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCisJCWRyYmRfd2FybihkZXZpY2UsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKIAkJCQl1c2VybW9kZV9oZWxwZXIsIGNtZCwgbWIsCiAJCQkJKHJldCA+PiA4KSAmIDB4ZmYsIHJldCk7CiAJZWxzZQotCQlkZXZfaW5mbyhERVYsICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgImhlbHBlciBjb21tYW5kOiAlcyAlcyAlcyBleGl0IGNvZGUgJXUgKDB4JXgpXG4iLAogCQkJCXVzZXJtb2RlX2hlbHBlciwgY21kLCBtYiwKIAkJCQkocmV0ID4+IDgpICYgMHhmZiwgcmV0KTsKIAlzaWIuc2liX3JlYXNvbiA9IFNJQl9IRUxQRVJfUE9TVDsKIAlzaWIuaGVscGVyX2V4aXRfY29kZSA9IHJldDsKLQlkcmJkX2JjYXN0X2V2ZW50KG1kZXYsICZzaWIpOworCWRyYmRfYmNhc3RfZXZlbnQoZGV2aWNlLCAmc2liKTsKIAotCWlmIChjdXJyZW50ID09IHRjb25uLT53b3JrZXIudGFzaykKLQkJY2xlYXJfYml0KENBTExCQUNLX1BFTkRJTkcsICZ0Y29ubi0+ZmxhZ3MpOworCWlmIChjdXJyZW50ID09IGNvbm5lY3Rpb24tPndvcmtlci50YXNrKQorCQljbGVhcl9iaXQoQ0FMTEJBQ0tfUEVORElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCWlmIChyZXQgPCAwKSAvKiBJZ25vcmUgYW55IEVSUk5PcyB3ZSBnb3QuICovCiAJCXJldCA9IDA7CkBAIC0zNjIsNyArMzczLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgY29ubl9raGVscGVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgY2hhciAqY21kKQorc3RhdGljIGludCBjb25uX2toZWxwZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgY2hhciAqY21kKQogewogCWNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsCiAJCQkiVEVSTT1saW51eCIsCkBAIC0zNzAsMjMgKzM4MSwyNCBAQAogCQkJIChjaGFyWzIwXSkgeyB9LCAvKiBhZGRyZXNzIGZhbWlseSAqLwogCQkJIChjaGFyWzYwXSkgeyB9LCAvKiBhZGRyZXNzICovCiAJCQlOVUxMIH07Ci0JY2hhciAqYXJndltdID0ge3VzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwgTlVMTCB9OworCWNoYXIgKnJlc291cmNlX25hbWUgPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+bmFtZTsKKwljaGFyICphcmd2W10gPSB7dXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsIE5VTEwgfTsKIAlpbnQgcmV0OwogCi0Jc2V0dXBfa2hlbHBlcl9lbnYodGNvbm4sIGVudnApOwotCWNvbm5fbWRfc3luYyh0Y29ubik7CisJc2V0dXBfa2hlbHBlcl9lbnYoY29ubmVjdGlvbiwgZW52cCk7CisJY29ubl9tZF9zeW5jKGNvbm5lY3Rpb24pOwogCi0JY29ubl9pbmZvKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzXG4iLCB1c2VybW9kZV9oZWxwZXIsIGNtZCwgdGNvbm4tPm5hbWUpOworCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzXG4iLCB1c2VybW9kZV9oZWxwZXIsIGNtZCwgcmVzb3VyY2VfbmFtZSk7CiAJLyogVE9ETzogY29ubl9iY2FzdF9ldmVudCgpID8/ICovCiAKIAlyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKHVzZXJtb2RlX2hlbHBlciwgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7CiAJaWYgKHJldCkKLQkJY29ubl93YXJuKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCi0JCQkgIHVzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwKKwkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJCSAgdXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsCiAJCQkgIChyZXQgPj4gOCkgJiAweGZmLCByZXQpOwogCWVsc2UKLQkJY29ubl9pbmZvKHRjb25uLCAiaGVscGVyIGNvbW1hbmQ6ICVzICVzICVzIGV4aXQgY29kZSAldSAoMHgleClcbiIsCi0JCQkgIHVzZXJtb2RlX2hlbHBlciwgY21kLCB0Y29ubi0+bmFtZSwKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJoZWxwZXIgY29tbWFuZDogJXMgJXMgJXMgZXhpdCBjb2RlICV1ICgweCV4KVxuIiwKKwkJCSAgdXNlcm1vZGVfaGVscGVyLCBjbWQsIHJlc291cmNlX25hbWUsCiAJCQkgIChyZXQgPj4gOCkgJiAweGZmLCByZXQpOwogCS8qIFRPRE86IGNvbm5fYmNhc3RfZXZlbnQoKSA/PyAqLwogCkBAIC0zOTYsMTggKzQwOCwyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBlbnVtIGRyYmRfZmVuY2luZ19wIGhpZ2hlc3RfZmVuY2luZ19wb2xpY3koc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGVudW0gZHJiZF9mZW5jaW5nX3AgaGlnaGVzdF9mZW5jaW5nX3BvbGljeShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9mZW5jaW5nX3AgZnAgPSBGUF9OT1RfQVZBSUw7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQ09OU0lTVEVOVCkpIHsKLQkJCWZwID0gbWF4X3QoZW51bSBkcmJkX2ZlbmNpbmdfcCwgZnAsCi0JCQkJICAgcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmcpOwotCQkJcHV0X2xkZXYobWRldik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0NPTlNJU1RFTlQpKSB7CisJCQlzdHJ1Y3QgZGlza19jb25mICpkaXNrX2NvbmYgPQorCQkJCXJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+ZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpOworCQkJZnAgPSBtYXhfdChlbnVtIGRyYmRfZmVuY2luZ19wLCBmcCwgZGlza19jb25mLT5mZW5jaW5nKTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC00MTUsNyArNDI5LDcgQEAKIAlyZXR1cm4gZnA7CiB9CiAKLWJvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2Jvb2wgY29ubl90cnlfb3V0ZGF0ZV9wZWVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IGNvbm5lY3RfY250OwogCXVuaW9uIGRyYmRfc3RhdGUgbWFzayA9IHsgfTsKQEAgLTQyNCwyNiArNDM4LDI2IEBACiAJY2hhciAqZXhfdG9fc3RyaW5nOwogCWludCByOwogCi0JaWYgKHRjb25uLT5jc3RhdGUgPj0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiRXhwZWN0ZWQgY3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TXG4iKTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiRXhwZWN0ZWQgY3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JY29ubmVjdF9jbnQgPSB0Y29ubi0+Y29ubmVjdF9jbnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJY29ubmVjdF9jbnQgPSBjb25uZWN0aW9uLT5jb25uZWN0X2NudDsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlmcCA9IGhpZ2hlc3RfZmVuY2luZ19wb2xpY3kodGNvbm4pOworCWZwID0gaGlnaGVzdF9mZW5jaW5nX3BvbGljeShjb25uZWN0aW9uKTsKIAlzd2l0Y2ggKGZwKSB7CiAJY2FzZSBGUF9OT1RfQVZBSUw6Ci0JCWNvbm5fd2Fybih0Y29ubiwgIk5vdCBmZW5jaW5nIHBlZXIsIEknbSBub3QgZXZlbiBDb25zaXN0ZW50IG15c2VsZi5cbiIpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIk5vdCBmZW5jaW5nIHBlZXIsIEknbSBub3QgZXZlbiBDb25zaXN0ZW50IG15c2VsZi5cbiIpOwogCQlnb3RvIG91dDsKIAljYXNlIEZQX0RPTlRfQ0FSRToKIAkJcmV0dXJuIHRydWU7CiAJZGVmYXVsdDogOwogCX0KIAotCXIgPSBjb25uX2toZWxwZXIodGNvbm4sICJmZW5jZS1wZWVyIik7CisJciA9IGNvbm5fa2hlbHBlcihjb25uZWN0aW9uLCAiZmVuY2UtcGVlciIpOwogCiAJc3dpdGNoICgocj4+OCkgJiAweGZmKSB7CiAJY2FzZSAzOiAvKiBwZWVyIGlzIGluY29uc2lzdGVudCAqLwpAQCAtNDU3LDcgKzQ3MSw3IEBACiAJCXZhbC5wZHNrID0gRF9PVVREQVRFRDsKIAkJYnJlYWs7CiAJY2FzZSA1OiAvKiBwZWVyIHdhcyBkb3duICovCi0JCWlmIChjb25uX2hpZ2hlc3RfZGlzayh0Y29ubikgPT0gRF9VUF9UT19EQVRFKSB7CisJCWlmIChjb25uX2hpZ2hlc3RfZGlzayhjb25uZWN0aW9uKSA9PSBEX1VQX1RPX0RBVEUpIHsKIAkJCS8qIHdlIHdpbGwoaGF2ZSkgY3JlYXRlKGQpIGEgbmV3IFVVSUQgYW55d2F5cy4uLiAqLwogCQkJZXhfdG9fc3RyaW5nID0gInBlZXIgaXMgdW5yZWFjaGFibGUsIGFzc3VtZWQgdG8gYmUgZGVhZCI7CiAJCQltYXNrLnBkc2sgPSBEX01BU0s7CkBAIC00NzAsNzAgKzQ4NCw3MCBAQAogCQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFuIHVuY29ubmVjdGVkIFJfU0VDT05EQVJZIGlzIGFza2VkIHRvCiAJCSAqIGJlY29tZSBSX1BSSU1BUlksIGJ1dCBmaW5kcyB0aGUgb3RoZXIgcGVlciBiZWluZyBhY3RpdmUuICovCiAJCWV4X3RvX3N0cmluZyA9ICJwZWVyIGlzIGFjdGl2ZSI7Ci0JCWNvbm5fd2Fybih0Y29ubiwgIlBlZXIgaXMgcHJpbWFyeSwgb3V0ZGF0aW5nIG15c2VsZi5cbiIpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIlBlZXIgaXMgcHJpbWFyeSwgb3V0ZGF0aW5nIG15c2VsZi5cbiIpOwogCQltYXNrLmRpc2sgPSBEX01BU0s7CiAJCXZhbC5kaXNrID0gRF9PVVREQVRFRDsKIAkJYnJlYWs7CiAJY2FzZSA3OgogCQlpZiAoZnAgIT0gRlBfU1RPTklUSCkKLQkJCWNvbm5fZXJyKHRjb25uLCAiZmVuY2UtcGVlcigpID0gNyAmJiBmZW5jaW5nICE9IFN0b25pdGggISEhXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJmZW5jZS1wZWVyKCkgPSA3ICYmIGZlbmNpbmcgIT0gU3Rvbml0aCAhISFcbiIpOwogCQlleF90b19zdHJpbmcgPSAicGVlciB3YXMgc3Rvbml0aGVkIjsKIAkJbWFzay5wZHNrID0gRF9NQVNLOwogCQl2YWwucGRzayA9IERfT1VUREFURUQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFRoZSBzY3JpcHQgaXMgYnJva2VuIC4uLiAqLwotCQljb25uX2Vycih0Y29ubiwgImZlbmNlLXBlZXIgaGVscGVyIGJyb2tlbiwgcmV0dXJuZWQgJWRcbiIsIChyPj44KSYweGZmKTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImZlbmNlLXBlZXIgaGVscGVyIGJyb2tlbiwgcmV0dXJuZWQgJWRcbiIsIChyPj44KSYweGZmKTsKIAkJcmV0dXJuIGZhbHNlOyAvKiBFdmVudHVhbGx5IGxlYXZlIElPIGZyb3plbiAqLwogCX0KIAotCWNvbm5faW5mbyh0Y29ubiwgImZlbmNlLXBlZXIgaGVscGVyIHJldHVybmVkICVkICglcylcbiIsCisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJmZW5jZS1wZWVyIGhlbHBlciByZXR1cm5lZCAlZCAoJXMpXG4iLAogCQkgIChyPj44KSAmIDB4ZmYsIGV4X3RvX3N0cmluZyk7CiAKICBvdXQ6CiAKIAkvKiBOb3QgdXNpbmcKLQkgICBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CisJICAgY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CiAJICAgaGVyZSwgYmVjYXVzZSB3ZSBtaWdodCB3ZXJlIGFibGUgdG8gcmUtZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGluIHRoZQogCSAgIG1lYW50aW1lLiAqLwotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMgJiYgIXRlc3RfYml0KFNUQVRFX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpKSB7Ci0JCWlmICh0Y29ubi0+Y29ubmVjdF9jbnQgIT0gY29ubmVjdF9jbnQpCisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TICYmICF0ZXN0X2JpdChTVEFURV9TRU5ULCAmY29ubmVjdGlvbi0+ZmxhZ3MpKSB7CisJCWlmIChjb25uZWN0aW9uLT5jb25uZWN0X2NudCAhPSBjb25uZWN0X2NudCkKIAkJCS8qIEluIGNhc2UgdGhlIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIGFuZCBkcm9wZWQKIAkJCSAgIHdoaWxlIHRoZSBmZW5jZS1wZWVyIGhhbmRsZXIgd2FzIHJ1bm5pbmcsIGlnbm9yZSBpdCAqLwotCQkJY29ubl9pbmZvKHRjb25uLCAiSWdub3JpbmcgZmVuY2UtcGVlciBleGl0IGNvZGVcbiIpOworCQkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJJZ25vcmluZyBmZW5jZS1wZWVyIGV4aXQgY29kZVxuIik7CiAJCWVsc2UKLQkJCV9jb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CisJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSk7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlyZXR1cm4gY29ubl9oaWdoZXN0X3Bkc2sodGNvbm4pIDw9IERfT1VUREFURUQ7CisJcmV0dXJuIGNvbm5faGlnaGVzdF9wZHNrKGNvbm5lY3Rpb24pIDw9IERfT1VUREFURUQ7CiB9CiAKIHN0YXRpYyBpbnQgX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmModm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSAoc3RydWN0IGRyYmRfdGNvbm4gKilkYXRhOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSAoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqKWRhdGE7CiAKLQljb25uX3RyeV9vdXRkYXRlX3BlZXIodGNvbm4pOworCWNvbm5fdHJ5X291dGRhdGVfcGVlcihjb25uZWN0aW9uKTsKIAotCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjb25uX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBjb25uX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9wYTsKIAotCWtyZWZfZ2V0KCZ0Y29ubi0+a3JlZik7Ci0Jb3BhID0ga3RocmVhZF9ydW4oX3RyeV9vdXRkYXRlX3BlZXJfYXN5bmMsIHRjb25uLCAiZHJiZF9hc3luY19oIik7CisJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCW9wYSA9IGt0aHJlYWRfcnVuKF90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jLCBjb25uZWN0aW9uLCAiZHJiZF9hc3luY19oIik7CiAJaWYgKElTX0VSUihvcGEpKSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAib3V0IG9mIG1lbSwgZmFpbGVkIHRvIGludm9rZSBmZW5jZS1wZWVyIGhlbHBlclxuIik7Ci0JCWtyZWZfcHV0KCZ0Y29ubi0+a3JlZiwgJmNvbm5fZGVzdHJveSk7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJvdXQgb2YgbWVtLCBmYWlsZWQgdG8gaW52b2tlIGZlbmNlLXBlZXIgaGVscGVyXG4iKTsKKwkJa3JlZl9wdXQoJmNvbm5lY3Rpb24tPmtyZWYsIGRyYmRfZGVzdHJveV9jb25uZWN0aW9uKTsKIAl9CiB9CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotZHJiZF9zZXRfcm9sZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfcm9sZSBuZXdfcm9sZSwgaW50IGZvcmNlKQorZHJiZF9zZXRfcm9sZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgZW51bSBkcmJkX3JvbGUgbmV3X3JvbGUsIGludCBmb3JjZSkKIHsKIAljb25zdCBpbnQgbWF4X3RyaWVzID0gNDsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnYgPSBTU19VTktOT1dOX0VSUk9SOwpAQCAtNTQyLDE2ICs1NTYsMjQgQEAKIAlpbnQgZm9yY2VkID0gMDsKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHZhbDsKIAotCWlmIChuZXdfcm9sZSA9PSBSX1BSSU1BUlkpCi0JCXJlcXVlc3RfcGluZyhtZGV2LT50Y29ubik7IC8qIERldGVjdCBhIGRlYWQgcGVlciBBU0FQICovCisJaWYgKG5ld19yb2xlID09IFJfUFJJTUFSWSkgeworCQlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCi0JbXV0ZXhfbG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJCS8qIERldGVjdCBkZWFkIHBlZXJzIGFzIHNvb24gYXMgcG9zc2libGUuICAqLworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCBkZXZpY2UtPnJlc291cmNlKQorCQkJcmVxdWVzdF9waW5nKGNvbm5lY3Rpb24pOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCiAJbWFzay5pID0gMDsgbWFzay5yb2xlID0gUl9NQVNLOwogCXZhbC5pICA9IDA7IHZhbC5yb2xlICA9IG5ld19yb2xlOwogCiAJd2hpbGUgKHRyeSsrIDwgbWF4X3RyaWVzKSB7Ci0JCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBtYXNrLCB2YWwsIENTX1dBSVRfQ09NUExFVEUpOworCQlydiA9IF9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBtYXNrLCB2YWwsIENTX1dBSVRfQ09NUExFVEUpOwogCiAJCS8qIGluIGNhc2Ugd2UgZmlyc3Qgc3VjY2VlZGVkIHRvIG91dGRhdGUsCiAJCSAqIGJ1dCBub3cgc3VkZGVubHkgY291bGQgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiAqLwpAQCAtNTYyLDggKzU4NCw4IEBACiAJCX0KIAogCQlpZiAocnYgPT0gU1NfTk9fVVBfVE9fREFURV9ESVNLICYmIGZvcmNlICYmCi0JCSAgICAobWRldi0+c3RhdGUuZGlzayA8IERfVVBfVE9fREFURSAmJgotCQkgICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQpKSB7CisJCSAgICAoZGV2aWNlLT5zdGF0ZS5kaXNrIDwgRF9VUF9UT19EQVRFICYmCisJCSAgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfSU5DT05TSVNURU5UKSkgewogCQkJbWFzay5kaXNrID0gRF9NQVNLOwogCQkJdmFsLmRpc2sgID0gRF9VUF9UT19EQVRFOwogCQkJZm9yY2VkID0gMTsKQEAgLTU3MSwxMCArNTkzLDEwIEBACiAJCX0KIAogCQlpZiAocnYgPT0gU1NfTk9fVVBfVE9fREFURV9ESVNLICYmCi0JCSAgICBtZGV2LT5zdGF0ZS5kaXNrID09IERfQ09OU0lTVEVOVCAmJiBtYXNrLnBkc2sgPT0gMCkgewotCQkJRF9BU1NFUlQobWRldi0+c3RhdGUucGRzayA9PSBEX1VOS05PV04pOworCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfQ09OU0lTVEVOVCAmJiBtYXNrLnBkc2sgPT0gMCkgeworCQkJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnN0YXRlLnBkc2sgPT0gRF9VTktOT1dOKTsKIAotCQkJaWYgKGNvbm5fdHJ5X291dGRhdGVfcGVlcihtZGV2LT50Y29ubikpIHsKKwkJCWlmIChjb25uX3RyeV9vdXRkYXRlX3BlZXIoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbikpIHsKIAkJCQl2YWwuZGlzayA9IERfVVBfVE9fREFURTsKIAkJCQltYXNrLmRpc2sgPSBEX01BU0s7CiAJCQl9CkBAIC01ODQsOCArNjA2LDggQEAKIAkJaWYgKHJ2ID09IFNTX05PVEhJTkdfVE9fRE8pCiAJCQlnb3RvIG91dDsKIAkJaWYgKHJ2ID09IFNTX1BSSU1BUllfTk9QICYmIG1hc2sucGRzayA9PSAwKSB7Ci0JCQlpZiAoIWNvbm5fdHJ5X291dGRhdGVfcGVlcihtZGV2LT50Y29ubikgJiYgZm9yY2UpIHsKLQkJCQlkZXZfd2FybihERVYsICJGb3JjZWQgaW50byBzcGxpdCBicmFpbiBzaXR1YXRpb24hXG4iKTsKKwkJCWlmICghY29ubl90cnlfb3V0ZGF0ZV9wZWVyKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pICYmIGZvcmNlKSB7CisJCQkJZHJiZF93YXJuKGRldmljZSwgIkZvcmNlZCBpbnRvIHNwbGl0IGJyYWluIHNpdHVhdGlvbiFcbiIpOwogCQkJCW1hc2sucGRzayA9IERfTUFTSzsKIAkJCQl2YWwucGRzayAgPSBEX09VVERBVEVEOwogCkBAIC01OTcsNyArNjE5LDcgQEAKIAkJCSAgIHJldHJ5IGF0IG1vc3Qgb25jZSBtb3JlIGluIHRoaXMgY2FzZS4gKi8KIAkJCWludCB0aW1lbzsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl0aW1lbyA9IG5jID8gKG5jLT5waW5nX3RpbWVvICsgMSkgKiBIWiAvIDEwIDogMTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVvKTsKQEAgLTYwNiw3ICs2MjgsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQkJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIG1hc2ssIHZhbCwKKwkJCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIG1hc2ssIHZhbCwKIAkJCQkJCUNTX1ZFUkJPU0UgKyBDU19XQUlUX0NPTVBMRVRFKTsKIAkJCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCQkJZ290byBvdXQ7CkBAIC02MTgsNTMgKzY0MCw1MyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChmb3JjZWQpCi0JCWRldl93YXJuKERFViwgIkZvcmNlZCB0byBjb25zaWRlciBsb2NhbCBkYXRhIGFzIFVwVG9EYXRlIVxuIik7CisJCWRyYmRfd2FybihkZXZpY2UsICJGb3JjZWQgdG8gY29uc2lkZXIgbG9jYWwgZGF0YSBhcyBVcFRvRGF0ZSFcbiIpOwogCiAJLyogV2FpdCB1bnRpbCBub3RoaW5nIGlzIG9uIHRoZSBmbHkgOikgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwgYXRvbWljX3JlYWQoJm1kZXYtPmFwX3BlbmRpbmdfY250KSA9PSAwKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgPT0gMCk7CiAKIAkvKiBGSVhNRSBhbHNvIHdhaXQgZm9yIGFsbCBwZW5kaW5nIFBfQkFSUklFUl9BQ0s/ICovCiAKIAlpZiAobmV3X3JvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJc2V0X2Rpc2tfcm8obWRldi0+dmRpc2ssIHRydWUpOwotCQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJCW1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJj0gfih1NjQpMTsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQlzZXRfZGlza19ybyhkZXZpY2UtPnZkaXNrLCB0cnVlKTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmPSB+KHU2NCkxOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JCW5jID0gbWRldi0+dGNvbm4tPm5ldF9jb25mOworCQltdXRleF9sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCW5jID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmY7CiAJCWlmIChuYykKIAkJCW5jLT5kaXNjYXJkX215X2RhdGEgPSAwOyAvKiB3aXRob3V0IGNvcHk7IHNpbmdsZSBiaXQgb3AgaXMgYXRvbWljICovCi0JCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAKLQkJc2V0X2Rpc2tfcm8obWRldi0+dmRpc2ssIGZhbHNlKTsKLQkJaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCQlpZiAoKChtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQgfHwKLQkJCSAgICAgICBtZGV2LT5zdGF0ZS5wZHNrIDw9IERfRkFJTEVEKQotCQkJICAgICAgJiYgbWRldi0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID09IDApIHx8IGZvcmNlZCkKLQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQobWRldik7CisJCXNldF9kaXNrX3JvKGRldmljZS0+dmRpc2ssIGZhbHNlKTsKKwkJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJCWlmICgoKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8CisJCQkgICAgICAgZGV2aWNlLT5zdGF0ZS5wZHNrIDw9IERfRkFJTEVEKQorCQkJICAgICAgJiYgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gMCkgfHwgZm9yY2VkKQorCQkJCWRyYmRfdXVpZF9uZXdfY3VycmVudChkZXZpY2UpOwogCi0JCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdIHw9ICAodTY0KTE7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSB8PSAgKHU2NCkxOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0KIAogCS8qIHdyaXRlb3V0IG9mIGFjdGl2aXR5IGxvZyBjb3ZlcmVkIGFyZWFzIG9mIHRoZSBiaXRtYXAKIAkgKiB0byBzdGFibGUgc3RvcmFnZSBkb25lIGluIGFmdGVyIHN0YXRlIGNoYW5nZSBhbHJlYWR5ICovCiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfV0ZfUkVQT1JUX1BBUkFNUykgewogCQkvKiBpZiB0aGlzIHdhcyBmb3JjZWQsIHdlIHNob3VsZCBjb25zaWRlciBzeW5jICovCiAJCWlmIChmb3JjZWQpCi0JCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9jdXJyZW50X3N0YXRlKG1kZXYpOworCQkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKIAl9CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRldi0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CisJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KGRldmljZS0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAJcmV0dXJuIHJ2OwogfQogCkBAIC02OTksOSArNzIxLDkgQEAKIAl9CiAKIAlpZiAoaW5mby0+Z2VubGhkci0+Y21kID09IERSQkRfQURNX1BSSU1BUlkpCi0JCXJldGNvZGUgPSBkcmJkX3NldF9yb2xlKGFkbV9jdHgubWRldiwgUl9QUklNQVJZLCBwYXJtcy5hc3N1bWVfdXB0b2RhdGUpOworCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShhZG1fY3R4LmRldmljZSwgUl9QUklNQVJZLCBwYXJtcy5hc3N1bWVfdXB0b2RhdGUpOwogCWVsc2UKLQkJcmV0Y29kZSA9IGRyYmRfc2V0X3JvbGUoYWRtX2N0eC5tZGV2LCBSX1NFQ09OREFSWSwgMCk7CisJCXJldGNvZGUgPSBkcmJkX3NldF9yb2xlKGFkbV9jdHguZGV2aWNlLCBSX1NFQ09OREFSWSwgMCk7CiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwogCXJldHVybiAwOwpAQCAtNzI4LDcgKzc1MCw3IEBACiAgKiAgQWN0aXZpdHkgbG9nIHNpemUgdXNlZCB0byBiZSBmaXhlZCAzMmtCLAogICogIGJ1dCBpcyBhYm91dCB0byBiZWNvbWUgY29uZmlndXJhYmxlLgogICovCi1zdGF0aWMgdm9pZCBkcmJkX21kX3NldF9zZWN0b3Jfb2Zmc2V0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgICAgIHN0cnVjdCBkcmJkX2JhY2tpbmdfZGV2ICpiZGV2KQogewogCXNlY3Rvcl90IG1kX3NpemVfc2VjdCA9IDA7CkBAIC04MDQsMzUgKzgyNiwzNSBAQAogICogZHJiZF9hZG1fc3VzcGVuZF9pby9kcmJkX2FkbV9yZXN1bWVfaW8sCiAgKiB3aGljaCBhcmUgKHN1Yikgc3RhdGUgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgYWRtaW4gKGRyYmRzZXR1cCksCiAgKiBhbmQgY2FuIGJlIGxvbmcgbGl2ZWQuCi0gKiBUaGlzIGNoYW5nZXMgYW4gbWRldi0+ZmxhZywgaXMgdHJpZ2dlcmVkIGJ5IGRyYmQgaW50ZXJuYWxzLAorICogVGhpcyBjaGFuZ2VzIGFuIGRldmljZS0+ZmxhZywgaXMgdHJpZ2dlcmVkIGJ5IGRyYmQgaW50ZXJuYWxzLAogICogYW5kIHNob3VsZCBiZSBzaG9ydC1saXZlZC4gKi8KLXZvaWQgZHJiZF9zdXNwZW5kX2lvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfc3VzcGVuZF9pbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzZXRfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncyk7Ci0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKQorCXNldF9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOworCWlmIChkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQogCQlyZXR1cm47Ci0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+YXBfYmlvX2NudCkpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9iaW9fY250KSk7CiB9CiAKLXZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZXN1bWVfaW8oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JY2xlYXJfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncyk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwljbGVhcl9iaXQoU1VTUEVORF9JTywgJmRldmljZS0+ZmxhZ3MpOworCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAogLyoqCiAgKiBkcmJkX2RldGVybWluZV9kZXZfc2l6ZSgpIC0gIFNldHMgdGhlIHJpZ2h0IGRldmljZSBzaXplIG9iZXlpbmcgYWxsIGNvbnN0cmFpbnRzCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgcmV0dXJuIHZhbHVlcyBpbmRpY2F0ZSBlcnJvcnMuCiAgKiBZb3Ugc2hvdWxkIGNhbGwgZHJiZF9tZF9zeW5jKCkgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCiBlbnVtIGRldGVybWluZV9kZXZfc2l6ZQotZHJiZF9kZXRlcm1pbmVfZGV2X3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkZHNfZmxhZ3MgZmxhZ3MsIHN0cnVjdCByZXNpemVfcGFybXMgKnJzKSBfX211c3RfaG9sZChsb2NhbCkKK2RyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGRkc19mbGFncyBmbGFncywgc3RydWN0IHJlc2l6ZV9wYXJtcyAqcnMpIF9fbXVzdF9ob2xkKGxvY2FsKQogewogCXNlY3Rvcl90IHByZXZfZmlyc3Rfc2VjdCwgcHJldl9zaXplOyAvKiBwcmV2aW91cyBtZXRhIGxvY2F0aW9uICovCiAJc2VjdG9yX3QgbGFfc2l6ZV9zZWN0LCB1X3NpemU7Ci0Jc3RydWN0IGRyYmRfbWQgKm1kID0gJm1kZXYtPmxkZXYtPm1kOworCXN0cnVjdCBkcmJkX21kICptZCA9ICZkZXZpY2UtPmxkZXYtPm1kOwogCXUzMiBwcmV2X2FsX3N0cmlwZV9zaXplXzRrOwogCXUzMiBwcmV2X2FsX3N0cmlwZXM7CiAJc2VjdG9yX3Qgc2l6ZTsKQEAgLTg1MSwxOSArODczLDE5IEBACiAJICogU3VzcGVuZCBJTyByaWdodCBoZXJlLgogCSAqIHN0aWxsIGxvY2sgdGhlIGFjdF9sb2cgdG8gbm90IHRyaWdnZXIgQVNTRVJUcyB0aGVyZS4KIAkgKi8KLQlkcmJkX3N1c3BlbmRfaW8obWRldik7Ci0JYnVmZmVyID0gZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBMb2NrIG1ldGEtZGF0YSBJTyAqLworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCWJ1ZmZlciA9IGRyYmRfbWRfZ2V0X2J1ZmZlcihkZXZpY2UpOyAvKiBMb2NrIG1ldGEtZGF0YSBJTyAqLwogCWlmICghYnVmZmVyKSB7Ci0JCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCQlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCQlyZXR1cm4gRFNfRVJST1I7CiAJfQogCiAJLyogbm8gd2FpdCBuZWNlc3NhcnkgYW55bW9yZSwgYWN0dWFsbHkgd2UgY291bGQgYXNzZXJ0IHRoYXQgKi8KLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsIGxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+YWxfd2FpdCwgbGNfdHJ5X2xvY2soZGV2aWNlLT5hY3RfbG9nKSk7CiAKLQlwcmV2X2ZpcnN0X3NlY3QgPSBkcmJkX21kX2ZpcnN0X3NlY3RvcihtZGV2LT5sZGV2KTsKLQlwcmV2X3NpemUgPSBtZGV2LT5sZGV2LT5tZC5tZF9zaXplX3NlY3Q7Ci0JbGFfc2l6ZV9zZWN0ID0gbWRldi0+bGRldi0+bWQubGFfc2l6ZV9zZWN0OworCXByZXZfZmlyc3Rfc2VjdCA9IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGRldmljZS0+bGRldik7CisJcHJldl9zaXplID0gZGV2aWNlLT5sZGV2LT5tZC5tZF9zaXplX3NlY3Q7CisJbGFfc2l6ZV9zZWN0ID0gZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3Q7CiAKIAlpZiAocnMpIHsKIAkJLyogcnMgaXMgbm9uIE5VTEwgaWYgd2Ugc2hvdWxkIGNoYW5nZSB0aGUgQUwgbGF5b3V0IG9ubHkgKi8KQEAgLTg3NiwxOCArODk4LDE4IEBACiAJCW1kLT5hbF9zaXplXzRrID0gKHU2NClycy0+YWxfc3RyaXBlcyAqIHJzLT5hbF9zdHJpcGVfc2l6ZSAvIDQ7CiAJfQogCi0JZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMobWRldiwgbWRldi0+bGRldik7CisJZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoZGV2aWNlLCBkZXZpY2UtPmxkZXYpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXVfc2l6ZSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CisJdV9zaXplID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXNpemUgPSBkcmJkX25ld19kZXZfc2l6ZShtZGV2LCBtZGV2LT5sZGV2LCB1X3NpemUsIGZsYWdzICYgRERTRl9GT1JDRUQpOworCXNpemUgPSBkcmJkX25ld19kZXZfc2l6ZShkZXZpY2UsIGRldmljZS0+bGRldiwgdV9zaXplLCBmbGFncyAmIEREU0ZfRk9SQ0VEKTsKIAogCWlmIChzaXplIDwgbGFfc2l6ZV9zZWN0KSB7CiAJCWlmIChycyAmJiB1X3NpemUgPT0gMCkgewogCQkJLyogUmVtb3ZlICJycyAmJiIgbGF0ZXIuIFRoaXMgY2hlY2sgc2hvdWxkIGFsd2F5cyBiZSBhY3RpdmUsIGJ1dAogCQkJICAgcmlnaHQgbm93IHRoZSByZWNlaXZlciBleHBlY3RzIHRoZSBwZXJtaXNzaXZlIGJlaGF2aW9yICovCi0JCQlkZXZfd2FybihERVYsICJJbXBsaWNpdCBzaHJpbmsgbm90IGFsbG93ZWQuICIKKwkJCWRyYmRfd2FybihkZXZpY2UsICJJbXBsaWNpdCBzaHJpbmsgbm90IGFsbG93ZWQuICIKIAkJCQkgIlVzZSAtLXNpemU9JWxsdXMgZm9yIGV4cGxpY2l0IHNocmluay5cbiIsCiAJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpc2l6ZSk7CiAJCQlydiA9IERTX0VSUk9SX1NIUklOSzsKQEAgLTg5OCw2MCArOTIwLDYwIEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JaWYgKGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgIT0gc2l6ZSB8fAotCSAgICBkcmJkX2JtX2NhcGFjaXR5KG1kZXYpICE9IHNpemUpIHsKKwlpZiAoZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpICE9IHNpemUgfHwKKwkgICAgZHJiZF9ibV9jYXBhY2l0eShkZXZpY2UpICE9IHNpemUpIHsKIAkJaW50IGVycjsKLQkJZXJyID0gZHJiZF9ibV9yZXNpemUobWRldiwgc2l6ZSwgIShmbGFncyAmIEREU0ZfTk9fUkVTWU5DKSk7CisJCWVyciA9IGRyYmRfYm1fcmVzaXplKGRldmljZSwgc2l6ZSwgIShmbGFncyAmIEREU0ZfTk9fUkVTWU5DKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQkvKiBjdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgZXJyb3I6IEVOT01FTSEgKi8KLQkJCXNpemUgPSBkcmJkX2JtX2NhcGFjaXR5KG1kZXYpPj4xOworCQkJc2l6ZSA9IGRyYmRfYm1fY2FwYWNpdHkoZGV2aWNlKT4+MTsKIAkJCWlmIChzaXplID09IDApIHsKLQkJCQlkZXZfZXJyKERFViwgIk9VVCBPRiBNRU1PUlkhICIKKwkJCQlkcmJkX2VycihkZXZpY2UsICJPVVQgT0YgTUVNT1JZISAiCiAJCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgYml0bWFwIVxuIik7CiAJCQl9IGVsc2UgewotCQkJCWRldl9lcnIoREVWLCAiQk0gcmVzaXppbmcgZmFpbGVkLiAiCisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiQk0gcmVzaXppbmcgZmFpbGVkLiAiCiAJCQkJICAgICJMZWF2aW5nIHNpemUgdW5jaGFuZ2VkIGF0IHNpemUgPSAlbHUgS0JcbiIsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nKXNpemUpOwogCQkJfQogCQkJcnYgPSBEU19FUlJPUjsKIAkJfQogCQkvKiByYWN5LCBzZWUgY29tbWVudHMgYWJvdmUuICovCi0JCWRyYmRfc2V0X215X2NhcGFjaXR5KG1kZXYsIHNpemUpOwotCQltZGV2LT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBzaXplOwotCQlkZXZfaW5mbyhERVYsICJzaXplID0gJXMgKCVsbHUgS0IpXG4iLCBwcHNpemUocHBiLCBzaXplPj4xKSwKKwkJZHJiZF9zZXRfbXlfY2FwYWNpdHkoZGV2aWNlLCBzaXplKTsKKwkJZGV2aWNlLT5sZGV2LT5tZC5sYV9zaXplX3NlY3QgPSBzaXplOworCQlkcmJkX2luZm8oZGV2aWNlLCAic2l6ZSA9ICVzICglbGx1IEtCKVxuIiwgcHBzaXplKHBwYiwgc2l6ZT4+MSksCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplPj4xKTsKIAl9CiAJaWYgKHJ2IDw9IERTX0VSUk9SKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlsYV9zaXplX2NoYW5nZWQgPSAobGFfc2l6ZV9zZWN0ICE9IG1kZXYtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCk7CisJbGFfc2l6ZV9jaGFuZ2VkID0gKGxhX3NpemVfc2VjdCAhPSBkZXZpY2UtPmxkZXYtPm1kLmxhX3NpemVfc2VjdCk7CiAKLQltZF9tb3ZlZCA9IHByZXZfZmlyc3Rfc2VjdCAhPSBkcmJkX21kX2ZpcnN0X3NlY3RvcihtZGV2LT5sZGV2KQotCQl8fCBwcmV2X3NpemUJICAgIT0gbWRldi0+bGRldi0+bWQubWRfc2l6ZV9zZWN0OworCW1kX21vdmVkID0gcHJldl9maXJzdF9zZWN0ICE9IGRyYmRfbWRfZmlyc3Rfc2VjdG9yKGRldmljZS0+bGRldikKKwkJfHwgcHJldl9zaXplCSAgICE9IGRldmljZS0+bGRldi0+bWQubWRfc2l6ZV9zZWN0OwogCiAJaWYgKGxhX3NpemVfY2hhbmdlZCB8fCBtZF9tb3ZlZCB8fCBycykgewogCQl1MzIgcHJldl9mbGFnczsKIAotCQlkcmJkX2FsX3NocmluayhtZGV2KTsgLyogQWxsIGV4dGVudHMgaW5hY3RpdmUuICovCisJCWRyYmRfYWxfc2hyaW5rKGRldmljZSk7IC8qIEFsbCBleHRlbnRzIGluYWN0aXZlLiAqLwogCiAJCXByZXZfZmxhZ3MgPSBtZC0+ZmxhZ3M7CiAJCW1kLT5mbGFncyAmPSB+TURGX1BSSU1BUllfSU5EOwotCQlkcmJkX21kX3dyaXRlKG1kZXYsIGJ1ZmZlcik7CisJCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCi0JCWRldl9pbmZvKERFViwgIldyaXRpbmcgdGhlIHdob2xlIGJpdG1hcCwgJXNcbiIsCisJCWRyYmRfaW5mbyhkZXZpY2UsICJXcml0aW5nIHRoZSB3aG9sZSBiaXRtYXAsICVzXG4iLAogCQkJIGxhX3NpemVfY2hhbmdlZCAmJiBtZF9tb3ZlZCA/ICJzaXplIGNoYW5nZWQgYW5kIG1kIG1vdmVkIiA6CiAJCQkgbGFfc2l6ZV9jaGFuZ2VkID8gInNpemUgY2hhbmdlZCIgOiAibWQgbW92ZWQiKTsKIAkJLyogbmV4dCBsaW5lIGltcGxpY2l0bHkgZG9lcyBkcmJkX3N1c3BlbmRfaW8oKStkcmJkX3Jlc3VtZV9pbygpICovCi0JCWRyYmRfYml0bWFwX2lvKG1kZXYsIG1kX21vdmVkID8gJmRyYmRfYm1fd3JpdGVfYWxsIDogJmRyYmRfYm1fd3JpdGUsCisJCWRyYmRfYml0bWFwX2lvKGRldmljZSwgbWRfbW92ZWQgPyAmZHJiZF9ibV93cml0ZV9hbGwgOiAmZHJiZF9ibV93cml0ZSwKIAkJCSAgICAgICAic2l6ZSBjaGFuZ2VkIiwgQk1fTE9DS0VEX01BU0spOwotCQlkcmJkX2luaXRpYWxpemVfYWwobWRldiwgYnVmZmVyKTsKKwkJZHJiZF9pbml0aWFsaXplX2FsKGRldmljZSwgYnVmZmVyKTsKIAogCQltZC0+ZmxhZ3MgPSBwcmV2X2ZsYWdzOwotCQlkcmJkX21kX3dyaXRlKG1kZXYsIGJ1ZmZlcik7CisJCWRyYmRfbWRfd3JpdGUoZGV2aWNlLCBidWZmZXIpOwogCiAJCWlmIChycykKLQkJCWRldl9pbmZvKERFViwgIkNoYW5nZWQgQUwgbGF5b3V0IHRvIGFsLXN0cmlwZXMgPSAlZCwgYWwtc3RyaXBlLXNpemUta0IgPSAlZFxuIiwKLQkJCQkgbWQtPmFsX3N0cmlwZXMsIG1kLT5hbF9zdHJpcGVfc2l6ZV80ayAqIDQpOworCQkJZHJiZF9pbmZvKGRldmljZSwgIkNoYW5nZWQgQUwgbGF5b3V0IHRvIGFsLXN0cmlwZXMgPSAlZCwgYWwtc3RyaXBlLXNpemUta0IgPSAlZFxuIiwKKwkJCQkgIG1kLT5hbF9zdHJpcGVzLCBtZC0+YWxfc3RyaXBlX3NpemVfNGsgKiA0KTsKIAl9CiAKIAlpZiAoc2l6ZSA+IGxhX3NpemVfc2VjdCkKQEAgLTk2NiwzMCArOTg4LDMwIEBACiAJCQltZC0+YWxfc3RyaXBlX3NpemVfNGsgPSBwcmV2X2FsX3N0cmlwZV9zaXplXzRrOwogCQkJbWQtPmFsX3NpemVfNGsgPSAodTY0KXByZXZfYWxfc3RyaXBlcyAqIHByZXZfYWxfc3RyaXBlX3NpemVfNGs7CiAKLQkJCWRyYmRfbWRfc2V0X3NlY3Rvcl9vZmZzZXRzKG1kZXYsIG1kZXYtPmxkZXYpOworCQkJZHJiZF9tZF9zZXRfc2VjdG9yX29mZnNldHMoZGV2aWNlLCBkZXZpY2UtPmxkZXYpOwogCQl9CiAJfQotCWxjX3VubG9jayhtZGV2LT5hY3RfbG9nKTsKLQl3YWtlX3VwKCZtZGV2LT5hbF93YWl0KTsKLQlkcmJkX21kX3B1dF9idWZmZXIobWRldik7Ci0JZHJiZF9yZXN1bWVfaW8obWRldik7CisJbGNfdW5sb2NrKGRldmljZS0+YWN0X2xvZyk7CisJd2FrZV91cCgmZGV2aWNlLT5hbF93YWl0KTsKKwlkcmJkX21kX3B1dF9idWZmZXIoZGV2aWNlKTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiAJcmV0dXJuIHJ2OwogfQogCiBzZWN0b3JfdAotZHJiZF9uZXdfZGV2X3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCitkcmJkX25ld19kZXZfc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKmJkZXYsCiAJCSAgc2VjdG9yX3QgdV9zaXplLCBpbnQgYXNzdW1lX3BlZXJfaGFzX3NwYWNlKQogewotCXNlY3Rvcl90IHBfc2l6ZSA9IG1kZXYtPnBfc2l6ZTsgICAvKiBwYXJ0bmVyJ3MgZGlzayBzaXplLiAqLworCXNlY3Rvcl90IHBfc2l6ZSA9IGRldmljZS0+cF9zaXplOyAgIC8qIHBhcnRuZXIncyBkaXNrIHNpemUuICovCiAJc2VjdG9yX3QgbGFfc2l6ZV9zZWN0ID0gYmRldi0+bWQubGFfc2l6ZV9zZWN0OyAvKiBsYXN0IGFncmVlZCBzaXplLiAqLwogCXNlY3Rvcl90IG1fc2l6ZTsgLyogbXkgc2l6ZSAqLwogCXNlY3Rvcl90IHNpemUgPSAwOwogCiAJbV9zaXplID0gZHJiZF9nZXRfbWF4X2NhcGFjaXR5KGJkZXYpOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBhc3N1bWVfcGVlcl9oYXNfc3BhY2UpIHsKLQkJZGV2X3dhcm4oREVWLCAiUmVzaXplIHdoaWxlIG5vdCBjb25uZWN0ZWQgd2FzIGZvcmNlZCBieSB0aGUgdXNlciFcbiIpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBhc3N1bWVfcGVlcl9oYXNfc3BhY2UpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIlJlc2l6ZSB3aGlsZSBub3QgY29ubmVjdGVkIHdhcyBmb3JjZWQgYnkgdGhlIHVzZXIhXG4iKTsKIAkJcF9zaXplID0gbV9zaXplOwogCX0KIApAQCAtMTAxMSwxMSArMTAzMywxMSBAQAogCX0KIAogCWlmIChzaXplID09IDApCi0JCWRldl9lcnIoREVWLCAiQm90aCBub2RlcyBkaXNrbGVzcyFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJCb3RoIG5vZGVzIGRpc2tsZXNzIVxuIik7CiAKIAlpZiAodV9zaXplKSB7CiAJCWlmICh1X3NpemUgPiBzaXplKQotCQkJZGV2X2VycihERVYsICJSZXF1ZXN0ZWQgZGlzayBzaXplIGlzIHRvbyBiaWcgKCVsdSA+ICVsdSlcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJSZXF1ZXN0ZWQgZGlzayBzaXplIGlzIHRvbyBiaWcgKCVsdSA+ICVsdSlcbiIsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpdV9zaXplPj4xLCAodW5zaWduZWQgbG9uZylzaXplPj4xKTsKIAkJZWxzZQogCQkJc2l6ZSA9IHVfc2l6ZTsKQEAgLTEwMjYsNzEgKzEwNDgsNzEgQEAKIAogLyoqCiAgKiBkcmJkX2NoZWNrX2FsX3NpemUoKSAtIEVuc3VyZXMgdGhhdCB0aGUgQUwgaXMgb2YgdGhlIHJpZ2h0IHNpemUKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIFJldHVybnMgLUVCVVNZIGlmIGN1cnJlbnQgYWwgbHJ1IGlzIHN0aWxsIHVzZWQsIC1FTk9NRU0gd2hlbiBhbGxvY2F0aW9uCiAgKiBmYWlsZWQsIGFuZCAwIG9uIHN1Y2Nlc3MuIFlvdSBzaG91bGQgY2FsbCBkcmJkX21kX3N5bmMoKSBhZnRlciB5b3UgY2FsbGVkCiAgKiB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGRyYmRfY2hlY2tfYWxfc2l6ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZGlza19jb25mICpkYykKK3N0YXRpYyBpbnQgZHJiZF9jaGVja19hbF9zaXplKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGlza19jb25mICpkYykKIHsKIAlzdHJ1Y3QgbHJ1X2NhY2hlICpuLCAqdDsKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqZTsKIAl1bnNpZ25lZCBpbnQgaW5fdXNlOwogCWludCBpOwogCi0JaWYgKG1kZXYtPmFjdF9sb2cgJiYKLQkgICAgbWRldi0+YWN0X2xvZy0+bnJfZWxlbWVudHMgPT0gZGMtPmFsX2V4dGVudHMpCisJaWYgKGRldmljZS0+YWN0X2xvZyAmJgorCSAgICBkZXZpY2UtPmFjdF9sb2ctPm5yX2VsZW1lbnRzID09IGRjLT5hbF9leHRlbnRzKQogCQlyZXR1cm4gMDsKIAogCWluX3VzZSA9IDA7Ci0JdCA9IG1kZXYtPmFjdF9sb2c7CisJdCA9IGRldmljZS0+YWN0X2xvZzsKIAluID0gbGNfY3JlYXRlKCJhY3RfbG9nIiwgZHJiZF9hbF9leHRfY2FjaGUsIEFMX1VQREFURVNfUEVSX1RSQU5TQUNUSU9OLAogCQlkYy0+YWxfZXh0ZW50cywgc2l6ZW9mKHN0cnVjdCBsY19lbGVtZW50KSwgMCk7CiAKIAlpZiAobiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2Fubm90IGFsbG9jYXRlIGFjdF9sb2cgbHJ1IVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNhbm5vdCBhbGxvY2F0ZSBhY3RfbG9nIGxydSFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAlpZiAodCkgewogCQlmb3IgKGkgPSAwOyBpIDwgdC0+bnJfZWxlbWVudHM7IGkrKykgewogCQkJZSA9IGxjX2VsZW1lbnRfYnlfaW5kZXgodCwgaSk7CiAJCQlpZiAoZS0+cmVmY250KQotCQkJCWRldl9lcnIoREVWLCAicmVmY250KCVkKT09JWRcbiIsCisJCQkJZHJiZF9lcnIoZGV2aWNlLCAicmVmY250KCVkKT09JWRcbiIsCiAJCQkJICAgIGUtPmxjX251bWJlciwgZS0+cmVmY250KTsKIAkJCWluX3VzZSArPSBlLT5yZWZjbnQ7CiAJCX0KIAl9CiAJaWYgKCFpbl91c2UpCi0JCW1kZXYtPmFjdF9sb2cgPSBuOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7CisJCWRldmljZS0+YWN0X2xvZyA9IG47CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmFsX2xvY2spOwogCWlmIChpbl91c2UpIHsKLQkJZGV2X2VycihERVYsICJBY3Rpdml0eSBsb2cgc3RpbGwgaW4gdXNlIVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkFjdGl2aXR5IGxvZyBzdGlsbCBpbiB1c2UhXG4iKTsKIAkJbGNfZGVzdHJveShuKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgewogCQlpZiAodCkKIAkJCWxjX2Rlc3Ryb3kodCk7CiAJfQotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsgLyogd2UgY2hhbmdlZCBtZGV2LT5hY3RfbG9nLT5ucl9lbGVtZW5zICovCisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7IC8qIHdlIGNoYW5nZWQgZGV2aWNlLT5hY3RfbG9nLT5ucl9lbGVtZW5zICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfc2V0dXBfcXVldWVfcGFyYW0oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IG1heF9iaW9fc2l6ZSkKK3N0YXRpYyB2b2lkIGRyYmRfc2V0dXBfcXVldWVfcGFyYW0oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBtYXhfYmlvX3NpemUpCiB7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBxID0gbWRldi0+cnFfcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBxID0gZGV2aWNlLT5ycV9xdWV1ZTsKIAl1bnNpZ25lZCBpbnQgbWF4X2h3X3NlY3RvcnMgPSBtYXhfYmlvX3NpemUgPj4gOTsKIAl1bnNpZ25lZCBpbnQgbWF4X3NlZ21lbnRzID0gMDsKIAotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0FUVEFDSElORykpIHsKLQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBiID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKiBjb25zdCBiID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYtPmJkX2Rpc2stPnF1ZXVlOwogCiAJCW1heF9od19zZWN0b3JzID0gbWluKHF1ZXVlX21heF9od19zZWN0b3JzKGIpLCBtYXhfYmlvX3NpemUgPj4gOSk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbWF4X3NlZ21lbnRzID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPm1heF9iaW9fYnZlY3M7CisJCW1heF9zZWdtZW50cyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPm1heF9iaW9fYnZlY3M7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEsIDUxMik7CkBAIC0xMDk5LDQ2ICsxMTIxLDQ2IEBACiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhxLCBtYXhfc2VnbWVudHMgPyBtYXhfc2VnbWVudHMgOiBCTEtfTUFYX1NFR01FTlRTKTsKIAlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShxLCBQQUdFX0NBQ0hFX1NJWkUtMSk7CiAKLQlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKSB7Ci0JCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICogY29uc3QgYiA9IG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWU7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9BVFRBQ0hJTkcpKSB7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICogY29uc3QgYiA9IGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKIAogCQlibGtfcXVldWVfc3RhY2tfbGltaXRzKHEsIGIpOwogCiAJCWlmIChxLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzICE9IGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMpIHsKLQkJCWRldl9pbmZvKERFViwgIkFkanVzdGluZyBteSByYV9wYWdlcyB0byBiYWNraW5nIGRldmljZSdzICglbHUgLT4gJWx1KVxuIiwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJBZGp1c3RpbmcgbXkgcmFfcGFnZXMgdG8gYmFja2luZyBkZXZpY2UncyAoJWx1IC0+ICVsdSlcbiIsCiAJCQkJIHEtPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMsCiAJCQkJIGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMpOwogCQkJcS0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9IGItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXM7CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogfQogCi12b2lkIGRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yZWNvbnNpZGVyX21heF9iaW9fc2l6ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAl1bnNpZ25lZCBpbnQgbm93LCBuZXcsIGxvY2FsLCBwZWVyOwogCi0Jbm93ID0gcXVldWVfbWF4X2h3X3NlY3RvcnMobWRldi0+cnFfcXVldWUpIDw8IDk7Ci0JbG9jYWwgPSBtZGV2LT5sb2NhbF9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSB2b2xhdGlsZSBtZW1vcnkgKi8KLQlwZWVyID0gbWRldi0+cGVlcl9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSBtZXRhIGRhdGEgKi8KKwlub3cgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPnJxX3F1ZXVlKSA8PCA5OworCWxvY2FsID0gZGV2aWNlLT5sb2NhbF9tYXhfYmlvX3NpemU7IC8qIEV2ZW50dWFsbHkgbGFzdCBrbm93biB2YWx1ZSwgZnJvbSB2b2xhdGlsZSBtZW1vcnkgKi8KKwlwZWVyID0gZGV2aWNlLT5wZWVyX21heF9iaW9fc2l6ZTsgLyogRXZlbnR1YWxseSBsYXN0IGtub3duIHZhbHVlLCBmcm9tIG1ldGEgZGF0YSAqLwogCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQVRUQUNISU5HKSkgewotCQlsb2NhbCA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7Ci0JCW1kZXYtPmxvY2FsX21heF9iaW9fc2l6ZSA9IGxvY2FsOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpIHsKKwkJbG9jYWwgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldi0+YmRfZGlzay0+cXVldWUpIDw8IDk7CisJCWRldmljZS0+bG9jYWxfbWF4X2Jpb19zaXplID0gbG9jYWw7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCWxvY2FsID0gbWluKGxvY2FsLCBEUkJEX01BWF9CSU9fU0laRSk7CiAKIAkvKiBXZSBtYXkgaWdub3JlIHBlZXIgbGltaXRzIGlmIHRoZSBwZWVyIGlzIG1vZGVybiBlbm91Z2guCiAJICAgQmVjYXVzZSBuZXcgZnJvbSA4LjMuOCBvbndhcmRzIHRoZSBwZWVyIGNhbiB1c2UgbXVsdGlwbGUKIAkgICBCSU9zIGZvciBhIHNpbmdsZSBwZWVyX3JlcXVlc3QgKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKLQkJaWYgKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NCkKLQkJCXBlZXIgPSBtaW4obWRldi0+cGVlcl9tYXhfYmlvX3NpemUsIERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVCk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk0KQorCQkJcGVlciA9IG1pbihkZXZpY2UtPnBlZXJfbWF4X2Jpb19zaXplLCBEUkJEX01BWF9TSVpFX0g4MF9QQUNLRVQpOwogCQkJLyogQ29ycmVjdCBvbGQgZHJiZCAodXAgdG8gOC4zLjcpIGlmIGl0IGJlbGlldmVzIGl0IGNhbiBkbyBtb3JlIHRoYW4gMzJLaUIgKi8KLQkJZWxzZSBpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA9PSA5NCkKKwkJZWxzZSBpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID09IDk0KQogCQkJcGVlciA9IERSQkRfTUFYX1NJWkVfSDgwX1BBQ0tFVDsKLQkJZWxzZSBpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCkKKwkJZWxzZSBpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKQogCQkJcGVlciA9IERSQkRfTUFYX0JJT19TSVpFX1A5NTsgIC8qIGRyYmQgOC4zLjggb253YXJkcywgYmVmb3JlIDguNC4wICovCiAJCWVsc2UKIAkJCXBlZXIgPSBEUkJEX01BWF9CSU9fU0laRTsKQEAgLTExNDYsNTcgKzExNjgsNTcgQEAKIAogCW5ldyA9IG1pbihsb2NhbCwgcGVlcik7CiAKLQlpZiAobWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYgbmV3IDwgbm93KQotCQlkZXZfZXJyKERFViwgIkFTU0VSVCBGQUlMRUQgbmV3IDwgbm93OyAoJXUgPCAldSlcbiIsIG5ldywgbm93KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSAmJiBuZXcgPCBub3cpCisJCWRyYmRfZXJyKGRldmljZSwgIkFTU0VSVCBGQUlMRUQgbmV3IDwgbm93OyAoJXUgPCAldSlcbiIsIG5ldywgbm93KTsKIAogCWlmIChuZXcgIT0gbm93KQotCQlkZXZfaW5mbyhERVYsICJtYXggQklPIHNpemUgPSAldVxuIiwgbmV3KTsKKwkJZHJiZF9pbmZvKGRldmljZSwgIm1heCBCSU8gc2l6ZSA9ICV1XG4iLCBuZXcpOwogCi0JZHJiZF9zZXR1cF9xdWV1ZV9wYXJhbShtZGV2LCBuZXcpOworCWRyYmRfc2V0dXBfcXVldWVfcGFyYW0oZGV2aWNlLCBuZXcpOwogfQogCiAvKiBTdGFydHMgdGhlIHdvcmtlciB0aHJlYWQgKi8KLXN0YXRpYyB2b2lkIGNvbm5fcmVjb25maWdfc3RhcnQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9yZWNvbmZpZ19zdGFydChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCWRyYmRfdGhyZWFkX3N0YXJ0KCZ0Y29ubi0+d29ya2VyKTsKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZSh0Y29ubik7CisJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPndvcmtlcik7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIH0KIAogLyogaWYgc3RpbGwgdW5jb25maWd1cmVkLCBzdG9wcyB3b3JrZXIgYWdhaW4uICovCi1zdGF0aWMgdm9pZCBjb25uX3JlY29uZmlnX2RvbmUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9yZWNvbmZpZ19kb25lKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJYm9vbCBzdG9wX3RocmVhZHM7Ci0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlzdG9wX3RocmVhZHMgPSBjb25uX2FsbF92b2xzX3VuY29uZih0Y29ubikgJiYKLQkJdGNvbm4tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkU7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJc3RvcF90aHJlYWRzID0gY29ubl9hbGxfdm9sc191bmNvbmYoY29ubmVjdGlvbikgJiYKKwkJY29ubmVjdGlvbi0+Y3N0YXRlID09IENfU1RBTkRBTE9ORTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAJaWYgKHN0b3BfdGhyZWFkcykgewogCQkvKiBhc2VuZGVyIGlzIGltcGxpY2l0bHkgc3RvcHBlZCBieSByZWNlaXZlcgogCQkgKiBpbiBjb25uX2Rpc2Nvbm5lY3QoKSAqLwotCQlkcmJkX3RocmVhZF9zdG9wKCZ0Y29ubi0+cmVjZWl2ZXIpOwotCQlkcmJkX3RocmVhZF9zdG9wKCZ0Y29ubi0+d29ya2VyKTsKKwkJZHJiZF90aHJlYWRfc3RvcCgmY29ubmVjdGlvbi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT53b3JrZXIpOwogCX0KIH0KIAogLyogTWFrZSBzdXJlIElPIGlzIHN1c3BlbmRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uKCkuICovCi1zdGF0aWMgdm9pZCBkcmJkX3N1c3BlbmRfYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfc3VzcGVuZF9hbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcyA9IDA7CiAKLQlpZiAoIWxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKSB7Ci0JCWRldl93YXJuKERFViwgIkZhaWxlZCB0byBsb2NrIGFsIGluIGRyYmRfc3VzcGVuZF9hbCgpXG4iKTsKKwlpZiAoIWxjX3RyeV9sb2NrKGRldmljZS0+YWN0X2xvZykpIHsKKwkJZHJiZF93YXJuKGRldmljZSwgIkZhaWxlZCB0byBsb2NrIGFsIGluIGRyYmRfc3VzcGVuZF9hbCgpXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWRyYmRfYWxfc2hyaW5rKG1kZXYpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKLQkJcyA9ICF0ZXN0X2FuZF9zZXRfYml0KEFMX1NVU1BFTkRFRCwgJm1kZXYtPmZsYWdzKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOworCWRyYmRfYWxfc2hyaW5rKGRldmljZSk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCkKKwkJcyA9ICF0ZXN0X2FuZF9zZXRfYml0KEFMX1NVU1BFTkRFRCwgJmRldmljZS0+ZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWxjX3VubG9jayhkZXZpY2UtPmFjdF9sb2cpOwogCiAJaWYgKHMpCi0JCWRldl9pbmZvKERFViwgIlN1c3BlbmRlZCBBTCB1cGRhdGVzXG4iKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlN1c3BlbmRlZCBBTCB1cGRhdGVzXG4iKTsKIH0KIAogCkBAIC0xMjM3LDcgKzEyNTksNyBAQAogaW50IGRyYmRfYWRtX2Rpc2tfb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGRpc2tfY29uZiAqbmV3X2Rpc2tfY29uZiwgKm9sZF9kaXNrX2NvbmY7CiAJc3RydWN0IGZpZm9fYnVmZmVyICpvbGRfcGxhbiA9IE5VTEwsICpuZXdfcGxhbiA9IE5VTEw7CiAJaW50IGVyciwgZmlmb19zaXplOwpAQCAtMTI0OCwxMSArMTI3MCwxMSBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiB3ZSBhbHNvIG5lZWQgYSBkaXNrCiAJICogdG8gY2hhbmdlIHRoZSBvcHRpb25zIG9uICovCi0JaWYgKCFnZXRfbGRldihtZGV2KSkgeworCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlyZXRjb2RlID0gRVJSX05PX0RJU0s7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyNjMsOCArMTI4NSw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9kaXNrX2NvbmYgPSBtZGV2LT5sZGV2LT5kaXNrX2NvbmY7CisJbXV0ZXhfbG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9kaXNrX2NvbmYgPSBkZXZpY2UtPmxkZXYtPmRpc2tfY29uZjsKIAkqbmV3X2Rpc2tfY29uZiA9ICpvbGRfZGlza19jb25mOwogCWlmIChzaG91bGRfc2V0X2RlZmF1bHRzKGluZm8pKQogCQlzZXRfZGlza19jb25mX2RlZmF1bHRzKG5ld19kaXNrX2NvbmYpOwpAQCAtMTI3Myw2ICsxMjk1LDcgQEAKIAlpZiAoZXJyICYmIGVyciAhPSAtRU5PTVNHKSB7CiAJCXJldGNvZGUgPSBFUlJfTUFOREFUT1JZX1RBRzsKIAkJZHJiZF9tc2dfcHV0X2luZm8oZnJvbV9hdHRyc19lcnJfdG9fdHh0KGVycikpOworCQlnb3RvIGZhaWxfdW5sb2NrOwogCX0KIAogCWlmICghZXhwZWN0KG5ld19kaXNrX2NvbmYtPnJlc3luY19yYXRlID49IDEpKQpAQCAtMTI4MCwyOSArMTMwMywyOSBAQAogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPCBEUkJEX0FMX0VYVEVOVFNfTUlOKQogCQluZXdfZGlza19jb25mLT5hbF9leHRlbnRzID0gRFJCRF9BTF9FWFRFTlRTX01JTjsKLQlpZiAobmV3X2Rpc2tfY29uZi0+YWxfZXh0ZW50cyA+IGRyYmRfYWxfZXh0ZW50c19tYXgobWRldi0+bGRldikpCi0JCW5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPSBkcmJkX2FsX2V4dGVudHNfbWF4KG1kZXYtPmxkZXYpOworCWlmIChuZXdfZGlza19jb25mLT5hbF9leHRlbnRzID4gZHJiZF9hbF9leHRlbnRzX21heChkZXZpY2UtPmxkZXYpKQorCQluZXdfZGlza19jb25mLT5hbF9leHRlbnRzID0gZHJiZF9hbF9leHRlbnRzX21heChkZXZpY2UtPmxkZXYpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmNfcGxhbl9haGVhZCA+IERSQkRfQ19QTEFOX0FIRUFEX01BWCkKIAkJbmV3X2Rpc2tfY29uZi0+Y19wbGFuX2FoZWFkID0gRFJCRF9DX1BMQU5fQUhFQURfTUFYOwogCiAJZmlmb19zaXplID0gKG5ld19kaXNrX2NvbmYtPmNfcGxhbl9haGVhZCAqIDEwICogU0xFRVBfVElNRSkgLyBIWjsKLQlpZiAoZmlmb19zaXplICE9IG1kZXYtPnJzX3BsYW5fcy0+c2l6ZSkgeworCWlmIChmaWZvX3NpemUgIT0gZGV2aWNlLT5yc19wbGFuX3MtPnNpemUpIHsKIAkJbmV3X3BsYW4gPSBmaWZvX2FsbG9jKGZpZm9fc2l6ZSk7CiAJCWlmICghbmV3X3BsYW4pIHsKLQkJCWRldl9lcnIoREVWLCAia21hbGxvYyBvZiBmaWZvX2J1ZmZlciBmYWlsZWQiKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2Mgb2YgZmlmb19idWZmZXIgZmFpbGVkIik7CiAJCQlyZXRjb2RlID0gRVJSX05PTUVNOwogCQkJZ290byBmYWlsX3VubG9jazsKIAkJfQogCX0KIAotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKLQl3YWl0X2V2ZW50KG1kZXYtPmFsX3dhaXQsIGxjX3RyeV9sb2NrKG1kZXYtPmFjdF9sb2cpKTsKLQlkcmJkX2FsX3NocmluayhtZGV2KTsKLQllcnIgPSBkcmJkX2NoZWNrX2FsX3NpemUobWRldiwgbmV3X2Rpc2tfY29uZik7Ci0JbGNfdW5sb2NrKG1kZXYtPmFjdF9sb2cpOwotCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOwotCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5hbF93YWl0LCBsY190cnlfbG9jayhkZXZpY2UtPmFjdF9sb2cpKTsKKwlkcmJkX2FsX3NocmluayhkZXZpY2UpOworCWVyciA9IGRyYmRfY2hlY2tfYWxfc2l6ZShkZXZpY2UsIG5ld19kaXNrX2NvbmYpOworCWxjX3VubG9jayhkZXZpY2UtPmFjdF9sb2cpOworCXdha2VfdXAoJmRldmljZS0+YWxfd2FpdCk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogCWlmIChlcnIpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKQEAgLTEzMTAsMTAgKzEzMzMsMTAgQEAKIAl9CiAKIAl3cml0ZV9sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwotCXJldGNvZGUgPSBkcmJkX3Jlc3luY19hZnRlcl92YWxpZChtZGV2LCBuZXdfZGlza19jb25mLT5yZXN5bmNfYWZ0ZXIpOworCXJldGNvZGUgPSBkcmJkX3Jlc3luY19hZnRlcl92YWxpZChkZXZpY2UsIG5ld19kaXNrX2NvbmYtPnJlc3luY19hZnRlcik7CiAJaWYgKHJldGNvZGUgPT0gTk9fRVJST1IpIHsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG1kZXYtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7Ci0JCWRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQobWRldik7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCWRyYmRfcmVzeW5jX2FmdGVyX2NoYW5nZWQoZGV2aWNlKTsKIAl9CiAJd3JpdGVfdW5sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwogCkBAIC0xMzIxLDQyICsxMzQ0LDQ2IEBACiAJCWdvdG8gZmFpbF91bmxvY2s7CiAKIAlpZiAobmV3X3BsYW4pIHsKLQkJb2xkX3BsYW4gPSBtZGV2LT5yc19wbGFuX3M7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihtZGV2LT5yc19wbGFuX3MsIG5ld19wbGFuKTsKKwkJb2xkX3BsYW4gPSBkZXZpY2UtPnJzX3BsYW5fczsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS0+cnNfcGxhbl9zLCBuZXdfcGxhbik7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYtPmFsX3VwZGF0ZXMpCi0JCW1kZXYtPmxkZXYtPm1kLmZsYWdzICY9IH5NREZfQUxfRElTQUJMRUQ7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgJj0gfk1ERl9BTF9ESVNBQkxFRDsKIAllbHNlCi0JCW1kZXYtPmxkZXYtPm1kLmZsYWdzIHw9IE1ERl9BTF9ESVNBQkxFRDsKKwkJZGV2aWNlLT5sZGV2LT5tZC5mbGFncyB8PSBNREZfQUxfRElTQUJMRUQ7CiAKIAlpZiAobmV3X2Rpc2tfY29uZi0+bWRfZmx1c2hlcykKLQkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJm1kZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpOwogCWVsc2UKLQkJc2V0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkcmJkX2J1bXBfd3JpdGVfb3JkZXJpbmcobWRldi0+dGNvbm4sIFdPX2JkZXZfZmx1c2gpOworCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBXT19iZGV2X2ZsdXNoKTsKIAotCWRyYmRfbWRfc3luYyhtZGV2KTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEKQotCQlkcmJkX3NlbmRfc3luY19wYXJhbShtZGV2KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEKSB7CisJCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKworCQlmb3JfZWFjaF9wZWVyX2RldmljZShwZWVyX2RldmljZSwgZGV2aWNlKQorCQkJZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOworCX0KIAogCXN5bmNocm9uaXplX3JjdSgpOwogCWtmcmVlKG9sZF9kaXNrX2NvbmYpOwogCWtmcmVlKG9sZF9wbGFuKTsKLQltb2RfdGltZXIoJm1kZXYtPnJlcXVlc3RfdGltZXIsIGppZmZpZXMgKyBIWik7CisJbW9kX3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIsIGppZmZpZXMgKyBIWik7CiAJZ290byBzdWNjZXNzOwogCiBmYWlsX3VubG9jazoKLQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAgZmFpbDoKIAlrZnJlZShuZXdfZGlza19jb25mKTsKIAlrZnJlZShuZXdfcGxhbik7CiBzdWNjZXNzOgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiAgb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTEzNjQsNyArMTM5MSw3IEBACiAKIGludCBkcmJkX2FkbV9hdHRhY2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCBlcnI7CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAJZW51bSBkZXRlcm1pbmVfZGV2X3NpemUgZGQ7CkBAIC0xMzg1LDExICsxNDEyLDExIEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmluaXNoOwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQljb25uX3JlY29uZmlnX3N0YXJ0KG1kZXYtPnRjb25uKTsKKwlkZXZpY2UgPSBhZG1fY3R4LmRldmljZTsKKwljb25uX3JlY29uZmlnX3N0YXJ0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCiAJLyogaWYgeW91IHdhbnQgdG8gcmVjb25maWd1cmUsIHBsZWFzZSB0ZWFyIGRvd24gZmlyc3QgKi8KLQlpZiAobWRldi0+c3RhdGUuZGlzayA+IERfRElTS0xFU1MpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9ESVNLTEVTUykgewogCQlyZXRjb2RlID0gRVJSX0RJU0tfQ09ORklHVVJFRDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTEzOTcsMTcgKzE0MjQsMTcgQEAKIAkgKiBkcmJkX2xkZXZfZGVzdHJveSBpcyBkb25lIGFscmVhZHksIHdlIG1heSBlbmQgdXAgaGVyZSB2ZXJ5IGZhc3QsCiAJICogZS5nLiBpZiBzb21lb25lIGNhbGxzIGF0dGFjaCBmcm9tIHRoZSBvbi1pby1lcnJvciBoYW5kbGVyLAogCSAqIHRvIHJlYWxpemUgYSAiaG90IHNwYXJlIiBmZWF0dXJlIChub3QgdGhhdCBJJ2QgcmVjb21tZW5kIHRoYXQpICovCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSk7CisJd2FpdF9ldmVudChkZXZpY2UtPm1pc2Nfd2FpdCwgIWF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCkpOwogCiAJLyogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGxlZnRvdmVyIGZyb20gcHJldmlvdXMgZm9yY2UtZGV0YWNoIGF0dGVtcHRzICovCi0JY2xlYXJfYml0KEZPUkNFX0RFVEFDSCwgJm1kZXYtPmZsYWdzKTsKLQljbGVhcl9iaXQoV0FTX0lPX0VSUk9SLCAmbWRldi0+ZmxhZ3MpOwotCWNsZWFyX2JpdChXQVNfUkVBRF9FUlJPUiwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRk9SQ0VfREVUQUNILCAmZGV2aWNlLT5mbGFncyk7CisJY2xlYXJfYml0KFdBU19JT19FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOworCWNsZWFyX2JpdChXQVNfUkVBRF9FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOwogCiAJLyogYW5kIG5vIGxlZnRvdmVyIGZyb20gcHJldmlvdXNseSBhYm9ydGVkIHJlc3luYyBvciB2ZXJpZnksIGVpdGhlciAqLwotCW1kZXYtPnJzX3RvdGFsID0gMDsKLQltZGV2LT5yc19mYWlsZWQgPSAwOwotCWF0b21pY19zZXQoJm1kZXYtPnJzX3BlbmRpbmdfY250LCAwKTsKKwlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwlkZXZpY2UtPnJzX2ZhaWxlZCA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CiAKIAkvKiBhbGxvY2F0aW9uIG5vdCBpbiB0aGUgSU8gcGF0aCwgZHJiZHNldHVwIGNvbnRleHQgKi8KIAluYmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiksIEdGUF9LRVJORUwpOwpAQCAtMTQ0NywxMyArMTQ3NCwxMyBAQAogCX0KIAogCXdyaXRlX2xvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7Ci0JcmV0Y29kZSA9IGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKG1kZXYsIG5ld19kaXNrX2NvbmYtPnJlc3luY19hZnRlcik7CisJcmV0Y29kZSA9IGRyYmRfcmVzeW5jX2FmdGVyX3ZhbGlkKGRldmljZSwgbmV3X2Rpc2tfY29uZi0+cmVzeW5jX2FmdGVyKTsKIAl3cml0ZV91bmxvY2tfaXJxKCZnbG9iYWxfc3RhdGVfbG9jayk7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmFpbDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAlpZiAobmMpIHsKIAkJaWYgKG5ld19kaXNrX2NvbmYtPmZlbmNpbmcgPT0gRlBfU1RPTklUSCAmJiBuYy0+d2lyZV9wcm90b2NvbCA9PSBEUkJEX1BST1RfQSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNDY0LDkgKzE0OTEsOSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJYmRldiA9IGJsa2Rldl9nZXRfYnlfcGF0aChuZXdfZGlza19jb25mLT5iYWNraW5nX2RldiwKLQkJCQkgIEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSB8IEZNT0RFX0VYQ0wsIG1kZXYpOworCQkJCSAgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwgRk1PREVfRVhDTCwgZGV2aWNlKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7Ci0JCWRldl9lcnIoREVWLCAib3BlbihcIiVzXCIpIGZhaWxlZCB3aXRoICVsZFxuIiwgbmV3X2Rpc2tfY29uZi0+YmFja2luZ19kZXYsCisJCWRyYmRfZXJyKGRldmljZSwgIm9wZW4oXCIlc1wiKSBmYWlsZWQgd2l0aCAlbGRcbiIsIG5ld19kaXNrX2NvbmYtPmJhY2tpbmdfZGV2LAogCQkJUFRSX0VSUihiZGV2KSk7CiAJCXJldGNvZGUgPSBFUlJfT1BFTl9ESVNLOwogCQlnb3RvIGZhaWw7CkBAIC0xNDg0LDkgKzE1MTEsOSBAQAogCWJkZXYgPSBibGtkZXZfZ2V0X2J5X3BhdGgobmV3X2Rpc2tfY29uZi0+bWV0YV9kZXYsCiAJCQkJICBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMLAogCQkJCSAgKG5ld19kaXNrX2NvbmYtPm1ldGFfZGV2X2lkeCA8IDApID8KLQkJCQkgICh2b2lkICopbWRldiA6ICh2b2lkICopZHJiZF9tX2hvbGRlcik7CisJCQkJICAodm9pZCAqKWRldmljZSA6ICh2b2lkICopZHJiZF9tX2hvbGRlcik7CiAJaWYgKElTX0VSUihiZGV2KSkgewotCQlkZXZfZXJyKERFViwgIm9wZW4oXCIlc1wiKSBmYWlsZWQgd2l0aCAlbGRcbiIsIG5ld19kaXNrX2NvbmYtPm1ldGFfZGV2LAorCQlkcmJkX2VycihkZXZpY2UsICJvcGVuKFwiJXNcIikgZmFpbGVkIHdpdGggJWxkXG4iLCBuZXdfZGlza19jb25mLT5tZXRhX2RldiwKIAkJCVBUUl9FUlIoYmRldikpOwogCQlyZXRjb2RlID0gRVJSX09QRU5fTURfRElTSzsKIAkJZ290byBmYWlsOwpAQCAtMTUxMCw3ICsxNTM3LDcgQEAKIAogCS8qIFJlYWQgb3VyIG1ldGEgZGF0YSBzdXBlciBibG9jayBlYXJseS4KIAkgKiBUaGlzIGFsc28gc2V0cyBvdGhlciBvbi1kaXNrIG9mZnNldHMuICovCi0JcmV0Y29kZSA9IGRyYmRfbWRfcmVhZChtZGV2LCBuYmMpOworCXJldGNvZGUgPSBkcmJkX21kX3JlYWQoZGV2aWNlLCBuYmMpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKQEAgLTE1MjAsNyArMTU0Nyw3IEBACiAJCW5ld19kaXNrX2NvbmYtPmFsX2V4dGVudHMgPSBkcmJkX2FsX2V4dGVudHNfbWF4KG5iYyk7CiAKIAlpZiAoZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG5iYykgPCBuZXdfZGlza19jb25mLT5kaXNrX3NpemUpIHsKLQkJZGV2X2VycihERVYsICJtYXggY2FwYWNpdHkgJWxsdSBzbWFsbGVyIHRoYW4gZGlzayBzaXplICVsbHVcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIm1heCBjYXBhY2l0eSAlbGx1IHNtYWxsZXIgdGhhbiBkaXNrIHNpemUgJWxsdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGRyYmRfZ2V0X21heF9jYXBhY2l0eShuYmMpLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbmV3X2Rpc2tfY29uZi0+ZGlza19zaXplKTsKIAkJcmV0Y29kZSA9IEVSUl9ESVNLX1RPT19TTUFMTDsKQEAgLTE1MzgsNyArMTU2NSw3IEBACiAKIAlpZiAoZHJiZF9nZXRfY2FwYWNpdHkobmJjLT5tZF9iZGV2KSA8IG1pbl9tZF9kZXZpY2Vfc2VjdG9ycykgewogCQlyZXRjb2RlID0gRVJSX01EX0RJU0tfVE9PX1NNQUxMOwotCQlkZXZfd2FybihERVYsICJyZWZ1c2luZyBhdHRhY2g6IG1kLWRldmljZSB0b28gc21hbGwsICIKKwkJZHJiZF93YXJuKGRldmljZSwgInJlZnVzaW5nIGF0dGFjaDogbWQtZGV2aWNlIHRvbyBzbWFsbCwgIgogCQkgICAgICJhdCBsZWFzdCAlbGx1IHNlY3RvcnMgbmVlZGVkIGZvciB0aGlzIG1ldGEtZGlzayB0eXBlXG4iLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1pbl9tZF9kZXZpY2Vfc2VjdG9ycyk7CiAJCWdvdG8gZmFpbDsKQEAgLTE1NDcsNyArMTU3NCw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBuZXcgZGlzayBpcyBiaWcgZW5vdWdoCiAJICogKHdlIG1heSBjdXJyZW50bHkgYmUgUl9QUklNQVJZIHdpdGggbm8gbG9jYWwgZGlzay4uLikgKi8KIAlpZiAoZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG5iYykgPAotCSAgICBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYpKSB7CisJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSkgewogCQlyZXRjb2RlID0gRVJSX0RJU0tfVE9PX1NNQUxMOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTU1NSwxNSArMTU4MiwxNSBAQAogCW5iYy0+a25vd25fc2l6ZSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG5iYy0+YmFja2luZ19iZGV2KTsKIAogCWlmIChuYmMtPmtub3duX3NpemUgPiBtYXhfcG9zc2libGVfc2VjdG9ycykgewotCQlkZXZfd2FybihERVYsICI9PT4gdHJ1bmNhdGluZyB2ZXJ5IGJpZyBsb3dlciBsZXZlbCBkZXZpY2UgIgorCQlkcmJkX3dhcm4oZGV2aWNlLCAiPT0+IHRydW5jYXRpbmcgdmVyeSBiaWcgbG93ZXIgbGV2ZWwgZGV2aWNlICIKIAkJCSJ0byBjdXJyZW50bHkgbWF4aW11bSBwb3NzaWJsZSAlbGx1IHNlY3RvcnMgPD09XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbWF4X3Bvc3NpYmxlX3NlY3RvcnMpOwogCQlpZiAobmV3X2Rpc2tfY29uZi0+bWV0YV9kZXZfaWR4ID49IDApCi0JCQlkZXZfd2FybihERVYsICI9PT4+IHVzaW5nIGludGVybmFsIG9yIGZsZXhpYmxlICIKKwkJCWRyYmRfd2FybihkZXZpY2UsICI9PT4+IHVzaW5nIGludGVybmFsIG9yIGZsZXhpYmxlICIKIAkJCQkgICAgICAibWV0YSBkYXRhIG1heSBoZWxwIDw8PT1cbiIpOwogCX0KIAotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKKwlkcmJkX3N1c3BlbmRfaW8oZGV2aWNlKTsKIAkvKiBhbHNvIHdhaXQgZm9yIHRoZSBsYXN0IGJhcnJpZXIgYWNrLiAqLwogCS8qIEZJWE1FIHNlZSBhbHNvIGh0dHBzOi8vZGFpcXVpcmkubGluYml0L2NnaS1iaW4vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3MQogCSAqIFdlIG5lZWQgYSB3YXkgdG8gZWl0aGVyIGlnbm9yZSBiYXJyaWVyIGFja3MgZm9yIGJhcnJpZXJzIHNlbnQgYmVmb3JlIGEgZGV2aWNlCkBAIC0xNTcxLDQ1ICsxNTk4LDQ1IEBACiAJICogQXMgYmFycmllcnMgYXJlIGNvdW50ZWQgcGVyIHJlc291cmNlLAogCSAqIHdlJ2QgbmVlZCB0byBzdXNwZW5kIGlvIG9uIGFsbCBkZXZpY2VzIG9mIGEgcmVzb3VyY2UuCiAJICovCi0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICFhdG9taWNfcmVhZCgmbWRldi0+YXBfcGVuZGluZ19jbnQpIHx8IGRyYmRfc3VzcGVuZGVkKG1kZXYpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhYXRvbWljX3JlYWQoJmRldmljZS0+YXBfcGVuZGluZ19jbnQpIHx8IGRyYmRfc3VzcGVuZGVkKGRldmljZSkpOwogCS8qIGFuZCBmb3IgYW55IG90aGVyIHByZXZpb3VzbHkgcXVldWVkIHdvcmsgKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmspOwogCi0JcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGRpc2ssIERfQVRUQUNISU5HKSwgQ1NfVkVSQk9TRSk7CisJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoZGlzaywgRF9BVFRBQ0hJTkcpLCBDU19WRVJCT1NFKTsKIAlyZXRjb2RlID0gcnY7ICAvKiBGSVhNRTogVHlwZSBtaXNtYXRjaC4gKi8KLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCWdvdG8gZmFpbDsKIAotCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9BVFRBQ0hJTkcpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0FUVEFDSElORykpCiAJCWdvdG8gZm9yY2VfZGlza2xlc3M7CiAKLQlpZiAoIW1kZXYtPmJpdG1hcCkgewotCQlpZiAoZHJiZF9ibV9pbml0KG1kZXYpKSB7CisJaWYgKCFkZXZpY2UtPmJpdG1hcCkgeworCQlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpIHsKIAkJCXJldGNvZGUgPSBFUlJfTk9NRU07CiAJCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uIDwgQ19DT05ORUNURUQgJiYKLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKLQkgICAgKG1kZXYtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChuYmMtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG9ubHkgYXR0YWNoIHRvIGRhdGEgd2l0aCBjdXJyZW50IFVVSUQ9JTAxNmxsWFxuIiwKLQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+ZWRfdXVpZCk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEICYmCisJICAgIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKKwkgICAgKGRldmljZS0+ZWRfdXVpZCAmIH4oKHU2NCkxKSkgIT0gKG5iYy0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKSkpIHsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ2FuIG9ubHkgYXR0YWNoIHRvIGRhdGEgd2l0aCBjdXJyZW50IFVVSUQ9JTAxNmxsWFxuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWNlLT5lZF91dWlkKTsKIAkJcmV0Y29kZSA9IEVSUl9EQVRBX05PVF9DVVJSRU5UOwogCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAl9CiAKIAkvKiBTaW5jZSB3ZSBhcmUgZGlza2xlc3MsIGZpeCB0aGUgYWN0aXZpdHkgbG9nIGZpcnN0Li4uICovCi0JaWYgKGRyYmRfY2hlY2tfYWxfc2l6ZShtZGV2LCBuZXdfZGlza19jb25mKSkgeworCWlmIChkcmJkX2NoZWNrX2FsX3NpemUoZGV2aWNlLCBuZXdfZGlza19jb25mKSkgewogCQlyZXRjb2RlID0gRVJSX05PTUVNOwogCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAl9CiAKIAkvKiBQcmV2ZW50IHNocmlua2luZyBvZiBjb25zaXN0ZW50IGRldmljZXMgISAqLwogCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhuYmMsIE1ERl9DT05TSVNURU5UKSAmJgotCSAgICBkcmJkX25ld19kZXZfc2l6ZShtZGV2LCBuYmMsIG5iYy0+ZGlza19jb25mLT5kaXNrX3NpemUsIDApIDwgbmJjLT5tZC5sYV9zaXplX3NlY3QpIHsKLQkJZGV2X3dhcm4oREVWLCAicmVmdXNpbmcgdG8gdHJ1bmNhdGUgYSBjb25zaXN0ZW50IGRldmljZVxuIik7CisJICAgIGRyYmRfbmV3X2Rldl9zaXplKGRldmljZSwgbmJjLCBuYmMtPmRpc2tfY29uZi0+ZGlza19zaXplLCAwKSA8IG5iYy0+bWQubGFfc2l6ZV9zZWN0KSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJyZWZ1c2luZyB0byB0cnVuY2F0ZSBhIGNvbnNpc3RlbnQgZGV2aWNlXG4iKTsKIAkJcmV0Y29kZSA9IEVSUl9ESVNLX1RPT19TTUFMTDsKIAkJZ290byBmb3JjZV9kaXNrbGVzc19kZWM7CiAJfQpAQCAtMTYxNyw0MCArMTY0NCw0MCBAQAogCS8qIFJlc2V0IHRoZSAiYmFycmllcnMgZG9uJ3Qgd29yayIgYml0cyBoZXJlLCB0aGVuIGZvcmNlIG1ldGEgZGF0YSB0bwogCSAqIGJlIHdyaXR0ZW4sIHRvIGVuc3VyZSB3ZSBkZXRlcm1pbmUgaWYgYmFycmllcnMgYXJlIHN1cHBvcnRlZC4gKi8KIAlpZiAobmV3X2Rpc2tfY29uZi0+bWRfZmx1c2hlcykKLQkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJm1kZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KE1EX05PX0ZVQSwgJmRldmljZS0+ZmxhZ3MpOwogCWVsc2UKLQkJc2V0X2JpdChNRF9OT19GVUEsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoTURfTk9fRlVBLCAmZGV2aWNlLT5mbGFncyk7CiAKIAkvKiBQb2ludCBvZiBubyByZXR1cm4gcmVhY2hlZC4KIAkgKiBEZXZpY2VzIGFuZCBtZW1vcnkgYXJlIG5vIGxvbmdlciByZWxlYXNlZCBieSBlcnJvciBjbGVhbnVwIGJlbG93LgotCSAqIG5vdyBtZGV2IHRha2VzIG92ZXIgcmVzcG9uc2liaWxpdHksIGFuZCB0aGUgc3RhdGUgZW5naW5lIHNob3VsZAorCSAqIG5vdyBkZXZpY2UgdGFrZXMgb3ZlciByZXNwb25zaWJpbGl0eSwgYW5kIHRoZSBzdGF0ZSBlbmdpbmUgc2hvdWxkCiAJICogY2xlYW4gaXQgdXAgc29tZXdoZXJlLiAgKi8KLQlEX0FTU0VSVChtZGV2LT5sZGV2ID09IE5VTEwpOwotCW1kZXYtPmxkZXYgPSBuYmM7Ci0JbWRldi0+cmVzeW5jID0gcmVzeW5jX2xydTsKLQltZGV2LT5yc19wbGFuX3MgPSBuZXdfcGxhbjsKKwlEX0FTU0VSVChkZXZpY2UsIGRldmljZS0+bGRldiA9PSBOVUxMKTsKKwlkZXZpY2UtPmxkZXYgPSBuYmM7CisJZGV2aWNlLT5yZXN5bmMgPSByZXN5bmNfbHJ1OworCWRldmljZS0+cnNfcGxhbl9zID0gbmV3X3BsYW47CiAJbmJjID0gTlVMTDsKIAlyZXN5bmNfbHJ1ID0gTlVMTDsKIAluZXdfZGlza19jb25mID0gTlVMTDsKIAluZXdfcGxhbiA9IE5VTEw7CiAKLQlkcmJkX2J1bXBfd3JpdGVfb3JkZXJpbmcobWRldi0+dGNvbm4sIFdPX2JkZXZfZmx1c2gpOworCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBXT19iZGV2X2ZsdXNoKTsKIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQ1JBU0hFRF9QUklNQVJZKSkKLQkJc2V0X2JpdChDUkFTSEVEX1BSSU1BUlksICZtZGV2LT5mbGFncyk7CisJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NSQVNIRURfUFJJTUFSWSkpCisJCXNldF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncyk7CiAJZWxzZQotCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX1BSSU1BUllfSU5EKSAmJgotCSAgICAhKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG1kZXYtPnRjb25uLT5zdXNwX25vZCkpCi0JCXNldF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpOworCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QUklNQVJZX0lORCkgJiYKKwkgICAgIShkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIGRldmljZS0+cmVzb3VyY2UtPnN1c3Bfbm9kKSkKKwkJc2V0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKTsKIAotCW1kZXYtPnNlbmRfY250ID0gMDsKLQltZGV2LT5yZWN2X2NudCA9IDA7Ci0JbWRldi0+cmVhZF9jbnQgPSAwOwotCW1kZXYtPndyaXRfY250ID0gMDsKKwlkZXZpY2UtPnNlbmRfY250ID0gMDsKKwlkZXZpY2UtPnJlY3ZfY250ID0gMDsKKwlkZXZpY2UtPnJlYWRfY250ID0gMDsKKwlkZXZpY2UtPndyaXRfY250ID0gMDsKIAotCWRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUobWRldik7CisJZHJiZF9yZWNvbnNpZGVyX21heF9iaW9fc2l6ZShkZXZpY2UpOwogCiAJLyogSWYgSSBhbSBjdXJyZW50bHkgbm90IFJfUFJJTUFSWSwKIAkgKiBidXQgbWV0YSBkYXRhIHByaW1hcnkgaW5kaWNhdG9yIGlzIHNldCwKQEAgLTE2NjYsNTAgKzE2OTMsNTAgQEAKIAkgKiBzbyB3ZSBjYW4gYXV0b21hdGljYWxseSByZWNvdmVyIGZyb20gYSBjcmFzaCBvZiBhCiAJICogZGVncmFkZWQgYnV0IGFjdGl2ZSAiY2x1c3RlciIgYWZ0ZXIgYSBjZXJ0YWluIHRpbWVvdXQuCiAJICovCi0JY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOwotCWlmIChtZGV2LT5zdGF0ZS5yb2xlICE9IFJfUFJJTUFSWSAmJgotCSAgICAgZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX1BSSU1BUllfSU5EKSAmJgotCSAgICAhZHJiZF9tZF90ZXN0X2ZsYWcobWRldi0+bGRldiwgTURGX0NPTk5FQ1RFRF9JTkQpKQotCQlzZXRfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChVU0VfREVHUl9XRkNfVCwgJmRldmljZS0+ZmxhZ3MpOworCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgIT0gUl9QUklNQVJZICYmCisJICAgICBkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QUklNQVJZX0lORCkgJiYKKwkgICAgIWRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NPTk5FQ1RFRF9JTkQpKQorCQlzZXRfYml0KFVTRV9ERUdSX1dGQ19ULCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIDAsIE5VTEwpOworCWRkID0gZHJiZF9kZXRlcm1pbmVfZGV2X3NpemUoZGV2aWNlLCAwLCBOVUxMKTsKIAlpZiAoZGQgPD0gRFNfRVJST1IpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTV9CSVRNQVA7CiAJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCX0gZWxzZSBpZiAoZGQgPT0gRFNfR1JFVykKLQkJc2V0X2JpdChSRVNZTkNfQUZURVJfTkVHLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZkZXZpY2UtPmZsYWdzKTsKIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfRlVMTF9TWU5DKSB8fAotCSAgICAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpICYmCi0JICAgICBkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQUxfRElTQUJMRUQpKSkgewotCQlkZXZfaW5mbyhERVYsICJBc3N1bWluZyB0aGF0IGFsbCBibG9ja3MgYXJlIG91dCBvZiBzeW5jICIKKwlpZiAoZHJiZF9tZF90ZXN0X2ZsYWcoZGV2aWNlLT5sZGV2LCBNREZfRlVMTF9TWU5DKSB8fAorCSAgICAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmZGV2aWNlLT5mbGFncykgJiYKKwkgICAgIGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0FMX0RJU0FCTEVEKSkpIHsKKwkJZHJiZF9pbmZvKGRldmljZSwgIkFzc3VtaW5nIHRoYXQgYWxsIGJsb2NrcyBhcmUgb3V0IG9mIHN5bmMgIgogCQkgICAgICIoYWthIEZ1bGxTeW5jKVxuIik7Ci0JCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAorCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAogCQkJInNldF9uX3dyaXRlIGZyb20gYXR0YWNoaW5nIiwgQk1fTE9DS0VEX01BU0spKSB7CiAJCQlyZXRjb2RlID0gRVJSX0lPX01EX0RJU0s7CiAJCQlnb3RvIGZvcmNlX2Rpc2tsZXNzX2RlYzsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibV9yZWFkLAorCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibV9yZWFkLAogCQkJInJlYWQgZnJvbSBhdHRhY2hpbmciLCBCTV9MT0NLRURfTUFTSykpIHsKIAkJCXJldGNvZGUgPSBFUlJfSU9fTURfRElTSzsKIAkJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCQl9CiAJfQogCi0JaWYgKF9kcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA9PSBkcmJkX2JtX2JpdHMobWRldikpCi0JCWRyYmRfc3VzcGVuZF9hbChtZGV2KTsgLyogSU8gaXMgc3RpbGwgc3VzcGVuZGVkIGhlcmUuLi4gKi8KKwlpZiAoX2RyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgPT0gZHJiZF9ibV9iaXRzKGRldmljZSkpCisJCWRyYmRfc3VzcGVuZF9hbChkZXZpY2UpOyAvKiBJTyBpcyBzdGlsbCBzdXNwZW5kZWQgaGVyZS4uLiAqLwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAlucyA9IG9zOwogCS8qIElmIE1ERl9DT05TSVNURU5UIGlzIG5vdCBzZXQgZ28gaW50byBpbmNvbnNpc3RlbnQgc3RhdGUsCiAJICAgb3RoZXJ3aXNlIGludmVzdGlnYXRlIE1ERl9XYXNVcFRvRGF0ZS4uLgogCSAgIElmIE1ERl9XQVNfVVBfVE9fREFURSBpcyBub3Qgc2V0IGdvIGludG8gRF9PVVREQVRFRCBkaXNrIHN0YXRlLAogCSAgIG90aGVyd2lzZSBpbnRvIERfQ09OU0lTVEVOVCBzdGF0ZS4KIAkqLwotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfQ09OU0lTVEVOVCkpIHsKLQkJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKG1kZXYtPmxkZXYsIE1ERl9XQVNfVVBfVE9fREFURSkpCisJaWYgKGRyYmRfbWRfdGVzdF9mbGFnKGRldmljZS0+bGRldiwgTURGX0NPTlNJU1RFTlQpKSB7CisJCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9XQVNfVVBfVE9fREFURSkpCiAJCQlucy5kaXNrID0gRF9DT05TSVNURU5UOwogCQllbHNlCiAJCQlucy5kaXNrID0gRF9PVVREQVRFRDsKQEAgLTE3MTcsMTIgKzE3NDQsMTIgQEAKIAkJbnMuZGlzayA9IERfSU5DT05TSVNURU5UOwogCX0KIAotCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhtZGV2LT5sZGV2LCBNREZfUEVFUl9PVVRfREFURUQpKQorCWlmIChkcmJkX21kX3Rlc3RfZmxhZyhkZXZpY2UtPmxkZXYsIE1ERl9QRUVSX09VVF9EQVRFRCkpCiAJCW5zLnBkc2sgPSBEX09VVERBVEVEOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChucy5kaXNrID09IERfQ09OU0lTVEVOVCAmJgotCSAgICAobnMucGRzayA9PSBEX09VVERBVEVEIHx8IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nID09IEZQX0RPTlRfQ0FSRSkpCisJICAgIChucy5wZHNrID09IERfT1VUREFURUQgfHwgcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZyA9PSBGUF9ET05UX0NBUkUpKQogCQlucy5kaXNrID0gRF9VUF9UT19EQVRFOwogCiAJLyogQWxsIHRlc3RzIG9uIE1ERl9QUklNQVJZX0lORCwgTURGX0NPTk5FQ1RFRF9JTkQsCkBAIC0xNzMwLDU2ICsxNzU3LDU2IEBACiAJICAgdGhpcyBwb2ludCwgYmVjYXVzZSBkcmJkX3JlcXVlc3Rfc3RhdGUoKSBtb2RpZmllcyB0aGVzZQogCSAgIGZsYWdzLiAqLwogCi0JaWYgKHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzKQotCQltZGV2LT5sZGV2LT5tZC5mbGFncyAmPSB+TURGX0FMX0RJU0FCTEVEOworCWlmIChyY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5hbF91cGRhdGVzKQorCQlkZXZpY2UtPmxkZXYtPm1kLmZsYWdzICY9IH5NREZfQUxfRElTQUJMRUQ7CiAJZWxzZQotCQltZGV2LT5sZGV2LT5tZC5mbGFncyB8PSBNREZfQUxfRElTQUJMRUQ7CisJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgfD0gTURGX0FMX0RJU0FCTEVEOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBJbiBjYXNlIHdlIGFyZSBDX0NPTk5FQ1RFRCBwb3N0cG9uZSBhbnkgZGVjaXNpb24gb24gdGhlIG5ldyBkaXNrCiAJICAgc3RhdGUgYWZ0ZXIgdGhlIG5lZ290aWF0aW9uIHBoYXNlLiAqLwotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEKSB7Ci0JCW1kZXYtPm5ld19zdGF0ZV90bXAuaSA9IG5zLmk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCkgeworCQlkZXZpY2UtPm5ld19zdGF0ZV90bXAuaSA9IG5zLmk7CiAJCW5zLmkgPSBvcy5pOwogCQlucy5kaXNrID0gRF9ORUdPVElBVElORzsKIAogCQkvKiBXZSBleHBlY3QgdG8gcmVjZWl2ZSB1cC10by1kYXRlIFVVSURzIHNvb24uCiAJCSAgIFRvIGF2b2lkIGEgcmFjZSBpbiByZWNlaXZlX3N0YXRlLCBmcmVlIHBfdXVpZCB3aGlsZQogCQkgICBob2xkaW5nIHJlcV9sb2NrLiBJLmUuIGF0b21pYyB3aXRoIHRoZSBzdGF0ZSBjaGFuZ2UgKi8KLQkJa2ZyZWUobWRldi0+cF91dWlkKTsKLQkJbWRldi0+cF91dWlkID0gTlVMTDsKKwkJa2ZyZWUoZGV2aWNlLT5wX3V1aWQpOworCQlkZXZpY2UtPnBfdXVpZCA9IE5VTEw7CiAJfQogCi0JcnYgPSBfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlydiA9IF9kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBDU19WRVJCT1NFLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCWdvdG8gZm9yY2VfZGlza2xlc3NfZGVjOwogCi0JbW9kX3RpbWVyKCZtZGV2LT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOwogCi0JaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQotCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdIHw9ICAodTY0KTE7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpCisJCWRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSB8PSAgKHU2NCkxOwogCWVsc2UKLQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmPSB+KHU2NCkxOworCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJj0gfih1NjQpMTsKIAotCWRyYmRfbWRfbWFya19kaXJ0eShtZGV2KTsKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9tYXJrX2RpcnR5KGRldmljZSk7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKLQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRldi0+dmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7Ci0JcHV0X2xkZXYobWRldik7Ci0JY29ubl9yZWNvbmZpZ19kb25lKG1kZXYtPnRjb25uKTsKKwlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYoZGV2aWNlLT52ZGlzayktPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwlwdXRfbGRldihkZXZpY2UpOworCWNvbm5fcmVjb25maWdfZG9uZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiAKICBmb3JjZV9kaXNrbGVzc19kZWM6Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKICBmb3JjZV9kaXNrbGVzczoKLQlkcmJkX2ZvcmNlX3N0YXRlKG1kZXYsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRElTS0xFU1MpKTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKICBmYWlsOgotCWNvbm5fcmVjb25maWdfZG9uZShtZGV2LT50Y29ubik7CisJY29ubl9yZWNvbmZpZ19kb25lKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCWlmIChuYmMpIHsKIAkJaWYgKG5iYy0+YmFja2luZ19iZGV2KQogCQkJYmxrZGV2X3B1dChuYmMtPmJhY2tpbmdfYmRldiwKQEAgLTE3OTgsMjYgKzE4MjUsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZG1fZGV0YWNoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGludCBmb3JjZSkKK3N0YXRpYyBpbnQgYWRtX2RldGFjaChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IGZvcmNlKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiByZXRjb2RlOwogCWludCByZXQ7CiAKIAlpZiAoZm9yY2UpIHsKLQkJc2V0X2JpdChGT1JDRV9ERVRBQ0gsICZtZGV2LT5mbGFncyk7Ci0JCWRyYmRfZm9yY2Vfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKKwkJc2V0X2JpdChGT1JDRV9ERVRBQ0gsICZkZXZpY2UtPmZsYWdzKTsKKwkJZHJiZF9mb3JjZV9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRkFJTEVEKSk7CiAJCXJldGNvZGUgPSBTU19TVUNDRVNTOwogCQlnb3RvIG91dDsKIAl9CiAKLQlkcmJkX3N1c3BlbmRfaW8obWRldik7IC8qIHNvIG5vLW9uZSBpcyBzdHVjayBpbiBkcmJkX2FsX2JlZ2luX2lvICovCi0JZHJiZF9tZF9nZXRfYnVmZmVyKG1kZXYpOyAvKiBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gaW4tZmxpZ2h0IG1ldGEtZGF0YSBJTyAqLwotCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKLQlkcmJkX21kX3B1dF9idWZmZXIobWRldik7CisJZHJiZF9zdXNwZW5kX2lvKGRldmljZSk7IC8qIHNvIG5vLW9uZSBpcyBzdHVjayBpbiBkcmJkX2FsX2JlZ2luX2lvICovCisJZHJiZF9tZF9nZXRfYnVmZmVyKGRldmljZSk7IC8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBpbi1mbGlnaHQgbWV0YS1kYXRhIElPICovCisJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGRpc2ssIERfRkFJTEVEKSk7CisJZHJiZF9tZF9wdXRfYnVmZmVyKGRldmljZSk7CiAJLyogRF9GQUlMRUQgd2lsbCB0cmFuc2l0aW9uIHRvIERJU0tMRVNTLiAqLwotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShtZGV2LT5taXNjX3dhaXQsCi0JCQltZGV2LT5zdGF0ZS5kaXNrICE9IERfRkFJTEVEKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2aWNlLT5taXNjX3dhaXQsCisJCQlkZXZpY2UtPnN0YXRlLmRpc2sgIT0gRF9GQUlMRUQpOworCWRyYmRfcmVzdW1lX2lvKGRldmljZSk7CiAJaWYgKChpbnQpcmV0Y29kZSA9PSAoaW50KVNTX0lTX0RJU0tMRVNTKQogCQlyZXRjb2RlID0gU1NfTk9USElOR19UT19ETzsKIAlpZiAocmV0KQpAQCAtMTg1MiwyNCArMTg3OSwyNSBAQAogCQl9CiAJfQogCi0JcmV0Y29kZSA9IGFkbV9kZXRhY2goYWRtX2N0eC5tZGV2LCBwYXJtcy5mb3JjZV9kZXRhY2gpOworCXJldGNvZGUgPSBhZG1fZGV0YWNoKGFkbV9jdHguZGV2aWNlLCBwYXJtcy5mb3JjZV9kZXRhY2gpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgY29ubl9yZXN5bmNfcnVubmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgYm9vbCBjb25uX3Jlc3luY19ydW5uaW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJYm9vbCBydiA9IGZhbHNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAotCQkgICAgbWRldi0+c3RhdGUuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19TIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UKSB7CiAJCQlydiA9IHRydWU7CiAJCQlicmVhazsKIAkJfQpAQCAtMTg3OSwxNiArMTkwNywxNyBAQAogCXJldHVybiBydjsKIH0KIAotc3RhdGljIGJvb2wgY29ubl9vdl9ydW5uaW5nKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBib29sIGNvbm5fb3ZfcnVubmluZyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWJvb2wgcnYgPSBmYWxzZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fAorCQkgICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpIHsKIAkJCXJ2ID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xODk5LDYzICsxOTI4LDY1IEBACiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUKLV9jaGVja19uZXRfb3B0aW9ucyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmYsIHN0cnVjdCBuZXRfY29uZiAqbmV3X2NvbmYpCitfY2hlY2tfbmV0X29wdGlvbnMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCBpOwogCi0JaWYgKG9sZF9jb25mICYmIHRjb25uLT5jc3RhdGUgPT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKLQkJaWYgKG5ld19jb25mLT53aXJlX3Byb3RvY29sICE9IG9sZF9jb25mLT53aXJlX3Byb3RvY29sKQorCWlmIChvbGRfbmV0X2NvbmYgJiYgY29ubmVjdGlvbi0+Y3N0YXRlID09IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKKwkJaWYgKG5ld19uZXRfY29uZi0+d2lyZV9wcm90b2NvbCAhPSBvbGRfbmV0X2NvbmYtPndpcmVfcHJvdG9jb2wpCiAJCQlyZXR1cm4gRVJSX05FRURfQVBWXzEwMDsKIAotCQlpZiAobmV3X2NvbmYtPnR3b19wcmltYXJpZXMgIT0gb2xkX2NvbmYtPnR3b19wcmltYXJpZXMpCisJCWlmIChuZXdfbmV0X2NvbmYtPnR3b19wcmltYXJpZXMgIT0gb2xkX25ldF9jb25mLT50d29fcHJpbWFyaWVzKQogCQkJcmV0dXJuIEVSUl9ORUVEX0FQVl8xMDA7CiAKLQkJaWYgKHN0cmNtcChuZXdfY29uZi0+aW50ZWdyaXR5X2FsZywgb2xkX2NvbmYtPmludGVncml0eV9hbGcpKQorCQlpZiAoc3RyY21wKG5ld19uZXRfY29uZi0+aW50ZWdyaXR5X2FsZywgb2xkX25ldF9jb25mLT5pbnRlZ3JpdHlfYWxnKSkKIAkJCXJldHVybiBFUlJfTkVFRF9BUFZfMTAwOwogCX0KIAotCWlmICghbmV3X2NvbmYtPnR3b19wcmltYXJpZXMgJiYKLQkgICAgY29ubl9oaWdoZXN0X3JvbGUodGNvbm4pID09IFJfUFJJTUFSWSAmJgotCSAgICBjb25uX2hpZ2hlc3RfcGVlcih0Y29ubikgPT0gUl9QUklNQVJZKQorCWlmICghbmV3X25ldF9jb25mLT50d29fcHJpbWFyaWVzICYmCisJICAgIGNvbm5faGlnaGVzdF9yb2xlKGNvbm5lY3Rpb24pID09IFJfUFJJTUFSWSAmJgorCSAgICBjb25uX2hpZ2hlc3RfcGVlcihjb25uZWN0aW9uKSA9PSBSX1BSSU1BUlkpCiAJCXJldHVybiBFUlJfTkVFRF9BTExPV19UV09fUFJJOwogCi0JaWYgKG5ld19jb25mLT50d29fcHJpbWFyaWVzICYmCi0JICAgIChuZXdfY29uZi0+d2lyZV9wcm90b2NvbCAhPSBEUkJEX1BST1RfQykpCisJaWYgKG5ld19uZXRfY29uZi0+dHdvX3ByaW1hcmllcyAmJgorCSAgICAobmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9DKSkKIAkJcmV0dXJuIEVSUl9OT1RfUFJPVE9fQzsKIAotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIGkpIHsKLQkJaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCQllbnVtIGRyYmRfZmVuY2luZ19wIGZwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmc7Ci0JCQlwdXRfbGRldihtZGV2KTsKLQkJCWlmIChuZXdfY29uZi0+d2lyZV9wcm90b2NvbCA9PSBEUkJEX1BST1RfQSAmJiBmcCA9PSBGUF9TVE9OSVRIKQorCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgaSkgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCQllbnVtIGRyYmRfZmVuY2luZ19wIGZwID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZmVuY2luZzsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQlpZiAobmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sID09IERSQkRfUFJPVF9BICYmIGZwID09IEZQX1NUT05JVEgpCiAJCQkJcmV0dXJuIEVSUl9TVE9OSVRIX0FORF9QUk9UX0E7CiAJCX0KLQkJaWYgKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG5ld19jb25mLT5kaXNjYXJkX215X2RhdGEpCisJCWlmIChkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmIG5ld19uZXRfY29uZi0+ZGlzY2FyZF9teV9kYXRhKQogCQkJcmV0dXJuIEVSUl9ESVNDQVJEX0lNUE9TU0lCTEU7CiAJfQogCi0JaWYgKG5ld19jb25mLT5vbl9jb25nZXN0aW9uICE9IE9DX0JMT0NLICYmIG5ld19jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9BKQorCWlmIChuZXdfbmV0X2NvbmYtPm9uX2Nvbmdlc3Rpb24gIT0gT0NfQkxPQ0sgJiYgbmV3X25ldF9jb25mLT53aXJlX3Byb3RvY29sICE9IERSQkRfUFJPVF9BKQogCQlyZXR1cm4gRVJSX0NPTkdfTk9UX1BST1RPX0E7CiAKIAlyZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUKLWNoZWNrX25ldF9vcHRpb25zKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IG5ldF9jb25mICpuZXdfY29uZikKK2NoZWNrX25ldF9vcHRpb25zKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewogCXN0YXRpYyBlbnVtIGRyYmRfcmV0X2NvZGUgcnY7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IGk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcnYgPSBfY2hlY2tfbmV0X29wdGlvbnModGNvbm4sIHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpLCBuZXdfY29uZik7CisJcnYgPSBfY2hlY2tfbmV0X29wdGlvbnMoY29ubmVjdGlvbiwgcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKSwgbmV3X25ldF9jb25mKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCS8qIHRjb25uLT52b2x1bWVzIHByb3RlY3RlZCBieSBnZW5sX2xvY2soKSBoZXJlICovCi0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlpZiAoIW1kZXYtPmJpdG1hcCkgewotCQkJaWYoZHJiZF9ibV9pbml0KG1kZXYpKQorCS8qIGNvbm5lY3Rpb24tPnZvbHVtZXMgcHJvdGVjdGVkIGJ5IGdlbmxfbG9jaygpIGhlcmUgKi8KKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIGkpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoIWRldmljZS0+Yml0bWFwKSB7CisJCQlpZiAoZHJiZF9ibV9pbml0KGRldmljZSkpCiAJCQkJcmV0dXJuIEVSUl9OT01FTTsKIAkJfQogCX0KQEAgLTE5ODYsMjYgKzIwMTcsMjYgQEAKIH0KIAogc3RhdGljIGVudW0gZHJiZF9yZXRfY29kZQotYWxsb2NfY3J5cHRvKHN0cnVjdCBjcnlwdG8gKmNyeXB0bywgc3RydWN0IG5ldF9jb25mICpuZXdfY29uZikKK2FsbG9jX2NyeXB0byhzdHJ1Y3QgY3J5cHRvICpjcnlwdG8sIHN0cnVjdCBuZXRfY29uZiAqbmV3X25ldF9jb25mKQogewogCWNoYXIgaG1hY19uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwogCWVudW0gZHJiZF9yZXRfY29kZSBydjsKIAotCXJ2ID0gYWxsb2NfaGFzaCgmY3J5cHRvLT5jc3Vtc190Zm0sIG5ld19jb25mLT5jc3Vtc19hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmNzdW1zX3RmbSwgbmV3X25ldF9jb25mLT5jc3Vtc19hbGcsCiAJCSAgICAgICBFUlJfQ1NVTVNfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlydiA9IGFsbG9jX2hhc2goJmNyeXB0by0+dmVyaWZ5X3RmbSwgbmV3X2NvbmYtPnZlcmlmeV9hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPnZlcmlmeV90Zm0sIG5ld19uZXRfY29uZi0+dmVyaWZ5X2FsZywKIAkJICAgICAgIEVSUl9WRVJJRllfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlydiA9IGFsbG9jX2hhc2goJmNyeXB0by0+aW50ZWdyaXR5X3RmbSwgbmV3X2NvbmYtPmludGVncml0eV9hbGcsCisJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmludGVncml0eV90Zm0sIG5ld19uZXRfY29uZi0+aW50ZWdyaXR5X2FsZywKIAkJICAgICAgIEVSUl9JTlRFR1JJVFlfQUxHKTsKIAlpZiAocnYgIT0gTk9fRVJST1IpCiAJCXJldHVybiBydjsKLQlpZiAobmV3X2NvbmYtPmNyYW1faG1hY19hbGdbMF0gIT0gMCkgeworCWlmIChuZXdfbmV0X2NvbmYtPmNyYW1faG1hY19hbGdbMF0gIT0gMCkgewogCQlzbnByaW50ZihobWFjX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUsICJobWFjKCVzKSIsCi0JCQkgbmV3X2NvbmYtPmNyYW1faG1hY19hbGcpOworCQkJIG5ld19uZXRfY29uZi0+Y3JhbV9obWFjX2FsZyk7CiAKIAkJcnYgPSBhbGxvY19oYXNoKCZjcnlwdG8tPmNyYW1faG1hY190Zm0sIGhtYWNfbmFtZSwKIAkJCSAgICAgICBFUlJfQVVUSF9BTEcpOwpAQCAtMjAyNSw4ICsyMDU2LDggQEAKIGludCBkcmJkX2FkbV9uZXRfb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKLQlzdHJ1Y3QgbmV0X2NvbmYgKm9sZF9jb25mLCAqbmV3X2NvbmYgPSBOVUxMOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsICpuZXdfbmV0X2NvbmYgPSBOVUxMOwogCWludCBlcnI7CiAJaW50IG92cjsgLyogb25saW5lIHZlcmlmeSBydW5uaW5nICovCiAJaW50IHJzcjsgLyogcmUtc3luYyBydW5uaW5nICovCkBAIC0yMDM4LDk4ICsyMDY5LDEwMyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCXRjb25uID0gYWRtX2N0eC50Y29ubjsKKwljb25uZWN0aW9uID0gYWRtX2N0eC5jb25uZWN0aW9uOwogCi0JbmV3X2NvbmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2NvbmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19jb25mKSB7CisJbmV3X25ldF9jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCi0JY29ubl9yZWNvbmZpZ19zdGFydCh0Y29ubik7CisJY29ubl9yZWNvbmZpZ19zdGFydChjb25uZWN0aW9uKTsKIAotCW11dGV4X2xvY2soJnRjb25uLT5kYXRhLm11dGV4KTsKLQltdXRleF9sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9jb25mID0gdGNvbm4tPm5ldF9jb25mOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJb2xkX25ldF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CiAKLQlpZiAoIW9sZF9jb25mKSB7CisJaWYgKCFvbGRfbmV0X2NvbmYpIHsKIAkJZHJiZF9tc2dfcHV0X2luZm8oIm5ldCBjb25mIG1pc3NpbmcsIHRyeSBjb25uZWN0Iik7CiAJCXJldGNvZGUgPSBFUlJfSU5WQUxJRF9SRVFVRVNUOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JKm5ld19jb25mID0gKm9sZF9jb25mOworCSpuZXdfbmV0X2NvbmYgPSAqb2xkX25ldF9jb25mOwogCWlmIChzaG91bGRfc2V0X2RlZmF1bHRzKGluZm8pKQotCQlzZXRfbmV0X2NvbmZfZGVmYXVsdHMobmV3X2NvbmYpOworCQlzZXRfbmV0X2NvbmZfZGVmYXVsdHMobmV3X25ldF9jb25mKTsKIAotCWVyciA9IG5ldF9jb25mX2Zyb21fYXR0cnNfZm9yX2NoYW5nZShuZXdfY29uZiwgaW5mbyk7CisJZXJyID0gbmV0X2NvbmZfZnJvbV9hdHRyc19mb3JfY2hhbmdlKG5ld19uZXRfY29uZiwgaW5mbyk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT01TRykgewogCQlyZXRjb2RlID0gRVJSX01BTkRBVE9SWV9UQUc7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKGZyb21fYXR0cnNfZXJyX3RvX3R4dChlcnIpKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyh0Y29ubiwgbmV3X2NvbmYpOworCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyhjb25uZWN0aW9uLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKIAkvKiByZS1zeW5jIHJ1bm5pbmcgKi8KLQlyc3IgPSBjb25uX3Jlc3luY19ydW5uaW5nKHRjb25uKTsKLQlpZiAocnNyICYmIHN0cmNtcChuZXdfY29uZi0+Y3N1bXNfYWxnLCBvbGRfY29uZi0+Y3N1bXNfYWxnKSkgeworCXJzciA9IGNvbm5fcmVzeW5jX3J1bm5pbmcoY29ubmVjdGlvbik7CisJaWYgKHJzciAmJiBzdHJjbXAobmV3X25ldF9jb25mLT5jc3Vtc19hbGcsIG9sZF9uZXRfY29uZi0+Y3N1bXNfYWxnKSkgewogCQlyZXRjb2RlID0gRVJSX0NTVU1TX1JFU1lOQ19SVU5OSU5HOwogCQlnb3RvIGZhaWw7CiAJfQogCiAJLyogb25saW5lIHZlcmlmeSBydW5uaW5nICovCi0Jb3ZyID0gY29ubl9vdl9ydW5uaW5nKHRjb25uKTsKLQlpZiAob3ZyICYmIHN0cmNtcChuZXdfY29uZi0+dmVyaWZ5X2FsZywgb2xkX2NvbmYtPnZlcmlmeV9hbGcpKSB7CisJb3ZyID0gY29ubl9vdl9ydW5uaW5nKGNvbm5lY3Rpb24pOworCWlmIChvdnIgJiYgc3RyY21wKG5ld19uZXRfY29uZi0+dmVyaWZ5X2FsZywgb2xkX25ldF9jb25mLT52ZXJpZnlfYWxnKSkgewogCQlyZXRjb2RlID0gRVJSX1ZFUklGWV9SVU5OSU5HOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmV0Y29kZSA9IGFsbG9jX2NyeXB0bygmY3J5cHRvLCBuZXdfY29uZik7CisJcmV0Y29kZSA9IGFsbG9jX2NyeXB0bygmY3J5cHRvLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQlyY3VfYXNzaWduX3BvaW50ZXIodGNvbm4tPm5ldF9jb25mLCBuZXdfY29uZik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5lY3Rpb24tPm5ldF9jb25mLCBuZXdfbmV0X2NvbmYpOwogCiAJaWYgKCFyc3IpIHsKLQkJY3J5cHRvX2ZyZWVfaGFzaCh0Y29ubi0+Y3N1bXNfdGZtKTsKLQkJdGNvbm4tPmNzdW1zX3RmbSA9IGNyeXB0by5jc3Vtc190Zm07CisJCWNyeXB0b19mcmVlX2hhc2goY29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwkJY29ubmVjdGlvbi0+Y3N1bXNfdGZtID0gY3J5cHRvLmNzdW1zX3RmbTsKIAkJY3J5cHRvLmNzdW1zX3RmbSA9IE5VTEw7CiAJfQogCWlmICghb3ZyKSB7Ci0JCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPnZlcmlmeV90Zm0pOwotCQl0Y29ubi0+dmVyaWZ5X3RmbSA9IGNyeXB0by52ZXJpZnlfdGZtOworCQljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPnZlcmlmeV90Zm0pOworCQljb25uZWN0aW9uLT52ZXJpZnlfdGZtID0gY3J5cHRvLnZlcmlmeV90Zm07CiAJCWNyeXB0by52ZXJpZnlfdGZtID0gTlVMTDsKIAl9CiAKLQljcnlwdG9fZnJlZV9oYXNoKHRjb25uLT5pbnRlZ3JpdHlfdGZtKTsKLQl0Y29ubi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOwotCWlmICh0Y29ubi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiB0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDEwMCkKLQkJLyogRG8gdGhpcyB3aXRob3V0IHRyeWluZyB0byB0YWtlIHRjb25uLT5kYXRhLm11dGV4IGFnYWluLiAgKi8KLQkJX19kcmJkX3NlbmRfcHJvdG9jb2wodGNvbm4sIFBfUFJPVE9DT0xfVVBEQVRFKTsKKwljcnlwdG9fZnJlZV9oYXNoKGNvbm5lY3Rpb24tPmludGVncml0eV90Zm0pOworCWNvbm5lY3Rpb24tPmludGVncml0eV90Zm0gPSBjcnlwdG8uaW50ZWdyaXR5X3RmbTsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBjb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gMTAwKQorCQkvKiBEbyB0aGlzIHdpdGhvdXQgdHJ5aW5nIHRvIHRha2UgY29ubmVjdGlvbi0+ZGF0YS5tdXRleCBhZ2Fpbi4gICovCisJCV9fZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24sIFBfUFJPVE9DT0xfVVBEQVRFKTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPmNyYW1faG1hY190Zm0pOwotCXRjb25uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtKTsKKwljb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CiAKLQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+ZGF0YS5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+ZGF0YS5tdXRleCk7CiAJc3luY2hyb25pemVfcmN1KCk7Ci0Ja2ZyZWUob2xkX2NvbmYpOworCWtmcmVlKG9sZF9uZXRfY29uZik7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCi0JCWRyYmRfc2VuZF9zeW5jX3BhcmFtKG1pbm9yX3RvX21kZXYoY29ubl9sb3dlc3RfbWlub3IodGNvbm4pKSk7CisJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCQlpbnQgdm5yOworCisJCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKQorCQkJZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOworCX0KIAogCWdvdG8gZG9uZTsKIAogIGZhaWw6Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOwogCWZyZWVfY3J5cHRvKCZjcnlwdG8pOwotCWtmcmVlKG5ld19jb25mKTsKKwlrZnJlZShuZXdfbmV0X2NvbmYpOwogIGRvbmU6Ci0JY29ubl9yZWNvbmZpZ19kb25lKHRjb25uKTsKKwljb25uX3JlY29uZmlnX2RvbmUoY29ubmVjdGlvbik7CiAgb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTIxMzcsMTAgKzIxNzMsMTEgQEAKIAogaW50IGRyYmRfYWRtX2Nvbm5lY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwotCXN0cnVjdCBuZXRfY29uZiAqb2xkX2NvbmYsICpuZXdfY29uZiA9IE5VTEw7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBuZXRfY29uZiAqb2xkX25ldF9jb25mLCAqbmV3X25ldF9jb25mID0gTlVMTDsKIAlzdHJ1Y3QgY3J5cHRvIGNyeXB0byA9IHsgfTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAJaW50IGk7CiAJaW50IGVycjsKQEAgLTIxNjAsMTA2ICsyMTk3LDExMSBAQAogCS8qIE5vIG5lZWQgZm9yIF9yY3UgaGVyZS4gQWxsIHJlY29uZmlndXJhdGlvbiBpcwogCSAqIHN0cmljdGx5IHNlcmlhbGl6ZWQgb24gZ2VubF9sb2NrKCkuIFdlIGFyZSBwcm90ZWN0ZWQgYWdhaW5zdAogCSAqIGNvbmN1cnJlbnQgcmVjb25maWd1cmF0aW9uL2FkZGl0aW9uL2RlbGV0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0Y29ubiwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA9PSB0Y29ubi0+bXlfYWRkcl9sZW4gJiYKLQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgJnRjb25uLT5teV9hZGRyLCB0Y29ubi0+bXlfYWRkcl9sZW4pKSB7Ci0JCQlyZXRjb2RlID0gRVJSX0xPQ0FMX0FERFI7Ci0JCQlnb3RvIG91dDsKLQkJfQorCWZvcl9lYWNoX3Jlc291cmNlKHJlc291cmNlLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5teV9hZGRyKSA9PSBjb25uZWN0aW9uLT5teV9hZGRyX2xlbiAmJgorCQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgJmNvbm5lY3Rpb24tPm15X2FkZHIsCisJCQkJICAgIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuKSkgeworCQkJCXJldGNvZGUgPSBFUlJfTE9DQUxfQUREUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAotCQlpZiAobmxhX2xlbihhZG1fY3R4LnBlZXJfYWRkcikgPT0gdGNvbm4tPnBlZXJfYWRkcl9sZW4gJiYKLQkJICAgICFtZW1jbXAobmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLCAmdGNvbm4tPnBlZXJfYWRkciwgdGNvbm4tPnBlZXJfYWRkcl9sZW4pKSB7Ci0JCQlyZXRjb2RlID0gRVJSX1BFRVJfQUREUjsKLQkJCWdvdG8gb3V0OworCQkJaWYgKG5sYV9sZW4oYWRtX2N0eC5wZWVyX2FkZHIpID09IGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gJiYKKwkJCSAgICAhbWVtY21wKG5sYV9kYXRhKGFkbV9jdHgucGVlcl9hZGRyKSwgJmNvbm5lY3Rpb24tPnBlZXJfYWRkciwKKwkJCQkgICAgY29ubmVjdGlvbi0+cGVlcl9hZGRyX2xlbikpIHsKKwkJCQlyZXRjb2RlID0gRVJSX1BFRVJfQUREUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCX0KIAotCXRjb25uID0gYWRtX2N0eC50Y29ubjsKLQljb25uX3JlY29uZmlnX3N0YXJ0KHRjb25uKTsKKwljb25uZWN0aW9uID0gZmlyc3RfY29ubmVjdGlvbihhZG1fY3R4LnJlc291cmNlKTsKKwljb25uX3JlY29uZmlnX3N0YXJ0KGNvbm5lY3Rpb24pOwogCi0JaWYgKHRjb25uLT5jc3RhdGUgPiBDX1NUQU5EQUxPTkUpIHsKKwlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID4gQ19TVEFOREFMT05FKSB7CiAJCXJldGNvZGUgPSBFUlJfTkVUX0NPTkZJR1VSRUQ7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiBhbGxvY2F0aW9uIG5vdCBpbiB0aGUgSU8gcGF0aCwgZHJiZHNldHVwIC8gbmV0bGluayBwcm9jZXNzIGNvbnRleHQgKi8KLQluZXdfY29uZiA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY29uZiksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X2NvbmYpIHsKKwluZXdfbmV0X2NvbmYgPSBremFsbG9jKHNpemVvZigqbmV3X25ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT01FTTsKIAkJZ290byBmYWlsOwogCX0KIAotCXNldF9uZXRfY29uZl9kZWZhdWx0cyhuZXdfY29uZik7CisJc2V0X25ldF9jb25mX2RlZmF1bHRzKG5ld19uZXRfY29uZik7CiAKLQllcnIgPSBuZXRfY29uZl9mcm9tX2F0dHJzKG5ld19jb25mLCBpbmZvKTsKKwllcnIgPSBuZXRfY29uZl9mcm9tX2F0dHJzKG5ld19uZXRfY29uZiwgaW5mbyk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT01TRykgewogCQlyZXRjb2RlID0gRVJSX01BTkRBVE9SWV9UQUc7CiAJCWRyYmRfbXNnX3B1dF9pbmZvKGZyb21fYXR0cnNfZXJyX3RvX3R4dChlcnIpKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyh0Y29ubiwgbmV3X2NvbmYpOworCXJldGNvZGUgPSBjaGVja19uZXRfb3B0aW9ucyhjb25uZWN0aW9uLCBuZXdfbmV0X2NvbmYpOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQlyZXRjb2RlID0gYWxsb2NfY3J5cHRvKCZjcnlwdG8sIG5ld19jb25mKTsKKwlyZXRjb2RlID0gYWxsb2NfY3J5cHRvKCZjcnlwdG8sIG5ld19uZXRfY29uZik7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gZmFpbDsKIAotCSgoY2hhciAqKW5ld19jb25mLT5zaGFyZWRfc2VjcmV0KVtTSEFSRURfU0VDUkVUX01BWC0xXSA9IDA7CisJKChjaGFyICopbmV3X25ldF9jb25mLT5zaGFyZWRfc2VjcmV0KVtTSEFSRURfU0VDUkVUX01BWC0xXSA9IDA7CiAKLQljb25uX2ZsdXNoX3dvcmtxdWV1ZSh0Y29ubik7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAotCW11dGV4X2xvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0Jb2xkX2NvbmYgPSB0Y29ubi0+bmV0X2NvbmY7Ci0JaWYgKG9sZF9jb25mKSB7CisJbXV0ZXhfbG9jaygmYWRtX2N0eC5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9uZXRfY29uZiA9IGNvbm5lY3Rpb24tPm5ldF9jb25mOworCWlmIChvbGRfbmV0X2NvbmYpIHsKIAkJcmV0Y29kZSA9IEVSUl9ORVRfQ09ORklHVVJFRDsKLQkJbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOworCQltdXRleF91bmxvY2soJmFkbV9jdHgucmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAkJZ290byBmYWlsOwogCX0KLQlyY3VfYXNzaWduX3BvaW50ZXIodGNvbm4tPm5ldF9jb25mLCBuZXdfY29uZik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5lY3Rpb24tPm5ldF9jb25mLCBuZXdfbmV0X2NvbmYpOwogCi0JY29ubl9mcmVlX2NyeXB0byh0Y29ubik7Ci0JdGNvbm4tPmNyYW1faG1hY190Zm0gPSBjcnlwdG8uY3JhbV9obWFjX3RmbTsKLQl0Y29ubi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOwotCXRjb25uLT5jc3Vtc190Zm0gPSBjcnlwdG8uY3N1bXNfdGZtOwotCXRjb25uLT52ZXJpZnlfdGZtID0gY3J5cHRvLnZlcmlmeV90Zm07CisJY29ubl9mcmVlX2NyeXB0byhjb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtID0gY3J5cHRvLmNyYW1faG1hY190Zm07CisJY29ubmVjdGlvbi0+aW50ZWdyaXR5X3RmbSA9IGNyeXB0by5pbnRlZ3JpdHlfdGZtOworCWNvbm5lY3Rpb24tPmNzdW1zX3RmbSA9IGNyeXB0by5jc3Vtc190Zm07CisJY29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IGNyeXB0by52ZXJpZnlfdGZtOwogCi0JdGNvbm4tPm15X2FkZHJfbGVuID0gbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpOwotCW1lbWNweSgmdGNvbm4tPm15X2FkZHIsIG5sYV9kYXRhKGFkbV9jdHgubXlfYWRkciksIHRjb25uLT5teV9hZGRyX2xlbik7Ci0JdGNvbm4tPnBlZXJfYWRkcl9sZW4gPSBubGFfbGVuKGFkbV9jdHgucGVlcl9hZGRyKTsKLQltZW1jcHkoJnRjb25uLT5wZWVyX2FkZHIsIG5sYV9kYXRhKGFkbV9jdHgucGVlcl9hZGRyKSwgdGNvbm4tPnBlZXJfYWRkcl9sZW4pOworCWNvbm5lY3Rpb24tPm15X2FkZHJfbGVuID0gbmxhX2xlbihhZG1fY3R4Lm15X2FkZHIpOworCW1lbWNweSgmY29ubmVjdGlvbi0+bXlfYWRkciwgbmxhX2RhdGEoYWRtX2N0eC5teV9hZGRyKSwgY29ubmVjdGlvbi0+bXlfYWRkcl9sZW4pOworCWNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gPSBubGFfbGVuKGFkbV9jdHgucGVlcl9hZGRyKTsKKwltZW1jcHkoJmNvbm5lY3Rpb24tPnBlZXJfYWRkciwgbmxhX2RhdGEoYWRtX2N0eC5wZWVyX2FkZHIpLCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuKTsKIAotCW11dGV4X3VubG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmFkbV9jdHgucmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCBpKSB7Ci0JCW1kZXYtPnNlbmRfY250ID0gMDsKLQkJbWRldi0+cmVjdl9jbnQgPSAwOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgaSkgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWRldmljZS0+c2VuZF9jbnQgPSAwOworCQlkZXZpY2UtPnJlY3ZfY250ID0gMDsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXRjb2RlID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX1VOQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CisJcmV0Y29kZSA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1VOQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CiAKLQljb25uX3JlY29uZmlnX2RvbmUodGNvbm4pOworCWNvbm5fcmVjb25maWdfZG9uZShjb25uZWN0aW9uKTsKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiAKIGZhaWw6CiAJZnJlZV9jcnlwdG8oJmNyeXB0byk7Ci0Ja2ZyZWUobmV3X2NvbmYpOworCWtmcmVlKG5ld19uZXRfY29uZik7CiAKLQljb25uX3JlY29uZmlnX2RvbmUodGNvbm4pOworCWNvbm5fcmVjb25maWdfZG9uZShjb25uZWN0aW9uKTsKIG91dDoKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgY29ubl90cnlfZGlzY29ubmVjdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGJvb2wgZm9yY2UpCitzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2IGNvbm5fdHJ5X2Rpc2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgYm9vbCBmb3JjZSkKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAKLQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwKKwlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLAogCQkJZm9yY2UgPyBDU19IQVJEIDogMCk7CiAKIAlzd2l0Y2ggKHJ2KSB7CkBAIC0yMjY5LDE4ICsyMzExLDE4IEBACiAJCXJldHVybiBTU19TVUNDRVNTOwogCWNhc2UgU1NfUFJJTUFSWV9OT1A6CiAJCS8qIE91ciBzdGF0ZSBjaGVja2luZyBjb2RlIHdhbnRzIHRvIHNlZSB0aGUgcGVlciBvdXRkYXRlZC4gKi8KLQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsIHBkc2ssIERfT1VUREFURUQpLCAwKTsKKwkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMyKGNvbm4sIENfRElTQ09OTkVDVElORywgcGRzaywgRF9PVVREQVRFRCksIDApOwogCiAJCWlmIChydiA9PSBTU19PVVREQVRFX1dPX0NPTk4pIC8qIGxvc3QgY29ubmVjdGlvbiBiZWZvcmUgZ3JhY2VmdWwgZGlzY29ubmVjdCBzdWNjZWVkZWQgKi8KLQkJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19WRVJCT1NFKTsKKwkJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX1ZFUkJPU0UpOwogCiAJCWJyZWFrOwogCWNhc2UgU1NfQ1dfRkFJTEVEX0JZX1BFRVI6CiAJCS8qIFRoZSBwZWVyIHByb2JhYmx5IHdhbnRzIHRvIHNlZSB1cyBvdXRkYXRlZC4gKi8KLQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsCisJCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TMihjb25uLCBDX0RJU0NPTk5FQ1RJTkcsCiAJCQkJCQkJZGlzaywgRF9PVVREQVRFRCksIDApOwogCQlpZiAocnYgPT0gU1NfSVNfRElTS0xFU1MgfHwgcnYgPT0gU1NfTE9XRVJfVEhBTl9PVVREQVRFRCkgewotCQkJcnYgPSBjb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksCisJCQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLAogCQkJCQlDU19IQVJEKTsKIAkJfQogCQlicmVhazsKQEAgLTIyOTQsMTggKzIzMzYsMTggQEAKIAkJICogVGhlIHN0YXRlIGhhbmRsaW5nIG9ubHkgdXNlcyBkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgpLAogCQkgKiB3ZSB3YW50IHRvIHJlYWxseSB3YWl0IGhlcmUgdW50aWwgdGhlIHJlY2VpdmVyIGlzIG5vIG1vcmUuCiAJCSAqLwotCQlkcmJkX3RocmVhZF9zdG9wKCZhZG1fY3R4LnRjb25uLT5yZWNlaXZlcik7CisJCWRyYmRfdGhyZWFkX3N0b3AoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKIAogCQkvKiBSYWNlIGJyZWFrZXIuICBUaGlzIGFkZGl0aW9uYWwgc3RhdGUgY2hhbmdlIHJlcXVlc3QgbWF5IGJlCiAJCSAqIG5lY2Vzc2FyeSwgaWYgdGhpcyB3YXMgYSBmb3JjZWQgZGlzY29ubmVjdCBkdXJpbmcgYSByZWNlaXZlcgogCQkgKiByZXN0YXJ0LiAgV2UgbWF5IGhhdmUgImtpbGxlZCIgdGhlIHJlY2VpdmVyIHRocmVhZCBqdXN0Ci0JCSAqIGFmdGVyIGRyYmRkX2luaXQoKSByZXR1cm5lZC4gIFR5cGljYWxseSwgd2Ugc2hvdWxkIGJlCisJCSAqIGFmdGVyIGRyYmRfcmVjZWl2ZXIoKSByZXR1cm5lZC4gIFR5cGljYWxseSwgd2Ugc2hvdWxkIGJlCiAJCSAqIENfU1RBTkRBTE9ORSBhbHJlYWR5LCBub3csIGFuZCB0aGlzIGJlY29tZXMgYSBuby1vcC4KIAkJICovCi0JCXJ2MiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19TVEFOREFMT05FKSwKKwkJcnYyID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksCiAJCQkJQ1NfVkVSQk9TRSB8IENTX0hBUkQpOwogCQlpZiAocnYyIDwgU1NfU1VDQ0VTUykKLQkJCWNvbm5fZXJyKHRjb25uLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwKIAkJCQkidW5leHBlY3RlZCBydjI9JWQgaW4gY29ubl90cnlfZGlzY29ubmVjdCgpXG4iLAogCQkJCXJ2Mik7CiAJfQpAQCAtMjMxNSw3ICsyMzU3LDcgQEAKIGludCBkcmJkX2FkbV9kaXNjb25uZWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRpc2Nvbm5lY3RfcGFybXMgcGFybXM7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwogCWludCBlcnI7CkBAIC0yMzI2LDcgKzIzNjgsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7CiAKLQl0Y29ubiA9IGFkbV9jdHgudGNvbm47CisJY29ubmVjdGlvbiA9IGFkbV9jdHguY29ubmVjdGlvbjsKIAltZW1zZXQoJnBhcm1zLCAwLCBzaXplb2YocGFybXMpKTsKIAlpZiAoaW5mby0+YXR0cnNbRFJCRF9OTEFfRElTQ09OTkVDVF9QQVJNU10pIHsKIAkJZXJyID0gZGlzY29ubmVjdF9wYXJtc19mcm9tX2F0dHJzKCZwYXJtcywgaW5mbyk7CkBAIC0yMzM3LDcgKzIzNzksNyBAQAogCQl9CiAJfQogCi0JcnYgPSBjb25uX3RyeV9kaXNjb25uZWN0KHRjb25uLCBwYXJtcy5mb3JjZV9kaXNjb25uZWN0KTsKKwlydiA9IGNvbm5fdHJ5X2Rpc2Nvbm5lY3QoY29ubmVjdGlvbiwgcGFybXMuZm9yY2VfZGlzY29ubmVjdCk7CiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKIAkJcmV0Y29kZSA9IHJ2OyAgLyogRklYTUU6IFR5cGUgbWlzbWF0Y2guICovCiAJZWxzZQpAQCAtMjM0NywyNyArMjM4OSwyNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCByZXN5bmNfYWZ0ZXJfb25saW5lX2dyb3coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IGlhc3M7IC8qIEkgYW0gc3luYyBzb3VyY2UgKi8KIAotCWRldl9pbmZvKERFViwgIlJlc3luYyBvZiBuZXcgc3RvcmFnZSBhZnRlciBvbmxpbmUgZ3Jvd1xuIik7Ci0JaWYgKG1kZXYtPnN0YXRlLnJvbGUgIT0gbWRldi0+c3RhdGUucGVlcikKLQkJaWFzcyA9IChtZGV2LT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSk7CisJZHJiZF9pbmZvKGRldmljZSwgIlJlc3luYyBvZiBuZXcgc3RvcmFnZSBhZnRlciBvbmxpbmUgZ3Jvd1xuIik7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSAhPSBkZXZpY2UtPnN0YXRlLnBlZXIpCisJCWlhc3MgPSAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSk7CiAJZWxzZQotCQlpYXNzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZtZGV2LT50Y29ubi0+ZmxhZ3MpOworCQlpYXNzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5mbGFncyk7CiAKIAlpZiAoaWFzcykKLQkJZHJiZF9zdGFydF9yZXN5bmMobWRldiwgQ19TWU5DX1NPVVJDRSk7CisJCWRyYmRfc3RhcnRfcmVzeW5jKGRldmljZSwgQ19TWU5DX1NPVVJDRSk7CiAJZWxzZQotCQlfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSArIENTX1NFUklBTElaRSk7CisJCV9kcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUyhjb25uLCBDX1dGX1NZTkNfVVVJRCksIENTX1ZFUkJPU0UgKyBDU19TRVJJQUxJWkUpOwogfQogCiBpbnQgZHJiZF9hZG1fcmVzaXplKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRpc2tfY29uZiAqb2xkX2Rpc2tfY29uZiwgKm5ld19kaXNrX2NvbmYgPSBOVUxMOwogCXN0cnVjdCByZXNpemVfcGFybXMgcnM7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKIAllbnVtIGRldGVybWluZV9kZXZfc2l6ZSBkZDsKIAlib29sIGNoYW5nZV9hbF9sYXlvdXQgPSBmYWxzZTsKQEAgLTIzODEsMTUgKzI0MjMsMTUgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBmYWlsOwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCXJldGNvZGUgPSBFUlJfTk9fRElTSzsKIAkJZ290byBmYWlsOwogCX0KIAogCW1lbXNldCgmcnMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzaXplX3Bhcm1zKSk7Ci0JcnMuYWxfc3RyaXBlcyA9IG1kZXYtPmxkZXYtPm1kLmFsX3N0cmlwZXM7Ci0JcnMuYWxfc3RyaXBlX3NpemUgPSBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAqIDQ7CisJcnMuYWxfc3RyaXBlcyA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlczsKKwlycy5hbF9zdHJpcGVfc2l6ZSA9IGRldmljZS0+bGRldi0+bWQuYWxfc3RyaXBlX3NpemVfNGsgKiA0OwogCWlmIChpbmZvLT5hdHRyc1tEUkJEX05MQV9SRVNJWkVfUEFSTVNdKSB7CiAJCWVyciA9IHJlc2l6ZV9wYXJtc19mcm9tX2F0dHJzKCZycywgaW5mbyk7CiAJCWlmIChlcnIpIHsKQEAgLTIzOTksMjQgKzI0NDEsMjQgQEAKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5jb25uID4gQ19DT05ORUNURUQpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID4gQ19DT05ORUNURUQpIHsKIAkJcmV0Y29kZSA9IEVSUl9SRVNJWkVfUkVTWU5DOwogCQlnb3RvIGZhaWxfbGRldjsKIAl9CiAKLQlpZiAobWRldi0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSAmJgotCSAgICBtZGV2LT5zdGF0ZS5wZWVyID09IFJfU0VDT05EQVJZKSB7CisJaWYgKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSAmJgorCSAgICBkZXZpY2UtPnN0YXRlLnBlZXIgPT0gUl9TRUNPTkRBUlkpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT19QUklNQVJZOwogCQlnb3RvIGZhaWxfbGRldjsKIAl9CiAKLQlpZiAocnMubm9fcmVzeW5jICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5MykgeworCWlmIChycy5ub19yZXN5bmMgJiYgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTMpIHsKIAkJcmV0Y29kZSA9IEVSUl9ORUVEX0FQVl85MzsKIAkJZ290byBmYWlsX2xkZXY7CiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwotCXVfc2l6ZSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CisJdV9zaXplID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+ZGlza19zaXplOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh1X3NpemUgIT0gKHNlY3Rvcl90KXJzLnJlc2l6ZV9zaXplKSB7CiAJCW5ld19kaXNrX2NvbmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza19jb25mKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNDI2LDggKzI0NjgsOCBAQAogCQl9CiAJfQogCi0JaWYgKG1kZXYtPmxkZXYtPm1kLmFsX3N0cmlwZXMgIT0gcnMuYWxfc3RyaXBlcyB8fAotCSAgICBtZGV2LT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAhPSBycy5hbF9zdHJpcGVfc2l6ZSAvIDQpIHsKKwlpZiAoZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVzICE9IHJzLmFsX3N0cmlwZXMgfHwKKwkgICAgZGV2aWNlLT5sZGV2LT5tZC5hbF9zdHJpcGVfc2l6ZV80ayAhPSBycy5hbF9zdHJpcGVfc2l6ZSAvIDQpIHsKIAkJdTMyIGFsX3NpemVfayA9IHJzLmFsX3N0cmlwZXMgKiBycy5hbF9zdHJpcGVfc2l6ZTsKIAogCQlpZiAoYWxfc2l6ZV9rID4gKDE2ICogMTAyNCAqIDEwMjQpKSB7CkBAIC0yNDQwLDcgKzI0ODIsNyBAQAogCQkJZ290byBmYWlsX2xkZXY7CiAJCX0KIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiAhPSBDX0NPTk5FQ1RFRCkgeworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uICE9IENfQ09OTkVDVEVEKSB7CiAJCQlyZXRjb2RlID0gRVJSX01EX0xBWU9VVF9DT05ORUNURUQ7CiAJCQlnb3RvIGZhaWxfbGRldjsKIAkJfQpAQCAtMjQ0OCwyNCArMjQ5MCwyNCBAQAogCQljaGFuZ2VfYWxfbGF5b3V0ID0gdHJ1ZTsKIAl9CiAKLQlpZiAobWRldi0+bGRldi0+a25vd25fc2l6ZSAhPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYpKQotCQltZGV2LT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplICE9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2KSkKKwkJZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCiAJaWYgKG5ld19kaXNrX2NvbmYpIHsKLQkJbXV0ZXhfbG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKLQkJb2xkX2Rpc2tfY29uZiA9IG1kZXYtPmxkZXYtPmRpc2tfY29uZjsKKwkJbXV0ZXhfbG9jaygmZGV2aWNlLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCQlvbGRfZGlza19jb25mID0gZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmY7CiAJCSpuZXdfZGlza19jb25mID0gKm9sZF9kaXNrX2NvbmY7CiAJCW5ld19kaXNrX2NvbmYtPmRpc2tfc2l6ZSA9IChzZWN0b3JfdClycy5yZXNpemVfc2l6ZTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG1kZXYtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7Ci0JCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlrZnJlZShvbGRfZGlza19jb25mKTsKIAl9CiAKIAlkZHNmID0gKHJzLnJlc2l6ZV9mb3JjZSA/IEREU0ZfRk9SQ0VEIDogMCkgfCAocnMubm9fcmVzeW5jID8gRERTRl9OT19SRVNZTkMgOiAwKTsKLQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIGRkc2YsIGNoYW5nZV9hbF9sYXlvdXQgPyAmcnMgOiBOVUxMKTsKLQlkcmJkX21kX3N5bmMobWRldik7Ci0JcHV0X2xkZXYobWRldik7CisJZGQgPSBkcmJkX2RldGVybWluZV9kZXZfc2l6ZShkZXZpY2UsIGRkc2YsIGNoYW5nZV9hbF9sYXlvdXQgPyAmcnMgOiBOVUxMKTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKKwlwdXRfbGRldihkZXZpY2UpOwogCWlmIChkZCA9PSBEU19FUlJPUikgewogCQlyZXRjb2RlID0gRVJSX05PTUVNX0JJVE1BUDsKIAkJZ290byBmYWlsOwpAQCAtMjQ3NywxMiArMjUxOSwxMiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEKSB7CiAJCWlmIChkZCA9PSBEU19HUkVXKQotCQkJc2V0X2JpdChSRVNJWkVfUEVORElORywgJm1kZXYtPmZsYWdzKTsKKwkJCXNldF9iaXQoUkVTSVpFX1BFTkRJTkcsICZkZXZpY2UtPmZsYWdzKTsKIAotCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9zaXplcyhtZGV2LCAxLCBkZHNmKTsKKwkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlkcmJkX3NlbmRfc2l6ZXMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgMSwgZGRzZik7CiAJfQogCiAgZmFpbDoKQEAgLTI0OTAsMTQgKzI1MzIsMTMgQEAKIAlyZXR1cm4gMDsKIAogIGZhaWxfbGRldjoKLQlwdXRfbGRldihtZGV2KTsKKwlwdXRfbGRldihkZXZpY2UpOwogCWdvdG8gZmFpbDsKIH0KIAogaW50IGRyYmRfYWRtX3Jlc291cmNlX29wdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CiAJc3RydWN0IHJlc19vcHRzIHJlc19vcHRzOwogCWludCBlcnI7CiAKQEAgLTI1MDYsOSArMjU0Nyw4IEBACiAJCXJldHVybiByZXRjb2RlOwogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIGZhaWw7Ci0JdGNvbm4gPSBhZG1fY3R4LnRjb25uOwogCi0JcmVzX29wdHMgPSB0Y29ubi0+cmVzX29wdHM7CisJcmVzX29wdHMgPSBhZG1fY3R4LnJlc291cmNlLT5yZXNfb3B0czsKIAlpZiAoc2hvdWxkX3NldF9kZWZhdWx0cyhpbmZvKSkKIAkJc2V0X3Jlc19vcHRzX2RlZmF1bHRzKCZyZXNfb3B0cyk7CiAKQEAgLTI1MTksNyArMjU1OSw3IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQllcnIgPSBzZXRfcmVzb3VyY2Vfb3B0aW9ucyh0Y29ubiwgJnJlc19vcHRzKTsKKwllcnIgPSBzZXRfcmVzb3VyY2Vfb3B0aW9ucyhhZG1fY3R4LnJlc291cmNlLCAmcmVzX29wdHMpOwogCWlmIChlcnIpIHsKIAkJcmV0Y29kZSA9IEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJCWlmIChlcnIgPT0gLUVOT01FTSkKQEAgLTI1MzMsNyArMjU3Myw3IEBACiAKIGludCBkcmJkX2FkbV9pbnZhbGlkYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlpbnQgcmV0Y29kZTsgLyogZW51bSBkcmJkX3JldF9jb2RlIHJzcC4gZW51bSBkcmJkX3N0YXRlX3J2ICovCiAKIAlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIERSQkRfQURNX05FRURfTUlOT1IpOwpAQCAtMjU0MiwyOSArMjU4MiwyOSBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiBJZiB0aGVyZSBpcyBzdGlsbCBiaXRtYXAgSU8gcGVuZGluZywgcHJvYmFibHkgYmVjYXVzZSBvZiBhIHByZXZpb3VzCiAJICogcmVzeW5jIGp1c3QgYmVpbmcgZmluaXNoZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSByZXF1ZXN0aW5nIGEgbmV3IHJlc3luYy4KIAkgKiBBbHNvIHdhaXQgZm9yIGl0J3MgYWZ0ZXJfc3RhdGVfY2goKS4gKi8KLQlkcmJkX3N1c3BlbmRfaW8obWRldik7Ci0Jd2FpdF9ldmVudChtZGV2LT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZtZGV2LT5mbGFncykpOwotCWRyYmRfZmx1c2hfd29ya3F1ZXVlKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJZHJiZF9mbHVzaF93b3JrcXVldWUoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAogCS8qIElmIHdlIGhhcHBlbiB0byBiZSBDX1NUQU5EQUxPTkUgUl9TRUNPTkRBUlksIGp1c3QgY2hhbmdlIHRvCiAJICogRF9JTkNPTlNJU1RFTlQsIGFuZCBzZXQgYWxsIGJpdHMgaW4gdGhlIGJpdG1hcC4gIE90aGVyd2lzZSwKIAkgKiB0cnkgdG8gc3RhcnQgYSByZXN5bmMgaGFuZHNoYWtlIGFzIHN5bmMgdGFyZ2V0IGZvciBmdWxsIHN5bmMuCiAJICovCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhkaXNrLCBEX0lOQ09OU0lTVEVOVCkpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgeworCQlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoZGlzaywgRF9JTkNPTlNJU1RFTlQpKTsKIAkJaWYgKHJldGNvZGUgPj0gU1NfU1VDQ0VTUykgewotCQkJaWYgKGRyYmRfYml0bWFwX2lvKG1kZXYsICZkcmJkX2JtaW9fc2V0X25fd3JpdGUsCisJCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLAogCQkJCSJzZXRfbl93cml0ZSBmcm9tIGludmFsaWRhdGUiLCBCTV9MT0NLRURfTUFTSykpCiAJCQkJcmV0Y29kZSA9IEVSUl9JT19NRF9ESVNLOwogCQl9CiAJfSBlbHNlCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19TVEFSVElOR19TWU5DX1QpKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfU1RBUlRJTkdfU1lOQ19UKSk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI1ODIsMjUgKzI2MjIsMjUgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBvdXQ7CiAKLQlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHgubWRldiwgbWFzaywgdmFsKTsKKwlyZXRjb2RlID0gZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBtYXNrLCB2YWwpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcmJkX2JtaW9fc2V0X3N1c3BfYWwoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyBpbnQgZHJiZF9ibWlvX3NldF9zdXNwX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBydjsKIAotCXJ2ID0gZHJiZF9ibWlvX3NldF9uX3dyaXRlKG1kZXYpOwotCWRyYmRfc3VzcGVuZF9hbChtZGV2KTsKKwlydiA9IGRyYmRfYm1pb19zZXRfbl93cml0ZShkZXZpY2UpOworCWRyYmRfc3VzcGVuZF9hbChkZXZpY2UpOwogCXJldHVybiBydjsKIH0KIAogaW50IGRyYmRfYWRtX2ludmFsaWRhdGVfcGVlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWludCByZXRjb2RlOyAvKiBkcmJkX3JldF9jb2RlLCBkcmJkX3N0YXRlX3J2ICovCi0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAogCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9NSU5PUik7CiAJaWYgKCFhZG1fY3R4LnJlcGx5X3NrYikKQEAgLTI2MDgsMzIgKzI2NDgsMzIgQEAKIAlpZiAocmV0Y29kZSAhPSBOT19FUlJPUikKIAkJZ290byBvdXQ7CiAKLQltZGV2ID0gYWRtX2N0eC5tZGV2OworCWRldmljZSA9IGFkbV9jdHguZGV2aWNlOwogCiAJLyogSWYgdGhlcmUgaXMgc3RpbGwgYml0bWFwIElPIHBlbmRpbmcsIHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBwcmV2aW91cwogCSAqIHJlc3luYyBqdXN0IGJlaW5nIGZpbmlzaGVkLCB3YWl0IGZvciBpdCBiZWZvcmUgcmVxdWVzdGluZyBhIG5ldyByZXN5bmMuCiAJICogQWxzbyB3YWl0IGZvciBpdCdzIGFmdGVyX3N0YXRlX2NoKCkuICovCi0JZHJiZF9zdXNwZW5kX2lvKG1kZXYpOwotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX3N1c3BlbmRfaW8oZGV2aWNlKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpOworCWRyYmRfZmx1c2hfd29ya3F1ZXVlKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yayk7CiAKIAkvKiBJZiB3ZSBoYXBwZW4gdG8gYmUgQ19TVEFOREFMT05FIFJfUFJJTUFSWSwganVzdCBzZXQgYWxsIGJpdHMKIAkgKiBpbiB0aGUgYml0bWFwLiAgT3RoZXJ3aXNlLCB0cnkgdG8gc3RhcnQgYSByZXN5bmMgaGFuZHNoYWtlCiAJICogYXMgc3luYyBzb3VyY2UgZm9yIGZ1bGwgc3luYy4KIAkgKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJiBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCS8qIFRoZSBwZWVyIHdpbGwgZ2V0IGEgcmVzeW5jIHVwb24gY29ubmVjdCBhbnl3YXlzLiBKdXN0IG1ha2UgdGhhdAogCQkgICBpbnRvIGEgZnVsbCByZXN5bmMuICovCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMocGRzaywgRF9JTkNPTlNJU1RFTlQpKTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKHBkc2ssIERfSU5DT05TSVNURU5UKSk7CiAJCWlmIChyZXRjb2RlID49IFNTX1NVQ0NFU1MpIHsKLQkJCWlmIChkcmJkX2JpdG1hcF9pbyhtZGV2LCAmZHJiZF9ibWlvX3NldF9zdXNwX2FsLAorCQkJaWYgKGRyYmRfYml0bWFwX2lvKGRldmljZSwgJmRyYmRfYm1pb19zZXRfc3VzcF9hbCwKIAkJCQkic2V0X25fd3JpdGUgZnJvbSBpbnZhbGlkYXRlX3BlZXIiLAogCQkJCUJNX0xPQ0tFRF9TRVRfQUxMT1dFRCkpCiAJCQkJcmV0Y29kZSA9IEVSUl9JT19NRF9ESVNLOwogCQl9CiAJfSBlbHNlCi0JCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoY29ubiwgQ19TVEFSVElOR19TWU5DX1MpKTsKLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwkJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfU1RBUlRJTkdfU1lOQ19TKSk7CisJZHJiZF9yZXN1bWVfaW8oZGV2aWNlKTsKIAogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI2NTAsNyArMjY5MCw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGRyYmRfcmVxdWVzdF9zdGF0ZShhZG1fY3R4Lm1kZXYsIE5TKHVzZXJfaXNwLCAxKSkgPT0gU1NfTk9USElOR19UT19ETykKKwlpZiAoZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBOUyh1c2VyX2lzcCwgMSkpID09IFNTX05PVEhJTkdfVE9fRE8pCiAJCXJldGNvZGUgPSBFUlJfUEFVU0VfSVNfU0VUOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKQEAgLTI2NjgsOCArMjcwOCw4IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGRyYmRfcmVxdWVzdF9zdGF0ZShhZG1fY3R4Lm1kZXYsIE5TKHVzZXJfaXNwLCAwKSkgPT0gU1NfTk9USElOR19UT19ETykgewotCQlzID0gYWRtX2N0eC5tZGV2LT5zdGF0ZTsKKwlpZiAoZHJiZF9yZXF1ZXN0X3N0YXRlKGFkbV9jdHguZGV2aWNlLCBOUyh1c2VyX2lzcCwgMCkpID09IFNTX05PVEhJTkdfVE9fRE8pIHsKKwkJcyA9IGFkbV9jdHguZGV2aWNlLT5zdGF0ZTsKIAkJaWYgKHMuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1MgfHwgcy5jb25uID09IENfUEFVU0VEX1NZTkNfVCkgewogCQkJcmV0Y29kZSA9IHMuYWZ0cl9pc3AgPyBFUlJfUElDX0FGVEVSX0RFUCA6CiAJCQkJICBzLnBlZXJfaXNwID8gRVJSX1BJQ19QRUVSX0RFUCA6IEVSUl9QQVVTRV9JU19DTEVBUjsKQEAgLTI2OTAsNyArMjczMCw3IEBACiAKIGludCBkcmJkX2FkbV9yZXN1bWVfaW8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCByZXRjb2RlOyAvKiBlbnVtIGRyYmRfcmV0X2NvZGUgcnNwLiBlbnVtIGRyYmRfc3RhdGVfcnYgKi8KIAogCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9NSU5PUik7CkBAIC0yNjk5LDIwICsyNzM5LDIwIEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JbWRldiA9IGFkbV9jdHgubWRldjsKLQlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKKwlkZXZpY2UgPSBhZG1fY3R4LmRldmljZTsKKwlpZiAodGVzdF9iaXQoTkVXX0NVUl9VVUlELCAmZGV2aWNlLT5mbGFncykpIHsKKwkJZHJiZF91dWlkX25ld19jdXJyZW50KGRldmljZSk7CisJCWNsZWFyX2JpdChORVdfQ1VSX1VVSUQsICZkZXZpY2UtPmZsYWdzKTsKIAl9Ci0JZHJiZF9zdXNwZW5kX2lvKG1kZXYpOwotCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMzKHN1c3AsIDAsIHN1c3Bfbm9kLCAwLCBzdXNwX2ZlbiwgMCkpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXJldGNvZGUgPSBkcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUzMoc3VzcCwgMCwgc3VzcF9ub2QsIDAsIHN1c3BfZmVuLCAwKSk7CiAJaWYgKHJldGNvZGUgPT0gU1NfU1VDQ0VTUykgewotCQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQotCQkJdGxfY2xlYXIobWRldi0+dGNvbm4pOwotCQlpZiAobWRldi0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTIHx8IG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9GQUlMRUQpCi0JCQl0bF9yZXN0YXJ0KG1kZXYtPnRjb25uLCBGQUlMX0ZST1pFTl9ESVNLX0lPKTsKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKQorCQkJdGxfY2xlYXIoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CisJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyB8fCBkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9GQUlMRUQpCisJCQl0bF9yZXN0YXJ0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24sIEZBSUxfRlJPWkVOX0RJU0tfSU8pOwogCX0KLQlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogCiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwpAQCAtMjcyNCwyMyArMjc2NCwyOCBAQAogCXJldHVybiBkcmJkX2FkbV9zaW1wbGVfcmVxdWVzdF9zdGF0ZShza2IsIGluZm8sIE5TKGRpc2ssIERfT1VUREFURUQpKTsKIH0KIAotaW50IG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuc2lnbmVkIHZucikKK3N0YXRpYyBpbnQgbmxhX3B1dF9kcmJkX2NmZ19jb250ZXh0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgICAgc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5sYXR0ciAqbmxhOwogCW5sYSA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgRFJCRF9OTEFfQ0ZHX0NPTlRFWFQpOwogCWlmICghbmxhKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQlpZiAodm5yICE9IFZPTFVNRV9VTlNQRUNJRklFRCAmJgotCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3R4X3ZvbHVtZSwgdm5yKSkKKwlpZiAoZGV2aWNlICYmCisJICAgIG5sYV9wdXRfdTMyKHNrYiwgVF9jdHhfdm9sdW1lLCBkZXZpY2UtPnZucikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmIChubGFfcHV0X3N0cmluZyhza2IsIFRfY3R4X3Jlc291cmNlX25hbWUsIHRjb25uLT5uYW1lKSkKKwlpZiAobmxhX3B1dF9zdHJpbmcoc2tiLCBUX2N0eF9yZXNvdXJjZV9uYW1lLCByZXNvdXJjZS0+bmFtZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmICh0Y29ubi0+bXlfYWRkcl9sZW4gJiYKLQkgICAgbmxhX3B1dChza2IsIFRfY3R4X215X2FkZHIsIHRjb25uLT5teV9hZGRyX2xlbiwgJnRjb25uLT5teV9hZGRyKSkKLQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JaWYgKHRjb25uLT5wZWVyX2FkZHJfbGVuICYmCi0JICAgIG5sYV9wdXQoc2tiLCBUX2N0eF9wZWVyX2FkZHIsIHRjb25uLT5wZWVyX2FkZHJfbGVuLCAmdGNvbm4tPnBlZXJfYWRkcikpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChjb25uZWN0aW9uKSB7CisJCWlmIChjb25uZWN0aW9uLT5teV9hZGRyX2xlbiAmJgorCQkgICAgbmxhX3B1dChza2IsIFRfY3R4X215X2FkZHIsIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuLCAmY29ubmVjdGlvbi0+bXlfYWRkcikpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJaWYgKGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4gJiYKKwkJICAgIG5sYV9wdXQoc2tiLCBUX2N0eF9wZWVyX2FkZHIsIGNvbm5lY3Rpb24tPnBlZXJfYWRkcl9sZW4sICZjb25uZWN0aW9uLT5wZWVyX2FkZHIpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQogCW5sYV9uZXN0X2VuZChza2IsIG5sYSk7CiAJcmV0dXJuIDA7CiAKQEAgLTI3NTAsOSArMjc5NSwyMiBAQAogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKLWludCBubGFfcHV0X3N0YXR1c19pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCisvKgorICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIG9mIEByZXNvdXJjZSBpZiBAcmVzb3VyY2UgaGFzIGV4YWN0bHkgb25lIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICp0aGVfb25seV9jb25uZWN0aW9uKHN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjb25uZWN0aW9ucyA9ICZyZXNvdXJjZS0+Y29ubmVjdGlvbnM7CisKKwlpZiAobGlzdF9lbXB0eShjb25uZWN0aW9ucykgfHwgY29ubmVjdGlvbnMtPm5leHQtPm5leHQgIT0gY29ubmVjdGlvbnMpCisJCXJldHVybiBOVUxMOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5KCZyZXNvdXJjZS0+Y29ubmVjdGlvbnMsIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zKTsKK30KKworaW50IG5sYV9wdXRfc3RhdHVzX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IHN0cnVjdCBzaWJfaW5mbyAqc2liKQogeworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZSA9IGRldmljZS0+cmVzb3VyY2U7CiAJc3RydWN0IHN0YXRlX2luZm8gKnNpID0gTlVMTDsgLyogZm9yIHNpemVvZihzaS0+bWVtYmVyKTsgKi8KIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAJaW50IGdvdF9sZGV2OwpAQCAtMjc3MiwyNyArMjgzMCwyNyBAQAogCSAqIGFsd2F5cyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgKi8KIAlleGNsdWRlX3NlbnNpdGl2ZSA9IHNpYiB8fCAhY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKIAotCWdvdF9sZGV2ID0gZ2V0X2xkZXYobWRldik7CisJZ290X2xkZXYgPSBnZXRfbGRldihkZXZpY2UpOwogCiAJLyogV2UgbmVlZCB0byBhZGQgY29ubmVjdGlvbiBuYW1lIGFuZCB2b2x1bWUgbnVtYmVyIGluZm9ybWF0aW9uIHN0aWxsLgogCSAqIE1pbm9yIG51bWJlciBpcyBpbiBkcmJkX2dlbmxtc2doZHIuICovCi0JaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIG1kZXYtPnRjb25uLCBtZGV2LT52bnIpKQorCWlmIChubGFfcHV0X2RyYmRfY2ZnX2NvbnRleHQoc2tiLCByZXNvdXJjZSwgdGhlX29ubHlfY29ubmVjdGlvbihyZXNvdXJjZSksIGRldmljZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKHJlc19vcHRzX3RvX3NrYihza2IsICZtZGV2LT50Y29ubi0+cmVzX29wdHMsIGV4Y2x1ZGVfc2Vuc2l0aXZlKSkKKwlpZiAocmVzX29wdHNfdG9fc2tiKHNrYiwgJmRldmljZS0+cmVzb3VyY2UtPnJlc19vcHRzLCBleGNsdWRlX3NlbnNpdGl2ZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChnb3RfbGRldikgewogCQlzdHJ1Y3QgZGlza19jb25mICpkaXNrX2NvbmY7CiAKLQkJZGlza19jb25mID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZik7CisJCWRpc2tfY29uZiA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZik7CiAJCWVyciA9IGRpc2tfY29uZl90b19za2Ioc2tiLCBkaXNrX2NvbmYsIGV4Y2x1ZGVfc2Vuc2l0aXZlKTsKIAl9CiAJaWYgKCFlcnIpIHsKIAkJc3RydWN0IG5ldF9jb25mICpuYzsKIAotCQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCWlmIChuYykKIAkJCWVyciA9IG5ldF9jb25mX3RvX3NrYihza2IsIG5jLCBleGNsdWRlX3NlbnNpdGl2ZSk7CiAJfQpAQCAtMjgwNCwzOCArMjg2MiwzOCBAQAogCWlmICghbmxhKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF91MzIoc2tiLCBUX3NpYl9yZWFzb24sIHNpYiA/IHNpYi0+c2liX3JlYXNvbiA6IFNJQl9HRVRfU1RBVFVTX1JFUExZKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3VycmVudF9zdGF0ZSwgbWRldi0+c3RhdGUuaSkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2VkX3V1aWQsIG1kZXYtPmVkX3V1aWQpIHx8Ci0JICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9jYXBhY2l0eSwgZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KSkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3NlbmRfY250LCBtZGV2LT5zZW5kX2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3JlY3ZfY250LCBtZGV2LT5yZWN2X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3JlYWRfY250LCBtZGV2LT5yZWFkX2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3dyaXRfY250LCBtZGV2LT53cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2FsX3dyaXRfY250LCBtZGV2LT5hbF93cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JtX3dyaXRfY250LCBtZGV2LT5ibV93cml0X2NudCkgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX2Jpb19jbnQsIGF0b21pY19yZWFkKCZtZGV2LT5hcF9iaW9fY250KSkgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX3BlbmRpbmdfY250LCBhdG9taWNfcmVhZCgmbWRldi0+YXBfcGVuZGluZ19jbnQpKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIFRfcnNfcGVuZGluZ19jbnQsIGF0b21pY19yZWFkKCZtZGV2LT5yc19wZW5kaW5nX2NudCkpKQorCSAgICBubGFfcHV0X3UzMihza2IsIFRfY3VycmVudF9zdGF0ZSwgZGV2aWNlLT5zdGF0ZS5pKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfZWRfdXVpZCwgZGV2aWNlLT5lZF91dWlkKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfY2FwYWNpdHksIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSkgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3NlbmRfY250LCBkZXZpY2UtPnNlbmRfY250KSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfcmVjdl9jbnQsIGRldmljZS0+cmVjdl9jbnQpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9yZWFkX2NudCwgZGV2aWNlLT5yZWFkX2NudCkgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBUX3dyaXRfY250LCBkZXZpY2UtPndyaXRfY250KSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIFRfYWxfd3JpdF9jbnQsIGRldmljZS0+YWxfd3JpdF9jbnQpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9ibV93cml0X2NudCwgZGV2aWNlLT5ibV93cml0X2NudCkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUX2FwX2Jpb19jbnQsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2Jpb19jbnQpKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIFRfYXBfcGVuZGluZ19jbnQsIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX3BlbmRpbmdfY250KSkgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUX3JzX3BlbmRpbmdfY250LCBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWlmIChnb3RfbGRldikgewogCQlpbnQgZXJyOwogCi0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7Ci0JCWVyciA9IG5sYV9wdXQoc2tiLCBUX3V1aWRzLCBzaXplb2Yoc2ktPnV1aWRzKSwgbWRldi0+bGRldi0+bWQudXVpZCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+bGRldi0+bWQudXVpZF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5sZGV2LT5tZC51dWlkX2xvY2spOworCQllcnIgPSBubGFfcHV0KHNrYiwgVF91dWlkcywgc2l6ZW9mKHNpLT51dWlkcyksIGRldmljZS0+bGRldi0+bWQudXVpZCk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5sZGV2LT5tZC51dWlkX2xvY2spOwogCiAJCWlmIChlcnIpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAobmxhX3B1dF91MzIoc2tiLCBUX2Rpc2tfZmxhZ3MsIG1kZXYtPmxkZXYtPm1kLmZsYWdzKSB8fAotCQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfdG90YWwsIGRyYmRfYm1fYml0cyhtZGV2KSkgfHwKLQkJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9iaXRzX29vcywgZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpKQorCQlpZiAobmxhX3B1dF91MzIoc2tiLCBUX2Rpc2tfZmxhZ3MsIGRldmljZS0+bGRldi0+bWQuZmxhZ3MpIHx8CisJCSAgICBubGFfcHV0X3U2NChza2IsIFRfYml0c190b3RhbCwgZHJiZF9ibV9iaXRzKGRldmljZSkpIHx8CisJCSAgICBubGFfcHV0X3U2NChza2IsIFRfYml0c19vb3MsIGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCWlmIChDX1NZTkNfU09VUkNFIDw9IG1kZXYtPnN0YXRlLmNvbm4gJiYKLQkJICAgIENfUEFVU0VEX1NZTkNfVCA+PSBtZGV2LT5zdGF0ZS5jb25uKSB7Ci0JCQlpZiAobmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfdG90YWwsIG1kZXYtPnJzX3RvdGFsKSB8fAotCQkJICAgIG5sYV9wdXRfdTY0KHNrYiwgVF9iaXRzX3JzX2ZhaWxlZCwgbWRldi0+cnNfZmFpbGVkKSkKKwkJaWYgKENfU1lOQ19TT1VSQ0UgPD0gZGV2aWNlLT5zdGF0ZS5jb25uICYmCisJCSAgICBDX1BBVVNFRF9TWU5DX1QgPj0gZGV2aWNlLT5zdGF0ZS5jb25uKSB7CisJCQlpZiAobmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfdG90YWwsIGRldmljZS0+cnNfdG90YWwpIHx8CisJCQkgICAgbmxhX3B1dF91NjQoc2tiLCBUX2JpdHNfcnNfZmFpbGVkLCBkZXZpY2UtPnJzX2ZhaWxlZCkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KIAl9CkBAIC0yODY3LDcgKzI5MjUsNyBAQAogbmxhX3B1dF9mYWlsdXJlOgogCQllcnIgPSAtRU1TR1NJWkU7CiAJaWYgKGdvdF9sZGV2KQotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yODgyLDcgKzI5NDAsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCWVyciA9IG5sYV9wdXRfc3RhdHVzX2luZm8oYWRtX2N0eC5yZXBseV9za2IsIGFkbV9jdHgubWRldiwgTlVMTCk7CisJZXJyID0gbmxhX3B1dF9zdGF0dXNfaW5mbyhhZG1fY3R4LnJlcGx5X3NrYiwgYWRtX2N0eC5kZXZpY2UsIE5VTEwpOwogCWlmIChlcnIpIHsKIAkJbmxtc2dfZnJlZShhZG1fY3R4LnJlcGx5X3NrYik7CiAJCXJldHVybiBlcnI7CkBAIC0yODkyLDIyICsyOTUwLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBnZXRfb25lX3N0YXR1cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgaW50IGdldF9vbmVfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBkcmJkX2dlbmxtc2doZHIgKmRoOwotCXN0cnVjdCBkcmJkX3Rjb25uICpwb3MgPSAoc3RydWN0IGRyYmRfdGNvbm4qKWNiLT5hcmdzWzBdOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IE5VTEw7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRtcDsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcG9zID0gKHN0cnVjdCBkcmJkX3Jlc291cmNlICopY2ItPmFyZ3NbMF07CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqdG1wOwogCXVuc2lnbmVkIHZvbHVtZSA9IGNiLT5hcmdzWzFdOwogCiAJLyogT3BlbiBjb2RlZCwgZGVmZXJyZWQsIGl0ZXJhdGlvbjoKLQkgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGNvbm4sIHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKLQkgKglpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCBpKSB7CisJICogZm9yX2VhY2hfcmVzb3VyY2Vfc2FmZShyZXNvdXJjZSwgdG1wLCAmZHJiZF9yZXNvdXJjZXMpIHsKKwkgKiAgICAgIGNvbm5lY3Rpb24gPSAiZmlyc3QgY29ubmVjdGlvbiBvZiByZXNvdXJjZSBvciB1bmRlZmluZWQiOworCSAqCWlkcl9mb3JfZWFjaF9lbnRyeSgmcmVzb3VyY2UtPmRldmljZXMsIGRldmljZSwgaSkgewogCSAqCSAgLi4uCiAJICoJfQogCSAqIH0KLQkgKiB3aGVyZSB0Y29ubiBpcyBjYi0+YXJnc1swXTsKKwkgKiB3aGVyZSByZXNvdXJjZSBpcyBjYi0+YXJnc1swXTsKIAkgKiBhbmQgaSBpcyBjYi0+YXJnc1sxXTsKIAkgKgogCSAqIGNiLT5hcmdzWzJdIGluZGljYXRlcyBpZiB3ZSBzaGFsbCBsb29wIG92ZXIgYWxsIHJlc291cmNlcywKQEAgLTI5MTYsNDQgKzI5NzUsNDQgQEAKIAkgKiBUaGlzIG1heSBtaXNzIGVudHJpZXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhpcyBkdW1wIHN0YXJ0ZWQsCiAJICogb3IgZW50cmllcyBkZWxldGVkIGJlZm9yZSB0aGV5IGFyZSByZWFjaGVkLgogCSAqCi0JICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIG1kZXYgd29uJ3QgZGlzYXBwZWFyIHdoaWxlCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGRldmljZSB3b24ndCBkaXNhcHBlYXIgd2hpbGUKIAkgKiB3ZSBhcmUgbG9va2luZyBhdCBpdCwgYW5kIHJldmFsaWRhdGUgb3VyIGl0ZXJhdG9ycwogCSAqIG9uIGVhY2ggaXRlcmF0aW9uLgogCSAqLwogCi0JLyogc3luY2hyb25pemUgd2l0aCBjb25uX2NyZWF0ZSgpL2Nvbm5fZGVzdHJveSgpICovCisJLyogc3luY2hyb25pemUgd2l0aCBjb25uX2NyZWF0ZSgpL2RyYmRfZGVzdHJveV9jb25uZWN0aW9uKCkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJLyogcmV2YWxpZGF0ZSBpdGVyYXRvciBwb3NpdGlvbiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRtcCwgJmRyYmRfdGNvbm5zLCBhbGxfdGNvbm4pIHsKKwlmb3JfZWFjaF9yZXNvdXJjZV9yY3UodG1wLCAmZHJiZF9yZXNvdXJjZXMpIHsKIAkJaWYgKHBvcyA9PSBOVUxMKSB7CiAJCQkvKiBmaXJzdCBpdGVyYXRpb24gKi8KIAkJCXBvcyA9IHRtcDsKLQkJCXRjb25uID0gcG9zOworCQkJcmVzb3VyY2UgPSBwb3M7CiAJCQlicmVhazsKIAkJfQogCQlpZiAodG1wID09IHBvcykgewotCQkJdGNvbm4gPSBwb3M7CisJCQlyZXNvdXJjZSA9IHBvczsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmICh0Y29ubikgewotbmV4dF90Y29ubjoKLQkJbWRldiA9IGlkcl9nZXRfbmV4dCgmdGNvbm4tPnZvbHVtZXMsICZ2b2x1bWUpOwotCQlpZiAoIW1kZXYpIHsKLQkJCS8qIE5vIG1vcmUgdm9sdW1lcyB0byBkdW1wIG9uIHRoaXMgdGNvbm4uCi0JCQkgKiBBZHZhbmNlIHRjb25uIGl0ZXJhdG9yLiAqLwotCQkJcG9zID0gbGlzdF9lbnRyeV9yY3UodGNvbm4tPmFsbF90Y29ubi5uZXh0LAotCQkJCQkgICAgIHN0cnVjdCBkcmJkX3Rjb25uLCBhbGxfdGNvbm4pOwotCQkJLyogRGlkIHdlIGR1bXAgYW55IHZvbHVtZSBvbiB0aGlzIHRjb25uIHlldD8gKi8KKwlpZiAocmVzb3VyY2UpIHsKK25leHRfcmVzb3VyY2U6CisJCWRldmljZSA9IGlkcl9nZXRfbmV4dCgmcmVzb3VyY2UtPmRldmljZXMsICZ2b2x1bWUpOworCQlpZiAoIWRldmljZSkgeworCQkJLyogTm8gbW9yZSB2b2x1bWVzIHRvIGR1bXAgb24gdGhpcyByZXNvdXJjZS4KKwkJCSAqIEFkdmFuY2UgcmVzb3VyY2UgaXRlcmF0b3IuICovCisJCQlwb3MgPSBsaXN0X2VudHJ5X3JjdShyZXNvdXJjZS0+cmVzb3VyY2VzLm5leHQsCisJCQkJCSAgICAgc3RydWN0IGRyYmRfcmVzb3VyY2UsIHJlc291cmNlcyk7CisJCQkvKiBEaWQgd2UgZHVtcCBhbnkgdm9sdW1lIG9mIHRoaXMgcmVzb3VyY2UgeWV0PyAqLwogCQkJaWYgKHZvbHVtZSAhPSAwKSB7CiAJCQkJLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LAogCQkJCSAqIG9yIG9ubHkgYSBzaW5nbGUgcmVzb3VyY2UgZHVtcCB3YXMgcmVxdWVzdGVkLAogCQkJCSAqIHdlIGFyZSBkb25lLiAqLwotCQkJCWlmICgmcG9zLT5hbGxfdGNvbm4gPT0gJmRyYmRfdGNvbm5zIHx8IGNiLT5hcmdzWzJdKQorCQkJCWlmICgmcG9zLT5yZXNvdXJjZXMgPT0gJmRyYmRfcmVzb3VyY2VzIHx8IGNiLT5hcmdzWzJdKQogCQkJCQlnb3RvIG91dDsKIAkJCQl2b2x1bWUgPSAwOwotCQkJCXRjb25uID0gcG9zOwotCQkJCWdvdG8gbmV4dF90Y29ubjsKKwkJCQlyZXNvdXJjZSA9IHBvczsKKwkJCQlnb3RvIG5leHRfcmVzb3VyY2U7CiAJCQl9CiAJCX0KIApAQCAtMjk2Myw0MyArMzAyMiw0OSBAQAogCQlpZiAoIWRoKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKCFtZGV2KSB7Ci0JCQkvKiBUaGlzIGlzIGEgdGNvbm4gd2l0aG91dCBhIHNpbmdsZSB2b2x1bWUuCisJCWlmICghZGV2aWNlKSB7CisJCQkvKiBUaGlzIGlzIGEgY29ubmVjdGlvbiB3aXRob3V0IGEgc2luZ2xlIHZvbHVtZS4KIAkJCSAqIFN1cHJpc2luZ2x5IGVub3VnaCwgaXQgbWF5IGhhdmUgYSBuZXR3b3JrCiAJCQkgKiBjb25maWd1cmF0aW9uLiAqLwotCQkJc3RydWN0IG5ldF9jb25mICpuYzsKKwkJCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKIAkJCWRoLT5taW5vciA9IC0xVTsKIAkJCWRoLT5yZXRfY29kZSA9IE5PX0VSUk9SOwotCQkJaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIHRjb25uLCBWT0xVTUVfVU5TUEVDSUZJRUQpKQorCQkJY29ubmVjdGlvbiA9IHRoZV9vbmx5X2Nvbm5lY3Rpb24ocmVzb3VyY2UpOworCQkJaWYgKG5sYV9wdXRfZHJiZF9jZmdfY29udGV4dChza2IsIHJlc291cmNlLCBjb25uZWN0aW9uLCBOVUxMKSkKIAkJCQlnb3RvIGNhbmNlbDsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7Ci0JCQlpZiAobmMgJiYgbmV0X2NvbmZfdG9fc2tiKHNrYiwgbmMsIDEpICE9IDApCi0JCQkJZ290byBjYW5jZWw7CisJCQlpZiAoY29ubmVjdGlvbikgeworCQkJCXN0cnVjdCBuZXRfY29uZiAqbmM7CisKKwkJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CisJCQkJaWYgKG5jICYmIG5ldF9jb25mX3RvX3NrYihza2IsIG5jLCAxKSAhPSAwKQorCQkJCQlnb3RvIGNhbmNlbDsKKwkJCX0KIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCURfQVNTRVJUKG1kZXYtPnZuciA9PSB2b2x1bWUpOwotCQlEX0FTU0VSVChtZGV2LT50Y29ubiA9PSB0Y29ubik7CisJCURfQVNTRVJUKGRldmljZSwgZGV2aWNlLT52bnIgPT0gdm9sdW1lKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnJlc291cmNlID09IHJlc291cmNlKTsKIAotCQlkaC0+bWlub3IgPSBtZGV2X3RvX21pbm9yKG1kZXYpOworCQlkaC0+bWlub3IgPSBkZXZpY2VfdG9fbWlub3IoZGV2aWNlKTsKIAkJZGgtPnJldF9jb2RlID0gTk9fRVJST1I7CiAKLQkJaWYgKG5sYV9wdXRfc3RhdHVzX2luZm8oc2tiLCBtZGV2LCBOVUxMKSkgeworCQlpZiAobmxhX3B1dF9zdGF0dXNfaW5mbyhza2IsIGRldmljZSwgTlVMTCkpIHsKIGNhbmNlbDoKIAkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgZGgpOwogCQkJZ290byBvdXQ7CiAJCX0KIGRvbmU6CiAJCWdlbmxtc2dfZW5kKHNrYiwgZGgpOwotICAgICAgICB9CisJfQogCiBvdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJLyogd2hlcmUgdG8gc3RhcnQgdGhlIG5leHQgaXRlcmF0aW9uICovCi0gICAgICAgIGNiLT5hcmdzWzBdID0gKGxvbmcpcG9zOwotICAgICAgICBjYi0+YXJnc1sxXSA9IChwb3MgPT0gdGNvbm4pID8gdm9sdW1lICsgMSA6IDA7CisJY2ItPmFyZ3NbMF0gPSAobG9uZylwb3M7CisJY2ItPmFyZ3NbMV0gPSAocG9zID09IHJlc291cmNlKSA/IHZvbHVtZSArIDEgOiAwOwogCi0JLyogTm8gbW9yZSB0Y29ubnMvdm9sdW1lcy9taW5vcnMgZm91bmQgcmVzdWx0cyBpbiBhbiBlbXB0eSBza2IuCisJLyogTm8gbW9yZSByZXNvdXJjZXMvdm9sdW1lcy9taW5vcnMgZm91bmQgcmVzdWx0cyBpbiBhbiBlbXB0eSBza2IuCiAJICogV2hpY2ggd2lsbCB0ZXJtaW5hdGUgdGhlIGR1bXAuICovCiAgICAgICAgIHJldHVybiBza2ItPmxlbjsKIH0KQEAgLTMwMTksNyArMzA4NCw3IEBACiAJY29uc3QgdW5zaWduZWQgaGRybGVuID0gR0VOTF9IRFJMRU4gKyBHRU5MX01BR0lDX0ZBTUlMWV9IRFJTWjsKIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAJY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZTsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm47CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOwogCWludCBtYXh0eXBlOwogCiAJLyogSXMgdGhpcyBhIGZvbGxvd3VwIGNhbGw/ICovCkBAIC0zMDQ4LDE4ICszMTEzLDE5IEBACiAJaWYgKCFubGEpCiAJCXJldHVybiAtRUlOVkFMOwogCXJlc291cmNlX25hbWUgPSBubGFfZGF0YShubGEpOwotCXRjb25uID0gY29ubl9nZXRfYnlfbmFtZShyZXNvdXJjZV9uYW1lKTsKLQotCWlmICghdGNvbm4pCisJaWYgKCEqcmVzb3VyY2VfbmFtZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmVzb3VyY2UgPSBkcmJkX2ZpbmRfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk7CisJaWYgKCFyZXNvdXJjZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlrcmVmX3B1dCgmdGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOyAvKiBnZXRfb25lX3N0YXR1cygpIChyZSl2YWxpZGF0ZXMgdGNvbm4gYnkgaXRzZWxmICovCisJa3JlZl9wdXQoJnJlc291cmNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfcmVzb3VyY2UpOyAvKiBnZXRfb25lX3N0YXR1cygpIHJldmFsaWRhdGVzIHRoZSByZXNvdXJjZSAqLwogCiAJLyogcHJpbWUgaXRlcmF0b3JzLCBhbmQgc2V0ICJmaWx0ZXIiIG1vZGUgbWFyazoKLQkgKiBvbmx5IGR1bXAgdGhpcyB0Y29ubi4gKi8KLQljYi0+YXJnc1swXSA9IChsb25nKXRjb25uOworCSAqIG9ubHkgZHVtcCB0aGlzIGNvbm5lY3Rpb24uICovCisJY2ItPmFyZ3NbMF0gPSAobG9uZylyZXNvdXJjZTsKIAkvKiBjYi0+YXJnc1sxXSA9IDA7IHBhc3NlZCBpbiB0aGlzIHdheS4gKi8KLQljYi0+YXJnc1syXSA9IChsb25nKXRjb25uOworCWNiLT5hcmdzWzJdID0gKGxvbmcpcmVzb3VyY2U7CiAKIGR1bXA6CiAJcmV0dXJuIGdldF9vbmVfc3RhdHVzKHNrYiwgY2IpOwpAQCAtMzA3OCw4ICszMTQ0LDggQEAKIAkJZ290byBvdXQ7CiAKIAl0cC50aW1lb3V0X3R5cGUgPQotCQlhZG1fY3R4Lm1kZXYtPnN0YXRlLnBkc2sgPT0gRF9PVVREQVRFRCA/IFVUX1BFRVJfT1VUREFURUQgOgotCQl0ZXN0X2JpdChVU0VfREVHUl9XRkNfVCwgJmFkbV9jdHgubWRldi0+ZmxhZ3MpID8gVVRfREVHUkFERUQgOgorCQlhZG1fY3R4LmRldmljZS0+c3RhdGUucGRzayA9PSBEX09VVERBVEVEID8gVVRfUEVFUl9PVVREQVRFRCA6CisJCXRlc3RfYml0KFVTRV9ERUdSX1dGQ19ULCAmYWRtX2N0eC5kZXZpY2UtPmZsYWdzKSA/IFVUX0RFR1JBREVEIDoKIAkJVVRfREVGQVVMVDsKIAogCWVyciA9IHRpbWVvdXRfcGFybXNfdG9fcHJpdl9za2IoYWRtX2N0eC5yZXBseV9za2IsICZ0cCk7CkBAIC0zMDk0LDcgKzMxNjAsNyBAQAogCiBpbnQgZHJiZF9hZG1fc3RhcnRfb3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwogCXN0cnVjdCBzdGFydF9vdl9wYXJtcyBwYXJtczsKIApAQCAtMzEwNCwxMCArMzE3MCwxMCBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCW1kZXYgPSBhZG1fY3R4Lm1kZXY7CisJZGV2aWNlID0gYWRtX2N0eC5kZXZpY2U7CiAKIAkvKiByZXN1bWUgZnJvbSBsYXN0IGtub3duIHBvc2l0aW9uLCBpZiBwb3NzaWJsZSAqLwotCXBhcm1zLm92X3N0YXJ0X3NlY3RvciA9IG1kZXYtPm92X3N0YXJ0X3NlY3RvcjsKKwlwYXJtcy5vdl9zdGFydF9zZWN0b3IgPSBkZXZpY2UtPm92X3N0YXJ0X3NlY3RvcjsKIAlwYXJtcy5vdl9zdG9wX3NlY3RvciA9IFVMTE9OR19NQVg7CiAJaWYgKGluZm8tPmF0dHJzW0RSQkRfTkxBX1NUQVJUX09WX1BBUk1TXSkgewogCQlpbnQgZXJyID0gc3RhcnRfb3ZfcGFybXNfZnJvbV9hdHRycygmcGFybXMsIGluZm8pOwpAQCAtMzExOCwxNSArMzE4NCwxNSBAQAogCQl9CiAJfQogCS8qIHdfbWFrZV9vdl9yZXF1ZXN0IGV4cGVjdHMgcG9zaXRpb24gdG8gYmUgYWxpZ25lZCAqLwotCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IHBhcm1zLm92X3N0YXJ0X3NlY3RvciAmIH4oQk1fU0VDVF9QRVJfQklULTEpOwotCW1kZXYtPm92X3N0b3Bfc2VjdG9yID0gcGFybXMub3Zfc3RvcF9zZWN0b3I7CisJZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPSBwYXJtcy5vdl9zdGFydF9zZWN0b3IgJiB+KEJNX1NFQ1RfUEVSX0JJVC0xKTsKKwlkZXZpY2UtPm92X3N0b3Bfc2VjdG9yID0gcGFybXMub3Zfc3RvcF9zZWN0b3I7CiAKIAkvKiBJZiB0aGVyZSBpcyBzdGlsbCBiaXRtYXAgSU8gcGVuZGluZywgZS5nLiBwcmV2aW91cyByZXN5bmMgb3IgdmVyaWZ5CiAJICoganVzdCBiZWluZyBmaW5pc2hlZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHJlcXVlc3RpbmcgYSBuZXcgcmVzeW5jLiAqLwotCWRyYmRfc3VzcGVuZF9pbyhtZGV2KTsKLQl3YWl0X2V2ZW50KG1kZXYtPm1pc2Nfd2FpdCwgIXRlc3RfYml0KEJJVE1BUF9JTywgJm1kZXYtPmZsYWdzKSk7Ci0JcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LE5TKGNvbm4sQ19WRVJJRllfUykpOwotCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCWRyYmRfc3VzcGVuZF9pbyhkZXZpY2UpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5taXNjX3dhaXQsICF0ZXN0X2JpdChCSVRNQVBfSU8sICZkZXZpY2UtPmZsYWdzKSk7CisJcmV0Y29kZSA9IGRyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfVkVSSUZZX1MpKTsKKwlkcmJkX3Jlc3VtZV9pbyhkZXZpY2UpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTMxMzUsNyArMzIwMSw3IEBACiAKIGludCBkcmJkX2FkbV9uZXdfY191dWlkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAllbnVtIGRyYmRfcmV0X2NvZGUgcmV0Y29kZTsKIAlpbnQgc2tpcF9pbml0aWFsX3N5bmMgPSAwOwogCWludCBlcnI7CkBAIC0zMTQ3LDcgKzMyMTMsNyBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dF9ub2xvY2s7CiAKLQltZGV2ID0gYWRtX2N0eC5tZGV2OworCWRldmljZSA9IGFkbV9jdHguZGV2aWNlOwogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAlpZiAoaW5mby0+YXR0cnNbRFJCRF9OTEFfTkVXX0NfVVVJRF9QQVJNU10pIHsKIAkJZXJyID0gbmV3X2NfdXVpZF9wYXJtc19mcm9tX2F0dHJzKCZhcmdzLCBpbmZvKTsKQEAgLTMxNTgsNDkgKzMyMjQsNTAgQEAKIAkJfQogCX0KIAotCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOyAvKiBQcm90ZWN0cyB1cyBhZ2FpbnN0IHNlcmlhbGl6ZWQgc3RhdGUgY2hhbmdlcy4gKi8KKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOyAvKiBQcm90ZWN0cyB1cyBhZ2FpbnN0IHNlcmlhbGl6ZWQgc3RhdGUgY2hhbmdlcy4gKi8KIAotCWlmICghZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoIWdldF9sZGV2KGRldmljZSkpIHsKIAkJcmV0Y29kZSA9IEVSUl9OT19ESVNLOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiB0aGlzIGlzICJza2lwIGluaXRpYWwgc3luYyIsIGFzc3VtZSB0byBiZSBjbGVhbiAqLwotCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEICYmIG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTAgJiYKLQkgICAgbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJiBhcmdzLmNsZWFyX2JtKSB7Ci0JCWRldl9pbmZvKERFViwgIlByZXBhcmluZyB0byBza2lwIGluaXRpYWwgc3luY1xuIik7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgorCSAgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTAgJiYKKwkgICAgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdID09IFVVSURfSlVTVF9DUkVBVEVEICYmIGFyZ3MuY2xlYXJfYm0pIHsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlByZXBhcmluZyB0byBza2lwIGluaXRpYWwgc3luY1xuIik7CiAJCXNraXBfaW5pdGlhbF9zeW5jID0gMTsKLQl9IGVsc2UgaWYgKG1kZXYtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FKSB7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FKSB7CiAJCXJldGNvZGUgPSBFUlJfQ09OTkVDVEVEOwogCQlnb3RvIG91dF9kZWM7CiAJfQogCi0JZHJiZF91dWlkX3NldChtZGV2LCBVSV9CSVRNQVAsIDApOyAvKiBSb3RhdGUgVUlfQklUTUFQIHRvIEhpc3RvcnkgMSwgZXRjLi4uICovCi0JZHJiZF91dWlkX25ld19jdXJyZW50KG1kZXYpOyAvKiBOZXcgY3VycmVudCwgcHJldmlvdXMgdG8gVUlfQklUTUFQICovCisJZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMCk7IC8qIFJvdGF0ZSBVSV9CSVRNQVAgdG8gSGlzdG9yeSAxLCBldGMuLi4gKi8KKwlkcmJkX3V1aWRfbmV3X2N1cnJlbnQoZGV2aWNlKTsgLyogTmV3IGN1cnJlbnQsIHByZXZpb3VzIHRvIFVJX0JJVE1BUCAqLwogCiAJaWYgKGFyZ3MuY2xlYXJfYm0pIHsKLQkJZXJyID0gZHJiZF9iaXRtYXBfaW8obWRldiwgJmRyYmRfYm1pb19jbGVhcl9uX3dyaXRlLAorCQllcnIgPSBkcmJkX2JpdG1hcF9pbyhkZXZpY2UsICZkcmJkX2JtaW9fY2xlYXJfbl93cml0ZSwKIAkJCSJjbGVhcl9uX3dyaXRlIGZyb20gbmV3X2NfdXVpZCIsIEJNX0xPQ0tFRF9NQVNLKTsKIAkJaWYgKGVycikgewotCQkJZGV2X2VycihERVYsICJXcml0aW5nIGJpdG1hcCBmYWlsZWQgd2l0aCAlZFxuIixlcnIpOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiV3JpdGluZyBiaXRtYXAgZmFpbGVkIHdpdGggJWRcbiIsIGVycik7CiAJCQlyZXRjb2RlID0gRVJSX0lPX01EX0RJU0s7CiAJCX0KIAkJaWYgKHNraXBfaW5pdGlhbF9zeW5jKSB7Ci0JCQlkcmJkX3NlbmRfdXVpZHNfc2tpcF9pbml0aWFsX3N5bmMobWRldik7Ci0JCQlfZHJiZF91dWlkX3NldChtZGV2LCBVSV9CSVRNQVAsIDApOwotCQkJZHJiZF9wcmludF91dWlkcyhtZGV2LCAiY2xlYXJlZCBiaXRtYXAgVVVJRCIpOwotCQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQkJCV9kcmJkX3NldF9zdGF0ZShfTlMyKG1kZXYsIGRpc2ssIERfVVBfVE9fREFURSwgcGRzaywgRF9VUF9UT19EQVRFKSwKKwkJCWRyYmRfc2VuZF91dWlkc19za2lwX2luaXRpYWxfc3luYyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKKwkJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCAwKTsKKwkJCWRyYmRfcHJpbnRfdXVpZHMoZGV2aWNlLCAiY2xlYXJlZCBiaXRtYXAgVVVJRCIpOworCQkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQkJX2RyYmRfc2V0X3N0YXRlKF9OUzIoZGV2aWNlLCBkaXNrLCBEX1VQX1RPX0RBVEUsIHBkc2ssIERfVVBfVE9fREFURSksCiAJCQkJCUNTX1ZFUkJPU0UsIE5VTEwpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCX0KIAl9CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiBvdXRfZGVjOgotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiBvdXRfbm9sb2NrOgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKQEAgLTMyNDYsNyArMzMxMyw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGFkbV9jdHgudGNvbm4pIHsKKwlpZiAoYWRtX2N0eC5yZXNvdXJjZSkgewogCQlpZiAoaW5mby0+bmxoZHItPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkgewogCQkJcmV0Y29kZSA9IEVSUl9JTlZBTElEX1JFUVVFU1Q7CiAJCQlkcmJkX21zZ19wdXRfaW5mbygicmVzb3VyY2UgZXhpc3RzIik7CkBAIC0zMjYyLDcgKzMzMjksNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHJiZF9hZG1fYWRkX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitpbnQgZHJiZF9hZG1fbmV3X21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRyYmRfZ2VubG1zZ2hkciAqZGggPSBpbmZvLT51c2VyaGRyOwogCWVudW0gZHJiZF9yZXRfY29kZSByZXRjb2RlOwpAQCAtMzI4NSw0MSArMzM1MiwzNiBAQAogCX0KIAogCS8qIGRyYmRfYWRtX3ByZXBhcmUgbWFkZSBzdXJlIGFscmVhZHkKLQkgKiB0aGF0IG1kZXYtPnRjb25uIGFuZCBtZGV2LT52bnIgbWF0Y2ggdGhlIHJlcXVlc3QuICovCi0JaWYgKGFkbV9jdHgubWRldikgeworCSAqIHRoYXQgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiBhbmQgZGV2aWNlLT52bnIgbWF0Y2ggdGhlIHJlcXVlc3QuICovCisJaWYgKGFkbV9jdHguZGV2aWNlKSB7CiAJCWlmIChpbmZvLT5ubGhkci0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKQogCQkJcmV0Y29kZSA9IEVSUl9NSU5PUl9FWElTVFM7CiAJCS8qIGVsc2U6IHN0aWxsIE5PX0VSUk9SICovCiAJCWdvdG8gb3V0OwogCX0KIAotCXJldGNvZGUgPSBjb25uX25ld19taW5vcihhZG1fY3R4LnRjb25uLCBkaC0+bWlub3IsIGFkbV9jdHgudm9sdW1lKTsKKwlyZXRjb2RlID0gZHJiZF9jcmVhdGVfZGV2aWNlKGFkbV9jdHgucmVzb3VyY2UsIGRoLT5taW5vciwgYWRtX2N0eC52b2x1bWUpOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGVudW0gZHJiZF9yZXRfY29kZSBhZG1fZGVsZXRlX21pbm9yKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgZW51bSBkcmJkX3JldF9jb2RlIGFkbV9kZWxfbWlub3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJgotCSAgICAvKiBubyBuZWVkIHRvIGJlIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FICYmCisJaWYgKGRldmljZS0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTICYmCisJICAgIC8qIG5vIG5lZWQgdG8gYmUgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJgogCSAgICAgKiB3ZSBtYXkgd2FudCB0byBkZWxldGUgYSBtaW5vciBmcm9tIGEgbGl2ZSByZXBsaWNhdGlvbiBncm91cC4KIAkgICAgICovCi0JICAgIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKLQkJX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLAorCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9TRUNPTkRBUlkpIHsKKwkJX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfUkVQT1JUX1BBUkFNUyksCiAJCQkJICAgIENTX1ZFUkJPU0UgKyBDU19XQUlUX0NPTVBMRVRFKTsKLQkJaWRyX3JlbW92ZSgmbWRldi0+dGNvbm4tPnZvbHVtZXMsIG1kZXYtPnZucik7Ci0JCWlkcl9yZW1vdmUoJm1pbm9ycywgbWRldl90b19taW5vcihtZGV2KSk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKG1kZXYtPnN1Ym1pdC53cSk7Ci0JCWRlbF9nZW5kaXNrKG1kZXYtPnZkaXNrKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9kZWxldGVfZGV2aWNlKGRldmljZSk7CiAJCXJldHVybiBOT19FUlJPUjsKIAl9IGVsc2UKIAkJcmV0dXJuIEVSUl9NSU5PUl9DT05GSUdVUkVEOwogfQogCi1pbnQgZHJiZF9hZG1fZGVsZXRlX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitpbnQgZHJiZF9hZG1fZGVsX21pbm9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAKQEAgLTMzMjksNyArMzM5MSw3IEBACiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JcmV0Y29kZSA9IGFkbV9kZWxldGVfbWlub3IoYWRtX2N0eC5tZGV2KTsKKwlyZXRjb2RlID0gYWRtX2RlbF9taW5vcihhZG1fY3R4LmRldmljZSk7CiBvdXQ6CiAJZHJiZF9hZG1fZmluaXNoKGluZm8sIHJldGNvZGUpOwogCXJldHVybiAwOwpAQCAtMzMzNyw1NSArMzM5OSw1OCBAQAogCiBpbnQgZHJiZF9hZG1fZG93bihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogeworCXN0cnVjdCBkcmJkX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCWludCByZXRjb2RlOyAvKiBlbnVtIGRyYmRfcmV0X2NvZGUgcnNwLiBlbnVtIGRyYmRfc3RhdGVfcnYgKi8KLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OwogCXVuc2lnbmVkIGk7CiAKLQlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIDApOworCXJldGNvZGUgPSBkcmJkX2FkbV9wcmVwYXJlKHNrYiwgaW5mbywgRFJCRF9BRE1fTkVFRF9SRVNPVVJDRSk7CiAJaWYgKCFhZG1fY3R4LnJlcGx5X3NrYikKIAkJcmV0dXJuIHJldGNvZGU7CiAJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCFhZG1fY3R4LnRjb25uKSB7Ci0JCXJldGNvZGUgPSBFUlJfUkVTX05PVF9LTk9XTjsKLQkJZ290byBvdXQ7Ci0JfQotCisJcmVzb3VyY2UgPSBhZG1fY3R4LnJlc291cmNlOwogCS8qIGRlbW90ZSAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShtZGV2LCBSX1NFQ09OREFSWSwgMCk7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkgeworCQlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCBpKSB7CisJCQlyZXRjb2RlID0gZHJiZF9zZXRfcm9sZShwZWVyX2RldmljZS0+ZGV2aWNlLCBSX1NFQ09OREFSWSwgMCk7CisJCQlpZiAocmV0Y29kZSA8IFNTX1NVQ0NFU1MpIHsKKwkJCQlkcmJkX21zZ19wdXRfaW5mbygiZmFpbGVkIHRvIGRlbW90ZSIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJcmV0Y29kZSA9IGNvbm5fdHJ5X2Rpc2Nvbm5lY3QoY29ubmVjdGlvbiwgMCk7CiAJCWlmIChyZXRjb2RlIDwgU1NfU1VDQ0VTUykgewotCQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZW1vdGUiKTsKKwkJCWRyYmRfbXNnX3B1dF9pbmZvKCJmYWlsZWQgdG8gZGlzY29ubmVjdCIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlyZXRjb2RlID0gY29ubl90cnlfZGlzY29ubmVjdChhZG1fY3R4LnRjb25uLCAwKTsKLQlpZiAocmV0Y29kZSA8IFNTX1NVQ0NFU1MpIHsKLQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkaXNjb25uZWN0Iik7Ci0JCWdvdG8gb3V0OwotCX0KLQogCS8qIGRldGFjaCAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gYWRtX2RldGFjaChtZGV2LCAwKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJnJlc291cmNlLT5kZXZpY2VzLCBkZXZpY2UsIGkpIHsKKwkJcmV0Y29kZSA9IGFkbV9kZXRhY2goZGV2aWNlLCAwKTsKIAkJaWYgKHJldGNvZGUgPCBTU19TVUNDRVNTIHx8IHJldGNvZGUgPiBOT19FUlJPUikgewogCQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZXRhY2giKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JLyogSWYgd2UgcmVhY2ggdGhpcywgYWxsIHZvbHVtZXMgKG9mIHRoaXMgdGNvbm4pIGFyZSBTZWNvbmRhcnksCisJLyogSWYgd2UgcmVhY2ggdGhpcywgYWxsIHZvbHVtZXMgKG9mIHRoaXMgY29ubmVjdGlvbikgYXJlIFNlY29uZGFyeSwKIAkgKiBEaXNjb25uZWN0ZWQsIERpc2tsZXNzLCBha2EgVW5jb25maWd1cmVkLiBNYWtlIHN1cmUgYWxsIHRocmVhZHMgaGF2ZQogCSAqIGFjdHVhbGx5IHN0b3BwZWQsIHN0YXRlIGhhbmRsaW5nIG9ubHkgZG9lcyBkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgpLiAqLwotCWRyYmRfdGhyZWFkX3N0b3AoJmFkbV9jdHgudGNvbm4tPndvcmtlcik7CisJZm9yX2VhY2hfY29ubmVjdGlvbihjb25uZWN0aW9uLCByZXNvdXJjZSkKKwkJZHJiZF90aHJlYWRfc3RvcCgmY29ubmVjdGlvbi0+d29ya2VyKTsKIAogCS8qIE5vdywgbm90aGluZyBjYW4gZmFpbCBhbnltb3JlICovCiAKIAkvKiBkZWxldGUgdm9sdW1lcyAqLwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmYWRtX2N0eC50Y29ubi0+dm9sdW1lcywgbWRldiwgaSkgewotCQlyZXRjb2RlID0gYWRtX2RlbGV0ZV9taW5vcihtZGV2KTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJnJlc291cmNlLT5kZXZpY2VzLCBkZXZpY2UsIGkpIHsKKwkJcmV0Y29kZSA9IGFkbV9kZWxfbWlub3IoZGV2aWNlKTsKIAkJaWYgKHJldGNvZGUgIT0gTk9fRVJST1IpIHsKIAkJCS8qICJjYW4gbm90IGhhcHBlbiIgKi8KIAkJCWRyYmRfbXNnX3B1dF9pbmZvKCJmYWlsZWQgdG8gZGVsZXRlIHZvbHVtZSIpOwpAQCAtMzM5MywxOSArMzQ1OCwxMSBAQAogCQl9CiAJfQogCi0JLyogZGVsZXRlIGNvbm5lY3Rpb24gKi8KLQlpZiAoY29ubl9sb3dlc3RfbWlub3IoYWRtX2N0eC50Y29ubikgPCAwKSB7Ci0JCWxpc3RfZGVsX3JjdSgmYWRtX2N0eC50Y29ubi0+YWxsX3Rjb25uKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtyZWZfcHV0KCZhZG1fY3R4LnRjb25uLT5rcmVmLCAmY29ubl9kZXN0cm95KTsKKwlsaXN0X2RlbF9yY3UoJnJlc291cmNlLT5yZXNvdXJjZXMpOworCXN5bmNocm9uaXplX3JjdSgpOworCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CisJcmV0Y29kZSA9IE5PX0VSUk9SOwogCi0JCXJldGNvZGUgPSBOT19FUlJPUjsKLQl9IGVsc2UgewotCQkvKiAiY2FuIG5vdCBoYXBwZW4iICovCi0JCXJldGNvZGUgPSBFUlJfUkVTX0lOX1VTRTsKLQkJZHJiZF9tc2dfcHV0X2luZm8oImZhaWxlZCB0byBkZWxldGUgY29ubmVjdGlvbiIpOwotCX0KLQlnb3RvIG91dDsKIG91dDoKIAlkcmJkX2FkbV9maW5pc2goaW5mbywgcmV0Y29kZSk7CiAJcmV0dXJuIDA7CkBAIC0zNDEzLDYgKzM0NzAsOCBAQAogCiBpbnQgZHJiZF9hZG1fZGVsX3Jlc291cmNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CisJc3RydWN0IGRyYmRfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJZW51bSBkcmJkX3JldF9jb2RlIHJldGNvZGU7CiAKIAlyZXRjb2RlID0gZHJiZF9hZG1fcHJlcGFyZShza2IsIGluZm8sIERSQkRfQURNX05FRURfUkVTT1VSQ0UpOwpAQCAtMzQyMSwyNCArMzQ4MCwzMCBAQAogCWlmIChyZXRjb2RlICE9IE5PX0VSUk9SKQogCQlnb3RvIG91dDsKIAotCWlmIChjb25uX2xvd2VzdF9taW5vcihhZG1fY3R4LnRjb25uKSA8IDApIHsKLQkJbGlzdF9kZWxfcmN1KCZhZG1fY3R4LnRjb25uLT5hbGxfdGNvbm4pOwotCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJa3JlZl9wdXQoJmFkbV9jdHgudGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOwotCi0JCXJldGNvZGUgPSBOT19FUlJPUjsKLQl9IGVsc2UgeworCXJlc291cmNlID0gYWRtX2N0eC5yZXNvdXJjZTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKSB7CisJCWlmIChjb25uZWN0aW9uLT5jc3RhdGUgPiBDX1NUQU5EQUxPTkUpIHsKKwkJCXJldGNvZGUgPSBFUlJfTkVUX0NPTkZJR1VSRUQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAoIWlkcl9pc19lbXB0eSgmcmVzb3VyY2UtPmRldmljZXMpKSB7CiAJCXJldGNvZGUgPSBFUlJfUkVTX0lOX1VTRTsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHJldGNvZGUgPT0gTk9fRVJST1IpCi0JCWRyYmRfdGhyZWFkX3N0b3AoJmFkbV9jdHgudGNvbm4tPndvcmtlcik7CisJbGlzdF9kZWxfcmN1KCZyZXNvdXJjZS0+cmVzb3VyY2VzKTsKKwlmb3JfZWFjaF9jb25uZWN0aW9uKGNvbm5lY3Rpb24sIHJlc291cmNlKQorCQlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT53b3JrZXIpOworCXN5bmNocm9uaXplX3JjdSgpOworCWRyYmRfZnJlZV9yZXNvdXJjZShyZXNvdXJjZSk7CisJcmV0Y29kZSA9IE5PX0VSUk9SOwogb3V0OgogCWRyYmRfYWRtX2ZpbmlzaChpbmZvLCByZXRjb2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IHN0cnVjdCBzaWJfaW5mbyAqc2liKQordm9pZCBkcmJkX2JjYXN0X2V2ZW50KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBjb25zdCBzdHJ1Y3Qgc2liX2luZm8gKnNpYikKIHsKIAlzdGF0aWMgYXRvbWljX3QgZHJiZF9nZW5sX3NlcSA9IEFUT01JQ19JTklUKDIpOyAvKiB0d28uICovCiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKQEAgLTM0NDcsOCArMzUxMiw4IEBACiAJaW50IGVyciA9IC1FTk9NRU07CiAKIAlpZiAoc2liLT5zaWJfcmVhc29uID09IFNJQl9TWU5DX1BST0dSRVNTKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1kZXYtPnJzX2xhc3RfYmNhc3QgKyBIWikpCi0JCQltZGV2LT5yc19sYXN0X2JjYXN0ID0gamlmZmllczsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2aWNlLT5yc19sYXN0X2JjYXN0ICsgSFopKQorCQkJZGV2aWNlLT5yc19sYXN0X2JjYXN0ID0gamlmZmllczsKIAkJZWxzZQogCQkJcmV0dXJuOwogCX0KQEAgLTM0NjIsMTAgKzM1MjcsMTAgQEAKIAlkX291dCA9IGdlbmxtc2dfcHV0KG1zZywgMCwgc2VxLCAmZHJiZF9nZW5sX2ZhbWlseSwgMCwgRFJCRF9FVkVOVCk7CiAJaWYgKCFkX291dCkgLyogY2Fubm90IGhhcHBlbiwgYnV0IGFueXdheXMuICovCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWRfb3V0LT5taW5vciA9IG1kZXZfdG9fbWlub3IobWRldik7CisJZF9vdXQtPm1pbm9yID0gZGV2aWNlX3RvX21pbm9yKGRldmljZSk7CiAJZF9vdXQtPnJldF9jb2RlID0gTk9fRVJST1I7CiAKLQlpZiAobmxhX3B1dF9zdGF0dXNfaW5mbyhtc2csIG1kZXYsIHNpYikpCisJaWYgKG5sYV9wdXRfc3RhdHVzX2luZm8obXNnLCBkZXZpY2UsIHNpYikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWdlbmxtc2dfZW5kKG1zZywgZF9vdXQpOwogCWVyciA9IGRyYmRfZ2VubF9tdWx0aWNhc3RfZXZlbnRzKG1zZywgMCk7CkBAIC0zNDc4LDcgKzM1NDMsNyBAQAogbmxhX3B1dF9mYWlsdXJlOgogCW5sbXNnX2ZyZWUobXNnKTsKIGZhaWxlZDoKLQlkZXZfZXJyKERFViwgIkVycm9yICVkIHdoaWxlIGJyb2FkY2FzdGluZyBldmVudC4gIgorCWRyYmRfZXJyKGRldmljZSwgIkVycm9yICVkIHdoaWxlIGJyb2FkY2FzdGluZyBldmVudC4gIgogCQkJIkV2ZW50IHNlcToldSBzaWJfcmVhc29uOiV1XG4iLAogCQkJZXJyLCBzZXEsIHNpYi0+c2liX3JlYXNvbik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm9jLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm9jLmMKaW5kZXggYmYzMWQ0MS4uMmYyNmU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcHJvYy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3Byb2MuYwpAQCAtNDYsNyArNDYsNyBAQAogCS5yZWxlYXNlCT0gZHJiZF9wcm9jX3JlbGVhc2UsCiB9OwogCi12b2lkIHNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvbmcgdikKK3N0YXRpYyB2b2lkIHNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvbmcgdikKIHsKIAkvKiB2IGlzIGluIGtCL3NlYy4gV2UgZG9uJ3QgZXhwZWN0IFRpQnl0ZS9zZWMgeWV0LiAqLwogCWlmICh1bmxpa2VseSh2ID49IDEwMDAwMDApKSB7CkBAIC02NiwxNCArNjYsMTQgQEAKICAqCVs9PT09PT4uLi4uLi4uLi4uLi4uLl0gMzMuNSUgKDIzNDU2LzEyMzQ1NikKICAqCWZpbmlzaDogMjoyMDoyMCBzcGVlZDogNiwzNDUgKDYsNDU2KSBLL3NlYwogICovCi1zdGF0aWMgdm9pZCBkcmJkX3N5bmNlcl9wcm9ncmVzcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3N0YXRpYyB2b2lkIGRyYmRfc3luY2VyX3Byb2dyZXNzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKIHsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdCwgcnQsIHJzX2xlZnQ7CiAJdW5zaWduZWQgaW50IHJlczsKIAlpbnQgaSwgeCwgeTsKIAlpbnQgc3RhbGxlZCA9IDA7CiAKLQlkcmJkX2dldF9zeW5jZXJfcHJvZ3Jlc3MobWRldiwgJnJzX2xlZnQsICZyZXMpOworCWRyYmRfZ2V0X3N5bmNlcl9wcm9ncmVzcyhkZXZpY2UsICZyc19sZWZ0LCAmcmVzKTsKIAogCXggPSByZXMvNTA7CiAJeSA9IDIwLXg7CkBAIC04NSwyMSArODUsMjEgQEAKIAkJc2VxX3ByaW50ZihzZXEsICIuIik7CiAJc2VxX3ByaW50ZihzZXEsICJdICIpOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9UKQogCQlzZXFfcHJpbnRmKHNlcSwgInZlcmlmaWVkOiIpOwogCWVsc2UKIAkJc2VxX3ByaW50ZihzZXEsICJzeW5jJ2VkOiIpOwogCXNlcV9wcmludGYoc2VxLCAiJTN1LiV1JSUgIiwgcmVzIC8gMTAsIHJlcyAlIDEwKTsKIAogCS8qIGlmIG1vcmUgdGhhbiBhIGZldyBHQiwgZGlzcGxheSBpbiBNQiAqLwotCWlmIChtZGV2LT5yc190b3RhbCA+ICg0VUwgPDwgKDMwIC0gQk1fQkxPQ0tfU0hJRlQpKSkKKwlpZiAoZGV2aWNlLT5yc190b3RhbCA+ICg0VUwgPDwgKDMwIC0gQk1fQkxPQ0tfU0hJRlQpKSkKIAkJc2VxX3ByaW50ZihzZXEsICIoJWx1LyVsdSlNIiwKIAkJCSAgICAodW5zaWduZWQgbG9uZykgQml0MktCKHJzX2xlZnQgPj4gMTApLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IobWRldi0+cnNfdG90YWwgPj4gMTApKTsKKwkJCSAgICAodW5zaWduZWQgbG9uZykgQml0MktCKGRldmljZS0+cnNfdG90YWwgPj4gMTApKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiKCVsdS8lbHUpS1xuXHQiLAogCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IocnNfbGVmdCksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIEJpdDJLQihtZGV2LT5yc190b3RhbCkpOworCQkJICAgICh1bnNpZ25lZCBsb25nKSBCaXQyS0IoZGV2aWNlLT5yc190b3RhbCkpOwogCiAJLyogc2VlIGRyaXZlcnMvbWQvbWQuYwogCSAqIFdlIGRvIG5vdCB3YW50IHRvIG92ZXJmbG93LCBzbyB0aGUgb3JkZXIgb2Ygb3BlcmFuZHMgYW5kCkBAIC0xMTQsMTQgKzExNCwxNCBAQAogCSAqIGF0IGxlYXN0IChEUkJEX1NZTkNfTUFSS1MtMikqRFJCRF9TWU5DX01BUktfU1RFUCBvbGQsIGFuZCBoYXMgYXQKIAkgKiBsZWFzdCBEUkJEX1NZTkNfTUFSS19TVEVQIHRpbWUgYmVmb3JlIGl0IHdpbGwgYmUgbW9kaWZpZWQuICovCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIH4xOHMgYXZlcmFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIDIpICUgRFJCRF9TWU5DX01BUktTOwotCWR0ID0gKGppZmZpZXMgLSBtZGV2LT5yc19tYXJrX3RpbWVbaV0pIC8gSFo7CisJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIDIpICUgRFJCRF9TWU5DX01BUktTOworCWR0ID0gKGppZmZpZXMgLSBkZXZpY2UtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKIAlpZiAoZHQgPiAoRFJCRF9TWU5DX01BUktfU1RFUCAqIERSQkRfU1lOQ19NQVJLUykpCiAJCXN0YWxsZWQgPSAxOwogCiAJaWYgKCFkdCkKIAkJZHQrKzsKLQlkYiA9IG1kZXYtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CisJZGIgPSBkZXZpY2UtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CiAJcnQgPSAoZHQgKiAocnNfbGVmdCAvIChkYi8xMDArMSkpKS8xMDA7IC8qIHNlY29uZHMgKi8KIAogCXNlcV9wcmludGYoc2VxLCAiZmluaXNoOiAlbHU6JTAybHU6JTAybHUiLApAQCAtMTM0LDExICsxMzQsMTEgQEAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIH4zcyBhdmVyYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWlmIChwcm9jX2RldGFpbHMgPj0gMSkgewogCQkvKiB0aGlzIGlzIHdoYXQgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKCkgdXNlcyAqLwotCQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKLQkJZHQgPSAoamlmZmllcyAtIG1kZXYtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKKwkJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKKwkJZHQgPSAoamlmZmllcyAtIGRldmljZS0+cnNfbWFya190aW1lW2ldKSAvIEhaOwogCQlpZiAoIWR0KQogCQkJZHQrKzsKLQkJZGIgPSBtZGV2LT5yc19tYXJrX2xlZnRbaV0gLSByc19sZWZ0OworCQlkYiA9IGRldmljZS0+cnNfbWFya19sZWZ0W2ldIC0gcnNfbGVmdDsKIAkJZGJkdCA9IEJpdDJLQihkYi9kdCk7CiAJCXNlcV9wcmludGZfd2l0aF90aG91c2FuZHNfZ3JvdXBpbmcoc2VxLCBkYmR0KTsKIAkJc2VxX3ByaW50ZihzZXEsICIgLS0gIik7CkBAIC0xNDcsMzQgKzE0NywzNCBAQAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb25nIHRlcm0gYXZlcmFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJLyogbWVhbiBzcGVlZCBzaW5jZSBzeW5jZXIgc3RhcnRlZAogCSAqIHdlIGRvIGFjY291bnQgZm9yIFBhdXNlZFN5bmMgcGVyaW9kcyAqLwotCWR0ID0gKGppZmZpZXMgLSBtZGV2LT5yc19zdGFydCAtIG1kZXYtPnJzX3BhdXNlZCkgLyBIWjsKKwlkdCA9IChqaWZmaWVzIC0gZGV2aWNlLT5yc19zdGFydCAtIGRldmljZS0+cnNfcGF1c2VkKSAvIEhaOwogCWlmIChkdCA9PSAwKQogCQlkdCA9IDE7Ci0JZGIgPSBtZGV2LT5yc190b3RhbCAtIHJzX2xlZnQ7CisJZGIgPSBkZXZpY2UtPnJzX3RvdGFsIC0gcnNfbGVmdDsKIAlkYmR0ID0gQml0MktCKGRiL2R0KTsKIAlzZXFfcHJpbnRmX3dpdGhfdGhvdXNhbmRzX2dyb3VwaW5nKHNlcSwgZGJkdCk7CiAJc2VxX3ByaW50ZihzZXEsICIpIik7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8Ci0JICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUykgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAorCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUykgewogCQlzZXFfcHJpbnRmKHNlcSwgIiB3YW50OiAiKTsKLQkJc2VxX3ByaW50Zl93aXRoX3Rob3VzYW5kc19ncm91cGluZyhzZXEsIG1kZXYtPmNfc3luY19yYXRlKTsKKwkJc2VxX3ByaW50Zl93aXRoX3Rob3VzYW5kc19ncm91cGluZyhzZXEsIGRldmljZS0+Y19zeW5jX3JhdGUpOwogCX0KIAlzZXFfcHJpbnRmKHNlcSwgIiBLL3NlYyVzXG4iLCBzdGFsbGVkID8gIiAoc3RhbGxlZCkiIDogIiIpOwogCiAJaWYgKHByb2NfZGV0YWlscyA+PSAxKSB7CiAJCS8qIDY0IGJpdDoKIAkJICogd2UgY29udmVydCB0byBzZWN0b3JzIGluIHRoZSBkaXNwbGF5IGJlbG93LiAqLwotCQl1bnNpZ25lZCBsb25nIGJtX2JpdHMgPSBkcmJkX2JtX2JpdHMobWRldik7CisJCXVuc2lnbmVkIGxvbmcgYm1fYml0cyA9IGRyYmRfYm1fYml0cyhkZXZpY2UpOwogCQl1bnNpZ25lZCBsb25nIGJpdF9wb3M7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdG9wX3NlY3RvciA9IDA7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1MgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkgewotCQkJYml0X3BvcyA9IGJtX2JpdHMgLSBtZGV2LT5vdl9sZWZ0OwotCQkJaWYgKHZlcmlmeV9jYW5fZG9fc3RvcF9zZWN0b3IobWRldikpCi0JCQkJc3RvcF9zZWN0b3IgPSBtZGV2LT5vdl9zdG9wX3NlY3RvcjsKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkgeworCQkJYml0X3BvcyA9IGJtX2JpdHMgLSBkZXZpY2UtPm92X2xlZnQ7CisJCQlpZiAodmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihkZXZpY2UpKQorCQkJCXN0b3Bfc2VjdG9yID0gZGV2aWNlLT5vdl9zdG9wX3NlY3RvcjsKIAkJfSBlbHNlCi0JCQliaXRfcG9zID0gbWRldi0+Ym1fcmVzeW5jX2ZvOworCQkJYml0X3BvcyA9IGRldmljZS0+Ym1fcmVzeW5jX2ZvOwogCQkvKiBUb3RhbCBzZWN0b3JzIG1heSBiZSBzbGlnaHRseSBvZmYgZm9yIG9kZGx5CiAJCSAqIHNpemVkIGRldmljZXMuIFNvIHdoYXQuICovCiAJCXNlcV9wcmludGYoc2VxLApAQCAtMjAyLDcgKzIwMiw3IEBACiB7CiAJaW50IGksIHByZXZfaSA9IC0xOwogCWNvbnN0IGNoYXIgKnNuOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAljaGFyIHdwOwogCkBAIC0yMzYsNzIgKzIzNiw3MiBAQAogCSovCiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZtaW5vcnMsIG1kZXYsIGkpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgZGV2aWNlLCBpKSB7CiAJCWlmIChwcmV2X2kgIT0gaSAtIDEpCiAJCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CiAJCXByZXZfaSA9IGk7CiAKLQkJc24gPSBkcmJkX2Nvbm5fc3RyKG1kZXYtPnN0YXRlLmNvbm4pOworCQlzbiA9IGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKTsKIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYKLQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJgotCQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgeworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1RBTkRBTE9ORSAmJgorCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfRElTS0xFU1MgJiYKKwkJICAgIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1NFQ09OREFSWSkgewogCQkJc2VxX3ByaW50ZihzZXEsICIlMmQ6IGNzOlVuY29uZmlndXJlZFxuIiwgaSk7CiAJCX0gZWxzZSB7Ci0JCQkvKiByZXNldCBtZGV2LT5jb25nZXN0aW9uX3JlYXNvbiAqLwotCQkJYmRpX3J3X2Nvbmdlc3RlZCgmbWRldi0+cnFfcXVldWUtPmJhY2tpbmdfZGV2X2luZm8pOworCQkJLyogcmVzZXQgZGV2aWNlLT5jb25nZXN0aW9uX3JlYXNvbiAqLworCQkJYmRpX3J3X2Nvbmdlc3RlZCgmZGV2aWNlLT5ycV9xdWV1ZS0+YmFja2luZ19kZXZfaW5mbyk7CiAKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl3cCA9IG5jID8gbmMtPndpcmVfcHJvdG9jb2wgLSBEUkJEX1BST1RfQSArICdBJyA6ICcgJzsKIAkJCXNlcV9wcmludGYoc2VxLAogCQkJICAgIiUyZDogY3M6JXMgcm86JXMvJXMgZHM6JXMvJXMgJWMgJWMlYyVjJWMlYyVjXG4iCiAJCQkgICAiICAgIG5zOiV1IG5yOiV1IGR3OiV1IGRyOiV1IGFsOiV1IGJtOiV1ICIKIAkJCSAgICJsbzolZCBwZTolZCB1YTolZCBhcDolZCBlcDolZCB3bzolYyIsCiAJCQkgICBpLCBzbiwKLQkJCSAgIGRyYmRfcm9sZV9zdHIobWRldi0+c3RhdGUucm9sZSksCi0JCQkgICBkcmJkX3JvbGVfc3RyKG1kZXYtPnN0YXRlLnBlZXIpLAotCQkJICAgZHJiZF9kaXNrX3N0cihtZGV2LT5zdGF0ZS5kaXNrKSwKLQkJCSAgIGRyYmRfZGlza19zdHIobWRldi0+c3RhdGUucGRzayksCisJCQkgICBkcmJkX3JvbGVfc3RyKGRldmljZS0+c3RhdGUucm9sZSksCisJCQkgICBkcmJkX3JvbGVfc3RyKGRldmljZS0+c3RhdGUucGVlciksCisJCQkgICBkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUuZGlzayksCisJCQkgICBkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUucGRzayksCiAJCQkgICB3cCwKLQkJCSAgIGRyYmRfc3VzcGVuZGVkKG1kZXYpID8gJ3MnIDogJ3InLAotCQkJICAgbWRldi0+c3RhdGUuYWZ0cl9pc3AgPyAnYScgOiAnLScsCi0JCQkgICBtZGV2LT5zdGF0ZS5wZWVyX2lzcCA/ICdwJyA6ICctJywKLQkJCSAgIG1kZXYtPnN0YXRlLnVzZXJfaXNwID8gJ3UnIDogJy0nLAotCQkJICAgbWRldi0+Y29uZ2VzdGlvbl9yZWFzb24gPzogJy0nLAotCQkJICAgdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpID8gJ3MnIDogJy0nLAotCQkJICAgbWRldi0+c2VuZF9jbnQvMiwKLQkJCSAgIG1kZXYtPnJlY3ZfY250LzIsCi0JCQkgICBtZGV2LT53cml0X2NudC8yLAotCQkJICAgbWRldi0+cmVhZF9jbnQvMiwKLQkJCSAgIG1kZXYtPmFsX3dyaXRfY250LAotCQkJICAgbWRldi0+Ym1fd3JpdF9jbnQsCi0JCQkgICBhdG9taWNfcmVhZCgmbWRldi0+bG9jYWxfY250KSwKLQkJCSAgIGF0b21pY19yZWFkKCZtZGV2LT5hcF9wZW5kaW5nX2NudCkgKwotCQkJICAgYXRvbWljX3JlYWQoJm1kZXYtPnJzX3BlbmRpbmdfY250KSwKLQkJCSAgIGF0b21pY19yZWFkKCZtZGV2LT51bmFja2VkX2NudCksCi0JCQkgICBhdG9taWNfcmVhZCgmbWRldi0+YXBfYmlvX2NudCksCi0JCQkgICBtZGV2LT50Y29ubi0+ZXBvY2hzLAotCQkJICAgd3JpdGVfb3JkZXJpbmdfY2hhcnNbbWRldi0+dGNvbm4tPndyaXRlX29yZGVyaW5nXQorCQkJICAgZHJiZF9zdXNwZW5kZWQoZGV2aWNlKSA/ICdzJyA6ICdyJywKKwkJCSAgIGRldmljZS0+c3RhdGUuYWZ0cl9pc3AgPyAnYScgOiAnLScsCisJCQkgICBkZXZpY2UtPnN0YXRlLnBlZXJfaXNwID8gJ3AnIDogJy0nLAorCQkJICAgZGV2aWNlLT5zdGF0ZS51c2VyX2lzcCA/ICd1JyA6ICctJywKKwkJCSAgIGRldmljZS0+Y29uZ2VzdGlvbl9yZWFzb24gPzogJy0nLAorCQkJICAgdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncykgPyAncycgOiAnLScsCisJCQkgICBkZXZpY2UtPnNlbmRfY250LzIsCisJCQkgICBkZXZpY2UtPnJlY3ZfY250LzIsCisJCQkgICBkZXZpY2UtPndyaXRfY250LzIsCisJCQkgICBkZXZpY2UtPnJlYWRfY250LzIsCisJCQkgICBkZXZpY2UtPmFsX3dyaXRfY250LAorCQkJICAgZGV2aWNlLT5ibV93cml0X2NudCwKKwkJCSAgIGF0b21pY19yZWFkKCZkZXZpY2UtPmxvY2FsX2NudCksCisJCQkgICBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgKworCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+cnNfcGVuZGluZ19jbnQpLAorCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+dW5hY2tlZF9jbnQpLAorCQkJICAgYXRvbWljX3JlYWQoJmRldmljZS0+YXBfYmlvX2NudCksCisJCQkgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5lcG9jaHMsCisJCQkgICB3cml0ZV9vcmRlcmluZ19jaGFyc1tmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZ10KIAkJCSk7CiAJCQlzZXFfcHJpbnRmKHNlcSwgIiBvb3M6JWxsdVxuIiwKIAkJCQkgICBCaXQyS0IoKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkJICAgZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpKTsKKwkJCQkJICAgZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSkpOwogCQl9Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fAotCQkgICAgbWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCi0JCQlkcmJkX3N5bmNlcl9wcm9ncmVzcyhtZGV2LCBzZXEpOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19TT1VSQ0UgfHwKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUIHx8CisJCSAgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfUyB8fAorCQkgICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJCQlkcmJkX3N5bmNlcl9wcm9ncmVzcyhkZXZpY2UsIHNlcSk7CiAKLQkJaWYgKHByb2NfZGV0YWlscyA+PSAxICYmIGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkgewotCQkJbGNfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIG1kZXYtPnJlc3luYyk7Ci0JCQlsY19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgbWRldi0+YWN0X2xvZyk7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJaWYgKHByb2NfZGV0YWlscyA+PSAxICYmIGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCQlsY19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgZGV2aWNlLT5yZXN5bmMpOworCQkJbGNfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIGRldmljZS0+YWN0X2xvZyk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQl9CiAKIAkJaWYgKHByb2NfZGV0YWlscyA+PSAyKSB7Ci0JCQlpZiAobWRldi0+cmVzeW5jKSB7Ci0JCQkJbGNfc2VxX2R1bXBfZGV0YWlscyhzZXEsIG1kZXYtPnJlc3luYywgInJzX2xlZnQiLAorCQkJaWYgKGRldmljZS0+cmVzeW5jKSB7CisJCQkJbGNfc2VxX2R1bXBfZGV0YWlscyhzZXEsIGRldmljZS0+cmVzeW5jLCAicnNfbGVmdCIsCiAJCQkJCXJlc3luY19kdW1wX2RldGFpbCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3Byb3RvY29sLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDRlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMjk1IEBACisjaWZuZGVmIF9fRFJCRF9QUk9UT0NPTF9ICisjZGVmaW5lIF9fRFJCRF9QUk9UT0NPTF9ICisKK2VudW0gZHJiZF9wYWNrZXQgeworCS8qIHJlY2VpdmVyIChkYXRhIHNvY2tldCkgKi8KKwlQX0RBVEEJCSAgICAgID0gMHgwMCwKKwlQX0RBVEFfUkVQTFkJICAgICAgPSAweDAxLCAvKiBSZXNwb25zZSB0byBQX0RBVEFfUkVRVUVTVCAqLworCVBfUlNfREFUQV9SRVBMWQkgICAgICA9IDB4MDIsIC8qIFJlc3BvbnNlIHRvIFBfUlNfREFUQV9SRVFVRVNUICovCisJUF9CQVJSSUVSCSAgICAgID0gMHgwMywKKwlQX0JJVE1BUAkgICAgICA9IDB4MDQsCisJUF9CRUNPTUVfU1lOQ19UQVJHRVQgID0gMHgwNSwKKwlQX0JFQ09NRV9TWU5DX1NPVVJDRSAgPSAweDA2LAorCVBfVU5QTFVHX1JFTU9URQkgICAgICA9IDB4MDcsIC8qIFVzZWQgYXQgdmFyaW91cyB0aW1lcyB0byBoaW50IHRoZSBwZWVyICovCisJUF9EQVRBX1JFUVVFU1QJICAgICAgPSAweDA4LCAvKiBVc2VkIHRvIGFzayBmb3IgYSBkYXRhIGJsb2NrICovCisJUF9SU19EQVRBX1JFUVVFU1QgICAgID0gMHgwOSwgLyogVXNlZCB0byBhc2sgZm9yIGEgZGF0YSBibG9jayBmb3IgcmVzeW5jICovCisJUF9TWU5DX1BBUkFNCSAgICAgID0gMHgwYSwKKwlQX1BST1RPQ09MCSAgICAgID0gMHgwYiwKKwlQX1VVSURTCQkgICAgICA9IDB4MGMsCisJUF9TSVpFUwkJICAgICAgPSAweDBkLAorCVBfU1RBVEUJCSAgICAgID0gMHgwZSwKKwlQX1NZTkNfVVVJRAkgICAgICA9IDB4MGYsCisJUF9BVVRIX0NIQUxMRU5HRSAgICAgID0gMHgxMCwKKwlQX0FVVEhfUkVTUE9OU0UJICAgICAgPSAweDExLAorCVBfU1RBVEVfQ0hHX1JFUQkgICAgICA9IDB4MTIsCisKKwkvKiBhc2VuZGVyIChtZXRhIHNvY2tldCAqLworCVBfUElORwkJICAgICAgPSAweDEzLAorCVBfUElOR19BQ0sJICAgICAgPSAweDE0LAorCVBfUkVDVl9BQ0sJICAgICAgPSAweDE1LCAvKiBVc2VkIGluIHByb3RvY29sIEIgKi8KKwlQX1dSSVRFX0FDSwkgICAgICA9IDB4MTYsIC8qIFVzZWQgaW4gcHJvdG9jb2wgQyAqLworCVBfUlNfV1JJVEVfQUNLCSAgICAgID0gMHgxNywgLyogSXMgYSBQX1dSSVRFX0FDSywgYWRkaXRpb25hbGx5IGNhbGwgc2V0X2luX3N5bmMoKS4gKi8KKwlQX1NVUEVSU0VERUQJICAgICAgPSAweDE4LCAvKiBVc2VkIGluIHByb3RvIEMsIHR3by1wcmltYXJpZXMgY29uZmxpY3QgZGV0ZWN0aW9uICovCisJUF9ORUdfQUNLCSAgICAgID0gMHgxOSwgLyogU2VudCBpZiBsb2NhbCBkaXNrIGlzIHVudXNhYmxlICovCisJUF9ORUdfRFJFUExZCSAgICAgID0gMHgxYSwgLyogTG9jYWwgZGlzayBpcyBicm9rZW4uLi4gKi8KKwlQX05FR19SU19EUkVQTFkJICAgICAgPSAweDFiLCAvKiBMb2NhbCBkaXNrIGlzIGJyb2tlbi4uLiAqLworCVBfQkFSUklFUl9BQ0sJICAgICAgPSAweDFjLAorCVBfU1RBVEVfQ0hHX1JFUExZICAgICA9IDB4MWQsCisKKwkvKiAibmV3IiBjb21tYW5kcywgbm8gbG9uZ2VyIGZpdHRpbmcgaW50byB0aGUgb3JkZXJpbmcgc2NoZW1lIGFib3ZlICovCisKKwlQX09WX1JFUVVFU1QJICAgICAgPSAweDFlLCAvKiBkYXRhIHNvY2tldCAqLworCVBfT1ZfUkVQTFkJICAgICAgPSAweDFmLAorCVBfT1ZfUkVTVUxUCSAgICAgID0gMHgyMCwgLyogbWV0YSBzb2NrZXQgKi8KKwlQX0NTVU1fUlNfUkVRVUVTVCAgICAgPSAweDIxLCAvKiBkYXRhIHNvY2tldCAqLworCVBfUlNfSVNfSU5fU1lOQwkgICAgICA9IDB4MjIsIC8qIG1ldGEgc29ja2V0ICovCisJUF9TWU5DX1BBUkFNODkJICAgICAgPSAweDIzLCAvKiBkYXRhIHNvY2tldCwgcHJvdG9jb2wgdmVyc2lvbiA4OSByZXBsYWNlbWVudCBmb3IgUF9TWU5DX1BBUkFNICovCisJUF9DT01QUkVTU0VEX0JJVE1BUCAgID0gMHgyNCwgLyogY29tcHJlc3NlZCBvciBvdGhlcndpc2UgZW5jb2RlZCBiaXRtYXAgdHJhbnNmZXIgKi8KKwkvKiBQX0NLUFRfRkVOQ0VfUkVRICAgICAgPSAweDI1LCAqIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgcHJvdG9jb2wgRCAqLworCS8qIFBfQ0tQVF9ESVNBQkxFX1JFUSAgICA9IDB4MjYsICogY3VycmVudGx5IHJlc2VydmVkIGZvciBwcm90b2NvbCBEICovCisJUF9ERUxBWV9QUk9CRSAgICAgICAgID0gMHgyNywgLyogaXMgdXNlZCBvbiBCT1RIIHNvY2tldHMgKi8KKwlQX09VVF9PRl9TWU5DICAgICAgICAgPSAweDI4LCAvKiBNYXJrIGFzIG91dCBvZiBzeW5jIChPdXRydW5uaW5nKSwgZGF0YSBzb2NrZXQgKi8KKwlQX1JTX0NBTkNFTCAgICAgICAgICAgPSAweDI5LCAvKiBtZXRhOiBVc2VkIHRvIGNhbmNlbCBSU19EQVRBX1JFUVVFU1QgcGFja2V0IGJ5IFN5bmNTb3VyY2UgKi8KKwlQX0NPTk5fU1RfQ0hHX1JFUSAgICAgPSAweDJhLCAvKiBkYXRhIHNvY2s6IENvbm5lY3Rpb24gd2lkZSBzdGF0ZSByZXF1ZXN0ICovCisJUF9DT05OX1NUX0NIR19SRVBMWSAgID0gMHgyYiwgLyogbWV0YSBzb2NrOiBDb25uZWN0aW9uIHNpZGUgc3RhdGUgcmVxIHJlcGx5ICovCisJUF9SRVRSWV9XUklURQkgICAgICA9IDB4MmMsIC8qIFByb3RvY29sIEM6IHJldHJ5IGNvbmZsaWN0aW5nIHdyaXRlIHJlcXVlc3QgKi8KKwlQX1BST1RPQ09MX1VQREFURSAgICAgPSAweDJkLCAvKiBkYXRhIHNvY2s6IGlzIHVzZWQgaW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMgKi8KKworCVBfTUFZX0lHTk9SRQkgICAgICA9IDB4MTAwLCAvKiBGbGFnIHRvIHRlc3QgaWYgKGNtZCA+IFBfTUFZX0lHTk9SRSkgLi4uICovCisJUF9NQVhfT1BUX0NNRAkgICAgICA9IDB4MTAxLAorCisJLyogc3BlY2lhbCBjb21tYW5kIGlkcyBmb3IgaGFuZHNoYWtlICovCisKKwlQX0lOSVRJQUxfTUVUQQkgICAgICA9IDB4ZmZmMSwgLyogRmlyc3QgUGFja2V0IG9uIHRoZSBNZXRhU29jayAqLworCVBfSU5JVElBTF9EQVRBCSAgICAgID0gMHhmZmYyLCAvKiBGaXJzdCBQYWNrZXQgb24gdGhlIFNvY2tldCAqLworCisJUF9DT05ORUNUSU9OX0ZFQVRVUkVTID0gMHhmZmZlCS8qIEZJWEVEIGZvciB0aGUgbmV4dCBjZW50dXJ5ISAqLworfTsKKworI2lmbmRlZiBfX3BhY2tlZAorI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGxheW91dCBmb3IgYSBwYWNrZXQgb24gdGhlIHdpcmUuCisgKiBUaGUgYnl0ZW9yZGVyIGlzIHRoZSBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAgICAgKGV4Y2VwdCBibG9ja19pZCBhbmQgYmFycmllciBmaWVsZHMuCisgKgl0aGVzZSBhcmUgcG9pbnRlcnMgdG8gbG9jYWwgc3RydWN0cworICoJYW5kIGhhdmUgbm8gcmVsZXZhbmNlIGZvciB0aGUgcGFydG5lciwKKyAqCXdoaWNoIGp1c3QgZWNob2VzIHRoZW0gYXMgcmVjZWl2ZWQuKQorICoKKyAqIE5PVEUgdGhhdCB0aGUgcGF5bG9hZCBzdGFydHMgYXQgYSBsb25nIGFsaWduZWQgb2Zmc2V0LAorICogcmVnYXJkbGVzcyBvZiAzMiBvciA2NCBiaXQgYXJjaCEKKyAqLworc3RydWN0IHBfaGVhZGVyODAgeworCXUzMgkgIG1hZ2ljOworCXUxNgkgIGNvbW1hbmQ7CisJdTE2CSAgbGVuZ3RoOwkvKiBieXRlcyBvZiBkYXRhIGFmdGVyIHRoaXMgaGVhZGVyICovCit9IF9fcGFja2VkOworCisvKiBIZWFkZXIgZm9yIGJpZyBwYWNrZXRzLCBVc2VkIGZvciBkYXRhIHBhY2tldHMgZXhjZWVkaW5nIDY0a0IgKi8KK3N0cnVjdCBwX2hlYWRlcjk1IHsKKwl1MTYJICBtYWdpYzsJLyogdXNlIERSQkRfTUFHSUNfQklHIGhlcmUgKi8KKwl1MTYJICBjb21tYW5kOworCXUzMgkgIGxlbmd0aDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2hlYWRlcjEwMCB7CisJdTMyCSAgbWFnaWM7CisJdTE2CSAgdm9sdW1lOworCXUxNgkgIGNvbW1hbmQ7CisJdTMyCSAgbGVuZ3RoOworCXUzMgkgIHBhZDsKK30gX19wYWNrZWQ7CisKKy8qIHRoZXNlIGRlZmluZXMgbXVzdCBub3QgYmUgY2hhbmdlZCB3aXRob3V0IGNoYW5naW5nIHRoZSBwcm90b2NvbCB2ZXJzaW9uICovCisjZGVmaW5lIERQX0hBUkRCQVJSSUVSCSAgICAgIDEgLyogZGVwcmljYXRlZCAqLworI2RlZmluZSBEUF9SV19TWU5DCSAgICAgIDIgLyogZXF1YWxzIFJFUV9TWU5DICAgICovCisjZGVmaW5lIERQX01BWV9TRVRfSU5fU1lOQyAgICA0CisjZGVmaW5lIERQX1VOUExVRyAgICAgICAgICAgICA4IC8qIG5vdCB1c2VkIGFueW1vcmUgICAqLworI2RlZmluZSBEUF9GVUEgICAgICAgICAgICAgICAxNiAvKiBlcXVhbHMgUkVRX0ZVQSAgICAgKi8KKyNkZWZpbmUgRFBfRkxVU0ggICAgICAgICAgICAgMzIgLyogZXF1YWxzIFJFUV9GTFVTSCAgICovCisjZGVmaW5lIERQX0RJU0NBUkQgICAgICAgICAgIDY0IC8qIGVxdWFscyBSRVFfRElTQ0FSRCAqLworI2RlZmluZSBEUF9TRU5EX1JFQ0VJVkVfQUNLIDEyOCAvKiBUaGlzIGlzIGEgcHJvdG8gQiB3cml0ZSByZXF1ZXN0ICovCisjZGVmaW5lIERQX1NFTkRfV1JJVEVfQUNLICAgMjU2IC8qIFRoaXMgaXMgYSBwcm90byBDIHdyaXRlIHJlcXVlc3QgKi8KKworc3RydWN0IHBfZGF0YSB7CisJdTY0CSAgICBzZWN0b3I7ICAgIC8qIDY0IGJpdHMgc2VjdG9yIG51bWJlciAqLworCXU2NAkgICAgYmxvY2tfaWQ7ICAvKiB0byBpZGVudGlmeSB0aGUgcmVxdWVzdCBpbiBwcm90b2NvbCBCJkMgKi8KKwl1MzIJICAgIHNlcV9udW07CisJdTMyCSAgICBkcF9mbGFnczsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBjb21tYW5kcyB3aGljaCBzaGFyZSBhIHN0cnVjdDoKKyAqICBwX2Jsb2NrX2FjazoKKyAqICAgUF9SRUNWX0FDSyAocHJvdG8gQiksIFBfV1JJVEVfQUNLIChwcm90byBDKSwKKyAqICAgUF9TVVBFUlNFREVEIChwcm90byBDLCB0d28tcHJpbWFyaWVzIGNvbmZsaWN0IGRldGVjdGlvbikKKyAqICBwX2Jsb2NrX3JlcToKKyAqICAgUF9EQVRBX1JFUVVFU1QsIFBfUlNfREFUQV9SRVFVRVNUCisgKi8KK3N0cnVjdCBwX2Jsb2NrX2FjayB7CisJdTY0CSAgICBzZWN0b3I7CisJdTY0CSAgICBibG9ja19pZDsKKwl1MzIJICAgIGJsa3NpemU7CisJdTMyCSAgICBzZXFfbnVtOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfYmxvY2tfcmVxIHsKKwl1NjQgc2VjdG9yOworCXU2NCBibG9ja19pZDsKKwl1MzIgYmxrc2l6ZTsKKwl1MzIgcGFkOwkvKiB0byBtdWx0aXBsZSBvZiA4IEJ5dGUgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBjb21tYW5kcyB3aXRoIHRoZWlyIG93biBzdHJ1Y3QgZm9yIGFkZGl0aW9uYWwgZmllbGRzOgorICogICBQX0NPTk5FQ1RJT05fRkVBVFVSRVMKKyAqICAgUF9CQVJSSUVSCisgKiAgIFBfQkFSUklFUl9BQ0sKKyAqICAgUF9TWU5DX1BBUkFNCisgKiAgIFJlcG9ydFBhcmFtcworICovCisKK3N0cnVjdCBwX2Nvbm5lY3Rpb25fZmVhdHVyZXMgeworCXUzMiBwcm90b2NvbF9taW47CisJdTMyIGZlYXR1cmVfZmxhZ3M7CisJdTMyIHByb3RvY29sX21heDsKKworCS8qIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoIGZvciBmdXR1cmUgZW5oYW5jZW1lbnRzCisJICogZm9yIG5vdywgZmVhdHVyZV9mbGFncyBhbmQgdGhlIHJlc2VydmVkIGFycmF5IHNoYWxsIGJlIHplcm8uCisJICovCisKKwl1MzIgX3BhZDsKKwl1NjQgcmVzZXJ2ZWRbN107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9iYXJyaWVyIHsKKwl1MzIgYmFycmllcjsJLyogYmFycmllciBudW1iZXIgX2hhbmRsZV8gb25seSAqLworCXUzMiBwYWQ7CS8qIHRvIG11bHRpcGxlIG9mIDggQnl0ZSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfYmFycmllcl9hY2sgeworCXUzMiBiYXJyaWVyOworCXUzMiBzZXRfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3JzX3BhcmFtIHsKKwl1MzIgcmVzeW5jX3JhdGU7CisKKwkgICAgICAvKiBTaW5jZSBwcm90b2NvbCB2ZXJzaW9uIDg4IGFuZCBoaWdoZXIuICovCisJY2hhciB2ZXJpZnlfYWxnWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcnNfcGFyYW1fODkgeworCXUzMiByZXN5bmNfcmF0ZTsKKwkvKiBwcm90b2NvbCB2ZXJzaW9uIDg5OiAqLworCWNoYXIgdmVyaWZ5X2FsZ1tTSEFSRURfU0VDUkVUX01BWF07CisJY2hhciBjc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcnNfcGFyYW1fOTUgeworCXUzMiByZXN5bmNfcmF0ZTsKKwljaGFyIHZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVhdOworCWNoYXIgY3N1bXNfYWxnW1NIQVJFRF9TRUNSRVRfTUFYXTsKKwl1MzIgY19wbGFuX2FoZWFkOworCXUzMiBjX2RlbGF5X3RhcmdldDsKKwl1MzIgY19maWxsX3RhcmdldDsKKwl1MzIgY19tYXhfcmF0ZTsKK30gX19wYWNrZWQ7CisKK2VudW0gZHJiZF9jb25uX2ZsYWdzIHsKKwlDRl9ESVNDQVJEX01ZX0RBVEEgPSAxLAorCUNGX0RSWV9SVU4gPSAyLAorfTsKKworc3RydWN0IHBfcHJvdG9jb2wgeworCXUzMiBwcm90b2NvbDsKKwl1MzIgYWZ0ZXJfc2JfMHA7CisJdTMyIGFmdGVyX3NiXzFwOworCXUzMiBhZnRlcl9zYl8ycDsKKwl1MzIgY29ubl9mbGFnczsKKwl1MzIgdHdvX3ByaW1hcmllczsKKworCS8qIFNpbmNlIHByb3RvY29sIHZlcnNpb24gODcgYW5kIGhpZ2hlci4gKi8KKwljaGFyIGludGVncml0eV9hbGdbMF07CisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3V1aWRzIHsKKwl1NjQgdXVpZFtVSV9FWFRFTkRFRF9TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3JzX3V1aWQgeworCXU2NAkgICAgdXVpZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3NpemVzIHsKKwl1NjQJICAgIGRfc2l6ZTsgIC8qIHNpemUgb2YgZGlzayAqLworCXU2NAkgICAgdV9zaXplOyAgLyogdXNlciByZXF1ZXN0ZWQgc2l6ZSAqLworCXU2NAkgICAgY19zaXplOyAgLyogY3VycmVudCBleHBvcnRlZCBzaXplICovCisJdTMyCSAgICBtYXhfYmlvX3NpemU7ICAvKiBNYXhpbWFsIHNpemUgb2YgYSBCSU8gKi8KKwl1MTYJICAgIHF1ZXVlX29yZGVyX3R5cGU7ICAvKiBub3QgeWV0IGltcGxlbWVudGVkIGluIERSQkQqLworCXUxNgkgICAgZGRzX2ZsYWdzOyAvKiB1c2UgZW51bSBkZHNfZmxhZ3MgaGVyZS4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX3N0YXRlIHsKKwl1MzIJICAgIHN0YXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBfcmVxX3N0YXRlIHsKKwl1MzIJICAgIG1hc2s7CisJdTMyCSAgICB2YWw7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgeworCXUzMgkgICAgcmV0Y29kZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2RyYmQwNl9wYXJhbSB7CisJdTY0CSAgc2l6ZTsKKwl1MzIJICBzdGF0ZTsKKwl1MzIJICBibGtzaXplOworCXUzMgkgIHByb3RvY29sOworCXUzMgkgIHZlcnNpb247CisJdTMyCSAgZ2VuX2NudFs1XTsKKwl1MzIJICBiaXRfbWFwX2dlbls1XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwX2Jsb2NrX2Rlc2MgeworCXU2NCBzZWN0b3I7CisJdTMyIGJsa3NpemU7CisJdTMyIHBhZDsJLyogdG8gbXVsdGlwbGUgb2YgOCBCeXRlICovCit9IF9fcGFja2VkOworCisvKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBlbmNvZGluZyBmaWVsZC4KKyAqIEJ1bXAgcHJvdG8gdmVyc2lvbiB3aGVuIGNoYW5naW5nIHRoaXMuICovCitlbnVtIGRyYmRfYml0bWFwX2NvZGUgeworCS8qIFJMRV9WTElfQnl0ZXMgPSAwLAorCSAqIGFuZCBvdGhlciBiaXQgdmFyaWFudHMgaGFkIGJlZW4gZGVmaW5lZCBkdXJpbmcKKwkgKiBhbGdvcml0aG0gZXZhbHVhdGlvbi4gKi8KKwlSTEVfVkxJX0JpdHMgPSAyLAorfTsKKworc3RydWN0IHBfY29tcHJlc3NlZF9ibSB7CisJLyogKGVuY29kaW5nICYgMHgwZik6IGFjdHVhbCBlbmNvZGluZywgc2VlIGVudW0gZHJiZF9iaXRtYXBfY29kZQorCSAqIChlbmNvZGluZyAmIDB4ODApOiBwb2xhcml0eSAoc2V0L3Vuc2V0KSBvZiBmaXJzdCBydW5sZW5ndGgKKwkgKiAoKGVuY29kaW5nID4+IDQpICYgMHgwNyk6IHBhZF9iaXRzLCBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzCisJICogdXNlZCB0byBwYWQgdXAgdG8gaGVhZC5sZW5ndGggYnl0ZXMKKwkgKi8KKwl1OCBlbmNvZGluZzsKKworCXU4IGNvZGVbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcF9kZWxheV9wcm9iZTkzIHsKKwl1MzIgICAgIHNlcV9udW07IC8qIHNlcXVlbmNlIG51bWJlciB0byBtYXRjaCB0aGUgdHdvIHByb2JlIHBhY2tldHMgKi8KKwl1MzIgICAgIG9mZnNldDsgIC8qIHVzZWNzIHRoZSBwcm9iZSBnb3Qgc2VudCBhZnRlciB0aGUgcmVmZXJlbmNlIHRpbWUgcG9pbnQgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBCaXRtYXAgcGFja2V0cyBuZWVkIHRvIGZpdCB3aXRoaW4gYSBzaW5nbGUgcGFnZSBvbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciwKKyAqIHNvIHdlIGFyZSBsaW1pdGVkIHRvIDQgS2lCIChhbmQgbm90IHRvIFBBR0VfU0laRSwgd2hpY2ggY2FuIGJlIGJpZ2dlcikuCisgKi8KKyNkZWZpbmUgRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgNDA5NgorCisjZW5kaWYgIC8qIF9fRFJCRF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYwppbmRleCBkMDczMzA1Li4xOGM3NmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgImRyYmRfaW50LmgiCisjaW5jbHVkZSAiZHJiZF9wcm90b2NvbC5oIgogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKICNpbmNsdWRlICJkcmJkX3ZsaS5oIgpAQCAtNjEsMTEgKzYyLDExIEBACiAJRkVfUkVDWUNMRUQsCiB9OwogCi1zdGF0aWMgaW50IGRyYmRfZG9fZmVhdHVyZXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLXN0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1zdGF0aWMgaW50IGRyYmRfZGlzY29ubmVjdGVkKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOworc3RhdGljIGludCBkcmJkX2RvX2ZlYXR1cmVzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitzdGF0aWMgaW50IGRyYmRfZGlzY29ubmVjdGVkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICopOwogCi1zdGF0aWMgZW51bSBmaW5pc2hfZXBvY2ggZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHN0cnVjdCBkcmJkX3Rjb25uICosIHN0cnVjdCBkcmJkX2Vwb2NoICosIGVudW0gZXBvY2hfZXZlbnQpOworc3RhdGljIGVudW0gZmluaXNoX2Vwb2NoIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICosIHN0cnVjdCBkcmJkX2Vwb2NoICosIGVudW0gZXBvY2hfZXZlbnQpOwogc3RhdGljIGludCBlX2VuZF9ibG9jayhzdHJ1Y3QgZHJiZF93b3JrICosIGludCk7CiAKIApAQCAtMTUwLDcgKzE1MSw3IEBACiAJKmhlYWQgPSBjaGFpbl9maXJzdDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpfX2RyYmRfYWxsb2NfcGFnZXMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqX19kcmJkX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKQEAgLTE5Niw0MSArMTk3LDM5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICp0b19iZV9mcmVlZCkKIHsKLQlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxlLCAqdGxlOworCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsICp0bXA7CiAKIAkvKiBUaGUgRUVzIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gU2luY2UKIAkgICB0aGV5IGFyZSBzZW50IGluIG9yZGVyIG92ZXIgdGhlIHdpcmUsIHRoZXkgaGF2ZSB0byBmaW5pc2gKIAkgICBpbiBvcmRlci4gQXMgc29vbiBhcyB3ZSBzZWUgdGhlIGZpcnN0IG5vdCBmaW5pc2hlZCB3ZSBjYW4KIAkgICBzdG9wIHRvIGV4YW1pbmUgdGhlIGxpc3QuLi4gKi8KIAotCWxpc3RfZm9yX2VhY2hfc2FmZShsZSwgdGxlLCAmbWRldi0+bmV0X2VlKSB7Ci0JCXBlZXJfcmVxID0gbGlzdF9lbnRyeShsZSwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3Lmxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZWVyX3JlcSwgdG1wLCAmZGV2aWNlLT5uZXRfZWUsIHcubGlzdCkgewogCQlpZiAoZHJiZF9wZWVyX3JlcV9oYXNfYWN0aXZlX3BhZ2UocGVlcl9yZXEpKQogCQkJYnJlYWs7Ci0JCWxpc3RfbW92ZShsZSwgdG9fYmVfZnJlZWQpOworCQlsaXN0X21vdmUoJnBlZXJfcmVxLT53Lmxpc3QsIHRvX2JlX2ZyZWVkKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfa2lja19sb19hbmRfcmVjbGFpbV9uZXQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIGRyYmRfa2lja19sb19hbmRfcmVjbGFpbV9uZXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJTElTVF9IRUFEKHJlY2xhaW1lZCk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgKnQ7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhtZGV2LCAmcmVjbGFpbWVkKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlY2xhaW1fZmluaXNoZWRfbmV0X3BlZXJfcmVxcyhkZXZpY2UsICZyZWNsYWltZWQpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfcmVxLCB0LCAmcmVjbGFpbWVkLCB3Lmxpc3QpCi0JCWRyYmRfZnJlZV9uZXRfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfbmV0X3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogfQogCiAvKioKICAqIGRyYmRfYWxsb2NfcGFnZXMoKSAtIFJldHVybnMgQG51bWJlciBwYWdlcywgcmV0cmllcyBmb3JldmVyIChvciB1bnRpbCBzaWduYWxsZWQpCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBudW1iZXI6CW51bWJlciBvZiBwYWdlcyByZXF1ZXN0ZWQKICAqIEByZXRyeToJd2hldGhlciB0byByZXRyeSwgaWYgbm90IGVub3VnaCBwYWdlcyBhcmUgYXZhaWxhYmxlIHJpZ2h0IG5vdwogICoKQEAgLTI0MCw5ICsyMzksMTAgQEAKICAqCiAgKiBSZXR1cm5zIGEgcGFnZSBjaGFpbiBsaW5rZWQgdmlhIHBhZ2UtPnByaXZhdGUuCiAgKi8KLXN0cnVjdCBwYWdlICpkcmJkX2FsbG9jX3BhZ2VzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBudW1iZXIsCitzdHJ1Y3QgcGFnZSAqZHJiZF9hbGxvY19wYWdlcyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHVuc2lnbmVkIGludCBudW1iZXIsCiAJCQkgICAgICBib29sIHJldHJ5KQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKQEAgLTI1MSwyMCArMjUxLDIwIEBACiAJLyogWWVzLCB3ZSBtYXkgcnVuIHVwIHRvIEBudW1iZXIgb3ZlciBtYXhfYnVmZmVycy4gSWYgd2UKIAkgKiBmb2xsb3cgaXQgc3RyaWN0bHksIHRoZSBhZG1pbiB3aWxsIGdldCBpdCB3cm9uZyBhbnl3YXlzLiAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJbXhiID0gbmMgPyBuYy0+bWF4X2J1ZmZlcnMgOiAxMDAwMDAwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKGF0b21pY19yZWFkKCZtZGV2LT5wcF9pbl91c2UpIDwgbXhiKQotCQlwYWdlID0gX19kcmJkX2FsbG9jX3BhZ2VzKG1kZXYsIG51bWJlcik7CisJaWYgKGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZSkgPCBteGIpCisJCXBhZ2UgPSBfX2RyYmRfYWxsb2NfcGFnZXMoZGV2aWNlLCBudW1iZXIpOwogCiAJd2hpbGUgKHBhZ2UgPT0gTlVMTCkgewogCQlwcmVwYXJlX3RvX3dhaXQoJmRyYmRfcHBfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkJZHJiZF9raWNrX2xvX2FuZF9yZWNsYWltX25ldChtZGV2KTsKKwkJZHJiZF9raWNrX2xvX2FuZF9yZWNsYWltX25ldChkZXZpY2UpOwogCi0JCWlmIChhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlKSA8IG14YikgewotCQkJcGFnZSA9IF9fZHJiZF9hbGxvY19wYWdlcyhtZGV2LCBudW1iZXIpOworCQlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+cHBfaW5fdXNlKSA8IG14YikgeworCQkJcGFnZSA9IF9fZHJiZF9hbGxvY19wYWdlcyhkZXZpY2UsIG51bWJlcik7CiAJCQlpZiAocGFnZSkKIAkJCQlicmVhazsKIAkJfQpAQCAtMjczLDcgKzI3Myw3IEBACiAJCQlicmVhazsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCWRldl93YXJuKERFViwgImRyYmRfYWxsb2NfcGFnZXMgaW50ZXJydXB0ZWQhXG4iKTsKKwkJCWRyYmRfd2FybihkZXZpY2UsICJkcmJkX2FsbG9jX3BhZ2VzIGludGVycnVwdGVkIVxuIik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yODIsMTcgKzI4MiwxNyBAQAogCWZpbmlzaF93YWl0KCZkcmJkX3BwX3dhaXQsICZ3YWl0KTsKIAogCWlmIChwYWdlKQotCQlhdG9taWNfYWRkKG51bWJlciwgJm1kZXYtPnBwX2luX3VzZSk7CisJCWF0b21pY19hZGQobnVtYmVyLCAmZGV2aWNlLT5wcF9pbl91c2UpOwogCXJldHVybiBwYWdlOwogfQogCiAvKiBNdXN0IG5vdCBiZSB1c2VkIGZyb20gaXJxLCBhcyB0aGF0IG1heSBkZWFkbG9jazogc2VlIGRyYmRfYWxsb2NfcGFnZXMuCi0gKiBJcyBhbHNvIHVzZWQgZnJvbSBpbnNpZGUgYW4gb3RoZXIgc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKyAqIElzIGFsc28gdXNlZCBmcm9tIGluc2lkZSBhbiBvdGhlciBzcGluX2xvY2tfaXJxKCZyZXNvdXJjZS0+cmVxX2xvY2spOwogICogRWl0aGVyIGxpbmtzIHRoZSBwYWdlIGNoYWluIGJhY2sgdG8gdGhlIGdsb2JhbCBwb29sLAogICogb3IgcmV0dXJucyBhbGwgcGFnZXMgdG8gdGhlIHN5c3RlbS4gKi8KLXN0YXRpYyB2b2lkIGRyYmRfZnJlZV9wYWdlcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGlzX25ldCkKK3N0YXRpYyB2b2lkIGRyYmRfZnJlZV9wYWdlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBpc19uZXQpCiB7Ci0JYXRvbWljX3QgKmEgPSBpc19uZXQgPyAmbWRldi0+cHBfaW5fdXNlX2J5X25ldCA6ICZtZGV2LT5wcF9pbl91c2U7CisJYXRvbWljX3QgKmEgPSBpc19uZXQgPyAmZGV2aWNlLT5wcF9pbl91c2VfYnlfbmV0IDogJmRldmljZS0+cHBfaW5fdXNlOwogCWludCBpOwogCiAJaWYgKHBhZ2UgPT0gTlVMTCkKQEAgLTMxMCw3ICszMTAsNyBAQAogCX0KIAlpID0gYXRvbWljX3N1Yl9yZXR1cm4oaSwgYSk7CiAJaWYgKGkgPCAwKQotCQlkZXZfd2FybihERVYsICJBU1NFUlRJT04gRkFJTEVEOiAlczogJWQgPCAwXG4iLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiQVNTRVJUSU9OIEZBSUxFRDogJXM6ICVkIDwgMFxuIiwKIAkJCWlzX25ldCA/ICJwcF9pbl91c2VfYnlfbmV0IiA6ICJwcF9pbl91c2UiLCBpKTsKIAl3YWtlX3VwKCZkcmJkX3BwX3dhaXQpOwogfQpAQCAtMzMwLDI1ICszMzAsMjYgQEAKICovCiAKIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqCi1kcmJkX2FsbG9jX3BlZXJfcmVxKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHU2NCBpZCwgc2VjdG9yX3Qgc2VjdG9yLAorZHJiZF9hbGxvY19wZWVyX3JlcShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHU2NCBpZCwgc2VjdG9yX3Qgc2VjdG9yLAogCQkgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2spIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAl1bnNpZ25lZCBucl9wYWdlcyA9IChkYXRhX3NpemUgKyBQQUdFX1NJWkUgLTEpID4+IFBBR0VfU0hJRlQ7CiAKLQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwgRFJCRF9GQVVMVF9BTF9FRSkpCisJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgRFJCRF9GQVVMVF9BTF9FRSkpCiAJCXJldHVybiBOVUxMOwogCiAJcGVlcl9yZXEgPSBtZW1wb29sX2FsbG9jKGRyYmRfZWVfbWVtcG9vbCwgZ2ZwX21hc2sgJiB+X19HRlBfSElHSE1FTSk7CiAJaWYgKCFwZWVyX3JlcSkgewogCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX05PV0FSTikpCi0JCQlkZXZfZXJyKERFViwgIiVzOiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZHJiZF9lcnIoZGV2aWNlLCAiJXM6IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmIChkYXRhX3NpemUpIHsKLQkJcGFnZSA9IGRyYmRfYWxsb2NfcGFnZXMobWRldiwgbnJfcGFnZXMsIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKTsKKwkJcGFnZSA9IGRyYmRfYWxsb2NfcGFnZXMocGVlcl9kZXZpY2UsIG5yX3BhZ2VzLCAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSk7CiAJCWlmICghcGFnZSkKIAkJCWdvdG8gZmFpbDsKIAl9CkBAIC0zNjAsNyArMzYxLDcgQEAKIAlwZWVyX3JlcS0+aS53YWl0aW5nID0gZmFsc2U7CiAKIAlwZWVyX3JlcS0+ZXBvY2ggPSBOVUxMOwotCXBlZXJfcmVxLT53Lm1kZXYgPSBtZGV2OworCXBlZXJfcmVxLT5wZWVyX2RldmljZSA9IHBlZXJfZGV2aWNlOwogCXBlZXJfcmVxLT5wYWdlcyA9IHBhZ2U7CiAJYXRvbWljX3NldCgmcGVlcl9yZXEtPnBlbmRpbmdfYmlvcywgMCk7CiAJcGVlcl9yZXEtPmZsYWdzID0gMDsKQEAgLTM3NywzMCArMzc4LDMwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwKK3ZvaWQgX19kcmJkX2ZyZWVfcGVlcl9yZXEoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsCiAJCSAgICAgICBpbnQgaXNfbmV0KQogewogCWlmIChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9IQVNfRElHRVNUKQogCQlrZnJlZShwZWVyX3JlcS0+ZGlnZXN0KTsKLQlkcmJkX2ZyZWVfcGFnZXMobWRldiwgcGVlcl9yZXEtPnBhZ2VzLCBpc19uZXQpOwotCURfQVNTRVJUKGF0b21pY19yZWFkKCZwZWVyX3JlcS0+cGVuZGluZ19iaW9zKSA9PSAwKTsKLQlEX0FTU0VSVChkcmJkX2ludGVydmFsX2VtcHR5KCZwZWVyX3JlcS0+aSkpOworCWRyYmRfZnJlZV9wYWdlcyhkZXZpY2UsIHBlZXJfcmVxLT5wYWdlcywgaXNfbmV0KTsKKwlEX0FTU0VSVChkZXZpY2UsIGF0b21pY19yZWFkKCZwZWVyX3JlcS0+cGVuZGluZ19iaW9zKSA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CiAJbWVtcG9vbF9mcmVlKHBlZXJfcmVxLCBkcmJkX2VlX21lbXBvb2wpOwogfQogCi1pbnQgZHJiZF9mcmVlX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoraW50IGRyYmRfZnJlZV9wZWVyX3JlcXMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJTElTVF9IRUFEKHdvcmtfbGlzdCk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgKnQ7CiAJaW50IGNvdW50ID0gMDsKLQlpbnQgaXNfbmV0ID0gbGlzdCA9PSAmbWRldi0+bmV0X2VlOworCWludCBpc19uZXQgPSBsaXN0ID09ICZkZXZpY2UtPm5ldF9lZTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQobGlzdCwgJndvcmtfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlZXJfcmVxLCB0LCAmd29ya19saXN0LCB3Lmxpc3QpIHsKLQkJX19kcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEsIGlzX25ldCk7CisJCV9fZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEsIGlzX25ldCk7CiAJCWNvdW50Kys7CiAJfQogCXJldHVybiBjb3VudDsKQEAgLTQwOSwyMCArNDEwLDIwIEBACiAvKgogICogU2VlIGFsc28gY29tbWVudHMgaW4gX3JlcV9tb2QoLEJBUlJJRVJfQUNLRUQpIGFuZCByZWNlaXZlX0JhcnJpZXIuCiAgKi8KLXN0YXRpYyBpbnQgZHJiZF9maW5pc2hfcGVlcl9yZXFzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IGRyYmRfZmluaXNoX3BlZXJfcmVxcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAlMSVNUX0hFQUQod29ya19saXN0KTsKIAlMSVNUX0hFQUQocmVjbGFpbWVkKTsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxLCAqdDsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKG1kZXYsICZyZWNsYWltZWQpOwotCWxpc3Rfc3BsaWNlX2luaXQoJm1kZXYtPmRvbmVfZWUsICZ3b3JrX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcmVjbGFpbV9maW5pc2hlZF9uZXRfcGVlcl9yZXFzKGRldmljZSwgJnJlY2xhaW1lZCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZGV2aWNlLT5kb25lX2VlLCAmd29ya19saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZWVyX3JlcSwgdCwgJnJlY2xhaW1lZCwgdy5saXN0KQotCQlkcmJkX2ZyZWVfbmV0X3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJZHJiZF9mcmVlX25ldF9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCS8qIHBvc3NpYmxlIGNhbGxiYWNrcyBoZXJlOgogCSAqIGVfZW5kX2Jsb2NrLCBhbmQgZV9lbmRfcmVzeW5jX2Jsb2NrLCBlX3NlbmRfc3VwZXJzZWRlZC4KQEAgLTQzNSwxNCArNDM2LDE0IEBACiAJCWVycjIgPSBwZWVyX3JlcS0+dy5jYigmcGVlcl9yZXEtPncsICEhZXJyKTsKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSBlcnIyOwotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiAJfQotCXdha2VfdXAoJm1kZXYtPmVlX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+ZWVfd2FpdCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyB2b2lkIF9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CkBAIC00NTAsMjAgKzQ1MSwyMCBAQAogCS8qIGF2b2lkcyBzcGluX2xvY2svdW5sb2NrCiAJICogYW5kIGNhbGxpbmcgcHJlcGFyZV90b193YWl0IGluIHRoZSBmYXN0IHBhdGggKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJcHJlcGFyZV90b193YWl0KCZtZGV2LT5lZV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5lZV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJaW9fc2NoZWR1bGUoKTsKLQkJZmluaXNoX3dhaXQoJm1kZXYtPmVlX3dhaXQsICZ3YWl0KTsKLQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJZmluaXNoX3dhaXQoJmRldmljZS0+ZWVfd2FpdCwgJndhaXQpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIHZvaWQgZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgaGVhZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCBoZWFkKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIH0KIAogc3RhdGljIGludCBkcmJkX3JlY3Zfc2hvcnQoc3RydWN0IHNvY2tldCAqc29jaywgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQpAQCAtNDg4LDQ0ICs0ODksNDQgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9yZWN2KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBpbnQgZHJiZF9yZWN2KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJaW50IHJ2OwogCi0JcnYgPSBkcmJkX3JlY3Zfc2hvcnQodGNvbm4tPmRhdGEuc29ja2V0LCBidWYsIHNpemUsIDApOworCXJ2ID0gZHJiZF9yZWN2X3Nob3J0KGNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LCBidWYsIHNpemUsIDApOwogCiAJaWYgKHJ2IDwgMCkgewogCQlpZiAocnYgPT0gLUVDT05OUkVTRVQpCi0JCQljb25uX2luZm8odGNvbm4sICJzb2NrIHdhcyByZXNldCBieSBwZWVyXG4iKTsKKwkJCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAic29jayB3YXMgcmVzZXQgYnkgcGVlclxuIik7CiAJCWVsc2UgaWYgKHJ2ICE9IC1FUkVTVEFSVFNZUykKLQkJCWNvbm5fZXJyKHRjb25uLCAic29ja19yZWN2bXNnIHJldHVybmVkICVkXG4iLCBydik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAic29ja19yZWN2bXNnIHJldHVybmVkICVkXG4iLCBydik7CiAJfSBlbHNlIGlmIChydiA9PSAwKSB7Ci0JCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncykpIHsKIAkJCWxvbmcgdDsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbyAqIEhaLzEwOworCQkJdCA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZiktPnBpbmdfdGltZW8gKiBIWi8xMDsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRjb25uLT5waW5nX3dhaXQsIHRjb25uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMsIHQpOworCQkJdCA9IHdhaXRfZXZlbnRfdGltZW91dChjb25uZWN0aW9uLT5waW5nX3dhaXQsIGNvbm5lY3Rpb24tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUywgdCk7CiAKIAkJCWlmICh0KQogCQkJCWdvdG8gb3V0OwogCQl9Ci0JCWNvbm5faW5mbyh0Y29ubiwgInNvY2sgd2FzIHNodXQgZG93biBieSBwZWVyXG4iKTsKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJzb2NrIHdhcyBzaHV0IGRvd24gYnkgcGVlclxuIik7CiAJfQogCiAJaWYgKHJ2ICE9IHNpemUpCi0JCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19CUk9LRU5fUElQRSksIENTX0hBUkQpOwogCiBvdXQ6CiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IGRyYmRfcmVjdl9hbGwoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfcmVjdih0Y29ubiwgYnVmLCBzaXplKTsKKwllcnIgPSBkcmJkX3JlY3YoY29ubmVjdGlvbiwgYnVmLCBzaXplKTsKIAlpZiAoZXJyICE9IHNpemUpIHsKIAkJaWYgKGVyciA+PSAwKQogCQkJZXJyID0gLUVJTzsKQEAgLTUzNCwxMyArNTM1LDEzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsX3dhcm4oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBkcmJkX3JlY3ZfYWxsX3dhcm4oc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X2FsbCh0Y29ubiwgYnVmLCBzaXplKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsKGNvbm5lY3Rpb24sIGJ1Ziwgc2l6ZSk7CiAJaWYgKGVyciAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCWNvbm5fd2Fybih0Y29ubiwgInNob3J0IHJlYWQgKGV4cGVjdGVkIHNpemUgJWQpXG4iLCAoaW50KXNpemUpOworCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgInNob3J0IHJlYWQgKGV4cGVjdGVkIHNpemUgJWQpXG4iLCAoaW50KXNpemUpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU2Myw3ICs1NjQsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfdHJ5X2Nvbm5lY3Qoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfdHJ5X2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAljb25zdCBjaGFyICp3aGF0OwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CkBAIC01NzUsNyArNTc2LDcgQEAKIAlpbnQgZGlzY29ubmVjdF9vbl9lcnJvciA9IDE7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJaWYgKCFuYykgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC01ODUsMTYgKzU4NiwxNiBAQAogCWNvbm5lY3RfaW50ID0gbmMtPmNvbm5lY3RfaW50OwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JbXlfYWRkcl9sZW4gPSBtaW5fdChpbnQsIHRjb25uLT5teV9hZGRyX2xlbiwgc2l6ZW9mKHNyY19pbjYpKTsKLQltZW1jcHkoJnNyY19pbjYsICZ0Y29ubi0+bXlfYWRkciwgbXlfYWRkcl9sZW4pOworCW15X2FkZHJfbGVuID0gbWluX3QoaW50LCBjb25uZWN0aW9uLT5teV9hZGRyX2xlbiwgc2l6ZW9mKHNyY19pbjYpKTsKKwltZW1jcHkoJnNyY19pbjYsICZjb25uZWN0aW9uLT5teV9hZGRyLCBteV9hZGRyX2xlbik7CiAKLQlpZiAoKChzdHJ1Y3Qgc29ja2FkZHIgKikmdGNvbm4tPm15X2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJaWYgKCgoc3RydWN0IHNvY2thZGRyICopJmNvbm5lY3Rpb24tPm15X2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCiAJCXNyY19pbjYuc2luNl9wb3J0ID0gMDsKIAllbHNlCiAJCSgoc3RydWN0IHNvY2thZGRyX2luICopJnNyY19pbjYpLT5zaW5fcG9ydCA9IDA7IC8qIEFGX0lORVQgJiBBRl9TQ0kgKi8KIAotCXBlZXJfYWRkcl9sZW4gPSBtaW5fdChpbnQsIHRjb25uLT5wZWVyX2FkZHJfbGVuLCBzaXplb2Yoc3JjX2luNikpOwotCW1lbWNweSgmcGVlcl9pbjYsICZ0Y29ubi0+cGVlcl9hZGRyLCBwZWVyX2FkZHJfbGVuKTsKKwlwZWVyX2FkZHJfbGVuID0gbWluX3QoaW50LCBjb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuLCBzaXplb2Yoc3JjX2luNikpOworCW1lbWNweSgmcGVlcl9pbjYsICZjb25uZWN0aW9uLT5wZWVyX2FkZHIsIHBlZXJfYWRkcl9sZW4pOwogCiAJd2hhdCA9ICJzb2NrX2NyZWF0ZV9rZXJuIjsKIAllcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKCgoc3RydWN0IHNvY2thZGRyICopJnNyY19pbjYpLT5zYV9mYW1pbHksCkBAIC02NDIsMTcgKzY0MywxNyBAQAogCQkJZGlzY29ubmVjdF9vbl9lcnJvciA9IDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWNvbm5fZXJyKHRjb25uLCAiJXMgZmFpbGVkLCBlcnIgPSAlZFxuIiwgd2hhdCwgZXJyKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOwogCQl9CiAJCWlmIChkaXNjb25uZWN0X29uX2Vycm9yKQotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAl9CiAKIAlyZXR1cm4gc29jazsKIH0KIAogc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogCXN0cnVjdCBzb2NrZXQgKnNfbGlzdGVuOwogCXN0cnVjdCBjb21wbGV0aW9uIGRvb3JfYmVsbDsKIAl2b2lkICgqb3JpZ2luYWxfc2tfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNjcwLDcgKzY3MSw3IEBACiAJc3RhdGVfY2hhbmdlKHNrKTsKIH0KIAotc3RhdGljIGludCBwcmVwYXJlX2xpc3Rlbl9zb2NrZXQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCitzdGF0aWMgaW50IHByZXBhcmVfbGlzdGVuX3NvY2tldChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCiB7CiAJaW50IGVyciwgc25kYnVmX3NpemUsIHJjdmJ1Zl9zaXplLCBteV9hZGRyX2xlbjsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42IG15X2FkZHI7CkBAIC02NzksNyArNjgwLDcgQEAKIAljb25zdCBjaGFyICp3aGF0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmICghbmMpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRUlPOwpAQCAtNjg4LDggKzY4OSw4IEBACiAJcmN2YnVmX3NpemUgPSBuYy0+cmN2YnVmX3NpemU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlteV9hZGRyX2xlbiA9IG1pbl90KGludCwgdGNvbm4tPm15X2FkZHJfbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwotCW1lbWNweSgmbXlfYWRkciwgJnRjb25uLT5teV9hZGRyLCBteV9hZGRyX2xlbik7CisJbXlfYWRkcl9sZW4gPSBtaW5fdChpbnQsIGNvbm5lY3Rpb24tPm15X2FkZHJfbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCW1lbWNweSgmbXlfYWRkciwgJmNvbm5lY3Rpb24tPm15X2FkZHIsIG15X2FkZHJfbGVuKTsKIAogCXdoYXQgPSAic29ja19jcmVhdGVfa2VybiI7CiAJZXJyID0gc29ja19jcmVhdGVfa2VybigoKHN0cnVjdCBzb2NrYWRkciAqKSZteV9hZGRyKS0+c2FfZmFtaWx5LApAQCAtNzI1LDggKzcyNiw4IEBACiAJCXNvY2tfcmVsZWFzZShzX2xpc3Rlbik7CiAJaWYgKGVyciA8IDApIHsKIAkJaWYgKGVyciAhPSAtRUFHQUlOICYmIGVyciAhPSAtRUlOVFIgJiYgZXJyICE9IC1FUkVTVEFSVFNZUykgewotCQkJY29ubl9lcnIodGNvbm4sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIlcyBmYWlsZWQsIGVyciA9ICVkXG4iLCB3aGF0LCBlcnIpOworCQkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQl9CiAJfQogCkBAIC03NDEsMTQgKzc0MiwxNCBAQAogCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwogfQogCi1zdGF0aWMgc3RydWN0IHNvY2tldCAqZHJiZF93YWl0X2Zvcl9jb25uZWN0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgKmFkKQorc3RhdGljIHN0cnVjdCBzb2NrZXQgKmRyYmRfd2FpdF9mb3JfY29ubmVjdChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgYWNjZXB0X3dhaXRfZGF0YSAqYWQpCiB7CiAJaW50IHRpbWVvLCBjb25uZWN0X2ludCwgZXJyID0gMDsKIAlzdHJ1Y3Qgc29ja2V0ICpzX2VzdGFiID0gTlVMTDsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCWlmICghbmMpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiBOVUxMOwpAQCAtNzY3LDggKzc2OCw4IEBACiAJZXJyID0ga2VybmVsX2FjY2VwdChhZC0+c19saXN0ZW4sICZzX2VzdGFiLCAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoZXJyICE9IC1FQUdBSU4gJiYgZXJyICE9IC1FSU5UUiAmJiBlcnIgIT0gLUVSRVNUQVJUU1lTKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImFjY2VwdCBmYWlsZWQsIGVyciA9ICVkXG4iLCBlcnIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJhY2NlcHQgZmFpbGVkLCBlcnIgPSAlZFxuIiwgZXJyKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAkJfQogCX0KIApAQCAtNzc4LDI5ICs3NzksMjkgQEAKIAlyZXR1cm4gc19lc3RhYjsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKHN0cnVjdCBkcmJkX3Rjb25uICosIHZvaWQgKiwgc3RydWN0IHBhY2tldF9pbmZvICopOworc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgdm9pZCAqLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CiAKLXN0YXRpYyBpbnQgc2VuZF9maXJzdF9wYWNrZXQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2ssCitzdGF0aWMgaW50IHNlbmRfZmlyc3RfcGFja2V0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBkcmJkX3NvY2tldCAqc29jaywKIAkJCSAgICAgZW51bSBkcmJkX3BhY2tldCBjbWQpCiB7Ci0JaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZCh0Y29ubiwgc29jaykpCisJaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKSkKIAkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBjbWQsIDAsIE5VTEwsIDApOworCXJldHVybiBjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBjbWQsIDAsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgaW50IHJlY2VpdmVfZmlyc3RfcGFja2V0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHNvY2tldCAqc29jaykKK3N0YXRpYyBpbnQgcmVjZWl2ZV9maXJzdF9wYWNrZXQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHNvY2tldCAqc29jaykKIHsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemUgPSBkcmJkX2hlYWRlcl9zaXplKGNvbm5lY3Rpb24pOwogCXN0cnVjdCBwYWNrZXRfaW5mbyBwaTsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X3Nob3J0KHNvY2ssIHRjb25uLT5kYXRhLnJidWYsIGhlYWRlcl9zaXplLCAwKTsKKwllcnIgPSBkcmJkX3JlY3Zfc2hvcnQoc29jaywgY29ubmVjdGlvbi0+ZGF0YS5yYnVmLCBoZWFkZXJfc2l6ZSwgMCk7CiAJaWYgKGVyciAhPSBoZWFkZXJfc2l6ZSkgewogCQlpZiAoZXJyID49IDApCiAJCQllcnIgPSAtRUlPOwogCQlyZXR1cm4gZXJyOwogCX0KLQllcnIgPSBkZWNvZGVfaGVhZGVyKHRjb25uLCB0Y29ubi0+ZGF0YS5yYnVmLCAmcGkpOworCWVyciA9IGRlY29kZV9oZWFkZXIoY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+ZGF0YS5yYnVmLCAmcGkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIHBpLmNtZDsKQEAgLTgzMCwyOCArODMxLDI5IEBACiB9CiAvKiBHZXRzIGNhbGxlZCBpZiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIG9yIGlmIGEgbmV3IG1pbm9yIGdldHMgY3JlYXRlZAogICAgaW4gYSBjb25uZWN0aW9uICovCi1pbnQgZHJiZF9jb25uZWN0ZWQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK2ludCBkcmJkX2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBlcnI7CiAKLQlhdG9taWNfc2V0KCZtZGV2LT5wYWNrZXRfc2VxLCAwKTsKLQltZGV2LT5wZWVyX3NlcSA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5wYWNrZXRfc2VxLCAwKTsKKwlkZXZpY2UtPnBlZXJfc2VxID0gMDsKIAotCW1kZXYtPnN0YXRlX211dGV4ID0gbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/Ci0JCSZtZGV2LT50Y29ubi0+Y3N0YXRlX211dGV4IDoKLQkJJm1kZXYtPm93bl9zdGF0ZV9tdXRleDsKKwlkZXZpY2UtPnN0YXRlX211dGV4ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCA/CisJCSZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N0YXRlX211dGV4IDoKKwkJJmRldmljZS0+b3duX3N0YXRlX211dGV4OwogCi0JZXJyID0gZHJiZF9zZW5kX3N5bmNfcGFyYW0obWRldik7CisJZXJyID0gZHJiZF9zZW5kX3N5bmNfcGFyYW0ocGVlcl9kZXZpY2UpOwogCWlmICghZXJyKQotCQllcnIgPSBkcmJkX3NlbmRfc2l6ZXMobWRldiwgMCwgMCk7CisJCWVyciA9IGRyYmRfc2VuZF9zaXplcyhwZWVyX2RldmljZSwgMCwgMCk7CiAJaWYgKCFlcnIpCi0JCWVyciA9IGRyYmRfc2VuZF91dWlkcyhtZGV2KTsKKwkJZXJyID0gZHJiZF9zZW5kX3V1aWRzKHBlZXJfZGV2aWNlKTsKIAlpZiAoIWVycikKLQkJZXJyID0gZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUobWRldik7Ci0JY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmbWRldi0+ZmxhZ3MpOwotCWNsZWFyX2JpdChSRVNJWkVfUEVORElORywgJm1kZXYtPmZsYWdzKTsKLQlhdG9taWNfc2V0KCZtZGV2LT5hcF9pbl9mbGlnaHQsIDApOwotCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgamlmZmllcyArIEhaKTsgLyoganVzdCBzdGFydCBpdCBoZXJlLiAqLworCQllcnIgPSBkcmJkX3NlbmRfY3VycmVudF9zdGF0ZShwZWVyX2RldmljZSk7CisJY2xlYXJfYml0KFVTRV9ERUdSX1dGQ19ULCAmZGV2aWNlLT5mbGFncyk7CisJY2xlYXJfYml0KFJFU0laRV9QRU5ESU5HLCAmZGV2aWNlLT5mbGFncyk7CisJYXRvbWljX3NldCgmZGV2aWNlLT5hcF9pbl9mbGlnaHQsIDApOworCW1vZF90aW1lcigmZGV2aWNlLT5yZXF1ZXN0X3RpbWVyLCBqaWZmaWVzICsgSFopOyAvKiBqdXN0IHN0YXJ0IGl0IGhlcmUuICovCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODYzLDU5ICs4NjUsNTkgQEAKICAqICAgICBubyBwb2ludCBpbiB0cnlpbmcgYWdhaW4sIHBsZWFzZSBnbyBzdGFuZGFsb25lLgogICogIC0yIFdlIGRvIG5vdCBoYXZlIGEgbmV0d29yayBjb25maWcuLi4KICAqLwotc3RhdGljIGludCBjb25uX2Nvbm5lY3Qoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBjb25uX2Nvbm5lY3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgc29jaywgbXNvY2s7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgdm5yLCB0aW1lb3V0LCBoLCBvazsKIAlib29sIGRpc2NhcmRfbXlfZGF0YTsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAJc3RydWN0IGFjY2VwdF93YWl0X2RhdGEgYWQgPSB7Ci0JCS50Y29ubiA9IHRjb25uLAorCQkuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sCiAJCS5kb29yX2JlbGwgPSBDT01QTEVUSU9OX0lOSVRJQUxJWkVSX09OU1RBQ0soYWQuZG9vcl9iZWxsKSwKIAl9OwogCi0JY2xlYXJfYml0KERJU0NPTk5FQ1RfU0VOVCwgJnRjb25uLT5mbGFncyk7Ci0JaWYgKGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19XRl9DT05ORUNUSU9OKSwgQ1NfVkVSQk9TRSkgPCBTU19TVUNDRVNTKQorCWNsZWFyX2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CisJaWYgKGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1dGX0NPTk5FQ1RJT04pLCBDU19WRVJCT1NFKSA8IFNTX1NVQ0NFU1MpCiAJCXJldHVybiAtMjsKIAogCW11dGV4X2luaXQoJnNvY2subXV0ZXgpOwotCXNvY2suc2J1ZiA9IHRjb25uLT5kYXRhLnNidWY7Ci0Jc29jay5yYnVmID0gdGNvbm4tPmRhdGEucmJ1ZjsKKwlzb2NrLnNidWYgPSBjb25uZWN0aW9uLT5kYXRhLnNidWY7CisJc29jay5yYnVmID0gY29ubmVjdGlvbi0+ZGF0YS5yYnVmOwogCXNvY2suc29ja2V0ID0gTlVMTDsKIAltdXRleF9pbml0KCZtc29jay5tdXRleCk7Ci0JbXNvY2suc2J1ZiA9IHRjb25uLT5tZXRhLnNidWY7Ci0JbXNvY2sucmJ1ZiA9IHRjb25uLT5tZXRhLnJidWY7CisJbXNvY2suc2J1ZiA9IGNvbm5lY3Rpb24tPm1ldGEuc2J1ZjsKKwltc29jay5yYnVmID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCW1zb2NrLnNvY2tldCA9IE5VTEw7CiAKIAkvKiBBc3N1bWUgdGhhdCB0aGUgcGVlciBvbmx5IHVuZGVyc3RhbmRzIHByb3RvY29sIDgwIHVudGlsIHdlIGtub3cgYmV0dGVyLiAgKi8KLQl0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID0gODA7CisJY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID0gODA7CiAKLQlpZiAocHJlcGFyZV9saXN0ZW5fc29ja2V0KHRjb25uLCAmYWQpKQorCWlmIChwcmVwYXJlX2xpc3Rlbl9zb2NrZXQoY29ubmVjdGlvbiwgJmFkKSkKIAkJcmV0dXJuIDA7CiAKIAlkbyB7CiAJCXN0cnVjdCBzb2NrZXQgKnM7CiAKLQkJcyA9IGRyYmRfdHJ5X2Nvbm5lY3QodGNvbm4pOworCQlzID0gZHJiZF90cnlfY29ubmVjdChjb25uZWN0aW9uKTsKIAkJaWYgKHMpIHsKIAkJCWlmICghc29jay5zb2NrZXQpIHsKIAkJCQlzb2NrLnNvY2tldCA9IHM7Ci0JCQkJc2VuZF9maXJzdF9wYWNrZXQodGNvbm4sICZzb2NrLCBQX0lOSVRJQUxfREFUQSk7CisJCQkJc2VuZF9maXJzdF9wYWNrZXQoY29ubmVjdGlvbiwgJnNvY2ssIFBfSU5JVElBTF9EQVRBKTsKIAkJCX0gZWxzZSBpZiAoIW1zb2NrLnNvY2tldCkgewotCQkJCWNsZWFyX2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnRjb25uLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCQkJCW1zb2NrLnNvY2tldCA9IHM7Ci0JCQkJc2VuZF9maXJzdF9wYWNrZXQodGNvbm4sICZtc29jaywgUF9JTklUSUFMX01FVEEpOworCQkJCXNlbmRfZmlyc3RfcGFja2V0KGNvbm5lY3Rpb24sICZtc29jaywgUF9JTklUSUFMX01FVEEpOwogCQkJfSBlbHNlIHsKLQkJCQljb25uX2Vycih0Y29ubiwgIkxvZ2ljIGVycm9yIGluIGNvbm5fY29ubmVjdCgpXG4iKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiTG9naWMgZXJyb3IgaW4gY29ubl9jb25uZWN0KClcbiIpOwogCQkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJCX0KIAkJfQogCiAJCWlmIChzb2NrLnNvY2tldCAmJiBtc29jay5zb2NrZXQpIHsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCQl0aW1lb3V0ID0gbmMtPnBpbmdfdGltZW8gKiBIWiAvIDEwOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CkBAIC05MjYsMTUgKzkyOCwxNSBAQAogCQl9CiAKIHJldHJ5OgotCQlzID0gZHJiZF93YWl0X2Zvcl9jb25uZWN0KHRjb25uLCAmYWQpOworCQlzID0gZHJiZF93YWl0X2Zvcl9jb25uZWN0KGNvbm5lY3Rpb24sICZhZCk7CiAJCWlmIChzKSB7Ci0JCQlpbnQgZnAgPSByZWNlaXZlX2ZpcnN0X3BhY2tldCh0Y29ubiwgcyk7CisJCQlpbnQgZnAgPSByZWNlaXZlX2ZpcnN0X3BhY2tldChjb25uZWN0aW9uLCBzKTsKIAkJCWRyYmRfc29ja2V0X29rYXkoJnNvY2suc29ja2V0KTsKIAkJCWRyYmRfc29ja2V0X29rYXkoJm1zb2NrLnNvY2tldCk7CiAJCQlzd2l0Y2ggKGZwKSB7CiAJCQljYXNlIFBfSU5JVElBTF9EQVRBOgogCQkJCWlmIChzb2NrLnNvY2tldCkgewotCQkJCQljb25uX3dhcm4odGNvbm4sICJpbml0aWFsIHBhY2tldCBTIGNyb3NzZWRcbiIpOworCQkJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgImluaXRpYWwgcGFja2V0IFMgY3Jvc3NlZFxuIik7CiAJCQkJCXNvY2tfcmVsZWFzZShzb2NrLnNvY2tldCk7CiAJCQkJCXNvY2suc29ja2V0ID0gczsKIAkJCQkJZ290byByYW5kb21pemU7CkBAIC05NDIsOSArOTQ0LDkgQEAKIAkJCQlzb2NrLnNvY2tldCA9IHM7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFBfSU5JVElBTF9NRVRBOgotCQkJCXNldF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZ0Y29ubi0+ZmxhZ3MpOworCQkJCXNldF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCQkJaWYgKG1zb2NrLnNvY2tldCkgewotCQkJCQljb25uX3dhcm4odGNvbm4sICJpbml0aWFsIHBhY2tldCBNIGNyb3NzZWRcbiIpOworCQkJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgImluaXRpYWwgcGFja2V0IE0gY3Jvc3NlZFxuIik7CiAJCQkJCXNvY2tfcmVsZWFzZShtc29jay5zb2NrZXQpOwogCQkJCQltc29jay5zb2NrZXQgPSBzOwogCQkJCQlnb3RvIHJhbmRvbWl6ZTsKQEAgLTk1Miw3ICs5NTQsNyBAQAogCQkJCW1zb2NrLnNvY2tldCA9IHM7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWNvbm5fd2Fybih0Y29ubiwgIkVycm9yIHJlY2VpdmluZyBpbml0aWFsIHBhY2tldFxuIik7CisJCQkJZHJiZF93YXJuKGNvbm5lY3Rpb24sICJFcnJvciByZWNlaXZpbmcgaW5pdGlhbCBwYWNrZXRcbiIpOwogCQkJCXNvY2tfcmVsZWFzZShzKTsKIHJhbmRvbWl6ZToKIAkJCQlpZiAocHJhbmRvbV91MzIoKSAmIDEpCkBAIC05NjAsMTIgKzk2MiwxMiBAQAogCQkJfQogCQl9CiAKLQkJaWYgKHRjb25uLT5jc3RhdGUgPD0gQ19ESVNDT05ORUNUSU5HKQorCQlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlIDw9IENfRElTQ09OTkVDVElORykKIAkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCQkJc21wX3JtYigpOwotCQkJaWYgKGdldF90X3N0YXRlKCZ0Y29ubi0+cmVjZWl2ZXIpID09IEVYSVRJTkcpCisJCQlpZiAoZ2V0X3Rfc3RhdGUoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKSA9PSBFWElUSU5HKQogCQkJCWdvdG8gb3V0X3JlbGVhc2Vfc29ja2V0czsKIAkJfQogCkBAIC05ODYsMTIgKzk4OCwxMiBAQAogCW1zb2NrLnNvY2tldC0+c2stPnNrX3ByaW9yaXR5ID0gVENfUFJJT19JTlRFUkFDVElWRTsKIAogCS8qIE5PVCBZRVQgLi4uCi0JICogc29jay5zb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IHRjb25uLT5uZXRfY29uZi0+dGltZW91dCpIWi8xMDsKKwkgKiBzb2NrLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0gY29ubmVjdGlvbi0+bmV0X2NvbmYtPnRpbWVvdXQqSFovMTA7CiAJICogc29jay5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbyA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCSAqIGZpcnN0IHNldCBpdCB0byB0aGUgUF9DT05ORUNUSU9OX0ZFQVRVUkVTIHRpbWVvdXQsCiAJICogd2hpY2ggd2Ugc2V0IHRvIDR4IHRoZSBjb25maWd1cmVkIHBpbmdfdGltZW91dC4gKi8KIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAKIAlzb2NrLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0KIAlzb2NrLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gbmMtPnBpbmdfdGltZW8qNCpIWi8xMDsKQEAgLTEwMDgsMzcgKzEwMTAsMzggQEAKIAlkcmJkX3RjcF9ub2RlbGF5KHNvY2suc29ja2V0KTsKIAlkcmJkX3RjcF9ub2RlbGF5KG1zb2NrLnNvY2tldCk7CiAKLQl0Y29ubi0+ZGF0YS5zb2NrZXQgPSBzb2NrLnNvY2tldDsKLQl0Y29ubi0+bWV0YS5zb2NrZXQgPSBtc29jay5zb2NrZXQ7Ci0JdGNvbm4tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOworCWNvbm5lY3Rpb24tPmRhdGEuc29ja2V0ID0gc29jay5zb2NrZXQ7CisJY29ubmVjdGlvbi0+bWV0YS5zb2NrZXQgPSBtc29jay5zb2NrZXQ7CisJY29ubmVjdGlvbi0+bGFzdF9yZWNlaXZlZCA9IGppZmZpZXM7CiAKLQloID0gZHJiZF9kb19mZWF0dXJlcyh0Y29ubik7CisJaCA9IGRyYmRfZG9fZmVhdHVyZXMoY29ubmVjdGlvbik7CiAJaWYgKGggPD0gMCkKIAkJcmV0dXJuIGg7CiAKLQlpZiAodGNvbm4tPmNyYW1faG1hY190Zm0pIHsKLQkJLyogZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIFdGQXV0aCkpOyAqLwotCQlzd2l0Y2ggKGRyYmRfZG9fYXV0aCh0Y29ubikpIHsKKwlpZiAoY29ubmVjdGlvbi0+Y3JhbV9obWFjX3RmbSkgeworCQkvKiBkcmJkX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBOUyhjb25uLCBXRkF1dGgpKTsgKi8KKwkJc3dpdGNoIChkcmJkX2RvX2F1dGgoY29ubmVjdGlvbikpIHsKIAkJY2FzZSAtMToKLQkJCWNvbm5fZXJyKHRjb25uLCAiQXV0aGVudGljYXRpb24gb2YgcGVlciBmYWlsZWRcbiIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkF1dGhlbnRpY2F0aW9uIG9mIHBlZXIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJY2FzZSAwOgotCQkJY29ubl9lcnIodGNvbm4sICJBdXRoZW50aWNhdGlvbiBvZiBwZWVyIGZhaWxlZCwgdHJ5aW5nIGFnYWluLlxuIik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQXV0aGVudGljYXRpb24gb2YgcGVlciBmYWlsZWQsIHRyeWluZyBhZ2Fpbi5cbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQl0Y29ubi0+ZGF0YS5zb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IHRpbWVvdXQ7Ci0JdGNvbm4tPmRhdGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwljb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0gdGltZW91dDsKKwljb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAKLQlpZiAoZHJiZF9zZW5kX3Byb3RvY29sKHRjb25uKSA9PSAtRU9QTk9UU1VQUCkKKwlpZiAoZHJiZF9zZW5kX3Byb3RvY29sKGNvbm5lY3Rpb24pID09IC1FT1BOT1RTVVBQKQogCQlyZXR1cm4gLTE7CiAKLQlzZXRfYml0KFNUQVRFX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpOworCXNldF9iaXQoU1RBVEVfU0VOVCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJa3JlZl9nZXQoJm1kZXYtPmtyZWYpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCiAJCS8qIFByZXZlbnQgYSByYWNlIGJldHdlZW4gcmVzeW5jLWhhbmRzaGFrZSBhbmQKQEAgLTEwNDgsMzUgKzEwNTEsMzUgQEAKIAkJICogZHJiZF9zZXRfcm9sZSgpIGlzIGZpbmlzaGVkLCBhbmQgYW55IGluY29taW5nIGRyYmRfc2V0X3JvbGUKIAkJICogd2lsbCBzZWUgdGhlIFNUQVRFX1NFTlQgZmxhZywgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGNsZWFyZWQuCiAJCSAqLwotCQltdXRleF9sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKLQkJbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfbG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOwogCiAJCWlmIChkaXNjYXJkX215X2RhdGEpCi0JCQlzZXRfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKTsKKwkJCXNldF9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAJCWVsc2UKLQkJCWNsZWFyX2JpdChESVNDQVJEX01ZX0RBVEEsICZtZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQkJZHJiZF9jb25uZWN0ZWQobWRldik7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF9jb25uZWN0ZWQocGVlcl9kZXZpY2UpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLCBDU19WRVJCT1NFKTsKLQlpZiAocnYgPCBTU19TVUNDRVNTIHx8IHRjb25uLT5jc3RhdGUgIT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCWNsZWFyX2JpdChTVEFURV9TRU5ULCAmdGNvbm4tPmZsYWdzKTsKKwlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1dGX1JFUE9SVF9QQVJBTVMpLCBDU19WRVJCT1NFKTsKKwlpZiAocnYgPCBTU19TVUNDRVNTIHx8IGNvbm5lY3Rpb24tPmNzdGF0ZSAhPSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJY2xlYXJfYml0KFNUQVRFX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCWRyYmRfdGhyZWFkX3N0YXJ0KCZ0Y29ubi0+YXNlbmRlcik7CisJZHJiZF90aHJlYWRfc3RhcnQoJmNvbm5lY3Rpb24tPmFzZW5kZXIpOwogCi0JbXV0ZXhfbG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCS8qIFRoZSBkaXNjYXJkX215X2RhdGEgZmxhZyBpcyBhIHNpbmdsZS1zaG90IG1vZGlmaWVyIHRvIHRoZSBuZXh0CiAJICogY29ubmVjdGlvbiBhdHRlbXB0LCB0aGUgaGFuZHNoYWtlIG9mIHdoaWNoIGlzIG5vdyB3ZWxsIHVuZGVyd2F5LgogCSAqIE5vIG5lZWQgZm9yIHJjdSBzdHlsZSBjb3B5aW5nIG9mIHRoZSB3aG9sZSBzdHJ1Y3QKIAkgKiBqdXN0IHRvIGNsZWFyIGEgc2luZ2xlIHZhbHVlLiAqLwotCXRjb25uLT5uZXRfY29uZi0+ZGlzY2FyZF9teV9kYXRhID0gMDsKLQltdXRleF91bmxvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7CisJY29ubmVjdGlvbi0+bmV0X2NvbmYtPmRpc2NhcmRfbXlfZGF0YSA9IDA7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCiAJcmV0dXJuIGg7CiAKQEAgLTEwOTAsMTUgKzEwOTMsMTUgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHZvaWQgKmhlYWRlciwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZGVjb2RlX2hlYWRlcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICpoZWFkZXIsIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0JdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZSh0Y29ubik7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKTsKIAogCWlmIChoZWFkZXJfc2l6ZSA9PSBzaXplb2Yoc3RydWN0IHBfaGVhZGVyMTAwKSAmJgogCSAgICAqKF9fYmUzMiAqKWhlYWRlciA9PSBjcHVfdG9fYmUzMihEUkJEX01BR0lDXzEwMCkpIHsKIAkJc3RydWN0IHBfaGVhZGVyMTAwICpoID0gaGVhZGVyOwogCQlpZiAoaC0+cGFkICE9IDApIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAiSGVhZGVyIHBhZGRpbmcgaXMgbm90IHplcm9cbiIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIkhlYWRlciBwYWRkaW5nIGlzIG5vdCB6ZXJvXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXBpLT52bnIgPSBiZTE2X3RvX2NwdShoLT52b2x1bWUpOwpAQCAtMTExNyw1NSArMTEyMCw1NyBAQAogCQlwaS0+c2l6ZSA9IGJlMTZfdG9fY3B1KGgtPmxlbmd0aCk7CiAJCXBpLT52bnIgPSAwOwogCX0gZWxzZSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiV3JvbmcgbWFnaWMgdmFsdWUgMHglMDh4IGluIHByb3RvY29sIHZlcnNpb24gJWRcbiIsCisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJXcm9uZyBtYWdpYyB2YWx1ZSAweCUwOHggaW4gcHJvdG9jb2wgdmVyc2lvbiAlZFxuIiwKIAkJCSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWhlYWRlciksCi0JCQkgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbik7CisJCQkgY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXBpLT5kYXRhID0gaGVhZGVyICsgaGVhZGVyX3NpemU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9yZWN2X2hlYWRlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGRyYmRfcmVjdl9oZWFkZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQl2b2lkICpidWZmZXIgPSB0Y29ubi0+ZGF0YS5yYnVmOworCXZvaWQgKmJ1ZmZlciA9IGNvbm5lY3Rpb24tPmRhdGEucmJ1ZjsKIAlpbnQgZXJyOwogCi0JZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBidWZmZXIsIGRyYmRfaGVhZGVyX3NpemUodGNvbm4pKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4oY29ubmVjdGlvbiwgYnVmZmVyLCBkcmJkX2hlYWRlcl9zaXplKGNvbm5lY3Rpb24pKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gZGVjb2RlX2hlYWRlcih0Y29ubiwgYnVmZmVyLCBwaSk7Ci0JdGNvbm4tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOworCWVyciA9IGRlY29kZV9oZWFkZXIoY29ubmVjdGlvbiwgYnVmZmVyLCBwaSk7CisJY29ubmVjdGlvbi0+bGFzdF9yZWNlaXZlZCA9IGppZmZpZXM7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX2ZsdXNoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyB2b2lkIGRyYmRfZmx1c2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlpbnQgcnY7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAotCWlmICh0Y29ubi0+d3JpdGVfb3JkZXJpbmcgPj0gV09fYmRldl9mbHVzaCkgeworCWlmIChjb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZyA+PSBXT19iZGV2X2ZsdXNoKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCQlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCisJCQlpZiAoIWdldF9sZGV2KGRldmljZSkpCiAJCQkJY29udGludWU7Ci0JCQlrcmVmX2dldCgmbWRldi0+a3JlZik7CisJCQlrcmVmX2dldCgmZGV2aWNlLT5rcmVmKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCQlydiA9IGJsa2Rldl9pc3N1ZV9mbHVzaChtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYsCisJCQlydiA9IGJsa2Rldl9pc3N1ZV9mbHVzaChkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldiwKIAkJCQkJR0ZQX05PSU8sIE5VTEwpOwogCQkJaWYgKHJ2KSB7Ci0JCQkJZGV2X2luZm8oREVWLCAibG9jYWwgZGlzayBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHJ2KTsKKwkJCQlkcmJkX2luZm8oZGV2aWNlLCAibG9jYWwgZGlzayBmbHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHJ2KTsKIAkJCQkvKiB3b3VsZCByYXRoZXIgY2hlY2sgb24gRU9QTk9UU1VQUCwgYnV0IHRoYXQgaXMgbm90IHJlbGlhYmxlLgogCQkJCSAqIGRvbid0IHRyeSBhZ2FpbiBmb3IgQU5ZIHJldHVybiB2YWx1ZSAhPSAwCiAJCQkJICogaWYgKHJ2ID09IC1FT1BOT1RTVVBQKSAqLwotCQkJCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyh0Y29ubiwgV09fZHJhaW5faW8pOworCQkJCWRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhjb25uZWN0aW9uLCBXT19kcmFpbl9pbyk7CiAJCQl9Ci0JCQlwdXRfbGRldihtZGV2KTsKLQkJCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJaWYgKHJ2KQpAQCAtMTE3NywxMSArMTE4MiwxMSBAQAogCiAvKioKICAqIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaCgpIC0gQXBwbGllcyBhbiBlcG9jaF9ldmVudCB0byB0aGUgZXBvY2gncyBzdGF0ZSwgZXZlbnR1YWxseSBmaW5pc2hlcyBpdC4KLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQGVwb2NoOglFcG9jaCBvYmplY3QuCiAgKiBAZXY6CQlFcG9jaCBldmVudC4KICAqLwotc3RhdGljIGVudW0gZmluaXNoX2Vwb2NoIGRyYmRfbWF5X2ZpbmlzaF9lcG9jaChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sCitzdGF0aWMgZW51bSBmaW5pc2hfZXBvY2ggZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCiAJCQkJCSAgICAgICBzdHJ1Y3QgZHJiZF9lcG9jaCAqZXBvY2gsCiAJCQkJCSAgICAgICBlbnVtIGVwb2NoX2V2ZW50IGV2KQogewpAQCAtMTE4OSw3ICsxMTk0LDcgQEAKIAlzdHJ1Y3QgZHJiZF9lcG9jaCAqbmV4dF9lcG9jaDsKIAllbnVtIGZpbmlzaF9lcG9jaCBydiA9IEZFX1NUSUxMX0xJVkU7CiAKLQlzcGluX2xvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOwogCWRvIHsKIAkJbmV4dF9lcG9jaCA9IE5VTEw7CiAKQEAgLTEyMTEsMjIgKzEyMTYsMjIgQEAKIAkJICAgIGF0b21pY19yZWFkKCZlcG9jaC0+YWN0aXZlKSA9PSAwICYmCiAJCSAgICAodGVzdF9iaXQoREVfSEFWRV9CQVJSSUVSX05VTUJFUiwgJmVwb2NoLT5mbGFncykgfHwgZXYgJiBFVl9DTEVBTlVQKSkgewogCQkJaWYgKCEoZXYgJiBFVl9DTEVBTlVQKSkgewotCQkJCXNwaW5fdW5sb2NrKCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JCQkJZHJiZF9zZW5kX2JfYWNrKGVwb2NoLT50Y29ubiwgZXBvY2gtPmJhcnJpZXJfbnIsIGVwb2NoX3NpemUpOwotCQkJCXNwaW5fbG9jaygmdGNvbm4tPmVwb2NoX2xvY2spOworCQkJCXNwaW5fdW5sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKKwkJCQlkcmJkX3NlbmRfYl9hY2soZXBvY2gtPmNvbm5lY3Rpb24sIGVwb2NoLT5iYXJyaWVyX25yLCBlcG9jaF9zaXplKTsKKwkJCQlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOwogCQkJfQogI2lmIDAKIAkJCS8qIEZJWE1FOiBkZWMgdW5hY2tlZCBvbiBjb25uZWN0aW9uLCBvbmNlIHdlIGhhdmUKIAkJCSAqIHNvbWV0aGluZyB0byBjb3VudCBwZW5kaW5nIGNvbm5lY3Rpb24gcGFja2V0cyBpbi4gKi8KIAkJCWlmICh0ZXN0X2JpdChERV9IQVZFX0JBUlJJRVJfTlVNQkVSLCAmZXBvY2gtPmZsYWdzKSkKLQkJCQlkZWNfdW5hY2tlZChlcG9jaC0+dGNvbm4pOworCQkJCWRlY191bmFja2VkKGVwb2NoLT5jb25uZWN0aW9uKTsKICNlbmRpZgogCi0JCQlpZiAodGNvbm4tPmN1cnJlbnRfZXBvY2ggIT0gZXBvY2gpIHsKKwkJCWlmIChjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoICE9IGVwb2NoKSB7CiAJCQkJbmV4dF9lcG9jaCA9IGxpc3RfZW50cnkoZXBvY2gtPmxpc3QubmV4dCwgc3RydWN0IGRyYmRfZXBvY2gsIGxpc3QpOwogCQkJCWxpc3RfZGVsKCZlcG9jaC0+bGlzdCk7CiAJCQkJZXYgPSBFVl9CRUNBTUVfTEFTVCB8IChldiAmIEVWX0NMRUFOVVApOwotCQkJCXRjb25uLT5lcG9jaHMtLTsKKwkJCQljb25uZWN0aW9uLT5lcG9jaHMtLTsKIAkJCQlrZnJlZShlcG9jaCk7CiAKIAkJCQlpZiAocnYgPT0gRkVfU1RJTExfTElWRSkKQEAgLTEyNDYsMjAgKzEyNTEsMjAgQEAKIAkJZXBvY2ggPSBuZXh0X2Vwb2NoOwogCX0gd2hpbGUgKDEpOwogCi0Jc3Bpbl91bmxvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX3VubG9jaygmY29ubmVjdGlvbi0+ZXBvY2hfbG9jayk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKIC8qKgogICogZHJiZF9idW1wX3dyaXRlX29yZGVyaW5nKCkgLSBGYWxsIGJhY2sgdG8gYW4gb3RoZXIgd3JpdGUgb3JkZXJpbmcgbWV0aG9kCi0gKiBAdGNvbm46CURSQkQgY29ubmVjdGlvbi4KKyAqIEBjb25uZWN0aW9uOglEUkJEIGNvbm5lY3Rpb24uCiAgKiBAd286CQlXcml0ZSBvcmRlcmluZyBtZXRob2QgdG8gdHJ5LgogICovCi12b2lkIGRyYmRfYnVtcF93cml0ZV9vcmRlcmluZyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3bykKK3ZvaWQgZHJiZF9idW1wX3dyaXRlX29yZGVyaW5nKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gd3JpdGVfb3JkZXJpbmdfZSB3bykKIHsKIAlzdHJ1Y3QgZGlza19jb25mICpkYzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAllbnVtIHdyaXRlX29yZGVyaW5nX2UgcHdvOwogCWludCB2bnI7CiAJc3RhdGljIGNoYXIgKndyaXRlX29yZGVyaW5nX3N0cltdID0gewpAQCAtMTI2OCwyOSArMTI3MywzMSBAQAogCQlbV09fYmRldl9mbHVzaF0gPSAiZmx1c2giLAogCX07CiAKLQlwd28gPSB0Y29ubi0+d3JpdGVfb3JkZXJpbmc7CisJcHdvID0gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmc7CiAJd28gPSBtaW4ocHdvLCB3byk7CiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQVRUQUNISU5HKSkKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfQVRUQUNISU5HKSkKIAkJCWNvbnRpbnVlOwotCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpOworCQlkYyA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZik7CiAKIAkJaWYgKHdvID09IFdPX2JkZXZfZmx1c2ggJiYgIWRjLT5kaXNrX2ZsdXNoZXMpCiAJCQl3byA9IFdPX2RyYWluX2lvOwogCQlpZiAod28gPT0gV09fZHJhaW5faW8gJiYgIWRjLT5kaXNrX2RyYWluKQogCQkJd28gPSBXT19ub25lOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JdGNvbm4tPndyaXRlX29yZGVyaW5nID0gd287Ci0JaWYgKHB3byAhPSB0Y29ubi0+d3JpdGVfb3JkZXJpbmcgfHwgd28gPT0gV09fYmRldl9mbHVzaCkKLQkJY29ubl9pbmZvKHRjb25uLCAiTWV0aG9kIHRvIGVuc3VyZSB3cml0ZSBvcmRlcmluZzogJXNcbiIsIHdyaXRlX29yZGVyaW5nX3N0clt0Y29ubi0+d3JpdGVfb3JkZXJpbmddKTsKKwljb25uZWN0aW9uLT53cml0ZV9vcmRlcmluZyA9IHdvOworCWlmIChwd28gIT0gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcgfHwgd28gPT0gV09fYmRldl9mbHVzaCkKKwkJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJNZXRob2QgdG8gZW5zdXJlIHdyaXRlIG9yZGVyaW5nOiAlc1xuIiwgd3JpdGVfb3JkZXJpbmdfc3RyW2Nvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nXSk7CiB9CiAKIC8qKgogICogZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KCkKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQHBlZXJfcmVxOglwZWVyIHJlcXVlc3QKICAqIEBydzoJCWZsYWcgZmllbGQsIHNlZSBiaW8tPmJpX3J3CiAgKgpAQCAtMTMwNSw3ICsxMzEyLDcgQEAKICAqICBvbiBjZXJ0YWluIFhlbiBkZXBsb3ltZW50cy4KICAqLwogLyogVE9ETyBhbGxvY2F0ZSBmcm9tIG91ciBvd24gYmlvX3NldC4gKi8KLWludCBkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3Qoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2ludCBkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEsCiAJCQkgICAgIGNvbnN0IHVuc2lnbmVkIHJ3LCBjb25zdCBpbnQgZmF1bHRfdHlwZSkKIHsKQEAgLTEzMjksMTIgKzEzMzYsMTIgQEAKIG5leHRfYmlvOgogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnJfcGFnZXMpOwogCWlmICghYmlvKSB7Ci0JCWRldl9lcnIoREVWLCAic3VibWl0X2VlOiBBbGxvY2F0aW9uIG9mIGEgYmlvIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgInN1Ym1pdF9lZTogQWxsb2NhdGlvbiBvZiBhIGJpbyBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCS8qID4gcGVlcl9yZXEtPmkuc2VjdG9yLCB1bmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgYmlvICovCiAJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAJYmlvLT5iaV9ydyA9IHJ3OwogCWJpby0+YmlfcHJpdmF0ZSA9IHBlZXJfcmVxOwogCWJpby0+YmlfZW5kX2lvID0gZHJiZF9wZWVyX3JlcXVlc3RfZW5kaW87CkBAIC0xMzUwLDcgKzEzNTcsNyBAQAogCQkJICogQnV0IGluIGNhc2UgaXQgZmFpbHMgYW55d2F5cywKIAkJCSAqIHdlIGRlYWwgd2l0aCBpdCwgYW5kIGNvbXBsYWluIChiZWxvdykuICovCiAJCQlpZiAoYmlvLT5iaV92Y250ID09IDApIHsKLQkJCQlkZXZfZXJyKERFViwKKwkJCQlkcmJkX2VycihkZXZpY2UsCiAJCQkJCSJiaW9fYWRkX3BhZ2UgZmFpbGVkIGZvciBsZW49JXUsICIKIAkJCQkJImJpX3ZjbnQ9MCAoYmlfc2VjdG9yPSVsbHUpXG4iLAogCQkJCQlsZW4sICh1aW50NjRfdCliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKQEAgLTEzNjMsOCArMTM3MCw4IEBACiAJCXNlY3RvciArPSBsZW4gPj4gOTsKIAkJLS1ucl9wYWdlczsKIAl9Ci0JRF9BU1NFUlQocGFnZSA9PSBOVUxMKTsKLQlEX0FTU0VSVChkcyA9PSAwKTsKKwlEX0FTU0VSVChkZXZpY2UsIHBhZ2UgPT0gTlVMTCk7CisJRF9BU1NFUlQoZGV2aWNlLCBkcyA9PSAwKTsKIAogCWF0b21pY19zZXQoJnBlZXJfcmVxLT5wZW5kaW5nX2Jpb3MsIG5fYmlvcyk7CiAJZG8gewpAQCAtMTM3Miw3ICsxMzc5LDcgQEAKIAkJYmlvcyA9IGJpb3MtPmJpX25leHQ7CiAJCWJpby0+YmlfbmV4dCA9IE5VTEw7CiAKLQkJZHJiZF9nZW5lcmljX21ha2VfcmVxdWVzdChtZGV2LCBmYXVsdF90eXBlLCBiaW8pOworCQlkcmJkX2dlbmVyaWNfbWFrZV9yZXF1ZXN0KGRldmljZSwgZmF1bHRfdHlwZSwgYmlvKTsKIAl9IHdoaWxlIChiaW9zKTsKIAlyZXR1cm4gMDsKIApAQCAtMTM4NSwzNiArMTM5Miw0NCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYmRfcmVtb3ZlX2Vwb2NoX2VudHJ5X2ludGVydmFsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCBkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkJICAgICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBkcmJkX2ludGVydmFsICppID0gJnBlZXJfcmVxLT5pOwogCi0JZHJiZF9yZW1vdmVfaW50ZXJ2YWwoJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBpKTsKKwlkcmJkX3JlbW92ZV9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgaSk7CiAJZHJiZF9jbGVhcl9pbnRlcnZhbChpKTsKIAogCS8qIFdha2UgdXAgYW55IHByb2Nlc3NlcyB3YWl0aW5nIGZvciB0aGlzIHBlZXIgcmVxdWVzdCB0byBjb21wbGV0ZS4gICovCiAJaWYgKGktPndhaXRpbmcpCi0JCXdha2VfdXAoJm1kZXYtPm1pc2Nfd2FpdCk7CisJCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIH0KIAotdm9pZCBjb25uX3dhaXRfYWN0aXZlX2VlX2VtcHR5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyB2b2lkIGNvbm5fd2FpdF9hY3RpdmVfZWVfZW1wdHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlrcmVmX2dldCgmbWRldi0+a3JlZik7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCisJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgJm1kZXYtPmFjdGl2ZV9lZSk7Ci0JCWtyZWZfcHV0KCZtZGV2LT5rcmVmLCAmZHJiZF9taW5vcl9kZXN0cm95KTsKKwkJZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOworCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX0JhcnJpZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICoKK2Nvbm5fcGVlcl9kZXZpY2Uoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IHZvbHVtZV9udW1iZXIpCit7CisJcmV0dXJuIGlkcl9maW5kKCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHZvbHVtZV9udW1iZXIpOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfQmFycmllcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCWludCBydjsKIAlzdHJ1Y3QgcF9iYXJyaWVyICpwID0gcGktPmRhdGE7CkBAIC0xNDIzLDE2ICsxNDM4LDE2IEBACiAJLyogRklYTUUgdGhlc2UgYXJlIHVuYWNrZWQgb24gY29ubmVjdGlvbiwKIAkgKiBub3QgYSBzcGVjaWZpYyAocGVlcilkZXZpY2UuCiAJICovCi0JdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmJhcnJpZXJfbnIgPSBwLT5iYXJyaWVyOwotCXRjb25uLT5jdXJyZW50X2Vwb2NoLT50Y29ubiA9IHRjb25uOwotCXJ2ID0gZHJiZF9tYXlfZmluaXNoX2Vwb2NoKHRjb25uLCB0Y29ubi0+Y3VycmVudF9lcG9jaCwgRVZfR09UX0JBUlJJRVJfTlIpOworCWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmJhcnJpZXJfbnIgPSBwLT5iYXJyaWVyOworCWNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCXJ2ID0gZHJiZF9tYXlfZmluaXNoX2Vwb2NoKGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gsIEVWX0dPVF9CQVJSSUVSX05SKTsKIAogCS8qIFBfQkFSUklFUl9BQ0sgbWF5IGltcGx5IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW50IGlzIGRyb3BwZWQgZnJvbQogCSAqIHRoZSBhY3Rpdml0eSBsb2csIHdoaWNoIG1lYW5zIGl0IHdvdWxkIG5vdCBiZSByZXN5bmNlZCBpbiBjYXNlIHRoZQogCSAqIFJfUFJJTUFSWSBjcmFzaGVzIG5vdy4KIAkgKiBUaGVyZWZvcmUgd2UgbXVzdCBzZW5kIHRoZSBiYXJyaWVyX2FjayBhZnRlciB0aGUgYmFycmllciByZXF1ZXN0IHdhcwogCSAqIGNvbXBsZXRlZC4gKi8KLQlzd2l0Y2ggKHRjb25uLT53cml0ZV9vcmRlcmluZykgeworCXN3aXRjaCAoY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcpIHsKIAljYXNlIFdPX25vbmU6CiAJCWlmIChydiA9PSBGRV9SRUNZQ0xFRCkKIAkJCXJldHVybiAwOwpAQCAtMTQ0MywxNSArMTQ1OCwxNSBAQAogCQlpZiAoZXBvY2gpCiAJCQlicmVhazsKIAkJZWxzZQotCQkJY29ubl93YXJuKHRjb25uLCAiQWxsb2NhdGlvbiBvZiBhbiBlcG9jaCBmYWlsZWQsIHNsb3dpbmcgZG93blxuIik7CisJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIkFsbG9jYXRpb24gb2YgYW4gZXBvY2ggZmFpbGVkLCBzbG93aW5nIGRvd25cbiIpOwogCQkJLyogRmFsbCB0aHJvdWdoICovCiAKIAljYXNlIFdPX2JkZXZfZmx1c2g6CiAJY2FzZSBXT19kcmFpbl9pbzoKLQkJY29ubl93YWl0X2FjdGl2ZV9lZV9lbXB0eSh0Y29ubik7Ci0JCWRyYmRfZmx1c2godGNvbm4pOworCQljb25uX3dhaXRfYWN0aXZlX2VlX2VtcHR5KGNvbm5lY3Rpb24pOworCQlkcmJkX2ZsdXNoKGNvbm5lY3Rpb24pOwogCi0JCWlmIChhdG9taWNfcmVhZCgmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKSB7CisJCWlmIChhdG9taWNfcmVhZCgmY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkpIHsKIAkJCWVwb2NoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZXBvY2gpLCBHRlBfTk9JTyk7CiAJCQlpZiAoZXBvY2gpCiAJCQkJYnJlYWs7CkBAIC0xNDU5LDcgKzE0NzQsNyBAQAogCiAJCXJldHVybiAwOwogCWRlZmF1bHQ6Ci0JCWNvbm5fZXJyKHRjb25uLCAiU3RyYW5nZW5lc3MgaW4gdGNvbm4tPndyaXRlX29yZGVyaW5nICVkXG4iLCB0Y29ubi0+d3JpdGVfb3JkZXJpbmcpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiU3RyYW5nZW5lc3MgaW4gY29ubmVjdGlvbi0+d3JpdGVfb3JkZXJpbmcgJWRcbiIsIGNvbm5lY3Rpb24tPndyaXRlX29yZGVyaW5nKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xNDY3LDE2ICsxNDgyLDE2IEBACiAJYXRvbWljX3NldCgmZXBvY2gtPmVwb2NoX3NpemUsIDApOwogCWF0b21pY19zZXQoJmVwb2NoLT5hY3RpdmUsIDApOwogCi0Jc3Bpbl9sb2NrKCZ0Y29ubi0+ZXBvY2hfbG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSkpIHsKLQkJbGlzdF9hZGQoJmVwb2NoLT5saXN0LCAmdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOwotCQl0Y29ubi0+Y3VycmVudF9lcG9jaCA9IGVwb2NoOwotCQl0Y29ubi0+ZXBvY2hzKys7CisJc3Bpbl9sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmVwb2NoX3NpemUpKSB7CisJCWxpc3RfYWRkKCZlcG9jaC0+bGlzdCwgJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpOworCQljb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoID0gZXBvY2g7CisJCWNvbm5lY3Rpb24tPmVwb2NocysrOwogCX0gZWxzZSB7CiAJCS8qIFRoZSBjdXJyZW50X2Vwb2NoIGdvdCByZWN5Y2xlZCB3aGlsZSB3ZSBhbGxvY2F0ZWQgdGhpcyBvbmUuLi4gKi8KIAkJa2ZyZWUoZXBvY2gpOwogCX0KLQlzcGluX3VubG9jaygmdGNvbm4tPmVwb2NoX2xvY2spOworCXNwaW5fdW5sb2NrKCZjb25uZWN0aW9uLT5lcG9jaF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ4NCwyNSArMTQ5OSwyNiBAQAogLyogdXNlZCBmcm9tIHJlY2VpdmVfUlNEYXRhUmVwbHkgKHJlY3ZfcmVzeW5jX3JlYWQpCiAgKiBhbmQgZnJvbSByZWNlaXZlX0RhdGEgKi8KIHN0YXRpYyBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKgotcmVhZF9pbl9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1NjQgaWQsIHNlY3Rvcl90IHNlY3RvciwKK3JlYWRfaW5fYmxvY2soc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCB1NjQgaWQsIHNlY3Rvcl90IHNlY3RvciwKIAkgICAgICBpbnQgZGF0YV9zaXplKSBfX211c3RfaG9sZChsb2NhbCkKIHsKLQljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCWNvbnN0IHNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOwogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXE7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGRncywgZHMsIGVycjsKLQl2b2lkICpkaWdfaW4gPSBtZGV2LT50Y29ubi0+aW50X2RpZ19pbjsKLQl2b2lkICpkaWdfdnYgPSBtZGV2LT50Y29ubi0+aW50X2RpZ192djsKKwl2b2lkICpkaWdfaW4gPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+aW50X2RpZ19pbjsKKwl2b2lkICpkaWdfdnYgPSBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+aW50X2RpZ192djsKIAl1bnNpZ25lZCBsb25nICpkYXRhOwogCiAJZGdzID0gMDsKLQlpZiAobWRldi0+dGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSkgewotCQlkZ3MgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT5wZWVyX2ludGVncml0eV90Zm0pOworCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7CisJCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CiAJCS8qCiAJCSAqIEZJWE1FOiBSZWNlaXZlIHRoZSBpbmNvbWluZyBkaWdlc3QgaW50byB0aGUgcmVjZWl2ZSBidWZmZXIKIAkJICoJICBoZXJlLCB0b2dldGhlciB3aXRoIGl0cyBzdHJ1Y3QgcF9kYXRhPwogCQkgKi8KLQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKG1kZXYtPnRjb25uLCBkaWdfaW4sIGRncyk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGlnX2luLCBkZ3MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIE5VTEw7CiAJCWRhdGFfc2l6ZSAtPSBkZ3M7CkBAIC0xNTE2LDcgKzE1MzIsNyBAQAogCS8qIGV2ZW4gdGhvdWdoIHdlIHRydXN0IG91dCBwZWVyLAogCSAqIHdlIHNvbWV0aW1lcyBoYXZlIHRvIGRvdWJsZSBjaGVjay4gKi8KIAlpZiAoc2VjdG9yICsgKGRhdGFfc2l6ZT4+OSkgPiBjYXBhY2l0eSkgewotCQlkZXZfZXJyKERFViwgInJlcXVlc3QgZnJvbSBwZWVyIGJleW9uZCBlbmQgb2YgbG9jYWwgZGlzazogIgorCQlkcmJkX2VycihkZXZpY2UsICJyZXF1ZXN0IGZyb20gcGVlciBiZXlvbmQgZW5kIG9mIGxvY2FsIGRpc2s6ICIKIAkJCSJjYXBhY2l0eTogJWxsdXMgPCBzZWN0b3I6ICVsbHVzICsgc2l6ZTogJXVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWNhcGFjaXR5LAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIGRhdGFfc2l6ZSk7CkBAIC0xNTI2LDcgKzE1NDIsNyBAQAogCS8qIEdGUF9OT0lPLCBiZWNhdXNlIHdlIG11c3Qgbm90IGNhdXNlIGFyYml0cmFyeSB3cml0ZS1vdXQ6IGluIGEgRFJCRAogCSAqICJjcmlzcy1jcm9zcyIgc2V0dXAsIHRoYXQgbWlnaHQgY2F1c2Ugd3JpdGUtb3V0IG9uIHNvbWUgb3RoZXIgRFJCRCwKIAkgKiB3aGljaCBpbiB0dXJuIG1pZ2h0IGJsb2NrIG9uIHRoZSBvdGhlciBub2RlIGF0IHRoaXMgdmVyeSBwbGFjZS4gICovCi0JcGVlcl9yZXEgPSBkcmJkX2FsbG9jX3BlZXJfcmVxKG1kZXYsIGlkLCBzZWN0b3IsIGRhdGFfc2l6ZSwgR0ZQX05PSU8pOworCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShwZWVyX2RldmljZSwgaWQsIHNlY3RvciwgZGF0YV9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKCFwZWVyX3JlcSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE1MzgsMzYgKzE1NTQsMzYgQEAKIAlwYWdlX2NoYWluX2Zvcl9lYWNoKHBhZ2UpIHsKIAkJdW5zaWduZWQgbGVuID0gbWluX3QoaW50LCBkcywgUEFHRV9TSVpFKTsKIAkJZGF0YSA9IGttYXAocGFnZSk7Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihtZGV2LT50Y29ubiwgZGF0YSwgbGVuKTsKLQkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KG1kZXYsIERSQkRfRkFVTFRfUkVDRUlWRSkpIHsKLQkJCWRldl9lcnIoREVWLCAiRmF1bHQgaW5qZWN0aW9uOiBDb3JydXB0aW5nIGRhdGEgb24gcmVjZWl2ZVxuIik7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGF0YSwgbGVuKTsKKwkJaWYgKGRyYmRfaW5zZXJ0X2ZhdWx0KGRldmljZSwgRFJCRF9GQVVMVF9SRUNFSVZFKSkgeworCQkJZHJiZF9lcnIoZGV2aWNlLCAiRmF1bHQgaW5qZWN0aW9uOiBDb3JydXB0aW5nIGRhdGEgb24gcmVjZWl2ZVxuIik7CiAJCQlkYXRhWzBdID0gZGF0YVswXSBeICh1bnNpZ25lZCBsb25nKS0xOwogCQl9CiAJCWt1bm1hcChwYWdlKTsKIAkJaWYgKGVycikgewotCQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWRzIC09IGxlbjsKIAl9CiAKIAlpZiAoZGdzKSB7Ci0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtLCBwZWVyX3JlcSwgZGlnX3Z2KTsKKwkJZHJiZF9jc3VtX2VlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0sIHBlZXJfcmVxLCBkaWdfdnYpOwogCQlpZiAobWVtY21wKGRpZ19pbiwgZGlnX3Z2LCBkZ3MpKSB7Ci0JCQlkZXZfZXJyKERFViwgIkRpZ2VzdCBpbnRlZ3JpdHkgY2hlY2sgRkFJTEVEOiAlbGx1cyArJXVcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJEaWdlc3QgaW50ZWdyaXR5IGNoZWNrIEZBSUxFRDogJWxsdXMgKyV1XG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBkYXRhX3NpemUpOwotCQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwkJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQotCW1kZXYtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKKwlkZXZpY2UtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKIAlyZXR1cm4gcGVlcl9yZXE7CiB9CiAKIC8qIGRyYmRfZHJhaW5fYmxvY2soKSBqdXN0IHRha2VzIGEgZGF0YSBibG9jawogICogb3V0IG9mIHRoZSBzb2NrZXQgaW5wdXQgYnVmZmVyLCBhbmQgZGlzY2FyZHMgaXQuCiAgKi8KLXN0YXRpYyBpbnQgZHJiZF9kcmFpbl9ibG9jayhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgZGF0YV9zaXplKQorc3RhdGljIGludCBkcmJkX2RyYWluX2Jsb2NrKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgaW50IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgZXJyID0gMDsKQEAgLTE1NzYsMzYgKzE1OTIsMzYgQEAKIAlpZiAoIWRhdGFfc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlwYWdlID0gZHJiZF9hbGxvY19wYWdlcyhtZGV2LCAxLCAxKTsKKwlwYWdlID0gZHJiZF9hbGxvY19wYWdlcyhwZWVyX2RldmljZSwgMSwgMSk7CiAKIAlkYXRhID0ga21hcChwYWdlKTsKIAl3aGlsZSAoZGF0YV9zaXplKSB7CiAJCXVuc2lnbmVkIGludCBsZW4gPSBtaW5fdChpbnQsIGRhdGFfc2l6ZSwgUEFHRV9TSVpFKTsKIAotCQllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4obWRldi0+dGNvbm4sIGRhdGEsIGxlbik7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGF0YSwgbGVuKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCQlkYXRhX3NpemUgLT0gbGVuOwogCX0KIAlrdW5tYXAocGFnZSk7Ci0JZHJiZF9mcmVlX3BhZ2VzKG1kZXYsIHBhZ2UsIDApOworCWRyYmRfZnJlZV9wYWdlcyhwZWVyX2RldmljZS0+ZGV2aWNlLCBwYWdlLCAwKTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfZGxlc3NfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsCitzdGF0aWMgaW50IHJlY3ZfZGxlc3NfcmVhZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwKIAkJCSAgIHNlY3Rvcl90IHNlY3RvciwgaW50IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyBidmVjOwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IGRncywgZXJyLCBleHBlY3Q7Ci0Jdm9pZCAqZGlnX2luID0gbWRldi0+dGNvbm4tPmludF9kaWdfaW47Ci0Jdm9pZCAqZGlnX3Z2ID0gbWRldi0+dGNvbm4tPmludF9kaWdfdnY7CisJdm9pZCAqZGlnX2luID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludF9kaWdfaW47CisJdm9pZCAqZGlnX3Z2ID0gcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmludF9kaWdfdnY7CiAKIAlkZ3MgPSAwOwotCWlmIChtZGV2LT50Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7Ci0JCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSk7Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihtZGV2LT50Y29ubiwgZGlnX2luLCBkZ3MpOworCWlmIChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtKSB7CisJCWRncyA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGlnX2luLCBkZ3MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJZGF0YV9zaXplIC09IGRnczsKQEAgLTE2MTMsMTUgKzE2MjksMTUgQEAKIAogCS8qIG9wdGltaXN0aWNhbGx5IHVwZGF0ZSByZWN2X2NudC4gIGlmIHJlY2VpdmluZyBmYWlscyBiZWxvdywKIAkgKiB3ZSBkaXNjb25uZWN0IGFueXdheXMsIGFuZCBjb3VudGVycyB3aWxsIGJlIHJlc2V0LiAqLwotCW1kZXYtPnJlY3ZfY250ICs9IGRhdGFfc2l6ZT4+OTsKKwlwZWVyX2RldmljZS0+ZGV2aWNlLT5yZWN2X2NudCArPSBkYXRhX3NpemU+Pjk7CiAKIAliaW8gPSByZXEtPm1hc3Rlcl9iaW87Ci0JRF9BU1NFUlQoc2VjdG9yID09IGJpby0+YmlfaXRlci5iaV9zZWN0b3IpOworCURfQVNTRVJUKHBlZXJfZGV2aWNlLT5kZXZpY2UsIHNlY3RvciA9PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKIAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaXRlcikgewogCQl2b2lkICptYXBwZWQgPSBrbWFwKGJ2ZWMuYnZfcGFnZSkgKyBidmVjLmJ2X29mZnNldDsKIAkJZXhwZWN0ID0gbWluX3QoaW50LCBkYXRhX3NpemUsIGJ2ZWMuYnZfbGVuKTsKLQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKG1kZXYtPnRjb25uLCBtYXBwZWQsIGV4cGVjdCk7CisJCWVyciA9IGRyYmRfcmVjdl9hbGxfd2FybihwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgbWFwcGVkLCBleHBlY3QpOwogCQlrdW5tYXAoYnZlYy5idl9wYWdlKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC0xNjI5LDE0ICsxNjQ1LDE0IEBACiAJfQogCiAJaWYgKGRncykgewotCQlkcmJkX2NzdW1fYmlvKG1kZXYsIG1kZXYtPnRjb25uLT5wZWVyX2ludGVncml0eV90Zm0sIGJpbywgZGlnX3Z2KTsKKwkJZHJiZF9jc3VtX2JpbyhwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+cGVlcl9pbnRlZ3JpdHlfdGZtLCBiaW8sIGRpZ192dik7CiAJCWlmIChtZW1jbXAoZGlnX2luLCBkaWdfdnYsIGRncykpIHsKLQkJCWRldl9lcnIoREVWLCAiRGlnZXN0IGludGVncml0eSBjaGVjayBGQUlMRUQuIEJyb2tlbiBOSUNzP1xuIik7CisJCQlkcmJkX2VycihwZWVyX2RldmljZSwgIkRpZ2VzdCBpbnRlZ3JpdHkgY2hlY2sgRkFJTEVELiBCcm9rZW4gTklDcz9cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKLQlEX0FTU0VSVChkYXRhX3NpemUgPT0gMCk7CisJRF9BU1NFUlQocGVlcl9kZXZpY2UtPmRldmljZSwgZGF0YV9zaXplID09IDApOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQ4LDY0ICsxNjY0LDY3IEBACiB7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSA9CiAJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSA9IHBlZXJfcmVxLT5wZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJc2VjdG9yX3Qgc2VjdG9yID0gcGVlcl9yZXEtPmkuc2VjdG9yOwogCWludCBlcnI7CiAKLQlEX0FTU0VSVChkcmJkX2ludGVydmFsX2VtcHR5KCZwZWVyX3JlcS0+aSkpOworCURfQVNTRVJUKGRldmljZSwgZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKIAogCWlmIChsaWtlbHkoKHBlZXJfcmVxLT5mbGFncyAmIEVFX1dBU19FUlJPUikgPT0gMCkpIHsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwotCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUlNfV1JJVEVfQUNLLCBwZWVyX3JlcSk7CisJCWRyYmRfc2V0X2luX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX1JTX1dSSVRFX0FDSywgcGVlcl9yZXEpOwogCX0gZWxzZSB7CiAJCS8qIFJlY29yZCBmYWlsdXJlIHRvIHN5bmMgKi8KLQkJZHJiZF9yc19mYWlsZWRfaW8obWRldiwgc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJZHJiZF9yc19mYWlsZWRfaW8oZGV2aWNlLCBzZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwogCi0JCWVyciAgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX0FDSywgcGVlcl9yZXEpOworCQllcnIgID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwZWVyX3JlcSk7CiAJfQotCWRlY191bmFja2VkKG1kZXYpOworCWRlY191bmFja2VkKGRldmljZSk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfcmVzeW5jX3JlYWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgZGF0YV9zaXplKSBfX3JlbGVhc2VzKGxvY2FsKQorc3RhdGljIGludCByZWN2X3Jlc3luY19yZWFkKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgc2VjdG9yX3Qgc2VjdG9yLAorCQkJICAgIGludCBkYXRhX3NpemUpIF9fcmVsZWFzZXMobG9jYWwpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXE7CiAKLQlwZWVyX3JlcSA9IHJlYWRfaW5fYmxvY2sobWRldiwgSURfU1lOQ0VSLCBzZWN0b3IsIGRhdGFfc2l6ZSk7CisJcGVlcl9yZXEgPSByZWFkX2luX2Jsb2NrKHBlZXJfZGV2aWNlLCBJRF9TWU5DRVIsIHNlY3RvciwgZGF0YV9zaXplKTsKIAlpZiAoIXBlZXJfcmVxKQogCQlnb3RvIGZhaWw7CiAKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JaW5jX3VuYWNrZWQobWRldik7CisJaW5jX3VuYWNrZWQoZGV2aWNlKTsKIAkvKiBjb3JyZXNwb25kaW5nIGRlY191bmFja2VkKCkgaW4gZV9lbmRfcmVzeW5jX2Jsb2NrKCkKIAkgKiByZXNwZWN0aXZlIF9kcmJkX2NsZWFyX2RvbmVfZWUgKi8KIAogCXBlZXJfcmVxLT53LmNiID0gZV9lbmRfcmVzeW5jX2Jsb2NrOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZCgmcGVlcl9yZXEtPncubGlzdCwgJm1kZXYtPnN5bmNfZWUpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnN5bmNfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JYXRvbWljX2FkZChkYXRhX3NpemUgPj4gOSwgJm1kZXYtPnJzX3NlY3RfZXYpOwotCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QobWRldiwgcGVlcl9yZXEsIFdSSVRFLCBEUkJEX0ZBVUxUX1JTX1dSKSA9PSAwKQorCWF0b21pY19hZGQoZGF0YV9zaXplID4+IDksICZkZXZpY2UtPnJzX3NlY3RfZXYpOworCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QoZGV2aWNlLCBwZWVyX3JlcSwgV1JJVEUsIERSQkRfRkFVTFRfUlNfV1IpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogZG9uJ3QgY2FyZSBmb3IgdGhlIHJlYXNvbiBoZXJlICovCi0JZGV2X2VycihERVYsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJZHJiZF9lcnIoZGV2aWNlLCAic3VibWl0IGZhaWxlZCwgdHJpZ2dlcmluZyByZS1jb25uZWN0XG4iKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogZmFpbDoKLQlwdXRfbGRldihtZGV2KTsKKwlwdXRfbGRldihkZXZpY2UpOwogCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqCi1maW5kX3JlcXVlc3Qoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBpZCwKK2ZpbmRfcmVxdWVzdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBpZCwKIAkgICAgIHNlY3Rvcl90IHNlY3RvciwgYm9vbCBtaXNzaW5nX29rLCBjb25zdCBjaGFyICpmdW5jKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKQEAgLTE3MTUsMzYgKzE3MzQsMzggQEAKIAlpZiAoZHJiZF9jb250YWluc19pbnRlcnZhbChyb290LCBzZWN0b3IsICZyZXEtPmkpICYmIHJlcS0+aS5sb2NhbCkKIAkJcmV0dXJuIHJlcTsKIAlpZiAoIW1pc3Npbmdfb2spIHsKLQkJZGV2X2VycihERVYsICIlczogZmFpbGVkIHRvIGZpbmQgcmVxdWVzdCAweCVseCwgc2VjdG9yICVsbHVzXG4iLCBmdW5jLAorCQlkcmJkX2VycihkZXZpY2UsICIlczogZmFpbGVkIHRvIGZpbmQgcmVxdWVzdCAweCVseCwgc2VjdG9yICVsbHVzXG4iLCBmdW5jLAogCQkJKHVuc2lnbmVkIGxvbmcpaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yKTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9EYXRhUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX0RhdGFSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcF9kYXRhICpwID0gcGktPmRhdGE7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCXJlcSA9IGZpbmRfcmVxdWVzdChtZGV2LCAmbWRldi0+cmVhZF9yZXF1ZXN0cywgcC0+YmxvY2tfaWQsIHNlY3RvciwgZmFsc2UsIF9fZnVuY19fKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlcSA9IGZpbmRfcmVxdWVzdChkZXZpY2UsICZkZXZpY2UtPnJlYWRfcmVxdWVzdHMsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIGZhbHNlLCBfX2Z1bmNfXyk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJaWYgKHVubGlrZWx5KCFyZXEpKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIGhsaXN0X2RlbCgmcmVxLT5jb2xsaXNpb24pIGlzIGRvbmUgaW4gX3JlcV9tYXlfYmVfZG9uZSwgdG8gYXZvaWQKIAkgKiBzcGVjaWFsIGNhc2luZyBpdCB0aGVyZSBmb3IgdGhlIHZhcmlvdXMgZmFpbHVyZSBjYXNlcy4KIAkgKiBzdGlsbCBubyByYWNlIHdpdGggZHJiZF9mYWlsX3BlbmRpbmdfcmVhZHMgKi8KLQllcnIgPSByZWN2X2RsZXNzX3JlYWQobWRldiwgcmVxLCBzZWN0b3IsIHBpLT5zaXplKTsKKwllcnIgPSByZWN2X2RsZXNzX3JlYWQocGVlcl9kZXZpY2UsIHJlcSwgc2VjdG9yLCBwaS0+c2l6ZSk7CiAJaWYgKCFlcnIpCiAJCXJlcV9tb2QocmVxLCBEQVRBX1JFQ0VJVkVEKTsKIAkvKiBlbHNlOiBub3RoaW5nLiBoYW5kbGVkIGZyb20gZHJiZF9kaXNjb25uZWN0Li4uCkBAIC0xNzU0LDQ2ICsxNzc1LDQ4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1JTRGF0YVJlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9SU0RhdGFSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXNlY3Rvcl90IHNlY3RvcjsKIAlpbnQgZXJyOwogCXN0cnVjdCBwX2RhdGEgKnAgPSBwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJc2VjdG9yID0gYmU2NF90b19jcHUocC0+c2VjdG9yKTsKLQlEX0FTU0VSVChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpOworCURfQVNTRVJUKGRldmljZSwgcC0+YmxvY2tfaWQgPT0gSURfU1lOQ0VSKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgeworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CiAJCS8qIGRhdGEgaXMgc3VibWl0dGVkIHRvIGRpc2sgd2l0aGluIHJlY3ZfcmVzeW5jX3JlYWQuCiAJCSAqIGNvcnJlc3BvbmRpbmcgcHV0X2xkZXYgZG9uZSBiZWxvdyBvbiBlcnJvciwKIAkJICogb3IgaW4gZHJiZF9wZWVyX3JlcXVlc3RfZW5kaW8uICovCi0JCWVyciA9IHJlY3ZfcmVzeW5jX3JlYWQobWRldiwgc2VjdG9yLCBwaS0+c2l6ZSk7CisJCWVyciA9IHJlY3ZfcmVzeW5jX3JlYWQocGVlcl9kZXZpY2UsIHNlY3RvciwgcGktPnNpemUpOwogCX0gZWxzZSB7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJDYW4gbm90IHdyaXRlIHJlc3luYyBkYXRhIHRvIGxvY2FsIGRpc2suXG4iKTsKKwkJCWRyYmRfZXJyKGRldmljZSwgIkNhbiBub3Qgd3JpdGUgcmVzeW5jIGRhdGEgdG8gbG9jYWwgZGlzay5cbiIpOwogCi0JCWVyciA9IGRyYmRfZHJhaW5fYmxvY2sobWRldiwgcGktPnNpemUpOworCQllcnIgPSBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAKLQkJZHJiZF9zZW5kX2Fja19kcChtZGV2LCBQX05FR19BQ0ssIHAsIHBpLT5zaXplKTsKKwkJZHJiZF9zZW5kX2Fja19kcChwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwLCBwaS0+c2l6ZSk7CiAJfQogCi0JYXRvbWljX2FkZChwaS0+c2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJYXRvbWljX2FkZChwaS0+c2l6ZSA+PiA5LCAmZGV2aWNlLT5yc19zZWN0X2luKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCByZXN0YXJ0X2NvbmZsaWN0aW5nX3dyaXRlcyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkgICAgICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXE7CiAKLQlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKKwlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSkgewogCQlpZiAoIWktPmxvY2FsKQogCQkJY29udGludWU7CiAJCXJlcSA9IGNvbnRhaW5lcl9vZihpLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0LCBpKTsKQEAgLTE4MTMsNTIgKzE4MzYsNTMgQEAKIHsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBwZWVyX3JlcS0+aS5zZWN0b3I7CiAJaW50IGVyciA9IDAsIHBjbWQ7CiAKIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfU0VORF9XUklURV9BQ0spIHsKIAkJaWYgKGxpa2VseSgocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSA9PSAwKSkgewotCQkJcGNtZCA9IChtZGV2LT5zdGF0ZS5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYKLQkJCQltZGV2LT5zdGF0ZS5jb25uIDw9IENfUEFVU0VEX1NZTkNfVCAmJgorCQkJcGNtZCA9IChkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJgorCQkJCWRldmljZS0+c3RhdGUuY29ubiA8PSBDX1BBVVNFRF9TWU5DX1QgJiYKIAkJCQlwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9NQVlfU0VUX0lOX1NZTkMpID8KIAkJCQlQX1JTX1dSSVRFX0FDSyA6IFBfV1JJVEVfQUNLOwotCQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBwY21kLCBwZWVyX3JlcSk7CisJCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBwY21kLCBwZWVyX3JlcSk7CiAJCQlpZiAocGNtZCA9PSBQX1JTX1dSSVRFX0FDSykKLQkJCQlkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CisJCQkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CiAJCX0gZWxzZSB7Ci0JCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX0FDSywgcGVlcl9yZXEpOworCQkJZXJyID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfQUNLLCBwZWVyX3JlcSk7CiAJCQkvKiB3ZSBleHBlY3QgaXQgdG8gYmUgbWFya2VkIG91dCBvZiBzeW5jIGFueXdheXMuLi4KIAkJCSAqIG1heWJlIGFzc2VydCB0aGlzPyAgKi8KIAkJfQotCQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZGVjX3VuYWNrZWQoZGV2aWNlKTsKIAl9CiAJLyogd2UgZGVsZXRlIGZyb20gdGhlIGNvbmZsaWN0IGRldGVjdGlvbiBoYXNoIF9hZnRlcl8gd2Ugc2VudCBvdXQgdGhlCiAJICogUF9XUklURV9BQ0sgLyBQX05FR19BQ0ssIHRvIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIHJpZ2h0LiAgKi8KIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfSU5fSU5URVJWQUxfVFJFRSkgewotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCQlEX0FTU0VSVCghZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKLQkJZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJCURfQVNTRVJUKGRldmljZSwgIWRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CisJCWRyYmRfcmVtb3ZlX2Vwb2NoX2VudHJ5X2ludGVydmFsKGRldmljZSwgcGVlcl9yZXEpOwogCQlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfUkVTVEFSVF9SRVFVRVNUUykKLQkJCXJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKG1kZXYsIHNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJCXJlc3RhcnRfY29uZmxpY3Rpbmdfd3JpdGVzKGRldmljZSwgc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfSBlbHNlCi0JCURfQVNTRVJUKGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnBlZXJfcmVxLT5pKSk7CisJCURfQVNTRVJUKGRldmljZSwgZHJiZF9pbnRlcnZhbF9lbXB0eSgmcGVlcl9yZXEtPmkpKTsKIAotCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaChtZGV2LT50Y29ubiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyAoY2FuY2VsID8gRVZfQ0xFQU5VUCA6IDApKTsKKwlkcmJkX21heV9maW5pc2hfZXBvY2goZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyAoY2FuY2VsID8gRVZfQ0xFQU5VUCA6IDApKTsKIAogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgZV9zZW5kX2FjayhzdHJ1Y3QgZHJiZF93b3JrICp3LCBlbnVtIGRyYmRfcGFja2V0IGFjaykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKIAlzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxID0KIAkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCwgdyk7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlOwogCWludCBlcnI7CiAKLQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIGFjaywgcGVlcl9yZXEpOwotCWRlY191bmFja2VkKG1kZXYpOworCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIGFjaywgcGVlcl9yZXEpOworCWRlY191bmFja2VkKHBlZXJfZGV2aWNlLT5kZXZpY2UpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE4NzAsOSArMTg5NCwxMSBAQAogCiBzdGF0aWMgaW50IGVfc2VuZF9yZXRyeV93cml0ZShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgdW51c2VkKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IHctPm1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gcGVlcl9yZXEtPnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uOwogCi0JcmV0dXJuIGVfc2VuZF9hY2sodywgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDAgPworCXJldHVybiBlX3NlbmRfYWNrKHcsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSAxMDAgPwogCQkJICAgICBQX1JFVFJZX1dSSVRFIDogUF9TVVBFUlNFREVEKTsKIH0KIApAQCAtMTg5MSwxOCArMTkxNywxOSBAQAogCXJldHVybiBzZXFfZ3JlYXRlcihhLCBiKSA/IGEgOiBiOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfcGVlcl9zZXEoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5zaWduZWQgaW50IHBlZXJfc2VxKQorc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJfc2VxKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwgdW5zaWduZWQgaW50IHBlZXJfc2VxKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAl1bnNpZ25lZCBpbnQgbmV3ZXN0X3BlZXJfc2VxOwogCi0JaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgewotCQlzcGluX2xvY2soJm1kZXYtPnBlZXJfc2VxX2xvY2spOwotCQluZXdlc3RfcGVlcl9zZXEgPSBzZXFfbWF4KG1kZXYtPnBlZXJfc2VxLCBwZWVyX3NlcSk7Ci0JCW1kZXYtPnBlZXJfc2VxID0gbmV3ZXN0X3BlZXJfc2VxOwotCQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7Ci0JCS8qIHdha2UgdXAgb25seSBpZiB3ZSBhY3R1YWxseSBjaGFuZ2VkIG1kZXYtPnBlZXJfc2VxICovCisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkgeworCQlzcGluX2xvY2soJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CisJCW5ld2VzdF9wZWVyX3NlcSA9IHNlcV9tYXgoZGV2aWNlLT5wZWVyX3NlcSwgcGVlcl9zZXEpOworCQlkZXZpY2UtPnBlZXJfc2VxID0gbmV3ZXN0X3BlZXJfc2VxOworCQlzcGluX3VubG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKKwkJLyogd2FrZSB1cCBvbmx5IGlmIHdlIGFjdHVhbGx5IGNoYW5nZWQgZGV2aWNlLT5wZWVyX3NlcSAqLwogCQlpZiAocGVlcl9zZXEgPT0gbmV3ZXN0X3BlZXJfc2VxKQotCQkJd2FrZV91cCgmbWRldi0+c2VxX3dhaXQpOworCQkJd2FrZV91cCgmZGV2aWNlLT5zZXFfd2FpdCk7CiAJfQogfQogCkBAIC0xOTEyLDIwICsxOTM5LDIwIEBACiB9CiAKIC8qIG1heWJlIGNoYW5nZSBzeW5jX2VlIGludG8gaW50ZXJ2YWwgdHJlZXMgYXMgd2VsbD8gKi8KLXN0YXRpYyBib29sIG92ZXJsYXBwaW5nX3Jlc3luY193cml0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQorc3RhdGljIGJvb2wgb3ZlcmxhcHBpbmdfcmVzeW5jX3dyaXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcnNfcmVxOwogCWJvb2wgcnYgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzX3JlcSwgJm1kZXYtPnN5bmNfZWUsIHcubGlzdCkgeworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzX3JlcSwgJmRldmljZS0+c3luY19lZSwgdy5saXN0KSB7CiAJCWlmIChvdmVybGFwcyhwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUsCiAJCQkgICAgIHJzX3JlcS0+aS5zZWN0b3IsIHJzX3JlcS0+aS5zaXplKSkgewogCQkJcnYgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuIHJ2OwogfQpAQCAtMTkzOSw5ICsxOTY2LDkgQEAKICAqCiAgKiBOb3RlOiB3ZSBkb24ndCBjYXJlIGZvciBBY2sgcGFja2V0cyBvdmVydGFraW5nIFBfREFUQSBwYWNrZXRzLgogICoKLSAqIEluIGNhc2UgcGFja2V0X3NlcSBpcyBsYXJnZXIgdGhhbiBtZGV2LT5wZWVyX3NlcSBudW1iZXIsIHRoZXJlIGFyZQorICogSW4gY2FzZSBwYWNrZXRfc2VxIGlzIGxhcmdlciB0aGFuIGRldmljZS0+cGVlcl9zZXEgbnVtYmVyLCB0aGVyZSBhcmUKICAqIG91dHN0YW5kaW5nIHBhY2tldHMgb24gdGhlIG1zb2NrLiBXZSB3YWl0IGZvciB0aGVtIHRvIGFycml2ZS4KLSAqIEluIGNhc2Ugd2UgYXJlIHRoZSBsb2dpY2FsbHkgbmV4dCBwYWNrZXQsIHdlIHVwZGF0ZSBtZGV2LT5wZWVyX3NlcQorICogSW4gY2FzZSB3ZSBhcmUgdGhlIGxvZ2ljYWxseSBuZXh0IHBhY2tldCwgd2UgdXBkYXRlIGRldmljZS0+cGVlcl9zZXEKICAqIG91cnNlbHZlcy4gQ29ycmVjdGx5IGhhbmRsZXMgMzJiaXQgd3JhcCBhcm91bmQuCiAgKgogICogQXNzdW1lIHdlIGhhdmUgYSAxMCBHQml0IGNvbm5lY3Rpb24sIHRoYXQgaXMgYWJvdXQgMTw8MzAgYnl0ZSBwZXIgc2Vjb25kLApAQCAtMTk1MSwxOSArMTk3OCwyMCBAQAogICoKICAqIHJldHVybnMgMCBpZiB3ZSBtYXkgcHJvY2VzcyB0aGUgcGFja2V0LAogICogLUVSRVNUQVJUU1lTIGlmIHdlIHdlcmUgaW50ZXJydXB0ZWQgKGJ5IGRpc2Nvbm5lY3Qgc2lnbmFsKS4gKi8KLXN0YXRpYyBpbnQgd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1MzIgcGVlcl9zZXEpCitzdGF0aWMgaW50IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCBjb25zdCB1MzIgcGVlcl9zZXEpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCURFRklORV9XQUlUKHdhaXQpOwogCWxvbmcgdGltZW91dDsKIAlpbnQgcmV0ID0gMCwgdHA7CiAKLQlpZiAoIXRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2soJm1kZXYtPnBlZXJfc2VxX2xvY2spOworCXNwaW5fbG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKIAlmb3IgKDs7KSB7Ci0JCWlmICghc2VxX2dyZWF0ZXIocGVlcl9zZXEgLSAxLCBtZGV2LT5wZWVyX3NlcSkpIHsKLQkJCW1kZXYtPnBlZXJfc2VxID0gc2VxX21heChtZGV2LT5wZWVyX3NlcSwgcGVlcl9zZXEpOworCQlpZiAoIXNlcV9ncmVhdGVyKHBlZXJfc2VxIC0gMSwgZGV2aWNlLT5wZWVyX3NlcSkpIHsKKwkJCWRldmljZS0+cGVlcl9zZXEgPSBzZXFfbWF4KGRldmljZS0+cGVlcl9zZXEsIHBlZXJfc2VxKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE5NzMsMzUgKzIwMDEsMzUgQEAKIAkJfQogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJdHAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dHdvX3ByaW1hcmllczsKKwkJdHAgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT50d29fcHJpbWFyaWVzOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQlpZiAoIXRwKQogCQkJYnJlYWs7CiAKIAkJLyogT25seSBuZWVkIHRvIHdhaXQgaWYgdHdvX3ByaW1hcmllcyBpcyBlbmFibGVkICovCi0JCXByZXBhcmVfdG9fd2FpdCgmbWRldi0+c2VxX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5zZXFfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnBlZXJfc2VxX2xvY2spOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXRpbWVvdXQgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbypIWi8xMDsKKwkJdGltZW91dCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5waW5nX3RpbWVvKkhaLzEwOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JCXNwaW5fbG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7CisJCXNwaW5fbG9jaygmZGV2aWNlLT5wZWVyX3NlcV9sb2NrKTsKIAkJaWYgKCF0aW1lb3V0KSB7CiAJCQlyZXQgPSAtRVRJTUVET1VUOwotCQkJZGV2X2VycihERVYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWlzc2luZyBhY2sgcGFja2V0czsgZGlzY29ubmVjdGluZ1xuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWlzc2luZyBhY2sgcGFja2V0czsgZGlzY29ubmVjdGluZ1xuIik7CiAJCQlicmVhazsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmbWRldi0+cGVlcl9zZXFfbG9jayk7Ci0JZmluaXNoX3dhaXQoJm1kZXYtPnNlcV93YWl0LCAmd2FpdCk7CisJc3Bpbl91bmxvY2soJmRldmljZS0+cGVlcl9zZXFfbG9jayk7CisJZmluaXNoX3dhaXQoJmRldmljZS0+c2VxX3dhaXQsICZ3YWl0KTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBzZWUgYWxzbyBiaW9fZmxhZ3NfdG9fd2lyZSgpCiAgKiBEUkJEX1JFUV8qLCBiZWNhdXNlIHdlIG5lZWQgdG8gc2VtYW50aWNhbGx5IG1hcCB0aGUgZmxhZ3MgdG8gZGF0YSBwYWNrZXQKICAqIGZsYWdzIGFuZCBiYWNrLiBXZSBtYXkgcmVwbGljYXRlIHRvIG90aGVyIGtlcm5lbCB2ZXJzaW9ucy4gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpcmVfZmxhZ3NfdG9fYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHUzMiBkcGYpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3aXJlX2ZsYWdzX3RvX2Jpbyh1MzIgZHBmKQogewogCXJldHVybiAgKGRwZiAmIERQX1JXX1NZTkMgPyBSRVFfU1lOQyA6IDApIHwKIAkJKGRwZiAmIERQX0ZVQSA/IFJFUV9GVUEgOiAwKSB8CkBAIC0yMDA5LDEzICsyMDM3LDEzIEBACiAJCShkcGYgJiBEUF9ESVNDQVJEID8gUkVRX0RJU0NBUkQgOiAwKTsKIH0KIAotc3RhdGljIHZvaWQgZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLAorc3RhdGljIHZvaWQgZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJCQkgICAgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmk7CiAKICAgICByZXBlYXQ6Ci0JZHJiZF9mb3JfZWFjaF9vdmVybGFwKGksICZtZGV2LT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKSB7CisJZHJiZF9mb3JfZWFjaF9vdmVybGFwKGksICZkZXZpY2UtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKIAkJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxOwogCQlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCkBAIC0yMDI2LDE5ICsyMDU0LDE5IEBACiAJCQljb250aW51ZTsKIAkJcmVxLT5ycV9zdGF0ZSAmPSB+UlFfUE9TVFBPTkVEOwogCQlfX3JlcV9tb2QocmVxLCBORUdfQUNLRUQsICZtKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJaWYgKG0uYmlvKQotCQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCQljb21wbGV0ZV9tYXN0ZXJfYmlvKGRldmljZSwgJm0pOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCWdvdG8gcmVwZWF0OwogCX0KIH0KIAotc3RhdGljIGludCBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW50IGhhbmRsZV93cml0ZV9jb25mbGljdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQogewotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOwotCWJvb2wgcmVzb2x2ZV9jb25mbGljdHMgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnRjb25uLT5mbGFncyk7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHBlZXJfcmVxLT5wZWVyX2RldmljZS0+Y29ubmVjdGlvbjsKKwlib29sIHJlc29sdmVfY29uZmxpY3RzID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJc2VjdG9yX3Qgc2VjdG9yID0gcGVlcl9yZXEtPmkuc2VjdG9yOwogCWNvbnN0IHVuc2lnbmVkIGludCBzaXplID0gcGVlcl9yZXEtPmkuc2l6ZTsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKQEAgLTIwNDksMTAgKzIwNzcsMTAgQEAKIAkgKiBJbnNlcnRpbmcgdGhlIHBlZXIgcmVxdWVzdCBpbnRvIHRoZSB3cml0ZV9yZXF1ZXN0cyB0cmVlIHdpbGwgcHJldmVudAogCSAqIG5ldyBjb25mbGljdGluZyBsb2NhbCByZXF1ZXN0cyBmcm9tIGJlaW5nIGFkZGVkLgogCSAqLwotCWRyYmRfaW5zZXJ0X2ludGVydmFsKCZtZGV2LT53cml0ZV9yZXF1ZXN0cywgJnBlZXJfcmVxLT5pKTsKKwlkcmJkX2luc2VydF9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgJnBlZXJfcmVxLT5pKTsKIAogICAgIHJlcGVhdDoKLQlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpIHsKKwlkcmJkX2Zvcl9lYWNoX292ZXJsYXAoaSwgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSkgewogCQlpZiAoaSA9PSAmcGVlcl9yZXEtPmkpCiAJCQljb250aW51ZTsKIApAQCAtMjA2Miw3ICsyMDkwLDcgQEAKIAkJCSAqIHNob3VsZCBub3QgaGFwcGVuIGluIGEgdHdvLW5vZGUgc2V0dXAuICBXYWl0IGZvciB0aGUKIAkJCSAqIGVhcmxpZXIgcGVlciByZXF1ZXN0IHRvIGNvbXBsZXRlLgogCQkJICovCi0JCQllcnIgPSBkcmJkX3dhaXRfbWlzYyhtZGV2LCBpKTsKKwkJCWVyciA9IGRyYmRfd2FpdF9taXNjKGRldmljZSwgaSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gb3V0OwogCQkJZ290byByZXBlYXQ7CkBAIC0yMDgwLDE4ICsyMTA4LDE4IEBACiAJCQkJICAgICAgIChpLT5zaXplID4+IDkpID49IHNlY3RvciArIChzaXplID4+IDkpOwogCiAJCQlpZiAoIWVxdWFsKQotCQkJCWRldl9hbGVydChERVYsICJDb25jdXJyZW50IHdyaXRlcyBkZXRlY3RlZDogIgorCQkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiQ29uY3VycmVudCB3cml0ZXMgZGV0ZWN0ZWQ6ICIKIAkJCQkJICAgICAgICJsb2NhbD0lbGx1cyArJXUsIHJlbW90ZT0lbGx1cyArJXUsICIKIAkJCQkJICAgICAgICJhc3N1bWluZyAlcyBjYW1lIGZpcnN0XG4iLAogCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaS0+c2VjdG9yLCBpLT5zaXplLAogCQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplLAogCQkJCQkgIHN1cGVyc2VkZWQgPyAibG9jYWwiIDogInJlbW90ZSIpOwogCi0JCQlpbmNfdW5hY2tlZChtZGV2KTsKKwkJCWluY191bmFja2VkKGRldmljZSk7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHN1cGVyc2VkZWQgPyBlX3NlbmRfc3VwZXJzZWRlZCA6CiAJCQkJCQkgICBlX3NlbmRfcmV0cnlfd3JpdGU7Ci0JCQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+ZG9uZV9lZSk7Ci0JCQl3YWtlX2FzZW5kZXIobWRldi0+dGNvbm4pOworCQkJbGlzdF9hZGRfdGFpbCgmcGVlcl9yZXEtPncubGlzdCwgJmRldmljZS0+ZG9uZV9lZSk7CisJCQl3YWtlX2FzZW5kZXIoY29ubmVjdGlvbik7CiAKIAkJCWVyciA9IC1FTk9FTlQ7CiAJCQlnb3RvIG91dDsKQEAgLTIxMDAsNyArMjEyOCw3IEBACiAJCQkJY29udGFpbmVyX29mKGksIHN0cnVjdCBkcmJkX3JlcXVlc3QsIGkpOwogCiAJCQlpZiAoIWVxdWFsKQotCQkJCWRldl9hbGVydChERVYsICJDb25jdXJyZW50IHdyaXRlcyBkZXRlY3RlZDogIgorCQkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiQ29uY3VycmVudCB3cml0ZXMgZGV0ZWN0ZWQ6ICIKIAkJCQkJICAgICAgICJsb2NhbD0lbGx1cyArJXUsIHJlbW90ZT0lbGx1cyArJXVcbiIsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylpLT5zZWN0b3IsIGktPnNpemUsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IsIHNpemUpOwpAQCAtMjExOCwxMiArMjE0NiwxMCBAQAogCQkJCSAqIHJlcXVlc3QgdG8gZmluaXNoIGxvY2FsbHkgYmVmb3JlIHN1Ym1pdHRpbmcKIAkJCQkgKiB0aGUgY29uZmxpY3RpbmcgcGVlciByZXF1ZXN0LgogCQkJCSAqLwotCQkJCWVyciA9IGRyYmRfd2FpdF9taXNjKG1kZXYsICZyZXEtPmkpOworCQkJCWVyciA9IGRyYmRfd2FpdF9taXNjKGRldmljZSwgJnJlcS0+aSk7CiAJCQkJaWYgKGVycikgewotCQkJCQlfY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLAotCQkJCQkJCSAgICBOUyhjb25uLCBDX1RJTUVPVVQpLAotCQkJCQkJCSAgICBDU19IQVJEKTsKLQkJCQkJZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJCQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1RJTUVPVVQpLCBDU19IQVJEKTsKKwkJCQkJZmFpbF9wb3N0cG9uZWRfcmVxdWVzdHMoZGV2aWNlLCBzZWN0b3IsIHNpemUpOwogCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQkJZ290byByZXBlYXQ7CkBAIC0yMTM5LDE0ICsyMTY1LDE1IEBACiAKICAgICBvdXQ6CiAJaWYgKGVycikKLQkJZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChkZXZpY2UsIHBlZXJfcmVxKTsKIAlyZXR1cm4gZXJyOwogfQogCiAvKiBtaXJyb3JlZCB3cml0ZSAqLwotc3RhdGljIGludCByZWNlaXZlX0RhdGEoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX0RhdGEoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcTsKIAlzdHJ1Y3QgcF9kYXRhICpwID0gcGktPmRhdGE7CkBAIC0yMTU1LDE3ICsyMTgyLDE4IEBACiAJdTMyIGRwX2ZsYWdzOwogCWludCBlcnIsIHRwOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCWludCBlcnIyOwogCi0JCWVyciA9IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEobWRldiwgcGVlcl9zZXEpOwotCQlkcmJkX3NlbmRfYWNrX2RwKG1kZXYsIFBfTkVHX0FDSywgcCwgcGktPnNpemUpOwotCQlhdG9taWNfaW5jKCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSk7Ci0JCWVycjIgPSBkcmJkX2RyYWluX2Jsb2NrKG1kZXYsIHBpLT5zaXplKTsKKwkJZXJyID0gd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgcGVlcl9zZXEpOworCQlkcmJkX3NlbmRfYWNrX2RwKHBlZXJfZGV2aWNlLCBQX05FR19BQ0ssIHAsIHBpLT5zaXplKTsKKwkJYXRvbWljX2luYygmY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+ZXBvY2hfc2l6ZSk7CisJCWVycjIgPSBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAJCWlmICghZXJyKQogCQkJZXJyID0gZXJyMjsKIAkJcmV0dXJuIGVycjsKQEAgLTIxNzgsNjEgKzIyMDYsNjEgQEAKIAkgKi8KIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7Ci0JcGVlcl9yZXEgPSByZWFkX2luX2Jsb2NrKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIHBpLT5zaXplKTsKKwlwZWVyX3JlcSA9IHJlYWRfaW5fYmxvY2socGVlcl9kZXZpY2UsIHAtPmJsb2NrX2lkLCBzZWN0b3IsIHBpLT5zaXplKTsKIAlpZiAoIXBlZXJfcmVxKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlwZWVyX3JlcS0+dy5jYiA9IGVfZW5kX2Jsb2NrOwogCiAJZHBfZmxhZ3MgPSBiZTMyX3RvX2NwdShwLT5kcF9mbGFncyk7Ci0JcncgfD0gd2lyZV9mbGFnc190b19iaW8obWRldiwgZHBfZmxhZ3MpOworCXJ3IHw9IHdpcmVfZmxhZ3NfdG9fYmlvKGRwX2ZsYWdzKTsKIAlpZiAocGVlcl9yZXEtPnBhZ2VzID09IE5VTEwpIHsKLQkJRF9BU1NFUlQocGVlcl9yZXEtPmkuc2l6ZSA9PSAwKTsKLQkJRF9BU1NFUlQoZHBfZmxhZ3MgJiBEUF9GTFVTSCk7CisJCURfQVNTRVJUKGRldmljZSwgcGVlcl9yZXEtPmkuc2l6ZSA9PSAwKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkcF9mbGFncyAmIERQX0ZMVVNIKTsKIAl9CiAKIAlpZiAoZHBfZmxhZ3MgJiBEUF9NQVlfU0VUX0lOX1NZTkMpCiAJCXBlZXJfcmVxLT5mbGFncyB8PSBFRV9NQVlfU0VUX0lOX1NZTkM7CiAKLQlzcGluX2xvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKLQlwZWVyX3JlcS0+ZXBvY2ggPSB0Y29ubi0+Y3VycmVudF9lcG9jaDsKKwlzcGluX2xvY2soJmNvbm5lY3Rpb24tPmVwb2NoX2xvY2spOworCXBlZXJfcmVxLT5lcG9jaCA9IGNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2g7CiAJYXRvbWljX2luYygmcGVlcl9yZXEtPmVwb2NoLT5lcG9jaF9zaXplKTsKIAlhdG9taWNfaW5jKCZwZWVyX3JlcS0+ZXBvY2gtPmFjdGl2ZSk7Ci0Jc3Bpbl91bmxvY2soJnRjb25uLT5lcG9jaF9sb2NrKTsKKwlzcGluX3VubG9jaygmY29ubmVjdGlvbi0+ZXBvY2hfbG9jayk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JdHAgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKS0+dHdvX3ByaW1hcmllczsKKwl0cCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT50d29fcHJpbWFyaWVzOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh0cCkgewogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfSU5fSU5URVJWQUxfVFJFRTsKLQkJZXJyID0gd2FpdF9mb3JfYW5kX3VwZGF0ZV9wZWVyX3NlcShtZGV2LCBwZWVyX3NlcSk7CisJCWVyciA9IHdhaXRfZm9yX2FuZF91cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIHBlZXJfc2VxKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X2ludGVycnVwdGVkOwotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCQllcnIgPSBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKG1kZXYsIHBlZXJfcmVxKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQllcnIgPSBoYW5kbGVfd3JpdGVfY29uZmxpY3RzKGRldmljZSwgcGVlcl9yZXEpOwogCQlpZiAoZXJyKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJCWlmIChlcnIgPT0gLUVOT0VOVCkgewotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlnb3RvIG91dF9pbnRlcnJ1cHRlZDsKIAkJfQogCX0gZWxzZSB7Ci0JCXVwZGF0ZV9wZWVyX3NlcShtZGV2LCBwZWVyX3NlcSk7Ci0JCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgcGVlcl9zZXEpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfQotCWxpc3RfYWRkKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+YWN0aXZlX2VlKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJbGlzdF9hZGQoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPmFjdGl2ZV9lZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1NZTkNfVEFSR0VUKQotCQl3YWl0X2V2ZW50KG1kZXYtPmVlX3dhaXQsICFvdmVybGFwcGluZ19yZXN5bmNfd3JpdGUobWRldiwgcGVlcl9yZXEpKTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfU1lOQ19UQVJHRVQpCisJCXdhaXRfZXZlbnQoZGV2aWNlLT5lZV93YWl0LCAhb3ZlcmxhcHBpbmdfcmVzeW5jX3dyaXRlKGRldmljZSwgcGVlcl9yZXEpKTsKIAotCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKSB7CisJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCAxMDApIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlzd2l0Y2ggKHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT53aXJlX3Byb3RvY29sKSB7CisJCXN3aXRjaCAocmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPndpcmVfcHJvdG9jb2wpIHsKIAkJY2FzZSBEUkJEX1BST1RfQzoKIAkJCWRwX2ZsYWdzIHw9IERQX1NFTkRfV1JJVEVfQUNLOwogCQkJYnJlYWs7CkBAIC0yMjQ1LDcgKzIyNzMsNyBAQAogCiAJaWYgKGRwX2ZsYWdzICYgRFBfU0VORF9XUklURV9BQ0spIHsKIAkJcGVlcl9yZXEtPmZsYWdzIHw9IEVFX1NFTkRfV1JJVEVfQUNLOwotCQlpbmNfdW5hY2tlZChtZGV2KTsKKwkJaW5jX3VuYWNrZWQoZGV2aWNlKTsKIAkJLyogY29ycmVzcG9uZGluZyBkZWNfdW5hY2tlZCgpIGluIGVfZW5kX2Jsb2NrKCkKIAkJICogcmVzcGVjdGl2ZSBfZHJiZF9jbGVhcl9kb25lX2VlICovCiAJfQpAQCAtMjI1MywzNCArMjI4MSwzNCBAQAogCWlmIChkcF9mbGFncyAmIERQX1NFTkRfUkVDRUlWRV9BQ0spIHsKIAkJLyogSSByZWFsbHkgZG9uJ3QgbGlrZSBpdCB0aGF0IHRoZSByZWNlaXZlciB0aHJlYWQKIAkJICogc2VuZHMgb24gdGhlIG1zb2NrLCBidXQgYW55d2F5cyAqLwotCQlkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUkVDVl9BQ0ssIHBlZXJfcmVxKTsKKwkJZHJiZF9zZW5kX2FjayhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBQX1JFQ1ZfQUNLLCBwZWVyX3JlcSk7CiAJfQogCi0JaWYgKG1kZXYtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCkgeworCWlmIChkZXZpY2UtPnN0YXRlLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCkgewogCQkvKiBJbiBjYXNlIHdlIGhhdmUgdGhlIG9ubHkgZGlzayBvZiB0aGUgY2x1c3RlciwgKi8KLQkJZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfQ0FMTF9BTF9DT01QTEVURV9JTzsKIAkJcGVlcl9yZXEtPmZsYWdzICY9IH5FRV9NQVlfU0VUX0lOX1NZTkM7Ci0JCWRyYmRfYWxfYmVnaW5faW8obWRldiwgJnBlZXJfcmVxLT5pLCB0cnVlKTsKKwkJZHJiZF9hbF9iZWdpbl9pbyhkZXZpY2UsICZwZWVyX3JlcS0+aSwgdHJ1ZSk7CiAJfQogCi0JZXJyID0gZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KG1kZXYsIHBlZXJfcmVxLCBydywgRFJCRF9GQVVMVF9EVF9XUik7CisJZXJyID0gZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIHJ3LCBEUkJEX0ZBVUxUX0RUX1dSKTsKIAlpZiAoIWVycikKIAkJcmV0dXJuIDA7CiAKIAkvKiBkb24ndCBjYXJlIGZvciB0aGUgcmVhc29uIGhlcmUgKi8KLQlkZXZfZXJyKERFViwgInN1Ym1pdCBmYWlsZWQsIHRyaWdnZXJpbmcgcmUtY29ubmVjdFxuIik7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlkcmJkX2VycihkZXZpY2UsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlsaXN0X2RlbCgmcGVlcl9yZXEtPncubGlzdCk7Ci0JZHJiZF9yZW1vdmVfZXBvY2hfZW50cnlfaW50ZXJ2YWwobWRldiwgcGVlcl9yZXEpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlkcmJkX3JlbW92ZV9lcG9jaF9lbnRyeV9pbnRlcnZhbChkZXZpY2UsIHBlZXJfcmVxKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlpZiAocGVlcl9yZXEtPmZsYWdzICYgRUVfQ0FMTF9BTF9DT01QTEVURV9JTykKLQkJZHJiZF9hbF9jb21wbGV0ZV9pbyhtZGV2LCAmcGVlcl9yZXEtPmkpOworCQlkcmJkX2FsX2NvbXBsZXRlX2lvKGRldmljZSwgJnBlZXJfcmVxLT5pKTsKIAogb3V0X2ludGVycnVwdGVkOgotCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaCh0Y29ubiwgcGVlcl9yZXEtPmVwb2NoLCBFVl9QVVQgKyBFVl9DTEVBTlVQKTsKLQlwdXRfbGRldihtZGV2KTsKLQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCWRyYmRfbWF5X2ZpbmlzaF9lcG9jaChjb25uZWN0aW9uLCBwZWVyX3JlcS0+ZXBvY2gsIEVWX1BVVCArIEVWX0NMRUFOVVApOworCXB1dF9sZGV2KGRldmljZSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIyOTUsOSArMjMyMyw5IEBACiAgKiBUaGUgY3VycmVudCBzeW5jIHJhdGUgdXNlZCBoZXJlIHVzZXMgb25seSB0aGUgbW9zdCByZWNlbnQgdHdvIHN0ZXAgbWFya3MsCiAgKiB0byBoYXZlIGEgc2hvcnQgdGltZSBhdmVyYWdlIHNvIHdlIGNhbiByZWFjdCBmYXN0ZXIuCiAgKi8KLWludCBkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yKQoraW50IGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yKQogewotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9jb250YWlucy0+YmRfZGlzazsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9jb250YWlucy0+YmRfZGlzazsKIAl1bnNpZ25lZCBsb25nIGRiLCBkdCwgZGJkdDsKIAlzdHJ1Y3QgbGNfZWxlbWVudCAqdG1wOwogCWludCBjdXJyX2V2ZW50czsKQEAgLTIzMDUsNDggKzIzMzMsNDggQEAKIAl1bnNpZ25lZCBpbnQgY19taW5fcmF0ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQljX21pbl9yYXRlID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmNfbWluX3JhdGU7CisJY19taW5fcmF0ZSA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmNfbWluX3JhdGU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBmZWF0dXJlIGRpc2FibGVkPyAqLwogCWlmIChjX21pbl9yYXRlID09IDApCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+YWxfbG9jayk7Ci0JdG1wID0gbGNfZmluZChtZGV2LT5yZXN5bmMsIEJNX1NFQ1RfVE9fRVhUKHNlY3RvcikpOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CisJdG1wID0gbGNfZmluZChkZXZpY2UtPnJlc3luYywgQk1fU0VDVF9UT19FWFQoc2VjdG9yKSk7CiAJaWYgKHRtcCkgewogCQlzdHJ1Y3QgYm1fZXh0ZW50ICpibV9leHQgPSBsY19lbnRyeSh0bXAsIHN0cnVjdCBibV9leHRlbnQsIGxjZSk7CiAJCWlmICh0ZXN0X2JpdChCTUVfUFJJT1JJVFksICZibV9leHQtPmZsYWdzKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5hbF9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCS8qIERvIG5vdCBzbG93IGRvd24gaWYgYXBwIElPIGlzIGFscmVhZHkgd2FpdGluZyBmb3IgdGhpcyBleHRlbnQgKi8KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAKIAljdXJyX2V2ZW50cyA9IChpbnQpcGFydF9zdGF0X3JlYWQoJmRpc2stPnBhcnQwLCBzZWN0b3JzWzBdKSArCiAJCSAgICAgIChpbnQpcGFydF9zdGF0X3JlYWQoJmRpc2stPnBhcnQwLCBzZWN0b3JzWzFdKSAtCi0JCQlhdG9taWNfcmVhZCgmbWRldi0+cnNfc2VjdF9ldik7CisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19zZWN0X2V2KTsKIAotCWlmICghbWRldi0+cnNfbGFzdF9ldmVudHMgfHwgY3Vycl9ldmVudHMgLSBtZGV2LT5yc19sYXN0X2V2ZW50cyA+IDY0KSB7CisJaWYgKCFkZXZpY2UtPnJzX2xhc3RfZXZlbnRzIHx8IGN1cnJfZXZlbnRzIC0gZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA+IDY0KSB7CiAJCXVuc2lnbmVkIGxvbmcgcnNfbGVmdDsKIAkJaW50IGk7CiAKLQkJbWRldi0+cnNfbGFzdF9ldmVudHMgPSBjdXJyX2V2ZW50czsKKwkJZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA9IGN1cnJfZXZlbnRzOwogCiAJCS8qIHN5bmMgc3BlZWQgYXZlcmFnZSBvdmVyIHRoZSBsYXN0IDIqRFJCRF9TWU5DX01BUktfU1RFUCwKIAkJICogYXBwcm94LiAqLwotCQlpID0gKG1kZXYtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKKwkJaSA9IChkZXZpY2UtPnJzX2xhc3RfbWFyayArIERSQkRfU1lOQ19NQVJLUy0xKSAlIERSQkRfU1lOQ19NQVJLUzsKIAotCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkKLQkJCXJzX2xlZnQgPSBtZGV2LT5vdl9sZWZ0OworCQlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1MgfHwgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJCQlyc19sZWZ0ID0gZGV2aWNlLT5vdl9sZWZ0OwogCQllbHNlCi0JCQlyc19sZWZ0ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikgLSBtZGV2LT5yc19mYWlsZWQ7CisJCQlyc19sZWZ0ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSAtIGRldmljZS0+cnNfZmFpbGVkOwogCi0JCWR0ID0gKChsb25nKWppZmZpZXMgLSAobG9uZyltZGV2LT5yc19tYXJrX3RpbWVbaV0pIC8gSFo7CisJCWR0ID0gKChsb25nKWppZmZpZXMgLSAobG9uZylkZXZpY2UtPnJzX21hcmtfdGltZVtpXSkgLyBIWjsKIAkJaWYgKCFkdCkKIAkJCWR0Kys7Ci0JCWRiID0gbWRldi0+cnNfbWFya19sZWZ0W2ldIC0gcnNfbGVmdDsKKwkJZGIgPSBkZXZpY2UtPnJzX21hcmtfbGVmdFtpXSAtIHJzX2xlZnQ7CiAJCWRiZHQgPSBCaXQyS0IoZGIvZHQpOwogCiAJCWlmIChkYmR0ID4gY19taW5fcmF0ZSkKQEAgLTIzNTYsOSArMjM4NCwxMCBAQAogfQogCiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9EYXRhUmVxdWVzdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfRGF0YVJlcXVlc3Qoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJc2VjdG9yX3QgY2FwYWNpdHk7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcTsKQEAgLTIzNjcsNTggKzIzOTYsNTkgQEAKIAl1bnNpZ25lZCBpbnQgZmF1bHRfdHlwZTsKIAlzdHJ1Y3QgcF9ibG9ja19yZXEgKnAgPQlwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKLQljYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwljYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAJc2l6ZSAgID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAKIAlpZiAoc2l6ZSA8PSAwIHx8ICFJU19BTElHTkVEKHNpemUsIDUxMikgfHwgc2l6ZSA+IERSQkRfTUFYX0JJT19TSVpFKSB7Ci0JCWRldl9lcnIoREVWLCAiJXM6JWQ6IHNlY3RvcjogJWxsdXMsIHNpemU6ICV1XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCWRyYmRfZXJyKGRldmljZSwgIiVzOiVkOiBzZWN0b3I6ICVsbHVzLCBzaXplOiAldVxuIiwgX19GSUxFX18sIF9fTElORV9fLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChzZWN0b3IgKyAoc2l6ZT4+OSkgPiBjYXBhY2l0eSkgewotCQlkZXZfZXJyKERFViwgIiVzOiVkOiBzZWN0b3I6ICVsbHVzLCBzaXplOiAldVxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQlkcmJkX2VycihkZXZpY2UsICIlczolZDogc2VjdG9yOiAlbGx1cywgc2l6ZTogJXVcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3Rvciwgc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUobWRldiwgRF9VUF9UT19EQVRFKSkgeworCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX1VQX1RPX0RBVEUpKSB7CiAJCXZlcmIgPSAxOwogCQlzd2l0Y2ggKHBpLT5jbWQpIHsKIAkJY2FzZSBQX0RBVEFfUkVRVUVTVDoKLQkJCWRyYmRfc2VuZF9hY2tfcnAobWRldiwgUF9ORUdfRFJFUExZLCBwKTsKKwkJCWRyYmRfc2VuZF9hY2tfcnAocGVlcl9kZXZpY2UsIFBfTkVHX0RSRVBMWSwgcCk7CiAJCQlicmVhazsKIAkJY2FzZSBQX1JTX0RBVEFfUkVRVUVTVDoKIAkJY2FzZSBQX0NTVU1fUlNfUkVRVUVTVDoKIAkJY2FzZSBQX09WX1JFUVVFU1Q6Ci0JCQlkcmJkX3NlbmRfYWNrX3JwKG1kZXYsIFBfTkVHX1JTX0RSRVBMWSAsIHApOworCQkJZHJiZF9zZW5kX2Fja19ycChwZWVyX2RldmljZSwgUF9ORUdfUlNfRFJFUExZICwgcCk7CiAJCQlicmVhazsKIAkJY2FzZSBQX09WX1JFUExZOgogCQkJdmVyYiA9IDA7Ci0JCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKLQkJCWRyYmRfc2VuZF9hY2tfZXgobWRldiwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwgSURfSU5fU1lOQyk7CisJCQlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOworCQkJZHJiZF9zZW5kX2Fja19leChwZWVyX2RldmljZSwgUF9PVl9SRVNVTFQsIHNlY3Rvciwgc2l6ZSwgSURfSU5fU1lOQyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9CiAJCWlmICh2ZXJiICYmIF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIkNhbiBub3Qgc2F0aXNmeSBwZWVyJ3MgcmVhZCByZXF1ZXN0LCAiCisJCQlkcmJkX2VycihkZXZpY2UsICJDYW4gbm90IHNhdGlzZnkgcGVlcidzIHJlYWQgcmVxdWVzdCwgIgogCQkJICAgICJubyBsb2NhbCBkYXRhLlxuIik7CiAKIAkJLyogZHJhaW4gcG9zc2libHkgcGF5bG9hZCAqLwotCQlyZXR1cm4gZHJiZF9kcmFpbl9ibG9jayhtZGV2LCBwaS0+c2l6ZSk7CisJCXJldHVybiBkcmJkX2RyYWluX2Jsb2NrKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSk7CiAJfQogCiAJLyogR0ZQX05PSU8sIGJlY2F1c2Ugd2UgbXVzdCBub3QgY2F1c2UgYXJiaXRyYXJ5IHdyaXRlLW91dDogaW4gYSBEUkJECiAJICogImNyaXNzLWNyb3NzIiBzZXR1cCwgdGhhdCBtaWdodCBjYXVzZSB3cml0ZS1vdXQgb24gc29tZSBvdGhlciBEUkJELAogCSAqIHdoaWNoIGluIHR1cm4gbWlnaHQgYmxvY2sgb24gdGhlIG90aGVyIG5vZGUgYXQgdGhpcyB2ZXJ5IHBsYWNlLiAgKi8KLQlwZWVyX3JlcSA9IGRyYmRfYWxsb2NfcGVlcl9yZXEobWRldiwgcC0+YmxvY2tfaWQsIHNlY3Rvciwgc2l6ZSwgR0ZQX05PSU8pOworCXBlZXJfcmVxID0gZHJiZF9hbGxvY19wZWVyX3JlcShwZWVyX2RldmljZSwgcC0+YmxvY2tfaWQsIHNlY3Rvciwgc2l6ZSwgR0ZQX05PSU8pOwogCWlmICghcGVlcl9yZXEpIHsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjQzMyw3ICsyNDYzLDcgQEAKIAkJcGVlcl9yZXEtPncuY2IgPSB3X2VfZW5kX3JzZGF0YV9yZXE7CiAJCWZhdWx0X3R5cGUgPSBEUkJEX0ZBVUxUX1JTX1JEOwogCQkvKiB1c2VkIGluIHRoZSBzZWN0b3Igb2Zmc2V0IHByb2dyZXNzIGRpc3BsYXkgKi8KLQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gQk1fU0VDVF9UT19CSVQoc2VjdG9yKTsKKwkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBCTV9TRUNUX1RPX0JJVChzZWN0b3IpOwogCQlicmVhazsKIAogCWNhc2UgUF9PVl9SRVBMWToKQEAgLTI0NDksMTkgKzI0NzksMTkgQEAKIAkJcGVlcl9yZXEtPmRpZ2VzdCA9IGRpOwogCQlwZWVyX3JlcS0+ZmxhZ3MgfD0gRUVfSEFTX0RJR0VTVDsKIAotCQlpZiAoZHJiZF9yZWN2X2FsbChtZGV2LT50Y29ubiwgZGktPmRpZ2VzdCwgcGktPnNpemUpKQorCQlpZiAoZHJiZF9yZWN2X2FsbChwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgZGktPmRpZ2VzdCwgcGktPnNpemUpKQogCQkJZ290byBvdXRfZnJlZV9lOwogCiAJCWlmIChwaS0+Y21kID09IFBfQ1NVTV9SU19SRVFVRVNUKSB7Ci0JCQlEX0FTU0VSVChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg5KTsKKwkJCURfQVNTRVJUKGRldmljZSwgcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSk7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHdfZV9lbmRfY3N1bV9yc19yZXE7CiAJCQkvKiB1c2VkIGluIHRoZSBzZWN0b3Igb2Zmc2V0IHByb2dyZXNzIGRpc3BsYXkgKi8KLQkJCW1kZXYtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJCX0gZWxzZSBpZiAocGktPmNtZCA9PSBQX09WX1JFUExZKSB7CiAJCQkvKiB0cmFjayBwcm9ncmVzcywgd2UgbWF5IG5lZWQgdG8gdGhyb3R0bGUgKi8KLQkJCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJCQlhdG9taWNfYWRkKHNpemUgPj4gOSwgJmRldmljZS0+cnNfc2VjdF9pbik7CiAJCQlwZWVyX3JlcS0+dy5jYiA9IHdfZV9lbmRfb3ZfcmVwbHk7Ci0JCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwkJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJCQkvKiBkcmJkX3JzX2JlZ2luX2lvIGRvbmUgd2hlbiB3ZSBzZW50IHRoaXMgcmVxdWVzdCwKIAkJCSAqIGJ1dCBhY2NvdW50aW5nIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUuICovCiAJCQlnb3RvIHN1Ym1pdF9mb3JfcmVzeW5jOwpAQCAtMjQ2OSwxOSArMjQ5OSwxOSBAQAogCQlicmVhazsKIAogCWNhc2UgUF9PVl9SRVFVRVNUOgotCQlpZiAobWRldi0+b3Zfc3RhcnRfc2VjdG9yID09IH4oc2VjdG9yX3QpMCAmJgotCQkgICAgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5MCkgeworCQlpZiAoZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPT0gfihzZWN0b3JfdCkwICYmCisJCSAgICBwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDkwKSB7CiAJCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJCQlpbnQgaTsKLQkJCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9IHNlY3RvcjsKLQkJCW1kZXYtPm92X3Bvc2l0aW9uID0gc2VjdG9yOwotCQkJbWRldi0+b3ZfbGVmdCA9IGRyYmRfYm1fYml0cyhtZGV2KSAtIEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7Ci0JCQltZGV2LT5yc190b3RhbCA9IG1kZXYtPm92X2xlZnQ7CisJCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IHNlY3RvcjsKKwkJCWRldmljZS0+b3ZfcG9zaXRpb24gPSBzZWN0b3I7CisJCQlkZXZpY2UtPm92X2xlZnQgPSBkcmJkX2JtX2JpdHMoZGV2aWNlKSAtIEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CisJCQlkZXZpY2UtPnJzX3RvdGFsID0gZGV2aWNlLT5vdl9sZWZ0OwogCQkJZm9yIChpID0gMDsgaSA8IERSQkRfU1lOQ19NQVJLUzsgaSsrKSB7Ci0JCQkJbWRldi0+cnNfbWFya19sZWZ0W2ldID0gbWRldi0+b3ZfbGVmdDsKLQkJCQltZGV2LT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CisJCQkJZGV2aWNlLT5yc19tYXJrX2xlZnRbaV0gPSBkZXZpY2UtPm92X2xlZnQ7CisJCQkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CiAJCQl9Ci0JCQlkZXZfaW5mbyhERVYsICJPbmxpbmUgVmVyaWZ5IHN0YXJ0IHNlY3RvcjogJWxsdVxuIiwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJPbmxpbmUgVmVyaWZ5IHN0YXJ0IHNlY3RvcjogJWxsdVxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IpOwogCQl9CiAJCXBlZXJfcmVxLT53LmNiID0gd19lX2VuZF9vdl9yZXE7CkBAIC0yNTE0LDU3ICsyNTQ0LDYxIEBACiAJICogd2Ugd291bGQgYWxzbyB0aHJvdHRsZSBpdHMgYXBwbGljYXRpb24gcmVhZHMuCiAJICogSW4gdGhhdCBjYXNlLCB0aHJvdHRsaW5nIGlzIGRvbmUgb24gdGhlIFN5bmNUYXJnZXQgb25seS4KIAkgKi8KLQlpZiAobWRldi0+c3RhdGUucGVlciAhPSBSX1BSSU1BUlkgJiYgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikpCisJaWYgKGRldmljZS0+c3RhdGUucGVlciAhPSBSX1BSSU1BUlkgJiYgZHJiZF9yc19zaG91bGRfc2xvd19kb3duKGRldmljZSwgc2VjdG9yKSkKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFovMTApOwotCWlmIChkcmJkX3JzX2JlZ2luX2lvKG1kZXYsIHNlY3RvcikpCisJaWYgKGRyYmRfcnNfYmVnaW5faW8oZGV2aWNlLCBzZWN0b3IpKQogCQlnb3RvIG91dF9mcmVlX2U7CiAKIHN1Ym1pdF9mb3JfcmVzeW5jOgotCWF0b21pY19hZGQoc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9ldik7CisJYXRvbWljX2FkZChzaXplID4+IDksICZkZXZpY2UtPnJzX3NlY3RfZXYpOwogCiBzdWJtaXQ6Ci0JaW5jX3VuYWNrZWQobWRldik7Ci0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+cmVhZF9lZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCWluY191bmFja2VkKGRldmljZSk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JaWYgKGRyYmRfc3VibWl0X3BlZXJfcmVxdWVzdChtZGV2LCBwZWVyX3JlcSwgUkVBRCwgZmF1bHRfdHlwZSkgPT0gMCkKKwlpZiAoZHJiZF9zdWJtaXRfcGVlcl9yZXF1ZXN0KGRldmljZSwgcGVlcl9yZXEsIFJFQUQsIGZhdWx0X3R5cGUpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogZG9uJ3QgY2FyZSBmb3IgdGhlIHJlYXNvbiBoZXJlICovCi0JZGV2X2VycihERVYsICJzdWJtaXQgZmFpbGVkLCB0cmlnZ2VyaW5nIHJlLWNvbm5lY3RcbiIpOwotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJZHJiZF9lcnIoZGV2aWNlLCAic3VibWl0IGZhaWxlZCwgdHJpZ2dlcmluZyByZS1jb25uZWN0XG4iKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJbGlzdF9kZWwoJnBlZXJfcmVxLT53Lmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkvKiBubyBkcmJkX3JzX2NvbXBsZXRlX2lvKCksIHdlIGFyZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBhbnl3YXlzICovCiAKIG91dF9mcmVlX2U6Ci0JcHV0X2xkZXYobWRldik7Ci0JZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwlwdXRfbGRldihkZXZpY2UpOworCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGludCBkcmJkX2FzYl9yZWNvdmVyXzBwKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpIF9fbXVzdF9ob2xkKGxvY2FsKQorLyoqCisgKiBkcmJkX2FzYl9yZWNvdmVyXzBwICAtICBSZWNvdmVyIGFmdGVyIHNwbGl0LWJyYWluIHdpdGggbm8gcmVtYWluaW5nIHByaW1hcmllcworICovCitzdGF0aWMgaW50IGRyYmRfYXNiX3JlY292ZXJfMHAoc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlKSBfX211c3RfaG9sZChsb2NhbCkKIHsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IHNlbGYsIHBlZXIsIHJ2ID0gLTEwMDsKIAl1bnNpZ25lZCBsb25nIGNoX3NlbGYsIGNoX3BlZXI7CiAJZW51bSBkcmJkX2FmdGVyX3NiX3AgYWZ0ZXJfc2JfMHA7CiAKLQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICYgMTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0JJVE1BUF0gJiAxOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIDE7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiAxOwogCi0JY2hfcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9TSVpFXTsKLQljaF9zZWxmID0gbWRldi0+Y29tbV9ibV9zZXQ7CisJY2hfcGVlciA9IGRldmljZS0+cF91dWlkW1VJX1NJWkVdOworCWNoX3NlbGYgPSBkZXZpY2UtPmNvbW1fYm1fc2V0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWFmdGVyX3NiXzBwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZiktPmFmdGVyX3NiXzBwOworCWFmdGVyX3NiXzBwID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPmFmdGVyX3NiXzBwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoYWZ0ZXJfc2JfMHApIHsKIAljYXNlIEFTQl9DT05TRU5TVVM6CiAJY2FzZSBBU0JfRElTQ0FSRF9TRUNPTkRBUlk6CiAJY2FzZSBBU0JfQ0FMTF9IRUxQRVI6CiAJY2FzZSBBU0JfVklPTEVOVExZOgotCQlkZXZfZXJyKERFViwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ29uZmlndXJhdGlvbiBlcnJvci5cbiIpOwogCQlicmVhazsKIAljYXNlIEFTQl9ESVNDT05ORUNUOgogCQlicmVhazsKQEAgLTI1ODgsMTEgKzI2MjIsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJCS8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIG9uZSBvZiB0aGUgb3RoZXIgc3RyYXRlZ2llcy4uLiAqLwotCQlkZXZfd2FybihERVYsICJEaXNjYXJkIHlvdW5nZXIvb2xkZXIgcHJpbWFyeSBkaWQgbm90IGZpbmQgYSBkZWNpc2lvblxuIgorCQlkcmJkX3dhcm4oZGV2aWNlLCAiRGlzY2FyZCB5b3VuZ2VyL29sZGVyIHByaW1hcnkgZGlkIG5vdCBmaW5kIGEgZGVjaXNpb25cbiIKIAkJICAgICAiVXNpbmcgZGlzY2FyZC1sZWFzdC1jaGFuZ2VzIGluc3RlYWRcbiIpOwogCWNhc2UgQVNCX0RJU0NBUkRfWkVST19DSEc6CiAJCWlmIChjaF9wZWVyID09IDAgJiYgY2hfc2VsZiA9PSAwKSB7Ci0JCQlydiA9IHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKQorCQkJcnYgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncykKIAkJCQk/IC0xIDogMTsKIAkJCWJyZWFrOwogCQl9IGVsc2UgewpAQCAtMjYwOCw3ICsyNjQyLDcgQEAKIAkJCXJ2ID0gIDE7CiAJCWVsc2UgLyogKCBjaF9zZWxmID09IGNoX3BlZXIgKSAqLwogCQkgICAgIC8qIFdlbGwsIHRoZW4gdXNlIHNvbWV0aGluZyBlbHNlLiAqLwotCQkJcnYgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJm1kZXYtPnRjb25uLT5mbGFncykKKwkJCXJ2ID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+ZmxhZ3MpCiAJCQkJPyAtMSA6IDE7CiAJCWJyZWFrOwogCWNhc2UgQVNCX0RJU0NBUkRfTE9DQUw6CkBAIC0yNjIxLDEzICsyNjU1LDE3IEBACiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IGRyYmRfYXNiX3JlY292ZXJfMXAoc3RydWN0IGRyYmRfY29uZiAqbWRldikgX19tdXN0X2hvbGQobG9jYWwpCisvKioKKyAqIGRyYmRfYXNiX3JlY292ZXJfMXAgIC0gIFJlY292ZXIgYWZ0ZXIgc3BsaXQtYnJhaW4gd2l0aCBvbmUgcmVtYWluaW5nIHByaW1hcnkKKyAqLworc3RhdGljIGludCBkcmJkX2FzYl9yZWNvdmVyXzFwKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSkgX19tdXN0X2hvbGQobG9jYWwpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCWludCBoZywgcnYgPSAtMTAwOwogCWVudW0gZHJiZF9hZnRlcl9zYl9wIGFmdGVyX3NiXzFwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWFmdGVyX3NiXzFwID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZiktPmFmdGVyX3NiXzFwOworCWFmdGVyX3NiXzFwID0gcmN1X2RlcmVmZXJlbmNlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZiktPmFmdGVyX3NiXzFwOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXN3aXRjaCAoYWZ0ZXJfc2JfMXApIHsKIAljYXNlIEFTQl9ESVNDQVJEX1lPVU5HRVJfUFJJOgpAQCAtMjYzNiwzNSArMjY3NCwzNSBAQAogCWNhc2UgQVNCX0RJU0NBUkRfTE9DQUw6CiAJY2FzZSBBU0JfRElTQ0FSRF9SRU1PVEU6CiAJY2FzZSBBU0JfRElTQ0FSRF9aRVJPX0NIRzoKLQkJZGV2X2VycihERVYsICJDb25maWd1cmF0aW9uIGVycm9yLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBBU0JfRElTQ09OTkVDVDoKIAkJYnJlYWs7CiAJY2FzZSBBU0JfQ09OU0VOU1VTOgotCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7Ci0JCWlmIChoZyA9PSAtMSAmJiBtZGV2LT5zdGF0ZS5yb2xlID09IFJfU0VDT05EQVJZKQorCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOworCQlpZiAoaGcgPT0gLTEgJiYgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfU0VDT05EQVJZKQogCQkJcnYgPSBoZzsKLQkJaWYgKGhnID09IDEgICYmIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpZiAoaGcgPT0gMSAgJiYgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSkKIAkJCXJ2ID0gaGc7CiAJCWJyZWFrOwogCWNhc2UgQVNCX1ZJT0xFTlRMWToKLQkJcnYgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKG1kZXYpOworCQlydiA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOwogCQlicmVhazsKIAljYXNlIEFTQl9ESVNDQVJEX1NFQ09OREFSWToKLQkJcmV0dXJuIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZID8gMSA6IC0xOworCQlyZXR1cm4gZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSA/IDEgOiAtMTsKIAljYXNlIEFTQl9DQUxMX0hFTFBFUjoKLQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKG1kZXYpOwotCQlpZiAoaGcgPT0gLTEgJiYgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKKwkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzBwKHBlZXJfZGV2aWNlKTsKKwkJaWYgKGhnID09IC0xICYmIGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpIHsKIAkJCWVudW0gZHJiZF9zdGF0ZV9ydiBydjI7CiAKIAkJCSAvKiBkcmJkX2NoYW5nZV9zdGF0ZSgpIGRvZXMgbm90IHNsZWVwIHdoaWxlIGluIFNTX0lOX1RSQU5TSUVOVF9TVEFURSwKIAkJCSAgKiB3ZSBtaWdodCBiZSBoZXJlIGluIENfV0ZfUkVQT1JUX1BBUkFNUyB3aGljaCBpcyB0cmFuc2llbnQuCiAJCQkgICogd2UgZG8gbm90IG5lZWQgdG8gd2FpdCBmb3IgdGhlIGFmdGVyIHN0YXRlIGNoYW5nZSB3b3JrIGVpdGhlci4gKi8KLQkJCXJ2MiA9IGRyYmRfY2hhbmdlX3N0YXRlKG1kZXYsIENTX1ZFUkJPU0UsIE5TKHJvbGUsIFJfU0VDT05EQVJZKSk7CisJCQlydjIgPSBkcmJkX2NoYW5nZV9zdGF0ZShkZXZpY2UsIENTX1ZFUkJPU0UsIE5TKHJvbGUsIFJfU0VDT05EQVJZKSk7CiAJCQlpZiAocnYyICE9IFNTX1NVQ0NFU1MpIHsKLQkJCQlkcmJkX2toZWxwZXIobWRldiwgInByaS1sb3N0LWFmdGVyLXNiIik7CisJCQkJZHJiZF9raGVscGVyKGRldmljZSwgInByaS1sb3N0LWFmdGVyLXNiIik7CiAJCQl9IGVsc2UgewotCQkJCWRldl93YXJuKERFViwgIlN1Y2Nlc3NmdWxseSBnYXZlIHVwIHByaW1hcnkgcm9sZS5cbiIpOworCQkJCWRyYmRfd2FybihkZXZpY2UsICJTdWNjZXNzZnVsbHkgZ2F2ZSB1cCBwcmltYXJ5IHJvbGUuXG4iKTsKIAkJCQlydiA9IGhnOwogCQkJfQogCQl9IGVsc2UKQEAgLTI2NzQsMTMgKzI3MTIsMTcgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBpbnQgZHJiZF9hc2JfcmVjb3Zlcl8ycChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KSBfX211c3RfaG9sZChsb2NhbCkKKy8qKgorICogZHJiZF9hc2JfcmVjb3Zlcl8ycCAgLSAgUmVjb3ZlciBhZnRlciBzcGxpdC1icmFpbiB3aXRoIHR3byByZW1haW5pbmcgcHJpbWFyaWVzCisgKi8KK3N0YXRpYyBpbnQgZHJiZF9hc2JfcmVjb3Zlcl8ycChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAlpbnQgaGcsIHJ2ID0gLTEwMDsKIAllbnVtIGRyYmRfYWZ0ZXJfc2JfcCBhZnRlcl9zYl8ycDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlhZnRlcl9zYl8ycCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpLT5hZnRlcl9zYl8ycDsKKwlhZnRlcl9zYl8ycCA9IHJjdV9kZXJlZmVyZW5jZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpLT5hZnRlcl9zYl8ycDsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlzd2l0Y2ggKGFmdGVyX3NiXzJwKSB7CiAJY2FzZSBBU0JfRElTQ0FSRF9ZT1VOR0VSX1BSSToKQEAgLTI2OTEsMjYgKzI3MzMsMjYgQEAKIAljYXNlIEFTQl9DT05TRU5TVVM6CiAJY2FzZSBBU0JfRElTQ0FSRF9TRUNPTkRBUlk6CiAJY2FzZSBBU0JfRElTQ0FSRF9aRVJPX0NIRzoKLQkJZGV2X2VycihERVYsICJDb25maWd1cmF0aW9uIGVycm9yLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNvbmZpZ3VyYXRpb24gZXJyb3IuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBBU0JfVklPTEVOVExZOgotCQlydiA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCXJ2ID0gZHJiZF9hc2JfcmVjb3Zlcl8wcChwZWVyX2RldmljZSk7CiAJCWJyZWFrOwogCWNhc2UgQVNCX0RJU0NPTk5FQ1Q6CiAJCWJyZWFrOwogCWNhc2UgQVNCX0NBTExfSEVMUEVSOgotCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8wcChwZWVyX2RldmljZSk7CiAJCWlmIChoZyA9PSAtMSkgewogCQkJZW51bSBkcmJkX3N0YXRlX3J2IHJ2MjsKIAogCQkJIC8qIGRyYmRfY2hhbmdlX3N0YXRlKCkgZG9lcyBub3Qgc2xlZXAgd2hpbGUgaW4gU1NfSU5fVFJBTlNJRU5UX1NUQVRFLAogCQkJICAqIHdlIG1pZ2h0IGJlIGhlcmUgaW4gQ19XRl9SRVBPUlRfUEFSQU1TIHdoaWNoIGlzIHRyYW5zaWVudC4KIAkJCSAgKiB3ZSBkbyBub3QgbmVlZCB0byB3YWl0IGZvciB0aGUgYWZ0ZXIgc3RhdGUgY2hhbmdlIHdvcmsgZWl0aGVyLiAqLwotCQkJcnYyID0gZHJiZF9jaGFuZ2Vfc3RhdGUobWRldiwgQ1NfVkVSQk9TRSwgTlMocm9sZSwgUl9TRUNPTkRBUlkpKTsKKwkJCXJ2MiA9IGRyYmRfY2hhbmdlX3N0YXRlKGRldmljZSwgQ1NfVkVSQk9TRSwgTlMocm9sZSwgUl9TRUNPTkRBUlkpKTsKIAkJCWlmIChydjIgIT0gU1NfU1VDQ0VTUykgewotCQkJCWRyYmRfa2hlbHBlcihtZGV2LCAicHJpLWxvc3QtYWZ0ZXItc2IiKTsKKwkJCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAicHJpLWxvc3QtYWZ0ZXItc2IiKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZGV2X3dhcm4oREVWLCAiU3VjY2Vzc2Z1bGx5IGdhdmUgdXAgcHJpbWFyeSByb2xlLlxuIik7CisJCQkJZHJiZF93YXJuKGRldmljZSwgIlN1Y2Nlc3NmdWxseSBnYXZlIHVwIHByaW1hcnkgcm9sZS5cbiIpOwogCQkJCXJ2ID0gaGc7CiAJCQl9CiAJCX0gZWxzZQpAQCAtMjcyMCwxNCArMjc2MiwxNCBAQAogCXJldHVybiBydjsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF91dWlkX2R1bXAoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY2hhciAqdGV4dCwgdTY0ICp1dWlkLAorc3RhdGljIHZvaWQgZHJiZF91dWlkX2R1bXAoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKnRleHQsIHU2NCAqdXVpZCwKIAkJCSAgIHU2NCBiaXRzLCB1NjQgZmxhZ3MpCiB7CiAJaWYgKCF1dWlkKSB7Ci0JCWRldl9pbmZvKERFViwgIiVzIHV1aWQgaW5mbyB2YW5pc2hlZCB3aGlsZSBJIHdhcyBsb29raW5nIVxuIiwgdGV4dCk7CisJCWRyYmRfaW5mbyhkZXZpY2UsICIlcyB1dWlkIGluZm8gdmFuaXNoZWQgd2hpbGUgSSB3YXMgbG9va2luZyFcbiIsIHRleHQpOwogCQlyZXR1cm47CiAJfQotCWRldl9pbmZvKERFViwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFggYml0czolbGx1IGZsYWdzOiVsbFhcbiIsCisJZHJiZF9pbmZvKGRldmljZSwgIiVzICUwMTZsbFg6JTAxNmxsWDolMDE2bGxYOiUwMTZsbFggYml0czolbGx1IGZsYWdzOiVsbFhcbiIsCiAJICAgICB0ZXh0LAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0NVUlJFTlRdLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl1dWlkW1VJX0JJVE1BUF0sCkBAIC0yNzQ5LDEzICsyNzkxLDEzIEBACiAtMTA5MSAgIHJlcXVpcmVzIHByb3RvIDkxCiAtMTA5NiAgIHJlcXVpcmVzIHByb3RvIDk2CiAgKi8KLXN0YXRpYyBpbnQgZHJiZF91dWlkX2NvbXBhcmUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50ICpydWxlX25yKSBfX211c3RfaG9sZChsb2NhbCkKK3N0YXRpYyBpbnQgZHJiZF91dWlkX2NvbXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCAqcnVsZV9ucikgX19tdXN0X2hvbGQobG9jYWwpCiB7CiAJdTY0IHNlbGYsIHBlZXI7CiAJaW50IGksIGo7CiAKLQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOwogCiAJKnJ1bGVfbnIgPSAxMDsKIAlpZiAoc2VsZiA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJiBwZWVyID09IFVVSURfSlVTVF9DUkVBVEVEKQpAQCAtMjc3NCw0NiArMjgxNiw0NiBAQAogCWlmIChzZWxmID09IHBlZXIpIHsKIAkJaW50IHJjdCwgZGM7IC8qIHJvbGVzIGF0IGNyYXNoIHRpbWUgKi8KIAotCQlpZiAobWRldi0+cF91dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAhPSAodTY0KTApIHsKKwkJaWYgKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICE9ICh1NjQpMCkgewogCi0JCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQorCQkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQogCQkJCXJldHVybiAtMTA5MTsKIAotCQkJaWYgKChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpICYmCi0JCQkgICAgKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdICYgfigodTY0KTEpKSkgewotCQkJCWRldl9pbmZvKERFViwgIndhcyBTeW5jU291cmNlLCBtaXNzZWQgdGhlIHJlc3luYyBmaW5pc2hlZCBldmVudCwgY29ycmVjdGVkIG15c2VsZjpcbiIpOwotCQkJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkobWRldik7Ci0JCQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKLQkJCQltZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPSAwOworCQkJaWYgKChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkgPT0gKGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSAmJgorCQkJICAgIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpKSB7CisJCQkJZHJiZF9pbmZvKGRldmljZSwgIndhcyBTeW5jU291cmNlLCBtaXNzZWQgdGhlIHJlc3luYyBmaW5pc2hlZCBldmVudCwgY29ycmVjdGVkIG15c2VsZjpcbiIpOworCQkJCWRyYmRfdXVpZF9tb3ZlX2hpc3RvcnkoZGV2aWNlKTsKKwkJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXTsKKwkJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9IDA7CiAKLQkJCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAic2VsZiIsIG1kZXYtPmxkZXYtPm1kLnV1aWQsCi0JCQkJCSAgICAgICBtZGV2LT5zdGF0ZS5kaXNrID49IERfTkVHT1RJQVRJTkcgPyBkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA6IDAsIDApOworCQkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInNlbGYiLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWQsCisJCQkJCSAgICAgICBkZXZpY2UtPnN0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyA/IGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkgOiAwLCAwKTsKIAkJCQkqcnVsZV9uciA9IDM0OwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfaW5mbyhERVYsICJ3YXMgU3luY1NvdXJjZSAocGVlciBmYWlsZWQgdG8gd3JpdGUgc3luY191dWlkKVxuIik7CisJCQkJZHJiZF9pbmZvKGRldmljZSwgIndhcyBTeW5jU291cmNlIChwZWVyIGZhaWxlZCB0byB3cml0ZSBzeW5jX3V1aWQpXG4iKTsKIAkJCQkqcnVsZV9uciA9IDM2OwogCQkJfQogCiAJCQlyZXR1cm4gMTsKIAkJfQogCi0JCWlmIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICE9ICh1NjQpMCkgeworCQlpZiAoZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0JJVE1BUF0gPT0gKHU2NCkwICYmIGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gIT0gKHU2NCkwKSB7CiAKLQkJCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCisJCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCiAJCQkJcmV0dXJuIC0xMDkxOwogCi0JCQlpZiAoKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkgJiYKLQkJCSAgICAobWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpID09IChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCQkJZGV2X2luZm8oREVWLCAid2FzIFN5bmNUYXJnZXQsIHBlZXIgbWlzc2VkIHRoZSByZXN5bmMgZmluaXNoZWQgZXZlbnQsIGNvcnJlY3RlZCBwZWVyOlxuIik7CisJCQlpZiAoKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkgPT0gKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpICYmCisJCQkgICAgKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpID09IChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkpIHsKKwkJCQlkcmJkX2luZm8oZGV2aWNlLCAid2FzIFN5bmNUYXJnZXQsIHBlZXIgbWlzc2VkIHRoZSByZXN5bmMgZmluaXNoZWQgZXZlbnQsIGNvcnJlY3RlZCBwZWVyOlxuIik7CiAKLQkJCQltZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdID0gbWRldi0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdOwotCQkJCW1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdOwotCQkJCW1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdID0gMFVMOworCQkJCWRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSA9IGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdOworCQkJCWRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdID0gZGV2aWNlLT5wX3V1aWRbVUlfQklUTUFQXTsKKwkJCQlkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdID0gMFVMOwogCi0JCQkJZHJiZF91dWlkX2R1bXAobWRldiwgInBlZXIiLCBtZGV2LT5wX3V1aWQsIG1kZXYtPnBfdXVpZFtVSV9TSVpFXSwgbWRldi0+cF91dWlkW1VJX0ZMQUdTXSk7CisJCQkJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAicGVlciIsIGRldmljZS0+cF91dWlkLCBkZXZpY2UtPnBfdXVpZFtVSV9TSVpFXSwgZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdKTsKIAkJCQkqcnVsZV9uciA9IDM1OwogCQkJfSBlbHNlIHsKLQkJCQlkZXZfaW5mbyhERVYsICJ3YXMgU3luY1RhcmdldCAoZmFpbGVkIHRvIHdyaXRlIHN5bmNfdXVpZClcbiIpOworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJ3YXMgU3luY1RhcmdldCAoZmFpbGVkIHRvIHdyaXRlIHN5bmNfdXVpZClcbiIpOwogCQkJCSpydWxlX25yID0gMzc7CiAJCQl9CiAKQEAgLTI4MjEsOCArMjg2Myw4IEBACiAJCX0KIAogCQkvKiBDb21tb24gcG93ZXIgW29mZnxmYWlsdXJlXSAqLwotCQlyY3QgPSAodGVzdF9iaXQoQ1JBU0hFRF9QUklNQVJZLCAmbWRldi0+ZmxhZ3MpID8gMSA6IDApICsKLQkJCShtZGV2LT5wX3V1aWRbVUlfRkxBR1NdICYgMik7CisJCXJjdCA9ICh0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKSA/IDEgOiAwKSArCisJCQkoZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICYgMik7CiAJCS8qIGxvd2VzdCBiaXQgaXMgc2V0IHdoZW4gd2Ugd2VyZSBwcmltYXJ5LAogCQkgKiBuZXh0IGJpdCAod2VpZ2h0IDIpIGlzIHNldCB3aGVuIHBlZXIgd2FzIHByaW1hcnkgKi8KIAkJKnJ1bGVfbnIgPSA0MDsKQEAgLTI4MzIsNzIgKzI4NzQsNzIgQEAKIAkJY2FzZSAxOiAvKiAgc2VsZl9wcmkgJiYgIXBlZXJfcHJpICovIHJldHVybiAxOwogCQljYXNlIDI6IC8qICFzZWxmX3ByaSAmJiAgcGVlcl9wcmkgKi8gcmV0dXJuIC0xOwogCQljYXNlIDM6IC8qICBzZWxmX3ByaSAmJiAgcGVlcl9wcmkgKi8KLQkJCWRjID0gdGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZtZGV2LT50Y29ubi0+ZmxhZ3MpOworCQkJZGMgPSB0ZXN0X2JpdChSRVNPTFZFX0NPTkZMSUNUUywgJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCXJldHVybiBkYyA/IC0xIDogMTsKIAkJfQogCX0KIAogCSpydWxlX25yID0gNTA7Ci0JcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOworCXBlZXIgPSBkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOwogCWlmIChzZWxmID09IHBlZXIpCiAJCXJldHVybiAtMTsKIAogCSpydWxlX25yID0gNTE7Ci0JcGVlciA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKTsKKwlwZWVyID0gZGV2aWNlLT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikgewotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KLQkJICAgIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSA9PQotCQkgICAgKG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpIDoKLQkJICAgIHBlZXIgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKG1kZXYtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpKSkgeworCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYgPworCQkgICAgKGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSAmIH4oKHU2NCkxKSkgPT0KKwkJICAgIChkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0gJiB+KCh1NjQpMSkpIDoKKwkJICAgIHBlZXIgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKGRldmljZS0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSkpKSB7CiAJCQkvKiBUaGUgbGFzdCBQX1NZTkNfVVVJRCBkaWQgbm90IGdldCB0aG91Z2guIFVuZG8gdGhlIGxhc3Qgc3RhcnQgb2YKIAkJCSAgIHJlc3luYyBhcyBzeW5jIHNvdXJjZSBtb2RpZmljYXRpb25zIG9mIHRoZSBwZWVyJ3MgVVVJRHMuICovCiAKLQkJCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCisJCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTEpCiAJCQkJcmV0dXJuIC0xMDkxOwogCi0JCQltZGV2LT5wX3V1aWRbVUlfQklUTUFQXSA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXTsKLQkJCW1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IG1kZXYtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV07CisJCQlkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdID0gZGV2aWNlLT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF07CisJCQlkZXZpY2UtPnBfdXVpZFtVSV9ISVNUT1JZX1NUQVJUXSA9IGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXTsKIAotCQkJZGV2X2luZm8oREVWLCAiTG9zdCBsYXN0IHN5bmNVVUlEIHBhY2tldCwgY29ycmVjdGVkOlxuIik7Ci0JCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAicGVlciIsIG1kZXYtPnBfdXVpZCwgbWRldi0+cF91dWlkW1VJX1NJWkVdLCBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdKTsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJMb3N0IGxhc3Qgc3luY1VVSUQgcGFja2V0LCBjb3JyZWN0ZWQ6XG4iKTsKKwkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInBlZXIiLCBkZXZpY2UtPnBfdXVpZCwgZGV2aWNlLT5wX3V1aWRbVUlfU0laRV0sIGRldmljZS0+cF91dWlkW1VJX0ZMQUdTXSk7CiAKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KIAogCSpydWxlX25yID0gNjA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSAmIH4oKHU2NCkxKTsKIAlmb3IgKGkgPSBVSV9ISVNUT1JZX1NUQVJUOyBpIDw9IFVJX0hJU1RPUllfRU5EOyBpKyspIHsKLQkJcGVlciA9IG1kZXYtPnBfdXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJcGVlciA9IGRldmljZS0+cF91dWlkW2ldICYgfigodTY0KTEpOwogCQlpZiAoc2VsZiA9PSBwZWVyKQogCQkJcmV0dXJuIC0yOwogCX0KIAogCSpydWxlX25yID0gNzA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKKwlwZWVyID0gZGV2aWNlLT5wX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikKIAkJcmV0dXJuIDE7CiAKIAkqcnVsZV9uciA9IDcxOwotCXNlbGYgPSBtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpOworCXNlbGYgPSBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSk7CiAJaWYgKHNlbGYgPT0gcGVlcikgewotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KLQkJICAgIChtZGV2LT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSAmIH4oKHU2NCkxKSkgPT0KLQkJICAgIChtZGV2LT5wX3V1aWRbVUlfSElTVE9SWV9TVEFSVF0gJiB+KCh1NjQpMSkpIDoKLQkJICAgIHNlbGYgKyBVVUlEX05FV19CTV9PRkZTRVQgPT0gKG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkpIHsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2ID8KKwkJICAgIChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVCArIDFdICYgfigodTY0KTEpKSA9PQorCQkgICAgKGRldmljZS0+cF91dWlkW1VJX0hJU1RPUllfU1RBUlRdICYgfigodTY0KTEpKSA6CisJCSAgICBzZWxmICsgVVVJRF9ORVdfQk1fT0ZGU0VUID09IChkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKSkpIHsKIAkJCS8qIFRoZSBsYXN0IFBfU1lOQ19VVUlEIGRpZCBub3QgZ2V0IHRob3VnaC4gVW5kbyB0aGUgbGFzdCBzdGFydCBvZgogCQkJICAgcmVzeW5jIGFzIHN5bmMgc291cmNlIG1vZGlmaWNhdGlvbnMgb2Ygb3VyIFVVSURzLiAqLwogCi0JCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQorCQkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkxKQogCQkJCXJldHVybiAtMTA5MTsKIAotCQkJX19kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0JJVE1BUCwgbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUXSk7Ci0JCQlfX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfSElTVE9SWV9TVEFSVCwgbWRldi0+bGRldi0+bWQudXVpZFtVSV9ISVNUT1JZX1NUQVJUICsgMV0pOworCQkJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQklUTUFQLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfSElTVE9SWV9TVEFSVF0pOworCQkJX19kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfSElTVE9SWV9TVEFSVCwgZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0hJU1RPUllfU1RBUlQgKyAxXSk7CiAKLQkJCWRldl9pbmZvKERFViwgIkxhc3Qgc3luY1VVSUQgZGlkIG5vdCBnZXQgdGhyb3VnaCwgY29ycmVjdGVkOlxuIik7Ci0JCQlkcmJkX3V1aWRfZHVtcChtZGV2LCAic2VsZiIsIG1kZXYtPmxkZXYtPm1kLnV1aWQsCi0JCQkJICAgICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyA/IGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpIDogMCwgMCk7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiTGFzdCBzeW5jVVVJRCBkaWQgbm90IGdldCB0aHJvdWdoLCBjb3JyZWN0ZWQ6XG4iKTsKKwkJCWRyYmRfdXVpZF9kdW1wKGRldmljZSwgInNlbGYiLCBkZXZpY2UtPmxkZXYtPm1kLnV1aWQsCisJCQkJICAgICAgIGRldmljZS0+c3RhdGUuZGlzayA+PSBEX05FR09USUFUSU5HID8gZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA6IDAsIDApOwogCiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMjkwNSwyNCArMjk0NywyNCBAQAogCiAKIAkqcnVsZV9uciA9IDgwOwotCXBlZXIgPSBtZGV2LT5wX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSk7CisJcGVlciA9IGRldmljZS0+cF91dWlkW1VJX0NVUlJFTlRdICYgfigodTY0KTEpOwogCWZvciAoaSA9IFVJX0hJU1RPUllfU1RBUlQ7IGkgPD0gVUlfSElTVE9SWV9FTkQ7IGkrKykgewotCQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKIAkJaWYgKHNlbGYgPT0gcGVlcikKIAkJCXJldHVybiAyOwogCX0KIAogCSpydWxlX25yID0gOTA7Ci0Jc2VsZiA9IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSAmIH4oKHU2NCkxKTsKLQlwZWVyID0gbWRldi0+cF91dWlkW1VJX0JJVE1BUF0gJiB+KCh1NjQpMSk7CisJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOworCXBlZXIgPSBkZXZpY2UtPnBfdXVpZFtVSV9CSVRNQVBdICYgfigodTY0KTEpOwogCWlmIChzZWxmID09IHBlZXIgJiYgc2VsZiAhPSAoKHU2NCkwKSkKIAkJcmV0dXJuIDEwMDsKIAogCSpydWxlX25yID0gMTAwOwogCWZvciAoaSA9IFVJX0hJU1RPUllfU1RBUlQ7IGkgPD0gVUlfSElTVE9SWV9FTkQ7IGkrKykgewotCQlzZWxmID0gbWRldi0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKKwkJc2VsZiA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpXSAmIH4oKHU2NCkxKTsKIAkJZm9yIChqID0gVUlfSElTVE9SWV9TVEFSVDsgaiA8PSBVSV9ISVNUT1JZX0VORDsgaisrKSB7Ci0JCQlwZWVyID0gbWRldi0+cF91dWlkW2pdICYgfigodTY0KTEpOworCQkJcGVlciA9IGRldmljZS0+cF91dWlkW2pdICYgfigodTY0KTEpOwogCQkJaWYgKHNlbGYgPT0gcGVlcikKIAkJCQlyZXR1cm4gLTEwMDsKIAkJfQpAQCAtMjkzNCwzNiArMjk3NiwzOCBAQAogLyogZHJiZF9zeW5jX2hhbmRzaGFrZSgpIHJldHVybnMgdGhlIG5ldyBjb25uIHN0YXRlIG9uIHN1Y2Nlc3MsIG9yCiAgICBDT05OX01BU0sgKC0xKSBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgZW51bSBkcmJkX2Nvbm5zIGRyYmRfc3luY19oYW5kc2hha2Uoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBkcmJkX3JvbGUgcGVlcl9yb2xlLAorc3RhdGljIGVudW0gZHJiZF9jb25ucyBkcmJkX3N5bmNfaGFuZHNoYWtlKHN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSwKKwkJCQkJICAgZW51bSBkcmJkX3JvbGUgcGVlcl9yb2xlLAogCQkJCQkgICBlbnVtIGRyYmRfZGlza19zdGF0ZSBwZWVyX2Rpc2spIF9fbXVzdF9ob2xkKGxvY2FsKQogeworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAllbnVtIGRyYmRfY29ubnMgcnYgPSBDX01BU0s7CiAJZW51bSBkcmJkX2Rpc2tfc3RhdGUgbXlkaXNrOwogCXN0cnVjdCBuZXRfY29uZiAqbmM7CiAJaW50IGhnLCBydWxlX25yLCBycl9jb25mbGljdCwgdGVudGF0aXZlOwogCi0JbXlkaXNrID0gbWRldi0+c3RhdGUuZGlzazsKKwlteWRpc2sgPSBkZXZpY2UtPnN0YXRlLmRpc2s7CiAJaWYgKG15ZGlzayA9PSBEX05FR09USUFUSU5HKQotCQlteWRpc2sgPSBtZGV2LT5uZXdfc3RhdGVfdG1wLmRpc2s7CisJCW15ZGlzayA9IGRldmljZS0+bmV3X3N0YXRlX3RtcC5kaXNrOwogCi0JZGV2X2luZm8oREVWLCAiZHJiZF9zeW5jX2hhbmRzaGFrZTpcbiIpOworCWRyYmRfaW5mbyhkZXZpY2UsICJkcmJkX3N5bmNfaGFuZHNoYWtlOlxuIik7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT5sZGV2LT5tZC51dWlkX2xvY2spOwotCWRyYmRfdXVpZF9kdW1wKG1kZXYsICJzZWxmIiwgbWRldi0+bGRldi0+bWQudXVpZCwgbWRldi0+Y29tbV9ibV9zZXQsIDApOwotCWRyYmRfdXVpZF9kdW1wKG1kZXYsICJwZWVyIiwgbWRldi0+cF91dWlkLAotCQkgICAgICAgbWRldi0+cF91dWlkW1VJX1NJWkVdLCBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAic2VsZiIsIGRldmljZS0+bGRldi0+bWQudXVpZCwgZGV2aWNlLT5jb21tX2JtX3NldCwgMCk7CisJZHJiZF91dWlkX2R1bXAoZGV2aWNlLCAicGVlciIsIGRldmljZS0+cF91dWlkLAorCQkgICAgICAgZGV2aWNlLT5wX3V1aWRbVUlfU0laRV0sIGRldmljZS0+cF91dWlkW1VJX0ZMQUdTXSk7CiAKLQloZyA9IGRyYmRfdXVpZF9jb21wYXJlKG1kZXYsICZydWxlX25yKTsKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmxkZXYtPm1kLnV1aWRfbG9jayk7CisJaGcgPSBkcmJkX3V1aWRfY29tcGFyZShkZXZpY2UsICZydWxlX25yKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+bGRldi0+bWQudXVpZF9sb2NrKTsKIAotCWRldl9pbmZvKERFViwgInV1aWRfY29tcGFyZSgpPSVkIGJ5IHJ1bGUgJWRcbiIsIGhnLCBydWxlX25yKTsKKwlkcmJkX2luZm8oZGV2aWNlLCAidXVpZF9jb21wYXJlKCk9JWQgYnkgcnVsZSAlZFxuIiwgaGcsIHJ1bGVfbnIpOwogCiAJaWYgKGhnID09IC0xMDAwKSB7Ci0JCWRldl9hbGVydChERVYsICJVbnJlbGF0ZWQgZGF0YSwgYWJvcnRpbmchXG4iKTsKKwkJZHJiZF9hbGVydChkZXZpY2UsICJVbnJlbGF0ZWQgZGF0YSwgYWJvcnRpbmchXG4iKTsKIAkJcmV0dXJuIENfTUFTSzsKIAl9CiAJaWYgKGhnIDwgLTEwMDApIHsKLQkJZGV2X2FsZXJ0KERFViwgIlRvIHJlc29sdmUgdGhpcyBib3RoIHNpZGVzIGhhdmUgdG8gc3VwcG9ydCBhdCBsZWFzdCBwcm90b2NvbCAlZFxuIiwgLWhnIC0gMTAwMCk7CisJCWRyYmRfYWxlcnQoZGV2aWNlLCAiVG8gcmVzb2x2ZSB0aGlzIGJvdGggc2lkZXMgaGF2ZSB0byBzdXBwb3J0IGF0IGxlYXN0IHByb3RvY29sICVkXG4iLCAtaGcgLSAxMDAwKTsKIAkJcmV0dXJuIENfTUFTSzsKIAl9CiAKQEAgLTI5NzMsMzggKzMwMTcsMzggQEAKIAkJaGcgPSBteWRpc2sgPiBEX0lOQ09OU0lTVEVOVCA/IDEgOiAtMTsKIAkJaWYgKGYpCiAJCQloZyA9IGhnKjI7Ci0JCWRldl9pbmZvKERFViwgIkJlY29taW5nIHN5bmMgJXMgZHVlIHRvIGRpc2sgc3RhdGVzLlxuIiwKKwkJZHJiZF9pbmZvKGRldmljZSwgIkJlY29taW5nIHN5bmMgJXMgZHVlIHRvIGRpc2sgc3RhdGVzLlxuIiwKIAkJICAgICBoZyA+IDAgPyAic291cmNlIiA6ICJ0YXJnZXQiKTsKIAl9CiAKIAlpZiAoYWJzKGhnKSA9PSAxMDApCi0JCWRyYmRfa2hlbHBlcihtZGV2LCAiaW5pdGlhbC1zcGxpdC1icmFpbiIpOworCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAiaW5pdGlhbC1zcGxpdC1icmFpbiIpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5jID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnRjb25uLT5uZXRfY29uZik7CisJbmMgPSByY3VfZGVyZWZlcmVuY2UocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAogCWlmIChoZyA9PSAxMDAgfHwgKGhnID09IC0xMDAgJiYgbmMtPmFsd2F5c19hc2JwKSkgewotCQlpbnQgcGNvdW50ID0gKG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKQorCQlpbnQgcGNvdW50ID0gKGRldmljZS0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkpCiAJCQkgICArIChwZWVyX3JvbGUgPT0gUl9QUklNQVJZKTsKIAkJaW50IGZvcmNlZCA9IChoZyA9PSAtMTAwKTsKIAogCQlzd2l0Y2ggKHBjb3VudCkgewogCQljYXNlIDA6Ci0JCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAobWRldik7CisJCQloZyA9IGRyYmRfYXNiX3JlY292ZXJfMHAocGVlcl9kZXZpY2UpOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8xcChtZGV2KTsKKwkJCWhnID0gZHJiZF9hc2JfcmVjb3Zlcl8xcChwZWVyX2RldmljZSk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzJwKG1kZXYpOworCQkJaGcgPSBkcmJkX2FzYl9yZWNvdmVyXzJwKHBlZXJfZGV2aWNlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChhYnMoaGcpIDwgMTAwKSB7Ci0JCQlkZXZfd2FybihERVYsICJTcGxpdC1CcmFpbiBkZXRlY3RlZCwgJWQgcHJpbWFyaWVzLCAiCisJCQlkcmJkX3dhcm4oZGV2aWNlLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQsICVkIHByaW1hcmllcywgIgogCQkJICAgICAiYXV0b21hdGljYWxseSBzb2x2ZWQuIFN5bmMgZnJvbSAlcyBub2RlXG4iLAogCQkJICAgICBwY291bnQsIChoZyA8IDApID8gInBlZXIiIDogInRoaXMiKTsKIAkJCWlmIChmb3JjZWQpIHsKLQkJCQlkZXZfd2FybihERVYsICJEb2luZyBhIGZ1bGwgc3luYywgc2luY2UiCisJCQkJZHJiZF93YXJuKGRldmljZSwgIkRvaW5nIGEgZnVsbCBzeW5jLCBzaW5jZSIKIAkJCQkgICAgICIgVVVJRHMgd2hlcmUgYW1iaWd1b3VzLlxuIik7CiAJCQkJaGcgPSBoZyoyOwogCQkJfQpAQCAtMzAxMiwxMyArMzA1NiwxMyBAQAogCX0KIAogCWlmIChoZyA9PSAtMTAwKSB7Ci0JCWlmICh0ZXN0X2JpdChESVNDQVJEX01ZX0RBVEEsICZtZGV2LT5mbGFncykgJiYgIShtZGV2LT5wX3V1aWRbVUlfRkxBR1NdJjEpKQorCQlpZiAodGVzdF9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncykgJiYgIShkZXZpY2UtPnBfdXVpZFtVSV9GTEFHU10mMSkpCiAJCQloZyA9IC0xOwotCQlpZiAoIXRlc3RfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKSAmJiAobWRldi0+cF91dWlkW1VJX0ZMQUdTXSYxKSkKKwkJaWYgKCF0ZXN0X2JpdChESVNDQVJEX01ZX0RBVEEsICZkZXZpY2UtPmZsYWdzKSAmJiAoZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdJjEpKQogCQkJaGcgPSAxOwogCiAJCWlmIChhYnMoaGcpIDwgMTAwKQotCQkJZGV2X3dhcm4oREVWLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQsIG1hbnVhbGx5IHNvbHZlZC4gIgorCQkJZHJiZF93YXJuKGRldmljZSwgIlNwbGl0LUJyYWluIGRldGVjdGVkLCBtYW51YWxseSBzb2x2ZWQuICIKIAkJCSAgICAgIlN5bmMgZnJvbSAlcyBub2RlXG4iLAogCQkJICAgICAoaGcgPCAwKSA/ICJwZWVyIiA6ICJ0aGlzIik7CiAJfQpAQCAtMzAzMSw0NCArMzA3NSw0NCBAQAogCQkgKiBhZnRlciBhbiBhdHRlbXB0ZWQgYXR0YWNoIG9uIGEgZGlza2xlc3Mgbm9kZS4KIAkJICogV2UganVzdCByZWZ1c2UgdG8gYXR0YWNoIC0tIHdlbGwsIHdlIGRyb3AgdGhlICJjb25uZWN0aW9uIgogCQkgKiB0byB0aGF0IGRpc2ssIGluIGEgd2F5Li4uICovCi0JCWRldl9hbGVydChERVYsICJTcGxpdC1CcmFpbiBkZXRlY3RlZCBidXQgdW5yZXNvbHZlZCwgZHJvcHBpbmcgY29ubmVjdGlvbiFcbiIpOwotCQlkcmJkX2toZWxwZXIobWRldiwgInNwbGl0LWJyYWluIik7CisJCWRyYmRfYWxlcnQoZGV2aWNlLCAiU3BsaXQtQnJhaW4gZGV0ZWN0ZWQgYnV0IHVucmVzb2x2ZWQsIGRyb3BwaW5nIGNvbm5lY3Rpb24hXG4iKTsKKwkJZHJiZF9raGVscGVyKGRldmljZSwgInNwbGl0LWJyYWluIik7CiAJCXJldHVybiBDX01BU0s7CiAJfQogCiAJaWYgKGhnID4gMCAmJiBteWRpc2sgPD0gRF9JTkNPTlNJU1RFTlQpIHsKLQkJZGV2X2VycihERVYsICJJIHNoYWxsIGJlY29tZSBTeW5jU291cmNlLCBidXQgSSBhbSBpbmNvbnNpc3RlbnQhXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiSSBzaGFsbCBiZWNvbWUgU3luY1NvdXJjZSwgYnV0IEkgYW0gaW5jb25zaXN0ZW50IVxuIik7CiAJCXJldHVybiBDX01BU0s7CiAJfQogCiAJaWYgKGhnIDwgMCAmJiAvKiBieSBpbnRlbnRpb24gd2UgZG8gbm90IHVzZSBteWRpc2sgaGVyZS4gKi8KLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYgbWRldi0+c3RhdGUuZGlzayA+PSBEX0NPTlNJU1RFTlQpIHsKKwkgICAgZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSAmJiBkZXZpY2UtPnN0YXRlLmRpc2sgPj0gRF9DT05TSVNURU5UKSB7CiAJCXN3aXRjaCAocnJfY29uZmxpY3QpIHsKIAkJY2FzZSBBU0JfQ0FMTF9IRUxQRVI6Ci0JCQlkcmJkX2toZWxwZXIobWRldiwgInByaS1sb3N0Iik7CisJCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAicHJpLWxvc3QiKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIEFTQl9ESVNDT05ORUNUOgotCQkJZGV2X2VycihERVYsICJJIHNoYWxsIGJlY29tZSBTeW5jVGFyZ2V0LCBidXQgSSBhbSBwcmltYXJ5IVxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJJIHNoYWxsIGJlY29tZSBTeW5jVGFyZ2V0LCBidXQgSSBhbSBwcmltYXJ5IVxuIik7CiAJCQlyZXR1cm4gQ19NQVNLOwogCQljYXNlIEFTQl9WSU9MRU5UTFk6Ci0JCQlkZXZfd2FybihERVYsICJCZWNvbWluZyBTeW5jVGFyZ2V0LCB2aW9sYXRpbmcgdGhlIHN0YWJsZS1kYXRhIgorCQkJZHJiZF93YXJuKGRldmljZSwgIkJlY29taW5nIFN5bmNUYXJnZXQsIHZpb2xhdGluZyB0aGUgc3RhYmxlLWRhdGEiCiAJCQkgICAgICJhc3N1bXB0aW9uXG4iKTsKIAkJfQogCX0KIAotCWlmICh0ZW50YXRpdmUgfHwgdGVzdF9iaXQoQ09OTl9EUllfUlVOLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkgeworCWlmICh0ZW50YXRpdmUgfHwgdGVzdF9iaXQoQ09OTl9EUllfUlVOLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSkgewogCQlpZiAoaGcgPT0gMCkKLQkJCWRldl9pbmZvKERFViwgImRyeS1ydW4gY29ubmVjdDogTm8gcmVzeW5jLCB3b3VsZCBiZWNvbWUgQ29ubmVjdGVkIGltbWVkaWF0ZWx5LlxuIik7CisJCQlkcmJkX2luZm8oZGV2aWNlLCAiZHJ5LXJ1biBjb25uZWN0OiBObyByZXN5bmMsIHdvdWxkIGJlY29tZSBDb25uZWN0ZWQgaW1tZWRpYXRlbHkuXG4iKTsKIAkJZWxzZQotCQkJZGV2X2luZm8oREVWLCAiZHJ5LXJ1biBjb25uZWN0OiBXb3VsZCBiZWNvbWUgJXMsIGRvaW5nIGEgJXMgcmVzeW5jLiIsCisJCQlkcmJkX2luZm8oZGV2aWNlLCAiZHJ5LXJ1biBjb25uZWN0OiBXb3VsZCBiZWNvbWUgJXMsIGRvaW5nIGEgJXMgcmVzeW5jLiIsCiAJCQkJIGRyYmRfY29ubl9zdHIoaGcgPiAwID8gQ19TWU5DX1NPVVJDRSA6IENfU1lOQ19UQVJHRVQpLAogCQkJCSBhYnMoaGcpID49IDIgPyAiZnVsbCIgOiAiYml0LW1hcCBiYXNlZCIpOwogCQlyZXR1cm4gQ19NQVNLOwogCX0KIAogCWlmIChhYnMoaGcpID49IDIpIHsKLQkJZGV2X2luZm8oREVWLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBmdWxsIHN5bmMgcmVxdWlyZWQgYWZ0ZXIgZHJiZF9zeW5jX2hhbmRzaGFrZS5cbiIpOwotCQlpZiAoZHJiZF9iaXRtYXBfaW8obWRldiwgJmRyYmRfYm1pb19zZXRfbl93cml0ZSwgInNldF9uX3dyaXRlIGZyb20gc3luY19oYW5kc2hha2UiLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiV3JpdGluZyB0aGUgd2hvbGUgYml0bWFwLCBmdWxsIHN5bmMgcmVxdWlyZWQgYWZ0ZXIgZHJiZF9zeW5jX2hhbmRzaGFrZS5cbiIpOworCQlpZiAoZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX3NldF9uX3dyaXRlLCAic2V0X25fd3JpdGUgZnJvbSBzeW5jX2hhbmRzaGFrZSIsCiAJCQkJCUJNX0xPQ0tFRF9TRVRfQUxMT1dFRCkpCiAJCQlyZXR1cm4gQ19NQVNLOwogCX0KQEAgLTMwNzksOSArMzEyMyw5IEBACiAJCXJ2ID0gQ19XRl9CSVRNQVBfVDsKIAl9IGVsc2UgewogCQlydiA9IENfQ09OTkVDVEVEOwotCQlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldikpIHsKLQkJCWRldl9pbmZvKERFViwgIk5vIHJlc3luYywgYnV0ICVsdSBiaXRzIGluIGJpdG1hcCFcbiIsCi0JCQkgICAgIGRyYmRfYm1fdG90YWxfd2VpZ2h0KG1kZXYpKTsKKwkJaWYgKGRyYmRfYm1fdG90YWxfd2VpZ2h0KGRldmljZSkpIHsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJObyByZXN5bmMsIGJ1dCAlbHUgYml0cyBpbiBiaXRtYXAhXG4iLAorCQkJICAgICBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpKTsKIAkJfQogCX0KIApAQCAtMzEwMiw3ICszMTQ2LDcgQEAKIAlyZXR1cm4gcGVlcjsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX3Byb3RvY29sKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9wcm90b2NvbChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXN0cnVjdCBwX3Byb3RvY29sICpwID0gcGktPmRhdGE7CiAJZW51bSBkcmJkX2FmdGVyX3NiX3AgcF9hZnRlcl9zYl8wcCwgcF9hZnRlcl9zYl8xcCwgcF9hZnRlcl9zYl8ycDsKQEAgLTMxMjAsNTggKzMxNjQsNTggQEAKIAljZgkJPSBiZTMyX3RvX2NwdShwLT5jb25uX2ZsYWdzKTsKIAlwX2Rpc2NhcmRfbXlfZGF0YSA9IGNmICYgQ0ZfRElTQ0FSRF9NWV9EQVRBOwogCi0JaWYgKHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODcpIHsKKwlpZiAoY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg3KSB7CiAJCWludCBlcnI7CiAKIAkJaWYgKHBpLT5zaXplID4gc2l6ZW9mKGludGVncml0eV9hbGcpKQogCQkJcmV0dXJuIC1FSU87Ci0JCWVyciA9IGRyYmRfcmVjdl9hbGwodGNvbm4sIGludGVncml0eV9hbGcsIHBpLT5zaXplKTsKKwkJZXJyID0gZHJiZF9yZWN2X2FsbChjb25uZWN0aW9uLCBpbnRlZ3JpdHlfYWxnLCBwaS0+c2l6ZSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCQlpbnRlZ3JpdHlfYWxnW1NIQVJFRF9TRUNSRVRfTUFYIC0gMV0gPSAwOwogCX0KIAogCWlmIChwaS0+Y21kICE9IFBfUFJPVE9DT0xfVVBEQVRFKSB7Ci0JCWNsZWFyX2JpdChDT05OX0RSWV9SVU4sICZ0Y29ubi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoQ09OTl9EUllfUlVOLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCiAJCWlmIChjZiAmIENGX0RSWV9SVU4pCi0JCQlzZXRfYml0KENPTk5fRFJZX1JVTiwgJnRjb25uLT5mbGFncyk7CisJCQlzZXRfYml0KENPTk5fRFJZX1JVTiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW5jID0gcmN1X2RlcmVmZXJlbmNlKHRjb25uLT5uZXRfY29uZik7CisJCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAogCQlpZiAocF9wcm90byAhPSBuYy0+d2lyZV9wcm90b2NvbCkgewotCQkJY29ubl9lcnIodGNvbm4sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJwcm90b2NvbCIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgInByb3RvY29sIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChjb252ZXJ0X2FmdGVyX3NiKHBfYWZ0ZXJfc2JfMHApICE9IG5jLT5hZnRlcl9zYl8wcCkgewotCQkJY29ubl9lcnIodGNvbm4sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhZnRlci1zYi0wcHJpIik7CisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiaW5jb21wYXRpYmxlICVzIHNldHRpbmdzXG4iLCAiYWZ0ZXItc2ItMHByaSIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIAogCQlpZiAoY29udmVydF9hZnRlcl9zYihwX2FmdGVyX3NiXzFwKSAhPSBuYy0+YWZ0ZXJfc2JfMXApIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAiaW5jb21wYXRpYmxlICVzIHNldHRpbmdzXG4iLCAiYWZ0ZXItc2ItMXByaSIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFmdGVyLXNiLTFwcmkiKTsKIAkJCWdvdG8gZGlzY29ubmVjdF9yY3VfdW5sb2NrOwogCQl9CiAKIAkJaWYgKGNvbnZlcnRfYWZ0ZXJfc2IocF9hZnRlcl9zYl8ycCkgIT0gbmMtPmFmdGVyX3NiXzJwKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFmdGVyLXNiLTJwcmkiKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhZnRlci1zYi0ycHJpIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChwX2Rpc2NhcmRfbXlfZGF0YSAmJiBuYy0+ZGlzY2FyZF9teV9kYXRhKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRpc2NhcmQtbXktZGF0YSIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRpc2NhcmQtbXktZGF0YSIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIAogCQlpZiAocF90d29fcHJpbWFyaWVzICE9IG5jLT50d29fcHJpbWFyaWVzKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImFsbG93LXR3by1wcmltYXJpZXMiKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJpbmNvbXBhdGlibGUgJXMgc2V0dGluZ3NcbiIsICJhbGxvdy10d28tcHJpbWFyaWVzIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3RfcmN1X3VubG9jazsKIAkJfQogCiAJCWlmIChzdHJjbXAoaW50ZWdyaXR5X2FsZywgbmMtPmludGVncml0eV9hbGcpKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRhdGEtaW50ZWdyaXR5LWFsZyIpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImluY29tcGF0aWJsZSAlcyBzZXR0aW5nc1xuIiwgImRhdGEtaW50ZWdyaXR5LWFsZyIpOwogCQkJZ290byBkaXNjb25uZWN0X3JjdV91bmxvY2s7CiAJCX0KIApAQCAtMzE5Miw3ICszMjM2LDcgQEAKIAogCQlwZWVyX2ludGVncml0eV90Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaChpbnRlZ3JpdHlfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKIAkJaWYgKCFwZWVyX2ludGVncml0eV90Zm0pIHsKLQkJCWNvbm5fZXJyKHRjb25uLCAicGVlciBkYXRhLWludGVncml0eS1hbGcgJXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJwZWVyIGRhdGEtaW50ZWdyaXR5LWFsZyAlcyBub3Qgc3VwcG9ydGVkXG4iLAogCQkJCSBpbnRlZ3JpdHlfYWxnKTsKIAkJCWdvdG8gZGlzY29ubmVjdDsKIAkJfQpAQCAtMzIwMSwyMCArMzI0NSwyMCBAQAogCQlpbnRfZGlnX2luID0ga21hbGxvYyhoYXNoX3NpemUsIEdGUF9LRVJORUwpOwogCQlpbnRfZGlnX3Z2ID0ga21hbGxvYyhoYXNoX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIShpbnRfZGlnX2luICYmIGludF9kaWdfdnYpKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIkFsbG9jYXRpb24gb2YgYnVmZmVycyBmb3IgZGF0YSBpbnRlZ3JpdHkgY2hlY2tpbmcgZmFpbGVkXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJBbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgZm9yIGRhdGEgaW50ZWdyaXR5IGNoZWNraW5nIGZhaWxlZFxuIik7CiAJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCX0KIAl9CiAKIAluZXdfbmV0X2NvbmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2NvbmYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19uZXRfY29uZikgewotCQljb25uX2Vycih0Y29ubiwgIkFsbG9jYXRpb24gb2YgbmV3IG5ldF9jb25mIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJBbGxvY2F0aW9uIG9mIG5ldyBuZXRfY29uZiBmYWlsZWRcbiIpOwogCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJfQogCi0JbXV0ZXhfbG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOwotCW11dGV4X2xvY2soJnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0Jb2xkX25ldF9jb25mID0gdGNvbm4tPm5ldF9jb25mOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJb2xkX25ldF9jb25mID0gY29ubmVjdGlvbi0+bmV0X2NvbmY7CiAJKm5ld19uZXRfY29uZiA9ICpvbGRfbmV0X2NvbmY7CiAKIAluZXdfbmV0X2NvbmYtPndpcmVfcHJvdG9jb2wgPSBwX3Byb3RvOwpAQCAtMzIyMywxOSArMzI2NywxOSBAQAogCW5ld19uZXRfY29uZi0+YWZ0ZXJfc2JfMnAgPSBjb252ZXJ0X2FmdGVyX3NiKHBfYWZ0ZXJfc2JfMnApOwogCW5ld19uZXRfY29uZi0+dHdvX3ByaW1hcmllcyA9IHBfdHdvX3ByaW1hcmllczsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcih0Y29ubi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7Ci0JbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCW11dGV4X3VubG9jaygmdGNvbm4tPmRhdGEubXV0ZXgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uZWN0aW9uLT5uZXRfY29uZiwgbmV3X25ldF9jb25mKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5kYXRhLm11dGV4KTsKIAotCWNyeXB0b19mcmVlX2hhc2godGNvbm4tPnBlZXJfaW50ZWdyaXR5X3RmbSk7Ci0Ja2ZyZWUodGNvbm4tPmludF9kaWdfaW4pOwotCWtmcmVlKHRjb25uLT5pbnRfZGlnX3Z2KTsKLQl0Y29ubi0+cGVlcl9pbnRlZ3JpdHlfdGZtID0gcGVlcl9pbnRlZ3JpdHlfdGZtOwotCXRjb25uLT5pbnRfZGlnX2luID0gaW50X2RpZ19pbjsKLQl0Y29ubi0+aW50X2RpZ192diA9IGludF9kaWdfdnY7CisJY3J5cHRvX2ZyZWVfaGFzaChjb25uZWN0aW9uLT5wZWVyX2ludGVncml0eV90Zm0pOworCWtmcmVlKGNvbm5lY3Rpb24tPmludF9kaWdfaW4pOworCWtmcmVlKGNvbm5lY3Rpb24tPmludF9kaWdfdnYpOworCWNvbm5lY3Rpb24tPnBlZXJfaW50ZWdyaXR5X3RmbSA9IHBlZXJfaW50ZWdyaXR5X3RmbTsKKwljb25uZWN0aW9uLT5pbnRfZGlnX2luID0gaW50X2RpZ19pbjsKKwljb25uZWN0aW9uLT5pbnRfZGlnX3Z2ID0gaW50X2RpZ192djsKIAogCWlmIChzdHJjbXAob2xkX25ldF9jb25mLT5pbnRlZ3JpdHlfYWxnLCBpbnRlZ3JpdHlfYWxnKSkKLQkJY29ubl9pbmZvKHRjb25uLCAicGVlciBkYXRhLWludGVncml0eS1hbGc6ICVzXG4iLAorCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgInBlZXIgZGF0YS1pbnRlZ3JpdHktYWxnOiAlc1xuIiwKIAkJCSAgaW50ZWdyaXR5X2FsZ1swXSA/IGludGVncml0eV9hbGcgOiAiKG5vbmUpIik7CiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKQEAgLTMyNDgsNyArMzI5Miw3IEBACiAJY3J5cHRvX2ZyZWVfaGFzaChwZWVyX2ludGVncml0eV90Zm0pOwogCWtmcmVlKGludF9kaWdfaW4pOwogCWtmcmVlKGludF9kaWdfdnYpOwotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC0zMjU3LDcgKzMzMDEsOCBAQAogICogcmV0dXJuOiBOVUxMIChhbGcgbmFtZSB3YXMgIiIpCiAgKiAgICAgICAgIEVSUl9QVFIoZXJyb3IpIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgKiAgICAgICAgIG9yIHRoZSBjcnlwdG8gaGFzaCBwdHIsIGlmIGl0IHdvcmtlZCBvdXQgb2suICovCi1zdHJ1Y3QgY3J5cHRvX2hhc2ggKmRyYmRfY3J5cHRvX2FsbG9jX2RpZ2VzdF9zYWZlKGNvbnN0IHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMKK3N0cnVjdCBjcnlwdG9faGFzaCAqZHJiZF9jcnlwdG9fYWxsb2NfZGlnZXN0X3NhZmUoY29uc3Qgc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IGNoYXIgKmFsZywgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTsKQEAgLTMyNjcsMjEgKzMzMTIsMjEgQEAKIAogCXRmbSA9IGNyeXB0b19hbGxvY19oYXNoKGFsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUih0Zm0pKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG5vdCBhbGxvY2F0ZSBcIiVzXCIgYXMgJXMgKHJlYXNvbjogJWxkKVxuIiwKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQ2FuIG5vdCBhbGxvY2F0ZSBcIiVzXCIgYXMgJXMgKHJlYXNvbjogJWxkKVxuIiwKIAkJCWFsZywgbmFtZSwgUFRSX0VSUih0Zm0pKTsKIAkJcmV0dXJuIHRmbTsKIAl9CiAJcmV0dXJuIHRmbTsKIH0KIAotc3RhdGljIGludCBpZ25vcmVfcmVtYWluaW5nX3BhY2tldChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jdm9pZCAqYnVmZmVyID0gdGNvbm4tPmRhdGEucmJ1ZjsKKwl2b2lkICpidWZmZXIgPSBjb25uZWN0aW9uLT5kYXRhLnJidWY7CiAJaW50IHNpemUgPSBwaS0+c2l6ZTsKIAogCXdoaWxlIChzaXplKSB7CiAJCWludCBzID0gbWluX3QoaW50LCBzaXplLCBEUkJEX1NPQ0tFVF9CVUZGRVJfU0laRSk7Ci0JCXMgPSBkcmJkX3JlY3YodGNvbm4sIGJ1ZmZlciwgcyk7CisJCXMgPSBkcmJkX3JlY3YoY29ubmVjdGlvbiwgYnVmZmVyLCBzKTsKIAkJaWYgKHMgPD0gMCkgewogCQkJaWYgKHMgPCAwKQogCQkJCXJldHVybiBzOwpAQCAtMzMwNSwzMCArMzM1MCwzMiBAQAogICoKICAqIChXZSBjYW4gYWxzbyBlbmQgdXAgaGVyZSBpZiBkcmJkIGlzIG1pc2NvbmZpZ3VyZWQuKQogICovCi1zdGF0aWMgaW50IGNvbmZpZ191bmtub3duX3ZvbHVtZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGNvbmZpZ191bmtub3duX3ZvbHVtZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCWNvbm5fd2Fybih0Y29ubiwgIiVzIHBhY2tldCByZWNlaXZlZCBmb3Igdm9sdW1lICV1LCB3aGljaCBpcyBub3QgY29uZmlndXJlZCBsb2NhbGx5XG4iLAorCWRyYmRfd2Fybihjb25uZWN0aW9uLCAiJXMgcGFja2V0IHJlY2VpdmVkIGZvciB2b2x1bWUgJXUsIHdoaWNoIGlzIG5vdCBjb25maWd1cmVkIGxvY2FsbHlcbiIsCiAJCSAgY21kbmFtZShwaS0+Y21kKSwgcGktPnZucik7Ci0JcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHRjb25uLCBwaSk7CisJcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KGNvbm5lY3Rpb24sIHBpKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1N5bmNQYXJhbShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfU3luY1BhcmFtKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IHBfcnNfcGFyYW1fOTUgKnA7CiAJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplLCBkYXRhX3NpemUsIGV4cF9tYXhfc3o7CiAJc3RydWN0IGNyeXB0b19oYXNoICp2ZXJpZnlfdGZtID0gTlVMTDsKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmNzdW1zX3RmbSA9IE5VTEw7CiAJc3RydWN0IG5ldF9jb25mICpvbGRfbmV0X2NvbmYsICpuZXdfbmV0X2NvbmYgPSBOVUxMOwogCXN0cnVjdCBkaXNrX2NvbmYgKm9sZF9kaXNrX2NvbmYgPSBOVUxMLCAqbmV3X2Rpc2tfY29uZiA9IE5VTEw7Ci0JY29uc3QgaW50IGFwdiA9IHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb247CisJY29uc3QgaW50IGFwdiA9IGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbjsKIAlzdHJ1Y3QgZmlmb19idWZmZXIgKm9sZF9wbGFuID0gTlVMTCwgKm5ld19wbGFuID0gTlVMTDsKIAlpbnQgZmlmb19zaXplID0gMDsKIAlpbnQgZXJyOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCi0JCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUodGNvbm4sIHBpKTsKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKKwkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZShjb25uZWN0aW9uLCBwaSk7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCWV4cF9tYXhfc3ogID0gYXB2IDw9IDg3ID8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtKQogCQkgICAgOiBhcHYgPT0gODggPyBzaXplb2Yoc3RydWN0IHBfcnNfcGFyYW0pCkBAIC0zMzM3LDcgKzMzODQsNyBAQAogCQkgICAgOiAvKiBhcHYgPj0gOTUgKi8gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtXzk1KTsKIAogCWlmIChwaS0+c2l6ZSA+IGV4cF9tYXhfc3opIHsKLQkJZGV2X2VycihERVYsICJTeW5jUGFyYW0gcGFja2V0IHRvbyBsb25nOiByZWNlaXZlZCAldSwgZXhwZWN0ZWQgPD0gJXUgYnl0ZXNcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgIlN5bmNQYXJhbSBwYWNrZXQgdG9vIGxvbmc6IHJlY2VpdmVkICV1LCBleHBlY3RlZCA8PSAldSBieXRlc1xuIiwKIAkJICAgIHBpLT5zaXplLCBleHBfbWF4X3N6KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzM0OCwzMyArMzM5NSwzMyBAQAogCX0gZWxzZSBpZiAoYXB2IDw9IDk0KSB7CiAJCWhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBwX3JzX3BhcmFtXzg5KTsKIAkJZGF0YV9zaXplID0gcGktPnNpemUgLSBoZWFkZXJfc2l6ZTsKLQkJRF9BU1NFUlQoZGF0YV9zaXplID09IDApOworCQlEX0FTU0VSVChkZXZpY2UsIGRhdGFfc2l6ZSA9PSAwKTsKIAl9IGVsc2UgewogCQloZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcF9yc19wYXJhbV85NSk7CiAJCWRhdGFfc2l6ZSA9IHBpLT5zaXplIC0gaGVhZGVyX3NpemU7Ci0JCURfQVNTRVJUKGRhdGFfc2l6ZSA9PSAwKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkYXRhX3NpemUgPT0gMCk7CiAJfQogCiAJLyogaW5pdGlhbGl6ZSB2ZXJpZnlfYWxnIGFuZCBjc3Vtc19hbGcgKi8KIAlwID0gcGktPmRhdGE7CiAJbWVtc2V0KHAtPnZlcmlmeV9hbGcsIDAsIDIgKiBTSEFSRURfU0VDUkVUX01BWCk7CiAKLQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCBoZWFkZXJfc2l6ZSk7CisJZXJyID0gZHJiZF9yZWN2X2FsbChwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgcCwgaGVhZGVyX3NpemUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQltdXRleF9sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCW9sZF9uZXRfY29uZiA9IG1kZXYtPnRjb25uLT5uZXRfY29uZjsKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOworCW9sZF9uZXRfY29uZiA9IHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5uZXRfY29uZjsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQluZXdfZGlza19jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRpc2tfY29uZiksIEdGUF9LRVJORUwpOwogCQlpZiAoIW5ld19kaXNrX2NvbmYpIHsKLQkJCXB1dF9sZGV2KG1kZXYpOwotCQkJbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOwotCQkJZGV2X2VycihERVYsICJBbGxvY2F0aW9uIG9mIG5ldyBkaXNrX2NvbmYgZmFpbGVkXG4iKTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CisJCQltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CisJCQlkcmJkX2VycihkZXZpY2UsICJBbGxvY2F0aW9uIG9mIG5ldyBkaXNrX2NvbmYgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJb2xkX2Rpc2tfY29uZiA9IG1kZXYtPmxkZXYtPmRpc2tfY29uZjsKKwkJb2xkX2Rpc2tfY29uZiA9IGRldmljZS0+bGRldi0+ZGlza19jb25mOwogCQkqbmV3X2Rpc2tfY29uZiA9ICpvbGRfZGlza19jb25mOwogCiAJCW5ld19kaXNrX2NvbmYtPnJlc3luY19yYXRlID0gYmUzMl90b19jcHUocC0+cmVzeW5jX3JhdGUpOwpAQCAtMzM4MywzNyArMzQzMCwzNyBAQAogCWlmIChhcHYgPj0gODgpIHsKIAkJaWYgKGFwdiA9PSA4OCkgewogCQkJaWYgKGRhdGFfc2l6ZSA+IFNIQVJFRF9TRUNSRVRfTUFYIHx8IGRhdGFfc2l6ZSA9PSAwKSB7Ci0JCQkJZGV2X2VycihERVYsICJ2ZXJpZnktYWxnIG9mIHdyb25nIHNpemUsICIKKwkJCQlkcmJkX2VycihkZXZpY2UsICJ2ZXJpZnktYWxnIG9mIHdyb25nIHNpemUsICIKIAkJCQkJInBlZXIgd2FudHMgJXUsIGFjY2VwdGluZyBvbmx5IHVwIHRvICV1IGJ5dGVcbiIsCiAJCQkJCWRhdGFfc2l6ZSwgU0hBUkVEX1NFQ1JFVF9NQVgpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9CiAKLQkJCWVyciA9IGRyYmRfcmVjdl9hbGwobWRldi0+dGNvbm4sIHAtPnZlcmlmeV9hbGcsIGRhdGFfc2l6ZSk7CisJCQllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLT52ZXJpZnlfYWxnLCBkYXRhX3NpemUpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCS8qIHdlIGV4cGVjdCBOVUwgdGVybWluYXRlZCBzdHJpbmcgKi8KIAkJCS8qIGJ1dCBqdXN0IGluIGNhc2Ugc29tZW9uZSB0cmllcyB0byBiZSBldmlsICovCi0JCQlEX0FTU0VSVChwLT52ZXJpZnlfYWxnW2RhdGFfc2l6ZS0xXSA9PSAwKTsKKwkJCURfQVNTRVJUKGRldmljZSwgcC0+dmVyaWZ5X2FsZ1tkYXRhX3NpemUtMV0gPT0gMCk7CiAJCQlwLT52ZXJpZnlfYWxnW2RhdGFfc2l6ZS0xXSA9IDA7CiAKIAkJfSBlbHNlIC8qIGFwdiA+PSA4OSAqLyB7CiAJCQkvKiB3ZSBzdGlsbCBleHBlY3QgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncyAqLwogCQkJLyogYnV0IGp1c3QgaW4gY2FzZSBzb21lb25lIHRyaWVzIHRvIGJlIGV2aWwgKi8KLQkJCURfQVNTRVJUKHAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7Ci0JCQlEX0FTU0VSVChwLT5jc3Vtc19hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7CisJCQlEX0FTU0VSVChkZXZpY2UsIHAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPT0gMCk7CisJCQlEX0FTU0VSVChkZXZpY2UsIHAtPmNzdW1zX2FsZ1tTSEFSRURfU0VDUkVUX01BWC0xXSA9PSAwKTsKIAkJCXAtPnZlcmlmeV9hbGdbU0hBUkVEX1NFQ1JFVF9NQVgtMV0gPSAwOwogCQkJcC0+Y3N1bXNfYWxnW1NIQVJFRF9TRUNSRVRfTUFYLTFdID0gMDsKIAkJfQogCiAJCWlmIChzdHJjbXAob2xkX25ldF9jb25mLT52ZXJpZnlfYWxnLCBwLT52ZXJpZnlfYWxnKSkgewotCQkJaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7Ci0JCQkJZGV2X2VycihERVYsICJEaWZmZXJlbnQgdmVyaWZ5LWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAorCQkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJEaWZmZXJlbnQgdmVyaWZ5LWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAogCQkJCSAgICBvbGRfbmV0X2NvbmYtPnZlcmlmeV9hbGcsIHAtPnZlcmlmeV9hbGcpOwogCQkJCWdvdG8gZGlzY29ubmVjdDsKIAkJCX0KLQkJCXZlcmlmeV90Zm0gPSBkcmJkX2NyeXB0b19hbGxvY19kaWdlc3Rfc2FmZShtZGV2LAorCQkJdmVyaWZ5X3RmbSA9IGRyYmRfY3J5cHRvX2FsbG9jX2RpZ2VzdF9zYWZlKGRldmljZSwKIAkJCQkJcC0+dmVyaWZ5X2FsZywgInZlcmlmeS1hbGciKTsKIAkJCWlmIChJU19FUlIodmVyaWZ5X3RmbSkpIHsKIAkJCQl2ZXJpZnlfdGZtID0gTlVMTDsKQEAgLTM0MjIsMTIgKzM0NjksMTIgQEAKIAkJfQogCiAJCWlmIChhcHYgPj0gODkgJiYgc3RyY21wKG9sZF9uZXRfY29uZi0+Y3N1bXNfYWxnLCBwLT5jc3Vtc19hbGcpKSB7Ci0JCQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKLQkJCQlkZXZfZXJyKERFViwgIkRpZmZlcmVudCBjc3Vtcy1hbGcgc2V0dGluZ3MuIG1lPVwiJXNcIiBwZWVyPVwiJXNcIlxuIiwKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRGlmZmVyZW50IGNzdW1zLWFsZyBzZXR0aW5ncy4gbWU9XCIlc1wiIHBlZXI9XCIlc1wiXG4iLAogCQkJCSAgICBvbGRfbmV0X2NvbmYtPmNzdW1zX2FsZywgcC0+Y3N1bXNfYWxnKTsKIAkJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCQl9Ci0JCQljc3Vtc190Zm0gPSBkcmJkX2NyeXB0b19hbGxvY19kaWdlc3Rfc2FmZShtZGV2LAorCQkJY3N1bXNfdGZtID0gZHJiZF9jcnlwdG9fYWxsb2NfZGlnZXN0X3NhZmUoZGV2aWNlLAogCQkJCQlwLT5jc3Vtc19hbGcsICJjc3Vtcy1hbGciKTsKIAkJCWlmIChJU19FUlIoY3N1bXNfdGZtKSkgewogCQkJCWNzdW1zX3RmbSA9IE5VTEw7CkBAIC0zNDQyLDExICszNDg5LDExIEBACiAJCQluZXdfZGlza19jb25mLT5jX21heF9yYXRlID0gYmUzMl90b19jcHUocC0+Y19tYXhfcmF0ZSk7CiAKIAkJCWZpZm9fc2l6ZSA9IChuZXdfZGlza19jb25mLT5jX3BsYW5fYWhlYWQgKiAxMCAqIFNMRUVQX1RJTUUpIC8gSFo7Ci0JCQlpZiAoZmlmb19zaXplICE9IG1kZXYtPnJzX3BsYW5fcy0+c2l6ZSkgeworCQkJaWYgKGZpZm9fc2l6ZSAhPSBkZXZpY2UtPnJzX3BsYW5fcy0+c2l6ZSkgewogCQkJCW5ld19wbGFuID0gZmlmb19hbGxvYyhmaWZvX3NpemUpOwogCQkJCWlmICghbmV3X3BsYW4pIHsKLQkJCQkJZGV2X2VycihERVYsICJrbWFsbG9jIG9mIGZpZm9fYnVmZmVyIGZhaWxlZCIpOwotCQkJCQlwdXRfbGRldihtZGV2KTsKKwkJCQkJZHJiZF9lcnIoZGV2aWNlLCAia21hbGxvYyBvZiBmaWZvX2J1ZmZlciBmYWlsZWQiKTsKKwkJCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJCQkJZ290byBkaXNjb25uZWN0OwogCQkJCX0KIAkJCX0KQEAgLTM0NTUsNyArMzUwMiw3IEBACiAJCWlmICh2ZXJpZnlfdGZtIHx8IGNzdW1zX3RmbSkgewogCQkJbmV3X25ldF9jb25mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9jb25mKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW5ld19uZXRfY29uZikgewotCQkJCWRldl9lcnIoREVWLCAiQWxsb2NhdGlvbiBvZiBuZXcgbmV0X2NvbmYgZmFpbGVkXG4iKTsKKwkJCQlkcmJkX2VycihkZXZpY2UsICJBbGxvY2F0aW9uIG9mIG5ldyBuZXRfY29uZiBmYWlsZWRcbiIpOwogCQkJCWdvdG8gZGlzY29ubmVjdDsKIAkJCX0KIApAQCAtMzQ2NCwzMiArMzUxMSwzMiBAQAogCQkJaWYgKHZlcmlmeV90Zm0pIHsKIAkJCQlzdHJjcHkobmV3X25ldF9jb25mLT52ZXJpZnlfYWxnLCBwLT52ZXJpZnlfYWxnKTsKIAkJCQluZXdfbmV0X2NvbmYtPnZlcmlmeV9hbGdfbGVuID0gc3RybGVuKHAtPnZlcmlmeV9hbGcpICsgMTsKLQkJCQljcnlwdG9fZnJlZV9oYXNoKG1kZXYtPnRjb25uLT52ZXJpZnlfdGZtKTsKLQkJCQltZGV2LT50Y29ubi0+dmVyaWZ5X3RmbSA9IHZlcmlmeV90Zm07Ci0JCQkJZGV2X2luZm8oREVWLCAidXNpbmcgdmVyaWZ5LWFsZzogXCIlc1wiXG4iLCBwLT52ZXJpZnlfYWxnKTsKKwkJCQljcnlwdG9fZnJlZV9oYXNoKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT52ZXJpZnlfdGZtKTsKKwkJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+dmVyaWZ5X3RmbSA9IHZlcmlmeV90Zm07CisJCQkJZHJiZF9pbmZvKGRldmljZSwgInVzaW5nIHZlcmlmeS1hbGc6IFwiJXNcIlxuIiwgcC0+dmVyaWZ5X2FsZyk7CiAJCQl9CiAJCQlpZiAoY3N1bXNfdGZtKSB7CiAJCQkJc3RyY3B5KG5ld19uZXRfY29uZi0+Y3N1bXNfYWxnLCBwLT5jc3Vtc19hbGcpOwogCQkJCW5ld19uZXRfY29uZi0+Y3N1bXNfYWxnX2xlbiA9IHN0cmxlbihwLT5jc3Vtc19hbGcpICsgMTsKLQkJCQljcnlwdG9fZnJlZV9oYXNoKG1kZXYtPnRjb25uLT5jc3Vtc190Zm0pOwotCQkJCW1kZXYtPnRjb25uLT5jc3Vtc190Zm0gPSBjc3Vtc190Zm07Ci0JCQkJZGV2X2luZm8oREVWLCAidXNpbmcgY3N1bXMtYWxnOiBcIiVzXCJcbiIsIHAtPmNzdW1zX2FsZyk7CisJCQkJY3J5cHRvX2ZyZWVfaGFzaChwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwkJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtID0gY3N1bXNfdGZtOworCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJ1c2luZyBjc3Vtcy1hbGc6IFwiJXNcIlxuIiwgcC0+Y3N1bXNfYWxnKTsKIAkJCX0KLQkJCXJjdV9hc3NpZ25fcG9pbnRlcih0Y29ubi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoY29ubmVjdGlvbi0+bmV0X2NvbmYsIG5ld19uZXRfY29uZik7CiAJCX0KIAl9CiAKIAlpZiAobmV3X2Rpc2tfY29uZikgewotCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJaWYgKG5ld19wbGFuKSB7Ci0JCW9sZF9wbGFuID0gbWRldi0+cnNfcGxhbl9zOwotCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+cnNfcGxhbl9zLCBuZXdfcGxhbik7CisJCW9sZF9wbGFuID0gZGV2aWNlLT5yc19wbGFuX3M7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPnJzX3BsYW5fcywgbmV3X3BsYW4pOwogCX0KIAotCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJc3luY2hyb25pemVfcmN1KCk7CiAJaWYgKG5ld19uZXRfY29uZikKIAkJa2ZyZWUob2xkX25ldF9jb25mKTsKQEAgLTM1MDAsMzAgKzM1NDcsMzAgQEAKIAogcmVjb25uZWN0OgogCWlmIChuZXdfZGlza19jb25mKSB7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlrZnJlZShuZXdfZGlza19jb25mKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZtZGV2LT50Y29ubi0+Y29uZl91cGRhdGUpOworCW11dGV4X3VubG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKIAlyZXR1cm4gLUVJTzsKIAogZGlzY29ubmVjdDoKIAlrZnJlZShuZXdfcGxhbik7CiAJaWYgKG5ld19kaXNrX2NvbmYpIHsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWtmcmVlKG5ld19kaXNrX2NvbmYpOwogCX0KLQltdXRleF91bmxvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCS8qIGp1c3QgZm9yIGNvbXBsZXRlbmVzczogYWN0dWFsbHkgbm90IG5lZWRlZCwKIAkgKiBhcyB0aGlzIGlzIG5vdCByZWFjaGVkIGlmIGNzdW1zX3RmbSB3YXMgb2suICovCiAJY3J5cHRvX2ZyZWVfaGFzaChjc3Vtc190Zm0pOwogCS8qIGJ1dCBmcmVlIHRoZSB2ZXJpZnlfdGZtIGFnYWluLCBpZiBjc3Vtc190Zm0gZGlkIG5vdCB3b3JrIG91dCAqLwogCWNyeXB0b19mcmVlX2hhc2godmVyaWZ5X3RmbSk7Ci0JY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKKwljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCiAvKiB3YXJuIGlmIHRoZSBhcmd1bWVudHMgZGlmZmVyIGJ5IG1vcmUgdGhhbiAxMi41JSAqLwotc3RhdGljIHZvaWQgd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgdm9pZCB3YXJuX2lmX2RpZmZlcl9jb25zaWRlcmFibHkoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJY29uc3QgY2hhciAqcywgc2VjdG9yX3QgYSwgc2VjdG9yX3QgYikKIHsKIAlzZWN0b3JfdCBkOwpAQCAtMzUzMSw1NCArMzU3OCw1NiBAQAogCQlyZXR1cm47CiAJZCA9IChhID4gYikgPyAoYSAtIGIpIDogKGIgLSBhKTsKIAlpZiAoZCA+IChhPj4zKSB8fCBkID4gKGI+PjMpKQotCQlkZXZfd2FybihERVYsICJDb25zaWRlcmFibGUgZGlmZmVyZW5jZSBpbiAlczogJWxsdXMgdnMuICVsbHVzXG4iLCBzLAorCQlkcmJkX3dhcm4oZGV2aWNlLCAiQ29uc2lkZXJhYmxlIGRpZmZlcmVuY2UgaW4gJXM6ICVsbHVzIHZzLiAlbGx1c1xuIiwgcywKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWEsICh1bnNpZ25lZCBsb25nIGxvbmcpYik7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9zaXplcyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfc2l6ZXMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9zaXplcyAqcCA9IHBpLT5kYXRhOwogCWVudW0gZGV0ZXJtaW5lX2Rldl9zaXplIGRkID0gRFNfVU5DSEFOR0VEOwogCXNlY3Rvcl90IHBfc2l6ZSwgcF91c2l6ZSwgbXlfdXNpemU7CiAJaW50IGxkc2MgPSAwOyAvKiBsb2NhbCBkaXNrIHNpemUgY2hhbmdlZCAqLwogCWVudW0gZGRzX2ZsYWdzIGRkc2Y7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKLQkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZSh0Y29ubiwgcGkpOworCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQorCQlyZXR1cm4gY29uZmlnX3Vua25vd25fdm9sdW1lKGNvbm5lY3Rpb24sIHBpKTsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJcF9zaXplID0gYmU2NF90b19jcHUocC0+ZF9zaXplKTsKIAlwX3VzaXplID0gYmU2NF90b19jcHUocC0+dV9zaXplKTsKIAogCS8qIGp1c3Qgc3RvcmUgdGhlIHBlZXIncyBkaXNrIHNpemUgZm9yIG5vdy4KIAkgKiB3ZSBzdGlsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBhY2NlcHQgdGhhdC4gKi8KLQltZGV2LT5wX3NpemUgPSBwX3NpemU7CisJZGV2aWNlLT5wX3NpemUgPSBwX3NpemU7CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW15X3VzaXplID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPmRpc2tfc2l6ZTsKKwkJbXlfdXNpemUgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5kaXNrX3NpemU7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCXdhcm5faWZfZGlmZmVyX2NvbnNpZGVyYWJseShtZGV2LCAibG93ZXIgbGV2ZWwgZGV2aWNlIHNpemVzIiwKLQkJCSAgIHBfc2l6ZSwgZHJiZF9nZXRfbWF4X2NhcGFjaXR5KG1kZXYtPmxkZXYpKTsKLQkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KG1kZXYsICJ1c2VyIHJlcXVlc3RlZCBzaXplIiwKKwkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KGRldmljZSwgImxvd2VyIGxldmVsIGRldmljZSBzaXplcyIsCisJCQkgICBwX3NpemUsIGRyYmRfZ2V0X21heF9jYXBhY2l0eShkZXZpY2UtPmxkZXYpKTsKKwkJd2Fybl9pZl9kaWZmZXJfY29uc2lkZXJhYmx5KGRldmljZSwgInVzZXIgcmVxdWVzdGVkIHNpemUiLAogCQkJCQkgICAgcF91c2l6ZSwgbXlfdXNpemUpOwogCiAJCS8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNvbm5lY3QsIG9yIGFuIG90aGVyd2lzZSBleHBlY3RlZAogCQkgKiBwYXJhbSBleGNoYW5nZSwgY2hvb3NlIHRoZSBtaW5pbXVtICovCi0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpCiAJCQlwX3VzaXplID0gbWluX25vdF96ZXJvKG15X3VzaXplLCBwX3VzaXplKTsKIAogCQkvKiBOZXZlciBzaHJpbmsgYSBkZXZpY2Ugd2l0aCB1c2FibGUgZGF0YSBkdXJpbmcgY29ubmVjdC4KIAkJICAgQnV0IGFsbG93IG9ubGluZSBzaHJpbmtpbmcgaWYgd2UgYXJlIGNvbm5lY3RlZC4gKi8KLQkJaWYgKGRyYmRfbmV3X2Rldl9zaXplKG1kZXYsIG1kZXYtPmxkZXYsIHBfdXNpemUsIDApIDwKLQkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgJiYKLQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9PVVREQVRFRCAmJgotCQkgICAgbWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7Ci0JCQlkZXZfZXJyKERFViwgIlRoZSBwZWVyJ3MgZGlzayBzaXplIGlzIHRvbyBzbWFsbCFcbiIpOwotCQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQlpZiAoZHJiZF9uZXdfZGV2X3NpemUoZGV2aWNlLCBkZXZpY2UtPmxkZXYsIHBfdXNpemUsIDApIDwKKwkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KSAmJgorCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfT1VUREFURUQgJiYKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEKSB7CisJCQlkcmJkX2VycihkZXZpY2UsICJUaGUgcGVlcidzIGRpc2sgc2l6ZSBpcyB0b28gc21hbGwhXG4iKTsKKwkJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIApAQCAtMzU4NywxNDUgKzM2MzYsMTQ3IEBACiAKIAkJCW5ld19kaXNrX2NvbmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza19jb25mKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW5ld19kaXNrX2NvbmYpIHsKLQkJCQlkZXZfZXJyKERFViwgIkFsbG9jYXRpb24gb2YgbmV3IGRpc2tfY29uZiBmYWlsZWRcbiIpOwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCWRyYmRfZXJyKGRldmljZSwgIkFsbG9jYXRpb24gb2YgbmV3IGRpc2tfY29uZiBmYWlsZWRcbiIpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAKLQkJCW11dGV4X2xvY2soJm1kZXYtPnRjb25uLT5jb25mX3VwZGF0ZSk7Ci0JCQlvbGRfZGlza19jb25mID0gbWRldi0+bGRldi0+ZGlza19jb25mOworCQkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwkJCW9sZF9kaXNrX2NvbmYgPSBkZXZpY2UtPmxkZXYtPmRpc2tfY29uZjsKIAkJCSpuZXdfZGlza19jb25mID0gKm9sZF9kaXNrX2NvbmY7CiAJCQluZXdfZGlza19jb25mLT5kaXNrX3NpemUgPSBwX3VzaXplOwogCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobWRldi0+bGRldi0+ZGlza19jb25mLCBuZXdfZGlza19jb25mKTsKLQkJCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiwgbmV3X2Rpc2tfY29uZik7CisJCQltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPnJlc291cmNlLT5jb25mX3VwZGF0ZSk7CiAJCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAkJCWtmcmVlKG9sZF9kaXNrX2NvbmYpOwogCi0JCQlkZXZfaW5mbyhERVYsICJQZWVyIHNldHMgdV9zaXplIHRvICVsdSBzZWN0b3JzXG4iLAorCQkJZHJiZF9pbmZvKGRldmljZSwgIlBlZXIgc2V0cyB1X3NpemUgdG8gJWx1IHNlY3RvcnNcbiIsCiAJCQkJICh1bnNpZ25lZCBsb25nKW15X3VzaXplKTsKIAkJfQogCi0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCWRkc2YgPSBiZTE2X3RvX2NwdShwLT5kZHNfZmxhZ3MpOwotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKG1kZXYsIGRkc2YsIE5VTEwpOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkZCA9IGRyYmRfZGV0ZXJtaW5lX2Rldl9zaXplKGRldmljZSwgZGRzZiwgTlVMTCk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmIChkZCA9PSBEU19FUlJPUikKIAkJCXJldHVybiAtRUlPOwotCQlkcmJkX21kX3N5bmMobWRldik7CisJCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCX0gZWxzZSB7CiAJCS8qIEkgYW0gZGlza2xlc3MsIG5lZWQgdG8gYWNjZXB0IHRoZSBwZWVyJ3Mgc2l6ZS4gKi8KLQkJZHJiZF9zZXRfbXlfY2FwYWNpdHkobWRldiwgcF9zaXplKTsKKwkJZHJiZF9zZXRfbXlfY2FwYWNpdHkoZGV2aWNlLCBwX3NpemUpOwogCX0KIAotCW1kZXYtPnBlZXJfbWF4X2Jpb19zaXplID0gYmUzMl90b19jcHUocC0+bWF4X2Jpb19zaXplKTsKLQlkcmJkX3JlY29uc2lkZXJfbWF4X2Jpb19zaXplKG1kZXYpOworCWRldmljZS0+cGVlcl9tYXhfYmlvX3NpemUgPSBiZTMyX3RvX2NwdShwLT5tYXhfYmlvX3NpemUpOworCWRyYmRfcmVjb25zaWRlcl9tYXhfYmlvX3NpemUoZGV2aWNlKTsKIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlpZiAobWRldi0+bGRldi0+a25vd25fc2l6ZSAhPSBkcmJkX2dldF9jYXBhY2l0eShtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXYpKSB7Ci0JCQltZGV2LT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+bGRldi0+YmFja2luZ19iZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplICE9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+bGRldi0+YmFja2luZ19iZGV2KSkgeworCQkJZGV2aWNlLT5sZGV2LT5rbm93bl9zaXplID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXYpOwogCQkJbGRzYyA9IDE7CiAJCX0KIAotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA+IENfV0ZfUkVQT1JUX1BBUkFNUykgeworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPiBDX1dGX1JFUE9SVF9QQVJBTVMpIHsKIAkJaWYgKGJlNjRfdG9fY3B1KHAtPmNfc2l6ZSkgIT0KLQkJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikgfHwgbGRzYykgeworCQkgICAgZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpIHx8IGxkc2MpIHsKIAkJCS8qIHdlIGhhdmUgZGlmZmVyZW50IHNpemVzLCBwcm9iYWJseSBwZWVyCiAJCQkgKiBuZWVkcyB0byBrbm93IG15IG5ldyBzaXplLi4uICovCi0JCQlkcmJkX3NlbmRfc2l6ZXMobWRldiwgMCwgZGRzZik7CisJCQlkcmJkX3NlbmRfc2l6ZXMocGVlcl9kZXZpY2UsIDAsIGRkc2YpOwogCQl9Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVTSVpFX1BFTkRJTkcsICZtZGV2LT5mbGFncykgfHwKLQkJICAgIChkZCA9PSBEU19HUkVXICYmIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpKSB7Ci0JCQlpZiAobWRldi0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCAmJgotCQkJICAgIG1kZXYtPnN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRVNJWkVfUEVORElORywgJmRldmljZS0+ZmxhZ3MpIHx8CisJCSAgICAoZGQgPT0gRFNfR1JFVyAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpKSB7CisJCQlpZiAoZGV2aWNlLT5zdGF0ZS5wZHNrID49IERfSU5DT05TSVNURU5UICYmCisJCQkgICAgZGV2aWNlLT5zdGF0ZS5kaXNrID49IERfSU5DT05TSVNURU5UKSB7CiAJCQkJaWYgKGRkc2YgJiBERFNGX05PX1JFU1lOQykKLQkJCQkJZGV2X2luZm8oREVWLCAiUmVzeW5jIG9mIG5ldyBzdG9yYWdlIHN1cHByZXNzZWQgd2l0aCAtLWFzc3VtZS1jbGVhblxuIik7CisJCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXN5bmMgb2YgbmV3IHN0b3JhZ2Ugc3VwcHJlc3NlZCB3aXRoIC0tYXNzdW1lLWNsZWFuXG4iKTsKIAkJCQllbHNlCi0JCQkJCXJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhtZGV2KTsKKwkJCQkJcmVzeW5jX2FmdGVyX29ubGluZV9ncm93KGRldmljZSk7CiAJCQl9IGVsc2UKLQkJCQlzZXRfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZtZGV2LT5mbGFncyk7CisJCQkJc2V0X2JpdChSRVNZTkNfQUZURVJfTkVHLCAmZGV2aWNlLT5mbGFncyk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX3V1aWRzKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV91dWlkcyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX3V1aWRzICpwID0gcGktPmRhdGE7CiAJdTY0ICpwX3V1aWQ7CiAJaW50IGksIHVwZGF0ZWRfdXVpZHMgPSAwOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCi0JCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUodGNvbm4sIHBpKTsKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKKwkJcmV0dXJuIGNvbmZpZ191bmtub3duX3ZvbHVtZShjb25uZWN0aW9uLCBwaSk7CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXBfdXVpZCA9IGttYWxsb2Moc2l6ZW9mKHU2NCkqVUlfRVhURU5ERURfU0laRSwgR0ZQX05PSU8pOwogCWlmICghcF91dWlkKSB7Ci0JCWRldl9lcnIoREVWLCAia21hbGxvYyBvZiBwX3V1aWQgZmFpbGVkXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAia21hbGxvYyBvZiBwX3V1aWQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWZvciAoaSA9IFVJX0NVUlJFTlQ7IGkgPCBVSV9FWFRFTkRFRF9TSVpFOyBpKyspCiAJCXBfdXVpZFtpXSA9IGJlNjRfdG9fY3B1KHAtPnV1aWRbaV0pOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQltZGV2LT5wX3V1aWQgPSBwX3V1aWQ7CisJa2ZyZWUoZGV2aWNlLT5wX3V1aWQpOworCWRldmljZS0+cF91dWlkID0gcF91dWlkOwogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJgotCSAgICBtZGV2LT5zdGF0ZS5kaXNrIDwgRF9JTkNPTlNJU1RFTlQgJiYKLQkgICAgbWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgJiYKLQkgICAgKG1kZXYtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChwX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7Ci0JCWRldl9lcnIoREVWLCAiQ2FuIG9ubHkgY29ubmVjdCB0byBkYXRhIHdpdGggY3VycmVudCBVVUlEPSUwMTZsbFhcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW1kZXYtPmVkX3V1aWQpOwotCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJgorCSAgICBkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCAmJgorCSAgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZICYmCisJICAgIChkZXZpY2UtPmVkX3V1aWQgJiB+KCh1NjQpMSkpICE9IChwX3V1aWRbVUlfQ1VSUkVOVF0gJiB+KCh1NjQpMSkpKSB7CisJCWRyYmRfZXJyKGRldmljZSwgIkNhbiBvbmx5IGNvbm5lY3QgdG8gZGF0YSB3aXRoIGN1cnJlbnQgVVVJRD0lMDE2bGxYXG4iLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpY2UtPmVkX3V1aWQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgewogCQlpbnQgc2tpcF9pbml0aWFsX3N5bmMgPQotCQkJbWRldi0+c3RhdGUuY29ubiA9PSBDX0NPTk5FQ1RFRCAmJgotCQkJbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5MCAmJgotCQkJbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSA9PSBVVUlEX0pVU1RfQ1JFQVRFRCAmJgorCQkJZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQ09OTkVDVEVEICYmCisJCQlwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDkwICYmCisJCQlkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0gPT0gVVVJRF9KVVNUX0NSRUFURUQgJiYKIAkJCShwX3V1aWRbVUlfRkxBR1NdICYgOCk7CiAJCWlmIChza2lwX2luaXRpYWxfc3luYykgewotCQkJZGV2X2luZm8oREVWLCAiQWNjZXB0ZWQgbmV3IGN1cnJlbnQgVVVJRCwgcHJlcGFyaW5nIHRvIHNraXAgaW5pdGlhbCBzeW5jXG4iKTsKLQkJCWRyYmRfYml0bWFwX2lvKG1kZXYsICZkcmJkX2JtaW9fY2xlYXJfbl93cml0ZSwKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJBY2NlcHRlZCBuZXcgY3VycmVudCBVVUlELCBwcmVwYXJpbmcgdG8gc2tpcCBpbml0aWFsIHN5bmNcbiIpOworCQkJZHJiZF9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibWlvX2NsZWFyX25fd3JpdGUsCiAJCQkJCSJjbGVhcl9uX3dyaXRlIGZyb20gcmVjZWl2ZV91dWlkcyIsCiAJCQkJCUJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwotCQkJX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfQ1VSUkVOVCwgcF91dWlkW1VJX0NVUlJFTlRdKTsKLQkJCV9kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0JJVE1BUCwgMCk7Ci0JCQlfZHJiZF9zZXRfc3RhdGUoX05TMihtZGV2LCBkaXNrLCBEX1VQX1RPX0RBVEUsIHBkc2ssIERfVVBfVE9fREFURSksCisJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0NVUlJFTlQsIHBfdXVpZFtVSV9DVVJSRU5UXSk7CisJCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMCk7CisJCQlfZHJiZF9zZXRfc3RhdGUoX05TMihkZXZpY2UsIGRpc2ssIERfVVBfVE9fREFURSwgcGRzaywgRF9VUF9UT19EQVRFKSwKIAkJCQkJQ1NfVkVSQk9TRSwgTlVMTCk7Ci0JCQlkcmJkX21kX3N5bmMobWRldik7CisJCQlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAkJCXVwZGF0ZWRfdXVpZHMgPSAxOwogCQl9Ci0JCXB1dF9sZGV2KG1kZXYpOwotCX0gZWxzZSBpZiAobWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UICYmCi0JCSAgIG1kZXYtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CisJCXB1dF9sZGV2KGRldmljZSk7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPCBEX0lOQ09OU0lTVEVOVCAmJgorCQkgICBkZXZpY2UtPnN0YXRlLnJvbGUgPT0gUl9QUklNQVJZKSB7CiAJCS8qIEkgYW0gYSBkaXNrbGVzcyBwcmltYXJ5LCB0aGUgcGVlciBqdXN0IGNyZWF0ZWQgYSBuZXcgY3VycmVudCBVVUlECiAJCSAgIGZvciBtZS4gKi8KLQkJdXBkYXRlZF91dWlkcyA9IGRyYmRfc2V0X2VkX3V1aWQobWRldiwgcF91dWlkW1VJX0NVUlJFTlRdKTsKKwkJdXBkYXRlZF91dWlkcyA9IGRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBwX3V1aWRbVUlfQ1VSUkVOVF0pOwogCX0KIAogCS8qIEJlZm9yZSB3ZSB0ZXN0IGZvciB0aGUgZGlzayBzdGF0ZSwgd2Ugc2hvdWxkIHdhaXQgdW50aWwgYW4gZXZlbnR1YWxseQogCSAgIG9uZ29pbmcgY2x1c3RlciB3aWRlIHN0YXRlIGNoYW5nZSBpcyBmaW5pc2hlZC4gVGhhdCBpcyBpbXBvcnRhbnQgaWYKIAkgICB3ZSBhcmUgcHJpbWFyeSBhbmQgYXJlIGRldGFjaGluZyBmcm9tIG91ciBkaXNrLiBXZSBuZWVkIHRvIHNlZSB0aGUKIAkgICBuZXcgZGlzayBzdGF0ZS4uLiAqLwotCW11dGV4X2xvY2sobWRldi0+c3RhdGVfbXV0ZXgpOwotCW11dGV4X3VubG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7Ci0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPj0gQ19DT05ORUNURUQgJiYgbWRldi0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKQotCQl1cGRhdGVkX3V1aWRzIHw9IGRyYmRfc2V0X2VkX3V1aWQobWRldiwgcF91dWlkW1VJX0NVUlJFTlRdKTsKKwltdXRleF9sb2NrKGRldmljZS0+c3RhdGVfbXV0ZXgpOworCW11dGV4X3VubG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID49IENfQ09OTkVDVEVEICYmIGRldmljZS0+c3RhdGUuZGlzayA8IERfSU5DT05TSVNURU5UKQorCQl1cGRhdGVkX3V1aWRzIHw9IGRyYmRfc2V0X2VkX3V1aWQoZGV2aWNlLCBwX3V1aWRbVUlfQ1VSUkVOVF0pOwogCiAJaWYgKHVwZGF0ZWRfdXVpZHMpCi0JCWRyYmRfcHJpbnRfdXVpZHMobWRldiwgInJlY2VpdmVyIHVwZGF0ZWQgVVVJRHMgdG8iKTsKKwkJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJyZWNlaXZlciB1cGRhdGVkIFVVSURzIHRvIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM3NjEsMzggKzM4MTIsNDAgQEAKIAlyZXR1cm4gbXM7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9yZXFfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCByZWNlaXZlX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX3JlcV9zdGF0ZSAqcCA9IHBpLT5kYXRhOwogCXVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdmFsOwogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCiAJbWFzay5pID0gYmUzMl90b19jcHUocC0+bWFzayk7CiAJdmFsLmkgPSBiZTMyX3RvX2NwdShwLT52YWwpOwogCi0JaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmbWRldi0+dGNvbm4tPmZsYWdzKSAmJgotCSAgICBtdXRleF9pc19sb2NrZWQobWRldi0+c3RhdGVfbXV0ZXgpKSB7Ci0JCWRyYmRfc2VuZF9zcl9yZXBseShtZGV2LCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmZsYWdzKSAmJgorCSAgICBtdXRleF9pc19sb2NrZWQoZGV2aWNlLT5zdGF0ZV9tdXRleCkpIHsKKwkJZHJiZF9zZW5kX3NyX3JlcGx5KHBlZXJfZGV2aWNlLCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CiAJCXJldHVybiAwOwogCX0KIAogCW1hc2sgPSBjb252ZXJ0X3N0YXRlKG1hc2spOwogCXZhbCA9IGNvbnZlcnRfc3RhdGUodmFsKTsKIAotCXJ2ID0gZHJiZF9jaGFuZ2Vfc3RhdGUobWRldiwgQ1NfVkVSQk9TRSwgbWFzaywgdmFsKTsKLQlkcmJkX3NlbmRfc3JfcmVwbHkobWRldiwgcnYpOworCXJ2ID0gZHJiZF9jaGFuZ2Vfc3RhdGUoZGV2aWNlLCBDU19WRVJCT1NFLCBtYXNrLCB2YWwpOworCWRyYmRfc2VuZF9zcl9yZXBseShwZWVyX2RldmljZSwgcnYpOwogCi0JZHJiZF9tZF9zeW5jKG1kZXYpOworCWRyYmRfbWRfc3luYyhkZXZpY2UpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9yZXFfY29ubl9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfcmVxX2Nvbm5fc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGUgKnAgPSBwaS0+ZGF0YTsKIAl1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHZhbDsKQEAgLTM4MDEsNDYgKzM4NTQsNDggQEAKIAltYXNrLmkgPSBiZTMyX3RvX2NwdShwLT5tYXNrKTsKIAl2YWwuaSA9IGJlMzJfdG9fY3B1KHAtPnZhbCk7CiAKLQlpZiAodGVzdF9iaXQoUkVTT0xWRV9DT05GTElDVFMsICZ0Y29ubi0+ZmxhZ3MpICYmCi0JICAgIG11dGV4X2lzX2xvY2tlZCgmdGNvbm4tPmNzdGF0ZV9tdXRleCkpIHsKLQkJY29ubl9zZW5kX3NyX3JlcGx5KHRjb25uLCBTU19DT05DVVJSRU5UX1NUX0NIRyk7CisJaWYgKHRlc3RfYml0KFJFU09MVkVfQ09ORkxJQ1RTLCAmY29ubmVjdGlvbi0+ZmxhZ3MpICYmCisJICAgIG11dGV4X2lzX2xvY2tlZCgmY29ubmVjdGlvbi0+Y3N0YXRlX211dGV4KSkgeworCQljb25uX3NlbmRfc3JfcmVwbHkoY29ubmVjdGlvbiwgU1NfQ09OQ1VSUkVOVF9TVF9DSEcpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltYXNrID0gY29udmVydF9zdGF0ZShtYXNrKTsKIAl2YWwgPSBjb252ZXJ0X3N0YXRlKHZhbCk7CiAKLQlydiA9IGNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgbWFzaywgdmFsLCBDU19WRVJCT1NFIHwgQ1NfTE9DQUxfT05MWSB8IENTX0lHTl9PVVREX0ZBSUwpOwotCWNvbm5fc2VuZF9zcl9yZXBseSh0Y29ubiwgcnYpOworCXJ2ID0gY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSB8IENTX0xPQ0FMX09OTFkgfCBDU19JR05fT1VURF9GQUlMKTsKKwljb25uX3NlbmRfc3JfcmVwbHkoY29ubmVjdGlvbiwgcnYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9zdGF0ZSAqcCA9IHBpLT5kYXRhOwogCXVuaW9uIGRyYmRfc3RhdGUgb3MsIG5zLCBwZWVyX3N0YXRlOwogCWVudW0gZHJiZF9kaXNrX3N0YXRlIHJlYWxfcGVlcl9kaXNrOwogCWVudW0gY2hnX3N0YXRlX2ZsYWdzIGNzX2ZsYWdzOwogCWludCBydjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQotCQlyZXR1cm4gY29uZmlnX3Vua25vd25fdm9sdW1lKHRjb25uLCBwaSk7CisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCisJCXJldHVybiBjb25maWdfdW5rbm93bl92b2x1bWUoY29ubmVjdGlvbiwgcGkpOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKIAlwZWVyX3N0YXRlLmkgPSBiZTMyX3RvX2NwdShwLT5zdGF0ZSk7CiAKIAlyZWFsX3BlZXJfZGlzayA9IHBlZXJfc3RhdGUuZGlzazsKIAlpZiAocGVlcl9zdGF0ZS5kaXNrID09IERfTkVHT1RJQVRJTkcpIHsKLQkJcmVhbF9wZWVyX2Rpc2sgPSBtZGV2LT5wX3V1aWRbVUlfRkxBR1NdICYgNCA/IERfSU5DT05TSVNURU5UIDogRF9DT05TSVNURU5UOwotCQlkZXZfaW5mbyhERVYsICJyZWFsIHBlZXIgZGlzayBzdGF0ZSA9ICVzXG4iLCBkcmJkX2Rpc2tfc3RyKHJlYWxfcGVlcl9kaXNrKSk7CisJCXJlYWxfcGVlcl9kaXNrID0gZGV2aWNlLT5wX3V1aWRbVUlfRkxBR1NdICYgNCA/IERfSU5DT05TSVNURU5UIDogRF9DT05TSVNURU5UOworCQlkcmJkX2luZm8oZGV2aWNlLCAicmVhbCBwZWVyIGRpc2sgc3RhdGUgPSAlc1xuIiwgZHJiZF9kaXNrX3N0cihyZWFsX3BlZXJfZGlzaykpOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogIHJldHJ5OgotCW9zID0gbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCW9zID0gbnMgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCS8qIElmIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZSAoYXNlbmRlciB0aHJlYWQsIHRpbWVvdXQpCiAJICogYWxyZWFkeSBkZWNpZGVkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFnYWluLApAQCAtMzg3Miw4ICszOTI3LDggQEAKIAkJICogTWF5YmUgd2Ugc2hvdWxkIGZpbmlzaCBpdCB1cCwgdG9vPyAqLwogCQllbHNlIGlmIChvcy5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYKIAkJCSBwZWVyX3N0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQpIHsKLQkJCWlmIChkcmJkX2JtX3RvdGFsX3dlaWdodChtZGV2KSA8PSBtZGV2LT5yc19mYWlsZWQpCi0JCQkJZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJCQlpZiAoZHJiZF9ibV90b3RhbF93ZWlnaHQoZGV2aWNlKSA8PSBkZXZpY2UtPnJzX2ZhaWxlZCkKKwkJCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0zODgxLDggKzM5MzYsOCBAQAogCS8qIGV4cGxpY2l0IHZlcmlmeSBmaW5pc2hlZCBub3RpZmljYXRpb24sIHN0b3Agc2VjdG9yIHJlYWNoZWQuICovCiAJaWYgKG9zLmNvbm4gPT0gQ19WRVJJRllfVCAmJiBvcy5kaXNrID09IERfVVBfVE9fREFURSAmJgogCSAgICBwZWVyX3N0YXRlLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgcmVhbF9wZWVyX2Rpc2sgPT0gRF9VUF9UT19EQVRFKSB7Ci0JCW92X291dF9vZl9zeW5jX3ByaW50KG1kZXYpOwotCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKKwkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zOTAxLDggKzM5NTYsOCBAQAogCWlmIChwZWVyX3N0YXRlLmNvbm4gPT0gQ19BSEVBRCkKIAkJbnMuY29ubiA9IENfQkVISU5EOwogCi0JaWYgKG1kZXYtPnBfdXVpZCAmJiBwZWVyX3N0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyAmJgotCSAgICBnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX05FR09USUFUSU5HKSkgeworCWlmIChkZXZpY2UtPnBfdXVpZCAmJiBwZWVyX3N0YXRlLmRpc2sgPj0gRF9ORUdPVElBVElORyAmJgorCSAgICBnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CiAJCWludCBjcjsgLyogY29uc2lkZXIgcmVzeW5jICovCiAKIAkJLyogaWYgd2UgZXN0YWJsaXNoZWQgYSBuZXcgY29ubmVjdGlvbiAqLwpAQCAtMzkxNCw3ICszOTY5LDcgQEAKIAkJCW9zLmRpc2sgPT0gRF9ORUdPVElBVElORykpOwogCQkvKiBpZiB3ZSBoYXZlIGJvdGggYmVlbiBpbmNvbnNpc3RlbnQsIGFuZCB0aGUgcGVlciBoYXMgYmVlbgogCQkgKiBmb3JjZWQgdG8gYmUgVXBUb0RhdGUgd2l0aCAtLW92ZXJ3cml0ZS1kYXRhICovCi0JCWNyIHw9IHRlc3RfYml0KENPTlNJREVSX1JFU1lOQywgJm1kZXYtPmZsYWdzKTsKKwkJY3IgfD0gdGVzdF9iaXQoQ09OU0lERVJfUkVTWU5DLCAmZGV2aWNlLT5mbGFncyk7CiAJCS8qIGlmIHdlIGhhZCBiZWVuIHBsYWluIGNvbm5lY3RlZCwgYW5kIHRoZSBhZG1pbiByZXF1ZXN0ZWQgdG8KIAkJICogc3RhcnQgYSBzeW5jIGJ5ICJpbnZhbGlkYXRlIiBvciAiaW52YWxpZGF0ZS1yZW1vdGUiICovCiAJCWNyIHw9IChvcy5jb25uID09IENfQ09OTkVDVEVEICYmCkBAIC0zOTIyLDU1ICszOTc3LDU1IEBACiAJCQkJIHBlZXJfc3RhdGUuY29ubiA8PSBDX1dGX0JJVE1BUF9UKSk7CiAKIAkJaWYgKGNyKQotCQkJbnMuY29ubiA9IGRyYmRfc3luY19oYW5kc2hha2UobWRldiwgcGVlcl9zdGF0ZS5yb2xlLCByZWFsX3BlZXJfZGlzayk7CisJCQlucy5jb25uID0gZHJiZF9zeW5jX2hhbmRzaGFrZShwZWVyX2RldmljZSwgcGVlcl9zdGF0ZS5yb2xlLCByZWFsX3BlZXJfZGlzayk7CiAKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmIChucy5jb25uID09IENfTUFTSykgewogCQkJbnMuY29ubiA9IENfQ09OTkVDVEVEOwotCQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgewotCQkJCWRyYmRfZm9yY2Vfc3RhdGUobWRldiwgTlMoZGlzaywgRF9GQUlMRUQpKTsKKwkJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgeworCQkJCWRyYmRfZm9yY2Vfc3RhdGUoZGV2aWNlLCBOUyhkaXNrLCBEX0ZBSUxFRCkpOwogCQkJfSBlbHNlIGlmIChwZWVyX3N0YXRlLmRpc2sgPT0gRF9ORUdPVElBVElORykgewotCQkJCWRldl9lcnIoREVWLCAiRGlzayBhdHRhY2ggcHJvY2VzcyBvbiB0aGUgcGVlciBub2RlIHdhcyBhYm9ydGVkLlxuIik7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiRGlzayBhdHRhY2ggcHJvY2VzcyBvbiB0aGUgcGVlciBub2RlIHdhcyBhYm9ydGVkLlxuIik7CiAJCQkJcGVlcl9zdGF0ZS5kaXNrID0gRF9ESVNLTEVTUzsKIAkJCQlyZWFsX3BlZXJfZGlzayA9IERfRElTS0xFU1M7CiAJCQl9IGVsc2UgewotCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9EUllfUlVOLCAmbWRldi0+dGNvbm4tPmZsYWdzKSkKKwkJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fRFJZX1JVTiwgJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5mbGFncykpCiAJCQkJCXJldHVybiAtRUlPOwotCQkJCURfQVNTRVJUKG9zLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKTsKLQkJCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQkJCURfQVNTRVJUKGRldmljZSwgb3MuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMpOworCQkJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCX0KIAl9CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCWlmIChvcy5pICE9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KS5pKQorCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlpZiAob3MuaSAhPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKS5pKQogCQlnb3RvIHJldHJ5OwotCWNsZWFyX2JpdChDT05TSURFUl9SRVNZTkMsICZtZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KENPTlNJREVSX1JFU1lOQywgJmRldmljZS0+ZmxhZ3MpOwogCW5zLnBlZXIgPSBwZWVyX3N0YXRlLnJvbGU7CiAJbnMucGRzayA9IHJlYWxfcGVlcl9kaXNrOwogCW5zLnBlZXJfaXNwID0gKHBlZXJfc3RhdGUuYWZ0cl9pc3AgfCBwZWVyX3N0YXRlLnVzZXJfaXNwKTsKIAlpZiAoKG5zLmNvbm4gPT0gQ19DT05ORUNURUQgfHwgbnMuY29ubiA9PSBDX1dGX0JJVE1BUF9TKSAmJiBucy5kaXNrID09IERfTkVHT1RJQVRJTkcpCi0JCW5zLmRpc2sgPSBtZGV2LT5uZXdfc3RhdGVfdG1wLmRpc2s7CisJCW5zLmRpc2sgPSBkZXZpY2UtPm5ld19zdGF0ZV90bXAuZGlzazsKIAljc19mbGFncyA9IENTX1ZFUkJPU0UgKyAob3MuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLmNvbm4gPj0gQ19DT05ORUNURUQgPyAwIDogQ1NfSEFSRCk7Ci0JaWYgKG5zLnBkc2sgPT0gRF9DT05TSVNURU5UICYmIGRyYmRfc3VzcGVuZGVkKG1kZXYpICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgb3MuY29ubiA8IENfQ09OTkVDVEVEICYmCi0JICAgIHRlc3RfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKSkgeworCWlmIChucy5wZHNrID09IERfQ09OU0lTVEVOVCAmJiBkcmJkX3N1c3BlbmRlZChkZXZpY2UpICYmIG5zLmNvbm4gPT0gQ19DT05ORUNURUQgJiYgb3MuY29ubiA8IENfQ09OTkVDVEVEICYmCisJICAgIHRlc3RfYml0KE5FV19DVVJfVVVJRCwgJmRldmljZS0+ZmxhZ3MpKSB7CiAJCS8qIERvIG5vdCBhbGxvdyB0bF9yZXN0YXJ0KFJFU0VORCkgZm9yIGEgcmVib290ZWQgcGVlci4gV2UgY2FuIG9ubHkgYWxsb3cgdGhpcwogCQkgICBmb3IgdGVtcG9yYWwgbmV0d29yayBvdXRhZ2VzISAqLwotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JCWRldl9lcnIoREVWLCAiQWJvcnRpbmcgQ29ubmVjdCwgY2FuIG5vdCB0aGF3IElPIHdpdGggYW4gb25seSBDb25zaXN0ZW50IHBlZXJcbiIpOwotCQl0bF9jbGVhcihtZGV2LT50Y29ubik7Ci0JCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJY2xlYXJfYml0KE5FV19DVVJfVVVJRCwgJm1kZXYtPmZsYWdzKTsKLQkJY29ubl9yZXF1ZXN0X3N0YXRlKG1kZXYtPnRjb25uLCBOUzIoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiwgc3VzcCwgMCksIENTX0hBUkQpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiQWJvcnRpbmcgQ29ubmVjdCwgY2FuIG5vdCB0aGF3IElPIHdpdGggYW4gb25seSBDb25zaXN0ZW50IHBlZXJcbiIpOworCQl0bF9jbGVhcihwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CisJCWRyYmRfdXVpZF9uZXdfY3VycmVudChkZXZpY2UpOworCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmZGV2aWNlLT5mbGFncyk7CisJCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMyKGNvbm4sIENfUFJPVE9DT0xfRVJST1IsIHN1c3AsIDApLCBDU19IQVJEKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBjc19mbGFncywgTlVMTCk7Ci0JbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIGNzX2ZsYWdzLCBOVUxMKTsKKwlucyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewotCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTM5ODAsNDcgKzQwMzUsNDkgQEAKIAkJCS8qIHdlIHdhbnQgcmVzeW5jLCBwZWVyIGhhcyBub3QgeWV0IGRlY2lkZWQgdG8gc3luYy4uLiAqLwogCQkJLyogTm93YWRheXMgb25seSB1c2VkIHdoZW4gZm9yY2luZyBhIG5vZGUgaW50byBwcmltYXJ5IHJvbGUgYW5kCiAJCQkgICBzZXR0aW5nIGl0cyBkaXNrIHRvIFVwVG9EYXRlIHdpdGggdGhhdCAqLwotCQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOwotCQkJZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUobWRldik7CisJCQlkcmJkX3NlbmRfdXVpZHMocGVlcl9kZXZpY2UpOworCQkJZHJiZF9zZW5kX2N1cnJlbnRfc3RhdGUocGVlcl9kZXZpY2UpOwogCQl9CiAJfQogCi0JY2xlYXJfYml0KERJU0NBUkRfTVlfREFUQSwgJm1kZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRElTQ0FSRF9NWV9EQVRBLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkcmJkX21kX3N5bmMobWRldik7IC8qIHVwZGF0ZSBjb25uZWN0ZWQgaW5kaWNhdG9yLCBsYV9zaXplX3NlY3QsIC4uLiAqLworCWRyYmRfbWRfc3luYyhkZXZpY2UpOyAvKiB1cGRhdGUgY29ubmVjdGVkIGluZGljYXRvciwgbGFfc2l6ZV9zZWN0LCAuLi4gKi8KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlY2VpdmVfc3luY191dWlkKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9zeW5jX3V1aWQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9yc191dWlkICpwID0gcGktPmRhdGE7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LAotCQkgICBtZGV2LT5zdGF0ZS5jb25uID09IENfV0ZfU1lOQ19VVUlEIHx8Ci0JCSAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19CRUhJTkQgfHwKLQkJICAgbWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8Ci0JCSAgIG1kZXYtPnN0YXRlLmRpc2sgPCBEX05FR09USUFUSU5HKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LAorCQkgICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgfHwKKwkJICAgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfQkVISU5EIHx8CisJCSAgIGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVEIHx8CisJCSAgIGRldmljZS0+c3RhdGUuZGlzayA8IERfTkVHT1RJQVRJTkcpOwogCi0JLyogRF9BU1NFUlQoIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgKTsgKi8KKwkvKiBEX0FTU0VSVChkZXZpY2UsICBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19XRl9TWU5DX1VVSUQgKTsgKi8KIAogCS8qIEhlcmUgdGhlIF9kcmJkX3V1aWRfIGZ1bmN0aW9ucyBhcmUgcmlnaHQsIGN1cnJlbnQgc2hvdWxkCiAJICAgX25vdF8gYmUgcm90YXRlZCBpbnRvIHRoZSBoaXN0b3J5ICovCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKSB7Ci0JCV9kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0NVUlJFTlQsIGJlNjRfdG9fY3B1KHAtPnV1aWQpKTsKLQkJX2RyYmRfdXVpZF9zZXQobWRldiwgVUlfQklUTUFQLCAwVUwpOworCWlmIChnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgVUlfQ1VSUkVOVCwgYmU2NF90b19jcHUocC0+dXVpZCkpOworCQlfZHJiZF91dWlkX3NldChkZXZpY2UsIFVJX0JJVE1BUCwgMFVMKTsKIAotCQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJ1cGRhdGVkIHN5bmMgdXVpZCIpOwotCQlkcmJkX3N0YXJ0X3Jlc3luYyhtZGV2LCBDX1NZTkNfVEFSR0VUKTsKKwkJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJ1cGRhdGVkIHN5bmMgdXVpZCIpOworCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19UQVJHRVQpOwogCi0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0gZWxzZQotCQlkZXZfZXJyKERFViwgIklnbm9yaW5nIFN5bmNVVUlEIHBhY2tldCFcbiIpOworCQlkcmJkX2VycihkZXZpY2UsICJJZ25vcmluZyBTeW5jVVVJRCBwYWNrZXQhXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDAzMiwyNyArNDA4OSwyNyBAQAogICogY29kZSB1cG9uIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKLXJlY2VpdmVfYml0bWFwX3BsYWluKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuc2lnbmVkIGludCBzaXplLAorcmVjZWl2ZV9iaXRtYXBfcGxhaW4oc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJICAgICB1bnNpZ25lZCBsb25nICpwLCBzdHJ1Y3QgYm1feGZlcl9jdHggKmMpCiB7CiAJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0KLQkJCQkgZHJiZF9oZWFkZXJfc2l6ZShtZGV2LT50Y29ubik7CisJCQkJIGRyYmRfaGVhZGVyX3NpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24pOwogCXVuc2lnbmVkIGludCBudW1fd29yZHMgPSBtaW5fdChzaXplX3QsIGRhdGFfc2l6ZSAvIHNpemVvZigqcCksCiAJCQkJICAgICAgIGMtPmJtX3dvcmRzIC0gYy0+d29yZF9vZmZzZXQpOwogCXVuc2lnbmVkIGludCB3YW50ID0gbnVtX3dvcmRzICogc2l6ZW9mKCpwKTsKIAlpbnQgZXJyOwogCiAJaWYgKHdhbnQgIT0gc2l6ZSkgewotCQlkZXZfZXJyKERFViwgIiVzOndhbnQgKCV1KSAhPSBzaXplICgldSlcbiIsIF9fZnVuY19fLCB3YW50LCBzaXplKTsKKwkJZHJiZF9lcnIocGVlcl9kZXZpY2UsICIlczp3YW50ICgldSkgIT0gc2l6ZSAoJXUpXG4iLCBfX2Z1bmNfXywgd2FudCwgc2l6ZSk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAod2FudCA9PSAwKQogCQlyZXR1cm4gMDsKLQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCB3YW50KTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLCB3YW50KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZHJiZF9ibV9tZXJnZV9sZWwobWRldiwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CisJZHJiZF9ibV9tZXJnZV9sZWwocGVlcl9kZXZpY2UtPmRldmljZSwgYy0+d29yZF9vZmZzZXQsIG51bV93b3JkcywgcCk7CiAKIAljLT53b3JkX29mZnNldCArPSBudW1fd29yZHM7CiAJYy0+Yml0X29mZnNldCA9IGMtPndvcmRfb2Zmc2V0ICogQklUU19QRVJfTE9ORzsKQEAgLTQwODQsNyArNDE0MSw3IEBACiAgKiBjb2RlIHVwb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotcmVjdl9ibV9ybGVfYml0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorcmVjdl9ibV9ybGVfYml0cyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsCiAJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAsCiAJCSBzdHJ1Y3QgYm1feGZlcl9jdHggKmMsCiAJCSB1bnNpZ25lZCBpbnQgbGVuKQpAQCAtNDExMywxNCArNDE3MCwxNCBAQAogCQlpZiAodG9nZ2xlKSB7CiAJCQllID0gcyArIHJsIC0xOwogCQkJaWYgKGUgPj0gYy0+Ym1fYml0cykgewotCQkJCWRldl9lcnIoREVWLCAiYml0bWFwIG92ZXJmbG93IChlOiVsdSkgd2hpbGUgZGVjb2RpbmcgYm0gUkxFIHBhY2tldFxuIiwgZSk7CisJCQkJZHJiZF9lcnIocGVlcl9kZXZpY2UsICJiaXRtYXAgb3ZlcmZsb3cgKGU6JWx1KSB3aGlsZSBkZWNvZGluZyBibSBSTEUgcGFja2V0XG4iLCBlKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KLQkJCV9kcmJkX2JtX3NldF9iaXRzKG1kZXYsIHMsIGUpOworCQkJX2RyYmRfYm1fc2V0X2JpdHMocGVlcl9kZXZpY2UtPmRldmljZSwgcywgZSk7CiAJCX0KIAogCQlpZiAoaGF2ZSA8IGJpdHMpIHsKLQkJCWRldl9lcnIoREVWLCAiYml0bWFwIGRlY29kaW5nIGVycm9yOiBoOiVkIGI6JWQgbGE6MHglMDhsbHggbDoldS8ldVxuIiwKKwkJCWRyYmRfZXJyKHBlZXJfZGV2aWNlLCAiYml0bWFwIGRlY29kaW5nIGVycm9yOiBoOiVkIGI6JWQgbGE6MHglMDhsbHggbDoldS8ldVxuIiwKIAkJCQloYXZlLCBiaXRzLCBsb29rX2FoZWFkLAogCQkJCSh1bnNpZ25lZCBpbnQpKGJzLmN1ci5iIC0gcC0+Y29kZSksCiAJCQkJKHVuc2lnbmVkIGludClicy5idWZfbGVuKTsKQEAgLTQxNTMsMjggKzQyMTAsMjggQEAKICAqIGNvZGUgdXBvbiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1kZWNvZGVfYml0bWFwX2Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2RlY29kZV9iaXRtYXBfYyhzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsCiAJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAsCiAJCXN0cnVjdCBibV94ZmVyX2N0eCAqYywKIAkJdW5zaWduZWQgaW50IGxlbikKIHsKIAlpZiAoZGNicF9nZXRfY29kZShwKSA9PSBSTEVfVkxJX0JpdHMpCi0JCXJldHVybiByZWN2X2JtX3JsZV9iaXRzKG1kZXYsIHAsIGMsIGxlbiAtIHNpemVvZigqcCkpOworCQlyZXR1cm4gcmVjdl9ibV9ybGVfYml0cyhwZWVyX2RldmljZSwgcCwgYywgbGVuIC0gc2l6ZW9mKCpwKSk7CiAKIAkvKiBvdGhlciB2YXJpYW50cyBoYWQgYmVlbiBpbXBsZW1lbnRlZCBmb3IgZXZhbHVhdGlvbiwKIAkgKiBidXQgaGF2ZSBiZWVuIGRyb3BwZWQgYXMgdGhpcyBvbmUgdHVybmVkIG91dCB0byBiZSAiYmVzdCIKIAkgKiBkdXJpbmcgYWxsIG91ciB0ZXN0cy4gKi8KIAotCWRldl9lcnIoREVWLCAicmVjZWl2ZV9iaXRtYXBfYzogdW5rbm93biBlbmNvZGluZyAldVxuIiwgcC0+ZW5jb2RpbmcpOwotCWNvbm5fcmVxdWVzdF9zdGF0ZShtZGV2LT50Y29ubiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOworCWRyYmRfZXJyKHBlZXJfZGV2aWNlLCAicmVjZWl2ZV9iaXRtYXBfYzogdW5rbm93biBlbmNvZGluZyAldVxuIiwgcC0+ZW5jb2RpbmcpOworCWNvbm5fcmVxdWVzdF9zdGF0ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOwogCXJldHVybiAtRUlPOwogfQogCi12b2lkIElORk9fYm1feGZlcl9zdGF0cyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAordm9pZCBJTkZPX2JtX3hmZXJfc3RhdHMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCWNvbnN0IGNoYXIgKmRpcmVjdGlvbiwgc3RydWN0IGJtX3hmZXJfY3R4ICpjKQogewogCS8qIHdoYXQgd291bGQgaXQgdGFrZSB0byB0cmFuc2ZlciBpdCAicGxhaW50ZXh0IiAqLwotCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IGRyYmRfaGVhZGVyX3NpemUobWRldi0+dGNvbm4pOworCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IGRyYmRfaGVhZGVyX3NpemUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0gaGVhZGVyX3NpemU7CiAJdW5zaWduZWQgaW50IHBsYWluID0KIAkJaGVhZGVyX3NpemUgKiAoRElWX1JPVU5EX1VQKGMtPmJtX3dvcmRzLCBkYXRhX3NpemUpICsgMSkgKwpAQCAtNDE5OCw3ICs0MjU1LDcgQEAKIAkJciA9IDEwMDA7CiAKIAlyID0gMTAwMCAtIHI7Ci0JZGV2X2luZm8oREVWLCAiJXMgYml0bWFwIHN0YXRzIFtCeXRlcyhwYWNrZXRzKV06IHBsYWluICV1KCV1KSwgUkxFICV1KCV1KSwgIgorCWRyYmRfaW5mbyhkZXZpY2UsICIlcyBiaXRtYXAgc3RhdHMgW0J5dGVzKHBhY2tldHMpXTogcGxhaW4gJXUoJXUpLCBSTEUgJXUoJXUpLCAiCiAJICAgICAidG90YWwgJXU7IGNvbXByZXNzaW9uOiAldS4ldSUlXG4iLAogCQkJZGlyZWN0aW9uLAogCQkJYy0+Ynl0ZXNbMV0sIGMtPnBhY2tldHNbMV0sCkBAIC00MjE0LDEyOSArNDI3MSwxMzMgQEAKICAgIGluIG9yZGVyIHRvIGJlIGFnbm9zdGljIHRvIHRoZSAzMiB2cyA2NCBiaXRzIGlzc3VlLgogCiAgICByZXR1cm5zIDAgb24gZmFpbHVyZSwgMSBpZiB3ZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgaXQuICovCi1zdGF0aWMgaW50IHJlY2VpdmVfYml0bWFwKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9iaXRtYXAoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgYm1feGZlcl9jdHggYzsKIAlpbnQgZXJyOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlkcmJkX2JtX2xvY2sobWRldiwgInJlY2VpdmUgYml0bWFwIiwgQk1fTE9DS0VEX1NFVF9BTExPV0VEKTsKKwlkcmJkX2JtX2xvY2soZGV2aWNlLCAicmVjZWl2ZSBiaXRtYXAiLCBCTV9MT0NLRURfU0VUX0FMTE9XRUQpOwogCS8qIHlvdSBhcmUgc3VwcG9zZWQgdG8gc2VuZCBhZGRpdGlvbmFsIG91dC1vZi1zeW5jIGluZm9ybWF0aW9uCiAJICogaWYgeW91IGFjdHVhbGx5IHNldCBiaXRzIGR1cmluZyB0aGlzIHBoYXNlICovCiAKIAljID0gKHN0cnVjdCBibV94ZmVyX2N0eCkgewotCQkuYm1fYml0cyA9IGRyYmRfYm1fYml0cyhtZGV2KSwKLQkJLmJtX3dvcmRzID0gZHJiZF9ibV93b3JkcyhtZGV2KSwKKwkJLmJtX2JpdHMgPSBkcmJkX2JtX2JpdHMoZGV2aWNlKSwKKwkJLmJtX3dvcmRzID0gZHJiZF9ibV93b3JkcyhkZXZpY2UpLAogCX07CiAKIAlmb3IoOzspIHsKIAkJaWYgKHBpLT5jbWQgPT0gUF9CSVRNQVApCi0JCQllcnIgPSByZWNlaXZlX2JpdG1hcF9wbGFpbihtZGV2LCBwaS0+c2l6ZSwgcGktPmRhdGEsICZjKTsKKwkJCWVyciA9IHJlY2VpdmVfYml0bWFwX3BsYWluKHBlZXJfZGV2aWNlLCBwaS0+c2l6ZSwgcGktPmRhdGEsICZjKTsKIAkJZWxzZSBpZiAocGktPmNtZCA9PSBQX0NPTVBSRVNTRURfQklUTUFQKSB7CiAJCQkvKiBNQVlCRTogc2FuaXR5IGNoZWNrIHRoYXQgd2Ugc3BlYWsgcHJvdG8gPj0gOTAsCiAJCQkgKiBhbmQgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCEgKi8KIAkJCXN0cnVjdCBwX2NvbXByZXNzZWRfYm0gKnAgPSBwaS0+ZGF0YTsKIAotCQkJaWYgKHBpLT5zaXplID4gRFJCRF9TT0NLRVRfQlVGRkVSX1NJWkUgLSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKSkgewotCQkJCWRldl9lcnIoREVWLCAiUmVwb3J0Q0JpdG1hcCBwYWNrZXQgdG9vIGxhcmdlXG4iKTsKKwkJCWlmIChwaS0+c2l6ZSA+IERSQkRfU09DS0VUX0JVRkZFUl9TSVpFIC0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKSkgeworCQkJCWRyYmRfZXJyKGRldmljZSwgIlJlcG9ydENCaXRtYXAgcGFja2V0IHRvbyBsYXJnZVxuIik7CiAJCQkJZXJyID0gLUVJTzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlmIChwaS0+c2l6ZSA8PSBzaXplb2YoKnApKSB7Ci0JCQkJZGV2X2VycihERVYsICJSZXBvcnRDQml0bWFwIHBhY2tldCB0b28gc21hbGwgKGw6JXUpXG4iLCBwaS0+c2l6ZSk7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiUmVwb3J0Q0JpdG1hcCBwYWNrZXQgdG9vIHNtYWxsIChsOiV1KVxuIiwgcGktPnNpemUpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQllcnIgPSBkcmJkX3JlY3ZfYWxsKG1kZXYtPnRjb25uLCBwLCBwaS0+c2l6ZSk7CisJCQllcnIgPSBkcmJkX3JlY3ZfYWxsKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwLCBwaS0+c2l6ZSk7CiAJCQlpZiAoZXJyKQogCQkJICAgICAgIGdvdG8gb3V0OwotCQkJZXJyID0gZGVjb2RlX2JpdG1hcF9jKG1kZXYsIHAsICZjLCBwaS0+c2l6ZSk7CisJCQllcnIgPSBkZWNvZGVfYml0bWFwX2MocGVlcl9kZXZpY2UsIHAsICZjLCBwaS0+c2l6ZSk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfd2FybihERVYsICJyZWNlaXZlX2JpdG1hcDogY21kIG5laXRoZXIgUmVwb3J0Qml0TWFwIG5vciBSZXBvcnRDQml0TWFwIChpcyAweCV4KSIsIHBpLT5jbWQpOworCQkJZHJiZF93YXJuKGRldmljZSwgInJlY2VpdmVfYml0bWFwOiBjbWQgbmVpdGhlciBSZXBvcnRCaXRNYXAgbm9yIFJlcG9ydENCaXRNYXAgKGlzIDB4JXgpIiwgcGktPmNtZCk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQljLnBhY2tldHNbcGktPmNtZCA9PSBQX0JJVE1BUF0rKzsKLQkJYy5ieXRlc1twaS0+Y21kID09IFBfQklUTUFQXSArPSBkcmJkX2hlYWRlcl9zaXplKHRjb25uKSArIHBpLT5zaXplOworCQljLmJ5dGVzW3BpLT5jbWQgPT0gUF9CSVRNQVBdICs9IGRyYmRfaGVhZGVyX3NpemUoY29ubmVjdGlvbikgKyBwaS0+c2l6ZTsKIAogCQlpZiAoZXJyIDw9IDApIHsKIAkJCWlmIChlcnIgPCAwKQogCQkJCWdvdG8gb3V0OwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gZHJiZF9yZWN2X2hlYWRlcihtZGV2LT50Y29ubiwgcGkpOworCQllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLCBwaSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlJTkZPX2JtX3hmZXJfc3RhdHMobWRldiwgInJlY2VpdmUiLCAmYyk7CisJSU5GT19ibV94ZmVyX3N0YXRzKGRldmljZSwgInJlY2VpdmUiLCAmYyk7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9UKSB7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9UKSB7CiAJCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCQllcnIgPSBkcmJkX3NlbmRfYml0bWFwKG1kZXYpOworCQllcnIgPSBkcmJkX3NlbmRfYml0bWFwKGRldmljZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJLyogT21pdCBDU19PUkRFUkVEIHdpdGggdGhpcyBzdGF0ZSB0cmFuc2l0aW9uIHRvIGF2b2lkIGRlYWRsb2Nrcy4gKi8KLQkJcnYgPSBfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7Ci0JCURfQVNTRVJUKHJ2ID09IFNTX1NVQ0NFU1MpOwotCX0gZWxzZSBpZiAobWRldi0+c3RhdGUuY29ubiAhPSBDX1dGX0JJVE1BUF9TKSB7CisJCXJ2ID0gX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIE5TKGNvbm4sIENfV0ZfU1lOQ19VVUlEKSwgQ1NfVkVSQk9TRSk7CisJCURfQVNTRVJUKGRldmljZSwgcnYgPT0gU1NfU1VDQ0VTUyk7CisJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlLmNvbm4gIT0gQ19XRl9CSVRNQVBfUykgewogCQkvKiBhZG1pbiBtYXkgaGF2ZSByZXF1ZXN0ZWQgQ19ESVNDT05ORUNUSU5HLAogCQkgKiBvdGhlciB0aHJlYWRzIG1heSBoYXZlIG5vdGljZWQgbmV0d29yayBlcnJvcnMgKi8KLQkJZGV2X2luZm8oREVWLCAidW5leHBlY3RlZCBjc3RhdGUgKCVzKSBpbiByZWNlaXZlX2JpdG1hcFxuIiwKLQkJICAgIGRyYmRfY29ubl9zdHIobWRldi0+c3RhdGUuY29ubikpOworCQlkcmJkX2luZm8oZGV2aWNlLCAidW5leHBlY3RlZCBjc3RhdGUgKCVzKSBpbiByZWNlaXZlX2JpdG1hcFxuIiwKKwkJICAgIGRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAJfQogCWVyciA9IDA7CiAKICBvdXQ6Ci0JZHJiZF9ibV91bmxvY2sobWRldik7Ci0JaWYgKCFlcnIgJiYgbWRldi0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9TKQotCQlkcmJkX3N0YXJ0X3Jlc3luYyhtZGV2LCBDX1NZTkNfU09VUkNFKTsKKwlkcmJkX2JtX3VubG9jayhkZXZpY2UpOworCWlmICghZXJyICYmIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9TKQorCQlkcmJkX3N0YXJ0X3Jlc3luYyhkZXZpY2UsIENfU1lOQ19TT1VSQ0UpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcmVjZWl2ZV9za2lwKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9za2lwKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0JY29ubl93YXJuKHRjb25uLCAic2tpcHBpbmcgdW5rbm93biBvcHRpb25hbCBwYWNrZXQgdHlwZSAlZCwgbDogJWQhXG4iLAorCWRyYmRfd2Fybihjb25uZWN0aW9uLCAic2tpcHBpbmcgdW5rbm93biBvcHRpb25hbCBwYWNrZXQgdHlwZSAlZCwgbDogJWQhXG4iLAogCQkgcGktPmNtZCwgcGktPnNpemUpOwogCi0JcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KHRjb25uLCBwaSk7CisJcmV0dXJuIGlnbm9yZV9yZW1haW5pbmdfcGFja2V0KGNvbm5lY3Rpb24sIHBpKTsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX1VucGx1Z1JlbW90ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IHJlY2VpdmVfVW5wbHVnUmVtb3RlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7CiAJLyogTWFrZSBzdXJlIHdlJ3ZlIGFja2VkIGFsbCB0aGUgVENQIGRhdGEgYXNzb2NpYXRlZAogCSAqIHdpdGggdGhlIGRhdGEgcmVxdWVzdHMgYmVpbmcgdW5wbHVnZ2VkICovCi0JZHJiZF90Y3BfcXVpY2thY2sodGNvbm4tPmRhdGEuc29ja2V0KTsKKwlkcmJkX3RjcF9xdWlja2Fjayhjb25uZWN0aW9uLT5kYXRhLnNvY2tldCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWNlaXZlX291dF9vZl9zeW5jKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgcmVjZWl2ZV9vdXRfb2Zfc3luYyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBwX2Jsb2NrX2Rlc2MgKnAgPSBwaS0+ZGF0YTsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0Jc3dpdGNoIChtZGV2LT5zdGF0ZS5jb25uKSB7CisJc3dpdGNoIChkZXZpY2UtPnN0YXRlLmNvbm4pIHsKIAljYXNlIENfV0ZfU1lOQ19VVUlEOgogCWNhc2UgQ19XRl9CSVRNQVBfVDoKIAljYXNlIENfQkVISU5EOgogCQkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihERVYsICJBU1NFUlQgRkFJTEVEIGNzdGF0ZSA9ICVzLCBleHBlY3RlZDogV0ZTeW5jVVVJRHxXRkJpdE1hcFR8QmVoaW5kXG4iLAotCQkJCWRyYmRfY29ubl9zdHIobWRldi0+c3RhdGUuY29ubikpOworCQlkcmJkX2VycihkZXZpY2UsICJBU1NFUlQgRkFJTEVEIGNzdGF0ZSA9ICVzLCBleHBlY3RlZDogV0ZTeW5jVVVJRHxXRkJpdE1hcFR8QmVoaW5kXG4iLAorCQkJCWRyYmRfY29ubl9zdHIoZGV2aWNlLT5zdGF0ZS5jb25uKSk7CiAJfQogCi0JZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgYmU2NF90b19jcHUocC0+c2VjdG9yKSwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOworCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgYmU2NF90b19jcHUocC0+c2VjdG9yKSwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MzQ0LDcgKzQ0MDUsNyBAQAogc3RydWN0IGRhdGFfY21kIHsKIAlpbnQgZXhwZWN0X3BheWxvYWQ7CiAJc2l6ZV90IHBrdF9zaXplOwotCWludCAoKmZuKShzdHJ1Y3QgZHJiZF90Y29ubiAqLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CisJaW50ICgqZm4pKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHBhY2tldF9pbmZvICopOwogfTsKIAogc3RhdGljIHN0cnVjdCBkYXRhX2NtZCBkcmJkX2NtZF9oYW5kbGVyW10gPSB7CkBAIC00Mzc0LDQzICs0NDM1LDQzIEBACiAJW1BfUFJPVE9DT0xfVVBEQVRFXSA9IHsgMSwgc2l6ZW9mKHN0cnVjdCBwX3Byb3RvY29sKSwgcmVjZWl2ZV9wcm90b2NvbCB9LAogfTsKIAotc3RhdGljIHZvaWQgZHJiZGQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgZHJiZGQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJc2l6ZV90IHNoczsgLyogc3ViIGhlYWRlciBzaXplICovCiAJaW50IGVycjsKIAotCXdoaWxlIChnZXRfdF9zdGF0ZSgmdGNvbm4tPnJlY2VpdmVyKSA9PSBSVU5OSU5HKSB7CisJd2hpbGUgKGdldF90X3N0YXRlKCZjb25uZWN0aW9uLT5yZWNlaXZlcikgPT0gUlVOTklORykgewogCQlzdHJ1Y3QgZGF0YV9jbWQgKmNtZDsKIAotCQlkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoJnRjb25uLT5yZWNlaXZlcik7Ci0JCWlmIChkcmJkX3JlY3ZfaGVhZGVyKHRjb25uLCAmcGkpKQorCQlkcmJkX3RocmVhZF9jdXJyZW50X3NldF9jcHUoJmNvbm5lY3Rpb24tPnJlY2VpdmVyKTsKKwkJaWYgKGRyYmRfcmVjdl9oZWFkZXIoY29ubmVjdGlvbiwgJnBpKSkKIAkJCWdvdG8gZXJyX291dDsKIAogCQljbWQgPSAmZHJiZF9jbWRfaGFuZGxlcltwaS5jbWRdOwogCQlpZiAodW5saWtlbHkocGkuY21kID49IEFSUkFZX1NJWkUoZHJiZF9jbWRfaGFuZGxlcikgfHwgIWNtZC0+Zm4pKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgIlVuZXhwZWN0ZWQgZGF0YSBwYWNrZXQgJXMgKDB4JTA0eCkiLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIlVuZXhwZWN0ZWQgZGF0YSBwYWNrZXQgJXMgKDB4JTA0eCkiLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAogCQlzaHMgPSBjbWQtPnBrdF9zaXplOwogCQlpZiAocGkuc2l6ZSA+IHNocyAmJiAhY21kLT5leHBlY3RfcGF5bG9hZCkgewotCQkJY29ubl9lcnIodGNvbm4sICJObyBwYXlsb2FkIGV4cGVjdGVkICVzIGw6JWRcbiIsCisJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiTm8gcGF5bG9hZCBleHBlY3RlZCAlcyBsOiVkXG4iLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLnNpemUpOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAKIAkJaWYgKHNocykgewotCQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBwaS5kYXRhLCBzaHMpOworCQkJZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKGNvbm5lY3Rpb24sIHBpLmRhdGEsIHNocyk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyX291dDsKIAkJCXBpLnNpemUgLT0gc2hzOwogCQl9CiAKLQkJZXJyID0gY21kLT5mbih0Y29ubiwgJnBpKTsKKwkJZXJyID0gY21kLT5mbihjb25uZWN0aW9uLCAmcGkpOwogCQlpZiAoZXJyKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgImVycm9yIHJlY2VpdmluZyAlcywgZTogJWQgbDogJWQhXG4iLAorCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImVycm9yIHJlY2VpdmluZyAlcywgZTogJWQgbDogJWQhXG4iLAogCQkJCSBjbWRuYW1lKHBpLmNtZCksIGVyciwgcGkuc2l6ZSk7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KQEAgLTQ0MTgsMjcgKzQ0NzksMTYgQEAKIAlyZXR1cm47CiAKICAgICBlcnJfb3V0OgotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19QUk9UT0NPTF9FUlJPUiksIENTX0hBUkQpOworCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX1BST1RPQ09MX0VSUk9SKSwgQ1NfSEFSRCk7CiB9CiAKLXZvaWQgY29ubl9mbHVzaF93b3JrcXVldWUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIHZvaWQgY29ubl9kaXNjb25uZWN0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0Jc3RydWN0IGRyYmRfd3FfYmFycmllciBiYXJyOwotCi0JYmFyci53LmNiID0gd19wcmV2X3dvcmtfZG9uZTsKLQliYXJyLncudGNvbm4gPSB0Y29ubjsKLQlpbml0X2NvbXBsZXRpb24oJmJhcnIuZG9uZSk7Ci0JZHJiZF9xdWV1ZV93b3JrKCZ0Y29ubi0+c2VuZGVyX3dvcmssICZiYXJyLncpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJhcnIuZG9uZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5fZGlzY29ubmVjdChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCi17Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJZW51bSBkcmJkX2Nvbm5zIG9jOwogCWludCB2bnI7CiAKLQlpZiAodGNvbm4tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkUpCisJaWYgKGNvbm5lY3Rpb24tPmNzdGF0ZSA9PSBDX1NUQU5EQUxPTkUpCiAJCXJldHVybjsKIAogCS8qIFdlIGFyZSBhYm91dCB0byBzdGFydCB0aGUgY2xlYW51cCBhZnRlciBjb25uZWN0aW9uIGxvc3MuCkBAIC00NDQ2LDU0ICs0NDk2LDU2IEBACiAJICogVXN1YWxseSB3ZSBzaG91bGQgYmUgaW4gc29tZSBuZXR3b3JrIGZhaWx1cmUgc3RhdGUgYWxyZWFkeSwKIAkgKiBidXQganVzdCBpbiBjYXNlIHdlIGFyZSBub3QsIHdlIGZpeCBpdCB1cCBoZXJlLgogCSAqLwotCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ORVRXT1JLX0ZBSUxVUkUpLCBDU19IQVJEKTsKKwljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ORVRXT1JLX0ZBSUxVUkUpLCBDU19IQVJEKTsKIAogCS8qIGFzZW5kZXIgZG9lcyBub3QgY2xlYW4gdXAgYW55dGhpbmcuIGl0IG11c3Qgbm90IGludGVyZmVyZSwgZWl0aGVyICovCi0JZHJiZF90aHJlYWRfc3RvcCgmdGNvbm4tPmFzZW5kZXIpOwotCWRyYmRfZnJlZV9zb2NrKHRjb25uKTsKKwlkcmJkX3RocmVhZF9zdG9wKCZjb25uZWN0aW9uLT5hc2VuZGVyKTsKKwlkcmJkX2ZyZWVfc29jayhjb25uZWN0aW9uKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJa3JlZl9nZXQoJm1kZXYtPmtyZWYpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX2Rpc2Nvbm5lY3RlZChtZGV2KTsKLQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOworCQlkcmJkX2Rpc2Nvbm5lY3RlZChwZWVyX2RldmljZSk7CisJCWtyZWZfcHV0KCZkZXZpY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9kZXZpY2UpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZ0Y29ubi0+Y3VycmVudF9lcG9jaC0+bGlzdCkpCi0JCWNvbm5fZXJyKHRjb25uLCAiQVNTRVJUSU9OIEZBSUxFRDogdGNvbm4tPmN1cnJlbnRfZXBvY2gtPmxpc3Qgbm90IGVtcHR5XG4iKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNvbm5lY3Rpb24tPmN1cnJlbnRfZXBvY2gtPmxpc3QpKQorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiQVNTRVJUSU9OIEZBSUxFRDogY29ubmVjdGlvbi0+Y3VycmVudF9lcG9jaC0+bGlzdCBub3QgZW1wdHlcbiIpOwogCS8qIG9rLCBubyBtb3JlIGVlJ3Mgb24gdGhlIGZseSwgaXQgaXMgc2FmZSB0byByZXNldCB0aGUgZXBvY2hfc2l6ZSAqLwotCWF0b21pY19zZXQoJnRjb25uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplLCAwKTsKLQl0Y29ubi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQgPSBmYWxzZTsKKwlhdG9taWNfc2V0KCZjb25uZWN0aW9uLT5jdXJyZW50X2Vwb2NoLT5lcG9jaF9zaXplLCAwKTsKKwljb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IGZhbHNlOwogCi0JY29ubl9pbmZvKHRjb25uLCAiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOworCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOwogCi0JaWYgKGNvbm5faGlnaGVzdF9yb2xlKHRjb25uKSA9PSBSX1BSSU1BUlkgJiYgY29ubl9oaWdoZXN0X3Bkc2sodGNvbm4pID49IERfVU5LTk9XTikKLQkJY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKHRjb25uKTsKKwlpZiAoY29ubl9oaWdoZXN0X3JvbGUoY29ubmVjdGlvbikgPT0gUl9QUklNQVJZICYmIGNvbm5faGlnaGVzdF9wZHNrKGNvbm5lY3Rpb24pID49IERfVU5LTk9XTikKKwkJY29ubl90cnlfb3V0ZGF0ZV9wZWVyX2FzeW5jKGNvbm5lY3Rpb24pOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlvYyA9IHRjb25uLT5jc3RhdGU7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlvYyA9IGNvbm5lY3Rpb24tPmNzdGF0ZTsKIAlpZiAob2MgPj0gQ19VTkNPTk5FQ1RFRCkKLQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19VTkNPTk5FQ1RFRCksIENTX1ZFUkJPU0UpOworCQlfY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfVU5DT05ORUNURUQpLCBDU19WRVJCT1NFKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAKIAlpZiAob2MgPT0gQ19ESVNDT05ORUNUSU5HKQotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksIENTX1ZFUkJPU0UgfCBDU19IQVJEKTsKKwkJY29ubl9yZXF1ZXN0X3N0YXRlKGNvbm5lY3Rpb24sIE5TKGNvbm4sIENfU1RBTkRBTE9ORSksIENTX1ZFUkJPU0UgfCBDU19IQVJEKTsKIH0KIAotc3RhdGljIGludCBkcmJkX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBkcmJkX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXVuc2lnbmVkIGludCBpOwogCiAJLyogd2FpdCBmb3IgY3VycmVudCBhY3Rpdml0eSB0byBjZWFzZS4gKi8KLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShtZGV2LCAmbWRldi0+YWN0aXZlX2VlKTsKLQlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkobWRldiwgJm1kZXYtPnN5bmNfZWUpOwotCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShtZGV2LCAmbWRldi0+cmVhZF9lZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlfZHJiZF93YWl0X2VlX2xpc3RfZW1wdHkoZGV2aWNlLCAmZGV2aWNlLT5hY3RpdmVfZWUpOworCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShkZXZpY2UsICZkZXZpY2UtPnN5bmNfZWUpOworCV9kcmJkX3dhaXRfZWVfbGlzdF9lbXB0eShkZXZpY2UsICZkZXZpY2UtPnJlYWRfZWUpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJLyogV2UgZG8gbm90IGhhdmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgd291bGQgYWxsb3cgdXMgdG8KIAkgKiBnZXQgdGhlIHJzX3BlbmRpbmdfY250IGRvd24gdG8gMCBhZ2Fpbi4KQEAgLTQ1MDUsNDIgKzQ1NTcsNDIgQEAKIAkgKiAgcmVzeW5jX0xSVS4gVGhlIHJlc3luY19MUlUgdHJhY2tzIHRoZSB3aG9sZSBvcGVyYXRpb24gaW5jbHVkaW5nCiAJICogIHRoZSBkaXNrLUlPLCB3aGlsZSB0aGUgcnNfcGVuZGluZ19jbnQgb25seSB0cmFja3MgdGhlIGJsb2NrcwogCSAqICBvbiB0aGUgZmx5LiAqLwotCWRyYmRfcnNfY2FuY2VsX2FsbChtZGV2KTsKLQltZGV2LT5yc190b3RhbCA9IDA7Ci0JbWRldi0+cnNfZmFpbGVkID0gMDsKLQlhdG9taWNfc2V0KCZtZGV2LT5yc19wZW5kaW5nX2NudCwgMCk7Ci0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwlkcmJkX3JzX2NhbmNlbF9hbGwoZGV2aWNlKTsKKwlkZXZpY2UtPnJzX3RvdGFsID0gMDsKKwlkZXZpY2UtPnJzX2ZhaWxlZCA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCwgMCk7CisJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCi0JZGVsX3RpbWVyX3N5bmMoJm1kZXYtPnJlc3luY190aW1lcik7Ci0JcmVzeW5jX3RpbWVyX2ZuKCh1bnNpZ25lZCBsb25nKW1kZXYpOworCWRlbF90aW1lcl9zeW5jKCZkZXZpY2UtPnJlc3luY190aW1lcik7CisJcmVzeW5jX3RpbWVyX2ZuKCh1bnNpZ25lZCBsb25nKWRldmljZSk7CiAKIAkvKiB3YWl0IGZvciBhbGwgd19lX2VuZF9kYXRhX3JlcSwgd19lX2VuZF9yc2RhdGFfcmVxLCB3X3NlbmRfYmFycmllciwKIAkgKiB3X21ha2VfcmVzeW5jX3JlcXVlc3QgZXRjLiB3aGljaCBtYXkgc3RpbGwgYmUgb24gdGhlIHdvcmtlciBxdWV1ZQogCSAqIHRvIGJlICJjYW5jZWxlZCIgKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAotCWRyYmRfZmluaXNoX3BlZXJfcmVxcyhtZGV2KTsKKwlkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoZGV2aWNlKTsKIAogCS8qIFRoaXMgc2Vjb25kIHdvcmtxdWV1ZSBmbHVzaCBpcyBuZWNlc3NhcnksIHNpbmNlIGRyYmRfZmluaXNoX3BlZXJfcmVxcygpCiAJICAgbWlnaHQgaGF2ZSBpc3N1ZWQgYSB3b3JrIGFnYWluLiBUaGUgb25lIGJlZm9yZSBkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoKSBpcwogCSAgIG5lY2Vzc2FyeSB0byByZWNsYWluIG5ldF9lZSBpbiBkcmJkX2ZpbmlzaF9wZWVyX3JlcXMoKS4gKi8KLQlkcmJkX2ZsdXNoX3dvcmtxdWV1ZShtZGV2KTsKKwlkcmJkX2ZsdXNoX3dvcmtxdWV1ZSgmcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrKTsKIAogCS8qIG5lZWQgdG8gZG8gaXQgYWdhaW4sIGRyYmRfZmluaXNoX3BlZXJfcmVxcygpIG1heSBoYXZlIHBvcHVsYXRlZCBpdAogCSAqIGFnYWluIHZpYSBkcmJkX3RyeV9jbGVhcl9vbl9kaXNrX2JtKCkuICovCi0JZHJiZF9yc19jYW5jZWxfYWxsKG1kZXYpOworCWRyYmRfcnNfY2FuY2VsX2FsbChkZXZpY2UpOwogCi0Ja2ZyZWUobWRldi0+cF91dWlkKTsKLQltZGV2LT5wX3V1aWQgPSBOVUxMOworCWtmcmVlKGRldmljZS0+cF91dWlkKTsKKwlkZXZpY2UtPnBfdXVpZCA9IE5VTEw7CiAKLQlpZiAoIWRyYmRfc3VzcGVuZGVkKG1kZXYpKQotCQl0bF9jbGVhcihtZGV2LT50Y29ubik7CisJaWYgKCFkcmJkX3N1c3BlbmRlZChkZXZpY2UpKQorCQl0bF9jbGVhcihwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAKIAkvKiBzZXJpYWxpemUgd2l0aCBiaXRtYXAgd3JpdGVvdXQgdHJpZ2dlcmVkIGJ5IHRoZSBzdGF0ZSBjaGFuZ2UsCiAJICogaWYgYW55LiAqLwotCXdhaXRfZXZlbnQobWRldi0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmbWRldi0+ZmxhZ3MpKTsKKwl3YWl0X2V2ZW50KGRldmljZS0+bWlzY193YWl0LCAhdGVzdF9iaXQoQklUTUFQX0lPLCAmZGV2aWNlLT5mbGFncykpOwogCiAJLyogdGNwX2Nsb3NlIGFuZCByZWxlYXNlIG9mIHNlbmRwYWdlIHBhZ2VzIGNhbiBiZSBkZWZlcnJlZC4gIEkgZG9uJ3QKIAkgKiB3YW50IHRvIHVzZSBTT19MSU5HRVIsIGJlY2F1c2UgYXBwYXJlbnRseSBpdCBjYW4gYmUgZGVmZXJyZWQgZm9yCkBAIC00NTQ5LDIwICs0NjAxLDIwIEBACiAJICogQWN0dWFsbHkgd2UgZG9uJ3QgY2FyZSBmb3IgZXhhY3RseSB3aGVuIHRoZSBuZXR3b3JrIHN0YWNrIGRvZXMgaXRzCiAJICogcHV0X3BhZ2UoKSwgYnV0IHJlbGVhc2Ugb3VyIHJlZmVyZW5jZSBvbiB0aGVzZSBwYWdlcyByaWdodCBoZXJlLgogCSAqLwotCWkgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKG1kZXYsICZtZGV2LT5uZXRfZWUpOworCWkgPSBkcmJkX2ZyZWVfcGVlcl9yZXFzKGRldmljZSwgJmRldmljZS0+bmV0X2VlKTsKIAlpZiAoaSkKLQkJZGV2X2luZm8oREVWLCAibmV0X2VlIG5vdCBlbXB0eSwga2lsbGVkICV1IGVudHJpZXNcbiIsIGkpOwotCWkgPSBhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlX2J5X25ldCk7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJuZXRfZWUgbm90IGVtcHR5LCBraWxsZWQgJXUgZW50cmllc1xuIiwgaSk7CisJaSA9IGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZV9ieV9uZXQpOwogCWlmIChpKQotCQlkZXZfaW5mbyhERVYsICJwcF9pbl91c2VfYnlfbmV0ID0gJWQsIGV4cGVjdGVkIDBcbiIsIGkpOwotCWkgPSBhdG9taWNfcmVhZCgmbWRldi0+cHBfaW5fdXNlKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgInBwX2luX3VzZV9ieV9uZXQgPSAlZCwgZXhwZWN0ZWQgMFxuIiwgaSk7CisJaSA9IGF0b21pY19yZWFkKCZkZXZpY2UtPnBwX2luX3VzZSk7CiAJaWYgKGkpCi0JCWRldl9pbmZvKERFViwgInBwX2luX3VzZSA9ICVkLCBleHBlY3RlZCAwXG4iLCBpKTsKKwkJZHJiZF9pbmZvKGRldmljZSwgInBwX2luX3VzZSA9ICVkLCBleHBlY3RlZCAwXG4iLCBpKTsKIAotCURfQVNTRVJUKGxpc3RfZW1wdHkoJm1kZXYtPnJlYWRfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5hY3RpdmVfZWUpKTsKLQlEX0FTU0VSVChsaXN0X2VtcHR5KCZtZGV2LT5zeW5jX2VlKSk7Ci0JRF9BU1NFUlQobGlzdF9lbXB0eSgmbWRldi0+ZG9uZV9lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5yZWFkX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmFjdGl2ZV9lZSkpOworCURfQVNTRVJUKGRldmljZSwgbGlzdF9lbXB0eSgmZGV2aWNlLT5zeW5jX2VlKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBsaXN0X2VtcHR5KCZkZXZpY2UtPmRvbmVfZWUpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDU3NiwxOSArNDYyOCwxOSBAQAogICoKICAqIGZvciBub3csIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHplcm8sIGJ1dCBpZ25vcmVkLgogICovCi1zdGF0aWMgaW50IGRyYmRfc2VuZF9mZWF0dXJlcyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgaW50IGRyYmRfc2VuZF9mZWF0dXJlcyhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCXN0cnVjdCBkcmJkX3NvY2tldCAqc29jazsKIAlzdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzICpwOwogCi0Jc29jayA9ICZ0Y29ubi0+ZGF0YTsKLQlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spOworCXNvY2sgPSAmY29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CiAJcC0+cHJvdG9jb2xfbWluID0gY3B1X3RvX2JlMzIoUFJPX1ZFUlNJT05fTUlOKTsKIAlwLT5wcm90b2NvbF9tYXggPSBjcHVfdG9fYmUzMihQUk9fVkVSU0lPTl9NQVgpOwotCXJldHVybiBjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9DT05ORUNUSU9OX0ZFQVRVUkVTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKKwlyZXR1cm4gY29ubl9zZW5kX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jaywgUF9DT05ORUNUSU9OX0ZFQVRVUkVTLCBzaXplb2YoKnApLCBOVUxMLCAwKTsKIH0KIAogLyoKQEAgLTQ1OTgsMzYgKzQ2NTAsMzYgQEAKICAqICAtMSBwZWVyIHRhbGtzIGRpZmZlcmVudCBsYW5ndWFnZSwKICAqICAgICBubyBwb2ludCBpbiB0cnlpbmcgYWdhaW4sIHBsZWFzZSBnbyBzdGFuZGFsb25lLgogICovCi1zdGF0aWMgaW50IGRyYmRfZG9fZmVhdHVyZXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBkcmJkX2RvX2ZlYXR1cmVzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JLyogQVNTRVJUIGN1cnJlbnQgPT0gdGNvbm4tPnJlY2VpdmVyIC4uLiAqLworCS8qIEFTU0VSVCBjdXJyZW50ID09IGNvbm5lY3Rpb24tPnJlY2VpdmVyIC4uLiAqLwogCXN0cnVjdCBwX2Nvbm5lY3Rpb25fZmVhdHVyZXMgKnA7CiAJY29uc3QgaW50IGV4cGVjdCA9IHNpemVvZihzdHJ1Y3QgcF9jb25uZWN0aW9uX2ZlYXR1cmVzKTsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJaW50IGVycjsKIAotCWVyciA9IGRyYmRfc2VuZF9mZWF0dXJlcyh0Y29ubik7CisJZXJyID0gZHJiZF9zZW5kX2ZlYXR1cmVzKGNvbm5lY3Rpb24pOwogCWlmIChlcnIpCiAJCXJldHVybiAwOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIDA7CiAKIAlpZiAocGkuY21kICE9IFBfQ09OTkVDVElPTl9GRUFUVVJFUykgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIENvbm5lY3Rpb25GZWF0dXJlcyBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImV4cGVjdGVkIENvbm5lY3Rpb25GZWF0dXJlcyBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAocGkuc2l6ZSAhPSBleHBlY3QpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBDb25uZWN0aW9uRmVhdHVyZXMgbGVuZ3RoOiAldSwgcmVjZWl2ZWQ6ICV1XG4iLAorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQ29ubmVjdGlvbkZlYXR1cmVzIGxlbmd0aDogJXUsIHJlY2VpdmVkOiAldVxuIiwKIAkJICAgICBleHBlY3QsIHBpLnNpemUpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJcCA9IHBpLmRhdGE7Ci0JZXJyID0gZHJiZF9yZWN2X2FsbF93YXJuKHRjb25uLCBwLCBleHBlY3QpOworCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybihjb25uZWN0aW9uLCBwLCBleHBlY3QpOwogCWlmIChlcnIpCiAJCXJldHVybiAwOwogCkBAIC00NjQwLDE1ICs0NjkyLDE1IEBACiAJICAgIFBST19WRVJTSU9OX01JTiA+IHAtPnByb3RvY29sX21heCkKIAkJZ290byBpbmNvbXBhdDsKIAotCXRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPSBtaW5fdChpbnQsIFBST19WRVJTSU9OX01BWCwgcC0+cHJvdG9jb2xfbWF4KTsKKwljb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPSBtaW5fdChpbnQsIFBST19WRVJTSU9OX01BWCwgcC0+cHJvdG9jb2xfbWF4KTsKIAotCWNvbm5faW5mbyh0Y29ubiwgIkhhbmRzaGFrZSBzdWNjZXNzZnVsOiAiCi0JICAgICAiQWdyZWVkIG5ldHdvcmsgcHJvdG9jb2wgdmVyc2lvbiAlZFxuIiwgdGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbik7CisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJIYW5kc2hha2Ugc3VjY2Vzc2Z1bDogIgorCSAgICAgIkFncmVlZCBuZXR3b3JrIHByb3RvY29sIHZlcnNpb24gJWRcbiIsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbik7CiAKIAlyZXR1cm4gMTsKIAogIGluY29tcGF0OgotCWNvbm5fZXJyKHRjb25uLCAiaW5jb21wYXRpYmxlIERSQkQgZGlhbGVjdHM6ICIKKwlkcmJkX2Vycihjb25uZWN0aW9uLCAiaW5jb21wYXRpYmxlIERSQkQgZGlhbGVjdHM6ICIKIAkgICAgIkkgc3VwcG9ydCAlZC0lZCwgcGVlciBzdXBwb3J0cyAlZC0lZFxuIiwKIAkgICAgUFJPX1ZFUlNJT05fTUlOLCBQUk9fVkVSU0lPTl9NQVgsCiAJICAgIHAtPnByb3RvY29sX21pbiwgcC0+cHJvdG9jb2xfbWF4KTsKQEAgLTQ2NTYsMTAgKzQ3MDgsMTAgQEAKIH0KIAogI2lmICFkZWZpbmVkKENPTkZJR19DUllQVE9fSE1BQykgJiYgIWRlZmluZWQoQ09ORklHX0NSWVBUT19ITUFDX01PRFVMRSkKLXN0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBpbnQgZHJiZF9kb19hdXRoKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7Ci0JY29ubl9lcnIodGNvbm4sICJUaGlzIGtlcm5lbCB3YXMgYnVpbGQgd2l0aG91dCBDT05GSUdfQ1JZUFRPX0hNQUMuXG4iKTsKLQljb25uX2Vycih0Y29ubiwgIllvdSBuZWVkIHRvIGRpc2FibGUgJ2NyYW0taG1hYy1hbGcnIGluIGRyYmQuY29uZi5cbiIpOworCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJUaGlzIGtlcm5lbCB3YXMgYnVpbGQgd2l0aG91dCBDT05GSUdfQ1JZUFRPX0hNQUMuXG4iKTsKKwlkcmJkX2Vycihjb25uZWN0aW9uLCAiWW91IG5lZWQgdG8gZGlzYWJsZSAnY3JhbS1obWFjLWFsZycgaW4gZHJiZC5jb25mLlxuIik7CiAJcmV0dXJuIC0xOwogfQogI2Vsc2UKQEAgLTQ2NzEsNyArNDcyMyw3IEBACiAJLTEgLSBhdXRoIGZhaWxlZCwgZG9uJ3QgdHJ5IGFnYWluLgogKi8KIAotc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBkcmJkX2RvX2F1dGgoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAJY2hhciBteV9jaGFsbGVuZ2VbQ0hBTExFTkdFX0xFTl07ICAvKiA2NCBCeXRlcy4uLiAqLwpAQCAtNDY5MCw2OSArNDc0Miw2OSBAQAogCS8qIEZJWE1FOiBQdXQgdGhlIGNoYWxsZW5nZS9yZXNwb25zZSBpbnRvIHRoZSBwcmVhbGxvY2F0ZWQgc29ja2V0IGJ1ZmZlci4gICovCiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShjb25uZWN0aW9uLT5uZXRfY29uZik7CiAJa2V5X2xlbiA9IHN0cmxlbihuYy0+c2hhcmVkX3NlY3JldCk7CiAJbWVtY3B5KHNlY3JldCwgbmMtPnNoYXJlZF9zZWNyZXQsIGtleV9sZW4pOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JZGVzYy50Zm0gPSB0Y29ubi0+Y3JhbV9obWFjX3RmbTsKKwlkZXNjLnRmbSA9IGNvbm5lY3Rpb24tPmNyYW1faG1hY190Zm07CiAJZGVzYy5mbGFncyA9IDA7CiAKLQlydiA9IGNyeXB0b19oYXNoX3NldGtleSh0Y29ubi0+Y3JhbV9obWFjX3RmbSwgKHU4ICopc2VjcmV0LCBrZXlfbGVuKTsKKwlydiA9IGNyeXB0b19oYXNoX3NldGtleShjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtLCAodTggKilzZWNyZXQsIGtleV9sZW4pOwogCWlmIChydikgewotCQljb25uX2Vycih0Y29ubiwgImNyeXB0b19oYXNoX3NldGtleSgpIGZhaWxlZCB3aXRoICVkXG4iLCBydik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJjcnlwdG9faGFzaF9zZXRrZXkoKSBmYWlsZWQgd2l0aCAlZFxuIiwgcnYpOwogCQlydiA9IC0xOwogCQlnb3RvIGZhaWw7CiAJfQogCiAJZ2V0X3JhbmRvbV9ieXRlcyhteV9jaGFsbGVuZ2UsIENIQUxMRU5HRV9MRU4pOwogCi0Jc29jayA9ICZ0Y29ubi0+ZGF0YTsKLQlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKHRjb25uLCBzb2NrKSkgeworCXNvY2sgPSAmY29ubmVjdGlvbi0+ZGF0YTsKKwlpZiAoIWNvbm5fcHJlcGFyZV9jb21tYW5kKGNvbm5lY3Rpb24sIHNvY2spKSB7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KLQlydiA9ICFjb25uX3NlbmRfY29tbWFuZCh0Y29ubiwgc29jaywgUF9BVVRIX0NIQUxMRU5HRSwgMCwKKwlydiA9ICFjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBQX0FVVEhfQ0hBTExFTkdFLCAwLAogCQkJCW15X2NoYWxsZW5nZSwgQ0hBTExFTkdFX0xFTik7CiAJaWYgKCFydikKIAkJZ290byBmYWlsOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAlpZiAocGkuY21kICE9IFBfQVVUSF9DSEFMTEVOR0UpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBBdXRoQ2hhbGxlbmdlIHBhY2tldCwgcmVjZWl2ZWQ6ICVzICgweCUwNHgpXG4iLAorCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aENoYWxsZW5nZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAogCWlmIChwaS5zaXplID4gQ0hBTExFTkdFX0xFTiAqIDIpIHsKLQkJY29ubl9lcnIodGNvbm4sICJleHBlY3RlZCBBdXRoQ2hhbGxlbmdlIHBheWxvYWQgdG9vIGJpZy5cbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aENoYWxsZW5nZSBwYXlsb2FkIHRvbyBiaWcuXG4iKTsKIAkJcnYgPSAtMTsKIAkJZ290byBmYWlsOwogCX0KIAogCXBlZXJzX2NoID0ga21hbGxvYyhwaS5zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHBlZXJzX2NoID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHBlZXJzX2NoIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHBlZXJzX2NoIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4odGNvbm4sIHBlZXJzX2NoLCBwaS5zaXplKTsKKwllcnIgPSBkcmJkX3JlY3ZfYWxsX3dhcm4oY29ubmVjdGlvbiwgcGVlcnNfY2gsIHBpLnNpemUpOwogCWlmIChlcnIpIHsKIAkJcnYgPSAwOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmVzcF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZSh0Y29ubi0+Y3JhbV9obWFjX3RmbSk7CisJcmVzcF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShjb25uZWN0aW9uLT5jcmFtX2htYWNfdGZtKTsKIAlyZXNwb25zZSA9IGttYWxsb2MocmVzcF9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHJlc3BvbnNlID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHJlc3BvbnNlIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHJlc3BvbnNlIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00NzYyLDQwICs0ODE0LDQwIEBACiAKIAlydiA9IGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgJnNnLCBzZy5sZW5ndGgsIHJlc3BvbnNlKTsKIAlpZiAocnYpIHsKLQkJY29ubl9lcnIodGNvbm4sICJjcnlwdG9faGFzaF9kaWdlc3QoKSBmYWlsZWQgd2l0aCAlZFxuIiwgcnYpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiY3J5cHRvX2hhc2hfZGlnZXN0KCkgZmFpbGVkIHdpdGggJWRcbiIsIHJ2KTsKIAkJcnYgPSAtMTsKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICghY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spKSB7CisJaWYgKCFjb25uX3ByZXBhcmVfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrKSkgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9Ci0JcnYgPSAhY29ubl9zZW5kX2NvbW1hbmQodGNvbm4sIHNvY2ssIFBfQVVUSF9SRVNQT05TRSwgMCwKKwlydiA9ICFjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBQX0FVVEhfUkVTUE9OU0UsIDAsCiAJCQkJcmVzcG9uc2UsIHJlc3Bfc2l6ZSk7CiAJaWYgKCFydikKIAkJZ290byBmYWlsOwogCi0JZXJyID0gZHJiZF9yZWN2X2hlYWRlcih0Y29ubiwgJnBpKTsKKwllcnIgPSBkcmJkX3JlY3ZfaGVhZGVyKGNvbm5lY3Rpb24sICZwaSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAlpZiAocGkuY21kICE9IFBfQVVUSF9SRVNQT05TRSkgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYWNrZXQsIHJlY2VpdmVkOiAlcyAoMHglMDR4KVxuIiwKIAkJCSBjbWRuYW1lKHBpLmNtZCksIHBpLmNtZCk7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAogCWlmIChwaS5zaXplICE9IHJlc3Bfc2l6ZSkgewotCQljb25uX2Vycih0Y29ubiwgImV4cGVjdGVkIEF1dGhSZXNwb25zZSBwYXlsb2FkIG9mIHdyb25nIHNpemVcbiIpOworCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiZXhwZWN0ZWQgQXV0aFJlc3BvbnNlIHBheWxvYWQgb2Ygd3Jvbmcgc2l6ZVxuIik7CiAJCXJ2ID0gMDsKIAkJZ290byBmYWlsOwogCX0KIAotCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybih0Y29ubiwgcmVzcG9uc2UgLCByZXNwX3NpemUpOworCWVyciA9IGRyYmRfcmVjdl9hbGxfd2Fybihjb25uZWN0aW9uLCByZXNwb25zZSAsIHJlc3Bfc2l6ZSk7CiAJaWYgKGVycikgewogCQlydiA9IDA7CiAJCWdvdG8gZmFpbDsKQEAgLTQ4MDMsNyArNDg1NSw3IEBACiAKIAlyaWdodF9yZXNwb25zZSA9IGttYWxsb2MocmVzcF9zaXplLCBHRlBfTk9JTyk7CiAJaWYgKHJpZ2h0X3Jlc3BvbnNlID09IE5VTEwpIHsKLQkJY29ubl9lcnIodGNvbm4sICJrbWFsbG9jIG9mIHJpZ2h0X3Jlc3BvbnNlIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJrbWFsbG9jIG9mIHJpZ2h0X3Jlc3BvbnNlIGZhaWxlZFxuIik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00ODEyLDcgKzQ4NjQsNyBAQAogCiAJcnYgPSBjcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsICZzZywgc2cubGVuZ3RoLCByaWdodF9yZXNwb25zZSk7CiAJaWYgKHJ2KSB7Ci0JCWNvbm5fZXJyKHRjb25uLCAiY3J5cHRvX2hhc2hfZGlnZXN0KCkgZmFpbGVkIHdpdGggJWRcbiIsIHJ2KTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgImNyeXB0b19oYXNoX2RpZ2VzdCgpIGZhaWxlZCB3aXRoICVkXG4iLCBydik7CiAJCXJ2ID0gLTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00ODIwLDcgKzQ4NzIsNyBAQAogCXJ2ID0gIW1lbWNtcChyZXNwb25zZSwgcmlnaHRfcmVzcG9uc2UsIHJlc3Bfc2l6ZSk7CiAKIAlpZiAocnYpCi0JCWNvbm5faW5mbyh0Y29ubiwgIlBlZXIgYXV0aGVudGljYXRlZCB1c2luZyAlZCBieXRlcyBITUFDXG4iLAorCQlkcmJkX2luZm8oY29ubmVjdGlvbiwgIlBlZXIgYXV0aGVudGljYXRlZCB1c2luZyAlZCBieXRlcyBITUFDXG4iLAogCQkgICAgIHJlc3Bfc2l6ZSk7CiAJZWxzZQogCQlydiA9IC0xOwpAQCAtNDgzNCwxNjMgKzQ4ODYsMTY5IEBACiB9CiAjZW5kaWYKIAotaW50IGRyYmRkX2luaXQoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCitpbnQgZHJiZF9yZWNlaXZlcihzdHJ1Y3QgZHJiZF90aHJlYWQgKnRoaSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSB0aGktPnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSB0aGktPmNvbm5lY3Rpb247CiAJaW50IGg7CiAKLQljb25uX2luZm8odGNvbm4sICJyZWNlaXZlciAocmUpc3RhcnRlZFxuIik7CisJZHJiZF9pbmZvKGNvbm5lY3Rpb24sICJyZWNlaXZlciAocmUpc3RhcnRlZFxuIik7CiAKIAlkbyB7Ci0JCWggPSBjb25uX2Nvbm5lY3QodGNvbm4pOworCQloID0gY29ubl9jb25uZWN0KGNvbm5lY3Rpb24pOwogCQlpZiAoaCA9PSAwKSB7Ci0JCQljb25uX2Rpc2Nvbm5lY3QodGNvbm4pOworCQkJY29ubl9kaXNjb25uZWN0KGNvbm5lY3Rpb24pOwogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaKTsKIAkJfQogCQlpZiAoaCA9PSAtMSkgewotCQkJY29ubl93YXJuKHRjb25uLCAiRGlzY2FyZGluZyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uXG4iKTsKLQkJCWNvbm5fcmVxdWVzdF9zdGF0ZSh0Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIkRpc2NhcmRpbmcgbmV0d29yayBjb25maWd1cmF0aW9uLlxuIik7CisJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJCX0KIAl9IHdoaWxlIChoID09IDApOwogCiAJaWYgKGggPiAwKQotCQlkcmJkZCh0Y29ubik7CisJCWRyYmRkKGNvbm5lY3Rpb24pOwogCi0JY29ubl9kaXNjb25uZWN0KHRjb25uKTsKKwljb25uX2Rpc2Nvbm5lY3QoY29ubmVjdGlvbik7CiAKLQljb25uX2luZm8odGNvbm4sICJyZWNlaXZlciB0ZXJtaW5hdGVkXG4iKTsKKwlkcmJkX2luZm8oY29ubmVjdGlvbiwgInJlY2VpdmVyIHRlcm1pbmF0ZWRcbiIpOwogCXJldHVybiAwOwogfQogCiAvKiAqKioqKioqKiogYWNrbm93bGVkZ2Ugc2VuZGVyICoqKioqKioqICovCiAKLXN0YXRpYyBpbnQgZ290X2Nvbm5fUnFTUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfY29ubl9ScVNSZXBseShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXN0cnVjdCBwX3JlcV9zdGF0ZV9yZXBseSAqcCA9IHBpLT5kYXRhOwogCWludCByZXRjb2RlID0gYmUzMl90b19jcHUocC0+cmV0Y29kZSk7CiAKIAlpZiAocmV0Y29kZSA+PSBTU19TVUNDRVNTKSB7Ci0JCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJnRjb25uLT5mbGFncyk7CisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfT0tBWSwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAl9IGVsc2UgewotCQlzZXRfYml0KENPTk5fV0RfU1RfQ0hHX0ZBSUwsICZ0Y29ubi0+ZmxhZ3MpOwotCQljb25uX2Vycih0Y29ubiwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCisJCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfRkFJTCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCiAJCQkgZHJiZF9zZXRfc3RfZXJyX3N0cihyZXRjb2RlKSwgcmV0Y29kZSk7CiAJfQotCXdha2VfdXAoJnRjb25uLT5waW5nX3dhaXQpOworCXdha2VfdXAoJmNvbm5lY3Rpb24tPnBpbmdfd2FpdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfUnFTUmVwbHkoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfUnFTUmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9yZXFfc3RhdGVfcmVwbHkgKnAgPSBwaS0+ZGF0YTsKIAlpbnQgcmV0Y29kZSA9IGJlMzJfdG9fY3B1KHAtPnJldGNvZGUpOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQlpZiAodGVzdF9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmdGNvbm4tPmZsYWdzKSkgewotCQlEX0FTU0VSVCh0Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgMTAwKTsKLQkJcmV0dXJuIGdvdF9jb25uX1JxU1JlcGx5KHRjb25uLCBwaSk7CisJaWYgKHRlc3RfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJmNvbm5lY3Rpb24tPmZsYWdzKSkgeworCQlEX0FTU0VSVChkZXZpY2UsIGNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDEwMCk7CisJCXJldHVybiBnb3RfY29ubl9ScVNSZXBseShjb25uZWN0aW9uLCBwaSk7CiAJfQogCiAJaWYgKHJldGNvZGUgPj0gU1NfU1VDQ0VTUykgewotCQlzZXRfYml0KENMX1NUX0NIR19TVUNDRVNTLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KENMX1NUX0NIR19TVUNDRVNTLCAmZGV2aWNlLT5mbGFncyk7CiAJfSBlbHNlIHsKLQkJc2V0X2JpdChDTF9TVF9DSEdfRkFJTCwgJm1kZXYtPmZsYWdzKTsKLQkJZGV2X2VycihERVYsICJSZXF1ZXN0ZWQgc3RhdGUgY2hhbmdlIGZhaWxlZCBieSBwZWVyOiAlcyAoJWQpXG4iLAorCQlzZXRfYml0KENMX1NUX0NIR19GQUlMLCAmZGV2aWNlLT5mbGFncyk7CisJCWRyYmRfZXJyKGRldmljZSwgIlJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UgZmFpbGVkIGJ5IHBlZXI6ICVzICglZClcbiIsCiAJCQlkcmJkX3NldF9zdF9lcnJfc3RyKHJldGNvZGUpLCByZXRjb2RlKTsKIAl9Ci0Jd2FrZV91cCgmbWRldi0+c3RhdGVfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5zdGF0ZV93YWl0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdvdF9QaW5nKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X1Bpbmcoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlyZXR1cm4gZHJiZF9zZW5kX3BpbmdfYWNrKHRjb25uKTsKKwlyZXR1cm4gZHJiZF9zZW5kX3BpbmdfYWNrKGNvbm5lY3Rpb24pOwogCiB9CiAKLXN0YXRpYyBpbnQgZ290X1BpbmdBY2soc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfUGluZ0FjayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCS8qIHJlc3RvcmUgaWRsZSB0aW1lb3V0ICovCi0JdGNvbm4tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSB0Y29ubi0+bmV0X2NvbmYtPnBpbmdfaW50KkhaOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChHT1RfUElOR19BQ0ssICZ0Y29ubi0+ZmxhZ3MpKQotCQl3YWtlX3VwKCZ0Y29ubi0+cGluZ193YWl0KTsKKwljb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gY29ubmVjdGlvbi0+bmV0X2NvbmYtPnBpbmdfaW50KkhaOworCWlmICghdGVzdF9hbmRfc2V0X2JpdChHT1RfUElOR19BQ0ssICZjb25uZWN0aW9uLT5mbGFncykpCisJCXdha2VfdXAoJmNvbm5lY3Rpb24tPnBpbmdfd2FpdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfSXNJblN5bmMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfSXNJblN5bmMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCWludCBibGtzaXplID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAotCURfQVNTRVJUKG1kZXYtPnRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODkpOworCURfQVNTRVJUKGRldmljZSwgcGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA4OSk7CiAKLQl1cGRhdGVfcGVlcl9zZXEobWRldiwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOworCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIGJsa3NpemUpOworCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOworCQlkcmJkX3NldF9pbl9zeW5jKGRldmljZSwgc2VjdG9yLCBibGtzaXplKTsKIAkJLyogcnNfc2FtZV9jc3VtcyBpcyBzdXBwb3NlZCB0byBjb3VudCBpbiB1bml0cyBvZiBCTV9CTE9DS19TSVpFICovCi0JCW1kZXYtPnJzX3NhbWVfY3N1bSArPSAoYmxrc2l6ZSA+PiBCTV9CTE9DS19TSElGVCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlkZXZpY2UtPnJzX3NhbWVfY3N1bSArPSAoYmxrc2l6ZSA+PiBCTV9CTE9DS19TSElGVCk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQotCWRlY19yc19wZW5kaW5nKG1kZXYpOwotCWF0b21pY19hZGQoYmxrc2l6ZSA+PiA5LCAmbWRldi0+cnNfc2VjdF9pbik7CisJZGVjX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwlhdG9taWNfYWRkKGJsa3NpemUgPj4gOSwgJmRldmljZS0+cnNfc2VjdF9pbik7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdTY0IGlkLCBzZWN0b3JfdCBzZWN0b3IsCit2YWxpZGF0ZV9yZXFfY2hhbmdlX3JlcV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdTY0IGlkLCBzZWN0b3JfdCBzZWN0b3IsCiAJCQkgICAgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgY29uc3QgY2hhciAqZnVuYywKIAkJCSAgICAgIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwgYm9vbCBtaXNzaW5nX29rKQogewogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCi0Jc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQlyZXEgPSBmaW5kX3JlcXVlc3QobWRldiwgcm9vdCwgaWQsIHNlY3RvciwgbWlzc2luZ19vaywgZnVuYyk7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCXJlcSA9IGZpbmRfcmVxdWVzdChkZXZpY2UsIHJvb3QsIGlkLCBzZWN0b3IsIG1pc3Npbmdfb2ssIGZ1bmMpOwogCWlmICh1bmxpa2VseSghcmVxKSkgewotCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJX19yZXFfbW9kKHJlcSwgd2hhdCwgJm0pOwotCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAogCWlmIChtLmJpbykKLQkJY29tcGxldGVfbWFzdGVyX2JpbyhtZGV2LCAmbSk7CisJCWNvbXBsZXRlX21hc3Rlcl9iaW8oZGV2aWNlLCAmbSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X0Jsb2NrQWNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X0Jsb2NrQWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IHBfYmxvY2tfYWNrICpwID0gcGktPmRhdGE7CiAJc2VjdG9yX3Qgc2VjdG9yID0gYmU2NF90b19jcHUocC0+c2VjdG9yKTsKIAlpbnQgYmxrc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPmJsa3NpemUpOwogCWVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdDsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpIHsKLQkJZHJiZF9zZXRfaW5fc3luYyhtZGV2LCBzZWN0b3IsIGJsa3NpemUpOwotCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwkJZHJiZF9zZXRfaW5fc3luYyhkZXZpY2UsIHNlY3RvciwgYmxrc2l6ZSk7CisJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAlzd2l0Y2ggKHBpLT5jbWQpIHsKQEAgLTUwMTMsMzMgKzUwNzEsMzUgQEAKIAkJQlVHKCk7CiAJfQogCi0JcmV0dXJuIHZhbGlkYXRlX3JlcV9jaGFuZ2VfcmVxX3N0YXRlKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCi0JCQkJCSAgICAgJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBfX2Z1bmNfXywKKwlyZXR1cm4gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoZGV2aWNlLCBwLT5ibG9ja19pZCwgc2VjdG9yLAorCQkJCQkgICAgICZkZXZpY2UtPndyaXRlX3JlcXVlc3RzLCBfX2Z1bmNfXywKIAkJCQkJICAgICB3aGF0LCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ0FjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9OZWdBY2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCWludCBzaXplID0gYmUzMl90b19jcHUocC0+Ymxrc2l6ZSk7CiAJaW50IGVycjsKIAotCW1kZXYgPSB2bnJfdG9fbWRldih0Y29ubiwgcGktPnZucik7Ci0JaWYgKCFtZGV2KQorCXBlZXJfZGV2aWNlID0gY29ubl9wZWVyX2RldmljZShjb25uZWN0aW9uLCBwaS0+dm5yKTsKKwlpZiAoIXBlZXJfZGV2aWNlKQogCQlyZXR1cm4gLUVJTzsKKwlkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChwLT5ibG9ja19pZCA9PSBJRF9TWU5DRVIpIHsKLQkJZGVjX3JzX3BlbmRpbmcobWRldik7Ci0JCWRyYmRfcnNfZmFpbGVkX2lvKG1kZXYsIHNlY3Rvciwgc2l6ZSk7CisJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CisJCWRyYmRfcnNfZmFpbGVkX2lvKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZXJyID0gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUobWRldiwgcC0+YmxvY2tfaWQsIHNlY3RvciwKLQkJCQkJICAgICZtZGV2LT53cml0ZV9yZXF1ZXN0cywgX19mdW5jX18sCisJZXJyID0gdmFsaWRhdGVfcmVxX2NoYW5nZV9yZXFfc3RhdGUoZGV2aWNlLCBwLT5ibG9ja19pZCwgc2VjdG9yLAorCQkJCQkgICAgJmRldmljZS0+d3JpdGVfcmVxdWVzdHMsIF9fZnVuY19fLAogCQkJCQkgICAgTkVHX0FDS0VELCB0cnVlKTsKIAlpZiAoZXJyKSB7CiAJCS8qIFByb3RvY29sIEEgaGFzIG5vIFBfV1JJVEVfQUNLcywgYnV0IGhhcyBQX05FR19BQ0tzLgpAQCAtNTA0Nyw4MCArNTEwNyw4NiBAQAogCQkgICByZXF1ZXN0IGlzIG5vIGxvbmdlciBpbiB0aGUgY29sbGlzaW9uIGhhc2guICovCiAJCS8qIEluIFByb3RvY29sIEIgd2UgbWlnaHQgYWxyZWFkeSBoYXZlIGdvdCBhIFBfUkVDVl9BQ0sKIAkJICAgYnV0IHRoZW4gZ2V0IGEgUF9ORUdfQUNLIGFmdGVyd2FyZHMuICovCi0JCWRyYmRfc2V0X291dF9vZl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSk7CisJCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ0RSZXBseShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9OZWdEUmVwbHkoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKIAlzZWN0b3JfdCBzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKLQl1cGRhdGVfcGVlcl9zZXEobWRldiwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOworCXVwZGF0ZV9wZWVyX3NlcShwZWVyX2RldmljZSwgYmUzMl90b19jcHUocC0+c2VxX251bSkpOwogCi0JZGV2X2VycihERVYsICJHb3QgTmVnRFJlcGx5OyBTZWN0b3IgJWxsdXMsIGxlbiAldS5cbiIsCisJZHJiZF9lcnIoZGV2aWNlLCAiR290IE5lZ0RSZXBseTsgU2VjdG9yICVsbHVzLCBsZW4gJXUuXG4iLAogCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgYmUzMl90b19jcHUocC0+Ymxrc2l6ZSkpOwogCi0JcmV0dXJuIHZhbGlkYXRlX3JlcV9jaGFuZ2VfcmVxX3N0YXRlKG1kZXYsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCi0JCQkJCSAgICAgJm1kZXYtPnJlYWRfcmVxdWVzdHMsIF9fZnVuY19fLAorCXJldHVybiB2YWxpZGF0ZV9yZXFfY2hhbmdlX3JlcV9zdGF0ZShkZXZpY2UsIHAtPmJsb2NrX2lkLCBzZWN0b3IsCisJCQkJCSAgICAgJmRldmljZS0+cmVhZF9yZXF1ZXN0cywgX19mdW5jX18sCiAJCQkJCSAgICAgTkVHX0FDS0VELCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ290X05lZ1JTRFJlcGx5KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKK3N0YXRpYyBpbnQgZ290X05lZ1JTRFJlcGx5KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2U7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCWludCBzaXplOwogCXN0cnVjdCBwX2Jsb2NrX2FjayAqcCA9IHBpLT5kYXRhOwogCi0JbWRldiA9IHZucl90b19tZGV2KHRjb25uLCBwaS0+dm5yKTsKLQlpZiAoIW1kZXYpCisJcGVlcl9kZXZpY2UgPSBjb25uX3BlZXJfZGV2aWNlKGNvbm5lY3Rpb24sIHBpLT52bnIpOworCWlmICghcGVlcl9kZXZpY2UpCiAJCXJldHVybiAtRUlPOworCWRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAKIAlzZWN0b3IgPSBiZTY0X3RvX2NwdShwLT5zZWN0b3IpOwogCXNpemUgPSBiZTMyX3RvX2NwdShwLT5ibGtzaXplKTsKIAotCXVwZGF0ZV9wZWVyX3NlcShtZGV2LCBiZTMyX3RvX2NwdShwLT5zZXFfbnVtKSk7CisJdXBkYXRlX3BlZXJfc2VxKHBlZXJfZGV2aWNlLCBiZTMyX3RvX2NwdShwLT5zZXFfbnVtKSk7CiAKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JaWYgKGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfRkFJTEVEKSkgewotCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIHNlY3Rvcik7CisJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOwogCQlzd2l0Y2ggKHBpLT5jbWQpIHsKIAkJY2FzZSBQX05FR19SU19EUkVQTFk6Ci0JCQlkcmJkX3JzX2ZhaWxlZF9pbyhtZGV2LCBzZWN0b3IsIHNpemUpOworCQkJZHJiZF9yc19mYWlsZWRfaW8oZGV2aWNlLCBzZWN0b3IsIHNpemUpOwogCQljYXNlIFBfUlNfQ0FOQ0VMOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfQmFycmllckFjayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCitzdGF0aWMgaW50IGdvdF9CYXJyaWVyQWNrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBwYWNrZXRfaW5mbyAqcGkpCiB7CiAJc3RydWN0IHBfYmFycmllcl9hY2sgKnAgPSBwaS0+ZGF0YTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCi0JdGxfcmVsZWFzZSh0Y29ubiwgcC0+YmFycmllciwgYmUzMl90b19jcHUocC0+c2V0X3NpemUpKTsKKwl0bF9yZWxlYXNlKGNvbm5lY3Rpb24sIHAtPmJhcnJpZXIsIGJlMzJfdG9fY3B1KHAtPnNldF9zaXplKSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWlmIChtZGV2LT5zdGF0ZS5jb25uID09IENfQUhFQUQgJiYKLQkJICAgIGF0b21pY19yZWFkKCZtZGV2LT5hcF9pbl9mbGlnaHQpID09IDAgJiYKLQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQltZGV2LT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKLQkJCWFkZF90aW1lcigmbWRldi0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisKKwkJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0FIRUFEICYmCisJCSAgICBhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9pbl9mbGlnaHQpID09IDAgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmZGV2aWNlLT5mbGFncykpIHsKKwkJCWRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCQlhZGRfdGltZXIoJmRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKIAkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTUxMjgsOTAgKzUxOTQsOTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnb3RfT1ZSZXN1bHQoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3RfT1ZSZXN1bHQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IHBhY2tldF9pbmZvICpwaSkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgcF9ibG9ja19hY2sgKnAgPSBwaS0+ZGF0YTsKLQlzdHJ1Y3QgZHJiZF93b3JrICp3OworCXN0cnVjdCBkcmJkX2RldmljZV93b3JrICpkdzsKIAlzZWN0b3JfdCBzZWN0b3I7CiAJaW50IHNpemU7CiAKLQltZGV2ID0gdm5yX3RvX21kZXYodGNvbm4sIHBpLT52bnIpOwotCWlmICghbWRldikKKwlwZWVyX2RldmljZSA9IGNvbm5fcGVlcl9kZXZpY2UoY29ubmVjdGlvbiwgcGktPnZucik7CisJaWYgKCFwZWVyX2RldmljZSkKIAkJcmV0dXJuIC1FSU87CisJZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKIAogCXNlY3RvciA9IGJlNjRfdG9fY3B1KHAtPnNlY3Rvcik7CiAJc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPmJsa3NpemUpOwogCi0JdXBkYXRlX3BlZXJfc2VxKG1kZXYsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKKwl1cGRhdGVfcGVlcl9zZXEocGVlcl9kZXZpY2UsIGJlMzJfdG9fY3B1KHAtPnNlcV9udW0pKTsKIAogCWlmIChiZTY0X3RvX2NwdShwLT5ibG9ja19pZCkgPT0gSURfT1VUX09GX1NZTkMpCi0JCWRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQobWRldiwgc2VjdG9yLCBzaXplKTsKKwkJZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChkZXZpY2UsIHNlY3Rvciwgc2l6ZSk7CiAJZWxzZQotCQlvdl9vdXRfb2Zfc3luY19wcmludChtZGV2KTsKKwkJb3Zfb3V0X29mX3N5bmNfcHJpbnQoZGV2aWNlKTsKIAotCWlmICghZ2V0X2xkZXYobWRldikpCisJaWYgKCFnZXRfbGRldihkZXZpY2UpKQogCQlyZXR1cm4gMDsKIAotCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKLQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgc2VjdG9yKTsKKwlkZWNfcnNfcGVuZGluZyhkZXZpY2UpOwogCi0JLS1tZGV2LT5vdl9sZWZ0OworCS0tZGV2aWNlLT5vdl9sZWZ0OwogCiAJLyogbGV0J3MgYWR2YW5jZSBwcm9ncmVzcyBzdGVwIG1hcmtzIG9ubHkgZm9yIGV2ZXJ5IG90aGVyIG1lZ2FieXRlICovCi0JaWYgKChtZGV2LT5vdl9sZWZ0ICYgMHgyMDApID09IDB4MjAwKQotCQlkcmJkX2FkdmFuY2VfcnNfbWFya3MobWRldiwgbWRldi0+b3ZfbGVmdCk7CisJaWYgKChkZXZpY2UtPm92X2xlZnQgJiAweDIwMCkgPT0gMHgyMDApCisJCWRyYmRfYWR2YW5jZV9yc19tYXJrcyhkZXZpY2UsIGRldmljZS0+b3ZfbGVmdCk7CiAKLQlpZiAobWRldi0+b3ZfbGVmdCA9PSAwKSB7Ci0JCXcgPSBrbWFsbG9jKHNpemVvZigqdyksIEdGUF9OT0lPKTsKLQkJaWYgKHcpIHsKLQkJCXctPmNiID0gd19vdl9maW5pc2hlZDsKLQkJCXctPm1kZXYgPSBtZGV2OwotCQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssIHcpOworCWlmIChkZXZpY2UtPm92X2xlZnQgPT0gMCkgeworCQlkdyA9IGttYWxsb2Moc2l6ZW9mKCpkdyksIEdGUF9OT0lPKTsKKwkJaWYgKGR3KSB7CisJCQlkdy0+dy5jYiA9IHdfb3ZfZmluaXNoZWQ7CisJCQlkdy0+ZGV2aWNlID0gZGV2aWNlOworCQkJZHJiZF9xdWV1ZV93b3JrKCZwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssICZkdy0+dyk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKERFViwgImttYWxsb2ModykgZmFpbGVkLiIpOwotCQkJb3Zfb3V0X29mX3N5bmNfcHJpbnQobWRldik7Ci0JCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwkJCWRyYmRfZXJyKGRldmljZSwgImttYWxsb2MoZHcpIGZhaWxlZC4iKTsKKwkJCW92X291dF9vZl9zeW5jX3ByaW50KGRldmljZSk7CisJCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCQl9CiAJfQotCXB1dF9sZGV2KG1kZXYpOworCXB1dF9sZGV2KGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ290X3NraXAoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQorc3RhdGljIGludCBnb3Rfc2tpcChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKnBpKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRjb25uX2ZpbmlzaF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yLCBub3RfZW1wdHkgPSAwOwogCiAJZG8gewotCQljbGVhcl9iaXQoU0lHTkFMX0FTRU5ERVIsICZ0Y29ubi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoU0lHTkFMX0FTRU5ERVIsICZjb25uZWN0aW9uLT5mbGFncyk7CiAJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCWtyZWZfZ2V0KCZtZGV2LT5rcmVmKTsKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJCWtyZWZfZ2V0KCZkZXZpY2UtPmtyZWYpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlpZiAoZHJiZF9maW5pc2hfcGVlcl9yZXFzKG1kZXYpKSB7Ci0JCQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOworCQkJaWYgKGRyYmRfZmluaXNoX3BlZXJfcmVxcyhkZXZpY2UpKSB7CisJCQkJa3JlZl9wdXQoJmRldmljZS0+a3JlZiwgZHJiZF9kZXN0cm95X2RldmljZSk7CiAJCQkJcmV0dXJuIDE7CiAJCQl9Ci0JCQlrcmVmX3B1dCgmbWRldi0+a3JlZiwgJmRyYmRfbWlub3JfZGVzdHJveSk7CisJCQlrcmVmX3B1dCgmZGV2aWNlLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfZGV2aWNlKTsKIAkJCXJjdV9yZWFkX2xvY2soKTsKIAkJfQotCQlzZXRfYml0KFNJR05BTF9BU0VOREVSLCAmdGNvbm4tPmZsYWdzKTsKKwkJc2V0X2JpdChTSUdOQUxfQVNFTkRFUiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJCW5vdF9lbXB0eSA9ICFsaXN0X2VtcHR5KCZtZGV2LT5kb25lX2VlKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJCW5vdF9lbXB0eSA9ICFsaXN0X2VtcHR5KCZkZXZpY2UtPmRvbmVfZWUpOwogCQkJaWYgKG5vdF9lbXB0eSkKIAkJCQlicmVhazsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfSB3aGlsZSAobm90X2VtcHR5KTsKIApAQCAtNTIyMCw3ICs1MjkwLDcgQEAKIAogc3RydWN0IGFzZW5kZXJfY21kIHsKIAlzaXplX3QgcGt0X3NpemU7Ci0JaW50ICgqZm4pKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgc3RydWN0IHBhY2tldF9pbmZvICopOworCWludCAoKmZuKShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgcGFja2V0X2luZm8gKik7CiB9OwogCiBzdGF0aWMgc3RydWN0IGFzZW5kZXJfY21kIGFzZW5kZXJfdGJsW10gPSB7CkBAIC01MjQ1LDEzICs1MzE1LDEzIEBACiAKIGludCBkcmJkX2FzZW5kZXIoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gdGhpLT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdGhpLT5jb25uZWN0aW9uOwogCXN0cnVjdCBhc2VuZGVyX2NtZCAqY21kID0gTlVMTDsKIAlzdHJ1Y3QgcGFja2V0X2luZm8gcGk7CiAJaW50IHJ2OwotCXZvaWQgKmJ1ZiAgICA9IHRjb25uLT5tZXRhLnJidWY7CisJdm9pZCAqYnVmICAgID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCWludCByZWNlaXZlZCA9IDA7Ci0JdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZSh0Y29ubik7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gZHJiZF9oZWFkZXJfc2l6ZShjb25uZWN0aW9uKTsKIAlpbnQgZXhwZWN0ICAgPSBoZWFkZXJfc2l6ZTsKIAlib29sIHBpbmdfdGltZW91dF9hY3RpdmUgPSBmYWxzZTsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwpAQCAtNTI2MCw0NSArNTMzMCw0NSBAQAogCiAJcnYgPSBzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfUlIsICZwYXJhbSk7CiAJaWYgKHJ2IDwgMCkKLQkJY29ubl9lcnIodGNvbm4sICJkcmJkX2FzZW5kZXI6IEVSUk9SIHNldCBwcmlvcml0eSwgcmV0PSVkXG4iLCBydik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJkcmJkX2FzZW5kZXI6IEVSUk9SIHNldCBwcmlvcml0eSwgcmV0PSVkXG4iLCBydik7CiAKIAl3aGlsZSAoZ2V0X3Rfc3RhdGUodGhpKSA9PSBSVU5OSU5HKSB7CiAJCWRyYmRfdGhyZWFkX2N1cnJlbnRfc2V0X2NwdSh0aGkpOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKKwkJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCQlwaW5nX3RpbWVvID0gbmMtPnBpbmdfdGltZW87CiAJCXRjcF9jb3JrID0gbmMtPnRjcF9jb3JrOwogCQlwaW5nX2ludCA9IG5jLT5waW5nX2ludDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTRU5EX1BJTkcsICZ0Y29ubi0+ZmxhZ3MpKSB7Ci0JCQlpZiAoZHJiZF9zZW5kX3BpbmcodGNvbm4pKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICJkcmJkX3NlbmRfcGluZyBoYXMgZmFpbGVkXG4iKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTRU5EX1BJTkcsICZjb25uZWN0aW9uLT5mbGFncykpIHsKKwkJCWlmIChkcmJkX3NlbmRfcGluZyhjb25uZWN0aW9uKSkgeworCQkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJkcmJkX3NlbmRfcGluZyBoYXMgZmFpbGVkXG4iKTsKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCX0KLQkJCXRjb25uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gcGluZ190aW1lbyAqIEhaIC8gMTA7CisJCQljb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gcGluZ190aW1lbyAqIEhaIC8gMTA7CiAJCQlwaW5nX3RpbWVvdXRfYWN0aXZlID0gdHJ1ZTsKIAkJfQogCiAJCS8qIFRPRE86IGNvbmRpdGlvbmFsbHkgY29yazsgaXQgbWF5IGh1cnQgbGF0ZW5jeSBpZiB3ZSBjb3JrIHdpdGhvdXQKIAkJICAgbXVjaCB0byBzZW5kICovCiAJCWlmICh0Y3BfY29yaykKLQkJCWRyYmRfdGNwX2NvcmsodGNvbm4tPm1ldGEuc29ja2V0KTsKLQkJaWYgKHRjb25uX2ZpbmlzaF9wZWVyX3JlcXModGNvbm4pKSB7Ci0JCQljb25uX2Vycih0Y29ubiwgInRjb25uX2ZpbmlzaF9wZWVyX3JlcXMoKSBmYWlsZWRcbiIpOworCQkJZHJiZF90Y3BfY29yayhjb25uZWN0aW9uLT5tZXRhLnNvY2tldCk7CisJCWlmIChjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoY29ubmVjdGlvbikpIHsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJjb25uZWN0aW9uX2ZpbmlzaF9wZWVyX3JlcXMoKSBmYWlsZWRcbiIpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0KIAkJLyogYnV0IHVuY29uZGl0aW9uYWxseSB1bmNvcmsgdW5sZXNzIGRpc2FibGVkICovCiAJCWlmICh0Y3BfY29yaykKLQkJCWRyYmRfdGNwX3VuY29yayh0Y29ubi0+bWV0YS5zb2NrZXQpOworCQkJZHJiZF90Y3BfdW5jb3JrKGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0KTsKIAogCQkvKiBzaG9ydCBjaXJjdWl0LCByZWN2X21zZyB3b3VsZCByZXR1cm4gRUlOVFIgYW55d2F5cy4gKi8KIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJY29udGludWU7CiAKLQkJcnYgPSBkcmJkX3JlY3Zfc2hvcnQodGNvbm4tPm1ldGEuc29ja2V0LCBidWYsIGV4cGVjdC1yZWNlaXZlZCwgMCk7Ci0JCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJnRjb25uLT5mbGFncyk7CisJCXJ2ID0gZHJiZF9yZWN2X3Nob3J0KGNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LCBidWYsIGV4cGVjdC1yZWNlaXZlZCwgMCk7CisJCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCkBAIC01MzE2LDUxICs1Mzg2LDUxIEBACiAJCQlyZWNlaXZlZCArPSBydjsKIAkJCWJ1ZgkgKz0gcnY7CiAJCX0gZWxzZSBpZiAocnYgPT0gMCkgewotCQkJaWYgKHRlc3RfYml0KERJU0NPTk5FQ1RfU0VOVCwgJnRjb25uLT5mbGFncykpIHsKKwkJCWlmICh0ZXN0X2JpdChESVNDT05ORUNUX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncykpIHsKIAkJCQlsb25nIHQ7CiAJCQkJcmN1X3JlYWRfbG9jaygpOwotCQkJCXQgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKS0+cGluZ190aW1lbyAqIEhaLzEwOworCQkJCXQgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpLT5waW5nX3RpbWVvICogSFovMTA7CiAJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRjb25uLT5waW5nX3dhaXQsCi0JCQkJCQkgICAgICAgdGNvbm4tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUywKKwkJCQl0ID0gd2FpdF9ldmVudF90aW1lb3V0KGNvbm5lY3Rpb24tPnBpbmdfd2FpdCwKKwkJCQkJCSAgICAgICBjb25uZWN0aW9uLT5jc3RhdGUgPCBDX1dGX1JFUE9SVF9QQVJBTVMsCiAJCQkJCQkgICAgICAgdCk7CiAJCQkJaWYgKHQpCiAJCQkJCWJyZWFrOwogCQkJfQotCQkJY29ubl9lcnIodGNvbm4sICJtZXRhIGNvbm5lY3Rpb24gc2h1dCBkb3duIGJ5IHBlZXIuXG4iKTsKKwkJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJtZXRhIGNvbm5lY3Rpb24gc2h1dCBkb3duIGJ5IHBlZXIuXG4iKTsKIAkJCWdvdG8gcmVjb25uZWN0OwogCQl9IGVsc2UgaWYgKHJ2ID09IC1FQUdBSU4pIHsKIAkJCS8qIElmIHRoZSBkYXRhIHNvY2tldCByZWNlaXZlZCBzb21ldGhpbmcgbWVhbndoaWxlLAogCQkJICogdGhhdCBpcyBnb29kIGVub3VnaDogcGVlciBpcyBzdGlsbCBhbGl2ZS4gKi8KLQkJCWlmICh0aW1lX2FmdGVyKHRjb25uLT5sYXN0X3JlY2VpdmVkLAotCQkJCWppZmZpZXMgLSB0Y29ubi0+bWV0YS5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbykpCisJCQlpZiAodGltZV9hZnRlcihjb25uZWN0aW9uLT5sYXN0X3JlY2VpdmVkLAorCQkJCWppZmZpZXMgLSBjb25uZWN0aW9uLT5tZXRhLnNvY2tldC0+c2stPnNrX3JjdnRpbWVvKSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChwaW5nX3RpbWVvdXRfYWN0aXZlKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICJQaW5nQWNrIGRpZCBub3QgYXJyaXZlIGluIHRpbWUuXG4iKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiUGluZ0FjayBkaWQgbm90IGFycml2ZSBpbiB0aW1lLlxuIik7CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9Ci0JCQlzZXRfYml0KFNFTkRfUElORywgJnRjb25uLT5mbGFncyk7CisJCQlzZXRfYml0KFNFTkRfUElORywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKHJ2ID09IC1FSU5UUikgewogCQkJY29udGludWU7CiAJCX0gZWxzZSB7Ci0JCQljb25uX2Vycih0Y29ubiwgInNvY2tfcmVjdm1zZyByZXR1cm5lZCAlZFxuIiwgcnYpOworCQkJZHJiZF9lcnIoY29ubmVjdGlvbiwgInNvY2tfcmVjdm1zZyByZXR1cm5lZCAlZFxuIiwgcnYpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0KIAogCQlpZiAocmVjZWl2ZWQgPT0gZXhwZWN0ICYmIGNtZCA9PSBOVUxMKSB7Ci0JCQlpZiAoZGVjb2RlX2hlYWRlcih0Y29ubiwgdGNvbm4tPm1ldGEucmJ1ZiwgJnBpKSkKKwkJCWlmIChkZWNvZGVfaGVhZGVyKGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPm1ldGEucmJ1ZiwgJnBpKSkKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCWNtZCA9ICZhc2VuZGVyX3RibFtwaS5jbWRdOwogCQkJaWYgKHBpLmNtZCA+PSBBUlJBWV9TSVpFKGFzZW5kZXJfdGJsKSB8fCAhY21kLT5mbikgewotCQkJCWNvbm5fZXJyKHRjb25uLCAiVW5leHBlY3RlZCBtZXRhIHBhY2tldCAlcyAoMHglMDR4KVxuIiwKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiVW5leHBlY3RlZCBtZXRhIHBhY2tldCAlcyAoMHglMDR4KVxuIiwKIAkJCQkJIGNtZG5hbWUocGkuY21kKSwgcGkuY21kKTsKIAkJCQlnb3RvIGRpc2Nvbm5lY3Q7CiAJCQl9CiAJCQlleHBlY3QgPSBoZWFkZXJfc2l6ZSArIGNtZC0+cGt0X3NpemU7CiAJCQlpZiAocGkuc2l6ZSAhPSBleHBlY3QgLSBoZWFkZXJfc2l6ZSkgewotCQkJCWNvbm5fZXJyKHRjb25uLCAiV3JvbmcgcGFja2V0IHNpemUgb24gbWV0YSAoYzogJWQsIGw6ICVkKVxuIiwKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiV3JvbmcgcGFja2V0IHNpemUgb24gbWV0YSAoYzogJWQsIGw6ICVkKVxuIiwKIAkJCQkJcGkuY21kLCBwaS5zaXplKTsKIAkJCQlnb3RvIHJlY29ubmVjdDsKIAkJCX0KQEAgLTUzNjgsMjEgKzU0MzgsMjEgQEAKIAkJaWYgKHJlY2VpdmVkID09IGV4cGVjdCkgewogCQkJYm9vbCBlcnI7CiAKLQkJCWVyciA9IGNtZC0+Zm4odGNvbm4sICZwaSk7CisJCQllcnIgPSBjbWQtPmZuKGNvbm5lY3Rpb24sICZwaSk7CiAJCQlpZiAoZXJyKSB7Ci0JCQkJY29ubl9lcnIodGNvbm4sICIlcGYgZmFpbGVkXG4iLCBjbWQtPmZuKTsKKwkJCQlkcmJkX2Vycihjb25uZWN0aW9uLCAiJXBmIGZhaWxlZFxuIiwgY21kLT5mbik7CiAJCQkJZ290byByZWNvbm5lY3Q7CiAJCQl9CiAKLQkJCXRjb25uLT5sYXN0X3JlY2VpdmVkID0gamlmZmllczsKKwkJCWNvbm5lY3Rpb24tPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOwogCiAJCQlpZiAoY21kID09ICZhc2VuZGVyX3RibFtQX1BJTkdfQUNLXSkgewogCQkJCS8qIHJlc3RvcmUgaWRsZSB0aW1lb3V0ICovCi0JCQkJdGNvbm4tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBwaW5nX2ludCAqIEhaOworCQkJCWNvbm5lY3Rpb24tPm1ldGEuc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSBwaW5nX2ludCAqIEhaOwogCQkJCXBpbmdfdGltZW91dF9hY3RpdmUgPSBmYWxzZTsKIAkJCX0KIAotCQkJYnVmCSA9IHRjb25uLT5tZXRhLnJidWY7CisJCQlidWYJID0gY29ubmVjdGlvbi0+bWV0YS5yYnVmOwogCQkJcmVjZWl2ZWQgPSAwOwogCQkJZXhwZWN0CSA9IGhlYWRlcl9zaXplOwogCQkJY21kCSA9IE5VTEw7CkBAIC01MzkxLDE2ICs1NDYxLDE2IEBACiAKIAlpZiAoMCkgewogcmVjb25uZWN0OgotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfTkVUV09SS19GQUlMVVJFKSwgQ1NfSEFSRCk7Ci0JCWNvbm5fbWRfc3luYyh0Y29ubik7CisJCWNvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLCBOUyhjb25uLCBDX05FVFdPUktfRkFJTFVSRSksIENTX0hBUkQpOworCQljb25uX21kX3N5bmMoY29ubmVjdGlvbik7CiAJfQogCWlmICgwKSB7CiBkaXNjb25uZWN0OgotCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CiAJfQotCWNsZWFyX2JpdChTSUdOQUxfQVNFTkRFUiwgJnRjb25uLT5mbGFncyk7CisJY2xlYXJfYml0KFNJR05BTF9BU0VOREVSLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCi0JY29ubl9pbmZvKHRjb25uLCAiYXNlbmRlciB0ZXJtaW5hdGVkXG4iKTsKKwlkcmJkX2luZm8oY29ubmVjdGlvbiwgImFzZW5kZXIgdGVybWluYXRlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKaW5kZXggMTA0YTA0MC4uMzc3OWM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKQEAgLTMxLDM3ICszMSwzNyBAQAogI2luY2x1ZGUgImRyYmRfcmVxLmgiCiAKIAotc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKTsKK3N0YXRpYyBib29sIGRyYmRfbWF5X2RvX2xvY2FsX3JlYWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpOwogCiAvKiBVcGRhdGUgZGlzayBzdGF0cyBhdCBzdGFydCBvZiBJL08gcmVxdWVzdCAqLwotc3RhdGljIHZvaWQgX2RyYmRfc3RhcnRfaW9fYWNjdChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCitzdGF0aWMgdm9pZCBfZHJiZF9zdGFydF9pb19hY2N0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2Jpbyk7CiAJaW50IGNwdTsKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCXBhcnRfcm91bmRfc3RhdHMoY3B1LCAmbWRldi0+dmRpc2stPnBhcnQwKTsKLQlwYXJ0X3N0YXRfaW5jKGNwdSwgJm1kZXYtPnZkaXNrLT5wYXJ0MCwgaW9zW3J3XSk7Ci0JcGFydF9zdGF0X2FkZChjcHUsICZtZGV2LT52ZGlzay0+cGFydDAsIHNlY3RvcnNbcnddLCByZXEtPmkuc2l6ZSA+PiA5KTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwKTsKKwlwYXJ0X3N0YXRfaW5jKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCBpb3NbcnddKTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCBzZWN0b3JzW3J3XSwgcmVxLT5pLnNpemUgPj4gOSk7CiAJKHZvaWQpIGNwdTsgLyogVGhlIG1hY3JvIGludm9jYXRpb25zIGFib3ZlIHdhbnQgdGhlIGNwdSBhcmd1bWVudCwgSSBkbyBub3QgbGlrZQogCQkgICAgICAgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgY3B1IG9ubHkgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQuLi4gKi8KLQlwYXJ0X2luY19pbl9mbGlnaHQoJm1kZXYtPnZkaXNrLT5wYXJ0MCwgcncpOworCXBhcnRfaW5jX2luX2ZsaWdodCgmZGV2aWNlLT52ZGlzay0+cGFydDAsIHJ3KTsKIAlwYXJ0X3N0YXRfdW5sb2NrKCk7CiB9CiAKIC8qIFVwZGF0ZSBkaXNrIHN0YXRzIHdoZW4gY29tcGxldGluZyByZXF1ZXN0IHVwd2FyZHMgKi8KLXN0YXRpYyB2b2lkIF9kcmJkX2VuZF9pb19hY2N0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIF9kcmJkX2VuZF9pb19hY2N0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7CiAJaW50IHJ3ID0gYmlvX2RhdGFfZGlyKHJlcS0+bWFzdGVyX2Jpbyk7CiAJdW5zaWduZWQgbG9uZyBkdXJhdGlvbiA9IGppZmZpZXMgLSByZXEtPnN0YXJ0X3RpbWU7CiAJaW50IGNwdTsKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCXBhcnRfc3RhdF9hZGQoY3B1LCAmbWRldi0+dmRpc2stPnBhcnQwLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKLQlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJm1kZXYtPnZkaXNrLT5wYXJ0MCk7Ci0JcGFydF9kZWNfaW5fZmxpZ2h0KCZtZGV2LT52ZGlzay0+cGFydDAsIHJ3KTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJmRldmljZS0+dmRpc2stPnBhcnQwKTsKKwlwYXJ0X2RlY19pbl9mbGlnaHQoJmRldmljZS0+dmRpc2stPnBhcnQwLCBydyk7CiAJcGFydF9zdGF0X3VubG9jaygpOwogfQogCi1zdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqZHJiZF9yZXFfbmV3KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgc3RydWN0IGRyYmRfcmVxdWVzdCAqZHJiZF9yZXFfbmV3KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgICAgc3RydWN0IGJpbyAqYmlvX3NyYykKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXE7CkBAIC03Miw3ICs3Miw3IEBACiAKIAlkcmJkX3JlcV9tYWtlX3ByaXZhdGVfYmlvKHJlcSwgYmlvX3NyYyk7CiAJcmVxLT5ycV9zdGF0ZSAgICA9IGJpb19kYXRhX2RpcihiaW9fc3JjKSA9PSBXUklURSA/IFJRX1dSSVRFIDogMDsKLQlyZXEtPncubWRldiAgICAgID0gbWRldjsKKwlyZXEtPmRldmljZSAgID0gZGV2aWNlOwogCXJlcS0+bWFzdGVyX2JpbyAgPSBiaW9fc3JjOwogCXJlcS0+ZXBvY2ggICAgICAgPSAwOwogCkBAIC05NSwxNCArOTUsMTQgQEAKIHZvaWQgZHJiZF9yZXFfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRyYmRfcmVxdWVzdCwga3JlZik7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJY29uc3QgdW5zaWduZWQgcyA9IHJlcS0+cnFfc3RhdGU7CiAKIAlpZiAoKHJlcS0+bWFzdGVyX2JpbyAmJiAhKHMgJiBSUV9QT1NUUE9ORUQpKSB8fAogCQlhdG9taWNfcmVhZCgmcmVxLT5jb21wbGV0aW9uX3JlZikgfHwKIAkJKHMgJiBSUV9MT0NBTF9QRU5ESU5HKSB8fAogCQkoKHMgJiBSUV9ORVRfTUFTSykgJiYgIShzICYgUlFfTkVUX0RPTkUpKSkgewotCQlkZXZfZXJyKERFViwgImRyYmRfcmVxX2Rlc3Ryb3k6IExvZ2ljIEJVRyBycV9zdGF0ZSA9IDB4JXgsIGNvbXBsZXRpb25fcmVmID0gJWRcbiIsCisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2Rlc3Ryb3k6IExvZ2ljIEJVRyBycV9zdGF0ZSA9IDB4JXgsIGNvbXBsZXRpb25fcmVmID0gJWRcbiIsCiAJCQkJcywgYXRvbWljX3JlYWQoJnJlcS0+Y29tcGxldGlvbl9yZWYpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEzMiwxMCArMTMyLDEwIEBACiAJCSAqLwogCQlpZiAoKHMgJiAoUlFfUE9TVFBPTkVEfFJRX0xPQ0FMX01BU0t8UlFfTkVUX01BU0spKSAhPSBSUV9QT1NUUE9ORUQpIHsKIAkJCWlmICghKHMgJiBSUV9ORVRfT0spIHx8ICEocyAmIFJRX0xPQ0FMX09LKSkKLQkJCQlkcmJkX3NldF9vdXRfb2Zfc3luYyhtZGV2LCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CisJCQkJZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSk7CiAKIAkJCWlmICgocyAmIFJRX05FVF9PSykgJiYgKHMgJiBSUV9MT0NBTF9PSykgJiYgKHMgJiBSUV9ORVRfU0lTKSkKLQkJCQlkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHJlcS0+aS5zZWN0b3IsIHJlcS0+aS5zaXplKTsKKwkJCQlkcmJkX3NldF9pbl9zeW5jKGRldmljZSwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwogCQl9CiAKIAkJLyogb25lIG1pZ2h0IGJlIHRlbXB0ZWQgdG8gbW92ZSB0aGUgZHJiZF9hbF9jb21wbGV0ZV9pbwpAQCAtMTQ5LDExICsxNDksMTEgQEAKIAkJICogd2Ugd291bGQgZm9yZ2V0IHRvIHJlc3luYyB0aGUgY29ycmVzcG9uZGluZyBleHRlbnQuCiAJCSAqLwogCQlpZiAocyAmIFJRX0lOX0FDVF9MT0cpIHsKLQkJCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0ZBSUxFRCkpIHsKLQkJCQlkcmJkX2FsX2NvbXBsZXRlX2lvKG1kZXYsICZyZXEtPmkpOwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJaWYgKGdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9GQUlMRUQpKSB7CisJCQkJZHJiZF9hbF9jb21wbGV0ZV9pbyhkZXZpY2UsICZyZXEtPmkpOworCQkJCXB1dF9sZGV2KGRldmljZSk7CiAJCQl9IGVsc2UgaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpIHsKLQkJCQlkZXZfd2FybihERVYsICJTaG91bGQgaGF2ZSBjYWxsZWQgZHJiZF9hbF9jb21wbGV0ZV9pbygsICVsbHUsICV1KSwgIgorCQkJCWRyYmRfd2FybihkZXZpY2UsICJTaG91bGQgaGF2ZSBjYWxsZWQgZHJiZF9hbF9jb21wbGV0ZV9pbygsICVsbHUsICV1KSwgIgogCQkJCQkgImJ1dCBteSBEaXNrIHNlZW1zIHRvIGhhdmUgZmFpbGVkIDooXG4iLAogCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwogCQkJfQpAQCAtMTYzLDQxICsxNjMsNDIgQEAKIAltZW1wb29sX2ZyZWUocmVxLCBkcmJkX3JlcXVlc3RfbWVtcG9vbCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdha2VfYWxsX3NlbmRlcnMoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKSB7Ci0Jd2FrZV91cCgmdGNvbm4tPnNlbmRlcl93b3JrLnFfd2FpdCk7CitzdGF0aWMgdm9pZCB3YWtlX2FsbF9zZW5kZXJzKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJd2FrZV91cCgmY29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucV93YWl0KTsKIH0KIAogLyogbXVzdCBob2xkIHJlc291cmNlLT5yZXFfbG9jayAqLwotdm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQordm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAkvKiBubyBwb2ludCBjbG9zaW5nIGFuIGVwb2NoLCBpZiBpdCBpcyBlbXB0eSwgYW55d2F5cy4gKi8KLQlpZiAodGNvbm4tPmN1cnJlbnRfdGxlX3dyaXRlcyA9PSAwKQorCWlmIChjb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPT0gMCkKIAkJcmV0dXJuOwogCi0JdGNvbm4tPmN1cnJlbnRfdGxlX3dyaXRlcyA9IDA7Ci0JYXRvbWljX2luYygmdGNvbm4tPmN1cnJlbnRfdGxlX25yKTsKLQl3YWtlX2FsbF9zZW5kZXJzKHRjb25uKTsKKwljb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPSAwOworCWF0b21pY19pbmMoJmNvbm5lY3Rpb24tPmN1cnJlbnRfdGxlX25yKTsKKwl3YWtlX2FsbF9zZW5kZXJzKGNvbm5lY3Rpb24pOwogfQogCi12b2lkIGNvbXBsZXRlX21hc3Rlcl9iaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3ZvaWQgY29tcGxldGVfbWFzdGVyX2JpbyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7CiAJYmlvX2VuZGlvKG0tPmJpbywgbS0+ZXJyb3IpOwotCWRlY19hcF9iaW8obWRldik7CisJZGVjX2FwX2JpbyhkZXZpY2UpOwogfQogCiAKIHN0YXRpYyB2b2lkIGRyYmRfcmVtb3ZlX3JlcXVlc3RfaW50ZXJ2YWwoc3RydWN0IHJiX3Jvb3QgKnJvb3QsCiAJCQkJCSBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IGRyYmRfaW50ZXJ2YWwgKmkgPSAmcmVxLT5pOwogCiAJZHJiZF9yZW1vdmVfaW50ZXJ2YWwocm9vdCwgaSk7CiAKIAkvKiBXYWtlIHVwIGFueSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgdGhpcyByZXF1ZXN0IHRvIGNvbXBsZXRlLiAgKi8KIAlpZiAoaS0+d2FpdGluZykKLQkJd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogfQogCiAvKiBIZWxwZXIgZm9yIF9fcmVxX21vZCgpLgpAQCAtMjEwLDcgKzIxMSw3IEBACiB2b2lkIGRyYmRfcmVxX2NvbXBsZXRlKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7CiAJY29uc3QgdW5zaWduZWQgcyA9IHJlcS0+cnFfc3RhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJaW50IHJ3OwogCWludCBlcnJvciwgb2s7CiAKQEAgLTIyNiwxMiArMjI3LDEyIEBACiAJaWYgKChzICYgUlFfTE9DQUxfUEVORElORyAmJiAhKHMgJiBSUV9MT0NBTF9BQk9SVEVEKSkgfHwKIAkgICAgKHMgJiBSUV9ORVRfUVVFVUVEKSB8fCAocyAmIFJRX05FVF9QRU5ESU5HKSB8fAogCSAgICAocyAmIFJRX0NPTVBMRVRJT05fU1VTUCkpIHsKLQkJZGV2X2VycihERVYsICJkcmJkX3JlcV9jb21wbGV0ZTogTG9naWMgQlVHIHJxX3N0YXRlID0gMHgleFxuIiwgcyk7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2NvbXBsZXRlOiBMb2dpYyBCVUcgcnFfc3RhdGUgPSAweCV4XG4iLCBzKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICghcmVxLT5tYXN0ZXJfYmlvKSB7Ci0JCWRldl9lcnIoREVWLCAiZHJiZF9yZXFfY29tcGxldGU6IExvZ2ljIEJVRywgbWFzdGVyX2JpbyA9PSBOVUxMIVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfcmVxX2NvbXBsZXRlOiBMb2dpYyBCVUcsIG1hc3Rlcl9iaW8gPT0gTlVMTCFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNTksOSArMjYwLDkgQEAKIAkJc3RydWN0IHJiX3Jvb3QgKnJvb3Q7CiAKIAkJaWYgKHJ3ID09IFdSSVRFKQotCQkJcm9vdCA9ICZtZGV2LT53cml0ZV9yZXF1ZXN0czsKKwkJCXJvb3QgPSAmZGV2aWNlLT53cml0ZV9yZXF1ZXN0czsKIAkJZWxzZQotCQkJcm9vdCA9ICZtZGV2LT5yZWFkX3JlcXVlc3RzOworCQkJcm9vdCA9ICZkZXZpY2UtPnJlYWRfcmVxdWVzdHM7CiAJCWRyYmRfcmVtb3ZlX3JlcXVlc3RfaW50ZXJ2YWwocm9vdCwgcmVxKTsKIAl9CiAKQEAgLTI3MywxMSArMjc0LDExIEBACiAJICogYW5kIHJlc2V0IHRoZSB0cmFuc2ZlciBsb2cgZXBvY2ggd3JpdGVfY250LgogCSAqLwogCWlmIChydyA9PSBXUklURSAmJgotCSAgICByZXEtPmVwb2NoID09IGF0b21pY19yZWFkKCZtZGV2LT50Y29ubi0+Y3VycmVudF90bGVfbnIpKQotCQlzdGFydF9uZXdfdGxfZXBvY2gobWRldi0+dGNvbm4pOworCSAgICByZXEtPmVwb2NoID09IGF0b21pY19yZWFkKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV9ucikpCisJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAogCS8qIFVwZGF0ZSBkaXNrIHN0YXRzICovCi0JX2RyYmRfZW5kX2lvX2FjY3QobWRldiwgcmVxKTsKKwlfZHJiZF9lbmRfaW9fYWNjdChkZXZpY2UsIHJlcSk7CiAKIAkvKiBJZiBSRUFEIGZhaWxlZCwKIAkgKiBoYXZlIGl0IGJlIHB1c2hlZCBiYWNrIHRvIHRoZSByZXRyeSB3b3JrIHF1ZXVlLApAQCAtMzA1LDggKzMwNiw4IEBACiAKIHN0YXRpYyBpbnQgZHJiZF9yZXFfcHV0X2NvbXBsZXRpb25fcmVmKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGJpb19hbmRfZXJyb3IgKm0sIGludCBwdXQpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OwotCURfQVNTRVJUKG0gfHwgKHJlcS0+cnFfc3RhdGUgJiBSUV9QT1NUUE9ORUQpKTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOworCURfQVNTRVJUKGRldmljZSwgbSB8fCAocmVxLT5ycV9zdGF0ZSAmIFJRX1BPU1RQT05FRCkpOwogCiAJaWYgKCFhdG9taWNfc3ViX2FuZF90ZXN0KHB1dCwgJnJlcS0+Y29tcGxldGlvbl9yZWYpKQogCQlyZXR1cm4gMDsKQEAgLTMyOCwxMiArMzI5LDEyIEBACiBzdGF0aWMgdm9pZCBtb2RfcnFfc3RhdGUoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgYmlvX2FuZF9lcnJvciAqbSwKIAkJaW50IGNsZWFyLCBpbnQgc2V0KQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXVuc2lnbmVkIHMgPSByZXEtPnJxX3N0YXRlOwogCWludCBjX3B1dCA9IDA7CiAJaW50IGtfcHV0ID0gMDsKIAotCWlmIChkcmJkX3N1c3BlbmRlZChtZGV2KSAmJiAhKChzIHwgY2xlYXIpICYgUlFfQ09NUExFVElPTl9TVVNQKSkKKwlpZiAoZHJiZF9zdXNwZW5kZWQoZGV2aWNlKSAmJiAhKChzIHwgY2xlYXIpICYgUlFfQ09NUExFVElPTl9TVVNQKSkKIAkJc2V0IHw9IFJRX0NPTVBMRVRJT05fU1VTUDsKIAogCS8qIGFwcGx5ICovCkBAIC0zNTEsNyArMzUyLDcgQEAKIAkJYXRvbWljX2luYygmcmVxLT5jb21wbGV0aW9uX3JlZik7CiAKIAlpZiAoIShzICYgUlFfTkVUX1BFTkRJTkcpICYmIChzZXQgJiBSUV9ORVRfUEVORElORykpIHsKLQkJaW5jX2FwX3BlbmRpbmcobWRldik7CisJCWluY19hcF9wZW5kaW5nKGRldmljZSk7CiAJCWF0b21pY19pbmMoJnJlcS0+Y29tcGxldGlvbl9yZWYpOwogCX0KIApAQCAtMzYyLDcgKzM2Myw3IEBACiAJCWtyZWZfZ2V0KCZyZXEtPmtyZWYpOyAvKiB3YWl0IGZvciB0aGUgRE9ORSAqLwogCiAJaWYgKCEocyAmIFJRX05FVF9TRU5UKSAmJiAoc2V0ICYgUlFfTkVUX1NFTlQpKQotCQlhdG9taWNfYWRkKHJlcS0+aS5zaXplID4+IDksICZtZGV2LT5hcF9pbl9mbGlnaHQpOworCQlhdG9taWNfYWRkKHJlcS0+aS5zaXplID4+IDksICZkZXZpY2UtPmFwX2luX2ZsaWdodCk7CiAKIAlpZiAoIShzICYgUlFfQ09NUExFVElPTl9TVVNQKSAmJiAoc2V0ICYgUlFfQ09NUExFVElPTl9TVVNQKSkKIAkJYXRvbWljX2luYygmcmVxLT5jb21wbGV0aW9uX3JlZik7CkBAIC0zNzMsNyArMzc0LDcgQEAKIAkJKytjX3B1dDsKIAogCWlmICghKHMgJiBSUV9MT0NBTF9BQk9SVEVEKSAmJiAoc2V0ICYgUlFfTE9DQUxfQUJPUlRFRCkpIHsKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX1BFTkRJTkcpOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9QRU5ESU5HKTsKIAkJLyogbG9jYWwgY29tcGxldGlvbiBtYXkgc3RpbGwgY29tZSBpbiBsYXRlciwKIAkJICogd2UgbmVlZCB0byBrZWVwIHRoZSByZXEgb2JqZWN0IGFyb3VuZC4gKi8KIAkJa3JlZl9nZXQoJnJlcS0+a3JlZik7CkBAIC0zODgsNyArMzg5LDcgQEAKIAl9CiAKIAlpZiAoKHMgJiBSUV9ORVRfUEVORElORykgJiYgKGNsZWFyICYgUlFfTkVUX1BFTkRJTkcpKSB7Ci0JCWRlY19hcF9wZW5kaW5nKG1kZXYpOworCQlkZWNfYXBfcGVuZGluZyhkZXZpY2UpOwogCQkrK2NfcHV0OwogCX0KIApAQCAtMzk3LDcgKzM5OCw3IEBACiAKIAlpZiAoKHMgJiBSUV9FWFBfQkFSUl9BQ0spICYmICEocyAmIFJRX05FVF9ET05FKSAmJiAoc2V0ICYgUlFfTkVUX0RPTkUpKSB7CiAJCWlmIChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1NFTlQpCi0JCQlhdG9taWNfc3ViKHJlcS0+aS5zaXplID4+IDksICZtZGV2LT5hcF9pbl9mbGlnaHQpOworCQkJYXRvbWljX3N1YihyZXEtPmkuc2l6ZSA+PiA5LCAmZGV2aWNlLT5hcF9pbl9mbGlnaHQpOwogCQkrK2tfcHV0OwogCX0KIApAQCAtNDA5LDE0ICs0MTAsMTQgQEAKIAkJaW50IGF0X2xlYXN0ID0ga19wdXQgKyAhIWNfcHV0OwogCQlpbnQgcmVmY291bnQgPSBhdG9taWNfcmVhZCgmcmVxLT5rcmVmLnJlZmNvdW50KTsKIAkJaWYgKHJlZmNvdW50IDwgYXRfbGVhc3QpCi0JCQlkZXZfZXJyKERFViwKKwkJCWRyYmRfZXJyKGRldmljZSwKIAkJCQkibW9kX3JxX3N0YXRlOiBMb2dpYyBCVUc6ICV4IC0+ICV4OiByZWZjb3VudCA9ICVkLCBzaG91bGQgYmUgPj0gJWRcbiIsCiAJCQkJcywgcmVxLT5ycV9zdGF0ZSwgcmVmY291bnQsIGF0X2xlYXN0KTsKIAl9CiAKIAkvKiBJZiB3ZSBtYWRlIHByb2dyZXNzLCByZXRyeSBjb25mbGljdGluZyBwZWVyIHJlcXVlc3RzLCBpZiBhbnkuICovCiAJaWYgKHJlcS0+aS53YWl0aW5nKQotCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CiAKIAlpZiAoY19wdXQpCiAJCWtfcHV0ICs9IGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZihyZXEsIG0sIGNfcHV0KTsKQEAgLTQyNCwxOCArNDI1LDE4IEBACiAJCWtyZWZfc3ViKCZyZXEtPmtyZWYsIGtfcHV0LCBkcmJkX3JlcV9kZXN0cm95KTsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF9yZXBvcnRfaW9fZXJyb3Ioc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQorc3RhdGljIHZvaWQgZHJiZF9yZXBvcnRfaW9fZXJyb3Ioc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKICAgICAgICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCiAJaWYgKCFfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQogCQlyZXR1cm47CiAKLQlkZXZfd2FybihERVYsICJsb2NhbCAlcyBJTyBlcnJvciBzZWN0b3IgJWxsdSsldSBvbiAlc1xuIiwKKwlkcmJkX3dhcm4oZGV2aWNlLCAibG9jYWwgJXMgSU8gZXJyb3Igc2VjdG9yICVsbHUrJXUgb24gJXNcbiIsCiAJCQkocmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFKSA/ICJXUklURSIgOiAiUkVBRCIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcS0+aS5zZWN0b3IsCiAJCQlyZXEtPmkuc2l6ZSA+PiA5LAotCQkJYmRldm5hbWUobWRldi0+bGRldi0+YmFja2luZ19iZGV2LCBiKSk7CisJCQliZGV2bmFtZShkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldiwgYikpOwogfQogCiAvKiBvYnZpb3VzbHkgdGhpcyBjb3VsZCBiZSBjb2RlZCBhcyBtYW55IHNpbmdsZSBmdW5jdGlvbnMKQEAgLTQ1Myw3ICs0NTQsNyBAQAogaW50IF9fcmVxX21vZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCwKIAkJc3RydWN0IGJpb19hbmRfZXJyb3IgKm0pCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IG5ldF9jb25mICpuYzsKIAlpbnQgcCwgcnYgPSAwOwogCkBAIC00NjIsNyArNDYzLDcgQEAKIAogCXN3aXRjaCAod2hhdCkgewogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoREVWLCAiTE9HSUMgQlVHIGluICVzOiV1XG4iLCBfX0ZJTEVfXyAsIF9fTElORV9fKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiTE9HSUMgQlVHIGluICVzOiV1XG4iLCBfX0ZJTEVfXyAsIF9fTElORV9fKTsKIAkJYnJlYWs7CiAKIAkvKiBkb2VzIG5vdCBoYXBwZW4uLi4KQEAgLTQ3NCw5ICs0NzUsOSBAQAogCWNhc2UgVE9fQkVfU0VOVDogLyogdmlhIG5ldHdvcmsgKi8KIAkJLyogcmVhY2hlZCB2aWEgX19kcmJkX21ha2VfcmVxdWVzdAogCQkgKiBhbmQgZnJvbSB3X3JlYWRfcmV0cnlfcmVtb3RlICovCi0JCURfQVNTRVJUKCEocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9NQVNLKSk7CisJCURfQVNTRVJUKGRldmljZSwgIShyZXEtPnJxX3N0YXRlICYgUlFfTkVUX01BU0spKTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCQluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJCXAgPSBuYy0+d2lyZV9wcm90b2NvbDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJlcS0+cnFfc3RhdGUgfD0KQEAgLTQ4NywxNSArNDg4LDE1IEBACiAKIAljYXNlIFRPX0JFX1NVQk1JVFRFRDogLyogbG9jYWxseSAqLwogCQkvKiByZWFjaGVkIHZpYSBfX2RyYmRfbWFrZV9yZXF1ZXN0ICovCi0JCURfQVNTRVJUKCEocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX01BU0spKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCAhKHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9NQVNLKSk7CiAJCW1vZF9ycV9zdGF0ZShyZXEsIG0sIDAsIFJRX0xPQ0FMX1BFTkRJTkcpOwogCQlicmVhazsKIAogCWNhc2UgQ09NUExFVEVEX09LOgogCQlpZiAocmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFKQotCQkJbWRldi0+d3JpdF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKKwkJCWRldmljZS0+d3JpdF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKIAkJZWxzZQotCQkJbWRldi0+cmVhZF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKKwkJCWRldmljZS0+cmVhZF9jbnQgKz0gcmVxLT5pLnNpemUgPj4gOTsKIAogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9MT0NBTF9QRU5ESU5HLAogCQkJCVJRX0xPQ0FMX0NPTVBMRVRFRHxSUV9MT0NBTF9PSyk7CkBAIC01MDYsMTUgKzUwNywxNSBAQAogCQlicmVhazsKIAogCWNhc2UgV1JJVEVfQ09NUExFVEVEX1dJVEhfRVJST1I6Ci0JCWRyYmRfcmVwb3J0X2lvX2Vycm9yKG1kZXYsIHJlcSk7Ci0JCV9fZHJiZF9jaGtfaW9fZXJyb3IobWRldiwgRFJCRF9XUklURV9FUlJPUik7CisJCWRyYmRfcmVwb3J0X2lvX2Vycm9yKGRldmljZSwgcmVxKTsKKwkJX19kcmJkX2Noa19pb19lcnJvcihkZXZpY2UsIERSQkRfV1JJVEVfRVJST1IpOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9MT0NBTF9QRU5ESU5HLCBSUV9MT0NBTF9DT01QTEVURUQpOwogCQlicmVhazsKIAogCWNhc2UgUkVBRF9DT01QTEVURURfV0lUSF9FUlJPUjoKLQkJZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOwotCQlkcmJkX3JlcG9ydF9pb19lcnJvcihtZGV2LCByZXEpOwotCQlfX2RyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIERSQkRfUkVBRF9FUlJPUik7CisJCWRyYmRfc2V0X291dF9vZl9zeW5jKGRldmljZSwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpOworCQlkcmJkX3JlcG9ydF9pb19lcnJvcihkZXZpY2UsIHJlcSk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX1JFQURfRVJST1IpOwogCQkvKiBmYWxsIHRocm91Z2guICovCiAJY2FzZSBSRUFEX0FIRUFEX0NPTVBMRVRFRF9XSVRIX0VSUk9SOgogCQkvKiBpdCBpcyBsZWdhbCB0byBmYWlsIFJFQURBLCBubyBfX2RyYmRfY2hrX2lvX2Vycm9yIGluIHRoYXQgY2FzZS4gKi8KQEAgLTUzMiwxNiArNTMzLDE3IEBACiAJCS8qIFNvIHdlIGNhbiB2ZXJpZnkgdGhlIGhhbmRsZSBpbiB0aGUgYW5zd2VyIHBhY2tldC4KIAkJICogQ29ycmVzcG9uZGluZyBkcmJkX3JlbW92ZV9yZXF1ZXN0X2ludGVydmFsIGlzIGluCiAJCSAqIGRyYmRfcmVxX2NvbXBsZXRlKCkgKi8KLQkJRF9BU1NFUlQoZHJiZF9pbnRlcnZhbF9lbXB0eSgmcmVxLT5pKSk7Ci0JCWRyYmRfaW5zZXJ0X2ludGVydmFsKCZtZGV2LT5yZWFkX3JlcXVlc3RzLCAmcmVxLT5pKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkcmJkX2ludGVydmFsX2VtcHR5KCZyZXEtPmkpKTsKKwkJZHJiZF9pbnNlcnRfaW50ZXJ2YWwoJmRldmljZS0+cmVhZF9yZXF1ZXN0cywgJnJlcS0+aSk7CiAKLQkJc2V0X2JpdChVTlBMVUdfUkVNT1RFLCAmbWRldi0+ZmxhZ3MpOworCQlzZXRfYml0KFVOUExVR19SRU1PVEUsICZkZXZpY2UtPmZsYWdzKTsKIAotCQlEX0FTU0VSVChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOwotCQlEX0FTU0VSVCgocmVxLT5ycV9zdGF0ZSAmIFJRX0xPQ0FMX01BU0spID09IDApOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgKHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9NQVNLKSA9PSAwKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgMCwgUlFfTkVUX1FVRVVFRCk7CiAJCXJlcS0+dy5jYiA9IHdfc2VuZF9yZWFkX3JlcTsKLQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZyZXEtPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZyZXEtPncpOwogCQlicmVhazsKIAogCWNhc2UgUVVFVUVfRk9SX05FVF9XUklURToKQEAgLTU1MCw4ICs1NTIsOCBAQAogCiAJCS8qIENvcnJlc3BvbmRpbmcgZHJiZF9yZW1vdmVfcmVxdWVzdF9pbnRlcnZhbCBpcyBpbgogCQkgKiBkcmJkX3JlcV9jb21wbGV0ZSgpICovCi0JCURfQVNTRVJUKGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnJlcS0+aSkpOwotCQlkcmJkX2luc2VydF9pbnRlcnZhbCgmbWRldi0+d3JpdGVfcmVxdWVzdHMsICZyZXEtPmkpOworCQlEX0FTU0VSVChkZXZpY2UsIGRyYmRfaW50ZXJ2YWxfZW1wdHkoJnJlcS0+aSkpOworCQlkcmJkX2luc2VydF9pbnRlcnZhbCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgJnJlcS0+aSk7CiAKIAkJLyogTk9URQogCQkgKiBJbiBjYXNlIHRoZSByZXEgZW5kZWQgdXAgb24gdGhlIHRyYW5zZmVyIGxvZyBiZWZvcmUgYmVpbmcKQEAgLTU3MCwyOCArNTcyLDMwIEBACiAJCS8qIG90aGVyd2lzZSB3ZSBtYXkgbG9zZSBhbiB1bnBsdWcsIHdoaWNoIG1heSBjYXVzZSBzb21lIHJlbW90ZQogCQkgKiBpby1zY2hlZHVsZXIgdGltZW91dCB0byBleHBpcmUsIGluY3JlYXNpbmcgbWF4aW11bSBsYXRlbmN5LAogCQkgKiBodXJ0aW5nIHBlcmZvcm1hbmNlLiAqLwotCQlzZXRfYml0KFVOUExVR19SRU1PVEUsICZtZGV2LT5mbGFncyk7CisJCXNldF9iaXQoVU5QTFVHX1JFTU9URSwgJmRldmljZS0+ZmxhZ3MpOwogCiAJCS8qIHF1ZXVlIHdvcmsgaXRlbSB0byBzZW5kIGRhdGEgKi8KLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCByZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCAwLCBSUV9ORVRfUVVFVUVEfFJRX0VYUF9CQVJSX0FDSyk7CiAJCXJlcS0+dy5jYiA9ICB3X3NlbmRfZGJsb2NrOwotCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnJlcS0+dyk7CisJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJJnJlcS0+dyk7CiAKIAkJLyogY2xvc2UgdGhlIGVwb2NoLCBpbiBjYXNlIGl0IG91dGdyZXcgdGhlIGxpbWl0ICovCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwkJbmMgPSByY3VfZGVyZWZlcmVuY2UoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+bmV0X2NvbmYpOwogCQlwID0gbmMtPm1heF9lcG9jaF9zaXplOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKG1kZXYtPnRjb25uLT5jdXJyZW50X3RsZV93cml0ZXMgPj0gcCkKLQkJCXN0YXJ0X25ld190bF9lcG9jaChtZGV2LT50Y29ubik7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMgPj0gcCkKKwkJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAogCQlicmVhazsKIAogCWNhc2UgUVVFVUVfRk9SX1NFTkRfT09TOgogCQltb2RfcnFfc3RhdGUocmVxLCBtLCAwLCBSUV9ORVRfUVVFVUVEKTsKIAkJcmVxLT53LmNiID0gIHdfc2VuZF9vdXRfb2Zfc3luYzsKLQkJZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZyZXEtPncpOworCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZyZXEtPncpOwogCQlicmVhazsKIAogCWNhc2UgUkVBRF9SRVRSWV9SRU1PVEVfQ0FOQ0VMRUQ6CkBAIC02MzksMTUgKzY0MywxNSBAQAogCQkgKiBJZiB0aGlzIHJlcXVlc3QgaGFkIGJlZW4gbWFya2VkIGFzIFJRX1BPU1RQT05FRCBiZWZvcmUsCiAJCSAqIGl0IHdpbGwgYWN0dWFsbHkgbm90IGJlIGNvbXBsZXRlZCwgYnV0ICJyZXN0YXJ0ZWQiLAogCQkgKiByZXN1Ym1pdHRlZCBmcm9tIHRoZSByZXRyeSB3b3JrZXIgY29udGV4dC4gKi8KLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOwogCQltb2RfcnFfc3RhdGUocmVxLCBtLCBSUV9ORVRfUEVORElORywgUlFfTkVUX0RPTkV8UlFfTkVUX09LKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdSSVRFX0FDS0VEX0JZX1BFRVJfQU5EX1NJUzoKIAkJcmVxLT5ycV9zdGF0ZSB8PSBSUV9ORVRfU0lTOwogCWNhc2UgV1JJVEVfQUNLRURfQllfUEVFUjoKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKTsKIAkJLyogcHJvdG9jb2wgQzsgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gb24gcGVlci4KIAkJICogTm90aGluZyBtb3JlIHRvIGRvIGhlcmUuCiAJCSAqIFdlIHdhbnQgdG8ga2VlcCB0aGUgdGwgaW4gcGxhY2UgZm9yIGFsbCBwcm90b2NvbHMsIHRvIGNhdGVyCkBAIC02NTUsMjUgKzY1OSwyNSBAQAogCiAJCWdvdG8gYWNrX2NvbW1vbjsKIAljYXNlIFJFQ1ZfQUNLRURfQllfUEVFUjoKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9SRUNFSVZFX0FDSyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9SRUNFSVZFX0FDSyk7CiAJCS8qIHByb3RvY29sIEI7IHByZXRlbmRzIHRvIGJlIHN1Y2Nlc3NmdWxseSB3cml0dGVuIG9uIHBlZXIuCiAJCSAqIHNlZSBhbHNvIG5vdGVzIGFib3ZlIGluIEhBTkRFRF9PVkVSX1RPX05FVFdPUksgYWJvdXQKIAkJICogcHJvdG9jb2wgIT0gQyAqLwogCWFja19jb21tb246Ci0JCURfQVNTRVJUKHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfTkVUX1BFTkRJTkcsIFJRX05FVF9PSyk7CiAJCWJyZWFrOwogCiAJY2FzZSBQT1NUUE9ORV9XUklURToKLQkJRF9BU1NFUlQocmVxLT5ycV9zdGF0ZSAmIFJRX0VYUF9XUklURV9BQ0spOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9FWFBfV1JJVEVfQUNLKTsKIAkJLyogSWYgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGRldGVjdGVkIHRoZSB3cml0ZSBjb25mbGljdCwgdGhlCiAJCSAqIHdvcmtlciB3aWxsIGJlIHdhaXRpbmcgb24gbWlzY193YWl0LiAgV2FrZSBpdCB1cCBvbmNlIHRoaXMKIAkJICogcmVxdWVzdCBoYXMgY29tcGxldGVkIGxvY2FsbHkuCiAJCSAqLwotCQlEX0FTU0VSVChyZXEtPnJxX3N0YXRlICYgUlFfTkVUX1BFTkRJTkcpOworCQlEX0FTU0VSVChkZXZpY2UsIHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CiAJCXJlcS0+cnFfc3RhdGUgfD0gUlFfUE9TVFBPTkVEOwogCQlpZiAocmVxLT5pLndhaXRpbmcpCi0JCQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCQkJd2FrZV91cCgmZGV2aWNlLT5taXNjX3dhaXQpOwogCQkvKiBEbyBub3QgY2xlYXIgUlFfTkVUX1BFTkRJTkcuIFRoaXMgcmVxdWVzdCB3aWxsIG1ha2UgZnVydGhlcgogCQkgKiBwcm9ncmVzcyB2aWEgcmVzdGFydF9jb25mbGljdGluZ193cml0ZXMoKSBvcgogCQkgKiBmYWlsX3Bvc3Rwb25lZF9yZXF1ZXN0cygpLiBIb3BlZnVsbHkuICovCkBAIC03MDEsOSArNzA1LDEwIEBACiAJCWlmIChiaW9fZGF0YV9kaXIocmVxLT5tYXN0ZXJfYmlvKSA9PSBXUklURSkKIAkJCXJ2ID0gTVJfV1JJVEU7CiAKLQkJZ2V0X2xkZXYobWRldik7IC8qIGFsd2F5cyBzdWNjZWVkcyBpbiB0aGlzIGNhbGwgcGF0aCAqLworCQlnZXRfbGRldihkZXZpY2UpOyAvKiBhbHdheXMgc3VjY2VlZHMgaW4gdGhpcyBjYWxsIHBhdGggKi8KIAkJcmVxLT53LmNiID0gd19yZXN0YXJ0X2Rpc2tfaW87Ci0JCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmcmVxLT53KTsKKwkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkmcmVxLT53KTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFU0VORDoKQEAgLTcxOSwxMiArNzI0LDEzIEBACiAJCSAgIFRocm93aW5nIHRoZW0gb3V0IG9mIHRoZSBUTCBoZXJlIGJ5IHByZXRlbmRpbmcgd2UgZ290IGEgQkFSUklFUl9BQ0suCiAJCSAgIER1cmluZyBjb25uZWN0aW9uIGhhbmRzaGFrZSwgd2UgZW5zdXJlIHRoYXQgdGhlIHBlZXIgd2FzIG5vdCByZWJvb3RlZC4gKi8KIAkJaWYgKCEocmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9PSykpIHsKLQkJCS8qIEZJWE1FIGNvdWxkIHRoaXMgcG9zc2libHkgYmUgYSByZXEtPncuY2IgPT0gd19zZW5kX291dF9vZl9zeW5jPworCQkJLyogRklYTUUgY291bGQgdGhpcyBwb3NzaWJseSBiZSBhIHJlcS0+ZHcuY2IgPT0gd19zZW5kX291dF9vZl9zeW5jPwogCQkJICogaW4gdGhhdCBjYXNlIHdlIG11c3Qgbm90IHNldCBSUV9ORVRfUEVORElORy4gKi8KIAogCQkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfQ09NUExFVElPTl9TVVNQLCBSUV9ORVRfUVVFVUVEfFJRX05FVF9QRU5ESU5HKTsKIAkJCWlmIChyZXEtPncuY2IpIHsKLQkJCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnJlcS0+dyk7CisJCQkJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCQkJCSZyZXEtPncpOwogCQkJCXJ2ID0gcmVxLT5ycV9zdGF0ZSAmIFJRX1dSSVRFID8gTVJfV1JJVEUgOiBNUl9SRUFEOwogCQkJfSAvKiBlbHNlOiBGSVhNRSBjYW4gdGhpcyBoYXBwZW4/ICovCiAJCQlicmVhazsKQEAgLTc0MCw3ICs3NDYsNyBAQAogCQkJLyogYmFycmllciBjYW1lIGluIGJlZm9yZSBhbGwgcmVxdWVzdHMgd2VyZSBhY2tlZC4KIAkJCSAqIHRoaXMgaXMgYmFkLCBiZWNhdXNlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGxvc3Qgbm93LAogCQkJICogd2Ugd29uJ3QgYmUgYWJsZSB0byBjbGVhbiB0aGVtIHVwLi4uICovCi0JCQlkZXZfZXJyKERFViwgIkZJWE1FIChCQVJSSUVSX0FDS0VEIGJ1dCBwZW5kaW5nKVxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJGSVhNRSAoQkFSUklFUl9BQ0tFRCBidXQgcGVuZGluZylcbiIpOwogCQl9CiAJCS8qIEFsbG93ZWQgdG8gY29tcGxldGUgcmVxdWVzdHMsIGV2ZW4gd2hpbGUgc3VzcGVuZGVkLgogCQkgKiBBcyB0aGlzIGlzIGNhbGxlZCBmb3IgYWxsIHJlcXVlc3RzIHdpdGhpbiBhIG1hdGNoaW5nIGVwb2NoLApAQCAtNzUxLDEyICs3NTcsMTIgQEAKIAkJYnJlYWs7CiAKIAljYXNlIERBVEFfUkVDRUlWRUQ6Ci0JCURfQVNTRVJUKHJlcS0+cnFfc3RhdGUgJiBSUV9ORVRfUEVORElORyk7CisJCURfQVNTRVJUKGRldmljZSwgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgUlFfTkVUX1BFTkRJTkcsIFJRX05FVF9PS3xSUV9ORVRfRE9ORSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRVUVVRV9BU19EUkJEX0JBUlJJRVI6Ci0JCXN0YXJ0X25ld190bF9lcG9jaChtZGV2LT50Y29ubik7CisJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAkJbW9kX3JxX3N0YXRlKHJlcSwgbSwgMCwgUlFfTkVUX09LfFJRX05FVF9ET05FKTsKIAkJYnJlYWs7CiAJfTsKQEAgLTc3MSwyNyArNzc3LDI3IEBACiAgKiAgIHNpbmNlIHNpemUgbWF5IGJlIGJpZ2dlciB0aGFuIEJNX0JMT0NLX1NJWkUsCiAgKiAgIHdlIG1heSBuZWVkIHRvIGNoZWNrIHNldmVyYWwgYml0cy4KICAqLwotc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplKQorc3RhdGljIGJvb2wgZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHNibnIsIGVibnI7CiAJc2VjdG9yX3QgZXNlY3RvciwgbnJfc2VjdG9yczsKIAotCWlmIChtZGV2LT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSkKKwlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID09IERfVVBfVE9fREFURSkKIAkJcmV0dXJuIHRydWU7Ci0JaWYgKG1kZXYtPnN0YXRlLmRpc2sgIT0gRF9JTkNPTlNJU1RFTlQpCisJaWYgKGRldmljZS0+c3RhdGUuZGlzayAhPSBEX0lOQ09OU0lTVEVOVCkKIAkJcmV0dXJuIGZhbHNlOwogCWVzZWN0b3IgPSBzZWN0b3IgKyAoc2l6ZSA+PiA5KSAtIDE7Ci0JbnJfc2VjdG9ycyA9IGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldik7Ci0JRF9BU1NFUlQoc2VjdG9yICA8IG5yX3NlY3RvcnMpOwotCURfQVNTRVJUKGVzZWN0b3IgPCBucl9zZWN0b3JzKTsKKwlucl9zZWN0b3JzID0gZHJiZF9nZXRfY2FwYWNpdHkoZGV2aWNlLT50aGlzX2JkZXYpOworCURfQVNTRVJUKGRldmljZSwgc2VjdG9yICA8IG5yX3NlY3RvcnMpOworCURfQVNTRVJUKGRldmljZSwgZXNlY3RvciA8IG5yX3NlY3RvcnMpOwogCiAJc2JuciA9IEJNX1NFQ1RfVE9fQklUKHNlY3Rvcik7CiAJZWJuciA9IEJNX1NFQ1RfVE9fQklUKGVzZWN0b3IpOwogCi0JcmV0dXJuIGRyYmRfYm1fY291bnRfYml0cyhtZGV2LCBzYm5yLCBlYm5yKSA9PSAwOworCXJldHVybiBkcmJkX2JtX2NvdW50X2JpdHMoZGV2aWNlLCBzYm5yLCBlYm5yKSA9PSAwOwogfQogCi1zdGF0aWMgYm9vbCByZW1vdGVfZHVlX3RvX3JlYWRfYmFsYW5jaW5nKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwKK3N0YXRpYyBib29sIHJlbW90ZV9kdWVfdG9fcmVhZF9iYWxhbmNpbmcoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwKIAkJZW51bSBkcmJkX3JlYWRfYmFsYW5jaW5nIHJibSkKIHsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOwpAQCAtNzk5LDExICs4MDUsMTEgQEAKIAogCXN3aXRjaCAocmJtKSB7CiAJY2FzZSBSQl9DT05HRVNURURfUkVNT1RFOgotCQliZGkgPSAmbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mbzsKKwkJYmRpID0gJmRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mbzsKIAkJcmV0dXJuIGJkaV9yZWFkX2Nvbmdlc3RlZChiZGkpOwogCWNhc2UgUkJfTEVBU1RfUEVORElORzoKLQkJcmV0dXJuIGF0b21pY19yZWFkKCZtZGV2LT5sb2NhbF9jbnQpID4KLQkJCWF0b21pY19yZWFkKCZtZGV2LT5hcF9wZW5kaW5nX2NudCkgKyBhdG9taWNfcmVhZCgmbWRldi0+cnNfcGVuZGluZ19jbnQpOworCQlyZXR1cm4gYXRvbWljX3JlYWQoJmRldmljZS0+bG9jYWxfY250KSA+CisJCQlhdG9taWNfcmVhZCgmZGV2aWNlLT5hcF9wZW5kaW5nX2NudCkgKyBhdG9taWNfcmVhZCgmZGV2aWNlLT5yc19wZW5kaW5nX2NudCk7CiAJY2FzZSBSQl8zMktfU1RSSVBJTkc6ICAvKiBzdHJpcGVfc2hpZnQgPSAxNSAqLwogCWNhc2UgUkJfNjRLX1NUUklQSU5HOgogCWNhc2UgUkJfMTI4S19TVFJJUElORzoKQEAgLTgxMyw3ICs4MTksNyBAQAogCQlzdHJpcGVfc2hpZnQgPSAocmJtIC0gUkJfMzJLX1NUUklQSU5HICsgMTUpOwogCQlyZXR1cm4gKHNlY3RvciA+PiAoc3RyaXBlX3NoaWZ0IC0gOSkpICYgMTsKIAljYXNlIFJCX1JPVU5EX1JPQklOOgotCQlyZXR1cm4gdGVzdF9hbmRfY2hhbmdlX2JpdChSRUFEX0JBTEFOQ0VfUlIsICZtZGV2LT5mbGFncyk7CisJCXJldHVybiB0ZXN0X2FuZF9jaGFuZ2VfYml0KFJFQURfQkFMQU5DRV9SUiwgJmRldmljZS0+ZmxhZ3MpOwogCWNhc2UgUkJfUFJFRkVSX1JFTU9URToKIAkJcmV0dXJuIHRydWU7CiAJY2FzZSBSQl9QUkVGRVJfTE9DQUw6CkBAIC04MzQsNzMgKzg0MCw3MyBAQAogc3RhdGljIHZvaWQgY29tcGxldGVfY29uZmxpY3Rpbmdfd3JpdGVzKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKIAlzdHJ1Y3QgZHJiZF9pbnRlcnZhbCAqaTsKIAlzZWN0b3JfdCBzZWN0b3IgPSByZXEtPmkuc2VjdG9yOwogCWludCBzaXplID0gcmVxLT5pLnNpemU7CiAKLQlpID0gZHJiZF9maW5kX292ZXJsYXAoJm1kZXYtPndyaXRlX3JlcXVlc3RzLCBzZWN0b3IsIHNpemUpOworCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKTsKIAlpZiAoIWkpCiAJCXJldHVybjsKIAogCWZvciAoOzspIHsKLQkJcHJlcGFyZV90b193YWl0KCZtZGV2LT5taXNjX3dhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmbWRldi0+d3JpdGVfcmVxdWVzdHMsIHNlY3Rvciwgc2l6ZSk7CisJCXByZXBhcmVfdG9fd2FpdCgmZGV2aWNlLT5taXNjX3dhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWkgPSBkcmJkX2ZpbmRfb3ZlcmxhcCgmZGV2aWNlLT53cml0ZV9yZXF1ZXN0cywgc2VjdG9yLCBzaXplKTsKIAkJaWYgKCFpKQogCQkJYnJlYWs7CiAJCS8qIEluZGljYXRlIHRvIHdha2UgdXAgZGV2aWNlLT5taXNjX3dhaXQgb24gcHJvZ3Jlc3MuICAqLwogCQlpLT53YWl0aW5nID0gdHJ1ZTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJc2NoZWR1bGUoKTsKLQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCX0KLQlmaW5pc2hfd2FpdCgmbWRldi0+bWlzY193YWl0LCAmd2FpdCk7CisJZmluaXNoX3dhaXQoJmRldmljZS0+bWlzY193YWl0LCAmd2FpdCk7CiB9CiAKIC8qIGNhbGxlZCB3aXRoaW4gcmVxX2xvY2sgYW5kIHJjdV9yZWFkX2xvY2soKSAqLwotc3RhdGljIHZvaWQgbWF5YmVfcHVsbF9haGVhZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIHZvaWQgbWF5YmVfcHVsbF9haGVhZChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCWJvb2wgY29uZ2VzdGVkID0gZmFsc2U7CiAJZW51bSBkcmJkX29uX2Nvbmdlc3Rpb24gb25fY29uZ2VzdGlvbjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluYyA9IHJjdV9kZXJlZmVyZW5jZSh0Y29ubi0+bmV0X2NvbmYpOworCW5jID0gcmN1X2RlcmVmZXJlbmNlKGNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAlvbl9jb25nZXN0aW9uID0gbmMgPyBuYy0+b25fY29uZ2VzdGlvbiA6IE9DX0JMT0NLOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmIChvbl9jb25nZXN0aW9uID09IE9DX0JMT0NLIHx8Ci0JICAgIHRjb25uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NikKKwkgICAgY29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTYpCiAJCXJldHVybjsKIAogCS8qIElmIEkgZG9uJ3QgZXZlbiBoYXZlIGdvb2QgbG9jYWwgc3RvcmFnZSwgd2UgY2FuIG5vdCByZWFzb25hYmx5IHRyeQogCSAqIHRvIHB1bGwgYWhlYWQgb2YgdGhlIHBlZXIuIFdlIGFsc28gbmVlZCB0aGUgbG9jYWwgcmVmZXJlbmNlIHRvIG1ha2UKLQkgKiBzdXJlIG1kZXYtPmFjdF9sb2cgaXMgdGhlcmUuCisJICogc3VyZSBkZXZpY2UtPmFjdF9sb2cgaXMgdGhlcmUuCiAJICovCi0JaWYgKCFnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX1VQX1RPX0RBVEUpKQorCWlmICghZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX1VQX1RPX0RBVEUpKQogCQlyZXR1cm47CiAKIAlpZiAobmMtPmNvbmdfZmlsbCAmJgotCSAgICBhdG9taWNfcmVhZCgmbWRldi0+YXBfaW5fZmxpZ2h0KSA+PSBuYy0+Y29uZ19maWxsKSB7Ci0JCWRldl9pbmZvKERFViwgIkNvbmdlc3Rpb24tZmlsbCB0aHJlc2hvbGQgcmVhY2hlZFxuIik7CisJICAgIGF0b21pY19yZWFkKCZkZXZpY2UtPmFwX2luX2ZsaWdodCkgPj0gbmMtPmNvbmdfZmlsbCkgeworCQlkcmJkX2luZm8oZGV2aWNlLCAiQ29uZ2VzdGlvbi1maWxsIHRocmVzaG9sZCByZWFjaGVkXG4iKTsKIAkJY29uZ2VzdGVkID0gdHJ1ZTsKIAl9CiAKLQlpZiAobWRldi0+YWN0X2xvZy0+dXNlZCA+PSBuYy0+Y29uZ19leHRlbnRzKSB7Ci0JCWRldl9pbmZvKERFViwgIkNvbmdlc3Rpb24tZXh0ZW50cyB0aHJlc2hvbGQgcmVhY2hlZFxuIik7CisJaWYgKGRldmljZS0+YWN0X2xvZy0+dXNlZCA+PSBuYy0+Y29uZ19leHRlbnRzKSB7CisJCWRyYmRfaW5mbyhkZXZpY2UsICJDb25nZXN0aW9uLWV4dGVudHMgdGhyZXNob2xkIHJlYWNoZWRcbiIpOwogCQljb25nZXN0ZWQgPSB0cnVlOwogCX0KIAogCWlmIChjb25nZXN0ZWQpIHsKIAkJLyogc3RhcnQgYSBuZXcgZXBvY2ggZm9yIG5vbi1taXJyb3JlZCB3cml0ZXMgKi8KLQkJc3RhcnRfbmV3X3RsX2Vwb2NoKG1kZXYtPnRjb25uKTsKKwkJc3RhcnRfbmV3X3RsX2Vwb2NoKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCiAJCWlmIChvbl9jb25nZXN0aW9uID09IE9DX1BVTExfQUhFQUQpCi0JCQlfZHJiZF9zZXRfc3RhdGUoX05TKG1kZXYsIGNvbm4sIENfQUhFQUQpLCAwLCBOVUxMKTsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX0FIRUFEKSwgMCwgTlVMTCk7CiAJCWVsc2UgIC8qbmMtPm9uX2Nvbmdlc3Rpb24gPT0gT0NfRElTQ09OTkVDVCAqLwotCQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCAwLCBOVUxMKTsKKwkJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCAwLCBOVUxMKTsKIAl9Ci0JcHV0X2xkZXYobWRldik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIH0KIAogLyogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCBhbmQgcmVxLT5wcml2YXRlX2JpbyBpcyBzdGlsbCBzZXQsCkBAIC05MTQsMTkgKzkyMCwxOSBAQAogICovCiBzdGF0aWMgYm9vbCBkb19yZW1vdGVfcmVhZChzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJZW51bSBkcmJkX3JlYWRfYmFsYW5jaW5nIHJibTsKIAogCWlmIChyZXEtPnByaXZhdGVfYmlvKSB7Ci0JCWlmICghZHJiZF9tYXlfZG9fbG9jYWxfcmVhZChtZGV2LAorCQlpZiAoIWRyYmRfbWF5X2RvX2xvY2FsX3JlYWQoZGV2aWNlLAogCQkJCQlyZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSkpIHsKIAkJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCQlyZXEtPnByaXZhdGVfYmlvID0gTlVMTDsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0KIAotCWlmIChtZGV2LT5zdGF0ZS5wZHNrICE9IERfVVBfVE9fREFURSkKKwlpZiAoZGV2aWNlLT5zdGF0ZS5wZHNrICE9IERfVVBfVE9fREFURSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKHJlcS0+cHJpdmF0ZV9iaW8gPT0gTlVMTCkKQEAgLTkzNiwxNyArOTQyLDE3IEBACiAJICogcHJvdG9jb2wsIHBlbmRpbmcgcmVxdWVzdHMgZXRjLiAqLwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXJibSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5yZWFkX2JhbGFuY2luZzsKKwlyYm0gPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5yZWFkX2JhbGFuY2luZzsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChyYm0gPT0gUkJfUFJFRkVSX0xPQ0FMICYmIHJlcS0+cHJpdmF0ZV9iaW8pCiAJCXJldHVybiBmYWxzZTsgLyogc3VibWl0IGxvY2FsbHkgKi8KIAotCWlmIChyZW1vdGVfZHVlX3RvX3JlYWRfYmFsYW5jaW5nKG1kZXYsIHJlcS0+aS5zZWN0b3IsIHJibSkpIHsKKwlpZiAocmVtb3RlX2R1ZV90b19yZWFkX2JhbGFuY2luZyhkZXZpY2UsIHJlcS0+aS5zZWN0b3IsIHJibSkpIHsKIAkJaWYgKHJlcS0+cHJpdmF0ZV9iaW8pIHsKIAkJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCQlyZXEtPnByaXZhdGVfYmlvID0gTlVMTDsKLQkJCXB1dF9sZGV2KG1kZXYpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC05NTksMTEgKzk2NSwxMSBAQAogICogd2hpY2ggZG9lcyBOT1QgaW5jbHVkZSB0aG9zZSB0aGF0IHdlIGFyZSBMX0FIRUFEIGZvci4gKi8KIHN0YXRpYyBpbnQgZHJiZF9wcm9jZXNzX3dyaXRlX3JlcXVlc3Qoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCWludCByZW1vdGUsIHNlbmRfb29zOwogCi0JcmVtb3RlID0gZHJiZF9zaG91bGRfZG9fcmVtb3RlKG1kZXYtPnN0YXRlKTsKLQlzZW5kX29vcyA9IGRyYmRfc2hvdWxkX3NlbmRfb3V0X29mX3N5bmMobWRldi0+c3RhdGUpOworCXJlbW90ZSA9IGRyYmRfc2hvdWxkX2RvX3JlbW90ZShkZXZpY2UtPnN0YXRlKTsKKwlzZW5kX29vcyA9IGRyYmRfc2hvdWxkX3NlbmRfb3V0X29mX3N5bmMoZGV2aWNlLT5zdGF0ZSk7CiAKIAkvKiBOZWVkIHRvIHJlcGxpY2F0ZSB3cml0ZXMuICBVbmxlc3MgaXQgaXMgYW4gZW1wdHkgZmx1c2gsCiAJICogd2hpY2ggaXMgYmV0dGVyIG1hcHBlZCB0byBhIERSQkQgUF9CQVJSSUVSIHBhY2tldCwKQEAgLTk3Myw3ICs5NzksNyBAQAogCSAqIHJlcGxpY2F0aW5nLCBpbiB3aGljaCBjYXNlIHRoZXJlIGlzIG5vIHBvaW50LiAqLwogCWlmICh1bmxpa2VseShyZXEtPmkuc2l6ZSA9PSAwKSkgewogCQkvKiBUaGUgb25seSBzaXplPT0wIGJpb3Mgd2UgZXhwZWN0IGFyZSBlbXB0eSBmbHVzaGVzLiAqLwotCQlEX0FTU0VSVChyZXEtPm1hc3Rlcl9iaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCByZXEtPm1hc3Rlcl9iaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKTsKIAkJaWYgKHJlbW90ZSkKIAkJCV9yZXFfbW9kKHJlcSwgUVVFVUVfQVNfRFJCRF9CQVJSSUVSKTsKIAkJcmV0dXJuIHJlbW90ZTsKQEAgLTk4MiwxMiArOTg4LDEyIEBACiAJaWYgKCFyZW1vdGUgJiYgIXNlbmRfb29zKQogCQlyZXR1cm4gMDsKIAotCURfQVNTRVJUKCEocmVtb3RlICYmIHNlbmRfb29zKSk7CisJRF9BU1NFUlQoZGV2aWNlLCAhKHJlbW90ZSAmJiBzZW5kX29vcykpOwogCiAJaWYgKHJlbW90ZSkgewogCQlfcmVxX21vZChyZXEsIFRPX0JFX1NFTlQpOwogCQlfcmVxX21vZChyZXEsIFFVRVVFX0ZPUl9ORVRfV1JJVEUpOwotCX0gZWxzZSBpZiAoZHJiZF9zZXRfb3V0X29mX3N5bmMobWRldiwgcmVxLT5pLnNlY3RvciwgcmVxLT5pLnNpemUpKQorCX0gZWxzZSBpZiAoZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSkpCiAJCV9yZXFfbW9kKHJlcSwgUVVFVUVfRk9SX1NFTkRfT09TKTsKIAogCXJldHVybiByZW1vdGU7CkBAIC05OTYsMzYgKzEwMDIsMzYgQEAKIHN0YXRpYyB2b2lkCiBkcmJkX3N1Ym1pdF9yZXFfcHJpdmF0ZV9iaW8oc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXN0cnVjdCBiaW8gKmJpbyA9IHJlcS0+cHJpdmF0ZV9iaW87CiAJY29uc3QgaW50IHJ3ID0gYmlvX3J3KGJpbyk7CiAKLQliaW8tPmJpX2JkZXYgPSBtZGV2LT5sZGV2LT5iYWNraW5nX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gZGV2aWNlLT5sZGV2LT5iYWNraW5nX2JkZXY7CiAKIAkvKiBTdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHdlIGdyYWJiZWQgb3VyIHJlZmVyZW5jZSBvbiB0aGUKIAkgKiAtPmxkZXYgbWVtYmVyLiBEb3VibGUgY2hlY2ssIGFuZCBzaG9ydC1jaXJjdWl0IHRvIGVuZGlvLgogCSAqIEluIGNhc2UgdGhlIGxhc3QgYWN0aXZpdHkgbG9nIHRyYW5zYWN0aW9uIGZhaWxlZCB0byBnZXQgb24KIAkgKiBzdGFibGUgc3RvcmFnZSwgYW5kIHRoaXMgaXMgYSBXUklURSwgd2UgbWF5IG5vdCBldmVuIHN1Ym1pdAogCSAqIHRoaXMgYmlvLiAqLwotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQobWRldiwKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlpZiAoZHJiZF9pbnNlcnRfZmF1bHQoZGV2aWNlLAogCQkJCSAgICAgIHJ3ID09IFdSSVRFID8gRFJCRF9GQVVMVF9EVF9XUgogCQkJCSAgICA6IHJ3ID09IFJFQUQgID8gRFJCRF9GQVVMVF9EVF9SRAogCQkJCSAgICA6ICAgICAgICAgICAgICAgRFJCRF9GQVVMVF9EVF9SQSkpCiAJCQliaW9fZW5kaW8oYmlvLCAtRUlPKTsKIAkJZWxzZQogCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfSBlbHNlCiAJCWJpb19lbmRpbyhiaW8sIC1FSU8pOwogfQogCi1zdGF0aWMgdm9pZCBkcmJkX3F1ZXVlX3dyaXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIGRyYmRfcXVldWVfd3JpdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKLQlzcGluX2xvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCAmbWRldi0+c3VibWl0LndyaXRlcyk7Ci0Jc3Bpbl91bmxvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKLQlxdWV1ZV93b3JrKG1kZXYtPnN1Ym1pdC53cSwgJm1kZXYtPnN1Ym1pdC53b3JrZXIpOworCXNwaW5fbG9jaygmZGV2aWNlLT5zdWJtaXQubG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT50bF9yZXF1ZXN0cywgJmRldmljZS0+c3VibWl0LndyaXRlcyk7CisJc3Bpbl91bmxvY2soJmRldmljZS0+c3VibWl0LmxvY2spOworCXF1ZXVlX3dvcmsoZGV2aWNlLT5zdWJtaXQud3EsICZkZXZpY2UtPnN1Ym1pdC53b3JrZXIpOwogfQogCiAvKiByZXR1cm5zIHRoZSBuZXcgZHJiZF9yZXF1ZXN0IHBvaW50ZXIsIGlmIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8KQEAgLTEwMzMsMzYgKzEwMzksMzYgQEAKICAqIHJlcXVlc3Qgb24gdGhlIHN1Ym1pdHRlciB0aHJlYWQuCiAgKiBSZXR1cm5zIEVSUl9QVFIoLUVOT01FTSkgaWYgd2UgY2Fubm90IGFsbG9jYXRlIGEgZHJiZF9yZXF1ZXN0LgogICovCi1zdHJ1Y3QgZHJiZF9yZXF1ZXN0ICoKLWRyYmRfcmVxdWVzdF9wcmVwYXJlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQorc3RhdGljIHN0cnVjdCBkcmJkX3JlcXVlc3QgKgorZHJiZF9yZXF1ZXN0X3ByZXBhcmUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQogewogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsKIAogCS8qIGFsbG9jYXRlIG91dHNpZGUgb2YgYWxsIGxvY2tzOyAqLwotCXJlcSA9IGRyYmRfcmVxX25ldyhtZGV2LCBiaW8pOworCXJlcSA9IGRyYmRfcmVxX25ldyhkZXZpY2UsIGJpbyk7CiAJaWYgKCFyZXEpIHsKLQkJZGVjX2FwX2JpbyhtZGV2KTsKKwkJZGVjX2FwX2JpbyhkZXZpY2UpOwogCQkvKiBvbmx5IHBhc3MgdGhlIGVycm9yIHRvIHRoZSB1cHBlciBsYXllcnMuCiAJCSAqIGlmIHVzZXIgY2Fubm90IGhhbmRsZSBpbyBlcnJvcnMsIHRoYXQncyBub3Qgb3VyIGJ1c2luZXNzLiAqLwotCQlkZXZfZXJyKERFViwgImNvdWxkIG5vdCBrbWFsbG9jKCkgcmVxXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiY291bGQgbm90IGttYWxsb2MoKSByZXFcbiIpOwogCQliaW9fZW5kaW8oYmlvLCAtRU5PTUVNKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCXJlcS0+c3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKSB7CisJaWYgKCFnZXRfbGRldihkZXZpY2UpKSB7CiAJCWJpb19wdXQocmVxLT5wcml2YXRlX2Jpbyk7CiAJCXJlcS0+cHJpdmF0ZV9iaW8gPSBOVUxMOwogCX0KIAogCS8qIFVwZGF0ZSBkaXNrIHN0YXRzICovCi0JX2RyYmRfc3RhcnRfaW9fYWNjdChtZGV2LCByZXEpOworCV9kcmJkX3N0YXJ0X2lvX2FjY3QoZGV2aWNlLCByZXEpOwogCiAJaWYgKHJ3ID09IFdSSVRFICYmIHJlcS0+cHJpdmF0ZV9iaW8gJiYgcmVxLT5pLnNpemUKLQkmJiAhdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCWlmICghZHJiZF9hbF9iZWdpbl9pb19mYXN0cGF0aChtZGV2LCAmcmVxLT5pKSkgewotCQkJZHJiZF9xdWV1ZV93cml0ZShtZGV2LCByZXEpOworCSYmICF0ZXN0X2JpdChBTF9TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQlpZiAoIWRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgoZGV2aWNlLCAmcmVxLT5pKSkgeworCQkJZHJiZF9xdWV1ZV93cml0ZShkZXZpY2UsIHJlcSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlyZXEtPnJxX3N0YXRlIHw9IFJRX0lOX0FDVF9MT0c7CkBAIC0xMDcxLDEzICsxMDc3LDEzIEBACiAJcmV0dXJuIHJlcTsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF9zZW5kX2FuZF9zdWJtaXQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxKQorc3RhdGljIHZvaWQgZHJiZF9zZW5kX2FuZF9zdWJtaXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSkKIHsKIAljb25zdCBpbnQgcncgPSBiaW9fcncocmVxLT5tYXN0ZXJfYmlvKTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtID0geyBOVUxMLCB9OwogCWJvb2wgbm9fcmVtb3RlID0gZmFsc2U7CiAKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlpZiAocncgPT0gV1JJVEUpIHsKIAkJLyogVGhpcyBtYXkgdGVtcG9yYXJpbHkgZ2l2ZSB1cCB0aGUgcmVxX2xvY2ssCiAJCSAqIGJ1dCB3aWxsIHJlLWFxdWlyZSBpdCBiZWZvcmUgaXQgcmV0dXJucyBoZXJlLgpAQCAtMTA4NywxNyArMTA5MywxNyBAQAogCiAJCS8qIGNoZWNrIGZvciBjb25nZXN0aW9uLCBhbmQgcG90ZW50aWFsbHkgc3RvcCBzZW5kaW5nCiAJCSAqIGZ1bGwgZGF0YSB1cGRhdGVzLCBidXQgc3RhcnQgc2VuZGluZyAiZGlydHkgYml0cyIgb25seS4gKi8KLQkJbWF5YmVfcHVsbF9haGVhZChtZGV2KTsKKwkJbWF5YmVfcHVsbF9haGVhZChkZXZpY2UpOwogCX0KIAogCi0JaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKSB7CisJaWYgKGRyYmRfc3VzcGVuZGVkKGRldmljZSkpIHsKIAkJLyogcHVzaCBiYWNrIGFuZCByZXRyeTogKi8KIAkJcmVxLT5ycV9zdGF0ZSB8PSBSUV9QT1NUUE9ORUQ7CiAJCWlmIChyZXEtPnByaXZhdGVfYmlvKSB7CiAJCQliaW9fcHV0KHJlcS0+cHJpdmF0ZV9iaW8pOwogCQkJcmVxLT5wcml2YXRlX2JpbyA9IE5VTEw7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCXB1dF9sZGV2KGRldmljZSk7CiAJCX0KIAkJZ290byBvdXQ7CiAJfQpAQCAtMTExMSwxNSArMTExNywxNSBAQAogCX0KIAogCS8qIHdoaWNoIHRyYW5zZmVyIGxvZyBlcG9jaCBkb2VzIHRoaXMgYmVsb25nIHRvPyAqLwotCXJlcS0+ZXBvY2ggPSBhdG9taWNfcmVhZCgmbWRldi0+dGNvbm4tPmN1cnJlbnRfdGxlX25yKTsKKwlyZXEtPmVwb2NoID0gYXRvbWljX3JlYWQoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmN1cnJlbnRfdGxlX25yKTsKIAogCS8qIG5vIHBvaW50IGluIGFkZGluZyBlbXB0eSBmbHVzaGVzIHRvIHRoZSB0cmFuc2ZlciBsb2csCiAJICogdGhleSBhcmUgbWFwcGVkIHRvIGRyYmQgYmFycmllcnMgYWxyZWFkeS4gKi8KIAlpZiAobGlrZWx5KHJlcS0+aS5zaXplIT0wKSkgewogCQlpZiAocncgPT0gV1JJVEUpCi0JCQltZGV2LT50Y29ubi0+Y3VycmVudF90bGVfd3JpdGVzKys7CisJCQlmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5jdXJyZW50X3RsZV93cml0ZXMrKzsKIAotCQlsaXN0X2FkZF90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCAmbWRldi0+dGNvbm4tPnRyYW5zZmVyX2xvZyk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+dGxfcmVxdWVzdHMsICZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT50cmFuc2Zlcl9sb2cpOwogCX0KIAogCWlmIChydyA9PSBXUklURSkgewpAQCAtMTEzOSwxMyArMTE0NSwxMyBAQAogCQkvKiBuZWVkcyB0byBiZSBtYXJrZWQgd2l0aGluIHRoZSBzYW1lIHNwaW5sb2NrICovCiAJCV9yZXFfbW9kKHJlcSwgVE9fQkVfU1VCTUlUVEVEKTsKIAkJLyogYnV0IHdlIG5lZWQgdG8gZ2l2ZSB1cCB0aGUgc3BpbmxvY2sgdG8gc3VibWl0ICovCi0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCWRyYmRfc3VibWl0X3JlcV9wcml2YXRlX2JpbyhyZXEpOwotCQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAJfSBlbHNlIGlmIChub19yZW1vdGUpIHsKIG5vZGF0YToKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZXJyKERFViwgIklPIEVSUk9SOiBuZWl0aGVyIGxvY2FsIG5vciByZW1vdGUgZGF0YSwgc2VjdG9yICVsbHUrJXVcbiIsCisJCQlkcmJkX2VycihkZXZpY2UsICJJTyBFUlJPUjogbmVpdGhlciBsb2NhbCBub3IgcmVtb3RlIGRhdGEsIHNlY3RvciAlbGx1KyV1XG4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcS0+aS5zZWN0b3IsIHJlcS0+aS5zaXplID4+IDkpOwogCQkvKiBBIHdyaXRlIG1heSBoYXZlIGJlZW4gcXVldWVkIGZvciBzZW5kX29vcywgaG93ZXZlci4KIAkJICogU28gd2UgY2FuIG5vdCBzaW1wbHkgZnJlZSBpdCwgd2UgbXVzdCBnbyB0aHJvdWdoIGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZigpICovCkBAIC0xMTU0LDIxICsxMTYwLDIxIEBACiBvdXQ6CiAJaWYgKGRyYmRfcmVxX3B1dF9jb21wbGV0aW9uX3JlZihyZXEsICZtLCAxKSkKIAkJa3JlZl9wdXQoJnJlcS0+a3JlZiwgZHJiZF9yZXFfZGVzdHJveSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIH0KIAotdm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKQordm9pZCBfX2RyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSkKIHsKLQlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBkcmJkX3JlcXVlc3RfcHJlcGFyZShtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGRyYmRfcmVxdWVzdF9wcmVwYXJlKGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIAlpZiAoSVNfRVJSX09SX05VTEwocmVxKSkKIAkJcmV0dXJuOwotCWRyYmRfc2VuZF9hbmRfc3VibWl0KG1kZXYsIHJlcSk7CisJZHJiZF9zZW5kX2FuZF9zdWJtaXQoZGV2aWNlLCByZXEpOwogfQogCi1zdGF0aWMgdm9pZCBzdWJtaXRfZmFzdF9wYXRoKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmluY29taW5nKQorc3RhdGljIHZvaWQgc3VibWl0X2Zhc3RfcGF0aChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGxpc3RfaGVhZCAqaW5jb21pbmcpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCAqdG1wOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgaW5jb21pbmcsIHRsX3JlcXVlc3RzKSB7CkBAIC0xMTc2LDE5ICsxMTgyLDE5IEBACiAKIAkJaWYgKHJ3ID09IFdSSVRFIC8qIHJ3ICE9IFdSSVRFIHNob3VsZCBub3QgZXZlbiBlbmQgdXAgaGVyZSEgKi8KIAkJJiYgcmVxLT5wcml2YXRlX2JpbyAmJiByZXEtPmkuc2l6ZQotCQkmJiAhdGVzdF9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpKSB7Ci0JCQlpZiAoIWRyYmRfYWxfYmVnaW5faW9fZmFzdHBhdGgobWRldiwgJnJlcS0+aSkpCisJCSYmICF0ZXN0X2JpdChBTF9TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKSkgeworCQkJaWYgKCFkcmJkX2FsX2JlZ2luX2lvX2Zhc3RwYXRoKGRldmljZSwgJnJlcS0+aSkpCiAJCQkJY29udGludWU7CiAKIAkJCXJlcS0+cnFfc3RhdGUgfD0gUlFfSU5fQUNUX0xPRzsKIAkJfQogCiAJCWxpc3RfZGVsX2luaXQoJnJlcS0+dGxfcmVxdWVzdHMpOwotCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChtZGV2LCByZXEpOworCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChkZXZpY2UsIHJlcSk7CiAJfQogfQogCi1zdGF0aWMgYm9vbCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgYm9vbCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqaW5jb21pbmcsCiAJCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwZW5kaW5nKQogewpAQCAtMTE5Niw5ICsxMjAyLDkgQEAKIAlpbnQgd2FrZSA9IDA7CiAJaW50IGVycjsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPmFsX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCBpbmNvbWluZywgdGxfcmVxdWVzdHMpIHsKLQkJZXJyID0gZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhtZGV2LCAmcmVxLT5pKTsKKwkJZXJyID0gZHJiZF9hbF9iZWdpbl9pb19ub25ibG9jayhkZXZpY2UsICZyZXEtPmkpOwogCQlpZiAoZXJyID09IC1FQlVTWSkKIAkJCXdha2UgPSAxOwogCQlpZiAoZXJyKQpAQCAtMTIwNiwzMCArMTIxMiwzMCBAQAogCQlyZXEtPnJxX3N0YXRlIHw9IFJRX0lOX0FDVF9MT0c7CiAJCWxpc3RfbW92ZV90YWlsKCZyZXEtPnRsX3JlcXVlc3RzLCBwZW5kaW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5hbF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YWxfbG9jayk7CiAJaWYgKHdha2UpCi0JCXdha2VfdXAoJm1kZXYtPmFsX3dhaXQpOworCQl3YWtlX3VwKCZkZXZpY2UtPmFsX3dhaXQpOwogCiAJcmV0dXJuICFsaXN0X2VtcHR5KHBlbmRpbmcpOwogfQogCiB2b2lkIGRvX3N1Ym1pdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBkcmJkX2NvbmYsIHN1Ym1pdC53b3JrZXIpOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIHN1Ym1pdC53b3JrZXIpOwogCUxJU1RfSEVBRChpbmNvbWluZyk7CiAJTElTVF9IRUFEKHBlbmRpbmcpOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgKnRtcDsKIAogCWZvciAoOzspIHsKLQkJc3Bpbl9sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7Ci0JCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbWRldi0+c3VibWl0LndyaXRlcywgJmluY29taW5nKTsKLQkJc3Bpbl91bmxvY2soJm1kZXYtPnN1Ym1pdC5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKKwkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMsICZpbmNvbWluZyk7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKIAotCQlzdWJtaXRfZmFzdF9wYXRoKG1kZXYsICZpbmNvbWluZyk7CisJCXN1Ym1pdF9mYXN0X3BhdGgoZGV2aWNlLCAmaW5jb21pbmcpOwogCQlpZiAobGlzdF9lbXB0eSgmaW5jb21pbmcpKQogCQkJYnJlYWs7CiAKLQkJd2FpdF9ldmVudChtZGV2LT5hbF93YWl0LCBwcmVwYXJlX2FsX3RyYW5zYWN0aW9uX25vbmJsb2NrKG1kZXYsICZpbmNvbWluZywgJnBlbmRpbmcpKTsKKwkJd2FpdF9ldmVudChkZXZpY2UtPmFsX3dhaXQsIHByZXBhcmVfYWxfdHJhbnNhY3Rpb25fbm9uYmxvY2soZGV2aWNlLCAmaW5jb21pbmcsICZwZW5kaW5nKSk7CiAJCS8qIE1heWJlIG1vcmUgd2FzIHF1ZXVlZCwgd2hpbGUgd2UgcHJlcGFyZWQgdGhlIHRyYW5zYWN0aW9uPwogCQkgKiBUcnkgdG8gc3R1ZmYgdGhlbSBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gYXMgd2VsbC4KIAkJICogQmUgc3RyaWN0bHkgbm9uLWJsb2NraW5nIGhlcmUsIG5vIHdhaXRfZXZlbnQsIHdlIGFscmVhZHkKQEAgLTEyNDMsMTcgKzEyNDksMTcgQEAKIAogCQkJLyogSXQgaXMgb2sgdG8gbG9vayBvdXRzaWRlIHRoZSBsb2NrLAogCQkJICogaXQncyBvbmx5IGFuIG9wdGltaXphdGlvbiBhbnl3YXlzICovCi0JCQlpZiAobGlzdF9lbXB0eSgmbWRldi0+c3VibWl0LndyaXRlcykpCisJCQlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5zdWJtaXQud3JpdGVzKSkKIAkJCQlicmVhazsKIAotCQkJc3Bpbl9sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7Ci0JCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJm1kZXYtPnN1Ym1pdC53cml0ZXMsICZtb3JlX2luY29taW5nKTsKLQkJCXNwaW5fdW5sb2NrKCZtZGV2LT5zdWJtaXQubG9jayk7CisJCQlzcGluX2xvY2soJmRldmljZS0+c3VibWl0LmxvY2spOworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZkZXZpY2UtPnN1Ym1pdC53cml0ZXMsICZtb3JlX2luY29taW5nKTsKKwkJCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnN1Ym1pdC5sb2NrKTsKIAogCQkJaWYgKGxpc3RfZW1wdHkoJm1vcmVfaW5jb21pbmcpKQogCQkJCWJyZWFrOwogCi0JCQltYWRlX3Byb2dyZXNzID0gcHJlcGFyZV9hbF90cmFuc2FjdGlvbl9ub25ibG9jayhtZGV2LCAmbW9yZV9pbmNvbWluZywgJm1vcmVfcGVuZGluZyk7CisJCQltYWRlX3Byb2dyZXNzID0gcHJlcGFyZV9hbF90cmFuc2FjdGlvbl9ub25ibG9jayhkZXZpY2UsICZtb3JlX2luY29taW5nLCAmbW9yZV9wZW5kaW5nKTsKIAogCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZtb3JlX3BlbmRpbmcsICZwZW5kaW5nKTsKIAkJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbW9yZV9pbmNvbWluZywgJmluY29taW5nKTsKQEAgLTEyNjEsMTggKzEyNjcsMTggQEAKIAkJCWlmICghbWFkZV9wcm9ncmVzcykKIAkJCQlicmVhazsKIAkJfQotCQlkcmJkX2FsX2JlZ2luX2lvX2NvbW1pdChtZGV2LCBmYWxzZSk7CisJCWRyYmRfYWxfYmVnaW5faW9fY29tbWl0KGRldmljZSwgZmFsc2UpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgJnBlbmRpbmcsIHRsX3JlcXVlc3RzKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZyZXEtPnRsX3JlcXVlc3RzKTsKLQkJCWRyYmRfc2VuZF9hbmRfc3VibWl0KG1kZXYsIHJlcSk7CisJCQlkcmJkX3NlbmRfYW5kX3N1Ym1pdChkZXZpY2UsIHJlcSk7CiAJCX0KIAl9CiB9CiAKIHZvaWQgZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gKHN0cnVjdCBkcmJkX2NvbmYgKikgcS0+cXVldWVkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBxLT5xdWV1ZWRhdGE7CiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwogCiAJc3RhcnRfdGltZSA9IGppZmZpZXM7CkBAIC0xMjgwLDEwICsxMjg2LDEwIEBACiAJLyoKIAkgKiB3aGF0IHdlICJibGluZGx5IiBhc3N1bWU6CiAJICovCi0JRF9BU1NFUlQoSVNfQUxJR05FRChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwgNTEyKSk7CisJRF9BU1NFUlQoZGV2aWNlLCBJU19BTElHTkVEKGJpby0+YmlfaXRlci5iaV9zaXplLCA1MTIpKTsKIAotCWluY19hcF9iaW8obWRldik7Ci0JX19kcmJkX21ha2VfcmVxdWVzdChtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCWluY19hcF9iaW8oZGV2aWNlKTsKKwlfX2RyYmRfbWFrZV9yZXF1ZXN0KGRldmljZSwgYmlvLCBzdGFydF90aW1lKTsKIH0KIAogLyogVGhpcyBpcyBjYWxsZWQgYnkgYmlvX2FkZF9wYWdlKCkuCkBAIC0xMzAwLDMyICsxMzA2LDMyIEBACiAgKi8KIGludCBkcmJkX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBidmVjX21lcmdlX2RhdGEgKmJ2bSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IChzdHJ1Y3QgZHJiZF9jb25mICopIHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgZHJiZF9kZXZpY2UgKikgcS0+cXVldWVkYXRhOwogCXVuc2lnbmVkIGludCBiaW9fc2l6ZSA9IGJ2bS0+Ymlfc2l6ZTsKIAlpbnQgbGltaXQgPSBEUkJEX01BWF9CSU9fU0laRTsKIAlpbnQgYmFja2luZ19saW1pdDsKIAotCWlmIChiaW9fc2l6ZSAmJiBnZXRfbGRldihtZGV2KSkgeworCWlmIChiaW9fc2l6ZSAmJiBnZXRfbGRldihkZXZpY2UpKSB7CiAJCXVuc2lnbmVkIGludCBtYXhfaHdfc2VjdG9ycyA9IHF1ZXVlX21heF9od19zZWN0b3JzKHEpOwogCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIGNvbnN0IGIgPQotCQkJbWRldi0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKKwkJCWRldmljZS0+bGRldi0+YmFja2luZ19iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKIAkJaWYgKGItPm1lcmdlX2J2ZWNfZm4pIHsKIAkJCWJhY2tpbmdfbGltaXQgPSBiLT5tZXJnZV9idmVjX2ZuKGIsIGJ2bSwgYnZlYyk7CiAJCQlsaW1pdCA9IG1pbihsaW1pdCwgYmFja2luZ19saW1pdCk7CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJCWlmICgobGltaXQgPj4gOSkgPiBtYXhfaHdfc2VjdG9ycykKIAkJCWxpbWl0ID0gbWF4X2h3X3NlY3RvcnMgPDwgOTsKIAl9CiAJcmV0dXJuIGxpbWl0OwogfQogCi1zdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpmaW5kX29sZGVzdF9yZXF1ZXN0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK3N0YXRpYyBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpmaW5kX29sZGVzdF9yZXF1ZXN0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCiB7CiAJLyogV2FsayB0aGUgdHJhbnNmZXIgbG9nLAogCSAqIGFuZCBmaW5kIHRoZSBvbGRlc3Qgbm90IHlldCBjb21wbGV0ZWQgcmVxdWVzdCAqLwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnI7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmdGNvbm4tPnRyYW5zZmVyX2xvZywgdGxfcmVxdWVzdHMpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZjb25uZWN0aW9uLT50cmFuc2Zlcl9sb2csIHRsX3JlcXVlc3RzKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmci0+Y29tcGxldGlvbl9yZWYpKQogCQkJcmV0dXJuIHI7CiAJfQpAQCAtMTMzNCwyMSArMTM0MCwyMSBAQAogCiB2b2lkIHJlcXVlc3RfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcTsgLyogb2xkZXN0IHJlcXVlc3QgKi8KIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwogCXVuc2lnbmVkIGxvbmcgZW50ID0gMCwgZHQgPSAwLCBldCwgbnQ7IC8qIGVmZmVjdGl2ZSB0aW1lb3V0ID0ga29fY291bnQgKiB0aW1lb3V0ICovCiAJdW5zaWduZWQgbG9uZyBub3c7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmMgPSByY3VfZGVyZWZlcmVuY2UodGNvbm4tPm5ldF9jb25mKTsKLQlpZiAobmMgJiYgbWRldi0+c3RhdGUuY29ubiA+PSBDX1dGX1JFUE9SVF9QQVJBTVMpCisJbmMgPSByY3VfZGVyZWZlcmVuY2UoY29ubmVjdGlvbi0+bmV0X2NvbmYpOworCWlmIChuYyAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19XRl9SRVBPUlRfUEFSQU1TKQogCQllbnQgPSBuYy0+dGltZW91dCAqIEhaLzEwICogbmMtPmtvX2NvdW50OwogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7IC8qIGltcGxpY2l0IHN0YXRlLmRpc2sgPj0gRF9JTkNPTlNJU1RFTlQgKi8KLQkJZHQgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKS0+ZGlza190aW1lb3V0ICogSFogLyAxMDsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsgLyogaW1wbGljaXQgc3RhdGUuZGlzayA+PSBEX0lOQ09OU0lTVEVOVCAqLworCQlkdCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmRpc2tfdGltZW91dCAqIEhaIC8gMTA7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC0xMzU5LDExICsxMzY1LDExIEBACiAKIAlub3cgPSBqaWZmaWVzOwogCi0Jc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKLQlyZXEgPSBmaW5kX29sZGVzdF9yZXF1ZXN0KHRjb25uKTsKKwlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcmVxID0gZmluZF9vbGRlc3RfcmVxdWVzdChjb25uZWN0aW9uKTsKIAlpZiAoIXJlcSkgewotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgbm93ICsgZXQpOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlcXVlc3RfdGltZXIsIG5vdyArIGV0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM4NSwxNyArMTM5MSwxNyBAQAogCSAqLwogCWlmIChlbnQgJiYgcmVxLT5ycV9zdGF0ZSAmIFJRX05FVF9QRU5ESU5HICYmCiAJCSB0aW1lX2FmdGVyKG5vdywgcmVxLT5zdGFydF90aW1lICsgZW50KSAmJgotCQkhdGltZV9pbl9yYW5nZShub3csIHRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYsIHRjb25uLT5sYXN0X3JlY29ubmVjdF9qaWYgKyBlbnQpKSB7Ci0JCWRldl93YXJuKERFViwgIlJlbW90ZSBmYWlsZWQgdG8gZmluaXNoIGEgcmVxdWVzdCB3aXRoaW4ga28tY291bnQgKiB0aW1lb3V0XG4iKTsKLQkJX2RyYmRfc2V0X3N0YXRlKF9OUyhtZGV2LCBjb25uLCBDX1RJTUVPVVQpLCBDU19WRVJCT1NFIHwgQ1NfSEFSRCwgTlVMTCk7CisJCSF0aW1lX2luX3JhbmdlKG5vdywgY29ubmVjdGlvbi0+bGFzdF9yZWNvbm5lY3RfamlmLCBjb25uZWN0aW9uLT5sYXN0X3JlY29ubmVjdF9qaWYgKyBlbnQpKSB7CisJCWRyYmRfd2FybihkZXZpY2UsICJSZW1vdGUgZmFpbGVkIHRvIGZpbmlzaCBhIHJlcXVlc3Qgd2l0aGluIGtvLWNvdW50ICogdGltZW91dFxuIik7CisJCV9kcmJkX3NldF9zdGF0ZShfTlMoZGV2aWNlLCBjb25uLCBDX1RJTUVPVVQpLCBDU19WRVJCT1NFIHwgQ1NfSEFSRCwgTlVMTCk7CiAJfQotCWlmIChkdCAmJiByZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfUEVORElORyAmJiByZXEtPncubWRldiA9PSBtZGV2ICYmCisJaWYgKGR0ICYmIHJlcS0+cnFfc3RhdGUgJiBSUV9MT0NBTF9QRU5ESU5HICYmIHJlcS0+ZGV2aWNlID09IGRldmljZSAmJgogCQkgdGltZV9hZnRlcihub3csIHJlcS0+c3RhcnRfdGltZSArIGR0KSAmJgotCQkhdGltZV9pbl9yYW5nZShub3csIG1kZXYtPmxhc3RfcmVhdHRhY2hfamlmLCBtZGV2LT5sYXN0X3JlYXR0YWNoX2ppZiArIGR0KSkgewotCQlkZXZfd2FybihERVYsICJMb2NhbCBiYWNraW5nIGRldmljZSBmYWlsZWQgdG8gbWVldCB0aGUgZGlzay10aW1lb3V0XG4iKTsKLQkJX19kcmJkX2Noa19pb19lcnJvcihtZGV2LCBEUkJEX0ZPUkNFX0RFVEFDSCk7CisJCSF0aW1lX2luX3JhbmdlKG5vdywgZGV2aWNlLT5sYXN0X3JlYXR0YWNoX2ppZiwgZGV2aWNlLT5sYXN0X3JlYXR0YWNoX2ppZiArIGR0KSkgeworCQlkcmJkX3dhcm4oZGV2aWNlLCAiTG9jYWwgYmFja2luZyBkZXZpY2UgZmFpbGVkIHRvIG1lZXQgdGhlIGRpc2stdGltZW91dFxuIik7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX0ZPUkNFX0RFVEFDSCk7CiAJfQogCW50ID0gKHRpbWVfYWZ0ZXIobm93LCByZXEtPnN0YXJ0X3RpbWUgKyBldCkgPyBub3cgOiByZXEtPnN0YXJ0X3RpbWUpICsgZXQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCW1vZF90aW1lcigmbWRldi0+cmVxdWVzdF90aW1lciwgbnQpOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwltb2RfdGltZXIoJmRldmljZS0+cmVxdWVzdF90aW1lciwgbnQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZXEuaAppbmRleCAyOGUxNWQ5Li5jNjg0Yzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZXEuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZXEuaApAQCAtMjc1LDE3ICsyNzUsMTcgQEAKIAlpbnQgZXJyb3I7CiB9OwogCi1leHRlcm4gdm9pZCBzdGFydF9uZXdfdGxfZXBvY2goc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKK2V4dGVybiB2b2lkIHN0YXJ0X25ld190bF9lcG9jaChzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKIGV4dGVybiB2b2lkIGRyYmRfcmVxX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpOwogZXh0ZXJuIHZvaWQgX3JlcV9tYXlfYmVfZG9uZShzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEsCiAJCXN0cnVjdCBiaW9fYW5kX2Vycm9yICptKTsKIGV4dGVybiBpbnQgX19yZXFfbW9kKHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0LAogCQlzdHJ1Y3QgYmlvX2FuZF9lcnJvciAqbSk7Ci1leHRlcm4gdm9pZCBjb21wbGV0ZV9tYXN0ZXJfYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitleHRlcm4gdm9pZCBjb21wbGV0ZV9tYXN0ZXJfYmlvKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQlzdHJ1Y3QgYmlvX2FuZF9lcnJvciAqbSk7CiBleHRlcm4gdm9pZCByZXF1ZXN0X3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1leHRlcm4gdm9pZCB0bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KTsKLWV4dGVybiB2b2lkIF90bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KTsKK2V4dGVybiB2b2lkIHRsX3Jlc3RhcnQoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0KTsKK2V4dGVybiB2b2lkIF90bF9yZXN0YXJ0KHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCk7CiAKIC8qIHRoaXMgaXMgaW4gZHJiZF9tYWluLmMgKi8KIGV4dGVybiB2b2lkIGRyYmRfcmVzdGFydF9yZXF1ZXN0KHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSk7CkBAIC0yOTQsMTQgKzI5NCwxNCBAQAogICogb3V0c2lkZSB0aGUgc3BpbmxvY2ssIGUuZy4gd2hlbiB3YWxraW5nIHNvbWUgbGlzdCBvbiBjbGVhbnVwLiAqLwogc3RhdGljIGlubGluZSBpbnQgX3JlcV9tb2Qoc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxLCBlbnVtIGRyYmRfcmVxX2V2ZW50IHdoYXQpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHJlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CiAJc3RydWN0IGJpb19hbmRfZXJyb3IgbTsKIAlpbnQgcnY7CiAKIAkvKiBfX3JlcV9tb2QgcG9zc2libHkgZnJlZXMgcmVxLCBkbyBub3QgdG91Y2ggcmVxIGFmdGVyIHRoYXQhICovCiAJcnYgPSBfX3JlcV9tb2QocmVxLCB3aGF0LCAmbSk7CiAJaWYgKG0uYmlvKQotCQljb21wbGV0ZV9tYXN0ZXJfYmlvKG1kZXYsICZtKTsKKwkJY29tcGxldGVfbWFzdGVyX2JpbyhkZXZpY2UsICZtKTsKIAogCXJldHVybiBydjsKIH0KQEAgLTMxNCwxNiArMzE0LDE2IEBACiAJCWVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSByZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHJlcS0+ZGV2aWNlOwogCXN0cnVjdCBiaW9fYW5kX2Vycm9yIG07CiAJaW50IHJ2OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCXJ2ID0gX19yZXFfbW9kKHJlcSwgd2hhdCwgJm0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAKIAlpZiAobS5iaW8pCi0JCWNvbXBsZXRlX21hc3Rlcl9iaW8obWRldiwgJm0pOworCQljb21wbGV0ZV9tYXN0ZXJfYmlvKGRldmljZSwgJm0pOwogCiAJcmV0dXJuIHJ2OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmMKaW5kZXggMjE2ZDQ3Yi4uMWE4NDM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuYworKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdGF0ZS5jCkBAIC0yNywxMyArMjcsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RyYmRfbGltaXRzLmg+CiAjaW5jbHVkZSAiZHJiZF9pbnQuaCIKKyNpbmNsdWRlICJkcmJkX3Byb3RvY29sLmgiCiAjaW5jbHVkZSAiZHJiZF9yZXEuaCIKIAotLyogaW4gZHJiZF9tYWluLmMgKi8KLWV4dGVybiB2b2lkIHRsX2Fib3J0X2Rpc2tfaW8oc3RydWN0IGRyYmRfY29uZiAqbWRldik7Ci0KIHN0cnVjdCBhZnRlcl9zdGF0ZV9jaGdfd29yayB7CiAJc3RydWN0IGRyYmRfd29yayB3OworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlOwogCXVuaW9uIGRyYmRfc3RhdGUgb3M7CiAJdW5pb24gZHJiZF9zdGF0ZSBuczsKIAllbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFnczsKQEAgLTUwLDEyICs0OSwxMiBAQAogfTsKIAogc3RhdGljIGludCB3X2FmdGVyX3N0YXRlX2NoKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCB1bnVzZWQpOwotc3RhdGljIHZvaWQgYWZ0ZXJfc3RhdGVfY2goc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBvcywKK3N0YXRpYyB2b2lkIGFmdGVyX3N0YXRlX2NoKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG9zLAogCQkJICAgdW5pb24gZHJiZF9zdGF0ZSBucywgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpOwotc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydiBpc192YWxpZF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICosIHVuaW9uIGRyYmRfc3RhdGUpOwotc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydiBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24odW5pb24gZHJiZF9zdGF0ZSwgdW5pb24gZHJiZF9zdGF0ZSwgc3RydWN0IGRyYmRfdGNvbm4gKik7CitzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2IGlzX3ZhbGlkX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqLCB1bmlvbiBkcmJkX3N0YXRlKTsKK3N0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYgaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKHVuaW9uIGRyYmRfc3RhdGUsIHVuaW9uIGRyYmRfc3RhdGUsIHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKik7CiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2IGlzX3ZhbGlkX3RyYW5zaXRpb24odW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucyk7Ci1zdGF0aWMgdW5pb24gZHJiZF9zdGF0ZSBzYW5pdGl6ZV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG5zLAorc3RhdGljIHVuaW9uIGRyYmRfc3RhdGUgc2FuaXRpemVfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCiAJCQkJICAgICAgIGVudW0gc2FuaXRpemVfc3RhdGVfd2FybmluZ3MgKndhcm4pOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfc3VzcCh1bmlvbiBkcmJkX3N0YXRlIHMpCkBAIC02MywxNyArNjIsMTggQEAKICAgICAgICAgcmV0dXJuIHMuc3VzcCB8fCBzLnN1c3Bfbm9kIHx8IHMuc3VzcF9mZW47CiB9CiAKLWJvb2wgY29ubl9hbGxfdm9sc191bmNvbmYoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorYm9vbCBjb25uX2FsbF92b2xzX3VuY29uZihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWJvb2wgcnYgPSB0cnVlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7Ci0JCWlmIChtZGV2LT5zdGF0ZS5kaXNrICE9IERfRElTS0xFU1MgfHwKLQkJICAgIG1kZXYtPnN0YXRlLmNvbm4gIT0gQ19TVEFOREFMT05FIHx8Ci0JCSAgICBtZGV2LT5zdGF0ZS5yb2xlICE9IFJfU0VDT05EQVJZKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrICE9IERfRElTS0xFU1MgfHwKKwkJICAgIGRldmljZS0+c3RhdGUuY29ubiAhPSBDX1NUQU5EQUxPTkUgfHwKKwkJICAgIGRldmljZS0+c3RhdGUucm9sZSAhPSBSX1NFQ09OREFSWSkgewogCQkJcnYgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMDIsOTkgKzEwMiwxMTEgQEAKIAlyZXR1cm4gUl9QUklNQVJZOwogfQogCi1lbnVtIGRyYmRfcm9sZSBjb25uX2hpZ2hlc3Rfcm9sZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitlbnVtIGRyYmRfcm9sZSBjb25uX2hpZ2hlc3Rfcm9sZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9yb2xlIHJvbGUgPSBSX1VOS05PV047Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCXJvbGUgPSBtYXhfcm9sZShyb2xlLCBtZGV2LT5zdGF0ZS5yb2xlKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCXJvbGUgPSBtYXhfcm9sZShyb2xlLCBkZXZpY2UtPnN0YXRlLnJvbGUpOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiByb2xlOwogfQogCi1lbnVtIGRyYmRfcm9sZSBjb25uX2hpZ2hlc3RfcGVlcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitlbnVtIGRyYmRfcm9sZSBjb25uX2hpZ2hlc3RfcGVlcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9yb2xlIHBlZXIgPSBSX1VOS05PV047Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2U7CiAJaW50IHZucjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpCi0JCXBlZXIgPSBtYXhfcm9sZShwZWVyLCBtZGV2LT5zdGF0ZS5wZWVyKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCXBlZXIgPSBtYXhfcm9sZShwZWVyLCBkZXZpY2UtPnN0YXRlLnBlZXIpOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBwZWVyOwogfQogCi1lbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfZGlzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfZGlzayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9kaXNrX3N0YXRlIGRzID0gRF9ESVNLTEVTUzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikKLQkJZHMgPSBtYXhfdChlbnVtIGRyYmRfZGlza19zdGF0ZSwgZHMsIG1kZXYtPnN0YXRlLmRpc2spOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJZHMgPSBtYXhfdChlbnVtIGRyYmRfZGlza19zdGF0ZSwgZHMsIGRldmljZS0+c3RhdGUuZGlzayk7CisJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIGRzOwogfQogCi1lbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2xvd2VzdF9kaXNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubikKK2VudW0gZHJiZF9kaXNrX3N0YXRlIGNvbm5fbG93ZXN0X2Rpc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfZGlza19zdGF0ZSBkcyA9IERfTUFTSzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikKLQkJZHMgPSBtaW5fdChlbnVtIGRyYmRfZGlza19zdGF0ZSwgZHMsIG1kZXYtPnN0YXRlLmRpc2spOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJZHMgPSBtaW5fdChlbnVtIGRyYmRfZGlza19zdGF0ZSwgZHMsIGRldmljZS0+c3RhdGUuZGlzayk7CisJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIGRzOwogfQogCi1lbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfcGRzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfcGRzayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9kaXNrX3N0YXRlIGRzID0gRF9ESVNLTEVTUzsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikKLQkJZHMgPSBtYXhfdChlbnVtIGRyYmRfZGlza19zdGF0ZSwgZHMsIG1kZXYtPnN0YXRlLnBkc2spOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJZHMgPSBtYXhfdChlbnVtIGRyYmRfZGlza19zdGF0ZSwgZHMsIGRldmljZS0+c3RhdGUucGRzayk7CisJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIGRzOwogfQogCi1lbnVtIGRyYmRfY29ubnMgY29ubl9sb3dlc3RfY29ubihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitlbnVtIGRyYmRfY29ubnMgY29ubl9sb3dlc3RfY29ubihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCWVudW0gZHJiZF9jb25ucyBjb25uID0gQ19NQVNLOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKQotCQljb25uID0gbWluX3QoZW51bSBkcmJkX2Nvbm5zLCBjb25uLCBtZGV2LT5zdGF0ZS5jb25uKTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCWNvbm4gPSBtaW5fdChlbnVtIGRyYmRfY29ubnMsIGNvbm4sIGRldmljZS0+c3RhdGUuY29ubik7CisJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIGNvbm47CiB9CiAKLXN0YXRpYyBib29sIG5vX3BlZXJfd2ZfcmVwb3J0X3BhcmFtcyhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitzdGF0aWMgYm9vbCBub19wZWVyX3dmX3JlcG9ydF9wYXJhbXMoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCWJvb2wgcnYgPSB0cnVlOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikKLQkJaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpCisJCWlmIChwZWVyX2RldmljZS0+ZGV2aWNlLT5zdGF0ZS5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykgewogCQkJcnYgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMDYsMTEgKzIxOCwxMSBAQAogCiAvKioKICAqIGNsX3dpZGVfc3RfY2hnKCkgLSB0cnVlIGlmIHRoZSBzdGF0ZSBjaGFuZ2UgaXMgYSBjbHVzdGVyIHdpZGUgb25lCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBvczoJCW9sZCAoY3VycmVudCkgc3RhdGUuCiAgKiBAbnM6CQluZXcgKHdhbnRlZCkgc3RhdGUuCiAgKi8KLXN0YXRpYyBpbnQgY2xfd2lkZV9zdF9jaGcoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK3N0YXRpYyBpbnQgY2xfd2lkZV9zdF9jaGcoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkgIHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMpCiB7CiAJcmV0dXJuIChvcy5jb25uID49IENfQ09OTkVDVEVEICYmIG5zLmNvbm4gPj0gQ19DT05ORUNURUQgJiYKQEAgLTIzMiw3MiArMjQ0LDcyIEBACiB9CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotZHJiZF9jaGFuZ2Vfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZiwKK2RyYmRfY2hhbmdlX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmLAogCQkgIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zOwogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQlucyA9IGFwcGx5X21hc2tfdmFsKGRyYmRfcmVhZF9zdGF0ZShtZGV2KSwgbWFzaywgdmFsKTsKLQlydiA9IF9kcmJkX3NldF9zdGF0ZShtZGV2LCBucywgZiwgTlVMTCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJbnMgPSBhcHBseV9tYXNrX3ZhbChkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKSwgbWFzaywgdmFsKTsKKwlydiA9IF9kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBmLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJ2OwogfQogCiAvKioKICAqIGRyYmRfZm9yY2Vfc3RhdGUoKSAtIEltcG9zZSBhIGNoYW5nZSB3aGljaCBoYXBwZW5zIG91dHNpZGUgb3VyIGNvbnRyb2wgb24gb3VyIHN0YXRlCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBtYXNrOgltYXNrIG9mIHN0YXRlIGJpdHMgdG8gY2hhbmdlLgogICogQHZhbDoJdmFsdWUgb2YgbmV3IHN0YXRlIGJpdHMuCiAgKi8KLXZvaWQgZHJiZF9mb3JjZV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAordm9pZCBkcmJkX2ZvcmNlX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCXVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwpCiB7Ci0JZHJiZF9jaGFuZ2Vfc3RhdGUobWRldiwgQ1NfSEFSRCwgbWFzaywgdmFsKTsKKwlkcmJkX2NoYW5nZV9zdGF0ZShkZXZpY2UsIENTX0hBUkQsIG1hc2ssIHZhbCk7CiB9CiAKIHN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYKLV9yZXFfc3RfY29uZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssCitfcmVxX3N0X2NvbmQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKIAkgICAgIHVuaW9uIGRyYmRfc3RhdGUgdmFsKQogewogCXVuaW9uIGRyYmRfc3RhdGUgb3MsIG5zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDTF9TVF9DSEdfU1VDQ0VTUywgJm1kZXYtPmZsYWdzKSkKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENMX1NUX0NIR19TVUNDRVNTLCAmZGV2aWNlLT5mbGFncykpCiAJCXJldHVybiBTU19DV19TVUNDRVNTOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDTF9TVF9DSEdfRkFJTCwgJm1kZXYtPmZsYWdzKSkKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENMX1NUX0NIR19GQUlMLCAmZGV2aWNlLT5mbGFncykpCiAJCXJldHVybiBTU19DV19GQUlMRURfQllfUEVFUjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKLQlucyA9IHNhbml0aXplX3N0YXRlKG1kZXYsIGFwcGx5X21hc2tfdmFsKG9zLCBtYXNrLCB2YWwpLCBOVUxMKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwlvcyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOworCW5zID0gc2FuaXRpemVfc3RhdGUoZGV2aWNlLCBhcHBseV9tYXNrX3ZhbChvcywgbWFzaywgdmFsKSwgTlVMTCk7CiAJcnYgPSBpc192YWxpZF90cmFuc2l0aW9uKG9zLCBucyk7CiAJaWYgKHJ2ID49IFNTX1NVQ0NFU1MpCiAJCXJ2ID0gU1NfVU5LTk9XTl9FUlJPUjsgIC8qIGNvbnQgd2FpdGluZywgb3RoZXJ3aXNlIGZhaWwuICovCiAKLQlpZiAoIWNsX3dpZGVfc3RfY2hnKG1kZXYsIG9zLCBucykpCisJaWYgKCFjbF93aWRlX3N0X2NoZyhkZXZpY2UsIG9zLCBucykpCiAJCXJ2ID0gU1NfQ1dfTk9fTkVFRDsKIAlpZiAocnYgPT0gU1NfVU5LTk9XTl9FUlJPUikgewotCQlydiA9IGlzX3ZhbGlkX3N0YXRlKG1kZXYsIG5zKTsKKwkJcnYgPSBpc192YWxpZF9zdGF0ZShkZXZpY2UsIG5zKTsKIAkJaWYgKHJ2ID49IFNTX1NVQ0NFU1MpIHsKLQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgbWRldi0+dGNvbm4pOworCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAkJCWlmIChydiA+PSBTU19TVUNDRVNTKQogCQkJCXJ2ID0gU1NfVU5LTk9XTl9FUlJPUjsgLyogY29udCB3YWl0aW5nLCBvdGhlcndpc2UgZmFpbC4gKi8KIAkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJ2OwogfQogCiAvKioKICAqIGRyYmRfcmVxX3N0YXRlKCkgLSBQZXJmb3JtIGFuIGV2ZW50dWFsbHkgY2x1c3RlciB3aWRlIHN0YXRlIGNoYW5nZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbWFzazoJbWFzayBvZiBzdGF0ZSBiaXRzIHRvIGNoYW5nZS4KICAqIEB2YWw6CXZhbHVlIG9mIG5ldyBzdGF0ZSBiaXRzLgogICogQGY6CQlmbGFncwpAQCAtMzA2LDcgKzMxOCw3IEBACiAgKiBfZHJiZF9yZXF1ZXN0X3N0YXRlKCkuCiAgKi8KIHN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYKLWRyYmRfcmVxX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywKK2RyYmRfcmVxX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssCiAJICAgICAgIHVuaW9uIGRyYmRfc3RhdGUgdmFsLCBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmKQogewogCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CkBAIC0zMTcsNjggKzMyOSw2OCBAQAogCWluaXRfY29tcGxldGlvbigmZG9uZSk7CiAKIAlpZiAoZiAmIENTX1NFUklBTElaRSkKLQkJbXV0ZXhfbG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJCW11dGV4X2xvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7Ci0Jb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7Ci0JbnMgPSBzYW5pdGl6ZV9zdGF0ZShtZGV2LCBhcHBseV9tYXNrX3ZhbChvcywgbWFzaywgdmFsKSwgTlVMTCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CisJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKKwlucyA9IHNhbml0aXplX3N0YXRlKGRldmljZSwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOwogCXJ2ID0gaXNfdmFsaWRfdHJhbnNpdGlvbihvcywgbnMpOwogCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAJCWdvdG8gYWJvcnQ7CiAJfQogCi0JaWYgKGNsX3dpZGVfc3RfY2hnKG1kZXYsIG9zLCBucykpIHsKLQkJcnYgPSBpc192YWxpZF9zdGF0ZShtZGV2LCBucyk7CisJaWYgKGNsX3dpZGVfc3RfY2hnKGRldmljZSwgb3MsIG5zKSkgeworCQlydiA9IGlzX3ZhbGlkX3N0YXRlKGRldmljZSwgbnMpOwogCQlpZiAocnYgPT0gU1NfU1VDQ0VTUykKLQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgbWRldi0+dGNvbm4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewogCQkJaWYgKGYgJiBDU19WRVJCT1NFKQotCQkJCXByaW50X3N0X2VycihtZGV2LCBvcywgbnMsIHJ2KTsKKwkJCQlwcmludF9zdF9lcnIoZGV2aWNlLCBvcywgbnMsIHJ2KTsKIAkJCWdvdG8gYWJvcnQ7CiAJCX0KIAotCQlpZiAoZHJiZF9zZW5kX3N0YXRlX3JlcShtZGV2LCBtYXNrLCB2YWwpKSB7CisJCWlmIChkcmJkX3NlbmRfc3RhdGVfcmVxKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG1hc2ssIHZhbCkpIHsKIAkJCXJ2ID0gU1NfQ1dfRkFJTEVEX0JZX1BFRVI7CiAJCQlpZiAoZiAmIENTX1ZFUkJPU0UpCi0JCQkJcHJpbnRfc3RfZXJyKG1kZXYsIG9zLCBucywgcnYpOworCQkJCXByaW50X3N0X2VycihkZXZpY2UsIG9zLCBucywgcnYpOwogCQkJZ290byBhYm9ydDsKIAkJfQogCi0JCXdhaXRfZXZlbnQobWRldi0+c3RhdGVfd2FpdCwKLQkJCShydiA9IF9yZXFfc3RfY29uZChtZGV2LCBtYXNrLCB2YWwpKSk7CisJCXdhaXRfZXZlbnQoZGV2aWNlLT5zdGF0ZV93YWl0LAorCQkJKHJ2ID0gX3JlcV9zdF9jb25kKGRldmljZSwgbWFzaywgdmFsKSkpOwogCiAJCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKIAkJCWlmIChmICYgQ1NfVkVSQk9TRSkKLQkJCQlwcmludF9zdF9lcnIobWRldiwgb3MsIG5zLCBydik7CisJCQkJcHJpbnRfc3RfZXJyKGRldmljZSwgb3MsIG5zLCBydik7CiAJCQlnb3RvIGFib3J0OwogCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQkJbnMgPSBhcHBseV9tYXNrX3ZhbChkcmJkX3JlYWRfc3RhdGUobWRldiksIG1hc2ssIHZhbCk7Ci0JCXJ2ID0gX2RyYmRfc2V0X3N0YXRlKG1kZXYsIG5zLCBmLCAmZG9uZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOworCQlucyA9IGFwcGx5X21hc2tfdmFsKGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpLCBtYXNrLCB2YWwpOworCQlydiA9IF9kcmJkX3NldF9zdGF0ZShkZXZpY2UsIG5zLCBmLCAmZG9uZSk7CiAJfSBlbHNlIHsKLQkJcnYgPSBfZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIGYsICZkb25lKTsKKwkJcnYgPSBfZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgZiwgJmRvbmUpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoZiAmIENTX1dBSVRfQ09NUExFVEUgJiYgcnYgPT0gU1NfU1VDQ0VTUykgewotCQlEX0FTU0VSVChjdXJyZW50ICE9IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJCURfQVNTRVJUKGRldmljZSwgY3VycmVudCAhPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT53b3JrZXIudGFzayk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOwogCX0KIAogYWJvcnQ6CiAJaWYgKGYgJiBDU19TRVJJQUxJWkUpCi0JCW11dGV4X3VubG9jayhtZGV2LT5zdGF0ZV9tdXRleCk7CisJCW11dGV4X3VubG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKIAogCXJldHVybiBydjsKIH0KIAogLyoqCiAgKiBfZHJiZF9yZXF1ZXN0X3N0YXRlKCkgLSBSZXF1ZXN0IGEgc3RhdGUgY2hhbmdlICh3aXRoIGZsYWdzKQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbWFzazoJbWFzayBvZiBzdGF0ZSBiaXRzIHRvIGNoYW5nZS4KICAqIEB2YWw6CXZhbHVlIG9mIG5ldyBzdGF0ZSBiaXRzLgogICogQGY6CQlmbGFncwpAQCAtMzg3LDIwICszOTksMjAgQEAKICAqIGZsYWcsIG9yIHdoZW4gbG9nZ2luZyBvZiBmYWlsZWQgc3RhdGUgY2hhbmdlIHJlcXVlc3RzIGlzIG5vdCBkZXNpcmVkLgogICovCiBlbnVtIGRyYmRfc3RhdGVfcnYKLV9kcmJkX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAorX2RyYmRfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAogCQkgICAgdW5pb24gZHJiZF9zdGF0ZSB2YWwsIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGYpCiB7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCi0Jd2FpdF9ldmVudChtZGV2LT5zdGF0ZV93YWl0LAotCQkgICAocnYgPSBkcmJkX3JlcV9zdGF0ZShtZGV2LCBtYXNrLCB2YWwsIGYpKSAhPSBTU19JTl9UUkFOU0lFTlRfU1RBVEUpOworCXdhaXRfZXZlbnQoZGV2aWNlLT5zdGF0ZV93YWl0LAorCQkgICAocnYgPSBkcmJkX3JlcV9zdGF0ZShkZXZpY2UsIG1hc2ssIHZhbCwgZikpICE9IFNTX0lOX1RSQU5TSUVOVF9TVEFURSk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3N0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNoYXIgKm5hbWUsIHVuaW9uIGRyYmRfc3RhdGUgbnMpCitzdGF0aWMgdm9pZCBwcmludF9zdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgY2hhciAqbmFtZSwgdW5pb24gZHJiZF9zdGF0ZSBucykKIHsKLQlkZXZfZXJyKERFViwgIiAlcyA9IHsgY3M6JXMgcm86JXMvJXMgZHM6JXMvJXMgJWMlYyVjJWMlYyVjIH1cbiIsCisJZHJiZF9lcnIoZGV2aWNlLCAiICVzID0geyBjczolcyBybzolcy8lcyBkczolcy8lcyAlYyVjJWMlYyVjJWMgfVxuIiwKIAkgICAgbmFtZSwKIAkgICAgZHJiZF9jb25uX3N0cihucy5jb25uKSwKIAkgICAgZHJiZF9yb2xlX3N0cihucy5yb2xlKSwKQEAgLTQxNiwxNCArNDI4LDE0IEBACiAJICAgICk7CiB9CiAKLXZvaWQgcHJpbnRfc3RfZXJyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgb3MsCit2b2lkIHByaW50X3N0X2VycihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBvcywKIAkgICAgICAgICAgdW5pb24gZHJiZF9zdGF0ZSBucywgZW51bSBkcmJkX3N0YXRlX3J2IGVycikKIHsKIAlpZiAoZXJyID09IFNTX0lOX1RSQU5TSUVOVF9TVEFURSkKIAkJcmV0dXJuOwotCWRldl9lcnIoREVWLCAiU3RhdGUgY2hhbmdlIGZhaWxlZDogJXNcbiIsIGRyYmRfc2V0X3N0X2Vycl9zdHIoZXJyKSk7Ci0JcHJpbnRfc3QobWRldiwgIiBzdGF0ZSIsIG9zKTsKLQlwcmludF9zdChtZGV2LCAid2FudGVkIiwgbnMpOworCWRyYmRfZXJyKGRldmljZSwgIlN0YXRlIGNoYW5nZSBmYWlsZWQ6ICVzXG4iLCBkcmJkX3NldF9zdF9lcnJfc3RyKGVycikpOworCXByaW50X3N0KGRldmljZSwgIiBzdGF0ZSIsIG9zKTsKKwlwcmludF9zdChkZXZpY2UsICJ3YW50ZWQiLCBucyk7CiB9CiAKIHN0YXRpYyBsb25nIHByaW50X3N0YXRlX2NoYW5nZShjaGFyICpwYiwgdW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywKQEAgLTQ1Nyw3ICs0NjksNyBAQAogCXJldHVybiBwYnAgLSBwYjsKIH0KIAotc3RhdGljIHZvaWQgZHJiZF9wcl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywKK3N0YXRpYyB2b2lkIGRyYmRfcHJfc3RhdGVfY2hhbmdlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG9zLCB1bmlvbiBkcmJkX3N0YXRlIG5zLAogCQkJCSBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKIAljaGFyIHBiWzMwMF07CkBAIC00NzksMTAgKzQ5MSwxMCBAQAogCQkJICAgICAgIG5zLnVzZXJfaXNwKTsKIAogCWlmIChwYnAgIT0gcGIpCi0JCWRldl9pbmZvKERFViwgIiVzXG4iLCBwYik7CisJCWRyYmRfaW5mbyhkZXZpY2UsICIlc1xuIiwgcGIpOwogfQogCi1zdGF0aWMgdm9pZCBjb25uX3ByX3N0YXRlX2NoYW5nZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgb3MsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCitzdGF0aWMgdm9pZCBjb25uX3ByX3N0YXRlX2NoYW5nZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG9zLCB1bmlvbiBkcmJkX3N0YXRlIG5zLAogCQkJCSBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKIAljaGFyIHBiWzMwMF07CkBAIC00OTYsMTcgKzUwOCwxNyBAQAogCQkJICAgICAgIGlzX3N1c3AobnMpKTsKIAogCWlmIChwYnAgIT0gcGIpCi0JCWNvbm5faW5mbyh0Y29ubiwgIiVzXG4iLCBwYik7CisJCWRyYmRfaW5mbyhjb25uZWN0aW9uLCAiJXNcbiIsIHBiKTsKIH0KIAogCiAvKioKICAqIGlzX3ZhbGlkX3N0YXRlKCkgLSBSZXR1cm5zIGFuIFNTXyBlcnJvciBjb2RlIGlmIG5zIGlzIG5vdCB2YWxpZAotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbnM6CQlTdGF0ZSB0byBjb25zaWRlci4KICAqLwogc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydgotaXNfdmFsaWRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgdW5pb24gZHJiZF9zdGF0ZSBucykKK2lzX3ZhbGlkX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCB1bmlvbiBkcmJkX3N0YXRlIG5zKQogewogCS8qIFNlZSBkcmJkX3N0YXRlX3N3X2Vycm9ycyBpbiBkcmJkX3N0cmluZ3MuYyAqLwogCkBAIC01MTYsMjQgKzUyOCwyNCBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWZwID0gRlBfRE9OVF9DQVJFOwotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQlmcCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlmcCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmc7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCi0JbmMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+dGNvbm4tPm5ldF9jb25mKTsKKwluYyA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5uZXRfY29uZik7CiAJaWYgKG5jKSB7CiAJCWlmICghbmMtPnR3b19wcmltYXJpZXMgJiYgbnMucm9sZSA9PSBSX1BSSU1BUlkpIHsKIAkJCWlmIChucy5wZWVyID09IFJfUFJJTUFSWSkKIAkJCQlydiA9IFNTX1RXT19QUklNQVJJRVM7Ci0JCQllbHNlIGlmIChjb25uX2hpZ2hlc3RfcGVlcihtZGV2LT50Y29ubikgPT0gUl9QUklNQVJZKQorCQkJZWxzZSBpZiAoY29ubl9oaWdoZXN0X3BlZXIoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbikgPT0gUl9QUklNQVJZKQogCQkJCXJ2ID0gU1NfT19WT0xfUEVFUl9QUkk7CiAJCX0KIAl9CiAKIAlpZiAocnYgPD0gMCkKIAkJLyogYWxyZWFkeSBmb3VuZCBhIHJlYXNvbiB0byBhYm9ydCAqLzsKLQllbHNlIGlmIChucy5yb2xlID09IFJfU0VDT05EQVJZICYmIG1kZXYtPm9wZW5fY250KQorCWVsc2UgaWYgKG5zLnJvbGUgPT0gUl9TRUNPTkRBUlkgJiYgZGV2aWNlLT5vcGVuX2NudCkKIAkJcnYgPSBTU19ERVZJQ0VfSU5fVVNFOwogCiAJZWxzZSBpZiAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuY29ubiA8IENfQ09OTkVDVEVEICYmIG5zLmRpc2sgPCBEX1VQX1RPX0RBVEUpCkBAIC01NjcsNyArNTc5LDcgQEAKIAkJcnYgPSBTU19OT19WRVJJRllfQUxHOwogCiAJZWxzZSBpZiAoKG5zLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBucy5jb25uID09IENfVkVSSUZZX1QpICYmCi0JCSAgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDg4KQorCQkgIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDg4KQogCQlydiA9IFNTX05PVF9TVVBQT1JURUQ7CiAKIAllbHNlIGlmIChucy5yb2xlID09IFJfUFJJTUFSWSAmJiBucy5kaXNrIDwgRF9VUF9UT19EQVRFICYmIG5zLnBkc2sgPCBEX1VQX1RPX0RBVEUpCkBAIC01ODksMTIgKzYwMSwxMiBAQAogICogaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKCkgLSBSZXR1cm5zIGFuIFNTXyBlcnJvciBjb2RlIGlmIHRoZSBzdGF0ZSB0cmFuc2l0aW9uIGlzIG5vdCBwb3NzaWJsZQogICogVGhpcyBmdW5jdGlvbiBsaW1pdHMgc3RhdGUgdHJhbnNpdGlvbnMgdGhhdCBtYXkgYmUgZGVjbGluZWQgYnkgRFJCRC4gSS5lLgogICogdXNlciByZXF1ZXN0cyAoYWthIHNvZnQgdHJhbnNpdGlvbnMpLgotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbnM6CQluZXcgc3RhdGUuCiAgKiBAb3M6CQlvbGQgc3RhdGUuCiAgKi8KIHN0YXRpYyBlbnVtIGRyYmRfc3RhdGVfcnYKLWlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbih1bmlvbiBkcmJkX3N0YXRlIG9zLCB1bmlvbiBkcmJkX3N0YXRlIG5zLCBzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pCitpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24odW5pb24gZHJiZF9zdGF0ZSBvcywgdW5pb24gZHJiZF9zdGF0ZSBucywgc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnYgPSBTU19TVUNDRVNTOwogCkBAIC02MjIsNyArNjM0LDcgQEAKIAogCS8qIFdoaWxlIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gb25seSBhbGxvdyBjc3RhdGUgdG8gY2hhbmdlLgogCSAgIERlbGF5L3JlZnVzZSByb2xlIGNoYW5nZXMsIGRldGFjaCBhdHRhY2ggZXRjLi4uICovCi0JaWYgKHRlc3RfYml0KFNUQVRFX1NFTlQsICZ0Y29ubi0+ZmxhZ3MpICYmCisJaWYgKHRlc3RfYml0KFNUQVRFX1NFTlQsICZjb25uZWN0aW9uLT5mbGFncykgJiYKIAkgICAgIShvcy5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUyB8fAogCSAgICAgIChucy5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUyAmJiBvcy5jb25uID09IENfV0ZfQ09OTkVDVElPTikpKQogCQlydiA9IFNTX0lOX1RSQU5TSUVOVF9TVEFURTsKQEAgLTcwMyw3ICs3MTUsNyBAQAogCXJldHVybiBydjsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfc2FuaXRpemVfd2FybmluZ3Moc3RydWN0IGRyYmRfY29uZiAqbWRldiwgZW51bSBzYW5pdGl6ZV9zdGF0ZV93YXJuaW5ncyB3YXJuKQorc3RhdGljIHZvaWQgcHJpbnRfc2FuaXRpemVfd2FybmluZ3Moc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGVudW0gc2FuaXRpemVfc3RhdGVfd2FybmluZ3Mgd2FybikKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqbXNnX3RhYmxlW10gPSB7CiAJCVtOT19XQVJOSU5HXSA9ICIiLApAQCAtNzE1LDEyICs3MjcsMTIgQEAKIAl9OwogCiAJaWYgKHdhcm4gIT0gTk9fV0FSTklORykKLQkJZGV2X3dhcm4oREVWLCAiJXNcbiIsIG1zZ190YWJsZVt3YXJuXSk7CisJCWRyYmRfd2FybihkZXZpY2UsICIlc1xuIiwgbXNnX3RhYmxlW3dhcm5dKTsKIH0KIAogLyoqCiAgKiBzYW5pdGl6ZV9zdGF0ZSgpIC0gUmVzb2x2ZXMgaW1wbGljaXRseSBuZWNlc3NhcnkgYWRkaXRpb25hbCBjaGFuZ2VzIHRvIGEgc3RhdGUgdHJhbnNpdGlvbgotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAb3M6CQlvbGQgc3RhdGUuCiAgKiBAbnM6CQluZXcgc3RhdGUuCiAgKiBAd2Fybl9zeW5jX2Fib3J0OgpAQCAtNzI4LDcgKzc0MCw3IEBACiAgKiBXaGVuIHdlIGxvb3NlIGNvbm5lY3Rpb24sIHdlIGhhdmUgdG8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgcGVlcnMgZGlzayAocGRzaykKICAqIHRvIERfVU5LTk9XTi4gVGhpcyBydWxlIGFuZCBtYW55IG1vcmUgYWxvbmcgdGhvc2UgbGluZXMgYXJlIGluIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyB1bmlvbiBkcmJkX3N0YXRlIHNhbml0aXplX3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHVuaW9uIGRyYmRfc3RhdGUgbnMsCitzdGF0aWMgdW5pb24gZHJiZF9zdGF0ZSBzYW5pdGl6ZV9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBucywKIAkJCQkgICAgICAgZW51bSBzYW5pdGl6ZV9zdGF0ZV93YXJuaW5ncyAqd2FybikKIHsKIAllbnVtIGRyYmRfZmVuY2luZ19wIGZwOwpAQCAtNzM4LDExICs3NTAsMTEgQEAKIAkJKndhcm4gPSBOT19XQVJOSU5HOwogCiAJZnAgPSBGUF9ET05UX0NBUkU7Ci0JaWYgKGdldF9sZGV2KG1kZXYpKSB7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlmcCA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5mZW5jaW5nOworCQlmcCA9IHJjdV9kZXJlZmVyZW5jZShkZXZpY2UtPmxkZXYtPmRpc2tfY29uZiktPmZlbmNpbmc7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAkvKiBJbXBsaWNhdGlvbnMgZnJvbSBjb25uZWN0aW9uIHRvIHBlZXIgYW5kIHBlZXJfaXNwICovCkBAIC03NjgsMTcgKzc4MCwxNyBAQAogCiAJLyogQ29ubmVjdGlvbiBicmVha3MgZG93biBiZWZvcmUgd2UgZmluaXNoZWQgIk5lZ290aWF0aW5nIiAqLwogCWlmIChucy5jb25uIDwgQ19DT05ORUNURUQgJiYgbnMuZGlzayA9PSBEX05FR09USUFUSU5HICYmCi0JICAgIGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKSB7Ci0JCWlmIChtZGV2LT5lZF91dWlkID09IG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pIHsKLQkJCW5zLmRpc2sgPSBtZGV2LT5uZXdfc3RhdGVfdG1wLmRpc2s7Ci0JCQlucy5wZHNrID0gbWRldi0+bmV3X3N0YXRlX3RtcC5wZHNrOworCSAgICBnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsIERfTkVHT1RJQVRJTkcpKSB7CisJCWlmIChkZXZpY2UtPmVkX3V1aWQgPT0gZGV2aWNlLT5sZGV2LT5tZC51dWlkW1VJX0NVUlJFTlRdKSB7CisJCQlucy5kaXNrID0gZGV2aWNlLT5uZXdfc3RhdGVfdG1wLmRpc2s7CisJCQlucy5wZHNrID0gZGV2aWNlLT5uZXdfc3RhdGVfdG1wLnBkc2s7CiAJCX0gZWxzZSB7CiAJCQlpZiAod2FybikKIAkJCQkqd2FybiA9IENPTk5FQ1RJT05fTE9TVF9ORUdPVElBVElORzsKIAkJCW5zLmRpc2sgPSBEX0RJU0tMRVNTOwogCQkJbnMucGRzayA9IERfVU5LTk9XTjsKIAkJfQotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAkvKiBEX0NPTlNJU1RFTlQgYW5kIERfT1VUREFURUQgdmFuaXNoIHdoZW4gd2UgZ2V0IGNvbm5lY3RlZCAqLwpAQCAtODczLDcgKzg4NSw3IEBACiAJICAgIChucy5yb2xlID09IFJfUFJJTUFSWSAmJiBucy5jb25uIDwgQ19DT05ORUNURUQgJiYgbnMucGRzayA+IERfT1VUREFURUQpKQogCQlucy5zdXNwX2ZlbiA9IDE7IC8qIFN1c3BlbmQgSU8gd2hpbGUgZmVuY2UtcGVlciBoYW5kbGVyIHJ1bnMgKHBlZXIgbG9zdCkgKi8KIAotCWlmIChtZGV2LT50Y29ubi0+cmVzX29wdHMub25fbm9fZGF0YSA9PSBPTkRfU1VTUEVORF9JTyAmJgorCWlmIChkZXZpY2UtPnJlc291cmNlLT5yZXNfb3B0cy5vbl9ub19kYXRhID09IE9ORF9TVVNQRU5EX0lPICYmCiAJICAgIChucy5yb2xlID09IFJfUFJJTUFSWSAmJiBucy5kaXNrIDwgRF9VUF9UT19EQVRFICYmIG5zLnBkc2sgPCBEX1VQX1RPX0RBVEUpKQogCQlucy5zdXNwX25vZCA9IDE7IC8qIFN1c3BlbmQgSU8gd2hpbGUgbm8gZGF0YSBhdmFpbGFibGUgKG5vIGFjY2Vzc2libGUgZGF0YSBhdmFpbGFibGUpICovCiAKQEAgLTg5Miw0MiArOTA0LDQyIEBACiAJcmV0dXJuIG5zOwogfQogCi12b2lkIGRyYmRfcmVzdW1lX2FsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCit2b2lkIGRyYmRfcmVzdW1lX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQUxfU1VTUEVOREVELCAmbWRldi0+ZmxhZ3MpKQotCQlkZXZfaW5mbyhERVYsICJSZXN1bWVkIEFMIHVwZGF0ZXNcbiIpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQUxfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncykpCisJCWRyYmRfaW5mbyhkZXZpY2UsICJSZXN1bWVkIEFMIHVwZGF0ZXNcbiIpOwogfQogCiAvKiBoZWxwZXIgZm9yIF9fZHJiZF9zZXRfc3RhdGUgKi8KLXN0YXRpYyB2b2lkIHNldF9vdl9wb3NpdGlvbihzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfY29ubnMgY3MpCitzdGF0aWMgdm9pZCBzZXRfb3ZfcG9zaXRpb24oc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGVudW0gZHJiZF9jb25ucyBjcykKIHsKLQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDkwKQotCQltZGV2LT5vdl9zdGFydF9zZWN0b3IgPSAwOwotCW1kZXYtPnJzX3RvdGFsID0gZHJiZF9ibV9iaXRzKG1kZXYpOwotCW1kZXYtPm92X3Bvc2l0aW9uID0gMDsKKwlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTApCisJCWRldmljZS0+b3Zfc3RhcnRfc2VjdG9yID0gMDsKKwlkZXZpY2UtPnJzX3RvdGFsID0gZHJiZF9ibV9iaXRzKGRldmljZSk7CisJZGV2aWNlLT5vdl9wb3NpdGlvbiA9IDA7CiAJaWYgKGNzID09IENfVkVSSUZZX1QpIHsKIAkJLyogc3RhcnRpbmcgb25saW5lIHZlcmlmeSBmcm9tIGFuIGFyYml0cmFyeSBwb3NpdGlvbgogCQkgKiBkb2VzIG5vdCBmaXQgd2VsbCBpbnRvIHRoZSBleGlzdGluZyBwcm90b2NvbC4KIAkJICogb24gQ19WRVJJRllfVCwgd2UgaW5pdGlhbGl6ZSBvdl9sZWZ0IGFuZCBmcmllbmRzCiAJCSAqIGltcGxpY2l0bHkgaW4gcmVjZWl2ZV9EYXRhUmVxdWVzdCBvbmNlIHRoZQogCQkgKiBmaXJzdCBQX09WX1JFUVVFU1QgaXMgcmVjZWl2ZWQgKi8KLQkJbWRldi0+b3Zfc3RhcnRfc2VjdG9yID0gfihzZWN0b3JfdCkwOworCQlkZXZpY2UtPm92X3N0YXJ0X3NlY3RvciA9IH4oc2VjdG9yX3QpMDsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIGJpdCA9IEJNX1NFQ1RfVE9fQklUKG1kZXYtPm92X3N0YXJ0X3NlY3Rvcik7Ci0JCWlmIChiaXQgPj0gbWRldi0+cnNfdG90YWwpIHsKLQkJCW1kZXYtPm92X3N0YXJ0X3NlY3RvciA9Ci0JCQkJQk1fQklUX1RPX1NFQ1QobWRldi0+cnNfdG90YWwgLSAxKTsKLQkJCW1kZXYtPnJzX3RvdGFsID0gMTsKKwkJdW5zaWduZWQgbG9uZyBiaXQgPSBCTV9TRUNUX1RPX0JJVChkZXZpY2UtPm92X3N0YXJ0X3NlY3Rvcik7CisJCWlmIChiaXQgPj0gZGV2aWNlLT5yc190b3RhbCkgeworCQkJZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPQorCQkJCUJNX0JJVF9UT19TRUNUKGRldmljZS0+cnNfdG90YWwgLSAxKTsKKwkJCWRldmljZS0+cnNfdG90YWwgPSAxOwogCQl9IGVsc2UKLQkJCW1kZXYtPnJzX3RvdGFsIC09IGJpdDsKLQkJbWRldi0+b3ZfcG9zaXRpb24gPSBtZGV2LT5vdl9zdGFydF9zZWN0b3I7CisJCQlkZXZpY2UtPnJzX3RvdGFsIC09IGJpdDsKKwkJZGV2aWNlLT5vdl9wb3NpdGlvbiA9IGRldmljZS0+b3Zfc3RhcnRfc2VjdG9yOwogCX0KLQltZGV2LT5vdl9sZWZ0ID0gbWRldi0+cnNfdG90YWw7CisJZGV2aWNlLT5vdl9sZWZ0ID0gZGV2aWNlLT5yc190b3RhbDsKIH0KIAogLyoqCiAgKiBfX2RyYmRfc2V0X3N0YXRlKCkgLSBTZXQgYSBuZXcgRFJCRCBzdGF0ZQotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAbnM6CQluZXcgc3RhdGUuCiAgKiBAZmxhZ3M6CUZsYWdzCiAgKiBAZG9uZToJT3B0aW9uYWwgY29tcGxldGlvbiwgdGhhdCB3aWxsIGdldCBjb21wbGV0ZWQgYWZ0ZXIgdGhlIGFmdGVyX3N0YXRlX2NoKCkgZmluaXNoZWQKQEAgLTkzNSw3ICs5NDcsNyBAQAogICogQ2FsbGVyIG5lZWRzIHRvIGhvbGQgcmVxX2xvY2ssIGFuZCBnbG9iYWxfc3RhdGVfbG9jay4gRG8gbm90IGNhbGwgZGlyZWN0bHkuCiAgKi8KIGVudW0gZHJiZF9zdGF0ZV9ydgotX19kcmJkX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG5zLAorX19kcmJkX3NldF9zdGF0ZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgdW5pb24gZHJiZF9zdGF0ZSBucywKIAkgICAgICAgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncywgc3RydWN0IGNvbXBsZXRpb24gKmRvbmUpCiB7CiAJdW5pb24gZHJiZF9zdGF0ZSBvczsKQEAgLTk0NCw5ICs5NTYsOSBAQAogCXN0cnVjdCBhZnRlcl9zdGF0ZV9jaGdfd29yayAqYXNjdzsKIAlib29sIGRpZF9yZW1vdGUsIHNob3VsZF9kb19yZW1vdGU7CiAKLQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKKwlvcyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOwogCi0JbnMgPSBzYW5pdGl6ZV9zdGF0ZShtZGV2LCBucywgJnNzdyk7CisJbnMgPSBzYW5pdGl6ZV9zdGF0ZShkZXZpY2UsIG5zLCAmc3N3KTsKIAlpZiAobnMuaSA9PSBvcy5pKQogCQlyZXR1cm4gU1NfTk9USElOR19UT19ETzsKIApAQCAtOTU4LDMyICs5NzAsMzMgQEAKIAkJLyogIHByZS1zdGF0ZS1jaGFuZ2UgY2hlY2tzIDsgb25seSBsb29rIGF0IG5zICAqLwogCQkvKiBTZWUgZHJiZF9zdGF0ZV9zd19lcnJvcnMgaW4gZHJiZF9zdHJpbmdzLmMgKi8KIAotCQlydiA9IGlzX3ZhbGlkX3N0YXRlKG1kZXYsIG5zKTsKKwkJcnYgPSBpc192YWxpZF9zdGF0ZShkZXZpY2UsIG5zKTsKIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykgewogCQkJLyogSWYgdGhlIG9sZCBzdGF0ZSB3YXMgaWxsZWdhbCBhcyB3ZWxsLCB0aGVuIGxldAogCQkJICAgdGhpcyBoYXBwZW4uLi4qLwogCi0JCQlpZiAoaXNfdmFsaWRfc3RhdGUobWRldiwgb3MpID09IHJ2KQotCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgbWRldi0+dGNvbm4pOworCQkJaWYgKGlzX3ZhbGlkX3N0YXRlKGRldmljZSwgb3MpID09IHJ2KQorCQkJCXJ2ID0gaXNfdmFsaWRfc29mdF90cmFuc2l0aW9uKG9zLCBucywgZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbik7CiAJCX0gZWxzZQotCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCBtZGV2LT50Y29ubik7CisJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24pOwogCX0KIAogCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKIAkJaWYgKGZsYWdzICYgQ1NfVkVSQk9TRSkKLQkJCXByaW50X3N0X2VycihtZGV2LCBvcywgbnMsIHJ2KTsKKwkJCXByaW50X3N0X2VycihkZXZpY2UsIG9zLCBucywgcnYpOwogCQlyZXR1cm4gcnY7CiAJfQogCi0JcHJpbnRfc2FuaXRpemVfd2FybmluZ3MobWRldiwgc3N3KTsKKwlwcmludF9zYW5pdGl6ZV93YXJuaW5ncyhkZXZpY2UsIHNzdyk7CiAKLQlkcmJkX3ByX3N0YXRlX2NoYW5nZShtZGV2LCBvcywgbnMsIGZsYWdzKTsKKwlkcmJkX3ByX3N0YXRlX2NoYW5nZShkZXZpY2UsIG9zLCBucywgZmxhZ3MpOwogCiAJLyogRGlzcGxheSBjaGFuZ2VzIHRvIHRoZSBzdXNwKiBmbGFncyB0aGF0IHdoZXJlIGNhdXNlZCBieSB0aGUgY2FsbCB0bwogCSAgIHNhbml0aXplX3N0YXRlKCkuIE9ubHkgZGlzcGxheSBpdCBoZXJlIGlmIHdlIHdoZXJlIG5vdCBjYWxsZWQgZnJvbQogCSAgIF9jb25uX3JlcXVlc3Rfc3RhdGUoKSAqLwogCWlmICghKGZsYWdzICYgQ1NfRENfU1VTUCkpCi0JCWNvbm5fcHJfc3RhdGVfY2hhbmdlKG1kZXYtPnRjb25uLCBvcywgbnMsIChmbGFncyAmIH5DU19EQ19NQVNLKSB8IENTX0RDX1NVU1ApOworCQljb25uX3ByX3N0YXRlX2NoYW5nZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBvcywgbnMsCisJCQkJICAgICAoZmxhZ3MgJiB+Q1NfRENfTUFTSykgfCBDU19EQ19TVVNQKTsKIAogCS8qIGlmIHdlIGFyZSBnb2luZyAtPiBEX0ZBSUxFRCBvciBEX0RJU0tMRVNTLCBncmFiIG9uZSBleHRyYSByZWZlcmVuY2UKIAkgKiBvbiB0aGUgbGRldiBoZXJlLCB0byBiZSBzdXJlIHRoZSB0cmFuc2l0aW9uIC0+IERfRElTS0xFU1MgcmVzcC4KQEAgLTk5MSw1NSArMTAwNCw1NSBAQAogCSAqIGFmdGVyX3N0YXRlX2NoIHdvcmtzIHJ1biwgd2hlcmUgd2UgcHV0X2xkZXYgYWdhaW4uICovCiAJaWYgKChvcy5kaXNrICE9IERfRkFJTEVEICYmIG5zLmRpc2sgPT0gRF9GQUlMRUQpIHx8CiAJICAgIChvcy5kaXNrICE9IERfRElTS0xFU1MgJiYgbnMuZGlzayA9PSBEX0RJU0tMRVNTKSkKLQkJYXRvbWljX2luYygmbWRldi0+bG9jYWxfY250KTsKKwkJYXRvbWljX2luYygmZGV2aWNlLT5sb2NhbF9jbnQpOwogCi0JZGlkX3JlbW90ZSA9IGRyYmRfc2hvdWxkX2RvX3JlbW90ZShtZGV2LT5zdGF0ZSk7Ci0JbWRldi0+c3RhdGUuaSA9IG5zLmk7Ci0Jc2hvdWxkX2RvX3JlbW90ZSA9IGRyYmRfc2hvdWxkX2RvX3JlbW90ZShtZGV2LT5zdGF0ZSk7Ci0JbWRldi0+dGNvbm4tPnN1c3AgPSBucy5zdXNwOwotCW1kZXYtPnRjb25uLT5zdXNwX25vZCA9IG5zLnN1c3Bfbm9kOwotCW1kZXYtPnRjb25uLT5zdXNwX2ZlbiA9IG5zLnN1c3BfZmVuOworCWRpZF9yZW1vdGUgPSBkcmJkX3Nob3VsZF9kb19yZW1vdGUoZGV2aWNlLT5zdGF0ZSk7CisJZGV2aWNlLT5zdGF0ZS5pID0gbnMuaTsKKwlzaG91bGRfZG9fcmVtb3RlID0gZHJiZF9zaG91bGRfZG9fcmVtb3RlKGRldmljZS0+c3RhdGUpOworCWRldmljZS0+cmVzb3VyY2UtPnN1c3AgPSBucy5zdXNwOworCWRldmljZS0+cmVzb3VyY2UtPnN1c3Bfbm9kID0gbnMuc3VzcF9ub2Q7CisJZGV2aWNlLT5yZXNvdXJjZS0+c3VzcF9mZW4gPSBucy5zdXNwX2ZlbjsKIAogCS8qIHB1dCByZXBsaWNhdGVkIHZzIG5vdC1yZXBsaWNhdGVkIHJlcXVlc3RzIGluIHNlcGVyYXRlIGVwb2NocyAqLwogCWlmIChkaWRfcmVtb3RlICE9IHNob3VsZF9kb19yZW1vdGUpCi0JCXN0YXJ0X25ld190bF9lcG9jaChtZGV2LT50Y29ubik7CisJCXN0YXJ0X25ld190bF9lcG9jaChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uKTsKIAogCWlmIChvcy5kaXNrID09IERfQVRUQUNISU5HICYmIG5zLmRpc2sgPj0gRF9ORUdPVElBVElORykKLQkJZHJiZF9wcmludF91dWlkcyhtZGV2LCAiYXR0YWNoZWQgdG8gVVVJRHMiKTsKKwkJZHJiZF9wcmludF91dWlkcyhkZXZpY2UsICJhdHRhY2hlZCB0byBVVUlEcyIpOwogCiAJLyogV2FrZSB1cCByb2xlIGNoYW5nZXMsIHRoYXQgd2VyZSBkZWxheWVkIGJlY2F1c2Ugb2YgY29ubmVjdGlvbiBlc3RhYmxpc2hpbmcgKi8KIAlpZiAob3MuY29ubiA9PSBDX1dGX1JFUE9SVF9QQVJBTVMgJiYgbnMuY29ubiAhPSBDX1dGX1JFUE9SVF9QQVJBTVMgJiYKLQkgICAgbm9fcGVlcl93Zl9yZXBvcnRfcGFyYW1zKG1kZXYtPnRjb25uKSkKLQkJY2xlYXJfYml0KFNUQVRFX1NFTlQsICZtZGV2LT50Y29ubi0+ZmxhZ3MpOworCSAgICBub19wZWVyX3dmX3JlcG9ydF9wYXJhbXMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbikpCisJCWNsZWFyX2JpdChTVEFURV9TRU5ULCAmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZmxhZ3MpOwogCi0Jd2FrZV91cCgmbWRldi0+bWlzY193YWl0KTsKLQl3YWtlX3VwKCZtZGV2LT5zdGF0ZV93YWl0KTsKLQl3YWtlX3VwKCZtZGV2LT50Y29ubi0+cGluZ193YWl0KTsKKwl3YWtlX3VwKCZkZXZpY2UtPm1pc2Nfd2FpdCk7CisJd2FrZV91cCgmZGV2aWNlLT5zdGF0ZV93YWl0KTsKKwl3YWtlX3VwKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5waW5nX3dhaXQpOwogCiAJLyogQWJvcnRlZCB2ZXJpZnkgcnVuLCBvciB3ZSByZWFjaGVkIHRoZSBzdG9wIHNlY3Rvci4KIAkgKiBMb2cgdGhlIGxhc3QgcG9zaXRpb24sIHVubGVzcyBlbmQtb2YtZGV2aWNlLiAqLwogCWlmICgob3MuY29ubiA9PSBDX1ZFUklGWV9TIHx8IG9zLmNvbm4gPT0gQ19WRVJJRllfVCkgJiYKIAkgICAgbnMuY29ubiA8PSBDX0NPTk5FQ1RFRCkgewotCQltZGV2LT5vdl9zdGFydF9zZWN0b3IgPQotCQkJQk1fQklUX1RPX1NFQ1QoZHJiZF9ibV9iaXRzKG1kZXYpIC0gbWRldi0+b3ZfbGVmdCk7Ci0JCWlmIChtZGV2LT5vdl9sZWZ0KQotCQkJZGV2X2luZm8oREVWLCAiT25saW5lIFZlcmlmeSByZWFjaGVkIHNlY3RvciAlbGx1XG4iLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWRldi0+b3Zfc3RhcnRfc2VjdG9yKTsKKwkJZGV2aWNlLT5vdl9zdGFydF9zZWN0b3IgPQorCQkJQk1fQklUX1RPX1NFQ1QoZHJiZF9ibV9iaXRzKGRldmljZSkgLSBkZXZpY2UtPm92X2xlZnQpOworCQlpZiAoZGV2aWNlLT5vdl9sZWZ0KQorCQkJZHJiZF9pbmZvKGRldmljZSwgIk9ubGluZSBWZXJpZnkgcmVhY2hlZCBzZWN0b3IgJWxsdVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRldmljZS0+b3Zfc3RhcnRfc2VjdG9yKTsKIAl9CiAKIAlpZiAoKG9zLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19UIHx8IG9zLmNvbm4gPT0gQ19QQVVTRURfU1lOQ19TKSAmJgogCSAgICAobnMuY29ubiA9PSBDX1NZTkNfVEFSR0VUICB8fCBucy5jb25uID09IENfU1lOQ19TT1VSQ0UpKSB7Ci0JCWRldl9pbmZvKERFViwgIlN5bmNlciBjb250aW51ZXMuXG4iKTsKLQkJbWRldi0+cnNfcGF1c2VkICs9IChsb25nKWppZmZpZXMKLQkJCQkgIC0obG9uZyltZGV2LT5yc19tYXJrX3RpbWVbbWRldi0+cnNfbGFzdF9tYXJrXTsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlN5bmNlciBjb250aW51ZXMuXG4iKTsKKwkJZGV2aWNlLT5yc19wYXVzZWQgKz0gKGxvbmcpamlmZmllcworCQkJCSAgLShsb25nKWRldmljZS0+cnNfbWFya190aW1lW2RldmljZS0+cnNfbGFzdF9tYXJrXTsKIAkJaWYgKG5zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCkKLQkJCW1vZF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzKTsKKwkJCW1vZF90aW1lcigmZGV2aWNlLT5yZXN5bmNfdGltZXIsIGppZmZpZXMpOwogCX0KIAogCWlmICgob3MuY29ubiA9PSBDX1NZTkNfVEFSR0VUICB8fCBvcy5jb25uID09IENfU1lOQ19TT1VSQ0UpICYmCiAJICAgIChucy5jb25uID09IENfUEFVU0VEX1NZTkNfVCB8fCBucy5jb25uID09IENfUEFVU0VEX1NZTkNfUykpIHsKLQkJZGV2X2luZm8oREVWLCAiUmVzeW5jIHN1c3BlbmRlZFxuIik7Ci0JCW1kZXYtPnJzX21hcmtfdGltZVttZGV2LT5yc19sYXN0X21hcmtdID0gamlmZmllczsKKwkJZHJiZF9pbmZvKGRldmljZSwgIlJlc3luYyBzdXNwZW5kZWRcbiIpOworCQlkZXZpY2UtPnJzX21hcmtfdGltZVtkZXZpY2UtPnJzX2xhc3RfbWFya10gPSBqaWZmaWVzOwogCX0KIAogCWlmIChvcy5jb25uID09IENfQ09OTkVDVEVEICYmCkBAIC0xMDQ3LDc3ICsxMDYwLDc3IEBACiAJCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAkJaW50IGk7CiAKLQkJc2V0X292X3Bvc2l0aW9uKG1kZXYsIG5zLmNvbm4pOwotCQltZGV2LT5yc19zdGFydCA9IG5vdzsKLQkJbWRldi0+cnNfbGFzdF9ldmVudHMgPSAwOwotCQltZGV2LT5yc19sYXN0X3NlY3RfZXYgPSAwOwotCQltZGV2LT5vdl9sYXN0X29vc19zaXplID0gMDsKLQkJbWRldi0+b3ZfbGFzdF9vb3Nfc3RhcnQgPSAwOworCQlzZXRfb3ZfcG9zaXRpb24oZGV2aWNlLCBucy5jb25uKTsKKwkJZGV2aWNlLT5yc19zdGFydCA9IG5vdzsKKwkJZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA9IDA7CisJCWRldmljZS0+cnNfbGFzdF9zZWN0X2V2ID0gMDsKKwkJZGV2aWNlLT5vdl9sYXN0X29vc19zaXplID0gMDsKKwkJZGV2aWNlLT5vdl9sYXN0X29vc19zdGFydCA9IDA7CiAKIAkJZm9yIChpID0gMDsgaSA8IERSQkRfU1lOQ19NQVJLUzsgaSsrKSB7Ci0JCQltZGV2LT5yc19tYXJrX2xlZnRbaV0gPSBtZGV2LT5vdl9sZWZ0OwotCQkJbWRldi0+cnNfbWFya190aW1lW2ldID0gbm93OworCQkJZGV2aWNlLT5yc19tYXJrX2xlZnRbaV0gPSBkZXZpY2UtPm92X2xlZnQ7CisJCQlkZXZpY2UtPnJzX21hcmtfdGltZVtpXSA9IG5vdzsKIAkJfQogCi0JCWRyYmRfcnNfY29udHJvbGxlcl9yZXNldChtZGV2KTsKKwkJZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KGRldmljZSk7CiAKIAkJaWYgKG5zLmNvbm4gPT0gQ19WRVJJRllfUykgewotCQkJZGV2X2luZm8oREVWLCAiU3RhcnRpbmcgT25saW5lIFZlcmlmeSBmcm9tIHNlY3RvciAlbGx1XG4iLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1kZXYtPm92X3Bvc2l0aW9uKTsKLQkJCW1vZF90aW1lcigmbWRldi0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzKTsKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICJTdGFydGluZyBPbmxpbmUgVmVyaWZ5IGZyb20gc2VjdG9yICVsbHVcbiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWNlLT5vdl9wb3NpdGlvbik7CisJCQltb2RfdGltZXIoJmRldmljZS0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzKTsKIAkJfQogCX0KIAotCWlmIChnZXRfbGRldihtZGV2KSkgewotCQl1MzIgbWRmID0gbWRldi0+bGRldi0+bWQuZmxhZ3MgJiB+KE1ERl9DT05TSVNURU5UfE1ERl9QUklNQVJZX0lORHwKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQl1MzIgbWRmID0gZGV2aWNlLT5sZGV2LT5tZC5mbGFncyAmIH4oTURGX0NPTlNJU1RFTlR8TURGX1BSSU1BUllfSU5EfAogCQkJCQkJIE1ERl9DT05ORUNURURfSU5EfE1ERl9XQVNfVVBfVE9fREFURXwKIAkJCQkJCSBNREZfUEVFUl9PVVRfREFURUR8TURGX0NSQVNIRURfUFJJTUFSWSk7CiAKIAkJbWRmICY9IH5NREZfQUxfQ0xFQU47Ci0JCWlmICh0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZtZGV2LT5mbGFncykpCisJCWlmICh0ZXN0X2JpdChDUkFTSEVEX1BSSU1BUlksICZkZXZpY2UtPmZsYWdzKSkKIAkJCW1kZiB8PSBNREZfQ1JBU0hFRF9QUklNQVJZOwotCQlpZiAobWRldi0+c3RhdGUucm9sZSA9PSBSX1BSSU1BUlkgfHwKLQkJICAgIChtZGV2LT5zdGF0ZS5wZHNrIDwgRF9JTkNPTlNJU1RFTlQgJiYgbWRldi0+c3RhdGUucGVlciA9PSBSX1BSSU1BUlkpKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5yb2xlID09IFJfUFJJTUFSWSB8fAorCQkgICAgKGRldmljZS0+c3RhdGUucGRzayA8IERfSU5DT05TSVNURU5UICYmIGRldmljZS0+c3RhdGUucGVlciA9PSBSX1BSSU1BUlkpKQogCQkJbWRmIHw9IE1ERl9QUklNQVJZX0lORDsKLQkJaWYgKG1kZXYtPnN0YXRlLmNvbm4gPiBDX1dGX1JFUE9SVF9QQVJBTVMpCisJCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPiBDX1dGX1JFUE9SVF9QQVJBTVMpCiAJCQltZGYgfD0gTURGX0NPTk5FQ1RFRF9JTkQ7Ci0JCWlmIChtZGV2LT5zdGF0ZS5kaXNrID4gRF9JTkNPTlNJU1RFTlQpCisJCWlmIChkZXZpY2UtPnN0YXRlLmRpc2sgPiBEX0lOQ09OU0lTVEVOVCkKIAkJCW1kZiB8PSBNREZfQ09OU0lTVEVOVDsKLQkJaWYgKG1kZXYtPnN0YXRlLmRpc2sgPiBEX09VVERBVEVEKQorCQlpZiAoZGV2aWNlLT5zdGF0ZS5kaXNrID4gRF9PVVREQVRFRCkKIAkJCW1kZiB8PSBNREZfV0FTX1VQX1RPX0RBVEU7Ci0JCWlmIChtZGV2LT5zdGF0ZS5wZHNrIDw9IERfT1VUREFURUQgJiYgbWRldi0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCkKKwkJaWYgKGRldmljZS0+c3RhdGUucGRzayA8PSBEX09VVERBVEVEICYmIGRldmljZS0+c3RhdGUucGRzayA+PSBEX0lOQ09OU0lTVEVOVCkKIAkJCW1kZiB8PSBNREZfUEVFUl9PVVRfREFURUQ7Ci0JCWlmIChtZGYgIT0gbWRldi0+bGRldi0+bWQuZmxhZ3MpIHsKLQkJCW1kZXYtPmxkZXYtPm1kLmZsYWdzID0gbWRmOwotCQkJZHJiZF9tZF9tYXJrX2RpcnR5KG1kZXYpOworCQlpZiAobWRmICE9IGRldmljZS0+bGRldi0+bWQuZmxhZ3MpIHsKKwkJCWRldmljZS0+bGRldi0+bWQuZmxhZ3MgPSBtZGY7CisJCQlkcmJkX21kX21hcmtfZGlydHkoZGV2aWNlKTsKIAkJfQogCQlpZiAob3MuZGlzayA8IERfQ09OU0lTVEVOVCAmJiBucy5kaXNrID49IERfQ09OU0lTVEVOVCkKLQkJCWRyYmRfc2V0X2VkX3V1aWQobWRldiwgbWRldi0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQkJZHJiZF9zZXRfZWRfdXVpZChkZXZpY2UsIGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogUGVlciB3YXMgZm9yY2VkIERfVVBfVE9fREFURSAmIFJfUFJJTUFSWSwgY29uc2lkZXIgdG8gcmVzeW5jICovCiAJaWYgKG9zLmRpc2sgPT0gRF9JTkNPTlNJU1RFTlQgJiYgb3MucGRzayA9PSBEX0lOQ09OU0lTVEVOVCAmJgogCSAgICBvcy5wZWVyID09IFJfU0VDT05EQVJZICYmIG5zLnBlZXIgPT0gUl9QUklNQVJZKQotCQlzZXRfYml0KENPTlNJREVSX1JFU1lOQywgJm1kZXYtPmZsYWdzKTsKKwkJc2V0X2JpdChDT05TSURFUl9SRVNZTkMsICZkZXZpY2UtPmZsYWdzKTsKIAogCS8qIFJlY2VpdmVyIHNob3VsZCBjbGVhbiB1cCBpdHNlbGYgKi8KIAlpZiAob3MuY29ubiAhPSBDX0RJU0NPTk5FQ1RJTkcgJiYgbnMuY29ubiA9PSBDX0RJU0NPTk5FQ1RJTkcpCi0JCWRyYmRfdGhyZWFkX3N0b3Bfbm93YWl0KCZtZGV2LT50Y29ubi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cmVjZWl2ZXIpOwogCiAJLyogTm93IHRoZSByZWNlaXZlciBmaW5pc2hlZCBjbGVhbmluZyB1cCBpdHNlbGYsIGl0IHNob3VsZCBkaWUgKi8KIAlpZiAob3MuY29ubiAhPSBDX1NUQU5EQUxPTkUgJiYgbnMuY29ubiA9PSBDX1NUQU5EQUxPTkUpCi0JCWRyYmRfdGhyZWFkX3N0b3Bfbm93YWl0KCZtZGV2LT50Y29ubi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9zdG9wX25vd2FpdCgmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+cmVjZWl2ZXIpOwogCiAJLyogVXBvbiBuZXR3b3JrIGZhaWx1cmUsIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgcmVjZWl2ZXIuICovCiAJaWYgKG9zLmNvbm4gPiBDX1dGX0NPTk5FQ1RJT04gJiYKIAkgICAgbnMuY29ubiA8PSBDX1RFQVJfRE9XTiAmJiBucy5jb25uID49IENfVElNRU9VVCkKLQkJZHJiZF90aHJlYWRfcmVzdGFydF9ub3dhaXQoJm1kZXYtPnRjb25uLT5yZWNlaXZlcik7CisJCWRyYmRfdGhyZWFkX3Jlc3RhcnRfbm93YWl0KCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5yZWNlaXZlcik7CiAKIAkvKiBSZXN1bWUgQUwgd3JpdGluZyBpZiB3ZSBnZXQgYSBjb25uZWN0aW9uICovCiAJaWYgKG9zLmNvbm4gPCBDX0NPTk5FQ1RFRCAmJiBucy5jb25uID49IENfQ09OTkVDVEVEKSB7Ci0JCWRyYmRfcmVzdW1lX2FsKG1kZXYpOwotCQltZGV2LT50Y29ubi0+Y29ubmVjdF9jbnQrKzsKKwkJZHJiZF9yZXN1bWVfYWwoZGV2aWNlKTsKKwkJZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+Y29ubmVjdF9jbnQrKzsKIAl9CiAKIAkvKiByZW1lbWJlciBsYXN0IGF0dGFjaCB0aW1lIHNvIHJlcXVlc3RfdGltZXJfZm4oKSB3b24ndApAQCAtMTEyNSw3ICsxMTM4LDcgQEAKIAkgKiBwcmV2aW91c2x5IGZyb3plbiBJTyAqLwogCWlmICgob3MuZGlzayA9PSBEX0FUVEFDSElORyB8fCBvcy5kaXNrID09IERfTkVHT1RJQVRJTkcpICYmCiAJICAgIG5zLmRpc2sgPiBEX05FR09USUFUSU5HKQotCQltZGV2LT5sYXN0X3JlYXR0YWNoX2ppZiA9IGppZmZpZXM7CisJCWRldmljZS0+bGFzdF9yZWF0dGFjaF9qaWYgPSBqaWZmaWVzOwogCiAJYXNjdyA9IGttYWxsb2Moc2l6ZW9mKCphc2N3KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGFzY3cpIHsKQEAgLTExMzMsMTEgKzExNDYsMTIgQEAKIAkJYXNjdy0+bnMgPSBuczsKIAkJYXNjdy0+ZmxhZ3MgPSBmbGFnczsKIAkJYXNjdy0+dy5jYiA9IHdfYWZ0ZXJfc3RhdGVfY2g7Ci0JCWFzY3ctPncubWRldiA9IG1kZXY7CisJCWFzY3ctPmRldmljZSA9IGRldmljZTsKIAkJYXNjdy0+ZG9uZSA9IGRvbmU7Ci0JCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmYXNjdy0+dyk7CisJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJJmFzY3ctPncpOwogCX0gZWxzZSB7Ci0JCWRldl9lcnIoREVWLCAiQ291bGQgbm90IGttYWxsb2MgYW4gYXNjd1xuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkNvdWxkIG5vdCBrbWFsbG9jIGFuIGFzY3dcbiIpOwogCX0KIAogCXJldHVybiBydjsKQEAgLTExNDcsNjYgKzExNjEsNjUgQEAKIHsKIAlzdHJ1Y3QgYWZ0ZXJfc3RhdGVfY2hnX3dvcmsgKmFzY3cgPQogCQljb250YWluZXJfb2Yodywgc3RydWN0IGFmdGVyX3N0YXRlX2NoZ193b3JrLCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGFzY3ctPmRldmljZTsKIAotCWFmdGVyX3N0YXRlX2NoKG1kZXYsIGFzY3ctPm9zLCBhc2N3LT5ucywgYXNjdy0+ZmxhZ3MpOwotCWlmIChhc2N3LT5mbGFncyAmIENTX1dBSVRfQ09NUExFVEUpIHsKLQkJRF9BU1NFUlQoYXNjdy0+ZG9uZSAhPSBOVUxMKTsKKwlhZnRlcl9zdGF0ZV9jaChkZXZpY2UsIGFzY3ctPm9zLCBhc2N3LT5ucywgYXNjdy0+ZmxhZ3MpOworCWlmIChhc2N3LT5mbGFncyAmIENTX1dBSVRfQ09NUExFVEUpCiAJCWNvbXBsZXRlKGFzY3ctPmRvbmUpOwotCX0KIAlrZnJlZShhc2N3KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhYndfc3RhcnRfc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBpbnQgcnYpCitzdGF0aWMgdm9pZCBhYndfc3RhcnRfc3luYyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgaW50IHJ2KQogewogCWlmIChydikgewotCQlkZXZfZXJyKERFViwgIldyaXRpbmcgdGhlIGJpdG1hcCBmYWlsZWQgbm90IHN0YXJ0aW5nIHJlc3luYy5cbiIpOwotCQlfZHJiZF9yZXF1ZXN0X3N0YXRlKG1kZXYsIE5TKGNvbm4sIENfQ09OTkVDVEVEKSwgQ1NfVkVSQk9TRSk7CisJCWRyYmRfZXJyKGRldmljZSwgIldyaXRpbmcgdGhlIGJpdG1hcCBmYWlsZWQgbm90IHN0YXJ0aW5nIHJlc3luYy5cbiIpOworCQlfZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoY29ubiwgQ19DT05ORUNURUQpLCBDU19WRVJCT1NFKTsKIAkJcmV0dXJuOwogCX0KIAotCXN3aXRjaCAobWRldi0+c3RhdGUuY29ubikgeworCXN3aXRjaCAoZGV2aWNlLT5zdGF0ZS5jb25uKSB7CiAJY2FzZSBDX1NUQVJUSU5HX1NZTkNfVDoKLQkJX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBOUyhjb25uLCBDX1dGX1NZTkNfVVVJRCksIENTX1ZFUkJPU0UpOworCQlfZHJiZF9yZXF1ZXN0X3N0YXRlKGRldmljZSwgTlMoY29ubiwgQ19XRl9TWU5DX1VVSUQpLCBDU19WRVJCT1NFKTsKIAkJYnJlYWs7CiAJY2FzZSBDX1NUQVJUSU5HX1NZTkNfUzoKLQkJZHJiZF9zdGFydF9yZXN5bmMobWRldiwgQ19TWU5DX1NPVVJDRSk7CisJCWRyYmRfc3RhcnRfcmVzeW5jKGRldmljZSwgQ19TWU5DX1NPVVJDRSk7CiAJCWJyZWFrOwogCX0KIH0KIAotaW50IGRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCi0JCWludCAoKmlvX2ZuKShzdHJ1Y3QgZHJiZF9jb25mICopLAoraW50IGRyYmRfYml0bWFwX2lvX2Zyb21fd29ya2VyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAorCQlpbnQgKCppb19mbikoc3RydWN0IGRyYmRfZGV2aWNlICopLAogCQljaGFyICp3aHksIGVudW0gYm1fZmxhZyBmbGFncykKIHsKIAlpbnQgcnY7CiAKLQlEX0FTU0VSVChjdXJyZW50ID09IG1kZXYtPnRjb25uLT53b3JrZXIudGFzayk7CisJRF9BU1NFUlQoZGV2aWNlLCBjdXJyZW50ID09IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPndvcmtlci50YXNrKTsKIAotCS8qIG9wZW4gY29kZWQgbm9uLWJsb2NraW5nIGRyYmRfc3VzcGVuZF9pbyhtZGV2KTsgKi8KLQlzZXRfYml0KFNVU1BFTkRfSU8sICZtZGV2LT5mbGFncyk7CisJLyogb3BlbiBjb2RlZCBub24tYmxvY2tpbmcgZHJiZF9zdXNwZW5kX2lvKGRldmljZSk7ICovCisJc2V0X2JpdChTVVNQRU5EX0lPLCAmZGV2aWNlLT5mbGFncyk7CiAKLQlkcmJkX2JtX2xvY2sobWRldiwgd2h5LCBmbGFncyk7Ci0JcnYgPSBpb19mbihtZGV2KTsKLQlkcmJkX2JtX3VubG9jayhtZGV2KTsKKwlkcmJkX2JtX2xvY2soZGV2aWNlLCB3aHksIGZsYWdzKTsKKwlydiA9IGlvX2ZuKGRldmljZSk7CisJZHJiZF9ibV91bmxvY2soZGV2aWNlKTsKIAotCWRyYmRfcmVzdW1lX2lvKG1kZXYpOworCWRyYmRfcmVzdW1lX2lvKGRldmljZSk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKIC8qKgogICogYWZ0ZXJfc3RhdGVfY2goKSAtIFBlcmZvcm0gYWZ0ZXIgc3RhdGUgY2hhbmdlIGFjdGlvbnMgdGhhdCBtYXkgc2xlZXAKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICogQG9zOgkJb2xkIHN0YXRlLgogICogQG5zOgkJbmV3IHN0YXRlLgogICogQGZsYWdzOglGbGFncwogICovCi1zdGF0aWMgdm9pZCBhZnRlcl9zdGF0ZV9jaChzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCB1bmlvbiBkcmJkX3N0YXRlIG9zLAorc3RhdGljIHZvaWQgYWZ0ZXJfc3RhdGVfY2goc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHVuaW9uIGRyYmRfc3RhdGUgb3MsCiAJCQkgICB1bmlvbiBkcmJkX3N0YXRlIG5zLCBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKKwlzdHJ1Y3QgZHJiZF9yZXNvdXJjZSAqcmVzb3VyY2UgPSBkZXZpY2UtPnJlc291cmNlOwogCXN0cnVjdCBzaWJfaW5mbyBzaWI7CiAKIAlzaWIuc2liX3JlYXNvbiA9IFNJQl9TVEFURV9DSEFOR0U7CkBAIC0xMjE0LDYzICsxMjI3LDYzIEBACiAJc2liLm5zID0gbnM7CiAKIAlpZiAob3MuY29ubiAhPSBDX0NPTk5FQ1RFRCAmJiBucy5jb25uID09IENfQ09OTkVDVEVEKSB7Ci0JCWNsZWFyX2JpdChDUkFTSEVEX1BSSU1BUlksICZtZGV2LT5mbGFncyk7Ci0JCWlmIChtZGV2LT5wX3V1aWQpCi0JCQltZGV2LT5wX3V1aWRbVUlfRkxBR1NdICY9IH4oKHU2NCkyKTsKKwkJY2xlYXJfYml0KENSQVNIRURfUFJJTUFSWSwgJmRldmljZS0+ZmxhZ3MpOworCQlpZiAoZGV2aWNlLT5wX3V1aWQpCisJCQlkZXZpY2UtPnBfdXVpZFtVSV9GTEFHU10gJj0gfigodTY0KTIpOwogCX0KIAogCS8qIEluZm9ybSB1c2Vyc3BhY2UgYWJvdXQgdGhlIGNoYW5nZS4uLiAqLwotCWRyYmRfYmNhc3RfZXZlbnQobWRldiwgJnNpYik7CisJZHJiZF9iY2FzdF9ldmVudChkZXZpY2UsICZzaWIpOwogCiAJaWYgKCEob3Mucm9sZSA9PSBSX1BSSU1BUlkgJiYgb3MuZGlzayA8IERfVVBfVE9fREFURSAmJiBvcy5wZHNrIDwgRF9VUF9UT19EQVRFKSAmJgogCSAgICAobnMucm9sZSA9PSBSX1BSSU1BUlkgJiYgbnMuZGlzayA8IERfVVBfVE9fREFURSAmJiBucy5wZHNrIDwgRF9VUF9UT19EQVRFKSkKLQkJZHJiZF9raGVscGVyKG1kZXYsICJwcmktb24taW5jb24tZGVnciIpOworCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAicHJpLW9uLWluY29uLWRlZ3IiKTsKIAogCS8qIEhlcmUgd2UgaGF2ZSB0aGUgYWN0aW9ucyB0aGF0IGFyZSBwZXJmb3JtZWQgYWZ0ZXIgYQogCSAgIHN0YXRlIGNoYW5nZS4gVGhpcyBmdW5jdGlvbiBtaWdodCBzbGVlcCAqLwogCiAJaWYgKG5zLnN1c3Bfbm9kKSB7Ci0JCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCQlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAkJZW51bSBkcmJkX3JlcV9ldmVudCB3aGF0ID0gTk9USElORzsKIAotCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQlpZiAob3MuY29ubiA8IENfQ09OTkVDVEVEICYmIGNvbm5fbG93ZXN0X2Nvbm4odGNvbm4pID49IENfQ09OTkVDVEVEKQorCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJCWlmIChvcy5jb25uIDwgQ19DT05ORUNURUQgJiYgY29ubl9sb3dlc3RfY29ubihjb25uZWN0aW9uKSA+PSBDX0NPTk5FQ1RFRCkKIAkJCXdoYXQgPSBSRVNFTkQ7CiAKIAkJaWYgKChvcy5kaXNrID09IERfQVRUQUNISU5HIHx8IG9zLmRpc2sgPT0gRF9ORUdPVElBVElORykgJiYKLQkJICAgIGNvbm5fbG93ZXN0X2Rpc2sodGNvbm4pID4gRF9ORUdPVElBVElORykKKwkJICAgIGNvbm5fbG93ZXN0X2Rpc2soY29ubmVjdGlvbikgPiBEX05FR09USUFUSU5HKQogCQkJd2hhdCA9IFJFU1RBUlRfRlJPWkVOX0RJU0tfSU87CiAKLQkJaWYgKHRjb25uLT5zdXNwX25vZCAmJiB3aGF0ICE9IE5PVEhJTkcpIHsKLQkJCV90bF9yZXN0YXJ0KHRjb25uLCB3aGF0KTsKLQkJCV9jb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sCisJCWlmIChyZXNvdXJjZS0+c3VzcF9ub2QgJiYgd2hhdCAhPSBOT1RISU5HKSB7CisJCQlfdGxfcmVzdGFydChjb25uZWN0aW9uLCB3aGF0KTsKKwkJCV9jb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwKIAkJCQkJICAgICh1bmlvbiBkcmJkX3N0YXRlKSB7IHsgLnN1c3Bfbm9kID0gMSB9IH0sCiAJCQkJCSAgICAodW5pb24gZHJiZF9zdGF0ZSkgeyB7IC5zdXNwX25vZCA9IDAgfSB9LAogCQkJCQkgICAgQ1NfVkVSQk9TRSk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAl9CiAKIAlpZiAobnMuc3VzcF9mZW4pIHsKLQkJc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uOwogCi0JCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JCWlmICh0Y29ubi0+c3VzcF9mZW4gJiYgY29ubl9sb3dlc3RfY29ubih0Y29ubikgPj0gQ19DT05ORUNURUQpIHsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQlpZiAocmVzb3VyY2UtPnN1c3BfZmVuICYmIGNvbm5fbG93ZXN0X2Nvbm4oY29ubmVjdGlvbikgPj0gQ19DT05ORUNURUQpIHsKIAkJCS8qIGNhc2UyOiBUaGUgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQgYWdhaW46ICovCi0JCQlzdHJ1Y3QgZHJiZF9jb25mICpvZGV2OworCQkJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCQkJaW50IHZucjsKIAogCQkJcmN1X3JlYWRfbG9jaygpOwotCQkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgb2Rldiwgdm5yKQotCQkJCWNsZWFyX2JpdChORVdfQ1VSX1VVSUQsICZvZGV2LT5mbGFncyk7CisJCQlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikKKwkJCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmcGVlcl9kZXZpY2UtPmRldmljZS0+ZmxhZ3MpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlfdGxfcmVzdGFydCh0Y29ubiwgUkVTRU5EKTsKLQkJCV9jb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sCisJCQlfdGxfcmVzdGFydChjb25uZWN0aW9uLCBSRVNFTkQpOworCQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLAogCQkJCQkgICAgKHVuaW9uIGRyYmRfc3RhdGUpIHsgeyAuc3VzcF9mZW4gPSAxIH0gfSwKIAkJCQkJICAgICh1bmlvbiBkcmJkX3N0YXRlKSB7IHsgLnN1c3BfZmVuID0gMCB9IH0sCiAJCQkJCSAgICBDU19WRVJCT1NFKTsKIAkJfQotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCX0KIAogCS8qIEJlY2FtZSBzeW5jIHNvdXJjZS4gIFdpdGggcHJvdG9jb2wgPj0gOTYsIHdlIHN0aWxsIG5lZWQgdG8gc2VuZCBvdXQKQEAgLTEyNzksOSArMTI5Miw5IEBACiAJICogd2hpY2ggaXMgdW5leHBlY3RlZC4gKi8KIAlpZiAoKG9zLmNvbm4gIT0gQ19TWU5DX1NPVVJDRSAmJiBvcy5jb25uICE9IENfUEFVU0VEX1NZTkNfUykgJiYKIAkgICAgKG5zLmNvbm4gPT0gQ19TWU5DX1NPVVJDRSB8fCBucy5jb25uID09IENfUEFVU0VEX1NZTkNfUykgJiYKLQkgICAgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA+PSA5NiAmJiBnZXRfbGRldihtZGV2KSkgewotCQlkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQobWRldik7Ci0JCXB1dF9sZGV2KG1kZXYpOworCSAgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gOTYgJiYgZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkcmJkX2dlbl9hbmRfc2VuZF9zeW5jX3V1aWQoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSk7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJLyogRG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGlmIGFib3ZlIGFuZCB0aGUgdHdvIGJlbG93Li4uICovCkBAIC0xMjg5LDIwICsxMzAyLDIwIEBACiAJICAgIG5zLnBkc2sgPiBEX0RJU0tMRVNTICYmIG5zLnBkc2sgIT0gRF9VTktOT1dOKSB7ICAgICAgLyogYXR0YWNoIG9uIHRoZSBwZWVyICovCiAJCS8qIHdlIHByb2JhYmx5IHdpbGwgc3RhcnQgYSByZXN5bmMgc29vbi4KIAkJICogbWFrZSBzdXJlIHRob3NlIHRoaW5ncyBhcmUgcHJvcGVybHkgcmVzZXQuICovCi0JCW1kZXYtPnJzX3RvdGFsID0gMDsKLQkJbWRldi0+cnNfZmFpbGVkID0gMDsKLQkJYXRvbWljX3NldCgmbWRldi0+cnNfcGVuZGluZ19jbnQsIDApOwotCQlkcmJkX3JzX2NhbmNlbF9hbGwobWRldik7CisJCWRldmljZS0+cnNfdG90YWwgPSAwOworCQlkZXZpY2UtPnJzX2ZhaWxlZCA9IDA7CisJCWF0b21pY19zZXQoJmRldmljZS0+cnNfcGVuZGluZ19jbnQsIDApOworCQlkcmJkX3JzX2NhbmNlbF9hbGwoZGV2aWNlKTsKIAotCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF91dWlkcyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKKwkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAl9CiAJLyogTm8gcG9pbnQgaW4gcXVldWluZyBzZW5kX2JpdG1hcCBpZiB3ZSBkb24ndCBoYXZlIGEgY29ubmVjdGlvbgogCSAqIGFueW1vcmUsIHNvIGNoZWNrIGFsc28gdGhlIF9jdXJyZW50XyBzdGF0ZSwgbm90IG9ubHkgdGhlIG5ldyBzdGF0ZQogCSAqIGF0IHRoZSB0aW1lIHRoaXMgd29yayB3YXMgcXVldWVkLiAqLwogCWlmIChvcy5jb25uICE9IENfV0ZfQklUTUFQX1MgJiYgbnMuY29ubiA9PSBDX1dGX0JJVE1BUF9TICYmCi0JICAgIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19XRl9CSVRNQVBfUykKLQkJZHJiZF9xdWV1ZV9iaXRtYXBfaW8obWRldiwgJmRyYmRfc2VuZF9iaXRtYXAsIE5VTEwsCisJICAgIGRldmljZS0+c3RhdGUuY29ubiA9PSBDX1dGX0JJVE1BUF9TKQorCQlkcmJkX3F1ZXVlX2JpdG1hcF9pbyhkZXZpY2UsICZkcmJkX3NlbmRfYml0bWFwLCBOVUxMLAogCQkJCSJzZW5kX2JpdG1hcCAoV0ZCaXRNYXBTKSIsCiAJCQkJQk1fTE9DS0VEX1RFU1RfQUxMT1dFRCk7CiAKQEAgLTEzMTMsODAgKzEzMjYsODAgQEAKIAkmJiAgKG5zLnBkc2sgPCBEX0lOQ09OU0lTVEVOVCB8fAogCSAgICAgbnMucGRzayA9PSBEX1VOS05PV04gfHwKIAkgICAgIG5zLnBkc2sgPT0gRF9PVVREQVRFRCkpIHsKLQkJaWYgKGdldF9sZGV2KG1kZXYpKSB7CisJCWlmIChnZXRfbGRldihkZXZpY2UpKSB7CiAJCQlpZiAoKG5zLnJvbGUgPT0gUl9QUklNQVJZIHx8IG5zLnBlZXIgPT0gUl9QUklNQVJZKSAmJgotCQkJICAgIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIG5zLmRpc2sgPj0gRF9VUF9UT19EQVRFKSB7Ci0JCQkJaWYgKGRyYmRfc3VzcGVuZGVkKG1kZXYpKSB7Ci0JCQkJCXNldF9iaXQoTkVXX0NVUl9VVUlELCAmbWRldi0+ZmxhZ3MpOworCQkJICAgIGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9CSVRNQVBdID09IDAgJiYgbnMuZGlzayA+PSBEX1VQX1RPX0RBVEUpIHsKKwkJCQlpZiAoZHJiZF9zdXNwZW5kZWQoZGV2aWNlKSkgeworCQkJCQlzZXRfYml0KE5FV19DVVJfVVVJRCwgJmRldmljZS0+ZmxhZ3MpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWRyYmRfdXVpZF9uZXdfY3VycmVudChtZGV2KTsKLQkJCQkJZHJiZF9zZW5kX3V1aWRzKG1kZXYpOworCQkJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQoZGV2aWNlKTsKKwkJCQkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOwogCQkJCX0KIAkJCX0KLQkJCXB1dF9sZGV2KG1kZXYpOworCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJfQogCX0KIAotCWlmIChucy5wZHNrIDwgRF9JTkNPTlNJU1RFTlQgJiYgZ2V0X2xkZXYobWRldikpIHsKKwlpZiAobnMucGRzayA8IERfSU5DT05TSVNURU5UICYmIGdldF9sZGV2KGRldmljZSkpIHsKIAkJaWYgKG9zLnBlZXIgPT0gUl9TRUNPTkRBUlkgJiYgbnMucGVlciA9PSBSX1BSSU1BUlkgJiYKLQkJICAgIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIG5zLmRpc2sgPj0gRF9VUF9UT19EQVRFKSB7Ci0JCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQobWRldik7Ci0JCQlkcmJkX3NlbmRfdXVpZHMobWRldik7CisJCSAgICBkZXZpY2UtPmxkZXYtPm1kLnV1aWRbVUlfQklUTUFQXSA9PSAwICYmIG5zLmRpc2sgPj0gRF9VUF9UT19EQVRFKSB7CisJCQlkcmJkX3V1aWRfbmV3X2N1cnJlbnQoZGV2aWNlKTsKKwkJCWRyYmRfc2VuZF91dWlkcyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKIAkJfQogCQkvKiBEX0RJU0tMRVNTIFBlZXIgYmVjb21lcyBzZWNvbmRhcnkgKi8KIAkJaWYgKG9zLnBlZXIgPT0gUl9QUklNQVJZICYmIG5zLnBlZXIgPT0gUl9TRUNPTkRBUlkpCiAJCQkvKiBXZSBtYXkgc3RpbGwgYmUgUHJpbWFyeSBvdXJzZWx2ZXMuCiAJCQkgKiBObyBoYXJtIGRvbmUgaWYgdGhlIGJpdG1hcCBzdGlsbCBjaGFuZ2VzLAogCQkJICogcmVkaXJ0aWVkIHBhZ2VzIHdpbGwgZm9sbG93IGxhdGVyLiAqLwotCQkJZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIobWRldiwgJmRyYmRfYm1fd3JpdGUsCisJCQlkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihkZXZpY2UsICZkcmJkX2JtX3dyaXRlLAogCQkJCSJkZW1vdGUgZGlza2xlc3MgcGVlciIsIEJNX0xPQ0tFRF9TRVRfQUxMT1dFRCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCS8qIFdyaXRlIG91dCBhbGwgY2hhbmdlZCBiaXRzIG9uIGRlbW90ZS4KIAkgKiBUaG91Z2gsIG5vIG5lZWQgdG8gZGEgdGhhdCBqdXN0IHlldAogCSAqIGlmIHRoZXJlIGlzIGEgcmVzeW5jIGdvaW5nIG9uIHN0aWxsICovCiAJaWYgKG9zLnJvbGUgPT0gUl9QUklNQVJZICYmIG5zLnJvbGUgPT0gUl9TRUNPTkRBUlkgJiYKLQkJbWRldi0+c3RhdGUuY29ubiA8PSBDX0NPTk5FQ1RFRCAmJiBnZXRfbGRldihtZGV2KSkgeworCQlkZXZpY2UtPnN0YXRlLmNvbm4gPD0gQ19DT05ORUNURUQgJiYgZ2V0X2xkZXYoZGV2aWNlKSkgewogCQkvKiBObyBjaGFuZ2VzIHRvIHRoZSBiaXRtYXAgZXhwZWN0ZWQgdGhpcyB0aW1lLCBzbyBhc3NlcnQgdGhhdCwKIAkJICogZXZlbiB0aG91Z2ggbm8gaGFybSB3YXMgZG9uZSBpZiBpdCBkaWQgY2hhbmdlLiAqLwotCQlkcmJkX2JpdG1hcF9pb19mcm9tX3dvcmtlcihtZGV2LCAmZHJiZF9ibV93cml0ZSwKKwkJZHJiZF9iaXRtYXBfaW9fZnJvbV93b3JrZXIoZGV2aWNlLCAmZHJiZF9ibV93cml0ZSwKIAkJCQkiZGVtb3RlIiwgQk1fTE9DS0VEX1RFU1RfQUxMT1dFRCk7Ci0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCX0KIAogCS8qIExhc3QgcGFydCBvZiB0aGUgYXR0YWNoaW5nIHByb2Nlc3MgLi4uICovCiAJaWYgKG5zLmNvbm4gPj0gQ19DT05ORUNURUQgJiYKIAkgICAgb3MuZGlzayA9PSBEX0FUVEFDSElORyAmJiBucy5kaXNrID09IERfTkVHT1RJQVRJTkcpIHsKLQkJZHJiZF9zZW5kX3NpemVzKG1kZXYsIDAsIDApOyAgLyogdG8gc3RhcnQgc3luYy4uLiAqLwotCQlkcmJkX3NlbmRfdXVpZHMobWRldik7Ci0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF9zaXplcyhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCAwLCAwKTsgIC8qIHRvIHN0YXJ0IHN5bmMuLi4gKi8KKwkJZHJiZF9zZW5kX3V1aWRzKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSkpOworCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCX0KIAogCS8qIFdlIHdhbnQgdG8gcGF1c2UvY29udGludWUgcmVzeW5jLCB0ZWxsIHBlZXIuICovCiAJaWYgKG5zLmNvbm4gPj0gQ19DT05ORUNURUQgJiYKIAkgICAgICgob3MuYWZ0cl9pc3AgIT0gbnMuYWZ0cl9pc3ApIHx8CiAJICAgICAgKG9zLnVzZXJfaXNwICE9IG5zLnVzZXJfaXNwKSkpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKIAkvKiBJbiBjYXNlIG9uZSBvZiB0aGUgaXNwIGJpdHMgZ290IHNldCwgc3VzcGVuZCBvdGhlciBkZXZpY2VzLiAqLwogCWlmICgoIW9zLmFmdHJfaXNwICYmICFvcy5wZWVyX2lzcCAmJiAhb3MudXNlcl9pc3ApICYmCiAJICAgIChucy5hZnRyX2lzcCB8fCBucy5wZWVyX2lzcCB8fCBucy51c2VyX2lzcCkpCi0JCXN1c3BlbmRfb3RoZXJfc2cobWRldik7CisJCXN1c3BlbmRfb3RoZXJfc2coZGV2aWNlKTsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgcGVlciBnZXRzIGluZm9ybWVkIGFib3V0IGV2ZW50dWFsIHN0YXRlCiAJICAgY2hhbmdlcyAoSVNQIGJpdHMpIHdoaWxlIHdlIHdlcmUgaW4gV0ZSZXBvcnRQYXJhbXMuICovCiAJaWYgKG9zLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIG5zLmNvbm4gPj0gQ19DT05ORUNURUQpCi0JCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKIAlpZiAob3MuY29ubiAhPSBDX0FIRUFEICYmIG5zLmNvbm4gPT0gQ19BSEVBRCkKLQkJZHJiZF9zZW5kX3N0YXRlKG1kZXYsIG5zKTsKKwkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAogCS8qIFdlIGFyZSBpbiB0aGUgcHJvZ3Jlc3MgdG8gc3RhcnQgYSBmdWxsIHN5bmMuLi4gKi8KIAlpZiAoKG9zLmNvbm4gIT0gQ19TVEFSVElOR19TWU5DX1QgJiYgbnMuY29ubiA9PSBDX1NUQVJUSU5HX1NZTkNfVCkgfHwKIAkgICAgKG9zLmNvbm4gIT0gQ19TVEFSVElOR19TWU5DX1MgJiYgbnMuY29ubiA9PSBDX1NUQVJUSU5HX1NZTkNfUykpCiAJCS8qIG5vIG90aGVyIGJpdG1hcCBjaGFuZ2VzIGV4cGVjdGVkIGR1cmluZyB0aGlzIHBoYXNlICovCi0JCWRyYmRfcXVldWVfYml0bWFwX2lvKG1kZXYsCisJCWRyYmRfcXVldWVfYml0bWFwX2lvKGRldmljZSwKIAkJCSZkcmJkX2JtaW9fc2V0X25fd3JpdGUsICZhYndfc3RhcnRfc3luYywKIAkJCSJzZXRfbl93cml0ZSBmcm9tIFN0YXJ0aW5nU3luYyIsIEJNX0xPQ0tFRF9URVNUX0FMTE9XRUQpOwogCkBAIC0xMzk5LDE1ICsxNDEyLDE1IEBACiAJCSAqIG91ciBjbGVhbnVwIGhlcmUgd2l0aCB0aGUgdHJhbnNpdGlvbiB0byBEX0RJU0tMRVNTLgogCQkgKiBCdXQgaXMgaXMgc3RpbGwgbm90IHNhdmUgdG8gZHJlZmVyZW5jZSBsZGV2IGhlcmUsIHNpbmNlCiAJCSAqIHdlIG1pZ2h0IGNvbWUgZnJvbSBhbiBmYWlsZWQgQXR0YWNoIGJlZm9yZSBsZGV2IHdhcyBzZXQuICovCi0JCWlmIChtZGV2LT5sZGV2KSB7CisJCWlmIChkZXZpY2UtPmxkZXYpIHsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCWVoID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPmxkZXYtPmRpc2tfY29uZiktPm9uX2lvX2Vycm9yOworCQkJZWggPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpLT5vbl9pb19lcnJvcjsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JCQl3YXNfaW9fZXJyb3IgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoV0FTX0lPX0VSUk9SLCAmbWRldi0+ZmxhZ3MpOworCQkJd2FzX2lvX2Vycm9yID0gdGVzdF9hbmRfY2xlYXJfYml0KFdBU19JT19FUlJPUiwgJmRldmljZS0+ZmxhZ3MpOwogCiAJCQlpZiAod2FzX2lvX2Vycm9yICYmIGVoID09IEVQX0NBTExfSEVMUEVSKQotCQkJCWRyYmRfa2hlbHBlcihtZGV2LCAibG9jYWwtaW8tZXJyb3IiKTsKKwkJCQlkcmJkX2toZWxwZXIoZGV2aWNlLCAibG9jYWwtaW8tZXJyb3IiKTsKIAogCQkJLyogSW1tZWRpYXRlbHkgYWxsb3cgY29tcGxldGlvbiBvZiBhbGwgYXBwbGljYXRpb24gSU8sCiAJCQkgKiB0aGF0IHdhaXRzIGZvciBjb21wbGV0aW9uIGZyb20gdGhlIGxvY2FsIGRpc2ssCkBAIC0xNDIyLDc2ICsxNDM1LDc2IEBACiAJCQkgKiBTbyBhYm9ydGluZyBsb2NhbCByZXF1ZXN0cyBtYXkgY2F1c2UgY3Jhc2hlcywKIAkJCSAqIG9yIGV2ZW4gd29yc2UsIHNpbGVudCBkYXRhIGNvcnJ1cHRpb24uCiAJCQkgKi8KLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRk9SQ0VfREVUQUNILCAmbWRldi0+ZmxhZ3MpKQotCQkJCXRsX2Fib3J0X2Rpc2tfaW8obWRldik7CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZPUkNFX0RFVEFDSCwgJmRldmljZS0+ZmxhZ3MpKQorCQkJCXRsX2Fib3J0X2Rpc2tfaW8oZGV2aWNlKTsKIAogCQkJLyogY3VycmVudCBzdGF0ZSBzdGlsbCBoYXMgdG8gYmUgRF9GQUlMRUQsCiAJCQkgKiB0aGVyZSBpcyBvbmx5IG9uZSB3YXkgb3V0OiB0byBEX0RJU0tMRVNTLAogCQkJICogYW5kIHRoYXQgbWF5IG9ubHkgaGFwcGVuIGFmdGVyIG91ciBwdXRfbGRldiBiZWxvdy4gKi8KLQkJCWlmIChtZGV2LT5zdGF0ZS5kaXNrICE9IERfRkFJTEVEKQotCQkJCWRldl9lcnIoREVWLAorCQkJaWYgKGRldmljZS0+c3RhdGUuZGlzayAhPSBEX0ZBSUxFRCkKKwkJCQlkcmJkX2VycihkZXZpY2UsCiAJCQkJCSJBU1NFUlQgRkFJTEVEOiBkaXNrIGlzICVzIGR1cmluZyBkZXRhY2hcbiIsCi0JCQkJCWRyYmRfZGlza19zdHIobWRldi0+c3RhdGUuZGlzaykpOworCQkJCQlkcmJkX2Rpc2tfc3RyKGRldmljZS0+c3RhdGUuZGlzaykpOwogCiAJCQlpZiAobnMuY29ubiA+PSBDX0NPTk5FQ1RFRCkKLQkJCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQkJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKLQkJCWRyYmRfcnNfY2FuY2VsX2FsbChtZGV2KTsKKwkJCWRyYmRfcnNfY2FuY2VsX2FsbChkZXZpY2UpOwogCiAJCQkvKiBJbiBjYXNlIHdlIHdhbnQgdG8gZ2V0IHNvbWV0aGluZyB0byBzdGFibGUgc3RvcmFnZSBzdGlsbCwKIAkJCSAqIHRoaXMgbWF5IGJlIHRoZSBsYXN0IGNoYW5jZS4KIAkJCSAqIEZvbGxvd2luZyBwdXRfbGRldiBtYXkgdHJhbnNpdGlvbiB0byBEX0RJU0tMRVNTLiAqLwotCQkJZHJiZF9tZF9zeW5jKG1kZXYpOworCQkJZHJiZF9tZF9zeW5jKGRldmljZSk7CiAJCX0KLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCi0gICAgICAgIC8qIHNlY29uZCBoYWxmIG9mIGxvY2FsIElPIGVycm9yLCBmYWlsdXJlIHRvIGF0dGFjaCwKLSAgICAgICAgICogb3IgYWRtaW5pc3RyYXRpdmUgZGV0YWNoLAotICAgICAgICAgKiBhZnRlciBsb2NhbF9jbnQgcmVmZXJlbmNlcyBoYXZlIHJlYWNoZWQgemVybyBhZ2FpbiAqLwotICAgICAgICBpZiAob3MuZGlzayAhPSBEX0RJU0tMRVNTICYmIG5zLmRpc2sgPT0gRF9ESVNLTEVTUykgewotICAgICAgICAgICAgICAgIC8qIFdlIG11c3Qgc3RpbGwgYmUgZGlza2xlc3MsCi0gICAgICAgICAgICAgICAgICogcmUtYXR0YWNoIGhhcyB0byBiZSBzZXJpYWxpemVkIHdpdGggdGhpcyEgKi8KLSAgICAgICAgICAgICAgICBpZiAobWRldi0+c3RhdGUuZGlzayAhPSBEX0RJU0tMRVNTKQotICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycihERVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBU1NFUlQgRkFJTEVEOiBkaXNrIGlzICVzIHdoaWxlIGdvaW5nIGRpc2tsZXNzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmJkX2Rpc2tfc3RyKG1kZXYtPnN0YXRlLmRpc2spKTsKKwkvKiBzZWNvbmQgaGFsZiBvZiBsb2NhbCBJTyBlcnJvciwgZmFpbHVyZSB0byBhdHRhY2gsCisJICogb3IgYWRtaW5pc3RyYXRpdmUgZGV0YWNoLAorCSAqIGFmdGVyIGxvY2FsX2NudCByZWZlcmVuY2VzIGhhdmUgcmVhY2hlZCB6ZXJvIGFnYWluICovCisJaWYgKG9zLmRpc2sgIT0gRF9ESVNLTEVTUyAmJiBucy5kaXNrID09IERfRElTS0xFU1MpIHsKKwkJLyogV2UgbXVzdCBzdGlsbCBiZSBkaXNrbGVzcywKKwkJICogcmUtYXR0YWNoIGhhcyB0byBiZSBzZXJpYWxpemVkIHdpdGggdGhpcyEgKi8KKwkJaWYgKGRldmljZS0+c3RhdGUuZGlzayAhPSBEX0RJU0tMRVNTKQorCQkJZHJiZF9lcnIoZGV2aWNlLAorCQkJCSAiQVNTRVJUIEZBSUxFRDogZGlzayBpcyAlcyB3aGlsZSBnb2luZyBkaXNrbGVzc1xuIiwKKwkJCQkgZHJiZF9kaXNrX3N0cihkZXZpY2UtPnN0YXRlLmRpc2spKTsKIAogCQlpZiAobnMuY29ubiA+PSBDX0NPTk5FQ1RFRCkKLQkJCWRyYmRfc2VuZF9zdGF0ZShtZGV2LCBucyk7CisJCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCQkvKiBjb3JyZXNwb25kaW5nIGdldF9sZGV2IGluIF9fZHJiZF9zZXRfc3RhdGUKIAkJICogdGhpcyBtYXkgZmluYWxseSB0cmlnZ2VyIGRyYmRfbGRldl9kZXN0cm95LiAqLwotCQlwdXRfbGRldihtZGV2KTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAkvKiBOb3RpZnkgcGVlciB0aGF0IEkgaGFkIGEgbG9jYWwgSU8gZXJyb3IsIGFuZCBkaWQgbm90IGRldGFjaGVkLi4gKi8KIAlpZiAob3MuZGlzayA9PSBEX1VQX1RPX0RBVEUgJiYgbnMuZGlzayA9PSBEX0lOQ09OU0lTVEVOVCAmJiBucy5jb25uID49IENfQ09OTkVDVEVEKQotCQlkcmJkX3NlbmRfc3RhdGUobWRldiwgbnMpOworCQlkcmJkX3NlbmRfc3RhdGUoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgbnMpOwogCiAJLyogRGlza3MgZ290IGJpZ2dlciB3aGlsZSB0aGV5IHdlcmUgZGV0YWNoZWQgKi8KIAlpZiAobnMuZGlzayA+IERfTkVHT1RJQVRJTkcgJiYgbnMucGRzayA+IERfTkVHT1RJQVRJTkcgJiYKLQkgICAgdGVzdF9hbmRfY2xlYXJfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZtZGV2LT5mbGFncykpIHsKKwkgICAgdGVzdF9hbmRfY2xlYXJfYml0KFJFU1lOQ19BRlRFUl9ORUcsICZkZXZpY2UtPmZsYWdzKSkgewogCQlpZiAobnMuY29ubiA9PSBDX0NPTk5FQ1RFRCkKLQkJCXJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhtZGV2KTsKKwkJCXJlc3luY19hZnRlcl9vbmxpbmVfZ3JvdyhkZXZpY2UpOwogCX0KIAogCS8qIEEgcmVzeW5jIGZpbmlzaGVkIG9yIGFib3J0ZWQsIHdha2UgcGF1c2VkIGRldmljZXMuLi4gKi8KIAlpZiAoKG9zLmNvbm4gPiBDX0NPTk5FQ1RFRCAmJiBucy5jb25uIDw9IENfQ09OTkVDVEVEKSB8fAogCSAgICAob3MucGVlcl9pc3AgJiYgIW5zLnBlZXJfaXNwKSB8fAogCSAgICAob3MudXNlcl9pc3AgJiYgIW5zLnVzZXJfaXNwKSkKLQkJcmVzdW1lX25leHRfc2cobWRldik7CisJCXJlc3VtZV9uZXh0X3NnKGRldmljZSk7CiAKIAkvKiBzeW5jIHRhcmdldCBkb25lIHdpdGggcmVzeW5jLiAgRXhwbGljaXRseSBub3RpZnkgcGVlciwgZXZlbiB0aG91Z2gKIAkgKiBpdCBzaG91bGQgKGF0IGxlYXN0IGZvciBub24tZW1wdHkgcmVzeW5jcykgYWxyZWFkeSBrbm93IGl0c2VsZi4gKi8KIAlpZiAob3MuZGlzayA8IERfVVBfVE9fREFURSAmJiBvcy5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYgbnMuY29ubiA9PSBDX0NPTk5FQ1RFRCkKLQkJZHJiZF9zZW5kX3N0YXRlKG1kZXYsIG5zKTsKKwkJZHJiZF9zZW5kX3N0YXRlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIG5zKTsKIAogCS8qIFZlcmlmeSBmaW5pc2hlZCwgb3IgcmVhY2hlZCBzdG9wIHNlY3Rvci4gIFBlZXIgZGlkIG5vdCBrbm93IGFib3V0CiAJICogdGhlIHN0b3Agc2VjdG9yLCBhbmQgd2UgbWF5IGV2ZW4gaGF2ZSBjaGFuZ2VkIHRoZSBzdG9wIHNlY3RvciBkdXJpbmcKIAkgKiB2ZXJpZnkgdG8gaW50ZXJydXB0L3N0b3AgZWFybHkuICBTZW5kIHRoZSBuZXcgc3RhdGUuICovCiAJaWYgKG9zLmNvbm4gPT0gQ19WRVJJRllfUyAmJiBucy5jb25uID09IENfQ09OTkVDVEVECi0JJiYgdmVyaWZ5X2Nhbl9kb19zdG9wX3NlY3RvcihtZGV2KSkKLQkJZHJiZF9zZW5kX3N0YXRlKG1kZXYsIG5zKTsKKwkmJiB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKGRldmljZSkpCisJCWRyYmRfc2VuZF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBucyk7CiAKIAkvKiBUaGlzIHRyaWdnZXJzIGJpdG1hcCB3cml0ZW91dCBvZiBwb3RlbnRpYWxseSBzdGlsbCB1bndyaXR0ZW4gcGFnZXMKIAkgKiBpZiB0aGUgcmVzeW5jIGZpbmlzaGVkIGNsZWFubHksIG9yIGFib3J0ZWQgYmVjYXVzZSBvZiBwZWVyIGRpc2sKQEAgLTE1MDAsNTYgKzE1MTMsNTcgQEAKIAkgKiBhbnkgYml0bWFwIHdyaXRlb3V0IGFueW1vcmUuCiAJICogTm8gaGFybSBkb25lIGlmIHNvbWUgYml0cyBjaGFuZ2UgZHVyaW5nIHRoaXMgcGhhc2UuCiAJICovCi0JaWYgKG9zLmNvbm4gPiBDX0NPTk5FQ1RFRCAmJiBucy5jb25uIDw9IENfQ09OTkVDVEVEICYmIGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfcXVldWVfYml0bWFwX2lvKG1kZXYsICZkcmJkX2JtX3dyaXRlX2NvcHlfcGFnZXMsIE5VTEwsCisJaWYgKG9zLmNvbm4gPiBDX0NPTk5FQ1RFRCAmJiBucy5jb25uIDw9IENfQ09OTkVDVEVEICYmIGdldF9sZGV2KGRldmljZSkpIHsKKwkJZHJiZF9xdWV1ZV9iaXRtYXBfaW8oZGV2aWNlLCAmZHJiZF9ibV93cml0ZV9jb3B5X3BhZ2VzLCBOVUxMLAogCQkJIndyaXRlIGZyb20gcmVzeW5jX2ZpbmlzaGVkIiwgQk1fTE9DS0VEX0NIQU5HRV9BTExPV0VEKTsKLQkJcHV0X2xkZXYobWRldik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJaWYgKG5zLmRpc2sgPT0gRF9ESVNLTEVTUyAmJgogCSAgICBucy5jb25uID09IENfU1RBTkRBTE9ORSAmJgogCSAgICBucy5yb2xlID09IFJfU0VDT05EQVJZKSB7CiAJCWlmIChvcy5hZnRyX2lzcCAhPSBucy5hZnRyX2lzcCkKLQkJCXJlc3VtZV9uZXh0X3NnKG1kZXYpOworCQkJcmVzdW1lX25leHRfc2coZGV2aWNlKTsKIAl9CiAKLQlkcmJkX21kX3N5bmMobWRldik7CisJZHJiZF9tZF9zeW5jKGRldmljZSk7CiB9CiAKIHN0cnVjdCBhZnRlcl9jb25uX3N0YXRlX2NoZ193b3JrIHsKIAlzdHJ1Y3QgZHJiZF93b3JrIHc7CiAJZW51bSBkcmJkX2Nvbm5zIG9jOwogCXVuaW9uIGRyYmRfc3RhdGUgbnNfbWluOwotCXVuaW9uIGRyYmRfc3RhdGUgbnNfbWF4OyAvKiBuZXcsIG1heCBzdGF0ZSwgb3ZlciBhbGwgbWRldnMgKi8KKwl1bmlvbiBkcmJkX3N0YXRlIG5zX21heDsgLyogbmV3LCBtYXggc3RhdGUsIG92ZXIgYWxsIGRldmljZXMgKi8KIAllbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFnczsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uOwogfTsKIAogc3RhdGljIGludCB3X2FmdGVyX2Nvbm5fc3RhdGVfY2goc3RydWN0IGRyYmRfd29yayAqdywgaW50IHVudXNlZCkKIHsKIAlzdHJ1Y3QgYWZ0ZXJfY29ubl9zdGF0ZV9jaGdfd29yayAqYWNzY3cgPQogCQljb250YWluZXJfb2Yodywgc3RydWN0IGFmdGVyX2Nvbm5fc3RhdGVfY2hnX3dvcmssIHcpOwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IHctPnRjb25uOworCXN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBhY3Njdy0+Y29ubmVjdGlvbjsKIAllbnVtIGRyYmRfY29ubnMgb2MgPSBhY3Njdy0+b2M7CiAJdW5pb24gZHJiZF9zdGF0ZSBuc19tYXggPSBhY3Njdy0+bnNfbWF4OwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCWludCB2bnI7CiAKIAlrZnJlZShhY3Njdyk7CiAKIAkvKiBVcG9uIG5ldHdvcmsgY29uZmlndXJhdGlvbiwgd2UgbmVlZCB0byBzdGFydCB0aGUgcmVjZWl2ZXIgKi8KIAlpZiAob2MgPT0gQ19TVEFOREFMT05FICYmIG5zX21heC5jb25uID09IENfVU5DT05ORUNURUQpCi0JCWRyYmRfdGhyZWFkX3N0YXJ0KCZ0Y29ubi0+cmVjZWl2ZXIpOworCQlkcmJkX3RocmVhZF9zdGFydCgmY29ubmVjdGlvbi0+cmVjZWl2ZXIpOwogCiAJaWYgKG9jID09IENfRElTQ09OTkVDVElORyAmJiBuc19tYXguY29ubiA9PSBDX1NUQU5EQUxPTkUpIHsKIAkJc3RydWN0IG5ldF9jb25mICpvbGRfY29uZjsKIAotCQltdXRleF9sb2NrKCZ0Y29ubi0+Y29uZl91cGRhdGUpOwotCQlvbGRfY29uZiA9IHRjb25uLT5uZXRfY29uZjsKLQkJdGNvbm4tPm15X2FkZHJfbGVuID0gMDsKLQkJdGNvbm4tPnBlZXJfYWRkcl9sZW4gPSAwOwotCQlyY3VfYXNzaWduX3BvaW50ZXIodGNvbm4tPm5ldF9jb25mLCBOVUxMKTsKLQkJY29ubl9mcmVlX2NyeXB0byh0Y29ubik7Ci0JCW11dGV4X3VubG9jaygmdGNvbm4tPmNvbmZfdXBkYXRlKTsKKwkJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+cmVzb3VyY2UtPmNvbmZfdXBkYXRlKTsKKwkJb2xkX2NvbmYgPSBjb25uZWN0aW9uLT5uZXRfY29uZjsKKwkJY29ubmVjdGlvbi0+bXlfYWRkcl9sZW4gPSAwOworCQljb25uZWN0aW9uLT5wZWVyX2FkZHJfbGVuID0gMDsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5lY3Rpb24tPm5ldF9jb25mLCBOVUxMKTsKKwkJY29ubl9mcmVlX2NyeXB0byhjb25uZWN0aW9uKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+Y29uZl91cGRhdGUpOwogCiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlrZnJlZShvbGRfY29uZik7CkBAIC0xNTU5LDQ1ICsxNTczLDQ3IEBACiAJCS8qIGNhc2UxOiBUaGUgb3V0ZGF0ZSBwZWVyIGhhbmRsZXIgaXMgc3VjY2Vzc2Z1bDogKi8KIAkJaWYgKG5zX21heC5wZHNrIDw9IERfT1VUREFURUQpIHsKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQkJCWlmICh0ZXN0X2JpdChORVdfQ1VSX1VVSUQsICZtZGV2LT5mbGFncykpIHsKLQkJCQkJZHJiZF91dWlkX25ld19jdXJyZW50KG1kZXYpOwotCQkJCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmbWRldi0+ZmxhZ3MpOworCQkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCQkJaWYgKHRlc3RfYml0KE5FV19DVVJfVVVJRCwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCQkJCWRyYmRfdXVpZF9uZXdfY3VycmVudChkZXZpY2UpOworCQkJCQljbGVhcl9iaXQoTkVXX0NVUl9VVUlELCAmZGV2aWNlLT5mbGFncyk7CiAJCQkJfQogCQkJfQogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZ0Y29ubi0+cmVxX2xvY2spOwotCQkJX3RsX3Jlc3RhcnQodGNvbm4sIENPTk5FQ1RJT05fTE9TVF9XSElMRV9QRU5ESU5HKTsKLQkJCV9jb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sCisJCQlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQkJX3RsX3Jlc3RhcnQoY29ubmVjdGlvbiwgQ09OTkVDVElPTl9MT1NUX1dISUxFX1BFTkRJTkcpOworCQkJX2Nvbm5fcmVxdWVzdF9zdGF0ZShjb25uZWN0aW9uLAogCQkJCQkgICAgKHVuaW9uIGRyYmRfc3RhdGUpIHsgeyAuc3VzcF9mZW4gPSAxIH0gfSwKIAkJCQkJICAgICh1bmlvbiBkcmJkX3N0YXRlKSB7IHsgLnN1c3BfZmVuID0gMCB9IH0sCiAJCQkJCSAgICBDU19WRVJCT1NFKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAkJfQogCX0KLQlrcmVmX3B1dCgmdGNvbm4tPmtyZWYsICZjb25uX2Rlc3Ryb3kpOworCWtyZWZfcHV0KCZjb25uZWN0aW9uLT5rcmVmLCBkcmJkX2Rlc3Ryb3lfY29ubmVjdGlvbik7CiAKLQljb25uX21kX3N5bmModGNvbm4pOworCWNvbm5fbWRfc3luYyhjb25uZWN0aW9uKTsKIAogCXJldHVybiAwOwogfQogCi12b2lkIGNvbm5fb2xkX2NvbW1vbl9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgKnBjcywgZW51bSBjaGdfc3RhdGVfZmxhZ3MgKnBmKQordm9pZCBjb25uX29sZF9jb21tb25fc3RhdGUoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdW5pb24gZHJiZF9zdGF0ZSAqcGNzLCBlbnVtIGNoZ19zdGF0ZV9mbGFncyAqcGYpCiB7CiAJZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MgPSB+MDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yLCBmaXJzdF92b2wgPSAxOwogCXVuaW9uIGRyYmRfZGV2X3N0YXRlIG9zLCBjcyA9IHsKIAkJeyAucm9sZSA9IFJfU0VDT05EQVJZLAogCQkgIC5wZWVyID0gUl9VTktOT1dOLAotCQkgIC5jb25uID0gdGNvbm4tPmNzdGF0ZSwKKwkJICAuY29ubiA9IGNvbm5lY3Rpb24tPmNzdGF0ZSwKIAkJICAuZGlzayA9IERfRElTS0xFU1MsCiAJCSAgLnBkc2sgPSBEX1VOS05PV04sCiAJCX0gfTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJb3MgPSBtZGV2LT5zdGF0ZTsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmNvbm5lY3Rpb24tPnBlZXJfZGV2aWNlcywgcGVlcl9kZXZpY2UsIHZucikgeworCQlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CisJCW9zID0gZGV2aWNlLT5zdGF0ZTsKIAogCQlpZiAoZmlyc3Rfdm9sKSB7CiAJCQljcyA9IG9zOwpAQCAtMTYyOCwxOCArMTY0NCwxOSBAQAogfQogCiBzdGF0aWMgZW51bSBkcmJkX3N0YXRlX3J2Ci1jb25uX2lzX3ZhbGlkX3RyYW5zaXRpb24oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAorY29ubl9pc192YWxpZF90cmFuc2l0aW9uKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCiAJCQkgZW51bSBjaGdfc3RhdGVfZmxhZ3MgZmxhZ3MpCiB7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2ID0gU1NfU1VDQ0VTUzsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zLCBvczsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAlpbnQgdm5yOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlkcl9mb3JfZWFjaF9lbnRyeSgmdGNvbm4tPnZvbHVtZXMsIG1kZXYsIHZucikgewotCQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKLQkJbnMgPSBzYW5pdGl6ZV9zdGF0ZShtZGV2LCBhcHBseV9tYXNrX3ZhbChvcywgbWFzaywgdmFsKSwgTlVMTCk7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOworCQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOworCQlucyA9IHNhbml0aXplX3N0YXRlKGRldmljZSwgYXBwbHlfbWFza192YWwob3MsIG1hc2ssIHZhbCksIE5VTEwpOwogCiAJCWlmIChmbGFncyAmIENTX0lHTl9PVVREX0ZBSUwgJiYgbnMuZGlzayA9PSBEX09VVERBVEVEICYmIG9zLmRpc2sgPCBEX09VVERBVEVEKQogCQkJbnMuZGlzayA9IG9zLmRpc2s7CkBAIC0xNjQ4LDMwICsxNjY1LDI5IEBACiAJCQljb250aW51ZTsKIAogCQlydiA9IGlzX3ZhbGlkX3RyYW5zaXRpb24ob3MsIG5zKTsKLQkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKLQkJCWJyZWFrOwogCi0JCWlmICghKGZsYWdzICYgQ1NfSEFSRCkpIHsKLQkJCXJ2ID0gaXNfdmFsaWRfc3RhdGUobWRldiwgbnMpOworCQlpZiAocnYgPj0gU1NfU1VDQ0VTUyAmJiAhKGZsYWdzICYgQ1NfSEFSRCkpIHsKKwkJCXJ2ID0gaXNfdmFsaWRfc3RhdGUoZGV2aWNlLCBucyk7CiAJCQlpZiAocnYgPCBTU19TVUNDRVNTKSB7Ci0JCQkJaWYgKGlzX3ZhbGlkX3N0YXRlKG1kZXYsIG9zKSA9PSBydikKLQkJCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCB0Y29ubik7CisJCQkJaWYgKGlzX3ZhbGlkX3N0YXRlKGRldmljZSwgb3MpID09IHJ2KQorCQkJCQlydiA9IGlzX3ZhbGlkX3NvZnRfdHJhbnNpdGlvbihvcywgbnMsIGNvbm5lY3Rpb24pOwogCQkJfSBlbHNlCi0JCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCB0Y29ubik7CisJCQkJcnYgPSBpc192YWxpZF9zb2Z0X3RyYW5zaXRpb24ob3MsIG5zLCBjb25uZWN0aW9uKTsKIAkJfQotCQlpZiAocnYgPCBTU19TVUNDRVNTKQorCisJCWlmIChydiA8IFNTX1NVQ0NFU1MpIHsKKwkJCWlmIChmbGFncyAmIENTX1ZFUkJPU0UpCisJCQkJcHJpbnRfc3RfZXJyKGRldmljZSwgb3MsIG5zLCBydik7CiAJCQlicmVhazsKKwkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChydiA8IFNTX1NVQ0NFU1MgJiYgZmxhZ3MgJiBDU19WRVJCT1NFKQotCQlwcmludF9zdF9lcnIobWRldiwgb3MsIG5zLCBydik7Ci0KIAlyZXR1cm4gcnY7CiB9CiAKIHZvaWQKLWNvbm5fc2V0X3N0YXRlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKK2Nvbm5fc2V0X3N0YXRlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCiAJICAgICAgIHVuaW9uIGRyYmRfc3RhdGUgKnBuc19taW4sIHVuaW9uIGRyYmRfc3RhdGUgKnBuc19tYXgsIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzKQogewogCXVuaW9uIGRyYmRfc3RhdGUgbnMsIG9zLCBuc19tYXggPSB7IH07CkBAIC0xNjgyLDcgKzE2OTgsNyBAQAogCQkgIC5kaXNrID0gRF9NQVNLLAogCQkgIC5wZHNrID0gRF9NQVNLCiAJCX0gfTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZTsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnY7CiAJaW50IHZuciwgbnVtYmVyX29mX3ZvbHVtZXMgPSAwOwogCkBAIC0xNjkwLDI3ICsxNzA2LDI4IEBACiAJCS8qIHJlbWVtYmVyIGxhc3QgY29ubmVjdCB0aW1lIHNvIHJlcXVlc3RfdGltZXJfZm4oKSB3b24ndAogCQkgKiBraWxsIG5ld2x5IGVzdGFibGlzaGVkIHNlc3Npb25zIHdoaWxlIHdlIGFyZSBzdGlsbCB0cnlpbmcgdG8gdGhhdwogCQkgKiBwcmV2aW91c2x5IGZyb3plbiBJTyAqLwotCQlpZiAodGNvbm4tPmNzdGF0ZSAhPSBDX1dGX1JFUE9SVF9QQVJBTVMgJiYgdmFsLmNvbm4gPT0gQ19XRl9SRVBPUlRfUEFSQU1TKQotCQkJdGNvbm4tPmxhc3RfcmVjb25uZWN0X2ppZiA9IGppZmZpZXM7CisJCWlmIChjb25uZWN0aW9uLT5jc3RhdGUgIT0gQ19XRl9SRVBPUlRfUEFSQU1TICYmIHZhbC5jb25uID09IENfV0ZfUkVQT1JUX1BBUkFNUykKKwkJCWNvbm5lY3Rpb24tPmxhc3RfcmVjb25uZWN0X2ppZiA9IGppZmZpZXM7CiAKLQkJdGNvbm4tPmNzdGF0ZSA9IHZhbC5jb25uOworCQljb25uZWN0aW9uLT5jc3RhdGUgPSB2YWwuY29ubjsKIAl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZ0Y29ubi0+dm9sdW1lcywgbWRldiwgdm5yKSB7CisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjb25uZWN0aW9uLT5wZWVyX2RldmljZXMsIHBlZXJfZGV2aWNlLCB2bnIpIHsKKwkJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCQludW1iZXJfb2Zfdm9sdW1lcysrOwotCQlvcyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKKwkJb3MgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAkJbnMgPSBhcHBseV9tYXNrX3ZhbChvcywgbWFzaywgdmFsKTsKLQkJbnMgPSBzYW5pdGl6ZV9zdGF0ZShtZGV2LCBucywgTlVMTCk7CisJCW5zID0gc2FuaXRpemVfc3RhdGUoZGV2aWNlLCBucywgTlVMTCk7CiAKIAkJaWYgKGZsYWdzICYgQ1NfSUdOX09VVERfRkFJTCAmJiBucy5kaXNrID09IERfT1VUREFURUQgJiYgb3MuZGlzayA8IERfT1VUREFURUQpCiAJCQlucy5kaXNrID0gb3MuZGlzazsKIAotCQlydiA9IF9fZHJiZF9zZXRfc3RhdGUobWRldiwgbnMsIGZsYWdzLCBOVUxMKTsKKwkJcnYgPSBfX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIGZsYWdzLCBOVUxMKTsKIAkJaWYgKHJ2IDwgU1NfU1VDQ0VTUykKIAkJCUJVRygpOwogCi0JCW5zLmkgPSBtZGV2LT5zdGF0ZS5pOworCQlucy5pID0gZGV2aWNlLT5zdGF0ZS5pOwogCQluc19tYXgucm9sZSA9IG1heF9yb2xlKG5zLnJvbGUsIG5zX21heC5yb2xlKTsKIAkJbnNfbWF4LnBlZXIgPSBtYXhfcm9sZShucy5wZWVyLCBuc19tYXgucGVlcik7CiAJCW5zX21heC5jb25uID0gbWF4X3QoZW51bSBkcmJkX2Nvbm5zLCBucy5jb25uLCBuc19tYXguY29ubik7CkBAIC0xNzM1LDM5ICsxNzUyLDM5IEBACiAJCQl9IH07CiAJfQogCi0JbnNfbWluLnN1c3AgPSBuc19tYXguc3VzcCA9IHRjb25uLT5zdXNwOwotCW5zX21pbi5zdXNwX25vZCA9IG5zX21heC5zdXNwX25vZCA9IHRjb25uLT5zdXNwX25vZDsKLQluc19taW4uc3VzcF9mZW4gPSBuc19tYXguc3VzcF9mZW4gPSB0Y29ubi0+c3VzcF9mZW47CisJbnNfbWluLnN1c3AgPSBuc19tYXguc3VzcCA9IGNvbm5lY3Rpb24tPnJlc291cmNlLT5zdXNwOworCW5zX21pbi5zdXNwX25vZCA9IG5zX21heC5zdXNwX25vZCA9IGNvbm5lY3Rpb24tPnJlc291cmNlLT5zdXNwX25vZDsKKwluc19taW4uc3VzcF9mZW4gPSBuc19tYXguc3VzcF9mZW4gPSBjb25uZWN0aW9uLT5yZXNvdXJjZS0+c3VzcF9mZW47CiAKIAkqcG5zX21pbiA9IG5zX21pbjsKIAkqcG5zX21heCA9IG5zX21heDsKIH0KIAogc3RhdGljIGVudW0gZHJiZF9zdGF0ZV9ydgotX2Nvbm5fcnFfY29uZChzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwpCitfY29ubl9ycV9jb25kKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwpCiB7CiAJZW51bSBkcmJkX3N0YXRlX3J2IHJ2OwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1dEX1NUX0NIR19PS0FZLCAmdGNvbm4tPmZsYWdzKSkKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX09LQVksICZjb25uZWN0aW9uLT5mbGFncykpCiAJCXJldHVybiBTU19DV19TVUNDRVNTOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1dEX1NUX0NIR19GQUlMLCAmdGNvbm4tPmZsYWdzKSkKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX0ZBSUwsICZjb25uZWN0aW9uLT5mbGFncykpCiAJCXJldHVybiBTU19DV19GQUlMRURfQllfUEVFUjsKIAotCXJ2ID0gY29ubl9pc192YWxpZF90cmFuc2l0aW9uKHRjb25uLCBtYXNrLCB2YWwsIDApOwotCWlmIChydiA9PSBTU19TVUNDRVNTICYmIHRjb25uLT5jc3RhdGUgPT0gQ19XRl9SRVBPUlRfUEFSQU1TKQorCXJ2ID0gY29ubl9pc192YWxpZF90cmFuc2l0aW9uKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgMCk7CisJaWYgKHJ2ID09IFNTX1NVQ0NFU1MgJiYgY29ubmVjdGlvbi0+Y3N0YXRlID09IENfV0ZfUkVQT1JUX1BBUkFNUykKIAkJcnYgPSBTU19VTktOT1dOX0VSUk9SOyAvKiBjb250aW51ZSB3YWl0aW5nICovCiAKIAlyZXR1cm4gcnY7CiB9CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotX2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCitfY29ubl9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCiAJCSAgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncykKIHsKIAllbnVtIGRyYmRfc3RhdGVfcnYgcnYgPSBTU19TVUNDRVNTOwogCXN0cnVjdCBhZnRlcl9jb25uX3N0YXRlX2NoZ193b3JrICphY3NjdzsKLQllbnVtIGRyYmRfY29ubnMgb2MgPSB0Y29ubi0+Y3N0YXRlOworCWVudW0gZHJiZF9jb25ucyBvYyA9IGNvbm5lY3Rpb24tPmNzdGF0ZTsKIAl1bmlvbiBkcmJkX3N0YXRlIG5zX21heCwgbnNfbWluLCBvczsKIAlib29sIGhhdmVfbXV0ZXggPSBmYWxzZTsKIApAQCAtMTc3Nyw3ICsxNzk0LDcgQEAKIAkJCWdvdG8gYWJvcnQ7CiAJfQogCi0JcnYgPSBjb25uX2lzX3ZhbGlkX3RyYW5zaXRpb24odGNvbm4sIG1hc2ssIHZhbCwgZmxhZ3MpOworCXJ2ID0gY29ubl9pc192YWxpZF90cmFuc2l0aW9uKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCwgZmxhZ3MpOwogCWlmIChydiA8IFNTX1NVQ0NFU1MpCiAJCWdvdG8gYWJvcnQ7CiAKQEAgLTE3ODcsMzggKzE4MDQsMzggQEAKIAkJLyogVGhpcyB3aWxsIGJlIGEgY2x1c3Rlci13aWRlIHN0YXRlIGNoYW5nZS4KIAkJICogTmVlZCB0byBnaXZlIHVwIHRoZSBzcGlubG9jaywgZ3JhYiB0aGUgbXV0ZXgsCiAJCSAqIHRoZW4gc2VuZCB0aGUgc3RhdGUgY2hhbmdlIHJlcXVlc3QsIC4uLiAqLwotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JCW11dGV4X2xvY2soJnRjb25uLT5jc3RhdGVfbXV0ZXgpOworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CisJCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPmNzdGF0ZV9tdXRleCk7CiAJCWhhdmVfbXV0ZXggPSB0cnVlOwogCi0JCXNldF9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmdGNvbm4tPmZsYWdzKTsKLQkJaWYgKGNvbm5fc2VuZF9zdGF0ZV9yZXEodGNvbm4sIG1hc2ssIHZhbCkpIHsKKwkJc2V0X2JpdChDT05OX1dEX1NUX0NIR19SRVEsICZjb25uZWN0aW9uLT5mbGFncyk7CisJCWlmIChjb25uX3NlbmRfc3RhdGVfcmVxKGNvbm5lY3Rpb24sIG1hc2ssIHZhbCkpIHsKIAkJCS8qIHNlbmRpbmcgZmFpbGVkLiAqLwotCQkJY2xlYXJfYml0KENPTk5fV0RfU1RfQ0hHX1JFUSwgJnRjb25uLT5mbGFncyk7CisJCQljbGVhcl9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCQkJcnYgPSBTU19DV19GQUlMRURfQllfUEVFUjsKIAkJCS8qIG5lZWQgdG8gcmUtYXF1aXJlIHRoZSBzcGluIGxvY2ssIHRob3VnaCAqLwogCQkJZ290byBhYm9ydF91bmxvY2tlZDsKIAkJfQogCiAJCWlmICh2YWwuY29ubiA9PSBDX0RJU0NPTk5FQ1RJTkcpCi0JCQlzZXRfYml0KERJU0NPTk5FQ1RfU0VOVCwgJnRjb25uLT5mbGFncyk7CisJCQlzZXRfYml0KERJU0NPTk5FQ1RfU0VOVCwgJmNvbm5lY3Rpb24tPmZsYWdzKTsKIAogCQkvKiAuLi4gYW5kIHJlLWFxdWlyZSB0aGUgc3BpbmxvY2suCiAJCSAqIElmIF9jb25uX3JxX2NvbmQoKSByZXR1cm5lZCA+PSBTU19TVUNDRVNTLCB3ZSBtdXN0IGNhbGwKIAkJICogY29ubl9zZXRfc3RhdGUoKSB3aXRoaW4gdGhlIHNhbWUgc3BpbmxvY2suICovCi0JCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JCXdhaXRfZXZlbnRfbG9ja19pcnEodGNvbm4tPnBpbmdfd2FpdCwKLQkJCQkocnYgPSBfY29ubl9ycV9jb25kKHRjb25uLCBtYXNrLCB2YWwpKSwKLQkJCQl0Y29ubi0+cmVxX2xvY2spOwotCQljbGVhcl9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmdGNvbm4tPmZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwkJd2FpdF9ldmVudF9sb2NrX2lycShjb25uZWN0aW9uLT5waW5nX3dhaXQsCisJCQkJKHJ2ID0gX2Nvbm5fcnFfY29uZChjb25uZWN0aW9uLCBtYXNrLCB2YWwpKSwKKwkJCQljb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCQljbGVhcl9iaXQoQ09OTl9XRF9TVF9DSEdfUkVRLCAmY29ubmVjdGlvbi0+ZmxhZ3MpOwogCQlpZiAocnYgPCBTU19TVUNDRVNTKQogCQkJZ290byBhYm9ydDsKIAl9CiAKLQljb25uX29sZF9jb21tb25fc3RhdGUodGNvbm4sICZvcywgJmZsYWdzKTsKKwljb25uX29sZF9jb21tb25fc3RhdGUoY29ubmVjdGlvbiwgJm9zLCAmZmxhZ3MpOwogCWZsYWdzIHw9IENTX0RDX1NVU1A7Ci0JY29ubl9zZXRfc3RhdGUodGNvbm4sIG1hc2ssIHZhbCwgJm5zX21pbiwgJm5zX21heCwgZmxhZ3MpOwotCWNvbm5fcHJfc3RhdGVfY2hhbmdlKHRjb25uLCBvcywgbnNfbWF4LCBmbGFncyk7CisJY29ubl9zZXRfc3RhdGUoY29ubmVjdGlvbiwgbWFzaywgdmFsLCAmbnNfbWluLCAmbnNfbWF4LCBmbGFncyk7CisJY29ubl9wcl9zdGF0ZV9jaGFuZ2UoY29ubmVjdGlvbiwgb3MsIG5zX21heCwgZmxhZ3MpOwogCiAJYWNzY3cgPSBrbWFsbG9jKHNpemVvZigqYWNzY3cpLCBHRlBfQVRPTUlDKTsKIAlpZiAoYWNzY3cpIHsKQEAgLTE4MjcsMzkgKzE4NDQsMzkgQEAKIAkJYWNzY3ctPm5zX21heCA9IG5zX21heDsKIAkJYWNzY3ctPmZsYWdzID0gZmxhZ3M7CiAJCWFjc2N3LT53LmNiID0gd19hZnRlcl9jb25uX3N0YXRlX2NoOwotCQlrcmVmX2dldCgmdGNvbm4tPmtyZWYpOwotCQlhY3Njdy0+dy50Y29ubiA9IHRjb25uOwotCQlkcmJkX3F1ZXVlX3dvcmsoJnRjb25uLT5zZW5kZXJfd29yaywgJmFjc2N3LT53KTsKKwkJa3JlZl9nZXQoJmNvbm5lY3Rpb24tPmtyZWYpOworCQlhY3Njdy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJCWRyYmRfcXVldWVfd29yaygmY29ubmVjdGlvbi0+c2VuZGVyX3dvcmssICZhY3Njdy0+dyk7CiAJfSBlbHNlIHsKLQkJY29ubl9lcnIodGNvbm4sICJDb3VsZCBub3Qga21hbGxvYyBhbiBhY3Njd1xuIik7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICJDb3VsZCBub3Qga21hbGxvYyBhbiBhY3Njd1xuIik7CiAJfQogCiAgYWJvcnQ6CiAJaWYgKGhhdmVfbXV0ZXgpIHsKIAkJLyogbXV0ZXhfdW5sb2NrKCkgIi4uLiBtdXN0IG5vdCBiZSB1c2VkIGluIGludGVycnVwdCBjb250ZXh0LiIsCiAJCSAqIHNvIGdpdmUgdXAgdGhlIHNwaW5sb2NrLCB0aGVuIHJlLWFxdWlyZSBpdCAqLwotCQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKICBhYm9ydF91bmxvY2tlZDoKLQkJbXV0ZXhfdW5sb2NrKCZ0Y29ubi0+Y3N0YXRlX211dGV4KTsKLQkJc3Bpbl9sb2NrX2lycSgmdGNvbm4tPnJlcV9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5jc3RhdGVfbXV0ZXgpOworCQlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCX0KIAlpZiAocnYgPCBTU19TVUNDRVNTICYmIGZsYWdzICYgQ1NfVkVSQk9TRSkgewotCQljb25uX2Vycih0Y29ubiwgIlN0YXRlIGNoYW5nZSBmYWlsZWQ6ICVzXG4iLCBkcmJkX3NldF9zdF9lcnJfc3RyKHJ2KSk7Ci0JCWNvbm5fZXJyKHRjb25uLCAiIG1hc2sgPSAweCV4IHZhbCA9IDB4JXhcbiIsIG1hc2suaSwgdmFsLmkpOwotCQljb25uX2Vycih0Y29ubiwgIiBvbGRfY29ubjolcyB3YW50ZWRfY29ubjolc1xuIiwgZHJiZF9jb25uX3N0cihvYyksIGRyYmRfY29ubl9zdHIodmFsLmNvbm4pKTsKKwkJZHJiZF9lcnIoY29ubmVjdGlvbiwgIlN0YXRlIGNoYW5nZSBmYWlsZWQ6ICVzXG4iLCBkcmJkX3NldF9zdF9lcnJfc3RyKHJ2KSk7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIgbWFzayA9IDB4JXggdmFsID0gMHgleFxuIiwgbWFzay5pLCB2YWwuaSk7CisJCWRyYmRfZXJyKGNvbm5lY3Rpb24sICIgb2xkX2Nvbm46JXMgd2FudGVkX2Nvbm46JXNcbiIsIGRyYmRfY29ubl9zdHIob2MpLCBkcmJkX2Nvbm5fc3RyKHZhbC5jb25uKSk7CiAJfQogCXJldHVybiBydjsKIH0KIAogZW51bSBkcmJkX3N0YXRlX3J2Ci1jb25uX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAorY29ubl9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCiAJCSAgIGVudW0gY2hnX3N0YXRlX2ZsYWdzIGZsYWdzKQogewogCWVudW0gZHJiZF9zdGF0ZV9ydiBydjsKIAotCXNwaW5fbG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7Ci0JcnYgPSBfY29ubl9yZXF1ZXN0X3N0YXRlKHRjb25uLCBtYXNrLCB2YWwsIGZsYWdzKTsKLQlzcGluX3VubG9ja19pcnEoJnRjb25uLT5yZXFfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlydiA9IF9jb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgbWFzaywgdmFsLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCiAJcmV0dXJuIHJ2OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuaCBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0YXRlLmgKaW5kZXggYTNjMzYxYi4uY2M0MTYwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RhdGUuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdGF0ZS5oCkBAIC0xLDggKzEsOCBAQAogI2lmbmRlZiBEUkJEX1NUQVRFX0gKICNkZWZpbmUgRFJCRF9TVEFURV9ICiAKLXN0cnVjdCBkcmJkX2NvbmY7Ci1zdHJ1Y3QgZHJiZF90Y29ubjsKK3N0cnVjdCBkcmJkX2RldmljZTsKK3N0cnVjdCBkcmJkX2Nvbm5lY3Rpb247CiAKIC8qKgogICogRE9DOiBEUkJEIFN0YXRlIG1hY3JvcwpAQCAtMTA3LDM2ICsxMDcsMzYgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIH07CiAKLWV4dGVybiBlbnVtIGRyYmRfc3RhdGVfcnYgZHJiZF9jaGFuZ2Vfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqbWRldiwKK2V4dGVybiBlbnVtIGRyYmRfc3RhdGVfcnYgZHJiZF9jaGFuZ2Vfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJCSAgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmLAogCQkJCQkgICAgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLAogCQkJCQkgICAgdW5pb24gZHJiZF9zdGF0ZSB2YWwpOwotZXh0ZXJuIHZvaWQgZHJiZF9mb3JjZV9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25mICosIHVuaW9uIGRyYmRfc3RhdGUsCitleHRlcm4gdm9pZCBkcmJkX2ZvcmNlX3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqLCB1bmlvbiBkcmJkX3N0YXRlLAogCQkJdW5pb24gZHJiZF9zdGF0ZSk7Ci1leHRlcm4gZW51bSBkcmJkX3N0YXRlX3J2IF9kcmJkX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqLAorZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBfZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqLAogCQkJCQkgICAgICB1bmlvbiBkcmJkX3N0YXRlLAogCQkJCQkgICAgICB1bmlvbiBkcmJkX3N0YXRlLAogCQkJCQkgICAgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyk7Ci1leHRlcm4gZW51bSBkcmJkX3N0YXRlX3J2IF9fZHJiZF9zZXRfc3RhdGUoc3RydWN0IGRyYmRfY29uZiAqLCB1bmlvbiBkcmJkX3N0YXRlLAorZXh0ZXJuIGVudW0gZHJiZF9zdGF0ZV9ydiBfX2RyYmRfc2V0X3N0YXRlKHN0cnVjdCBkcmJkX2RldmljZSAqLCB1bmlvbiBkcmJkX3N0YXRlLAogCQkJCQkgICBlbnVtIGNoZ19zdGF0ZV9mbGFncywKIAkJCQkJICAgc3RydWN0IGNvbXBsZXRpb24gKmRvbmUpOwotZXh0ZXJuIHZvaWQgcHJpbnRfc3RfZXJyKHN0cnVjdCBkcmJkX2NvbmYgKiwgdW5pb24gZHJiZF9zdGF0ZSwKK2V4dGVybiB2b2lkIHByaW50X3N0X2VycihzdHJ1Y3QgZHJiZF9kZXZpY2UgKiwgdW5pb24gZHJiZF9zdGF0ZSwKIAkJCXVuaW9uIGRyYmRfc3RhdGUsIGludCk7CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotX2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCitfY29ubl9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHVuaW9uIGRyYmRfc3RhdGUgbWFzaywgdW5pb24gZHJiZF9zdGF0ZSB2YWwsCiAJCSAgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncyk7CiAKIGVudW0gZHJiZF9zdGF0ZV9ydgotY29ubl9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5pb24gZHJiZF9zdGF0ZSBtYXNrLCB1bmlvbiBkcmJkX3N0YXRlIHZhbCwKK2Nvbm5fcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssIHVuaW9uIGRyYmRfc3RhdGUgdmFsLAogCQkgICBlbnVtIGNoZ19zdGF0ZV9mbGFncyBmbGFncyk7CiAKLWV4dGVybiB2b2lkIGRyYmRfcmVzdW1lX2FsKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpOwotZXh0ZXJuIGJvb2wgY29ubl9hbGxfdm9sc191bmNvbmYoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKK2V4dGVybiB2b2lkIGRyYmRfcmVzdW1lX2FsKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKTsKK2V4dGVybiBib29sIGNvbm5fYWxsX3ZvbHNfdW5jb25mKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwogCiAvKioKICAqIGRyYmRfcmVxdWVzdF9zdGF0ZSgpIC0gUmVxZXN0IGEgc3RhdGUgY2hhbmdlCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEBtYXNrOgltYXNrIG9mIHN0YXRlIGJpdHMgdG8gY2hhbmdlLgogICogQHZhbDoJdmFsdWUgb2YgbmV3IHN0YXRlIGJpdHMuCiAgKgpAQCAtMTQ0LDE4ICsxNDQsMTggQEAKICAqIHF1aXRlIHZlcmJvc2UgaW4gY2FzZSB0aGUgc3RhdGUgY2hhbmdlIGlzIG5vdCBwb3NzaWJsZSwgYW5kIGFsbCB0aG9zZQogICogc3RhdGUgY2hhbmdlcyBhcmUgZ2xvYmFsbHkgc2VyaWFsaXplZC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZHJiZF9yZXF1ZXN0X3N0YXRlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW5saW5lIGludCBkcmJkX3JlcXVlc3Rfc3RhdGUoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgICB1bmlvbiBkcmJkX3N0YXRlIG1hc2ssCiAJCQkJICAgICB1bmlvbiBkcmJkX3N0YXRlIHZhbCkKIHsKLQlyZXR1cm4gX2RyYmRfcmVxdWVzdF9zdGF0ZShtZGV2LCBtYXNrLCB2YWwsIENTX1ZFUkJPU0UgKyBDU19PUkRFUkVEKTsKKwlyZXR1cm4gX2RyYmRfcmVxdWVzdF9zdGF0ZShkZXZpY2UsIG1hc2ssIHZhbCwgQ1NfVkVSQk9TRSArIENTX09SREVSRUQpOwogfQogCi1lbnVtIGRyYmRfcm9sZSBjb25uX2hpZ2hlc3Rfcm9sZShzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3BlZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKLWVudW0gZHJiZF9kaXNrX3N0YXRlIGNvbm5faGlnaGVzdF9kaXNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1lbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2xvd2VzdF9kaXNrKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubik7Ci1lbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfcGRzayhzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4pOwotZW51bSBkcmJkX2Nvbm5zIGNvbm5fbG93ZXN0X2Nvbm4oc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKTsKK2VudW0gZHJiZF9yb2xlIGNvbm5faGlnaGVzdF9yb2xlKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZW51bSBkcmJkX3JvbGUgY29ubl9oaWdoZXN0X3BlZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfZGlzayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2VudW0gZHJiZF9kaXNrX3N0YXRlIGNvbm5fbG93ZXN0X2Rpc2soc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitlbnVtIGRyYmRfZGlza19zdGF0ZSBjb25uX2hpZ2hlc3RfcGRzayhzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2VudW0gZHJiZF9jb25ucyBjb25uX2xvd2VzdF9jb25uKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuYwppbmRleCA1OGUwOGZmLi44MGIwZjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9zdHJpbmdzLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RyaW5ncy5jCkBAIC0yNCw2ICsyNCw3IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvZHJiZC5oPgorI2luY2x1ZGUgImRyYmRfc3RyaW5ncy5oIgogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJiZF9jb25uX3NfbmFtZXNbXSA9IHsKIAlbQ19TVEFOREFMT05FXSAgICAgICA9ICJTdGFuZEFsb25lIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuaCBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3N0cmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTkyM2NjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfc3RyaW5ncy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0RSQkRfU1RSSU5HU19ICisjZGVmaW5lIF9fRFJCRF9TVFJJTkdTX0gKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRyYmRfY29ubl9zdHIoZW51bSBkcmJkX2Nvbm5zKTsKK2V4dGVybiBjb25zdCBjaGFyICpkcmJkX3JvbGVfc3RyKGVudW0gZHJiZF9yb2xlKTsKK2V4dGVybiBjb25zdCBjaGFyICpkcmJkX2Rpc2tfc3RyKGVudW0gZHJiZF9kaXNrX3N0YXRlKTsKK2V4dGVybiBjb25zdCBjaGFyICpkcmJkX3NldF9zdF9lcnJfc3RyKGVudW0gZHJiZF9zdGF0ZV9ydik7CisKKyNlbmRpZiAgLyogX19EUkJEX1NUUklOR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd29ya2VyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93b3JrZXIuYwppbmRleCA4NGQzMTc1Li4yYzRjZTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93b3JrZXIuYworKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93b3JrZXIuYwpAQCAtMjEsNyArMjEsNyBAQAogICAgYWxvbmcgd2l0aCBkcmJkOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogCi0gKi8KKyovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kcmJkLmg+CkBAIC0zNiwxMCArMzYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSAiZHJiZF9pbnQuaCIKKyNpbmNsdWRlICJkcmJkX3Byb3RvY29sLmgiCiAjaW5jbHVkZSAiZHJiZF9yZXEuaCIKIAotc3RhdGljIGludCB3X21ha2Vfb3ZfcmVxdWVzdChzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKTsKLQorc3RhdGljIGludCBtYWtlX292X3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICosIGludCk7CitzdGF0aWMgaW50IG1ha2VfcmVzeW5jX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICosIGludCk7CiAKIC8qIGVuZGlvIGhhbmRsZXJzOgogICogICBkcmJkX21kX2lvX2NvbXBsZXRlIChkZWZpbmVkIGhlcmUpCkBAIC02NywxMCArNjgsMTAgQEAKIHZvaWQgZHJiZF9tZF9pb19jb21wbGV0ZShzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgZHJiZF9tZF9pbyAqbWRfaW87Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZTsKIAogCW1kX2lvID0gKHN0cnVjdCBkcmJkX21kX2lvICopYmlvLT5iaV9wcml2YXRlOwotCW1kZXYgPSBjb250YWluZXJfb2YobWRfaW8sIHN0cnVjdCBkcmJkX2NvbmYsIG1kX2lvKTsKKwlkZXZpY2UgPSBjb250YWluZXJfb2YobWRfaW8sIHN0cnVjdCBkcmJkX2RldmljZSwgbWRfaW8pOwogCiAJbWRfaW8tPmVycm9yID0gZXJyb3I7CiAKQEAgLTgzLDM1ICs4NCwzNiBAQAogCSAqIE1ha2Ugc3VyZSB3ZSBmaXJzdCBkcm9wIHRoZSByZWZlcmVuY2UsIGFuZCBvbmx5IHRoZW4gc2lnbmFsCiAJICogY29tcGxldGlvbiwgb3Igd2UgbWF5IChpbiBkcmJkX2FsX3JlYWRfbG9nKCkpIGN5Y2xlIHNvIGZhc3QgaW50byB0aGUKIAkgKiBuZXh0IGRyYmRfbWRfc3luY19wYWdlX2lvKCksIHRoYXQgd2UgdHJpZ2dlciB0aGUKLQkgKiBBU1NFUlQoYXRvbWljX3JlYWQoJm1kZXYtPm1kX2lvX2luX3VzZSkgPT0gMSkgdGhlcmUuCisJICogQVNTRVJUKGF0b21pY19yZWFkKCZkZXZpY2UtPm1kX2lvX2luX3VzZSkgPT0gMSkgdGhlcmUuCiAJICovCi0JZHJiZF9tZF9wdXRfYnVmZmVyKG1kZXYpOworCWRyYmRfbWRfcHV0X2J1ZmZlcihkZXZpY2UpOwogCW1kX2lvLT5kb25lID0gMTsKLQl3YWtlX3VwKCZtZGV2LT5taXNjX3dhaXQpOworCXdha2VfdXAoJmRldmljZS0+bWlzY193YWl0KTsKIAliaW9fcHV0KGJpbyk7Ci0JaWYgKG1kZXYtPmxkZXYpIC8qIHNwZWNpYWwgY2FzZTogZHJiZF9tZF9yZWFkKCkgZHVyaW5nIGRyYmRfYWRtX2F0dGFjaCgpICovCi0JCXB1dF9sZGV2KG1kZXYpOworCWlmIChkZXZpY2UtPmxkZXYpIC8qIHNwZWNpYWwgY2FzZTogZHJiZF9tZF9yZWFkKCkgZHVyaW5nIGRyYmRfYWRtX2F0dGFjaCgpICovCisJCXB1dF9sZGV2KGRldmljZSk7CiB9CiAKIC8qIHJlYWRzIG9uIGJlaGFsZiBvZiB0aGUgcGFydG5lciwKICAqICJzdWJtaXR0ZWQiIGJ5IHRoZSByZWNlaXZlcgogICovCi12b2lkIGRyYmRfZW5kaW9fcmVhZF9zZWNfZmluYWwoc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSkgX19yZWxlYXNlcyhsb2NhbCkKK3N0YXRpYyB2b2lkIGRyYmRfZW5kaW9fcmVhZF9zZWNfZmluYWwoc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSkgX19yZWxlYXNlcyhsb2NhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcGVlcl9yZXEtPncubWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOwotCW1kZXYtPnJlYWRfY250ICs9IHBlZXJfcmVxLT5pLnNpemUgPj4gOTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwlkZXZpY2UtPnJlYWRfY250ICs9IHBlZXJfcmVxLT5pLnNpemUgPj4gOTsKIAlsaXN0X2RlbCgmcGVlcl9yZXEtPncubGlzdCk7Ci0JaWYgKGxpc3RfZW1wdHkoJm1kZXYtPnJlYWRfZWUpKQotCQl3YWtlX3VwKCZtZGV2LT5lZV93YWl0KTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2aWNlLT5yZWFkX2VlKSkKKwkJd2FrZV91cCgmZGV2aWNlLT5lZV93YWl0KTsKIAlpZiAodGVzdF9iaXQoX19FRV9XQVNfRVJST1IsICZwZWVyX3JlcS0+ZmxhZ3MpKQotCQlfX2RyYmRfY2hrX2lvX2Vycm9yKG1kZXYsIERSQkRfUkVBRF9FUlJPUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrLCBmbGFncyk7CisJCV9fZHJiZF9jaGtfaW9fZXJyb3IoZGV2aWNlLCBEUkJEX1JFQURfRVJST1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAKLQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgJnBlZXJfcmVxLT53KTsKLQlwdXRfbGRldihtZGV2KTsKKwlkcmJkX3F1ZXVlX3dvcmsoJnBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywgJnBlZXJfcmVxLT53KTsKKwlwdXRfbGRldihkZXZpY2UpOwogfQogCiAvKiB3cml0ZXMgb24gYmVoYWxmIG9mIHRoZSBwYXJ0bmVyLCBvciByZXN5bmMgd3JpdGVzLApAQCAtMTE5LDcgKzEyMSw4IEBACiBzdGF0aWMgdm9pZCBkcmJkX2VuZGlvX3dyaXRlX3NlY19maW5hbChzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKSBfX3JlbGVhc2VzKGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSBwZWVyX3JlcS0+dy5tZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSA9IHBlZXJfcmVxLT5wZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJc3RydWN0IGRyYmRfaW50ZXJ2YWwgaTsKIAlpbnQgZG9fd2FrZTsKIAl1NjQgYmxvY2tfaWQ7CkBAIC0xMzMsMzUgKzEzNiwzNSBAQAogCWRvX2FsX2NvbXBsZXRlX2lvID0gcGVlcl9yZXEtPmZsYWdzICYgRUVfQ0FMTF9BTF9DT01QTEVURV9JTzsKIAlibG9ja19pZCA9IHBlZXJfcmVxLT5ibG9ja19pZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQltZGV2LT53cml0X2NudCArPSBwZWVyX3JlcS0+aS5zaXplID4+IDk7Ci0JbGlzdF9tb3ZlX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZtZGV2LT5kb25lX2VlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2ssIGZsYWdzKTsKKwlkZXZpY2UtPndyaXRfY250ICs9IHBlZXJfcmVxLT5pLnNpemUgPj4gOTsKKwlsaXN0X21vdmVfdGFpbCgmcGVlcl9yZXEtPncubGlzdCwgJmRldmljZS0+ZG9uZV9lZSk7CiAKIAkvKgogCSAqIERvIG5vdCByZW1vdmUgZnJvbSB0aGUgd3JpdGVfcmVxdWVzdHMgdHJlZSBoZXJlOiB3ZSBkaWQgbm90IHNlbmQgdGhlCiAJICogQWNrIHlldCBhbmQgZGlkIG5vdCB3YWtlIHBvc3NpYmx5IHdhaXRpbmcgY29uZmxpY3RpbmcgcmVxdWVzdHMuCiAJICogUmVtb3ZlZCBmcm9tIHRoZSB0cmVlIGZyb20gImRyYmRfcHJvY2Vzc19kb25lX2VlIiB3aXRoaW4gdGhlCi0JICogYXBwcm9wcmlhdGUgdy5jYiAoZV9lbmRfYmxvY2svZV9lbmRfcmVzeW5jX2Jsb2NrKSBvciBmcm9tCisJICogYXBwcm9wcmlhdGUgZHcuY2IgKGVfZW5kX2Jsb2NrL2VfZW5kX3Jlc3luY19ibG9jaykgb3IgZnJvbQogCSAqIF9kcmJkX2NsZWFyX2RvbmVfZWUuCiAJICovCiAKLQlkb193YWtlID0gbGlzdF9lbXB0eShibG9ja19pZCA9PSBJRF9TWU5DRVIgPyAmbWRldi0+c3luY19lZSA6ICZtZGV2LT5hY3RpdmVfZWUpOworCWRvX3dha2UgPSBsaXN0X2VtcHR5KGJsb2NrX2lkID09IElEX1NZTkNFUiA/ICZkZXZpY2UtPnN5bmNfZWUgOiAmZGV2aWNlLT5hY3RpdmVfZWUpOwogCiAJaWYgKHRlc3RfYml0KF9fRUVfV0FTX0VSUk9SLCAmcGVlcl9yZXEtPmZsYWdzKSkKLQkJX19kcmJkX2Noa19pb19lcnJvcihtZGV2LCBEUkJEX1dSSVRFX0VSUk9SKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKKwkJX19kcmJkX2Noa19pb19lcnJvcihkZXZpY2UsIERSQkRfV1JJVEVfRVJST1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoYmxvY2tfaWQgPT0gSURfU1lOQ0VSKQotCQlkcmJkX3JzX2NvbXBsZXRlX2lvKG1kZXYsIGkuc2VjdG9yKTsKKwkJZHJiZF9yc19jb21wbGV0ZV9pbyhkZXZpY2UsIGkuc2VjdG9yKTsKIAogCWlmIChkb193YWtlKQotCQl3YWtlX3VwKCZtZGV2LT5lZV93YWl0KTsKKwkJd2FrZV91cCgmZGV2aWNlLT5lZV93YWl0KTsKIAogCWlmIChkb19hbF9jb21wbGV0ZV9pbykKLQkJZHJiZF9hbF9jb21wbGV0ZV9pbyhtZGV2LCAmaSk7CisJCWRyYmRfYWxfY29tcGxldGVfaW8oZGV2aWNlLCAmaSk7CiAKLQl3YWtlX2FzZW5kZXIobWRldi0+dGNvbm4pOwotCXB1dF9sZGV2KG1kZXYpOworCXdha2VfYXNlbmRlcihwZWVyX2RldmljZS0+Y29ubmVjdGlvbik7CisJcHV0X2xkZXYoZGV2aWNlKTsKIH0KIAogLyogd3JpdGVzIG9uIGJlaGFsZiBvZiB0aGUgcGFydG5lciwgb3IgcmVzeW5jIHdyaXRlcywKQEAgLTE3MCwxNyArMTczLDE3IEBACiB2b2lkIGRyYmRfcGVlcl9yZXF1ZXN0X2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHBlZXJfcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2UtPmRldmljZTsKIAlpbnQgdXB0b2RhdGUgPSBiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSk7CiAJaW50IGlzX3dyaXRlID0gYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEU7CiAKIAlpZiAoZXJyb3IgJiYgX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJZGV2X3dhcm4oREVWLCAiJXM6IGVycm9yPSVkIHM9JWxsdXNcbiIsCisJCWRyYmRfd2FybihkZXZpY2UsICIlczogZXJyb3I9JWQgcz0lbGx1c1xuIiwKIAkJCQlpc193cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsIGVycm9yLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGVlcl9yZXEtPmkuc2VjdG9yKTsKIAlpZiAoIWVycm9yICYmICF1cHRvZGF0ZSkgewogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl93YXJuKERFViwgIiVzOiBzZXR0aW5nIGVycm9yIHRvIC1FSU8gcz0lbGx1c1xuIiwKKwkJCWRyYmRfd2FybihkZXZpY2UsICIlczogc2V0dGluZyBlcnJvciB0byAtRUlPIHM9JWxsdXNcbiIsCiAJCQkJCWlzX3dyaXRlID8gIndyaXRlIiA6ICJyZWFkIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwZWVyX3JlcS0+aS5zZWN0b3IpOwogCQkvKiBzdHJhbmdlIGJlaGF2aW9yIG9mIHNvbWUgbG93ZXIgbGV2ZWwgZHJpdmVycy4uLgpAQCAtMjA3LDEzICsyMTAsMTMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSA9IGJpby0+YmlfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gcmVxLT53Lm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKIAlzdHJ1Y3QgYmlvX2FuZF9lcnJvciBtOwogCWVudW0gZHJiZF9yZXFfZXZlbnQgd2hhdDsKIAlpbnQgdXB0b2RhdGUgPSBiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSk7CiAKIAlpZiAoIWVycm9yICYmICF1cHRvZGF0ZSkgewotCQlkZXZfd2FybihERVYsICJwICVzOiBzZXR0aW5nIGVycm9yIHRvIC1FSU9cbiIsCisJCWRyYmRfd2FybihkZXZpY2UsICJwICVzOiBzZXR0aW5nIGVycm9yIHRvIC1FSU9cbiIsCiAJCQkgYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUgPyAid3JpdGUiIDogInJlYWQiKTsKIAkJLyogc3RyYW5nZSBiZWhhdmlvciBvZiBzb21lIGxvd2VyIGxldmVsIGRyaXZlcnMuLi4KIAkJICogZmFpbCB0aGUgcmVxdWVzdCBieSBjbGVhcmluZyB0aGUgdXB0b2RhdGUgZmxhZywKQEAgLTI1Miw3ICsyNTUsNyBAQAogCSAqLwogCWlmICh1bmxpa2VseShyZXEtPnJxX3N0YXRlICYgUlFfTE9DQUxfQUJPUlRFRCkpIHsKIAkJaWYgKF9fcmF0ZWxpbWl0KCZkcmJkX3JhdGVsaW1pdF9zdGF0ZSkpCi0JCQlkZXZfZW1lcmcoREVWLCAiZGVsYXllZCBjb21wbGV0aW9uIG9mIGFib3J0ZWQgbG9jYWwgcmVxdWVzdDsgZGlzay10aW1lb3V0IG1heSBiZSB0b28gYWdncmVzc2l2ZVxuIik7CisJCQlkcmJkX2VtZXJnKGRldmljZSwgImRlbGF5ZWQgY29tcGxldGlvbiBvZiBhYm9ydGVkIGxvY2FsIHJlcXVlc3Q7IGRpc2stdGltZW91dCBtYXkgYmUgdG9vIGFnZ3Jlc3NpdmVcbiIpOwogCiAJCWlmICghZXJyb3IpCiAJCQlwYW5pYygicG9zc2libGUgcmFuZG9tIG1lbW9yeSBjb3JydXB0aW9uIGNhdXNlZCBieSBkZWxheWVkIGNvbXBsZXRpb24gb2YgYWJvcnRlZCBsb2NhbCByZXF1ZXN0XG4iKTsKQEAgLTI3MiwxNyArMjc1LDE2IEBACiAJcmVxLT5wcml2YXRlX2JpbyA9IEVSUl9QVFIoZXJyb3IpOwogCiAJLyogbm90IHJlcV9tb2QoKSwgd2UgbmVlZCBpcnFzYXZlIGhlcmUhICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnRjb25uLT5yZXFfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOwogCV9fcmVxX21vZChyZXEsIHdoYXQsICZtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT50Y29ubi0+cmVxX2xvY2ssIGZsYWdzKTsKLQlwdXRfbGRldihtZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jaywgZmxhZ3MpOworCXB1dF9sZGV2KGRldmljZSk7CiAKIAlpZiAobS5iaW8pCi0JCWNvbXBsZXRlX21hc3Rlcl9iaW8obWRldiwgJm0pOworCQljb21wbGV0ZV9tYXN0ZXJfYmlvKGRldmljZSwgJm0pOwogfQogCi12b2lkIGRyYmRfY3N1bV9lZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwKLQkJICBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxLCB2b2lkICpkaWdlc3QpCit2b2lkIGRyYmRfY3N1bV9lZShzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSwgdm9pZCAqZGlnZXN0KQogewogCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CkBAIC0zMDksNyArMzExLDcgQEAKIAljcnlwdG9faGFzaF9maW5hbCgmZGVzYywgZGlnZXN0KTsKIH0KIAotdm9pZCBkcmJkX2NzdW1fYmlvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtLCBzdHJ1Y3QgYmlvICpiaW8sIHZvaWQgKmRpZ2VzdCkKK3ZvaWQgZHJiZF9jc3VtX2JpbyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwgc3RydWN0IGJpbyAqYmlvLCB2b2lkICpkaWdlc3QpCiB7CiAJc3RydWN0IGhhc2hfZGVzYyBkZXNjOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTMzMyw3ICszMzUsOCBAQAogc3RhdGljIGludCB3X2Vfc2VuZF9jc3VtKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSA9IHBlZXJfcmVxLT5wZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IGRpZ2VzdF9zaXplOwogCXZvaWQgKmRpZ2VzdDsKIAlpbnQgZXJyID0gMDsKQEAgLTM0NCw4OSArMzQ3LDkyIEBACiAJaWYgKHVubGlrZWx5KChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9XQVNfRVJST1IpICE9IDApKQogCQlnb3RvIG91dDsKIAotCWRpZ2VzdF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+Y3N1bXNfdGZtKTsKKwlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmNzdW1zX3RmbSk7CiAJZGlnZXN0ID0ga21hbGxvYyhkaWdlc3Rfc2l6ZSwgR0ZQX05PSU8pOwogCWlmIChkaWdlc3QpIHsKIAkJc2VjdG9yX3Qgc2VjdG9yID0gcGVlcl9yZXEtPmkuc2VjdG9yOwogCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHBlZXJfcmVxLT5pLnNpemU7Ci0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+Y3N1bXNfdGZtLCBwZWVyX3JlcSwgZGlnZXN0KTsKKwkJZHJiZF9jc3VtX2VlKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0sIHBlZXJfcmVxLCBkaWdlc3QpOwogCQkvKiBGcmVlIHBlZXJfcmVxIGFuZCBwYWdlcyBiZWZvcmUgc2VuZC4KIAkJICogSW4gY2FzZSB3ZSBibG9jayBvbiBjb25nZXN0aW9uLCB3ZSBjb3VsZCBvdGhlcndpc2UgcnVuIGludG8KIAkJICogc29tZSBkaXN0cmlidXRlZCBkZWFkbG9jaywgaWYgdGhlIG90aGVyIHNpZGUgYmxvY2tzIG9uCiAJCSAqIGNvbmdlc3Rpb24gYXMgd2VsbCwgYmVjYXVzZSBvdXIgcmVjZWl2ZXIgYmxvY2tzIGluCiAJCSAqIGRyYmRfYWxsb2NfcGFnZXMgZHVlIHRvIHBwX2luX3VzZSA+IG1heF9idWZmZXJzLiAqLwotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiAJCXBlZXJfcmVxID0gTlVMTDsKLQkJaW5jX3JzX3BlbmRpbmcobWRldik7Ci0JCWVyciA9IGRyYmRfc2VuZF9kcmVxdWVzdF9jc3VtKG1kZXYsIHNlY3Rvciwgc2l6ZSwKKwkJaW5jX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwkJZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0X2NzdW0ocGVlcl9kZXZpY2UsIHNlY3Rvciwgc2l6ZSwKIAkJCQkJICAgICAgZGlnZXN0LCBkaWdlc3Rfc2l6ZSwKIAkJCQkJICAgICAgUF9DU1VNX1JTX1JFUVVFU1QpOwogCQlrZnJlZShkaWdlc3QpOwogCX0gZWxzZSB7Ci0JCWRldl9lcnIoREVWLCAia21hbGxvYygpIG9mIGRpZ2VzdCBmYWlsZWQuXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAia21hbGxvYygpIG9mIGRpZ2VzdCBmYWlsZWQuXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAl9CiAKIG91dDoKIAlpZiAocGVlcl9yZXEpCi0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCWlmICh1bmxpa2VseShlcnIpKQotCQlkZXZfZXJyKERFViwgImRyYmRfc2VuZF9kcmVxdWVzdCguLi4sIGNzdW0pIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2VuZF9kcmVxdWVzdCguLi4sIGNzdW0pIGZhaWxlZFxuIik7CiAJcmV0dXJuIGVycjsKIH0KIAogI2RlZmluZSBHRlBfVFJZCShfX0dGUF9ISUdITUVNIHwgX19HRlBfTk9XQVJOKQogCi1zdGF0aWMgaW50IHJlYWRfZm9yX2NzdW0oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgcmVhZF9mb3JfY3N1bShzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpCiB7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXE7CiAKLQlpZiAoIWdldF9sZGV2KG1kZXYpKQorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKG1kZXYsIHNlY3RvcikpCisJaWYgKGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bihkZXZpY2UsIHNlY3RvcikpCiAJCWdvdG8gZGVmZXI7CiAKIAkvKiBHRlBfVFJZLCBiZWNhdXNlIGlmIHRoZXJlIGlzIG5vIG1lbW9yeSBhdmFpbGFibGUgcmlnaHQgbm93LCB0aGlzIG1heQogCSAqIGJlIHJlc2NoZWR1bGVkIGZvciBsYXRlci4gSXQgaXMgIm9ubHkiIGJhY2tncm91bmQgcmVzeW5jLCBhZnRlciBhbGwuICovCi0JcGVlcl9yZXEgPSBkcmJkX2FsbG9jX3BlZXJfcmVxKG1kZXYsIElEX1NZTkNFUiAvKiB1bnVzZWQgKi8sIHNlY3RvciwKKwlwZWVyX3JlcSA9IGRyYmRfYWxsb2NfcGVlcl9yZXEocGVlcl9kZXZpY2UsIElEX1NZTkNFUiAvKiB1bnVzZWQgKi8sIHNlY3RvciwKIAkJCQkgICAgICAgc2l6ZSwgR0ZQX1RSWSk7CiAJaWYgKCFwZWVyX3JlcSkKIAkJZ290byBkZWZlcjsKIAogCXBlZXJfcmVxLT53LmNiID0gd19lX3NlbmRfY3N1bTsKLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOwotCWxpc3RfYWRkKCZwZWVyX3JlcS0+dy5saXN0LCAmbWRldi0+cmVhZF9lZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKKwlsaXN0X2FkZCgmcGVlcl9yZXEtPncubGlzdCwgJmRldmljZS0+cmVhZF9lZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CiAKLQlhdG9taWNfYWRkKHNpemUgPj4gOSwgJm1kZXYtPnJzX3NlY3RfZXYpOwotCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QobWRldiwgcGVlcl9yZXEsIFJFQUQsIERSQkRfRkFVTFRfUlNfUkQpID09IDApCisJYXRvbWljX2FkZChzaXplID4+IDksICZkZXZpY2UtPnJzX3NlY3RfZXYpOworCWlmIChkcmJkX3N1Ym1pdF9wZWVyX3JlcXVlc3QoZGV2aWNlLCBwZWVyX3JlcSwgUkVBRCwgRFJCRF9GQVVMVF9SU19SRCkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBJZiBpdCBmYWlsZWQgYmVjYXVzZSBvZiBFTk9NRU0sIHJldHJ5IHNob3VsZCBoZWxwLiAgSWYgaXQgZmFpbGVkCiAJICogYmVjYXVzZSBiaW9fYWRkX3BhZ2UgZmFpbGVkIChwcm9iYWJseSBicm9rZW4gbG93ZXIgbGV2ZWwgZHJpdmVyKSwKIAkgKiByZXRyeSBtYXkgb3IgbWF5IG5vdCBoZWxwLgogCSAqIElmIGl0IGRvZXMgbm90LCB5b3UgbWF5IG5lZWQgdG8gZm9yY2UgZGlzY29ubmVjdC4gKi8KLQlzcGluX2xvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldmljZS0+cmVzb3VyY2UtPnJlcV9sb2NrKTsKIAlsaXN0X2RlbCgmcGVlcl9yZXEtPncubGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT50Y29ubi0+cmVxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCi0JZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiBkZWZlcjoKLQlwdXRfbGRldihtZGV2KTsKKwlwdXRfbGRldihkZXZpY2UpOwogCXJldHVybiAtRUFHQUlOOwogfQogCiBpbnQgd19yZXN5bmNfdGltZXIoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKLQlzd2l0Y2ggKG1kZXYtPnN0YXRlLmNvbm4pIHsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIHJlc3luY193b3JrKTsKKworCXN3aXRjaCAoZGV2aWNlLT5zdGF0ZS5jb25uKSB7CiAJY2FzZSBDX1ZFUklGWV9TOgotCQl3X21ha2Vfb3ZfcmVxdWVzdCh3LCBjYW5jZWwpOworCQltYWtlX292X3JlcXVlc3QoZGV2aWNlLCBjYW5jZWwpOwogCQlicmVhazsKIAljYXNlIENfU1lOQ19UQVJHRVQ6Ci0JCXdfbWFrZV9yZXN5bmNfcmVxdWVzdCh3LCBjYW5jZWwpOworCQltYWtlX3Jlc3luY19yZXF1ZXN0KGRldmljZSwgY2FuY2VsKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00MzUsMTAgKzQ0MSwxMSBAQAogCiB2b2lkIHJlc3luY190aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IChzdHJ1Y3QgZHJiZF9jb25mICopIGRhdGE7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSAoc3RydWN0IGRyYmRfZGV2aWNlICopIGRhdGE7CiAKLQlpZiAobGlzdF9lbXB0eSgmbWRldi0+cmVzeW5jX3dvcmsubGlzdCkpCi0JCWRyYmRfcXVldWVfd29yaygmbWRldi0+dGNvbm4tPnNlbmRlcl93b3JrLCAmbWRldi0+cmVzeW5jX3dvcmspOworCWlmIChsaXN0X2VtcHR5KCZkZXZpY2UtPnJlc3luY193b3JrLmxpc3QpKQorCQlkcmJkX3F1ZXVlX3dvcmsoJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLAorCQkJCSZkZXZpY2UtPnJlc3luY193b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgZmlmb19zZXQoc3RydWN0IGZpZm9fYnVmZmVyICpmYiwgaW50IHZhbHVlKQpAQCAtNDg1LDcgKzQ5Miw3IEBACiAJcmV0dXJuIGZiOwogfQogCi1zdGF0aWMgaW50IGRyYmRfcnNfY29udHJvbGxlcihzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBkcmJkX3JzX2NvbnRyb2xsZXIoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGRpc2tfY29uZiAqZGM7CiAJdW5zaWduZWQgaW50IHNlY3RfaW47ICAvKiBOdW1iZXIgb2Ygc2VjdG9ycyB0aGF0IGNhbWUgaW4gc2luY2UgdGhlIGxhc3QgdHVybiAqLwpAQCAtNDk4LDIyICs1MDUsMjIgQEAKIAlpbnQgbWF4X3NlY3Q7CiAJc3RydWN0IGZpZm9fYnVmZmVyICpwbGFuOwogCi0Jc2VjdF9pbiA9IGF0b21pY194Y2hnKCZtZGV2LT5yc19zZWN0X2luLCAwKTsgLyogTnVtYmVyIG9mIHNlY3RvcnMgdGhhdCBjYW1lIGluICovCi0JbWRldi0+cnNfaW5fZmxpZ2h0IC09IHNlY3RfaW47CisJc2VjdF9pbiA9IGF0b21pY194Y2hnKCZkZXZpY2UtPnJzX3NlY3RfaW4sIDApOyAvKiBOdW1iZXIgb2Ygc2VjdG9ycyB0aGF0IGNhbWUgaW4gKi8KKwlkZXZpY2UtPnJzX2luX2ZsaWdodCAtPSBzZWN0X2luOwogCi0JZGMgPSByY3VfZGVyZWZlcmVuY2UobWRldi0+bGRldi0+ZGlza19jb25mKTsKLQlwbGFuID0gcmN1X2RlcmVmZXJlbmNlKG1kZXYtPnJzX3BsYW5fcyk7CisJZGMgPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5sZGV2LT5kaXNrX2NvbmYpOworCXBsYW4gPSByY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5yc19wbGFuX3MpOwogCiAJc3RlcHMgPSBwbGFuLT5zaXplOyAvKiAoZGMtPmNfcGxhbl9haGVhZCAqIDEwICogU0xFRVBfVElNRSkgLyBIWjsgKi8KIAotCWlmIChtZGV2LT5yc19pbl9mbGlnaHQgKyBzZWN0X2luID09IDApIHsgLyogQXQgc3RhcnQgb2YgcmVzeW5jICovCisJaWYgKGRldmljZS0+cnNfaW5fZmxpZ2h0ICsgc2VjdF9pbiA9PSAwKSB7IC8qIEF0IHN0YXJ0IG9mIHJlc3luYyAqLwogCQl3YW50ID0gKChkYy0+cmVzeW5jX3JhdGUgKiAyICogU0xFRVBfVElNRSkgLyBIWikgKiBzdGVwczsKIAl9IGVsc2UgeyAvKiBub3JtYWwgcGF0aCAqLwogCQl3YW50ID0gZGMtPmNfZmlsbF90YXJnZXQgPyBkYy0+Y19maWxsX3RhcmdldCA6CiAJCQlzZWN0X2luICogZGMtPmNfZGVsYXlfdGFyZ2V0ICogSFogLyAoU0xFRVBfVElNRSAqIDEwKTsKIAl9CiAKLQljb3JyZWN0aW9uID0gd2FudCAtIG1kZXYtPnJzX2luX2ZsaWdodCAtIHBsYW4tPnRvdGFsOworCWNvcnJlY3Rpb24gPSB3YW50IC0gZGV2aWNlLT5yc19pbl9mbGlnaHQgLSBwbGFuLT50b3RhbDsKIAogCS8qIFBsYW4gYWhlYWQgKi8KIAljcHMgPSBjb3JyZWN0aW9uIC8gc3RlcHM7CkBAIC01MzMsMjUgKzU0MCwyNSBAQAogCQlyZXFfc2VjdCA9IG1heF9zZWN0OwogCiAJLyoKLQlkZXZfd2FybihERVYsICJzaT0ldSBpZj0lZCB3YT0ldSBjbz0lZCBzdD0lZCBjcHM9JWQgcGw9JWQgY2M9JWQgcnM9JWRcbiIsCi0JCSBzZWN0X2luLCBtZGV2LT5yc19pbl9mbGlnaHQsIHdhbnQsIGNvcnJlY3Rpb24sCi0JCSBzdGVwcywgY3BzLCBtZGV2LT5yc19wbGFuZWQsIGN1cnJfY29yciwgcmVxX3NlY3QpOworCWRyYmRfd2FybihkZXZpY2UsICJzaT0ldSBpZj0lZCB3YT0ldSBjbz0lZCBzdD0lZCBjcHM9JWQgcGw9JWQgY2M9JWQgcnM9JWRcbiIsCisJCSBzZWN0X2luLCBkZXZpY2UtPnJzX2luX2ZsaWdodCwgd2FudCwgY29ycmVjdGlvbiwKKwkJIHN0ZXBzLCBjcHMsIGRldmljZS0+cnNfcGxhbmVkLCBjdXJyX2NvcnIsIHJlcV9zZWN0KTsKIAkqLwogCiAJcmV0dXJuIHJlcV9zZWN0OwogfQogCi1zdGF0aWMgaW50IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBudW1iZXI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKHJjdV9kZXJlZmVyZW5jZShtZGV2LT5yc19wbGFuX3MpLT5zaXplKSB7Ci0JCW51bWJlciA9IGRyYmRfcnNfY29udHJvbGxlcihtZGV2KSA+PiAoQk1fQkxPQ0tfU0hJRlQgLSA5KTsKLQkJbWRldi0+Y19zeW5jX3JhdGUgPSBudW1iZXIgKiBIWiAqIChCTV9CTE9DS19TSVpFIC8gMTAyNCkgLyBTTEVFUF9USU1FOworCWlmIChyY3VfZGVyZWZlcmVuY2UoZGV2aWNlLT5yc19wbGFuX3MpLT5zaXplKSB7CisJCW51bWJlciA9IGRyYmRfcnNfY29udHJvbGxlcihkZXZpY2UpID4+IChCTV9CTE9DS19TSElGVCAtIDkpOworCQlkZXZpY2UtPmNfc3luY19yYXRlID0gbnVtYmVyICogSFogKiAoQk1fQkxPQ0tfU0laRSAvIDEwMjQpIC8gU0xFRVBfVElNRTsKIAl9IGVsc2UgewotCQltZGV2LT5jX3N5bmNfcmF0ZSA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT5sZGV2LT5kaXNrX2NvbmYpLT5yZXN5bmNfcmF0ZTsKLQkJbnVtYmVyID0gU0xFRVBfVElNRSAqIG1kZXYtPmNfc3luY19yYXRlICAvICgoQk1fQkxPQ0tfU0laRSAvIDEwMjQpICogSFopOworCQlkZXZpY2UtPmNfc3luY19yYXRlID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+bGRldi0+ZGlza19jb25mKS0+cmVzeW5jX3JhdGU7CisJCW51bWJlciA9IFNMRUVQX1RJTUUgKiBkZXZpY2UtPmNfc3luY19yYXRlICAvICgoQk1fQkxPQ0tfU0laRSAvIDEwMjQpICogSFopOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIApAQCAtNTYwLDEyICs1NjcsMTEgQEAKIAlyZXR1cm4gbnVtYmVyOwogfQogCi1pbnQgd19tYWtlX3Jlc3luY19yZXF1ZXN0KHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCitzdGF0aWMgaW50IG1ha2VfcmVzeW5jX3JlcXVlc3Qoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CiAJdW5zaWduZWQgbG9uZyBiaXQ7CiAJc2VjdG9yX3Qgc2VjdG9yOwotCWNvbnN0IHNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KTsKKwljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KTsKIAlpbnQgbWF4X2Jpb19zaXplOwogCWludCBudW1iZXIsIHJvbGxiYWNrX2ksIHNpemU7CiAJaW50IGFsaWduLCBxdWV1ZWQsIHNuZGJ1ZjsKQEAgLTU3NCw2MSArNTgwLDYxIEBACiAJaWYgKHVubGlrZWx5KGNhbmNlbCkpCiAJCXJldHVybiAwOwogCi0JaWYgKG1kZXYtPnJzX3RvdGFsID09IDApIHsKKwlpZiAoZGV2aWNlLT5yc190b3RhbCA9PSAwKSB7CiAJCS8qIGVtcHR5IHJlc3luYz8gKi8KLQkJZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICghZ2V0X2xkZXYobWRldikpIHsKLQkJLyogU2luY2Ugd2Ugb25seSBuZWVkIHRvIGFjY2VzcyBtZGV2LT5yc3luYyBhCi0JCSAgIGdldF9sZGV2X2lmX3N0YXRlKG1kZXYsRF9GQUlMRUQpIHdvdWxkIGJlIHN1ZmZpY2llbnQsIGJ1dAorCWlmICghZ2V0X2xkZXYoZGV2aWNlKSkgeworCQkvKiBTaW5jZSB3ZSBvbmx5IG5lZWQgdG8gYWNjZXNzIGRldmljZS0+cnN5bmMgYQorCQkgICBnZXRfbGRldl9pZl9zdGF0ZShkZXZpY2UsRF9GQUlMRUQpIHdvdWxkIGJlIHN1ZmZpY2llbnQsIGJ1dAogCQkgICB0byBjb250aW51ZSByZXN5bmMgd2l0aCBhIGJyb2tlbiBkaXNrIG1ha2VzIG5vIHNlbnNlIGF0CiAJCSAgIGFsbCAqLwotCQlkZXZfZXJyKERFViwgIkRpc2sgYnJva2UgZG93biBkdXJpbmcgcmVzeW5jIVxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIkRpc2sgYnJva2UgZG93biBkdXJpbmcgcmVzeW5jIVxuIik7CiAJCXJldHVybiAwOwogCX0KIAotCW1heF9iaW9fc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPnJxX3F1ZXVlKSA8PCA5OwotCW51bWJlciA9IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKG1kZXYpOworCW1heF9iaW9fc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKGRldmljZS0+cnFfcXVldWUpIDw8IDk7CisJbnVtYmVyID0gZHJiZF9yc19udW1iZXJfcmVxdWVzdHMoZGV2aWNlKTsKIAlpZiAobnVtYmVyID09IDApCiAJCWdvdG8gcmVxdWV1ZTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewogCQkvKiBTdG9wIGdlbmVyYXRpbmcgUlMgcmVxdWVzdHMsIHdoZW4gaGFsZiBvZiB0aGUgc2VuZCBidWZmZXIgaXMgZmlsbGVkICovCi0JCW11dGV4X2xvY2soJm1kZXYtPnRjb25uLT5kYXRhLm11dGV4KTsKLQkJaWYgKG1kZXYtPnRjb25uLT5kYXRhLnNvY2tldCkgewotCQkJcXVldWVkID0gbWRldi0+dGNvbm4tPmRhdGEuc29ja2V0LT5zay0+c2tfd21lbV9xdWV1ZWQ7Ci0JCQlzbmRidWYgPSBtZGV2LT50Y29ubi0+ZGF0YS5zb2NrZXQtPnNrLT5za19zbmRidWY7CisJCW11dGV4X2xvY2soJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOworCQlpZiAoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+ZGF0YS5zb2NrZXQpIHsKKwkJCXF1ZXVlZCA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGEuc29ja2V0LT5zay0+c2tfd21lbV9xdWV1ZWQ7CisJCQlzbmRidWYgPSBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhLnNvY2tldC0+c2stPnNrX3NuZGJ1ZjsKIAkJfSBlbHNlIHsKIAkJCXF1ZXVlZCA9IDE7CiAJCQlzbmRidWYgPSAwOwogCQl9Ci0JCW11dGV4X3VubG9jaygmbWRldi0+dGNvbm4tPmRhdGEubXV0ZXgpOworCQltdXRleF91bmxvY2soJmZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmRhdGEubXV0ZXgpOwogCQlpZiAocXVldWVkID4gc25kYnVmIC8gMikKIAkJCWdvdG8gcmVxdWV1ZTsKIAogbmV4dF9zZWN0b3I6CiAJCXNpemUgPSBCTV9CTE9DS19TSVpFOwotCQliaXQgID0gZHJiZF9ibV9maW5kX25leHQobWRldiwgbWRldi0+Ym1fcmVzeW5jX2ZvKTsKKwkJYml0ICA9IGRyYmRfYm1fZmluZF9uZXh0KGRldmljZSwgZGV2aWNlLT5ibV9yZXN5bmNfZm8pOwogCiAJCWlmIChiaXQgPT0gRFJCRF9FTkRfT0ZfQklUTUFQKSB7Ci0JCQltZGV2LT5ibV9yZXN5bmNfZm8gPSBkcmJkX2JtX2JpdHMobWRldik7Ci0JCQlwdXRfbGRldihtZGV2KTsKKwkJCWRldmljZS0+Ym1fcmVzeW5jX2ZvID0gZHJiZF9ibV9iaXRzKGRldmljZSk7CisJCQlwdXRfbGRldihkZXZpY2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCQlzZWN0b3IgPSBCTV9CSVRfVE9fU0VDVChiaXQpOwogCi0JCWlmIChkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24obWRldiwgc2VjdG9yKSB8fAotCQkgICAgZHJiZF90cnlfcnNfYmVnaW5faW8obWRldiwgc2VjdG9yKSkgewotCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gYml0OworCQlpZiAoZHJiZF9yc19zaG91bGRfc2xvd19kb3duKGRldmljZSwgc2VjdG9yKSB8fAorCQkgICAgZHJiZF90cnlfcnNfYmVnaW5faW8oZGV2aWNlLCBzZWN0b3IpKSB7CisJCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IGJpdDsKIAkJCWdvdG8gcmVxdWV1ZTsKIAkJfQotCQltZGV2LT5ibV9yZXN5bmNfZm8gPSBiaXQgKyAxOworCQlkZXZpY2UtPmJtX3Jlc3luY19mbyA9IGJpdCArIDE7CiAKLQkJaWYgKHVubGlrZWx5KGRyYmRfYm1fdGVzdF9iaXQobWRldiwgYml0KSA9PSAwKSkgewotCQkJZHJiZF9yc19jb21wbGV0ZV9pbyhtZGV2LCBzZWN0b3IpOworCQlpZiAodW5saWtlbHkoZHJiZF9ibV90ZXN0X2JpdChkZXZpY2UsIGJpdCkgPT0gMCkpIHsKKwkJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOwogCQkJZ290byBuZXh0X3NlY3RvcjsKIAkJfQogCkBAIC02NTcsNyArNjYzLDcgQEAKIAkJCSAqIG9ic2N1cmUgcmVhc29uOyAoIGIgPT0gMCApIHdvdWxkIGdldCB0aGUgb3V0LW9mLWJhbmQKIAkJCSAqIG9ubHkgYWNjaWRlbnRhbGx5IHJpZ2h0IGJlY2F1c2Ugb2YgdGhlICJvZGRseSBzaXplZCIKIAkJCSAqIGFkanVzdG1lbnQgYmVsb3cgKi8KLQkJCWlmIChkcmJkX2JtX3Rlc3RfYml0KG1kZXYsIGJpdCsxKSAhPSAxKQorCQkJaWYgKGRyYmRfYm1fdGVzdF9iaXQoZGV2aWNlLCBiaXQrMSkgIT0gMSkKIAkJCQlicmVhazsKIAkJCWJpdCsrOwogCQkJc2l6ZSArPSBCTV9CTE9DS19TSVpFOwpAQCAtNjY4LDIwICs2NzQsMjEgQEAKIAkJLyogaWYgd2UgbWVyZ2VkIHNvbWUsCiAJCSAqIHJlc2V0IHRoZSBvZmZzZXQgdG8gc3RhcnQgdGhlIG5leHQgZHJiZF9ibV9maW5kX25leHQgZnJvbSAqLwogCQlpZiAoc2l6ZSA+IEJNX0JMT0NLX1NJWkUpCi0JCQltZGV2LT5ibV9yZXN5bmNfZm8gPSBiaXQgKyAxOworCQkJZGV2aWNlLT5ibV9yZXN5bmNfZm8gPSBiaXQgKyAxOwogI2VuZGlmCiAKIAkJLyogYWRqdXN0IHZlcnkgbGFzdCBzZWN0b3JzLCBpbiBjYXNlIHdlIGFyZSBvZGRseSBzaXplZCAqLwogCQlpZiAoc2VjdG9yICsgKHNpemU+PjkpID4gY2FwYWNpdHkpCiAJCQlzaXplID0gKGNhcGFjaXR5LXNlY3Rvcik8PDk7Ci0JCWlmIChtZGV2LT50Y29ubi0+YWdyZWVkX3Byb192ZXJzaW9uID49IDg5ICYmIG1kZXYtPnRjb25uLT5jc3Vtc190Zm0pIHsKLQkJCXN3aXRjaCAocmVhZF9mb3JfY3N1bShtZGV2LCBzZWN0b3IsIHNpemUpKSB7CisJCWlmIChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPj0gODkgJiYKKwkJICAgIGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmNzdW1zX3RmbSkgeworCQkJc3dpdGNoIChyZWFkX2Zvcl9jc3VtKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIHNlY3Rvciwgc2l6ZSkpIHsKIAkJCWNhc2UgLUVJTzogLyogRGlzayBmYWlsdXJlICovCi0JCQkJcHV0X2xkZXYobWRldik7CisJCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCWNhc2UgLUVBR0FJTjogLyogYWxsb2NhdGlvbiBmYWlsZWQsIG9yIGxkZXYgYnVzeSAqLwotCQkJCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgc2VjdG9yKTsKLQkJCQltZGV2LT5ibV9yZXN5bmNfZm8gPSBCTV9TRUNUX1RPX0JJVChzZWN0b3IpOworCQkJCWRyYmRfcnNfY29tcGxldGVfaW8oZGV2aWNlLCBzZWN0b3IpOworCQkJCWRldmljZS0+Ym1fcmVzeW5jX2ZvID0gQk1fU0VDVF9UT19CSVQoc2VjdG9yKTsKIAkJCQlpID0gcm9sbGJhY2tfaTsKIAkJCQlnb3RvIHJlcXVldWU7CiAJCQljYXNlIDA6CkBAIC02OTMsNTAgKzcwMCw0OSBAQAogCQl9IGVsc2UgewogCQkJaW50IGVycjsKIAotCQkJaW5jX3JzX3BlbmRpbmcobWRldik7Ci0JCQllcnIgPSBkcmJkX3NlbmRfZHJlcXVlc3QobWRldiwgUF9SU19EQVRBX1JFUVVFU1QsCisJCQlpbmNfcnNfcGVuZGluZyhkZXZpY2UpOworCQkJZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIFBfUlNfREFUQV9SRVFVRVNULAogCQkJCQkJIHNlY3Rvciwgc2l6ZSwgSURfU1lOQ0VSKTsKIAkJCWlmIChlcnIpIHsKLQkJCQlkZXZfZXJyKERFViwgImRyYmRfc2VuZF9kcmVxdWVzdCgpIGZhaWxlZCwgYWJvcnRpbmcuLi5cbiIpOwotCQkJCWRlY19yc19wZW5kaW5nKG1kZXYpOwotCQkJCXB1dF9sZGV2KG1kZXYpOworCQkJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2VuZF9kcmVxdWVzdCgpIGZhaWxlZCwgYWJvcnRpbmcuLi5cbiIpOworCQkJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CisJCQkJcHV0X2xkZXYoZGV2aWNlKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CiAJfQogCi0JaWYgKG1kZXYtPmJtX3Jlc3luY19mbyA+PSBkcmJkX2JtX2JpdHMobWRldikpIHsKKwlpZiAoZGV2aWNlLT5ibV9yZXN5bmNfZm8gPj0gZHJiZF9ibV9iaXRzKGRldmljZSkpIHsKIAkJLyogbGFzdCBzeW5jZXIgX3JlcXVlc3RfIHdhcyBzZW50LAogCQkgKiBidXQgdGhlIFBfUlNfREFUQV9SRVBMWSBub3QgeWV0IHJlY2VpdmVkLiAgc3luYyB3aWxsIGVuZCAoYW5kCiAJCSAqIG5leHQgc3luYyBncm91cCB3aWxsIHJlc3VtZSksIGFzIHNvb24gYXMgd2UgcmVjZWl2ZSB0aGUgbGFzdAogCQkgKiByZXN5bmMgZGF0YSBibG9jaywgYW5kIHRoZSBsYXN0IGJpdCBpcyBjbGVhcmVkLgogCQkgKiB1bnRpbCB0aGVuIHJlc3luYyAid29yayIgaXMgImluYWN0aXZlIiAuLi4KIAkJICovCi0JCXB1dF9sZGV2KG1kZXYpOworCQlwdXRfbGRldihkZXZpY2UpOwogCQlyZXR1cm4gMDsKIAl9CiAKICByZXF1ZXVlOgotCW1kZXYtPnJzX2luX2ZsaWdodCArPSAoaSA8PCAoQk1fQkxPQ0tfU0hJRlQgLSA5KSk7Ci0JbW9kX3RpbWVyKCZtZGV2LT5yZXN5bmNfdGltZXIsIGppZmZpZXMgKyBTTEVFUF9USU1FKTsKLQlwdXRfbGRldihtZGV2KTsKKwlkZXZpY2UtPnJzX2luX2ZsaWdodCArPSAoaSA8PCAoQk1fQkxPQ0tfU0hJRlQgLSA5KSk7CisJbW9kX3RpbWVyKCZkZXZpY2UtPnJlc3luY190aW1lciwgamlmZmllcyArIFNMRUVQX1RJTUUpOworCXB1dF9sZGV2KGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd19tYWtlX292X3JlcXVlc3Qoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKK3N0YXRpYyBpbnQgbWFrZV9vdl9yZXF1ZXN0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLCBpbnQgY2FuY2VsKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwogCWludCBudW1iZXIsIGksIHNpemU7CiAJc2VjdG9yX3Qgc2VjdG9yOwotCWNvbnN0IHNlY3Rvcl90IGNhcGFjaXR5ID0gZHJiZF9nZXRfY2FwYWNpdHkobWRldi0+dGhpc19iZGV2KTsKKwljb25zdCBzZWN0b3JfdCBjYXBhY2l0eSA9IGRyYmRfZ2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2KTsKIAlib29sIHN0b3Bfc2VjdG9yX3JlYWNoZWQgPSBmYWxzZTsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKQogCQlyZXR1cm4gMTsKIAotCW51bWJlciA9IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKG1kZXYpOworCW51bWJlciA9IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKGRldmljZSk7CiAKLQlzZWN0b3IgPSBtZGV2LT5vdl9wb3NpdGlvbjsKKwlzZWN0b3IgPSBkZXZpY2UtPm92X3Bvc2l0aW9uOwogCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewogCQlpZiAoc2VjdG9yID49IGNhcGFjaXR5KQogCQkJcmV0dXJuIDE7CkBAIC03NDUsMTE2ICs3NTEsMTIxIEBACiAJCSAqIHdfZV9lbmRfb3ZfcmVwbHkoKS4KIAkJICogV2UgbmVlZCB0byBzZW5kIGF0IGxlYXN0IG9uZSByZXF1ZXN0IG91dC4gKi8KIAkJc3RvcF9zZWN0b3JfcmVhY2hlZCA9IGkgPiAwCi0JCQkmJiB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKG1kZXYpCi0JCQkmJiBzZWN0b3IgPj0gbWRldi0+b3Zfc3RvcF9zZWN0b3I7CisJCQkmJiB2ZXJpZnlfY2FuX2RvX3N0b3Bfc2VjdG9yKGRldmljZSkKKwkJCSYmIHNlY3RvciA+PSBkZXZpY2UtPm92X3N0b3Bfc2VjdG9yOwogCQlpZiAoc3RvcF9zZWN0b3JfcmVhY2hlZCkKIAkJCWJyZWFrOwogCiAJCXNpemUgPSBCTV9CTE9DS19TSVpFOwogCi0JCWlmIChkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24obWRldiwgc2VjdG9yKSB8fAotCQkgICAgZHJiZF90cnlfcnNfYmVnaW5faW8obWRldiwgc2VjdG9yKSkgewotCQkJbWRldi0+b3ZfcG9zaXRpb24gPSBzZWN0b3I7CisJCWlmIChkcmJkX3JzX3Nob3VsZF9zbG93X2Rvd24oZGV2aWNlLCBzZWN0b3IpIHx8CisJCSAgICBkcmJkX3RyeV9yc19iZWdpbl9pbyhkZXZpY2UsIHNlY3RvcikpIHsKKwkJCWRldmljZS0+b3ZfcG9zaXRpb24gPSBzZWN0b3I7CiAJCQlnb3RvIHJlcXVldWU7CiAJCX0KIAogCQlpZiAoc2VjdG9yICsgKHNpemU+PjkpID4gY2FwYWNpdHkpCiAJCQlzaXplID0gKGNhcGFjaXR5LXNlY3Rvcik8PDk7CiAKLQkJaW5jX3JzX3BlbmRpbmcobWRldik7Ci0JCWlmIChkcmJkX3NlbmRfb3ZfcmVxdWVzdChtZGV2LCBzZWN0b3IsIHNpemUpKSB7Ci0JCQlkZWNfcnNfcGVuZGluZyhtZGV2KTsKKwkJaW5jX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwkJaWYgKGRyYmRfc2VuZF9vdl9yZXF1ZXN0KGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSksIHNlY3Rvciwgc2l6ZSkpIHsKKwkJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlzZWN0b3IgKz0gQk1fU0VDVF9QRVJfQklUOwogCX0KLQltZGV2LT5vdl9wb3NpdGlvbiA9IHNlY3RvcjsKKwlkZXZpY2UtPm92X3Bvc2l0aW9uID0gc2VjdG9yOwogCiAgcmVxdWV1ZToKLQltZGV2LT5yc19pbl9mbGlnaHQgKz0gKGkgPDwgKEJNX0JMT0NLX1NISUZUIC0gOSkpOworCWRldmljZS0+cnNfaW5fZmxpZ2h0ICs9IChpIDw8IChCTV9CTE9DS19TSElGVCAtIDkpKTsKIAlpZiAoaSA9PSAwIHx8ICFzdG9wX3NlY3Rvcl9yZWFjaGVkKQotCQltb2RfdGltZXIoJm1kZXYtPnJlc3luY190aW1lciwgamlmZmllcyArIFNMRUVQX1RJTUUpOworCQltb2RfdGltZXIoJmRldmljZS0+cmVzeW5jX3RpbWVyLCBqaWZmaWVzICsgU0xFRVBfVElNRSk7CiAJcmV0dXJuIDE7CiB9CiAKIGludCB3X292X2ZpbmlzaGVkKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7Ci0Ja2ZyZWUodyk7Ci0Jb3Zfb3V0X29mX3N5bmNfcHJpbnQobWRldik7Ci0JZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJc3RydWN0IGRyYmRfZGV2aWNlX3dvcmsgKmR3ID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX2RldmljZV93b3JrLCB3KTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGR3LT5kZXZpY2U7CisJa2ZyZWUoZHcpOworCW92X291dF9vZl9zeW5jX3ByaW50KGRldmljZSk7CisJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdfcmVzeW5jX2ZpbmlzaGVkKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7Ci0Ja2ZyZWUodyk7CisJc3RydWN0IGRyYmRfZGV2aWNlX3dvcmsgKmR3ID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX2RldmljZV93b3JrLCB3KTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IGR3LT5kZXZpY2U7CisJa2ZyZWUoZHcpOwogCi0JZHJiZF9yZXN5bmNfZmluaXNoZWQobWRldik7CisJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwaW5nX3BlZXIoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3N0YXRpYyB2b2lkIHBpbmdfcGVlcihzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4gPSBtZGV2LT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAotCWNsZWFyX2JpdChHT1RfUElOR19BQ0ssICZ0Y29ubi0+ZmxhZ3MpOwotCXJlcXVlc3RfcGluZyh0Y29ubik7Ci0Jd2FpdF9ldmVudCh0Y29ubi0+cGluZ193YWl0LAotCQkgICB0ZXN0X2JpdChHT1RfUElOR19BQ0ssICZ0Y29ubi0+ZmxhZ3MpIHx8IG1kZXYtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCk7CisJY2xlYXJfYml0KEdPVF9QSU5HX0FDSywgJmNvbm5lY3Rpb24tPmZsYWdzKTsKKwlyZXF1ZXN0X3BpbmcoY29ubmVjdGlvbik7CisJd2FpdF9ldmVudChjb25uZWN0aW9uLT5waW5nX3dhaXQsCisJCSAgIHRlc3RfYml0KEdPVF9QSU5HX0FDSywgJmNvbm5lY3Rpb24tPmZsYWdzKSB8fCBkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0NPTk5FQ1RFRCk7CiB9CiAKLWludCBkcmJkX3Jlc3luY19maW5pc2hlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQoraW50IGRyYmRfcmVzeW5jX2ZpbmlzaGVkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXVuc2lnbmVkIGxvbmcgZGIsIGR0LCBkYmR0OwogCXVuc2lnbmVkIGxvbmcgbl9vb3M7CiAJdW5pb24gZHJiZF9zdGF0ZSBvcywgbnM7Ci0Jc3RydWN0IGRyYmRfd29yayAqdzsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2Vfd29yayAqZHc7CiAJY2hhciAqa2hlbHBlcl9jbWQgPSBOVUxMOwogCWludCB2ZXJpZnlfZG9uZSA9IDA7CiAKIAkvKiBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIHJlc3luYyBMUlUuIFNpbmNlIGZ1dHVyZSBhY3Rpb25zCiAJICogbWlnaHQgc2V0IGJpdHMgaW4gdGhlIChtYWluKSBiaXRtYXAsIHRoZW4gdGhlIGVudHJpZXMgaW4gdGhlCiAJICogcmVzeW5jIExSVSB3b3VsZCBiZSB3cm9uZy4gKi8KLQlpZiAoZHJiZF9yc19kZWxfYWxsKG1kZXYpKSB7CisJaWYgKGRyYmRfcnNfZGVsX2FsbChkZXZpY2UpKSB7CiAJCS8qIEluIGNhc2UgdGhpcyBpcyBub3QgcG9zc2libGUgbm93LCBtb3N0IHByb2JhYmx5IGJlY2F1c2UKIAkJICogdGhlcmUgYXJlIFBfUlNfREFUQV9SRVBMWSBQYWNrZXRzIGxpbmdlcmluZyBvbiB0aGUgd29ya2VyJ3MKIAkJICogcXVldWUgKG9yIGV2ZW4gdGhlIHJlYWQgb3BlcmF0aW9ucyBmb3IgdGhvc2UgcGFja2V0cwogCQkgKiBpcyBub3QgZmluaXNoZWQgYnkgbm93KS4gICBSZXRyeSBpbiAxMDBtcy4gKi8KIAogCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoSFogLyAxMCk7Ci0JCXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHJiZF93b3JrKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICh3KSB7Ci0JCQl3LT5jYiA9IHdfcmVzeW5jX2ZpbmlzaGVkOwotCQkJdy0+bWRldiA9IG1kZXY7Ci0JCQlkcmJkX3F1ZXVlX3dvcmsoJm1kZXYtPnRjb25uLT5zZW5kZXJfd29yaywgdyk7CisJCWR3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRyYmRfZGV2aWNlX3dvcmspLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGR3KSB7CisJCQlkdy0+dy5jYiA9IHdfcmVzeW5jX2ZpbmlzaGVkOworCQkJZHctPmRldmljZSA9IGRldmljZTsKKwkJCWRyYmRfcXVldWVfd29yaygmZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+c2VuZGVyX3dvcmssCisJCQkJCSZkdy0+dyk7CiAJCQlyZXR1cm4gMTsKIAkJfQotCQlkZXZfZXJyKERFViwgIldhcm4gZmFpbGVkIHRvIGRyYmRfcnNfZGVsX2FsbCgpIGFuZCB0byBrbWFsbG9jKHcpLlxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgIldhcm4gZmFpbGVkIHRvIGRyYmRfcnNfZGVsX2FsbCgpIGFuZCB0byBrbWFsbG9jKGR3KS5cbiIpOwogCX0KIAotCWR0ID0gKGppZmZpZXMgLSBtZGV2LT5yc19zdGFydCAtIG1kZXYtPnJzX3BhdXNlZCkgLyBIWjsKKwlkdCA9IChqaWZmaWVzIC0gZGV2aWNlLT5yc19zdGFydCAtIGRldmljZS0+cnNfcGF1c2VkKSAvIEhaOwogCWlmIChkdCA8PSAwKQogCQlkdCA9IDE7Ci0JCi0JZGIgPSBtZGV2LT5yc190b3RhbDsKKworCWRiID0gZGV2aWNlLT5yc190b3RhbDsKIAkvKiBhZGp1c3QgZm9yIHZlcmlmeSBzdGFydCBhbmQgc3RvcCBzZWN0b3JzLCByZXNwZWN0aXZlIHJlYWNoZWQgcG9zaXRpb24gKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA9PSBDX1ZFUklGWV9TIHx8IG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19WRVJJRllfVCkKLQkJZGIgLT0gbWRldi0+b3ZfbGVmdDsKKwlpZiAoZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1MgfHwgZGV2aWNlLT5zdGF0ZS5jb25uID09IENfVkVSSUZZX1QpCisJCWRiIC09IGRldmljZS0+b3ZfbGVmdDsKIAogCWRiZHQgPSBCaXQyS0IoZGIvZHQpOwotCW1kZXYtPnJzX3BhdXNlZCAvPSBIWjsKKwlkZXZpY2UtPnJzX3BhdXNlZCAvPSBIWjsKIAotCWlmICghZ2V0X2xkZXYobWRldikpCisJaWYgKCFnZXRfbGRldihkZXZpY2UpKQogCQlnb3RvIG91dDsKIAotCXBpbmdfcGVlcihtZGV2KTsKKwlwaW5nX3BlZXIoZGV2aWNlKTsKIAotCXNwaW5fbG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0Jb3MgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJc3Bpbl9sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOworCW9zID0gZHJiZF9yZWFkX3N0YXRlKGRldmljZSk7CiAKIAl2ZXJpZnlfZG9uZSA9IChvcy5jb25uID09IENfVkVSSUZZX1MgfHwgb3MuY29ubiA9PSBDX1ZFUklGWV9UKTsKIApAQCAtODY2LDQxICs4NzcsNDEgQEAKIAlucyA9IG9zOwogCW5zLmNvbm4gPSBDX0NPTk5FQ1RFRDsKIAotCWRldl9pbmZvKERFViwgIiVzIGRvbmUgKHRvdGFsICVsdSBzZWM7IHBhdXNlZCAlbHUgc2VjOyAlbHUgSy9zZWMpXG4iLAorCWRyYmRfaW5mbyhkZXZpY2UsICIlcyBkb25lICh0b3RhbCAlbHUgc2VjOyBwYXVzZWQgJWx1IHNlYzsgJWx1IEsvc2VjKVxuIiwKIAkgICAgIHZlcmlmeV9kb25lID8gIk9ubGluZSB2ZXJpZnkiIDogIlJlc3luYyIsCi0JICAgICBkdCArIG1kZXYtPnJzX3BhdXNlZCwgbWRldi0+cnNfcGF1c2VkLCBkYmR0KTsKKwkgICAgIGR0ICsgZGV2aWNlLT5yc19wYXVzZWQsIGRldmljZS0+cnNfcGF1c2VkLCBkYmR0KTsKIAotCW5fb29zID0gZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldik7CisJbl9vb3MgPSBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpOwogCiAJaWYgKG9zLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBvcy5jb25uID09IENfVkVSSUZZX1QpIHsKIAkJaWYgKG5fb29zKSB7Ci0JCQlkZXZfYWxlcnQoREVWLCAiT25saW5lIHZlcmlmeSBmb3VuZCAlbHUgJWRrIGJsb2NrIG91dCBvZiBzeW5jIVxuIiwKKwkJCWRyYmRfYWxlcnQoZGV2aWNlLCAiT25saW5lIHZlcmlmeSBmb3VuZCAlbHUgJWRrIGJsb2NrIG91dCBvZiBzeW5jIVxuIiwKIAkJCSAgICAgIG5fb29zLCBCaXQyS0IoMSkpOwogCQkJa2hlbHBlcl9jbWQgPSAib3V0LW9mLXN5bmMiOwogCQl9CiAJfSBlbHNlIHsKLQkJRF9BU1NFUlQoKG5fb29zIC0gbWRldi0+cnNfZmFpbGVkKSA9PSAwKTsKKwkJRF9BU1NFUlQoZGV2aWNlLCAobl9vb3MgLSBkZXZpY2UtPnJzX2ZhaWxlZCkgPT0gMCk7CiAKIAkJaWYgKG9zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fCBvcy5jb25uID09IENfUEFVU0VEX1NZTkNfVCkKIAkJCWtoZWxwZXJfY21kID0gImFmdGVyLXJlc3luYy10YXJnZXQiOwogCi0JCWlmIChtZGV2LT50Y29ubi0+Y3N1bXNfdGZtICYmIG1kZXYtPnJzX3RvdGFsKSB7Ci0JCQljb25zdCB1bnNpZ25lZCBsb25nIHMgPSBtZGV2LT5yc19zYW1lX2NzdW07Ci0JCQljb25zdCB1bnNpZ25lZCBsb25nIHQgPSBtZGV2LT5yc190b3RhbDsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmNzdW1zX3RmbSAmJiBkZXZpY2UtPnJzX3RvdGFsKSB7CisJCQljb25zdCB1bnNpZ25lZCBsb25nIHMgPSBkZXZpY2UtPnJzX3NhbWVfY3N1bTsKKwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgdCA9IGRldmljZS0+cnNfdG90YWw7CiAJCQljb25zdCBpbnQgcmF0aW8gPQogCQkJCSh0ID09IDApICAgICA/IDAgOgogCQkJKHQgPCAxMDAwMDApID8gKChzKjEwMCkvdCkgOiAocy8odC8xMDApKTsKLQkJCWRldl9pbmZvKERFViwgIiV1ICUlIGhhZCBlcXVhbCBjaGVja3N1bXMsIGVsaW1pbmF0ZWQ6ICVsdUs7ICIKKwkJCWRyYmRfaW5mbyhkZXZpY2UsICIldSAlJSBoYWQgZXF1YWwgY2hlY2tzdW1zLCBlbGltaW5hdGVkOiAlbHVLOyAiCiAJCQkgICAgICJ0cmFuc2ZlcnJlZCAlbHVLIHRvdGFsICVsdUtcbiIsCiAJCQkgICAgIHJhdGlvLAotCQkJICAgICBCaXQyS0IobWRldi0+cnNfc2FtZV9jc3VtKSwKLQkJCSAgICAgQml0MktCKG1kZXYtPnJzX3RvdGFsIC0gbWRldi0+cnNfc2FtZV9jc3VtKSwKLQkJCSAgICAgQml0MktCKG1kZXYtPnJzX3RvdGFsKSk7CisJCQkgICAgIEJpdDJLQihkZXZpY2UtPnJzX3NhbWVfY3N1bSksCisJCQkgICAgIEJpdDJLQihkZXZpY2UtPnJzX3RvdGFsIC0gZGV2aWNlLT5yc19zYW1lX2NzdW0pLAorCQkJICAgICBCaXQyS0IoZGV2aWNlLT5yc190b3RhbCkpOwogCQl9CiAJfQogCi0JaWYgKG1kZXYtPnJzX2ZhaWxlZCkgewotCQlkZXZfaW5mbyhERVYsICIgICAgICAgICAgICAlbHUgZmFpbGVkIGJsb2Nrc1xuIiwgbWRldi0+cnNfZmFpbGVkKTsKKwlpZiAoZGV2aWNlLT5yc19mYWlsZWQpIHsKKwkJZHJiZF9pbmZvKGRldmljZSwgIiAgICAgICAgICAgICVsdSBmYWlsZWQgYmxvY2tzXG4iLCBkZXZpY2UtPnJzX2ZhaWxlZCk7CiAKIAkJaWYgKG9zLmNvbm4gPT0gQ19TWU5DX1RBUkdFVCB8fCBvcy5jb25uID09IENfUEFVU0VEX1NZTkNfVCkgewogCQkJbnMuZGlzayA9IERfSU5DT05TSVNURU5UOwpAQCAtOTE0LDE3OSArOTI1LDE4MSBAQAogCQlucy5wZHNrID0gRF9VUF9UT19EQVRFOwogCiAJCWlmIChvcy5jb25uID09IENfU1lOQ19UQVJHRVQgfHwgb3MuY29ubiA9PSBDX1BBVVNFRF9TWU5DX1QpIHsKLQkJCWlmIChtZGV2LT5wX3V1aWQpIHsKKwkJCWlmIChkZXZpY2UtPnBfdXVpZCkgewogCQkJCWludCBpOwogCQkJCWZvciAoaSA9IFVJX0JJVE1BUCA7IGkgPD0gVUlfSElTVE9SWV9FTkQgOyBpKyspCi0JCQkJCV9kcmJkX3V1aWRfc2V0KG1kZXYsIGksIG1kZXYtPnBfdXVpZFtpXSk7Ci0JCQkJZHJiZF91dWlkX3NldChtZGV2LCBVSV9CSVRNQVAsIG1kZXYtPmxkZXYtPm1kLnV1aWRbVUlfQ1VSUkVOVF0pOwotCQkJCV9kcmJkX3V1aWRfc2V0KG1kZXYsIFVJX0NVUlJFTlQsIG1kZXYtPnBfdXVpZFtVSV9DVVJSRU5UXSk7CisJCQkJCV9kcmJkX3V1aWRfc2V0KGRldmljZSwgaSwgZGV2aWNlLT5wX3V1aWRbaV0pOworCQkJCWRyYmRfdXVpZF9zZXQoZGV2aWNlLCBVSV9CSVRNQVAsIGRldmljZS0+bGRldi0+bWQudXVpZFtVSV9DVVJSRU5UXSk7CisJCQkJX2RyYmRfdXVpZF9zZXQoZGV2aWNlLCBVSV9DVVJSRU5ULCBkZXZpY2UtPnBfdXVpZFtVSV9DVVJSRU5UXSk7CiAJCQl9IGVsc2UgewotCQkJCWRldl9lcnIoREVWLCAibWRldi0+cF91dWlkIGlzIE5VTEwhIEJVR1xuIik7CisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiZGV2aWNlLT5wX3V1aWQgaXMgTlVMTCEgQlVHXG4iKTsKIAkJCX0KIAkJfQogCiAJCWlmICghKG9zLmNvbm4gPT0gQ19WRVJJRllfUyB8fCBvcy5jb25uID09IENfVkVSSUZZX1QpKSB7CiAJCQkvKiBmb3IgdmVyaWZ5IHJ1bnMsIHdlIGRvbid0IHVwZGF0ZSB1dWlkcyBoZXJlLAogCQkJICogc28gdGhlcmUgd291bGQgYmUgbm90aGluZyB0byByZXBvcnQuICovCi0JCQlkcmJkX3V1aWRfc2V0X2JtKG1kZXYsIDBVTCk7Ci0JCQlkcmJkX3ByaW50X3V1aWRzKG1kZXYsICJ1cGRhdGVkIFVVSURzIik7Ci0JCQlpZiAobWRldi0+cF91dWlkKSB7CisJCQlkcmJkX3V1aWRfc2V0X2JtKGRldmljZSwgMFVMKTsKKwkJCWRyYmRfcHJpbnRfdXVpZHMoZGV2aWNlLCAidXBkYXRlZCBVVUlEcyIpOworCQkJaWYgKGRldmljZS0+cF91dWlkKSB7CiAJCQkJLyogTm93IHRoZSB0d28gVVVJRCBzZXRzIGFyZSBlcXVhbCwgdXBkYXRlIHdoYXQgd2UKIAkJCQkgKiBrbm93IG9mIHRoZSBwZWVyLiAqLwogCQkJCWludCBpOwogCQkJCWZvciAoaSA9IFVJX0NVUlJFTlQgOyBpIDw9IFVJX0hJU1RPUllfRU5EIDsgaSsrKQotCQkJCQltZGV2LT5wX3V1aWRbaV0gPSBtZGV2LT5sZGV2LT5tZC51dWlkW2ldOworCQkJCQlkZXZpY2UtPnBfdXVpZFtpXSA9IGRldmljZS0+bGRldi0+bWQudXVpZFtpXTsKIAkJCX0KIAkJfQogCX0KIAotCV9kcmJkX3NldF9zdGF0ZShtZGV2LCBucywgQ1NfVkVSQk9TRSwgTlVMTCk7CisJX2RyYmRfc2V0X3N0YXRlKGRldmljZSwgbnMsIENTX1ZFUkJPU0UsIE5VTEwpOwogb3V0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnEoJm1kZXYtPnRjb25uLT5yZXFfbG9jayk7Ci0JcHV0X2xkZXYobWRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJcHV0X2xkZXYoZGV2aWNlKTsKIG91dDoKLQltZGV2LT5yc190b3RhbCAgPSAwOwotCW1kZXYtPnJzX2ZhaWxlZCA9IDA7Ci0JbWRldi0+cnNfcGF1c2VkID0gMDsKKwlkZXZpY2UtPnJzX3RvdGFsICA9IDA7CisJZGV2aWNlLT5yc19mYWlsZWQgPSAwOworCWRldmljZS0+cnNfcGF1c2VkID0gMDsKIAogCS8qIHJlc2V0IHN0YXJ0IHNlY3RvciwgaWYgd2UgcmVhY2hlZCBlbmQgb2YgZGV2aWNlICovCi0JaWYgKHZlcmlmeV9kb25lICYmIG1kZXYtPm92X2xlZnQgPT0gMCkKLQkJbWRldi0+b3Zfc3RhcnRfc2VjdG9yID0gMDsKKwlpZiAodmVyaWZ5X2RvbmUgJiYgZGV2aWNlLT5vdl9sZWZ0ID09IDApCisJCWRldmljZS0+b3Zfc3RhcnRfc2VjdG9yID0gMDsKIAotCWRyYmRfbWRfc3luYyhtZGV2KTsKKwlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAogCWlmIChraGVscGVyX2NtZCkKLQkJZHJiZF9raGVscGVyKG1kZXYsIGtoZWxwZXJfY21kKTsKKwkJZHJiZF9raGVscGVyKGRldmljZSwga2hlbHBlcl9jbWQpOwogCiAJcmV0dXJuIDE7CiB9CiAKIC8qIGhlbHBlciAqLwotc3RhdGljIHZvaWQgbW92ZV90b19uZXRfZWVfb3JfZnJlZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QgKnBlZXJfcmVxKQorc3RhdGljIHZvaWQgbW92ZV90b19uZXRfZWVfb3JfZnJlZShzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSkKIHsKIAlpZiAoZHJiZF9wZWVyX3JlcV9oYXNfYWN0aXZlX3BhZ2UocGVlcl9yZXEpKSB7CiAJCS8qIFRoaXMgbWlnaHQgaGFwcGVuIGlmIHNlbmRwYWdlKCkgaGFzIG5vdCBmaW5pc2hlZCAqLwogCQlpbnQgaSA9IChwZWVyX3JlcS0+aS5zaXplICsgUEFHRV9TSVpFIC0xKSA+PiBQQUdFX1NISUZUOwotCQlhdG9taWNfYWRkKGksICZtZGV2LT5wcF9pbl91c2VfYnlfbmV0KTsKLQkJYXRvbWljX3N1YihpLCAmbWRldi0+cHBfaW5fdXNlKTsKLQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmcGVlcl9yZXEtPncubGlzdCwgJm1kZXYtPm5ldF9lZSk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+dGNvbm4tPnJlcV9sb2NrKTsKKwkJYXRvbWljX2FkZChpLCAmZGV2aWNlLT5wcF9pbl91c2VfYnlfbmV0KTsKKwkJYXRvbWljX3N1YihpLCAmZGV2aWNlLT5wcF9pbl91c2UpOworCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPnJlc291cmNlLT5yZXFfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJnBlZXJfcmVxLT53Lmxpc3QsICZkZXZpY2UtPm5ldF9lZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQl3YWtlX3VwKCZkcmJkX3BwX3dhaXQpOwogCX0gZWxzZQotCQlkcmJkX2ZyZWVfcGVlcl9yZXEobWRldiwgcGVlcl9yZXEpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiB9CiAKIC8qKgogICogd19lX2VuZF9kYXRhX3JlcSgpIC0gV29ya2VyIGNhbGxiYWNrLCB0byBzZW5kIGEgUF9EQVRBX1JFUExZIHBhY2tldCBpbiByZXNwb25zZSB0byBhIFBfREFUQV9SRVFVRVNUCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqIEB3OgkJd29yayBvYmplY3QuCiAgKiBAY2FuY2VsOglUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBhbnl3YXlzCiAgKi8KIGludCB3X2VfZW5kX2RhdGFfcmVxKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSA9IHBlZXJfcmVxLT5wZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IGVycjsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7Ci0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7Ci0JCWRlY191bmFja2VkKG1kZXYpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CisJCWRlY191bmFja2VkKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChsaWtlbHkoKHBlZXJfcmVxLT5mbGFncyAmIEVFX1dBU19FUlJPUikgPT0gMCkpIHsKLQkJZXJyID0gZHJiZF9zZW5kX2Jsb2NrKG1kZXYsIFBfREFUQV9SRVBMWSwgcGVlcl9yZXEpOworCQllcnIgPSBkcmJkX3NlbmRfYmxvY2socGVlcl9kZXZpY2UsIFBfREFUQV9SRVBMWSwgcGVlcl9yZXEpOwogCX0gZWxzZSB7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJTZW5kaW5nIE5lZ0RSZXBseS4gc2VjdG9yPSVsbHVzLlxuIiwKKwkJCWRyYmRfZXJyKGRldmljZSwgIlNlbmRpbmcgTmVnRFJlcGx5LiBzZWN0b3I9JWxsdXMuXG4iLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGVlcl9yZXEtPmkuc2VjdG9yKTsKIAotCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfTkVHX0RSRVBMWSwgcGVlcl9yZXEpOworCQllcnIgPSBkcmJkX3NlbmRfYWNrKHBlZXJfZGV2aWNlLCBQX05FR19EUkVQTFksIHBlZXJfcmVxKTsKIAl9CiAKLQlkZWNfdW5hY2tlZChtZGV2KTsKKwlkZWNfdW5hY2tlZChkZXZpY2UpOwogCi0JbW92ZV90b19uZXRfZWVfb3JfZnJlZShtZGV2LCBwZWVyX3JlcSk7CisJbW92ZV90b19uZXRfZWVfb3JfZnJlZShkZXZpY2UsIHBlZXJfcmVxKTsKIAogCWlmICh1bmxpa2VseShlcnIpKQotCQlkZXZfZXJyKERFViwgImRyYmRfc2VuZF9ibG9jaygpIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2VuZF9ibG9jaygpIGZhaWxlZFxuIik7CiAJcmV0dXJuIGVycjsKIH0KIAogLyoqCiAgKiB3X2VfZW5kX3JzZGF0YV9yZXEoKSAtIFdvcmtlciBjYWxsYmFjayB0byBzZW5kIGEgUF9SU19EQVRBX1JFUExZIHBhY2tldCBpbiByZXNwb25zZSB0byBhIFBfUlNfREFUQV9SRVFVRVNUCi0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCiAgKiBAdzoJCXdvcmsgb2JqZWN0LgogICogQGNhbmNlbDoJVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW55d2F5cwogICovCiBpbnQgd19lX2VuZF9yc2RhdGFfcmVxKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0ICpwZWVyX3JlcSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9wZWVyX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OworCXN0cnVjdCBkcmJkX3BlZXJfZGV2aWNlICpwZWVyX2RldmljZSA9IHBlZXJfcmVxLT5wZWVyX2RldmljZTsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9IHBlZXJfZGV2aWNlLT5kZXZpY2U7CiAJaW50IGVycjsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7Ci0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7Ci0JCWRlY191bmFja2VkKG1kZXYpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CisJCWRlY191bmFja2VkKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChnZXRfbGRldl9pZl9zdGF0ZShtZGV2LCBEX0ZBSUxFRCkpIHsKLQkJZHJiZF9yc19jb21wbGV0ZV9pbyhtZGV2LCBwZWVyX3JlcS0+aS5zZWN0b3IpOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXZfaWZfc3RhdGUoZGV2aWNlLCBEX0ZBSUxFRCkpIHsKKwkJZHJiZF9yc19jb21wbGV0ZV9pbyhkZXZpY2UsIHBlZXJfcmVxLT5pLnNlY3Rvcik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCi0JaWYgKG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19BSEVBRCkgewotCQllcnIgPSBkcmJkX3NlbmRfYWNrKG1kZXYsIFBfUlNfQ0FOQ0VMLCBwZWVyX3JlcSk7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA9PSBDX0FIRUFEKSB7CisJCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIFBfUlNfQ0FOQ0VMLCBwZWVyX3JlcSk7CiAJfSBlbHNlIGlmIChsaWtlbHkoKHBlZXJfcmVxLT5mbGFncyAmIEVFX1dBU19FUlJPUikgPT0gMCkpIHsKLQkJaWYgKGxpa2VseShtZGV2LT5zdGF0ZS5wZHNrID49IERfSU5DT05TSVNURU5UKSkgewotCQkJaW5jX3JzX3BlbmRpbmcobWRldik7Ci0JCQllcnIgPSBkcmJkX3NlbmRfYmxvY2sobWRldiwgUF9SU19EQVRBX1JFUExZLCBwZWVyX3JlcSk7CisJCWlmIChsaWtlbHkoZGV2aWNlLT5zdGF0ZS5wZHNrID49IERfSU5DT05TSVNURU5UKSkgeworCQkJaW5jX3JzX3BlbmRpbmcoZGV2aWNlKTsKKwkJCWVyciA9IGRyYmRfc2VuZF9ibG9jayhwZWVyX2RldmljZSwgUF9SU19EQVRBX1JFUExZLCBwZWVyX3JlcSk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCQlkZXZfZXJyKERFViwgIk5vdCBzZW5kaW5nIFJTRGF0YVJlcGx5LCAiCisJCQkJZHJiZF9lcnIoZGV2aWNlLCAiTm90IHNlbmRpbmcgUlNEYXRhUmVwbHksICIKIAkJCQkgICAgInBhcnRuZXIgRElTS0xFU1MhXG4iKTsKIAkJCWVyciA9IDA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoX19yYXRlbGltaXQoJmRyYmRfcmF0ZWxpbWl0X3N0YXRlKSkKLQkJCWRldl9lcnIoREVWLCAiU2VuZGluZyBOZWdSU0RSZXBseS4gc2VjdG9yICVsbHVzLlxuIiwKKwkJCWRyYmRfZXJyKGRldmljZSwgIlNlbmRpbmcgTmVnUlNEUmVwbHkuIHNlY3RvciAlbGx1cy5cbiIsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwZWVyX3JlcS0+aS5zZWN0b3IpOwogCi0JCWVyciA9IGRyYmRfc2VuZF9hY2sobWRldiwgUF9ORUdfUlNfRFJFUExZLCBwZWVyX3JlcSk7CisJCWVyciA9IGRyYmRfc2VuZF9hY2socGVlcl9kZXZpY2UsIFBfTkVHX1JTX0RSRVBMWSwgcGVlcl9yZXEpOwogCiAJCS8qIHVwZGF0ZSByZXN5bmMgZGF0YSB3aXRoIGZhaWx1cmUgKi8KLQkJZHJiZF9yc19mYWlsZWRfaW8obWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKKwkJZHJiZF9yc19mYWlsZWRfaW8oZGV2aWNlLCBwZWVyX3JlcS0+aS5zZWN0b3IsIHBlZXJfcmVxLT5pLnNpemUpOwogCX0KIAotCWRlY191bmFja2VkKG1kZXYpOworCWRlY191bmFja2VkKGRldmljZSk7CiAKLQltb3ZlX3RvX25ldF9lZV9vcl9mcmVlKG1kZXYsIHBlZXJfcmVxKTsKKwltb3ZlX3RvX25ldF9lZV9vcl9mcmVlKGRldmljZSwgcGVlcl9yZXEpOwogCiAJaWYgKHVubGlrZWx5KGVycikpCi0JCWRldl9lcnIoREVWLCAiZHJiZF9zZW5kX2Jsb2NrKCkgZmFpbGVkXG4iKTsKKwkJZHJiZF9lcnIoZGV2aWNlLCAiZHJiZF9zZW5kX2Jsb2NrKCkgZmFpbGVkXG4iKTsKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgd19lX2VuZF9jc3VtX3JzX3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkaWdlc3RfaW5mbyAqZGk7CiAJaW50IGRpZ2VzdF9zaXplOwogCXZvaWQgKmRpZ2VzdCA9IE5VTEw7CiAJaW50IGVyciwgZXEgPSAwOwogCiAJaWYgKHVubGlrZWx5KGNhbmNlbCkpIHsKLQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKLQkJZGVjX3VuYWNrZWQobWRldik7CisJCWRyYmRfZnJlZV9wZWVyX3JlcShkZXZpY2UsIHBlZXJfcmVxKTsKKwkJZGVjX3VuYWNrZWQoZGV2aWNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGdldF9sZGV2KG1kZXYpKSB7Ci0JCWRyYmRfcnNfY29tcGxldGVfaW8obWRldiwgcGVlcl9yZXEtPmkuc2VjdG9yKTsKLQkJcHV0X2xkZXYobWRldik7CisJaWYgKGdldF9sZGV2KGRldmljZSkpIHsKKwkJZHJiZF9yc19jb21wbGV0ZV9pbyhkZXZpY2UsIHBlZXJfcmVxLT5pLnNlY3Rvcik7CisJCXB1dF9sZGV2KGRldmljZSk7CiAJfQogCiAJZGkgPSBwZWVyX3JlcS0+ZGlnZXN0OwpAQCAtMTA5NSw0NyArMTEwOCw0OCBAQAogCQkvKiBxdWljayBoYWNrIHRvIHRyeSB0byBhdm9pZCBhIHJhY2UgYWdhaW5zdCByZWNvbmZpZ3VyYXRpb24uCiAJCSAqIGEgcmVhbCBmaXggd291bGQgYmUgbXVjaCBtb3JlIGludm9sdmVkLAogCQkgKiBpbnRyb2R1Y2luZyBtb3JlIGxvY2tpbmcgbWVjaGFuaXNtcyAqLwotCQlpZiAobWRldi0+dGNvbm4tPmNzdW1zX3RmbSkgewotCQkJZGlnZXN0X3NpemUgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKG1kZXYtPnRjb25uLT5jc3Vtc190Zm0pOwotCQkJRF9BU1NFUlQoZGlnZXN0X3NpemUgPT0gZGktPmRpZ2VzdF9zaXplKTsKKwkJaWYgKHBlZXJfZGV2aWNlLT5jb25uZWN0aW9uLT5jc3Vtc190Zm0pIHsKKwkJCWRpZ2VzdF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+Y3N1bXNfdGZtKTsKKwkJCURfQVNTRVJUKGRldmljZSwgZGlnZXN0X3NpemUgPT0gZGktPmRpZ2VzdF9zaXplKTsKIAkJCWRpZ2VzdCA9IGttYWxsb2MoZGlnZXN0X3NpemUsIEdGUF9OT0lPKTsKIAkJfQogCQlpZiAoZGlnZXN0KSB7Ci0JCQlkcmJkX2NzdW1fZWUobWRldiwgbWRldi0+dGNvbm4tPmNzdW1zX3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CisJCQlkcmJkX2NzdW1fZWUocGVlcl9kZXZpY2UtPmNvbm5lY3Rpb24tPmNzdW1zX3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CiAJCQllcSA9ICFtZW1jbXAoZGlnZXN0LCBkaS0+ZGlnZXN0LCBkaWdlc3Rfc2l6ZSk7CiAJCQlrZnJlZShkaWdlc3QpOwogCQl9CiAKIAkJaWYgKGVxKSB7Ci0JCQlkcmJkX3NldF9pbl9zeW5jKG1kZXYsIHBlZXJfcmVxLT5pLnNlY3RvciwgcGVlcl9yZXEtPmkuc2l6ZSk7CisJCQlkcmJkX3NldF9pbl9zeW5jKGRldmljZSwgcGVlcl9yZXEtPmkuc2VjdG9yLCBwZWVyX3JlcS0+aS5zaXplKTsKIAkJCS8qIHJzX3NhbWVfY3N1bXMgdW5pdCBpcyBCTV9CTE9DS19TSVpFICovCi0JCQltZGV2LT5yc19zYW1lX2NzdW0gKz0gcGVlcl9yZXEtPmkuc2l6ZSA+PiBCTV9CTE9DS19TSElGVDsKLQkJCWVyciA9IGRyYmRfc2VuZF9hY2sobWRldiwgUF9SU19JU19JTl9TWU5DLCBwZWVyX3JlcSk7CisJCQlkZXZpY2UtPnJzX3NhbWVfY3N1bSArPSBwZWVyX3JlcS0+aS5zaXplID4+IEJNX0JMT0NLX1NISUZUOworCQkJZXJyID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9SU19JU19JTl9TWU5DLCBwZWVyX3JlcSk7CiAJCX0gZWxzZSB7Ci0JCQlpbmNfcnNfcGVuZGluZyhtZGV2KTsKKwkJCWluY19yc19wZW5kaW5nKGRldmljZSk7CiAJCQlwZWVyX3JlcS0+YmxvY2tfaWQgPSBJRF9TWU5DRVI7IC8qIEJ5IHNldHRpbmcgYmxvY2tfaWQsIGRpZ2VzdCBwb2ludGVyIGJlY29tZXMgaW52YWxpZCEgKi8KIAkJCXBlZXJfcmVxLT5mbGFncyAmPSB+RUVfSEFTX0RJR0VTVDsgLyogVGhpcyBwZWVyIHJlcXVlc3Qgbm8gbG9uZ2VyIGhhcyBhIGRpZ2VzdCBwb2ludGVyICovCiAJCQlrZnJlZShkaSk7Ci0JCQllcnIgPSBkcmJkX3NlbmRfYmxvY2sobWRldiwgUF9SU19EQVRBX1JFUExZLCBwZWVyX3JlcSk7CisJCQllcnIgPSBkcmJkX3NlbmRfYmxvY2socGVlcl9kZXZpY2UsIFBfUlNfREFUQV9SRVBMWSwgcGVlcl9yZXEpOwogCQl9CiAJfSBlbHNlIHsKLQkJZXJyID0gZHJiZF9zZW5kX2FjayhtZGV2LCBQX05FR19SU19EUkVQTFksIHBlZXJfcmVxKTsKKwkJZXJyID0gZHJiZF9zZW5kX2FjayhwZWVyX2RldmljZSwgUF9ORUdfUlNfRFJFUExZLCBwZWVyX3JlcSk7CiAJCWlmIChfX3JhdGVsaW1pdCgmZHJiZF9yYXRlbGltaXRfc3RhdGUpKQotCQkJZGV2X2VycihERVYsICJTZW5kaW5nIE5lZ0RSZXBseS4gSSBndWVzcyBpdCBnZXRzIG1lc3N5LlxuIik7CisJCQlkcmJkX2VycihkZXZpY2UsICJTZW5kaW5nIE5lZ0RSZXBseS4gSSBndWVzcyBpdCBnZXRzIG1lc3N5LlxuIik7CiAJfQogCi0JZGVjX3VuYWNrZWQobWRldik7Ci0JbW92ZV90b19uZXRfZWVfb3JfZnJlZShtZGV2LCBwZWVyX3JlcSk7CisJZGVjX3VuYWNrZWQoZGV2aWNlKTsKKwltb3ZlX3RvX25ldF9lZV9vcl9mcmVlKGRldmljZSwgcGVlcl9yZXEpOwogCiAJaWYgKHVubGlrZWx5KGVycikpCi0JCWRldl9lcnIoREVWLCAiZHJiZF9zZW5kX2Jsb2NrL2FjaygpIGZhaWxlZFxuIik7CisJCWRyYmRfZXJyKGRldmljZSwgImRyYmRfc2VuZF9ibG9jay9hY2soKSBmYWlsZWRcbiIpOwogCXJldHVybiBlcnI7CiB9CiAKIGludCB3X2VfZW5kX292X3JlcShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXNlY3Rvcl90IHNlY3RvciA9IHBlZXJfcmVxLT5pLnNlY3RvcjsKIAl1bnNpZ25lZCBpbnQgc2l6ZSA9IHBlZXJfcmVxLT5pLnNpemU7CiAJaW50IGRpZ2VzdF9zaXplOwpAQCAtMTE0NSw3ICsxMTU5LDcgQEAKIAlpZiAodW5saWtlbHkoY2FuY2VsKSkKIAkJZ290byBvdXQ7CiAKLQlkaWdlc3Rfc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUobWRldi0+dGNvbm4tPnZlcmlmeV90Zm0pOworCWRpZ2VzdF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+dmVyaWZ5X3RmbSk7CiAJZGlnZXN0ID0ga21hbGxvYyhkaWdlc3Rfc2l6ZSwgR0ZQX05PSU8pOwogCWlmICghZGlnZXN0KSB7CiAJCWVyciA9IDE7CS8qIHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiBpbiBjYXNlIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCAqLwpAQCAtMTE1Myw3ICsxMTY3LDcgQEAKIAl9CiAKIAlpZiAobGlrZWx5KCEocGVlcl9yZXEtPmZsYWdzICYgRUVfV0FTX0VSUk9SKSkpCi0JCWRyYmRfY3N1bV9lZShtZGV2LCBtZGV2LT50Y29ubi0+dmVyaWZ5X3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CisJCWRyYmRfY3N1bV9lZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+dmVyaWZ5X3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CiAJZWxzZQogCQltZW1zZXQoZGlnZXN0LCAwLCBkaWdlc3Rfc2l6ZSk7CiAKQEAgLTExNjIsMzYgKzExNzYsMzcgQEAKIAkgKiBzb21lIGRpc3RyaWJ1dGVkIGRlYWRsb2NrLCBpZiB0aGUgb3RoZXIgc2lkZSBibG9ja3Mgb24KIAkgKiBjb25nZXN0aW9uIGFzIHdlbGwsIGJlY2F1c2Ugb3VyIHJlY2VpdmVyIGJsb2NrcyBpbgogCSAqIGRyYmRfYWxsb2NfcGFnZXMgZHVlIHRvIHBwX2luX3VzZSA+IG1heF9idWZmZXJzLiAqLwotCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7CisJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOwogCXBlZXJfcmVxID0gTlVMTDsKLQlpbmNfcnNfcGVuZGluZyhtZGV2KTsKLQllcnIgPSBkcmJkX3NlbmRfZHJlcXVlc3RfY3N1bShtZGV2LCBzZWN0b3IsIHNpemUsIGRpZ2VzdCwgZGlnZXN0X3NpemUsIFBfT1ZfUkVQTFkpOworCWluY19yc19wZW5kaW5nKGRldmljZSk7CisJZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0X2NzdW0ocGVlcl9kZXZpY2UsIHNlY3Rvciwgc2l6ZSwgZGlnZXN0LCBkaWdlc3Rfc2l6ZSwgUF9PVl9SRVBMWSk7CiAJaWYgKGVycikKLQkJZGVjX3JzX3BlbmRpbmcobWRldik7CisJCWRlY19yc19wZW5kaW5nKGRldmljZSk7CiAJa2ZyZWUoZGlnZXN0KTsKIAogb3V0OgogCWlmIChwZWVyX3JlcSkKLQkJZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKLQlkZWNfdW5hY2tlZChtZGV2KTsKKwkJZHJiZF9mcmVlX3BlZXJfcmVxKGRldmljZSwgcGVlcl9yZXEpOworCWRlY191bmFja2VkKGRldmljZSk7CiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBkcmJkX292X291dF9vZl9zeW5jX2ZvdW5kKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpCit2b2lkIGRyYmRfb3Zfb3V0X29mX3N5bmNfZm91bmQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUpCiB7Ci0JaWYgKG1kZXYtPm92X2xhc3Rfb29zX3N0YXJ0ICsgbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSA9PSBzZWN0b3IpIHsKLQkJbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSArPSBzaXplPj45OworCWlmIChkZXZpY2UtPm92X2xhc3Rfb29zX3N0YXJ0ICsgZGV2aWNlLT5vdl9sYXN0X29vc19zaXplID09IHNlY3RvcikgeworCQlkZXZpY2UtPm92X2xhc3Rfb29zX3NpemUgKz0gc2l6ZT4+OTsKIAl9IGVsc2UgewotCQltZGV2LT5vdl9sYXN0X29vc19zdGFydCA9IHNlY3RvcjsKLQkJbWRldi0+b3ZfbGFzdF9vb3Nfc2l6ZSA9IHNpemU+Pjk7CisJCWRldmljZS0+b3ZfbGFzdF9vb3Nfc3RhcnQgPSBzZWN0b3I7CisJCWRldmljZS0+b3ZfbGFzdF9vb3Nfc2l6ZSA9IHNpemU+Pjk7CiAJfQotCWRyYmRfc2V0X291dF9vZl9zeW5jKG1kZXYsIHNlY3Rvciwgc2l6ZSk7CisJZHJiZF9zZXRfb3V0X29mX3N5bmMoZGV2aWNlLCBzZWN0b3IsIHNpemUpOwogfQogCiBpbnQgd19lX2VuZF9vdl9yZXBseShzdHJ1Y3QgZHJiZF93b3JrICp3LCBpbnQgY2FuY2VsKQogewogCXN0cnVjdCBkcmJkX3BlZXJfcmVxdWVzdCAqcGVlcl9yZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcGVlcl9yZXF1ZXN0LCB3KTsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9wZWVyX2RldmljZSAqcGVlcl9kZXZpY2UgPSBwZWVyX3JlcS0+cGVlcl9kZXZpY2U7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSBwZWVyX2RldmljZS0+ZGV2aWNlOwogCXN0cnVjdCBkaWdlc3RfaW5mbyAqZGk7CiAJdm9pZCAqZGlnZXN0OwogCXNlY3Rvcl90IHNlY3RvciA9IHBlZXJfcmVxLT5pLnNlY3RvcjsKQEAgLTEyMDEsMjcgKzEyMTYsMjcgQEAKIAlib29sIHN0b3Bfc2VjdG9yX3JlYWNoZWQgPSBmYWxzZTsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7Ci0JCWRyYmRfZnJlZV9wZWVyX3JlcShtZGV2LCBwZWVyX3JlcSk7Ci0JCWRlY191bmFja2VkKG1kZXYpOworCQlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CisJCWRlY191bmFja2VkKGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KIAogCS8qIGFmdGVyICJjYW5jZWwiLCBiZWNhdXNlIGFmdGVyIGRyYmRfZGlzY29ubmVjdC9kcmJkX3JzX2NhbmNlbF9hbGwKIAkgKiB0aGUgcmVzeW5jIGxydSBoYXMgYmVlbiBjbGVhbmVkIHVwIGFscmVhZHkgKi8KLQlpZiAoZ2V0X2xkZXYobWRldikpIHsKLQkJZHJiZF9yc19jb21wbGV0ZV9pbyhtZGV2LCBwZWVyX3JlcS0+aS5zZWN0b3IpOwotCQlwdXRfbGRldihtZGV2KTsKKwlpZiAoZ2V0X2xkZXYoZGV2aWNlKSkgeworCQlkcmJkX3JzX2NvbXBsZXRlX2lvKGRldmljZSwgcGVlcl9yZXEtPmkuc2VjdG9yKTsKKwkJcHV0X2xkZXYoZGV2aWNlKTsKIAl9CiAKIAlkaSA9IHBlZXJfcmVxLT5kaWdlc3Q7CiAKIAlpZiAobGlrZWx5KChwZWVyX3JlcS0+ZmxhZ3MgJiBFRV9XQVNfRVJST1IpID09IDApKSB7Ci0JCWRpZ2VzdF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShtZGV2LT50Y29ubi0+dmVyaWZ5X3RmbSk7CisJCWRpZ2VzdF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+dmVyaWZ5X3RmbSk7CiAJCWRpZ2VzdCA9IGttYWxsb2MoZGlnZXN0X3NpemUsIEdGUF9OT0lPKTsKIAkJaWYgKGRpZ2VzdCkgewotCQkJZHJiZF9jc3VtX2VlKG1kZXYsIG1kZXYtPnRjb25uLT52ZXJpZnlfdGZtLCBwZWVyX3JlcSwgZGlnZXN0KTsKKwkJCWRyYmRfY3N1bV9lZShwZWVyX2RldmljZS0+Y29ubmVjdGlvbi0+dmVyaWZ5X3RmbSwgcGVlcl9yZXEsIGRpZ2VzdCk7CiAKLQkJCURfQVNTRVJUKGRpZ2VzdF9zaXplID09IGRpLT5kaWdlc3Rfc2l6ZSk7CisJCQlEX0FTU0VSVChkZXZpY2UsIGRpZ2VzdF9zaXplID09IGRpLT5kaWdlc3Rfc2l6ZSk7CiAJCQllcSA9ICFtZW1jbXAoZGlnZXN0LCBkaS0+ZGlnZXN0LCBkaWdlc3Rfc2l6ZSk7CiAJCQlrZnJlZShkaWdlc3QpOwogCQl9CkBAIC0xMjMyLDEwMiArMTI0Nyw5NSBAQAogCSAqIHNvbWUgZGlzdHJpYnV0ZWQgZGVhZGxvY2ssIGlmIHRoZSBvdGhlciBzaWRlIGJsb2NrcyBvbgogCSAqIGNvbmdlc3Rpb24gYXMgd2VsbCwgYmVjYXVzZSBvdXIgcmVjZWl2ZXIgYmxvY2tzIGluCiAJICogZHJiZF9hbGxvY19wYWdlcyBkdWUgdG8gcHBfaW5fdXNlID4gbWF4X2J1ZmZlcnMuICovCi0JZHJiZF9mcmVlX3BlZXJfcmVxKG1kZXYsIHBlZXJfcmVxKTsKKwlkcmJkX2ZyZWVfcGVlcl9yZXEoZGV2aWNlLCBwZWVyX3JlcSk7CiAJaWYgKCFlcSkKLQkJZHJiZF9vdl9vdXRfb2Zfc3luY19mb3VuZChtZGV2LCBzZWN0b3IsIHNpemUpOworCQlkcmJkX292X291dF9vZl9zeW5jX2ZvdW5kKGRldmljZSwgc2VjdG9yLCBzaXplKTsKIAllbHNlCi0JCW92X291dF9vZl9zeW5jX3ByaW50KG1kZXYpOworCQlvdl9vdXRfb2Zfc3luY19wcmludChkZXZpY2UpOwogCi0JZXJyID0gZHJiZF9zZW5kX2Fja19leChtZGV2LCBQX09WX1JFU1VMVCwgc2VjdG9yLCBzaXplLAorCWVyciA9IGRyYmRfc2VuZF9hY2tfZXgocGVlcl9kZXZpY2UsIFBfT1ZfUkVTVUxULCBzZWN0b3IsIHNpemUsCiAJCQkgICAgICAgZXEgPyBJRF9JTl9TWU5DIDogSURfT1VUX09GX1NZTkMpOwogCi0JZGVjX3VuYWNrZWQobWRldik7CisJZGVjX3VuYWNrZWQoZGV2aWNlKTsKIAotCS0tbWRldi0+b3ZfbGVmdDsKKwktLWRldmljZS0+b3ZfbGVmdDsKIAogCS8qIGxldCdzIGFkdmFuY2UgcHJvZ3Jlc3Mgc3RlcCBtYXJrcyBvbmx5IGZvciBldmVyeSBvdGhlciBtZWdhYnl0ZSAqLwotCWlmICgobWRldi0+b3ZfbGVmdCAmIDB4MjAwKSA9PSAweDIwMCkKLQkJZHJiZF9hZHZhbmNlX3JzX21hcmtzKG1kZXYsIG1kZXYtPm92X2xlZnQpOworCWlmICgoZGV2aWNlLT5vdl9sZWZ0ICYgMHgyMDApID09IDB4MjAwKQorCQlkcmJkX2FkdmFuY2VfcnNfbWFya3MoZGV2aWNlLCBkZXZpY2UtPm92X2xlZnQpOwogCi0Jc3RvcF9zZWN0b3JfcmVhY2hlZCA9IHZlcmlmeV9jYW5fZG9fc3RvcF9zZWN0b3IobWRldikgJiYKLQkJKHNlY3RvciArIChzaXplPj45KSkgPj0gbWRldi0+b3Zfc3RvcF9zZWN0b3I7CisJc3RvcF9zZWN0b3JfcmVhY2hlZCA9IHZlcmlmeV9jYW5fZG9fc3RvcF9zZWN0b3IoZGV2aWNlKSAmJgorCQkoc2VjdG9yICsgKHNpemU+PjkpKSA+PSBkZXZpY2UtPm92X3N0b3Bfc2VjdG9yOwogCi0JaWYgKG1kZXYtPm92X2xlZnQgPT0gMCB8fCBzdG9wX3NlY3Rvcl9yZWFjaGVkKSB7Ci0JCW92X291dF9vZl9zeW5jX3ByaW50KG1kZXYpOwotCQlkcmJkX3Jlc3luY19maW5pc2hlZChtZGV2KTsKKwlpZiAoZGV2aWNlLT5vdl9sZWZ0ID09IDAgfHwgc3RvcF9zZWN0b3JfcmVhY2hlZCkgeworCQlvdl9vdXRfb2Zfc3luY19wcmludChkZXZpY2UpOworCQlkcmJkX3Jlc3luY19maW5pc2hlZChkZXZpY2UpOwogCX0KIAogCXJldHVybiBlcnI7CiB9CiAKLWludCB3X3ByZXZfd29ya19kb25lKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCi17Ci0Jc3RydWN0IGRyYmRfd3FfYmFycmllciAqYiA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF93cV9iYXJyaWVyLCB3KTsKLQotCWNvbXBsZXRlKCZiLT5kb25lKTsKLQlyZXR1cm4gMDsKLX0KLQogLyogRklYTUUKICAqIFdlIG5lZWQgdG8gdHJhY2sgdGhlIG51bWJlciBvZiBwZW5kaW5nIGJhcnJpZXIgYWNrcywKICAqIGFuZCB0byBiZSBhYmxlIHRvIHdhaXQgZm9yIHRoZW0uCiAgKiBTZWUgYWxzbyBjb21tZW50IGluIGRyYmRfYWRtX2F0dGFjaCBiZWZvcmUgZHJiZF9zdXNwZW5kX2lvLgogICovCi1pbnQgZHJiZF9zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uKQorc3RhdGljIGludCBkcmJkX3NlbmRfYmFycmllcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQogewogCXN0cnVjdCBwX2JhcnJpZXIgKnA7CiAJc3RydWN0IGRyYmRfc29ja2V0ICpzb2NrOwogCi0Jc29jayA9ICZ0Y29ubi0+ZGF0YTsKLQlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQodGNvbm4sIHNvY2spOworCXNvY2sgPSAmY29ubmVjdGlvbi0+ZGF0YTsKKwlwID0gY29ubl9wcmVwYXJlX2NvbW1hbmQoY29ubmVjdGlvbiwgc29jayk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKLQlwLT5iYXJyaWVyID0gdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF9ucjsKKwlwLT5iYXJyaWVyID0gY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yOwogCXAtPnBhZCA9IDA7Ci0JdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMgPSAwOworCWNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMgPSAwOwogCi0JcmV0dXJuIGNvbm5fc2VuZF9jb21tYW5kKHRjb25uLCBzb2NrLCBQX0JBUlJJRVIsIHNpemVvZigqcCksIE5VTEwsIDApOworCXJldHVybiBjb25uX3NlbmRfY29tbWFuZChjb25uZWN0aW9uLCBzb2NrLCBQX0JBUlJJRVIsIHNpemVvZigqcCksIE5VTEwsIDApOwogfQogCiBpbnQgd19zZW5kX3dyaXRlX2hpbnQoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKLQlzdHJ1Y3QgZHJiZF9jb25mICptZGV2ID0gdy0+bWRldjsKKwlzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSA9CisJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgZHJiZF9kZXZpY2UsIHVucGx1Z193b3JrKTsKIAlzdHJ1Y3QgZHJiZF9zb2NrZXQgKnNvY2s7CiAKIAlpZiAoY2FuY2VsKQogCQlyZXR1cm4gMDsKLQlzb2NrID0gJm1kZXYtPnRjb25uLT5kYXRhOwotCWlmICghZHJiZF9wcmVwYXJlX2NvbW1hbmQobWRldiwgc29jaykpCisJc29jayA9ICZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5kYXRhOworCWlmICghZHJiZF9wcmVwYXJlX2NvbW1hbmQoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgc29jaykpCiAJCXJldHVybiAtRUlPOwotCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChtZGV2LCBzb2NrLCBQX1VOUExVR19SRU1PVEUsIDAsIE5VTEwsIDApOworCXJldHVybiBkcmJkX3NlbmRfY29tbWFuZChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCBzb2NrLCBQX1VOUExVR19SRU1PVEUsIDAsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgdm9pZCByZV9pbml0X2lmX2ZpcnN0X3dyaXRlKHN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiwgdW5zaWduZWQgaW50IGVwb2NoKQorc3RhdGljIHZvaWQgcmVfaW5pdF9pZl9maXJzdF93cml0ZShzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bnNpZ25lZCBpbnQgZXBvY2gpCiB7Ci0JaWYgKCF0Y29ubi0+c2VuZC5zZWVuX2FueV93cml0ZV95ZXQpIHsKLQkJdGNvbm4tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0ID0gdHJ1ZTsKLQkJdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF9uciA9IGVwb2NoOwotCQl0Y29ubi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcyA9IDA7CisJaWYgKCFjb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCkgeworCQljb25uZWN0aW9uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCA9IHRydWU7CisJCWNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF9uciA9IGVwb2NoOworCQljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzID0gMDsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG1heWJlX3NlbmRfYmFycmllcihzdHJ1Y3QgZHJiZF90Y29ubiAqdGNvbm4sIHVuc2lnbmVkIGludCBlcG9jaCkKK3N0YXRpYyB2b2lkIG1heWJlX3NlbmRfYmFycmllcihzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB1bnNpZ25lZCBpbnQgZXBvY2gpCiB7CiAJLyogcmUtaW5pdCBpZiBmaXJzdCB3cml0ZSBvbiB0aGlzIGNvbm5lY3Rpb24gKi8KLQlpZiAoIXRjb25uLT5zZW5kLnNlZW5fYW55X3dyaXRlX3lldCkKKwlpZiAoIWNvbm5lY3Rpb24tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0KQogCQlyZXR1cm47Ci0JaWYgKHRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgIT0gZXBvY2gpIHsKLQkJaWYgKHRjb25uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzKQotCQkJZHJiZF9zZW5kX2JhcnJpZXIodGNvbm4pOwotCQl0Y29ubi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yID0gZXBvY2g7CisJaWYgKGNvbm5lY3Rpb24tPnNlbmQuY3VycmVudF9lcG9jaF9uciAhPSBlcG9jaCkgeworCQlpZiAoY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcykKKwkJCWRyYmRfc2VuZF9iYXJyaWVyKGNvbm5lY3Rpb24pOworCQljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfbnIgPSBlcG9jaDsKIAl9CiB9CiAKIGludCB3X3NlbmRfb3V0X29mX3N5bmMoc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gbWRldi0+dGNvbm47CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbjsKIAlpbnQgZXJyOwogCiAJaWYgKHVubGlrZWx5KGNhbmNlbCkpIHsKQEAgLTEzMzUsMTMgKzEzNDMsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyogdGhpcyB0aW1lLCBubyB0Y29ubi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcysrOworCS8qIHRoaXMgdGltZSwgbm8gY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX3dyaXRlcysrOwogCSAqIElmIGl0IHdhcyBzZW50LCBpdCB3YXMgdGhlIGNsb3NpbmcgYmFycmllciBmb3IgdGhlIGxhc3QKIAkgKiByZXBsaWNhdGVkIGVwb2NoLCBiZWZvcmUgd2Ugd2VudCBpbnRvIEFIRUFEIG1vZGUuCiAJICogTm8gbW9yZSBiYXJyaWVycyB3aWxsIGJlIHNlbnQsIHVudGlsIHdlIGxlYXZlIEFIRUFEIG1vZGUgYWdhaW4uICovCi0JbWF5YmVfc2VuZF9iYXJyaWVyKHRjb25uLCByZXEtPmVwb2NoKTsKKwltYXliZV9zZW5kX2JhcnJpZXIoY29ubmVjdGlvbiwgcmVxLT5lcG9jaCk7CiAKLQllcnIgPSBkcmJkX3NlbmRfb3V0X29mX3N5bmMobWRldiwgcmVxKTsKKwllcnIgPSBkcmJkX3NlbmRfb3V0X29mX3N5bmMoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgcmVxKTsKIAlyZXFfbW9kKHJlcSwgT09TX0hBTkRFRF9UT19ORVRXT1JLKTsKIAogCXJldHVybiBlcnI7CkBAIC0xMzQ5LDE1ICsxMzU3LDE0IEBACiAKIC8qKgogICogd19zZW5kX2RibG9jaygpIC0gV29ya2VyIGNhbGxiYWNrIHRvIHNlbmQgYSBQX0RBVEEgcGFja2V0IGluIG9yZGVyIHRvIG1pcnJvciBhIHdyaXRlIHJlcXVlc3QKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KICAqIEB3OgkJd29yayBvYmplY3QuCiAgKiBAY2FuY2VsOglUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBhbnl3YXlzCiAgKi8KIGludCB3X3NlbmRfZGJsb2NrKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJaW50IGVycjsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7CkBAIC0xMzY1LDExICsxMzcyLDExIEBACiAJCXJldHVybiAwOwogCX0KIAotCXJlX2luaXRfaWZfZmlyc3Rfd3JpdGUodGNvbm4sIHJlcS0+ZXBvY2gpOwotCW1heWJlX3NlbmRfYmFycmllcih0Y29ubiwgcmVxLT5lcG9jaCk7Ci0JdGNvbm4tPnNlbmQuY3VycmVudF9lcG9jaF93cml0ZXMrKzsKKwlyZV9pbml0X2lmX2ZpcnN0X3dyaXRlKGNvbm5lY3Rpb24sIHJlcS0+ZXBvY2gpOworCW1heWJlX3NlbmRfYmFycmllcihjb25uZWN0aW9uLCByZXEtPmVwb2NoKTsKKwljb25uZWN0aW9uLT5zZW5kLmN1cnJlbnRfZXBvY2hfd3JpdGVzKys7CiAKLQllcnIgPSBkcmJkX3NlbmRfZGJsb2NrKG1kZXYsIHJlcSk7CisJZXJyID0gZHJiZF9zZW5kX2RibG9jayhmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLCByZXEpOwogCXJlcV9tb2QocmVxLCBlcnIgPyBTRU5EX0ZBSUxFRCA6IEhBTkRFRF9PVkVSX1RPX05FVFdPUkspOwogCiAJcmV0dXJuIGVycjsKQEAgLTEzNzcsMTUgKzEzODQsMTQgQEAKIAogLyoqCiAgKiB3X3NlbmRfcmVhZF9yZXEoKSAtIFdvcmtlciBjYWxsYmFjayB0byBzZW5kIGEgcmVhZCByZXF1ZXN0IChQX0RBVEFfUkVRVUVTVCkgcGFja2V0Ci0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCiAgKiBAdzoJCXdvcmsgb2JqZWN0LgogICogQGNhbmNlbDoJVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYW55d2F5cwogICovCiBpbnQgd19zZW5kX3JlYWRfcmVxKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7CiAJc3RydWN0IGRyYmRfcmVxdWVzdCAqcmVxID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBkcmJkX3JlcXVlc3QsIHcpOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSB3LT5tZGV2OwotCXN0cnVjdCBkcmJkX3Rjb25uICp0Y29ubiA9IG1kZXYtPnRjb25uOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcmVxLT5kZXZpY2U7CisJc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb247CiAJaW50IGVycjsKIAogCWlmICh1bmxpa2VseShjYW5jZWwpKSB7CkBAIC0xMzk1LDkgKzE0MDEsOSBAQAogCiAJLyogRXZlbiByZWFkIHJlcXVlc3RzIG1heSBjbG9zZSBhIHdyaXRlIGVwb2NoLAogCSAqIGlmIHRoZXJlIHdhcyBhbnkgeWV0LiAqLwotCW1heWJlX3NlbmRfYmFycmllcih0Y29ubiwgcmVxLT5lcG9jaCk7CisJbWF5YmVfc2VuZF9iYXJyaWVyKGNvbm5lY3Rpb24sIHJlcS0+ZXBvY2gpOwogCi0JZXJyID0gZHJiZF9zZW5kX2RyZXF1ZXN0KG1kZXYsIFBfREFUQV9SRVFVRVNULCByZXEtPmkuc2VjdG9yLCByZXEtPmkuc2l6ZSwKKwllcnIgPSBkcmJkX3NlbmRfZHJlcXVlc3QoZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKSwgUF9EQVRBX1JFUVVFU1QsIHJlcS0+aS5zZWN0b3IsIHJlcS0+aS5zaXplLAogCQkJCSAodW5zaWduZWQgbG9uZylyZXEpOwogCiAJcmVxX21vZChyZXEsIGVyciA/IFNFTkRfRkFJTEVEIDogSEFOREVEX09WRVJfVE9fTkVUV09SSyk7CkBAIC0xNDA4LDIxICsxNDE0LDIxIEBACiBpbnQgd19yZXN0YXJ0X2Rpc2tfaW8oc3RydWN0IGRyYmRfd29yayAqdywgaW50IGNhbmNlbCkKIHsKIAlzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfcmVxdWVzdCwgdyk7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPSByZXEtPmRldmljZTsKIAogCWlmIChiaW9fZGF0YV9kaXIocmVxLT5tYXN0ZXJfYmlvKSA9PSBXUklURSAmJiByZXEtPnJxX3N0YXRlICYgUlFfSU5fQUNUX0xPRykKLQkJZHJiZF9hbF9iZWdpbl9pbyhtZGV2LCAmcmVxLT5pLCBmYWxzZSk7CisJCWRyYmRfYWxfYmVnaW5faW8oZGV2aWNlLCAmcmVxLT5pLCBmYWxzZSk7CiAKIAlkcmJkX3JlcV9tYWtlX3ByaXZhdGVfYmlvKHJlcSwgcmVxLT5tYXN0ZXJfYmlvKTsKLQlyZXEtPnByaXZhdGVfYmlvLT5iaV9iZGV2ID0gbWRldi0+bGRldi0+YmFja2luZ19iZGV2OworCXJlcS0+cHJpdmF0ZV9iaW8tPmJpX2JkZXYgPSBkZXZpY2UtPmxkZXYtPmJhY2tpbmdfYmRldjsKIAlnZW5lcmljX21ha2VfcmVxdWVzdChyZXEtPnByaXZhdGVfYmlvKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9kcmJkX21heV9zeW5jX25vdyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQorc3RhdGljIGludCBfZHJiZF9tYXlfc3luY19ub3coc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqb2RldiA9IG1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpvZGV2ID0gZGV2aWNlOwogCWludCByZXN5bmNfYWZ0ZXI7CiAKIAl3aGlsZSAoMSkgewpAQCAtMTQzMyw3ICsxNDM5LDcgQEAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCWlmIChyZXN5bmNfYWZ0ZXIgPT0gLTEpCiAJCQlyZXR1cm4gMTsKLQkJb2RldiA9IG1pbm9yX3RvX21kZXYocmVzeW5jX2FmdGVyKTsKKwkJb2RldiA9IG1pbm9yX3RvX2RldmljZShyZXN5bmNfYWZ0ZXIpOwogCQlpZiAoIW9kZXYpCiAJCQlyZXR1cm4gMTsKIAkJaWYgKChvZGV2LT5zdGF0ZS5jb25uID49IENfU1lOQ19TT1VSQ0UgJiYKQEAgLTE0NDYsMTcgKzE0NTIsMTcgQEAKIAogLyoqCiAgKiBfZHJiZF9wYXVzZV9hZnRlcigpIC0gUGF1c2UgcmVzeW5jIG9uIGFsbCBkZXZpY2VzIHRoYXQgbWF5IG5vdCByZXN5bmMgbm93Ci0gKiBAbWRldjoJRFJCRCBkZXZpY2UuCisgKiBAZGV2aWNlOglEUkJEIGRldmljZS4KICAqCiAgKiBDYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgb25seSAoYWRtaW4gY29tbWFuZCBhbmQgYWZ0ZXJfc3RhdGVfY2gpLgogICovCi1zdGF0aWMgaW50IF9kcmJkX3BhdXNlX2FmdGVyKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IF9kcmJkX3BhdXNlX2FmdGVyKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm9kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpvZGV2OwogCWludCBpLCBydiA9IDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZtaW5vcnMsIG9kZXYsIGkpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgb2RldiwgaSkgewogCQlpZiAob2Rldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYgb2Rldi0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTKQogCQkJY29udGludWU7CiAJCWlmICghX2RyYmRfbWF5X3N5bmNfbm93KG9kZXYpKQpAQCAtMTQ3MCwxNyArMTQ3NiwxNyBAQAogCiAvKioKICAqIF9kcmJkX3Jlc3VtZV9uZXh0KCkgLSBSZXN1bWUgcmVzeW5jIG9uIGFsbCBkZXZpY2VzIHRoYXQgbWF5IHJlc3luYyBub3cKLSAqIEBtZGV2OglEUkJEIGRldmljZS4KKyAqIEBkZXZpY2U6CURSQkQgZGV2aWNlLgogICoKICAqIENhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCBvbmx5IChhZG1pbiBjb21tYW5kIGFuZCB3b3JrZXIpLgogICovCi1zdGF0aWMgaW50IF9kcmJkX3Jlc3VtZV9uZXh0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYpCitzdGF0aWMgaW50IF9kcmJkX3Jlc3VtZV9uZXh0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm9kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpvZGV2OwogCWludCBpLCBydiA9IDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRyX2Zvcl9lYWNoX2VudHJ5KCZtaW5vcnMsIG9kZXYsIGkpIHsKKwlpZHJfZm9yX2VhY2hfZW50cnkoJmRyYmRfZGV2aWNlcywgb2RldiwgaSkgewogCQlpZiAob2Rldi0+c3RhdGUuY29ubiA9PSBDX1NUQU5EQUxPTkUgJiYgb2Rldi0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTKQogCQkJY29udGludWU7CiAJCWlmIChvZGV2LT5zdGF0ZS5hZnRyX2lzcCkgewpAQCAtMTQ5NCwyNCArMTUwMCwyNCBAQAogCXJldHVybiBydjsKIH0KIAotdm9pZCByZXN1bWVfbmV4dF9zZyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCByZXN1bWVfbmV4dF9zZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAl3cml0ZV9sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwotCV9kcmJkX3Jlc3VtZV9uZXh0KG1kZXYpOworCV9kcmJkX3Jlc3VtZV9uZXh0KGRldmljZSk7CiAJd3JpdGVfdW5sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwogfQogCi12b2lkIHN1c3BlbmRfb3RoZXJfc2coc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgc3VzcGVuZF9vdGhlcl9zZyhzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSkKIHsKIAl3cml0ZV9sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwotCV9kcmJkX3BhdXNlX2FmdGVyKG1kZXYpOworCV9kcmJkX3BhdXNlX2FmdGVyKGRldmljZSk7CiAJd3JpdGVfdW5sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwogfQogCiAvKiBjYWxsZXIgbXVzdCBob2xkIGdsb2JhbF9zdGF0ZV9sb2NrICovCi1lbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9yZXN5bmNfYWZ0ZXJfdmFsaWQoc3RydWN0IGRyYmRfY29uZiAqbWRldiwgaW50IG9fbWlub3IpCitlbnVtIGRyYmRfcmV0X2NvZGUgZHJiZF9yZXN5bmNfYWZ0ZXJfdmFsaWQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGludCBvX21pbm9yKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm9kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpvZGV2OwogCWludCByZXN5bmNfYWZ0ZXI7CiAKIAlpZiAob19taW5vciA9PSAtMSkKQEAgLTE1MjAsOSArMTUyNiw5IEBACiAJCXJldHVybiBFUlJfUkVTWU5DX0FGVEVSOwogCiAJLyogY2hlY2sgZm9yIGxvb3BzICovCi0Jb2RldiA9IG1pbm9yX3RvX21kZXYob19taW5vcik7CisJb2RldiA9IG1pbm9yX3RvX2RldmljZShvX21pbm9yKTsKIAl3aGlsZSAoMSkgewotCQlpZiAob2RldiA9PSBtZGV2KQorCQlpZiAob2RldiA9PSBkZXZpY2UpCiAJCQlyZXR1cm4gRVJSX1JFU1lOQ19BRlRFUl9DWUNMRTsKIAogCQkvKiBZb3UgYXJlIGZyZWUgdG8gZGVwZW5kIG9uIGRpc2tsZXNzLCBub24tZXhpc3RpbmcsCkBAIC0xNTQyLDM1ICsxNTQ4LDM1IEBACiAJCQlyZXR1cm4gTk9fRVJST1I7CiAKIAkJLyogZm9sbG93IHRoZSBkZXBlbmRlbmN5IGNoYWluICovCi0JCW9kZXYgPSBtaW5vcl90b19tZGV2KHJlc3luY19hZnRlcik7CisJCW9kZXYgPSBtaW5vcl90b19kZXZpY2UocmVzeW5jX2FmdGVyKTsKIAl9CiB9CiAKIC8qIGNhbGxlciBtdXN0IGhvbGQgZ2xvYmFsX3N0YXRlX2xvY2sgKi8KLXZvaWQgZHJiZF9yZXN5bmNfYWZ0ZXJfY2hhbmdlZChzdHJ1Y3QgZHJiZF9jb25mICptZGV2KQordm9pZCBkcmJkX3Jlc3luY19hZnRlcl9jaGFuZ2VkKHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCWludCBjaGFuZ2VzOwogCiAJZG8gewotCQljaGFuZ2VzICA9IF9kcmJkX3BhdXNlX2FmdGVyKG1kZXYpOwotCQljaGFuZ2VzIHw9IF9kcmJkX3Jlc3VtZV9uZXh0KG1kZXYpOworCQljaGFuZ2VzICA9IF9kcmJkX3BhdXNlX2FmdGVyKGRldmljZSk7CisJCWNoYW5nZXMgfD0gX2RyYmRfcmVzdW1lX25leHQoZGV2aWNlKTsKIAl9IHdoaWxlIChjaGFuZ2VzKTsKIH0KIAotdm9pZCBkcmJkX3JzX2NvbnRyb2xsZXJfcmVzZXQoc3RydWN0IGRyYmRfY29uZiAqbWRldikKK3ZvaWQgZHJiZF9yc19jb250cm9sbGVyX3Jlc2V0KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBmaWZvX2J1ZmZlciAqcGxhbjsKIAotCWF0b21pY19zZXQoJm1kZXYtPnJzX3NlY3RfaW4sIDApOwotCWF0b21pY19zZXQoJm1kZXYtPnJzX3NlY3RfZXYsIDApOwotCW1kZXYtPnJzX2luX2ZsaWdodCA9IDA7CisJYXRvbWljX3NldCgmZGV2aWNlLT5yc19zZWN0X2luLCAwKTsKKwlhdG9taWNfc2V0KCZkZXZpY2UtPnJzX3NlY3RfZXYsIDApOworCWRldmljZS0+cnNfaW5fZmxpZ2h0ID0gMDsKIAogCS8qIFVwZGF0aW5nIHRoZSBSQ1UgcHJvdGVjdGVkIG9iamVjdCBpbiBwbGFjZSBpcyBuZWNlc3Nhcnkgc2luY2UKIAkgICB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGZyb20gYXRvbWljIGNvbnRleHQuCiAJICAgSXQgaXMgdmFsaWQgc2luY2UgYWxsIG90aGVyIHVwZGF0ZXMgYWxzbyBsZWFkIHRvIGFuIGNvbXBsZXRlbHkKIAkgICBlbXB0eSBmaWZvICovCiAJcmN1X3JlYWRfbG9jaygpOwotCXBsYW4gPSByY3VfZGVyZWZlcmVuY2UobWRldi0+cnNfcGxhbl9zKTsKKwlwbGFuID0gcmN1X2RlcmVmZXJlbmNlKGRldmljZS0+cnNfcGxhbl9zKTsKIAlwbGFuLT50b3RhbCA9IDA7CiAJZmlmb19zZXQocGxhbiwgMCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNTc4LDEwMSArMTU4NCwxMDQgQEAKIAogdm9pZCBzdGFydF9yZXN5bmNfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBkYXRhOworCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBkcmJkX2RldmljZSAqKSBkYXRhOwogCi0JZHJiZF9xdWV1ZV93b3JrKCZtZGV2LT50Y29ubi0+c2VuZGVyX3dvcmssICZtZGV2LT5zdGFydF9yZXN5bmNfd29yayk7CisJZHJiZF9xdWV1ZV93b3JrKCZmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5zZW5kZXJfd29yaywKKwkJCSZkZXZpY2UtPnN0YXJ0X3Jlc3luY193b3JrKTsKIH0KIAogaW50IHdfc3RhcnRfcmVzeW5jKHN0cnVjdCBkcmJkX3dvcmsgKncsIGludCBjYW5jZWwpCiB7Ci0Jc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IHctPm1kZXY7CisJc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UgPQorCQljb250YWluZXJfb2Yodywgc3RydWN0IGRyYmRfZGV2aWNlLCBzdGFydF9yZXN5bmNfd29yayk7CiAKLQlpZiAoYXRvbWljX3JlYWQoJm1kZXYtPnVuYWNrZWRfY250KSB8fCBhdG9taWNfcmVhZCgmbWRldi0+cnNfcGVuZGluZ19jbnQpKSB7Ci0JCWRldl93YXJuKERFViwgIndfc3RhcnRfcmVzeW5jIGxhdGVyLi4uXG4iKTsKLQkJbWRldi0+c3RhcnRfcmVzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovMTA7Ci0JCWFkZF90aW1lcigmbWRldi0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKKwlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+dW5hY2tlZF9jbnQpIHx8IGF0b21pY19yZWFkKCZkZXZpY2UtPnJzX3BlbmRpbmdfY250KSkgeworCQlkcmJkX3dhcm4oZGV2aWNlLCAid19zdGFydF9yZXN5bmMgbGF0ZXIuLi5cbiIpOworCQlkZXZpY2UtPnN0YXJ0X3Jlc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaLzEwOworCQlhZGRfdGltZXIoJmRldmljZS0+c3RhcnRfcmVzeW5jX3RpbWVyKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZHJiZF9zdGFydF9yZXN5bmMobWRldiwgQ19TWU5DX1NPVVJDRSk7Ci0JY2xlYXJfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmbWRldi0+ZmxhZ3MpOworCWRyYmRfc3RhcnRfcmVzeW5jKGRldmljZSwgQ19TWU5DX1NPVVJDRSk7CisJY2xlYXJfYml0KEFIRUFEX1RPX1NZTkNfU09VUkNFLCAmZGV2aWNlLT5mbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogZHJiZF9zdGFydF9yZXN5bmMoKSAtIFN0YXJ0IHRoZSByZXN5bmMgcHJvY2VzcwotICogQG1kZXY6CURSQkQgZGV2aWNlLgorICogQGRldmljZToJRFJCRCBkZXZpY2UuCiAgKiBAc2lkZToJRWl0aGVyIENfU1lOQ19TT1VSQ0Ugb3IgQ19TWU5DX1RBUkdFVAogICoKICAqIFRoaXMgZnVuY3Rpb24gbWlnaHQgYnJpbmcgeW91IGRpcmVjdGx5IGludG8gb25lIG9mIHRoZQogICogQ19QQVVTRURfU1lOQ18qIHN0YXRlcy4KICAqLwotdm9pZCBkcmJkX3N0YXJ0X3Jlc3luYyhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBlbnVtIGRyYmRfY29ubnMgc2lkZSkKK3ZvaWQgZHJiZF9zdGFydF9yZXN5bmMoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIGVudW0gZHJiZF9jb25ucyBzaWRlKQogewogCXVuaW9uIGRyYmRfc3RhdGUgbnM7CiAJaW50IHI7CiAKLQlpZiAobWRldi0+c3RhdGUuY29ubiA+PSBDX1NZTkNfU09VUkNFICYmIG1kZXYtPnN0YXRlLmNvbm4gPCBDX0FIRUFEKSB7Ci0JCWRldl9lcnIoREVWLCAiUmVzeW5jIGFscmVhZHkgcnVubmluZyFcbiIpOworCWlmIChkZXZpY2UtPnN0YXRlLmNvbm4gPj0gQ19TWU5DX1NPVVJDRSAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPCBDX0FIRUFEKSB7CisJCWRyYmRfZXJyKGRldmljZSwgIlJlc3luYyBhbHJlYWR5IHJ1bm5pbmchXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICghdGVzdF9iaXQoQl9SU19IX0RPTkUsICZtZGV2LT5mbGFncykpIHsKKwlpZiAoIXRlc3RfYml0KEJfUlNfSF9ET05FLCAmZGV2aWNlLT5mbGFncykpIHsKIAkJaWYgKHNpZGUgPT0gQ19TWU5DX1RBUkdFVCkgewogCQkJLyogU2luY2UgYXBwbGljYXRpb24gSU8gd2FzIGxvY2tlZCBvdXQgZHVyaW5nIENfV0ZfQklUTUFQX1QgYW5kCiAJCQkgICBDX1dGX1NZTkNfVVVJRCB3ZSBhcmUgc3RpbGwgdW5tb2RpZmllZC4gQmVmb3JlIGdvaW5nIHRvIENfU1lOQ19UQVJHRVQKIAkJCSAgIHdlIGNoZWNrIHRoYXQgd2UgbWlnaHQgbWFrZSB0aGUgZGF0YSBpbmNvbnNpc3RlbnQuICovCi0JCQlyID0gZHJiZF9raGVscGVyKG1kZXYsICJiZWZvcmUtcmVzeW5jLXRhcmdldCIpOworCQkJciA9IGRyYmRfa2hlbHBlcihkZXZpY2UsICJiZWZvcmUtcmVzeW5jLXRhcmdldCIpOwogCQkJciA9IChyID4+IDgpICYgMHhmZjsKIAkJCWlmIChyID4gMCkgewotCQkJCWRldl9pbmZvKERFViwgImJlZm9yZS1yZXN5bmMtdGFyZ2V0IGhhbmRsZXIgcmV0dXJuZWQgJWQsICIKKwkJCQlkcmJkX2luZm8oZGV2aWNlLCAiYmVmb3JlLXJlc3luYy10YXJnZXQgaGFuZGxlciByZXR1cm5lZCAlZCwgIgogCQkJCQkgImRyb3BwaW5nIGNvbm5lY3Rpb24uXG4iLCByKTsKLQkJCQljb25uX3JlcXVlc3Rfc3RhdGUobWRldi0+dGNvbm4sIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOworCQkJCWNvbm5fcmVxdWVzdF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLCBOUyhjb25uLCBDX0RJU0NPTk5FQ1RJTkcpLCBDU19IQVJEKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0gZWxzZSAvKiBDX1NZTkNfU09VUkNFICovIHsKLQkJCXIgPSBkcmJkX2toZWxwZXIobWRldiwgImJlZm9yZS1yZXN5bmMtc291cmNlIik7CisJCQlyID0gZHJiZF9raGVscGVyKGRldmljZSwgImJlZm9yZS1yZXN5bmMtc291cmNlIik7CiAJCQlyID0gKHIgPj4gOCkgJiAweGZmOwogCQkJaWYgKHIgPiAwKSB7CiAJCQkJaWYgKHIgPT0gMykgewotCQkJCQlkZXZfaW5mbyhERVYsICJiZWZvcmUtcmVzeW5jLXNvdXJjZSBoYW5kbGVyIHJldHVybmVkICVkLCAiCisJCQkJCWRyYmRfaW5mbyhkZXZpY2UsICJiZWZvcmUtcmVzeW5jLXNvdXJjZSBoYW5kbGVyIHJldHVybmVkICVkLCAiCiAJCQkJCQkgImlnbm9yaW5nLiBPbGQgdXNlcmxhbmQgdG9vbHM/Iiwgcik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJZGV2X2luZm8oREVWLCAiYmVmb3JlLXJlc3luYy1zb3VyY2UgaGFuZGxlciByZXR1cm5lZCAlZCwgIgorCQkJCQlkcmJkX2luZm8oZGV2aWNlLCAiYmVmb3JlLXJlc3luYy1zb3VyY2UgaGFuZGxlciByZXR1cm5lZCAlZCwgIgogCQkJCQkJICJkcm9wcGluZyBjb25uZWN0aW9uLlxuIiwgcik7Ci0JCQkJCWNvbm5fcmVxdWVzdF9zdGF0ZShtZGV2LT50Y29ubiwgTlMoY29ubiwgQ19ESVNDT05ORUNUSU5HKSwgQ1NfSEFSRCk7CisJCQkJCWNvbm5fcmVxdWVzdF9zdGF0ZShmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLAorCQkJCQkJCSAgIE5TKGNvbm4sIENfRElTQ09OTkVDVElORyksIENTX0hBUkQpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfQogCQl9CiAJfQogCi0JaWYgKGN1cnJlbnQgPT0gbWRldi0+dGNvbm4tPndvcmtlci50YXNrKSB7CisJaWYgKGN1cnJlbnQgPT0gZmlyc3RfcGVlcl9kZXZpY2UoZGV2aWNlKS0+Y29ubmVjdGlvbi0+d29ya2VyLnRhc2spIHsKIAkJLyogVGhlIHdvcmtlciBzaG91bGQgbm90IHNsZWVwIHdhaXRpbmcgZm9yIHN0YXRlX211dGV4LAogCQkgICB0aGF0IGNhbiB0YWtlIGxvbmcgKi8KLQkJaWYgKCFtdXRleF90cnlsb2NrKG1kZXYtPnN0YXRlX211dGV4KSkgewotCQkJc2V0X2JpdChCX1JTX0hfRE9ORSwgJm1kZXYtPmZsYWdzKTsKLQkJCW1kZXYtPnN0YXJ0X3Jlc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaLzU7Ci0JCQlhZGRfdGltZXIoJm1kZXYtPnN0YXJ0X3Jlc3luY190aW1lcik7CisJCWlmICghbXV0ZXhfdHJ5bG9jayhkZXZpY2UtPnN0YXRlX211dGV4KSkgeworCQkJc2V0X2JpdChCX1JTX0hfRE9ORSwgJmRldmljZS0+ZmxhZ3MpOworCQkJZGV2aWNlLT5zdGFydF9yZXN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi81OworCQkJYWRkX3RpbWVyKCZkZXZpY2UtPnN0YXJ0X3Jlc3luY190aW1lcik7CiAJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewotCQltdXRleF9sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwkJbXV0ZXhfbG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKIAl9Ci0JY2xlYXJfYml0KEJfUlNfSF9ET05FLCAmbWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChCX1JTX0hfRE9ORSwgJmRldmljZS0+ZmxhZ3MpOwogCiAJd3JpdGVfbG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKIAkvKiBEaWQgc29tZSBjb25uZWN0aW9uIGJyZWFrYWdlIG9yIElPIGVycm9yIHJhY2Ugd2l0aCB1cz8gKi8KLQlpZiAobWRldi0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVECi0JfHwgIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfTkVHT1RJQVRJTkcpKSB7CisJaWYgKGRldmljZS0+c3RhdGUuY29ubiA8IENfQ09OTkVDVEVECisJfHwgIWdldF9sZGV2X2lmX3N0YXRlKGRldmljZSwgRF9ORUdPVElBVElORykpIHsKIAkJd3JpdGVfdW5sb2NrX2lycSgmZ2xvYmFsX3N0YXRlX2xvY2spOwotCQltdXRleF91bmxvY2sobWRldi0+c3RhdGVfbXV0ZXgpOworCQltdXRleF91bmxvY2soZGV2aWNlLT5zdGF0ZV9tdXRleCk7CiAJCXJldHVybjsKIAl9CiAKLQlucyA9IGRyYmRfcmVhZF9zdGF0ZShtZGV2KTsKKwlucyA9IGRyYmRfcmVhZF9zdGF0ZShkZXZpY2UpOwogCi0JbnMuYWZ0cl9pc3AgPSAhX2RyYmRfbWF5X3N5bmNfbm93KG1kZXYpOworCW5zLmFmdHJfaXNwID0gIV9kcmJkX21heV9zeW5jX25vdyhkZXZpY2UpOwogCiAJbnMuY29ubiA9IHNpZGU7CiAKQEAgLTE2ODEsNDMgKzE2OTAsNDMgQEAKIAllbHNlIC8qIHNpZGUgPT0gQ19TWU5DX1NPVVJDRSAqLwogCQlucy5wZHNrID0gRF9JTkNPTlNJU1RFTlQ7CiAKLQlyID0gX19kcmJkX3NldF9zdGF0ZShtZGV2LCBucywgQ1NfVkVSQk9TRSwgTlVMTCk7Ci0JbnMgPSBkcmJkX3JlYWRfc3RhdGUobWRldik7CisJciA9IF9fZHJiZF9zZXRfc3RhdGUoZGV2aWNlLCBucywgQ1NfVkVSQk9TRSwgTlVMTCk7CisJbnMgPSBkcmJkX3JlYWRfc3RhdGUoZGV2aWNlKTsKIAogCWlmIChucy5jb25uIDwgQ19DT05ORUNURUQpCiAJCXIgPSBTU19VTktOT1dOX0VSUk9SOwogCiAJaWYgKHIgPT0gU1NfU1VDQ0VTUykgewotCQl1bnNpZ25lZCBsb25nIHR3ID0gZHJiZF9ibV90b3RhbF93ZWlnaHQobWRldik7CisJCXVuc2lnbmVkIGxvbmcgdHcgPSBkcmJkX2JtX3RvdGFsX3dlaWdodChkZXZpY2UpOwogCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJCWludCBpOwogCi0JCW1kZXYtPnJzX2ZhaWxlZCAgICA9IDA7Ci0JCW1kZXYtPnJzX3BhdXNlZCAgICA9IDA7Ci0JCW1kZXYtPnJzX3NhbWVfY3N1bSA9IDA7Ci0JCW1kZXYtPnJzX2xhc3RfZXZlbnRzID0gMDsKLQkJbWRldi0+cnNfbGFzdF9zZWN0X2V2ID0gMDsKLQkJbWRldi0+cnNfdG90YWwgICAgID0gdHc7Ci0JCW1kZXYtPnJzX3N0YXJ0ICAgICA9IG5vdzsKKwkJZGV2aWNlLT5yc19mYWlsZWQgICAgPSAwOworCQlkZXZpY2UtPnJzX3BhdXNlZCAgICA9IDA7CisJCWRldmljZS0+cnNfc2FtZV9jc3VtID0gMDsKKwkJZGV2aWNlLT5yc19sYXN0X2V2ZW50cyA9IDA7CisJCWRldmljZS0+cnNfbGFzdF9zZWN0X2V2ID0gMDsKKwkJZGV2aWNlLT5yc190b3RhbCAgICAgPSB0dzsKKwkJZGV2aWNlLT5yc19zdGFydCAgICAgPSBub3c7CiAJCWZvciAoaSA9IDA7IGkgPCBEUkJEX1NZTkNfTUFSS1M7IGkrKykgewotCQkJbWRldi0+cnNfbWFya19sZWZ0W2ldID0gdHc7Ci0JCQltZGV2LT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CisJCQlkZXZpY2UtPnJzX21hcmtfbGVmdFtpXSA9IHR3OworCQkJZGV2aWNlLT5yc19tYXJrX3RpbWVbaV0gPSBub3c7CiAJCX0KLQkJX2RyYmRfcGF1c2VfYWZ0ZXIobWRldik7CisJCV9kcmJkX3BhdXNlX2FmdGVyKGRldmljZSk7CiAJfQogCXdyaXRlX3VubG9ja19pcnEoJmdsb2JhbF9zdGF0ZV9sb2NrKTsKIAogCWlmIChyID09IFNTX1NVQ0NFU1MpIHsKIAkJLyogcmVzZXQgcnNfbGFzdF9iY2FzdCB3aGVuIGEgcmVzeW5jIG9yIHZlcmlmeSBpcyBzdGFydGVkLAogCQkgKiB0byBkZWFsIHdpdGggcG90ZW50aWFsIGppZmZpZXMgd3JhcC4gKi8KLQkJbWRldi0+cnNfbGFzdF9iY2FzdCA9IGppZmZpZXMgLSBIWjsKKwkJZGV2aWNlLT5yc19sYXN0X2JjYXN0ID0gamlmZmllcyAtIEhaOwogCi0JCWRldl9pbmZvKERFViwgIkJlZ2FuIHJlc3luYyBhcyAlcyAod2lsbCBzeW5jICVsdSBLQiBbJWx1IGJpdHMgc2V0XSkuXG4iLAorCQlkcmJkX2luZm8oZGV2aWNlLCAiQmVnYW4gcmVzeW5jIGFzICVzICh3aWxsIHN5bmMgJWx1IEtCIFslbHUgYml0cyBzZXRdKS5cbiIsCiAJCSAgICAgZHJiZF9jb25uX3N0cihucy5jb25uKSwKLQkJICAgICAodW5zaWduZWQgbG9uZykgbWRldi0+cnNfdG90YWwgPDwgKEJNX0JMT0NLX1NISUZULTEwKSwKLQkJICAgICAodW5zaWduZWQgbG9uZykgbWRldi0+cnNfdG90YWwpOworCQkgICAgICh1bnNpZ25lZCBsb25nKSBkZXZpY2UtPnJzX3RvdGFsIDw8IChCTV9CTE9DS19TSElGVC0xMCksCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGRldmljZS0+cnNfdG90YWwpOwogCQlpZiAoc2lkZSA9PSBDX1NZTkNfVEFSR0VUKQotCQkJbWRldi0+Ym1fcmVzeW5jX2ZvID0gMDsKKwkJCWRldmljZS0+Ym1fcmVzeW5jX2ZvID0gMDsKIAogCQkvKiBTaW5jZSBwcm90b2NvbCA5Niwgd2UgbXVzdCBzZXJpYWxpemUgZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkCiAJCSAqIHdpdGggd19zZW5kX29vcywgb3IgdGhlIHN5bmMgdGFyZ2V0IHdpbGwgZ2V0IGNvbmZ1c2VkIGFzIHRvCkBAIC0xNzI2LDEwICsxNzM1LDEyIEBACiAJCSAqIGRyYmRfcmVzeW5jX2ZpbmlzaGVkIGZyb20gaGVyZSBpbiB0aGF0IGNhc2UuCiAJCSAqIFdlIGRyYmRfZ2VuX2FuZF9zZW5kX3N5bmNfdXVpZCBoZXJlIGZvciBwcm90b2NvbCA8IDk2LAogCQkgKiBhbmQgZnJvbSBhZnRlcl9zdGF0ZV9jaCBvdGhlcndpc2UuICovCi0JCWlmIChzaWRlID09IENfU1lOQ19TT1VSQ0UgJiYgbWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk2KQotCQkJZHJiZF9nZW5fYW5kX3NlbmRfc3luY191dWlkKG1kZXYpOworCQlpZiAoc2lkZSA9PSBDX1NZTkNfU09VUkNFICYmCisJCSAgICBmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpLT5jb25uZWN0aW9uLT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NikKKwkJCWRyYmRfZ2VuX2FuZF9zZW5kX3N5bmNfdXVpZChmaXJzdF9wZWVyX2RldmljZShkZXZpY2UpKTsKIAotCQlpZiAobWRldi0+dGNvbm4tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk1ICYmIG1kZXYtPnJzX3RvdGFsID09IDApIHsKKwkJaWYgKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPmFncmVlZF9wcm9fdmVyc2lvbiA8IDk1ICYmCisJCSAgICBkZXZpY2UtPnJzX3RvdGFsID09IDApIHsKIAkJCS8qIFRoaXMgc3RpbGwgaGFzIGEgcmFjZSAoYWJvdXQgd2hlbiBleGFjdGx5IHRoZSBwZWVycwogCQkJICogZGV0ZWN0IGNvbm5lY3Rpb24gbG9zcykgdGhhdCBjYW4gbGVhZCB0byBhIGZ1bGwgc3luYwogCQkJICogb24gbmV4dCBoYW5kc2hha2UuIEluIDguMy45IHdlIGZpeGVkIHRoaXMgd2l0aCBleHBsaWNpdApAQCAtMTc0NSwzMyArMTc1NiwzMyBAQAogCQkJCWludCB0aW1lbzsKIAogCQkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCQluYyA9IHJjdV9kZXJlZmVyZW5jZShtZGV2LT50Y29ubi0+bmV0X2NvbmYpOworCQkJCW5jID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0X3BlZXJfZGV2aWNlKGRldmljZSktPmNvbm5lY3Rpb24tPm5ldF9jb25mKTsKIAkJCQl0aW1lbyA9IG5jLT5waW5nX2ludCAqIEhaICsgbmMtPnBpbmdfdGltZW8gKiBIWiAvIDk7CiAJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVvKTsKIAkJCX0KLQkJCWRyYmRfcmVzeW5jX2ZpbmlzaGVkKG1kZXYpOworCQkJZHJiZF9yZXN5bmNfZmluaXNoZWQoZGV2aWNlKTsKIAkJfQogCi0JCWRyYmRfcnNfY29udHJvbGxlcl9yZXNldChtZGV2KTsKLQkJLyogbnMuY29ubiBtYXkgYWxyZWFkeSBiZSAhPSBtZGV2LT5zdGF0ZS5jb25uLAorCQlkcmJkX3JzX2NvbnRyb2xsZXJfcmVzZXQoZGV2aWNlKTsKKwkJLyogbnMuY29ubiBtYXkgYWxyZWFkeSBiZSAhPSBkZXZpY2UtPnN0YXRlLmNvbm4sCiAJCSAqIHdlIG1heSBoYXZlIGJlZW4gcGF1c2VkIGluIGJldHdlZW4sIG9yIGJlY29tZSBwYXVzZWQgdW50aWwKIAkJICogdGhlIHRpbWVyIHRyaWdnZXJzLgogCQkgKiBObyBtYXR0ZXIsIHRoYXQgaXMgaGFuZGxlZCBpbiByZXN5bmNfdGltZXJfZm4oKSAqLwogCQlpZiAobnMuY29ubiA9PSBDX1NZTkNfVEFSR0VUKQotCQkJbW9kX3RpbWVyKCZtZGV2LT5yZXN5bmNfdGltZXIsIGppZmZpZXMpOworCQkJbW9kX3RpbWVyKCZkZXZpY2UtPnJlc3luY190aW1lciwgamlmZmllcyk7CiAKLQkJZHJiZF9tZF9zeW5jKG1kZXYpOworCQlkcmJkX21kX3N5bmMoZGV2aWNlKTsKIAl9Ci0JcHV0X2xkZXYobWRldik7Ci0JbXV0ZXhfdW5sb2NrKG1kZXYtPnN0YXRlX211dGV4KTsKKwlwdXRfbGRldihkZXZpY2UpOworCW11dGV4X3VubG9jayhkZXZpY2UtPnN0YXRlX211dGV4KTsKIH0KIAogLyogSWYgdGhlIHJlc291cmNlIGFscmVhZHkgY2xvc2VkIHRoZSBjdXJyZW50IGVwb2NoLCBidXQgd2UgZGlkIG5vdAogICogKGJlY2F1c2Ugd2UgaGF2ZSBub3QgeWV0IHNlZW4gbmV3IHJlcXVlc3RzKSwgd2Ugc2hvdWxkIHNlbmQgdGhlCiAgKiBjb3JyZXNwb25kaW5nIGJhcnJpZXIgbm93LiAgTXVzdCBiZSBjaGVja2VkIHdpdGhpbiB0aGUgc2FtZSBzcGlubG9jawogICogdGhhdCBpcyB1c2VkIHRvIGNoZWNrIGZvciBuZXcgcmVxdWVzdHMuICovCi1ib29sIG5lZWRfdG9fc2VuZF9iYXJyaWVyKHN0cnVjdCBkcmJkX3Rjb25uICpjb25uZWN0aW9uKQorc3RhdGljIGJvb2wgbmVlZF90b19zZW5kX2JhcnJpZXIoc3RydWN0IGRyYmRfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKIHsKIAlpZiAoIWNvbm5lY3Rpb24tPnNlbmQuc2Vlbl9hbnlfd3JpdGVfeWV0KQogCQlyZXR1cm4gZmFsc2U7CkBAIC0xNzk1LDcgKzE4MDYsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi1ib29sIGRlcXVldWVfd29ya19iYXRjaChzdHJ1Y3QgZHJiZF93b3JrX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQorc3RhdGljIGJvb2wgZGVxdWV1ZV93b3JrX2JhdGNoKHN0cnVjdCBkcmJkX3dvcmtfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX2xpc3QpCiB7CiAJc3Bpbl9sb2NrX2lycSgmcXVldWUtPnFfbG9jayk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmcXVldWUtPnEsIHdvcmtfbGlzdCk7CkBAIC0xODAzLDcgKzE4MTQsNyBAQAogCXJldHVybiAhbGlzdF9lbXB0eSh3b3JrX2xpc3QpOwogfQogCi1ib29sIGRlcXVldWVfd29ya19pdGVtKHN0cnVjdCBkcmJkX3dvcmtfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX2xpc3QpCitzdGF0aWMgYm9vbCBkZXF1ZXVlX3dvcmtfaXRlbShzdHJ1Y3QgZHJiZF93b3JrX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KQogewogCXNwaW5fbG9ja19pcnEoJnF1ZXVlLT5xX2xvY2spOwogCWlmICghbGlzdF9lbXB0eSgmcXVldWUtPnEpKQpAQCAtMTgxMiw3ICsxODIzLDcgQEAKIAlyZXR1cm4gIWxpc3RfZW1wdHkod29ya19saXN0KTsKIH0KIAotdm9pZCB3YWl0X2Zvcl93b3JrKHN0cnVjdCBkcmJkX3Rjb25uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX2xpc3QpCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl93b3JrKHN0cnVjdCBkcmJkX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlzdHJ1Y3QgbmV0X2NvbmYgKm5jOwpAQCAtMTg0Miw3ICsxODUzLDcgQEAKIAlmb3IgKDs7KSB7CiAJCWludCBzZW5kX2JhcnJpZXI7CiAJCXByZXBhcmVfdG9fd2FpdCgmY29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucV93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVxX2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQlzcGluX2xvY2soJmNvbm5lY3Rpb24tPnNlbmRlcl93b3JrLnFfbG9jayk7CS8qIEZJWE1FIGdldCByaWQgb2YgdGhpcyBvbmU/ICovCiAJCS8qIGRlcXVldWUgc2luZ2xlIGl0ZW0gb25seSwKIAkJICogd2Ugc3RpbGwgdXNlIGRyYmRfcXVldWVfd29ya19mcm9udCgpIGluIHNvbWUgcGxhY2VzICovCkBAIC0xODUwLDExICsxODYxLDExIEBACiAJCQlsaXN0X21vdmUoY29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucS5uZXh0LCB3b3JrX2xpc3QpOwogCQlzcGluX3VubG9jaygmY29ubmVjdGlvbi0+c2VuZGVyX3dvcmsucV9sb2NrKTsJLyogRklYTUUgZ2V0IHJpZCBvZiB0aGlzIG9uZT8gKi8KIAkJaWYgKCFsaXN0X2VtcHR5KHdvcmtfbGlzdCkgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVxX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5yZXNvdXJjZS0+cmVxX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KIAkJc2VuZF9iYXJyaWVyID0gbmVlZF90b19zZW5kX2JhcnJpZXIoY29ubmVjdGlvbik7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+cmVxX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPnJlc291cmNlLT5yZXFfbG9jayk7CiAJCWlmIChzZW5kX2JhcnJpZXIpIHsKIAkJCWRyYmRfc2VuZF9iYXJyaWVyKGNvbm5lY3Rpb24pOwogCQkJY29ubmVjdGlvbi0+c2VuZC5jdXJyZW50X2Vwb2NoX25yKys7CkBAIC0xODgzLDkgKzE4OTQsOSBAQAogCiBpbnQgZHJiZF93b3JrZXIoc3RydWN0IGRyYmRfdGhyZWFkICp0aGkpCiB7Ci0Jc3RydWN0IGRyYmRfdGNvbm4gKnRjb25uID0gdGhpLT50Y29ubjsKKwlzdHJ1Y3QgZHJiZF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdGhpLT5jb25uZWN0aW9uOwogCXN0cnVjdCBkcmJkX3dvcmsgKncgPSBOVUxMOwotCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXY7CisJc3RydWN0IGRyYmRfcGVlcl9kZXZpY2UgKnBlZXJfZGV2aWNlOwogCUxJU1RfSEVBRCh3b3JrX2xpc3QpOwogCWludCB2bnI7CiAKQEAgLTE4OTUsMTIgKzE5MDYsMTIgQEAKIAkJLyogYXMgbG9uZyBhcyB3ZSB1c2UgZHJiZF9xdWV1ZV93b3JrX2Zyb250KCksCiAJCSAqIHdlIG1heSBvbmx5IGRlcXVldWUgc2luZ2xlIHdvcmsgaXRlbXMgaGVyZSwgbm90IGJhdGNoZXMuICovCiAJCWlmIChsaXN0X2VtcHR5KCZ3b3JrX2xpc3QpKQotCQkJd2FpdF9mb3Jfd29yayh0Y29ubiwgJndvcmtfbGlzdCk7CisJCQl3YWl0X2Zvcl93b3JrKGNvbm5lY3Rpb24sICZ3b3JrX2xpc3QpOwogCiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKIAkJCWlmIChnZXRfdF9zdGF0ZSh0aGkpID09IFJVTk5JTkcpIHsKLQkJCQljb25uX3dhcm4odGNvbm4sICJXb3JrZXIgZ290IGFuIHVuZXhwZWN0ZWQgc2lnbmFsXG4iKTsKKwkJCQlkcmJkX3dhcm4oY29ubmVjdGlvbiwgIldvcmtlciBnb3QgYW4gdW5leHBlY3RlZCBzaWduYWxcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xOTEyLDEwICsxOTIzLDEwIEBACiAJCXdoaWxlICghbGlzdF9lbXB0eSgmd29ya19saXN0KSkgewogCQkJdyA9IGxpc3RfZmlyc3RfZW50cnkoJndvcmtfbGlzdCwgc3RydWN0IGRyYmRfd29yaywgbGlzdCk7CiAJCQlsaXN0X2RlbF9pbml0KCZ3LT5saXN0KTsKLQkJCWlmICh3LT5jYih3LCB0Y29ubi0+Y3N0YXRlIDwgQ19XRl9SRVBPUlRfUEFSQU1TKSA9PSAwKQorCQkJaWYgKHctPmNiKHcsIGNvbm5lY3Rpb24tPmNzdGF0ZSA8IENfV0ZfUkVQT1JUX1BBUkFNUykgPT0gMCkKIAkJCQljb250aW51ZTsKLQkJCWlmICh0Y29ubi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUykKLQkJCQljb25uX3JlcXVlc3Rfc3RhdGUodGNvbm4sIE5TKGNvbm4sIENfTkVUV09SS19GQUlMVVJFKSwgQ1NfSEFSRCk7CisJCQlpZiAoY29ubmVjdGlvbi0+Y3N0YXRlID49IENfV0ZfUkVQT1JUX1BBUkFNUykKKwkJCQljb25uX3JlcXVlc3Rfc3RhdGUoY29ubmVjdGlvbiwgTlMoY29ubiwgQ19ORVRXT1JLX0ZBSUxVUkUpLCBDU19IQVJEKTsKIAkJfQogCX0KIApAQCAtMTkyNSwxNiArMTkzNiwxNyBAQAogCQkJbGlzdF9kZWxfaW5pdCgmdy0+bGlzdCk7CiAJCQl3LT5jYih3LCAxKTsKIAkJfQotCQlkZXF1ZXVlX3dvcmtfYmF0Y2goJnRjb25uLT5zZW5kZXJfd29yaywgJndvcmtfbGlzdCk7CisJCWRlcXVldWVfd29ya19iYXRjaCgmY29ubmVjdGlvbi0+c2VuZGVyX3dvcmssICZ3b3JrX2xpc3QpOwogCX0gd2hpbGUgKCFsaXN0X2VtcHR5KCZ3b3JrX2xpc3QpKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlpZHJfZm9yX2VhY2hfZW50cnkoJnRjb25uLT52b2x1bWVzLCBtZGV2LCB2bnIpIHsKLQkJRF9BU1NFUlQobWRldi0+c3RhdGUuZGlzayA9PSBEX0RJU0tMRVNTICYmIG1kZXYtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FKTsKLQkJa3JlZl9nZXQoJm1kZXYtPmtyZWYpOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmY29ubmVjdGlvbi0+cGVlcl9kZXZpY2VzLCBwZWVyX2RldmljZSwgdm5yKSB7CisJCXN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlID0gcGVlcl9kZXZpY2UtPmRldmljZTsKKwkJRF9BU1NFUlQoZGV2aWNlLCBkZXZpY2UtPnN0YXRlLmRpc2sgPT0gRF9ESVNLTEVTUyAmJiBkZXZpY2UtPnN0YXRlLmNvbm4gPT0gQ19TVEFOREFMT05FKTsKKwkJa3JlZl9nZXQoJmRldmljZS0+a3JlZik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlkcmJkX21kZXZfY2xlYW51cChtZGV2KTsKLQkJa3JlZl9wdXQoJm1kZXYtPmtyZWYsICZkcmJkX21pbm9yX2Rlc3Ryb3kpOworCQlkcmJkX2RldmljZV9jbGVhbnVwKGRldmljZSk7CisJCWtyZWZfcHV0KCZkZXZpY2UtPmtyZWYsIGRyYmRfZGVzdHJveV9kZXZpY2UpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd3JhcHBlcnMuaCBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dyYXBwZXJzLmgKaW5kZXggMzI4ZjE4ZS4uM2RiOWViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfd3JhcHBlcnMuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93cmFwcGVycy5oCkBAIC05LDEyICs5LDEyIEBACiBleHRlcm4gY2hhciAqZHJiZF9zZWNfaG9sZGVyOwogCiAvKiBzZXRzIHRoZSBudW1iZXIgb2YgNTEyIGJ5dGUgc2VjdG9ycyBvZiBvdXIgdmlydHVhbCBkZXZpY2UgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX3NldF9teV9jYXBhY2l0eShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LAorc3RhdGljIGlubGluZSB2b2lkIGRyYmRfc2V0X215X2NhcGFjaXR5KHN0cnVjdCBkcmJkX2RldmljZSAqZGV2aWNlLAogCQkJCQlzZWN0b3JfdCBzaXplKQogewotCS8qIHNldF9jYXBhY2l0eShtZGV2LT50aGlzX2JkZXYtPmJkX2Rpc2ssIHNpemUpOyAqLwotCXNldF9jYXBhY2l0eShtZGV2LT52ZGlzaywgc2l6ZSk7Ci0JbWRldi0+dGhpc19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID0gKGxvZmZfdClzaXplIDw8IDk7CisJLyogc2V0X2NhcGFjaXR5KGRldmljZS0+dGhpc19iZGV2LT5iZF9kaXNrLCBzaXplKTsgKi8KKwlzZXRfY2FwYWNpdHkoZGV2aWNlLT52ZGlzaywgc2l6ZSk7CisJZGV2aWNlLT50aGlzX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPSAobG9mZl90KXNpemUgPDwgOTsKIH0KIAogI2RlZmluZSBkcmJkX2Jpb191cHRvZGF0ZShiaW8pIGJpb19mbGFnZ2VkKGJpbywgQklPX1VQVE9EQVRFKQpAQCAtMjcsMjAgKzI3LDIwIEBACiAvKgogICogdXNlZCB0byBzdWJtaXQgb3VyIHByaXZhdGUgYmlvCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkcmJkX2dlbmVyaWNfbWFrZV9yZXF1ZXN0KHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsCitzdGF0aWMgaW5saW5lIHZvaWQgZHJiZF9nZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwKIAkJCQkJICAgICBpbnQgZmF1bHRfdHlwZSwgc3RydWN0IGJpbyAqYmlvKQogewogCV9fcmVsZWFzZShsb2NhbCk7CiAJaWYgKCFiaW8tPmJpX2JkZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkcmJkJWQ6IGRyYmRfZ2VuZXJpY19tYWtlX3JlcXVlc3Q6ICIKIAkJCQkiYmlvLT5iaV9iZGV2ID09IE5VTExcbiIsCi0JCSAgICAgICBtZGV2X3RvX21pbm9yKG1kZXYpKTsKKwkJICAgICAgIGRldmljZV90b19taW5vcihkZXZpY2UpKTsKIAkJZHVtcF9zdGFjaygpOwogCQliaW9fZW5kaW8oYmlvLCAtRU5PREVWKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChkcmJkX2luc2VydF9mYXVsdChtZGV2LCBmYXVsdF90eXBlKSkKKwlpZiAoZHJiZF9pbnNlcnRfZmF1bHQoZGV2aWNlLCBmYXVsdF90eXBlKSkKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJZWxzZQogCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKaW5kZXggMjAyMzA0My4uOGY1NTY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCkBAIC05NjEsMTcgKzk2MSwzMSBAQAogewogfQogCi1zdGF0aWMgREVDTEFSRV9XT1JLKGZsb3BweV93b3JrLCBOVUxMKTsKK3N0YXRpYyB2b2lkICgqZmxvcHB5X3dvcmtfZm4pKHZvaWQpOworCitzdGF0aWMgdm9pZCBmbG9wcHlfd29ya193b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWZsb3BweV93b3JrX2ZuKCk7Cit9CisKK3N0YXRpYyBERUNMQVJFX1dPUksoZmxvcHB5X3dvcmssIGZsb3BweV93b3JrX3dvcmtmbik7CiAKIHN0YXRpYyB2b2lkIHNjaGVkdWxlX2JoKHZvaWQgKCpoYW5kbGVyKSh2b2lkKSkKIHsKIAlXQVJOX09OKHdvcmtfcGVuZGluZygmZmxvcHB5X3dvcmspKTsKIAotCVBSRVBBUkVfV09SSygmZmxvcHB5X3dvcmssICh3b3JrX2Z1bmNfdCloYW5kbGVyKTsKKwlmbG9wcHlfd29ya19mbiA9IGhhbmRsZXI7CiAJcXVldWVfd29yayhmbG9wcHlfd3EsICZmbG9wcHlfd29yayk7CiB9CiAKLXN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhmZF90aW1lciwgTlVMTCk7CitzdGF0aWMgdm9pZCAoKmZkX3RpbWVyX2ZuKSh2b2lkKSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGZkX3RpbWVyX3dvcmtmbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJZmRfdGltZXJfZm4oKTsKK30KKworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGZkX3RpbWVyLCBmZF90aW1lcl93b3JrZm4pOwogCiBzdGF0aWMgdm9pZCBjYW5jZWxfYWN0aXZpdHkodm9pZCkKIHsKQEAgLTk4Miw3ICs5OTYsNyBAQAogCiAvKiB0aGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCB0aGUgZGlzayBzdGF5cyBpbiB0aGUgZHJpdmUgZHVyaW5nIHRoZQogICogdHJhbnNmZXIgKi8KLXN0YXRpYyB2b2lkIGZkX3dhdGNoZG9nKHN0cnVjdCB3b3JrX3N0cnVjdCAqYXJnKQorc3RhdGljIHZvaWQgZmRfd2F0Y2hkb2codm9pZCkKIHsKIAlkZWJ1Z19kY2woRFAtPmZsYWdzLCAiY2FsbGluZyBkaXNrIGNoYW5nZSBmcm9tIHdhdGNoZG9nXG4iKTsKIApAQCAtOTkzLDcgKzEwMDcsNyBAQAogCQlyZXNldF9mZGMoKTsKIAl9IGVsc2UgewogCQljYW5jZWxfZGVsYXllZF93b3JrKCZmZF90aW1lcik7Ci0JCVBSRVBBUkVfREVMQVlFRF9XT1JLKCZmZF90aW1lciwgZmRfd2F0Y2hkb2cpOworCQlmZF90aW1lcl9mbiA9IGZkX3dhdGNoZG9nOwogCQlxdWV1ZV9kZWxheWVkX3dvcmsoZmxvcHB5X3dxLCAmZmRfdGltZXIsIEhaIC8gMTApOwogCX0KIH0KQEAgLTEwMDUsNyArMTAxOSw4IEBACiB9CiAKIC8qIHdhaXRzIGZvciBhIGRlbGF5IChzcGludXAgb3Igc2VsZWN0KSB0byBwYXNzICovCi1zdGF0aWMgaW50IGZkX3dhaXRfZm9yX2NvbXBsZXRpb24odW5zaWduZWQgbG9uZyBleHBpcmVzLCB3b3JrX2Z1bmNfdCBmdW5jdGlvbikKK3N0YXRpYyBpbnQgZmRfd2FpdF9mb3JfY29tcGxldGlvbih1bnNpZ25lZCBsb25nIGV4cGlyZXMsCisJCQkJICB2b2lkICgqZnVuY3Rpb24pKHZvaWQpKQogewogCWlmIChGRENTLT5yZXNldCkgewogCQlyZXNldF9mZGMoKTsJLyogZG8gdGhlIHJlc2V0IGR1cmluZyBzbGVlcCB0byB3aW4gdGltZQpAQCAtMTAxNiw3ICsxMDMxLDcgQEAKIAogCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcmVzKSkgewogCQljYW5jZWxfZGVsYXllZF93b3JrKCZmZF90aW1lcik7Ci0JCVBSRVBBUkVfREVMQVlFRF9XT1JLKCZmZF90aW1lciwgZnVuY3Rpb24pOworCQlmZF90aW1lcl9mbiA9IGZ1bmN0aW9uOwogCQlxdWV1ZV9kZWxheWVkX3dvcmsoZmxvcHB5X3dxLCAmZmRfdGltZXIsIGV4cGlyZXMgLSBqaWZmaWVzKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTMzNCw4ICsxMzQ5LDcgQEAKIAkgKiBQYXVzZSA1IG1zZWMgdG8gYXZvaWQgdHJvdWJsZS4gKE5lZWRzIHRvIGJlIDIgamlmZmllcykKIAkgKi8KIAlGRENTLT5kdHIgPSByYXdfY21kLT5yYXRlICYgMzsKLQlyZXR1cm4gZmRfd2FpdF9mb3JfY29tcGxldGlvbihqaWZmaWVzICsgMlVMICogSFogLyAxMDAsCi0JCQkJICAgICAgKHdvcmtfZnVuY190KWZsb3BweV9yZWFkeSk7CisJcmV0dXJuIGZkX3dhaXRfZm9yX2NvbXBsZXRpb24oamlmZmllcyArIDJVTCAqIEhaIC8gMTAwLCBmbG9wcHlfcmVhZHkpOwogfQkJCQkvKiBmZGNfZHRyICovCiAKIHN0YXRpYyB2b2lkIHRlbGxfc2VjdG9yKHZvaWQpCkBAIC0xNDQwLDcgKzE0NTQsNyBAQAogCWludCBmbGFnczsKIAlpbnQgZGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgcmVhZHlfZGF0ZTsKLQl3b3JrX2Z1bmNfdCBmdW5jdGlvbjsKKwl2b2lkICgqZnVuY3Rpb24pKHZvaWQpOwogCiAJZmxhZ3MgPSByYXdfY21kLT5mbGFnczsKIAlpZiAoZmxhZ3MgJiAoRkRfUkFXX1JFQUQgfCBGRF9SQVdfV1JJVEUpKQpAQCAtMTQ1NCw5ICsxNDY4LDkgQEAKIAkJICovCiAJCWlmICh0aW1lX2FmdGVyKHJlYWR5X2RhdGUsIGppZmZpZXMgKyBEUC0+c2VsZWN0X2RlbGF5KSkgewogCQkJcmVhZHlfZGF0ZSAtPSBEUC0+c2VsZWN0X2RlbGF5OwotCQkJZnVuY3Rpb24gPSAod29ya19mdW5jX3QpZmxvcHB5X3N0YXJ0OworCQkJZnVuY3Rpb24gPSBmbG9wcHlfc3RhcnQ7CiAJCX0gZWxzZQotCQkJZnVuY3Rpb24gPSAod29ya19mdW5jX3Qpc2V0dXBfcndfZmxvcHB5OworCQkJZnVuY3Rpb24gPSBzZXR1cF9yd19mbG9wcHk7CiAKIAkJLyogd2FpdCB1bnRpbCB0aGUgZmxvcHB5IGlzIHNwaW5uaW5nIGZhc3QgZW5vdWdoICovCiAJCWlmIChmZF93YWl0X2Zvcl9jb21wbGV0aW9uKHJlYWR5X2RhdGUsIGZ1bmN0aW9uKSkKQEAgLTE0ODYsNyArMTUwMCw3IEBACiAJCWluciA9IHJlc3VsdCgpOwogCQljb250LT5pbnRlcnJ1cHQoKTsKIAl9IGVsc2UgaWYgKGZsYWdzICYgRkRfUkFXX05FRURfRElTSykKLQkJZmRfd2F0Y2hkb2coTlVMTCk7CisJCWZkX3dhdGNoZG9nKCk7CiB9CiAKIHN0YXRpYyBpbnQgYmxpbmRfc2VlazsKQEAgLTE4NjMsNyArMTg3Nyw3IEBACiAKIAkvKiB3YWl0X2Zvcl9jb21wbGV0aW9uIGFsc28gc2NoZWR1bGVzIHJlc2V0IGlmIG5lZWRlZC4gKi8KIAlyZXR1cm4gZmRfd2FpdF9mb3JfY29tcGxldGlvbihEUlMtPnNlbGVjdF9kYXRlICsgRFAtPnNlbGVjdF9kZWxheSwKLQkJCQkgICAgICAod29ya19mdW5jX3QpZnVuY3Rpb24pOworCQkJCSAgICAgIGZ1bmN0aW9uKTsKIH0KIAogc3RhdGljIHZvaWQgZmxvcHB5X3JlYWR5KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmMgYi9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmMKaW5kZXggNTE2MDI2OS4uNTljNWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguYwpAQCAtMjUyLDM4ICsyNTIsNDUgQEAKIAkJCQl2b2lkICpkYXRhLAogCQkJCWludCBzdGF0dXMpCiB7Ci0Jc3RydWN0IG10aXBfY21kICpjb21tYW5kOworCXN0cnVjdCBtdGlwX2NtZCAqY21kOwogCXN0cnVjdCBkcml2ZXJfZGF0YSAqZGQgPSBkYXRhOwotCWludCBjYl9zdGF0dXMgPSBzdGF0dXMgPyAtRUlPIDogMDsKKwlpbnQgdW5hbGlnbmVkLCBjYl9zdGF0dXMgPSBzdGF0dXMgPyAtRUlPIDogMDsKKwl2b2lkICgqZnVuYykodm9pZCAqLCBpbnQpOwogCiAJaWYgKHVubGlrZWx5KCFkZCkgfHwgdW5saWtlbHkoIXBvcnQpKQogCQlyZXR1cm47CiAKLQljb21tYW5kID0gJnBvcnQtPmNvbW1hbmRzW3RhZ107CisJY21kID0gJnBvcnQtPmNvbW1hbmRzW3RhZ107CiAKIAlpZiAodW5saWtlbHkoc3RhdHVzID09IFBPUlRfSVJRX1RGX0VSUikpIHsKIAkJZGV2X3dhcm4oJnBvcnQtPmRkLT5wZGV2LT5kZXYsCiAJCQkiQ29tbWFuZCB0YWcgJWQgZmFpbGVkIGR1ZSB0byBURkVcbiIsIHRhZyk7CiAJfQogCi0JLyogVXBwZXIgbGF5ZXIgY2FsbGJhY2sgKi8KLQlpZiAobGlrZWx5KGNvbW1hbmQtPmFzeW5jX2NhbGxiYWNrKSkKLQkJY29tbWFuZC0+YXN5bmNfY2FsbGJhY2soY29tbWFuZC0+YXN5bmNfZGF0YSwgY2Jfc3RhdHVzKTsKLQotCWNvbW1hbmQtPmFzeW5jX2NhbGxiYWNrID0gTlVMTDsKLQljb21tYW5kLT5jb21wX2Z1bmMgPSBOVUxMOwotCi0JLyogVW5tYXAgdGhlIERNQSBzY2F0dGVyIGxpc3QgZW50cmllcyAqLwotCWRtYV91bm1hcF9zZygmZGQtPnBkZXYtPmRldiwKLQkJY29tbWFuZC0+c2csCi0JCWNvbW1hbmQtPnNjYXR0ZXJfZW50cywKLQkJY29tbWFuZC0+ZGlyZWN0aW9uKTsKLQotCS8qIENsZWFyIHRoZSBhbGxvY2F0ZWQgYW5kIGFjdGl2ZSBiaXRzIGZvciB0aGUgY29tbWFuZCAqLworCS8qIENsZWFyIHRoZSBhY3RpdmUgZmxhZyAqLwogCWF0b21pY19zZXQoJnBvcnQtPmNvbW1hbmRzW3RhZ10uYWN0aXZlLCAwKTsKLQlyZWxlYXNlX3Nsb3QocG9ydCwgdGFnKTsKIAotCXVwKCZwb3J0LT5jbWRfc2xvdCk7CisJLyogVXBwZXIgbGF5ZXIgY2FsbGJhY2sgKi8KKwlmdW5jID0gY21kLT5hc3luY19jYWxsYmFjazsKKwlpZiAobGlrZWx5KGZ1bmMgJiYgY21weGNoZygmY21kLT5hc3luY19jYWxsYmFjaywgZnVuYywgMCkgPT0gZnVuYykpIHsKKworCQkvKiBVbm1hcCB0aGUgRE1BIHNjYXR0ZXIgbGlzdCBlbnRyaWVzICovCisJCWRtYV91bm1hcF9zZygmZGQtPnBkZXYtPmRldiwKKwkJCWNtZC0+c2csCisJCQljbWQtPnNjYXR0ZXJfZW50cywKKwkJCWNtZC0+ZGlyZWN0aW9uKTsKKworCQlmdW5jKGNtZC0+YXN5bmNfZGF0YSwgY2Jfc3RhdHVzKTsKKwkJdW5hbGlnbmVkID0gY21kLT51bmFsaWduZWQ7CisKKwkJLyogQ2xlYXIgdGhlIGFsbG9jYXRlZCBiaXQgZm9yIHRoZSBjb21tYW5kICovCisJCXJlbGVhc2Vfc2xvdChwb3J0LCB0YWcpOworCisJCWlmICh1bmxpa2VseSh1bmFsaWduZWQpKQorCQkJdXAoJnBvcnQtPmNtZF9zbG90X3VuYWwpOworCQllbHNlCisJCQl1cCgmcG9ydC0+Y21kX3Nsb3QpOworCX0KIH0KIAogLyoKQEAgLTY2MCwxMSArNjY3LDEyIEBACiB7CiAJc3RydWN0IG10aXBfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgbXRpcF9wb3J0ICopIGRhdGE7CiAJc3RydWN0IGhvc3RfdG9fZGV2X2ZpcyAqZmlzOwotCXN0cnVjdCBtdGlwX2NtZCAqY29tbWFuZDsKLQlpbnQgdGFnLCBjbWR0b19jbnQgPSAwOworCXN0cnVjdCBtdGlwX2NtZCAqY21kOworCWludCB1bmFsaWduZWQsIHRhZywgY21kdG9fY250ID0gMDsKIAl1bnNpZ25lZCBpbnQgYml0LCBncm91cDsKIAl1bnNpZ25lZCBpbnQgbnVtX2NvbW1hbmRfc2xvdHM7CiAJdW5zaWduZWQgbG9uZyB0bywgdGFnYWNjdW1bU0xPVEJJVFNfSU5fTE9OR1NdOworCXZvaWQgKCpmdW5jKSh2b2lkICosIGludCk7CiAKIAlpZiAodW5saWtlbHkoIXBvcnQpKQogCQlyZXR1cm47CkBAIC02OTQsOCArNzAyLDggQEAKIAkJCWdyb3VwID0gdGFnID4+IDU7CiAJCQliaXQgPSB0YWcgJiAweDFGOwogCi0JCQljb21tYW5kID0gJnBvcnQtPmNvbW1hbmRzW3RhZ107Ci0JCQlmaXMgPSAoc3RydWN0IGhvc3RfdG9fZGV2X2ZpcyAqKSBjb21tYW5kLT5jb21tYW5kOworCQkJY21kID0gJnBvcnQtPmNvbW1hbmRzW3RhZ107CisJCQlmaXMgPSAoc3RydWN0IGhvc3RfdG9fZGV2X2ZpcyAqKSBjbWQtPmNvbW1hbmQ7CiAKIAkJCXNldF9iaXQodGFnLCB0YWdhY2N1bSk7CiAJCQljbWR0b19jbnQrKzsKQEAgLTcwOSwyNyArNzE3LDMwIEBACiAJCQkgKi8KIAkJCXdyaXRlbCgxIDw8IGJpdCwgcG9ydC0+Y29tcGxldGVkW2dyb3VwXSk7CiAKLQkJCS8qIENhbGwgdGhlIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2suICovCi0JCQlpZiAobGlrZWx5KGNvbW1hbmQtPmFzeW5jX2NhbGxiYWNrKSkKLQkJCQljb21tYW5kLT5hc3luY19jYWxsYmFjayhjb21tYW5kLT5hc3luY19kYXRhLAotCQkJCQkJCSAtRUlPKTsKLQkJCWNvbW1hbmQtPmFzeW5jX2NhbGxiYWNrID0gTlVMTDsKLQkJCWNvbW1hbmQtPmNvbXBfZnVuYyA9IE5VTEw7Ci0KLQkJCS8qIFVubWFwIHRoZSBETUEgc2NhdHRlciBsaXN0IGVudHJpZXMgKi8KLQkJCWRtYV91bm1hcF9zZygmcG9ydC0+ZGQtPnBkZXYtPmRldiwKLQkJCQkJY29tbWFuZC0+c2csCi0JCQkJCWNvbW1hbmQtPnNjYXR0ZXJfZW50cywKLQkJCQkJY29tbWFuZC0+ZGlyZWN0aW9uKTsKLQotCQkJLyoKLQkJCSAqIENsZWFyIHRoZSBhbGxvY2F0ZWQgYml0IGFuZCBhY3RpdmUgdGFnIGZvciB0aGUKLQkJCSAqIGNvbW1hbmQuCi0JCQkgKi8KKwkJCS8qIENsZWFyIHRoZSBhY3RpdmUgZmxhZyBmb3IgdGhlIGNvbW1hbmQgKi8KIAkJCWF0b21pY19zZXQoJnBvcnQtPmNvbW1hbmRzW3RhZ10uYWN0aXZlLCAwKTsKLQkJCXJlbGVhc2Vfc2xvdChwb3J0LCB0YWcpOwogCi0JCQl1cCgmcG9ydC0+Y21kX3Nsb3QpOworCQkJZnVuYyA9IGNtZC0+YXN5bmNfY2FsbGJhY2s7CisJCQlpZiAoZnVuYyAmJgorCQkJICAgIGNtcHhjaGcoJmNtZC0+YXN5bmNfY2FsbGJhY2ssIGZ1bmMsIDApID09IGZ1bmMpIHsKKworCQkJCS8qIFVubWFwIHRoZSBETUEgc2NhdHRlciBsaXN0IGVudHJpZXMgKi8KKwkJCQlkbWFfdW5tYXBfc2coJnBvcnQtPmRkLT5wZGV2LT5kZXYsCisJCQkJCQljbWQtPnNnLAorCQkJCQkJY21kLT5zY2F0dGVyX2VudHMsCisJCQkJCQljbWQtPmRpcmVjdGlvbik7CisKKwkJCQlmdW5jKGNtZC0+YXN5bmNfZGF0YSwgLUVJTyk7CisJCQkJdW5hbGlnbmVkID0gY21kLT51bmFsaWduZWQ7CisKKwkJCQkvKiBDbGVhciB0aGUgYWxsb2NhdGVkIGJpdCBmb3IgdGhlIGNvbW1hbmQuICovCisJCQkJcmVsZWFzZV9zbG90KHBvcnQsIHRhZyk7CisKKwkJCQlpZiAodW5hbGlnbmVkKQorCQkJCQl1cCgmcG9ydC0+Y21kX3Nsb3RfdW5hbCk7CisJCQkJZWxzZQorCQkJCQl1cCgmcG9ydC0+Y21kX3Nsb3QpOworCQkJfQogCQl9CiAJfQogCkBAIC00MjEzLDYgKzQyMjQsNyBAQAogCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhkZC0+cXVldWUsIDB4ZmZmZik7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUoZGQtPnF1ZXVlLCAweDQwMDAwMCk7CiAJYmxrX3F1ZXVlX2lvX21pbihkZC0+cXVldWUsIDQwOTYpOworCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQoZGQtPnF1ZXVlLCBkZC0+cGRldi0+ZG1hX21hc2spOwogCiAJLyoKIAkgKiB3cml0ZSBiYWNrIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGRldmljZS4gRlVBIGRlcGVuZHMgb24KQEAgLTQ0OTgsNyArNDUxMCw3IEBACiAJfQogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJOVU1BIG5vZGUgJWQgKGNsb3Nlc3Q6ICVkLCVkLCBwcm9iZSBvbiAlZDolZClcbiIsCiAJCW15X25vZGUsIHBjaWJ1c190b19ub2RlKHBkZXYtPmJ1cyksIGRldl90b19ub2RlKCZwZGV2LT5kZXYpLAotCQljcHVfdG9fbm9kZShzbXBfcHJvY2Vzc29yX2lkKCkpLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCQljcHVfdG9fbm9kZShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAKIAlkZCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGRyaXZlcl9kYXRhKSwgR0ZQX0tFUk5FTCwgbXlfbm9kZSk7CiAJaWYgKGRkID09IE5VTEwpIHsKQEAgLTQ2MTUsNyArNDYyNyw3IEBACiAJaWYgKHJ2KSB7CiAJCWRldl93YXJuKCZwZGV2LT5kZXYsCiAJCQkiVW5hYmxlIHRvIGVuYWJsZSBNU0kgaW50ZXJydXB0LlxuIik7Ci0JCWdvdG8gYmxvY2tfaW5pdGlhbGl6ZV9lcnI7CisJCWdvdG8gbXNpX2luaXRpYWxpemVfZXJyOwogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIGJsb2NrIGxheWVyLiAqLwpAQCAtNDY0NSw2ICs0NjU3LDggQEAKIAogYmxvY2tfaW5pdGlhbGl6ZV9lcnI6CiAJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCittc2lfaW5pdGlhbGl6ZV9lcnI6CiAJaWYgKGRkLT5pc3Jfd29ya3EpIHsKIAkJZmx1c2hfd29ya3F1ZXVlKGRkLT5pc3Jfd29ya3EpOwogCQlkZXN0cm95X3dvcmtxdWV1ZShkZC0+aXNyX3dvcmtxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguaCBiL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguaAppbmRleCA1NDE3NGNiLi5mZmI5NTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmgKKysrIGIvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5oCkBAIC05Miw3ICs5Miw3IEBACiAKIC8qIERyaXZlciBuYW1lIGFuZCB2ZXJzaW9uIHN0cmluZ3MgKi8KICNkZWZpbmUgTVRJUF9EUlZfTkFNRQkJIm10aXAzMnh4IgotI2RlZmluZSBNVElQX0RSVl9WRVJTSU9OCSIxLjMuMCIKKyNkZWZpbmUgTVRJUF9EUlZfVkVSU0lPTgkiMS4zLjEiCiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIG1pbm9yIGRldmljZSBudW1iZXJzIHBlciBkZXZpY2UuICovCiAjZGVmaW5lIE1USVBfTUFYX01JTk9SUwkJMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbnZtZS1jb3JlLmMgYi9kcml2ZXJzL2Jsb2NrL252bWUtY29yZS5jCmluZGV4IDUxODI0ZDEuLmRhMDg1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbnZtZS1jb3JlLmMKKysrIGIvZHJpdmVycy9ibG9jay9udm1lLWNvcmUuYwpAQCAtOTkzLDcgKzk5Myw3IEBACiAJCWRldl93YXJuKCZkZXYtPnBjaV9kZXYtPmRldiwKIAkJCSJJL08gJWQgUUlEICVkIHRpbWVvdXQsIHJlc2V0IGNvbnRyb2xsZXJcbiIsIGNtZGlkLAogCQkJCQkJCQludm1lcS0+cWlkKTsKLQkJUFJFUEFSRV9XT1JLKCZkZXYtPnJlc2V0X3dvcmssIG52bWVfcmVzZXRfZmFpbGVkX2Rldik7CisJCWRldi0+cmVzZXRfd29ya2ZuID0gbnZtZV9yZXNldF9mYWlsZWRfZGV2OwogCQlxdWV1ZV93b3JrKG52bWVfd29ya3EsICZkZXYtPnJlc2V0X3dvcmspOwogCQlyZXR1cm47CiAJfQpAQCAtMTY5Niw4ICsxNjk2LDcgQEAKIAkJCQlsaXN0X2RlbF9pbml0KCZkZXYtPm5vZGUpOwogCQkJCWRldl93YXJuKCZkZXYtPnBjaV9kZXYtPmRldiwKIAkJCQkJIkZhaWxlZCBzdGF0dXMsIHJlc2V0IGNvbnRyb2xsZXJcbiIpOwotCQkJCVBSRVBBUkVfV09SSygmZGV2LT5yZXNldF93b3JrLAotCQkJCQkJCW52bWVfcmVzZXRfZmFpbGVkX2Rldik7CisJCQkJZGV2LT5yZXNldF93b3JrZm4gPSBudm1lX3Jlc2V0X2ZhaWxlZF9kZXY7CiAJCQkJcXVldWVfd29yayhudm1lX3dvcmtxLCAmZGV2LT5yZXNldF93b3JrKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTE4MzcsMzEgKzE4MzYsMTYgQEAKIAkvKiBEZXJlZ2lzdGVyIHRoZSBhZG1pbiBxdWV1ZSdzIGludGVycnVwdCAqLwogCWZyZWVfaXJxKGRldi0+ZW50cnlbMF0udmVjdG9yLCBhZG1pbnEpOwogCi0JdmVjcyA9IG5yX2lvX3F1ZXVlczsKLQlmb3IgKGkgPSAwOyBpIDwgdmVjczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBucl9pb19xdWV1ZXM7IGkrKykKIAkJZGV2LT5lbnRyeVtpXS5lbnRyeSA9IGk7Ci0JZm9yICg7OykgewotCQlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgZGV2LT5lbnRyeSwgdmVjcyk7Ci0JCWlmIChyZXN1bHQgPD0gMCkKLQkJCWJyZWFrOwotCQl2ZWNzID0gcmVzdWx0OwotCX0KLQotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXZlY3MgPSBucl9pb19xdWV1ZXM7Ci0JCWlmICh2ZWNzID4gMzIpCi0JCQl2ZWNzID0gMzI7Ci0JCWZvciAoOzspIHsKLQkJCXJlc3VsdCA9IHBjaV9lbmFibGVfbXNpX2Jsb2NrKHBkZXYsIHZlY3MpOwotCQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IHZlY3M7IGkrKykKLQkJCQkJZGV2LT5lbnRyeVtpXS52ZWN0b3IgPSBpICsgcGRldi0+aXJxOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJdmVjcyA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl2ZWNzID0gcmVzdWx0OworCXZlY3MgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UocGRldiwgZGV2LT5lbnRyeSwgMSwgbnJfaW9fcXVldWVzKTsKKwlpZiAodmVjcyA8IDApIHsKKwkJdmVjcyA9IHBjaV9lbmFibGVfbXNpX3JhbmdlKHBkZXYsIDEsIG1pbihucl9pb19xdWV1ZXMsIDMyKSk7CisJCWlmICh2ZWNzIDwgMCkgeworCQkJdmVjcyA9IDE7CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgdmVjczsgaSsrKQorCQkJCWRldi0+ZW50cnlbaV0udmVjdG9yID0gaSArIHBkZXYtPmlycTsKIAkJfQogCX0KIApAQCAtMjQwNiw3ICsyMzkwLDcgQEAKIAkJcmV0dXJuIHJldDsKIAlpZiAocmV0ID09IC1FQlVTWSkgewogCQlzcGluX2xvY2soJmRldl9saXN0X2xvY2spOwotCQlQUkVQQVJFX1dPUksoJmRldi0+cmVzZXRfd29yaywgbnZtZV9yZW1vdmVfZGlza3MpOworCQlkZXYtPnJlc2V0X3dvcmtmbiA9IG52bWVfcmVtb3ZlX2Rpc2tzOwogCQlxdWV1ZV93b3JrKG52bWVfd29ya3EsICZkZXYtPnJlc2V0X3dvcmspOwogCQlzcGluX3VubG9jaygmZGV2X2xpc3RfbG9jayk7CiAJfQpAQCAtMjQzNSw2ICsyNDE5LDEyIEBACiAJbnZtZV9kZXZfcmVzZXQoZGV2KTsKIH0KIAorc3RhdGljIHZvaWQgbnZtZV9yZXNldF93b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBudm1lX2RldiAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBudm1lX2RldiwgcmVzZXRfd29yayk7CisJZGV2LT5yZXNldF93b3JrZm4od29yayk7Cit9CisKIHN0YXRpYyBpbnQgbnZtZV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCWludCByZXN1bHQgPSAtRU5PTUVNOwpAQCAtMjQ1Myw3ICsyNDQzLDggQEAKIAkJZ290byBmcmVlOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+bmFtZXNwYWNlcyk7Ci0JSU5JVF9XT1JLKCZkZXYtPnJlc2V0X3dvcmssIG52bWVfcmVzZXRfZmFpbGVkX2Rldik7CisJZGV2LT5yZXNldF93b3JrZm4gPSBudm1lX3Jlc2V0X2ZhaWxlZF9kZXY7CisJSU5JVF9XT1JLKCZkZXYtPnJlc2V0X3dvcmssIG52bWVfcmVzZXRfd29ya2ZuKTsKIAlkZXYtPnBjaV9kZXYgPSBwZGV2OwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCXJlc3VsdCA9IG52bWVfc2V0X2luc3RhbmNlKGRldik7CkBAIC0yNTUzLDcgKzI1NDQsNyBAQAogCXN0cnVjdCBudm1lX2RldiAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCWlmIChudm1lX2Rldl9yZXN1bWUobmRldikgJiYgIXdvcmtfYnVzeSgmbmRldi0+cmVzZXRfd29yaykpIHsKLQkJUFJFUEFSRV9XT1JLKCZuZGV2LT5yZXNldF93b3JrLCBudm1lX3Jlc2V0X2ZhaWxlZF9kZXYpOworCQluZGV2LT5yZXNldF93b3JrZm4gPSBudm1lX3Jlc2V0X2ZhaWxlZF9kZXY7CiAJCXF1ZXVlX3dvcmsobnZtZV93b3JrcSwgJm5kZXYtPnJlc2V0X3dvcmspOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcmJkLmMgYi9kcml2ZXJzL2Jsb2NrL3JiZC5jCmluZGV4IGIzNjVlMGQuLjM0ODk4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcmJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9yYmQuYwpAQCAtMjEwOSw3ICsyMTA5LDYgQEAKIAlyYmRfYXNzZXJ0KGltZ19yZXF1ZXN0LT5vYmpfcmVxdWVzdF9jb3VudCA+IDApOwogCXJiZF9hc3NlcnQod2hpY2ggIT0gQkFEX1dISUNIKTsKIAlyYmRfYXNzZXJ0KHdoaWNoIDwgaW1nX3JlcXVlc3QtPm9ial9yZXF1ZXN0X2NvdW50KTsKLQlyYmRfYXNzZXJ0KHdoaWNoID49IGltZ19yZXF1ZXN0LT5uZXh0X2NvbXBsZXRpb24pOwogCiAJc3Bpbl9sb2NrX2lycSgmaW1nX3JlcXVlc3QtPmNvbXBsZXRpb25fbG9jayk7CiAJaWYgKHdoaWNoICE9IGltZ19yZXF1ZXN0LT5uZXh0X2NvbXBsZXRpb24pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3NrZF9tYWluLmMgYi9kcml2ZXJzL2Jsb2NrL3NrZF9tYWluLmMKaW5kZXggZWI2ZTFlMC4uYTY5ZGQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9za2RfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svc2tkX21haW4uYwpAQCAtMzkxMCwxOCArMzkxMCwyMiBAQAogCXN0cnVjdCBza2RfbXNpeF9lbnRyeSAqcWVudHJ5OwogCWludCBpOwogCi0JaWYgKHNrZGV2LT5tc2l4X2VudHJpZXMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWZvciAoaSA9IDA7IGkgPCBza2Rldi0+bXNpeF9jb3VudDsgaSsrKSB7Ci0JCXFlbnRyeSA9ICZza2Rldi0+bXNpeF9lbnRyaWVzW2ldOwotCQlza2RldiA9IHFlbnRyeS0+cnNwOworCWlmIChza2Rldi0+bXNpeF9lbnRyaWVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBza2Rldi0+bXNpeF9jb3VudDsgaSsrKSB7CisJCQlxZW50cnkgPSAmc2tkZXYtPm1zaXhfZW50cmllc1tpXTsKKwkJCXNrZGV2ID0gcWVudHJ5LT5yc3A7CiAKLQkJaWYgKHFlbnRyeS0+aGF2ZV9pcnEpCi0JCQlkZXZtX2ZyZWVfaXJxKCZza2Rldi0+cGRldi0+ZGV2LAotCQkJCSAgICAgIHFlbnRyeS0+dmVjdG9yLCBxZW50cnktPnJzcCk7CisJCQlpZiAocWVudHJ5LT5oYXZlX2lycSkKKwkJCQlkZXZtX2ZyZWVfaXJxKCZza2Rldi0+cGRldi0+ZGV2LAorCQkJCQkgICAgICBxZW50cnktPnZlY3RvciwgcWVudHJ5LT5yc3ApOworCQl9CisKKwkJa2ZyZWUoc2tkZXYtPm1zaXhfZW50cmllcyk7CiAJfQotCXBjaV9kaXNhYmxlX21zaXgoc2tkZXYtPnBkZXYpOwotCWtmcmVlKHNrZGV2LT5tc2l4X2VudHJpZXMpOworCisJaWYgKHNrZGV2LT5tc2l4X2NvdW50KQorCQlwY2lfZGlzYWJsZV9tc2l4KHNrZGV2LT5wZGV2KTsKKwogCXNrZGV2LT5tc2l4X2NvdW50ID0gMDsKIAlza2Rldi0+bXNpeF9lbnRyaWVzID0gTlVMTDsKIH0KQEAgLTM5MjksMTIgKzM5MzMsMTAgQEAKIHN0YXRpYyBpbnQgc2tkX2FjcXVpcmVfbXNpeChzdHJ1Y3Qgc2tkX2RldmljZSAqc2tkZXYpCiB7CiAJaW50IGksIHJjOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHNrZGV2LT5wZGV2OworCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzOwogCXN0cnVjdCBza2RfbXNpeF9lbnRyeSAqcWVudHJ5OwogCi0JcGRldiA9IHNrZGV2LT5wZGV2OwotCXNrZGV2LT5tc2l4X2NvdW50ID0gU0tEX01BWF9NU0lYX0NPVU5UOwogCWVudHJpZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkgKiBTS0RfTUFYX01TSVhfQ09VTlQsCiAJCQkgIEdGUF9LRVJORUwpOwogCWlmICghZW50cmllcykKQEAgLTM5NDMsNDAgKzM5NDUsMjYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU0tEX01BWF9NU0lYX0NPVU5UOyBpKyspCiAJCWVudHJpZXNbaV0uZW50cnkgPSBpOwogCi0JcmMgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgZW50cmllcywgU0tEX01BWF9NU0lYX0NPVU5UKTsKLQlpZiAocmMgPCAwKQorCXJjID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIGVudHJpZXMsCisJCQkJICAgU0tEX01JTl9NU0lYX0NPVU5ULCBTS0RfTUFYX01TSVhfQ09VTlQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIoJXMpOiBmYWlsZWQgdG8gZW5hYmxlIE1TSS1YICVkXG4iLAorCQkgICAgICAgc2tkX25hbWUoc2tkZXYpLCByYyk7CiAJCWdvdG8gbXNpeF9vdXQ7Ci0JaWYgKHJjKSB7Ci0JCWlmIChyYyA8IFNLRF9NSU5fTVNJWF9DT1VOVCkgewotCQkJcHJfZXJyKCIoJXMpOiBmYWlsZWQgdG8gZW5hYmxlIE1TSS1YICVkXG4iLAotCQkJICAgICAgIHNrZF9uYW1lKHNrZGV2KSwgcmMpOwotCQkJZ290byBtc2l4X291dDsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6JXM6JWQgJXM6IDwlcz4gYWxsb2NhdGVkICVkIE1TSS1YIHZlY3RvcnNcbiIsCi0JCQkgc2tkZXYtPm5hbWUsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCSBwY2lfbmFtZShwZGV2KSwgc2tkZXYtPm5hbWUsIHJjKTsKLQotCQlza2Rldi0+bXNpeF9jb3VudCA9IHJjOwotCQlyYyA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCBlbnRyaWVzLCBza2Rldi0+bXNpeF9jb3VudCk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIoJXMpOiBmYWlsZWQgdG8gZW5hYmxlIE1TSS1YICIKLQkJCSAgICAgICAic3VwcG9ydCAoJWQpICVkXG4iLAotCQkJICAgICAgIHNrZF9uYW1lKHNrZGV2KSwgc2tkZXYtPm1zaXhfY291bnQsIHJjKTsKLQkJCWdvdG8gbXNpeF9vdXQ7Ci0JCX0KIAl9CisKKwlza2Rldi0+bXNpeF9jb3VudCA9IHJjOwogCXNrZGV2LT5tc2l4X2VudHJpZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tkX21zaXhfZW50cnkpICoKIAkJCQkgICAgICBza2Rldi0+bXNpeF9jb3VudCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2Rldi0+bXNpeF9lbnRyaWVzKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJc2tkZXYtPm1zaXhfY291bnQgPSAwOwogCQlwcl9lcnIoIiglcyk6IG1zaXggdGFibGUgYWxsb2NhdGlvbiBlcnJvclxuIiwKIAkJICAgICAgIHNrZF9uYW1lKHNrZGV2KSk7CiAJCWdvdG8gbXNpeF9vdXQ7CiAJfQogCi0JcWVudHJ5ID0gc2tkZXYtPm1zaXhfZW50cmllczsKIAlmb3IgKGkgPSAwOyBpIDwgc2tkZXYtPm1zaXhfY291bnQ7IGkrKykgeworCQlxZW50cnkgPSAmc2tkZXYtPm1zaXhfZW50cmllc1tpXTsKIAkJcWVudHJ5LT52ZWN0b3IgPSBlbnRyaWVzW2ldLnZlY3RvcjsKIAkJcWVudHJ5LT5lbnRyeSA9IGVudHJpZXNbaV0uZW50cnk7CiAJCXFlbnRyeS0+cnNwID0gTlVMTDsKQEAgLTM5ODUsMTEgKzM5NzMsMTAgQEAKIAkJCSBza2Rldi0+bmFtZSwgX19mdW5jX18sIF9fTElORV9fLAogCQkJIHBjaV9uYW1lKHBkZXYpLCBza2Rldi0+bmFtZSwKIAkJCSBpLCBxZW50cnktPnZlY3RvciwgcWVudHJ5LT5lbnRyeSk7Ci0JCXFlbnRyeSsrOwogCX0KIAogCS8qIEVuYWJsZSBNU0ktWCB2ZWN0b3JzIGZvciB0aGUgYmFzZSBxdWV1ZSAqLwotCWZvciAoaSA9IDA7IGkgPCBTS0RfTUFYX01TSVhfQ09VTlQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBza2Rldi0+bXNpeF9jb3VudDsgaSsrKSB7CiAJCXFlbnRyeSA9ICZza2Rldi0+bXNpeF9lbnRyaWVzW2ldOwogCQlzbnByaW50ZihxZW50cnktPmlzcl9uYW1lLCBzaXplb2YocWVudHJ5LT5pc3JfbmFtZSksCiAJCQkgIiVzJWQtbXNpeCAlcyIsIERSVl9OQU1FLCBza2Rldi0+ZGV2bm8sCkBAIC00MDQ1LDggKzQwMzIsOCBAQAogCWNhc2UgU0tEX0lSUV9NU0k6CiAJCXNucHJpbnRmKHNrZGV2LT5pc3JfbmFtZSwgc2l6ZW9mKHNrZGV2LT5pc3JfbmFtZSksICIlcyVkLW1zaSIsCiAJCQkgRFJWX05BTUUsIHNrZGV2LT5kZXZubyk7Ci0JCXJjID0gcGNpX2VuYWJsZV9tc2kocGRldik7Ci0JCWlmICghcmMpIHsKKwkJcmMgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShwZGV2LCAxLCAxKTsKKwkJaWYgKHJjID4gMCkgewogCQkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHBkZXYtPmlycSwgc2tkX2lzciwgMCwKIAkJCQkJICAgICAgc2tkZXYtPmlzcl9uYW1lLCBza2Rldik7CiAJCQlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwppbmRleCAyMGUwNjFjMy4uYzc0ZjdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zd2ltMy5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTg0MCwxNCArODQxLDE3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKIAlpZiAoZnMtPnN0YXRlICE9IGlkbGUgJiYgZnMtPnN0YXRlICE9IGF2YWlsYWJsZSkgewogCQkrK2ZzLT53YW50ZWQ7Ci0JCXdoaWxlIChmcy0+c3RhdGUgIT0gYXZhaWxhYmxlKSB7CisJCS8qIHRoaXMgd2lsbCBlbmFibGUgaXJxcyBpbiBvcmRlciB0byBzbGVlcCAqLworCQlpZiAoIWludGVycnVwdGlibGUpCisJCQl3YWl0X2V2ZW50X2xvY2tfaXJxKGZzLT53YWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLT5zdGF0ZSA9PSBhdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpbTNfbG9jayk7CisJCWVsc2UgaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9sb2NrX2lycShmcy0+d2FpdCwKKwkJCQkJZnMtPnN0YXRlID09IGF2YWlsYWJsZSwKKwkJCQkJc3dpbTNfbG9jaykpIHsKKwkJCS0tZnMtPndhbnRlZDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKLQkJCWlmIChpbnRlcnJ1cHRpYmxlICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJLS1mcy0+d2FudGVkOwotCQkJCXJldHVybiAtRUlOVFI7Ci0JCQl9Ci0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZmcy0+d2FpdCk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FSU5UUjsKIAkJfQogCQktLWZzLT53YW50ZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwppbmRleCBiMWNiM2Y0Li4wZWFjZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwpAQCAtNDkwLDEzICs0OTAsMTQgQEAKIAkuZmxhZ3MJCT0gQkxLX01RX0ZfU0hPVUxEX01FUkdFLAogfTsKIAotc3RhdGljIHZvaWQgdmlydGJsa19pbml0X3Zicih2b2lkICpkYXRhLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKK3N0YXRpYyBpbnQgdmlydGJsa19pbml0X3Zicih2b2lkICpkYXRhLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKIAkJCSAgICAgc3RydWN0IHJlcXVlc3QgKnJxLCB1bnNpZ25lZCBpbnQgbnIpCiB7CiAJc3RydWN0IHZpcnRpb19ibGsgKnZibGsgPSBkYXRhOwogCXN0cnVjdCB2aXJ0YmxrX3JlcSAqdmJyID0gcnEtPnNwZWNpYWw7CiAKIAlzZ19pbml0X3RhYmxlKHZici0+c2csIHZibGstPnNnX2VsZW1zKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2aXJ0YmxrX3Byb2JlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvbXZlYnUtbWJ1cy5jIGIvZHJpdmVycy9idXMvbXZlYnUtbWJ1cy5jCmluZGV4IDcyNWM0NjEuLjJhYzc1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL212ZWJ1LW1idXMuYworKysgYi9kcml2ZXJzL2J1cy9tdmVidS1tYnVzLmMKQEAgLTg3MCwxNCArODcwLDE0IEBACiAJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsICJwY2llLW1lbS1hcGVydHVyZSIsIHJlZywgQVJSQVlfU0laRShyZWcpKTsKIAlpZiAoIXJldCkgewogCQltZW0tPnN0YXJ0ID0gcmVnWzBdOwotCQltZW0tPmVuZCA9IG1lbS0+c3RhcnQgKyByZWdbMV07CisJCW1lbS0+ZW5kID0gbWVtLT5zdGFydCArIHJlZ1sxXSAtIDE7CiAJCW1lbS0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAl9CiAKIAlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShucCwgInBjaWUtaW8tYXBlcnR1cmUiLCByZWcsIEFSUkFZX1NJWkUocmVnKSk7CiAJaWYgKCFyZXQpIHsKIAkJaW8tPnN0YXJ0ID0gcmVnWzBdOwotCQlpby0+ZW5kID0gaW8tPnN0YXJ0ICsgcmVnWzFdOworCQlpby0+ZW5kID0gaW8tPnN0YXJ0ICsgcmVnWzFdIC0gMTsKIAkJaW8tPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKaW5kZXggMWIxOTIzOS4uODEyMWI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwppbmRleCBmMzk0MzdhLi4wZmJjY2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYwpAQCAtMjksNyArMjksNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCmluZGV4IDVjODUzNTAuLjlhMDI0ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYwpAQCAtMTcsNyArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYwppbmRleCAwNWI4ZDAyLi4zMDUxYzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3NnaS1hZ3AuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vYmNtMjgzNS1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vYmNtMjgzNS1ybmcuYwppbmRleCA0MzU3N2NhLi44YzNiMjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2JjbTI4MzUtcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9iY20yODM1LXJuZy5jCkBAIC04LDcgKzgsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKaW5kZXggYTBmNzcyNC4uYjk0OTVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vZXh5bm9zLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9leHlub3Mtcm5nLmMKaW5kZXggNDAyY2NmYi4uOWY4Mjc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9leHlub3Mtcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9leHlub3Mtcm5nLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCmluZGV4IGY5YmVlZDUuLjQzMjIzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL25vbWFkaWstcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL25vbWFkaWstcm5nLmMKaW5kZXggMjMyYjg3Zi4uMDBlOWQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9ub21hZGlrLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vbm9tYWRpay1ybmcuYwpAQCAtMTAsNyArMTAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29jdGVvbi1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCmluZGV4IGYyODg1ZGIuLmI1Y2MzNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKaW5kZXggMDNmNDE4OS4uYjdlZmQzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTYxLDcgKzYxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcG1pX3NtaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA5MmM1OTM3Li45MTc0MDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC05OSw2ICs5OSw5IEBACiAJc3NpemVfdCByZWFkLCBzejsKIAljaGFyICpwdHI7CiAKKwlpZiAocCAhPSAqcHBvcykKKwkJcmV0dXJuIDA7CisKIAlpZiAoIXZhbGlkX3BoeXNfYWRkcl9yYW5nZShwLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJlYWQgPSAwOwpAQCAtMTU3LDYgKzE2MCw5IEBACiAJdW5zaWduZWQgbG9uZyBjb3BpZWQ7CiAJdm9pZCAqcHRyOwogCisJaWYgKHAgIT0gKnBwb3MpCisJCXJldHVybiAtRUZCSUc7CisKIAlpZiAoIXZhbGlkX3BoeXNfYWRkcl9yYW5nZShwLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCmluZGV4IDg4MWM5ZTUuLjI4NzQwMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogY29uZF9yZXNjaGVkKCkgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jIGIvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCmluZGV4IDBlNTA2YmEuLmJkMzc3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYworKysgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGttYWxsb2MoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CQkvKiBldmVyeXRoaW5nLi4uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9pMmNfaW5maW5lb24uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19pbmZpbmVvbi5jCmluZGV4IDUyYjliMmIuLjQ3MmFmNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19pbmZpbmVvbi5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19pbmZpbmVvbi5jCkBAIC0yMSw3ICsyMSw2IEBACiAgKgogICoKICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9pMmNfc3RtX3N0MzMuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jCmluZGV4IDViMGRkOGUuLjNiN2JmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZwppbmRleCBjZDY5NTBmLi41MmU5MzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCkBAIC0xNDAsMyArMTQwLDUxIEBACiAJYm9vbAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFBlcmlvZCBJbnRlcnJ1cHQgVGltZXIgb24gRnJlZXNjYWxlIFZ5YnJpZCBGYW1pbHkgU29Dcy4KKworY29uZmlnIFNZU19TVVBQT1JUU19TSF9DTVQKKyAgICAgICAgYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX1NIX01UVTIKKyAgICAgICAgYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX1NIX1RNVQorICAgICAgICBib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfRU1fU1RJCisgICAgICAgIGJvb2wKKworY29uZmlnIFNIX1RJTUVSX0NNVAorCWJvb2wgIlJlbmVzYXMgQ01UIHRpbWVyIGRyaXZlciIgaWYgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBHRU5FUklDX0NMT0NLRVZFTlRTCisJZGVmYXVsdCBTWVNfU1VQUE9SVFNfU0hfQ01UCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIGEgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQgZHJpdmVyIGZvcgorCSAgdGhlIENvbXBhcmUgTWF0Y2ggVGltZXIgKENNVCkgaGFyZHdhcmUgYXZhaWxhYmxlIGluIDE2LzMyLzQ4LWJpdAorCSAgdmFyaWFudHMgb24gYSB3aWRlIHJhbmdlIG9mIE1vYmlsZSBhbmQgQXV0b21vdGl2ZSBTb0NzIGZyb20gUmVuZXNhcy4KKworY29uZmlnIFNIX1RJTUVSX01UVTIKKwlib29sICJSZW5lc2FzIE1UVTIgdGltZXIgZHJpdmVyIiBpZiBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlkZWZhdWx0IFNZU19TVVBQT1JUU19TSF9NVFUyCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIGEgY2xvY2tldmVudCBkcml2ZXIgZm9yIHRoZSBNdWx0aS1GdW5jdGlvbgorCSAgVGltZXIgUHVsc2UgVW5pdCAyIChUTVUyKSBoYXJkd2FyZSBhdmFpbGFibGUgb24gU29DcyBmcm9tIFJlbmVzYXMuCisJICBUaGlzIGhhcmR3YXJlIGNvbWVzIHdpdGggMTYgYml0LXRpbWVyIHJlZ2lzdGVycy4KKworY29uZmlnIFNIX1RJTUVSX1RNVQorCWJvb2wgIlJlbmVzYXMgVE1VIHRpbWVyIGRyaXZlciIgaWYgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBHRU5FUklDX0NMT0NLRVZFTlRTCisJZGVmYXVsdCBTWVNfU1VQUE9SVFNfU0hfVE1VCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIGEgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQgZHJpdmVyIGZvcgorCSAgdGhlIDMyLWJpdCBUaW1lciBVbml0IChUTVUpIGhhcmR3YXJlIGF2YWlsYWJsZSBvbiBhIHdpZGUgcmFuZ2UKKwkgIFNvQ3MgZnJvbSBSZW5lc2FzLgorCitjb25maWcgRU1fVElNRVJfU1RJCisJYm9vbCAiUmVuZXNhcyBTVEkgdGltZXIgZHJpdmVyIiBpZiBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlkZWZhdWx0IFNZU19TVVBQT1JUU19FTV9TVEkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgYSBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudCBkcml2ZXIgZm9yCisJICB0aGUgNDgtYml0IFN5c3RlbSBUaW1lciAoU1RJKSBoYXJkd2FyZSBhdmFpbGFibGUgb24gYSBTb0NzCisJICBzdWNoIGFzIEVNRVYyIGZyb20gZm9ybWVyIE5FQyBFbGVjdHJvbmljcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCmluZGV4IGM3Y2E1MGEuLmYzZmU0Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQpAQCAtMSw2ICsxLDUgQEAKIG9iai0kKENPTkZJR19DTEtTUkNfT0YpCSs9IGNsa3NyYy1vZi5vCiBvYmotJChDT05GSUdfQVRNRUxfVENCX0NMS1NSQykJKz0gdGNiX2Nsa3NyYy5vCi1vYmotJChDT05GSUdfWDg2X0NZQ0xPTkVfVElNRVIpCSs9IGN5Y2xvbmUubwogb2JqLSQoQ09ORklHX1g4Nl9QTV9USU1FUikJKz0gYWNwaV9wbS5vCiBvYmotJChDT05GSUdfU0N4MjAwSFJfVElNRVIpCSs9IHNjeDIwMF9ocnQubwogb2JqLSQoQ09ORklHX0NTNTUzNV9DTE9DS19FVkVOVF9TUkMpCSs9IGNzNTUzNS1jbG9ja2V2dC5vCkBAIC0yMSw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfQVJDSF9NT1hBUlQpCSs9IG1veGFydF90aW1lci5vCiBvYmotJChDT05GSUdfQVJDSF9NWFMpCQkrPSBteHNfdGltZXIubwogb2JqLSQoQ09ORklHX0FSQ0hfUFJJTUEyKQkrPSB0aW1lci1wcmltYTIubworb2JqLSQoQ09ORklHX0FSQ0hfVTMwMCkJCSs9IHRpbWVyLXUzMDAubwogb2JqLSQoQ09ORklHX1NVTjRJX1RJTUVSKQkrPSBzdW40aV90aW1lci5vCiBvYmotJChDT05GSUdfU1VONUlfSFNUSU1FUikJKz0gdGltZXItc3VuNWkubwogb2JqLSQoQ09ORklHX0FSQ0hfVEVHUkEpCSs9IHRlZ3JhMjBfdGltZXIubwpAQCAtMzcsMyArMzcsNCBAQAogb2JqLSQoQ09ORklHX0FSTV9HTE9CQUxfVElNRVIpCQkrPSBhcm1fZ2xvYmFsX3RpbWVyLm8KIG9iai0kKENPTkZJR19DTEtTUkNfTUVUQUdfR0VORVJJQykJKz0gbWV0YWdfZ2VuZXJpYy5vCiBvYmotJChDT05GSUdfQVJDSF9IQVNfVElDS19CUk9BRENBU1QpCSs9IGR1bW15X3RpbWVyLm8KK29iai0kKENPTkZJR19BUkNIX0tFWVNUT05FKQkJKz0gdGltZXIta2V5c3RvbmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCmluZGV4IDk1ZmI5NDQuLjU3ZTgyM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMKQEAgLTI3Nyw2ICsyNzcsNyBAQAogCQkJY2xrLT5zZXRfbmV4dF9ldmVudCA9IGFyY2hfdGltZXJfc2V0X25leHRfZXZlbnRfcGh5czsKIAkJfQogCX0gZWxzZSB7CisJCWNsay0+ZmVhdHVyZXMgfD0gQ0xPQ0tfRVZUX0ZFQVRfRFlOSVJROwogCQljbGstPm5hbWUgPSAiYXJjaF9tZW1fdGltZXIiOwogCQljbGstPnJhdGluZyA9IDQwMDsKIAkJY2xrLT5jcHVtYXNrID0gY3B1X2FsbF9tYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jYWRlbmNlX3R0Y190aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9jYWRlbmNlX3R0Y190aW1lci5jCmluZGV4IDYzZjE3NmQuLjQ5ZmJlMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvY2FkZW5jZV90dGNfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2NhZGVuY2VfdHRjX3RpbWVyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KQEAgLTUyLDYgKzUzLDggQEAKICNkZWZpbmUgVFRDX0NOVF9DTlRSTF9ESVNBQkxFX01BU0sJMHgxCiAKICNkZWZpbmUgVFRDX0NMS19DTlRSTF9DU1JDX01BU0sJCSgxIDw8IDUpCS8qIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBUVENfQ0xLX0NOVFJMX1BTVl9NQVNLCQkweDFlCisjZGVmaW5lIFRUQ19DTEtfQ05UUkxfUFNWX1NISUZUCQkxCiAKIC8qCiAgKiBTZXR1cCB0aGUgdGltZXJzIHRvIHVzZSBwcmUtc2NhbGluZywgdXNpbmcgYSBmaXhlZCB2YWx1ZSBmb3Igbm93IHRoYXQgd2lsbApAQCAtNjMsNiArNjYsOCBAQAogI2RlZmluZSBDTEtfQ05UUkxfUFJFU0NBTEVfRU4JMQogI2RlZmluZSBDTlRfQ05UUkxfUkVTRVQJCSgxIDw8IDQpCiAKKyNkZWZpbmUgTUFYX0ZfRVJSIDUwCisKIC8qKgogICogc3RydWN0IHR0Y190aW1lciAtIFRoaXMgZGVmaW5pdGlvbiBkZWZpbmVzIGxvY2FsIHRpbWVyIHN0cnVjdHVyZQogICoKQEAgLTgyLDYgKzg3LDggQEAKIAkJY29udGFpbmVyX29mKHgsIHN0cnVjdCB0dGNfdGltZXIsIGNsa19yYXRlX2NoYW5nZV9uYikKIAogc3RydWN0IHR0Y190aW1lcl9jbG9ja3NvdXJjZSB7CisJdTMyCQkJc2NhbGVfY2xrX2N0cmxfcmVnX29sZDsKKwl1MzIJCQlzY2FsZV9jbGtfY3RybF9yZWdfbmV3OwogCXN0cnVjdCB0dGNfdGltZXIJdHRjOwogCXN0cnVjdCBjbG9ja3NvdXJjZQljczsKIH07CkBAIC0yMjksMzIgKzIzNiw4OSBAQAogCQkJc3RydWN0IHR0Y190aW1lcl9jbG9ja3NvdXJjZSwgdHRjKTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFBPU1RfUkFURV9DSEFOR0U6Ci0JCS8qCi0JCSAqIERvIHdoYXRldmVyIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBhIHByb3BlciB0aW1lIGJhc2UKLQkJICoKLQkJICogSSBjYW5ub3QgZmluZCBhIHdheSB0byBhZGp1c3QgdGhlIGN1cnJlbnRseSB1c2VkIGNsb2Nrc291cmNlCi0JCSAqIHRvIHRoZSBuZXcgZnJlcXVlbmN5LiBfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfaHooKSBzb3VuZHMKLQkJICogZ29vZCwgYnV0IGRvZXMgbm90IHdvcmsuIE5vdCBzdXJlIHdoYXQncyB0aGF0IG1pc3NpbmcuCi0JCSAqCi0JCSAqIFRoaXMgYXBwcm9hY2ggd29ya3MsIGJ1dCB0cmlnZ2VycyB0d28gY2xvY2tzb3VyY2Ugc3dpdGNoZXMuCi0JCSAqIFRoZSBmaXJzdCBhZnRlciB1bnJlZ2lzdGVyIHRvIGNsb2Nrc291cmNlIGppZmZpZXMuIEFuZAotCQkgKiBhbm90aGVyIG9uZSBhZnRlciB0aGUgcmVnaXN0ZXIgdG8gdGhlIG5ld2x5IHJlZ2lzdGVyZWQgdGltZXIuCi0JCSAqCi0JCSAqIEFsdGVybmF0aXZlbHkgd2UgY291bGQgJ3dhc3RlJyBhbm90aGVyIEhXIHRpbWVyIHRvIHBpbmcgcG9uZwotCQkgKiBiZXR3ZWVuIGNsb2NrIHNvdXJjZXMuIFRoYXQgd291bGQgYWxzbyB1c2Ugb25lIHJlZ2lzdGVyIGFuZAotCQkgKiBvbmUgdW5yZWdpc3RlciBjYWxsLCBidXQgb25seSB0cmlnZ2VyIG9uZSBjbG9ja3NvdXJjZSBzd2l0Y2gKLQkJICogZm9yIHRoZSBjb3N0IG9mIGFub3RoZXIgSFcgdGltZXIgdXNlZCBieSB0aGUgT1MuCi0JCSAqLwotCQljbG9ja3NvdXJjZV91bnJlZ2lzdGVyKCZ0dGNjcy0+Y3MpOwotCQljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmdHRjY3MtPmNzLAotCQkJCW5kYXRhLT5uZXdfcmF0ZSAvIFBSRVNDQUxFKTsKLQkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBQUkVfUkFURV9DSEFOR0U6CisJeworCQl1MzIgcHN2OworCQl1bnNpZ25lZCBsb25nIGZhY3RvciwgcmF0ZV9sb3csIHJhdGVfaGlnaDsKKworCQlpZiAobmRhdGEtPm5ld19yYXRlID4gbmRhdGEtPm9sZF9yYXRlKSB7CisJCQlmYWN0b3IgPSBESVZfUk9VTkRfQ0xPU0VTVChuZGF0YS0+bmV3X3JhdGUsCisJCQkJCW5kYXRhLT5vbGRfcmF0ZSk7CisJCQlyYXRlX2xvdyA9IG5kYXRhLT5vbGRfcmF0ZTsKKwkJCXJhdGVfaGlnaCA9IG5kYXRhLT5uZXdfcmF0ZTsKKwkJfSBlbHNlIHsKKwkJCWZhY3RvciA9IERJVl9ST1VORF9DTE9TRVNUKG5kYXRhLT5vbGRfcmF0ZSwKKwkJCQkJbmRhdGEtPm5ld19yYXRlKTsKKwkJCXJhdGVfbG93ID0gbmRhdGEtPm5ld19yYXRlOworCQkJcmF0ZV9oaWdoID0gbmRhdGEtPm9sZF9yYXRlOworCQl9CisKKwkJaWYgKCFpc19wb3dlcl9vZl8yKGZhY3RvcikpCisJCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwkJaWYgKGFicyhyYXRlX2hpZ2ggLSAoZmFjdG9yICogcmF0ZV9sb3cpKSA+IE1BWF9GX0VSUikKKwkJCXJldHVybiBOT1RJRllfQkFEOworCisJCWZhY3RvciA9IF9faWxvZzJfdTMyKGZhY3Rvcik7CisKKwkJLyoKKwkJICogc3RvcmUgdGltZXIgY2xvY2sgY3RybCByZWdpc3RlciBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBpbiBjYXNlCisJCSAqIG9mIGFuIGFib3J0LgorCQkgKi8KKwkJdHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19vbGQgPQorCQkJX19yYXdfcmVhZGwodHRjY3MtPnR0Yy5iYXNlX2FkZHIgKworCQkJCQlUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisKKwkJcHN2ID0gKHR0Y2NzLT5zY2FsZV9jbGtfY3RybF9yZWdfb2xkICYKKwkJCQlUVENfQ0xLX0NOVFJMX1BTVl9NQVNLKSA+PgorCQkJCVRUQ19DTEtfQ05UUkxfUFNWX1NISUZUOworCQlpZiAobmRhdGEtPm5ld19yYXRlIDwgbmRhdGEtPm9sZF9yYXRlKQorCQkJcHN2IC09IGZhY3RvcjsKKwkJZWxzZQorCQkJcHN2ICs9IGZhY3RvcjsKKworCQkvKiBwcmVzY2FsZXIgd2l0aGluIGxlZ2FsIHJhbmdlPyAqLworCQlpZiAocHN2ICYgfihUVENfQ0xLX0NOVFJMX1BTVl9NQVNLID4+IFRUQ19DTEtfQ05UUkxfUFNWX1NISUZUKSkKKwkJCXJldHVybiBOT1RJRllfQkFEOworCisJCXR0Y2NzLT5zY2FsZV9jbGtfY3RybF9yZWdfbmV3ID0gdHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19vbGQgJgorCQkJflRUQ19DTEtfQ05UUkxfUFNWX01BU0s7CisJCXR0Y2NzLT5zY2FsZV9jbGtfY3RybF9yZWdfbmV3IHw9IHBzdiA8PCBUVENfQ0xLX0NOVFJMX1BTVl9TSElGVDsKKworCisJCS8qIHNjYWxlIGRvd246IGFkanVzdCBkaXZpZGVyIGluIHBvc3QtY2hhbmdlIG5vdGlmaWNhdGlvbiAqLworCQlpZiAobmRhdGEtPm5ld19yYXRlIDwgbmRhdGEtPm9sZF9yYXRlKQorCQkJcmV0dXJuIE5PVElGWV9ET05FOworCisJCS8qIHNjYWxlIHVwOiBhZGp1c3QgZGl2aWRlciBub3cgLSBiZWZvcmUgZnJlcXVlbmN5IGNoYW5nZSAqLworCQlfX3Jhd193cml0ZWwodHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19uZXcsCisJCQkJdHRjY3MtPnR0Yy5iYXNlX2FkZHIgKyBUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisJCWJyZWFrOworCX0KKwljYXNlIFBPU1RfUkFURV9DSEFOR0U6CisJCS8qIHNjYWxlIHVwOiBwcmUtY2hhbmdlIG5vdGlmaWNhdGlvbiBkaWQgdGhlIGFkanVzdG1lbnQgKi8KKwkJaWYgKG5kYXRhLT5uZXdfcmF0ZSA+IG5kYXRhLT5vbGRfcmF0ZSkKKwkJCXJldHVybiBOT1RJRllfT0s7CisKKwkJLyogc2NhbGUgZG93bjogYWRqdXN0IGRpdmlkZXIgbm93IC0gYWZ0ZXIgZnJlcXVlbmN5IGNoYW5nZSAqLworCQlfX3Jhd193cml0ZWwodHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19uZXcsCisJCQkJdHRjY3MtPnR0Yy5iYXNlX2FkZHIgKyBUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisJCWJyZWFrOworCiAJY2FzZSBBQk9SVF9SQVRFX0NIQU5HRToKKwkJLyogd2UgaGF2ZSB0byB1bmRvIHRoZSBhZGp1c3RtZW50IGluIGNhc2Ugd2Ugc2NhbGUgdXAgKi8KKwkJaWYgKG5kYXRhLT5uZXdfcmF0ZSA8IG5kYXRhLT5vbGRfcmF0ZSkKKwkJCXJldHVybiBOT1RJRllfT0s7CisKKwkJLyogcmVzdG9yZSBvcmlnaW5hbCByZWdpc3RlciB2YWx1ZSAqLworCQlfX3Jhd193cml0ZWwodHRjY3MtPnNjYWxlX2Nsa19jdHJsX3JlZ19vbGQsCisJCQkJdHRjY3MtPnR0Yy5iYXNlX2FkZHIgKyBUVENfQ0xLX0NOVFJMX09GRlNFVCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWRlZmF1bHQ6CiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0dGNfc2V0dXBfY2xvY2tzb3VyY2Uoc3RydWN0IGNsayAqY2xrLCB2b2lkIF9faW9tZW0gKmJhc2UpCkBAIC0zMjEsMjUgKzM4NSwxMiBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgUE9TVF9SQVRFX0NIQU5HRToKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJLyoKLQkJICogY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIElSUSBkaXNhYmxlZCBvbgotCQkgKiB0aGUgQ1BVIHRoZSB0aW1lciBwcm92aWRlcyBldmVudHMgZm9yLiBUaGUgdGltZXIgd2UgdXNlIGlzCi0JCSAqIGNvbW1vbiB0byBib3RoIENQVXMsIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gcnVuIG9uIGJvdGgKLQkJICogY29yZXMuCi0JCSAqLwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWNsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKCZ0dGNjZS0+Y2UsCi0JCQkJbmRhdGEtPm5ld19yYXRlIC8gUFJFU0NBTEUpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KIAkJLyogdXBkYXRlIGNhY2hlZCBmcmVxdWVuY3kgKi8KIAkJdHRjLT5mcmVxID0gbmRhdGEtPm5ld19yYXRlOwogCisJCWNsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKCZ0dGNjZS0+Y2UsIG5kYXRhLT5uZXdfcmF0ZSAvIFBSRVNDQUxFKTsKKwogCQkvKiBmYWxsIHRocm91Z2ggKi8KLQl9CiAJY2FzZSBQUkVfUkFURV9DSEFOR0U6CiAJY2FzZSBBQk9SVF9SQVRFX0NIQU5HRToKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwOTk4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoX3RpbWVyLmg+Ci0KLSNkZWZpbmUgQ1lDTE9ORV9DQkFSX0FERFIJMHhGRUIwMENEMAkvKiBiYXNlIGFkZHJlc3MgcHRyICovCi0jZGVmaW5lIENZQ0xPTkVfUE1DQ19PRkZTRVQJMHg1MUEwCQkvKiBvZmZzZXQgdG8gY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBDWUNMT05FX01QQ1NfT0ZGU0VUCTB4NTFBOAkJLyogb2Zmc2V0IHRvIHNlbGVjdCByZWdpc3RlciAqLwotI2RlZmluZSBDWUNMT05FX01QTUNfT0ZGU0VUCTB4NTFEMAkJLyogb2Zmc2V0IHRvIGNvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIENZQ0xPTkVfVElNRVJfRlJFUQk5OTc4MDAwMAkvKiAxMDBNaHosIGJ1dCBub3QgcmVhbGx5ICovCi0jZGVmaW5lIENZQ0xPTkVfVElNRVJfTUFTSwlDTE9DS1NPVVJDRV9NQVNLKDMyKSAvKiAzMiBiaXQgbWFzayAqLwotCi1pbnQgdXNlX2N5Y2xvbmUgPSAwOwotc3RhdGljIHZvaWQgX19pb21lbSAqY3ljbG9uZV9wdHI7Ci0KLXN0YXRpYyBjeWNsZV90IHJlYWRfY3ljbG9uZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCXJldHVybiAoY3ljbGVfdClyZWFkbChjeWNsb25lX3B0cik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfY3ljbG9uZSA9IHsKLQkubmFtZQkJPSAiY3ljbG9uZSIsCi0JLnJhdGluZwkJPSAyNTAsCi0JLnJlYWQJCT0gcmVhZF9jeWNsb25lLAotCS5tYXNrCQk9IENZQ0xPTkVfVElNRVJfTUFTSywKLQkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2N5Y2xvbmVfY2xvY2tzb3VyY2Uodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGJhc2U7CS8qIHNhdmVkIHZhbHVlIGZyb20gQ0JBUiAqLwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXUzMiBfX2lvbWVtKiB2b2xhdGlsZSBjeWNsb25lX3RpbWVyOwkvKiBDeWNsb25lIE1QTUMwIHJlZ2lzdGVyICovCi0JdTMyIF9faW9tZW0qIHJlZzsKLQlpbnQgaTsKLQotCS8qIG1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHN1bW1pdCBib3g6ICovCi0JaWYgKCF1c2VfY3ljbG9uZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJTdW1taXQgY2hpcHNldDogU3RhcnRpbmcgQ3ljbG9uZSBDb3VudGVyLlxuIik7Ci0KLQkvKiBmaW5kIGJhc2UgYWRkcmVzczogKi8KLQlvZmZzZXQgPSBDWUNMT05FX0NCQVJfQUREUjsKLQlyZWcgPSBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YocmVnKSk7Ci0JaWYgKCFyZWcpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiByZWdpc3Rlci5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JLyogZXZlbiBvbiA2NGJpdCBzeXN0ZW1zLCB0aGlzIGlzIG9ubHkgMzJiaXRzOiAqLwotCWJhc2UgPSByZWFkbChyZWcpOwotCWlvdW5tYXAocmVnKTsKLQlpZiAoIWJhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiB2YWx1ZS5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBzZXR1cCBQTUNDOiAqLwotCW9mZnNldCA9IGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUOwotCXJlZyA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZihyZWcpKTsKLQlpZiAoIXJlZykgewotCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBQTUNDIHJlZ2lzdGVyLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQl3cml0ZWwoMHgwMDAwMDAwMSxyZWcpOwotCWlvdW5tYXAocmVnKTsKLQotCS8qIHNldHVwIE1QQ1M6ICovCi0Jb2Zmc2V0ID0gYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQ7Ci0JcmVnID0gaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZW9mKHJlZykpOwotCWlmICghcmVnKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIE1QQ1MgcmVnaXN0ZXIuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXdyaXRlbCgweDAwMDAwMDAxLHJlZyk7Ci0JaW91bm1hcChyZWcpOwotCi0JLyogbWFwIGluIGN5Y2xvbmVfdGltZXI6ICovCi0Jb2Zmc2V0ID0gYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQ7Ci0JY3ljbG9uZV90aW1lciA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZih1NjQpKTsKLQlpZiAoIWN5Y2xvbmVfdGltZXIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgTVBNQyByZWdpc3Rlci5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBxdWljayB0ZXN0IHRvIG1ha2Ugc3VyZSBpdHMgdGlja2luZzogKi8KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKXsKLQkJdTMyIG9sZCA9IHJlYWRsKGN5Y2xvbmVfdGltZXIpOwotCQlpbnQgc3RhbGwgPSAxMDA7Ci0KLQkJd2hpbGUgKHN0YWxsLS0pCi0JCQliYXJyaWVyKCk7Ci0KLQkJaWYgKHJlYWRsKGN5Y2xvbmVfdGltZXIpID09IG9sZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bnRlciBub3QgY291bnRpbmchIERJU0FCTEVEXG4iKTsKLQkJCWlvdW5tYXAoY3ljbG9uZV90aW1lcik7Ci0JCQljeWNsb25lX3RpbWVyID0gTlVMTDsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCWN5Y2xvbmVfcHRyID0gY3ljbG9uZV90aW1lcjsKLQotCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfY3ljbG9uZSwKLQkJCQkJQ1lDTE9ORV9USU1FUl9GUkVRKTsKLX0KLQotYXJjaF9pbml0Y2FsbChpbml0X2N5Y2xvbmVfY2xvY2tzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9leHlub3NfbWN0LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2V4eW5vc19tY3QuYwppbmRleCA0OGY3NmJjLi5jMmUzOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2V4eW5vc19tY3QuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2V4eW5vc19tY3QuYwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJbWV2dCA9IGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlLCBldnQpOwogCiAJbWV2dC0+YmFzZSA9IEVYWU5PUzRfTUNUX0xfQkFTRShjcHUpOwotCXNwcmludGYobWV2dC0+bmFtZSwgIm1jdF90aWNrJWQiLCBjcHUpOworCXNucHJpbnRmKG1ldnQtPm5hbWUsIHNpemVvZihtZXZ0LT5uYW1lKSwgIm1jdF90aWNrJWQiLCBjcHUpOwogCiAJZXZ0LT5uYW1lID0gbWV2dC0+bmFtZTsKIAlldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMKaW5kZXggYmY0OTdhZi4uZWZiMTdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zdW40aV90aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYwpAQCAtMTk2LDUgKzE5Niw1IEBACiAJY2xvY2tldmVudHNfY29uZmlnX2FuZF9yZWdpc3Rlcigmc3VuNGlfY2xvY2tldmVudCwgcmF0ZSwKIAkJCQkJVElNRVJfU1lOQ19USUNLUywgMHhmZmZmZmZmZik7CiB9Ci1DTE9DS1NPVVJDRV9PRl9ERUNMQVJFKHN1bjRpLCAiYWxsd2lubmVyLHN1bjRpLXRpbWVyIiwKK0NMT0NLU09VUkNFX09GX0RFQ0xBUkUoc3VuNGksICJhbGx3aW5uZXIsc3VuNGktYTEwLXRpbWVyIiwKIAkJICAgICAgIHN1bjRpX3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1hcm1hZGEtMzcwLXhwLmMKaW5kZXggZWU4NjkxYi4uMDQ1MWU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtYXJtYWRhLTM3MC14cC5jCkBAIC04NSwxMiArODUsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBfX3BlcmNwdSAqYXJtYWRhXzM3MF94cF9ldnQ7CiAKLXN0YXRpYyB2b2lkIHRpbWVyX2N0cmxfY2xyc2V0KHUzMiBjbHIsIHUzMiBzZXQpCi17Ci0Jd3JpdGVsKChyZWFkbCh0aW1lcl9iYXNlICsgVElNRVJfQ1RSTF9PRkYpICYgfmNscikgfCBzZXQsCi0JCXRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMX09GRik7Ci19Ci0KIHN0YXRpYyB2b2lkIGxvY2FsX3RpbWVyX2N0cmxfY2xyc2V0KHUzMiBjbHIsIHUzMiBzZXQpCiB7CiAJd3JpdGVsKChyZWFkbChsb2NhbF9iYXNlICsgVElNRVJfQ1RSTF9PRkYpICYgfmNscikgfCBzZXQsCkBAIC0yNDUsNyArMjM5LDcgQEAKIAkJY2xyID0gVElNRVIwXzI1TUhaOwogCQllbmFibGVfbWFzayA9IFRJTUVSMF9FTiB8IFRJTUVSMF9ESVYoVElNRVJfRElWSURFUl9TSElGVCk7CiAJfQotCXRpbWVyX2N0cmxfY2xyc2V0KGNsciwgc2V0KTsKKwlhdG9taWNfaW9fbW9kaWZ5KHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMX09GRiwgY2xyIHwgc2V0LCBzZXQpOwogCWxvY2FsX3RpbWVyX2N0cmxfY2xyc2V0KGNsciwgc2V0KTsKIAogCS8qCkBAIC0yNjMsNyArMjU3LDkgQEAKIAl3cml0ZWwoMHhmZmZmZmZmZiwgdGltZXJfYmFzZSArIFRJTUVSMF9WQUxfT0ZGKTsKIAl3cml0ZWwoMHhmZmZmZmZmZiwgdGltZXJfYmFzZSArIFRJTUVSMF9SRUxPQURfT0ZGKTsKIAotCXRpbWVyX2N0cmxfY2xyc2V0KDAsIFRJTUVSMF9SRUxPQURfRU4gfCBlbmFibGVfbWFzayk7CisJYXRvbWljX2lvX21vZGlmeSh0aW1lcl9iYXNlICsgVElNRVJfQ1RSTF9PRkYsCisJCVRJTUVSMF9SRUxPQURfRU4gfCBlbmFibGVfbWFzaywKKwkJVElNRVIwX1JFTE9BRF9FTiB8IGVuYWJsZV9tYXNrKTsKIAogCS8qCiAJICogU2V0IHNjYWxlIGFuZCB0aW1lciBmb3Igc2NoZWRfY2xvY2suCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtb3Jpb24uYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1vcmlvbi5jCmluZGV4IDIwMDY2MjIuLjBiM2NlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1vcmlvbi5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1vcmlvbi5jCkBAIC0zNSwyMCArMzUsNiBAQAogI2RlZmluZSBPUklPTl9PTkVTSE9UX01BWAkweGZmZmZmZmZlCiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnRpbWVyX2Jhc2U7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRpbWVyX2N0cmxfbG9jayk7Ci0KLS8qCi0gKiBUaHJlYWQtc2FmZSBhY2Nlc3MgdG8gVElNRVJfQ1RSTCByZWdpc3RlcgotICogKHNoYXJlZCB3aXRoIHdhdGNoZG9nIHRpbWVyKQotICovCi12b2lkIG9yaW9uX3RpbWVyX2N0cmxfY2xyc2V0KHUzMiBjbHIsIHUzMiBzZXQpCi17Ci0Jc3Bpbl9sb2NrKCZ0aW1lcl9jdHJsX2xvY2spOwotCXdyaXRlbCgocmVhZGwodGltZXJfYmFzZSArIFRJTUVSX0NUUkwpICYgfmNscikgfCBzZXQsCi0JCXRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMKTsKLQlzcGluX3VubG9jaygmdGltZXJfY3RybF9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0wob3Jpb25fdGltZXJfY3RybF9jbHJzZXQpOwogCiAvKgogICogRnJlZS1ydW5uaW5nIGNsb2Nrc291cmNlIGhhbmRsaW5nLgpAQCAtNjgsNyArNTQsOCBAQAogewogCS8qIHNldHVwIGFuZCBlbmFibGUgb25lLXNob3QgdGltZXIgKi8KIAl3cml0ZWwoZGVsdGEsIHRpbWVyX2Jhc2UgKyBUSU1FUjFfVkFMKTsKLQlvcmlvbl90aW1lcl9jdHJsX2NscnNldChUSU1FUjFfUkVMT0FEX0VOLCBUSU1FUjFfRU4pOworCWF0b21pY19pb19tb2RpZnkodGltZXJfYmFzZSArIFRJTUVSX0NUUkwsCisJCVRJTUVSMV9SRUxPQURfRU4gfCBUSU1FUjFfRU4sIFRJTUVSMV9FTik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgwLDEwICs2NywxMyBAQAogCQkvKiBzZXR1cCBhbmQgZW5hYmxlIHBlcmlvZGljIHRpbWVyIGF0IDEvSFogaW50ZXJ2YWxzICovCiAJCXdyaXRlbCh0aWNrc19wZXJfamlmZnkgLSAxLCB0aW1lcl9iYXNlICsgVElNRVIxX1JFTE9BRCk7CiAJCXdyaXRlbCh0aWNrc19wZXJfamlmZnkgLSAxLCB0aW1lcl9iYXNlICsgVElNRVIxX1ZBTCk7Ci0JCW9yaW9uX3RpbWVyX2N0cmxfY2xyc2V0KDAsIFRJTUVSMV9SRUxPQURfRU4gfCBUSU1FUjFfRU4pOworCQlhdG9taWNfaW9fbW9kaWZ5KHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMLAorCQkJVElNRVIxX1JFTE9BRF9FTiB8IFRJTUVSMV9FTiwKKwkJCVRJTUVSMV9SRUxPQURfRU4gfCBUSU1FUjFfRU4pOwogCX0gZWxzZSB7CiAJCS8qIGRpc2FibGUgdGltZXIgKi8KLQkJb3Jpb25fdGltZXJfY3RybF9jbHJzZXQoVElNRVIxX1JFTE9BRF9FTiB8IFRJTUVSMV9FTiwgMCk7CisJCWF0b21pY19pb19tb2RpZnkodGltZXJfYmFzZSArIFRJTUVSX0NUUkwsCisJCQlUSU1FUjFfUkVMT0FEX0VOIHwgVElNRVIxX0VOLCAwKTsKIAl9CiB9CiAKQEAgLTEzMSw3ICsxMjEsOSBAQAogCS8qIHNldHVwIHRpbWVyMCBhcyBmcmVlLXJ1bm5pbmcgY2xvY2tzb3VyY2UgKi8KIAl3cml0ZWwofjAsIHRpbWVyX2Jhc2UgKyBUSU1FUjBfVkFMKTsKIAl3cml0ZWwofjAsIHRpbWVyX2Jhc2UgKyBUSU1FUjBfUkVMT0FEKTsKLQlvcmlvbl90aW1lcl9jdHJsX2NscnNldCgwLCBUSU1FUjBfUkVMT0FEX0VOIHwgVElNRVIwX0VOKTsKKwlhdG9taWNfaW9fbW9kaWZ5KHRpbWVyX2Jhc2UgKyBUSU1FUl9DVFJMLAorCQlUSU1FUjBfUkVMT0FEX0VOIHwgVElNRVIwX0VOLAorCQlUSU1FUjBfUkVMT0FEX0VOIHwgVElNRVIwX0VOKTsKIAljbG9ja3NvdXJjZV9tbWlvX2luaXQodGltZXJfYmFzZSArIFRJTUVSMF9WQUwsICJvcmlvbl9jbG9ja3NvdXJjZSIsCiAJCQkgICAgICBjbGtfZ2V0X3JhdGUoY2xrKSwgMzAwLCAzMiwKIAkJCSAgICAgIGNsb2Nrc291cmNlX21taW9fcmVhZGxfZG93bik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWtleXN0b25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWtleXN0b25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1MDM1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXIta2V5c3RvbmUuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIEtleXN0b25lIGJyb2FkY2FzdCBjbG9jay1ldmVudAorICoKKyAqIENvcHlyaWdodCAyMDEzIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBJdmFuIEtob3JvbnpodWsgPGl2YW4ua2hvcm9uemh1a0B0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2RlZmluZSBUSU1FUl9OQU1FCQkJInRpbWVyLWtleXN0b25lIgorCisvKiBUaW1lciByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFRJTTEyCQkJCTB4MTAKKyNkZWZpbmUgVElNMzQJCQkJMHgxNAorI2RlZmluZSBQUkQxMgkJCQkweDE4CisjZGVmaW5lIFBSRDM0CQkJCTB4MWMKKyNkZWZpbmUgVENSCQkJCTB4MjAKKyNkZWZpbmUgVEdDUgkJCQkweDI0CisjZGVmaW5lIElOVENUTFNUQVQJCQkweDQ0CisKKy8qIFRpbWVyIHJlZ2lzdGVyIGJpdGZpZWxkcyAqLworI2RlZmluZSBUQ1JfRU5BTU9ERV9NQVNLCQkweEMwCisjZGVmaW5lIFRDUl9FTkFNT0RFX09ORVNIT1RfTUFTSwkweDQwCisjZGVmaW5lIFRDUl9FTkFNT0RFX1BFUklPRElDX01BU0sJMHg4MAorCisjZGVmaW5lIFRHQ1JfVElNX1VOUkVTRVRfTUFTSwkJMHgwMworI2RlZmluZSBJTlRDVExTVEFUX0VOSU5UX01BU0sJCTB4MDEKKworLyoqCisgKiBzdHJ1Y3Qga2V5c3RvbmVfdGltZXI6IGhvbGRzIHRpbWVyJ3MgZGF0YQorICogQGJhc2U6IHRpbWVyIG1lbW9yeSBiYXNlIGFkZHJlc3MKKyAqIEBoel9wZXJpb2Q6IGN5Y2xlcyBwZXIgSFogcGVyaW9kCisgKiBAZXZlbnRfZGV2OiBldmVudCBkZXZpY2UgYmFzZWQgb24gdGltZXIKKyAqLworc3RhdGljIHN0cnVjdCBrZXlzdG9uZV90aW1lciB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXVuc2lnbmVkIGxvbmcgaHpfcGVyaW9kOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgZXZlbnRfZGV2OworfSB0aW1lcjsKKworc3RhdGljIGlubGluZSB1MzIga2V5c3RvbmVfdGltZXJfcmVhZGwodW5zaWduZWQgbG9uZyByZykKK3sKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZCh0aW1lci5iYXNlICsgcmcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga2V5c3RvbmVfdGltZXJfd3JpdGVsKHUzMiB2YWwsIHVuc2lnbmVkIGxvbmcgcmcpCit7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCB0aW1lci5iYXNlICsgcmcpOworfQorCisvKioKKyAqIGtleXN0b25lX3RpbWVyX2JhcnJpZXI6IHdyaXRlIG1lbW9yeSBiYXJyaWVyCisgKiB1c2UgZXhwbGljaXQgYmFycmllciB0byBhdm9pZCB1c2luZyByZWFkbC93cml0ZWwgbm9uIHJlbGF4ZWQgZnVuY3Rpb24KKyAqIHZhcmlhbnRzLCBiZWNhdXNlIGluIG91ciBjYXNlIG5vbiByZWxheGVkIHZhcmlhbnRzIGhpZGUgdGhlIHRydWUgcGxhY2VzCisgKiB3aGVyZSBiYXJyaWVyIGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGtleXN0b25lX3RpbWVyX2JhcnJpZXIodm9pZCkKK3sKKwlfX2lvd21iKCk7Cit9CisKKy8qKgorICoga2V5c3RvbmVfdGltZXJfY29uZmlnOiBjb25maWd1cmVzIHRpbWVyIHRvIHdvcmsgaW4gb25lc2hvdC9wZXJpb2RpYyBtb2Rlcy4KKyAqIEAgbW9kZTogbW9kZSB0byBjb25maWd1cmUKKyAqIEAgcGVyaW9kOiBjeWNsZXMgbnVtYmVyIHRvIGNvbmZpZ3VyZSBmb3IKKyAqLworc3RhdGljIGludCBrZXlzdG9uZV90aW1lcl9jb25maWcodTY0IHBlcmlvZCwgZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUpCit7CisJdTMyIHRjcjsKKwl1MzIgb2ZmOworCisJdGNyID0ga2V5c3RvbmVfdGltZXJfcmVhZGwoVENSKTsKKwlvZmYgPSB0Y3IgJiB+KFRDUl9FTkFNT0RFX01BU0spOworCisJLyogc2V0IGVuYWJsZSBtb2RlICovCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQl0Y3IgfD0gVENSX0VOQU1PREVfT05FU0hPVF9NQVNLOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQl0Y3IgfD0gVENSX0VOQU1PREVfUEVSSU9ESUNfTUFTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRpc2FibGUgdGltZXIgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwob2ZmLCBUQ1IpOworCS8qIGhlcmUgd2UgaGF2ZSB0byBiZSBzdXJlIHRoZSB0aW1lciBoYXMgYmVlbiBkaXNhYmxlZCAqLworCWtleXN0b25lX3RpbWVyX2JhcnJpZXIoKTsKKworCS8qIHJlc2V0IGNvdW50ZXIgdG8gemVybywgc2V0IG5ldyBwZXJpb2QgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoMCwgVElNMTIpOworCWtleXN0b25lX3RpbWVyX3dyaXRlbCgwLCBUSU0zNCk7CisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKHBlcmlvZCAmIDB4ZmZmZmZmZmYsIFBSRDEyKTsKKwlrZXlzdG9uZV90aW1lcl93cml0ZWwocGVyaW9kID4+IDMyLCBQUkQzNCk7CisKKwkvKgorCSAqIGVuYWJsZSB0aW1lcgorCSAqIGhlcmUgd2UgaGF2ZSB0byBiZSBzdXJlIHRoYXQgQ05UTE8sIENOVEhJLCBQUkRMTywgUFJESEkgcmVnaXN0ZXJzCisJICogaGF2ZSBiZWVuIHdyaXR0ZW4uCisJICovCisJa2V5c3RvbmVfdGltZXJfYmFycmllcigpOworCWtleXN0b25lX3RpbWVyX3dyaXRlbCh0Y3IsIFRDUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtleXN0b25lX3RpbWVyX2Rpc2FibGUodm9pZCkKK3sKKwl1MzIgdGNyOworCisJdGNyID0ga2V5c3RvbmVfdGltZXJfcmVhZGwoVENSKTsKKworCS8qIGRpc2FibGUgdGltZXIgKi8KKwl0Y3IgJj0gfihUQ1JfRU5BTU9ERV9NQVNLKTsKKwlrZXlzdG9uZV90aW1lcl93cml0ZWwodGNyLCBUQ1IpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qga2V5c3RvbmVfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBkZXZfaWQ7CisKKwlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQga2V5c3RvbmVfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCisJCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJcmV0dXJuIGtleXN0b25lX3RpbWVyX2NvbmZpZyhjeWNsZXMsIGV2dC0+bW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGtleXN0b25lX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJa2V5c3RvbmVfdGltZXJfY29uZmlnKHRpbWVyLmh6X3BlcmlvZCwgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJa2V5c3RvbmVfdGltZXJfZGlzYWJsZSgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBrZXlzdG9uZV90aW1lcl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZlbnRfZGV2ID0gJnRpbWVyLmV2ZW50X2RldjsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJc3RydWN0IGNsayAqY2xrOworCWludCBpcnEsIGVycm9yOworCisJaXJxICA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlpZiAoaXJxID09IE5PX0lSUSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFwIGludGVycnVwdHNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXRpbWVyLmJhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCF0aW1lci5iYXNlKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjbG9ja1xuIiwgX19mdW5jX18pOworCQlpb3VubWFwKHRpbWVyLmJhc2UpOworCQlyZXR1cm47CisJfQorCisJZXJyb3IgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBjbG9ja1xuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlyYXRlID0gY2xrX2dldF9yYXRlKGNsayk7CisKKwkvKiBkaXNhYmxlLCB1c2UgaW50ZXJuYWwgY2xvY2sgc291cmNlICovCisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKDAsIFRDUik7CisJLyogaGVyZSB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhlIHRpbWVyIGhhcyBiZWVuIGRpc2FibGVkICovCisJa2V5c3RvbmVfdGltZXJfYmFycmllcigpOworCisJLyogcmVzZXQgdGltZXIgYXMgNjQtYml0LCBubyBwcmUtc2NhbGVyLCBwbHVzIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCAqLworCWtleXN0b25lX3RpbWVyX3dyaXRlbCgwLCBUR0NSKTsKKworCS8qIHVucmVzZXQgdGltZXIgKi8KKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoVEdDUl9USU1fVU5SRVNFVF9NQVNLLCBUR0NSKTsKKworCS8qIGluaXQgY291bnRlciB0byB6ZXJvICovCisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKDAsIFRJTTEyKTsKKwlrZXlzdG9uZV90aW1lcl93cml0ZWwoMCwgVElNMzQpOworCisJdGltZXIuaHpfcGVyaW9kID0gRElWX1JPVU5EX1VQKHJhdGUsIEhaKTsKKworCS8qIGVuYWJsZSB0aW1lciBpbnRlcnJ1cHRzICovCisJa2V5c3RvbmVfdGltZXJfd3JpdGVsKElOVENUTFNUQVRfRU5JTlRfTUFTSywgSU5UQ1RMU1RBVCk7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwga2V5c3RvbmVfdGltZXJfaW50ZXJydXB0LCBJUlFGX1RJTUVSLAorCQkJICAgIFRJTUVSX05BTUUsIGV2ZW50X2Rldik7CisJaWYgKGVycm9yKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXR1cCBpcnFcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogc2V0dXAgY2xvY2tldmVudCAqLworCWV2ZW50X2Rldi0+ZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7CisJZXZlbnRfZGV2LT5zZXRfbmV4dF9ldmVudCA9IGtleXN0b25lX3NldF9uZXh0X2V2ZW50OworCWV2ZW50X2Rldi0+c2V0X21vZGUgPSBrZXlzdG9uZV9zZXRfbW9kZTsKKwlldmVudF9kZXYtPmNwdW1hc2sgPSBjcHVfYWxsX21hc2s7CisJZXZlbnRfZGV2LT5vd25lciA9IFRISVNfTU9EVUxFOworCWV2ZW50X2Rldi0+bmFtZSA9IFRJTUVSX05BTUU7CisJZXZlbnRfZGV2LT5pcnEgPSBpcnE7CisKKwljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKGV2ZW50X2RldiwgcmF0ZSwgMSwgVUxPTkdfTUFYKTsKKworCXByX2luZm8oImtleXN0b25lIHRpbWVyIGNsb2NrIEAlbHUgSHpcbiIsIHJhdGUpOworCXJldHVybjsKK2VycjoKKwljbGtfcHV0KGNsayk7CisJaW91bm1hcCh0aW1lci5iYXNlKTsKK30KKworQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRShrZXlzdG9uZV90aW1lciwgInRpLGtleXN0b25lLXRpbWVyIiwKKwkJCQkJa2V5c3RvbmVfdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXUzMDAuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdTMwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2M2Q0NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXUzMDAuYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFNULUVyaWNzc29uIEFCCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqIFRpbWVyIENPSCA5MDEgMzI4LCBydW5zIHRoZSBPUyB0aW1lciBpbnRlcnJ1cHQuCisgKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWRfY2xvY2suaD4KKworLyogR2VuZXJpYyBzdHVmZiAqLworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworLyoKKyAqIEFQUCBzaWRlIHNwZWNpYWwgdGltZXIgcmVnaXN0ZXJzCisgKiBUaGlzIHRpbWVyIGNvbnRhaW5zIGZvdXIgdGltZXJzIHdoaWNoIGNhbiBmaXJlIGFuIGludGVycnVwdCBlYWNoLgorICogT1MgKG9wZXJhdGluZyBzeXN0ZW0pIHRpbWVyIEAgMzI3NjggSHoKKyAqIEREIChkZXZpY2UgZHJpdmVyKSB0aW1lciBAIDEga0h6CisgKiBHUDEgKGdlbmVyYWwgcHVycG9zZSAxKSB0aW1lciBAIDFNSHoKKyAqIEdQMiAoZ2VuZXJhbCBwdXJwb3NlIDIpIHRpbWVyIEAgMU1IegorICovCisKKy8qIFJlc2V0IE9TIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JPU1QJCQkJCSgweDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JPU1RfVElNRVJfUkVTRVQJCQkJKDB4MDAwMDAwMDApCisvKiBFbmFibGUgT1MgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRU9TVAkJCQkJKDB4MDAwNCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRU9TVF9USU1FUl9FTkFCTEUJCQkoMHgwMDAwMDAwMCkKKy8qIERpc2FibGUgT1MgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRE9TVAkJCQkJKDB4MDAwOCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRE9TVF9USU1FUl9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCisvKiBPUyBUaW1lciBNb2RlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NPU1RNCQkJCQkoMHgwMDBjKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TT1NUTV9NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU09TVE1fTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDAxKQorLyogT1MgVGltZXIgU3RhdHVzIFJlZ2lzdGVyIDMyYml0IChSLy0pICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFMJCQkJCSgweDAwMTApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfVElNRVJfU1RBVEVfTUFTSwkJCSgweDAwMDAwMDBGKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX1RJTUVSX1NUQVRFX0lETEUJCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19USU1FUl9TVEFURV9BQ1RJVkUJCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19FTkFCTEVfSU5ECQkJCSgweDAwMDAwMDEwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RTX01PREVfTUFTSwkJCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19NT0RFX0NPTlRJTlVPVVMJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUU19NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMjApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfSVJRX0VOQUJMRURfSU5ECQkJKDB4MDAwMDAwNDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVFNfSVJRX1BFTkRJTkdfSU5ECQkJKDB4MDAwMDAwODApCisvKiBPUyBUaW1lciBDdXJyZW50IENvdW50IFJlZ2lzdGVyIDMyYml0IChSLy0pICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVENDCQkJCQkoMHgwMDE0KQorLyogT1MgVGltZXIgVGVybWluYWwgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfT1NUVEMJCQkJCSgweDAwMTgpCisvKiBPUyBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElFCQkJCQkoMHgwMDFjKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RJRV9JUlFfRElTQUJMRQkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RJRV9JUlFfRU5BQkxFCQkJCSgweDAwMDAwMDAxKQorLyogT1MgVGltZXIgSW50ZXJydXB0IEFja25vd2xlZGdlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX09TVElBCQkJCQkoMHgwMDIwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9PU1RJQV9JUlFfQUNLCQkJCSgweDAwMDAwMDgwKQorCisvKiBSZXNldCBERCBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9SRERUCQkJCQkoMHgwMDQwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9SRERUX1RJTUVSX1JFU0VUCQkJCSgweDAwMDAwMDAwKQorLyogRW5hYmxlIEREIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VERFQJCQkJCSgweDAwNDQpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VERFRfVElNRVJfRU5BQkxFCQkJKDB4MDAwMDAwMDApCisvKiBEaXNhYmxlIEREIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RERFQJCQkJCSgweDAwNDgpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RERFRfVElNRVJfRElTQUJMRQkJCSgweDAwMDAwMDAwKQorLyogREQgVGltZXIgTW9kZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TRERUTQkJCQkJKDB4MDA0YykKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0REVE1fTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NERFRNX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAwMSkKKy8qIEREIFRpbWVyIFN0YXR1cyBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTCQkJCQkoMHgwMDUwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX1RJTUVSX1NUQVRFX01BU0sJCQkoMHgwMDAwMDAwRikKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19USU1FUl9TVEFURV9JRExFCQkJKDB4MDAwMDAwMDEpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfVElNRVJfU1RBVEVfQUNUSVZFCQkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfRU5BQkxFX0lORAkJCQkoMHgwMDAwMDAxMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUU19NT0RFX01BU0sJCQkJKDB4MDAwMDAwMjApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFNfTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDIwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX0lSUV9FTkFCTEVEX0lORAkJCSgweDAwMDAwMDQwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRTX0lSUV9QRU5ESU5HX0lORAkJCSgweDAwMDAwMDgwKQorLyogREQgVGltZXIgQ3VycmVudCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRDQwkJCQkJKDB4MDA1NCkKKy8qIEREIFRpbWVyIFRlcm1pbmFsIENvdW50IFJlZ2lzdGVyIDMyYml0IChSL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0REVFRDCQkJCQkoMHgwMDU4KQorLyogREQgVGltZXIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJRQkJCQkJKDB4MDA1YykKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUSUVfSVJRX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUSUVfSVJRX0VOQUJMRQkJCQkoMHgwMDAwMDAwMSkKKy8qIEREIFRpbWVyIEludGVycnVwdCBBY2tub3dsZWRnZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ERFRJQQkJCQkJKDB4MDA2MCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRERUSUFfSVJRX0FDSwkJCQkoMHgwMDAwMDA4MCkKKworLyogUmVzZXQgR1AxIFRpbWVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1JHUFQxCQkJCQkoMHgwMDgwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9SR1BUMV9USU1FUl9SRVNFVAkJCSgweDAwMDAwMDAwKQorLyogRW5hYmxlIEdQMSBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9FR1BUMQkJCQkJKDB4MDA4NCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUdQVDFfVElNRVJfRU5BQkxFCQkJKDB4MDAwMDAwMDApCisvKiBEaXNhYmxlIEdQMSBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9ER1BUMQkJCQkJKDB4MDA4OCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREdQVDFfVElNRVJfRElTQUJMRQkJCSgweDAwMDAwMDAwKQorLyogR1AxIFRpbWVyIE1vZGUgUmVnaXN0ZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDFNCQkJCQkoMHgwMDhjKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMU1fTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQxTV9NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMDEpCisvKiBHUDEgVGltZXIgU3RhdHVzIFJlZ2lzdGVyIDMyYml0IChSLy0pICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTCQkJCQkoMHgwMDkwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQxU19USU1FUl9TVEFURV9NQVNLCQkJKDB4MDAwMDAwMEYpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX1RJTUVSX1NUQVRFX0lETEUJCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfVElNRVJfU1RBVEVfQUNUSVZFCQkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX0VOQUJMRV9JTkQJCQkJKDB4MDAwMDAwMTApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX01PREVfTUFTSwkJCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfTU9ERV9DT05USU5VT1VTCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX01PREVfT05FX1NIT1QJCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMVNfSVJRX0VOQUJMRURfSU5ECQkJKDB4MDAwMDAwNDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFTX0lSUV9QRU5ESU5HX0lORAkJCSgweDAwMDAwMDgwKQorLyogR1AxIFRpbWVyIEN1cnJlbnQgQ291bnQgUmVnaXN0ZXIgMzJiaXQgKFIvLSkgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUNDCQkJCQkoMHgwMDk0KQorLyogR1AxIFRpbWVyIFRlcm1pbmFsIENvdW50IFJlZ2lzdGVyIDMyYml0IChSL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFUQwkJCQkJKDB4MDA5OCkKKy8qIEdQMSBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFJRQkJCQkJKDB4MDA5YykKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9ESVNBQkxFCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRU5BQkxFCQkJKDB4MDAwMDAwMDEpCisvKiBHUDEgVGltZXIgSW50ZXJydXB0IEFja25vd2xlZGdlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDFJQQkJCQkJKDB4MDBhMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMUlBX0lSUV9BQ0sJCQkJKDB4MDAwMDAwODApCisKKy8qIFJlc2V0IEdQMiBUaW1lciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9SR1BUMgkJCQkJKDB4MDBjMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfUkdQVDJfVElNRVJfUkVTRVQJCQkoMHgwMDAwMDAwMCkKKy8qIEVuYWJsZSBHUDIgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfRUdQVDIJCQkJCSgweDAwYzQpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0VHUFQyX1RJTUVSX0VOQUJMRQkJCSgweDAwMDAwMDAwKQorLyogRGlzYWJsZSBHUDIgVGltZXIgMzJiaXQgKC0vVykgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfREdQVDIJCQkJCSgweDAwYzgpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0RHUFQyX1RJTUVSX0RJU0FCTEUJCQkoMHgwMDAwMDAwMCkKKy8qIEdQMiBUaW1lciBNb2RlIFJlZ2lzdGVyIDMyYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX1NHUFQyTQkJCQkJKDB4MDBjYykKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfU0dQVDJNX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9TR1BUMk1fTU9ERV9PTkVfU0hPVAkJCSgweDAwMDAwMDAxKQorLyogR1AyIFRpbWVyIFN0YXR1cyBSZWdpc3RlciAzMmJpdCAoUi8tKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyUwkJCQkJKDB4MDBkMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfR1BUMlNfVElNRVJfU1RBVEVfTUFTSwkJCSgweDAwMDAwMDBGKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19USU1FUl9TVEFURV9JRExFCQkJKDB4MDAwMDAwMDEpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX1RJTUVSX1NUQVRFX0FDVElWRQkJCSgweDAwMDAwMDAyKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19FTkFCTEVfSU5ECQkJCSgweDAwMDAwMDEwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19NT0RFX01BU0sJCQkJKDB4MDAwMDAwMjApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX01PREVfQ09OVElOVU9VUwkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19NT0RFX09ORV9TSE9UCQkJKDB4MDAwMDAwMjApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJTX0lSUV9FTkFCTEVEX0lORAkJCSgweDAwMDAwMDQwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyU19JUlFfUEVORElOR19JTkQJCQkoMHgwMDAwMDA4MCkKKy8qIEdQMiBUaW1lciBDdXJyZW50IENvdW50IFJlZ2lzdGVyIDMyYml0IChSLy0pICovCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJDQwkJCQkJKDB4MDBkNCkKKy8qIEdQMiBUaW1lciBUZXJtaW5hbCBDb3VudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQyVEMJCQkJCSgweDAwZDgpCisvKiBHUDIgVGltZXIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQySUUJCQkJCSgweDAwZGMpCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJRV9JUlFfRElTQUJMRQkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQySUVfSVJRX0VOQUJMRQkJCSgweDAwMDAwMDAxKQorLyogR1AyIFRpbWVyIEludGVycnVwdCBBY2tub3dsZWRnZSBSZWdpc3RlciAzMmJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9HUFQySUEJCQkJCSgweDAwZTApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0dQVDJJQV9JUlFfQUNLCQkJCSgweDAwMDAwMDgwKQorCisvKiBDbG9jayByZXF1ZXN0IGNvbnRyb2wgcmVnaXN0ZXIgLSBhbGwgZm91ciB0aW1lcnMgKi8KKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfQ1JDCQkJCQkoMHgxMDApCisjZGVmaW5lIFUzMDBfVElNRVJfQVBQX0NSQ19DTE9DS19SRVFVRVNUX0VOQUJMRQkJCSgweDAwMDAwMDAxKQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICp1MzAwX3RpbWVyX2Jhc2U7CisKK3N0cnVjdCB1MzAwX2Nsb2NrZXZlbnRfZGF0YSB7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBjZXZkOworCXVuc2lnbmVkIHRpY2tzX3Blcl9qaWZmeTsKK307CisKKy8qCisgKiBUaGUgdTMwMF9zZXRfbW9kZSgpIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgZmlyc3QsIGlmIHdlCisgKiBoYXZlIG9uZXNob3QgdGltZXIgYWN0aXZlLCB0aGUgb25lc2hvdCBzY2hlZHVsaW5nIGZ1bmN0aW9uCisgKiB1MzAwX3NldF9uZXh0X2V2ZW50KCkgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyLgorICovCitzdGF0aWMgdm9pZCB1MzAwX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IHUzMDBfY2xvY2tldmVudF9kYXRhICpjZXZkYXRhID0KKwkJY29udGFpbmVyX29mKGV2dCwgc3RydWN0IHUzMDBfY2xvY2tldmVudF9kYXRhLCBjZXZkKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiBHUFQxICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0RJU0FCTEUsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOworCQkvKiBEaXNhYmxlIEdQMSB3aGlsZSB3ZSdyZSByZXByb2dyYW1taW5nIGl0LiAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfREdQVDFfVElNRVJfRElTQUJMRSwKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RHUFQxKTsKKwkJLyoKKwkJICogU2V0IHRoZSBwZXJpb2RpYyBtb2RlIHRvIGEgY2VydGFpbiBudW1iZXIgb2YgdGlja3MgcGVyCisJCSAqIGppZmZ5LgorCQkgKi8KKwkJd3JpdGVsKGNldmRhdGEtPnRpY2tzX3Blcl9qaWZmeSwKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFUQyk7CisJCS8qCisJCSAqIFNldCBjb250aW51b3VzIG1vZGUsIHNvIHRoZSB0aW1lciBrZWVwcyB0cmlnZ2VyaW5nCisJCSAqIGludGVycnVwdHMuCisJCSAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfU0dQVDFNX01PREVfQ09OVElOVU9VUywKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1NHUFQxTSk7CisJCS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHRzICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUVfSVJRX0VOQUJMRSwKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7CisJCS8qIFRoZW4gZW5hYmxlIHRoZSBPUyB0aW1lciBhZ2FpbiAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfRUdQVDFfVElNRVJfRU5BQkxFLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfRUdQVDEpOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6CisJCS8qIEp1c3QgYnJlYWs7IGhlcmU/ICovCisJCS8qCisJCSAqIFRoZSBhY3R1YWwgZXZlbnQgd2lsbCBiZSBwcm9ncmFtbWVkIGJ5IHRoZSBuZXh0IGV2ZW50IGhvb2ssCisJCSAqIHNvIHdlIGp1c3Qgc2V0IGEgZHVtbXkgdmFsdWUgc29tZXdoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisJCSAqIHVuaXZlcnNlIGhlcmUuCisJCSAqLworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gR1BUMSAqLworCQl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9ESVNBQkxFLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKKwkJLyogRGlzYWJsZSBHUDEgd2hpbGUgd2UncmUgcmVwcm9ncmFtbWluZyBpdC4gKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RHUFQxX1RJTUVSX0RJU0FCTEUsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ER1BUMSk7CisJCS8qCisJCSAqIEV4cGlyZSBmYXIgaW4gdGhlIGZ1dHVyZSwgdTMwMF9zZXRfbmV4dF9ldmVudCgpIHdpbGwgYmUKKwkJICogY2FsbGVkIHNvb24uLi4KKwkJICovCisJCXdyaXRlbCgweEZGRkZGRkZGLCB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxVEMpOworCQkvKiBXZSBydW4gb25lIHNob3QgcGVyIHRpY2sgaGVyZSEgKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1NHUFQxTV9NT0RFX09ORV9TSE9ULAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfU0dQVDFNKTsKKwkJLyogRW5hYmxlIGludGVycnVwdHMgZm9yIHRoaXMgdGltZXIgKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRU5BQkxFLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlFKTsKKwkJLyogRW5hYmxlIHRpbWVyICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9FR1BUMV9USU1FUl9FTkFCTEUsCisJCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9FR1BUMSk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiBHUDEgKi8KKwkJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRElTQUJMRSwKKwkJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDFJRSk7CisJCS8qIERpc2FibGUgR1AxICovCisJCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ER1BUMV9USU1FUl9ESVNBQkxFLAorCQkgICAgICAgdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfREdQVDEpOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKKwkJLyogSWdub3JlIHRoaXMgY2FsbCAqLworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBUaGUgYXBwIHRpbWVyIGluIG9uZSBzaG90IG1vZGUgb2J2aW91c2x5IGhhcyB0byBiZSByZXByb2dyYW1tZWQKKyAqIGluIEVYQUNUTFkgdGhpcyBzZXF1ZW5jZSB0byB3b3JrIHByb3Blcmx5LiBEbyBOT1QgdHJ5IHRvIGUuZy4gcmVwbGFjZQorICogdGhlIGludGVycnVwdCBkaXNhYmxlICsgdGltZXIgZGlzYWJsZSBjb21tYW5kcyB3aXRoIGEgcmVzZXQgY29tbWFuZCwKKyAqIGl0IHdpbGwgZmFpbCBtaXNlcmFibHkuIEFwcGFyZW50bHkgKGFuZCBJIGZvdW5kIHRoaXMgdGhlIGhhcmQgd2F5KQorICogdGhlIHRpbWVyIGlzIHZlcnkgc2Vuc2l0aXZlIHRvIHRoZSBpbnN0cnVjdGlvbiBvcmRlciwgdGhvdWdoIHlvdSBkb24ndAorICogZ2V0IHRoYXQgaW1wcmVzc2lvbiBmcm9tIHRoZSBkYXRhIHNoZWV0LgorICovCitzdGF0aWMgaW50IHUzMDBfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCisJCQkgICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQorCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIEdQVDEgKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfR1BUMUlFX0lSUV9ESVNBQkxFLAorCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOworCS8qIERpc2FibGUgR1AxIHdoaWxlIHdlJ3JlIHJlcHJvZ3JhbW1pbmcgaXQuICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0RHUFQxX1RJTUVSX0RJU0FCTEUsCisJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RHUFQxKTsKKwkvKiBSZXNldCB0aGUgR2VuZXJhbCBQdXJwb3NlIHRpbWVyIDEuICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1JHUFQxX1RJTUVSX1JFU0VULAorCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9SR1BUMSk7CisJLyogSVJRIGluIG4gKiBjeWNsZXMgKi8KKwl3cml0ZWwoY3ljbGVzLCB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxVEMpOworCS8qCisJICogV2UgcnVuIG9uZSBzaG90IHBlciB0aWNrIGhlcmUhIChUaGlzIGlzIG5lY2Vzc2FyeSB0byByZWNvbmZpZ3VyZSwKKwkgKiB0aGUgdGltZXIgd2lsbCB0aWx0IGlmIHlvdSBkb24ndCEpCisJICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1NHUFQxTV9NT0RFX09ORV9TSE9ULAorCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9TR1BUMU0pOworCS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHRzICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDFJRV9JUlFfRU5BQkxFLAorCSAgICAgICB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQxSUUpOworCS8qIFRoZW4gZW5hYmxlIHRoZSBPUyB0aW1lciBhZ2FpbiAqLworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9FR1BUMV9USU1FUl9FTkFCTEUsCisJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0VHUFQxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1MzAwX2Nsb2NrZXZlbnRfZGF0YSB1MzAwX2Nsb2NrZXZlbnRfZGF0YSA9IHsKKwkvKiBVc2UgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyIDEgYXMgY2xvY2sgZXZlbnQgKi8KKwkuY2V2ZCA9IHsKKwkJLm5hbWUJCT0gIkdQVDEiLAorCQkvKiBSZWFzb25hYmx5IGZhc3QgYW5kIGFjY3VyYXRlIGNsb2NrIGV2ZW50ICovCisJCS5yYXRpbmcJCT0gMzAwLAorCQkuZmVhdHVyZXMJPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8CisJCQlDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCQkuc2V0X25leHRfZXZlbnQJPSB1MzAwX3NldF9uZXh0X2V2ZW50LAorCQkuc2V0X21vZGUJPSB1MzAwX3NldF9tb2RlLAorCX0sCit9OworCisvKiBDbG9jayBldmVudCB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90IHUzMDBfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmdTMwMF9jbG9ja2V2ZW50X2RhdGEuY2V2ZDsKKwkvKiBBQ0svQ2xlYXIgdGltZXIgSVJRIGZvciB0aGUgQVBQIEdQVDEgVGltZXIgKi8KKworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9HUFQxSUFfSVJRX0FDSywKKwkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMUlBKTsKKwlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHUzMDBfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJVMzAwIFRpbWVyIFRpY2siLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKKwkuaGFuZGxlcgk9IHUzMDBfdGltZXJfaW50ZXJydXB0LAorfTsKKworLyoKKyAqIE92ZXJyaWRlIHRoZSBnbG9iYWwgd2VhayBzY2hlZF9jbG9jayBzeW1ib2wgd2l0aCB0aGlzCisgKiBsb2NhbCBpbXBsZW1lbnRhdGlvbiB3aGljaCB1c2VzIHRoZSBjbG9ja3NvdXJjZSB0byBnZXQgc29tZQorICogYmV0dGVyIHJlc29sdXRpb24gd2hlbiBzY2hlZHVsaW5nIHRoZSBrZXJuZWwuIFdlIGFjY2VwdCB0aGF0CisgKiB0aGlzIHdyYXBzIGFyb3VuZCBmb3Igbm93LCBzaW5jZSBpdCBpcyBqdXN0IGEgcmVsYXRpdmUgdGltZQorICogc3RhbXAuIChJbnNwaXJlZCBieSBPTUFQIGltcGxlbWVudGF0aW9uLikKKyAqLworCitzdGF0aWMgdTY0IG5vdHJhY2UgdTMwMF9yZWFkX3NjaGVkX2Nsb2NrKHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDJDQyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHUzMDBfcmVhZF9jdXJyZW50X3RpbWVyKHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0dQVDJDQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVsYXlfdGltZXIgdTMwMF9kZWxheV90aW1lcjsKKworLyoKKyAqIFRoaXMgc2V0cyB1cCB0aGUgc3lzdGVtIHRpbWVycywgY2xvY2sgc291cmNlIGFuZCBjbG9jayBldmVudC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHUzMDBfdGltZXJfaW5pdF9vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IGNsayAqY2xrOworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKworCXUzMDBfdGltZXJfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIXUzMDBfdGltZXJfYmFzZSkKKwkJcGFuaWMoImNvdWxkIG5vdCBpb3JlbWFwIHN5c3RlbSB0aW1lclxuIik7CisKKwkvKiBHZXQgdGhlIElSUSBmb3IgdGhlIEdQMSB0aW1lciAqLworCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAyKTsKKwlpZiAoIWlycSkKKwkJcGFuaWMoIm5vIElSUSBmb3Igc3lzdGVtIHRpbWVyXG4iKTsKKworCXByX2luZm8oIlUzMDAgR1AxIHRpbWVyIEAgYmFzZTogJXAsIElSUTogJXVcbiIsIHUzMDBfdGltZXJfYmFzZSwgaXJxKTsKKworCS8qIENsb2NrIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCWNsayA9IG9mX2Nsa19nZXQobnAsIDApOworCUJVR19PTihJU19FUlIoY2xrKSk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7CisJcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspOworCisJdTMwMF9jbG9ja2V2ZW50X2RhdGEudGlja3NfcGVyX2ppZmZ5ID0gRElWX1JPVU5EX0NMT1NFU1QocmF0ZSwgSFopOworCisJc2NoZWRfY2xvY2tfcmVnaXN0ZXIodTMwMF9yZWFkX3NjaGVkX2Nsb2NrLCAzMiwgcmF0ZSk7CisKKwl1MzAwX2RlbGF5X3RpbWVyLnJlYWRfY3VycmVudF90aW1lciA9ICZ1MzAwX3JlYWRfY3VycmVudF90aW1lcjsKKwl1MzAwX2RlbGF5X3RpbWVyLmZyZXEgPSByYXRlOworCXJlZ2lzdGVyX2N1cnJlbnRfdGltZXJfZGVsYXkoJnUzMDBfZGVsYXlfdGltZXIpOworCisJLyoKKwkgKiBEaXNhYmxlIHRoZSAiT1MiIGFuZCAiREQiIHRpbWVycyAtIHRoZXNlIGFyZSBkZXNpZ25lZCBmb3IgU3ltYmlhbiEKKwkgKiBFeGFtcGxlIHVzYWdlIGluIGNuaDE2MDE1NzggY3B1IHN1YnN5c3RlbSBwZF90aW1lcl9hcHAuYworCSAqLworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9DUkNfQ0xPQ0tfUkVRVUVTVF9FTkFCTEUsCisJCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0NSQyk7CisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1JPU1RfVElNRVJfUkVTRVQsCisJCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JPU1QpOworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9ET1NUX1RJTUVSX0RJU0FCTEUsCisJCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX0RPU1QpOworCXdyaXRlbChVMzAwX1RJTUVSX0FQUF9SRERUX1RJTUVSX1JFU0VULAorCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9SRERUKTsKKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfREREVF9USU1FUl9ESVNBQkxFLAorCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9ERERUKTsKKworCS8qIFJlc2V0IHRoZSBHZW5lcmFsIFB1cnBvc2UgdGltZXIgMS4gKi8KKwl3cml0ZWwoVTMwMF9USU1FUl9BUFBfUkdQVDFfVElNRVJfUkVTRVQsCisJCXUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1JHUFQxKTsKKworCS8qIFNldCB1cCB0aGUgSVJRIGhhbmRsZXIgKi8KKwlzZXR1cF9pcnEoaXJxLCAmdTMwMF90aW1lcl9pcnEpOworCisJLyogUmVzZXQgdGhlIEdlbmVyYWwgUHVycG9zZSB0aW1lciAyICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1JHUFQyX1RJTUVSX1JFU0VULAorCQl1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9SR1BUMik7CisJLyogU2V0IHRoaXMgdGltZXIgdG8gcnVuIGFyb3VuZCBmb3JldmVyICovCisJd3JpdGVsKDB4RkZGRkZGRkZVLCB1MzAwX3RpbWVyX2Jhc2UgKyBVMzAwX1RJTUVSX0FQUF9HUFQyVEMpOworCS8qIFNldCBjb250aW51b3VzIG1vZGUgc28gaXQgd3JhcHMgYXJvdW5kICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX1NHUFQyTV9NT0RFX0NPTlRJTlVPVVMsCisJICAgICAgIHUzMDBfdGltZXJfYmFzZSArIFUzMDBfVElNRVJfQVBQX1NHUFQyTSk7CisJLyogRGlzYWJsZSB0aW1lciBpbnRlcnJ1cHRzICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0dQVDJJRV9JUlFfRElTQUJMRSwKKwkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMklFKTsKKwkvKiBUaGVuIGVuYWJsZSB0aGUgR1AyIHRpbWVyIHRvIHVzZSBhcyBhIGZyZWUgcnVubmluZyB1cyBjb3VudGVyICovCisJd3JpdGVsKFUzMDBfVElNRVJfQVBQX0VHUFQyX1RJTUVSX0VOQUJMRSwKKwkJdTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfRUdQVDIpOworCisJLyogVXNlIGdlbmVyYWwgcHVycG9zZSB0aW1lciAyIGFzIGNsb2NrIHNvdXJjZSAqLworCWlmIChjbG9ja3NvdXJjZV9tbWlvX2luaXQodTMwMF90aW1lcl9iYXNlICsgVTMwMF9USU1FUl9BUFBfR1BUMkNDLAorCQkJIkdQVDIiLCByYXRlLCAzMDAsIDMyLCBjbG9ja3NvdXJjZV9tbWlvX3JlYWRsX3VwKSkKKwkJcHJfZXJyKCJ0aW1lcjogZmFpbGVkIHRvIGluaXRpYWxpemUgVTMwMCBjbG9jayBzb3VyY2VcbiIpOworCisJLyogQ29uZmlndXJlIGFuZCByZWdpc3RlciB0aGUgY2xvY2tldmVudCAqLworCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJnUzMDBfY2xvY2tldmVudF9kYXRhLmNldmQsIHJhdGUsCisJCQkJCTEsIDB4ZmZmZmZmZmYpOworCisJLyoKKwkgKiBUT0RPOiBpbml0IGFuZCByZWdpc3RlciB0aGUgcmVzdCBvZiB0aGUgdGltZXJzIHRvbywgdGhleSBjYW4gYmUKKwkgKiB1c2VkIGJ5IGhydGltZXJzIQorCSAqLworfQorCitDTE9DS1NPVVJDRV9PRl9ERUNMQVJFKHUzMDBfdGltZXIsICJzdGVyaWNzc29uLHUzMDAtYXBwdGltZXIiLAorCQkgICAgICAgdTMwMF90aW1lcl9pbml0X29mKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdmZfcGl0X3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3ZmX3BpdF90aW1lci5jCmluZGV4IDAyODIxYjAuLmE5MThiYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdmZfcGl0X3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS92Zl9waXRfdGltZXIuYwpAQCAtNTQsNyArNTQsNyBAQAogCiBzdGF0aWMgdTY0IHBpdF9yZWFkX3NjaGVkX2Nsb2NrKHZvaWQpCiB7Ci0JcmV0dXJuIF9fcmF3X3JlYWRsKGNsa3NyY19iYXNlICsgUElUQ1ZBTCk7CisJcmV0dXJuIH5fX3Jhd19yZWFkbChjbGtzcmNfYmFzZSArIFBJVENWQUwpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwaXRfY2xvY2tzb3VyY2VfaW5pdCh1bnNpZ25lZCBsb25nIHJhdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMKaW5kZXggMThjNWI5Yi4uMTQ4ZDcwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCisrKyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYwpAQCAtOTUsNyArOTUsNyBAQAogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCiAJLyogIElmIGNuX25ldGxpbmtfc2VuZCgpIGZhaWxlZCwgdGhlIGRhdGEgaXMgbm90IHNlbnQgKi8KLQljbl9uZXRsaW5rX3NlbmQobXNnLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOwogfQogCiB2b2lkIHByb2NfZXhlY19jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMTIyLDcgKzEyMiw3IEBACiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwogCW1zZy0+bGVuID0gc2l6ZW9mKCpldik7CiAJbXNnLT5mbGFncyA9IDA7IC8qIG5vdCB1c2VkICovCi0JY25fbmV0bGlua19zZW5kKG1zZywgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBwcm9jX2lkX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCB3aGljaF9pZCkKQEAgLTE2Myw3ICsxNjMsNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19zaWRfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTE5MCw3ICsxOTAsNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19wdHJhY2VfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHB0cmFjZV9pZCkKQEAgLTIyNSw3ICsyMjUsNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19jb21tX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCkBAIC0yNTMsNyArMjUzLDcgQEAKIAltc2ctPmFjayA9IDA7IC8qIG5vdCB1c2VkICovCiAJbXNnLT5sZW4gPSBzaXplb2YoKmV2KTsKIAltc2ctPmZsYWdzID0gMDsgLyogbm90IHVzZWQgKi8KLQljbl9uZXRsaW5rX3NlbmQobXNnLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOwogfQogCiB2b2lkIHByb2NfY29yZWR1bXBfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTI4MCw3ICsyODAsNyBAQAogCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KIAltc2ctPmxlbiA9IHNpemVvZigqZXYpOwogCW1zZy0+ZmxhZ3MgPSAwOyAvKiBub3QgdXNlZCAqLwotCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgcHJvY19leGl0X2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCkBAIC0zMDksNyArMzA5LDcgQEAKIAltc2ctPmFjayA9IDA7IC8qIG5vdCB1c2VkICovCiAJbXNnLT5sZW4gPSBzaXplb2YoKmV2KTsKIAltc2ctPmZsYWdzID0gMDsgLyogbm90IHVzZWQgKi8KLQljbl9uZXRsaW5rX3NlbmQobXNnLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOwogfQogCiAvKgpAQCAtMzQzLDcgKzM0Myw3IEBACiAJbXNnLT5hY2sgPSByY3ZkX2FjayArIDE7CiAJbXNnLT5sZW4gPSBzaXplb2YoKmV2KTsKIAltc2ctPmZsYWdzID0gMDsgLyogbm90IHVzZWQgKi8KLQljbl9uZXRsaW5rX3NlbmQobXNnLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgQ05fSURYX1BST0MsIEdGUF9LRVJORUwpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKaW5kZXggYTM2NzQ5Zi4uNzdhZmU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKQEAgLTUwLDcgKzUwLDcgQEAKICAqCiAgKiBTZXF1ZW5jZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgd2l0aCBlYWNoIG1lc3NhZ2UgdG8gYmUgc2VudC4KICAqCi0gKiBJZiB3ZSBleHBlY3QgcmVwbHkgdG8gb3VyIG1lc3NhZ2UgdGhlbiB0aGUgc2VxdWVuY2UgbnVtYmVyIGluCisgKiBJZiB3ZSBleHBlY3QgYSByZXBseSB0byBvdXIgbWVzc2FnZSB0aGVuIHRoZSBzZXF1ZW5jZSBudW1iZXIgaW4KICAqIHJlY2VpdmVkIG1lc3NhZ2UgTVVTVCBiZSB0aGUgc2FtZSBhcyBpbiBvcmlnaW5hbCBtZXNzYWdlLCBhbmQKICAqIGFja25vd2xlZGdlIG51bWJlciBNVVNUIGJlIHRoZSBzYW1lICsgMS4KICAqCkBAIC02Miw4ICs2MiwxMSBAQAogICogdGhlIGFja25vd2xlZGdlbWVudCBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIG1lc3NhZ2UgKyAxLCB0aGVuIGl0IGlzCiAgKiBhIG5ldyBtZXNzYWdlLgogICoKKyAqIFRoZSBtZXNzYWdlIGlzIHNlbnQgdG8sIHRoZSBwb3J0aWQgaWYgZ2l2ZW4sIHRoZSBncm91cCBpZiBnaXZlbiwgYm90aCBpZgorICogYm90aCwgb3IgaWYgYm90aCBhcmUgemVybyB0aGVuIHRoZSBncm91cCBpcyBsb29rZWQgdXAgYW5kIHNlbnQgdGhlcmUuCiAgKi8KLWludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqbXNnLCB1MzIgX19ncm91cCwgZ2ZwX3QgZ2ZwX21hc2spCitpbnQgY25fbmV0bGlua19zZW5kKHN0cnVjdCBjbl9tc2cgKm1zZywgdTMyIHBvcnRpZCwgdTMyIF9fZ3JvdXAsCisJZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IGNuX2NhbGxiYWNrX2VudHJ5ICpfX2NicTsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKQEAgLTc0LDcgKzc3LDkgQEAKIAl1MzIgZ3JvdXAgPSAwOwogCWludCBmb3VuZCA9IDA7CiAKLQlpZiAoIV9fZ3JvdXApIHsKKwlpZiAocG9ydGlkIHx8IF9fZ3JvdXApIHsKKwkJZ3JvdXAgPSBfX2dyb3VwOworCX0gZWxzZSB7CiAJCXNwaW5fbG9ja19iaCgmZGV2LT5jYmRldi0+cXVldWVfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoX19jYnEsICZkZXYtPmNiZGV2LT5xdWV1ZV9saXN0LAogCQkJCSAgICBjYWxsYmFja19lbnRyeSkgewpAQCAtODgsMTEgKzkzLDkgQEAKIAogCQlpZiAoIWZvdW5kKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfSBlbHNlIHsKLQkJZ3JvdXAgPSBfX2dyb3VwOwogCX0KIAotCWlmICghbmV0bGlua19oYXNfbGlzdGVuZXJzKGRldi0+bmxzLCBncm91cCkpCisJaWYgKCFwb3J0aWQgJiYgIW5ldGxpbmtfaGFzX2xpc3RlbmVycyhkZXYtPm5scywgZ3JvdXApKQogCQlyZXR1cm4gLUVTUkNIOwogCiAJc2l6ZSA9IHNpemVvZigqbXNnKSArIG1zZy0+bGVuOwpAQCAtMTEzLDcgKzExNiwxMCBAQAogCiAJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IGdyb3VwOwogCi0JcmV0dXJuIG5ldGxpbmtfYnJvYWRjYXN0KGRldi0+bmxzLCBza2IsIDAsIGdyb3VwLCBnZnBfbWFzayk7CisJaWYgKGdyb3VwKQorCQlyZXR1cm4gbmV0bGlua19icm9hZGNhc3QoZGV2LT5ubHMsIHNrYiwgcG9ydGlkLCBncm91cCwKKwkJCQkJIGdmcF9tYXNrKTsKKwlyZXR1cm4gbmV0bGlua191bmljYXN0KGRldi0+bmxzLCBza2IsIHBvcnRpZCwgIShnZnBfbWFzayZfX0dGUF9XQUlUKSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbl9uZXRsaW5rX3NlbmQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwppbmRleCBlYjIxNGQ4Li5lY2FhZWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY3B1dGltZS5oPgogCiBzdGF0aWMgc3BpbmxvY2tfdCBjcHVmcmVxX3N0YXRzX2xvY2s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMgYi9kcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jCmluZGV4IGU5NTI5MzYuLmNiNjY1NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NvdXBsZWQuYwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCA9ICZwZXJfY3B1KGNwdWlkbGVfY291cGxlZF9wb2tlX2NiLCBjcHUpOwogCiAJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoY3B1LCAmY3B1aWRsZV9jb3VwbGVkX3Bva2VfcGVuZGluZykpCi0JCV9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgY3NkLCAwKTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGNwdSwgY3NkKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMKaW5kZXggNzhmZDE3NC4uNzE5ZjZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYwpAQCAtMTEsOSArMTEsMTggQEAKICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL3J1bmxhdGNoLmg+CisKKy8qIEZsYWdzIGFuZCBjb25zdGFudHMgdXNlZCBpbiBQb3dlck5WIHBsYXRmb3JtICovCisKKyNkZWZpbmUgTUFYX1BPV0VSTlZfSURMRV9TVEFURVMJOAorI2RlZmluZSBJRExFX1VTRV9JTlNUX05BUAkweDAwMDEwMDAwIC8qIFVzZSBuYXAgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgSURMRV9VU0VfSU5TVF9TTEVFUAkweDAwMDIwMDAwIC8qIFVzZSBzbGVlcCBpbnN0cnVjdGlvbiAqLwogCiBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgcG93ZXJudl9pZGxlX2RyaXZlciA9IHsKIAkubmFtZSAgICAgICAgICAgICA9ICJwb3dlcm52X2lkbGUiLApAQCAtMzAsMTIgKzM5LDE0IEBACiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwogCisJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CiAJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewogCQlITVRfbG93KCk7CiAJCUhNVF92ZXJ5X2xvdygpOwogCX0KIAogCUhNVF9tZWRpdW0oKTsKKwlwcGM2NF9ydW5sYXRjaF9vbigpOwogCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAJc21wX21iKCk7CiAJcmV0dXJuIGluZGV4OwpAQCAtNDUsMTQgKzU2LDQyIEBACiAJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKIAkJCWludCBpbmRleCkKIHsKKwlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKIAlwb3dlcjdfaWRsZSgpOworCXBwYzY0X3J1bmxhdGNoX29uKCk7CisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW50IGZhc3RzbGVlcF9sb29wKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJCWludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBsb25nIG9sZF9scGNyID0gbWZzcHIoU1BSTl9MUENSKTsKKwl1bnNpZ25lZCBsb25nIG5ld19scGNyOworCisJaWYgKHVubGlrZWx5KHN5c3RlbV9zdGF0ZSA8IFNZU1RFTV9SVU5OSU5HKSkKKwkJcmV0dXJuIGluZGV4OworCisJbmV3X2xwY3IgPSBvbGRfbHBjcjsKKwluZXdfbHBjciAmPSB+KExQQ1JfTUVSIHwgTFBDUl9QRUNFKTsgLyogbHBjclttZXJdIG11c3QgYmUgMCAqLworCisJLyogZXhpdCBwb3dlcnNhdmUgdXBvbiBleHRlcm5hbCBpbnRlcnJ1cHQsIGJ1dCBub3QgZGVjcmVtZW50ZXIKKwkgKiBpbnRlcnJ1cHQuCisJICovCisJbmV3X2xwY3IgfD0gTFBDUl9QRUNFMDsKKworCW10c3ByKFNQUk5fTFBDUiwgbmV3X2xwY3IpOworCXBvd2VyN19zbGVlcCgpOworCisJbXRzcHIoU1BSTl9MUENSLCBvbGRfbHBjcik7CisKIAlyZXR1cm4gaW5kZXg7CiB9CiAKIC8qCiAgKiBTdGF0ZXMgZm9yIGRlZGljYXRlZCBwYXJ0aXRpb24gY2FzZS4KICAqLwotc3RhdGljIHN0cnVjdCBjcHVpZGxlX3N0YXRlIHBvd2VybnZfc3RhdGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgcG93ZXJudl9zdGF0ZXNbTUFYX1BPV0VSTlZfSURMRV9TVEFURVNdID0gewogCXsgLyogU25vb3plICovCiAJCS5uYW1lID0gInNub296ZSIsCiAJCS5kZXNjID0gInNub296ZSIsCkBAIC02MCwxMyArOTksNiBAQAogCQkuZXhpdF9sYXRlbmN5ID0gMCwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSAwLAogCQkuZW50ZXIgPSAmc25vb3plX2xvb3AgfSwKLQl7IC8qIE5BUCAqLwotCQkubmFtZSA9ICJOQVAiLAotCQkuZGVzYyA9ICJOQVAiLAotCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCwKLQkJLmV4aXRfbGF0ZW5jeSA9IDEwLAotCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMCwKLQkJLmVudGVyID0gJm5hcF9sb29wIH0sCiB9OwogCiBzdGF0aWMgaW50IHBvd2VybnZfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwKQEAgLTEyNywxOSArMTU5LDc0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcG93ZXJudl9hZGRfaWRsZV9zdGF0ZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvd2VyX21ndDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJaW50IG5yX2lkbGVfc3RhdGVzID0gMTsgLyogU25vb3plICovCisJaW50IGR0X2lkbGVfc3RhdGVzOworCXUzMiAqZmxhZ3M7CisJaW50IGk7CisKKwkvKiBDdXJyZW50bHkgd2UgaGF2ZSBzbm9vemUgc3RhdGljYWxseSBkZWZpbmVkICovCisKKwlwb3dlcl9tZ3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFsL3Bvd2VyLW1ndCIpOworCWlmICghcG93ZXJfbWd0KSB7CisJCXByX3dhcm4oIm9wYWw6IFBvd2VyTWdtdCBOb2RlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBucl9pZGxlX3N0YXRlczsKKwl9CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShwb3dlcl9tZ3QsICJpYm0sY3B1LWlkbGUtc3RhdGUtZmxhZ3MiLCBOVUxMKTsKKwlpZiAoIXByb3ApIHsKKwkJcHJfd2FybigiRFQtUG93ZXJNZ210OiBtaXNzaW5nIGlibSxjcHUtaWRsZS1zdGF0ZS1mbGFnc1xuIik7CisJCXJldHVybiBucl9pZGxlX3N0YXRlczsKKwl9CisKKwlkdF9pZGxlX3N0YXRlcyA9IHByb3AtPmxlbmd0aCAvIHNpemVvZih1MzIpOworCWZsYWdzID0gKHUzMiAqKSBwcm9wLT52YWx1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBkdF9pZGxlX3N0YXRlczsgaSsrKSB7CisKKwkJaWYgKGZsYWdzW2ldICYgSURMRV9VU0VfSU5TVF9OQVApIHsKKwkJCS8qIEFkZCBOQVAgc3RhdGUgKi8KKwkJCXN0cmNweShwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10ubmFtZSwgIk5hcCIpOworCQkJc3RyY3B5KHBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5kZXNjLCAiTmFwIik7CisJCQlwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwkJCXBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5leGl0X2xhdGVuY3kgPSAxMDsKKwkJCXBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwOworCQkJcG93ZXJudl9zdGF0ZXNbbnJfaWRsZV9zdGF0ZXNdLmVudGVyID0gJm5hcF9sb29wOworCQkJbnJfaWRsZV9zdGF0ZXMrKzsKKwkJfQorCisJCWlmIChmbGFnc1tpXSAmIElETEVfVVNFX0lOU1RfU0xFRVApIHsKKwkJCS8qIEFkZCBGQVNUU0xFRVAgc3RhdGUgKi8KKwkJCXN0cmNweShwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10ubmFtZSwgIkZhc3RTbGVlcCIpOworCQkJc3RyY3B5KHBvd2VybnZfc3RhdGVzW25yX2lkbGVfc3RhdGVzXS5kZXNjLCAiRmFzdFNsZWVwIik7CisJCQlwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10uZmxhZ3MgPQorCQkJCUNQVUlETEVfRkxBR19USU1FX1ZBTElEIHwgQ1BVSURMRV9GTEFHX1RJTUVSX1NUT1A7CisJCQlwb3dlcm52X3N0YXRlc1tucl9pZGxlX3N0YXRlc10uZXhpdF9sYXRlbmN5ID0gMzAwOworCQkJcG93ZXJudl9zdGF0ZXNbbnJfaWRsZV9zdGF0ZXNdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDAwOworCQkJcG93ZXJudl9zdGF0ZXNbbnJfaWRsZV9zdGF0ZXNdLmVudGVyID0gJmZhc3RzbGVlcF9sb29wOworCQkJbnJfaWRsZV9zdGF0ZXMrKzsKKwkJfQorCX0KKworCXJldHVybiBucl9pZGxlX3N0YXRlczsKK30KKwogLyoKICAqIHBvd2VybnZfaWRsZV9wcm9iZSgpCiAgKiBDaG9vc2Ugc3RhdGUgdGFibGUgZm9yIHNoYXJlZCB2ZXJzdXMgZGVkaWNhdGVkIHBhcnRpdGlvbgogICovCiBzdGF0aWMgaW50IHBvd2VybnZfaWRsZV9wcm9iZSh2b2lkKQogewotCiAJaWYgKGNwdWlkbGVfZGlzYWJsZSAhPSBJRExFX05PX09WRVJSSURFKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUx2MykpIHsKIAkJY3B1aWRsZV9zdGF0ZV90YWJsZSA9IHBvd2VybnZfc3RhdGVzOwotCQltYXhfaWRsZV9zdGF0ZSA9IEFSUkFZX1NJWkUocG93ZXJudl9zdGF0ZXMpOworCQkvKiBEZXZpY2UgdHJlZSBjYW4gaW5kaWNhdGUgbW9yZSBpZGxlIHN0YXRlcyAqLworCQltYXhfaWRsZV9zdGF0ZSA9IHBvd2VybnZfYWRkX2lkbGVfc3RhdGVzKCk7CiAgCX0gZWxzZQogIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYwppbmRleCA3YWI1NjRhLi42ZjdiMDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wc2VyaWVzLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL3J1bmxhdGNoLmg+CiAjaW5jbHVkZSA8YXNtL3BscGFyX3dyYXBwZXJzLmg+CiAKIHN0cnVjdCBjcHVpZGxlX2RyaXZlciBwc2VyaWVzX2lkbGVfZHJpdmVyID0gewpAQCAtMjksNiArMzAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9sb29wX3Byb2xvZyh1bnNpZ25lZCBsb25nICppbl9wdXJyKQogeworCXBwYzY0X3J1bmxhdGNoX29mZigpOwogCSppbl9wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKIAkvKgogCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdlIGFyZSBpZGxlLiBOb3cgd291bGQgYmUKQEAgLTQ1LDYgKzQ3LDEwIEBACiAJd2FpdF9jeWNsZXMgKz0gbWZzcHIoU1BSTl9QVVJSKSAtIGluX3B1cnI7CiAJZ2V0X2xwcGFjYSgpLT53YWl0X3N0YXRlX2N5Y2xlcyA9IGNwdV90b19iZTY0KHdhaXRfY3ljbGVzKTsKIAlnZXRfbHBwYWNhKCktPmlkbGUgPSAwOworCisJaWYgKGlycXNfZGlzYWJsZWQoKSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCXBwYzY0X3J1bmxhdGNoX29uKCk7CiB9CiAKIHN0YXRpYyBpbnQgc25vb3plX2xvb3Aoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwppbmRleCAzNjZlNjg0Li5jYjIwZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKQEAgLTE0MSwxMiArMTQxLDE0IEBACiAJCXJldHVybiAwOwogCX0KIAotCXRyYWNlX2NwdV9pZGxlX3JjdWlkbGUobmV4dF9zdGF0ZSwgZGV2LT5jcHUpOwotCiAJYnJvYWRjYXN0ID0gISEoZHJ2LT5zdGF0ZXNbbmV4dF9zdGF0ZV0uZmxhZ3MgJiBDUFVJRExFX0ZMQUdfVElNRVJfU1RPUCk7CiAKLQlpZiAoYnJvYWRjYXN0KQotCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsICZkZXYtPmNwdSk7CisJaWYgKGJyb2FkY2FzdCAmJgorCSAgICBjbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsICZkZXYtPmNwdSkpCisJCXJldHVybiAtRUJVU1k7CisKKworCXRyYWNlX2NwdV9pZGxlX3JjdWlkbGUobmV4dF9zdGF0ZSwgZGV2LT5jcHUpOwogCiAJaWYgKGNwdWlkbGVfc3RhdGVfaXNfY291cGxlZChkZXYsIGRydiwgbmV4dF9zdGF0ZSkpCiAJCWVudGVyZWRfc3RhdGUgPSBjcHVpZGxlX2VudGVyX3N0YXRlX2NvdXBsZWQoZGV2LCBkcnYsCkBAIC0xNTQsMTEgKzE1NiwxMSBAQAogCWVsc2UKIAkJZW50ZXJlZF9zdGF0ZSA9IGNwdWlkbGVfZW50ZXJfc3RhdGUoZGV2LCBkcnYsIG5leHRfc3RhdGUpOwogCisJdHJhY2VfY3B1X2lkbGVfcmN1aWRsZShQV1JfRVZFTlRfRVhJVCwgZGV2LT5jcHUpOworCiAJaWYgKGJyb2FkY2FzdCkKIAkJY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VYSVQsICZkZXYtPmNwdSk7CiAKLQl0cmFjZV9jcHVfaWRsZV9yY3VpZGxlKFBXUl9FVkVOVF9FWElULCBkZXYtPmNwdSk7Ci0KIAkvKiBnaXZlIHRoZSBnb3Zlcm5vciBhbiBvcHBvcnR1bml0eSB0byByZWZsZWN0IG9uIHRoZSBvdXRjb21lICovCiAJaWYgKGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+cmVmbGVjdCkKIAkJY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KGRldiwgZW50ZXJlZF9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwppbmRleCA5OGUxNGVlLi5mOGJmMDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKQEAgLTEyMzksOSArMTIzOSwxNyBAQAogCWlmIChudW1fZGN0c19pbnRsdiA9PSAyKSB7CiAJCXNlbGVjdCA9IChzeXNfYWRkciA+PiA4KSAmIDB4MzsKIAkJY2hhbm5lbCA9IHNlbGVjdCA/IDB4MyA6IDA7Ci0JfSBlbHNlIGlmIChudW1fZGN0c19pbnRsdiA9PSA0KQotCQljaGFubmVsID0gKHN5c19hZGRyID4+IDgpICYgMHg3OwotCisJfSBlbHNlIGlmIChudW1fZGN0c19pbnRsdiA9PSA0KSB7CisJCXU4IGludGx2X2FkZHIgPSBkY3Rfc2VsX2ludGVybGVhdmVfYWRkcihwdnQpOworCQlzd2l0Y2ggKGludGx2X2FkZHIpIHsKKwkJY2FzZSAweDQ6CisJCQljaGFubmVsID0gKHN5c19hZGRyID4+IDgpICYgMHgzOworCQkJYnJlYWs7CisJCWNhc2UgMHg1OgorCQkJY2hhbm5lbCA9IChzeXNfYWRkciA+PiA5KSAmIDB4MzsKKwkJCWJyZWFrOworCQl9CisJfQogCXJldHVybiBjaGFubmVsOwogfQogCkBAIC0xNzk5LDYgKzE4MDcsMTcgQEAKIAkJCS5yZWFkX2RjdF9wY2lfY2ZnCT0gZjEwX3JlYWRfZGN0X3BjaV9jZmcsCiAJCX0KIAl9LAorCVtGMTZfTTMwSF9DUFVTXSA9IHsKKwkJLmN0bF9uYW1lID0gIkYxNmhfTTMwaCIsCisJCS5mMV9pZCA9IFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YxLAorCQkuZjNfaWQgPSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTTMwSF9OQl9GMywKKwkJLm9wcyA9IHsKKwkJCS5lYXJseV9jaGFubmVsX2NvdW50CT0gZjF4X2Vhcmx5X2NoYW5uZWxfY291bnQsCisJCQkubWFwX3N5c2FkZHJfdG9fY3Nyb3cJPSBmMXhfbWFwX3N5c2FkZHJfdG9fY3Nyb3csCisJCQkuZGJhbV90b19jcwkJPSBmMTZfZGJhbV90b19jaGlwX3NlbGVjdCwKKwkJCS5yZWFkX2RjdF9wY2lfY2ZnCT0gZjEwX3JlYWRfZGN0X3BjaV9jZmcsCisJCX0KKwl9LAogfTsKIAogLyoKQEAgLTI1NzgsNiArMjU5NywxMSBAQAogCQlicmVhazsKIAogCWNhc2UgMHgxNjoKKwkJaWYgKHB2dC0+bW9kZWwgPT0gMHgzMCkgeworCQkJZmFtX3R5cGUgPSAmZmFtaWx5X3R5cGVzW0YxNl9NMzBIX0NQVVNdOworCQkJcHZ0LT5vcHMgPSAmZmFtaWx5X3R5cGVzW0YxNl9NMzBIX0NQVVNdLm9wczsKKwkJCWJyZWFrOworCQl9CiAJCWZhbV90eXBlCT0gJmZhbWlseV90eXBlc1tGMTZfQ1BVU107CiAJCXB2dC0+b3BzCT0gJmZhbWlseV90eXBlc1tGMTZfQ1BVU10ub3BzOwogCQlicmVhazsKQEAgLTI4MzAsNiArMjg1NCwxNCBAQAogCQkuY2xhc3MJCT0gMCwKIAkJLmNsYXNzX21hc2sJPSAwLAogCX0sCisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQU1ELAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YyLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5jbGFzcwkJPSAwLAorCQkuY2xhc3NfbWFzawk9IDAsCisJfSwKIAogCXswLCB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaCBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmgKaW5kZXggNmRjMWZjYy4uZDkwM2UwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaAorKysgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oCkBAIC0xNjgsNiArMTY4LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0YyCTB4MTYwMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjEJMHgxNTMxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9OQl9GMgkweDE1MzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjEgMHgxNTgxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0YyIDB4MTU4MgogCiAvKgogICogRnVuY3Rpb24gMSAtIEFkZHJlc3MgTWFwCkBAIC0zMDAsNiArMzAyLDcgQEAKIAlGMTVfQ1BVUywKIAlGMTVfTTMwSF9DUFVTLAogCUYxNl9DUFVTLAorCUYxNl9NMzBIX0NQVVMsCiAJTlVNX0ZBTUlMSUVTLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDgxMTFfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2FtZDgxMTFfZWRhYy5jCmluZGV4IGRkZDg5MDAuLjJiNjNmN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ4MTExX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvYW1kODExMV9lZGFjLmMKQEAgLTM1MCw2ICszNTAsNyBAQAogCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYW1kODExMV9kZXZfaW5mbyAqZGV2X2luZm8gPSAmYW1kODExMV9kZXZpY2VzW2lkLT5kcml2ZXJfZGF0YV07CisJaW50IHJldCA9IC1FTk9ERVY7CiAKIAlkZXZfaW5mby0+ZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTUQsCiAJCQkJCWRldl9pbmZvLT5lcnJfZGV2LCBOVUxMKTsKQEAgLTM1OSwxNiArMzYwLDE1IEBACiAJCQkidmVuZG9yICV4LCBkZXZpY2UgJXgsIG5hbWUgJXNcbiIsCiAJCQlQQ0lfVkVORE9SX0lEX0FNRCwgZGV2X2luZm8tPmVycl9kZXYsCiAJCQlkZXZfaW5mby0+Y3RsX25hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBlcnI7CiAJfQogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldl9pbmZvLT5kZXYpKSB7Ci0JCXBjaV9kZXZfcHV0KGRldl9pbmZvLT5kZXYpOwogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBlbmFibGU6IgogCQkJInZlbmRvciAleCwgZGV2aWNlICV4LCBuYW1lICVzXG4iLAogCQkJUENJX1ZFTkRPUl9JRF9BTUQsIGRldl9pbmZvLT5lcnJfZGV2LAogCQkJZGV2X2luZm8tPmN0bF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gZXJyX2Rldl9wdXQ7CiAJfQogCiAJLyoKQEAgLTM4MSw4ICszODEsMTAgQEAKIAkJZWRhY19kZXZpY2VfYWxsb2NfY3RsX2luZm8oMCwgZGV2X2luZm8tPmN0bF9uYW1lLCAxLAogCQkJCQkgICBOVUxMLCAwLCAwLAogCQkJCQkgICBOVUxMLCAwLCBkZXZfaW5mby0+ZWRhY19pZHgpOwotCWlmICghZGV2X2luZm8tPmVkYWNfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWRldl9pbmZvLT5lZGFjX2RldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXZfcHV0OworCX0KIAogCWRldl9pbmZvLT5lZGFjX2Rldi0+cHZ0X2luZm8gPSBkZXZfaW5mbzsKIAlkZXZfaW5mby0+ZWRhY19kZXYtPmRldiA9ICZkZXZfaW5mby0+ZGV2LT5kZXY7CkBAIC0zOTksOCArNDAxLDcgQEAKIAlpZiAoZWRhY19kZXZpY2VfYWRkX2RldmljZShkZXZfaW5mby0+ZWRhY19kZXYpID4gMCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBhZGQgZWRhY19kZXYgZm9yICVzXG4iLAogCQkJZGV2X2luZm8tPmN0bF9uYW1lKTsKLQkJZWRhY19kZXZpY2VfZnJlZV9jdGxfaW5mbyhkZXZfaW5mby0+ZWRhY19kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBlcnJfZWRhY19mcmVlX2N0bDsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJhZGRlZCBvbmUgZWRhY19kZXYgb24gQU1EODExMSAiCkBAIC00MDksNiArNDEwLDEzIEBACiAJCWRldl9pbmZvLT5jdGxfbmFtZSk7CiAKIAlyZXR1cm4gMDsKKworZXJyX2VkYWNfZnJlZV9jdGw6CisJZWRhY19kZXZpY2VfZnJlZV9jdGxfaW5mbyhkZXZfaW5mby0+ZWRhY19kZXYpOworZXJyX2Rldl9wdXQ6CisJcGNpX2Rldl9wdXQoZGV2X2luZm8tPmRldik7CitlcnI6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYW1kODExMV9kZXZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC00MzcsNiArNDQ1LDcgQEAKIAkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGFtZDgxMTFfcGNpX2luZm8gKnBjaV9pbmZvID0gJmFtZDgxMTFfcGNpc1tpZC0+ZHJpdmVyX2RhdGFdOworCWludCByZXQgPSAtRU5PREVWOwogCiAJcGNpX2luZm8tPmRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQU1ELAogCQkJCQlwY2lfaW5mby0+ZXJyX2RldiwgTlVMTCk7CkBAIC00NDYsMTYgKzQ1NSwxNSBAQAogCQkJInZlbmRvciAleCwgZGV2aWNlICV4LCBuYW1lICVzXG4iLAogCQkJUENJX1ZFTkRPUl9JRF9BTUQsIHBjaV9pbmZvLT5lcnJfZGV2LAogCQkJcGNpX2luZm8tPmN0bF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gZXJyOwogCX0KIAogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfaW5mby0+ZGV2KSkgewotCQlwY2lfZGV2X3B1dChwY2lfaW5mby0+ZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gZW5hYmxlOiIKIAkJCSJ2ZW5kb3IgJXgsIGRldmljZSAleCwgbmFtZSAlc1xuIiwKIAkJCVBDSV9WRU5ET1JfSURfQU1ELCBwY2lfaW5mby0+ZXJyX2RldiwKIAkJCXBjaV9pbmZvLT5jdGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycl9kZXZfcHV0OwogCX0KIAogCS8qCkBAIC00NjUsOCArNDczLDEwIEBACiAJKi8KIAlwY2lfaW5mby0+ZWRhY19pZHggPSBlZGFjX3BjaV9hbGxvY19pbmRleCgpOwogCXBjaV9pbmZvLT5lZGFjX2RldiA9IGVkYWNfcGNpX2FsbG9jX2N0bF9pbmZvKDAsIHBjaV9pbmZvLT5jdGxfbmFtZSk7Ci0JaWYgKCFwY2lfaW5mby0+ZWRhY19kZXYpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghcGNpX2luZm8tPmVkYWNfZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rldl9wdXQ7CisJfQogCiAJcGNpX2luZm8tPmVkYWNfZGV2LT5wdnRfaW5mbyA9IHBjaV9pbmZvOwogCXBjaV9pbmZvLT5lZGFjX2Rldi0+ZGV2ID0gJnBjaV9pbmZvLT5kZXYtPmRldjsKQEAgLTQ4Myw4ICs0OTMsNyBAQAogCWlmIChlZGFjX3BjaV9hZGRfZGV2aWNlKHBjaV9pbmZvLT5lZGFjX2RldiwgcGNpX2luZm8tPmVkYWNfaWR4KSA+IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gYWRkIGVkYWNfcGNpIGZvciAlc1xuIiwKIAkJCXBjaV9pbmZvLT5jdGxfbmFtZSk7Ci0JCWVkYWNfcGNpX2ZyZWVfY3RsX2luZm8ocGNpX2luZm8tPmVkYWNfZGV2KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gZXJyX2VkYWNfZnJlZV9jdGw7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiYWRkZWQgb25lIGVkYWNfcGNpIG9uIEFNRDgxMTEgIgpAQCAtNDkzLDYgKzUwMiwxMyBAQAogCQlwY2lfaW5mby0+Y3RsX25hbWUpOwogCiAJcmV0dXJuIDA7CisKK2Vycl9lZGFjX2ZyZWVfY3RsOgorCWVkYWNfcGNpX2ZyZWVfY3RsX2luZm8ocGNpX2luZm8tPmVkYWNfZGV2KTsKK2Vycl9kZXZfcHV0OgorCXBjaV9kZXZfcHV0KHBjaV9pbmZvLT5kZXYpOworZXJyOgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFtZDgxMTFfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9lNzUyeF9lZGFjLmMKaW5kZXggOTJkNTRmYS4uYjJkNzEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jCkBAIC0yMDksNyArMjA5LDYgQEAKICAqLwogCiBzdHJ1Y3QgZTc1MnhfcHZ0IHsKLQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlX2NrOwogCXN0cnVjdCBwY2lfZGV2ICpkZXZfZDBmMDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2X2QwZjE7CiAJdTMyIHRvbG07CkBAIC04OTEsNyArODkwLDcgQEAKIAkJCQkJaW5mby0+YnVmX2ZlcnIpOwogCiAJCWlmIChpbmZvLT5kcmFtX2ZlcnIpCi0JCQlwY2lfd3JpdGVfYml0czE2KHB2dC0+YnJpZGdlX2NrLCBFNzUyWF9EUkFNX0ZFUlIsCisJCQlwY2lfd3JpdGVfYml0czE2KHB2dC0+ZGV2X2QwZjEsIEU3NTJYX0RSQU1fRkVSUiwKIAkJCQkJIGluZm8tPmRyYW1fZmVyciwgaW5mby0+ZHJhbV9mZXJyKTsKIAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfRkVSUl9HTE9CQUwsCkBAIC05MzYsNyArOTM1LDcgQEAKIAkJCQkJaW5mby0+YnVmX25lcnIpOwogCiAJCWlmIChpbmZvLT5kcmFtX25lcnIpCi0JCQlwY2lfd3JpdGVfYml0czE2KHB2dC0+YnJpZGdlX2NrLCBFNzUyWF9EUkFNX05FUlIsCisJCQlwY2lfd3JpdGVfYml0czE2KHB2dC0+ZGV2X2QwZjEsIEU3NTJYX0RSQU1fTkVSUiwKIAkJCQkJIGluZm8tPmRyYW1fbmVyciwgaW5mby0+ZHJhbV9uZXJyKTsKIAogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfTkVSUl9HTE9CQUwsCkBAIC0xMTc3LDM4ICsxMTc2LDMzIEBACiBzdGF0aWMgaW50IGU3NTJ4X2dldF9kZXZzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZGV2X2lkeCwKIAkJCXN0cnVjdCBlNzUyeF9wdnQgKnB2dCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXB2dC0+ZGV2X2QwZjEgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCXB2dC0+ZGV2X2luZm8tPmVycl9kZXYsIE5VTEwpOwogCi0JcHZ0LT5icmlkZ2VfY2sgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkJCXB2dC0+ZGV2X2luZm8tPmVycl9kZXYsIHB2dC0+YnJpZGdlX2NrKTsKLQotCWlmIChwdnQtPmJyaWRnZV9jayA9PSBOVUxMKSB7Ci0JCXB2dC0+YnJpZGdlX2NrID0gcGNpX3NjYW5fc2luZ2xlX2RldmljZShwZGV2LT5idXMsCisJaWYgKHB2dC0+ZGV2X2QwZjEgPT0gTlVMTCkgeworCQlwdnQtPmRldl9kMGYxID0gcGNpX3NjYW5fc2luZ2xlX2RldmljZShwZGV2LT5idXMsCiAJCQkJCQkJUENJX0RFVkZOKDAsIDEpKTsKLQkJcGNpX2Rldl9nZXQocHZ0LT5icmlkZ2VfY2spOworCQlwY2lfZGV2X2dldChwdnQtPmRldl9kMGYxKTsKIAl9CiAKLQlpZiAocHZ0LT5icmlkZ2VfY2sgPT0gTlVMTCkgeworCWlmIChwdnQtPmRldl9kMGYxID09IE5VTEwpIHsKIAkJZTc1MnhfcHJpbnRrKEtFUk5fRVJSLCAiZXJyb3IgcmVwb3J0aW5nIGRldmljZSBub3QgZm91bmQ6IgogCQkJInZlbmRvciAleCBkZXZpY2UgMHgleCAoYnJva2VuIEJJT1M/KVxuIiwKIAkJCVBDSV9WRU5ET1JfSURfSU5URUwsIGU3NTJ4X2RldnNbZGV2X2lkeF0uZXJyX2Rldik7CiAJCXJldHVybiAxOwogCX0KIAotCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJcHZ0LT5kZXZfZDBmMCA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQkJZTc1MnhfZGV2c1tkZXZfaWR4XS5jdGxfZGV2LAogCQkJCU5VTEwpOwogCi0JaWYgKGRldiA9PSBOVUxMKQorCWlmIChwdnQtPmRldl9kMGYwID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKIAotCXB2dC0+ZGV2X2QwZjAgPSBkZXY7Ci0JcHZ0LT5kZXZfZDBmMSA9IHBjaV9kZXZfZ2V0KHB2dC0+YnJpZGdlX2NrKTsKLQogCXJldHVybiAwOwogCiBmYWlsOgotCXBjaV9kZXZfcHV0KHB2dC0+YnJpZGdlX2NrKTsKKwlwY2lfZGV2X3B1dChwdnQtPmRldl9kMGYxKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTM4NSw3ICsxMzc5LDYgQEAKIGZhaWw6CiAJcGNpX2Rldl9wdXQocHZ0LT5kZXZfZDBmMCk7CiAJcGNpX2Rldl9wdXQocHZ0LT5kZXZfZDBmMSk7Ci0JcGNpX2Rldl9wdXQocHZ0LT5icmlkZ2VfY2spOwogCWVkYWNfbWNfZnJlZShtY2kpOwogCiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNDE5LDcgKzE0MTIsNiBAQAogCXB2dCA9IChzdHJ1Y3QgZTc1MnhfcHZ0ICopbWNpLT5wdnRfaW5mbzsKIAlwY2lfZGV2X3B1dChwdnQtPmRldl9kMGYwKTsKIAlwY2lfZGV2X3B1dChwdnQtPmRldl9kMGYxKTsKLQlwY2lfZGV2X3B1dChwdnQtPmJyaWRnZV9jayk7CiAJZWRhY19tY19mcmVlKG1jaSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pMzIwMF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTMyMDBfZWRhYy5jCmluZGV4IGZhMTMyNmUuLjAyMmE3MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pMzIwMF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2kzMjAwX2VkYWMuYwpAQCAtNDY0LDYgKzQ2NCw4IEBACiAJaW91bm1hcChwcml2LT53aW5kb3cpOwogCiAJZWRhY19tY19mcmVlKG1jaSk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpMzIwMF9wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTUxMDBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k1MTAwX2VkYWMuYwppbmRleCAzNmEzOGVlLi42MjQ3ZDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTUxMDBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pNTEwMF9lZGFjLmMKQEAgLTg2OSwxNiArODY5LDEzIEBACiAJCQkgICAgICAgY2hhbiwgcmFuaywgMCk7CiAKIAkJZGltbS0+bnJfcGFnZXMgPSBucGFnZXM7Ci0JCWlmIChucGFnZXMpIHsKLQkJCWRpbW0tPmdyYWluID0gMzI7Ci0JCQlkaW1tLT5kdHlwZSA9IChwcml2LT5tdHJbY2hhbl1bcmFua10ud2lkdGggPT0gNCkgPwotCQkJCQlERVZfWDQgOiBERVZfWDg7Ci0JCQlkaW1tLT5tdHlwZSA9IE1FTV9SRERSMjsKLQkJCWRpbW0tPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOwotCQkJc25wcmludGYoZGltbS0+bGFiZWwsIHNpemVvZihkaW1tLT5sYWJlbCksCi0JCQkJIkRJTU0ldSIsCi0JCQkJaTUxMDBfcmFua190b19zbG90KG1jaSwgY2hhbiwgcmFuaykpOwotCQl9CisJCWRpbW0tPmdyYWluID0gMzI7CisJCWRpbW0tPmR0eXBlID0gKHByaXYtPm10cltjaGFuXVtyYW5rXS53aWR0aCA9PSA0KSA/CisJCQkJREVWX1g0IDogREVWX1g4OworCQlkaW1tLT5tdHlwZSA9IE1FTV9SRERSMjsKKwkJZGltbS0+ZWRhY19tb2RlID0gRURBQ19TRUNERUQ7CisJCXNucHJpbnRmKGRpbW0tPmxhYmVsLCBzaXplb2YoZGltbS0+bGFiZWwpLCAiRElNTSV1IiwKKwkJCSBpNTEwMF9yYW5rX3RvX3Nsb3QobWNpLCBjaGFuLCByYW5rKSk7CiAKIAkJZWRhY19kYmcoMiwgImRpbW0gY2hhbm5lbCAlZCwgcmFuayAlZCwgc2l6ZSAlbGRcbiIsCiAJCQkgY2hhbiwgcmFuaywgKGxvbmcpUEFHRVNfVE9fTWlCKG5wYWdlcykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMKaW5kZXggZTA4MGNiZi4uNTM4MWU5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCkBAIC0xNDA4LDYgKzE0MDgsOCBAQAogCS8qIHJldHJpZXZlIHJlZmVyZW5jZXMgdG8gcmVzb3VyY2VzLCBhbmQgZnJlZSB0aG9zZSByZXNvdXJjZXMgKi8KIAlpNTQwMF9wdXRfZGV2aWNlcyhtY2kpOwogCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCiAJZWRhY19tY19mcmVlKG1jaSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMKaW5kZXggZDg3MTI3NS4uOGJjODNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMKQEAgLTE3MDgsNyArMTcwOCw3IEBACiAJCQkJICAgIGNvbnN0IHN0cnVjdCBtY2UgKm0pCiB7CiAJc3RydWN0IGk3Y29yZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87Ci0JY2hhciAqdHlwZSwgKm9wdHlwZSwgKmVycjsKKwljaGFyICpvcHR5cGUsICplcnI7CiAJZW51bSBod19ldmVudF9tY19lcnJfdHlwZSB0cF9ldmVudDsKIAl1bnNpZ25lZCBsb25nIGVycm9yID0gbS0+c3RhdHVzICYgMHgxZmYwMDAwbDsKIAlib29sIHVuY29ycmVjdGVkX2Vycm9yID0gbS0+bWNnc3RhdHVzICYgMWxsIDw8IDYxOwpAQCAtMTcyMSwxNSArMTcyMSwxMSBAQAogCXUzMiBlcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmZXJyb3IsIDMyKTsKIAogCWlmICh1bmNvcnJlY3RlZF9lcnJvcikgewotCQlpZiAocmlwdikgewotCQkJdHlwZSA9ICJGQVRBTCI7CisJCWlmIChyaXB2KQogCQkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfRkFUQUw7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlID0gIk5PTl9GQVRBTCI7CisJCWVsc2UKIAkJCXRwX2V2ZW50ID0gSFdfRVZFTlRfRVJSX1VOQ09SUkVDVEVEOwotCQl9CiAJfSBlbHNlIHsKLQkJdHlwZSA9ICJDT1JSRUNURUQiOwogCQl0cF9ldmVudCA9IEhXX0VWRU5UX0VSUl9DT1JSRUNURUQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKaW5kZXggODA1NzNkZi4uOGQwNDUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYwpAQCAtNDA2LDggKzQwNiw2IEBACiAKIAllZGFjX2RiZygwLCAiXG4iKTsKIAotCW92cmZsX3BkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORF9ERVYoSU5URUwsIDgyODc1XzYpLCBOVUxMKTsKLQogCWlmIChpODI4NzVwX3NldHVwX292ZXJmbF9kZXYocGRldiwgJm92cmZsX3BkZXYsICZvdnJmbF93aW5kb3cpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlkcmMgPSByZWFkbChvdnJmbF93aW5kb3cgKyBJODI4NzVQX0RSQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jIGIvZHJpdmVycy9lZGFjL21jZV9hbWQuYwppbmRleCAzMGY3MzA5Li41MWI5Y2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCisrKyBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKQEAgLTc0MSw2ICs3NDEsMzYgQEAKIAlpZiAoYW1kX2ZpbHRlcl9tY2UobSkpCiAJCXJldHVybiBOT1RJRllfU1RPUDsKIAorCXByX2VtZXJnKEhXX0VSUiAiJXNcbiIsIGRlY29kZV9lcnJvcl9zdGF0dXMobSkpOworCisJcHJfZW1lcmcoSFdfRVJSICJDUFU6JWQgKCV4OiV4OiV4KSBNQyVkX1NUQVRVU1slc3wlc3wlc3wlc3wlcyIsCisJCW0tPmV4dGNwdSwKKwkJYy0+eDg2LCBjLT54ODZfbW9kZWwsIGMtPng4Nl9tYXNrLAorCQltLT5iYW5rLAorCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfT1ZFUikJPyAiT3ZlciIgIDogIi0iKSwKKwkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1VDKQk/ICJVRSIJICA6ICJDRSIpLAorCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfTUlTQ1YpCT8gIk1pc2NWIiA6ICItIiksCisJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19QQ0MpCT8gIlBDQyIJICA6ICItIiksCisJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikJPyAiQWRkclYiIDogIi0iKSk7CisKKwlpZiAoYy0+eDg2ID09IDB4MTUgfHwgYy0+eDg2ID09IDB4MTYpCisJCXByX2NvbnQoInwlc3wlcyIsCisJCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfREVGRVJSRUQpID8gIkRlZmVycmVkIiA6ICItIiksCisJCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfUE9JU09OKSAgID8gIlBvaXNvbiIgICA6ICItIikpOworCisJLyogZG8gdGhlIHR3byBiaXRzWzE0OjEzXSB0b2dldGhlciAqLworCWVjYyA9IChtLT5zdGF0dXMgPj4gNDUpICYgMHgzOworCWlmIChlY2MpCisJCXByX2NvbnQoInwlc0VDQyIsICgoZWNjID09IDIpID8gIkMiIDogIlUiKSk7CisKKwlwcl9jb250KCJdOiAweCUwMTZsbHhcbiIsIG0tPnN0YXR1cyk7CisKKwlpZiAobS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikKKwkJcHJfZW1lcmcoSFdfRVJSICJNQyVkX0FERFI6IDB4JTAxNmxseFxuIiwgbS0+YmFuaywgbS0+YWRkcik7CisKKwlpZiAoIWZhbV9vcHMpCisJCWdvdG8gZXJyX2NvZGU7CisKIAlzd2l0Y2ggKG0tPmJhbmspIHsKIAljYXNlIDA6CiAJCWRlY29kZV9tYzBfbWNlKG0pOwpAQCAtNzc0LDMzICs4MDQsNyBAQAogCQlicmVhazsKIAl9CiAKLQlwcl9lbWVyZyhIV19FUlIgIkVycm9yIFN0YXR1czogJXNcbiIsIGRlY29kZV9lcnJvcl9zdGF0dXMobSkpOwotCi0JcHJfZW1lcmcoSFdfRVJSICJDUFU6JWQgKCV4OiV4OiV4KSBNQyVkX1NUQVRVU1slc3wlc3wlc3wlc3wlcyIsCi0JCW0tPmV4dGNwdSwKLQkJYy0+eDg2LCBjLT54ODZfbW9kZWwsIGMtPng4Nl9tYXNrLAotCQltLT5iYW5rLAotCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfT1ZFUikJPyAiT3ZlciIgIDogIi0iKSwKLQkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1VDKQk/ICJVRSIJICA6ICJDRSIpLAotCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfTUlTQ1YpCT8gIk1pc2NWIiA6ICItIiksCi0JCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19QQ0MpCT8gIlBDQyIJICA6ICItIiksCi0JCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikJPyAiQWRkclYiIDogIi0iKSk7Ci0KLQlpZiAoYy0+eDg2ID09IDB4MTUgfHwgYy0+eDg2ID09IDB4MTYpCi0JCXByX2NvbnQoInwlc3wlcyIsCi0JCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfREVGRVJSRUQpID8gIkRlZmVycmVkIiA6ICItIiksCi0JCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfUE9JU09OKSAgID8gIlBvaXNvbiIgICA6ICItIikpOwotCi0JLyogZG8gdGhlIHR3byBiaXRzWzE0OjEzXSB0b2dldGhlciAqLwotCWVjYyA9IChtLT5zdGF0dXMgPj4gNDUpICYgMHgzOwotCWlmIChlY2MpCi0JCXByX2NvbnQoInwlc0VDQyIsICgoZWNjID09IDIpID8gIkMiIDogIlUiKSk7Ci0KLQlwcl9jb250KCJdOiAweCUwMTZsbHhcbiIsIG0tPnN0YXR1cyk7Ci0KLQlpZiAobS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikKLQkJcHJfZW1lcmcoSFdfRVJSICJNQyVkX0FERFI6IDB4JTAxNmxseFxuIiwgbS0+YmFuaywgbS0+YWRkcik7Ci0KKyBlcnJfY29kZToKIAlhbWRfZGVjb2RlX2Vycl9jb2RlKG0tPnN0YXR1cyAmIDB4ZmZmZik7CiAKIAlyZXR1cm4gTk9USUZZX1NUT1A7CkBAIC04MTYsMTAgKzgyMCw3IEBACiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CiAKIAlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYy0+eDg2IDwgMHhmIHx8IGMtPng4NiA+IDB4MTYpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCWZhbV9vcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW1kX2RlY29kZXJfb3BzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmYW1fb3BzKQpAQCAtODc0LDcgKzg3NSw3IEBACiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiSHVoPyBXaGF0IGZhbWlseSBpcyBpdDogMHgleD8hXG4iLCBjLT54ODYpOwogCQlrZnJlZShmYW1fb3BzKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWZhbV9vcHMgPSBOVUxMOwogCX0KIAogCXByX2luZm8oIk1DRTogSW4ta2VybmVsIE1DRSBkZWNvZGluZyBlbmFibGVkLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKaW5kZXggOGY5MTgyMS4uZjRhZWMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJCXBkYXRhLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvcC0+ZGV2Lm9mX25vZGUsIDApOwogCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZvcC0+ZGV2LCBwZGF0YS0+aXJxLAogCQkJCSAgICAgICBtcGM4NXh4X3BjaV9pc3IsCi0JCQkJICAgICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwkJCQkgICAgICAgSVJRRl9TSEFSRUQsCiAJCQkJICAgICAgICJbRURBQ10gUENJIGVyciIsIHBjaSk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTYzMyw3ICs2MzMsNyBAQAogCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpIHsKIAkJcGRhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5kZXYub2Zfbm9kZSwgMCk7CiAJCXJlcyA9IGRldm1fcmVxdWVzdF9pcnEoJm9wLT5kZXYsIHBkYXRhLT5pcnEsCi0JCQkJICAgICAgIG1wYzg1eHhfbDJfaXNyLCBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgICBtcGM4NXh4X2wyX2lzciwgMCwKIAkJCQkgICAgICAgIltFREFDXSBMMiBlcnIiLCBlZGFjX2Rldik7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTExMzMsNyArMTEzMyw3IEBACiAJCXBkYXRhLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvcC0+ZGV2Lm9mX25vZGUsIDApOwogCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZvcC0+ZGV2LCBwZGF0YS0+aXJxLAogCQkJCSAgICAgICBtcGM4NXh4X21jX2lzciwKLQkJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCQkJCSAgICAgICBJUlFGX1NIQVJFRCwKIAkJCQkgICAgICAgIltFREFDXSBNQyBlcnIiLCBtY2kpOwogCQlpZiAocmVzIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvb2N0ZW9uX2VkYWMtbG1jLmMgYi9kcml2ZXJzL2VkYWMvb2N0ZW9uX2VkYWMtbG1jLmMKaW5kZXggOTM0MTJkNi4uNGJkMTBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL29jdGVvbl9lZGFjLWxtYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9vY3Rlb25fZWRhYy1sbWMuYwpAQCAtNSwxMiArNSwxNiBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwOSBXaW5kIFJpdmVyIFN5c3RlbXMsCiAgKiAgIHdyaXR0ZW4gYnkgUmFsZiBCYWVjaGxlIDxyYWxmQGxpbnV4LW1pcHMub3JnPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBieSBDaXNjbyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtbG1jeC1kZWZzLmg+CkBAIC0yMCw2ICsyNCwxOCBAQAogCiAjZGVmaW5lIE9DVEVPTl9NQVhfTUMgNAogCisjZGVmaW5lIHRvX21jaShrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IG1lbV9jdGxfaW5mbywgZGV2KQorCitzdHJ1Y3Qgb2N0ZW9uX2xtY19wdnQgeworCXVuc2lnbmVkIGxvbmcgaW5qZWN0OworCXVuc2lnbmVkIGxvbmcgZXJyb3JfdHlwZTsKKwl1bnNpZ25lZCBsb25nIGRpbW07CisJdW5zaWduZWQgbG9uZyByYW5rOworCXVuc2lnbmVkIGxvbmcgYmFuazsKKwl1bnNpZ25lZCBsb25nIHJvdzsKKwl1bnNpZ25lZCBsb25nIGNvbDsKK307CisKIHN0YXRpYyB2b2lkIG9jdGVvbl9sbWNfZWRhY19wb2xsKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKIHsKIAl1bmlvbiBjdm14X2xtY3hfbWVtX2NmZzAgY2ZnMDsKQEAgLTU1LDE0ICs3MSwzMSBAQAogCiBzdGF0aWMgdm9pZCBvY3Rlb25fbG1jX2VkYWNfcG9sbF9vMihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCiB7CisJc3RydWN0IG9jdGVvbl9sbWNfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwogCXVuaW9uIGN2bXhfbG1jeF9pbnQgaW50X3JlZzsKIAlib29sIGRvX2NsZWFyID0gZmFsc2U7CiAJY2hhciBtc2dbNjRdOwogCi0JaW50X3JlZy51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTE1DWF9JTlQobWNpLT5tY19pZHgpKTsKKwlpZiAoIXB2dC0+aW5qZWN0KQorCQlpbnRfcmVnLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MTUNYX0lOVChtY2ktPm1jX2lkeCkpOworCWVsc2UgeworCQlpZiAocHZ0LT5lcnJvcl90eXBlID09IDEpCisJCQlpbnRfcmVnLnMuc2VjX2VyciA9IDE7CisJCWlmIChwdnQtPmVycm9yX3R5cGUgPT0gMikKKwkJCWludF9yZWcucy5kZWRfZXJyID0gMTsKKwl9CisKIAlpZiAoaW50X3JlZy5zLnNlY19lcnIgfHwgaW50X3JlZy5zLmRlZF9lcnIpIHsKIAkJdW5pb24gY3ZteF9sbWN4X2ZhZHIgZmFkcjsKLQkJZmFkci51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTE1DWF9GQURSKG1jaS0+bWNfaWR4KSk7CisJCWlmIChsaWtlbHkoIXB2dC0+aW5qZWN0KSkKKwkJCWZhZHIudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX0xNQ1hfRkFEUihtY2ktPm1jX2lkeCkpOworCQllbHNlIHsKKwkJCWZhZHIuY242MXh4LmZkaW1tID0gcHZ0LT5kaW1tOworCQkJZmFkci5jbjYxeHguZmJ1bmsgPSBwdnQtPnJhbms7CisJCQlmYWRyLmNuNjF4eC5mYmFuayA9IHB2dC0+YmFuazsKKwkJCWZhZHIuY242MXh4LmZyb3cgPSBwdnQtPnJvdzsKKwkJCWZhZHIuY242MXh4LmZjb2wgPSBwdnQtPmNvbDsKKwkJfQogCQlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAogCQkJICJESU1NICVkIHJhbmsgJWQgYmFuayAlZCByb3cgJWQgY29sICVkIiwKIAkJCSBmYWRyLmNuNjF4eC5mZGltbSwgZmFkci5jbjYxeHguZmJ1bmssCkBAIC04Miw4ICsxMTUsMTI4IEBACiAJCWludF9yZWcucy5kZWRfZXJyID0gLTE7CS8qIERvbmUsIHJlLWFybSAqLwogCQlkb19jbGVhciA9IHRydWU7CiAJfQotCWlmIChkb19jbGVhcikKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MTUNYX0lOVChtY2ktPm1jX2lkeCksIGludF9yZWcudTY0KTsKKworCWlmIChkb19jbGVhcikgeworCQlpZiAobGlrZWx5KCFwdnQtPmluamVjdCkpCisJCQljdm14X3dyaXRlX2NzcihDVk1YX0xNQ1hfSU5UKG1jaS0+bWNfaWR4KSwgaW50X3JlZy51NjQpOworCQllbHNlCisJCQlwdnQtPmluamVjdCA9IDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIE1DIFNZU0ZTIHBhcnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPbmx5IGEgY291cGxlIG5hbWluZyBkaWZmZXJlbmNlcyBwZXIgdGVtcGxhdGUsIHNvIHZlcnkgc2ltaWxhciAqLworI2RlZmluZSBURU1QTEFURV9TSE9XKHJlZykJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBvY3Rlb25fbWNfaW5qZWN0XyMjcmVnIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICAgICBjaGFyICpkYXRhKQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOwkJCQlcCisJc3RydWN0IG9jdGVvbl9sbWNfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiJTAxNmxsdVxuIiwgKHU2NClwdnQtPnJlZyk7CQlcCit9CisKKyNkZWZpbmUgVEVNUExBVEVfU1RPUkUocmVnKQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IG9jdGVvbl9tY19pbmplY3RfIyNyZWcjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOwkJCQlcCisJc3RydWN0IG9jdGVvbl9sbWNfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwkJCVwKKwlpZiAoaXNkaWdpdCgqZGF0YSkpIHsJCQkJCQlcCisJCWlmICgha3N0cnRvdWwoZGF0YSwgMCwgJnB2dC0+cmVnKSkJCQlcCisJCQlyZXR1cm4gY291bnQ7CQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAwOwkJCQkJCQlcCit9CisKK1RFTVBMQVRFX1NIT1coaW5qZWN0KTsKK1RFTVBMQVRFX1NUT1JFKGluamVjdCk7CitURU1QTEFURV9TSE9XKGRpbW0pOworVEVNUExBVEVfU1RPUkUoZGltbSk7CitURU1QTEFURV9TSE9XKGJhbmspOworVEVNUExBVEVfU1RPUkUoYmFuayk7CitURU1QTEFURV9TSE9XKHJhbmspOworVEVNUExBVEVfU1RPUkUocmFuayk7CitURU1QTEFURV9TSE9XKHJvdyk7CitURU1QTEFURV9TVE9SRShyb3cpOworVEVNUExBVEVfU0hPVyhjb2wpOworVEVNUExBVEVfU1RPUkUoY29sKTsKKworc3RhdGljIHNzaXplX3Qgb2N0ZW9uX21jX2luamVjdF9lcnJvcl90eXBlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjb25zdCBjaGFyICpkYXRhLAorCQkJCQkgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2xtY19wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwlpZiAoIXN0cm5jbXAoZGF0YSwgInNpbmdsZSIsIDYpKQorCQlwdnQtPmVycm9yX3R5cGUgPSAxOworCWVsc2UgaWYgKCFzdHJuY21wKGRhdGEsICJkb3VibGUiLCA2KSkKKwkJcHZ0LT5lcnJvcl90eXBlID0gMjsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgb2N0ZW9uX21jX2luamVjdF9lcnJvcl90eXBlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBvY3Rlb25fbG1jX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlpZiAocHZ0LT5lcnJvcl90eXBlID09IDEpCisJCXJldHVybiBzcHJpbnRmKGRhdGEsICJzaW5nbGUiKTsKKwllbHNlIGlmIChwdnQtPmVycm9yX3R5cGUgPT0gMikKKwkJcmV0dXJuIHNwcmludGYoZGF0YSwgImRvdWJsZSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbmplY3QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBvY3Rlb25fbWNfaW5qZWN0X2luamVjdF9zaG93LCBvY3Rlb25fbWNfaW5qZWN0X2luamVjdF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZXJyb3JfdHlwZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG9jdGVvbl9tY19pbmplY3RfZXJyb3JfdHlwZV9zaG93LCBvY3Rlb25fbWNfaW5qZWN0X2Vycm9yX3R5cGVfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGRpbW0sIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBvY3Rlb25fbWNfaW5qZWN0X2RpbW1fc2hvdywgb2N0ZW9uX21jX2luamVjdF9kaW1tX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyYW5rLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgb2N0ZW9uX21jX2luamVjdF9yYW5rX3Nob3csIG9jdGVvbl9tY19pbmplY3RfcmFua19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuaywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG9jdGVvbl9tY19pbmplY3RfYmFua19zaG93LCBvY3Rlb25fbWNfaW5qZWN0X2Jhbmtfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHJvdywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG9jdGVvbl9tY19pbmplY3Rfcm93X3Nob3csIG9jdGVvbl9tY19pbmplY3Rfcm93X3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjb2wsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBvY3Rlb25fbWNfaW5qZWN0X2NvbF9zaG93LCBvY3Rlb25fbWNfaW5qZWN0X2NvbF9zdG9yZSk7CisKKworc3RhdGljIGludCBvY3Rlb25fc2V0X21jX3N5c2ZzX2F0dHJpYnV0ZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCWludCByYzsKKworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2Vycm9yX3R5cGUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9kaW1tKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfcmFuayk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2JhbmspOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9yb3cpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9jb2wpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG9jdGVvbl9sbWNfZWRhY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtOTIsNiArMjQ1LDggQEAKIAlzdHJ1Y3QgZWRhY19tY19sYXllciBsYXllcnNbMV07CiAJaW50IG1jID0gcGRldi0+aWQ7CiAKKwlvcHN0YXRlX2luaXQoKTsKKwogCWxheWVyc1swXS50eXBlID0gRURBQ19NQ19MQVlFUl9DSEFOTkVMOwogCWxheWVyc1swXS5zaXplID0gMTsKIAlsYXllcnNbMF0uaXNfdmlydF9jc3JvdyA9IGZhbHNlOwpAQCAtMTA1LDcgKzI2MCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCW1jaSA9IGVkYWNfbWNfYWxsb2MobWMsIEFSUkFZX1NJWkUobGF5ZXJzKSwgbGF5ZXJzLCAwKTsKKwkJbWNpID0gZWRhY19tY19hbGxvYyhtYywgQVJSQVlfU0laRShsYXllcnMpLCBsYXllcnMsIHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2xtY19wdnQpKTsKIAkJaWYgKCFtY2kpCiAJCQlyZXR1cm4gLUVOWElPOwogCkBAIC0xMjIsNiArMjc3LDEyIEBACiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAKKwkJaWYgKG9jdGVvbl9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcyhtY2kpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvY3Rlb25fc2V0X21jX3N5c2ZzX2F0dHJpYnV0ZXMoKSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCisKIAkJY2ZnMC51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTE1DWF9NRU1fQ0ZHMChtYykpOwogCQljZmcwLnMuaW50cl9kZWRfZW5hID0gMDsJLyogV2UgcG9sbCAqLwogCQljZmcwLnMuaW50cl9zZWNfZW5hID0gMDsKQEAgLTEzNyw3ICsyOTgsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQltY2kgPSBlZGFjX21jX2FsbG9jKG1jLCBBUlJBWV9TSVpFKGxheWVycyksIGxheWVycywgMCk7CisJCW1jaSA9IGVkYWNfbWNfYWxsb2MobWMsIEFSUkFZX1NJWkUobGF5ZXJzKSwgbGF5ZXJzLCBzaXplb2Yoc3RydWN0IG9jdGVvbl9sbWNfcHZ0KSk7CiAJCWlmICghbWNpKQogCQkJcmV0dXJuIC1FTlhJTzsKIApAQCAtMTU0LDYgKzMxNSwxMiBAQAogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCisJCWlmIChvY3Rlb25fc2V0X21jX3N5c2ZzX2F0dHJpYnV0ZXMobWNpKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAib2N0ZW9uX3NldF9tY19zeXNmc19hdHRyaWJ1dGVzKCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCiAJCWVuLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MTUNYX01FTV9DRkcwKG1jKSk7CiAJCWVuLnMuaW50cl9kZWRfZW5hID0gMDsJLyogV2UgcG9sbCAqLwogCQllbi5zLmludHJfc2VjX2VuYSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jIGIvZHJpdmVycy9lZGFjL3NiX2VkYWMuYwppbmRleCA1NGUyYWJlLi4zNDdjN2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKQEAgLTEyNjMsNyArMTI2Myw3IEBACiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwogCXU4IGJ1cyA9IDA7CiAKLQlzYnJpZGdlX3ByaW50ayhLRVJOX0lORk8sCisJc2JyaWRnZV9wcmludGsoS0VSTl9ERUJVRywKIAkJIlNlZWtpbmcgZm9yOiBkZXYgJTAyeC4lZCBQQ0kgSUQgJTA0eDolMDR4XG4iLAogCQlkZXZfZGVzY3ItPmRldiwgZGV2X2Rlc2NyLT5mdW5jLAogCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZfZGVzY3ItPmRldl9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9LY29uZmlnIGIvZHJpdmVycy9leHRjb24vS2NvbmZpZwppbmRleCBiZGI1YTAwLi5iZTU2ZThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvZXh0Y29uL0tjb25maWcKQEAgLTE0LDEwICsxNCw2IEBACiAKIGNvbW1lbnQgIkV4dGNvbiBEZXZpY2UgRHJpdmVycyIKIAotY29uZmlnIE9GX0VYVENPTgotCWRlZl90cmlzdGF0ZSB5Ci0JZGVwZW5kcyBvbiBPRgotCiBjb25maWcgRVhUQ09OX0dQSU8KIAl0cmlzdGF0ZSAiR1BJTyBleHRjb24gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEdQSU9MSUIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL01ha2VmaWxlIGIvZHJpdmVycy9leHRjb24vTWFrZWZpbGUKaW5kZXggNDNlY2NjMC4uYmY3ODYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9leHRjb24vTWFrZWZpbGUKQEAgLTIsOCArMiw2IEBACiAjIE1ha2VmaWxlIGZvciBleHRlcm5hbCBjb25uZWN0b3IgY2xhc3MgKGV4dGNvbikgZGV2aWNlcwogIwogCi1vYmotJChDT05GSUdfT0ZfRVhUQ09OKQkJKz0gb2ZfZXh0Y29uLm8KLQogb2JqLSQoQ09ORklHX0VYVENPTikJCSs9IGV4dGNvbi1jbGFzcy5vCiBvYmotJChDT05GSUdfRVhUQ09OX0dQSU8pCSs9IGV4dGNvbi1ncGlvLm8KIG9iai0kKENPTkZJR19FWFRDT05fQURDX0pBQ0spCSs9IGV4dGNvbi1hZGMtamFjay5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tY2xhc3MuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1jbGFzcy5jCmluZGV4IDc2MzIyMzMuLjdhYjIxYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1jbGFzcy5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1jbGFzcy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXh0Y29uLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogLyoKICAqIGV4dGNvbl9jYWJsZV9uYW1lIHN1Z2dlc3RzIHRoZSBzdGFuZGFyZCBjYWJsZSBuYW1lcyBmb3IgY29tbW9ubHkgdXNlZApAQCAtODE4LDYgKzgxOSw0NyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX2Rldl91bnJlZ2lzdGVyKTsKIAorI2lmZGVmIENPTkZJR19PRgorLyoKKyAqIGV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlIC0gR2V0IHRoZSBleHRjb24gZGV2aWNlIGZyb20gZGV2aWNldHJlZQorICogQGRldiAtIGluc3RhbmNlIHRvIHRoZSBnaXZlbiBkZXZpY2UKKyAqIEBpbmRleCAtIGluZGV4IGludG8gbGlzdCBvZiBleHRjb25fZGV2CisgKgorICogcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiBleHRjb24gZGV2aWNlCisgKi8KK3N0cnVjdCBleHRjb25fZGV2ICpleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGV4dGNvbl9kZXYgKmVkZXY7CisKKwlpZiAoIWRldi0+b2Zfbm9kZSkgeworCQlkZXZfZXJyKGRldiwgImRldmljZSBkb2VzIG5vdCBoYXZlIGEgZGV2aWNlIG5vZGUgZW50cnlcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsICJleHRjb24iLCBpbmRleCk7CisJaWYgKCFub2RlKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBwaGFuZGxlIGluICVzIG5vZGVcbiIsCisJCQlkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCWVkZXYgPSBleHRjb25fZ2V0X2V4dGNvbl9kZXYobm9kZS0+bmFtZSk7CisJaWYgKCFlZGV2KSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdldCBleHRjb24gZGV2aWNlIDogJXNcbiIsIG5vZGUtPm5hbWUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwlyZXR1cm4gZWRldjsKK30KKyNlbHNlCitzdHJ1Y3QgZXh0Y29uX2RldiAqZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Cit9CisjZW5kaWYgLyogQ09ORklHX09GICovCitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZSk7CisKIHN0YXRpYyBpbnQgX19pbml0IGV4dGNvbl9jbGFzc19pbml0KHZvaWQpCiB7CiAJcmV0dXJuIGNyZWF0ZV9leHRjb25fY2xhc3MoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jCmluZGV4IGE2M2E2YjIuLjEzZDUyMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWdwaW8uYwpAQCAtMTc2LDkgKzE3Niw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGdwaW9fZXh0Y29uX3BtX29wcyA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhOVUxMLCBncGlvX2V4dGNvbl9yZXN1bWUpCi19Oworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGdwaW9fZXh0Y29uX3BtX29wcywgTlVMTCwgZ3Bpb19leHRjb25fcmVzdW1lKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19leHRjb25fZHJpdmVyID0gewogCS5wcm9iZQkJPSBncGlvX2V4dGNvbl9wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYwppbmRleCAyYWVhNGJjLi5kZGZmMmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXBhbG1hcy5jCkBAIC0yNzEsMTAgKzI3MSw3IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwYWxtYXNfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBhbG1hc191c2Jfc3VzcGVuZCwKLQkJCQlwYWxtYXNfdXNiX3Jlc3VtZSkKLX07CitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocGFsbWFzX3BtX29wcywgcGFsbWFzX3VzYl9zdXNwZW5kLCBwYWxtYXNfdXNiX3Jlc3VtZSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3BhbG1hc19tYXRjaF90YmxbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInRpLHBhbG1hcy11c2IiLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vb2ZfZXh0Y29uLmMgYi9kcml2ZXJzL2V4dGNvbi9vZl9leHRjb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxNzNlYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2V4dGNvbi9vZl9leHRjb24uYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBPRiBoZWxwZXJzIGZvciBFeHRlcm5hbCBjb25uZWN0b3IgKGV4dGNvbikgZnJhbWV3b3JrCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCi0gKiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiBDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXh0Y29uLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi9vZl9leHRjb24uaD4KLQotLyoKLSAqIG9mX2V4dGNvbl9nZXRfZXh0Y29uX2RldiAtIEdldCB0aGUgbmFtZSBvZiBleHRjb24gZGV2aWNlIGZyb20gZGV2aWNldHJlZQotICogQGRldiAtIGluc3RhbmNlIHRvIHRoZSBnaXZlbiBkZXZpY2UKLSAqIEBpbmRleCAtIGluZGV4IGludG8gbGlzdCBvZiBleHRjb25fZGV2Ci0gKgotICogcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiBleHRjb24gZGV2aWNlCi0gKi8KLXN0cnVjdCBleHRjb25fZGV2ICpvZl9leHRjb25fZ2V0X2V4dGNvbl9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCXN0cnVjdCBleHRjb25fZGV2ICplZGV2OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmV4dGNvbl9wYXJlbnRfZGV2OwotCi0JaWYgKCFkZXYtPm9mX25vZGUpIHsKLQkJZGV2X2RiZyhkZXYsICJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGRldmljZSBub2RlIGVudHJ5XG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCi0Jbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAiZXh0Y29uIiwgaW5kZXgpOwotCWlmICghbm9kZSkgewotCQlkZXZfZGJnKGRldiwgImZhaWxlZCB0byBnZXQgcGhhbmRsZSBpbiAlcyBub2RlXG4iLAotCQkJZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9Ci0KLQlleHRjb25fcGFyZW50X2RldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobm9kZSk7Ci0JaWYgKCFleHRjb25fcGFyZW50X2RldikgewotCQlkZXZfZGJnKGRldiwgInVuYWJsZSB0byBmaW5kIGRldmljZSBieSBub2RlXG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7Ci0JfQotCi0JZWRldiA9IGV4dGNvbl9nZXRfZXh0Y29uX2RldihkZXZfbmFtZSgmZXh0Y29uX3BhcmVudF9kZXYtPmRldikpOwotCWlmICghZWRldikgewotCQlkZXZfZGJnKGRldiwgInVuYWJsZSB0byBnZXQgZXh0Y29uIGRldmljZSA6ICVzXG4iLAotCQkJCWRldl9uYW1lKCZleHRjb25fcGFyZW50X2Rldi0+ZGV2KSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCX0KLQotCXJldHVybiBlZGV2OwotfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfZXh0Y29uX2dldF9leHRjb25fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCmluZGV4IDFiNWU4ZTQuLjcxNjBjNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYwpAQCAtNTg0LDcgKzU4NCw3IEBACiAJLnJlbW92ZQkJPSBkY2RiYXNfcmVtb3ZlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaW5mbyBkY2RiYXNfZGV2X2luZm8gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2luZm8gZGNkYmFzX2Rldl9pbmZvIF9faW5pdGNvbnN0ID0gewogCS5uYW1lCQk9IERSSVZFUl9OQU1FLAogCS5pZAkJPSAtMSwKIAkuZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLXN0dWItaGVscGVyLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktc3R1Yi1oZWxwZXIuYwppbmRleCBiNmJmZmJmLi5mZjUwYWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktc3R1Yi1oZWxwZXIuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktc3R1Yi1oZWxwZXIuYwpAQCAtMTYsMTggKzE2LDYgQEAKIAl1NjQgc2l6ZTsKIH07CiAKLQotCi0KLXN0YXRpYyB2b2lkIGVmaV9jaGFyMTZfcHJpbnRrKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywKLQkJCSAgICAgIGVmaV9jaGFyMTZfdCAqc3RyKQotewotCXN0cnVjdCBlZmlfc2ltcGxlX3RleHRfb3V0cHV0X3Byb3RvY29sICpvdXQ7Ci0KLQlvdXQgPSAoc3RydWN0IGVmaV9zaW1wbGVfdGV4dF9vdXRwdXRfcHJvdG9jb2wgKilzeXNfdGFibGVfYXJnLT5jb25fb3V0OwotCWVmaV9jYWxsX3BoeXMyKG91dC0+b3V0cHV0X3N0cmluZywgb3V0LCBzdHIpOwotfQotCiBzdGF0aWMgdm9pZCBlZmlfcHJpbnRrKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywgY2hhciAqc3RyKQogewogCWNoYXIgKnM4OwpAQCAtNjUsMjAgKzUzLDIzIEBACiAJICogYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgaW4gYSBuZXcgZGVzY3JpcHRvciByZWdpb24uCiAJICovCiAJKm1hcF9zaXplICs9IHNpemVvZigqbSk7Ci0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJRUZJX0xPQURFUl9EQVRBLCAqbWFwX3NpemUsICh2b2lkICoqKSZtKTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wb29sLCBFRklfTE9BREVSX0RBVEEsCisJCQkJKm1hcF9zaXplLCAodm9pZCAqKikmbSk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJZ290byBmYWlsOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czUoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmdldF9tZW1vcnlfbWFwLAotCQkJCW1hcF9zaXplLCBtLCAma2V5LCBkZXNjX3NpemUsICZkZXNjX3ZlcnNpb24pOworCSpkZXNjX3NpemUgPSAwOworCWtleSA9IDA7CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoZ2V0X21lbW9yeV9tYXAsIG1hcF9zaXplLCBtLAorCQkJCSZrZXksIGRlc2Nfc2l6ZSwgJmRlc2NfdmVyc2lvbik7CiAJaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkgewotCQllZmlfY2FsbF9waHlzMShzeXNfdGFibGVfYXJnLT5ib290dGltZS0+ZnJlZV9wb29sLCBtKTsKKwkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtKTsKIAkJZ290byBhZ2FpbjsKIAl9CiAKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQotCQllZmlfY2FsbF9waHlzMShzeXNfdGFibGVfYXJnLT5ib290dGltZS0+ZnJlZV9wb29sLCBtKTsKKwkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtKTsKKwogCWlmIChrZXlfcHRyICYmIHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKIAkJKmtleV9wdHIgPSBrZXk7CiAJaWYgKGRlc2NfdmVyICYmIHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKQEAgLTE1OCw3ICsxNDksNyBAQAogCWlmICghbWF4X2FkZHIpCiAJCXN0YXR1cyA9IEVGSV9OT1RfRk9VTkQ7CiAJZWxzZSB7Ci0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM0KHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5hbGxvY2F0ZV9wYWdlcywKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcGFnZXMsCiAJCQkJCUVGSV9BTExPQ0FURV9BRERSRVNTLCBFRklfTE9BREVSX0RBVEEsCiAJCQkJCW5yX3BhZ2VzLCAmbWF4X2FkZHIpOwogCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CkBAIC0xNzAsOCArMTYxLDcgQEAKIAkJKmFkZHIgPSBtYXhfYWRkcjsKIAl9CiAKLQllZmlfY2FsbF9waHlzMShzeXNfdGFibGVfYXJnLT5ib290dGltZS0+ZnJlZV9wb29sLCBtYXApOwotCisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtYXApOwogZmFpbDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjMxLDcgKzIyMSw3IEBACiAJCWlmICgoc3RhcnQgKyBzaXplKSA+IGVuZCkKIAkJCWNvbnRpbnVlOwogCi0JCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXM0KHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5hbGxvY2F0ZV9wYWdlcywKKwkJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcGFnZXMsCiAJCQkJCUVGSV9BTExPQ0FURV9BRERSRVNTLCBFRklfTE9BREVSX0RBVEEsCiAJCQkJCW5yX3BhZ2VzLCAmc3RhcnQpOwogCQlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTKSB7CkBAIC0yNDMsNyArMjMzLDcgQEAKIAlpZiAoaSA9PSBtYXBfc2l6ZSAvIGRlc2Nfc2l6ZSkKIAkJc3RhdHVzID0gRUZJX05PVF9GT1VORDsKIAotCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIG1hcCk7CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtYXApOwogZmFpbDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjU3LDcgKzI0Nyw3IEBACiAJCXJldHVybjsKIAogCW5yX3BhZ2VzID0gcm91bmRfdXAoc2l6ZSwgRUZJX1BBR0VfU0laRSkgLyBFRklfUEFHRV9TSVpFOwotCWVmaV9jYWxsX3BoeXMyKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3BhZ2VzLCBhZGRyLCBucl9wYWdlcyk7CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wYWdlcywgYWRkciwgbnJfcGFnZXMpOwogfQogCiAKQEAgLTI3Niw5ICsyNjYsNyBAQAogewogCXN0cnVjdCBmaWxlX2luZm8gKmZpbGVzOwogCXVuc2lnbmVkIGxvbmcgZmlsZV9hZGRyOwotCWVmaV9ndWlkX3QgZnNfcHJvdG8gPSBFRklfRklMRV9TWVNURU1fR1VJRDsKIAl1NjQgZmlsZV9zaXplX3RvdGFsOwotCWVmaV9maWxlX2lvX2ludGVyZmFjZV90ICppbzsKIAllZmlfZmlsZV9oYW5kbGVfdCAqZmg7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAlpbnQgbnJfZmlsZXM7CkBAIC0zMTksMTAgKzMwNyw4IEBACiAJaWYgKCFucl9maWxlcykKIAkJcmV0dXJuIEVGSV9TVUNDRVNTOwogCi0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJRUZJX0xPQURFUl9EQVRBLAotCQkJCW5yX2ZpbGVzICogc2l6ZW9mKCpmaWxlcyksCi0JCQkJKHZvaWQgKiopJmZpbGVzKTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShhbGxvY2F0ZV9wb29sLCBFRklfTE9BREVSX0RBVEEsCisJCQkJbnJfZmlsZXMgKiBzaXplb2YoKmZpbGVzKSwgKHZvaWQgKiopJmZpbGVzKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CiAJCWVmaV9wcmludGsoc3lzX3RhYmxlX2FyZywgIkZhaWxlZCB0byBhbGxvYyBtZW0gZm9yIGZpbGUgaGFuZGxlIGxpc3RcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC0zMzEsMTMgKzMxNyw4IEBACiAJc3RyID0gY21kX2xpbmU7CiAJZm9yIChpID0gMDsgaSA8IG5yX2ZpbGVzOyBpKyspIHsKIAkJc3RydWN0IGZpbGVfaW5mbyAqZmlsZTsKLQkJZWZpX2ZpbGVfaGFuZGxlX3QgKmg7Ci0JCWVmaV9maWxlX2luZm9fdCAqaW5mbzsKIAkJZWZpX2NoYXIxNl90IGZpbGVuYW1lXzE2WzI1Nl07Ci0JCXVuc2lnbmVkIGxvbmcgaW5mb19zejsKLQkJZWZpX2d1aWRfdCBpbmZvX2d1aWQgPSBFRklfRklMRV9JTkZPX0lEOwogCQllZmlfY2hhcjE2X3QgKnA7Ci0JCXU2NCBmaWxlX3N6OwogCiAJCXN0ciA9IHN0cnN0cihzdHIsIG9wdGlvbl9zdHJpbmcpOwogCQlpZiAoIXN0cikKQEAgLTM2OCw3MSArMzQ5LDE4IEBACiAKIAkJLyogT25seSBvcGVuIHRoZSB2b2x1bWUgb25jZS4gKi8KIAkJaWYgKCFpKSB7Ci0JCQllZmlfYm9vdF9zZXJ2aWNlc190ICpib290dGltZTsKLQotCQkJYm9vdHRpbWUgPSBzeXNfdGFibGVfYXJnLT5ib290dGltZTsKLQotCQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoYm9vdHRpbWUtPmhhbmRsZV9wcm90b2NvbCwKLQkJCQkJaW1hZ2UtPmRldmljZV9oYW5kbGUsICZmc19wcm90bywKLQkJCQkJCSh2b2lkICoqKSZpbyk7Ci0JCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCQkJZWZpX3ByaW50ayhzeXNfdGFibGVfYXJnLCAiRmFpbGVkIHRvIGhhbmRsZSBmc19wcm90b1xuIik7CisJCQlzdGF0dXMgPSBlZmlfb3Blbl92b2x1bWUoc3lzX3RhYmxlX2FyZywgaW1hZ2UsCisJCQkJCQkgKHZvaWQgKiopJmZoKTsKKwkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCQkJZ290byBmcmVlX2ZpbGVzOwotCQkJfQotCi0JCQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMihpby0+b3Blbl92b2x1bWUsIGlvLCAmZmgpOwotCQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewotCQkJCWVmaV9wcmludGsoc3lzX3RhYmxlX2FyZywgIkZhaWxlZCB0byBvcGVuIHZvbHVtZVxuIik7Ci0JCQkJZ290byBmcmVlX2ZpbGVzOwotCQkJfQogCQl9CiAKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czUoZmgtPm9wZW4sIGZoLCAmaCwgZmlsZW5hbWVfMTYsCi0JCQkJCUVGSV9GSUxFX01PREVfUkVBRCwgKHU2NCkwKTsKLQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewotCQkJZWZpX3ByaW50ayhzeXNfdGFibGVfYXJnLCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIik7Ci0JCQllZmlfY2hhcjE2X3ByaW50ayhzeXNfdGFibGVfYXJnLCBmaWxlbmFtZV8xNik7Ci0JCQllZmlfcHJpbnRrKHN5c190YWJsZV9hcmcsICJcbiIpOworCQlzdGF0dXMgPSBlZmlfZmlsZV9zaXplKHN5c190YWJsZV9hcmcsIGZoLCBmaWxlbmFtZV8xNiwKKwkJCQkgICAgICAgKHZvaWQgKiopJmZpbGUtPmhhbmRsZSwgJmZpbGUtPnNpemUpOworCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQkJZ290byBjbG9zZV9oYW5kbGVzOwotCQl9CiAKLQkJZmlsZS0+aGFuZGxlID0gaDsKLQotCQlpbmZvX3N6ID0gMDsKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czQoaC0+Z2V0X2luZm8sIGgsICZpbmZvX2d1aWQsCi0JCQkJCSZpbmZvX3N6LCBOVUxMKTsKLQkJaWYgKHN0YXR1cyAhPSBFRklfQlVGRkVSX1RPT19TTUFMTCkgewotCQkJZWZpX3ByaW50ayhzeXNfdGFibGVfYXJnLCAiRmFpbGVkIHRvIGdldCBmaWxlIGluZm8gc2l6ZVxuIik7Ci0JCQlnb3RvIGNsb3NlX2hhbmRsZXM7Ci0JCX0KLQotZ3JvdzoKLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czMoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmFsbG9jYXRlX3Bvb2wsCi0JCQkJCUVGSV9MT0FERVJfREFUQSwgaW5mb19zeiwKLQkJCQkJKHZvaWQgKiopJmluZm8pOwotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCQllZmlfcHJpbnRrKHN5c190YWJsZV9hcmcsICJGYWlsZWQgdG8gYWxsb2MgbWVtIGZvciBmaWxlIGluZm9cbiIpOwotCQkJZ290byBjbG9zZV9oYW5kbGVzOwotCQl9Ci0KLQkJc3RhdHVzID0gZWZpX2NhbGxfcGh5czQoaC0+Z2V0X2luZm8sIGgsICZpbmZvX2d1aWQsCi0JCQkJCSZpbmZvX3N6LCBpbmZvKTsKLQkJaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkgewotCQkJZWZpX2NhbGxfcGh5czEoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmZyZWVfcG9vbCwKLQkJCQkgICAgICAgaW5mbyk7Ci0JCQlnb3RvIGdyb3c7Ci0JCX0KLQotCQlmaWxlX3N6ID0gaW5mby0+ZmlsZV9zaXplOwotCQllZmlfY2FsbF9waHlzMShzeXNfdGFibGVfYXJnLT5ib290dGltZS0+ZnJlZV9wb29sLCBpbmZvKTsKLQotCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCQllZmlfcHJpbnRrKHN5c190YWJsZV9hcmcsICJGYWlsZWQgdG8gZ2V0IGZpbGUgaW5mb1xuIik7Ci0JCQlnb3RvIGNsb3NlX2hhbmRsZXM7Ci0JCX0KLQotCQlmaWxlLT5zaXplID0gZmlsZV9zejsKLQkJZmlsZV9zaXplX3RvdGFsICs9IGZpbGVfc3o7CisJCWZpbGVfc2l6ZV90b3RhbCArPSBmaWxlLT5zaXplOwogCX0KIAogCWlmIChmaWxlX3NpemVfdG90YWwpIHsKQEAgLTQ2OCwxMCArMzk2LDEwIEBACiAJCQkJCWNodW5rc2l6ZSA9IEVGSV9SRUFEX0NIVU5LX1NJWkU7CiAJCQkJZWxzZQogCQkJCQljaHVua3NpemUgPSBzaXplOwotCQkJCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMzKGZoLT5yZWFkLAotCQkJCQkJCWZpbGVzW2pdLmhhbmRsZSwKLQkJCQkJCQkmY2h1bmtzaXplLAotCQkJCQkJCSh2b2lkICopYWRkcik7CisKKwkJCQlzdGF0dXMgPSBlZmlfZmlsZV9yZWFkKGZoLCBmaWxlc1tqXS5oYW5kbGUsCisJCQkJCQkgICAgICAgJmNodW5rc2l6ZSwKKwkJCQkJCSAgICAgICAodm9pZCAqKWFkZHIpOwogCQkJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKIAkJCQkJZWZpX3ByaW50ayhzeXNfdGFibGVfYXJnLCAiRmFpbGVkIHRvIHJlYWQgZmlsZVxuIik7CiAJCQkJCWdvdG8gZnJlZV9maWxlX3RvdGFsOwpAQCAtNDgwLDEyICs0MDgsMTIgQEAKIAkJCQlzaXplIC09IGNodW5rc2l6ZTsKIAkJCX0KIAotCQkJZWZpX2NhbGxfcGh5czEoZmgtPmNsb3NlLCBmaWxlc1tqXS5oYW5kbGUpOworCQkJZWZpX2ZpbGVfY2xvc2UoZmgsIGZpbGVzW2pdLmhhbmRsZSk7CiAJCX0KIAogCX0KIAotCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIGZpbGVzKTsKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIGZpbGVzKTsKIAogCSpsb2FkX2FkZHIgPSBmaWxlX2FkZHI7CiAJKmxvYWRfc2l6ZSA9IGZpbGVfc2l6ZV90b3RhbDsKQEAgLTQ5Nyw5ICs0MjUsOSBAQAogCiBjbG9zZV9oYW5kbGVzOgogCWZvciAoayA9IGo7IGsgPCBpOyBrKyspCi0JCWVmaV9jYWxsX3BoeXMxKGZoLT5jbG9zZSwgZmlsZXNba10uaGFuZGxlKTsKKwkJZWZpX2ZpbGVfY2xvc2UoZmgsIGZpbGVzW2tdLmhhbmRsZSk7CiBmcmVlX2ZpbGVzOgotCWVmaV9jYWxsX3BoeXMxKHN5c190YWJsZV9hcmctPmJvb3R0aW1lLT5mcmVlX3Bvb2wsIGZpbGVzKTsKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIGZpbGVzKTsKIGZhaWw6CiAJKmxvYWRfYWRkciA9IDA7CiAJKmxvYWRfc2l6ZSA9IDA7CkBAIC01NDUsNyArNDczLDcgQEAKIAkgKiBhcyBwb3NzaWJsZSB3aGlsZSByZXNwZWN0aW5nIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuCiAJICovCiAJbnJfcGFnZXMgPSByb3VuZF91cChhbGxvY19zaXplLCBFRklfUEFHRV9TSVpFKSAvIEVGSV9QQUdFX1NJWkU7Ci0Jc3RhdHVzID0gZWZpX2NhbGxfcGh5czQoc3lzX3RhYmxlX2FyZy0+Ym9vdHRpbWUtPmFsbG9jYXRlX3BhZ2VzLAorCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3BhZ2VzLAogCQkJCUVGSV9BTExPQ0FURV9BRERSRVNTLCBFRklfTE9BREVSX0RBVEEsCiAJCQkJbnJfcGFnZXMsICZlZmlfYWRkcik7CiAJbmV3X2FkZHIgPSBlZmlfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMKaW5kZXggNDc1M2JhYy4uYWYyMGYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCXtTQUxfU1lTVEVNX1RBQkxFX0dVSUQsICJTQUxzeXN0YWIiLCAmZWZpLnNhbF9zeXN0YWJ9LAogCXtTTUJJT1NfVEFCTEVfR1VJRCwgIlNNQklPUyIsICZlZmkuc21iaW9zfSwKIAl7VUdBX0lPX1BST1RPQ09MX0dVSUQsICJVR0EiLCAmZWZpLnVnYX0sCi0Je05VTExfR1VJRCwgTlVMTCwgMH0sCisJe05VTExfR1VJRCwgTlVMTCwgTlVMTH0sCiB9OwogCiBzdGF0aWMgX19pbml0IGludCBtYXRjaF9jb25maWdfdGFibGUoZWZpX2d1aWRfdCAqZ3VpZCwKQEAgLTMxMyw1ICszMTMsOCBAQAogCX0KIAlwcl9jb250KCJcbiIpOwogCWVhcmx5X2lvdW5tYXAoY29uZmlnX3RhYmxlcywgZWZpLnN5c3RhYi0+bnJfdGFibGVzICogc3opOworCisJc2V0X2JpdChFRklfQ09ORklHX1RBQkxFUywgJmVmaS5mbGFncyk7CisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaXZhcnMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaXZhcnMuYwppbmRleCAzZGMyNDgyLi41MGVhNDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZml2YXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpdmFycy5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAltZW1jcHkoJmVudHJ5LT52YXIsIG5ld192YXIsIGNvdW50KTsKIAogCWVyciA9IGVmaXZhcl9lbnRyeV9zZXQoZW50cnksIG5ld192YXItPkF0dHJpYnV0ZXMsCi0JCQkgICAgICAgbmV3X3Zhci0+RGF0YVNpemUsIG5ld192YXItPkRhdGEsIGZhbHNlKTsKKwkJCSAgICAgICBuZXdfdmFyLT5EYXRhU2l6ZSwgbmV3X3Zhci0+RGF0YSwgTlVMTCk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZml2YXJzOiBzZXRfdmFyaWFibGUoKSBmYWlsZWQ6IHN0YXR1cz0lZFxuIiwgZXJyKTsKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKaW5kZXggZTVhNjdiMi4uZjFhYjA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwpAQCAtODkyLDEzICs4OTIsNiBAQAogCQlnb3RvIG91dF9yZW1vdmVfc3lzZnNfZmlsZXM7CiAJfQogCi0JcmV0ID0gZWZpdmFyc19zeXNmc19pbml0KCk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9JTkZPICJnc21pOiBGYWlsZWQgdG8gY3JlYXRlIGVmaXZhcnMgZmlsZXNcbiIpOwotCQllZml2YXJzX3VucmVnaXN0ZXIoJmVmaXZhcnMpOwotCQlnb3RvIG91dF9yZW1vdmVfc3lzZnNfZmlsZXM7Ci0JfQotCiAJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZnc21pX3JlYm9vdF9ub3RpZmllcik7CiAJcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZnc21pX2RpZV9ub3RpZmllcik7CiAJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvbWVtY29uc29sZS5jIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvbWVtY29uc29sZS5jCmluZGV4IDJhOTBiYTYuLjJmNTY5YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL21lbWNvbnNvbGUuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9tZW1jb25zb2xlLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vYmlvc19lYmRhLmg+CiAKICNkZWZpbmUgQklPU19NRU1DT05TT0xFX1YxX01BR0lDCTB4REVBREJBQkUKQEAgLTQxLDE1ICs0MiwyNSBAQAogCX07CiB9IF9fcGFja2VkOwogCi1zdGF0aWMgY2hhciAqbWVtY29uc29sZV9iYXNlYWRkcjsKK3N0YXRpYyB1MzIgbWVtY29uc29sZV9iYXNlYWRkcjsKIHN0YXRpYyBzaXplX3QgbWVtY29uc29sZV9sZW5ndGg7CiAKIHN0YXRpYyBzc2l6ZV90IG1lbWNvbnNvbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYnAsCiAJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsCiAJCQkgICAgICAgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQogewotCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmcG9zLCBtZW1jb25zb2xlX2Jhc2VhZGRyLAotCQkJCSAgICAgICBtZW1jb25zb2xlX2xlbmd0aCk7CisJY2hhciAqbWVtY29uc29sZTsKKwlzc2l6ZV90IHJldDsKKworCW1lbWNvbnNvbGUgPSBpb3JlbWFwX2NhY2hlKG1lbWNvbnNvbGVfYmFzZWFkZHIsIG1lbWNvbnNvbGVfbGVuZ3RoKTsKKwlpZiAoIW1lbWNvbnNvbGUpIHsKKwkJcHJfZXJyKCJtZW1jb25zb2xlOiBpb3JlbWFwX2NhY2hlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXQgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmcG9zLCBtZW1jb25zb2xlLAorCQkJCSAgICAgIG1lbWNvbnNvbGVfbGVuZ3RoKTsKKwlpb3VubWFwKG1lbWNvbnNvbGUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBtZW1jb25zb2xlX2Jpbl9hdHRyID0gewpAQCAtNTgsNDMgKzY5LDQyIEBACiB9OwogCiAKLXN0YXRpYyB2b2lkIGZvdW5kX3YxX2hlYWRlcihzdHJ1Y3QgYmlvc21lbWNvbl9lYmRhICpoZHIpCitzdGF0aWMgdm9pZCBfX2luaXQgZm91bmRfdjFfaGVhZGVyKHN0cnVjdCBiaW9zbWVtY29uX2ViZGEgKmhkcikKIHsKLQlwcmludGsoS0VSTl9JTkZPICJCSU9TIGNvbnNvbGUgdjEgRUJEQSBzdHJ1Y3R1cmUgZm91bmQgYXQgJXBcbiIsIGhkcik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBjb25zb2xlIGJ1ZmZlciBhdCAweCUuOHgsICIKKwlwcl9pbmZvKCJCSU9TIGNvbnNvbGUgdjEgRUJEQSBzdHJ1Y3R1cmUgZm91bmQgYXQgJXBcbiIsIGhkcik7CisJcHJfaW5mbygiQklPUyBjb25zb2xlIGJ1ZmZlciBhdCAweCUuOHgsICIKIAkgICAgICAgInN0YXJ0ID0gJWQsIGVuZCA9ICVkLCBudW0gPSAlZFxuIiwKIAkgICAgICAgaGRyLT52MS5idWZmZXJfYWRkciwgaGRyLT52MS5zdGFydCwKIAkgICAgICAgaGRyLT52MS5lbmQsIGhkci0+djEubnVtX2NoYXJzKTsKIAogCW1lbWNvbnNvbGVfbGVuZ3RoID0gaGRyLT52MS5udW1fY2hhcnM7Ci0JbWVtY29uc29sZV9iYXNlYWRkciA9IHBoeXNfdG9fdmlydChoZHItPnYxLmJ1ZmZlcl9hZGRyKTsKKwltZW1jb25zb2xlX2Jhc2VhZGRyID0gaGRyLT52MS5idWZmZXJfYWRkcjsKIH0KIAotc3RhdGljIHZvaWQgZm91bmRfdjJfaGVhZGVyKHN0cnVjdCBiaW9zbWVtY29uX2ViZGEgKmhkcikKK3N0YXRpYyB2b2lkIF9faW5pdCBmb3VuZF92Ml9oZWFkZXIoc3RydWN0IGJpb3NtZW1jb25fZWJkYSAqaGRyKQogewotCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSB2MiBFQkRBIHN0cnVjdHVyZSBmb3VuZCBhdCAlcFxuIiwgaGRyKTsKLQlwcmludGsoS0VSTl9JTkZPICJCSU9TIGNvbnNvbGUgYnVmZmVyIGF0IDB4JS44eCwgIgorCXByX2luZm8oIkJJT1MgY29uc29sZSB2MiBFQkRBIHN0cnVjdHVyZSBmb3VuZCBhdCAlcFxuIiwgaGRyKTsKKwlwcl9pbmZvKCJCSU9TIGNvbnNvbGUgYnVmZmVyIGF0IDB4JS44eCwgIgogCSAgICAgICAic3RhcnQgPSAlZCwgZW5kID0gJWQsIG51bV9ieXRlcyA9ICVkXG4iLAogCSAgICAgICBoZHItPnYyLmJ1ZmZlcl9hZGRyLCBoZHItPnYyLnN0YXJ0LAogCSAgICAgICBoZHItPnYyLmVuZCwgaGRyLT52Mi5udW1fYnl0ZXMpOwogCiAJbWVtY29uc29sZV9sZW5ndGggPSBoZHItPnYyLmVuZCAtIGhkci0+djIuc3RhcnQ7Ci0JbWVtY29uc29sZV9iYXNlYWRkciA9IHBoeXNfdG9fdmlydChoZHItPnYyLmJ1ZmZlcl9hZGRyCi0JCQkJCSAgICsgaGRyLT52Mi5zdGFydCk7CisJbWVtY29uc29sZV9iYXNlYWRkciA9IGhkci0+djIuYnVmZmVyX2FkZHIgKyBoZHItPnYyLnN0YXJ0OwogfQogCiAvKgogICogU2VhcmNoIHRocm91Z2ggdGhlIEVCREEgZm9yIHRoZSBCSU9TIE1lbW9yeSBDb25zb2xlLCBhbmQKICAqIHNldCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0byBwb2ludCB0byBpdC4gIFJldHVybiB0cnVlIGlmIGZvdW5kLgogICovCi1zdGF0aWMgYm9vbCBmb3VuZF9tZW1jb25zb2xlKHZvaWQpCitzdGF0aWMgYm9vbCBfX2luaXQgZm91bmRfbWVtY29uc29sZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBhZGRyZXNzOwogCXNpemVfdCBsZW5ndGgsIGN1cjsKIAogCWFkZHJlc3MgPSBnZXRfYmlvc19lYmRhKCk7CiAJaWYgKCFhZGRyZXNzKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkJJT1MgRUJEQSBub24tZXhpc3RlbnQuXG4iKTsKKwkJcHJfaW5mbygiQklPUyBFQkRBIG5vbi1leGlzdGVudC5cbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xMjIsNyArMTMyLDcgQEAKIAkJfQogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIkJJT1MgY29uc29sZSBFQkRBIHN0cnVjdHVyZSBub3QgZm91bmQhXG4iKTsKKwlwcl9pbmZvKCJCSU9TIGNvbnNvbGUgRUJEQSBzdHJ1Y3R1cmUgbm90IGZvdW5kIVxuIik7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xMzksOCArMTQ5LDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgbWVtY29uc29sZV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKLQogCWlmICghZG1pX2NoZWNrX3N5c3RlbShtZW1jb25zb2xlX2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xNDgsMTAgKzE1Niw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJbWVtY29uc29sZV9iaW5fYXR0ci5zaXplID0gbWVtY29uc29sZV9sZW5ndGg7Ci0KLQlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoZmlybXdhcmVfa29iaiwgJm1lbWNvbnNvbGVfYmluX2F0dHIpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGZpcm13YXJlX2tvYmosICZtZW1jb25zb2xlX2Jpbl9hdHRyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG1lbWNvbnNvbGVfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mbWMvZm1jLWNvcmUuYyBiL2RyaXZlcnMvZm1jL2ZtYy1jb3JlLmMKaW5kZXggMjRkNTI0OS4uMzUzZmM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9mbWMvZm1jLWNvcmUuYworKysgYi9kcml2ZXJzL2ZtYy9mbWMtY29yZS5jCkBAIC05OSwxMCArOTksMjMgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGZtY193cml0ZV9lZXByb20oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGZtY19kZXZpY2UgKmZtYzsKKworCWRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlmbWMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZm1jX2RldmljZSwgZGV2KTsKKwlyZXR1cm4gZm1jLT5vcC0+d3JpdGVfZWUoZm1jLCBvZmYsIGJ1ZiwgY291bnQpOworfQorCiBzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZm1jX2VlcHJvbV9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJlZXByb20iLCAubW9kZSA9IFNfSVJVR08sIH0sCisJLmF0dHIgPSB7IC5uYW1lID0gImVlcHJvbSIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsIH0sCiAJLnNpemUgPSA4MTkyLCAvKiBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQgKi8KIAkucmVhZCA9IGZtY19yZWFkX2VlcHJvbSwKKwkud3JpdGUgPSBmbWNfd3JpdGVfZWVwcm9tLAogfTsKIAogLyoKQEAgLTE1NCw3ICsxNjcsNyBAQAogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChmbWMtPmZsYWdzID09IEZNQ19ERVZJQ0VfTk9fTUVaWkFOSU5FKSB7CisJCWlmIChmbWMtPmZsYWdzICYgRk1DX0RFVklDRV9OT19NRVpaQU5JTkUpIHsKIAkJCWRldl9pbmZvKGZtYy0+aHdkZXYsICJhYnNlbnQgbWV6emFuaW5lIGluIHNsb3QgJWRcbiIsCiAJCQkJIGZtYy0+c2xvdF9pZCk7CiAJCQljb250aW51ZTsKQEAgLTE4OSw5ICsyMDIsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJZm1jID0gZGV2YXJyYXlbaV07CiAKLQkJaWYgKGZtYy0+ZmxhZ3MgPT0gRk1DX0RFVklDRV9OT19NRVpaQU5JTkUpCi0JCQljb250aW51ZTsgLyogZGV2X2luZm8gYWxyZWFkeSBkb25lIGFib3ZlICovCi0KIAkJZm1jLT5ucl9zbG90cyA9IG47IC8qIGVhY2ggc2xvdCBtdXN0IGtub3cgaG93IG1hbnkgYXJlIHRoZXJlICovCiAJCWZtYy0+ZGV2YXJyYXkgPSBkZXZhcnJheTsKIApAQCAtMjYzLDggKzI3Myw2IEBACiAJa2ZyZWUoZGV2c1swXS0+ZGV2YXJyYXkpOwogCiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpZiAoZGV2c1tpXS0+ZmxhZ3MgPT0gRk1DX0RFVklDRV9OT19NRVpaQU5JTkUpCi0JCQljb250aW51ZTsKIAkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXZzW2ldLT5kZXYua29iaiwgJmZtY19lZXByb21fYXR0cik7CiAJCWRldmljZV9kZWwoJmRldnNbaV0tPmRldik7CiAJCWZtY19mcmVlX2lkX2luZm8oZGV2c1tpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZtYy9mbWMtc2RiLmMgYi9kcml2ZXJzL2ZtYy9mbWMtc2RiLmMKaW5kZXggNzlhZGMzOS4uNDYwM2ZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9mbWMvZm1jLXNkYi5jCisrKyBiL2RyaXZlcnMvZm1jL2ZtYy1zZGIuYwpAQCAtMTUwLDIzICsxNTAsMzYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZm1jX3JlcHJvZ3JhbSk7CiAKK3N0YXRpYyBjaGFyICpfX3N0cmlwX3RyYWlsaW5nX3NwYWNlKGNoYXIgKmJ1ZiwgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCWludCBpID0gbGVuIC0gMTsKKworCW1lbWNweShidWYsIHN0ciwgbGVuKTsKKwl3aGlsZShpID49IDAgJiYgYnVmW2ldID09ICcgJykKKwkJYnVmW2ktLV0gPSAnXDAnOworCXJldHVybiBidWY7Cit9CisKKyNkZWZpbmUgX19zZGJfc3RyaW5nKGJ1ZiwgZmllbGQpICh7CQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YoYnVmKSA8IHNpemVvZihmaWVsZCkpOwlcCisJX19zdHJpcF90cmFpbGluZ19zcGFjZShidWYsICh2b2lkICopKGZpZWxkKSwgc2l6ZW9mKGZpZWxkKSk7CVwKKwkJfSkKKwogc3RhdGljIHZvaWQgX19mbWNfc2hvd19zZGJfdHJlZShjb25zdCBzdHJ1Y3QgZm1jX2RldmljZSAqZm1jLAogCQkJCWNvbnN0IHN0cnVjdCBzZGJfYXJyYXkgKmFycikKIHsKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBhcnItPmJhc2VhZGRyOwogCWludCBpLCBqLCBuID0gYXJyLT5sZW4sIGxldmVsID0gYXJyLT5sZXZlbDsKLQljb25zdCBzdHJ1Y3Qgc2RiX2FycmF5ICphcDsKKwljaGFyIGJ1Zls2NF07CiAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYmFzZTsKIAkJdW5pb24gIHNkYl9yZWNvcmQgKnI7CiAJCXN0cnVjdCBzZGJfcHJvZHVjdCAqcDsKIAkJc3RydWN0IHNkYl9jb21wb25lbnQgKmM7CiAJCXIgPSAmYXJyLT5yZWNvcmRbaV07CiAJCWMgPSAmci0+ZGV2LnNkYl9jb21wb25lbnQ7CiAJCXAgPSAmYy0+cHJvZHVjdDsKLQkJYmFzZSA9IDA7Ci0JCWZvciAoYXAgPSBhcnI7IGFwOyBhcCA9IGFwLT5wYXJlbnQpCi0JCQliYXNlICs9IGFwLT5iYXNlYWRkcjsKKwogCQlkZXZfaW5mbygmZm1jLT5kZXYsICJTREI6ICIpOwogCiAJCWZvciAoaiA9IDA7IGogPCBsZXZlbDsgaisrKQpAQCAtMTkzLDggKzIwNiw4IEBACiAJCQkgICAgICAgcC0+bmFtZSwKIAkJCSAgICAgICBfX2JlNjRfdG9fY3B1KGMtPmFkZHJfZmlyc3QpICsgYmFzZSk7CiAJCQlpZiAoSVNfRVJSKGFyci0+c3VidHJlZVtpXSkpIHsKLQkJCQlwcmludGsoS0VSTl9DT05UICIoYnJpZGdlIGVycm9yICVsaSlcbiIsCi0JCQkJICAgICAgIFBUUl9FUlIoYXJyLT5zdWJ0cmVlW2ldKSk7CisJCQkJZGV2X2luZm8oJmZtYy0+ZGV2LCAiU0RCOiAoYnJpZGdlIGVycm9yICVsaSlcbiIsCisJCQkJCSBQVFJfRVJSKGFyci0+c3VidHJlZVtpXSkpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJX19mbWNfc2hvd19zZGJfdHJlZShmbWMsIGFyci0+c3VidHJlZVtpXSk7CkBAIC0yMDMsMTAgKzIxNiwyMCBAQAogCQkJcHJpbnRrKEtFUk5fQ09OVCAiaW50ZWdyYXRpb25cbiIpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc2RiX3R5cGVfcmVwb191cmw6Ci0JCQlwcmludGsoS0VSTl9DT05UICJyZXBvLXVybFxuIik7CisJCQlwcmludGsoS0VSTl9DT05UICJTeW50aGVzaXMgcmVwb3NpdG9yeTogJXNcbiIsCisJCQkgICAgICAgX19zZGJfc3RyaW5nKGJ1Ziwgci0+cmVwb191cmwucmVwb191cmwpKTsKIAkJCWJyZWFrOwogCQljYXNlIHNkYl90eXBlX3N5bnRoZXNpczoKLQkJCXByaW50ayhLRVJOX0NPTlQgInN5bnRoZXNpcy1pbmZvXG4iKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIkJpdHN0cmVhbSAnJXMnICIsCisJCQkgICAgICAgX19zZGJfc3RyaW5nKGJ1Ziwgci0+c3ludGhlc2lzLnN5bl9uYW1lKSk7CisJCQlwcmludGsoS0VSTl9DT05UICJzeW50aGVzaXplZCAlMDh4IGJ5ICVzICIsCisJCQkgICAgICAgX19iZTMyX3RvX2NwdShyLT5zeW50aGVzaXMuZGF0ZSksCisJCQkgICAgICAgX19zZGJfc3RyaW5nKGJ1Ziwgci0+c3ludGhlc2lzLnVzZXJfbmFtZSkpOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiKCVzIHZlcnNpb24gJXgpLCAiLAorCQkJICAgICAgIF9fc2RiX3N0cmluZyhidWYsIHItPnN5bnRoZXNpcy50b29sX25hbWUpLAorCQkJICAgICAgIF9fYmUzMl90b19jcHUoci0+c3ludGhlc2lzLnRvb2xfdmVyc2lvbikpOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiY29tbWl0ICVwbVxuIiwKKwkJCSAgICAgICByLT5zeW50aGVzaXMuY29tbWl0X2lkKTsKIAkJCWJyZWFrOwogCQljYXNlIHNkYl90eXBlX2VtcHR5OgogCQkJcHJpbnRrKEtFUk5fQ09OVCAiZW1wdHlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdnI0MXh4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby12cjQxeHguYwppbmRleCA5OTAyNzMyLi42NmNiY2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby12cjQxeHguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby12cjQxeHguYwpAQCAtODEsNiArODEsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2l1X2ZsYWdzOwogCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpnaXVfYmFzZTsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHZyNDF4eF9ncGlvX2NoaXA7CiAKICNkZWZpbmUgZ2l1X3JlYWQob2Zmc2V0KQkJcmVhZHcoZ2l1X2Jhc2UgKyAob2Zmc2V0KSkKICNkZWZpbmUgZ2l1X3dyaXRlKG9mZnNldCwgdmFsdWUpCXdyaXRldygodmFsdWUpLCBnaXVfYmFzZSArIChvZmZzZXQpKQpAQCAtMTM1LDEyICsxMzYsMzEgQEAKIAlnaXVfc2V0KEdJVUlOVEVOTCwgMSA8PCBHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9naXVpbnQoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCWlmIChncGlvX2xvY2tfYXNfaXJxKCZ2cjQxeHhfZ3Bpb19jaGlwLCBkYXRhLT5od2lycSkpCisJCWRldl9lcnIodnI0MXh4X2dwaW9fY2hpcC5kZXYsCisJCQkidW5hYmxlIHRvIGxvY2sgSFcgSVJRICVsdSBmb3IgSVJRXG4iLAorCQkJZGF0YS0+aHdpcnEpOworCS8qIFNhdGlzZnkgdGhlIC5lbmFibGUgc2VtYW50aWNzIGJ5IHVubWFza2luZyB0aGUgbGluZSAqLworCXVubWFza19naXVpbnRfbG93KGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaHV0ZG93bl9naXVpbnQoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCW1hc2tfZ2l1aW50X2xvdyhkYXRhKTsKKwlncGlvX3VubG9ja19hc19pcnEoJnZyNDF4eF9ncGlvX2NoaXAsIGRhdGEtPmh3aXJxKTsKK30KKwogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBnaXVpbnRfbG93X2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJHSVVJTlRMIiwKIAkuaXJxX2Fjawk9IGFja19naXVpbnRfbG93LAogCS5pcnFfbWFzawk9IG1hc2tfZ2l1aW50X2xvdywKIAkuaXJxX21hc2tfYWNrCT0gbWFza19hY2tfZ2l1aW50X2xvdywKIAkuaXJxX3VubWFzawk9IHVubWFza19naXVpbnRfbG93LAorCS5pcnFfc3RhcnR1cAk9IHN0YXJ0dXBfZ2l1aW50LAorCS5pcnFfc2h1dGRvd24JPSBzaHV0ZG93bl9naXVpbnQsCiB9OwogCiBzdGF0aWMgdm9pZCBhY2tfZ2l1aW50X2hpZ2goc3RydWN0IGlycV9kYXRhICpkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jYWNoZS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jYWNoZS5jCmluZGV4IGJiOGY1ODAuLjUzNGNiODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2FjaGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NhY2hlLmMKQEAgLTMyLDYgKzMyLDEyIEBACiAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX1g4NikKKworLyoKKyAqIGNsZmx1c2hvcHQgaXMgYW4gdW5vcmRlcmVkIGluc3RydWN0aW9uIHdoaWNoIG5lZWRzIGZlbmNpbmcgd2l0aCBtZmVuY2Ugb3IKKyAqIHNmZW5jZSB0byBhdm9pZCBvcmRlcmluZyBpc3N1ZXMuICBGb3IgZHJtX2NsZmx1c2hfcGFnZSB0aGlzIGZlbmNpbmcgaGFwcGVucworICogaW4gdGhlIGNhbGxlci4KKyAqLwogc3RhdGljIHZvaWQKIGRybV9jbGZsdXNoX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CkBAIC00NCw3ICs1MCw3IEBACiAKIAlwYWdlX3ZpcnR1YWwgPSBrbWFwX2F0b21pYyhwYWdlKTsKIAlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFOyBpICs9IHNpemUpCi0JCWNsZmx1c2gocGFnZV92aXJ0dWFsICsgaSk7CisJCWNsZmx1c2hvcHQocGFnZV92aXJ0dWFsICsgaSk7CiAJa3VubWFwX2F0b21pYyhwYWdlX3ZpcnR1YWwpOwogfQogCkBAIC0xMzMsNyArMTM5LDcgQEAKIAkJbWIoKTsKIAkJZm9yICg7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gYm9vdF9jcHVfZGF0YS54ODZfY2xmbHVzaF9zaXplKQogCQkJY2xmbHVzaChhZGRyKTsKLQkJY2xmbHVzaChlbmQgLSAxKTsKKwkJY2xmbHVzaG9wdChlbmQgLSAxKTsKIAkJbWIoKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKaW5kZXggN2YyYWY5YS4uMzA5MDIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKQEAgLTMxOSw3ICszMTksOCBAQAogCQkJcGNpX2Rldl9wdXQocGNpX2Rldik7CiAJCX0KIAkJaWYgKCFkZXYtPmhvc2UpIHsKLQkJCXN0cnVjdCBwY2lfYnVzICpiID0gcGNpX2J1c19iKHBjaV9yb290X2J1c2VzLm5leHQpOworCQkJc3RydWN0IHBjaV9idXMgKmIgPSBsaXN0X2VudHJ5KHBjaV9yb290X2J1c2VzLm5leHQsCisJCQkJc3RydWN0IHBjaV9idXMsIG5vZGUpOwogCQkJaWYgKGIpCiAJCQkJZGV2LT5ob3NlID0gYi0+c3lzZGF0YTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKaW5kZXggNTczNmFhYS4uZjdhZjY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCkBAIC00NjgsOCArNDY4LDggQEAKIAl9IGVsc2UgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZkcml2ZXItPmxlZ2FjeV9kZXZfbGlzdCwKIAkJCQkJIGxlZ2FjeV9kZXZfbGlzdCkgewotCQkJZHJtX3B1dF9kZXYoZGV2KTsKIAkJCWxpc3RfZGVsKCZkZXYtPmxlZ2FjeV9kZXZfbGlzdCk7CisJCQlkcm1fcHV0X2RldihkZXYpOwogCQl9CiAJfQogCURSTV9JTkZPKCJNb2R1bGUgdW5sb2FkZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcmltZS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wcmltZS5jCmluZGV4IDU2ODA1YzMuLmJiNTE2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJpbWUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ByaW1lLmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCWdldF9kbWFfYnVmKGRtYV9idWYpOwogCiAJc2d0ID0gZG1hX2J1Zl9tYXBfYXR0YWNobWVudChhdHRhY2gsIERNQV9CSURJUkVDVElPTkFMKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoc2d0KSkgeworCWlmIChJU19FUlIoc2d0KSkgewogCQlyZXQgPSBQVFJfRVJSKHNndCk7CiAJCWdvdG8gZmFpbF9kZXRhY2g7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RtYWJ1Zi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RtYWJ1Zi5jCmluZGV4IDU5ODI3Y2MuLmM3ODZjZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kbWFidWYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZG1hYnVmLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCWdldF9kbWFfYnVmKGRtYV9idWYpOwogCiAJc2d0ID0gZG1hX2J1Zl9tYXBfYXR0YWNobWVudChhdHRhY2gsIERNQV9CSURJUkVDVElPTkFMKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoc2d0KSkgeworCWlmIChJU19FUlIoc2d0KSkgewogCQlyZXQgPSBQVFJfRVJSKHNndCk7CiAJCWdvdG8gZXJyX2J1Zl9kZXRhY2g7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jCmluZGV4IDIxNTEzMWEuLmMyMDRiNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmMKQEAgLTE3MiwyMCArMTcyLDI0IEBACiAKIAlyZXQgPSBleHlub3NfZHJtX3N1YmRydl9vcGVuKGRldiwgZmlsZSk7CiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyX2ZpbGVfcHJpdl9mcmVlOwogCiAJYW5vbl9maWxwID0gYW5vbl9pbm9kZV9nZXRmaWxlKCJleHlub3NfZ2VtIiwgJmV4eW5vc19kcm1fZ2VtX2ZvcHMsCiAJCQkJCU5VTEwsIDApOwogCWlmIChJU19FUlIoYW5vbl9maWxwKSkgewogCQlyZXQgPSBQVFJfRVJSKGFub25fZmlscCk7Ci0JCWdvdG8gb3V0OworCQlnb3RvIGVycl9zdWJkcnZfY2xvc2U7CiAJfQogCiAJYW5vbl9maWxwLT5mX21vZGUgPSBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEU7CiAJZmlsZV9wcml2LT5hbm9uX2ZpbHAgPSBhbm9uX2ZpbHA7CiAKIAlyZXR1cm4gcmV0Owotb3V0OgorCitlcnJfc3ViZHJ2X2Nsb3NlOgorCWV4eW5vc19kcm1fc3ViZHJ2X2Nsb3NlKGRldiwgZmlsZSk7CisKK2Vycl9maWxlX3ByaXZfZnJlZToKIAlrZnJlZShmaWxlX3ByaXYpOwogCWZpbGUtPmRyaXZlcl9wcml2ID0gTlVMTDsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9tbXUuYyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvbW11LmMKaW5kZXggNDliYWM0MS4uYzNlNjdiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9tbXUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL21tdS5jCkBAIC01MjAsNyArNTIwLDcgQEAKIAogCWRyaXZlci0+aGFzX2NsZmx1c2ggPSAwOwogCi0JaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMU0gpKSB7CisJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIKSkgewogCQl1aW50MzJfdCB0Zm1zLCBtaXNjLCBjYXAwLCBjYXA0LCBjbGZsdXNoX3NpemU7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMKaW5kZXggNDBhMmIzNi4uZDI3OGJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMKQEAgLTg0Miw3ICs4NDIsNyBAQAogCWRldl9wcml2LT5ndHQuYmFzZS5jbGVhcl9yYW5nZSgmZGV2X3ByaXYtPmd0dC5iYXNlLAogCQkJCSAgICAgICBkZXZfcHJpdi0+Z3R0LmJhc2Uuc3RhcnQgLyBQQUdFX1NJWkUsCiAJCQkJICAgICAgIGRldl9wcml2LT5ndHQuYmFzZS50b3RhbCAvIFBBR0VfU0laRSwKLQkJCQkgICAgICAgZmFsc2UpOworCQkJCSAgICAgICB0cnVlKTsKIH0KIAogdm9pZCBpOTE1X2dlbV9yZXN0b3JlX2d0dF9tYXBwaW5ncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fc3RvbGVuLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9zdG9sZW4uYwppbmRleCBkNThiNGUyLi4yOGQyNGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9zdG9sZW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9zdG9sZW4uYwpAQCAtMjE0LDYgKzIxNCwxMyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGJpb3NfcmVzZXJ2ZWQgPSAwOwogCisjaWZkZWYgQ09ORklHX0lOVEVMX0lPTU1VCisJaWYgKGludGVsX2lvbW11X2dmeF9tYXBwZWQpIHsKKwkJRFJNX0lORk8oIkRNQVIgYWN0aXZlLCBkaXNhYmxpbmcgdXNlIG9mIHN0b2xlbiBtZW1vcnlcbiIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwogCWlmIChkZXZfcHJpdi0+Z3R0LnN0b2xlbl9zaXplID09IDApCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwppbmRleCA5ZmVjNzExLi5kNTU0MTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKQEAgLTYxOCwzMyArNjE4LDI1IEBACiAKIC8qIHJhdyByZWFkcywgb25seSBmb3IgZmFzdCByZWFkcyBvZiBkaXNwbGF5IGJsb2NrLCBubyBuZWVkIGZvciBmb3JjZXdha2UgZXRjLiAqLwogI2RlZmluZSBfX3Jhd19pOTE1X3JlYWQzMihkZXZfcHJpdl9fLCByZWdfXykgcmVhZGwoKGRldl9wcml2X18pLT5yZWdzICsgKHJlZ19fKSkKLSNkZWZpbmUgX19yYXdfaTkxNV9yZWFkMTYoZGV2X3ByaXZfXywgcmVnX18pIHJlYWR3KChkZXZfcHJpdl9fKS0+cmVncyArIChyZWdfXykpCiAKIHN0YXRpYyBib29sIGlsa19waXBlX2luX3ZibGFua19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBwaXBlIHBpcGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBzdGF0dXM7CisJaW50IHJlZzsKIAotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDcpIHsKLQkJc3RhdHVzID0gcGlwZSA9PSBQSVBFX0EgPwotCQkJREVfUElQRUFfVkJMQU5LIDoKLQkJCURFX1BJUEVCX1ZCTEFOSzsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gOCkgeworCQlzdGF0dXMgPSBHRU44X1BJUEVfVkJMQU5LOworCQlyZWcgPSBHRU44X0RFX1BJUEVfSVNSKHBpcGUpOworCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNykgeworCQlzdGF0dXMgPSBERV9QSVBFX1ZCTEFOS19JVkIocGlwZSk7CisJCXJlZyA9IERFSVNSOwogCX0gZWxzZSB7Ci0JCXN3aXRjaCAocGlwZSkgewotCQlkZWZhdWx0OgotCQljYXNlIFBJUEVfQToKLQkJCXN0YXR1cyA9IERFX1BJUEVBX1ZCTEFOS19JVkI7Ci0JCQlicmVhazsKLQkJY2FzZSBQSVBFX0I6Ci0JCQlzdGF0dXMgPSBERV9QSVBFQl9WQkxBTktfSVZCOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElQRV9DOgotCQkJc3RhdHVzID0gREVfUElQRUNfVkJMQU5LX0lWQjsKLQkJCWJyZWFrOwotCQl9CisJCXN0YXR1cyA9IERFX1BJUEVfVkJMQU5LKHBpcGUpOworCQlyZWcgPSBERUlTUjsKIAl9CiAKLQlyZXR1cm4gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIERFSVNSKSAmIHN0YXR1czsKKwlyZXR1cm4gX19yYXdfaTkxNV9yZWFkMzIoZGV2X3ByaXYsIHJlZykgJiBzdGF0dXM7CiB9CiAKIHN0YXRpYyBpbnQgaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLApAQCAtNzAyLDcgKzY5NCwyOCBAQAogCQllbHNlCiAJCQlwb3NpdGlvbiA9IF9fcmF3X2k5MTVfcmVhZDMyKGRldl9wcml2LCBQSVBFRFNMKHBpcGUpKSAmIERTTF9MSU5FTUFTS19HRU4zOwogCi0JCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwkJaWYgKEhBU19EREkoZGV2KSkgeworCQkJLyoKKwkJCSAqIE9uIEhTVyBIRE1JIG91dHB1dHMgdGhlcmUgc2VlbXMgdG8gYmUgYSAyIGxpbmUKKwkJCSAqIGRpZmZlcmVuY2UsIHdoZXJlYXMgZURQIGhhcyB0aGUgbm9ybWFsIDEgbGluZQorCQkJICogZGlmZmVyZW5jZSB0aGF0IGVhcmxpZXIgcGxhdGZvcm1zIGhhdmUuIEV4dGVybmFsCisJCQkgKiBEUCBpcyB1bmtub3duLiBGb3Igbm93IGp1c3QgY2hlY2sgZm9yIHRoZSAyIGxpbmUKKwkJCSAqIGRpZmZlcmVuY2UgY2FzZSBvbiBhbGwgb3V0cHV0IHR5cGVzIG9uIEhTVysuCisJCQkgKgorCQkJICogVGhpcyBtaWdodCBtaXNpbnRlcnByZXQgdGhlIHNjYW5saW5lIGNvdW50ZXIgYmVpbmcKKwkJCSAqIG9uZSBsaW5lIHRvbyBmYXIgYWxvbmcgb24gZURQLCBidXQgdGhhdCdzIGxlc3MKKwkJCSAqIGRhbmdlcm91cyB0aGFuIHRoZSBhbHRlcm5hdGl2ZSBzaW5jZSB0aGF0IHdvdWxkIGxlYWQKKwkJCSAqIHRoZSB2YmxhbmsgdGltZXN0YW1wIGNvZGUgYXN0cmF5IHdoZW4gaXQgc2VlcyBhCisJCQkgKiBzY2FubGluZSBjb3VudCBiZWZvcmUgdmJsYW5rX3N0YXJ0IGR1cmluZyBhIHZibGFuaworCQkJICogaW50ZXJydXB0LgorCQkJICovCisJCQlpbl92YmwgPSBpbGtfcGlwZV9pbl92YmxhbmtfbG9ja2VkKGRldiwgcGlwZSk7CisJCQlpZiAoKGluX3ZibCAmJiAocG9zaXRpb24gPT0gdmJsX3N0YXJ0IC0gMiB8fAorCQkJCQlwb3NpdGlvbiA9PSB2Ymxfc3RhcnQgLSAxKSkgfHwKKwkJCSAgICAoIWluX3ZibCAmJiAocG9zaXRpb24gPT0gdmJsX2VuZCAtIDIgfHwKKwkJCQkJIHBvc2l0aW9uID09IHZibF9lbmQgLSAxKSkpCisJCQkJcG9zaXRpb24gPSAocG9zaXRpb24gKyAyKSAlIHZ0b3RhbDsKKwkJfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpIHsKIAkJCS8qCiAJCQkgKiBUaGUgc2NhbmxpbmUgY291bnRlciBpbmNyZW1lbnRzIGF0IHRoZSBsZWFkaW5nIGVkZ2UKIAkJCSAqIG9mIGhzeW5jLCBpZS4gaXQgY29tcGxldGVseSBtaXNzZXMgdGhlIGFjdGl2ZSBwb3J0aW9uCkBAIC0yNzY5LDEwICsyNzgyLDkgQEAKIAkJcmV0dXJuOwogCiAJaWYgKEhBU19QQ0hfSUJYKGRldikpIHsKLQkJbWFzayA9IFNERV9HTUJVUyB8IFNERV9BVVhfTUFTSyB8IFNERV9UUkFOU0JfRklGT19VTkRFUiB8Ci0JCSAgICAgICBTREVfVFJBTlNBX0ZJRk9fVU5ERVIgfCBTREVfUE9JU09OOworCQltYXNrID0gU0RFX0dNQlVTIHwgU0RFX0FVWF9NQVNLIHwgU0RFX1BPSVNPTjsKIAl9IGVsc2UgewotCQltYXNrID0gU0RFX0dNQlVTX0NQVCB8IFNERV9BVVhfTUFTS19DUFQgfCBTREVfRVJST1JfQ1BUOworCQltYXNrID0gU0RFX0dNQlVTX0NQVCB8IFNERV9BVVhfTUFTS19DUFQ7CiAKIAkJSTkxNV9XUklURShTRVJSX0lOVCwgSTkxNV9SRUFEKFNFUlJfSU5UKSk7CiAJfQpAQCAtMjgzMiwyMCArMjg0NCwxOSBAQAogCQlkaXNwbGF5X21hc2sgPSAoREVfTUFTVEVSX0lSUV9DT05UUk9MIHwgREVfR1NFX0lWQiB8CiAJCQkJREVfUENIX0VWRU5UX0lWQiB8IERFX1BMQU5FQ19GTElQX0RPTkVfSVZCIHwKIAkJCQlERV9QTEFORUJfRkxJUF9ET05FX0lWQiB8Ci0JCQkJREVfUExBTkVBX0ZMSVBfRE9ORV9JVkIgfCBERV9BVVhfQ0hBTk5FTF9BX0lWQiB8Ci0JCQkJREVfRVJSX0lOVF9JVkIpOworCQkJCURFX1BMQU5FQV9GTElQX0RPTkVfSVZCIHwgREVfQVVYX0NIQU5ORUxfQV9JVkIpOwogCQlleHRyYV9tYXNrID0gKERFX1BJUEVDX1ZCTEFOS19JVkIgfCBERV9QSVBFQl9WQkxBTktfSVZCIHwKLQkJCSAgICAgIERFX1BJUEVBX1ZCTEFOS19JVkIpOworCQkJICAgICAgREVfUElQRUFfVkJMQU5LX0lWQiB8IERFX0VSUl9JTlRfSVZCKTsKIAogCQlJOTE1X1dSSVRFKEdFTjdfRVJSX0lOVCwgSTkxNV9SRUFEKEdFTjdfRVJSX0lOVCkpOwogCX0gZWxzZSB7CiAJCWRpc3BsYXlfbWFzayA9IChERV9NQVNURVJfSVJRX0NPTlRST0wgfCBERV9HU0UgfCBERV9QQ0hfRVZFTlQgfAogCQkJCURFX1BMQU5FQV9GTElQX0RPTkUgfCBERV9QTEFORUJfRkxJUF9ET05FIHwKIAkJCQlERV9BVVhfQ0hBTk5FTF9BIHwKLQkJCQlERV9QSVBFQl9GSUZPX1VOREVSUlVOIHwgREVfUElQRUFfRklGT19VTkRFUlJVTiB8CiAJCQkJREVfUElQRUJfQ1JDX0RPTkUgfCBERV9QSVBFQV9DUkNfRE9ORSB8CiAJCQkJREVfUE9JU09OKTsKLQkJZXh0cmFfbWFzayA9IERFX1BJUEVBX1ZCTEFOSyB8IERFX1BJUEVCX1ZCTEFOSyB8IERFX1BDVV9FVkVOVDsKKwkJZXh0cmFfbWFzayA9IERFX1BJUEVBX1ZCTEFOSyB8IERFX1BJUEVCX1ZCTEFOSyB8IERFX1BDVV9FVkVOVCB8CisJCQkJREVfUElQRUJfRklGT19VTkRFUlJVTiB8IERFX1BJUEVBX0ZJRk9fVU5ERVJSVU47CiAJfQogCiAJZGV2X3ByaXYtPmlycV9tYXNrID0gfmRpc3BsYXlfbWFzazsKQEAgLTI5NjEsOSArMjk3Miw5IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJdWludDMyX3QgZGVfcGlwZV9tYXNrZWQgPSBHRU44X1BJUEVfRkxJUF9ET05FIHwKIAkJR0VOOF9QSVBFX0NEQ0xLX0NSQ19ET05FIHwKLQkJR0VOOF9QSVBFX0ZJRk9fVU5ERVJSVU4gfAogCQlHRU44X0RFX1BJUEVfSVJRX0ZBVUxUX0VSUk9SUzsKLQl1aW50MzJfdCBkZV9waXBlX2VuYWJsZXMgPSBkZV9waXBlX21hc2tlZCB8IEdFTjhfUElQRV9WQkxBTks7CisJdWludDMyX3QgZGVfcGlwZV9lbmFibGVzID0gZGVfcGlwZV9tYXNrZWQgfCBHRU44X1BJUEVfVkJMQU5LIHwKKwkJR0VOOF9QSVBFX0ZJRk9fVU5ERVJSVU47CiAJaW50IHBpcGU7CiAJZGV2X3ByaXYtPmRlX2lycV9tYXNrW1BJUEVfQV0gPSB+ZGVfcGlwZV9tYXNrZWQ7CiAJZGV2X3ByaXYtPmRlX2lycV9tYXNrW1BJUEVfQl0gPSB+ZGVfcGlwZV9tYXNrZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kZGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jCmluZGV4IGUwNmI5ZTAuLjIzNGFjNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jCkBAIC0xMjQ0LDYgKzEyNDQsNyBAQAogCWlmICh0eXBlID09IElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCB8fCB0eXBlID09IElOVEVMX09VVFBVVF9FRFApIHsKIAkJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcChlbmNvZGVyKTsKIAkJaW50ZWxfZHBfc2lua19kcG1zKGludGVsX2RwLCBEUk1fTU9ERV9EUE1TX09GRik7CisJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOwogCQlpcm9ubGFrZV9lZHBfcGFuZWxfb2ZmKGludGVsX2RwKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCmluZGV4IDU3NTUyZWIuLjI2ODhmNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtMTI0OSwxNyArMTI0OSwyNCBAQAogCiAJRFJNX0RFQlVHX0tNUygiVHVybiBlRFAgcG93ZXIgb2ZmXG4iKTsKIAorCVdBUk4oIWludGVsX2RwLT53YW50X3BhbmVsX3ZkZCwgIk5lZWQgVkREIHRvIHR1cm4gb2ZmIHBhbmVsXG4iKTsKKwogCXBwID0gaXJvbmxha2VfZ2V0X3BwX2NvbnRyb2woaW50ZWxfZHApOwogCS8qIFdlIG5lZWQgdG8gc3dpdGNoIG9mZiBwYW5lbCBwb3dlciBfYW5kXyBmb3JjZSB2ZGQsIGZvciBvdGhlcndpc2Ugc29tZQogCSAqIHBhbmVscyBnZXQgdmVyeSB1bmhhcHB5IGFuZCBjZWFzZSB0byB3b3JrLiAqLwotCXBwICY9IH4oUE9XRVJfVEFSR0VUX09OIHwgUEFORUxfUE9XRVJfUkVTRVQgfCBFRFBfQkxDX0VOQUJMRSk7CisJcHAgJj0gfihQT1dFUl9UQVJHRVRfT04gfCBFRFBfRk9SQ0VfVkREIHwgUEFORUxfUE9XRVJfUkVTRVQgfCBFRFBfQkxDX0VOQUJMRSk7CiAKIAlwcF9jdHJsX3JlZyA9IF9wcF9jdHJsX3JlZyhpbnRlbF9kcCk7CiAKIAlJOTE1X1dSSVRFKHBwX2N0cmxfcmVnLCBwcCk7CiAJUE9TVElOR19SRUFEKHBwX2N0cmxfcmVnKTsKIAorCWludGVsX2RwLT53YW50X3BhbmVsX3ZkZCA9IGZhbHNlOworCiAJaXJvbmxha2Vfd2FpdF9wYW5lbF9vZmYoaW50ZWxfZHApOworCisJLyogV2UgZ290IGEgcmVmZXJlbmNlIHdoZW4gd2UgZW5hYmxlZCB0aGUgVkRELiAqLworCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIH0KIAogdm9pZCBpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCkBAIC0xNjM5LDcgKzE2NDYsNyBAQAogCQl2YWwgfD0gRURQX1BTUl9MSU5LX0RJU0FCTEU7CiAKIAlJOTE1X1dSSVRFKEVEUF9QU1JfQ1RMKGRldiksIHZhbCB8Ci0JCSAgIElTX0JST0FEV0VMTChkZXYpID8gMCA6IGxpbmtfZW50cnlfdGltZSB8CisJCSAgIChJU19CUk9BRFdFTEwoZGV2KSA/IDAgOiBsaW5rX2VudHJ5X3RpbWUpIHwKIAkJICAgbWF4X3NsZWVwX3RpbWUgPDwgRURQX1BTUl9NQVhfU0xFRVBfVElNRV9TSElGVCB8CiAJCSAgIGlkbGVfZnJhbWVzIDw8IEVEUF9QU1JfSURMRV9GUkFNRV9TSElGVCB8CiAJCSAgIEVEUF9QU1JfRU5BQkxFKTsKQEAgLTE3ODQsNiArMTc5MSw3IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhlIHBhbmVsIGlzIG9mZiBiZWZvcmUgdHJ5aW5nIHRvIGNoYW5nZSB0aGUgbW9kZS4gQnV0IGFsc28KIAkgKiBlbnN1cmUgdGhhdCB3ZSBoYXZlIHZkZCB3aGlsZSB3ZSBzd2l0Y2ggb2ZmIHRoZSBwYW5lbC4gKi8KKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKIAlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZihpbnRlbF9kcCk7CiAJaW50ZWxfZHBfc2lua19kcG1zKGludGVsX2RwLCBEUk1fTU9ERV9EUE1TX09GRik7CiAJaXJvbmxha2VfZWRwX3BhbmVsX29mZihpbnRlbF9kcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RybS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcm0uYwppbmRleCA4OWM0ODRkLi40ZWU3MDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RybS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJtLmMKQEAgLTg2NiwxMyArODY2LDE2IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW50IHJldDsKIAotCWlmIChub3V2ZWF1X3J1bnRpbWVfcG0gPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5vdXZlYXVfcnVudGltZV9wbSA9PSAwKSB7CisJCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQogCiAJLyogYXJlIHdlIG9wdGltdXMgZW5hYmxlZD8gKi8KIAlpZiAobm91dmVhdV9ydW50aW1lX3BtID09IC0xICYmICFub3V2ZWF1X2lzX29wdGltdXMoKSAmJiAhbm91dmVhdV9pc192MV9kc20oKSkgewogCQlEUk1fREVCVUdfRFJJVkVSKCJmYWlsaW5nIHRvIHBvd2VyIG9mZiAtIG5vdCBvcHRpbXVzXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJbnZfZGVidWdfbGV2ZWwoU0lMRU5UKTsKQEAgLTkyMywxMiArOTI2LDE1IEBACiAJc3RydWN0IG5vdXZlYXVfZHJtICpkcm0gPSBub3V2ZWF1X2RybShkcm1fZGV2KTsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAKLQlpZiAobm91dmVhdV9ydW50aW1lX3BtID09IDApCisJaWYgKG5vdXZlYXVfcnVudGltZV9wbSA9PSAwKSB7CisJCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CiAJCXJldHVybiAtRUJVU1k7CisJfQogCiAJLyogYXJlIHdlIG9wdGltdXMgZW5hYmxlZD8gKi8KIAlpZiAobm91dmVhdV9ydW50aW1lX3BtID09IC0xICYmICFub3V2ZWF1X2lzX29wdGltdXMoKSAmJiAhbm91dmVhdV9pc192MV9kc20oKSkgewogCQlEUk1fREVCVUdfRFJJVkVSKCJmYWlsaW5nIHRvIHBvd2VyIG9mZiAtIG5vdCBvcHRpbXVzXG4iKTsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKaW5kZXggODRhMWJiYjcuLmY2MzNjMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCkBAIC00MDMsMTEgKzQwMywxNSBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCByZXQ7CiAKLQlpZiAocmFkZW9uX3J1bnRpbWVfcG0gPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJhZGVvbl9ydW50aW1lX3BtID09IDApIHsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKLQlpZiAocmFkZW9uX3J1bnRpbWVfcG0gPT0gLTEgJiYgIXJhZGVvbl9pc19weCgpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmFkZW9uX3J1bnRpbWVfcG0gPT0gLTEgJiYgIXJhZGVvbl9pc19weCgpKSB7CisJCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQogCiAJZHJtX2Rldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9DSEFOR0lORzsKIAlkcm1fa21zX2hlbHBlcl9wb2xsX2Rpc2FibGUoZHJtX2Rldik7CkBAIC00NTYsMTIgKzQ2MCwxNSBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAotCWlmIChyYWRlb25fcnVudGltZV9wbSA9PSAwKQorCWlmIChyYWRlb25fcnVudGltZV9wbSA9PSAwKSB7CisJCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CiAJCXJldHVybiAtRUJVU1k7CisJfQogCiAJLyogYXJlIHdlIFBYIGVuYWJsZWQ/ICovCiAJaWYgKHJhZGVvbl9ydW50aW1lX3BtID09IC0xICYmICFyYWRlb25faXNfcHgoKSkgewogCQlEUk1fREVCVUdfRFJJVkVSKCJmYWlsaW5nIHRvIHBvd2VyIG9mZiAtIG5vdCBweFxuIik7CisJCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2dlbS5jCmluZGV4IDhkNjdiOTQuLjAzOTQ4MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2dlbS5jCkBAIC0xNzcsOCArMTc3LDEwIEBACiAJaWYgKG9iai0+dm1hcHBpbmcpCiAJCXVkbF9nZW1fdnVubWFwKG9iaik7CiAKLQlpZiAoZ2VtX29iai0+aW1wb3J0X2F0dGFjaCkKKwlpZiAoZ2VtX29iai0+aW1wb3J0X2F0dGFjaCkgewogCQlkcm1fcHJpbWVfZ2VtX2Rlc3Ryb3koZ2VtX29iaiwgb2JqLT5zZyk7CisJCXB1dF9kZXZpY2UoZ2VtX29iai0+ZGV2LT5kZXYpOworCX0KIAogCWlmIChvYmotPnBhZ2VzKQogCQl1ZGxfZ2VtX3B1dF9wYWdlcyhvYmopOwpAQCAtMjU2LDkgKzI1OCwxMiBAQAogCWludCByZXQ7CiAKIAkvKiBuZWVkIHRvIGF0dGFjaCAqLworCWdldF9kZXZpY2UoZGV2LT5kZXYpOwogCWF0dGFjaCA9IGRtYV9idWZfYXR0YWNoKGRtYV9idWYsIGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSKGF0dGFjaCkpCisJaWYgKElTX0VSUihhdHRhY2gpKSB7CisJCXB1dF9kZXZpY2UoZGV2LT5kZXYpOwogCQlyZXR1cm4gRVJSX0NBU1QoYXR0YWNoKTsKKwl9CiAKIAlnZXRfZG1hX2J1ZihkbWFfYnVmKTsKIApAQCAtMjgyLDYgKzI4Nyw2IEBACiBmYWlsX2RldGFjaDoKIAlkbWFfYnVmX2RldGFjaChkbWFfYnVmLCBhdHRhY2gpOwogCWRtYV9idWZfcHV0KGRtYV9idWYpOwotCisJcHV0X2RldmljZShkZXYtPmRldik7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IGNjMzJhNmYuLjI0NDhkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMjI3OCw2ICsyMjc4LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfOF84XzRfSUZfS0lUKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ZRUFMSU5LLCBVU0JfREVWSUNFX0lEX1lFQUxJTktfUDFLX1A0S19CMkspIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JJU09fS0FHQUtVLCBVU0JfREVWSUNFX0lEX1JJX0tBX1dFQk1BSUwpIH0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggMjJmMjhkNi4uODMwZGU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtOTYxLDQgKzk2MSw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUFJJTUFYX0tFWUJPQVJECTB4NGUwNQogCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9SSVNPX0tBR0FLVQkweDEyOTQJLyogUmlzbyBLYWdha3UgQ29ycC4gKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9SSV9LQV9XRUJNQUlMCTB4MTMyMAkvKiBXZWJtYWlsIE5vdGlmaWVyICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYwppbmRleCBiZWZlMGUzLi4yNDg4M2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYwpAQCAtNDMsNiArNDMsNyBAQAogI2RlZmluZSBHMjVfUkVWX01JTiAweDIyCiAjZGVmaW5lIEcyN19SRVZfTUFKIDB4MTIKICNkZWZpbmUgRzI3X1JFVl9NSU4gMHgzOAorI2RlZmluZSBHMjdfMl9SRVZfTUlOIDB4MzkKIAogI2RlZmluZSB0b19oaWRfZGV2aWNlKHBkZXYpIGNvbnRhaW5lcl9vZihwZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSwgZGV2KQogCkBAIC0xMzAsNiArMTMxLDcgQEAKIAl7REZQX1JFVl9NQUosICBERlBfUkVWX01JTiwgICZuYXRpdmVfZGZwfSwJLyogRHJpdmluZyBGb3JjZSBQcm8gKi8KIAl7RzI1X1JFVl9NQUosICBHMjVfUkVWX01JTiwgICZuYXRpdmVfZzI1fSwJLyogRzI1ICovCiAJe0cyN19SRVZfTUFKLCAgRzI3X1JFVl9NSU4sICAmbmF0aXZlX2cyN30sCS8qIEcyNyAqLworCXtHMjdfUkVWX01BSiwgIEcyN18yX1JFVl9NSU4sICAmbmF0aXZlX2cyN30sCS8qIEcyNyB2MiAqLwogfTsKIAogLyogUmVjYWxjdWxhdGVzIFggYXhpcyB2YWx1ZSBhY2NvcmRpbmdseSB0byBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYyBiL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYwppbmRleCA3ZWQ4MjgwLi45MWZhYjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jCkBAIC02MjQsNyArNjI0LDggQEAKIAogCS8qIFNldHVwIHNvdW5kIGNhcmQgKi8KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcG0tPnBrLT5oZGV2LT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sCisJCQkgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXBrX2Vycm9yKCJmYWlsZWQgdG8gY3JlYXRlIHBjLW1pZGkgc291bmQgY2FyZFxuIik7CiAJCWVyciA9IC1FTk9NRU07CkBAIC02NjAsOCArNjYxLDYgQEAKIAlzbmRfcmF3bWlkaV9zZXRfb3BzKHJ3bWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsCiAJCSZwY21pZGlfaW5fb3BzKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBtLT5way0+aGRldi0+ZGV2KTsKLQogCS8qIGNyZWF0ZSBzeXNmcyB2YXJpYWJsZXMgKi8KIAllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBtLT5way0+aGRldi0+ZGV2LAogCQkJCSBzeXNmc19kZXZpY2VfYXR0cl9jaGFubmVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCmluZGV4IDEyMzU0MDUuLjJmMTliMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwpAQCAtNDIsNiArNDIsNyBAQAogI2RlZmluZSBEVUFMU0hPQ0s0X0NPTlRST0xMRVJfQlQgIEJJVCg2KQogCiAjZGVmaW5lIFNPTllfTEVEX1NVUFBPUlQgKFNJWEFYSVNfQ09OVFJPTExFUl9VU0IgfCBCVVpaX0NPTlRST0xMRVIgfCBEVUFMU0hPQ0s0X0NPTlRST0xMRVJfVVNCKQorI2RlZmluZSBTT05ZX0ZGX1NVUFBPUlQgKFNJWEFYSVNfQ09OVFJPTExFUl9VU0IgfCBEVUFMU0hPQ0s0X0NPTlRST0xMRVJfVVNCKQogCiAjZGVmaW5lIE1BWF9MRURTIDQKIApAQCAtNDk5LDYgKzUwMCw3IEBACiAJX191OCByaWdodDsKICNlbmRpZgogCisJX191OCB3b3JrZXJfaW5pdGlhbGl6ZWQ7CiAJX191OCBsZWRfc3RhdGVbTUFYX0xFRFNdOwogCV9fdTggbGVkX2NvdW50OwogfTsKQEAgLTk5MywyMiArOTk1LDExIEBACiAJcmV0dXJuIGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGlucHV0X2RldiwgTlVMTCwgc29ueV9wbGF5X2VmZmVjdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNvbnlfZGVzdHJveV9mZihzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKLXsKLQlzdHJ1Y3Qgc29ueV9zYyAqc2MgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7Ci0KLQljYW5jZWxfd29ya19zeW5jKCZzYy0+c3RhdGVfd29ya2VyKTsKLX0KLQogI2Vsc2UKIHN0YXRpYyBpbnQgc29ueV9pbml0X2ZmKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQogewogCXJldHVybiAwOwogfQotCi1zdGF0aWMgdm9pZCBzb255X2Rlc3Ryb3lfZmYoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCi17Ci19CiAjZW5kaWYKIAogc3RhdGljIGludCBzb255X3NldF9vdXRwdXRfcmVwb3J0KHN0cnVjdCBzb255X3NjICpzYywgaW50IHJlcV9pZCwgaW50IHJlcV9zaXplKQpAQCAtMTA3Nyw2ICsxMDY4LDggQEAKIAlpZiAoc2MtPnF1aXJrcyAmIFNJWEFYSVNfQ09OVFJPTExFUl9VU0IpIHsKIAkJaGRldi0+aGlkX291dHB1dF9yYXdfcmVwb3J0ID0gc2l4YXhpc191c2Jfb3V0cHV0X3Jhd19yZXBvcnQ7CiAJCXJldCA9IHNpeGF4aXNfc2V0X29wZXJhdGlvbmFsX3VzYihoZGV2KTsKKworCQlzYy0+d29ya2VyX2luaXRpYWxpemVkID0gMTsKIAkJSU5JVF9XT1JLKCZzYy0+c3RhdGVfd29ya2VyLCBzaXhheGlzX3N0YXRlX3dvcmtlcik7CiAJfQogCWVsc2UgaWYgKHNjLT5xdWlya3MgJiBTSVhBWElTX0NPTlRST0xMRVJfQlQpCkBAIC0xMDg3LDYgKzEwODAsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyX3N0b3A7CiAKKwkJc2MtPndvcmtlcl9pbml0aWFsaXplZCA9IDE7CiAJCUlOSVRfV09SSygmc2MtPnN0YXRlX3dvcmtlciwgZHVhbHNob2NrNF9zdGF0ZV93b3JrZXIpOwogCX0gZWxzZSB7CiAJCXJldCA9IDA7CkBAIC0xMTAxLDkgKzEwOTUsMTEgQEAKIAkJCWdvdG8gZXJyX3N0b3A7CiAJfQogCi0JcmV0ID0gc29ueV9pbml0X2ZmKGhkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9zdG9wOworCWlmIChzYy0+cXVpcmtzICYgU09OWV9GRl9TVVBQT1JUKSB7CisJCXJldCA9IHNvbnlfaW5pdF9mZihoZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl9zdG9wOworCX0KIAogCXJldHVybiAwOwogZXJyX3N0b3A6CkBAIC0xMTIwLDcgKzExMTYsOCBAQAogCWlmIChzYy0+cXVpcmtzICYgU09OWV9MRURfU1VQUE9SVCkKIAkJc29ueV9sZWRzX3JlbW92ZShoZGV2KTsKIAotCXNvbnlfZGVzdHJveV9mZihoZGV2KTsKKwlpZiAoc2MtPndvcmtlcl9pbml0aWFsaXplZCkKKwkJY2FuY2VsX3dvcmtfc3luYygmc2MtPnN0YXRlX3dvcmtlcik7CiAKIAloaWRfaHdfc3RvcChoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZHJhdy5jIGIvZHJpdmVycy9oaWQvaGlkcmF3LmMKaW5kZXggY2IwMTM3Yi4uYWIyNGNlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkcmF3LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkcmF3LmMKQEAgLTMyMCwxMyArMzIwLDEzIEBACiAJCQloaWRfaHdfY2xvc2UoaGlkcmF3LT5oaWQpOwogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoaWRyYXctPndhaXQpOwogCQl9CisJCWRldmljZV9kZXN0cm95KGhpZHJhd19jbGFzcywKKwkJCSAgICAgICBNS0RFVihoaWRyYXdfbWFqb3IsIGhpZHJhdy0+bWlub3IpKTsKIAl9IGVsc2UgewogCQktLWhpZHJhdy0+b3BlbjsKIAl9CiAJaWYgKCFoaWRyYXctPm9wZW4pIHsKIAkJaWYgKCFoaWRyYXctPmV4aXN0KSB7Ci0JCQlkZXZpY2VfZGVzdHJveShoaWRyYXdfY2xhc3MsCi0JCQkJCU1LREVWKGhpZHJhd19tYWpvciwgaGlkcmF3LT5taW5vcikpOwogCQkJaGlkcmF3X3RhYmxlW2hpZHJhdy0+bWlub3JdID0gTlVMTDsKIAkJCWtmcmVlKGhpZHJhdyk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L01ha2VmaWxlIGIvZHJpdmVycy9odi9NYWtlZmlsZQppbmRleCAwYTc0YjU2Li41ZTRkZmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHYvTWFrZWZpbGUKQEAgLTUsNCArNSw0IEBACiBodl92bWJ1cy15IDo9IHZtYnVzX2Rydi5vIFwKIAkJIGh2Lm8gY29ubmVjdGlvbi5vIGNoYW5uZWwubyBcCiAJCSBjaGFubmVsX21nbXQubyByaW5nX2J1ZmZlci5vCi1odl91dGlscy15IDo9IGh2X3V0aWwubyBodl9rdnAubyBodl9zbmFwc2hvdC5vCitodl91dGlscy15IDo9IGh2X3V0aWwubyBodl9rdnAubyBodl9zbmFwc2hvdC5vIGh2X2Zjb3B5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvY2hhbm5lbC5jIGIvZHJpdmVycy9odi9jaGFubmVsLmMKaW5kZXggNjllYTM2Zi4uNjAyY2E4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9odi9jaGFubmVsLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlICJoeXBlcnZfdm1idXMuaCIKIApAQCAtNTU0LDE0ICs1NTUsMTQgQEAKICAqCiAgKiBNYWlubHkgdXNlZCBieSBIeXBlci1WIGRyaXZlcnMuCiAgKi8KLWludCB2bWJ1c19zZW5kcGFja2V0KHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLCBjb25zdCB2b2lkICpidWZmZXIsCitpbnQgdm1idXNfc2VuZHBhY2tldChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgdm9pZCAqYnVmZmVyLAogCQkJICAgdTMyIGJ1ZmZlcmxlbiwgdTY0IHJlcXVlc3RpZCwKIAkJCSAgIGVudW0gdm1idXNfcGFja2V0X3R5cGUgdHlwZSwgdTMyIGZsYWdzKQogewogCXN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yIGRlc2M7CiAJdTMyIHBhY2tldGxlbiA9IHNpemVvZihzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvcikgKyBidWZmZXJsZW47CiAJdTMyIHBhY2tldGxlbl9hbGlnbmVkID0gQUxJR04ocGFja2V0bGVuLCBzaXplb2YodTY0KSk7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IGJ1ZmZlcmxpc3RbM107CisJc3RydWN0IGt2ZWMgYnVmZmVybGlzdFszXTsKIAl1NjQgYWxpZ25lZF9kYXRhID0gMDsKIAlpbnQgcmV0OwogCWJvb2wgc2lnbmFsID0gZmFsc2U7CkBAIC01NzUsMTEgKzU3NiwxMiBAQAogCWRlc2MubGVuOCA9ICh1MTYpKHBhY2tldGxlbl9hbGlnbmVkID4+IDMpOwogCWRlc2MudHJhbnNfaWQgPSByZXF1ZXN0aWQ7CiAKLQlzZ19pbml0X3RhYmxlKGJ1ZmZlcmxpc3QsIDMpOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMF0sICZkZXNjLCBzaXplb2Yoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IpKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzFdLCBidWZmZXIsIGJ1ZmZlcmxlbik7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsyXSwgJmFsaWduZWRfZGF0YSwKLQkJICAgcGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOworCWJ1ZmZlcmxpc3RbMF0uaW92X2Jhc2UgPSAmZGVzYzsKKwlidWZmZXJsaXN0WzBdLmlvdl9sZW4gPSBzaXplb2Yoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IpOworCWJ1ZmZlcmxpc3RbMV0uaW92X2Jhc2UgPSBidWZmZXI7CisJYnVmZmVybGlzdFsxXS5pb3ZfbGVuID0gYnVmZmVybGVuOworCWJ1ZmZlcmxpc3RbMl0uaW92X2Jhc2UgPSAmYWxpZ25lZF9kYXRhOworCWJ1ZmZlcmxpc3RbMl0uaW92X2xlbiA9IChwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CiAKIAlyZXQgPSBodl9yaW5nYnVmZmVyX3dyaXRlKCZjaGFubmVsLT5vdXRib3VuZCwgYnVmZmVybGlzdCwgMywgJnNpZ25hbCk7CiAKQEAgLTYwNSw3ICs2MDcsNyBAQAogCXUzMiBkZXNjc2l6ZTsKIAl1MzIgcGFja2V0bGVuOwogCXUzMiBwYWNrZXRsZW5fYWxpZ25lZDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgYnVmZmVybGlzdFszXTsKKwlzdHJ1Y3Qga3ZlYyBidWZmZXJsaXN0WzNdOwogCXU2NCBhbGlnbmVkX2RhdGEgPSAwOwogCWJvb2wgc2lnbmFsID0gZmFsc2U7CiAKQEAgLTYzNywxMSArNjM5LDEyIEBACiAJCWRlc2MucmFuZ2VbaV0ucGZuCSA9IHBhZ2VidWZmZXJzW2ldLnBmbjsKIAl9CiAKLQlzZ19pbml0X3RhYmxlKGJ1ZmZlcmxpc3QsIDMpOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMF0sICZkZXNjLCBkZXNjc2l6ZSk7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsxXSwgYnVmZmVyLCBidWZmZXJsZW4pOwotCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMl0sICZhbGlnbmVkX2RhdGEsCi0JCXBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKKwlidWZmZXJsaXN0WzBdLmlvdl9iYXNlID0gJmRlc2M7CisJYnVmZmVybGlzdFswXS5pb3ZfbGVuID0gZGVzY3NpemU7CisJYnVmZmVybGlzdFsxXS5pb3ZfYmFzZSA9IGJ1ZmZlcjsKKwlidWZmZXJsaXN0WzFdLmlvdl9sZW4gPSBidWZmZXJsZW47CisJYnVmZmVybGlzdFsyXS5pb3ZfYmFzZSA9ICZhbGlnbmVkX2RhdGE7CisJYnVmZmVybGlzdFsyXS5pb3ZfbGVuID0gKHBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAogCXJldCA9IGh2X3JpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCAzLCAmc2lnbmFsKTsKIApAQCAtNjY1LDcgKzY2OCw3IEBACiAJdTMyIGRlc2NzaXplOwogCXUzMiBwYWNrZXRsZW47CiAJdTMyIHBhY2tldGxlbl9hbGlnbmVkOwotCXN0cnVjdCBzY2F0dGVybGlzdCBidWZmZXJsaXN0WzNdOworCXN0cnVjdCBrdmVjIGJ1ZmZlcmxpc3RbM107CiAJdTY0IGFsaWduZWRfZGF0YSA9IDA7CiAJYm9vbCBzaWduYWwgPSBmYWxzZTsKIAl1MzIgcGZuY291bnQgPSBOVU1fUEFHRVNfU1BBTk5FRChtdWx0aV9wYWdlYnVmZmVyLT5vZmZzZXQsCkBAIC03MDAsMTEgKzcwMywxMiBAQAogCW1lbWNweShkZXNjLnJhbmdlLnBmbl9hcnJheSwgbXVsdGlfcGFnZWJ1ZmZlci0+cGZuX2FycmF5LAogCSAgICAgICBwZm5jb3VudCAqIHNpemVvZih1NjQpKTsKIAotCXNnX2luaXRfdGFibGUoYnVmZmVybGlzdCwgMyk7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFswXSwgJmRlc2MsIGRlc2NzaXplKTsKLQlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzFdLCBidWZmZXIsIGJ1ZmZlcmxlbik7Ci0Jc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsyXSwgJmFsaWduZWRfZGF0YSwKLQkJcGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOworCWJ1ZmZlcmxpc3RbMF0uaW92X2Jhc2UgPSAmZGVzYzsKKwlidWZmZXJsaXN0WzBdLmlvdl9sZW4gPSBkZXNjc2l6ZTsKKwlidWZmZXJsaXN0WzFdLmlvdl9iYXNlID0gYnVmZmVyOworCWJ1ZmZlcmxpc3RbMV0uaW92X2xlbiA9IGJ1ZmZlcmxlbjsKKwlidWZmZXJsaXN0WzJdLmlvdl9iYXNlID0gJmFsaWduZWRfZGF0YTsKKwlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsICZzaWduYWwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYyBiL2RyaXZlcnMvaHYvaHZfYmFsbG9vbi5jCmluZGV4IDdlMTdhNTQuLjdlNmQ3OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHZfYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMvaHYvaHZfYmFsbG9vbi5jCkBAIC0xMTcxLDcgKzExNzEsOCBAQAogCWludCB0OwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZG1fZGV2aWNlLmNvbmZpZ19ldmVudCwgMSpIWik7CisJCXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkJCSZkbV9kZXZpY2UuY29uZmlnX2V2ZW50LCAxKkhaKTsKIAkJLyoKIAkJICogVGhlIGhvc3QgZXhwZWN0cyB1cyB0byBwb3N0IGluZm9ybWF0aW9uIG9uIHRoZSBtZW1vcnkKIAkJICogcHJlc3N1cmUgZXZlcnkgc2Vjb25kLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9mY29weS5jIGIvZHJpdmVycy9odi9odl9mY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYWEzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h2L2h2X2Zjb3B5LmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBmaWxlIGNvcHkgc2VydmljZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIE1pY3Jvc29mdCwgSW5jLgorICoKKyAqIEF1dGhvciA6IEsuIFkuIFNyaW5pdmFzYW4gPGtzcmluaXZhc2FuQG5vdmVsbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisKKyNpbmNsdWRlICJoeXBlcnZfdm1idXMuaCIKKworI2RlZmluZSBXSU44X1NSVl9NQUpPUgkJMQorI2RlZmluZSBXSU44X1NSVl9NSU5PUgkJMQorI2RlZmluZSBXSU44X1NSVl9WRVJTSU9OCShXSU44X1NSVl9NQUpPUiA8PCAxNiB8IFdJTjhfU1JWX01JTk9SKQorCisvKgorICogR2xvYmFsIHN0YXRlIG1haW50YWluZWQgZm9yIHRyYW5zYWN0aW9uIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkLgorICogRm9yIGEgY2xhc3Mgb2YgaW50ZWdyYXRpb24gc2VydmljZXMsIGluY2x1ZGluZyB0aGUgImZpbGUgY29weSBzZXJ2aWNlIiwKKyAqIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wgaXMgYSAicmVxdWVzdC9yZXNwb25zZSIgcHJvdG9jb2wgd2hpY2ggbWVhbnMgdGhhdAorICogdGhlcmUgY2FuIG9ubHkgYmUgc2luZ2xlIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uIGZyb20gdGhlIGhvc3QgYXQgYW55CisgKiBnaXZlbiBwb2ludCBpbiB0aW1lLiBXZSB1c2UgdGhpcyB0byBzaW1wbGlmeSBtZW1vcnkgbWFuYWdlbWVudCBpbiB0aGlzCisgKiBkcml2ZXIgLSB3ZSBjYWNoZSBhbmQgcHJvY2VzcyBvbmx5IG9uZSBtZXNzYWdlIGF0IGEgdGltZS4KKyAqCisgKiBXaGlsZSB0aGUgcmVxdWVzdC9yZXNwb25zZSBwcm90b2NvbCBpcyBndWFyYW50ZWVkIGJ5IHRoZSBob3N0LCB3ZSBmdXJ0aGVyCisgKiBlbnN1cmUgdGhpcyBieSBzZXJpYWxpemluZyBwYWNrZXQgcHJvY2Vzc2luZyBpbiB0aGlzIGRyaXZlciAtIHdlIGRvIG5vdAorICogcmVhZCBhZGRpdGlvbmFsIHBhY2tldHMgZnJvbSB0aGUgVk1CVXMgdW50aWwgdGhlIGN1cnJlbnQgcGFja2V0IGlzIGZ1bGx5CisgKiBoYW5kbGVkLgorICoKKyAqIFRoZSB0cmFuc2FjdGlvbiAiYWN0aXZlIiBzdGF0ZSBpcyBzZXQgd2hlbiB3ZSByZWNlaXZlIGEgcmVxdWVzdCBmcm9tIHRoZQorICogaG9zdCBhbmQgd2UgY2xlYW51cCB0aGlzIHN0YXRlIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlZCAtIHdoZW4gd2UKKyAqIHJlc3BvbmQgdG8gdGhlIGhvc3Qgd2l0aCBvdXIgcmVzcG9uc2UuIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGFjdGl2ZSBzdGF0ZSBpcworICogc2V0LCB3ZSBkZWZlciBoYW5kbGluZyBpbmNvbWluZyBwYWNrZXRzLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgeworCWJvb2wgYWN0aXZlOyAvKiB0cmFuc2FjdGlvbiBzdGF0dXMgLSBhY3RpdmUgb3Igbm90ICovCisJaW50IHJlY3ZfbGVuOyAvKiBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuICovCisJc3RydWN0IGh2X2Zjb3B5X2hkciAgKmZjb3B5X21zZzsgLyogY3VycmVudCBtZXNzYWdlICovCisJc3RydWN0IGh2X3N0YXJ0X2Zjb3B5ICBtZXNzYWdlOyAvKiAgc2VudCB0byBkYWVtb24gKi8KKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqcmVjdl9jaGFubmVsOyAvKiBjaG4gd2UgZ290IHRoZSByZXF1ZXN0ICovCisJdTY0IHJlY3ZfcmVxX2lkOyAvKiByZXF1ZXN0IElELiAqLworCXZvaWQgKmZjb3B5X2NvbnRleHQ7IC8qIGZvciB0aGUgY2hhbm5lbCBjYWxsYmFjayAqLworCXN0cnVjdCBzZW1hcGhvcmUgcmVhZF9zZW1hOworfSBmY29weV90cmFuc2FjdGlvbjsKKworc3RhdGljIGJvb2wgb3BlbmVkOyAvKiBjdXJyZW50bHkgZGV2aWNlIG9wZW5lZCAqLworCisvKgorICogQmVmb3JlIHdlIGNhbiBhY2NlcHQgY29weSBtZXNzYWdlcyBmcm9tIHRoZSBob3N0LCB3ZSBuZWVkCisgKiB0byBoYW5kc2hha2Ugd2l0aCB0aGUgdXNlciBsZXZlbCBkYWVtb24uIFRoaXMgc3RhdGUgdHJhY2tzCisgKiBpZiB3ZSBhcmUgaW4gdGhlIGhhbmRzaGFrZSBwaGFzZS4KKyAqLworc3RhdGljIGJvb2wgaW5faGFuZF9zaGFrZSA9IHRydWU7CitzdGF0aWMgdm9pZCBmY29weV9zZW5kX2RhdGEodm9pZCk7CitzdGF0aWMgdm9pZCBmY29weV9yZXNwb25kX3RvX2hvc3QoaW50IGVycm9yKTsKK3N0YXRpYyB2b2lkIGZjb3B5X3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmR1bW15KTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhmY29weV93b3JrLCBmY29weV93b3JrX2Z1bmMpOworc3RhdGljIHU4ICpyZWN2X2J1ZmZlcjsKKworc3RhdGljIHZvaWQgZmNvcHlfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCit7CisJLyoKKwkgKiBJZiB0aGUgdGltZXIgZmlyZXMsIHRoZSB1c2VyLW1vZGUgY29tcG9uZW50IGhhcyBub3QgcmVzcG9uZGVkOworCSAqIHByb2Nlc3MgdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb24uCisJICovCisJZmNvcHlfcmVzcG9uZF90b19ob3N0KEhWX0VfRkFJTCk7Cit9CisKK3N0YXRpYyBpbnQgZmNvcHlfaGFuZGxlX2hhbmRzaGFrZSh1MzIgdmVyc2lvbikKK3sKKwlzd2l0Y2ggKHZlcnNpb24pIHsKKwljYXNlIEZDT1BZX0NVUlJFTlRfVkVSU0lPTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogRm9yIG5vdyB3ZSB3aWxsIGZhaWwgdGhlIHJlZ2lzdHJhdGlvbi4KKwkJICogSWYgYW5kIHdoZW4gd2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyB0bworCQkgKiBkZWFsIHdpdGgsIHdlIHdpbGwgYmUgYmFja3dhcmQgY29tcGF0aWJsZS4KKwkJICogV2Ugd2lsbCBhZGQgdGhpcyBjb2RlIHdoZW4gbmVlZGVkLgorCQkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2luZm8oIkZDUDogdXNlci1tb2RlIHJlZ2lzdGVyaW5nIGRvbmUuIERhZW1vbiB2ZXJzaW9uOiAlZFxuIiwKKwkJdmVyc2lvbik7CisJZmNvcHlfdHJhbnNhY3Rpb24uYWN0aXZlID0gZmFsc2U7CisJaWYgKGZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X2NvbnRleHQpCisJCWh2X2Zjb3B5X29uY2hhbm5lbGNhbGxiYWNrKGZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X2NvbnRleHQpOworCWluX2hhbmRfc2hha2UgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmNvcHlfc2VuZF9kYXRhKHZvaWQpCit7CisJc3RydWN0IGh2X3N0YXJ0X2Zjb3B5ICpzbXNnX291dCA9ICZmY29weV90cmFuc2FjdGlvbi5tZXNzYWdlOworCWludCBvcGVyYXRpb24gPSBmY29weV90cmFuc2FjdGlvbi5mY29weV9tc2ctPm9wZXJhdGlvbjsKKwlzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkgKnNtc2dfaW47CisKKwkvKgorCSAqIFRoZSAgc3RyaW5ncyBzZW50IGZyb20gdGhlIGhvc3QgYXJlIGVuY29kZWQgaW4KKwkgKiBpbiB1dGYxNjsgY29udmVydCBpdCB0byB1dGY4IHN0cmluZ3MuCisJICogVGhlIGhvc3QgYXNzdXJlcyB1cyB0aGF0IHRoZSB1dGYxNiBzdHJpbmdzIHdpbGwgbm90IGV4Y2VlZAorCSAqIHRoZSBtYXggbGVuZ3RocyBzcGVjaWZpZWQuIFdlIHdpbGwgaG93ZXZlciwgcmVzZXJ2ZSByb29tCisJICogZm9yIHRoZSBzdHJpbmcgdGVybWluYXRpbmcgY2hhcmFjdGVyIC0gaW4gdGhlIHV0ZjE2c191dGY4cygpCisJICogZnVuY3Rpb24gd2UgbGltaXQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3aGVyZSB0aGUgY29udmVydGVkCisJICogc3RyaW5nIGlzIHBsYWNlZCB0byBXX01BWF9QQVRIIC0xIHRvIGd1YXJhbnRlZQorCSAqIHRoYXQgdGhlIHN0cmluZ3MgY2FuIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQhCisJICovCisKKwlzd2l0Y2ggKG9wZXJhdGlvbikgeworCWNhc2UgU1RBUlRfRklMRV9DT1BZOgorCQltZW1zZXQoc21zZ19vdXQsIDAsIHNpemVvZihzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkpKTsKKwkJc21zZ19vdXQtPmhkci5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJCXNtc2dfaW4gPSAoc3RydWN0IGh2X3N0YXJ0X2Zjb3B5ICopZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfbXNnOworCisJCXV0ZjE2c190b191dGY4cygod2NoYXJfdCAqKXNtc2dfaW4tPmZpbGVfbmFtZSwgV19NQVhfUEFUSCwKKwkJCQlVVEYxNl9MSVRUTEVfRU5ESUFOLAorCQkJCShfX3U4ICopc21zZ19vdXQtPmZpbGVfbmFtZSwgV19NQVhfUEFUSCAtIDEpOworCisJCXV0ZjE2c190b191dGY4cygod2NoYXJfdCAqKXNtc2dfaW4tPnBhdGhfbmFtZSwgV19NQVhfUEFUSCwKKwkJCQlVVEYxNl9MSVRUTEVfRU5ESUFOLAorCQkJCShfX3U4ICopc21zZ19vdXQtPnBhdGhfbmFtZSwgV19NQVhfUEFUSCAtIDEpOworCisJCXNtc2dfb3V0LT5jb3B5X2ZsYWdzID0gc21zZ19pbi0+Y29weV9mbGFnczsKKwkJc21zZ19vdXQtPmZpbGVfc2l6ZSA9IHNtc2dfaW4tPmZpbGVfc2l6ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJdXAoJmZjb3B5X3RyYW5zYWN0aW9uLnJlYWRfc2VtYSk7CisJcmV0dXJuOworfQorCisvKgorICogU2VuZCBhIHJlc3BvbnNlIGJhY2sgdG8gdGhlIGhvc3QuCisgKi8KKworc3RhdGljIHZvaWQKK2Zjb3B5X3Jlc3BvbmRfdG9faG9zdChpbnQgZXJyb3IpCit7CisJc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHI7CisJdTMyIGJ1Zl9sZW47CisJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWw7CisJdTY0IHJlcV9pZDsKKworCS8qCisJICogQ29weSB0aGUgZ2xvYmFsIHN0YXRlIGZvciBjb21wbGV0aW5nIHRoZSB0cmFuc2FjdGlvbi4gTm90ZSB0aGF0CisJICogb25seSBvbmUgdHJhbnNhY3Rpb24gY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuIFRoaXMgaXMgZ3VhcmFudGVlZAorCSAqIGJ5IHRoZSBmaWxlIGNvcHkgcHJvdG9jb2wgaW1wbGVtZW50ZWQgYnkgdGhlIGhvc3QuIEZ1cnRoZXJtb3JlLAorCSAqIHRoZSAidHJhbnNhY3Rpb24gYWN0aXZlIiBzdGF0ZSB3ZSBtYWludGFpbiBlbnN1cmVzIHRoYXQgdGhlcmUgY2FuCisJICogb25seSBiZSBvbmUgYWN0aXZlIHRyYW5zYWN0aW9uIGF0IGEgdGltZS4KKwkgKi8KKworCWJ1Zl9sZW4gPSBmY29weV90cmFuc2FjdGlvbi5yZWN2X2xlbjsKKwljaGFubmVsID0gZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsOworCXJlcV9pZCA9IGZjb3B5X3RyYW5zYWN0aW9uLnJlY3ZfcmVxX2lkOworCisJZmNvcHlfdHJhbnNhY3Rpb24uYWN0aXZlID0gZmFsc2U7CisKKwlpY21zZ2hkciA9IChzdHJ1Y3QgaWNtc2dfaGRyICopCisJCQkmcmVjdl9idWZmZXJbc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKV07CisKKwlpZiAoY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID09IE5VTEwpCisJCS8qCisJCSAqIFdlIGhhdmUgcmFjZWQgd2l0aCB1dGlsIGRyaXZlciBiZWluZyB1bmxvYWRlZDsKKwkJICogc2lsZW50bHkgcmV0dXJuLgorCQkgKi8KKwkJcmV0dXJuOworCisJaWNtc2doZHItPnN0YXR1cyA9IGVycm9yOworCWljbXNnaGRyLT5pY2ZsYWdzID0gSUNNU0dIRFJGTEFHX1RSQU5TQUNUSU9OIHwgSUNNU0dIRFJGTEFHX1JFU1BPTlNFOworCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgcmVjdl9idWZmZXIsIGJ1Zl9sZW4sIHJlcV9pZCwKKwkJCQlWTV9QS1RfREFUQV9JTkJBTkQsIDApOworfQorCit2b2lkIGh2X2Zjb3B5X29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250ZXh0OworCXUzMiByZWN2bGVuOworCXU2NCByZXF1ZXN0aWQ7CisJc3RydWN0IGh2X2Zjb3B5X2hkciAqZmNvcHlfbXNnOworCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRyOworCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKm5lZ29wID0gTlVMTDsKKwlpbnQgdXRpbF9md192ZXJzaW9uOworCWludCBmY29weV9zcnZfdmVyc2lvbjsKKworCWlmIChmY29weV90cmFuc2FjdGlvbi5hY3RpdmUpIHsKKwkJLyoKKwkJICogV2Ugd2lsbCBkZWZlciBwcm9jZXNzaW5nIHRoaXMgY2FsbGJhY2sgb25jZQorCQkgKiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KKwkJICovCisJCWZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X2NvbnRleHQgPSBjb250ZXh0OworCQlyZXR1cm47CisJfQorCisJdm1idXNfcmVjdnBhY2tldChjaGFubmVsLCByZWN2X2J1ZmZlciwgUEFHRV9TSVpFICogMiwgJnJlY3ZsZW4sCisJCQkgJnJlcXVlc3RpZCk7CisJaWYgKHJlY3ZsZW4gPD0gMCkKKwkJcmV0dXJuOworCisJaWNtc2doZHIgPSAoc3RydWN0IGljbXNnX2hkciAqKSZyZWN2X2J1ZmZlclsKKwkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcildOworCWlmIChpY21zZ2hkci0+aWNtc2d0eXBlID09IElDTVNHVFlQRV9ORUdPVElBVEUpIHsKKwkJdXRpbF9md192ZXJzaW9uID0gVVRJTF9GV19WRVJTSU9OOworCQlmY29weV9zcnZfdmVyc2lvbiA9IFdJTjhfU1JWX1ZFUlNJT047CisJCXZtYnVzX3ByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHIsIG5lZ29wLCByZWN2X2J1ZmZlciwKKwkJCQl1dGlsX2Z3X3ZlcnNpb24sIGZjb3B5X3Nydl92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlmY29weV9tc2cgPSAoc3RydWN0IGh2X2Zjb3B5X2hkciAqKSZyZWN2X2J1ZmZlclsKKwkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKKwkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOworCisJCS8qCisJCSAqIFN0YXNoIGF3YXkgdGhpcyBnbG9iYWwgc3RhdGUgZm9yIGNvbXBsZXRpbmcgdGhlCisJCSAqIHRyYW5zYWN0aW9uOyBub3RlIHRyYW5zYWN0aW9ucyBhcmUgc2VyaWFsaXplZC4KKwkJICovCisKKwkJZmNvcHlfdHJhbnNhY3Rpb24uYWN0aXZlID0gdHJ1ZTsKKwkJZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9sZW4gPSByZWN2bGVuOworCQlmY29weV90cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWwgPSBjaGFubmVsOworCQlmY29weV90cmFuc2FjdGlvbi5yZWN2X3JlcV9pZCA9IHJlcXVlc3RpZDsKKwkJZmNvcHlfdHJhbnNhY3Rpb24uZmNvcHlfbXNnID0gZmNvcHlfbXNnOworCisJCS8qCisJCSAqIFNlbmQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyLWxldmVsIGRhZW1vbi4KKwkJICovCisJCWZjb3B5X3NlbmRfZGF0YSgpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZjb3B5X3dvcmssIDUqSFopOworCQlyZXR1cm47CisJfQorCWljbXNnaGRyLT5pY2ZsYWdzID0gSUNNU0dIRFJGTEFHX1RSQU5TQUNUSU9OIHwgSUNNU0dIRFJGTEFHX1JFU1BPTlNFOworCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgcmVjdl9idWZmZXIsIHJlY3ZsZW4sIHJlcXVlc3RpZCwKKwkJCVZNX1BLVF9EQVRBX0lOQkFORCwgMCk7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBjaGFyIGRldmljZSB0aGF0IGNhbiBzdXBwb3J0IHJlYWQvd3JpdGUgZm9yIHBhc3NpbmcKKyAqIHRoZSBwYXlsb2FkLgorICovCisKK3N0YXRpYyBzc2l6ZV90IGZjb3B5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXZvaWQgKnNyYzsKKwlzaXplX3QgY29weV9zaXplOworCWludCBvcGVyYXRpb247CisKKwkvKgorCSAqIFdhaXQgdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGJlIHJlYWQuCisJICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZmNvcHlfdHJhbnNhY3Rpb24ucmVhZF9zZW1hKSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCS8qCisJICogVGhlIGNoYW5uZWwgbWF5IGJlIHJlc2NpbmRlZCBhbmQgaW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHdha2V1cCB0aGUKKwkgKiB0aGUgdGhyZWFkIGJsb2NrZWQgb24gdGhlIHNlbWFwaG9yZSBhbmQgd2Ugd2lsbCB1c2UgdGhlIG9wZW5lZAorCSAqIHN0YXRlIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhpcyBjYXNlLgorCSAqLworCWlmICghb3BlbmVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9wZXJhdGlvbiA9IGZjb3B5X3RyYW5zYWN0aW9uLmZjb3B5X21zZy0+b3BlcmF0aW9uOworCisJaWYgKG9wZXJhdGlvbiA9PSBTVEFSVF9GSUxFX0NPUFkpIHsKKwkJc3JjID0gJmZjb3B5X3RyYW5zYWN0aW9uLm1lc3NhZ2U7CisJCWNvcHlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHZfc3RhcnRfZmNvcHkpOworCQlpZiAoY291bnQgPCBjb3B5X3NpemUpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzcmMgPSBmY29weV90cmFuc2FjdGlvbi5mY29weV9tc2c7CisJCWNvcHlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHZfZG9fZmNvcHkpOworCQlpZiAoY291bnQgPCBjb3B5X3NpemUpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHNyYywgY29weV9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gY29weV9zaXplOworfQorCitzdGF0aWMgc3NpemVfdCBmY29weV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXNwb25zZSA9IDA7CisKKwlpZiAoY291bnQgIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXNwb25zZSwgYnVmLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGluX2hhbmRfc2hha2UpIHsKKwkJaWYgKGZjb3B5X2hhbmRsZV9oYW5kc2hha2UocmVzcG9uc2UpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBzaXplb2YoaW50KTsKKwl9CisKKwkvKgorCSAqIENvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBieSBmb3J3YXJkaW5nIHRoZSByZXN1bHQKKwkgKiB0byB0aGUgaG9zdC4gQnV0IGZpcnN0LCBjYW5jZWwgdGhlIHRpbWVvdXQuCisJICovCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZmNvcHlfd29yaykpCisJCWZjb3B5X3Jlc3BvbmRfdG9faG9zdChyZXNwb25zZSk7CisKKwlyZXR1cm4gc2l6ZW9mKGludCk7Cit9CisKK3N0YXRpYyBpbnQgZmNvcHlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwkvKgorCSAqIFRoZSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0IHdpbGwgb3BlbiB0aGlzIGRldmljZSBpcworCSAqIHJlYWxseSBhbiBleHRlbnNpb24gb2YgdGhpcyBkcml2ZXIuIFdlIGNhbiBoYXZlIG9ubHkKKwkgKiBhY3RpdmUgb3BlbiBhdCBhIHRpbWUuCisJICovCisJaWYgKG9wZW5lZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qCisJICogVGhlIGRhZW1vbiBpcyBhbGl2ZTsgc2V0dXAgdGhlIHN0YXRlLgorCSAqLworCW9wZW5lZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmNvcHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwkvKgorCSAqIFRoZSBkYWVtb24gaGFzIGV4aXRlZDsgcmVzZXQgdGhlIHN0YXRlLgorCSAqLworCWluX2hhbmRfc2hha2UgPSB0cnVlOworCW9wZW5lZCA9IGZhbHNlOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZjb3B5X2ZvcHMgPSB7CisJLnJlYWQgICAgICAgICAgID0gZmNvcHlfcmVhZCwKKwkud3JpdGUgICAgICAgICAgPSBmY29weV93cml0ZSwKKwkucmVsZWFzZQk9IGZjb3B5X3JlbGVhc2UsCisJLm9wZW4JCT0gZmNvcHlfb3BlbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBmY29weV9taXNjID0geworCS5taW5vciAgICAgICAgICA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSAgICAgICAgICAgPSAidm1idXMvaHZfZmNvcHkiLAorCS5mb3BzICAgICAgICAgICA9ICZmY29weV9mb3BzLAorfTsKKworc3RhdGljIGludCBmY29weV9kZXZfaW5pdCh2b2lkKQoreworCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZmY29weV9taXNjKTsKK30KKworc3RhdGljIHZvaWQgZmNvcHlfZGV2X2RlaW5pdCh2b2lkKQoreworCisJLyoKKwkgKiBUaGUgZGV2aWNlIGlzIGdvaW5nIGF3YXkgLSBwZXJoYXBzIGJlY2F1c2UgdGhlCisJICogaG9zdCBoYXMgcmVzY2luZGVkIHRoZSBjaGFubmVsLiBTZXR1cCBzdGF0ZSBzbyB0aGF0CisJICogdXNlciBsZXZlbCBkYWVtb24gY2FuIGdyYWNlZnVsbHkgZXhpdCBpZiBpdCBpcyBibG9ja2VkCisJICogb24gdGhlIHJlYWQgc2VtYXBob3JlLgorCSAqLworCW9wZW5lZCA9IGZhbHNlOworCS8qCisJICogU2lnbmFsIHRoZSBzZW1hcGhvcmUgYXMgdGhlIGRldmljZSBpcworCSAqIGdvaW5nIGF3YXkuCisJICovCisJdXAoJmZjb3B5X3RyYW5zYWN0aW9uLnJlYWRfc2VtYSk7CisJbWlzY19kZXJlZ2lzdGVyKCZmY29weV9taXNjKTsKK30KKworaW50IGh2X2Zjb3B5X2luaXQoc3RydWN0IGh2X3V0aWxfc2VydmljZSAqc3J2KQoreworCXJlY3ZfYnVmZmVyID0gc3J2LT5yZWN2X2J1ZmZlcjsKKworCS8qCisJICogV2hlbiB0aGlzIGRyaXZlciBsb2FkcywgdGhlIHVzZXIgbGV2ZWwgZGFlbW9uIHRoYXQKKwkgKiBwcm9jZXNzZXMgdGhlIGhvc3QgcmVxdWVzdHMgbWF5IG5vdCB5ZXQgYmUgcnVubmluZy4KKwkgKiBEZWZlciBwcm9jZXNzaW5nIGNoYW5uZWwgY2FsbGJhY2tzIHVudGlsIHRoZSBkYWVtb24KKwkgKiBoYXMgcmVnaXN0ZXJlZC4KKwkgKi8KKwlmY29weV90cmFuc2FjdGlvbi5hY3RpdmUgPSB0cnVlOworCXNlbWFfaW5pdCgmZmNvcHlfdHJhbnNhY3Rpb24ucmVhZF9zZW1hLCAwKTsKKworCXJldHVybiBmY29weV9kZXZfaW5pdCgpOworfQorCit2b2lkIGh2X2Zjb3B5X2RlaW5pdCh2b2lkKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZmNvcHlfd29yayk7CisJZmNvcHlfZGV2X2RlaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9rdnAuYyBiL2RyaXZlcnMvaHYvaHZfa3ZwLmMKaW5kZXggMDk5ODhiMi4uZWE4NTI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl9rdnAuYworKysgYi9kcml2ZXJzL2h2L2h2X2t2cC5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJa3ZwX21zZy0+a3ZwX2hkci5vcGVyYXRpb24gPSByZWdfdmFsdWU7CiAJCXN0cmNweSh2ZXJzaW9uLCBIVl9EUlZfVkVSU0lPTik7CiAJCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCBodl9rdnBfbXNnKTsKLQkJY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0FUT01JQyk7CisJCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIDAsIEdGUF9BVE9NSUMpOwogCQlrZnJlZShtc2cpOwogCX0KIH0KQEAgLTQzNSw3ICs0MzUsNyBAQAogCX0KIAogCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCBodl9rdnBfbXNnKTsKLQljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBHRlBfQVRPTUlDKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCAwLCBHRlBfQVRPTUlDKTsKIAlrZnJlZShtc2cpOwogCiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9zbmFwc2hvdC5jIGIvZHJpdmVycy9odi9odl9zbmFwc2hvdC5jCmluZGV4IDBjMzU0NjIuLjM0ZjE0ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYworKysgYi9kcml2ZXJzL2h2L2h2X3NuYXBzaG90LmMKQEAgLTk4LDcgKzk4LDcgQEAKIAl2c3NfbXNnLT52c3NfaGRyLm9wZXJhdGlvbiA9IG9wOwogCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCBodl92c3NfbXNnKTsKIAotCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIEdGUF9BVE9NSUMpOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIDAsIEdGUF9BVE9NSUMpOwogCWtmcmVlKG1zZyk7CiAKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2X3V0aWwuYyBiL2RyaXZlcnMvaHYvaHZfdXRpbC5jCmluZGV4IDYyZGZkMjQ2Li5kZDc2MTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X3V0aWwuYworKysgYi9kcml2ZXJzL2h2L2h2X3V0aWwuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2h5cGVydi5oPgogCisjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCiAKICNkZWZpbmUgU0RfTUFKT1IJMwogI2RlZmluZSBTRF9NSU5PUgkwCkBAIC04Miw2ICs4MywxMiBAQAogCS51dGlsX2RlaW5pdCA9IGh2X3Zzc19kZWluaXQsCiB9OwogCitzdGF0aWMgc3RydWN0IGh2X3V0aWxfc2VydmljZSB1dGlsX2Zjb3B5ID0geworCS51dGlsX2NiID0gaHZfZmNvcHlfb25jaGFubmVsY2FsbGJhY2ssCisJLnV0aWxfaW5pdCA9IGh2X2Zjb3B5X2luaXQsCisJLnV0aWxfZGVpbml0ID0gaHZfZmNvcHlfZGVpbml0LAorfTsKKwogc3RhdGljIHZvaWQgcGVyZm9ybV9zaHV0ZG93bihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmR1bW15KQogewogCW9yZGVybHlfcG93ZXJvZmYodHJ1ZSk7CkBAIC00MDEsNiArNDA4LDEwIEBACiAJeyBIVl9WU1NfR1VJRCwKIAkgIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZ1dGlsX3ZzcwogCX0sCisJLyogRmlsZSBjb3B5IEdVSUQgKi8KKwl7IEhWX0ZDT1BZX0dVSUQsCisJICAuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmdXRpbF9mY29weQorCX0sCiAJeyB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaCBiL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmgKaW5kZXggZTA1NTE3Ni4uODYwMTM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaAorKysgYi9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCkBAIC01NTksOCArNTU5LDggQEAKIHZvaWQgaHZfcmluZ2J1ZmZlcl9jbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pOwogCiBpbnQgaHZfcmluZ2J1ZmZlcl93cml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAotCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCi0JCSAgICB1MzIgc2djb3VudCwgYm9vbCAqc2lnbmFsKTsKKwkJICAgIHN0cnVjdCBrdmVjICprdl9saXN0LAorCQkgICAgdTMyIGt2X2NvdW50LCBib29sICpzaWduYWwpOwogCiBpbnQgaHZfcmluZ2J1ZmZlcl9wZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIHZvaWQgKmJ1ZmZlciwKIAkJICAgdTMyIGJ1Zmxlbik7CkBAIC02NjksNSArNjY5LDkgQEAKIAogdm9pZCB2bWJ1c19vbl9ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpOwogCitpbnQgaHZfZmNvcHlfaW5pdChzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlICopOwordm9pZCBodl9mY29weV9kZWluaXQodm9pZCk7Cit2b2lkIGh2X2Zjb3B5X29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKik7CisKIAogI2VuZGlmIC8qIF9IWVBFUlZfVk1CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9yaW5nX2J1ZmZlci5jIGIvZHJpdmVycy9odi9yaW5nX2J1ZmZlci5jCmluZGV4IDI2YzkzY2YuLjE1ZGI2NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYworKysgYi9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h5cGVydi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogCiAjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCiAKQEAgLTM4NywyMyArMzg4LDIwIEBACiAgKgogICovCiBpbnQgaHZfcmluZ2J1ZmZlcl93cml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqb3V0cmluZ19pbmZvLAotCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHUzMiBzZ2NvdW50LCBib29sICpzaWduYWwpCisJCSAgICBzdHJ1Y3Qga3ZlYyAqa3ZfbGlzdCwgdTMyIGt2X2NvdW50LCBib29sICpzaWduYWwpCiB7CiAJaW50IGkgPSAwOwogCXUzMiBieXRlc19hdmFpbF90b3dyaXRlOwogCXUzMiBieXRlc19hdmFpbF90b3JlYWQ7CiAJdTMyIHRvdGFsYnl0ZXNfdG93cml0ZSA9IDA7CiAKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXUzMiBuZXh0X3dyaXRlX2xvY2F0aW9uOwogCXUzMiBvbGRfd3JpdGU7CiAJdTY0IHByZXZfaW5kaWNlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWZvcl9lYWNoX3NnKHNnbGlzdCwgc2csIHNnY291bnQsIGkpCi0JewotCQl0b3RhbGJ5dGVzX3Rvd3JpdGUgKz0gc2ctPmxlbmd0aDsKLQl9CisJZm9yIChpID0gMDsgaSA8IGt2X2NvdW50OyBpKyspCisJCXRvdGFsYnl0ZXNfdG93cml0ZSArPSBrdl9saXN0W2ldLmlvdl9sZW47CiAKIAl0b3RhbGJ5dGVzX3Rvd3JpdGUgKz0gc2l6ZW9mKHU2NCk7CiAKQEAgLTQyNywxMiArNDI1LDExIEBACiAKIAlvbGRfd3JpdGUgPSBuZXh0X3dyaXRlX2xvY2F0aW9uOwogCi0JZm9yX2VhY2hfc2coc2dsaXN0LCBzZywgc2djb3VudCwgaSkKLQl7CisJZm9yIChpID0gMDsgaSA8IGt2X2NvdW50OyBpKyspIHsKIAkJbmV4dF93cml0ZV9sb2NhdGlvbiA9IGh2X2NvcHl0b19yaW5nYnVmZmVyKG91dHJpbmdfaW5mbywKIAkJCQkJCSAgICAgbmV4dF93cml0ZV9sb2NhdGlvbiwKLQkJCQkJCSAgICAgc2dfdmlydChzZyksCi0JCQkJCQkgICAgIHNnLT5sZW5ndGgpOworCQkJCQkJICAgICBrdl9saXN0W2ldLmlvdl9iYXNlLAorCQkJCQkJICAgICBrdl9saXN0W2ldLmlvdl9sZW4pOwogCX0KIAogCS8qIFNldCBwcmV2aW91cyBwYWNrZXQgc3RhcnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMgYi9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCmluZGV4IDA3N2JiMWIuLjhlNTNhM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMKKysrIGIvZHJpdmVycy9odi92bWJ1c19kcnYuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00NCw2ICs0MywxMiBAQAogc3RhdGljIHN0cnVjdCBjb21wbGV0aW9uIHByb2JlX2V2ZW50Owogc3RhdGljIGludCBpcnE7CiAKK3N0cnVjdCByZXNvdXJjZSBoeXBlcnZfbW1pbyA9IHsKKwkubmFtZSAgPSAiaHlwZXJ2IG1taW8iLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGh5cGVydl9tbWlvKTsKKwogc3RhdGljIGludCB2bWJ1c19leGlzdHModm9pZCkKIHsKIAlpZiAoaHZfYWNwaV9kZXYgPT0gTlVMTCkKQEAgLTU1OCw5ICs1NjMsNiBAQAogCS5kZXZfZ3JvdXBzID0JCXZtYnVzX2dyb3VwcywKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJoeXBlcnYiOwotCi0KIHN0cnVjdCBvbm1lc3NhZ2Vfd29ya19jb250ZXh0IHsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgaHZfbWVzc2FnZSBtc2c7CkBAIC02MTksNyArNjIxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCB2bWJ1c19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIHZvaWQgdm1idXNfaXNyKHZvaWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl2b2lkICpwYWdlX2FkZHI7CkBAIC02MjksNyArNjMxLDcgQEAKIAogCXBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdOwogCWlmIChwYWdlX2FkZHIgPT0gTlVMTCkKLQkJcmV0dXJuIElSUV9OT05FOworCQlyZXR1cm47CiAKIAlldmVudCA9ICh1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyAqKXBhZ2VfYWRkciArCiAJCQkJCSBWTUJVU19NRVNTQUdFX1NJTlQ7CkBAIC02NjUsMjggKzY2Nyw4IEBACiAJbXNnID0gKHN0cnVjdCBodl9tZXNzYWdlICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOwogCiAJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFjdHVhbCBtc2dzIHRvIGJlIHByb2Nlc3NlZCAqLwotCWlmIChtc2ctPmhlYWRlci5tZXNzYWdlX3R5cGUgIT0gSFZNU0dfTk9ORSkgewotCQloYW5kbGVkID0gdHJ1ZTsKKwlpZiAobXNnLT5oZWFkZXIubWVzc2FnZV90eXBlICE9IEhWTVNHX05PTkUpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJm1zZ19kcGMpOwotCX0KLQotCWlmIChoYW5kbGVkKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JZWxzZQotCQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLS8qCi0gKiB2bWJ1cyBpbnRlcnJ1cHQgZmxvdyBoYW5kbGVyOgotICogdm1idXMgaW50ZXJydXB0cyBjYW4gY29uY3VycmVudGx5IG9jY3VyIG9uIG11bHRpcGxlIENQVXMgYW5kCi0gKiBjYW4gYmUgaGFuZGxlZCBjb25jdXJyZW50bHkuCi0gKi8KLQotc3RhdGljIHZvaWQgdm1idXNfZmxvd19oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQlrc3RhdF9pbmNyX2lycXNfdGhpc19jcHUoaXJxLCBkZXNjKTsKLQotCWRlc2MtPmFjdGlvbi0+aGFuZGxlcihpcnEsIGRlc2MtPmFjdGlvbi0+ZGV2X2lkKTsKIH0KIAogLyoKQEAgLTcxNSwyNSArNjk3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9jbGVhbnVwOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB2bWJ1c19pc3IsIDAsIGRyaXZlcl9uYW1lLCBodl9hY3BpX2Rldik7Ci0KLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsCi0JCQkgICBpcnEpOwotCQlnb3RvIGVycl91bnJlZ2lzdGVyOwotCX0KLQotCS8qCi0JICogVm1idXMgaW50ZXJydXB0cyBjYW4gYmUgaGFuZGxlZCBjb25jdXJyZW50bHkgb24KLQkgKiBkaWZmZXJlbnQgQ1BVcy4gRXN0YWJsaXNoIGFuIGFwcHJvcHJpYXRlIGludGVycnVwdCBmbG93Ci0JICogaGFuZGxlciB0aGF0IGNhbiBzdXBwb3J0IHRoaXMgbW9kZWwuCi0JICovCi0JaXJxX3NldF9oYW5kbGVyKGlycSwgdm1idXNfZmxvd19oYW5kbGVyKTsKLQotCS8qCi0JICogUmVnaXN0ZXIgb3VyIGludGVycnVwdCBoYW5kbGVyLgotCSAqLwotCWh2X3JlZ2lzdGVyX3ZtYnVzX2hhbmRsZXIoaXJxLCB2bWJ1c19pc3IpOworCWh2X3NldHVwX3ZtYnVzX2lycSh2bWJ1c19pc3IpOwogCiAJcmV0ID0gaHZfc3luaWNfYWxsb2MoKTsKIAlpZiAocmV0KQpAQCAtNzUzLDkgKzcxNyw4IEBACiAKIGVycl9hbGxvYzoKIAlodl9zeW5pY19mcmVlKCk7Ci0JZnJlZV9pcnEoaXJxLCBodl9hY3BpX2Rldik7CisJaHZfcmVtb3ZlX3ZtYnVzX2lycSgpOwogCi1lcnJfdW5yZWdpc3RlcjoKIAlidXNfdW5yZWdpc3RlcigmaHZfYnVzKTsKIAogZXJyX2NsZWFudXA6CkBAIC04ODYsMTggKzg0OSwyMSBAQAogCiAKIC8qCi0gKiBWTUJVUyBpcyBhbiBhY3BpIGVudW1lcmF0ZWQgZGV2aWNlLiBHZXQgdGhlIHRoZSBJUlEgaW5mb3JtYXRpb24KLSAqIGZyb20gRFNEVC4KKyAqIFZNQlVTIGlzIGFuIGFjcGkgZW51bWVyYXRlZCBkZXZpY2UuIEdldCB0aGUgdGhlIGluZm9ybWF0aW9uIHdlCisgKiBuZWVkIGZyb20gRFNEVC4KICAqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMgdm1idXNfd2Fsa19yZXNvdXJjZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqaXJxKQorc3RhdGljIGFjcGlfc3RhdHVzIHZtYnVzX3dhbGtfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXMsIHZvaWQgKmN0eCkKIHsKKwlzd2l0Y2ggKHJlcy0+dHlwZSkgeworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUToKKwkJaXJxID0gcmVzLT5kYXRhLmlycS5pbnRlcnJ1cHRzWzBdOworCQlicmVhazsKIAotCWlmIChyZXMtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0lSUSkgewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKmlycXA7Ci0JCWlycXAgPSAmcmVzLT5kYXRhLmlycTsKLQotCQkqKCh1bnNpZ25lZCBpbnQgKilpcnEpID0gaXJxcC0+aW50ZXJydXB0c1swXTsKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6CisJCWh5cGVydl9tbWlvLnN0YXJ0ID0gcmVzLT5kYXRhLmFkZHJlc3M2NC5taW5pbXVtOworCQloeXBlcnZfbW1pby5lbmQgPSByZXMtPmRhdGEuYWRkcmVzczY0Lm1heGltdW07CisJCWJyZWFrOwogCX0KIAogCXJldHVybiBBRV9PSzsKQEAgLTkwNiwxOCArODcyLDM0IEBACiBzdGF0aWMgaW50IHZtYnVzX2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHJlc3VsdDsKKwlpbnQgcmV0X3ZhbCA9IC1FTk9ERVY7CiAKIAlodl9hY3BpX2RldiA9IGRldmljZTsKIAogCXJlc3VsdCA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCi0JCQkJCXZtYnVzX3dhbGtfcmVzb3VyY2VzLCAmaXJxKTsKKwkJCQkJdm1idXNfd2Fsa19yZXNvdXJjZXMsIE5VTEwpOwogCi0JaWYgKEFDUElfRkFJTFVSRShyZXN1bHQpKSB7Ci0JCWNvbXBsZXRlKCZwcm9iZV9ldmVudCk7Ci0JCXJldHVybiAtRU5PREVWOworCWlmIChBQ1BJX0ZBSUxVUkUocmVzdWx0KSkKKwkJZ290byBhY3BpX3dhbGtfZXJyOworCS8qCisJICogVGhlIHBhcmVudCBvZiB0aGUgdm1idXMgYWNwaSBkZXZpY2UgKEdlbjIgZmlybXdhcmUpIGlzIHRoZSBWTU9EIHRoYXQKKwkgKiBoYXMgdGhlIG1taW8gcmFuZ2VzLiBHZXQgdGhhdC4KKwkgKi8KKwlpZiAoZGV2aWNlLT5wYXJlbnQpIHsKKwkJcmVzdWx0ID0gYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPnBhcmVudC0+aGFuZGxlLAorCQkJCQlNRVRIT0RfTkFNRV9fQ1JTLAorCQkJCQl2bWJ1c193YWxrX3Jlc291cmNlcywgTlVMTCk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShyZXN1bHQpKQorCQkJZ290byBhY3BpX3dhbGtfZXJyOworCQlpZiAoaHlwZXJ2X21taW8uc3RhcnQgJiYgaHlwZXJ2X21taW8uZW5kKQorCQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZoeXBlcnZfbW1pbyk7CiAJfQorCXJldF92YWwgPSAwOworCithY3BpX3dhbGtfZXJyOgogCWNvbXBsZXRlKCZwcm9iZV9ldmVudCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldF92YWw7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgdm1idXNfYWNwaV9kZXZpY2VfaWRzW10gPSB7CkBAIC05NDcsNyArOTI5LDYgQEAKIAkvKgogCSAqIEdldCBpcnEgcmVzb3VyY2VzIGZpcnN0LgogCSAqLwotCiAJcmV0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZ2bWJ1c19hY3BpX2RyaXZlcik7CiAKIAlpZiAocmV0KQpAQCAtOTc4LDggKzk1OSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2bWJ1c19leGl0KHZvaWQpCiB7Ci0KLQlmcmVlX2lycShpcnEsIGh2X2FjcGlfZGV2KTsKKwlodl9yZW1vdmVfdm1idXNfaXJxKCk7CiAJdm1idXNfZnJlZV9jaGFubmVscygpOwogCWJ1c191bnJlZ2lzdGVyKCZodl9idXMpOwogCWh2X2NsZWFudXAoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCA1Y2U0M2Q4Li5iNTNkODc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0xMTEsMjIgKzExMSw2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGFkNzQxOC4KIAotY29uZmlnIFNFTlNPUlNfQURDWFgKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBBREN4eHhTeHh4IgotCWRlcGVuZHMgb24gU1BJX01BU1RFUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgotCSAgQURDPGJiPjxjPlM8c3NzPiBjaGlwIGZhbWlseSwgd2hlcmUKLQkgICogYmIgIGlzIHRoZSByZXNvbHV0aW9uIGluIG51bWJlciBvZiBiaXRzICg4LCAxMCwgMTIpCi0JICAqIGMgICBpcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICgxLCAyLCA0LCA4KQotCSAgKiBzc3MgaXMgdGhlIG1heGltdW0gY29udmVyc2lvbiBzcGVlZCAoMDIxIGZvciAyMDAga1NQUywgMDUxIGZvciA1MDAKLQkgICAga1NQUyBhbmQgMTAxIGZvciAxIE1TUFMpCi0KLQkgIEV4YW1wbGVzIDogQURDMDgxUzEwMSwgQURDMTI0UzUwMSwgLi4uCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGFkY3h4LgotCiBjb25maWcgU0VOU09SU19BRE0xMDIxCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjEgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCkBAIC0zMTIsNiArMjk2LDMxIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBmYW0xNWhfcG93ZXIuCiAKK2NvbmZpZyBTRU5TT1JTX0FQUExFU01DCisJdHJpc3RhdGUgIkFwcGxlIFNNQyAoTW90aW9uIHNlbnNvciwgbGlnaHQgc2Vuc29yLCBrZXlib2FyZCBiYWNrbGlnaHQpIgorCWRlcGVuZHMgb24gSU5QVVQgJiYgWDg2CisJc2VsZWN0IE5FV19MRURTCisJc2VsZWN0IExFRFNfQ0xBU1MKKwlzZWxlY3QgSU5QVVRfUE9MTERFVgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBBcHBsZSBTeXN0ZW0gTWFuYWdlbWVudAorCSAgQ29udHJvbGxlciwgd2hpY2ggcHJvdmlkZXMgYW4gYWNjZWxlcm9tZXRlciAoQXBwbGUgU3VkZGVuIE1vdGlvbgorCSAgU2Vuc29yKSwgbGlnaHQgc2Vuc29ycywgdGVtcGVyYXR1cmUgc2Vuc29ycywga2V5Ym9hcmQgYmFja2xpZ2h0CisJICBjb250cm9sIGFuZCBmYW4gY29udHJvbC4KKworCSAgT25seSBJbnRlbC1iYXNlZCBBcHBsZSdzIGNvbXB1dGVycyBhcmUgc3VwcG9ydGVkIChNYWNCb29rIFBybywKKwkgIE1hY0Jvb2ssIE1hY01pbmkpLgorCisJICBEYXRhIGZyb20gdGhlIGRpZmZlcmVudCBzZW5zb3JzLCBrZXlib2FyZCBiYWNrbGlnaHQgY29udHJvbCBhbmQgZmFuCisJICBjb250cm9sIGFyZSBhY2Nlc3NpYmxlIHZpYSBzeXNmcy4KKworCSAgVGhpcyBkcml2ZXIgYWxzbyBwcm92aWRlcyBhbiBhYnNvbHV0ZSBpbnB1dCBjbGFzcyBkZXZpY2UsIGFsbG93aW5nCisJICB0aGUgbGFwdG9wIHRvIGFjdCBhcyBhIHBpbmJhbGwgbWFjaGluZS1lc3F1ZSBqb3lzdGljay4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBhcHBsaWNhYmxlIGxhcHRvcCBhbmQgd2FudCB0byBleHBlcmllbmNlCisJICB0aGUgYXdlc29tZSBwb3dlciBvZiBhcHBsZXNtYy4KKwogY29uZmlnIFNFTlNPUlNfQVNCMTAwCiAJdHJpc3RhdGUgIkFzdXMgQVNCMTAwIEJhY2giCiAJZGVwZW5kcyBvbiBYODYgJiYgSTJDCkBAIC00MzUsNiArNDQ0LDEyIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBmNzUzNzVzLgogCitjb25maWcgU0VOU09SU19NQzEzNzgzX0FEQworICAgICAgICB0cmlzdGF0ZSAiRnJlZXNjYWxlIE1DMTM3ODMvTUMxMzg5MiBBREMiCisgICAgICAgIGRlcGVuZHMgb24gTUZEX01DMTNYWFgKKyAgICAgICAgaGVscAorICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBBL0QgY29udmVydGVyIG9uIE1DMTM3ODMgYW5kIE1DMTM4OTIgUE1JQy4KKwogY29uZmlnIFNFTlNPUlNfRlNDSE1ECiAJdHJpc3RhdGUgIkZ1aml0c3UgU2llbWVucyBDb21wdXRlcnMgc2Vuc29yIGNoaXBzIgogCWRlcGVuZHMgb24gWDg2ICYmIEkyQwpAQCAtNDUxLDI2ICs0NjYsNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZnNjaG1kLgogCi1jb25maWcgU0VOU09SU19HNzYwQQotCXRyaXN0YXRlICJHTVQgRzc2MEEiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2xvYmFsIE1peGVkLW1vZGUKLQkgIFRlY2hub2xvZ3kgSW5jIEc3NjBBIGZhbiBzcGVlZCBQV00gY29udHJvbGxlciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZzc2MGEuCi0KLWNvbmZpZyBTRU5TT1JTX0c3NjIKLQl0cmlzdGF0ZSAiR01UIEc3NjIgYW5kIEc3NjMiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2xvYmFsIE1peGVkLW1vZGUKLQkgIFRlY2hub2xvZ3kgSW5jIEc3NjIgYW5kIEc3NjMgZmFuIHNwZWVkIFBXTSBjb250cm9sbGVyIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBnNzYyLgotCiBjb25maWcgU0VOU09SU19HTDUxOFNNCiAJdHJpc3RhdGUgIkdlbmVzeXMgTG9naWMgR0w1MThTTSIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtNDkyLDYgKzQ4NywyNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZ2w1MjBzbS4KIAorY29uZmlnIFNFTlNPUlNfRzc2MEEKKwl0cmlzdGF0ZSAiR01UIEc3NjBBIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdsb2JhbCBNaXhlZC1tb2RlCisJICBUZWNobm9sb2d5IEluYyBHNzYwQSBmYW4gc3BlZWQgUFdNIGNvbnRyb2xsZXIgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGc3NjBhLgorCitjb25maWcgU0VOU09SU19HNzYyCisJdHJpc3RhdGUgIkdNVCBHNzYyIGFuZCBHNzYzIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdsb2JhbCBNaXhlZC1tb2RlCisJICBUZWNobm9sb2d5IEluYyBHNzYyIGFuZCBHNzYzIGZhbiBzcGVlZCBQV00gY29udHJvbGxlciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZzc2Mi4KKwogY29uZmlnIFNFTlNPUlNfR1BJT19GQU4KIAl0cmlzdGF0ZSAiR1BJTyBmYW4iCiAJZGVwZW5kcyBvbiBHUElPTElCCkBAIC01MTEsMjQgKzUyNiw2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBoaWg2MTMwLgogCi1jb25maWcgU0VOU09SU19IVFUyMQotCXRyaXN0YXRlICJNZWFzdXJlbWVudCBTcGVjaWFsdGllcyBIVFUyMUQgaHVtaWRpdHkvdGVtcGVyYXR1cmUgc2Vuc29ycyIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTWVhc3VyZW1lbnQgU3BlY2lhbHRpZXMKLQkgIEhUVTIxRCBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaHR1MjEuCi0KLWNvbmZpZyBTRU5TT1JTX0NPUkVURU1QCi0JdHJpc3RhdGUgIkludGVsIENvcmUvQ29yZTIvQXRvbSB0ZW1wZXJhdHVyZSBzZW5zb3IiCi0JZGVwZW5kcyBvbiBYODYKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIHRlbXBlcmF0dXJlCi0JICBzZW5zb3IgaW5zaWRlIHlvdXIgQ1BVLiBNb3N0IG9mIHRoZSBmYW1pbHkgNiBDUFVzCi0JICBhcmUgc3VwcG9ydGVkLiBDaGVjayBEb2N1bWVudGF0aW9uL2h3bW9uL2NvcmV0ZW1wIGZvciBkZXRhaWxzLgotCiBjb25maWcgU0VOU09SU19JQk1BRU0KIAl0cmlzdGF0ZSAiSUJNIEFjdGl2ZSBFbmVyZ3kgTWFuYWdlciB0ZW1wZXJhdHVyZS9wb3dlciBzZW5zb3JzIGFuZCBjb250cm9sIgogCXNlbGVjdCBJUE1JX1NJCkBAIC01NTcsNiArNTU0LDE0IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpYm1wZXguCiAKK2NvbmZpZyBTRU5TT1JTX0lCTVBPV0VSTlYKKwl0cmlzdGF0ZSAiSUJNIFBvd2VyTnYgUGxhdGZvcm0gdGVtcGVyYXR1cmUvcG93ZXIvZmFuIHNlbnNvciIKKwlkZXBlbmRzIG9uIFBQQ19QT1dFUk5WCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZS9mYW4vcG93ZXIKKwkgIHNlbnNvcnMgb24geW91ciBwbGF0Zm9ybS4KKwogY29uZmlnIFNFTlNPUlNfSUlPX0hXTU9OCiAJdHJpc3RhdGUgIkh3bW9uIGRyaXZlciB0aGF0IHVzZXMgY2hhbm5lbHMgc3BlY2lmaWVkIHZpYSBpaW8gbWFwcyIKIAlkZXBlbmRzIG9uIElJTwpAQCAtNTY2LDYgKzU3MSwxNCBAQAogCSAgZm9yIHRob3NlIGNoYW5uZWxzIHNwZWNpZmllZCBpbiB0aGUgbWFwLiAgVGhpcyBtYXAgY2FuIGJlIHByb3ZpZGVkCiAJICBlaXRoZXIgdmlhIHBsYXRmb3JtIGRhdGEgb3IgdGhlIGRldmljZSB0cmVlIGJpbmRpbmdzLgogCitjb25maWcgU0VOU09SU19DT1JFVEVNUAorCXRyaXN0YXRlICJJbnRlbCBDb3JlL0NvcmUyL0F0b20gdGVtcGVyYXR1cmUgc2Vuc29yIgorCWRlcGVuZHMgb24gWDg2CisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZQorCSAgc2Vuc29yIGluc2lkZSB5b3VyIENQVS4gTW9zdCBvZiB0aGUgZmFtaWx5IDYgQ1BVcworCSAgYXJlIHN1cHBvcnRlZC4gQ2hlY2sgRG9jdW1lbnRhdGlvbi9od21vbi9jb3JldGVtcCBmb3IgZGV0YWlscy4KKwogY29uZmlnIFNFTlNPUlNfSVQ4NwogCXRyaXN0YXRlICJJVEUgSVQ4N3h4IGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uICFQUEMKQEAgLTYxNCw2ICs2MjcsMjE5IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsaW5lYWdlLXBlbS4KIAorY29uZmlnIFNFTlNPUlNfTFRDMjk0NQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEMyOTQ1IgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFJFR01BUF9JMkMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMjk0NQorCSAgSTJDIFN5c3RlbSBNb25pdG9yLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzI5NDUuCisKK2NvbmZpZyBTRU5TT1JTX0xUQzQxNTEKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDE1MSIKKwlkZXBlbmRzIG9uIEkyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MTUxCisJICBIaWdoIFZvbHRhZ2UgSTJDIEN1cnJlbnQgYW5kIFZvbHRhZ2UgTW9uaXRvciBpbnRlcmZhY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbHRjNDE1MS4KKworY29uZmlnIFNFTlNPUlNfTFRDNDIxNQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjE1IgorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyMTUKKwkgIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjE1LgorCitjb25maWcgU0VOU09SU19MVEM0MjIyCisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyMjIiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjIyCisJICBEdWFsIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjIyLgorCitjb25maWcgU0VOU09SU19MVEM0MjQ1CisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNDUiCisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NQorCSAgTXVsdGlwbGUgU3VwcGx5IEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjQ1LgorCitjb25maWcgU0VOU09SU19MVEM0MjYwCisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNjAiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjYwCisJICBQb3NpdGl2ZSBWb2x0YWdlIEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjYwLgorCitjb25maWcgU0VOU09SU19MVEM0MjYxCisJdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQyNjEiCisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MQorCSAgTmVnYXRpdmUgVm9sdGFnZSBIb3QgU3dhcCBDb250cm9sbGVyIEkyQyBpbnRlcmZhY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbHRjNDI2MS4KKworY29uZmlnIFNFTlNPUlNfTUFYMTExMQorCXRyaXN0YXRlICJNYXhpbSBNQVgxMTExIFNlcmlhbCA4LWJpdCBBREMgY2hpcCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJaGVscAorCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IE1heGltJ3MgTUFYMTExMCwgTUFYMTExMSwgTUFYMTExMiwgYW5kIE1BWDExMTMKKwkgIEFEQyBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTExMS4KKworY29uZmlnIFNFTlNPUlNfTUFYMTYwNjUKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYwNjUgU3lzdGVtIE1hbmFnZXIgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKKwkgIGNhcGFiaWxpdGllcyBvZiB0aGUgZm9sbG93aW5nIE1heGltIFN5c3RlbSBNYW5hZ2VyIGNoaXBzLgorCSAgICBNQVgxNjA2NQorCSAgICBNQVgxNjA2NgorCSAgICBNQVgxNjA2NworCSAgICBNQVgxNjA2OAorCSAgICBNQVgxNjA3MAorCSAgICBNQVgxNjA3MQorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXgxNjA2NS4KKworY29uZmlnIFNFTlNPUlNfTUFYMTYxOQorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjE5IHNlbnNvciBjaGlwIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDE2MTkgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE2MTkuCisKK2NvbmZpZyBTRU5TT1JTX01BWDE2NjgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTY2OCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTY2OCwgTUFYMTk4OSBhbmQKKwkgIE1BWDE4MDUgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE2NjguCisKK2NvbmZpZyBTRU5TT1JTX01BWDE5NworCXRyaXN0YXRlICJNYXhpbSBNQVgxOTcgYW5kIGNvbXBhdGlibGVzIgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVgxOTcgQS9EIGNvbnZlcnRlci4KKwkgIFN1cHBvcnQgd2lsbCBpbmNsdWRlLCBidXQgbm90IGJlIGxpbWl0ZWQgdG8sIE1BWDE5NywgYW5kIE1BWDE5OS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXgxOTcuCisKK2NvbmZpZyBTRU5TT1JTX01BWDY2MzkKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjYzOSBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjYzOQorCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXg2NjM5LgorCitjb25maWcgU0VOU09SU19NQVg2NjQyCisJdHJpc3RhdGUgIk1heGltIE1BWDY2NDIgc2Vuc29yIGNoaXAiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYNjY0MiBzZW5zb3IgY2hpcC4KKwkgIE1BWDY2NDIgaXMgYSBTTUJ1cy1Db21wYXRpYmxlIFJlbW90ZS9Mb2NhbCBUZW1wZXJhdHVyZSBTZW5zb3IKKwkgIHdpdGggT3ZlcnRlbXBlcmF0dXJlIEFsYXJtIGZyb20gTWF4aW0uCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDY2NDIuCisKK2NvbmZpZyBTRU5TT1JTX01BWDY2NTAKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjY1MCBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTUFYNjY1MCAvIE1BWDY2NTEKKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY1MC4KKworY29uZmlnIFNFTlNPUlNfTUFYNjY5NworCXRyaXN0YXRlICJNYXhpbSBNQVg2Njk3IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVg2NTgxLCBNQVg2NjAyLCBNQVg2NjIyLAorCSAgTUFYNjYzNiwgTUFYNjY4OSwgTUFYNjY5MywgTUFYNjY5NCwgTUFYNjY5NywgTUFYNjY5OCwgYW5kIE1BWDY2OTkKKwkgIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY5Ny4KKworY29uZmlnIFNFTlNPUlNfSFRVMjEKKwl0cmlzdGF0ZSAiTWVhc3VyZW1lbnQgU3BlY2lhbHRpZXMgSFRVMjFEIGh1bWlkaXR5L3RlbXBlcmF0dXJlIHNlbnNvcnMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1lYXN1cmVtZW50IFNwZWNpYWx0aWVzCisJICBIVFUyMUQgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGh0dTIxLgorCitjb25maWcgU0VOU09SU19NQ1AzMDIxCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AzMDIxIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQ1AzMDIxIGFuZCBNQ1AzMjIxLgorCSAgVGhlIE1DUDMwMjEgaXMgYSBBL0QgY29udmVydGVyIChBREMpIHdpdGggMTAtYml0IGFuZCB0aGUgTUNQMzIyMQorCSAgd2l0aCAxMi1iaXQgcmVzb2x1dGlvbi4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWNwMzAyMS4KKworY29uZmlnIFNFTlNPUlNfQURDWFgKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBBREN4eHhTeHh4IgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorCSAgQURDPGJiPjxjPlM8c3NzPiBjaGlwIGZhbWlseSwgd2hlcmUKKwkgICogYmIgIGlzIHRoZSByZXNvbHV0aW9uIGluIG51bWJlciBvZiBiaXRzICg4LCAxMCwgMTIpCisJICAqIGMgICBpcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICgxLCAyLCA0LCA4KQorCSAgKiBzc3MgaXMgdGhlIG1heGltdW0gY29udmVyc2lvbiBzcGVlZCAoMDIxIGZvciAyMDAga1NQUywgMDUxIGZvciA1MDAKKwkgICAga1NQUyBhbmQgMTAxIGZvciAxIE1TUFMpCisKKwkgIEV4YW1wbGVzIDogQURDMDgxUzEwMSwgQURDMTI0UzUwMSwgLi4uCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkY3h4LgorCiBjb25maWcgU0VOU09SU19MTTYzCiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE02MyBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTc3Niw1MCArMTAwMiw2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsbTkzLgogCi1jb25maWcgU0VOU09SU19MVEM0MTUxCi0JdHJpc3RhdGUgIkxpbmVhciBUZWNobm9sb2d5IExUQzQxNTEiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDE1MQotCSAgSGlnaCBWb2x0YWdlIEkyQyBDdXJyZW50IGFuZCBWb2x0YWdlIE1vbml0b3IgaW50ZXJmYWNlLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIGx0YzQxNTEuCi0KLWNvbmZpZyBTRU5TT1JTX0xUQzQyMTUKLQl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDIxNSIKLQlkZXBlbmRzIG9uIEkyQwotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjE1Ci0JICBIb3QgU3dhcCBDb250cm9sbGVyIEkyQyBpbnRlcmZhY2UuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbHRjNDIxNS4KLQotY29uZmlnIFNFTlNPUlNfTFRDNDI0NQotCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1IgotCWRlcGVuZHMgb24gSTJDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyNDUKLQkgIE11bHRpcGxlIFN1cHBseSBIb3QgU3dhcCBDb250cm9sbGVyIEkyQyBpbnRlcmZhY2UuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbHRjNDI0NS4KLQotY29uZmlnIFNFTlNPUlNfTFRDNDI2MQotCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjYxIgotCWRlcGVuZHMgb24gSTJDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyNjEKLQkgIE5lZ2F0aXZlIFZvbHRhZ2UgSG90IFN3YXAgQ29udHJvbGxlciBJMkMgaW50ZXJmYWNlLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIGx0YzQyNjEuCi0KIGNvbmZpZyBTRU5TT1JTX0xNOTUyMzQKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTk1MjM0IgogCWRlcGVuZHMgb24gSTJDCkBAIC04NDksMTQwICsxMDMxLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtOTUyNDUuCiAKLWNvbmZpZyBTRU5TT1JTX01BWDExMTEKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTExMSBTZXJpYWwgOC1iaXQgQURDIGNoaXAgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gU1BJX01BU1RFUgotCWhlbHAKLQkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCBNYXhpbSdzIE1BWDExMTAsIE1BWDExMTEsIE1BWDExMTIsIGFuZCBNQVgxMTEzCi0JICBBREMgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDExMTEuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2MDY1Ci0JdHJpc3RhdGUgIk1heGltIE1BWDE2MDY1IFN5c3RlbSBNYW5hZ2VyIGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCi0JICBjYXBhYmlsaXRpZXMgb2YgdGhlIGZvbGxvd2luZyBNYXhpbSBTeXN0ZW0gTWFuYWdlciBjaGlwcy4KLQkgICAgTUFYMTYwNjUKLQkgICAgTUFYMTYwNjYKLQkgICAgTUFYMTYwNjcKLQkgICAgTUFYMTYwNjgKLQkgICAgTUFYMTYwNzAKLQkgICAgTUFYMTYwNzEKLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTYwNjUuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2MTkKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYxOSBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjE5IHNlbnNvciBjaGlwLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgotCi1jb25maWcgU0VOU09SU19NQVgxNjY4Ci0JdHJpc3RhdGUgIk1heGltIE1BWDE2NjggYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDE2NjgsIE1BWDE5ODkgYW5kCi0JICBNQVgxODA1IGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxNjY4LgotCi1jb25maWcgU0VOU09SU19NQVgxOTcKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTk3IGFuZCBjb21wYXRpYmxlcyIKLQloZWxwCi0JICBTdXBwb3J0IGZvciB0aGUgTWF4aW0gTUFYMTk3IEEvRCBjb252ZXJ0ZXIuCi0JICBTdXBwb3J0IHdpbGwgaW5jbHVkZSwgYnV0IG5vdCBiZSBsaW1pdGVkIHRvLCBNQVgxOTcsIGFuZCBNQVgxOTkuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTk3LgotCi1jb25maWcgU0VOU09SU19NQVg2NjM5Ci0JdHJpc3RhdGUgIk1heGltIE1BWDY2Mzkgc2Vuc29yIGNoaXAiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1BWDY2MzkKLQkgIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjYzOS4KLQotY29uZmlnIFNFTlNPUlNfTUFYNjY0MgotCXRyaXN0YXRlICJNYXhpbSBNQVg2NjQyIHNlbnNvciBjaGlwIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1BWDY2NDIgc2Vuc29yIGNoaXAuCi0JICBNQVg2NjQyIGlzIGEgU01CdXMtQ29tcGF0aWJsZSBSZW1vdGUvTG9jYWwgVGVtcGVyYXR1cmUgU2Vuc29yCi0JICB3aXRoIE92ZXJ0ZW1wZXJhdHVyZSBBbGFybSBmcm9tIE1heGltLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXg2NjQyLgotCi1jb25maWcgU0VOU09SU19NQVg2NjUwCi0JdHJpc3RhdGUgIk1heGltIE1BWDY2NTAgc2Vuc29yIGNoaXAiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1BWDY2NTAgLyBNQVg2NjUxCi0JICBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDY2NTAuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDY2OTcKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYNjY5NyBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYNjU4MSwgTUFYNjYwMiwgTUFYNjYyMiwKLQkgIE1BWDY2MzYsIE1BWDY2ODksIE1BWDY2OTMsIE1BWDY2OTQsIE1BWDY2OTcsIE1BWDY2OTgsIGFuZCBNQVg2Njk5Ci0JICB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1heDY2OTcuCi0KLWNvbmZpZyBTRU5TT1JTX01DUDMwMjEKLQl0cmlzdGF0ZSAiTWljcm9jaGlwIE1DUDMwMjEgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE1DUDMwMjEgYW5kIE1DUDMyMjEuCi0JICBUaGUgTUNQMzAyMSBpcyBhIEEvRCBjb252ZXJ0ZXIgKEFEQykgd2l0aCAxMC1iaXQgYW5kIHRoZSBNQ1AzMjIxCi0JICB3aXRoIDEyLWJpdCByZXNvbHV0aW9uLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtY3AzMDIxLgotCi1jb25maWcgU0VOU09SU19OQ1Q2Nzc1Ci0JdHJpc3RhdGUgIk51dm90b24gTkNUNjc3NUYgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gIVBQQwotCXNlbGVjdCBIV01PTl9WSUQKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIE51dm90b24gTkNUNjc3NUYsIE5DVDY3NzZGLCBOQ1Q2Nzc5RAotCSAgYW5kIGNvbXBhdGlibGUgU3VwZXItSS9PIGNoaXBzLiBUaGlzIGRyaXZlciByZXBsYWNlcyB0aGUKLQkgIHc4MzYyN2VoZiBkcml2ZXIgZm9yIE5DVDY3NzVGIGFuZCBOQ1Q2Nzc2Ri4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbmN0Njc3NS4KLQotY29uZmlnIFNFTlNPUlNfTlRDX1RIRVJNSVNUT1IKLQl0cmlzdGF0ZSAiTlRDIHRoZXJtaXN0b3Igc3VwcG9ydCIKLQlkZXBlbmRzIG9uICghT0YgJiYgIUlJTykgfHwgKE9GICYmIElJTykKLQloZWxwCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBOVEMgdGhlcm1pc3RvcnMgc2Vuc29yIHJlYWRpbmcgYW5kIGl0cwotCSAgaW50ZXJwcmV0YXRpb24uIFRoZSBkcml2ZXIgY2FuIGFsc28gbW9uaXRvciB0aGUgdGVtcGVyYXR1cmUgYW5kCi0JICBzZW5kIG5vdGlmaWNhdGlvbnMgYWJvdXQgdGhlIHRlbXBlcmF0dXJlLgotCi0JICBDdXJyZW50bHksIHRoaXMgZHJpdmVyIHN1cHBvcnRzCi0JICBOQ1AxNVdCNDczLCBOQ1AxOFdCNDczLCBOQ1AyMVdCNDczLCBOQ1AwM1dCNDczLCBhbmQgTkNQMTVXTDMzMy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbnRjLXRoZXJtaXN0b3IuCi0KIGNvbmZpZyBTRU5TT1JTX1BDODczNjAKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzYwIGZhbWlseSIKIAlkZXBlbmRzIG9uICFQUEMKQEAgLTEwMTEsNiArMTA1OSwzMyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcGM4NzQyNy4KIAorY29uZmlnIFNFTlNPUlNfTlRDX1RIRVJNSVNUT1IKKwl0cmlzdGF0ZSAiTlRDIHRoZXJtaXN0b3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uICghT0YgJiYgIUlJTykgfHwgKE9GICYmIElJTykKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBOVEMgdGhlcm1pc3RvcnMgc2Vuc29yIHJlYWRpbmcgYW5kIGl0cworCSAgaW50ZXJwcmV0YXRpb24uIFRoZSBkcml2ZXIgY2FuIGFsc28gbW9uaXRvciB0aGUgdGVtcGVyYXR1cmUgYW5kCisJICBzZW5kIG5vdGlmaWNhdGlvbnMgYWJvdXQgdGhlIHRlbXBlcmF0dXJlLgorCisJICBDdXJyZW50bHksIHRoaXMgZHJpdmVyIHN1cHBvcnRzCisJICBOQ1AxNVdCNDczLCBOQ1AxOFdCNDczLCBOQ1AyMVdCNDczLCBOQ1AwM1dCNDczLCBhbmQgTkNQMTVXTDMzMy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbnRjLXRoZXJtaXN0b3IuCisKK2NvbmZpZyBTRU5TT1JTX05DVDY3NzUKKwl0cmlzdGF0ZSAiTnV2b3RvbiBOQ1Q2Nzc1RiBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiAhUFBDCisJc2VsZWN0IEhXTU9OX1ZJRAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZworCSAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgTnV2b3RvbiBOQ1Q2Nzc1RiwgTkNUNjc3NkYsIE5DVDY3NzlECisJICBhbmQgY29tcGF0aWJsZSBTdXBlci1JL08gY2hpcHMuIFRoaXMgZHJpdmVyIHJlcGxhY2VzIHRoZQorCSAgdzgzNjI3ZWhmIGRyaXZlciBmb3IgTkNUNjc3NUYgYW5kIE5DVDY3NzZGLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuY3Q2Nzc1LgorCiBjb25maWcgU0VOU09SU19QQ0Y4NTkxCiAJdHJpc3RhdGUgIlBoaWxpcHMgUENGODU5MSBBREMvREFDIgogCWRlcGVuZHMgb24gSTJDCkBAIC0xMDc0LDIxICsxMTQ5LDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNpczU1OTUuCiAKLWNvbmZpZyBTRU5TT1JTX1NNTTY2NQotCXRyaXN0YXRlICJTdW1taXQgTWljcm9lbGVjdHJvbmljcyBTTU02NjUiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGZlYXR1cmVzIG9mIHRoZSBTdW1taXQgTWljcm9lbGVjdHJvbmljcyBTTU02NjUvU01NNjY1QiBTaXgtQ2hhbm5lbAotCSAgQWN0aXZlIERDIE91dHB1dCBDb250cm9sbGVyIC8gTW9uaXRvci4KLQotCSAgT3RoZXIgc3VwcG9ydGVkIGNoaXBzIGFyZSBTTU00NjUsIFNNTTY2NUMsIFNNTTc2NCwgYW5kIFNNTTc2Ni4KLQkgIFN1cHBvcnQgZm9yIHRob3NlIGNoaXBzIGlzIHVudGVzdGVkLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIHNtbTY2NS4KLQogY29uZmlnIFNFTlNPUlNfRE1FMTczNwogCXRyaXN0YXRlICJTTVNDIERNRTE3MzcsIFNDSDMxMXggYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDICYmICFQUEMKQEAgLTEyMTAsNiArMTI3MCwzMSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2NoNTYzNi4KIAorY29uZmlnIFNFTlNPUlNfU01NNjY1CisJdHJpc3RhdGUgIlN1bW1pdCBNaWNyb2VsZWN0cm9uaWNzIFNNTTY2NSIKKwlkZXBlbmRzIG9uIEkyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZworCSAgZmVhdHVyZXMgb2YgdGhlIFN1bW1pdCBNaWNyb2VsZWN0cm9uaWNzIFNNTTY2NS9TTU02NjVCIFNpeC1DaGFubmVsCisJICBBY3RpdmUgREMgT3V0cHV0IENvbnRyb2xsZXIgLyBNb25pdG9yLgorCisJICBPdGhlciBzdXBwb3J0ZWQgY2hpcHMgYXJlIFNNTTQ2NSwgU01NNjY1QywgU01NNzY0LCBhbmQgU01NNzY2LgorCSAgU3VwcG9ydCBmb3IgdGhvc2UgY2hpcHMgaXMgdW50ZXN0ZWQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgc21tNjY1LgorCitjb25maWcgU0VOU09SU19BREMxMjhEODE4CisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEFEQzEyOEQ4MTgiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzCisJICBBREMxMjhEODE4IFN5c3RlbSBNb25pdG9yIHdpdGggVGVtcGVyYXR1cmUgU2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRjMTI4ZDgxOC4KKwogY29uZmlnIFNFTlNPUlNfQURTMTAxNQogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBRFMxMDE1IgogCWRlcGVuZHMgb24gSTJDCkBAIC0xNTI1LDM3ICsxNjEwLDYgQEAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBVbHRyYTQ1IHdvcmtzdGF0aW9uIGVudmlyb25tZW50YWwKIAkgIHNlbnNvcnMuCiAKLWNvbmZpZyBTRU5TT1JTX0FQUExFU01DCi0JdHJpc3RhdGUgIkFwcGxlIFNNQyAoTW90aW9uIHNlbnNvciwgbGlnaHQgc2Vuc29yLCBrZXlib2FyZCBiYWNrbGlnaHQpIgotCWRlcGVuZHMgb24gSU5QVVQgJiYgWDg2Ci0Jc2VsZWN0IE5FV19MRURTCi0Jc2VsZWN0IExFRFNfQ0xBU1MKLQlzZWxlY3QgSU5QVVRfUE9MTERFVgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBBcHBsZSBTeXN0ZW0gTWFuYWdlbWVudAotCSAgQ29udHJvbGxlciwgd2hpY2ggcHJvdmlkZXMgYW4gYWNjZWxlcm9tZXRlciAoQXBwbGUgU3VkZGVuIE1vdGlvbgotCSAgU2Vuc29yKSwgbGlnaHQgc2Vuc29ycywgdGVtcGVyYXR1cmUgc2Vuc29ycywga2V5Ym9hcmQgYmFja2xpZ2h0Ci0JICBjb250cm9sIGFuZCBmYW4gY29udHJvbC4KLQotCSAgT25seSBJbnRlbC1iYXNlZCBBcHBsZSdzIGNvbXB1dGVycyBhcmUgc3VwcG9ydGVkIChNYWNCb29rIFBybywKLQkgIE1hY0Jvb2ssIE1hY01pbmkpLgotCi0JICBEYXRhIGZyb20gdGhlIGRpZmZlcmVudCBzZW5zb3JzLCBrZXlib2FyZCBiYWNrbGlnaHQgY29udHJvbCBhbmQgZmFuCi0JICBjb250cm9sIGFyZSBhY2Nlc3NpYmxlIHZpYSBzeXNmcy4KLQotCSAgVGhpcyBkcml2ZXIgYWxzbyBwcm92aWRlcyBhbiBhYnNvbHV0ZSBpbnB1dCBjbGFzcyBkZXZpY2UsIGFsbG93aW5nCi0JICB0aGUgbGFwdG9wIHRvIGFjdCBhcyBhIHBpbmJhbGwgbWFjaGluZS1lc3F1ZSBqb3lzdGljay4KLQotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBhcHBsaWNhYmxlIGxhcHRvcCBhbmQgd2FudCB0byBleHBlcmllbmNlCi0JICB0aGUgYXdlc29tZSBwb3dlciBvZiBhcHBsZXNtYy4KLQotY29uZmlnIFNFTlNPUlNfTUMxMzc4M19BREMKLSAgICAgICAgdHJpc3RhdGUgIkZyZWVzY2FsZSBNQzEzNzgzL01DMTM4OTIgQURDIgotICAgICAgICBkZXBlbmRzIG9uIE1GRF9NQzEzWFhYCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBTdXBwb3J0IGZvciB0aGUgQS9EIGNvbnZlcnRlciBvbiBNQzEzNzgzIGFuZCBNQzEzODkyIFBNSUMuCi0KIGlmIEFDUEkKIAogY29tbWVudCAiQUNQSSBkcml2ZXJzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggZWM3Y2RlMC4uMTk5YzQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0yNSw2ICsyNSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19BRDczMTQpCSs9IGFkNzMxNC5vCiBvYmotJChDT05GSUdfU0VOU09SU19BRDc0MTQpCSs9IGFkNzQxNC5vCiBvYmotJChDT05GSUdfU0VOU09SU19BRDc0MTgpCSs9IGFkNzQxOC5vCitvYmotJChDT05GSUdfU0VOU09SU19BREMxMjhEODE4KSArPSBhZGMxMjhkODE4Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FEQ1hYKQkrPSBhZGN4eC5vCiBvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDIxKQkrPSBhZG0xMDIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjUpCSs9IGFkbTEwMjUubwpAQCAtNzAsNiArNzEsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfSTVLX0FNQikJKz0gaTVrX2FtYi5vCiBvYmotJChDT05GSUdfU0VOU09SU19JQk1BRU0pCSs9IGlibWFlbS5vCiBvYmotJChDT05GSUdfU0VOU09SU19JQk1QRVgpCSs9IGlibXBleC5vCitvYmotJChDT05GSUdfU0VOU09SU19JQk1QT1dFUk5WKSs9IGlibXBvd2VybnYubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfSUlPX0hXTU9OKSArPSBpaW9faHdtb24ubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfSU5BMjA5KQkrPSBpbmEyMDkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfSU5BMlhYKQkrPSBpbmEyeHgubwpAQCAtOTUsOSArOTcsMTIgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTUyMzQpCSs9IGxtOTUyMzQubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05NTI0MSkJKz0gbG05NTI0MS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTk1MjQ1KQkrPSBsbTk1MjQ1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xUQzI5NDUpCSs9IGx0YzI5NDUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDE1MSkJKz0gbHRjNDE1MS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MjE1KQkrPSBsdGM0MjE1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xUQzQyMjIpCSs9IGx0YzQyMjIubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDI0NSkJKz0gbHRjNDI0NS5vCitvYmotJChDT05GSUdfU0VOU09SU19MVEM0MjYwKQkrPSBsdGM0MjYwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xUQzQyNjEpCSs9IGx0YzQyNjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTExMSkJKz0gbWF4MTExMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjA2NSkJKz0gbWF4MTYwNjUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZGMxMjhkODE4LmMgYi9kcml2ZXJzL2h3bW9uL2FkYzEyOGQ4MTguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZkODFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9hZGMxMjhkODE4LmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIFRJIEFEQzEyOEQ4MTggU3lzdGVtIE1vbml0b3Igd2l0aCBUZW1wZXJhdHVyZSBTZW5zb3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR3VlbnRlciBSb2VjaworICoKKyAqIERlcml2ZWQgZnJvbSBsbTgwLmMKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgorICoJCQkgICAgIGFuZCBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbgorICogVGhlIGNoaXAgYWxzbyBzdXBwb3J0cyBhZGRyZXNzZXMgMHgzNS4uMHgzNy4gRG9uJ3Qgc2NhbiB0aG9zZSBhZGRyZXNzZXMKKyAqIHNpbmNlIHRoZXkgYXJlIGFsc28gdXNlZCBieSBzb21lIEVFUFJPTXMsIHdoaWNoIG1heSByZXN1bHQgaW4gZmFsc2UKKyAqIHBvc2l0aXZlcy4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKKwkweDFkLCAweDFlLCAweDFmLCAweDJkLCAweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQURDMTI4X1JFR19JTl9NQVgobnIpCQkoMHgyYSArIChucikgKiAyKQorI2RlZmluZSBBREMxMjhfUkVHX0lOX01JTihucikJCSgweDJiICsgKG5yKSAqIDIpCisjZGVmaW5lIEFEQzEyOF9SRUdfSU4obnIpCQkoMHgyMCArIChucikpCisKKyNkZWZpbmUgQURDMTI4X1JFR19URU1QCQkJMHgyNworI2RlZmluZSBBREMxMjhfUkVHX1RFTVBfTUFYCQkweDM4CisjZGVmaW5lIEFEQzEyOF9SRUdfVEVNUF9IWVNUCQkweDM5CisKKyNkZWZpbmUgQURDMTI4X1JFR19DT05GSUcJCTB4MDAKKyNkZWZpbmUgQURDMTI4X1JFR19BTEFSTQkJMHgwMQorI2RlZmluZSBBREMxMjhfUkVHX01BU0sJCQkweDAzCisjZGVmaW5lIEFEQzEyOF9SRUdfQ09OVl9SQVRFCQkweDA3CisjZGVmaW5lIEFEQzEyOF9SRUdfT05FU0hPVAkJMHgwOQorI2RlZmluZSBBREMxMjhfUkVHX1NIVVRET1dOCQkweDBhCisjZGVmaW5lIEFEQzEyOF9SRUdfQ09ORklHX0FEVgkJMHgwYgorI2RlZmluZSBBREMxMjhfUkVHX0JVU1lfU1RBVFVTCQkweDBjCisKKyNkZWZpbmUgQURDMTI4X1JFR19NQU5fSUQJCTB4M2UKKyNkZWZpbmUgQURDMTI4X1JFR19ERVZfSUQJCTB4M2YKKworc3RydWN0IGFkYzEyOF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKKwlpbnQgdnJlZjsJCS8qIFJlZmVyZW5jZSB2b2x0YWdlIGluIG1WICovCisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCWJvb2wgdmFsaWQ7CQkvKiB0cnVlIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXUxNiBpblszXVs3XTsJCS8qIFJlZ2lzdGVyIHZhbHVlLCBub3JtYWxpemVkIHRvIDEyIGJpdAorCQkJCSAqIDA6IGlucHV0IHZvbHRhZ2UKKwkJCQkgKiAxOiBtaW4gbGltaXQKKwkJCQkgKiAyOiBtYXggbGltaXQKKwkJCQkgKi8KKwlzMTYgdGVtcFszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlLCBub3JtYWxpemVkIHRvIDkgYml0CisJCQkJICogMDogc2Vuc29yIDE6IGxpbWl0IDI6IGh5c3QKKwkJCQkgKi8KKwl1OCBhbGFybXM7CQkvKiBhbGFybSByZWdpc3RlciB2YWx1ZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBhZGMxMjhfZGF0YSAqYWRjMTI4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhZGMxMjhfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJc3RydWN0IGFkYzEyOF9kYXRhICpyZXQgPSBkYXRhOworCWludCBpLCBydjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJcnYgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCQkJCSBBREMxMjhfUkVHX0lOKGkpKTsKKwkJCWlmIChydiA8IDApCisJCQkJZ290byBhYm9ydDsKKwkJCWRhdGEtPmluWzBdW2ldID0gcnYgPj4gNDsKKworCQkJcnYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICAgICAgQURDMTI4X1JFR19JTl9NSU4oaSkpOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIGFib3J0OworCQkJZGF0YS0+aW5bMV1baV0gPSBydiA8PCA0OworCisJCQlydiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgICAgICBBREMxMjhfUkVHX0lOX01BWChpKSk7CisJCQlpZiAocnYgPCAwKQorCQkJCWdvdG8gYWJvcnQ7CisJCQlkYXRhLT5pblsyXVtpXSA9IHJ2IDw8IDQ7CisJCX0KKworCQlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIEFEQzEyOF9SRUdfVEVNUCk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGFib3J0OworCQlkYXRhLT50ZW1wWzBdID0gcnYgPj4gNzsKKworCQlydiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfVEVNUF9NQVgpOworCQlpZiAocnYgPCAwKQorCQkJZ290byBhYm9ydDsKKwkJZGF0YS0+dGVtcFsxXSA9IHJ2IDw8IDE7CisKKwkJcnYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX1RFTVBfSFlTVCk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGFib3J0OworCQlkYXRhLT50ZW1wWzJdID0gcnYgPDwgMTsKKworCQlydiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQUxBUk0pOworCQlpZiAocnYgPCAwKQorCQkJZ290byBhYm9ydDsKKwkJZGF0YS0+YWxhcm1zIHw9IHJ2OworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gdHJ1ZTsKKwl9CisJZ290byBkb25lOworCithYm9ydDoKKwlyZXQgPSBFUlJfUFRSKHJ2KTsKKwlkYXRhLT52YWxpZCA9IGZhbHNlOworZG9uZToKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGMxMjhfc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZGMxMjhfZGF0YSAqZGF0YSA9IGFkYzEyOF91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpLT5ucjsKKwlpbnQgdmFsOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVChkYXRhLT5pbltpbmRleF1bbnJdICogZGF0YS0+dnJlZiwgNDA5NSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zZXRfaW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpLT5ucjsKKwl1OCByZWcsIHJlZ3ZhbDsKKwlsb25nIHZhbDsKKwlpbnQgZXJyOworCisJZXJyID0ga3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkvKiAxMCBtViBMU0Igb24gbGltaXQgcmVnaXN0ZXJzICovCisJcmVndmFsID0gY2xhbXBfdmFsKERJVl9ST1VORF9DTE9TRVNUKHZhbCwgMTApLCAwLCAyNTUpOworCWRhdGEtPmluW2luZGV4XVtucl0gPSByZWd2YWwgPDwgNDsKKwlyZWcgPSBpbmRleCA9PSAxID8gQURDMTI4X1JFR19JTl9NSU4obnIpIDogQURDMTI4X1JFR19JTl9NQVgobnIpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCByZWcsIHJlZ3ZhbCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkYzEyOF9zaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gYWRjMTI4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCWludCB0ZW1wOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwl0ZW1wID0gKGRhdGEtPnRlbXBbaW5kZXhdIDw8IDcpID4+IDc7CS8qIHNpZ24gZXh0ZW5kICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXAgKiA1MDApOy8qIDAuNSBkZWdyZWVzIEMgcmVzb2x1dGlvbiAqLworfQorCitzdGF0aWMgc3NpemVfdCBhZGMxMjhfc2V0X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZGMxMjhfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJbG9uZyB2YWw7CisJaW50IGVycjsKKwlzOCByZWd2YWw7CisKKwllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJlZ3ZhbCA9IGNsYW1wX3ZhbChESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIDEwMDApLCAtMTI4LCAxMjcpOworCWRhdGEtPnRlbXBbaW5kZXhdID0gcmVndmFsIDw8IDE7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJICBpbmRleCA9PSAxID8gQURDMTI4X1JFR19URU1QX01BWAorCQkJCQkgICAgIDogQURDMTI4X1JFR19URU1QX0hZU1QsCisJCQkJICByZWd2YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBhZGMxMjhfc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhID0gYWRjMTI4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbWFzayA9IDEgPDwgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwl1OCBhbGFybXM7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCS8qCisJICogQ2xlYXIgYW4gYWxhcm0gYWZ0ZXIgcmVwb3J0aW5nIGl0IHRvIHVzZXIgc3BhY2UuIElmIGl0IGlzIHN0aWxsCisJICogYWN0aXZlLCB0aGUgbmV4dCB1cGRhdGUgc2VxdWVuY2Ugd2lsbCBzZXQgdGhlIGFsYXJtIGJpdCBhZ2Fpbi4KKwkgKi8KKwlhbGFybXMgPSBkYXRhLT5hbGFybXM7CisJZGF0YS0+YWxhcm1zICY9IH5tYXNrOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsICEhKGFsYXJtcyAmIG1hc2spKTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMF9pbnB1dCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDAsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAwLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjBfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMCwgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfaW5wdXQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAxLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMSwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4xX21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDEsIDIpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDIsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAyLCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19pbnB1dCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDMsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCAzLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgMywgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjRfaW5wdXQsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA0LCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjRfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW40X21heCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDQsIDIpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW41X2lucHV0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNSwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW41X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDUsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA1LCAyKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNl9pbnB1dCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgICAgYWRjMTI4X3Nob3dfaW4sIGFkYzEyOF9zZXRfaW4sIDYsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICAgIGFkYzEyOF9zaG93X2luLCBhZGMxMjhfc2V0X2luLCA2LCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjZfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCSAgICBhZGMxMjhfc2hvd19pbiwgYWRjMTI4X3NldF9pbiwgNiwgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIGFkYzEyOF9zaG93X3RlbXAsIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJICBhZGMxMjhfc2hvd190ZW1wLCBhZGMxMjhfc2V0X3RlbXAsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIGFkYzEyOF9zaG93X3RlbXAsIGFkYzEyOF9zZXRfdGVtcCwgMik7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgYWRjMTI4X3Nob3dfYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNF9hbGFybSwgU19JUlVHTywgYWRjMTI4X3Nob3dfYWxhcm0sIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfYWxhcm0sIFNfSVJVR08sIGFkYzEyOF9zaG93X2FsYXJtLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2FsYXJtLCBTX0lSVUdPLCBhZGMxMjhfc2hvd19hbGFybSwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwgU19JUlVHTywgYWRjMTI4X3Nob3dfYWxhcm0sIE5VTEwsIDcpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRjMTI4X2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CitBVFRSSUJVVEVfR1JPVVBTKGFkYzEyOCk7CisKK3N0YXRpYyBpbnQgYWRjMTI4X2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCit7CisJaW50IG1hbl9pZCwgZGV2X2lkOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX01BTl9JRCk7CisJZGV2X2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19ERVZfSUQpOworCWlmIChtYW5faWQgIT0gMHgwMSB8fCBkZXZfaWQgIT0gMHgwOSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGVjayB1bnVzZWQgYml0cyBmb3IgY29uZmlybWF0aW9uICovCisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQ09ORklHKSAmIDB4ZjQpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX0NPTlZfUkFURSkgJiAweGZlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19PTkVTSE9UKSAmIDB4ZmUpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX1NIVVRET1dOKSAmIDB4ZmUpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX0NPTkZJR19BRFYpICYgMHhmOCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEQzEyOF9SRUdfQlVTWV9TVEFUVVMpICYgMHhmYykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzdHJsY3B5KGluZm8tPnR5cGUsICJhZGMxMjhkODE4IiwgSTJDX05BTUVfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGMxMjhfaW5pdF9jbGllbnQoc3RydWN0IGFkYzEyOF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IGVycjsKKworCS8qCisJICogUmVzZXQgY2hpcCB0byBkZWZhdWx0cy4KKwkgKiBUaGlzIG1ha2VzIG1vc3Qgb3RoZXIgaW5pdGlhbGl6YXRpb25zIHVubmVjZXNzYXJ5LgorCSAqLworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBREMxMjhfUkVHX0NPTkZJRywgMHg4MCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURDMTI4X1JFR19DT05GSUcsIDB4MDEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBJZiBleHRlcm5hbCB2cmVmIGlzIHNlbGVjdGVkLCBjb25maWd1cmUgdGhlIGNoaXAgdG8gdXNlIGl0ICovCisJaWYgKGRhdGEtPnJlZ3VsYXRvcikgeworCQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCUFEQzEyOF9SRUdfQ09ORklHX0FEViwgMHgwMSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYzEyOF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3I7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBhZGMxMjhfZGF0YSAqZGF0YTsKKwlpbnQgZXJyLCB2cmVmOworCisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgYWRjMTI4X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdnJlZiBpcyBvcHRpb25hbC4gSWYgc3BlY2lmaWVkLCBpcyB1c2VkIGFzIGNoaXAgcmVmZXJlbmNlIHZvbHRhZ2UgKi8KKwlyZWd1bGF0b3IgPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoZGV2LCAidnJlZiIpOworCWlmICghSVNfRVJSKHJlZ3VsYXRvcikpIHsKKwkJZGF0YS0+cmVndWxhdG9yID0gcmVndWxhdG9yOworCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHJlZ3VsYXRvcik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJdnJlZiA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZWd1bGF0b3IpOworCQlpZiAodnJlZiA8IDApIHsKKwkJCWVyciA9IHZyZWY7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRhdGEtPnZyZWYgPSBESVZfUk9VTkRfQ0xPU0VTVCh2cmVmLCAxMDAwKTsKKwl9IGVsc2UgeworCQlkYXRhLT52cmVmID0gMjU2MDsJLyogMi41NlYsIGluIG1WICovCisJfQorCisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoaXAgKi8KKwllcnIgPSBhZGMxMjhfaW5pdF9jbGllbnQoZGF0YSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLCBhZGMxMjhfZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihod21vbl9kZXYpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoZGF0YS0+cmVndWxhdG9yKQorCQlyZWd1bGF0b3JfZGlzYWJsZShkYXRhLT5yZWd1bGF0b3IpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTI4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZGMxMjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKGRhdGEtPnJlZ3VsYXRvcikKKwkJcmVndWxhdG9yX2Rpc2FibGUoZGF0YS0+cmVndWxhdG9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWRjMTI4X2lkW10gPSB7CisJeyAiYWRjMTI4ZDgxOCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRjMTI4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkYzEyOF9kcml2ZXIgPSB7CisJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZGMxMjhkODE4IiwKKwl9LAorCS5wcm9iZQkJPSBhZGMxMjhfcHJvYmUsCisJLnJlbW92ZQkJPSBhZGMxMjhfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGFkYzEyOF9pZCwKKwkuZGV0ZWN0CQk9IGFkYzEyOF9kZXRlY3QsCisJLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihhZGMxMjhfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3VlbnRlciBSb2VjayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEFEQzEyOEQ4MTgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwppbmRleCBiYmIwYjBkLi5mMzFiYzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCkBAIC05NCw2ICs5NCw4IEBACiAJYm9vbCB2YWxpZDsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RfYXR0cnNbVE9UQUxfQVRUUlNdOwogCWNoYXIgYXR0cl9uYW1lW1RPVEFMX0FUVFJTXVtDT1JFVEVNUF9OQU1FX0xFTkdUSF07CisJc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnNbVE9UQUxfQVRUUlMgKyAxXTsKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0dHJfZ3JvdXA7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogfTsKIApAQCAtMTE0LDEyICsxMTYsNiBAQAogc3RhdGljIExJU1RfSEVBRChwZGV2X2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChwZGV2X2xpc3RfbXV0ZXgpOwogCi1zdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgRFJWTkFNRSk7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IHNob3dfbGFiZWwoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCiB7CkBAIC0zOTMsMjAgKzM4OSwxMCBAQAogCXJldHVybiBhZGp1c3RfdGptYXgoYywgaWQsIGRldik7CiB9CiAKLXN0YXRpYyBpbnQgY3JlYXRlX25hbWVfYXR0cihzdHJ1Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGEsCi0JCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2KQotewotCXN5c2ZzX2F0dHJfaW5pdCgmcGRhdGEtPm5hbWVfYXR0ci5hdHRyKTsKLQlwZGF0YS0+bmFtZV9hdHRyLmF0dHIubmFtZSA9ICJuYW1lIjsKLQlwZGF0YS0+bmFtZV9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JcGRhdGEtPm5hbWVfYXR0ci5zaG93ID0gc2hvd19uYW1lOwotCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmcGRhdGEtPm5hbWVfYXR0cik7Ci19Ci0KIHN0YXRpYyBpbnQgY3JlYXRlX2NvcmVfYXR0cnMoc3RydWN0IHRlbXBfZGF0YSAqdGRhdGEsIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgaW50IGF0dHJfbm8pCiB7Ci0JaW50IGVyciwgaTsKKwlpbnQgaTsKIAlzdGF0aWMgc3NpemVfdCAoKmNvbnN0IHJkX3B0cltUT1RBTF9BVFRSU10pIChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKSA9IHsKIAkJCXNob3dfbGFiZWwsIHNob3dfY3JpdF9hbGFybSwgc2hvd190ZW1wLCBzaG93X3RqbWF4LApAQCAtNDI0LDE2ICs0MTAsMTAgQEAKIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5zaG93ID0gcmRfcHRyW2ldOwogCQl0ZGF0YS0+c2RfYXR0cnNbaV0uaW5kZXggPSBhdHRyX25vOwotCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXhpdF9mcmVlOworCQl0ZGF0YS0+YXR0cnNbaV0gPSAmdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLmF0dHI7CiAJfQotCXJldHVybiAwOwotCi1leGl0X2ZyZWU6Ci0Jd2hpbGUgKC0taSA+PSAwKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyKTsKLQlyZXR1cm4gZXJyOworCXRkYXRhLT5hdHRyX2dyb3VwLmF0dHJzID0gdGRhdGEtPmF0dHJzOworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJnRkYXRhLT5hdHRyX2dyb3VwKTsKIH0KIAogCkBAIC01NDgsNyArNTI4LDcgQEAKIAlwZGF0YS0+Y29yZV9kYXRhW2F0dHJfbm9dID0gdGRhdGE7CiAKIAkvKiBDcmVhdGUgc3lzZnMgaW50ZXJmYWNlcyAqLwotCWVyciA9IGNyZWF0ZV9jb3JlX2F0dHJzKHRkYXRhLCAmcGRldi0+ZGV2LCBhdHRyX25vKTsKKwllcnIgPSBjcmVhdGVfY29yZV9hdHRycyh0ZGF0YSwgcGRhdGEtPmh3bW9uX2RldiwgYXR0cl9ubyk7CiAJaWYgKGVycikKIAkJZ290byBleGl0X2ZyZWU7CiAKQEAgLTU3MywxNCArNTUzLDEyIEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvcmV0ZW1wX3JlbW92ZV9jb3JlKHN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YSwKLQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmR4KQorCQkJCSBpbnQgaW5keCkKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSA9IHBkYXRhLT5jb3JlX2RhdGFbaW5keF07CiAKIAkvKiBSZW1vdmUgdGhlIHN5c2ZzIGF0dHJpYnV0ZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdGRhdGEtPmF0dHJfc2l6ZTsgaSsrKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkYXRhLT5od21vbl9kZXYtPmtvYmosICZ0ZGF0YS0+YXR0cl9ncm91cCk7CiAKIAlrZnJlZShwZGF0YS0+Y29yZV9kYXRhW2luZHhdKTsKIAlwZGF0YS0+Y29yZV9kYXRhW2luZHhdID0gTlVMTDsKQEAgLTU4OCwzNCArNTY2LDIwIEBACiAKIHN0YXRpYyBpbnQgY29yZXRlbXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlpbnQgZXJyOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcGVyLXBhY2thZ2UgZGF0YSBzdHJ1Y3R1cmVzICovCi0JcGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOworCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBwbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnIgPSBjcmVhdGVfbmFtZV9hdHRyKHBkYXRhLCAmcGRldi0+ZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4aXRfZnJlZTsKLQogCXBkYXRhLT5waHlzX3Byb2NfaWQgPSBwZGV2LT5pZDsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CiAKLQlwZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwotCWlmIChJU19FUlIocGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihwZGF0YS0+aHdtb25fZGV2KTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2xhc3MgcmVnaXN0cmF0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGV4aXRfbmFtZTsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWV4aXRfbmFtZToKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJnBkYXRhLT5uYW1lX2F0dHIpOwotZXhpdF9mcmVlOgotCWtmcmVlKHBkYXRhKTsKLQlyZXR1cm4gZXJyOworCXBkYXRhLT5od21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIERSVk5BTUUsCisJCQkJCQkJCSAgcGRhdGEsIE5VTEwpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGRhdGEtPmh3bW9uX2Rldik7CiB9CiAKIHN0YXRpYyBpbnQgY29yZXRlbXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC02MjUsMTEgKzU4OSw4IEBACiAKIAlmb3IgKGkgPSBNQVhfQ09SRV9EQVRBIC0gMTsgaSA+PSAwOyAtLWkpCiAJCWlmIChwZGF0YS0+Y29yZV9kYXRhW2ldKQotCQkJY29yZXRlbXBfcmVtb3ZlX2NvcmUocGRhdGEsICZwZGV2LT5kZXYsIGkpOworCQkJY29yZXRlbXBfcmVtb3ZlX2NvcmUocGRhdGEsIGkpOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZwZGF0YS0+bmFtZV9hdHRyKTsKLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+aHdtb25fZGV2KTsKLQlrZnJlZShwZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc3Nyw3ICs3MzgsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAocGRhdGEtPmNvcmVfZGF0YVtpbmR4XSAmJiBwZGF0YS0+Y29yZV9kYXRhW2luZHhdLT5jcHUgPT0gY3B1KQotCQljb3JldGVtcF9yZW1vdmVfY29yZShwZGF0YSwgJnBkZXYtPmRldiwgaW5keCk7CisJCWNvcmV0ZW1wX3JlbW92ZV9jb3JlKHBkYXRhLCBpbmR4KTsKIAogCS8qCiAJICogSWYgYSBIVCBzaWJsaW5nIG9mIGEgY29yZSBpcyB0YWtlbiBvZmZsaW5lLCBidXQgYW5vdGhlciBIVCBzaWJsaW5nCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2VtYzIxMDMuYyBiL2RyaXZlcnMvaHdtb24vZW1jMjEwMy5jCmluZGV4IDJjMTM3YjIuLmZkODkyZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZW1jMjEwMy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZW1jMjEwMy5jCkBAIC0zNDksNyArMzQ5LDcgQEAKIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJyZWcgMHglMDJ4LCBlcnIgJWRcbiIsCiAJCQlSRUdfRkFOX0NPTkYxLCBzdGF0dXMpOwogCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiBzdGF0dXM7CiAJfQogCXN0YXR1cyAmPSAweDlGOwogCXN0YXR1cyB8PSAobmV3X3JhbmdlX2JpdHMgPDwgNSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKaW5kZXggZTE3NmE0My4uYTI2YzM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNkZWZpbmUgSFdNT05fSURfUFJFRklYICJod21vbiIKICNkZWZpbmUgSFdNT05fSURfRk9STUFUIEhXTU9OX0lEX1BSRUZJWCAiJWQiCkBAIC05OSw2ICsxMDAsMTAgQEAKIAlzdHJ1Y3QgaHdtb25fZGV2aWNlICpod2RldjsKIAlpbnQgZXJyLCBpZDsKIAorCS8qIERvIG5vdCBhY2NlcHQgaW52YWxpZCBjaGFyYWN0ZXJzIGluIGh3bW9uIG5hbWUgYXR0cmlidXRlICovCisJaWYgKG5hbWUgJiYgKCFzdHJsZW4obmFtZSkgfHwgc3RycGJyayhuYW1lLCAiLSogXHRcbiIpKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKIAlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZod21vbl9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOwogCWlmIChpZCA8IDApCiAJCXJldHVybiBFUlJfUFRSKGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcG93ZXJudi5jIGIvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiMTI5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vaWJtcG93ZXJudi5jCkBAIC0wLDAgKzEsNTI5IEBACisvKgorICogaHdtb24gZHJpdmVyIGZvciB0ZW1wZXJhdHVyZS9wb3dlci9mYW4gb24gSUJNIFBvd2VyTlYgcGxhdGZvcm0KKyAqIENvcHlyaWdodCAoQykgMjAxMyBJQk0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJQk0gUG93ZXJOViBQbGF0Zm9ybSBwb3dlci90ZW1wL2ZhbiBzZW5zb3IgaHdtb24gbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgTUFYX0FUVFJfTEVOR1RICQkzMgorCisvKiBEZXZpY2UgdHJlZSBzZW5zb3IgbmFtZSBwcmVmaXhlcy4gVGhlIGRldmljZSB0cmVlIGhhcyB0aGUgbmFtZXMgaW4gdGhlCisgKiBmb3JtYXQgImNvb2xpbmctZmFuIzItZmF1bHRlZCIgd2hlcmUgdGhlICJjb29saW5nLWZhbiIgaXMgdGhlIHNlbnNvciB0eXBlLAorICogMiBpcyB0aGUgc2Vuc29yIGNvdW50LCBhbmQgImZhdWx0ZWQiIGlzIHRoZSBzZW5zb3IgZGF0YSBhdHRyaWJ1dGUgdHlwZS4KKyAqLworI2RlZmluZSBEVF9GQVVMVF9BVFRSX1NVRkZJWAkJImZhdWx0ZWQiCisjZGVmaW5lIERUX0RBVEFfQVRUUl9TVUZGSVgJCSJkYXRhIgorI2RlZmluZSBEVF9USFJFU0hPTERfQVRUUl9TVUZGSVgJInRocnMiCisKK2VudW0gc2Vuc29ycyB7CisJRkFOLAorCVRFTVBFUkFUVVJFLAorCVBPV0VSU1VQUExZLAorCVBPV0VSLAorCU1BWF9TRU5TT1JfVFlQRSwKK307CisKK2VudW0gYXR0cmlidXRlcyB7CisJSU5QVVQsCisJTUlOSU1VTSwKKwlNQVhJTVVNLAorCUZBVUxULAorCU1BWF9BVFRSX1RZUEVTCit9OworCitzdGF0aWMgc3RydWN0IHNlbnNvcl9uYW1lIHsKKwljaGFyICpuYW1lOworCWNoYXIgKmNvbXBhaWJsZTsKK30gc2Vuc29yX25hbWVzW10gPSB7CisJCXsiZmFuLXNlbnNvciIsICJpYm0sb3BhbC1zZW5zb3ItY29vbGluZy1mYW4ifSwKKwkJeyJhbWItdGVtcC1zZW5zb3IiLCAiaWJtLG9wYWwtc2Vuc29yLWFtYi10ZW1wIn0sCisJCXsicG93ZXItc2Vuc29yIiwgImlibSxvcGFsLXNlbnNvci1wb3dlci1zdXBwbHkifSwKKwkJeyJwb3dlciIsICJpYm0sb3BhbC1zZW5zb3ItcG93ZXIifQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdHRyaWJ1dGVfdHlwZV90YWJsZVtdID0geworCSJpbnB1dCIsCisJIm1pbiIsCisJIm1heCIsCisJImZhdWx0IiwKKwlOVUxMCit9OworCitzdHJ1Y3QgcGRldl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJZW51bSBzZW5zb3JzIHR5cGU7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKHBkZXZfbGlzdCk7CisKKy8qIFRoZSBzZW5zb3JzIGFyZSBjYXRlZ29yaXNlZCBvbiB0eXBlLgorICoKKyAqIFRoZSBzZW5zb3JzIG9mIHNhbWUgdHlwZSBhcmUgY2F0ZWdvcmlzZWQgdW5kZXIgYSBjb21tb24gcGxhdGZvcm0gZGV2aWNlLgorICogU28sIFRoZSBwZGV2IGlzIHNoYXJlZCBieSBhbGwgc2Vuc29ycyBvZiBzYW1lIHR5cGUuCisgKiBFeCA6IHRlbXAxX2lucHV0LCB0ZW1wMV9tYXgsIHRlbXAyX2lucHV0LHRlbXAyX21heCBhbGwgc2hhcmUgc2FtZSBwbGF0Zm9ybQorICogZGV2aWNlLgorICoKKyAqICJzZW5zb3JfZGF0YSIgaXMgdGhlIFBsYXRmb3JtIGRldmljZSBzcGVjaWZpYyBkYXRhLgorICogVGhlcmUgaXMgb25lIGh3bW9uX2RldmljZSBpbnN0YW5jZSBmb3IgYWxsIHRoZSBzZW5zb3JzIG9mIHNhbWUgdHlwZS4KKyAqIFRoaXMgYWxzbyBob2xkcyB0aGUgbGlzdCBvZiBhbGwgc2Vuc29ycyB3aXRoIHNhbWUgdHlwZSBidXQgZGlmZmVyZW50CisgKiBhdHRyaWJ1dGUgYW5kIGluZGV4LgorICovCitzdHJ1Y3Qgc2Vuc29yX3NwZWNpZmljX2RhdGEgeworCXUzMiBzZW5zb3JfaWQ7IC8qIFRoZSBoZXggdmFsdWUgYXMgaW4gdGhlIGRldmljZSB0cmVlICovCisJdTMyIHNlbnNvcl9pbmRleDsgLyogVGhlIHNlbnNvciBpbnN0YW5jZSBpbmRleCAqLworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZF9hdHRyOworCWVudW0gYXR0cmlidXRlcyBhdHRyX3R5cGU7CisJY2hhciBhdHRyX25hbWVbNjRdOworfTsKKworc3RydWN0IHNlbnNvcl9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IGxpc3RfaGVhZCBzZW5zb3JfbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBuYW1lX2F0dHI7Cit9OworCitzdHJ1Y3QgIHNlbnNvcl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzZW5zb3Jfc3BlY2lmaWNfZGF0YSAqc2Vuc29yX2RhdGE7Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcG93ZXJudl9zZW5zb3JfZ2V0X3BkZXYoZW51bSBzZW5zb3JzIHR5cGUpCit7CisJc3RydWN0IHBkZXZfZW50cnkgKnA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmcGRldl9saXN0LCBsaXN0KQorCQlpZiAocC0+dHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIHAtPnBkZXY7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBzZW5zb3Jfc3BlY2lmaWNfZGF0YSAqcG93ZXJudl9zZW5zb3JfZ2V0X3NlbnNvcl9kYXRhKAorCQkJCQlzdHJ1Y3Qgc2Vuc29yX2RhdGEgKnBkYXRhLAorCQkJCQlpbnQgaW5kZXgsIGVudW0gYXR0cmlidXRlcyBhdHRyX3R5cGUpCit7CisJc3RydWN0IHNlbnNvcl9lbnRyeSAqcDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZwZGF0YS0+c2Vuc29yX2xpc3QsIGxpc3QpCisJCWlmICgocC0+c2Vuc29yX2RhdGEtPnNlbnNvcl9pbmRleCA9PSBpbmRleCkgJiYKKwkJICAgIChhdHRyX3R5cGUgPT0gcC0+c2Vuc29yX2RhdGEtPmF0dHJfdHlwZSkpCisJCQlyZXR1cm4gcC0+c2Vuc29yX2RhdGE7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBwZGV2LT5uYW1lKTsKK30KKworLyogTm90ZTogRGF0YSBmcm9tIHRoZSBzZW5zb3JzIGZvciBlYWNoIHNlbnNvciB0eXBlIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0bworICogdGhlIGRpbWVuc2lvbiBhcHByb3ByaWF0ZS4KKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19zZW5zb3Ioc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZF9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNlbnNvcl9zcGVjaWZpY19kYXRhICp0ZGF0YSA9IE5VTEw7CisJZW51bSBzZW5zb3JzIHNlbnNvcl90eXBlID0gcGRldi0+aWQ7CisJdTMyIHggPSAtMTsKKwlpbnQgcmV0OworCisJaWYgKHNkX2F0dHIgJiYgc2RfYXR0ci0+ZGV2X2F0dHIuYXR0ci5uYW1lKSB7CisJCWNoYXIgKnBvcyA9IHN0cmNocihzZF9hdHRyLT5kZXZfYXR0ci5hdHRyLm5hbWUsICdfJyk7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQVRUUl9UWVBFUzsgaSsrKSB7CisJCQlpZiAoc3RyY21wKHBvcysxLCBhdHRyaWJ1dGVfdHlwZV90YWJsZVtpXSkgPT0gMCkgeworCQkJCXRkYXRhID0gcG93ZXJudl9zZW5zb3JfZ2V0X3NlbnNvcl9kYXRhKHBkYXRhLAorCQkJCQkJc2RfYXR0ci0+aW5kZXgsIGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHRkYXRhKSB7CisJCXJldCA9IG9wYWxfZ2V0X3NlbnNvcl9kYXRhKHRkYXRhLT5zZW5zb3JfaWQsICZ4KTsKKwkJaWYgKHJldCkKKwkJCXggPSAtMTsKKwl9CisKKwlpZiAoc2Vuc29yX3R5cGUgPT0gVEVNUEVSQVRVUkUgJiYgeCA+IDApIHsKKwkJLyogVGVtcGVyYXR1cmUgY29tZXMgaW4gRGVncmVlcyBhbmQgY29udmVydCBpdCB0bworCQkgKiBtaWxsaS1kZWdyZWVzLgorCQkgKi8KKwkJeCA9IHgqMTAwMDsKKwl9IGVsc2UgaWYgKHNlbnNvcl90eXBlID09IFBPV0VSICYmIHggPiAwKSB7CisJCS8qIFBvd2VyIHZhbHVlIGNvbWVzIGluIHdhdHRzLCBjb252ZXJ0IHRvIG1pY3JvLXdhdHRzICovCisJCXggPSB4ICogMTAwMDAwMDsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgeCk7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X3NlbnNvcl9pbmRleF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICpoYXNoX3Bvc2l0aW9uID0gc3RyY2hyKG5hbWUsICcjJyk7CisJdTMyIGluZGV4ID0gMCwgY29weV9sZW5ndGg7CisJY2hhciBuZXdidWZbOF07CisKKwlpZiAoaGFzaF9wb3NpdGlvbikgeworCQljb3B5X2xlbmd0aCA9IHN0cmNocihoYXNoX3Bvc2l0aW9uLCAnLScpIC0gaGFzaF9wb3NpdGlvbiAtIDE7CisJCWlmIChjb3B5X2xlbmd0aCA8IHNpemVvZihuZXdidWYpKSB7CisJCQlzdHJuY3B5KG5ld2J1ZiwgaGFzaF9wb3NpdGlvbiArIDEsIGNvcHlfbGVuZ3RoKTsKKwkJCXNzY2FuZihuZXdidWYsICIlZCIsICZpbmRleCk7CisJCX0KKwl9CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfc2Vuc29yX3N1ZmZpeF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqc3VmZml4KQoreworCWNoYXIgKmRhc2hfcG9zaXRpb24gPSBzdHJyY2hyKG5hbWUsICctJyk7CisJaWYgKGRhc2hfcG9zaXRpb24pCisJCXN0cm5jcHkoc3VmZml4LCBkYXNoX3Bvc2l0aW9uKzEsIE1BWF9BVFRSX0xFTkdUSCk7CisJZWxzZQorCQlzdHJjcHkoc3VmZml4LCIiKTsKK30KKworc3RhdGljIGludCBnZXRfc2Vuc29yX2F0dHJfcHJvcGVydGllcyhjb25zdCBjaGFyICpzZW5zb3JfbmFtZSwKKwkJZW51bSBzZW5zb3JzIHNlbnNvcl90eXBlLCBlbnVtIGF0dHJpYnV0ZXMgKmF0dHJfdHlwZSwKKwkJdTMyICpzZW5zb3JfaW5kZXgpCit7CisJY2hhciBzdWZmaXhbTUFYX0FUVFJfTEVOR1RIXTsKKworCSphdHRyX3R5cGUgPSBNQVhfQVRUUl9UWVBFUzsKKwkqc2Vuc29yX2luZGV4ID0gZ2V0X3NlbnNvcl9pbmRleF9mcm9tX25hbWUoc2Vuc29yX25hbWUpOworCWlmICgqc2Vuc29yX2luZGV4ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZ2V0X3NlbnNvcl9zdWZmaXhfZnJvbV9uYW1lKHNlbnNvcl9uYW1lLCBzdWZmaXgpOworCWlmIChzdHJjbXAoc3VmZml4LCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RyY21wKHN1ZmZpeCwgRFRfRkFVTFRfQVRUUl9TVUZGSVgpID09IDApCisJCSphdHRyX3R5cGUgPSBGQVVMVDsKKwllbHNlIGlmIChzdHJjbXAoc3VmZml4LCBEVF9EQVRBX0FUVFJfU1VGRklYKSA9PSAwKQorCQkqYXR0cl90eXBlID0gSU5QVVQ7CisJZWxzZSBpZiAoKHNlbnNvcl90eXBlID09IFRFTVBFUkFUVVJFKSAmJgorCQkJKHN0cmNtcChzdWZmaXgsIERUX1RIUkVTSE9MRF9BVFRSX1NVRkZJWCkgPT0gMCkpCisJCSphdHRyX3R5cGUgPSBNQVhJTVVNOworCWVsc2UgaWYgKChzZW5zb3JfdHlwZSA9PSBGQU4pICYmCisJCQkoc3RyY21wKHN1ZmZpeCwgRFRfVEhSRVNIT0xEX0FUVFJfU1VGRklYKSA9PSAwKSkKKwkJKmF0dHJfdHlwZSA9IE1JTklNVU07CisJZWxzZQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmICgoKHNlbnNvcl90eXBlID09IEZBTikgJiYgKCgqYXR0cl90eXBlID09IElOUFVUKSB8fAorCQkJCSAgICAoKmF0dHJfdHlwZSA9PSBNSU5JTVVNKSkpCisJICAgIHx8ICgoc2Vuc29yX3R5cGUgPT0gVEVNUEVSQVRVUkUpICYmICgoKmF0dHJfdHlwZSA9PSBJTlBVVCkgfHwKKwkJCQkJCSAoKmF0dHJfdHlwZSA9PSBNQVhJTVVNKSkpCisJICAgIHx8ICgoc2Vuc29yX3R5cGUgPT0gUE9XRVIpICYmICgoKmF0dHJfdHlwZSA9PSBJTlBVVCkpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGludCBjcmVhdGVfc2Vuc29yX2F0dHIoc3RydWN0IHNlbnNvcl9zcGVjaWZpY19kYXRhICp0ZGF0YSwKKwkJc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIHNlbnNvcnMgc2Vuc29yX3R5cGUsCisJCWVudW0gYXR0cmlidXRlcyBhdHRyX3R5cGUpCit7CisJaW50IGVyciA9IDA7CisJY2hhciB0ZW1wX2ZpbGVfcHJlZml4WzUwXTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmlsZV9uYW1lX2Zvcm1hdCA9ICIlcyVkXyVzIjsKKworCXRkYXRhLT5hdHRyX3R5cGUgPSBhdHRyX3R5cGU7CisKKwlpZiAoc2Vuc29yX3R5cGUgPT0gRkFOKQorCQlzdHJjcHkodGVtcF9maWxlX3ByZWZpeCwgImZhbiIpOworCWVsc2UgaWYgKHNlbnNvcl90eXBlID09IFRFTVBFUkFUVVJFKQorCQlzdHJjcHkodGVtcF9maWxlX3ByZWZpeCwgInRlbXAiKTsKKwllbHNlIGlmIChzZW5zb3JfdHlwZSA9PSBQT1dFUlNVUFBMWSkKKwkJc3RyY3B5KHRlbXBfZmlsZV9wcmVmaXgsICJwb3dlcnN1cHBseSIpOworCWVsc2UgaWYgKHNlbnNvcl90eXBlID09IFBPV0VSKQorCQlzdHJjcHkodGVtcF9maWxlX3ByZWZpeCwgInBvd2VyIik7CisKKwlzbnByaW50Zih0ZGF0YS0+YXR0cl9uYW1lLCBzaXplb2YodGRhdGEtPmF0dHJfbmFtZSksIGZpbGVfbmFtZV9mb3JtYXQsCisJCSB0ZW1wX2ZpbGVfcHJlZml4LCB0ZGF0YS0+c2Vuc29yX2luZGV4LAorCQkgYXR0cmlidXRlX3R5cGVfdGFibGVbdGRhdGEtPmF0dHJfdHlwZV0pOworCisJc3lzZnNfYXR0cl9pbml0KCZ0ZGF0YS0+c2RfYXR0ci5kZXZfYXR0ci5hdHRyKTsKKwl0ZGF0YS0+c2RfYXR0ci5kZXZfYXR0ci5hdHRyLm5hbWUgPSB0ZGF0YS0+YXR0cl9uYW1lOworCXRkYXRhLT5zZF9hdHRyLmRldl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CisJdGRhdGEtPnNkX2F0dHIuZGV2X2F0dHIuc2hvdyA9IHNob3dfc2Vuc29yOworCisJdGRhdGEtPnNkX2F0dHIuaW5kZXggPSB0ZGF0YS0+c2Vuc29yX2luZGV4OworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0ci5kZXZfYXR0cik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9uYW1lX2F0dHIoc3RydWN0IHNlbnNvcl9kYXRhICpwZGF0YSwKKwkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3lzZnNfYXR0cl9pbml0KCZwZGF0YS0+bmFtZV9hdHRyLmF0dHIpOworCXBkYXRhLT5uYW1lX2F0dHIuYXR0ci5uYW1lID0gIm5hbWUiOworCXBkYXRhLT5uYW1lX2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwlwZGF0YS0+bmFtZV9hdHRyLnNob3cgPSBzaG93X25hbWU7CisJcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZwZGF0YS0+bmFtZV9hdHRyKTsKK30KKworc3RhdGljIGludCBjcmVhdGVfcGxhdGZvcm1fZGV2aWNlKGVudW0gc2Vuc29ycyBzZW5zb3JfdHlwZSwKKwkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKnBkZXYpCit7CisJc3RydWN0IHBkZXZfZW50cnkgKnBkZXZfZW50cnkgPSBOVUxMOworCWludCBlcnI7CisKKwkqcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhzZW5zb3JfbmFtZXNbc2Vuc29yX3R5cGVdLm5hbWUsCisJCQlzZW5zb3JfdHlwZSk7CisJaWYgKCEqcGRldikgeworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwlwZGV2X2VudHJ5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBkZXZfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkZXZfZW50cnkpIHsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKCpwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlnb3RvIGV4aXRfZGV2aWNlX2ZyZWU7CisJfQorCisJcGRldl9lbnRyeS0+cGRldiA9ICpwZGV2OworCXBkZXZfZW50cnktPnR5cGUgPSAoKnBkZXYpLT5pZDsKKworCWxpc3RfYWRkX3RhaWwoJnBkZXZfZW50cnktPmxpc3QsICZwZGV2X2xpc3QpOworCisJcmV0dXJuIDA7CitleGl0X2RldmljZV9mcmVlOgorCWtmcmVlKHBkZXZfZW50cnkpOworZXhpdF9kZXZpY2VfcHV0OgorCXBsYXRmb3JtX2RldmljZV9wdXQoKnBkZXYpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9zZW5zb3JfZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzZW5zb3JfZGF0YSAqcGRhdGEgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJcGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwllcnIgPSBjcmVhdGVfbmFtZV9hdHRyKHBkYXRhLCAmcGRldi0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCXBkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUihwZGF0YS0+aHdtb25fZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKHBkYXRhLT5od21vbl9kZXYpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDbGFzcyByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCisJCQllcnIpOworCQlnb3RvIGV4aXRfbmFtZTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmcGRhdGEtPnNlbnNvcl9saXN0KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9uYW1lOgorCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmcGRhdGEtPm5hbWVfYXR0cik7CitleGl0X2ZyZWU6CisJa2ZyZWUocGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkZWxldGVfc2Vuc29yX2F0dHIoc3RydWN0IHNlbnNvcl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2VudHJ5ICpzLCAqbDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzLCBsLCAmcGRhdGEtPnNlbnNvcl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBzZW5zb3Jfc3BlY2lmaWNfZGF0YSAqdGRhdGEgPSBzLT5zZW5zb3JfZGF0YTsKKwkJCWtmcmVlKHRkYXRhKTsKKwkJCWxpc3RfZGVsKCZzLT5saXN0KTsKKwkJCWtmcmVlKHMpOworCQl9Cit9CisKK3N0YXRpYyBpbnQgcG93ZXJudl9zZW5zb3JfaW5pdCh1MzIgc2Vuc29yX2lkLCBjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQllbnVtIHNlbnNvcnMgc2Vuc29yX3R5cGUsIGVudW0gYXR0cmlidXRlcyBhdHRyX3R5cGUsCisJCXUzMiBzZW5zb3JfaW5kZXgpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHBvd2VybnZfc2Vuc29yX2dldF9wZGV2KHNlbnNvcl90eXBlKTsKKwlzdHJ1Y3Qgc2Vuc29yX3NwZWNpZmljX2RhdGEgKnRkYXRhOworCXN0cnVjdCBzZW5zb3JfZW50cnkgKnNlbnNvcl9lbnRyeTsKKwlzdHJ1Y3Qgc2Vuc29yX2RhdGEgKnBkYXRhOworCWludCBlcnIgPSAwOworCisJaWYgKCFwZGV2KSB7CisJCWVyciA9IGNyZWF0ZV9wbGF0Zm9ybV9kZXZpY2Uoc2Vuc29yX3R5cGUsICZwZGV2KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXhpdDsKKworCQllcnIgPSBjcmVhdGVfc2Vuc29yX2RhdGEocGRldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIXBkYXRhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwl0ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZW5zb3Jfc3BlY2lmaWNfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghdGRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCXRkYXRhLT5zZW5zb3JfaWQgPSBzZW5zb3JfaWQ7CisJdGRhdGEtPnNlbnNvcl9pbmRleCA9IHNlbnNvcl9pbmRleDsKKworCWVyciA9IGNyZWF0ZV9zZW5zb3JfYXR0cih0ZGF0YSwgJnBkZXYtPmRldiwgc2Vuc29yX3R5cGUsIGF0dHJfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2ZyZWU7CisKKwlzZW5zb3JfZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZW5zb3JfZW50cnkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2F0dHI7CisJfQorCisJc2Vuc29yX2VudHJ5LT5zZW5zb3JfZGF0YSA9IHRkYXRhOworCisJbGlzdF9hZGRfdGFpbCgmc2Vuc29yX2VudHJ5LT5saXN0LCAmcGRhdGEtPnNlbnNvcl9saXN0KTsKKworCXJldHVybiAwOworZXhpdF9hdHRyOgorCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmdGRhdGEtPnNkX2F0dHIuZGV2X2F0dHIpOworZXhpdF9mcmVlOgorCWtmcmVlKHRkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZGVsZXRlX3VucmVnaXN0ZXJfc2Vuc29ycyh2b2lkKQoreworCXN0cnVjdCBwZGV2X2VudHJ5ICpwLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmcGRldl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBzZW5zb3JfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwLT5wZGV2KTsKKwkJCWlmIChwZGF0YSkgeworCQkJCWRlbGV0ZV9zZW5zb3JfYXR0cihwZGF0YSk7CisKKwkJCQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+aHdtb25fZGV2KTsKKwkJCQlrZnJlZShwZGF0YSk7CisJCQl9CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHAtPnBkZXYpOworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCWtmcmVlKHApOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgcG93ZXJudl9od21vbl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpvcGFsLCAqbnAgPSBOVUxMOworCWVudW0gYXR0cmlidXRlcyBhdHRyX3R5cGU7CisJZW51bSBzZW5zb3JzIHR5cGU7CisJY29uc3QgdTMyICpzZW5zb3JfaWQ7CisJdTMyIHNlbnNvcl9pbmRleDsKKwlpbnQgZXJyOworCisJb3BhbCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLG9wYWwvc2Vuc29ycyIpOworCWlmICghb3BhbCkgeworCQlwcl9lcnIoIiVzOiBPcGFsICdzZW5zb3JzJyBub2RlIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUob3BhbCwgbnApIHsKKwkJaWYgKG5wLT5uYW1lID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYX1NFTlNPUl9UWVBFOyB0eXBlKyspCisJCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsCisJCQkJCXNlbnNvcl9uYW1lc1t0eXBlXS5jb21wYWlibGUpKQorCQkJCWJyZWFrOworCisJCWlmICh0eXBlID09IE1BWF9TRU5TT1JfVFlQRSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChnZXRfc2Vuc29yX2F0dHJfcHJvcGVydGllcyhucC0+bmFtZSwgdHlwZSwgJmF0dHJfdHlwZSwKKwkJCQkmc2Vuc29yX2luZGV4KSkKKwkJCWNvbnRpbnVlOworCisJCXNlbnNvcl9pZCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInNlbnNvci1pZCIsIE5VTEwpOworCQlpZiAoIXNlbnNvcl9pZCkgeworCQkJcHJfaW5mbygiJXM6ICVzIGRvZXNuJ3QgaGF2ZSBzZW5zb3ItaWRcbiIsIF9fZnVuY19fLAorCQkJCQlucC0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVyciA9IHBvd2VybnZfc2Vuc29yX2luaXQoKnNlbnNvcl9pZCwgbnAsIHR5cGUsIGF0dHJfdHlwZSwKKwkJCQlzZW5zb3JfaW5kZXgpOworCQlpZiAoZXJyKSB7CisJCQlvZl9ub2RlX3B1dChvcGFsKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKwlvZl9ub2RlX3B1dChvcGFsKTsKKworCXJldHVybiAwOworZXhpdDoKKwlkZWxldGVfdW5yZWdpc3Rlcl9zZW5zb3JzKCk7CisJcmV0dXJuIGVycjsKKworfQorCitzdGF0aWMgdm9pZCBwb3dlcm52X2h3bW9uX2V4aXQodm9pZCkKK3sKKwlkZWxldGVfdW5yZWdpc3Rlcl9zZW5zb3JzKCk7Cit9CisKK21vZHVsZV9pbml0KHBvd2VybnZfaHdtb25faW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcm52X2h3bW9uX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9paW9faHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaWlvX2h3bW9uLmMKaW5kZXggNzA4MDgxYi4uOWZiYjFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9paW9faHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jCkBAIC0zMSw2ICszMSw3IEBACiAJaW50IG51bV9jaGFubmVsczsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dyb3VwOworCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmdyb3Vwc1syXTsKIAlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnM7CiB9OwogCkBAIC01NiwxOSArNTcsNiBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXN1bHQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCi17Ci0JY29uc3QgY2hhciAqbmFtZSA9ICJpaW9faHdtb24iOwotCi0JaWYgKGRldi0+b2Zfbm9kZSAmJiBkZXYtPm9mX25vZGUtPm5hbWUpCi0JCW5hbWUgPSBkZXYtPm9mX25vZGUtPm5hbWU7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOwotCiBzdGF0aWMgaW50IGlpb19od21vbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC03OCw2ICs2NiwxMCBAQAogCWludCBpbl9pID0gMSwgdGVtcF9pID0gMSwgY3Vycl9pID0gMTsKIAllbnVtIGlpb19jaGFuX3R5cGUgdHlwZTsKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW5uZWxzOworCWNvbnN0IGNoYXIgKm5hbWUgPSAiaWlvX2h3bW9uIjsKKworCWlmIChkZXYtPm9mX25vZGUgJiYgZGV2LT5vZl9ub2RlLT5uYW1lKQorCQluYW1lID0gZGV2LT5vZl9ub2RlLT5uYW1lOwogCiAJY2hhbm5lbHMgPSBpaW9fY2hhbm5lbF9nZXRfYWxsKGRldik7CiAJaWYgKElTX0VSUihjaGFubmVscykpCkBAIC05Niw3ICs4OCw3IEBACiAJCXN0LT5udW1fY2hhbm5lbHMrKzsKIAogCXN0LT5hdHRycyA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkJIHNpemVvZigqc3QtPmF0dHJzKSAqIChzdC0+bnVtX2NoYW5uZWxzICsgMiksCisJCQkJIHNpemVvZigqc3QtPmF0dHJzKSAqIChzdC0+bnVtX2NoYW5uZWxzICsgMSksCiAJCQkJIEdGUF9LRVJORUwpOwogCWlmIChzdC0+YXR0cnMgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTQ0LDIyICsxMzYsMTggQEAKIAkJYS0+aW5kZXggPSBpOwogCQlzdC0+YXR0cnNbaV0gPSAmYS0+ZGV2X2F0dHIuYXR0cjsKIAl9Ci0Jc3QtPmF0dHJzW3N0LT5udW1fY2hhbm5lbHNdID0gJmRldl9hdHRyX25hbWUuYXR0cjsKLQlzdC0+YXR0cl9ncm91cC5hdHRycyA9IHN0LT5hdHRyczsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzdCk7Ci0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZzdC0+YXR0cl9ncm91cCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfcmVsZWFzZV9jaGFubmVsczsKIAotCXN0LT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoZGV2KTsKKwlzdC0+YXR0cl9ncm91cC5hdHRycyA9IHN0LT5hdHRyczsKKwlzdC0+Z3JvdXBzWzBdID0gJnN0LT5hdHRyX2dyb3VwOworCXN0LT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBuYW1lLCBzdCwKKwkJCQkJCQkgIHN0LT5ncm91cHMpOwogCWlmIChJU19FUlIoc3QtPmh3bW9uX2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihzdC0+aHdtb25fZGV2KTsKLQkJZ290byBlcnJvcl9yZW1vdmVfZ3JvdXA7CisJCWdvdG8gZXJyb3JfcmVsZWFzZV9jaGFubmVsczsKIAl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3QpOwogCXJldHVybiAwOwogCi1lcnJvcl9yZW1vdmVfZ3JvdXA6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZzdC0+YXR0cl9ncm91cCk7CiBlcnJvcl9yZWxlYXNlX2NoYW5uZWxzOgogCWlpb19jaGFubmVsX3JlbGVhc2VfYWxsKGNoYW5uZWxzKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTcwLDcgKzE1OCw2IEBACiAJc3RydWN0IGlpb19od21vbl9zdGF0ZSAqc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHN0LT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZzdC0+YXR0cl9ncm91cCk7CiAJaWlvX2NoYW5uZWxfcmVsZWFzZV9hbGwoc3QtPmNoYW5uZWxzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vano0NzQwLWh3bW9uLmMKaW5kZXggYTE4M2U0OC4uNzQ4OGUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2p6NDc0MC1od21vbi5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KIAogc3RydWN0IGp6NDc0MF9od21vbiB7Ci0Jc3RydWN0IHJlc291cmNlICptZW07CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCiAJaW50IGlycTsKQEAgLTEwNiw2ICsxMDUsNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGp6NDc0MF9od21vbiAqaHdtb247CisJc3RydWN0IHJlc291cmNlICptZW07CiAKIAlod21vbiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmh3bW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFod21vbikKQEAgLTEyMCwyNSArMTIwLDEwIEBACiAJCXJldHVybiBod21vbi0+aXJxOwogCX0KIAotCWh3bW9uLT5tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghaHdtb24tPm1lbSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIG1taW8gcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQlod21vbi0+bWVtID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgaHdtb24tPm1lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKGh3bW9uLT5tZW0pLCBwZGV2LT5uYW1lKTsKLQlpZiAoIWh3bW9uLT5tZW0pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgbW1pbyBtZW1vcnkgcmVnaW9uXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlod21vbi0+YmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIGh3bW9uLT5tZW0tPnN0YXJ0LAotCQkJCQkgICByZXNvdXJjZV9zaXplKGh3bW9uLT5tZW0pKTsKLQlpZiAoIWh3bW9uLT5iYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIG1taW8gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlod21vbi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW0pOworCWlmIChJU19FUlIoaHdtb24tPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihod21vbi0+YmFzZSk7CiAKIAlpbml0X2NvbXBsZXRpb24oJmh3bW9uLT5yZWFkX2NvbXBsZXRpb24pOwogCW11dGV4X2luaXQoJmh3bW9uLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jIGIvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKaW5kZXggNGI2OGZiMi4uY2RmMTlhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAogLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KIHN0cnVjdCBsbTk1MjQxX2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZCwgaW50ZXJ2YWw7CS8qIGluIGppZmZpZXMgKi8KIAljaGFyIHZhbGlkOwkJLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwpAQCAtMTEzLDggKzExMyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkgICAgIWRhdGEtPnZhbGlkKSB7CiAJCWludCBpOwogCi0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbG05NTI0MSBkYXRhLlxuIik7CisJCWRldl9kYmcoZGV2LCAiVXBkYXRpbmcgbG05NTI0MSBkYXRhLlxuIik7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxtOTUyNDFfcmVnX2FkZHJlc3MpOyBpKyspCiAJCQlkYXRhLT50ZW1wW2ldCiAJCQkgID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKQEAgLTE1Myw4ICsxNTMsNyBAQAogc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCiAJCWRhdGEtPm1vZGVsICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/ICIxXG4iIDogIjJcbiIpOwpAQCAtMTYzLDggKzE2Miw4IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHNoaWZ0OwogCXU4IG1hc2sgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwpAQCAtMjAxLDggKzIwMCw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCiAJCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KQEAgLTIxMiw4ICsyMTAsNyBAQAogc3RhdGljIHNzaXplX3Qgc2V0X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWxvbmcgdmFsOwogCiAJaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMjI5LDcgKzIyNiw4IEBACiAJCWRhdGEtPmNvbmZpZyAmPSB+dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlkYXRhLT52YWxpZCA9IDA7CiAKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBkYXRhLT5jb25maWcpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsCisJCQkJICBkYXRhLT5jb25maWcpOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTIzOSw4ICsyMzcsNyBAQAogc3RhdGljIHNzaXplX3Qgc2hvd19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAogCQkJZGF0YS0+Y29uZmlnICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/CkBAIC0yNTAsOCArMjQ3LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlsb25nIHZhbDsKIAogCWlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKQEAgLTI2Nyw3ICsyNjMsOCBAQAogCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJZGF0YS0+dmFsaWQgPSAwOwogCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAorCQkJCSAgZGF0YS0+Y29uZmlnKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0yODYsOCArMjgzLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAogCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCkBAIC0zMTYsNyArMzEyLDcgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2ludGVydmFsLAogCQkgICBzZXRfaW50ZXJ2YWwpOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0MV9hdHRyaWJ1dGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0MV9hdHRyc1tdID0gewogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLApAQCAtMzI5LDEwICszMjUsNyBAQAogCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKIAlOVUxMCiB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTk1MjQxX2dyb3VwID0gewotCS5hdHRycyA9IGxtOTUyNDFfYXR0cmlidXRlcywKLX07CitBVFRSSUJVVEVfR1JPVVBTKGxtOTUyNDEpOwogCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgbG05NTI0MV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQsCkBAIC0zNjYsMTQgKzM1OSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KIAlkYXRhLT5pbnRlcnZhbCA9IEhaOwkvKiAxIHNlYyBkZWZhdWx0ICovCi0JZGF0YS0+dmFsaWQgPSAwOwogCWRhdGEtPmNvbmZpZyA9IENGR19DUjAwNzY7Ci0JZGF0YS0+bW9kZWwgPSAwOwogCWRhdGEtPnRydXRoZXJtID0gKFRUX09GRiA8PCBUVDFfU0hJRlQpIHwgKFRUX09GRiA8PCBUVDJfU0hJRlQpOwogCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKQEAgLTM4NSw0OSArMzc1LDI3IEBACiAJCQkJICBkYXRhLT5tb2RlbCk7CiB9CiAKLXN0YXRpYyBpbnQgbG05NTI0MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKK3N0YXRpYyBpbnQgbG05NTI0MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YTsKLQlpbnQgZXJyOworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJm5ld19jbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBsbTk1MjQxX2RhdGEpLAotCQkJICAgIEdGUF9LRVJORUwpOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGxtOTUyNDFfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIExNOTUyNDEgY2hpcCAqLwotCWxtOTUyNDFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisJbG05NTI0MV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwogCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0MV9ncm91cCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwotCX0KLQotCXJldHVybiAwOwotCi1leGl0X3JlbW92ZV9maWxlczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0MV9ncm91cCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBsbTk1MjQxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG05NTI0MV9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLAorCQkJCQkJCSAgIGxtOTUyNDFfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKIC8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCkBAIC00NDQsNyArNDEyLDYgQEAKIAkJLm5hbWUJPSBERVZOQU1FLAogCX0sCiAJLnByb2JlCQk9IGxtOTUyNDFfcHJvYmUsCi0JLnJlbW92ZQkJPSBsbTk1MjQxX3JlbW92ZSwKIAkuaWRfdGFibGUJPSBsbTk1MjQxX2lkLAogCS5kZXRlY3QJCT0gbG05NTI0MV9kZXRlY3QsCiAJLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCmluZGV4IGE2Yzg1ZjAuLjBhZTBkZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KIHN0cnVjdCBsbTk1MjQ1X2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogaW4gamlmZmllcyAqLwogCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CS8qIGluIG1zZWNzICovCkBAIC0xNDAsOCArMTQwLDggQEAKIAogc3RhdGljIHN0cnVjdCBsbTk1MjQ1X2RhdGEgKmxtOTUyNDVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTE0OSw3ICsxNDksNiBAQAogCQkrIG1zZWNzX3RvX2ppZmZpZXMoZGF0YS0+aW50ZXJ2YWwpKSB8fCAhZGF0YS0+dmFsaWQpIHsKIAkJaW50IGk7CiAKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTk1MjQ1IGRhdGEuXG4iKTsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG05NTI0NV9yZWdfYWRkcmVzcyk7IGkrKykKIAkJCWRhdGEtPnJlZ3NbaV0KIAkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LApAQCAtMjQ5LDkgKzI0OCw5IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfbGltaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMjcyLDI3ICsyNzEsMzggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJaW50IGh5c3QgPSBkYXRhLT5yZWdzW2luZGV4XSAtIGRhdGEtPnJlZ3NbOF07CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsIGh5c3QgKiAxMDAwKTsKK30KKwogc3RhdGljIHNzaXplX3Qgc2V0X2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgaHlzdCwgbGltaXQ7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZhbCAvPSAxMDAwOwotCi0JdmFsID0gY2xhbXBfdmFsKHZhbCwgMCwgMzEpOwotCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JZGF0YS0+dmFsaWQgPSAwOworCWxpbWl0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgbG05NTI0NV9yZWdfYWRkcmVzc1tpbmRleF0pOworCWh5c3QgPSBsaW1pdCAtIHZhbCAvIDEwMDA7CisJaHlzdCA9IGNsYW1wX3ZhbChoeXN0LCAwLCAzMSk7CisJZGF0YS0+cmVnc1s4XSA9IGh5c3Q7CiAKIAkvKiBzaGFyZWQgY3JpdCBoeXN0ZXJlc2lzICovCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAotCQl2YWwpOworCQloeXN0KTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0zMDIsOCArMzEyLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAogCQlkYXRhLT5jb25maWcyICYgQ0ZHMl9SRU1PVEVfVFQgPyAiMVxuIiA6ICIyXG4iKTsKQEAgLTMxMiw4ICszMjEsOCBAQAogc3RhdGljIHNzaXplX3Qgc2V0X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCiAJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKQEAgLTM1OSw4ICszNjgsOCBAQAogc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQpAQCAtMzc4LDE2ICszODcsMTUgQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKIAkJc2V0X2xpbWl0LCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKLQkJc2V0X2NyaXRfaHlzdCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfY3JpdF9oeXN0LAorCQlzZXRfY3JpdF9oeXN0LCA2KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKIAkJU1RBVFVTMV9MT0MpOwogCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAyKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCiAJCXNldF9saW1pdCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCi0JCXNldF9jcml0X2h5c3QsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfY3JpdF9oeXN0LCBOVUxMLCA3KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKIAkJU1RBVFVTMV9SVENSSVQpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl90eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLApAQCAtMzk4LDcgKzQwNiw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbnRlcnZhbCwKIAkJc2V0X2ludGVydmFsKTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDVfYXR0cmlidXRlc1tdID0geworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDVfYXR0cnNbXSA9IHsKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QuZGV2X2F0dHIuYXR0ciwKQEAgLTQxMiwxMCArNDIwLDcgQEAKIAkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCiAJTlVMTAogfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05NTI0NV9ncm91cCA9IHsKLQkuYXR0cnMgPSBsbTk1MjQ1X2F0dHJpYnV0ZXMsCi19OworQVRUUklCVVRFX0dST1VQUyhsbTk1MjQ1KTsKIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGxtOTUyNDVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LApAQCAtNDM2LDExICs0NDEsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlkYXRhLT52YWxpZCA9IDA7CiAJZGF0YS0+aW50ZXJ2YWwgPSBsbTk1MjQ1X3JlYWRfY29udmVyc2lvbl9yYXRlKGNsaWVudCk7CiAKIAlkYXRhLT5jb25maWcxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKQEAgLTQ1Niw0OSArNDU5LDI3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGxtOTUyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQsCitzdGF0aWMgaW50IGxtOTUyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGE7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAKLQlkYXRhID0gZGV2bV9remFsbG9jKCZuZXdfY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbG05NTI0NV9kYXRhKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBsbTk1MjQ1X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMTTk1MjQ1IGNoaXAgKi8KLQlsbTk1MjQ1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCWxtOTUyNDVfaW5pdF9jbGllbnQoY2xpZW50LCBkYXRhKTsKIAotCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKLQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXhpdF9yZW1vdmVfZmlsZXM6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbG05NTI0NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOwotCi0JcmV0dXJuIDA7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgZGF0YSwKKwkJCQkJCQkgICBsbTk1MjQ1X2dyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCiAvKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKSAqLwpAQCAtNTE0LDcgKzQ5NSw2IEBACiAJCS5uYW1lCT0gREVWTkFNRSwKIAl9LAogCS5wcm9iZQkJPSBsbTk1MjQ1X3Byb2JlLAotCS5yZW1vdmUJCT0gbG05NTI0NV9yZW1vdmUsCiAJLmlkX3RhYmxlCT0gbG05NTI0NV9pZCwKIAkuZGV0ZWN0CQk9IGxtOTUyNDVfZGV0ZWN0LAogCS5hZGRyZXNzX2xpc3QJPSBub3JtYWxfaTJjLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGMyOTQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzI5NDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA0Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9sdGMyOTQ1LmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBEcml2ZXIgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzI5NDUgSTJDIFBvd2VyIE1vbml0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR3VlbnRlciBSb2VjaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qIGNoaXAgcmVnaXN0ZXJzICovCisjZGVmaW5lIExUQzI5NDVfQ09OVFJPTAkJCTB4MDAKKyNkZWZpbmUgTFRDMjk0NV9BTEVSVAkJCTB4MDEKKyNkZWZpbmUgTFRDMjk0NV9TVEFUVVMJCQkweDAyCisjZGVmaW5lIExUQzI5NDVfRkFVTFQJCQkweDAzCisjZGVmaW5lIExUQzI5NDVfUE9XRVJfSAkJCTB4MDUKKyNkZWZpbmUgTFRDMjk0NV9NQVhfUE9XRVJfSAkJMHgwOAorI2RlZmluZSBMVEMyOTQ1X01JTl9QT1dFUl9ICQkweDBiCisjZGVmaW5lIExUQzI5NDVfTUFYX1BPV0VSX1RIUkVTX0gJMHgwZQorI2RlZmluZSBMVEMyOTQ1X01JTl9QT1dFUl9USFJFU19ICTB4MTEKKyNkZWZpbmUgTFRDMjk0NV9TRU5TRV9ICQkJMHgxNAorI2RlZmluZSBMVEMyOTQ1X01BWF9TRU5TRV9ICQkweDE2CisjZGVmaW5lIExUQzI5NDVfTUlOX1NFTlNFX0gJCTB4MTgKKyNkZWZpbmUgTFRDMjk0NV9NQVhfU0VOU0VfVEhSRVNfSAkweDFhCisjZGVmaW5lIExUQzI5NDVfTUlOX1NFTlNFX1RIUkVTX0gJMHgxYworI2RlZmluZSBMVEMyOTQ1X1ZJTl9ICQkJMHgxZQorI2RlZmluZSBMVEMyOTQ1X01BWF9WSU5fSAkJMHgyMAorI2RlZmluZSBMVEMyOTQ1X01JTl9WSU5fSAkJMHgyMgorI2RlZmluZSBMVEMyOTQ1X01BWF9WSU5fVEhSRVNfSAkJMHgyNAorI2RlZmluZSBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSAkJMHgyNgorI2RlZmluZSBMVEMyOTQ1X0FESU5fSAkJCTB4MjgKKyNkZWZpbmUgTFRDMjk0NV9NQVhfQURJTl9ICQkweDJhCisjZGVmaW5lIExUQzI5NDVfTUlOX0FESU5fSAkJMHgyYworI2RlZmluZSBMVEMyOTQ1X01BWF9BRElOX1RIUkVTX0gJMHgyZQorI2RlZmluZSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0gJMHgzMAorI2RlZmluZSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0wJMHgzMQorCisvKiBGYXVsdCByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgRkFVTFRfQURJTl9VVgkJKDEgPDwgMCkKKyNkZWZpbmUgRkFVTFRfQURJTl9PVgkJKDEgPDwgMSkKKyNkZWZpbmUgRkFVTFRfVklOX1VWCQkoMSA8PCAyKQorI2RlZmluZSBGQVVMVF9WSU5fT1YJCSgxIDw8IDMpCisjZGVmaW5lIEZBVUxUX1NFTlNFX1VWCQkoMSA8PCA0KQorI2RlZmluZSBGQVVMVF9TRU5TRV9PVgkJKDEgPDwgNSkKKyNkZWZpbmUgRkFVTFRfUE9XRVJfVVYJCSgxIDw8IDYpCisjZGVmaW5lIEZBVUxUX1BPV0VSX09WCQkoMSA8PCA3KQorCisvKiBDb250cm9sIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBDT05UUk9MX01VTFRfU0VMRUNUCSgxIDw8IDApCisjZGVmaW5lIENPTlRST0xfVEVTVF9NT0RFCSgxIDw8IDQpCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19wb3dlcl9yZWcodTggcmVnKQoreworCXJldHVybiByZWcgPCBMVEMyOTQ1X1NFTlNFX0g7Cit9CisKKy8qIFJldHVybiB0aGUgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdVcsIG1WLCBvciBtQSAqLworc3RhdGljIGxvbmcgbG9uZyBsdGMyOTQ1X3JlZ190b192YWwoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWcpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGNvbnRyb2w7CisJdTggYnVmWzNdOworCWxvbmcgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9idWxrX3JlYWQocmVnbWFwLCByZWcsIGJ1ZiwKKwkJCSAgICAgICBpc19wb3dlcl9yZWcocmVnKSA/IDMgOiAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpc19wb3dlcl9yZWcocmVnKSkgeworCQkvKiBwb3dlciAqLworCQl2YWwgPSAoYnVmWzBdIDw8IDE2KSArIChidWZbMV0gPDwgOCkgKyBidWZbMl07CisJfSBlbHNlIHsKKwkJLyogY3VycmVudCwgdm9sdGFnZSAqLworCQl2YWwgPSAoYnVmWzBdIDw8IDQpICsgKGJ1ZlsxXSA+PiA0KTsKKwl9CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMjk0NV9QT1dFUl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfUE9XRVJfSDoKKwljYXNlIExUQzI5NDVfTUlOX1BPV0VSX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9QT1dFUl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fUE9XRVJfVEhSRVNfSDoKKwkJLyoKKwkJICogQ29udmVydCB0byB1VyBieSBhc3N1bWluZyBjdXJyZW50IGlzIG1lYXN1cmVkIHdpdGgKKwkJICogYW4gMW1PaG0gc2Vuc2UgcmVzaXN0b3IsIHNpbWlsYXIgdG8gY3VycmVudAorCQkgKiBtZWFzdXJlbWVudHMuCisJCSAqIENvbnRyb2wgcmVnaXN0ZXIgYml0IDAgc2VsZWN0cyBpZiB2b2x0YWdlIGF0IFNFTlNFKy9WREQKKwkJICogb3Igdm9sdGFnZSBhdCBBRElOIGlzIHVzZWQgdG8gbWVhc3VyZSBwb3dlci4KKwkJICovCisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTFRDMjk0NV9DT05UUk9MLCAmY29udHJvbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGNvbnRyb2wgJiBDT05UUk9MX01VTFRfU0VMRUNUKSB7CisJCQkvKiAyNSBtViAqIDI1IHVWID0gMC42MjUgdVYgcmVzb2x1dGlvbi4gKi8KKwkJCXZhbCAqPSA2MjVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIDAuNSBtViAqIDI1IHVWID0gMC4wMTI1IHVWIHJlc29sdXRpb24uICovCisJCQl2YWwgPSAodmFsICogMjVMTCkgPj4gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIExUQzI5NDVfVklOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9WSU5fSDoKKwljYXNlIExUQzI5NDVfTUlOX1ZJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfVklOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSDoKKwkJLyogMjUgbVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBtVi4gKi8KKwkJdmFsICo9IDI1OworCQlicmVhazsKKwljYXNlIExUQzI5NDVfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9IOgorCQkvKiAwLjVtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgPSB2YWwgPj4gMTsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X1NFTlNFX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9TRU5TRV9IOgorCWNhc2UgTFRDMjk0NV9NSU5fU0VOU0VfSDoKKwljYXNlIExUQzI5NDVfTUFYX1NFTlNFX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9TRU5TRV9USFJFU19IOgorCQkvKgorCQkgKiAyNSB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAorCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLiBJZiBhIGRpZmZlcmVudCBzZW5zZQorCQkgKiByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgYnkKKwkJICogZGl2aWRpbmcgdGhlIHJlcG9ydGVkIGN1cnJlbnQgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlCisJCSAqIGluIG1PaG0uCisJCSAqLworCQl2YWwgKj0gMjU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGx0YzI5NDVfdmFsX3RvX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCBjb250cm9sOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMjk0NV9QT1dFUl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfUE9XRVJfSDoKKwljYXNlIExUQzI5NDVfTUlOX1BPV0VSX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9QT1dFUl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fUE9XRVJfVEhSRVNfSDoKKwkJLyoKKwkJICogQ29udmVydCB0byByZWdpc3RlciB2YWx1ZSBieSBhc3N1bWluZyBjdXJyZW50IGlzIG1lYXN1cmVkCisJCSAqIHdpdGggYW4gMW1PaG0gc2Vuc2UgcmVzaXN0b3IsIHNpbWlsYXIgdG8gY3VycmVudAorCQkgKiBtZWFzdXJlbWVudHMuCisJCSAqIENvbnRyb2wgcmVnaXN0ZXIgYml0IDAgc2VsZWN0cyBpZiB2b2x0YWdlIGF0IFNFTlNFKy9WREQKKwkJICogb3Igdm9sdGFnZSBhdCBBRElOIGlzIHVzZWQgdG8gbWVhc3VyZSBwb3dlciwgd2hpY2ggaW4gdHVybgorCQkgKiBkZXRlcm1pbmVzIHJlZ2lzdGVyIGNhbGN1bGF0aW9ucy4KKwkJICovCisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTFRDMjk0NV9DT05UUk9MLCAmY29udHJvbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGNvbnRyb2wgJiBDT05UUk9MX01VTFRfU0VMRUNUKSB7CisJCQkvKiAyNSBtViAqIDI1IHVWID0gMC42MjUgdVYgcmVzb2x1dGlvbi4gKi8KKwkJCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCwgNjI1KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiAwLjUgbVYgKiAyNSB1ViA9IDAuMDEyNSB1ViByZXNvbHV0aW9uLgorCQkJICogRGl2aWRlIGZpcnN0IHRvIGF2b2lkIG92ZXJmbG93OworCQkJICogYWNjZXB0IGxvc3Mgb2YgYWNjdXJhY3kuCisJCQkgKi8KKwkJCXZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHZhbCwgMjUpICogMjsKKwkJfQorCQlicmVhazsKKwljYXNlIExUQzI5NDVfVklOX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9WSU5fSDoKKwljYXNlIExUQzI5NDVfTUlOX1ZJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfVklOX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSDoKKwkJLyogMjUgbVYgcmVzb2x1dGlvbi4gKi8KKwkJdmFsIC89IDI1OworCQlicmVhazsKKwljYXNlIExUQzI5NDVfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NQVhfQURJTl9USFJFU19IOgorCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9IOgorCQkvKiAwLjVtViByZXNvbHV0aW9uLiAqLworCQl2YWwgKj0gMjsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X1NFTlNFX0g6CisJY2FzZSBMVEMyOTQ1X01BWF9TRU5TRV9IOgorCWNhc2UgTFRDMjk0NV9NSU5fU0VOU0VfSDoKKwljYXNlIExUQzI5NDVfTUFYX1NFTlNFX1RIUkVTX0g6CisJY2FzZSBMVEMyOTQ1X01JTl9TRU5TRV9USFJFU19IOgorCQkvKgorCQkgKiAyNSB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAorCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLiBJZiBhIGRpZmZlcmVudCBzZW5zZQorCQkgKiByZXNpc3RvciBpcyBpbnN0YWxsZWQsIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgYnkKKwkJICogZGl2aWRpbmcgdGhlIHJlcG9ydGVkIGN1cnJlbnQgYnkgdGhlIHNlbnNlIHJlc2lzdG9yIHZhbHVlCisJCSAqIGluIG1PaG0uCisJCSAqLworCQl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIDI1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzI5NDVfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWxvbmcgbG9uZyB2YWx1ZTsKKworCXZhbHVlID0gbHRjMjk0NV9yZWdfdG9fdmFsKGRldiwgYXR0ci0+aW5kZXgpOworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybiB2YWx1ZTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGxkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzI5NDVfc2V0X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggcmVnID0gYXR0ci0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdTggcmVnYnVmWzNdOworCWludCBudW1fcmVnczsKKwlpbnQgcmVndmFsOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogY29udmVydCB0byByZWdpc3RlciB2YWx1ZSwgdGhlbiBjbGFtcCBhbmQgd3JpdGUgcmVzdWx0ICovCisJcmVndmFsID0gbHRjMjk0NV92YWxfdG9fcmVnKGRldiwgcmVnLCB2YWwpOworCWlmIChpc19wb3dlcl9yZWcocmVnKSkgeworCQlyZWd2YWwgPSBjbGFtcF92YWwocmVndmFsLCAwLCAweGZmZmZmZik7CisJCXJlZ2J1ZlswXSA9IHJlZ3ZhbCA+PiAxNjsKKwkJcmVnYnVmWzFdID0gKHJlZ3ZhbCA+PiA4KSAmIDB4ZmY7CisJCXJlZ2J1ZlsyXSA9IHJlZ3ZhbDsKKwkJbnVtX3JlZ3MgPSAzOworCX0gZWxzZSB7CisJCXJlZ3ZhbCA9IGNsYW1wX3ZhbChyZWd2YWwsIDAsIDB4ZmZmKSA8PCA0OworCQlyZWdidWZbMF0gPSByZWd2YWwgPj4gODsKKwkJcmVnYnVmWzFdID0gcmVndmFsICYgMHhmZjsKKwkJbnVtX3JlZ3MgPSAyOworCX0KKwlyZXQgPSByZWdtYXBfYnVsa193cml0ZShyZWdtYXAsIHJlZywgcmVnYnVmLCBudW1fcmVncyk7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgbHRjMjk0NV9yZXNldF9oaXN0b3J5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggcmVnID0gYXR0ci0+aW5kZXg7CisJaW50IG51bV9yZWdzID0gaXNfcG93ZXJfcmVnKHJlZykgPyAzIDogMjsKKwl1OCBidWZfbWluWzNdID0geyAweGZmLCAweGZmLCAweGZmIH07CisJdTggYnVmX21heFszXSA9IHsgMCwgMCwgMCB9OworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBMVEMyOTQ1X0NPTlRST0wsIENPTlRST0xfVEVTVF9NT0RFLAorCQkJCSBDT05UUk9MX1RFU1RfTU9ERSk7CisKKwkvKiBSZXNldCBtaW5pbXVtICovCisJcmV0ID0gcmVnbWFwX2J1bGtfd3JpdGUocmVnbWFwLCByZWcsIGJ1Zl9taW4sIG51bV9yZWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIExUQzI5NDVfTUlOX1BPV0VSX0g6CisJCXJlZyA9IExUQzI5NDVfTUFYX1BPV0VSX0g7CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9NSU5fU0VOU0VfSDoKKwkJcmVnID0gTFRDMjk0NV9NQVhfU0VOU0VfSDsKKwkJYnJlYWs7CisJY2FzZSBMVEMyOTQ1X01JTl9WSU5fSDoKKwkJcmVnID0gTFRDMjk0NV9NQVhfVklOX0g7CisJCWJyZWFrOworCWNhc2UgTFRDMjk0NV9NSU5fQURJTl9IOgorCQlyZWcgPSBMVEMyOTQ1X01BWF9BRElOX0g7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisJLyogUmVzZXQgbWF4aW11bSAqLworCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHJlZ21hcCwgcmVnLCBidWZfbWF4LCBudW1fcmVncyk7CisKKwkvKiBUcnkgcmVzZXR0aW5nIHRlc3QgbW9kZSBldmVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAqLworCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIExUQzI5NDVfQ09OVFJPTCwgQ09OVFJPTF9URVNUX01PREUsIDApOworCisJcmV0dXJuIHJldCA/IDogY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzI5NDVfc2hvd19ib29sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmF1bHQ7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTFRDMjk0NV9GQVVMVCwgJmZhdWx0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZhdWx0ICY9IGF0dHItPmluZGV4OworCWlmIChmYXVsdCkJCS8qIENsZWFyIHJlcG9ydGVkIGZhdWx0cyBpbiBjaGlwIHJlZ2lzdGVyICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIExUQzI5NDVfRkFVTFQsIGF0dHItPmluZGV4LCAwKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAhIWZhdWx0KTsKK30KKworLyogSW5wdXQgdm9sdGFnZXMgKi8KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9WSU5fSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01JTl9WSU5fVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01BWF9WSU5fVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9sb3dlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NSU5fVklOX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaGlnaGVzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X01BWF9WSU5fSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9yZXNldF9oaXN0b3J5LCBTX0lXVVNSLCBOVUxMLAorCQkJICBsdGMyOTQ1X3Jlc2V0X2hpc3RvcnksIExUQzI5NDVfTUlOX1ZJTl9IKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9BRElOX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBsdGMyOTQ1X3NldF92YWx1ZSwgTFRDMjk0NV9NSU5fQURJTl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUFYX0FESU5fVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9sb3dlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NSU5fQURJTl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2hpZ2hlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDMjk0NV9NQVhfQURJTl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX3Jlc2V0X2hpc3RvcnksIFNfSVdVU1IsIE5VTEwsCisJCQkgIGx0YzI5NDVfcmVzZXRfaGlzdG9yeSwgTFRDMjk0NV9NSU5fQURJTl9IKTsKKworLyogVm9sdGFnZSBhbGFybXMgKi8KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfVklOX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21heF9hbGFybSwgU19JUlVHTywgbHRjMjk0NV9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX1ZJTl9PVik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzI5NDVfc2hvd19ib29sLCBOVUxMLAorCQkJICBGQVVMVF9BRElOX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX21heF9hbGFybSwgU19JUlVHTywgbHRjMjk0NV9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX0FESU5fT1YpOworCisvKiBDdXJyZW50cyAodmlhIHNlbnNlIHJlc2lzdG9yKSAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2lucHV0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfU0VOU0VfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgbHRjMjk0NV9zZXRfdmFsdWUsIExUQzI5NDVfTUlOX1NFTlNFX1RIUkVTX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01BWF9TRU5TRV9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbG93ZXN0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfTUlOX1NFTlNFX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9oaWdoZXN0LCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzI5NDVfTUFYX1NFTlNFX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9yZXNldF9oaXN0b3J5LCBTX0lXVVNSLCBOVUxMLAorCQkJICBsdGMyOTQ1X3Jlc2V0X2hpc3RvcnksIExUQzI5NDVfTUlOX1NFTlNFX0gpOworCisvKiBDdXJyZW50IGFsYXJtcyAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX21pbl9hbGFybSwgU19JUlVHTywgbHRjMjk0NV9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX1NFTlNFX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfU0VOU0VfT1YpOworCisvKiBQb3dlciAqLworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9pbnB1dCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEMyOTQ1X1BPV0VSX0gpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBsdGMyOTQ1X3NldF92YWx1ZSwgTFRDMjk0NV9NSU5fUE9XRVJfVEhSRVNfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBsdGMyOTQ1X3Nob3dfdmFsdWUsCisJCQkgIGx0YzI5NDVfc2V0X3ZhbHVlLCBMVEMyOTQ1X01BWF9QT1dFUl9USFJFU19IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX2lucHV0X2xvd2VzdCwgU19JUlVHTywgbHRjMjk0NV9zaG93X3ZhbHVlLAorCQkJICBOVUxMLCBMVEMyOTQ1X01JTl9QT1dFUl9IKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX2lucHV0X2hpZ2hlc3QsIFNfSVJVR08sIGx0YzI5NDVfc2hvd192YWx1ZSwKKwkJCSAgTlVMTCwgTFRDMjk0NV9NQVhfUE9XRVJfSCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMV9yZXNldF9oaXN0b3J5LCBTX0lXVVNSLCBOVUxMLAorCQkJICBsdGMyOTQ1X3Jlc2V0X2hpc3RvcnksIExUQzI5NDVfTUlOX1BPV0VSX0gpOworCisvKiBQb3dlciBhbGFybXMgKi8KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfUE9XRVJfVVYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGMyOTQ1X3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfUE9XRVJfT1YpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHRjMjk0NV9hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbG93ZXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaGlnaGVzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX3Jlc2V0X2hpc3RvcnkuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbG93ZXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaGlnaGVzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX3Jlc2V0X2hpc3RvcnkuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9sb3dlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2hpZ2hlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX3Jlc2V0X2hpc3RvcnkuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0X2xvd2VzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0X2hpZ2hlc3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9yZXNldF9oaXN0b3J5LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFMobHRjMjk0NSk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBsdGMyOTQ1X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS5tYXhfcmVnaXN0ZXIgPSBMVEMyOTQ1X01JTl9BRElOX1RIUkVTX0wsCit9OworCitzdGF0aWMgaW50IGx0YzI5NDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZsdGMyOTQ1X3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qIENsZWFyIGZhdWx0cyAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIExUQzI5NDVfRkFVTFQsIDB4MDApOworCisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgcmVnbWFwLAorCQkJCQkJCSAgIGx0YzI5NDVfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGMyOTQ1X2lkW10gPSB7CisJeyJsdGMyOTQ1IiwgMH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjMjk0NV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGMyOTQ1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJsdGMyOTQ1IiwKKwkJICAgfSwKKwkucHJvYmUgPSBsdGMyOTQ1X3Byb2JlLAorCS5pZF90YWJsZSA9IGx0YzI5NDVfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihsdGMyOTQ1X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFRDMjk0NSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbHRjNDIxNS5jIGIvZHJpdmVycy9od21vbi9sdGM0MjE1LmMKaW5kZXggOGExNDI5Ni4uYzhhOWJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sdGM0MjE1LmMKKysrIGIvZHJpdmVycy9od21vbi9sdGM0MjE1LmMKQEAgLTMzLDcgKzMzLDcgQEAKIH07CiAKIHN0cnVjdCBsdGM0MjE1X2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWJvb2wgdmFsaWQ7CkBAIC00NSw4ICs0NSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbHRjNDIxNV9kYXRhICpsdGM0MjE1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGx0YzQyMTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBsdGM0MjE1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXMzMiB2YWw7CiAJaW50IGk7CiAKQEAgLTIxNCw3ICsyMTQsNyBAQAogICogRmluYWxseSwgY29uc3RydWN0IGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG1lbWJlcnMgb2YgdGhlIGFib3ZlIG9iamVjdHMsCiAgKiBhcyByZXF1aXJlZCBmb3Igc3lzZnNfY3JlYXRlX2dyb3VwKCkKICAqLwotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyMTVfYXR0cmlidXRlc1tdID0geworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyMTVfYXR0cnNbXSA9IHsKIAkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIApAQCAtMjI5LDU3ICsyMjksMzMgQEAKIAogCU5VTEwsCiB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsdGM0MjE1X2dyb3VwID0gewotCS5hdHRycyA9IGx0YzQyMTVfYXR0cmlidXRlcywKLX07CitBVFRSSUJVVEVfR1JPVVBTKGx0YzQyMTUpOwogCiBzdGF0aWMgaW50IGx0YzQyMTVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgbHRjNDIxNV9kYXRhICpkYXRhOwotCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMVEM0MjE1IGNoaXAgKi8KIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRDNDIxNV9GQVVMVCwgMHgwMCk7CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmx0YzQyMTVfZ3JvdXApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJcmV0ID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIG91dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDIxNV9ncm91cCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsdGM0MjE1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBsdGM0MjE1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDIxNV9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLAorCQkJCQkJCSAgIGx0YzQyMTVfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjE1X2lkW10gPSB7CkBAIC0yOTQsNyArMjcwLDYgQEAKIAkJLm5hbWUJPSAibHRjNDIxNSIsCiAJfSwKIAkucHJvYmUJCT0gbHRjNDIxNV9wcm9iZSwKLQkucmVtb3ZlCQk9IGx0YzQyMTVfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGx0YzQyMTVfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQyMjIuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDIyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzI1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyMjIuYwpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIERyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDIyMiBEdWFsIEhvdCBTd2FwIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR3VlbnRlciBSb2VjaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qIGNoaXAgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTFRDNDIyMl9DT05UUk9MMQkweGQwCisjZGVmaW5lIExUQzQyMjJfQUxFUlQxCQkweGQxCisjZGVmaW5lIExUQzQyMjJfU1RBVFVTMQkJMHhkMgorI2RlZmluZSBMVEM0MjIyX0ZBVUxUMQkJMHhkMworI2RlZmluZSBMVEM0MjIyX0NPTlRST0wyCTB4ZDQKKyNkZWZpbmUgTFRDNDIyMl9BTEVSVDIJCTB4ZDUKKyNkZWZpbmUgTFRDNDIyMl9TVEFUVVMyCQkweGQ2CisjZGVmaW5lIExUQzQyMjJfRkFVTFQyCQkweGQ3CisjZGVmaW5lIExUQzQyMjJfU09VUkNFMQkJMHhkOAorI2RlZmluZSBMVEM0MjIyX1NPVVJDRTIJCTB4ZGEKKyNkZWZpbmUgTFRDNDIyMl9BRElOMQkJMHhkYworI2RlZmluZSBMVEM0MjIyX0FESU4yCQkweGRlCisjZGVmaW5lIExUQzQyMjJfU0VOU0UxCQkweGUwCisjZGVmaW5lIExUQzQyMjJfU0VOU0UyCQkweGUyCisjZGVmaW5lIExUQzQyMjJfQURDX0NPTlRST0wJMHhlNAorCisvKgorICogRmF1bHQgcmVnaXN0ZXIgYml0cworICovCisjZGVmaW5lIEZBVUxUX09WCUJJVCgwKQorI2RlZmluZSBGQVVMVF9VVglCSVQoMSkKKyNkZWZpbmUgRkFVTFRfT0MJQklUKDIpCisjZGVmaW5lIEZBVUxUX1BPV0VSX0JBRAlCSVQoMykKKyNkZWZpbmUgRkFVTFRfRkVUX0JBRAlCSVQoNSkKKworLyogUmV0dXJuIHRoZSB2b2x0YWdlIGZyb20gdGhlIGdpdmVuIHJlZ2lzdGVyIGluIG1WIG9yIG1BICovCitzdGF0aWMgaW50IGx0YzQyMjJfZ2V0X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCB2YWw7CisJdTggYnVmWzJdOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfYnVsa19yZWFkKHJlZ21hcCwgcmVnLCBidWYsIDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdmFsID0gKChidWZbMF0gPDwgOCkgKyBidWZbMV0pID4+IDY7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDNDIyMl9BRElOMToKKwljYXNlIExUQzQyMjJfQURJTjI6CisJCS8qIDEuMjUgbVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBtVi4gKi8KKwkJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QodmFsICogNSwgNCk7CisJCWJyZWFrOworCWNhc2UgTFRDNDIyMl9TT1VSQ0UxOgorCWNhc2UgTFRDNDIyMl9TT1VSQ0UyOgorCQkvKiAzMS4yNSBtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgPSBESVZfUk9VTkRfQ0xPU0VTVCh2YWwgKiAxMjUsIDQpOworCQlicmVhazsKKwljYXNlIExUQzQyMjJfU0VOU0UxOgorCWNhc2UgTFRDNDIyMl9TRU5TRTI6CisJCS8qCisJCSAqIDYyLjUgdVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBjdXJyZW50IGFzIG1lYXN1cmVkIHdpdGgKKwkJICogYW4gMSBtT2htIHNlbnNlIHJlc2lzdG9yLCBpbiBtQS4gSWYgYSBkaWZmZXJlbnQgc2Vuc2UKKwkJICogcmVzaXN0b3IgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IGJ5CisJCSAqIGRpdmlkaW5nIHRoZSByZXBvcnRlZCBjdXJyZW50IGJ5IHRoZSBzZW5zZSByZXNpc3RvciB2YWx1ZQorCQkgKiBpbiBtT2htLgorCQkgKi8KKwkJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QodmFsICogMTI1LCAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyMjJfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWludCB2YWx1ZTsKKworCXZhbHVlID0gbHRjNDIyMl9nZXRfdmFsdWUoZGV2LCBhdHRyLT5pbmRleCk7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHZhbHVlOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyMjJfc2hvd19ib29sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGZhdWx0OworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIGF0dHItPm5yLCAmZmF1bHQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWZhdWx0ICY9IGF0dHItPmluZGV4OworCWlmIChmYXVsdCkJCS8qIENsZWFyIHJlcG9ydGVkIGZhdWx0cyBpbiBjaGlwIHJlZ2lzdGVyICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIGF0dHItPm5yLCBhdHRyLT5pbmRleCwgMCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISFmYXVsdCk7Cit9CisKKy8qIFZvbHRhZ2VzICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgbHRjNDIyMl9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjIyX1NPVVJDRTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyMjJfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDNDIyMl9BRElOMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgbHRjNDIyMl9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjIyX1NPVVJDRTIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfaW5wdXQsIFNfSVJVR08sIGx0YzQyMjJfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDNDIyMl9BRElOMik7CisKKy8qCisgKiBWb2x0YWdlIGFsYXJtcworICogVVYvT1YgZmF1bHRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHZvbHRhZ2UsIGFuZCBwb3dlciBiYWQgYW5kIGZldAorICogZmF1bHRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCB2b2x0YWdlLgorICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4xX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDEsIEZBVUxUX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMSwgRkFVTFRfT1YpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDEsIEZBVUxUX1BPV0VSX0JBRCB8IEZBVUxUX0ZFVF9CQUQpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDIsIEZBVUxUX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjNfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgICBMVEM0MjIyX0ZBVUxUMiwgRkFVTFRfT1YpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDIsIEZBVUxUX1BPV0VSX0JBRCB8IEZBVUxUX0ZFVF9CQUQpOworCisvKiBDdXJyZW50ICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2lucHV0LCBTX0lSVUdPLCBsdGM0MjIyX3Nob3dfdmFsdWUsIE5VTEwsCisJCQkgIExUQzQyMjJfU0VOU0UxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyMjJfc2hvd192YWx1ZSwgTlVMTCwKKwkJCSAgTFRDNDIyMl9TRU5TRTIpOworCisvKiBPdmVyY3VycmVudCBhbGFybSAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGN1cnIxX21heF9hbGFybSwgU19JUlVHTywgbHRjNDIyMl9zaG93X2Jvb2wsIE5VTEwsCisJCQkgICAgTFRDNDIyMl9GQVVMVDEsIEZBVUxUX09DKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyMl9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyMjJfc2hvd19ib29sLCBOVUxMLAorCQkJICAgIExUQzQyMjJfRkFVTFQyLCBGQVVMVF9PQyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjIyX2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMl9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCU5VTEwsCit9OworQVRUUklCVVRFX0dST1VQUyhsdGM0MjIyKTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGx0YzQyMjJfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IExUQzQyMjJfQURDX0NPTlRST0wsCit9OworCitzdGF0aWMgaW50IGx0YzQyMjJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZsdGM0MjIyX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qIENsZWFyIGZhdWx0cyAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIExUQzQyMjJfRkFVTFQxLCAweDAwKTsKKwlyZWdtYXBfd3JpdGUocmVnbWFwLCBMVEM0MjIyX0ZBVUxUMiwgMHgwMCk7CisKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICByZWdtYXAsCisJCQkJCQkJICAgbHRjNDIyMl9ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzQyMjJfaWRbXSA9IHsKKwl7Imx0YzQyMjIiLCAwfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MjIyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQyMjJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImx0YzQyMjIiLAorCQkgICB9LAorCS5wcm9iZSA9IGx0YzQyMjJfcHJvYmUsCisJLmlkX3RhYmxlID0gbHRjNDIyMl9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGx0YzQyMjJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMVEM0MjIyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwppbmRleCBkNDE3MjkzMy4uNjgxYjViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMKKysrIGIvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMKQEAgLTk1LDcgKzk1LDYgQEAKIAkgKiByZWFkaW5ncyBhcyBzdGFsZSBieSBzZXR0aW5nIHRoZW0gdG8gLUVBR0FJTgogCSAqLwogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIDUgKiBIWikpIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJNYXJraW5nIEdQSU9zIGludmFsaWRcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT5ncGlvcyk7IGkrKykKIAkJCWRhdGEtPmdwaW9zW2ldID0gLUVBR0FJTjsKIAl9CkBAIC0xNDEsOCArMTQwLDYgQEAKIAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKIAotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGx0YzQyNDUgdXBkYXRlXG4iKTsKLQogCQkvKiBSZWFkIGNvbnRyb2wgcmVnaXN0ZXJzIC0tIDB4MDAgdG8gMHgwNyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT5jcmVncyk7IGkrKykgewogCQkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgaSk7CkBAIC00NzAsMTkgKzQ2NywxNSBAQAogc3RhdGljIGJvb2wgbHRjNDI0NV91c2VfZXh0cmFfZ3Bpb3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbHRjNDI0NV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKLSNpZmRlZiBDT05GSUdfT0YKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKLSNlbmRpZgogCiAJLyogcHJlZmVyIHBsYXRmb3JtIGRhdGEgKi8KIAlpZiAocGRhdGEpCiAJCXJldHVybiBwZGF0YS0+dXNlX2V4dHJhX2dwaW9zOwogCi0jaWZkZWYgQ09ORklHX09GCiAJLyogZmFsbGJhY2sgb24gT0YgKi8KIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImx0YzQyNDUsdXNlLWV4dHJhLWdwaW9zIiwgTlVMTCkpCiAJCXJldHVybiB0cnVlOwotI2VuZGlmCiAKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC01MTIsMjQgKzUwNSwxMCBAQAogCS8qIEFkZCBzeXNmcyBob29rcyAqLwogCWx0YzQyNDVfc3lzZnNfYWRkX2dyb3VwcyhkYXRhKTsKIAotCWh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcygmY2xpZW50LT5kZXYsCi0JCQkJCQkgICAgICBjbGllbnQtPm5hbWUsIGRhdGEsCi0JCQkJCQkgICAgICBkYXRhLT5ncm91cHMpOwotCWlmIChJU19FUlIoaHdtb25fZGV2KSkKLQkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGh3bW9uX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsdGM0MjQ1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoaHdtb25fZGV2KTsKLQotCXJldHVybiAwOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKCZjbGllbnQtPmRldiwKKwkJCQkJCQkgICBjbGllbnQtPm5hbWUsIGRhdGEsCisJCQkJCQkJICAgZGF0YS0+Z3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjQ1X2lkW10gPSB7CkBAIC01NDQsNyArNTIzLDYgQEAKIAkJLm5hbWUJPSAibHRjNDI0NSIsCiAJfSwKIAkucHJvYmUJCT0gbHRjNDI0NV9wcm9iZSwKLQkucmVtb3ZlCQk9IGx0YzQyNDVfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGx0YzQyNDVfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQyNjAuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDI2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1M2EyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNjAuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIERyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI2MCBJMkMgUG9zaXRpdmUgVm9sdGFnZSBIb3QgU3dhcCBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEd1ZW50ZXIgUm9lY2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisvKiBjaGlwIHJlZ2lzdGVycyAqLworI2RlZmluZSBMVEM0MjYwX0NPTlRST0wJMHgwMAorI2RlZmluZSBMVEM0MjYwX0FMRVJUCTB4MDEKKyNkZWZpbmUgTFRDNDI2MF9TVEFUVVMJMHgwMgorI2RlZmluZSBMVEM0MjYwX0ZBVUxUCTB4MDMKKyNkZWZpbmUgTFRDNDI2MF9TRU5TRQkweDA0CisjZGVmaW5lIExUQzQyNjBfU09VUkNFCTB4MDUKKyNkZWZpbmUgTFRDNDI2MF9BRElOCTB4MDYKKworLyoKKyAqIEZhdWx0IHJlZ2lzdGVyIGJpdHMKKyAqLworI2RlZmluZSBGQVVMVF9PVgkoMSA8PCAwKQorI2RlZmluZSBGQVVMVF9VVgkoMSA8PCAxKQorI2RlZmluZSBGQVVMVF9PQwkoMSA8PCAyKQorI2RlZmluZSBGQVVMVF9QT1dFUl9CQUQJKDEgPDwgMykKKyNkZWZpbmUgRkFVTFRfRkVUX1NIT1JUCSgxIDw8IDUpCisKKy8qIFJldHVybiB0aGUgdm9sdGFnZSBmcm9tIHRoZSBnaXZlbiByZWdpc3RlciBpbiBtViBvciBtQSAqLworc3RhdGljIGludCBsdGM0MjYwX2dldF92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIHJlZywgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDNDI2MF9BRElOOgorCQkvKiAxMCBtViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIG1WLiAqLworCQl2YWwgPSB2YWwgKiAxMDsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjYwX1NPVVJDRToKKwkJLyogNDAwIG1WIHJlc29sdXRpb24uIENvbnZlcnQgdG8gbVYuICovCisJCXZhbCA9IHZhbCAqIDQwMDsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjYwX1NFTlNFOgorCQkvKgorCQkgKiAzMDAgdVYgcmVzb2x1dGlvbi4gQ29udmVydCB0byBjdXJyZW50IGFzIG1lYXN1cmVkIHdpdGgKKwkJICogYW4gMSBtT2htIHNlbnNlIHJlc2lzdG9yLCBpbiBtQS4gSWYgYSBkaWZmZXJlbnQgc2Vuc2UKKwkJICogcmVzaXN0b3IgaXMgaW5zdGFsbGVkLCBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IGJ5CisJCSAqIGRpdmlkaW5nIHRoZSByZXBvcnRlZCBjdXJyZW50IGJ5IHRoZSBzZW5zZSByZXNpc3RvciB2YWx1ZQorCQkgKiBpbiBtT2htLgorCQkgKi8KKwkJdmFsID0gdmFsICogMzAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgc3NpemVfdCBsdGM0MjYwX3Nob3dfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlpbnQgdmFsdWU7CisKKwl2YWx1ZSA9IGx0YzQyNjBfZ2V0X3ZhbHVlKGRldiwgYXR0ci0+aW5kZXgpOworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybiB2YWx1ZTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBsdGM0MjYwX3Nob3dfYm9vbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGZhdWx0OworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExUQzQyNjBfRkFVTFQsICZmYXVsdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmYXVsdCAmPSBhdHRyLT5pbmRleDsKKwlpZiAoZmF1bHQpCQkvKiBDbGVhciByZXBvcnRlZCBmYXVsdHMgaW4gY2hpcCByZWdpc3RlciAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBMVEM0MjYwX0ZBVUxULCBhdHRyLT5pbmRleCwgMCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISFmYXVsdCk7Cit9CisKKy8qIFZvbHRhZ2VzICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgbHRjNDI2MF9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjYwX1NPVVJDRSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgbHRjNDI2MF9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjYwX0FESU4pOworCisvKgorICogVm9sdGFnZSBhbGFybXMKKyAqIFVWL09WIGZhdWx0cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCB2b2x0YWdlLCBhbmQgdGhlIFBPV0VSIEJBRCBhbmQKKyAqIEZFVCBTSE9SVCBmYXVsdHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IHZvbHRhZ2UuCisgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI2MF9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX1VWKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX21heF9hbGFybSwgU19JUlVHTywgbHRjNDI2MF9zaG93X2Jvb2wsIE5VTEwsCisJCQkgIEZBVUxUX09WKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfUE9XRVJfQkFEIHwgRkFVTFRfRkVUX1NIT1JUKTsKKworLyogQ3VycmVudCAodmlhIHNlbnNlIHJlc2lzdG9yKSAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyMV9pbnB1dCwgU19JUlVHTywgbHRjNDI2MF9zaG93X3ZhbHVlLCBOVUxMLAorCQkJICBMVEM0MjYwX1NFTlNFKTsKKworLyogT3ZlcmN1cnJlbnQgYWxhcm0gKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfbWF4X2FsYXJtLCBTX0lSVUdPLCBsdGM0MjYwX3Nob3dfYm9vbCwgTlVMTCwKKwkJCSAgRkFVTFRfT0MpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHRjNDI2MF9hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFMobHRjNDI2MCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBsdGM0MjYwX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS5tYXhfcmVnaXN0ZXIgPSBMVEM0MjYwX0FESU4sCit9OworCitzdGF0aWMgaW50IGx0YzQyNjBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZsdGM0MjYwX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qIENsZWFyIGZhdWx0cyAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIExUQzQyNjBfRkFVTFQsIDB4MDApOworCisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgcmVnbWFwLAorCQkJCQkJCSAgIGx0YzQyNjBfZ3JvdXBzKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjYwX2lkW10gPSB7CisJeyJsdGM0MjYwIiwgMH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjNDI2MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGM0MjYwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJsdGM0MjYwIiwKKwkJICAgfSwKKwkucHJvYmUgPSBsdGM0MjYwX3Byb2JlLAorCS5pZF90YWJsZSA9IGx0YzQyNjBfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihsdGM0MjYwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFRDNDI2MCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MTY2OC5jIGIvZHJpdmVycy9od21vbi9tYXgxNjY4LmMKaW5kZXggMDI5YjY1ZS4uZTNlZDBhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXgxNjY4LmMKKysrIGIvZHJpdmVycy9od21vbi9tYXgxNjY4LmMKQEAgLTY2LDcgKzY2LDggQEAKIGVudW0gY2hpcHMgeyBtYXgxNjY4LCBtYXgxODA1LCBtYXgxOTg5IH07CiAKIHN0cnVjdCBtYXgxNjY4X2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmdyb3Vwc1szXTsKIAllbnVtIGNoaXBzIHR5cGU7CiAKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CkBAIC04Miw4ICs4Myw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWF4MTY2OF9kYXRhICptYXgxNjY4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBtYXgxNjY4X2RhdGEgKnJldCA9IGRhdGE7CiAJczMyIHZhbDsKIAlpbnQgaTsKQEAgLTIwNSw4ICsyMDYsOCBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJbG9uZyB0ZW1wOwogCWludCByZXQ7CiAKQEAgLTIxNiwxMCArMjE3LDExIEBACiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZGF0YS0+dGVtcF9tYXhbaW5kZXhdID0gY2xhbXBfdmFsKHRlbXAvMTAwMCwgLTEyOCwgMTI3KTsKLQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCU1BWDE2NjhfUkVHX0xJTUhfV1IoaW5kZXgpLAotCQkJCQlkYXRhLT50ZW1wX21heFtpbmRleF0pKQotCQljb3VudCA9IC1FSU87CisJCQkJCWRhdGEtPnRlbXBfbWF4W2luZGV4XSk7CisJaWYgKHJldCA8IDApCisJCWNvdW50ID0gcmV0OwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMjMwLDggKzIzMiw4IEBACiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlsb25nIHRlbXA7CiAJaW50IHJldDsKIApAQCAtMjQxLDEwICsyNDMsMTEgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT50ZW1wX21pbltpbmRleF0gPSBjbGFtcF92YWwodGVtcC8xMDAwLCAtMTI4LCAxMjcpOwotCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkJTUFYMTY2OF9SRUdfTElNTF9XUihpbmRleCksCi0JCQkJCWRhdGEtPnRlbXBfbWluW2luZGV4XSkpCi0JCWNvdW50ID0gLUVJTzsKKwkJCQkJZGF0YS0+dGVtcF9taW5baW5kZXhdKTsKKwlpZiAocmV0IDwgMCkKKwkJY291bnQgPSByZXQ7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC00MDUsNjAgKzQwOCwyOSBAQAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhOwotCWludCBlcnI7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbWF4MTY2OF9kYXRhKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXgxNjY4X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCWRhdGEtPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX2NvbW1vbik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKLQkJCQkJICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycm9yX3N5c3JlbTA7Ci0JfQotCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKLQkJZ290byBlcnJvcl9zeXNyZW0xOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJvcl9zeXNyZW0xOgorCS8qIHN5c2ZzIGhvb2tzICovCisJZGF0YS0+Z3JvdXBzWzBdID0gJm1heDE2NjhfZ3JvdXBfY29tbW9uOwogCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7Ci1lcnJvcl9zeXNyZW0wOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfY29tbW9uKTsKLQlyZXR1cm4gZXJyOwotfQorCQlkYXRhLT5ncm91cHNbMV0gPSAmbWF4MTY2OF9ncm91cF91bmlxdWU7CiAKLXN0YXRpYyBpbnQgbWF4MTY2OF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX2NvbW1vbik7Ci0KLQlyZXR1cm4gMDsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLCBkYXRhLT5ncm91cHMpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1heDE2NjhfaWRbXSA9IHsKQEAgLTQ3Niw3ICs0NDgsNiBAQAogCQkgIC5uYW1lCT0gIm1heDE2NjgiLAogCQkgIH0sCiAJLnByb2JlID0gbWF4MTY2OF9wcm9iZSwKLQkucmVtb3ZlCT0gbWF4MTY2OF9yZW1vdmUsCiAJLmlkX3RhYmxlID0gbWF4MTY2OF9pZCwKIAkuZGV0ZWN0CT0gbWF4MTY2OF9kZXRlY3QsCiAJLmFkZHJlc3NfbGlzdCA9IG1heDE2NjhfYWRkcl9saXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXg2NjM5LmMgYi9kcml2ZXJzL2h3bW9uL21heDY2MzkuYwppbmRleCAwNjZlNTg3Li43MDY1MGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDY2MzkuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDY2MzkuYwpAQCAtODAsNyArODAsNyBAQAogICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKICAqLwogc3RydWN0IG1heDY2MzlfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwpAQCAtMTA0LDggKzEwNCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWF4NjYzOV9kYXRhICptYXg2NjM5X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBtYXg2NjM5X2RhdGEgKnJldCA9IGRhdGE7CiAJaW50IGk7CiAJaW50IHN0YXR1c19yZWc7CkBAIC0xOTEsOSArMTkxLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+dGVtcF90aGVybVthdHRyLT5pbmRleF0gKiAxMDAwKSk7CiB9CkBAIC0yMDIsOSArMjAxLDkgQEAKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldl9hdHRyKTsKKwlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmVzOwogCkBAIC0yMjQsOSArMjIzLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT50ZW1wX2FsZXJ0W2F0dHItPmluZGV4XSAqIDEwMDApKTsKIH0KQEAgLTIzNSw5ICsyMzMsOSBAQAogCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJlczsKIApAQCAtMjU4LDkgKzI1Niw4IEBACiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLAogCQkJCSAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+dGVtcF9vdFthdHRyLT5pbmRleF0gKiAxMDAwKSk7CiB9CkBAIC0yNjksOSArMjY2LDkgQEAKIAkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwKIAkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZfYXR0cik7CisJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJlczsKIApAQCAtMjkxLDkgKzI4OCw4IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2X2F0dHIpOworCXN0cnVjdCBtYXg2NjM5X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5wd21bYXR0ci0+aW5kZXhdICogMjU1IC8gMTIwKTsKIH0KQEAgLTMwMiw5ICsyOTgsOSBAQAogCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldl9hdHRyKTsKKwlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmVzOwogCkBAIC0zNzgsNyArMzc0LDcgQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZW1lcmdlbmN5X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKIAogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4NjYzOV9hdHRyaWJ1dGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4NjYzOV9hdHRyc1tdID0gewogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9mYXVsdC5kZXZfYXR0ci5hdHRyLApAQCAtNDAzLDEwICszOTksNyBAQAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZW1lcmdlbmN5X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJTlVMTAogfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4NjYzOV9ncm91cCA9IHsKLQkuYXR0cnMgPSBtYXg2NjM5X2F0dHJpYnV0ZXMsCi19OworQVRUUklCVVRFX0dST1VQUyhtYXg2NjM5KTsKIAogLyoKICAqICByZXR1cm5zIHJlc3BlY3RpdmUgaW5kZXggaW4gcnBtX3JhbmdlcyB0YWJsZQpAQCAtNDI0LDkgKzQxNyw5IEBACiAJcmV0dXJuIDE7IC8qIGRlZmF1bHQ6IDQwMDAgUlBNICovCiB9CiAKLXN0YXRpYyBpbnQgbWF4NjYzOV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtYXg2NjM5X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IG1heDY2MzlfcGxhdGZvcm1fZGF0YSAqbWF4NjYzOV9pbmZvID0KIAkJZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwogCWludCBpOwpAQCAtNTQ1LDUwICs1MzgsMjcgQEAKIHN0YXRpYyBpbnQgbWF4NjYzOV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IG1heDY2MzlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJaW50IGVycjsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IG1heDY2MzlfZGF0YSksCi0JCQkgICAgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbWF4NjYzOV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBtYXg2NjM5IGNoaXAgKi8KLQllcnIgPSBtYXg2NjM5X2luaXRfY2xpZW50KGNsaWVudCk7CisJZXJyID0gbWF4NjYzOV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXg2NjM5X2dyb3VwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKLQkJZ290byBlcnJvcl9yZW1vdmU7Ci0JfQotCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAidGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBmYW4gY29udHJvbCBmb3VuZFxuIik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3JfcmVtb3ZlOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2MzlfZ3JvdXApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NjYzOV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4NjYzOV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2MzlfZ3JvdXApOwotCi0JcmV0dXJuIDA7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJICAgZGF0YSwKKwkJCQkJCQkgICBtYXg2NjM5X2dyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC02MjIsOSArNTkyLDcgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDY2MzlfaWQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbWF4NjYzOV9wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMobWF4NjYzOV9zdXNwZW5kLCBtYXg2NjM5X3Jlc3VtZSkKLX07CitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWF4NjYzOV9wbV9vcHMsIG1heDY2Mzlfc3VzcGVuZCwgbWF4NjYzOV9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NjYzOV9kcml2ZXIgPSB7CiAJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLApAQCAtNjMzLDcgKzYwMSw2IEBACiAJCSAgIC5wbSA9ICZtYXg2NjM5X3BtX29wcywKIAkJICAgfSwKIAkucHJvYmUgPSBtYXg2NjM5X3Byb2JlLAotCS5yZW1vdmUgPSBtYXg2NjM5X3JlbW92ZSwKIAkuaWRfdGFibGUgPSBtYXg2NjM5X2lkLAogCS5kZXRlY3QgPSBtYXg2NjM5X2RldGVjdCwKIAkuYWRkcmVzc19saXN0ID0gbm9ybWFsX2kyYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4NjY1MC5jIGIvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKaW5kZXggMGNhZmMzOS4uMTYyYTUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKKysrIGIvZHJpdmVycy9od21vbi9tYXg2NjUwLmMKQEAgLTEwNSwzOCArMTA1LDEzIEBACiAKICNkZWZpbmUgRElWX0ZST01fUkVHKHJlZykgKDEgPDwgKHJlZyAmIDcpKQogCi1zdGF0aWMgaW50IG1heDY2NTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotc3RhdGljIGludCBtYXg2NjUwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotc3RhdGljIGludCBtYXg2NjUwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLXN0YXRpYyBzdHJ1Y3QgbWF4NjY1MF9kYXRhICptYXg2NjUwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKLQotLyoKLSAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1heDY2NTBfaWRbXSA9IHsKLQl7ICJtYXg2NjUwIiwgMSB9LAotCXsgIm1heDY2NTEiLCA0IH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDY2NTBfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NjY1MF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAibWF4NjY1MCIsCi0JfSwKLQkucHJvYmUJCT0gbWF4NjY1MF9wcm9iZSwKLQkucmVtb3ZlCQk9IG1heDY2NTBfcmVtb3ZlLAotCS5pZF90YWJsZQk9IG1heDY2NTBfaWQsCi19OwotCiAvKgogICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKICAqLwogCiBzdHJ1Y3QgbWF4NjY1MF9kYXRhIHsKLQlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpncm91cHNbM107CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWludCBucl9mYW5zOwogCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KQEAgLTE1MSw2ICsxMjYsNTEgQEAKIAl1OCBhbGFybTsKIH07CiAKK3N0YXRpYyBjb25zdCB1OCB0YWNoX3JlZ1tdID0geworCU1BWDY2NTBfUkVHX1RBQ0gwLAorCU1BWDY2NTBfUkVHX1RBQ0gxLAorCU1BWDY2NTBfUkVHX1RBQ0gyLAorCU1BWDY2NTBfUkVHX1RBQ0gzLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXg2NjUwX2RhdGEgKm1heDY2NTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRhdGEtPnNwZWVkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICAgICBNQVg2NjUwX1JFR19TUEVFRCk7CisJCWRhdGEtPmNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJTUFYNjY1MF9SRUdfQ09ORklHKTsKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yX2ZhbnM7IGkrKykgeworCQkJZGF0YS0+dGFjaFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJCSB0YWNoX3JlZ1tpXSk7CisJCX0KKwkJZGF0YS0+Y291bnQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJCU1BWDY2NTBfUkVHX0NPVU5UKTsKKwkJZGF0YS0+ZGFjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfREFDKTsKKworCQkvKgorCQkgKiBBbGFybXMgYXJlIGNsZWFyZWQgb24gcmVhZCBpbiBjYXNlIHRoZSBjb25kaXRpb24gdGhhdAorCQkgKiBjYXVzZWQgdGhlIGFsYXJtIGlzIHJlbW92ZWQuIEtlZXAgdGhlIHZhbHVlIGxhdGNoZWQgaGVyZQorCQkgKiBmb3IgcHJvdmlkaW5nIHRoZSByZWdpc3RlciB0aHJvdWdoIGRpZmZlcmVudCBhbGFybSBmaWxlcy4KKwkJICovCisJCWRhdGEtPmFsYXJtIHw9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJTUFYNjY1MF9SRUdfQUxBUk0pOworCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCiBzdGF0aWMgc3NpemVfdCBnZXRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCSAgICAgICBjaGFyICpidWYpCiB7CkBAIC0yMzUsOCArMjU1LDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlpbnQga3NjYWxlLCBrdGFjaDsKIAl1bnNpZ25lZCBsb25nIHJwbTsKIAlpbnQgZXJyOwpAQCAtMzA0LDggKzMyNCw4IEBACiBzdGF0aWMgc3NpemVfdCBzZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAl1bnNpZ25lZCBsb25nIHB3bTsKIAlpbnQgZXJyOwogCkBAIC0zNTAsOCArMzcwLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJaW50IG1heDY2NTBfbW9kZXNbM10gPSB7MCwgMywgMn07CiAJdW5zaWduZWQgbG9uZyBtb2RlOwogCWludCBlcnI7CkBAIC00MDAsOCArNDIwLDggQEAKIHN0YXRpYyBzc2l6ZV90IHNldF9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgZGl2OwogCWludCBlcnI7CiAKQEAgLTQ0Niw3ICs0NjYsNyBAQAogewogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKIAlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gbWF4NjY1MF91cGRhdGVfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCWludCBhbGFybSA9IDA7CiAKIAlpZiAoZGF0YS0+YWxhcm0gJiBhdHRyLT5pbmRleCkgewpAQCAtNDg0LDcgKzUwNCw4IEBACiAJCQkJICAgIGludCBuKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXU4IGFsYXJtX2VuID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQUxBUk1fRU4pOwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyOwogCkBAIC01MTksNyArNTQwLDcgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXg2NjUwX2F0dHJfZ3JwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4NjY1MF9ncm91cCA9IHsKIAkuYXR0cnMgPSBtYXg2NjUwX2F0dHJzLAogCS5pc192aXNpYmxlID0gbWF4NjY1MF9hdHRyc192aXNpYmxlLAogfTsKQEAgLTUzMSw3ICs1NTIsNyBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1heDY2NTFfYXR0cl9ncnAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXg2NjUxX2dyb3VwID0gewogCS5hdHRycyA9IG1heDY2NTFfYXR0cnMsCiB9OwogCkBAIC01MzksNzQgKzU2MCwxNyBAQAogICogUmVhbCBjb2RlCiAgKi8KIAotc3RhdGljIGludCBtYXg2NjUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBtYXg2NjUwX2luaXRfY2xpZW50KHN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhOwotCWludCBlcnI7Ci0KLQlkYXRhID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBtYXg2NjUwX2RhdGEpLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm91dCBvZiBtZW1vcnkuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7Ci0JbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPm5yX2ZhbnMgPSBpZC0+ZHJpdmVyX2RhdGE7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIG1heDY2NTAgY2hpcAotCSAqLwotCWVyciA9IG1heDY2NTBfaW5pdF9jbGllbnQoY2xpZW50KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MF9hdHRyX2dycCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQkvKiAzIGFkZGl0aW9uYWwgZmFuIGlucHV0cyBmb3IgdGhlIE1BWDY2NTEgKi8KLQlpZiAoZGF0YS0+bnJfZmFucyA9PSA0KSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTFfYXR0cl9ncnApOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfcmVtb3ZlOwotCX0KLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOwotCWlmICghSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpCi0JCXJldHVybiAwOwotCi0JZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZXJyb3IgcmVnaXN0ZXJpbmcgaHdtb24gZGV2aWNlLlxuIik7Ci0JaWYgKGRhdGEtPm5yX2ZhbnMgPT0gNCkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4NjY1MV9hdHRyX2dycCk7Ci1lcnJfcmVtb3ZlOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTBfYXR0cl9ncnApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NjY1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCWlmIChkYXRhLT5ucl9mYW5zID09IDQpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTFfYXR0cl9ncnApOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDY2NTBfYXR0cl9ncnApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1heDY2NTBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCWludCBjb25maWc7CiAJaW50IGVyciA9IC1FSU87CiAKIAljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19DT05GSUcpOwogCiAJaWYgKGNvbmZpZyA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIGNvbmZpZywgYWJvcnRpbmcuXG4iKTsKKwkJZGV2X2VycihkZXYsICJFcnJvciByZWFkaW5nIGNvbmZpZywgYWJvcnRpbmcuXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTYyMCwxMSArNTg0LDExIEBACiAJCWNvbmZpZyB8PSBNQVg2NjUwX0NGR19WMTI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaWxsZWdhbCB2YWx1ZSBmb3IgZmFuX3ZvbHRhZ2UgKCVkKVxuIiwKKwkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBmYW5fdm9sdGFnZSAoJWQpXG4iLAogCQkJZmFuX3ZvbHRhZ2UpOwogCX0KIAotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkZhbiB2b2x0YWdlIGlzIHNldCB0byAlZFYuXG4iLAorCWRldl9pbmZvKGRldiwgIkZhbiB2b2x0YWdlIGlzIHNldCB0byAlZFYuXG4iLAogCQkgKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX1YxMikgPyAxMiA6IDUpOwogCiAJc3dpdGNoIChwcmVzY2FsZXIpIHsKQEAgLTY1MCwxMSArNjE0LDEwIEBACiAJCQkgfCBNQVg2NjUwX0NGR19QUkVTQ0FMRVJfMTY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaWxsZWdhbCB2YWx1ZSBmb3IgcHJlc2NhbGVyICglZClcbiIsCi0JCQlwcmVzY2FsZXIpOworCQlkZXZfZXJyKGRldiwgImlsbGVnYWwgdmFsdWUgZm9yIHByZXNjYWxlciAoJWQpXG4iLCBwcmVzY2FsZXIpOwogCX0KIAotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlByZXNjYWxlciBpcyBzZXQgdG8gJWQuXG4iLAorCWRldl9pbmZvKGRldiwgIlByZXNjYWxlciBpcyBzZXQgdG8gJWQuXG4iLAogCQkgMSA8PCAoY29uZmlnICYgTUFYNjY1MF9DRkdfUFJFU0NBTEVSX01BU0spKTsKIAogCS8qCkBAIC02NjQsMTcgKzYyNywxNyBAQAogCSAqLwogCiAJaWYgKChjb25maWcgJiBNQVg2NjUwX0NGR19NT0RFX01BU0spID09IE1BWDY2NTBfQ0ZHX01PREVfT0ZGKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiQ2hhbmdlIG1vZGUgdG8gb3BlbiBsb29wLCBmdWxsIG9mZi5cbiIpOworCQlkZXZfZGJnKGRldiwgIkNoYW5nZSBtb2RlIHRvIG9wZW4gbG9vcCwgZnVsbCBvZmYuXG4iKTsKIAkJY29uZmlnID0gKGNvbmZpZyAmIH5NQVg2NjUwX0NGR19NT0RFX01BU0spCiAJCQkgfCBNQVg2NjUwX0NGR19NT0RFX09QRU5fTE9PUDsKIAkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19EQUMsIDI1NSkpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiREFDIHdyaXRlIGVycm9yLCBhYm9ydGluZy5cbiIpOworCQkJZGV2X2VycihkZXYsICJEQUMgd3JpdGUgZXJyb3IsIGFib3J0aW5nLlxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19DT05GSUcsIGNvbmZpZykpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDb25maWcgd3JpdGUgZXJyb3IsIGFib3J0aW5nLlxuIik7CisJCWRldl9lcnIoZGV2LCAiQ29uZmlnIHdyaXRlIGVycm9yLCBhYm9ydGluZy5cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjg0LDUxICs2NDcsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHU4IHRhY2hfcmVnW10gPSB7Ci0JTUFYNjY1MF9SRUdfVEFDSDAsCi0JTUFYNjY1MF9SRUdfVEFDSDEsCi0JTUFYNjY1MF9SRUdfVEFDSDIsCi0JTUFYNjY1MF9SRUdfVEFDSDMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1heDY2NTBfZGF0YSAqbWF4NjY1MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbWF4NjY1MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgaTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJaW50IGVycjsKIAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXg2NjUwX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgewotCQlkYXRhLT5zcGVlZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgICAgICAgTUFYNjY1MF9SRUdfU1BFRUQpOwotCQlkYXRhLT5jb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJCU1BWDY2NTBfUkVHX0NPTkZJRyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucl9mYW5zOyBpKyspIHsKLQkJCWRhdGEtPnRhY2hbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJCQkgdGFjaF9yZWdbaV0pOwotCQl9Ci0JCWRhdGEtPmNvdW50ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCQlNQVg2NjUwX1JFR19DT1VOVCk7Ci0JCWRhdGEtPmRhYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0RBQyk7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5ucl9mYW5zID0gaWQtPmRyaXZlcl9kYXRhOwogCi0JCS8qCi0JCSAqIEFsYXJtcyBhcmUgY2xlYXJlZCBvbiByZWFkIGluIGNhc2UgdGhlIGNvbmRpdGlvbiB0aGF0Ci0JCSAqIGNhdXNlZCB0aGUgYWxhcm0gaXMgcmVtb3ZlZC4gS2VlcCB0aGUgdmFsdWUgbGF0Y2hlZCBoZXJlCi0JCSAqIGZvciBwcm92aWRpbmcgdGhlIHJlZ2lzdGVyIHRocm91Z2ggZGlmZmVyZW50IGFsYXJtIGZpbGVzLgotCQkgKi8KLQkJZGF0YS0+YWxhcm0gfD0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCQlNQVg2NjUwX1JFR19BTEFSTSk7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBtYXg2NjUwIGNoaXAKKwkgKi8KKwllcnIgPSBtYXg2NjUwX2luaXRfY2xpZW50KGRhdGEsIGNsaWVudCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwotCQlkYXRhLT52YWxpZCA9IDE7Ci0JfQorCWRhdGEtPmdyb3Vwc1swXSA9ICZtYXg2NjUwX2dyb3VwOworCS8qIDMgYWRkaXRpb25hbCBmYW4gaW5wdXRzIGZvciB0aGUgTUFYNjY1MSAqLworCWlmIChkYXRhLT5ucl9mYW5zID09IDQpCisJCWRhdGEtPmdyb3Vwc1sxXSA9ICZtYXg2NjUxX2dyb3VwOwogCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gZGF0YTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsCisJCQkJCQkJICAgY2xpZW50LT5uYW1lLCBkYXRhLAorCQkJCQkJCSAgIGRhdGEtPmdyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4NjY1MF9pZFtdID0geworCXsgIm1heDY2NTAiLCAxIH0sCisJeyAibWF4NjY1MSIsIDQgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4NjY1MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2NjUwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJtYXg2NjUwIiwKKwl9LAorCS5wcm9iZQkJPSBtYXg2NjUwX3Byb2JlLAorCS5pZF90YWJsZQk9IG1heDY2NTBfaWQsCit9OworCiBtb2R1bGVfaTJjX2RyaXZlcihtYXg2NjUwX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkhhbnMgSi4gS29jaCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9sdGMyOTc4LmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2x0YzI5NzguYwppbmRleCBkZTNjMTUyLi5lMjRlZDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzL2x0YzI5NzguYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2x0YzI5NzguYwpAQCAtMSw5ICsxLDkgQEAKIC8qCiAgKiBIYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlciBmb3IgTFRDMjk3NCwgTFRDMjk3NywgTFRDMjk3OCwgTFRDMzg4MCwKLSAqIGFuZCBMVEMzODgzCisgKiBMVEMzODgzLCBhbmQgTFRNNDY3NgogICoKICAqIENvcHlyaWdodCAoYykgMjAxMSBFcmljc3NvbiBBQi4KLSAqIENvcHlyaWdodCAoYykgMjAxMyBHdWVudGVyIFJvZWNrCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQgR3VlbnRlciBSb2VjawogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTQsMTAgKzE0LDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yOCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAotZW51bSBjaGlwcyB7IGx0YzI5NzQsIGx0YzI5NzcsIGx0YzI5NzgsIGx0YzM4ODAsIGx0YzM4ODMgfTsKK2VudW0gY2hpcHMgeyBsdGMyOTc0LCBsdGMyOTc3LCBsdGMyOTc4LCBsdGMzODgwLCBsdGMzODgzLCBsdG00Njc2IH07CiAKIC8qIENvbW1vbiBmb3IgYWxsIGNoaXBzICovCiAjZGVmaW5lIExUQzI5NzhfTUZSX1ZPVVRfUEVBSwkJMHhkZApAQCAtNDUsNyArNDEsNyBAQAogI2RlZmluZSBMVEMyOTc0X01GUl9JT1VUX1BFQUsJCTB4ZDcKICNkZWZpbmUgTFRDMjk3NF9NRlJfSU9VVF9NSU4JCTB4ZDgKIAotLyogTFRDMzg4MCBhbmQgTFRDMzg4MyAqLworLyogTFRDMzg4MCwgTFRDMzg4MywgYW5kIExUTTQ2NzYgKi8KICNkZWZpbmUgTFRDMzg4MF9NRlJfSU9VVF9QRUFLCQkweGQ3CiAjZGVmaW5lIExUQzM4ODBfTUZSX0NMRUFSX1BFQUtTCQkweGUzCiAjZGVmaW5lIExUQzM4ODBfTUZSX1RFTVBFUkFUVVJFMl9QRUFLCTB4ZjQKQEAgLTUzLDcgKzQ5LDggQEAKIC8qIExUQzM4ODMgb25seSAqLwogI2RlZmluZSBMVEMzODgzX01GUl9JSU5fUEVBSwkJMHhlMQogCi0jZGVmaW5lIExUQzI5NzRfSUQJCQkweDAyMTIKKyNkZWZpbmUgTFRDMjk3NF9JRF9SRVYxCQkJMHgwMjEyCisjZGVmaW5lIExUQzI5NzRfSURfUkVWMgkJCTB4MDIxMwogI2RlZmluZSBMVEMyOTc3X0lECQkJMHgwMTMwCiAjZGVmaW5lIExUQzI5NzhfSURfUkVWMQkJCTB4MDEyMQogI2RlZmluZSBMVEMyOTc4X0lEX1JFVjIJCQkweDAxMjIKQEAgLTYyLDYgKzU5LDggQEAKICNkZWZpbmUgTFRDMzg4MF9JRF9NQVNLCQkJMHhmZjAwCiAjZGVmaW5lIExUQzM4ODNfSUQJCQkweDQzMDAKICNkZWZpbmUgTFRDMzg4M19JRF9NQVNLCQkJMHhmZjAwCisjZGVmaW5lIExUTTQ2NzZfSUQJCQkweDQ0ODAJLyogZGF0YXNoZWV0IGNsYWltcyAweDQ0MFggKi8KKyNkZWZpbmUgTFRNNDY3Nl9JRF9NQVNLCQkJMHhmZmYwCiAKICNkZWZpbmUgTFRDMjk3NF9OVU1fUEFHRVMJCTQKICNkZWZpbmUgTFRDMjk3OF9OVU1fUEFHRVMJCTgKQEAgLTM3MCw2ICszNjksNyBAQAogCXsibHRjMjk3OCIsIGx0YzI5Nzh9LAogCXsibHRjMzg4MCIsIGx0YzM4ODB9LAogCXsibHRjMzg4MyIsIGx0YzM4ODN9LAorCXsibHRtNDY3NiIsIGx0bTQ2NzZ9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGx0YzI5NzhfaWQpOwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJaWYgKGNoaXBfaWQgPCAwKQogCQlyZXR1cm4gY2hpcF9pZDsKIAotCWlmIChjaGlwX2lkID09IExUQzI5NzRfSUQpIHsKKwlpZiAoY2hpcF9pZCA9PSBMVEMyOTc0X0lEX1JFVjEgfHwgY2hpcF9pZCA9PSBMVEMyOTc0X0lEX1JFVjIpIHsKIAkJZGF0YS0+aWQgPSBsdGMyOTc0OwogCX0gZWxzZSBpZiAoY2hpcF9pZCA9PSBMVEMyOTc3X0lEKSB7CiAJCWRhdGEtPmlkID0gbHRjMjk3NzsKQEAgLTQwNSw2ICs0MDUsOCBAQAogCQlkYXRhLT5pZCA9IGx0YzM4ODA7CiAJfSBlbHNlIGlmICgoY2hpcF9pZCAmIExUQzM4ODNfSURfTUFTSykgPT0gTFRDMzg4M19JRCkgewogCQlkYXRhLT5pZCA9IGx0YzM4ODM7CisJfSBlbHNlIGlmICgoY2hpcF9pZCAmIExUTTQ2NzZfSURfTUFTSykgPT0gTFRNNDY3Nl9JRCkgeworCQlkYXRhLT5pZCA9IGx0bTQ2NzY7CiAJfSBlbHNlIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbnN1cHBvcnRlZCBjaGlwIElEIDB4JXhcbiIsIGNoaXBfaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ1OCw2ICs0NjAsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgbHRjMzg4MDoKKwljYXNlIGx0bTQ2NzY6CiAJCWluZm8tPnJlYWRfd29yZF9kYXRhID0gbHRjMzg4MF9yZWFkX3dvcmRfZGF0YTsKIAkJaW5mby0+cGFnZXMgPSBMVEMzODgwX05VTV9QQUdFUzsKIAkJaW5mby0+ZnVuY1swXSA9IFBNQlVTX0hBVkVfVklOIHwgUE1CVVNfSEFWRV9JSU4KQEAgLTUwMCw1ICs1MDMsNSBAQAogbW9kdWxlX2kyY19kcml2ZXIobHRjMjk3OF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJHdWVudGVyIFJvZWNrIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBNQnVzIGRyaXZlciBmb3IgTFRDMjk3NCwgTFRDMjk3OCwgTFRDMzg4MCwgYW5kIExUQzM4ODMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUE1CdXMgZHJpdmVyIGZvciBMVEMyOTc0LCBMVEMyOTc4LCBMVEMzODgwLCBMVEMzODgzLCBhbmQgTFRNNDY3NiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbW02NjUuYyBiL2RyaXZlcnMvaHdtb24vc21tNjY1LmMKaW5kZXggZDllMWI3ZC4uNGVmNTgwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbW02NjUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIDApOwogCWlmIChydiA8IDApIHsKIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBBREMgdmFsdWU6IGVycm9yICVkIiwgcnYpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBydjsKIAl9CiAJLyoKIAkgKiBWYWxpZGF0ZS92ZXJpZnkgcmVhZGJhY2sgYWRjIGNoYW5uZWwgKGluIGJpdCAxMS4uMTQpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMKaW5kZXggYmU3ZjBhMi4uZjNiODlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jCkBAIC0zOSw3ICszOSw5IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8YXNtL2NwbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYwppbmRleCBiZmVjMzEzLi5hN2U2OGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYwpAQCAtNDUxLDkgKzQ1MSw5IEBACiAJLnR5cGUgPSBJSU9fQUNDRUwsCQkJCQkJXAogCS5tb2RpZmllZCA9IDEsCQkJCQkJCVwKIAkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjX2F4aXMsCQkJCQlcCi0JLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCQlcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CQlcCiAJCUJJVChJSU9fQ0hBTl9JTkZPX0xPV19QQVNTX0ZJTFRFUl8zREJfRlJFUVVFTkNZKSwJXAotCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCQlcCiAJLnNjYW5faW5kZXggPSBBWElTXyMjX2F4aXMsCQkJCQlcCiAJLnNjYW5fdHlwZSA9IHsJCQkJCQkJXAogCQkuc2lnbiA9ICdzJywJCQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCmluZGV4IDIyMDlmMjguLjRiZjRjMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCkBAIC0xNTUsNiArMTU1LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIG1jcDM0MjIuCiAKK2NvbmZpZyBNRU5fWjE4OF9BREMKKwl0cmlzdGF0ZSAiTUVOIDE2ejE4OCBBREMgSVAgQ29yZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUNCCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgTUVOIDE2ejE4OCBBREMgSVAtQ29yZSBvbiBhIE1DQgorCSAgY2Fycmllci4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBtZW5fejE4OF9hZGMuCisKIGNvbmZpZyBOQVU3ODAyCiAJdHJpc3RhdGUgIk51dm90b24gTkFVNzgwMiBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC0xOTcsNiArMjA3LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIHR3bDYwMzAtZ3BhZGMuCiAKK2NvbmZpZyBWRjYxMF9BREMKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIHZmNjEwIEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBPRgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IGZvciBWeWJyaWQgYm9hcmQgYW5hbG9nLXRvLWRpZ2l0YWwgY29udmVydGVyLgorCSAgU2luY2UgdGhlIElQIGlzIHVzZWQgZm9yIGkuTVg2U0xYLCB0aGUgZHJpdmVyIGFsc28gc3VwcG9ydCBpLk1YNlNMWC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB2ZjYxMF9hZGMuCisKIGNvbmZpZyBWSVBFUkJPQVJEX0FEQwogCXRyaXN0YXRlICJWaXBlcmJvYXJkIEFEQyBzdXBwb3J0IgogCWRlcGVuZHMgb24gTUZEX1ZJUEVSQk9BUkQgJiYgVVNCCkBAIC0yMDQsNCArMjI0LDE3IEBACiAJICBTYXkgeWVzIGhlcmUgdG8gYWNjZXNzIHRoZSBBREMgcGFydCBvZiB0aGUgTmFubyBSaXZlcgogCSAgVGVjaG5vbG9naWVzIFZpcGVyYm9hcmQuCiAKK2NvbmZpZyBYSUxJTlhfWEFEQworCXRyaXN0YXRlICJYaWxpbnggWEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX1pZTlEgfHwgTUlDUk9CTEFaRSB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEhBU19JT01FTQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGhhdmUgc3VwcG9ydCBmb3IgdGhlIFhpbGlueCBYQURDLiBUaGUgZHJpdmVyIGRvZXMgc3VwcG9ydAorCSAgYm90aCB0aGUgWllOUSBpbnRlcmZhY2UgdG8gdGhlIFhBREMgYXMgd2VsbCBhcyB0aGUgQVhJLVhBREMgaW50ZXJmYWNlLgorCisJICBUaGUgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxkIGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgeGlsaW54LXhhZGMuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQppbmRleCBiYTlhMTBhLi5iYjI1MjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCkBAIC0xNyw4ICsxNywxMiBAQAogb2JqLSQoQ09ORklHX01BWDEzNjMpICs9IG1heDEzNjMubwogb2JqLSQoQ09ORklHX01DUDMyMFgpICs9IG1jcDMyMHgubwogb2JqLSQoQ09ORklHX01DUDM0MjIpICs9IG1jcDM0MjIubworb2JqLSQoQ09ORklHX01FTl9aMTg4X0FEQykgKz0gbWVuX3oxODhfYWRjLm8KIG9iai0kKENPTkZJR19OQVU3ODAyKSArPSBuYXU3ODAyLm8KIG9iai0kKENPTkZJR19USV9BREMwODFDKSArPSB0aS1hZGMwODFjLm8KIG9iai0kKENPTkZJR19USV9BTTMzNVhfQURDKSArPSB0aV9hbTMzNXhfYWRjLm8KIG9iai0kKENPTkZJR19UV0w2MDMwX0dQQURDKSArPSB0d2w2MDMwLWdwYWRjLm8KK29iai0kKENPTkZJR19WRjYxMF9BREMpICs9IHZmNjEwX2FkYy5vCiBvYmotJChDT05GSUdfVklQRVJCT0FSRF9BREMpICs9IHZpcGVyYm9hcmRfYWRjLm8KK3hpbGlueC14YWRjLXkgOj0geGlsaW54LXhhZGMtY29yZS5vIHhpbGlueC14YWRjLWV2ZW50cy5vCitvYmotJChDT05GSUdfWElMSU5YX1hBREMpICs9IHhpbGlueC14YWRjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tYXgxMzYzLmMgYi9kcml2ZXJzL2lpby9hZGMvbWF4MTM2My5jCmluZGV4IDM2MDI1OTIuLjljZjMyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9tYXgxMzYzLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL21heDEzNjMuYwpAQCAtOCwxNyArOCwxMSBAQAogICAqIGJhc2VkIG9uIGxpbnV4L2RyaXZlcnMvYWNyb24vY2hhci9wY2Y4NTgzLmMKICAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUnVzc2VsbCBLaW5nCiAgICoKKyAgKiBEcml2ZXIgZm9yIG1heDEzNjMgYW5kIHNpbWlsYXIgY2hpcHMuCisgICoKICAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICoKLSAgKiBtYXgxMzYzLmMKLSAgKgotICAqIFBhcnRpYWwgc3VwcG9ydCBmb3IgbWF4MTM2MyBhbmQgc2ltaWxhciBjaGlwcy4KLSAgKgotICAqIE5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCi0gICoKLSAgKiAtIENvbnRyb2wgb2YgaW50ZXJuYWwgcmVmZXJlbmNlLgogICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMjUzLDcgKzEyNDcsNyBAQAogCX0sCiAJW21heDExNjA0XSA9IHsKIAkJLmJpdHMgPSA4LAotCQkuaW50X3ZyZWZfbXYgPSA0MDk4LAorCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkubW9kZV9saXN0ID0gbWF4MTIzOF9tb2RlX2xpc3QsCiAJCS5udW1fbW9kZXMgPSBBUlJBWV9TSVpFKG1heDEyMzhfbW9kZV9saXN0KSwKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKQEAgLTEzMTMsNyArMTMwNyw3IEBACiAJfSwKIAlbbWF4MTE2MTBdID0gewogCQkuYml0cyA9IDEwLAotCQkuaW50X3ZyZWZfbXYgPSA0MDk4LAorCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkubW9kZV9saXN0ID0gbWF4MTIzOF9tb2RlX2xpc3QsCiAJCS5udW1fbW9kZXMgPSBBUlJBWV9TSVpFKG1heDEyMzhfbW9kZV9saXN0KSwKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKQEAgLTEzNzMsNyArMTM2Nyw3IEBACiAJfSwKIAlbbWF4MTE2MTZdID0gewogCQkuYml0cyA9IDEyLAotCQkuaW50X3ZyZWZfbXYgPSA0MDk4LAorCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkubW9kZV9saXN0ID0gbWF4MTIzOF9tb2RlX2xpc3QsCiAJCS5udW1fbW9kZXMgPSBBUlJBWV9TSVpFKG1heDEyMzhfbW9kZV9saXN0KSwKIAkJLmRlZmF1bHRfbW9kZSA9IHMwdG8xMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg5YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogTUVOIDE2ejE4OCBBbmFsb2cgdG8gRGlnaWFsIENvbnZlcnRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNRU4gTWlrcm9lbGVrdHJvbmlrIEdtYkggKHd3dy5tZW4uZGUpCisgKiBBdXRob3I6IEpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWNiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisKKyNkZWZpbmUgWjE4OF9BRENfTUFYX0NIQU4JOAorI2RlZmluZSBaMTg4X0FEQ19HQUlOCQkweDA3MDAwMDAKKyNkZWZpbmUgWjE4OF9NT0RFX1ZPTFRBR0UJQklUKDI3KQorI2RlZmluZSBaMTg4X0NGR19BVVRPCQkweDEKKyNkZWZpbmUgWjE4OF9DVFJMX1JFRwkJMHg0MAorCisjZGVmaW5lIEFEQ19EQVRBKHgpICgoKHgpID4+IDIpICYgMHg3ZmZmZmMpCisjZGVmaW5lIEFEQ19PVlIoeCkgKCh4KSAmIDB4MSkKKworc3RydWN0IHoxODhfYWRjIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCisjZGVmaW5lIFoxODhfQURDX0NIQU5ORUwoaWR4KSB7CQkJCQlcCisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKKwkJLmluZGV4ZWQgPSAxLAkJCQkJXAorCQkuY2hhbm5lbCA9IChpZHgpLAkJCQlcCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCAgIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHoxODhfYWRjX2lpb19jaGFubmVsc1tdID0geworCVoxODhfQURDX0NIQU5ORUwoMCksCisJWjE4OF9BRENfQ0hBTk5FTCgxKSwKKwlaMTg4X0FEQ19DSEFOTkVMKDIpLAorCVoxODhfQURDX0NIQU5ORUwoMyksCisJWjE4OF9BRENfQ0hBTk5FTCg0KSwKKwlaMTg4X0FEQ19DSEFOTkVMKDUpLAorCVoxODhfQURDX0NIQU5ORUwoNiksCisJWjE4OF9BRENfQ0hBTk5FTCg3KSwKK307CisKK3N0YXRpYyBpbnQgejE4OF9paW9fcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmlpb19kZXYsCisJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCWludCAqdmFsLAorCQkJaW50ICp2YWwyLAorCQkJbG9uZyBpbmZvKQoreworCXN0cnVjdCB6MTg4X2FkYyAqYWRjID0gaWlvX3ByaXYoaWlvX2Rldik7CisJaW50IHJldDsKKwl1MTYgdG1wOworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJdG1wID0gcmVhZHcoYWRjLT5iYXNlICsgY2hhbi0+Y2hhbm5lbCAqIDQpOworCisJCWlmIChBRENfT1ZSKHRtcCkpIHsKKwkJCWRldl9pbmZvKCZpaW9fZGV2LT5kZXYsCisJCQkJIk92ZXJzYW1wbGluZyBlcnJvciBvbiBBREMgY2hhbm5lbCAlZFxuIiwKKwkJCQljaGFuLT5jaGFubmVsKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCSp2YWwgPSBBRENfREFUQSh0bXApOworCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpaW9faW5mbyB6MTg4X2FkY19pbmZvID0geworCS5yZWFkX3JhdyA9ICZ6MTg4X2lpb19yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHZvaWQgbWVuX3oxODhfY29uZmlnX2NoYW5uZWxzKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpbnQgaTsKKwl1MzIgY2ZnOworCXUzMiBjdGw7CisKKwljdGwgPSByZWFkbChhZGRyICsgWjE4OF9DVFJMX1JFRyk7CisJY3RsIHw9IFoxODhfQ0ZHX0FVVE87CisJd3JpdGVsKGN0bCwgYWRkciArIFoxODhfQ1RSTF9SRUcpOworCisJZm9yIChpID0gMDsgaSA8IFoxODhfQURDX01BWF9DSEFOOyBpKyspIHsKKwkJY2ZnID0gcmVhZGwoYWRkciArIGkpOworCQljZmcgJj0gfloxODhfQURDX0dBSU47CisJCWNmZyB8PSBaMTg4X01PREVfVk9MVEFHRTsKKwkJd3JpdGVsKGNmZywgYWRkciArIGkpOworCX0KK30KKworc3RhdGljIGludCBtZW5fejE4OF9wcm9iZShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2LAorCQkJY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB6MTg4X2FkYyAqYWRjOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHJlc291cmNlICptZW07CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHoxODhfYWRjKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPm5hbWUgPSAiejE4OC1hZGMiOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmejE4OF9hZGNfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IHoxODhfYWRjX2lpb19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoejE4OF9hZGNfaWlvX2NoYW5uZWxzKTsKKworCW1lbSA9IG1jYl9yZXF1ZXN0X21lbShkZXYsICJ6MTg4LWFkYyIpOworCWlmICghbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFkYy0+YmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlpZiAoYWRjLT5iYXNlID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJbWVuX3oxODhfY29uZmlnX2NoYW5uZWxzKGFkYy0+YmFzZSk7CisKKwlhZGMtPm1lbSA9IG1lbTsKKwltY2Jfc2V0X2RydmRhdGEoZGV2LCBpbmRpb19kZXYpOworCisJcmV0dXJuIGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKworZXJyOgorCW1jYl9yZWxlYXNlX21lbShtZW0pOworCXJldHVybiAtRU5YSU87Cit9CisKK3N0YXRpYyB2b2lkIG1lbl96MTg4X3JlbW92ZShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgID0gbWNiX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHoxODhfYWRjICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaW91bm1hcChhZGMtPmJhc2UpOworCW1jYl9yZWxlYXNlX21lbShhZGMtPm1lbSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCBtZW5fejE4OF9pZHNbXSA9IHsKKwl7IC5kZXZpY2UgPSAweGJjIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShtY2IsIG1lbl96MTg4X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgbWNiX2RyaXZlciBtZW5fejE4OF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiejE4OC1hZGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG1lbl96MTg4X3Byb2JlLAorCS5yZW1vdmUgPSBtZW5fejE4OF9yZW1vdmUsCisJLmlkX3RhYmxlID0gbWVuX3oxODhfaWRzLAorfTsKK21vZHVsZV9tY2JfZHJpdmVyKG1lbl96MTg4X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUlPIEFEQyBkcml2ZXIgZm9yIE1FTiAxNnoxODggQURDIENvcmUiKTsKK01PRFVMRV9BTElBUygibWNiOjE2ejE4OCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMKaW5kZXggMzFlNzg2ZS4uYTRkYjMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdHdsNjAzMC1ncGFkYy5jIGIvZHJpdmVycy9paW8vYWRjL3R3bDYwMzAtZ3BhZGMuYwppbmRleCA1M2EyNGViLi4xNTI4MmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdHdsNjAzMC1ncGFkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90d2w2MDMwLWdwYWRjLmMKQEAgLTI4LDcgKzI4LDYgQEAKICAqIDAyMTEwLTEzMDEgVVNBCiAgKgogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Nzk5ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogRnJlZXNjYWxlIFZ5YnJpZCB2ZjYxMCBBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTMgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2RyaXZlci5oPgorCisvKiBUaGlzIHdpbGwgYmUgdGhlIGRyaXZlciBuYW1lIHRoZSBrZXJuZWwgcmVwb3J0cyAqLworI2RlZmluZSBEUklWRVJfTkFNRSAidmY2MTAtYWRjIgorCisvKiBWeWJyaWQvSU1YIEFEQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19IQzAJCTB4MDAKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19IQzEJCTB4MDQKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19IUwkJMHgwOAorI2RlZmluZSBWRjYxMF9SRUdfQURDX1IwCQkweDBjCisjZGVmaW5lIFZGNjEwX1JFR19BRENfUjEJCTB4MTAKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19DRkcJCTB4MTQKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19HQwkJMHgxOAorI2RlZmluZSBWRjYxMF9SRUdfQURDX0dTCQkweDFjCisjZGVmaW5lIFZGNjEwX1JFR19BRENfQ1YJCTB4MjAKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19PRlMJCTB4MjQKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19DQUwJCTB4MjgKKyNkZWZpbmUgVkY2MTBfUkVHX0FEQ19QQ1RMCQkweDMwCisKKy8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZmllbGQgZGVmaW5lICovCisjZGVmaW5lIFZGNjEwX0FEQ19NT0RFX0JJVDgJCTB4MDAKKyNkZWZpbmUgVkY2MTBfQURDX01PREVfQklUMTAJCTB4MDQKKyNkZWZpbmUgVkY2MTBfQURDX01PREVfQklUMTIJCTB4MDgKKyNkZWZpbmUgVkY2MTBfQURDX01PREVfTUFTSwkJMHgwYworI2RlZmluZSBWRjYxMF9BRENfQlVTQ0xLMl9TRUwJCTB4MDEKKyNkZWZpbmUgVkY2MTBfQURDX0FMVENMS19TRUwJCTB4MDIKKyNkZWZpbmUgVkY2MTBfQURDX0FEQUNLX1NFTAkJMHgwMworI2RlZmluZSBWRjYxMF9BRENfQURDQ0xLX01BU0sJCTB4MDMKKyNkZWZpbmUgVkY2MTBfQURDX0NMS19ESVYyCQkweDIwCisjZGVmaW5lIFZGNjEwX0FEQ19DTEtfRElWNAkJMHg0MAorI2RlZmluZSBWRjYxMF9BRENfQ0xLX0RJVjgJCTB4NjAKKyNkZWZpbmUgVkY2MTBfQURDX0NMS19NQVNLCQkweDYwCisjZGVmaW5lIFZGNjEwX0FEQ19BRExTTVBfTE9ORwkJMHgxMAorI2RlZmluZSBWRjYxMF9BRENfQURTVFNfTUFTSwkJMHgzMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FETFBDX0VOCQkweDgwCisjZGVmaW5lIFZGNjEwX0FEQ19BREhTQ19FTgkJMHg0MDAKKyNkZWZpbmUgVkY2MTBfQURDX1JFRlNFTF9WQUxUCQkweDEwMAorI2RlZmluZSBWRjYxMF9BRENfUkVGU0VMX1ZCRwkJMHgxMDAwCisjZGVmaW5lIFZGNjEwX0FEQ19BRFRSR19IQVJECQkweDIwMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FWR1NfOAkJMHg0MDAwCisjZGVmaW5lIFZGNjEwX0FEQ19BVkdTXzE2CQkweDgwMDAKKyNkZWZpbmUgVkY2MTBfQURDX0FWR1NfMzIJCTB4QzAwMAorI2RlZmluZSBWRjYxMF9BRENfQVZHU19NQVNLCQkweEMwMDAKKyNkZWZpbmUgVkY2MTBfQURDX09WV1JFTgkJMHgxMDAwMAorCisvKiBHZW5lcmFsIGNvbnRyb2wgcmVnaXN0ZXIgZmllbGQgZGVmaW5lICovCisjZGVmaW5lIFZGNjEwX0FEQ19BREFDS0VOCQkweDEKKyNkZWZpbmUgVkY2MTBfQURDX0RNQUVOCQkJMHgyCisjZGVmaW5lIFZGNjEwX0FEQ19BQ1JFTgkJCTB4NAorI2RlZmluZSBWRjYxMF9BRENfQUNGR1QJCQkweDgKKyNkZWZpbmUgVkY2MTBfQURDX0FDRkUJCQkweDEwCisjZGVmaW5lIFZGNjEwX0FEQ19BVkdFTgkJCTB4MjAKKyNkZWZpbmUgVkY2MTBfQURDX0FEQ09OCQkJMHg0MAorI2RlZmluZSBWRjYxMF9BRENfQ0FMCQkJMHg4MAorCisvKiBPdGhlciBmaWVsZCBkZWZpbmUgKi8KKyNkZWZpbmUgVkY2MTBfQURDX0FEQ0hDKHgpCQkoKHgpICYgMHhGKQorI2RlZmluZSBWRjYxMF9BRENfQUlFTgkJCSgweDEgPDwgNykKKyNkZWZpbmUgVkY2MTBfQURDX0NPTlZfRElTQUJMRQkJMHgxRgorI2RlZmluZSBWRjYxMF9BRENfSFNfQ09DTzAJCTB4MQorI2RlZmluZSBWRjYxMF9BRENfQ0FMRgkJCTB4MgorI2RlZmluZSBWRjYxMF9BRENfVElNRU9VVAkJbXNlY3NfdG9famlmZmllcygxMDApCisKK2VudW0gY2xrX3NlbCB7CisJVkY2MTBfQURDSU9DX0JVU0NMS19TRVQsCisJVkY2MTBfQURDSU9DX0FMVENMS19TRVQsCisJVkY2MTBfQURDSU9DX0FEQUNLX1NFVCwKK307CisKK2VudW0gdm9sX3JlZiB7CisJVkY2MTBfQURDSU9DX1ZSX1ZSRUZfU0VULAorCVZGNjEwX0FEQ0lPQ19WUl9WQUxUX1NFVCwKKwlWRjYxMF9BRENJT0NfVlJfVkJHX1NFVCwKK307CisKK2VudW0gYXZlcmFnZV9zZWwgeworCVZGNjEwX0FEQ19TQU1QTEVfMSwKKwlWRjYxMF9BRENfU0FNUExFXzQsCisJVkY2MTBfQURDX1NBTVBMRV84LAorCVZGNjEwX0FEQ19TQU1QTEVfMTYsCisJVkY2MTBfQURDX1NBTVBMRV8zMiwKK307CisKK3N0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSB7CisJZW51bSBjbGtfc2VsCWNsa19zZWw7CisJZW51bSB2b2xfcmVmCXZvbF9yZWY7CisKKwlpbnQJY2xrX2RpdjsKKwlpbnQgICAgIHNhbXBsZV9yYXRlOworCWludAlyZXNfbW9kZTsKKworCWJvb2wJbHBtOworCWJvb2wJY2FsaWJyYXRpb247CisJYm9vbAlvdndyZW47Cit9OworCitzdHJ1Y3QgdmY2MTBfYWRjIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBjbGsgKmNsazsKKworCXUzMiB2cmVmX3V2OworCXUzMiB2YWx1ZTsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2cmVmOworCXN0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSBhZGNfZmVhdHVyZTsKKworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Cit9OworCisjZGVmaW5lIFZGNjEwX0FEQ19DSEFOKF9pZHgsIF9jaGFuX3R5cGUpIHsJCQlcCisJLnR5cGUgPSAoX2NoYW5fdHlwZSksCQkJCQlcCisJLmluZGV4ZWQgPSAxLAkJCQkJCVwKKwkuY2hhbm5lbCA9IChfaWR4KSwJCQkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwJXAorCQkJCUJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHZmNjEwX2FkY19paW9fY2hhbm5lbHNbXSA9IHsKKwlWRjYxMF9BRENfQ0hBTigwLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMSwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDIsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigzLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oNCwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDUsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTig2LCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oNywgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDgsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTig5LCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMTAsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigxMSwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDEyLCBJSU9fVk9MVEFHRSksCisJVkY2MTBfQURDX0NIQU4oMTMsIElJT19WT0xUQUdFKSwKKwlWRjYxMF9BRENfQ0hBTigxNCwgSUlPX1ZPTFRBR0UpLAorCVZGNjEwX0FEQ19DSEFOKDE1LCBJSU9fVk9MVEFHRSksCisJLyogc2VudGluZWwgKi8KK307CisKKy8qCisgKiBBREMgc2FtcGxlIGZyZXF1ZW5jeSwgdW5pdCBpcyBBRENLIGN5Y2xlcy4KKyAqIEFEQyBjbGsgc291cmNlIGlzIGlwZyBjbG9jaywgd2hpY2ggaXMgdGhlIHNhbWUgYXMgYnVzIGNsb2NrLgorICoKKyAqIEFEQyBjb252ZXJzaW9uIHRpbWUgPSBTRkNBZGRlciArIEF2ZXJhZ2VOdW0geCAoQkNUICsgTFNUQWRkZXIpCisgKiBTRkNBZGRlcjogZml4ZWQgdG8gNiBBRENLIGN5Y2xlcworICogQXZlcmFnZU51bTogMSwgNCwgOCwgMTYsIDMyIHNhbXBsZXMgZm9yIGhhcmR3YXJlIGF2ZXJhZ2UuCisgKiBCQ1QgKEJhc2UgQ29udmVyc2lvbiBUaW1lKTogZml4ZWQgdG8gMjUgQURDSyBjeWNsZXMgZm9yIDEyIGJpdCBtb2RlCisgKiBMU1RBZGRlcihMb25nIFNhbXBsZSBUaW1lKTogZml4ZWQgdG8gMyBBRENLIGN5Y2xlcworICoKKyAqIEJ5IGRlZmF1bHQsIGVuYWJsZSAxMiBiaXQgcmVzb2x1dGlvbiBtb2RlLCBjbG9jayBzb3VyY2UKKyAqIHNldCB0byBpcGcgY2xvY2ssIFNvIGdldCBiZWxvdyBmcmVxdWVuY3kgZ3JvdXA6CisgKi8KK3N0YXRpYyBjb25zdCB1MzIgdmY2MTBfc2FtcGxlX2ZyZXFfYXZhaWxbNV0gPQorezE5NDExNzYsIDU1OTMzMiwgMjg2OTU3LCAxNDUzNzQsIDczMTcxfTsKKworc3RhdGljIGlubGluZSB2b2lkIHZmNjEwX2FkY19jZmdfaW5pdChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCS8qIHNldCBkZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIEFEQyBjb250cm9sbGVyICovCisJaW5mby0+YWRjX2ZlYXR1cmUuY2xrX3NlbCA9IFZGNjEwX0FEQ0lPQ19CVVNDTEtfU0VUOworCWluZm8tPmFkY19mZWF0dXJlLnZvbF9yZWYgPSBWRjYxMF9BRENJT0NfVlJfVlJFRl9TRVQ7CisKKwlpbmZvLT5hZGNfZmVhdHVyZS5jYWxpYnJhdGlvbiA9IHRydWU7CisJaW5mby0+YWRjX2ZlYXR1cmUub3Z3cmVuID0gdHJ1ZTsKKworCWluZm8tPmFkY19mZWF0dXJlLmNsa19kaXYgPSAxOworCWluZm8tPmFkY19mZWF0dXJlLnJlc19tb2RlID0gMTI7CisJaW5mby0+YWRjX2ZlYXR1cmUuc2FtcGxlX3JhdGUgPSAxOworCWluZm8tPmFkY19mZWF0dXJlLmxwbSA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX2FkY19jZmdfcG9zdF9zZXQoc3RydWN0IHZmNjEwX2FkYyAqaW5mbykKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjX2ZlYXR1cmUgKmFkY19mZWF0dXJlID0gJmluZm8tPmFkY19mZWF0dXJlOworCWludCBjZmdfZGF0YSA9IDA7CisJaW50IGdjX2RhdGEgPSAwOworCisJc3dpdGNoIChhZGNfZmVhdHVyZS0+Y2xrX3NlbCkgeworCWNhc2UgVkY2MTBfQURDSU9DX0FMVENMS19TRVQ6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BTFRDTEtfU0VMOworCQlicmVhazsKKwljYXNlIFZGNjEwX0FEQ0lPQ19BREFDS19TRVQ6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BREFDS19TRUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIGxvdyBwb3dlciBzZXQgZm9yIGNhbGlicmF0aW9uICovCisJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FETFBDX0VOOworCisJLyogZW5hYmxlIGhpZ2ggc3BlZWQgZm9yIGNhbGlicmF0aW9uICovCisJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FESFNDX0VOOworCisJLyogdm9sdGFnZSByZWZlcmVuY2UgKi8KKwlzd2l0Y2ggKGFkY19mZWF0dXJlLT52b2xfcmVmKSB7CisJY2FzZSBWRjYxMF9BRENJT0NfVlJfVlJFRl9TRVQ6CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDSU9DX1ZSX1ZBTFRfU0VUOgorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfUkVGU0VMX1ZBTFQ7CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDSU9DX1ZSX1ZCR19TRVQ6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19SRUZTRUxfVkJHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwgImVycm9yIHZvbHRhZ2UgcmVmZXJlbmNlXG4iKTsKKwl9CisKKwkvKiBkYXRhIG92ZXJ3cml0ZSBlbmFibGUgKi8KKwlpZiAoYWRjX2ZlYXR1cmUtPm92d3JlbikKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX09WV1JFTjsKKworCXdyaXRlbChjZmdfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKKwl3cml0ZWwoZ2NfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOworfQorCitzdGF0aWMgdm9pZCB2ZjYxMF9hZGNfY2FsaWJyYXRpb24oc3RydWN0IHZmNjEwX2FkYyAqaW5mbykKK3sKKwlpbnQgYWRjX2djLCBoY19jZmc7CisJaW50IHRpbWVvdXQ7CisKKwlpZiAoIWluZm8tPmFkY19mZWF0dXJlLmNhbGlicmF0aW9uKQorCQlyZXR1cm47CisKKwkvKiBlbmFibGUgY2FsaWJyYXRpb24gaW50ZXJydXB0ICovCisJaGNfY2ZnID0gVkY2MTBfQURDX0FJRU4gfCBWRjYxMF9BRENfQ09OVl9ESVNBQkxFOworCXdyaXRlbChoY19jZmcsIGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0hDMCk7CisKKwlhZGNfZ2MgPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19HQyk7CisJd3JpdGVsKGFkY19nYyB8IFZGNjEwX0FEQ19DQUwsIGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dDKTsKKworCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQKKwkJCSgmaW5mby0+Y29tcGxldGlvbiwgVkY2MTBfQURDX1RJTUVPVVQpOworCWlmICh0aW1lb3V0ID09IDApCisJCWRldl9lcnIoaW5mby0+ZGV2LCAiVGltZW91dCBmb3IgYWRjIGNhbGlicmF0aW9uXG4iKTsKKworCWFkY19nYyA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dTKTsKKwlpZiAoYWRjX2djICYgVkY2MTBfQURDX0NBTEYpCisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQURDIGNhbGlicmF0aW9uIGZhaWxlZFxuIik7CisKKwlpbmZvLT5hZGNfZmVhdHVyZS5jYWxpYnJhdGlvbiA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCB2ZjYxMF9hZGNfY2ZnX3NldChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCXN0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSAqYWRjX2ZlYXR1cmUgPSAmKGluZm8tPmFkY19mZWF0dXJlKTsKKwlpbnQgY2ZnX2RhdGE7CisKKwljZmdfZGF0YSA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0NGRyk7CisKKwkvKiBsb3cgcG93ZXIgY29uZmlndXJhdGlvbiAqLworCWNmZ19kYXRhICY9IH5WRjYxMF9BRENfQURMUENfRU47CisJaWYgKGFkY19mZWF0dXJlLT5scG0pCisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BRExQQ19FTjsKKworCS8qIGRpc2FibGUgaGlnaCBzcGVlZCAqLworCWNmZ19kYXRhICY9IH5WRjYxMF9BRENfQURIU0NfRU47CisKKwl3cml0ZWwoY2ZnX2RhdGEsIGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0NGRyk7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX2FkY19zYW1wbGVfc2V0KHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCit7CisJc3RydWN0IHZmNjEwX2FkY19mZWF0dXJlICphZGNfZmVhdHVyZSA9ICYoaW5mby0+YWRjX2ZlYXR1cmUpOworCWludCBjZmdfZGF0YSwgZ2NfZGF0YTsKKworCWNmZ19kYXRhID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKKwlnY19kYXRhID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOworCisJLyogcmVzb2x1dGlvbiBtb2RlICovCisJY2ZnX2RhdGEgJj0gflZGNjEwX0FEQ19NT0RFX01BU0s7CisJc3dpdGNoIChhZGNfZmVhdHVyZS0+cmVzX21vZGUpIHsKKwljYXNlIDg6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19NT0RFX0JJVDg7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19NT0RFX0JJVDEwOworCQlicmVhazsKKwljYXNlIDEyOgorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfTU9ERV9CSVQxMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihpbmZvLT5kZXYsICJlcnJvciByZXNvbHV0aW9uIG1vZGVcbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBjbG9jayBzZWxlY3QgYW5kIGNsb2NrIGRpdmlkZXIgKi8KKwljZmdfZGF0YSAmPSB+KFZGNjEwX0FEQ19DTEtfTUFTSyB8IFZGNjEwX0FEQ19BRENDTEtfTUFTSyk7CisJc3dpdGNoIChhZGNfZmVhdHVyZS0+Y2xrX2RpdikgeworCWNhc2UgMToKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljZmdfZGF0YSB8PSBWRjYxMF9BRENfQ0xLX0RJVjI7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0NMS19ESVY0OworCQlicmVhazsKKwljYXNlIDg6CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19DTEtfRElWODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJc3dpdGNoIChhZGNfZmVhdHVyZS0+Y2xrX3NlbCkgeworCQljYXNlIFZGNjEwX0FEQ0lPQ19CVVNDTEtfU0VUOgorCQkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0JVU0NMSzJfU0VMIHwgVkY2MTBfQURDX0NMS19ESVY4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGluZm8tPmRldiwgImVycm9yIGNsayBkaXZpZGVyXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIFVzZSB0aGUgc2hvcnQgc2FtcGxlIG1vZGUgKi8KKwljZmdfZGF0YSAmPSB+KFZGNjEwX0FEQ19BRExTTVBfTE9ORyB8IFZGNjEwX0FEQ19BRFNUU19NQVNLKTsKKworCS8qIHVwZGF0ZSBoYXJkd2FyZSBhdmVyYWdlIHNlbGVjdGlvbiAqLworCWNmZ19kYXRhICY9IH5WRjYxMF9BRENfQVZHU19NQVNLOworCWdjX2RhdGEgJj0gflZGNjEwX0FEQ19BVkdFTjsKKwlzd2l0Y2ggKGFkY19mZWF0dXJlLT5zYW1wbGVfcmF0ZSkgeworCWNhc2UgVkY2MTBfQURDX1NBTVBMRV8xOgorCQlicmVhazsKKwljYXNlIFZGNjEwX0FEQ19TQU1QTEVfNDoKKwkJZ2NfZGF0YSB8PSBWRjYxMF9BRENfQVZHRU47CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDX1NBTVBMRV84OgorCQlnY19kYXRhIHw9IFZGNjEwX0FEQ19BVkdFTjsKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FWR1NfODsKKwkJYnJlYWs7CisJY2FzZSBWRjYxMF9BRENfU0FNUExFXzE2OgorCQlnY19kYXRhIHw9IFZGNjEwX0FEQ19BVkdFTjsKKwkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FWR1NfMTY7CisJCWJyZWFrOworCWNhc2UgVkY2MTBfQURDX1NBTVBMRV8zMjoKKwkJZ2NfZGF0YSB8PSBWRjYxMF9BRENfQVZHRU47CisJCWNmZ19kYXRhIHw9IFZGNjEwX0FEQ19BVkdTXzMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwKKwkJCSJlcnJvciBoYXJkd2FyZSBzYW1wbGUgYXZlcmFnZSBzZWxlY3RcbiIpOworCX0KKworCXdyaXRlbChjZmdfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKKwl3cml0ZWwoZ2NfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOworfQorCitzdGF0aWMgdm9pZCB2ZjYxMF9hZGNfaHdfaW5pdChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCS8qIENGRzogRmVhdHVyZSBzZXQgKi8KKwl2ZjYxMF9hZGNfY2ZnX3Bvc3Rfc2V0KGluZm8pOworCXZmNjEwX2FkY19zYW1wbGVfc2V0KGluZm8pOworCisJLyogYWRjIGNhbGlicmF0aW9uICovCisJdmY2MTBfYWRjX2NhbGlicmF0aW9uKGluZm8pOworCisJLyogQ0ZHOiBwb3dlciBhbmQgc3BlZWQgc2V0ICovCisJdmY2MTBfYWRjX2NmZ19zZXQoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3JlYWRfZGF0YShzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19SMCk7CisKKwlzd2l0Y2ggKGluZm8tPmFkY19mZWF0dXJlLnJlc19tb2RlKSB7CisJY2FzZSA4OgorCQlyZXN1bHQgJj0gMHhGRjsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJcmVzdWx0ICY9IDB4M0ZGOworCQlicmVhazsKKwljYXNlIDEyOgorCQlyZXN1bHQgJj0gMHhGRkY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2ZjYxMF9hZGNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gKHN0cnVjdCB2ZjYxMF9hZGMgKilkZXZfaWQ7CisJaW50IGNvY287CisKKwljb2NvID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSFMpOworCWlmIChjb2NvICYgVkY2MTBfQURDX0hTX0NPQ08wKSB7CisJCWluZm8tPnZhbHVlID0gdmY2MTBfYWRjX3JlYWRfZGF0YShpbmZvKTsKKwkJY29tcGxldGUoJmluZm8tPmNvbXBsZXRpb24pOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMTk0MTE3NiwgNTU5MzMyLCAyODY5NTcsIDE0NTM3NCwgNzMxNzEiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZmNjEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZmNjEwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSB2ZjYxMF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCB2ZjYxMF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQlpbnQgKnZhbCwKKwkJCWludCAqdmFsMiwKKwkJCWxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgaGNfY2ZnOworCWxvbmcgcmV0OworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJlaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5jb21wbGV0aW9uKTsKKworCQloY19jZmcgPSBWRjYxMF9BRENfQURDSEMoY2hhbi0+Y2hhbm5lbCk7CisJCWhjX2NmZyB8PSBWRjYxMF9BRENfQUlFTjsKKwkJd3JpdGVsKGhjX2NmZywgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSEMwKTsKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKwkJCQkoJmluZm8tPmNvbXBsZXRpb24sIFZGNjEwX0FEQ19USU1FT1VUKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJKnZhbCA9IGluZm8tPnZhbHVlOworCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCSp2YWwgPSBpbmZvLT52cmVmX3V2IC8gMTAwMDsKKwkJKnZhbDIgPSBpbmZvLT5hZGNfZmVhdHVyZS5yZXNfbW9kZTsKKwkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJKnZhbCA9IHZmNjEwX3NhbXBsZV9mcmVxX2F2YWlsW2luZm8tPmFkY19mZWF0dXJlLnNhbXBsZV9yYXRlXTsKKwkJKnZhbDIgPSAwOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2ZjYxMF93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJaW50IHZhbCwKKwkJCWludCB2YWwyLAorCQkJbG9uZyBtYXNrKQoreworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBpOworCisJc3dpdGNoIChtYXNrKSB7CisJCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCQlmb3IgKGkgPSAwOworCQkJCWkgPCBBUlJBWV9TSVpFKHZmNjEwX3NhbXBsZV9mcmVxX2F2YWlsKTsKKwkJCQlpKyspCisJCQkJaWYgKHZhbCA9PSB2ZjYxMF9zYW1wbGVfZnJlcV9hdmFpbFtpXSkgeworCQkJCQlpbmZvLT5hZGNfZmVhdHVyZS5zYW1wbGVfcmF0ZSA9IGk7CisJCQkJCXZmNjEwX2FkY19zYW1wbGVfc2V0KGluZm8pOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3JlZ19hY2Nlc3Moc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCXVuc2lnbmVkIHJlZywgdW5zaWduZWQgd3JpdGV2YWwsCisJCQl1bnNpZ25lZCAqcmVhZHZhbCkKK3sKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmICgocmVhZHZhbCA9PSBOVUxMKSB8fAorCQkoIShyZWcgJSA0KSB8fCAocmVnID4gVkY2MTBfUkVHX0FEQ19QQ1RMKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJKnJlYWR2YWwgPSByZWFkbChpbmZvLT5yZWdzICsgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHZmNjEwX2FkY19paW9faW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5yZWFkX3JhdyA9ICZ2ZjYxMF9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gJnZmNjEwX3dyaXRlX3JhdywKKwkuZGVidWdmc19yZWdfYWNjZXNzID0gJnZmNjEwX2FkY19yZWdfYWNjZXNzLAorCS5hdHRycyA9ICZ2ZjYxMF9hdHRyaWJ1dGVfZ3JvdXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2ZjYxMF9hZGNfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCx2ZjYxMC1hZGMiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHZmNjEwX2FkY19tYXRjaCk7CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZmNjEwX2FkYyAqaW5mbzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCWludCBpcnE7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHZmNjEwX2FkYykpOworCWlmICghaW5kaW9fZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBhbGxvY2F0aW5nIGlpbyBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbmZvLT5kZXYgPSAmcGRldi0+ZGV2OworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpbmZvLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIG1lbSk7CisJaWYgKElTX0VSUihpbmZvLT5yZWdzKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW5mby0+cmVncyk7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPD0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgcmVzb3VyY2U/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShpbmZvLT5kZXYsIGlycSwKKwkJCQl2ZjYxMF9hZGNfaXNyLCAwLAorCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgcmVxdWVzdGluZyBpcnEsIGlycSA9ICVkXG4iLCBpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluZm8tPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYWRjIik7CisJaWYgKElTX0VSUihpbmZvLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCBnZXR0aW5nIGNsb2NrLCBlcnIgPSAlbGRcbiIsCisJCQkJCQlQVFJfRVJSKGluZm8tPmNsaykpOworCQlyZXQgPSBQVFJfRVJSKGluZm8tPmNsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5mby0+dnJlZiA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAidnJlZiIpOworCWlmIChJU19FUlIoaW5mby0+dnJlZikpCisJCXJldHVybiBQVFJfRVJSKGluZm8tPnZyZWYpOworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShpbmZvLT52cmVmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW5mby0+dnJlZl91diA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShpbmZvLT52cmVmKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7CisKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmNvbXBsZXRpb24pOworCisJaW5kaW9fZGV2LT5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbmRpb19kZXYtPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJaW5kaW9fZGV2LT5pbmZvID0gJnZmNjEwX2FkY19paW9faW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IHZmNjEwX2FkY19paW9fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHZmNjEwX2FkY19paW9fY2hhbm5lbHMpOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGluZm8tPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiQ291bGQgbm90IHByZXBhcmUgb3IgZW5hYmxlIHRoZSBjbG9jay5cbiIpOworCQlnb3RvIGVycm9yX2FkY19jbGtfZW5hYmxlOworCX0KKworCXZmNjEwX2FkY19jZmdfaW5pdChpbmZvKTsKKwl2ZjYxMF9hZGNfaHdfaW5pdChpbmZvKTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIHRoZSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJvcl9paW9fZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXJldHVybiAwOworCisKK2Vycm9yX2lpb19kZXZpY2VfcmVnaXN0ZXI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPmNsayk7CitlcnJvcl9hZGNfY2xrX2VuYWJsZToKKwlyZWd1bGF0b3JfZGlzYWJsZShpbmZvLT52cmVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCXJlZ3VsYXRvcl9kaXNhYmxlKGluZm8tPnZyZWYpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdmY2MTBfYWRjICppbmZvID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgaGNfY2ZnOworCisJLyogQURDIGNvbnRyb2xsZXIgZW50ZXJzIHRvIHN0b3AgbW9kZSAqLworCWhjX2NmZyA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0hDMCk7CisJaGNfY2ZnIHw9IFZGNjEwX0FEQ19DT05WX0RJU0FCTEU7CisJd3JpdGVsKGhjX2NmZywgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfSEMwKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT5jbGspOworCXJlZ3VsYXRvcl9kaXNhYmxlKGluZm8tPnZyZWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmY2MTBfYWRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB2ZjYxMF9hZGMgKmluZm8gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGluZm8tPnZyZWYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaW5mby0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdmY2MTBfYWRjX2h3X2luaXQoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFModmY2MTBfYWRjX3BtX29wcywKKwkJCXZmNjEwX2FkY19zdXNwZW5kLAorCQkJdmY2MTBfYWRjX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZmNjEwX2FkY19kcml2ZXIgPSB7CisJLnByb2JlICAgICAgICAgID0gdmY2MTBfYWRjX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IHZmNjEwX2FkY19yZW1vdmUsCisJLmRyaXZlciAgICAgICAgID0geworCQkubmFtZSAgID0gRFJJVkVSX05BTUUsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gdmY2MTBfYWRjX21hdGNoLAorCQkucG0gICAgID0gJnZmNjEwX2FkY19wbV9vcHMsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodmY2MTBfYWRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkZ1Z2FuZyBEdWFuIDxCMzg2MTFAZnJlZXNjYWxlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIFZGNjEwIEFEQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy92aXBlcmJvYXJkX2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3ZpcGVyYm9hcmRfYWRjLmMKaW5kZXggZDBhZGQ4Zi4uOWFjZjZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3ZpcGVyYm9hcmRfYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL3ZpcGVyYm9hcmRfYWRjLmMKQEAgLTEzOSw4ICsxMzksNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWNvcmUuYyBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1MmJlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy1jb3JlLmMKQEAgLTAsMCArMSwxMzMzIEBACisvKgorICogWGlsaW54IFhBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTMtMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqCisgKiBEb2N1bWVudGF0aW9uIGZvciB0aGUgcGFydHMgY2FuIGJlIGZvdW5kIGF0OgorICogIC0gWEFEQyBoYXJkbWFjcm86IFhpbGlueCBVRzQ4MAorICogIC0gWllOUSBYQURDIGludGVyZmFjZTogWGlsaW54IFVHNTg1CisgKiAgLSBBWEkgWEFEQyBpbnRlcmZhY2U6IFhpbGlueCBQRzAxOQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyX2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKworI2luY2x1ZGUgInhpbGlueC14YWRjLmgiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgWEFEQ19aWU5RX1VOTUFTS19USU1FT1VUID0gNTAwOworCisvKiBaWU5RIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFhBRENfWllOUV9SRUdfQ0ZHCTB4MDAKKyNkZWZpbmUgWEFEQ19aWU5RX1JFR19JTlRTVFMJMHgwNAorI2RlZmluZSBYQURDX1pZTlFfUkVHX0lOVE1TSwkweDA4CisjZGVmaW5lIFhBRENfWllOUV9SRUdfU1RBVFVTCTB4MGMKKyNkZWZpbmUgWEFEQ19aWU5RX1JFR19DRklGTwkweDEwCisjZGVmaW5lIFhBRENfWllOUV9SRUdfREZJRk8JMHgxNAorI2RlZmluZSBYQURDX1pZTlFfUkVHX0NUTAkJMHgxOAorCisjZGVmaW5lIFhBRENfWllOUV9DRkdfRU5BQkxFCQlCSVQoMzEpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfQ0ZJRk9USF9NQVNLCSgweGYgPDwgMjApCisjZGVmaW5lIFhBRENfWllOUV9DRkdfQ0ZJRk9USF9PRkZTRVQJMjAKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19ERklGT1RIX01BU0sJKDB4ZiA8PCAxNikKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19ERklGT1RIX09GRlNFVAkxNgorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1dFREdFCQlCSVQoMTMpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfUkVER0UJCUJJVCgxMikKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19UQ0tSQVRFX01BU0sJKDB4MyA8PCA4KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMgkoMHgwIDw8IDgpCisjZGVmaW5lIFhBRENfWllOUV9DRkdfVENLUkFURV9ESVY0CSgweDEgPDwgOCkKKyNkZWZpbmUgWEFEQ19aWU5RX0NGR19UQ0tSQVRFX0RJVjgJKDB4MiA8PCA4KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMTYJKDB4MyA8PCA4KQorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX0lHQVBfTUFTSwkJMHgxZgorI2RlZmluZSBYQURDX1pZTlFfQ0ZHX0lHQVAoeCkJCSh4KQorCisjZGVmaW5lIFhBRENfWllOUV9JTlRfQ0ZJRk9fTFRICQlCSVQoOSkKKyNkZWZpbmUgWEFEQ19aWU5RX0lOVF9ERklGT19HVEgJCUJJVCg4KQorI2RlZmluZSBYQURDX1pZTlFfSU5UX0FMQVJNX01BU0sJMHhmZgorI2RlZmluZSBYQURDX1pZTlFfSU5UX0FMQVJNX09GRlNFVAkwCisKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19DRklGT19MVkxfTUFTSwkoMHhmIDw8IDE2KQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0NGSUZPX0xWTF9PRkZTRVQJMTYKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19ERklGT19MVkxfTUFTSwkoMHhmIDw8IDEyKQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0RGSUZPX0xWTF9PRkZTRVQJMTIKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19DRklGT0YJCUJJVCgxMSkKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19DRklGT0UJCUJJVCgxMCkKKyNkZWZpbmUgWEFEQ19aWU5RX1NUQVRVU19ERklGT0YJCUJJVCg5KQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0RGSUZPRQkJQklUKDgpCisjZGVmaW5lIFhBRENfWllOUV9TVEFUVVNfT1QJCUJJVCg3KQorI2RlZmluZSBYQURDX1pZTlFfU1RBVFVTX0FMTSh4KQkJQklUKHgpCisKKyNkZWZpbmUgWEFEQ19aWU5RX0NUTF9SRVNFVAkJQklUKDQpCisKKyNkZWZpbmUgWEFEQ19aWU5RX0NNRF9OT1AJCTB4MDAKKyNkZWZpbmUgWEFEQ19aWU5RX0NNRF9SRUFECQkweDAxCisjZGVmaW5lIFhBRENfWllOUV9DTURfV1JJVEUJCTB4MDIKKworI2RlZmluZSBYQURDX1pZTlFfQ01EKGNtZCwgYWRkciwgZGF0YSkgKCgoY21kKSA8PCAyNikgfCAoKGFkZHIpIDw8IDE2KSB8IChkYXRhKSkKKworLyogQVhJIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFhBRENfQVhJX1JFR19SRVNFVAkJMHgwMAorI2RlZmluZSBYQURDX0FYSV9SRUdfU1RBVFVTCQkweDA0CisjZGVmaW5lIFhBRENfQVhJX1JFR19BTEFSTV9TVEFUVVMJMHgwOAorI2RlZmluZSBYQURDX0FYSV9SRUdfQ09OVlNUCQkweDBjCisjZGVmaW5lIFhBRENfQVhJX1JFR19YQURDX1JFU0VUCQkweDEwCisjZGVmaW5lIFhBRENfQVhJX1JFR19HSUVSCQkweDVjCisjZGVmaW5lIFhBRENfQVhJX1JFR19JUElTUgkJMHg2MAorI2RlZmluZSBYQURDX0FYSV9SRUdfSVBJRVIJCTB4NjgKKyNkZWZpbmUgWEFEQ19BWElfQURDX1JFR19PRkZTRVQJCTB4MjAwCisKKyNkZWZpbmUgWEFEQ19BWElfUkVTRVRfTUFHSUMJCTB4YQorI2RlZmluZSBYQURDX0FYSV9HSUVSX0VOQUJMRQkJQklUKDMxKQorCisjZGVmaW5lIFhBRENfQVhJX0lOVF9FT1MJCUJJVCg0KQorI2RlZmluZSBYQURDX0FYSV9JTlRfQUxBUk1fTUFTSwkJMHgzYzBmCisKKyNkZWZpbmUgWEFEQ19GTEFHU19CVUZGRVJFRCBCSVQoMCkKKworc3RhdGljIHZvaWQgeGFkY193cml0ZV9yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDMyX3QgdmFsKQoreworCXdyaXRlbCh2YWwsIHhhZGMtPmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCB4YWRjX3JlYWRfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQzMl90ICp2YWwpCit7CisJKnZhbCA9IHJlYWRsKHhhZGMtPmJhc2UgKyByZWcpOworfQorCisvKgorICogVGhlIFpZTlEgaW50ZXJmYWNlIHVzZXMgdHdvIGFzeW5jaHJvbm91cyBGSUZPcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQorICogWEFEQy4gUmVhZHMgYW5kIHdyaXRlcyB0byB0aGUgWEFEQyByZWdpc3RlciBhcmUgcGVyZm9ybWVkIGJ5IHN1Ym1pdHRpbmcgYQorICogcmVxdWVzdCB0byB0aGUgY29tbWFuZCBGSUZPIChDRklGTyksIG9uY2UgdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkIHRoZQorICogcmVzdWx0IGNhbiBiZSByZWFkIGZyb20gdGhlIGRhdGEgRklGTyAoREZJRk8pLiBUaGUgbWV0aG9kIGN1cnJlbnRseSB1c2VkIGluCisgKiB0aGlzIGRyaXZlciBpcyB0byBzdWJtaXQgdGhlIHJlcXVlc3QgZm9yIGEgcmVhZC93cml0ZSBvcGVyYXRpb24sIHRoZW4gZ28gdG8KKyAqIHNsZWVwIGFuZCB3YWl0IGZvciBhbiBpbnRlcnJ1cHQgdGhhdCBzaWduYWxzIHRoYXQgYSByZXNwb25zZSBpcyBhdmFpbGFibGUgaW4KKyAqIHRoZSBkYXRhIEZJRk8uCisgKi8KKworc3RhdGljIHZvaWQgeGFkY196eW5xX3dyaXRlX2ZpZm8oc3RydWN0IHhhZGMgKnhhZGMsIHVpbnQzMl90ICpjbWQsCisJdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NGSUZPLCBjbWRbaV0pOworfQorCitzdGF0aWMgdm9pZCB4YWRjX3p5bnFfZHJhaW5fZmlmbyhzdHJ1Y3QgeGFkYyAqeGFkYykKK3sKKwl1aW50MzJfdCBzdGF0dXMsIHRtcDsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19TVEFUVVMsICZzdGF0dXMpOworCisJd2hpbGUgKCEoc3RhdHVzICYgWEFEQ19aWU5RX1NUQVRVU19ERklGT0UpKSB7CisJCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnRtcCk7CisJCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19TVEFUVVMsICZzdGF0dXMpOworCX0KK30KKworc3RhdGljIHZvaWQgeGFkY196eW5xX3VwZGF0ZV9pbnRtc2soc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCBtYXNrLAorCXVuc2lnbmVkIGludCB2YWwpCit7CisJeGFkYy0+enlucV9pbnRtYXNrICY9IH5tYXNrOworCXhhZGMtPnp5bnFfaW50bWFzayB8PSB2YWw7CisKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVE1TSywKKwkJeGFkYy0+enlucV9pbnRtYXNrIHwgeGFkYy0+enlucV9tYXNrZWRfYWxhcm0pOworfQorCitzdGF0aWMgaW50IHhhZGNfenlucV93cml0ZV9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90IHZhbCkKK3sKKwl1aW50MzJfdCBjbWRbMV07CisJdWludDMyX3QgdG1wOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCwKKwkJCVhBRENfWllOUV9JTlRfREZJRk9fR1RIKTsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZ4YWRjLT5jb21wbGV0aW9uKTsKKworCWNtZFswXSA9IFhBRENfWllOUV9DTUQoWEFEQ19aWU5RX0NNRF9XUklURSwgcmVnLCB2YWwpOworCXhhZGNfenlucV93cml0ZV9maWZvKHhhZGMsIGNtZCwgQVJSQVlfU0laRShjbWQpKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfQ0ZHLCAmdG1wKTsKKwl0bXAgJj0gflhBRENfWllOUV9DRkdfREZJRk9USF9NQVNLOworCXRtcCB8PSAwIDw8IFhBRENfWllOUV9DRkdfREZJRk9USF9PRkZTRVQ7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsIHRtcCk7CisKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZ4YWRjLT5jb21wbGV0aW9uLCBIWik7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSAtRUlPOworCWVsc2UKKwkJcmV0ID0gMDsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnRtcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhhZGNfenlucV9yZWFkX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgKnZhbCkKK3sKKwl1aW50MzJfdCBjbWRbMl07CisJdWludDMyX3QgcmVzcCwgdG1wOworCWludCByZXQ7CisKKwljbWRbMF0gPSBYQURDX1pZTlFfQ01EKFhBRENfWllOUV9DTURfUkVBRCwgcmVnLCAwKTsKKwljbWRbMV0gPSBYQURDX1pZTlFfQ01EKFhBRENfWllOUV9DTURfTk9QLCAwLCAwKTsKKworCXNwaW5fbG9ja19pcnEoJnhhZGMtPmxvY2spOworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfREZJRk9fR1RILAorCQkJWEFEQ19aWU5RX0lOVF9ERklGT19HVEgpOworCXhhZGNfenlucV9kcmFpbl9maWZvKHhhZGMpOworCXJlaW5pdF9jb21wbGV0aW9uKCZ4YWRjLT5jb21wbGV0aW9uKTsKKworCXhhZGNfenlucV93cml0ZV9maWZvKHhhZGMsIGNtZCwgQVJSQVlfU0laRShjbWQpKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfQ0ZHLCAmdG1wKTsKKwl0bXAgJj0gflhBRENfWllOUV9DRkdfREZJRk9USF9NQVNLOworCXRtcCB8PSAxIDw8IFhBRENfWllOUV9DRkdfREZJRk9USF9PRkZTRVQ7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsIHRtcCk7CisKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0RGSUZPX0dUSCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmeGFkYy0+Y29tcGxldGlvbiwgSFopOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gLUVJTzsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnJlc3ApOworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19ERklGTywgJnJlc3ApOworCisJKnZhbCA9IHJlc3AgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4YWRjX3p5bnFfdHJhbnNmb3JtX2FsYXJtKHVuc2lnbmVkIGludCBhbGFybSkKK3sKKwlyZXR1cm4gKChhbGFybSAmIDB4ODApID4+IDQpIHwKKwkJKChhbGFybSAmIDB4NzgpIDw8IDEpIHwKKwkJKGFsYXJtICYgMHgwNyk7Cit9CisKKy8qCisgKiBUaGUgWllOUSB0aHJlc2hvbGQgaW50ZXJydXB0cyBhcmUgbGV2ZWwgc2Vuc2l0aXZlLiBTaW5jZSB3ZSBjYW4ndCBtYWtlIHRoZQorICogdGhyZXNob2xkIGNvbmRpdGlvbiBnbyB3YXkgZnJvbSB3aXRoaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLCB0aGlzIG1lYW5zIGFzCisgKiBzb29uIGFzIGEgdGhyZXNob2xkIGNvbmRpdGlvbiBpcyBwcmVzZW50IHdlIHdvdWxkIGVudGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICogYWdhaW4gYW5kIGFnYWluLiBUbyB3b3JrIGFyb3VuZCB0aGlzIHdlIG1hc2sgYWxsIGFjdGl2ZSB0aHJlc2hvbGRzIGludGVycnVwdHMKKyAqIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgc3RhcnQgYSB0aW1lci4gSW4gdGhpcyB0aW1lciB3ZSBwb2xsIHRoZQorICogaW50ZXJydXB0IHN0YXR1cyBhbmQgb25seSBpZiB0aGUgaW50ZXJydXB0IGlzIGluYWN0aXZlIHdlIHVubWFzayBpdCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgeGFkY196eW5xX3VubWFza193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB4YWRjLCB6eW5xX3VubWFza193b3JrLndvcmspOworCXVuc2lnbmVkIGludCBtaXNjX3N0cywgdW5tYXNrOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX1NUQVRVUywgJm1pc2Nfc3RzKTsKKworCW1pc2Nfc3RzICY9IFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSzsKKworCXNwaW5fbG9ja19pcnEoJnhhZGMtPmxvY2spOworCisJLyogQ2xlYXIgdGhvc2UgYml0cyB3aGljaCBhcmUgbm90IGFjdGl2ZSBhbnltb3JlICovCisJdW5tYXNrID0gKHhhZGMtPnp5bnFfbWFza2VkX2FsYXJtIF4gbWlzY19zdHMpICYgeGFkYy0+enlucV9tYXNrZWRfYWxhcm07CisJeGFkYy0+enlucV9tYXNrZWRfYWxhcm0gJj0gbWlzY19zdHM7CisKKwkvKiBBbHNvIGNsZWFyIHRob3NlIHdoaWNoIGFyZSBtYXNrZWQgb3V0IGFueXdheSAqLworCXhhZGMtPnp5bnFfbWFza2VkX2FsYXJtICY9IH54YWRjLT56eW5xX2ludG1hc2s7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBiZWZvcmUgd2UgdW5tYXNrIHRoZW0gKi8KKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVFNUUywgdW5tYXNrKTsKKworCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIDAsIDApOworCisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKworCS8qIGlmIHN0aWxsIHBlbmRpbmcgc29tZSBhbGFybSByZS10cmlnZ2VyIHRoZSB0aW1lciAqLworCWlmICh4YWRjLT56eW5xX21hc2tlZF9hbGFybSkgeworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnhhZGMtPnp5bnFfdW5tYXNrX3dvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyhYQURDX1pZTlFfVU5NQVNLX1RJTUVPVVQpKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4YWRjX3p5bnFfdGhyZWFkZWRfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldmlkOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgYWxhcm07CisKKwlzcGluX2xvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKwlhbGFybSA9IHhhZGMtPnp5bnFfYWxhcm07CisJeGFkYy0+enlucV9hbGFybSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZ4YWRjLT5sb2NrKTsKKworCXhhZGNfaGFuZGxlX2V2ZW50cyhpbmRpb19kZXYsIHhhZGNfenlucV90cmFuc2Zvcm1fYWxhcm0oYWxhcm0pKTsKKworCS8qIHVubWFzayB0aGUgcmVxdWlyZWQgaW50ZXJydXB0cyBpbiB0aW1lci4gKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnhhZGMtPnp5bnFfdW5tYXNrX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKFhBRENfWllOUV9VTk1BU0tfVElNRU9VVCkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGFkY196eW5xX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZpZDsKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX0hBTkRMRUQ7CisJdWludDMyX3Qgc3RhdHVzOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0lOVFNUUywgJnN0YXR1cyk7CisKKwlzdGF0dXMgJj0gfih4YWRjLT56eW5xX2ludG1hc2sgfCB4YWRjLT56eW5xX21hc2tlZF9hbGFybSk7CisKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZ4YWRjLT5sb2NrKTsKKworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIFhBRENfWllOUV9JTlRfREZJRk9fR1RIKSB7CisJCXhhZGNfenlucV91cGRhdGVfaW50bXNrKHhhZGMsIFhBRENfWllOUV9JTlRfREZJRk9fR1RILAorCQkJWEFEQ19aWU5RX0lOVF9ERklGT19HVEgpOworCQljb21wbGV0ZSgmeGFkYy0+Y29tcGxldGlvbik7CisJfQorCisJc3RhdHVzICY9IFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSzsKKwlpZiAoc3RhdHVzKSB7CisJCXhhZGMtPnp5bnFfYWxhcm0gfD0gc3RhdHVzOworCQl4YWRjLT56eW5xX21hc2tlZF9hbGFybSB8PSBzdGF0dXM7CisJCS8qCisJCSAqIG1hc2sgdGhlIGN1cnJlbnQgZXZlbnQgaW50ZXJydXB0LAorCQkgKiB1bm1hc2sgaXQgd2hlbiB0aGUgaW50ZXJydXB0IGlzIG5vIG1vcmUgYWN0aXZlLgorCQkgKi8KKwkJeGFkY196eW5xX3VwZGF0ZV9pbnRtc2soeGFkYywgMCwgMCk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisJc3Bpbl91bmxvY2soJnhhZGMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBYQURDX1pZTlFfVENLX1JBVEVfTUFYIDUwMDAwMDAwCisjZGVmaW5lIFhBRENfWllOUV9JR0FQX0RFRkFVTFQgMjAKKworc3RhdGljIGludCB4YWRjX3p5bnFfc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBpbnQgaXJxKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHBjYXBfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgdGNrX2RpdjsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCBpZ2FwOworCXVuc2lnbmVkIGludCB0Y2tfcmF0ZTsKKworCS8qIFRPRE86IEZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgaWdhcCBhbmQgdGNrX3JhdGUgY29uZmlndXJhYmxlICovCisJaWdhcCA9IFhBRENfWllOUV9JR0FQX0RFRkFVTFQ7CisJdGNrX3JhdGUgPSBYQURDX1pZTlFfVENLX1JBVEVfTUFYOworCisJeGFkYy0+enlucV9pbnRtYXNrID0gfjA7CisKKwlwY2FwX3JhdGUgPSBjbGtfZ2V0X3JhdGUoeGFkYy0+Y2xrKTsKKworCWlmICh0Y2tfcmF0ZSA+IFhBRENfWllOUV9UQ0tfUkFURV9NQVgpCisJCXRja19yYXRlID0gWEFEQ19aWU5RX1RDS19SQVRFX01BWDsKKwlpZiAodGNrX3JhdGUgPiBwY2FwX3JhdGUgLyAyKSB7CisJCWRpdiA9IDI7CisJfSBlbHNlIHsKKwkJZGl2ID0gcGNhcF9yYXRlIC8gdGNrX3JhdGU7CisJCWlmIChwY2FwX3JhdGUgLyBkaXYgPiBYQURDX1pZTlFfVENLX1JBVEVfTUFYKQorCQkJZGl2Kys7CisJfQorCisJaWYgKGRpdiA8PSAzKQorCQl0Y2tfZGl2ID0gWEFEQ19aWU5RX0NGR19UQ0tSQVRFX0RJVjI7CisJZWxzZSBpZiAoZGl2IDw9IDcpCisJCXRja19kaXYgPSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWNDsKKwllbHNlIGlmIChkaXYgPD0gMTUpCisJCXRja19kaXYgPSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWODsKKwllbHNlCisJCXRja19kaXYgPSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMTY7CisKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NUTCwgWEFEQ19aWU5RX0NUTF9SRVNFVCk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DVEwsIDApOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCB+MCk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19JTlRNU0ssIHhhZGMtPnp5bnFfaW50bWFzayk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19DRkcsIFhBRENfWllOUV9DRkdfRU5BQkxFIHwKKwkJCVhBRENfWllOUV9DRkdfUkVER0UgfCBYQURDX1pZTlFfQ0ZHX1dFREdFIHwKKwkJCXRja19kaXYgfCBYQURDX1pZTlFfQ0ZHX0lHQVAoaWdhcCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhhZGNfenlucV9nZXRfZGNsa19yYXRlKHN0cnVjdCB4YWRjICp4YWRjKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdWludDMyX3QgdmFsOworCisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX1pZTlFfUkVHX0NGRywgJnZhbCk7CisKKwlzd2l0Y2ggKHZhbCAmIFhBRENfWllOUV9DRkdfVENLUkFURV9NQVNLKSB7CisJY2FzZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWNDoKKwkJZGl2ID0gNDsKKwkJYnJlYWs7CisJY2FzZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWODoKKwkJZGl2ID0gODsKKwkJYnJlYWs7CisJY2FzZSBYQURDX1pZTlFfQ0ZHX1RDS1JBVEVfRElWMTY6CisJCWRpdiA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaXYgPSAyOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKHhhZGMtPmNsaykgLyBkaXY7Cit9CisKK3N0YXRpYyB2b2lkIHhhZGNfenlucV91cGRhdGVfYWxhcm0oc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCBhbGFybSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQzMl90IHN0YXR1czsKKworCS8qIE1vdmUgT1QgdG8gYml0IDcgKi8KKwlhbGFybSA9ICgoYWxhcm0gJiAweDA4KSA8PCA0KSB8ICgoYWxhcm0gJiAweGYwKSA+PiAxKSB8IChhbGFybSAmIDB4MDcpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKKworCS8qIENsZWFyIHByZXZpb3VzIGludGVycnVwdHMgaWYgYW55LiAqLworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19aWU5RX1JFR19JTlRTVFMsICZzdGF0dXMpOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfWllOUV9SRUdfSU5UU1RTLCBzdGF0dXMgJiBhbGFybSk7CisKKwl4YWRjX3p5bnFfdXBkYXRlX2ludG1zayh4YWRjLCBYQURDX1pZTlFfSU5UX0FMQVJNX01BU0ssCisJCX5hbGFybSAmIFhBRENfWllOUV9JTlRfQUxBUk1fTUFTSyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4YWRjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGFkY19vcHMgeGFkY196eW5xX29wcyA9IHsKKwkucmVhZCA9IHhhZGNfenlucV9yZWFkX2FkY19yZWcsCisJLndyaXRlID0geGFkY196eW5xX3dyaXRlX2FkY19yZWcsCisJLnNldHVwID0geGFkY196eW5xX3NldHVwLAorCS5nZXRfZGNsa19yYXRlID0geGFkY196eW5xX2dldF9kY2xrX3JhdGUsCisJLmludGVycnVwdF9oYW5kbGVyID0geGFkY196eW5xX2ludGVycnVwdF9oYW5kbGVyLAorCS50aHJlYWRlZF9pbnRlcnJ1cHRfaGFuZGxlciA9IHhhZGNfenlucV90aHJlYWRlZF9pbnRlcnJ1cHRfaGFuZGxlciwKKwkudXBkYXRlX2FsYXJtID0geGFkY196eW5xX3VwZGF0ZV9hbGFybSwKK307CisKK3N0YXRpYyBpbnQgeGFkY19heGlfcmVhZF9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90ICp2YWwpCit7CisJdWludDMyX3QgdmFsMzI7CisKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfQVhJX0FEQ19SRUdfT0ZGU0VUICsgcmVnICogNCwgJnZhbDMyKTsKKwkqdmFsID0gdmFsMzIgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YWRjX2F4aV93cml0ZV9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90IHZhbCkKK3sKKwl4YWRjX3dyaXRlX3JlZyh4YWRjLCBYQURDX0FYSV9BRENfUkVHX09GRlNFVCArIHJlZyAqIDQsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YWRjX2F4aV9zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBpcnEpCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX1JFU0VULCBYQURDX0FYSV9SRVNFVF9NQUdJQyk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0dJRVIsIFhBRENfQVhJX0dJRVJfRU5BQkxFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGFkY19heGlfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldmlkOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1aW50MzJfdCBzdGF0dXMsIG1hc2s7CisJdW5zaWduZWQgaW50IGV2ZW50czsKKworCXhhZGNfcmVhZF9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSVNSLCAmc3RhdHVzKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgJm1hc2spOworCXN0YXR1cyAmPSBtYXNrOworCisJaWYgKCFzdGF0dXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmICgoc3RhdHVzICYgWEFEQ19BWElfSU5UX0VPUykgJiYgeGFkYy0+dHJpZ2dlcikKKwkJaWlvX3RyaWdnZXJfcG9sbCh4YWRjLT50cmlnZ2VyLCAwKTsKKworCWlmIChzdGF0dXMgJiBYQURDX0FYSV9JTlRfQUxBUk1fTUFTSykgeworCQkvKgorCQkgKiBUaGUgb3JkZXIgb2YgdGhlIGJpdHMgaW4gdGhlIEFYSS1YQURDIHN0YXR1cyByZWdpc3RlciBkb2VzCisJCSAqIG5vdCBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGJpdHMgaW4gdGhlIFhBREMgYWxhcm0gZW5hYmxlCisJCSAqIHJlZ2lzdGVyLiB4YWRjX2hhbmRsZV9ldmVudHMoKSBleHBlY3RzIHRoZSBldmVudHMgdG8gYmUgaW4KKwkJICogdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFhBREMgYWxhcm0gZW5hYmxlIHJlZ2lzdGVyLgorCQkgKi8KKwkJZXZlbnRzID0gKHN0YXR1cyAmIDB4MDAwZSkgPj4gMTsKKwkJZXZlbnRzIHw9IChzdGF0dXMgJiAweDAwMDEpIDw8IDM7CisJCWV2ZW50cyB8PSAoc3RhdHVzICYgMHgzYzAwKSA+PiA2OworCQl4YWRjX2hhbmRsZV9ldmVudHMoaW5kaW9fZGV2LCBldmVudHMpOworCX0KKworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElTUiwgc3RhdHVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgeGFkY19heGlfdXBkYXRlX2FsYXJtKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgYWxhcm0pCit7CisJdWludDMyX3QgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFRoZSBvcmRlciBvZiB0aGUgYml0cyBpbiB0aGUgQVhJLVhBREMgc3RhdHVzIHJlZ2lzdGVyIGRvZXMgbm90IG1hdGNoCisJICogdGhlIG9yZGVyIG9mIHRoZSBiaXRzIGluIHRoZSBYQURDIGFsYXJtIGVuYWJsZSByZWdpc3Rlci4gV2UgZ2V0CisJICogcGFzc2VkIHRoZSBhbGFybSBtYXNrIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZSBYQURDIGFsYXJtIGVuYWJsZQorCSAqIHJlZ2lzdGVyLgorCSAqLworCWFsYXJtID0gKChhbGFybSAmIDB4MDcpIDw8IDEpIHwgKChhbGFybSAmIDB4MDgpID4+IDMpIHwKKwkJCSgoYWxhcm0gJiAweGYwKSA8PCA2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ4YWRjLT5sb2NrLCBmbGFncyk7CisJeGFkY19yZWFkX3JlZyh4YWRjLCBYQURDX0FYSV9SRUdfSVBJRVIsICZ2YWwpOworCXZhbCAmPSB+WEFEQ19BWElfSU5UX0FMQVJNX01BU0s7CisJdmFsIHw9IGFsYXJtOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4YWRjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhhZGNfYXhpX2dldF9kY2xrKHN0cnVjdCB4YWRjICp4YWRjKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoeGFkYy0+Y2xrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YWRjX29wcyB4YWRjX2F4aV9vcHMgPSB7CisJLnJlYWQgPSB4YWRjX2F4aV9yZWFkX2FkY19yZWcsCisJLndyaXRlID0geGFkY19heGlfd3JpdGVfYWRjX3JlZywKKwkuc2V0dXAgPSB4YWRjX2F4aV9zZXR1cCwKKwkuZ2V0X2RjbGtfcmF0ZSA9IHhhZGNfYXhpX2dldF9kY2xrLAorCS51cGRhdGVfYWxhcm0gPSB4YWRjX2F4aV91cGRhdGVfYWxhcm0sCisJLmludGVycnVwdF9oYW5kbGVyID0geGFkY19heGlfaW50ZXJydXB0X2hhbmRsZXIsCisJLmZsYWdzID0gWEFEQ19GTEFHU19CVUZGRVJFRCwKK307CisKK3N0YXRpYyBpbnQgX3hhZGNfdXBkYXRlX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgbWFzaywgdWludDE2X3QgdmFsKQoreworCXVpbnQxNl90IHRtcDsKKwlpbnQgcmV0OworCisJcmV0ID0gX3hhZGNfcmVhZF9hZGNfcmVnKHhhZGMsIHJlZywgJnRtcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIHJlZywgKHRtcCAmIH5tYXNrKSB8IHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgeGFkY191cGRhdGVfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCBtYXNrLCB1aW50MTZfdCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKwlyZXQgPSBfeGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCByZWcsIG1hc2ssIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZ4YWRjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4YWRjX2dldF9kY2xrX3JhdGUoc3RydWN0IHhhZGMgKnhhZGMpCit7CisJcmV0dXJuIHhhZGMtPm9wcy0+Z2V0X2RjbGtfcmF0ZSh4YWRjKTsKK30KKworc3RhdGljIGludCB4YWRjX3VwZGF0ZV9zY2FuX21vZGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCB1bnNpZ25lZCBsb25nICptYXNrKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgbjsKKworCW4gPSBiaXRtYXBfd2VpZ2h0KG1hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCk7CisKKwlrZnJlZSh4YWRjLT5kYXRhKTsKKwl4YWRjLT5kYXRhID0ga2NhbGxvYyhuLCBzaXplb2YoKnhhZGMtPmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXhhZGMtPmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGFkY19zY2FuX2luZGV4X3RvX2NoYW5uZWwodW5zaWduZWQgaW50IHNjYW5faW5kZXgpCit7CisJc3dpdGNoIChzY2FuX2luZGV4KSB7CisJY2FzZSA1OgorCQlyZXR1cm4gWEFEQ19SRUdfVkNDUElOVDsKKwljYXNlIDY6CisJCXJldHVybiBYQURDX1JFR19WQ0NQQVVYOworCWNhc2UgNzoKKwkJcmV0dXJuIFhBRENfUkVHX1ZDQ09fRERSOworCWNhc2UgODoKKwkJcmV0dXJuIFhBRENfUkVHX1RFTVA7CisJY2FzZSA5OgorCQlyZXR1cm4gWEFEQ19SRUdfVkNDSU5UOworCWNhc2UgMTA6CisJCXJldHVybiBYQURDX1JFR19WQ0NBVVg7CisJY2FzZSAxMToKKwkJcmV0dXJuIFhBRENfUkVHX1ZQVk47CisJY2FzZSAxMjoKKwkJcmV0dXJuIFhBRENfUkVHX1ZSRUZQOworCWNhc2UgMTM6CisJCXJldHVybiBYQURDX1JFR19WUkVGTjsKKwljYXNlIDE0OgorCQlyZXR1cm4gWEFEQ19SRUdfVkNDQlJBTTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gWEFEQ19SRUdfVkFVWChzY2FuX2luZGV4IC0gMTYpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHhhZGNfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCit7CisJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgaW50IGNoYW47CisJaW50IGksIGo7CisKKwlpZiAoIXhhZGMtPmRhdGEpCisJCWdvdG8gb3V0OworCisJaiA9IDA7CisJZm9yX2VhY2hfc2V0X2JpdChpLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCisJCWluZGlvX2Rldi0+bWFza2xlbmd0aCkgeworCQljaGFuID0geGFkY19zY2FuX2luZGV4X3RvX2NoYW5uZWwoaSk7CisJCXhhZGNfcmVhZF9hZGNfcmVnKHhhZGMsIGNoYW4sICZ4YWRjLT5kYXRhW2pdKTsKKwkJaisrOworCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnMoaW5kaW9fZGV2LCB4YWRjLT5kYXRhKTsKKworb3V0OgorCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgeGFkY190cmlnZ2VyX3NldF9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdnZXIsIGJvb2wgc3RhdGUpCit7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fdHJpZ2dlcl9nZXRfZHJ2ZGF0YSh0cmlnZ2VyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjb252c3Q7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKworCWlmIChzdGF0ZSkgeworCQkvKiBPbmx5IG9uZSBvZiB0aGUgdHdvIHRyaWdnZXJzIGNhbiBiZSBhY3RpdmUgYXQgdGhlIGEgdGltZS4gKi8KKwkJaWYgKHhhZGMtPnRyaWdnZXIgIT0gTlVMTCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnJfb3V0OworCQl9IGVsc2UgeworCQkJeGFkYy0+dHJpZ2dlciA9IHRyaWdnZXI7CisJCQlpZiAodHJpZ2dlciA9PSB4YWRjLT5jb252c3RfdHJpZ2dlcikKKwkJCQljb252c3QgPSBYQURDX0NPTkYwX0VDOworCQkJZWxzZQorCQkJCWNvbnZzdCA9IDA7CisJCX0KKwkJcmV0ID0gX3hhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjBfRUMsCisJCQkJCWNvbnZzdCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXQ7CisJfSBlbHNlIHsKKwkJeGFkYy0+dHJpZ2dlciA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnhhZGMtPmxvY2ssIGZsYWdzKTsKKwl4YWRjX3JlYWRfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgJnZhbCk7CisJeGFkY193cml0ZV9yZWcoeGFkYywgWEFEQ19BWElfUkVHX0lQSVNSLCB2YWwgJiBYQURDX0FYSV9JTlRfRU9TKTsKKwlpZiAoc3RhdGUpCisJCXZhbCB8PSBYQURDX0FYSV9JTlRfRU9TOworCWVsc2UKKwkJdmFsICY9IH5YQURDX0FYSV9JTlRfRU9TOworCXhhZGNfd3JpdGVfcmVnKHhhZGMsIFhBRENfQVhJX1JFR19JUElFUiwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4YWRjLT5sb2NrLCBmbGFncyk7CisKK2Vycl9vdXQ6CisJbXV0ZXhfdW5sb2NrKCZ4YWRjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyB4YWRjX3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZ4YWRjX3RyaWdnZXJfc2V0X3N0YXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBpaW9fdHJpZ2dlciAqeGFkY19hbGxvY190cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWc7CisJaW50IHJldDsKKworCXRyaWcgPSBpaW9fdHJpZ2dlcl9hbGxvYygiJXMlZC0lcyIsIGluZGlvX2Rldi0+bmFtZSwKKwkJCQlpbmRpb19kZXYtPmlkLCBuYW1lKTsKKwlpZiAodHJpZyA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXRyaWctPmRldi5wYXJlbnQgPSBpbmRpb19kZXYtPmRldi5wYXJlbnQ7CisJdHJpZy0+b3BzID0gJnhhZGNfdHJpZ2dlcl9vcHM7CisJaWlvX3RyaWdnZXJfc2V0X2RydmRhdGEodHJpZywgaWlvX3ByaXYoaW5kaW9fZGV2KSk7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3Rlcih0cmlnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKKworCXJldHVybiB0cmlnOworCitlcnJvcl9mcmVlX3RyaWc6CisJaWlvX3RyaWdnZXJfZnJlZSh0cmlnKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgaW50IHhhZGNfcG93ZXJfYWRjX2Ioc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCBzZXFfbW9kZSkKK3sKKwl1aW50MTZfdCB2YWw7CisKKwlzd2l0Y2ggKHNlcV9tb2RlKSB7CisJY2FzZSBYQURDX0NPTkYxX1NFUV9TSU1VTFRBTkVPVVM6CisJY2FzZSBYQURDX0NPTkYxX1NFUV9JTkRFUEVOREVOVDoKKwkJdmFsID0gWEFEQ19DT05GMl9QRF9BRENfQjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjIsIFhBRENfQ09ORjJfUERfTUFTSywKKwkJdmFsKTsKK30KKworc3RhdGljIGludCB4YWRjX2dldF9zZXFfbW9kZShzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgbG9uZyBzY2FuX21vZGUpCit7CisJdW5zaWduZWQgaW50IGF1eF9zY2FuX21vZGUgPSBzY2FuX21vZGUgPj4gMTY7CisKKwlpZiAoeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgPT0gWEFEQ19FWFRFUk5BTF9NVVhfRFVBTCkKKwkJcmV0dXJuIFhBRENfQ09ORjFfU0VRX1NJTVVMVEFORU9VUzsKKworCWlmICgoYXV4X3NjYW5fbW9kZSAmIDB4ZmYwMCkgPT0gMCB8fAorCQkoYXV4X3NjYW5fbW9kZSAmIDB4MDBmZikgPT0gMCkKKwkJcmV0dXJuIFhBRENfQ09ORjFfU0VRX0NPTlRJTlVPVVM7CisKKwlyZXR1cm4gWEFEQ19DT05GMV9TRVFfU0lNVUxUQU5FT1VTOworfQorCitzdGF0aWMgaW50IHhhZGNfcG9zdGRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyBzY2FuX21hc2s7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXNjYW5fbWFzayA9IDE7IC8qIFJ1biBjYWxpYnJhdGlvbiBhcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSAqLworCWZvciAoaSA9IDA7IGkgPCBpbmRpb19kZXYtPm51bV9jaGFubmVsczsgaSsrKQorCQlzY2FuX21hc2sgfD0gQklUKGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0uc2Nhbl9pbmRleCk7CisKKwkvKiBFbmFibGUgYWxsIGNoYW5uZWxzIGFuZCBjYWxpYnJhdGlvbiAqLworCXJldCA9IHhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19TRVEoMCksIHNjYW5fbWFzayAmIDB4ZmZmZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHhhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19TRVEoMSksIHNjYW5fbWFzayA+PiAxNik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjFfU0VRX01BU0ssCisJCVhBRENfQ09ORjFfU0VRX0NPTlRJTlVPVVMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4geGFkY19wb3dlcl9hZGNfYih4YWRjLCBYQURDX0NPTkYxX1NFUV9DT05USU5VT1VTKTsKK30KKworc3RhdGljIGludCB4YWRjX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHNjYW5fbWFzazsKKwlpbnQgc2VxX21vZGU7CisJaW50IHJldDsKKworCXJldCA9IHhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjFfU0VRX01BU0ssCisJCVhBRENfQ09ORjFfU0VRX0RFRkFVTFQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc2Nhbl9tYXNrID0gKmluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzazsKKwlzZXFfbW9kZSA9IHhhZGNfZ2V0X3NlcV9tb2RlKHhhZGMsIHNjYW5fbWFzayk7CisKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfU0VRKDApLCBzY2FuX21hc2sgJiAweGZmZmYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0geGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1NFUSgxKSwgc2Nhbl9tYXNrID4+IDE2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IHhhZGNfcG93ZXJfYWRjX2IoeGFkYywgc2VxX21vZGUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0geGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMSwgWEFEQ19DT05GMV9TRVFfTUFTSywKKwkJc2VxX21vZGUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJeGFkY19wb3N0ZGlzYWJsZShpbmRpb19kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgeGFkY19idWZmZXJfb3BzID0geworCS5wcmVlbmFibGUgPSAmeGFkY19wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAorCS5wb3N0ZGlzYWJsZSA9ICZ4YWRjX3Bvc3RkaXNhYmxlLAorfTsKKworc3RhdGljIGludCB4YWRjX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgaW5mbykKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgaW50IGRpdjsKKwl1aW50MTZfdCB2YWwxNjsKKwlpbnQgcmV0OworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0geGFkY19yZWFkX2FkY19yZWcoeGFkYywgY2hhbi0+YWRkcmVzcywgJnZhbDE2KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXZhbDE2ID4+PSA0OworCQlpZiAoY2hhbi0+c2Nhbl90eXBlLnNpZ24gPT0gJ3UnKQorCQkJKnZhbCA9IHZhbDE2OworCQllbHNlCisJCQkqdmFsID0gc2lnbl9leHRlbmQzMih2YWwxNiwgMTEpOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19WT0xUQUdFOgorCQkJLyogViA9ICh2YWwgKiAzLjApIC8gNDA5NiAqLworCQkJc3dpdGNoIChjaGFuLT5hZGRyZXNzKSB7CisJCQljYXNlIFhBRENfUkVHX1ZDQ0lOVDoKKwkJCWNhc2UgWEFEQ19SRUdfVkNDQVVYOgorCQkJY2FzZSBYQURDX1JFR19WQ0NCUkFNOgorCQkJY2FzZSBYQURDX1JFR19WQ0NQSU5UOgorCQkJY2FzZSBYQURDX1JFR19WQ0NQQVVYOgorCQkJY2FzZSBYQURDX1JFR19WQ0NPX0REUjoKKwkJCQkqdmFsID0gMzAwMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJKnZhbCA9IDEwMDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqdmFsMiA9IDEyOworCQkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCQljYXNlIElJT19URU1QOgorCQkJLyogVGVtcCBpbiBDID0gKHZhbCAqIDUwMy45NzUpIC8gNDA5NiAtIDI3My4xNSAqLworCQkJKnZhbCA9IDUwMzk3NTsKKwkJCSp2YWwyID0gMTI7CisJCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCS8qIE9ubHkgdGhlIHRlbXBlcmF0dXJlIGNoYW5uZWwgaGFzIGFuIG9mZnNldCAqLworCQkqdmFsID0gLSgoMjczMTUwIDw8IDEyKSAvIDUwMzk3NSk7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQlyZXQgPSB4YWRjX3JlYWRfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMiwgJnZhbDE2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZGl2ID0gKHZhbDE2ICYgWEFEQ19DT05GMl9ESVZfTUFTSykgPj4gWEFEQ19DT05GMl9ESVZfT0ZGU0VUOworCQlpZiAoZGl2IDwgMikKKwkJCWRpdiA9IDI7CisKKwkJKnZhbCA9IHhhZGNfZ2V0X2RjbGtfcmF0ZSh4YWRjKSAvIGRpdiAvIDI2OworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGFkY193cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgaW5mbykKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyBjbGtfcmF0ZSA9IHhhZGNfZ2V0X2RjbGtfcmF0ZSh4YWRjKTsKKwl1bnNpZ25lZCBpbnQgZGl2OworCisJaWYgKGluZm8gIT0gSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbCA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1heC4gMTUwIGtTUFMgKi8KKwlpZiAodmFsID4gMTUwMDAwKQorCQl2YWwgPSAxNTAwMDA7CisKKwl2YWwgKj0gMjY7CisKKwkvKiBNaW4gMU1IeiAqLworCWlmICh2YWwgPCAxMDAwMDAwKQorCQl2YWwgPSAxMDAwMDAwOworCisJLyoKKwkgKiBXZSB3YW50IHRvIHJvdW5kIGRvd24sIGJ1dCBvbmx5IGlmIHdlIGRvIG5vdCBleGNlZWQgdGhlIDE1MCBrU1BTCisJICogbGltaXQuCisJICovCisJZGl2ID0gY2xrX3JhdGUgLyB2YWw7CisJaWYgKGNsa19yYXRlIC8gZGl2IC8gMjYgPiAxNTAwMDApCisJCWRpdisrOworCWlmIChkaXYgPCAyKQorCQlkaXYgPSAyOworCWVsc2UgaWYgKGRpdiA+IDB4ZmYpCisJCWRpdiA9IDB4ZmY7CisKKwlyZXR1cm4geGFkY191cGRhdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19DT05GMiwgWEFEQ19DT05GMl9ESVZfTUFTSywKKwkJZGl2IDw8IFhBRENfQ09ORjJfRElWX09GRlNFVCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2V2ZW50X3NwZWMgeGFkY190ZW1wX2V2ZW50c1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fRVZfVFlQRV9USFJFU0gsCisJCS5kaXIgPSBJSU9fRVZfRElSX1JJU0lORywKKwkJLm1hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0VWX0lORk9fRU5BQkxFKSB8CisJCQkJQklUKElJT19FVl9JTkZPX1ZBTFVFKSB8CisJCQkJQklUKElJT19FVl9JTkZPX0hZU1RFUkVTSVMpLAorCX0sCit9OworCisvKiBTZXBhcmF0ZSB2YWx1ZXMgZm9yIHVwcGVyIGFuZCBsb3dlciB0aHJlc2hvbGRzLCBidXQgb25seSBhIHNoYXJlZCBlbmFibGVkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19ldmVudF9zcGVjIHhhZGNfdm9sdGFnZV9ldmVudHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX0VWX1RZUEVfVEhSRVNILAorCQkuZGlyID0gSUlPX0VWX0RJUl9SSVNJTkcsCisJCS5tYXNrX3NlcGFyYXRlID0gQklUKElJT19FVl9JTkZPX1ZBTFVFKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX0VWX1RZUEVfVEhSRVNILAorCQkuZGlyID0gSUlPX0VWX0RJUl9GQUxMSU5HLAorCQkubWFza19zZXBhcmF0ZSA9IEJJVChJSU9fRVZfSU5GT19WQUxVRSksCisJfSwgeworCQkudHlwZSA9IElJT19FVl9UWVBFX1RIUkVTSCwKKwkJLmRpciA9IElJT19FVl9ESVJfRUlUSEVSLAorCQkubWFza19zZXBhcmF0ZSA9IEJJVChJSU9fRVZfSU5GT19FTkFCTEUpLAorCX0sCit9OworCisjZGVmaW5lIFhBRENfQ0hBTl9URU1QKF9jaGFuLCBfc2Nhbl9pbmRleCwgX2FkZHIpIHsgXAorCS50eXBlID0gSUlPX1RFTVAsIFwKKwkuaW5kZXhlZCA9IDEsIFwKKwkuY2hhbm5lbCA9IChfY2hhbiksIFwKKwkuYWRkcmVzcyA9IChfYWRkciksIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8IFwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwgXAorCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5ldmVudF9zcGVjID0geGFkY190ZW1wX2V2ZW50cywgXAorCS5udW1fZXZlbnRfc3BlY3MgPSBBUlJBWV9TSVpFKHhhZGNfdGVtcF9ldmVudHMpLCBcCisJLnNjYW5faW5kZXggPSAoX3NjYW5faW5kZXgpLCBcCisJLnNjYW5fdHlwZSA9IHsgXAorCQkuc2lnbiA9ICd1JywgXAorCQkucmVhbGJpdHMgPSAxMiwgXAorCQkuc3RvcmFnZWJpdHMgPSAxNiwgXAorCQkuc2hpZnQgPSA0LCBcCisJCS5lbmRpYW5uZXNzID0gSUlPX0NQVSwgXAorCX0sIFwKK30KKworI2RlZmluZSBYQURDX0NIQU5fVk9MVEFHRShfY2hhbiwgX3NjYW5faW5kZXgsIF9hZGRyLCBfZXh0LCBfYWxhcm0pIHsgXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsIFwKKwkuaW5kZXhlZCA9IDEsIFwKKwkuY2hhbm5lbCA9IChfY2hhbiksIFwKKwkuYWRkcmVzcyA9IChfYWRkciksIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8IFwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5ldmVudF9zcGVjID0gKF9hbGFybSkgPyB4YWRjX3ZvbHRhZ2VfZXZlbnRzIDogTlVMTCwgXAorCS5udW1fZXZlbnRfc3BlY3MgPSAoX2FsYXJtKSA/IEFSUkFZX1NJWkUoeGFkY192b2x0YWdlX2V2ZW50cykgOiAwLCBcCisJLnNjYW5faW5kZXggPSAoX3NjYW5faW5kZXgpLCBcCisJLnNjYW5fdHlwZSA9IHsgXAorCQkuc2lnbiA9ICd1JywgXAorCQkucmVhbGJpdHMgPSAxMiwgXAorCQkuc3RvcmFnZWJpdHMgPSAxNiwgXAorCQkuc2hpZnQgPSA0LCBcCisJCS5lbmRpYW5uZXNzID0gSUlPX0NQVSwgXAorCX0sIFwKKwkuZXh0ZW5kX25hbWUgPSBfZXh0LCBcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyB4YWRjX2NoYW5uZWxzW10gPSB7CisJWEFEQ19DSEFOX1RFTVAoMCwgOCwgWEFEQ19SRUdfVEVNUCksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMCwgOSwgWEFEQ19SRUdfVkNDSU5ULCAidmNjaW50IiwgdHJ1ZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMSwgMTAsIFhBRENfUkVHX1ZDQ0lOVCwgInZjY2F1eCIsIHRydWUpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDIsIDE0LCBYQURDX1JFR19WQ0NCUkFNLCAidmNjYnJhbSIsIHRydWUpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDMsIDUsIFhBRENfUkVHX1ZDQ1BJTlQsICJ2Y2NwaW50IiwgdHJ1ZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoNCwgNiwgWEFEQ19SRUdfVkNDUEFVWCwgInZjY3BhdXgiLCB0cnVlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg1LCA3LCBYQURDX1JFR19WQ0NPX0REUiwgInZjY29kZHIiLCB0cnVlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg2LCAxMiwgWEFEQ19SRUdfVlJFRlAsICJ2cmVmcCIsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg3LCAxMywgWEFEQ19SRUdfVlJFRk4sICJ2cmVmbiIsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSg4LCAxMSwgWEFEQ19SRUdfVlBWTiwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDksIDE2LCBYQURDX1JFR19WQVVYKDApLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTAsIDE3LCBYQURDX1JFR19WQVVYKDEpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTEsIDE4LCBYQURDX1JFR19WQVVYKDIpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTIsIDE5LCBYQURDX1JFR19WQVVYKDMpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTMsIDIwLCBYQURDX1JFR19WQVVYKDQpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTQsIDIxLCBYQURDX1JFR19WQVVYKDUpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTUsIDIyLCBYQURDX1JFR19WQVVYKDYpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTYsIDIzLCBYQURDX1JFR19WQVVYKDcpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTcsIDI0LCBYQURDX1JFR19WQVVYKDgpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTgsIDI1LCBYQURDX1JFR19WQVVYKDkpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMTksIDI2LCBYQURDX1JFR19WQVVYKDEwKSwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDIwLCAyNywgWEFEQ19SRUdfVkFVWCgxMSksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgyMSwgMjgsIFhBRENfUkVHX1ZBVVgoMTIpLCBOVUxMLCBmYWxzZSksCisJWEFEQ19DSEFOX1ZPTFRBR0UoMjIsIDI5LCBYQURDX1JFR19WQVVYKDEzKSwgTlVMTCwgZmFsc2UpLAorCVhBRENfQ0hBTl9WT0xUQUdFKDIzLCAzMCwgWEFEQ19SRUdfVkFVWCgxNCksIE5VTEwsIGZhbHNlKSwKKwlYQURDX0NIQU5fVk9MVEFHRSgyNCwgMzEsIFhBRENfUkVHX1ZBVVgoMTUpLCBOVUxMLCBmYWxzZSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHhhZGNfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSAmeGFkY19yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gJnhhZGNfd3JpdGVfcmF3LAorCS5yZWFkX2V2ZW50X2NvbmZpZyA9ICZ4YWRjX3JlYWRfZXZlbnRfY29uZmlnLAorCS53cml0ZV9ldmVudF9jb25maWcgPSAmeGFkY193cml0ZV9ldmVudF9jb25maWcsCisJLnJlYWRfZXZlbnRfdmFsdWUgPSAmeGFkY19yZWFkX2V2ZW50X3ZhbHVlLAorCS53cml0ZV9ldmVudF92YWx1ZSA9ICZ4YWRjX3dyaXRlX2V2ZW50X3ZhbHVlLAorCS51cGRhdGVfc2Nhbl9tb2RlID0gJnhhZGNfdXBkYXRlX3NjYW5fbW9kZSwKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeGFkY19vZl9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCx6eW5xLXhhZGMtMS4wMC5hIiwgKHZvaWQgKikmeGFkY196eW5xX29wcyB9LAorCXsgLmNvbXBhdGlibGUgPSAieGxueCxheGkteGFkYy0xLjAwLmEiLCAodm9pZCAqKSZ4YWRjX2F4aV9vcHMgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGFkY19vZl9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBpbnQgeGFkY19wYXJzZV9kdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCXVuc2lnbmVkIGludCAqY29uZikKK3sKKwlzdHJ1Y3QgeGFkYyAqeGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLCAqY2hhbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoYW5fbm9kZSwgKmNoaWxkOworCXVuc2lnbmVkIGludCBudW1fY2hhbm5lbHM7CisJY29uc3QgY2hhciAqZXh0ZXJuYWxfbXV4OworCXUzMiBleHRfbXV4X2NoYW47CisJaW50IHJlZzsKKwlpbnQgcmV0OworCisJKmNvbmYgPSAwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJ4bG54LGV4dGVybmFsLW11eCIsICZleHRlcm5hbF9tdXgpOworCWlmIChyZXQgPCAwIHx8IHN0cmNhc2VjbXAoZXh0ZXJuYWxfbXV4LCAibm9uZSIpID09IDApCisJCXhhZGMtPmV4dGVybmFsX211eF9tb2RlID0gWEFEQ19FWFRFUk5BTF9NVVhfTk9ORTsKKwllbHNlIGlmIChzdHJjYXNlY21wKGV4dGVybmFsX211eCwgInNpbmdsZSIpID09IDApCisJCXhhZGMtPmV4dGVybmFsX211eF9tb2RlID0gWEFEQ19FWFRFUk5BTF9NVVhfU0lOR0xFOworCWVsc2UgaWYgKHN0cmNhc2VjbXAoZXh0ZXJuYWxfbXV4LCAiZHVhbCIpID09IDApCisJCXhhZGMtPmV4dGVybmFsX211eF9tb2RlID0gWEFEQ19FWFRFUk5BTF9NVVhfRFVBTDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHhhZGMtPmV4dGVybmFsX211eF9tb2RlICE9IFhBRENfRVhURVJOQUxfTVVYX05PTkUpIHsKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ4bG54LGV4dGVybmFsLW11eC1jaGFubmVsIiwKKwkJCQkJJmV4dF9tdXhfY2hhbik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoeGFkYy0+ZXh0ZXJuYWxfbXV4X21vZGUgPT0gWEFEQ19FWFRFUk5BTF9NVVhfU0lOR0xFKSB7CisJCQlpZiAoZXh0X211eF9jaGFuID09IDApCisJCQkJZXh0X211eF9jaGFuID0gWEFEQ19SRUdfVlBWTjsKKwkJCWVsc2UgaWYgKGV4dF9tdXhfY2hhbiA8PSAxNikKKwkJCQlleHRfbXV4X2NoYW4gPSBYQURDX1JFR19WQVVYKGV4dF9tdXhfY2hhbiAtIDEpOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJaWYgKGV4dF9tdXhfY2hhbiA+IDAgJiYgZXh0X211eF9jaGFuIDw9IDgpCisJCQkJZXh0X211eF9jaGFuID0gWEFEQ19SRUdfVkFVWChleHRfbXV4X2NoYW4gLSAxKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCSpjb25mIHw9IFhBRENfQ09ORjBfTVVYIHwgWEFEQ19DT05GMF9DSEFOKGV4dF9tdXhfY2hhbik7CisJfQorCisJY2hhbm5lbHMgPSBrbWVtZHVwKHhhZGNfY2hhbm5lbHMsIHNpemVvZih4YWRjX2NoYW5uZWxzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVscykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwludW1fY2hhbm5lbHMgPSA5OworCWNoYW4gPSAmY2hhbm5lbHNbOV07CisKKwljaGFuX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgInhsbngsY2hhbm5lbHMiKTsKKwlpZiAoY2hhbl9ub2RlKSB7CisJCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoY2hhbl9ub2RlLCBjaGlsZCkgeworCQkJaWYgKG51bV9jaGFubmVscyA+PSBBUlJBWV9TSVpFKHhhZGNfY2hhbm5lbHMpKSB7CisJCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgInJlZyIsICZyZWcpOworCQkJaWYgKHJldCB8fCByZWcgPiAxNikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChjaGlsZCwgInhsbngsYmlwb2xhciIpKQorCQkJCWNoYW4tPnNjYW5fdHlwZS5zaWduID0gJ3MnOworCisJCQlpZiAocmVnID09IDApIHsKKwkJCQljaGFuLT5zY2FuX2luZGV4ID0gMTE7CisJCQkJY2hhbi0+YWRkcmVzcyA9IFhBRENfUkVHX1ZQVk47CisJCQl9IGVsc2UgeworCQkJCWNoYW4tPnNjYW5faW5kZXggPSAxNSArIHJlZzsKKwkJCQljaGFuLT5zY2FuX2luZGV4ID0gWEFEQ19SRUdfVkFVWChyZWcgLSAxKTsKKwkJCX0KKwkJCW51bV9jaGFubmVscysrOworCQkJY2hhbisrOworCQl9CisJfQorCW9mX25vZGVfcHV0KGNoYW5fbm9kZSk7CisKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IG51bV9jaGFubmVsczsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0ga3JlYWxsb2MoY2hhbm5lbHMsIHNpemVvZigqY2hhbm5lbHMpICoKKwkJCQkJbnVtX2NoYW5uZWxzLCBHRlBfS0VSTkVMKTsKKwkvKiBJZiB3ZSBjYW4ndCByZXNpemUgdGhlIGNoYW5uZWxzIGFycmF5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgKi8KKwlpZiAoIWluZGlvX2Rldi0+Y2hhbm5lbHMpCisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXVuc2lnbmVkIGludCBiaXBvbGFyX21hc2s7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdW5zaWduZWQgaW50IGNvbmYwOworCXN0cnVjdCB4YWRjICp4YWRjOworCWludCByZXQ7CisJaW50IGlycTsKKwlpbnQgaTsKKworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpCisJCXJldHVybiAtRU5PREVWOworCisJaWQgPSBvZl9tYXRjaF9ub2RlKHhhZGNfb2ZfbWF0Y2hfdGFibGUsIHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8PSAwKQorCQlyZXR1cm4gLUVOWElPOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqeGFkYykpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXhhZGMtPm9wcyA9IGlkLT5kYXRhOworCWluaXRfY29tcGxldGlvbigmeGFkYy0+Y29tcGxldGlvbik7CisJbXV0ZXhfaW5pdCgmeGFkYy0+bXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZ4YWRjLT5sb2NrKTsKKwlJTklUX0RFTEFZRURfV09SSygmeGFkYy0+enlucV91bm1hc2tfd29yaywgeGFkY196eW5xX3VubWFza193b3JrZXIpOworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl4YWRjLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIG1lbSk7CisJaWYgKElTX0VSUih4YWRjLT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoeGFkYy0+YmFzZSk7CisKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWluZGlvX2Rldi0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlpbmRpb19kZXYtPm5hbWUgPSAieGFkYyI7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+aW5mbyA9ICZ4YWRjX2luZm87CisKKwlyZXQgPSB4YWRjX3BhcnNlX2R0KGluZGlvX2RldiwgcGRldi0+ZGV2Lm9mX25vZGUsICZjb25mMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGV2aWNlX2ZyZWU7CisKKwlpZiAoeGFkYy0+b3BzLT5mbGFncyAmIFhBRENfRkxBR1NfQlVGRkVSRUQpIHsKKwkJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LAorCQkJJmlpb19wb2xsZnVuY19zdG9yZV90aW1lLCAmeGFkY190cmlnZ2VyX2hhbmRsZXIsCisJCQkmeGFkY19idWZmZXJfb3BzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2RldmljZV9mcmVlOworCisJCXhhZGMtPmNvbnZzdF90cmlnZ2VyID0geGFkY19hbGxvY190cmlnZ2VyKGluZGlvX2RldiwgImNvbnZzdCIpOworCQlpZiAoSVNfRVJSKHhhZGMtPmNvbnZzdF90cmlnZ2VyKSkKKwkJCWdvdG8gZXJyX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cDsKKwkJeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyID0geGFkY19hbGxvY190cmlnZ2VyKGluZGlvX2RldiwKKwkJCSJzYW1wbGVyYXRlIik7CisJCWlmIChJU19FUlIoeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyKSkKKwkJCWdvdG8gZXJyX2ZyZWVfY29udnN0X3RyaWdnZXI7CisJfQorCisJeGFkYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoeGFkYy0+Y2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKHhhZGMtPmNsayk7CisJCWdvdG8gZXJyX2ZyZWVfc2FtcGxlcmF0ZV90cmlnZ2VyOworCX0KKwljbGtfcHJlcGFyZV9lbmFibGUoeGFkYy0+Y2xrKTsKKworCXJldCA9IHhhZGMtPm9wcy0+c2V0dXAocGRldiwgaW5kaW9fZGV2LCBpcnEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfc2FtcGxlcmF0ZV90cmlnZ2VyOworCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCB4YWRjLT5vcHMtPmludGVycnVwdF9oYW5kbGVyLAorCQkJCXhhZGMtPm9wcy0+dGhyZWFkZWRfaW50ZXJydXB0X2hhbmRsZXIsCisJCQkJMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY2xrX2Rpc2FibGVfdW5wcmVwYXJlOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXhhZGNfcmVhZF9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1RIUkVTSE9MRChpKSwKKwkJCSZ4YWRjLT50aHJlc2hvbGRbaV0pOworCisJcmV0ID0geGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX0NPTkYwLCBjb25mMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwliaXBvbGFyX21hc2sgPSAwOworCWZvciAoaSA9IDA7IGkgPCBpbmRpb19kZXYtPm51bV9jaGFubmVsczsgaSsrKSB7CisJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnNjYW5fdHlwZS5zaWduID09ICdzJykKKwkJCWJpcG9sYXJfbWFzayB8PSBCSVQoaW5kaW9fZGV2LT5jaGFubmVsc1tpXS5zY2FuX2luZGV4KTsKKwl9CisKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfSU5QVVRfTU9ERSgwKSwgYmlwb2xhcl9tYXNrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKwlyZXQgPSB4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfSU5QVVRfTU9ERSgxKSwKKwkJYmlwb2xhcl9tYXNrID4+IDE2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCS8qIERpc2FibGUgYWxsIGFsYXJtcyAqLworCXhhZGNfdXBkYXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsIFhBRENfQ09ORjFfQUxBUk1fTUFTSywKKwkJWEFEQ19DT05GMV9BTEFSTV9NQVNLKTsKKworCS8qIFNldCB0aHJlc2hvbGRzIHRvIG1pbi9tYXggKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkvKgorCQkgKiBTZXQgbWF4IHZvbHRhZ2UgdGhyZXNob2xkIGFuZCBib3RoIHRlbXBlcmF0dXJlIHRocmVzaG9sZHMgdG8KKwkJICogMHhmZmZmLCBtaW4gdm9sdGFnZSB0aHJlc2hvbGQgdG8gMC4KKwkJICovCisJCWlmIChpICUgOCA8IDQgfHwgaSA9PSA3KQorCQkJeGFkYy0+dGhyZXNob2xkW2ldID0gMHhmZmZmOworCQllbHNlCisJCQl4YWRjLT50aHJlc2hvbGRbaV0gPSAwOworCQl4YWRjX3dyaXRlX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfVEhSRVNIT0xEKGkpLAorCQkJeGFkYy0+dGhyZXNob2xkW2ldKTsKKwl9CisKKwkvKiBHbyB0byBub24tYnVmZmVyZWQgbW9kZSAqLworCXhhZGNfcG9zdGRpc2FibGUoaW5kaW9fZGV2KTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlycSwgaW5kaW9fZGV2KTsKK2Vycl9mcmVlX3NhbXBsZXJhdGVfdHJpZ2dlcjoKKwlpZiAoeGFkYy0+b3BzLT5mbGFncyAmIFhBRENfRkxBR1NfQlVGRkVSRUQpCisJCWlpb190cmlnZ2VyX2ZyZWUoeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyKTsKK2Vycl9mcmVlX2NvbnZzdF90cmlnZ2VyOgorCWlmICh4YWRjLT5vcHMtPmZsYWdzICYgWEFEQ19GTEFHU19CVUZGRVJFRCkKKwkJaWlvX3RyaWdnZXJfZnJlZSh4YWRjLT5jb252c3RfdHJpZ2dlcik7CitlcnJfdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwOgorCWlmICh4YWRjLT5vcHMtPmZsYWdzICYgWEFEQ19GTEFHU19CVUZGRVJFRCkKKwkJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworZXJyX2Nsa19kaXNhYmxlX3VucHJlcGFyZToKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoeGFkYy0+Y2xrKTsKK2Vycl9kZXZpY2VfZnJlZToKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGFkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHhhZGMgKnhhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHhhZGMtPm9wcy0+ZmxhZ3MgJiBYQURDX0ZMQUdTX0JVRkZFUkVEKSB7CisJCWlpb190cmlnZ2VyX2ZyZWUoeGFkYy0+c2FtcGxlcmF0ZV90cmlnZ2VyKTsKKwkJaWlvX3RyaWdnZXJfZnJlZSh4YWRjLT5jb252c3RfdHJpZ2dlcik7CisJCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKwl9CisJZnJlZV9pcnEoaXJxLCBpbmRpb19kZXYpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZSh4YWRjLT5jbGspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnhhZGMtPnp5bnFfdW5tYXNrX3dvcmspOworCWtmcmVlKHhhZGMtPmRhdGEpOworCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHhhZGNfZHJpdmVyID0geworCS5wcm9iZSA9IHhhZGNfcHJvYmUsCisJLnJlbW92ZSA9IHhhZGNfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInhhZGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0geGFkY19vZl9tYXRjaF90YWJsZSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGFkY19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFhBREMgSUlPIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWV2ZW50cy5jIGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLWV2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2YwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hZGMveGlsaW54LXhhZGMtZXZlbnRzLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBYaWxpbnggWEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgInhpbGlueC14YWRjLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqeGFkY19ldmVudF90b19jaGFubmVsKAorCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHVuc2lnbmVkIGludCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBYQURDX1RIUkVTSE9MRF9PVF9NQVg6CisJY2FzZSBYQURDX1RIUkVTSE9MRF9URU1QX01BWDoKKwkJcmV0dXJuICZpbmRpb19kZXYtPmNoYW5uZWxzWzBdOworCWNhc2UgWEFEQ19USFJFU0hPTERfVkNDSU5UX01BWDoKKwljYXNlIFhBRENfVEhSRVNIT0xEX1ZDQ0FVWF9NQVg6CisJCXJldHVybiAmaW5kaW9fZGV2LT5jaGFubmVsc1tldmVudF07CisJZGVmYXVsdDoKKwkJcmV0dXJuICZpbmRpb19kZXYtPmNoYW5uZWxzW2V2ZW50LTFdOworCX0KK30KKworc3RhdGljIHZvaWQgeGFkY19oYW5kbGVfZXZlbnQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwkvKiBUZW1wZXJhdHVyZSB0aHJlc2hvbGQgZXJyb3IsIHdlIGRvbid0IGhhbmRsZSB0aGlzIHlldCAqLworCWlmIChldmVudCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoZXZlbnQgPCA0KQorCQlvZmZzZXQgPSBldmVudDsKKwllbHNlCisJCW9mZnNldCA9IGV2ZW50ICsgNDsKKworCWNoYW4gPSB4YWRjX2V2ZW50X3RvX2NoYW5uZWwoaW5kaW9fZGV2LCBldmVudCk7CisKKwlpZiAoY2hhbi0+dHlwZSA9PSBJSU9fVEVNUCkgeworCQkvKgorCQkgKiBUaGUgdGVtcGVyYXR1cmUgY2hhbm5lbCBvbmx5IHN1cHBvcnRzIG92ZXItdGVtcGVyYXR1cmUKKwkJICogZXZlbnRzLgorCQkgKi8KKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJSUlPX1VOTU9EX0VWRU5UX0NPREUoY2hhbi0+dHlwZSwgY2hhbi0+Y2hhbm5lbCwKKwkJCQlJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfUklTSU5HKSwKKwkJCWlpb19nZXRfdGltZV9ucygpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3Igb3RoZXIgY2hhbm5lbHMgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGlzIGEgdXBwZXIgb3IKKwkJICogbG93ZXIgdGhyZXNob2xkIGV2ZW50LiBVc2Vyc3BhY2Ugd2lsbCBoYXZlIHRvIGNoZWNrIHRoZQorCQkgKiBjaGFubmVsIHZhbHVlIGlmIGl0IHdhbnRzIHRvIGtub3cuCisJCSAqLworCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQlJSU9fVU5NT0RfRVZFTlRfQ09ERShjaGFuLT50eXBlLCBjaGFuLT5jaGFubmVsLAorCQkJCUlJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9FSVRIRVIpLAorCQkJaWlvX2dldF90aW1lX25zKCkpOworCX0KK30KKwordm9pZCB4YWRjX2hhbmRsZV9ldmVudHMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgbG9uZyBldmVudHMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZldmVudHMsIDgpCisJCXhhZGNfaGFuZGxlX2V2ZW50KGluZGlvX2RldiwgaSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCB4YWRjX2dldF90aHJlc2hvbGRfb2Zmc2V0KGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCW9mZnNldCA9IFhBRENfVEhSRVNIT0xEX09UX01BWDsKKwl9IGVsc2UgeworCQlpZiAoY2hhbi0+Y2hhbm5lbCA8IDIpCisJCQlvZmZzZXQgPSBjaGFuLT5jaGFubmVsICsgMTsKKwkJZWxzZQorCQkJb2Zmc2V0ID0gY2hhbi0+Y2hhbm5lbCArIDY7CisJfQorCisJaWYgKGRpciA9PSBJSU9fRVZfRElSX0ZBTExJTkcpCisJCW9mZnNldCArPSA0OworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4YWRjX2dldF9hbGFybV9tYXNrKGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuKQoreworCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCXJldHVybiBYQURDX0FMQVJNX09UX01BU0s7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChjaGFuLT5jaGFubmVsKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiBYQURDX0FMQVJNX1ZDQ0lOVF9NQVNLOworCQljYXNlIDE6CisJCQlyZXR1cm4gWEFEQ19BTEFSTV9WQ0NBVVhfTUFTSzsKKwkJY2FzZSAyOgorCQkJcmV0dXJuIFhBRENfQUxBUk1fVkNDQlJBTV9NQVNLOworCQljYXNlIDM6CisJCQlyZXR1cm4gWEFEQ19BTEFSTV9WQ0NQSU5UX01BU0s7CisJCWNhc2UgNDoKKwkJCXJldHVybiBYQURDX0FMQVJNX1ZDQ1BBVVhfTUFTSzsKKwkJY2FzZSA1OgorCQkJcmV0dXJuIFhBRENfQUxBUk1fVkNDT0REUl9NQVNLOworCQlkZWZhdWx0OgorCQkJLyogV2Ugd2lsbCBuZXZlciBnZXQgaGVyZSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9Cit9CisKK2ludCB4YWRjX3JlYWRfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiAoYm9vbCkoeGFkYy0+YWxhcm1fbWFzayAmIHhhZGNfZ2V0X2FsYXJtX21hc2soY2hhbikpOworfQorCitpbnQgeGFkY193cml0ZV9ldmVudF9jb25maWcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgYWxhcm0gPSB4YWRjX2dldF9hbGFybV9tYXNrKGNoYW4pOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1aW50MTZfdCBjZmcsIG9sZF9jZmc7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKworCWlmIChzdGF0ZSkKKwkJeGFkYy0+YWxhcm1fbWFzayB8PSBhbGFybTsKKwllbHNlCisJCXhhZGMtPmFsYXJtX21hc2sgJj0gfmFsYXJtOworCisJeGFkYy0+b3BzLT51cGRhdGVfYWxhcm0oeGFkYywgeGFkYy0+YWxhcm1fbWFzayk7CisKKwlyZXQgPSBfeGFkY19yZWFkX2FkY19yZWcoeGFkYywgWEFEQ19SRUdfQ09ORjEsICZjZmcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCW9sZF9jZmcgPSBjZmc7CisJY2ZnIHw9IFhBRENfQ09ORjFfQUxBUk1fTUFTSzsKKwljZmcgJj0gfigoeGFkYy0+YWxhcm1fbWFzayAmIDB4ZjApIDw8IDQpOyAvKiBicmFtLCBwaW50LCBwYXV4LCBkZHIgKi8KKwljZmcgJj0gfigoeGFkYy0+YWxhcm1fbWFzayAmIDB4MDgpID4+IDMpOyAvKiBvdCAqLworCWNmZyAmPSB+KCh4YWRjLT5hbGFybV9tYXNrICYgMHgwNykgPDwgMSk7IC8qIHRlbXAsIHZjY2ludCwgdmNjYXV4ICovCisJaWYgKG9sZF9jZmcgIT0gY2ZnKQorCQlyZXQgPSBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX0NPTkYxLCBjZmcpOworCitlcnJfb3V0OgorCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUmVnaXN0ZXIgdmFsdWUgaXMgbXNiIGFsaWduZWQsIHRoZSBsb3dlciA0IGJpdHMgYXJlIGlnbm9yZWQgKi8KKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkFMVUVfU0hJRlQgNAorCitpbnQgeGFkY19yZWFkX2V2ZW50X3ZhbHVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyLCBlbnVtIGlpb19ldmVudF9pbmZvIGluZm8sCisJaW50ICp2YWwsIGludCAqdmFsMikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0geGFkY19nZXRfdGhyZXNob2xkX29mZnNldChjaGFuLCBkaXIpOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN3aXRjaCAoaW5mbykgeworCWNhc2UgSUlPX0VWX0lORk9fVkFMVUU6CisJCSp2YWwgPSB4YWRjLT50aHJlc2hvbGRbb2Zmc2V0XTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fRVZfSU5GT19IWVNURVJFU0lTOgorCQkqdmFsID0geGFkYy0+dGVtcF9oeXN0ZXJlc2lzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqdmFsID4+PSBYQURDX1RIUkVTSE9MRF9WQUxVRV9TSElGVDsKKworCXJldHVybiBJSU9fVkFMX0lOVDsKK30KKworaW50IHhhZGNfd3JpdGVfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGVudW0gaWlvX2V2ZW50X2luZm8gaW5mbywKKwlpbnQgdmFsLCBpbnQgdmFsMikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0geGFkY19nZXRfdGhyZXNob2xkX29mZnNldChjaGFuLCBkaXIpOworCXN0cnVjdCB4YWRjICp4YWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXZhbCA8PD0gWEFEQ19USFJFU0hPTERfVkFMVUVfU0hJRlQ7CisKKwlpZiAodmFsIDwgMCB8fCB2YWwgPiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmeGFkYy0+bXV0ZXgpOworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fRVZfSU5GT19WQUxVRToKKwkJeGFkYy0+dGhyZXNob2xkW29mZnNldF0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgSUlPX0VWX0lORk9fSFlTVEVSRVNJUzoKKwkJeGFkYy0+dGVtcF9oeXN0ZXJlc2lzID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJnhhZGMtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApIHsKKwkJLyoKKwkJICogQWNjb3JkaW5nIHRvIHRoZSBkYXRhc2hlZXQgd2UgbmVlZCB0byBzZXQgdGhlIGxvd2VyIDQgYml0cyB0bworCQkgKiAweDMsIG90aGVyd2lzZSAxMjUgZGVncmVlIGNlbHNpdXMgd2lsbCBiZSB1c2VkIGFzIHRoZQorCQkgKiB0aHJlc2hvbGQuCisJCSAqLworCQl2YWwgfD0gMHgzOworCisJCS8qCisJCSAqIFNpbmNlIHdlIHN0b3JlIHRoZSBoeXN0ZXJlc2lzIGFzIHJlbGF0aXZlICh0byB0aGUgdGhyZXNob2xkKQorCQkgKiB2YWx1ZSwgYnV0IHRoZSBoYXJkd2FyZSBleHBlY3RzIGFuIGFic29sdXRlIHZhbHVlIHdlIG5lZWQgdG8KKwkJICogcmVjYWxjdWFsdGUgdGhpcyB2YWx1ZSB3aGVuZXZlciB0aGUgaHlzdGVyZXNpcyBvciB0aGUKKwkJICogdGhyZXNob2xkIGNoYW5nZXMuCisJCSAqLworCQlpZiAoeGFkYy0+dGhyZXNob2xkW29mZnNldF0gPCB4YWRjLT50ZW1wX2h5c3RlcmVzaXMpCisJCQl4YWRjLT50aHJlc2hvbGRbb2Zmc2V0ICsgNF0gPSAwOworCQllbHNlCisJCQl4YWRjLT50aHJlc2hvbGRbb2Zmc2V0ICsgNF0gPSB4YWRjLT50aHJlc2hvbGRbb2Zmc2V0XSAtCisJCQkJCXhhZGMtPnRlbXBfaHlzdGVyZXNpczsKKwkJcmV0ID0gX3hhZGNfd3JpdGVfYWRjX3JlZyh4YWRjLCBYQURDX1JFR19USFJFU0hPTEQob2Zmc2V0ICsgNCksCisJCQl4YWRjLT50aHJlc2hvbGRbb2Zmc2V0ICsgNF0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChpbmZvID09IElJT19FVl9JTkZPX1ZBTFVFKQorCQlyZXQgPSBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIFhBRENfUkVHX1RIUkVTSE9MRChvZmZzZXQpLCB2YWwpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy5oIGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC14YWRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0ODdlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngteGFkYy5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogWGlsaW54IFhBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTMgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1ZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2lmbmRlZiBfX0lJT19YSUxJTlhfWEFEQ19fCisjZGVmaW5lIF9fSUlPX1hJTElOWF9YQURDX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworc3RydWN0IGlpb19kZXY7CitzdHJ1Y3QgY2xrOworc3RydWN0IHhhZGNfb3BzOworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKKwordm9pZCB4YWRjX2hhbmRsZV9ldmVudHMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgbG9uZyBldmVudHMpOworCitpbnQgeGFkY19yZWFkX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBlbnVtIGlpb19ldmVudF90eXBlIHR5cGUsCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpcik7CitpbnQgeGFkY193cml0ZV9ldmVudF9jb25maWcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAorCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIsIGludCBzdGF0ZSk7CitpbnQgeGFkY19yZWFkX2V2ZW50X3ZhbHVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sIGVudW0gaWlvX2V2ZW50X3R5cGUgdHlwZSwKKwllbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyLCBlbnVtIGlpb19ldmVudF9pbmZvIGluZm8sCisJaW50ICp2YWwsIGludCAqdmFsMik7CitpbnQgeGFkY193cml0ZV9ldmVudF92YWx1ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLCBlbnVtIGlpb19ldmVudF90eXBlIHR5cGUsCisJZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIGRpciwgZW51bSBpaW9fZXZlbnRfaW5mbyBpbmZvLAorCWludCB2YWwsIGludCB2YWwyKTsKKworZW51bSB4YWRjX2V4dGVybmFsX211eF9tb2RlIHsKKwlYQURDX0VYVEVSTkFMX01VWF9OT05FLAorCVhBRENfRVhURVJOQUxfTVVYX1NJTkdMRSwKKwlYQURDX0VYVEVSTkFMX01VWF9EVUFMLAorfTsKKworc3RydWN0IHhhZGMgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwljb25zdCBzdHJ1Y3QgeGFkY19vcHMgKm9wczsKKworCXVpbnQxNl90IHRocmVzaG9sZFsxNl07CisJdWludDE2X3QgdGVtcF9oeXN0ZXJlc2lzOworCXVuc2lnbmVkIGludCBhbGFybV9tYXNrOworCisJdWludDE2X3QgKmRhdGE7CisKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdnZXI7CisJc3RydWN0IGlpb190cmlnZ2VyICpjb252c3RfdHJpZ2dlcjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnNhbXBsZXJhdGVfdHJpZ2dlcjsKKworCWVudW0geGFkY19leHRlcm5hbF9tdXhfbW9kZSBleHRlcm5hbF9tdXhfbW9kZTsKKworCXVuc2lnbmVkIGludCB6eW5xX2FsYXJtOworCXVuc2lnbmVkIGludCB6eW5xX21hc2tlZF9hbGFybTsKKwl1bnNpZ25lZCBpbnQgenlucV9pbnRtYXNrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgenlucV91bm1hc2tfd29yazsKKworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzcGlubG9ja190IGxvY2s7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworfTsKKworc3RydWN0IHhhZGNfb3BzIHsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgeGFkYyAqLCB1bnNpZ25lZCBpbnQsIHVpbnQxNl90ICopOworCWludCAoKndyaXRlKShzdHJ1Y3QgeGFkYyAqLCB1bnNpZ25lZCBpbnQsIHVpbnQxNl90KTsKKwlpbnQgKCpzZXR1cCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCWludCBpcnEpOworCXZvaWQgKCp1cGRhdGVfYWxhcm0pKHN0cnVjdCB4YWRjICosIHVuc2lnbmVkIGludCk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9kY2xrX3JhdGUpKHN0cnVjdCB4YWRjICopOworCWlycXJldHVybl90ICgqaW50ZXJydXB0X2hhbmRsZXIpKGludCwgdm9pZCAqKTsKKwlpcnFyZXR1cm5fdCAoKnRocmVhZGVkX2ludGVycnVwdF9oYW5kbGVyKShpbnQsIHZvaWQgKik7CisKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBfeGFkY19yZWFkX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgKnZhbCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ4YWRjLT5tdXRleCk7CisJcmV0dXJuIHhhZGMtPm9wcy0+cmVhZCh4YWRjLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF94YWRjX3dyaXRlX2FkY19yZWcoc3RydWN0IHhhZGMgKnhhZGMsIHVuc2lnbmVkIGludCByZWcsCisJdWludDE2X3QgdmFsKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnhhZGMtPm11dGV4KTsKKwlyZXR1cm4geGFkYy0+b3BzLT53cml0ZSh4YWRjLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhhZGNfcmVhZF9hZGNfcmVnKHN0cnVjdCB4YWRjICp4YWRjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVpbnQxNl90ICp2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKwlyZXQgPSBfeGFkY19yZWFkX2FkY19yZWcoeGFkYywgcmVnLCB2YWwpOworCW11dGV4X3VubG9jaygmeGFkYy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhhZGNfd3JpdGVfYWRjX3JlZyhzdHJ1Y3QgeGFkYyAqeGFkYywgdW5zaWduZWQgaW50IHJlZywKKwl1aW50MTZfdCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnhhZGMtPm11dGV4KTsKKwlyZXQgPSBfeGFkY193cml0ZV9hZGNfcmVnKHhhZGMsIHJlZywgdmFsKTsKKwltdXRleF91bmxvY2soJnhhZGMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBYQURDIGhhcmRtYWNybyByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBYQURDX1JFR19URU1QCQkweDAwCisjZGVmaW5lIFhBRENfUkVHX1ZDQ0lOVAkJMHgwMQorI2RlZmluZSBYQURDX1JFR19WQ0NBVVgJCTB4MDIKKyNkZWZpbmUgWEFEQ19SRUdfVlBWTgkJMHgwMworI2RlZmluZSBYQURDX1JFR19WUkVGUAkJMHgwNAorI2RlZmluZSBYQURDX1JFR19WUkVGTgkJMHgwNQorI2RlZmluZSBYQURDX1JFR19WQ0NCUkFNCTB4MDYKKworI2RlZmluZSBYQURDX1JFR19WQ0NQSU5UCTB4MGQKKyNkZWZpbmUgWEFEQ19SRUdfVkNDUEFVWAkweDBlCisjZGVmaW5lIFhBRENfUkVHX1ZDQ09fRERSCTB4MGYKKyNkZWZpbmUgWEFEQ19SRUdfVkFVWCh4KQkoMHgxMCArICh4KSkKKworI2RlZmluZSBYQURDX1JFR19NQVhfVEVNUAkweDIwCisjZGVmaW5lIFhBRENfUkVHX01BWF9WQ0NJTlQJMHgyMQorI2RlZmluZSBYQURDX1JFR19NQVhfVkNDQVVYCTB4MjIKKyNkZWZpbmUgWEFEQ19SRUdfTUFYX1ZDQ0JSQU0JMHgyMworI2RlZmluZSBYQURDX1JFR19NSU5fVEVNUAkweDI0CisjZGVmaW5lIFhBRENfUkVHX01JTl9WQ0NJTlQJMHgyNQorI2RlZmluZSBYQURDX1JFR19NSU5fVkNDQVVYCTB4MjYKKyNkZWZpbmUgWEFEQ19SRUdfTUlOX1ZDQ0JSQU0JMHgyNworI2RlZmluZSBYQURDX1JFR19NQVhfVkNDUElOVAkweDI4CisjZGVmaW5lIFhBRENfUkVHX01BWF9WQ0NQQVVYCTB4MjkKKyNkZWZpbmUgWEFEQ19SRUdfTUFYX1ZDQ09fRERSCTB4MmEKKyNkZWZpbmUgWEFEQ19SRUdfTUlOX1ZDQ1BJTlQJMHgyYgorI2RlZmluZSBYQURDX1JFR19NSU5fVkNDUEFVWAkweDJjCisjZGVmaW5lIFhBRENfUkVHX01JTl9WQ0NPX0REUgkweDJkCisKKyNkZWZpbmUgWEFEQ19SRUdfQ09ORjAJCTB4NDAKKyNkZWZpbmUgWEFEQ19SRUdfQ09ORjEJCTB4NDEKKyNkZWZpbmUgWEFEQ19SRUdfQ09ORjIJCTB4NDIKKyNkZWZpbmUgWEFEQ19SRUdfU0VRKHgpCQkoMHg0OCArICh4KSkKKyNkZWZpbmUgWEFEQ19SRUdfSU5QVVRfTU9ERSh4KQkoMHg0YyArICh4KSkKKyNkZWZpbmUgWEFEQ19SRUdfVEhSRVNIT0xEKHgpCSgweDUwICsgKHgpKQorCisjZGVmaW5lIFhBRENfUkVHX0ZMQUcJCTB4M2YKKworI2RlZmluZSBYQURDX0NPTkYwX0VDCQkJQklUKDkpCisjZGVmaW5lIFhBRENfQ09ORjBfQUNRCQkJQklUKDgpCisjZGVmaW5lIFhBRENfQ09ORjBfTVVYCQkJQklUKDExKQorI2RlZmluZSBYQURDX0NPTkYwX0NIQU4oeCkJCSh4KQorCisjZGVmaW5lIFhBRENfQ09ORjFfU0VRX01BU0sJCSgweGYgPDwgMTIpCisjZGVmaW5lIFhBRENfQ09ORjFfU0VRX0RFRkFVTFQJCSgwIDw8IDEyKQorI2RlZmluZSBYQURDX0NPTkYxX1NFUV9TSU5HTEVfUEFTUwkoMSA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfQ09OVElOVU9VUwkoMiA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfU0lOR0xFX0NIQU5ORUwJKDMgPDwgMTIpCisjZGVmaW5lIFhBRENfQ09ORjFfU0VRX1NJTVVMVEFORU9VUwkoNCA8PCAxMikKKyNkZWZpbmUgWEFEQ19DT05GMV9TRVFfSU5ERVBFTkRFTlQJKDggPDwgMTIpCisjZGVmaW5lIFhBRENfQ09ORjFfQUxBUk1fTUFTSwkJMHgwZjBmCisKKyNkZWZpbmUgWEFEQ19DT05GMl9ESVZfTUFTSwkweGZmMDAKKyNkZWZpbmUgWEFEQ19DT05GMl9ESVZfT0ZGU0VUCTgKKworI2RlZmluZSBYQURDX0NPTkYyX1BEX01BU0sJKDB4MyA8PCA0KQorI2RlZmluZSBYQURDX0NPTkYyX1BEX05PTkUJKDB4MCA8PCA0KQorI2RlZmluZSBYQURDX0NPTkYyX1BEX0FEQ19CCSgweDIgPDwgNCkKKyNkZWZpbmUgWEFEQ19DT05GMl9QRF9CT1RICSgweDMgPDwgNCkKKworI2RlZmluZSBYQURDX0FMQVJNX1RFTVBfTUFTSwkJQklUKDApCisjZGVmaW5lIFhBRENfQUxBUk1fVkNDSU5UX01BU0sJCUJJVCgxKQorI2RlZmluZSBYQURDX0FMQVJNX1ZDQ0FVWF9NQVNLCQlCSVQoMikKKyNkZWZpbmUgWEFEQ19BTEFSTV9PVF9NQVNLCQlCSVQoMykKKyNkZWZpbmUgWEFEQ19BTEFSTV9WQ0NCUkFNX01BU0sJCUJJVCg0KQorI2RlZmluZSBYQURDX0FMQVJNX1ZDQ1BJTlRfTUFTSwkJQklUKDUpCisjZGVmaW5lIFhBRENfQUxBUk1fVkNDUEFVWF9NQVNLCQlCSVQoNikKKyNkZWZpbmUgWEFEQ19BTEFSTV9WQ0NPRERSX01BU0sJCUJJVCg3KQorCisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1RFTVBfTUFYCQkweDAKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDSU5UX01BWAkweDEKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDQVVYX01BWAkweDIKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfT1RfTUFYCQkweDMKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVEVNUF9NSU4JCTB4NAorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NJTlRfTUlOCTB4NQorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NBVVhfTUlOCTB4NgorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9PVF9NSU4JCTB4NworI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NCUkFNX01BWAkweDgKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDUElOVF9NQVgJMHg5CisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ1BBVVhfTUFYCTB4YQorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NPRERSX01BWAkweGIKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDQlJBTV9NSU4JMHhjCisjZGVmaW5lIFhBRENfVEhSRVNIT0xEX1ZDQ1BJTlRfTUlOCTB4ZAorI2RlZmluZSBYQURDX1RIUkVTSE9MRF9WQ0NQQVVYX01JTgkweGUKKyNkZWZpbmUgWEFEQ19USFJFU0hPTERfVkNDT0REUl9NSU4JMHhmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYnVmZmVyX2NiLmMgYi9kcml2ZXJzL2lpby9idWZmZXJfY2IuYwppbmRleCAyZDljNmY4Li5lYjQ2ZTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9idWZmZXJfY2IuYworKysgYi9kcml2ZXJzL2lpby9idWZmZXJfY2IuYwpAQCAtNDYsMTAgKzQ2LDggQEAKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW47CiAKIAljYl9idWZmID0ga3phbGxvYyhzaXplb2YoKmNiX2J1ZmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2JfYnVmZiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KKwlpZiAoY2JfYnVmZiA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWlpb19idWZmZXJfaW5pdCgmY2JfYnVmZi0+YnVmZmVyKTsKIApAQCAtOTEsNyArODksNiBAQAogCWlpb19jaGFubmVsX3JlbGVhc2VfYWxsKGNiX2J1ZmYtPmNoYW5uZWxzKTsKIGVycm9yX2ZyZWVfY2JfYnVmZjoKIAlrZnJlZShjYl9idWZmKTsKLWVycm9yX3JldDoKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWlvX2NoYW5uZWxfZ2V0X2FsbF9jYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvYWQ3MzAzLmMgYi9kcml2ZXJzL2lpby9kYWMvYWQ3MzAzLmMKaW5kZXggZDA1MDVmZC4uZmEyODEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL2FkNzMwMy5jCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9hZDczMDMuYwpAQCAtOTIsNyArOTIsNyBAQAogCWFkNzMwM193cml0ZShzdCwgY2hhbi0+Y2hhbm5lbCwgc3QtPmRhY19jYWNoZVtjaGFuLT5jaGFubmVsXSk7CiAKIAltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCXJldHVybiByZXQgPyByZXQgOiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIGludCBhZDczMDNfZ2V0X3ZyZWYoc3RydWN0IGFkNzMwM19zdGF0ZSAqc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMgYi9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMKaW5kZXggZGU3NmU2YS4uOWE4MmE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL21heDUxNy5jCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9tYXg1MTcuYwpAQCAtMTksNyArMTksNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9tY3A0NzI1LmMgYi9kcml2ZXJzL2lpby9kYWMvbWNwNDcyNS5jCmluZGV4IDdkOWY1YzMuLjQzZDE0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9tY3A0NzI1LmMKKysrIGIvZHJpdmVycy9paW8vZGFjL21jcDQ3MjUuYwpAQCAtMTUsNyArMTUsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9LY29uZmlnCmluZGV4IDQ2M2M0ZDkuLmUxMTZiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZwpAQCAtMTIsNCArMTIsMTQgQEAKIAkgIE90aGVyIHNlbnNvcnMgc2hvdWxkIHdvcmsgYXMgd2VsbCBhcyBsb25nIGFzIHRoZXkgc3BlYWsgdGhlCiAJICBzYW1lIHByb3RvY29sLgogCitjb25maWcgU0k3MDA1CisJdHJpc3RhdGUgIlNJNzAwNSByZWxhdGl2ZSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBTaWxhYnMgU2k3MDA1IHJlbGF0aXZlCisJICBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaTcwMDUuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L01ha2VmaWxlIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvTWFrZWZpbGUKaW5kZXggZDVkMzZjMC4uZTNmM2Q5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaHVtaWRpdHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvTWFrZWZpbGUKQEAgLTMsMyArMyw0IEBACiAjCiAKIG9iai0kKENPTkZJR19ESFQxMSkgKz0gZGh0MTEubworb2JqLSQoQ09ORklHX1NJNzAwNSkgKz0gc2k3MDA1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L3NpNzAwNS5jIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvc2k3MDA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNTg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2h1bWlkaXR5L3NpNzAwNS5jCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogc2k3MDA1LmMgLSBTdXBwb3J0IGZvciBTaWxhYnMgU2k3MDA1IGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUGV0ZXIgTWVlcndhbGQgPHBtZWVyd0BwbWVlcncubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogKDctYml0IEkyQyBzbGF2ZSBhZGRyZXNzIDB4NDApCisgKgorICogVE9ETzogaGVhdGVyLCBmYXN0IG1vZGUsIHByb2Nlc3NlZCBtb2RlICh0ZW1wLiAvIGxpbmVhcml0eSBjb21wZW5zYXRpb24pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKworI2RlZmluZSBTSTcwMDVfU1RBVFVTIDB4MDAKKyNkZWZpbmUgU0k3MDA1X0RBVEEgMHgwMSAvKiAxNi1iaXQsIE1TQiAqLworI2RlZmluZSBTSTcwMDVfQ09ORklHIDB4MDMKKyNkZWZpbmUgU0k3MDA1X0lEIDB4MTEKKworI2RlZmluZSBTSTcwMDVfU1RBVFVTX05SRFkgQklUKDApCisjZGVmaW5lIFNJNzAwNV9DT05GSUdfVEVNUCBCSVQoNCkKKyNkZWZpbmUgU0k3MDA1X0NPTkZJR19TVEFSVCBCSVQoMCkKKworI2RlZmluZSBTSTcwMDVfSURfNzAwNSAweDUwCisjZGVmaW5lIFNJNzAwNV9JRF83MDE1IDB4ZjAKKworc3RydWN0IHNpNzAwNV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBtdXRleCBsb2NrOworCXU4IGNvbmZpZzsKK307CisKK3N0YXRpYyBpbnQgc2k3MDA1X3JlYWRfbWVhc3VyZW1lbnQoc3RydWN0IHNpNzAwNV9kYXRhICpkYXRhLCBib29sIHRlbXApCit7CisJaW50IHRyaWVzID0gNTA7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJNzAwNV9DT05GSUcsCisJCWRhdGEtPmNvbmZpZyB8IFNJNzAwNV9DT05GSUdfU1RBUlQgfAorCQkodGVtcCA/IFNJNzAwNV9DT05GSUdfVEVNUCA6IDApKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJd2hpbGUgKHRyaWVzLS0gPiAwKSB7CisJCW1zbGVlcCgyMCk7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJNzAwNV9TVEFUVVMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKCEocmV0ICYgU0k3MDA1X1NUQVRVU19OUkRZKSkKKwkJCWJyZWFrOworCX0KKwlpZiAodHJpZXMgPCAwKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoZGF0YS0+Y2xpZW50LCBTSTcwMDVfREFUQSk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2k3MDA1X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCAqdmFsLAorCQkJICAgIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBzaTcwMDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCXJldCA9IHNpNzAwNV9yZWFkX21lYXN1cmVtZW50KGRhdGEsIGNoYW4tPnR5cGUgPT0gSUlPX1RFTVApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSByZXQ7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCQkqdmFsID0gNzsKKwkJCSp2YWwyID0gODEyNTAwOworCQl9IGVsc2UgeworCQkJKnZhbCA9IDM7CisJCQkqdmFsMiA9IDkwNjI1MDsKKwkJfQorCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQlpZiAoY2hhbi0+dHlwZSA9PSBJSU9fVEVNUCkKKwkJCSp2YWwgPSAtNTAgKiAzMiAqIDQ7CisJCWVsc2UKKwkJCSp2YWwgPSAtMjQgKiAxNiAqIDE2OworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTcwMDVfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX0hVTUlESVRZUkVMQVRJVkUsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCisJfSwKKwl7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzaTcwMDVfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBzaTcwMDVfcmVhZF9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgc2k3MDA1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHNpNzAwNV9kYXRhICpkYXRhOworCWludCByZXQ7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFtZSgmY2xpZW50LT5kZXYpOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmluZm8gPSAmc2k3MDA1X2luZm87CisKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gc2k3MDA1X2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShzaTcwMDVfY2hhbm5lbHMpOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgU0k3MDA1X0lEKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICE9IFNJNzAwNV9JRF83MDA1ICYmIHJldCAhPSBTSTcwMDVfSURfNzAxNSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBTSTcwMDVfQ09ORklHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkYXRhLT5jb25maWcgPSByZXQ7CisKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgaW5kaW9fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHNpNzAwNV9pZFtdID0geworCXsgInNpNzAwNSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2k3MDA1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNpNzAwNV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAic2k3MDA1IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBzaTcwMDVfcHJvYmUsCisJLmlkX3RhYmxlID0gc2k3MDA1X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHNpNzAwNV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbGFicyBTaTcwMDUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9LY29uZmlnIGIvZHJpdmVycy9paW8vaW11L0tjb25maWcKaW5kZXggNjYzZTg4YS4uMmIwZTQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vaW11L0tjb25maWcKQEAgLTI1LDYgKzI1LDggQEAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRElTMTYzNzUsIEFESVMxNjQ4MCwKIAkgIEFESVMxNjQ4NSwgQURJUzE2NDg4IGluZXJ0aWFsIHNlbnNvcnMuCiAKK3NvdXJjZSAiZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL0tjb25maWciCisKIGVuZG1lbnUKIAogY29uZmlnIElJT19BRElTX0xJQgpAQCAtMzgsNSArNDAsMyBAQAogCWhlbHAKIAkgIEEgc2V0IG9mIGJ1ZmZlciBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgQW5hbG9nIERldmljZXMgQURJUyogZGV2aWNlCiAJICBmYW1pbHkuCi0KLXNvdXJjZSAiZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbXUvYWRpczE2NDAwX2NvcmUuYyBiL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCmluZGV4IDdjNTgyZjcuLjQzMzU4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAlzdC0+dmFyaWFudC0+c2V0X2ZyZXEoc3QsIHZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAotCXJldHVybiByZXQgPyByZXQgOiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAogLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9jb3JlLmMgYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9jb3JlLmMKaW5kZXggZGY3ZjFlMS4uY2I5Zjk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2NvcmUuYwpAQCAtMTIsNyArMTIsNiBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0xMTcsNyArMTE2LDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAogCWlmIChlbikgewotCQkvKiBXYWl0IGZvciBvdXRwdXQgc3RhYmxpemUgKi8KKwkJLyogV2FpdCBmb3Igb3V0cHV0IHN0YWJpbGl6ZSAqLwogCQltc2xlZXAoSU5WX01QVTYwNTBfVEVNUF9VUF9USU1FKTsKIAkJaWYgKElOVl9NUFU2MDUwX0JJVF9QV1JfR1lST19TVEJZID09IG1hc2spIHsKIAkJCS8qIHN3aXRjaCBpbnRlcm5hbCBjbG9jayB0byBQTEwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2lpby5oIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKaW5kZXggZjM4Mzk1NS4uMGFiMzgyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKQEAgLTEyNiwzNSArMTI2LDM1IEBACiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19TQU1QTEVfUkFURV9ESVYgICAgIDB4MTkKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0NPTkZJRyAgICAgICAgICAgICAgMHgxQQogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfR1lST19DT05GSUcgICAgICAgICAweDFCCi0jZGVmaW5lIElOVl9NUFU2MDUwX1JFR19BQ0NFTF9DT05GSUcJICAgIDB4MUMKKyNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0FDQ0VMX0NPTkZJRyAgICAgICAgMHgxQwogCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19GSUZPX0VOICAgICAgICAgICAgIDB4MjMKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0FDQ0VMX09VVCAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVFNfR1lST19PVVQgICAgICAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfQUNDRUxfT1VUICAgICAgICAgICAweDA4CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVFNfR1lST19PVVQgICAgICAgICAgIDB4NzAKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfSU5UX0VOQUJMRSAgICAgICAgICAweDM4Ci0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9EQVRBX1JEWV9FTiAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0lOVF9FTiAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0RBVEFfUkRZX0VOICAgICAgICAgMHgwMQorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0lOVF9FTiAgICAgICAgICAweDAyCiAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX1JBV19BQ0NFTCAgICAgICAgICAgMHgzQgogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfVEVNUEVSQVRVUkUgICAgICAgICAweDQxCiAjZGVmaW5lIElOVl9NUFU2MDUwX1JFR19SQVdfR1lSTyAgICAgICAgICAgIDB4NDMKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfVVNFUl9DVFJMICAgICAgICAgICAweDZBCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9GSUZPX1JTVCAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX1JTVCAgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0kyQ19NU1RfRU4gICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9GSUZPX0VOICAgICAgICAgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0VOICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0ZJRk9fUlNUICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX1JTVCAgICAgICAgICAgICAweDA4CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9JMkNfTVNUX0VOICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX0ZJRk9fRU4gICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfRE1QX0VOICAgICAgICAgICAgICAweDgwCiAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX1BXUl9NR01UXzEgICAgICAgICAgMHg2QgotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfSF9SRVNFVCAgICAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgSU5WX01QVTYwNTBfQklUX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9DTEtfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9IX1JFU0VUICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX1NMRUVQICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfQ0xLX01BU0sgICAgICAgICAgICAweDcKIAogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfUFdSX01HTVRfMiAgICAgICAgICAweDZDCi0jZGVmaW5lIElOVl9NUFU2MDUwX0JJVF9QV1JfQUNDTF9TVEJZICAgICAgICAgICAgICAgMHgzOAotI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfUFdSX0dZUk9fU1RCWSAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgSU5WX01QVTYwNTBfQklUX1BXUl9BQ0NMX1NUQlkgICAgICAgMHgzOAorI2RlZmluZSBJTlZfTVBVNjA1MF9CSVRfUFdSX0dZUk9fU1RCWSAgICAgICAweDA3CiAKICNkZWZpbmUgSU5WX01QVTYwNTBfUkVHX0ZJRk9fQ09VTlRfSCAgICAgICAgMHg3MgogI2RlZmluZSBJTlZfTVBVNjA1MF9SRUdfRklGT19SX1cgICAgICAgICAgICAweDc0CkBAIC0xODAsMTAgKzE4MCwxMCBAQAogCiAvKiBpbml0IHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgSU5WX01QVTYwNTBfSU5JVF9GSUZPX1JBVEUgICAgICAgICAgIDUwCi0jZGVmaW5lIElOVl9NUFU2MDUwX1RJTUVfU1RBTVBfVE9SICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBJTlZfTVBVNjA1MF9NQVhfRklGT19SQVRFICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAKLSNkZWZpbmUgSU5WX01QVTYwNTBfTUlOX0ZJRk9fUkFURSAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIElOVl9NUFU2MDUwX09ORV9LX0haICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBJTlZfTVBVNjA1MF9USU1FX1NUQU1QX1RPUiAgICAgICAgICAgNQorI2RlZmluZSBJTlZfTVBVNjA1MF9NQVhfRklGT19SQVRFICAgICAgICAgICAgMTAwMAorI2RlZmluZSBJTlZfTVBVNjA1MF9NSU5fRklGT19SQVRFICAgICAgICAgICAgNAorI2RlZmluZSBJTlZfTVBVNjA1MF9PTkVfS19IWiAgICAgICAgICAgICAgICAgMTAwMAogCiAvKiBzY2FuIGVsZW1lbnQgZGVmaW5pdGlvbiAqLwogZW51bSBpbnZfbXB1NjA1MF9zY2FuIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X3JpbmcuYyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X3JpbmcuYwppbmRleCA0Mjk1MTcxLi4wY2QzMDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9yaW5nLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfcmluZy5jCkBAIC0xMiw3ICsxMiw2IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYwppbmRleCBjNjdkODNiLi5lMTA4ZjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCkBAIC0yNjQsNyArMjY0LDcgQEAKIAkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKIAkJCQkgICAgICZidWZmZXItPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9yZXQ7CisJCXJldHVybiByZXQ7CiAJYXR0cmNvdW50Kys7CiAJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cigidHlwZSIsCiAJCQkJICAgICBjaGFuLApAQCAtMjc1LDcgKzI3NSw3IEBACiAJCQkJICAgICAmaW5kaW9fZGV2LT5kZXYsCiAJCQkJICAgICAmYnVmZmVyLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OworCQlyZXR1cm4gcmV0OwogCWF0dHJjb3VudCsrOwogCWlmIChjaGFuLT50eXBlICE9IElJT19USU1FU1RBTVApCiAJCXJldCA9IF9faWlvX2FkZF9jaGFuX2RldmF0dHIoImVuIiwKQEAgLTI5NiwxMCArMjk2LDkgQEAKIAkJCQkJICAgICAmaW5kaW9fZGV2LT5kZXYsCiAJCQkJCSAgICAgJmJ1ZmZlci0+c2Nhbl9lbF9kZXZfYXR0cl9saXN0KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldDsKKwkJcmV0dXJuIHJldDsKIAlhdHRyY291bnQrKzsKIAlyZXQgPSBhdHRyY291bnQ7Ci1lcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTUzLDEzICs1NTIsMTMgQEAKIAkJaWYgKGluZGlvX2Rldi0+c2V0dXBfb3BzLT5wcmVkaXNhYmxlKSB7CiAJCQlyZXQgPSBpbmRpb19kZXYtPnNldHVwX29wcy0+cHJlZGlzYWJsZShpbmRpb19kZXYpOwogCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yX3JldDsKKwkJCQlyZXR1cm4gcmV0OwogCQl9CiAJCWluZGlvX2Rldi0+Y3VycmVudG1vZGUgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAkJaWYgKGluZGlvX2Rldi0+c2V0dXBfb3BzLT5wb3N0ZGlzYWJsZSkgewogCQkJcmV0ID0gaW5kaW9fZGV2LT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKGluZGlvX2Rldik7CiAJCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3JfcmV0OworCQkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAJLyogS2VlcCBhIGNvcHkgb2YgY3VycmVudCBzZXR1cCB0byBhbGxvdyByb2xsIGJhY2sgKi8KQEAgLTYxMyw3ICs2MTIsNyBAQAogCQkJZWxzZSB7CiAJCQkJa2ZyZWUoY29tcG91bmRfbWFzayk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycm9yX3JldDsKKwkJCQlyZXR1cm4gcmV0OwogCQkJfQogCQl9CiAJfSBlbHNlIHsKQEAgLTY5NiwxMyArNjk1LDEwIEBACiAJaWYgKGluZGlvX2Rldi0+c2V0dXBfb3BzLT5wb3N0ZGlzYWJsZSkKIAkJaW5kaW9fZGV2LT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKGluZGlvX2Rldik7CiBlcnJvcl9yZW1vdmVfaW5zZXJ0ZWQ6Ci0KIAlpZiAoaW5zZXJ0X2J1ZmZlcikKIAkJaWlvX2J1ZmZlcl9kZWFjdGl2YXRlKGluc2VydF9idWZmZXIpOwogCWluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzayA9IG9sZF9tYXNrOwogCWtmcmVlKGNvbXBvdW5kX21hc2spOwotZXJyb3JfcmV0OgotCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKaW5kZXggYWNjOTExYS4uZWRlMTZhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYwpAQCAtNTQwLDcgKzU0MCw3IEBACiAJCQkgICBlbnVtIGlpb19zaGFyZWRfYnkgc2hhcmVkX2J5KQogewogCWludCByZXQgPSAwOwotCWNoYXIgKm5hbWVfZm9ybWF0ID0gTlVMTDsKKwljaGFyICpuYW1lID0gTlVMTDsKIAljaGFyICpmdWxsX3Bvc3RmaXg7CiAJc3lzZnNfYXR0cl9pbml0KCZkZXZfYXR0ci0+YXR0cik7CiAKQEAgLTU1OCw3ICs1NTgsNyBAQAogCQkJCQkJCQkgICAgLT5jaGFubmVsMl0sCiAJCQkJCQkgcG9zdGZpeCk7CiAJfSBlbHNlIHsKLQkJaWYgKGNoYW4tPmV4dGVuZF9uYW1lID09IE5VTEwpCisJCWlmIChjaGFuLT5leHRlbmRfbmFtZSA9PSBOVUxMIHx8IHNoYXJlZF9ieSAhPSBJSU9fU0VQQVJBVEUpCiAJCQlmdWxsX3Bvc3RmaXggPSBrc3RyZHVwKHBvc3RmaXgsIEdGUF9LRVJORUwpOwogCQllbHNlCiAJCQlmdWxsX3Bvc3RmaXggPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKQEAgLTU3MiwxNiArNTcyLDE1IEBACiAJaWYgKGNoYW4tPmRpZmZlcmVudGlhbCkgeyAvKiBEaWZmZXJlbnRpYWwgY2FuIG5vdCBoYXZlIG1vZGlmaWVyICovCiAJCXN3aXRjaCAoc2hhcmVkX2J5KSB7CiAJCWNhc2UgSUlPX1NIQVJFRF9CWV9BTEw6Ci0JCQluYW1lX2Zvcm1hdCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMiLCBmdWxsX3Bvc3RmaXgpOworCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMiLCBmdWxsX3Bvc3RmaXgpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX1NIQVJFRF9CWV9ESVI6Ci0JCQluYW1lX2Zvcm1hdCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMiLAorCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMiLAogCQkJCQkJaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAogCQkJCQkJZnVsbF9wb3N0Zml4KTsKIAkJCWJyZWFrOwogCQljYXNlIElJT19TSEFSRURfQllfVFlQRToKLQkJCW5hbWVfZm9ybWF0Ci0JCQkJPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzLSVzXyVzIiwKKwkJCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzLSVzXyVzIiwKIAkJCQkJICAgIGlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW2NoYW4tPnR5cGVdLAogCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCkBAIC01OTMsOCArNTkyLDcgQEAKIAkJCQlyZXQgPSAtRUlOVkFMOwogCQkJCWdvdG8gZXJyb3JfZnJlZV9mdWxsX3Bvc3RmaXg7CiAJCQl9Ci0JCQluYW1lX2Zvcm1hdAotCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsCisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsCiAJCQkJCSAgICAiJXNfJXMlZC0lcyVkXyVzIiwKIAkJCQkJICAgIGlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW2NoYW4tPnR5cGVdLApAQCAtNjA3LDE2ICs2MDUsMTUgQEAKIAl9IGVsc2UgeyAvKiBTaW5nbGUgZW5kZWQgKi8KIAkJc3dpdGNoIChzaGFyZWRfYnkpIHsKIAkJY2FzZSBJSU9fU0hBUkVEX0JZX0FMTDoKLQkJCW5hbWVfZm9ybWF0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGZ1bGxfcG9zdGZpeCk7CisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGZ1bGxfcG9zdGZpeCk7CiAJCQlicmVhazsKIAkJY2FzZSBJSU9fU0hBUkVEX0JZX0RJUjoKLQkJCW5hbWVfZm9ybWF0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCisJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCiAJCQkJCQlpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCiAJCQkJCQlmdWxsX3Bvc3RmaXgpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX1NIQVJFRF9CWV9UWVBFOgotCQkJbmFtZV9mb3JtYXQKLQkJCQk9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAorCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAogCQkJCQkgICAgaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAogCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCiAJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOwpAQCAtNjI0LDMzICs2MjEsMjQgQEAKIAogCQljYXNlIElJT19TRVBBUkFURToKIAkJCWlmIChjaGFuLT5pbmRleGVkKQotCQkJCW5hbWVfZm9ybWF0Ci0JCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyVkXyVzIiwKKwkJCQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyVkXyVzIiwKIAkJCQkJCSAgICBpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCiAJCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCiAJCQkJCQkgICAgY2hhbi0+Y2hhbm5lbCwKIAkJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOwogCQkJZWxzZQotCQkJCW5hbWVfZm9ybWF0Ci0JCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lc18lcyIsCisJCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAogCQkJCQkJICAgIGlpb19kaXJlY3Rpb25bY2hhbi0+b3V0cHV0XSwKIAkJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKIAkJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKG5hbWVfZm9ybWF0ID09IE5VTEwpIHsKKwlpZiAobmFtZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9mdWxsX3Bvc3RmaXg7CiAJfQotCWRldl9hdHRyLT5hdHRyLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKLQkJCQkJbmFtZV9mb3JtYXQsCi0JCQkJCWNoYW4tPmNoYW5uZWwsCi0JCQkJCWNoYW4tPmNoYW5uZWwyKTsKLQlpZiAoZGV2X2F0dHItPmF0dHIubmFtZSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZnJlZV9uYW1lX2Zvcm1hdDsKLQl9CisJZGV2X2F0dHItPmF0dHIubmFtZSA9IG5hbWU7CiAKIAlpZiAocmVhZGZ1bmMpIHsKIAkJZGV2X2F0dHItPmF0dHIubW9kZSB8PSBTX0lSVUdPOwpAQCAtNjYxLDggKzY0OSw3IEBACiAJCWRldl9hdHRyLT5hdHRyLm1vZGUgfD0gU19JV1VTUjsKIAkJZGV2X2F0dHItPnN0b3JlID0gd3JpdGVmdW5jOwogCX0KLWVycm9yX2ZyZWVfbmFtZV9mb3JtYXQ6Ci0Ja2ZyZWUobmFtZV9mb3JtYXQpOworCiBlcnJvcl9mcmVlX2Z1bGxfcG9zdGZpeDoKIAlrZnJlZShmdWxsX3Bvc3RmaXgpOwogCkBAIC02OTIsMTAgKzY3OSw4IEBACiAJc3RydWN0IGlpb19kZXZfYXR0ciAqaWlvX2F0dHIsICp0OwogCiAJaWlvX2F0dHIgPSBremFsbG9jKHNpemVvZigqaWlvX2F0dHIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWlvX2F0dHIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9CisJaWYgKGlpb19hdHRyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCXJldCA9IF9faWlvX2RldmljZV9hdHRyX2luaXQoJmlpb19hdHRyLT5kZXZfYXR0ciwKIAkJCQkgICAgIHBvc3RmaXgsIGNoYW4sCiAJCQkJICAgICByZWFkZnVuYywgd3JpdGVmdW5jLCBzaGFyZWRfYnkpOwpAQCAtNzIwLDcgKzcwNSw2IEBACiAJX19paW9fZGV2aWNlX2F0dHJfZGVpbml0KCZpaW9fYXR0ci0+ZGV2X2F0dHIpOwogZXJyb3JfaWlvX2Rldl9hdHRyX2ZyZWU6CiAJa2ZyZWUoaWlvX2F0dHIpOwotZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMzQsNyArMTExOCw3IEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKIAkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBpbnRlcmZhY2VzXG4iKTsKLQkJZ290byBlcnJvcl9yZXQ7CisJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXJfc3lzZnMoaW5kaW9fZGV2KTsKIAlpZiAocmV0KSB7CkBAIC0xMTc1LDcgKzExNTksNiBAQAogCWlpb19kZXZpY2VfdW5yZWdpc3Rlcl9zeXNmcyhpbmRpb19kZXYpOwogZXJyb3JfdW5yZWdfZGVidWdmczoKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXJfZGVidWdmcyhpbmRpb19kZXYpOwotZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19kZXZpY2VfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwppbmRleCBjOWMxNDE5Li5lYTZlMDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwpAQCAtNDAsNiArNDAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJZGV2X2F0dHJfbGlzdDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCWdyb3VwOworCXN0cnVjdCBtdXRleAkJcmVhZF9sb2NrOwogfTsKIAogLyoqCkBAIC00NywxNiArNDgsMTcgQEAKICAqIEBpbmRpb19kZXY6CQlJSU8gZGV2aWNlIHN0cnVjdHVyZQogICogQGV2X2NvZGU6CQlXaGF0IGV2ZW50CiAgKiBAdGltZXN0YW1wOgkJV2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQKKyAqCisgKiBOb3RlOiBUaGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgcnVubmluZworICogY29uY3VycmVudGx5IGZvciB0aGUgc2FtZSBpbmRpb19kZXYgbW9yZSB0aGFuIG9uY2UuCiAgKiovCiBpbnQgaWlvX3B1c2hfZXZlbnQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdTY0IGV2X2NvZGUsIHM2NCB0aW1lc3RhbXApCiB7CiAJc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgKmV2X2ludCA9IGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlOwogCXN0cnVjdCBpaW9fZXZlbnRfZGF0YSBldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjb3BpZWQ7CiAKIAkvKiBEb2VzIGFueW9uZSBjYXJlPyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZldl9pbnQtPndhaXQubG9jaywgZmxhZ3MpOwogCWlmICh0ZXN0X2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncykpIHsKIAogCQlldi5pZCA9IGV2X2NvZGU7CkBAIC02NCw5ICs2Niw4IEBACiAKIAkJY29waWVkID0ga2ZpZm9fcHV0KCZldl9pbnQtPmRldF9ldmVudHMsIGV2KTsKIAkJaWYgKGNvcGllZCAhPSAwKQotCQkJd2FrZV91cF9sb2NrZWRfcG9sbCgmZXZfaW50LT53YWl0LCBQT0xMSU4pOworCQkJd2FrZV91cF9wb2xsKCZldl9pbnQtPndhaXQsIFBPTExJTik7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2X2ludC0+d2FpdC5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg3LDEwICs4OCw4IEBACiAKIAlwb2xsX3dhaXQoZmlsZXAsICZldl9pbnQtPndhaXQsIHdhaXQpOwogCi0Jc3Bpbl9sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOwogCWlmICgha2ZpZm9faXNfZW1wdHkoJmV2X2ludC0+ZGV0X2V2ZW50cykpCiAJCWV2ZW50cyA9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0Jc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CiAKIAlyZXR1cm4gZXZlbnRzOwogfQpAQCAtMTExLDMxICsxMTAsNDAgQEAKIAlpZiAoY291bnQgPCBzaXplb2Yoc3RydWN0IGlpb19ldmVudF9kYXRhKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7Ci0JaWYgKGtmaWZvX2lzX2VtcHR5KCZldl9pbnQtPmRldF9ldmVudHMpKSB7Ci0JCWlmIChmaWxlcC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlnb3RvIGVycm9yX3VubG9jazsKLQkJfQotCQkvKiBCbG9ja2luZyBvbiBkZXZpY2U7IHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBiZSB0aGVyZSAqLwotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfbG9ja2VkX2lycShldl9pbnQtPndhaXQsCisJZG8geworCQlpZiAoa2ZpZm9faXNfZW1wdHkoJmV2X2ludC0+ZGV0X2V2ZW50cykpIHsKKwkJCWlmIChmaWxlcC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShldl9pbnQtPndhaXQsCiAJCQkJCSFrZmlmb19pc19lbXB0eSgmZXZfaW50LT5kZXRfZXZlbnRzKSB8fAogCQkJCQlpbmRpb19kZXYtPmluZm8gPT0gTlVMTCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX3VubG9jazsKLQkJaWYgKGluZGlvX2Rldi0+aW5mbyA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJZ290byBlcnJvcl91bmxvY2s7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoaW5kaW9fZGV2LT5pbmZvID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQkJLyogU2luZ2xlIGFjY2VzcyBkZXZpY2Ugc28gbm8gb25lIGVsc2UgY2FuIGdldCB0aGUgZGF0YSAqLwotCX0KIAotCXJldCA9IGtmaWZvX3RvX3VzZXIoJmV2X2ludC0+ZGV0X2V2ZW50cywgYnVmLCBjb3VudCwgJmNvcGllZCk7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmV2X2ludC0+cmVhZF9sb2NrKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCXJldCA9IGtmaWZvX3RvX3VzZXIoJmV2X2ludC0+ZGV0X2V2ZW50cywgYnVmLCBjb3VudCwgJmNvcGllZCk7CisJCW11dGV4X3VubG9jaygmZXZfaW50LT5yZWFkX2xvY2spOwogCi1lcnJvcl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIHJldCA/IHJldCA6IGNvcGllZDsKKwkJLyoKKwkJICogSWYgd2UgY291bGRuJ3QgcmVhZCBhbnl0aGluZyBmcm9tIHRoZSBmaWZvIChhIGRpZmZlcmVudAorCQkgKiB0aHJlYWQgbWlnaHQgaGF2ZSBiZWVuIGZhc3Rlcikgd2UgZWl0aGVyIHJldHVybiAtRUFHQUlOIGlmCisJCSAqIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm9uLWJsb2NraW5nLCBvdGhlcndpc2Ugd2UgZ28gYmFjayB0bworCQkgKiBzbGVlcCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS4KKwkJICovCisJCWlmIChjb3BpZWQgPT0gMCAmJiAoZmlsZXAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJCXJldHVybiAtRUFHQUlOOworCisJfSB3aGlsZSAoY29waWVkID09IDApOworCisJcmV0dXJuIGNvcGllZDsKIH0KIAogc3RhdGljIGludCBpaW9fZXZlbnRfY2hyZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQpAQCAtMTQzLDE1ICsxNTEsNyBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlICpldl9pbnQgPSBpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZTsKIAotCXNwaW5fbG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKLQlfX2NsZWFyX2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncyk7Ci0JLyoKLQkgKiBJbiBvcmRlciB0byBtYWludGFpbiBhIGNsZWFuIHN0YXRlIGZvciByZW9wZW5pbmcsCi0JICogY2xlYXIgb3V0IGFueSBhd2FpdGluZyBldmVudHMuIFRoZSBtYXNrIHdpbGwgcHJldmVudAotCSAqIGFueSBuZXcgX19paW9fcHVzaF9ldmVudCBjYWxscyBydW5uaW5nLgotCSAqLwotCWtmaWZvX3Jlc2V0X291dCgmZXZfaW50LT5kZXRfZXZlbnRzKTsKLQlzcGluX3VubG9ja19pcnEoJmV2X2ludC0+d2FpdC5sb2NrKTsKKwljbGVhcl9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpOwogCiAJaWlvX2RldmljZV9wdXQoaW5kaW9fZGV2KTsKIApAQCAtMTc0LDIyICsxNzQsMjAgQEAKIAlpZiAoZXZfaW50ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3Bpbl9sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOwotCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KElJT19CVVNZX0JJVF9QT1MsICZldl9pbnQtPmZsYWdzKSkKIAkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZldl9pbnQtPndhaXQubG9jayk7CisKIAlpaW9fZGV2aWNlX2dldChpbmRpb19kZXYpOwogCiAJZmQgPSBhbm9uX2lub2RlX2dldGZkKCJpaW86ZXZlbnQiLCAmaWlvX2V2ZW50X2NocmRldl9maWxlb3BzLAogCQkJCWluZGlvX2RldiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogCWlmIChmZCA8IDApIHsKLQkJc3Bpbl9sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOwotCQlfX2NsZWFyX2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmZXZfaW50LT5mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmZXZfaW50LT53YWl0LmxvY2spOworCQljbGVhcl9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpOwogCQlpaW9fZGV2aWNlX3B1dChpbmRpb19kZXYpOworCX0gZWxzZSB7CisJCWtmaWZvX3Jlc2V0X291dCgmZXZfaW50LT5kZXRfZXZlbnRzKTsKIAl9CisKIAlyZXR1cm4gZmQ7CiB9CiAKQEAgLTM2NiwzMiArMzY0LDMxIEBACiAJCXJldCA9IGlpb19kZXZpY2VfYWRkX2V2ZW50KGluZGlvX2RldiwgY2hhbiwgaSwgdHlwZSwgZGlyLAogCQkJSUlPX1NFUEFSQVRFLCAmY2hhbi0+ZXZlbnRfc3BlY1tpXS5tYXNrX3NlcGFyYXRlKTsKIAkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX3JldDsKKwkJCXJldHVybiByZXQ7CiAJCWF0dHJjb3VudCArPSByZXQ7CiAKIAkJcmV0ID0gaWlvX2RldmljZV9hZGRfZXZlbnQoaW5kaW9fZGV2LCBjaGFuLCBpLCB0eXBlLCBkaXIsCiAJCQlJSU9fU0hBUkVEX0JZX1RZUEUsCiAJCQkmY2hhbi0+ZXZlbnRfc3BlY1tpXS5tYXNrX3NoYXJlZF9ieV90eXBlKTsKIAkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX3JldDsKKwkJCXJldHVybiByZXQ7CiAJCWF0dHJjb3VudCArPSByZXQ7CiAKIAkJcmV0ID0gaWlvX2RldmljZV9hZGRfZXZlbnQoaW5kaW9fZGV2LCBjaGFuLCBpLCB0eXBlLCBkaXIsCiAJCQlJSU9fU0hBUkVEX0JZX0RJUiwKIAkJCSZjaGFuLT5ldmVudF9zcGVjW2ldLm1hc2tfc2hhcmVkX2J5X2Rpcik7CiAJCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnJvcl9yZXQ7CisJCQlyZXR1cm4gcmV0OwogCQlhdHRyY291bnQgKz0gcmV0OwogCiAJCXJldCA9IGlpb19kZXZpY2VfYWRkX2V2ZW50KGluZGlvX2RldiwgY2hhbiwgaSwgdHlwZSwgZGlyLAogCQkJSUlPX1NIQVJFRF9CWV9BTEwsCiAJCQkmY2hhbi0+ZXZlbnRfc3BlY1tpXS5tYXNrX3NoYXJlZF9ieV9hbGwpOwogCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3JfcmV0OworCQkJcmV0dXJuIHJldDsKIAkJYXR0cmNvdW50ICs9IHJldDsKIAl9CiAJcmV0ID0gYXR0cmNvdW50OwotZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQyNSw2ICs0MjIsNyBAQAogewogCUlOSVRfS0ZJRk8oZXZfaW50LT5kZXRfZXZlbnRzKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZldl9pbnQtPndhaXQpOworCW11dGV4X2luaXQoJmV2X2ludC0+cmVhZF9sb2NrKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmlpb19ldmVudF9ncm91cF9uYW1lID0gImV2ZW50cyI7CkBAIC00NDAsMTAgKzQzOCw4IEBACiAKIAlpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZSA9CiAJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQorCWlmIChpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCUlOSVRfTElTVF9IRUFEKCZpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+ZGV2X2F0dHJfbGlzdCk7CiAKQEAgLTQ4OSw4ICs0ODUsNiBAQAogZXJyb3JfZnJlZV9zZXR1cF9ldmVudF9saW5lczoKIAlpaW9fZnJlZV9jaGFuX2RldmF0dHJfbGlzdCgmaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmRldl9hdHRyX2xpc3QpOwogCWtmcmVlKGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlKTsKLWVycm9yX3JldDoKLQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCmluZGV4IDc2NmZhYjIuLjMzODNiMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYwpAQCAtNjIsMTAgKzYyLDkgQEAKIAlpbnQgcmV0OwogCiAJdHJpZ19pbmZvLT5pZCA9IGlkYV9zaW1wbGVfZ2V0KCZpaW9fdHJpZ2dlcl9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOwotCWlmICh0cmlnX2luZm8tPmlkIDwgMCkgewotCQlyZXQgPSB0cmlnX2luZm8tPmlkOwotCQlnb3RvIGVycm9yX3JldDsKLQl9CisJaWYgKHRyaWdfaW5mby0+aWQgPCAwKQorCQlyZXR1cm4gdHJpZ19pbmZvLT5pZDsKKwogCS8qIFNldCB0aGUgbmFtZSB1c2VkIGZvciB0aGUgc3lzZnMgZGlyZWN0b3J5IGV0YyAqLwogCWRldl9zZXRfbmFtZSgmdHJpZ19pbmZvLT5kZXYsICJ0cmlnZ2VyJWxkIiwKIAkJICAgICAodW5zaWduZWQgbG9uZykgdHJpZ19pbmZvLT5pZCk7CkBAIC04Myw3ICs4Miw2IEBACiAKIGVycm9yX3VucmVnaXN0ZXJfaWQ6CiAJaWRhX3NpbXBsZV9yZW1vdmUoJmlpb190cmlnZ2VyX2lkYSwgdHJpZ19pbmZvLT5pZCk7Ci1lcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJfcmVnaXN0ZXIpOwpAQCAtMjM0LDEzICsyMzIsMTIgQEAKIAlpZiAodHJpZy0+b3BzICYmIHRyaWctPm9wcy0+c2V0X3RyaWdnZXJfc3RhdGUgJiYgbm9fb3RoZXJfdXNlcnMpIHsKIAkJcmV0ID0gdHJpZy0+b3BzLT5zZXRfdHJpZ2dlcl9zdGF0ZSh0cmlnLCBmYWxzZSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX3JldDsKKwkJCXJldHVybiByZXQ7CiAJfQogCWlpb190cmlnZ2VyX3B1dF9pcnEodHJpZywgcGYtPmlycSk7CiAJZnJlZV9pcnEocGYtPmlycSwgcGYpOwogCW1vZHVsZV9wdXQocGYtPmluZGlvX2Rldi0+aW5mby0+ZHJpdmVyX21vZHVsZSk7CiAKLWVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnIGIvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZwppbmRleCBkMTJiMmEwLi5jODk3NDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKQEAgLTczLDYgKzczLDIwIEBACiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEhJRCBTRU5TT1IKIAkgIEFtYmllbnQgbGlnaHQgc2Vuc29yLgogCitjb25maWcgSElEX1NFTlNPUl9QUk9YCisJZGVwZW5kcyBvbiBISURfU0VOU09SX0hVQgorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJc2VsZWN0IEhJRF9TRU5TT1JfSUlPX0NPTU1PTgorCXNlbGVjdCBISURfU0VOU09SX0lJT19UUklHR0VSCisJdHJpc3RhdGUgIkhJRCBQUk9YIgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgSElEIFNFTlNPUgorCSAgUHJveGltaXR5IHNlbnNvci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaGlkLXNlbnNvci1wcm94LgorCiBjb25maWcgU0VOU09SU19MTTM1MzMKIAl0cmlzdGF0ZSAiTE0zNTMzIGFtYmllbnQgbGlnaHQgc2Vuc29yIgogCWRlcGVuZHMgb24gTUZEX0xNMzUzMwpAQCAtOTAsNiArMTA0LDE4IEBACiAJICBjaGFuZ2VzLiBUaGUgQUxTLWNvbnRyb2wgb3V0cHV0IHZhbHVlcyBjYW4gYmUgc2V0IHBlciB6b25lIGZvciB0aGUKIAkgIHRocmVlIGN1cnJlbnQgb3V0cHV0IGNoYW5uZWxzLgogCitjb25maWcgTFRSNTAxCisJdHJpc3RhdGUgIkxUUi01MDFBTFMtMDEgbGlnaHQgc2Vuc29yIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTGl0ZS1PbiBMVFItNTAxQUxTLTAxCisJIGFtYmllbnQgbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IuCisKKwkgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorICAgICAgICAgd2lsbCBiZSBjYWxsZWQgbHRyNTAxLgorCiBjb25maWcgVENTMzQ3MgogCXRyaXN0YXRlICJUQU9TIFRDUzM0NzIgY29sb3IgbGlnaHQtdG8tZGlnaXRhbCBjb252ZXJ0ZXIiCiAJZGVwZW5kcyBvbiBJMkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlIGIvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKaW5kZXggNjBlMzVhYy4uM2ViMzZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKQEAgLTksNyArOSw5IEBACiBvYmotJChDT05GSUdfQ00zNjY1MSkJCSs9IGNtMzY2NTEubwogb2JqLSQoQ09ORklHX0dQMkFQMDIwQTAwRikJKz0gZ3AyYXAwMjBhMDBmLm8KIG9iai0kKENPTkZJR19ISURfU0VOU09SX0FMUykJKz0gaGlkLXNlbnNvci1hbHMubworb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfUFJPWCkJKz0gaGlkLXNlbnNvci1wcm94Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNMzUzMykJKz0gbG0zNTMzLWFscy5vCitvYmotJChDT05GSUdfTFRSNTAxKQkJKz0gbHRyNTAxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1RTTDI1NjMpCSs9IHRzbDI1NjMubwogb2JqLSQoQ09ORklHX1RDUzM0NzIpCQkrPSB0Y3MzNDcyLm8KIG9iai0kKENPTkZJR19UU0w0NTMxKQkJKz0gdHNsNDUzMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9hZGpkX3MzMTEuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2FkamRfczMxMS5jCmluZGV4IGYzMDY4NDcuLjA5YWQ1ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L2FkamRfczMxMS5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2FkamRfczMxMS5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMjAsNyArMTE5LDYgQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgYWRqZF9zMzExX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXM2NCB0aW1lX25zID0gaWlvX2dldF90aW1lX25zKCk7Ci0JaW50IGxlbiA9IDA7CiAJaW50IGksIGogPSAwOwogCiAJaW50IHJldCA9IGFkamRfczMxMV9yZXFfZGF0YShpbmRpb19kZXYpOwpAQCAtMTM1LDcgKzEzMyw2IEBACiAJCQlnb3RvIGRvbmU7CiAKIAkJZGF0YS0+YnVmZmVyW2orK10gPSByZXQgJiBBREpEX1MzMTFfREFUQV9NQVNLOwotCQlsZW4gKz0gMjsKIAl9CiAKIAlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgZGF0YS0+YnVmZmVyLCB0aW1lX25zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItcHJveC5jIGIvZHJpdmVycy9paW8vbGlnaHQvaGlkLXNlbnNvci1wcm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5NGFiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItcHJveC5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogSElEIFNlbnNvcnMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC1zZW5zb3ItaHViLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSAiLi4vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5oIgorCisjZGVmaW5lIENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTRU5DRSAwCisKK3N0cnVjdCBwcm94X3N0YXRlIHsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfY2FsbGJhY2tzIGNhbGxiYWNrczsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gY29tbW9uX2F0dHJpYnV0ZXM7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2F0dHJpYnV0ZV9pbmZvIHByb3hfYXR0cjsKKwl1MzIgaHVtYW5fcHJlc2VuY2U7Cit9OworCisvKiBDaGFubmVsIGRlZmluaXRpb25zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgcHJveF9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fUFJPWElNSVRZLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTk9fTU9ELAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAorCQlCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpIHwKKwkJQklUKElJT19DSEFOX0lORk9fSFlTVEVSRVNJUyksCisJCS5zY2FuX2luZGV4ID0gQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNFTkNFLAorCX0KK307CisKKy8qIEFkanVzdCBjaGFubmVsIHJlYWwgYml0cyBiYXNlZCBvbiByZXBvcnQgZGVzY3JpcHRvciAqLworc3RhdGljIHZvaWQgcHJveF9hZGp1c3RfY2hhbm5lbF9iaXRfbWFzayhzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsCisJCQkJCWludCBjaGFubmVsLCBpbnQgc2l6ZSkKK3sKKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUuc2lnbiA9ICdzJzsKKwkvKiBSZWFsIHN0b3JhZ2UgYml0cyB3aWxsIGNoYW5nZSBiYXNlZCBvbiB0aGUgcmVwb3J0IGRlc2MuICovCisJY2hhbm5lbHNbY2hhbm5lbF0uc2Nhbl90eXBlLnJlYWxiaXRzID0gc2l6ZSAqIDg7CisJLyogTWF4aW11bSBzaXplIG9mIGEgc2FtcGxlIHRvIGNhcHR1cmUgaXMgdTMyICovCisJY2hhbm5lbHNbY2hhbm5lbF0uc2Nhbl90eXBlLnN0b3JhZ2ViaXRzID0gc2l6ZW9mKHUzMikgKiA4OworfQorCisvKiBDaGFubmVsIHJlYWRfcmF3IGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgcHJveF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLAorCQkJICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBwcm94X3N0YXRlICpwcm94X3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmVwb3J0X2lkID0gLTE7CisJdTMyIGFkZHJlc3M7CisJaW50IHJldDsKKwlpbnQgcmV0X3R5cGU7CisKKwkqdmFsID0gMDsKKwkqdmFsMiA9IDA7CisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJc3dpdGNoIChjaGFuLT5zY2FuX2luZGV4KSB7CisJCWNhc2UgIENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTRU5DRToKKwkJCXJlcG9ydF9pZCA9IHByb3hfc3RhdGUtPnByb3hfYXR0ci5yZXBvcnRfaWQ7CisJCQlhZGRyZXNzID0KKwkJCUhJRF9VU0FHRV9TRU5TT1JfSFVNQU5fUFJFU0VOQ0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlcG9ydF9pZCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlcG9ydF9pZCA+PSAwKQorCQkJKnZhbCA9IHNlbnNvcl9odWJfaW5wdXRfYXR0cl9nZXRfcmF3X3ZhbHVlKAorCQkJCXByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmhzZGV2LAorCQkJCUhJRF9VU0FHRV9TRU5TT1JfUFJPWCwgYWRkcmVzcywKKwkJCQlyZXBvcnRfaWQpOworCQllbHNlIHsKKwkJCSp2YWwgPSAwOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkqdmFsID0gcHJveF9zdGF0ZS0+cHJveF9hdHRyLnVuaXRzOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQkqdmFsID0gaGlkX3NlbnNvcl9jb252ZXJ0X2V4cG9uZW50KAorCQkJCXByb3hfc3RhdGUtPnByb3hfYXR0ci51bml0X2V4cG8pOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQlyZXQgPSBoaWRfc2Vuc29yX3JlYWRfc2FtcF9mcmVxX3ZhbHVlKAorCQkJCSZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fSFlTVEVSRVNJUzoKKwkJcmV0ID0gaGlkX3NlbnNvcl9yZWFkX3Jhd19oeXN0X3ZhbHVlKAorCQkJCSZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXRfdHlwZSA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXRfdHlwZTsKK30KKworLyogQ2hhbm5lbCB3cml0ZV9yYXcgaGFuZGxlciAqLworc3RhdGljIGludCBwcm94X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgIGludCB2YWwsCisJCQkgICAgICAgaW50IHZhbDIsCisJCQkgICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBwcm94X3N0YXRlICpwcm94X3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldCA9IGhpZF9zZW5zb3Jfd3JpdGVfc2FtcF9mcmVxX3ZhbHVlKAorCQkJCSZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX0hZU1RFUkVTSVM6CisJCXJldCA9IGhpZF9zZW5zb3Jfd3JpdGVfcmF3X2h5c3RfdmFsdWUoCisJCQkJJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gcHJveF9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJnByb3hfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZwcm94X3dyaXRlX3JhdywKK307CisKKy8qIEZ1bmN0aW9uIHRvIHB1c2ggZGF0YSB0byBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGhpZF9zZW5zb3JfcHVzaF9kYXRhKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCWludCBsZW4pCit7CisJZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICJoaWRfc2Vuc29yX3B1c2hfZGF0YVxuIik7CisJaWlvX3B1c2hfdG9fYnVmZmVycyhpbmRpb19kZXYsIGRhdGEpOworfQorCisvKiBDYWxsYmFjayBoYW5kbGVyIHRvIHNlbmQgZXZlbnQgYWZ0ZXIgYWxsIHNhbXBsZXMgYXJlIHJlY2VpdmVkIGFuZCBjYXB0dXJlZCAqLworc3RhdGljIGludCBwcm94X3Byb2NfZXZlbnQoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocHJpdik7CisJc3RydWN0IHByb3hfc3RhdGUgKnByb3hfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICJwcm94X3Byb2NfZXZlbnQgWyVkXVxuIiwKKwkJCQlwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5KTsKKwlpZiAocHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuZGF0YV9yZWFkeSkKKwkJaGlkX3NlbnNvcl9wdXNoX2RhdGEoaW5kaW9fZGV2LAorCQkJCSZwcm94X3N0YXRlLT5odW1hbl9wcmVzZW5jZSwKKwkJCQlzaXplb2YocHJveF9zdGF0ZS0+aHVtYW5fcHJlc2VuY2UpKTsKKworCXJldHVybiAwOworfQorCisvKiBDYXB0dXJlIHNhbXBsZXMgaW4gbG9jYWwgc3RvcmFnZSAqLworc3RhdGljIGludCBwcm94X2NhcHR1cmVfc2FtcGxlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXNpemVfdCByYXdfbGVuLCBjaGFyICpyYXdfZGF0YSwKKwkJCQl2b2lkICpwcml2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwcml2KTsKKwlzdHJ1Y3QgcHJveF9zdGF0ZSAqcHJveF9zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHVzYWdlX2lkKSB7CisJY2FzZSBISURfVVNBR0VfU0VOU09SX0hVTUFOX1BSRVNFTkNFOgorCQlwcm94X3N0YXRlLT5odW1hbl9wcmVzZW5jZSA9ICoodTMyICopcmF3X2RhdGE7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFBhcnNlIHJlcG9ydCB3aGljaCBpcyBzcGVjaWZpYyB0byBhbiB1c2FnZSBpZCovCitzdGF0aWMgaW50IHByb3hfcGFyc2VfcmVwb3J0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXN0cnVjdCBwcm94X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2Vuc29yX2h1Yl9pbnB1dF9nZXRfYXR0cmlidXRlX2luZm8oaHNkZXYsIEhJRF9JTlBVVF9SRVBPUlQsCisJCQl1c2FnZV9pZCwKKwkJCUhJRF9VU0FHRV9TRU5TT1JfSFVNQU5fUFJFU0VOQ0UsCisJCQkmc3QtPnByb3hfYXR0cik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcHJveF9hZGp1c3RfY2hhbm5lbF9iaXRfbWFzayhjaGFubmVscywgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNFTkNFLAorCQkJCQlzdC0+cHJveF9hdHRyLnNpemUpOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJveCAleDoleFxuIiwgc3QtPnByb3hfYXR0ci5pbmRleCwKKwkJCXN0LT5wcm94X2F0dHIucmVwb3J0X2lkKTsKKworCS8qIFNldCBTZW5zaXRpdml0eSBmaWVsZCBpZHMsIHdoZW4gdGhlcmUgaXMgbm8gaW5kaXZpZHVhbCBtb2RpZmllciAqLworCWlmIChzdC0+Y29tbW9uX2F0dHJpYnV0ZXMuc2Vuc2l0aXZpdHkuaW5kZXggPCAwKSB7CisJCXNlbnNvcl9odWJfaW5wdXRfZ2V0X2F0dHJpYnV0ZV9pbmZvKGhzZGV2LAorCQkJSElEX0ZFQVRVUkVfUkVQT1JULCB1c2FnZV9pZCwKKwkJCUhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyB8CisJCQlISURfVVNBR0VfU0VOU09SX0RBVEFfUFJFU0VOQ0UsCisJCQkmc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5KTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiU2Vuc2l0aXZpdHkgaW5kZXg6cmVwb3J0ICVkOiVkXG4iLAorCQkJc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LmluZGV4LAorCQkJc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LnJlcG9ydF9pZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3NpbmcgZm9yIHVzYWdlIGlkICovCitzdGF0aWMgaW50IGhpZF9wcm94X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSAicHJveCI7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgcHJveF9zdGF0ZSAqcHJveF9zdGF0ZTsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVsczsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgcHJveF9zdGF0ZSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmRpb19kZXYpOworCisJcHJveF9zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYgPSBoc2RldjsKKwlwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5wZGV2ID0gcGRldjsKKworCXJldCA9IGhpZF9zZW5zb3JfcGFyc2VfY29tbW9uX2F0dHJpYnV0ZXMoaHNkZXYsIEhJRF9VU0FHRV9TRU5TT1JfUFJPWCwKKwkJCQkJJnByb3hfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXR1cCBjb21tb24gYXR0cmlidXRlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hhbm5lbHMgPSBrbWVtZHVwKHByb3hfY2hhbm5lbHMsIHNpemVvZihwcm94X2NoYW5uZWxzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVscykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZHVwbGljYXRlIGNoYW5uZWxzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gcHJveF9wYXJzZV9yZXBvcnQocGRldiwgaHNkZXYsIGNoYW5uZWxzLAorCQkJCUhJRF9VU0FHRV9TRU5TT1JfUFJPWCwgcHJveF9zdGF0ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgYXR0cmlidXRlc1xuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9kZXZfbWVtOworCX0KKworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9CisJCQkJQVJSQVlfU0laRShwcm94X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZwcm94X2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsICZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKKwkJTlVMTCwgTlVMTCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0cmlnZ2VyIGJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9kZXZfbWVtOworCX0KKwlwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5ID0gZmFsc2U7CisJcmV0ID0gaGlkX3NlbnNvcl9zZXR1cF90cmlnZ2VyKGluZGlvX2RldiwgbmFtZSwKKwkJCQkmcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidHJpZ2dlciBzZXR1cCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX2J1ZmZlcl9mdW5jczsKKwl9CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJkZXZpY2UgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKKwl9CisKKwlwcm94X3N0YXRlLT5jYWxsYmFja3Muc2VuZF9ldmVudCA9IHByb3hfcHJvY19ldmVudDsKKwlwcm94X3N0YXRlLT5jYWxsYmFja3MuY2FwdHVyZV9zYW1wbGUgPSBwcm94X2NhcHR1cmVfc2FtcGxlOworCXByb3hfc3RhdGUtPmNhbGxiYWNrcy5wZGV2ID0gcGRldjsKKwlyZXQgPSBzZW5zb3JfaHViX3JlZ2lzdGVyX2NhbGxiYWNrKGhzZGV2LCBISURfVVNBR0VfU0VOU09SX1BST1gsCisJCQkJCSZwcm94X3N0YXRlLT5jYWxsYmFja3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbGxiYWNrIHJlZyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2lpb191bnJlZzsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9paW9fdW5yZWc6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwloaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKCZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CitlcnJvcl91bnJlZ19idWZmZXJfZnVuY3M6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXZfbWVtOgorCWtmcmVlKGluZGlvX2Rldi0+Y2hhbm5lbHMpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGRlaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc2luZyBmb3IgdXNhZ2UgaWQgKi8KK3N0YXRpYyBpbnQgaGlkX3Byb3hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHByb3hfc3RhdGUgKnByb3hfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc2Vuc29yX2h1Yl9yZW1vdmVfY2FsbGJhY2soaHNkZXYsIEhJRF9VU0FHRV9TRU5TT1JfUFJPWCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaGlkX3NlbnNvcl9yZW1vdmVfdHJpZ2dlcigmcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBoaWRfcHJveF9pZHNbXSA9IHsKKwl7CisJCS8qIEZvcm1hdDogSElELVNFTlNPUi11c2FnZV9pZF9pbl9oZXhfbG93ZXJjYXNlICovCisJCS5uYW1lID0gIkhJRC1TRU5TT1ItMjAwMDExIiwKKwl9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGhpZF9wcm94X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhpZF9wcm94X3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBoaWRfcHJveF9pZHMsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gaGlkX3Byb3hfcHJvYmUsCisJLnJlbW92ZQkJPSBoaWRfcHJveF9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoaWRfcHJveF9wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkhJRCBTZW5zb3IgUHJveGltaXR5Iik7CitNT0RVTEVfQVVUSE9SKCJBcmNoYW5hIFBhdG5pIDxhcmNoYW5hLnBhdG5pQGludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2x0cjUwMS5jIGIvZHJpdmVycy9paW8vbGlnaHQvbHRyNTAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiNzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2x0cjUwMS5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogbHRyNTAxLmMgLSBTdXBwb3J0IGZvciBMaXRlLU9uIExUUjUwMSBhbWJpZW50IGxpZ2h0IGFuZCBwcm94aW1pdHkgc2Vuc29yCisgKgorICogQ29weXJpZ2h0IDIwMTQgUGV0ZXIgTWVlcndhbGQgPHBtZWVyd0BwbWVlcncubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogNy1iaXQgSTJDIHNsYXZlIGFkZHJlc3MgMHgyMworICoKKyAqIFRPRE86IGludGVycnVwdCwgdGhyZXNob2xkLCBtZWFzdXJlbWVudCByYXRlLCBJUiBMRUQgY2hhcmFjdGVyaXN0aWNzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKworI2RlZmluZSBMVFI1MDFfRFJWX05BTUUgImx0cjUwMSIKKworI2RlZmluZSBMVFI1MDFfQUxTX0NPTlRSIDB4ODAgLyogQUxTIG9wZXJhdGlvbiBtb2RlLCBTVyByZXNldCAqLworI2RlZmluZSBMVFI1MDFfUFNfQ09OVFIgMHg4MSAvKiBQUyBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBMVFI1MDFfUEFSVF9JRCAweDg2CisjZGVmaW5lIExUUjUwMV9NQU5VRkFDX0lEIDB4ODcKKyNkZWZpbmUgTFRSNTAxX0FMU19EQVRBMSAweDg4IC8qIDE2LWJpdCwgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBMVFI1MDFfQUxTX0RBVEEwIDB4OGEgLyogMTYtYml0LCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIExUUjUwMV9BTFNfUFNfU1RBVFVTIDB4OGMKKyNkZWZpbmUgTFRSNTAxX1BTX0RBVEEgMHg4ZCAvKiAxNi1iaXQsIGxpdHRsZSBlbmRpYW4gKi8KKworI2RlZmluZSBMVFI1MDFfQUxTX0NPTlRSX1NXX1JFU0VUIEJJVCgyKQorI2RlZmluZSBMVFI1MDFfQ09OVFJfUFNfR0FJTl9NQVNLIChCSVQoMykgfCBCSVQoMikpCisjZGVmaW5lIExUUjUwMV9DT05UUl9QU19HQUlOX1NISUZUIDIKKyNkZWZpbmUgTFRSNTAxX0NPTlRSX0FMU19HQUlOX01BU0sgQklUKDMpCisjZGVmaW5lIExUUjUwMV9DT05UUl9BQ1RJVkUgQklUKDEpCisKKyNkZWZpbmUgTFRSNTAxX1NUQVRVU19BTFNfUkRZIEJJVCgyKQorI2RlZmluZSBMVFI1MDFfU1RBVFVTX1BTX1JEWSBCSVQoMCkKKworI2RlZmluZSBMVFI1MDFfUFNfREFUQV9NQVNLIDB4N2ZmCisKK3N0cnVjdCBsdHI1MDFfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgbXV0ZXggbG9ja19hbHMsIGxvY2tfcHM7CisJdTggYWxzX2NvbnRyLCBwc19jb250cjsKK307CisKK3N0YXRpYyBpbnQgbHRyNTAxX2RyZHkoc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhLCB1OCBkcmR5X21hc2spCit7CisJaW50IHRyaWVzID0gMTAwOworCWludCByZXQ7CisKKwl3aGlsZSAodHJpZXMtLSkgeworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJTFRSNTAxX0FMU19QU19TVEFUVVMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmICgocmV0ICYgZHJkeV9tYXNrKSA9PSBkcmR5X21hc2spCisJCQlyZXR1cm4gMDsKKwkJbXNsZWVwKDI1KTsKKwl9CisKKwlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgImx0cjUwMV9kcmR5KCkgZmFpbGVkLCBkYXRhIG5vdCByZWFkeVxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX3JlYWRfYWxzKHN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSwgX19sZTE2IGJ1ZlsyXSkKK3sKKwlpbnQgcmV0ID0gbHRyNTAxX2RyZHkoZGF0YSwgTFRSNTAxX1NUQVRVU19BTFNfUkRZKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKiBhbHdheXMgcmVhZCBib3RoIEFMUyBjaGFubmVscyBpbiBnaXZlbiBvcmRlciAqLworCXJldHVybiBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShkYXRhLT5jbGllbnQsCisJCUxUUjUwMV9BTFNfREFUQTEsIDIgKiBzaXplb2YoX19sZTE2KSwgKHU4ICopIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX3JlYWRfcHMoc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhKQoreworCWludCByZXQgPSBsdHI1MDFfZHJkeShkYXRhLCBMVFI1MDFfU1RBVFVTX1BTX1JEWSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsIExUUjUwMV9QU19EQVRBKTsKK30KKworI2RlZmluZSBMVFI1MDFfSU5URU5TSVRZX0NIQU5ORUwoX2lkeCwgX2FkZHIsIF9tb2QsIF9zaGFyZWQpIHsgXAorCS50eXBlID0gSUlPX0lOVEVOU0lUWSwgXAorCS5tb2RpZmllZCA9IDEsIFwKKwkuYWRkcmVzcyA9IChfYWRkciksIFwKKwkuY2hhbm5lbDIgPSAoX21vZCksIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSAoX3NoYXJlZCksIFwKKwkuc2Nhbl9pbmRleCA9IChfaWR4KSwgXAorCS5zY2FuX3R5cGUgPSB7IFwKKwkJLnNpZ24gPSAndScsIFwKKwkJLnJlYWxiaXRzID0gMTYsIFwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsIFwKKwkJLmVuZGlhbm5lc3MgPSBJSU9fQ1BVLCBcCisJfSBcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBsdHI1MDFfY2hhbm5lbHNbXSA9IHsKKwlMVFI1MDFfSU5URU5TSVRZX0NIQU5ORUwoMCwgTFRSNTAxX0FMU19EQVRBMCwgSUlPX01PRF9MSUdIVF9CT1RILCAwKSwKKwlMVFI1MDFfSU5URU5TSVRZX0NIQU5ORUwoMSwgTFRSNTAxX0FMU19EQVRBMSwgSUlPX01PRF9MSUdIVF9JUiwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpKSwKKwl7CisJCS50eXBlID0gSUlPX1BST1hJTUlUWSwKKwkJLmFkZHJlc3MgPSBMVFI1MDFfUFNfREFUQSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAorCQkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuc2Nhbl9pbmRleCA9IDIsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuc2lnbiA9ICd1JywKKwkJCS5yZWFsYml0cyA9IDExLAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCQkuZW5kaWFubmVzcyA9IElJT19DUFUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgzKSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbHRyNTAxX3BzX2dhaW5bNF1bMl0gPSB7CisJezEsIDB9LCB7MCwgMjUwMDAwfSwgezAsIDEyNTAwMH0sIHswLCA2MjUwMH0KK307CisKK3N0YXRpYyBpbnQgbHRyNTAxX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkJaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJX19sZTE2IGJ1ZlsyXTsKKwlpbnQgcmV0LCBpOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fSU5URU5TSVRZOgorCQkJbXV0ZXhfbG9jaygmZGF0YS0+bG9ja19hbHMpOworCQkJcmV0ID0gbHRyNTAxX3JlYWRfYWxzKGRhdGEsIGJ1Zik7CisJCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2tfYWxzKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQkqdmFsID0gbGUxNl90b19jcHUoY2hhbi0+YWRkcmVzcyA9PSBMVFI1MDFfQUxTX0RBVEExID8KKwkJCQlidWZbMF0gOiBidWZbMV0pOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrX3BzKTsKKwkJCXJldCA9IGx0cjUwMV9yZWFkX3BzKGRhdGEpOworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrX3BzKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQkqdmFsID0gcmV0ICYgTFRSNTAxX1BTX0RBVEFfTUFTSzsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fSU5URU5TSVRZOgorCQkJaWYgKGRhdGEtPmFsc19jb250ciAmIExUUjUwMV9DT05UUl9BTFNfR0FJTl9NQVNLKSB7CisJCQkJKnZhbCA9IDA7CisJCQkJKnZhbDIgPSA1MDAwOworCQkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQkJfSBlbHNlIHsKKwkJCQkqdmFsID0gMTsKKwkJCQkqdmFsMiA9IDA7CisJCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJfQorCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQlpID0gKGRhdGEtPnBzX2NvbnRyICYgTFRSNTAxX0NPTlRSX1BTX0dBSU5fTUFTSykgPj4KKwkJCQlMVFI1MDFfQ09OVFJfUFNfR0FJTl9TSElGVDsKKwkJCSp2YWwgPSBsdHI1MDFfcHNfZ2FpbltpXVswXTsKKwkJCSp2YWwyID0gbHRyNTAxX3BzX2dhaW5baV1bMV07CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9nZXRfcHNfZ2Fpbl9pbmRleChpbnQgdmFsLCBpbnQgdmFsMikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGx0cjUwMV9wc19nYWluKTsgaSsrKQorCQlpZiAodmFsID09IGx0cjUwMV9wc19nYWluW2ldWzBdICYmIHZhbDIgPT0gbHRyNTAxX3BzX2dhaW5baV1bMV0pCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBsdHI1MDFfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICAgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBpOworCisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fSU5URU5TSVRZOgorCQkJaWYgKHZhbCA9PSAwICYmIHZhbDIgPT0gNTAwMCkKKwkJCQlkYXRhLT5hbHNfY29udHIgfD0gTFRSNTAxX0NPTlRSX0FMU19HQUlOX01BU0s7CisJCQllbHNlIGlmICh2YWwgPT0gMSAmJiB2YWwyID09IDApCisJCQkJZGF0YS0+YWxzX2NvbnRyICY9IH5MVFI1MDFfQ09OVFJfQUxTX0dBSU5fTUFTSzsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlMVFI1MDFfQUxTX0NPTlRSLCBkYXRhLT5hbHNfY29udHIpOworCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQlpID0gbHRyNTAxX2dldF9wc19nYWluX2luZGV4KHZhbCwgdmFsMik7CisJCQlpZiAoaSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlkYXRhLT5wc19jb250ciAmPSB+TFRSNTAxX0NPTlRSX1BTX0dBSU5fTUFTSzsKKwkJCWRhdGEtPnBzX2NvbnRyIHw9IGkgPDwgTFRSNTAxX0NPTlRSX1BTX0dBSU5fU0hJRlQ7CisJCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJTFRSNTAxX1BTX0NPTlRSLCBkYXRhLT5wc19jb250cik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19DT05TVF9BVFRSKGluX3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUsICIxIDAuMjUgMC4xMjUgMC4wNjI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5faW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZSwgIjEgMC4wMDUiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0cjUwMV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2luX3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5faW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGx0cjUwMV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gbHRyNTAxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGx0cjUwMV9pbmZvID0geworCS5yZWFkX3JhdyA9IGx0cjUwMV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gbHRyNTAxX3dyaXRlX3JhdywKKwkuYXR0cnMgPSAmbHRyNTAxX2F0dHJpYnV0ZV9ncm91cCwKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBsdHI1MDFfd3JpdGVfY29udHIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggYWxzX3ZhbCwgdTggcHNfdmFsKQoreworCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRSNTAxX0FMU19DT05UUiwgYWxzX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExUUjUwMV9QU19DT05UUiwgcHNfdmFsKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGx0cjUwMV90cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTE2IGJ1Zls4XTsKKwlfX2xlMTYgYWxzX2J1ZlsyXTsKKwl1OCBtYXNrID0gMDsKKwlpbnQgaiA9IDA7CisJaW50IHJldDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCS8qIGZpZ3VyZSBvdXQgd2hpY2ggZGF0YSBuZWVkcyB0byBiZSByZWFkeSAqLworCWlmICh0ZXN0X2JpdCgwLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spIHx8CisJCXRlc3RfYml0KDEsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpCisJCW1hc2sgfD0gTFRSNTAxX1NUQVRVU19BTFNfUkRZOworCWlmICh0ZXN0X2JpdCgyLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spKQorCQltYXNrIHw9IExUUjUwMV9TVEFUVVNfUFNfUkRZOworCisJcmV0ID0gbHRyNTAxX2RyZHkoZGF0YSwgbWFzayk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCWlmIChtYXNrICYgTFRSNTAxX1NUQVRVU19BTFNfUkRZKSB7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRhdGEtPmNsaWVudCwKKwkJCUxUUjUwMV9BTFNfREFUQTEsIHNpemVvZihhbHNfYnVmKSwgKHU4ICopIGFsc19idWYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmICh0ZXN0X2JpdCgwLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spKQorCQkJYnVmW2orK10gPSBsZTE2X3RvX2NwdShhbHNfYnVmWzFdKTsKKwkJaWYgKHRlc3RfYml0KDEsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpCisJCQlidWZbaisrXSA9IGxlMTZfdG9fY3B1KGFsc19idWZbMF0pOworCX0KKworCWlmIChtYXNrICYgTFRSNTAxX1NUQVRVU19QU19SRFkpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwgTFRSNTAxX1BTX0RBVEEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJYnVmW2orK10gPSByZXQgJiBMVFI1MDFfUFNfREFUQV9NQVNLOworCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBidWYsCisJCWlpb19nZXRfdGltZV9ucygpKTsKKworZG9uZToKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9pbml0KHN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTFRSNTAxX0FMU19DT05UUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZGF0YS0+YWxzX2NvbnRyID0gcmV0IHwgTFRSNTAxX0NPTlRSX0FDVElWRTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExUUjUwMV9QU19DT05UUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZGF0YS0+cHNfY29udHIgPSByZXQgfCBMVFI1MDFfQ09OVFJfQUNUSVZFOworCisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsIGRhdGEtPmFsc19jb250ciwKKwkJZGF0YS0+cHNfY29udHIpOworfQorCitzdGF0aWMgaW50IGx0cjUwMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCW11dGV4X2luaXQoJmRhdGEtPmxvY2tfYWxzKTsKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrX3BzKTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExUUjUwMV9QQVJUX0lEKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoKHJldCA+PiA0KSAhPSAweDgpCisJCXJldHVybiAtRU5PREVWOworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZsdHI1MDFfaW5mbzsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gbHRyNTAxX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShsdHI1MDFfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+bmFtZSA9IExUUjUwMV9EUlZfTkFNRTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBsdHI1MDFfaW5pdChkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKKwkJbHRyNTAxX3RyaWdnZXJfaGFuZGxlciwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX2J1ZmZlcjsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19idWZmZXI6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHRyNTAxX3Bvd2VyZG93bihzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsCisJCWRhdGEtPmFsc19jb250ciAmIH5MVFI1MDFfQ09OVFJfQUNUSVZFLAorCQlkYXRhLT5wc19jb250ciAmIH5MVFI1MDFfQ09OVFJfQUNUSVZFKTsKK30KKworc3RhdGljIGludCBsdHI1MDFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCWx0cjUwMV9wb3dlcmRvd24oaWlvX3ByaXYoaW5kaW9fZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBsdHI1MDFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGx0cjUwMV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaTJjX2dldF9jbGllbnRkYXRhKAorCQl0b19pMmNfY2xpZW50KGRldikpKTsKKwlyZXR1cm4gbHRyNTAxX3Bvd2VyZG93bihkYXRhKTsKK30KKworc3RhdGljIGludCBsdHI1MDFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEoCisJCXRvX2kyY19jbGllbnQoZGV2KSkpOworCisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsIGRhdGEtPmFsc19jb250ciwKKwkJZGF0YS0+cHNfY29udHIpOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhsdHI1MDFfcG1fb3BzLCBsdHI1MDFfc3VzcGVuZCwgbHRyNTAxX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdHI1MDFfaWRbXSA9IHsKKwl7ICJsdHI1MDEiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGx0cjUwMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdHI1MDFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgPSBMVFI1MDFfRFJWX05BTUUsCisJCS5wbQk9ICZsdHI1MDFfcG1fb3BzLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgID0gbHRyNTAxX3Byb2JlLAorCS5yZW1vdmUJPSBsdHI1MDFfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGx0cjUwMV9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGx0cjUwMV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxpdGUtT24gTFRSNTAxIGFtYmllbnQgbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC90Y3MzNDcyLmMgYi9kcml2ZXJzL2lpby9saWdodC90Y3MzNDcyLmMKaW5kZXggODg3ZmVjZi4uZmUwNjNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvdGNzMzQ3Mi5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3RjczM0NzIuYwpAQCAtMTc5LDcgKzE3OSw2IEBACiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgdGNzMzQ3Ml9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlpbnQgbGVuID0gMDsKIAlpbnQgaSwgaiA9IDA7CiAKIAlpbnQgcmV0ID0gdGNzMzQ3Ml9yZXFfZGF0YShkYXRhKTsKQEAgLTE5NCw3ICsxOTMsNiBAQAogCQkJZ290byBkb25lOwogCiAJCWRhdGEtPmJ1ZmZlcltqKytdID0gcmV0OwotCQlsZW4gKz0gMjsKIAl9CiAKIAlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgZGF0YS0+YnVmZmVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jCmluZGV4IDA1NDIzNTQuLjc0ODY2ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9hazg5NzUuYworKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc1LmMKQEAgLTUxMyw2ICs1MTMsNyBAQAogCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhazg5NzVfY2hhbm5lbHM7CiAJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFrODk3NV9jaGFubmVscyk7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmFrODk3NV9pbmZvOworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAogCWVyciA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCmluZGV4IGY2Njk1NWYuLjhiNzc3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKKysrIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYwpAQCAtMTgzLDkgKzE4MywxNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6Ci0JCSp2YWwgPSAwOwotCQkqdmFsMiA9IDEwMDA7Ci0JCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fTUFHTjoKKwkJCSp2YWwgPSAwOworCQkJKnZhbDIgPSAxMDAwOworCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWNhc2UgSUlPX1RFTVA6CisJCQkqdmFsID0gMTAwMDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKIAkJaSA9IGRhdGEtPmN0cmxfcmVnMSA+PiBNQUczMTEwX0NUUkxfRFJfU0hJRlQ7CiAJCSp2YWwgPSBtYWczMTEwX3NhbXBfZnJlcVtpXVswXTsKQEAgLTI3MCw3ICsyNzgsOCBAQAogCU1BRzMxMTBfQ0hBTk5FTChaLCAyKSwKIAl7CiAJCS50eXBlID0gSUlPX1RFTVAsCi0JCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8CisJCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCiAJCS5zY2FuX2luZGV4ID0gMywKIAkJLnNjYW5fdHlwZSA9IHsKIAkJCS5zaWduID0gJ3MnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKaW5kZXggYThiOWNhZS4uZDg4ZmYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCkBAIC01LDYgKzUsMjAgQEAKIAogbWVudSAiUHJlc3N1cmUgc2Vuc29ycyIKIAorY29uZmlnIEhJRF9TRU5TT1JfUFJFU1MKKwlkZXBlbmRzIG9uIEhJRF9TRU5TT1JfSFVCCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwlzZWxlY3QgSElEX1NFTlNPUl9JSU9fQ09NTU9OCisJc2VsZWN0IEhJRF9TRU5TT1JfSUlPX1RSSUdHRVIKKwl0cmlzdGF0ZSAiSElEIFBSRVNTIgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgSElEIFNFTlNPUgorCSAgUHJlc3N1cmUgZHJpdmVyCisKKyAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgaGlkLXNlbnNvci1wcmVzcy4KKwogY29uZmlnIE1QTDMxMTUKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QTDMxMTVBMiBwcmVzc3VyZSBzZW5zb3IgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC0yNiw3ICs0MCw3IEBACiAJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSIGlmIChJSU9fQlVGRkVSKQogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBTVE1pY3JvZWxlY3Ryb25pY3MgcHJlc3N1cmUKLQkgIHNlbnNvcnM6IExQUzAwMVdQLCBMUFMzMzFBUC4KKwkgIHNlbnNvcnM6IExQUzAwMVdQLCBMUFMyNUgsIExQUzMzMUFQLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZXNlIG1vZHVsZXMKIAkgIHdpbGwgYmUgY3JlYXRlZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKaW5kZXggNDJiYjlmYy4uNGE1N2JmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiAjCiAKICMgV2hlbiBhZGRpbmcgbmV3IGVudHJpZXMga2VlcCB0aGUgbGlzdCBpbiBhbHBoYWJldGljYWwgb3JkZXIKK29iai0kKENPTkZJR19ISURfU0VOU09SX1BSRVNTKSAgICs9IGhpZC1zZW5zb3ItcHJlc3Mubwogb2JqLSQoQ09ORklHX01QTDMxMTUpICs9IG1wbDMxMTUubwogb2JqLSQoQ09ORklHX0lJT19TVF9QUkVTUykgKz0gc3RfcHJlc3N1cmUubwogc3RfcHJlc3N1cmUteSA6PSBzdF9wcmVzc3VyZV9jb3JlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2hpZC1zZW5zb3ItcHJlc3MuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2hpZC1zZW5zb3ItcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGU2NDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvaGlkLXNlbnNvci1wcmVzcy5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogSElEIFNlbnNvcnMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC1zZW5zb3ItaHViLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSAiLi4vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5oIgorCisjZGVmaW5lIENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTU1VSRSAwCisKK3N0cnVjdCBwcmVzc19zdGF0ZSB7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2NhbGxiYWNrcyBjYWxsYmFja3M7CisJc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uIGNvbW1vbl9hdHRyaWJ1dGVzOworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9hdHRyaWJ1dGVfaW5mbyBwcmVzc19hdHRyOworCXUzMiBwcmVzc19kYXRhOworfTsKKworLyogQ2hhbm5lbCBkZWZpbml0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHByZXNzX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19QUkVTU1VSRSwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX05PX01PRCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwKKwkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwKKwkJQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSB8CisJCUJJVChJSU9fQ0hBTl9JTkZPX0hZU1RFUkVTSVMpLAorCQkuc2Nhbl9pbmRleCA9IENIQU5ORUxfU0NBTl9JTkRFWF9QUkVTU1VSRSwKKwl9Cit9OworCisvKiBBZGp1c3QgY2hhbm5lbCByZWFsIGJpdHMgYmFzZWQgb24gcmVwb3J0IGRlc2NyaXB0b3IgKi8KK3N0YXRpYyB2b2lkIHByZXNzX2FkanVzdF9jaGFubmVsX2JpdF9tYXNrKHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVscywKKwkJCQkJaW50IGNoYW5uZWwsIGludCBzaXplKQoreworCWNoYW5uZWxzW2NoYW5uZWxdLnNjYW5fdHlwZS5zaWduID0gJ3MnOworCS8qIFJlYWwgc3RvcmFnZSBiaXRzIHdpbGwgY2hhbmdlIGJhc2VkIG9uIHRoZSByZXBvcnQgZGVzYy4gKi8KKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUucmVhbGJpdHMgPSBzaXplICogODsKKwkvKiBNYXhpbXVtIHNpemUgb2YgYSBzYW1wbGUgdG8gY2FwdHVyZSBpcyB1MzIgKi8KKwljaGFubmVsc1tjaGFubmVsXS5zY2FuX3R5cGUuc3RvcmFnZWJpdHMgPSBzaXplb2YodTMyKSAqIDg7Cit9CisKKy8qIENoYW5uZWwgcmVhZF9yYXcgaGFuZGxlciAqLworc3RhdGljIGludCBwcmVzc19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLAorCQkJICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBwcmVzc19zdGF0ZSAqcHJlc3Nfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXBvcnRfaWQgPSAtMTsKKwl1MzIgYWRkcmVzczsKKwlpbnQgcmV0OworCWludCByZXRfdHlwZTsKKworCSp2YWwgPSAwOworCSp2YWwyID0gMDsKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlzd2l0Y2ggKGNoYW4tPnNjYW5faW5kZXgpIHsKKwkJY2FzZSAgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNTVVJFOgorCQkJcmVwb3J0X2lkID0gcHJlc3Nfc3RhdGUtPnByZXNzX2F0dHIucmVwb3J0X2lkOworCQkJYWRkcmVzcyA9CisJCQlISURfVVNBR0VfU0VOU09SX0FUTU9TUEhFUklDX1BSRVNTVVJFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXBvcnRfaWQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXBvcnRfaWQgPj0gMCkKKwkJCSp2YWwgPSBzZW5zb3JfaHViX2lucHV0X2F0dHJfZ2V0X3Jhd192YWx1ZSgKKwkJCQlwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYsCisJCQkJSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwgYWRkcmVzcywKKwkJCQlyZXBvcnRfaWQpOworCQllbHNlIHsKKwkJCSp2YWwgPSAwOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkqdmFsID0gcHJlc3Nfc3RhdGUtPnByZXNzX2F0dHIudW5pdHM7CisJCXJldF90eXBlID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCSp2YWwgPSBoaWRfc2Vuc29yX2NvbnZlcnRfZXhwb25lbnQoCisJCQkJcHJlc3Nfc3RhdGUtPnByZXNzX2F0dHIudW5pdF9leHBvKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0ID0gaGlkX3NlbnNvcl9yZWFkX3NhbXBfZnJlcV92YWx1ZSgKKwkJCQkmcHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLCB2YWwsIHZhbDIpOworCQlyZXRfdHlwZSA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19IWVNURVJFU0lTOgorCQlyZXQgPSBoaWRfc2Vuc29yX3JlYWRfcmF3X2h5c3RfdmFsdWUoCisJCQkJJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywgdmFsLCB2YWwyKTsKKwkJcmV0X3R5cGUgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXRfdHlwZSA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXRfdHlwZTsKK30KKworLyogQ2hhbm5lbCB3cml0ZV9yYXcgaGFuZGxlciAqLworc3RhdGljIGludCBwcmVzc193cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgICBpbnQgdmFsLAorCQkJICAgICAgIGludCB2YWwyLAorCQkJICAgICAgIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldCA9IGhpZF9zZW5zb3Jfd3JpdGVfc2FtcF9mcmVxX3ZhbHVlKAorCQkJCSZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMsIHZhbCwgdmFsMik7CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19IWVNURVJFU0lTOgorCQlyZXQgPSBoaWRfc2Vuc29yX3dyaXRlX3Jhd19oeXN0X3ZhbHVlKAorCQkJCSZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMsIHZhbCwgdmFsMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBwcmVzc19pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJnByZXNzX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSAmcHJlc3Nfd3JpdGVfcmF3LAorfTsKKworLyogRnVuY3Rpb24gdG8gcHVzaCBkYXRhIHRvIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgaGlkX3NlbnNvcl9wdXNoX2RhdGEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJaW50IGxlbikKK3sKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgImhpZF9zZW5zb3JfcHVzaF9kYXRhXG4iKTsKKwlpaW9fcHVzaF90b19idWZmZXJzKGluZGlvX2RldiwgZGF0YSk7Cit9CisKKy8qIENhbGxiYWNrIGhhbmRsZXIgdG8gc2VuZCBldmVudCBhZnRlciBhbGwgc2FtcGxlcyBhcmUgcmVjZWl2ZWQgYW5kIGNhcHR1cmVkICovCitzdGF0aWMgaW50IHByZXNzX3Byb2NfZXZlbnQoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJdW5zaWduZWQgdXNhZ2VfaWQsCisJCQkJdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocHJpdik7CisJc3RydWN0IHByZXNzX3N0YXRlICpwcmVzc19zdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgInByZXNzX3Byb2NfZXZlbnQgWyVkXVxuIiwKKwkJCQlwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuZGF0YV9yZWFkeSk7CisJaWYgKHByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5kYXRhX3JlYWR5KQorCQloaWRfc2Vuc29yX3B1c2hfZGF0YShpbmRpb19kZXYsCisJCQkJJnByZXNzX3N0YXRlLT5wcmVzc19kYXRhLAorCQkJCXNpemVvZihwcmVzc19zdGF0ZS0+cHJlc3NfZGF0YSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhcHR1cmUgc2FtcGxlcyBpbiBsb2NhbCBzdG9yYWdlICovCitzdGF0aWMgaW50IHByZXNzX2NhcHR1cmVfc2FtcGxlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXNpemVfdCByYXdfbGVuLCBjaGFyICpyYXdfZGF0YSwKKwkJCQl2b2lkICpwcml2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwcml2KTsKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAodXNhZ2VfaWQpIHsKKwljYXNlIEhJRF9VU0FHRV9TRU5TT1JfQVRNT1NQSEVSSUNfUFJFU1NVUkU6CisJCXByZXNzX3N0YXRlLT5wcmVzc19kYXRhID0gKih1MzIgKilyYXdfZGF0YTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogUGFyc2UgcmVwb3J0IHdoaWNoIGlzIHNwZWNpZmljIHRvIGFuIHVzYWdlIGlkKi8KK3N0YXRpYyBpbnQgcHJlc3NfcGFyc2VfcmVwb3J0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLAorCQkJCXVuc2lnbmVkIHVzYWdlX2lkLAorCQkJCXN0cnVjdCBwcmVzc19zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKworCXJldCA9IHNlbnNvcl9odWJfaW5wdXRfZ2V0X2F0dHJpYnV0ZV9pbmZvKGhzZGV2LCBISURfSU5QVVRfUkVQT1JULAorCQkJdXNhZ2VfaWQsCisJCQlISURfVVNBR0VfU0VOU09SX0FUTU9TUEhFUklDX1BSRVNTVVJFLAorCQkJJnN0LT5wcmVzc19hdHRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlwcmVzc19hZGp1c3RfY2hhbm5lbF9iaXRfbWFzayhjaGFubmVscywgQ0hBTk5FTF9TQ0FOX0lOREVYX1BSRVNTVVJFLAorCQkJCQlzdC0+cHJlc3NfYXR0ci5zaXplKTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgInByZXNzICV4OiV4XG4iLCBzdC0+cHJlc3NfYXR0ci5pbmRleCwKKwkJCXN0LT5wcmVzc19hdHRyLnJlcG9ydF9pZCk7CisKKwkvKiBTZXQgU2Vuc2l0aXZpdHkgZmllbGQgaWRzLCB3aGVuIHRoZXJlIGlzIG5vIGluZGl2aWR1YWwgbW9kaWZpZXIgKi8KKwlpZiAoc3QtPmNvbW1vbl9hdHRyaWJ1dGVzLnNlbnNpdGl2aXR5LmluZGV4IDwgMCkgeworCQlzZW5zb3JfaHViX2lucHV0X2dldF9hdHRyaWJ1dGVfaW5mbyhoc2RldiwKKwkJCUhJRF9GRUFUVVJFX1JFUE9SVCwgdXNhZ2VfaWQsCisJCQlISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMgfAorCQkJSElEX1VTQUdFX1NFTlNPUl9EQVRBX0FUTU9TUEhFUklDX1BSRVNTVVJFLAorCQkJJnN0LT5jb21tb25fYXR0cmlidXRlcy5zZW5zaXRpdml0eSk7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIlNlbnNpdGl2aXR5IGluZGV4OnJlcG9ydCAlZDolZFxuIiwKKwkJCXN0LT5jb21tb25fYXR0cmlidXRlcy5zZW5zaXRpdml0eS5pbmRleCwKKwkJCXN0LT5jb21tb25fYXR0cmlidXRlcy5zZW5zaXRpdml0eS5yZXBvcnRfaWQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBGdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBwcm9jZXNzaW5nIGZvciB1c2FnZSBpZCAqLworc3RhdGljIGludCBoaWRfcHJlc3NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICJwcmVzcyI7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlOworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBwcmVzc19zdGF0ZSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmRpb19kZXYpOworCisJcHJlc3Nfc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5oc2RldiA9IGhzZGV2OworCXByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5wZGV2ID0gcGRldjsKKworCXJldCA9IGhpZF9zZW5zb3JfcGFyc2VfY29tbW9uX2F0dHJpYnV0ZXMoaHNkZXYsCisJCQkJCUhJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsCisJCQkJCSZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGNvbW1vbiBhdHRyaWJ1dGVzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljaGFubmVscyA9IGttZW1kdXAocHJlc3NfY2hhbm5lbHMsIHNpemVvZihwcmVzc19jaGFubmVscyksIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbHMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGR1cGxpY2F0ZSBjaGFubmVsc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IHByZXNzX3BhcnNlX3JlcG9ydChwZGV2LCBoc2RldiwgY2hhbm5lbHMsCisJCQkJSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwgcHJlc3Nfc3RhdGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGF0dHJpYnV0ZXNcbiIpOworCQlnb3RvIGVycm9yX2ZyZWVfZGV2X21lbTsKKwl9CisKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPQorCQkJCUFSUkFZX1NJWkUocHJlc3NfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJnByZXNzX2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsICZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKKwkJTlVMTCwgTlVMTCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0cmlnZ2VyIGJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9kZXZfbWVtOworCX0KKwlwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuZGF0YV9yZWFkeSA9IGZhbHNlOworCXJldCA9IGhpZF9zZW5zb3Jfc2V0dXBfdHJpZ2dlcihpbmRpb19kZXYsIG5hbWUsCisJCQkJJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0cmlnZ2VyIHNldHVwIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfYnVmZmVyX2Z1bmNzOworCX0KKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCX0KKworCXByZXNzX3N0YXRlLT5jYWxsYmFja3Muc2VuZF9ldmVudCA9IHByZXNzX3Byb2NfZXZlbnQ7CisJcHJlc3Nfc3RhdGUtPmNhbGxiYWNrcy5jYXB0dXJlX3NhbXBsZSA9IHByZXNzX2NhcHR1cmVfc2FtcGxlOworCXByZXNzX3N0YXRlLT5jYWxsYmFja3MucGRldiA9IHBkZXY7CisJcmV0ID0gc2Vuc29yX2h1Yl9yZWdpc3Rlcl9jYWxsYmFjayhoc2RldiwgSElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwKKwkJCQkJJnByZXNzX3N0YXRlLT5jYWxsYmFja3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbGxiYWNrIHJlZyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2lpb191bnJlZzsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9paW9fdW5yZWc6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwloaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKCZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworZXJyb3JfdW5yZWdfYnVmZmVyX2Z1bmNzOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2X21lbToKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBGdW5jdGlvbiB0byBkZWluaXRpYWxpemUgdGhlIHByb2Nlc3NpbmcgZm9yIHVzYWdlIGlkICovCitzdGF0aWMgaW50IGhpZF9wcmVzc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcHJlc3Nfc3RhdGUgKnByZXNzX3N0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXNlbnNvcl9odWJfcmVtb3ZlX2NhbGxiYWNrKGhzZGV2LCBISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwloaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKCZwcmVzc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBoaWRfcHJlc3NfaWRzW10gPSB7CisJeworCQkvKiBGb3JtYXQ6IEhJRC1TRU5TT1ItdXNhZ2VfaWRfaW5faGV4X2xvd2VyY2FzZSAqLworCQkubmFtZSA9ICJISUQtU0VOU09SLTIwMDAzMSIsCisJfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBoaWRfcHJlc3NfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGlkX3ByZXNzX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBoaWRfcHJlc3NfaWRzLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gS0JVSUxEX01PRE5BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGhpZF9wcmVzc19wcm9iZSwKKwkucmVtb3ZlCQk9IGhpZF9wcmVzc19yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoaWRfcHJlc3NfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJISUQgU2Vuc29yIFByZXNzdXJlIik7CitNT0RVTEVfQVVUSE9SKCJBcmNoYW5hIFBhdG5pIDxhcmNoYW5hLnBhdG5pQGludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21wbDMxMTUuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21wbDMxMTUuYwppbmRleCBhYzhjOGFiLi5iYTZkMGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9tcGwzMTE1LmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvbXBsMzExNS5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQogewogCXN0cnVjdCBtcGwzMTE1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXMzMiB0bXAgPSAwOworCV9fYmUzMiB0bXAgPSAwOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKG1hc2spIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlLmggYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZS5oCmluZGV4IDA0OWMyMWEuLjI0Mjk0M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlLmgKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmUuaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lpby9jb21tb24vc3Rfc2Vuc29ycy5oPgogCiAjZGVmaW5lIExQUzAwMVdQX1BSRVNTX0RFVl9OQU1FCQkibHBzMDAxd3AiCisjZGVmaW5lIExQUzI1SF9QUkVTU19ERVZfTkFNRQkJImxwczI1aCIKICNkZWZpbmUgTFBTMzMxQVBfUFJFU1NfREVWX05BTUUJCSJscHMzMzFhcCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9jb3JlLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9zdF9wcmVzc3VyZV9jb3JlLmMKaW5kZXggNTgwODNmOS4uNzQxODc2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX2NvcmUuYwpAQCAtNDAsNiArNDAsOSBAQAogLyogRlVMTFNDQUxFICovCiAjZGVmaW5lIFNUX1BSRVNTX0ZTX0FWTF8xMjYwTUIJCQkxMjYwCiAKKyNkZWZpbmUgU1RfUFJFU1NfMV9PVVRfWExfQUREUgkJCTB4MjgKKyNkZWZpbmUgU1RfVEVNUF8xX09VVF9MX0FERFIJCQkweDJiCisKIC8qIENVU1RPTSBWQUxVRVMgRk9SIExQUzMzMUFQIFNFTlNPUiAqLwogI2RlZmluZSBTVF9QUkVTU19MUFMzMzFBUF9XQUlfRVhQCQkweGJiCiAjZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX09EUl9BRERSCQkweDIwCkBAIC02Miw4ICs2NSw2IEBACiAjZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX0RSRFlfSVJRX0lOVDJfTUFTSwkweDIwCiAjZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX01VTFRJUkVBRF9CSVQJCXRydWUKICNkZWZpbmUgU1RfUFJFU1NfTFBTMzMxQVBfVEVNUF9PRkZTRVQJCTQyNTAwCi0jZGVmaW5lIFNUX1BSRVNTX0xQUzMzMUFQX09VVF9YTF9BRERSCQkweDI4Ci0jZGVmaW5lIFNUX1RFTVBfTFBTMzMxQVBfT1VUX0xfQUREUgkJMHgyYgogCiAvKiBDVVNUT00gVkFMVUVTIEZPUiBMUFMwMDFXUCBTRU5TT1IgKi8KICNkZWZpbmUgU1RfUFJFU1NfTFBTMDAxV1BfV0FJX0VYUAkJMHhiYQpAQCAtODAsMTEgKzgxLDM2IEBACiAjZGVmaW5lIFNUX1BSRVNTX0xQUzAwMVdQX09VVF9MX0FERFIJCTB4MjgKICNkZWZpbmUgU1RfVEVNUF9MUFMwMDFXUF9PVVRfTF9BRERSCQkweDJhCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzdF9wcmVzc19scHMzMzFhcF9jaGFubmVsc1tdID0geworLyogQ1VTVE9NIFZBTFVFUyBGT1IgTFBTMjVIIFNFTlNPUiAqLworI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfV0FJX0VYUAkJCTB4YmQKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09EUl9BRERSCQkweDIwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9PRFJfTUFTSwkJMHg3MAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfT0RSX0FWTF8xSFpfVkFMCQkweDAxCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzdIWl9WQUwJCTB4MDIKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09EUl9BVkxfMTNIWl9WQUwJMHgwMworI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfT0RSX0FWTF8yNUhaX1ZBTAkweDA0CisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9QV19BRERSCQkJMHgyMAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfUFdfTUFTSwkJCTB4ODAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0ZTX0FERFIJCQkweDAwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9GU19NQVNLCQkJMHgwMAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRlNfQVZMXzEyNjBfVkFMCQkweDAwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfMTI2MF9HQUlOCVNUX1BSRVNTX0tQQVNDQUxfTkFOT19TQ0FMRQorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRlNfQVZMX1RFTVBfR0FJTglTVF9QUkVTU19DRUxTSVVTX05BTk9fU0NBTEUKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0JEVV9BRERSCQkweDIwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9CRFVfTUFTSwkJMHgwNAorI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfQUREUgkJMHgyMworI2RlZmluZSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfSU5UMV9NQVNLCTB4MDEKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX0RSRFlfSVJRX0lOVDJfTUFTSwkweDEwCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9NVUxUSVJFQURfQklUCQl0cnVlCisjZGVmaW5lIFNUX1BSRVNTX0xQUzI1SF9URU1QX09GRlNFVAkJNDI1MDAKKyNkZWZpbmUgU1RfUFJFU1NfTFBTMjVIX09VVF9YTF9BRERSCQkweDI4CisjZGVmaW5lIFNUX1RFTVBfTFBTMjVIX09VVF9MX0FERFIJCTB4MmIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0X3ByZXNzXzFfY2hhbm5lbHNbXSA9IHsKIAl7CiAJCS50eXBlID0gSUlPX1BSRVNTVVJFLAogCQkuY2hhbm5lbDIgPSBJSU9fTk9fTU9ELAotCQkuYWRkcmVzcyA9IFNUX1BSRVNTX0xQUzMzMUFQX09VVF9YTF9BRERSLAorCQkuYWRkcmVzcyA9IFNUX1BSRVNTXzFfT1VUX1hMX0FERFIsCiAJCS5zY2FuX2luZGV4ID0gU1RfU0VOU09SU19TQ0FOX1gsCiAJCS5zY2FuX3R5cGUgPSB7CiAJCQkuc2lnbiA9ICd1JywKQEAgLTk5LDcgKzEyNSw3IEBACiAJewogCQkudHlwZSA9IElJT19URU1QLAogCQkuY2hhbm5lbDIgPSBJSU9fTk9fTU9ELAotCQkuYWRkcmVzcyA9IFNUX1RFTVBfTFBTMzMxQVBfT1VUX0xfQUREUiwKKwkJLmFkZHJlc3MgPSBTVF9URU1QXzFfT1VUX0xfQUREUiwKIAkJLnNjYW5faW5kZXggPSAtMSwKIAkJLnNjYW5fdHlwZSA9IHsKIAkJCS5zaWduID0gJ3UnLApAQCAtMTU2LDggKzE4Miw4IEBACiAJCS5zZW5zb3JzX3N1cHBvcnRlZCA9IHsKIAkJCVswXSA9IExQUzMzMUFQX1BSRVNTX0RFVl9OQU1FLAogCQl9LAotCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9wcmVzc19scHMzMzFhcF9jaGFubmVscywKLQkJLm51bV9jaCA9IEFSUkFZX1NJWkUoc3RfcHJlc3NfbHBzMzMxYXBfY2hhbm5lbHMpLAorCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9wcmVzc18xX2NoYW5uZWxzLAorCQkubnVtX2NoID0gQVJSQVlfU0laRShzdF9wcmVzc18xX2NoYW5uZWxzKSwKIAkJLm9kciA9IHsKIAkJCS5hZGRyID0gU1RfUFJFU1NfTFBTMzMxQVBfT0RSX0FERFIsCiAJCQkubWFzayA9IFNUX1BSRVNTX0xQUzMzMUFQX09EUl9NQVNLLApAQCAtMjMzLDYgKzI1OSw1MyBAQAogCQkubXVsdGlfcmVhZF9iaXQgPSBTVF9QUkVTU19MUFMwMDFXUF9NVUxUSVJFQURfQklULAogCQkuYm9vdGltZSA9IDIsCiAJfSwKKwl7CisJCS53YWkgPSBTVF9QUkVTU19MUFMyNUhfV0FJX0VYUCwKKwkJLnNlbnNvcnNfc3VwcG9ydGVkID0geworCQkJWzBdID0gTFBTMjVIX1BSRVNTX0RFVl9OQU1FLAorCQl9LAorCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9wcmVzc18xX2NoYW5uZWxzLAorCQkubnVtX2NoID0gQVJSQVlfU0laRShzdF9wcmVzc18xX2NoYW5uZWxzKSwKKwkJLm9kciA9IHsKKwkJCS5hZGRyID0gU1RfUFJFU1NfTFBTMjVIX09EUl9BRERSLAorCQkJLm1hc2sgPSBTVF9QUkVTU19MUFMyNUhfT0RSX01BU0ssCisJCQkub2RyX2F2bCA9IHsKKwkJCQl7IDEsIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzFIWl9WQUwsIH0sCisJCQkJeyA3LCBTVF9QUkVTU19MUFMyNUhfT0RSX0FWTF83SFpfVkFMLCB9LAorCQkJCXsgMTMsIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzEzSFpfVkFMLCB9LAorCQkJCXsgMjUsIFNUX1BSRVNTX0xQUzI1SF9PRFJfQVZMXzI1SFpfVkFMLCB9LAorCQkJfSwKKwkJfSwKKwkJLnB3ID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfUFdfQUREUiwKKwkJCS5tYXNrID0gU1RfUFJFU1NfTFBTMjVIX1BXX01BU0ssCisJCQkudmFsdWVfb24gPSBTVF9TRU5TT1JTX0RFRkFVTFRfUE9XRVJfT05fVkFMVUUsCisJCQkudmFsdWVfb2ZmID0gU1RfU0VOU09SU19ERUZBVUxUX1BPV0VSX09GRl9WQUxVRSwKKwkJfSwKKwkJLmZzID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfRlNfQUREUiwKKwkJCS5tYXNrID0gU1RfUFJFU1NfTFBTMjVIX0ZTX01BU0ssCisJCQkuZnNfYXZsID0geworCQkJCVswXSA9IHsKKwkJCQkJLm51bSA9IFNUX1BSRVNTX0ZTX0FWTF8xMjYwTUIsCisJCQkJCS52YWx1ZSA9IFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfMTI2MF9WQUwsCisJCQkJCS5nYWluID0gU1RfUFJFU1NfTFBTMjVIX0ZTX0FWTF8xMjYwX0dBSU4sCisJCQkJCS5nYWluMiA9IFNUX1BSRVNTX0xQUzI1SF9GU19BVkxfVEVNUF9HQUlOLAorCQkJCX0sCisJCQl9LAorCQl9LAorCQkuYmR1ID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfQkRVX0FERFIsCisJCQkubWFzayA9IFNUX1BSRVNTX0xQUzI1SF9CRFVfTUFTSywKKwkJfSwKKwkJLmRyZHlfaXJxID0geworCQkJLmFkZHIgPSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfQUREUiwKKwkJCS5tYXNrX2ludDEgPSBTVF9QUkVTU19MUFMyNUhfRFJEWV9JUlFfSU5UMV9NQVNLLAorCQkJLm1hc2tfaW50MiA9IFNUX1BSRVNTX0xQUzI1SF9EUkRZX0lSUV9JTlQyX01BU0ssCisJCX0sCisJCS5tdWx0aV9yZWFkX2JpdCA9IFNUX1BSRVNTX0xQUzI1SF9NVUxUSVJFQURfQklULAorCQkuYm9vdGltZSA9IDIsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgc3RfcHJlc3NfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX2kyYy5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfaTJjLmMKaW5kZXggNTFlYWI3Zi4uM2NkNzNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfaTJjLmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfaTJjLmMKQEAgLTUwLDYgKzUwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHN0X3ByZXNzX2lkX3RhYmxlW10gPSB7CiAJeyBMUFMwMDFXUF9QUkVTU19ERVZfTkFNRSB9LAorCXsgTFBTMjVIX1BSRVNTX0RFVl9OQU1FIH0sCiAJeyBMUFMzMzFBUF9QUkVTU19ERVZfTkFNRSB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3N0X3ByZXNzdXJlX3NwaS5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfc3BpLmMKaW5kZXggMjczMjJhZi4uZjQ1ZDQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfc3BpLmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvc3RfcHJlc3N1cmVfc3BpLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHN0X3ByZXNzX2lkX3RhYmxlW10gPSB7CiAJeyBMUFMwMDFXUF9QUkVTU19ERVZfTkFNRSB9LAorCXsgTFBTMjVIX1BSRVNTX0RFVl9OQU1FIH0sCiAJeyBMUFMzMzFBUF9QUkVTU19ERVZfTkFNRSB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwppbmRleCBhMDZlMTI1Li5jZTk1M2Q4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCkBAIC05NTQsMTEgKzk1NCwxMyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJZXJyb3IgPSBpbnB1dF9mZl91cGxvYWQoZGV2LCAmZWZmZWN0LCBmaWxlKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOwogCiAJCWlmIChwdXRfdXNlcihlZmZlY3QuaWQsICYoKChzdHJ1Y3QgZmZfZWZmZWN0IF9fdXNlciAqKXApLT5pZCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJcmV0dXJuIGVycm9yOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBNdWx0aS1udW1iZXIgdmFyaWFibGUtbGVuZ3RoIGhhbmRsZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYwppbmRleCBiYjNiNTdiLi41ZWY3ZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OC1rZXlzLmMKQEAgLTc2LDggKzc2LDE4IEBACiAJc3RydWN0IGFkcDU1ODhfa3BhZCAqa3BhZCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYWRwNTU4OF9rcGFkLCBnYyk7CiAJdW5zaWduZWQgaW50IGJhbmsgPSBBRFA1NTg4X0JBTksoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKIAl1bnNpZ25lZCBpbnQgYml0ID0gQURQNTU4OF9CSVQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwlpbnQgdmFsOwogCi0JcmV0dXJuICEhKGFkcDU1ODhfcmVhZChrcGFkLT5jbGllbnQsIEdQSU9fREFUX1NUQVQxICsgYmFuaykgJiBiaXQpOworCW11dGV4X2xvY2soJmtwYWQtPmdwaW9fbG9jayk7CisKKwlpZiAoa3BhZC0+ZGlyW2JhbmtdICYgYml0KQorCQl2YWwgPSBrcGFkLT5kYXRfb3V0W2JhbmtdOworCWVsc2UKKwkJdmFsID0gYWRwNTU4OF9yZWFkKGtwYWQtPmNsaWVudCwgR1BJT19EQVRfU1RBVDEgKyBiYW5rKTsKKworCW11dGV4X3VubG9jaygma3BhZC0+Z3Bpb19sb2NrKTsKKworCXJldHVybiAhISh2YWwgJiBiaXQpOwogfQogCiBzdGF0aWMgdm9pZCBhZHA1NTg4X2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvZGE5MDUyX29ua2V5LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvZGE5MDUyX29ua2V5LmMKaW5kZXggMWY2OTVmMi4uMTg0YzhmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2RhOTA1Ml9vbmtleS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9kYTkwNTJfb25rZXkuYwpAQCAtMjcsMjkgKzI3LDMyIEBACiAKIHN0YXRpYyB2b2lkIGRhOTA1Ml9vbmtleV9xdWVyeShzdHJ1Y3QgZGE5MDUyX29ua2V5ICpvbmtleSkKIHsKLQlpbnQga2V5X3N0YXQ7CisJaW50IHJldDsKIAotCWtleV9zdGF0ID0gZGE5MDUyX3JlZ19yZWFkKG9ua2V5LT5kYTkwNTIsIERBOTA1Ml9FVkVOVF9CX1JFRyk7Ci0JaWYgKGtleV9zdGF0IDwgMCkgeworCXJldCA9IGRhOTA1Ml9yZWdfcmVhZChvbmtleS0+ZGE5MDUyLCBEQTkwNTJfU1RBVFVTX0FfUkVHKTsKKwlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKG9ua2V5LT5kYTkwNTItPmRldiwKLQkJCSJGYWlsZWQgdG8gcmVhZCBvbmtleSBldmVudCAlZFxuIiwga2V5X3N0YXQpOworCQkJIkZhaWxlZCB0byByZWFkIG9ua2V5IGV2ZW50IGVycj0lZFxuIiwgcmV0KTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBTaW5jZSBpbnRlcnJ1cHQgZm9yIGRlYXNzZXJ0aW9uIG9mIE9OS0VZIHBpbiBpcyBub3QKIAkJICogZ2VuZXJhdGVkLCBvbmtleSBldmVudCBzdGF0ZSBkZXRlcm1pbmVzIHRoZSBvbmtleQogCQkgKiBidXR0b24gc3RhdGUuCiAJCSAqLwotCQlrZXlfc3RhdCAmPSBEQTkwNTJfRVZFTlRCX0VOT05LRVk7Ci0JCWlucHV0X3JlcG9ydF9rZXkob25rZXktPmlucHV0LCBLRVlfUE9XRVIsIGtleV9zdGF0KTsKLQkJaW5wdXRfc3luYyhvbmtleS0+aW5wdXQpOwotCX0KKwkJYm9vbCBwcmVzc2VkID0gIShyZXQgJiBEQTkwNTJfU1RBVFVTQV9OT05LRVkpOwogCi0JLyoKLQkgKiBJbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIG9ubHkgd2hlbiB0aGUgT05LRVkgcGluIGlzIGFzc2VydGVkLgotCSAqIEhlbmNlIHRoZSBkZWFzc2VydGlvbiBvZiB0aGUgcGluIGlzIHNpbXVsYXRlZCB0aHJvdWdoIHdvcmsgcXVldWUuCi0JICovCi0JaWYgKGtleV9zdGF0KQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm9ua2V5LT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDUwKSk7CisJCWlucHV0X3JlcG9ydF9rZXkob25rZXktPmlucHV0LCBLRVlfUE9XRVIsIHByZXNzZWQpOworCQlpbnB1dF9zeW5jKG9ua2V5LT5pbnB1dCk7CisKKwkJLyoKKwkJICogSW50ZXJydXB0IGlzIGdlbmVyYXRlZCBvbmx5IHdoZW4gdGhlIE9OS0VZIHBpbgorCQkgKiBpcyBhc3NlcnRlZC4gIEhlbmNlIHRoZSBkZWFzc2VydGlvbiBvZiB0aGUgcGluCisJCSAqIGlzIHNpbXVsYXRlZCB0aHJvdWdoIHdvcmsgcXVldWUuCisJCSAqLworCQlpZiAocHJlc3NlZCkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmb25rZXktPndvcmssCisJCQkJCQltc2Vjc190b19qaWZmaWVzKDUwKSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBkYTkwNTJfb25rZXlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2N5cHJlc3NfcHMyLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2N5cHJlc3NfcHMyLmMKaW5kZXggODcwOTVlMi4uOGFmMzRmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9jeXByZXNzX3BzMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvY3lwcmVzc19wczIuYwpAQCAtNDA5LDcgKzQwOSw2IEBACiAJX19jbGVhcl9iaXQoUkVMX1gsIGlucHV0LT5yZWxiaXQpOwogCV9fY2xlYXJfYml0KFJFTF9ZLCBpbnB1dC0+cmVsYml0KTsKIAotCV9fc2V0X2JpdChJTlBVVF9QUk9QX0JVVFRPTlBBRCwgaW5wdXQtPnByb3BiaXQpOwogCV9fc2V0X2JpdChFVl9LRVksIGlucHV0LT5ldmJpdCk7CiAJX19zZXRfYml0KEJUTl9MRUZULCBpbnB1dC0+a2V5Yml0KTsKIAlfX3NldF9iaXQoQlROX1JJR0hULCBpbnB1dC0+a2V5Yml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCmluZGV4IDI2Mzg2ZjkuLmQ4ZDQ5ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwpAQCAtMjY1LDExICsyNjUsMjIgQEAKICAqIFJlYWQgdG91Y2hwYWQgcmVzb2x1dGlvbiBhbmQgbWF4aW11bSByZXBvcnRlZCBjb29yZGluYXRlcwogICogUmVzb2x1dGlvbiBpcyBsZWZ0IHplcm8gaWYgdG91Y2hwYWQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcXVlcnkKICAqLworCitzdGF0aWMgY29uc3QgaW50ICpxdWlya19taW5fbWF4OworCiBzdGF0aWMgaW50IHN5bmFwdGljc19yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CiAJdW5zaWduZWQgY2hhciByZXNwWzNdOwogCisJaWYgKHF1aXJrX21pbl9tYXgpIHsKKwkJcHJpdi0+eF9taW4gPSBxdWlya19taW5fbWF4WzBdOworCQlwcml2LT54X21heCA9IHF1aXJrX21pbl9tYXhbMV07CisJCXByaXYtPnlfbWluID0gcXVpcmtfbWluX21heFsyXTsKKwkJcHJpdi0+eV9tYXggPSBxdWlya19taW5fbWF4WzNdOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoU1lOX0lEX01BSk9SKHByaXYtPmlkZW50aXR5KSA8IDQpCiAJCXJldHVybiAwOwogCkBAIC0xNDg1LDEwICsxNDk2LDU0IEBACiAJeyB9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgbWluX21heF9kbWlfdGFibGVbXSBfX2luaXRjb25zdCA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19ETUkpCisJeworCQkvKiBMZW5vdm8gVGhpbmtQYWQgSGVsaXggKi8KKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJMRU5PVk8iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiVGhpbmtQYWQgSGVsaXgiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKGludCBbXSl7MTAyNCwgNTA1MiwgMjI1OCwgNDgzMn0sCisJfSwKKwl7CisJCS8qIExlbm92byBUaGlua1BhZCBYMjQwICovCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTEVOT1ZPIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIlRoaW5rUGFkIFgyNDAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKGludCBbXSl7MTIzMiwgNTcxMCwgMTE1NiwgNDY5Nn0sCisJfSwKKwl7CisJCS8qIExlbm92byBUaGlua1BhZCBUNDQwcyAqLworCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkxFTk9WTyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJUaGlua1BhZCBUNDQwIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9IChpbnQgW10pezEwMjQsIDUxMTIsIDIwMjQsIDQ4MzJ9LAorCX0sCisJeworCQkvKiBMZW5vdm8gVGhpbmtQYWQgVDU0MHAgKi8KKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJMRU5PVk8iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiVGhpbmtQYWQgVDU0MCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAoaW50IFtdKXsxMDI0LCA1MDU2LCAyMDU4LCA0ODMyfSwKKwl9LAorI2VuZGlmCisJeyB9Cit9OworCiB2b2lkIF9faW5pdCBzeW5hcHRpY3NfbW9kdWxlX2luaXQodm9pZCkKIHsKKwljb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqbWluX21heF9kbWk7CisKIAlpbXBhaXJlZF90b3NoaWJhX2tiYyA9IGRtaV9jaGVja19zeXN0ZW0odG9zaGliYV9kbWlfdGFibGUpOwogCWJyb2tlbl9vbHBjX2VjID0gZG1pX2NoZWNrX3N5c3RlbShvbHBjX2RtaV90YWJsZSk7CisKKwltaW5fbWF4X2RtaSA9IGRtaV9maXJzdF9tYXRjaChtaW5fbWF4X2RtaV90YWJsZSk7CisJaWYgKG1pbl9tYXhfZG1pKQorCQlxdWlya19taW5fbWF4ID0gbWluX21heF9kbWktPmRyaXZlcl9kYXRhOwogfQogCiBzdGF0aWMgaW50IF9fc3luYXB0aWNzX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGJvb2wgYWJzb2x1dGVfbW9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwppbmRleCA0Yzg0MmMzLi5iNjA0NTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCkBAIC02Nyw3ICs2Nyw2IEBACiAJc3RydWN0IGRldmljZSBkZXY7CiAJc3RydWN0IGNkZXYgY2RldjsKIAlib29sIGV4aXN0OwotCWJvb2wgaXNfbWl4ZGV2OwogCiAJc3RydWN0IGxpc3RfaGVhZCBtaXhkZXZfbm9kZTsKIAlib29sIG9wZW5lZF9ieV9taXhkZXY7CkBAIC03Nyw2ICs3Niw5IEBACiAJaW50IG9sZF94WzRdLCBvbGRfeVs0XTsKIAlpbnQgZnJhY19keCwgZnJhY19keTsKIAl1bnNpZ25lZCBsb25nIHRvdWNoOworCisJaW50ICgqb3Blbl9kZXZpY2UpKHN0cnVjdCBtb3VzZWRldiAqbW91c2VkZXYpOworCXZvaWQgKCpjbG9zZV9kZXZpY2UpKHN0cnVjdCBtb3VzZWRldiAqbW91c2VkZXYpOwogfTsKIAogZW51bSBtb3VzZWRldl9lbXVsIHsKQEAgLTExNiw5ICsxMTgsNiBAQAogc3RhdGljIHN0cnVjdCBtb3VzZWRldiAqbW91c2VkZXZfbWl4Owogc3RhdGljIExJU1RfSEVBRChtb3VzZWRldl9taXhfbGlzdCk7CiAKLXN0YXRpYyB2b2lkIG1peGRldl9vcGVuX2RldmljZXModm9pZCk7Ci1zdGF0aWMgdm9pZCBtaXhkZXZfY2xvc2VfZGV2aWNlcyh2b2lkKTsKLQogI2RlZmluZSBmeChpKSAgKG1vdXNlZGV2LT5vbGRfeFsobW91c2VkZXYtPnBrdF9jb3VudCAtIChpKSkgJiAwM10pCiAjZGVmaW5lIGZ5KGkpICAobW91c2VkZXYtPm9sZF95Wyhtb3VzZWRldi0+cGt0X2NvdW50IC0gKGkpKSAmIDAzXSkKIApAQCAtNDI4LDkgKzQyNyw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWlmIChtb3VzZWRldi0+aXNfbWl4ZGV2KQotCQltaXhkZXZfb3Blbl9kZXZpY2VzKCk7Ci0JZWxzZSBpZiAoIW1vdXNlZGV2LT5leGlzdCkKKwlpZiAoIW1vdXNlZGV2LT5leGlzdCkKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAllbHNlIGlmICghbW91c2VkZXYtPm9wZW4rKykgewogCQlyZXR2YWwgPSBpbnB1dF9vcGVuX2RldmljZSgmbW91c2VkZXYtPmhhbmRsZSk7CkBAIC00NDYsOSArNDQzLDcgQEAKIHsKIAltdXRleF9sb2NrKCZtb3VzZWRldi0+bXV0ZXgpOwogCi0JaWYgKG1vdXNlZGV2LT5pc19taXhkZXYpCi0JCW1peGRldl9jbG9zZV9kZXZpY2VzKCk7Ci0JZWxzZSBpZiAobW91c2VkZXYtPmV4aXN0ICYmICEtLW1vdXNlZGV2LT5vcGVuKQorCWlmIChtb3VzZWRldi0+ZXhpc3QgJiYgIS0tbW91c2VkZXYtPm9wZW4pCiAJCWlucHV0X2Nsb3NlX2RldmljZSgmbW91c2VkZXYtPmhhbmRsZSk7CiAKIAltdXRleF91bmxvY2soJm1vdXNlZGV2LT5tdXRleCk7CkBAIC00NTksMjEgKzQ1NCwyOSBAQAogICogc3RyZWFtLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBtb3VzZWRldl9taXgtPm11dGV4CiAgKiBoZWxkLgogICovCi1zdGF0aWMgdm9pZCBtaXhkZXZfb3Blbl9kZXZpY2VzKHZvaWQpCitzdGF0aWMgaW50IG1peGRldl9vcGVuX2RldmljZXMoc3RydWN0IG1vdXNlZGV2ICptaXhkZXYpCiB7Ci0Jc3RydWN0IG1vdXNlZGV2ICptb3VzZWRldjsKKwlpbnQgZXJyb3I7CiAKLQlpZiAobW91c2VkZXZfbWl4LT5vcGVuKyspCi0JCXJldHVybjsKKwllcnJvciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbWl4ZGV2LT5tdXRleCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vdXNlZGV2LCAmbW91c2VkZXZfbWl4X2xpc3QsIG1peGRldl9ub2RlKSB7Ci0JCWlmICghbW91c2VkZXYtPm9wZW5lZF9ieV9taXhkZXYpIHsKLQkJCWlmIChtb3VzZWRldl9vcGVuX2RldmljZShtb3VzZWRldikpCi0JCQkJY29udGludWU7CisJaWYgKCFtaXhkZXYtPm9wZW4rKykgeworCQlzdHJ1Y3QgbW91c2VkZXYgKm1vdXNlZGV2OwogCi0JCQltb3VzZWRldi0+b3BlbmVkX2J5X21peGRldiA9IHRydWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobW91c2VkZXYsICZtb3VzZWRldl9taXhfbGlzdCwgbWl4ZGV2X25vZGUpIHsKKwkJCWlmICghbW91c2VkZXYtPm9wZW5lZF9ieV9taXhkZXYpIHsKKwkJCQlpZiAobW91c2VkZXZfb3Blbl9kZXZpY2UobW91c2VkZXYpKQorCQkJCQljb250aW51ZTsKKworCQkJCW1vdXNlZGV2LT5vcGVuZWRfYnlfbWl4ZGV2ID0gdHJ1ZTsKKwkJCX0KIAkJfQogCX0KKworCW11dGV4X3VubG9jaygmbWl4ZGV2LT5tdXRleCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00ODEsMTkgKzQ4NCwyMiBAQAogICogZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBtb3VzZWRldl9taXgtPm11dGV4CiAgKiBoZWxkLgogICovCi1zdGF0aWMgdm9pZCBtaXhkZXZfY2xvc2VfZGV2aWNlcyh2b2lkKQorc3RhdGljIHZvaWQgbWl4ZGV2X2Nsb3NlX2RldmljZXMoc3RydWN0IG1vdXNlZGV2ICptaXhkZXYpCiB7Ci0Jc3RydWN0IG1vdXNlZGV2ICptb3VzZWRldjsKKwltdXRleF9sb2NrKCZtaXhkZXYtPm11dGV4KTsKIAotCWlmICgtLW1vdXNlZGV2X21peC0+b3BlbikKLQkJcmV0dXJuOworCWlmICghLS1taXhkZXYtPm9wZW4pIHsKKwkJc3RydWN0IG1vdXNlZGV2ICptb3VzZWRldjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobW91c2VkZXYsICZtb3VzZWRldl9taXhfbGlzdCwgbWl4ZGV2X25vZGUpIHsKLQkJaWYgKG1vdXNlZGV2LT5vcGVuZWRfYnlfbWl4ZGV2KSB7Ci0JCQltb3VzZWRldi0+b3BlbmVkX2J5X21peGRldiA9IGZhbHNlOwotCQkJbW91c2VkZXZfY2xvc2VfZGV2aWNlKG1vdXNlZGV2KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtb3VzZWRldiwgJm1vdXNlZGV2X21peF9saXN0LCBtaXhkZXZfbm9kZSkgeworCQkJaWYgKG1vdXNlZGV2LT5vcGVuZWRfYnlfbWl4ZGV2KSB7CisJCQkJbW91c2VkZXYtPm9wZW5lZF9ieV9taXhkZXYgPSBmYWxzZTsKKwkJCQltb3VzZWRldl9jbG9zZV9kZXZpY2UobW91c2VkZXYpOworCQkJfQogCQl9CiAJfQorCisJbXV0ZXhfdW5sb2NrKCZtaXhkZXYtPm11dGV4KTsKIH0KIAogCkBAIC01MjIsNyArNTI4LDcgQEAKIAltb3VzZWRldl9kZXRhY2hfY2xpZW50KG1vdXNlZGV2LCBjbGllbnQpOwogCWtmcmVlKGNsaWVudCk7CiAKLQltb3VzZWRldl9jbG9zZV9kZXZpY2UobW91c2VkZXYpOworCW1vdXNlZGV2LT5jbG9zZV9kZXZpY2UobW91c2VkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTAsNyArNTU2LDcgQEAKIAljbGllbnQtPm1vdXNlZGV2ID0gbW91c2VkZXY7CiAJbW91c2VkZXZfYXR0YWNoX2NsaWVudChtb3VzZWRldiwgY2xpZW50KTsKIAotCWVycm9yID0gbW91c2VkZXZfb3Blbl9kZXZpY2UobW91c2VkZXYpOworCWVycm9yID0gbW91c2VkZXYtPm9wZW5fZGV2aWNlKG1vdXNlZGV2KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyX2ZyZWVfY2xpZW50OwogCkBAIC04NjEsMTYgKzg2NywyMSBAQAogCiAJaWYgKG1peGRldikgewogCQlkZXZfc2V0X25hbWUoJm1vdXNlZGV2LT5kZXYsICJtaWNlIik7CisKKwkJbW91c2VkZXYtPm9wZW5fZGV2aWNlID0gbWl4ZGV2X29wZW5fZGV2aWNlczsKKwkJbW91c2VkZXYtPmNsb3NlX2RldmljZSA9IG1peGRldl9jbG9zZV9kZXZpY2VzOwogCX0gZWxzZSB7CiAJCWludCBkZXZfbm8gPSBtaW5vcjsKIAkJLyogTm9ybWFsaXplIGRldmljZSBudW1iZXIgaWYgaXQgZmFsbHMgaW50byBsZWdhY3kgcmFuZ2UgKi8KIAkJaWYgKGRldl9ubyA8IE1PVVNFREVWX01JTk9SX0JBU0UgKyBNT1VTRURFVl9NSU5PUlMpCiAJCQlkZXZfbm8gLT0gTU9VU0VERVZfTUlOT1JfQkFTRTsKIAkJZGV2X3NldF9uYW1lKCZtb3VzZWRldi0+ZGV2LCAibW91c2UlZCIsIGRldl9ubyk7CisKKwkJbW91c2VkZXYtPm9wZW5fZGV2aWNlID0gbW91c2VkZXZfb3Blbl9kZXZpY2U7CisJCW1vdXNlZGV2LT5jbG9zZV9kZXZpY2UgPSBtb3VzZWRldl9jbG9zZV9kZXZpY2U7CiAJfQogCiAJbW91c2VkZXYtPmV4aXN0ID0gdHJ1ZTsKLQltb3VzZWRldi0+aXNfbWl4ZGV2ID0gbWl4ZGV2OwogCW1vdXNlZGV2LT5oYW5kbGUuZGV2ID0gaW5wdXRfZ2V0X2RldmljZShkZXYpOwogCW1vdXNlZGV2LT5oYW5kbGUubmFtZSA9IGRldl9uYW1lKCZtb3VzZWRldi0+ZGV2KTsKIAltb3VzZWRldi0+aGFuZGxlLmhhbmRsZXIgPSBoYW5kbGVyOwpAQCAtOTE5LDcgKzkzMCw3IEBACiAJZGV2aWNlX2RlbCgmbW91c2VkZXYtPmRldik7CiAJbW91c2VkZXZfY2xlYW51cChtb3VzZWRldik7CiAJaW5wdXRfZnJlZV9taW5vcihNSU5PUihtb3VzZWRldi0+ZGV2LmRldnQpKTsKLQlpZiAoIW1vdXNlZGV2LT5pc19taXhkZXYpCisJaWYgKG1vdXNlZGV2ICE9IG1vdXNlZGV2X21peCkKIAkJaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGUoJm1vdXNlZGV2LT5oYW5kbGUpOwogCXB1dF9kZXZpY2UoJm1vdXNlZGV2LT5kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaCBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3R5cGVzLmgKaW5kZXggZTQwMGZiZS4uY2ZmMDM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaAorKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBJT01NVXMgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUgYi9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKaW5kZXggNTE5NGFmYi4uMWMwYzE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQpAQCAtMTIsNiArMTIsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfTU9YQVJUKQkJKz0gaXJxLW1veGFydC5vCiBvYmotJChDT05GSUdfT1JJT05fSVJRQ0hJUCkJCSs9IGlycS1vcmlvbi5vCiBvYmotJChDT05GSUdfQVJDSF9TVU5YSSkJCSs9IGlycS1zdW40aS5vCitvYmotJChDT05GSUdfQVJDSF9TVU5YSSkJCSs9IGlycS1zdW54aS1ubWkubwogb2JqLSQoQ09ORklHX0FSQ0hfU1BFQVIzWFgpCQkrPSBzcGVhci1zaGlycS5vCiBvYmotJChDT05GSUdfQVJNX0dJQykJCQkrPSBpcnEtZ2ljLm8KIG9iai0kKENPTkZJR19BUk1fTlZJQykJCQkrPSBpcnEtbnZpYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWFybWFkYS0zNzAteHAuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCmluZGV4IDU0MDk1NjQuLjQxYmU4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KQEAgLTQyLDYgKzQzLDcgQEAKICNkZWZpbmUgQVJNQURBXzM3MF9YUF9JTlRfU09VUkNFX0NUTChpcnEpCSgweDEwMCArIGlycSo0KQogCiAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfQ1BVX0lOVEFDS19PRkZTCQkoMHg0NCkKKyNkZWZpbmUgQVJNQURBXzM3NV9QUElfQ0FVU0UJCQkoMHgxMCkKIAogI2RlZmluZSBBUk1BREFfMzcwX1hQX1NXX1RSSUdfSU5UX09GRlMgICAgICAgICAgICgweDQpCiAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfTVNLX09GRlMgICAgICAgICAgKDB4YykKQEAgLTM1Miw3ICszNTQsNjMgQEAKIAkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCiB9OwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeQorI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX2hhbmRsZV9tc2lfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBib29sIGlzX2NoYWluZWQpCit7CisJdTMyIG1zaW1hc2ssIG1zaW5yOworCisJbXNpbWFzayA9IHJlYWRsX3JlbGF4ZWQocGVyX2NwdV9pbnRfYmFzZSArCisJCQkJQVJNQURBXzM3MF9YUF9JTl9EUkJFTF9DQVVTRV9PRkZTKQorCQkmIFBDSV9NU0lfRE9PUkJFTExfTUFTSzsKKworCXdyaXRlbCh+bXNpbWFzaywgcGVyX2NwdV9pbnRfYmFzZSArCisJICAgICAgIEFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfQ0FVU0VfT0ZGUyk7CisKKwlmb3IgKG1zaW5yID0gUENJX01TSV9ET09SQkVMTF9TVEFSVDsKKwkgICAgIG1zaW5yIDwgUENJX01TSV9ET09SQkVMTF9FTkQ7IG1zaW5yKyspIHsKKwkJaW50IGlycTsKKworCQlpZiAoIShtc2ltYXNrICYgQklUKG1zaW5yKSkpCisJCQljb250aW51ZTsKKworCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGFybWFkYV8zNzBfeHBfbXNpX2RvbWFpbiwKKwkJCQkgICAgICAgbXNpbnIgLSAxNik7CisKKwkJaWYgKGlzX2NoYWluZWQpCisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKKwkJZWxzZQorCQkJaGFuZGxlX0lSUShpcnEsIHJlZ3MpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBhcm1hZGFfMzcwX3hwX2hhbmRsZV9tc2lfaXJxKHN0cnVjdCBwdF9yZWdzICpyLCBib29sIGIpIHt9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXJtYWRhXzM3MF94cF9tcGljX2hhbmRsZV9jYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgaXJxLAorCQkJCQkJICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJdW5zaWduZWQgbG9uZyBpcnFtYXAsIGlycW47CisJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisKKwlpcnFtYXAgPSByZWFkbF9yZWxheGVkKHBlcl9jcHVfaW50X2Jhc2UgKyBBUk1BREFfMzc1X1BQSV9DQVVTRSk7CisKKwlpZiAoaXJxbWFwICYgQklUKDApKSB7CisJCWFybWFkYV8zNzBfeHBfaGFuZGxlX21zaV9pcnEoTlVMTCwgdHJ1ZSk7CisJCWlycW1hcCAmPSB+QklUKDApOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaXJxbiwgJmlycW1hcCwgQklUU19QRVJfTE9ORykgeworCQljYXNjYWRlX2lycSA9IGlycV9maW5kX21hcHBpbmcoYXJtYWRhXzM3MF94cF9tcGljX2RvbWFpbiwgaXJxbik7CisJCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7CisJfQorCisJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKK30KKworc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5CiBhcm1hZGFfMzcwX3hwX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGlycXN0YXQsIGlycW5yOwpAQCAtMzcyLDMxICs0MzAsOSBAQAogCQkJY29udGludWU7CiAJCX0KIAotI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAJCS8qIE1TSSBoYW5kbGluZyAqLwotCQlpZiAoaXJxbnIgPT0gMSkgewotCQkJdTMyIG1zaW1hc2ssIG1zaW5yOwotCi0JCQltc2ltYXNrID0gcmVhZGxfcmVsYXhlZChwZXJfY3B1X2ludF9iYXNlICsKLQkJCQkJCUFSTUFEQV8zNzBfWFBfSU5fRFJCRUxfQ0FVU0VfT0ZGUykKLQkJCQkmIFBDSV9NU0lfRE9PUkJFTExfTUFTSzsKLQotCQkJd3JpdGVsKH5tc2ltYXNrLCBwZXJfY3B1X2ludF9iYXNlICsKLQkJCSAgICAgICBBUk1BREFfMzcwX1hQX0lOX0RSQkVMX0NBVVNFX09GRlMpOwotCi0JCQlmb3IgKG1zaW5yID0gUENJX01TSV9ET09SQkVMTF9TVEFSVDsKLQkJCSAgICAgbXNpbnIgPCBQQ0lfTVNJX0RPT1JCRUxMX0VORDsgbXNpbnIrKykgewotCQkJCWludCBpcnE7Ci0KLQkJCQlpZiAoIShtc2ltYXNrICYgQklUKG1zaW5yKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhhcm1hZGFfMzcwX3hwX21zaV9kb21haW4sCi0JCQkJCQkgICAgICAgbXNpbnIgLSAxNik7Ci0JCQkJaGFuZGxlX0lSUShpcnEsIHJlZ3MpOwotCQkJfQotCQl9Ci0jZW5kaWYKKwkJaWYgKGlycW5yID09IDEpCisJCQlhcm1hZGFfMzcwX3hwX2hhbmRsZV9tc2lfaXJxKHJlZ3MsIGZhbHNlKTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAkJLyogSVBJIEhhbmRsaW5nICovCkBAIC00MjcsNiArNDYzLDcgQEAKIAkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgbWFpbl9pbnRfcmVzLCBwZXJfY3B1X2ludF9yZXM7CisJaW50IHBhcmVudF9pcnE7CiAJdTMyIGNvbnRyb2w7CiAKIAlCVUdfT04ob2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmbWFpbl9pbnRfcmVzKSk7CkBAIC00NTUsOCArNDkyLDYgQEAKIAogCUJVR19PTighYXJtYWRhXzM3MF94cF9tcGljX2RvbWFpbik7CiAKLQlpcnFfc2V0X2RlZmF1bHRfaG9zdChhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluKTsKLQogI2lmZGVmIENPTkZJR19TTVAKIAlhcm1hZGFfeHBfbXBpY19zbXBfY3B1X2luaXQoKTsKIApAQCAtNDcyLDcgKzUwNywxNCBAQAogCiAJYXJtYWRhXzM3MF94cF9tc2lfaW5pdChub2RlLCBtYWluX2ludF9yZXMuc3RhcnQpOwogCi0Jc2V0X2hhbmRsZV9pcnEoYXJtYWRhXzM3MF94cF9oYW5kbGVfaXJxKTsKKwlwYXJlbnRfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJaWYgKHBhcmVudF9pcnEgPD0gMCkgeworCQlpcnFfc2V0X2RlZmF1bHRfaG9zdChhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluKTsKKwkJc2V0X2hhbmRsZV9pcnEoYXJtYWRhXzM3MF94cF9oYW5kbGVfaXJxKTsKKwl9IGVsc2UgeworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwYXJlbnRfaXJxLAorCQkJCQlhcm1hZGFfMzcwX3hwX21waWNfaGFuZGxlX2Nhc2NhZGVfaXJxKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYmNtMjgzNS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1iY20yODM1LmMKaW5kZXggMTY5M2I4ZS4uNTkxNmQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1iY20yODM1LmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1iY20yODM1LmMKQEAgLTk1LDcgKzk1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXJtY3RybF9pYyBpbnRjIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBiY20yODM1X2hhbmRsZV9pcnEoCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgYmNtMjgzNV9oYW5kbGVfaXJxKAogCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogc3RhdGljIHZvaWQgYXJtY3RybF9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCkBAIC0xOTYsNyArMTk2LDcgQEAKIAloYW5kbGVfSVJRKGlycV9saW5lYXJfcmV2bWFwKGludGMuZG9tYWluLCBpcnEpLCByZWdzKTsKIH0KIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgYmNtMjgzNV9oYW5kbGVfaXJxKAorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGJjbTI4MzVfaGFuZGxlX2lycSgKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgc3RhdCwgaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKaW5kZXggMzQxYzYwMS4uNTMxNzY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jCkBAIC01MCw3ICs1MCw3IEBACiAKIHVuaW9uIGdpY19iYXNlIHsKIAl2b2lkIF9faW9tZW0gKmNvbW1vbl9iYXNlOwotCXZvaWQgX19wZXJjcHUgX19pb21lbSAqKnBlcmNwdV9iYXNlOworCXZvaWQgX19wZXJjcHUgKiBfX2lvbWVtICpwZXJjcHVfYmFzZTsKIH07CiAKIHN0cnVjdCBnaWNfY2hpcF9kYXRhIHsKQEAgLTI3OSw3ICsyNzksNyBAQAogI2RlZmluZSBnaWNfc2V0X3dha2UJTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGdpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGdpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXUzMiBpcnFzdGF0LCBpcnFucjsKIAlzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljID0gJmdpY19kYXRhWzBdOwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKLXZvaWQgZ2ljX3JhaXNlX3NvZnRpcnEoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBnaWNfcmFpc2Vfc29mdGlycShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGlycSkKIHsKIAlpbnQgY3B1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG1hcCA9IDA7CkBAIC04NjksNyArODY5LDcgQEAKIH07CiAjZW5kaWYKIAotY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGdpY19pcnFfZG9tYWluX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgZ2ljX2lycV9kb21haW5fb3BzID0gewogCS5tYXAgPSBnaWNfaXJxX2RvbWFpbl9tYXAsCiAJLnhsYXRlID0gZ2ljX2lycV9kb21haW5feGxhdGUsCiB9OwpAQCAtOTc0LDcgKzk3NCw4IEBACiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgaW50IGdpY19jbnQgX19pbml0ZGF0YTsKIAotaW50IF9faW5pdCBnaWNfb2ZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQorc3RhdGljIGludCBfX2luaXQKK2dpY19vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCiB7CiAJdm9pZCBfX2lvbWVtICpjcHVfYmFzZTsKIAl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW1wLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1tcC5jCmluZGV4IDJjYjdjZDAuLjNjODgyN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW1wLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1tbXAuYwpAQCAtMTk0LDggKzE5NCw3IEBACiAJLmNvbmZfbWFzawk9IDB4N2YsCiB9OwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeQotbW1wX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgbW1wX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGlycSwgaHdpcnE7CiAKQEAgLTIwNyw4ICsyMDYsNyBAQAogCWhhbmRsZV9JUlEoaXJxLCByZWdzKTsKIH0KIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkKLW1tcDJfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBtbXAyX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGlycSwgaHdpcnE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW94YXJ0LmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1veGFydC5jCmluZGV4IDU1NTJmYzIuLjAwYjNjYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbW94YXJ0LmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1tb3hhcnQuYwpAQCAtNDQsNyArNDQsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1veGFydF9pcnFfZGF0YSBpbnRjOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBoYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGhhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGlycXN0YXQ7CiAJaW50IGh3aXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1vcmlvbi5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1vcmlvbi5jCmluZGV4IDhlNDFiZTYuLmUyNWYyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtb3Jpb24uYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW9yaW9uLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluICpvcmlvbl9pcnFfZG9tYWluOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkCitzdGF0aWMgdm9pZAogX19leGNlcHRpb25faXJxX2VudHJ5IG9yaW9uX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBvcmlvbl9pcnFfZG9tYWluLT5nYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc2lyZnNvYy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zaXJmc29jLmMKaW5kZXggM2EwNzBjNS4uNTgxZWVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1zaXJmc29jLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zaXJmc29jLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAljdC0+cmVncy5tYXNrID0gU0lSRlNPQ19JTlRfUklTQ19NQVNLMDsKIH0KIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgc2lyZnNvY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHNpcmZzb2NfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBzaXJmc29jX2lycWRvbWFpbi0+aG9zdF9kYXRhOwogCXUzMiBpcnFzdGF0LCBpcnFucjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VuNGkuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VuNGkuYwppbmRleCBhNTQzOGQ4Li42ZmNlZjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLXN1bjRpLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zdW40aS5jCkBAIC0zNiwxOCArMzYsMTYgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnN1bjRpX2lycV9iYXNlOwogc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluICpzdW40aV9pcnFfZG9tYWluOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBzdW40aV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBzdW40aV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogc3RhdGljIHZvaWQgc3VuNGlfaXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmlycWQpCiB7CiAJdW5zaWduZWQgaW50IGlycSA9IGlycWRfdG9faHdpcnEoaXJxZCk7Ci0JdW5zaWduZWQgaW50IGlycV9vZmYgPSBpcnEgJSAzMjsKLQlpbnQgcmVnID0gaXJxIC8gMzI7Ci0JdTMyIHZhbDsKIAotCXZhbCA9IHJlYWRsKHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX1BFTkRJTkdfUkVHKHJlZykpOwotCXdyaXRlbCh2YWwgfCAoMSA8PCBpcnFfb2ZmKSwKLQkgICAgICAgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfUEVORElOR19SRUcocmVnKSk7CisJaWYgKGlycSAhPSAwKQorCQlyZXR1cm47IC8qIE9ubHkgSVJRIDAgLyB0aGUgRU5NSSBuZWVkcyB0byBiZSBhY2tlZCAqLworCisJd3JpdGVsKEJJVCgwKSwgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfUEVORElOR19SRUcoMCkpOwogfQogCiBzdGF0aWMgdm9pZCBzdW40aV9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmlycWQpCkBAIC03NiwxNiArNzQsMTYgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW40aV9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAic3VuNGlfaXJxIiwKLQkuaXJxX2Fjawk9IHN1bjRpX2lycV9hY2ssCisJLmlycV9lb2kJPSBzdW40aV9pcnFfYWNrLAogCS5pcnFfbWFzawk9IHN1bjRpX2lycV9tYXNrLAogCS5pcnFfdW5tYXNrCT0gc3VuNGlfaXJxX3VubWFzaywKKwkuZmxhZ3MJCT0gSVJRQ0hJUF9FT0lfVEhSRUFERUQgfCBJUlFDSElQX0VPSV9JRl9IQU5ETEVELAogfTsKIAogc3RhdGljIGludCBzdW40aV9pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKIAkJCSBpcnFfaHdfbnVtYmVyX3QgaHcpCiB7Ci0JaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZzdW40aV9pcnFfY2hpcCwKLQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZzdW40aV9pcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKIAlzZXRfaXJxX2ZsYWdzKHZpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAogCXJldHVybiAwOwpAQCAtMTA5LDcgKzEwNyw3IEBACiAJd3JpdGVsKDAsIHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX0VOQUJMRV9SRUcoMSkpOwogCXdyaXRlbCgwLCBzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9FTkFCTEVfUkVHKDIpKTsKIAotCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJLyogVW5tYXNrIGFsbCB0aGUgaW50ZXJydXB0cywgRU5BQkxFX1JFRyh4KSBpcyB1c2VkIGZvciBtYXNraW5nICovCiAJd3JpdGVsKDAsIHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX01BU0tfUkVHKDApKTsKIAl3cml0ZWwoMCwgc3VuNGlfaXJxX2Jhc2UgKyBTVU40SV9JUlFfTUFTS19SRUcoMSkpOwogCXdyaXRlbCgwLCBzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9NQVNLX1JFRygyKSk7CkBAIC0xMzQsMTYgKzEzMiwzMCBAQAogCiAJcmV0dXJuIDA7CiB9Ci1JUlFDSElQX0RFQ0xBUkUoYWxsd2lubmVyX3N1bjRpX2ljLCAiYWxsd2lubmVyLHN1bjRpLWljIiwgc3VuNGlfb2ZfaW5pdCk7CitJUlFDSElQX0RFQ0xBUkUoYWxsd2lubmVyX3N1bjRpX2ljLCAiYWxsd2lubmVyLHN1bjRpLWExMC1pYyIsIHN1bjRpX29mX2luaXQpOwogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBzdW40aV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHN1bjRpX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIGlycSwgaHdpcnE7CiAKKwkvKgorCSAqIGh3aXJxID09IDAgY2FuIG1lYW4gb25lIG9mIDMgdGhpbmdzOgorCSAqIDEpIG5vIG1vcmUgaXJxcyBwZW5kaW5nCisJICogMikgaXJxIDAgcGVuZGluZworCSAqIDMpIHNwdXJpb3VzIGlycQorCSAqIFNvIGlmIHdlIGltbWVkaWF0ZWx5IGdldCBhIHJlYWRpbmcgb2YgMCwgY2hlY2sgdGhlIGlycS1wZW5kaW5nIHJlZworCSAqIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiAyIGFuZCAzLiBXZSBvbmx5IGRvIHRoaXMgb25jZSB0byBhdm9pZAorCSAqIHRoZSBleHRyYSBjaGVjayBpbiB0aGUgY29tbW9uIGNhc2Ugb2YgMSBoYXBlbmluZyBhZnRlciBoYXZpbmcKKwkgKiByZWFkIHRoZSB2ZWN0b3ItcmVnIG9uY2UuCisJICovCiAJaHdpcnEgPSByZWFkbChzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9WRUNUT1JfUkVHKSA+PiAyOwotCXdoaWxlIChod2lycSAhPSAwKSB7CisJaWYgKGh3aXJxID09IDAgJiYKKwkJICAhKHJlYWRsKHN1bjRpX2lycV9iYXNlICsgU1VONElfSVJRX1BFTkRJTkdfUkVHKDApKSAmIEJJVCgwKSkpCisJCXJldHVybjsKKworCWRvIHsKIAkJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhzdW40aV9pcnFfZG9tYWluLCBod2lycSk7CiAJCWhhbmRsZV9JUlEoaXJxLCByZWdzKTsKIAkJaHdpcnEgPSByZWFkbChzdW40aV9pcnFfYmFzZSArIFNVTjRJX0lSUV9WRUNUT1JfUkVHKSA+PiAyOwotCX0KKwl9IHdoaWxlIChod2lycSAhPSAwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3VueGktbm1pLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXN1bnhpLW5taS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjU0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXN1bnhpLW5taS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQWxsd2lubmVyIEEyMC9BMzEgU29DcyBOTUkgSVJRIGNoaXAgZHJpdmVyLgorICoKKyAqIENhcmxvIENhaW9uZSA8Y2FybG8uY2Fpb25lQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CisjaW5jbHVkZSAiaXJxY2hpcC5oIgorCisjZGVmaW5lIFNVTlhJX05NSV9TUkNfVFlQRV9NQVNLCTB4MDAwMDAwMDMKKworZW51bSB7CisJU1VOWElfU1JDX1RZUEVfTEVWRUxfTE9XID0gMCwKKwlTVU5YSV9TUkNfVFlQRV9FREdFX0ZBTExJTkcsCisJU1VOWElfU1JDX1RZUEVfTEVWRUxfSElHSCwKKwlTVU5YSV9TUkNfVFlQRV9FREdFX1JJU0lORywKK307CisKK3N0cnVjdCBzdW54aV9zY19ubWlfcmVnX29mZnMgeworCXUzMiBjdHJsOworCXUzMiBwZW5kOworCXUzMiBlbmFibGU7Cit9OworCitzdGF0aWMgc3RydWN0IHN1bnhpX3NjX25taV9yZWdfb2ZmcyBzdW43aV9yZWdfb2ZmcyA9IHsKKwkuY3RybAk9IDB4MDAsCisJLnBlbmQJPSAweDA0LAorCS5lbmFibGUJPSAweDA4LAorfTsKKworc3RhdGljIHN0cnVjdCBzdW54aV9zY19ubWlfcmVnX29mZnMgc3VuNmlfcmVnX29mZnMgPSB7CisJLmN0cmwJPSAweDAwLAorCS5wZW5kCT0gMHgwNCwKKwkuZW5hYmxlCT0gMHgzNCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW54aV9zY19ubWlfd3JpdGUoc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjLCB1MzIgb2ZmLAorCQkJCSAgICAgIHUzMiB2YWwpCit7CisJaXJxX3JlZ193cml0ZWwodmFsLCBnYy0+cmVnX2Jhc2UgKyBvZmYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzdW54aV9zY19ubWlfcmVhZChzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsIHUzMiBvZmYpCit7CisJcmV0dXJuIGlycV9yZWdfcmVhZGwoZ2MtPnJlZ19iYXNlICsgb2ZmKTsKK30KKworc3RhdGljIHZvaWQgc3VueGlfc2Nfbm1pX2hhbmRsZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW4gPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9nZXRfY2hpcChpcnEpOworCXVuc2lnbmVkIGludCB2aXJxID0gaXJxX2ZpbmRfbWFwcGluZyhkb21haW4sIDApOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgc3VueGlfc2Nfbm1pX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3QgPSBnYy0+Y2hpcF90eXBlczsKKwl1MzIgc3JjX3R5cGVfcmVnOworCXUzMiBjdHJsX29mZiA9IGN0LT5yZWdzLnR5cGU7CisJdW5zaWduZWQgaW50IHNyY190eXBlOworCXVuc2lnbmVkIGludCBpOworCisJaXJxX2djX2xvY2soZ2MpOworCisJc3dpdGNoIChmbG93X3R5cGUgJiBJUlFGX1RSSUdHRVJfTUFTSykgeworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQlzcmNfdHlwZSA9IFNVTlhJX1NSQ19UWVBFX0VER0VfRkFMTElORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJc3JjX3R5cGUgPSBTVU5YSV9TUkNfVFlQRV9FREdFX1JJU0lORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQlzcmNfdHlwZSA9IFNVTlhJX1NSQ19UWVBFX0xFVkVMX0hJR0g7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTk9ORToKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJc3JjX3R5cGUgPSBTVU5YSV9TUkNfVFlQRV9MRVZFTF9MT1c7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlycV9nY191bmxvY2soZ2MpOworCQlwcl9lcnIoIiVzOiBDYW5ub3QgYXNzaWduIG11bHRpcGxlIHRyaWdnZXIgbW9kZXMgdG8gSVJRICVkLlxuIiwKKwkJCV9fZnVuY19fLCBkYXRhLT5pcnEpOworCQlyZXR1cm4gLUVCQURSOworCX0KKworCWlycWRfc2V0X3RyaWdnZXJfdHlwZShkYXRhLCBmbG93X3R5cGUpOworCWlycV9zZXR1cF9hbHRfY2hpcChkYXRhLCBmbG93X3R5cGUpOworCisJZm9yIChpID0gMDsgaSA8PSBnYy0+bnVtX2N0OyBpKyssIGN0KyspCisJCWlmIChjdC0+dHlwZSAmIGZsb3dfdHlwZSkKKwkJCWN0cmxfb2ZmID0gY3QtPnJlZ3MudHlwZTsKKworCXNyY190eXBlX3JlZyA9IHN1bnhpX3NjX25taV9yZWFkKGdjLCBjdHJsX29mZik7CisJc3JjX3R5cGVfcmVnICY9IH5TVU5YSV9OTUlfU1JDX1RZUEVfTUFTSzsKKwlzcmNfdHlwZV9yZWcgfD0gc3JjX3R5cGU7CisJc3VueGlfc2Nfbm1pX3dyaXRlKGdjLCBjdHJsX29mZiwgc3JjX3R5cGVfcmVnKTsKKworCWlycV9nY191bmxvY2soZ2MpOworCisJcmV0dXJuIElSUV9TRVRfTUFTS19PSzsKK30KKworc3RhdGljIGludCBfX2luaXQgc3VueGlfc2Nfbm1pX2lycV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IHN1bnhpX3NjX25taV9yZWdfb2ZmcyAqcmVnX29mZnMpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJdW5zaWduZWQgaW50IGlycTsKKwl1bnNpZ25lZCBpbnQgY2xyID0gSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFIHwgSVJRX05PQVVUT0VOOworCWludCByZXQ7CisKKworCWRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCAxLCAmaXJxX2dlbmVyaWNfY2hpcF9vcHMsIE5VTEwpOworCWlmICghZG9tYWluKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCByZWdpc3RlciBpbnRlcnJ1cHQgZG9tYWluLlxuIiwgbm9kZS0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhkb21haW4sIDEsIDIsIG5vZGUtPm5hbWUsCisJCQkJCSAgICAgaGFuZGxlX2Zhc3Rlb2lfaXJxLCBjbHIsIDAsCisJCQkJCSAgICAgSVJRX0dDX0lOSVRfTUFTS19DQUNIRSk7CisJaWYgKHJldCkgeworCQkgcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIGdlbmVyaWMgaW50ZXJydXB0IGNoaXAuXG4iLAorCQkJIG5vZGUtPm5hbWUpOworCQkgZ290byBmYWlsX2lycWRfcmVtb3ZlOworCX0KKworCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCWlmIChpcnEgPD0gMCkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gcGFyc2UgaXJxXG4iLCBub2RlLT5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2lycWRfcmVtb3ZlOworCX0KKworCWdjID0gaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKGRvbWFpbiwgMCk7CisJZ2MtPnJlZ19iYXNlID0gb2ZfaW9tYXAobm9kZSwgMCk7CisJaWYgKCFnYy0+cmVnX2Jhc2UpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIG1hcCByZXNvdXJjZVxuIiwgbm9kZS0+bmFtZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9pcnFkX3JlbW92ZTsKKwl9CisKKwlnYy0+Y2hpcF90eXBlc1swXS50eXBlCQkJPSBJUlFfVFlQRV9MRVZFTF9NQVNLOworCWdjLT5jaGlwX3R5cGVzWzBdLmNoaXAuaXJxX21hc2sJCT0gaXJxX2djX21hc2tfY2xyX2JpdDsKKwlnYy0+Y2hpcF90eXBlc1swXS5jaGlwLmlycV91bm1hc2sJPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWdjLT5jaGlwX3R5cGVzWzBdLmNoaXAuaXJxX2VvaQkJPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CisJZ2MtPmNoaXBfdHlwZXNbMF0uY2hpcC5pcnFfc2V0X3R5cGUJPSBzdW54aV9zY19ubWlfc2V0X3R5cGU7CisJZ2MtPmNoaXBfdHlwZXNbMF0uY2hpcC5mbGFncwkJPSBJUlFDSElQX0VPSV9USFJFQURFRCB8IElSUUNISVBfRU9JX0lGX0hBTkRMRUQ7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy5hY2sJCT0gcmVnX29mZnMtPnBlbmQ7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy5tYXNrCQk9IHJlZ19vZmZzLT5lbmFibGU7CisJZ2MtPmNoaXBfdHlwZXNbMF0ucmVncy50eXBlCQk9IHJlZ19vZmZzLT5jdHJsOworCisJZ2MtPmNoaXBfdHlwZXNbMV0udHlwZQkJCT0gSVJRX1RZUEVfRURHRV9CT1RIOworCWdjLT5jaGlwX3R5cGVzWzFdLmNoaXAubmFtZQkJPSBnYy0+Y2hpcF90eXBlc1swXS5jaGlwLm5hbWU7CisJZ2MtPmNoaXBfdHlwZXNbMV0uY2hpcC5pcnFfYWNrCQk9IGlycV9nY19hY2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5jaGlwLmlycV9tYXNrCQk9IGlycV9nY19tYXNrX2Nscl9iaXQ7CisJZ2MtPmNoaXBfdHlwZXNbMV0uY2hpcC5pcnFfdW5tYXNrCT0gaXJxX2djX21hc2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5jaGlwLmlycV9zZXRfdHlwZQk9IHN1bnhpX3NjX25taV9zZXRfdHlwZTsKKwlnYy0+Y2hpcF90eXBlc1sxXS5yZWdzLmFjawkJPSByZWdfb2Zmcy0+cGVuZDsKKwlnYy0+Y2hpcF90eXBlc1sxXS5yZWdzLm1hc2sJCT0gcmVnX29mZnMtPmVuYWJsZTsKKwlnYy0+Y2hpcF90eXBlc1sxXS5yZWdzLnR5cGUJCT0gcmVnX29mZnMtPmN0cmw7CisJZ2MtPmNoaXBfdHlwZXNbMV0uaGFuZGxlcgkJPSBoYW5kbGVfZWRnZV9pcnE7CisKKwlzdW54aV9zY19ubWlfd3JpdGUoZ2MsIHJlZ19vZmZzLT5lbmFibGUsIDApOworCXN1bnhpX3NjX25taV93cml0ZShnYywgcmVnX29mZnMtPnBlbmQsIDB4MSk7CisKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsIGRvbWFpbik7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCBzdW54aV9zY19ubWlfaGFuZGxlX2lycSk7CisKKwlyZXR1cm4gMDsKKworZmFpbF9pcnFkX3JlbW92ZToKKwlpcnFfZG9tYWluX3JlbW92ZShkb21haW4pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgc3VuNmlfc2Nfbm1pX2lycV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJcmV0dXJuIHN1bnhpX3NjX25taV9pcnFfaW5pdChub2RlLCAmc3VuNmlfcmVnX29mZnMpOworfQorSVJRQ0hJUF9ERUNMQVJFKHN1bjZpX3NjX25taSwgImFsbHdpbm5lcixzdW42aS1hMzEtc2Mtbm1pIiwgc3VuNmlfc2Nfbm1pX2lycV9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgc3VuN2lfc2Nfbm1pX2lycV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJcmV0dXJuIHN1bnhpX3NjX25taV9pcnFfaW5pdChub2RlLCAmc3VuN2lfcmVnX29mZnMpOworfQorSVJRQ0hJUF9ERUNMQVJFKHN1bjdpX3NjX25taSwgImFsbHdpbm5lcixzdW43aS1hMjAtc2Mtbm1pIiwgc3VuN2lfc2Nfbm1pX2lycV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtdmljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXZpYy5jCmluZGV4IDhlMjFhZTAuLjQ3M2YwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtdmljLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS12aWMuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAgKiBLZWVwIGl0ZXJhdGluZyBvdmVyIGFsbCByZWdpc3RlcmVkIFZJQydzIHVudGlsIHRoZXJlIGFyZSBubyBwZW5kaW5nCiAgKiBpbnRlcnJ1cHRzLgogICovCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB2aWNfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB2aWNfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaSwgaGFuZGxlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS12dDg1MDAuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtdnQ4NTAwLmMKaW5kZXggMTg0NmU3ZC4uZWI2ZTkxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS12dDg1MDAuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXZ0ODUwMC5jCkBAIC0xNzgsOCArMTc4LDcgQEAKIAkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCiB9OwogCi1zdGF0aWMgYXNtbGlua2FnZQotdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgdnQ4NTAwX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgdnQ4NTAwX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTMyIHN0YXQsIGk7CiAJaW50IGlycW5yLCB2aXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS14dGVuc2EtbXguYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEteHRlbnNhLW14LmMKaW5kZXggZjY5M2YxYi4uZTFjMmY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS14dGVuc2EtbXguYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXh0ZW5zYS1teC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIHN0YXRpYyBpbnQgeHRlbnNhX214X2lycV9zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLAogCQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCwgYm9vbCBmb3JjZSkKIHsKLQl1bnNpZ25lZCBtYXNrID0gMXUgPDwgY3B1bWFza19hbnkoZGVzdCk7CisJdW5zaWduZWQgbWFzayA9IDF1IDw8IGNwdW1hc2tfYW55X2FuZChkZXN0LCBjcHVfb25saW5lX21hc2spOwogCiAJc2V0X2VyKG1hc2ssIE1JUk9VVChkLT5od2lycSAtIEhXX0lSUV9NWF9CQVNFKSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXpldmlvLmMKaW5kZXggOGVkMDRjNC4uY2ViM2E0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS16ZXZpby5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtemV2aW8uYwpAQCAtNTAsNyArNTAsNyBAQAogCXJlYWRsKGdjLT5yZWdfYmFzZSArIHJlZ3MtPmFjayk7CiB9CiAKLXN0YXRpYyBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IHpldmlvX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgemV2aW9faGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaXJxbnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnFjaGlwLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxY2hpcC5jCmluZGV4IGY0OTZhZmMuLmNhZDNlMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnFjaGlwLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycWNoaXAuYwpAQCAtMTAsOCArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotCi0jaW5jbHVkZSAiaXJxY2hpcC5oIgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KIAogLyoKICAqIFRoaXMgc3BlY2lhbCBvZl9kZXZpY2VfaWQgaXMgdGhlIHNlbnRpbmVsIGF0IHRoZSBlbmQgb2YgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZwppbmRleCBmMDQ2ODY1Li45ODE2YzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKQEAgLTE2LDE2ICsxNiw2IEBACiAJICBUaGlzIHdpbGwgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGtlcm5lbGNhcGkgbW9kdWxlIGJ5IDIwIEtCLgogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAotY29uZmlnIElTRE5fQ0FQSV9NSURETEVXQVJFCi0JYm9vbCAiQ0FQSTIuMCBNaWRkbGV3YXJlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBUVFkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiB3aWxsIGVuaGFuY2UgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgL2Rldi9jYXBpMjAKLQkgIGludGVyZmFjZS4gIEl0IHdpbGwgcHJvdmlkZSBhIG1lYW5zIG9mIG1vdmluZyBhIGRhdGEgY29ubmVjdGlvbiwKLQkgIGVzdGFibGlzaGVkIHZpYSB0aGUgdXN1YWwgL2Rldi9jYXBpMjAgaW50ZXJmYWNlIHRvIGEgc3BlY2lhbCB0dHkKLQkgIGRldmljZS4gIElmIHlvdSB3YW50IHRvIHVzZSBwcHBkIHdpdGggcHBwZGNhcGlwbHVnaW4gdG8gZGlhbCB1cCB0bwotCSAgeW91ciBJU1AsIHNheSBZIGhlcmUuCi0KIGNvbmZpZyBJU0ROX0NBUElfQ0FQSTIwCiAJdHJpc3RhdGUgIkNBUEkyLjAgL2Rldi9jYXBpIHN1cHBvcnQiCiAJaGVscApAQCAtMzQsNiArMjQsMTYgQEAKIAkgIHN0YW5kYXJkaXplZCBsaWJjYXBpMjAgdG8gYWNjZXNzIHRoaXMgZnVuY3Rpb25hbGl0eS4gIFlvdSBzaG91bGQgc2F5CiAJICBZL00gaGVyZS4KIAorY29uZmlnIElTRE5fQ0FQSV9NSURETEVXQVJFCisJYm9vbCAiQ0FQSTIuMCBNaWRkbGV3YXJlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0ROX0NBUElfQ0FQSTIwICYmIFRUWQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHdpbGwgZW5oYW5jZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSAvZGV2L2NhcGkyMAorCSAgaW50ZXJmYWNlLiAgSXQgd2lsbCBwcm92aWRlIGEgbWVhbnMgb2YgbW92aW5nIGEgZGF0YSBjb25uZWN0aW9uLAorCSAgZXN0YWJsaXNoZWQgdmlhIHRoZSB1c3VhbCAvZGV2L2NhcGkyMCBpbnRlcmZhY2UgdG8gYSBzcGVjaWFsIHR0eQorCSAgZGV2aWNlLiAgSWYgeW91IHdhbnQgdG8gdXNlIHBwcGQgd2l0aCBwcHBkY2FwaXBsdWdpbiB0byBkaWFsIHVwIHRvCisJICB5b3VyIElTUCwgc2F5IFkgaGVyZS4KKwogY29uZmlnIElTRE5fQ0FQSV9DQVBJRFJWCiAJdHJpc3RhdGUgIkNBUEkyLjAgY2FwaWRydiBpbnRlcmZhY2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElTRE5fSTRMCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCmluZGV4IDA0YTUwNDkuLjllOWM1Njc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9hZGIuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpZmRlZiBDT05GSUdfUFBDCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpAQCAtMTkzLDggKzE5Myw3IEBACiAJCQkJCWJyZWFrOwogCiAJCQkJbm9Nb3ZlbWVudCA9IDA7Ci0JCQl9Ci0JCQllbHNlIHsKKwkJCX0gZWxzZSB7CiAJCQkJLyoKIAkJCQkgKiBObyBkZXZpY2VzIGxlZnQgYXQgYWRkcmVzcyBpOyBtb3ZlIHRoZQogCQkJCSAqIG9uZShzKSB3ZSBtb3ZlZCB0byBgaGlnaEZyZWUnIGJhY2sgdG8gaS4KQEAgLTI2Myw3ICsyNjIsNyBAQAogLyoKICAqIG5vdGlmeSBjbGllbnRzIGJlZm9yZSBzbGVlcAogICovCi1zdGF0aWMgaW50IGFkYl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBfX2FkYl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWFkYl9nb3Rfc2xlZXAgPSAxOwogCS8qIFdlIG5lZWQgdG8gZ2V0IGEgbG9jayBvbiB0aGUgcHJvYmUgdGhyZWFkICovCkBAIC0yNzYsMTAgKzI3NSwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFkYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19hZGJfc3VzcGVuZCh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSwgUE1TR19TVVNQRU5EKTsKK30KKworc3RhdGljIGludCBhZGJfZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19hZGJfc3VzcGVuZCh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSwgUE1TR19GUkVFWkUpOworfQorCitzdGF0aWMgaW50IGFkYl9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fYWRiX3N1c3BlbmQodG9fcGxhdGZvcm1fZGV2aWNlKGRldiksIFBNU0dfSElCRVJOQVRFKTsKK30KKwogLyoKICAqIHJlc2V0IGJ1cyBhZnRlciBzbGVlcAogICovCi1zdGF0aWMgaW50IGFkYl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2FkYl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCWFkYl9nb3Rfc2xlZXAgPSAwOwogCXVwKCZhZGJfcHJvYmVfbXV0ZXgpOwpAQCAtMjg3LDYgKzMwMSwxMSBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgYWRiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fYWRiX3Jlc3VtZSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBpbnQgX19pbml0IGFkYl9pbml0KHZvaWQpCkBAIC01MDIsNyArNTIxLDcgQEAKIGFkYl9pbnB1dCh1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYiwgaW50IGF1dG9wb2xsKQogewogCWludCBpLCBpZDsKLQlzdGF0aWMgaW50IGR1bXBfYWRiX2lucHV0ID0gMDsKKwlzdGF0aWMgaW50IGR1bXBfYWRiX2lucHV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCiAJdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQpOwpAQCAtNjI0LDggKzY0Myw3IEBACiB7CiAJaW50CXJldCA9IC1FSU5WQUw7CiAKLQlzd2l0Y2gocmVxLT5kYXRhWzFdKQotCXsKKwlzd2l0Y2gocmVxLT5kYXRhWzFdKSB7CiAJY2FzZSBBREJfUVVFUllfR0VUREVWSU5GTzoKIAkJaWYgKHJlcS0+bmJ5dGVzIDwgMykKIAkJCWJyZWFrOwpAQCAtNjk3LDcgKzcxNSw3IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGFkYmRldl9zdGF0ZSAqc3RhdGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXE7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNvdW50IDwgMikKQEAgLTc5NCw4ICs4MTIsOCBAQAogCX0KIAkvKiBTcGVjaWFsIGNhc2UgZm9yIEFEQl9CVVNSRVNFVCByZXF1ZXN0LCBhbGwgb3RoZXJzIGFyZSBzZW50IHRvCiAJICAgdGhlIGNvbnRyb2xsZXIgKi8KLQllbHNlIGlmICgocmVxLT5kYXRhWzBdID09IEFEQl9QQUNLRVQpJiYoY291bnQgPiAxKQotCQkmJihyZXEtPmRhdGFbMV0gPT0gQURCX0JVU1JFU0VUKSkgeworCWVsc2UgaWYgKChyZXEtPmRhdGFbMF0gPT0gQURCX1BBQ0tFVCkgJiYgKGNvdW50ID4gMSkKKwkJJiYgKHJlcS0+ZGF0YVsxXSA9PSBBREJfQlVTUkVTRVQpKSB7CiAJCXJldCA9IGRvX2FkYl9yZXNldF9idXMoKTsKIAkJdXAoJmFkYl9wcm9iZV9tdXRleCk7CiAJCWF0b21pY19kZWMoJnN0YXRlLT5uX3BlbmRpbmcpOwpAQCAtODMxLDE0ICs4NDksMjUgQEAKIAkucmVsZWFzZQk9IGFkYl9yZWxlYXNlLAogfTsKIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGFkYl9kZXZfcG1fb3BzID0geworCS5zdXNwZW5kID0gYWRiX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFkYl9yZXN1bWUsCisJLyogSGliZXJuYXRlIGhvb2tzICovCisJLmZyZWV6ZSA9IGFkYl9mcmVlemUsCisJLnRoYXcgPSBhZGJfcmVzdW1lLAorCS5wb3dlcm9mZiA9IGFkYl9wb3dlcm9mZiwKKwkucmVzdG9yZSA9IGFkYl9yZXN1bWUsCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFkYl9wZmRydiA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJhZGIiLAotCX0sCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPSBhZGJfc3VzcGVuZCwKLQkucmVzdW1lID0gYWRiX3Jlc3VtZSwKKwkJLnBtID0gJmFkYl9kZXZfcG1fb3BzLAogI2VuZGlmCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFkYl9wZmRldiA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL0tjb25maWcgYi9kcml2ZXJzL21jYi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTY5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21jYi9LY29uZmlnCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTUVOIENoYW1lbGVvbiBCdXMgKE1DQikgc3VwcG9ydAorIworCittZW51Y29uZmlnIE1DQgorCSAgIHRyaXN0YXRlICJNQ0Igc3VwcG9ydCIKKwkgICBkZWZhdWx0IG4KKwkgICBkZXBlbmRzIG9uIEhBU19JT01FTQorCSAgIGhlbHAKKworCSAgIFRoZSBNQ0IgKE1FTiBDaGFtZWxlb24gQnVzKSBpcyBhIEJ1cyBzcGVjaWZpYyB0byBNRU4gTWlrcm9lbGVrdHJvbmlrCisJICAgRlBHQSBiYXNlZCBkZXZpY2VzLiBJdCBpcyB1c2VkIHRvIGlkZW50aWZ5IE1DQiBiYXNlZCBJUC1Db3JlcyB3aXRoaW4KKwkgICBhbiBGUEdBIGFuZCBwcm92aWRlIHRoZSBuZWNlc3NhcnkgZnJhbWV3b3JrIGZvciBpbnN0YW50aWF0aW5nIGRyaXZlcnMKKwkgICBmb3IgdGhlc2UgZGV2aWNlcy4KKworCSAgIElmIGJ1aWxkIGFzIGEgbW9kdWxlLCB0aGUgbW9kdWxlIGlzIGNhbGxlZCBtY2Iua28KKworaWYgTUNCCitjb25maWcgTUNCX1BDSQorCSAgIHRyaXN0YXRlICJQQ0kgYmFzZWQgTUNCIGNhcnJpZXIiCisJICAgZGVmYXVsdCBuCisJICAgZGVwZW5kcyBvbiBQQ0kKKwkgICBoZWxwCisKKwkgICBUaGlzIGlzIGEgTUNCIGNhcnJpZXIgb24gYSBQQ0kgZGV2aWNlLiBCb3RoIFBDSSBhdHRhY2hlZCBvbi1ib2FyZAorCSAgIEZQR0FzIGFzIHdlbGwgYXMgQ29tcGFjdFBDSSBhdHRhY2hlZCBNQ0IgRlBHQXMgYXJlIHN1cHBvcnRlZCB3aXRoCisJICAgdGhpcyBkcml2ZXIuCisKKwkgICBJZiBidWlsZCBhcyBhIG1vZHVsZSwgdGhlIG1vZHVsZSBpcyBjYWxsZWQgbWNiLXBjaS5rbworCitlbmRpZiAjIE1DQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvTWFrZWZpbGUgYi9kcml2ZXJzL21jYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWUxNDEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tY2IvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisKK29iai0kKENPTkZJR19NQ0IpICs9IG1jYi5vCisKK21jYi15ICs9IG1jYi1jb3JlLm8KK21jYi15ICs9IG1jYi1wYXJzZS5vCisKK29iai0kKENPTkZJR19NQ0JfUENJKSArPSBtY2ItcGNpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1jb3JlLmMgYi9kcml2ZXJzL21jYi9tY2ItY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTEyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21jYi9tY2ItY29yZS5jCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogTUVOIENoYW1lbGVvbiBCdXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIE1FTiBNaWtyb2VsZWt0cm9uaWsgR21iSCAod3d3Lm1lbi5kZSkKKyAqIEF1dGhvcjogSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvbWNiLmg+CisKK3N0YXRpYyBERUZJTkVfSURBKG1jYl9pZGEpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1jYl9kZXZpY2VfaWQgKm1jYl9tYXRjaF9pZChjb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCAqaWRzLAorCQkJCQkJc3RydWN0IG1jYl9kZXZpY2UgKmRldikKK3sKKwlpZiAoaWRzKSB7CisJCXdoaWxlIChpZHMtPmRldmljZSkgeworCQkJaWYgKGlkcy0+ZGV2aWNlID09IGRldi0+aWQpCisJCQkJcmV0dXJuIGlkczsKKwkJCWlkcysrOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbWNiX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgbWNiX2RyaXZlciAqbWRydiA9IHRvX21jYl9kcml2ZXIoZHJ2KTsKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCAqZm91bmRfaWQ7CisKKwlmb3VuZF9pZCA9IG1jYl9tYXRjaF9pZChtZHJ2LT5pZF90YWJsZSwgbWRldik7CisJaWYgKGZvdW5kX2lkKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jYl91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPW1jYjoxNnolMDNkIiwgbWRldi0+aWQpOworCWlmIChyZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNiX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWNiX2RyaXZlciAqbWRydiA9IHRvX21jYl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2ID0gdG9fbWNiX2RldmljZShkZXYpOworCWNvbnN0IHN0cnVjdCBtY2JfZGV2aWNlX2lkICpmb3VuZF9pZDsKKworCWZvdW5kX2lkID0gbWNiX21hdGNoX2lkKG1kcnYtPmlkX3RhYmxlLCBtZGV2KTsKKwlpZiAoIWZvdW5kX2lkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBtZHJ2LT5wcm9iZShtZGV2LCBmb3VuZF9pZCk7Cit9CisKK3N0YXRpYyBpbnQgbWNiX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jYl9kcml2ZXIgKm1kcnYgPSB0b19tY2JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKworCW1kcnYtPnJlbW92ZShtZGV2KTsKKworCXB1dF9kZXZpY2UoJm1kZXYtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWNiX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbWNiX2RyaXZlciAqbWRydiA9IG1kZXYtPmRyaXZlcjsKKworCWlmIChtZHJ2ICYmIG1kcnYtPnNodXRkb3duKQorCQltZHJ2LT5zaHV0ZG93bihtZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBtY2JfYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAibWNiIiwKKwkubWF0Y2ggPSBtY2JfbWF0Y2gsCisJLnVldmVudCA9IG1jYl91ZXZlbnQsCisJLnByb2JlID0gbWNiX3Byb2JlLAorCS5yZW1vdmUgPSBtY2JfcmVtb3ZlLAorCS5zaHV0ZG93biA9IG1jYl9zaHV0ZG93biwKK307CisKKy8qKgorICogX19tY2JfcmVnaXN0ZXJfZHJpdmVyKCkgLSBSZWdpc3RlciBhIEBtY2JfZHJpdmVyIGF0IHRoZSBzeXN0ZW0KKyAqIEBkcnY6IFRoZSBAbWNiX2RyaXZlcgorICogQG93bmVyOiBUaGUgQG1jYl9kcml2ZXIncyBtb2R1bGUKKyAqIEBtb2RfbmFtZTogVGhlIG5hbWUgb2YgdGhlIEBtY2JfZHJpdmVyJ3MgbW9kdWxlCisgKgorICogUmVnaXN0ZXIgYSBAbWNiX2RyaXZlciBhdCB0aGUgc3lzdGVtLiBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcywgaWYKKyAqIHRoZSAucHJvYmUgYW5kIC5yZW1vdmUgbWV0aG9kcyBhcmUgcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4KKyAqLworaW50IF9fbWNiX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbWNiX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCWNvbnN0IGNoYXIgKm1vZF9uYW1lKQoreworCWlmICghZHJ2LT5wcm9iZSB8fCAhZHJ2LT5yZW1vdmUpCisJCXJldHVybiAtRUlOVkFMOworCisJZHJ2LT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwlkcnYtPmRyaXZlci5idXMgPSAmbWNiX2J1c190eXBlOworCWRydi0+ZHJpdmVyLm1vZF9uYW1lID0gbW9kX25hbWU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX21jYl9yZWdpc3Rlcl9kcml2ZXIpOworCisvKioKKyAqIG1jYl91bnJlZ2lzdGVyX2RyaXZlcigpIC0gVW5yZWdpc3RlciBhIEBtY2JfZHJpdmVyIGZyb20gdGhlIHN5c3RlbQorICogQGRydjogVGhlIEBtY2JfZHJpdmVyCisgKgorICogVW5yZWdpc3RlciBhIEBtY2JfZHJpdmVyIGZyb20gdGhlIHN5c3RlbS4KKyAqLwordm9pZCBtY2JfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1jYl9kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworc3RhdGljIHZvaWQgbWNiX3JlbGVhc2VfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKKworCW1jYl9idXNfcHV0KG1kZXYtPmJ1cyk7CisJa2ZyZWUobWRldik7Cit9CisKKy8qKgorICogbWNiX2RldmljZV9yZWdpc3RlcigpIC0gUmVnaXN0ZXIgYSBtY2JfZGV2aWNlCisgKiBAYnVzOiBUaGUgQG1jYl9idXMgb2YgdGhlIGRldmljZQorICogQGRldjogVGhlIEBtY2JfZGV2aWNlCisgKgorICogUmVnaXN0ZXIgYSBzcGVjaWZpYyBAbWNiX2RldmljZSBhdCBhIEBtY2JfYnVzIGFuZCB0aGUgc3lzdGVtIGl0c2VsZi4KKyAqLworaW50IG1jYl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG1jYl9idXMgKmJ1cywgc3RydWN0IG1jYl9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCWludCBkZXZpY2VfaWQ7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2LT5kZXYpOworCWRldi0+ZGV2LmJ1cyA9ICZtY2JfYnVzX3R5cGU7CisJZGV2LT5kZXYucGFyZW50ID0gYnVzLT5kZXYucGFyZW50OworCWRldi0+ZGV2LnJlbGVhc2UgPSBtY2JfcmVsZWFzZV9kZXY7CisKKwlkZXZpY2VfaWQgPSBkZXYtPmlkOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJtY2IlZC0xNnolMDNkLSVkOiVkOiVkIiwKKwkJYnVzLT5idXNfbnIsIGRldmljZV9pZCwgZGV2LT5pbnN0LCBkZXYtPmdyb3VwLCBkZXYtPnZhcik7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZkZXYtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGYWlsZWQgcmVnaXN0ZXJpbmcgZGV2aWNlIDE2eiUwM2Qgb24gYnVzIG1jYiVkICglZClcbiIsCisJCQlkZXZpY2VfaWQsIGJ1cy0+YnVzX25yLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0OgorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9kZXZpY2VfcmVnaXN0ZXIpOworCisvKioKKyAqIG1jYl9hbGxvY19idXMoKSAtIEFsbG9jYXRlIGEgbmV3IEBtY2JfYnVzCisgKgorICogQWxsb2NhdGUgYSBuZXcgQG1jYl9idXMuCisgKi8KK3N0cnVjdCBtY2JfYnVzICptY2JfYWxsb2NfYnVzKHZvaWQpCit7CisJc3RydWN0IG1jYl9idXMgKmJ1czsKKwlpbnQgYnVzX25yOworCisJYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1jYl9idXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1cykKKwkJcmV0dXJuIE5VTEw7CisKKwlidXNfbnIgPSBpZGFfc2ltcGxlX2dldCgmbWNiX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1c19uciA8IDApIHsKKwkJa2ZyZWUoYnVzKTsKKwkJcmV0dXJuIEVSUl9QVFIoYnVzX25yKTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmYnVzLT5jaGlsZHJlbik7CisJYnVzLT5idXNfbnIgPSBidXNfbnI7CisKKwlyZXR1cm4gYnVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWNiX2FsbG9jX2J1cyk7CisKK3N0YXRpYyBpbnQgX19tY2JfZGV2aWNlc191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2JfZGV2aWNlc191bnJlZ2lzdGVyKHN0cnVjdCBtY2JfYnVzICpidXMpCit7CisJYnVzX2Zvcl9lYWNoX2RldigmbWNiX2J1c190eXBlLCBOVUxMLCBOVUxMLCBfX21jYl9kZXZpY2VzX3VucmVnaXN0ZXIpOworfQorLyoqCisgKiBtY2JfcmVsZWFzZV9idXMoKSAtIEZyZWUgYSBAbWNiX2J1cworICogQGJ1czogVGhlIEBtY2JfYnVzIHRvIHJlbGVhc2UKKyAqCisgKiBSZWxlYXNlIGFuIGFsbG9jYXRlZCBAbWNiX2J1cyBmcm9tIHRoZSBzeXN0ZW0uCisgKi8KK3ZvaWQgbWNiX3JlbGVhc2VfYnVzKHN0cnVjdCBtY2JfYnVzICpidXMpCit7CisJbWNiX2RldmljZXNfdW5yZWdpc3RlcihidXMpOworCisJaWRhX3NpbXBsZV9yZW1vdmUoJm1jYl9pZGEsIGJ1cy0+YnVzX25yKTsKKworCWtmcmVlKGJ1cyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfcmVsZWFzZV9idXMpOworCisvKioKKyAqIG1jYl9idXNfcHV0KCkgLSBJbmNyZW1lbnQgcmVmY250CisgKiBAYnVzOiBUaGUgQG1jYl9idXMKKyAqCisgKiBHZXQgYSBAbWNiX2J1cycgcmVmCisgKi8KK3N0cnVjdCBtY2JfYnVzICptY2JfYnVzX2dldChzdHJ1Y3QgbWNiX2J1cyAqYnVzKQoreworCWlmIChidXMpCisJCWdldF9kZXZpY2UoJmJ1cy0+ZGV2KTsKKworCXJldHVybiBidXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfYnVzX2dldCk7CisKKy8qKgorICogbWNiX2J1c19wdXQoKSAtIERlY3JlbWVudCByZWZjbnQKKyAqIEBidXM6IFRoZSBAbWNiX2J1cworICoKKyAqIFJlbGVhc2UgYSBAbWNiX2J1cycgcmVmCisgKi8KK3ZvaWQgbWNiX2J1c19wdXQoc3RydWN0IG1jYl9idXMgKmJ1cykKK3sKKwlpZiAoYnVzKQorCQlwdXRfZGV2aWNlKCZidXMtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfYnVzX3B1dCk7CisKKy8qKgorICogbWNiX2FsbG9jX2RldigpIC0gQWxsb2NhdGUgYSBkZXZpY2UKKyAqIEBidXM6IFRoZSBAbWNiX2J1cyB0aGUgZGV2aWNlIGlzIHBhcnQgb2YKKyAqCisgKiBBbGxvY2F0ZSBhIEBtY2JfZGV2aWNlIGFuZCBhZGQgYnVzLgorICovCitzdHJ1Y3QgbWNiX2RldmljZSAqbWNiX2FsbG9jX2RldihzdHJ1Y3QgbWNiX2J1cyAqYnVzKQoreworCXN0cnVjdCBtY2JfZGV2aWNlICpkZXY7CisKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWNiX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmJ1c19saXN0KTsKKwlkZXYtPmJ1cyA9IGJ1czsKKworCXJldHVybiBkZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfYWxsb2NfZGV2KTsKKworLyoqCisgKiBtY2JfZnJlZV9kZXYoKSAtIEZyZWUgQG1jYl9kZXZpY2UKKyAqIEBkZXY6IFRoZSBkZXZpY2UgdG8gZnJlZQorICoKKyAqIEZyZWUgYSBAbWNiX2RldmljZQorICovCit2b2lkIG1jYl9mcmVlX2RldihzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KQoreworCWtmcmVlKGRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfZnJlZV9kZXYpOworCitzdGF0aWMgaW50IF9fbWNiX2J1c19hZGRfZGV2aWNlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisJaW50IHJldHZhbDsKKworCWlmIChtZGV2LT5pc19hZGRlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR2YWwgPSBkZXZpY2VfYXR0YWNoKGRldik7CisJaWYgKHJldHZhbCA8IDApCisJCWRldl9lcnIoZGV2LCAiRXJyb3IgYWRkaW5nIGRldmljZSAoJWQpXG4iLCByZXR2YWwpOworCisJbWRldi0+aXNfYWRkZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tY2JfYnVzX2FkZF9jaGlsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7CisJc3RydWN0IG1jYl9idXMgKmNoaWxkOworCisJQlVHX09OKCFtZGV2LT5pc19hZGRlZCk7CisJY2hpbGQgPSBtZGV2LT5zdWJvcmRpbmF0ZTsKKworCWlmIChjaGlsZCkKKwkJbWNiX2J1c19hZGRfZGV2aWNlcyhjaGlsZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtY2JfYnVzX2FkZF9kZXZpY2VzKCkgLSBBZGQgZGV2aWNlcyBpbiB0aGUgYnVzJyBpbnRlcm5hbCBkZXZpY2UgbGlzdAorICogQGJ1czogVGhlIEBtY2JfYnVzIHdlIGFkZCB0aGUgZGV2aWNlcworICoKKyAqIEFkZCBkZXZpY2VzIGluIHRoZSBidXMnIGludGVybmFsIGRldmljZSBsaXN0IHRvIHRoZSBzeXN0ZW0uCisgKi8KK3ZvaWQgbWNiX2J1c19hZGRfZGV2aWNlcyhjb25zdCBzdHJ1Y3QgbWNiX2J1cyAqYnVzKQoreworCWJ1c19mb3JfZWFjaF9kZXYoJm1jYl9idXNfdHlwZSwgTlVMTCwgTlVMTCwgX19tY2JfYnVzX2FkZF9kZXZpY2VzKTsKKwlidXNfZm9yX2VhY2hfZGV2KCZtY2JfYnVzX3R5cGUsIE5VTEwsIE5VTEwsIF9fbWNiX2J1c19hZGRfY2hpbGQpOworCit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfYnVzX2FkZF9kZXZpY2VzKTsKKworLyoqCisgKiBtY2JfcmVxdWVzdF9tZW0oKSAtIFJlcXVlc3QgbWVtb3J5CisgKiBAZGV2OiBUaGUgQG1jYl9kZXZpY2UgdGhlIG1lbW9yeSBpcyBmb3IKKyAqIEBuYW1lOiBUaGUgbmFtZSBmb3IgdGhlIG1lbW9yeSByZWZlcmVuY2UuCisgKgorICogUmVxdWVzdCBtZW1vcnkgZm9yIGEgQG1jYl9kZXZpY2UuIElmIEBuYW1lIGlzIE5VTEwgdGhlIGRyaXZlciBuYW1lIHdpbGwKKyAqIGJlIHVzZWQuCisgKi8KK3N0cnVjdCByZXNvdXJjZSAqbWNiX3JlcXVlc3RfbWVtKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdTMyIHNpemU7CisKKwlpZiAoIW5hbWUpCisJCW5hbWUgPSBkZXYtPmRldi5kcml2ZXItPm5hbWU7CisKKwlzaXplID0gcmVzb3VyY2Vfc2l6ZSgmZGV2LT5tZW0pOworCisJbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKGRldi0+bWVtLnN0YXJ0LCBzaXplLCBuYW1lKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKworCXJldHVybiBtZW07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtY2JfcmVxdWVzdF9tZW0pOworCisvKioKKyAqIG1jYl9yZWxlYXNlX21lbSgpIC0gUmVsZWFzZSBtZW1vcnkgcmVxdWVzdGVkIGJ5IGRldmljZQorICogQGRldjogVGhlIEBtY2JfZGV2aWNlIHRoYXQgcmVxdWVzdGVkIHRoZSBtZW1vcnkKKyAqCisgKiBSZWxlYXNlIG1lbW9yeSB0aGF0IHdhcyBwcmlvciByZXF1ZXN0ZWQgdmlhIEBtY2JfcmVxdWVzdF9tZW0oKS4KKyAqLwordm9pZCBtY2JfcmVsZWFzZV9tZW0oc3RydWN0IHJlc291cmNlICptZW0pCit7CisJdTMyIHNpemU7CisKKwlzaXplID0gcmVzb3VyY2Vfc2l6ZShtZW0pOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCBzaXplKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9yZWxlYXNlX21lbSk7CisKKy8qKgorICogbWNiX2dldF9pcnEoKSAtIEdldCBkZXZpY2UncyBJUlEgbnVtYmVyCisgKiBAZGV2OiBUaGUgQG1jYl9kZXZpY2UgdGhlIElSUSBpcyBmb3IKKyAqCisgKiBHZXQgdGhlIElSUSBudW1iZXIgb2YgYSBnaXZlbiBAbWNiX2RldmljZS4KKyAqLworaW50IG1jYl9nZXRfaXJxKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJlc291cmNlICppcnEgPSAmZGV2LT5pcnE7CisKKwlyZXR1cm4gaXJxLT5zdGFydDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jYl9nZXRfaXJxKTsKKworc3RhdGljIGludCBtY2JfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJm1jYl9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYl9leGl0KHZvaWQpCit7CisJYnVzX3VucmVnaXN0ZXIoJm1jYl9idXNfdHlwZSk7Cit9CisKKy8qIG1jYiBtdXN0IGJlIGluaXRpYWxpemVkIGFmdGVyIFBDSSBidXQgYmVmb3JlIHRoZSBjaGFtZWxlb24gZHJpdmVycy4KKyAqIFRoYXQgbWVhbnMgd2UgbXVzdCB1c2Ugc29tZSBpbml0Y2FsbCBiZXR3ZWVuIHN1YnN5c19pbml0Y2FsbCBhbmQKKyAqIGRldmljZV9pbml0Y2FsbC4KKyAqLworZnNfaW5pdGNhbGwobWNiX2luaXQpOworbW9kdWxlX2V4aXQobWNiX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1FTiBDaGFtZWxlb24gQnVzIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLWludGVybmFsLmggYi9kcml2ZXJzL21jYi9tY2ItaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU2ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tY2IvbWNiLWludGVybmFsLmgKQEAgLTAsMCArMSwxMTggQEAKKyNpZm5kZWYgX19NQ0JfSU5URVJOQUwKKyNkZWZpbmUgX19NQ0JfSU5URVJOQUwKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NRU4JCTB4MWE4OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FTl9DSEFNRUxFT04JMHg0ZDQ1CisjZGVmaW5lIENIQU1FTEVPTl9GSUxFTkFNRV9MRU4JCTEyCisjZGVmaW5lIENIQU1FTEVPTlYyX01BR0lDCQkweGFiY2UKKworZW51bSBjaGFtZWxlb25fZGVzY3JpcHRvcl90eXBlIHsKKwlDSEFNRUxFT05fRFRZUEVfR0VORVJBTCA9IDB4MCwKKwlDSEFNRUxFT05fRFRZUEVfQlJJREdFID0gMHgxLAorCUNIQU1FTEVPTl9EVFlQRV9DUFUgPSAweDIsCisJQ0hBTUVMRU9OX0RUWVBFX0JBUiA9IDB4MywKKwlDSEFNRUxFT05fRFRZUEVfRU5EID0gMHhmLAorfTsKKworZW51bSBjaGFtZWxlb25fYnVzX3R5cGUgeworCUNIQU1FTEVPTl9CVVNfV0lTSEJPTkUsCisJQ0hBTUVMRU9OX0JVU19BVkFMT04sCisJQ0hBTUVMRU9OX0JVU19MUEMsCisJQ0hBTUVMRU9OX0JVU19JU0EsCit9OworCisvKioKKyAqIHN0cnVjdCBjaGFtZWxlb25fZnBnYV9oZWFkZXIKKyAqCisgKiBAcmV2aXNpb246CVJldmlzb24gb2YgQ2hhbWVsZW9uIHRhYmxlIGluIEZQR0EKKyAqIEBtb2RlbDoJQ2hhbWVsZW9uIHRhYmxlIG1vZGVsIEFTQ0lJIGNoYXIKKyAqIEBtaW5vcjoJUmV2aXNpb24gbWlub3IKKyAqIEBidXNfdHlwZToJQnVzIHR5cGUgKHVzdWFsbHkgJUNIQU1FTEVPTl9CVVNfV0lTSEJPTkUpCisgKiBAbWFnaWM6CUNoYW1lbGVvbiBoZWFkZXIgbWFnaWMgbnVtYmVyICgweGFiY2UgZm9yIHZlcnNpb24gMikKKyAqIEByZXNlcnZlZDoJUmVzZXJ2ZWQKKyAqIEBmaWxlbmFtZToJRmlsZW5hbWUgb2YgRlBHQSBiaXRzdHJlYW0KKyAqLworc3RydWN0IGNoYW1lbGVvbl9mcGdhX2hlYWRlciB7CisJdTggcmV2aXNpb247CisJY2hhciBtb2RlbDsKKwl1OCBtaW5vcjsKKwl1OCBidXNfdHlwZTsKKwl1MTYgbWFnaWM7CisJdTE2IHJlc2VydmVkOworCS8qIFRoaXMgb25lIGhhcyBubyAnXDAnIGF0IHRoZSBlbmQhISEgKi8KKwljaGFyIGZpbGVuYW1lW0NIQU1FTEVPTl9GSUxFTkFNRV9MRU5dOworfSBfX3BhY2tlZDsKKyNkZWZpbmUgSEVBREVSX01BR0lDX09GRlNFVCAweDQKKworLyoqCisgKiBzdHJ1Y3QgY2hhbWVsZW9uX2dkZCAtIENoYW1lbGVvbiBHZW5lcmFsIERldmljZSBEZXNjcmlwdG9yCisgKgorICogQGlycToJdGhlIHBvc2l0aW9uIGluIHRoZSBGUEdBJ3MgSVJRIGNvbnRyb2xsZXIgdmVjdG9yCisgKiBAcmV2Ogl0aGUgcmV2aXNpb24gb2YgdGhlIHZhcmlhbnQncyBpbXBsZW1lbnRhdGlvbgorICogQHZhcjoJdGhlIHZhcmlhbnQgb2YgdGhlIElQIGNvcmUKKyAqIEBkZXY6CXRoZSBkZXZpY2UgIHRoZSBJUCBjb3JlIGlzCisgKiBAZHR5cGU6CWRldmljZSBkZXNjcmlwdG9yIHR5cGUKKyAqIEBiYXI6CUJBUiBvZmZzZXQgdGhhdCBtdXN0IGJlIGFkZGVkIHRvIG1vZHVsZSBvZmZzZXQKKyAqIEBpbnN0Ogl0aGUgaW5zdGFuY2UgbnVtYmVyIG9mIHRoZSBkZXZpY2UsIDAgaXMgZmlyc3QgaW5zdGFuY2UKKyAqIEBncm91cDoJdGhlIGdyb3VwIHRoZSBkZXZpY2UgYmVsb25ncyB0byAoMCA9IG5vIGdyb3VwKQorICogQHJlc2VydmVkOglyZXNlcnZlZAorICogQG9mZnNldDoJYmVnaW5uaW5nIG9mIHRoZSBhZGRyZXNzIHdpbmRvdyBvZiBkZXNpcmVkIG1vZHVsZQorICogQHNpemU6CXNpemUgb2YgdGhlIG1vZHVsZSdzIGFkZHJlc3Mgd2luZG93CisgKi8KK3N0cnVjdCBjaGFtZWxlb25fZ2RkIHsKKwlfX2xlMzIgcmVnMTsKKwlfX2xlMzIgcmVnMjsKKwlfX2xlMzIgb2Zmc2V0OworCV9fbGUzMiBzaXplOworCit9IF9fcGFja2VkOworCisvKiBHREQgUmVnaXN0ZXIgMSBmaWVsZHMgKi8KKyNkZWZpbmUgR0REX0lSUSh4KSAoKHgpICYgMHgxZikKKyNkZWZpbmUgR0REX1JFVih4KSAoKCh4KSA+PiA1KSAmIDB4M2YpCisjZGVmaW5lIEdERF9WQVIoeCkgKCgoeCkgPj4gMTEpICYgMHgzZikKKyNkZWZpbmUgR0REX0RFVih4KSAoKCh4KSA+PiAxOCkgJiAweDNmZikKKyNkZWZpbmUgR0REX0RUWSh4KSAoKCh4KSA+PiAyOCkgJiAweGYpCisKKy8qIEdERCBSZWdpc3RlciAyIGZpZWxkcyAqLworI2RlZmluZSBHRERfQkFSKHgpICgoeCkgJiAweDcpCisjZGVmaW5lIEdERF9JTlMoeCkgKCgoeCkgPj4gMykgJiAweDNmKQorI2RlZmluZSBHRERfR1JQKHgpICgoKHgpID4+IDkpICYgMHgzZikKKworLyoqCisgKiBzdHJ1Y3QgY2hhbWVsZW9uX2JkZCAtIENoYW1lbGVvbiBCcmlkZ2UgRGV2aWNlIERlc2NyaXB0b3IKKyAqCisgKiBAaXJxOgl0aGUgcG9zaXRpb24gaW4gdGhlIEZQR0EncyBJUlEgY29udHJvbGxlciB2ZWN0b3IKKyAqIEByZXY6CXRoZSByZXZpc2lvbiBvZiB0aGUgdmFyaWFudCdzIGltcGxlbWVudGF0aW9uCisgKiBAdmFyOgl0aGUgdmFyaWFudCBvZiB0aGUgSVAgY29yZQorICogQGRldjoJdGhlIGRldmljZSAgdGhlIElQIGNvcmUgaXMKKyAqIEBkdHlwZToJZGV2aWNlIGRlc2NyaXB0b3IgdHlwZQorICogQGJhcjoJQkFSIG9mZnNldCB0aGF0IG11c3QgYmUgYWRkZWQgdG8gbW9kdWxlIG9mZnNldAorICogQGluc3Q6CXRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhlIGRldmljZSwgMCBpcyBmaXJzdCBpbnN0YW5jZQorICogQGRiYXI6CWRlc3RpbmF0aW9uIGJhciBmcm9tIHRoZSBidXMgX2JlaGluZF8gdGhlIGJyaWRnZQorICogQGNoYW1vZmY6CW9mZnNldCB3aXRoaW4gdGhlIEJBUiBvZiB0aGUgc291cmNlIGJ1cworICogQG9mZnNldDoKKyAqIEBzaXplOgorICovCitzdHJ1Y3QgY2hhbWVsZW9uX2JkZCB7CisJdW5zaWduZWQgaW50IGlycTo2OworCXVuc2lnbmVkIGludCByZXY6NjsKKwl1bnNpZ25lZCBpbnQgdmFyOjY7CisJdW5zaWduZWQgaW50IGRldjoxMDsKKwl1bnNpZ25lZCBpbnQgZHR5cGU6NDsKKwl1bnNpZ25lZCBpbnQgYmFyOjM7CisJdW5zaWduZWQgaW50IGluc3Q6NjsKKwl1bnNpZ25lZCBpbnQgZGJhcjozOworCXVuc2lnbmVkIGludCBncm91cDo2OworCXVuc2lnbmVkIGludCByZXNlcnZlZDoxNDsKKwl1MzIgY2hhbW9mZjsKKwl1MzIgb2Zmc2V0OworCXUzMiBzaXplOworfSBfX3BhY2tlZDsKKworaW50IGNoYW1lbGVvbl9wYXJzZV9jZWxscyhzdHJ1Y3QgbWNiX2J1cyAqYnVzLCBwaHlzX2FkZHJfdCBtYXBiYXNlLAorCQkJICB2b2lkIF9faW9tZW0gKmJhc2UpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1wYXJzZS5jIGIvZHJpdmVycy9tY2IvbWNiLXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNzhiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWNiL21jYi1wYXJzZS5jCkBAIC0wLDAgKzEsMTU5IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tY2IuaD4KKworI2luY2x1ZGUgIm1jYi1pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbWNiX3BhcnNlX3ByaXYgeworCXBoeXNfYWRkcl90IG1hcGJhc2U7CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworI2RlZmluZSBmb3JfZWFjaF9jaGFtZWxlb25fY2VsbChkdHlwZSwgcCkJXAorCWZvciAoKGR0eXBlKSA9IGdldF9uZXh0X2R0eXBlKChwKSk7CVwKKwkgICAgIChkdHlwZSkgIT0gQ0hBTUVMRU9OX0RUWVBFX0VORDsJXAorCSAgICAgKGR0eXBlKSA9IGdldF9uZXh0X2R0eXBlKChwKSkpCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZ2V0X25leHRfZHR5cGUodm9pZCBfX2lvbWVtICpwKQoreworCXVpbnQzMl90IGR0eXBlOworCisJZHR5cGUgPSByZWFkbChwKTsKKwlyZXR1cm4gZHR5cGUgPj4gMjg7Cit9CisKK3N0YXRpYyBpbnQgY2hhbWVsZW9uX3BhcnNlX2JkZChzdHJ1Y3QgbWNiX2J1cyAqYnVzLAorCQkJcGh5c19hZGRyX3QgbWFwYmFzZSwKKwkJCXZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGFtZWxlb25fcGFyc2VfZ2RkKHN0cnVjdCBtY2JfYnVzICpidXMsCisJCQlwaHlzX2FkZHJfdCBtYXBiYXNlLAorCQkJdm9pZCBfX2lvbWVtICpiYXNlKQoreworCXN0cnVjdCBjaGFtZWxlb25fZ2RkIF9faW9tZW0gKmdkZCA9CisJCShzdHJ1Y3QgY2hhbWVsZW9uX2dkZCBfX2lvbWVtICopIGJhc2U7CisJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXY7CisJdTMyIG9mZnNldDsKKwl1MzIgc2l6ZTsKKwlpbnQgcmV0OworCV9fbGUzMiByZWcxOworCV9fbGUzMiByZWcyOworCisJbWRldiA9IG1jYl9hbGxvY19kZXYoYnVzKTsKKwlpZiAoIW1kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVnMSA9IHJlYWRsKCZnZGQtPnJlZzEpOworCXJlZzIgPSByZWFkbCgmZ2RkLT5yZWcyKTsKKwlvZmZzZXQgPSByZWFkbCgmZ2RkLT5vZmZzZXQpOworCXNpemUgPSByZWFkbCgmZ2RkLT5zaXplKTsKKworCW1kZXYtPmlkID0gR0REX0RFVihyZWcxKTsKKwltZGV2LT5yZXYgPSBHRERfUkVWKHJlZzEpOworCW1kZXYtPnZhciA9IEdERF9WQVIocmVnMSk7CisJbWRldi0+YmFyID0gR0REX0JBUihyZWcxKTsKKwltZGV2LT5ncm91cCA9IEdERF9HUlAocmVnMik7CisJbWRldi0+aW5zdCA9IEdERF9JTlMocmVnMik7CisKKwlwcl9kZWJ1ZygiRm91bmQgYSAxNnolMDNkXG4iLCBtZGV2LT5pZCk7CisKKwltZGV2LT5pcnEuc3RhcnQgPSBHRERfSVJRKHJlZzEpOworCW1kZXYtPmlycS5lbmQgPSBHRERfSVJRKHJlZzEpOworCW1kZXYtPmlycS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJbWRldi0+bWVtLnN0YXJ0ID0gbWFwYmFzZSArIG9mZnNldDsKKwltZGV2LT5tZW0uZW5kID0gbWRldi0+bWVtLnN0YXJ0ICsgc2l6ZSAtIDE7CisJbWRldi0+bWVtLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwltZGV2LT5pc19hZGRlZCA9IGZhbHNlOworCisJcmV0ID0gbWNiX2RldmljZV9yZWdpc3RlcihidXMsIG1kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCitlcnI6CisJbWNiX2ZyZWVfZGV2KG1kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGNoYW1lbGVvbl9wYXJzZV9jZWxscyhzdHJ1Y3QgbWNiX2J1cyAqYnVzLCBwaHlzX2FkZHJfdCBtYXBiYXNlLAorCQkJdm9pZCBfX2lvbWVtICpiYXNlKQoreworCWNoYXIgX19pb21lbSAqcCA9IGJhc2U7CisJc3RydWN0IGNoYW1lbGVvbl9mcGdhX2hlYWRlciAqaGVhZGVyOworCXVpbnQzMl90IGR0eXBlOworCWludCBudW1fY2VsbHMgPSAwOworCWludCByZXQgPSAwOworCXUzMiBoc2l6ZTsKKworCWhzaXplID0gc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fZnBnYV9oZWFkZXIpOworCisJaGVhZGVyID0ga3phbGxvYyhoc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZWFkZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRXh0cmFjdCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKwltZW1jcHlfZnJvbWlvKGhlYWRlciwgcCwgaHNpemUpOworCS8qIFdlIG9ubHkgc3VwcG9ydCBjaGFtZWxlb24gdjIgYXQgdGhlIG1vbWVudCAqLworCWhlYWRlci0+bWFnaWMgPSBsZTE2X3RvX2NwdShoZWFkZXItPm1hZ2ljKTsKKwlpZiAoaGVhZGVyLT5tYWdpYyAhPSBDSEFNRUxFT05WMl9NQUdJQykgeworCQlwcl9lcnIoIlVuc3VwcG9ydGVkIGNoYW1lbGVvbiB2ZXJzaW9uIDB4JXhcbiIsCisJCQkJaGVhZGVyLT5tYWdpYyk7CisJCWtmcmVlKGhlYWRlcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwICs9IGhzaXplOworCisJcHJfZGVidWcoImhlYWRlci0+cmV2aXNpb24gPSAlZFxuIiwgaGVhZGVyLT5yZXZpc2lvbik7CisJcHJfZGVidWcoImhlYWRlci0+bW9kZWwgPSAweCV4ICgnJWMnKVxuIiwgaGVhZGVyLT5tb2RlbCwKKwkJaGVhZGVyLT5tb2RlbCk7CisJcHJfZGVidWcoImhlYWRlci0+bWlub3IgPSAlZFxuIiwgaGVhZGVyLT5taW5vcik7CisJcHJfZGVidWcoImhlYWRlci0+YnVzX3R5cGUgPSAweCV4XG4iLCBoZWFkZXItPmJ1c190eXBlKTsKKworCisJcHJfZGVidWcoImhlYWRlci0+bWFnaWMgPSAweCV4XG4iLCBoZWFkZXItPm1hZ2ljKTsKKwlwcl9kZWJ1ZygiaGVhZGVyLT5maWxlbmFtZSA9IFwiJS4qc1wiXG4iLCBDSEFNRUxFT05fRklMRU5BTUVfTEVOLAorCQloZWFkZXItPmZpbGVuYW1lKTsKKworCWZvcl9lYWNoX2NoYW1lbGVvbl9jZWxsKGR0eXBlLCBwKSB7CisJCXN3aXRjaCAoZHR5cGUpIHsKKwkJY2FzZSBDSEFNRUxFT05fRFRZUEVfR0VORVJBTDoKKwkJCXJldCA9IGNoYW1lbGVvbl9wYXJzZV9nZGQoYnVzLCBtYXBiYXNlLCBwKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJcCArPSBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9nZGQpOworCQkJYnJlYWs7CisJCWNhc2UgQ0hBTUVMRU9OX0RUWVBFX0JSSURHRToKKwkJCWNoYW1lbGVvbl9wYXJzZV9iZGQoYnVzLCBtYXBiYXNlLCBwKTsKKwkJCXAgKz0gc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fYmRkKTsKKwkJCWJyZWFrOworCQljYXNlIENIQU1FTEVPTl9EVFlQRV9FTkQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiSW52YWxpZCBjaGFtZWxlb24gZGVzY3JpcHRvciB0eXBlIDB4JXhcbiIsCisJCQkJZHR5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbnVtX2NlbGxzKys7CisJfQorCisJaWYgKG51bV9jZWxscyA9PSAwKQorCQludW1fY2VsbHMgPSAtRUlOVkFMOworCisJa2ZyZWUoaGVhZGVyKTsKKwlyZXR1cm4gbnVtX2NlbGxzOworCitvdXQ6CisJa2ZyZWUoaGVhZGVyKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2hhbWVsZW9uX3BhcnNlX2NlbGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1wY2kuYyBiL2RyaXZlcnMvbWNiL21jYi1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM3NDJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tY2IvbWNiLXBjaS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogTUVOIENoYW1lbGVvbiBCdXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IE1FTiBNaWtyb2VsZWt0cm9uaWsgR21iSCAod3d3Lm1lbi5kZSkKKyAqIEF1dGhvcjogSm9oYW5uZXMgVGh1bXNoaXJuIDxqb2hhbm5lcy50aHVtc2hpcm5AbWVuLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2IuaD4KKworI2luY2x1ZGUgIm1jYi1pbnRlcm5hbC5oIgorCitzdHJ1Y3QgcHJpdiB7CisJc3RydWN0IG1jYl9idXMgKmJ1czsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitzdGF0aWMgaW50IG1jYl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcHJpdiAqcHJpdjsKKwlwaHlzX2FkZHJfdCBtYXBiYXNlOworCWludCByZXQ7CisJaW50IG51bV9jZWxsczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltYXBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWlmICghbWFwYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBQQ0kgcmVzb3VyY2VcbiIpOworCQlnb3RvIGVycl9zdGFydDsKKwl9CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgS0JVSUxEX01PRE5BTUUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgUENJIEJBUnNcbiIpOworCQlnb3RvIGVycl9zdGFydDsKKwl9CisKKwlwcml2LT5iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOworCWlmICghcHJpdi0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgaW9yZW1hcFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCk7CisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlyZXQgPSAtRU5PVFNVUFA7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJJTyBtYXBwZWQgUENJIGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCXByaXYtPmJ1cyA9IG1jYl9hbGxvY19idXMoKTsKKworCXJldCA9IGNoYW1lbGVvbl9wYXJzZV9jZWxscyhwcml2LT5idXMsIG1hcGJhc2UsIHByaXYtPmJhc2UpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kcnZkYXRhOworCW51bV9jZWxscyA9IHJldDsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIkZvdW5kICVkIGNlbGxzXG4iLCBudW1fY2VsbHMpOworCisJbWNiX2J1c19hZGRfZGV2aWNlcyhwcml2LT5idXMpOworCitlcnJfZHJ2ZGF0YToKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5iYXNlKTsKK2Vycl9pb3JlbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKK2Vycl9zdGFydDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWNiX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwltY2JfcmVsZWFzZV9idXMocHJpdi0+YnVzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1jYl9wY2lfdGJsW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUVOLCBQQ0lfREVWSUNFX0lEX01FTl9DSEFNRUxFT04pIH0sCisJeyAwIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1jYl9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG1jYl9wY2lfZHJpdmVyID0geworCS5uYW1lID0gIm1jYi1wY2kiLAorCS5pZF90YWJsZSA9IG1jYl9wY2lfdGJsLAorCS5wcm9iZSA9IG1jYl9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IG1jYl9wY2lfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BjaV9kcml2ZXIobWNiX3BjaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKb2hhbm5lcyBUaHVtc2hpcm4gPGpvaGFubmVzLnRodW1zaGlybkBtZW4uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DQiBvdmVyIFBDSSBzdXBwb3J0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9LY29uZmlnIGIvZHJpdmVycy9tZC9iY2FjaGUvS2NvbmZpZwppbmRleCAyNjM4NDE3Li40ZDIwMDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL0tjb25maWcKQEAgLTI0LDExICsyNCwzIEBACiAJS2VlcHMgYWxsIGFjdGl2ZSBjbG9zdXJlcyBpbiBhIGxpbmtlZCBsaXN0IGFuZCBwcm92aWRlcyBhIGRlYnVnZnMKIAlpbnRlcmZhY2UgdG8gbGlzdCB0aGVtLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBzZWUgYXN5bmNocm9ub3VzCiAJb3BlcmF0aW9ucyB0aGF0IGdldCBzdHVjay4KLQotIyBjZ3JvdXAgY29kZSBuZWVkcyB0byBiZSB1cGRhdGVkOgotIwotI2NvbmZpZyBDR1JPVVBfQkNBQ0hFCi0jCWJvb2wgIkNncm91cCBjb250cm9scyBmb3IgYmNhY2hlIgotIwlkZXBlbmRzIG9uIEJDQUNIRSAmJiBCTEtfQ0dST1VQCi0jCS0tLWhlbHAtLS0KLSMJVE9ETwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKaW5kZXggYzBkMzdkMC4uNDQzZDAzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCkBAIC03OCwxMiArNzgsNiBAQAogCWNhLT5zZXQtPm5lZWRfZ2MgPSBtYXgoY2EtPnNldC0+bmVlZF9nYywgYnVja2V0X2djX2dlbihiKSk7CiAJV0FSTl9PTl9PTkNFKGNhLT5zZXQtPm5lZWRfZ2MgPiBCVUNLRVRfR0NfR0VOX01BWCk7CiAKLQlpZiAoQ0FDSEVfU1lOQygmY2EtPnNldC0+c2IpKSB7Ci0JCWNhLT5uZWVkX3NhdmVfcHJpbyA9IG1heChjYS0+bmVlZF9zYXZlX3ByaW8sCi0JCQkJCSBidWNrZXRfZGlza19nZW4oYikpOwotCQlXQVJOX09OX09OQ0UoY2EtPm5lZWRfc2F2ZV9wcmlvID4gQlVDS0VUX0RJU0tfR0VOX01BWCk7Ci0JfQotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTIwLDUxICsxMTQsNDUgQEAKIAltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKIH0KIAotLyogQWxsb2NhdGlvbiAqLworLyoKKyAqIEJhY2tncm91bmQgYWxsb2NhdGlvbiB0aHJlYWQ6IHNjYW5zIGZvciBidWNrZXRzIHRvIGJlIGludmFsaWRhdGVkLAorICogaW52YWxpZGF0ZXMgdGhlbSwgcmV3cml0ZXMgcHJpb3MvZ2VucyAobWFya2luZyB0aGVtIGFzIGludmFsaWRhdGVkIG9uIGRpc2spLAorICogdGhlbiBvcHRpb25hbGx5IGlzc3VlcyBkaXNjYXJkIGNvbW1hbmRzIHRvIHRoZSBuZXdseSBmcmVlIGJ1Y2tldHMsIHRoZW4gcHV0cworICogdGhlbSBvbiB0aGUgdmFyaW91cyBmcmVlbGlzdHMuCisgKi8KIAogc3RhdGljIGlubGluZSBib29sIGNhbl9pbmNfYnVja2V0X2dlbihzdHJ1Y3QgYnVja2V0ICpiKQogewotCXJldHVybiBidWNrZXRfZ2NfZ2VuKGIpIDwgQlVDS0VUX0dDX0dFTl9NQVggJiYKLQkJYnVja2V0X2Rpc2tfZ2VuKGIpIDwgQlVDS0VUX0RJU0tfR0VOX01BWDsKKwlyZXR1cm4gYnVja2V0X2djX2dlbihiKSA8IEJVQ0tFVF9HQ19HRU5fTUFYOwogfQogCi1ib29sIGJjaF9idWNrZXRfYWRkX3VudXNlZChzdHJ1Y3QgY2FjaGUgKmNhLCBzdHJ1Y3QgYnVja2V0ICpiKQorYm9vbCBiY2hfY2FuX2ludmFsaWRhdGVfYnVja2V0KHN0cnVjdCBjYWNoZSAqY2EsIHN0cnVjdCBidWNrZXQgKmIpCiB7Ci0JQlVHX09OKEdDX01BUksoYikgfHwgR0NfU0VDVE9SU19VU0VEKGIpKTsKKwlCVUdfT04oIWNhLT5zZXQtPmdjX21hcmtfdmFsaWQpOwogCi0JaWYgKENBQ0hFX1JFUExBQ0VNRU5UKCZjYS0+c2IpID09IENBQ0hFX1JFUExBQ0VNRU5UX0ZJRk8pIHsKLQkJdW5zaWduZWQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUkVTRVJWRV9OT05FOyBpKyspCi0JCQlpZiAoIWZpZm9fZnVsbCgmY2EtPmZyZWVbaV0pKQotCQkJCWdvdG8gYWRkOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci1hZGQ6Ci0JYi0+cHJpbyA9IDA7Ci0KLQlpZiAoY2FuX2luY19idWNrZXRfZ2VuKGIpICYmCi0JICAgIGZpZm9fcHVzaCgmY2EtPnVudXNlZCwgYiAtIGNhLT5idWNrZXRzKSkgewotCQlhdG9taWNfaW5jKCZiLT5waW4pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIGNhbl9pbnZhbGlkYXRlX2J1Y2tldChzdHJ1Y3QgY2FjaGUgKmNhLCBzdHJ1Y3QgYnVja2V0ICpiKQotewotCXJldHVybiBHQ19NQVJLKGIpID09IEdDX01BUktfUkVDTEFJTUFCTEUgJiYKKwlyZXR1cm4gKCFHQ19NQVJLKGIpIHx8CisJCUdDX01BUksoYikgPT0gR0NfTUFSS19SRUNMQUlNQUJMRSkgJiYKIAkJIWF0b21pY19yZWFkKCZiLT5waW4pICYmCiAJCWNhbl9pbmNfYnVja2V0X2dlbihiKTsKIH0KIAotc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9vbmVfYnVja2V0KHN0cnVjdCBjYWNoZSAqY2EsIHN0cnVjdCBidWNrZXQgKmIpCit2b2lkIF9fYmNoX2ludmFsaWRhdGVfb25lX2J1Y2tldChzdHJ1Y3QgY2FjaGUgKmNhLCBzdHJ1Y3QgYnVja2V0ICpiKQogeworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhLT5zZXQtPmJ1Y2tldF9sb2NrKTsKKwlCVUdfT04oR0NfTUFSSyhiKSAmJiBHQ19NQVJLKGIpICE9IEdDX01BUktfUkVDTEFJTUFCTEUpOworCisJaWYgKEdDX1NFQ1RPUlNfVVNFRChiKSkKKwkJdHJhY2VfYmNhY2hlX2ludmFsaWRhdGUoY2EsIGIgLSBjYS0+YnVja2V0cyk7CisKIAliY2hfaW5jX2dlbihjYSwgYik7CiAJYi0+cHJpbyA9IElOSVRJQUxfUFJJTzsKIAlhdG9taWNfaW5jKCZiLT5waW4pOworfQorCitzdGF0aWMgdm9pZCBiY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KHN0cnVjdCBjYWNoZSAqY2EsIHN0cnVjdCBidWNrZXQgKmIpCit7CisJX19iY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKKwogCWZpZm9fcHVzaCgmY2EtPmZyZWVfaW5jLCBiIC0gY2EtPmJ1Y2tldHMpOwogfQogCkBAIC0xOTUsMjAgKzE4Myw3IEBACiAJY2EtPmhlYXAudXNlZCA9IDA7CiAKIAlmb3JfZWFjaF9idWNrZXQoYiwgY2EpIHsKLQkJLyoKLQkJICogSWYgd2UgZmlsbCB1cCB0aGUgdW51c2VkIGxpc3QsIGlmIHdlIHRoZW4gcmV0dXJuIGJlZm9yZQotCQkgKiBhZGRpbmcgYW55dGhpbmcgdG8gdGhlIGZyZWVfaW5jIGxpc3Qgd2UnbGwgc2tpcCB3cml0aW5nCi0JCSAqIHByaW9zL2dlbnMgYW5kIGp1c3QgZ28gYmFjayB0byBhbGxvY2F0aW5nIGZyb20gdGhlIHVudXNlZAotCQkgKiBsaXN0OgotCQkgKi8KLQkJaWYgKGZpZm9fZnVsbCgmY2EtPnVudXNlZCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFjYW5faW52YWxpZGF0ZV9idWNrZXQoY2EsIGIpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFHQ19TRUNUT1JTX1VTRUQoYikgJiYKLQkJICAgIGJjaF9idWNrZXRfYWRkX3VudXNlZChjYSwgYikpCisJCWlmICghYmNoX2Nhbl9pbnZhbGlkYXRlX2J1Y2tldChjYSwgYikpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIWhlYXBfZnVsbCgmY2EtPmhlYXApKQpAQCAtMjMzLDcgKzIwOCw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlpbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOworCQliY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKIAl9CiB9CiAKQEAgLTI0OSw4ICsyMjQsOCBAQAogCiAJCWIgPSBjYS0+YnVja2V0cyArIGNhLT5maWZvX2xhc3RfYnVja2V0Kys7CiAKLQkJaWYgKGNhbl9pbnZhbGlkYXRlX2J1Y2tldChjYSwgYikpCi0JCQlpbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOworCQlpZiAoYmNoX2Nhbl9pbnZhbGlkYXRlX2J1Y2tldChjYSwgYikpCisJCQliY2hfaW52YWxpZGF0ZV9vbmVfYnVja2V0KGNhLCBiKTsKIAogCQlpZiAoKytjaGVja2VkID49IGNhLT5zYi5uYnVja2V0cykgewogCQkJY2EtPmludmFsaWRhdGVfbmVlZHNfZ2MgPSAxOwpAQCAtMjc0LDggKzI0OSw4IEBACiAKIAkJYiA9IGNhLT5idWNrZXRzICsgbjsKIAotCQlpZiAoY2FuX2ludmFsaWRhdGVfYnVja2V0KGNhLCBiKSkKLQkJCWludmFsaWRhdGVfb25lX2J1Y2tldChjYSwgYik7CisJCWlmIChiY2hfY2FuX2ludmFsaWRhdGVfYnVja2V0KGNhLCBiKSkKKwkJCWJjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOwogCiAJCWlmICgrK2NoZWNrZWQgPj0gY2EtPnNiLm5idWNrZXRzIC8gMikgewogCQkJY2EtPmludmFsaWRhdGVfbmVlZHNfZ2MgPSAxOwpAQCAtMjg3LDggKzI2Miw3IEBACiAKIHN0YXRpYyB2b2lkIGludmFsaWRhdGVfYnVja2V0cyhzdHJ1Y3QgY2FjaGUgKmNhKQogewotCWlmIChjYS0+aW52YWxpZGF0ZV9uZWVkc19nYykKLQkJcmV0dXJuOworCUJVR19PTihjYS0+aW52YWxpZGF0ZV9uZWVkc19nYyk7CiAKIAlzd2l0Y2ggKENBQ0hFX1JFUExBQ0VNRU5UKCZjYS0+c2IpKSB7CiAJY2FzZSBDQUNIRV9SRVBMQUNFTUVOVF9MUlU6CkBAIC0zMDEsOCArMjc1LDYgQEAKIAkJaW52YWxpZGF0ZV9idWNrZXRzX3JhbmRvbShjYSk7CiAJCWJyZWFrOwogCX0KLQotCXRyYWNlX2JjYWNoZV9hbGxvY19pbnZhbGlkYXRlKGNhKTsKIH0KIAogI2RlZmluZSBhbGxvY2F0b3Jfd2FpdChjYSwgY29uZCkJCQkJCVwKQEAgLTM1MCwxNyArMzIyLDEwIEBACiAJCSAqIHBvc3NpYmx5IGlzc3VlIGRpc2NhcmRzIHRvIHRoZW0sIHRoZW4gd2UgYWRkIHRoZSBidWNrZXQgdG8KIAkJICogdGhlIGZyZWUgbGlzdDoKIAkJICovCi0JCXdoaWxlICgxKSB7CisJCXdoaWxlICghZmlmb19lbXB0eSgmY2EtPmZyZWVfaW5jKSkgewogCQkJbG9uZyBidWNrZXQ7CiAKLQkJCWlmICgoIWF0b21pY19yZWFkKCZjYS0+c2V0LT5wcmlvX2Jsb2NrZWQpIHx8Ci0JCQkgICAgICFDQUNIRV9TWU5DKCZjYS0+c2V0LT5zYikpICYmCi0JCQkgICAgIWZpZm9fZW1wdHkoJmNhLT51bnVzZWQpKQotCQkJCWZpZm9fcG9wKCZjYS0+dW51c2VkLCBidWNrZXQpOwotCQkJZWxzZSBpZiAoIWZpZm9fZW1wdHkoJmNhLT5mcmVlX2luYykpCi0JCQkJZmlmb19wb3AoJmNhLT5mcmVlX2luYywgYnVja2V0KTsKLQkJCWVsc2UKLQkJCQlicmVhazsKKwkJCWZpZm9fcG9wKCZjYS0+ZnJlZV9pbmMsIGJ1Y2tldCk7CiAKIAkJCWlmIChjYS0+ZGlzY2FyZCkgewogCQkJCW11dGV4X3VubG9jaygmY2EtPnNldC0+YnVja2V0X2xvY2spOwpAQCAtMzcxLDYgKzMzNiw3IEBACiAJCQl9CiAKIAkJCWFsbG9jYXRvcl93YWl0KGNhLCBiY2hfYWxsb2NhdG9yX3B1c2goY2EsIGJ1Y2tldCkpOworCQkJd2FrZV91cCgmY2EtPnNldC0+YnRyZWVfY2FjaGVfd2FpdCk7CiAJCQl3YWtlX3VwKCZjYS0+c2V0LT5idWNrZXRfd2FpdCk7CiAJCX0KIApAQCAtMzgwLDkgKzM0Niw5IEBACiAJCSAqIHRoZW0gdG8gdGhlIGZyZWVfaW5jIGxpc3Q6CiAJCSAqLwogCityZXRyeV9pbnZhbGlkYXRlOgogCQlhbGxvY2F0b3Jfd2FpdChjYSwgY2EtPnNldC0+Z2NfbWFya192YWxpZCAmJgotCQkJICAgICAgIChjYS0+bmVlZF9zYXZlX3ByaW8gPiA2NCB8fAotCQkJCSFjYS0+aW52YWxpZGF0ZV9uZWVkc19nYykpOworCQkJICAgICAgICFjYS0+aW52YWxpZGF0ZV9uZWVkc19nYyk7CiAJCWludmFsaWRhdGVfYnVja2V0cyhjYSk7CiAKIAkJLyoKQEAgLTM5MCwxMyArMzU2LDI4IEBACiAJCSAqIG5ldyBzdHVmZiB0byB0aGVtOgogCQkgKi8KIAkJYWxsb2NhdG9yX3dhaXQoY2EsICFhdG9taWNfcmVhZCgmY2EtPnNldC0+cHJpb19ibG9ja2VkKSk7Ci0JCWlmIChDQUNIRV9TWU5DKCZjYS0+c2V0LT5zYikgJiYKLQkJICAgICghZmlmb19lbXB0eSgmY2EtPmZyZWVfaW5jKSB8fAotCQkgICAgIGNhLT5uZWVkX3NhdmVfcHJpbyA+IDY0KSkKKwkJaWYgKENBQ0hFX1NZTkMoJmNhLT5zZXQtPnNiKSkgeworCQkJLyoKKwkJCSAqIFRoaXMgY291bGQgZGVhZGxvY2sgaWYgYW4gYWxsb2NhdGlvbiB3aXRoIGEgYnRyZWUKKwkJCSAqIG5vZGUgbG9ja2VkIGV2ZXIgYmxvY2tlZCAtIGhhdmluZyB0aGUgYnRyZWUgbm9kZQorCQkJICogbG9ja2VkIHdvdWxkIGJsb2NrIGdhcmJhZ2UgY29sbGVjdGlvbiwgYnV0IGhlcmUgd2UncmUKKwkJCSAqIHdhaXRpbmcgb24gZ2FyYmFnZSBjb2xsZWN0aW9uIGJlZm9yZSB3ZSBpbnZhbGlkYXRlCisJCQkgKiBhbmQgZnJlZSBhbnl0aGluZy4KKwkJCSAqCisJCQkgKiBCdXQgdGhpcyBzaG91bGQgYmUgc2FmZSBzaW5jZSB0aGUgYnRyZWUgY29kZSBhbHdheXMKKwkJCSAqIHVzZXMgYnRyZWVfY2hlY2tfcmVzZXJ2ZSgpIGJlZm9yZSBhbGxvY2F0aW5nIG5vdywgYW5kCisJCQkgKiBpZiBpdCBmYWlscyBpdCBibG9ja3Mgd2l0aG91dCBidHJlZSBub2RlcyBsb2NrZWQuCisJCQkgKi8KKwkJCWlmICghZmlmb19mdWxsKCZjYS0+ZnJlZV9pbmMpKQorCQkJCWdvdG8gcmV0cnlfaW52YWxpZGF0ZTsKKwogCQkJYmNoX3ByaW9fd3JpdGUoY2EpOworCQl9CiAJfQogfQogCisvKiBBbGxvY2F0aW9uICovCisKIGxvbmcgYmNoX2J1Y2tldF9hbGxvYyhzdHJ1Y3QgY2FjaGUgKmNhLCB1bnNpZ25lZCByZXNlcnZlLCBib29sIHdhaXQpCiB7CiAJREVGSU5FX1dBSVQodyk7CkBAIC00MDgsOCArMzg5LDEwIEBACiAJICAgIGZpZm9fcG9wKCZjYS0+ZnJlZVtyZXNlcnZlXSwgcikpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCF3YWl0KQorCWlmICghd2FpdCkgeworCQl0cmFjZV9iY2FjaGVfYWxsb2NfZmFpbChjYSwgcmVzZXJ2ZSk7CiAJCXJldHVybiAtMTsKKwl9CiAKIAlkbyB7CiAJCXByZXBhcmVfdG9fd2FpdCgmY2EtPnNldC0+YnVja2V0X3dhaXQsICZ3LApAQCAtNDI1LDYgKzQwOCw4IEBACiBvdXQ6CiAJd2FrZV91cF9wcm9jZXNzKGNhLT5hbGxvY190aHJlYWQpOwogCisJdHJhY2VfYmNhY2hlX2FsbG9jKGNhLCByZXNlcnZlKTsKKwogCWlmIChleHBlbnNpdmVfZGVidWdfY2hlY2tzKGNhLT5zZXQpKSB7CiAJCXNpemVfdCBpdGVyOwogCQlsb25nIGk7CkBAIC00MzgsOCArNDIzLDYgQEAKIAkJCQlCVUdfT04oaSA9PSByKTsKIAkJZmlmb19mb3JfZWFjaChpLCAmY2EtPmZyZWVfaW5jLCBpdGVyKQogCQkJQlVHX09OKGkgPT0gcik7Ci0JCWZpZm9fZm9yX2VhY2goaSwgJmNhLT51bnVzZWQsIGl0ZXIpCi0JCQlCVUdfT04oaSA9PSByKTsKIAl9CiAKIAliID0gY2EtPmJ1Y2tldHMgKyByOwpAQCAtNDYxLDE3ICs0NDQsMTkgQEAKIAlyZXR1cm4gcjsKIH0KIAordm9pZCBfX2JjaF9idWNrZXRfZnJlZShzdHJ1Y3QgY2FjaGUgKmNhLCBzdHJ1Y3QgYnVja2V0ICpiKQoreworCVNFVF9HQ19NQVJLKGIsIDApOworCVNFVF9HQ19TRUNUT1JTX1VTRUQoYiwgMCk7Cit9CisKIHZvaWQgYmNoX2J1Y2tldF9mcmVlKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBia2V5ICprKQogewogCXVuc2lnbmVkIGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykgewotCQlzdHJ1Y3QgYnVja2V0ICpiID0gUFRSX0JVQ0tFVChjLCBrLCBpKTsKLQotCQlTRVRfR0NfTUFSSyhiLCBHQ19NQVJLX1JFQ0xBSU1BQkxFKTsKLQkJU0VUX0dDX1NFQ1RPUlNfVVNFRChiLCAwKTsKLQkJYmNoX2J1Y2tldF9hZGRfdW51c2VkKFBUUl9DQUNIRShjLCBrLCBpKSwgYik7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQorCQlfX2JjaF9idWNrZXRfZnJlZShQVFJfQ0FDSEUoYywgaywgaSksCisJCQkJICBQVFJfQlVDS0VUKGMsIGssIGkpKTsKIH0KIAogaW50IF9fYmNoX2J1Y2tldF9hbGxvY19zZXQoc3RydWN0IGNhY2hlX3NldCAqYywgdW5zaWduZWQgcmVzZXJ2ZSwKQEAgLTcwOSwyNSArNjk0LDMgQEAKIAljYS0+YWxsb2NfdGhyZWFkID0gazsKIAlyZXR1cm4gMDsKIH0KLQotaW50IGJjaF9jYWNoZV9hbGxvY2F0b3JfaW5pdChzdHJ1Y3QgY2FjaGUgKmNhKQotewotCS8qCi0JICogUmVzZXJ2ZToKLQkgKiBQcmlvL2dlbiB3cml0ZXMgZmlyc3QKLQkgKiBUaGVuIDggZm9yIGJ0cmVlIGFsbG9jYXRpb25zCi0JICogVGhlbiBoYWxmIGZvciB0aGUgbW92aW5nIGdhcmJhZ2UgY29sbGVjdG9yCi0JICovCi0jaWYgMAotCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX1BSSU9dID0gMDsKLQotCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX01FVEFEQVRBXSA9IHByaW9fYnVja2V0cyhjYSk7Ci0KLQljYS0+d2F0ZXJtYXJrW1dBVEVSTUFSS19NT1ZJTkdHQ10gPSA4ICsKLQkJY2EtPndhdGVybWFya1tXQVRFUk1BUktfTUVUQURBVEFdOwotCi0JY2EtPndhdGVybWFya1tXQVRFUk1BUktfTk9ORV0gPSBjYS0+ZnJlZS5zaXplIC8gMiArCi0JCWNhLT53YXRlcm1hcmtbV0FURVJNQVJLX01PVklOR0dDXTsKLSNlbmRpZgotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYmNhY2hlLmggYi9kcml2ZXJzL21kL2JjYWNoZS9iY2FjaGUuaAppbmRleCBhNGM3MzA2Li44MmM5YzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9iY2FjaGUuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9iY2FjaGUuaApAQCAtMTk1LDkgKzE5NSw3IEBACiAJYXRvbWljX3QJcGluOwogCXVpbnQxNl90CXByaW87CiAJdWludDhfdAkJZ2VuOwotCXVpbnQ4X3QJCWRpc2tfZ2VuOwogCXVpbnQ4X3QJCWxhc3RfZ2M7IC8qIE1vc3Qgb3V0IG9mIGRhdGUgZ2VuIGluIHRoZSBidHJlZSAqLwotCXVpbnQ4X3QJCWdjX2dlbjsKIAl1aW50MTZfdAlnY19tYXJrOyAvKiBCaXRmaWVsZCB1c2VkIGJ5IEdDLiBTZWUgYmVsb3cgZm9yIGZpZWxkICovCiB9OwogCkBAIC0yMDcsOSArMjA1LDkgQEAKICAqLwogCiBCSVRNQVNLKEdDX01BUkssCSBzdHJ1Y3QgYnVja2V0LCBnY19tYXJrLCAwLCAyKTsKLSNkZWZpbmUgR0NfTUFSS19SRUNMQUlNQUJMRQkwCi0jZGVmaW5lIEdDX01BUktfRElSVFkJCTEKLSNkZWZpbmUgR0NfTUFSS19NRVRBREFUQQkyCisjZGVmaW5lIEdDX01BUktfUkVDTEFJTUFCTEUJMQorI2RlZmluZSBHQ19NQVJLX0RJUlRZCQkyCisjZGVmaW5lIEdDX01BUktfTUVUQURBVEEJMwogI2RlZmluZSBHQ19TRUNUT1JTX1VTRURfU0laRQkxMwogI2RlZmluZSBNQVhfR0NfU0VDVE9SU19VU0VECSh+KH4wVUxMIDw8IEdDX1NFQ1RPUlNfVVNFRF9TSVpFKSkKIEJJVE1BU0soR0NfU0VDVE9SU19VU0VELCBzdHJ1Y3QgYnVja2V0LCBnY19tYXJrLCAyLCBHQ19TRUNUT1JTX1VTRURfU0laRSk7CkBAIC00MjYsMTQgKzQyNCw5IEBACiAJICogdGhlaXIgbmV3IGdlbiB0byBkaXNrLiBBZnRlciBwcmlvX3dyaXRlKCkgZmluaXNoZXMgd3JpdGluZyB0aGUgbmV3CiAJICogZ2Vucy9wcmlvcywgdGhleSdsbCBiZSBtb3ZlZCB0byB0aGUgZnJlZSBsaXN0IChhbmQgcG9zc2libHkgZGlzY2FyZGVkCiAJICogaW4gdGhlIHByb2Nlc3MpCi0JICoKLQkgKiB1bnVzZWQ6IEdDIGZvdW5kIG5vdGhpbmcgcG9pbnRpbmcgaW50byB0aGVzZSBidWNrZXRzIChwb3NzaWJseQotCSAqIGJlY2F1c2UgYWxsIHRoZSBkYXRhIHRoZXkgY29udGFpbmVkIHdhcyBvdmVyd3JpdHRlbiksIHNvIHdlIG9ubHkKLQkgKiBuZWVkIHRvIGRpc2NhcmQgdGhlbSBiZWZvcmUgdGhleSBjYW4gYmUgbW92ZWQgdG8gdGhlIGZyZWUgbGlzdC4KIAkgKi8KIAlERUNMQVJFX0ZJRk8obG9uZywgZnJlZSlbUkVTRVJWRV9OUl07CiAJREVDTEFSRV9GSUZPKGxvbmcsIGZyZWVfaW5jKTsKLQlERUNMQVJFX0ZJRk8obG9uZywgdW51c2VkKTsKIAogCXNpemVfdAkJCWZpZm9fbGFzdF9idWNrZXQ7CiAKQEAgLTQ0MywxMiArNDM2LDYgQEAKIAlERUNMQVJFX0hFQVAoc3RydWN0IGJ1Y2tldCAqLCBoZWFwKTsKIAogCS8qCi0JICogbWF4KGdlbiAtIGRpc2tfZ2VuKSBmb3IgYWxsIGJ1Y2tldHMuIFdoZW4gaXQgZ2V0cyB0b28gYmlnIHdlIGhhdmUgdG8KLQkgKiBjYWxsIHByaW9fd3JpdGUoKSB0byBrZWVwIGdlbnMgZnJvbSB3cmFwcGluZy4KLQkgKi8KLQl1aW50OF90CQkJbmVlZF9zYXZlX3ByaW87Ci0KLQkvKgogCSAqIElmIG5vbnplcm8sIHdlIGtub3cgd2UgYXJlbid0IGdvaW5nIHRvIGZpbmQgYW55IGJ1Y2tldHMgdG8gaW52YWxpZGF0ZQogCSAqIHVudGlsIGEgZ2MgZmluaXNoZXMgLSBvdGhlcndpc2Ugd2UgY291bGQgcG9pbnRsZXNzbHkgYnVybiBhIHRvbiBvZgogCSAqIGNwdQpAQCAtNTYyLDE5ICs1NDksMTYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWJ0cmVlX2NhY2hlX2ZyZWVkOwogCiAJLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGJ0cmVlX2NhY2hlICsgYnRyZWVfY2FjaGVfZnJlZWFibGUgbGlzdHMgKi8KLQl1bnNpZ25lZAkJYnVja2V0X2NhY2hlX3VzZWQ7CisJdW5zaWduZWQJCWJ0cmVlX2NhY2hlX3VzZWQ7CiAKIAkvKgogCSAqIElmIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhIG5ldyBidHJlZSBub2RlIGFuZCB0aGF0CiAJICogYWxsb2NhdGlvbiBmYWlscywgd2UgY2FuIGNhbm5pYmFsaXplIGFub3RoZXIgbm9kZSBpbiB0aGUgYnRyZWUgY2FjaGUKLQkgKiB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uLiBIb3dldmVyLCBvbmx5IG9uZSB0aHJlYWQgY2FuIGJlIGRvaW5nIHRoaXMKLQkgKiBhdCBhIHRpbWUsIGZvciBvYnZpb3VzIHJlYXNvbnMgLSB0cnlfaGFyZGVyIGFuZCB0cnlfd2FpdCBhcmUKLQkgKiBiYXNpY2FsbHkgYSBsb2NrIGZvciB0aGlzIHRoYXQgd2UgY2FuIHdhaXQgb24gYXN5bmNocm9ub3VzbHkuIFRoZQotCSAqIGJ0cmVlX3Jvb3QoKSBtYWNybyByZWxlYXNlcyB0aGUgbG9jayB3aGVuIGl0IHJldHVybnMuCisJICogdG8gc2F0aXNmeSB0aGUgYWxsb2NhdGlvbiAtIGxvY2sgdG8gZ3VhcmFudGVlIG9ubHkgb25lIHRocmVhZCBkb2VzCisJICogdGhpcyBhdCBhIHRpbWU6CiAJICovCi0Jc3RydWN0IHRhc2tfc3RydWN0CSp0cnlfaGFyZGVyOwotCXdhaXRfcXVldWVfaGVhZF90CXRyeV93YWl0OwotCXVpbnQ2NF90CQl0cnlfaGFyZGVyX3N0YXJ0OworCXdhaXRfcXVldWVfaGVhZF90CWJ0cmVlX2NhY2hlX3dhaXQ7CisJc3RydWN0IHRhc2tfc3RydWN0CSpidHJlZV9jYWNoZV9hbGxvY19sb2NrOwogCiAJLyoKIAkgKiBXaGVuIHdlIGZyZWUgYSBidHJlZSBub2RlLCB3ZSBpbmNyZW1lbnQgdGhlIGdlbiBvZiB0aGUgYnVja2V0IHRoZQpAQCAtNjAzLDcgKzU4Nyw3IEBACiAJdWludDE2X3QJCW1pbl9wcmlvOwogCiAJLyoKLQkgKiBtYXgoZ2VuIC0gZ2NfZ2VuKSBmb3IgYWxsIGJ1Y2tldHMuIFdoZW4gaXQgZ2V0cyB0b28gYmlnIHdlIGhhdmUgdG8gZ2MKKwkgKiBtYXgoZ2VuIC0gbGFzdF9nYykgZm9yIGFsbCBidWNrZXRzLiBXaGVuIGl0IGdldHMgdG9vIGJpZyB3ZSBoYXZlIHRvIGdjCiAJICogdG8ga2VlcCBnZW5zIGZyb20gd3JhcHBpbmcgYXJvdW5kLgogCSAqLwogCXVpbnQ4X3QJCQluZWVkX2djOwpAQCAtNjI4LDYgKzYxMiw4IEBACiAJLyogTnVtYmVyIG9mIG1vdmluZyBHQyBiaW9zIGluIGZsaWdodCAqLwogCXN0cnVjdCBzZW1hcGhvcmUJbW92aW5nX2luX2ZsaWdodDsKIAorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSptb3ZpbmdfZ2Nfd3E7CisKIAlzdHJ1Y3QgYnRyZWUJCSpyb290OwogCiAjaWZkZWYgQ09ORklHX0JDQUNIRV9ERUJVRwpAQCAtNjY3LDcgKzY1Myw2IEBACiAJc3RydWN0IHRpbWVfc3RhdHMJYnRyZWVfZ2NfdGltZTsKIAlzdHJ1Y3QgdGltZV9zdGF0cwlidHJlZV9zcGxpdF90aW1lOwogCXN0cnVjdCB0aW1lX3N0YXRzCWJ0cmVlX3JlYWRfdGltZTsKLQlzdHJ1Y3QgdGltZV9zdGF0cwl0cnlfaGFyZGVyX3RpbWU7CiAKIAlhdG9taWNfbG9uZ190CQljYWNoZV9yZWFkX3JhY2VzOwogCWF0b21pY19sb25nX3QJCXdyaXRlYmFja19rZXlzX2RvbmU7CkBAIC04NTAsOSArODM1LDYgQEAKIC8qCiAgKiBidWNrZXRfZ2NfZ2VuKCkgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBidWNrZXQncyBjdXJyZW50IGdlbiBhbmQKICAqIHRoZSBvbGRlc3QgZ2VuIG9mIGFueSBwb2ludGVyIGludG8gdGhhdCBidWNrZXQgaW4gdGhlIGJ0cmVlIChsYXN0X2djKS4KLSAqCi0gKiBidWNrZXRfZGlza19nZW4oKSByZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZ2VuIGFuZCB0aGUgZ2VuCi0gKiBvbiBkaXNrOyB0aGV5J3JlIGJvdGggdXNlZCB0byBtYWtlIHN1cmUgZ2VucyBkb24ndCB3cmFwIGFyb3VuZC4KICAqLwogCiBzdGF0aWMgaW5saW5lIHVpbnQ4X3QgYnVja2V0X2djX2dlbihzdHJ1Y3QgYnVja2V0ICpiKQpAQCAtODYwLDEzICs4NDIsNyBAQAogCXJldHVybiBiLT5nZW4gLSBiLT5sYXN0X2djOwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgYnVja2V0X2Rpc2tfZ2VuKHN0cnVjdCBidWNrZXQgKmIpCi17Ci0JcmV0dXJuIGItPmdlbiAtIGItPmRpc2tfZ2VuOwotfQotCiAjZGVmaW5lIEJVQ0tFVF9HQ19HRU5fTUFYCTk2VQotI2RlZmluZSBCVUNLRVRfRElTS19HRU5fTUFYCTY0VQogCiAjZGVmaW5lIGtvYmpfYXR0cmlidXRlX3dyaXRlKG4sIGZuKQkJCQkJXAogCXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUga3N5c2ZzXyMjbiA9IF9fQVRUUihuLCBTX0lXVVNSLCBOVUxMLCBmbikKQEAgLTg5OSwxMSArODc1LDE0IEBACiAKIHVpbnQ4X3QgYmNoX2luY19nZW4oc3RydWN0IGNhY2hlICosIHN0cnVjdCBidWNrZXQgKik7CiB2b2lkIGJjaF9yZXNjYWxlX3ByaW9yaXRpZXMoc3RydWN0IGNhY2hlX3NldCAqLCBpbnQpOwotYm9vbCBiY2hfYnVja2V0X2FkZF91bnVzZWQoc3RydWN0IGNhY2hlICosIHN0cnVjdCBidWNrZXQgKik7CiAKLWxvbmcgYmNoX2J1Y2tldF9hbGxvYyhzdHJ1Y3QgY2FjaGUgKiwgdW5zaWduZWQsIGJvb2wpOworYm9vbCBiY2hfY2FuX2ludmFsaWRhdGVfYnVja2V0KHN0cnVjdCBjYWNoZSAqLCBzdHJ1Y3QgYnVja2V0ICopOwordm9pZCBfX2JjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoc3RydWN0IGNhY2hlICosIHN0cnVjdCBidWNrZXQgKik7CisKK3ZvaWQgX19iY2hfYnVja2V0X2ZyZWUoc3RydWN0IGNhY2hlICosIHN0cnVjdCBidWNrZXQgKik7CiB2b2lkIGJjaF9idWNrZXRfZnJlZShzdHJ1Y3QgY2FjaGVfc2V0ICosIHN0cnVjdCBia2V5ICopOwogCitsb25nIGJjaF9idWNrZXRfYWxsb2Moc3RydWN0IGNhY2hlICosIHVuc2lnbmVkLCBib29sKTsKIGludCBfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KHN0cnVjdCBjYWNoZV9zZXQgKiwgdW5zaWduZWQsCiAJCQkgICBzdHJ1Y3QgYmtleSAqLCBpbnQsIGJvb2wpOwogaW50IGJjaF9idWNrZXRfYWxsb2Nfc2V0KHN0cnVjdCBjYWNoZV9zZXQgKiwgdW5zaWduZWQsCkBAIC05NTQsMTMgKzkzMywxMCBAQAogdm9pZCBiY2hfb3Blbl9idWNrZXRzX2ZyZWUoc3RydWN0IGNhY2hlX3NldCAqKTsKIAogaW50IGJjaF9jYWNoZV9hbGxvY2F0b3Jfc3RhcnQoc3RydWN0IGNhY2hlICpjYSk7Ci1pbnQgYmNoX2NhY2hlX2FsbG9jYXRvcl9pbml0KHN0cnVjdCBjYWNoZSAqY2EpOwogCiB2b2lkIGJjaF9kZWJ1Z19leGl0KHZvaWQpOwogaW50IGJjaF9kZWJ1Z19pbml0KHN0cnVjdCBrb2JqZWN0ICopOwogdm9pZCBiY2hfcmVxdWVzdF9leGl0KHZvaWQpOwogaW50IGJjaF9yZXF1ZXN0X2luaXQodm9pZCk7Ci12b2lkIGJjaF9idHJlZV9leGl0KHZvaWQpOwotaW50IGJjaF9idHJlZV9pbml0KHZvaWQpOwogCiAjZW5kaWYgLyogX0JDQUNIRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmMgYi9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmMKaW5kZXggM2Y3NGI0Yi4uNTQ1NDE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuYwpAQCAtMjMsOCArMjMsOCBAQAogCWZvciAoayA9IGktPnN0YXJ0OyBrIDwgYnNldF9ia2V5X2xhc3QoaSk7IGsgPSBuZXh0KSB7CiAJCW5leHQgPSBia2V5X25leHQoayk7CiAKLQkJcHJpbnRrKEtFUk5fRVJSICJibG9jayAldSBrZXkgJWxpLyV1OiAiLCBzZXQsCi0JCSAgICAgICAodWludDY0X3QgKikgayAtIGktPmQsIGktPmtleXMpOworCQlwcmludGsoS0VSTl9FUlIgImJsb2NrICV1IGtleSAldS8ldTogIiwgc2V0LAorCQkgICAgICAgKHVuc2lnbmVkKSAoKHU2NCAqKSBrIC0gaS0+ZCksIGktPmtleXMpOwogCiAJCWlmIChiLT5vcHMtPmtleV9kdW1wKQogCQkJYi0+b3BzLT5rZXlfZHVtcChiLCBrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL2JzZXQuaAppbmRleCAwMDMyNjBmLi41ZjY3MjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9ic2V0LmgKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYnNldC5oCkBAIC00NzgsNiArNDc4LDEyIEBACiAJbC0+dG9wX3AgPSBsLT5rZXlzX3AgPSBsLT5pbmxpbmVfa2V5czsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGJjaF9rZXlsaXN0X2luaXRfc2luZ2xlKHN0cnVjdCBrZXlsaXN0ICpsLCBzdHJ1Y3QgYmtleSAqaykKK3sKKwlsLT5rZXlzID0gazsKKwlsLT50b3AgPSBia2V5X25leHQoayk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBiY2hfa2V5bGlzdF9wdXNoKHN0cnVjdCBrZXlsaXN0ICpsKQogewogCWwtPnRvcCA9IGJrZXlfbmV4dChsLT50b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMKaW5kZXggNWY5YzJhNi4uNzM0N2I2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5jCkBAIC02OCwxNSArNjgsMTEgQEAKICAqIGFsbG9jX2J1Y2tldCgpIGNhbm5vdCBmYWlsLiBUaGlzIHNob3VsZCBiZSB0cnVlIGJ1dCBpcyBub3QgY29tcGxldGVseQogICogb2J2aW91cy4KICAqCi0gKiBNYWtlIHN1cmUgYWxsIGFsbG9jYXRpb25zIGdldCBjaGFyZ2VkIHRvIHRoZSByb290IGNncm91cAotICoKICAqIFBsdWdnaW5nPwogICoKICAqIElmIGRhdGEgd3JpdGUgaXMgbGVzcyB0aGFuIGhhcmQgc2VjdG9yIHNpemUgb2Ygc3NkLCByb3VuZCB1cCBvZmZzZXQgaW4gb3BlbgogICogYnVja2V0IHRvIHRoZSBuZXh0IHdob2xlIHNlY3RvcgogICoKLSAqIEFsc28gbG9va3VwIGJ5IGNncm91cCBpbiBnZXRfb3Blbl9idWNrZXQoKQotICoKICAqIFN1cGVyYmxvY2sgbmVlZHMgdG8gYmUgZmxlc2hlZCBvdXQgZm9yIG11bHRpcGxlIGNhY2hlIGRldmljZXMKICAqCiAgKiBBZGQgYSBzeXNmcyB0dW5hYmxlIGZvciB0aGUgbnVtYmVyIG9mIHdyaXRlYmFjayBJT3MgaW4gZmxpZ2h0CkBAIC05Nyw4ICs5Myw2IEBACiAjZGVmaW5lIFBUUl9IQVNIKGMsIGspCQkJCQkJCVwKIAkoKChrKS0+cHRyWzBdID4+IGMtPmJ1Y2tldF9iaXRzKSB8IFBUUl9HRU4oaywgMCkpCiAKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYnRyZWVfaW9fd3E7Ci0KICNkZWZpbmUgaW5zZXJ0X2xvY2socywgYikJKChiKS0+bGV2ZWwgPD0gKHMpLT5sb2NrKQogCiAvKgpAQCAtMTIzLDcgKzExNyw3IEBACiAoewkJCQkJCQkJCVwKIAlpbnQgX3IsIGwgPSAoYiktPmxldmVsIC0gMTsJCQkJCVwKIAlib29sIF93ID0gbCA8PSAob3ApLT5sb2NrOwkJCQkJXAotCXN0cnVjdCBidHJlZSAqX2NoaWxkID0gYmNoX2J0cmVlX25vZGVfZ2V0KChiKS0+Yywga2V5LCBsLCBfdyk7CVwKKwlzdHJ1Y3QgYnRyZWUgKl9jaGlsZCA9IGJjaF9idHJlZV9ub2RlX2dldCgoYiktPmMsIG9wLCBrZXksIGwsIF93KTtcCiAJaWYgKCFJU19FUlIoX2NoaWxkKSkgewkJCQkJCVwKIAkJX2NoaWxkLT5wYXJlbnQgPSAoYik7CQkJCQlcCiAJCV9yID0gYmNoX2J0cmVlXyAjIyBmbihfY2hpbGQsIG9wLCAjI19fVkFfQVJHU19fKTsJXApAQCAtMTUyLDE3ICsxNDYsMTIgQEAKIAkJCV9yID0gYmNoX2J0cmVlXyAjIyBmbihfYiwgb3AsICMjX19WQV9BUkdTX18pOwlcCiAJCX0JCQkJCQkJXAogCQlyd191bmxvY2soX3csIF9iKTsJCQkJCVwKKwkJYmNoX2Nhbm5pYmFsaXplX3VubG9jayhjKTsJCQkJXAogCQlpZiAoX3IgPT0gLUVJTlRSKQkJCQkJXAogCQkJc2NoZWR1bGUoKTsJCQkJCVwKLQkJYmNoX2Nhbm5pYmFsaXplX3VubG9jayhjKTsJCQkJXAotCQlpZiAoX3IgPT0gLUVOT1NQQykgewkJCQkJXAotCQkJd2FpdF9ldmVudCgoYyktPnRyeV93YWl0LAkJCVwKLQkJCQkgICAhKGMpLT50cnlfaGFyZGVyKTsJCQlcCi0JCQlfciA9IC1FSU5UUjsJCQkJCVwKLQkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoX3IgPT0gLUVJTlRSKTsJCQkJCQlcCiAJCQkJCQkJCQlcCi0JZmluaXNoX3dhaXQoJihjKS0+YnVja2V0X3dhaXQsICYob3ApLT53YWl0KTsJCQlcCisJZmluaXNoX3dhaXQoJihjKS0+YnRyZWVfY2FjaGVfd2FpdCwgJihvcCktPndhaXQpOwkJXAogCV9yOwkJCQkJCQkJXAogfSkKIApAQCAtMTcxLDYgKzE2MCwyMCBAQAogCXJldHVybiAoKHZvaWQgKikgYnRyZWVfYnNldF9maXJzdChiKSkgKyBiLT53cml0dGVuICogYmxvY2tfYnl0ZXMoYi0+Yyk7CiB9CiAKK3N0YXRpYyB2b2lkIGJjaF9idHJlZV9pbml0X25leHQoc3RydWN0IGJ0cmVlICpiKQoreworCS8qIElmIG5vdCBhIGxlYWYgbm9kZSwgYWx3YXlzIHNvcnQgKi8KKwlpZiAoYi0+bGV2ZWwgJiYgYi0+a2V5cy5uc2V0cykKKwkJYmNoX2J0cmVlX3NvcnQoJmItPmtleXMsICZiLT5jLT5zb3J0KTsKKwllbHNlCisJCWJjaF9idHJlZV9zb3J0X2xhenkoJmItPmtleXMsICZiLT5jLT5zb3J0KTsKKworCWlmIChiLT53cml0dGVuIDwgYnRyZWVfYmxvY2tzKGIpKQorCQliY2hfYnNldF9pbml0X25leHQoJmItPmtleXMsIHdyaXRlX2Jsb2NrKGIpLAorCQkJCSAgIGJzZXRfbWFnaWMoJmItPmMtPnNiKSk7CisKK30KKwogLyogQnRyZWUga2V5IG1hbmlwdWxhdGlvbiAqLwogCiB2b2lkIGJrZXlfcHV0KHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBia2V5ICprKQpAQCAtMzUyLDggKzM1NSw3IEBACiAJYnRyZWVfY29tcGxldGVfd3JpdGUoYiwgdyk7CiAKIAlpZiAoYnRyZWVfbm9kZV9kaXJ0eShiKSkKLQkJcXVldWVfZGVsYXllZF93b3JrKGJ0cmVlX2lvX3dxLCAmYi0+d29yaywKLQkJCQkgICBtc2Vjc190b19qaWZmaWVzKDMwMDAwKSk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYi0+d29yaywgMzAgKiBIWik7CiAKIAljbG9zdXJlX3JldHVybl93aXRoX2Rlc3RydWN0b3IoY2wsIGJ0cmVlX25vZGVfd3JpdGVfdW5sb2NrKTsKIH0KQEAgLTQ0MiwxMCArNDQ0LDEyIEBACiAJfQogfQogCi12b2lkIGJjaF9idHJlZV9ub2RlX3dyaXRlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGNsb3N1cmUgKnBhcmVudCkKK3ZvaWQgX19iY2hfYnRyZWVfbm9kZV93cml0ZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBjbG9zdXJlICpwYXJlbnQpCiB7CiAJc3RydWN0IGJzZXQgKmkgPSBidHJlZV9ic2V0X2xhc3QoYik7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZiLT53cml0ZV9sb2NrKTsKKwogCXRyYWNlX2JjYWNoZV9idHJlZV93cml0ZShiKTsKIAogCUJVR19PTihjdXJyZW50LT5iaW9fbGlzdCk7CkBAIC00NjksMjMgKzQ3MywyNCBAQAogCQkJJlBUUl9DQUNIRShiLT5jLCAmYi0+a2V5LCAwKS0+YnRyZWVfc2VjdG9yc193cml0dGVuKTsKIAogCWItPndyaXR0ZW4gKz0gc2V0X2Jsb2NrcyhpLCBibG9ja19ieXRlcyhiLT5jKSk7Cit9CiAKLQkvKiBJZiBub3QgYSBsZWFmIG5vZGUsIGFsd2F5cyBzb3J0ICovCi0JaWYgKGItPmxldmVsICYmIGItPmtleXMubnNldHMpCi0JCWJjaF9idHJlZV9zb3J0KCZiLT5rZXlzLCAmYi0+Yy0+c29ydCk7Ci0JZWxzZQotCQliY2hfYnRyZWVfc29ydF9sYXp5KCZiLT5rZXlzLCAmYi0+Yy0+c29ydCk7Cit2b2lkIGJjaF9idHJlZV9ub2RlX3dyaXRlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGNsb3N1cmUgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBuc2V0cyA9IGItPmtleXMubnNldHM7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZiLT5sb2NrKTsKKworCV9fYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgcGFyZW50KTsKIAogCS8qCiAJICogZG8gdmVyaWZ5IGlmIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lIHNldCBpbml0aWFsbHkgKGkuZS4gd2UgZGlkIGEKIAkgKiBzb3J0KSBhbmQgd2Ugc29ydGVkIGRvd24gdG8gYSBzaW5nbGUgc2V0OgogCSAqLwotCWlmIChpICE9IGItPmtleXMuc2V0LT5kYXRhICYmICFiLT5rZXlzLm5zZXRzKQorCWlmIChuc2V0cyAmJiAhYi0+a2V5cy5uc2V0cykKIAkJYmNoX2J0cmVlX3ZlcmlmeShiKTsKIAotCWlmIChiLT53cml0dGVuIDwgYnRyZWVfYmxvY2tzKGIpKQotCQliY2hfYnNldF9pbml0X25leHQoJmItPmtleXMsIHdyaXRlX2Jsb2NrKGIpLAotCQkJCSAgIGJzZXRfbWFnaWMoJmItPmMtPnNiKSk7CisJYmNoX2J0cmVlX2luaXRfbmV4dChiKTsKIH0KIAogc3RhdGljIHZvaWQgYmNoX2J0cmVlX25vZGVfd3JpdGVfc3luYyhzdHJ1Y3QgYnRyZWUgKmIpCkBAIC00OTMsNyArNDk4LDExIEBACiAJc3RydWN0IGNsb3N1cmUgY2w7CiAKIAljbG9zdXJlX2luaXRfc3RhY2soJmNsKTsKKworCW11dGV4X2xvY2soJmItPndyaXRlX2xvY2spOwogCWJjaF9idHJlZV9ub2RlX3dyaXRlKGIsICZjbCk7CisJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKKwogCWNsb3N1cmVfc3luYygmY2wpOwogfQogCkBAIC01MDEsMTEgKzUxMCwxMCBAQAogewogCXN0cnVjdCBidHJlZSAqYiA9IGNvbnRhaW5lcl9vZih0b19kZWxheWVkX3dvcmsodyksIHN0cnVjdCBidHJlZSwgd29yayk7CiAKLQlyd19sb2NrKHRydWUsIGIsIGItPmxldmVsKTsKLQorCW11dGV4X2xvY2soJmItPndyaXRlX2xvY2spOwogCWlmIChidHJlZV9ub2RlX2RpcnR5KGIpKQotCQliY2hfYnRyZWVfbm9kZV93cml0ZShiLCBOVUxMKTsKLQlyd191bmxvY2sodHJ1ZSwgYik7CisJCV9fYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgYmNoX2J0cmVlX2xlYWZfZGlydHkoc3RydWN0IGJ0cmVlICpiLCBhdG9taWNfdCAqam91cm5hbF9yZWYpCkBAIC01MTMsMTEgKzUyMSwxMyBAQAogCXN0cnVjdCBic2V0ICppID0gYnRyZWVfYnNldF9sYXN0KGIpOwogCXN0cnVjdCBidHJlZV93cml0ZSAqdyA9IGJ0cmVlX2N1cnJlbnRfd3JpdGUoYik7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZiLT53cml0ZV9sb2NrKTsKKwogCUJVR19PTighYi0+d3JpdHRlbik7CiAJQlVHX09OKCFpLT5rZXlzKTsKIAogCWlmICghYnRyZWVfbm9kZV9kaXJ0eShiKSkKLQkJcXVldWVfZGVsYXllZF93b3JrKGJ0cmVlX2lvX3dxLCAmYi0+d29yaywgMzAgKiBIWik7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYi0+d29yaywgMzAgKiBIWik7CiAKIAlzZXRfYnRyZWVfbm9kZV9kaXJ0eShiKTsKIApAQCAtNTQ4LDcgKzU1OCw3IEBACiAjZGVmaW5lIG1jYV9yZXNlcnZlKGMpCSgoKGMtPnJvb3QgJiYgYy0+cm9vdC0+bGV2ZWwpCQlcCiAJCQkgID8gYy0+cm9vdC0+bGV2ZWwgOiAxKSAqIDggKyAxNikKICNkZWZpbmUgbWNhX2Nhbl9mcmVlKGMpCQkJCQkJXAotCW1heF90KGludCwgMCwgYy0+YnVja2V0X2NhY2hlX3VzZWQgLSBtY2FfcmVzZXJ2ZShjKSkKKwltYXhfdChpbnQsIDAsIGMtPmJ0cmVlX2NhY2hlX3VzZWQgLSBtY2FfcmVzZXJ2ZShjKSkKIAogc3RhdGljIHZvaWQgbWNhX2RhdGFfZnJlZShzdHJ1Y3QgYnRyZWUgKmIpCiB7CkBAIC01NTYsNyArNTY2LDcgQEAKIAogCWJjaF9idHJlZV9rZXlzX2ZyZWUoJmItPmtleXMpOwogCi0JYi0+Yy0+YnVja2V0X2NhY2hlX3VzZWQtLTsKKwliLT5jLT5idHJlZV9jYWNoZV91c2VkLS07CiAJbGlzdF9tb3ZlKCZiLT5saXN0LCAmYi0+Yy0+YnRyZWVfY2FjaGVfZnJlZWQpOwogfQogCkBAIC01ODEsNyArNTkxLDcgQEAKIAkJCQkJaWxvZzIoYi0+Yy0+YnRyZWVfcGFnZXMpLAogCQkJCQlidHJlZV9vcmRlcihrKSksCiAJCQkJICBnZnApKSB7Ci0JCWItPmMtPmJ1Y2tldF9jYWNoZV91c2VkKys7CisJCWItPmMtPmJ0cmVlX2NhY2hlX3VzZWQrKzsKIAkJbGlzdF9tb3ZlKCZiLT5saXN0LCAmYi0+Yy0+YnRyZWVfY2FjaGUpOwogCX0gZWxzZSB7CiAJCWxpc3RfbW92ZSgmYi0+bGlzdCwgJmItPmMtPmJ0cmVlX2NhY2hlX2ZyZWVkKTsKQEAgLTU5Nyw2ICs2MDcsOCBAQAogCiAJaW5pdF9yd3NlbSgmYi0+bG9jayk7CiAJbG9ja2RlcF9zZXRfbm92YWxpZGF0ZV9jbGFzcygmYi0+bG9jayk7CisJbXV0ZXhfaW5pdCgmYi0+d3JpdGVfbG9jayk7CisJbG9ja2RlcF9zZXRfbm92YWxpZGF0ZV9jbGFzcygmYi0+d3JpdGVfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmItPmxpc3QpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZiLT53b3JrLCBidHJlZV9ub2RlX3dyaXRlX3dvcmspOwogCWItPmMgPSBjOwpAQCAtNjMwLDggKzY0MiwxMiBAQAogCQl1cCgmYi0+aW9fbXV0ZXgpOwogCX0KIAorCW11dGV4X2xvY2soJmItPndyaXRlX2xvY2spOwogCWlmIChidHJlZV9ub2RlX2RpcnR5KGIpKQotCQliY2hfYnRyZWVfbm9kZV93cml0ZV9zeW5jKGIpOworCQlfX2JjaF9idHJlZV9ub2RlX3dyaXRlKGIsICZjbCk7CisJbXV0ZXhfdW5sb2NrKCZiLT53cml0ZV9sb2NrKTsKKworCWNsb3N1cmVfc3luYygmY2wpOwogCiAJLyogd2FpdCBmb3IgYW55IGluIGZsaWdodCBidHJlZSB3cml0ZSAqLwogCWRvd24oJmItPmlvX211dGV4KTsKQEAgLTY1NCw3ICs2NzAsNyBAQAogCWlmIChjLT5zaHJpbmtlcl9kaXNhYmxlZCkKIAkJcmV0dXJuIFNIUklOS19TVE9QOwogCi0JaWYgKGMtPnRyeV9oYXJkZXIpCisJaWYgKGMtPmJ0cmVlX2NhY2hlX2FsbG9jX2xvY2spCiAJCXJldHVybiBTSFJJTktfU1RPUDsKIAogCS8qIFJldHVybiAtMSBpZiB3ZSBjYW4ndCBkbyBhbnl0aGluZyByaWdodCBub3cgKi8KQEAgLTY4Niw3ICs3MDIsNyBAQAogCQl9CiAJfQogCi0JZm9yIChpID0gMDsgKG5yLS0pICYmIGkgPCBjLT5idWNrZXRfY2FjaGVfdXNlZDsgaSsrKSB7CisJZm9yIChpID0gMDsgKG5yLS0pICYmIGkgPCBjLT5idHJlZV9jYWNoZV91c2VkOyBpKyspIHsKIAkJaWYgKGxpc3RfZW1wdHkoJmMtPmJ0cmVlX2NhY2hlKSkKIAkJCWdvdG8gb3V0OwogCkBAIC03MTUsNyArNzMxLDcgQEAKIAlpZiAoYy0+c2hyaW5rZXJfZGlzYWJsZWQpCiAJCXJldHVybiAwOwogCi0JaWYgKGMtPnRyeV9oYXJkZXIpCisJaWYgKGMtPmJ0cmVlX2NhY2hlX2FsbG9jX2xvY2spCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIG1jYV9jYW5fZnJlZShjKSAqIGMtPmJ0cmVlX3BhZ2VzOwpAQCAtODE5LDE3ICs4MzUsMzAgQEAKIAlyZXR1cm4gYjsKIH0KIAotc3RhdGljIHN0cnVjdCBidHJlZSAqbWNhX2Nhbm5pYmFsaXplKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBia2V5ICprKQorc3RhdGljIGludCBtY2FfY2FubmliYWxpemVfbG9jayhzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkOworCisJb2xkID0gY21weGNoZygmYy0+YnRyZWVfY2FjaGVfYWxsb2NfbG9jaywgTlVMTCwgY3VycmVudCk7CisJaWYgKG9sZCAmJiBvbGQgIT0gY3VycmVudCkgeworCQlpZiAob3ApCisJCQlwcmVwYXJlX3RvX3dhaXQoJmMtPmJ0cmVlX2NhY2hlX3dhaXQsICZvcC0+d2FpdCwKKwkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlyZXR1cm4gLUVJTlRSOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ0cmVlICptY2FfY2FubmliYWxpemUoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJ0cmVlX29wICpvcCwKKwkJCQkgICAgIHN0cnVjdCBia2V5ICprKQogewogCXN0cnVjdCBidHJlZSAqYjsKIAogCXRyYWNlX2JjYWNoZV9idHJlZV9jYWNoZV9jYW5uaWJhbGl6ZShjKTsKIAotCWlmICghYy0+dHJ5X2hhcmRlcikgewotCQljLT50cnlfaGFyZGVyID0gY3VycmVudDsKLQkJYy0+dHJ5X2hhcmRlcl9zdGFydCA9IGxvY2FsX2Nsb2NrKCk7Ci0JfSBlbHNlIGlmIChjLT50cnlfaGFyZGVyICE9IGN1cnJlbnQpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCWlmIChtY2FfY2FubmliYWxpemVfbG9jayhjLCBvcCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoYiwgJmMtPmJ0cmVlX2NhY2hlLCBsaXN0KQogCQlpZiAoIW1jYV9yZWFwKGIsIGJ0cmVlX29yZGVyKGspLCBmYWxzZSkpCkBAIC04MzksNiArODY4LDcgQEAKIAkJaWYgKCFtY2FfcmVhcChiLCBidHJlZV9vcmRlcihrKSwgdHJ1ZSkpCiAJCQlyZXR1cm4gYjsKIAorCVdBUk4oMSwgImJ0cmVlIGNhY2hlIGNhbm5pYmFsaXplIGZhaWxlZFxuIik7CiAJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CiAKQEAgLTg1MCwxNCArODgwLDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIGJjaF9jYW5uaWJhbGl6ZV91bmxvY2soc3RydWN0IGNhY2hlX3NldCAqYykKIHsKLQlpZiAoYy0+dHJ5X2hhcmRlciA9PSBjdXJyZW50KSB7Ci0JCWJjaF90aW1lX3N0YXRzX3VwZGF0ZSgmYy0+dHJ5X2hhcmRlcl90aW1lLCBjLT50cnlfaGFyZGVyX3N0YXJ0KTsKLQkJYy0+dHJ5X2hhcmRlciA9IE5VTEw7Ci0JCXdha2VfdXAoJmMtPnRyeV93YWl0KTsKKwlpZiAoYy0+YnRyZWVfY2FjaGVfYWxsb2NfbG9jayA9PSBjdXJyZW50KSB7CisJCWMtPmJ0cmVlX2NhY2hlX2FsbG9jX2xvY2sgPSBOVUxMOworCQl3YWtlX3VwKCZjLT5idHJlZV9jYWNoZV93YWl0KTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZWUgKm1jYV9hbGxvYyhzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYmtleSAqaywgaW50IGxldmVsKQorc3RhdGljIHN0cnVjdCBidHJlZSAqbWNhX2FsbG9jKHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBidHJlZV9vcCAqb3AsCisJCQkgICAgICAgc3RydWN0IGJrZXkgKmssIGludCBsZXZlbCkKIHsKIAlzdHJ1Y3QgYnRyZWUgKmI7CiAKQEAgLTkyMCw3ICs5NTAsNyBAQAogCWlmIChiKQogCQlyd191bmxvY2sodHJ1ZSwgYik7CiAKLQliID0gbWNhX2Nhbm5pYmFsaXplKGMsIGspOworCWIgPSBtY2FfY2FubmliYWxpemUoYywgb3AsIGspOwogCWlmICghSVNfRVJSKGIpKQogCQlnb3RvIG91dDsKIApAQCAtOTM2LDggKzk2Niw4IEBACiAgKiBUaGUgYnRyZWUgbm9kZSB3aWxsIGhhdmUgZWl0aGVyIGEgcmVhZCBvciBhIHdyaXRlIGxvY2sgaGVsZCwgZGVwZW5kaW5nIG9uCiAgKiBsZXZlbCBhbmQgb3AtPmxvY2suCiAgKi8KLXN0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfZ2V0KHN0cnVjdCBjYWNoZV9zZXQgKmMsIHN0cnVjdCBia2V5ICprLAotCQkJCSBpbnQgbGV2ZWwsIGJvb2wgd3JpdGUpCitzdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2dldChzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAorCQkJCSBzdHJ1Y3QgYmtleSAqaywgaW50IGxldmVsLCBib29sIHdyaXRlKQogewogCWludCBpID0gMDsKIAlzdHJ1Y3QgYnRyZWUgKmI7CkBAIC05NTEsNyArOTgxLDcgQEAKIAkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwogCiAJCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKLQkJYiA9IG1jYV9hbGxvYyhjLCBrLCBsZXZlbCk7CisJCWIgPSBtY2FfYWxsb2MoYywgb3AsIGssIGxldmVsKTsKIAkJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CiAKIAkJaWYgKCFiKQpAQCAtOTk3LDcgKzEwMjcsNyBAQAogCXN0cnVjdCBidHJlZSAqYjsKIAogCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKLQliID0gbWNhX2FsbG9jKGMsIGssIGxldmVsKTsKKwliID0gbWNhX2FsbG9jKGMsIE5VTEwsIGssIGxldmVsKTsKIAltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKIAogCWlmICghSVNfRVJSX09SX05VTEwoYikpIHsKQEAgLTEwMTAsNDYgKzEwNDAsNDEgQEAKIAogc3RhdGljIHZvaWQgYnRyZWVfbm9kZV9mcmVlKHN0cnVjdCBidHJlZSAqYikKIHsKLQl1bnNpZ25lZCBpOwotCiAJdHJhY2VfYmNhY2hlX2J0cmVlX25vZGVfZnJlZShiKTsKIAogCUJVR19PTihiID09IGItPmMtPnJvb3QpOwogCisJbXV0ZXhfbG9jaygmYi0+d3JpdGVfbG9jayk7CisKIAlpZiAoYnRyZWVfbm9kZV9kaXJ0eShiKSkKIAkJYnRyZWVfY29tcGxldGVfd3JpdGUoYiwgYnRyZWVfY3VycmVudF93cml0ZShiKSk7CiAJY2xlYXJfYml0KEJUUkVFX05PREVfZGlydHksICZiLT5mbGFncyk7CiAKKwltdXRleF91bmxvY2soJmItPndyaXRlX2xvY2spOworCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmYi0+d29yayk7CiAKIAltdXRleF9sb2NrKCZiLT5jLT5idWNrZXRfbG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoJmItPmtleSk7IGkrKykgewotCQlCVUdfT04oYXRvbWljX3JlYWQoJlBUUl9CVUNLRVQoYi0+YywgJmItPmtleSwgaSktPnBpbikpOwotCi0JCWJjaF9pbmNfZ2VuKFBUUl9DQUNIRShiLT5jLCAmYi0+a2V5LCBpKSwKLQkJCSAgICBQVFJfQlVDS0VUKGItPmMsICZiLT5rZXksIGkpKTsKLQl9Ci0KIAliY2hfYnVja2V0X2ZyZWUoYi0+YywgJmItPmtleSk7CiAJbWNhX2J1Y2tldF9mcmVlKGIpOwogCW11dGV4X3VubG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOwogfQogCi1zdHJ1Y3QgYnRyZWUgKmJjaF9idHJlZV9ub2RlX2FsbG9jKHN0cnVjdCBjYWNoZV9zZXQgKmMsIGludCBsZXZlbCwgYm9vbCB3YWl0KQorc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9hbGxvYyhzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAorCQkJCSAgIGludCBsZXZlbCkKIHsKIAlCS0VZX1BBRERFRChrZXkpIGs7CiAJc3RydWN0IGJ0cmVlICpiID0gRVJSX1BUUigtRUFHQUlOKTsKIAogCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKIHJldHJ5OgotCWlmIChfX2JjaF9idWNrZXRfYWxsb2Nfc2V0KGMsIFJFU0VSVkVfQlRSRUUsICZrLmtleSwgMSwgd2FpdCkpCisJaWYgKF9fYmNoX2J1Y2tldF9hbGxvY19zZXQoYywgUkVTRVJWRV9CVFJFRSwgJmsua2V5LCAxLCBvcCAhPSBOVUxMKSkKIAkJZ290byBlcnI7CiAKIAlia2V5X3B1dChjLCAmay5rZXkpOwogCVNFVF9LRVlfU0laRSgmay5rZXksIGMtPmJ0cmVlX3BhZ2VzICogUEFHRV9TRUNUT1JTKTsKIAotCWIgPSBtY2FfYWxsb2MoYywgJmsua2V5LCBsZXZlbCk7CisJYiA9IG1jYV9hbGxvYyhjLCBvcCwgJmsua2V5LCBsZXZlbCk7CiAJaWYgKElTX0VSUihiKSkKIAkJZ290byBlcnJfZnJlZTsKIApAQCAtMTA3NSwxMiArMTEwMCwxNSBAQAogCXJldHVybiBiOwogfQogCi1zdGF0aWMgc3RydWN0IGJ0cmVlICpidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KHN0cnVjdCBidHJlZSAqYiwgYm9vbCB3YWl0KQorc3RhdGljIHN0cnVjdCBidHJlZSAqYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChzdHJ1Y3QgYnRyZWUgKmIsCisJCQkJCQkgIHN0cnVjdCBidHJlZV9vcCAqb3ApCiB7Ci0Jc3RydWN0IGJ0cmVlICpuID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYi0+YywgYi0+bGV2ZWwsIHdhaXQpOworCXN0cnVjdCBidHJlZSAqbiA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGItPmMsIG9wLCBiLT5sZXZlbCk7CiAJaWYgKCFJU19FUlJfT1JfTlVMTChuKSkgeworCQltdXRleF9sb2NrKCZuLT53cml0ZV9sb2NrKTsKIAkJYmNoX2J0cmVlX3NvcnRfaW50bygmYi0+a2V5cywgJm4tPmtleXMsICZiLT5jLT5zb3J0KTsKIAkJYmtleV9jb3B5X2tleSgmbi0+a2V5LCAmYi0+a2V5KTsKKwkJbXV0ZXhfdW5sb2NrKCZuLT53cml0ZV9sb2NrKTsKIAl9CiAKIAlyZXR1cm4gbjsKQEAgLTEwOTAsNDMgKzExMTgsNDcgQEAKIHsKIAl1bnNpZ25lZCBpOwogCisJbXV0ZXhfbG9jaygmYi0+Yy0+YnVja2V0X2xvY2spOworCisJYXRvbWljX2luYygmYi0+Yy0+cHJpb19ibG9ja2VkKTsKKwogCWJrZXlfY29weShrLCAmYi0+a2V5KTsKIAlia2V5X2NvcHlfa2V5KGssICZaRVJPX0tFWSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykgewotCQl1aW50OF90IGcgPSBQVFJfQlVDS0VUKGItPmMsIGssIGkpLT5nZW4gKyAxOworCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUyhrKTsgaSsrKQorCQlTRVRfUFRSX0dFTihrLCBpLAorCQkJICAgIGJjaF9pbmNfZ2VuKFBUUl9DQUNIRShiLT5jLCAmYi0+a2V5LCBpKSwKKwkJCQkJUFRSX0JVQ0tFVChiLT5jLCAmYi0+a2V5LCBpKSkpOwogCi0JCVNFVF9QVFJfR0VOKGssIGksIGcpOwotCX0KLQotCWF0b21pY19pbmMoJmItPmMtPnByaW9fYmxvY2tlZCk7CisJbXV0ZXhfdW5sb2NrKCZiLT5jLT5idWNrZXRfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgYnRyZWVfY2hlY2tfcmVzZXJ2ZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3ApCiB7CiAJc3RydWN0IGNhY2hlX3NldCAqYyA9IGItPmM7CiAJc3RydWN0IGNhY2hlICpjYTsKLQl1bnNpZ25lZCBpLCByZXNlcnZlID0gYy0+cm9vdC0+bGV2ZWwgKiAyICsgMTsKLQlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpLCByZXNlcnZlID0gKGMtPnJvb3QtPmxldmVsIC0gYi0+bGV2ZWwpICogMiArIDE7CiAKIAltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7CiAKIAlmb3JfZWFjaF9jYWNoZShjYSwgYywgaSkKIAkJaWYgKGZpZm9fdXNlZCgmY2EtPmZyZWVbUkVTRVJWRV9CVFJFRV0pIDwgcmVzZXJ2ZSkgewogCQkJaWYgKG9wKQotCQkJCXByZXBhcmVfdG9fd2FpdCgmYy0+YnVja2V0X3dhaXQsICZvcC0+d2FpdCwKKwkJCQlwcmVwYXJlX3RvX3dhaXQoJmMtPmJ0cmVlX2NhY2hlX3dhaXQsICZvcC0+d2FpdCwKIAkJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJCXJldCA9IC1FSU5UUjsKLQkJCWJyZWFrOworCQkJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CisJCQlyZXR1cm4gLUVJTlRSOwogCQl9CiAKIAltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG1jYV9jYW5uaWJhbGl6ZV9sb2NrKGItPmMsIG9wKTsKIH0KIAogLyogR2FyYmFnZSBjb2xsZWN0aW9uICovCiAKLXVpbnQ4X3QgX19iY2hfYnRyZWVfbWFya19rZXkoc3RydWN0IGNhY2hlX3NldCAqYywgaW50IGxldmVsLCBzdHJ1Y3QgYmtleSAqaykKK3N0YXRpYyB1aW50OF90IF9fYmNoX2J0cmVlX21hcmtfa2V5KHN0cnVjdCBjYWNoZV9zZXQgKmMsIGludCBsZXZlbCwKKwkJCQkgICAgc3RydWN0IGJrZXkgKmspCiB7CiAJdWludDhfdCBzdGFsZSA9IDA7CiAJdW5zaWduZWQgaTsKQEAgLTExNDYsOCArMTE3OCw4IEBACiAKIAkJZyA9IFBUUl9CVUNLRVQoYywgaywgaSk7CiAKLQkJaWYgKGdlbl9hZnRlcihnLT5nY19nZW4sIFBUUl9HRU4oaywgaSkpKQotCQkJZy0+Z2NfZ2VuID0gUFRSX0dFTihrLCBpKTsKKwkJaWYgKGdlbl9hZnRlcihnLT5sYXN0X2djLCBQVFJfR0VOKGssIGkpKSkKKwkJCWctPmxhc3RfZ2MgPSBQVFJfR0VOKGssIGkpOwogCiAJCWlmIChwdHJfc3RhbGUoYywgaywgaSkpIHsKIAkJCXN0YWxlID0gbWF4KHN0YWxlLCBwdHJfc3RhbGUoYywgaywgaSkpOwpAQCAtMTE2Myw2ICsxMTk1LDggQEAKIAkJCVNFVF9HQ19NQVJLKGcsIEdDX01BUktfTUVUQURBVEEpOwogCQllbHNlIGlmIChLRVlfRElSVFkoaykpCiAJCQlTRVRfR0NfTUFSSyhnLCBHQ19NQVJLX0RJUlRZKTsKKwkJZWxzZSBpZiAoIUdDX01BUksoZykpCisJCQlTRVRfR0NfTUFSSyhnLCBHQ19NQVJLX1JFQ0xBSU1BQkxFKTsKIAogCQkvKiBndWFyZCBhZ2FpbnN0IG92ZXJmbG93ICovCiAJCVNFVF9HQ19TRUNUT1JTX1VTRUQoZywgbWluX3QodW5zaWduZWQsCkBAIC0xMTc3LDYgKzEyMTEsMjYgQEAKIAogI2RlZmluZSBidHJlZV9tYXJrX2tleShiLCBrKQlfX2JjaF9idHJlZV9tYXJrX2tleShiLT5jLCBiLT5sZXZlbCwgaykKIAordm9pZCBiY2hfaW5pdGlhbF9tYXJrX2tleShzdHJ1Y3QgY2FjaGVfc2V0ICpjLCBpbnQgbGV2ZWwsIHN0cnVjdCBia2V5ICprKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgS0VZX1BUUlMoayk7IGkrKykKKwkJaWYgKHB0cl9hdmFpbGFibGUoYywgaywgaSkgJiYKKwkJICAgICFwdHJfc3RhbGUoYywgaywgaSkpIHsKKwkJCXN0cnVjdCBidWNrZXQgKmIgPSBQVFJfQlVDS0VUKGMsIGssIGkpOworCisJCQliLT5nZW4gPSBQVFJfR0VOKGssIGkpOworCisJCQlpZiAobGV2ZWwgJiYgYmtleV9jbXAoaywgJlpFUk9fS0VZKSkKKwkJCQliLT5wcmlvID0gQlRSRUVfUFJJTzsKKwkJCWVsc2UgaWYgKCFsZXZlbCAmJiBiLT5wcmlvID09IEJUUkVFX1BSSU8pCisJCQkJYi0+cHJpbyA9IElOSVRJQUxfUFJJTzsKKwkJfQorCisJX19iY2hfYnRyZWVfbWFya19rZXkoYywgbGV2ZWwsIGspOworfQorCiBzdGF0aWMgYm9vbCBidHJlZV9nY19tYXJrX25vZGUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgZ2Nfc3RhdCAqZ2MpCiB7CiAJdWludDhfdCBzdGFsZSA9IDA7CkBAIC0xMjMwLDE0ICsxMjg0LDE5IEBACiAJCQkJIHN0cnVjdCBrZXlsaXN0ICosIGF0b21pY190ICosIHN0cnVjdCBia2V5ICopOwogCiBzdGF0aWMgaW50IGJ0cmVlX2djX2NvYWxlc2NlKHN0cnVjdCBidHJlZSAqYiwgc3RydWN0IGJ0cmVlX29wICpvcCwKLQkJCSAgICAgc3RydWN0IGtleWxpc3QgKmtleWxpc3QsIHN0cnVjdCBnY19zdGF0ICpnYywKLQkJCSAgICAgc3RydWN0IGdjX21lcmdlX2luZm8gKnIpCisJCQkgICAgIHN0cnVjdCBnY19zdGF0ICpnYywgc3RydWN0IGdjX21lcmdlX2luZm8gKnIpCiB7CiAJdW5zaWduZWQgaSwgbm9kZXMgPSAwLCBrZXlzID0gMCwgYmxvY2tzOwogCXN0cnVjdCBidHJlZSAqbmV3X25vZGVzW0dDX01FUkdFX05PREVTXTsKKwlzdHJ1Y3Qga2V5bGlzdCBrZXlsaXN0OwogCXN0cnVjdCBjbG9zdXJlIGNsOwogCXN0cnVjdCBia2V5ICprOwogCisJYmNoX2tleWxpc3RfaW5pdCgma2V5bGlzdCk7CisKKwlpZiAoYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisKIAltZW1zZXQobmV3X25vZGVzLCAwLCBzaXplb2YobmV3X25vZGVzKSk7CiAJY2xvc3VyZV9pbml0X3N0YWNrKCZjbCk7CiAKQEAgLTEyNTIsMTEgKzEzMTEsMjMgQEAKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKykgewotCQluZXdfbm9kZXNbaV0gPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KHJbaV0uYiwgZmFsc2UpOworCQluZXdfbm9kZXNbaV0gPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KHJbaV0uYiwgTlVMTCk7CiAJCWlmIChJU19FUlJfT1JfTlVMTChuZXdfbm9kZXNbaV0pKQogCQkJZ290byBvdXRfbm9jb2FsZXNjZTsKIAl9CiAKKwkvKgorCSAqIFdlIGhhdmUgdG8gY2hlY2sgdGhlIHJlc2VydmUgaGVyZSwgYWZ0ZXIgd2UndmUgYWxsb2NhdGVkIG91ciBuZXcKKwkgKiBub2RlcywgdG8gbWFrZSBzdXJlIHRoZSBpbnNlcnQgYmVsb3cgd2lsbCBzdWNjZWVkIC0gd2UgYWxzbyBjaGVjaworCSAqIGJlZm9yZSBhcyBhbiBvcHRpbWl6YXRpb24gdG8gcG90ZW50aWFsbHkgYXZvaWQgYSBidW5jaCBvZiBleHBlbnNpdmUKKwkgKiBhbGxvY3Mvc29ydHMKKwkgKi8KKwlpZiAoYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBOVUxMKSkKKwkJZ290byBvdXRfbm9jb2FsZXNjZTsKKworCWZvciAoaSA9IDA7IGkgPCBub2RlczsgaSsrKQorCQltdXRleF9sb2NrKCZuZXdfbm9kZXNbaV0tPndyaXRlX2xvY2spOworCiAJZm9yIChpID0gbm9kZXMgLSAxOyBpID4gMDsgLS1pKSB7CiAJCXN0cnVjdCBic2V0ICpuMSA9IGJ0cmVlX2JzZXRfZmlyc3QobmV3X25vZGVzW2ldKTsKIAkJc3RydWN0IGJzZXQgKm4yID0gYnRyZWVfYnNldF9maXJzdChuZXdfbm9kZXNbaSAtIDFdKTsKQEAgLTEzMTUsMjggKzEzODYsMzQgQEAKIAogCQluMi0+a2V5cyAtPSBrZXlzOwogCi0JCWlmIChfX2JjaF9rZXlsaXN0X3JlYWxsb2Moa2V5bGlzdCwKKwkJaWYgKF9fYmNoX2tleWxpc3RfcmVhbGxvYygma2V5bGlzdCwKIAkJCQkJICBia2V5X3U2NHMoJm5ld19ub2Rlc1tpXS0+a2V5KSkpCiAJCQlnb3RvIG91dF9ub2NvYWxlc2NlOwogCiAJCWJjaF9idHJlZV9ub2RlX3dyaXRlKG5ld19ub2Rlc1tpXSwgJmNsKTsKLQkJYmNoX2tleWxpc3RfYWRkKGtleWxpc3QsICZuZXdfbm9kZXNbaV0tPmtleSk7CisJCWJjaF9rZXlsaXN0X2FkZCgma2V5bGlzdCwgJm5ld19ub2Rlc1tpXS0+a2V5KTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbm9kZXM7IGkrKykgewotCQlpZiAoX19iY2hfa2V5bGlzdF9yZWFsbG9jKGtleWxpc3QsIGJrZXlfdTY0cygmcltpXS5iLT5rZXkpKSkKLQkJCWdvdG8gb3V0X25vY29hbGVzY2U7CisJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyspCisJCW11dGV4X3VubG9jaygmbmV3X25vZGVzW2ldLT53cml0ZV9sb2NrKTsKIAotCQltYWtlX2J0cmVlX2ZyZWVpbmdfa2V5KHJbaV0uYiwga2V5bGlzdC0+dG9wKTsKLQkJYmNoX2tleWxpc3RfcHVzaChrZXlsaXN0KTsKLQl9CisJY2xvc3VyZV9zeW5jKCZjbCk7CiAKIAkvKiBXZSBlbXB0aWVkIG91dCB0aGlzIG5vZGUgKi8KIAlCVUdfT04oYnRyZWVfYnNldF9maXJzdChuZXdfbm9kZXNbMF0pLT5rZXlzKTsKIAlidHJlZV9ub2RlX2ZyZWUobmV3X25vZGVzWzBdKTsKIAlyd191bmxvY2sodHJ1ZSwgbmV3X25vZGVzWzBdKTsKIAotCWNsb3N1cmVfc3luYygmY2wpOworCWZvciAoaSA9IDA7IGkgPCBub2RlczsgaSsrKSB7CisJCWlmIChfX2JjaF9rZXlsaXN0X3JlYWxsb2MoJmtleWxpc3QsIGJrZXlfdTY0cygmcltpXS5iLT5rZXkpKSkKKwkJCWdvdG8gb3V0X25vY29hbGVzY2U7CisKKwkJbWFrZV9idHJlZV9mcmVlaW5nX2tleShyW2ldLmIsIGtleWxpc3QudG9wKTsKKwkJYmNoX2tleWxpc3RfcHVzaCgma2V5bGlzdCk7CisJfQorCisJYmNoX2J0cmVlX2luc2VydF9ub2RlKGIsIG9wLCAma2V5bGlzdCwgTlVMTCwgTlVMTCk7CisJQlVHX09OKCFiY2hfa2V5bGlzdF9lbXB0eSgma2V5bGlzdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyspIHsKIAkJYnRyZWVfbm9kZV9mcmVlKHJbaV0uYik7CkBAIC0xMzQ1LDIyICsxNDIyLDIyIEBACiAJCXJbaV0uYiA9IG5ld19ub2Rlc1tpXTsKIAl9CiAKLQliY2hfYnRyZWVfaW5zZXJ0X25vZGUoYiwgb3AsIGtleWxpc3QsIE5VTEwsIE5VTEwpOwotCUJVR19PTighYmNoX2tleWxpc3RfZW1wdHkoa2V5bGlzdCkpOwotCiAJbWVtbW92ZShyLCByICsgMSwgc2l6ZW9mKHJbMF0pICogKG5vZGVzIC0gMSkpOwogCXJbbm9kZXMgLSAxXS5iID0gRVJSX1BUUigtRUlOVFIpOwogCiAJdHJhY2VfYmNhY2hlX2J0cmVlX2djX2NvYWxlc2NlKG5vZGVzKTsKIAlnYy0+bm9kZXMtLTsKIAorCWJjaF9rZXlsaXN0X2ZyZWUoJmtleWxpc3QpOworCiAJLyogSW52YWxpZGF0ZWQgb3VyIGl0ZXJhdG9yICovCiAJcmV0dXJuIC1FSU5UUjsKIAogb3V0X25vY29hbGVzY2U6CiAJY2xvc3VyZV9zeW5jKCZjbCk7CisJYmNoX2tleWxpc3RfZnJlZSgma2V5bGlzdCk7CiAKLQl3aGlsZSAoKGsgPSBiY2hfa2V5bGlzdF9wb3Aoa2V5bGlzdCkpKQorCXdoaWxlICgoayA9IGJjaF9rZXlsaXN0X3BvcCgma2V5bGlzdCkpKQogCQlpZiAoIWJrZXlfY21wKGssICZaRVJPX0tFWSkpCiAJCQlhdG9taWNfZGVjKCZiLT5jLT5wcmlvX2Jsb2NrZWQpOwogCkBAIC0xMzcyLDYgKzE0NDksNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBidHJlZV9nY19yZXdyaXRlX25vZGUoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAorCQkJCSBzdHJ1Y3QgYnRyZWUgKnJlcGxhY2UpCit7CisJc3RydWN0IGtleWxpc3Qga2V5czsKKwlzdHJ1Y3QgYnRyZWUgKm47CisKKwlpZiAoYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwluID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChyZXBsYWNlLCBOVUxMKTsKKworCS8qIHJlY2hlY2sgcmVzZXJ2ZSBhZnRlciBhbGxvY2F0aW5nIHJlcGxhY2VtZW50IG5vZGUgKi8KKwlpZiAoYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBOVUxMKSkgeworCQlidHJlZV9ub2RlX2ZyZWUobik7CisJCXJ3X3VubG9jayh0cnVlLCBuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYmNoX2J0cmVlX25vZGVfd3JpdGVfc3luYyhuKTsKKworCWJjaF9rZXlsaXN0X2luaXQoJmtleXMpOworCWJjaF9rZXlsaXN0X2FkZCgma2V5cywgJm4tPmtleSk7CisKKwltYWtlX2J0cmVlX2ZyZWVpbmdfa2V5KHJlcGxhY2UsIGtleXMudG9wKTsKKwliY2hfa2V5bGlzdF9wdXNoKCZrZXlzKTsKKworCWJjaF9idHJlZV9pbnNlcnRfbm9kZShiLCBvcCwgJmtleXMsIE5VTEwsIE5VTEwpOworCUJVR19PTighYmNoX2tleWxpc3RfZW1wdHkoJmtleXMpKTsKKworCWJ0cmVlX25vZGVfZnJlZShyZXBsYWNlKTsKKwlyd191bmxvY2sodHJ1ZSwgbik7CisKKwkvKiBJbnZhbGlkYXRlZCBvdXIgaXRlcmF0b3IgKi8KKwlyZXR1cm4gLUVJTlRSOworfQorCiBzdGF0aWMgdW5zaWduZWQgYnRyZWVfZ2NfY291bnRfa2V5cyhzdHJ1Y3QgYnRyZWUgKmIpCiB7CiAJc3RydWN0IGJrZXkgKms7CkBAIC0xMzg3LDI2ICsxNTAwLDIzIEBACiBzdGF0aWMgaW50IGJ0cmVlX2djX3JlY3Vyc2Uoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAogCQkJICAgIHN0cnVjdCBjbG9zdXJlICp3cml0ZXMsIHN0cnVjdCBnY19zdGF0ICpnYykKIHsKLQl1bnNpZ25lZCBpOwogCWludCByZXQgPSAwOwogCWJvb2wgc2hvdWxkX3Jld3JpdGU7Ci0Jc3RydWN0IGJ0cmVlICpuOwogCXN0cnVjdCBia2V5ICprOwotCXN0cnVjdCBrZXlsaXN0IGtleXM7CiAJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgZ2NfbWVyZ2VfaW5mbyByW0dDX01FUkdFX05PREVTXTsKLQlzdHJ1Y3QgZ2NfbWVyZ2VfaW5mbyAqbGFzdCA9IHIgKyBHQ19NRVJHRV9OT0RFUyAtIDE7CisJc3RydWN0IGdjX21lcmdlX2luZm8gKmksICpsYXN0ID0gciArIEFSUkFZX1NJWkUocikgLSAxOwogCi0JYmNoX2tleWxpc3RfaW5pdCgma2V5cyk7CiAJYmNoX2J0cmVlX2l0ZXJfaW5pdCgmYi0+a2V5cywgJml0ZXIsICZiLT5jLT5nY19kb25lKTsKIAotCWZvciAoaSA9IDA7IGkgPCBHQ19NRVJHRV9OT0RFUzsgaSsrKQotCQlyW2ldLmIgPSBFUlJfUFRSKC1FSU5UUik7CisJZm9yIChpID0gcjsgaSA8IHIgKyBBUlJBWV9TSVpFKHIpOyBpKyspCisJCWktPmIgPSBFUlJfUFRSKC1FSU5UUik7CiAKIAl3aGlsZSAoMSkgewogCQlrID0gYmNoX2J0cmVlX2l0ZXJfbmV4dF9maWx0ZXIoJml0ZXIsICZiLT5rZXlzLCBiY2hfcHRyX2JhZCk7CiAJCWlmIChrKSB7Ci0JCQlyLT5iID0gYmNoX2J0cmVlX25vZGVfZ2V0KGItPmMsIGssIGItPmxldmVsIC0gMSwgdHJ1ZSk7CisJCQlyLT5iID0gYmNoX2J0cmVlX25vZGVfZ2V0KGItPmMsIG9wLCBrLCBiLT5sZXZlbCAtIDEsCisJCQkJCQkgIHRydWUpOwogCQkJaWYgKElTX0VSUihyLT5iKSkgewogCQkJCXJldCA9IFBUUl9FUlIoci0+Yik7CiAJCQkJYnJlYWs7CkBAIC0xNDE0LDcgKzE1MjQsNyBAQAogCiAJCQlyLT5rZXlzID0gYnRyZWVfZ2NfY291bnRfa2V5cyhyLT5iKTsKIAotCQkJcmV0ID0gYnRyZWVfZ2NfY29hbGVzY2UoYiwgb3AsICZrZXlzLCBnYywgcik7CisJCQlyZXQgPSBidHJlZV9nY19jb2FsZXNjZShiLCBvcCwgZ2MsIHIpOwogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTQyNCwzMiArMTUzNCwxMCBAQAogCiAJCWlmICghSVNfRVJSKGxhc3QtPmIpKSB7CiAJCQlzaG91bGRfcmV3cml0ZSA9IGJ0cmVlX2djX21hcmtfbm9kZShsYXN0LT5iLCBnYyk7Ci0JCQlpZiAoc2hvdWxkX3Jld3JpdGUgJiYKLQkJCSAgICAhYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBOVUxMKSkgewotCQkJCW4gPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KGxhc3QtPmIsCi0JCQkJCQkJCSBmYWxzZSk7Ci0KLQkJCQlpZiAoIUlTX0VSUl9PUl9OVUxMKG4pKSB7Ci0JCQkJCWJjaF9idHJlZV9ub2RlX3dyaXRlX3N5bmMobik7Ci0JCQkJCWJjaF9rZXlsaXN0X2FkZCgma2V5cywgJm4tPmtleSk7Ci0KLQkJCQkJbWFrZV9idHJlZV9mcmVlaW5nX2tleShsYXN0LT5iLAotCQkJCQkJCSAgICAgICBrZXlzLnRvcCk7Ci0JCQkJCWJjaF9rZXlsaXN0X3B1c2goJmtleXMpOwotCi0JCQkJCWJ0cmVlX25vZGVfZnJlZShsYXN0LT5iKTsKLQotCQkJCQliY2hfYnRyZWVfaW5zZXJ0X25vZGUoYiwgb3AsICZrZXlzLAotCQkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwotCQkJCQlCVUdfT04oIWJjaF9rZXlsaXN0X2VtcHR5KCZrZXlzKSk7Ci0KLQkJCQkJcndfdW5sb2NrKHRydWUsIGxhc3QtPmIpOwotCQkJCQlsYXN0LT5iID0gbjsKLQotCQkJCQkvKiBJbnZhbGlkYXRlZCBvdXIgaXRlcmF0b3IgKi8KLQkJCQkJcmV0ID0gLUVJTlRSOworCQkJaWYgKHNob3VsZF9yZXdyaXRlKSB7CisJCQkJcmV0ID0gYnRyZWVfZ2NfcmV3cml0ZV9ub2RlKGIsIG9wLCBsYXN0LT5iKTsKKwkJCQlpZiAocmV0KQogCQkJCQlicmVhazsKLQkJCQl9CiAJCQl9CiAKIAkJCWlmIChsYXN0LT5iLT5sZXZlbCkgewpAQCAtMTQ2NCw4ICsxNTUyLDEwIEBACiAJCQkgKiBNdXN0IGZsdXNoIGxlYWYgbm9kZXMgYmVmb3JlIGdjIGVuZHMsIHNpbmNlIHJlcGxhY2UKIAkJCSAqIG9wZXJhdGlvbnMgYXJlbid0IGpvdXJuYWxsZWQKIAkJCSAqLworCQkJbXV0ZXhfbG9jaygmbGFzdC0+Yi0+d3JpdGVfbG9jayk7CiAJCQlpZiAoYnRyZWVfbm9kZV9kaXJ0eShsYXN0LT5iKSkKIAkJCQliY2hfYnRyZWVfbm9kZV93cml0ZShsYXN0LT5iLCB3cml0ZXMpOworCQkJbXV0ZXhfdW5sb2NrKCZsYXN0LT5iLT53cml0ZV9sb2NrKTsKIAkJCXJ3X3VubG9jayh0cnVlLCBsYXN0LT5iKTsKIAkJfQogCkBAIC0xNDc4LDE1ICsxNTY4LDE1IEBACiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgR0NfTUVSR0VfTk9ERVM7IGkrKykKLQkJaWYgKCFJU19FUlJfT1JfTlVMTChyW2ldLmIpKSB7Ci0JCQlpZiAoYnRyZWVfbm9kZV9kaXJ0eShyW2ldLmIpKQotCQkJCWJjaF9idHJlZV9ub2RlX3dyaXRlKHJbaV0uYiwgd3JpdGVzKTsKLQkJCXJ3X3VubG9jayh0cnVlLCByW2ldLmIpOworCWZvciAoaSA9IHI7IGkgPCByICsgQVJSQVlfU0laRShyKTsgaSsrKQorCQlpZiAoIUlTX0VSUl9PUl9OVUxMKGktPmIpKSB7CisJCQltdXRleF9sb2NrKCZpLT5iLT53cml0ZV9sb2NrKTsKKwkJCWlmIChidHJlZV9ub2RlX2RpcnR5KGktPmIpKQorCQkJCWJjaF9idHJlZV9ub2RlX3dyaXRlKGktPmIsIHdyaXRlcyk7CisJCQltdXRleF91bmxvY2soJmktPmItPndyaXRlX2xvY2spOworCQkJcndfdW5sb2NrKHRydWUsIGktPmIpOwogCQl9CiAKLQliY2hfa2V5bGlzdF9mcmVlKCZrZXlzKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0OTksMTAgKzE1ODksMTEgQEAKIAogCXNob3VsZF9yZXdyaXRlID0gYnRyZWVfZ2NfbWFya19ub2RlKGIsIGdjKTsKIAlpZiAoc2hvdWxkX3Jld3JpdGUpIHsKLQkJbiA9IGJ0cmVlX25vZGVfYWxsb2NfcmVwbGFjZW1lbnQoYiwgZmFsc2UpOworCQluID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChiLCBOVUxMKTsKIAogCQlpZiAoIUlTX0VSUl9PUl9OVUxMKG4pKSB7CiAJCQliY2hfYnRyZWVfbm9kZV93cml0ZV9zeW5jKG4pOworCiAJCQliY2hfYnRyZWVfc2V0X3Jvb3Qobik7CiAJCQlidHJlZV9ub2RlX2ZyZWUoYik7CiAJCQlyd191bmxvY2sodHJ1ZSwgbik7CkBAIC0xNTExLDYgKzE2MDIsOCBAQAogCQl9CiAJfQogCisJX19iY2hfYnRyZWVfbWFya19rZXkoYi0+YywgYi0+bGV2ZWwgKyAxLCAmYi0+a2V5KTsKKwogCWlmIChiLT5sZXZlbCkgewogCQlyZXQgPSBidHJlZV9nY19yZWN1cnNlKGIsIG9wLCB3cml0ZXMsIGdjKTsKIAkJaWYgKHJldCkKQEAgLTE1MzgsOSArMTYzMSw5IEBACiAKIAlmb3JfZWFjaF9jYWNoZShjYSwgYywgaSkKIAkJZm9yX2VhY2hfYnVja2V0KGIsIGNhKSB7Ci0JCQliLT5nY19nZW4gPSBiLT5nZW47CisJCQliLT5sYXN0X2djID0gYi0+Z2VuOwogCQkJaWYgKCFhdG9taWNfcmVhZCgmYi0+cGluKSkgewotCQkJCVNFVF9HQ19NQVJLKGIsIEdDX01BUktfUkVDTEFJTUFCTEUpOworCQkJCVNFVF9HQ19NQVJLKGIsIDApOwogCQkJCVNFVF9HQ19TRUNUT1JTX1VTRUQoYiwgMCk7CiAJCQl9CiAJCX0KQEAgLTE1NDgsNyArMTY0MSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CiB9CiAKLXNpemVfdCBiY2hfYnRyZWVfZ2NfZmluaXNoKHN0cnVjdCBjYWNoZV9zZXQgKmMpCitzdGF0aWMgc2l6ZV90IGJjaF9idHJlZV9nY19maW5pc2goc3RydWN0IGNhY2hlX3NldCAqYykKIHsKIAlzaXplX3QgYXZhaWxhYmxlID0gMDsKIAlzdHJ1Y3QgYnVja2V0ICpiOwpAQCAtMTU2MSwxMSArMTY1NCw2IEBACiAJYy0+Z2NfbWFya192YWxpZCA9IDE7CiAJYy0+bmVlZF9nYwk9IDA7CiAKLQlpZiAoYy0+cm9vdCkKLQkJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKCZjLT5yb290LT5rZXkpOyBpKyspCi0JCQlTRVRfR0NfTUFSSyhQVFJfQlVDS0VUKGMsICZjLT5yb290LT5rZXksIGkpLAotCQkJCSAgICBHQ19NQVJLX01FVEFEQVRBKTsKLQogCWZvciAoaSA9IDA7IGkgPCBLRVlfUFRSUygmYy0+dXVpZF9idWNrZXQpOyBpKyspCiAJCVNFVF9HQ19NQVJLKFBUUl9CVUNLRVQoYywgJmMtPnV1aWRfYnVja2V0LCBpKSwKIAkJCSAgICBHQ19NQVJLX01FVEFEQVRBKTsKQEAgLTE2MDUsMTUgKzE2OTMsMTUgQEAKIAkJCVNFVF9HQ19NQVJLKGNhLT5idWNrZXRzICsgKmksIEdDX01BUktfTUVUQURBVEEpOwogCiAJCWZvcl9lYWNoX2J1Y2tldChiLCBjYSkgewotCQkJYi0+bGFzdF9nYwk9IGItPmdjX2dlbjsKIAkJCWMtPm5lZWRfZ2MJPSBtYXgoYy0+bmVlZF9nYywgYnVja2V0X2djX2dlbihiKSk7CiAKLQkJCWlmICghYXRvbWljX3JlYWQoJmItPnBpbikgJiYKLQkJCSAgICBHQ19NQVJLKGIpID09IEdDX01BUktfUkVDTEFJTUFCTEUpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmYi0+cGluKSkKKwkJCQljb250aW51ZTsKKworCQkJQlVHX09OKCFHQ19NQVJLKGIpICYmIEdDX1NFQ1RPUlNfVVNFRChiKSk7CisKKwkJCWlmICghR0NfTUFSSyhiKSB8fCBHQ19NQVJLKGIpID09IEdDX01BUktfUkVDTEFJTUFCTEUpCiAJCQkJYXZhaWxhYmxlKys7Ci0JCQkJaWYgKCFHQ19TRUNUT1JTX1VTRUQoYikpCi0JCQkJCWJjaF9idWNrZXRfYWRkX3VudXNlZChjYSwgYik7Ci0JCQl9CiAJCX0KIAl9CiAKQEAgLTE3MDUsMzYgKzE3OTMsMTYgQEAKIAogLyogSW5pdGlhbCBwYXJ0aWFsIGdjICovCiAKLXN0YXRpYyBpbnQgYmNoX2J0cmVlX2NoZWNrX3JlY3Vyc2Uoc3RydWN0IGJ0cmVlICpiLCBzdHJ1Y3QgYnRyZWVfb3AgKm9wLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgKipzZWVuKQorc3RhdGljIGludCBiY2hfYnRyZWVfY2hlY2tfcmVjdXJzZShzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBidHJlZV9vcCAqb3ApCiB7CiAJaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgaTsKIAlzdHJ1Y3QgYmtleSAqaywgKnAgPSBOVUxMOwotCXN0cnVjdCBidWNrZXQgKmc7CiAJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKIAotCWZvcl9lYWNoX2tleV9maWx0ZXIoJmItPmtleXMsIGssICZpdGVyLCBiY2hfcHRyX2ludmFsaWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspIHsKLQkJCWlmICghcHRyX2F2YWlsYWJsZShiLT5jLCBrLCBpKSkKLQkJCQljb250aW51ZTsKKwlmb3JfZWFjaF9rZXlfZmlsdGVyKCZiLT5rZXlzLCBrLCAmaXRlciwgYmNoX3B0cl9pbnZhbGlkKQorCQliY2hfaW5pdGlhbF9tYXJrX2tleShiLT5jLCBiLT5sZXZlbCwgayk7CiAKLQkJCWcgPSBQVFJfQlVDS0VUKGItPmMsIGssIGkpOwotCi0JCQlpZiAoIV9fdGVzdF9hbmRfc2V0X2JpdChQVFJfQlVDS0VUX05SKGItPmMsIGssIGkpLAotCQkJCQkJc2VlbltQVFJfREVWKGssIGkpXSkgfHwKLQkJCSAgICAhcHRyX3N0YWxlKGItPmMsIGssIGkpKSB7Ci0JCQkJZy0+Z2VuID0gUFRSX0dFTihrLCBpKTsKLQotCQkJCWlmIChiLT5sZXZlbCkKLQkJCQkJZy0+cHJpbyA9IEJUUkVFX1BSSU87Ci0JCQkJZWxzZSBpZiAoZy0+cHJpbyA9PSBCVFJFRV9QUklPKQotCQkJCQlnLT5wcmlvID0gSU5JVElBTF9QUklPOwotCQkJfQotCQl9Ci0KLQkJYnRyZWVfbWFya19rZXkoYiwgayk7Ci0JfQorCWJjaF9pbml0aWFsX21hcmtfa2V5KGItPmMsIGItPmxldmVsICsgMSwgJmItPmtleSk7CiAKIAlpZiAoYi0+bGV2ZWwpIHsKIAkJYmNoX2J0cmVlX2l0ZXJfaW5pdCgmYi0+a2V5cywgJml0ZXIsIE5VTEwpOwpAQCAtMTc0Niw0MCArMTgxNCw1OCBAQAogCQkJCWJ0cmVlX25vZGVfcHJlZmV0Y2goYi0+YywgaywgYi0+bGV2ZWwgLSAxKTsKIAogCQkJaWYgKHApCi0JCQkJcmV0ID0gYnRyZWUoY2hlY2tfcmVjdXJzZSwgcCwgYiwgb3AsIHNlZW4pOworCQkJCXJldCA9IGJ0cmVlKGNoZWNrX3JlY3Vyc2UsIHAsIGIsIG9wKTsKIAogCQkJcCA9IGs7CiAJCX0gd2hpbGUgKHAgJiYgIXJldCk7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGJjaF9idHJlZV9jaGVjayhzdHJ1Y3QgY2FjaGVfc2V0ICpjKQogewotCWludCByZXQgPSAtRU5PTUVNOwotCXVuc2lnbmVkIGk7Ci0JdW5zaWduZWQgbG9uZyAqc2VlbltNQVhfQ0FDSEVTX1BFUl9TRVRdOwogCXN0cnVjdCBidHJlZV9vcCBvcDsKIAotCW1lbXNldChzZWVuLCAwLCBzaXplb2Yoc2VlbikpOwogCWJjaF9idHJlZV9vcF9pbml0KCZvcCwgU0hSVF9NQVgpOwogCi0JZm9yIChpID0gMDsgYy0+Y2FjaGVbaV07IGkrKykgewotCQlzaXplX3QgbiA9IERJVl9ST1VORF9VUChjLT5jYWNoZVtpXS0+c2IubmJ1Y2tldHMsIDgpOwotCQlzZWVuW2ldID0ga21hbGxvYyhuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFzZWVuW2ldKQotCQkJZ290byBlcnI7CisJcmV0dXJuIGJ0cmVlX3Jvb3QoY2hlY2tfcmVjdXJzZSwgYywgJm9wKTsKK30KIAotCQkvKiBEaXNhYmxlcyB0aGUgc2VlbiBhcnJheSB1bnRpbCBwcmlvX3JlYWQoKSB1c2VzIGl0IHRvbyAqLwotCQltZW1zZXQoc2VlbltpXSwgMHhGRiwgbik7Cit2b2lkIGJjaF9pbml0aWFsX2djX2ZpbmlzaChzdHJ1Y3QgY2FjaGVfc2V0ICpjKQoreworCXN0cnVjdCBjYWNoZSAqY2E7CisJc3RydWN0IGJ1Y2tldCAqYjsKKwl1bnNpZ25lZCBpOworCisJYmNoX2J0cmVlX2djX2ZpbmlzaChjKTsKKworCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKKworCS8qCisJICogV2UgbmVlZCB0byBwdXQgc29tZSB1bnVzZWQgYnVja2V0cyBkaXJlY3RseSBvbiB0aGUgcHJpbyBmcmVlbGlzdCBpbgorCSAqIG9yZGVyIHRvIGdldCB0aGUgYWxsb2NhdG9yIHRocmVhZCBzdGFydGVkIC0gaXQgbmVlZHMgZnJlZWQgYnVja2V0cyBpbgorCSAqIG9yZGVyIHRvIHJld3JpdGUgdGhlIHByaW9zIGFuZCBnZW5zLCBhbmQgaXQgbmVlZHMgdG8gcmV3cml0ZSBwcmlvcworCSAqIGFuZCBnZW5zIGluIG9yZGVyIHRvIGZyZWUgYnVja2V0cy4KKwkgKgorCSAqIFRoaXMgaXMgb25seSBzYWZlIGZvciBidWNrZXRzIHRoYXQgaGF2ZSBubyBsaXZlIGRhdGEgaW4gdGhlbSwgd2hpY2gKKwkgKiB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIHNvbWUgb2YuCisJICovCisJZm9yX2VhY2hfY2FjaGUoY2EsIGMsIGkpIHsKKwkJZm9yX2VhY2hfYnVja2V0KGIsIGNhKSB7CisJCQlpZiAoZmlmb19mdWxsKCZjYS0+ZnJlZVtSRVNFUlZFX1BSSU9dKSkKKwkJCQlicmVhazsKKworCQkJaWYgKGJjaF9jYW5faW52YWxpZGF0ZV9idWNrZXQoY2EsIGIpICYmCisJCQkgICAgIUdDX01BUksoYikpIHsKKwkJCQlfX2JjaF9pbnZhbGlkYXRlX29uZV9idWNrZXQoY2EsIGIpOworCQkJCWZpZm9fcHVzaCgmY2EtPmZyZWVbUkVTRVJWRV9QUklPXSwKKwkJCQkJICBiIC0gY2EtPmJ1Y2tldHMpOworCQkJfQorCQl9CiAJfQogCi0JcmV0ID0gYnRyZWVfcm9vdChjaGVja19yZWN1cnNlLCBjLCAmb3AsIHNlZW4pOwotZXJyOgotCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0FDSEVTX1BFUl9TRVQ7IGkrKykKLQkJa2ZyZWUoc2VlbltpXSk7Ci0JcmV0dXJuIHJldDsKKwltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKIH0KIAogLyogQnRyZWUgaW5zZXJ0aW9uICovCkBAIC0xODcxLDExICsxOTU3LDE0IEBACiAJY2xvc3VyZV9pbml0X3N0YWNrKCZjbCk7CiAJYmNoX2tleWxpc3RfaW5pdCgmcGFyZW50X2tleXMpOwogCi0JaWYgKCFiLT5sZXZlbCAmJgotCSAgICBidHJlZV9jaGVja19yZXNlcnZlKGIsIG9wKSkKLQkJcmV0dXJuIC1FSU5UUjsKKwlpZiAoYnRyZWVfY2hlY2tfcmVzZXJ2ZShiLCBvcCkpIHsKKwkJaWYgKCFiLT5sZXZlbCkKKwkJCXJldHVybiAtRUlOVFI7CisJCWVsc2UKKwkJCVdBUk4oMSwgImluc3VmZmljaWVudCByZXNlcnZlIGZvciBzcGxpdFxuIik7CisJfQogCi0JbjEgPSBidHJlZV9ub2RlX2FsbG9jX3JlcGxhY2VtZW50KGIsIHRydWUpOworCW4xID0gYnRyZWVfbm9kZV9hbGxvY19yZXBsYWNlbWVudChiLCBvcCk7CiAJaWYgKElTX0VSUihuMSkpCiAJCWdvdG8gZXJyOwogCkBAIC0xODg3LDE2ICsxOTc2LDE5IEBACiAKIAkJdHJhY2VfYmNhY2hlX2J0cmVlX25vZGVfc3BsaXQoYiwgYnRyZWVfYnNldF9maXJzdChuMSktPmtleXMpOwogCi0JCW4yID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYi0+YywgYi0+bGV2ZWwsIHRydWUpOworCQluMiA9IGJjaF9idHJlZV9ub2RlX2FsbG9jKGItPmMsIG9wLCBiLT5sZXZlbCk7CiAJCWlmIChJU19FUlIobjIpKQogCQkJZ290byBlcnJfZnJlZTE7CiAKIAkJaWYgKCFiLT5wYXJlbnQpIHsKLQkJCW4zID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYi0+YywgYi0+bGV2ZWwgKyAxLCB0cnVlKTsKKwkJCW4zID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYi0+Yywgb3AsIGItPmxldmVsICsgMSk7CiAJCQlpZiAoSVNfRVJSKG4zKSkKIAkJCQlnb3RvIGVycl9mcmVlMjsKIAkJfQogCisJCW11dGV4X2xvY2soJm4xLT53cml0ZV9sb2NrKTsKKwkJbXV0ZXhfbG9jaygmbjItPndyaXRlX2xvY2spOworCiAJCWJjaF9idHJlZV9pbnNlcnRfa2V5cyhuMSwgb3AsIGluc2VydF9rZXlzLCByZXBsYWNlX2tleSk7CiAKIAkJLyoKQEAgLTE5MjMsNDUgKzIwMTUsNDUgQEAKIAogCQliY2hfa2V5bGlzdF9hZGQoJnBhcmVudF9rZXlzLCAmbjItPmtleSk7CiAJCWJjaF9idHJlZV9ub2RlX3dyaXRlKG4yLCAmY2wpOworCQltdXRleF91bmxvY2soJm4yLT53cml0ZV9sb2NrKTsKIAkJcndfdW5sb2NrKHRydWUsIG4yKTsKIAl9IGVsc2UgewogCQl0cmFjZV9iY2FjaGVfYnRyZWVfbm9kZV9jb21wYWN0KGIsIGJ0cmVlX2JzZXRfZmlyc3QobjEpLT5rZXlzKTsKIAorCQltdXRleF9sb2NrKCZuMS0+d3JpdGVfbG9jayk7CiAJCWJjaF9idHJlZV9pbnNlcnRfa2V5cyhuMSwgb3AsIGluc2VydF9rZXlzLCByZXBsYWNlX2tleSk7CiAJfQogCiAJYmNoX2tleWxpc3RfYWRkKCZwYXJlbnRfa2V5cywgJm4xLT5rZXkpOwogCWJjaF9idHJlZV9ub2RlX3dyaXRlKG4xLCAmY2wpOworCW11dGV4X3VubG9jaygmbjEtPndyaXRlX2xvY2spOwogCiAJaWYgKG4zKSB7CiAJCS8qIERlcHRoIGluY3JlYXNlcywgbWFrZSBhIG5ldyByb290ICovCisJCW11dGV4X2xvY2soJm4zLT53cml0ZV9sb2NrKTsKIAkJYmtleV9jb3B5X2tleSgmbjMtPmtleSwgJk1BWF9LRVkpOwogCQliY2hfYnRyZWVfaW5zZXJ0X2tleXMobjMsIG9wLCAmcGFyZW50X2tleXMsIE5VTEwpOwogCQliY2hfYnRyZWVfbm9kZV93cml0ZShuMywgJmNsKTsKKwkJbXV0ZXhfdW5sb2NrKCZuMy0+d3JpdGVfbG9jayk7CiAKIAkJY2xvc3VyZV9zeW5jKCZjbCk7CiAJCWJjaF9idHJlZV9zZXRfcm9vdChuMyk7CiAJCXJ3X3VubG9jayh0cnVlLCBuMyk7Ci0KLQkJYnRyZWVfbm9kZV9mcmVlKGIpOwogCX0gZWxzZSBpZiAoIWItPnBhcmVudCkgewogCQkvKiBSb290IGZpbGxlZCB1cCBidXQgZGlkbid0IG5lZWQgdG8gYmUgc3BsaXQgKi8KIAkJY2xvc3VyZV9zeW5jKCZjbCk7CiAJCWJjaF9idHJlZV9zZXRfcm9vdChuMSk7Ci0KLQkJYnRyZWVfbm9kZV9mcmVlKGIpOwogCX0gZWxzZSB7CiAJCS8qIFNwbGl0IGEgbm9uIHJvb3Qgbm9kZSAqLwogCQljbG9zdXJlX3N5bmMoJmNsKTsKIAkJbWFrZV9idHJlZV9mcmVlaW5nX2tleShiLCBwYXJlbnRfa2V5cy50b3ApOwogCQliY2hfa2V5bGlzdF9wdXNoKCZwYXJlbnRfa2V5cyk7CiAKLQkJYnRyZWVfbm9kZV9mcmVlKGIpOwotCiAJCWJjaF9idHJlZV9pbnNlcnRfbm9kZShiLT5wYXJlbnQsIG9wLCAmcGFyZW50X2tleXMsIE5VTEwsIE5VTEwpOwogCQlCVUdfT04oIWJjaF9rZXlsaXN0X2VtcHR5KCZwYXJlbnRfa2V5cykpOwogCX0KIAorCWJ0cmVlX25vZGVfZnJlZShiKTsKIAlyd191bmxvY2sodHJ1ZSwgbjEpOwogCiAJYmNoX3RpbWVfc3RhdHNfdXBkYXRlKCZiLT5jLT5idHJlZV9zcGxpdF90aW1lLCBzdGFydF90aW1lKTsKQEAgLTE5NzYsNyArMjA2OCw3IEBACiAJYnRyZWVfbm9kZV9mcmVlKG4xKTsKIAlyd191bmxvY2sodHJ1ZSwgbjEpOwogZXJyOgotCVdBUk4oMSwgImJjYWNoZTogYnRyZWUgc3BsaXQgZmFpbGVkIik7CisJV0FSTigxLCAiYmNhY2hlOiBidHJlZSBzcGxpdCBmYWlsZWQgKGxldmVsICV1KSIsIGItPmxldmVsKTsKIAogCWlmIChuMyA9PSBFUlJfUFRSKC1FQUdBSU4pIHx8CiAJICAgIG4yID09IEVSUl9QVFIoLUVBR0FJTikgfHwKQEAgLTE5OTEsMzMgKzIwODMsNTQgQEAKIAkJCQkgYXRvbWljX3QgKmpvdXJuYWxfcmVmLAogCQkJCSBzdHJ1Y3QgYmtleSAqcmVwbGFjZV9rZXkpCiB7CisJc3RydWN0IGNsb3N1cmUgY2w7CisKIAlCVUdfT04oYi0+bGV2ZWwgJiYgcmVwbGFjZV9rZXkpOwogCisJY2xvc3VyZV9pbml0X3N0YWNrKCZjbCk7CisKKwltdXRleF9sb2NrKCZiLT53cml0ZV9sb2NrKTsKKworCWlmICh3cml0ZV9ibG9jayhiKSAhPSBidHJlZV9ic2V0X2xhc3QoYikgJiYKKwkgICAgYi0+a2V5cy5sYXN0X3NldF91bndyaXR0ZW4pCisJCWJjaF9idHJlZV9pbml0X25leHQoYik7IC8qIGp1c3Qgd3JvdGUgYSBzZXQgKi8KKwogCWlmIChiY2hfa2V5bGlzdF9ua2V5cyhpbnNlcnRfa2V5cykgPiBpbnNlcnRfdTY0c19yZW1haW5pbmcoYikpIHsKLQkJaWYgKGN1cnJlbnQtPmJpb19saXN0KSB7Ci0JCQlvcC0+bG9jayA9IGItPmMtPnJvb3QtPmxldmVsICsgMTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9IGVsc2UgaWYgKG9wLT5sb2NrIDw9IGItPmMtPnJvb3QtPmxldmVsKSB7Ci0JCQlvcC0+bG9jayA9IGItPmMtPnJvb3QtPmxldmVsICsgMTsKLQkJCXJldHVybiAtRUlOVFI7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBJbnZhbGlkYXRlZCBhbGwgaXRlcmF0b3JzICovCi0JCQlpbnQgcmV0ID0gYnRyZWVfc3BsaXQoYiwgb3AsIGluc2VydF9rZXlzLCByZXBsYWNlX2tleSk7CisJCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CisJCWdvdG8gc3BsaXQ7CisJfQogCi0JCQlyZXR1cm4gYmNoX2tleWxpc3RfZW1wdHkoaW5zZXJ0X2tleXMpID8KLQkJCQkwIDogcmV0ID86IC1FSU5UUjsKLQkJfQorCUJVR19PTih3cml0ZV9ibG9jayhiKSAhPSBidHJlZV9ic2V0X2xhc3QoYikpOworCisJaWYgKGJjaF9idHJlZV9pbnNlcnRfa2V5cyhiLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KSkgeworCQlpZiAoIWItPmxldmVsKQorCQkJYmNoX2J0cmVlX2xlYWZfZGlydHkoYiwgam91cm5hbF9yZWYpOworCQllbHNlCisJCQliY2hfYnRyZWVfbm9kZV93cml0ZShiLCAmY2wpOworCX0KKworCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CisKKwkvKiB3YWl0IGZvciBidHJlZSBub2RlIHdyaXRlIGlmIG5lY2Vzc2FyeSwgYWZ0ZXIgdW5sb2NrICovCisJY2xvc3VyZV9zeW5jKCZjbCk7CisKKwlyZXR1cm4gMDsKK3NwbGl0OgorCWlmIChjdXJyZW50LT5iaW9fbGlzdCkgeworCQlvcC0+bG9jayA9IGItPmMtPnJvb3QtPmxldmVsICsgMTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIGlmIChvcC0+bG9jayA8PSBiLT5jLT5yb290LT5sZXZlbCkgeworCQlvcC0+bG9jayA9IGItPmMtPnJvb3QtPmxldmVsICsgMTsKKwkJcmV0dXJuIC1FSU5UUjsKIAl9IGVsc2UgewotCQlCVUdfT04od3JpdGVfYmxvY2soYikgIT0gYnRyZWVfYnNldF9sYXN0KGIpKTsKKwkJLyogSW52YWxpZGF0ZWQgYWxsIGl0ZXJhdG9ycyAqLworCQlpbnQgcmV0ID0gYnRyZWVfc3BsaXQoYiwgb3AsIGluc2VydF9rZXlzLCByZXBsYWNlX2tleSk7CiAKLQkJaWYgKGJjaF9idHJlZV9pbnNlcnRfa2V5cyhiLCBvcCwgaW5zZXJ0X2tleXMsIHJlcGxhY2Vfa2V5KSkgewotCQkJaWYgKCFiLT5sZXZlbCkKLQkJCQliY2hfYnRyZWVfbGVhZl9kaXJ0eShiLCBqb3VybmFsX3JlZik7Ci0JCQllbHNlCi0JCQkJYmNoX2J0cmVlX25vZGVfd3JpdGVfc3luYyhiKTsKLQkJfQotCi0JCXJldHVybiAwOworCQlpZiAoYmNoX2tleWxpc3RfZW1wdHkoaW5zZXJ0X2tleXMpKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKCFyZXQpCisJCQlyZXR1cm4gLUVJTlRSOworCQlyZXR1cm4gcmV0OwogCX0KIH0KIApAQCAtMjQwMywxOCArMjUxNiwzIEBACiAJc3Bpbl9sb2NrX2luaXQoJmJ1Zi0+bG9jayk7CiAJYXJyYXlfYWxsb2NhdG9yX2luaXQoJmJ1Zi0+ZnJlZWxpc3QpOwogfQotCi12b2lkIGJjaF9idHJlZV9leGl0KHZvaWQpCi17Ci0JaWYgKGJ0cmVlX2lvX3dxKQotCQlkZXN0cm95X3dvcmtxdWV1ZShidHJlZV9pb193cSk7Ci19Ci0KLWludCBfX2luaXQgYmNoX2J0cmVlX2luaXQodm9pZCkKLXsKLQlidHJlZV9pb193cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJiY2hfYnRyZWVfaW8iKTsKLQlpZiAoIWJ0cmVlX2lvX3dxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmgKaW5kZXggYWYwNjVlOS4uOTFkZmE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuaAorKysgYi9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5oCkBAIC0xMjcsNiArMTI3LDggQEAKIAlzdHJ1Y3QgY2FjaGVfc2V0CSpjOwogCXN0cnVjdCBidHJlZQkJKnBhcmVudDsKIAorCXN0cnVjdCBtdXRleAkJd3JpdGVfbG9jazsKKwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXVpbnQxNl90CQl3cml0dGVuOwkvKiB3b3VsZCBiZSBuaWNlIHRvIGtpbGwgKi8KIAl1aW50OF90CQkJbGV2ZWw7CkBAIC0yMzYsMTEgKzIzOCwxMyBAQAogfQogCiB2b2lkIGJjaF9idHJlZV9ub2RlX3JlYWRfZG9uZShzdHJ1Y3QgYnRyZWUgKik7Cit2b2lkIF9fYmNoX2J0cmVlX25vZGVfd3JpdGUoc3RydWN0IGJ0cmVlICosIHN0cnVjdCBjbG9zdXJlICopOwogdm9pZCBiY2hfYnRyZWVfbm9kZV93cml0ZShzdHJ1Y3QgYnRyZWUgKiwgc3RydWN0IGNsb3N1cmUgKik7CiAKIHZvaWQgYmNoX2J0cmVlX3NldF9yb290KHN0cnVjdCBidHJlZSAqKTsKLXN0cnVjdCBidHJlZSAqYmNoX2J0cmVlX25vZGVfYWxsb2Moc3RydWN0IGNhY2hlX3NldCAqLCBpbnQsIGJvb2wpOwotc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9nZXQoc3RydWN0IGNhY2hlX3NldCAqLCBzdHJ1Y3QgYmtleSAqLCBpbnQsIGJvb2wpOworc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9hbGxvYyhzdHJ1Y3QgY2FjaGVfc2V0ICosIHN0cnVjdCBidHJlZV9vcCAqLCBpbnQpOworc3RydWN0IGJ0cmVlICpiY2hfYnRyZWVfbm9kZV9nZXQoc3RydWN0IGNhY2hlX3NldCAqLCBzdHJ1Y3QgYnRyZWVfb3AgKiwKKwkJCQkgc3RydWN0IGJrZXkgKiwgaW50LCBib29sKTsKIAogaW50IGJjaF9idHJlZV9pbnNlcnRfY2hlY2tfa2V5KHN0cnVjdCBidHJlZSAqLCBzdHJ1Y3QgYnRyZWVfb3AgKiwKIAkJCSAgICAgICBzdHJ1Y3QgYmtleSAqKTsKQEAgLTI0OCwxMCArMjUyLDEwIEBACiAJCSAgICAgYXRvbWljX3QgKiwgc3RydWN0IGJrZXkgKik7CiAKIGludCBiY2hfZ2NfdGhyZWFkX3N0YXJ0KHN0cnVjdCBjYWNoZV9zZXQgKik7Ci1zaXplX3QgYmNoX2J0cmVlX2djX2ZpbmlzaChzdHJ1Y3QgY2FjaGVfc2V0ICopOwordm9pZCBiY2hfaW5pdGlhbF9nY19maW5pc2goc3RydWN0IGNhY2hlX3NldCAqKTsKIHZvaWQgYmNoX21vdmluZ19nYyhzdHJ1Y3QgY2FjaGVfc2V0ICopOwogaW50IGJjaF9idHJlZV9jaGVjayhzdHJ1Y3QgY2FjaGVfc2V0ICopOwotdWludDhfdCBfX2JjaF9idHJlZV9tYXJrX2tleShzdHJ1Y3QgY2FjaGVfc2V0ICosIGludCwgc3RydWN0IGJrZXkgKik7Cit2b2lkIGJjaF9pbml0aWFsX21hcmtfa2V5KHN0cnVjdCBjYWNoZV9zZXQgKiwgaW50LCBzdHJ1Y3QgYmtleSAqKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHdha2VfdXBfZ2Moc3RydWN0IGNhY2hlX3NldCAqYykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2V4dGVudHMuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2V4dGVudHMuYwppbmRleCA0MTZkMWEzLi4zYTBkZTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9leHRlbnRzLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvZXh0ZW50cy5jCkBAIC0xOTQsOSArMTk0LDkgQEAKIAltdXRleF91bmxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKIAliY2hfZXh0ZW50X3RvX3RleHQoYnVmLCBzaXplb2YoYnVmKSwgayk7CiAJYnRyZWVfYnVnKGIsCi0iaW5jb25zaXN0ZW50IGJ0cmVlIHBvaW50ZXIgJXM6IGJ1Y2tldCAlemkgcGluICVpIHByaW8gJWkgZ2VuICVpIGxhc3RfZ2MgJWkgbWFyayAlbGx1IGdjX2dlbiAlaSIsCisiaW5jb25zaXN0ZW50IGJ0cmVlIHBvaW50ZXIgJXM6IGJ1Y2tldCAlemkgcGluICVpIHByaW8gJWkgZ2VuICVpIGxhc3RfZ2MgJWkgbWFyayAlbGx1IiwKIAkJICBidWYsIFBUUl9CVUNLRVRfTlIoYi0+YywgaywgaSksIGF0b21pY19yZWFkKCZnLT5waW4pLAotCQkgIGctPnByaW8sIGctPmdlbiwgZy0+bGFzdF9nYywgR0NfTUFSSyhnKSwgZy0+Z2NfZ2VuKTsKKwkJICBnLT5wcmlvLCBnLT5nZW4sIGctPmxhc3RfZ2MsIEdDX01BUksoZykpOwogCXJldHVybiB0cnVlOwogfQogCkBAIC0zMDgsNiArMzA4LDE2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGJjaF9zdWJ0cmFjdF9kaXJ0eShzdHJ1Y3QgYmtleSAqaywKKwkJCSAgIHN0cnVjdCBjYWNoZV9zZXQgKmMsCisJCQkgICB1aW50NjRfdCBvZmZzZXQsCisJCQkgICBpbnQgc2VjdG9ycykKK3sKKwlpZiAoS0VZX0RJUlRZKGspKQorCQliY2FjaGVfZGV2X3NlY3RvcnNfZGlydHlfYWRkKGMsIEtFWV9JTk9ERShrKSwKKwkJCQkJICAgICBvZmZzZXQsIC1zZWN0b3JzKTsKK30KKwogc3RhdGljIGJvb2wgYmNoX2V4dGVudF9pbnNlcnRfZml4dXAoc3RydWN0IGJ0cmVlX2tleXMgKmIsCiAJCQkJICAgIHN0cnVjdCBia2V5ICppbnNlcnQsCiAJCQkJICAgIHN0cnVjdCBidHJlZV9pdGVyICppdGVyLApAQCAtMzE1LDEzICszMjUsNiBAQAogewogCXN0cnVjdCBjYWNoZV9zZXQgKmMgPSBjb250YWluZXJfb2YoYiwgc3RydWN0IGJ0cmVlLCBrZXlzKS0+YzsKIAotCXZvaWQgc3VidHJhY3RfZGlydHkoc3RydWN0IGJrZXkgKmssIHVpbnQ2NF90IG9mZnNldCwgaW50IHNlY3RvcnMpCi0JewotCQlpZiAoS0VZX0RJUlRZKGspKQotCQkJYmNhY2hlX2Rldl9zZWN0b3JzX2RpcnR5X2FkZChjLCBLRVlfSU5PREUoayksCi0JCQkJCQkgICAgIG9mZnNldCwgLXNlY3RvcnMpOwotCX0KLQogCXVpbnQ2NF90IG9sZF9vZmZzZXQ7CiAJdW5zaWduZWQgb2xkX3NpemUsIHNlY3RvcnNfZm91bmQgPSAwOwogCkBAIC0zOTgsNyArNDAxLDggQEAKIAogCQkJc3RydWN0IGJrZXkgKnRvcDsKIAotCQkJc3VidHJhY3RfZGlydHkoaywgS0VZX1NUQVJUKGluc2VydCksIEtFWV9TSVpFKGluc2VydCkpOworCQkJYmNoX3N1YnRyYWN0X2RpcnR5KGssIGMsIEtFWV9TVEFSVChpbnNlcnQpLAorCQkJCSAgICAgICBLRVlfU0laRShpbnNlcnQpKTsKIAogCQkJaWYgKGJrZXlfd3JpdHRlbihiLCBrKSkgewogCQkJCS8qCkBAIC00NDgsNyArNDUyLDcgQEAKIAkJCX0KIAkJfQogCi0JCXN1YnRyYWN0X2RpcnR5KGssIG9sZF9vZmZzZXQsIG9sZF9zaXplIC0gS0VZX1NJWkUoaykpOworCQliY2hfc3VidHJhY3RfZGlydHkoaywgYywgb2xkX29mZnNldCwgb2xkX3NpemUgLSBLRVlfU0laRShrKSk7CiAJfQogCiBjaGVja19mYWlsZWQ6CkBAIC00OTksOSArNTAzLDkgQEAKIAogCWlmIChtdXRleF90cnlsb2NrKCZiLT5jLT5idWNrZXRfbG9jaykpIHsKIAkJaWYgKGItPmMtPmdjX21hcmtfdmFsaWQgJiYKLQkJICAgICgoR0NfTUFSSyhnKSAhPSBHQ19NQVJLX0RJUlRZICYmCi0JCSAgICAgIEtFWV9ESVJUWShrKSkgfHwKLQkJICAgICBHQ19NQVJLKGcpID09IEdDX01BUktfTUVUQURBVEEpKQorCQkgICAgKCFHQ19NQVJLKGcpIHx8CisJCSAgICAgR0NfTUFSSyhnKSA9PSBHQ19NQVJLX01FVEFEQVRBIHx8CisJCSAgICAgKEdDX01BUksoZykgIT0gR0NfTUFSS19ESVJUWSAmJiBLRVlfRElSVFkoaykpKSkKIAkJCWdvdG8gZXJyOwogCiAJCWlmIChnLT5wcmlvID09IEJUUkVFX1BSSU8pCkBAIC01MTUsOSArNTE5LDkgQEAKIAltdXRleF91bmxvY2soJmItPmMtPmJ1Y2tldF9sb2NrKTsKIAliY2hfZXh0ZW50X3RvX3RleHQoYnVmLCBzaXplb2YoYnVmKSwgayk7CiAJYnRyZWVfYnVnKGIsCi0iaW5jb25zaXN0ZW50IGV4dGVudCBwb2ludGVyICVzOlxuYnVja2V0ICV6dSBwaW4gJWkgcHJpbyAlaSBnZW4gJWkgbGFzdF9nYyAlaSBtYXJrICVsbHUgZ2NfZ2VuICVpIiwKKyJpbmNvbnNpc3RlbnQgZXh0ZW50IHBvaW50ZXIgJXM6XG5idWNrZXQgJXp1IHBpbiAlaSBwcmlvICVpIGdlbiAlaSBsYXN0X2djICVpIG1hcmsgJWxsdSIsCiAJCSAgYnVmLCBQVFJfQlVDS0VUX05SKGItPmMsIGssIHB0ciksIGF0b21pY19yZWFkKCZnLT5waW4pLAotCQkgIGctPnByaW8sIGctPmdlbiwgZy0+bGFzdF9nYywgR0NfTUFSSyhnKSwgZy0+Z2NfZ2VuKTsKKwkJICBnLT5wcmlvLCBnLT5nZW4sIGctPmxhc3RfZ2MsIEdDX01BUksoZykpOwogCXJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmMKaW5kZXggMTgwMzlhZi4uNTllODIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuYwpAQCAtMjM3LDggKzIzNywxNCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgY2EtPnNiLm5qb3VybmFsX2J1Y2tldHM7IGkrKykKIAkJCWlmIChqYS0+c2VxW2ldID4gc2VxKSB7CiAJCQkJc2VxID0gamEtPnNlcVtpXTsKLQkJCQlqYS0+Y3VyX2lkeCA9IGphLT5kaXNjYXJkX2lkeCA9Ci0JCQkJCWphLT5sYXN0X2lkeCA9IGk7CisJCQkJLyoKKwkJCQkgKiBXaGVuIGpvdXJuYWxfcmVjbGFpbSgpIGdvZXMgdG8gYWxsb2NhdGUgZm9yCisJCQkJICogdGhlIGZpcnN0IHRpbWUsIGl0J2xsIHVzZSB0aGUgYnVja2V0IGFmdGVyCisJCQkJICogamEtPmN1cl9pZHgKKwkJCQkgKi8KKwkJCQlqYS0+Y3VyX2lkeCA9IGk7CisJCQkJamEtPmxhc3RfaWR4ID0gamEtPmRpc2NhcmRfaWR4ID0gKGkgKyAxKSAlCisJCQkJCWNhLT5zYi5uam91cm5hbF9idWNrZXRzOwogCiAJCQl9CiAJfQpAQCAtMjg4LDE2ICsyOTQsMTEgQEAKIAkJICAgICBrID0gYmtleV9uZXh0KGspKSB7CiAJCQl1bnNpZ25lZCBqOwogCi0JCQlmb3IgKGogPSAwOyBqIDwgS0VZX1BUUlMoayk7IGorKykgewotCQkJCXN0cnVjdCBidWNrZXQgKmcgPSBQVFJfQlVDS0VUKGMsIGssIGopOwotCQkJCWF0b21pY19pbmMoJmctPnBpbik7CisJCQlmb3IgKGogPSAwOyBqIDwgS0VZX1BUUlMoayk7IGorKykKKwkJCQlpZiAocHRyX2F2YWlsYWJsZShjLCBrLCBqKSkKKwkJCQkJYXRvbWljX2luYygmUFRSX0JVQ0tFVChjLCBrLCBqKS0+cGluKTsKIAotCQkJCWlmIChnLT5wcmlvID09IEJUUkVFX1BSSU8gJiYKLQkJCQkgICAgIXB0cl9zdGFsZShjLCBrLCBqKSkKLQkJCQkJZy0+cHJpbyA9IElOSVRJQUxfUFJJTzsKLQkJCX0KLQotCQkJX19iY2hfYnRyZWVfbWFya19rZXkoYywgMCwgayk7CisJCQliY2hfaW5pdGlhbF9tYXJrX2tleShjLCAwLCBrKTsKIAkJfQogCX0KIH0KQEAgLTMxMiw4ICszMTMsNiBAQAogCXVpbnQ2NF90IHN0YXJ0ID0gaS0+ai5sYXN0X3NlcSwgZW5kID0gaS0+ai5zZXEsIG4gPSBzdGFydDsKIAlzdHJ1Y3Qga2V5bGlzdCBrZXlsaXN0OwogCi0JYmNoX2tleWxpc3RfaW5pdCgma2V5bGlzdCk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksIGxpc3QsIGxpc3QpIHsKIAkJQlVHX09OKGktPnBpbiAmJiBhdG9taWNfcmVhZChpLT5waW4pICE9IDEpOwogCkBAIC0zMjYsOCArMzI1LDcgQEAKIAkJICAgICBrID0gYmtleV9uZXh0KGspKSB7CiAJCQl0cmFjZV9iY2FjaGVfam91cm5hbF9yZXBsYXlfa2V5KGspOwogCi0JCQlia2V5X2NvcHkoa2V5bGlzdC50b3AsIGspOwotCQkJYmNoX2tleWxpc3RfcHVzaCgma2V5bGlzdCk7CisJCQliY2hfa2V5bGlzdF9pbml0X3NpbmdsZSgma2V5bGlzdCwgayk7CiAKIAkJCXJldCA9IGJjaF9idHJlZV9pbnNlcnQocywgJmtleWxpc3QsIGktPnBpbiwgTlVMTCk7CiAJCQlpZiAocmV0KQpAQCAtMzgzLDE2ICszODEsMTUgQEAKIAogCWIgPSBiZXN0OwogCWlmIChiKSB7Ci0JCXJ3X2xvY2sodHJ1ZSwgYiwgYi0+bGV2ZWwpOwotCisJCW11dGV4X2xvY2soJmItPndyaXRlX2xvY2spOwogCQlpZiAoIWJ0cmVlX2N1cnJlbnRfd3JpdGUoYiktPmpvdXJuYWwpIHsKLQkJCXJ3X3VubG9jayh0cnVlLCBiKTsKKwkJCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CiAJCQkvKiBXZSByYWNlZCAqLwogCQkJZ290byByZXRyeTsKIAkJfQogCi0JCWJjaF9idHJlZV9ub2RlX3dyaXRlKGIsIE5VTEwpOwotCQlyd191bmxvY2sodHJ1ZSwgYik7CisJCV9fYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgTlVMTCk7CisJCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CiAJfQogfQogCkBAIC01MzYsNiArNTMzLDcgQEAKIAlhdG9taWNfc2V0KCZmaWZvX2JhY2soJmotPnBpbiksIDEpOwogCiAJai0+Y3VyLT5kYXRhLT5zZXEJPSArK2otPnNlcTsKKwlqLT5jdXItPmRpcnR5CQk9IGZhbHNlOwogCWotPmN1ci0+bmVlZF93cml0ZQk9IGZhbHNlOwogCWotPmN1ci0+ZGF0YS0+a2V5cwk9IDA7CiAKQEAgLTczMSw3ICs3MjksMTAgQEAKIAkJCQkJICAgc3RydWN0IGNhY2hlX3NldCwKIAkJCQkJICAgam91cm5hbC53b3JrKTsKIAlzcGluX2xvY2soJmMtPmpvdXJuYWwubG9jayk7Ci0Jam91cm5hbF90cnlfd3JpdGUoYyk7CisJaWYgKGMtPmpvdXJuYWwuY3VyLT5kaXJ0eSkKKwkJam91cm5hbF90cnlfd3JpdGUoYyk7CisJZWxzZQorCQlzcGluX3VubG9jaygmYy0+am91cm5hbC5sb2NrKTsKIH0KIAogLyoKQEAgLTc2MSw3ICs3NjIsOCBAQAogCWlmIChwYXJlbnQpIHsKIAkJY2xvc3VyZV93YWl0KCZ3LT53YWl0LCBwYXJlbnQpOwogCQlqb3VybmFsX3RyeV93cml0ZShjKTsKLQl9IGVsc2UgaWYgKCF3LT5uZWVkX3dyaXRlKSB7CisJfSBlbHNlIGlmICghdy0+ZGlydHkpIHsKKwkJdy0+ZGlydHkgPSB0cnVlOwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmMtPmpvdXJuYWwud29yaywKIAkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKGMtPmpvdXJuYWxfZGVsYXlfbXMpKTsKIAkJc3Bpbl91bmxvY2soJmMtPmpvdXJuYWwubG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmggYi9kcml2ZXJzL21kL2JjYWNoZS9qb3VybmFsLmgKaW5kZXggOTE4MGM0NC4uZTNjMzk0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvam91cm5hbC5oCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL2pvdXJuYWwuaApAQCAtOTUsNiArOTUsNyBAQAogCiAJc3RydWN0IGNhY2hlX3NldAkqYzsKIAlzdHJ1Y3QgY2xvc3VyZV93YWl0bGlzdAl3YWl0OworCWJvb2wJCQlkaXJ0eTsKIAlib29sCQkJbmVlZF93cml0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL21vdmluZ2djLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9tb3ZpbmdnYy5jCmluZGV4IDllYjYwZDEuLmNkNzQ5MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL21vdmluZ2djLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvbW92aW5nZ2MuYwpAQCAtMjQsMTIgKzI0LDEwIEBACiAJCQkJCSAgIG1vdmluZ19nY19rZXlzKTsKIAl1bnNpZ25lZCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspIHsKLQkJc3RydWN0IGJ1Y2tldCAqZyA9IFBUUl9CVUNLRVQoYywgaywgaSk7Ci0KLQkJaWYgKEdDX01PVkUoZykpCisJZm9yIChpID0gMDsgaSA8IEtFWV9QVFJTKGspOyBpKyspCisJCWlmIChwdHJfYXZhaWxhYmxlKGMsIGssIGkpICYmCisJCSAgICBHQ19NT1ZFKFBUUl9CVUNLRVQoYywgaywgaSkpKQogCQkJcmV0dXJuIHRydWU7Ci0JfQogCiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtMTE1LDcgKzExMyw3IEBACiAJCWNsb3N1cmVfY2FsbCgmb3AtPmNsLCBiY2hfZGF0YV9pbnNlcnQsIE5VTEwsIGNsKTsKIAl9CiAKLQljb250aW51ZV9hdChjbCwgd3JpdGVfbW92aW5nX2ZpbmlzaCwgc3lzdGVtX3dxKTsKKwljb250aW51ZV9hdChjbCwgd3JpdGVfbW92aW5nX2ZpbmlzaCwgb3AtPndxKTsKIH0KIAogc3RhdGljIHZvaWQgcmVhZF9tb3Zpbmdfc3VibWl0KHN0cnVjdCBjbG9zdXJlICpjbCkKQEAgLTEyNSw3ICsxMjMsNyBAQAogCiAJYmNoX3N1Ym1pdF9iYmlvKGJpbywgaW8tPm9wLmMsICZpby0+dy0+a2V5LCAwKTsKIAotCWNvbnRpbnVlX2F0KGNsLCB3cml0ZV9tb3ZpbmcsIHN5c3RlbV93cSk7CisJY29udGludWVfYXQoY2wsIHdyaXRlX21vdmluZywgaW8tPm9wLndxKTsKIH0KIAogc3RhdGljIHZvaWQgcmVhZF9tb3Zpbmcoc3RydWN0IGNhY2hlX3NldCAqYykKQEAgLTE2MCw2ICsxNTgsNyBAQAogCQlpby0+dwkJPSB3OwogCQlpby0+b3AuaW5vZGUJPSBLRVlfSU5PREUoJnctPmtleSk7CiAJCWlvLT5vcC5jCT0gYzsKKwkJaW8tPm9wLndxCT0gYy0+bW92aW5nX2djX3dxOwogCiAJCW1vdmluZ19pbml0KGlvKTsKIAkJYmlvID0gJmlvLT5iaW8uYmlvOwpAQCAtMjE2LDcgKzIxNSwxMCBAQAogCQljYS0+aGVhcC51c2VkID0gMDsKIAogCQlmb3JfZWFjaF9idWNrZXQoYiwgY2EpIHsKLQkJCWlmICghR0NfU0VDVE9SU19VU0VEKGIpKQorCQkJaWYgKEdDX01BUksoYikgPT0gR0NfTUFSS19NRVRBREFUQSB8fAorCQkJICAgICFHQ19TRUNUT1JTX1VTRUQoYikgfHwKKwkJCSAgICBHQ19TRUNUT1JTX1VTRUQoYikgPT0gY2EtPnNiLmJ1Y2tldF9zaXplIHx8CisJCQkgICAgYXRvbWljX3JlYWQoJmItPnBpbikpCiAJCQkJY29udGludWU7CiAKIAkJCWlmICghaGVhcF9mdWxsKCZjYS0+aGVhcCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuYwppbmRleCA1ZDVkMDMxLi4xNWZmZjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5jCkBAIC0xMiwxMSArMTIsOSBAQAogI2luY2x1ZGUgInJlcXVlc3QuaCIKICNpbmNsdWRlICJ3cml0ZWJhY2suaCIKIAotI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlICJibGstY2dyb3VwLmgiCiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYmNhY2hlLmg+CiAKQEAgLTI3LDE3MSArMjUsMTMgQEAKIAogc3RhdGljIHZvaWQgYmNoX2RhdGFfaW5zZXJ0X3N0YXJ0KHN0cnVjdCBjbG9zdXJlICopOwogCi0vKiBDZ3JvdXAgaW50ZXJmYWNlICovCi0KLSNpZmRlZiBDT05GSUdfQ0dST1VQX0JDQUNIRQotc3RhdGljIHN0cnVjdCBiY2hfY2dyb3VwIGJjYWNoZV9kZWZhdWx0X2Nncm91cCA9IHsgLmNhY2hlX21vZGUgPSAtMSB9OwotCi1zdGF0aWMgc3RydWN0IGJjaF9jZ3JvdXAgKmNncm91cF90b19iY2FjaGUoc3RydWN0IGNncm91cCAqY2dyb3VwKQotewotCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3M7Ci0JcmV0dXJuIGNncm91cCAmJgotCQkoY3NzID0gY2dyb3VwX3N1YnN5c19zdGF0ZShjZ3JvdXAsIGJjYWNoZV9zdWJzeXNfaWQpKQotCQk/IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCBiY2hfY2dyb3VwLCBjc3MpCi0JCTogJmJjYWNoZV9kZWZhdWx0X2Nncm91cDsKLX0KLQotc3RydWN0IGJjaF9jZ3JvdXAgKmJjaF9iaW9fdG9fY2dyb3VwKHN0cnVjdCBiaW8gKmJpbykKLXsKLQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzID0gYmlvLT5iaV9jc3MKLQkJPyBjZ3JvdXBfc3Vic3lzX3N0YXRlKGJpby0+YmlfY3NzLT5jZ3JvdXAsIGJjYWNoZV9zdWJzeXNfaWQpCi0JCTogdGFza19zdWJzeXNfc3RhdGUoY3VycmVudCwgYmNhY2hlX3N1YnN5c19pZCk7Ci0KLQlyZXR1cm4gY3NzCi0JCT8gY29udGFpbmVyX29mKGNzcywgc3RydWN0IGJjaF9jZ3JvdXAsIGNzcykKLQkJOiAmYmNhY2hlX2RlZmF1bHRfY2dyb3VwOwotfQotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9tb2RlX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0LAotCQkJc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciB0bXBbMTAyNF07Ci0JaW50IGxlbiA9IGJjaF9zbnByaW50X3N0cmluZ19saXN0KHRtcCwgUEFHRV9TSVpFLCBiY2hfY2FjaGVfbW9kZXMsCi0JCQkJCSAgY2dyb3VwX3RvX2JjYWNoZShjZ3JwKS0+Y2FjaGVfbW9kZSArIDEpOwotCi0JaWYgKGxlbiA8IDApCi0JCXJldHVybiBsZW47Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHRtcCwgbGVuKTsKLX0KLQotc3RhdGljIGludCBjYWNoZV9tb2RlX3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCwKLQkJCSAgICBjb25zdCBjaGFyICpidWYpCi17Ci0JaW50IHYgPSBiY2hfcmVhZF9zdHJpbmdfbGlzdChidWYsIGJjaF9jYWNoZV9tb2Rlcyk7Ci0JaWYgKHYgPCAwKQotCQlyZXR1cm4gdjsKLQotCWNncm91cF90b19iY2FjaGUoY2dycCktPmNhY2hlX21vZGUgPSB2IC0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU2NCBiY2hfdmVyaWZ5X3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0KQotewotCXJldHVybiBjZ3JvdXBfdG9fYmNhY2hlKGNncnApLT52ZXJpZnk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNoX3ZlcmlmeV93cml0ZShzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQsIHU2NCB2YWwpCi17Ci0JY2dyb3VwX3RvX2JjYWNoZShjZ3JwKS0+dmVyaWZ5ID0gdmFsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTY0IGJjaF9jYWNoZV9oaXRzX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0KQotewotCXN0cnVjdCBiY2hfY2dyb3VwICpiY2FjaGVjZyA9IGNncm91cF90b19iY2FjaGUoY2dycCk7Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZiY2FjaGVjZy0+c3RhdHMuY2FjaGVfaGl0cyk7Ci19Ci0KLXN0YXRpYyB1NjQgYmNoX2NhY2hlX21pc3Nlc19yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCkKLXsKLQlzdHJ1Y3QgYmNoX2Nncm91cCAqYmNhY2hlY2cgPSBjZ3JvdXBfdG9fYmNhY2hlKGNncnApOwotCXJldHVybiBhdG9taWNfcmVhZCgmYmNhY2hlY2ctPnN0YXRzLmNhY2hlX21pc3Nlcyk7Ci19Ci0KLXN0YXRpYyB1NjQgYmNoX2NhY2hlX2J5cGFzc19oaXRzX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwKLQkJCQkJIHN0cnVjdCBjZnR5cGUgKmNmdCkKLXsKLQlzdHJ1Y3QgYmNoX2Nncm91cCAqYmNhY2hlY2cgPSBjZ3JvdXBfdG9fYmNhY2hlKGNncnApOwotCXJldHVybiBhdG9taWNfcmVhZCgmYmNhY2hlY2ctPnN0YXRzLmNhY2hlX2J5cGFzc19oaXRzKTsKLX0KLQotc3RhdGljIHU2NCBiY2hfY2FjaGVfYnlwYXNzX21pc3Nlc19yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JCQkJCSAgIHN0cnVjdCBjZnR5cGUgKmNmdCkKLXsKLQlzdHJ1Y3QgYmNoX2Nncm91cCAqYmNhY2hlY2cgPSBjZ3JvdXBfdG9fYmNhY2hlKGNncnApOwotCXJldHVybiBhdG9taWNfcmVhZCgmYmNhY2hlY2ctPnN0YXRzLmNhY2hlX2J5cGFzc19taXNzZXMpOwotfQotCi1zdGF0aWMgc3RydWN0IGNmdHlwZSBiY2hfZmlsZXNbXSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJjYWNoZV9tb2RlIiwKLQkJLnJlYWQJCT0gY2FjaGVfbW9kZV9yZWFkLAotCQkud3JpdGVfc3RyaW5nCT0gY2FjaGVfbW9kZV93cml0ZSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gInZlcmlmeSIsCi0JCS5yZWFkX3U2NAk9IGJjaF92ZXJpZnlfcmVhZCwKLQkJLndyaXRlX3U2NAk9IGJjaF92ZXJpZnlfd3JpdGUsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJjYWNoZV9oaXRzIiwKLQkJLnJlYWRfdTY0CT0gYmNoX2NhY2hlX2hpdHNfcmVhZCwKLQl9LAotCXsKLQkJLm5hbWUJCT0gImNhY2hlX21pc3NlcyIsCi0JCS5yZWFkX3U2NAk9IGJjaF9jYWNoZV9taXNzZXNfcmVhZCwKLQl9LAotCXsKLQkJLm5hbWUJCT0gImNhY2hlX2J5cGFzc19oaXRzIiwKLQkJLnJlYWRfdTY0CT0gYmNoX2NhY2hlX2J5cGFzc19oaXRzX3JlYWQsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJjYWNoZV9ieXBhc3NfbWlzc2VzIiwKLQkJLnJlYWRfdTY0CT0gYmNoX2NhY2hlX2J5cGFzc19taXNzZXNfcmVhZCwKLQl9LAotCXsgfQkvKiB0ZXJtaW5hdGUgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGluaXRfYmNoX2Nncm91cChzdHJ1Y3QgYmNoX2Nncm91cCAqY2cpCi17Ci0JY2ctPmNhY2hlX21vZGUgPSAtMTsKLX0KLQotc3RhdGljIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpiY2FjaGVjZ19jcmVhdGUoc3RydWN0IGNncm91cCAqY2dyb3VwKQotewotCXN0cnVjdCBiY2hfY2dyb3VwICpjZzsKLQotCWNnID0ga3phbGxvYyhzaXplb2YoKmNnKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjZykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaW5pdF9iY2hfY2dyb3VwKGNnKTsKLQlyZXR1cm4gJmNnLT5jc3M7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjYWNoZWNnX2Rlc3Ryb3koc3RydWN0IGNncm91cCAqY2dyb3VwKQotewotCXN0cnVjdCBiY2hfY2dyb3VwICpjZyA9IGNncm91cF90b19iY2FjaGUoY2dyb3VwKTsKLQlrZnJlZShjZyk7Ci19Ci0KLXN0cnVjdCBjZ3JvdXBfc3Vic3lzIGJjYWNoZV9zdWJzeXMgPSB7Ci0JLmNyZWF0ZQkJPSBiY2FjaGVjZ19jcmVhdGUsCi0JLmRlc3Ryb3kJPSBiY2FjaGVjZ19kZXN0cm95LAotCS5zdWJzeXNfaWQJPSBiY2FjaGVfc3Vic3lzX2lkLAotCS5uYW1lCQk9ICJiY2FjaGUiLAotCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCi19OwotRVhQT1JUX1NZTUJPTF9HUEwoYmNhY2hlX3N1YnN5cyk7Ci0jZW5kaWYKLQogc3RhdGljIHVuc2lnbmVkIGNhY2hlX21vZGUoc3RydWN0IGNhY2hlZF9kZXYgKmRjLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0jaWZkZWYgQ09ORklHX0NHUk9VUF9CQ0FDSEUKLQlpbnQgciA9IGJjaF9iaW9fdG9fY2dyb3VwKGJpbyktPmNhY2hlX21vZGU7Ci0JaWYgKHIgPj0gMCkKLQkJcmV0dXJuIHI7Ci0jZW5kaWYKIAlyZXR1cm4gQkRFVl9DQUNIRV9NT0RFKCZkYy0+c2IpOwogfQogCiBzdGF0aWMgYm9vbCB2ZXJpZnkoc3RydWN0IGNhY2hlZF9kZXYgKmRjLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0jaWZkZWYgQ09ORklHX0NHUk9VUF9CQ0FDSEUKLQlpZiAoYmNoX2Jpb190b19jZ3JvdXAoYmlvKS0+dmVyaWZ5KQotCQlyZXR1cm4gdHJ1ZTsKLSNlbmRpZgogCXJldHVybiBkYy0+dmVyaWZ5OwogfQogCkBAIC0yNDgsNyArODgsNyBAQAogCQlhdG9taWNfZGVjX2J1Zyhqb3VybmFsX3JlZik7CiAKIAlpZiAoIW9wLT5pbnNlcnRfZGF0YV9kb25lKQotCQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X3N0YXJ0LCBiY2FjaGVfd3EpOworCQljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X3N0YXJ0LCBvcC0+d3EpOwogCiAJYmNoX2tleWxpc3RfZnJlZSgmb3AtPmluc2VydF9rZXlzKTsKIAljbG9zdXJlX3JldHVybihjbCk7CkBAIC0yOTcsNyArMTM3LDcgQEAKIAlvcC0+aW5zZXJ0X2RhdGFfZG9uZSA9IHRydWU7CiAJYmlvX3B1dChiaW8pOwogb3V0OgotCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgYmNhY2hlX3dxKTsKKwljb250aW51ZV9hdChjbCwgYmNoX2RhdGFfaW5zZXJ0X2tleXMsIG9wLT53cSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJjaF9kYXRhX2luc2VydF9lcnJvcihzdHJ1Y3QgY2xvc3VyZSAqY2wpCkBAIC0zNDAsNyArMTgwLDcgQEAKIAkJaWYgKG9wLT53cml0ZWJhY2spCiAJCQlvcC0+ZXJyb3IgPSBlcnJvcjsKIAkJZWxzZSBpZiAoIW9wLT5yZXBsYWNlKQotCQkJc2V0X2Nsb3N1cmVfZm4oY2wsIGJjaF9kYXRhX2luc2VydF9lcnJvciwgYmNhY2hlX3dxKTsKKwkJCXNldF9jbG9zdXJlX2ZuKGNsLCBiY2hfZGF0YV9pbnNlcnRfZXJyb3IsIG9wLT53cSk7CiAJCWVsc2UKIAkJCXNldF9jbG9zdXJlX2ZuKGNsLCBOVUxMLCBOVUxMKTsKIAl9CkBAIC0zNzYsNyArMjE2LDcgQEAKIAkJaWYgKGJjaF9rZXlsaXN0X3JlYWxsb2MoJm9wLT5pbnNlcnRfa2V5cywKIAkJCQkJMyArIChvcC0+Y3N1bSA/IDEgOiAwKSwKIAkJCQkJb3AtPmMpKQotCQkJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBiY2FjaGVfd3EpOworCQkJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBvcC0+d3EpOwogCiAJCWsgPSBvcC0+aW5zZXJ0X2tleXMudG9wOwogCQlia2V5X2luaXQoayk7CkBAIC00MTMsNyArMjUzLDcgQEAKIAl9IHdoaWxlIChuICE9IGJpbyk7CiAKIAlvcC0+aW5zZXJ0X2RhdGFfZG9uZSA9IHRydWU7Ci0JY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBiY2FjaGVfd3EpOworCWNvbnRpbnVlX2F0KGNsLCBiY2hfZGF0YV9pbnNlcnRfa2V5cywgb3AtPndxKTsKIGVycjoKIAkvKiBiY2hfYWxsb2Nfc2VjdG9ycygpIGJsb2NrcyBpZiBzLT53cml0ZWJhY2sgPSB0cnVlICovCiAJQlVHX09OKG9wLT53cml0ZWJhY2spOwpAQCAtNDQyLDcgKzI4Miw3IEBACiAJCWJpb19wdXQoYmlvKTsKIAogCQlpZiAoIWJjaF9rZXlsaXN0X2VtcHR5KCZvcC0+aW5zZXJ0X2tleXMpKQotCQkJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBiY2FjaGVfd3EpOworCQkJY29udGludWVfYXQoY2wsIGJjaF9kYXRhX2luc2VydF9rZXlzLCBvcC0+d3EpOwogCQllbHNlCiAJCQljbG9zdXJlX3JldHVybihjbCk7CiAJfQpAQCAtODI0LDYgKzY2NCw3IEBACiAJcy0+aW9wLmVycm9yCQk9IDA7CiAJcy0+aW9wLmZsYWdzCQk9IDA7CiAJcy0+aW9wLmZsdXNoX2pvdXJuYWwJPSAoYmlvLT5iaV9ydyAmIChSRVFfRkxVU0h8UkVRX0ZVQSkpICE9IDA7CisJcy0+aW9wLndxCQk9IGJjYWNoZV93cTsKIAogCXJldHVybiBzOwogfQpAQCAtMTIwMywyMiArMTA0NCwxMyBAQAogc3RhdGljIGludCBmbGFzaF9kZXZfY2FjaGVfbWlzcyhzdHJ1Y3QgYnRyZWUgKmIsIHN0cnVjdCBzZWFyY2ggKnMsCiAJCQkJc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBzZWN0b3JzKQogewotCXN0cnVjdCBiaW9fdmVjIGJ2OwotCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKKwl1bnNpZ25lZCBieXRlcyA9IG1pbihzZWN0b3JzLCBiaW9fc2VjdG9ycyhiaW8pKSA8PCA5OwogCi0JLyogWmVybyBmaWxsIGJpbyAqLworCXN3YXAoYmlvLT5iaV9pdGVyLmJpX3NpemUsIGJ5dGVzKTsKKwl6ZXJvX2ZpbGxfYmlvKGJpbyk7CisJc3dhcChiaW8tPmJpX2l0ZXIuYmlfc2l6ZSwgYnl0ZXMpOwogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaXRlcikgewotCQl1bnNpZ25lZCBqID0gbWluKGJ2LmJ2X2xlbiA+PiA5LCBzZWN0b3JzKTsKLQotCQl2b2lkICpwID0ga21hcChidi5idl9wYWdlKTsKLQkJbWVtc2V0KHAgKyBidi5idl9vZmZzZXQsIDAsIGogPDwgOSk7Ci0JCWt1bm1hcChidi5idl9wYWdlKTsKLQotCQlzZWN0b3JzCS09IGo7Ci0JfQotCi0JYmlvX2FkdmFuY2UoYmlvLCBtaW4oc2VjdG9ycyA8PCA5LCBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSkpOworCWJpb19hZHZhbmNlKGJpbywgYnl0ZXMpOwogCiAJaWYgKCFiaW8tPmJpX2l0ZXIuYmlfc2l6ZSkKIAkJcmV0dXJuIE1BUF9ET05FOwpAQCAtMTMxMyw5ICsxMTQ1LDYgQEAKIAogdm9pZCBiY2hfcmVxdWVzdF9leGl0KHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX0NHUk9VUF9CQ0FDSEUKLQljZ3JvdXBfdW5sb2FkX3N1YnN5cygmYmNhY2hlX3N1YnN5cyk7Ci0jZW5kaWYKIAlpZiAoYmNoX3NlYXJjaF9jYWNoZSkKIAkJa21lbV9jYWNoZV9kZXN0cm95KGJjaF9zZWFyY2hfY2FjaGUpOwogfQpAQCAtMTMyNiwxMSArMTE1NSw1IEBACiAJaWYgKCFiY2hfc2VhcmNoX2NhY2hlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotI2lmZGVmIENPTkZJR19DR1JPVVBfQkNBQ0hFCi0JY2dyb3VwX2xvYWRfc3Vic3lzKCZiY2FjaGVfc3Vic3lzKTsKLQlpbml0X2JjaF9jZ3JvdXAoJmJjYWNoZV9kZWZhdWx0X2Nncm91cCk7Ci0KLQljZ3JvdXBfYWRkX2NmdHlwZXMoJmJjYWNoZV9zdWJzeXMsIGJjaF9maWxlcyk7Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuaCBiL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuaAppbmRleCAzOWYyMWRiLi4xZmYzNjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmgKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5oCkBAIC0xLDEyICsxLDExIEBACiAjaWZuZGVmIF9CQ0FDSEVfUkVRVUVTVF9IXwogI2RlZmluZSBfQkNBQ0hFX1JFUVVFU1RfSF8KIAotI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgotCiBzdHJ1Y3QgZGF0YV9pbnNlcnRfb3AgewogCXN0cnVjdCBjbG9zdXJlCQljbDsKIAlzdHJ1Y3QgY2FjaGVfc2V0CSpjOwogCXN0cnVjdCBiaW8JCSpiaW87CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCiAJdW5zaWduZWQJCWlub2RlOwogCXVpbnQxNl90CQl3cml0ZV9wb2ludDsKQEAgLTQxLDIwICs0MCw0IEBACiAKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYmNoX3NlYXJjaF9jYWNoZSwgKmJjaF9wYXNzdGhyb3VnaF9jYWNoZTsKIAotc3RydWN0IGJjaF9jZ3JvdXAgewotI2lmZGVmIENPTkZJR19DR1JPVVBfQkNBQ0hFCi0Jc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUJY3NzOwotI2VuZGlmCi0JLyoKLQkgKiBXZSBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgaW5kZXggaW50byBiY2hfY2FjaGVfbW9kZXNbXSwgc28gdGhhdAotCSAqIGRlZmF1bHQgPT0gLTE7IHRoaXMgbWFrZXMgaXQgc28gdGhlIHJlc3QgbWF0Y2ggdXAgd2l0aCBkLT5jYWNoZV9tb2RlLAotCSAqIGFuZCB3ZSB1c2UgZC0+Y2FjaGVfbW9kZSBpZiBjZ3JwLT5jYWNoZV9tb2RlIDwgMAotCSAqLwotCXNob3J0CQkJCWNhY2hlX21vZGU7Ci0JYm9vbAkJCQl2ZXJpZnk7Ci0Jc3RydWN0IGNhY2hlX3N0YXRfY29sbGVjdG9yCXN0YXRzOwotfTsKLQotc3RydWN0IGJjaF9jZ3JvdXAgKmJjaF9iaW9fdG9fY2dyb3VwKHN0cnVjdCBiaW8gKmJpbyk7Ci0KICNlbmRpZiAvKiBfQkNBQ0hFX1JFUVVFU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL3N0YXRzLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9zdGF0cy5jCmluZGV4IDg0ZDA3ODIuLjBjYTA3MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3N0YXRzLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvc3RhdHMuYwpAQCAtMjAxLDkgKzIwMSw2IEBACiAJc3RydWN0IGNhY2hlZF9kZXYgKmRjID0gY29udGFpbmVyX29mKGQsIHN0cnVjdCBjYWNoZWRfZGV2LCBkaXNrKTsKIAltYXJrX2NhY2hlX3N0YXRzKCZkYy0+YWNjb3VudGluZy5jb2xsZWN0b3IsIGhpdCwgYnlwYXNzKTsKIAltYXJrX2NhY2hlX3N0YXRzKCZjLT5hY2NvdW50aW5nLmNvbGxlY3RvciwgaGl0LCBieXBhc3MpOwotI2lmZGVmIENPTkZJR19DR1JPVVBfQkNBQ0hFCi0JbWFya19jYWNoZV9zdGF0cygmKGJjaF9iaW9fdG9fY2dyb3VwKHMtPm9yaWdfYmlvKS0+c3RhdHMpLCBoaXQsIGJ5cGFzcyk7Ci0jZW5kaWYKIH0KIAogdm9pZCBiY2hfbWFya19jYWNoZV9yZWFkYWhlYWQoc3RydWN0IGNhY2hlX3NldCAqYywgc3RydWN0IGJjYWNoZV9kZXZpY2UgKmQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jIGIvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYwppbmRleCAyNGEzYTE1Li45MjZkZWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMKQEAgLTU0MSw5ICs1NDEsNiBAQAogCWNsb3N1cmVfc3luYyhjbCk7CiB9CiAKLSNkZWZpbmUgYnVja2V0c19mcmVlKGMpCSJmcmVlICV6dSwgZnJlZV9pbmMgJXp1LCB1bnVzZWQgJXp1IiwJCVwKLQlmaWZvX3VzZWQoJmMtPmZyZWUpLCBmaWZvX3VzZWQoJmMtPmZyZWVfaW5jKSwgZmlmb191c2VkKCZjLT51bnVzZWQpCi0KIHZvaWQgYmNoX3ByaW9fd3JpdGUoc3RydWN0IGNhY2hlICpjYSkKIHsKIAlpbnQgaTsKQEAgLTU1NCwxMCArNTUxLDYgQEAKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhLT5zZXQtPmJ1Y2tldF9sb2NrKTsKIAotCWZvciAoYiA9IGNhLT5idWNrZXRzOwotCSAgICAgYiA8IGNhLT5idWNrZXRzICsgY2EtPnNiLm5idWNrZXRzOyBiKyspCi0JCWItPmRpc2tfZ2VuID0gYi0+Z2VuOwotCiAJY2EtPmRpc2tfYnVja2V0cy0+c2VxKys7CiAKIAlhdG9taWNfbG9uZ19hZGQoY2EtPnNiLmJ1Y2tldF9zaXplICogcHJpb19idWNrZXRzKGNhKSwKQEAgLTYwMSwxNCArNTk0LDE3IEBACiAKIAltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAKLQljYS0+bmVlZF9zYXZlX3ByaW8gPSAwOwotCiAJLyoKIAkgKiBEb24ndCB3YW50IHRoZSBvbGQgcHJpb3JpdGllcyB0byBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQgdW50aWwgYWZ0ZXIgd2UKIAkgKiBmaW5pc2ggd3JpdGluZyB0aGUgbmV3IG9uZXMsIGFuZCB0aGV5J3JlIGpvdXJuYWxsZWQKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpb19idWNrZXRzKGNhKTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwcmlvX2J1Y2tldHMoY2EpOyBpKyspIHsKKwkJaWYgKGNhLT5wcmlvX2xhc3RfYnVja2V0c1tpXSkKKwkJCV9fYmNoX2J1Y2tldF9mcmVlKGNhLAorCQkJCSZjYS0+YnVja2V0c1tjYS0+cHJpb19sYXN0X2J1Y2tldHNbaV1dKTsKKwogCQljYS0+cHJpb19sYXN0X2J1Y2tldHNbaV0gPSBjYS0+cHJpb19idWNrZXRzW2ldOworCX0KIH0KIAogc3RhdGljIHZvaWQgcHJpb19yZWFkKHN0cnVjdCBjYWNoZSAqY2EsIHVpbnQ2NF90IGJ1Y2tldCkKQEAgLTYzOSw3ICs2MzUsNyBAQAogCQl9CiAKIAkJYi0+cHJpbyA9IGxlMTZfdG9fY3B1KGQtPnByaW8pOwotCQliLT5nZW4gPSBiLT5kaXNrX2dlbiA9IGItPmxhc3RfZ2MgPSBiLT5nY19nZW4gPSBkLT5nZW47CisJCWItPmdlbiA9IGItPmxhc3RfZ2MgPSBkLT5nZW47CiAJfQogfQogCkBAIC04NDMsNiArODM5LDcgQEAKIAlxLT5saW1pdHMubWF4X3NlZ21lbnRfc2l6ZQk9IFVJTlRfTUFYOwogCXEtPmxpbWl0cy5tYXhfc2VnbWVudHMJCT0gQklPX01BWF9QQUdFUzsKIAlxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycwk9IFVJTlRfTUFYOworCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5CT0gNTEyOwogCXEtPmxpbWl0cy5pb19taW4JCT0gYmxvY2tfc2l6ZTsKIAlxLT5saW1pdHMubG9naWNhbF9ibG9ja19zaXplCT0gYmxvY2tfc2l6ZTsKIAlxLT5saW1pdHMucGh5c2ljYWxfYmxvY2tfc2l6ZQk9IGJsb2NrX3NpemU7CkBAIC0xMzU1LDYgKzEzNTIsOCBAQAogCWJjaF9ic2V0X3NvcnRfc3RhdGVfZnJlZSgmYy0+c29ydCk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgYy0+dXVpZHMsIGlsb2cyKGJ1Y2tldF9wYWdlcyhjKSkpOwogCisJaWYgKGMtPm1vdmluZ19nY193cSkKKwkJZGVzdHJveV93b3JrcXVldWUoYy0+bW92aW5nX2djX3dxKTsKIAlpZiAoYy0+YmlvX3NwbGl0KQogCQliaW9zZXRfZnJlZShjLT5iaW9fc3BsaXQpOwogCWlmIChjLT5maWxsX2l0ZXIpCkBAIC0xMzk1LDE0ICsxMzk0LDIxIEBACiAJCWxpc3RfYWRkKCZjLT5yb290LT5saXN0LCAmYy0+YnRyZWVfY2FjaGUpOwogCiAJLyogU2hvdWxkIHNraXAgdGhpcyBpZiB3ZSdyZSB1bnJlZ2lzdGVyaW5nIGJlY2F1c2Ugb2YgYW4gZXJyb3IgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5idHJlZV9jYWNoZSwgbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5idHJlZV9jYWNoZSwgbGlzdCkgeworCQltdXRleF9sb2NrKCZiLT53cml0ZV9sb2NrKTsKIAkJaWYgKGJ0cmVlX25vZGVfZGlydHkoYikpCi0JCQliY2hfYnRyZWVfbm9kZV93cml0ZShiLCBOVUxMKTsKKwkJCV9fYmNoX2J0cmVlX25vZGVfd3JpdGUoYiwgTlVMTCk7CisJCW11dGV4X3VubG9jaygmYi0+d3JpdGVfbG9jayk7CisJfQogCiAJZm9yX2VhY2hfY2FjaGUoY2EsIGMsIGkpCiAJCWlmIChjYS0+YWxsb2NfdGhyZWFkKQogCQkJa3RocmVhZF9zdG9wKGNhLT5hbGxvY190aHJlYWQpOwogCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjLT5qb3VybmFsLndvcmspOworCS8qIGZsdXNoIGxhc3Qgam91cm5hbCBlbnRyeSBpZiBuZWVkZWQgKi8KKwljLT5qb3VybmFsLndvcmsud29yay5mdW5jKCZjLT5qb3VybmFsLndvcmsud29yayk7CisKIAljbG9zdXJlX3JldHVybihjbCk7CiB9CiAKQEAgLTE0ODUsMTQgKzE0OTEsMTMgQEAKIAogCXNlbWFfaW5pdCgmYy0+c2Jfd3JpdGVfbXV0ZXgsIDEpOwogCW11dGV4X2luaXQoJmMtPmJ1Y2tldF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT50cnlfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+YnRyZWVfY2FjaGVfd2FpdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+YnVja2V0X3dhaXQpOwogCXNlbWFfaW5pdCgmYy0+dXVpZF93cml0ZV9tdXRleCwgMSk7CiAKIAlzcGluX2xvY2tfaW5pdCgmYy0+YnRyZWVfZ2NfdGltZS5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYy0+YnRyZWVfc3BsaXRfdGltZS5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYy0+YnRyZWVfcmVhZF90aW1lLmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZjLT50cnlfaGFyZGVyX3RpbWUubG9jayk7CiAKIAliY2hfbW92aW5nX2luaXRfY2FjaGVfc2V0KGMpOwogCkBAIC0xNTE3LDYgKzE1MjIsNyBAQAogCSAgICAhKGMtPmZpbGxfaXRlciA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbCgxLCBpdGVyX3NpemUpKSB8fAogCSAgICAhKGMtPmJpb19zcGxpdCA9IGJpb3NldF9jcmVhdGUoNCwgb2Zmc2V0b2Yoc3RydWN0IGJiaW8sIGJpbykpKSB8fAogCSAgICAhKGMtPnV1aWRzID0gYWxsb2NfYnVja2V0X3BhZ2VzKEdGUF9LRVJORUwsIGMpKSB8fAorCSAgICAhKGMtPm1vdmluZ19nY193cSA9IGNyZWF0ZV93b3JrcXVldWUoImJjYWNoZV9nYyIpKSB8fAogCSAgICBiY2hfam91cm5hbF9hbGxvYyhjKSB8fAogCSAgICBiY2hfYnRyZWVfY2FjaGVfYWxsb2MoYykgfHwKIAkgICAgYmNoX29wZW5fYnVja2V0c19hbGxvYyhjKSB8fApAQCAtMTU4MCw3ICsxNTg2LDcgQEAKIAkJCWdvdG8gZXJyOwogCiAJCWVyciA9ICJlcnJvciByZWFkaW5nIGJ0cmVlIHJvb3QiOwotCQljLT5yb290ID0gYmNoX2J0cmVlX25vZGVfZ2V0KGMsIGssIGotPmJ0cmVlX2xldmVsLCB0cnVlKTsKKwkJYy0+cm9vdCA9IGJjaF9idHJlZV9ub2RlX2dldChjLCBOVUxMLCBrLCBqLT5idHJlZV9sZXZlbCwgdHJ1ZSk7CiAJCWlmIChJU19FUlJfT1JfTlVMTChjLT5yb290KSkKIAkJCWdvdG8gZXJyOwogCkBAIC0xNTk2LDcgKzE2MDIsNyBAQAogCQkJZ290byBlcnI7CiAKIAkJYmNoX2pvdXJuYWxfbWFyayhjLCAmam91cm5hbCk7Ci0JCWJjaF9idHJlZV9nY19maW5pc2goYyk7CisJCWJjaF9pbml0aWFsX2djX2ZpbmlzaChjKTsKIAkJcHJfZGVidWcoImJ0cmVlX2NoZWNrKCkgZG9uZSIpOwogCiAJCS8qCkBAIC0xNjM4LDcgKzE2NDQsNyBAQAogCQkJCWNhLT5zYi5kW2pdID0gY2EtPnNiLmZpcnN0X2J1Y2tldCArIGo7CiAJCX0KIAotCQliY2hfYnRyZWVfZ2NfZmluaXNoKGMpOworCQliY2hfaW5pdGlhbF9nY19maW5pc2goYyk7CiAKIAkJZXJyID0gImVycm9yIHN0YXJ0aW5nIGFsbG9jYXRvciB0aHJlYWQiOwogCQlmb3JfZWFjaF9jYWNoZShjYSwgYywgaSkKQEAgLTE2NTUsMTIgKzE2NjEsMTQgQEAKIAkJCWdvdG8gZXJyOwogCiAJCWVyciA9ICJjYW5ub3QgYWxsb2NhdGUgbmV3IGJ0cmVlIHJvb3QiOwotCQljLT5yb290ID0gYmNoX2J0cmVlX25vZGVfYWxsb2MoYywgMCwgdHJ1ZSk7CisJCWMtPnJvb3QgPSBiY2hfYnRyZWVfbm9kZV9hbGxvYyhjLCBOVUxMLCAwKTsKIAkJaWYgKElTX0VSUl9PUl9OVUxMKGMtPnJvb3QpKQogCQkJZ290byBlcnI7CiAKKwkJbXV0ZXhfbG9jaygmYy0+cm9vdC0+d3JpdGVfbG9jayk7CiAJCWJrZXlfY29weV9rZXkoJmMtPnJvb3QtPmtleSwgJk1BWF9LRVkpOwogCQliY2hfYnRyZWVfbm9kZV93cml0ZShjLT5yb290LCAmY2wpOworCQltdXRleF91bmxvY2soJmMtPnJvb3QtPndyaXRlX2xvY2spOwogCiAJCWJjaF9idHJlZV9zZXRfcm9vdChjLT5yb290KTsKIAkJcndfdW5sb2NrKHRydWUsIGMtPnJvb3QpOwpAQCAtMTc4Miw3ICsxNzkwLDYgQEAKIAl2ZnJlZShjYS0+YnVja2V0cyk7CiAKIAlmcmVlX2hlYXAoJmNhLT5oZWFwKTsKLQlmcmVlX2ZpZm8oJmNhLT51bnVzZWQpOwogCWZyZWVfZmlmbygmY2EtPmZyZWVfaW5jKTsKIAogCWZvciAoaSA9IDA7IGkgPCBSRVNFUlZFX05SOyBpKyspCkBAIC0xODE5LDcgKzE4MjYsNiBAQAogCSAgICAhaW5pdF9maWZvKCZjYS0+ZnJlZVtSRVNFUlZFX01PVklOR0dDXSwgZnJlZSwgR0ZQX0tFUk5FTCkgfHwKIAkgICAgIWluaXRfZmlmbygmY2EtPmZyZWVbUkVTRVJWRV9OT05FXSwgZnJlZSwgR0ZQX0tFUk5FTCkgfHwKIAkgICAgIWluaXRfZmlmbygmY2EtPmZyZWVfaW5jLAlmcmVlIDw8IDIsIEdGUF9LRVJORUwpIHx8Ci0JICAgICFpbml0X2ZpZm8oJmNhLT51bnVzZWQsCWZyZWUgPDwgMiwgR0ZQX0tFUk5FTCkgfHwKIAkgICAgIWluaXRfaGVhcCgmY2EtPmhlYXAsCWZyZWUgPDwgMywgR0ZQX0tFUk5FTCkgfHwKIAkgICAgIShjYS0+YnVja2V0cwk9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWNrZXQpICoKIAkJCQkJICBjYS0+c2IubmJ1Y2tldHMpKSB8fApAQCAtMTgzNCwxMyArMTg0MCw3IEBACiAJZm9yX2VhY2hfYnVja2V0KGIsIGNhKQogCQlhdG9taWNfc2V0KCZiLT5waW4sIDApOwogCi0JaWYgKGJjaF9jYWNoZV9hbGxvY2F0b3JfaW5pdChjYSkpCi0JCWdvdG8gZXJyOwotCiAJcmV0dXJuIDA7Ci1lcnI6Ci0Ja29iamVjdF9wdXQoJmNhLT5rb2JqKTsKLQlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgcmVnaXN0ZXJfY2FjaGUoc3RydWN0IGNhY2hlX3NiICpzYiwgc3RydWN0IHBhZ2UgKnNiX3BhZ2UsCkBAIC0xODY5LDcgKzE4NjksMTAgQEAKIAlpZiAoa29iamVjdF9hZGQoJmNhLT5rb2JqLCAmcGFydF90b19kZXYoYmRldi0+YmRfcGFydCktPmtvYmosICJiY2FjaGUiKSkKIAkJZ290byBlcnI7CiAKKwltdXRleF9sb2NrKCZiY2hfcmVnaXN0ZXJfbG9jayk7CiAJZXJyID0gcmVnaXN0ZXJfY2FjaGVfc2V0KGNhKTsKKwltdXRleF91bmxvY2soJmJjaF9yZWdpc3Rlcl9sb2NrKTsKKwogCWlmIChlcnIpCiAJCWdvdG8gZXJyOwogCkBAIC0xOTMxLDggKzE5MzQsNiBAQAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JbXV0ZXhfbG9jaygmYmNoX3JlZ2lzdGVyX2xvY2spOwotCiAJaWYgKCEocGF0aCA9IGtzdHJuZHVwKGJ1ZmZlciwgc2l6ZSwgR0ZQX0tFUk5FTCkpIHx8CiAJICAgICEoc2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2FjaGVfc2IpLCBHRlBfS0VSTkVMKSkpCiAJCWdvdG8gZXJyOwpAQCAtMTk2NSw3ICsxOTY2LDkgQEAKIAkJaWYgKCFkYykKIAkJCWdvdG8gZXJyX2Nsb3NlOwogCisJCW11dGV4X2xvY2soJmJjaF9yZWdpc3Rlcl9sb2NrKTsKIAkJcmVnaXN0ZXJfYmRldihzYiwgc2JfcGFnZSwgYmRldiwgZGMpOworCQltdXRleF91bmxvY2soJmJjaF9yZWdpc3Rlcl9sb2NrKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgY2FjaGUgKmNhID0ga3phbGxvYyhzaXplb2YoKmNhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghY2EpCkBAIC0xOTc4LDcgKzE5ODEsNiBAQAogCQlwdXRfcGFnZShzYl9wYWdlKTsKIAlrZnJlZShzYik7CiAJa2ZyZWUocGF0aCk7Ci0JbXV0ZXhfdW5sb2NrKCZiY2hfcmVnaXN0ZXJfbG9jayk7CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAJcmV0dXJuIHJldDsKIApAQCAtMjA1Nyw3ICsyMDU5LDYgQEAKIHsKIAliY2hfZGVidWdfZXhpdCgpOwogCWJjaF9yZXF1ZXN0X2V4aXQoKTsKLQliY2hfYnRyZWVfZXhpdCgpOwogCWlmIChiY2FjaGVfa29iaikKIAkJa29iamVjdF9wdXQoYmNhY2hlX2tvYmopOwogCWlmIChiY2FjaGVfd3EpCkBAIC0yMDg3LDcgKzIwODgsNiBAQAogCWlmICghKGJjYWNoZV93cSA9IGNyZWF0ZV93b3JrcXVldWUoImJjYWNoZSIpKSB8fAogCSAgICAhKGJjYWNoZV9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiYmNhY2hlIiwgZnNfa29iaikpIHx8CiAJICAgIHN5c2ZzX2NyZWF0ZV9maWxlcyhiY2FjaGVfa29iaiwgZmlsZXMpIHx8Ci0JICAgIGJjaF9idHJlZV9pbml0KCkgfHwKIAkgICAgYmNoX3JlcXVlc3RfaW5pdCgpIHx8CiAJICAgIGJjaF9kZWJ1Z19pbml0KGJjYWNoZV9rb2JqKSkKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JjYWNoZS9zeXNmcy5jIGIvZHJpdmVycy9tZC9iY2FjaGUvc3lzZnMuYwppbmRleCBkODQ1OGQ0Li5iM2ZmNTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N5c2ZzLmMKQEAgLTU0LDcgKzU0LDYgQEAKIHN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlKGJ0cmVlX3NwbGl0LCBzZWMsIHVzKTsKIHN5c2ZzX3RpbWVfc3RhdHNfYXR0cmlidXRlKGJ0cmVlX3NvcnQsCW1zLCAgdXMpOwogc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGUoYnRyZWVfcmVhZCwJbXMsICB1cyk7Ci1zeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZSh0cnlfaGFyZGVyLAltcywgIHVzKTsKIAogcmVhZF9hdHRyaWJ1dGUoYnRyZWVfbm9kZXMpOwogcmVhZF9hdHRyaWJ1dGUoYnRyZWVfdXNlZF9wZXJjZW50KTsKQEAgLTQwNiw3ICs0MDUsNyBAQAogCXN0cnVjdCBic2V0X3N0YXRzIHN0YXRzOwogfTsKIAotc3RhdGljIGludCBidHJlZV9ic2V0X3N0YXRzKHN0cnVjdCBidHJlZV9vcCAqYl9vcCwgc3RydWN0IGJ0cmVlICpiKQorc3RhdGljIGludCBiY2hfYnRyZWVfYnNldF9zdGF0cyhzdHJ1Y3QgYnRyZWVfb3AgKmJfb3AsIHN0cnVjdCBidHJlZSAqYikKIHsKIAlzdHJ1Y3QgYnNldF9zdGF0c19vcCAqb3AgPSBjb250YWluZXJfb2YoYl9vcCwgc3RydWN0IGJzZXRfc3RhdHNfb3AsIG9wKTsKIApAQCAtNDI0LDcgKzQyMyw3IEBACiAJbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7CiAJYmNoX2J0cmVlX29wX2luaXQoJm9wLm9wLCAtMSk7CiAKLQlyZXQgPSBiY2hfYnRyZWVfbWFwX25vZGVzKCZvcC5vcCwgYywgJlpFUk9fS0VZLCBidHJlZV9ic2V0X3N0YXRzKTsKKwlyZXQgPSBiY2hfYnRyZWVfbWFwX25vZGVzKCZvcC5vcCwgYywgJlpFUk9fS0VZLCBiY2hfYnRyZWVfYnNldF9zdGF0cyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTQ0Miw4MSArNDQxLDgxIEBACiAJCQlvcC5zdGF0cy5mbG9hdHMsIG9wLnN0YXRzLmZhaWxlZCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBiY2hfcm9vdF91c2FnZShzdHJ1Y3QgY2FjaGVfc2V0ICpjKQoreworCXVuc2lnbmVkIGJ5dGVzID0gMDsKKwlzdHJ1Y3QgYmtleSAqazsKKwlzdHJ1Y3QgYnRyZWUgKmI7CisJc3RydWN0IGJ0cmVlX2l0ZXIgaXRlcjsKKworCWdvdG8gbG9ja19yb290OworCisJZG8geworCQlyd191bmxvY2soZmFsc2UsIGIpOworbG9ja19yb290OgorCQliID0gYy0+cm9vdDsKKwkJcndfbG9jayhmYWxzZSwgYiwgYi0+bGV2ZWwpOworCX0gd2hpbGUgKGIgIT0gYy0+cm9vdCk7CisKKwlmb3JfZWFjaF9rZXlfZmlsdGVyKCZiLT5rZXlzLCBrLCAmaXRlciwgYmNoX3B0cl9iYWQpCisJCWJ5dGVzICs9IGJrZXlfYnl0ZXMoayk7CisKKwlyd191bmxvY2soZmFsc2UsIGIpOworCisJcmV0dXJuIChieXRlcyAqIDEwMCkgLyBidHJlZV9ieXRlcyhjKTsKK30KKworc3RhdGljIHNpemVfdCBiY2hfY2FjaGVfc2l6ZShzdHJ1Y3QgY2FjaGVfc2V0ICpjKQoreworCXNpemVfdCByZXQgPSAwOworCXN0cnVjdCBidHJlZSAqYjsKKworCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5idHJlZV9jYWNoZSwgbGlzdCkKKwkJcmV0ICs9IDEgPDwgKGItPmtleXMucGFnZV9vcmRlciArIFBBR0VfU0hJRlQpOworCisJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGJjaF9jYWNoZV9tYXhfY2hhaW4oc3RydWN0IGNhY2hlX3NldCAqYykKK3sKKwl1bnNpZ25lZCByZXQgPSAwOworCXN0cnVjdCBobGlzdF9oZWFkICpoOworCisJbXV0ZXhfbG9jaygmYy0+YnVja2V0X2xvY2spOworCisJZm9yIChoID0gYy0+YnVja2V0X2hhc2g7CisJICAgICBoIDwgYy0+YnVja2V0X2hhc2ggKyAoMSA8PCBCVUNLRVRfSEFTSF9CSVRTKTsKKwkgICAgIGgrKykgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJc3RydWN0IGhsaXN0X25vZGUgKnA7CisKKwkJaGxpc3RfZm9yX2VhY2gocCwgaCkKKwkJCWkrKzsKKworCQlyZXQgPSBtYXgocmV0LCBpKTsKKwl9CisKKwltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgYmNoX2J0cmVlX3VzZWQoc3RydWN0IGNhY2hlX3NldCAqYykKK3sKKwlyZXR1cm4gZGl2NjRfdTY0KGMtPmdjX3N0YXRzLmtleV9ieXRlcyAqIDEwMCwKKwkJCSAoYy0+Z2Nfc3RhdHMubm9kZXMgPzogMSkgKiBidHJlZV9ieXRlcyhjKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBiY2hfYXZlcmFnZV9rZXlfc2l6ZShzdHJ1Y3QgY2FjaGVfc2V0ICpjKQoreworCXJldHVybiBjLT5nY19zdGF0cy5ua2V5cworCQk/IGRpdjY0X3U2NChjLT5nY19zdGF0cy5kYXRhLCBjLT5nY19zdGF0cy5ua2V5cykKKwkJOiAwOworfQorCiBTSE9XKF9fYmNoX2NhY2hlX3NldCkKIHsKLQl1bnNpZ25lZCByb290X3VzYWdlKHN0cnVjdCBjYWNoZV9zZXQgKmMpCi0JewotCQl1bnNpZ25lZCBieXRlcyA9IDA7Ci0JCXN0cnVjdCBia2V5ICprOwotCQlzdHJ1Y3QgYnRyZWUgKmI7Ci0JCXN0cnVjdCBidHJlZV9pdGVyIGl0ZXI7Ci0KLQkJZ290byBsb2NrX3Jvb3Q7Ci0KLQkJZG8gewotCQkJcndfdW5sb2NrKGZhbHNlLCBiKTsKLWxvY2tfcm9vdDoKLQkJCWIgPSBjLT5yb290OwotCQkJcndfbG9jayhmYWxzZSwgYiwgYi0+bGV2ZWwpOwotCQl9IHdoaWxlIChiICE9IGMtPnJvb3QpOwotCi0JCWZvcl9lYWNoX2tleV9maWx0ZXIoJmItPmtleXMsIGssICZpdGVyLCBiY2hfcHRyX2JhZCkKLQkJCWJ5dGVzICs9IGJrZXlfYnl0ZXMoayk7Ci0KLQkJcndfdW5sb2NrKGZhbHNlLCBiKTsKLQotCQlyZXR1cm4gKGJ5dGVzICogMTAwKSAvIGJ0cmVlX2J5dGVzKGMpOwotCX0KLQotCXNpemVfdCBjYWNoZV9zaXplKHN0cnVjdCBjYWNoZV9zZXQgKmMpCi0JewotCQlzaXplX3QgcmV0ID0gMDsKLQkJc3RydWN0IGJ0cmVlICpiOwotCi0JCW11dGV4X2xvY2soJmMtPmJ1Y2tldF9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmYy0+YnRyZWVfY2FjaGUsIGxpc3QpCi0JCQlyZXQgKz0gMSA8PCAoYi0+a2V5cy5wYWdlX29yZGVyICsgUEFHRV9TSElGVCk7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZjLT5idWNrZXRfbG9jayk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JdW5zaWduZWQgY2FjaGVfbWF4X2NoYWluKHN0cnVjdCBjYWNoZV9zZXQgKmMpCi0JewotCQl1bnNpZ25lZCByZXQgPSAwOwotCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaDsKLQotCQltdXRleF9sb2NrKCZjLT5idWNrZXRfbG9jayk7Ci0KLQkJZm9yIChoID0gYy0+YnVja2V0X2hhc2g7Ci0JCSAgICAgaCA8IGMtPmJ1Y2tldF9oYXNoICsgKDEgPDwgQlVDS0VUX0hBU0hfQklUUyk7Ci0JCSAgICAgaCsrKSB7Ci0JCQl1bnNpZ25lZCBpID0gMDsKLQkJCXN0cnVjdCBobGlzdF9ub2RlICpwOwotCi0JCQlobGlzdF9mb3JfZWFjaChwLCBoKQotCQkJCWkrKzsKLQotCQkJcmV0ID0gbWF4KHJldCwgaSk7Ci0JCX0KLQotCQltdXRleF91bmxvY2soJmMtPmJ1Y2tldF9sb2NrKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl1bnNpZ25lZCBidHJlZV91c2VkKHN0cnVjdCBjYWNoZV9zZXQgKmMpCi0JewotCQlyZXR1cm4gZGl2NjRfdTY0KGMtPmdjX3N0YXRzLmtleV9ieXRlcyAqIDEwMCwKLQkJCQkgKGMtPmdjX3N0YXRzLm5vZGVzID86IDEpICogYnRyZWVfYnl0ZXMoYykpOwotCX0KLQotCXVuc2lnbmVkIGF2ZXJhZ2Vfa2V5X3NpemUoc3RydWN0IGNhY2hlX3NldCAqYykKLQl7Ci0JCXJldHVybiBjLT5nY19zdGF0cy5ua2V5cwotCQkJPyBkaXY2NF91NjQoYy0+Z2Nfc3RhdHMuZGF0YSwgYy0+Z2Nfc3RhdHMubmtleXMpCi0JCQk6IDA7Ci0JfQotCiAJc3RydWN0IGNhY2hlX3NldCAqYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgY2FjaGVfc2V0LCBrb2JqKTsKIAogCXN5c2ZzX3ByaW50KHN5bmNocm9ub3VzLAkJQ0FDSEVfU1lOQygmYy0+c2IpKTsKQEAgLTUyNCwyMSArNTIzLDIwIEBACiAJc3lzZnNfaHByaW50KGJ1Y2tldF9zaXplLAkJYnVja2V0X2J5dGVzKGMpKTsKIAlzeXNmc19ocHJpbnQoYmxvY2tfc2l6ZSwJCWJsb2NrX2J5dGVzKGMpKTsKIAlzeXNmc19wcmludCh0cmVlX2RlcHRoLAkJCWMtPnJvb3QtPmxldmVsKTsKLQlzeXNmc19wcmludChyb290X3VzYWdlX3BlcmNlbnQsCQlyb290X3VzYWdlKGMpKTsKKwlzeXNmc19wcmludChyb290X3VzYWdlX3BlcmNlbnQsCQliY2hfcm9vdF91c2FnZShjKSk7CiAKLQlzeXNmc19ocHJpbnQoYnRyZWVfY2FjaGVfc2l6ZSwJCWNhY2hlX3NpemUoYykpOwotCXN5c2ZzX3ByaW50KGJ0cmVlX2NhY2hlX21heF9jaGFpbiwJY2FjaGVfbWF4X2NoYWluKGMpKTsKKwlzeXNmc19ocHJpbnQoYnRyZWVfY2FjaGVfc2l6ZSwJCWJjaF9jYWNoZV9zaXplKGMpKTsKKwlzeXNmc19wcmludChidHJlZV9jYWNoZV9tYXhfY2hhaW4sCWJjaF9jYWNoZV9tYXhfY2hhaW4oYykpOwogCXN5c2ZzX3ByaW50KGNhY2hlX2F2YWlsYWJsZV9wZXJjZW50LAkxMDAgLSBjLT5nY19zdGF0cy5pbl91c2UpOwogCiAJc3lzZnNfcHJpbnRfdGltZV9zdGF0cygmYy0+YnRyZWVfZ2NfdGltZSwJYnRyZWVfZ2MsIHNlYywgbXMpOwogCXN5c2ZzX3ByaW50X3RpbWVfc3RhdHMoJmMtPmJ0cmVlX3NwbGl0X3RpbWUsCWJ0cmVlX3NwbGl0LCBzZWMsIHVzKTsKIAlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT5zb3J0LnRpbWUsCQlidHJlZV9zb3J0LCBtcywgdXMpOwogCXN5c2ZzX3ByaW50X3RpbWVfc3RhdHMoJmMtPmJ0cmVlX3JlYWRfdGltZSwJYnRyZWVfcmVhZCwgbXMsIHVzKTsKLQlzeXNmc19wcmludF90aW1lX3N0YXRzKCZjLT50cnlfaGFyZGVyX3RpbWUsCXRyeV9oYXJkZXIsIG1zLCB1cyk7CiAKLQlzeXNmc19wcmludChidHJlZV91c2VkX3BlcmNlbnQsCWJ0cmVlX3VzZWQoYykpOworCXN5c2ZzX3ByaW50KGJ0cmVlX3VzZWRfcGVyY2VudCwJYmNoX2J0cmVlX3VzZWQoYykpOwogCXN5c2ZzX3ByaW50KGJ0cmVlX25vZGVzLAljLT5nY19zdGF0cy5ub2Rlcyk7Ci0Jc3lzZnNfaHByaW50KGF2ZXJhZ2Vfa2V5X3NpemUsCWF2ZXJhZ2Vfa2V5X3NpemUoYykpOworCXN5c2ZzX2hwcmludChhdmVyYWdlX2tleV9zaXplLAliY2hfYXZlcmFnZV9rZXlfc2l6ZShjKSk7CiAKIAlzeXNmc19wcmludChjYWNoZV9yZWFkX3JhY2VzLAogCQkgICAgYXRvbWljX2xvbmdfcmVhZCgmYy0+Y2FjaGVfcmVhZF9yYWNlcykpOwpAQCAtNzA5LDcgKzcwNyw2IEBACiAJc3lzZnNfdGltZV9zdGF0c19hdHRyaWJ1dGVfbGlzdChidHJlZV9zcGxpdCwgc2VjLCB1cykKIAlzeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZV9saXN0KGJ0cmVlX3NvcnQsIG1zLCB1cykKIAlzeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZV9saXN0KGJ0cmVlX3JlYWQsIG1zLCB1cykKLQlzeXNmc190aW1lX3N0YXRzX2F0dHJpYnV0ZV9saXN0KHRyeV9oYXJkZXIsIG1zLCB1cykKIAogCSZzeXNmc19idHJlZV9ub2RlcywKIAkmc3lzZnNfYnRyZWVfdXNlZF9wZXJjZW50LApAQCAtNzYxLDcgKzc1OCw5IEBACiAJCWludCBjbXAoY29uc3Qgdm9pZCAqbCwgY29uc3Qgdm9pZCAqcikKIAkJewlyZXR1cm4gKigodWludDE2X3QgKikgcikgLSAqKCh1aW50MTZfdCAqKSBsKTsgfQogCi0JCXNpemVfdCBuID0gY2EtPnNiLm5idWNrZXRzLCBpLCB1bnVzZWQsIGJ0cmVlOworCQlzdHJ1Y3QgYnVja2V0ICpiOworCQlzaXplX3QgbiA9IGNhLT5zYi5uYnVja2V0cywgaTsKKwkJc2l6ZV90IHVudXNlZCA9IDAsIGF2YWlsYWJsZSA9IDAsIGRpcnR5ID0gMCwgbWV0YSA9IDA7CiAJCXVpbnQ2NF90IHN1bSA9IDA7CiAJCS8qIENvbXB1dGUgMzEgcXVhbnRpbGVzICovCiAJCXVpbnQxNl90IHFbMzFdLCAqcCwgKmNhY2hlZDsKQEAgLTc3Miw2ICs3NzEsMTcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCiAJCW11dGV4X2xvY2soJmNhLT5zZXQtPmJ1Y2tldF9sb2NrKTsKKwkJZm9yX2VhY2hfYnVja2V0KGIsIGNhKSB7CisJCQlpZiAoIUdDX1NFQ1RPUlNfVVNFRChiKSkKKwkJCQl1bnVzZWQrKzsKKwkJCWlmIChHQ19NQVJLKGIpID09IEdDX01BUktfUkVDTEFJTUFCTEUpCisJCQkJYXZhaWxhYmxlKys7CisJCQlpZiAoR0NfTUFSSyhiKSA9PSBHQ19NQVJLX0RJUlRZKQorCQkJCWRpcnR5Kys7CisJCQlpZiAoR0NfTUFSSyhiKSA9PSBHQ19NQVJLX01FVEFEQVRBKQorCQkJCW1ldGErKzsKKwkJfQorCiAJCWZvciAoaSA9IGNhLT5zYi5maXJzdF9idWNrZXQ7IGkgPCBuOyBpKyspCiAJCQlwW2ldID0gY2EtPmJ1Y2tldHNbaV0ucHJpbzsKIAkJbXV0ZXhfdW5sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CkBAIC03ODYsMTAgKzc5Niw3IEBACiAKIAkJd2hpbGUgKGNhY2hlZCA8IHAgKyBuICYmCiAJCSAgICAgICAqY2FjaGVkID09IEJUUkVFX1BSSU8pCi0JCQljYWNoZWQrKzsKLQotCQlidHJlZSA9IGNhY2hlZCAtIHA7Ci0JCW4gLT0gYnRyZWU7CisJCQljYWNoZWQrKywgbi0tOwogCiAJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAJCQlzdW0gKz0gSU5JVElBTF9QUklPIC0gY2FjaGVkW2ldOwpAQCAtODA1LDEyICs4MTIsMTYgQEAKIAogCQlyZXQgPSBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsCiAJCQkJIlVudXNlZDoJCSV6dSUlXG4iCisJCQkJIkNsZWFuOgkJJXp1JSVcbiIKKwkJCQkiRGlydHk6CQklenUlJVxuIgogCQkJCSJNZXRhZGF0YToJJXp1JSVcbiIKIAkJCQkiQXZlcmFnZToJJWxsdVxuIgogCQkJCSJTZWN0b3JzIHBlciBROgklenVcbiIKIAkJCQkiUXVhbnRpbGVzOglbIiwKIAkJCQl1bnVzZWQgKiAxMDAgLyAoc2l6ZV90KSBjYS0+c2IubmJ1Y2tldHMsCi0JCQkJYnRyZWUgKiAxMDAgLyAoc2l6ZV90KSBjYS0+c2IubmJ1Y2tldHMsIHN1bSwKKwkJCQlhdmFpbGFibGUgKiAxMDAgLyAoc2l6ZV90KSBjYS0+c2IubmJ1Y2tldHMsCisJCQkJZGlydHkgKiAxMDAgLyAoc2l6ZV90KSBjYS0+c2IubmJ1Y2tldHMsCisJCQkJbWV0YSAqIDEwMCAvIChzaXplX3QpIGNhLT5zYi5uYnVja2V0cywgc3VtLAogCQkJCW4gKiBjYS0+c2IuYnVja2V0X3NpemUgLyAoQVJSQVlfU0laRShxKSArIDEpKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShxKTsgaSsrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvdHJhY2UuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3RyYWNlLmMKaW5kZXggYWRiYzNkZi4uYjc4MjBiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvdHJhY2UuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS90cmFjZS5jCkBAIC00NSw3ICs0NSw3IEBACiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJjYWNoZV9idHJlZV9ub2RlX2NvbXBhY3QpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChiY2FjaGVfYnRyZWVfc2V0X3Jvb3QpOwogCi1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJjYWNoZV9hbGxvY19pbnZhbGlkYXRlKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmNhY2hlX2ludmFsaWRhdGUpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChiY2FjaGVfYWxsb2NfZmFpbCk7CiAKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmNhY2hlX3dyaXRlYmFjayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCmluZGV4IDA4ZDlhMjAuLmI0MjhjMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCkBAIC02Niw3ICs2Niw3IEBACiAJbXNnLT5zZXEgPSB0ZnItPnNlcTsKIAltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0KSArIHRmci0+ZGF0YV9zaXplOwogCi0JciA9IGNuX25ldGxpbmtfc2VuZChtc2csIDAsIGdmcF9hbnkoKSk7CisJciA9IGNuX25ldGxpbmtfc2VuZChtc2csIDAsIDAsIGdmcF9hbnkoKSk7CiAKIAlyZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL2FkdjczNDMuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL2FkdjczNDMuYwppbmRleCBkNGUxNWE2Li45ZDM4ZjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9hZHY3MzQzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvYWR2NzM0My5jCkBAIC0yNiwxMiArMjYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvYWR2NzM0My5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItYXN5bmMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLW9mLmg+CiAKICNpbmNsdWRlICJhZHY3MzQzX3JlZ3MuaCIKIApAQCAtNDEwLDcgKzQxMCw3IEBACiAJaWYgKCFJU19FTkFCTEVEKENPTkZJR19PRikgfHwgIWNsaWVudC0+ZGV2Lm9mX25vZGUpCiAJCXJldHVybiBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JbnAgPSB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOworCW5wID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CiAJaWYgKCFucCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvaTJjL210OXAwMzEuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL210OXAwMzEuYwppbmRleCBlNWRkZjQ3Li4xOTJjNGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2kyYy9tdDlwMDMxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9pMmMvbXQ5cDAzMS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTI5LDcgKzMwLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9tdDlwMDMxLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1vZi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CiAKICNpbmNsdWRlICJhcHRpbmEtcGxsLmgiCkBAIC05NDMsNyArOTQzLDcgQEAKIAlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX09GKSB8fCAhY2xpZW50LT5kZXYub2Zfbm9kZSkKIAkJcmV0dXJuIGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlucCA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CisJbnAgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvczVrNWJhZi5jIGIvZHJpdmVycy9tZWRpYS9pMmMvczVrNWJhZi5jCmluZGV4IDc3ZTEwZTAuLjJkNzY4ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3M1azViYWYuYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy9zNWs1YmFmLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZWRpYS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtMTg1NSw3ICsxODU2LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCW5vZGVfZXAgPSB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KG5vZGUsIE5VTEwpOworCW5vZGVfZXAgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChub2RlLCBOVUxMKTsKIAlpZiAoIW5vZGVfZXApIHsKIAkJZGV2X2VycihkZXYsICJubyBlbmRwb2ludCBkZWZpbmVkIGF0IG5vZGUgJXNcbiIsCiAJCQlub2RlLT5mdWxsX25hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9pMmMvdHZwNTE0eC5jIGIvZHJpdmVycy9tZWRpYS9pMmMvdHZwNTE0eC5jCmluZGV4IDgzZDg1ZGYuLmNhMDAxMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDUxNHguYworKysgYi9kcml2ZXJzL21lZGlhL2kyYy90dnA1MTR4LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1hc3luYy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC0xMDY4LDcgKzEwNjksNyBAQAogCWlmICghSVNfRU5BQkxFRChDT05GSUdfT0YpIHx8ICFjbGllbnQtPmRldi5vZl9ub2RlKQogCQlyZXR1cm4gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWVuZHBvaW50ID0gdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMKTsKKwllbmRwb2ludCA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOwogCWlmICghZW5kcG9pbnQpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy90dnA3MDAyLmMgYi9kcml2ZXJzL21lZGlhL2kyYy90dnA3MDAyLmMKaW5kZXggOTEyZTFjYy4uYzRlMWUyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9pMmMvdHZwNzAwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3R2cDcwMDIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KICNpbmNsdWRlIDxsaW51eC92NGwyLWR2LXRpbWluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS90dnA3MDAyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1hc3luYy5oPgpAQCAtOTU3LDcgKzk1OCw3IEBACiAJaWYgKCFJU19FTkFCTEVEKENPTkZJR19PRikgfHwgIWNsaWVudC0+ZGV2Lm9mX25vZGUpCiAJCXJldHVybiBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JZW5kcG9pbnQgPSB2NGwyX29mX2dldF9uZXh0X2VuZHBvaW50KGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwpOworCWVuZHBvaW50ID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQoY2xpZW50LT5kZXYub2Zfbm9kZSwgTlVMTCk7CiAJaWYgKCFlbmRwb2ludCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MTgvY3gxOC1hbHNhLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MTgvY3gxOC1hbHNhLW1haW4uYwppbmRleCBiMmM4YzM0Li5lYTI3MmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9jeDE4L2N4MTgtYWxzYS1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gxOC9jeDE4LWFsc2EtbWFpbi5jCkBAIC0xNDUsMTEgKzE0NSwxMiBAQAogCS8qIFRoaXMgaXMgYSBuby1vcCBmb3IgdXMuICBXZSdsbCB1c2UgdGhlIGN4LT5pbnN0YW5jZSAqLwogCiAJLyogKDIpIENyZWF0ZSBhIGNhcmQgaW5zdGFuY2UgKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoU05EUlZfREVGQVVMVF9JRFgxLCAvKiB1c2UgZmlyc3QgYXZhaWxhYmxlIGlkICovCi0JCQkgICAgICBTTkRSVl9ERUZBVUxUX1NUUjEsIC8qIHhpZCBmcm9tIGVuZCBvZiBzaG9ydG5hbWUqLwotCQkJICAgICAgVEhJU19NT0RVTEUsIDAsICZzYyk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZjeC0+cGNpX2Rldi0+ZGV2LAorCQkJICAgU05EUlZfREVGQVVMVF9JRFgxLCAvKiB1c2UgZmlyc3QgYXZhaWxhYmxlIGlkICovCisJCQkgICBTTkRSVl9ERUZBVUxUX1NUUjEsIC8qIHhpZCBmcm9tIGVuZCBvZiBzaG9ydG5hbWUqLworCQkJICAgVEhJU19NT0RVTEUsIDAsICZzYyk7CiAJaWYgKHJldCkgewotCQlDWDE4X0FMU0FfRVJSKCIlczogc25kX2NhcmRfY3JlYXRlKCkgZmFpbGVkIHdpdGggZXJyICVkXG4iLAorCQlDWDE4X0FMU0FfRVJSKCIlczogc25kX2NhcmRfbmV3KCkgZmFpbGVkIHdpdGggZXJyICVkXG4iLAogCQkJICAgICAgX19mdW5jX18sIHJldCk7CiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS1hbHNhLmMKaW5kZXggYzZjOWJkNS4uNTU0Nzk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtYWxzYS5jCkBAIC00ODksNyArNDg5LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAorCWVyciA9IHNuZF9jYXJkX25ldygmZGV2LT5wY2ktPmRldiwKKwkJCSAgIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAogCQkJVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CkBAIC01MDAsOCArNTAxLDYgQEAKIAljaGlwLT5jYXJkID0gY2FyZDsKIAlzcGluX2xvY2tfaW5pdCgmY2hpcC0+bG9jayk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPnBjaS0+ZGV2KTsKLQogCWVyciA9IHNuZF9jeDIzODg1X3BjbShjaGlwLCAwLCAiQ1gyMzg4NSBEaWdpdGFsIik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYwppbmRleCBiMWUwOGMzLi4yZGQ1YmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKQEAgLTY0NSw4ICs2NDUsOSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLAotCQkJc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2F1ZGlvX2RldiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+cGNpLT5kZXYsIGluZGV4W2Rldm5vXSwgaWRbZGV2bm9dLAorCQkJICAgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IGN4MjU4MjFfYXVkaW9fZGV2KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXByX2luZm8oIkRFQlVHIEVSUk9SOiBjYW5ub3QgY3JlYXRlIHNuZF9jYXJkX25ldyBpbiAlc1xuIiwKIAkJCV9fZnVuY19fKTsKQEAgLTY4Miw4ICs2ODMsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmNoaXAtPnBjaS0+ZGV2KTsKLQogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJjeDI1ODIxIik7CiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4IGlycSAlZCIsIGNoaXAtPmRldi0+bmFtZSwKIAkJY2hpcC0+aW9iYXNlLCBjaGlwLT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3g4OC9jeDg4LWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4ODgvY3g4OC1hbHNhLmMKaW5kZXggZDAxNDIwNmUuLmE3MjU3OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4ODgvY3g4OC1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvY3g4OC9jeDg4LWFsc2EuYwpAQCAtODUyLDggKzg1Miw2IEBACiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7CiAJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCSpjb3JlX3B0ciA9IGNvcmU7CiAKQEAgLTg3Niw4ICs4NzQsOCBAQAogCQlyZXR1cm4gKC1FTk9FTlQpOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZub10sIGlkW2Rldm5vXSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc25kX2N4ODhfY2FyZF90KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldm5vXSwgaWRbZGV2bm9dLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzbmRfY3g4OF9jYXJkX3QpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL2l2dHYvaXZ0di1hbHNhLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvcGNpL2l2dHYvaXZ0di1hbHNhLW1haW4uYwppbmRleCBlOTcwY2ZhLi4zOWI1MjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9pdnR2L2l2dHYtYWxzYS1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvaXZ0di9pdnR2LWFsc2EtbWFpbi5jCkBAIC0xNDUsMTEgKzE0NSwxMiBAQAogCS8qIFRoaXMgaXMgYSBuby1vcCBmb3IgdXMuICBXZSdsbCB1c2UgdGhlIGl0di0+aW5zdGFuY2UgKi8KIAogCS8qICgyKSBDcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgLyogdXNlIGZpcnN0IGF2YWlsYWJsZSBpZCAqLwotCQkJICAgICAgU05EUlZfREVGQVVMVF9TVFIxLCAvKiB4aWQgZnJvbSBlbmQgb2Ygc2hvcnRuYW1lKi8KLQkJCSAgICAgIFRISVNfTU9EVUxFLCAwLCAmc2MpOworCXJldCA9IHNuZF9jYXJkX25ldygmaXR2LT5wZGV2LT5kZXYsCisJCQkgICBTTkRSVl9ERUZBVUxUX0lEWDEsIC8qIHVzZSBmaXJzdCBhdmFpbGFibGUgaWQgKi8KKwkJCSAgIFNORFJWX0RFRkFVTFRfU1RSMSwgLyogeGlkIGZyb20gZW5kIG9mIHNob3J0bmFtZSovCisJCQkgICBUSElTX01PRFVMRSwgMCwgJnNjKTsKIAlpZiAocmV0KSB7Ci0JCUlWVFZfQUxTQV9FUlIoIiVzOiBzbmRfY2FyZF9jcmVhdGUoKSBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsCisJCUlWVFZfQUxTQV9FUlIoIiVzOiBzbmRfY2FyZF9uZXcoKSBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsCiAJCQkgICAgICBfX2Z1bmNfXywgcmV0KTsKIAkJZ290byBlcnJfZXhpdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWFsc2EuYwppbmRleCBkZDY3YzhhLi5lMDRhNGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKQEAgLTEwNzIsOCArMTA3Miw4IEBACiAJaWYgKCFlbmFibGVbZGV2bnVtXSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnVtXSwgaWRbZGV2bnVtXSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc25kX2NhcmRfc2FhNzEzNF90KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2LT5wY2ktPmRldiwgaW5kZXhbZGV2bnVtXSwgaWRbZGV2bnVtXSwKKwkJCSAgIFRISVNfTU9EVUxFLCBzaXplb2Yoc25kX2NhcmRfc2FhNzEzNF90KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMTE1LDggKzExMTUsNiBAQAogCWlmICgoZXJyID0gc25kX2NhcmRfc2FhNzEzNF9wY20oY2hpcCwgMCkpIDwgMCkKIAkJZ290byBfX25vZGV2OwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmY2hpcC0+cGNpLT5kZXYpOwotCiAJLyogRW5kIG9mICJjcmVhdGlvbiIgKi8KIAogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJTQUE3MTM0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1pcy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL2ZpbWMtaXMuYwppbmRleCAxM2E0MjI4Li45YmRmYTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvZmltYy1pcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9maW1jLWlzLmMKQEAgLTI0LDEzICsyNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItb2YuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgogCiAjaW5jbHVkZSAibWVkaWEtZGV2LmgiCkBAIC0xNjcsMTAgKzE2NywxMCBAQAogCXUzMiB0bXAgPSAwOwogCWludCByZXQ7CiAKLQlucCA9IHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQobnAsIE5VTEwpOworCW5wID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQobnAsIE5VTEwpOwogCWlmICghbnApCiAJCXJldHVybiAtRU5YSU87Ci0JbnAgPSB2NGwyX29mX2dldF9yZW1vdGVfcG9ydChucCk7CisJbnAgPSBvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnQobnApOwogCWlmICghbnApCiAJCXJldHVybiAtRU5YSU87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9tZWRpYS1kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9tZWRpYS1kZXYuYwppbmRleCBjMWJjZTE3Li4wNGQ2ZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWVkaWEtZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21lZGlhLWRldi5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC00NjgsMTIgKzQ2OSwxMiBAQAogCQlyZXR1cm4gMDsKIAogCXY0bDJfb2ZfcGFyc2VfZW5kcG9pbnQoZXAsICZlbmRwb2ludCk7Ci0JaWYgKFdBUk5fT04oZW5kcG9pbnQucG9ydCA9PSAwKSB8fCBpbmRleCA+PSBGSU1DX01BWF9TRU5TT1JTKQorCWlmIChXQVJOX09OKGVuZHBvaW50LmJhc2UucG9ydCA9PSAwKSB8fCBpbmRleCA+PSBGSU1DX01BWF9TRU5TT1JTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBkLT5tdXhfaWQgPSAoZW5kcG9pbnQucG9ydCAtIDEpICYgMHgxOworCXBkLT5tdXhfaWQgPSAoZW5kcG9pbnQuYmFzZS5wb3J0IC0gMSkgJiAweDE7CiAKLQlyZW0gPSB2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoZXApOworCXJlbSA9IG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoZXApOwogCW9mX25vZGVfcHV0KGVwKTsKIAlpZiAocmVtID09IE5VTEwpIHsKIAkJdjRsMl9pbmZvKCZmbWQtPnY0bDJfZGV2LCAiUmVtb3RlIGRldmljZSBhdCAlcyBub3QgZm91bmRcbiIsCkBAIC00OTMsMTMgKzQ5NCwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoZmltY19pbnB1dF9pc19wYXJhbGxlbChlbmRwb2ludC5wb3J0KSkgeworCWlmIChmaW1jX2lucHV0X2lzX3BhcmFsbGVsKGVuZHBvaW50LmJhc2UucG9ydCkpIHsKIAkJaWYgKGVuZHBvaW50LmJ1c190eXBlID09IFY0TDJfTUJVU19QQVJBTExFTCkKIAkJCXBkLT5zZW5zb3JfYnVzX3R5cGUgPSBGSU1DX0JVU19UWVBFX0lUVV82MDE7CiAJCWVsc2UKIAkJCXBkLT5zZW5zb3JfYnVzX3R5cGUgPSBGSU1DX0JVU19UWVBFX0lUVV82NTY7CiAJCXBkLT5mbGFncyA9IGVuZHBvaW50LmJ1cy5wYXJhbGxlbC5mbGFnczsKLQl9IGVsc2UgaWYgKGZpbWNfaW5wdXRfaXNfbWlwaV9jc2koZW5kcG9pbnQucG9ydCkpIHsKKwl9IGVsc2UgaWYgKGZpbWNfaW5wdXRfaXNfbWlwaV9jc2koZW5kcG9pbnQuYmFzZS5wb3J0KSkgewogCQkvKgogCQkgKiBNSVBJIENTSS0yOiBvbmx5IGlucHV0IG11eCBzZWxlY3Rpb24gYW5kCiAJCSAqIHRoZSBzZW5zb3IncyBjbG9jayBmcmVxdWVuY3kgaXMgbmVlZGVkLgpAQCAtNTA3LDcgKzUwOCw3IEBACiAJCXBkLT5zZW5zb3JfYnVzX3R5cGUgPSBGSU1DX0JVU19UWVBFX01JUElfQ1NJMjsKIAl9IGVsc2UgewogCQl2NGwyX2VycigmZm1kLT52NGwyX2RldiwgIldyb25nIHBvcnQgaWQgKCV1KSBhdCBub2RlICVzXG4iLAotCQkJIGVuZHBvaW50LnBvcnQsIHJlbS0+ZnVsbF9uYW1lKTsKKwkJCSBlbmRwb2ludC5iYXNlLnBvcnQsIHJlbS0+ZnVsbF9uYW1lKTsKIAl9CiAJLyoKIAkgKiBGb3IgRklNQy1JUyBoYW5kbGVkIHNlbnNvcnMsIHRoYXQgYXJlIHBsYWNlZCB1bmRlciBpMmMtaXNwIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21pcGktY3Npcy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9leHlub3M0LWlzL21pcGktY3Npcy5jCmluZGV4IGYzYzM1OTEuLjM2NzhiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZXh5bm9zNC1pcy9taXBpLWNzaXMuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2V4eW5vczQtaXMvbWlwaS1jc2lzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvbWlwaS1jc2lzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC03NjIsNyArNzYzLDcgQEAKIAkJCQkgJnN0YXRlLT5tYXhfbnVtX2xhbmVzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlub2RlID0gdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChub2RlLCBOVUxMKTsKKwlub2RlID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQobm9kZSwgTlVMTCk7CiAJaWYgKCFub2RlKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBvcnQgbm9kZSBhdCAlc1xuIiwKIAkJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKQEAgLTc3MSw3ICs3NzIsNyBAQAogCS8qIEdldCBwb3J0IG5vZGUgYW5kIHZhbGlkYXRlIE1JUEktQ1NJIGNoYW5uZWwgaWQuICovCiAJdjRsMl9vZl9wYXJzZV9lbmRwb2ludChub2RlLCAmZW5kcG9pbnQpOwogCi0Jc3RhdGUtPmluZGV4ID0gZW5kcG9pbnQucG9ydCAtIEZJTUNfSU5QVVRfTUlQSV9DU0kyXzA7CisJc3RhdGUtPmluZGV4ID0gZW5kcG9pbnQuYmFzZS5wb3J0IC0gRklNQ19JTlBVVF9NSVBJX0NTSTJfMDsKIAlpZiAoc3RhdGUtPmluZGV4IDwgMCB8fCBzdGF0ZS0+aW5kZXggPj0gQ1NJU19NQVhfRU5USVRJRVMpCiAJCXJldHVybiAtRU5YSU87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMKaW5kZXggODFhMWQ5Ny4uOWI5MjU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMKQEAgLTY2NSw4ICs2NjUsOCBAQAogCWN4MjMxeHhfaW5mbygiY3gyMzF4eC1hdWRpby5jOiBwcm9iaW5nIGZvciBjeDIzMXh4ICIKIAkJICAgICAibm9uIHN0YW5kYXJkIHVzYmF1ZGlvXG4iKTsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZucl0sICJDeDIzMXh4IEF1ZGlvIiwgVEhJU19NT0RVTEUsCi0JCQkgICAgICAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXYtPnVkZXYtPmRldiwgaW5kZXhbZGV2bnJdLCAiQ3gyMzF4eCBBdWRpbyIsCisJCQkgICBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC02ODIsNyArNjgyLDYgQEAKIAlwY20tPmluZm9fZmxhZ3MgPSAwOwogCXBjbS0+cHJpdmF0ZV9kYXRhID0gZGV2OwogCXN0cmNweShwY20tPm5hbWUsICJDb25leGFudCBjeDIzMXh4IENhcHR1cmUiKTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPnVkZXYtPmRldik7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkN4MjMxeHgtQXVkaW8iKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiQ3gyMzF4eCBBdWRpbyIpOwogCXN0cmNweShjYXJkLT5sb25nbmFtZSwgIkNvbmV4YW50IGN4MjMxeHggQXVkaW8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwppbmRleCAwNWU5YmQxLi4xYTI4ODk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jCkBAIC05MDAsOCArOTAwLDggQEAKIAlwcmludGsoS0VSTl9JTkZPCiAJICAgICAgICJlbTI4eHgtYXVkaW8uYzogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTQgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiXG4iKTsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZucl0sICJFbTI4eHggQXVkaW8iLCBUSElTX01PRFVMRSwgMCwKLQkJCSAgICAgICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+dWRldi0+ZGV2LCBpbmRleFtkZXZucl0sICJFbTI4eHggQXVkaW8iLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtOTE4LDcgKzkxOCw2IEBACiAJcGNtLT5wcml2YXRlX2RhdGEgPSBkZXY7CiAJc3RyY3B5KHBjbS0+bmFtZSwgIkVtcGlhIDI4eHggQ2FwdHVyZSIpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT51ZGV2LT5kZXYpOwogCXN0cmNweShjYXJkLT5kcml2ZXIsICJFbTI4eHgtQXVkaW8iKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiRW0yOHh4IEF1ZGlvIik7CiAJc3RyY3B5KGNhcmQtPmxvbmduYW1lLCAiRW1waWEgRW0yOHh4IEF1ZGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zdGsxMTYwL3N0azExNjAtYWM5Ny5jIGIvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLWFjOTcuYwppbmRleCBjODU4M2MyLi5jNDZjOGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9zdGsxMTYwL3N0azExNjAtYWM5Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC1hYzk3LmMKQEAgLTk4LDEzICs5OCwxMSBAQAogCSAqIEp1c3Qgd2FudCBhIGNhcmQgdG8gYWNjZXNzIGFjOTYgY29udHJvbHMsCiAJICogdGhlIGFjdHVhbCBjYXB0dXJlIGludGVyZmFjZSB3aWxsIGJlIGhhbmRsZWQgYnkgc25kLXVzYi1hdWRpbwogCSAqLwotCXJjID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJICAgICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwlyYyA9IHNuZF9jYXJkX25ldyhkZXYtPmRldiwgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEsCisJCQkgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXYtPmRldik7Ci0KIAkvKiBUT0RPOiBJJ20gbm90IHN1cmUgd2hlcmUgc2hvdWxkIEkgZ2V0IHRoZXNlIG5hbWVzIDotKCAqLwogCXNucHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgc2l6ZW9mKGNhcmQtPnNob3J0bmFtZSksCiAJCSAic3RrMTE2MC1taXhlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvdGxnMjMwMC9wZC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3VzYi90bGcyMzAwL3BkLWFsc2EuYwppbmRleCAzZjNlMTQxLi5kZDhmZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi90bGcyMzAwL3BkLWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi90bGcyMzAwL3BkLWFsc2EuYwpAQCAtMzAwLDcgKzMwMCw4IEBACiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKC0xLCAiVGVsZWdlbnQiLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmcC0+aW50ZXJmYWNlLT5kZXYsIC0xLCAiVGVsZWdlbnQiLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1hbHNhLmMKaW5kZXggODEzYzFlYy4uMzIzOWNkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1hbHNhLmMKQEAgLTQzMSw3ICs0MzEsOCBAQAogCWlmICghZW5hYmxlW2Rldm5yXSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlyYyA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZucl0sICJ0bTYwMDAiLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCXJjID0gc25kX2NhcmRfbmV3KCZkZXYtPnVkZXYtPmRldiwgaW5kZXhbZGV2bnJdLCAidG02MDAwIiwKKwkJCSAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAocmMgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgY2FyZCBpbnN0YW5jZSAlZFxuIiwgZGV2bnIpOwogCQlyZXR1cm4gcmM7CkBAIC00NDUsNyArNDQ2LDYgQEAKIAkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKIAkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCXNuZF9jb21wb25lbnRfYWRkKGNhcmQsIGNvbXBvbmVudCk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT51ZGV2LT5kZXYpOwogCiAJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfdG02MDAwX2NhcmQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY29tcGF0LWlvY3RsMzIuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY29tcGF0LWlvY3RsMzIuYwppbmRleCA4ZjdhNmE0Li42MTkxOTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWNvbXBhdC1pb2N0bDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1jb21wYXQtaW9jdGwzMi5jCkBAIC03MzMsNyArNzMzLDcgQEAKIAkJY29weV90b191c2VyKCZ1cC0+dSwgJmtwLT51LCBzaXplb2Yoa3AtPnUpKSB8fAogCQlwdXRfdXNlcihrcC0+cGVuZGluZywgJnVwLT5wZW5kaW5nKSB8fAogCQlwdXRfdXNlcihrcC0+c2VxdWVuY2UsICZ1cC0+c2VxdWVuY2UpIHx8Ci0JCXB1dF9jb21wYXRfdGltZXNwZWMoJmtwLT50aW1lc3RhbXAsICZ1cC0+dGltZXN0YW1wKSB8fAorCQljb21wYXRfcHV0X3RpbWVzcGVjKCZrcC0+dGltZXN0YW1wLCAmdXAtPnRpbWVzdGFtcCkgfHwKIAkJcHV0X3VzZXIoa3AtPmlkLCAmdXAtPmlkKSB8fAogCQljb3B5X3RvX3VzZXIodXAtPnJlc2VydmVkLCBrcC0+cmVzZXJ2ZWQsIDggKiBzaXplb2YoX191MzIpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1vZi5jIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1vZi5jCmluZGV4IDQyZTNlOGEuLmI0ZWQ5YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItb2YuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLW9mLmMKQEAgLTEyNywxNyArMTI3LDkgQEAKIGludCB2NGwyX29mX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCSAgIHN0cnVjdCB2NGwyX29mX2VuZHBvaW50ICplbmRwb2ludCkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnRfbm9kZSA9IG9mX2dldF9wYXJlbnQobm9kZSk7Ci0KLQltZW1zZXQoZW5kcG9pbnQsIDAsIG9mZnNldG9mKHN0cnVjdCB2NGwyX29mX2VuZHBvaW50LCBoZWFkKSk7Ci0KLQllbmRwb2ludC0+bG9jYWxfbm9kZSA9IG5vZGU7Ci0JLyoKLQkgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyIHRoZSB0d28gY2FsbHMgYmVsb3cgc3VjY2VlZC4KLQkgKiBJZiB0aGV5IGRvbid0IHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUgMCBpcyB1c2VkLgotCSAqLwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBvcnRfbm9kZSwgInJlZyIsICZlbmRwb2ludC0+cG9ydCk7Ci0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInJlZyIsICZlbmRwb2ludC0+aWQpOworCW9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KG5vZGUsICZlbmRwb2ludC0+YmFzZSk7CisJZW5kcG9pbnQtPmJ1c190eXBlID0gMDsKKwltZW1zZXQoJmVuZHBvaW50LT5idXMsIDAsIHNpemVvZihlbmRwb2ludC0+YnVzKSk7CiAKIAl2NGwyX29mX3BhcnNlX2NzaV9idXMobm9kZSwgZW5kcG9pbnQpOwogCS8qCkBAIC0xNDcsMTI1ICsxMzksNiBAQAogCWlmIChlbmRwb2ludC0+YnVzLm1pcGlfY3NpMi5mbGFncyA9PSAwKQogCQl2NGwyX29mX3BhcnNlX3BhcmFsbGVsX2J1cyhub2RlLCBlbmRwb2ludCk7CiAKLQlvZl9ub2RlX3B1dChwb3J0X25vZGUpOwotCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfb2ZfcGFyc2VfZW5kcG9pbnQpOwotCi0vKioKLSAqIHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoKSAtIGdldCBuZXh0IGVuZHBvaW50IG5vZGUKLSAqIEBwYXJlbnQ6IHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZXZpY2Ugbm9kZQotICogQHByZXY6IHByZXZpb3VzIGVuZHBvaW50IG5vZGUsIG9yIE5VTEwgdG8gZ2V0IGZpcnN0Ci0gKgotICogUmV0dXJuOiBBbiAnZW5kcG9pbnQnIG5vZGUgcG9pbnRlciB3aXRoIHJlZmNvdW50IGluY3JlbWVudGVkLiBSZWZjb3VudAotICogb2YgdGhlIHBhc3NlZCBAcHJldiBub2RlIGlzIG5vdCBkZWNyZW1lbnRlZCwgdGhlIGNhbGxlciBoYXZlIHRvIHVzZQotICogb2Zfbm9kZV9wdXQoKSBvbiBpdCB3aGVuIGRvbmUuCi0gKi8KLXN0cnVjdCBkZXZpY2Vfbm9kZSAqdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKLQkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwcmV2KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZW5kcG9pbnQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwb3J0ID0gTlVMTDsKLQotCWlmICghcGFyZW50KQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghcHJldikgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0JCS8qCi0JCSAqIEl0J3MgdGhlIGZpcnN0IGNhbGwsIHdlIGhhdmUgdG8gZmluZCBhIHBvcnQgc3Vibm9kZQotCQkgKiB3aXRoaW4gdGhpcyBub2RlIG9yIHdpdGhpbiBhbiBvcHRpb25hbCAncG9ydHMnIG5vZGUuCi0JCSAqLwotCQlub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocGFyZW50LCAicG9ydHMiKTsKLQkJaWYgKG5vZGUpCi0JCQlwYXJlbnQgPSBub2RlOwotCi0JCXBvcnQgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwYXJlbnQsICJwb3J0Iik7Ci0KLQkJaWYgKHBvcnQpIHsKLQkJCS8qIEZvdW5kIGEgcG9ydCwgZ2V0IGFuIGVuZHBvaW50LiAqLwotCQkJZW5kcG9pbnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwb3J0LCBOVUxMKTsKLQkJCW9mX25vZGVfcHV0KHBvcnQpOwotCQl9IGVsc2UgewotCQkJZW5kcG9pbnQgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKCFlbmRwb2ludCkKLQkJCXByX2VycigiJXMoKTogbm8gZW5kcG9pbnQgbm9kZXMgc3BlY2lmaWVkIGZvciAlc1xuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcGFyZW50LT5mdWxsX25hbWUpOwotCQlvZl9ub2RlX3B1dChub2RlKTsKLQl9IGVsc2UgewotCQlwb3J0ID0gb2ZfZ2V0X3BhcmVudChwcmV2KTsKLQkJaWYgKCFwb3J0KQotCQkJLyogSG0sIGhhcyBzb21lb25lIGdpdmVuIHVzIHRoZSByb290IG5vZGUgPy4uLiAqLwotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJLyogQXZvaWQgZHJvcHBpbmcgcHJldiBub2RlIHJlZmNvdW50IHRvIDAuICovCi0JCW9mX25vZGVfZ2V0KHByZXYpOwotCQllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIHByZXYpOwotCQlpZiAoZW5kcG9pbnQpIHsKLQkJCW9mX25vZGVfcHV0KHBvcnQpOwotCQkJcmV0dXJuIGVuZHBvaW50OwotCQl9Ci0KLQkJLyogTm8gbW9yZSBlbmRwb2ludHMgdW5kZXIgdGhpcyBwb3J0LCB0cnkgdGhlIG5leHQgb25lLiAqLwotCQlkbyB7Ci0JCQlwb3J0ID0gb2ZfZ2V0X25leHRfY2hpbGQocGFyZW50LCBwb3J0KTsKLQkJCWlmICghcG9ydCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfSB3aGlsZSAob2Zfbm9kZV9jbXAocG9ydC0+bmFtZSwgInBvcnQiKSk7Ci0KLQkJLyogUGljayB1cCB0aGUgZmlyc3QgZW5kcG9pbnQgaW4gdGhpcyBwb3J0LiAqLwotCQllbmRwb2ludCA9IG9mX2dldF9uZXh0X2NoaWxkKHBvcnQsIE5VTEwpOwotCQlvZl9ub2RlX3B1dChwb3J0KTsKLQl9Ci0KLQlyZXR1cm4gZW5kcG9pbnQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQpOwotCi0vKioKLSAqIHY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudCgpIC0gZ2V0IHJlbW90ZSBwb3J0J3MgcGFyZW50IG5vZGUKLSAqIEBub2RlOiBwb2ludGVyIHRvIGEgbG9jYWwgZW5kcG9pbnQgZGV2aWNlX25vZGUKLSAqCi0gKiBSZXR1cm46IFJlbW90ZSBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggcmVtb3RlIGVuZHBvaW50IG5vZGUgbGlua2VkCi0gKgkgICB0byBAbm9kZS4gVXNlIG9mX25vZGVfcHV0KCkgb24gaXQgd2hlbiBkb25lLgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudCgKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQl1bnNpZ25lZCBpbnQgZGVwdGg7Ci0KLQkvKiBHZXQgcmVtb3RlIGVuZHBvaW50IG5vZGUuICovCi0JbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJyZW1vdGUtZW5kcG9pbnQiLCAwKTsKLQotCS8qIFdhbGsgMyBsZXZlbHMgdXAgb25seSBpZiB0aGVyZSBpcyAncG9ydHMnIG5vZGUuICovCi0JZm9yIChkZXB0aCA9IDM7IGRlcHRoICYmIG5wOyBkZXB0aC0tKSB7Ci0JCW5wID0gb2ZfZ2V0X25leHRfcGFyZW50KG5wKTsKLQkJaWYgKGRlcHRoID09IDIgJiYgb2Zfbm9kZV9jbXAobnAtPm5hbWUsICJwb3J0cyIpKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBucDsKLX0KLUVYUE9SVF9TWU1CT0wodjRsMl9vZl9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KTsKLQotLyoqCi0gKiB2NGwyX29mX2dldF9yZW1vdGVfcG9ydCgpIC0gZ2V0IHJlbW90ZSBwb3J0IG5vZGUKLSAqIEBub2RlOiBwb2ludGVyIHRvIGEgbG9jYWwgZW5kcG9pbnQgZGV2aWNlX25vZGUKLSAqCi0gKiBSZXR1cm46IFJlbW90ZSBwb3J0IG5vZGUgYXNzb2NpYXRlZCB3aXRoIHJlbW90ZSBlbmRwb2ludCBub2RlIGxpbmtlZAotICoJICAgdG8gQG5vZGUuIFVzZSBvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KLSAqLwotc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCS8qIEdldCByZW1vdGUgZW5kcG9pbnQgbm9kZS4gKi8KLQlucCA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgInJlbW90ZS1lbmRwb2ludCIsIDApOwotCWlmICghbnApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBvZl9nZXRfbmV4dF9wYXJlbnQobnApOwotfQotRVhQT1JUX1NZTUJPTCh2NGwyX29mX2dldF9yZW1vdGVfcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLWNvbnRpZy5jIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1jb250aWcuYwppbmRleCAzM2QzODcxZC4uODgwYmUwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1jb250aWcuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLWNvbnRpZy5jCkBAIC03MTksNyArNzE5LDcgQEAKIAogCS8qIGdldCB0aGUgYXNzb2NpYXRlZCBzY2F0dGVybGlzdCBmb3IgdGhpcyBidWZmZXIgKi8KIAlzZ3QgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGJ1Zi0+ZGJfYXR0YWNoLCBidWYtPmRtYV9kaXIpOwotCWlmIChJU19FUlJfT1JfTlVMTChzZ3QpKSB7CisJaWYgKElTX0VSUihzZ3QpKSB7CiAJCXByX2VycigiRXJyb3IgZ2V0dGluZyBkbWFidWYgc2NhdHRlcmxpc3RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS9LY29uZmlnIGIvZHJpdmVycy9tZW1vcnkvS2NvbmZpZwppbmRleCAyOWExMWRiLi5jNTllOWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbW9yeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVtb3J5L0tjb25maWcKQEAgLTcsNiArNywxNyBAQAogCiBpZiBNRU1PUlkKIAorY29uZmlnIFRJX0FFTUlGCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEFFTUlGIGRyaXZlciIKKwlkZXBlbmRzIG9uIChBUkNIX0RBVklOQ0kgfHwgQVJDSF9LRVlTVE9ORSkgJiYgT0YKKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEFFTUlGIG1vZHVsZSBhdmFpbGFibGUgaW4gVGV4YXMgSW5zdHJ1bWVudHMKKwkgIFNvQ3MuIEFFTUlGIHN0YW5kcyBmb3IgQXN5bmNocm9ub3VzIEV4dGVybmFsIE1lbW9yeSBJbnRlcmZhY2UgYW5kCisJICBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgZ2x1ZS1sZXNzIGludGVyZmFjZSB0byBhIHZhcmlldHkgb2YKKwkgIGFzeW5jaHJvbnVvdXMgbWVtb3J5IGRldmljZXMgbGlrZSBBU1JBTSwgTk9SIGFuZCBOQU5EIG1lbW9yeS4gQSB0b3RhbAorCSAgb2YgMjU2TSBieXRlcyBvZiBhbnkgb2YgdGhlc2UgbWVtb3JpZXMgY2FuIGJlIGFjY2Vzc2VkIGF0IGEgZ2l2ZW4KKwkgIHRpbWUgdmlhIGZvdXIgY2hpcCBzZWxlY3RzIHdpdGggNjRNIGJ5dGUgYWNjZXNzIHBlciBjaGlwIHNlbGVjdC4KKwogY29uZmlnIFRJX0VNSUYKIAl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgRU1JRiBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUwpAQCAtNTAsNCArNjEsOCBAQAogCSAgYW5hbHlzaXMsIGVzcGVjaWFsbHkgZm9yIElPTU1VL1NNTVUoU3lzdGVtIE1lbW9yeSBNYW5hZ2VtZW50CiAJICBVbml0KSBtb2R1bGUuCiAKK2NvbmZpZyBGU0xfSUZDCisJYm9vbAorCWRlcGVuZHMgb24gRlNMX1NPQworCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1vcnkvTWFrZWZpbGUgYi9kcml2ZXJzL21lbW9yeS9NYWtlZmlsZQppbmRleCA5NjlkOTIzLi43MTE2MGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbW9yeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lbW9yeS9NYWtlZmlsZQpAQCAtNSw3ICs1LDkgQEAKIGlmZXEgKCQoQ09ORklHX0REUikseSkKIG9iai0kKENPTkZJR19PRikJCSs9IG9mX21lbW9yeS5vCiBlbmRpZgorb2JqLSQoQ09ORklHX1RJX0FFTUlGKQkJKz0gdGktYWVtaWYubwogb2JqLSQoQ09ORklHX1RJX0VNSUYpCQkrPSBlbWlmLm8KK29iai0kKENPTkZJR19GU0xfSUZDKQkJKz0gZnNsX2lmYy5vCiBvYmotJChDT05GSUdfTVZFQlVfREVWQlVTKQkrPSBtdmVidS1kZXZidXMubwogb2JqLSQoQ09ORklHX1RFR1JBMjBfTUMpCSs9IHRlZ3JhMjAtbWMubwogb2JqLSQoQ09ORklHX1RFR1JBMzBfTUMpCSs9IHRlZ3JhMzAtbWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1vcnkvZnNsX2lmYy5jIGIvZHJpdmVycy9tZW1vcnkvZnNsX2lmYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWQ3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lbW9yeS9mc2xfaWZjLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jCisgKgorICogRnJlZXNjYWxlIEludGVncmF0ZWQgRmxhc2ggQ29udHJvbGxlcgorICoKKyAqIEF1dGhvcjogRGlwZW4gRHVkaGF0IDxEaXBlbi5EdWRoYXRAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfaWZjLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworc3RydWN0IGZzbF9pZmNfY3RybCAqZnNsX2lmY19jdHJsX2RldjsKK0VYUE9SVF9TWU1CT0woZnNsX2lmY19jdHJsX2Rldik7CisKKy8qCisgKiBjb252ZXJ0X2lmY19hZGRyZXNzIC0gY29udmVydCB0aGUgYmFzZSBhZGRyZXNzCisgKiBAYWRkcl9iYXNlOgliYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBiYW5rCisgKi8KK3Vuc2lnbmVkIGludCBjb252ZXJ0X2lmY19hZGRyZXNzKHBoeXNfYWRkcl90IGFkZHJfYmFzZSkKK3sKKwlyZXR1cm4gYWRkcl9iYXNlICYgQ1NQUl9CQTsKK30KK0VYUE9SVF9TWU1CT0woY29udmVydF9pZmNfYWRkcmVzcyk7CisKKy8qCisgKiBmc2xfaWZjX2ZpbmQgLSBmaW5kIElGQyBiYW5rCisgKiBAYWRkcl9iYXNlOgliYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBiYW5rCisgKgorICogVGhpcyBmdW5jdGlvbiB3YWxrcyBJRkMgYmFua3MgY29tcGFyaW5nICJCYXNlIGFkZHJlc3MiIGZpZWxkIG9mIHRoZSBDU1BSCisgKiByZWdpc3RlcnMgd2l0aCB0aGUgc3VwcGxpZWQgYWRkcl9iYXNlIGFyZ3VtZW50LiBXaGVuIGJhc2VzIG1hdGNoIHRoaXMKKyAqIGZ1bmN0aW9uIHJldHVybnMgYmFuayBudW1iZXIgKHN0YXJ0aW5nIHdpdGggMCksIG90aGVyd2lzZSBpdCByZXR1cm5zCisgKiBhcHByb3ByaWF0ZSBlcnJubyB2YWx1ZS4KKyAqLworaW50IGZzbF9pZmNfZmluZChwaHlzX2FkZHJfdCBhZGRyX2Jhc2UpCit7CisJaW50IGkgPSAwOworCisJaWYgKCFmc2xfaWZjX2N0cmxfZGV2IHx8ICFmc2xfaWZjX2N0cmxfZGV2LT5yZWdzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZzbF9pZmNfY3RybF9kZXYtPnJlZ3MtPmNzcHJfY3MpOyBpKyspIHsKKwkJdTMyIGNzcHIgPSBpbl9iZTMyKCZmc2xfaWZjX2N0cmxfZGV2LT5yZWdzLT5jc3ByX2NzW2ldLmNzcHIpOworCQlpZiAoY3NwciAmIENTUFJfViAmJiAoY3NwciAmIENTUFJfQkEpID09CisJCQkJY29udmVydF9pZmNfYWRkcmVzcyhhZGRyX2Jhc2UpKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC1FTk9FTlQ7Cit9CitFWFBPUlRfU1lNQk9MKGZzbF9pZmNfZmluZCk7CisKK3N0YXRpYyBpbnQgZnNsX2lmY19jdHJsX2luaXQoc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgZnNsX2lmY19yZWdzIF9faW9tZW0gKmlmYyA9IGN0cmwtPnJlZ3M7CisKKwkvKgorCSAqIENsZWFyIGFsbCB0aGUgY29tbW9uIHN0YXR1cyBhbmQgZXZlbnQgcmVnaXN0ZXJzCisJICovCisJaWYgKGluX2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCkgJiBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKQorCQlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9zdGF0LCBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKTsKKworCS8qIGVuYWJsZSBhbGwgZXJyb3IgYW5kIGV2ZW50cyAqLworCW91dF9iZTMyKCZpZmMtPmNtX2V2dGVyX2VuLCBJRkNfQ01fRVZURVJfRU5fQ1NFUkVOKTsKKworCS8qIGVuYWJsZSBhbGwgZXJyb3IgYW5kIGV2ZW50IGludGVycnVwdHMgKi8KKwlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9pbnRyX2VuLCBJRkNfQ01fRVZURVJfSU5UUl9FTl9DU0VSSVJFTik7CisJb3V0X2JlMzIoJmlmYy0+Y21fZXJhdHRyMCwgMHgwKTsKKwlvdXRfYmUzMigmaWZjLT5jbV9lcmF0dHIxLCAweDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2lmY19jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJZnJlZV9pcnEoY3RybC0+bmFuZF9pcnEsIGN0cmwpOworCWZyZWVfaXJxKGN0cmwtPmlycSwgY3RybCk7CisKKwlpcnFfZGlzcG9zZV9tYXBwaW5nKGN0cmwtPm5hbmRfaXJxKTsKKwlpcnFfZGlzcG9zZV9tYXBwaW5nKGN0cmwtPmlycSk7CisKKwlpb3VubWFwKGN0cmwtPnJlZ3MpOworCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisJa2ZyZWUoY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5BTkQgZXZlbnRzIGFyZSBzcGxpdCBiZXR3ZWVuIGFuIG9wZXJhdGlvbmFsIGludGVycnVwdCB3aGljaCBvbmx5CisgKiByZWNlaXZlcyBPUEMsIGFuZCBhbiBlcnJvciBpbnRlcnJ1cHQgdGhhdCByZWNlaXZlcyBldmVyeXRoaW5nIGVsc2UsCisgKiBpbmNsdWRpbmcgbm9uLU5BTkQgZXJyb3JzLiAgV2hpY2hldmVyIGludGVycnVwdCBnZXRzIHRvIGl0IGZpcnN0CisgKiByZWNvcmRzIHRoZSBzdGF0dXMgYW5kIHdha2VzIHRoZSB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5hbmRfaXJxX2xvY2spOworCitzdGF0aWMgdTMyIGNoZWNrX25hbmRfc3RhdChzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsKQoreworCXN0cnVjdCBmc2xfaWZjX3JlZ3MgX19pb21lbSAqaWZjID0gY3RybC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5hbmRfaXJxX2xvY2ssIGZsYWdzKTsKKworCXN0YXQgPSBpbl9iZTMyKCZpZmMtPmlmY19uYW5kLm5hbmRfZXZ0ZXJfc3RhdCk7CisJaWYgKHN0YXQpIHsKKwkJb3V0X2JlMzIoJmlmYy0+aWZjX25hbmQubmFuZF9ldnRlcl9zdGF0LCBzdGF0KTsKKwkJY3RybC0+bmFuZF9zdGF0ID0gc3RhdDsKKwkJd2FrZV91cCgmY3RybC0+bmFuZF93YWl0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYW5kX2lycV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGlycXJldHVybl90IGZzbF9pZmNfbmFuZF9pcnEoaW50IGlycW5vLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBmc2xfaWZjX2N0cmwgKmN0cmwgPSBkYXRhOworCisJaWYgKGNoZWNrX25hbmRfc3RhdChjdHJsKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJcmV0dXJuIElSUV9OT05FOworfQorCisvKgorICogTk9URTogVGhpcyBpbnRlcnJ1cHQgaXMgdXNlZCB0byByZXBvcnQgaWZjIGV2ZW50cyBvZiB2YXJpb3VzIGtpbmRzLAorICogc3VjaCBhcyB0cmFuc2FjdGlvbiBlcnJvcnMgb24gdGhlIGNoaXBzZWxlY3RzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2lmY19jdHJsX2lycShpbnQgaXJxbm8sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRhdGE7CisJc3RydWN0IGZzbF9pZmNfcmVncyBfX2lvbWVtICppZmMgPSBjdHJsLT5yZWdzOworCXUzMiBlcnJfYXhpaWQsIGVycl9zcmNpZCwgc3RhdHVzLCBjc19lcnIsIGVycl9hZGRyOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCisJLyogcmVhZCBmb3IgY2hpcCBzZWxlY3QgZXJyb3IgKi8KKwljc19lcnIgPSBpbl9iZTMyKCZpZmMtPmNtX2V2dGVyX3N0YXQpOworCWlmIChjc19lcnIpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJ0cmFuc2FjdGlvbiBzZW50IHRvIElGQyBpcyBub3QgbWFwcGVkIHRvIgorCQkJCSJhbnkgbWVtb3J5IGJhbmsgMHglMDhYXG4iLCBjc19lcnIpOworCQkvKiBjbGVhciB0aGUgY2hpcCBzZWxlY3QgZXJyb3IgKi8KKwkJb3V0X2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCwgSUZDX0NNX0VWVEVSX1NUQVRfQ1NFUik7CisKKwkJLyogcmVhZCBlcnJvciBhdHRyaWJ1dGUgcmVnaXN0ZXJzIHByaW50IHRoZSBlcnJvciBpbmZvcm1hdGlvbiAqLworCQlzdGF0dXMgPSBpbl9iZTMyKCZpZmMtPmNtX2VyYXR0cjApOworCQllcnJfYWRkciA9IGluX2JlMzIoJmlmYy0+Y21fZXJhdHRyMSk7CisKKwkJaWYgKHN0YXR1cyAmIElGQ19DTV9FUkFUVFIwX0VSVFlQX1JFQUQpCisJCQlkZXZfZXJyKGN0cmwtPmRldiwgIlJlYWQgdHJhbnNhY3Rpb24gZXJyb3IiCisJCQkJIkNNX0VSQVRUUjAgMHglMDhYXG4iLCBzdGF0dXMpOworCQllbHNlCisJCQlkZXZfZXJyKGN0cmwtPmRldiwgIldyaXRlIHRyYW5zYWN0aW9uIGVycm9yIgorCQkJCSJDTV9FUkFUVFIwIDB4JTA4WFxuIiwgc3RhdHVzKTsKKworCQllcnJfYXhpaWQgPSAoc3RhdHVzICYgSUZDX0NNX0VSQVRUUjBfRVJBSUQpID4+CisJCQkJCUlGQ19DTV9FUkFUVFIwX0VSQUlEX1NISUZUOworCQlkZXZfZXJyKGN0cmwtPmRldiwgIkFYSSBJRCBvZiB0aGUgZXJyb3IiCisJCQkJCSJ0cmFuc2FjdGlvbiAweCUwOFhcbiIsIGVycl9heGlpZCk7CisKKwkJZXJyX3NyY2lkID0gKHN0YXR1cyAmIElGQ19DTV9FUkFUVFIwX0VTUkNJRCkgPj4KKwkJCQkJSUZDX0NNX0VSQVRUUjBfRVNSQ0lEX1NISUZUOworCQlkZXZfZXJyKGN0cmwtPmRldiwgIlNSQyBJRCBvZiB0aGUgZXJyb3IiCisJCQkJCSJ0cmFuc2FjdGlvbiAweCUwOFhcbiIsIGVycl9zcmNpZCk7CisKKwkJZGV2X2VycihjdHJsLT5kZXYsICJUcmFuc2FjdGlvbiBBZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gZXJyb3IiCisJCQkJCSJFUkFERFIgMHglMDhYXG4iLCBlcnJfYWRkcik7CisKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGNoZWNrX25hbmRfc3RhdChjdHJsKSkKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZnNsX2lmY19jdHJsX3Byb2JlCisgKgorICogY2FsbGVkIGJ5IGRldmljZSBsYXllciB3aGVuIGl0IGZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nCisgKiBvbmUgb3VyIGRyaXZlciBjYW4gaGFuZGxlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcyBhbGwgb2YKKyAqIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciB0aGUgY29udHJvbGxlciBvbmx5LiAgVGhlCisgKiByZXNvdXJjZXMgZm9yIHRoZSBOQU5EIGJhbmtzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZAorICogaW4gdGhlIGNoaXAgcHJvYmUgZnVuY3Rpb24uCisqLworc3RhdGljIGludCBmc2xfaWZjX2N0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCisKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJGcmVlc2NhbGUgSW50ZWdyYXRlZCBGbGFzaCBDb250cm9sbGVyXG4iKTsKKworCWZzbF9pZmNfY3RybF9kZXYgPSBremFsbG9jKHNpemVvZigqZnNsX2lmY19jdHJsX2RldiksIEdGUF9LRVJORUwpOworCWlmICghZnNsX2lmY19jdHJsX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBmc2xfaWZjX2N0cmxfZGV2KTsKKworCS8qIElPTUFQIHRoZSBlbnRpcmUgSUZDIHJlZ2lvbiAqLworCWZzbF9pZmNfY3RybF9kZXYtPnJlZ3MgPSBvZl9pb21hcChkZXYtPmRldi5vZl9ub2RlLCAwKTsKKwlpZiAoIWZzbF9pZmNfY3RybF9kZXYtPnJlZ3MpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBnZXQgdGhlIENvbnRyb2xsZXIgbGV2ZWwgaXJxICovCisJZnNsX2lmY19jdHJsX2Rldi0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LT5kZXYub2Zfbm9kZSwgMCk7CisJaWYgKGZzbF9pZmNfY3RybF9kZXYtPmlycSA9PSBOT19JUlEpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycSByZXNvdXJjZSAiCisJCQkJCQkJImZvciBJRkNcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBnZXQgdGhlIG5hbmQgbWFjaGluZSBpcnEgKi8KKwlmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSA9CisJCQlpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPmRldi5vZl9ub2RlLCAxKTsKKworCWZzbF9pZmNfY3RybF9kZXYtPmRldiA9ICZkZXYtPmRldjsKKworCXJldCA9IGZzbF9pZmNfY3RybF9pbml0KGZzbF9pZmNfY3RybF9kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzbF9pZmNfY3RybF9kZXYtPm5hbmRfd2FpdCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShmc2xfaWZjX2N0cmxfZGV2LT5pcnEsIGZzbF9pZmNfY3RybF9pcnEsIElSUUZfU0hBUkVELAorCQkJICAiZnNsLWlmYyIsIGZzbF9pZmNfY3RybF9kZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLAorCQkJZnNsX2lmY19jdHJsX2Rldi0+aXJxKTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCWlmIChmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSkgeworCQlyZXQgPSByZXF1ZXN0X2lycShmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSwgZnNsX2lmY19uYW5kX2lycSwKKwkJCQkwLCAiZnNsLWlmYy1uYW5kIiwgZnNsX2lmY19jdHJsX2Rldik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5zdGFsbCBpcnEgKCVkKVxuIiwKKwkJCQlmc2xfaWZjX2N0cmxfZGV2LT5uYW5kX2lycSk7CisJCQlnb3RvIGVycl9uYW5kaXJxOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9uYW5kaXJxOgorCWZyZWVfaXJxKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxLCBmc2xfaWZjX2N0cmxfZGV2KTsKKwlpcnFfZGlzcG9zZV9tYXBwaW5nKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxKTsKK2Vycl9pcnE6CisJZnJlZV9pcnEoZnNsX2lmY19jdHJsX2Rldi0+aXJxLCBmc2xfaWZjX2N0cmxfZGV2KTsKKwlpcnFfZGlzcG9zZV9tYXBwaW5nKGZzbF9pZmNfY3RybF9kZXYtPmlycSk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX2lmY19tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAiZnNsLGlmYyIsCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzbF9pZmNfY3RybF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiZnNsLWlmYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGZzbF9pZmNfbWF0Y2gsCisJfSwKKwkucHJvYmUgICAgICAgPSBmc2xfaWZjX2N0cmxfcHJvYmUsCisJLnJlbW92ZSAgICAgID0gZnNsX2lmY19jdHJsX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9pZmNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9pZmNfY3RybF9kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKGZzbF9pZmNfaW5pdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBJbnRlZ3JhdGVkIEZsYXNoIENvbnRyb2xsZXIgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS90aS1hZW1pZi5jIGIvZHJpdmVycy9tZW1vcnkvdGktYWVtaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2RmNzYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZW1vcnkvdGktYWVtaWYuYwpAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqIFRJIEFFTUlGIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkLiBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBBdXRob3JzOgorICogTXVyYWxpIEthcmljaGVyaSA8bS1rYXJpY2hlcmkyQHRpLmNvbT4KKyAqIEl2YW4gS2hvcm9uemh1ayA8aXZhbi5raG9yb256aHVrQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBUQV9TSElGVAkyCisjZGVmaW5lIFJIT0xEX1NISUZUCTQKKyNkZWZpbmUgUlNUUk9CRV9TSElGVAk3CisjZGVmaW5lIFJTRVRVUF9TSElGVAkxMworI2RlZmluZSBXSE9MRF9TSElGVAkxNworI2RlZmluZSBXU1RST0JFX1NISUZUCTIwCisjZGVmaW5lIFdTRVRVUF9TSElGVAkyNgorI2RlZmluZSBFV19TSElGVAkzMAorI2RlZmluZSBTU19TSElGVAkzMQorCisjZGVmaW5lIFRBKHgpCQkoKHgpIDw8IFRBX1NISUZUKQorI2RlZmluZSBSSE9MRCh4KQkoKHgpIDw8IFJIT0xEX1NISUZUKQorI2RlZmluZSBSU1RST0JFKHgpCSgoeCkgPDwgUlNUUk9CRV9TSElGVCkKKyNkZWZpbmUgUlNFVFVQKHgpCSgoeCkgPDwgUlNFVFVQX1NISUZUKQorI2RlZmluZSBXSE9MRCh4KQkoKHgpIDw8IFdIT0xEX1NISUZUKQorI2RlZmluZSBXU1RST0JFKHgpCSgoeCkgPDwgV1NUUk9CRV9TSElGVCkKKyNkZWZpbmUgV1NFVFVQKHgpCSgoeCkgPDwgV1NFVFVQX1NISUZUKQorI2RlZmluZSBFVyh4KQkJKCh4KSA8PCBFV19TSElGVCkKKyNkZWZpbmUgU1MoeCkJCSgoeCkgPDwgU1NfU0hJRlQpCisKKyNkZWZpbmUgQVNJWkVfTUFYCTB4MQorI2RlZmluZSBUQV9NQVgJCTB4MworI2RlZmluZSBSSE9MRF9NQVgJMHg3CisjZGVmaW5lIFJTVFJPQkVfTUFYCTB4M2YKKyNkZWZpbmUgUlNFVFVQX01BWAkweGYKKyNkZWZpbmUgV0hPTERfTUFYCTB4NworI2RlZmluZSBXU1RST0JFX01BWAkweDNmCisjZGVmaW5lIFdTRVRVUF9NQVgJMHhmCisjZGVmaW5lIEVXX01BWAkJMHgxCisjZGVmaW5lIFNTX01BWAkJMHgxCisjZGVmaW5lIE5VTV9DUwkJNAorCisjZGVmaW5lIFRBX1ZBTCh4KQkoKCh4KSAmIFRBKFRBX01BWCkpID4+IFRBX1NISUZUKQorI2RlZmluZSBSSE9MRF9WQUwoeCkJKCgoeCkgJiBSSE9MRChSSE9MRF9NQVgpKSA+PiBSSE9MRF9TSElGVCkKKyNkZWZpbmUgUlNUUk9CRV9WQUwoeCkJKCgoeCkgJiBSU1RST0JFKFJTVFJPQkVfTUFYKSkgPj4gUlNUUk9CRV9TSElGVCkKKyNkZWZpbmUgUlNFVFVQX1ZBTCh4KQkoKCh4KSAmIFJTRVRVUChSU0VUVVBfTUFYKSkgPj4gUlNFVFVQX1NISUZUKQorI2RlZmluZSBXSE9MRF9WQUwoeCkJKCgoeCkgJiBXSE9MRChXSE9MRF9NQVgpKSA+PiBXSE9MRF9TSElGVCkKKyNkZWZpbmUgV1NUUk9CRV9WQUwoeCkJKCgoeCkgJiBXU1RST0JFKFdTVFJPQkVfTUFYKSkgPj4gV1NUUk9CRV9TSElGVCkKKyNkZWZpbmUgV1NFVFVQX1ZBTCh4KQkoKCh4KSAmIFdTRVRVUChXU0VUVVBfTUFYKSkgPj4gV1NFVFVQX1NISUZUKQorI2RlZmluZSBFV19WQUwoeCkJKCgoeCkgJiBFVyhFV19NQVgpKSA+PiBFV19TSElGVCkKKyNkZWZpbmUgU1NfVkFMKHgpCSgoKHgpICYgU1MoU1NfTUFYKSkgPj4gU1NfU0hJRlQpCisKKyNkZWZpbmUgTlJDU1JfT0ZGU0VUCTB4MDAKKyNkZWZpbmUgQVdDQ1JfT0ZGU0VUCTB4MDQKKyNkZWZpbmUgQTFDUl9PRkZTRVQJMHgxMAorCisjZGVmaW5lIEFDUl9BU0laRV9NQVNLCTB4MworI2RlZmluZSBBQ1JfRVdfTUFTSwlCSVQoMzApCisjZGVmaW5lIEFDUl9TU19NQVNLCUJJVCgzMSkKKyNkZWZpbmUgQVNJWkVfMTZCSVQJMQorCisjZGVmaW5lIENPTkZJR19NQVNLCShUQShUQV9NQVgpIHwgXAorCQkJCVJIT0xEKFJIT0xEX01BWCkgfCBcCisJCQkJUlNUUk9CRShSU1RST0JFX01BWCkgfAlcCisJCQkJUlNFVFVQKFJTRVRVUF9NQVgpIHwgXAorCQkJCVdIT0xEKFdIT0xEX01BWCkgfCBcCisJCQkJV1NUUk9CRShXU1RST0JFX01BWCkgfCBcCisJCQkJV1NFVFVQKFdTRVRVUF9NQVgpIHwgXAorCQkJCUVXKEVXX01BWCkgfCBTUyhTU19NQVgpIHwgXAorCQkJCUFTSVpFX01BWCkKKworLyoqCisgKiBzdHJ1Y3QgYWVtaWZfY3NfZGF0YTogc3RydWN0dXJlIHRvIGhvbGQgY3MgcGFyYW1ldGVycworICogQGNzOiBjaGlwLXNlbGVjdCBudW1iZXIKKyAqIEB3c3Ryb2JlOiB3cml0ZSBzdHJvYmUgd2lkdGgsIG5zCisgKiBAcnN0cm9iZTogcmVhZCBzdHJvYmUgd2lkdGgsIG5zCisgKiBAd3NldHVwOiB3cml0ZSBzZXR1cCB3aWR0aCwgbnMKKyAqIEB3aG9sZDogd3JpdGUgaG9sZCB3aWR0aCwgbnMKKyAqIEByc2V0dXA6IHJlYWQgc2V0dXAgd2lkdGgsIG5zCisgKiBAcmhvbGQ6IHJlYWQgaG9sZCB3aWR0aCwgbnMKKyAqIEB0YTogbWluaW11bSB0dXJuIGFyb3VuZCB0aW1lLCBucworICogQGVuYWJsZV9zczogZW5hYmxlL2Rpc2FibGUgc2VsZWN0IHN0cm9iZSBtb2RlCisgKiBAZW5hYmxlX2V3OiBlbmFibGUvZGlzYWJsZSBleHRlbmRlZCB3YWl0IG1vZGUKKyAqIEBhc2l6ZTogd2lkdGggb2YgdGhlIGFzeW5jaHJvbm91cyBkZXZpY2UncyBkYXRhIGJ1cworICovCitzdHJ1Y3QgYWVtaWZfY3NfZGF0YSB7CisJdTgJY3M7CisJdTE2CXdzdHJvYmU7CisJdTE2CXJzdHJvYmU7CisJdTgJd3NldHVwOworCXU4CXdob2xkOworCXU4CXJzZXR1cDsKKwl1OAlyaG9sZDsKKwl1OAl0YTsKKwl1OAllbmFibGVfc3M7CisJdTgJZW5hYmxlX2V3OworCXU4CWFzaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYWVtaWZfZGV2aWNlOiBzdHJ1Y3R1cmUgdG8gaG9sZCBkZXZpY2UgZGF0YQorICogQGJhc2U6IGJhc2UgYWRkcmVzcyBvZiBBRU1JRiByZWdpc3RlcnMKKyAqIEBjbGs6IHNvdXJjZSBjbG9jaworICogQGNsa19yYXRlOiBjbG9jaydzIHJhdGUgaW4ga0h6CisgKiBAbnVtX2NzOiBudW1iZXIgb2YgYXNzaWduZWQgY2hpcC1zZWxlY3RzCisgKiBAY3Nfb2Zmc2V0OiBzdGFydCBudW1iZXIgb2YgY3Mgbm9kZXMKKyAqIEBjc19kYXRhOiBhcnJheSBvZiBjaGlwLXNlbGVjdCBzZXR0aW5ncworICovCitzdHJ1Y3QgYWVtaWZfZGV2aWNlIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGNsayAqY2xrOworCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7CisJdTggbnVtX2NzOworCWludCBjc19vZmZzZXQ7CisJc3RydWN0IGFlbWlmX2NzX2RhdGEgY3NfZGF0YVtOVU1fQ1NdOworfTsKKworLyoqCisgKiBhZW1pZl9jYWxjX3JhdGUgLSBjYWxjdWxhdGUgdGltaW5nIGRhdGEuCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHRvIGNhbGN1bGF0ZSBmb3IKKyAqIEB3YW50ZWQ6IFRoZSBjeWNsZSB0aW1lIG5lZWRlZCBpbiBuYW5vc2Vjb25kcy4KKyAqIEBjbGs6IFRoZSBpbnB1dCBjbG9jayByYXRlIGluIGtIei4KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIGRpdmlkZXIgdmFsdWUgdGhhdCBjYW4gYmUgcHJvZ3JhbW1lZC4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHRpbWluZyB2YWx1ZSBtaW51cyAxIGZvciBlYXN5CisgKiBwcm9ncmFtbWluZyBpbnRvIEFFTUlGIHRpbWluZyByZWdpc3RlcnMsIGVsc2UgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgYWVtaWZfY2FsY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB3YW50ZWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGNsaywgaW50IG1heCkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gRElWX1JPVU5EX1VQKCh3YW50ZWQgKiBjbGspLCBOU0VDX1BFUl9NU0VDKSAtIDE7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcmVzdWx0ICVkIGZyb20gJWxkLCAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCwKKwkJY2xrLCB3YW50ZWQpOworCisJLyogSXQgaXMgZ2VuZXJhbGx5IE9LIHRvIGhhdmUgYSBtb3JlIHJlbGF4ZWQgdGltaW5nIHRoYW4gcmVxdWVzdGVkLi4uICovCisJaWYgKHJlc3VsdCA8IDApCisJCXJlc3VsdCA9IDA7CisKKwkvKiAuLi4gQnV0IGNvbmZpZ3VyaW5nIHRpZ2h0ZXIgdGltaW5ncyBpcyBub3QgYW4gb3B0aW9uLiAqLworCWVsc2UgaWYgKHJlc3VsdCA+IG1heCkKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogYWVtaWZfY29uZmlnX2FidXMgLSBjb25maWd1cmUgYXN5bmMgYnVzIHBhcmFtZXRlcnMKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdG8gY29uZmlndXJlIGZvcgorICogQGNzbnVtOiBhZW1pZiBjaGlwIHNlbGVjdCBudW1iZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2dyYW1zIHRoZSBnaXZlbiB0aW1pbmcgdmFsdWVzIChpbiByZWFsIGNsb2NrKSBpbnRvIHRoZQorICogQUVNSUYgcmVnaXN0ZXJzIHRha2luZyB0aGUgQUVNSUYgY2xvY2sgaW50byBhY2NvdW50LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdXNlIGFueSBsb2NraW5nIHdoaWxlIHByb2dyYW1taW5nIHRoZSBBRU1JRgorICogYmVjYXVzZSBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHVzZXIgb2YgYSBnaXZlbgorICogY2hpcC1zZWxlY3QuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgYWVtaWZfY29uZmlnX2FidXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGNzbnVtKQoreworCXN0cnVjdCBhZW1pZl9kZXZpY2UgKmFlbWlmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFlbWlmX2NzX2RhdGEgKmRhdGEgPSAmYWVtaWYtPmNzX2RhdGFbY3NudW1dOworCWludCB0YSwgcmhvbGQsIHJzdHJvYmUsIHJzZXR1cCwgd2hvbGQsIHdzdHJvYmUsIHdzZXR1cDsKKwl1bnNpZ25lZCBsb25nIGNsa19yYXRlID0gYWVtaWYtPmNsa19yYXRlOworCXVuc2lnbmVkIG9mZnNldDsKKwl1MzIgc2V0LCB2YWw7CisKKwlvZmZzZXQgPSBBMUNSX09GRlNFVCArIChkYXRhLT5jcyAtIGFlbWlmLT5jc19vZmZzZXQpICogNDsKKworCXRhCT0gYWVtaWZfY2FsY19yYXRlKHBkZXYsIGRhdGEtPnRhLCBjbGtfcmF0ZSwgVEFfTUFYKTsKKwlyaG9sZAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT5yaG9sZCwgY2xrX3JhdGUsIFJIT0xEX01BWCk7CisJcnN0cm9iZQk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT5yc3Ryb2JlLCBjbGtfcmF0ZSwgUlNUUk9CRV9NQVgpOworCXJzZXR1cAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT5yc2V0dXAsIGNsa19yYXRlLCBSU0VUVVBfTUFYKTsKKwl3aG9sZAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT53aG9sZCwgY2xrX3JhdGUsIFdIT0xEX01BWCk7CisJd3N0cm9iZQk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT53c3Ryb2JlLCBjbGtfcmF0ZSwgV1NUUk9CRV9NQVgpOworCXdzZXR1cAk9IGFlbWlmX2NhbGNfcmF0ZShwZGV2LCBkYXRhLT53c2V0dXAsIGNsa19yYXRlLCBXU0VUVVBfTUFYKTsKKworCWlmICh0YSA8IDAgfHwgcmhvbGQgPCAwIHx8IHJzdHJvYmUgPCAwIHx8IHJzZXR1cCA8IDAgfHwKKwkgICAgd2hvbGQgPCAwIHx8IHdzdHJvYmUgPCAwIHx8IHdzZXR1cCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGNhbm5vdCBnZXQgc3VpdGFibGUgdGltaW5nc1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2V0ID0gVEEodGEpIHwgUkhPTEQocmhvbGQpIHwgUlNUUk9CRShyc3Ryb2JlKSB8IFJTRVRVUChyc2V0dXApIHwKKwkJV0hPTEQod2hvbGQpIHwgV1NUUk9CRSh3c3Ryb2JlKSB8IFdTRVRVUCh3c2V0dXApOworCisJc2V0IHw9IChkYXRhLT5hc2l6ZSAmIEFDUl9BU0laRV9NQVNLKTsKKwlpZiAoZGF0YS0+ZW5hYmxlX2V3KQorCQlzZXQgfD0gQUNSX0VXX01BU0s7CisJaWYgKGRhdGEtPmVuYWJsZV9zcykKKwkJc2V0IHw9IEFDUl9TU19NQVNLOworCisJdmFsID0gcmVhZGwoYWVtaWYtPmJhc2UgKyBvZmZzZXQpOworCXZhbCAmPSB+Q09ORklHX01BU0s7CisJdmFsIHw9IHNldDsKKwl3cml0ZWwodmFsLCBhZW1pZi0+YmFzZSArIG9mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWVtaWZfY3ljbGVzX3RvX25zZWMoaW50IHZhbCwgdW5zaWduZWQgbG9uZyBjbGtfcmF0ZSkKK3sKKwlyZXR1cm4gKCh2YWwgKyAxKSAqIE5TRUNfUEVSX01TRUMpIC8gY2xrX3JhdGU7Cit9CisKKy8qKgorICogYWVtaWZfZ2V0X2h3X3BhcmFtcyAtIGZ1bmN0aW9uIHRvIHJlYWQgaHcgcmVnaXN0ZXIgdmFsdWVzCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHRvIHJlYWQgZm9yCisgKiBAY3NudW06IGFlbWlmIGNoaXAgc2VsZWN0IG51bWJlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGRlZmF1bHRzIGZyb20gdGhlIHJlZ2lzdGVycyBhbmQgdXBkYXRlCisgKiB0aGUgdGltaW5nIHZhbHVlcy4gUmVxdWlyZWQgZm9yIGdldC9zZXQgY29tbWFuZHMgYW5kIGFsc28gZm9yCisgKiB0aGUgY2FzZSB3aGVuIGRyaXZlciBuZWVkcyB0byB1c2UgZGVmYXVsdHMgaW4gaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIGFlbWlmX2dldF9od19wYXJhbXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGNzbnVtKQoreworCXN0cnVjdCBhZW1pZl9kZXZpY2UgKmFlbWlmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFlbWlmX2NzX2RhdGEgKmRhdGEgPSAmYWVtaWYtPmNzX2RhdGFbY3NudW1dOworCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGUgPSBhZW1pZi0+Y2xrX3JhdGU7CisJdTMyIHZhbCwgb2Zmc2V0OworCisJb2Zmc2V0ID0gQTFDUl9PRkZTRVQgKyAoZGF0YS0+Y3MgLSBhZW1pZi0+Y3Nfb2Zmc2V0KSAqIDQ7CisJdmFsID0gcmVhZGwoYWVtaWYtPmJhc2UgKyBvZmZzZXQpOworCisJZGF0YS0+dGEgPSBhZW1pZl9jeWNsZXNfdG9fbnNlYyhUQV9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPnJob2xkID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoUkhPTERfVkFMKHZhbCksIGNsa19yYXRlKTsKKwlkYXRhLT5yc3Ryb2JlID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoUlNUUk9CRV9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPnJzZXR1cCA9IGFlbWlmX2N5Y2xlc190b19uc2VjKFJTRVRVUF9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPndob2xkID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoV0hPTERfVkFMKHZhbCksIGNsa19yYXRlKTsKKwlkYXRhLT53c3Ryb2JlID0gYWVtaWZfY3ljbGVzX3RvX25zZWMoV1NUUk9CRV9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPndzZXR1cCA9IGFlbWlmX2N5Y2xlc190b19uc2VjKFdTRVRVUF9WQUwodmFsKSwgY2xrX3JhdGUpOworCWRhdGEtPmVuYWJsZV9ldyA9IEVXX1ZBTCh2YWwpOworCWRhdGEtPmVuYWJsZV9zcyA9IFNTX1ZBTCh2YWwpOworCWRhdGEtPmFzaXplID0gdmFsICYgQVNJWkVfTUFYOworfQorCisvKioKKyAqIG9mX2FlbWlmX3BhcnNlX2FidXNfY29uZmlnIC0gcGFyc2UgQ1MgY29uZmlndXJhdGlvbiBmcm9tIERUCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHRvIHBhcnNlIGZvcgorICogQG5wOiBkZXZpY2Ugbm9kZSBwdHIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSB0aGUgZW1pZiBhc3luYyBidXMgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVzCisgKiBjb25maWd1cmVkIGluIGEgY3MgZGV2aWNlIGJpbmRpbmcgbm9kZS4KKyAqLworc3RhdGljIGludCBvZl9hZW1pZl9wYXJzZV9hYnVzX2NvbmZpZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGFlbWlmX2RldmljZSAqYWVtaWYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWVtaWZfY3NfZGF0YSAqZGF0YTsKKwl1MzIgY3M7CisJdTMyIHZhbDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNzLWNoaXBzZWxlY3QiLCAmY3MpKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNzIHByb3BlcnR5IGlzIHJlcXVpcmVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjcyAtIGFlbWlmLT5jc19vZmZzZXQgPj0gTlVNX0NTIHx8IGNzIDwgYWVtaWYtPmNzX29mZnNldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjcyBudW1iZXIgaXMgaW5jb3JyZWN0ICVkIiwgY3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWVtaWYtPm51bV9jcyA+PSBOVU1fQ1MpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY3MgY291bnQgaXMgbW9yZSB0aGFuICVkIiwgTlVNX0NTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9ICZhZW1pZi0+Y3NfZGF0YVthZW1pZi0+bnVtX2NzXTsKKwlkYXRhLT5jcyA9IGNzOworCisJLyogcmVhZCB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgaHcgcmVnaXN0ZXIgKi8KKwlhZW1pZl9nZXRfaHdfcGFyYW1zKHBkZXYsIGFlbWlmLT5udW1fY3MrKyk7CisKKwkvKiBvdmVycmlkZSB0aGUgdmFsdWVzIGZyb20gZGV2aWNlIG5vZGUgKi8KKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtbWluLXR1cm5hcm91bmQtbnMiLCAmdmFsKSkKKwkJZGF0YS0+dGEgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtcmVhZC1ob2xkLW5zIiwgJnZhbCkpCisJCWRhdGEtPnJob2xkID0gdmFsOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNzLXJlYWQtc3Ryb2JlLW5zIiwgJnZhbCkpCisJCWRhdGEtPnJzdHJvYmUgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtcmVhZC1zZXR1cC1ucyIsICZ2YWwpKQorCQlkYXRhLT5yc2V0dXAgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3Mtd3JpdGUtaG9sZC1ucyIsICZ2YWwpKQorCQlkYXRhLT53aG9sZCA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy13cml0ZS1zdHJvYmUtbnMiLCAmdmFsKSkKKwkJZGF0YS0+d3N0cm9iZSA9IHZhbDsKKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjcy13cml0ZS1zZXR1cC1ucyIsICZ2YWwpKQorCQlkYXRhLT53c2V0dXAgPSB2YWw7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3MtYnVzLXdpZHRoIiwgJnZhbCkpCisJCWlmICh2YWwgPT0gMTYpCisJCQlkYXRhLT5hc2l6ZSA9IDE7CisJZGF0YS0+ZW5hYmxlX2V3ID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAidGksY3MtZXh0ZW5kZWQtd2FpdC1tb2RlIik7CisJZGF0YS0+ZW5hYmxlX3NzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAidGksY3Mtc2VsZWN0LXN0cm9iZS1tb2RlIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFlbWlmX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxkYXZpbmNpLWFlbWlmIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLGRhODUwLWFlbWlmIiwgfSwKKwl7fSwKK307CisKK3N0YXRpYyBpbnQgYWVtaWZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZF9ucDsKKwlzdHJ1Y3QgYWVtaWZfZGV2aWNlICphZW1pZjsKKworCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWFlbWlmID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCphZW1pZiksIEdGUF9LRVJORUwpOworCWlmICghYWVtaWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWVtaWYpOworCisJYWVtaWYtPmNsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOworCWlmIChJU19FUlIoYWVtaWYtPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IGNsb2NrICdhZW1pZidcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhZW1pZi0+Y2xrKTsKKwl9CisKKwljbGtfcHJlcGFyZV9lbmFibGUoYWVtaWYtPmNsayk7CisJYWVtaWYtPmNsa19yYXRlID0gY2xrX2dldF9yYXRlKGFlbWlmLT5jbGspIC8gTVNFQ19QRVJfU0VDOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAidGksZGE4NTAtYWVtaWYiKSkKKwkJYWVtaWYtPmNzX29mZnNldCA9IDI7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWFlbWlmLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGFlbWlmLT5iYXNlKSkgeworCQlyZXQgPSBQVFJfRVJSKGFlbWlmLT5iYXNlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKgorCSAqIEZvciBldmVyeSBjb250cm9sbGVyIGRldmljZSBub2RlLCB0aGVyZSBpcyBhIGNzIGRldmljZSBub2RlIHRoYXQKKwkgKiBkZXNjcmliZSB0aGUgYnVzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhpcyBmdW5jdGlvbnMgaXRlcmF0ZQorCSAqIG92ZXIgdGhlc2Ugbm9kZXMgYW5kIHVwZGF0ZSB0aGUgY3MgZGF0YSBhcnJheS4KKwkgKi8KKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGRfbnApIHsKKwkJcmV0ID0gb2ZfYWVtaWZfcGFyc2VfYWJ1c19jb25maWcocGRldiwgY2hpbGRfbnApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFlbWlmLT5udW1fY3M7IGkrKykgeworCQlyZXQgPSBhZW1pZl9jb25maWdfYWJ1cyhwZGV2LCBpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRXJyb3IgY29uZmlndXJpbmcgY2hpcCBzZWxlY3QgJWRcbiIsCisJCQkJYWVtaWYtPmNzX2RhdGFbaV0uY3MpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qCisJICogQ3JlYXRlIGEgY2hpbGQgZGV2aWNlcyBleHBsaWNpdGx5IGZyb20gaGVyZSB0bworCSAqIGd1YXJhbnRlZSB0aGF0IHRoZSBjaGlsZCB3aWxsIGJlIHByb2JlZCBhZnRlciB0aGUgQUVNSUYgdGltaW5nCisJICogcGFyYW1ldGVycyBhcmUgc2V0LgorCSAqLworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZF9ucCkgeworCQlyZXQgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShjaGlsZF9ucCwgTlVMTCwgTlVMTCwgZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiAwOworZXJyb3I6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFlbWlmLT5jbGspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWVtaWZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFlbWlmX2RldmljZSAqYWVtaWYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZW1pZi0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWVtaWZfZHJpdmVyID0geworCS5wcm9iZSA9IGFlbWlmX3Byb2JlLAorCS5yZW1vdmUgPSBhZW1pZl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihhZW1pZl9vZl9tYXRjaCksCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWVtaWZfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTXVyYWxpIEthcmljaGVyaSA8bS1rYXJpY2hlcmkyQHRpLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkl2YW4gS2hvcm9uemh1ayA8aXZhbi5raG9yb256aHVrQHRpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGV4YXMgSW5zdHJ1bWVudHMgQUVNSUYgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgS0JVSUxEX01PRE5BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKaW5kZXggYThjMDhmMy4uOTI3NTJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCkBAIC02NTIsNiArNjUyLDQ0IEBACiAJcmV0dXJuIGkyb19ocnRfZ2V0KGMpOwogfTsKIAorc3RhdGljIHZvaWQgaTJvX3Jlc19hbGxvYyhzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZjLT5tZW1fcmVzb3VyY2U7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemUsIGFsaWduOworCWludCBlcnI7CisKKwlyZXMtPm5hbWUgPSBjLT5wZGV2LT5idXMtPm5hbWU7CisJcmVzLT5mbGFncyA9IGZsYWdzOworCXJlcy0+c3RhcnQgPSAwOworCXJlcy0+ZW5kID0gMDsKKwlvc21faW5mbygiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsIGMtPm5hbWUpOworCisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJc2l6ZSA9IHNiLT5kZXNpcmVkX21lbV9zaXplOworCQlhbGlnbiA9IDEgPDwgMjA7CS8qIHVuc3BlY2lmaWVkLCB1c2UgMU1iIGFuZCBwbGF5IHNhZmUgKi8KKwl9IGVsc2UgeworCQlzaXplID0gc2ItPmRlc2lyZWRfaW9fc2l6ZTsKKwkJYWxpZ24gPSAxIDw8IDEyOwkvKiB1bnNwZWNpZmllZCwgdXNlIDRLYiBhbmQgcGxheSBzYWZlICovCisJfQorCisJZXJyID0gcGNpX2J1c19hbGxvY19yZXNvdXJjZShjLT5wZGV2LT5idXMsIHJlcywgc2l6ZSwgYWxpZ24sIDAsIDAsCisJCQkJICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJYy0+bWVtX2FsbG9jID0gMTsKKwkJc2ItPmN1cnJlbnRfbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJCXNiLT5jdXJyZW50X21lbV9iYXNlID0gcmVzLT5zdGFydDsKKwl9IGVsc2UgaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQljLT5pb19hbGxvYyA9IDE7CisJCXNiLT5jdXJyZW50X2lvX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJCXNiLT5jdXJyZW50X2lvX2Jhc2UgPSByZXMtPnN0YXJ0OworCX0KKwlvc21faW5mbygiJXM6IGFsbG9jYXRlZCBQQ0kgc3BhY2UgJXBSXG4iLCBjLT5uYW1lLCByZXMpOworfQorCiAvKioKICAqCWkyb19pb3Bfc3lzdGFiX3NldCAtIFNldCB0aGUgSTJPIFN5c3RlbSBUYWJsZSBvZiB0aGUgc3BlY2lmaWVkIElPUAogICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBzeXN0ZW0gdGFibGUgc2hvdWxkIGJlIHNlbmQKQEAgLTY2NSw1MiArNzAzLDEzIEBACiAJc3RydWN0IGkyb19tZXNzYWdlICptc2c7CiAJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYy0+cGRldi0+ZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqcm9vdDsKIAlpbnQgcmM7CiAKLQlpZiAoc2ItPmN1cnJlbnRfbWVtX3NpemUgPCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSkgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZjLT5tZW1fcmVzb3VyY2U7Ci0JCXJlcy0+bmFtZSA9IGMtPnBkZXYtPmJ1cy0+bmFtZTsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwotCQlyZXMtPnN0YXJ0ID0gMDsKLQkJcmVzLT5lbmQgPSAwOwotCQlvc21faW5mbygiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsIGMtPm5hbWUpOwotCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGMtPnBkZXYsIHJlcyk7Ci0JCWlmIChyb290ID09IE5VTEwpCi0JCQlvc21fd2FybigiJXM6IENhbid0IGZpbmQgcGFyZW50IHJlc291cmNlIVxuIiwgYy0+bmFtZSk7Ci0JCWlmIChyb290ICYmIGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2ItPmRlc2lyZWRfbWVtX3NpemUsIHNiLT5kZXNpcmVkX21lbV9zaXplLCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSwgMSA8PCAyMCwJLyogVW5zcGVjaWZpZWQsIHNvIHVzZSAxTWIgYW5kIHBsYXkgc2FmZSAqLwotCQkJCQkgICAgICBOVUxMLCBOVUxMKSA+PSAwKSB7Ci0JCQljLT5tZW1fYWxsb2MgPSAxOwotCQkJc2ItPmN1cnJlbnRfbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7Ci0JCQlzYi0+Y3VycmVudF9tZW1fYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCQlvc21faW5mbygiJXM6IGFsbG9jYXRlZCAlbGx1IGJ5dGVzIG9mIFBDSSBtZW1vcnkgYXQgIgotCQkJCSIweCUwMTZsbFguXG4iLCBjLT5uYW1lLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzb3VyY2Vfc2l6ZShyZXMpLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCk7Ci0JCX0KLQl9CisJaWYgKHNiLT5jdXJyZW50X21lbV9zaXplIDwgc2ItPmRlc2lyZWRfbWVtX3NpemUpCisJCWkyb19yZXNfYWxsb2MoYywgSU9SRVNPVVJDRV9NRU0pOwogCi0JaWYgKHNiLT5jdXJyZW50X2lvX3NpemUgPCBzYi0+ZGVzaXJlZF9pb19zaXplKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmMtPmlvX3Jlc291cmNlOwotCQlyZXMtPm5hbWUgPSBjLT5wZGV2LT5idXMtPm5hbWU7Ci0JCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCQlyZXMtPnN0YXJ0ID0gMDsKLQkJcmVzLT5lbmQgPSAwOwotCQlvc21faW5mbygiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsIGMtPm5hbWUpOwotCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGMtPnBkZXYsIHJlcyk7Ci0JCWlmIChyb290ID09IE5VTEwpCi0JCQlvc21fd2FybigiJXM6IENhbid0IGZpbmQgcGFyZW50IHJlc291cmNlIVxuIiwgYy0+bmFtZSk7Ci0JCWlmIChyb290ICYmIGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgMSA8PCAyMCwJLyogVW5zcGVjaWZpZWQsIHNvIHVzZSAxTWIgYW5kIHBsYXkgc2FmZSAqLwotCQkJCQkgICAgICBOVUxMLCBOVUxMKSA+PSAwKSB7Ci0JCQljLT5pb19hbGxvYyA9IDE7Ci0JCQlzYi0+Y3VycmVudF9pb19zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwotCQkJc2ItPmN1cnJlbnRfbWVtX2Jhc2UgPSByZXMtPnN0YXJ0OwotCQkJb3NtX2luZm8oIiVzOiBhbGxvY2F0ZWQgJWxsdSBieXRlcyBvZiBQQ0kgSS9PIGF0ICIKLQkJCQkiMHglMDE2bGxYLlxuIiwgYy0+bmFtZSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlc291cmNlX3NpemUocmVzKSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQpOwotCQl9Ci0JfQorCWlmIChzYi0+Y3VycmVudF9pb19zaXplIDwgc2ItPmRlc2lyZWRfaW9fc2l6ZSkKKwkJaTJvX3Jlc19hbGxvYyhjLCBJT1JFU09VUkNFX0lPKTsKIAogCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwogCWlmIChJU19FUlIobXNnKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FyaXpvbmEtY29yZS5jIGIvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMKaW5kZXggYTQ1YWFiOS4uMWMzYWU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMKQEAgLTI1MSw4ICsyNTEsNiBAQAogCXVuc2lnbmVkIGludCBmbGwsIHN5c2NsazsKIAlpbnQgcmV0LCBlcnI7CiAKLQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYXJpem9uYS0+cmVnbWFwLCB0cnVlKTsKLQogCS8qIENhY2hlIGV4aXN0aW5nIEZMTCBhbmQgU1lTQ0xLIHNldHRpbmdzICovCiAJcmV0ID0gcmVnbWFwX3JlYWQoYXJpem9uYS0+cmVnbWFwLCBBUklaT05BX0ZMTDFfQ09OVFJPTF8xLCAmZmxsKTsKIAlpZiAocmV0ICE9IDApIHsKQEAgLTMyMiw4ICszMjAsNiBAQAogCQkJZXJyKTsKIAl9CiAKLQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYXJpem9uYS0+cmVnbWFwLCBmYWxzZSk7Ci0KIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc2VjLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3NlYy1jb3JlLmMKaW5kZXggNzE0ZTIxMy4uMjgxYTgyNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3NlYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvc2VjLWNvcmUuYwpAQCAtMjYsNyArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zMm1wYTAxLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczJtcHMxMS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zNW04NzYzLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtNjksMTggKzcxLDUzIEBACiAJfQogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtZmRfY2VsbCBzMm1wczE0X2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gInMybXBzMTQtcG1pYyIsCisJfSwgeworCQkubmFtZSA9ICJzMm1wczE0LXJ0YyIsCisJfSwgeworCQkubmFtZSA9ICJzMm1wczE0LWNsayIsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZmRfY2VsbCBzMm1wYTAxX2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gInMybXBhMDEtcG1pYyIsCisJfSwKK307CisKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNlY19kdF9tYXRjaFtdID0gewogCXsJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzNW04NzY3LXBtaWMiLAogCQkuZGF0YSA9ICh2b2lkICopUzVNODc2N1gsCi0JfSwKLQl7CS5jb21wYXRpYmxlID0gInNhbXN1bmcsczJtcHMxMS1wbWljIiwKKwl9LCB7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsczJtcHMxMS1wbWljIiwKIAkJLmRhdGEgPSAodm9pZCAqKVMyTVBTMTFYLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzMm1wczE0LXBtaWMiLAorCQkuZGF0YSA9ICh2b2lkICopUzJNUFMxNFgsCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMybXBhMDEtcG1pYyIsCisJCS5kYXRhID0gKHZvaWQgKilTMk1QQTAxLAorCX0sIHsKKwkJLyogU2VudGluZWwgKi8KIAl9LAotCXt9LAogfTsKICNlbmRpZgogCitzdGF0aWMgYm9vbCBzMm1wYTAxX3ZvbGF0aWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUzJNUEEwMV9SRUdfSU5UMU06CisJY2FzZSBTMk1QQTAxX1JFR19JTlQyTToKKwljYXNlIFMyTVBBMDFfUkVHX0lOVDNNOgorCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHRydWU7CisJfQorfQorCiBzdGF0aWMgYm9vbCBzMm1wczExX3ZvbGF0aWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKIHsKIAlzd2l0Y2ggKHJlZykgewpAQCAtMTExLDYgKzE0OCwxNSBAQAogCS52YWxfYml0cyA9IDgsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgczJtcGEwMV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBTMk1QQTAxX1JFR19MRE9fT1ZDQjQsCisJLnZvbGF0aWxlX3JlZyA9IHMybXBhMDFfdm9sYXRpbGUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHMybXBzMTFfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCkBAIC0xMjAsNiArMTY2LDE1IEBACiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHMybXBzMTRfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gUzJNUFMxNF9SRUdfTERPRFNDSDMsCisJLnZvbGF0aWxlX3JlZyA9IHMybXBzMTFfdm9sYXRpbGUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHM1bTg3NjNfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCkBAIC0xMzgsOSArMTkzLDE4IEBACiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNlY19ydGNfcmVnbWFwX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzNW1fcnRjX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LAorCisJLm1heF9yZWdpc3RlciA9IFNFQ19SVENfUkVHX01BWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzMm1wczE0X3J0Y19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBTMk1QU19SVENfUkVHX01BWCwKIH07CiAKICNpZmRlZiBDT05GSUdfT0YKQEAgLTE4MCwyNCArMjQ0LDI0IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgc2VjX2kyY19nZXRfZHJpdmVyX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmkyYywKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzZWNfaTJjX2dldF9kcml2ZXJfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogI2lmZGVmIENPTkZJR19PRgogCWlmIChpMmMtPmRldi5vZl9ub2RlKSB7CiAJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCQltYXRjaCA9IG9mX21hdGNoX25vZGUoc2VjX2R0X21hdGNoLCBpMmMtPmRldi5vZl9ub2RlKTsKLQkJcmV0dXJuIChpbnQpbWF0Y2gtPmRhdGE7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyltYXRjaC0+ZGF0YTsKIAl9CiAjZW5kaWYKLQlyZXR1cm4gKGludClpZC0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIGlkLT5kcml2ZXJfZGF0YTsKIH0KIAogc3RhdGljIGludCBzZWNfcG1pY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc2VjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpOwotCWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpyZWdtYXA7CisJY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcCwgKnJlZ21hcF9ydGM7CiAJc3RydWN0IHNlY19wbWljX2RldiAqc2VjX3BtaWM7CiAJaW50IHJldDsKIApAQCAtMjI5LDE3ICsyOTMsMzQgQEAKIAl9CiAKIAlzd2l0Y2ggKHNlY19wbWljLT5kZXZpY2VfdHlwZSkgeworCWNhc2UgUzJNUEEwMToKKwkJcmVnbWFwID0gJnMybXBhMDFfcmVnbWFwX2NvbmZpZzsKKwkJYnJlYWs7CiAJY2FzZSBTMk1QUzExWDoKIAkJcmVnbWFwID0gJnMybXBzMTFfcmVnbWFwX2NvbmZpZzsKKwkJLyoKKwkJICogVGhlIHJ0Yy1zNW0gZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgUzJNUFMxMSBhbmQgdGhlcmUKKwkJICogaXMgbm8gbWZkX2NlbGwgZm9yIFMyTVBTMTEgUlRDIGRldmljZS4KKwkJICogSG93ZXZlciB3ZSBtdXN0IHBhc3Mgc29tZXRoaW5nIHRvIGRldm1fcmVnbWFwX2luaXRfaTJjKCkKKwkJICogc28gdXNlIFM1TS1saWtlIHJlZ21hcCBjb25maWcgZXZlbiB0aG91Z2ggaXQgd291bGRuJ3Qgd29yay4KKwkJICovCisJCXJlZ21hcF9ydGMgPSAmczVtX3J0Y19yZWdtYXBfY29uZmlnOworCQlicmVhazsKKwljYXNlIFMyTVBTMTRYOgorCQlyZWdtYXAgPSAmczJtcHMxNF9yZWdtYXBfY29uZmlnOworCQlyZWdtYXBfcnRjID0gJnMybXBzMTRfcnRjX3JlZ21hcF9jb25maWc7CiAJCWJyZWFrOwogCWNhc2UgUzVNODc2M1g6CiAJCXJlZ21hcCA9ICZzNW04NzYzX3JlZ21hcF9jb25maWc7CisJCXJlZ21hcF9ydGMgPSAmczVtX3J0Y19yZWdtYXBfY29uZmlnOwogCQlicmVhazsKIAljYXNlIFM1TTg3NjdYOgogCQlyZWdtYXAgPSAmczVtODc2N19yZWdtYXBfY29uZmlnOworCQlyZWdtYXBfcnRjID0gJnM1bV9ydGNfcmVnbWFwX2NvbmZpZzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVnbWFwID0gJnNlY19yZWdtYXBfY29uZmlnOworCQlyZWdtYXBfcnRjID0gJnM1bV9ydGNfcmVnbWFwX2NvbmZpZzsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTIsMTAgKzMzMywxMyBAQAogCX0KIAogCXNlY19wbWljLT5ydGMgPSBpMmNfbmV3X2R1bW15KGkyYy0+YWRhcHRlciwgUlRDX0kyQ19BRERSKTsKKwlpZiAoIXNlY19wbWljLT5ydGMpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgSTJDIGZvciBSVENcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJaTJjX3NldF9jbGllbnRkYXRhKHNlY19wbWljLT5ydGMsIHNlY19wbWljKTsKIAotCXNlY19wbWljLT5yZWdtYXBfcnRjID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoc2VjX3BtaWMtPnJ0YywKLQkJCSZzZWNfcnRjX3JlZ21hcF9jb25maWcpOworCXNlY19wbWljLT5yZWdtYXBfcnRjID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoc2VjX3BtaWMtPnJ0YywgcmVnbWFwX3J0Yyk7CiAJaWYgKElTX0VSUihzZWNfcG1pYy0+cmVnbWFwX3J0YykpIHsKIAkJcmV0ID0gUFRSX0VSUihzZWNfcG1pYy0+cmVnbWFwX3J0Yyk7CiAJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFJUQyByZWdpc3RlciBtYXA6ICVkXG4iLApAQCAtMjgzLDEwICszNjcsMTggQEAKIAkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHNlY19wbWljLT5kZXYsIC0xLCBzNW04NzY3X2RldnMsCiAJCQkJICAgICAgQVJSQVlfU0laRShzNW04NzY3X2RldnMpLCBOVUxMLCAwLCBOVUxMKTsKIAkJYnJlYWs7CisJY2FzZSBTMk1QQTAxOgorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoc2VjX3BtaWMtPmRldiwgLTEsIHMybXBhMDFfZGV2cywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHMybXBhMDFfZGV2cyksIE5VTEwsIDAsIE5VTEwpOworCQlicmVhazsKIAljYXNlIFMyTVBTMTFYOgogCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoc2VjX3BtaWMtPmRldiwgLTEsIHMybXBzMTFfZGV2cywKIAkJCQkgICAgICBBUlJBWV9TSVpFKHMybXBzMTFfZGV2cyksIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKKwljYXNlIFMyTVBTMTRYOgorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoc2VjX3BtaWMtPmRldiwgLTEsIHMybXBzMTRfZGV2cywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHMybXBzMTRfZGV2cyksIE5VTEwsIDAsIE5VTEwpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBJZiB0aGlzIGhhcHBlbnMgdGhlIHByb2JlIGZ1bmN0aW9uIGlzIHByb2JsZW0gKi8KIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zZWMtaXJxLmMgYi9kcml2ZXJzL21mZC9zZWMtaXJxLmMKaW5kZXggNGRlNDk0Zi4uNjRlNzkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc2VjLWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3NlYy1pcnEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBzZWMtaXJxLmMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAogICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zMm1wczE0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvczVtODc2My5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3M1bTg3NjcuaD4KIApAQCAtNTksMTQgKzYwLDE0IEBACiAJCS5yZWdfb2Zmc2V0ID0gMSwKIAkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVEM2MFNfTUFTSywKIAl9LAorCVtTMk1QUzExX0lSUV9SVENBMF0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVENBMF9NQVNLLAorCX0sCiAJW1MyTVBTMTFfSVJRX1JUQ0ExXSA9IHsKIAkJLnJlZ19vZmZzZXQgPSAxLAogCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQ0ExX01BU0ssCiAJfSwKLQlbUzJNUFMxMV9JUlFfUlRDQTJdID0gewotCQkucmVnX29mZnNldCA9IDEsCi0JCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDQTJfTUFTSywKLQl9LAogCVtTMk1QUzExX0lSUV9TTVBMXSA9IHsKIAkJLnJlZ19vZmZzZXQgPSAxLAogCQkubWFzayA9IFMyTVBTMTFfSVJRX1NNUExfTUFTSywKQEAgLTg5LDYgKzkwLDc2IEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSBzMm1wczE0X2lycXNbXSA9IHsKKwlbUzJNUFMxNF9JUlFfUFdST05GXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1BXUk9ORl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1BXUk9OUl0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMCwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9QV1JPTlJfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9KSUdPTkJGXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0pJR09OQkZfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9KSUdPTkJSXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0pJR09OQlJfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9BQ09LQkZdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfQUNPS0JGX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfQUNPS0JSXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAwLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX0FDT0tCUl9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1BXUk9OMVNdID0geworCQkucmVnX29mZnNldCA9IDAsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUFdST04xU19NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX01SQl0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMCwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9NUkJfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9SVEM2MFNdID0geworCQkucmVnX29mZnNldCA9IDEsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDNjBTX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfUlRDQTFdID0geworCQkucmVnX29mZnNldCA9IDEsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDQTFfTUFTSywKKwl9LAorCVtTMk1QUzE0X0lSUV9SVENBMF0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVENBMF9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1NNUExdID0geworCQkucmVnX29mZnNldCA9IDEsCisJCS5tYXNrID0gUzJNUFMxMV9JUlFfU01QTF9NQVNLLAorCX0sCisJW1MyTVBTMTRfSVJRX1JUQzFTXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAxLAorCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQzFTX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfV1RTUl0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9XVFNSX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfSU5UMTIwQ10gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMiwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9JTlQxMjBDX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfSU5UMTQwQ10gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMiwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9JTlQxNDBDX01BU0ssCisJfSwKKwlbUzJNUFMxNF9JUlFfVFNEXSA9IHsKKwkJLnJlZ19vZmZzZXQgPSAyLAorCQkubWFzayA9IFMyTVBTMTRfSVJRX1RTRF9NQVNLLAorCX0sCit9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnEgczVtODc2N19pcnFzW10gPSB7CiAJW1M1TTg3NjdfSVJRX1BXUlJdID0gewpAQCAtMjQ2LDYgKzMxNywxNiBAQAogCS5hY2tfYmFzZSA9IFMyTVBTMTFfUkVHX0lOVDEsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnFfY2hpcCBzMm1wczE0X2lycV9jaGlwID0geworCS5uYW1lID0gInMybXBzMTQiLAorCS5pcnFzID0gczJtcHMxNF9pcnFzLAorCS5udW1faXJxcyA9IEFSUkFZX1NJWkUoczJtcHMxNF9pcnFzKSwKKwkubnVtX3JlZ3MgPSAzLAorCS5zdGF0dXNfYmFzZSA9IFMyTVBTMTRfUkVHX0lOVDEsCisJLm1hc2tfYmFzZSA9IFMyTVBTMTRfUkVHX0lOVDFNLAorCS5hY2tfYmFzZSA9IFMyTVBTMTRfUkVHX0lOVDEsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnFfY2hpcCBzNW04NzY3X2lycV9jaGlwID0gewogCS5uYW1lID0gInM1bTg3NjciLAogCS5pcnFzID0gczVtODc2N19pcnFzLApAQCAtMjk3LDYgKzM3OCwxMiBAQAogCQkJCSAgc2VjX3BtaWMtPmlycV9iYXNlLCAmczJtcHMxMV9pcnFfY2hpcCwKIAkJCQkgICZzZWNfcG1pYy0+aXJxX2RhdGEpOwogCQlicmVhazsKKwljYXNlIFMyTVBTMTRYOgorCQlyZXQgPSByZWdtYXBfYWRkX2lycV9jaGlwKHNlY19wbWljLT5yZWdtYXBfcG1pYywgc2VjX3BtaWMtPmlycSwKKwkJCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULAorCQkJCSAgc2VjX3BtaWMtPmlycV9iYXNlLCAmczJtcHMxNF9pcnFfY2hpcCwKKwkJCQkgICZzZWNfcG1pYy0+aXJxX2RhdGEpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHNlY19wbWljLT5kZXYsICJVbmtub3duIGRldmljZSB0eXBlICVkXG4iLAogCQkJc2VjX3BtaWMtPmRldmljZV90eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtNTEwMi10YWJsZXMuYyBiL2RyaXZlcnMvbWZkL3dtNTEwMi10YWJsZXMuYwppbmRleCAxZTlhNGIyLi5iZmZjNTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTUxMDItdGFibGVzLmMKKysrIGIvZHJpdmVycy9tZmQvd201MTAyLXRhYmxlcy5jCkBAIC04MCw4ICs4MCw3IEBACiBpbnQgd201MTAyX3BhdGNoKHN0cnVjdCBhcml6b25hICphcml6b25hKQogewogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqd201MTAyX3BhdGNoOwotCWludCByZXQgPSAwOwotCWludCBpLCBwYXRjaF9zaXplOworCWludCBwYXRjaF9zaXplOwogCiAJc3dpdGNoIChhcml6b25hLT5yZXYpIHsKIAljYXNlIDA6CkBAIC05MiwyMSArOTEsOSBAQAogCQlwYXRjaF9zaXplID0gQVJSQVlfU0laRSh3bTUxMDJfcmV2Yl9wYXRjaCk7CiAJfQogCi0JcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGFyaXpvbmEtPnJlZ21hcCwgdHJ1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGF0Y2hfc2l6ZTsgaSsrKSB7Ci0JCXJldCA9IHJlZ21hcF93cml0ZShhcml6b25hLT5yZWdtYXAsIHdtNTEwMl9wYXRjaFtpXS5yZWcsCi0JCQkJICAgd201MTAyX3BhdGNoW2ldLmRlZik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2Vycihhcml6b25hLT5kZXYsICJGYWlsZWQgdG8gd3JpdGUgJXggPSAleDogJWRcbiIsCi0JCQkJd201MTAyX3BhdGNoW2ldLnJlZywgd201MTAyX3BhdGNoW2ldLmRlZiwgcmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi1vdXQ6Ci0JcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGFyaXpvbmEtPnJlZ21hcCwgZmFsc2UpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHJlZ21hcF9tdWx0aV9yZWdfd3JpdGVfYnlwYXNzZWQoYXJpem9uYS0+cmVnbWFwLAorCQkJCQkgICAgICAgd201MTAyX3BhdGNoLAorCQkJCQkgICAgICAgcGF0Y2hfc2l6ZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSB3bTUxMDJfYW9kX2lycXNbQVJJWk9OQV9OVU1fSVJRXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggNmNiMzg4ZS4uMWNiNzQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiBjb25maWcgQ1M1NTM1X01GR1BUCiAJdHJpc3RhdGUgIkNTNTUzNS9DUzU1MzYgR2VvZGUgTXVsdGktRnVuY3Rpb24gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIChNRkdQVCkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgTUZEX0NTNTUzNQorCWRlcGVuZHMgb24gTUZEX0NTNTUzNQogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGFjY2VzcyB0byBNRkdQVCBmdW5jdGlvbmFsaXR5IGZvciBvdGhlcgpAQCAtNTI2LDQgKzUyNiw1IEBACiBzb3VyY2UgImRyaXZlcnMvbWlzYy92bXdfdm1jaS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2MvbWljL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9nZW53cWUvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9taXNjL2VjaG8vS2NvbmZpZyIKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCA5OWI5NDI0Li43ZWI0YjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC01NCwzICs1NCw0IEBACiBvYmotJChDT05GSUdfU1JBTSkJCSs9IHNyYW0ubwogb2JqLXkJCQkJKz0gbWljLwogb2JqLSQoQ09ORklHX0dFTldRRSkJCSs9IGdlbndxZS8KK29iai0kKENPTkZJR19FQ0hPKQkJKz0gZWNoby8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hZDUyNXhfZHBvdC5jIGIvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LmMKaW5kZXggZDNlZWUxMS4uYTQzMDUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LmMKKysrIGIvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LmMKQEAgLTcyLDcgKzcyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hcGRzOTgwMmFscy5jIGIvZHJpdmVycy9taXNjL2FwZHM5ODAyYWxzLmMKaW5kZXggMGM2ZTAzNy4uYzZjYzNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FwZHM5ODAyYWxzLmMKKysrIGIvZHJpdmVycy9taXNjL2FwZHM5ODAyYWxzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYyBiL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYwppbmRleCA1YmU4MDg0MC4uMjJkZTEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jCisrKyBiL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYwpAQCAtMTUwLDYgKzE1MCwxMiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlzc2MtPnBkYXRhID0gKHN0cnVjdCBhdG1lbF9zc2NfcGxhdGZvcm1fZGF0YSAqKXBsYXRfZGF0OwogCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwkJc3NjLT5jbGtfZnJvbV9ya19waW4gPQorCQkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXRtZWwsY2xrLWZyb20tcmstcGluIik7CisJfQorCiAJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJc3NjLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlZ3MpOwogCWlmIChJU19FUlIoc3NjLT5yZWdzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUuYyBiL2RyaXZlcnMvbWlzYy9ibXAwODUuYwppbmRleCA4MjBlNTNkLi45YjMxM2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYm1wMDg1LmMKKysrIGIvZHJpdmVycy9taXNjL2JtcDA4NS5jCkBAIC00Nyw3ICs0Nyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSAiYm1wMDg1LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvY2FybWEvY2FybWEtZnBnYS5jIGIvZHJpdmVycy9taXNjL2Nhcm1hL2Nhcm1hLWZwZ2EuYwppbmRleCA5ZTJiOTg1Li4xNGQ5MGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY2FybWEvY2FybWEtZnBnYS5jCisrKyBiL2RyaXZlcnMvbWlzYy9jYXJtYS9jYXJtYS1mcGdhLmMKQEAgLTEwMSw3ICsxMDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2RzMTY4Mi5jIGIvZHJpdmVycy9taXNjL2RzMTY4Mi5jCmluZGV4IDE1NGIwMmUuLjZhNjcyZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9kczE2ODIuYworKysgYi9kcml2ZXJzL21pc2MvZHMxNjgyLmMKQEAgLTMyLDcgKzMyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL0tjb25maWcgYi9kcml2ZXJzL21pc2MvZWNoby9LY29uZmlnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWNoby9LY29uZmlnCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9LY29uZmlnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9lY2hvL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWNoby9NYWtlZmlsZQpyZW5hbWUgdG8gZHJpdmVycy9taXNjL2VjaG8vTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uYyBiL2RyaXZlcnMvbWlzYy9lY2hvL2VjaG8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5jCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9lY2hvLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaCBiL2RyaXZlcnMvbWlzYy9lY2hvL2VjaG8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9lY2hvLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oIGIvZHJpdmVycy9taXNjL2VjaG8vZmlyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lY2hvL2Zpci5oCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvZWNoby9maXIuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vb3NsZWMuaCBiL2RyaXZlcnMvbWlzYy9lY2hvL29zbGVjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lY2hvL29zbGVjLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9lY2hvL29zbGVjLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNS5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKaW5kZXggNGYzYmNhMS4uNjM0ZjcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKQEAgLTEwLDcgKzEwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tLmMKaW5kZXggZjBmYTRlOC4uMzNmODY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbS5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb21fOTN4eDQ2LmMgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M3h4NDYuYwppbmRleCA3OGU1NWI1Li45ZWJlYWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M3h4NDYuYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M3h4NDYuYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9tYXg2ODc1LmMgYi9kcml2ZXJzL21pc2MvZWVwcm9tL21heDY4NzUuYwppbmRleCBlMzYxNTdkLi41ODBmZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVwcm9tL21heDY4NzUuYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL21heDY4NzUuYwpAQCAtMjcsNyArMjcsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9zdW54aV9zaWQuYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vc3VueGlfc2lkLmMKaW5kZXggOWMzNGU1Ny4uM2YyYjYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9zdW54aV9zaWQuYworKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL3N1bnhpX3NpZC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CkBAIC05Niw3ICs5NSw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bnhpX3NpZF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXNpZCIsIC5kYXRhID0gKHZvaWQgKikxNn0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNpZCIsIC5kYXRhID0gKHZvaWQgKikxNn0sCiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLXNpZCIsIC5kYXRhID0gKHZvaWQgKik1MTJ9LAogCXsvKiBzZW50aW5lbCAqL30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RlYnVnZnMuYyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9kZWJ1Z2ZzLmMKaW5kZXggM2JmZGMwNy4uNTBkMjA5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGVidWdmcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2htYzYzNTIuYyBiL2RyaXZlcnMvbWlzYy9obWM2MzUyLmMKaW5kZXggMTcwYmQzZC4uOTA1MjBkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2htYzYzNTIuYworKysgYi9kcml2ZXJzL21pc2MvaG1jNjM1Mi5jCkBAIC0yMiw3ICsyMiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaXNsMjkwMDMuYyBiL2RyaXZlcnMvbWlzYy9pc2wyOTAwMy5jCmluZGV4IGUzMTgzZjIuLjEyYzMwYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pc2wyOTAwMy5jCisrKyBiL2RyaXZlcnMvbWlzYy9pc2wyOTAwMy5jCkBAIC0yNiw3ICsyNiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pc2wyOTAyMC5jIGIvZHJpdmVycy9taXNjL2lzbDI5MDIwLmMKaW5kZXggYjdmODRkYS4uNGE5YzUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2lzbDI5MDIwLmMKKysrIGIvZHJpdmVycy9taXNjL2lzbDI5MDIwLmMKQEAgLTIzLDcgKzIzLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9sYXR0aWNlLWVjcDMtY29uZmlnLmMgYi9kcml2ZXJzL21pc2MvbGF0dGljZS1lY3AzLWNvbmZpZy5jCmluZGV4IDYxZmJlNmEuLjBhMTU2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sYXR0aWNlLWVjcDMtY29uZmlnLmMKKysrIGIvZHJpdmVycy9taXNjL2xhdHRpY2UtZWNwMy1jb25maWcuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuYyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmMKaW5kZXggMDM2ZWZmZS4uM2VmNDYyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuYworKysgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX2kyYy5jIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMKaW5kZXggN2M5NzU1MC4uZDMyNGY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMKKysrIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9zcGkuYyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jCmluZGV4IDlhYTJiZDIuLmJkMDZkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jCisrKyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jCkBAIC0xMCw3ICsxMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9sa2R0bS5jIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKaW5kZXggNDljN2EyMy4uZDY2YTJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xrZHRtLmMKKysrIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKQEAgLTMwLDYgKzMwLDcgQEAKICAqCiAgKiBTZWUgRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vcHJvdm9rZS1jcmFzaGVzLnR4dCBmb3IgaW5zdHJ1Y3Rpb25zCiAgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC00NSw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2lmZGVmIENPTkZJR19JREUKICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KQEAgLTEwMSw2ICsxMDMsNyBAQAogCUNUX0VYRUNfVVNFUlNQQUNFLAogCUNUX0FDQ0VTU19VU0VSU1BBQ0UsCiAJQ1RfV1JJVEVfUk8sCisJQ1RfV1JJVEVfS0VSTiwKIH07CiAKIHN0YXRpYyBjaGFyKiBjcF9uYW1lW10gPSB7CkBAIC0xMzcsNiArMTQwLDcgQEAKIAkiRVhFQ19VU0VSU1BBQ0UiLAogCSJBQ0NFU1NfVVNFUlNQQUNFIiwKIAkiV1JJVEVfUk8iLAorCSJXUklURV9LRVJOIiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QganByb2JlIGxrZHRtOwpAQCAtMzE2LDYgKzMyMCwxMyBAQAogCXJldHVybjsKIH0KIAorLyogTXVzdCBpbW1lZGlhdGVseSBmb2xsb3cgZG9fbm90aGluZyBmb3Igc2l6ZSBjYWxjdWx1YXRpb25zIHRvIHdvcmsgb3V0LiAqLworc3RhdGljIHZvaWQgZG9fb3ZlcndyaXR0ZW4odm9pZCkKK3sKKwlwcl9pbmZvKCJkb19vdmVyd3JpdHRlbiB3YXNuJ3Qgb3ZlcndyaXR0ZW4hXG4iKTsKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBub2lubGluZSB2b2lkIGNvcnJ1cHRfc3RhY2sodm9pZCkKIHsKIAkvKiBVc2UgZGVmYXVsdCBjaGFyIGFycmF5IGxlbmd0aCB0aGF0IHRyaWdnZXJzIHN0YWNrIHByb3RlY3Rpb24uICovCkBAIC0zMjgsNyArMzM5LDEyIEBACiB7CiAJdm9pZCAoKmZ1bmMpKHZvaWQpID0gZHN0OwogCisJcHJfaW5mbygiYXR0ZW1wdGluZyBvayBleGVjdXRpb24gYXQgJXBcbiIsIGRvX25vdGhpbmcpOworCWRvX25vdGhpbmcoKTsKKwogCW1lbWNweShkc3QsIGRvX25vdGhpbmcsIEVYRUNfU0laRSk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWRzdCwgKHVuc2lnbmVkIGxvbmcpZHN0ICsgRVhFQ19TSVpFKTsKKwlwcl9pbmZvKCJhdHRlbXB0aW5nIGJhZCBleGVjdXRpb24gYXQgJXBcbiIsIGZ1bmMpOwogCWZ1bmMoKTsKIH0KIApAQCAtMzM3LDggKzM1MywxMyBAQAogCS8qIEludGVudGlvbmFsbHkgY3Jvc3Npbmcga2VybmVsL3VzZXIgbWVtb3J5IGJvdW5kYXJ5LiAqLwogCXZvaWQgKCpmdW5jKSh2b2lkKSA9IGRzdDsKIAorCXByX2luZm8oImF0dGVtcHRpbmcgb2sgZXhlY3V0aW9uIGF0ICVwXG4iLCBkb19ub3RoaW5nKTsKKwlkb19ub3RoaW5nKCk7CisKIAlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWRzdCwgZG9fbm90aGluZywgRVhFQ19TSVpFKSkKIAkJcmV0dXJuOworCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylkc3QsICh1bnNpZ25lZCBsb25nKWRzdCArIEVYRUNfU0laRSk7CisJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgZXhlY3V0aW9uIGF0ICVwXG4iLCBmdW5jKTsKIAlmdW5jKCk7CiB9CiAKQEAgLTQ2Myw4ICs0ODQsMTIgQEAKIAkJfQogCiAJCXB0ciA9ICh1bnNpZ25lZCBsb25nICopdXNlcl9hZGRyOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIHJlYWQgYXQgJXBcbiIsIHB0cik7CiAJCXRtcCA9ICpwdHI7CiAJCXRtcCArPSAweGMwZGVjMGRlOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIHdyaXRlIGF0ICVwXG4iLCBwdHIpOwogCQkqcHRyID0gdG1wOwogCiAJCXZtX211bm1hcCh1c2VyX2FkZHIsIFBBR0VfU0laRSk7CkBAIC00NzUsMTAgKzUwMCwyOCBAQAogCQl1bnNpZ25lZCBsb25nICpwdHI7CiAKIAkJcHRyID0gKHVuc2lnbmVkIGxvbmcgKikmcm9kYXRhOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIHdyaXRlIGF0ICVwXG4iLCBwdHIpOwogCQkqcHRyIF49IDB4YWJjZDEyMzQ7CiAKIAkJYnJlYWs7CiAJfQorCWNhc2UgQ1RfV1JJVEVfS0VSTjogeworCQlzaXplX3Qgc2l6ZTsKKwkJdW5zaWduZWQgY2hhciAqcHRyOworCisJCXNpemUgPSAodW5zaWduZWQgbG9uZylkb19vdmVyd3JpdHRlbiAtCisJCSAgICAgICAodW5zaWduZWQgbG9uZylkb19ub3RoaW5nOworCQlwdHIgPSAodW5zaWduZWQgY2hhciAqKWRvX292ZXJ3cml0dGVuOworCisJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkICV6dSBieXRlIHdyaXRlIGF0ICVwXG4iLCBzaXplLCBwdHIpOworCQltZW1jcHkocHRyLCAodW5zaWduZWQgY2hhciAqKWRvX25vdGhpbmcsIHNpemUpOworCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpcHRyLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKShwdHIgKyBzaXplKSk7CisKKwkJZG9fb3ZlcndyaXR0ZW4oKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgQ1RfTk9ORToKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTQ5Myw4ICs1MzYsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50X2xvY2ssIGZsYWdzKTsKIAljb3VudC0tOwotCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBDcmFzaCBwb2ludCAlcyBvZiB0eXBlICVzIGhpdCwgdHJpZ2dlciBpbiAlZCByb3VuZHNcbiIsCi0JCQljcF9uYW1lX3RvX3N0cihjcG9pbnQpLCBjcF90eXBlX3RvX3N0cihjcHR5cGUpLCBjb3VudCk7CisJcHJfaW5mbygiQ3Jhc2ggcG9pbnQgJXMgb2YgdHlwZSAlcyBoaXQsIHRyaWdnZXIgaW4gJWQgcm91bmRzXG4iLAorCQljcF9uYW1lX3RvX3N0cihjcG9pbnQpLCBjcF90eXBlX3RvX3N0cihjcHR5cGUpLCBjb3VudCk7CiAKIAlpZiAoY291bnQgPT0gMCkgewogCQlkb19pdCA9IHRydWU7CkBAIC01NTEsMTggKzU5NCwxOCBAQAogCQlsa2R0bS5rcC5zeW1ib2xfbmFtZSA9ICJnZW5lcmljX2lkZV9pb2N0bCI7CiAJCWxrZHRtLmVudHJ5ID0gKGtwcm9iZV9vcGNvZGVfdCopIGpwX2dlbmVyaWNfaWRlX2lvY3RsOwogI2Vsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENyYXNoIHBvaW50IG5vdCBhdmFpbGFibGVcbiIpOworCQlwcl9pbmZvKCJDcmFzaCBwb2ludCBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IEludmFsaWQgQ3Jhc2ggUG9pbnRcbiIpOworCQlwcl9pbmZvKCJJbnZhbGlkIENyYXNoIFBvaW50XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJY3BvaW50ID0gd2hpY2g7CiAJaWYgKChyZXQgPSByZWdpc3Rlcl9qcHJvYmUoJmxrZHRtKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBDb3VsZG4ndCByZWdpc3RlciBqcHJvYmVcbiIpOworCQlwcl9pbmZvKCJDb3VsZG4ndCByZWdpc3RlciBqcHJvYmVcbiIpOwogCQljcG9pbnQgPSBDTl9JTlZBTElEOwogCX0KIApAQCAtNzA5LDggKzc1Miw3IEBACiAJaWYgKHR5cGUgPT0gQ1RfTk9ORSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogUGVyZm9ybWluZyBkaXJlY3QgZW50cnkgJXNcbiIsCi0JCQljcF90eXBlX3RvX3N0cih0eXBlKSk7CisJcHJfaW5mbygiUGVyZm9ybWluZyBkaXJlY3QgZW50cnkgJXNcbiIsIGNwX3R5cGVfdG9fc3RyKHR5cGUpKTsKIAlsa2R0bV9kb19hY3Rpb24odHlwZSk7CiAJKm9mZiArPSBjb3VudDsKIApAQCAtNzcyLDcgKzgxNCw3IEBACiAJLyogUmVnaXN0ZXIgZGVidWdmcyBpbnRlcmZhY2UgKi8KIAlsa2R0bV9kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInByb3Zva2UtY3Jhc2giLCBOVUxMKTsKIAlpZiAoIWxrZHRtX2RlYnVnZnNfcm9vdCkgewotCQlwcmludGsoS0VSTl9FUlIgImxrZHRtOiBjcmVhdGluZyByb290IGRpciBmYWlsZWRcbiIpOworCQlwcl9lcnIoImNyZWF0aW5nIHJvb3QgZGlyIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzg3LDI4ICs4MjksMjYgQEAKIAkJZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGN1ci0+bmFtZSwgMDY0NCwgbGtkdG1fZGVidWdmc19yb290LAogCQkJCU5VTEwsICZjdXItPmZvcHMpOwogCQlpZiAoZGUgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJsa2R0bTogY291bGQgbm90IGNyZWF0ZSAlc1xuIiwKLQkJCQkJY3VyLT5uYW1lKTsKKwkJCXByX2VycigiY291bGQgbm90IGNyZWF0ZSAlc1xuIiwgY3VyLT5uYW1lKTsKIAkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KIAogCWlmIChsa2R0bV9wYXJzZV9jb21tYW5kbGluZSgpID09IC1FSU5WQUwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IEludmFsaWQgY29tbWFuZFxuIik7CisJCXByX2luZm8oIkludmFsaWQgY29tbWFuZFxuIik7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlpZiAoY3BvaW50ICE9IENOX0lOVkFMSUQgJiYgY3B0eXBlICE9IENUX05PTkUpIHsKIAkJcmV0ID0gbGtkdG1fcmVnaXN0ZXJfY3BvaW50KGNwb2ludCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogSW52YWxpZCBjcmFzaCBwb2ludCAlZFxuIiwKLQkJCQkJY3BvaW50KTsKKwkJCXByX2luZm8oIkludmFsaWQgY3Jhc2ggcG9pbnQgJWRcbiIsIGNwb2ludCk7CiAJCQlnb3RvIG91dF9lcnI7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENyYXNoIHBvaW50ICVzIG9mIHR5cGUgJXMgcmVnaXN0ZXJlZFxuIiwKLQkJCQljcG9pbnRfbmFtZSwgY3BvaW50X3R5cGUpOworCQlwcl9pbmZvKCJDcmFzaCBwb2ludCAlcyBvZiB0eXBlICVzIHJlZ2lzdGVyZWRcbiIsCisJCQljcG9pbnRfbmFtZSwgY3BvaW50X3R5cGUpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImxrZHRtOiBObyBjcmFzaCBwb2ludHMgcmVnaXN0ZXJlZCwgZW5hYmxlIHRocm91Z2ggZGVidWdmc1xuIik7CisJCXByX2luZm8oIk5vIGNyYXNoIHBvaW50cyByZWdpc3RlcmVkLCBlbmFibGUgdGhyb3VnaCBkZWJ1Z2ZzXG4iKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTgyMyw3ICs4NjMsNyBAQAogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShsa2R0bV9kZWJ1Z2ZzX3Jvb3QpOwogCiAJdW5yZWdpc3Rlcl9qcHJvYmUoJmxrZHRtKTsKLQlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogQ3Jhc2ggcG9pbnQgdW5yZWdpc3RlcmVkXG4iKTsKKwlwcl9pbmZvKCJDcmFzaCBwb2ludCB1bnJlZ2lzdGVyZWRcbiIpOwogfQogCiBtb2R1bGVfaW5pdChsa2R0bV9tb2R1bGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL0tjb25maWcgYi9kcml2ZXJzL21pc2MvbWVpL0tjb25maWcKaW5kZXggYzc2ZmEzMS4uZDIzMzg0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvS2NvbmZpZwpAQCAtMzQsMyArMzQsMTIgQEAKIAkgIDgyUTMzIEV4cHJlc3MKIAkgIDgyWDM4L1g0OCBFeHByZXNzCiAKK2NvbmZpZyBJTlRFTF9NRUlfVFhFCisJdHJpc3RhdGUgIkludGVsIFRydXN0ZWQgRXhlY3V0aW9uIEVudmlyb25tZW50IHdpdGggTUUgSW50ZXJmYWNlIgorCXNlbGVjdCBJTlRFTF9NRUkKKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgV0FUQ0hET0dfQ09SRQorCWhlbHAKKwkgIE1FSSBTdXBwb3J0IGZvciBUcnVzdGVkIEV4ZWN1dGlvbiBFbnZpcm9ubWVudCBkZXZpY2Ugb24gSW50ZWwgU29DcworCisJICBTdXBwb3J0ZWQgU29DczoKKwkgIEludGVsIEJheSBUcmFpbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9tZWkvTWFrZWZpbGUKaW5kZXggMDg2OThhNC4uOGViYzZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvbWVpL01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogIwogIyBNYWtlZmlsZSAtIEludGVsIE1hbmFnZW1lbnQgRW5naW5lIEludGVyZmFjZSAoSW50ZWwgTUVJKSBMaW51eCBkcml2ZXIKLSMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIEludGVsIENvcnBvcmF0aW9uLgorIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCiAjCiBvYmotJChDT05GSUdfSU5URUxfTUVJKSArPSBtZWkubwogbWVpLW9ianMgOj0gaW5pdC5vCkBAIC0xNywzICsxNyw3IEBACiBvYmotJChDT05GSUdfSU5URUxfTUVJX01FKSArPSBtZWktbWUubwogbWVpLW1lLW9ianMgOj0gcGNpLW1lLm8KIG1laS1tZS1vYmpzICs9IGh3LW1lLm8KKworb2JqLSQoQ09ORklHX0lOVEVMX01FSV9UWEUpICs9IG1laS10eGUubworbWVpLXR4ZS1vYmpzIDo9IHBjaS10eGUubworbWVpLXR4ZS1vYmpzICs9IGh3LXR4ZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jIGIvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYwppbmRleCAyZmFkODQ0Li5iOGRlYjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0zNSw3ICszNCw2IEBACiAKICNpbmNsdWRlICJtZWlfZGV2LmgiCiAjaW5jbHVkZSAiaGJtLmgiCi0jaW5jbHVkZSAiaHctbWUuaCIKICNpbmNsdWRlICJjbGllbnQuaCIKIAogY29uc3QgdXVpZF9sZSBtZWlfYW10aGlmX2d1aWQgID0gVVVJRF9MRSgweDEyZjgwMDI4LCAweGI0YjcsIDB4NGIyZCwKQEAgLTc5LDEwICs3Nyw5IEBACiAKIAlpID0gbWVpX21lX2NsX2J5X3V1aWQoZGV2LCAmbWVpX2FtdGhpZl9ndWlkKTsKIAlpZiAoaSA8IDApIHsKLQkJcmV0ID0gaTsKIAkJZGV2X2luZm8oJmRldi0+cGRldi0+ZGV2LAotCQkJImFtdGhpZjogZmFpbGVkIHRvIGZpbmQgdGhlIGNsaWVudCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJCSJhbXRoaWY6IGZhaWxlZCB0byBmaW5kIHRoZSBjbGllbnQgJWRcbiIsIGkpOworCQlyZXR1cm4gLUVOT1RUWTsKIAl9CiAKIAljbC0+bWVfY2xpZW50X2lkID0gZGV2LT5tZV9jbGllbnRzW2ldLmNsaWVudF9pZDsKQEAgLTExNiwxNCArMTEzLDExIEBACiAKIAljbC0+c3RhdGUgPSBNRUlfRklMRV9DT05ORUNUSU5HOwogCi0JaWYgKG1laV9oYm1fY2xfY29ubmVjdF9yZXEoZGV2LCBjbCkpIHsKLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJhbXRoaWY6IEZhaWxlZCB0byBjb25uZWN0IHRvIE1FIGNsaWVudFxuIik7Ci0JCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKLQkJY2wtPmhvc3RfY2xpZW50X2lkID0gMDsKLQl9IGVsc2UgewotCQljbC0+dGltZXJfY291bnQgPSBNRUlfQ09OTkVDVF9USU1FT1VUOwotCX0KLQlyZXR1cm4gMDsKKwlyZXQgPSBtZWlfY2xfY29ubmVjdChjbCwgTlVMTCk7CisKKwlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMzcsMTQgKzEzMSwxMiBAQAogc3RydWN0IG1laV9jbF9jYiAqbWVpX2FtdGhpZl9maW5kX3JlYWRfbGlzdF9lbnRyeShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkJCQkJc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IG1laV9jbF9jYiAqcG9zID0gTlVMTDsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG5leHQsCi0JCQkJJmRldi0+YW10aGlmX3JkX2NvbXBsZXRlX2xpc3QubGlzdCwgbGlzdCkgewotCQlpZiAocG9zLT5jbCAmJiBwb3MtPmNsID09ICZkZXYtPmlhbXRoaWZfY2wgJiYKLQkJCXBvcy0+ZmlsZV9vYmplY3QgPT0gZmlsZSkKLQkJCXJldHVybiBwb3M7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmRldi0+YW10aGlmX3JkX2NvbXBsZXRlX2xpc3QubGlzdCwgbGlzdCkgeworCQlpZiAoY2ItPmNsICYmIGNiLT5jbCA9PSAmZGV2LT5pYW10aGlmX2NsICYmCisJCQljYi0+ZmlsZV9vYmplY3QgPT0gZmlsZSkKKwkJCXJldHVybiBjYjsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xODAsMTQgKzE3MiwxMyBAQAogCS8qIE9ubHkgcG9zc2libGUgaWYgd2UgYXJlIGluIHRpbWVvdXQgKi8KIAlpZiAoIWNsIHx8IGNsICE9ICZkZXYtPmlhbXRoaWZfY2wpIHsKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJiYWQgZmlsZSBleHQuXG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldHVybiAtRVRJTUU7CiAJfQogCiAJaSA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGRldi0+aWFtdGhpZl9jbC5tZV9jbGllbnRfaWQpOwotCiAJaWYgKGkgPCAwKSB7CiAJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiYW10aGlmIGNsaWVudCBub3QgZm91bmQuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRU5PVFRZOwogCX0KIAlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImNoZWNraW5nIGFtdGhpZiBkYXRhXG4iKTsKIAljYiA9IG1laV9hbXRoaWZfZmluZF9yZWFkX2xpc3RfZW50cnkoZGV2LCBmaWxlKTsKQEAgLTIyOCw3ICsyMTksNyBAQAogCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJhbXRoaWYgVGltZSBvdXRcbiIpOwogCQkJLyogMTUgc2VjIGZvciB0aGUgbWVzc2FnZSBoYXMgZXhwaXJlZCAqLwogCQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKLQkJCXJldHMgPSAtRVRJTUVET1VUOworCQkJcmV0cyA9IC1FVElNRTsKIAkJCWdvdG8gZnJlZTsKIAkJfQogCX0KQEAgLTI1Myw5ICsyNDQsMTAgQEAKIAkgKiB0aGUgYnVmX2lkeCBtYXkgcG9pbnQgYmV5b25kICovCiAJbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBsZW5ndGgsIChjYi0+YnVmX2lkeCAtICpvZmZzZXQpKTsKIAotCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgY2ItPnJlc3BvbnNlX2J1ZmZlci5kYXRhICsgKm9mZnNldCwgbGVuZ3RoKSkKKwlpZiAoY29weV90b191c2VyKHVidWYsIGNiLT5yZXNwb25zZV9idWZmZXIuZGF0YSArICpvZmZzZXQsIGxlbmd0aCkpIHsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIHRvIHVzZXJsYW5kXG4iKTsKIAkJcmV0cyA9IC1FRkFVTFQ7Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJcmV0cyA9IGxlbmd0aDsKIAkJaWYgKCgqb2Zmc2V0ICsgbGVuZ3RoKSA8IGNiLT5idWZfaWR4KSB7CiAJCQkqb2Zmc2V0ICs9IGxlbmd0aDsKQEAgLTMwMiw5ICsyOTQsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHJldCAmJiBkZXYtPmhidWZfaXNfcmVhZHkpIHsKKwlpZiAocmV0ICYmIG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgewogCQlyZXQgPSAwOwotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKIAkJaWYgKGNiLT5yZXF1ZXN0X2J1ZmZlci5zaXplID4gbWVpX2hidWZfbWF4X2xlbihkZXYpKSB7CiAJCQltZWlfaGRyLmxlbmd0aCA9IG1laV9oYnVmX21heF9sZW4oZGV2KTsKIAkJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMDsKQEAgLTMzNiwxMCArMzI3LDYgQEAKIAkJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT53cml0ZV9saXN0Lmxpc3QpOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKCFkZXYtPmhidWZfaXNfcmVhZHkpCi0JCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhvc3QgYnVmZmVyIGlzIG5vdCBlbXB0eSIpOwotCi0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiTm8gZmxvdyBjb250cm9sIGNyZWRlbnRpYWxzLCBzbyBhZGQgaWFtdGhpZiBjYiB0byB3cml0ZSBsaXN0LlxuIik7CiAJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT53cml0ZV9saXN0Lmxpc3QpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTM2NSw3ICszNTIsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX0lPQ1RMOworCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfV1JJVEU7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmRldi0+YW10aGlmX2NtZF9saXN0Lmxpc3QpIHx8CiAJICAgIGRldi0+aWFtdGhpZl9zdGF0ZSAhPSBNRUlfSUFNVEhJRl9JRExFKSB7CkBAIC00NDcsMjMgKzQzNCwyMyBAQAogCiAKIC8qKgotICogbWVpX2FtdGhpZl9pcnFfd3JpdGVfY29tcGxldGVkIC0gcHJvY2Vzc2VzIGNvbXBsZXRlZCBpYW10aGlmIG9wZXJhdGlvbi4KKyAqIG1laV9hbXRoaWZfaXJxX3dyaXRlIC0gd3JpdGUgaWFtdGhpZiBjb21tYW5kIGluIGlycSB0aHJlYWQgY29udGV4dC4KICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KLSAqIEBzbG90czogZnJlZSBzbG90cy4KICAqIEBjYl9wb3M6IGNhbGxiYWNrIGJsb2NrLgogICogQGNsOiBwcml2YXRlIGRhdGEgb2YgdGhlIGZpbGUgb2JqZWN0LgogICogQGNtcGxfbGlzdDogY29tcGxldGUgbGlzdC4KICAqCiAgKiByZXR1cm5zIDAsIE9LOyBvdGhlcndpc2UsIGVycm9yLgogICovCi1pbnQgbWVpX2FtdGhpZl9pcnFfd3JpdGVfY29tcGxldGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJCSAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQoraW50IG1laV9hbXRoaWZfaXJxX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKKwkJCSBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CiAJc3RydWN0IG1laV9tc2dfaGRyIG1laV9oZHI7CiAJc2l6ZV90IGxlbiA9IGRldi0+aWFtdGhpZl9tc2dfYnVmX3NpemUgLSBkZXYtPmlhbXRoaWZfbXNnX2J1Zl9pbmRleDsKIAl1MzIgbXNnX3Nsb3RzID0gbWVpX2RhdGEyc2xvdHMobGVuKTsKKwlpbnQgc2xvdHM7CiAJaW50IHJldHM7CiAKIAlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhjbCk7CkBAIC00ODAsMTMgKzQ2NywxNSBAQAogCW1laV9oZHIucmVzZXJ2ZWQgPSAwOwogCW1laV9oZHIuaW50ZXJuYWwgPSAwOwogCi0JaWYgKCpzbG90cyA+PSBtc2dfc2xvdHMpIHsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CisKKwlpZiAoc2xvdHMgPj0gbXNnX3Nsb3RzKSB7CiAJCW1laV9oZHIubGVuZ3RoID0gbGVuOwogCQltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDE7CiAJLyogU3BsaXQgdGhlIG1lc3NhZ2Ugb25seSBpZiB3ZSBjYW4gd3JpdGUgdGhlIHdob2xlIGhvc3QgYnVmZmVyICovCi0JfSBlbHNlIGlmICgqc2xvdHMgPT0gZGV2LT5oYnVmX2RlcHRoKSB7Ci0JCW1zZ19zbG90cyA9ICpzbG90czsKLQkJbGVuID0gKCpzbG90cyAqIHNpemVvZih1MzIpKSAtIHNpemVvZihzdHJ1Y3QgbWVpX21zZ19oZHIpOworCX0gZWxzZSBpZiAoc2xvdHMgPT0gZGV2LT5oYnVmX2RlcHRoKSB7CisJCW1zZ19zbG90cyA9IHNsb3RzOworCQlsZW4gPSAoc2xvdHMgKiBzaXplb2YodTMyKSkgLSBzaXplb2Yoc3RydWN0IG1laV9tc2dfaGRyKTsKIAkJbWVpX2hkci5sZW5ndGggPSBsZW47CiAJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMDsKIAl9IGVsc2UgewpAQCAtNDk2LDcgKzQ4NSw2IEBACiAKIAlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgTUVJX0hEUl9GTVQsICBNRUlfSERSX1BSTSgmbWVpX2hkcikpOwogCi0JKnNsb3RzIC09ICBtc2dfc2xvdHM7CiAJcmV0cyA9IG1laV93cml0ZV9tZXNzYWdlKGRldiwgJm1laV9oZHIsCiAJCQlkZXYtPmlhbXRoaWZfbXNnX2J1ZiArIGRldi0+aWFtdGhpZl9tc2dfYnVmX2luZGV4KTsKIAlpZiAocmV0cykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9idXMuYyBiL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMKaW5kZXggNGJjN2Q2Mi4uZGRjNWFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9idXMuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2J1cy5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbWVpX2NsX2J1cy5oPgogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgotI2luY2x1ZGUgImh3LW1lLmgiCiAjaW5jbHVkZSAiY2xpZW50LmgiCiAKICNkZWZpbmUgdG9fbWVpX2NsX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG1laV9jbF9kcml2ZXIsIGRyaXZlcikKQEAgLTE0NSw5ICsxNDQsOSBAQAogc3RhdGljIHN0cnVjdCBtZWlfY2wgKm1laV9idXNfZmluZF9tZWlfY2xfYnlfdXVpZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkJCQkJdXVpZF9sZSB1dWlkKQogewotCXN0cnVjdCBtZWlfY2wgKmNsLCAqbmV4dDsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZGV2aWNlX2xpc3QsIGRldmljZV9saW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZGV2aWNlX2xpc3QsIGRldmljZV9saW5rKSB7CiAJCWlmICghdXVpZF9sZV9jbXAodXVpZCwgY2wtPmRldmljZV91dWlkKSkKIAkJCXJldHVybiBjbDsKIAl9CkBAIC01MjQsNiArNTIzLDIyIEBACiAJc2NoZWR1bGVfd29yaygmZGV2aWNlLT5ldmVudF93b3JrKTsKIH0KIAordm9pZCBtZWlfY2xfYnVzX3JlbW92ZV9kZXZpY2VzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV9jbCAqY2wsICpuZXh0OworCisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5kZXZpY2VfbGlzdCwgZGV2aWNlX2xpbmspIHsKKwkJaWYgKGNsLT5kZXZpY2UpCisJCQltZWlfY2xfcmVtb3ZlX2RldmljZShjbC0+ZGV2aWNlKTsKKworCQlsaXN0X2RlbCgmY2wtPmRldmljZV9saW5rKTsKKwkJbWVpX2NsX3VubGluayhjbCk7CisJCWtmcmVlKGNsKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKK30KKwogaW50IF9faW5pdCBtZWlfY2xfYnVzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZtZWlfY2xfYnVzX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuYyBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmMKaW5kZXggODlhNTU3OS4uOGMwNzhiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jCkBAIC0yOSwyMCArMjksMjEgQEAKICAqIG1laV9tZV9jbF9ieV91dWlkIC0gbG9jYXRlIGluZGV4IG9mIG1lIGNsaWVudAogICoKICAqIEBkZXY6IG1laSBkZXZpY2UKKyAqCisgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKKyAqCiAgKiByZXR1cm5zIG1lIGNsaWVudCBpbmRleCBvciAtRU5PRU5UIGlmIG5vdCBmb3VuZAogICovCiBpbnQgbWVpX21lX2NsX2J5X3V1aWQoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldiwgY29uc3QgdXVpZF9sZSAqdXVpZCkKIHsKLQlpbnQgaSwgcmVzID0gLUVOT0VOVDsKKwlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyArK2kpCiAJCWlmICh1dWlkX2xlX2NtcCgqdXVpZCwKLQkJCQlkZXYtPm1lX2NsaWVudHNbaV0ucHJvcHMucHJvdG9jb2xfbmFtZSkgPT0gMCkgewotCQkJcmVzID0gaTsKLQkJCWJyZWFrOwotCQl9CisJCQkJZGV2LT5tZV9jbGllbnRzW2ldLnByb3BzLnByb3RvY29sX25hbWUpID09IDApCisJCQlyZXR1cm4gaTsKIAotCXJldHVybiByZXM7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIApAQCAtNjAsMzQgKzYxLDc2IEBACiBpbnQgbWVpX21lX2NsX2J5X2lkKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHU4IGNsaWVudF9pZCkKIHsKIAlpbnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyBpKyspCiAJCWlmIChkZXYtPm1lX2NsaWVudHNbaV0uY2xpZW50X2lkID09IGNsaWVudF9pZCkKLQkJCWJyZWFrOwotCWlmIChXQVJOX09OKGRldi0+bWVfY2xpZW50c1tpXS5jbGllbnRfaWQgIT0gY2xpZW50X2lkKSkKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCQlyZXR1cm4gaTsKIAotCWlmIChpID09IGRldi0+bWVfY2xpZW50c19udW0pCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0dXJuIGk7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIAogLyoqCisgKiBtZWlfY2xfY21wX2lkIC0gdGVsbHMgaWYgdGhlIGNsaWVudHMgYXJlIHRoZSBzYW1lCisgKgorICogQGNsMTogaG9zdCBjbGllbnQgMQorICogQGNsMjogaG9zdCBjbGllbnQgMgorICoKKyAqIHJldHVybnMgdHJ1ZSAgLSBpZiB0aGUgY2xpZW50cyBoYXMgc2FtZSBob3N0IGFuZCBtZSBpZHMKKyAqICAgICAgICAgZmFsc2UgLSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIG1laV9jbF9jbXBfaWQoY29uc3Qgc3RydWN0IG1laV9jbCAqY2wxLAorCQkJCWNvbnN0IHN0cnVjdCBtZWlfY2wgKmNsMikKK3sKKwlyZXR1cm4gY2wxICYmIGNsMiAmJgorCQkoY2wxLT5ob3N0X2NsaWVudF9pZCA9PSBjbDItPmhvc3RfY2xpZW50X2lkKSAmJgorCQkoY2wxLT5tZV9jbGllbnRfaWQgPT0gY2wyLT5tZV9jbGllbnRfaWQpOworfQorCisvKioKKyAqIG1laV9pb19saXN0X2ZsdXNoIC0gcmVtb3ZlcyBjYnMgYmVsb25naW5nIHRvIGNsLgorICoKKyAqIEBsaXN0OiAgYW4gaW5zdGFuY2Ugb2Ygb3VyIGxpc3Qgc3RydWN0dXJlCisgKiBAY2w6ICAgIGhvc3QgY2xpZW50LCBjYW4gYmUgTlVMTCBmb3IgZmx1c2hpbmcgdGhlIHdob2xlIGxpc3QKKyAqIEBmcmVlOiAgd2hldGhlciB0byBmcmVlIHRoZSBjYnMKKyAqLworc3RhdGljIHZvaWQgX19tZWlfaW9fbGlzdF9mbHVzaChzdHJ1Y3QgbWVpX2NsX2NiICpsaXN0LAorCQkJCXN0cnVjdCBtZWlfY2wgKmNsLCBib29sIGZyZWUpCit7CisJc3RydWN0IG1laV9jbF9jYiAqY2I7CisJc3RydWN0IG1laV9jbF9jYiAqbmV4dDsKKworCS8qIGVuYWJsZSByZW1vdmluZyBldmVyeXRoaW5nIGlmIG5vIGNsIGlzIHNwZWNpZmllZCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgJmxpc3QtPmxpc3QsIGxpc3QpIHsKKwkJaWYgKCFjbCB8fCAoY2ItPmNsICYmIG1laV9jbF9jbXBfaWQoY2wsIGNiLT5jbCkpKSB7CisJCQlsaXN0X2RlbCgmY2ItPmxpc3QpOworCQkJaWYgKGZyZWUpCisJCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOworCQl9CisJfQorfQorCisvKioKICAqIG1laV9pb19saXN0X2ZsdXNoIC0gcmVtb3ZlcyBsaXN0IGVudHJ5IGJlbG9uZ2luZyB0byBjbC4KICAqCiAgKiBAbGlzdDogIEFuIGluc3RhbmNlIG9mIG91ciBsaXN0IHN0cnVjdHVyZQogICogQGNsOiBob3N0IGNsaWVudAogICovCi12b2lkIG1laV9pb19saXN0X2ZsdXNoKHN0cnVjdCBtZWlfY2xfY2IgKmxpc3QsIHN0cnVjdCBtZWlfY2wgKmNsKQorc3RhdGljIGlubGluZSB2b2lkIG1laV9pb19saXN0X2ZsdXNoKHN0cnVjdCBtZWlfY2xfY2IgKmxpc3QsIHN0cnVjdCBtZWlfY2wgKmNsKQogewotCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCXN0cnVjdCBtZWlfY2xfY2IgKm5leHQ7CisJX19tZWlfaW9fbGlzdF9mbHVzaChsaXN0LCBjbCwgZmFsc2UpOworfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCAmbGlzdC0+bGlzdCwgbGlzdCkgewotCQlpZiAoY2ItPmNsICYmIG1laV9jbF9jbXBfaWQoY2wsIGNiLT5jbCkpCi0JCQlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCX0KKworLyoqCisgKiBtZWlfaW9fbGlzdF9mcmVlIC0gcmVtb3ZlcyBjYiBiZWxvbmdpbmcgdG8gY2wgYW5kIGZyZWUgdGhlbQorICoKKyAqIEBsaXN0OiAgQW4gaW5zdGFuY2Ugb2Ygb3VyIGxpc3Qgc3RydWN0dXJlCisgKiBAY2w6IGhvc3QgY2xpZW50CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfaW9fbGlzdF9mcmVlKHN0cnVjdCBtZWlfY2xfY2IgKmxpc3QsIHN0cnVjdCBtZWlfY2wgKmNsKQoreworCV9fbWVpX2lvX2xpc3RfZmx1c2gobGlzdCwgY2wsIHRydWUpOwogfQogCiAvKioKQEAgLTE5Niw4ICsyMzksOCBAQAogCiAJY2xfZGJnKGRldiwgY2wsICJyZW1vdmUgbGlzdCBlbnRyeSBiZWxvbmdpbmcgdG8gY2xcbiIpOwogCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT5yZWFkX2xpc3QsIGNsKTsKLQltZWlfaW9fbGlzdF9mbHVzaCgmY2wtPmRldi0+d3JpdGVfbGlzdCwgY2wpOwotCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT53cml0ZV93YWl0aW5nX2xpc3QsIGNsKTsKKwltZWlfaW9fbGlzdF9mcmVlKCZjbC0+ZGV2LT53cml0ZV9saXN0LCBjbCk7CisJbWVpX2lvX2xpc3RfZnJlZSgmY2wtPmRldi0+d3JpdGVfd2FpdGluZ19saXN0LCBjbCk7CiAJbWVpX2lvX2xpc3RfZmx1c2goJmNsLT5kZXYtPmN0cmxfd3JfbGlzdCwgY2wpOwogCW1laV9pb19saXN0X2ZsdXNoKCZjbC0+ZGV2LT5jdHJsX3JkX2xpc3QsIGNsKTsKIAltZWlfaW9fbGlzdF9mbHVzaCgmY2wtPmRldi0+YW10aGlmX2NtZF9saXN0LCBjbCk7CkBAIC0yNTQsMTAgKzI5Nyw5IEBACiBzdHJ1Y3QgbWVpX2NsX2NiICptZWlfY2xfZmluZF9yZWFkX2NiKHN0cnVjdCBtZWlfY2wgKmNsKQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwotCXN0cnVjdCBtZWlfY2xfY2IgKmNiID0gTlVMTDsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgJmRldi0+cmVhZF9saXN0Lmxpc3QsIGxpc3QpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmRldi0+cmVhZF9saXN0Lmxpc3QsIGxpc3QpCiAJCWlmIChtZWlfY2xfY21wX2lkKGNsLCBjYi0+Y2wpKQogCQkJcmV0dXJuIGNiOwogCXJldHVybiBOVUxMOwpAQCAtMzc1LDYgKzQxNywyMyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiB9CiAKKy8qKgorICogbWVpX2hidWZfYWNxdWlyZTogdHJ5IHRvIGFjcXVpcmUgaG9zdCBidWZmZXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogcmV0dXJucyB0cnVlIGlmIGhvc3QgYnVmZmVyIHdhcyBhY3F1aXJlZAorICovCitib29sIG1laV9oYnVmX2FjcXVpcmUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlpZiAoIWRldi0+aGJ1Zl9pc19yZWFkeSkgeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhidWYgaXMgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CiAKIC8qKgogICogbWVpX2NsX2Rpc2Nvbm5lY3QgLSBkaXNjb25uZWN0IGhvc3QgY2xpZW50IGZyb20gdGhlIG1lIG9uZQpAQCAtNDA2LDggKzQ2NSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY2ItPmZvcF90eXBlID0gTUVJX0ZPUF9DTE9TRTsKLQlpZiAoZGV2LT5oYnVmX2lzX3JlYWR5KSB7Ci0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOworCWlmIChtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJaWYgKG1laV9oYm1fY2xfZGlzY29ubmVjdF9yZXEoZGV2LCBjbCkpIHsKIAkJCXJldHMgPSAtRU5PREVWOwogCQkJY2xfZXJyKGRldiwgY2wsICJmYWlsZWQgdG8gZGlzY29ubmVjdC5cbiIpOwpAQCAtNDYxLDE3ICs1MTksMTcgQEAKIGJvb2wgbWVpX2NsX2lzX290aGVyX2Nvbm5lY3Rpbmcoc3RydWN0IG1laV9jbCAqY2wpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbWVpX2NsICpwb3M7Ci0Jc3RydWN0IG1laV9jbCAqbmV4dDsKKwlzdHJ1Y3QgbWVpX2NsICpvY2w7IC8qIHRoZSBvdGhlciBjbGllbnQgKi8KIAogCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCiAJCXJldHVybiBmYWxzZTsKIAogCWRldiA9IGNsLT5kZXY7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKLQkJaWYgKChwb3MtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RJTkcpICYmCi0JCSAgICAocG9zICE9IGNsKSAmJiBjbC0+bWVfY2xpZW50X2lkID09IHBvcy0+bWVfY2xpZW50X2lkKQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2NsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwkJaWYgKG9jbC0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVElORyAmJgorCQkgICAgb2NsICE9IGNsICYmCisJCSAgICBjbC0+bWVfY2xpZW50X2lkID09IG9jbC0+bWVfY2xpZW50X2lkKQogCQkJcmV0dXJuIHRydWU7CiAKIAl9CkBAIC01MDUsMTEgKzU2MywxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX0lPQ1RMOworCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfQ09OTkVDVDsKIAotCWlmIChkZXYtPmhidWZfaXNfcmVhZHkgJiYgIW1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKGNsKSkgewotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKLQorCS8qIHJ1biBoYnVmIGFjcXVpcmUgbGFzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIHVuZG8gKi8KKwlpZiAoIW1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKGNsKSAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJaWYgKG1laV9oYm1fY2xfY29ubmVjdF9yZXEoZGV2LCBjbCkpIHsKIAkJCXJldHMgPSAtRU5PREVWOwogCQkJZ290byBvdXQ7CkBAIC01MjEsMTggKzU3OCwxOSBAQAogCX0KIAogCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0JcmV0cyA9IHdhaXRfZXZlbnRfdGltZW91dChkZXYtPndhaXRfcmVjdmRfbXNnLAotCQkJCSAoY2wtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RFRCB8fAotCQkJCSAgY2wtPnN0YXRlID09IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRCksCi0JCQkJIG1laV9zZWNzX3RvX2ppZmZpZXMoTUVJX0NMX0NPTk5FQ1RfVElNRU9VVCkpOworCXdhaXRfZXZlbnRfdGltZW91dChkZXYtPndhaXRfcmVjdmRfbXNnLAorCQkJKGNsLT5zdGF0ZSA9PSBNRUlfRklMRV9DT05ORUNURUQgfHwKKwkJCSBjbC0+c3RhdGUgPT0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEKSwKKwkJCW1laV9zZWNzX3RvX2ppZmZpZXMoTUVJX0NMX0NPTk5FQ1RfVElNRU9VVCkpOwogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJaWYgKGNsLT5zdGF0ZSAhPSBNRUlfRklMRV9DT05ORUNURUQpIHsKLQkJcmV0cyA9IC1FRkFVTFQ7CisJCS8qIHNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZyAqLworCQlpZiAoIWNsLT5zdGF0dXMpCisJCQljbC0+c3RhdHVzID0gLUVGQVVMVDsKIAogCQltZWlfaW9fbGlzdF9mbHVzaCgmZGV2LT5jdHJsX3JkX2xpc3QsIGNsKTsKIAkJbWVpX2lvX2xpc3RfZmx1c2goJmRldi0+Y3RybF93cl9saXN0LCBjbCk7Ci0JCWdvdG8gb3V0OwogCX0KIAogCXJldHMgPSBjbC0+c3RhdHVzOwpAQCAtNTU0LDcgKzYxMiw4IEBACiBpbnQgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwotCWludCBpOworCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbDsKKwlpbnQgaWQ7CiAKIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU2NywxOSArNjI2LDE5IEBACiAJaWYgKGNsLT5tZWlfZmxvd19jdHJsX2NyZWRzID4gMCkKIAkJcmV0dXJuIDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tZV9jbGllbnRzX251bTsgaSsrKSB7Ci0JCXN0cnVjdCBtZWlfbWVfY2xpZW50ICAqbWVfY2wgPSAmZGV2LT5tZV9jbGllbnRzW2ldOwotCQlpZiAobWVfY2wtPmNsaWVudF9pZCA9PSBjbC0+bWVfY2xpZW50X2lkKSB7Ci0JCQlpZiAobWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMpIHsKLQkJCQlpZiAoV0FSTl9PTihtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmID09IDApKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KKwlpZCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGNsLT5tZV9jbGllbnRfaWQpOworCWlmIChpZCA8IDApIHsKKwkJY2xfZXJyKGRldiwgY2wsICJubyBzdWNoIG1lIGNsaWVudCAlZFxuIiwgY2wtPm1lX2NsaWVudF9pZCk7CisJCXJldHVybiBpZDsKIAl9Ci0JcmV0dXJuIC1FTk9FTlQ7CisKKwltZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaWRdOworCWlmIChtZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcykgeworCQlpZiAoV0FSTl9PTihtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmID09IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC01OTUsMzIgKzY1NCwzMSBAQAogaW50IG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKHN0cnVjdCBtZWlfY2wgKmNsKQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7Ci0JaW50IGk7CisJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOworCWludCBpZDsKIAogCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGV2ID0gY2wtPmRldjsKIAotCWlmICghZGV2LT5tZV9jbGllbnRzX251bSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tZV9jbGllbnRzX251bTsgaSsrKSB7Ci0JCXN0cnVjdCBtZWlfbWVfY2xpZW50ICAqbWVfY2wgPSAmZGV2LT5tZV9jbGllbnRzW2ldOwotCQlpZiAobWVfY2wtPmNsaWVudF9pZCA9PSBjbC0+bWVfY2xpZW50X2lkKSB7Ci0JCQlpZiAobWVfY2wtPnByb3BzLnNpbmdsZV9yZWN2X2J1ZiAhPSAwKSB7Ci0JCQkJaWYgKFdBUk5fT04obWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPD0gMCkpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWRldi0+bWVfY2xpZW50c1tpXS5tZWlfZmxvd19jdHJsX2NyZWRzLS07Ci0JCQl9IGVsc2UgewotCQkJCWlmIChXQVJOX09OKGNsLT5tZWlfZmxvd19jdHJsX2NyZWRzIDw9IDApKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KKwlpZCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGNsLT5tZV9jbGllbnRfaWQpOworCWlmIChpZCA8IDApIHsKKwkJY2xfZXJyKGRldiwgY2wsICJubyBzdWNoIG1lIGNsaWVudCAlZFxuIiwgY2wtPm1lX2NsaWVudF9pZCk7CisJCXJldHVybiBpZDsKIAl9Ci0JcmV0dXJuIC1FTk9FTlQ7CisKKwltZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaWRdOworCWlmIChtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmICE9IDApIHsKKwkJaWYgKFdBUk5fT04obWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPD0gMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMtLTsKKwl9IGVsc2UgeworCQlpZiAoV0FSTl9PTihjbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA8PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC02NTIsNyArNzEwLDcgQEAKIAlpID0gbWVpX21lX2NsX2J5X2lkKGRldiwgY2wtPm1lX2NsaWVudF9pZCk7CiAJaWYgKGkgPCAwKSB7CiAJCWNsX2VycihkZXYsIGNsLCAibm8gc3VjaCBtZSBjbGllbnQgJWRcbiIsIGNsLT5tZV9jbGllbnRfaWQpOwotCQlyZXR1cm4gIC1FTk9ERVY7CisJCXJldHVybiAgLUVOT1RUWTsKIAl9CiAKIAljYiA9IG1laV9pb19jYl9pbml0KGNsLCBOVUxMKTsKQEAgLTY2Niw4ICs3MjQsNyBAQAogCQlnb3RvIGVycjsKIAogCWNiLT5mb3BfdHlwZSA9IE1FSV9GT1BfUkVBRDsKLQlpZiAoZGV2LT5oYnVmX2lzX3JlYWR5KSB7Ci0JCWRldi0+aGJ1Zl9pc19yZWFkeSA9IGZhbHNlOworCWlmIChtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJaWYgKG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKSkgewogCQkJY2xfZXJyKGRldiwgY2wsICJmbG93IGNvbnRyb2wgc2VuZCBmYWlsZWRcbiIpOwogCQkJcmV0cyA9IC1FTk9ERVY7CkBAIC02ODcsMjcgKzc0NCwyNiBAQAogfQogCiAvKioKLSAqIG1laV9jbF9pcnFfd3JpdGVfY29tcGxldGUgLSB3cml0ZSBhIG1lc3NhZ2UgdG8gZGV2aWNlCisgKiBtZWlfY2xfaXJxX3dyaXRlIC0gd3JpdGUgYSBtZXNzYWdlIHRvIGRldmljZQogICoJZnJvbSB0aGUgaW50ZXJydXB0IHRocmVhZCBjb250ZXh0CiAgKgogICogQGNsOiBjbGllbnQKICAqIEBjYjogY2FsbGJhY2sgYmxvY2suCi0gKiBAc2xvdHM6IGZyZWUgc2xvdHMuCiAgKiBAY21wbF9saXN0OiBjb21wbGV0ZSBsaXN0LgogICoKICAqIHJldHVybnMgMCwgT0s7IG90aGVyd2lzZSBlcnJvci4KICAqLwotaW50IG1laV9jbF9pcnFfd3JpdGVfY29tcGxldGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJCSAgICAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQoraW50IG1laV9jbF9pcnFfd3JpdGUoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAorCQkgICAgIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwogCXN0cnVjdCBtZWlfbXNnX2RhdGEgKmJ1ZjsKIAlzdHJ1Y3QgbWVpX21zZ19oZHIgbWVpX2hkcjsKIAlzaXplX3QgbGVuOwogCXUzMiBtc2dfc2xvdHM7CisJaW50IHNsb3RzOwogCWludCByZXRzOwogCi0KIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5kZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtNzI0LDYgKzc4MCw3IEBACiAJCXJldHVybiAwOwogCX0KIAorCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKIAlsZW4gPSBidWYtPnNpemUgLSBjYi0+YnVmX2lkeDsKIAltc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhsZW4pOwogCkBAIC03MzIsMTMgKzc4OSwxMyBAQAogCW1laV9oZHIucmVzZXJ2ZWQgPSAwOwogCW1laV9oZHIuaW50ZXJuYWwgPSBjYi0+aW50ZXJuYWw7CiAKLQlpZiAoKnNsb3RzID49IG1zZ19zbG90cykgeworCWlmIChzbG90cyA+PSBtc2dfc2xvdHMpIHsKIAkJbWVpX2hkci5sZW5ndGggPSBsZW47CiAJCW1laV9oZHIubXNnX2NvbXBsZXRlID0gMTsKIAkvKiBTcGxpdCB0aGUgbWVzc2FnZSBvbmx5IGlmIHdlIGNhbiB3cml0ZSB0aGUgd2hvbGUgaG9zdCBidWZmZXIgKi8KLQl9IGVsc2UgaWYgKCpzbG90cyA9PSBkZXYtPmhidWZfZGVwdGgpIHsKLQkJbXNnX3Nsb3RzID0gKnNsb3RzOwotCQlsZW4gPSAoKnNsb3RzICogc2l6ZW9mKHUzMikpIC0gc2l6ZW9mKHN0cnVjdCBtZWlfbXNnX2hkcik7CisJfSBlbHNlIGlmIChzbG90cyA9PSBkZXYtPmhidWZfZGVwdGgpIHsKKwkJbXNnX3Nsb3RzID0gc2xvdHM7CisJCWxlbiA9IChzbG90cyAqIHNpemVvZih1MzIpKSAtIHNpemVvZihzdHJ1Y3QgbWVpX21zZ19oZHIpOwogCQltZWlfaGRyLmxlbmd0aCA9IGxlbjsKIAkJbWVpX2hkci5tc2dfY29tcGxldGUgPSAwOwogCX0gZWxzZSB7CkBAIC03NDksNyArODA2LDYgQEAKIAljbF9kYmcoZGV2LCBjbCwgImJ1Zjogc2l6ZSA9ICVkIGlkeCA9ICVsdVxuIiwKIAkJCWNiLT5yZXF1ZXN0X2J1ZmZlci5zaXplLCBjYi0+YnVmX2lkeCk7CiAKLQkqc2xvdHMgLT0gIG1zZ19zbG90czsKIAlyZXRzID0gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmbWVpX2hkciwgYnVmLT5kYXRhICsgY2ItPmJ1Zl9pZHgpOwogCWlmIChyZXRzKSB7CiAJCWNsLT5zdGF0dXMgPSByZXRzOwpAQCAtODAyLDIxICs4NTgsMjkgQEAKIAogCiAJY2ItPmZvcF90eXBlID0gTUVJX0ZPUF9XUklURTsKKwljYi0+YnVmX2lkeCA9IDA7CisJY2wtPndyaXRpbmdfc3RhdGUgPSBNRUlfSURMRTsKKworCW1laV9oZHIuaG9zdF9hZGRyID0gY2wtPmhvc3RfY2xpZW50X2lkOworCW1laV9oZHIubWVfYWRkciA9IGNsLT5tZV9jbGllbnRfaWQ7CisJbWVpX2hkci5yZXNlcnZlZCA9IDA7CisJbWVpX2hkci5tc2dfY29tcGxldGUgPSAwOworCW1laV9oZHIuaW50ZXJuYWwgPSBjYi0+aW50ZXJuYWw7CiAKIAlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhjbCk7CiAJaWYgKHJldHMgPCAwKQogCQlnb3RvIGVycjsKIAotCS8qIEhvc3QgYnVmZmVyIGlzIG5vdCByZWFkeSwgd2UgcXVldWUgdGhlIHJlcXVlc3QgKi8KLQlpZiAocmV0cyA9PSAwIHx8ICFkZXYtPmhidWZfaXNfcmVhZHkpIHsKLQkJY2ItPmJ1Zl9pZHggPSAwOwotCQkvKiB1bnNldGluZyBjb21wbGV0ZSB3aWxsIGVucXVldWUgdGhlIGNiIGZvciB3cml0ZSAqLwotCQltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDA7CisJaWYgKHJldHMgPT0gMCkgeworCQljbF9kYmcoZGV2LCBjbCwgIk5vIGZsb3cgY29udHJvbCBjcmVkZW50aWFsczogbm90IHNlbmRpbmcuXG4iKTsKIAkJcmV0cyA9IGJ1Zi0+c2l6ZTsKIAkJZ290byBvdXQ7CiAJfQotCi0JZGV2LT5oYnVmX2lzX3JlYWR5ID0gZmFsc2U7CisJaWYgKCFtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKKwkJY2xfZGJnKGRldiwgY2wsICJDYW5ub3QgYWNxdWlyZSB0aGUgaG9zdCBidWZmZXI6IG5vdCBzZW5kaW5nLlxuIik7CisJCXJldHMgPSBidWYtPnNpemU7CisJCWdvdG8gb3V0OworCX0KIAogCS8qIENoZWNrIGZvciBhIG1heGltdW0gbGVuZ3RoICovCiAJaWYgKGJ1Zi0+c2l6ZSA+IG1laV9oYnVmX21heF9sZW4oZGV2KSkgewpAQCAtODI3LDEyICs4OTEsNiBAQAogCQltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDE7CiAJfQogCi0JbWVpX2hkci5ob3N0X2FkZHIgPSBjbC0+aG9zdF9jbGllbnRfaWQ7Ci0JbWVpX2hkci5tZV9hZGRyID0gY2wtPm1lX2NsaWVudF9pZDsKLQltZWlfaGRyLnJlc2VydmVkID0gMDsKLQltZWlfaGRyLmludGVybmFsID0gY2ItPmludGVybmFsOwotCi0KIAlyZXRzID0gbWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmbWVpX2hkciwgYnVmLT5kYXRhKTsKIAlpZiAocmV0cykKIAkJZ290byBlcnI7CkBAIC04NDAsMTMgKzg5OCwxMiBAQAogCWNsLT53cml0aW5nX3N0YXRlID0gTUVJX1dSSVRJTkc7CiAJY2ItPmJ1Zl9pZHggPSBtZWlfaGRyLmxlbmd0aDsKIAotCXJldHMgPSBidWYtPnNpemU7CiBvdXQ6CiAJaWYgKG1laV9oZHIubXNnX2NvbXBsZXRlKSB7Ci0JCWlmIChtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShjbCkpIHsKLQkJCXJldHMgPSAtRU5PREVWOworCQlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoY2wpOworCQlpZiAocmV0cyA8IDApCiAJCQlnb3RvIGVycjsKLQkJfQorCiAJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT53cml0ZV93YWl0aW5nX2xpc3QubGlzdCk7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPndyaXRlX2xpc3QubGlzdCk7CkBAIC04NTYsMTUgKzkxMywxOCBAQAogCWlmIChibG9ja2luZyAmJiBjbC0+d3JpdGluZ19zdGF0ZSAhPSBNRUlfV1JJVEVfQ09NUExFVEUpIHsKIAogCQltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwotCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNsLT50eF93YWl0LAotCQkJY2wtPndyaXRpbmdfc3RhdGUgPT0gTUVJX1dSSVRFX0NPTVBMRVRFKSkgewotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQkJcmV0cyA9IC1FSU5UUjsKLQkJCQllbHNlCi0JCQkJCXJldHMgPSAtRVJFU1RBUlRTWVM7Ci0JCX0KKwkJcmV0cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjbC0+dHhfd2FpdCwKKwkJCQljbC0+d3JpdGluZ19zdGF0ZSA9PSBNRUlfV1JJVEVfQ09NUExFVEUpOwogCQltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwkJLyogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIHJldHVybnMgLUVSRVNUQVJUU1lTICovCisJCWlmIChyZXRzKSB7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0cyA9IC1FSU5UUjsKKwkJCWdvdG8gZXJyOworCQl9CiAJfQorCisJcmV0cyA9IGJ1Zi0+c2l6ZTsKIGVycjoKIAlyZXR1cm4gcmV0czsKIH0KQEAgLTkwNSw5ICs5NjUsOSBAQAogCiB2b2lkIG1laV9jbF9hbGxfZGlzY29ubmVjdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtZWlfY2wgKmNsLCAqbmV4dDsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CiAJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKIAkJY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPSAwOwogCQljbC0+dGltZXJfY291bnQgPSAwOwpAQCAtOTIyLDggKzk4Miw4IEBACiAgKi8KIHZvaWQgbWVpX2NsX2FsbF93YWtldXAoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbWVpX2NsICpjbCwgKm5leHQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmNsLT5yeF93YWl0KSkgewogCQkJY2xfZGJnKGRldiwgY2wsICJXYWtpbmcgdXAgcmVhZGluZyBjbGllbnQhXG4iKTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOwpAQCAtOTQyLDIwICsxMDAyLDggQEAKICAqLwogdm9pZCBtZWlfY2xfYWxsX3dyaXRlX2NsZWFyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1laV9jbF9jYiAqY2IsICpuZXh0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0KLQlsaXN0ID0gJmRldi0+d3JpdGVfbGlzdC5saXN0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCQltZWlfaW9fY2JfZnJlZShjYik7Ci0JfQotCi0JbGlzdCA9ICZkZXYtPndyaXRlX3dhaXRpbmdfbGlzdC5saXN0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCQltZWlfaW9fY2JfZnJlZShjYik7Ci0JfQorCW1laV9pb19saXN0X2ZyZWUoJmRldi0+d3JpdGVfbGlzdCwgTlVMTCk7CisJbWVpX2lvX2xpc3RfZnJlZSgmZGV2LT53cml0ZV93YWl0aW5nX2xpc3QsIE5VTEwpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmggYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5oCmluZGV4IGM4Mzk2ZTUuLjk2ZDVkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuaApAQCAtNDUsOCArNDUsNiBAQAogewogCUlOSVRfTElTVF9IRUFEKCZsaXN0LT5saXN0KTsKIH0KLXZvaWQgbWVpX2lvX2xpc3RfZmx1c2goc3RydWN0IG1laV9jbF9jYiAqbGlzdCwgc3RydWN0IG1laV9jbCAqY2wpOwotCiAvKgogICogTUVJIEhvc3QgQ2xpZW50IEZ1bmN0aW9ucwogICovCkBAIC02MSwyMiArNTksNiBAQAogaW50IG1laV9jbF9mbHVzaF9xdWV1ZXMoc3RydWN0IG1laV9jbCAqY2wpOwogc3RydWN0IG1laV9jbF9jYiAqbWVpX2NsX2ZpbmRfcmVhZF9jYihzdHJ1Y3QgbWVpX2NsICpjbCk7CiAKLS8qKgotICogbWVpX2NsX2NtcF9pZCAtIHRlbGxzIGlmIGZpbGUgcHJpdmF0ZSBkYXRhIGhhdmUgc2FtZSBpZAotICoKLSAqIEBmZTE6IHByaXZhdGUgZGF0YSBvZiAxLiBmaWxlIG9iamVjdAotICogQGZlMjogcHJpdmF0ZSBkYXRhIG9mIDIuIGZpbGUgb2JqZWN0Ci0gKgotICogcmV0dXJucyB0cnVlICAtIGlmIGlkcyBhcmUgdGhlIHNhbWUgYW5kIG5vdCBOVUxMCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBtZWlfY2xfY21wX2lkKGNvbnN0IHN0cnVjdCBtZWlfY2wgKmNsMSwKLQkJCQljb25zdCBzdHJ1Y3QgbWVpX2NsICpjbDIpCi17Ci0JcmV0dXJuIGNsMSAmJiBjbDIgJiYKLQkJKGNsMS0+aG9zdF9jbGllbnRfaWQgPT0gY2wyLT5ob3N0X2NsaWVudF9pZCkgJiYKLQkJKGNsMS0+bWVfY2xpZW50X2lkID09IGNsMi0+bWVfY2xpZW50X2lkKTsKLX0KLQogCiBpbnQgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhzdHJ1Y3QgbWVpX2NsICpjbCk7CiAKQEAgLTg2LDE1ICs2OCwxNSBAQAogICovCiBzdGF0aWMgaW5saW5lIGJvb2wgbWVpX2NsX2lzX2Nvbm5lY3RlZChzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKLQlyZXR1cm4gKGNsLT5kZXYgJiYKKwlyZXR1cm4gIGNsLT5kZXYgJiYKIAkJY2wtPmRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRU5BQkxFRCAmJgotCQljbC0+c3RhdGUgPT0gTUVJX0ZJTEVfQ09OTkVDVEVEKTsKKwkJY2wtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RFRDsKIH0KIHN0YXRpYyBpbmxpbmUgYm9vbCBtZWlfY2xfaXNfdHJhbnNpdGlvbmluZyhzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKLQlyZXR1cm4gKE1FSV9GSUxFX0lOSVRJQUxJWklORyA9PSBjbC0+c3RhdGUgfHwKKwlyZXR1cm4gIE1FSV9GSUxFX0lOSVRJQUxJWklORyA9PSBjbC0+c3RhdGUgfHwKIAkJTUVJX0ZJTEVfRElTQ09OTkVDVEVEID09IGNsLT5zdGF0ZSB8fAotCQlNRUlfRklMRV9ESVNDT05ORUNUSU5HID09IGNsLT5zdGF0ZSk7CisJCU1FSV9GSUxFX0RJU0NPTk5FQ1RJTkcgPT0gY2wtPnN0YXRlOwogfQogCiBib29sIG1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKHN0cnVjdCBtZWlfY2wgKmNsKTsKQEAgLTEwMiw4ICs4NCw4IEBACiBpbnQgbWVpX2NsX2Nvbm5lY3Qoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBmaWxlICpmaWxlKTsKIGludCBtZWlfY2xfcmVhZF9zdGFydChzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCk7CiBpbnQgbWVpX2NsX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwgYm9vbCBibG9ja2luZyk7Ci1pbnQgbWVpX2NsX2lycV93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkJczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KTsKK2ludCBtZWlfY2xfaXJxX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKKwkJICAgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpOwogCiB2b2lkIG1laV9jbF9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2RlYnVnZnMuYyBiL2RyaXZlcnMvbWlzYy9tZWkvZGVidWdmcy5jCmluZGV4IGEzYWUxNTQuLmNlZDViNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvZGVidWdmcy5jCkBAIC03NSw2ICs3NSw1NCBAQAogCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAorc3RhdGljIHNzaXplX3QgbWVpX2RiZ2ZzX3JlYWRfYWN0aXZlKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gZnAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKKwljb25zdCBzaXplX3QgYnVmc3ogPSAxMDI0OworCWNoYXIgKmJ1ZjsKKwlpbnQgaSA9IDA7CisJaW50IHBvcyA9IDA7CisJaW50IHJldDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkiICB8bWV8aG9zdHxzdGF0ZXxyZHx3cnxcbiIpOworCisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisKKwkvKiAgaWYgdGhlIGRyaXZlciBpcyBub3QgZW5hYmxlZCB0aGUgbGlzdCB3b24ndCBiIGNvbnNpdGVudCAqLworCWlmIChkZXYtPmRldl9zdGF0ZSAhPSBNRUlfREVWX0VOQUJMRUQpCisJCWdvdG8gb3V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisKKwkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJIiUyZHwlMmR8JTRkfCU1ZHwlMmR8JTJkfFxuIiwKKwkJCWksIGNsLT5tZV9jbGllbnRfaWQsIGNsLT5ob3N0X2NsaWVudF9pZCwgY2wtPnN0YXRlLAorCQkJY2wtPnJlYWRpbmdfc3RhdGUsIGNsLT53cml0aW5nX3N0YXRlKTsKKwkJaSsrOworCX0KK291dDoKKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVpX2RiZ2ZzX2ZvcHNfYWN0aXZlID0geworCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLnJlYWQgPSBtZWlfZGJnZnNfcmVhZF9hY3RpdmUsCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCiBzdGF0aWMgc3NpemVfdCBtZWlfZGJnZnNfcmVhZF9kZXZzdGF0ZShzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICp1YnVmLAogCQkJCQlzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0xMjgsNiArMTc2LDEyIEBACiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAibWVjbGllbnRzOiByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQorCWYgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhY3RpdmUiLCBTX0lSVVNSLCBkaXIsCisJCQkJZGV2LCAmbWVpX2RiZ2ZzX2ZvcHNfYWN0aXZlKTsKKwlpZiAoIWYpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJtZWNsaWVudHM6IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CiAJZiA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRldnN0YXRlIiwgU19JUlVTUiwgZGlyLAogCQkJCWRldiwgJm1laV9kYmdmc19mb3BzX2RldnN0YXRlKTsKIAlpZiAoIWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMgYi9kcml2ZXJzL21pc2MvbWVpL2hibS5jCmluZGV4IDI4Y2Q3NGMuLjQ5NjAyODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9oYm0uYwpAQCAtMjEsNyArMjEsNDEgQEAKIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKLSNpbmNsdWRlICJody1tZS5oIgorI2luY2x1ZGUgImNsaWVudC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqbWVpX2NsX2Nvbm5fc3RhdHVzX3N0cihlbnVtIG1laV9jbF9jb25uZWN0X3N0YXR1cyBzdGF0dXMpCit7CisjZGVmaW5lIE1FSV9DTF9DUyhzdGF0dXMpIGNhc2UgTUVJX0NMX0NPTk5fIyNzdGF0dXM6IHJldHVybiAjc3RhdHVzCisJc3dpdGNoIChzdGF0dXMpIHsKKwlNRUlfQ0xfQ1MoU1VDQ0VTUyk7CisJTUVJX0NMX0NTKE5PVF9GT1VORCk7CisJTUVJX0NMX0NTKEFMUkVBRFlfU1RBUlRFRCk7CisJTUVJX0NMX0NTKE9VVF9PRl9SRVNPVVJDRVMpOworCU1FSV9DTF9DUyhNRVNTQUdFX1NNQUxMKTsKKwlkZWZhdWx0OiByZXR1cm4gInVua25vd24iOworCX0KKyN1bmRlZiBNRUlfQ0xfQ0NTCit9CisKKy8qKgorICogbWVpX2NsX2Nvbm5fc3RhdHVzX3RvX2Vycm5vIC0gY29udmVydCBjbGllbnQgY29ubmVjdCByZXNwb25zZQorICogc3RhdHVzIHRvIGVycm9yIGNvZGUKKyAqCisgKiBAc3RhdHVzOiBjbGllbnQgY29ubmVjdCByZXNwb25zZSBzdGF0dXMKKyAqCisgKiByZXR1cm5zIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IG1laV9jbF9jb25uX3N0YXR1c190b19lcnJubyhlbnVtIG1laV9jbF9jb25uZWN0X3N0YXR1cyBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIE1FSV9DTF9DT05OX1NVQ0NFU1M6ICAgICAgICAgIHJldHVybiAwOworCWNhc2UgTUVJX0NMX0NPTk5fTk9UX0ZPVU5EOiAgICAgICAgcmV0dXJuIC1FTk9UVFk7CisJY2FzZSBNRUlfQ0xfQ09OTl9BTFJFQURZX1NUQVJURUQ6ICByZXR1cm4gLUVCVVNZOworCWNhc2UgTUVJX0NMX0NPTk5fT1VUX09GX1JFU09VUkNFUzogcmV0dXJuIC1FQlVTWTsKKwljYXNlIE1FSV9DTF9DT05OX01FU1NBR0VfU01BTEw6ICAgIHJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorfQogCiAvKioKICAqIG1laV9oYm1fbWVfY2xfYWxsb2NhdGUgLSBhbGxvY2F0ZXMgc3RvcmFnZSBmb3IgbWUgY2xpZW50cwpAQCAtMTAwLDMzICsxMzQsNiBAQAogCiAKIC8qKgotICogaXNfdHJlYXRfc3BlY2lhbGx5X2NsaWVudCAtIGNoZWNrcyBpZiB0aGUgbWVzc2FnZSBiZWxvbmdzCi0gKiB0byB0aGUgZmlsZSBwcml2YXRlIGRhdGEuCi0gKgotICogQGNsOiBwcml2YXRlIGRhdGEgb2YgdGhlIGZpbGUgb2JqZWN0Ci0gKiBAcnM6IGNvbm5lY3QgcmVzcG9uc2UgYnVzIG1lc3NhZ2UKLSAqCi0gKi8KLXN0YXRpYyBib29sIGlzX3RyZWF0X3NwZWNpYWxseV9jbGllbnQoc3RydWN0IG1laV9jbCAqY2wsCi0JCXN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVzcG9uc2UgKnJzKQotewotCWlmIChtZWlfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIHJzKSkgewotCQlpZiAoIXJzLT5zdGF0dXMpIHsKLQkJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0NPTk5FQ1RFRDsKLQkJCWNsLT5zdGF0dXMgPSAwOwotCi0JCX0gZWxzZSB7Ci0JCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNURUQ7Ci0JCQljbC0+c3RhdHVzID0gLUVOT0RFVjsKLQkJfQotCQljbC0+dGltZXJfY291bnQgPSAwOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgogICogbWVpX2hibV9pZGxlIC0gc2V0IGhibSB0byBpZGxlIHN0YXRlCiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTE0NywxMyArMTU0LDEzIEBACiAJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53YWl0X3JlY3ZkX21zZywKIAkJCWRldi0+aGJtX3N0YXRlID09IE1FSV9IQk1fSURMRSB8fAogCQkJZGV2LT5oYm1fc3RhdGUgPj0gTUVJX0hCTV9TVEFSVEVELAotCQkJbWVpX3NlY3NfdG9famlmZmllcyhNRUlfSU5URVJPUF9USU1FT1VUKSk7CisJCQltZWlfc2Vjc190b19qaWZmaWVzKE1FSV9IQk1fVElNRU9VVCkpOwogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJaWYgKHJldCA8PSAwICYmIChkZXYtPmhibV9zdGF0ZSA8PSBNRUlfSEJNX1NUQVJUKSkgewogCQlkZXYtPmhibV9zdGF0ZSA9IE1FSV9IQk1fSURMRTsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3YWl0aW5nIGZvciBtZWkgc3RhcnQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldHVybiAtRVRJTUU7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjgzLDE3ICsyOTAsMTggQEAKIH0KIAogLyoqCi0gKiBtZWlfaGJtX3N0b3BfcmVxX3ByZXBhcmUgLSBwcmVwYXJlIHN0b3AgcmVxdWVzdCBtZXNzYWdlCisgKiBtZWlfaGJtX3N0b3BfcmVxIC0gc2VuZCBzdG9wIHJlcXVlc3QgbWVzc2FnZQogICoKICAqIEBkZXYgLSBtZWkgZGV2aWNlCi0gKiBAbWVpX2hkciAtIG1laSBtZXNzYWdlIGhlYWRlcgotICogQGRhdGEgLSBoYm0gbWVzc2FnZSBib2R5IGJ1ZmZlcgorICogQGNsOiBjbGllbnQgaW5mbworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAtRUlPIG9uIHdyaXRlIGZhaWx1cmUKICAqLwotc3RhdGljIHZvaWQgbWVpX2hibV9zdG9wX3JlcV9wcmVwYXJlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBtZWlfbXNnX2hkciAqbWVpX2hkciwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3N0YXRpYyBpbnQgbWVpX2hibV9zdG9wX3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBtZWlfbXNnX2hkciAqbWVpX2hkciA9ICZkZXYtPndyX21zZy5oZHI7CiAJc3RydWN0IGhibV9ob3N0X3N0b3BfcmVxdWVzdCAqcmVxID0KLQkJCShzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0ICopZGF0YTsKKwkJCShzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0ICopZGV2LT53cl9tc2cuZGF0YTsKIAljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBoYm1faG9zdF9zdG9wX3JlcXVlc3QpOwogCiAJbWVpX2hibV9oZHIobWVpX2hkciwgbGVuKTsKQEAgLTMwMSw2ICszMDksOCBAQAogCW1lbXNldChyZXEsIDAsIGxlbik7CiAJcmVxLT5oYm1fY21kID0gSE9TVF9TVE9QX1JFUV9DTUQ7CiAJcmVxLT5yZWFzb24gPSBEUklWRVJfU1RPUF9SRVFVRVNUOworCisJcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgbWVpX2hkciwgZGV2LT53cl9tc2cuZGF0YSk7CiB9CiAKIC8qKgpAQCAtMzE5LDggKzMyOSw3IEBACiAJbWVpX2hibV9oZHIobWVpX2hkciwgbGVuKTsKIAltZWlfaGJtX2NsX2hkcihjbCwgTUVJX0ZMT1dfQ09OVFJPTF9DTUQsIGRldi0+d3JfbXNnLmRhdGEsIGxlbik7CiAKLQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInNlbmRpbmcgZmxvdyBjb250cm9sIGhvc3QgY2xpZW50ID0gJWQsIE1FIGNsaWVudCA9ICVkXG4iLAotCQljbC0+aG9zdF9jbGllbnRfaWQsIGNsLT5tZV9jbGllbnRfaWQpOworCWNsX2RiZyhkZXYsIGNsLCAic2VuZGluZyBmbG93IGNvbnRyb2xcbiIpOwogCiAJcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgbWVpX2hkciwgZGV2LT53cl9tc2cuZGF0YSk7CiB9CkBAIC0zMzAsMjcgKzMzOSwzNCBAQAogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAZmxvdzogZmxvdyBjb250cm9sLgorICoKKyAqIHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBvdGhlcndpc2UKICAqLwotc3RhdGljIHZvaWQgbWVpX2hibV9hZGRfc2luZ2xlX2Zsb3dfY3JlZHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgbWVpX2hibV9hZGRfc2luZ2xlX2Zsb3dfY3JlZHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBoYm1fZmxvd19jb250cm9sICpmbG93KQogewotCXN0cnVjdCBtZWlfbWVfY2xpZW50ICpjbGllbnQ7Ci0JaW50IGk7CisJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOworCWludCBpZDsKIAotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1lX2NsaWVudHNfbnVtOyBpKyspIHsKLQkJY2xpZW50ID0gJmRldi0+bWVfY2xpZW50c1tpXTsKLQkJaWYgKGNsaWVudCAmJiBmbG93LT5tZV9hZGRyID09IGNsaWVudC0+Y2xpZW50X2lkKSB7Ci0JCQlpZiAoY2xpZW50LT5wcm9wcy5zaW5nbGVfcmVjdl9idWYpIHsKLQkJCQljbGllbnQtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKLQkJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInJlY3YgZmxvdyBjdHJsIG1zZyBNRSAlZCAoc2luZ2xlKS5cbiIsCi0JCQkJICAgIGZsb3ctPm1lX2FkZHIpOwotCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZmxvdyBjb250cm9sIGNyZWRlbnRpYWxzID0lZC5cbiIsCi0JCQkJICAgIGNsaWVudC0+bWVpX2Zsb3dfY3RybF9jcmVkcyk7Ci0JCQl9IGVsc2UgewotCQkJCUJVRygpOwkvKiBlcnJvciBpbiBmbG93IGNvbnRyb2wgKi8KLQkJCX0KLQkJfQorCWlkID0gbWVpX21lX2NsX2J5X2lkKGRldiwgZmxvdy0+bWVfYWRkcik7CisJaWYgKGlkIDwgMCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm5vIHN1Y2ggbWUgY2xpZW50ICVkXG4iLAorCQkJZmxvdy0+bWVfYWRkcik7CisJCXJldHVybiBpZDsKIAl9CisKKwltZV9jbCA9ICZkZXYtPm1lX2NsaWVudHNbaWRdOworCWlmIChtZV9jbC0+cHJvcHMuc2luZ2xlX3JlY3ZfYnVmKSB7CisJCW1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzKys7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAicmVjdiBmbG93IGN0cmwgbXNnIE1FICVkIChzaW5nbGUpLlxuIiwKKwkJICAgIGZsb3ctPm1lX2FkZHIpOworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZsb3cgY29udHJvbCBjcmVkZW50aWFscyA9JWQuXG4iLAorCQkgICAgbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMpOworCX0gZWxzZSB7CisJCUJVRygpOwkvKiBlcnJvciBpbiBmbG93IGNvbnRyb2wgKi8KKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0zNjIsOCArMzc4LDcgQEAKIHN0YXRpYyB2b2lkIG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmxvd19jb250cm9sKQogewotCXN0cnVjdCBtZWlfY2wgKmNsID0gTlVMTDsKLQlzdHJ1Y3QgbWVpX2NsICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKIAogCWlmICghZmxvd19jb250cm9sLT5ob3N0X2FkZHIpIHsKIAkJLyogc2luZ2xlIHJlY2VpdmUgYnVmZmVyICovCkBAIC0zNzIsNyArMzg3LDcgQEAKIAl9CiAKIAkvKiBub3JtYWwgY29ubmVjdGlvbiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CiAJCWlmIChtZWlfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIGZsb3dfY29udHJvbCkpIHsKIAkJCWNsLT5tZWlfZmxvd19jdHJsX2NyZWRzKys7CiAJCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZsb3cgY3RybCBtc2cgZm9yIGhvc3QgJWQgTUUgJWQuXG4iLApAQCAtNDA1LDYgKzQyMCwyNSBAQAogfQogCiAvKioKKyAqIG1laV9oYm1fY2xfZGlzY29ubmVjdF9yc3AgLSBzZW5kcyBkaXNjb25uZWN0IHJlc3Bvc2UgdG8gdGhlIEZXCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjbDogYSBjbGllbnQgdG8gZGlzY29ubmVjdCBmcm9tCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FSU8gb24gd3JpdGUgZmFpbHVyZQorICovCitpbnQgbWVpX2hibV9jbF9kaXNjb25uZWN0X3JzcChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCkKK3sKKwlzdHJ1Y3QgbWVpX21zZ19oZHIgKm1laV9oZHIgPSAmZGV2LT53cl9tc2cuaGRyOworCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSk7CisKKwltZWlfaGJtX2hkcihtZWlfaGRyLCBsZW4pOworCW1laV9oYm1fY2xfaGRyKGNsLCBDTElFTlRfRElTQ09OTkVDVF9SRVNfQ01ELCBkZXYtPndyX21zZy5kYXRhLCBsZW4pOworCisJcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgbWVpX2hkciwgZGV2LT53cl9tc2cuZGF0YSk7Cit9CisKKy8qKgogICogbWVpX2hibV9jbF9kaXNjb25uZWN0X3JlcyAtIGRpc2Nvbm5lY3QgcmVzcG9uc2UgZnJvbSBNRQogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCkBAIC00MTQsMjkgKzQ0OCwyMyBAQAogCQlzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlICpycykKIHsKIAlzdHJ1Y3QgbWVpX2NsICpjbDsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpwb3MgPSBOVUxMLCAqbmV4dCA9IE5VTEw7CisJc3RydWN0IG1laV9jbF9jYiAqY2IsICpuZXh0OwogCi0JZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsCi0JCQkiZGlzY29ubmVjdF9yZXNwb25zZTpcbiIKLQkJCSJNRSBDbGllbnQgPSAlZFxuIgotCQkJIkhvc3QgQ2xpZW50ID0gJWRcbiIKLQkJCSJTdGF0dXMgPSAlZFxuIiwKLQkJCXJzLT5tZV9hZGRyLAotCQkJcnMtPmhvc3RfYWRkciwKLQkJCXJzLT5zdGF0dXMpOworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBkaXNjb25uZWN0IHJlc3BvbnNlIGNsOmhvc3Q9JTAyZCBtZT0lMDJkIHN0YXR1cz0lZFxuIiwKKwkJCXJzLT5tZV9hZGRyLCBycy0+aG9zdF9hZGRyLCBycy0+c3RhdHVzKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG5leHQsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0LCBsaXN0KSB7Ci0JCWNsID0gcG9zLT5jbDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2IsIG5leHQsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0LCBsaXN0KSB7CisJCWNsID0gY2ItPmNsOwogCi0JCWlmICghY2wpIHsKLQkJCWxpc3RfZGVsKCZwb3MtPmxpc3QpOworCQkvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCisJCWlmIChXQVJOX09OKCFjbCkpIHsKKwkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSBpbiBjdHJsX3JkX2xpc3QuXG4iKTsKIAkJaWYgKG1laV9oYm1fY2xfYWRkcl9lcXVhbChjbCwgcnMpKSB7Ci0JCQlsaXN0X2RlbCgmcG9zLT5saXN0KTsKLQkJCWlmICghcnMtPnN0YXR1cykKKwkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CisJCQlpZiAocnMtPnN0YXR1cyA9PSBNRUlfQ0xfRElTQ09OTl9TVUNDRVNTKQogCQkJCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKIAogCQkJY2wtPnN0YXR1cyA9IDA7CkBAIC00NzYsNDYgKzUwNCw0MSBAQAogewogCiAJc3RydWN0IG1laV9jbCAqY2w7Ci0Jc3RydWN0IG1laV9jbF9jYiAqcG9zID0gTlVMTCwgKm5leHQgPSBOVUxMOworCXN0cnVjdCBtZWlfY2xfY2IgKmNiLCAqbmV4dDsKIAotCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAotCQkJImNvbm5lY3RfcmVzcG9uc2U6XG4iCi0JCQkiTUUgQ2xpZW50ID0gJWRcbiIKLQkJCSJIb3N0IENsaWVudCA9ICVkXG4iCi0JCQkiU3RhdHVzID0gJWRcbiIsCi0JCQlycy0+bWVfYWRkciwKLQkJCXJzLT5ob3N0X2FkZHIsCi0JCQlycy0+c3RhdHVzKTsKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImhibTogY29ubmVjdCByZXNwb25zZSBjbDpob3N0PSUwMmQgbWU9JTAyZCBzdGF0dXM9JXNcbiIsCisJCQlycy0+bWVfYWRkciwgcnMtPmhvc3RfYWRkciwKKwkJCW1laV9jbF9jb25uX3N0YXR1c19zdHIocnMtPnN0YXR1cykpOwogCi0JLyogaWYgV0Qgb3IgaWFtdGhpZiBjbGllbnQgdHJlYXQgc3BlY2lhbGx5ICovCisJY2wgPSBOVUxMOwogCi0JaWYgKGlzX3RyZWF0X3NwZWNpYWxseV9jbGllbnQoJmRldi0+d2RfY2wsIHJzKSkgewotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gV0QgY2xpZW50LlxuIik7Ci0JCW1laV93YXRjaGRvZ19yZWdpc3RlcihkZXYpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QsIGxpc3QpIHsKIAotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX3RyZWF0X3NwZWNpYWxseV9jbGllbnQoJmRldi0+aWFtdGhpZl9jbCwgcnMpKSB7Ci0JCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7Ci0JCXJldHVybjsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbmV4dCwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QsIGxpc3QpIHsKLQotCQljbCA9IHBvcy0+Y2w7Ci0JCWlmICghY2wpIHsKLQkJCWxpc3RfZGVsKCZwb3MtPmxpc3QpOwotCQkJcmV0dXJuOworCQljbCA9IGNiLT5jbDsKKwkJLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCQlpZiAoV0FSTl9PTighY2wpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZjYi0+bGlzdCk7CisJCQljb250aW51ZTsKIAkJfQotCQlpZiAocG9zLT5mb3BfdHlwZSA9PSBNRUlfRk9QX0lPQ1RMKSB7Ci0JCQlpZiAoaXNfdHJlYXRfc3BlY2lhbGx5X2NsaWVudChjbCwgcnMpKSB7Ci0JCQkJbGlzdF9kZWwoJnBvcy0+bGlzdCk7Ci0JCQkJY2wtPnN0YXR1cyA9IDA7Ci0JCQkJY2wtPnRpbWVyX2NvdW50ID0gMDsKLQkJCQlicmVhazsKLQkJCX0KKworCQlpZiAoY2ItPmZvcF90eXBlICE9ICBNRUlfRk9QX0NPTk5FQ1QpCisJCQljb250aW51ZTsKKworCQlpZiAobWVpX2hibV9jbF9hZGRyX2VxdWFsKGNsLCBycykpIHsKKwkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CisJCQlicmVhazsKIAkJfQogCX0KKworCWlmICghY2wpCisJCXJldHVybjsKKworCWNsLT50aW1lcl9jb3VudCA9IDA7CisJaWYgKHJzLT5zdGF0dXMgPT0gTUVJX0NMX0NPTk5fU1VDQ0VTUykKKwkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfQ09OTkVDVEVEOworCWVsc2UKKwkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOworCWNsLT5zdGF0dXMgPSBtZWlfY2xfY29ubl9zdGF0dXNfdG9fZXJybm8ocnMtPnN0YXR1cyk7CiB9CiAKIApAQCAtNTI1LDMyICs1NDgsMzQgQEAKICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KICAqIEBkaXNjb25uZWN0X3JlcTogZGlzY29ubmVjdCByZXF1ZXN0IGJ1cyBtZXNzYWdlIGZyb20gdGhlIG1lCisgKgorICogcmV0dXJucyAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZQogICovCi1zdGF0aWMgdm9pZCBtZWlfaGJtX2Z3X2Rpc2Nvbm5lY3RfcmVxKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IG1laV9oYm1fZndfZGlzY29ubmVjdF9yZXEoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKIAkJc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0ICpkaXNjb25uZWN0X3JlcSkKIHsKLQlzdHJ1Y3QgbWVpX2NsICpjbCwgKm5leHQ7Ci0JY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlKTsKKwlzdHJ1Y3QgbWVpX2NsICpjbDsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbCwgbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7CiAJCWlmIChtZWlfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIGRpc2Nvbm5lY3RfcmVxKSkgewogCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJkaXNjb25uZWN0IHJlcXVlc3QgaG9zdCBjbGllbnQgJWQgTUUgY2xpZW50ICVkLlxuIiwKIAkJCQkJZGlzY29ubmVjdF9yZXEtPmhvc3RfYWRkciwKIAkJCQkJZGlzY29ubmVjdF9yZXEtPm1lX2FkZHIpOwogCQkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwogCQkJY2wtPnRpbWVyX2NvdW50ID0gMDsKLQkJCWlmIChjbCA9PSAmZGV2LT53ZF9jbCkKLQkJCQlkZXYtPndkX3BlbmRpbmcgPSBmYWxzZTsKLQkJCWVsc2UgaWYgKGNsID09ICZkZXYtPmlhbXRoaWZfY2wpCi0JCQkJZGV2LT5pYW10aGlmX3RpbWVyID0gMDsKIAotCQkJLyogcHJlcGFyZSBkaXNjb25uZWN0IHJlc3BvbnNlICovCi0JCQltZWlfaGJtX2hkcigmZGV2LT53cl9leHRfbXNnLmhkciwgbGVuKTsKLQkJCW1laV9oYm1fY2xfaGRyKGNsLCBDTElFTlRfRElTQ09OTkVDVF9SRVNfQ01ELAotCQkJCQkgZGV2LT53cl9leHRfbXNnLmRhdGEsIGxlbik7CisJCQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBOVUxMKTsKKwkJCWlmICghY2IpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQljYi0+Zm9wX3R5cGUgPSBNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQOworCQkJY2xfZGJnKGRldiwgY2wsICJhZGQgZGlzY29ubmVjdCByZXNwb25zZSBhcyBmaXJzdFxuIik7CisJCQlsaXN0X2FkZCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKKwogCQkJYnJlYWs7CiAJCX0KIAl9CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtNjI5LDEwICs2NTQsNyBAQAogCQkJZGV2X3dhcm4oJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBzdGFydDogdmVyc2lvbiBtaXNtYXRjaCAtIHN0b3BwaW5nIHRoZSBkcml2ZXIuXG4iKTsKIAogCQkJZGV2LT5oYm1fc3RhdGUgPSBNRUlfSEJNX1NUT1BQRUQ7Ci0JCQltZWlfaGJtX3N0b3BfcmVxX3ByZXBhcmUoZGV2LCAmZGV2LT53cl9tc2cuaGRyLAotCQkJCQkJZGV2LT53cl9tc2cuZGF0YSk7Ci0JCQlpZiAobWVpX3dyaXRlX21lc3NhZ2UoZGV2LCAmZGV2LT53cl9tc2cuaGRyLAotCQkJCQlkZXYtPndyX21zZy5kYXRhKSkgeworCQkJaWYgKG1laV9oYm1fc3RvcF9yZXEoZGV2KSkgewogCQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBzdGFydDogZmFpbGVkIHRvIHNlbmQgc3RvcCByZXF1ZXN0XG4iKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KQEAgLTc3OCwxMCArODAwLDExIEBACiAKIAljYXNlIE1FX1NUT1BfUkVRX0NNRDoKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJoYm06IHN0b3AgcmVxdWVzdDogbWVzc2FnZSByZWNlaXZlZFxuIik7Ci0KIAkJZGV2LT5oYm1fc3RhdGUgPSBNRUlfSEJNX1NUT1BQRUQ7Ci0JCW1laV9oYm1fc3RvcF9yZXFfcHJlcGFyZShkZXYsICZkZXYtPndyX2V4dF9tc2cuaGRyLAotCQkJCQlkZXYtPndyX2V4dF9tc2cuZGF0YSk7CisJCWlmIChtZWlfaGJtX3N0b3BfcmVxKGRldikpIHsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiaGJtOiBzdGFydDogZmFpbGVkIHRvIHNlbmQgc3RvcCByZXF1ZXN0XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9oYm0uaCBiL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmgKaW5kZXggNWY5MjE4OC4uMjBlODc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9oYm0uaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2hibS5oCkBAIC01NCw2ICs1NCw3IEBACiBpbnQgbWVpX2hibV9zdGFydF93YWl0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogaW50IG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CiBpbnQgbWVpX2hibV9jbF9kaXNjb25uZWN0X3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CitpbnQgbWVpX2hibV9jbF9kaXNjb25uZWN0X3JzcChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CiBpbnQgbWVpX2hibV9jbF9jb25uZWN0X3JlcShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CiBib29sIG1laV9oYm1fdmVyc2lvbl9pc19zdXBwb3J0ZWQoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYwppbmRleCA2ZjY1NmMwLi44ZGJkYWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9ody1tZS5jCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKLSNpbmNsdWRlICJody1tZS5oIgotCiAjaW5jbHVkZSAiaGJtLmgiCiAKKyNpbmNsdWRlICJody1tZS5oIgorI2luY2x1ZGUgImh3LW1lLXJlZ3MuaCIKIAogLyoqCiAgKiBtZWlfbWVfcmVnX3JlYWQgLSBSZWFkcyAzMmJpdCBkYXRhIGZyb20gdGhlIG1laSBkZXZpY2UKQEAgLTI0MCwxMSArMjQwLDExIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndhaXRfaHdfcmVhZHksCiAJCQlkZXYtPnJlY3ZkX2h3X3JlYWR5LAotCQkJbWVpX3NlY3NfdG9famlmZmllcyhNRUlfSU5URVJPUF9USU1FT1VUKSk7CisJCQltZWlfc2Vjc190b19qaWZmaWVzKE1FSV9IV19SRUFEWV9USU1FT1VUKSk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAJaWYgKCFlcnIgJiYgIWRldi0+cmVjdmRfaHdfcmVhZHkpIHsKIAkJaWYgKCFlcnIpCi0JCQllcnIgPSAtRVRJTUVET1VUOworCQkJZXJyID0gLUVUSU1FOwogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKIAkJCSJ3YWl0IGh3IHJlYWR5IGZhaWxlZC4gc3RhdHVzID0gJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CkBAIC0zMDMsNyArMzAzLDcgQEAKICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIHJldHVybnMgLTEoRVNMT1RTX09WRVJGTE9XKSBpZiBvdmVyZmxvdywgb3RoZXJ3aXNlIGVtcHR5IHNsb3RzIGNvdW50CisgKiByZXR1cm5zIC1FT1ZFUkZMT1cgaWYgb3ZlcmZsb3csIG90aGVyd2lzZSBlbXB0eSBzbG90cyBjb3VudAogICovCiBzdGF0aWMgaW50IG1laV9tZV9oYnVmX2VtcHR5X3Nsb3RzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CkBAIC0zMjYsNyArMzI2LDcgQEAKIAogCiAvKioKLSAqIG1laV93cml0ZV9tZXNzYWdlIC0gd3JpdGVzIGEgbWVzc2FnZSB0byBtZWkgZGV2aWNlLgorICogbWVpX21lX3dyaXRlX21lc3NhZ2UgLSB3cml0ZXMgYSBtZXNzYWdlIHRvIG1laSBkZXZpY2UuCiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBoZWFkZXI6IG1laSBIRUNJIGhlYWRlciBvZiBtZXNzYWdlCkBAIC0zNTQsNyArMzU0LDcgQEAKIAogCWR3X2NudCA9IG1laV9kYXRhMnNsb3RzKGxlbmd0aCk7CiAJaWYgKGVtcHR5X3Nsb3RzIDwgMCB8fCBkd19jbnQgPiBlbXB0eV9zbG90cykKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAltZWlfbWVfcmVnX3dyaXRlKGh3LCBIX0NCX1dXLCAqKCh1MzIgKikgaGVhZGVyKSk7CiAKQEAgLTM4MSw3ICszODEsNyBAQAogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogcmV0dXJucyAtMShFU0xPVFNfT1ZFUkZMT1cpIGlmIG92ZXJmbG93LCBvdGhlcndpc2UgZmlsbGVkIHNsb3RzIGNvdW50CisgKiByZXR1cm5zIC1FT1ZFUkZMT1cgaWYgb3ZlcmZsb3csIG90aGVyd2lzZSBmaWxsZWQgc2xvdHMgY291bnQKICAqLwogc3RhdGljIGludCBtZWlfbWVfY291bnRfZnVsbF9yZWFkX3Nsb3RzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CkBAIC01MDUsMTcgKzUwNSwyNSBAQAogCS8qIGNoZWNrIHNsb3RzIGF2YWlsYWJsZSBmb3IgcmVhZGluZyAqLwogCXNsb3RzID0gbWVpX2NvdW50X2Z1bGxfcmVhZF9zbG90cyhkZXYpOwogCXdoaWxlIChzbG90cyA+IDApIHsKLQkJLyogd2UgaGF2ZSB1cmdlbnQgZGF0YSB0byBzZW5kIHNvIGJyZWFrIHRoZSByZWFkICovCi0JCWlmIChkZXYtPndyX2V4dF9tc2cuaGRyLmxlbmd0aCkKLQkJCWJyZWFrOwogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInNsb3RzIHRvIHJlYWQgPSAlMDh4XG4iLCBzbG90cyk7CiAJCXJldHMgPSBtZWlfaXJxX3JlYWRfaGFuZGxlcihkZXYsICZjb21wbGV0ZV9saXN0LCAmc2xvdHMpOworCQkvKiBUaGVyZSBpcyBhIHJhY2UgYmV0d2VlbiBNRSB3cml0ZSBhbmQgaW50ZXJydXB0IGRlbGl2ZXJ5OgorCQkgKiBOb3QgYWxsIGRhdGEgaXMgYWx3YXlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciB0aGUKKwkJICogaW50ZXJydXB0LCBzbyB0cnkgdG8gcmVhZCBhZ2FpbiBvbiB0aGUgbmV4dCBpbnRlcnJ1cHQuCisJCSAqLworCQlpZiAocmV0cyA9PSAtRU5PREFUQSkKKwkJCWJyZWFrOworCiAJCWlmIChyZXRzICYmIGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfUkVTRVRUSU5HKSB7CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm1laV9pcnFfcmVhZF9oYW5kbGVyIHJldCA9ICVkLlxuIiwKKwkJCQkJCXJldHMpOwogCQkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAJfQogCisJZGV2LT5oYnVmX2lzX3JlYWR5ID0gbWVpX2hidWZfaXNfcmVhZHkoZGV2KTsKKwogCXJldHMgPSBtZWlfaXJxX3dyaXRlX2hhbmRsZXIoZGV2LCAmY29tcGxldGVfbGlzdCk7CiAKIAlkZXYtPmhidWZfaXNfcmVhZHkgPSBtZWlfaGJ1Zl9pc19yZWFkeShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody1tZS5oIGIvZHJpdmVycy9taXNjL21laS9ody1tZS5oCmluZGV4IDgwYmQ4MjkuLjg5M2Q1MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgX01FSV9JTlRFUkZBQ0VfSF8KIAogI2luY2x1ZGUgPGxpbnV4L21laS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJjbGllbnQuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody10eGUtcmVncy5oIGIvZHJpdmVycy9taXNjL21laS9ody10eGUtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODNjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS1yZWdzLmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVsIE1hbmFnZW1lbnQgRW5naW5lIEludGVyZmFjZSAoSW50ZWwgTUVJKSBMaW51eCBkcml2ZXIKKyAqIEludGVsIE1FSSBJbnRlcmZhY2UgSGVhZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcKKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICoJSW50ZWwgQ29ycG9yYXRpb24uCisgKglsaW51eC1tZWlAbGludXguaW50ZWwuY29tCisgKglodHRwOi8vd3d3LmludGVsLmNvbQorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NRUlfSFdfVFhFX1JFR1NfSF8KKyNkZWZpbmUgX01FSV9IV19UWEVfUkVHU19IXworCisjaW5jbHVkZSAiaHcuaCIKKworI2RlZmluZSBTRUNfQUxJVkVORVNTX1RJTUVSX1RJTUVPVVQgICAgICAgICg1ICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTRUNfQUxJVkVORVNTX1dBSVRfVElNRU9VVCAgICAgICAgICgxICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTRUNfUkVTRVRfV0FJVF9USU1FT1VUICAgICAgICAgICAgICgxICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTRUNfUkVBRFlfV0FJVF9USU1FT1VUICAgICAgICAgICAgICg1ICogTVNFQ19QRVJfU0VDKQorI2RlZmluZSBTVEFSVF9NRVNTQUdFX1JFU1BPTlNFX1dBSVRfVElNRU9VVCAoNSAqIE1TRUNfUEVSX1NFQykKKyNkZWZpbmUgUkVTRVRfQ0FOQ0VMX1dBSVRfVElNRU9VVCAgICAgICAgICAoMSAqIE1TRUNfUEVSX1NFQykKKworZW51bSB7CisJU0VDX0JBUiwKKwlCUklER0VfQkFSLAorCisJTlVNX09GX01FTV9CQVJTCit9OworCisvKiBTZUMgRlcgU3RhdHVzIFJlZ2lzdGVyCisgKgorICogRlcgdXNlcyB0aGlzIHJlZ2lzdGVyIGluIG9yZGVyIHRvIHJlcG9ydCBpdHMgc3RhdHVzIHRvIGhvc3QuCisgKiBUaGlzIHJlZ2lzdGVyIHJlc2lkZXMgaW4gUENJLUUgY29uZmlnIHNwYWNlLgorICovCisjZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzAgICAweDQwCisjICBkZWZpbmUgUENJX0NGR19UWEVfRldfU1RTMF9XUktfU1RfTVNLICAgIDB4MDAwMDAwMEYKKyMgIGRlZmluZSBQQ0lfQ0ZHX1RYRV9GV19TVFMwX09QX1NUX01TSyAgICAgMHgwMDAwMDFDMAorIyAgZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzBfRldfSU5JVF9DTVBMVCAweDAwMDAwMjAwCisjICBkZWZpbmUgUENJX0NGR19UWEVfRldfU1RTMF9FUlJfQ09ERV9NU0sgIDB4MDAwMEYwMDAKKyMgIGRlZmluZSBQQ0lfQ0ZHX1RYRV9GV19TVFMwX09QX01PREVfTVNLICAgMHgwMDBGMDAwMAorIyAgZGVmaW5lIFBDSV9DRkdfVFhFX0ZXX1NUUzBfUlNUX0NOVF9NU0sgICAweDAwRjAwMDAwCisKKworI2RlZmluZSBJUENfQkFTRV9BRERSCTB4ODA0MDAgLyogU2VDIElQQyBCYXNlIEFkZHJlc3MgKi8KKworLyogSVBDIElucHV0IERvb3JiZWxsIFJlZ2lzdGVyICovCisjZGVmaW5lIFNFQ19JUENfSU5QVVRfRE9PUkJFTExfUkVHICAgICAgICgweDAwMDAgKyBJUENfQkFTRV9BRERSKQorCisvKiBJUEMgSW5wdXQgU3RhdHVzIFJlZ2lzdGVyCisgKiBUaGlzIHJlZ2lzdGVyIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBwcm9jZXNzaW5nIG9mCisgKiB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgdGhlIFNFQworICogTmV3IGNvbW1hbmRzIGFuZCBwYXlsb2FkcyBzaG91bGQgbm90IGJlIHdyaXR0ZW4gYnkgdGhlIEhvc3QKKyAqIHVudGlsIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHByZXZpb3VzIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICovCisjZGVmaW5lIFNFQ19JUENfSU5QVVRfU1RBVFVTX1JFRyAgICAgICAgICgweDAwMDggKyBJUENfQkFTRV9BRERSKQorIyAgZGVmaW5lIFNFQ19JUENfSU5QVVRfU1RBVFVTX1JEWSAgICBCSVQoMCkKKworLyogSVBDIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19SRUcgICAgICAoMHgwMDEwICsgSVBDX0JBU0VfQUREUikKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19PVVRfREIgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lICAgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfSU5fUkRZICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0hEQ1BfTTBfUkNWRCAgICAgICBCSVQoNSkKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19JTExfTUVNX0FDQ0VTUyAgICAgQklUKDE3KQorI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0FFU19IS0VZX0VSUiAgICAgICBCSVQoMTgpCisjZGVmaW5lICAgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfREVTX0hLRVlfRVJSICAgICAgIEJJVCgxOSkKKyNkZWZpbmUgICBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19UTVJNVEJfT1ZFUkZMT1cgICAgQklUKDIxKQorCisvKiBDb252ZW5pZW50IG1hc2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cyAqLworI2RlZmluZSAgIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1BFTkRJTkcgXAorCQkoU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfT1VUX0RCfCBcCisJCVNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0lOX1JEWSkKKworLyogSVBDIEhvc3QgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VDX0lQQ19IT1NUX0lOVF9NQVNLX1JFRyAgICAgICAgKDB4MDAxNCArIElQQ19CQVNFX0FERFIpCisKKyMgIGRlZmluZSBTRUNfSVBDX0hPU1RfSU5UX01BU0tfT1VUX0RCCUJJVCgwKSAvKiBPdXRwdXQgRG9vcmJlbGwgSW50IE1hc2sgKi8KKyMgIGRlZmluZSBTRUNfSVBDX0hPU1RfSU5UX01BU0tfSU5fUkRZCUJJVCgxKSAvKiBJbnB1dCBSZWFkeSBJbnQgTWFzayAqLworCisvKiBJUEMgSW5wdXQgUGF5bG9hZCBSQU0gKi8KKyNkZWZpbmUgU0VDX0lQQ19JTlBVVF9QQVlMT0FEX1JFRyAgICAgICAgKDB4MDEwMCArIElQQ19CQVNFX0FERFIpCisvKiBJUEMgU2hhcmVkIFBheWxvYWQgUkFNICovCisjZGVmaW5lIElQQ19TSEFSRURfUEFZTE9BRF9SRUcgICAgICAgICAgICgweDAyMDAgKyBJUENfQkFTRV9BRERSKQorCisvKiBTZUMgQWRkcmVzcyBUcmFuc2xhdGlvbiBUYWJsZSBFbnRyeSAyIC0gQ3RybAorICoKKyAqIFRoaXMgcmVnaXN0ZXIgcmVzaWRlcyBhbHNvIGluIFNlQydzIFBDSS1FIE1lbW9yeSBzcGFjZS4KKyAqLworI2RlZmluZSBTQVRUMl9DVFJMX1JFRyAgICAgICAgICAgICAgICAgICAweDEwNDAKKyMgIGRlZmluZSBTQVRUMl9DVFJMX1ZBTElEX01TSyAgICAgICAgICAgIEJJVCgwKQorIyAgZGVmaW5lIFNBVFQyX0NUUkxfQlJfQkFTRV9BRERSX1JFR19TSElGVCA4CisjICBkZWZpbmUgU0FUVDJfQ1RSTF9CUklER0VfSE9TVF9FTl9NU0sgICBCSVQoMTIpCisKKy8qIFNBVFQgVGFibGUgRW50cnkgMiBTQVAgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNBVFQyX1NBUF9CQV9SRUcgICAgICAgICAgICAgICAgIDB4MTA0NAorLyogU0FUVCBUYWJsZSBFbnRyeSAyIFNBUCBTaXplIFJlZ2lzdGVyLiAqLworI2RlZmluZSBTQVRUMl9TQVBfU0laRV9SRUcgICAgICAgICAgICAgICAweDEwNDgKKyAvKiBTQVRUIFRhYmxlIEVudHJ5IDIgU0FQIEJyaWRnZSBBZGRyZXNzIC0gTFNCIFJlZ2lzdGVyICovCisjZGVmaW5lIFNBVFQyX0JSR19CQV9MU0JfUkVHICAgICAgICAgICAgIDB4MTA0QworCisvKiBIb3N0IEhpZ2gtbGV2ZWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBISElTUl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDIwMjAKKy8qIEhvc3QgSGlnaC1sZXZlbCBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCisgKgorICogUmVzaWRlcyBpbiBQQ0kgbWVtb3J5IHNwYWNlLiBUaGlzIGlzIHRoZSB0b3AgaGllcmFyY2h5IGZvcgorICogaW50ZXJydXB0cyBmcm9tIFNlQyB0byBob3N0LCBhZ2dyZWdhdGluZyBib3RoIGludGVycnVwdHMgdGhhdAorICogYXJyaXZlIHRocm91Z2ggSElDUiByZWdpc3RlcnMgYXMgd2VsbCBhcyBpbnRlcnJ1cHRzCisgKiB0aGF0IGFycml2ZSB2aWEgSVBDLgorICovCisjZGVmaW5lIEhISUVSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyNAorI2RlZmluZSAgIElQQ19ISElFUl9TRUMJQklUKDApCisjZGVmaW5lICAgSVBDX0hISUVSX0JSSURHRQlCSVQoMSkKKyNkZWZpbmUgICBJUENfSEhJRVJfTVNLCShJUENfSEhJRVJfU0VDIHwgSVBDX0hISUVSX0JSSURHRSkKKworLyogSG9zdCBIaWdoLWxldmVsIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgorICoKKyAqIFJlc2lkZXMgaW4gUENJIG1lbW9yeSBzcGFjZS4KKyAqIFRoaXMgaXMgdGhlIHRvcCBoaWVyYXJjaHkgZm9yIG1hc2tpbmcgaW50ZXJydXB0cyBmcm9tIFNlQyB0byBob3N0LgorICovCisjZGVmaW5lIEhISU1SX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyOAorI2RlZmluZSAgIElQQ19ISElNUl9TRUMgICAgICAgQklUKDApCisjZGVmaW5lICAgSVBDX0hISU1SX0JSSURHRSAgICBCSVQoMSkKKworLyogSG9zdCBIaWdoLWxldmVsIElSUSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSEhJUlFTUl9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgyMDJDCisKKy8qIEhvc3QgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIDAgLSBTZUMgSVBDIFJlYWRpbmVzcworICoKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgYm90aCBhbiBJQ1IgdG8gSG9zdCBmcm9tIFBDSSBNZW1vcnkgU3BhY2UKKyAqIGFuZCBpdCBpcyBhbHNvIGV4cG9zZWQgaW4gdGhlIFNlQyBtZW1vcnkgc3BhY2UuCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgYnkgU2VDJ3MgSVBDIGRyaXZlciBpbiBvcmRlcgorICogdG8gc3luY2hyb25pemUgd2l0aCBob3N0IGFib3V0IElQQyBpbnRlcmZhY2Ugc3RhdGUuCisgKi8KKyNkZWZpbmUgSElDUl9TRUNfSVBDX1JFQURJTkVTU19SRUcgICAgICAgMHgyMDQwCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19IT1NUX1JEWSAgQklUKDApCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19TRUNfUkRZICAgQklUKDEpCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19TWVNfUkRZICAgICBcCisJICAoSElDUl9TRUNfSVBDX1JFQURJTkVTU19IT1NUX1JEWSB8IFwKKwkgICBISUNSX1NFQ19JUENfUkVBRElORVNTX1NFQ19SRFkpCisjZGVmaW5lICAgSElDUl9TRUNfSVBDX1JFQURJTkVTU19SRFlfQ0xSICAgQklUKDIpCisKKy8qIEhvc3QgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIDEgLSBBbGl2ZW5lc3MgUmVzcG9uc2UgKi8KKy8qIFRoaXMgcmVnaXN0ZXIgaXMgYm90aCBhbiBJQ1IgdG8gSG9zdCBmcm9tIFBDSSBNZW1vcnkgU3BhY2UKKyAqIGFuZCBpdCBpcyBhbHNvIGV4cG9zZWQgaW4gdGhlIFNlQyBtZW1vcnkgc3BhY2UuCisgKiBUaGUgcmVnaXN0ZXIgbWF5IGJlIHVzZWQgYnkgU2VDIHRvIEFDSyBhIGhvc3QgcmVxdWVzdCBmb3IgYWxpdmVuZXNzLgorICovCisjZGVmaW5lIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9SRUcgICAgIDB4MjA0NAorI2RlZmluZSAgIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0sgICAgQklUKDApCisKKy8qIEhvc3QgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIDIgLSBTZUMgSVBDIE91dHB1dCBEb29yYmVsbCAqLworI2RlZmluZSBISUNSX1NFQ19JUENfT1VUUFVUX0RPT1JCRUxMX1JFRyAweDIwNDgKKworLyogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyLgorICoKKyAqIFJlc2lkZXMgaW4gUENJIG1lbW9yeSBzcGFjZS4KKyAqIFRoaXMgaXMgdGhlIG1haW4gcmVnaXN0ZXIgaW52b2x2ZWQgaW4gZ2VuZXJhdGluZyBpbnRlcnJ1cHRzCisgKiBmcm9tIFNlQyB0byBob3N0IHZpYSBISUNScy4KKyAqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBydWxlcyBhcmUgYXMgZm9sbG93czoKKyAqIEFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuZXZlciBmb3IgYW55IGksCisgKiB0aGVyZSBpcyBhIHRyYW5zaXRpb24gZnJvbSBhIHN0YXRlIHdoZXJlIGF0IGxlYXN0IG9uZSBvZgorICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGRpZCBub3QgaG9sZCwgdG8gYSBzdGF0ZSB3aGVyZQorICogQUxMIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBob2xkOgorICogQSkgSElTUi5JTlRbaV1fU1RTID09IDEuCisgKiBCKSBISUVSLklOVFtpXV9FTiA9PSAxLgorICovCisjZGVmaW5lIEhJU1JfUkVHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA2MAorI2RlZmluZSAgIEhJU1JfSU5UXzBfU1RTICAgICAgQklUKDApCisjZGVmaW5lICAgSElTUl9JTlRfMV9TVFMgICAgICBCSVQoMSkKKyNkZWZpbmUgICBISVNSX0lOVF8yX1NUUyAgICAgIEJJVCgyKQorI2RlZmluZSAgIEhJU1JfSU5UXzNfU1RTICAgICAgQklUKDMpCisjZGVmaW5lICAgSElTUl9JTlRfNF9TVFMgICAgICBCSVQoNCkKKyNkZWZpbmUgICBISVNSX0lOVF81X1NUUyAgICAgIEJJVCg1KQorI2RlZmluZSAgIEhJU1JfSU5UXzZfU1RTICAgICAgQklUKDYpCisjZGVmaW5lICAgSElTUl9JTlRfN19TVFMgICAgICBCSVQoNykKKyNkZWZpbmUgICBISVNSX0lOVF9TVFNfTVNLIFwKKwkoSElTUl9JTlRfMF9TVFMgfCBISVNSX0lOVF8xX1NUUyB8IEhJU1JfSU5UXzJfU1RTKQorCisvKiBIb3N0IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIuIFJlc2lkZXMgaW4gUENJIG1lbW9yeSBzcGFjZS4gKi8KKyNkZWZpbmUgSElFUl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDY0CisjZGVmaW5lICAgSElFUl9JTlRfMF9FTiAgICAgIEJJVCgwKQorI2RlZmluZSAgIEhJRVJfSU5UXzFfRU4gICAgICBCSVQoMSkKKyNkZWZpbmUgICBISUVSX0lOVF8yX0VOICAgICAgQklUKDIpCisjZGVmaW5lICAgSElFUl9JTlRfM19FTiAgICAgIEJJVCgzKQorI2RlZmluZSAgIEhJRVJfSU5UXzRfRU4gICAgICBCSVQoNCkKKyNkZWZpbmUgICBISUVSX0lOVF81X0VOICAgICAgQklUKDUpCisjZGVmaW5lICAgSElFUl9JTlRfNl9FTiAgICAgIEJJVCg2KQorI2RlZmluZSAgIEhJRVJfSU5UXzdfRU4gICAgICBCSVQoNykKKworI2RlZmluZSAgIEhJRVJfSU5UX0VOX01TSyBcCisJIChISUVSX0lOVF8wX0VOIHwgSElFUl9JTlRfMV9FTiB8IEhJRVJfSU5UXzJfRU4pCisKKworLyogU0VDIE1lbW9yeSBTcGFjZSBJUEMgb3V0cHV0IHBheWxvYWQuCisgKgorICogVGhpcyByZWdpc3RlciBpcyBwYXJ0IG9mIHRoZSBvdXRwdXQgcGF5bG9hZCB3aGljaCBTRUMgcHJvdmlkZXMgdG8gaG9zdC4KKyAqLworI2RlZmluZSBCUklER0VfSVBDX09VVFBVVF9QQVlMT0FEX1JFRyAgICAweDIwQzAKKworLyogU2VDIEludGVycnVwdCBDYXVzZSBSZWdpc3RlciAtIEhvc3QgQWxpdmVuZXNzIFJlcXVlc3QKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgYm90aCBhbiBJQ1IgdG8gU2VDIGFuZCBpdCBpcyBhbHNvIGV4cG9zZWQKKyAqIGluIHRoZSBob3N0LXZpc2libGUgUENJIG1lbW9yeSBzcGFjZS4KKyAqIFRoZSByZWdpc3RlciBpcyB1c2VkIGJ5IGhvc3QgdG8gcmVxdWVzdCBTZUMgYWxpdmVuZXNzLgorICovCisjZGVmaW5lIFNJQ1JfSE9TVF9BTElWRU5FU1NfUkVRX1JFRyAgICAgIDB4MjE0QworI2RlZmluZSAgIFNJQ1JfSE9TVF9BTElWRU5FU1NfUkVRX1JFUVVFU1RFRCAgICBCSVQoMCkKKworCisvKiBTZUMgSW50ZXJydXB0IENhdXNlIFJlZ2lzdGVyIC0gSG9zdCBJUEMgUmVhZGluZXNzCisgKgorICogVGhpcyByZWdpc3RlciBpcyBib3RoIGFuIElDUiB0byBTZUMgYW5kIGl0IGlzIGFsc28gZXhwb3NlZAorICogaW4gdGhlIGhvc3QtdmlzaWJsZSBQQ0kgbWVtb3J5IHNwYWNlLgorICogVGhpcyByZWdpc3RlciBpcyB1c2VkIGJ5IHRoZSBob3N0J3MgU2VDIGRyaXZlciB1c2VzIGluIG9yZGVyCisgKiB0byBzeW5jaHJvbml6ZSB3aXRoIFNlQyBhYm91dCBJUEMgaW50ZXJmYWNlIHN0YXRlLgorICovCisjZGVmaW5lIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JFUV9SRUcgIDB4MjE1MAorCisKKyNkZWZpbmUgU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfSE9TVF9SRFkgIEJJVCgwKQorI2RlZmluZSBTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19TRUNfUkRZICAgQklUKDEpCisjZGVmaW5lIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1NZU19SRFkgICAgIFwKKwkoU0lDUl9IT1NUX0lQQ19SRUFESU5FU1NfSE9TVF9SRFkgfCBcCisJIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1NFQ19SRFkpCisjZGVmaW5lIFNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JEWV9DTFIgICBCSVQoMikKKworLyogU2VDIEludGVycnVwdCBDYXVzZSBSZWdpc3RlciAtIFNlQyBJUEMgT3V0cHV0IFN0YXR1cworICoKKyAqIFRoaXMgcmVnaXN0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHByb2Nlc3Npbmcgb2YgdGhlIG1vc3QgcmVjZW50CisgKiBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSB0aGUgSG9zdC4KKyAqIE5ldyBjb21tYW5kcyBhbmQgcGF5bG9hZHMgc2hvdWxkIG5vdCBiZSB3cml0dGVuIGJ5IFNlQyB1bnRpbCB0aGlzCisgKiByZWdpc3RlciBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJldmlvdXMgY29tbWFuZCBoYXMgYmVlbiBwcm9jZXNzZWQuCisgKi8KKyNkZWZpbmUgU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVNfUkVHICAgMHgyMTU0CisjICBkZWZpbmUgU0VDX0lQQ19PVVRQVVRfU1RBVFVTX1JEWSBCSVQoMCkKKworCisKKy8qICBNRUkgSVBDIE1lc3NhZ2UgcGF5bG9hZCBzaXplIDY0IGJ5dGVzICovCisjZGVmaW5lIFBBWUxPQURfU0laRSAgICAgICAgNjQKKworLyogTUFYIHNpemUgZm9yIFNBVFQgcmFuZ2UgMzJNQiAqLworI2RlZmluZSBTQVRUX1JBTkdFX01BWCAgICAgKDMyIDw8IDIwKQorCisKKyNlbmRpZiAvKiBfTUVJX0hXX1RYRV9SRUdTX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDE4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jCkBAIC0wLDAgKzEsMTEwNyBAQAorLyoKKyAqCisgKiBJbnRlbCBNYW5hZ2VtZW50IEVuZ2luZSBJbnRlcmZhY2UgKEludGVsIE1FSSkgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZWkuaD4KKworI2luY2x1ZGUgIm1laV9kZXYuaCIKKyNpbmNsdWRlICJody10eGUuaCIKKyNpbmNsdWRlICJjbGllbnQuaCIKKyNpbmNsdWRlICJoYm0uaCIKKworLyoqCisgKiBtZWlfdHhlX3JlZ19yZWFkIC0gUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBkZXZpY2UKKyAqCisgKiBAYmFzZV9hZGRyOiByZWdpc3RlcnMgYmFzZSBhZGRyZXNzCisgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1laV90eGVfcmVnX3JlYWQodm9pZCBfX2lvbWVtICpiYXNlX2FkZHIsCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBpb3JlYWQzMihiYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfcmVnX3dyaXRlIC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIGRldmljZQorICoKKyAqIEBiYXNlX2FkZHI6IHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1laV90eGVfcmVnX3dyaXRlKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJaW93cml0ZTMyKHZhbHVlLCBiYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfc2VjX3JlZ19yZWFkX3NpbGVudCAtIFJlYWRzIDMyYml0IGRhdGEgZnJvbSB0aGUgU2VDIEJBUgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQKKyAqCisgKiBEb2Vzbid0IGNoZWNrIGZvciBhbGl2ZW5lc3Mgd2hpbGUgUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBTZUMgQkFSCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1laV90eGVfc2VjX3JlZ19yZWFkX3NpbGVudChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJcmV0dXJuIG1laV90eGVfcmVnX3JlYWQoaHctPm1lbV9hZGRyW1NFQ19CQVJdLCBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfc2VjX3JlZ19yZWFkIC0gUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBTZUMgQkFSCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICoKKyAqIFJlYWRzIDMyYml0IGRhdGEgZnJvbSB0aGUgU2VDIEJBUiBhbmQgc2hvdXQgbG91ZCBpZiBhbGl2ZW5lc3MgaXMgbm90IHNldAorICovCitzdGF0aWMgaW5saW5lIHUzMiBtZWlfdHhlX3NlY19yZWdfcmVhZChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJV0FSTighaHctPmFsaXZlbmVzcywgInNlYyByZWFkOiBhbGl2ZW5lc3Mgbm90IGFzc2VydGVkXG4iKTsKKwlyZXR1cm4gbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LCBvZmZzZXQpOworfQorLyoqCisgKiBtZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50IC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIFNlQyBCQVIKKyAqICAgZG9lc24ndCBjaGVjayBmb3IgYWxpdmVuZXNzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldAorICogQHZhbHVlOiB2YWx1ZSB0byB3cml0ZQorICoKKyAqIERvZXNuJ3QgY2hlY2sgZm9yIGFsaXZlbmVzcyB3aGlsZSB3cml0ZXMgMzJiaXQgZGF0YSBmcm9tIHRvIHRoZSBTZUMgQkFSCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50KHN0cnVjdCBtZWlfdHhlX2h3ICpodywKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgdTMyIHZhbHVlKQoreworCW1laV90eGVfcmVnX3dyaXRlKGh3LT5tZW1fYWRkcltTRUNfQkFSXSwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9zZWNfcmVnX3dyaXRlIC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIFNlQyBCQVIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0CisgKiBAdmFsdWU6IHZhbHVlIHRvIHdyaXRlCisgKgorICogV3JpdGVzIDMyYml0IGRhdGEgZnJvbSB0aGUgU2VDIEJBUiBhbmQgc2hvdXQgbG91ZCBpZiBhbGl2ZW5lc3MgaXMgbm90IHNldAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWVpX3R4ZV9zZWNfcmVnX3dyaXRlKHN0cnVjdCBtZWlfdHhlX2h3ICpodywKKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgdTMyIHZhbHVlKQoreworCVdBUk4oIWh3LT5hbGl2ZW5lc3MsICJzZWMgd3JpdGU6IGFsaXZlbmVzcyBub3QgYXNzZXJ0ZWRcbiIpOworCW1laV90eGVfc2VjX3JlZ193cml0ZV9zaWxlbnQoaHcsIG9mZnNldCwgdmFsdWUpOworfQorLyoqCisgKiBtZWlfdHhlX2JyX3JlZ19yZWFkIC0gUmVhZHMgMzJiaXQgZGF0YSBmcm9tIHRoZSBCcmlkZ2UgQkFSCisgKgorICogQGh3OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnNldDogb2Zmc2V0IGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgZGF0YQorICoKKyAqLworc3RhdGljIGlubGluZSB1MzIgbWVpX3R4ZV9icl9yZWdfcmVhZChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJcmV0dXJuIG1laV90eGVfcmVnX3JlYWQoaHctPm1lbV9hZGRyW0JSSURHRV9CQVJdLCBvZmZzZXQpOworfQorCisvKioKKyAqIG1laV90eGVfYnJfcmVnX3dyaXRlIC0gV3JpdGVzIDMyYml0IGRhdGEgdG8gdGhlIEJyaWRnZSBCQVIKKyAqCisgKiBAaHc6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmc2V0OiBvZmZzZXQgZnJvbSB3aGljaCB0byB3cml0ZSB0aGUgZGF0YQorICogQHZhbHVlOiB0aGUgYnl0ZSB0byB3cml0ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWVpX3R4ZV9icl9yZWdfd3JpdGUoc3RydWN0IG1laV90eGVfaHcgKmh3LAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJbWVpX3R4ZV9yZWdfd3JpdGUoaHctPm1lbV9hZGRyW0JSSURHRV9CQVJdLCBvZmZzZXQsIHZhbHVlKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2FsaXZlbmVzc19zZXQgLSByZXF1ZXN0IGZvciBhbGl2ZW5lc3MgY2hhbmdlCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEByZXE6IHJlcXVlc3RlZCBhbGl2ZW5lc3MgdmFsdWUKKyAqCisgKiBSZXF1ZXN0IGZvciBhbGl2ZW5lc3MgY2hhbmdlIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIGNoYW5nZSBpcworICogICByZWFsbHkgbmVlZGVkIGFuZCBmYWxzZSBpZiBhbGl2ZW5lc3MgaXMgYWxyZWFkeQorICogICBpbiB0aGUgcmVxdWVzdGVkIHN0YXRlCisgKiBSZXF1aXJlcyBkZXZpY2UgbG9jayB0byBiZSBoZWxkCisgKi8KK3N0YXRpYyBib29sIG1laV90eGVfYWxpdmVuZXNzX3NldChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCB1MzIgcmVxKQoreworCisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJYm9vbCBkb19yZXEgPSBody0+YWxpdmVuZXNzICE9IHJlcTsKKworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiQWxpdmVuZXNzIGN1cnJlbnQ9JWQgcmVxdWVzdD0lZFxuIiwKKwkJCQlody0+YWxpdmVuZXNzLCByZXEpOworCWlmIChkb19yZXEpIHsKKwkJaHctPnJlY3ZkX2FsaXZlbmVzcyA9IGZhbHNlOworCQltZWlfdHhlX2JyX3JlZ193cml0ZShodywgU0lDUl9IT1NUX0FMSVZFTkVTU19SRVFfUkVHLCByZXEpOworCX0KKwlyZXR1cm4gZG9fcmVxOworfQorCisKKy8qKgorICogbWVpX3R4ZV9hbGl2ZW5lc3NfcmVxX2dldCAtIGdldCBhbGl2ZW5lc3MgcmVxdWVzdGVkIHJlZ2lzdGVyIHZhbHVlCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBFeHRyYWN0IEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0sgYml0IGZyb20KKyAqIGZyb20gSElDUl9IT1NUX0FMSVZFTkVTU19SRVEgcmVnaXN0ZXIgdmFsdWUKKyAqLworc3RhdGljIHUzMiBtZWlfdHhlX2FsaXZlbmVzc19yZXFfZ2V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIHJlZzsKKwlyZWcgPSBtZWlfdHhlX2JyX3JlZ19yZWFkKGh3LCBTSUNSX0hPU1RfQUxJVkVORVNTX1JFUV9SRUcpOworCXJldHVybiByZWcgJiBTSUNSX0hPU1RfQUxJVkVORVNTX1JFUV9SRVFVRVNURUQ7Cit9CisKKy8qKgorICogbWVpX3R4ZV9hbGl2ZW5lc3NfZ2V0IC0gZ2V0IGFsaXZlbmVzcyByZXNwb25zZSByZWdpc3RlciB2YWx1ZQorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBFeHRyYWN0IEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0sgYml0CisgKiBmcm9tIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUCByZWdpc3RlciB2YWx1ZQorICovCitzdGF0aWMgdTMyIG1laV90eGVfYWxpdmVuZXNzX2dldChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCXUzMiByZWc7CisJcmVnID0gbWVpX3R4ZV9icl9yZWdfcmVhZChodywgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQX1JFRyk7CisJcmV0dXJuIHJlZyAmIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUF9BQ0s7Cit9CisKKy8qKgorICogbWVpX3R4ZV9hbGl2ZW5lc3NfcG9sbCAtIHdhaXRzIGZvciBhbGl2ZW5lc3MgdG8gc2V0dGxlCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBleHBlY3RlZDogZXhwZWN0ZWQgYWxpdmVuZXNzIHZhbHVlCisgKgorICogUG9sbHMgZm9yIEhJQ1JfSE9TVF9BTElWRU5FU1NfUkVTUC5BTElWRU5FU1NfUkVTUCB0byBiZSBzZXQKKyAqIHJldHVybnMgPiAwIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSB3YXMgcmVjZWl2ZWQsIC1FVElNRSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBtZWlfdHhlX2FsaXZlbmVzc19wb2xsKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHUzMiBleHBlY3RlZCkKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwlpbnQgdCA9IDA7CisKKwlkbyB7CisJCWh3LT5hbGl2ZW5lc3MgPSBtZWlfdHhlX2FsaXZlbmVzc19nZXQoZGV2KTsKKwkJaWYgKGh3LT5hbGl2ZW5lc3MgPT0gZXhwZWN0ZWQpIHsKKwkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAorCQkJCSJhbGl2ZW5lc3Mgc2V0dGxlZCBhZnRlciAlZCBtc2Vjc1xuIiwgdCk7CisJCQlyZXR1cm4gdDsKKwkJfQorCQltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCQltc2xlZXAoTVNFQ19QRVJfU0VDIC8gNSk7CisJCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCQl0ICs9IE1TRUNfUEVSX1NFQyAvIDU7CisJfSB3aGlsZSAodCA8IFNFQ19BTElWRU5FU1NfV0FJVF9USU1FT1VUKTsKKworCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiYWxpdmVuZXNzIHRpbWVkIG91dFxuIik7CisJcmV0dXJuIC1FVElNRTsKK30KKworLyoqCisgKiBtZWlfdHhlX2FsaXZlbmVzc193YWl0IC0gd2FpdHMgZm9yIGFsaXZlbmVzcyB0byBzZXR0bGUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGV4cGVjdGVkOiBleHBlY3RlZCBhbGl2ZW5lc3MgdmFsdWUKKyAqCisgKiBXYWl0cyBmb3IgSElDUl9IT1NUX0FMSVZFTkVTU19SRVNQLkFMSVZFTkVTU19SRVNQIHRvIGJlIHNldAorICogcmV0dXJucyByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IG1laV90eGVfYWxpdmVuZXNzX3dhaXQoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgdTMyIGV4cGVjdGVkKQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dCA9CisJCQltc2Vjc190b19qaWZmaWVzKFNFQ19BTElWRU5FU1NfV0FJVF9USU1FT1VUKTsKKwlsb25nIGVycjsKKwlpbnQgcmV0OworCisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCWlmIChody0+YWxpdmVuZXNzID09IGV4cGVjdGVkKQorCQlyZXR1cm4gMDsKKworCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJZXJyID0gd2FpdF9ldmVudF90aW1lb3V0KGh3LT53YWl0X2FsaXZlbmVzcywKKwkJCWh3LT5yZWN2ZF9hbGl2ZW5lc3MsIHRpbWVvdXQpOworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCXJldCA9IGh3LT5hbGl2ZW5lc3MgPT0gZXhwZWN0ZWQgPyAwIDogLUVUSU1FOworCisJaWYgKHJldCkKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJhbGl2ZW5lc3MgdGltZWQgb3V0Iik7CisJZWxzZQorCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImFsaXZlbmVzcyBzZXR0bGVkIGFmdGVyICVkIG1zZWNzXG4iLAorCQkJCWppZmZpZXNfdG9fbXNlY3ModGltZW91dCAtIGVycikpOworCWh3LT5yZWN2ZF9hbGl2ZW5lc3MgPSBmYWxzZTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG1laV90eGVfYWxpdmVuZXNzX3NldF9zeW5jIC0gc2V0cyBhbiB3YWl0IGZvciBhbGl2ZW5lc3MgdG8gY29tcGxldGUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIDwgMCBvdGhlcndpc2UKKyAqLworaW50IG1laV90eGVfYWxpdmVuZXNzX3NldF9zeW5jKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHUzMiByZXEpCit7CisJaWYgKG1laV90eGVfYWxpdmVuZXNzX3NldChkZXYsIHJlcSkpCisJCXJldHVybiBtZWlfdHhlX2FsaXZlbmVzc193YWl0KGRldiwgcmVxKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUgLSBzZXRzIHRoZSBJbnB1dCBSZWFkeSBJbnRlcnJ1cHQKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwl1MzIgaGludG1zazsKKwkvKiBFbmFibGUgdGhlIFNFQ19JUENfSE9TVF9JTlRfTUFTS19JTl9SRFkgaW50ZXJydXB0ICovCisJaGludG1zayA9IG1laV90eGVfc2VjX3JlZ19yZWFkKGh3LCBTRUNfSVBDX0hPU1RfSU5UX01BU0tfUkVHKTsKKwloaW50bXNrIHw9IFNFQ19JUENfSE9TVF9JTlRfTUFTS19JTl9SRFk7CisJbWVpX3R4ZV9zZWNfcmVnX3dyaXRlKGh3LCBTRUNfSVBDX0hPU1RfSU5UX01BU0tfUkVHLCBoaW50bXNrKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2lucHV0X2Rvb3JiZWxsX3NldAorICogICAtIFNldHMgYml0IDAgaW4gU0VDX0lQQ19JTlBVVF9ET09SQkVMTC5JUENfSU5QVVRfRE9PUkJFTEwuCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX2lucHV0X2Rvb3JiZWxsX3NldChzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcpCit7CisJLyogQ2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSAqLworCWNsZWFyX2JpdChUWEVfSU5UUl9JTl9SRUFEWV9CSVQsICZody0+aW50cl9jYXVzZSk7CisJbWVpX3R4ZV9zZWNfcmVnX3dyaXRlKGh3LCBTRUNfSVBDX0lOUFVUX0RPT1JCRUxMX1JFRywgMSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9vdXRwdXRfcmVhZHlfc2V0IC0gU2V0cyB0aGUgU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVMgYml0IHRvIDEKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX291dHB1dF9yZWFkeV9zZXQoc3RydWN0IG1laV90eGVfaHcgKmh3KQoreworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LAorCQkJU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVNfUkVHLAorCQkJU0VDX0lQQ19PVVRQVVRfU1RBVFVTX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pc19pbnB1dF9yZWFkeSAtIGNoZWNrIGlmIFRYRSBpcyByZWFkeSBmb3IgcmVjZWl2aW5nIGRhdGEKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgYm9vbCBtZWlfdHhlX2lzX2lucHV0X3JlYWR5KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIHN0YXR1czsKKwlzdGF0dXMgPSBtZWlfdHhlX3NlY19yZWdfcmVhZChodywgU0VDX0lQQ19JTlBVVF9TVEFUVVNfUkVHKTsKKwlyZXR1cm4gISEoU0VDX0lQQ19JTlBVVF9TVEFUVVNfUkRZICYgc3RhdHVzKTsKK30KKworLyoqCisgKiBtZWlfdHhlX2ludHJfY2xlYXIgLSBjbGVhciBhbGwgaW50ZXJydXB0cworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWlfdHhlX2ludHJfY2xlYXIoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50KGh3LCBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19SRUcsCisJCVNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1BFTkRJTkcpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBISVNSX1JFRywgSElTUl9JTlRfU1RTX01TSyk7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhISVNSX1JFRywgSVBDX0hISUVSX01TSyk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pbnRyX2Rpc2FibGUgLSBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgbWVpX3R4ZV9pbnRyX2Rpc2FibGUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSEhJRVJfUkVHLCAwKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSElFUl9SRUcsIDApOworfQorLyoqCisgKiBtZWlfdHhlX2ludHJfZGlzYWJsZSAtIGVuYWJsZSBhbGwgaW50ZXJydXB0cworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaW50cl9lbmFibGUoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSEhJRVJfUkVHLCBJUENfSEhJRVJfTVNLKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgSElFUl9SRUcsIEhJRVJfSU5UX0VOX01TSyk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9wZW5kaW5nX2ludGVycnVwdHMgLSBjaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyBpbnRlcnJ1cHRzCisgKglvbmx5IEFsaXZlbmVzcywgSW5wdXQgcmVhZHksIGFuZCBvdXRwdXQgZG9vcmJlbGwgYXJlIG9mIHJlbGV2YW5jZQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogQ2hlY2tzIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGludGVycnVwdHMKKyAqIG9ubHkgQWxpdmVuZXNzLCBSZWFkaW5lc3MsIElucHV0IHJlYWR5LCBhbmQgT3V0cHV0IGRvb3JiZWxsIGFyZSByZWxldmFudAorICovCitzdGF0aWMgYm9vbCBtZWlfdHhlX3BlbmRpbmdfaW50ZXJydXB0cyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJYm9vbCByZXQgPSAoaHctPmludHJfY2F1c2UgJiAoVFhFX0lOVFJfUkVBRElORVNTIHwKKwkJCQkgICAgICBUWEVfSU5UUl9BTElWRU5FU1MgfAorCQkJCSAgICAgIFRYRV9JTlRSX0lOX1JFQURZICB8CisJCQkJICAgICAgVFhFX0lOVFJfT1VUX0RCKSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAorCQkJIlBlbmRpbmcgSW50ZXJydXB0cyBJblJlYWR5PSUwMWQgUmVhZGluZXNzPSUwMWQsIEFsaXZlbmVzcz0lMDFkLCBPdXREb29yPSUwMWRcbiIsCisJCQkhIShody0+aW50cl9jYXVzZSAmIFRYRV9JTlRSX0lOX1JFQURZKSwKKwkJCSEhKGh3LT5pbnRyX2NhdXNlICYgVFhFX0lOVFJfUkVBRElORVNTKSwKKwkJCSEhKGh3LT5pbnRyX2NhdXNlICYgVFhFX0lOVFJfQUxJVkVORVNTKSwKKwkJCSEhKGh3LT5pbnRyX2NhdXNlICYgVFhFX0lOVFJfT1VUX0RCKSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pbnB1dF9wYXlsb2FkX3dyaXRlIC0gd3JpdGUgYSBkd29yZCB0byB0aGUgaG9zdCBidWZmZXIKKyAqCWF0IG9mZnNldCBpZHgKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGlkeDogaW5kZXggaW4gdGhlIGhvc3QgYnVmZmVyCisgKiBAdmFsdWU6IHZhbHVlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaW5wdXRfcGF5bG9hZF93cml0ZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgbG9uZyBpZHgsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwltZWlfdHhlX3NlY19yZWdfd3JpdGUoaHcsIFNFQ19JUENfSU5QVVRfUEFZTE9BRF9SRUcgKworCQkJKGlkeCAqIHNpemVvZih1MzIpKSwgdmFsdWUpOworfQorCisvKioKKyAqIG1laV90eGVfb3V0X2RhdGFfcmVhZCAtIHJlYWQgZHdvcmQgZnJvbSB0aGUgZGV2aWNlIGJ1ZmZlcgorICoJYXQgb2Zmc2V0IGlkeAorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaWR4OiBpbmRleCBpbiB0aGUgZGV2aWNlIGJ1ZmZlcgorICoKKyAqIHJldHVybnMgcmVnaXN0ZXIgdmFsdWUgYXQgaW5kZXgKKyAqLworc3RhdGljIHUzMiBtZWlfdHhlX291dF9kYXRhX3JlYWQoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldiwKKwkJCQkJdW5zaWduZWQgbG9uZyBpZHgpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJcmV0dXJuIG1laV90eGVfYnJfcmVnX3JlYWQoaHcsCisJCUJSSURHRV9JUENfT1VUUFVUX1BBWUxPQURfUkVHICsgKGlkeCAqIHNpemVvZih1MzIpKSk7Cit9CisKKy8qIFJlYWRpbmVzcyAqLworCisvKioKKyAqIG1laV90eGVfcmVhZGluZXNzX3NldF9ob3N0X3JkeQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfcmVhZGluZXNzX3NldF9ob3N0X3JkeShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LAorCQlTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19SRVFfUkVHLAorCQlTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19IT1NUX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9yZWFkaW5lc3NfY2xlYXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX3JlYWRpbmVzc19jbGVhcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCW1laV90eGVfYnJfcmVnX3dyaXRlKGh3LCBTSUNSX0hPU1RfSVBDX1JFQURJTkVTU19SRVFfUkVHLAorCQkJCVNJQ1JfSE9TVF9JUENfUkVBRElORVNTX1JEWV9DTFIpOworfQorLyoqCisgKiBtZWlfdHhlX3JlYWRpbmVzc19nZXQgLSBSZWFkcyBhbmQgcmV0dXJucworICoJdGhlIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1MgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdTMyIG1laV90eGVfcmVhZGluZXNzX2dldChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCXJldHVybiBtZWlfdHhlX2JyX3JlZ19yZWFkKGh3LCBISUNSX1NFQ19JUENfUkVBRElORVNTX1JFRyk7Cit9CisKKworLyoqCisgKiBtZWlfdHhlX3JlYWRpbmVzc19pc19zZWNfcmR5IC0gY2hlY2sgcmVhZGluZXNzCisgKiAgZm9yIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfU0VDX1JEWQorICoKKyAqIEByZWFkaW5lc3MgLSBjYWNoZWQgcmVhZGluZXNzIHN0YXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBtZWlfdHhlX3JlYWRpbmVzc19pc19zZWNfcmR5KHUzMiByZWFkaW5lc3MpCit7CisJcmV0dXJuICEhKHJlYWRpbmVzcyAmIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfU0VDX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9od19pc19yZWFkeSAtIGNoZWNrIGlmIHRoZSBodyBpcyByZWFkeQorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyBib29sIG1laV90eGVfaHdfaXNfcmVhZHkoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwl1MzIgcmVhZGluZXNzID0gIG1laV90eGVfcmVhZGluZXNzX2dldChkZXYpOworCXJldHVybiBtZWlfdHhlX3JlYWRpbmVzc19pc19zZWNfcmR5KHJlYWRpbmVzcyk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9ob3N0X2lzX3JlYWR5IC0gY2hlY2sgaWYgdGhlIGhvc3QgaXMgcmVhZHkKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbWVpX3R4ZV9ob3N0X2lzX3JlYWR5KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIHJlZyA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJQ1JfU0VDX0lQQ19SRUFESU5FU1NfUkVHKTsKKwlyZXR1cm4gISEocmVnICYgSElDUl9TRUNfSVBDX1JFQURJTkVTU19IT1NUX1JEWSk7Cit9CisKKy8qKgorICogbWVpX3R4ZV9yZWFkaW5lc3Nfd2FpdCAtIHdhaXQgdGlsbCByZWFkaW5lc3Mgc2V0dGxlcworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIC1FVElNRSBvbiB0aW1lb3V0CisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9yZWFkaW5lc3Nfd2FpdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCWlmIChtZWlfdHhlX2h3X2lzX3JlYWR5KGRldikpCisJCXJldHVybiAwOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZGV2LT53YWl0X2h3X3JlYWR5LCBkZXYtPnJlY3ZkX2h3X3JlYWR5LAorCQkJbXNlY3NfdG9famlmZmllcyhTRUNfUkVTRVRfV0FJVF9USU1FT1VUKSk7CisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJaWYgKCFkZXYtPnJlY3ZkX2h3X3JlYWR5KSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2FpdCBmb3IgcmVhZGluZXNzIGZhaWxlZFxuIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJZGV2LT5yZWN2ZF9od19yZWFkeSA9IGZhbHNlOworCXJldHVybiAwOworfQorCisvKioKKyAqICBtZWlfdHhlX2h3X2NvbmZpZyAtIGNvbmZpZ3VyZSBoYXJkd2FyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGRldmljZXMKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZSBoYXJkd2FyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBzaG91bGQgYmUgZG9uZSBvbmx5CisgKiAgIG9uY2UgYXQgdGhlIGRldmljZSBwcm9iZSB0aW1lCisgKi8KK3N0YXRpYyB2b2lkIG1laV90eGVfaHdfY29uZmlnKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcgPSB0b190eGVfaHcoZGV2KTsKKwkvKiBEb2Vzbid0IGNoYW5nZSBpbiBydW50aW1lICovCisJZGV2LT5oYnVmX2RlcHRoID0gUEFZTE9BRF9TSVpFIC8gNDsKKworCWh3LT5hbGl2ZW5lc3MgPSBtZWlfdHhlX2FsaXZlbmVzc19nZXQoZGV2KTsKKwlody0+cmVhZGluZXNzID0gbWVpX3R4ZV9yZWFkaW5lc3NfZ2V0KGRldik7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImFsaXZlbmVzc19yZXNwID0gMHglMDh4LCByZWFkaW5lc3MgPSAweCUwOHguXG4iLAorCQlody0+YWxpdmVuZXNzLCBody0+cmVhZGluZXNzKTsKK30KKworCisvKioKKyAqIG1laV90eGVfd3JpdGUgLSB3cml0ZXMgYSBtZXNzYWdlIHRvIGRldmljZS4KKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGhlYWRlcjogaGVhZGVyIG9mIG1lc3NhZ2UKKyAqIEBidWY6IG1lc3NhZ2UgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbgorICogcmV0dXJucyAxIGlmIHN1Y2Nlc3MsIDAgLSBvdGhlcndpc2UuCisgKi8KKworc3RhdGljIGludCBtZWlfdHhlX3dyaXRlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBtZWlfbXNnX2hkciAqaGVhZGVyLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdW5zaWduZWQgbG9uZyByZW07CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisJaW50IHNsb3RzID0gZGV2LT5oYnVmX2RlcHRoOworCXUzMiAqcmVnX2J1ZiA9ICh1MzIgKilidWY7CisJdTMyIGR3X2NudDsKKwlpbnQgaTsKKworCWlmIChXQVJOX09OKCFoZWFkZXIgfHwgIWJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuZ3RoID0gaGVhZGVyLT5sZW5ndGg7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgTUVJX0hEUl9GTVQsIE1FSV9IRFJfUFJNKGhlYWRlcikpOworCisJZHdfY250ID0gbWVpX2RhdGEyc2xvdHMobGVuZ3RoKTsKKwlpZiAoZHdfY250ID4gc2xvdHMpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlpZiAoV0FSTighaHctPmFsaXZlbmVzcywgInR4ZSB3cml0ZTogYWxpdmVuZXNzIG5vdCBhc3NlcnRlZFxuIikpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogRW5hYmxlIElucHV0IFJlYWR5IEludGVycnVwdC4gKi8KKwltZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUoZGV2KTsKKworCWlmICghbWVpX3R4ZV9pc19pbnB1dF9yZWFkeShkZXYpKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiSW5wdXQgaXMgbm90IHJlYWR5Iik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCW1laV90eGVfaW5wdXRfcGF5bG9hZF93cml0ZShkZXYsIDAsICooKHUzMiAqKWhlYWRlcikpOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aCAvIDQ7IGkrKykKKwkJbWVpX3R4ZV9pbnB1dF9wYXlsb2FkX3dyaXRlKGRldiwgaSArIDEsIHJlZ19idWZbaV0pOworCisJcmVtID0gbGVuZ3RoICYgMHgzOworCWlmIChyZW0gPiAwKSB7CisJCXUzMiByZWcgPSAwOworCQltZW1jcHkoJnJlZywgJmJ1ZltsZW5ndGggLSByZW1dLCByZW0pOworCQltZWlfdHhlX2lucHV0X3BheWxvYWRfd3JpdGUoZGV2LCBpICsgMSwgcmVnKTsKKwl9CisKKwkvKiBhZnRlciBlYWNoIHdyaXRlIHRoZSB3aG9sZSBidWZmZXIgaXMgY29uc3VtZWQgKi8KKwlody0+c2xvdHMgPSAwOworCisJLyogU2V0IElucHV0LURvb3JiZWxsICovCisJbWVpX3R4ZV9pbnB1dF9kb29yYmVsbF9zZXQoaHcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVpX3R4ZV9oYnVmX21heF9sZW4gLSBtaW1pY3MgdGhlIG1lIGhidWYgY2lyY3VsYXIgYnVmZmVyCisgKgorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIHRoZSBQQVlMT0FEX1NJWkUgLSA0CisgKi8KK3N0YXRpYyBzaXplX3QgbWVpX3R4ZV9oYnVmX21heF9sZW4oY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gUEFZTE9BRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBtZWlfbXNnX2hkcik7Cit9CisKKy8qKgorICogbWVpX3R4ZV9oYnVmX2VtcHR5X3Nsb3RzIC0gbWltaWNzIHRoZSBtZSBoYnVmIGNpcmN1bGFyIGJ1ZmZlcgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyBhbHdheXMgaGJ1Zl9kZXB0aAorICovCitzdGF0aWMgaW50IG1laV90eGVfaGJ1Zl9lbXB0eV9zbG90cyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCXJldHVybiBody0+c2xvdHM7Cit9CisKKy8qKgorICogbWVpX3R4ZV9jb3VudF9mdWxsX3JlYWRfc2xvdHMgLSBtaW1pY3MgdGhlIG1lIGRldmljZSBjaXJjdWxhciBidWZmZXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgYWx3YXlzIGJ1ZmZlciBzaXplIGluIGR3b3JkcyBjb3VudAorICovCitzdGF0aWMgaW50IG1laV90eGVfY291bnRfZnVsbF9yZWFkX3Nsb3RzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJLyogcmVhZCBidWZmZXJzIGhhcyBzdGF0aWMgc2l6ZSAqLworCXJldHVybiAgUEFZTE9BRF9TSVpFIC8gNDsKK30KKworLyoqCisgKiBtZWlfdHhlX3JlYWRfaGRyIC0gcmVhZCBtZXNzYWdlIGhlYWRlciB3aGljaCBpcyBhbHdheXMgaW4gNCBmaXJzdCBieXRlcworICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyBtZWkgbWVzc2FnZSBoZWFkZXIKKyAqLworCitzdGF0aWMgdTMyIG1laV90eGVfcmVhZF9oZHIoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbWVpX3R4ZV9vdXRfZGF0YV9yZWFkKGRldiwgMCk7Cit9CisvKioKKyAqIG1laV90eGVfcmVhZCAtIHJlYWRzIGEgbWVzc2FnZSBmcm9tIHRoZSB0eGUgZGV2aWNlLgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiBtZXNzYWdlIGJ1ZmZlciB3aWxsIGJlIHdyaXR0ZW4KKyAqIEBsZW46IG1lc3NhZ2Ugc2l6ZSB3aWxsIGJlIHJlYWQKKyAqCisgKiByZXR1cm5zIC1FSU5WQUwgb24gZXJyb3Igd3JvbmcgYXJndW1lbnQgYW5kIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IG1laV90eGVfcmVhZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAorCQl1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIGk7CisJdTMyICpyZWdfYnVmID0gKHUzMiAqKWJ1ZjsKKwl1MzIgcmVtID0gbGVuICYgMHgzOworCisJaWYgKFdBUk5fT04oIWJ1ZiB8fCAhbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKKwkJImJ1ZmZlci1sZW5ndGggPSAlbHUgYnVmWzBdMHglMDhYXG4iLAorCQlsZW4sIG1laV90eGVfb3V0X2RhdGFfcmVhZChkZXYsIDApKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW4gLyA0OyBpKyspIHsKKwkJLyogc2tpcCBoZWFkZXI6IGluZGV4IHN0YXJ0cyBmcm9tIDEgKi8KKwkJdTMyIHJlZyA9IG1laV90eGVfb3V0X2RhdGFfcmVhZChkZXYsIGkgKyAxKTsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJidWZbJWRdID0gMHglMDhYXG4iLCBpLCByZWcpOworCQkqcmVnX2J1ZisrID0gcmVnOworCX0KKworCWlmIChyZW0pIHsKKwkJdTMyIHJlZyA9IG1laV90eGVfb3V0X2RhdGFfcmVhZChkZXYsIGkgKyAxKTsKKwkJbWVtY3B5KHJlZ19idWYsICZyZWcsIHJlbSk7CisJfQorCisJbWVpX3R4ZV9vdXRwdXRfcmVhZHlfc2V0KGh3KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtZWlfdHhlX2h3X3Jlc2V0IC0gcmVzZXRzIGhvc3QgYW5kIGZ3LgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaW50cl9lbmFibGU6IGlmIGludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCBhZnRlciByZXNldC4KKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworc3RhdGljIGludCBtZWlfdHhlX2h3X3Jlc2V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIGJvb2wgaW50cl9lbmFibGUpCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisKKwl1MzIgYWxpdmVuZXNzX3JlcTsKKwkvKgorCSAqIHJlYWQgaW5wdXQgZG9vcmJlbGwgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGJldHdlZW4gIEJyaWRnZSBhbmQgU2VDCisJICogcmV0dXJuIHZhbHVlIG1pZ2h0IGJlIGdhcmJhZ2UgcmV0dXJuCisJICovCisJKHZvaWQpbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LCBTRUNfSVBDX0lOUFVUX0RPT1JCRUxMX1JFRyk7CisKKwlhbGl2ZW5lc3NfcmVxID0gbWVpX3R4ZV9hbGl2ZW5lc3NfcmVxX2dldChkZXYpOworCWh3LT5hbGl2ZW5lc3MgPSBtZWlfdHhlX2FsaXZlbmVzc19nZXQoZGV2KTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBpbiB0aGlzIHN0YWdlIHdlIHdpbGwgcG9sbCAqLworCW1laV90eGVfaW50cl9kaXNhYmxlKGRldik7CisKKwkvKgorCSAqIElmIEFsaXZlbmVzcyBSZXF1ZXN0IGFuZCBBbGl2ZW5lc3MgUmVzcG9uc2UgYXJlIG5vdCBlcXVhbCB0aGVuCisJICogd2FpdCBmb3IgdGhlbSB0byBiZSBlcXVhbAorCSAqIFNpbmNlIHdlIG1pZ2h0IGhhdmUgaW50ZXJydXB0cyBkaXNhYmxlZCAtIHBvbGwgZm9yIGl0CisJICovCisJaWYgKGFsaXZlbmVzc19yZXEgIT0gaHctPmFsaXZlbmVzcykKKwkJaWYgKG1laV90eGVfYWxpdmVuZXNzX3BvbGwoZGV2LCBhbGl2ZW5lc3NfcmVxKSA8IDApIHsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAorCQkJCSJ3YWl0IGZvciBhbGl2ZW5lc3Mgc2V0dGxlIGZhaWxlZCAuLi4gYmFpbGluZyBvdXRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCS8qCisJICogSWYgQWxpdmVuZXNzIFJlcXVlc3QgYW5kIEFsaXZlbmVzcyBSZXNwb25zZSBhcmUgc2V0IHRoZW4gY2xlYXIgdGhlbQorCSAqLworCWlmIChhbGl2ZW5lc3NfcmVxKSB7CisJCW1laV90eGVfYWxpdmVuZXNzX3NldChkZXYsIDApOworCQlpZiAobWVpX3R4ZV9hbGl2ZW5lc3NfcG9sbChkZXYsIDApIDwgMCkgeworCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCisJCQkJIndhaXQgZm9yIGFsaXZlbmVzcyBmYWlsZWQgLi4uIGJhaWxpbmcgb3V0XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJLyoKKwkgKiBTZXQgcmVkaW5lc3MgUkRZX0NMUiBiaXQKKwkgKi8KKwltZWlfdHhlX3JlYWRpbmVzc19jbGVhcihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVpX3R4ZV9od19zdGFydCAtIHN0YXJ0IHRoZSBoYXJkd2FyZSBhZnRlciByZXNldAorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIDwgMCBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgbWVpX3R4ZV9od19zdGFydChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCWludCByZXQ7CisKKwl1MzIgaGlzcjsKKworCS8qIGJyaW5nIGJhY2sgaW50ZXJydXB0cyAqLworCW1laV90eGVfaW50cl9lbmFibGUoZGV2KTsKKworCXJldCA9IG1laV90eGVfcmVhZGluZXNzX3dhaXQoZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndhdGluZyBmb3IgcmVhZGluZXNzIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBJZiBISVNSLklOVDJfU1RTIGludGVycnVwdCBzdGF0dXMgYml0IGlzIHNldCB0aGVuIGNsZWFyIGl0LgorCSAqLworCWhpc3IgPSBtZWlfdHhlX2JyX3JlZ19yZWFkKGh3LCBISVNSX1JFRyk7CisJaWYgKGhpc3IgJiBISVNSX0lOVF8yX1NUUykKKwkJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhJU1JfUkVHLCBISVNSX0lOVF8yX1NUUyk7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIG9mIE91dHB1dERvb3JiZWxsICovCisJY2xlYXJfYml0KFRYRV9JTlRSX09VVF9EQl9CSVQsICZody0+aW50cl9jYXVzZSk7CisKKwlyZXQgPSBtZWlfdHhlX2FsaXZlbmVzc19zZXRfc3luYyhkZXYsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2FpdCBmb3IgYWxpdmVuZXNzIGZhaWxlZCAuLi4gYmFpbGluZyBvdXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGVuYWJsZSBpbnB1dCByZWFkeSBpbnRlcnJ1cHRzOgorCSAqIFNFQ19JUENfSE9TVF9JTlRfTUFTSy5JUENfSU5QVVRfUkVBRFlfSU5UX01BU0sKKwkgKi8KKwltZWlfdHhlX2lucHV0X3JlYWR5X2ludGVycnVwdF9lbmFibGUoZGV2KTsKKworCisJLyogIFNldCB0aGUgU0lDUl9TRUNfSVBDX09VVFBVVF9TVEFUVVMuSVBDX09VVFBVVF9SRUFEWSBiaXQgKi8KKwltZWlfdHhlX291dHB1dF9yZWFkeV9zZXQoaHcpOworCisJLyogU2V0IGJpdCBTSUNSX0hPU1RfSVBDX1JFQURJTkVTUy5IT1NUX1JEWQorCSAqLworCW1laV90eGVfcmVhZGluZXNzX3NldF9ob3N0X3JkeShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVpX3R4ZV9jaGVja19hbmRfYWNrX2ludHJzIC0gdHJhbnNsYXRlIG11bHRpIEJBUiBpbnRlcnJ1cHQgaW50bworICogIHNpbmdsZSBiaXQgbWFzayBhbmQgYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGRvX2FjazogYWNrbm93bGVkZ2UgaW50ZXJydXB0cworICovCitzdGF0aWMgYm9vbCBtZWlfdHhlX2NoZWNrX2FuZF9hY2tfaW50cnMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgYm9vbCBkb19hY2spCit7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJdTMyIGhpc3I7CisJdTMyIGhoaXNyOworCXUzMiBpcGNfaXNyOworCXUzMiBhbGl2ZW5lc3M7CisJYm9vbCBnZW5lcmF0ZWQ7CisKKwkvKiByZWFkIGludGVycnVwdCByZWdpc3RlcnMgKi8KKwloaGlzciA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhISVNSX1JFRyk7CisJZ2VuZXJhdGVkID0gKGhoaXNyICYgSVBDX0hISUVSX01TSyk7CisJaWYgKCFnZW5lcmF0ZWQpCisJCWdvdG8gb3V0OworCisJaGlzciA9IG1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJU1JfUkVHKTsKKworCWFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCWlmIChoaGlzciAmIElQQ19ISElFUl9TRUMgJiYgYWxpdmVuZXNzKQorCQlpcGNfaXNyID0gbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LAorCQkJCVNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX1JFRyk7CisJZWxzZQorCQlpcGNfaXNyID0gMDsKKworCWdlbmVyYXRlZCA9IGdlbmVyYXRlZCB8fAorCQkoaGlzciAmIEhJU1JfSU5UX1NUU19NU0spIHx8CisJCShpcGNfaXNyICYgU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfUEVORElORyk7CisKKwlpZiAoZ2VuZXJhdGVkICYmIGRvX2FjaykgeworCQkvKiBTYXZlIHRoZSBpbnRlcnJ1cHQgY2F1c2VzICovCisJCWh3LT5pbnRyX2NhdXNlIHw9IGhpc3IgJiBISVNSX0lOVF9TVFNfTVNLOworCQlpZiAoaXBjX2lzciAmIFNFQ19JUENfSE9TVF9JTlRfU1RBVFVTX0lOX1JEWSkKKwkJCWh3LT5pbnRyX2NhdXNlIHw9IFRYRV9JTlRSX0lOX1JFQURZOworCisKKwkJbWVpX3R4ZV9pbnRyX2Rpc2FibGUoZGV2KTsKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdHMgaW4gaGllcmFyY2h5OgorCQkgKiBJUEMgYW5kIEJyaWRnZSwgdGhhbiB0aGUgSGlnaCBMZXZlbCAqLworCQltZWlfdHhlX3NlY19yZWdfd3JpdGVfc2lsZW50KGh3LAorCQkJU0VDX0lQQ19IT1NUX0lOVF9TVEFUVVNfUkVHLCBpcGNfaXNyKTsKKwkJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhJU1JfUkVHLCBoaXNyKTsKKwkJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIEhISVNSX1JFRywgaGhpc3IpOworCX0KKworb3V0OgorCXJldHVybiBnZW5lcmF0ZWQ7Cit9CisKKy8qKgorICogbWVpX3R4ZV9pcnFfcXVpY2tfaGFuZGxlciAtIFRoZSBJU1Igb2YgdGhlIE1FSSBkZXZpY2UKKyAqCisgKiBAaXJxOiBUaGUgaXJxIG51bWJlcgorICogQGRldl9pZDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnMgaXJxcmV0dXJuX3QKKyAqLworaXJxcmV0dXJuX3QgbWVpX3R4ZV9pcnFfcXVpY2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGRldl9pZDsKKworCWlmIChtZWlfdHhlX2NoZWNrX2FuZF9hY2tfaW50cnMoZGV2LCB0cnVlKSkKKwkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKworLyoqCisgKiBtZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlciAtIHR4ZSBpbnRlcnJ1cHQgdGhyZWFkCisgKgorICogQGlycTogVGhlIGlycSBudW1iZXIKKyAqIEBkZXZfaWQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zIGlycXJldHVybl90CisgKgorICovCitpcnFyZXR1cm5fdCBtZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbWVpX2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IG1laV90eGVfaHcgKmh3ID0gdG9fdHhlX2h3KGRldik7CisJc3RydWN0IG1laV9jbF9jYiBjb21wbGV0ZV9saXN0OworCXMzMiBzbG90czsKKwlpbnQgcmV0cyA9IDA7CisKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImlycSB0aHJlYWQ6IEludGVycnVwdCBSZWdpc3RlcnMgSEhJU1J8SElTUnxTRUM9JTAyWHwlMDRYfCUwMlhcbiIsCisJCW1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhISVNSX1JFRyksCisJCW1laV90eGVfYnJfcmVnX3JlYWQoaHcsIEhJU1JfUkVHKSwKKwkJbWVpX3R4ZV9zZWNfcmVnX3JlYWRfc2lsZW50KGh3LCBTRUNfSVBDX0hPU1RfSU5UX1NUQVRVU19SRUcpKTsKKworCisJLyogaW5pdGlhbGl6ZSBvdXIgY29tcGxldGUgbGlzdCAqLworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCW1laV9pb19saXN0X2luaXQoJmNvbXBsZXRlX2xpc3QpOworCisJaWYgKHBjaV9kZXZfbXNpX2VuYWJsZWQoZGV2LT5wZGV2KSkKKwkJbWVpX3R4ZV9jaGVja19hbmRfYWNrX2ludHJzKGRldiwgdHJ1ZSk7CisKKwkvKiBzaG93IGlycSBldmVudHMgKi8KKwltZWlfdHhlX3BlbmRpbmdfaW50ZXJydXB0cyhkZXYpOworCisJaHctPmFsaXZlbmVzcyA9IG1laV90eGVfYWxpdmVuZXNzX2dldChkZXYpOworCWh3LT5yZWFkaW5lc3MgPSBtZWlfdHhlX3JlYWRpbmVzc19nZXQoZGV2KTsKKworCS8qIFJlYWRpbmVzczoKKwkgKiBEZXRlY3Rpb24gb2YgVFhFIGRyaXZlciBnb2luZyB0aHJvdWdoIHJlc2V0CisJICogb3IgVFhFIGRyaXZlciByZXNldHRpbmcgdGhlIEhFQ0kgaW50ZXJmYWNlLgorCSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFhFX0lOVFJfUkVBRElORVNTX0JJVCwgJmh3LT5pbnRyX2NhdXNlKSkgeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIlJlYWRpbmVzcyBJbnRlcnJ1cHQgd2FzIHJlY2VpdmVkLi4uXG4iKTsKKworCQkvKiBDaGVjayBpZiBTZUMgaXMgZ29pbmcgdGhyb3VnaCByZXNldCAqLworCQlpZiAobWVpX3R4ZV9yZWFkaW5lc3NfaXNfc2VjX3JkeShody0+cmVhZGluZXNzKSkgeworCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBkZXYuXG4iKTsKKwkJCWRldi0+cmVjdmRfaHdfcmVhZHkgPSB0cnVlOworCQl9IGVsc2UgeworCQkJZGV2LT5yZWN2ZF9od19yZWFkeSA9IGZhbHNlOworCQkJaWYgKGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfUkVTRVRUSU5HKSB7CisKKwkJCQlkZXZfd2FybigmZGV2LT5wZGV2LT5kZXYsICJGVyBub3QgcmVhZHk6IHJlc2V0dGluZy5cbiIpOworCQkJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CisJCQkJZ290byBlbmQ7CisKKwkJCX0KKwkJfQorCQl3YWtlX3VwKCZkZXYtPndhaXRfaHdfcmVhZHkpOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogQ2hlY2sgaW50ZXJydXB0IGNhdXNlOgorCSAqIEFsaXZlbmVzczogRGV0ZWN0aW9uIG9mIFNlQyBhY2tub3dsZWRnZSBvZiBob3N0IHJlcXVlc3QgdGhhdAorCSAqIGl0IHJlbWFpbiBhbGl2ZSBvciBob3N0IGNhbmNlbGxhdGlvbiBvZiB0aGF0IHJlcXVlc3QuCisJICovCisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRYRV9JTlRSX0FMSVZFTkVTU19CSVQsICZody0+aW50cl9jYXVzZSkpIHsKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSAqLworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKKwkJCSJBbGl2ZW5lc3MgSW50ZXJydXB0OiBTdGF0dXM6ICVkXG4iLCBody0+YWxpdmVuZXNzKTsKKwkJaHctPnJlY3ZkX2FsaXZlbmVzcyA9IHRydWU7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZody0+d2FpdF9hbGl2ZW5lc3MpKQorCQkJd2FrZV91cCgmaHctPndhaXRfYWxpdmVuZXNzKTsKKwl9CisKKworCS8qIE91dHB1dCBEb29yYmVsbDoKKwkgKiBEZXRlY3Rpb24gb2YgU2VDIGhhdmluZyBzZW50IG91dHB1dCB0byBob3N0CisJICovCisJc2xvdHMgPSBtZWlfY291bnRfZnVsbF9yZWFkX3Nsb3RzKGRldik7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUWEVfSU5UUl9PVVRfREJfQklULCAmaHctPmludHJfY2F1c2UpKSB7CisJCS8qIFJlYWQgZnJvbSBUWEUgKi8KKwkJcmV0cyA9IG1laV9pcnFfcmVhZF9oYW5kbGVyKGRldiwgJmNvbXBsZXRlX2xpc3QsICZzbG90cyk7CisJCWlmIChyZXRzICYmIGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfUkVTRVRUSU5HKSB7CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKKwkJCQkibWVpX2lycV9yZWFkX2hhbmRsZXIgcmV0ID0gJWQuXG4iLCByZXRzKTsKKworCQkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorCS8qIElucHV0IFJlYWR5OiBEZXRlY3Rpb24gaWYgaG9zdCBjYW4gd3JpdGUgdG8gU2VDICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUWEVfSU5UUl9JTl9SRUFEWV9CSVQsICZody0+aW50cl9jYXVzZSkpIHsKKwkJZGV2LT5oYnVmX2lzX3JlYWR5ID0gdHJ1ZTsKKwkJaHctPnNsb3RzID0gZGV2LT5oYnVmX2RlcHRoOworCX0KKworCWlmIChody0+YWxpdmVuZXNzICYmIGRldi0+aGJ1Zl9pc19yZWFkeSkgeworCQkvKiBnZXQgdGhlIHJlYWwgcmVnaXN0ZXIgdmFsdWUgKi8KKwkJZGV2LT5oYnVmX2lzX3JlYWR5ID0gbWVpX2hidWZfaXNfcmVhZHkoZGV2KTsKKwkJcmV0cyA9IG1laV9pcnFfd3JpdGVfaGFuZGxlcihkZXYsICZjb21wbGV0ZV9saXN0KTsKKwkJaWYgKHJldHMgJiYgcmV0cyAhPSAtRU1TR1NJWkUpCisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIm1laV9pcnFfd3JpdGVfaGFuZGxlciByZXQgPSAlZC5cbiIsCisJCQkJcmV0cyk7CisJCWRldi0+aGJ1Zl9pc19yZWFkeSA9IG1laV9oYnVmX2lzX3JlYWR5KGRldik7CisJfQorCisJbWVpX2lycV9jb21wbF9oYW5kbGVyKGRldiwgJmNvbXBsZXRlX2xpc3QpOworCitlbmQ6CisJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJpbnRlcnJ1cHQgdGhyZWFkIGVuZCByZXQgPSAlZFxuIiwgcmV0cyk7CisKKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJbWVpX2VuYWJsZV9pbnRlcnJ1cHRzKGRldik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1laV9od19vcHMgbWVpX3R4ZV9od19vcHMgPSB7CisKKwkuaG9zdF9pc19yZWFkeSA9IG1laV90eGVfaG9zdF9pc19yZWFkeSwKKworCS5od19pc19yZWFkeSA9IG1laV90eGVfaHdfaXNfcmVhZHksCisJLmh3X3Jlc2V0ID0gbWVpX3R4ZV9od19yZXNldCwKKwkuaHdfY29uZmlnID0gbWVpX3R4ZV9od19jb25maWcsCisJLmh3X3N0YXJ0ID0gbWVpX3R4ZV9od19zdGFydCwKKworCS5pbnRyX2NsZWFyID0gbWVpX3R4ZV9pbnRyX2NsZWFyLAorCS5pbnRyX2VuYWJsZSA9IG1laV90eGVfaW50cl9lbmFibGUsCisJLmludHJfZGlzYWJsZSA9IG1laV90eGVfaW50cl9kaXNhYmxlLAorCisJLmhidWZfZnJlZV9zbG90cyA9IG1laV90eGVfaGJ1Zl9lbXB0eV9zbG90cywKKwkuaGJ1Zl9pc19yZWFkeSA9IG1laV90eGVfaXNfaW5wdXRfcmVhZHksCisJLmhidWZfbWF4X2xlbiA9IG1laV90eGVfaGJ1Zl9tYXhfbGVuLAorCisJLndyaXRlID0gbWVpX3R4ZV93cml0ZSwKKworCS5yZGJ1Zl9mdWxsX3Nsb3RzID0gbWVpX3R4ZV9jb3VudF9mdWxsX3JlYWRfc2xvdHMsCisJLnJlYWRfaGRyID0gbWVpX3R4ZV9yZWFkX2hkciwKKworCS5yZWFkID0gbWVpX3R4ZV9yZWFkLAorCit9OworCisvKioKKyAqIG1laV90eGVfZGV2X2luaXQgLSBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHR4ZSBoYXJkd2FyZSBzcGVjaWZpYyBzdHJ1Y3R1cmUKKyAqCisgKiBAcGRldiAtIHBjaSBkZXZpY2UKKyAqIHJldHVybnMgc3RydWN0IG1laV9kZXZpY2UgKiBvbiBzdWNjZXNzIG9yIE5VTEw7CisgKgorICovCitzdHJ1Y3QgbWVpX2RldmljZSAqbWVpX3R4ZV9kZXZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OworCXN0cnVjdCBtZWlfdHhlX2h3ICpodzsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtZWlfZGV2aWNlKSArCisJCQkgc2l6ZW9mKHN0cnVjdCBtZWlfdHhlX2h3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJbWVpX2RldmljZV9pbml0KGRldik7CisKKwlodyA9IHRvX3R4ZV9odyhkZXYpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaHctPndhaXRfYWxpdmVuZXNzKTsKKworCWRldi0+b3BzID0gJm1laV90eGVfaHdfb3BzOworCisJZGV2LT5wZGV2ID0gcGRldjsKKwlyZXR1cm4gZGV2OworfQorCisvKioKKyAqIG1laV90eGVfc2V0dXBfc2F0dDIgLSBTQVRUMiBjb25maWd1cmF0aW9uIGZvciBETUEgc3VwcG9ydC4KKyAqCisgKiBAZGV2OiAgIHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYWRkcjogIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgb2YgdGhlIHJhbmdlCisgKiBAcmFuZ2U6IHBoeXNpY2FsIHJhbmdlIHNpemUKKyAqLworaW50IG1laV90eGVfc2V0dXBfc2F0dDIoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgYWRkciwgdTMyIHJhbmdlKQoreworCXN0cnVjdCBtZWlfdHhlX2h3ICpodyA9IHRvX3R4ZV9odyhkZXYpOworCisJdTMyIGxvMzIgPSBsb3dlcl8zMl9iaXRzKGFkZHIpOworCXUzMiBoaTMyID0gdXBwZXJfMzJfYml0cyhhZGRyKTsKKwl1MzIgY3RybDsKKworCS8qIFNBVFQgaXMgbGltaXRlZCB0byAzNiBCaXRzICovCisJaWYgKGhpMzIgJiB+MHhGKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNBVFQgaGFzIHRvIGJlIDE2Qnl0ZSBhbGlnbmVkICovCisJaWYgKGxvMzIgJiAweEYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU0FUVCByYW5nZSBoYXMgdG8gYmUgNEJ5dGVzIGFsaWduZWQgKi8KKwlpZiAocmFuZ2UgJiAweDQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU0FUVCBpcyBsaW1pdGVkIHRvIDMyIE1CIHJhbmdlKi8KKwlpZiAocmFuZ2UgPiBTQVRUX1JBTkdFX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdHJsID0gU0FUVDJfQ1RSTF9WQUxJRF9NU0s7CisJY3RybCB8PSBoaTMyICA8PCBTQVRUMl9DVFJMX0JSX0JBU0VfQUREUl9SRUdfU0hJRlQ7CisKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgU0FUVDJfU0FQX1NJWkVfUkVHLCByYW5nZSk7CisJbWVpX3R4ZV9icl9yZWdfd3JpdGUoaHcsIFNBVFQyX0JSR19CQV9MU0JfUkVHLCBsbzMyKTsKKwltZWlfdHhlX2JyX3JlZ193cml0ZShodywgU0FUVDJfQ1RSTF9SRUcsIGN0cmwpOworCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiU0FUVDI6IFNBUF9TSVpFX09GRlNFVD0weCUwOFgsIEJSR19CQV9MU0JfT0ZGU0VUPTB4JTA4WCwgQ1RSTF9PRkZTRVQ9MHglMDhYXG4iLAorCQlyYW5nZSwgbG8zMiwgY3RybCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmggYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTJkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKgorICogSW50ZWwgTWFuYWdlbWVudCBFbmdpbmUgSW50ZXJmYWNlIChJbnRlbCBNRUkpIExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTUVJX0hXX1RYRV9IXworI2RlZmluZSBfTUVJX0hXX1RYRV9IXworCisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisKKyNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgImh3LXR4ZS1yZWdzLmgiCisKKy8qIEZsYXR0ZW4gSGllcmFyY2h5IGludGVycnVwdCBjYXVzZSAqLworI2RlZmluZSBUWEVfSU5UUl9SRUFESU5FU1NfQklUICAwIC8qIEhJU1JfSU5UXzBfU1RTICovCisjZGVmaW5lIFRYRV9JTlRSX1JFQURJTkVTUyAgICAgIEhJU1JfSU5UXzBfU1RTCisjZGVmaW5lIFRYRV9JTlRSX0FMSVZFTkVTU19CSVQgIDEgLyogSElTUl9JTlRfMV9TVFMgKi8KKyNkZWZpbmUgVFhFX0lOVFJfQUxJVkVORVNTICAgICAgSElTUl9JTlRfMV9TVFMKKyNkZWZpbmUgVFhFX0lOVFJfT1VUX0RCX0JJVCAgICAgMiAvKiBISVNSX0lOVF8yX1NUUyAqLworI2RlZmluZSBUWEVfSU5UUl9PVVRfREIgICAgICAgICBISVNSX0lOVF8yX1NUUworI2RlZmluZSBUWEVfSU5UUl9JTl9SRUFEWV9CSVQgICA4IC8qIGJleW9uZCBISVNSICovCisjZGVmaW5lIFRYRV9JTlRSX0lOX1JFQURZICAgICAgIEJJVCg4KQorCisvKioKKyAqIHN0cnVjdCBtZWlfdHhlX2h3IC0gdHhlIGhhcmR3YXJlIHNwZWNpZmljcworICoKKyAqIEBtZW1fYWRkcjogICAgICAgIFNlQyBhbmQgQlJJREdFIGJhcnMKKyAqIEBhbGl2ZW5lc3M6ICAgICAgIGFsaXZlbmVzcyAocG93ZXIgZ2F0aW5nKSBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUKKyAqIEByZWFkaW5lc3M6ICAgICAgIHJlYWRpbmVzcyBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUKKyAqIEB3YWl0X2FsaXZlbmVzczogIGFsaXZlbmVzcyB3YWl0IHF1ZXVlCisgKiBAcmVjdmRfYWxpdmVuZXNzOiBhbGl2ZW5lc3MgaW50ZXJydXB0IHdhcyByZWNpdmVkCisgKiBAaW50cl9jYXVzZTogICAgICB0cmFuc2xhdGVkIGludGVycnVwdCBjYXVzZQorICovCitzdHJ1Y3QgbWVpX3R4ZV9odyB7CisJdm9pZCBfX2lvbWVtICptZW1fYWRkcltOVU1fT0ZfTUVNX0JBUlNdOworCXUzMiBhbGl2ZW5lc3M7CisJdTMyIHJlYWRpbmVzczsKKwl1MzIgc2xvdHM7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2FsaXZlbmVzczsKKwlib29sIHJlY3ZkX2FsaXZlbmVzczsKKworCXVuc2lnbmVkIGxvbmcgaW50cl9jYXVzZTsKK307CisKKyNkZWZpbmUgdG9fdHhlX2h3KGRldikgKHN0cnVjdCBtZWlfdHhlX2h3ICopKChkZXYpLT5odykKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVpX2RldmljZSAqaHdfdHhlX3RvX21laShzdHJ1Y3QgbWVpX3R4ZV9odyAqaHcpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKWh3LCBzdHJ1Y3QgbWVpX2RldmljZSwgaHcpOworfQorCitzdHJ1Y3QgbWVpX2RldmljZSAqbWVpX3R4ZV9kZXZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKK2lycXJldHVybl90IG1laV90eGVfaXJxX3F1aWNrX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK2lycXJldHVybl90IG1laV90eGVfaXJxX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKK2ludCBtZWlfdHhlX2FsaXZlbmVzc19zZXRfc3luYyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCB1MzIgcmVxKTsKKworaW50IG1laV90eGVfc2V0dXBfc2F0dDIoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgYWRkciwgdTMyIHJhbmdlKTsKKworCisjZW5kaWYgLyogX01FSV9IV19UWEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHcuaCBiL2RyaXZlcnMvbWlzYy9tZWkvaHcuaAppbmRleCBkZDQ0ZTMzLi42YjQ3NmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2h3LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9ody5oCkBAIC0yMiw3ICsyMiw3IEBACiAvKgogICogVGltZW91dHMgaW4gU2Vjb25kcwogICovCi0jZGVmaW5lIE1FSV9JTlRFUk9QX1RJTUVPVVQgICAgICAgICA3ICAvKiBUaW1lb3V0IG9uIHJlYWR5IG1lc3NhZ2UgKi8KKyNkZWZpbmUgTUVJX0hXX1JFQURZX1RJTUVPVVQgICAgICAgIDIgIC8qIFRpbWVvdXQgb24gcmVhZHkgbWVzc2FnZSAqLwogI2RlZmluZSBNRUlfQ09OTkVDVF9USU1FT1VUICAgICAgICAgMyAgLyogSFBTOiBhdCBsZWFzdCAyIHNlY29uZHMgKi8KIAogI2RlZmluZSBNRUlfQ0xfQ09OTkVDVF9USU1FT1VUICAgICAxNSAgLyogSFBTOiBDbGllbnQgQ29ubmVjdCBUaW1lb3V0ICovCkBAIC0zMSwxMyArMzEsMTMgQEAKICNkZWZpbmUgTUVJX0lBTVRISUZfU1RBTExfVElNRVIgICAgMTIgIC8qIEhQUyAqLwogI2RlZmluZSBNRUlfSUFNVEhJRl9SRUFEX1RJTUVSICAgICAxMCAgLyogSFBTICovCiAKKyNkZWZpbmUgTUVJX0hCTV9USU1FT1VUICAgICAgICAgICAgMSAgIC8qIDEgc2Vjb25kICovCiAKIC8qCiAgKiBNRUkgVmVyc2lvbgogICovCiAjZGVmaW5lIEhCTV9NSU5PUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgSEJNX01BSk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBIQk1fVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIDEgc2Vjb25kICovCiAKIC8qIEhvc3QgYnVzIG1lc3NhZ2UgY29tbWFuZCBvcGNvZGUgKi8KICNkZWZpbmUgTUVJX0hCTV9DTURfT1BfTVNLICAgICAgICAgICAgICAgICAgMHg3ZgpAQCAtODksMTkgKzg5LDE5IEBACiAgKiBDbGllbnQgQ29ubmVjdCBTdGF0dXMKICAqIHVzZWQgYnkgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlLnN0YXR1cwogICovCi1lbnVtIGNsaWVudF9jb25uZWN0X3N0YXR1c190eXBlcyB7Ci0JQ0NTX1NVQ0NFU1MgPSAweDAwLAotCUNDU19OT1RfRk9VTkQgPSAweDAxLAotCUNDU19BTFJFQURZX1NUQVJURUQgPSAweDAyLAotCUNDU19PVVRfT0ZfUkVTT1VSQ0VTID0gMHgwMywKLQlDQ1NfTUVTU0FHRV9TTUFMTCA9IDB4MDQKK2VudW0gbWVpX2NsX2Nvbm5lY3Rfc3RhdHVzIHsKKwlNRUlfQ0xfQ09OTl9TVUNDRVNTICAgICAgICAgID0gMHgwMCwKKwlNRUlfQ0xfQ09OTl9OT1RfRk9VTkQgICAgICAgID0gMHgwMSwKKwlNRUlfQ0xfQ09OTl9BTFJFQURZX1NUQVJURUQgID0gMHgwMiwKKwlNRUlfQ0xfQ09OTl9PVVRfT0ZfUkVTT1VSQ0VTID0gMHgwMywKKwlNRUlfQ0xfQ09OTl9NRVNTQUdFX1NNQUxMICAgID0gMHgwNAogfTsKIAogLyoKICAqIENsaWVudCBEaXNjb25uZWN0IFN0YXR1cwogICovCi1lbnVtIGNsaWVudF9kaXNjb25uZWN0X3N0YXR1c190eXBlcyB7Ci0JQ0RTX1NVQ0NFU1MgPSAweDAwCitlbnVtICBtZWlfY2xfZGlzY29ubmVjdF9zdGF0dXMgeworCU1FSV9DTF9ESVNDT05OX1NVQ0NFU1MgPSAweDAwCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9pbml0LmMgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwppbmRleCBjZGQzMWMyLi40NDYwOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2luaXQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwpAQCAtMTE2LDcgKzExNiw2IEBACiAJCW1laV9jbF91bmxpbmsoJmRldi0+d2RfY2wpOwogCQltZWlfY2xfdW5saW5rKCZkZXYtPmlhbXRoaWZfY2wpOwogCQltZWlfYW10aGlmX3Jlc2V0X3BhcmFtcyhkZXYpOwotCQltZW1zZXQoJmRldi0+d3JfZXh0X21zZywgMCwgc2l6ZW9mKGRldi0+d3JfZXh0X21zZykpOwogCX0KIAogCkBAIC0xMjYsNyArMTI1LDYgQEAKIAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJod19yZXNldCBmYWlsZWQgcmV0ID0gJWRcbiIsIHJldCk7Ci0JCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9ESVNBQkxFRDsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTEzOSw3ICsxMzcsNiBAQAogCXJldCA9IG1laV9od19zdGFydChkZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJod19zdGFydCBmYWlsZWQgcmV0ID0gJWRcbiIsIHJldCk7Ci0JCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9ESVNBQkxFRDsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE0OSw3ICsxNDYsNyBAQAogCXJldCA9IG1laV9oYm1fc3RhcnRfcmVxKGRldik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImhibV9zdGFydCBmYWlsZWQgcmV0ID0gJWRcbiIsIHJldCk7Ci0JCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9ESVNBQkxFRDsKKwkJZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX1JFU0VUVElORzsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE2Niw2ICsxNjMsNyBAQAogICovCiBpbnQgbWVpX3N0YXJ0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CisJaW50IHJldDsKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAogCS8qIGFja25vd2xlZGdlIGludGVycnVwdCBhbmQgc3RvcCBpbnRlcnJ1cHRzICovCkBAIC0xNzUsMTAgKzE3MywxOCBAQAogCiAJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJyZXNldCBpbiBzdGFydCB0aGUgbWVpIGRldmljZS5cbiIpOwogCi0JZGV2LT5kZXZfc3RhdGUgPSBNRUlfREVWX0lOSVRJQUxJWklORzsKIAlkZXYtPnJlc2V0X2NvdW50ID0gMDsKLQltZWlfcmVzZXQoZGV2KTsKKwlkbyB7CisJCWRldi0+ZGV2X3N0YXRlID0gTUVJX0RFVl9JTklUSUFMSVpJTkc7CisJCXJldCA9IG1laV9yZXNldChkZXYpOwogCisJCWlmIChyZXQgPT0gLUVOT0RFViB8fCBkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKSB7CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInJlc2V0IGZhaWxlZCByZXQgPSAlZCIsIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gd2hpbGUgKHJldCk7CisKKwkvKiB3ZSBjYW5ub3Qgc3RhcnQgdGhlIGRldmljZSB3L28gaGJtIHN0YXJ0IG1lc3NhZ2UgY29tcGxldGVkICovCiAJaWYgKGRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRElTQUJMRUQpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJyZXNldCBmYWlsZWQiKTsKIAkJZ290byBlcnI7CkBAIC0yMzgsMjcgKzI0NCw0MCBAQAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAotCWlmIChlcnIgfHwgZGV2LT5kZXZfc3RhdGUgPT0gTUVJX0RFVl9ESVNBQkxFRCkKKwlpZiAoZXJyID09IC1FTk9ERVYgfHwgZGV2LT5kZXZfc3RhdGUgPT0gTUVJX0RFVl9ESVNBQkxFRCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImRldmljZSBkaXNhYmxlZCA9ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiB0cnkgdG8gc3RhcnQgYWdhaW4gKi8KKwlpZiAoZXJyKQorCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOworCiAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1laV9yZXN0YXJ0KTsKIAotCiBzdGF0aWMgdm9pZCBtZWlfcmVzZXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWVpX2RldmljZSwgIHJlc2V0X3dvcmspOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAotCW1laV9yZXNldChkZXYpOworCXJldCA9IG1laV9yZXNldChkZXYpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAotCWlmIChkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKQotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInJlc2V0IGZhaWxlZCIpOworCWlmIChkZXYtPmRldl9zdGF0ZSA9PSBNRUlfREVWX0RJU0FCTEVEKSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZGV2aWNlIGRpc2FibGVkID0gJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXRyeSByZXNldCBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KKwlpZiAocmV0KQorCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOwogfQogCiB2b2lkIG1laV9zdG9wKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCkBAIC0yNjksNiArMjg4LDggQEAKIAogCW1laV9uZmNfaG9zdF9leGl0KGRldik7CiAKKwltZWlfY2xfYnVzX3JlbW92ZV9kZXZpY2VzKGRldik7CisKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAogCW1laV93ZF9zdG9wKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jIGIvZHJpdmVycy9taXNjL21laS9pbnRlcnJ1cHQuYwppbmRleCBmMGZiYjUxLi4yOWI1YWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaW50ZXJydXB0LmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgogCiAKQEAgLTE2MSwyOSArMTYwLDYzIEBACiB9CiAKIC8qKgorICogbWVpX2NsX2lycV9kaXNjb25uZWN0X3JzcCAtIHNlbmQgZGlzY29ubmVjdGlvbiByZXNwb25zZSBtZXNzYWdlCisgKgorICogQGNsOiBjbGllbnQKKyAqIEBjYjogY2FsbGJhY2sgYmxvY2suCisgKiBAY21wbF9saXN0OiBjb21wbGV0ZSBsaXN0LgorICoKKyAqIHJldHVybnMgMCwgT0s7IG90aGVyd2lzZSwgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbWVpX2NsX2lycV9kaXNjb25uZWN0X3JzcChzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCisJCQkJICAgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCit7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CisJdTMyIG1zZ19zbG90czsKKwlpbnQgc2xvdHM7CisJaW50IHJldDsKKworCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKKwltc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSkpOworCisJaWYgKHNsb3RzIDwgbXNnX3Nsb3RzKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJcmV0ID0gbWVpX2hibV9jbF9kaXNjb25uZWN0X3JzcChkZXYsIGNsKTsKKworCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RFRDsKKwljbC0+c3RhdHVzID0gMDsKKwlsaXN0X2RlbCgmY2ItPmxpc3QpOworCW1laV9pb19jYl9mcmVlKGNiKTsKKworCXJldHVybiByZXQ7Cit9CisKKworCisvKioKICAqIG1laV9jbF9pcnFfY2xvc2UgLSBwcm9jZXNzZXMgY2xvc2UgcmVsYXRlZCBvcGVyYXRpb24gZnJvbQogICoJaW50ZXJydXB0IHRocmVhZCBjb250ZXh0IC0gc2VuZCBkaXNjb25uZWN0IHJlcXVlc3QKICAqCiAgKiBAY2w6IGNsaWVudAogICogQGNiOiBjYWxsYmFjayBibG9jay4KLSAqIEBzbG90czogZnJlZSBzbG90cy4KICAqIEBjbXBsX2xpc3Q6IGNvbXBsZXRlIGxpc3QuCiAgKgogICogcmV0dXJucyAwLCBPSzsgb3RoZXJ3aXNlLCBlcnJvci4KICAqLwogc3RhdGljIGludCBtZWlfY2xfaXJxX2Nsb3NlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKLQkJCXMzMiAqc2xvdHMsIHN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCkKKwkJCSAgICBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CisJdTMyIG1zZ19zbG90czsKKwlpbnQgc2xvdHM7CiAKLQl1MzIgbXNnX3Nsb3RzID0KLQkJbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCkpOworCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3JlcXVlc3QpKTsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CiAKLQlpZiAoKnNsb3RzIDwgbXNnX3Nsb3RzKQorCWlmIChzbG90cyA8IG1zZ19zbG90cykKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAotCSpzbG90cyAtPSBtc2dfc2xvdHM7Ci0KIAlpZiAobWVpX2hibV9jbF9kaXNjb25uZWN0X3JlcShkZXYsIGNsKSkgewogCQljbC0+c3RhdHVzID0gMDsKIAkJY2ItPmJ1Zl9pZHggPSAwOwpAQCAtMjA3LDI3ICsyNDAsMjMgQEAKICAqCiAgKiBAY2w6IGNsaWVudAogICogQGNiOiBjYWxsYmFjayBibG9jay4KLSAqIEBzbG90czogZnJlZSBzbG90cy4KICAqIEBjbXBsX2xpc3Q6IGNvbXBsZXRlIGxpc3QuCiAgKgogICogcmV0dXJucyAwLCBPSzsgb3RoZXJ3aXNlLCBlcnJvci4KICAqLwogc3RhdGljIGludCBtZWlfY2xfaXJxX3JlYWQoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJICAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQorCQkJICAgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwotCXUzMiBtc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9mbG93X2NvbnRyb2wpKTsKLQorCXUzMiBtc2dfc2xvdHM7CisJaW50IHNsb3RzOwogCWludCByZXQ7CiAKKwltc2dfc2xvdHMgPSBtZWlfZGF0YTJzbG90cyhzaXplb2Yoc3RydWN0IGhibV9mbG93X2NvbnRyb2wpKTsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CiAKLQlpZiAoKnNsb3RzIDwgbXNnX3Nsb3RzKSB7Ci0JCS8qIHJldHVybiB0aGUgY2FuY2VsIHJvdXRpbmUgKi8KLQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwlpZiAoc2xvdHMgPCBtc2dfc2xvdHMpCiAJCXJldHVybiAtRU1TR1NJWkU7Ci0JfQotCi0JKnNsb3RzIC09IG1zZ19zbG90czsKIAogCXJldCA9IG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKTsKIAlpZiAocmV0KSB7CkBAIC0yNDQsMzIgKzI3MywzMCBAQAogCiAKIC8qKgotICogbWVpX2NsX2lycV9pb2N0bCAtIHByb2Nlc3NlcyBjbGllbnQgaW9jdGwgcmVsYXRlZCBvcGVyYXRpb24gZnJvbSB0aGUKLSAqCWludGVycnVwdCB0aHJlYWQgY29udGV4dCAtICAgc2VuZCBjb25uZWN0aW9uIHJlcXVlc3QKKyAqIG1laV9jbF9pcnFfY29ubmVjdCAtIHNlbmQgY29ubmVjdCByZXF1ZXN0IGluIGlycV90aHJlYWQgY29udGV4dAogICoKICAqIEBjbDogY2xpZW50CiAgKiBAY2I6IGNhbGxiYWNrIGJsb2NrLgotICogQHNsb3RzOiBmcmVlIHNsb3RzLgogICogQGNtcGxfbGlzdDogY29tcGxldGUgbGlzdC4KICAqCiAgKiByZXR1cm5zIDAsIE9LOyBvdGhlcndpc2UsIGVycm9yLgogICovCi1zdGF0aWMgaW50IG1laV9jbF9pcnFfaW9jdGwoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAotCQkJICAgczMyICpzbG90cywgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQorc3RhdGljIGludCBtZWlfY2xfaXJxX2Nvbm5lY3Qoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiLAorCQkJICAgICAgc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0KQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OworCXUzMiBtc2dfc2xvdHM7CisJaW50IHNsb3RzOwogCWludCByZXQ7CiAKLQl1MzIgbXNnX3Nsb3RzID0KLQkJbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCkpOworCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3JlcXVlc3QpKTsKKwlzbG90cyA9IG1laV9oYnVmX2VtcHR5X3Nsb3RzKGRldik7CiAKLQlpZiAoKnNsb3RzIDwgbXNnX3Nsb3RzKSB7Ci0JCS8qIHJldHVybiB0aGUgY2FuY2VsIHJvdXRpbmUgKi8KLQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwlpZiAobWVpX2NsX2lzX290aGVyX2Nvbm5lY3RpbmcoY2wpKQorCQlyZXR1cm4gMDsKKworCWlmIChzbG90cyA8IG1zZ19zbG90cykKIAkJcmV0dXJuIC1FTVNHU0laRTsKLQl9Ci0KLQkqc2xvdHMgLT0gIG1zZ19zbG90czsKIAogCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0NPTk5FQ1RJTkc7CiAKQEAgLTMyMyw3ICszNTAsNyBAQAogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImxlc3MgZGF0YSBhdmFpbGFibGUgdGhhbiBsZW5ndGg9JTA4eC5cbiIsCiAJCQkJKnNsb3RzKTsKIAkJLyogd2UgY2FuJ3QgcmVhZCB0aGUgbWVzc2FnZSAqLwotCQlyZXQgPSAtRVJBTkdFOworCQlyZXQgPSAtRU5PREFUQTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC00MDksMTAgKzQzNiwxMCBAQAogCXMzMiBzbG90czsKIAlpbnQgcmV0OwogCi0JaWYgKCFtZWlfaGJ1Zl9pc19yZWFkeShkZXYpKSB7Ci0JCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiaG9zdCBidWZmZXIgaXMgbm90IGVtcHR5LlxuIik7CisKKwlpZiAoIW1laV9oYnVmX2FjcXVpcmUoZGV2KSkKIAkJcmV0dXJuIDA7Ci0JfQorCiAJc2xvdHMgPSBtZWlfaGJ1Zl9lbXB0eV9zbG90cyhkZXYpOwogCWlmIChzbG90cyA8PSAwKQogCQlyZXR1cm4gLUVNU0dTSVpFOwpAQCAtNDQ3LDI5ICs0NzQsMTYgQEAKIAogCWlmIChkZXYtPndkX3N0YXRlID09IE1FSV9XRF9TVE9QUElORykgewogCQlkZXYtPndkX3N0YXRlID0gTUVJX1dEX0lETEU7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0X3N0b3Bfd2QpOworCQl3YWtlX3VwKCZkZXYtPndhaXRfc3RvcF93ZCk7CiAJfQogCi0JaWYgKGRldi0+d3JfZXh0X21zZy5oZHIubGVuZ3RoKSB7Ci0JCW1laV93cml0ZV9tZXNzYWdlKGRldiwgJmRldi0+d3JfZXh0X21zZy5oZHIsCi0JCQkJZGV2LT53cl9leHRfbXNnLmRhdGEpOwotCQlzbG90cyAtPSBtZWlfZGF0YTJzbG90cyhkZXYtPndyX2V4dF9tc2cuaGRyLmxlbmd0aCk7Ci0JCWRldi0+d3JfZXh0X21zZy5oZHIubGVuZ3RoID0gMDsKLQl9Ci0JaWYgKGRldi0+ZGV2X3N0YXRlID09IE1FSV9ERVZfRU5BQkxFRCkgeworCWlmIChtZWlfY2xfaXNfY29ubmVjdGVkKCZkZXYtPndkX2NsKSkgewogCQlpZiAoZGV2LT53ZF9wZW5kaW5nICYmCiAJCSAgICBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKCZkZXYtPndkX2NsKSA+IDApIHsKLQkJCWlmIChtZWlfd2Rfc2VuZChkZXYpKQotCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAid2Qgc2VuZCBmYWlsZWQuXG4iKTsKLQkJCWVsc2UgaWYgKG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKCZkZXYtPndkX2NsKSkKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQorCQkJcmV0ID0gbWVpX3dkX3NlbmQoZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKIAkJCWRldi0+d2RfcGVuZGluZyA9IGZhbHNlOwotCi0JCQlpZiAoZGV2LT53ZF9zdGF0ZSA9PSBNRUlfV0RfUlVOTklORykKLQkJCQlzbG90cyAtPSBtZWlfZGF0YTJzbG90cyhNRUlfV0RfU1RBUlRfTVNHX1NJWkUpOwotCQkJZWxzZQotCQkJCXNsb3RzIC09IG1laV9kYXRhMnNsb3RzKE1FSV9XRF9TVE9QX01TR19TSVpFKTsKIAkJfQogCX0KIApAQCAtNDg0LDI4ICs0OTgsMzEgQEAKIAkJc3dpdGNoIChjYi0+Zm9wX3R5cGUpIHsKIAkJY2FzZSBNRUlfRk9QX0NMT1NFOgogCQkJLyogc2VuZCBkaXNjb25uZWN0IG1lc3NhZ2UgKi8KLQkJCXJldCA9IG1laV9jbF9pcnFfY2xvc2UoY2wsIGNiLCAmc2xvdHMsIGNtcGxfbGlzdCk7CisJCQlyZXQgPSBtZWlfY2xfaXJxX2Nsb3NlKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJYnJlYWs7CiAJCWNhc2UgTUVJX0ZPUF9SRUFEOgogCQkJLyogc2VuZCBmbG93IGNvbnRyb2wgbWVzc2FnZSAqLwotCQkJcmV0ID0gbWVpX2NsX2lycV9yZWFkKGNsLCBjYiwgJnNsb3RzLCBjbXBsX2xpc3QpOworCQkJcmV0ID0gbWVpX2NsX2lycV9yZWFkKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJYnJlYWs7Ci0JCWNhc2UgTUVJX0ZPUF9JT0NUTDoKKwkJY2FzZSBNRUlfRk9QX0NPTk5FQ1Q6CiAJCQkvKiBjb25uZWN0IG1lc3NhZ2UgKi8KLQkJCWlmIChtZWlfY2xfaXNfb3RoZXJfY29ubmVjdGluZyhjbCkpCi0JCQkJY29udGludWU7Ci0JCQlyZXQgPSBtZWlfY2xfaXJxX2lvY3RsKGNsLCBjYiwgJnNsb3RzLCBjbXBsX2xpc3QpOworCQkJcmV0ID0gbWVpX2NsX2lycV9jb25uZWN0KGNsLCBjYiwgY21wbF9saXN0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJYnJlYWs7Ci0KKwkJY2FzZSBNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQOgorCQkJLyogc2VuZCBkaXNjb25uZWN0IHJlc3AgKi8KKwkJCXJldCA9IG1laV9jbF9pcnFfZGlzY29ubmVjdF9yc3AoY2wsIGNiLCBjbXBsX2xpc3QpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQpAQCAtNTE4LDExICs1MzUsOSBAQAogCQlpZiAoY2wgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkKLQkJCXJldCA9IG1laV9hbXRoaWZfaXJxX3dyaXRlX2NvbXBsZXRlKGNsLCBjYiwKLQkJCQkJCSZzbG90cywgY21wbF9saXN0KTsKKwkJCXJldCA9IG1laV9hbXRoaWZfaXJxX3dyaXRlKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJZWxzZQotCQkJcmV0ID0gbWVpX2NsX2lycV93cml0ZV9jb21wbGV0ZShjbCwgY2IsCi0JCQkJCQkmc2xvdHMsIGNtcGxfbGlzdCk7CisJCQlyZXQgPSBtZWlfY2xfaXJxX3dyaXRlKGNsLCBjYiwgY21wbF9saXN0KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNTQxLDggKzU1Niw3IEBACiB2b2lkIG1laV90aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCXN0cnVjdCBtZWlfY2wgKmNsX3BvcyA9IE5VTEw7Ci0Jc3RydWN0IG1laV9jbCAqY2xfbmV4dCA9IE5VTEw7CisJc3RydWN0IG1laV9jbCAqY2w7CiAJc3RydWN0IG1laV9jbF9jYiAgKmNiX3BvcyA9IE5VTEw7CiAJc3RydWN0IG1laV9jbF9jYiAgKmNiX25leHQgPSBOVUxMOwogCkBAIC01NzAsOSArNTg0LDkgQEAKIAkJZ290byBvdXQ7CiAKIAkvKioqIGNvbm5lY3QvZGlzY29ubmVjdCB0aW1lb3V0cyAqKiovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsX3BvcywgY2xfbmV4dCwgJmRldi0+ZmlsZV9saXN0LCBsaW5rKSB7Ci0JCWlmIChjbF9wb3MtPnRpbWVyX2NvdW50KSB7Ci0JCQlpZiAoLS1jbF9wb3MtPnRpbWVyX2NvdW50ID09IDApIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5maWxlX2xpc3QsIGxpbmspIHsKKwkJaWYgKGNsLT50aW1lcl9jb3VudCkgeworCQkJaWYgKC0tY2wtPnRpbWVyX2NvdW50ID09IDApIHsKIAkJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgInRpbWVyOiBjb25uZWN0L2Rpc2Nvbm5lY3QgdGltZW91dC5cbiIpOwogCQkJCW1laV9yZXNldChkZXYpOwogCQkJCWdvdG8gb3V0OwpAQCAtNTgwLDYgKzU5NCw5IEBACiAJCX0KIAl9CiAKKwlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoJmRldi0+aWFtdGhpZl9jbCkpCisJCWdvdG8gb3V0OworCiAJaWYgKGRldi0+aWFtdGhpZl9zdGFsbF90aW1lcikgewogCQlpZiAoLS1kZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPT0gMCkgewogCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ0aW1lcjogYW10aGlmICBoYW5nZWQuXG4iKTsKQEAgLTYxOSwxMCArNjM2LDEwIEBACiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2JfcG9zLCBjYl9uZXh0LAogCQkJCSZkZXYtPmFtdGhpZl9yZF9jb21wbGV0ZV9saXN0Lmxpc3QsIGxpc3QpIHsKIAotCQkJCWNsX3BvcyA9IGNiX3Bvcy0+ZmlsZV9vYmplY3QtPnByaXZhdGVfZGF0YTsKKwkJCQljbCA9IGNiX3Bvcy0+ZmlsZV9vYmplY3QtPnByaXZhdGVfZGF0YTsKIAogCQkJCS8qIEZpbmRpbmcgdGhlIEFNVEhJIGVudHJ5LiAqLwotCQkJCWlmIChjbF9wb3MgPT0gJmRldi0+aWFtdGhpZl9jbCkKKwkJCQlpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkKIAkJCQkJbGlzdF9kZWwoJmNiX3Bvcy0+bGlzdCk7CiAJCQl9CiAJCQltZWlfaW9fY2JfZnJlZShkZXYtPmlhbXRoaWZfY3VycmVudF9jYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL21haW4uYyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCmluZGV4IDU0MjRmOGYuLmIzNTU5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCkBAIC0xMyw5ICsxMyw2IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKgogICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00MCw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbWVpLmg+CiAKICNpbmNsdWRlICJtZWlfZGV2LmgiCi0jaW5jbHVkZSAiaHctbWUuaCIKICNpbmNsdWRlICJjbGllbnQuaCIKIAogLyoqCkBAIC0xMjksMTcgKzEyNSwxMSBAQAogCX0KIAlpZiAoY2wtPnN0YXRlID09IE1FSV9GSUxFX0NPTk5FQ1RFRCkgewogCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNUSU5HOwotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwKLQkJCSJkaXNjb25uZWN0aW5nIGNsaWVudCBob3N0IGNsaWVudCA9ICVkLCAiCi0JCSAgICAiTUUgY2xpZW50ID0gJWRcbiIsCi0JCSAgICBjbC0+aG9zdF9jbGllbnRfaWQsCi0JCSAgICBjbC0+bWVfY2xpZW50X2lkKTsKKwkJY2xfZGJnKGRldiwgY2wsICJkaXNjb25uZWN0aW5nXG4iKTsKIAkJcmV0cyA9IG1laV9jbF9kaXNjb25uZWN0KGNsKTsKIAl9CiAJbWVpX2NsX2ZsdXNoX3F1ZXVlcyhjbCk7Ci0JZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJyZW1vdmUgY2xpZW50IGhvc3QgY2xpZW50ID0gJWQsIE1FIGNsaWVudCA9ICVkXG4iLAotCSAgICBjbC0+aG9zdF9jbGllbnRfaWQsCi0JICAgIGNsLT5tZV9jbGllbnRfaWQpOworCWNsX2RiZyhkZXYsIGNsLCAicmVtb3ZpbmdcbiIpOwogCiAJbWVpX2NsX3VubGluayhjbCk7CiAKQEAgLTI4NCw2ICsyNzQsNyBAQAogCWxlbmd0aCA9IG1pbl90KHNpemVfdCwgbGVuZ3RoLCBjYi0+YnVmX2lkeCAtICpvZmZzZXQpOwogCiAJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCBjYi0+cmVzcG9uc2VfYnVmZmVyLmRhdGEgKyAqb2Zmc2V0LCBsZW5ndGgpKSB7CisJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VybGFuZFxuIik7CiAJCXJldHMgPSAtRUZBVUxUOwogCQlnb3RvIGZyZWU7CiAJfQpAQCAtMzQwLDcgKzMzMSw3IEBACiAKIAlpZCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGNsLT5tZV9jbGllbnRfaWQpOwogCWlmIChpZCA8IDApIHsKLQkJcmV0cyA9IC1FTk9ERVY7CisJCXJldHMgPSAtRU5PVFRZOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQwNCw3ICszOTUsNyBAQAogCiAJcmV0cyA9IGNvcHlfZnJvbV91c2VyKHdyaXRlX2NiLT5yZXF1ZXN0X2J1ZmZlci5kYXRhLCB1YnVmLCBsZW5ndGgpOwogCWlmIChyZXRzKSB7Ci0JCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvcHkgZGF0YSBmcm9tIHVzZXJsYW5kXG4iKTsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIGZyb20gdXNlcmxhbmRcbiIpOwogCQlyZXRzID0gLUVGQVVMVDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDcxLDcgKzQ2Miw3IEBACiAJaWYgKGkgPCAwIHx8IGRldi0+bWVfY2xpZW50c1tpXS5wcm9wcy5maXhlZF9hZGRyZXNzKSB7CiAJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiQ2Fubm90IGNvbm5lY3QgdG8gRlcgQ2xpZW50IFVVSUQgPSAlcFVsXG4iLAogCQkJCSZkYXRhLT5pbl9jbGllbnRfdXVpZCk7Ci0JCXJldHMgPSAtRU5PREVWOworCQlyZXRzID0gLUVOT1RUWTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC01NjksNyArNTYwLDcgQEAKIAlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImNvcHkgY29ubmVjdCBkYXRhIGZyb20gdXNlclxuIik7CiAJaWYgKGNvcHlfZnJvbV91c2VyKGNvbm5lY3RfZGF0YSwgKGNoYXIgX191c2VyICopZGF0YSwKIAkJCQlzaXplb2Yoc3RydWN0IG1laV9jb25uZWN0X2NsaWVudF9kYXRhKSkpIHsKLQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY29weSBkYXRhIGZyb20gdXNlcmxhbmRcbiIpOworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImZhaWxlZCB0byBjb3B5IGRhdGEgZnJvbSB1c2VybGFuZFxuIik7CiAJCXJldHMgPSAtRUZBVUxUOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaCBiL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oCmluZGV4IGY3ZGU5NWIuLjk0YTUxNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvbWVpX2NsX2J1cy5oPgogCiAjaW5jbHVkZSAiaHcuaCIKLSNpbmNsdWRlICJody1tZS1yZWdzLmgiCiAjaW5jbHVkZSAiaGJtLmgiCiAKIC8qCkBAIC0xMzAsMTYgKzEyOSwxOCBAQAogCiAvKioKICAqIGVudW0gbWVpX2NiX2ZpbGVfb3BzICAtIGZpbGUgb3BlcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGJhY2sKLSAqIEBNRUlfRk9QX1JFQUQgICAtIHJlYWQKLSAqIEBNRUlfRk9QX1dSSVRFICAtIHdyaXRlCi0gKiBATUVJX0ZPUF9JT0NUTCAgLSBpb2N0bAotICogQE1FSV9GT1BfT1BFTiAgIC0gb3BlbgotICogQE1FSV9GT1BfQ0xPU0UgIC0gY2xvc2UKKyAqIEBNRUlfRk9QX1JFQUQgICAgICAtIHJlYWQKKyAqIEBNRUlfRk9QX1dSSVRFICAgICAtIHdyaXRlCisgKiBATUVJX0ZPUF9DT05ORUNUICAgLSBjb25uZWN0CisgKiBATUVJX0ZPUF9ESVNDT05ORUNUX1JTUCAtIGRpc2Nvbm5lY3QgcmVzcG9uc2UKKyAqIEBNRUlfRk9QX09QRU4gICAgICAtIG9wZW4KKyAqIEBNRUlfRk9QX0NMT1NFICAgICAtIGNsb3NlCiAgKi8KIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHsKIAlNRUlfRk9QX1JFQUQgPSAwLAogCU1FSV9GT1BfV1JJVEUsCi0JTUVJX0ZPUF9JT0NUTCwKKwlNRUlfRk9QX0NPTk5FQ1QsCisJTUVJX0ZPUF9ESVNDT05ORUNUX1JTUCwKIAlNRUlfRk9QX09QRU4sCiAJTUVJX0ZPUF9DTE9TRQogfTsKQEAgLTIzNiwyMCArMjM3LDIwIEBACiAgKi8KIHN0cnVjdCBtZWlfaHdfb3BzIHsKIAotCWJvb2wgKCpob3N0X2lzX3JlYWR5KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJYm9vbCAoKmhvc3RfaXNfcmVhZHkpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogCi0JYm9vbCAoKmh3X2lzX3JlYWR5KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0JaW50ICgqaHdfcmVzZXQpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBib29sIGVuYWJsZSk7Ci0JaW50ICAoKmh3X3N0YXJ0KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmh3X2NvbmZpZykgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOworCWJvb2wgKCpod19pc19yZWFkeSkoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJaW50ICgqaHdfcmVzZXQpKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKwlpbnQgKCpod19zdGFydCkoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmh3X2NvbmZpZykoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKLQl2b2lkICgqaW50cl9jbGVhcikgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwotCXZvaWQgKCppbnRyX2VuYWJsZSkgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwotCXZvaWQgKCppbnRyX2Rpc2FibGUpIChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaW50cl9jbGVhcikoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmludHJfZW5hYmxlKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaW50cl9kaXNhYmxlKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIAotCWludCAoKmhidWZfZnJlZV9zbG90cykgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwotCWJvb2wgKCpoYnVmX2lzX3JlYWR5KSAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0Jc2l6ZV90ICgqaGJ1Zl9tYXhfbGVuKSAoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJaW50ICgqaGJ1Zl9mcmVlX3Nsb3RzKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKKwlib29sICgqaGJ1Zl9pc19yZWFkeSkoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisJc2l6ZV90ICgqaGJ1Zl9tYXhfbGVuKShjb25zdCBzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIAogCWludCAoKndyaXRlKShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkgICAgIHN0cnVjdCBtZWlfbXNnX2hkciAqaGRyLApAQCAtMjU4LDcgKzI1OSw3IEBACiAJaW50ICgqcmRidWZfZnVsbF9zbG90cykoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKIAl1MzIgKCpyZWFkX2hkcikoY29uc3Qgc3RydWN0IG1laV9kZXZpY2UgKmRldik7Ci0JaW50ICgqcmVhZCkgKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJaW50ICgqcmVhZCkoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKIAkJICAgICB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKIH07CiAKQEAgLTI5NCw2ICsyOTUsNyBAQAogaW50IF9fbWVpX2NsX3NlbmQoc3RydWN0IG1laV9jbCAqY2wsIHU4ICpidWYsIHNpemVfdCBsZW5ndGgpOwogaW50IF9fbWVpX2NsX3JlY3Yoc3RydWN0IG1laV9jbCAqY2wsIHU4ICpidWYsIHNpemVfdCBsZW5ndGgpOwogdm9pZCBtZWlfY2xfYnVzX3J4X2V2ZW50KHN0cnVjdCBtZWlfY2wgKmNsKTsKK3ZvaWQgbWVpX2NsX2J1c19yZW1vdmVfZGV2aWNlcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIGludCBtZWlfY2xfYnVzX2luaXQodm9pZCk7CiB2b2lkIG1laV9jbF9idXNfZXhpdCh2b2lkKTsKIApAQCAtMzM5LDcgKzM0MSw2IEBACiAgKiBAaGJ1Zl9kZXB0aCAtIGRlcHRoIG9mIGhhcmR3YXJlIGhvc3Qvd3JpdGUgYnVmZmVyIGlzIHNsb3RzCiAgKiBAaGJ1Zl9pc19yZWFkeSAtIHF1ZXJ5IGlmIHRoZSBob3N0IGhvc3Qvd3JpdGUgYnVmZmVyIGlzIHJlYWR5CiAgKiBAd3JfbXNnIC0gdGhlIGJ1ZmZlciBmb3IgaGJtIGNvbnRyb2wgbWVzc2FnZXMKLSAqIEB3cl9leHRfbXNnIC0gdGhlIGJ1ZmZlciBmb3IgaGJtIGNvbnRyb2wgcmVzcG9uc2VzIChzZXQgaW4gcmVhZCBjeWNsZSkKICAqLwogc3RydWN0IG1laV9kZXZpY2UgewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBwb2ludGVyIHRvIHBjaSBkZXZpY2Ugc3RydWN0ICovCkBAIC0zOTQsMTEgKzM5NSw2IEBACiAJCXVuc2lnbmVkIGNoYXIgZGF0YVsxMjhdOwogCX0gd3JfbXNnOwogCi0Jc3RydWN0IHsKLQkJc3RydWN0IG1laV9tc2dfaGRyIGhkcjsKLQkJdW5zaWduZWQgY2hhciBkYXRhWzRdOwkvKiBBbGwgSEJNIG1lc3NhZ2VzIGFyZSA0IGJ5dGVzICovCi0JfSB3cl9leHRfbXNnOwkJLyogZm9yIGNvbnRyb2wgcmVzcG9uc2VzICovCi0KIAlzdHJ1Y3QgaGJtX3ZlcnNpb24gdmVyc2lvbjsKIAogCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbGllbnRzOyAvKiBOb3RlOiBtZW1vcnkgaGFzIHRvIGJlIGFsbG9jYXRlZCAqLwpAQCAtNTE4LDggKzUxNCw4IEBACiAKIHZvaWQgbWVpX2FtdGhpZl9ydW5fbmV4dF9jbWQoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKLWludCBtZWlfYW10aGlmX2lycV93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9jbF9jYiAqY2IsCi0JCQkJICBzMzIgKnNsb3RzLCBzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QpOworaW50IG1laV9hbXRoaWZfaXJxX3dyaXRlKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYiwKKwkJCXN0cnVjdCBtZWlfY2xfY2IgKmNtcGxfbGlzdCk7CiAKIHZvaWQgbWVpX2FtdGhpZl9jb21wbGV0ZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsX2NiICpjYik7CiBpbnQgbWVpX2FtdGhpZl9pcnFfcmVhZF9tc2coc3RydWN0IG1laV9kZXZpY2UgKmRldiwKQEAgLTU0Niw3ICs1NDIsNyBAQAogICogICBvbmNlIHdlIGdvdCBjb25uZWN0aW9uIHRvIHRoZSBXRCBDbGllbnQKICAqIEBkZXYgLSBtZWkgZGV2aWNlCiAgKi8KLXZvaWQgbWVpX3dhdGNoZG9nX3JlZ2lzdGVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOworaW50IG1laV93YXRjaGRvZ19yZWdpc3RlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIC8qCiAgKiBtZWlfd2F0Y2hkb2dfdW5yZWdpc3RlciAgLSBVbnJlZ2lzdGVyaW5nIHdhdGNoZG9nIGludGVyZmFjZQogICogQGRldiAtIG1laSBkZXZpY2UKQEAgLTYzMyw2ICs2MjksOCBAQAogCXJldHVybiBkZXYtPm9wcy0+cmRidWZfZnVsbF9zbG90cyhkZXYpOwogfQogCitib29sIG1laV9oYnVmX2FjcXVpcmUoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CisKICNpZiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykKIGludCBtZWlfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7CiB2b2lkIG1laV9kYmdmc19kZXJlZ2lzdGVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9uZmMuYyBiL2RyaXZlcnMvbWlzYy9tZWkvbmZjLmMKaW5kZXggYTU4MzIwYy4uMzA5NWZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9uZmMuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL25mYy5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAlpZiAoIXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG5kZXYtPnNlbmRfd3EsCiAJCQkJbmRldi0+cmVjdl9yZXFfaWQgPT0gbmRldi0+cmVxX2lkLCBIWikpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJORkMgTUVJIGNvbW1hbmQgdGltZW91dFxuIik7Ci0JCWVyciA9IC1FVElNRURPVVQ7CisJCWVyciA9IC1FVElNRTsKIAl9IGVsc2UgewogCQluZGV2LT5yZXFfaWQrKzsKIAl9CkBAIC01MDIsNyArNTAyLDcgQEAKIAlpID0gbWVpX21lX2NsX2J5X3V1aWQoZGV2LCAmbWVpX25mY19pbmZvX2d1aWQpOwogCWlmIChpIDwgMCkgewogCQlkZXZfaW5mbygmZGV2LT5wZGV2LT5kZXYsICJuZmM6IGZhaWxlZCB0byBmaW5kIHRoZSBjbGllbnRcbiIpOwotCQlyZXQgPSAtRU5PRU5UOworCQlyZXQgPSAtRU5PVFRZOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTUyMCw3ICs1MjAsNyBAQAogCWkgPSBtZWlfbWVfY2xfYnlfdXVpZChkZXYsICZtZWlfbmZjX2d1aWQpOwogCWlmIChpIDwgMCkgewogCQlkZXZfaW5mbygmZGV2LT5wZGV2LT5kZXYsICJuZmM6IGZhaWxlZCB0byBmaW5kIHRoZSBjbGllbnRcbiIpOwotCQlyZXQgPSAtRU5PRU5UOworCQlyZXQgPSAtRU5PVFRZOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTU1MiwxMyArNTUyLDcgQEAKIHZvaWQgbWVpX25mY19ob3N0X2V4aXQoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbWVpX25mY19kZXYgKm5kZXYgPSAmbmZjX2RldjsKLQogCWNhbmNlbF93b3JrX3N5bmMoJm5kZXYtPmluaXRfd29yayk7Ci0KLQltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKLQlpZiAobmRldi0+Y2wgJiYgbmRldi0+Y2wtPmRldmljZSkKLQkJbWVpX2NsX3JlbW92ZV9kZXZpY2UobmRldi0+Y2wtPmRldmljZSk7Ci0KLQltZWlfbmZjX2ZyZWUobmRldik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIH0KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jIGIvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYwppbmRleCBkZGFkZDA4Li4xYzhmZDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMKQEAgLTEzLDkgKzEzLDYgQEAKICAqIG1vcmUgZGV0YWlscy4KICAqCiAgKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTI3LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC00MCwxMSArMzYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tZWkuaD4KIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgorI2luY2x1ZGUgImh3LW1lLXJlZ3MuaCIKKyNpbmNsdWRlICJody1tZS5oIgogCiAvKiBtZWlfcGNpX3RibCAtIFBDSSBEZXZpY2UgSUQgVGFibGUgKi8KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShtZWlfbWVfcGNpX3RibCkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWVpX21lX3BjaV90YmxbXSA9IHsKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBNRUlfREVWX0lEXzgyOTQ2R1opfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBNRUlfREVWX0lEXzgyRzM1KX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgTUVJX0RFVl9JRF84MlE5NjUpfSwKQEAgLTI3MCw3ICsyNjcsNyBAQAogCiAKIH0KLSNpZmRlZiBDT05GSUdfUE0KKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgbWVpX21lX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKQEAgLTMzMCwxMSArMzI3LDEyIEBACiAKIAlyZXR1cm4gMDsKIH0KKwogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1laV9tZV9wbV9vcHMsIG1laV9tZV9wY2lfc3VzcGVuZCwgbWVpX21lX3BjaV9yZXN1bWUpOwogI2RlZmluZSBNRUlfTUVfUE1fT1BTCSgmbWVpX21lX3BtX29wcykKICNlbHNlCiAjZGVmaW5lIE1FSV9NRV9QTV9PUFMJTlVMTAotI2VuZGlmIC8qIENPTkZJR19QTSAqLworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogLyoKICAqICBQQ0kgZHJpdmVyIHN0cnVjdHVyZQogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkM2FkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqCisgKiBJbnRlbCBNYW5hZ2VtZW50IEVuZ2luZSBJbnRlcmZhY2UgKEludGVsIE1FSSkgTGludXggZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdXVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L21laS5oPgorCisKKyNpbmNsdWRlICJtZWlfZGV2LmgiCisjaW5jbHVkZSAiaHctdHhlLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtZWlfdHhlX3BjaV90YmxbXSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDBGMTgpfSwgLyogQmF5dHJhaWwgKi8KKwl7MCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtZWlfdHhlX3BjaV90YmwpOworCisKK3N0YXRpYyB2b2lkIG1laV90eGVfcGNpX2lvdW5tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBtZWlfdHhlX2h3ICpodykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBTRUNfQkFSOyBpIDwgTlVNX09GX01FTV9CQVJTOyBpKyspIHsKKwkJaWYgKGh3LT5tZW1fYWRkcltpXSkgeworCQkJcGNpX2lvdW5tYXAocGRldiwgaHctPm1lbV9hZGRyW2ldKTsKKwkJCWh3LT5tZW1fYWRkcltpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisvKioKKyAqIG1laV9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCisgKgorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZW50OiBlbnRyeSBpbiBtZWlfdHhlX3BjaV90YmwKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBtZWlfdHhlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CisJc3RydWN0IG1laV90eGVfaHcgKmh3OworCWludCBlcnI7CisJaW50IGk7CisKKwkvKiBlbmFibGUgcGNpIGRldiAqLworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlLlxuIik7CisJCWdvdG8gZW5kOworCX0KKwkvKiBzZXQgUENJIGhvc3QgbWFzdGVyaW5nICAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCS8qIHBjaSByZXF1ZXN0IHJlZ2lvbnMgZm9yIG1laSBkcml2ZXIgKi8KKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIEtCVUlMRF9NT0ROQU1FKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgcGNpIHJlZ2lvbnMuXG4iKTsKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKwl9CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOworCWlmIChlcnIpIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOworCQkJZ290byByZWxlYXNlX3JlZ2lvbnM7CisJCX0KKwl9CisKKwkvKiBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBtZWkgZGV2IHN0cnVjdHVyZSAqLworCWRldiA9IG1laV90eGVfZGV2X2luaXQocGRldik7CisJaWYgKCFkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX3JlZ2lvbnM7CisJfQorCWh3ID0gdG9fdHhlX2h3KGRldik7CisKKwkvKiBtYXBwaW5nICBJTyBkZXZpY2UgbWVtb3J5ICovCisJZm9yIChpID0gU0VDX0JBUjsgaSA8IE5VTV9PRl9NRU1fQkFSUzsgaSsrKSB7CisJCWh3LT5tZW1fYWRkcltpXSA9IHBjaV9pb21hcChwZGV2LCBpLCAwKTsKKwkJaWYgKCFody0+bWVtX2FkZHJbaV0pIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1hcHBpbmcgSS9PIGRldmljZSBtZW1vcnkgZmFpbHVyZS5cbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV9kZXZpY2U7CisJCX0KKwl9CisKKworCXBjaV9lbmFibGVfbXNpKHBkZXYpOworCisJLyogY2xlYXIgc3B1cmlvdXMgaW50ZXJydXB0cyAqLworCW1laV9jbGVhcl9pbnRlcnJ1cHRzKGRldik7CisKKwkvKiByZXF1ZXN0IGFuZCBlbmFibGUgaW50ZXJydXB0ICAqLworCWlmIChwY2lfZGV2X21zaV9lbmFibGVkKHBkZXYpKQorCQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZGV2LT5pcnEsCisJCQlOVUxMLAorCQkJbWVpX3R4ZV9pcnFfdGhyZWFkX2hhbmRsZXIsCisJCQlJUlFGX09ORVNIT1QsIEtCVUlMRF9NT0ROQU1FLCBkZXYpOworCWVsc2UKKwkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLAorCQkJbWVpX3R4ZV9pcnFfcXVpY2tfaGFuZGxlciwKKwkJCW1laV90eGVfaXJxX3RocmVhZF9oYW5kbGVyLAorCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWVpOiByZXF1ZXN0X3RocmVhZGVkX2lycSBmYWlsdXJlLiBpcnEgPSAlZFxuIiwKKwkJCXBkZXYtPmlycSk7CisJCWdvdG8gZnJlZV9kZXZpY2U7CisJfQorCisJaWYgKG1laV9zdGFydChkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImluaXQgaHcgZmFpbHVyZS5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIHJlbGVhc2VfaXJxOworCX0KKworCWVyciA9IG1laV9yZWdpc3RlcihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gcmVsZWFzZV9pcnE7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXJldHVybiAwOworCityZWxlYXNlX2lycToKKworCW1laV9jYW5jZWxfd29yayhkZXYpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbWVpX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKworZnJlZV9kZXZpY2U6CisJbWVpX3R4ZV9wY2lfaW91bm1hcChwZGV2LCBodyk7CisKKwlrZnJlZShkZXYpOworcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitkaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlbmQ6CisJZGV2X2VycigmcGRldi0+ZGV2LCAiaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBtZWlfcmVtb3ZlIC0gRGV2aWNlIFJlbW92YWwgUm91dGluZQorICoKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIG1laV9yZW1vdmUgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHRvIGFsZXJ0IHRoZSBkcml2ZXIKKyAqIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgYSBQQ0kgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBtZWlfdHhlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OworCXN0cnVjdCBtZWlfdHhlX2h3ICpodzsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtZWk6IGRldiA9TlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlodyA9IHRvX3R4ZV9odyhkZXYpOworCisJbWVpX3N0b3AoZGV2KTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCW1laV9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJbWVpX3R4ZV9wY2lfaW91bm1hcChwZGV2LCBodyk7CisKKwltZWlfZGVyZWdpc3RlcihkZXYpOworCisJa2ZyZWUoZGV2KTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgbWVpX3R4ZV9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgInN1c3BlbmRcbiIpOworCisJbWVpX3N0b3AoZGV2KTsKKworCW1laV9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKworCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKwlwY2lfZGlzYWJsZV9tc2kocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZWlfdHhlX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfZW5hYmxlX21zaShwZGV2KTsKKworCW1laV9jbGVhcl9pbnRlcnJ1cHRzKGRldik7CisKKwkvKiByZXF1ZXN0IGFuZCBlbmFibGUgaW50ZXJydXB0ICovCisJaWYgKHBjaV9kZXZfbXNpX2VuYWJsZWQocGRldikpCisJCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBkZXYtPmlycSwKKwkJCU5VTEwsCisJCQltZWlfdHhlX2lycV90aHJlYWRfaGFuZGxlciwKKwkJCUlSUUZfT05FU0hPVCwgS0JVSUxEX01PRE5BTUUsIGRldik7CisJZWxzZQorCQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZGV2LT5pcnEsCisJCQltZWlfdHhlX2lycV9xdWlja19oYW5kbGVyLAorCQkJbWVpX3R4ZV9pcnFfdGhyZWFkX2hhbmRsZXIsCisJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZXF1ZXN0X3RocmVhZGVkX2lycSBmYWlsZWQ6IGlycSA9ICVkLlxuIiwKKwkJCQlwZGV2LT5pcnEpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IG1laV9yZXN0YXJ0KGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWVpX3R4ZV9wbV9vcHMsCisJCQkgbWVpX3R4ZV9wY2lfc3VzcGVuZCwKKwkJCSBtZWlfdHhlX3BjaV9yZXN1bWUpOworCisjZGVmaW5lIE1FSV9UWEVfUE1fT1BTCSgmbWVpX3R4ZV9wbV9vcHMpCisjZWxzZQorI2RlZmluZSBNRUlfVFhFX1BNX09QUwlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisvKgorICogIFBDSSBkcml2ZXIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtZWlfdHhlX2RyaXZlciA9IHsKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCS5pZF90YWJsZSA9IG1laV90eGVfcGNpX3RibCwKKwkucHJvYmUgPSBtZWlfdHhlX3Byb2JlLAorCS5yZW1vdmUgPSBtZWlfdHhlX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBtZWlfdHhlX3JlbW92ZSwKKwkuZHJpdmVyLnBtID0gTUVJX1RYRV9QTV9PUFMsCit9OworCittb2R1bGVfcGNpX2RyaXZlcihtZWlfdHhlX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsKFIpIFRydXN0ZWQgRXhlY3V0aW9uIEVudmlyb25tZW50IEludGVyZmFjZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS93ZC5jIGIvZHJpdmVycy9taXNjL21laS93ZC5jCmluZGV4IGY3MDk0NWUuLmViZjFjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvd2QuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL3dkLmMKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKLSNpbmNsdWRlICJody1tZS5oIgogI2luY2x1ZGUgImNsaWVudC5oIgogCiBzdGF0aWMgY29uc3QgdTggbWVpX3N0YXJ0X3dkX3BhcmFtc1tdID0geyAweDAyLCAweDEyLCAweDEzLCAweDEwIH07CkBAIC01Myw3ICs1Miw3IEBACiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiByZXR1cm5zIC1FTkVOVCBpZiB3ZCBjbGllbnQgY2Fubm90IGJlIGZvdW5kCisgKiByZXR1cm5zIC1FTk9UVFkgaWYgd2QgY2xpZW50IGNhbm5vdCBiZSBmb3VuZAogICogICAgICAgICAtRUlPIGlmIHdyaXRlIGhhcyBmYWlsZWQKICAqICAgICAgICAgMCBvbiBzdWNjZXNzCiAgKi8KQEAgLTczLDcgKzcyLDcgQEAKIAlpZCA9IG1laV9tZV9jbF9ieV91dWlkKGRldiwgJm1laV93ZF9ndWlkKTsKIAlpZiAoaWQgPCAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPnBkZXYtPmRldiwgIndkOiBmYWlsZWQgdG8gZmluZCB0aGUgY2xpZW50XG4iKTsKLQkJcmV0dXJuIGlkOworCQlyZXR1cm4gLUVOT1RUWTsKIAl9CiAKIAljbC0+bWVfY2xpZW50X2lkID0gZGV2LT5tZV9jbGllbnRzW2lkXS5jbGllbnRfaWQ7CkBAIC04NywxNSArODYsMjAgQEAKIAogCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0NPTk5FQ1RJTkc7CiAKLQlpZiAobWVpX2hibV9jbF9jb25uZWN0X3JlcShkZXYsIGNsKSkgewotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgY2xpZW50XG4iKTsKLQkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwotCQljbC0+aG9zdF9jbGllbnRfaWQgPSAwOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JY2wtPnRpbWVyX2NvdW50ID0gTUVJX0NPTk5FQ1RfVElNRU9VVDsKKwlyZXQgPSBtZWlfY2xfY29ubmVjdChjbCwgTlVMTCk7CiAKLQlyZXR1cm4gMDsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2Q6IGZhaWxlZCB0byBjb25uZWN0ID0gJWRcbiIsIHJldCk7CisJCW1laV9jbF91bmxpbmsoY2wpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG1laV93YXRjaGRvZ19yZWdpc3RlcihkZXYpOworCWlmIChyZXQpIHsKKwkJbWVpX2NsX2Rpc2Nvbm5lY3QoY2wpOworCQltZWlfY2xfdW5saW5rKGNsKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMDYsMTMgKzExMCwxNiBAQAogICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsCiAgKgktRUlPIHdoZW4gbWVzc2FnZSBzZW5kIGZhaWxzCiAgKgktRUlOVkFMIHdoZW4gaW52YWxpZCBtZXNzYWdlIGlzIHRvIGJlIHNlbnQKKyAqCS1FTk9ERVYgb24gZmxvdyBjb250cm9sIGZhaWx1cmUKICAqLwogaW50IG1laV93ZF9zZW5kKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT53ZF9jbDsKIAlzdHJ1Y3QgbWVpX21zZ19oZHIgaGRyOworCWludCByZXQ7CiAKLQloZHIuaG9zdF9hZGRyID0gZGV2LT53ZF9jbC5ob3N0X2NsaWVudF9pZDsKLQloZHIubWVfYWRkciA9IGRldi0+d2RfY2wubWVfY2xpZW50X2lkOworCWhkci5ob3N0X2FkZHIgPSBjbC0+aG9zdF9jbGllbnRfaWQ7CisJaGRyLm1lX2FkZHIgPSBjbC0+bWVfY2xpZW50X2lkOwogCWhkci5tc2dfY29tcGxldGUgPSAxOwogCWhkci5yZXNlcnZlZCA9IDA7CiAJaGRyLmludGVybmFsID0gMDsKQEAgLTEyMSwxMCArMTI4LDI0IEBACiAJCWhkci5sZW5ndGggPSBNRUlfV0RfU1RBUlRfTVNHX1NJWkU7CiAJZWxzZSBpZiAoIW1lbWNtcChkZXYtPndkX2RhdGEsIG1laV9zdG9wX3dkX3BhcmFtcywgTUVJX1dEX0hEUl9TSVpFKSkKIAkJaGRyLmxlbmd0aCA9IE1FSV9XRF9TVE9QX01TR19TSVpFOwotCWVsc2UKKwllbHNlIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogaW52YWxpZCBtZXNzYWdlIGlzIHRvIGJlIHNlbnQsIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JcmV0dXJuIG1laV93cml0ZV9tZXNzYWdlKGRldiwgJmhkciwgZGV2LT53ZF9kYXRhKTsKKwlyZXQgPSBtZWlfd3JpdGVfbWVzc2FnZShkZXYsICZoZHIsIGRldi0+d2RfZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiB3cml0ZSBtZXNzYWdlIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoY2wpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogZmxvd19jdHJsX3JlZHVjZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMzMsOSArMTU0LDExIEBACiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICogQHByZXNlcnZlOiBpbmRpY2F0ZSBpZiB0byBrZWVwIHRoZSB0aW1lb3V0IHZhbHVlCiAgKgotICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsCi0gKgktRUlPIHdoZW4gbWVzc2FnZSBzZW5kIGZhaWxzCisgKiByZXR1cm5zIDAgaWYgc3VjY2VzcworICogb24gZXJyb3I6CisgKgktRUlPICAgIHdoZW4gbWVzc2FnZSBzZW5kIGZhaWxzCiAgKgktRUlOVkFMIHdoZW4gaW52YWxpZCBtZXNzYWdlIGlzIHRvIGJlIHNlbnQKKyAqCS1FVElNRSAgb24gbWVzc2FnZSB0aW1lb3V0CiAgKi8KIGludCBtZWlfd2Rfc3RvcChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewpAQCAtMTUxLDIwICsxNzQsMTIgQEAKIAogCXJldCA9IG1laV9jbF9mbG93X2N0cmxfY3JlZHMoJmRldi0+d2RfY2wpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKKwkJZ290byBlcnI7CiAKLQlpZiAocmV0ICYmIGRldi0+aGJ1Zl9pc19yZWFkeSkgewotCQlyZXQgPSAwOwotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKLQotCQlpZiAoIW1laV93ZF9zZW5kKGRldikpIHsKLQkJCXJldCA9IG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKCZkZXYtPndkX2NsKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIndkOiBzZW5kIHN0b3AgZmFpbGVkXG4iKTsKLQkJfQotCisJaWYgKHJldCAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKKwkJcmV0ID0gbWVpX3dkX3NlbmQoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOwogCQlkZXYtPndkX3BlbmRpbmcgPSBmYWxzZTsKIAl9IGVsc2UgewogCQlkZXYtPndkX3BlbmRpbmcgPSB0cnVlOwpAQCAtMTcyLDIxICsxODcsMjEgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAKLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndhaXRfc3RvcF93ZCwKLQkJCQkJZGV2LT53ZF9zdGF0ZSA9PSBNRUlfV0RfSURMRSwKLQkJCQkJbXNlY3NfdG9famlmZmllcyhNRUlfV0RfU1RPUF9USU1FT1VUKSk7CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGRldi0+d2FpdF9zdG9wX3dkLAorCQkJCWRldi0+d2Rfc3RhdGUgPT0gTUVJX1dEX0lETEUsCisJCQkJbXNlY3NfdG9famlmZmllcyhNRUlfV0RfU1RPUF9USU1FT1VUKSk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0JaWYgKGRldi0+d2Rfc3RhdGUgPT0gTUVJX1dEX0lETEUpIHsKLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc3RvcCBjb21wbGV0ZWQgcmV0PSVkLlxuIiwgcmV0KTsKLQkJcmV0ID0gMDsKLQl9IGVsc2UgewotCQlpZiAoIXJldCkKLQkJCXJldCA9IC1FVElNRURPVVQ7CisJaWYgKGRldi0+d2Rfc3RhdGUgIT0gTUVJX1dEX0lETEUpIHsKKwkJLyogdGltZW91dCAqLworCQlyZXQgPSAtRVRJTUU7CiAJCWRldl93YXJuKCZkZXYtPnBkZXYtPmRldiwKIAkJCSJ3ZDogc3RvcCBmYWlsZWQgdG8gY29tcGxldGUgcmV0PSVkLlxuIiwgcmV0KTsKKwkJZ290byBlcnI7CiAJfQotCi1vdXQ6CisJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc3RvcCBjb21wbGV0ZWQgYWZ0ZXIgJXUgbXNlY1xuIiwKKwkJCU1FSV9XRF9TVE9QX1RJTUVPVVQgLSBqaWZmaWVzX3RvX21zZWNzKHJldCkpOworCXJldHVybiAwOworZXJyOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI2MCw4ICsyNzUsOCBAQAogICovCiBzdGF0aWMgaW50IG1laV93ZF9vcHNfcGluZyhzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZF9kZXYpCiB7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKKwlpbnQgcmV0OwogCiAJZGV2ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RfZGV2KTsKIAlpZiAoIWRldikKQEAgLTI3NywyNSArMjkyLDE4IEBACiAKIAlkZXYtPndkX3N0YXRlID0gTUVJX1dEX1JVTk5JTkc7CiAKKwlyZXQgPSBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKCZkZXYtPndkX2NsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlbmQ7CiAJLyogQ2hlY2sgaWYgd2UgY2FuIHNlbmQgdGhlIHBpbmcgdG8gSFcqLwotCWlmIChkZXYtPmhidWZfaXNfcmVhZHkgJiYgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcygmZGV2LT53ZF9jbCkgPiAwKSB7CisJaWYgKHJldCAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAotCQlkZXYtPmhidWZfaXNfcmVhZHkgPSBmYWxzZTsKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc2VuZGluZyBwaW5nXG4iKTsKIAotCQlpZiAobWVpX3dkX3NlbmQoZGV2KSkgewotCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJ3ZDogc2VuZCBmYWlsZWQuXG4iKTsKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IG1laV93ZF9zZW5kKGRldik7CisJCWlmIChyZXQpCiAJCQlnb3RvIGVuZDsKLQkJfQotCi0JCWlmIChtZWlfY2xfZmxvd19jdHJsX3JlZHVjZSgmZGV2LT53ZF9jbCkpIHsKLQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAotCQkJCSJ3ZDogbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoKSBmYWlsZWQuXG4iKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIGVuZDsKLQkJfQotCisJCWRldi0+d2RfcGVuZGluZyA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCWRldi0+d2RfcGVuZGluZyA9IHRydWU7CiAJfQpAQCAtMzYzLDE3ICszNzEsMjUgQEAKIH07CiAKIAotdm9pZCBtZWlfd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK2ludCBtZWlfd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKLQlpZiAod2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZhbXRfd2RfZGV2KSkgewotCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKLQkJCSJ3ZDogdW5hYmxlIHRvIHJlZ2lzdGVyIHdhdGNoZG9nIGRldmljZS5cbiIpOwotCQlyZXR1cm47CisKKwlpbnQgcmV0OworCisJLyogdW5sb2NrIHRvIHBlcnNlcnZlIGNvcnJlY3QgbG9ja2luZyBvcmRlciAqLworCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZhbXRfd2RfZGV2KTsKKwltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAid2Q6IHVuYWJsZSB0byByZWdpc3RlciB3YXRjaGRvZyBkZXZpY2UgPSAlZC5cbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LAogCQkid2Q6IHN1Y2Nlc3NmdWxseSByZWdpc3RlciB3YXRjaGRvZyBpbnRlcmZhY2UuXG4iKTsKIAl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSgmYW10X3dkX2RldiwgZGV2KTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBtZWlfd2F0Y2hkb2dfdW5yZWdpc3RlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21pYy9jYXJkL21pY19kZXZpY2UuaCBiL2RyaXZlcnMvbWlzYy9taWMvY2FyZC9taWNfZGV2aWNlLmgKaW5kZXggMzQ3YjliMy4uMzA2ZjUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21pYy9jYXJkL21pY19kZXZpY2UuaAorKysgYi9kcml2ZXJzL21pc2MvbWljL2NhcmQvbWljX2RldmljZS5oCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogCiAvKioKICAqIHN0cnVjdCBtaWNfaW50cl9pbmZvIC0gQ29udGFpbnMgaC93IHNwZWNpZmljIGludGVycnVwdCBzb3VyY2VzIGluZm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfZGV2aWNlLmggYi9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2RldmljZS5oCmluZGV4IDFhNmVkY2UuLjAzOThjNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9taWMvaG9zdC9taWNfZGV2aWNlLmgKKysrIGIvZHJpdmVycy9taXNjL21pYy9ob3N0L21pY19kZXZpY2UuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogCiAjaW5jbHVkZSAibWljX2ludHIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21pYy9ob3N0L21pY19pbnRyLmMgYi9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2ludHIuYwppbmRleCBmOWMyOWJjLi5kYmM1YWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2ludHIuYworKysgYi9kcml2ZXJzL21pc2MvbWljL2hvc3QvbWljX2ludHIuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IE1JQ19NSU5fTVNJWDsgaSsrKQogCQltZGV2LT5pcnFfaW5mby5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOwogCi0JcmMgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgbWRldi0+aXJxX2luZm8ubXNpeF9lbnRyaWVzLAorCXJjID0gcGNpX2VuYWJsZV9tc2l4X2V4YWN0KHBkZXYsIG1kZXYtPmlycV9pbmZvLm1zaXhfZW50cmllcywKIAkJTUlDX01JTl9NU0lYKTsKIAlpZiAocmMpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRXJyb3IgZW5hYmxpbmcgTVNJeC4gcmMgPSAlZFxuIiwgcmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3BjaF9waHViLmMgYi9kcml2ZXJzL21pc2MvcGNoX3BodWIuYwppbmRleCBhNTkyNWY3Zi4uOTU2NTk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3BjaF9waHViLmMKKysrIGIvZHJpdmVycy9taXNjL3BjaF9waHViLmMKQEAgLTYzNiw2ICs2MzYsNyBAQAogCXU4IG1hY1tFVEhfQUxFTl07CiAJc3NpemVfdCByb21fc2l6ZTsKIAlzdHJ1Y3QgcGNoX3BodWJfcmVnICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKIAogCWlmICghbWFjX3B0b24oYnVmLCBtYWMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY0NCw4ICs2NDUsMTAgQEAKIAlpZiAoIWNoaXAtPnBjaF9waHViX2V4dHJvbV9iYXNlX2FkZHJlc3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGNoX3BodWJfd3JpdGVfZ2JlX21hY19hZGRyKGNoaXAsIG1hYyk7CisJcmV0ID0gcGNoX3BodWJfd3JpdGVfZ2JlX21hY19hZGRyKGNoaXAsIG1hYyk7CiAJcGNpX3VubWFwX3JvbShjaGlwLT5wZGV2LCBjaGlwLT5wY2hfcGh1Yl9leHRyb21fYmFzZV9hZGRyZXNzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NyYW0uYyBiL2RyaXZlcnMvbWlzYy9zcmFtLmMKaW5kZXggYWZlNjY1NzEuLjIxMTgxZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zcmFtLmMKKysrIGIvZHJpdmVycy9taXNjL3NyYW0uYwpAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3Rfc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMzYsMTQgKzM5LDM1IEBACiAJc3RydWN0IGNsayAqY2xrOwogfTsKIAorc3RydWN0IHNyYW1fcmVzZXJ2ZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBzdGFydDsKKwl1MzIgc2l6ZTsKK307CisKK3N0YXRpYyBpbnQgc3JhbV9yZXNlcnZlX2NtcCh2b2lkICpwcml2LCBzdHJ1Y3QgbGlzdF9oZWFkICphLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpiKQoreworCXN0cnVjdCBzcmFtX3Jlc2VydmUgKnJhID0gbGlzdF9lbnRyeShhLCBzdHJ1Y3Qgc3JhbV9yZXNlcnZlLCBsaXN0KTsKKwlzdHJ1Y3Qgc3JhbV9yZXNlcnZlICpyYiA9IGxpc3RfZW50cnkoYiwgc3RydWN0IHNyYW1fcmVzZXJ2ZSwgbGlzdCk7CisKKwlyZXR1cm4gcmEtPnN0YXJ0IC0gcmItPnN0YXJ0OworfQorCiBzdGF0aWMgaW50IHNyYW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAl2b2lkIF9faW9tZW0gKnZpcnRfYmFzZTsKIAlzdHJ1Y3Qgc3JhbV9kZXYgKnNyYW07CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZSwgKmNoaWxkOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgY3VyX3N0YXJ0LCBjdXJfc2l6ZTsKKwlzdHJ1Y3Qgc3JhbV9yZXNlcnZlICpyYmxvY2tzLCAqYmxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCByZXNlcnZlX2xpc3Q7CisJdW5zaWduZWQgaW50IG5ibG9ja3M7CiAJaW50IHJldDsKIAorCUlOSVRfTElTVF9IRUFEKCZyZXNlcnZlX2xpc3QpOworCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAl2aXJ0X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKHZpcnRfYmFzZSkpCkBAIC02NSwxOSArODksMTA2IEBACiAJaWYgKCFzcmFtLT5wb29sKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IGdlbl9wb29sX2FkZF92aXJ0KHNyYW0tPnBvb2wsICh1bnNpZ25lZCBsb25nKXZpcnRfYmFzZSwKLQkJCQlyZXMtPnN0YXJ0LCBzaXplLCAtMSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJaWYgKHNyYW0tPmNsaykKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcmFtLT5jbGspOwotCQlyZXR1cm4gcmV0OworCS8qCisJICogV2UgbmVlZCBhbiBhZGRpdGlvbmFsIGJsb2NrIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgbWVtb3J5IHJlZ2lvbgorCSAqIGFmdGVyIHRoZSByZXNlcnZlZCBibG9ja3MgZnJvbSB0aGUgZHQgYXJlIHByb2Nlc3NlZC4KKwkgKi8KKwluYmxvY2tzID0gKG5wKSA/IG9mX2dldF9hdmFpbGFibGVfY2hpbGRfY291bnQobnApICsgMSA6IDE7CisJcmJsb2NrcyA9IGttYWxsb2MoKG5ibG9ja3MpICogc2l6ZW9mKCpyYmxvY2tzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYmxvY2tzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAorCWJsb2NrID0gJnJibG9ja3NbMF07CisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUobnAsIGNoaWxkKSB7CisJCXN0cnVjdCByZXNvdXJjZSBjaGlsZF9yZXM7CisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShjaGlsZCwgMCwgJmNoaWxkX3Jlcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImNvdWxkIG5vdCBnZXQgYWRkcmVzcyBmb3Igbm9kZSAlc1xuIiwKKwkJCQljaGlsZC0+ZnVsbF9uYW1lKTsKKwkJCWdvdG8gZXJyX2NodW5rczsKKwkJfQorCisJCWlmIChjaGlsZF9yZXMuc3RhcnQgPCByZXMtPnN0YXJ0IHx8IGNoaWxkX3Jlcy5lbmQgPiByZXMtPmVuZCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJyZXNlcnZlZCBibG9jayAlcyBvdXRzaWRlIHRoZSBzcmFtIGFyZWFcbiIsCisJCQkJY2hpbGQtPmZ1bGxfbmFtZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfY2h1bmtzOworCQl9CisKKwkJYmxvY2stPnN0YXJ0ID0gY2hpbGRfcmVzLnN0YXJ0IC0gcmVzLT5zdGFydDsKKwkJYmxvY2stPnNpemUgPSByZXNvdXJjZV9zaXplKCZjaGlsZF9yZXMpOworCQlsaXN0X2FkZF90YWlsKCZibG9jay0+bGlzdCwgJnJlc2VydmVfbGlzdCk7CisKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZm91bmQgcmVzZXJ2ZWQgYmxvY2sgMHgleC0weCV4XG4iLAorCQkJYmxvY2stPnN0YXJ0LAorCQkJYmxvY2stPnN0YXJ0ICsgYmxvY2stPnNpemUpOworCisJCWJsb2NrKys7CisJfQorCisJLyogdGhlIGxhc3QgY2h1bmsgbWFya3MgdGhlIGVuZCBvZiB0aGUgcmVnaW9uICovCisJcmJsb2Nrc1tuYmxvY2tzIC0gMV0uc3RhcnQgPSBzaXplOworCXJibG9ja3NbbmJsb2NrcyAtIDFdLnNpemUgPSAwOworCWxpc3RfYWRkX3RhaWwoJnJibG9ja3NbbmJsb2NrcyAtIDFdLmxpc3QsICZyZXNlcnZlX2xpc3QpOworCisJbGlzdF9zb3J0KE5VTEwsICZyZXNlcnZlX2xpc3QsIHNyYW1fcmVzZXJ2ZV9jbXApOworCisJY3VyX3N0YXJ0ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZyZXNlcnZlX2xpc3QsIGxpc3QpIHsKKwkJLyogY2FuIG9ubHkgaGFwcGVuIGlmIHNlY3Rpb25zIG92ZXJsYXAgKi8KKwkJaWYgKGJsb2NrLT5zdGFydCA8IGN1cl9zdGFydCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJibG9jayBhdCAweCV4IHN0YXJ0cyBhZnRlciBjdXJyZW50IG9mZnNldCAweCVseFxuIiwKKwkJCQlibG9jay0+c3RhcnQsIGN1cl9zdGFydCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfY2h1bmtzOworCQl9CisKKwkJLyogY3VycmVudCBzdGFydCBpcyBpbiBhIHJlc2VydmVkIGJsb2NrLCBzbyBjb250aW51ZSBhZnRlciBpdCAqLworCQlpZiAoYmxvY2stPnN0YXJ0ID09IGN1cl9zdGFydCkgeworCQkJY3VyX3N0YXJ0ID0gYmxvY2stPnN0YXJ0ICsgYmxvY2stPnNpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIGFsbG9jYXRlIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHN0YXJ0aW5nCisJCSAqIGFkZHJlc3MgYW5kIHRoZSBmb2xsb3dpbmcgcmVzZXJ2ZWQgYmxvY2ssIG9yIHRoZQorCQkgKiBlbmQgb2YgdGhlIHJlZ2lvbi4KKwkJICovCisJCWN1cl9zaXplID0gYmxvY2stPnN0YXJ0IC0gY3VyX3N0YXJ0OworCisJCWRldl9kYmcoJnBkZXYtPmRldiwgImFkZGluZyBjaHVuayAweCVseC0weCVseFxuIiwKKwkJCWN1cl9zdGFydCwgY3VyX3N0YXJ0ICsgY3VyX3NpemUpOworCQlyZXQgPSBnZW5fcG9vbF9hZGRfdmlydChzcmFtLT5wb29sLAorCQkJCSh1bnNpZ25lZCBsb25nKXZpcnRfYmFzZSArIGN1cl9zdGFydCwKKwkJCQlyZXMtPnN0YXJ0ICsgY3VyX3N0YXJ0LCBjdXJfc2l6ZSwgLTEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX2NodW5rczsKKworCQkvKiBuZXh0IGFsbG9jYXRpb24gYWZ0ZXIgdGhpcyByZXNlcnZlZCBibG9jayAqLworCQljdXJfc3RhcnQgPSBibG9jay0+c3RhcnQgKyBibG9jay0+c2l6ZTsKKwl9CisKKwlrZnJlZShyYmxvY2tzKTsKKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNyYW0pOwogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiU1JBTSBwb29sOiAlbGQgS2lCIEAgMHglcFxuIiwgc2l6ZSAvIDEwMjQsIHZpcnRfYmFzZSk7CiAKIAlyZXR1cm4gMDsKKworZXJyX2NodW5rczoKKwlrZnJlZShyYmxvY2tzKTsKK2Vycl9hbGxvYzoKKwlpZiAoc3JhbS0+Y2xrKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc3JhbS0+Y2xrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHNyYW1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC04Nyw4ICsxOTgsNiBAQAogCWlmIChnZW5fcG9vbF9hdmFpbChzcmFtLT5wb29sKSA8IGdlbl9wb29sX3NpemUoc3JhbS0+cG9vbCkpCiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInJlbW92ZWQgd2hpbGUgU1JBTSBhbGxvY2F0ZWRcbiIpOwogCi0JZ2VuX3Bvb2xfZGVzdHJveShzcmFtLT5wb29sKTsKLQogCWlmIChzcmFtLT5jbGspCiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcmFtLT5jbGspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYwppbmRleCAzYWVkNTI1Li4xOTcyZDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkJIihzdGMpOiAiIGZtdAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGlfZGFjNzUxMi5jIGIvZHJpdmVycy9taXNjL3RpX2RhYzc1MTIuYwppbmRleCA4M2RhNzExLi5jYjAyODliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGlfZGFjNzUxMi5jCisrKyBiL2RyaXZlcnMvbWlzYy90aV9kYWM3NTEyLmMKQEAgLTIwLDcgKzIwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdHNsMjU1MC5jIGIvZHJpdmVycy9taXNjL3RzbDI1NTAuYwppbmRleCA1YmMxMGZhMS4uYjAwMzM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RzbDI1NTAuYworKysgYi9kcml2ZXJzL21pc2MvdHNsMjU1MC5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2d1ZXN0LmMgYi9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ndWVzdC5jCmluZGV4IGQzNWNkYTAuLmUwZDUwMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2d1ZXN0LmMKKysrIGIvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfZ3Vlc3QuYwpAQCAtMzgzLDExICszODMsMTIgQEAKIAkJdm1jaV9kZXYtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IgPSBpOwogCX0KIAotCXJlc3VsdCA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCB2bWNpX2Rldi0+bXNpeF9lbnRyaWVzLCBWTUNJX01BWF9JTlRSUyk7CisJcmVzdWx0ID0gcGNpX2VuYWJsZV9tc2l4X2V4YWN0KHBkZXYsCisJCQkJICAgICAgIHZtY2lfZGV2LT5tc2l4X2VudHJpZXMsIFZNQ0lfTUFYX0lOVFJTKTsKIAlpZiAocmVzdWx0ID09IDApCiAJCXZtY2lfZGV2LT5leGNsdXNpdmVfdmVjdG9ycyA9IHRydWU7Ci0JZWxzZSBpZiAocmVzdWx0ID4gMCkKLQkJcmVzdWx0ID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIHZtY2lfZGV2LT5tc2l4X2VudHJpZXMsIDEpOworCWVsc2UgaWYgKHJlc3VsdCA9PSAtRU5PU1BDKQorCQlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaXhfZXhhY3QocGRldiwgdm1jaV9kZXYtPm1zaXhfZW50cmllcywgMSk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKaW5kZXggNTVjZDExMC4uYzIwNGI3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCkBAIC0yNjA3LDcgKzI2MDcsNyBAQAogCiAJdGFza2xldF9pbml0KCZob3N0LT50YXNrbGV0LCBkd19tY2lfdGFza2xldF9mdW5jLCAodW5zaWduZWQgbG9uZylob3N0KTsKIAlob3N0LT5jYXJkX3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgiZHctbWNpLWNhcmQiLAotCQkJV1FfTUVNX1JFQ0xBSU0gfCBXUV9OT05fUkVFTlRSQU5ULCAxKTsKKwkJCVdRX01FTV9SRUNMQUlNLCAxKTsKIAlpZiAoIWhvc3QtPmNhcmRfd29ya3F1ZXVlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2RtYXVubWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IDkwZmY0NDcuLmE0YmVlNDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC00MjgsNiArNDI4LDcgQEAKIAl0cmlzdGF0ZSAiTkFORCBzdXBwb3J0IGZvciBGcmVlc2NhbGUgSUZDIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBNVERfTkFORCAmJiBGU0xfU09DCiAJc2VsZWN0IEZTTF9JRkMKKwlzZWxlY3QgTUVNT1JZCiAJaGVscAogCSAgVmFyaW91cyBGcmVlc2NhbGUgY2hpcHMgZS5nIFAxMDEwLCBpbmNsdWRlIGEgTkFORCBGbGFzaCBtYWNoaW5lCiAJICB3aXRoIGJ1aWx0LWluIGhhcmR3YXJlIEVDQyBjYXBhYmlsaXRpZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9pZmNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfaWZjX25hbmQuYwppbmRleCA5MGNhN2U3Li41MGQ5MTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9pZmNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX2lmY19uYW5kLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfZWNjLmg+Ci0jaW5jbHVkZSA8YXNtL2ZzbF9pZmMuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfaWZjLmg+CiAKICNkZWZpbmUgRlNMX0lGQ19WMV8xXzAJMHgwMTAxMDAwMAogI2RlZmluZSBFUlJfQllURQkJMHhGRiAvKiBWYWx1ZSByZXR1cm5lZCBmb3IgcmVhZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jCmluZGV4IDJlNDVmNmUuLjM4MGQyNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMKQEAgLTEyNDgsMTkgKzEyNDgsMTMgQEAKIAkgKiBzaGFyZWQgcmVnaXN0ZXIgZm9yIHRoZSBoaWdoIDMyIGJpdHMsIHNvIG9ubHkgYSBzaW5nbGUsIGFsaWduZWQsCiAJICogNCBHQiBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIGNhbiBiZSB1c2VkIGZvciBkZXNjcmlwdG9ycy4KIAkgKi8KLQlpZiAoIWRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSAmJgotCSAgICAhZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CisJaWYgKCFkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgIkRNQSB0byA2NC1CSVQgYWRkcmVzc2VzXG4iKTsKIAl9IGVsc2UgewotCQllcnIgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWVyciA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChlcnIpIHsKLQkJCWVyciA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LAotCQkJCQkJICAgIERNQV9CSVRfTUFTSygzMikpOwotCQkJaWYgKGVycikgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkJIk5vIHVzYWJsZSBETUEgY29uZmlnLCBhYm9ydGluZ1xuIik7Ci0JCQkJZ290byBvdXRfcGNpX2Rpc2FibGU7Ci0JCQl9CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyB1c2FibGUgRE1BIGNvbmZpZywgYWJvcnRpbmdcbiIpOworCQkJZ290byBvdXRfcGNpX2Rpc2FibGU7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWUvYXRsMWVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxZS9hdGwxZV9tYWluLmMKaW5kZXggZDVjMmQzZS4uNDIyYWFiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxZS9hdGwxZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxZS9hdGwxZV9tYWluLmMKQEAgLTI0MzYsNyArMjQzNiw3IEBACiBlcnJfcmVnaXN0ZXI6CiBlcnJfc3dfaW5pdDoKIGVycl9lZXByb206Ci0JaW91bm1hcChhZGFwdGVyLT5ody5od19hZGRyKTsKKwlwY2lfaW91bm1hcChwZGV2LCBhZGFwdGVyLT5ody5od19hZGRyKTsKIGVycl9pbml0X25ldGRldjoKIGVycl9pb3JlbWFwOgogCWZyZWVfbmV0ZGV2KG5ldGRldik7CkBAIC0yNDc0LDcgKzI0NzQsNyBAQAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAJYXRsMWVfZnJlZV9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKIAlhdGwxZV9mb3JjZV9wcygmYWRhcHRlci0+aHcpOwotCWlvdW5tYXAoYWRhcHRlci0+aHcuaHdfYWRkcik7CisJcGNpX2lvdW5tYXAocGRldiwgYWRhcHRlci0+aHcuaHdfYWRkcik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAlmcmVlX25ldGRldihuZXRkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuYwppbmRleCBmY2Y5MTA1YTUuLjA5ZjNmZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmMKQEAgLTEsNiArMSw2IEBACiAvKiBjbmljLmM6IEJyb2FkY29tIENOSUMgY29yZSBuZXR3b3JrIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTM0Miw3ICszNDIsNyBAQAogCXdoaWxlIChyZXRyeSA8IDMpIHsKIAkJcmMgPSAwOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXVscF9vcHMgPSByY3VfZGVyZWZlcmVuY2UoY25pY191bHBfdGJsW0NOSUNfVUxQX0lTQ1NJXSk7CisJCXVscF9vcHMgPSByY3VfZGVyZWZlcmVuY2UoY3AtPnVscF9vcHNbQ05JQ19VTFBfSVNDU0ldKTsKIAkJaWYgKHVscF9vcHMpCiAJCQlyYyA9IHVscF9vcHMtPmlzY3NpX25sX3NlbmRfbXNnKAogCQkJCWNwLT51bHBfaGFuZGxlW0NOSUNfVUxQX0lTQ1NJXSwKQEAgLTcyNiw3ICs3MjYsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+bnVtX3BhZ2VzOyBpKyspIHsKIAkJaWYgKGRtYS0+cGdfYXJyW2ldKSB7Ci0JCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wY2lkZXYtPmRldiwgQk5YMl9QQUdFX1NJWkUsCisJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJCSAgZG1hLT5wZ19hcnJbaV0sIGRtYS0+cGdfbWFwX2FycltpXSk7CiAJCQlkbWEtPnBnX2FycltpXSA9IE5VTEw7CiAJCX0KQEAgLTc4NSw3ICs3ODUsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyBpKyspIHsKIAkJZG1hLT5wZ19hcnJbaV0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGNpZGV2LT5kZXYsCi0JCQkJCQkgICAgQk5YMl9QQUdFX1NJWkUsCisJCQkJCQkgICAgQ05JQ19QQUdFX1NJWkUsCiAJCQkJCQkgICAgJmRtYS0+cGdfbWFwX2FycltpXSwKIAkJCQkJCSAgICBHRlBfQVRPTUlDKTsKIAkJaWYgKGRtYS0+cGdfYXJyW2ldID09IE5VTEwpCkBAIC03OTQsOCArNzk0LDggQEAKIAlpZiAoIXVzZV9wZ190YmwpCiAJCXJldHVybiAwOwogCi0JZG1hLT5wZ3RibF9zaXplID0gKChwYWdlcyAqIDgpICsgQk5YMl9QQUdFX1NJWkUgLSAxKSAmCi0JCQkgIH4oQk5YMl9QQUdFX1NJWkUgLSAxKTsKKwlkbWEtPnBndGJsX3NpemUgPSAoKHBhZ2VzICogOCkgKyBDTklDX1BBR0VfU0laRSAtIDEpICYKKwkJCSAgfihDTklDX1BBR0VfU0laRSAtIDEpOwogCWRtYS0+cGd0YmwgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGNpZGV2LT5kZXYsIGRtYS0+cGd0Ymxfc2l6ZSwKIAkJCQkJJmRtYS0+cGd0YmxfbWFwLCBHRlBfQVRPTUlDKTsKIAlpZiAoZG1hLT5wZ3RibCA9PSBOVUxMKQpAQCAtOTAwLDggKzkwMCw4IEBACiAJaWYgKEJOWDJfQ0hJUChjcCkgPT0gQk5YMl9DSElQXzU3MDkpIHsKIAkJaW50IGksIGssIGFycl9zaXplOwogCi0JCWNwLT5jdHhfYmxrX3NpemUgPSBCTlgyX1BBR0VfU0laRTsKLQkJY3AtPmNpZHNfcGVyX2JsayA9IEJOWDJfUEFHRV9TSVpFIC8gMTI4OworCQljcC0+Y3R4X2Jsa19zaXplID0gQ05JQ19QQUdFX1NJWkU7CisJCWNwLT5jaWRzX3Blcl9ibGsgPSBDTklDX1BBR0VfU0laRSAvIDEyODsKIAkJYXJyX3NpemUgPSBCTlgyX01BWF9DSUQgLyBjcC0+Y2lkc19wZXJfYmxrICoKIAkJCSAgIHNpemVvZihzdHJ1Y3QgY25pY19jdHgpOwogCQljcC0+Y3R4X2FyciA9IGt6YWxsb2MoYXJyX3NpemUsIEdGUF9LRVJORUwpOwpAQCAtOTMzLDcgKzkzMyw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBjcC0+Y3R4X2Jsa3M7IGkrKykgewogCQkJY3AtPmN0eF9hcnJbaV0uY3R4ID0KIAkJCQlkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGNpZGV2LT5kZXYsCi0JCQkJCQkgICBCTlgyX1BBR0VfU0laRSwKKwkJCQkJCSAgIENOSUNfUEFHRV9TSVpFLAogCQkJCQkJICAgJmNwLT5jdHhfYXJyW2ldLm1hcHBpbmcsCiAJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJCWlmIChjcC0+Y3R4X2FycltpXS5jdHggPT0gTlVMTCkKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAJaWYgKHVkZXYtPmwyX3JpbmcpCiAJCXJldHVybiAwOwogCi0JdWRldi0+bDJfcmluZ19zaXplID0gcGFnZXMgKiBCTlgyX1BBR0VfU0laRTsKKwl1ZGV2LT5sMl9yaW5nX3NpemUgPSBwYWdlcyAqIENOSUNfUEFHRV9TSVpFOwogCXVkZXYtPmwyX3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnVkZXYtPnBkZXYtPmRldiwgdWRldi0+bDJfcmluZ19zaXplLAogCQkJCQkgICAmdWRldi0+bDJfcmluZ19tYXAsCiAJCQkJCSAgIEdGUF9LRVJORUwgfCBfX0dGUF9DT01QKTsKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdWRldi0+bDJfYnVmX3NpemUgPSAoY3AtPmwyX3J4X3Jpbmdfc2l6ZSArIDEpICogY3AtPmwyX3NpbmdsZV9idWZfc2l6ZTsKLQl1ZGV2LT5sMl9idWZfc2l6ZSA9IFBBR0VfQUxJR04odWRldi0+bDJfYnVmX3NpemUpOworCXVkZXYtPmwyX2J1Zl9zaXplID0gQ05JQ19QQUdFX0FMSUdOKHVkZXYtPmwyX2J1Zl9zaXplKTsKIAl1ZGV2LT5sMl9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnVkZXYtPnBkZXYtPmRldiwgdWRldi0+bDJfYnVmX3NpemUsCiAJCQkJCSAgJnVkZXYtPmwyX2J1Zl9tYXAsCiAJCQkJCSAgR0ZQX0tFUk5FTCB8IF9fR0ZQX0NPTVApOwpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKIAkJdWluZm8tPm1lbVswXS5zaXplID0gTUJfR0VUX0NJRF9BRERSKFRYX1RTU19DSUQgKwogCQkJCQkJICAgICBUWF9NQVhfVFNTX1JJTkdTICsgMSk7CiAJCXVpbmZvLT5tZW1bMV0uYWRkciA9ICh1bnNpZ25lZCBsb25nKSBjcC0+c3RhdHVzX2Jsay5nZW4gJgotCQkJCQlQQUdFX01BU0s7CisJCQkJCUNOSUNfUEFHRV9NQVNLOwogCQlpZiAoY3AtPmV0aGRldi0+ZHJ2X3N0YXRlICYgQ05JQ19EUlZfU1RBVEVfVVNJTkdfTVNJWCkKIAkJCXVpbmZvLT5tZW1bMV0uc2l6ZSA9IEJOWDJfU0JMS19NU0lYX0FMSUdOX1NJWkUgKiA5OwogCQllbHNlCkBAIC0xMTEzLDcgKzExMTMsNyBAQAogCQl1aW5mby0+bWVtWzBdLnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGNpZGV2LCAwKTsKIAogCQl1aW5mby0+bWVtWzFdLmFkZHIgPSAodW5zaWduZWQgbG9uZykgY3AtPmJueDJ4X2RlZl9zdGF0dXNfYmxrICYKLQkJCVBBR0VfTUFTSzsKKwkJCUNOSUNfUEFHRV9NQVNLOwogCQl1aW5mby0+bWVtWzFdLnNpemUgPSBzaXplb2YoKmNwLT5ibngyeF9kZWZfc3RhdHVzX2Jsayk7CiAKIAkJdWluZm8tPm5hbWUgPSAiYm54MnhfY25pYyI7CkBAIC0xMjY3LDE0ICsxMjY3LDE0IEBACiAJZm9yIChpID0gTUFYX0lTQ1NJX1RCTF9TWjsgaSA8IGNwLT5tYXhfY2lkX3NwYWNlOyBpKyspCiAJCWNwLT5jdHhfdGJsW2ldLnVscF9wcm90b19pZCA9IENOSUNfVUxQX0ZDT0U7CiAKLQlwYWdlcyA9IFBBR0VfQUxJR04oY3AtPm1heF9jaWRfc3BhY2UgKiBDTklDX0tXUTE2X0RBVEFfU0laRSkgLwotCQlQQUdFX1NJWkU7CisJcGFnZXMgPSBDTklDX1BBR0VfQUxJR04oY3AtPm1heF9jaWRfc3BhY2UgKiBDTklDX0tXUTE2X0RBVEFfU0laRSkgLworCQlDTklDX1BBR0VfU0laRTsKIAogCXJldCA9IGNuaWNfYWxsb2NfZG1hKGRldiwga3dxXzE2X2RtYSwgcGFnZXMsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbiA9IFBBR0VfU0laRSAvIENOSUNfS1dRMTZfREFUQV9TSVpFOworCW4gPSBDTklDX1BBR0VfU0laRSAvIENOSUNfS1dRMTZfREFUQV9TSVpFOwogCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgY3AtPm1heF9jaWRfc3BhY2U7IGkrKykgewogCQlsb25nIG9mZiA9IENOSUNfS1dRMTZfREFUQV9TSVpFICogKGkgJSBuKTsKIApAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIAkJCWdvdG8gZXJyb3I7CiAJfQogCi0JcGFnZXMgPSBQQUdFX0FMSUdOKEJOWDJYX0lTQ1NJX0dMQl9CVUZfU0laRSkgLyBQQUdFX1NJWkU7CisJcGFnZXMgPSBDTklDX1BBR0VfQUxJR04oQk5YMlhfSVNDU0lfR0xCX0JVRl9TSVpFKSAvIENOSUNfUEFHRV9TSVpFOwogCXJldCA9IGNuaWNfYWxsb2NfZG1hKGRldiwgJmNwLT5nYmxfYnVmX2luZm8sIHBhZ2VzLCAwKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwpAQCAtMTQ2Niw4ICsxNDY2LDggQEAKIAljcC0+cjJ0cV9zaXplID0gY3AtPm51bV9pc2NzaV90YXNrcyAqIEJOWDJYX0lTQ1NJX01BWF9QRU5ESU5HX1IyVFMgKgogCQkJQk5YMlhfSVNDU0lfUjJUUUVfU0laRTsKIAljcC0+aHFfc2l6ZSA9IGNwLT5udW1fY2NlbGxzICogQk5YMlhfSVNDU0lfSFFfQkRfU0laRTsKLQlwYWdlcyA9IFBBR0VfQUxJR04oY3AtPmhxX3NpemUpIC8gUEFHRV9TSVpFOwotCWhxX2JkcyA9IHBhZ2VzICogKFBBR0VfU0laRSAvIEJOWDJYX0lTQ1NJX0hRX0JEX1NJWkUpOworCXBhZ2VzID0gQ05JQ19QQUdFX0FMSUdOKGNwLT5ocV9zaXplKSAvIENOSUNfUEFHRV9TSVpFOworCWhxX2JkcyA9IHBhZ2VzICogKENOSUNfUEFHRV9TSVpFIC8gQk5YMlhfSVNDU0lfSFFfQkRfU0laRSk7CiAJY3AtPm51bV9jcXMgPSByZXExLT5udW1fY3FzOwogCiAJaWYgKCFkZXYtPm1heF9pc2NzaV9jb25uKQpAQCAtMTQ3Nyw5ICsxNDc3LDkgQEAKIAlDTklDX1dSMTYoZGV2LCBCQVJfVFNUUk9STV9JTlRNRU0gKyBUU1RPUk1fSVNDU0lfUlFfU0laRV9PRkZTRVQocGZpZCksCiAJCSAgcmVxMS0+cnFfbnVtX3dxZXMpOwogCUNOSUNfV1IxNihkZXYsIEJBUl9UU1RST1JNX0lOVE1FTSArIFRTVE9STV9JU0NTSV9QQUdFX1NJWkVfT0ZGU0VUKHBmaWQpLAotCQkgIFBBR0VfU0laRSk7CisJCSAgQ05JQ19QQUdFX1NJWkUpOwogCUNOSUNfV1I4KGRldiwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJIFRTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZmlkKSwgUEFHRV9TSElGVCk7CisJCSBUU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZpZCksIENOSUNfUEFHRV9CSVRTKTsKIAlDTklDX1dSMTYoZGV2LCBCQVJfVFNUUk9STV9JTlRNRU0gKwogCQkgIFRTVE9STV9JU0NTSV9OVU1fT0ZfVEFTS1NfT0ZGU0VUKHBmaWQpLAogCQkgIHJlcTEtPm51bV90YXNrc19wZXJfY29ubik7CkBAIC0xNDg5LDkgKzE0ODksOSBAQAogCQkgIFVTVE9STV9JU0NTSV9SUV9CVUZGRVJfU0laRV9PRkZTRVQocGZpZCksCiAJCSAgcmVxMS0+cnFfYnVmZmVyX3NpemUpOwogCUNOSUNfV1IxNihkZXYsIEJBUl9VU1RST1JNX0lOVE1FTSArIFVTVE9STV9JU0NTSV9QQUdFX1NJWkVfT0ZGU0VUKHBmaWQpLAotCQkgIFBBR0VfU0laRSk7CisJCSAgQ05JQ19QQUdFX1NJWkUpOwogCUNOSUNfV1I4KGRldiwgQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJIFVTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZmlkKSwgUEFHRV9TSElGVCk7CisJCSBVU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZpZCksIENOSUNfUEFHRV9CSVRTKTsKIAlDTklDX1dSMTYoZGV2LCBCQVJfVVNUUk9STV9JTlRNRU0gKwogCQkgIFVTVE9STV9JU0NTSV9OVU1fT0ZfVEFTS1NfT0ZGU0VUKHBmaWQpLAogCQkgIHJlcTEtPm51bV90YXNrc19wZXJfY29ubik7CkBAIC0xNTA0LDkgKzE1MDQsOSBAQAogCiAJLyogaW5pdCBYc3Rvcm0gUkFNICovCiAJQ05JQ19XUjE2KGRldiwgQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX0lTQ1NJX1BBR0VfU0laRV9PRkZTRVQocGZpZCksCi0JCSAgUEFHRV9TSVpFKTsKKwkJICBDTklDX1BBR0VfU0laRSk7CiAJQ05JQ19XUjgoZGV2LCBCQVJfWFNUUk9STV9JTlRNRU0gKwotCQkgWFNUT1JNX0lTQ1NJX1BBR0VfU0laRV9MT0dfT0ZGU0VUKHBmaWQpLCBQQUdFX1NISUZUKTsKKwkJIFhTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZmlkKSwgQ05JQ19QQUdFX0JJVFMpOwogCUNOSUNfV1IxNihkZXYsIEJBUl9YU1RST1JNX0lOVE1FTSArCiAJCSAgWFNUT1JNX0lTQ1NJX05VTV9PRl9UQVNLU19PRkZTRVQocGZpZCksCiAJCSAgcmVxMS0+bnVtX3Rhc2tzX3Blcl9jb25uKTsKQEAgLTE1MTksOSArMTUxOSw5IEBACiAKIAkvKiBpbml0IENzdG9ybSBSQU0gKi8KIAlDTklDX1dSMTYoZGV2LCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBDU1RPUk1fSVNDU0lfUEFHRV9TSVpFX09GRlNFVChwZmlkKSwKLQkJICBQQUdFX1NJWkUpOworCQkgIENOSUNfUEFHRV9TSVpFKTsKIAlDTklDX1dSOChkZXYsIEJBUl9DU1RST1JNX0lOVE1FTSArCi0JCSBDU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZpZCksIFBBR0VfU0hJRlQpOworCQkgQ1NUT1JNX0lTQ1NJX1BBR0VfU0laRV9MT0dfT0ZGU0VUKHBmaWQpLCBDTklDX1BBR0VfQklUUyk7CiAJQ05JQ19XUjE2KGRldiwgQkFSX0NTVFJPUk1fSU5UTUVNICsKIAkJICBDU1RPUk1fSVNDU0lfTlVNX09GX1RBU0tTX09GRlNFVChwZmlkKSwKIAkJICByZXExLT5udW1fdGFza3NfcGVyX2Nvbm4pOwpAQCAtMTYyMywxOCArMTYyMywxOCBAQAogCX0KIAogCWN0eC0+Y2lkID0gY2lkOwotCXBhZ2VzID0gUEFHRV9BTElHTihjcC0+dGFza19hcnJheV9zaXplKSAvIFBBR0VfU0laRTsKKwlwYWdlcyA9IENOSUNfUEFHRV9BTElHTihjcC0+dGFza19hcnJheV9zaXplKSAvIENOSUNfUEFHRV9TSVpFOwogCiAJcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCAmaXNjc2ktPnRhc2tfYXJyYXlfaW5mbywgcGFnZXMsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CiAKLQlwYWdlcyA9IFBBR0VfQUxJR04oY3AtPnIydHFfc2l6ZSkgLyBQQUdFX1NJWkU7CisJcGFnZXMgPSBDTklDX1BBR0VfQUxJR04oY3AtPnIydHFfc2l6ZSkgLyBDTklDX1BBR0VfU0laRTsKIAlyZXQgPSBjbmljX2FsbG9jX2RtYShkZXYsICZpc2NzaS0+cjJ0cV9pbmZvLCBwYWdlcywgMSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcjsKIAotCXBhZ2VzID0gUEFHRV9BTElHTihjcC0+aHFfc2l6ZSkgLyBQQUdFX1NJWkU7CisJcGFnZXMgPSBDTklDX1BBR0VfQUxJR04oY3AtPmhxX3NpemUpIC8gQ05JQ19QQUdFX1NJWkU7CiAJcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCAmaXNjc2ktPmhxX2luZm8sIHBhZ2VzLCAxKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwpAQCAtMTc2MCw3ICsxNzYwLDcgQEAKIAlpY3R4LT50c3Rvcm1fc3RfY29udGV4dC5pc2NzaS5oZHJfYnl0ZXNfMl9mZXRjaCA9IElTQ1NJX0hFQURFUl9TSVpFOwogCS8qIFRTVE9STSByZXF1aXJlcyB0aGUgYmFzZSBhZGRyZXNzIG9mIFJRIERCICYgbm90IFBURSAqLwogCWljdHgtPnRzdG9ybV9zdF9jb250ZXh0LmlzY3NpLnJxX2RiX3BoeV9hZGRyLmxvID0KLQkJcmVxMi0+cnFfcGFnZV90YWJsZV9hZGRyX2xvICYgUEFHRV9NQVNLOworCQlyZXEyLT5ycV9wYWdlX3RhYmxlX2FkZHJfbG8gJiBDTklDX1BBR0VfTUFTSzsKIAlpY3R4LT50c3Rvcm1fc3RfY29udGV4dC5pc2NzaS5ycV9kYl9waHlfYWRkci5oaSA9CiAJCXJlcTItPnJxX3BhZ2VfdGFibGVfYWRkcl9oaTsKIAlpY3R4LT50c3Rvcm1fc3RfY29udGV4dC5pc2NzaS5pc2NzaV9jb25uX2lkID0gcmVxMS0+aXNjc2lfY29ubl9pZDsKQEAgLTE4NDIsNyArMTg0Miw3IEBACiAJLyogQ1NUT1JNIGFuZCBVU1RPUk0gaW5pdGlhbGl6YXRpb24gaXMgZGlmZmVyZW50LCBDU1RPUk0gcmVxdWlyZXMKIAkgKiBDUSBEQiBiYXNlICYgbm90IFBURSBhZGRyICovCiAJaWN0eC0+Y3N0b3JtX3N0X2NvbnRleHQuY3FfZGJfYmFzZS5sbyA9Ci0JCXJlcTEtPmNxX3BhZ2VfdGFibGVfYWRkcl9sbyAmIFBBR0VfTUFTSzsKKwkJcmVxMS0+Y3FfcGFnZV90YWJsZV9hZGRyX2xvICYgQ05JQ19QQUdFX01BU0s7CiAJaWN0eC0+Y3N0b3JtX3N0X2NvbnRleHQuY3FfZGJfYmFzZS5oaSA9IHJlcTEtPmNxX3BhZ2VfdGFibGVfYWRkcl9oaTsKIAlpY3R4LT5jc3Rvcm1fc3RfY29udGV4dC5pc2NzaV9jb25uX2lkID0gcmVxMS0+aXNjc2lfY29ubl9pZDsKIAlpY3R4LT5jc3Rvcm1fc3RfY29udGV4dC5jcV9wcm9jX2VuX2JpdF9tYXAgPSAoMSA8PCBjcC0+bnVtX2NxcykgLSAxOwpAQCAtMjkxMSw3ICsyOTExLDcgQEAKIAl1MTYgaHdfY29ucywgc3dfY29uczsKIAlzdHJ1Y3QgY25pY191aW9fZGV2ICp1ZGV2ID0gY3AtPnVkZXY7CiAJdW5pb24gZXRoX3J4X2NxZSAqY3FlLCAqY3FlX3JpbmcgPSAodW5pb24gZXRoX3J4X2NxZSAqKQotCQkJCQkodWRldi0+bDJfcmluZyArICgyICogQk5YMl9QQUdFX1NJWkUpKTsKKwkJCQkJKHVkZXYtPmwyX3JpbmcgKyAoMiAqIENOSUNfUEFHRV9TSVpFKSk7CiAJdTMyIGNtZDsKIAlpbnQgY29tcCA9IDA7CiAKQEAgLTMyNDQsNyArMzI0NCw4IEBACiAJaW50IHJjOwogCiAJbXV0ZXhfbG9jaygmY25pY19sb2NrKTsKLQl1bHBfb3BzID0gY25pY191bHBfdGJsX3Byb3QodWxwX3R5cGUpOworCXVscF9vcHMgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGNwLT51bHBfb3BzW3VscF90eXBlXSwKKwkJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmY25pY19sb2NrKSk7CiAJaWYgKHVscF9vcHMgJiYgdWxwX29wcy0+Y25pY19nZXRfc3RhdHMpCiAJCXJjID0gdWxwX29wcy0+Y25pY19nZXRfc3RhdHMoY3AtPnVscF9oYW5kbGVbdWxwX3R5cGVdKTsKIAllbHNlCkBAIC00Mzg0LDcgKzQzODUsNyBAQAogCQl1MzIgaWR4ID0gY3AtPmN0eF9hcnJbaV0uY2lkIC8gY3AtPmNpZHNfcGVyX2JsazsKIAkJdTMyIHZhbDsKIAotCQltZW1zZXQoY3AtPmN0eF9hcnJbaV0uY3R4LCAwLCBCTlgyX1BBR0VfU0laRSk7CisJCW1lbXNldChjcC0+Y3R4X2FycltpXS5jdHgsIDAsIENOSUNfUEFHRV9TSVpFKTsKIAogCQlDTklDX1dSKGRldiwgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9EQVRBMCwKIAkJCShjcC0+Y3R4X2FycltpXS5tYXBwaW5nICYgMHhmZmZmZmZmZikgfCB2YWxpZF9iaXQpOwpAQCAtNDYyOCw3ICs0NjI5LDcgQEAKIAkJdmFsID0gQk5YMl9MMkNUWF9MMl9TVEFUVVNCX05VTShzYl9pZCk7CiAJY25pY19jdHhfd3IoZGV2LCBjaWRfYWRkciwgQk5YMl9MMkNUWF9IT1NUX0JESURYLCB2YWwpOwogCi0JcnhiZCA9IHVkZXYtPmwyX3JpbmcgKyBCTlgyX1BBR0VfU0laRTsKKwlyeGJkID0gdWRldi0+bDJfcmluZyArIENOSUNfUEFHRV9TSVpFOwogCWZvciAoaSA9IDA7IGkgPCBCTlgyX01BWF9SWF9ERVNDX0NOVDsgaSsrLCByeGJkKyspIHsKIAkJZG1hX2FkZHJfdCBidWZfbWFwOwogCQlpbnQgbiA9IChpICUgY3AtPmwyX3J4X3Jpbmdfc2l6ZSkgKyAxOwpAQCAtNDYzOSwxMSArNDY0MCwxMSBAQAogCQlyeGJkLT5yeF9iZF9oYWRkcl9oaSA9ICh1NjQpIGJ1Zl9tYXAgPj4gMzI7CiAJCXJ4YmQtPnJ4X2JkX2hhZGRyX2xvID0gKHU2NCkgYnVmX21hcCAmIDB4ZmZmZmZmZmY7CiAJfQotCXZhbCA9ICh1NjQpIChyaW5nX21hcCArIEJOWDJfUEFHRV9TSVpFKSA+PiAzMjsKKwl2YWwgPSAodTY0KSAocmluZ19tYXAgKyBDTklDX1BBR0VfU0laRSkgPj4gMzI7CiAJY25pY19jdHhfd3IoZGV2LCBjaWRfYWRkciwgQk5YMl9MMkNUWF9OWF9CREhBRERSX0hJLCB2YWwpOwogCXJ4YmQtPnJ4X2JkX2hhZGRyX2hpID0gdmFsOwogCi0JdmFsID0gKHU2NCkgKHJpbmdfbWFwICsgQk5YMl9QQUdFX1NJWkUpICYgMHhmZmZmZmZmZjsKKwl2YWwgPSAodTY0KSAocmluZ19tYXAgKyBDTklDX1BBR0VfU0laRSkgJiAweGZmZmZmZmZmOwogCWNuaWNfY3R4X3dyKGRldiwgY2lkX2FkZHIsIEJOWDJfTDJDVFhfTlhfQkRIQUREUl9MTywgdmFsKTsKIAlyeGJkLT5yeF9iZF9oYWRkcl9sbyA9IHZhbDsKIApAQCAtNDcwOSwxMCArNDcxMCwxMCBAQAogCiAJdmFsID0gQ05JQ19SRChkZXYsIEJOWDJfTVFfQ09ORklHKTsKIAl2YWwgJj0gfkJOWDJfTVFfQ09ORklHX0tOTF9CWVBfQkxLX1NJWkU7Ci0JaWYgKEJOWDJfUEFHRV9CSVRTID4gMTIpCisJaWYgKENOSUNfUEFHRV9CSVRTID4gMTIpCiAJCXZhbCB8PSAoMTIgLSA4KSAgPDwgNDsKIAllbHNlCi0JCXZhbCB8PSAoQk5YMl9QQUdFX0JJVFMgLSA4KSAgPDwgNDsKKwkJdmFsIHw9IChDTklDX1BBR0VfQklUUyAtIDgpICA8PCA0OwogCiAJQ05JQ19XUihkZXYsIEJOWDJfTVFfQ09ORklHLCB2YWwpOwogCkBAIC00NzQyLDEzICs0NzQzLDEzIEBACiAKIAkvKiBJbml0aWFsaXplIHRoZSBrZXJuZWwgd29yayBxdWV1ZSBjb250ZXh0LiAqLwogCXZhbCA9IEtSTkxRX1RZUEVfVFlQRV9LUk5MUSB8IEtSTkxRX1NJWkVfVFlQRV9TSVpFIHwKLQkgICAgICAoQk5YMl9QQUdFX0JJVFMgLSA4KSB8IEtSTkxRX0ZMQUdTX1FFX1NFTEZfU0VROworCSAgICAgIChDTklDX1BBR0VfQklUUyAtIDgpIHwgS1JOTFFfRkxBR1NfUUVfU0VMRl9TRVE7CiAJY25pY19jdHhfd3IoZGV2LCBrd3FfY2lkX2FkZHIsIEw1X0tSTkxRX1RZUEUsIHZhbCk7CiAKLQl2YWwgPSAoQk5YMl9QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGt3cWUpIC0gMSkgPDwgMTY7CisJdmFsID0gKENOSUNfUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBrd3FlKSAtIDEpIDw8IDE2OwogCWNuaWNfY3R4X3dyKGRldiwga3dxX2NpZF9hZGRyLCBMNV9LUk5MUV9RRV9TRUxGX1NFUV9NQVgsIHZhbCk7CiAKLQl2YWwgPSAoKEJOWDJfUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBrd3FlKSkgPDwgMTYpIHwgS1dRX1BBR0VfQ05UOworCXZhbCA9ICgoQ05JQ19QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGt3cWUpKSA8PCAxNikgfCBLV1FfUEFHRV9DTlQ7CiAJY25pY19jdHhfd3IoZGV2LCBrd3FfY2lkX2FkZHIsIEw1X0tSTkxRX1BHVEJMX05QQUdFUywgdmFsKTsKIAogCXZhbCA9ICh1MzIpICgodTY0KSBjcC0+a3dxX2luZm8ucGd0YmxfbWFwID4+IDMyKTsKQEAgLTQ3NjgsMTMgKzQ3NjksMTMgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIGtlcm5lbCBjb21wbGV0ZSBxdWV1ZSBjb250ZXh0LiAqLwogCXZhbCA9IEtSTkxRX1RZUEVfVFlQRV9LUk5MUSB8IEtSTkxRX1NJWkVfVFlQRV9TSVpFIHwKLQkgICAgICAoQk5YMl9QQUdFX0JJVFMgLSA4KSB8IEtSTkxRX0ZMQUdTX1FFX1NFTEZfU0VROworCSAgICAgIChDTklDX1BBR0VfQklUUyAtIDgpIHwgS1JOTFFfRkxBR1NfUUVfU0VMRl9TRVE7CiAJY25pY19jdHhfd3IoZGV2LCBrY3FfY2lkX2FkZHIsIEw1X0tSTkxRX1RZUEUsIHZhbCk7CiAKLQl2YWwgPSAoQk5YMl9QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGtjcWUpIC0gMSkgPDwgMTY7CisJdmFsID0gKENOSUNfUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBrY3FlKSAtIDEpIDw8IDE2OwogCWNuaWNfY3R4X3dyKGRldiwga2NxX2NpZF9hZGRyLCBMNV9LUk5MUV9RRV9TRUxGX1NFUV9NQVgsIHZhbCk7CiAKLQl2YWwgPSAoKEJOWDJfUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBrY3FlKSkgPDwgMTYpIHwgS0NRX1BBR0VfQ05UOworCXZhbCA9ICgoQ05JQ19QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGtjcWUpKSA8PCAxNikgfCBLQ1FfUEFHRV9DTlQ7CiAJY25pY19jdHhfd3IoZGV2LCBrY3FfY2lkX2FkZHIsIEw1X0tSTkxRX1BHVEJMX05QQUdFUywgdmFsKTsKIAogCXZhbCA9ICh1MzIpICgodTY0KSBjcC0+a2NxMS5kbWEucGd0YmxfbWFwID4+IDMyKTsKQEAgLTQ5MTgsNyArNDkxOSw3IEBACiAJdTMyIGNsaSA9IGNwLT5ldGhkZXYtPmlzY3NpX2wyX2NsaWVudF9pZDsKIAl1MzIgdmFsOwogCi0JbWVtc2V0KHR4YmQsIDAsIEJOWDJfUEFHRV9TSVpFKTsKKwltZW1zZXQodHhiZCwgMCwgQ05JQ19QQUdFX1NJWkUpOwogCiAJYnVmX21hcCA9IHVkZXYtPmwyX2J1Zl9tYXA7CiAJZm9yIChpID0gMDsgaSA8IEJOWDJfTUFYX1RYX0RFU0NfQ05UOyBpICs9IDMsIHR4YmQgKz0gMykgewpAQCAtNDk3OCw5ICs0OTc5LDkgQEAKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2LT5uZXRkZXYpOwogCXN0cnVjdCBjbmljX3Vpb19kZXYgKnVkZXYgPSBjcC0+dWRldjsKIAlzdHJ1Y3QgZXRoX3J4X2JkICpyeGJkID0gKHN0cnVjdCBldGhfcnhfYmQgKikgKHVkZXYtPmwyX3JpbmcgKwotCQkJCUJOWDJfUEFHRV9TSVpFKTsKKwkJCQlDTklDX1BBR0VfU0laRSk7CiAJc3RydWN0IGV0aF9yeF9jcWVfbmV4dF9wYWdlICpyeGNxZSA9IChzdHJ1Y3QgZXRoX3J4X2NxZV9uZXh0X3BhZ2UgKikKLQkJCQkodWRldi0+bDJfcmluZyArICgyICogQk5YMl9QQUdFX1NJWkUpKTsKKwkJCQkodWRldi0+bDJfcmluZyArICgyICogQ05JQ19QQUdFX1NJWkUpKTsKIAlzdHJ1Y3QgaG9zdF9zcF9zdGF0dXNfYmxvY2sgKnNiID0gY3AtPmJueDJ4X2RlZl9zdGF0dXNfYmxrOwogCWludCBpOwogCXUzMiBjbGkgPSBjcC0+ZXRoZGV2LT5pc2NzaV9sMl9jbGllbnRfaWQ7CkBAIC01MDA0LDIwICs1MDA1LDIwIEBACiAJCXJ4YmQtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihidWZfbWFwICYgMHhmZmZmZmZmZik7CiAJfQogCi0JdmFsID0gKHU2NCkgKHJpbmdfbWFwICsgQk5YMl9QQUdFX1NJWkUpID4+IDMyOworCXZhbCA9ICh1NjQpIChyaW5nX21hcCArIENOSUNfUEFHRV9TSVpFKSA+PiAzMjsKIAlyeGJkLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIodmFsKTsKIAlkYXRhLT5yeC5iZF9wYWdlX2Jhc2UuaGkgPSBjcHVfdG9fbGUzMih2YWwpOwogCi0JdmFsID0gKHU2NCkgKHJpbmdfbWFwICsgQk5YMl9QQUdFX1NJWkUpICYgMHhmZmZmZmZmZjsKKwl2YWwgPSAodTY0KSAocmluZ19tYXAgKyBDTklDX1BBR0VfU0laRSkgJiAweGZmZmZmZmZmOwogCXJ4YmQtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMih2YWwpOwogCWRhdGEtPnJ4LmJkX3BhZ2VfYmFzZS5sbyA9IGNwdV90b19sZTMyKHZhbCk7CiAKIAlyeGNxZSArPSBCTlgyWF9NQVhfUkNRX0RFU0NfQ05UOwotCXZhbCA9ICh1NjQpIChyaW5nX21hcCArICgyICogQk5YMl9QQUdFX1NJWkUpKSA+PiAzMjsKKwl2YWwgPSAodTY0KSAocmluZ19tYXAgKyAoMiAqIENOSUNfUEFHRV9TSVpFKSkgPj4gMzI7CiAJcnhjcWUtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMih2YWwpOwogCWRhdGEtPnJ4LmNxZV9wYWdlX2Jhc2UuaGkgPSBjcHVfdG9fbGUzMih2YWwpOwogCi0JdmFsID0gKHU2NCkgKHJpbmdfbWFwICsgKDIgKiBCTlgyX1BBR0VfU0laRSkpICYgMHhmZmZmZmZmZjsKKwl2YWwgPSAodTY0KSAocmluZ19tYXAgKyAoMiAqIENOSUNfUEFHRV9TSVpFKSkgJiAweGZmZmZmZmZmOwogCXJ4Y3FlLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIodmFsKTsKIAlkYXRhLT5yeC5jcWVfcGFnZV9iYXNlLmxvID0gY3B1X3RvX2xlMzIodmFsKTsKIApAQCAtNTI2NSw4ICs1MjY2LDggQEAKIAkJbXNsZWVwKDEwKTsKIAl9CiAJY2xlYXJfYml0KENOSUNfTENMX0ZMX1JJTkdTX0lOSVRFRCwgJmNwLT5jbmljX2xvY2FsX2ZsYWdzKTsKLQlyeF9yaW5nID0gdWRldi0+bDJfcmluZyArIEJOWDJfUEFHRV9TSVpFOwotCW1lbXNldChyeF9yaW5nLCAwLCBCTlgyX1BBR0VfU0laRSk7CisJcnhfcmluZyA9IHVkZXYtPmwyX3JpbmcgKyBDTklDX1BBR0VfU0laRTsKKwltZW1zZXQocnhfcmluZywgMCwgQ05JQ19QQUdFX1NJWkUpOwogfQogCiBzdGF0aWMgaW50IGNuaWNfcmVnaXN0ZXJfbmV0ZGV2KHN0cnVjdCBjbmljX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5oCmluZGV4IDBkNmIxM2YuLmQ1MzVhZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjbmljLmg6IEJyb2FkY29tIENOSUMgY29yZSBuZXR3b3JrIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWNfZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19kZWZzLmgKaW5kZXggOTVhOGU0Yi4uZGNiY2E2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19kZWZzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19kZWZzLmgKQEAgLTEsNyArMSw3IEBACiAKIC8qIGNuaWMuYzogQnJvYWRjb20gQ05JQyBjb3JlIG5ldHdvcmsgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19pZi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19pZi5oCmluZGV4IDhjZjZiMTkyLi41ZjRkNTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2lmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19pZi5oCkBAIC0xLDYgKzEsNiBAQAogLyogY25pY19pZi5oOiBCcm9hZGNvbSBDTklDIGNvcmUgbmV0d29yayBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNCw4ICsxNCw4IEBACiAKICNpbmNsdWRlICJibngyeC9ibngyeF9tZndfcmVxLmgiCiAKLSNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi41LjE5IgotI2RlZmluZSBDTklDX01PRFVMRV9SRUxEQVRFCSJEZWNlbWJlciAxOSwgMjAxMyIKKyNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi41LjIwIgorI2RlZmluZSBDTklDX01PRFVMRV9SRUxEQVRFCSJNYXJjaCAxNCwgMjAxNCIKIAogI2RlZmluZSBDTklDX1VMUF9SRE1BCQkwCiAjZGVmaW5lIENOSUNfVUxQX0lTQ1NJCQkxCkBAIC0yNCw2ICsyNCwxNiBAQAogI2RlZmluZSBNQVhfQ05JQ19VTFBfVFlQRV9FWFQJMwogI2RlZmluZSBNQVhfQ05JQ19VTFBfVFlQRQk0CiAKKy8qIFVzZSBDUFUgbmF0aXZlIHBhZ2Ugc2l6ZSB1cCB0byAxNksgZm9yIGNuaWMgcmluZyBzaXplcy4gICovCisjaWYgKFBBR0VfU0hJRlQgPiAxNCkKKyNkZWZpbmUgQ05JQ19QQUdFX0JJVFMJMTQKKyNlbHNlCisjZGVmaW5lIENOSUNfUEFHRV9CSVRTCVBBR0VfU0hJRlQKKyNlbmRpZgorI2RlZmluZSBDTklDX1BBR0VfU0laRQkoMSA8PCAoQ05JQ19QQUdFX0JJVFMpKQorI2RlZmluZSBDTklDX1BBR0VfQUxJR04oYWRkcikgQUxJR04oYWRkciwgQ05JQ19QQUdFX1NJWkUpCisjZGVmaW5lIENOSUNfUEFHRV9NQVNLCSh+KChDTklDX1BBR0VfU0laRSkgLSAxKSkKKwogc3RydWN0IGt3cWUgewogCXUzMiBrd3FlX29wX2ZsYWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKaW5kZXggM2I2ZDBiYS4uNzBhMjI1YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCkBAIC0xNzY0OSw4ICsxNzY0OSw2IEBACiAKIAl0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHRwKTsKIAotCWZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlg7Ci0KIAkvKiA1NzAwIEIwIGNoaXBzIGRvIG5vdCBzdXBwb3J0IGNoZWNrc3VtbWluZyBjb3JyZWN0bHkgZHVlCiAJICogdG8gaGFyZHdhcmUgYnVncy4KIAkgKi8KQEAgLTE3NjgyLDcgKzE3NjgwLDggQEAKIAkJCWZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPX0VDTjsKIAl9CiAKLQlkZXYtPmZlYXR1cmVzIHw9IGZlYXR1cmVzOworCWRldi0+ZmVhdHVyZXMgfD0gZmVhdHVyZXMgfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8CisJCQkgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlg7CiAJZGV2LT52bGFuX2ZlYXR1cmVzIHw9IGZlYXR1cmVzOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jCmluZGV4IGY0MThmNGYuLjhkNzZmY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KQEAgLTg4LDggKzg5LDkgQEAKICNkZWZpbmUgICAgICBNVk5FVEFfVFhfSU5fUFJHUlMgICAgICAgICAgICAgICAgICBCSVQoMSkKICNkZWZpbmUgICAgICBNVk5FVEFfVFhfRklGT19FTVBUWSAgICAgICAgICAgICAgICBCSVQoOCkKICNkZWZpbmUgTVZORVRBX1JYX01JTl9GUkFNRV9TSVpFICAgICAgICAgICAgICAgICAweDI0N2MKLSNkZWZpbmUgTVZORVRBX1NHTUlJX1NFUkRFU19DRkcJCQkgMHgyNEEwCisjZGVmaW5lIE1WTkVUQV9TRVJERVNfQ0ZHCQkJIDB4MjRBMAogI2RlZmluZSAgICAgIE1WTkVUQV9TR01JSV9TRVJERVNfUFJPVE8JCSAweDBjYzcKKyNkZWZpbmUgICAgICBNVk5FVEFfUkdNSUlfU0VSREVTX1BST1RPCQkgMHgwNjY3CiAjZGVmaW5lIE1WTkVUQV9UWVBFX1BSSU8gICAgICAgICAgICAgICAgICAgICAgICAgMHgyNGJjCiAjZGVmaW5lICAgICAgTVZORVRBX0ZPUkNFX1VOSSAgICAgICAgICAgICAgICAgICAgQklUKDIxKQogI2RlZmluZSBNVk5FVEFfVFhRX0NNRF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjRlNApAQCAtMTYxLDcgKzE2Myw3IEBACiAjZGVmaW5lICAgICAgTVZORVRBX0dNQUNfTUFYX1JYX1NJWkVfTUFTSyAgICAgICAgMHg3ZmZjCiAjZGVmaW5lICAgICAgTVZORVRBX0dNQUMwX1BPUlRfRU5BQkxFICAgICAgICAgICAgQklUKDApCiAjZGVmaW5lIE1WTkVUQV9HTUFDX0NUUkxfMiAgICAgICAgICAgICAgICAgICAgICAgMHgyYzA4Ci0jZGVmaW5lICAgICAgTVZORVRBX0dNQUMyX1BTQ19FTkFCTEUgICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lICAgICAgTVZORVRBX0dNQUMyX1BDU19FTkFCTEUgICAgICAgICAgICAgQklUKDMpCiAjZGVmaW5lICAgICAgTVZORVRBX0dNQUMyX1BPUlRfUkdNSUkgICAgICAgICAgICAgQklUKDQpCiAjZGVmaW5lICAgICAgTVZORVRBX0dNQUMyX1BPUlRfUkVTRVQgICAgICAgICAgICAgQklUKDYpCiAjZGVmaW5lIE1WTkVUQV9HTUFDX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMHgyYzEwCkBAIC03MTAsMzUgKzcxMiw2IEBACiAJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9SWFFfQ09ORklHX1JFRyhyeHEtPmlkKSwgdmFsKTsKIH0KIAotCi0KLS8qIFNldHMgdGhlIFJHTUlJIEVuYWJsZSBiaXQgKFJHTUlJRW4pIGluIHBvcnQgTUFDIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLXN0YXRpYyB2b2lkIG12bmV0YV9nbWFjX3JnbWlpX3NldChzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwLCBpbnQgZW5hYmxlKQotewotCXUzMiAgdmFsOwotCi0JdmFsID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0dNQUNfQ1RSTF8yKTsKLQotCWlmIChlbmFibGUpCi0JCXZhbCB8PSBNVk5FVEFfR01BQzJfUE9SVF9SR01JSTsKLQllbHNlCi0JCXZhbCAmPSB+TVZORVRBX0dNQUMyX1BPUlRfUkdNSUk7Ci0KLQltdnJlZ193cml0ZShwcCwgTVZORVRBX0dNQUNfQ1RSTF8yLCB2YWwpOwotfQotCi0vKiBDb25maWcgU0dNSUkgcG9ydCAqLwotc3RhdGljIHZvaWQgbXZuZXRhX3BvcnRfc2dtaWlfY29uZmlnKHN0cnVjdCBtdm5ldGFfcG9ydCAqcHApCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IG12cmVnX3JlYWQocHAsIE1WTkVUQV9HTUFDX0NUUkxfMik7Ci0JdmFsIHw9IE1WTkVUQV9HTUFDMl9QU0NfRU5BQkxFOwotCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19DVFJMXzIsIHZhbCk7Ci0KLQltdnJlZ193cml0ZShwcCwgTVZORVRBX1NHTUlJX1NFUkRFU19DRkcsIE1WTkVUQV9TR01JSV9TRVJERVNfUFJPVE8pOwotfQotCiAvKiBTdGFydCB0aGUgRXRoZXJuZXQgcG9ydCBSWCBhbmQgVFggYWN0aXZpdHkgKi8KIHN0YXRpYyB2b2lkIG12bmV0YV9wb3J0X3VwKHN0cnVjdCBtdm5ldGFfcG9ydCAqcHApCiB7CkBAIC0yNzU2LDEyICsyNzI5LDE1IEBACiAJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9VTklUX0lOVFJfQ0FVU0UsIDApOwogCiAJaWYgKHBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSkKLQkJbXZuZXRhX3BvcnRfc2dtaWlfY29uZmlnKHBwKTsKKwkJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9TRVJERVNfQ0ZHLCBNVk5FVEFfU0dNSUlfU0VSREVTX1BST1RPKTsKKwllbHNlCisJCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfU0VSREVTX0NGRywgTVZORVRBX1JHTUlJX1NFUkRFU19QUk9UTyk7CiAKLQltdm5ldGFfZ21hY19yZ21paV9zZXQocHAsIDEpOworCXZhbCA9IG12cmVnX3JlYWQocHAsIE1WTkVUQV9HTUFDX0NUUkxfMik7CisKKwl2YWwgfD0gTVZORVRBX0dNQUMyX1BDU19FTkFCTEUgfCBNVk5FVEFfR01BQzJfUE9SVF9SR01JSTsKIAogCS8qIENhbmNlbCBQb3J0IFJlc2V0ICovCi0JdmFsID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0dNQUNfQ1RSTF8yKTsKIAl2YWwgJj0gfk1WTkVUQV9HTUFDMl9QT1JUX1JFU0VUOwogCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19DVFJMXzIsIHZhbCk7CiAKQEAgLTI3NzQsNiArMjc1MCw3IEBACiBzdGF0aWMgaW50IG12bmV0YV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWNvbnN0IHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8gKmRyYW1fdGFyZ2V0X2luZm87CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGU7CiAJdTMyIHBoeV9hZGRyOwpAQCAtMjgzOCw5ICsyODE1LDE1IEBACiAKIAljbGtfcHJlcGFyZV9lbmFibGUocHAtPmNsayk7CiAKLQlwcC0+YmFzZSA9IG9mX2lvbWFwKGRuLCAwKTsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2NsazsKKwl9CisKKwlwcC0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChwcC0+YmFzZSA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FTk9NRU07CisJCWVyciA9IFBUUl9FUlIocHAtPmJhc2UpOwogCQlnb3RvIGVycl9jbGs7CiAJfQogCkBAIC0yODQ4LDcgKzI4MzEsNyBAQAogCXBwLT5zdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbXZuZXRhX3BjcHVfc3RhdHMpOwogCWlmICghcHAtPnN0YXRzKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3VubWFwOworCQlnb3RvIGVycl9jbGs7CiAJfQogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewpAQCAtMjkxMyw4ICsyODk2LDYgQEAKIAltdm5ldGFfZGVpbml0KHBwKTsKIGVycl9mcmVlX3N0YXRzOgogCWZyZWVfcGVyY3B1KHBwLT5zdGF0cyk7Ci1lcnJfdW5tYXA6Ci0JaW91bm1hcChwcC0+YmFzZSk7CiBlcnJfY2xrOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcC0+Y2xrKTsKIGVycl9mcmVlX2lycToKQEAgLTI5MzQsNyArMjkxNSw2IEBACiAJbXZuZXRhX2RlaW5pdChwcCk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBwLT5jbGspOwogCWZyZWVfcGVyY3B1KHBwLT5zdGF0cyk7Ci0JaW91bm1hcChwcC0+YmFzZSk7CiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhkZXYtPmlycSk7CiAJZnJlZV9uZXRkZXYoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwppbmRleCA5MzZjMTUzLi5kNDEzZTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwpAQCAtMjY4MSw3ICsyNjgxLDExIEBACiAKIHN0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IG1seDRfcGNpX3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JaW50IHJldCA9IF9fbWx4NF9pbml0X29uZShwZGV2LCAwKTsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CisJaW50IHJldDsKKworCWlkID0gcGNpX21hdGNoX2lkKG1seDRfcGNpX3RhYmxlLCBwZGV2KTsKKwlyZXQgPSBfX21seDRfaW5pdF9vbmUocGRldiwgaWQtPmRyaXZlcl9kYXRhKTsKIAogCXJldHVybiByZXQgPyBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUIDogUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5jCmluZGV4IDcyN2I1NDZhLi5lMGM5MmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9lZXByb21fOTNjeDYuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KIApAQCAtODMsNiArODQsNyBAQAogICogQHJjX3J4cWNyOiBDYWNoZWQgY29weSBvZiBLU19SWFFDUi4KICAqIEBlZXByb21fc2l6ZTogQ29tcGFuaW9uIGVlcHJvbSBzaXplIGluIEJ5dGVzLCAwIGlmIG5vIGVlcHJvbQogICogQGVlcHJvbTogOTNDWDYgRUVQUk9NIHN0YXRlIGZvciBhY2Nlc3Npbmcgb24tYm9hcmQgRUVQUk9NLgorICogQHZkZF9yZWc6CU9wdGlvbmFsIHJlZ3VsYXRvciBzdXBwbHlpbmcgdGhlIGNoaXAKICAqCiAgKiBUaGUgQGxvY2sgZW5zdXJlcyB0aGF0IHRoZSBjaGlwIGlzIHByb3RlY3RlZCB3aGVuIGNlcnRhaW4gb3BlcmF0aW9ucyBhcmUKICAqIGluIHByb2dyZXNzLiBXaGVuIHRoZSByZWFkIG9yIHdyaXRlIHBhY2tldCB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcywgbW9zdApAQCAtMTMwLDYgKzEzMiw3IEBACiAJc3RydWN0IHNwaV90cmFuc2ZlcglzcGlfeGZlcjJbMl07CiAKIAlzdHJ1Y3QgZWVwcm9tXzkzY3g2CWVlcHJvbTsKKwlzdHJ1Y3QgcmVndWxhdG9yCSp2ZGRfcmVnOwogfTsKIAogc3RhdGljIGludCBtc2dfZW5hYmxlOwpAQCAtMTQxNCw2ICsxNDE3LDIxIEBACiAJa3MtPnNwaWRldiA9IHNwaTsKIAlrcy0+dHhfc3BhY2UgPSA2MTQ0OwogCisJa3MtPnZkZF9yZWcgPSByZWd1bGF0b3JfZ2V0X29wdGlvbmFsKCZzcGktPmRldiwgInZkZCIpOworCWlmIChJU19FUlIoa3MtPnZkZF9yZWcpKSB7CisJCXJldCA9IFBUUl9FUlIoa3MtPnZkZF9yZWcpOworCQlpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpCisJCQlnb3RvIGVycl9yZWc7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShrcy0+dmRkX3JlZyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAicmVndWxhdG9yIGVuYWJsZSBmYWlsOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJZ290byBlcnJfcmVnX2VuOworCQl9CisJfQorCisKIAltdXRleF9pbml0KCZrcy0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmtzLT5zdGF0ZWxvY2spOwogCkBAIC0xNTA4LDggKzE1MjYsMTQgQEAKIGVycl9uZXRkZXY6CiAJZnJlZV9pcnEobmRldi0+aXJxLCBrcyk7CiAKLWVycl9pZDoKIGVycl9pcnE6CitlcnJfaWQ6CisJaWYgKCFJU19FUlIoa3MtPnZkZF9yZWcpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShrcy0+dmRkX3JlZyk7CitlcnJfcmVnX2VuOgorCWlmICghSVNfRVJSKGtzLT52ZGRfcmVnKSkKKwkJcmVndWxhdG9yX3B1dChrcy0+dmRkX3JlZyk7CitlcnJfcmVnOgogCWZyZWVfbmV0ZGV2KG5kZXYpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNTIzLDYgKzE1NDcsMTAgQEAKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldGRldik7CiAJZnJlZV9pcnEoc3BpLT5pcnEsIHByaXYpOworCWlmICghSVNfRVJSKHByaXYtPnZkZF9yZWcpKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXYtPnZkZF9yZWcpOworCQlyZWd1bGF0b3JfcHV0KHByaXYtPnZkZF9yZWcpOworCX0KIAlmcmVlX25ldGRldihwcml2LT5uZXRkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCmluZGV4IGNlMmNmZGQuLjY1NmM2NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCkBAIC00NzY1LDcgKzQ3NjUsOSBAQAogCW5kZXYtPmZlYXR1cmVzID0gbmRldi0+aHdfZmVhdHVyZXM7CiAJbmRldi0+dmxhbl9mZWF0dXJlcyA9IG5kZXYtPmh3X2ZlYXR1cmVzOwogCS8qIHZsYW4gZ2V0cyBzYW1lIGZlYXR1cmVzIChleGNlcHQgdmxhbiBmaWx0ZXIpICovCi0JbmRldi0+dmxhbl9mZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSOworCW5kZXYtPnZsYW5fZmVhdHVyZXMgJj0gfihORVRJRl9GX0hXX1ZMQU5fQ1RBR19GSUxURVIgfAorCQkJCSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8CisJCQkJIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKTsKIAogCWlmICh0ZXN0X2JpdChRTF9ETUE2NCwgJnFkZXYtPmZsYWdzKSkKIAkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCmluZGV4IGZmZDRkMTIuLjdkNmQ4ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMKQEAgLTIyMjksMTAgKzIyMjksNiBAQAogCQlnb3RvIGNsZWFuX2FsZV9yZXQ7CiAJfQogCi0JaWYgKGNwdHNfcmVnaXN0ZXIoJnBkZXYtPmRldiwgcHJpdi0+Y3B0cywKLQkJCSAgZGF0YS0+Y3B0c19jbG9ja19tdWx0LCBkYXRhLT5jcHRzX2Nsb2NrX3NoaWZ0KSkKLQkJZGV2X2Vycihwcml2LT5kZXYsICJlcnJvciByZWdpc3RlcmluZyBjcHRzIGRldmljZVxuIik7Ci0KIAljcHN3X25vdGljZShwcml2LCBwcm9iZSwgImluaXRpYWxpemVkIGRldmljZSAocmVncyAlcGEsIGlycSAlZClcbiIsCiAJCSAgICAmc3NfcmVzLT5zdGFydCwgbmRldi0+aXJxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jCmluZGV4IDM2NGQwYzcuLjg4ZWYyNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMKQEAgLTM1NSw3ICszNTUsNyBAQAogCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmN0bHItPmxvY2ssIGZsYWdzKTsKLQlpZiAoY3Rsci0+c3RhdGUgIT0gQ1BETUFfU1RBVEVfQUNUSVZFKSB7CisJaWYgKGN0bHItPnN0YXRlID09IENQRE1BX1NUQVRFX1RFQVJET1dOKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0bHItPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODkxLDcgKzg5MSw3IEBACiAJdW5zaWduZWQJCXRpbWVvdXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotCWlmIChjaGFuLT5zdGF0ZSAhPSBDUERNQV9TVEFURV9BQ1RJVkUpIHsKKwlpZiAoY2hhbi0+c3RhdGUgPT0gQ1BETUFfU1RBVEVfVEVBUkRPV04pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfZW1hYy5jCmluZGV4IGNkOWIxNjQuLjhmMGU2OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfZW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfZW1hYy5jCkBAIC0xNTMyLDkgKzE1MzIsOSBAQAogCXN0cnVjdCBkZXZpY2UgKmVtYWNfZGV2ID0gJm5kZXYtPmRldjsKIAl1MzIgY250OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCByZXQ7CisJaW50IHEsIG0sIHJldDsKKwlpbnQgcmVzX251bSA9IDAsIGlycV9udW0gPSAwOwogCWludCBpID0gMDsKLQlpbnQgayA9IDA7CiAJc3RydWN0IGVtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCiAJcG1fcnVudGltZV9nZXQoJnByaXYtPnBkZXYtPmRldik7CkBAIC0xNTY0LDE1ICsxNTY0LDI0IEBACiAJfQogCiAJLyogUmVxdWVzdCBJUlEgKi8KKwl3aGlsZSAoKHJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwcml2LT5wZGV2LCBJT1JFU09VUkNFX0lSUSwKKwkJCQkJICAgIHJlc19udW0pKSkgeworCQlmb3IgKGlycV9udW0gPSByZXMtPnN0YXJ0OyBpcnFfbnVtIDw9IHJlcy0+ZW5kOyBpcnFfbnVtKyspIHsKKwkJCWRldl9lcnIoZW1hY19kZXYsICJSZXF1ZXN0IElSUSAlZFxuIiwgaXJxX251bSk7CisJCQlpZiAocmVxdWVzdF9pcnEoaXJxX251bSwgZW1hY19pcnEsIDAsIG5kZXYtPm5hbWUsCisJCQkJCW5kZXYpKSB7CisJCQkJZGV2X2VycihlbWFjX2RldiwKKwkJCQkJIkRhVmluY2kgRU1BQzogcmVxdWVzdF9pcnEoKSBmYWlsZWRcbiIpOworCQkJCXJldCA9IC1FQlVTWTsKIAotCXdoaWxlICgocmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHByaXYtPnBkZXYsIElPUkVTT1VSQ0VfSVJRLCBrKSkpIHsKLQkJZm9yIChpID0gcmVzLT5zdGFydDsgaSA8PSByZXMtPmVuZDsgaSsrKSB7Ci0JCQlpZiAoZGV2bV9yZXF1ZXN0X2lycSgmcHJpdi0+cGRldi0+ZGV2LCBpLCBlbWFjX2lycSwKLQkJCQkJICAgICAwLCBuZGV2LT5uYW1lLCBuZGV2KSkKIAkJCQlnb3RvIHJvbGxiYWNrOworCQkJfQogCQl9Ci0JCWsrKzsKKwkJcmVzX251bSsrOwogCX0KKwkvKiBwcmVwYXJlIGNvdW50ZXJzIGZvciByb2xsYmFjayBpbiBjYXNlIG9mIGFuIGVycm9yICovCisJcmVzX251bS0tOworCWlycV9udW0tLTsKIAogCS8qIFN0YXJ0L0VuYWJsZSBFTUFDIGhhcmR3YXJlICovCiAJZW1hY19od19lbmFibGUocHJpdik7CkBAIC0xNjM5LDExICsxNjQ4LDIzIEBACiAKIAlyZXR1cm4gMDsKIAotcm9sbGJhY2s6Ci0KLQlkZXZfZXJyKGVtYWNfZGV2LCAiRGFWaW5jaSBFTUFDOiBkZXZtX3JlcXVlc3RfaXJxKCkgZmFpbGVkIik7Ci0JcmV0ID0gLUVCVVNZOwogZXJyOgorCWVtYWNfaW50X2Rpc2FibGUocHJpdik7CisJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKKworcm9sbGJhY2s6CisJZm9yIChxID0gcmVzX251bTsgcSA+PSAwOyBxLS0pIHsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHByaXYtPnBkZXYsIElPUkVTT1VSQ0VfSVJRLCBxKTsKKwkJLyogYXQgdGhlIGZpcnN0IGl0ZXJhdGlvbiwgaXJxX251bSBpcyBhbHJlYWR5IHNldCB0byB0aGUKKwkJICogcmlnaHQgdmFsdWUKKwkJICovCisJCWlmIChxICE9IHJlc19udW0pCisJCQlpcnFfbnVtID0gcmVzLT5lbmQ7CisKKwkJZm9yIChtID0gaXJxX251bTsgbSA+PSByZXMtPnN0YXJ0OyBtLS0pCisJCQlmcmVlX2lycShtLCBuZGV2KTsKKwl9CisJY3BkbWFfY3Rscl9zdG9wKHByaXYtPmRtYSk7CiAJcG1fcnVudGltZV9wdXQoJnByaXYtPnBkZXYtPmRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2NTksNiArMTY4MCw5IEBACiAgKi8KIHN0YXRpYyBpbnQgZW1hY19kZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSA9IDA7CisJaW50IGlycV9udW07CiAJc3RydWN0IGVtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBkZXZpY2UgKmVtYWNfZGV2ID0gJm5kZXYtPmRldjsKIApAQCAtMTY3NCw2ICsxNjk4LDEzIEBACiAJaWYgKHByaXYtPnBoeWRldikKIAkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKIAorCS8qIEZyZWUgSVJRICovCisJd2hpbGUgKChyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocHJpdi0+cGRldiwgSU9SRVNPVVJDRV9JUlEsIGkpKSkgeworCQlmb3IgKGlycV9udW0gPSByZXMtPnN0YXJ0OyBpcnFfbnVtIDw9IHJlcy0+ZW5kOyBpcnFfbnVtKyspCisJCQlmcmVlX2lycShpcnFfbnVtLCBwcml2LT5uZGV2KTsKKwkJaSsrOworCX0KKwogCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQogCQlkZXZfbm90aWNlKGVtYWNfZGV2LCAiRGFWaW5jaSBFTUFDOiAlcyBzdG9wcGVkXG4iLCBuZGV2LT5uYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jCmluZGV4IGVmMzEyYmMuLjZhYzIwYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtcmhpbmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXJoaW5lLmMKQEAgLTkyMyw3ICs5MjMsNyBAQAogCWlmIChyYykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQhP1xuIik7Ci0JCWdvdG8gZXJyX291dDsKKwkJZ290byBlcnJfb3V0X3BjaV9kaXNhYmxlOwogCX0KIAogCS8qIHNhbml0eSBjaGVjayAqLwpAQCAtOTMxLDcgKzkzMSw3IEBACiAJICAgIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgaW9fc2l6ZSkpIHsKIAkJcmMgPSAtRUlPOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnN1ZmZpY2llbnQgUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOwotCQlnb3RvIGVycl9vdXQ7CisJCWdvdG8gZXJyX291dF9wY2lfZGlzYWJsZTsKIAl9CiAKIAlwaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwpAQCAtOTQyLDcgKzk0Miw3IEBACiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByaGluZV9wcml2YXRlKSk7CiAJaWYgKCFkZXYpIHsKIAkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXQ7CisJCWdvdG8gZXJyX291dF9wY2lfZGlzYWJsZTsKIAl9CiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIApAQCAtMTA4NCw2ICsxMDg0LDggQEAKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogZXJyX291dF9mcmVlX25ldGRldjoKIAlmcmVlX25ldGRldihkZXYpOworZXJyX291dF9wY2lfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBlcnJfb3V0OgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lmYi5jIGIvZHJpdmVycy9uZXQvaWZiLmMKaW5kZXggYzE0ZDM5Yi4uZDdiMmU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWZiLmMKKysrIGIvZHJpdmVycy9uZXQvaWZiLmMKQEAgLTE4MCw3ICsxODAsOCBAQAogCWRldi0+dHhfcXVldWVfbGVuID0gVFhfUV9MSU1JVDsKIAogCWRldi0+ZmVhdHVyZXMgfD0gSUZCX0ZFQVRVUkVTOwotCWRldi0+dmxhbl9mZWF0dXJlcyB8PSBJRkJfRkVBVFVSRVM7CisJZGV2LT52bGFuX2ZlYXR1cmVzIHw9IElGQl9GRUFUVVJFUyAmIH4oTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAorCQkJCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX1NUQUdfVFgpOwogCiAJZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CiAJZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCmluZGV4IDRiOTcwZjcuLjJmNjk4OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwpAQCAtNjgzLDEwICs2ODMsOSBAQAogaW50IHBoeV9zdXNwZW5kKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJc3RydWN0IHBoeV9kcml2ZXIgKnBoeWRydiA9IHRvX3BoeV9kcml2ZXIocGh5ZGV2LT5kZXYuZHJpdmVyKTsKLQlzdHJ1Y3QgZXRodG9vbF93b2xpbmZvIHdvbDsKKwlzdHJ1Y3QgZXRodG9vbF93b2xpbmZvIHdvbCA9IHsgLmNtZCA9IEVUSFRPT0xfR1dPTCB9OwogCiAJLyogSWYgdGhlIGRldmljZSBoYXMgV09MIGVuYWJsZWQsIHdlIGNhbm5vdCBzdXNwZW5kIHRoZSBQSFkgKi8KLQl3b2wuY21kID0gRVRIVE9PTF9HV09MOwogCXBoeV9ldGh0b29sX2dldF93b2wocGh5ZGV2LCAmd29sKTsKIAlpZiAod29sLndvbG9wdHMpCiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jIGIvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYwppbmRleCBkYmZmMjkwLi5kMzUwZDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKQEAgLTY4LDcgKzY4LDYgQEAKIHN0YXRpYyBpbnQgY2RjX25jbV9zZXR1cChzdHJ1Y3QgdXNibmV0ICpkZXYpCiB7CiAJc3RydWN0IGNkY19uY21fY3R4ICpjdHggPSAoc3RydWN0IGNkY19uY21fY3R4ICopZGV2LT5kYXRhWzBdOwotCXN0cnVjdCB1c2JfY2RjX25jbV9udGJfcGFyYW1ldGVycyBuY21fcGFybTsKIAl1MzIgdmFsOwogCXU4IGZsYWdzOwogCXU4IGlmYWNlX25vOwpAQCAtODIsMjIgKzgxLDIyIEBACiAJZXJyID0gdXNibmV0X3JlYWRfY21kKGRldiwgVVNCX0NEQ19HRVRfTlRCX1BBUkFNRVRFUlMsCiAJCQkgICAgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfSU4KIAkJCSAgICAgIHxVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkJICAgICAgMCwgaWZhY2Vfbm8sICZuY21fcGFybSwKLQkJCSAgICAgIHNpemVvZihuY21fcGFybSkpOworCQkJICAgICAgMCwgaWZhY2Vfbm8sICZjdHgtPm5jbV9wYXJtLAorCQkJICAgICAgc2l6ZW9mKGN0eC0+bmNtX3Bhcm0pKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZkZXYtPmludGYtPmRldiwgImZhaWxlZCBHRVRfTlRCX1BBUkFNRVRFUlNcbiIpOwogCQlyZXR1cm4gZXJyOyAvKiBHRVRfTlRCX1BBUkFNRVRFUlMgaXMgcmVxdWlyZWQgKi8KIAl9CiAKIAkvKiByZWFkIGNvcnJlY3Qgc2V0IG9mIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGRldmljZSBtb2RlICovCi0JY3R4LT5yeF9tYXggPSBsZTMyX3RvX2NwdShuY21fcGFybS5kd050YkluTWF4U2l6ZSk7Ci0JY3R4LT50eF9tYXggPSBsZTMyX3RvX2NwdShuY21fcGFybS5kd050Yk91dE1heFNpemUpOwotCWN0eC0+dHhfcmVtYWluZGVyID0gbGUxNl90b19jcHUobmNtX3Bhcm0ud05kcE91dFBheWxvYWRSZW1haW5kZXIpOwotCWN0eC0+dHhfbW9kdWx1cyA9IGxlMTZfdG9fY3B1KG5jbV9wYXJtLndOZHBPdXREaXZpc29yKTsKLQljdHgtPnR4X25kcF9tb2R1bHVzID0gbGUxNl90b19jcHUobmNtX3Bhcm0ud05kcE91dEFsaWdubWVudCk7CisJY3R4LT5yeF9tYXggPSBsZTMyX3RvX2NwdShjdHgtPm5jbV9wYXJtLmR3TnRiSW5NYXhTaXplKTsKKwljdHgtPnR4X21heCA9IGxlMzJfdG9fY3B1KGN0eC0+bmNtX3Bhcm0uZHdOdGJPdXRNYXhTaXplKTsKKwljdHgtPnR4X3JlbWFpbmRlciA9IGxlMTZfdG9fY3B1KGN0eC0+bmNtX3Bhcm0ud05kcE91dFBheWxvYWRSZW1haW5kZXIpOworCWN0eC0+dHhfbW9kdWx1cyA9IGxlMTZfdG9fY3B1KGN0eC0+bmNtX3Bhcm0ud05kcE91dERpdmlzb3IpOworCWN0eC0+dHhfbmRwX21vZHVsdXMgPSBsZTE2X3RvX2NwdShjdHgtPm5jbV9wYXJtLndOZHBPdXRBbGlnbm1lbnQpOwogCS8qIGRldmljZXMgcHJpb3IgdG8gTkNNIEVycmF0YSBzaGFsbCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvICovCi0JY3R4LT50eF9tYXhfZGF0YWdyYW1zID0gbGUxNl90b19jcHUobmNtX3Bhcm0ud050Yk91dE1heERhdGFncmFtcyk7Ci0JbnRiX2ZtdF9zdXBwb3J0ZWQgPSBsZTE2X3RvX2NwdShuY21fcGFybS5ibU50YkZvcm1hdHNTdXBwb3J0ZWQpOworCWN0eC0+dHhfbWF4X2RhdGFncmFtcyA9IGxlMTZfdG9fY3B1KGN0eC0+bmNtX3Bhcm0ud050Yk91dE1heERhdGFncmFtcyk7CisJbnRiX2ZtdF9zdXBwb3J0ZWQgPSBsZTE2X3RvX2NwdShjdHgtPm5jbV9wYXJtLmJtTnRiRm9ybWF0c1N1cHBvcnRlZCk7CiAKIAkvKiB0aGVyZSBhcmUgc29tZSBtaW5vciBkaWZmZXJlbmNlcyBpbiBOQ00gYW5kIE1CSU0gZGVmYXVsdHMgKi8KIAlpZiAoY2RjX25jbV9jb21tX2ludGZfaXNfbWJpbShjdHgtPmNvbnRyb2wtPmN1cl9hbHRzZXR0aW5nKSkgewpAQCAtMTQ2LDcgKzE0NSw3IEBACiAJfQogCiAJLyogaW5mb3JtIGRldmljZSBhYm91dCBOVEIgaW5wdXQgc2l6ZSBjaGFuZ2VzICovCi0JaWYgKGN0eC0+cnhfbWF4ICE9IGxlMzJfdG9fY3B1KG5jbV9wYXJtLmR3TnRiSW5NYXhTaXplKSkgeworCWlmIChjdHgtPnJ4X21heCAhPSBsZTMyX3RvX2NwdShjdHgtPm5jbV9wYXJtLmR3TnRiSW5NYXhTaXplKSkgewogCQlfX2xlMzIgZHdOdGJJbk1heFNpemUgPSBjcHVfdG9fbGUzMihjdHgtPnJ4X21heCk7CiAKIAkJZXJyID0gdXNibmV0X3dyaXRlX2NtZChkZXYsIFVTQl9DRENfU0VUX05UQl9JTlBVVF9TSVpFLApAQCAtMTYyLDE0ICsxNjEsNiBAQAogCQlkZXZfZGJnKCZkZXYtPmludGYtPmRldiwgIlVzaW5nIGRlZmF1bHQgbWF4aW11bSB0cmFuc21pdCBsZW5ndGg9JWRcbiIsCiAJCQlDRENfTkNNX05UQl9NQVhfU0laRV9UWCk7CiAJCWN0eC0+dHhfbWF4ID0gQ0RDX05DTV9OVEJfTUFYX1NJWkVfVFg7Ci0KLQkJLyogQWRkaW5nIGEgcGFkIGJ5dGUgaGVyZSBzaW1wbGlmaWVzIHRoZSBoYW5kbGluZyBpbgotCQkgKiBjZGNfbmNtX2ZpbGxfdHhfZnJhbWUsIGJ5IG1ha2luZyB0eF9tYXggYWx3YXlzCi0JCSAqIHJlcHJlc2VudCB0aGUgcmVhbCBza2IgbWF4IHNpemUuCi0JCSAqLwotCQlpZiAoY3R4LT50eF9tYXggJSB1c2JfbWF4cGFja2V0KGRldi0+dWRldiwgZGV2LT5vdXQsIDEpID09IDApCi0JCQljdHgtPnR4X21heCsrOwotCiAJfQogCiAJLyoKQEAgLTQzOSw2ICs0MzAsMTAgQEAKIAkJZ290byBlcnJvcjI7CiAJfQogCisJLyogaW5pdGlhbGl6ZSBkYXRhIGludGVyZmFjZSAqLworCWlmIChjZGNfbmNtX3NldHVwKGRldikpCisJCWdvdG8gZXJyb3IyOworCiAJLyogY29uZmlndXJlIGRhdGEgaW50ZXJmYWNlICovCiAJdGVtcCA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgaWZhY2Vfbm8sIGRhdGFfYWx0c2V0dGluZyk7CiAJaWYgKHRlbXApIHsKQEAgLTQ1MywxMiArNDQ4LDYgQEAKIAkJZ290byBlcnJvcjI7CiAJfQogCi0JLyogaW5pdGlhbGl6ZSBkYXRhIGludGVyZmFjZSAqLwotCWlmIChjZGNfbmNtX3NldHVwKGRldikpCXsKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiY2RjX25jbV9zZXR1cCgpIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3IyOwotCX0KLQogCXVzYl9zZXRfaW50ZmRhdGEoY3R4LT5kYXRhLCBkZXYpOwogCXVzYl9zZXRfaW50ZmRhdGEoY3R4LT5jb250cm9sLCBkZXYpOwogCkBAIC00NzUsNiArNDY0LDE1IEBACiAJZGV2LT5oYXJkX210dSA9IGN0eC0+dHhfbWF4OwogCWRldi0+cnhfdXJiX3NpemUgPSBjdHgtPnJ4X21heDsKIAorCS8qIGNkY19uY21fc2V0dXAgd2lsbCBvdmVycmlkZSBkd050Yk91dE1heFNpemUgaWYgaXQgaXMKKwkgKiBvdXRzaWRlIHRoZSBzYW5lIHJhbmdlLiBBZGRpbmcgYSBwYWQgYnl0ZSBoZXJlIGlmIG5lY2Vzc2FyeQorCSAqIHNpbXBsaWZpZXMgdGhlIGhhbmRsaW5nIGluIGNkY19uY21fZmlsbF90eF9mcmFtZSwgbWFraW5nCisJICogdHhfbWF4IGFsd2F5cyByZXByZXNlbnQgdGhlIHJlYWwgc2tiIG1heCBzaXplLgorCSAqLworCWlmIChjdHgtPnR4X21heCAhPSBsZTMyX3RvX2NwdShjdHgtPm5jbV9wYXJtLmR3TnRiT3V0TWF4U2l6ZSkgJiYKKwkgICAgY3R4LT50eF9tYXggJSB1c2JfbWF4cGFja2V0KGRldi0+dWRldiwgZGV2LT5vdXQsIDEpID09IDApCisJCWN0eC0+dHhfbWF4Kys7CisKIAlyZXR1cm4gMDsKIAogZXJyb3IyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCmluZGV4IGRkMTBkNTguLmY5ZTk2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKQEAgLTc1MiwxNCArNzUyLDEyIEBACiAvLyBwcmVjb25kaXRpb246IG5ldmVyIGNhbGxlZCBpbl9pbnRlcnJ1cHQKIHN0YXRpYyB2b2lkIHVzYm5ldF90ZXJtaW5hdGVfdXJicyhzdHJ1Y3QgdXNibmV0ICpkZXYpCiB7Ci0JREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyh1bmxpbmtfd2FrZXVwKTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlpbnQgdGVtcDsKIAogCS8qIGVuc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgdXJicyAqLwotCWFkZF93YWl0X3F1ZXVlKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CisJYWRkX3dhaXRfcXVldWUoJmRldi0+d2FpdCwgJndhaXQpOwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlkZXYtPndhaXQgPSAmdW5saW5rX3dha2V1cDsKIAl0ZW1wID0gdW5saW5rX3VyYnMoZGV2LCAmZGV2LT50eHEpICsKIAkJdW5saW5rX3VyYnMoZGV2LCAmZGV2LT5yeHEpOwogCkBAIC03NzMsMTUgKzc3MSwxNCBAQAogCQkJCSAgIndhaXRlZCBmb3IgJWQgdXJiIGNvbXBsZXRpb25zXG4iLCB0ZW1wKTsKIAl9CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlkZXYtPndhaXQgPSBOVUxMOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+d2FpdCwgJndhaXQpOwogfQogCiBpbnQgdXNibmV0X3N0b3AgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJc3RydWN0IHVzYm5ldAkJKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAJc3RydWN0IGRyaXZlcl9pbmZvCSppbmZvID0gZGV2LT5kcml2ZXJfaW5mbzsKLQlpbnQJCQlyZXR2YWw7CisJaW50CQkJcmV0dmFsLCBwbTsKIAogCWNsZWFyX2JpdChFVkVOVF9ERVZfT1BFTiwgJmRldi0+ZmxhZ3MpOwogCW5ldGlmX3N0b3BfcXVldWUgKG5ldCk7CkBAIC03OTEsNiArNzg4LDggQEAKIAkJICAgbmV0LT5zdGF0cy5yeF9wYWNrZXRzLCBuZXQtPnN0YXRzLnR4X3BhY2tldHMsCiAJCSAgIG5ldC0+c3RhdHMucnhfZXJyb3JzLCBuZXQtPnN0YXRzLnR4X2Vycm9ycyk7CiAKKwkvKiB0byBub3QgcmFjZSByZXN1bWUgKi8KKwlwbSA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShkZXYtPmludGYpOwogCS8qIGFsbG93IG1pbmlkcml2ZXIgdG8gc3RvcCBjb3JyZWN0bHkgKHdpcmVsZXNzIGRldmljZXMgdG8gdHVybiBvZmYKIAkgKiByYWRpbyBldGMpICovCiAJaWYgKGluZm8tPnN0b3ApIHsKQEAgLTgxNyw2ICs4MTYsOSBAQAogCWRldi0+ZmxhZ3MgPSAwOwogCWRlbF90aW1lcl9zeW5jICgmZGV2LT5kZWxheSk7CiAJdGFza2xldF9raWxsICgmZGV2LT5iaCk7CisJaWYgKCFwbSkKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGRldi0+aW50Zik7CisKIAlpZiAoaW5mby0+bWFuYWdlX3Bvd2VyICYmCiAJICAgICF0ZXN0X2FuZF9jbGVhcl9iaXQoRVZFTlRfTk9fUlVOVElNRV9QTSwgJmRldi0+ZmxhZ3MpKQogCQlpbmZvLT5tYW5hZ2VfcG93ZXIoZGV2LCAwKTsKQEAgLTE0MzcsMTEgKzE0MzksMTIgQEAKIAkvKiByZXN0YXJ0IFJYIGFnYWluIGFmdGVyIGRpc2FibGluZyBkdWUgdG8gaGlnaCBlcnJvciByYXRlICovCiAJY2xlYXJfYml0KEVWRU5UX1JYX0tJTEwsICZkZXYtPmZsYWdzKTsKIAotCS8vIHdhaXRpbmcgZm9yIGFsbCBwZW5kaW5nIHVyYnMgdG8gY29tcGxldGU/Ci0JaWYgKGRldi0+d2FpdCkgewotCQlpZiAoKGRldi0+dHhxLnFsZW4gKyBkZXYtPnJ4cS5xbGVuICsgZGV2LT5kb25lLnFsZW4pID09IDApIHsKLQkJCXdha2VfdXAgKGRldi0+d2FpdCk7Ci0JCX0KKwkvKiB3YWl0aW5nIGZvciBhbGwgcGVuZGluZyB1cmJzIHRvIGNvbXBsZXRlPworCSAqIG9ubHkgdGhlbiBjYW4gd2UgZm9yZ28gc3VibWl0dGluZyBhbmV3CisJICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmRldi0+d2FpdCkpIHsKKwkJaWYgKGRldi0+dHhxLnFsZW4gKyBkZXYtPnJ4cS5xbGVuICsgZGV2LT5kb25lLnFsZW4gPT0gMCkKKwkJCXdha2VfdXBfYWxsKCZkZXYtPndhaXQpOwogCiAJLy8gb3IgYXJlIHdlIG1heWJlIHNob3J0IGEgZmV3IHVyYnM/CiAJfSBlbHNlIGlmIChuZXRpZl9ydW5uaW5nIChkZXYtPm5ldCkgJiYKQEAgLTE1ODAsNiArMTU4Myw3IEBACiAJZGV2LT5kcml2ZXJfbmFtZSA9IG5hbWU7CiAJZGV2LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQgKG1zZ19sZXZlbCwgTkVUSUZfTVNHX0RSVgogCQkJCXwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTkspOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d2FpdCk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCAoJmRldi0+cnhxKTsKIAlza2JfcXVldWVfaGVhZF9pbml0ICgmZGV2LT50eHEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQgKCZkZXYtPmRvbmUpOwpAQCAtMTc5MSw5ICsxNzk1LDEwIEBACiAJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT50eHEubG9jayk7CiAKIAkJaWYgKHRlc3RfYml0KEVWRU5UX0RFVl9PUEVOLCAmZGV2LT5mbGFncykpIHsKLQkJCS8qIGhhbmRsZSByZW1vdGUgd2FrZXVwIEFTQVAgKi8KLQkJCWlmICghZGV2LT53YWl0ICYmCi0JCQkJbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2LT5uZXQpICYmCisJCQkvKiBoYW5kbGUgcmVtb3RlIHdha2V1cCBBU0FQCisJCQkgKiB3ZSBjYW5ub3QgcmFjZSBhZ2FpbnN0IHN0b3AKKwkJCSAqLworCQkJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldi0+bmV0KSAmJgogCQkJCSF0aW1lcl9wZW5kaW5nKCZkZXYtPmRlbGF5KSAmJgogCQkJCSF0ZXN0X2JpdChFVkVOVF9SWF9IQUxULCAmZGV2LT5mbGFncykpCiAJCQkJCXJ4X2FsbG9jX3N1Ym1pdChkZXYsIEdGUF9OT0lPKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZldGguYyBiL2RyaXZlcnMvbmV0L3ZldGguYwppbmRleCA1YjM3NDM3Li5jMGU3YzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdmV0aC5jCkBAIC0yODYsNyArMjg2LDEwIEBACiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CiAJZGV2LT5mZWF0dXJlcyB8PSBWRVRIX0ZFQVRVUkVTOwogCWRldi0+dmxhbl9mZWF0dXJlcyA9IGRldi0+ZmVhdHVyZXMgJgotCQkJICAgICB+KE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX1NUQUdfVFgpOworCQkJICAgICB+KE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKKwkJCSAgICAgICBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWCB8CisJCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfAorCQkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1JYKTsKIAlkZXYtPmRlc3RydWN0b3IgPSB2ZXRoX2Rldl9mcmVlOwogCiAJZGV2LT5od19mZWF0dXJlcyA9IFZFVEhfRkVBVFVSRVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMgYi9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKaW5kZXggNTYzMmE5OS4uODQxYjYwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwpAQCAtNjcxLDggKzY3MSw3IEBACiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9IHdoaWxlIChycS0+dnEtPm51bV9mcmVlKTsKLQlpZiAodW5saWtlbHkoIXZpcnRxdWV1ZV9raWNrKHJxLT52cSkpKQotCQlyZXR1cm4gZmFsc2U7CisJdmlydHF1ZXVlX2tpY2socnEtPnZxKTsKIAlyZXR1cm4gIW9vbTsKIH0KIApAQCAtODc3LDcgKzg3Niw3IEBACiAJZXJyID0geG1pdF9za2Ioc3EsIHNrYik7CiAKIAkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuISAqLwotCWlmICh1bmxpa2VseShlcnIpIHx8IHVubGlrZWx5KCF2aXJ0cXVldWVfa2ljayhzcS0+dnEpKSkgeworCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCWRldl93YXJuKCZkZXYtPmRldiwKQEAgLTg4Niw2ICs4ODUsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CisJdmlydHF1ZXVlX2tpY2soc3EtPnZxKTsKIAogCS8qIERvbid0IHdhaXQgdXAgZm9yIHRyYW5zbWl0dGVkIHNrYnMgdG8gYmUgZnJlZWQuICovCiAJc2tiX29ycGhhbihza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhsYW4uYyBiL2RyaXZlcnMvbmV0L3Z4bGFuLmMKaW5kZXggYjBmNzA1Yy4uMTIzNjgxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdnhsYW4uYworKysgYi9kcml2ZXJzL25ldC92eGxhbi5jCkBAIC0xMzE4LDYgKzEzMTgsOSBAQAogCiAJCW5laWdoX3JlbGVhc2Uobik7CiAKKwkJaWYgKHJlcGx5ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwogCQlza2JfcmVzZXRfbWFjX2hlYWRlcihyZXBseSk7CiAJCV9fc2tiX3B1bGwocmVwbHksIHNrYl9uZXR3b3JrX29mZnNldChyZXBseSkpOwogCQlyZXBseS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC0xMzM5LDE1ICsxMzQyLDEwMyBAQAogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKworc3RhdGljIHN0cnVjdCBza19idWZmICp2eGxhbl9uYV9jcmVhdGUoc3RydWN0IHNrX2J1ZmYgKnJlcXVlc3QsCisJc3RydWN0IG5laWdoYm91ciAqbiwgYm9vbCBpc3JvdXRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcmVxdWVzdC0+ZGV2OworCXN0cnVjdCBza19idWZmICpyZXBseTsKKwlzdHJ1Y3QgbmRfbXNnICpucywgKm5hOworCXN0cnVjdCBpcHY2aGRyICpwaXA2OworCXU4ICpkYWRkcjsKKwlpbnQgbmFfb2xlbiA9IDg7IC8qIG9wdCBoZHIgKyBFVEhfQUxFTiBmb3IgdGFyZ2V0ICovCisJaW50IG5zX29sZW47CisJaW50IGksIGxlbjsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArCisJCXNpemVvZigqbmEpICsgbmFfb2xlbiArIGRldi0+bmVlZGVkX3RhaWxyb29tOworCXJlcGx5ID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKHJlcGx5ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmVwbHktPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CisJcmVwbHktPmRldiA9IGRldjsKKwlza2JfcmVzZXJ2ZShyZXBseSwgTExfUkVTRVJWRURfU1BBQ0UocmVxdWVzdC0+ZGV2KSk7CisJc2tiX3B1c2gocmVwbHksIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJc2tiX3NldF9tYWNfaGVhZGVyKHJlcGx5LCAwKTsKKworCW5zID0gKHN0cnVjdCBuZF9tc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihyZXF1ZXN0KTsKKworCWRhZGRyID0gZXRoX2hkcihyZXF1ZXN0KS0+aF9zb3VyY2U7CisJbnNfb2xlbiA9IHJlcXVlc3QtPmxlbiAtIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHJlcXVlc3QpIC0gc2l6ZW9mKCpucyk7CisJZm9yIChpID0gMDsgaSA8IG5zX29sZW4tMTsgaSArPSAobnMtPm9wdFtpKzFdPDwzKSkgeworCQlpZiAobnMtPm9wdFtpXSA9PSBORF9PUFRfU09VUkNFX0xMX0FERFIpIHsKKwkJCWRhZGRyID0gbnMtPm9wdCArIGkgKyBzaXplb2Yoc3RydWN0IG5kX29wdF9oZHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBFdGhlcm5ldCBoZWFkZXIgKi8KKwlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihyZXBseSktPmhfZGVzdCwgZGFkZHIpOworCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHJlcGx5KS0+aF9zb3VyY2UsIG4tPmhhKTsKKwlldGhfaGRyKHJlcGx5KS0+aF9wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOworCXJlcGx5LT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOworCisJc2tiX3B1bGwocmVwbHksIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihyZXBseSwgMCk7CisJc2tiX3B1dChyZXBseSwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisKKwkvKiBJUHY2IGhlYWRlciAqLworCisJcGlwNiA9IGlwdjZfaGRyKHJlcGx5KTsKKwltZW1zZXQocGlwNiwgMCwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJcGlwNi0+dmVyc2lvbiA9IDY7CisJcGlwNi0+cHJpb3JpdHkgPSBpcHY2X2hkcihyZXF1ZXN0KS0+cHJpb3JpdHk7CisJcGlwNi0+bmV4dGhkciA9IElQUFJPVE9fSUNNUFY2OworCXBpcDYtPmhvcF9saW1pdCA9IDI1NTsKKwlwaXA2LT5kYWRkciA9IGlwdjZfaGRyKHJlcXVlc3QpLT5zYWRkcjsKKwlwaXA2LT5zYWRkciA9ICooc3RydWN0IGluNl9hZGRyICopbi0+cHJpbWFyeV9rZXk7CisKKwlza2JfcHVsbChyZXBseSwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHJlcGx5LCAwKTsKKworCW5hID0gKHN0cnVjdCBuZF9tc2cgKilza2JfcHV0KHJlcGx5LCBzaXplb2YoKm5hKSArIG5hX29sZW4pOworCisJLyogTmVpZ2hib3IgQWR2ZXJ0aXNlbWVudCAqLworCW1lbXNldChuYSwgMCwgc2l6ZW9mKCpuYSkrbmFfb2xlbik7CisJbmEtPmljbXBoLmljbXA2X3R5cGUgPSBORElTQ19ORUlHSEJPVVJfQURWRVJUSVNFTUVOVDsKKwluYS0+aWNtcGguaWNtcDZfcm91dGVyID0gaXNyb3V0ZXI7CisJbmEtPmljbXBoLmljbXA2X292ZXJyaWRlID0gMTsKKwluYS0+aWNtcGguaWNtcDZfc29saWNpdGVkID0gMTsKKwluYS0+dGFyZ2V0ID0gbnMtPnRhcmdldDsKKwlldGhlcl9hZGRyX2NvcHkoJm5hLT5vcHRbMl0sIG4tPmhhKTsKKwluYS0+b3B0WzBdID0gTkRfT1BUX1RBUkdFVF9MTF9BRERSOworCW5hLT5vcHRbMV0gPSBuYV9vbGVuID4+IDM7CisKKwluYS0+aWNtcGguaWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJnBpcDYtPnNhZGRyLAorCQkmcGlwNi0+ZGFkZHIsIHNpemVvZigqbmEpK25hX29sZW4sIElQUFJPVE9fSUNNUFY2LAorCQljc3VtX3BhcnRpYWwobmEsIHNpemVvZigqbmEpK25hX29sZW4sIDApKTsKKworCXBpcDYtPnBheWxvYWRfbGVuID0gaHRvbnMoc2l6ZW9mKCpuYSkrbmFfb2xlbik7CisKKwlza2JfcHVzaChyZXBseSwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisKKwlyZXBseS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisKKwlyZXR1cm4gcmVwbHk7Cit9CisKIHN0YXRpYyBpbnQgbmVpZ2hfcmVkdWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4gPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBuZWlnaGJvdXIgKm47Ci0JdW5pb24gdnhsYW5fYWRkciBpcGE7CisJc3RydWN0IG5kX21zZyAqbXNnOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcGhkcjsKIAljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCAqZGFkZHI7Ci0Jc3RydWN0IG5kX21zZyAqbXNnOwotCXN0cnVjdCBpbmV0Nl9kZXYgKmluNl9kZXYgPSBOVUxMOworCXN0cnVjdCBuZWlnaGJvdXIgKm47CisJc3RydWN0IGluZXQ2X2RldiAqaW42X2RldjsKIAogCWluNl9kZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CiAJaWYgKCFpbjZfZGV2KQpAQCAtMTM2MCwxOSArMTQ1MSwyMCBAQAogCXNhZGRyID0gJmlwaGRyLT5zYWRkcjsKIAlkYWRkciA9ICZpcGhkci0+ZGFkZHI7CiAKLQlpZiAoaXB2Nl9hZGRyX2xvb3BiYWNrKGRhZGRyKSB8fAotCSAgICBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGRhZGRyKSkKLQkJZ290byBvdXQ7Ci0KIAltc2cgPSAoc3RydWN0IG5kX21zZyAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJaWYgKG1zZy0+aWNtcGguaWNtcDZfY29kZSAhPSAwIHx8CiAJICAgIG1zZy0+aWNtcGguaWNtcDZfdHlwZSAhPSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OKQogCQlnb3RvIG91dDsKIAotCW4gPSBuZWlnaF9sb29rdXAoaXB2Nl9zdHViLT5uZF90YmwsIGRhZGRyLCBkZXYpOworCWlmIChpcHY2X2FkZHJfbG9vcGJhY2soZGFkZHIpIHx8CisJICAgIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJm1zZy0+dGFyZ2V0KSkKKwkJZ290byBvdXQ7CisKKwluID0gbmVpZ2hfbG9va3VwKGlwdjZfc3R1Yi0+bmRfdGJsLCAmbXNnLT50YXJnZXQsIGRldik7CiAKIAlpZiAobikgewogCQlzdHJ1Y3QgdnhsYW5fZmRiICpmOworCQlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CiAKIAkJaWYgKCEobi0+bnVkX3N0YXRlICYgTlVEX0NPTk5FQ1RFRCkpIHsKIAkJCW5laWdoX3JlbGVhc2Uobik7CkBAIC0xMzg2LDEzICsxNDc4LDIzIEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWlwdjZfc3R1Yi0+bmRpc2Nfc2VuZF9uYShkZXYsIG4sIHNhZGRyLCAmbXNnLT50YXJnZXQsCi0JCQkJCSAhIWluNl9kZXYtPmNuZi5mb3J3YXJkaW5nLAotCQkJCQkgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKwkJcmVwbHkgPSB2eGxhbl9uYV9jcmVhdGUoc2tiLCBuLAorCQkJCQkhIShmID8gZi0+ZmxhZ3MgJiBOVEZfUk9VVEVSIDogMCkpOworCiAJCW5laWdoX3JlbGVhc2Uobik7CisKKwkJaWYgKHJlcGx5ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKworCQlpZiAobmV0aWZfcnhfbmkocmVwbHkpID09IE5FVF9SWF9EUk9QKQorCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisKIAl9IGVsc2UgaWYgKHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfTDNNSVNTKSB7Ci0JCWlwYS5zaW42LnNpbjZfYWRkciA9ICpkYWRkcjsKLQkJaXBhLnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ2OworCQl1bmlvbiB2eGxhbl9hZGRyIGlwYSA9IHsKKwkJCS5zaW42LnNpbjZfYWRkciA9IG1zZy0+dGFyZ2V0LAorCQkJLnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ2LAorCQl9OworCiAJCXZ4bGFuX2lwX21pc3MoZGV2LCAmaXBhKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKaW5kZXggMzAzY2UyNy4uOTA3OGE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKQEAgLTE1NDgsNiArMTU0OCw3IEBACiAJCWlmIChyZWcgIT0gbGFzdF92YWwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAorCQl1ZGVsYXkoMSk7CiAJCWxhc3RfdmFsID0gcmVnOwogCQlpZiAoKHJlZyAmIDB4N0U3RkZGRUYpID09IDB4MDA3MDI0MDApCiAJCQljb250aW51ZTsKQEAgLTE1NjAsOCArMTU2MSw2IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCi0JCXVkZWxheSgxKTsKIAl9IHdoaWxlIChjb3VudC0tID4gMCk7CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwppbmRleCBmMDQyYTE4Li41NTg5N2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKQEAgLTIwNjMsNyArMjA2Myw3IEBACiAKIAlBVEhfVFhCVUZfUkVTRVQoYmYpOwogCi0JaWYgKHRpZCkgeworCWlmICh0aWQgJiYgaWVlZTgwMjExX2lzX2RhdGFfcHJlc2VudChoZHItPmZyYW1lX2NvbnRyb2wpKSB7CiAJCWZyYWdubyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgSUVFRTgwMjExX1NDVExfRlJBRzsKIAkJc2Vxbm8gPSB0aWQtPnNlcV9uZXh0OwogCQloZHItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYodGlkLT5zZXFfbmV4dCA8PCBJRUVFODAyMTFfU0VRX1NFUV9TSElGVCk7CkBAIC0yMTg2LDcgKzIxODYsNyBAQAogCQl0eHEtPnN0b3BwZWQgPSB0cnVlOwogCX0KIAotCWlmICh0eGN0bC0+YW4pCisJaWYgKHR4Y3RsLT5hbiAmJiBpZWVlODAyMTFfaXNfZGF0YV9wcmVzZW50KGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCXRpZCA9IGF0aF9nZXRfc2tiX3RpZChzYywgdHhjdGwtPmFuLCBza2IpOwogCiAJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9QU19SRVNQT05TRSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYwppbmRleCAxMTllZTZlLi5kZGFhOWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYwpAQCAtMTk0OCw4ICsxOTQ4LDEwIEBACiAJCWlmIChwa3RfcGFkID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJcmV0ID0gYnJjbWZfc2Rpb190eHBrdF9oZGFsaWduKGJ1cywgcGt0X3BhZCk7Ci0JCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCQlrZnJlZV9za2IocGt0X3BhZCk7CiAJCQlyZXR1cm4gcmV0OworCQl9CiAJCW1lbWNweShwa3RfcGFkLT5kYXRhLAogCQkgICAgICAgcGt0LT5kYXRhICsgcGt0LT5sZW4gLSB0YWlsX2Nob3AsCiAJCSAgICAgICB0YWlsX2Nob3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCmluZGV4IDdmOGI1ZDEuLjQxZDRhODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKQEAgLTU0NjAsMTQgKzU0NjAsMTUgQEAKIAogCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA2OCwgMHgwYik7CiAKLQlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNjksIDB4MGQpOwotCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3MCwgMHgwNik7CisJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDY5LCAweDEyKTsKIAlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNzMsIDB4MTMpOwogCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3NSwgMHg0Nik7CiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDc2LCAweDI4KTsKIAogCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3NywgMHg1OSk7CiAKKwlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNzAsIDB4MGEpOworCiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDc5LCAweDEzKTsKIAlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgODAsIDB4MDUpOwogCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA4MSwgMHgzMyk7CkBAIC01NTEwLDcgKzU1MTEsNiBAQAogCWlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKSB7CiAJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAxMzQsIDB4ZDApOwogCQlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgMTM1LCAweGY2KTsKLQkJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDE0OCwgMHg4NCk7CiAJfQogCiAJcnQyODAwX2Rpc2FibGVfdW51c2VkX2RhY19hZGMocnQyeDAwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYwppbmRleCBjYWRkYzFiLi40MmEyZTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCkBAIC03NjQsNyArNzY0LDcgQEAKIAkvKgogCSAqIE92ZXJ3cml0ZSBUWCBkb25lIGhhbmRsZXIKIAkgKi8KLQlQUkVQQVJFX1dPUksoJnJ0MngwMGRldi0+dHhkb25lX3dvcmssIHJ0MjgwMHVzYl93b3JrX3R4ZG9uZSk7CisJSU5JVF9XT1JLKCZydDJ4MDBkZXYtPnR4ZG9uZV93b3JrLCBydDI4MDB1c2Jfd29ya190eGRvbmUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2Jhc2UuYyBiL2RyaXZlcnMvb2YvYmFzZS5jCmluZGV4IDg5ZTg4OGEuLjVmODFiZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvYmFzZS5jCisrKyBiL2RyaXZlcnMvb2YvYmFzZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KQEAgLTkwNCw2ICs5MDUsMzggQEAKIEVYUE9SVF9TWU1CT0wob2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUpOwogCiAvKioKKyAqIG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUgLSBDb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcHJvcGVydHkKKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqIEBlbGVtX3NpemU6CXNpemUgb2YgdGhlIGluZGl2aWR1YWwgZWxlbWVudAorICoKKyAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mCisgKiBzaXplIGVsZW1fc2l6ZSBpbiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgb24gc3VjZXNzLCAtRUlOVkFMIGlmIHRoZQorICogcHJvcGVydHkgZG9lcyBub3QgZXhpc3Qgb3IgaXRzIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBhIG11bHRpcGxlIG9mIGVsZW1fc2l6ZQorICogYW5kIC1FTk9EQVRBIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCisgKi8KK2ludCBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBlbGVtX3NpemUpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgcHJvcG5hbWUsIE5VTEwpOworCisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXByb3AtPnZhbHVlKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlpZiAocHJvcC0+bGVuZ3RoICUgZWxlbV9zaXplICE9IDApIHsKKwkJcHJfZXJyKCJzaXplIG9mICVzIGluIG5vZGUgJXMgaXMgbm90IGEgbXVsdGlwbGUgb2YgJWRcbiIsCisJCSAgICAgICBwcm9wbmFtZSwgbnAtPmZ1bGxfbmFtZSwgZWxlbV9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHByb3AtPmxlbmd0aCAvIGVsZW1fc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUpOworCisvKioKICAqIG9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZQogICoKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCkBAIC0xOTgyLDMgKzIwMTUsMTUzIEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KKworLyoqCisgKiBvZl9ncmFwaF9wYXJzZV9lbmRwb2ludCgpIC0gcGFyc2UgY29tbW9uIGVuZHBvaW50IG5vZGUgcHJvcGVydGllcworICogQG5vZGU6IHBvaW50ZXIgdG8gZW5kcG9pbnQgZGV2aWNlX25vZGUKKyAqIEBlbmRwb2ludDogcG9pbnRlciB0byB0aGUgT0YgZW5kcG9pbnQgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgY2FsbGVyIHNob3VsZCBob2xkIGEgcmVmZXJlbmNlIHRvIEBub2RlLgorICovCitpbnQgb2ZfZ3JhcGhfcGFyc2VfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgIHN0cnVjdCBvZl9lbmRwb2ludCAqZW5kcG9pbnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwb3J0X25vZGUgPSBvZl9nZXRfcGFyZW50KG5vZGUpOworCisJV0FSTl9PTkNFKCFwb3J0X25vZGUsICIlcygpOiBlbmRwb2ludCAlcyBoYXMgbm8gcGFyZW50IG5vZGVcbiIsCisJCSAgX19mdW5jX18sIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwltZW1zZXQoZW5kcG9pbnQsIDAsIHNpemVvZigqZW5kcG9pbnQpKTsKKworCWVuZHBvaW50LT5sb2NhbF9ub2RlID0gbm9kZTsKKwkvKgorCSAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhlIHR3byBjYWxscyBiZWxvdyBzdWNjZWVkLgorCSAqIElmIHRoZXkgZG9uJ3QgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSAwIGlzIHVzZWQuCisJICovCisJb2ZfcHJvcGVydHlfcmVhZF91MzIocG9ydF9ub2RlLCAicmVnIiwgJmVuZHBvaW50LT5wb3J0KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicmVnIiwgJmVuZHBvaW50LT5pZCk7CisKKwlvZl9ub2RlX3B1dChwb3J0X25vZGUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KTsKKworLyoqCisgKiBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludCgpIC0gZ2V0IG5leHQgZW5kcG9pbnQgbm9kZQorICogQHBhcmVudDogcG9pbnRlciB0byB0aGUgcGFyZW50IGRldmljZSBub2RlCisgKiBAcHJldjogcHJldmlvdXMgZW5kcG9pbnQgbm9kZSwgb3IgTlVMTCB0byBnZXQgZmlyc3QKKyAqCisgKiBSZXR1cm46IEFuICdlbmRwb2ludCcgbm9kZSBwb2ludGVyIHdpdGggcmVmY291bnQgaW5jcmVtZW50ZWQuIFJlZmNvdW50CisgKiBvZiB0aGUgcGFzc2VkIEBwcmV2IG5vZGUgaXMgbm90IGRlY3JlbWVudGVkLCB0aGUgY2FsbGVyIGhhdmUgdG8gdXNlCisgKiBvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KKyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwcmV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZW5kcG9pbnQ7CisJc3RydWN0IGRldmljZV9ub2RlICpwb3J0ID0gTlVMTDsKKworCWlmICghcGFyZW50KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghcHJldikgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJCS8qCisJCSAqIEl0J3MgdGhlIGZpcnN0IGNhbGwsIHdlIGhhdmUgdG8gZmluZCBhIHBvcnQgc3Vibm9kZQorCQkgKiB3aXRoaW4gdGhpcyBub2RlIG9yIHdpdGhpbiBhbiBvcHRpb25hbCAncG9ydHMnIG5vZGUuCisJCSAqLworCQlub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocGFyZW50LCAicG9ydHMiKTsKKwkJaWYgKG5vZGUpCisJCQlwYXJlbnQgPSBub2RlOworCisJCXBvcnQgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwYXJlbnQsICJwb3J0Iik7CisKKwkJaWYgKHBvcnQpIHsKKwkJCS8qIEZvdW5kIGEgcG9ydCwgZ2V0IGFuIGVuZHBvaW50LiAqLworCQkJZW5kcG9pbnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwb3J0LCBOVUxMKTsKKwkJCW9mX25vZGVfcHV0KHBvcnQpOworCQl9IGVsc2UgeworCQkJZW5kcG9pbnQgPSBOVUxMOworCQl9CisKKwkJaWYgKCFlbmRwb2ludCkKKwkJCXByX2VycigiJXMoKTogbm8gZW5kcG9pbnQgbm9kZXMgc3BlY2lmaWVkIGZvciAlc1xuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcGFyZW50LT5mdWxsX25hbWUpOworCQlvZl9ub2RlX3B1dChub2RlKTsKKworCQlyZXR1cm4gZW5kcG9pbnQ7CisJfQorCisJcG9ydCA9IG9mX2dldF9wYXJlbnQocHJldik7CisJaWYgKFdBUk5fT05DRSghcG9ydCwgIiVzKCk6IGVuZHBvaW50ICVzIGhhcyBubyBwYXJlbnQgbm9kZVxuIiwKKwkJICAgICAgX19mdW5jX18sIHByZXYtPmZ1bGxfbmFtZSkpCisJCXJldHVybiBOVUxMOworCisJLyogQXZvaWQgZHJvcHBpbmcgcHJldiBub2RlIHJlZmNvdW50IHRvIDAuICovCisJb2Zfbm9kZV9nZXQocHJldik7CisJZW5kcG9pbnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwb3J0LCBwcmV2KTsKKwlpZiAoZW5kcG9pbnQpIHsKKwkJb2Zfbm9kZV9wdXQocG9ydCk7CisJCXJldHVybiBlbmRwb2ludDsKKwl9CisKKwkvKiBObyBtb3JlIGVuZHBvaW50cyB1bmRlciB0aGlzIHBvcnQsIHRyeSB0aGUgbmV4dCBvbmUuICovCisJZG8geworCQlwb3J0ID0gb2ZfZ2V0X25leHRfY2hpbGQocGFyZW50LCBwb3J0KTsKKwkJaWYgKCFwb3J0KQorCQkJcmV0dXJuIE5VTEw7CisJfSB3aGlsZSAob2Zfbm9kZV9jbXAocG9ydC0+bmFtZSwgInBvcnQiKSk7CisKKwkvKiBQaWNrIHVwIHRoZSBmaXJzdCBlbmRwb2ludCBpbiB0aGlzIHBvcnQuICovCisJZW5kcG9pbnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwb3J0LCBOVUxMKTsKKwlvZl9ub2RlX3B1dChwb3J0KTsKKworCXJldHVybiBlbmRwb2ludDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQpOworCisvKioKKyAqIG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoKSAtIGdldCByZW1vdGUgcG9ydCdzIHBhcmVudCBub2RlCisgKiBAbm9kZTogcG9pbnRlciB0byBhIGxvY2FsIGVuZHBvaW50IGRldmljZV9ub2RlCisgKgorICogUmV0dXJuOiBSZW1vdGUgZGV2aWNlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHJlbW90ZSBlbmRwb2ludCBub2RlIGxpbmtlZAorICoJICAgdG8gQG5vZGUuIFVzZSBvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KKyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXVuc2lnbmVkIGludCBkZXB0aDsKKworCS8qIEdldCByZW1vdGUgZW5kcG9pbnQgbm9kZS4gKi8KKwlucCA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgInJlbW90ZS1lbmRwb2ludCIsIDApOworCisJLyogV2FsayAzIGxldmVscyB1cCBvbmx5IGlmIHRoZXJlIGlzICdwb3J0cycgbm9kZS4gKi8KKwlmb3IgKGRlcHRoID0gMzsgZGVwdGggJiYgbnA7IGRlcHRoLS0pIHsKKwkJbnAgPSBvZl9nZXRfbmV4dF9wYXJlbnQobnApOworCQlpZiAoZGVwdGggPT0gMiAmJiBvZl9ub2RlX2NtcChucC0+bmFtZSwgInBvcnRzIikpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG5wOworfQorRVhQT1JUX1NZTUJPTChvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KTsKKworLyoqCisgKiBvZl9ncmFwaF9nZXRfcmVtb3RlX3BvcnQoKSAtIGdldCByZW1vdGUgcG9ydCBub2RlCisgKiBAbm9kZTogcG9pbnRlciB0byBhIGxvY2FsIGVuZHBvaW50IGRldmljZV9ub2RlCisgKgorICogUmV0dXJuOiBSZW1vdGUgcG9ydCBub2RlIGFzc29jaWF0ZWQgd2l0aCByZW1vdGUgZW5kcG9pbnQgbm9kZSBsaW5rZWQKKyAqCSAgIHRvIEBub2RlLiBVc2Ugb2Zfbm9kZV9wdXQoKSBvbiBpdCB3aGVuIGRvbmUuCisgKi8KK3N0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJLyogR2V0IHJlbW90ZSBlbmRwb2ludCBub2RlLiAqLworCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAicmVtb3RlLWVuZHBvaW50IiwgMCk7CisJaWYgKCFucCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG9mX2dldF9uZXh0X3BhcmVudChucCk7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvc2hhcmUuYyBiL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCmluZGV4IDZhODNlZTEuLjNmYTY2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCkBAIC05MDUsNyArOTA1LDggQEAKIAkJLyogSWYgZGV2LT53YWl0aW5nIGlzIGNsZWFyIG5vdywgYW4gaW50ZXJydXB0CiAJCSAgIGdhdmUgdXMgdGhlIHBvcnQgYW5kIHdlIHdvdWxkIGRlYWRsb2NrIGlmIHdlIHNsZXB0LiAgKi8KIAkJaWYgKGRldi0+d2FpdGluZykgewotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbiAoJmRldi0+d2FpdF9xKTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPndhaXRfcSwKKwkJCQkJCSAhZGV2LT53YWl0aW5nKTsKIAkJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKIAkJCQlyZXR1cm4gLUVJTlRSOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQppbmRleCAxN2QyYjA3Li5lMDRmZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMzMsMjEgKzMzLDE0IEBACiAjCiAjIFNvbWUgYXJjaGl0ZWN0dXJlcyB1c2UgdGhlIGdlbmVyaWMgUENJIHNldHVwIGZ1bmN0aW9ucwogIwotb2JqLSQoQ09ORklHX1g4NikgKz0gc2V0dXAtYnVzLm8KLW9iai0kKENPTkZJR19BTFBIQSkgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KLW9iai0kKENPTkZJR19BUk0pICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfVU5JQ09SRTMyKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX1BBUklTQykgKz0gc2V0dXAtYnVzLm8KLW9iai0kKENPTkZJR19TVVBFUkgpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfUFBDKSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX0ZSVikgKz0gc2V0dXAtYnVzLm8KLW9iai0kKENPTkZJR19NSVBTKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX1g4Nl9WSVNXUykgKz0gc2V0dXAtaXJxLm8KLW9iai0kKENPTkZJR19NTjEwMzAwKSArPSBzZXR1cC1idXMubwotb2JqLSQoQ09ORklHX01JQ1JPQkxBWkUpICs9IHNldHVwLWJ1cy5vCi1vYmotJChDT05GSUdfVElMRSkgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KLW9iai0kKENPTkZJR19TUEFSQ19MRU9OKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwotb2JqLSQoQ09ORklHX002OEspICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCitvYmotJChDT05GSUdfQUxQSEEpICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfQVJNKSArPSBzZXR1cC1pcnEubworb2JqLSQoQ09ORklHX1VOSUNPUkUzMikgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19TVVBFUkgpICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfTUlQUykgKz0gc2V0dXAtaXJxLm8KK29iai0kKENPTkZJR19USUxFKSArPSBzZXR1cC1pcnEubworb2JqLSQoQ09ORklHX1NQQVJDX0xFT04pICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfTTY4SykgKz0gc2V0dXAtaXJxLm8KIAogIwogIyBBQ1BJIFJlbGF0ZWQgUENJIEZXIEZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCAzODkwMTY2Li5mYjhhZWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAKIHN0YXRpYyBpbnQgcGNpX2J1c19hbGxvY19mcm9tX3JlZ2lvbihzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKIAkJcmVzb3VyY2Vfc2l6ZV90IHNpemUsIHJlc291cmNlX3NpemVfdCBhbGlnbiwKLQkJcmVzb3VyY2Vfc2l6ZV90IG1pbiwgdW5zaWduZWQgaW50IHR5cGVfbWFzaywKKwkJcmVzb3VyY2Vfc2l6ZV90IG1pbiwgdW5zaWduZWQgbG9uZyB0eXBlX21hc2ssCiAJCXJlc291cmNlX3NpemVfdCAoKmFsaWduZikodm9pZCAqLAogCQkJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqLAogCQkJCQkgIHJlc291cmNlX3NpemVfdCwKQEAgLTE0NCw3ICsxNDQsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqciwgYXZhaWw7CiAJcmVzb3VyY2Vfc2l6ZV90IG1heDsKIAotCXR5cGVfbWFzayB8PSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU07CisJdHlwZV9tYXNrIHw9IElPUkVTT1VSQ0VfVFlQRV9CSVRTOwogCiAJcGNpX2J1c19mb3JfZWFjaF9yZXNvdXJjZShidXMsIHIsIGkpIHsKIAkJaWYgKCFyKQpAQCAtMjAwLDcgKzIwMCw3IEBACiAgKi8KIGludCBwY2lfYnVzX2FsbG9jX3Jlc291cmNlKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCQlyZXNvdXJjZV9zaXplX3Qgc2l6ZSwgcmVzb3VyY2Vfc2l6ZV90IGFsaWduLAotCQlyZXNvdXJjZV9zaXplX3QgbWluLCB1bnNpZ25lZCBpbnQgdHlwZV9tYXNrLAorCQlyZXNvdXJjZV9zaXplX3QgbWluLCB1bnNpZ25lZCBsb25nIHR5cGVfbWFzaywKIAkJcmVzb3VyY2Vfc2l6ZV90ICgqYWxpZ25mKSh2b2lkICosCiAJCQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICosCiAJCQkJCSAgcmVzb3VyY2Vfc2l6ZV90LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYyBiL2RyaXZlcnMvcGNpL2hvc3QtYnJpZGdlLmMKaW5kZXggMDZhY2U2Mi4uNDdhYWYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jCkBAIC0zMiwxMSArMzIsNiBAQAogCWJyaWRnZS0+cmVsZWFzZV9kYXRhID0gcmVsZWFzZV9kYXRhOwogfQogCi1zdGF0aWMgYm9vbCByZXNvdXJjZV9jb250YWlucyhzdHJ1Y3QgcmVzb3VyY2UgKnJlczEsIHN0cnVjdCByZXNvdXJjZSAqcmVzMikKLXsKLQlyZXR1cm4gcmVzMS0+c3RhcnQgPD0gcmVzMi0+c3RhcnQgJiYgcmVzMS0+ZW5kID49IHJlczItPmVuZDsKLX0KLQogdm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKIAkJCSAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CkBAIC00NSw5ICs0MCw2IEBACiAJcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdpbmRvdywgJmJyaWRnZS0+d2luZG93cywgbGlzdCkgewotCQlpZiAocmVzb3VyY2VfdHlwZShyZXMpICE9IHJlc291cmNlX3R5cGUod2luZG93LT5yZXMpKQotCQkJY29udGludWU7Ci0KIAkJaWYgKHJlc291cmNlX2NvbnRhaW5zKHdpbmRvdy0+cmVzLCByZXMpKSB7CiAJCQlvZmZzZXQgPSB3aW5kb3ctPm9mZnNldDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9LY29uZmlnIGIvZHJpdmVycy9wY2kvaG9zdC9LY29uZmlnCmluZGV4IDQ3ZDQ2YzYuLmE2ZjY3ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9ob3N0L0tjb25maWcKQEAgLTI3LDcgKzI3LDcgQEAKIAogY29uZmlnIFBDSV9SQ0FSX0dFTjIKIAlib29sICJSZW5lc2FzIFItQ2FyIEdlbjIgSW50ZXJuYWwgUENJIGNvbnRyb2xsZXIiCi0JZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfUjhBNzc5MCB8fCBBUkNIX1I4QTc3OTEgfHwgQ09NUElMRV9URVNUKQorCWRlcGVuZHMgb24gQVJDSF9TSE1PQklMRSB8fCAoQVJNICYmIENPTVBJTEVfVEVTVCkKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGludGVybmFsIFBDSSBzdXBwb3J0IG9uIFItQ2FyIEdlbjIgU29DLgogCSAgVGhlcmUgYXJlIDMgaW50ZXJuYWwgUENJIGNvbnRyb2xsZXJzIGF2YWlsYWJsZSB3aXRoIGEgc2luZ2xlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMKaW5kZXggZTg2NjNhOC4uZWUwODI1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYwpAQCAtNDI0LDIwICs0MjQsNDAgQEAKIAogc3RhdGljIGludCBpbXg2X3BjaWVfbGlua191cChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKIHsKLQl1MzIgcmMsIGx0c3NtLCByeF92YWxpZDsKKwl1MzIgcmMsIGRlYnVnX3IwLCByeF92YWxpZDsKKwlpbnQgY291bnQgPSA1OwogCiAJLyoKLQkgKiBUZXN0IGlmIHRoZSBQSFkgcmVwb3J0cyB0aGF0IHRoZSBsaW5rIGlzIHVwIGFuZCBhbHNvIHRoYXQKLQkgKiB0aGUgbGluayB0cmFpbmluZyBmaW5pc2hlZC4gIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSBQSFkKLQkgKiByZXBvcnRzIHRoZSBsaW5rIGlzIGFscmVhZHkgdXAsIGJ1dCB0aGUgbGluayB0cmFpbmluZyBiaXQKLQkgKiBpcyBzdGlsbCBzZXQsIHNvIG1ha2Ugc3VyZSB0byBjaGVjayB0aGUgdHJhaW5pbmcgaXMgZG9uZQotCSAqIGFzIHdlbGwgaGVyZS4KKwkgKiBUZXN0IGlmIHRoZSBQSFkgcmVwb3J0cyB0aGF0IHRoZSBsaW5rIGlzIHVwIGFuZCBhbHNvIHRoYXQgdGhlIExUU1NNCisJICogdHJhaW5pbmcgZmluaXNoZWQuIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdGF0ZXMgb2YgdGhlIGxpbmsgd2hlbgorCSAqIHRoaXMgY29kZSBpcyBjYWxsZWQ6CisJICogMSkgVGhlIGxpbmsgaXMgRE9XTiAodW5saWtlbHkpCisJICogICAgIFRoZSBsaW5rIGRpZG4ndCBjb21lIHVwIHlldCBmb3Igc29tZSByZWFzb24uIFRoaXMgdXN1YWxseSBtZWFucworCSAqICAgICB3ZSBoYXZlIGEgcmVhbCBwcm9ibGVtIHNvbWV3aGVyZS4gUmVzZXQgdGhlIFBIWSBhbmQgZXhpdC4gVGhpcworCSAqICAgICBzdGF0ZSBjYWxscyBmb3IgaW5zcGVjdGlvbiBvZiB0aGUgREVCVUcgcmVnaXN0ZXJzLgorCSAqIDIpIFRoZSBsaW5rIGlzIFVQLCBidXQgc3RpbGwgaW4gTFRTU00gdHJhaW5pbmcKKwkgKiAgICAgV2FpdCBmb3IgdGhlIHRyYWluaW5nIHRvIGZpbmlzaCwgd2hpY2ggc2hvdWxkIHRha2UgYSB2ZXJ5IHNob3J0CisJICogICAgIHRpbWUuIElmIHRoZSB0cmFpbmluZyBkb2VzIG5vdCBmaW5pc2gsIHdlIGhhdmUgYSBwcm9ibGVtIGFuZCB3ZQorCSAqICAgICBuZWVkIHRvIGluc3BlY3QgdGhlIERFQlVHIHJlZ2lzdGVycy4gSWYgdGhlIHRyYWluaW5nIGRvZXMgZmluaXNoLAorCSAqICAgICB0aGUgbGluayBpcyB1cCBhbmQgb3BlcmF0aW5nIGNvcnJlY3RseS4KKwkgKiAzKSBUaGUgbGluayBpcyBVUCBhbmQgbm8gbG9uZ2VyIGluIExUU1NNIHRyYWluaW5nCisJICogICAgIFRoZSBsaW5rIGlzIHVwIGFuZCBvcGVyYXRpbmcgY29ycmVjdGx5LgogCSAqLwotCXJjID0gcmVhZGwocHAtPmRiaV9iYXNlICsgUENJRV9QSFlfREVCVUdfUjEpOwotCWlmICgocmMgJiBQQ0lFX1BIWV9ERUJVR19SMV9YTUxIX0xJTktfVVApICYmCi0JICAgICEocmMgJiBQQ0lFX1BIWV9ERUJVR19SMV9YTUxIX0xJTktfSU5fVFJBSU5JTkcpKQotCQlyZXR1cm4gMTsKLQorCXdoaWxlICgxKSB7CisJCXJjID0gcmVhZGwocHAtPmRiaV9iYXNlICsgUENJRV9QSFlfREVCVUdfUjEpOworCQlpZiAoIShyYyAmIFBDSUVfUEhZX0RFQlVHX1IxX1hNTEhfTElOS19VUCkpCisJCQlicmVhazsKKwkJaWYgKCEocmMgJiBQQ0lFX1BIWV9ERUJVR19SMV9YTUxIX0xJTktfSU5fVFJBSU5JTkcpKQorCQkJcmV0dXJuIDE7CisJCWlmICghY291bnQtLSkKKwkJCWJyZWFrOworCQlkZXZfZGJnKHBwLT5kZXYsICJMaW5rIGlzIHVwLCBidXQgc3RpbGwgaW4gdHJhaW5pbmdcbiIpOworCQkvKgorCQkgKiBXYWl0IGEgbGl0dGxlIGJpdCwgdGhlbiByZS1jaGVjayBpZiB0aGUgbGluayBmaW5pc2hlZAorCQkgKiB0aGUgdHJhaW5pbmcuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfQogCS8qCiAJICogRnJvbSBMMCwgaW5pdGlhdGUgTUFDIGVudHJ5IHRvIGdlbjIgaWYgRVAvUkMgc3VwcG9ydHMgZ2VuMi4KIAkgKiBXYWl0IDJtcyAoTFRTU00gdGltZW91dCBpcyAyNG1zLCBQSFkgbG9jayBpcyB+NXVzIGluIGdlbjIpLgpAQCAtNDQ2LDE1ICs0NjYsMTYgQEAKIAkgKiB0byBnZW4yIGlzIHN0dWNrCiAJICovCiAJcGNpZV9waHlfcmVhZChwcC0+ZGJpX2Jhc2UsIFBDSUVfUEhZX1JYX0FTSUNfT1VULCAmcnhfdmFsaWQpOwotCWx0c3NtID0gcmVhZGwocHAtPmRiaV9iYXNlICsgUENJRV9QSFlfREVCVUdfUjApICYgMHgzRjsKKwlkZWJ1Z19yMCA9IHJlYWRsKHBwLT5kYmlfYmFzZSArIFBDSUVfUEhZX0RFQlVHX1IwKTsKIAogCWlmIChyeF92YWxpZCAmIDB4MDEpCiAJCXJldHVybiAwOwogCi0JaWYgKGx0c3NtICE9IDB4MGQpCisJaWYgKChkZWJ1Z19yMCAmIDB4M2YpICE9IDB4MGQpCiAJCXJldHVybiAwOwogCiAJZGV2X2VycihwcC0+ZGV2LCAidHJhbnNpdGlvbiB0byBnZW4yIGlzIHN0dWNrLCByZXNldCBQSFkhXG4iKTsKKwlkZXZfZGJnKHBwLT5kZXYsICJkZWJ1Z19yMD0lMDh4IGRlYnVnX3IxPSUwOHhcbiIsIGRlYnVnX3IwLCByYyk7CiAKIAlpbXg2X3BjaWVfcmVzZXRfcGh5KHBwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXZlYnUuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLW12ZWJ1LmMKaW5kZXggMGU3OTY2NS4uZDNkMWNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXZlYnUuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jCkBAIC0xMDEsNyArMTAxLDkgQEAKIAlzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0czsKIAlzdHJ1Y3QgbXNpX2NoaXAgKm1zaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgaW87CisJY2hhciBpb19uYW1lWzMwXTsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVhbGlvOworCWNoYXIgbWVtX25hbWVbMzBdOwogCXN0cnVjdCByZXNvdXJjZSBtZW07CiAJc3RydWN0IHJlc291cmNlIGJ1c247CiAJaW50IG5wb3J0czsKQEAgLTY3MiwxMCArNjc0LDMwIEBACiB7CiAJc3RydWN0IG12ZWJ1X3BjaWUgKnBjaWUgPSBzeXNfdG9fcGNpZShzeXMpOwogCWludCBpOworCWludCBkb21haW4gPSAwOwogCi0JaWYgKHJlc291cmNlX3NpemUoJnBjaWUtPnJlYWxpbykgIT0gMCkKKyNpZmRlZiBDT05GSUdfUENJX0RPTUFJTlMKKwlkb21haW4gPSBzeXMtPmRvbWFpbjsKKyNlbmRpZgorCisJc25wcmludGYocGNpZS0+bWVtX25hbWUsIHNpemVvZihwY2llLT5tZW1fbmFtZSksICJQQ0kgTUVNICUwNHgiLAorCQkgZG9tYWluKTsKKwlwY2llLT5tZW0ubmFtZSA9IHBjaWUtPm1lbV9uYW1lOworCisJc25wcmludGYocGNpZS0+aW9fbmFtZSwgc2l6ZW9mKHBjaWUtPmlvX25hbWUpLCAiUENJIEkvTyAlMDR4IiwgZG9tYWluKTsKKwlwY2llLT5yZWFsaW8ubmFtZSA9IHBjaWUtPmlvX25hbWU7CisKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZwY2llLT5tZW0pKQorCQlyZXR1cm4gMDsKKworCWlmIChyZXNvdXJjZV9zaXplKCZwY2llLT5yZWFsaW8pICE9IDApIHsKKwkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBjaWUtPnJlYWxpbykpIHsKKwkJCXJlbGVhc2VfcmVzb3VyY2UoJnBjaWUtPm1lbSk7CisJCQlyZXR1cm4gMDsKKwkJfQogCQlwY2lfYWRkX3Jlc291cmNlX29mZnNldCgmc3lzLT5yZXNvdXJjZXMsICZwY2llLT5yZWFsaW8sCiAJCQkJCXN5cy0+aW9fb2Zmc2V0KTsKKwl9CiAJcGNpX2FkZF9yZXNvdXJjZV9vZmZzZXQoJnN5cy0+cmVzb3VyY2VzLCAmcGNpZS0+bWVtLCBzeXMtPm1lbV9vZmZzZXQpOwogCXBjaV9hZGRfcmVzb3VyY2UoJnN5cy0+cmVzb3VyY2VzLCAmcGNpZS0+YnVzbik7CiAKQEAgLTc5Nyw3ICs4MTksNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5yYW5nZXM7IGkrKykgewogCQl1MzIgZmxhZ3MgPSBvZl9yZWFkX251bWJlcihyYW5nZSwgMSk7Ci0JCXUzMiBzbG90ID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UsIDIpOworCQl1MzIgc2xvdCA9IG9mX3JlYWRfbnVtYmVyKHJhbmdlICsgMSwgMSk7CiAJCXU2NCBjcHVhZGRyID0gb2ZfcmVhZF9udW1iZXIocmFuZ2UgKyBuYSwgcG5hKTsKIAkJdW5zaWduZWQgbG9uZyBydHlwZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktcmNhci1nZW4yLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1yY2FyLWdlbjIuYwppbmRleCBjZWVjMTQ3Li5mZDNlM2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1yY2FyLWdlbjIuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1yY2FyLWdlbjIuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogQUhCLVBDSSBCcmlkZ2UgUENJIGNvbW11bmljYXRpb24gcmVnaXN0ZXJzICovCkBAIC0zOSw5ICs0MCwyNiBAQAogCiAjZGVmaW5lIFJDQVJfUENJX0lOVF9FTkFCTEVfUkVHCQkoUkNBUl9BSEJQQ0lfUENJQ09NX09GRlNFVCArIDB4MjApCiAjZGVmaW5lIFJDQVJfUENJX0lOVF9TVEFUVVNfUkVHCQkoUkNBUl9BSEJQQ0lfUENJQ09NX09GRlNFVCArIDB4MjQpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9TSUdUQUJPUlQJCSgxIDw8IDApCisjZGVmaW5lIFJDQVJfUENJX0lOVF9TSUdSRVRBQk9SVAkoMSA8PCAxKQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfUkVNQUJPUlQJCSgxIDw8IDIpCisjZGVmaW5lIFJDQVJfUENJX0lOVF9QRVJSCQkoMSA8PCAzKQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfU0lHU0VSUgkJKDEgPDwgNCkKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1JFU0VSUgkJKDEgPDwgNSkKKyNkZWZpbmUgUkNBUl9QQ0lfSU5UX1dJTjFFUlIJCSgxIDw8IDEyKQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfV0lOMkVSUgkJKDEgPDwgMTMpCiAjZGVmaW5lIFJDQVJfUENJX0lOVF9BCQkJKDEgPDwgMTYpCiAjZGVmaW5lIFJDQVJfUENJX0lOVF9CCQkJKDEgPDwgMTcpCiAjZGVmaW5lIFJDQVJfUENJX0lOVF9QTUUJCSgxIDw8IDE5KQorI2RlZmluZSBSQ0FSX1BDSV9JTlRfQUxMRVJST1JTIChSQ0FSX1BDSV9JTlRfU0lHVEFCT1JUCQl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfU0lHUkVUQUJPUlQJfCBcCisJCQkJUkNBUl9QQ0lfSU5UX1NJR1JFVEFCT1JUCXwgXAorCQkJCVJDQVJfUENJX0lOVF9SRU1BQk9SVAkJfCBcCisJCQkJUkNBUl9QQ0lfSU5UX1BFUlIJCXwgXAorCQkJCVJDQVJfUENJX0lOVF9TSUdTRVJSCQl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfUkVTRVJSCQl8IFwKKwkJCQlSQ0FSX1BDSV9JTlRfV0lOMUVSUgkJfCBcCisJCQkJUkNBUl9QQ0lfSU5UX1dJTjJFUlIpCiAKICNkZWZpbmUgUkNBUl9BSEJfQlVTX0NUUl9SRUcJCShSQ0FSX0FIQlBDSV9QQ0lDT01fT0ZGU0VUICsgMHgzMCkKICNkZWZpbmUgUkNBUl9BSEJfQlVTX01NT0RFX0hUUkFOUwkoMSA8PCAwKQpAQCAtNzQsOSArOTIsNiBAQAogCiAjZGVmaW5lIFJDQVJfUENJX1VOSVRfUkVWX1JFRwkJKFJDQVJfQUhCUENJX1BDSUNPTV9PRkZTRVQgKyAweDQ4KQogCi0vKiBOdW1iZXIgb2YgaW50ZXJuYWwgUENJIGNvbnRyb2xsZXJzICovCi0jZGVmaW5lIFJDQVJfUENJX05SX0NPTlRST0xMRVJTCQkzCi0KIHN0cnVjdCByY2FyX3BjaV9wcml2IHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJdm9pZCBfX2lvbWVtICpyZWc7CkBAIC04NCw2ICs5OSw3IEBACiAJc3RydWN0IHJlc291cmNlIG1lbV9yZXM7CiAJc3RydWN0IHJlc291cmNlICpjZmdfcmVzOwogCWludCBpcnE7CisJdW5zaWduZWQgbG9uZyB3aW5kb3dfc2l6ZTsKIH07CiAKIC8qIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9wZXJhdGlvbnMgKi8KQEAgLTEwMiw2ICsxMTgsMTAgQEAKIAlpZiAoc2xvdCA+IDIpCiAJCXJldHVybiBOVUxMOwogCisJLyogYnJpZGdlIGxvZ2ljIG9ubHkgaGFzIHJlZ2lzdGVycyB0byAweDQwICovCisJaWYgKHNsb3QgPT0gMHgwICYmIHdoZXJlID49IDB4NDApCisJCXJldHVybiBOVUxMOworCiAJdmFsID0gc2xvdCA/IFJDQVJfQUhCUENJX1dJTjFfREVWSUNFIHwgUkNBUl9BSEJQQ0lfV0lOX0NUUl9DRkcgOgogCQkgICAgIFJDQVJfQUhCUENJX1dJTjFfSE9TVCB8IFJDQVJfQUhCUENJX1dJTl9DVFJfQ0ZHOwogCkBAIC0xNTYsNyArMTc2LDcgQEAKIH0KIAogLyogUENJIGludGVycnVwdCBtYXBwaW5nICovCi1zdGF0aWMgaW50IF9faW5pdCByY2FyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgcmNhcl9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzID0gZGV2LT5idXMtPnN5c2RhdGE7CiAJc3RydWN0IHJjYXJfcGNpX3ByaXYgKnByaXYgPSBzeXMtPnByaXZhdGVfZGF0YTsKQEAgLTE2NCw4ICsxODQsNDggQEAKIAlyZXR1cm4gcHJpdi0+aXJxOwogfQogCisjaWZkZWYgQ09ORklHX1BDSV9ERUJVRworLyogaWYgZGVidWcgZW5hYmxlZCwgdGhlbiBhdHRhY2ggYW4gZXJyb3IgaGFuZGxlciBpcnEgdG8gdGhlIGJyaWRnZSAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgcmNhcl9wY2lfZXJyX2lycShpbnQgaXJxLCB2b2lkICpwdykKK3sKKwlzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdiA9IHB3OworCXUzMiBzdGF0dXMgPSBpb3JlYWQzMihwcml2LT5yZWcgKyBSQ0FSX1BDSV9JTlRfU1RBVFVTX1JFRyk7CisKKwlpZiAoc3RhdHVzICYgUkNBUl9QQ0lfSU5UX0FMTEVSUk9SUykgeworCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGlycTogc3RhdHVzICUwOHhcbiIsIHN0YXR1cyk7CisKKwkJLyogY2xlYXIgdGhlIGVycm9yKHMpICovCisJCWlvd3JpdGUzMihzdGF0dXMgJiBSQ0FSX1BDSV9JTlRfQUxMRVJST1JTLAorCQkJICBwcml2LT5yZWcgKyBSQ0FSX1BDSV9JTlRfU1RBVFVTX1JFRyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIHJjYXJfcGNpX3NldHVwX2VycmlycShzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKHByaXYtPmRldiwgcHJpdi0+aXJxLCByY2FyX3BjaV9lcnJfaXJxLAorCQkJICAgICAgIElSUUZfU0hBUkVELCAiZXJyb3IgaXJxIiwgcHJpdik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHByaXYtPmRldiwgImNhbm5vdCBjbGFpbSBJUlEgZm9yIGVycm9yIGhhbmRsaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZyArIFJDQVJfUENJX0lOVF9FTkFCTEVfUkVHKTsKKwl2YWwgfD0gUkNBUl9QQ0lfSU5UX0FMTEVSUk9SUzsKKwlpb3dyaXRlMzIodmFsLCBwcml2LT5yZWcgKyBSQ0FSX1BDSV9JTlRfRU5BQkxFX1JFRyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHJjYXJfcGNpX3NldHVwX2VycmlycShzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdikgeyB9CisjZW5kaWYKKwogLyogUENJIGhvc3QgY29udHJvbGxlciBzZXR1cCAqLwotc3RhdGljIGludCBfX2luaXQgcmNhcl9wY2lfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCitzdGF0aWMgaW50IHJjYXJfcGNpX3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQogewogCXN0cnVjdCByY2FyX3BjaV9wcml2ICpwcml2ID0gc3lzLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBwcml2LT5yZWc7CkBAIC0xODMsMTAgKzI0MywzMSBAQAogCWlvd3JpdGUzMih2YWwsIHJlZyArIFJDQVJfVVNCQ1RSX1JFRyk7CiAJdWRlbGF5KDQpOwogCi0JLyogRGUtYXNzZXJ0IHJlc2V0IGFuZCBzZXQgUENJQUhCIHdpbmRvdzEgc2l6ZSB0byAxR0IgKi8KKwkvKiBEZS1hc3NlcnQgcmVzZXQgYW5kIHJlc2V0IFBDSUFIQiB3aW5kb3cxIHNpemUgKi8KIAl2YWwgJj0gfihSQ0FSX1VTQkNUUl9QQ0lBSEJfV0lOMV9NQVNLIHwgUkNBUl9VU0JDVFJfUENJQ0xLX01BU0sgfAogCQkgUkNBUl9VU0JDVFJfVVNCSF9SU1QgfCBSQ0FSX1VTQkNUUl9QTExfUlNUKTsKLQlpb3dyaXRlMzIodmFsIHwgUkNBUl9VU0JDVFJfUENJQUhCX1dJTjFfMUcsIHJlZyArIFJDQVJfVVNCQ1RSX1JFRyk7CisKKwkvKiBTZXR1cCBQQ0lBSEIgd2luZG93MSBzaXplICovCisJc3dpdGNoIChwcml2LT53aW5kb3dfc2l6ZSkgeworCWNhc2UgU1pfMkc6CisJCXZhbCB8PSBSQ0FSX1VTQkNUUl9QQ0lBSEJfV0lOMV8yRzsKKwkJYnJlYWs7CisJY2FzZSBTWl8xRzoKKwkJdmFsIHw9IFJDQVJfVVNCQ1RSX1BDSUFIQl9XSU4xXzFHOworCQlicmVhazsKKwljYXNlIFNaXzUxMk06CisJCXZhbCB8PSBSQ0FSX1VTQkNUUl9QQ0lBSEJfV0lOMV81MTJNOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl93YXJuKCJ1bmtub3duIHdpbmRvdyBzaXplICVsZCAtIGRlZmF1bHRpbmcgdG8gMjU2TVxuIiwKKwkJCXByaXYtPndpbmRvd19zaXplKTsKKwkJcHJpdi0+d2luZG93X3NpemUgPSBTWl8yNTZNOworCQkvKiBmYWxsLXRocm91Z2ggKi8KKwljYXNlIFNaXzI1Nk06CisJCXZhbCB8PSBSQ0FSX1VTQkNUUl9QQ0lBSEJfV0lOMV8yNTZNOworCQlicmVhazsKKwl9CisJaW93cml0ZTMyKHZhbCwgcmVnICsgUkNBUl9VU0JDVFJfUkVHKTsKIAogCS8qIENvbmZpZ3VyZSBBSEIgbWFzdGVyIGFuZCBzbGF2ZSBtb2RlcyAqLwogCWlvd3JpdGUzMihSQ0FSX0FIQl9CVVNfTU9ERSwgcmVnICsgUkNBUl9BSEJfQlVTX0NUUl9SRUcpOwpAQCAtMTk3LDcgKzI3OCw3IEBACiAJICAgICAgIFJDQVJfUENJX0FSQklURVJfUENJQlBfTU9ERTsKIAlpb3dyaXRlMzIodmFsLCByZWcgKyBSQ0FSX1BDSV9BUkJJVEVSX0NUUl9SRUcpOwogCi0JLyogUENJLUFIQiBtYXBwaW5nOiAweDQwMDAwMDAwLTB4ODAwMDAwMDAgKi8KKwkvKiBQQ0ktQUhCIG1hcHBpbmc6IDB4NDAwMDAwMDAgYmFzZSAqLwogCWlvd3JpdGUzMigweDQwMDAwMDAwIHwgUkNBUl9QQ0lBSEJfUFJFRkVUQ0gxNiwKIAkJICByZWcgKyBSQ0FSX1BDSUFIQl9XSU4xX0NUUl9SRUcpOwogCkBAIC0yMjQsMTAgKzMwNSwxNSBAQAogCWlvd3JpdGUzMihSQ0FSX1BDSV9JTlRfQSB8IFJDQVJfUENJX0lOVF9CIHwgUkNBUl9QQ0lfSU5UX1BNRSwKIAkJICByZWcgKyBSQ0FSX1BDSV9JTlRfRU5BQkxFX1JFRyk7CiAKKwlpZiAocHJpdi0+aXJxID4gMCkKKwkJcmNhcl9wY2lfc2V0dXBfZXJyaXJxKHByaXYpOworCiAJLyogQWRkIFBDSSByZXNvdXJjZXMgKi8KIAlwY2lfYWRkX3Jlc291cmNlKCZzeXMtPnJlc291cmNlcywgJnByaXYtPmlvX3Jlcyk7CiAJcGNpX2FkZF9yZXNvdXJjZSgmc3lzLT5yZXNvdXJjZXMsICZwcml2LT5tZW1fcmVzKTsKIAorCS8qIFNldHVwIGJ1cyBudW1iZXIgYmFzZWQgb24gcGxhdGZvcm0gZGV2aWNlIGlkICovCisJc3lzLT5idXNuciA9IHRvX3BsYXRmb3JtX2RldmljZShwcml2LT5kZXYpLT5pZDsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjM2LDQ4ICszMjIsMTMgQEAKIAkud3JpdGUJPSByY2FyX3BjaV93cml0ZV9jb25maWcsCiB9OwogCi1zdGF0aWMgc3RydWN0IGh3X3BjaSByY2FyX2h3X3BjaSBfX2luaXRkYXRhID0gewotCS5tYXBfaXJxCT0gcmNhcl9wY2lfbWFwX2lycSwKLQkub3BzCQk9ICZyY2FyX3BjaV9vcHMsCi0JLnNldHVwCQk9IHJjYXJfcGNpX3NldHVwLAotfTsKLQotc3RhdGljIGludCByY2FyX3BjaV9jb3VudCBfX2luaXRkYXRhOwotCi1zdGF0aWMgaW50IF9faW5pdCByY2FyX3BjaV9hZGRfY29udHJvbGxlcihzdHJ1Y3QgcmNhcl9wY2lfcHJpdiAqcHJpdikKLXsKLQl2b2lkICoqcHJpdmF0ZV9kYXRhOwotCWludCBjb3VudDsKLQotCWlmIChyY2FyX2h3X3BjaS5ucl9jb250cm9sbGVycyA8IHJjYXJfcGNpX2NvdW50KQotCQlnb3RvIGFkZF9wcml2OwotCi0JLyogKFJlKWFsbG9jYXRlIHByaXZhdGUgZGF0YSBwb2ludGVyIGFycmF5IGlmIG5lZWRlZCAqLwotCWNvdW50ID0gcmNhcl9wY2lfY291bnQgKyBSQ0FSX1BDSV9OUl9DT05UUk9MTEVSUzsKLQlwcml2YXRlX2RhdGEgPSBremFsbG9jKGNvdW50ICogc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOwotCWlmICghcHJpdmF0ZV9kYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJjYXJfcGNpX2NvdW50ID0gY291bnQ7Ci0JaWYgKHJjYXJfaHdfcGNpLnByaXZhdGVfZGF0YSkgewotCQltZW1jcHkocHJpdmF0ZV9kYXRhLCByY2FyX2h3X3BjaS5wcml2YXRlX2RhdGEsCi0JCSAgICAgICByY2FyX2h3X3BjaS5ucl9jb250cm9sbGVycyAqIHNpemVvZih2b2lkICopKTsKLQkJa2ZyZWUocmNhcl9od19wY2kucHJpdmF0ZV9kYXRhKTsKLQl9Ci0KLQlyY2FyX2h3X3BjaS5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7Ci0KLWFkZF9wcml2OgotCS8qIEFkZCBwcml2YXRlIGRhdGEgcG9pbnRlciB0byB0aGUgYXJyYXkgKi8KLQlyY2FyX2h3X3BjaS5wcml2YXRlX2RhdGFbcmNhcl9od19wY2kubnJfY29udHJvbGxlcnMrK10gPSBwcml2OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCByY2FyX3BjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCByY2FyX3BjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqY2ZnX3JlcywgKm1lbV9yZXM7CiAJc3RydWN0IHJjYXJfcGNpX3ByaXYgKnByaXY7CiAJdm9pZCBfX2lvbWVtICpyZWc7CisJc3RydWN0IGh3X3BjaSBodzsKKwl2b2lkICpod19wcml2YXRlWzFdOwogCiAJY2ZnX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIGNmZ19yZXMpOwpAQCAtMzA4LDMxICszNTksMzQgQEAKIAlwcml2LT5yZWcgPSByZWc7CiAJcHJpdi0+ZGV2ID0gJnBkZXYtPmRldjsKIAotCXJldHVybiByY2FyX3BjaV9hZGRfY29udHJvbGxlcihwcml2KTsKKwlpZiAocHJpdi0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB2YWxpZCBpcnEgZm91bmRcbiIpOworCQlyZXR1cm4gcHJpdi0+aXJxOworCX0KKworCXByaXYtPndpbmRvd19zaXplID0gU1pfMUc7CisKKwlod19wcml2YXRlWzBdID0gcHJpdjsKKwltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKKwlody5ucl9jb250cm9sbGVycyA9IEFSUkFZX1NJWkUoaHdfcHJpdmF0ZSk7CisJaHcucHJpdmF0ZV9kYXRhID0gaHdfcHJpdmF0ZTsKKwlody5tYXBfaXJxID0gcmNhcl9wY2lfbWFwX2lycTsKKwlody5vcHMgPSAmcmNhcl9wY2lfb3BzOworCWh3LnNldHVwID0gcmNhcl9wY2lfc2V0dXA7CisJcGNpX2NvbW1vbl9pbml0X2RldigmcGRldi0+ZGV2LCAmaHcpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByY2FyX3BjaV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAicGNpLXJjYXItZ2VuMiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkuc3VwcHJlc3NfYmluZF9hdHRycyA9IHRydWUsCiAJfSwKKwkucHJvYmUgPSByY2FyX3BjaV9wcm9iZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHJjYXJfcGNpX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZyY2FyX3BjaV9kcml2ZXIsIHJjYXJfcGNpX3Byb2JlKTsKLQlpZiAoIXJldHZhbCkKLQkJcGNpX2NvbW1vbl9pbml0KCZyY2FyX2h3X3BjaSk7Ci0KLQkvKiBQcml2YXRlIGRhdGEgcG9pbnRlciBhcnJheSBpcyBub3QgbmVlZGVkIGFueSBtb3JlICovCi0Ja2ZyZWUocmNhcl9od19wY2kucHJpdmF0ZV9kYXRhKTsKLQlyY2FyX2h3X3BjaS5wcml2YXRlX2RhdGEgPSBOVUxMOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3Vic3lzX2luaXRjYWxsKHJjYXJfcGNpX2luaXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyY2FyX3BjaV9kcml2ZXIpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJlbmVzYXMgUi1DYXIgR2VuMiBpbnRlcm5hbCBQQ0kiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jCmluZGV4IDE3Y2U4OGYuLjUwOWEyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYwpAQCAtMjk0LDE0ICsyOTQsMTIgQEAKIHN0YXRpYyB2b2lkIGNsZWFyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGludCBwb3MsIG52ZWM7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBtc2lfZGVzYyAqbXNpOwogCXN0cnVjdCBwY2llX3BvcnQgKnBwOwogCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEoaXJxKTsKIAogCS8qIGdldCB0aGUgcG9ydCBzdHJ1Y3R1cmUgKi8KLQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQltc2kgPSBpcnFfZGVzY19nZXRfbXNpX2Rlc2MoZGVzYyk7CisJbXNpID0gaXJxX2RhdGFfZ2V0X21zaShkYXRhKTsKIAlwcCA9IHN5c190b19wY2llKG1zaS0+ZGV2LT5idXMtPnN5c2RhdGEpOwogCWlmICghcHApIHsKIAkJQlVHKCk7CkBAIC04MDAsNyArNzk4LDcgQEAKIAogCS8qIHNldHVwIFJDIEJBUnMgKi8KIAlkd19wY2llX3dyaXRlbF9yYyhwcCwgMHgwMDAwMDAwNCwgUENJX0JBU0VfQUREUkVTU18wKTsKLQlkd19wY2llX3dyaXRlbF9yYyhwcCwgMHgwMDAwMDAwNCwgUENJX0JBU0VfQUREUkVTU18xKTsKKwlkd19wY2llX3dyaXRlbF9yYyhwcCwgMHgwMDAwMDAwMCwgUENJX0JBU0VfQUREUkVTU18xKTsKIAogCS8qIHNldHVwIGludGVycnVwdCBwaW5zICovCiAJZHdfcGNpZV9yZWFkbF9yYyhwcCwgUENJX0lOVEVSUlVQVF9MSU5FLCAmdmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IDgyOGFjZjQuLmJjY2MyN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtNDI0LDcgKzQyNCw3IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGFjcGlwaHBfbWF4X2J1c25yKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBwY2lfYnVzICp0bXA7CiAJdW5zaWduZWQgY2hhciBtYXgsIG47CiAKIAkvKgpAQCAtNDM3LDggKzQzNyw4IEBACiAJICovCiAJbWF4ID0gYnVzLT5idXNuX3Jlcy5zdGFydDsKIAotCWxpc3RfZm9yX2VhY2godG1wLCAmYnVzLT5jaGlsZHJlbikgewotCQluID0gcGNpX2J1c19tYXhfYnVzbnIocGNpX2J1c19iKHRtcCkpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQluID0gcGNpX2J1c19tYXhfYnVzbnIodG1wKTsKIAkJaWYgKG4gPiBtYXgpCiAJCQltYXggPSBuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwppbmRleCAzMTI3M2UxLi4wMzdlMjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCkBAIC05MjAsMTIgKzkyMCwxMiBAQAogCQkJCWJ1cy0+bWF4X2J1c19zcGVlZCA9IFBDSV9TUEVFRF8xMDBNSHpfUENJWDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmIChidXNfY2FwICYgMjApIHsKKwkJCWlmIChidXNfY2FwICYgMHgyMCkgewogCQkJCWRiZygiYnVzIG1heCBzdXBwb3J0cyA2Nk1IeiBQQ0ktWFxuIik7CiAJCQkJYnVzLT5tYXhfYnVzX3NwZWVkID0gUENJX1NQRUVEXzY2TUh6X1BDSVg7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoYnVzX2NhcCAmIDEwKSB7CisJCQlpZiAoYnVzX2NhcCAmIDB4MTApIHsKIAkJCQlkYmcoImJ1cyBtYXggc3VwcG9ydHMgNjZNSHogUENJXG4iKTsKIAkJCQlidXMtPm1heF9idXNfc3BlZWQgPSBQQ0lfU1BFRURfNjZNSHo7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCA4OGIzN2NhLi44YTY2ODY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTc2LDYgKzc2LDcgQEAKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwkvKiB3b3JrIGZvciBidXR0b24gZXZlbnQgKi8KIAlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgbXV0ZXggaG90cGx1Z19sb2NrOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIH07CiAKQEAgLTEwOSw2ICsxMTAsOCBAQAogI2RlZmluZSBJTlRfQlVUVE9OX1BSRVNTCQk3CiAjZGVmaW5lIElOVF9CVVRUT05fUkVMRUFTRQkJOAogI2RlZmluZSBJTlRfQlVUVE9OX0NBTkNFTAkJOQorI2RlZmluZSBJTlRfTElOS19VUAkJCTEwCisjZGVmaW5lIElOVF9MSU5LX0RPV04JCQkxMQogCiAjZGVmaW5lIFNUQVRJQ19TVEFURQkJCTAKICNkZWZpbmUgQkxJTktJTkdPTl9TVEFURQkJMQpAQCAtMTMyLDYgKzEzNSw3IEBACiB1OCBwY2llaHBfaGFuZGxlX3N3aXRjaF9jaGFuZ2Uoc3RydWN0IHNsb3QgKnBfc2xvdCk7CiB1OCBwY2llaHBfaGFuZGxlX3ByZXNlbmNlX2NoYW5nZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIHU4IHBjaWVocF9oYW5kbGVfcG93ZXJfZmF1bHQoc3RydWN0IHNsb3QgKnBfc2xvdCk7Cit2b2lkIHBjaWVocF9oYW5kbGVfbGlua3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIGludCBwY2llaHBfY29uZmlndXJlX2RldmljZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIGludCBwY2llaHBfdW5jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogdm9pZCBwY2llaHBfcXVldWVfcHVzaGJ1dHRvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CkBAIC0xNTMsNiArMTU3LDcgQEAKIHZvaWQgcGNpZWhwX2dyZWVuX2xlZF9vZmYoc3RydWN0IHNsb3QgKnNsb3QpOwogdm9pZCBwY2llaHBfZ3JlZW5fbGVkX2JsaW5rKHN0cnVjdCBzbG90ICpzbG90KTsKIGludCBwY2llaHBfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOworYm9vbCBwY2llaHBfY2hlY2tfbGlua19hY3RpdmUoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwogdm9pZCBwY2llaHBfcmVsZWFzZV9jdHJsKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKTsKIGludCBwY2llaHBfcmVzZXRfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCwgaW50IHByb2JlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCmluZGV4IGVkZGRkZDQuLjIwZmVhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKQEAgLTExMiw2ICsxMTIsNyBAQAogc3RhdGljIGludCBfX2luaXQgc2VsZWN0X2RldGVjdGlvbl9tb2RlKHZvaWQpCiB7CiAJc3RydWN0IGR1bW15X3Nsb3QgKnNsb3QsICp0bXA7CisKIAlpZiAocGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoJmR1bW15X2RyaXZlcikpCiAJCXJldHVybiBQQ0lFSFBfREVURUNUX0FDUEk7CiAJcGNpZV9wb3J0X3NlcnZpY2VfdW5yZWdpc3RlcigmZHVtbXlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwppbmRleCA1M2I1OGRlLi4wZTBhMmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCkBAIC0xMDgsNiArMTA4LDcgQEAKIAlvcHMgPSBremFsbG9jKHNpemVvZigqb3BzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvcHMpCiAJCWdvdG8gb3V0OworCiAJb3BzLT5lbmFibGVfc2xvdCA9IGVuYWJsZV9zbG90OwogCW9wcy0+ZGlzYWJsZV9zbG90ID0gZGlzYWJsZV9zbG90OwogCW9wcy0+Z2V0X3Bvd2VyX3N0YXR1cyA9IGdldF9wb3dlcl9zdGF0dXM7CkBAIC0yODMsOCArMjg0LDExIEBACiAJc2xvdCA9IGN0cmwtPnNsb3Q7CiAJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmb2NjdXBpZWQpOwogCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZwb3dlcm9uKTsKLQlpZiAob2NjdXBpZWQgJiYgcGNpZWhwX2ZvcmNlKQorCWlmIChvY2N1cGllZCAmJiBwY2llaHBfZm9yY2UpIHsKKwkJbXV0ZXhfbG9jaygmc2xvdC0+aG90cGx1Z19sb2NrKTsKIAkJcGNpZWhwX2VuYWJsZV9zbG90KHNsb3QpOworCQltdXRleF91bmxvY2soJnNsb3QtPmhvdHBsdWdfbG9jayk7CisJfQogCS8qIElmIGVtcHR5IHNsb3QncyBwb3dlciBzdGF0dXMgaXMgb24sIHR1cm4gcG93ZXIgb2ZmICovCiAJaWYgKCFvY2N1cGllZCAmJiBwb3dlcm9uICYmIFBPV0VSX0NUUkwoY3RybCkpCiAJCXBjaWVocF9wb3dlcl9vZmZfc2xvdChzbG90KTsKQEAgLTMyOCwxMCArMzMyLDEyIEBACiAKIAkvKiBDaGVjayBpZiBzbG90IGlzIG9jY3VwaWVkICovCiAJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmc3RhdHVzKTsKKwltdXRleF9sb2NrKCZzbG90LT5ob3RwbHVnX2xvY2spOwogCWlmIChzdGF0dXMpCiAJCXBjaWVocF9lbmFibGVfc2xvdChzbG90KTsKIAllbHNlCiAJCXBjaWVocF9kaXNhYmxlX3Nsb3Qoc2xvdCk7CisJbXV0ZXhfdW5sb2NrKCZzbG90LT5ob3RwbHVnX2xvY2spOwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIFBNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKaW5kZXggNTA2Mjg0OC4uYzc1ZTZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwpAQCAtMTUwLDYgKzE1MCwyNyBAQAogCXJldHVybiAxOwogfQogCit2b2lkIHBjaWVocF9oYW5kbGVfbGlua3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KQoreworCXUzMiBldmVudF90eXBlOworCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gcF9zbG90LT5jdHJsOworCisJLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisJY3RybF9kYmcoY3RybCwgIkRhdGEgTGluayBMYXllciBTdGF0ZSBjaGFuZ2VcbiIpOworCisJaWYgKHBjaWVocF9jaGVja19saW5rX2FjdGl2ZShjdHJsKSkgeworCQljdHJsX2luZm8oY3RybCwgInNsb3QoJXMpOiBMaW5rIFVwIGV2ZW50XG4iLAorCQkJICBzbG90X25hbWUocF9zbG90KSk7CisJCWV2ZW50X3R5cGUgPSBJTlRfTElOS19VUDsKKwl9IGVsc2UgeworCQljdHJsX2luZm8oY3RybCwgInNsb3QoJXMpOiBMaW5rIERvd24gZXZlbnRcbiIsCisJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJZXZlbnRfdHlwZSA9IElOVF9MSU5LX0RPV047CisJfQorCisJcXVldWVfaW50ZXJydXB0X2V2ZW50KHBfc2xvdCwgZXZlbnRfdHlwZSk7Cit9CisKIC8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgY29uc3RpdHV0ZSB0aGUgYnVsayBvZiB0aGUKICAgIGhvdHBsdWcgY29udHJvbGxlciBsb2dpYwogICovCkBAIC0yMTIsNyArMjMzLDggQEAKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgYWRkIGRldmljZSBhdCAlMDR4OiUwMng6MDBcbiIsCiAJCQkgcGNpX2RvbWFpbl9ucihwYXJlbnQpLCBwYXJlbnQtPm51bWJlcik7Ci0JCWdvdG8gZXJyX2V4aXQ7CisJCWlmIChyZXR2YWwgIT0gLUVFWElTVCkKKwkJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCiAJcGNpZWhwX2dyZWVuX2xlZF9vbihwX3Nsb3QpOwpAQCAtMjU1LDYgKzI3Nyw5IEBACiBzdHJ1Y3QgcG93ZXJfd29ya19pbmZvIHsKIAlzdHJ1Y3Qgc2xvdCAqcF9zbG90OwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXVuc2lnbmVkIGludCByZXE7CisjZGVmaW5lIERJU0FCTEVfUkVRIDAKKyNkZWZpbmUgRU5BQkxFX1JFUSAgMQogfTsKIAogLyoqCkBAIC0yNjksMzAgKzI5NCwzOCBAQAogCXN0cnVjdCBwb3dlcl93b3JrX2luZm8gKmluZm8gPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHBvd2VyX3dvcmtfaW5mbywgd29yayk7CiAJc3RydWN0IHNsb3QgKnBfc2xvdCA9IGluZm8tPnBfc2xvdDsKKwlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmcF9zbG90LT5sb2NrKTsKLQlzd2l0Y2ggKHBfc2xvdC0+c3RhdGUpIHsKLQljYXNlIFBPV0VST0ZGX1NUQVRFOgotCQltdXRleF91bmxvY2soJnBfc2xvdC0+bG9jayk7CisJc3dpdGNoIChpbmZvLT5yZXEpIHsKKwljYXNlIERJU0FCTEVfUkVROgogCQljdHJsX2RiZyhwX3Nsb3QtPmN0cmwsCiAJCQkgIkRpc2FibGluZyBkb21haW46YnVzOmRldmljZT0lMDR4OiUwMng6MDBcbiIsCiAJCQkgcGNpX2RvbWFpbl9ucihwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlKSwKIAkJCSBwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLT5udW1iZXIpOworCQltdXRleF9sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CiAJCXBjaWVocF9kaXNhYmxlX3Nsb3QocF9zbG90KTsKKwkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CiAJCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJPTl9TVEFURToKIAkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmxvY2spOwotCQlpZiAocGNpZWhwX2VuYWJsZV9zbG90KHBfc2xvdCkpCisJCWJyZWFrOworCWNhc2UgRU5BQkxFX1JFUToKKwkJY3RybF9kYmcocF9zbG90LT5jdHJsLAorCQkJICJFbmFibGluZyBkb21haW46YnVzOmRldmljZT0lMDR4OiUwMng6MDBcbiIsCisJCQkgcGNpX2RvbWFpbl9ucihwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlKSwKKwkJCSBwX3Nsb3QtPmN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLT5udW1iZXIpOworCQltdXRleF9sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CisJCXJldCA9IHBjaWVocF9lbmFibGVfc2xvdChwX3Nsb3QpOworCQltdXRleF91bmxvY2soJnBfc2xvdC0+aG90cGx1Z19sb2NrKTsKKwkJaWYgKHJldCkKIAkJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CisJCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKIAogCWtmcmVlKGluZm8pOwogfQpAQCAtMzE1LDkgKzM0OCwxMSBAQAogCXN3aXRjaCAocF9zbG90LT5zdGF0ZSkgewogCWNhc2UgQkxJTktJTkdPRkZfU1RBVEU6CiAJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9GRl9TVEFURTsKKwkJaW5mby0+cmVxID0gRElTQUJMRV9SRVE7CiAJCWJyZWFrOwogCWNhc2UgQkxJTktJTkdPTl9TVEFURToKIAkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST05fU1RBVEU7CisJCWluZm8tPnJlcSA9IEVOQUJMRV9SRVE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWtmcmVlKGluZm8pOwpAQCAtMzY0LDExICszOTksMTAgQEAKIAkJICovCiAJCWN0cmxfaW5mbyhjdHJsLCAiQnV0dG9uIGNhbmNlbCBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZwX3Nsb3QtPndvcmspOwotCQlpZiAocF9zbG90LT5zdGF0ZSA9PSBCTElOS0lOR09GRl9TVEFURSkgeworCQlpZiAocF9zbG90LT5zdGF0ZSA9PSBCTElOS0lOR09GRl9TVEFURSkKIAkJCXBjaWVocF9ncmVlbl9sZWRfb24ocF9zbG90KTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJcGNpZWhwX2dyZWVuX2xlZF9vZmYocF9zbG90KTsKLQkJfQogCQlwY2llaHBfc2V0X2F0dGVudGlvbl9zdGF0dXMocF9zbG90LCAwKTsKIAkJY3RybF9pbmZvKGN0cmwsICJQQ0kgc2xvdCAjJXMgLSBhY3Rpb24gY2FuY2VsZWQgIgogCQkJICAiZHVlIHRvIGJ1dHRvbiBwcmVzc1xuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwpAQCAtNDA3LDE0ICs0NDEsODEgQEAKIAlJTklUX1dPUksoJmluZm8tPndvcmssIHBjaWVocF9wb3dlcl90aHJlYWQpOwogCiAJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwotCWlmICghZ2V0c3RhdHVzKQorCWlmICghZ2V0c3RhdHVzKSB7CiAJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9GRl9TVEFURTsKLQllbHNlCisJCWluZm8tPnJlcSA9IERJU0FCTEVfUkVROworCX0gZWxzZSB7CiAJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9OX1NUQVRFOworCQlpbmZvLT5yZXEgPSBFTkFCTEVfUkVROworCX0KIAogCXF1ZXVlX3dvcmsocF9zbG90LT53cSwgJmluZm8tPndvcmspOwogfQogCisvKgorICogTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNsb3QtPmxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfbGlua19ldmVudChzdHJ1Y3Qgc2xvdCAqcF9zbG90LCB1MzIgZXZlbnQpCit7CisJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7CisJc3RydWN0IHBvd2VyX3dvcmtfaW5mbyAqaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykgeworCQljdHJsX2VycihwX3Nsb3QtPmN0cmwsICIlczogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaW5mby0+cF9zbG90ID0gcF9zbG90OworCWluZm8tPnJlcSA9IGV2ZW50ID09IElOVF9MSU5LX1VQID8gRU5BQkxFX1JFUSA6IERJU0FCTEVfUkVROworCUlOSVRfV09SSygmaW5mby0+d29yaywgcGNpZWhwX3Bvd2VyX3RocmVhZCk7CisKKwlzd2l0Y2ggKHBfc2xvdC0+c3RhdGUpIHsKKwljYXNlIEJMSU5LSU5HT05fU1RBVEU6CisJY2FzZSBCTElOS0lOR09GRl9TVEFURToKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcF9zbG90LT53b3JrKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBTVEFUSUNfU1RBVEU6CisJCXBfc2xvdC0+c3RhdGUgPSBldmVudCA9PSBJTlRfTElOS19VUCA/CisJCSAgICBQT1dFUk9OX1NUQVRFIDogUE9XRVJPRkZfU1RBVEU7CisJCXF1ZXVlX3dvcmsocF9zbG90LT53cSwgJmluZm8tPndvcmspOworCQlicmVhazsKKwljYXNlIFBPV0VST05fU1RBVEU6CisJCWlmIChldmVudCA9PSBJTlRfTElOS19VUCkgeworCQkJY3RybF9pbmZvKGN0cmwsCisJCQkJICAiTGluayBVcCBldmVudCBpZ25vcmVkIG9uIHNsb3QoJXMpOiBhbHJlYWR5IHBvd2VyaW5nIG9uXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJa2ZyZWUoaW5mbyk7CisJCX0gZWxzZSB7CisJCQljdHJsX2luZm8oY3RybCwKKwkJCQkgICJMaW5rIERvd24gZXZlbnQgcXVldWVkIG9uIHNsb3QoJXMpOiBjdXJyZW50bHkgZ2V0dGluZyBwb3dlcmVkIG9uXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST0ZGX1NUQVRFOworCQkJcXVldWVfd29yayhwX3Nsb3QtPndxLCAmaW5mby0+d29yayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQT1dFUk9GRl9TVEFURToKKwkJaWYgKGV2ZW50ID09IElOVF9MSU5LX1VQKSB7CisJCQljdHJsX2luZm8oY3RybCwKKwkJCQkgICJMaW5rIFVwIGV2ZW50IHF1ZXVlZCBvbiBzbG90KCVzKTogY3VycmVudGx5IGdldHRpbmcgcG93ZXJlZCBvZmZcbiIsCisJCQkJICBzbG90X25hbWUocF9zbG90KSk7CisJCQlwX3Nsb3QtPnN0YXRlID0gUE9XRVJPTl9TVEFURTsKKwkJCXF1ZXVlX3dvcmsocF9zbG90LT53cSwgJmluZm8tPndvcmspOworCQl9IGVsc2UgeworCQkJY3RybF9pbmZvKGN0cmwsCisJCQkJICAiTGluayBEb3duIGV2ZW50IGlnbm9yZWQgb24gc2xvdCglcyk6IGFscmVhZHkgcG93ZXJpbmcgb2ZmXG4iLAorCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOworCQkJa2ZyZWUoaW5mbyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY3RybF9lcnIoY3RybCwgIk5vdCBhIHZhbGlkIHN0YXRlIG9uIHNsb3QoJXMpXG4iLAorCQkJIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJa2ZyZWUoaW5mbyk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHZvaWQgaW50ZXJydXB0X2V2ZW50X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBldmVudF9pbmZvICppbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBldmVudF9pbmZvLCB3b3JrKTsKQEAgLTQzMywxMiArNTM0LDIzIEBACiAJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCWJyZWFrOwogCWNhc2UgSU5UX1BSRVNFTkNFX09OOgotCWNhc2UgSU5UX1BSRVNFTkNFX09GRjoKIAkJaWYgKCFIUF9TVVBSX1JNKGN0cmwpKQogCQkJYnJlYWs7CisJCWN0cmxfZGJnKGN0cmwsICJTdXJwcmlzZSBJbnNlcnRpb25cbiIpOworCQloYW5kbGVfc3VycHJpc2VfZXZlbnQocF9zbG90KTsKKwkJYnJlYWs7CisJY2FzZSBJTlRfUFJFU0VOQ0VfT0ZGOgorCQkvKgorCQkgKiBSZWdhcmRsZXNzIG9mIHN1cnByaXNlIGNhcGFiaWxpdHksIHdlIG5lZWQgdG8KKwkJICogZGVmaW5pdGVseSByZW1vdmUgYSBjYXJkIHRoYXQgaGFzIGJlZW4gcHVsbGVkIG91dCEKKwkJICovCiAJCWN0cmxfZGJnKGN0cmwsICJTdXJwcmlzZSBSZW1vdmFsXG4iKTsKIAkJaGFuZGxlX3N1cnByaXNlX2V2ZW50KHBfc2xvdCk7CiAJCWJyZWFrOworCWNhc2UgSU5UX0xJTktfVVA6CisJY2FzZSBJTlRfTElOS19ET1dOOgorCQloYW5kbGVfbGlua19ldmVudChwX3Nsb3QsIGluZm8tPmV2ZW50X3R5cGUpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC00NDcsNiArNTU5LDkgQEAKIAlrZnJlZShpbmZvKTsKIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzbG90LT5ob3RwbHVnX2xvY2sgaGVsZAorICovCiBpbnQgcGNpZWhwX2VuYWJsZV9zbG90KHN0cnVjdCBzbG90ICpwX3Nsb3QpCiB7CiAJdTggZ2V0c3RhdHVzID0gMDsKQEAgLTQ3OSwxMyArNTk0LDE1IEBACiAJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAogCXJjID0gYm9hcmRfYWRkZWQocF9zbG90KTsKLQlpZiAocmMpIHsKKwlpZiAocmMpCiAJCXBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7Ci0JfQorCiAJcmV0dXJuIHJjOwogfQogCi0KKy8qCisgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggc2xvdC0+aG90cGx1Z19sb2NrIGhlbGQKKyAqLwogaW50IHBjaWVocF9kaXNhYmxlX3Nsb3Qoc3RydWN0IHNsb3QgKnBfc2xvdCkKIHsKIAl1OCBnZXRzdGF0dXMgPSAwOwpAQCAtNDk0LDI0ICs2MTEsNiBAQAogCWlmICghcF9zbG90LT5jdHJsKQogCQlyZXR1cm4gMTsKIAotCWlmICghSFBfU1VQUl9STShwX3Nsb3QtPmN0cmwpKSB7Ci0JCXBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKLQkJaWYgKCFnZXRzdGF0dXMpIHsKLQkJCWN0cmxfaW5mbyhjdHJsLCAiTm8gYWRhcHRlciBvbiBzbG90KCVzKVxuIiwKLQkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaWYgKE1STF9TRU5TKHBfc2xvdC0+Y3RybCkpIHsKLQkJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKLQkJaWYgKGdldHN0YXR1cykgewotCQkJY3RybF9pbmZvKGN0cmwsICJMYXRjaCBvcGVuIG9uIHNsb3QoJXMpXG4iLAotCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0KIAlpZiAoUE9XRVJfQ1RSTChwX3Nsb3QtPmN0cmwpKSB7CiAJCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJCWlmICghZ2V0c3RhdHVzKSB7CkBAIC01MzYsNyArNjM1LDkgQEAKIAljYXNlIFNUQVRJQ19TVEFURToKIAkJcF9zbG90LT5zdGF0ZSA9IFBPV0VST05fU1RBVEU7CiAJCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcF9zbG90LT5ob3RwbHVnX2xvY2spOwogCQlyZXR2YWwgPSBwY2llaHBfZW5hYmxlX3Nsb3QocF9zbG90KTsKKwkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmhvdHBsdWdfbG9jayk7CiAJCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCAxNGFjZmNjLi5kN2QwNThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogfQogCi1zdGF0aWMgYm9vbCBjaGVja19saW5rX2FjdGl2ZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK2Jvb2wgcGNpZWhwX2NoZWNrX2xpbmtfYWN0aXZlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY3RybF9kZXYoY3RybCk7CiAJdTE2IGxua19zdGF0dXM7CkBAIC0yMjUsMTIgKzIyNSwxMiBAQAogewogCWludCB0aW1lb3V0ID0gMTAwMDsKIAotCWlmIChjaGVja19saW5rX2FjdGl2ZShjdHJsKSA9PSBhY3RpdmUpCisJaWYgKHBjaWVocF9jaGVja19saW5rX2FjdGl2ZShjdHJsKSA9PSBhY3RpdmUpCiAJCXJldHVybjsKIAl3aGlsZSAodGltZW91dCA+IDApIHsKIAkJbXNsZWVwKDEwKTsKIAkJdGltZW91dCAtPSAxMDsKLQkJaWYgKGNoZWNrX2xpbmtfYWN0aXZlKGN0cmwpID09IGFjdGl2ZSkKKwkJaWYgKHBjaWVocF9jaGVja19saW5rX2FjdGl2ZShjdHJsKSA9PSBhY3RpdmUpCiAJCQlyZXR1cm47CiAJfQogCWN0cmxfZGJnKGN0cmwsICJEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgbm90ICVzIGluIDEwMDAgbXNlY1xuIiwKQEAgLTI0MiwxMSArMjQyLDYgQEAKIAlfX3BjaWVfd2FpdF9saW5rX2FjdGl2ZShjdHJsLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpZV93YWl0X2xpbmtfbm90X2FjdGl2ZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKLXsKLQlfX3BjaWVfd2FpdF9saW5rX2FjdGl2ZShjdHJsLCBmYWxzZSk7Ci19Ci0KIHN0YXRpYyBib29sIHBjaV9idXNfY2hlY2tfZGV2KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbikKIHsKIAl1MzIgbDsKQEAgLTMzMiwxMSArMzI3LDYgQEAKIAlyZXR1cm4gX19wY2llaHBfbGlua19zZXQoY3RybCwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyBpbnQgcGNpZWhwX2xpbmtfZGlzYWJsZShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKLXsKLQlyZXR1cm4gX19wY2llaHBfbGlua19zZXQoY3RybCwgZmFsc2UpOwotfQotCiB2b2lkIHBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CkBAIC01MDgsMTQgKzQ5OCw2IEBACiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCi0JLyogRGlzYWJsZSB0aGUgbGluayBhdCBmaXJzdCAqLwotCXBjaWVocF9saW5rX2Rpc2FibGUoY3RybCk7Ci0JLyogd2FpdCB0aGUgbGluayBpcyBkb3duICovCi0JaWYgKGN0cmwtPmxpbmtfYWN0aXZlX3JlcG9ydGluZykKLQkJcGNpZV93YWl0X2xpbmtfbm90X2FjdGl2ZShjdHJsKTsKLQllbHNlCi0JCW1zbGVlcCgxMDAwKTsKLQogCXBjaWVfd3JpdGVfY21kKGN0cmwsIFBDSV9FWFBfU0xUQ1RMX1BXUl9PRkYsIFBDSV9FWFBfU0xUQ1RMX1BDQyk7CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fZnVuY19fLAogCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsCkBAIC01NDAsNyArNTIyLDcgQEAKIAogCQlkZXRlY3RlZCAmPSAoUENJX0VYUF9TTFRTVEFfQUJQIHwgUENJX0VYUF9TTFRTVEFfUEZEIHwKIAkJCSAgICAgUENJX0VYUF9TTFRTVEFfTVJMU0MgfCBQQ0lfRVhQX1NMVFNUQV9QREMgfAotCQkJICAgICBQQ0lfRVhQX1NMVFNUQV9DQyk7CisJCQkgICAgIFBDSV9FWFBfU0xUU1RBX0NDIHwgUENJX0VYUF9TTFRTVEFfRExMU0MpOwogCQlkZXRlY3RlZCAmPSB+aW50cl9sb2M7CiAJCWludHJfbG9jIHw9IGRldGVjdGVkOwogCQlpZiAoIWludHJfbG9jKQpAQCAtNTc5LDYgKzU2MSwxMCBAQAogCQljdHJsLT5wb3dlcl9mYXVsdF9kZXRlY3RlZCA9IDE7CiAJCXBjaWVocF9oYW5kbGVfcG93ZXJfZmF1bHQoc2xvdCk7CiAJfQorCisJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfRExMU0MpCisJCXBjaWVocF9oYW5kbGVfbGlua3N0YXRlX2NoYW5nZShzbG90KTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNTk2LDkgKzU4MiwxNyBAQAogCSAqIHdoZW4gaXQgaXMgY2xlYXJlZCBpbiB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgYW5kCiAJICogbmV4dCBwb3dlciBmYXVsdCBkZXRlY3RlZCBpbnRlcnJ1cHQgd2FzIG5vdGlmaWVkIGFnYWluLgogCSAqLwotCWNtZCA9IFBDSV9FWFBfU0xUQ1RMX1BEQ0U7CisKKwkvKgorCSAqIEFsd2F5cyBlbmFibGUgbGluayBldmVudHM6IHRodXMgbGluay11cCBhbmQgbGluay1kb3duIHNoYWxsCisJICogYWx3YXlzIGJlIHRyZWF0ZWQgYXMgaG90cGx1ZyBhbmQgdW5wbHVnIHJlc3BlY3RpdmVseS4gRW5hYmxlCisJICogcHJlc2VuY2UgZGV0ZWN0IG9ubHkgaWYgQXR0ZW50aW9uIEJ1dHRvbiBpcyBub3QgcHJlc2VudC4KKwkgKi8KKwljbWQgPSBQQ0lfRVhQX1NMVENUTF9ETExTQ0U7CiAJaWYgKEFUVE5fQlVUVE4oY3RybCkpCiAJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9BQlBFOworCWVsc2UKKwkJY21kIHw9IFBDSV9FWFBfU0xUQ1RMX1BEQ0U7CiAJaWYgKE1STF9TRU5TKGN0cmwpKQogCQljbWQgfD0gUENJX0VYUF9TTFRDVExfTVJMU0NFOwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkKQEAgLTYwNiw3ICs2MDAsOCBAQAogCiAJbWFzayA9IChQQ0lfRVhQX1NMVENUTF9QRENFIHwgUENJX0VYUF9TTFRDVExfQUJQRSB8CiAJCVBDSV9FWFBfU0xUQ1RMX01STFNDRSB8IFBDSV9FWFBfU0xUQ1RMX1BGREUgfAotCQlQQ0lfRVhQX1NMVENUTF9IUElFIHwgUENJX0VYUF9TTFRDVExfQ0NJRSk7CisJCVBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFIHwKKwkJUENJX0VYUF9TTFRDVExfRExMU0NFKTsKIAogCXBjaWVfd3JpdGVfY21kKGN0cmwsIGNtZCwgbWFzayk7CiB9CkBAIC02MjQsMzMgKzYxOSwzOCBAQAogCiAvKgogICogcGNpZWhwIGhhcyBhIDE6MSBidXM6c2xvdCByZWxhdGlvbnNoaXAgc28gd2UgdWx0aW1hdGVseSB3YW50IGEgc2Vjb25kYXJ5Ci0gKiBidXMgcmVzZXQgb2YgdGhlIGJyaWRnZSwgYnV0IGlmIHRoZSBzbG90IHN1cHBvcnRzIHN1cnByaXNlIHJlbW92YWwgd2UgbmVlZAotICogdG8gZGlzYWJsZSBwcmVzZW5jZSBkZXRlY3Rpb24gYXJvdW5kIHRoZSBidXMgcmVzZXQgYW5kIGNsZWFyIGFueSBzcHVyaW91cworICogYnVzIHJlc2V0IG9mIHRoZSBicmlkZ2UsIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKKyAqIG5vdCBzZWVuIGFzIGEgaG90LXVucGx1ZywgZm9sbG93ZWQgYnkgdGhlIGhvdC1wbHVnIG9mIHRoZSBkZXZpY2UuIFRodXMsCisgKiBkaXNhYmxlIGxpbmsgc3RhdGUgbm90aWZpY2F0aW9uIGFuZCBwcmVzZW5jZSBkZXRlY3Rpb24gY2hhbmdlIG5vdGlmaWNhdGlvbgorICogbW9tZW50YXJpbHksIGlmIHdlIHNlZSB0aGF0IHRoZXkgY291bGQgaW50ZXJmZXJlLiBBbHNvLCBjbGVhciBhbnkgc3B1cmlvdXMKICAqIGV2ZW50cyBhZnRlci4KICAqLwogaW50IHBjaWVocF9yZXNldF9zbG90KHN0cnVjdCBzbG90ICpzbG90LCBpbnQgcHJvYmUpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY3RybF9kZXYoY3RybCk7CisJdTE2IHN0YXRfbWFzayA9IDAsIGN0cmxfbWFzayA9IDA7CiAKIAlpZiAocHJvYmUpCiAJCXJldHVybiAwOwogCi0JaWYgKEhQX1NVUFJfUk0oY3RybCkpIHsKLQkJcGNpZV93cml0ZV9jbWQoY3RybCwgMCwgUENJX0VYUF9TTFRDVExfUERDRSk7Ci0JCWlmIChwY2llaHBfcG9sbF9tb2RlKQotCQkJZGVsX3RpbWVyX3N5bmMoJmN0cmwtPnBvbGxfdGltZXIpOworCWlmICghQVRUTl9CVVRUTihjdHJsKSkgeworCQljdHJsX21hc2sgfD0gUENJX0VYUF9TTFRDVExfUERDRTsKKwkJc3RhdF9tYXNrIHw9IFBDSV9FWFBfU0xUU1RBX1BEQzsKIAl9CisJY3RybF9tYXNrIHw9IFBDSV9FWFBfU0xUQ1RMX0RMTFNDRTsKKwlzdGF0X21hc2sgfD0gUENJX0VYUF9TTFRTVEFfRExMU0M7CisKKwlwY2llX3dyaXRlX2NtZChjdHJsLCAwLCBjdHJsX21hc2spOworCWlmIChwY2llaHBfcG9sbF9tb2RlKQorCQlkZWxfdGltZXJfc3luYygmY3RybC0+cG9sbF90aW1lcik7CiAKIAlwY2lfcmVzZXRfYnJpZGdlX3NlY29uZGFyeV9idXMoY3RybC0+cGNpZS0+cG9ydCk7CiAKLQlpZiAoSFBfU1VQUl9STShjdHJsKSkgewotCQlwY2llX2NhcGFiaWxpdHlfd3JpdGVfd29yZChwZGV2LCBQQ0lfRVhQX1NMVFNUQSwKLQkJCQkJICAgUENJX0VYUF9TTFRTVEFfUERDKTsKLQkJcGNpZV93cml0ZV9jbWQoY3RybCwgUENJX0VYUF9TTFRDVExfUERDRSwgUENJX0VYUF9TTFRDVExfUERDRSk7Ci0JCWlmIChwY2llaHBfcG9sbF9tb2RlKQotCQkJaW50X3BvbGxfdGltZW91dChjdHJsLT5wb2xsX3RpbWVyLmRhdGEpOwotCX0KKwlwY2llX2NhcGFiaWxpdHlfd3JpdGVfd29yZChwZGV2LCBQQ0lfRVhQX1NMVFNUQSwgc3RhdF9tYXNrKTsKKwlwY2llX3dyaXRlX2NtZChjdHJsLCBjdHJsX21hc2ssIGN0cmxfbWFzayk7CisJaWYgKHBjaWVocF9wb2xsX21vZGUpCisJCWludF9wb2xsX3RpbWVvdXQoY3RybC0+cG9sbF90aW1lci5kYXRhKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjg3LDYgKzY4Nyw3IEBACiAKIAlzbG90LT5jdHJsID0gY3RybDsKIAltdXRleF9pbml0KCZzbG90LT5sb2NrKTsKKwltdXRleF9pbml0KCZzbG90LT5ob3RwbHVnX2xvY2spOwogCUlOSVRfREVMQVlFRF9XT1JLKCZzbG90LT53b3JrLCBwY2llaHBfcXVldWVfcHVzaGJ1dHRvbl93b3JrKTsKIAljdHJsLT5zbG90ID0gc2xvdDsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKaW5kZXggYjA3ZDdjYy4uMWI1MzMwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAkJCSAiYXQgJTA0eDolMDJ4OjAwLCBjYW5ub3QgaG90LWFkZFxuIiwgcGNpX25hbWUoZGV2KSwKIAkJCSBwY2lfZG9tYWluX25yKHBhcmVudCksIHBhcmVudC0+bnVtYmVyKTsKIAkJcGNpX2Rldl9wdXQoZGV2KTsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gLUVFWElTVDsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3YuYyBiL2RyaXZlcnMvcGNpL2lvdi5jCmluZGV4IDlkY2U3YzUuLmRlN2E3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvdi5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdi5jCkBAIC0xNzAsOTcgKzE3MCw2IEBACiAJcGNpX2Rldl9wdXQoZGV2KTsKIH0KIAotc3RhdGljIGludCBzcmlvdl9taWdyYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1MTYgc3RhdHVzOwotCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGRldi0+c3Jpb3Y7Ci0KLQlpZiAoIWlvdi0+bnVtX1ZGcykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIShpb3YtPmNhcCAmIFBDSV9TUklPVl9DQVBfVkZNKSkKLQkJcmV0dXJuIDA7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGlvdi0+cG9zICsgUENJX1NSSU9WX1NUQVRVUywgJnN0YXR1cyk7Ci0JaWYgKCEoc3RhdHVzICYgUENJX1NSSU9WX1NUQVRVU19WRk0pKQotCQlyZXR1cm4gMDsKLQotCXNjaGVkdWxlX3dvcmsoJmlvdi0+bXRhc2spOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyaW92X21pZ3JhdGlvbl90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgaTsKLQl1OCBzdGF0ZTsKLQl1MTYgc3RhdHVzOwotCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGNpX3NyaW92LCBtdGFzayk7Ci0KLQlmb3IgKGkgPSBpb3YtPmluaXRpYWxfVkZzOyBpIDwgaW92LT5udW1fVkZzOyBpKyspIHsKLQkJc3RhdGUgPSByZWFkYihpb3YtPm1zdGF0ZSArIGkpOwotCQlpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9NSSkgewotCQkJd3JpdGViKFBDSV9TUklPVl9WRk1fQVYsIGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlzdGF0ZSA9IHJlYWRiKGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9BVikKLQkJCQl2aXJ0Zm5fYWRkKGlvdi0+c2VsZiwgaSwgMSk7Ci0JCX0gZWxzZSBpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9NTykgewotCQkJdmlydGZuX3JlbW92ZShpb3YtPnNlbGYsIGksIDEpOwotCQkJd3JpdGViKFBDSV9TUklPVl9WRk1fVUEsIGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlzdGF0ZSA9IHJlYWRiKGlvdi0+bXN0YXRlICsgaSk7Ci0JCQlpZiAoc3RhdGUgPT0gUENJX1NSSU9WX1ZGTV9BVikKLQkJCQl2aXJ0Zm5fYWRkKGlvdi0+c2VsZiwgaSwgMCk7Ci0JCX0KLQl9Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChpb3YtPnNlbGYsIGlvdi0+cG9zICsgUENJX1NSSU9WX1NUQVRVUywgJnN0YXR1cyk7Ci0Jc3RhdHVzICY9IH5QQ0lfU1JJT1ZfU1RBVFVTX1ZGTTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaW92LT5zZWxmLCBpb3YtPnBvcyArIFBDSV9TUklPVl9TVEFUVVMsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3Jpb3ZfZW5hYmxlX21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnJfdmlydGZuKQotewotCWludCBiaXI7Ci0JdTMyIHRhYmxlOwotCXJlc291cmNlX3NpemVfdCBwYTsKLQlzdHJ1Y3QgcGNpX3NyaW92ICppb3YgPSBkZXYtPnNyaW92OwotCi0JaWYgKG5yX3ZpcnRmbiA8PSBpb3YtPmluaXRpYWxfVkZzKQotCQlyZXR1cm4gMDsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGlvdi0+cG9zICsgUENJX1NSSU9WX1ZGTSwgJnRhYmxlKTsKLQliaXIgPSBQQ0lfU1JJT1ZfVkZNX0JJUih0YWJsZSk7Ci0JaWYgKGJpciA+IFBDSV9TVERfUkVTT1VSQ0VfRU5EKQotCQlyZXR1cm4gLUVJTzsKLQotCXRhYmxlID0gUENJX1NSSU9WX1ZGTV9PRkZTRVQodGFibGUpOwotCWlmICh0YWJsZSArIG5yX3ZpcnRmbiA+IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiaXIpKQotCQlyZXR1cm4gLUVJTzsKLQotCXBhID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgYmlyKSArIHRhYmxlOwotCWlvdi0+bXN0YXRlID0gaW9yZW1hcChwYSwgbnJfdmlydGZuKTsKLQlpZiAoIWlvdi0+bXN0YXRlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCUlOSVRfV09SSygmaW92LT5tdGFzaywgc3Jpb3ZfbWlncmF0aW9uX3Rhc2spOwotCi0JaW92LT5jdHJsIHw9IFBDSV9TUklPVl9DVFJMX1ZGTSB8IFBDSV9TUklPVl9DVFJMX0lOVFI7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgaW92LT5wb3MgKyBQQ0lfU1JJT1ZfQ1RSTCwgaW92LT5jdHJsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzcmlvdl9kaXNhYmxlX21pZ3JhdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGRldi0+c3Jpb3Y7Ci0KLQlpb3YtPmN0cmwgJj0gfihQQ0lfU1JJT1ZfQ1RSTF9WRk0gfCBQQ0lfU1JJT1ZfQ1RSTF9JTlRSKTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBpb3YtPnBvcyArIFBDSV9TUklPVl9DVFJMLCBpb3YtPmN0cmwpOwotCi0JY2FuY2VsX3dvcmtfc3luYygmaW92LT5tdGFzayk7Ci0JaW91bm1hcChpb3YtPm1zdGF0ZSk7Ci19Ci0KIHN0YXRpYyBpbnQgc3Jpb3ZfZW5hYmxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBucl92aXJ0Zm4pCiB7CiAJaW50IHJjOwpAQCAtMzUxLDEyICsyNjAsNiBAQAogCQkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKGlvdi0+Y2FwICYgUENJX1NSSU9WX0NBUF9WRk0pIHsKLQkJcmMgPSBzcmlvdl9lbmFibGVfbWlncmF0aW9uKGRldiwgbnJfdmlydGZuKTsKLQkJaWYgKHJjKQotCQkJZ290byBmYWlsZWQ7Ci0JfQotCiAJa29iamVjdF91ZXZlbnQoJmRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKIAlpb3YtPm51bV9WRnMgPSBucl92aXJ0Zm47CiAKQEAgLTM4Nyw5ICsyOTAsNiBAQAogCWlmICghaW92LT5udW1fVkZzKQogCQlyZXR1cm47CiAKLQlpZiAoaW92LT5jYXAgJiBQQ0lfU1JJT1ZfQ0FQX1ZGTSkKLQkJc3Jpb3ZfZGlzYWJsZV9taWdyYXRpb24oZGV2KTsKLQogCWZvciAoaSA9IDA7IGkgPCBpb3YtPm51bV9WRnM7IGkrKykKIAkJdmlydGZuX3JlbW92ZShkZXYsIGksIDApOwogCkBAIC02ODgsMjUgKzU4OCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfZGlzYWJsZV9zcmlvdik7CiAKIC8qKgotICogcGNpX3NyaW92X21pZ3JhdGlvbiAtIG5vdGlmeSBTUi1JT1YgY29yZSBvZiBWaXJ0dWFsIEZ1bmN0aW9uIE1pZ3JhdGlvbgotICogQGRldjogdGhlIFBDSSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zIElSUV9IQU5ETEVEIGlmIHRoZSBJUlEgaXMgaGFuZGxlZCwgb3IgSVJRX05PTkUgaWYgbm90LgotICoKLSAqIFBoeXNpY2FsIEZ1bmN0aW9uIGRyaXZlciBpcyByZXNwb25zaWJsZSB0byByZWdpc3RlciBJUlEgaGFuZGxlciB1c2luZwotICogVkYgTWlncmF0aW9uIEludGVycnVwdCBNZXNzYWdlIE51bWJlciwgYW5kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZQotICogaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSB0aGUgaGFyZHdhcmUuCi0gKi8KLWlycXJldHVybl90IHBjaV9zcmlvdl9taWdyYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpZiAoIWRldi0+aXNfcGh5c2ZuKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQlyZXR1cm4gc3Jpb3ZfbWlncmF0aW9uKGRldikgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocGNpX3NyaW92X21pZ3JhdGlvbik7Ci0KLS8qKgogICogcGNpX251bV92ZiAtIHJldHVybiBudW1iZXIgb2YgVkZzIGFzc29jaWF0ZWQgd2l0aCBhIFBGIGRldmljZV9yZWxlYXNlX2RyaXZlcgogICogQGRldjogdGhlIFBDSSBkZXZpY2UKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IDI3NmVmOWMuLjRlMGFjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC0zNTEsMjggKzM1MSwxNyBAQAogCQkJCQkJCShTX0lXVVNSfFNfSVdHUlApLAogCQkJCQkJCU5VTEwsIGRldl9yZXNjYW5fc3RvcmUpOwogCi1zdGF0aWMgdm9pZCByZW1vdmVfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2KQotewotCXBjaV9zdG9wX2FuZF9yZW1vdmVfYnVzX2RldmljZV9sb2NrZWQodG9fcGNpX2RldihkZXYpKTsKLX0KLQogc3RhdGljIHNzaXplX3QKLXJlbW92ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkdW1teSwKK3JlbW92ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoa3N0cnRvdWwoYnVmLCAwLCAmdmFsKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogQW4gYXR0cmlidXRlIGNhbm5vdCBiZSB1bnJlZ2lzdGVyZWQgYnkgb25lIG9mIGl0cyBvd24gbWV0aG9kcywKLQkgKiBzbyB3ZSBoYXZlIHRvIHVzZSB0aGlzIHJvdW5kYWJvdXQgYXBwcm9hY2guCi0JICovCi0JaWYgKHZhbCkKLQkJcmV0ID0gZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKGRldiwgcmVtb3ZlX2NhbGxiYWNrKTsKLQlpZiAocmV0KQotCQljb3VudCA9IHJldDsKKwlpZiAodmFsICYmIGRldmljZV9yZW1vdmVfZmlsZV9zZWxmKGRldiwgYXR0cikpCisJCXBjaV9zdG9wX2FuZF9yZW1vdmVfYnVzX2RldmljZV9sb2NrZWQodG9fcGNpX2RldihkZXYpKTsKIAlyZXR1cm4gY291bnQ7CiB9CiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X3JlbW92ZV9hdHRyID0gX19BVFRSKHJlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggZmRiYzI5NC4uNzMyNWQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTEwOCwxMiArMTA4LDEyIEBACiAgKi8KIHVuc2lnbmVkIGNoYXIgcGNpX2J1c19tYXhfYnVzbnIoc3RydWN0IHBjaV9idXMqIGJ1cykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9idXMgKnRtcDsKIAl1bnNpZ25lZCBjaGFyIG1heCwgbjsKIAogCW1heCA9IGJ1cy0+YnVzbl9yZXMuZW5kOwotCWxpc3RfZm9yX2VhY2godG1wLCAmYnVzLT5jaGlsZHJlbikgewotCQluID0gcGNpX2J1c19tYXhfYnVzbnIocGNpX2J1c19iKHRtcCkpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQluID0gcGNpX2J1c19tYXhfYnVzbnIodG1wKTsKIAkJaWYobiA+IG1heCkKIAkJCW1heCA9IG47CiAJfQpAQCAtNDAxLDMzICs0MDEsNDAgQEAKICAqIEByZXM6IGNoaWxkIHJlc291cmNlIHJlY29yZCBmb3Igd2hpY2ggcGFyZW50IGlzIHNvdWdodAogICoKICAqICBGb3IgZ2l2ZW4gcmVzb3VyY2UgcmVnaW9uIG9mIGdpdmVuIGRldmljZSwgcmV0dXJuIHRoZSByZXNvdXJjZQotICogIHJlZ2lvbiBvZiBwYXJlbnQgYnVzIHRoZSBnaXZlbiByZWdpb24gaXMgY29udGFpbmVkIGluIG9yIHdoZXJlCi0gKiAgaXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBmcm9tLgorICogIHJlZ2lvbiBvZiBwYXJlbnQgYnVzIHRoZSBnaXZlbiByZWdpb24gaXMgY29udGFpbmVkIGluLgogICovCiBzdHJ1Y3QgcmVzb3VyY2UgKgogcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCWNvbnN0IHN0cnVjdCBwY2lfYnVzICpidXMgPSBkZXYtPmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJaW50IGk7Ci0Jc3RydWN0IHJlc291cmNlICpiZXN0ID0gTlVMTCwgKnI7CiAKIAlwY2lfYnVzX2Zvcl9lYWNoX3Jlc291cmNlKGJ1cywgciwgaSkgewogCQlpZiAoIXIpCiAJCQljb250aW51ZTsKLQkJaWYgKHJlcy0+c3RhcnQgJiYgIShyZXMtPnN0YXJ0ID49IHItPnN0YXJ0ICYmIHJlcy0+ZW5kIDw9IHItPmVuZCkpCi0JCQljb250aW51ZTsJLyogTm90IGNvbnRhaW5lZCAqLwotCQlpZiAoKHJlcy0+ZmxhZ3MgXiByLT5mbGFncykgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkKLQkJCWNvbnRpbnVlOwkvKiBXcm9uZyB0eXBlICovCi0JCWlmICghKChyZXMtPmZsYWdzIF4gci0+ZmxhZ3MpICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkpCi0JCQlyZXR1cm4gcjsJLyogRXhhY3QgbWF0Y2ggKi8KLQkJLyogV2UgY2FuJ3QgaW5zZXJ0IGEgbm9uLXByZWZldGNoIHJlc291cmNlIGluc2lkZSBhIHByZWZldGNoYWJsZSBwYXJlbnQgLi4gKi8KLQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCWNvbnRpbnVlOwotCQkvKiAuLiBidXQgd2UgY2FuIHB1dCBhIHByZWZldGNoYWJsZSByZXNvdXJjZSBpbnNpZGUgYSBub24tcHJlZmV0Y2hhYmxlIG9uZSAqLwotCQlpZiAoIWJlc3QpCi0JCQliZXN0ID0gcjsKKwkJaWYgKHJlcy0+c3RhcnQgJiYgcmVzb3VyY2VfY29udGFpbnMociwgcmVzKSkgeworCisJCQkvKgorCQkJICogSWYgdGhlIHdpbmRvdyBpcyBwcmVmZXRjaGFibGUgYnV0IHRoZSBCQVIgaXMKKwkJCSAqIG5vdCwgdGhlIGFsbG9jYXRvciBtYWRlIGEgbWlzdGFrZS4KKwkJCSAqLworCQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCAmJgorCQkJICAgICEocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpKQorCQkJCXJldHVybiBOVUxMOworCisJCQkvKgorCQkJICogSWYgd2UncmUgYmVsb3cgYSB0cmFuc3BhcmVudCBicmlkZ2UsIHRoZXJlIG1heQorCQkJICogYmUgYm90aCBhIHBvc2l0aXZlbHktZGVjb2RlZCBhcGVydHVyZSBhbmQgYQorCQkJICogc3VidHJhY3RpdmVseS1kZWNvZGVkIHJlZ2lvbiB0aGF0IGNvbnRhaW4gdGhlIEJBUi4KKwkJCSAqIFdlIHdhbnQgdGhlIHBvc2l0aXZlbHktZGVjb2RlZCBvbmUsIHNvIHRoaXMgZGVwZW5kcworCQkJICogb24gcGNpX2J1c19mb3JfZWFjaF9yZXNvdXJjZSgpIGdpdmluZyB1cyB0aG9zZQorCQkJICogZmlyc3QuCisJCQkgKi8KKwkJCXJldHVybiByOworCQl9CiAJfQotCXJldHVybiBiZXN0OworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTExNzgsNiArMTE4NSwxMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX2xvYWRfYW5kX2ZyZWVfc2F2ZWRfc3RhdGUpOwogCitpbnQgX193ZWFrIHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFycykKK3sKKwlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBiYXJzKTsKK30KKwogc3RhdGljIGludCBkb19wY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFycykKIHsKIAlpbnQgZXJyOwpAQCAtMTYyNCwyOSArMTYzNiwyNyBAQAogCXN0cnVjdCBwY2lfcG1lX2RldmljZSAqcG1lX2RldiwgKm47CiAKIAltdXRleF9sb2NrKCZwY2lfcG1lX2xpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmcGNpX3BtZV9saXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG1lX2RldiwgbiwgJnBjaV9wbWVfbGlzdCwgbGlzdCkgewotCQkJaWYgKHBtZV9kZXYtPmRldi0+cG1lX3BvbGwpIHsKLQkJCQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbWVfZGV2LCBuLCAmcGNpX3BtZV9saXN0LCBsaXN0KSB7CisJCWlmIChwbWVfZGV2LT5kZXYtPnBtZV9wb2xsKSB7CisJCQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOwogCi0JCQkJYnJpZGdlID0gcG1lX2Rldi0+ZGV2LT5idXMtPnNlbGY7Ci0JCQkJLyoKLQkJCQkgKiBJZiBicmlkZ2UgaXMgaW4gbG93IHBvd2VyIHN0YXRlLCB0aGUKLQkJCQkgKiBjb25maWd1cmF0aW9uIHNwYWNlIG9mIHN1Ym9yZGluYXRlIGRldmljZXMKLQkJCQkgKiBtYXkgYmUgbm90IGFjY2Vzc2libGUKLQkJCQkgKi8KLQkJCQlpZiAoYnJpZGdlICYmIGJyaWRnZS0+Y3VycmVudF9zdGF0ZSAhPSBQQ0lfRDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCXBjaV9wbWVfd2FrZXVwKHBtZV9kZXYtPmRldiwgTlVMTCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3RfZGVsKCZwbWVfZGV2LT5saXN0KTsKLQkJCQlrZnJlZShwbWVfZGV2KTsKLQkJCX0KKwkJCWJyaWRnZSA9IHBtZV9kZXYtPmRldi0+YnVzLT5zZWxmOworCQkJLyoKKwkJCSAqIElmIGJyaWRnZSBpcyBpbiBsb3cgcG93ZXIgc3RhdGUsIHRoZQorCQkJICogY29uZmlndXJhdGlvbiBzcGFjZSBvZiBzdWJvcmRpbmF0ZSBkZXZpY2VzCisJCQkgKiBtYXkgYmUgbm90IGFjY2Vzc2libGUKKwkJCSAqLworCQkJaWYgKGJyaWRnZSAmJiBicmlkZ2UtPmN1cnJlbnRfc3RhdGUgIT0gUENJX0QwKQorCQkJCWNvbnRpbnVlOworCQkJcGNpX3BtZV93YWtldXAocG1lX2Rldi0+ZGV2LCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZGVsKCZwbWVfZGV2LT5saXN0KTsKKwkJCWtmcmVlKHBtZV9kZXYpOwogCQl9Ci0JCWlmICghbGlzdF9lbXB0eSgmcGNpX3BtZV9saXN0KSkKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGNpX3BtZV93b3JrLAotCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFBNRV9USU1FT1VUKSk7CiAJfQorCWlmICghbGlzdF9lbXB0eSgmcGNpX3BtZV9saXN0KSkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwY2lfcG1lX3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhQTUVfVElNRU9VVCkpOwogCW11dGV4X3VubG9jaygmcGNpX3BtZV9saXN0X211dGV4KTsKIH0KIApAQCAtMjE5MywyMSArMjIwMywxOCBAQAogfQogCiAvKioKLSAqIHBjaV9lbmFibGVfYWNzIC0gZW5hYmxlIEFDUyBpZiBoYXJkd2FyZSBzdXBwb3J0IGl0CisgKiBwY2lfc3RkX2VuYWJsZV9hY3MgLSBlbmFibGUgQUNTIG9uIGRldmljZXMgdXNpbmcgc3RhbmRhcmQgQUNTIGNhcGFiaWxpdGVzCiAgKiBAZGV2OiB0aGUgUENJIGRldmljZQogICovCi12b2lkIHBjaV9lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW50IHBjaV9zdGRfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCBwb3M7CiAJdTE2IGNhcDsKIAl1MTYgY3RybDsKIAotCWlmICghcGNpX2Fjc19lbmFibGUpCi0JCXJldHVybjsKLQogCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfQUNTKTsKIAlpZiAoIXBvcykKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DQVAsICZjYXApOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DVFJMLCAmY3RybCk7CkBAIC0yMjI1LDYgKzIyMzIsMjMgQEAKIAljdHJsIHw9IChjYXAgJiBQQ0lfQUNTX1VGKTsKIAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9BQ1NfQ1RSTCwgY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwY2lfZW5hYmxlX2FjcyAtIGVuYWJsZSBBQ1MgaWYgaGFyZHdhcmUgc3VwcG9ydCBpdAorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqLwordm9pZCBwY2lfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICghcGNpX2Fjc19lbmFibGUpCisJCXJldHVybjsKKworCWlmICghcGNpX3N0ZF9lbmFibGVfYWNzKGRldikpCisJCXJldHVybjsKKworCXBjaV9kZXZfc3BlY2lmaWNfZW5hYmxlX2FjcyhkZXYpOwogfQogCiBzdGF0aWMgYm9vbCBwY2lfYWNzX2ZsYWdzX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUxNiBhY3NfZmxhZ3MpCkBAIC00MjUwLDYgKzQyNzQsNyBAQAogCQkJCSJSb3VuZGluZyB1cCBzaXplIG9mIHJlc291cmNlICMlZCB0byAlI2xseC5cbiIsCiAJCQkJaSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplKTsKIAkJfQorCQlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQlyLT5lbmQgPSBzaXplIC0gMTsKIAkJci0+c3RhcnQgPSAwOwogCX0KQEAgLTQyNjMsNiArNDI4OCw3IEBACiAJCQlyID0gJmRldi0+cmVzb3VyY2VbaV07CiAJCQlpZiAoIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKIAkJCQljb250aW51ZTsKKwkJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCQlyLT5lbmQgPSByZXNvdXJjZV9zaXplKHIpIC0gMTsKIAkJCXItPnN0YXJ0ID0gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA0ZGYzOGRmLi42YmQwODIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgRFJJVkVSU19QQ0lfSAogI2RlZmluZSBEUklWRVJTX1BDSV9ICiAKLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQogI2RlZmluZSBQQ0lfQ0ZHX1NQQUNFX1NJWkUJMjU2CiAjZGVmaW5lIFBDSV9DRkdfU1BBQ0VfRVhQX1NJWkUJNDA5NgogCkBAIC0yNDAsOCArMjM4LDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwkvKiBsb3dlc3QgbnVtYmVyZWQgUEYgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqc2VsZjsJLyogdGhpcyBQRiAqLwogCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBsb2NrIGZvciBWRiBidXMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbXRhc2s7IC8qIFZGIE1pZ3JhdGlvbiB0YXNrICovCi0JdTggX19pb21lbSAqbXN0YXRlOwkvKiBWRiBNaWdyYXRpb24gU3RhdGUgQXJyYXkgKi8KIH07CiAKICNpZmRlZiBDT05GSUdfUENJX0FUUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggNmUzNDQ5OC4uZWYwOWY1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0yNTIsNiArMjUyLDcgQEAKIAkJCS8qIEFkZHJlc3MgYWJvdmUgMzItYml0IGJvdW5kYXJ5OyBkaXNhYmxlIHRoZSBCQVIgKi8KIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MsIDApOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIDQsIDApOworCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQkJcmVnaW9uLnN0YXJ0ID0gMDsKIAkJCXJlZ2lvbi5lbmQgPSBzejY0OwogCQkJYmFyX2Rpc2FibGVkID0gdHJ1ZTsKQEAgLTczMSwyMiArNzMyLDYgQEAKIAlyZXR1cm4gY2hpbGQ7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9maXh1cF9wYXJlbnRfc3Vib3JkaW5hdGVfYnVzbnIoc3RydWN0IHBjaV9idXMgKmNoaWxkLCBpbnQgbWF4KQotewotCXN0cnVjdCBwY2lfYnVzICpwYXJlbnQgPSBjaGlsZC0+cGFyZW50OwotCi0JLyogQXR0ZW1wdHMgdG8gZml4IHRoYXQgdXAgYXJlIHJlYWxseSBkYW5nZXJvdXMgdW5sZXNzCi0JICAgd2UncmUgZ29pbmcgdG8gcmUtYXNzaWduIGFsbCBidXMgbnVtYmVycy4gKi8KLQlpZiAoIXBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKHBhcmVudC0+cGFyZW50ICYmIHBhcmVudC0+YnVzbl9yZXMuZW5kIDwgbWF4KSB7Ci0JCXBhcmVudC0+YnVzbl9yZXMuZW5kID0gbWF4OwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGFyZW50LT5zZWxmLCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBtYXgpOwotCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKLQl9Ci19Ci0KIC8qCiAgKiBJZiBpdCdzIGEgYnJpZGdlLCBjb25maWd1cmUgaXQgYW5kIHNjYW4gdGhlIGJ1cyBiZWhpbmQgaXQuCiAgKiBGb3IgQ2FyZEJ1cyBicmlkZ2VzLCB3ZSBkb24ndCBzY2FuIGJlaGluZCBhcyB0aGUgZGV2aWNlcyB3aWxsCkBAIC03ODIsNyArNzY3LDcgQEAKIAkvKiBDaGVjayBpZiBzZXR1cCBpcyBzZW5zaWJsZSBhdCBhbGwgKi8KIAlpZiAoIXBhc3MgJiYKIAkgICAgKHByaW1hcnkgIT0gYnVzLT5udW1iZXIgfHwgc2Vjb25kYXJ5IDw9IGJ1cy0+bnVtYmVyIHx8Ci0JICAgICBzZWNvbmRhcnkgPiBzdWJvcmRpbmF0ZSkpIHsKKwkgICAgIHNlY29uZGFyeSA+IHN1Ym9yZGluYXRlIHx8IHN1Ym9yZGluYXRlID4gYnVzLT5idXNuX3Jlcy5lbmQpKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgImJyaWRnZSBjb25maWd1cmF0aW9uIGludmFsaWQgKFtidXMgJTAyeC0lMDJ4XSksIHJlY29uZmlndXJpbmdcbiIsCiAJCQkgc2Vjb25kYXJ5LCBzdWJvcmRpbmF0ZSk7CiAJCWJyb2tlbiA9IDE7CkBAIC04MDUsMTEgKzc5MCwxMCBAQAogCQkJZ290byBvdXQ7CiAKIAkJLyoKLQkJICogSWYgd2UgYWxyZWFkeSBnb3QgdG8gdGhpcyBidXMgdGhyb3VnaCBhIGRpZmZlcmVudCBicmlkZ2UsCi0JCSAqIGRvbid0IHJlLWFkZCBpdC4gVGhpcyBjYW4gaGFwcGVuIHdpdGggdGhlIGk0NTBOWCBjaGlwc2V0LgotCQkgKgotCQkgKiBIb3dldmVyLCB3ZSBjb250aW51ZSB0byBkZXNjZW5kIGRvd24gdGhlIGhpZXJhcmNoeSBhbmQKLQkJICogc2NhbiByZW1haW5pbmcgY2hpbGQgYnVzZXMuCisJCSAqIFRoZSBidXMgbWlnaHQgYWxyZWFkeSBleGlzdCBmb3IgdHdvIHJlYXNvbnM6IEVpdGhlciB3ZSBhcmUKKwkJICogcmVzY2FubmluZyB0aGUgYnVzIG9yIHRoZSBidXMgaXMgcmVhY2hhYmxlIHRocm91Z2ggbW9yZSB0aGFuCisJCSAqIG9uZSBicmlkZ2UuIFRoZSBzZWNvbmQgY2FzZSBjYW4gaGFwcGVuIHdpdGggdGhlIGk0NTBOWAorCQkgKiBjaGlwc2V0LgogCQkgKi8KIAkJY2hpbGQgPSBwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBzZWNvbmRhcnkpOwogCQlpZiAoIWNoaWxkKSB7CkBAIC04MjIsMTcgKzgwNiwxOSBAQAogCQl9CiAKIAkJY21heCA9IHBjaV9zY2FuX2NoaWxkX2J1cyhjaGlsZCk7Ci0JCWlmIChjbWF4ID4gbWF4KQotCQkJbWF4ID0gY21heDsKLQkJaWYgKGNoaWxkLT5idXNuX3Jlcy5lbmQgPiBtYXgpCi0JCQltYXggPSBjaGlsZC0+YnVzbl9yZXMuZW5kOworCQlpZiAoY21heCA+IHN1Ym9yZGluYXRlKQorCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiYnJpZGdlIGhhcyBzdWJvcmRpbmF0ZSAlMDJ4IGJ1dCBtYXggYnVzbiAlMDJ4XG4iLAorCQkJCSBzdWJvcmRpbmF0ZSwgY21heCk7CisJCS8qIHN1Ym9yZGluYXRlIHNob3VsZCBlcXVhbCBjaGlsZC0+YnVzbl9yZXMuZW5kICovCisJCWlmIChzdWJvcmRpbmF0ZSA+IG1heCkKKwkJCW1heCA9IHN1Ym9yZGluYXRlOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gYXNzaWduIGEgbnVtYmVyIHRvIHRoaXMgYnVzIHdoaWNoIHdlIGFsd2F5cwogCQkgKiBkbyBpbiB0aGUgc2Vjb25kIHBhc3MuCiAJCSAqLwogCQlpZiAoIXBhc3MpIHsKLQkJCWlmIChwY2liaW9zX2Fzc2lnbl9hbGxfYnVzc2VzKCkgfHwgYnJva2VuKQorCQkJaWYgKHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSB8fCBicm9rZW4gfHwgaXNfY2FyZGJ1cykKIAkJCQkvKiBUZW1wb3JhcmlseSBkaXNhYmxlIGZvcndhcmRpbmcgb2YgdGhlCiAJCQkJICAgY29uZmlndXJhdGlvbiBjeWNsZXMgb24gYWxsIGJyaWRnZXMgaW4KIAkJCQkgICB0aGlzIGJ1cyBzZWdtZW50IHRvIGF2b2lkIHBvc3NpYmxlCkBAIC04NDQsMTkgKzgzMCwyNSBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAorCQlpZiAobWF4ID49IGJ1cy0+YnVzbl9yZXMuZW5kKSB7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBjaGlsZCBidXMgJTAyeCBmcm9tICVwUlxuIiwKKwkJCQkgbWF4LCAmYnVzLT5idXNuX3Jlcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCiAJCS8qIENsZWFyIGVycm9ycyAqLwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1RBVFVTLCAweGZmZmYpOwogCi0JCS8qIFByZXZlbnQgYXNzaWduaW5nIGEgYnVzIG51bWJlciB0aGF0IGFscmVhZHkgZXhpc3RzLgotCQkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGJyaWRnZSBpcyBob3QtcGx1Z2dlZCwgc28gaW4KLQkJICogdGhpcyBjYXNlIHdlIG9ubHkgcmUtc2NhbiB0aGlzIGJ1cy4gKi8KKwkJLyogVGhlIGJ1cyB3aWxsIGFscmVhZHkgZXhpc3QgaWYgd2UgYXJlIHJlc2Nhbm5pbmcgKi8KIAkJY2hpbGQgPSBwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSk7CiAJCWlmICghY2hpbGQpIHsKLQkJCWNoaWxkID0gcGNpX2FkZF9uZXdfYnVzKGJ1cywgZGV2LCArK21heCk7CisJCQljaGlsZCA9IHBjaV9hZGRfbmV3X2J1cyhidXMsIGRldiwgbWF4KzEpOwogCQkJaWYgKCFjaGlsZCkKIAkJCQlnb3RvIG91dDsKLQkJCXBjaV9idXNfaW5zZXJ0X2J1c25fcmVzKGNoaWxkLCBtYXgsIDB4ZmYpOworCQkJcGNpX2J1c19pbnNlcnRfYnVzbl9yZXMoY2hpbGQsIG1heCsxLAorCQkJCQkJYnVzLT5idXNuX3Jlcy5lbmQpOwogCQl9CisJCW1heCsrOwogCQlidXNlcyA9IChidXNlcyAmIDB4ZmYwMDAwMDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5wcmltYXJ5KSAgICAgPDwgIDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5idXNuX3Jlcy5zdGFydCkgICA8PCAgOCkKQEAgLTg3OCwyMCArODcwLDcgQEAKIAogCQlpZiAoIWlzX2NhcmRidXMpIHsKIAkJCWNoaWxkLT5icmlkZ2VfY3RsID0gYmN0bDsKLQkJCS8qCi0JCQkgKiBBZGp1c3Qgc3Vib3JkaW5hdGUgYnVzbnIgaW4gcGFyZW50IGJ1c2VzLgotCQkJICogV2UgZG8gdGhpcyBiZWZvcmUgc2Nhbm5pbmcgZm9yIGNoaWxkcmVuIGJlY2F1c2UKLQkJCSAqIHNvbWUgZGV2aWNlcyBtYXkgbm90IGJlIGRldGVjdGVkIGlmIHRoZSBiaW9zCi0JCQkgKiB3YXMgbGF6eS4KLQkJCSAqLwotCQkJcGNpX2ZpeHVwX3BhcmVudF9zdWJvcmRpbmF0ZV9idXNucihjaGlsZCwgbWF4KTsKLQkJCS8qIE5vdyB3ZSBjYW4gc2NhbiBhbGwgc3Vib3JkaW5hdGUgYnVzZXMuLi4gKi8KIAkJCW1heCA9IHBjaV9zY2FuX2NoaWxkX2J1cyhjaGlsZCk7Ci0JCQkvKgotCQkJICogbm93IGZpeCBpdCB1cCBhZ2FpbiBzaW5jZSB3ZSBoYXZlIGZvdW5kCi0JCQkgKiB0aGUgcmVhbCB2YWx1ZSBvZiBtYXguCi0JCQkgKi8KLQkJCXBjaV9maXh1cF9wYXJlbnRfc3Vib3JkaW5hdGVfYnVzbnIoY2hpbGQsIG1heCk7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogRm9yIENhcmRCdXMgYnJpZGdlcywgd2UgbGVhdmUgNCBidXMgbnVtYmVycwpAQCAtOTIyLDExICs5MDEsMTUgQEAKIAkJCQl9CiAJCQl9CiAJCQltYXggKz0gaTsKLQkJCXBjaV9maXh1cF9wYXJlbnRfc3Vib3JkaW5hdGVfYnVzbnIoY2hpbGQsIG1heCk7CiAJCX0KIAkJLyoKIAkJICogU2V0IHRoZSBzdWJvcmRpbmF0ZSBidXMgbnVtYmVyIHRvIGl0cyByZWFsIHZhbHVlLgogCQkgKi8KKwkJaWYgKG1heCA+IGJ1cy0+YnVzbl9yZXMuZW5kKSB7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJtYXggYnVzbiAlMDJ4IGlzIG91dHNpZGUgJXBSXG4iLAorCQkJCSBtYXgsICZidXMtPmJ1c25fcmVzKTsKKwkJCW1heCA9IGJ1cy0+YnVzbl9yZXMuZW5kOworCQl9CiAJCXBjaV9idXNfdXBkYXRlX2J1c25fcmVzX2VuZChjaGlsZCwgbWF4KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1NVQk9SRElOQVRFX0JVUywgbWF4KTsKIAl9CkBAIC0xMTI1LDEwICsxMTA4LDEwIEBACiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJmRldi0+c3Vic3lzdGVtX2RldmljZSk7CiAKIAkJLyoKLQkJICoJRG8gdGhlIHVnbHkgbGVnYWN5IG1vZGUgc3R1ZmYgaGVyZSByYXRoZXIgdGhhbiBicm9rZW4gY2hpcAotCQkgKglxdWlyayBjb2RlLiBMZWdhY3kgbW9kZSBBVEEgY29udHJvbGxlcnMgaGF2ZSBmaXhlZAotCQkgKglhZGRyZXNzZXMuIFRoZXNlIGFyZSBub3QgYWx3YXlzIGVjaG9lZCBpbiBCQVIwLTMsIGFuZAotCQkgKglCQVIwLTMgaW4gYSBmZXcgY2FzZXMgY29udGFpbiBqdW5rIQorCQkgKiBEbyB0aGUgdWdseSBsZWdhY3kgbW9kZSBzdHVmZiBoZXJlIHJhdGhlciB0aGFuIGJyb2tlbiBjaGlwCisJCSAqIHF1aXJrIGNvZGUuIExlZ2FjeSBtb2RlIEFUQSBjb250cm9sbGVycyBoYXZlIGZpeGVkCisJCSAqIGFkZHJlc3Nlcy4gVGhlc2UgYXJlIG5vdCBhbHdheXMgZWNob2VkIGluIEJBUjAtMywgYW5kCisJCSAqIEJBUjAtMyBpbiBhIGZldyBjYXNlcyBjb250YWluIGp1bmshCiAJCSAqLwogCQlpZiAoY2xhc3MgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKSB7CiAJCQl1OCBwcm9naWY7CkBAIC0xMTM5LDExICsxMTIyLDE1IEBACiAJCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbMF07CiAJCQkJcmVzLT5mbGFncyA9IExFR0FDWV9JT19SRVNPVVJDRTsKIAkJCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYtPmJ1cywgcmVzLCAmcmVnaW9uKTsKKwkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJsZWdhY3kgSURFIHF1aXJrOiByZWcgMHgxMDogJXBSXG4iLAorCQkJCQkgcmVzKTsKIAkJCQlyZWdpb24uc3RhcnQgPSAweDNGNjsKIAkJCQlyZWdpb24uZW5kID0gMHgzRjY7CiAJCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbMV07CiAJCQkJcmVzLT5mbGFncyA9IExFR0FDWV9JT19SRVNPVVJDRTsKIAkJCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYtPmJ1cywgcmVzLCAmcmVnaW9uKTsKKwkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJsZWdhY3kgSURFIHF1aXJrOiByZWcgMHgxNDogJXBSXG4iLAorCQkJCQkgcmVzKTsKIAkJCX0KIAkJCWlmICgocHJvZ2lmICYgNCkgPT0gMCkgewogCQkJCXJlZ2lvbi5zdGFydCA9IDB4MTcwOwpAQCAtMTE1MSwxMSArMTEzOCwxNSBAQAogCQkJCXJlcyA9ICZkZXYtPnJlc291cmNlWzJdOwogCQkJCXJlcy0+ZmxhZ3MgPSBMRUdBQ1lfSU9fUkVTT1VSQ0U7CiAJCQkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LT5idXMsIHJlcywgJnJlZ2lvbik7CisJCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAibGVnYWN5IElERSBxdWlyazogcmVnIDB4MTg6ICVwUlxuIiwKKwkJCQkJIHJlcyk7CiAJCQkJcmVnaW9uLnN0YXJ0ID0gMHgzNzY7CiAJCQkJcmVnaW9uLmVuZCA9IDB4Mzc2OwogCQkJCXJlcyA9ICZkZXYtPnJlc291cmNlWzNdOwogCQkJCXJlcy0+ZmxhZ3MgPSBMRUdBQ1lfSU9fUkVTT1VSQ0U7CiAJCQkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LT5idXMsIHJlcywgJnJlZ2lvbik7CisJCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAibGVnYWN5IElERSBxdWlyazogcmVnIDB4MWM6ICVwUlxuIiwKKwkJCQkJIHJlcyk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC0xODM1LDcgKzE4MjYsNyBAQAogCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfUENJX0ZJWEVEOwogCX0KIAotCWNvbmZsaWN0ID0gaW5zZXJ0X3Jlc291cmNlX2NvbmZsaWN0KHBhcmVudF9yZXMsIHJlcyk7CisJY29uZmxpY3QgPSByZXF1ZXN0X3Jlc291cmNlX2NvbmZsaWN0KHBhcmVudF9yZXMsIHJlcyk7CiAKIAlpZiAoY29uZmxpY3QpCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmItPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggNWNiNzI2Yy4uZTcyOTIwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTI5Niw2ICsyOTYsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlWzBdOwogCiAJaWYgKChyLT5zdGFydCAmIDB4M2ZmZmZmZikgfHwgci0+ZW5kICE9IHItPnN0YXJ0ICsgMHgzZmZmZmZmKSB7CisJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCXItPnN0YXJ0ID0gMDsKIAkJci0+ZW5kID0gMHgzZmZmZmZmOwogCX0KQEAgLTkzNyw2ICs5MzgsOCBAQAogc3RhdGljIHZvaWQgcXVpcmtfZHVub3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2UgWzFdOworCisJci0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAlyLT5zdGFydCA9IDA7CiAJci0+ZW5kID0gMHhmZmZmZmY7CiB9CkBAIC0xNzQwLDYgKzE3NDMsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlWzBdOwogCiAJaWYgKHItPnN0YXJ0ICYgMHg4KSB7CisJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCXItPnN0YXJ0ID0gMDsKIAkJci0+ZW5kID0gMHhmOwogCX0KQEAgLTE3NjksNiArMTc3Myw3IEBACiAJCQlkZXZfaW5mbygmZGV2LT5kZXYsCiAJCQkJICJSZS1hbGxvY2F0aW5nIFBMWCBQQ0kgOTA1MCBCQVIgJXUgdG8gbGVuZ3RoIDI1NiB0byBhdm9pZCBiaXQgNyBidWdcbiIsCiAJCQkJIGJhcik7CisJCQlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOwogCQkJci0+c3RhcnQgPSAwOwogCQkJci0+ZW5kID0gMHhmZjsKIAkJfQpAQCAtMzQyMyw2ICszNDI4LDYxIEBACiAjZW5kaWYKIH0KIAorLyoKKyAqIE1hbnkgSW50ZWwgUENIIHJvb3QgcG9ydHMgZG8gcHJvdmlkZSBBQ1MtbGlrZSBmZWF0dXJlcyB0byBkaXNhYmxlIHBlZXIKKyAqIHRyYW5zYWN0aW9ucyBhbmQgdmFsaWRhdGUgYnVzIG51bWJlcnMgaW4gcmVxdWVzdHMsIGJ1dCBkbyBub3QgcHJvdmlkZSBhbgorICogYWN0dWFsIFBDSWUgQUNTIGNhcGFiaWxpdHkuICBUaGlzIGlzIHRoZSBsaXN0IG9mIGRldmljZSBJRHMga25vd24gdG8gZmFsbAorICogaW50byB0aGF0IGNhdGVnb3J5IGFzIHByb3ZpZGVkIGJ5IEludGVsIGluIFJlZCBIYXQgYnVnemlsbGEgMTAzNzY4NC4KKyAqLworc3RhdGljIGNvbnN0IHUxNiBwY2lfcXVpcmtfaW50ZWxfcGNoX2Fjc19pZHNbXSA9IHsKKwkvKiBJYmV4cGVhayBQQ0ggKi8KKwkweDNiNDIsIDB4M2I0MywgMHgzYjQ0LCAweDNiNDUsIDB4M2I0NiwgMHgzYjQ3LCAweDNiNDgsIDB4M2I0OSwKKwkweDNiNGEsIDB4M2I0YiwgMHgzYjRjLCAweDNiNGQsIDB4M2I0ZSwgMHgzYjRmLCAweDNiNTAsIDB4M2I1MSwKKwkvKiBDb3VnYXJwb2ludCBQQ0ggKi8KKwkweDFjMTAsIDB4MWMxMSwgMHgxYzEyLCAweDFjMTMsIDB4MWMxNCwgMHgxYzE1LCAweDFjMTYsIDB4MWMxNywKKwkweDFjMTgsIDB4MWMxOSwgMHgxYzFhLCAweDFjMWIsIDB4MWMxYywgMHgxYzFkLCAweDFjMWUsIDB4MWMxZiwKKwkvKiBQYW50aGVycG9pbnQgUENIICovCisJMHgxZTEwLCAweDFlMTEsIDB4MWUxMiwgMHgxZTEzLCAweDFlMTQsIDB4MWUxNSwgMHgxZTE2LCAweDFlMTcsCisJMHgxZTE4LCAweDFlMTksIDB4MWUxYSwgMHgxZTFiLCAweDFlMWMsIDB4MWUxZCwgMHgxZTFlLCAweDFlMWYsCisJLyogTHlueHBvaW50LUggUENIICovCisJMHg4YzEwLCAweDhjMTEsIDB4OGMxMiwgMHg4YzEzLCAweDhjMTQsIDB4OGMxNSwgMHg4YzE2LCAweDhjMTcsCisJMHg4YzE4LCAweDhjMTksIDB4OGMxYSwgMHg4YzFiLCAweDhjMWMsIDB4OGMxZCwgMHg4YzFlLCAweDhjMWYsCisJLyogTHlueHBvaW50LUxQIFBDSCAqLworCTB4OWMxMCwgMHg5YzExLCAweDljMTIsIDB4OWMxMywgMHg5YzE0LCAweDljMTUsIDB4OWMxNiwgMHg5YzE3LAorCTB4OWMxOCwgMHg5YzE5LCAweDljMWEsIDB4OWMxYiwKKwkvKiBXaWxkY2F0IFBDSCAqLworCTB4OWM5MCwgMHg5YzkxLCAweDljOTIsIDB4OWM5MywgMHg5Yzk0LCAweDljOTUsIDB4OWM5NiwgMHg5Yzk3LAorCTB4OWM5OCwgMHg5Yzk5LCAweDljOWEsIDB4OWM5YiwKK307CisKK3N0YXRpYyBib29sIHBjaV9xdWlya19pbnRlbF9wY2hfYWNzX21hdGNoKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGk7CisKKwkvKiBGaWx0ZXIgb3V0IGEgZmV3IG9idmlvdXMgbm9uLW1hdGNoZXMgZmlyc3QgKi8KKwlpZiAoIXBjaV9pc19wY2llKGRldikgfHwgcGNpX3BjaWVfdHlwZShkZXYpICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaV9xdWlya19pbnRlbF9wY2hfYWNzX2lkcyk7IGkrKykKKwkJaWYgKHBjaV9xdWlya19pbnRlbF9wY2hfYWNzX2lkc1tpXSA9PSBkZXYtPmRldmljZSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisjZGVmaW5lIElOVEVMX1BDSF9BQ1NfRkxBR1MgKFBDSV9BQ1NfUlIgfCBQQ0lfQUNTX0NSIHwgUENJX0FDU19VRiB8IFBDSV9BQ1NfU1YpCisKK3N0YXRpYyBpbnQgcGNpX3F1aXJrX2ludGVsX3BjaF9hY3Moc3RydWN0IHBjaV9kZXYgKmRldiwgdTE2IGFjc19mbGFncykKK3sKKwl1MTYgZmxhZ3MgPSBkZXYtPmRldl9mbGFncyAmIFBDSV9ERVZfRkxBR1NfQUNTX0VOQUJMRURfUVVJUksgPworCQkgICAgSU5URUxfUENIX0FDU19GTEFHUyA6IDA7CisKKwlpZiAoIXBjaV9xdWlya19pbnRlbF9wY2hfYWNzX21hdGNoKGRldikpCisJCXJldHVybiAtRU5PVFRZOworCisJcmV0dXJuIGFjc19mbGFncyAmIH5mbGFncyA/IDAgOiAxOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZfYWNzX2VuYWJsZWQgewogCXUxNiB2ZW5kb3I7CiAJdTE2IGRldmljZTsKQEAgLTM0MzQsNiArMzQ5NCw3IEBACiAJeyBQQ0lfVkVORE9SX0lEX0FUSSwgMHg0MzlkLCBwY2lfcXVpcmtfYW1kX3NiX2FjcyB9LAogCXsgUENJX1ZFTkRPUl9JRF9BVEksIDB4NDM4NCwgcGNpX3F1aXJrX2FtZF9zYl9hY3MgfSwKIAl7IFBDSV9WRU5ET1JfSURfQVRJLCAweDQzOTksIHBjaV9xdWlya19hbWRfc2JfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfQU5ZX0lELCBwY2lfcXVpcmtfaW50ZWxfcGNoX2FjcyB9LAogCXsgMCB9CiB9OwogCkBAIC0zNDYxLDMgKzM1MjIsMTMyIEBACiAKIAlyZXR1cm4gLUVOT1RUWTsKIH0KKworLyogQ29uZmlnIHNwYWNlIG9mZnNldCBvZiBSb290IENvbXBsZXggQmFzZSBBZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVEVMX0xQQ19SQ0JBX1JFRyAweGYwCisvKiAzMToxNCBSQ0JBIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU5URUxfTFBDX1JDQkFfTUFTSyAweGZmZmZjMDAwCisvKiBSQ0JBIEVuYWJsZSAqLworI2RlZmluZSBJTlRFTF9MUENfUkNCQV9FTkFCTEUgKDEgPDwgMCkKKworLyogQmFja2JvbmUgU2NyYXRjaCBQYWQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5URUxfQlNQUl9SRUcgMHgxMTA0CisvKiBCYWNrYm9uZSBQZWVyIE5vbi1Qb3N0ZWQgRGlzYWJsZSAqLworI2RlZmluZSBJTlRFTF9CU1BSX1JFR19CUE5QRCAoMSA8PCA4KQorLyogQmFja2JvbmUgUGVlciBQb3N0ZWQgRGlzYWJsZSAqLworI2RlZmluZSBJTlRFTF9CU1BSX1JFR19CUFBEICAoMSA8PCA5KQorCisvKiBVcHN0cmVhbSBQZWVyIERlY29kZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIElOVEVMX1VQRENSX1JFRyAweDExMTQKKy8qIDU6MCBQZWVyIERlY29kZSBFbmFibGUgYml0cyAqLworI2RlZmluZSBJTlRFTF9VUERDUl9SRUdfTUFTSyAweDNmCisKK3N0YXRpYyBpbnQgcGNpX3F1aXJrX2VuYWJsZV9pbnRlbF9scGNfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIHJjYmEsIGJzcHIsIHVwZGNyOworCXZvaWQgX19pb21lbSAqcmNiYV9tZW07CisKKwkvKgorCSAqIFJlYWQgdGhlIFJDQkEgcmVnaXN0ZXIgZnJvbSB0aGUgTFBDIChEMzE6RjApLiAgUENIIHJvb3QgcG9ydHMKKwkgKiBhcmUgRDI4OkYqIGFuZCB0aGVyZWZvcmUgZ2V0IHByb2JlZCBiZWZvcmUgTFBDLCB0aHVzIHdlIGNhbid0CisJICogdXNlIHBjaV9nZXRfc2xvdC9wY2lfcmVhZF9jb25maWdfZHdvcmQgaGVyZS4KKwkgKi8KKwlwY2lfYnVzX3JlYWRfY29uZmlnX2R3b3JkKGRldi0+YnVzLCBQQ0lfREVWRk4oMzEsIDApLAorCQkJCSAgSU5URUxfTFBDX1JDQkFfUkVHLCAmcmNiYSk7CisJaWYgKCEocmNiYSAmIElOVEVMX0xQQ19SQ0JBX0VOQUJMRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmNiYV9tZW0gPSBpb3JlbWFwX25vY2FjaGUocmNiYSAmIElOVEVMX0xQQ19SQ0JBX01BU0ssCisJCQkJICAgUEFHRV9BTElHTihJTlRFTF9VUERDUl9SRUcpKTsKKwlpZiAoIXJjYmFfbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogVGhlIEJTUFIgY2FuIGRpc2FsbG93IHBlZXIgY3ljbGVzLCBidXQgaXQncyBzZXQgYnkgc29mdCBzdHJhcCBhbmQKKwkgKiB0aGVyZWZvcmUgcmVhZC1vbmx5LiAgSWYgYm90aCBwb3N0ZWQgYW5kIG5vbi1wb3N0ZWQgcGVlciBjeWNsZXMgYXJlCisJICogZGlzYWxsb3dlZCwgd2UncmUgb2suICBJZiBlaXRoZXIgYXJlIGFsbG93ZWQsIHRoZW4gd2UgbmVlZCB0byB1c2UKKwkgKiB0aGUgVVBEQ1IgdG8gZGlzYWJsZSBwZWVyIGRlY29kZXMgZm9yIGVhY2ggcG9ydC4gIFRoaXMgcHJvdmlkZXMgdGhlCisJICogUENJZSBBQ1MgZXF1aXZhbGVudCBvZiBQQ0lfQUNTX1JSIHwgUENJX0FDU19DUiB8IFBDSV9BQ1NfVUYKKwkgKi8KKwlic3ByID0gcmVhZGwocmNiYV9tZW0gKyBJTlRFTF9CU1BSX1JFRyk7CisJYnNwciAmPSBJTlRFTF9CU1BSX1JFR19CUE5QRCB8IElOVEVMX0JTUFJfUkVHX0JQUEQ7CisJaWYgKGJzcHIgIT0gKElOVEVMX0JTUFJfUkVHX0JQTlBEIHwgSU5URUxfQlNQUl9SRUdfQlBQRCkpIHsKKwkJdXBkY3IgPSByZWFkbChyY2JhX21lbSArIElOVEVMX1VQRENSX1JFRyk7CisJCWlmICh1cGRjciAmIElOVEVMX1VQRENSX1JFR19NQVNLKSB7CisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJEaXNhYmxpbmcgVVBEQ1IgcGVlciBkZWNvZGVzXG4iKTsKKwkJCXVwZGNyICY9IH5JTlRFTF9VUERDUl9SRUdfTUFTSzsKKwkJCXdyaXRlbCh1cGRjciwgcmNiYV9tZW0gKyBJTlRFTF9VUERDUl9SRUcpOworCQl9CisJfQorCisJaW91bm1hcChyY2JhX21lbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1pc2NlbGxhbmVvdXMgUG9ydCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVEVMX01QQ19SRUcgMHhkOAorLyogTVBDOiBJbnZhbGlkIFJlY2VpdmUgQnVzIE51bWJlciBDaGVjayBFbmFibGUgKi8KKyNkZWZpbmUgSU5URUxfTVBDX1JFR19JUkJOQ0UgKDEgPDwgMjYpCisKK3N0YXRpYyB2b2lkIHBjaV9xdWlya19lbmFibGVfaW50ZWxfcnBfbXBjX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiBtcGM7CisKKwkvKgorCSAqIFdoZW4gZW5hYmxlZCwgdGhlIElSQk5DRSBiaXQgb2YgdGhlIE1QQyByZWdpc3RlciBlbmFibGVzIHRoZQorCSAqIGVxdWl2YWxlbnQgb2YgUENJIEFDUyBTb3VyY2UgVmFsaWRhdGlvbiAoUENJX0FDU19TViksIHdoaWNoCisJICogZW5zdXJlcyB0aGF0IHJlcXVlc3RlciBJRHMgZmFsbCB3aXRoaW4gdGhlIGJ1cyBudW1iZXIgcmFuZ2UKKwkgKiBvZiB0aGUgYnJpZGdlLiAgRW5hYmxlIGlmIG5vdCBhbHJlYWR5LgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIElOVEVMX01QQ19SRUcsICZtcGMpOworCWlmICghKG1wYyAmIElOVEVMX01QQ19SRUdfSVJCTkNFKSkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJFbmFibGluZyBNUEMgSVJCTkNFXG4iKTsKKwkJbXBjIHw9IElOVEVMX01QQ19SRUdfSVJCTkNFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBJTlRFTF9NUENfUkVHLCBtcGMpOworCX0KK30KKworc3RhdGljIGludCBwY2lfcXVpcmtfZW5hYmxlX2ludGVsX3BjaF9hY3Moc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoIXBjaV9xdWlya19pbnRlbF9wY2hfYWNzX21hdGNoKGRldikpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKHBjaV9xdWlya19lbmFibGVfaW50ZWxfbHBjX2FjcyhkZXYpKSB7CisJCWRldl93YXJuKCZkZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgSW50ZWwgUENIIEFDUyBxdWlya1xuIik7CisJCXJldHVybiAwOworCX0KKworCXBjaV9xdWlya19lbmFibGVfaW50ZWxfcnBfbXBjX2FjcyhkZXYpOworCisJZGV2LT5kZXZfZmxhZ3MgfD0gUENJX0RFVl9GTEFHU19BQ1NfRU5BQkxFRF9RVUlSSzsKKworCWRldl9pbmZvKCZkZXYtPmRldiwgIkludGVsIFBDSCByb290IHBvcnQgQUNTIHdvcmthcm91bmQgZW5hYmxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2X2VuYWJsZV9hY3MgeworCXUxNiB2ZW5kb3I7CisJdTE2IGRldmljZTsKKwlpbnQgKCplbmFibGVfYWNzKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK30gcGNpX2Rldl9lbmFibGVfYWNzW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfQU5ZX0lELCBwY2lfcXVpcmtfZW5hYmxlX2ludGVsX3BjaF9hY3MgfSwKKwl7IDAgfQorfTsKKwordm9pZCBwY2lfZGV2X3NwZWNpZmljX2VuYWJsZV9hY3Moc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgcGNpX2Rldl9lbmFibGVfYWNzICppOworCWludCByZXQ7CisKKwlmb3IgKGkgPSBwY2lfZGV2X2VuYWJsZV9hY3M7IGktPmVuYWJsZV9hY3M7IGkrKykgeworCQlpZiAoKGktPnZlbmRvciA9PSBkZXYtPnZlbmRvciB8fAorCQkgICAgIGktPnZlbmRvciA9PSAodTE2KVBDSV9BTllfSUQpICYmCisJCSAgICAoaS0+ZGV2aWNlID09IGRldi0+ZGV2aWNlIHx8CisJCSAgICAgaS0+ZGV2aWNlID09ICh1MTYpUENJX0FOWV9JRCkpIHsKKwkJCXJldCA9IGktPmVuYWJsZV9hY3MoZGV2KTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQlyZXR1cm47CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yb20uYyBiL2RyaXZlcnMvcGNpL3JvbS5jCmluZGV4IDVkNTk1NzIuLmMxODM5NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JvbS5jCisrKyBiL2RyaXZlcnMvcGNpL3JvbS5jCkBAIC0xOTcsOCArMTk3LDEwIEBACiB2b2lkIHBjaV9jbGVhbnVwX3JvbShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKKwogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fQ09QWSkgewogCQlrZnJlZSgodm9pZCopKHVuc2lnbmVkIGxvbmcpcmVzLT5zdGFydCk7CisJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAkJcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9ST01fQ09QWTsKIAkJcmVzLT5zdGFydCA9IDA7CiAJCXJlcy0+ZW5kID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKaW5kZXggM2ZmMmFjNy4uNGExYjk3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2VhcmNoLmMKKysrIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKQEAgLTU0LDE0ICs1NCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9idXMgKnBjaV9kb19maW5kX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyIGJ1c25yKQogewotCXN0cnVjdCBwY2lfYnVzKiBjaGlsZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9idXMgKmNoaWxkOworCXN0cnVjdCBwY2lfYnVzICp0bXA7CiAKIAlpZihidXMtPm51bWJlciA9PSBidXNucikKIAkJcmV0dXJuIGJ1czsKIAotCWxpc3RfZm9yX2VhY2godG1wLCAmYnVzLT5jaGlsZHJlbikgewotCQljaGlsZCA9IHBjaV9kb19maW5kX2J1cyhwY2lfYnVzX2IodG1wKSwgYnVzbnIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQljaGlsZCA9IHBjaV9kb19maW5kX2J1cyh0bXAsIGJ1c25yKTsKIAkJaWYoY2hpbGQpCiAJCQlyZXR1cm4gY2hpbGQ7CiAJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJbiA9IGZyb20gPyBmcm9tLT5ub2RlLm5leHQgOiBwY2lfcm9vdF9idXNlcy5uZXh0OwogCWlmIChuICE9ICZwY2lfcm9vdF9idXNlcykKLQkJYiA9IHBjaV9idXNfYihuKTsKKwkJYiA9IGxpc3RfZW50cnkobiwgc3RydWN0IHBjaV9idXMsIG5vZGUpOwogCXVwX3JlYWQoJnBjaV9idXNfc2VtKTsKIAlyZXR1cm4gYjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggNWMwNjBiMS4uN2VlZDY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTQ0LDYgKzQ0LDkgQEAKIAlpZiAoIXJlcy0+ZmxhZ3MpCiAJCXJldHVybjsKIAorCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKKwkJcmV0dXJuOworCiAJLyoKIAkgKiBJZ25vcmUgbm9uLW1vdmVhYmxlIHJlc291cmNlcy4gIFRoaXMgbWlnaHQgYmUgbGVnYWN5IHJlc291cmNlcyBmb3IKIAkgKiB3aGljaCBubyBmdW5jdGlvbmFsIEJBUiByZWdpc3RlciBleGlzdHMgb3IgYW5vdGhlciBpbXBvcnRhbnQKQEAgLTEwMSwxMSArMTA0LDYgQEAKIAogCWlmIChkaXNhYmxlKQogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKLQotCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7Ci0JZGV2X2RiZygmZGV2LT5kZXYsICJCQVIgJWQ6IHNldCB0byAlcFIgKFBDSSBhZGRyZXNzIFslI2xseC0lI2xseF0pXG4iLAotCQlyZXNubywgcmVzLCAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbi5zdGFydCwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kKTsKIH0KIAogaW50IHBjaV9jbGFpbV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzb3VyY2UpCkBAIC0xMTMsMTggKzExMSwyMyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbcmVzb3VyY2VdOwogCXN0cnVjdCByZXNvdXJjZSAqcm9vdCwgKmNvbmZsaWN0OwogCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgImNhbid0IGNsYWltIEJBUiAlZCAlcFI6IG5vIGFkZHJlc3MgYXNzaWduZWRcbiIsCisJCQkgcmVzb3VyY2UsIHJlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByZXMpOwogCWlmICghcm9vdCkgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJubyBjb21wYXRpYmxlIGJyaWRnZSB3aW5kb3cgZm9yICVwUlxuIiwKLQkJCSByZXMpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJjYW4ndCBjbGFpbSBCQVIgJWQgJXBSOiBubyBjb21wYXRpYmxlIGJyaWRnZSB3aW5kb3dcbiIsCisJCQkgcmVzb3VyY2UsIHJlcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWNvbmZsaWN0ID0gcmVxdWVzdF9yZXNvdXJjZV9jb25mbGljdChyb290LCByZXMpOwogCWlmIChjb25mbGljdCkgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsCi0JCQkgImFkZHJlc3Mgc3BhY2UgY29sbGlzaW9uOiAlcFIgY29uZmxpY3RzIHdpdGggJXMgJXBSXG4iLAotCQkJIHJlcywgY29uZmxpY3QtPm5hbWUsIGNvbmZsaWN0KTsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiY2FuJ3QgY2xhaW0gQkFSICVkICVwUjogYWRkcmVzcyBjb25mbGljdCB3aXRoICVzICVwUlxuIiwKKwkJCSByZXNvdXJjZSwgcmVzLCBjb25mbGljdC0+bmFtZSwgY29uZmxpY3QpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjYzLDYgKzI2Niw3IEBACiAJcmVzb3VyY2Vfc2l6ZV90IGFsaWduLCBzaXplOwogCWludCByZXQ7CiAKKwlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJYWxpZ24gPSBwY2lfcmVzb3VyY2VfYWxpZ25tZW50KGRldiwgcmVzKTsKIAlpZiAoIWFsaWduKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYXNzaWduICVwUiAiCkBAIC0yODIsNiArMjg2LDcgQEAKIAkJcmV0ID0gcGNpX3JldmVydF9md19hZGRyZXNzKHJlcywgZGV2LCByZXNubywgc2l6ZSk7CiAKIAlpZiAoIXJldCkgeworCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1VOU0VUOwogCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1NUQVJUQUxJR047CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogYXNzaWduZWQgJXBSXG4iLCByZXNubywgcmVzKTsKIAkJaWYgKHJlc25vIDwgUENJX0JSSURHRV9SRVNPVVJDRVMpCkBAIC0yOTcsNiArMzAyLDcgQEAKIAlyZXNvdXJjZV9zaXplX3QgbmV3X3NpemU7CiAJaW50IHJldDsKIAorCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAlpZiAoIXJlcy0+cGFyZW50KSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgcmVhc3NpZ24gYW4gdW5hc3NpZ25lZCByZXNvdXJjZSAlcFIgIgogCQkJICJcbiIsIHJlc25vLCByZXMpOwpAQCAtMzA3LDYgKzMxMyw3IEBACiAJbmV3X3NpemUgPSByZXNvdXJjZV9zaXplKHJlcykgKyBhZGRzaXplOwogCXJldCA9IF9wY2lfYXNzaWduX3Jlc291cmNlKGRldiwgcmVzbm8sIG5ld19zaXplLCBtaW5fYWxpZ24pOwogCWlmICghcmV0KSB7CisJCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7CiAJCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfU1RBUlRBTElHTjsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiByZWFzc2lnbmVkICVwUlxuIiwgcmVzbm8sIHJlcyk7CiAJCWlmIChyZXNubyA8IFBDSV9CUklER0VfUkVTT1VSQ0VTKQpAQCAtMzM2LDkgKzM0MywxNSBAQAogCQkJCSghKHItPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fRU5BQkxFKSkpCiAJCQljb250aW51ZTsKIAorCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IGVuYWJsZSBkZXZpY2U6IEJBUiAlZCAlcFIgbm90IGFzc2lnbmVkXG4iLAorCQkJCWksIHIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQlpZiAoIXItPnBhcmVudCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJkZXZpY2Ugbm90IGF2YWlsYWJsZSAiCi0JCQkJIihjYW4ndCByZXNlcnZlICVwUilcbiIsIHIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgZGV2aWNlOiBCQVIgJWQgJXBSIG5vdCBjbGFpbWVkXG4iLAorCQkJCWksIHIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwppbmRleCA4NDg1NzYxLi45NDZmOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgeWVudGFfZml4dXBfcGFyZW50X2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqY2FyZGJ1c19icmlkZ2UpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBwY2lfYnVzICpzaWJsaW5nOwogCXVuc2lnbmVkIGNoYXIgdXBwZXJfbGltaXQ7CiAJLyoKIAkgKiBXZSBvbmx5IGNoZWNrIGFuZCBmaXggdGhlIHBhcmVudCBicmlkZ2U6IEFsbCBzeXN0ZW1zIHdoaWNoIG5lZWQKQEAgLTEwOTUsMTggKzEwOTUsMTggQEAKIAkvKiBzdGF5IHdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSBidXMgcmFuZ2Ugb2YgdGhlIHBhcmVudDogKi8KIAl1cHBlcl9saW1pdCA9IGJyaWRnZV90b19maXgtPnBhcmVudC0+YnVzbl9yZXMuZW5kOwogCi0JLyogY2hlY2sgdGhlIGJ1cyByYW5nZXMgb2YgYWxsIHNpbGJsaW5nIGJyaWRnZXMgdG8gcHJldmVudCBvdmVybGFwICovCi0JbGlzdF9mb3JfZWFjaCh0bXAsICZicmlkZ2VfdG9fZml4LT5wYXJlbnQtPmNoaWxkcmVuKSB7Ci0JCXN0cnVjdCBwY2lfYnVzICpzaWxibGluZyA9IHBjaV9idXNfYih0bXApOworCS8qIGNoZWNrIHRoZSBidXMgcmFuZ2VzIG9mIGFsbCBzaWJsaW5nIGJyaWRnZXMgdG8gcHJldmVudCBvdmVybGFwICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmYnJpZGdlX3RvX2ZpeC0+cGFyZW50LT5jaGlsZHJlbiwKKwkJCW5vZGUpIHsKIAkJLyoKLQkJICogSWYgdGhlIHNpbGJsaW5nIGhhcyBhIGhpZ2hlciBzZWNvbmRhcnkgYnVzIG51bWJlcgorCQkgKiBJZiB0aGUgc2libGluZyBoYXMgYSBoaWdoZXIgc2Vjb25kYXJ5IGJ1cyBudW1iZXIKIAkJICogYW5kIGl0J3Mgc2Vjb25kYXJ5IGlzIGVxdWFsIG9yIHNtYWxsZXIgdGhhbiBvdXIKIAkJICogY3VycmVudCB1cHBlciBsaW1pdCwgc2V0IHRoZSBuZXcgdXBwZXIgbGltaXQgdG8KLQkJICogdGhlIGJ1cyBudW1iZXIgYmVsb3cgdGhlIHNpbGJsaW5nJ3MgcmFuZ2U6CisJCSAqIHRoZSBidXMgbnVtYmVyIGJlbG93IHRoZSBzaWJsaW5nJ3MgcmFuZ2U6CiAJCSAqLwotCQlpZiAoc2lsYmxpbmctPmJ1c25fcmVzLnN0YXJ0ID4gYnJpZGdlX3RvX2ZpeC0+YnVzbl9yZXMuZW5kCi0JCSAgICAmJiBzaWxibGluZy0+YnVzbl9yZXMuc3RhcnQgPD0gdXBwZXJfbGltaXQpCi0JCQl1cHBlcl9saW1pdCA9IHNpbGJsaW5nLT5idXNuX3Jlcy5zdGFydCAtIDE7CisJCWlmIChzaWJsaW5nLT5idXNuX3Jlcy5zdGFydCA+IGJyaWRnZV90b19maXgtPmJ1c25fcmVzLmVuZAorCQkgICAgJiYgc2libGluZy0+YnVzbl9yZXMuc3RhcnQgPD0gdXBwZXJfbGltaXQpCisJCQl1cHBlcl9saW1pdCA9IHNpYmxpbmctPmJ1c25fcmVzLnN0YXJ0IC0gMTsKIAl9CiAKIAkvKiBTaG93IHRoYXQgdGhlIHdhbnRlZCBzdWJvcmRpbmF0ZSBudW1iZXIgaXMgbm90IHBvc3NpYmxlOiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvS2NvbmZpZyBiL2RyaXZlcnMvcGh5L0tjb25maWcKaW5kZXggYzdhNTUxYy4uOGQzYzQ5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL3BoeS9LY29uZmlnCkBAIC0xNiwzMCArMTYsNTYgQEAKIAkgIGZyYW1ld29yayBzaG91bGQgc2VsZWN0IHRoaXMgY29uZmlnLgogCiBjb25maWcgUEhZX0VYWU5PU19NSVBJX1ZJREVPCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAl0cmlzdGF0ZSAiUzVQL0VYWU5PUyBTb0Mgc2VyaWVzIE1JUEkgQ1NJLTIvRFNJIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwlkZXBlbmRzIG9uIEFSQ0hfUzVQVjIxMCB8fCBBUkNIX0VYWU5PUyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlkZWZhdWx0IHkgaWYgQVJDSF9TNVBWMjEwIHx8IEFSQ0hfRVhZTk9TCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgTUlQSSBDU0ktMiBhbmQgTUlQSSBEU0kgRFBIWSBmb3VuZCBvbiBTYW1zdW5nIFM1UAogCSAgYW5kIEVYWU5PUyBTb0NzLgogCiBjb25maWcgUEhZX01WRUJVX1NBVEEKIAlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRQorCWRlcGVuZHMgb24gQVJDSF9LSVJLV09PRCB8fCBBUkNIX0RPVkUgfHwgTUFDSF9ET1ZFCiAJZGVwZW5kcyBvbiBPRgogCXNlbGVjdCBHRU5FUklDX1BIWQogCitjb25maWcgT01BUF9DT05UUk9MX1BIWQorCXRyaXN0YXRlICJPTUFQIENPTlRST0wgUEhZIERyaXZlciIKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIFBIWSBwYXJ0IHByZXNlbnQgaW4gdGhlIGNvbnRyb2wKKwkgIG1vZHVsZS4gVGhpcyBkcml2ZXIgaGFzIEFQSSB0byBwb3dlciBvbiB0aGUgVVNCMiBQSFkgYW5kIHRvIHdyaXRlIHRvCisJICB0aGUgbWFpbGJveC4gVGhlIG1haWxib3ggaXMgcHJlc2VudCBvbmx5IGluIG9tYXA0IGFuZCB0aGUgcmVnaXN0ZXIgdG8KKwkgIHBvd2VyIG9uIHRoZSBVU0IyIFBIWSBpcyBwcmVzZW50IGluIE9NQVA0IGFuZCBPTUFQNS4gT01BUDUgaGFzIGFuCisJICBhZGRpdGlvbmFsIHJlZ2lzdGVyIHRvIHBvd2VyIG9uIFVTQjMgUEhZL1NBVEEgUEhZL1BDSUUgUEhZCisJICAoUElQRTMgUEhZKS4KKwogY29uZmlnIE9NQVBfVVNCMgogCXRyaXN0YXRlICJPTUFQIFVTQjIgUEhZIERyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTCiAJZGVwZW5kcyBvbiBVU0JfUEhZCiAJc2VsZWN0IEdFTkVSSUNfUEhZCi0Jc2VsZWN0IE9NQVBfQ09OVFJPTF9VU0IKKwlzZWxlY3QgT01BUF9DT05UUk9MX1BIWQorCWRlcGVuZHMgb24gT01BUF9PQ1AyU0NQCiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgdHJhbnNjZWl2ZXIgdGhhdCBpcyBwYXJ0IG9mIFNPQy4gVGhpcwogCSAgZHJpdmVyIHRha2VzIGNhcmUgb2YgYWxsIHRoZSBQSFkgZnVuY3Rpb25hbGl0eSBhcGFydCBmcm9tIGNvbXBhcmF0b3IuCiAJICBUaGUgVVNCIE9URyBjb250cm9sbGVyIGNvbW11bmljYXRlcyB3aXRoIHRoZSBjb21wYXJhdG9yIHVzaW5nIHRoaXMKIAkgIGRyaXZlci4KIAorY29uZmlnIFRJX1BJUEUzCisJdHJpc3RhdGUgIlRJIFBJUEUzIFBIWSBEcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgT01BUF9DT05UUk9MX1BIWQorCWRlcGVuZHMgb24gT01BUF9PQ1AyU0NQCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgUElQRTMgUEhZIHRoYXQgaXMgcGFydCBvZiBUSSBTT0NzLiBUaGlzCisJICBkcml2ZXIgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIFBIWSBmdW5jdGlvbmFsaXR5IGFwYXJ0IGZyb20gY29tcGFyYXRvci4KKwkgIFRoaXMgZHJpdmVyIGludGVyYWN0cyB3aXRoIHRoZSAiT01BUCBDb250cm9sIFBIWSBEcml2ZXIiIHRvIHBvd2VyCisJICBvbi9vZmYgdGhlIFBIWS4KKwogY29uZmlnIFRXTDQwMzBfVVNCCiAJdHJpc3RhdGUgIlRXTDQwMzAgVVNCIFRyYW5zY2VpdmVyIERyaXZlciIKIAlkZXBlbmRzIG9uIFRXTDQwMzBfQ09SRSAmJiBSRUdVTEFUT1JfVFdMNDAzMCAmJiBVU0JfTVVTQl9PTUFQMlBMVVMKQEAgLTU0LDYgKzgwLDggQEAKIGNvbmZpZyBQSFlfRVhZTk9TX0RQX1ZJREVPCiAJdHJpc3RhdGUgIkVYWU5PUyBTb0Mgc2VyaWVzIERpc3BsYXkgUG9ydCBQSFkgZHJpdmVyIgogCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TIHx8IENPTVBJTEVfVEVTVAorCWRlZmF1bHQgQVJDSF9FWFlOT1MKIAlzZWxlY3QgR0VORVJJQ19QSFkKIAloZWxwCiAJICBTdXBwb3J0IGZvciBEaXNwbGF5IFBvcnQgUEhZIGZvdW5kIG9uIFNhbXN1bmcgRVhZTk9TIFNvQ3MuCkBAIC02NSw0ICs5Myw3NyBAQAogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIEJyb2FkY29tIEtvbmEgVVNCIDIuMCBQSFkuCiAKK2NvbmZpZyBQSFlfRVhZTk9TNTI1MF9TQVRBCisJdHJpc3RhdGUgIkV4eW5vczUyNTAgU2F0YSBTZXJEZXMvUEhZIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPQ19FWFlOT1M1MjUwCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwlkZXBlbmRzIG9uIE9GCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJc2VsZWN0IEkyQworCXNlbGVjdCBJMkNfUzNDMjQxMAorCXNlbGVjdCBNRkRfU1lTQ09OCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBTQVRBIFNlckRlcy9QaHkgZm91bmQgb24gU2Ftc3VuZydzCisJICBFeHlub3M1MjUwIGJhc2VkIFNvQ3MuVGhpcyBTZXJEZXMvUGh5IHN1cHBvcnRzIFNBVEEgMS41IEdiL3MsCisJICBTQVRBIDMuMCBHYi9zLCBTQVRBIDYuMCBHYi9zIHNwZWVkcy4gSXQgc3VwcG9ydHMgb25lIFNBVEEgaG9zdAorCSAgcG9ydCB0byBhY2NlcHQgb25lIFNBVEEgZGV2aWNlLgorCitjb25maWcgUEhZX1NVTjRJX1VTQgorCXRyaXN0YXRlICJBbGx3aW5uZXIgc3VueGkgU29DIFVTQiBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9TVU5YSSAmJiBIQVNfSU9NRU0gJiYgT0YKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSB0cmFuc2NlaXZlciB0aGF0IGlzIHBhcnQgb2YgQWxsd2lubmVyCisJICBzdW54aSBTb0NzLgorCisJICBUaGlzIGRyaXZlciBjb250cm9scyB0aGUgZW50aXJlIFVTQiBQSFkgYmxvY2ssIGJvdGggdGhlIFVTQiBPVEcKKwkgIHBhcnRzLCBhcyB3ZWxsIGFzIHRoZSAyIHJlZ3VsYXIgVVNCIDIgaG9zdCBQSFlzLgorCitjb25maWcgUEhZX1NBTVNVTkdfVVNCMgorCXRyaXN0YXRlICJTYW1zdW5nIFVTQiAyLjAgUEhZIGRyaXZlciIKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgTUZEX1NZU0NPTgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGZvciBTYW1zdW5nCisJICBTb0NzLiBUaGlzIGRyaXZlciBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBVU0IgMi4wIFBIWS4gU3VwcG9ydCBmb3IKKwkgIHBhcnRpY3VsYXIgU29DcyBoYXMgdG8gYmUgZW5hYmxlZCBpbiBhZGRpdGlvbiB0byB0aGlzIGRyaXZlci4gTnVtYmVyCisJICBhbmQgdHlwZSBvZiBzdXBwb3J0ZWQgcGh5cyBkZXBlbmRzIG9uIHRoZSBTb0MuCisKK2NvbmZpZyBQSFlfRVhZTk9TNDIxMF9VU0IyCisJYm9vbCAiU3VwcG9ydCBmb3IgRXh5bm9zIDQyMTAiCisJZGVwZW5kcyBvbiBQSFlfU0FNU1VOR19VU0IyCisJZGVwZW5kcyBvbiBDUFVfRVhZTk9TNDIxMAorCWhlbHAKKwkgIEVuYWJsZSBVU0IgUEhZIHN1cHBvcnQgZm9yIEV4eW5vcyA0MjEwLiBUaGlzIG9wdGlvbiByZXF1aXJlcyB0aGF0CisJICBTYW1zdW5nIFVTQiAyLjAgUEhZIGRyaXZlciBpcyBlbmFibGVkIGFuZCBtZWFucyB0aGF0IHN1cHBvcnQgZm9yIHRoaXMKKwkgIHBhcnRpY3VsYXIgU29DIGlzIGNvbXBpbGVkIGluIHRoZSBkcml2ZXIuIEluIGNhc2Ugb2YgRXh5bm9zIDQyMTAgZm91cgorCSAgcGh5cyBhcmUgYXZhaWxhYmxlIC0gZGV2aWNlLCBob3N0LCBIU0lDMCBhbmQgSFNJQzEuCisKK2NvbmZpZyBQSFlfRVhZTk9TNFgxMl9VU0IyCisJYm9vbCAiU3VwcG9ydCBmb3IgRXh5bm9zIDR4MTIiCisJZGVwZW5kcyBvbiBQSFlfU0FNU1VOR19VU0IyCisJZGVwZW5kcyBvbiAoU09DX0VYWU5PUzQyMTIgfHwgU09DX0VYWU5PUzQ0MTIpCisJaGVscAorCSAgRW5hYmxlIFVTQiBQSFkgc3VwcG9ydCBmb3IgRXh5bm9zIDR4MTIuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIHRoYXQKKwkgIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGlzIGVuYWJsZWQgYW5kIG1lYW5zIHRoYXQgc3VwcG9ydCBmb3IgdGhpcworCSAgcGFydGljdWxhciBTb0MgaXMgY29tcGlsZWQgaW4gdGhlIGRyaXZlci4gSW4gY2FzZSBvZiBFeHlub3MgNHgxMiBmb3VyCisJICBwaHlzIGFyZSBhdmFpbGFibGUgLSBkZXZpY2UsIGhvc3QsIEhTSUMwIGFuZCBIU0lDMS4KKworY29uZmlnIFBIWV9FWFlOT1M1MjUwX1VTQjIKKwlib29sICJTdXBwb3J0IGZvciBFeHlub3MgNTI1MCIKKwlkZXBlbmRzIG9uIFBIWV9TQU1TVU5HX1VTQjIKKwlkZXBlbmRzIG9uIFNPQ19FWFlOT1M1MjUwCisJaGVscAorCSAgRW5hYmxlIFVTQiBQSFkgc3VwcG9ydCBmb3IgRXh5bm9zIDUyNTAuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIHRoYXQKKwkgIFNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIGlzIGVuYWJsZWQgYW5kIG1lYW5zIHRoYXQgc3VwcG9ydCBmb3IgdGhpcworCSAgcGFydGljdWxhciBTb0MgaXMgY29tcGlsZWQgaW4gdGhlIGRyaXZlci4gSW4gY2FzZSBvZiBFeHlub3MgNTI1MCBmb3VyCisJICBwaHlzIGFyZSBhdmFpbGFibGUgLSBkZXZpY2UsIGhvc3QsIEhTSUMwIGFuZCBIU0lDLgorCitjb25maWcgUEhZX1hHRU5FCisJdHJpc3RhdGUgIkFQTSBYLUdlbmUgMTVHYnBzIFBIWSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIE9GICYmIChBUk02NCB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBBUE0gWC1HZW5lIFNvQyBtdWx0aS1wdXJwb3NlIFBIWS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvTWFrZWZpbGUgYi9kcml2ZXJzL3BoeS9NYWtlZmlsZQppbmRleCBiNTdjMjUzLi4yZmFmNzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BoeS9NYWtlZmlsZQpAQCAtNyw1ICs3LDE0IEBACiBvYmotJChDT05GSUdfUEhZX0VYWU5PU19EUF9WSURFTykJKz0gcGh5LWV4eW5vcy1kcC12aWRlby5vCiBvYmotJChDT05GSUdfUEhZX0VYWU5PU19NSVBJX1ZJREVPKQkrPSBwaHktZXh5bm9zLW1pcGktdmlkZW8ubwogb2JqLSQoQ09ORklHX1BIWV9NVkVCVV9TQVRBKQkJKz0gcGh5LW12ZWJ1LXNhdGEubworb2JqLSQoQ09ORklHX09NQVBfQ09OVFJPTF9QSFkpCQkrPSBwaHktb21hcC1jb250cm9sLm8KIG9iai0kKENPTkZJR19PTUFQX1VTQjIpCQkJKz0gcGh5LW9tYXAtdXNiMi5vCitvYmotJChDT05GSUdfVElfUElQRTMpCQkJKz0gcGh5LXRpLXBpcGUzLm8KIG9iai0kKENPTkZJR19UV0w0MDMwX1VTQikJCSs9IHBoeS10d2w0MDMwLXVzYi5vCitvYmotJChDT05GSUdfUEhZX0VYWU5PUzUyNTBfU0FUQSkJKz0gcGh5LWV4eW5vczUyNTAtc2F0YS5vCitvYmotJChDT05GSUdfUEhZX1NVTjRJX1VTQikJCSs9IHBoeS1zdW40aS11c2Iubworb2JqLSQoQ09ORklHX1BIWV9TQU1TVU5HX1VTQjIpCQkrPSBwaHktc2Ftc3VuZy11c2IyLm8KK29iai0kKENPTkZJR19QSFlfRVhZTk9TNDIxMF9VU0IyKQkrPSBwaHktZXh5bm9zNDIxMC11c2IyLm8KK29iai0kKENPTkZJR19QSFlfRVhZTk9TNFgxMl9VU0IyKQkrPSBwaHktZXh5bm9zNHgxMi11c2IyLm8KK29iai0kKENPTkZJR19QSFlfRVhZTk9TNTI1MF9VU0IyKQkrPSBwaHktZXh5bm9zNTI1MC11c2IyLm8KK29iai0kKENPTkZJR19QSFlfWEdFTkUpCQkJKz0gcGh5LXhnZW5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1iY20ta29uYS11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktYmNtLWtvbmEtdXNiMi5jCmluZGV4IGVmYzVjMWEuLmU5NGY1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1iY20ta29uYS11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWJjbS1rb25hLXVzYjIuYwpAQCAtMTI4LDEwICsxMjgsOCBAQAogCiAJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LAogCQkJb2ZfcGh5X3NpbXBsZV94bGF0ZSk7Ci0JaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKQotCQlyZXR1cm4gUFRSX0VSUihwaHlfcHJvdmlkZXIpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwaHlfcHJvdmlkZXIpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY21fa29uYV91c2IyX2R0X2lkc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWNvcmUuYyBiL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMKaW5kZXggNmM3MzgzNy4uNjIzYjcxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWNvcmUuYworKysgYi9kcml2ZXJzL3BoeS9waHktY29yZS5jCkBAIC0yNzQsOCArMjc0LDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBoeV9wb3dlcl9vZmYpOwogCiAvKioKLSAqIG9mX3BoeV9nZXQoKSAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgcGh5IGJ5IHBoYW5kbGUKLSAqIEBkZXY6IGRldmljZSB0aGF0IHJlcXVlc3RzIHRoaXMgcGh5CisgKiBfb2ZfcGh5X2dldCgpIC0gbG9va3VwIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gYSBwaHkgYnkgcGhhbmRsZQorICogQG5wOiBkZXZpY2Vfbm9kZSBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBwaHkKICAqIEBpbmRleDogdGhlIGluZGV4IG9mIHRoZSBwaHkKICAqCiAgKiBSZXR1cm5zIHRoZSBwaHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwaGFuZGxlIHZhbHVlLApAQCAtMjg0LDIwICsyODQsMTcgQEAKICAqIG5vdCB5ZXQgbG9hZGVkLiBUaGlzIGZ1bmN0aW9uIHVzZXMgb2ZfeGxhdGUgY2FsbCBiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkCiAgKiB3aGlsZSByZWdpc3RlcmluZyB0aGUgcGh5X3Byb3ZpZGVyIHRvIGZpbmQgdGhlIHBoeSBpbnN0YW5jZS4KICAqLwotc3RhdGljIHN0cnVjdCBwaHkgKm9mX3BoeV9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCitzdGF0aWMgc3RydWN0IHBoeSAqX29mX3BoeV9nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4KQogewogCWludCByZXQ7CiAJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOwogCXN0cnVjdCBwaHkgKnBoeSA9IE5VTEw7CiAJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBhcmdzOwogCi0JcmV0ID0gb2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MoZGV2LT5vZl9ub2RlLCAicGh5cyIsICIjcGh5LWNlbGxzIiwKKwlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgInBoeXMiLCAiI3BoeS1jZWxscyIsCiAJCWluZGV4LCAmYXJncyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZGJnKGRldiwgImZhaWxlZCB0byBnZXQgcGh5IGluICVzIG5vZGVcbiIsCi0JCQlkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJaWYgKHJldCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JfQogCiAJbXV0ZXhfbG9jaygmcGh5X3Byb3ZpZGVyX211dGV4KTsKIAlwaHlfcHJvdmlkZXIgPSBvZl9waHlfcHJvdmlkZXJfbG9va3VwKGFyZ3MubnApOwpAQCAtMzE3LDYgKzMxNCwzNiBAQAogfQogCiAvKioKKyAqIG9mX3BoeV9nZXQoKSAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgcGh5IHVzaW5nIGEgZGV2aWNlX25vZGUuCisgKiBAbnA6IGRldmljZV9ub2RlIGZvciB3aGljaCB0byBnZXQgdGhlIHBoeQorICogQGNvbl9pZDogbmFtZSBvZiB0aGUgcGh5IGZyb20gZGV2aWNlJ3MgcG9pbnQgb2YgdmlldworICoKKyAqIFJldHVybnMgdGhlIHBoeSBkcml2ZXIsIGFmdGVyIGdldHRpbmcgYSByZWZjb3VudCB0byBpdDsgb3IKKyAqIC1FTk9ERVYgaWYgdGhlcmUgaXMgbm8gc3VjaCBwaHkuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKiBjYWxsaW5nIHBoeV9wdXQoKSB0byByZWxlYXNlIHRoYXQgY291bnQuCisgKi8KK3N0cnVjdCBwaHkgKm9mX3BoeV9nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqY29uX2lkKQoreworCXN0cnVjdCBwaHkgKnBoeSA9IE5VTEw7CisJaW50IGluZGV4ID0gMDsKKworCWlmIChjb25faWQpCisJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKG5wLCAicGh5LW5hbWVzIiwgY29uX2lkKTsKKworCXBoeSA9IF9vZl9waHlfZ2V0KG5wLCBpbmRleCk7CisJaWYgKElTX0VSUihwaHkpKQorCQlyZXR1cm4gcGh5OworCisJaWYgKCF0cnlfbW9kdWxlX2dldChwaHktPm9wcy0+b3duZXIpKQorCQlyZXR1cm4gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKKworCWdldF9kZXZpY2UoJnBoeS0+ZGV2KTsKKworCXJldHVybiBwaHk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9waHlfZ2V0KTsKKworLyoqCiAgKiBwaHlfcHV0KCkgLSByZWxlYXNlIHRoZSBQSFkKICAqIEBwaHk6IHRoZSBwaHkgcmV0dXJuZWQgYnkgcGh5X2dldCgpCiAgKgpAQCAtNDA3LDcgKzQzNCw3IEBACiAJaWYgKGRldi0+b2Zfbm9kZSkgewogCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhkZXYtPm9mX25vZGUsICJwaHktbmFtZXMiLAogCQkJc3RyaW5nKTsKLQkJcGh5ID0gb2ZfcGh5X2dldChkZXYsIGluZGV4KTsKKwkJcGh5ID0gX29mX3BoeV9nZXQoZGV2LT5vZl9ub2RlLCBpbmRleCk7CiAJfSBlbHNlIHsKIAkJcGh5ID0gcGh5X2xvb2t1cChkZXYsIHN0cmluZyk7CiAJfQpAQCAtNDk5LDYgKzUyNiwzNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9waHlfb3B0aW9uYWxfZ2V0KTsKIAogLyoqCisgKiBkZXZtX29mX3BoeV9nZXQoKSAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgcGh5LgorICogQGRldjogZGV2aWNlIHRoYXQgcmVxdWVzdHMgdGhpcyBwaHkKKyAqIEBucDogbm9kZSBjb250YWluaW5nIHRoZSBwaHkKKyAqIEBjb25faWQ6IG5hbWUgb2YgdGhlIHBoeSBmcm9tIGRldmljZSdzIHBvaW50IG9mIHZpZXcKKyAqCisgKiBHZXRzIHRoZSBwaHkgdXNpbmcgb2ZfcGh5X2dldCgpLCBhbmQgYXNzb2NpYXRlcyBhIGRldmljZSB3aXRoIGl0IHVzaW5nCisgKiBkZXZyZXMuIE9uIGRyaXZlciBkZXRhY2gsIHJlbGVhc2UgZnVuY3Rpb24gaXMgaW52b2tlZCBvbiB0aGUgZGV2cmVzIGRhdGEsCisgKiB0aGVuLCBkZXZyZXMgZGF0YSBpcyBmcmVlZC4KKyAqLworc3RydWN0IHBoeSAqZGV2bV9vZl9waHlfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IHBoeSAqKnB0ciwgKnBoeTsKKworCXB0ciA9IGRldnJlc19hbGxvYyhkZXZtX3BoeV9yZWxlYXNlLCBzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXBoeSA9IG9mX3BoeV9nZXQobnAsIGNvbl9pZCk7CisJaWYgKCFJU19FUlIocGh5KSkgeworCQkqcHRyID0gcGh5OworCQlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKwl9IGVsc2UgeworCQlkZXZyZXNfZnJlZShwdHIpOworCX0KKworCXJldHVybiBwaHk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX29mX3BoeV9nZXQpOworCisvKioKICAqIHBoeV9jcmVhdGUoKSAtIGNyZWF0ZSBhIG5ldyBwaHkKICAqIEBkZXY6IGRldmljZSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBuZXcgcGh5CiAgKiBAb3BzOiBmdW5jdGlvbiBwb2ludGVycyBmb3IgcGVyZm9ybWluZyBwaHkgb3BlcmF0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczQyMTAtdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczQyMTAtdXNiMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNmE1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNDIxMC11c2IyLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBTYW1zdW5nIFNvQyBVU0IgMS4xLzIuMCBQSFkgZHJpdmVyIC0gRXh5bm9zIDQyMTAgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOiBLYW1pbCBEZWJza2kgPGsuZGVic2tpQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSAicGh5LXNhbXN1bmctdXNiMi5oIgorCisvKiBFeHlub3MgVVNCIFBIWSByZWdpc3RlcnMgKi8KKworLyogUEhZIHBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUgkJCTB4MAorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9TVVNQRU5ECUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTBfUFdSCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkwX09UR19QV1IJQklUKDQpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9TTEVFUAkJQklUKDUpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMAkoIFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTBfU1VTUEVORCB8IFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTBfUFdSIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9PVEdfUFdSIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMF9TTEVFUCkKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTFfU1VTUEVORAlCSVQoNikKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9QSFkxX1BXUgkJQklUKDcpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMV9TTEVFUAkJQklUKDgpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfUEhZMSAoIFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTFfU1VTUEVORCB8IFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX1BIWTFfUFdSIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMV9TTEVFUCkKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMwX1NVU1BFTkQJQklUKDkpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzBfU0xFRVAJCUJJVCgxMCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMCAoIFwKKwlFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMwX1NVU1BFTkQgfCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMF9TTEVFUCkKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMxX1NVU1BFTkQJQklUKDExKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZUFdSX0hTSUMxX1NMRUVQCQlCSVQoMTIpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzEgKCBcCisJRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMV9TVVNQRU5EIHwgXAorCUVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzFfU0xFRVApCisKKy8qIFBIWSBjbG9jayBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEsJCQkweDQKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfTUFTSwkoMHgzIDw8IDApCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZRlNFTF9PRkZTRVQJMAorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfNDhNSFoJKDB4MCA8PCAwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMjRNSFoJKDB4MyA8PCAwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMTJNSFoJKDB4MiA8PCAwKQorCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZMF9JRF9QVUxMVVAJQklUKDIpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZMF9DT01NT05fT04JQklUKDQpCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlDTEtfUEhZMV9DT01NT05fT04JQklUKDcpCisKKy8qIFBIWSByZXNldCBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFlSU1QJCQkweDgKKworI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTAJCUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX09UR19ITElOSwkJQklUKDEpCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fT1RHX1BIWUxJTksJCUJJVCgyKQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTFfQUxMCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AwCQlCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AxUDIJCUJJVCg1KQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19BTEwJQklUKDYpCisjZGVmaW5lIEVYWU5PU180MjEwX1VSU1RDT05fSE9TVF9MSU5LX1AwCUJJVCg3KQorI2RlZmluZSBFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19QMQlCSVQoOCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfUDIJQklUKDkpCisKKy8qIElzb2xhdGlvbiwgY29uZmlndXJlZCBpbiB0aGUgcG93ZXIgbWFuYWdlbWVudCB1bml0ICovCisjZGVmaW5lIEVYWU5PU180MjEwX1VTQl9JU09MX0RFVklDRV9PRkZTRVQJMHg3MDQKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVNCX0lTT0xfREVWSUNFCQlCSVQoMCkKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVNCX0lTT0xfSE9TVF9PRkZTRVQJMHg3MDgKKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVNCX0lTT0xfSE9TVAkJQklUKDApCisKKy8qIFVTQllQSFkxIEZsb2F0aW5nIHByZXZlbnRpb24gKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfVVBIWTFDT04JCQkweDM0CisjZGVmaW5lIEVYWU5PU180MjEwX1VQSFkxQ09OX0ZMT0FUX1BSRVZFTlRJT04JMHgxCisKKy8qIE1vZGUgc3dpdGNoaW5nIFNVQiBEZXZpY2UgPC0+IEhvc3QgKi8KKyNkZWZpbmUgRVhZTk9TXzQyMTBfTU9ERV9TV0lUQ0hfT0ZGU0VUCQkweDIxYworI2RlZmluZSBFWFlOT1NfNDIxMF9NT0RFX1NXSVRDSF9NQVNLCQkxCisjZGVmaW5lIEVYWU5PU180MjEwX01PREVfU1dJVENIX0RFVklDRQkJMAorI2RlZmluZSBFWFlOT1NfNDIxMF9NT0RFX1NXSVRDSF9IT1NUCQkxCisKK2VudW0gZXh5bm9zNDIxMF9waHlfaWQgeworCUVYWU5PUzQyMTBfREVWSUNFLAorCUVYWU5PUzQyMTBfSE9TVCwKKwlFWFlOT1M0MjEwX0hTSUMwLAorCUVYWU5PUzQyMTBfSFNJQzEsCisJRVhZTk9TNDIxMF9OVU1fUEhZUywKK307CisKKy8qCisgKiBleHlub3M0MjEwX3JhdGVfdG9fY2xrKCkgY29udmVydHMgdGhlIHN1cHBsaWVkIGNsb2NrIHJhdGUgdG8gdGhlIHZhbHVlIHRoYXQKKyAqIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBwaHkgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXh5bm9zNDIxMF9yYXRlX3RvX2Nsayh1bnNpZ25lZCBsb25nIHJhdGUsIHUzMiAqcmVnKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMTIgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMTJNSFo7CisJCWJyZWFrOworCWNhc2UgMjQgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfMjRNSFo7CisJCWJyZWFrOworCWNhc2UgNDggKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfNDhNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0MjEwX2lzb2woc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QsIGJvb2wgb24pCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIG9mZnNldDsKKwl1MzIgbWFzazsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNDIxMF9ERVZJQ0U6CisJCW9mZnNldCA9IEVYWU5PU180MjEwX1VTQl9JU09MX0RFVklDRV9PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNDIxMF9VU0JfSVNPTF9ERVZJQ0U7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNDIxMF9IT1NUOgorCQlvZmZzZXQgPSBFWFlOT1NfNDIxMF9VU0JfSVNPTF9IT1NUX09GRlNFVDsKKwkJbWFzayA9IEVYWU5PU180MjEwX1VTQl9JU09MX0hPU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3BtdSwgb2Zmc2V0LCBtYXNrLCBvbiA/IDAgOiBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNDIxMF9waHlfcHdyKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0LCBib29sIG9uKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiByc3RiaXRzID0gMDsKKwl1MzIgcGh5cHdyID0gMDsKKwl1MzIgcnN0OworCXUzMiBwd3I7CisJdTMyIGNsazsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNDIxMF9ERVZJQ0U6CisJCXBoeXB3ciA9CUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMDsKKwkJcnN0Yml0cyA9CUVYWU5PU180MjEwX1VSU1RDT05fUEhZMDsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0MjEwX0hPU1Q6CisJCXBoeXB3ciA9CUVYWU5PU180MjEwX1VQSFlQV1JfUEhZMTsKKwkJcnN0Yml0cyA9CUVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9BTEwgfAorCQkJCUVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9QMCB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9QSFkxX1AxUDIgfAorCQkJCUVYWU5PU180MjEwX1VSU1RDT05fSE9TVF9MSU5LX0FMTCB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfUDA7CisJCXdyaXRlbChvbiwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWTFDT04pOworCQlicmVhazsKKwljYXNlIEVYWU5PUzQyMTBfSFNJQzA6CisJCXBoeXB3ciA9CUVYWU5PU180MjEwX1VQSFlQV1JfSFNJQzA7CisJCXJzdGJpdHMgPQlFWFlOT1NfNDIxMF9VUlNUQ09OX1BIWTFfUDFQMiB8CisJCQkJRVhZTk9TXzQyMTBfVVJTVENPTl9IT1NUX0xJTktfUDE7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNDIxMF9IU0lDMToKKwkJcGh5cHdyID0JRVhZTk9TXzQyMTBfVVBIWVBXUl9IU0lDMTsKKwkJcnN0Yml0cyA9CUVYWU5PU180MjEwX1VSU1RDT05fUEhZMV9QMVAyIHwKKwkJCQlFWFlOT1NfNDIxMF9VUlNUQ09OX0hPU1RfTElOS19QMjsKKwkJYnJlYWs7CisJfTsKKworCWlmIChvbikgeworCQljbGsgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZQ0xLKTsKKwkJY2xrICY9IH5FWFlOT1NfNDIxMF9VUEhZQ0xLX1BIWUZTRUxfTUFTSzsKKwkJY2xrIHw9IGRydi0+cmVmX3JlZ192YWwgPDwgRVhZTk9TXzQyMTBfVVBIWUNMS19QSFlGU0VMX09GRlNFVDsKKwkJd3JpdGVsKGNsaywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWUNMSyk7CisKKwkJcHdyID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzQyMTBfVVBIWVBXUik7CisJCXB3ciAmPSB+cGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZUFdSKTsKKworCQlyc3QgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZUlNUKTsKKwkJcnN0IHw9IHJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlSU1QpOworCQl1ZGVsYXkoMTApOworCQlyc3QgJj0gfnJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlSU1QpOworCQkvKiBUaGUgZm9sbG93aW5nIGRlbGF5IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHJlc2V0IHNlcXVlbmNlIHRvIGJlCisJCSAqIGNvbXBsZXRlZCAqLworCQl1ZGVsYXkoODApOworCX0gZWxzZSB7CisJCXB3ciA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180MjEwX1VQSFlQV1IpOworCQlwd3IgfD0gcGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNDIxMF9VUEhZUFdSKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNDIxMF9wb3dlcl9vbihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwkvKiBPcmRlciBvZiBpbml0aWFsaXNhdGlvbiBpcyBpbXBvcnRhbnQgLSBmaXJzdCBwb3dlciB0aGVuIGlzb2xhdGlvbiAqLworCWV4eW5vczQyMTBfcGh5X3B3cihpbnN0LCAxKTsKKwlleHlub3M0MjEwX2lzb2woaW5zdCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHlub3M0MjEwX3Bvd2VyX29mZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwlleHlub3M0MjEwX2lzb2woaW5zdCwgMSk7CisJZXh5bm9zNDIxMF9waHlfcHdyKGluc3QsIDApOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSBleHlub3M0MjEwX3BoeXNbXSA9IHsKKwl7CisJCS5sYWJlbAkJPSAiZGV2aWNlIiwKKwkJLmlkCQk9IEVYWU5PUzQyMTBfREVWSUNFLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaG9zdCIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hPU1QsCisJCS5wb3dlcl9vbgk9IGV4eW5vczQyMTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0MjEwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMCIsCisJCS5pZAkJPSBFWFlOT1M0MjEwX0hTSUMwLAorCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzEiLAorCQkuaWQJCT0gRVhZTk9TNDIxMF9IU0lDMSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNDIxMF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczQyMTBfcG93ZXJfb2ZmLAorCX0sCisJe30sCit9OworCitjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zNDIxMF91c2IyX3BoeV9jb25maWcgPSB7CisJLmhhc19tb2RlX3N3aXRjaAk9IDAsCisJLm51bV9waHlzCQk9IEVYWU5PUzQyMTBfTlVNX1BIWVMsCisJLnBoeXMJCQk9IGV4eW5vczQyMTBfcGh5cywKKwkucmF0ZV90b19jbGsJCT0gZXh5bm9zNDIxMF9yYXRlX3RvX2NsaywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNHgxMi11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNHgxMi11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyYTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0eDEyLXVzYjIuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIFNhbXN1bmcgU29DIFVTQiAxLjEvMi4wIFBIWSBkcml2ZXIgLSBFeHlub3MgNHgxMiBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlICJwaHktc2Ftc3VuZy11c2IyLmgiCisKKy8qIEV4eW5vcyBVU0IgUEhZIHJlZ2lzdGVycyAqLworCisvKiBQSFkgcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSCQkJMHgwCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1NVU1BFTkQJQklUKDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfUEhZMF9QV1IJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTBfT1RHX1BXUglCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1NMRUVQCQlCSVQoNSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwICggXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMF9TVVNQRU5EIHwgXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMF9QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX09UR19QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkwX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfUEhZMV9TVVNQRU5ECUJJVCg2KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTFfUFdSCQlCSVQoNykKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxX1NMRUVQCQlCSVQoOCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxICggXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMV9TVVNQRU5EIHwgXAorCUVYWU5PU180eDEyX1VQSFlQV1JfUEhZMV9QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9QSFkxX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzBfU1VTUEVORAlCSVQoOSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMF9QV1IJCUJJVCgxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMF9TTEVFUAkJQklUKDExKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwICggXAorCUVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzBfU1VTUEVORCB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwX1BXUiB8IFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwX1NMRUVQKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzFfU1VTUEVORAlCSVQoMTIpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzFfUFdSCQlCSVQoMTMpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlQV1JfSFNJQzFfU0xFRVAJCUJJVCgxNCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMSAoIFwKKwlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMxX1NVU1BFTkQgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMV9QV1IgfCBcCisJRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMV9TTEVFUCkKKworLyogUEhZIGNsb2NrIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMSwkJCTB4NAorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF9NQVNLCSgweDcgPDwgMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX09GRlNFVAkwCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF85TUhaNgkoMHgwIDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xME1IWgkoMHgxIDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xMk1IWgkoMHgyIDw8IDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF8xOU1IWjIJKDB4MyA8PCAwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMjBNSFoJKDB4NCA8PCAwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMjRNSFoJKDB4NSA8PCAwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfNTBNSFoJKDB4NyA8PCAwKQorCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZMF9JRF9QVUxMVVAJQklUKDMpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZMF9DT01NT05fT04JQklUKDQpCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZMV9DT01NT05fT04JQklUKDcpCisKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS19NQVNLCSgweDdmIDw8IDEwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUEhZQ0xLX0hTSUNfUkVGQ0xLX09GRlNFVCAgMTAKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xMk1IWgkoMHgyNCA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xNU1IWgkoMHgxYyA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xNk1IWgkoMHgxYSA8PCAxMCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVBIWUNMS19IU0lDX1JFRkNMS18xOU1IWjIJKDB4MTUgPDwgMTApCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlDTEtfSFNJQ19SRUZDTEtfMjBNSFoJKDB4MTQgPDwgMTApCisKKy8qIFBIWSByZXNldCBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU180eDEyX1VQSFlSU1QJCQkweDgKKworI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX1BIWTAJCUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX09UR19ITElOSwkJQklUKDEpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fT1RHX1BIWUxJTksJCUJJVCgyKQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfUEhZCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9QSFkxCQlCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9IU0lDMAkJQklUKDUpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fSFNJQzEJCUJJVCg2KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfTElOS19BTEwJQklUKDcpCisjZGVmaW5lIEVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9MSU5LX1AwCUJJVCg4KQorI2RlZmluZSBFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfTElOS19QMQlCSVQoOSkKKyNkZWZpbmUgRVhZTk9TXzR4MTJfVVJTVENPTl9IT1NUX0xJTktfUDIJQklUKDEwKQorCisvKiBJc29sYXRpb24sIGNvbmZpZ3VyZWQgaW4gdGhlIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCAqLworI2RlZmluZSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9PRkZTRVQJCTB4NzA0CisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX09URwkJQklUKDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX0hTSUMwX09GRlNFVAkweDcwOAorI2RlZmluZSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMAkJQklUKDApCisjZGVmaW5lIEVYWU5PU180eDEyX1VTQl9JU09MX0hTSUMxX09GRlNFVAkweDcwYworI2RlZmluZSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9IU0lDMQkJQklUKDApCisKKy8qIE1vZGUgc3dpdGNoaW5nIFNVQiBEZXZpY2UgPC0+IEhvc3QgKi8KKyNkZWZpbmUgRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfT0ZGU0VUCQkweDIxYworI2RlZmluZSBFWFlOT1NfNHgxMl9NT0RFX1NXSVRDSF9NQVNLCQkxCisjZGVmaW5lIEVYWU5PU180eDEyX01PREVfU1dJVENIX0RFVklDRQkJMAorI2RlZmluZSBFWFlOT1NfNHgxMl9NT0RFX1NXSVRDSF9IT1NUCQkxCisKK2VudW0gZXh5bm9zNHgxMl9waHlfaWQgeworCUVYWU5PUzR4MTJfREVWSUNFLAorCUVYWU5PUzR4MTJfSE9TVCwKKwlFWFlOT1M0eDEyX0hTSUMwLAorCUVYWU5PUzR4MTJfSFNJQzEsCisJRVhZTk9TNHgxMl9OVU1fUEhZUywKK307CisKKy8qCisgKiBleHlub3M0eDEyX3JhdGVfdG9fY2xrKCkgY29udmVydHMgdGhlIHN1cHBsaWVkIGNsb2NrIHJhdGUgdG8gdGhlIHZhbHVlIHRoYXQKKyAqIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBwaHkgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXh5bm9zNHgxMl9yYXRlX3RvX2Nsayh1bnNpZ25lZCBsb25nIHJhdGUsIHUzMiAqcmVnKQoreworCS8qIEVYWU5PU180eDEyX1VQSFlDTEtfUEhZRlNFTF9NQVNLICovCisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDk2MDAgKiBLSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfOU1IWjY7CisJCWJyZWFrOworCWNhc2UgMTAgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMTBNSFo7CisJCWJyZWFrOworCWNhc2UgMTIgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMTJNSFo7CisJCWJyZWFrOworCWNhc2UgMTkyMDAgKiBLSFo6CisJCSpyZWcgPSBFWFlOT1NfNHgxMl9VUEhZQ0xLX1BIWUZTRUxfMTlNSFoyOworCQlicmVhazsKKwljYXNlIDIwICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzIwTUhaOworCQlicmVhazsKKwljYXNlIDI0ICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzI0TUhaOworCQlicmVhazsKKwljYXNlIDUwICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMXzUwTUhaOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNHgxMl9pc29sKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0LCBib29sIG9uKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiBvZmZzZXQ7CisJdTMyIG1hc2s7CisKKwlzd2l0Y2ggKGluc3QtPmNmZy0+aWQpIHsKKwljYXNlIEVYWU5PUzR4MTJfREVWSUNFOgorCWNhc2UgRVhZTk9TNHgxMl9IT1NUOgorCQlvZmZzZXQgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNHgxMl9VU0JfSVNPTF9PVEc7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IU0lDMDoKKwkJb2Zmc2V0ID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzBfT0ZGU0VUOworCQltYXNrID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzA7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IU0lDMToKKwkJb2Zmc2V0ID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzFfT0ZGU0VUOworCQltYXNrID0gRVhZTk9TXzR4MTJfVVNCX0lTT0xfSFNJQzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3BtdSwgb2Zmc2V0LCBtYXNrLCBvbiA/IDAgOiBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNHgxMl9zZXR1cF9jbGsoc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QpCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIGNsazsKKworCWNsayA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlDTEspOworCWNsayAmPSB+RVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX01BU0s7CisJY2xrIHw9IGRydi0+cmVmX3JlZ192YWwgPDwgRVhZTk9TXzR4MTJfVVBIWUNMS19QSFlGU0VMX09GRlNFVDsKKwl3cml0ZWwoY2xrLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZQ0xLKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNHgxMl9waHlfcHdyKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0LCBib29sIG9uKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiByc3RiaXRzID0gMDsKKwl1MzIgcGh5cHdyID0gMDsKKwl1MzIgcnN0OworCXUzMiBwd3I7CisJdTMyIG1vZGUgPSAwOworCXUzMiBzd2l0Y2hfbW9kZSA9IDA7CisKKwlzd2l0Y2ggKGluc3QtPmNmZy0+aWQpIHsKKwljYXNlIEVYWU5PUzR4MTJfREVWSUNFOgorCQlwaHlwd3IgPQlFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTA7CisJCXJzdGJpdHMgPQlFWFlOT1NfNHgxMl9VUlNUQ09OX1BIWTA7CisJCW1vZGUgPQkJRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfREVWSUNFOworCQlzd2l0Y2hfbW9kZSA9CTE7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IT1NUOgorCQlwaHlwd3IgPQlFWFlOT1NfNHgxMl9VUEhZUFdSX1BIWTE7CisJCXJzdGJpdHMgPQlFWFlOT1NfNHgxMl9VUlNUQ09OX0hPU1RfUEhZOworCQltb2RlID0JCUVYWU5PU180eDEyX01PREVfU1dJVENIX0hPU1Q7CisJCXN3aXRjaF9tb2RlID0JMTsKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M0eDEyX0hTSUMwOgorCQlwaHlwd3IgPQlFWFlOT1NfNHgxMl9VUEhZUFdSX0hTSUMwOworCQlyc3RiaXRzID0JRVhZTk9TXzR4MTJfVVJTVENPTl9IU0lDMSB8CisJCQkJRVhZTk9TXzR4MTJfVVJTVENPTl9IT1NUX0xJTktfUDAgfAorCQkJCUVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9QSFk7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNHgxMl9IU0lDMToKKwkJcGh5cHdyID0JRVhZTk9TXzR4MTJfVVBIWVBXUl9IU0lDMTsKKwkJcnN0Yml0cyA9CUVYWU5PU180eDEyX1VSU1RDT05fSFNJQzEgfAorCQkJCUVYWU5PU180eDEyX1VSU1RDT05fSE9TVF9MSU5LX1AxOworCQlicmVhazsKKwl9OworCisJaWYgKG9uKSB7CisJCWlmIChzd2l0Y2hfbW9kZSkKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhkcnYtPnJlZ19zeXMsCisJCQkJCSAgIEVYWU5PU180eDEyX01PREVfU1dJVENIX09GRlNFVCwKKwkJCQkJICAgRVhZTk9TXzR4MTJfTU9ERV9TV0lUQ0hfTUFTSywgbW9kZSk7CisKKwkJcHdyID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzR4MTJfVVBIWVBXUik7CisJCXB3ciAmPSB+cGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZUFdSKTsKKworCQlyc3QgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZUlNUKTsKKwkJcnN0IHw9IHJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlSU1QpOworCQl1ZGVsYXkoMTApOworCQlyc3QgJj0gfnJzdGJpdHM7CisJCXdyaXRlbChyc3QsIGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlSU1QpOworCQkvKiBUaGUgZm9sbG93aW5nIGRlbGF5IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHJlc2V0IHNlcXVlbmNlIHRvIGJlCisJCSAqIGNvbXBsZXRlZCAqLworCQl1ZGVsYXkoODApOworCX0gZWxzZSB7CisJCXB3ciA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU180eDEyX1VQSFlQV1IpOworCQlwd3IgfD0gcGh5cHdyOworCQl3cml0ZWwocHdyLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNHgxMl9VUEhZUFdSKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNHgxMl9wb3dlcl9vbihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKworCWluc3QtPmVuYWJsZWQgPSAxOworCWV4eW5vczR4MTJfc2V0dXBfY2xrKGluc3QpOworCWV4eW5vczR4MTJfcGh5X3B3cihpbnN0LCAxKTsKKwlleHlub3M0eDEyX2lzb2woaW5zdCwgMCk7CisKKwkvKiBQb3dlciBvbiB0aGUgZGV2aWNlLCBhcyBpdCBpcyBuZWNlc3NhcnkgZm9yIEhTSUMgdG8gd29yayAqLworCWlmIChpbnN0LT5jZmctPmlkID09IEVYWU5PUzR4MTJfSFNJQzApIHsKKwkJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmRldmljZSA9CisJCQkJCSZkcnYtPmluc3RhbmNlc1tFWFlOT1M0eDEyX0RFVklDRV07CisJCWV4eW5vczR4MTJfcGh5X3B3cihkZXZpY2UsIDEpOworCQlleHlub3M0eDEyX2lzb2woZGV2aWNlLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHlub3M0eDEyX3Bvd2VyX29mZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqZGV2aWNlID0KKwkJCQkJJmRydi0+aW5zdGFuY2VzW0VYWU5PUzR4MTJfREVWSUNFXTsKKworCWluc3QtPmVuYWJsZWQgPSAwOworCWV4eW5vczR4MTJfaXNvbChpbnN0LCAxKTsKKwlleHlub3M0eDEyX3BoeV9wd3IoaW5zdCwgMCk7CisKKwlpZiAoaW5zdC0+Y2ZnLT5pZCA9PSBFWFlOT1M0eDEyX0hTSUMwICYmICFkZXZpY2UtPmVuYWJsZWQpIHsKKwkJZXh5bm9zNHgxMl9pc29sKGRldmljZSwgMSk7CisJCWV4eW5vczR4MTJfcGh5X3B3cihkZXZpY2UsIDApOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgZXh5bm9zNHgxMl9waHlzW10gPSB7CisJeworCQkubGFiZWwJCT0gImRldmljZSIsCisJCS5pZAkJPSBFWFlOT1M0eDEyX0RFVklDRSwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNHgxMl9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczR4MTJfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhvc3QiLAorCQkuaWQJCT0gRVhZTk9TNHgxMl9IT1NULAorCQkucG93ZXJfb24JPSBleHlub3M0eDEyX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNHgxMl9wb3dlcl9vZmYsCisJfSwKKwl7CisJCS5sYWJlbAkJPSAiaHNpYzAiLAorCQkuaWQJCT0gRVhZTk9TNHgxMl9IU0lDMCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNHgxMl9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczR4MTJfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMxIiwKKwkJLmlkCQk9IEVYWU5PUzR4MTJfSFNJQzEsCisJCS5wb3dlcl9vbgk9IGV4eW5vczR4MTJfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M0eDEyX3Bvd2VyX29mZiwKKwl9LAorCXt9LAorfTsKKworY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczR4MTJfdXNiMl9waHlfY29uZmlnID0geworCS5oYXNfbW9kZV9zd2l0Y2gJPSAxLAorCS5udW1fcGh5cwkJPSBFWFlOT1M0eDEyX05VTV9QSFlTLAorCS5waHlzCQkJPSBleHlub3M0eDEyX3BoeXMsCisJLnJhdGVfdG9fY2xrCQk9IGV4eW5vczR4MTJfcmF0ZV90b19jbGssCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczUyNTAtc2F0YS5jIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczUyNTAtc2F0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzYxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC1zYXRhLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBTYW1zdW5nIFNBVEEgU2VyRGVzKFBIWSkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOiBHaXJpc2ggSyBTIDxrcy5naXJpQHNhbXN1bmcuY29tPgorICogICAgICAgICBZdXZhcmFqIEt1bWFyIEMgRCA8eXV2YXJhai5jZEBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorCisjZGVmaW5lIFNBVEFQSFlfQ09OVFJPTF9PRkZTRVQJCTB4MDcyNAorI2RlZmluZSBFWFlOT1M1X1NBVEFQSFlfUE1VX0VOQUJMRQlCSVQoMCkKKyNkZWZpbmUgRVhZTk9TNV9TQVRBX1JFU0VUCQkweDQKKyNkZWZpbmUgUkVTRVRfR0xPQkFMX1JTVF9OCQlCSVQoMCkKKyNkZWZpbmUgUkVTRVRfQ01OX1JTVF9OCQkJQklUKDEpCisjZGVmaW5lIFJFU0VUX0NNTl9CTE9DS19SU1RfTgkJQklUKDIpCisjZGVmaW5lIFJFU0VUX0NNTl9JMkNfUlNUX04JCUJJVCgzKQorI2RlZmluZSBSRVNFVF9UWF9SWF9QSVBFX1JTVF9OCQlCSVQoNCkKKyNkZWZpbmUgUkVTRVRfVFhfUlhfQkxPQ0tfUlNUX04JCUJJVCg1KQorI2RlZmluZSBSRVNFVF9UWF9SWF9JMkNfUlNUX04JCShCSVQoNikgfCBCSVQoNykpCisjZGVmaW5lIExJTktfUkVTRVQJCQkweGYwMDAwCisjZGVmaW5lIEVYWU5PUzVfU0FUQV9NT0RFMAkJMHgxMAorI2RlZmluZSBTQVRBX1NQRF9HRU4zCQkJQklUKDEpCisjZGVmaW5lIEVYWU5PUzVfU0FUQV9DVFJMMAkJMHgxNAorI2RlZmluZSBDVFJMMF9QMF9QSFlfQ0FMSUJSQVRFRF9TRUwJQklUKDkpCisjZGVmaW5lIENUUkwwX1AwX1BIWV9DQUxJQlJBVEVECQlCSVQoOCkKKyNkZWZpbmUgRVhZTk9TNV9TQVRBX1BIU0FUQV9DVFJMTQkweGUwCisjZGVmaW5lIFBIQ1RSTE1fUkVGX1JBVEUJCUJJVCgxKQorI2RlZmluZSBQSENUUkxNX0hJR0hfU1BFRUQJCUJJVCgwKQorI2RlZmluZSBFWFlOT1M1X1NBVEFfUEhTQVRBX1NUQVRNCTB4ZjAKKyNkZWZpbmUgUEhTVEFUTV9QTExfTE9DS0VECQlCSVQoMCkKKworI2RlZmluZSBQSFlfUExMX1RJTUVPVVQgKHVzZWNzX3RvX2ppZmZpZXMoMTAwMCkpCisKK3N0cnVjdCBleHlub3Nfc2F0YV9waHkgeworCXN0cnVjdCBwaHkgKnBoeTsKKwlzdHJ1Y3QgY2xrICpwaHljbGs7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCByZWdtYXAgKnBtdXJlZzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworfTsKKworc3RhdGljIGludCB3YWl0X2Zvcl9yZWdfc3RhdHVzKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywgdTMyIGNoZWNrYml0LAorCQkJCXUzMiBzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFBIWV9QTExfVElNRU9VVDsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoKHJlYWRsKGJhc2UgKyByZWcpICYgY2hlY2tiaXQpID09IHN0YXR1cykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IGV4eW5vc19zYXRhX3BoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IGV4eW5vc19zYXRhX3BoeSAqc2F0YV9waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoc2F0YV9waHktPnBtdXJlZywgU0FUQVBIWV9DT05UUk9MX09GRlNFVCwKKwkJCUVYWU5PUzVfU0FUQVBIWV9QTVVfRU5BQkxFLCB0cnVlKTsKKworfQorCitzdGF0aWMgaW50IGV4eW5vc19zYXRhX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBleHlub3Nfc2F0YV9waHkgKnNhdGFfcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHNhdGFfcGh5LT5wbXVyZWcsIFNBVEFQSFlfQ09OVFJPTF9PRkZTRVQsCisJCQlFWFlOT1M1X1NBVEFQSFlfUE1VX0VOQUJMRSwgZmFsc2UpOworCit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX3NhdGFfcGh5X2luaXQoc3RydWN0IHBoeSAqcGh5KQoreworCXUzMiB2YWwgPSAwOworCWludCByZXQgPSAwOworCXU4IGJ1ZltdID0geyAweDNhLCAweDBiIH07CisJc3RydWN0IGV4eW5vc19zYXRhX3BoeSAqc2F0YV9waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhzYXRhX3BoeS0+cG11cmVnLCBTQVRBUEhZX0NPTlRST0xfT0ZGU0VULAorCQkJRVhZTk9TNV9TQVRBUEhZX1BNVV9FTkFCTEUsIHRydWUpOworCWlmIChyZXQgIT0gMCkKKwkJZGV2X2Vycigmc2F0YV9waHktPnBoeS0+ZGV2LCAicGh5IGluaXQgZmFpbGVkXG4iKTsKKworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKwl2YWwgfD0gUkVTRVRfR0xPQkFMX1JTVF9OIHwgUkVTRVRfQ01OX1JTVF9OIHwgUkVTRVRfQ01OX0JMT0NLX1JTVF9OCisJCXwgUkVTRVRfQ01OX0kyQ19SU1RfTiB8IFJFU0VUX1RYX1JYX1BJUEVfUlNUX04KKwkJfCBSRVNFVF9UWF9SWF9CTE9DS19SU1RfTiB8IFJFU0VUX1RYX1JYX0kyQ19SU1RfTjsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisJdmFsIHw9IExJTktfUkVTRVQ7CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCXZhbCB8PSBSRVNFVF9DTU5fUlNUX047CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUkVTRVQpOworCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNKTsKKwl2YWwgJj0gflBIQ1RSTE1fUkVGX1JBVEU7CisJd3JpdGVsKHZhbCwgc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNKTsKKworCS8qIEhpZ2ggc3BlZWQgZW5hYmxlIGZvciBHZW4zICovCisJdmFsID0gcmVhZGwoc2F0YV9waHktPnJlZ3MgKyBFWFlOT1M1X1NBVEFfUEhTQVRBX0NUUkxNKTsKKwl2YWwgfD0gUEhDVFJMTV9ISUdIX1NQRUVEOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1BIU0FUQV9DVFJMTSk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9DVFJMMCk7CisJdmFsIHw9IENUUkwwX1AwX1BIWV9DQUxJQlJBVEVEX1NFTCB8IENUUkwwX1AwX1BIWV9DQUxJQlJBVEVEOworCXdyaXRlbCh2YWwsIHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX0NUUkwwKTsKKworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX01PREUwKTsKKwl2YWwgfD0gU0FUQV9TUERfR0VOMzsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9NT0RFMCk7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoc2F0YV9waHktPmNsaWVudCwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiByZWxlYXNlIGNtdSByZXNldCAqLworCXZhbCA9IHJlYWRsKHNhdGFfcGh5LT5yZWdzICsgRVhZTk9TNV9TQVRBX1JFU0VUKTsKKwl2YWwgJj0gflJFU0VUX0NNTl9SU1RfTjsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwl2YWwgPSByZWFkbChzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisJdmFsIHw9IFJFU0VUX0NNTl9SU1RfTjsKKwl3cml0ZWwodmFsLCBzYXRhX3BoeS0+cmVncyArIEVYWU5PUzVfU0FUQV9SRVNFVCk7CisKKwlyZXQgPSB3YWl0X2Zvcl9yZWdfc3RhdHVzKHNhdGFfcGh5LT5yZWdzLAorCQkJCUVYWU5PUzVfU0FUQV9QSFNBVEFfU1RBVE0sCisJCQkJUEhTVEFUTV9QTExfTE9DS0VELCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycigmc2F0YV9waHktPnBoeS0+ZGV2LAorCQkJIlBIWSBQTEwgbG9ja2luZyBmYWlsZWRcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X29wcyBleHlub3Nfc2F0YV9waHlfb3BzID0geworCS5pbml0CQk9IGV4eW5vc19zYXRhX3BoeV9pbml0LAorCS5wb3dlcl9vbgk9IGV4eW5vc19zYXRhX3BoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gZXh5bm9zX3NhdGFfcGh5X3Bvd2VyX29mZiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGV4eW5vc19zYXRhX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBleHlub3Nfc2F0YV9waHkgKnNhdGFfcGh5OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlpbnQgcmV0ID0gMDsKKworCXNhdGFfcGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzYXRhX3BoeSksIEdGUF9LRVJORUwpOworCWlmICghc2F0YV9waHkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCXNhdGFfcGh5LT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHNhdGFfcGh5LT5yZWdzKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnJlZ3MpOworCisJc2F0YV9waHktPnBtdXJlZyA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUoZGV2LT5vZl9ub2RlLAorCQkJCQkic2Ftc3VuZyxzeXNjb24tcGhhbmRsZSIpOworCWlmIChJU19FUlIoc2F0YV9waHktPnBtdXJlZykpIHsKKwkJZGV2X2VycihkZXYsICJzeXNjb24gcmVnbWFwIGxvb2t1cCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnBtdXJlZyk7CisJfQorCisJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLAorCQkJInNhbXN1bmcsZXh5bm9zLXNhdGFwaHktaTJjLXBoYW5kbGUiLCAwKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJc2F0YV9waHktPmNsaWVudCA9IG9mX2ZpbmRfaTJjX2RldmljZV9ieV9ub2RlKG5vZGUpOworCWlmICghc2F0YV9waHktPmNsaWVudCkKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBzYXRhX3BoeSk7CisKKwlzYXRhX3BoeS0+cGh5Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInNhdGFfcGh5Y3RybCIpOworCWlmIChJU19FUlIoc2F0YV9waHktPnBoeWNsaykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGNsayBmb3IgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnBoeWNsayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNhdGFfcGh5LT5waHljbGspOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBzb3VyY2UgY2xrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzYXRhX3BoeS0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgJmV4eW5vc19zYXRhX3BoeV9vcHMsIE5VTEwpOworCWlmIChJU19FUlIoc2F0YV9waHktPnBoeSkpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhdGFfcGh5LT5waHljbGspOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9waHktPnBoeSk7CisJfQorCisJcGh5X3NldF9kcnZkYXRhKHNhdGFfcGh5LT5waHksIHNhdGFfcGh5KTsKKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwKKwkJCQkJb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisJaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzYXRhX3BoeS0+cGh5Y2xrKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZXh5bm9zX3NhdGFfcGh5X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczUyNTAtc2F0YS1waHkiIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGV4eW5vc19zYXRhX3BoeV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV4eW5vc19zYXRhX3BoeV9kcml2ZXIgPSB7CisJLnByb2JlCT0gZXh5bm9zX3NhdGFfcGh5X3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5vZl9tYXRjaF90YWJsZQk9IGV4eW5vc19zYXRhX3BoeV9vZl9tYXRjaCwKKwkJLm5hbWUgID0gInNhbXN1bmcsc2F0YS1waHkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9Cit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihleHlub3Nfc2F0YV9waHlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNlckRlcyBQSFkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIFYyIik7CitNT0RVTEVfQVVUSE9SKCJHaXJpc2ggSyBTIDxrcy5naXJpQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiWXV2YXJhaiBDIEQgPHl1dmFyYWouY2RAc2Ftc3VuZy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxNzlhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1MjUwLXVzYjIuYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIFNhbXN1bmcgU29DIFVTQiAxLjEvMi4wIFBIWSBkcml2ZXIgLSBFeHlub3MgNTI1MCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlICJwaHktc2Ftc3VuZy11c2IyLmgiCisKKy8qIEV4eW5vcyBVU0IgUEhZIHJlZ2lzdGVycyAqLworI2RlZmluZSBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfQ1JZU1RBTAkweDAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfUkVGQ0xLU0VMX1hPCTB4MQorI2RlZmluZSBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfQ0xLQ09SRQkweDIKKworI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzlNSFo2CQkweDAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfRlNFTF8xME1IWgkJMHgxCisjZGVmaW5lIEVYWU5PU181MjUwX0ZTRUxfMTJNSFoJCTB4MgorI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzE5TUhaMgkJMHgzCisjZGVmaW5lIEVYWU5PU181MjUwX0ZTRUxfMjBNSFoJCTB4NAorI2RlZmluZSBFWFlOT1NfNTI1MF9GU0VMXzI0TUhaCQkweDUKKyNkZWZpbmUgRVhZTk9TXzUyNTBfRlNFTF81ME1IWgkJMHg3CisKKy8qIE5vcm1hbCBob3N0ICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMAkJCTB4MAorCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9QSFlTV1JTVEFMTAkJQklUKDMxKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUkVGQ0xLU0VMX1NISUZUCTE5CisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9SRUZDTEtTRUxfTUFTSwlcCisJCSgweDMgPDwgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1JFRkNMS1NFTF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZTRUxfU0hJRlQJCTE2CisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GU0VMX01BU0sgXAorCQkoMHg3IDw8IEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GU0VMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVEVTVEJVUk5JTgkJQklUKDExKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUkVURU5BQkxFCQlCSVQoMTApCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9DT01NT05fT05fTgkJQklUKDkpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9WQVRFU1RFTkJfTUFTSwkJKDB4MyA8PCA3KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfVkFURVNURU5CX0RVQUwJCSgweDAgPDwgNykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1ZBVEVTVEVOQl9JRDAJCSgweDEgPDwgNykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1ZBVEVTVEVOQl9BTkFMT0dURVNUCSgweDIgPDwgNykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1NJRERRCQkJQklUKDYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNMRUVQCQlCSVQoNSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZPUkNFU1VTUEVORAkJQklUKDQpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9XT1JESU5URVJGQUNFCQlCSVQoMykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1VUTUlTV1JTVAkJQklUKDIpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9MSU5LU1dSU1QJCUJJVCgxKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUEhZU1dSU1QJCUJJVCgwKQorCisvKiBIU0lDMCAmIEhTSUMxICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMQkJCTB4MTAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwyCQkJMHgyMAorCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtTRUxfTUFTSwkJKDB4MyA8PCAyMykKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS1NFTF9ERUZBVUxUCSgweDIgPDwgMjMpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfTUFTSwkJKDB4N2YgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMTIJCSgweDI0IDw8IDE2KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLRElWXzE1CQkoMHgxYyA8PCAxNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl8xNgkJKDB4MWEgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMTlfMgkJKDB4MTUgPDwgMTYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9SRUZDTEtESVZfMjAJCSgweDE0IDw8IDE2KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfU0lERFEJCQlCSVQoNikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX0ZPUkNFU0xFRVAJCUJJVCg1KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfRk9SQ0VTVVNQRU5ECQlCSVQoNCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1dPUkRJTlRFUkZBQ0UJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfVVRNSVNXUlNUCQlCSVQoMikKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1BIWVNXUlNUCQlCSVQoMCkKKworLyogRUhDSSBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTAkJCTB4MzAKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1JYQUxJR04JCUJJVCgyOSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1I0CQlCSVQoMjgpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSOAkJQklUKDI3KQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRU5BSU5DUjE2CQlCSVQoMjYpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9BVVRPUFBET05PVlJDVVJFTglCSVQoMjUpCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9GTEFESlZBTDBfU0hJRlQJMTkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9NQVNLCVwKKwkJKDB4M2YgPDwgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMV9TSElGVAkxMworI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwxX01BU0sJXAorCQkoMHgzZiA8PCBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwxX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRkxBREpWQUwyX1NISUZUCTcKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9NQVNLCVwKKwkJKDB4M2YgPDwgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMMF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMSE9TVF9TSElGVAkxCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9GTEFESlZBTEhPU1RfTUFTSyBcCisJCSgweDEgPDwgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0ZMQURKVkFMSE9TVF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX1NJTVVMQVRJT05NT0RFCQlCSVQoMCkKKworLyogT0hDSSBjb250cm9sICovCisjZGVmaW5lIEVYWU5PU181MjUwX0hPU1RPSENJQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzQKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMX0ZSQU1FTEVOVkFMX1NISUZUCTEKKyNkZWZpbmUgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMX0ZSQU1FTEVOVkFMX01BU0sgXAorCQkoMHgzZmYgPDwgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMX0ZSQU1FTEVOVkFMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9IT1NUT0hDSUNUUkxfRlJBTUVMRU5WQUxFTgkJQklUKDApCisKKy8qIFVTQk9URyAqLworI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVMJCQkJMHgzOAorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZTElOS19TV19SRVNFVAkJQklUKDE0KQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfTElOS19TV19SU1RfVU9URwkJQklUKDEzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUEhZX1NXX1JTVAkJQklUKDEyKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX1NISUZUCQk5CisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19SRUZDTEtTRUxfTUFTSyBcCisJCSgweDMgPDwgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1JFRkNMS1NFTF9TSElGVCkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0lEX1BVTExVUAkJCUJJVCg4KQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfQ09NTU9OX09OCQkJQklUKDcpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX1NISUZUCQk0CisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX01BU0sgXAorCQkoMHgzIDw8IEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX1NISUZUKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU0xFRVAJCUJJVCgzKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfT1RHRElTQUJMRQkJQklUKDIpCisjZGVmaW5lIEVYWU5PU181MjUwX1VTQk9UR1NZU19TSUREUV9VT1RHCQlCSVQoMSkKKyNkZWZpbmUgRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZPUkNFX1NVU1BFTkQJCUJJVCgwKQorCisvKiBJc29sYXRpb24sIGNvbmZpZ3VyZWQgaW4gdGhlIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCAqLworI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9PVEdfT0ZGU0VUCQkweDcwNAorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9PVEcJCUJJVCgwKQorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9IT1NUX09GRlNFVAkweDcwOAorI2RlZmluZSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9IT1NUCQlCSVQoMCkKKworLyogTW9kZSBzd3RpY2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVhZTk9TXzUyNTBfTU9ERV9TV0lUQ0hfT0ZGU0VUCQkweDIzMAorI2RlZmluZSBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9NQVNLCQkxCisjZGVmaW5lIEVYWU5PU181MjUwX01PREVfU1dJVENIX0RFVklDRQkJMAorI2RlZmluZSBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9IT1NUCQkxCisKK2VudW0gZXh5bm9zNHgxMl9waHlfaWQgeworCUVYWU5PUzUyNTBfREVWSUNFLAorCUVYWU5PUzUyNTBfSE9TVCwKKwlFWFlOT1M1MjUwX0hTSUMwLAorCUVYWU5PUzUyNTBfSFNJQzEsCisJRVhZTk9TNTI1MF9OVU1fUEhZUywKK307CisKKy8qCisgKiBleHlub3M1MjUwX3JhdGVfdG9fY2xrKCkgY29udmVydHMgdGhlIHN1cHBsaWVkIGNsb2NrIHJhdGUgdG8gdGhlIHZhbHVlIHRoYXQKKyAqIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBwaHkgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXh5bm9zNTI1MF9yYXRlX3RvX2Nsayh1bnNpZ25lZCBsb25nIHJhdGUsIHUzMiAqcmVnKQoreworCS8qIEVYWU5PU181MjUwX0ZTRUxfTUFTSyAqLworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA5NjAwICogS0haOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF85TUhaNjsKKwkJYnJlYWs7CisJY2FzZSAxMCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU181MjUwX0ZTRUxfMTBNSFo7CisJCWJyZWFrOworCWNhc2UgMTIgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNTI1MF9GU0VMXzEyTUhaOworCQlicmVhazsKKwljYXNlIDE5MjAwICogS0haOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF8xOU1IWjI7CisJCWJyZWFrOworCWNhc2UgMjAgKiBNSFo6CisJCSpyZWcgPSBFWFlOT1NfNTI1MF9GU0VMXzIwTUhaOworCQlicmVhazsKKwljYXNlIDI0ICogTUhaOgorCQkqcmVnID0gRVhZTk9TXzUyNTBfRlNFTF8yNE1IWjsKKwkJYnJlYWs7CisJY2FzZSA1MCAqIE1IWjoKKwkJKnJlZyA9IEVYWU5PU181MjUwX0ZTRUxfNTBNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M1MjUwX2lzb2woc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QsIGJvb2wgb24pCit7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJdTMyIG9mZnNldDsKKwl1MzIgbWFzazsKKworCXN3aXRjaCAoaW5zdC0+Y2ZnLT5pZCkgeworCWNhc2UgRVhZTk9TNTI1MF9ERVZJQ0U6CisJCW9mZnNldCA9IEVYWU5PU181MjUwX1VTQl9JU09MX09UR19PRkZTRVQ7CisJCW1hc2sgPSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9PVEc7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNTI1MF9IT1NUOgorCQlvZmZzZXQgPSBFWFlOT1NfNTI1MF9VU0JfSVNPTF9IT1NUX09GRlNFVDsKKwkJbWFzayA9IEVYWU5PU181MjUwX1VTQl9JU09MX0hPU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3BtdSwgb2Zmc2V0LCBtYXNrLCBvbiA/IDAgOiBtYXNrKTsKK30KKworc3RhdGljIGludCBleHlub3M1MjUwX3Bvd2VyX29uKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiBjdHJsMDsKKwl1MzIgb3RnOworCXUzMiBlaGNpOworCXUzMiBvaGNpOworCXUzMiBoc2ljOworCisJc3dpdGNoIChpbnN0LT5jZmctPmlkKSB7CisJY2FzZSBFWFlOT1M1MjUwX0RFVklDRToKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRydi0+cmVnX3N5cywKKwkJCQkgICBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9PRkZTRVQsCisJCQkJICAgRVhZTk9TXzUyNTBfTU9ERV9TV0lUQ0hfTUFTSywKKwkJCQkgICBFWFlOT1NfNTI1MF9NT0RFX1NXSVRDSF9ERVZJQ0UpOworCisJCS8qIE9URyBjb25maWd1cmF0aW9uICovCisJCW90ZyA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX1VTQk9UR1NZUyk7CisJCS8qIFRoZSBjbG9jayAqLworCQlvdGcgJj0gfkVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX01BU0s7CisJCW90ZyB8PSBkcnYtPnJlZl9yZWdfdmFsIDw8IEVYWU5PU181MjUwX1VTQk9UR1NZU19GU0VMX1NISUZUOworCQkvKiBSZXNldCAqLworCQlvdGcgJj0gfihFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU1VTUEVORCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU0xFRVAgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1NJRERRX1VPVEcpOworCQlvdGcgfD0JRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWV9TV19SU1QgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWUxJTktfU1dfUkVTRVQgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0xJTktfU1dfUlNUX1VPVEcgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX09UR0RJU0FCTEU7CisJCS8qIFJlZiBjbG9jayAqLworCQlvdGcgJj0JfkVYWU5PU181MjUwX1VTQk9UR1NZU19SRUZDTEtTRUxfTUFTSzsKKwkJb3RnIHw9ICBFWFlOT1NfNTI1MF9SRUZDTEtTRUxfQ0xLQ09SRSA8PAorCQkJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX1NISUZUOworCQl3cml0ZWwob3RnLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQl1ZGVsYXkoMTAwKTsKKwkJb3RnICY9IH4oRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWV9TV19SU1QgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0xJTktfU1dfUlNUX1VPVEcgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWUxJTktfU1dfUkVTRVQgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX09UR0RJU0FCTEUpOworCQl3cml0ZWwob3RnLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCisKKwkJYnJlYWs7CisJY2FzZSBFWFlOT1M1MjUwX0hPU1Q6CisJY2FzZSBFWFlOT1M1MjUwX0hTSUMwOgorCWNhc2UgRVhZTk9TNTI1MF9IU0lDMToKKwkJLyogSG9zdCByZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqLworCQljdHJsMCA9IHJlYWRsKGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMCk7CisJCS8qIFRoZSBjbG9jayAqLworCQljdHJsMCAmPSB+RVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0ZTRUxfTUFTSzsKKwkJY3RybDAgfD0gZHJ2LT5yZWZfcmVnX3ZhbCA8PAorCQkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRlNFTF9TSElGVDsKKworCQkvKiBSZXNldCAqLworCQljdHJsMCAmPQl+KEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9QSFlTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1BIWVNXUlNUQUxMIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfU0lERFEgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNVU1BFTkQgfAorCQkJCUVYWU5PU181MjUwX0hPU1RQSFlDVFJMMF9GT1JDRVNMRUVQKTsKKwkJY3RybDAgfD0JRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0xJTktTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1VUTUlTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0NPTU1PTl9PTl9OOworCQl3cml0ZWwoY3RybDAsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMCk7CisJCXVkZWxheSgxMCk7CisJCWN0cmwwICY9CX4oRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX0xJTktTV1JTVCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1VUTUlTV1JTVCk7CisJCXdyaXRlbChjdHJsMCwgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwKTsKKworCQkvKiBPVEcgY29uZmlndXJhdGlvbiAqLworCQlvdGcgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQkvKiBUaGUgY2xvY2sgKi8KKwkJb3RnICY9IH5FWFlOT1NfNTI1MF9VU0JPVEdTWVNfRlNFTF9NQVNLOworCQlvdGcgfD0gZHJ2LT5yZWZfcmVnX3ZhbCA8PCBFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRlNFTF9TSElGVDsKKwkJLyogUmVzZXQgKi8KKwkJb3RnICY9IH4oRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZPUkNFX1NVU1BFTkQgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0ZPUkNFX1NMRUVQIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19TSUREUV9VT1RHKTsKKwkJb3RnIHw9CUVYWU5PU181MjUwX1VTQk9UR1NZU19QSFlfU1dfUlNUIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19QSFlMSU5LX1NXX1JFU0VUIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19MSU5LX1NXX1JTVF9VT1RHIHwKKwkJCUVYWU5PU181MjUwX1VTQk9UR1NZU19PVEdESVNBQkxFOworCQkvKiBSZWYgY2xvY2sgKi8KKwkJb3RnICY9CX5FWFlOT1NfNTI1MF9VU0JPVEdTWVNfUkVGQ0xLU0VMX01BU0s7CisJCW90ZyB8PSAgRVhZTk9TXzUyNTBfUkVGQ0xLU0VMX0NMS0NPUkUgPDwKKwkJCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1JFRkNMS1NFTF9TSElGVDsKKwkJd3JpdGVsKG90ZywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfVVNCT1RHU1lTKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3RnICY9IH4oRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWV9TV19SU1QgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX0xJTktfU1dfUlNUX1VPVEcgfAorCQkJRVhZTk9TXzUyNTBfVVNCT1RHU1lTX1BIWUxJTktfU1dfUkVTRVQpOworCisJCS8qIEhTSUMgcGh5IGNvbmZpZ3VyYXRpb24gKi8KKwkJaHNpYyA9IChFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLRElWXzEyIHwKKwkJCQlFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfUkVGQ0xLU0VMX0RFRkFVTFQgfAorCQkJCUVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9QSFlTV1JTVCk7CisJCXdyaXRlbChoc2ljLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTDEpOworCQl3cml0ZWwoaHNpYywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwyKTsKKwkJdWRlbGF5KDEwKTsKKwkJaHNpYyAmPSB+RVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1BIWVNXUlNUOworCQl3cml0ZWwoaHNpYywgZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkwxKTsKKwkJd3JpdGVsKGhzaWMsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMik7CisJCS8qIFRoZSBmb2xsb3dpbmcgZGVsYXkgaXMgbmVjZXNzYXJ5IGZvciB0aGUgcmVzZXQgc2VxdWVuY2UgdG8gYmUKKwkJICogY29tcGxldGVkICovCisJCXVkZWxheSg4MCk7CisKKwkJLyogRW5hYmxlIEVIQ0kgRE1BIGJ1cnN0ICovCisJCWVoY2kgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkwpOworCQllaGNpIHw9CUVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSWEFMSUdOIHwKKwkJCUVYWU5PU181MjUwX0hPU1RFSENJQ1RSTF9FTkFJTkNSNCB8CisJCQlFWFlOT1NfNTI1MF9IT1NURUhDSUNUUkxfRU5BSU5DUjggfAorCQkJRVhZTk9TXzUyNTBfSE9TVEVIQ0lDVFJMX0VOQUlOQ1IxNjsKKwkJd3JpdGVsKGVoY2ksIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RFSENJQ1RSTCk7CisKKwkJLyogT0hDSSBzZXR0aW5ncyAqLworCQlvaGNpID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfSE9TVE9IQ0lDVFJMKTsKKwkJLyogRm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgb24gdGhlIG9sZCBkcml2ZXIgKi8KKwkJb2hjaSB8PQkweDEgPDwgMzsKKwkJd3JpdGVsKG9oY2ksIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RPSENJQ1RSTCk7CisKKwkJYnJlYWs7CisJfQorCWluc3QtPmVuYWJsZWQgPSAxOworCWV4eW5vczUyNTBfaXNvbChpbnN0LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4eW5vczUyNTBfcG93ZXJfb2ZmKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCXUzMiBjdHJsMDsKKwl1MzIgb3RnOworCXUzMiBoc2ljOworCisJaW5zdC0+ZW5hYmxlZCA9IDA7CisJZXh5bm9zNTI1MF9pc29sKGluc3QsIDEpOworCisJc3dpdGNoIChpbnN0LT5jZmctPmlkKSB7CisJY2FzZSBFWFlOT1M1MjUwX0RFVklDRToKKwkJb3RnID0gcmVhZGwoZHJ2LT5yZWdfcGh5ICsgRVhZTk9TXzUyNTBfVVNCT1RHU1lTKTsKKwkJb3RnIHw9IChFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU1VTUEVORCB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfU0lERFFfVU9URyB8CisJCQlFWFlOT1NfNTI1MF9VU0JPVEdTWVNfRk9SQ0VfU0xFRVApOworCQl3cml0ZWwob3RnLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9VU0JPVEdTWVMpOworCQlicmVhazsKKwljYXNlIEVYWU5PUzUyNTBfSE9TVDoKKwkJY3RybDAgPSByZWFkbChkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDApOworCQljdHJsMCB8PSAoRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1NJRERRIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRk9SQ0VTVVNQRU5EIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfRk9SQ0VTTEVFUCB8CisJCQkJRVhZTk9TXzUyNTBfSE9TVFBIWUNUUkwwX1BIWVNXUlNUIHwKKwkJCQlFWFlOT1NfNTI1MF9IT1NUUEhZQ1RSTDBfUEhZU1dSU1RBTEwpOworCQl3cml0ZWwoY3RybDAsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hPU1RQSFlDVFJMMCk7CisJCWJyZWFrOworCWNhc2UgRVhZTk9TNTI1MF9IU0lDMDoKKwljYXNlIEVYWU5PUzUyNTBfSFNJQzE6CisJCWhzaWMgPSAoRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS0RJVl8xMiB8CisJCQkJRVhZTk9TXzUyNTBfSFNJQ1BIWUNUUkxYX1JFRkNMS1NFTF9ERUZBVUxUIHwKKwkJCQlFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfU0lERFEgfAorCQkJCUVYWU5PU181MjUwX0hTSUNQSFlDVFJMWF9GT1JDRVNMRUVQIHwKKwkJCQlFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTFhfRk9SQ0VTVVNQRU5ECisJCQkJKTsKKwkJd3JpdGVsKGhzaWMsIGRydi0+cmVnX3BoeSArIEVYWU5PU181MjUwX0hTSUNQSFlDVFJMMSk7CisJCXdyaXRlbChoc2ljLCBkcnYtPnJlZ19waHkgKyBFWFlOT1NfNTI1MF9IU0lDUEhZQ1RSTDIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9jb21tb25fcGh5IGV4eW5vczUyNTBfcGh5c1tdID0geworCXsKKwkJLmxhYmVsCQk9ICJkZXZpY2UiLAorCQkuaWQJCT0gRVhZTk9TNTI1MF9ERVZJQ0UsCisJCS5wb3dlcl9vbgk9IGV4eW5vczUyNTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M1MjUwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJob3N0IiwKKwkJLmlkCQk9IEVYWU5PUzUyNTBfSE9TVCwKKwkJLnBvd2VyX29uCT0gZXh5bm9zNTI1MF9wb3dlcl9vbiwKKwkJLnBvd2VyX29mZgk9IGV4eW5vczUyNTBfcG93ZXJfb2ZmLAorCX0sCisJeworCQkubGFiZWwJCT0gImhzaWMwIiwKKwkJLmlkCQk9IEVYWU5PUzUyNTBfSFNJQzAsCisJCS5wb3dlcl9vbgk9IGV4eW5vczUyNTBfcG93ZXJfb24sCisJCS5wb3dlcl9vZmYJPSBleHlub3M1MjUwX3Bvd2VyX29mZiwKKwl9LAorCXsKKwkJLmxhYmVsCQk9ICJoc2ljMSIsCisJCS5pZAkJPSBFWFlOT1M1MjUwX0hTSUMxLAorCQkucG93ZXJfb24JPSBleHlub3M1MjUwX3Bvd2VyX29uLAorCQkucG93ZXJfb2ZmCT0gZXh5bm9zNTI1MF9wb3dlcl9vZmYsCisJfSwKKwl7fSwKK307CisKK2NvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M1MjUwX3VzYjJfcGh5X2NvbmZpZyA9IHsKKwkuaGFzX21vZGVfc3dpdGNoCT0gMSwKKwkubnVtX3BoeXMJCT0gRVhZTk9TNTI1MF9OVU1fUEhZUywKKwkucGh5cwkJCT0gZXh5bm9zNTI1MF9waHlzLAorCS5yYXRlX3RvX2NsawkJPSBleHlub3M1MjUwX3JhdGVfdG9fY2xrLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1vbWFwLWNvbnRyb2wuYyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLWNvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTFiNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtY29udHJvbC5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogb21hcC1jb250cm9sLXBoeS5jIC0gVGhlIFBIWSBwYXJ0IG9mIGNvbnRyb2wgbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6IEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaD4KKworLyoqCisgKiBvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyIC0gcG93ZXIgb24vb2ZmIHRoZSBwaHkgdXNpbmcgY29udHJvbCBtb2R1bGUgcmVnCisgKiBAZGV2OiB0aGUgY29udHJvbCBtb2R1bGUgZGV2aWNlCisgKiBAb246IDAgb3IgMSwgYmFzZWQgb24gcG93ZXJpbmcgb24gb3Igb2ZmIHRoZSBQSFkKKyAqLwordm9pZCBvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyByYXRlOworCXN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5CSpjb250cm9sX3BoeTsKKworCWlmIChJU19FUlIoZGV2KSB8fCAhZGV2KSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljb250cm9sX3BoeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICghY29udHJvbF9waHkpIHsKKwkJZGV2X2VycihkZXYsICIlczogaW52YWxpZCBjb250cm9sIHBoeSBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjb250cm9sX3BoeS0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9PVEdIUykKKwkJcmV0dXJuOworCisJdmFsID0gcmVhZGwoY29udHJvbF9waHktPnBvd2VyKTsKKworCXN3aXRjaCAoY29udHJvbF9waHktPnR5cGUpIHsKKwljYXNlIE9NQVBfQ1RSTF9UWVBFX1VTQjI6CisJCWlmIChvbikKKwkJCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9QSFlfUEQ7CisJCWVsc2UKKwkJCXZhbCB8PSBPTUFQX0NUUkxfREVWX1BIWV9QRDsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBfQ1RSTF9UWVBFX1BJUEUzOgorCQlyYXRlID0gY2xrX2dldF9yYXRlKGNvbnRyb2xfcGh5LT5zeXNfY2xrKTsKKwkJcmF0ZSA9IHJhdGUvMTAwMDAwMDsKKworCQlpZiAob24pIHsKKwkJCXZhbCAmPSB+KE9NQVBfQ1RSTF9QSVBFM19QSFlfUFdSQ1RMX0NMS19DTURfTUFTSyB8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0ZSRVFfTUFTSyk7CisJCQl2YWwgfD0gT01BUF9DVFJMX1BJUEUzX1BIWV9UWF9SWF9QT1dFUk9OIDw8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9TSElGVDsKKwkJCXZhbCB8PSByYXRlIDw8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0ZSRVFfU0hJRlQ7CisJCX0gZWxzZSB7CisJCQl2YWwgJj0gfk9NQVBfQ1RSTF9QSVBFM19QSFlfUFdSQ1RMX0NMS19DTURfTUFTSzsKKwkJCXZhbCB8PSBPTUFQX0NUUkxfUElQRTNfUEhZX1RYX1JYX1BPV0VST0ZGIDw8CisJCQkJT01BUF9DVFJMX1BJUEUzX1BIWV9QV1JDVExfQ0xLX0NNRF9TSElGVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT01BUF9DVFJMX1RZUEVfRFJBN1VTQjI6CisJCWlmIChvbikKKwkJCXZhbCAmPSB+T01BUF9DVFJMX1VTQjJfUEhZX1BEOworCQllbHNlCisJCQl2YWwgfD0gT01BUF9DVFJMX1VTQjJfUEhZX1BEOworCQlicmVhazsKKworCWNhc2UgT01BUF9DVFJMX1RZUEVfQU00MzdVU0IyOgorCQlpZiAob24pIHsKKwkJCXZhbCAmPSB+KEFNNDM3WF9DVFJMX1VTQjJfUEhZX1BEIHwKKwkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOworCQkJdmFsIHw9IChBTTQzN1hfQ1RSTF9VU0IyX09UR1ZERVRfRU4gfAorCQkJCQlBTTQzN1hfQ1RSTF9VU0IyX09UR1NFU1NFTkRfRU4pOworCQl9IGVsc2UgeworCQkJdmFsICY9IH4oQU00MzdYX0NUUkxfVVNCMl9PVEdWREVUX0VOIHwKKwkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdTRVNTRU5EX0VOKTsKKwkJCXZhbCB8PSAoQU00MzdYX0NUUkxfVVNCMl9QSFlfUEQgfAorCQkJCQkgQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiJXM6IHR5cGUgJWQgbm90IHJlY29nbml6ZWRcbiIsCisJCQlfX2Z1bmNfXywgY29udHJvbF9waHktPnR5cGUpOworCQlicmVhazsKKwl9CisKKwl3cml0ZWwodmFsLCBjb250cm9sX3BoeS0+cG93ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9jb250cm9sX3BoeV9wb3dlcik7CisKKy8qKgorICogb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBncm91bmRlZAorICogQGN0cmxfcGh5OiBzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqCisgKgorICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgdGhhdCBhIHVzYgorICogZGV2aWNlIGhhcyBiZWVuIGNvbm5lY3RlZC4KKyAqLworc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoc3RydWN0IG9tYXBfY29udHJvbF9waHkgKmN0cmxfcGh5KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7CisJdmFsICY9IH4oT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORCk7CisJdmFsIHw9IE9NQVBfQ1RSTF9ERVZfQVZBTElEIHwgT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQ7CisJd3JpdGVsKHZhbCwgY3RybF9waHktPm90Z2hzX2NvbnRyb2wpOworfQorCisvKioKKyAqIG9tYXBfY29udHJvbF91c2JfZGV2aWNlX21vZGUgLSBzZXQgQVZBTElELCBWQlVTVkFMSUQgYW5kIElEIHBpbiBpbiBoaWdoCisgKiBpbXBlZGFuY2UKKyAqIEBjdHJsX3BoeTogc3RydWN0IG9tYXBfY29udHJvbF9waHkgKgorICoKKyAqIFdyaXRlcyB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQgaXQgaGFzIGJlZW4KKyAqIGNvbm5lY3RlZCB0byBhIHVzYiBob3N0LgorICovCitzdGF0aWMgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX2RldmljZV9tb2RlKHN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5ICpjdHJsX3BoeSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoY3RybF9waHktPm90Z2hzX2NvbnRyb2wpOworCXZhbCAmPSB+T01BUF9DVFJMX0RFVl9TRVNTRU5EOworCXZhbCB8PSBPTUFQX0NUUkxfREVWX0lERElHIHwgT01BUF9DVFJMX0RFVl9BVkFMSUQgfAorCQlPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRDsKKwl3cml0ZWwodmFsLCBjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7Cit9CisKKy8qKgorICogb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZCAtIEVuYWJsZSBTRVNTSU9ORU5EIGFuZCBJRElHIHRvIGhpZ2gKKyAqIGltcGVkYW5jZQorICogQGN0cmxfcGh5OiBzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqCisgKgorICogV3JpdGVzIHRvIHRoZSBtYWlsYm94IHJlZ2lzdGVyIHRvIG5vdGlmeSB0aGUgdXNiIGNvcmUgaXQncyBub3cgaW4KKyAqIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeSAqY3RybF9waHkpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKGN0cmxfcGh5LT5vdGdoc19jb250cm9sKTsKKwl2YWwgJj0gfihPTUFQX0NUUkxfREVWX0FWQUxJRCB8IE9NQVBfQ1RSTF9ERVZfVkJVU1ZBTElEKTsKKwl2YWwgfD0gT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfU0VTU0VORDsKKwl3cml0ZWwodmFsLCBjdHJsX3BoeS0+b3RnaHNfY29udHJvbCk7Cit9CisKKy8qKgorICogb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZSAtIENhbGxzIHRvIGZ1bmN0aW9ucyB0byBzZXQgVVNCIGluIG9uZSBvZiBob3N0IG1vZGUKKyAqIG9yIGRldmljZSBtb2RlIG9yIHRvIGRlbm90ZSBkaXNjb25uZWN0ZWQgc3RhdGUKKyAqIEBkZXY6IHRoZSBjb250cm9sIG1vZHVsZSBkZXZpY2UKKyAqIEBtb2RlOiBUaGUgbW9kZSB0byB3aGljaCB1c2Igc2hvdWxkIGJlIGNvbmZpZ3VyZWQKKyAqCisgKiBUaGlzIGlzIGFuIEFQSSB0byB3cml0ZSB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQKKyAqIGEgdXNiIGRldmljZSBoYXMgYmVlbiBjb25uZWN0ZWQuCisgKi8KK3ZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3Qgb21hcF9jb250cm9sX3BoeQkqY3RybF9waHk7CisKKwlpZiAoSVNfRVJSKGRldikgfHwgIWRldikKKwkJcmV0dXJuOworCisJY3RybF9waHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghY3RybF9waHkpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIGNvbnRyb2wgcGh5IGRldmljZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3RybF9waHktPnR5cGUgIT0gT01BUF9DVFJMX1RZUEVfT1RHSFMpCisJCXJldHVybjsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVVNCX01PREVfSE9TVDoKKwkJb21hcF9jb250cm9sX3VzYl9ob3N0X21vZGUoY3RybF9waHkpOworCQlicmVhazsKKwljYXNlIFVTQl9NT0RFX0RFVklDRToKKwkJb21hcF9jb250cm9sX3VzYl9kZXZpY2VfbW9kZShjdHJsX3BoeSk7CisJCWJyZWFrOworCWNhc2UgVVNCX01PREVfRElTQ09OTkVDVDoKKwkJb21hcF9jb250cm9sX3VzYl9zZXRfc2Vzc2lvbmVuZChjdHJsX3BoeSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl92ZGJnKGRldiwgImludmFsaWQgb21hcCBjb250cm9sIHVzYiBtb2RlXG4iKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKTsKKworI2lmZGVmIENPTkZJR19PRgorCitzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgb3RnaHNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX09UR0hTOworc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3BoeV90eXBlIHVzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1VTQjI7CitzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgcGlwZTNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1BJUEUzOworc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3BoeV90eXBlIGRyYTd1c2IyX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9EUkE3VVNCMjsKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF9waHlfdHlwZSBhbTQzN3VzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX0FNNDM3VVNCMjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF9jb250cm9sX3BoeV9pZF90YWJsZVtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktb3RnaHMiLAorCQkuZGF0YSA9ICZvdGdoc19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS11c2IyIiwKKwkJLmRhdGEgPSAmdXNiMl9kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS1waXBlMyIsCisJCS5kYXRhID0gJnBpcGUzX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LXVzYjItZHJhNyIsCisJCS5kYXRhID0gJmRyYTd1c2IyX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LXVzYjItYW00MzciLAorCQkuZGF0YSA9ICZhbTQzN3VzYjJfZGF0YSwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9tYXBfY29udHJvbF9waHlfaWRfdGFibGUpOworI2VuZGlmCisKKworc3RhdGljIGludCBvbWFwX2NvbnRyb2xfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlCSpyZXM7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJc3RydWN0IG9tYXBfY29udHJvbF9waHkgKmNvbnRyb2xfcGh5OworCisJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKG9tYXBfY29udHJvbF9waHlfaWRfdGFibGUpLAorCQkJCSZwZGV2LT5kZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJY29udHJvbF9waHkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjb250cm9sX3BoeSksCisJCUdGUF9LRVJORUwpOworCWlmICghY29udHJvbF9waHkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgY29udHJvbCBwaHlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb250cm9sX3BoeS0+ZGV2ID0gJnBkZXYtPmRldjsKKwljb250cm9sX3BoeS0+dHlwZSA9ICooZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgKilvZl9pZC0+ZGF0YTsKKworCWlmIChjb250cm9sX3BoeS0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9PVEdIUykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJIm90Z2hzX2NvbnRyb2wiKTsKKwkJY29udHJvbF9waHktPm90Z2hzX2NvbnRyb2wgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoCisJCQkmcGRldi0+ZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGNvbnRyb2xfcGh5LT5vdGdoc19jb250cm9sKSkKKwkJCXJldHVybiBQVFJfRVJSKGNvbnRyb2xfcGh5LT5vdGdoc19jb250cm9sKTsKKwl9IGVsc2UgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCSJwb3dlciIpOworCQljb250cm9sX3BoeS0+cG93ZXIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihjb250cm9sX3BoeS0+cG93ZXIpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBnZXQgcG93ZXIgcmVnaXN0ZXJcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoY29udHJvbF9waHktPnBvd2VyKTsKKwkJfQorCX0KKworCWlmIChjb250cm9sX3BoeS0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9QSVBFMykgeworCQljb250cm9sX3BoeS0+c3lzX2NsayA9IGRldm1fY2xrX2dldChjb250cm9sX3BoeS0+ZGV2LAorCQkJInN5c19jbGtpbiIpOworCQlpZiAoSVNfRVJSKGNvbnRyb2xfcGh5LT5zeXNfY2xrKSkgeworCQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGdldCBzeXNfY2xraW5cbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGNvbnRyb2xfcGh5LT5kZXYsIGNvbnRyb2xfcGh5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2NvbnRyb2xfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb21hcF9jb250cm9sX3BoeV9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAib21hcC1jb250cm9sLXBoeSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob21hcF9jb250cm9sX3BoeV9pZF90YWJsZSksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfY29udHJvbF9waHlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfY29udHJvbF9waHlfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChvbWFwX2NvbnRyb2xfcGh5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9jb250cm9sX3BoeV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfY29udHJvbF9waHlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG9tYXBfY29udHJvbF9waHlfZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06IG9tYXBfY29udHJvbF9waHkiKTsKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiT01BUCBDb250cm9sIE1vZHVsZSBQSFkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMKaW5kZXggNzY5OTc1Mi4uYTIyMDVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYwpAQCAtMjEsMTYgKzIxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb21hcF91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvb21hcF91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcGh5X2NvbXBhbmlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAorI2RlZmluZSBVU0IyUEhZX0RJU0NPTl9CWVBfTEFUQ0ggKDEgPDwgMzEpCisjZGVmaW5lIFVTQjJQSFlfQU5BX0NPTkZJRzEgMHg0YworCiAvKioKICAqIG9tYXBfdXNiMl9zZXRfY29tcGFyYXRvciAtIGxpbmtzIHRoZSBjb21wYXJhdG9yIHByZXNlbnQgaW4gdGhlIHN5dGVtIHdpdGgKICAqCXRoaXMgcGh5CkBAIC05OCwzMyArMTAxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF91c2IyX3N1c3BlbmQoc3RydWN0IHVzYl9waHkgKngsIGludCBzdXNwZW5kKQotewotCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X3RvX29tYXB1c2IoeCk7Ci0JaW50IHJldDsKLQotCWlmIChzdXNwZW5kICYmICFwaHktPmlzX3N1c3BlbmRlZCkgewotCQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKLQkJcG1fcnVudGltZV9wdXRfc3luYyhwaHktPmRldik7Ci0JCXBoeS0+aXNfc3VzcGVuZGVkID0gMTsKLQl9IGVsc2UgaWYgKCFzdXNwZW5kICYmIHBoeS0+aXNfc3VzcGVuZGVkKSB7Ci0JCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMocGh5LT5kZXYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwaHktPmRldiwgImdldF9zeW5jIGZhaWxlZCB3aXRoIGVyciAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMSk7Ci0JCXBoeS0+aXNfc3VzcGVuZGVkID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBvbWFwX3VzYl9wb3dlcl9vZmYoc3RydWN0IHBoeSAqeCkKIHsKIAlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKIAotCW9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOworCW9tYXBfY29udHJvbF9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMywzMCArMTE0LDEwMyBAQAogewogCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOwogCi0Jb21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMSk7CisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfdXNiX2luaXQoc3RydWN0IHBoeSAqeCkKK3sKKwlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKKwl1MzIgdmFsOworCisJaWYgKHBoeS0+ZmxhZ3MgJiBPTUFQX1VTQjJfQ0FMSUJSQVRFX0ZBTFNFX0RJU0NPTk5FQ1QpIHsKKwkJLyoKKwkJICoKKwkJICogUmVkdWNlIHRoZSBzZW5zaXRpdml0eSBvZiBpbnRlcm5hbCBQSFkgYnkgZW5hYmxpbmcgdGhlCisJCSAqIERJU0NPTl9CWVBfTEFUQ0ggb2YgdGhlIFVTQjJQSFlfQU5BX0NPTkZJRzEgcmVnaXN0ZXIuIFRoaXMKKwkJICogcmVzb2x2ZXMgaXNzdWVzIHdpdGggY2VydGFpbiBkZXZpY2VzIHdoaWNoIGNhbiBvdGhlcndpc2UKKwkJICogYmUgcHJvbmUgdG8gZmFsc2UgZGlzY29ubmVjdHMuCisJCSAqCisJCSAqLworCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBoeV9iYXNlLCBVU0IyUEhZX0FOQV9DT05GSUcxKTsKKwkJdmFsIHw9IFVTQjJQSFlfRElTQ09OX0JZUF9MQVRDSDsKKwkJb21hcF91c2Jfd3JpdGVsKHBoeS0+cGh5X2Jhc2UsIFVTQjJQSFlfQU5BX0NPTkZJRzEsIHZhbCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGh5X29wcyBvcHMgPSB7CisJLmluaXQJCT0gb21hcF91c2JfaW5pdCwKIAkucG93ZXJfb24JPSBvbWFwX3VzYl9wb3dlcl9vbiwKIAkucG93ZXJfb2ZmCT0gb21hcF91c2JfcG93ZXJfb2ZmLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3BoeV9kYXRhIG9tYXBfdXNiMl9kYXRhID0geworCS5sYWJlbCA9ICJvbWFwX3VzYjIiLAorCS5mbGFncyA9IE9NQVBfVVNCMl9IQVNfU1RBUlRfU1JQIHwgT01BUF9VU0IyX0hBU19TRVRfVkJVUywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3BoeV9kYXRhIG9tYXA1X3VzYjJfZGF0YSA9IHsKKwkubGFiZWwgPSAib21hcDVfdXNiMiIsCisJLmZsYWdzID0gMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3BoeV9kYXRhIGRyYTd4X3VzYjJfZGF0YSA9IHsKKwkubGFiZWwgPSAiZHJhN3hfdXNiMiIsCisJLmZsYWdzID0gT01BUF9VU0IyX0NBTElCUkFURV9GQUxTRV9ESVNDT05ORUNULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfcGh5X2RhdGEgYW00Mzd4X3VzYjJfZGF0YSA9IHsKKwkubGFiZWwgPSAiYW00Mzd4X3VzYjIiLAorCS5mbGFncyA9ICAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF91c2IyX2lkX3RhYmxlW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJ0aSxvbWFwLXVzYjIiLAorCQkuZGF0YSA9ICZvbWFwX3VzYjJfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksb21hcDUtdXNiMiIsCisJCS5kYXRhID0gJm9tYXA1X3VzYjJfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksZHJhN3gtdXNiMiIsCisJCS5kYXRhID0gJmRyYTd4X3VzYjJfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksYW00Mzd4LXVzYjIiLAorCQkuZGF0YSA9ICZhbTQzN3hfdXNiMl9kYXRhLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb21hcF91c2IyX2lkX3RhYmxlKTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IG9tYXBfdXNiMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBvbWFwX3VzYgkqcGh5OwogCXN0cnVjdCBwaHkgKmdlbmVyaWNfcGh5OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKIAlzdHJ1Y3QgdXNiX290ZyAqb3RnOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbF9ub2RlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbnRyb2xfcGRldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlzdHJ1Y3QgdXNiX3BoeV9kYXRhICpwaHlfZGF0YTsKIAotCWlmICghbm9kZSkKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIob21hcF91c2IyX2lkX3RhYmxlKSwgJnBkZXYtPmRldik7CisKKwlpZiAoIW9mX2lkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXBoeV9kYXRhID0gKHN0cnVjdCB1c2JfcGh5X2RhdGEgKilvZl9pZC0+ZGF0YTsKKwogCXBoeSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBoeSksIEdGUF9LRVJORUwpOwogCWlmICghcGh5KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFVTQjIgUEhZXG4iKTsKQEAgLTE3MiwxMSArMjI2LDE4IEBACiAJcGh5LT5kZXYJCT0gJnBkZXYtPmRldjsKIAogCXBoeS0+cGh5LmRldgkJPSBwaHktPmRldjsKLQlwaHktPnBoeS5sYWJlbAkJPSAib21hcC11c2IyIjsKLQlwaHktPnBoeS5zZXRfc3VzcGVuZAk9IG9tYXBfdXNiMl9zdXNwZW5kOworCXBoeS0+cGh5LmxhYmVsCQk9IHBoeV9kYXRhLT5sYWJlbDsKIAlwaHktPnBoeS5vdGcJCT0gb3RnOwogCXBoeS0+cGh5LnR5cGUJCT0gVVNCX1BIWV9UWVBFX1VTQjI7CiAKKwlpZiAocGh5X2RhdGEtPmZsYWdzICYgT01BUF9VU0IyX0NBTElCUkFURV9GQUxTRV9ESVNDT05ORUNUKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJCXBoeS0+cGh5X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKCFwaHktPnBoeV9iYXNlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXBoeS0+ZmxhZ3MgfD0gT01BUF9VU0IyX0NBTElCUkFURV9GQUxTRV9ESVNDT05ORUNUOworCX0KKwogCWNvbnRyb2xfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgImN0cmwtbW9kdWxlIiwgMCk7CiAJaWYgKCFjb250cm9sX25vZGUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZSBwaGFuZGxlXG4iKTsKQEAgLTE5MCwxNCArMjUxLDE0IEBACiAJfQogCiAJcGh5LT5jb250cm9sX2RldiA9ICZjb250cm9sX3BkZXYtPmRldjsKLQotCXBoeS0+aXNfc3VzcGVuZGVkCT0gMTsKLQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKKwlvbWFwX2NvbnRyb2xfcGh5X3Bvd2VyKHBoeS0+Y29udHJvbF9kZXYsIDApOwogCiAJb3RnLT5zZXRfaG9zdAkJPSBvbWFwX3VzYl9zZXRfaG9zdDsKIAlvdGctPnNldF9wZXJpcGhlcmFsCT0gb21hcF91c2Jfc2V0X3BlcmlwaGVyYWw7Ci0Jb3RnLT5zZXRfdmJ1cwkJPSBvbWFwX3VzYl9zZXRfdmJ1czsKLQlvdGctPnN0YXJ0X3NycAkJPSBvbWFwX3VzYl9zdGFydF9zcnA7CisJaWYgKHBoeV9kYXRhLT5mbGFncyAmIE9NQVBfVVNCMl9IQVNfU0VUX1ZCVVMpCisJCW90Zy0+c2V0X3ZidXMJCT0gb21hcF91c2Jfc2V0X3ZidXM7CisJaWYgKHBoeV9kYXRhLT5mbGFncyAmIE9NQVBfVVNCMl9IQVNfU1RBUlRfU1JQKQorCQlvdGctPnN0YXJ0X3NycAkJPSBvbWFwX3VzYl9zdGFydF9zcnA7CiAJb3RnLT5waHkJCT0gJnBoeS0+cGh5OwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGh5KTsKQEAgLTI5NywxNCArMzU4LDYgQEAKICNkZWZpbmUgREVWX1BNX09QUyAgICAgTlVMTAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9tYXBfdXNiMl9pZF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAidGksb21hcC11c2IyIiB9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb21hcF91c2IyX2lkX3RhYmxlKTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX3VzYjJfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvbWFwX3VzYjJfcHJvYmUsCiAJLnJlbW92ZQkJPSBvbWFwX3VzYjJfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOGM2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktc2Ftc3VuZy11c2IyLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBTYW1zdW5nIFNvQyBVU0IgMS4xLzIuMCBQSFkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInBoeS1zYW1zdW5nLXVzYjIuaCIKKworc3RhdGljIGludCBzYW1zdW5nX3VzYjJfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqaW5zdCA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2ID0gaW5zdC0+ZHJ2OworCWludCByZXQ7CisKKwlkZXZfZGJnKGRydi0+ZGV2LCAiUmVxdWVzdCB0byBwb3dlcl9vbiBcIiVzXCIgdXNiIHBoeVxuIiwKKwkJaW5zdC0+Y2ZnLT5sYWJlbCk7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRydi0+Y2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9tYWluX2NsazsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5yZWZfY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9pbnN0YW5jZV9jbGs7CisJaWYgKGluc3QtPmNmZy0+cG93ZXJfb24pIHsKKwkJc3Bpbl9sb2NrKCZkcnYtPmxvY2spOworCQlyZXQgPSBpbnN0LT5jZmctPnBvd2VyX29uKGluc3QpOworCQlzcGluX3VubG9jaygmZHJ2LT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2luc3RhbmNlX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5jbGspOworZXJyX21haW5fY2xrOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ191c2IyX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICppbnN0ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyICpkcnYgPSBpbnN0LT5kcnY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGRydi0+ZGV2LCAiUmVxdWVzdCB0byBwb3dlcl9vZmYgXCIlc1wiIHVzYiBwaHlcbiIsCisJCWluc3QtPmNmZy0+bGFiZWwpOworCWlmIChpbnN0LT5jZmctPnBvd2VyX29mZikgeworCQlzcGluX2xvY2soJmRydi0+bG9jayk7CisJCXJldCA9IGluc3QtPmNmZy0+cG93ZXJfb2ZmKGluc3QpOworCQlzcGluX3VubG9jaygmZHJ2LT5sb2NrKTsKKwl9CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+cmVmX2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+Y2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBoeV9vcHMgc2Ftc3VuZ191c2IyX3BoeV9vcHMgPSB7CisJLnBvd2VyX29uCT0gc2Ftc3VuZ191c2IyX3BoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gc2Ftc3VuZ191c2IyX3BoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBwaHkgKnNhbXN1bmdfdXNiMl9waHlfeGxhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzKQoreworCXN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2RyaXZlciAqZHJ2OworCisJZHJ2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKCFkcnYpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaWYgKFdBUk5fT04oYXJncy0+YXJnc1swXSA+PSBkcnYtPmNmZy0+bnVtX3BoeXMpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCXJldHVybiBkcnYtPmluc3RhbmNlc1thcmdzLT5hcmdzWzBdXS5waHk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNhbXN1bmdfdXNiMl9waHlfb2ZfbWF0Y2hbXSA9IHsKKyNpZmRlZiBDT05GSUdfUEhZX0VYWU5PUzQyMTBfVVNCMgorCXsKKwkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEwLXVzYjItcGh5IiwKKwkJLmRhdGEgPSAmZXh5bm9zNDIxMF91c2IyX3BoeV9jb25maWcsCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QSFlfRVhZTk9TNFgxMl9VU0IyCisJeworCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczR4MTItdXNiMi1waHkiLAorCQkuZGF0YSA9ICZleHlub3M0eDEyX3VzYjJfcGh5X2NvbmZpZywKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BIWV9FWFlOT1M1MjUwX1VTQjIKKwl7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI1MC11c2IyLXBoeSIsCisJCS5kYXRhID0gJmV4eW5vczUyNTBfdXNiMl9waHlfY29uZmlnLAorCX0sCisjZW5kaWYKKwl7IH0sCit9OworCitzdGF0aWMgaW50IHNhbXN1bmdfdXNiMl9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgKmNmZzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydjsKKwlpbnQgaSwgcmV0OworCisJaWYgKCFwZGV2LT5kZXYub2Zfbm9kZSkgeworCQlkZXZfZXJyKGRldiwgIlRoaXMgZHJpdmVyIGlzIHJlcXVpcmVkIHRvIGJlIGluc3RhbnRpYXRlZCBmcm9tIGRldmljZSB0cmVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNhbXN1bmdfdXNiMl9waHlfb2ZfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoIW1hdGNoKSB7CisJCWRldl9lcnIoZGV2LCAib2ZfbWF0Y2hfbm9kZSgpIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljZmcgPSBtYXRjaC0+ZGF0YTsKKworCWRydiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIpICsKKwkJY2ZnLT5udW1fcGh5cyAqIHNpemVvZihzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSksCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghZHJ2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGRydik7CisJc3Bpbl9sb2NrX2luaXQoJmRydi0+bG9jayk7CisKKwlkcnYtPmNmZyA9IGNmZzsKKwlkcnYtPmRldiA9IGRldjsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJZHJ2LT5yZWdfcGh5ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgbWVtKTsKKwlpZiAoSVNfRVJSKGRydi0+cmVnX3BoeSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIHJlZ2lzdGVyIG1lbW9yeSAocGh5KVxuIik7CisJCXJldHVybiBQVFJfRVJSKGRydi0+cmVnX3BoeSk7CisJfQorCisJZHJ2LT5yZWdfcG11ID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJInNhbXN1bmcscG11cmVnLXBoYW5kbGUiKTsKKwlpZiAoSVNfRVJSKGRydi0+cmVnX3BtdSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIFBNVSByZWdpc3RlcnMgKHZpYSBzeXNjb24pXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2LT5yZWdfcG11KTsKKwl9CisKKwlpZiAoZHJ2LT5jZmctPmhhc19tb2RlX3N3aXRjaCkgeworCQlkcnYtPnJlZ19zeXMgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKAorCQkJCXBkZXYtPmRldi5vZl9ub2RlLCAic2Ftc3VuZyxzeXNyZWctcGhhbmRsZSIpOworCQlpZiAoSVNfRVJSKGRydi0+cmVnX3N5cykpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBzeXN0ZW0gcmVnaXN0ZXJzICh2aWEgc3lzY29uKVxuIik7CisJCQlyZXR1cm4gUFRSX0VSUihkcnYtPnJlZ19zeXMpOworCQl9CisJfQorCisJZHJ2LT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAicGh5Iik7CisJaWYgKElTX0VSUihkcnYtPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IGNsb2NrIG9mIHBoeSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2LT5jbGspOworCX0KKworCWRydi0+cmVmX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJyZWYiKTsKKwlpZiAoSVNfRVJSKGRydi0+cmVmX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHJlZmVyZW5jZSBjbG9jayBmb3IgdGhlIHBoeSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2LT5yZWZfY2xrKTsKKwl9CisKKwlkcnYtPnJlZl9yYXRlID0gY2xrX2dldF9yYXRlKGRydi0+cmVmX2Nsayk7CisJaWYgKGRydi0+Y2ZnLT5yYXRlX3RvX2NsaykgeworCQlyZXQgPSBkcnYtPmNmZy0+cmF0ZV90b19jbGsoZHJ2LT5yZWZfcmF0ZSwgJmRydi0+cmVmX3JlZ192YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJ2LT5jZmctPm51bV9waHlzOyBpKyspIHsKKwkJY2hhciAqbGFiZWwgPSBkcnYtPmNmZy0+cGh5c1tpXS5sYWJlbDsKKwkJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKnAgPSAmZHJ2LT5pbnN0YW5jZXNbaV07CisKKwkJZGV2X2RiZyhkZXYsICJDcmVhdGluZyBwaHkgXCIlc1wiXG4iLCBsYWJlbCk7CisJCXAtPnBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsICZzYW1zdW5nX3VzYjJfcGh5X29wcywgTlVMTCk7CisJCWlmIChJU19FUlIocC0+cGh5KSkgeworCQkJZGV2X2VycihkcnYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgdXNiMl9waHkgXCIlc1wiXG4iLAorCQkJCWxhYmVsKTsKKwkJCXJldHVybiBQVFJfRVJSKHAtPnBoeSk7CisJCX0KKworCQlwLT5jZmcgPSAmZHJ2LT5jZmctPnBoeXNbaV07CisJCXAtPmRydiA9IGRydjsKKwkJcGh5X3NldF9idXNfd2lkdGgocC0+cGh5LCA4KTsKKwkJcGh5X3NldF9kcnZkYXRhKHAtPnBoeSwgcCk7CisJfQorCisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LAorCQkJCQkJCXNhbXN1bmdfdXNiMl9waHlfeGxhdGUpOworCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkgeworCQlkZXZfZXJyKGRydi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBoeSBwcm92aWRlclxuIik7CisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhbXN1bmdfdXNiMl9waHlfZHJpdmVyID0geworCS5wcm9iZQk9IHNhbXN1bmdfdXNiMl9waHlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm9mX21hdGNoX3RhYmxlCT0gc2Ftc3VuZ191c2IyX3BoeV9vZl9tYXRjaCwKKwkJLm5hbWUJCT0gInNhbXN1bmctdXNiMi1waHkiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzYW1zdW5nX3VzYjJfcGh5X2RyaXZlcik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgUzVQL0VYWU5PUyBTb0MgVVNCIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNhbXN1bmctdXNiMi1waHkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1zYW1zdW5nLXVzYjIuaCBiL2RyaXZlcnMvcGh5L3BoeS1zYW1zdW5nLXVzYjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWIzMTcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBTYW1zdW5nIFNvQyBVU0IgMS4xLzIuMCBQSFkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9QSFlfRVhZTk9TX1VTQjJfSAorI2RlZmluZSBfUEhZX0VYWU5PU19VU0IyX0gKKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjZGVmaW5lIEtIWiAxMDAwCisjZGVmaW5lIE1IWiAoS0haICogS0haKQorCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXI7CitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZTsKK3N0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZzsKKworc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgeworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfY29tbW9uX3BoeSAqY2ZnOworCXN0cnVjdCBwaHkgKnBoeTsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydjsKKwlib29sIGVuYWJsZWQ7Cit9OworCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgeworCWNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyAqY2ZnOworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrICpyZWZfY2xrOworCXVuc2lnbmVkIGxvbmcgcmVmX3JhdGU7CisJdTMyIHJlZl9yZWdfdmFsOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKnJlZ19waHk7CisJc3RydWN0IHJlZ21hcCAqcmVnX3BtdTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdfc3lzOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSBpbnN0YW5jZXNbMF07Cit9OworCitzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgeworCWludCAoKnBvd2VyX29uKShzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9pbnN0YW5jZSAqKTsKKwlpbnQgKCpwb3dlcl9vZmYpKHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2luc3RhbmNlICopOworCXVuc2lnbmVkIGludCBpZDsKKwljaGFyICpsYWJlbDsKK307CisKKworc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIHsKKwljb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX2NvbW1vbl9waHkgKnBoeXM7CisJaW50ICgqcmF0ZV90b19jbGspKHVuc2lnbmVkIGxvbmcsIHUzMiAqKTsKKwl1bnNpZ25lZCBpbnQgbnVtX3BoeXM7CisJYm9vbCBoYXNfbW9kZV9zd2l0Y2g7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczQyMTBfdXNiMl9waHlfY29uZmlnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M0eDEyX3VzYjJfcGh5X2NvbmZpZzsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zNTI1MF91c2IyX3BoeV9jb25maWc7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU2YzRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXN1bjRpLXVzYi5jCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogQWxsd2lubmVyIHN1bjRpIFVTQiBwaHkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisgKgorICogQmFzZWQgb24gY29kZSBmcm9tCisgKiBBbGx3aW5uZXIgVGVjaG5vbG9neSBDby4sIEx0ZC4gPHd3dy5hbGx3aW5uZXJ0ZWNoLmNvbT4KKyAqCisgKiBNb2RlbGxlZCBhZnRlcjogU2Ftc3VuZyBTNVAvRVhZTk9TIFNvQyBzZXJpZXMgTUlQSSBDU0lTL0RTSU0gRFBIWSBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOiBTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisKKyNkZWZpbmUgUkVHX0lTQ1IJCQkweDAwCisjZGVmaW5lIFJFR19QSFlDVEwJCQkweDA0CisjZGVmaW5lIFJFR19QSFlCSVNUCQkJMHgwOAorI2RlZmluZSBSRUdfUEhZVFVORQkJCTB4MGMKKworI2RlZmluZSBQSFlDVExfREFUQQkJCUJJVCg3KQorCisjZGVmaW5lIFNVTlhJX0FIQl9JQ0hSOF9FTgkJQklUKDEwKQorI2RlZmluZSBTVU5YSV9BSEJfSU5DUjRfQlVSU1RfRU4JQklUKDkpCisjZGVmaW5lIFNVTlhJX0FIQl9JTkNSWF9BTElHTl9FTglCSVQoOCkKKyNkZWZpbmUgU1VOWElfVUxQSV9CWVBBU1NfRU4JCUJJVCgwKQorCisvKiBDb21tb24gQ29udHJvbCBCaXRzIGZvciBCb3RoIFBIWXMgKi8KKyNkZWZpbmUgUEhZX1BMTF9CVwkJCTB4MDMKKyNkZWZpbmUgUEhZX1JFUzQ1X0NBTF9FTgkJMHgwYworCisvKiBQcml2YXRlIENvbnRyb2wgQml0cyBmb3IgRWFjaCBQSFkgKi8KKyNkZWZpbmUgUEhZX1RYX0FNUExJVFVERV9UVU5FCQkweDIwCisjZGVmaW5lIFBIWV9UWF9TTEVXUkFURV9UVU5FCQkweDIyCisjZGVmaW5lIFBIWV9WQlVTVkFMSURfVEhfU0VMCQkweDI1CisjZGVmaW5lIFBIWV9QVUxMVVBfUkVTX1NFTAkJMHgyNworI2RlZmluZSBQSFlfT1RHX0ZVTkNfRU4JCQkweDI4CisjZGVmaW5lIFBIWV9WQlVTX0RFVF9FTgkJCTB4MjkKKyNkZWZpbmUgUEhZX0RJU0NPTl9USF9TRUwJCTB4MmEKKworI2RlZmluZSBNQVhfUEhZUwkJCTMKKworc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSB7CisJc3RydWN0IGNsayAqY2xrOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IG51bV9waHlzOworCXUzMiBkaXNjX3RocmVzaDsKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSB7CisJCXN0cnVjdCBwaHkgKnBoeTsKKwkJdm9pZCBfX2lvbWVtICpwbXU7CisJCXN0cnVjdCByZWd1bGF0b3IgKnZidXM7CisJCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKKwkJaW50IGluZGV4OworCX0gcGh5c1tNQVhfUEhZU107Cit9OworCisjZGVmaW5lIHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpIFwKKwljb250YWluZXJfb2YoKHBoeSksIHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEsIHBoeXNbKHBoeSktPmluZGV4XSkKKworc3RhdGljIHZvaWQgc3VuNGlfdXNiX3BoeV93cml0ZShzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5LCB1MzIgYWRkciwgdTMyIGRhdGEsCisJCQkJaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpwaHlfZGF0YSA9IHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpOworCXUzMiB0ZW1wLCB1c2JjX2JpdCA9IEJJVChwaHktPmluZGV4ICogMik7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZwaHlfZGF0YS0+bXV0ZXgpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXRlbXAgPSByZWFkbChwaHlfZGF0YS0+YmFzZSArIFJFR19QSFlDVEwpOworCisJCS8qIGNsZWFyIHRoZSBhZGRyZXNzIHBvcnRpb24gKi8KKwkJdGVtcCAmPSB+KDB4ZmYgPDwgOCk7CisKKwkJLyogc2V0IHRoZSBhZGRyZXNzICovCisJCXRlbXAgfD0gKChhZGRyICsgaSkgPDwgOCk7CisJCXdyaXRlbCh0ZW1wLCBwaHlfZGF0YS0+YmFzZSArIFJFR19QSFlDVEwpOworCisJCS8qIHNldCB0aGUgZGF0YSBiaXQgYW5kIGNsZWFyIHVzYmMgYml0Ki8KKwkJdGVtcCA9IHJlYWRiKHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisJCWlmIChkYXRhICYgMHgxKQorCQkJdGVtcCB8PSBQSFlDVExfREFUQTsKKwkJZWxzZQorCQkJdGVtcCAmPSB+UEhZQ1RMX0RBVEE7CisJCXRlbXAgJj0gfnVzYmNfYml0OworCQl3cml0ZWIodGVtcCwgcGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKworCQkvKiBwdWxzZSB1c2JjX2JpdCAqLworCQl0ZW1wID0gcmVhZGIocGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKwkJdGVtcCB8PSB1c2JjX2JpdDsKKwkJd3JpdGViKHRlbXAsIHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisKKwkJdGVtcCA9IHJlYWRiKHBoeV9kYXRhLT5iYXNlICsgUkVHX1BIWUNUTCk7CisJCXRlbXAgJj0gfnVzYmNfYml0OworCQl3cml0ZWIodGVtcCwgcGh5X2RhdGEtPmJhc2UgKyBSRUdfUEhZQ1RMKTsKKworCQlkYXRhID4+PSAxOworCX0KKwltdXRleF91bmxvY2soJnBoeV9kYXRhLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1bjRpX3VzYl9waHlfcGFzc2J5KHN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHksIGludCBlbmFibGUpCit7CisJdTMyIGJpdHMsIHJlZ192YWx1ZTsKKworCWlmICghcGh5LT5wbXUpCisJCXJldHVybjsKKworCWJpdHMgPSBTVU5YSV9BSEJfSUNIUjhfRU4gfCBTVU5YSV9BSEJfSU5DUjRfQlVSU1RfRU4gfAorCQlTVU5YSV9BSEJfSU5DUlhfQUxJR05fRU4gfCBTVU5YSV9VTFBJX0JZUEFTU19FTjsKKworCXJlZ192YWx1ZSA9IHJlYWRsKHBoeS0+cG11KTsKKworCWlmIChlbmFibGUpCisJCXJlZ192YWx1ZSB8PSBiaXRzOworCWVsc2UKKwkJcmVnX3ZhbHVlICY9IH5iaXRzOworCisJd3JpdGVsKHJlZ192YWx1ZSwgcGh5LT5wbXUpOworfQorCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHlfaW5pdChzdHJ1Y3QgcGh5ICpfcGh5KQoreworCXN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoX3BoeSk7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSA9IHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpOworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGF0YS0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChwaHktPnJlc2V0KTsKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYXRhLT5jbGspOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEFkanVzdCBQSFkncyBtYWduaXR1ZGUgYW5kIHJhdGUgKi8KKwlzdW40aV91c2JfcGh5X3dyaXRlKHBoeSwgUEhZX1RYX0FNUExJVFVERV9UVU5FLCAweDE0LCA1KTsKKworCS8qIERpc2Nvbm5lY3QgdGhyZXNob2xkIGFkanVzdG1lbnQgKi8KKwlzdW40aV91c2JfcGh5X3dyaXRlKHBoeSwgUEhZX0RJU0NPTl9USF9TRUwsIGRhdGEtPmRpc2NfdGhyZXNoLCAyKTsKKworCXN1bjRpX3VzYl9waHlfcGFzc2J5KHBoeSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW40aV91c2JfcGh5X2V4aXQoc3RydWN0IHBoeSAqX3BoeSkKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKF9waHkpOworCXN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKmRhdGEgPSB0b19zdW40aV91c2JfcGh5X2RhdGEocGh5KTsKKworCXN1bjRpX3VzYl9waHlfcGFzc2J5KHBoeSwgMCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQocGh5LT5yZXNldCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhdGEtPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW40aV91c2JfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKl9waHkpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwaHktPnZidXMpCisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocGh5LT52YnVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfdXNiX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqX3BoeSkKK3sKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKF9waHkpOworCisJaWYgKHBoeS0+dmJ1cykKKwkJcmVndWxhdG9yX2Rpc2FibGUocGh5LT52YnVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBoeV9vcHMgc3VuNGlfdXNiX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gc3VuNGlfdXNiX3BoeV9pbml0LAorCS5leGl0CQk9IHN1bjRpX3VzYl9waHlfZXhpdCwKKwkucG93ZXJfb24JPSBzdW40aV91c2JfcGh5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSBzdW40aV91c2JfcGh5X3Bvd2VyX29mZiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHBoeSAqc3VuNGlfdXNiX3BoeV94bGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKFdBUk5fT04oYXJncy0+YXJnc1swXSA9PSAwIHx8IGFyZ3MtPmFyZ3NbMF0gPj0gZGF0YS0+bnVtX3BoeXMpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCXJldHVybiBkYXRhLT5waHlzW2FyZ3MtPmFyZ3NbMF1dLnBoeTsKK30KKworc3RhdGljIGludCBzdW40aV91c2JfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJdm9pZCBfX2lvbWVtICpwbXUgPSBOVUxMOworCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcmVzZXQ7CisJc3RydWN0IHJlZ3VsYXRvciAqdmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisJY2hhciBuYW1lWzE2XTsKKwlpbnQgaTsKKworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bXV0ZXgpOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYWxsd2lubmVyLHN1bjVpLWExMy11c2ItcGh5IikpCisJCWRhdGEtPm51bV9waHlzID0gMjsKKwllbHNlCisJCWRhdGEtPm51bV9waHlzID0gMzsKKworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFsbHdpbm5lcixzdW40aS1hMTAtdXNiLXBoeSIpKQorCQlkYXRhLT5kaXNjX3RocmVzaCA9IDM7CisJZWxzZQorCQlkYXRhLT5kaXNjX3RocmVzaCA9IDI7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAicGh5X2N0cmwiKTsKKwlkYXRhLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5iYXNlKTsKKworCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJ1c2JfcGh5Iik7CisJaWYgKElTX0VSUihkYXRhLT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGdldCB1c2JfcGh5IGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+Y2xrKTsKKwl9CisKKwkvKiBTa2lwIDAsIDAgaXMgdGhlIHBoeSBmb3Igb3RnIHdoaWNoIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiAqLworCWZvciAoaSA9IDE7IGkgPCBkYXRhLT5udW1fcGh5czsgaSsrKSB7CisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInVzYiVkX3ZidXMiLCBpKTsKKwkJdmJ1cyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsIG5hbWUpOworCQlpZiAoSVNfRVJSKHZidXMpKSB7CisJCQlpZiAoUFRSX0VSUih2YnVzKSA9PSAtRVBST0JFX0RFRkVSKQorCQkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQkJdmJ1cyA9IE5VTEw7CisJCX0KKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ1c2IlZF9yZXNldCIsIGkpOworCQlyZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCBuYW1lKTsKKwkJaWYgKElTX0VSUihyZXNldCkpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCByZXNldCAlc1xuIiwgbmFtZSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZXNldCk7CisJCX0KKworCQlpZiAoaSkgeyAvKiBObyBwbXUgZm9yIHVzYmMwICovCisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJwbXUlZCIsIGkpOworCQkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAorCQkJCQkJCUlPUkVTT1VSQ0VfTUVNLCBuYW1lKTsKKwkJCXBtdSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJCQlpZiAoSVNfRVJSKHBtdSkpCisJCQkJcmV0dXJuIFBUUl9FUlIocG11KTsKKwkJfQorCisJCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsICZzdW40aV91c2JfcGh5X29wcywgTlVMTCk7CisJCWlmIChJU19FUlIocGh5KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIFBIWSAlZFxuIiwgaSk7CisJCQlyZXR1cm4gUFRSX0VSUihwaHkpOworCQl9CisKKwkJZGF0YS0+cGh5c1tpXS5waHkgPSBwaHk7CisJCWRhdGEtPnBoeXNbaV0ucG11ID0gcG11OworCQlkYXRhLT5waHlzW2ldLnZidXMgPSB2YnVzOworCQlkYXRhLT5waHlzW2ldLnJlc2V0ID0gcmVzZXQ7CisJCWRhdGEtPnBoeXNbaV0uaW5kZXggPSBpOworCQlwaHlfc2V0X2RydmRhdGEocGh5LCAmZGF0YS0+cGh5c1tpXSk7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgZGF0YSk7CisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBzdW40aV91c2JfcGh5X3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpCisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfdXNiX3BoeV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC11c2ItcGh5IiB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy11c2ItcGh5IiB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC11c2ItcGh5IiB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW40aV91c2JfcGh5X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3VuNGlfdXNiX3BoeV9kcml2ZXIgPSB7CisJLnByb2JlCT0gc3VuNGlfdXNiX3BoeV9wcm9iZSwKKwkuZHJpdmVyID0geworCQkub2ZfbWF0Y2hfdGFibGUJPSBzdW40aV91c2JfcGh5X29mX21hdGNoLAorCQkubmFtZSAgPSAic3VuNGktdXNiLXBoeSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN1bjRpX3VzYl9waHlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgc3VuNGkgVVNCIHBoeSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktdGktcGlwZTMuYyBiL2RyaXZlcnMvcGh5L3BoeS10aS1waXBlMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTM2NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktdGktcGlwZTMuYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIHBoeS10aS1waXBlMyAtIFBJUEUzIFBIWSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjZGVmaW5lCVBMTF9TVEFUVVMJCTB4MDAwMDAwMDQKKyNkZWZpbmUJUExMX0dPCQkJMHgwMDAwMDAwOAorI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjEJMHgwMDAwMDAwQworI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjIJMHgwMDAwMDAxMAorI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjMJMHgwMDAwMDAxNAorI2RlZmluZQlQTExfQ09ORklHVVJBVElPTjQJMHgwMDAwMDAyMAorCisjZGVmaW5lCVBMTF9SRUdNX01BU0sJCTB4MDAxRkZFMDAKKyNkZWZpbmUJUExMX1JFR01fU0hJRlQJCTB4OQorI2RlZmluZQlQTExfUkVHTV9GX01BU0sJCTB4MDAwM0ZGRkYKKyNkZWZpbmUJUExMX1JFR01fRl9TSElGVAkweDAKKyNkZWZpbmUJUExMX1JFR05fTUFTSwkJMHgwMDAwMDFGRQorI2RlZmluZQlQTExfUkVHTl9TSElGVAkJMHgxCisjZGVmaW5lCVBMTF9TRUxGUkVRRENPX01BU0sJMHgwMDAwMDAwRQorI2RlZmluZQlQTExfU0VMRlJFUURDT19TSElGVAkweDEKKyNkZWZpbmUJUExMX1NEX01BU0sJCTB4MDAwM0ZDMDAKKyNkZWZpbmUJUExMX1NEX1NISUZUCQkxMAorI2RlZmluZQlTRVRfUExMX0dPCQkweDEKKyNkZWZpbmUgUExMX0xET1BXRE4JCUJJVCgxNSkKKyNkZWZpbmUgUExMX1RJQ09QV0ROCQlCSVQoMTYpCisjZGVmaW5lCVBMTF9MT0NLCQkweDIKKyNkZWZpbmUJUExMX0lETEUJCTB4MQorCisvKgorICogVGhpcyBpcyBhbiBFbXBpcmljYWwgdmFsdWUgdGhhdCB3b3JrcywgbmVlZCB0byBjb25maXJtIHRoZSBhY3R1YWwKKyAqIHZhbHVlIHJlcXVpcmVkIGZvciB0aGUgUElQRTNQSFlfUExMX0NPTkZJR1VSQVRJT04yLlBMTF9JRExFIHN0YXR1cworICogdG8gYmUgY29ycmVjdGx5IHJlZmxlY3RlZCBpbiB0aGUgUElQRTNQSFlfUExMX1NUQVRVUyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBQTExfSURMRV9USU1FCTEwMAkvKiBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgUExMX0xPQ0tfVElNRQkxMDAJLyogaW4gbWlsbGlzZWNvbmRzICovCisKK3N0cnVjdCBwaXBlM19kcGxsX3BhcmFtcyB7CisJdTE2CW07CisJdTgJbjsKKwl1OAlmcmVxOjM7CisJdTgJc2Q7CisJdTMyCW1mOworfTsKKworc3RydWN0IHBpcGUzX2RwbGxfbWFwIHsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJc3RydWN0IHBpcGUzX2RwbGxfcGFyYW1zIHBhcmFtczsKK307CisKK3N0cnVjdCB0aV9waXBlMyB7CisJdm9pZCBfX2lvbWVtCQkqcGxsX2N0cmxfYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sX2RldjsKKwlzdHJ1Y3QgY2xrCQkqd2t1cGNsazsKKwlzdHJ1Y3QgY2xrCQkqc3lzX2NsazsKKwlzdHJ1Y3QgY2xrCQkqcmVmY2xrOworCXN0cnVjdCBwaXBlM19kcGxsX21hcAkqZHBsbF9tYXA7Cit9OworCitzdGF0aWMgc3RydWN0IHBpcGUzX2RwbGxfbWFwIGRwbGxfbWFwX3VzYltdID0geworCXsxMjAwMDAwMCwgezEyNTAsIDUsIDQsIDIwLCAwfSB9LAkvKiAxMiBNSHogKi8KKwl7MTY4MDAwMDAsIHszMTI1LCAyMCwgNCwgMjAsIDB9IH0sCS8qIDE2LjggTUh6ICovCisJezE5MjAwMDAwLCB7MTE3MiwgOCwgNCwgMjAsIDY1NTM3fSB9LAkvKiAxOS4yIE1IeiAqLworCXsyMDAwMDAwMCwgezEwMDAsIDcsIDQsIDEwLCAwfSB9LAkvKiAyMCBNSHogKi8KKwl7MjYwMDAwMDAsIHsxMjUwLCAxMiwgNCwgMjAsIDB9IH0sCS8qIDI2IE1IeiAqLworCXszODQwMDAwMCwgezMxMjUsIDQ3LCA0LCAyMCwgOTI4NDN9IH0sCS8qIDM4LjQgTUh6ICovCisJeyB9LAkJCQkJLyogVGVybWluYXRvciAqLworfTsKKworc3RhdGljIHN0cnVjdCBwaXBlM19kcGxsX21hcCBkcGxsX21hcF9zYXRhW10gPSB7CisJezEyMDAwMDAwLCB7MTAwMCwgNywgNCwgNiwgMH0gfSwJLyogMTIgTUh6ICovCisJezE2ODAwMDAwLCB7NzE0LCA3LCA0LCA2LCAwfSB9LAkJLyogMTYuOCBNSHogKi8KKwl7MTkyMDAwMDAsIHs2MjUsIDcsIDQsIDYsIDB9IH0sCQkvKiAxOS4yIE1IeiAqLworCXsyMDAwMDAwMCwgezYwMCwgNywgNCwgNiwgMH0gfSwJCS8qIDIwIE1IeiAqLworCXsyNjAwMDAwMCwgezQ2MSwgNywgNCwgNiwgMH0gfSwJCS8qIDI2IE1IeiAqLworCXszODQwMDAwMCwgezMxMiwgNywgNCwgNiwgMH0gfSwJCS8qIDM4LjQgTUh6ICovCisJeyB9LAkJCQkJLyogVGVybWluYXRvciAqLworfTsKKworc3RhdGljIGlubGluZSB1MzIgdGlfcGlwZTNfcmVhZGwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGlfcGlwZTNfd3JpdGVsKHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0LAorCXUzMiBkYXRhKQoreworCV9fcmF3X3dyaXRlbChkYXRhLCBhZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHN0cnVjdCBwaXBlM19kcGxsX3BhcmFtcyAqdGlfcGlwZTNfZ2V0X2RwbGxfcGFyYW1zKHN0cnVjdCB0aV9waXBlMyAqcGh5KQoreworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwlzdHJ1Y3QgcGlwZTNfZHBsbF9tYXAgKmRwbGxfbWFwID0gcGh5LT5kcGxsX21hcDsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUocGh5LT5zeXNfY2xrKTsKKworCWZvciAoOyBkcGxsX21hcC0+cmF0ZTsgZHBsbF9tYXArKykgeworCQlpZiAocmF0ZSA9PSBkcGxsX21hcC0+cmF0ZSkKKwkJCXJldHVybiAmZHBsbF9tYXAtPnBhcmFtczsKKwl9CisKKwlkZXZfZXJyKHBoeS0+ZGV2LCAiTm8gRFBMTCBjb25maWd1cmF0aW9uIGZvciAlbHUgSHogU1lTIENMS1xuIiwgcmF0ZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB0aV9waXBlM19wb3dlcl9vZmYoc3RydWN0IHBoeSAqeCkKK3sKKwlzdHJ1Y3QgdGlfcGlwZTMgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKKworCW9tYXBfY29udHJvbF9waHlfcG93ZXIocGh5LT5jb250cm9sX2RldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aV9waXBlM19wb3dlcl9vbihzdHJ1Y3QgcGh5ICp4KQoreworCXN0cnVjdCB0aV9waXBlMyAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOworCisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX2RwbGxfd2FpdF9sb2NrKHN0cnVjdCB0aV9waXBlMyAqcGh5KQoreworCXUzMgkJdmFsOworCXVuc2lnbmVkIGxvbmcJdGltZW91dDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhQTExfTE9DS19USU1FKTsKKwlkbyB7CisJCWNwdV9yZWxheCgpOworCQl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOworCQlpZiAodmFsICYgUExMX0xPQ0spCisJCQlicmVhazsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlpZiAoISh2YWwgJiBQTExfTE9DSykpIHsKKwkJZGV2X2VycihwaHktPmRldiwgIkRQTEwgZmFpbGVkIHRvIGxvY2tcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX2RwbGxfcHJvZ3JhbShzdHJ1Y3QgdGlfcGlwZTMgKnBoeSkKK3sKKwl1MzIJCQl2YWw7CisJc3RydWN0IHBpcGUzX2RwbGxfcGFyYW1zICpkcGxsX3BhcmFtczsKKworCWRwbGxfcGFyYW1zID0gdGlfcGlwZTNfZ2V0X2RwbGxfcGFyYW1zKHBoeSk7CisJaWYgKCFkcGxsX3BhcmFtcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSk7CisJdmFsICY9IH5QTExfUkVHTl9NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+biA8PCBQTExfUkVHTl9TSElGVDsKKwl0aV9waXBlM193cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEsIHZhbCk7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7CisJdmFsICY9IH5QTExfU0VMRlJFUURDT19NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+ZnJlcSA8PCBQTExfU0VMRlJFUURDT19TSElGVDsKKwl0aV9waXBlM193cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIsIHZhbCk7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSk7CisJdmFsICY9IH5QTExfUkVHTV9NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+bSA8PCBQTExfUkVHTV9TSElGVDsKKwl0aV9waXBlM193cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjEsIHZhbCk7CisKKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9ONCk7CisJdmFsICY9IH5QTExfUkVHTV9GX01BU0s7CisJdmFsIHw9IGRwbGxfcGFyYW1zLT5tZiA8PCBQTExfUkVHTV9GX1NISUZUOworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9ONCwgdmFsKTsKKworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04zKTsKKwl2YWwgJj0gflBMTF9TRF9NQVNLOworCXZhbCB8PSBkcGxsX3BhcmFtcy0+c2QgPDwgUExMX1NEX1NISUZUOworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMywgdmFsKTsKKworCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9HTywgU0VUX1BMTF9HTyk7CisKKwlyZXR1cm4gdGlfcGlwZTNfZHBsbF93YWl0X2xvY2socGh5KTsKK30KKworc3RhdGljIGludCB0aV9waXBlM19pbml0KHN0cnVjdCBwaHkgKngpCit7CisJc3RydWN0IHRpX3BpcGUzICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CisJdTMyIHZhbDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEJyaW5nIGl0IG91dCBvZiBJRExFIGlmIGl0IGlzIElETEUgKi8KKwl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMik7CisJaWYgKHZhbCAmIFBMTF9JRExFKSB7CisJCXZhbCAmPSB+UExMX0lETEU7CisJCXRpX3BpcGUzX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMiwgdmFsKTsKKwkJcmV0ID0gdGlfcGlwZTNfZHBsbF93YWl0X2xvY2socGh5KTsKKwl9CisKKwkvKiBQcm9ncmFtIHRoZSBEUExMIG9ubHkgaWYgbm90IGxvY2tlZCAqLworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX1NUQVRVUyk7CisJaWYgKCEodmFsICYgUExMX0xPQ0spKQorCQlpZiAodGlfcGlwZTNfZHBsbF9wcm9ncmFtKHBoeSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGlfcGlwZTNfZXhpdChzdHJ1Y3QgcGh5ICp4KQoreworCXN0cnVjdCB0aV9waXBlMyAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogU0FUQSBEUExMIGNhbid0IGJlIHBvd2VyZWQgZG93biBkdWUgdG8gRXJyYXRhIGk3ODMgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGh5LT5kZXYtPm9mX25vZGUsICJ0aSxwaHktcGlwZTMtc2F0YSIpKQorCQlyZXR1cm4gMDsKKworCS8qIFB1dCBEUExMIGluIElETEUgbW9kZSAqLworCXZhbCA9IHRpX3BpcGUzX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yKTsKKwl2YWwgfD0gUExMX0lETEU7CisJdGlfcGlwZTNfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yLCB2YWwpOworCisJLyogd2FpdCBmb3IgTERPIGFuZCBPc2NpbGxhdG9yIHRvIHBvd2VyIGRvd24gKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUExMX0lETEVfVElNRSk7CisJZG8geworCQljcHVfcmVsYXgoKTsKKwkJdmFsID0gdGlfcGlwZTNfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfU1RBVFVTKTsKKwkJaWYgKCh2YWwgJiBQTExfVElDT1BXRE4pICYmICh2YWwgJiBQTExfTERPUFdETikpCisJCQlicmVhazsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlpZiAoISh2YWwgJiBQTExfVElDT1BXRE4pIHx8ICEodmFsICYgUExMX0xET1BXRE4pKSB7CisJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gcG93ZXIgZG93bjogUExMX1NUQVRVUyAweCV4XG4iLAorCQkJdmFsKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBzdHJ1Y3QgcGh5X29wcyBvcHMgPSB7CisJLmluaXQJCT0gdGlfcGlwZTNfaW5pdCwKKwkuZXhpdAkJPSB0aV9waXBlM19leGl0LAorCS5wb3dlcl9vbgk9IHRpX3BpcGUzX3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSB0aV9waXBlM19wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfcGlwZTNfaWRfdGFibGVbXTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHRpX3BpcGUzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRpX3BpcGUzICpwaHk7CisJc3RydWN0IHBoeSAqZ2VuZXJpY19waHk7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbF9ub2RlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbnRyb2xfcGRldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cih0aV9waXBlM19pZF90YWJsZSksICZwZGV2LT5kZXYpOworCWlmICghbWF0Y2gpCisJCXJldHVybiAtRUlOVkFMOworCisJcGh5ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGh5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaHkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jIG1lbSBmb3IgVEkgUElQRTMgUEhZXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGh5LT5kcGxsX21hcCA9IChzdHJ1Y3QgcGlwZTNfZHBsbF9tYXAgKiltYXRjaC0+ZGF0YTsKKwlpZiAoIXBoeS0+ZHBsbF9tYXApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gRFBMTCBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInBsbF9jdHJsIik7CisJcGh5LT5wbGxfY3RybF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwaHktPnBsbF9jdHJsX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihwaHktPnBsbF9jdHJsX2Jhc2UpOworCisJcGh5LT5kZXYJCT0gJnBkZXYtPmRldjsKKworCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInRpLHBoeS1waXBlMy1zYXRhIikpIHsKKworCQlwaHktPndrdXBjbGsgPSBkZXZtX2Nsa19nZXQocGh5LT5kZXYsICJ3a3VwY2xrIik7CisJCWlmIChJU19FUlIocGh5LT53a3VwY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCB3a3VwY2xrXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKHBoeS0+d2t1cGNsayk7CisJCX0KKworCQlwaHktPnJlZmNsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgInJlZmNsayIpOworCQlpZiAoSVNfRVJSKHBoeS0+cmVmY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCByZWZjbGtcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIocGh5LT5yZWZjbGspOworCQl9CisJfSBlbHNlIHsKKwkJcGh5LT53a3VwY2xrID0gRVJSX1BUUigtRU5PREVWKTsKKwkJcGh5LT5yZWZjbGsgPSBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCXBoeS0+c3lzX2NsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgInN5c2NsayIpOworCWlmIChJU19FUlIocGh5LT5zeXNfY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IHN5c2Nsa1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbnRyb2xfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgImN0cmwtbW9kdWxlIiwgMCk7CisJaWYgKCFjb250cm9sX25vZGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZSBwaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29udHJvbF9wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShjb250cm9sX25vZGUpOworCWlmICghY29udHJvbF9wZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgY29udHJvbCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaHktPmNvbnRyb2xfZGV2ID0gJmNvbnRyb2xfcGRldi0+ZGV2OworCisJb21hcF9jb250cm9sX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBoeSk7CisJcG1fcnVudGltZV9lbmFibGUocGh5LT5kZXYpOworCisJZ2VuZXJpY19waHkgPSBkZXZtX3BoeV9jcmVhdGUocGh5LT5kZXYsICZvcHMsIE5VTEwpOworCWlmIChJU19FUlIoZ2VuZXJpY19waHkpKQorCQlyZXR1cm4gUFRSX0VSUihnZW5lcmljX3BoeSk7CisKKwlwaHlfc2V0X2RydmRhdGEoZ2VuZXJpY19waHksIHBoeSk7CisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIocGh5LT5kZXYsCisJCQlvZl9waHlfc2ltcGxlX3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpCisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisKKwlwbV9ydW50aW1lX2dldCgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpX3BpcGUzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoJnBkZXYtPmRldikpCisJCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKworc3RhdGljIGludCB0aV9waXBlM19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB0aV9waXBlMwkqcGh5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIUlTX0VSUihwaHktPndrdXBjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGh5LT53a3VwY2xrKTsKKwlpZiAoIUlTX0VSUihwaHktPnJlZmNsaykpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwaHktPnJlZmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aV9waXBlM19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTMyIHJldCA9IDA7CisJc3RydWN0IHRpX3BpcGUzCSpwaHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghSVNfRVJSKHBoeS0+cmVmY2xrKSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGh5LT5yZWZjbGspOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSByZWZjbGsgJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycjE7CisJCX0KKwl9CisKKwlpZiAoIUlTX0VSUihwaHktPndrdXBjbGspKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwaHktPndrdXBjbGspOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB3a3VwY2xrICVkXG4iLCByZXQpOworCQkJZ290byBlcnIyOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2VycjI6CisJaWYgKCFJU19FUlIocGh5LT5yZWZjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGh5LT5yZWZjbGspOworCitlcnIxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0aV9waXBlM19wbV9vcHMgPSB7CisJU0VUX1JVTlRJTUVfUE1fT1BTKHRpX3BpcGUzX3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIHRpX3BpcGUzX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKworI2RlZmluZSBERVZfUE1fT1BTICAgICAoJnRpX3BpcGUzX3BtX29wcykKKyNlbHNlCisjZGVmaW5lIERFVl9QTV9PUFMgICAgIE5VTEwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0aV9waXBlM19pZF90YWJsZVtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAidGkscGh5LXVzYjMiLAorCQkuZGF0YSA9IGRwbGxfbWFwX3VzYiwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAidGksb21hcC11c2IzIiwKKwkJLmRhdGEgPSBkcGxsX21hcF91c2IsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLHBoeS1waXBlMy1zYXRhIiwKKwkJLmRhdGEgPSBkcGxsX21hcF9zYXRhLAorCX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0aV9waXBlM19pZF90YWJsZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGlfcGlwZTNfZHJpdmVyID0geworCS5wcm9iZQkJPSB0aV9waXBlM19wcm9iZSwKKwkucmVtb3ZlCQk9IHRpX3BpcGUzX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidGktcGlwZTMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gREVWX1BNX09QUywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRpX3BpcGUzX2lkX3RhYmxlKSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0aV9waXBlM19kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiB0aV9waXBlMyIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBQSVBFMyBwaHkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktdHdsNDAzMC11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCmluZGV4IGMzYWNlMWQuLjJlMGU5YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJZGV2X2Vycih0d2wtPmRldiwgInVuc3VwcG9ydGVkIFQyIHRyYW5zY2VpdmVyIG1vZGUgJWRcbiIsCiAJCQkJbW9kZSk7CiAJCWJyZWFrOwotCX07CisJfQogfQogCiBzdGF0aWMgdm9pZCB0d2w0MDMwX2kyY19hY2Nlc3Moc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsIGludCBvbikKQEAgLTY2MSw3ICs2NjEsNyBAQAogCXN0cnVjdCBwaHlfcHJvdmlkZXIJKnBoeV9wcm92aWRlcjsKIAlzdHJ1Y3QgcGh5X2luaXRfZGF0YQkqaW5pdF9kYXRhID0gTlVMTDsKIAotCXR3bCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YgKnR3bCwgR0ZQX0tFUk5FTCk7CisJdHdsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHdsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0d2wpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02NzYsNyArNjc2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jb3RnID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZiAqb3RnLCBHRlBfS0VSTkVMKTsKKwlvdGcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpvdGcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW90ZykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS14Z2VuZS5jIGIvZHJpdmVycy9waHkvcGh5LXhnZW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhMWNjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHkteGdlbmUuYwpAQCAtMCwwICsxLDE3NTAgQEAKKy8qCisgKiBBcHBsaWVkTWljcm8gWC1HZW5lIE11bHRpLXB1cnBvc2UgUEhZIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBMb2MgSG8gPGxob0BhcG0uY29tPgorICogICAgICAgICBUdWFuIFBoYW4gPHRwaGFuQGFwbS5jb20+CisgKiAgICAgICAgIFN1bWFuIFRyaXBhdGhpIDxzdHJpcGF0aGlAYXBtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFRoZSBBUE0gWC1HZW5lIFBIWSBjb25zaXN0cyBvZiB0d28gUExMIGNsb2NrIG1hY3JvJ3MgKENNVSkgYW5kIGxhbmVzLgorICogVGhlIGZpcnN0IFBMTCBjbG9jayBtYWNybyBpcyB1c2VkIGZvciBpbnRlcm5hbCByZWZlcmVuY2UgY2xvY2suIFRoZSBzZWNvbmQKKyAqIFBMTCBjbG9jayBtYWNybyBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFBIWS4gVGhpcyBkcml2ZXIKKyAqIGNvbmZpZ3VyZXMgdGhlIGZpcnN0IFBMTCBDTVUsIHRoZSBzZWNvbmQgUExMIENNVSwgYW5kIHByb2dyYW1zIHRoZSBQSFkgdG8KKyAqIG9wZXJhdGUgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIG9mIG9wZXJhdGlvbi4gVGhlIGZpcnN0IFBMTCBDTVUgaXMgb25seQorICogcmVxdWlyZWQgaWYgaW50ZXJuYWwgY2xvY2sgaXMgZW5hYmxlZC4KKyAqCisgKiBMb2dpY2FsIExheWVyIE91dCBPZiBIVyBtb2R1bGUgdW5pdHM6CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgSW50ZXJuYWwgICAgICB8ICAgIHwtLS0tLS18CisgKiB8IFJlZiBQTEwgQ01VICAgfC0tLS18ICAgICAgfCAgICAgLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0KKyAqIC0tLS0tLS0tLS0tLSAtLS0tICAgIHwgTVVYICB8LS0tLS18UEhZIFBMTCBDTVV8LS0tLXwgU2VyZGVzfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICAgICAgICAgIHwgICAgLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBDbG9jayAtLS0tLS18ICAgICAgfCAgICAgLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLXwKKyAqCisgKiBUaGUgUmVmIFBMTCBDTVUgQ1NSIChDb25maWd1cmF0aW9uIFN5c3RlbSBSZWdpc3RlcnMpIGlzIGFjY2Vzc2VkCisgKiBpbmRpcmVjdGx5IGZyb20gdGhlIFNEUyBvZmZzZXQgYXQgMHgyMDAwLiBJdCBpcyBvbmx5IHJlcXVpcmVkIGZvcgorICogaW50ZXJuYWwgcmVmZXJlbmNlIGNsb2NrLgorICogVGhlIFBIWSBQTEwgQ01VIENTUiBpcyBhY2Nlc3NlZCBpbmRpcmVjdGx5IGZyb20gdGhlIFNEUyBvZmZzZXQgYXQgMHgwMDAwLgorICogVGhlIFNlcmRlcyBDU1IgaXMgYWNjZXNzZWQgaW5kaXJlY3RseSBmcm9tIHRoZSBTRFMgb2Zmc2V0IGF0IDB4MDQwMC4KKyAqCisgKiBUaGUgUmVmIFBMTCBDTVUgY2FuIGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lIFBIWSBJUCBvciBvdXRzaWRlIHRoZSBQSFkgSVAKKyAqIGR1ZSB0byBzaGFyZWQgUmVmIFBMTCBDTVUuIEZvciBQSFkgd2l0aCBSZWYgUExMIENNVSBzaGFyZWQgd2l0aCBhbm90aGVyIElQLAorICogaXQgaXMgbG9jYXRlZCBvdXRzaWRlIHRoZSBQSFkgSVAuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIHRoZSBQSFkgbG9jYXRlZAorICogYXQgMHgxZjIzYTAwMCAoU0FUQSBQb3J0IDQvNSkuIEZvciBzdWNoIFBIWSwgYW5vdGhlciByZXNvdXJjZSBpcyByZXF1aXJlZAorICogdG8gbG9jYXRlZCB0aGUgU0RTL1JlZiBQTEwgQ01VIG1vZHVsZSBhbmQgaXRzIGNsb2NrIGZvciB0aGF0IElQIGVuYWJsZWQuCisgKgorICogQ3VycmVudGx5LCB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIEdlbjMgU0FUQSBtb2RlIHdpdGggZXh0ZXJuYWwgY2xvY2suCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisvKiBNYXggMiBsYW5lcyBwZXIgYSBQSFkgdW5pdCAqLworI2RlZmluZSBNQVhfTEFORQkJCTIKKworLyogUmVnaXN0ZXIgb2Zmc2V0IGluc2lkZSB0aGUgUEhZICovCisjZGVmaW5lIFNFUkRFU19QTExfSU5ESVJFQ1RfT0ZGU0VUCTB4MDAwMAorI2RlZmluZSBTRVJERVNfUExMX1JFRl9JTkRJUkVDVF9PRkZTRVQJMHgyMDAwCisjZGVmaW5lIFNFUkRFU19JTkRJUkVDVF9PRkZTRVQJCTB4MDQwMAorI2RlZmluZSBTRVJERVNfTEFORV9TVFJJREUJCTB4MDIwMAorCisvKiBTb21lIGRlZmF1bHQgU2VyZGVzIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1RYQk9PU1RfR0FJTgl7IDB4MWUsIDB4MWUsIDB4MWUgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhFWUVESVJFQ1RJT04JeyAweDAsIDB4MCwgMHgwIH0KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1RYRVlFVFVOSU5HCXsgMHhhLCAweGEsIDB4YSB9CisjZGVmaW5lIERFRkFVTFRfU0FUQV9TUERfU0VMCQl7IDB4MSwgMHgzLCAweDcgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhBTVAJCXsgMHg4LCAweDgsIDB4OCB9CisjZGVmaW5lIERFRkFVTFRfU0FUQV9UWENOMQkJeyAweDIsIDB4MiwgMHgyIH0KKyNkZWZpbmUgREVGQVVMVF9TQVRBX1RYQ04yCQl7IDB4MCwgMHgwLCAweDAgfQorI2RlZmluZSBERUZBVUxUX1NBVEFfVFhDUDEJCXsgMHhhLCAweGEsIDB4YSB9CisKKyNkZWZpbmUgU0FUQV9TUERfU0VMX0dFTjMJCTB4NworI2RlZmluZSBTQVRBX1NQRF9TRUxfR0VOMgkJMHgzCisjZGVmaW5lIFNBVEFfU1BEX1NFTF9HRU4xCQkweDEKKworI2RlZmluZSBTU0NfRElTQUJMRQkJCTAKKyNkZWZpbmUgU1NDX0VOQUJMRQkJCTEKKworI2RlZmluZSBGQkRJVl9WQUxfNTBNCQkJMHg3NworI2RlZmluZSBSRUZESVZfVkFMXzUwTQkJCTB4MQorI2RlZmluZSBGQkRJVl9WQUxfMTAwTQkJCTB4M0IKKyNkZWZpbmUgUkVGRElWX1ZBTF8xMDBNCQkJMHgwCisKKy8qIFNBVEEgQ2xvY2svUmVzZXQgQ1NSICovCisjZGVmaW5lIFNBVEFDTEtFTlJFRwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIFNBVEEwX0NPUkVfQ0xLRU4JCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFNBVEExX0NPUkVfQ0xLRU4JCTB4MDAwMDAwMDQKKyNkZWZpbmUgU0FUQVNSRVNFVFJFRwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgIFNBVEFfTUVNX1JFU0VUX01BU0sJCTB4MDAwMDAwMjAKKyNkZWZpbmUgIFNBVEFfTUVNX1JFU0VUX1JEKHNyYykJCSgoKHNyYykgJiAweDAwMDAwMDIwKSA+PiA1KQorI2RlZmluZSAgU0FUQV9TRFNfUkVTRVRfTUFTSwkJMHgwMDAwMDAwNAorI2RlZmluZSAgU0FUQV9DU1JfUkVTRVRfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSAgU0FUQV9DT1JFX1JFU0VUX01BU0sJCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFNBVEFfUE1DTEtfUkVTRVRfTUFTSwkJMHgwMDAwMDAxMAorI2RlZmluZSAgU0FUQV9QQ0xLX1JFU0VUX01BU0sJCTB4MDAwMDAwMDgKKworLyogU0RTIENTUiB1c2VkIGZvciBQSFkgSW5kaXJlY3QgYWNjZXNzICovCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfUENTX0NUTDAJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIFJFR1NQRUNfQ0ZHX0lfVFhfV09SRE1PREUwX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwNzAwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNikgJiAweDAwMDcwMDAwKSkKKyNkZWZpbmUgIFJFR1NQRUNfQ0ZHX0lfUlhfV09SRE1PREUwX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDBlMDAwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAyMSkgJiAweDAwZTAwMDAwKSkKKyNkZWZpbmUgU0FUQV9FTkVUX1NEU19DVEwwCQkweDAwMDAwMDBjCisjZGVmaW5lICBSRUdTUEVDX0NGR19JX0NVU1RPTUVSX1BJTl9NT0RFMF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDA3ZmZmKSB8ICgoKHUzMikgKHNyYykpICYgMHgwMDAwN2ZmZikpCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfQ1RMMQkJMHgwMDAwMDAxMAorI2RlZmluZSAgQ0ZHX0lfU1BEX1NFTF9DRFJfT1ZSMV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDBmKSB8ICgoKHUzMikgKHNyYykpICYgMHgwMDAwMDAwZikpCisjZGVmaW5lIFNBVEFfRU5FVF9TRFNfUlNUX0NUTAkJMHgwMDAwMDAyNAorI2RlZmluZSBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHCTB4MDAwMDAwM2MKKyNkZWZpbmUgIENGR19JTkRfV1JfQ01EX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgIENGR19JTkRfUkRfQ01EX01BU0sJCTB4MDAwMDAwMDIKKyNkZWZpbmUgIENGR19JTkRfQ01EX0RPTkVfTUFTSwkJMHgwMDAwMDAwNAorI2RlZmluZSAgQ0ZHX0lORF9BRERSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAzZmZmZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAzZmZmZjApKQorI2RlZmluZSBTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcJMHgwMDAwMDA0MAorI2RlZmluZSBTQVRBX0VORVRfU0RTX0lORF9XREFUQV9SRUcJMHgwMDAwMDA0NAorI2RlZmluZSBTQVRBX0VORVRfQ0xLX01BQ1JPX1JFRwkJMHgwMDAwMDA0YworI2RlZmluZSAgSV9SRVNFVF9CX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSkgJiAweDAwMDAwMDAxKSkKKyNkZWZpbmUgIElfUExMX0ZCRElWX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAxZmYwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMikgJiAweDAwMWZmMDAwKSkKKyNkZWZpbmUgIElfQ1VTVE9NRVJPVl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwZjgwKSB8ICgoKHUzMikgKHNyYykgPDwgNykgJiAweDAwMDAwZjgwKSkKKyNkZWZpbmUgIE9fUExMX0xPQ0tfUkQoc3JjKQkJKCgoc3JjKSAmIDB4NDAwMDAwMDApID4+IDMwKQorI2RlZmluZSAgT19QTExfUkVBRFlfUkQoc3JjKQkJKCgoc3JjKSAmIDB4ODAwMDAwMDApID4+IDMxKQorCisvKiBQTEwgQ2xvY2sgTWFjcm8gVW5pdCAoQ01VKSBDU1IgYWNjZXNzaW5nIGZyb20gU0RTIGluZGlyZWN0bHkgKi8KKyNkZWZpbmUgQ01VX1JFRzAJCQkweDAwMDAwCisjZGVmaW5lICBDTVVfUkVHMF9QTExfUkVGX1NFTF9NQVNLCTB4MDAwMDIwMDAKKyNkZWZpbmUgIENNVV9SRUcwX1BMTF9SRUZfU0VMX1NFVChkc3QsIHNyYykJXAorCQkoKChkc3QpICYgfjB4MDAwMDIwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMykgJiAweDAwMDAyMDAwKSkKKyNkZWZpbmUgIENNVV9SRUcwX1BET1dOX01BU0sJCTB4MDAwMDQwMDAKKyNkZWZpbmUgIENNVV9SRUcwX0NBTF9DT1VOVF9SRVNPTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGUwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAwMGUwKSkKKyNkZWZpbmUgQ01VX1JFRzEJCQkweDAwMDAyCisjZGVmaW5lICBDTVVfUkVHMV9QTExfQ1BfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwM2MwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMDNjMDApKQorI2RlZmluZSAgQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgIENNVV9SRUcxX1BMTF9DUF9TRUxfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDNlMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDNlMCkpCisjZGVmaW5lICBDTVVfUkVHMV9SRUZDTEtfQ01PU19TRUxfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lICBDTVVfUkVHMV9SRUZDTEtfQ01PU19TRUxfU0VUKGRzdCwgc3JjKQlcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMSkgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAwMSkpCisjZGVmaW5lIENNVV9SRUcyCQkJMHgwMDAwNAorI2RlZmluZSAgQ01VX1JFRzJfUExMX1JFRkRJVl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBjMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTQpICYgMHgwMDAwYzAwMCkpCisjZGVmaW5lICBDTVVfUkVHMl9QTExfTEZSRVNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAxZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAxZSkpCisjZGVmaW5lICBDTVVfUkVHMl9QTExfRkJESVZfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwM2ZlMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwM2ZlMCkpCisjZGVmaW5lIENNVV9SRUczCQkJMHgwMDAwNgorI2RlZmluZSAgQ01VX1JFRzNfVkNPVkFSU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMGYpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMGYpKQorI2RlZmluZSAgQ01VX1JFRzNfVkNPX01PTVNFTF9JTklUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAzZjApKQorI2RlZmluZSAgQ01VX1JFRzNfVkNPX01BTk1PTVNFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmYzAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTApICYgMHgwMDAwZmMwMCkpCisjZGVmaW5lIENNVV9SRUc0CQkJMHgwMDAwOAorI2RlZmluZSBDTVVfUkVHNQkJCTB4MDAwMGEKKyNkZWZpbmUgIENNVV9SRUc1X1BMTF9MRlNNQ0FQX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGMwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNCkgJiAweDAwMDBjMDAwKSkKKyNkZWZpbmUgIENNVV9SRUc1X1BMTF9MT0NLX1JFU09MVVRJT05fU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwZSkpCisjZGVmaW5lICBDTVVfUkVHNV9QTExfTEZDQVBfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMzAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEyKSAmIDB4MDAwMDMwMDApKQorI2RlZmluZSAgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ01VX1JFRzYJCQkweDAwMDBjCisjZGVmaW5lICBDTVVfUkVHNl9QTExfVlJFR1RSSU1fU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDYwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDkpICYgMHgwMDAwMDYwMCkpCisjZGVmaW5lICBDTVVfUkVHNl9NQU5fUFZUX0NBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA0KSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDA0KSkKKyNkZWZpbmUgQ01VX1JFRzcJCQkweDAwMDBlCisjZGVmaW5lICBDTVVfUkVHN19QTExfQ0FMSUJfRE9ORV9SRChzcmMpICgoMHgwMDAwNDAwMCAmICh1MzIpIChzcmMpKSA+PiAxNCkKKyNkZWZpbmUgIENNVV9SRUc3X1ZDT19DQUxfRkFJTF9SRChzcmMpCSgoMHgwMDAwMGMwMCAmICh1MzIpIChzcmMpKSA+PiAxMCkKKyNkZWZpbmUgQ01VX1JFRzgJCQkweDAwMDEwCisjZGVmaW5lIENNVV9SRUc5CQkJMHgwMDAxMgorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fOEJJVAkJMHgwMDAKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzEwQklUCTB4MDAxCisjZGVmaW5lICBDTVVfUkVHOV9XT1JEX0xFTl8xNkJJVAkweDAwMgorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fMjBCSVQJMHgwMDMKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzMyQklUCTB4MDA0CisjZGVmaW5lICBDTVVfUkVHOV9XT1JEX0xFTl80MEJJVAkweDAwNQorI2RlZmluZSAgQ01VX1JFRzlfV09SRF9MRU5fNjRCSVQJMHgwMDYKKyNkZWZpbmUgIENNVV9SRUc5X1dPUkRfTEVOXzY2QklUCTB4MDA3CisjZGVmaW5lICBDTVVfUkVHOV9UWF9XT1JEX01PREVfQ0gxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAzODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDAzODApKQorI2RlZmluZSAgQ01VX1JFRzlfVFhfV09SRF9NT0RFX0NIMF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDcwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwMDcwKSkKKyNkZWZpbmUgIENNVV9SRUc5X1BMTF9QT1NUX0RJVkJZMl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgIENNVV9SRUc5X1ZCR19CWVBBU1NCX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDQpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwMDQpKQorI2RlZmluZSAgQ01VX1JFRzlfSUdFTl9CWVBBU1NfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwMikpCisjZGVmaW5lIENNVV9SRUcxMAkJCTB4MDAwMTQKKyNkZWZpbmUgIENNVV9SRUcxMF9WUkVHX1JFRlNFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAxKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDAxKSkKKyNkZWZpbmUgQ01VX1JFRzExCQkJMHgwMDAxNgorI2RlZmluZSBDTVVfUkVHMTIJCQkweDAwMDE4CisjZGVmaW5lICBDTVVfUkVHMTJfU1RBVEVfREVMQVk5X1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwZjApKQorI2RlZmluZSBDTVVfUkVHMTMJCQkweDAwMDFhCisjZGVmaW5lIENNVV9SRUcxNAkJCTB4MDAwMWMKKyNkZWZpbmUgQ01VX1JFRzE1CQkJMHgwMDAxZQorI2RlZmluZSBDTVVfUkVHMTYJCQkweDAwMDIwCisjZGVmaW5lICBDTVVfUkVHMTZfUFZUX0ROX01BTl9FTkFfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lICBDTVVfUkVHMTZfUFZUX1VQX01BTl9FTkFfTUFTSwkweDAwMDAwMDAyCisjZGVmaW5lICBDTVVfUkVHMTZfVkNPQ0FMX1dBSVRfQlRXX0NPREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAxYykgfCAoKCh1MzIpIChzcmMpIDw8IDIpICYgMHgwMDAwMDAxYykpCisjZGVmaW5lICBDTVVfUkVHMTZfQ0FMSUJSQVRJT05fRE9ORV9PVkVSUklERV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDQwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMDQwKSkKKyNkZWZpbmUgIENNVV9SRUcxNl9CWVBBU1NfUExMX0xPQ0tfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAyMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDAyMCkpCisjZGVmaW5lIENNVV9SRUcxNwkJCTB4MDAwMjIKKyNkZWZpbmUgIENNVV9SRUcxN19QVlRfQ09ERV9SMkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwN2YwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwN2YwMCkpCisjZGVmaW5lICBDTVVfUkVHMTdfUkVTRVJWRURfN19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGUwKSB8ICgoKHUzMikgKHNyYykgPDwgNSkgJiAweDAwMDAwMGUwKSkKKyNkZWZpbmUgIENNVV9SRUcxN19QVlRfVEVSTV9NQU5fRU5BX01BU0sJMHgwMDAwODAwMAorI2RlZmluZSBDTVVfUkVHMTgJCQkweDAwMDI0CisjZGVmaW5lIENNVV9SRUcxOQkJCTB4MDAwMjYKKyNkZWZpbmUgQ01VX1JFRzIwCQkJMHgwMDAyOAorI2RlZmluZSBDTVVfUkVHMjEJCQkweDAwMDJhCisjZGVmaW5lIENNVV9SRUcyMgkJCTB4MDAwMmMKKyNkZWZpbmUgQ01VX1JFRzIzCQkJMHgwMDAyZQorI2RlZmluZSBDTVVfUkVHMjQJCQkweDAwMDMwCisjZGVmaW5lIENNVV9SRUcyNQkJCTB4MDAwMzIKKyNkZWZpbmUgQ01VX1JFRzI2CQkJMHgwMDAzNAorI2RlZmluZSAgQ01VX1JFRzI2X0ZPUkNFX1BMTF9MT0NLX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMDEpKQorI2RlZmluZSBDTVVfUkVHMjcJCQkweDAwMDM2CisjZGVmaW5lIENNVV9SRUcyOAkJCTB4MDAwMzgKKyNkZWZpbmUgQ01VX1JFRzI5CQkJMHgwMDAzYQorI2RlZmluZSBDTVVfUkVHMzAJCQkweDAwMDNjCisjZGVmaW5lICBDTVVfUkVHMzBfTE9DS19DT1VOVF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA2KSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDA2KSkKKyNkZWZpbmUgIENNVV9SRUczMF9QQ0lFX01PREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwOCkgfCAoKCh1MzIpIChzcmMpIDw8IDMpICYgMHgwMDAwMDAwOCkpCisjZGVmaW5lIENNVV9SRUczMQkJCTB4MDAwM2UKKyNkZWZpbmUgQ01VX1JFRzMyCQkJMHgwMDA0MAorI2RlZmluZSAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLCTB4MDAwMDQwMDAKKyNkZWZpbmUgIENNVV9SRUczMl9QVlRfQ0FMX1dBSVRfU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDYpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDYpKQorI2RlZmluZSAgQ01VX1JFRzMyX0lSRUZfQURKX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAxODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDAxODApKQorI2RlZmluZSBDTVVfUkVHMzMJCQkweDAwMDQyCisjZGVmaW5lIENNVV9SRUczNAkJCTB4MDAwNDQKKyNkZWZpbmUgIENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9MT19NQVhfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwZikgfCAoKCh1MzIpIChzcmMpIDw8IDApICYgMHgwMDAwMDAwZikpCisjZGVmaW5lICBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfSElfTUFYX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDBmMDApIHwgKCgodTMyKSAoc3JjKSA8PCA4KSAmIDB4MDAwMDBmMDApKQorI2RlZmluZSAgQ01VX1JFRzM0X1ZDT19DQUxfVlRIX0xPX01JTl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGYwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwMGYwKSkKKyNkZWZpbmUgIENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9ISV9NSU5fU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEyKSAmIDB4MDAwMGYwMDApKQorI2RlZmluZSBDTVVfUkVHMzUJCQkweDAwMDQ2CisjZGVmaW5lICBDTVVfUkVHMzVfUExMX1NTQ19NT0RfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmUwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDkpICYgMHgwMDAwZmUwMCkpCisjZGVmaW5lIENNVV9SRUczNgkJCQkweDAwMDQ4CisjZGVmaW5lICBDTVVfUkVHMzZfUExMX1NTQ19FTl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDEwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwMDEwKSkKKyNkZWZpbmUgIENNVV9SRUczNl9QTExfU1NDX1ZTVEVQX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZmYzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMGZmYzApKQorI2RlZmluZSAgQ01VX1JFRzM2X1BMTF9TU0NfRFNNU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMjApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwMjApKQorI2RlZmluZSBDTVVfUkVHMzcJCQkweDAwMDRhCisjZGVmaW5lIENNVV9SRUczOAkJCTB4MDAwNGMKKyNkZWZpbmUgQ01VX1JFRzM5CQkJMHgwMDA0ZQorCisvKiBQSFkgbGFuZSBDU1IgYWNjZXNzaW5nIGZyb20gU0RTIGluZGlyZWN0bHkgKi8KKyNkZWZpbmUgUlhUWF9SRUcwCQkJMHgwMDAKKyNkZWZpbmUgIFJYVFhfUkVHMF9DVExFX0VRX0hSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMF9DVExFX0VRX1FSX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3YzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDA3YzApKQorI2RlZmluZSAgUlhUWF9SRUcwX0NUTEVfRVFfRlJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAzZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAzZSkpCisjZGVmaW5lIFJYVFhfUkVHMQkJCTB4MDAyCisjZGVmaW5lICBSWFRYX1JFRzFfUlhBQ1ZDTV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmMDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTIpICYgMHgwMDAwZjAwMCkpCisjZGVmaW5lICBSWFRYX1JFRzFfQ1RMRV9FUV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwZjgwKSB8ICgoKHUzMikgKHNyYykgPDwgNykgJiAweDAwMDAwZjgwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMV9SWFZSRUcxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNjApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwNjApKQorI2RlZmluZSAgUlhUWF9SRUcxX1JYSVJFRl9BREpfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwNikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgIDB4MDAwMDAwMDYpKQorI2RlZmluZSBSWFRYX1JFRzIJCQkweDAwNAorI2RlZmluZSAgUlhUWF9SRUcyX1ZUVF9FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDEwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwMDEwMCkpCisjZGVmaW5lICBSWFRYX1JFRzJfVFhfRklGT19FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAyMCkgfCAoKCh1MzIpIChzcmMpIDw8IDUpICYgMHgwMDAwMDAyMCkpCisjZGVmaW5lICBSWFRYX1JFRzJfVlRUX1NFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGMwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMGMwKSkKKyNkZWZpbmUgUlhUWF9SRUc0CQkJMHgwMDgKKyNkZWZpbmUgIFJYVFhfUkVHNF9UWF9MT09QQkFDS19CVUZfRU5fTUFTSwkweDAwMDAwMDQwCisjZGVmaW5lICBSWFRYX1JFRzRfVFhfREFUQV9SQVRFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGMwMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxNCkgJiAweDAwMDBjMDAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHNF9UWF9XT1JEX01PREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMzgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMDM4MDApKQorI2RlZmluZSBSWFRYX1JFRzUJCQkweDAwYQorI2RlZmluZSAgUlhUWF9SRUc1X1RYX0NOMV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDBmODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwZjgwMCkpCisjZGVmaW5lICBSWFRYX1JFRzVfVFhfQ1AxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3ZTApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDA3ZTApKQorI2RlZmluZSAgUlhUWF9SRUc1X1RYX0NOMl9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDFmKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDFmKSkKKyNkZWZpbmUgUlhUWF9SRUc2CQkJMHgwMGMKKyNkZWZpbmUgIFJYVFhfUkVHNl9UWEFNUF9DTlRMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3ODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDA3ODApKQorI2RlZmluZSAgUlhUWF9SRUc2X1RYQU1QX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDQwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMDQwKSkKKyNkZWZpbmUgIFJYVFhfUkVHNl9SWF9CSVNUX0VSUkNOVF9SRF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAxKSB8ICgoKHUzMikgKHNyYykgPDwgMCkgJiAweDAwMDAwMDAxKSkKKyNkZWZpbmUgIFJYVFhfUkVHNl9UWF9JRExFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDgpIHwgKCgodTMyKSAoc3JjKSA8PCAzKSAmIDB4MDAwMDAwMDgpKQorI2RlZmluZSAgUlhUWF9SRUc2X1JYX0JJU1RfUkVTWU5DX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDIpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDIpKQorI2RlZmluZSBSWFRYX1JFRzcJCQkweDAwZQorI2RlZmluZSAgUlhUWF9SRUc3X1JFU0VUQl9SWERfTUFTSwkweDAwMDAwMTAwCisjZGVmaW5lICBSWFRYX1JFRzdfUkVTRVRCX1JYQV9NQVNLCTB4MDAwMDAwODAKKyNkZWZpbmUgIFJYVFhfUkVHN19CSVNUX0VOQV9SWF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDQwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMDQwKSkKKyNkZWZpbmUgIFJYVFhfUkVHN19SWF9XT1JEX01PREVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMzgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMDM4MDApKQorI2RlZmluZSBSWFRYX1JFRzgJCQkweDAxMAorI2RlZmluZSAgUlhUWF9SRUc4X0NEUl9MT09QX0VOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDA0MDAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTQpICYgMHgwMDAwNDAwMCkpCisjZGVmaW5lICBSWFRYX1JFRzhfQ0RSX0JZUEFTU19SWExPU19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwMDgwMCkpCisjZGVmaW5lICBSWFRYX1JFRzhfU1NDX0VOQUJMRV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMjAwKSB8ICgoKHUzMikgKHNyYykgPDwgOSkgJiAweDAwMDAwMjAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOF9TRF9WUkVGX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwZjApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwZjApKQorI2RlZmluZSAgUlhUWF9SRUc4X1NEX0RJU0FCTEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDEwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDgpICYgMHgwMDAwMDEwMCkpCisjZGVmaW5lIFJYVFhfUkVHNwkJCTB4MDBlCisjZGVmaW5lICBSWFRYX1JFRzdfUkVTRVRCX1JYRF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMTAwKSB8ICgoKHUzMikgKHNyYykgPDwgOCkgJiAweDAwMDAwMTAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHN19SRVNFVEJfUlhBX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwODApIHwgKCgodTMyKSAoc3JjKSA8PCA3KSAmIDB4MDAwMDAwODApKQorI2RlZmluZSAgUlhUWF9SRUc3X0xPT1BfQkFDS19FTkFfQ1RMRV9NQVNLCTB4MDAwMDQwMDAKKyNkZWZpbmUgIFJYVFhfUkVHN19MT09QX0JBQ0tfRU5BX0NUTEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwNDAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDE0KSAmIDB4MDAwMDQwMDApKQorI2RlZmluZSBSWFRYX1JFRzExCQkJMHgwMTYKKyNkZWZpbmUgIFJYVFhfUkVHMTFfUEhBU0VfQURKVVNUX0xJTUlUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMgkJCTB4MDE4CisjZGVmaW5lICBSWFRYX1JFRzEyX0xBVENIX09GRl9FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMjAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEzKSAmIDB4MDAwMDIwMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMl9TVU1PU19FTkFCTEVfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwNCkgfCAoKCh1MzIpIChzcmMpIDw8IDIpICYgMHgwMDAwMDAwNCkpCisjZGVmaW5lICBSWFRYX1JFRzEyX1JYX0RFVF9URVJNX0VOQUJMRV9NQVNLCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYVFhfUkVHMTJfUlhfREVUX1RFUk1fRU5BQkxFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDIpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDIpKQorI2RlZmluZSBSWFRYX1JFRzEzCQkJMHgwMWEKKyNkZWZpbmUgUlhUWF9SRUcxNAkJCTB4MDFjCisjZGVmaW5lICBSWFRYX1JFRzE0X0NMVEVfTEFUQ0FMX01BTl9QUk9HX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwM2YpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwM2YpKQorI2RlZmluZSAgUlhUWF9SRUcxNF9DVExFX0xBVENBTF9NQU5fRU5BX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNDApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDAwNDApKQorI2RlZmluZSBSWFRYX1JFRzI2CQkJMHgwMzQKKyNkZWZpbmUgIFJYVFhfUkVHMjZfUEVSSU9EX0VSUk9SX0xBVENIX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDM4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDAzODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMjZfQkxXQ19FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwOCkgfCAoKCh1MzIpIChzcmMpIDw8IDMpICYgMHgwMDAwMDAwOCkpCisjZGVmaW5lIFJYVFhfUkVHMjEJCQkweDAyYQorI2RlZmluZSAgUlhUWF9SRUcyMV9ET19MQVRDSF9DQUxPVVRfUkQoc3JjKSAoKDB4MDAwMGZjMDAgJiAodTMyKSAoc3JjKSkgPj4gMTApCisjZGVmaW5lICBSWFRYX1JFRzIxX1hPX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwMDNmMCAmICh1MzIpIChzcmMpKSA+PiA0KQorI2RlZmluZSAgUlhUWF9SRUcyMV9MQVRDSF9DQUxfRkFJTF9PRERfUkQoc3JjKQkoKDB4MDAwMDAwMGYgJiAodTMyKShzcmMpKSkKKyNkZWZpbmUgUlhUWF9SRUcyMgkJCTB4MDJjCisjZGVmaW5lICBSWFRYX1JFRzIyX1NPX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwMDNmMCAmICh1MzIpIChzcmMpKSA+PiA0KQorI2RlZmluZSAgUlhUWF9SRUcyMl9FT19MQVRDSF9DQUxPVVRfUkQoc3JjKSAoKDB4MDAwMGZjMDAgJiAodTMyKSAoc3JjKSkgPj4gMTApCisjZGVmaW5lICBSWFRYX1JFRzIyX0xBVENIX0NBTF9GQUlMX0VWRU5fUkQoc3JjKQkoKDB4MDAwMDAwMGYgJiAodTMyKShzcmMpKSkKKyNkZWZpbmUgUlhUWF9SRUcyMwkJCTB4MDJlCisjZGVmaW5lICBSWFRYX1JFRzIzX0RFX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwZmMwMCAmICh1MzIpIChzcmMpKSA+PiAxMCkKKyNkZWZpbmUgIFJYVFhfUkVHMjNfWEVfTEFUQ0hfQ0FMT1VUX1JEKHNyYykgKCgweDAwMDAwM2YwICYgKHUzMikgKHNyYykpID4+IDQpCisjZGVmaW5lIFJYVFhfUkVHMjQJCQkweDAzMAorI2RlZmluZSAgUlhUWF9SRUcyNF9FRV9MQVRDSF9DQUxPVVRfUkQoc3JjKSAoKDB4MDAwMGZjMDAgJiAodTMyKSAoc3JjKSkgPj4gMTApCisjZGVmaW5lICBSWFRYX1JFRzI0X1NFX0xBVENIX0NBTE9VVF9SRChzcmMpICgoMHgwMDAwMDNmMCAmICh1MzIpIChzcmMpKSA+PiA0KQorI2RlZmluZSBSWFRYX1JFRzI3CQkJMHgwMzYKKyNkZWZpbmUgUlhUWF9SRUcyOAkJCTB4MDM4CisjZGVmaW5lIFJYVFhfUkVHMzEJCQkweDAzZQorI2RlZmluZSBSWFRYX1JFRzM4CQkJMHgwNGMKKyNkZWZpbmUgIFJYVFhfUkVHMzhfQ1VTVE9NRVJfUElOTU9ERV9JTlZfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiAweDAwMDBmZmZlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDBmZmZlKSkKKyNkZWZpbmUgUlhUWF9SRUczOQkJCTB4MDRlCisjZGVmaW5lIFJYVFhfUkVHNDAJCQkweDA1MAorI2RlZmluZSBSWFRYX1JFRzQxCQkJMHgwNTIKKyNkZWZpbmUgUlhUWF9SRUc0MgkJCTB4MDU0CisjZGVmaW5lIFJYVFhfUkVHNDMJCQkweDA1NgorI2RlZmluZSBSWFRYX1JFRzQ0CQkJMHgwNTgKKyNkZWZpbmUgUlhUWF9SRUc0NQkJCTB4MDVhCisjZGVmaW5lIFJYVFhfUkVHNDYJCQkweDA1YworI2RlZmluZSBSWFRYX1JFRzQ3CQkJMHgwNWUKKyNkZWZpbmUgUlhUWF9SRUc0OAkJCTB4MDYwCisjZGVmaW5lIFJYVFhfUkVHNDkJCQkweDA2MgorI2RlZmluZSBSWFRYX1JFRzUwCQkJMHgwNjQKKyNkZWZpbmUgUlhUWF9SRUc1MQkJCTB4MDY2CisjZGVmaW5lIFJYVFhfUkVHNTIJCQkweDA2OAorI2RlZmluZSBSWFRYX1JFRzUzCQkJMHgwNmEKKyNkZWZpbmUgUlhUWF9SRUc1NAkJCTB4MDZjCisjZGVmaW5lIFJYVFhfUkVHNTUJCQkweDA2ZQorI2RlZmluZSBSWFRYX1JFRzYxCQkJMHgwN2EKKyNkZWZpbmUgIFJYVFhfUkVHNjFfSVNDQU5fSU5CRVJUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMTApIHwgKCgodTMyKSAoc3JjKSA8PCA0KSAmIDB4MDAwMDAwMTApKQorI2RlZmluZSAgUlhUWF9SRUc2MV9MT0FERlJFUV9TSElGVF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA4KSB8ICgoKHUzMikgKHNyYykgPDwgMykgJiAweDAwMDAwMDA4KSkKKyNkZWZpbmUgIFJYVFhfUkVHNjFfRVlFX0NPVU5UX1dJRFRIX1NFTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMGMwKSB8ICgoKHUzMikgKHNyYykgPDwgNikgJiAweDAwMDAwMGMwKSkKKyNkZWZpbmUgIFJYVFhfUkVHNjFfU1BEX1NFTF9DRFJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwM2MwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDEwKSAmIDB4MDAwMDNjMDApKQorI2RlZmluZSBSWFRYX1JFRzYyCQkJMHgwN2MKKyNkZWZpbmUgIFJYVFhfUkVHNjJfUEVSSU9EX0gxX1FMQVRDSF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAzODAwKSB8ICgoKHUzMikgKHNyYykgPDwgMTEpICYgMHgwMDAwMzgwMCkpCisjZGVmaW5lIFJYVFhfUkVHODEJCQkweDBhMgorI2RlZmluZSAgUlhUWF9SRUc4OV9NVV9USDdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZjgwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDExKSAmIDB4MDAwMGY4MDApKQorI2RlZmluZSAgUlhUWF9SRUc4OV9NVV9USDhfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDdjMCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwMDdjMCkpCisjZGVmaW5lICBSWFRYX1JFRzg5X01VX1RIOV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDNlKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDNlKSkKKyNkZWZpbmUgUlhUWF9SRUc5NgkJCTB4MGMwCisjZGVmaW5lICBSWFRYX1JFRzk2X01VX0ZSRVExX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOTZfTVVfRlJFUTJfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDdjMCkgfCAoKCh1MzIpIChzcmMpIDw8IDYpICYgMHgwMDAwMDdjMCkpCisjZGVmaW5lICBSWFRYX1JFRzk2X01VX0ZSRVEzX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwM2UpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwM2UpKQorI2RlZmluZSBSWFRYX1JFRzk5CQkJMHgwYzYKKyNkZWZpbmUgIFJYVFhfUkVHOTlfTVVfUEhBU0UxX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGY4MDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMSkgJiAweDAwMDBmODAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHOTlfTVVfUEhBU0UyX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDA3YzApIHwgKCgodTMyKSAoc3JjKSA8PCA2KSAmIDB4MDAwMDA3YzApKQorI2RlZmluZSAgUlhUWF9SRUc5OV9NVV9QSEFTRTNfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAzZSkgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAzZSkpCisjZGVmaW5lIFJYVFhfUkVHMTAyCQkJMHgwY2MKKyNkZWZpbmUgIFJYVFhfUkVHMTAyX0ZSRVFMT09QX0xJTUlUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwNjApIHwgKCgodTMyKSAoc3JjKSA8PCA1KSAmIDB4MDAwMDAwNjApKQorI2RlZmluZSBSWFRYX1JFRzExNAkJCTB4MGU0CisjZGVmaW5lIFJYVFhfUkVHMTIxCQkJMHgwZjIKKyNkZWZpbmUgIFJYVFhfUkVHMTIxX1NVTU9TX0NBTF9DT0RFX1JEKHNyYykgKCgweDAwMDAwMDNlICYgKHUzMikoc3JjKSkgPj4gMHgxKQorI2RlZmluZSBSWFRYX1JFRzEyNQkJCTB4MGZhCisjZGVmaW5lICBSWFRYX1JFRzEyNV9QUV9SRUdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwZmUwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDkpICYgMHgwMDAwZmUwMCkpCisjZGVmaW5lICBSWFRYX1JFRzEyNV9TSUdOX1BRX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAxMDApIHwgKCgodTMyKSAoc3JjKSA8PCA4KSAmIDB4MDAwMDAxMDApKQorI2RlZmluZSAgUlhUWF9SRUcxMjVfU0lHTl9QUV8yQ19TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDgwKSB8ICgoKHUzMikgKHNyYykgPDwgNykgJiAweDAwMDAwMDgwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI1X1BIWl9NQU5VQUxDT0RFX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwN2MpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwN2MpKQorI2RlZmluZSAgUlhUWF9SRUcxMjVfUEhaX01BTlVBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDAyKSB8ICgoKHUzMikgKHNyYykgPDwgMSkgJiAweDAwMDAwMDAyKSkKKyNkZWZpbmUgUlhUWF9SRUcxMjcJCQkweDBmZQorI2RlZmluZSAgUlhUWF9SRUcxMjdfRk9SQ0VfU1VNX0NBTF9TVEFSVF9NQVNLCTB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYVFhfUkVHMTI3X0ZPUkNFX0xBVF9DQUxfU1RBUlRfTUFTSwkweDAwMDAwMDA0CisjZGVmaW5lICBSWFRYX1JFRzEyN19GT1JDRV9TVU1fQ0FMX1NUQVJUX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDIpIHwgKCgodTMyKSAoc3JjKSA8PCAxKSAmIDB4MDAwMDAwMDIpKQorI2RlZmluZSAgUlhUWF9SRUcxMjdfRk9SQ0VfTEFUX0NBTF9TVEFSVF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA0KSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDA0KSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI3X0xBVENIX01BTl9DQUxfRU5BX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDgpIHwgKCgodTMyKSAoc3JjKSA8PCAzKSAmIDB4MDAwMDAwMDgpKQorI2RlZmluZSAgUlhUWF9SRUcxMjdfRE9fTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI3X1hPX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMjgJCQkweDEwMAorI2RlZmluZSAgUlhUWF9SRUcxMjhfTEFUQ0hfQ0FMX1dBSVRfU0VMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMGMpIHwgKCgodTMyKSAoc3JjKSA8PCAyKSAmIDB4MDAwMDAwMGMpKQorI2RlZmluZSAgUlhUWF9SRUcxMjhfRU9fTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI4X1NPX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMjkJCQkweDEwMgorI2RlZmluZSAgUlhUWF9SRUcxMjlfREVfTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTI5X1hFX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxMzAJCQkweDEwNAorI2RlZmluZSAgUlhUWF9SRUcxMzBfRUVfTEFUQ0hfTUFOQ0FMX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMGZjMDApIHwgKCgodTMyKSAoc3JjKSA8PCAxMCkgJiAweDAwMDBmYzAwKSkKKyNkZWZpbmUgIFJYVFhfUkVHMTMwX1NFX0xBVENIX01BTkNBTF9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwM2YwKSB8ICgoKHUzMikgKHNyYykgPDwgNCkgJiAweDAwMDAwM2YwKSkKKyNkZWZpbmUgUlhUWF9SRUcxNDUJCQkweDEyMgorI2RlZmluZSAgUlhUWF9SRUcxNDVfVFhfSURMRV9TQVRBX1NFVChkc3QsIHNyYykgXAorCQkoKChkc3QpICYgfjB4MDAwMDAwMDEpIHwgKCgodTMyKSAoc3JjKSA8PCAwKSAmIDB4MDAwMDAwMDEpKQorI2RlZmluZSAgUlhUWF9SRUcxNDVfUlhFU19FTkFfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwMDAwMikgfCAoKCh1MzIpIChzcmMpIDw8IDEpICYgMHgwMDAwMDAwMikpCisjZGVmaW5lICBSWFRYX1JFRzE0NV9SWERGRV9DT05GSUdfU0VUKGRzdCwgc3JjKSBcCisJCSgoKGRzdCkgJiB+MHgwMDAwYzAwMCkgfCAoKCh1MzIpIChzcmMpIDw8IDE0KSAmIDB4MDAwMGMwMDApKQorI2RlZmluZSAgUlhUWF9SRUcxNDVfUlhWV0VTX0xBVEVOQV9TRVQoZHN0LCBzcmMpIFwKKwkJKCgoZHN0KSAmIH4weDAwMDAwMDA0KSB8ICgoKHUzMikgKHNyYykgPDwgMikgJiAweDAwMDAwMDA0KSkKKyNkZWZpbmUgUlhUWF9SRUcxNDcJCQkweDEyNgorI2RlZmluZSBSWFRYX1JFRzE0OAkJCTB4MTI4CisKKy8qIENsb2NrIG1hY3JvIHR5cGUgKi8KK2VudW0gY211X3R5cGVfdCB7CisJUkVGX0NNVSA9IDAsCS8qIENsb2NrIG1hY3JvIGlzIHRoZSBpbnRlcm5hbCByZWZlcmVuY2UgY2xvY2sgKi8KKwlQSFlfQ01VID0gMSwJLyogQ2xvY2sgbWFjcm8gaXMgdGhlIFBMTCBmb3IgdGhlIFNlcmRlcyAqLworfTsKKworZW51bSBtdXhfdHlwZV90IHsKKwlNVVhfU0VMRUNUX0FUQSA9IDAsCS8qIFN3aXRjaCB0aGUgTVVYIHRvIEFUQSAqLworCU1VWF9TRUxFQ1RfU0dNTUlJID0gMCwJLyogU3dpdGNoIHRoZSBNVVggdG8gU0dNSUkgKi8KK307CisKK2VudW0gY2xrX3R5cGVfdCB7CisJQ0xLX0VYVF9ESUZGID0gMCwJLyogRXh0ZXJuYWwgZGlmZmVyZW50aWFsICovCisJQ0xLX0lOVF9ESUZGID0gMSwJLyogSW50ZXJuYWwgZGlmZmVyZW50aWFsICovCisJQ0xLX0lOVF9TSU5HID0gMiwJLyogSW50ZXJuYWwgc2luZ2xlIGVuZGVkICovCit9OworCitlbnVtIHBoeV9tb2RlIHsKKwlNT0RFX1NBVEEJPSAwLAkvKiBMaXN0IHRoZW0gZm9yIHNpbXBsZSByZWZlcmVuY2UgKi8KKwlNT0RFX1NHTUlJCT0gMSwKKwlNT0RFX1BDSUUJPSAyLAorCU1PREVfVVNCCT0gMywKKwlNT0RFX1hGSQk9IDQsCisJTU9ERV9NQVgKK307CisKK3N0cnVjdCB4Z2VuZV9zYXRhX292ZXJyaWRlX3BhcmFtIHsKKwl1MzIgc3BlZWRbTUFYX0xBTkVdOyAvKiBJbmRleCBmb3Igb3ZlcnJpZGUgcGFyYW1ldGVyIHBlciBsYW5lICovCisJdTMyIHR4c3BlZWRbM107CQkJLyogVHggc3BlZWQgKi8KKwl1MzIgdHhib29zdGdhaW5bTUFYX0xBTkUqM107CS8qIFR4IGZyZXEgYm9vc3QgYW5kIGdhaW4gY29udHJvbCAqLworCXUzMiB0eGV5ZXR1bmluZ1tNQVhfTEFORSozXTsJLyogVHggZXllIHR1bmluZyAqLworCXUzMiB0eGV5ZWRpcmVjdGlvbltNQVhfTEFORSozXTsgLyogVHggZXllIHR1bmluZyBkaXJlY3Rpb24gKi8KKwl1MzIgdHhhbXBsaXR1ZGVbTUFYX0xBTkUqM107CS8qIFR4IGFtcGxpdHVkZSBjb250cm9sICovCisJdTMyIHR4cHJlY3Vyc29yX2NuMVtNQVhfTEFORSozXTsgLyogVHggZW1waGFzaXMgdGFwcyAxc3QgcHJlLWN1cnNvciAqLworCXUzMiB0eHByZWN1cnNvcl9jbjJbTUFYX0xBTkUqM107IC8qIFR4IGVtcGhhc2lzIHRhcHMgMm5kIHByZS1jdXJzb3IgKi8KKwl1MzIgdHhwb3N0Y3Vyc29yX2NwMVtNQVhfTEFORSozXTsgLyogVHggZW1waGFzaXMgdGFwcyBwb3N0LWN1cnNvciAqLworfTsKKworc3RydWN0IHhnZW5lX3BoeV9jdHggeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisJZW51bSBwaHlfbW9kZSBtb2RlOwkJLyogTW9kZSBvZiBvcGVyYXRpb24gKi8KKwllbnVtIGNsa190eXBlX3QgY2xrX3R5cGU7CS8qIElucHV0IGNsb2NrIHNlbGVjdGlvbiAqLworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2U7CQkvKiBQSFkgQ1NSIGJhc2UgYWRkciAqLworCXN0cnVjdCBjbGsgKmNsazsJCS8qIE9wdGlvbmFsIGNsb2NrICovCisKKwkvKiBPdmVycmlkZSBTZXJkZXMgcGFyYW1ldGVycyAqLworCXN0cnVjdCB4Z2VuZV9zYXRhX292ZXJyaWRlX3BhcmFtIHNhdGFfcGFyYW07Cit9OworCisvKgorICogRm9yIGNoaXAgZWFybGllciB0aGFuIEEzIHZlcnNpb24sIGVuYWJsZSB0aGlzIGZsYWcuCisgKiBUbyBlbmFibGUsIHBhc3MgYm9vdCBhcmd1bWVudCBwaHlfeGdlbmUucHJlQTNDaGlwPTEKKyAqLworc3RhdGljIGludCBwcmVBM0NoaXA7CitNT0RVTEVfUEFSTV9ERVNDKHByZUEzQ2hpcCwgIkVuYWJsZSBwcmUtQTMgY2hpcCBzdXBwb3J0ICgxPWVuYWJsZSAwPWRpc2FibGUpIik7Cittb2R1bGVfcGFyYW1fbmFtZWQocHJlQTNDaGlwLCBwcmVBM0NoaXAsIGludCwgMDQ0NCk7CisKK3N0YXRpYyB2b2lkIHNkc193cih2b2lkIF9faW9tZW0gKmNzcl9iYXNlLCB1MzIgaW5kaXJlY3RfY21kX3JlZywKKwkJICAgdTMyIGluZGlyZWN0X2RhdGFfcmVnLCB1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZSA9IGppZmZpZXMgKyBIWjsKKwl1MzIgdmFsOworCXUzMiBjbWQ7CisKKwljbWQgPSBDRkdfSU5EX1dSX0NNRF9NQVNLIHwgQ0ZHX0lORF9DTURfRE9ORV9NQVNLOworCWNtZCA9IENGR19JTkRfQUREUl9TRVQoY21kLCBhZGRyKTsKKwl3cml0ZWwoZGF0YSwgY3NyX2Jhc2UgKyBpbmRpcmVjdF9kYXRhX3JlZyk7CisJcmVhZGwoY3NyX2Jhc2UgKyBpbmRpcmVjdF9kYXRhX3JlZyk7IC8qIEZvcmNlIGEgYmFycmllciAqLworCXdyaXRlbChjbWQsIGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZyk7CisJcmVhZGwoY3NyX2Jhc2UgKyBpbmRpcmVjdF9jbWRfcmVnKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisJZG8geworCQl2YWwgPSByZWFkbChjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcpOworCX0gd2hpbGUgKCEodmFsICYgQ0ZHX0lORF9DTURfRE9ORV9NQVNLKSAmJgorCQkgdGltZV9iZWZvcmUoamlmZmllcywgZGVhZGxpbmUpKTsKKwlpZiAoISh2YWwgJiBDRkdfSU5EX0NNRF9ET05FX01BU0spKQorCQlwcl9lcnIoIlNEUyBXUiB0aW1lb3V0IGF0IDB4JXAgb2Zmc2V0IDB4JTA4WCB2YWx1ZSAweCUwOFhcbiIsCisJCSAgICAgICBjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcsIGFkZHIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBzZHNfcmQodm9pZCBfX2lvbWVtICpjc3JfYmFzZSwgdTMyIGluZGlyZWN0X2NtZF9yZWcsCisJCSAgIHUzMiBpbmRpcmVjdF9kYXRhX3JlZywgdTMyIGFkZHIsIHUzMiAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGRlYWRsaW5lID0gamlmZmllcyArIEhaOworCXUzMiB2YWw7CisJdTMyIGNtZDsKKworCWNtZCA9IENGR19JTkRfUkRfQ01EX01BU0sgfCBDRkdfSU5EX0NNRF9ET05FX01BU0s7CisJY21kID0gQ0ZHX0lORF9BRERSX1NFVChjbWQsIGFkZHIpOworCXdyaXRlbChjbWQsIGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZyk7CisJcmVhZGwoY3NyX2Jhc2UgKyBpbmRpcmVjdF9jbWRfcmVnKTsgLyogRm9yY2UgYSBiYXJyaWVyICovCisJZG8geworCQl2YWwgPSByZWFkbChjc3JfYmFzZSArIGluZGlyZWN0X2NtZF9yZWcpOworCX0gd2hpbGUgKCEodmFsICYgQ0ZHX0lORF9DTURfRE9ORV9NQVNLKSAmJgorCQkgdGltZV9iZWZvcmUoamlmZmllcywgZGVhZGxpbmUpKTsKKwkqZGF0YSA9IHJlYWRsKGNzcl9iYXNlICsgaW5kaXJlY3RfZGF0YV9yZWcpOworCWlmICghKHZhbCAmIENGR19JTkRfQ01EX0RPTkVfTUFTSykpCisJCXByX2VycigiU0RTIFdSIHRpbWVvdXQgYXQgMHglcCBvZmZzZXQgMHglMDhYIHZhbHVlIDB4JTA4WFxuIiwKKwkJICAgICAgIGNzcl9iYXNlICsgaW5kaXJlY3RfY21kX3JlZywgYWRkciwgKmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBjbXVfd3Ioc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkgICB1MzIgcmVnLCB1MzIgZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKnNkc19iYXNlID0gY3R4LT5zZHNfYmFzZTsKKwl1MzIgdmFsOworCisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUpCisJCXJlZyArPSBTRVJERVNfUExMX1JFRl9JTkRJUkVDVF9PRkZTRVQ7CisJZWxzZQorCQlyZWcgKz0gU0VSREVTX1BMTF9JTkRJUkVDVF9PRkZTRVQ7CisJc2RzX3dyKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCQlTQVRBX0VORVRfU0RTX0lORF9XREFUQV9SRUcsIHJlZywgZGF0YSk7CisJc2RzX3JkKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCQlTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcsIHJlZywgJnZhbCk7CisJcHJfZGVidWcoIkNNVSBXUiBhZGRyIDB4JVggdmFsdWUgMHglMDhYIDwtPiAweCUwOFhcbiIsIHJlZywgZGF0YSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgY211X3JkKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJICAgdTMyIHJlZywgdTMyICpkYXRhKQoreworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2UgPSBjdHgtPnNkc19iYXNlOworCisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUpCisJCXJlZyArPSBTRVJERVNfUExMX1JFRl9JTkRJUkVDVF9PRkZTRVQ7CisJZWxzZQorCQlyZWcgKz0gU0VSREVTX1BMTF9JTkRJUkVDVF9PRkZTRVQ7CisJc2RzX3JkKHNkc19iYXNlLCBTQVRBX0VORVRfU0RTX0lORF9DTURfUkVHLAorCQlTQVRBX0VORVRfU0RTX0lORF9SREFUQV9SRUcsIHJlZywgZGF0YSk7CisJcHJfZGVidWcoIkNNVSBSRCBhZGRyIDB4JVggdmFsdWUgMHglMDhYXG4iLCByZWcsICpkYXRhKTsKK30KKworc3RhdGljIHZvaWQgY211X3RvZ2dsZTF0bzAoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJICAgdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdTMyIHZhbDsKKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCByZWcsICZ2YWwpOworCXZhbCB8PSBiaXRzOworCWNtdV93cihjdHgsIGNtdV90eXBlLCByZWcsIHZhbCk7CisJY211X3JkKGN0eCwgY211X3R5cGUsIHJlZywgJnZhbCk7CisJdmFsICY9IH5iaXRzOworCWNtdV93cihjdHgsIGNtdV90eXBlLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtdV9jbHJiaXRzKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCXUzMiByZWcsIHUzMiBiaXRzKQoreworCXUzMiB2YWw7CisKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgcmVnLCAmdmFsKTsKKwl2YWwgJj0gfmJpdHM7CisJY211X3dyKGN0eCwgY211X3R5cGUsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgY211X3NldGJpdHMoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgZW51bSBjbXVfdHlwZV90IGNtdV90eXBlLAorCQkJdTMyIHJlZywgdTMyIGJpdHMpCit7CisJdTMyIHZhbDsKKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCByZWcsICZ2YWwpOworCXZhbCB8PSBiaXRzOworCWNtdV93cihjdHgsIGNtdV90eXBlLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmRlc193cihzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBpbnQgbGFuZSwgdTMyIHJlZywgdTMyIGRhdGEpCit7CisJdm9pZCBfX2lvbWVtICpzZHNfYmFzZSA9IGN0eC0+c2RzX2Jhc2U7CisJdTMyIHZhbDsKKworCXJlZyArPSBTRVJERVNfSU5ESVJFQ1RfT0ZGU0VUOworCXJlZyArPSBsYW5lICogU0VSREVTX0xBTkVfU1RSSURFOworCXNkc193cihzZHNfYmFzZSwgU0FUQV9FTkVUX1NEU19JTkRfQ01EX1JFRywKKwkgICAgICAgU0FUQV9FTkVUX1NEU19JTkRfV0RBVEFfUkVHLCByZWcsIGRhdGEpOworCXNkc19yZChzZHNfYmFzZSwgU0FUQV9FTkVUX1NEU19JTkRfQ01EX1JFRywKKwkgICAgICAgU0FUQV9FTkVUX1NEU19JTkRfUkRBVEFfUkVHLCByZWcsICZ2YWwpOworCXByX2RlYnVnKCJTRVJERVMgV1IgYWRkciAweCVYIHZhbHVlIDB4JTA4WCA8LT4gMHglMDhYXG4iLCByZWcsIGRhdGEsCisJCSB2YWwpOworfQorCitzdGF0aWMgdm9pZCBzZXJkZXNfcmQoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUsIHUzMiByZWcsIHUzMiAqZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKnNkc19iYXNlID0gY3R4LT5zZHNfYmFzZTsKKworCXJlZyArPSBTRVJERVNfSU5ESVJFQ1RfT0ZGU0VUOworCXJlZyArPSBsYW5lICogU0VSREVTX0xBTkVfU1RSSURFOworCXNkc19yZChzZHNfYmFzZSwgU0FUQV9FTkVUX1NEU19JTkRfQ01EX1JFRywKKwkgICAgICAgU0FUQV9FTkVUX1NEU19JTkRfUkRBVEFfUkVHLCByZWcsIGRhdGEpOworCXByX2RlYnVnKCJTRVJERVMgUkQgYWRkciAweCVYIHZhbHVlIDB4JTA4WFxuIiwgcmVnLCAqZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmRlc19jbHJiaXRzKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGludCBsYW5lLCB1MzIgcmVnLAorCQkJICAgdTMyIGJpdHMpCit7CisJdTMyIHZhbDsKKworCXNlcmRlc19yZChjdHgsIGxhbmUsIHJlZywgJnZhbCk7CisJdmFsICY9IH5iaXRzOworCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgc2VyZGVzX3NldGJpdHMoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUsIHUzMiByZWcsCisJCQkgICB1MzIgYml0cykKK3sKKwl1MzIgdmFsOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgcmVnLCAmdmFsKTsKKwl2YWwgfD0gYml0czsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9jZmdfY211X2Nsa190eXBlKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJICAgICAgIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkgICAgICAgZW51bSBjbGtfdHlwZV90IGNsa190eXBlKQoreworCXUzMiB2YWw7CisKKwkvKiBTZXQgdGhlIHJlc2V0IHNlcXVlbmNlIGRlbGF5IGZvciBUWCByZWFkeSBhc3NlcnRpb24gKi8KKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEyLCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMTJfU1RBVEVfREVMQVk5X1NFVCh2YWwsIDB4MSk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxMiwgdmFsKTsKKwkvKiBTZXQgdGhlIHByb2dyYW1tYWJsZSBzdGFnZSBkZWxheXMgYmV0d2VlbiB2YXJpb3VzIGVuYWJsZSBzdGFnZXMgKi8KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEzLCAweDAyMjIpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTQsIDB4MjIyNSk7CisKKwkvKiBDb25maWd1cmUgY2xvY2sgdHlwZSAqLworCWlmIChjbGtfdHlwZSA9PSBDTEtfRVhUX0RJRkYpIHsKKwkJLyogU2VsZWN0IGV4dGVybmFsIGNsb2NrIG11eCAqLworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzAsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMF9QTExfUkVGX1NFTF9TRVQodmFsLCAweDApOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzAsIHZhbCk7CisJCS8qIFNlbGVjdCBDTU9TIGFzIHJlZmVyZW5jZSBjbG9jayAgKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzFfUkVGQ0xLX0NNT1NfU0VMX1NFVCh2YWwsIDB4MCk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKwkJZGV2X2RiZyhjdHgtPmRldiwgIlNldCBleHRlcm5hbCByZWZlcmVuY2UgY2xvY2tcbiIpOworCX0gZWxzZSBpZiAoY2xrX3R5cGUgPT0gQ0xLX0lOVF9ESUZGKSB7CisJCS8qIFNlbGVjdCBpbnRlcm5hbCBjbG9jayBtdXggKi8KKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcwLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzBfUExMX1JFRl9TRUxfU0VUKHZhbCwgMHgxKTsKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcwLCB2YWwpOworCQkvKiBTZWxlY3QgQ01PUyBhcyByZWZlcmVuY2UgY2xvY2sgICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9TRVQodmFsLCAweDEpOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCWRldl9kYmcoY3R4LT5kZXYsICJTZXQgaW50ZXJuYWwgcmVmZXJlbmNlIGNsb2NrXG4iKTsKKwl9IGVsc2UgaWYgKGNsa190eXBlID09IENMS19JTlRfU0lORykgeworCQkvKgorCQkgKiBOT1RFOiBUaGlzIGNsb2NrIHR5cGUgaXMgTk9UIHN1cHBvcnQgZm9yIGNvbnRyb2xsZXIKKwkJICoJIHdob3NlIGludGVybmFsIGNsb2NrIHNoYXJlZCBpbiB0aGUgUENJZSBjb250cm9sbGVyCisJCSAqCisJCSAqIFNlbGVjdCBpbnRlcm5hbCBjbG9jayBtdXgKKwkJICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9TRVQodmFsLCAweDEpOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCS8qIFNlbGVjdCBDTUwgYXMgcmVmZXJlbmNlIGNsb2NrICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgJnZhbCk7CisJCXZhbCA9IENNVV9SRUcxX1JFRkNMS19DTU9TX1NFTF9TRVQodmFsLCAweDApOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCWRldl9kYmcoY3R4LT5kZXYsCisJCQkiU2V0IGludGVybmFsIHNpbmdsZSBlbmRlZCByZWZlcmVuY2UgY2xvY2tcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X3NhdGFfY2ZnX2NtdV9jb3JlKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJCWVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkJZW51bSBjbGtfdHlwZV90IGNsa190eXBlKQoreworCXUzMiB2YWw7CisJaW50IHJlZl8xMDBNSHo7CisKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkgeworCQkvKiBTZXQgVkNPIGNhbGlicmF0aW9uIHZvbHRhZ2UgdGhyZXNob2xkICovCisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzQsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfTE9fTUFYX1NFVCh2YWwsIDB4Nyk7CisJCXZhbCA9IENNVV9SRUczNF9WQ09fQ0FMX1ZUSF9ISV9NQVhfU0VUKHZhbCwgMHhjKTsKKwkJdmFsID0gQ01VX1JFRzM0X1ZDT19DQUxfVlRIX0xPX01JTl9TRVQodmFsLCAweDMpOworCQl2YWwgPSBDTVVfUkVHMzRfVkNPX0NBTF9WVEhfSElfTUlOX1NFVCh2YWwsIDB4OCk7CisJCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzQsIHZhbCk7CisJfQorCisJLyogU2V0IHRoZSBWQ08gY2FsaWJyYXRpb24gY291bnRlciAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgJnZhbCk7CisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUgfHwgcHJlQTNDaGlwKQorCQl2YWwgPSBDTVVfUkVHMF9DQUxfQ09VTlRfUkVTT0xfU0VUKHZhbCwgMHg0KTsKKwllbHNlCisJCXZhbCA9IENNVV9SRUcwX0NBTF9DT1VOVF9SRVNPTF9TRVQodmFsLCAweDcpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgdmFsKTsKKworCS8qIENvbmZpZ3VyZSBQTEwgZm9yIGNhbGlicmF0aW9uICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHMV9QTExfQ1BfU0VUKHZhbCwgMHgxKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSB8fCBwcmVBM0NoaXApCisJCXZhbCA9IENNVV9SRUcxX1BMTF9DUF9TRUxfU0VUKHZhbCwgMHg1KTsKKwllbHNlCisJCXZhbCA9IENNVV9SRUcxX1BMTF9DUF9TRUxfU0VUKHZhbCwgMHgzKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkKKwkJdmFsID0gQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQodmFsLCAweDApOworCWVsc2UKKwkJdmFsID0gQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQodmFsLCAweDEpOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMSwgdmFsKTsKKworCWlmIChjbXVfdHlwZSAhPSBSRUZfQ01VKQorCQljbXVfY2xyYml0cyhjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgUExMIGZvciBlaXRoZXIgMTAwTUh6IG9yIDUwTUh6ICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcyLCAmdmFsKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSkgeworCQl2YWwgPSBDTVVfUkVHMl9QTExfTEZSRVNfU0VUKHZhbCwgMHhhKTsKKwkJcmVmXzEwME1IeiA9IDE7CisJfSBlbHNlIHsKKwkJdmFsID0gQ01VX1JFRzJfUExMX0xGUkVTX1NFVCh2YWwsIDB4Myk7CisJCWlmIChjbGtfdHlwZSA9PSBDTEtfRVhUX0RJRkYpCisJCQlyZWZfMTAwTUh6ID0gMDsKKwkJZWxzZQorCQkJcmVmXzEwME1IeiA9IDE7CisJfQorCWlmIChyZWZfMTAwTUh6KSB7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9GQkRJVl9TRVQodmFsLCBGQkRJVl9WQUxfMTAwTSk7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9SRUZESVZfU0VUKHZhbCwgUkVGRElWX1ZBTF8xMDBNKTsKKwl9IGVsc2UgeworCQl2YWwgPSBDTVVfUkVHMl9QTExfRkJESVZfU0VUKHZhbCwgRkJESVZfVkFMXzUwTSk7CisJCXZhbCA9IENNVV9SRUcyX1BMTF9SRUZESVZfU0VUKHZhbCwgUkVGRElWX1ZBTF81ME0pOworCX0KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzIsIHZhbCk7CisKKwkvKiBDb25maWd1cmUgdGhlIFZDTyAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMywgJnZhbCk7CisJaWYgKGNtdV90eXBlID09IFJFRl9DTVUpIHsKKwkJdmFsID0gQ01VX1JFRzNfVkNPVkFSU0VMX1NFVCh2YWwsIDB4Myk7CisJCXZhbCA9IENNVV9SRUczX1ZDT19NT01TRUxfSU5JVF9TRVQodmFsLCAweDEwKTsKKwl9IGVsc2UgeworCQl2YWwgPSBDTVVfUkVHM19WQ09WQVJTRUxfU0VUKHZhbCwgMHhGKTsKKwkJaWYgKHByZUEzQ2hpcCkKKwkJCXZhbCA9IENNVV9SRUczX1ZDT19NT01TRUxfSU5JVF9TRVQodmFsLCAweDE1KTsKKwkJZWxzZQorCQkJdmFsID0gQ01VX1JFRzNfVkNPX01PTVNFTF9JTklUX1NFVCh2YWwsIDB4MWEpOworCQl2YWwgPSBDTVVfUkVHM19WQ09fTUFOTU9NU0VMX1NFVCh2YWwsIDB4MTUpOworCX0KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMsIHZhbCk7CisKKwkvKiBEaXNhYmxlIGZvcmNlIFBMTCBsb2NrICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcyNiwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzI2X0ZPUkNFX1BMTF9MT0NLX1NFVCh2YWwsIDB4MCk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcyNiwgdmFsKTsKKworCS8qIFNldHVwIFBMTCBsb29wIGZpbHRlciAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzVfUExMX0xGU01DQVBfU0VUKHZhbCwgMHgzKTsKKwl2YWwgPSBDTVVfUkVHNV9QTExfTEZDQVBfU0VUKHZhbCwgMHgzKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSB8fCAhcHJlQTNDaGlwKQorCQl2YWwgPSBDTVVfUkVHNV9QTExfTE9DS19SRVNPTFVUSU9OX1NFVCh2YWwsIDB4Nyk7CisJZWxzZQorCQl2YWwgPSBDTVVfUkVHNV9QTExfTE9DS19SRVNPTFVUSU9OX1NFVCh2YWwsIDB4NCk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUc1LCB2YWwpOworCisJLyogRW5hYmxlIG9yIGRpc2FibGUgbWFudWFsIGNhbGlicmF0aW9uICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUc2LCAmdmFsKTsKKwl2YWwgPSBDTVVfUkVHNl9QTExfVlJFR1RSSU1fU0VUKHZhbCwgcHJlQTNDaGlwID8gMHgwIDogMHgyKTsKKwl2YWwgPSBDTVVfUkVHNl9NQU5fUFZUX0NBTF9TRVQodmFsLCBwcmVBM0NoaXAgPyAweDEgOiAweDApOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHNiwgdmFsKTsKKworCS8qIENvbmZpZ3VyZSBsYW5lIGZvciAyMC1iaXRzICovCisJaWYgKGNtdV90eXBlID09IFBIWV9DTVUpIHsKKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUc5LCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzlfVFhfV09SRF9NT0RFX0NIMV9TRVQodmFsLAorCQkJCQkJICAgIENNVV9SRUc5X1dPUkRfTEVOXzIwQklUKTsKKwkJdmFsID0gQ01VX1JFRzlfVFhfV09SRF9NT0RFX0NIMF9TRVQodmFsLAorCQkJCQkJICAgIENNVV9SRUc5X1dPUkRfTEVOXzIwQklUKTsKKwkJdmFsID0gQ01VX1JFRzlfUExMX1BPU1RfRElWQlkyX1NFVCh2YWwsIDB4MSk7CisJCWlmICghcHJlQTNDaGlwKSB7CisJCQl2YWwgPSBDTVVfUkVHOV9WQkdfQllQQVNTQl9TRVQodmFsLCAweDApOworCQkJdmFsID0gQ01VX1JFRzlfSUdFTl9CWVBBU1NfU0VUKHZhbCAsIDB4MCk7CisJCX0KKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUc5LCB2YWwpOworCisJCWlmICghcHJlQTNDaGlwKSB7CisJCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEwLCAmdmFsKTsKKwkJCXZhbCA9IENNVV9SRUcxMF9WUkVHX1JFRlNFTF9TRVQodmFsLCAweDEpOworCQkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxMCwgdmFsKTsKKwkJfQorCX0KKworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTYsICZ2YWwpOworCXZhbCA9IENNVV9SRUcxNl9DQUxJQlJBVElPTl9ET05FX09WRVJSSURFX1NFVCh2YWwsIDB4MSk7CisJdmFsID0gQ01VX1JFRzE2X0JZUEFTU19QTExfTE9DS19TRVQodmFsLCAweDEpOworCWlmIChjbXVfdHlwZSA9PSBSRUZfQ01VIHx8IHByZUEzQ2hpcCkKKwkJdmFsID0gQ01VX1JFRzE2X1ZDT0NBTF9XQUlUX0JUV19DT0RFX1NFVCh2YWwsIDB4NCk7CisJZWxzZQorCQl2YWwgPSBDTVVfUkVHMTZfVkNPQ0FMX1dBSVRfQlRXX0NPREVfU0VUKHZhbCwgMHg3KTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE2LCB2YWwpOworCisJLyogQ29uZmlndXJlIGZvciBTQVRBICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczMCwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzMwX1BDSUVfTU9ERV9TRVQodmFsLCAweDApOworCXZhbCA9IENNVV9SRUczMF9MT0NLX0NPVU5UX1NFVCh2YWwsIDB4Myk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczMCwgdmFsKTsKKworCS8qIERpc2FibGUgc3RhdGUgbWFjaGluZSBieXBhc3MgKi8KKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMxLCAweEYpOworCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczMiwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzMyX1BWVF9DQUxfV0FJVF9TRUxfU0VUKHZhbCwgMHgzKTsKKwlpZiAoY211X3R5cGUgPT0gUkVGX0NNVSB8fCBwcmVBM0NoaXApCisJCXZhbCA9IENNVV9SRUczMl9JUkVGX0FESl9TRVQodmFsLCAweDMpOworCWVsc2UKKwkJdmFsID0gQ01VX1JFRzMyX0lSRUZfQURKX1NFVCh2YWwsIDB4MSk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczMiwgdmFsKTsKKworCS8qIFNldCBWQ08gY2FsaWJyYXRpb24gdGhyZXNob2xkICovCisJaWYgKGNtdV90eXBlICE9IFJFRl9DTVUgJiYgcHJlQTNDaGlwKQorCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzM0LCAweDhkMjcpOworCWVsc2UKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczNCwgMHg4NzNjKTsKKworCS8qIFNldCBDVExFIE92ZXJyaWRlIGFuZCBvdmVycmlkZSB3YWl0aW5nIGZyb20gc3RhdGUgbWFjaGluZSAqLworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzcsIDB4RjAwRik7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9zc2NfZW5hYmxlKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSkKK3sKKwl1MzIgdmFsOworCisJLyogU2V0IFNTQyBtb2R1bGF0aW9uIHZhbHVlICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUczNSwgJnZhbCk7CisJdmFsID0gQ01VX1JFRzM1X1BMTF9TU0NfTU9EX1NFVCh2YWwsIDk4KTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzM1LCB2YWwpOworCisJLyogRW5hYmxlIFNTQywgc2V0IHZlcnRpY2FsIHN0ZXAgYW5kIERTTSB2YWx1ZSAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzYsICZ2YWwpOworCXZhbCA9IENNVV9SRUczNl9QTExfU1NDX1ZTVEVQX1NFVCh2YWwsIDMwKTsKKwl2YWwgPSBDTVVfUkVHMzZfUExMX1NTQ19FTl9TRVQodmFsLCAxKTsKKwl2YWwgPSBDTVVfUkVHMzZfUExMX1NTQ19EU01TRUxfU0VUKHZhbCwgMSk7CisJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUczNiwgdmFsKTsKKworCS8qIFJlc2V0IHRoZSBQTEwgKi8KKwljbXVfY2xyYml0cyhjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLKTsKKwljbXVfc2V0Yml0cyhjdHgsIGNtdV90eXBlLCBDTVVfUkVHNSwgQ01VX1JFRzVfUExMX1JFU0VUQl9NQVNLKTsKKworCS8qIEZvcmNlIFZDTyBjYWxpYnJhdGlvbiB0byByZXN0YXJ0ICovCisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMyLAorCQkgICAgICAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X3NhdGFfY2ZnX2xhbmVzKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgpCit7CisJdTMyIHZhbDsKKwl1MzIgcmVnOworCWludCBpOworCWludCBsYW5lOworCisJZm9yIChsYW5lID0gMDsgbGFuZSA8IE1BWF9MQU5FOyBsYW5lKyspIHsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxNDcsIDB4Nik7CisKKwkJLyogU2V0IGJvb3N0IGNvbnRyb2wgZm9yIHF1YXJ0ZXIsIGhhbGYsIGFuZCBmdWxsIHJhdGUgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcwLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcwX0NUTEVfRVFfSFJfU0VUKHZhbCwgMHgxMCk7CisJCXZhbCA9IFJYVFhfUkVHMF9DVExFX0VRX1FSX1NFVCh2YWwsIDB4MTApOworCQl2YWwgPSBSWFRYX1JFRzBfQ1RMRV9FUV9GUl9TRVQodmFsLCAweDEwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcwLCB2YWwpOworCisJCS8qIFNldCBib29zdCBjb250cm9sIHZhbHVlICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMSwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMV9SWEFDVkNNX1NFVCh2YWwsIDB4Nyk7CisJCXZhbCA9IFJYVFhfUkVHMV9DVExFX0VRX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhib29zdGdhaW5bbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMSwgdmFsKTsKKworCQkvKiBMYXRjaCBWVFQgdmFsdWUgYmFzZWQgb24gdGhlIHRlcm1pbmF0aW9uIHRvIGdyb3VuZCBhbmQKKwkJICAgZW5hYmxlIFRYIEZJRk8gKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcyX1ZUVF9FTkFfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUcyX1ZUVF9TRUxfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUcyX1RYX0ZJRk9fRU5BX1NFVCh2YWwsIDB4MSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMiwgdmFsKTsKKworCQkvKiBDb25maWd1cmUgVHggZm9yIDIwLWJpdHMgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc0LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc0X1RYX1dPUkRfTU9ERV9TRVQodmFsLCBDTVVfUkVHOV9XT1JEX0xFTl8yMEJJVCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHNCwgdmFsKTsKKworCQlpZiAoIXByZUEzQ2hpcCkgeworCQkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxLCAmdmFsKTsKKwkJCXZhbCA9IFJYVFhfUkVHMV9SWFZSRUcxX1NFVCh2YWwsIDB4Mik7CisJCQl2YWwgPSBSWFRYX1JFRzFfUlhJUkVGX0FESl9TRVQodmFsLCAweDIpOworCQkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxLCB2YWwpOworCQl9CisKKwkJLyogU2V0IHByZS1lbXBoYXNpcyBmaXJzdCAxIGFuZCAyLCBhbmQgcG9zdC1lbXBoYXNpcyB2YWx1ZXMgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc1LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc1X1RYX0NOMV9TRVQodmFsLAorCQkJY3R4LT5zYXRhX3BhcmFtLnR4cHJlY3Vyc29yX2NuMVtsYW5lICogMyArCisJCQljdHgtPnNhdGFfcGFyYW0uc3BlZWRbbGFuZV1dKTsKKwkJdmFsID0gUlhUWF9SRUc1X1RYX0NQMV9TRVQodmFsLAorCQkJY3R4LT5zYXRhX3BhcmFtLnR4cG9zdGN1cnNvcl9jcDFbbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXZhbCA9IFJYVFhfUkVHNV9UWF9DTjJfU0VUKHZhbCwKKwkJCWN0eC0+c2F0YV9wYXJhbS50eHByZWN1cnNvcl9jbjJbbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHNSwgdmFsKTsKKworCQkvKiBTZXQgVFggYW1wbGl0dWRlIHZhbHVlICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHNiwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHNl9UWEFNUF9DTlRMX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhhbXBsaXR1ZGVbbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXZhbCA9IFJYVFhfUkVHNl9UWEFNUF9FTkFfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUc2X1RYX0lETEVfU0VUKHZhbCwgMHgwKTsKKwkJdmFsID0gUlhUWF9SRUc2X1JYX0JJU1RfUkVTWU5DX1NFVCh2YWwsIDB4MCk7CisJCXZhbCA9IFJYVFhfUkVHNl9SWF9CSVNUX0VSUkNOVF9SRF9TRVQodmFsLCAweDApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzYsIHZhbCk7CisKKwkJLyogQ29uZmlndXJlIFJ4IGZvciAyMC1iaXRzICovCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHNywgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHN19CSVNUX0VOQV9SWF9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzdfUlhfV09SRF9NT0RFX1NFVCh2YWwsIENNVV9SRUc5X1dPUkRfTEVOXzIwQklUKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUc3LCB2YWwpOworCisJCS8qIFNldCBDRFIgYW5kIExPUyB2YWx1ZXMgYW5kIGVuYWJsZSBSeCBTU0MgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUc4LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc4X0NEUl9MT09QX0VOQV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzhfQ0RSX0JZUEFTU19SWExPU19TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzhfU1NDX0VOQUJMRV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzhfU0RfRElTQUJMRV9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzhfU0RfVlJFRl9TRVQodmFsLCAweDQpOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzgsIHZhbCk7CisKKwkJLyogU2V0IHBoYXNlIGFkanVzdCB1cHBlci9sb3dlciBsaW1pdHMgKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMSwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMTFfUEhBU0VfQURKVVNUX0xJTUlUX1NFVCh2YWwsIDB4MCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTEsIHZhbCk7CisKKwkJLyogRW5hYmxlIExhdGNoIE9mZjsgZGlzYWJsZSBTVU1PUyBhbmQgVHggdGVybWluYXRpb24gKi8KKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMiwgJnZhbCk7CisJCXZhbCA9IFJYVFhfUkVHMTJfTEFUQ0hfT0ZGX0VOQV9TRVQodmFsLCAweDEpOworCQl2YWwgPSBSWFRYX1JFRzEyX1NVTU9TX0VOQUJMRV9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzEyX1JYX0RFVF9URVJNX0VOQUJMRV9TRVQodmFsLCAweDApOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyLCB2YWwpOworCisJCS8qIFNldCBwZXJpb2QgZXJyb3IgbGF0Y2ggdG8gNTEyVCBhbmQgZW5hYmxlIEJXTCAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzI2LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcyNl9QRVJJT0RfRVJST1JfTEFUQ0hfU0VUKHZhbCwgMHgwKTsKKwkJdmFsID0gUlhUWF9SRUcyNl9CTFdDX0VOQV9TRVQodmFsLCAweDEpOworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzI2LCB2YWwpOworCisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMjgsIDB4MCk7CisKKwkJLyogU2V0IERGRSBsb29wIHByZXNldCB2YWx1ZSAqLworCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzMxLCAweDApOworCisJCS8qIFNldCBFeWUgTW9uaXRvciBjb3VudGVyIHdpZHRoIHRvIDEyLWJpdCAqLworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzYxLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc2MV9JU0NBTl9JTkJFUlRfU0VUKHZhbCwgMHgxKTsKKwkJdmFsID0gUlhUWF9SRUc2MV9MT0FERlJFUV9TSElGVF9TRVQodmFsLCAweDApOworCQl2YWwgPSBSWFRYX1JFRzYxX0VZRV9DT1VOVF9XSURUSF9TRUxfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUc2MSwgdmFsKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzYyLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUc2Ml9QRVJJT0RfSDFfUUxBVENIX1NFVCh2YWwsIDB4MCk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHNjIsIHZhbCk7CisKKwkJLyogU2V0IEJXIHNlbGVjdCB0YXAgWCBmb3IgREZFIGxvb3AgKi8KKwkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworCQkJcmVnID0gUlhUWF9SRUc4MSArIGkgKiAyOworCQkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgcmVnLCAmdmFsKTsKKwkJCXZhbCA9IFJYVFhfUkVHODlfTVVfVEg3X1NFVCh2YWwsIDB4ZSk7CisJCQl2YWwgPSBSWFRYX1JFRzg5X01VX1RIOF9TRVQodmFsLCAweGUpOworCQkJdmFsID0gUlhUWF9SRUc4OV9NVV9USDlfU0VUKHZhbCwgMHhlKTsKKwkJCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgdmFsKTsKKwkJfQorCisJCS8qIFNldCBCVyBzZWxlY3QgdGFwIFggZm9yIGZyZXF1ZW5jeSBhZGp1c3QgbG9vcCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlyZWcgPSBSWFRYX1JFRzk2ICsgaSAqIDI7CisJCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCByZWcsICZ2YWwpOworCQkJdmFsID0gUlhUWF9SRUc5Nl9NVV9GUkVRMV9TRVQodmFsLCAweDEwKTsKKwkJCXZhbCA9IFJYVFhfUkVHOTZfTVVfRlJFUTJfU0VUKHZhbCwgMHgxMCk7CisJCQl2YWwgPSBSWFRYX1JFRzk2X01VX0ZSRVEzX1NFVCh2YWwsIDB4MTApOworCQkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgcmVnLCB2YWwpOworCQl9CisKKwkJLyogU2V0IEJXIHNlbGVjdCB0YXAgWCBmb3IgcGhhc2UgYWRqdXN0IGxvb3AgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcmVnID0gUlhUWF9SRUc5OSArIGkgKiAyOworCQkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgcmVnLCAmdmFsKTsKKwkJCXZhbCA9IFJYVFhfUkVHOTlfTVVfUEhBU0UxX1NFVCh2YWwsIDB4Nyk7CisJCQl2YWwgPSBSWFRYX1JFRzk5X01VX1BIQVNFMl9TRVQodmFsLCAweDcpOworCQkJdmFsID0gUlhUWF9SRUc5OV9NVV9QSEFTRTNfU0VUKHZhbCwgMHg3KTsKKwkJCXNlcmRlc193cihjdHgsIGxhbmUsIHJlZywgdmFsKTsKKwkJfQorCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTAyLCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcxMDJfRlJFUUxPT1BfTElNSVRfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMDIsIHZhbCk7CisKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMTQsIDB4ZmZlMCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjUsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzEyNV9TSUdOX1BRX1NFVCh2YWwsCisJCQljdHgtPnNhdGFfcGFyYW0udHhleWVkaXJlY3Rpb25bbGFuZSAqIDMgKworCQkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2xhbmVdXSk7CisJCXZhbCA9IFJYVFhfUkVHMTI1X1BRX1JFR19TRVQodmFsLAorCQkJY3R4LT5zYXRhX3BhcmFtLnR4ZXlldHVuaW5nW2xhbmUgKiAzICsKKwkJCWN0eC0+c2F0YV9wYXJhbS5zcGVlZFtsYW5lXV0pOworCQl2YWwgPSBSWFRYX1JFRzEyNV9QSFpfTUFOVUFMX1NFVCh2YWwsIDB4MSk7CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTI1LCB2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LCAmdmFsKTsKKwkJdmFsID0gUlhUWF9SRUcxMjdfTEFUQ0hfTUFOX0NBTF9FTkFfU0VUKHZhbCwgMHgwKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsIHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjgsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzEyOF9MQVRDSF9DQUxfV0FJVF9TRUxfU0VUKHZhbCwgMHgzKTsKKwkJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjgsIHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxNDUsICZ2YWwpOworCQl2YWwgPSBSWFRYX1JFRzE0NV9SWERGRV9DT05GSUdfU0VUKHZhbCwgMHgzKTsKKwkJdmFsID0gUlhUWF9SRUcxNDVfVFhfSURMRV9TQVRBX1NFVCh2YWwsIDB4MCk7CisJCWlmIChwcmVBM0NoaXApIHsKKwkJCXZhbCA9IFJYVFhfUkVHMTQ1X1JYRVNfRU5BX1NFVCh2YWwsIDB4MSk7CisJCQl2YWwgPSBSWFRYX1JFRzE0NV9SWFZXRVNfTEFURU5BX1NFVCh2YWwsIDB4MSk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBSWFRYX1JFRzE0NV9SWEVTX0VOQV9TRVQodmFsLCAweDApOworCQkJdmFsID0gUlhUWF9SRUcxNDVfUlhWV0VTX0xBVEVOQV9TRVQodmFsLCAweDApOworCQl9CisJCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTQ1LCB2YWwpOworCisJCS8qCisJCSAqIFNldCBSeCBMT1MgZmlsdGVyIGNsb2NrIHJhdGUsIHNhbXBsZSByYXRlLCBhbmQgdGhyZXNob2xkCisJCSAqIHdpbmRvd3MKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXJlZyA9IFJYVFhfUkVHMTQ4ICsgaSAqIDI7CisJCQlzZXJkZXNfd3IoY3R4LCBsYW5lLCByZWcsIDB4RkZGRik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfcGh5X2NhbF9yZHlfY2hrKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkgZW51bSBjbGtfdHlwZV90IGNsa190eXBlKQoreworCXZvaWQgX19pb21lbSAqY3NyX3NlcmRlcyA9IGN0eC0+c2RzX2Jhc2U7CisJaW50IGxvb3A7CisJdTMyIHZhbDsKKworCS8qIFJlbGVhc2UgUEhZIG1haW4gcmVzZXQgKi8KKwl3cml0ZWwoMHhkZiwgY3NyX3NlcmRlcyArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CisJcmVhZGwoY3NyX3NlcmRlcyArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7IC8qIEZvcmNlIGEgYmFycmllciAqLworCisJaWYgKGNtdV90eXBlICE9IFJFRl9DTVUpIHsKKwkJY211X3NldGJpdHMoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzUsIENNVV9SRUc1X1BMTF9SRVNFVEJfTUFTSyk7CisJCS8qCisJCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBQTEwgcmVzZXQgcmVxdWlyZXMgYSBtaW5pbXVtCisJCSAqIG9mIDgwMHVzLgorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDgwMCwgMTAwMCk7CisKKwkJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxLCAmdmFsKTsKKwkJdmFsID0gQ01VX1JFRzFfUExMX01BTlVBTENBTF9TRVQodmFsLCAweDApOworCQljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzEsIHZhbCk7CisJCS8qCisJCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBQTEwgYXV0byBjYWxpYnJhdGlvbiByZXF1aXJlcworCQkgKiBhIG1pbmltdW0gb2YgODAwdXMuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoODAwLCAxMDAwKTsKKworCQljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMzIsCisJCQkgICAgICAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLKTsKKwkJLyoKKwkJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIFBMTCByZXF1aXJlcyBhIG1pbmltdW0gb2YKKwkJICogODAwdXMgdG8gc2V0dGxlLgorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDgwMCwgMTAwMCk7CisJfQorCisJaWYgKCFwcmVBM0NoaXApCisJCWdvdG8gc2tpcF9tYW51YWxfY2FsOworCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIHRlcm1pbmF0aW9uIHJlc2lzdGVyIGNhbGlicmF0aW9uCisJICogVGhlIHNlcmlhbCByZWNlaXZlIHBpbnMsIFJYUC9SWE4sIGhhdmUgVEVSTWluYXRpb24gcmVzaXN0b3IKKwkgKiB0aGF0IGlzIHJlcXVpcmVkIHRvIGJlIGNhbGlicmF0ZWQuCisJICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNywgJnZhbCk7CisJdmFsID0gQ01VX1JFRzE3X1BWVF9DT0RFX1IyQV9TRVQodmFsLCAweDEyKTsKKwl2YWwgPSBDTVVfUkVHMTdfUkVTRVJWRURfN19TRVQodmFsLCAweDApOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsIHZhbCk7CisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE3LAorCQkgICAgICAgQ01VX1JFRzE3X1BWVF9URVJNX01BTl9FTkFfTUFTSyk7CisJLyoKKwkgKiBUaGUgc2VyaWFsIHRyYW5zbWl0IHBpbnMsIFRYUC9UWE4sIGhhdmUgUHVsbC1VUCBhbmQgUHVsbC1ET1dOCisJICogcmVzaXN0b3JzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHRoZSBjYWxpYnJhdGVkLgorCSAqIENvbmZpZ3VyZSB0aGUgcHVsbCBET1dOIGNhbGlicmF0aW9uCisJICovCisJY211X3JkKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNywgJnZhbCk7CisJdmFsID0gQ01VX1JFRzE3X1BWVF9DT0RFX1IyQV9TRVQodmFsLCAweDI5KTsKKwl2YWwgPSBDTVVfUkVHMTdfUkVTRVJWRURfN19TRVQodmFsLCAweDApOworCWNtdV93cihjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsIHZhbCk7CisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE2LAorCQkgICAgICAgQ01VX1JFRzE2X1BWVF9ETl9NQU5fRU5BX01BU0spOworCS8qIENvbmZpZ3VyZSB0aGUgcHVsbCBVUCBjYWxpYnJhdGlvbiAqLworCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTcsICZ2YWwpOworCXZhbCA9IENNVV9SRUcxN19QVlRfQ09ERV9SMkFfU0VUKHZhbCwgMHgyOCk7CisJdmFsID0gQ01VX1JFRzE3X1JFU0VSVkVEXzdfU0VUKHZhbCwgMHgwKTsKKwljbXVfd3IoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE3LCB2YWwpOworCWNtdV90b2dnbGUxdG8wKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNiwKKwkJICAgICAgIENNVV9SRUcxNl9QVlRfVVBfTUFOX0VOQV9NQVNLKTsKKworc2tpcF9tYW51YWxfY2FsOgorCS8qIFBvbGwgdGhlIFBMTCBjYWxpYnJhdGlvbiBjb21wbGV0aW9uIHN0YXR1cyBmb3IgYXQgbGVhc3QgMSBtcyAqLworCWxvb3AgPSAxMDA7CisJZG8geworCQljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzcsICZ2YWwpOworCQlpZiAoQ01VX1JFRzdfUExMX0NBTElCX0RPTkVfUkQodmFsKSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBcyBwZXIgUEhZIGRlc2lnbiBzcGVjLCBQTEwgY2FsaWJyYXRpb24gc3RhdHVzIHJlcXVpcmVzCisJCSAqIGEgbWluaW11bSBvZiAxMHVzIHRvIGJlIHVwZGF0ZWQuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTAsIDEwMCk7CisJfSB3aGlsZSAoLS1sb29wID4gMCk7CisKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzcsICZ2YWwpOworCWRldl9kYmcoY3R4LT5kZXYsICJQTEwgY2FsaWJyYXRpb24gJXNcbiIsCisJCUNNVV9SRUc3X1BMTF9DQUxJQl9ET05FX1JEKHZhbCkgPyAiZG9uZSIgOiAiZmFpbGVkIik7CisJaWYgKENNVV9SRUc3X1ZDT19DQUxfRkFJTF9SRCh2YWwpKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsCisJCQkiUExMIGNhbGlicmF0aW9uIGZhaWxlZCBkdWUgdG8gVkNPIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRldl9kYmcoY3R4LT5kZXYsICJQTEwgY2FsaWJyYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisKKwljbXVfcmQoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzE1LCAmdmFsKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUEhZIFR4IGlzICVzcmVhZHlcbiIsIHZhbCAmIDB4MzAwID8gIiIgOiAibm90ICIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9waHlfcGR3bl9mb3JjZV92Y28oc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgICAgIGVudW0gY211X3R5cGVfdCBjbXVfdHlwZSwKKwkJCQkgICAgIGVudW0gY2xrX3R5cGVfdCBjbGtfdHlwZSkKK3sKKwl1MzIgdmFsOworCisJZGV2X2RiZyhjdHgtPmRldiwgIlJlc2V0IFZDTyBhbmQgcmUtc3RhcnQgYWdhaW5cbiIpOworCWlmIChjbXVfdHlwZSA9PSBQSFlfQ01VKSB7CisJCWNtdV9yZChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMTYsICZ2YWwpOworCQl2YWwgPSBDTVVfUkVHMTZfVkNPQ0FMX1dBSVRfQlRXX0NPREVfU0VUKHZhbCwgMHg3KTsKKwkJY211X3dyKGN0eCwgY211X3R5cGUsIENNVV9SRUcxNiwgdmFsKTsKKwl9CisKKwljbXVfdG9nZ2xlMXRvMChjdHgsIGNtdV90eXBlLCBDTVVfUkVHMCwgQ01VX1JFRzBfUERPV05fTUFTSyk7CisJY211X3RvZ2dsZTF0bzAoY3R4LCBjbXVfdHlwZSwgQ01VX1JFRzMyLAorCQkgICAgICAgQ01VX1JFRzMyX0ZPUkNFX1ZDT0NBTF9TVEFSVF9NQVNLKTsKK30KKworc3RhdGljIGludCB4Z2VuZV9waHlfaHdfaW5pdF9zYXRhKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsCisJCQkJICBlbnVtIGNsa190eXBlX3QgY2xrX3R5cGUsIGludCBzc2NfZW5hYmxlKQoreworCXZvaWQgX19pb21lbSAqc2RzX2Jhc2UgPSBjdHgtPnNkc19iYXNlOworCXUzMiB2YWw7CisJaW50IGk7CisKKwkvKiBDb25maWd1cmUgdGhlIFBIWSBmb3Igb3BlcmF0aW9uICovCisJZGV2X2RiZyhjdHgtPmRldiwgIlJlc2V0IFBIWVxuIik7CisJLyogUGxhY2UgUEhZIGludG8gcmVzZXQgKi8KKwl3cml0ZWwoMHgwLCBzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CisJdmFsID0gcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1JTVF9DVEwpOwkvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwkvKiBSZWxlYXNlIFBIWSBsYW5lIGZyb20gcmVzZXQgKGFjdGl2ZSBoaWdoKSAqLworCXdyaXRlbCgweDIwLCBzZHNfYmFzZSArIFNBVEFfRU5FVF9TRFNfUlNUX0NUTCk7CisJcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1JTVF9DVEwpOwkvKiBGb3JjZSBhIGJhcnJpZXIgKi8KKwkvKiBSZWxlYXNlIGFsbCBQSFkgbW9kdWxlIG91dCBvZiByZXNldCBleGNlcHQgUEhZIG1haW4gcmVzZXQgKi8KKwl3cml0ZWwoMHhkZSwgc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1JTVF9DVEwpOworCXJlYWRsKHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19SU1RfQ1RMKTsJLyogRm9yY2UgYSBiYXJyaWVyICovCisKKwkvKiBTZXQgdGhlIG9wZXJhdGlvbiBzcGVlZCAqLworCXZhbCA9IHJlYWRsKHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwxKTsKKwl2YWwgPSBDRkdfSV9TUERfU0VMX0NEUl9PVlIxX1NFVCh2YWwsCisJCWN0eC0+c2F0YV9wYXJhbS50eHNwZWVkW2N0eC0+c2F0YV9wYXJhbS5zcGVlZFswXV0pOworCXdyaXRlbCh2YWwsIHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwxKTsKKworCWRldl9kYmcoY3R4LT5kZXYsICJTZXQgdGhlIGN1c3RvbWVyIHBpbiBtb2RlIHRvIFNBVEFcbiIpOworCXZhbCA9IHJlYWRsKHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwwKTsKKwl2YWwgPSBSRUdTUEVDX0NGR19JX0NVU1RPTUVSX1BJTl9NT0RFMF9TRVQodmFsLCAweDQ0MjEpOworCXdyaXRlbCh2YWwsIHNkc19iYXNlICsgU0FUQV9FTkVUX1NEU19DVEwwKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgbWFjcm8gdW5pdCAoQ01VKSBjbG9jayB0eXBlICovCisJeGdlbmVfcGh5X2NmZ19jbXVfY2xrX3R5cGUoY3R4LCBQSFlfQ01VLCBjbGtfdHlwZSk7CisKKwkvKiBDb25maWd1cmUgdGhlIGNsb2NrIG1hY3JvICovCisJeGdlbmVfcGh5X3NhdGFfY2ZnX2NtdV9jb3JlKGN0eCwgUEhZX0NNVSwgY2xrX3R5cGUpOworCisJLyogRW5hYmxlIFNTQyBpZiBlbmFibGVkICovCisJaWYgKHNzY19lbmFibGUpCisJCXhnZW5lX3BoeV9zc2NfZW5hYmxlKGN0eCwgUEhZX0NNVSk7CisKKwkvKiBDb25maWd1cmUgUEhZIGxhbmVzICovCisJeGdlbmVfcGh5X3NhdGFfY2ZnX2xhbmVzKGN0eCk7CisKKwkvKiBTZXQgUngvVHggMjAtYml0ICovCisJdmFsID0gcmVhZGwoc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1BDU19DVEwwKTsKKwl2YWwgPSBSRUdTUEVDX0NGR19JX1JYX1dPUkRNT0RFMF9TRVQodmFsLCAweDMpOworCXZhbCA9IFJFR1NQRUNfQ0ZHX0lfVFhfV09SRE1PREUwX1NFVCh2YWwsIDB4Myk7CisJd3JpdGVsKHZhbCwgc2RzX2Jhc2UgKyBTQVRBX0VORVRfU0RTX1BDU19DVEwwKTsKKworCS8qIFN0YXJ0IFBMTCBjYWxpYnJhdGlvbiBhbmQgdHJ5IGZvciB0aHJlZSB0aW1lcyAqLworCWkgPSAxMDsKKwlkbyB7CisJCWlmICgheGdlbmVfcGh5X2NhbF9yZHlfY2hrKGN0eCwgUEhZX0NNVSwgY2xrX3R5cGUpKQorCQkJYnJlYWs7CisJCS8qIElmIGZhaWxlZCwgdG9nZ2xlIHRoZSBWQ08gcG93ZXIgc2lnbmFsIGFuZCBzdGFydCBhZ2FpbiAqLworCQl4Z2VuZV9waHlfcGR3bl9mb3JjZV92Y28oY3R4LCBQSFlfQ01VLCBjbGtfdHlwZSk7CisJfSB3aGlsZSAoLS1pID4gMCk7CisJLyogRXZlbiBvbiBmYWlsdXJlLCBhbGxvdyB0byBjb250aW51ZSBhbnkgd2F5ICovCisJaWYgKGkgPD0gMCkKKwkJZGV2X2VycihjdHgtPmRldiwgIlBMTCBjYWxpYnJhdGlvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfcGh5X2h3X2luaXRpYWxpemUoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwKKwkJCQkgICBlbnVtIGNsa190eXBlX3QgY2xrX3R5cGUsCisJCQkJICAgaW50IHNzY19lbmFibGUpCit7CisJaW50IHJjOworCisJZGV2X2RiZyhjdHgtPmRldiwgIlBIWSBpbml0IGNsayB0eXBlICVkXG4iLCBjbGtfdHlwZSk7CisKKwlpZiAoY3R4LT5tb2RlID09IE1PREVfU0FUQSkgeworCQlyYyA9IHhnZW5lX3BoeV9od19pbml0X3NhdGEoY3R4LCBjbGtfdHlwZSwgc3NjX2VuYWJsZSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiVW4tc3VwcG9ydGVkIGN1c3RvbWVyIHBpbiBtb2RlICVkXG4iLAorCQkJY3R4LT5tb2RlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWNlaXZlciBPZmZzZXQgQ2FsaWJyYXRpb246CisgKgorICogQ2FsaWJyYXRlIHRoZSByZWNlaXZlciBzaWduYWwgcGF0aCBvZmZzZXQgaW4gdHdvIHN0ZXBzIC0gc3VtbWFyIGFuZAorICogbGF0Y2ggY2FsaWJyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9mb3JjZV9sYXRfc3VtbWVyX2NhbChzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4LCBpbnQgbGFuZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgeworCQl1MzIgcmVnOworCQl1MzIgdmFsOworCX0gc2VyZGVzX3JlZ1tdID0geworCQl7UlhUWF9SRUczOCwgMHgwfSwKKwkJe1JYVFhfUkVHMzksIDB4ZmYwMH0sCisJCXtSWFRYX1JFRzQwLCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0MSwgMHhmZmZmfSwKKwkJe1JYVFhfUkVHNDIsIDB4ZmZmZn0sCisJCXtSWFRYX1JFRzQzLCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0NCwgMHhmZmZmfSwKKwkJe1JYVFhfUkVHNDUsIDB4ZmZmZn0sCisJCXtSWFRYX1JFRzQ2LCAweGZmZmZ9LAorCQl7UlhUWF9SRUc0NywgMHhmZmZjfSwKKwkJe1JYVFhfUkVHNDgsIDB4MH0sCisJCXtSWFRYX1JFRzQ5LCAweDB9LAorCQl7UlhUWF9SRUc1MCwgMHgwfSwKKwkJe1JYVFhfUkVHNTEsIDB4MH0sCisJCXtSWFRYX1JFRzUyLCAweDB9LAorCQl7UlhUWF9SRUc1MywgMHgwfSwKKwkJe1JYVFhfUkVHNTQsIDB4MH0sCisJCXtSWFRYX1JFRzU1LCAweDB9LAorCX07CisKKwkvKiBTdGFydCBTVU1NRVIgY2FsaWJyYXRpb24gKi8KKwlzZXJkZXNfc2V0Yml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LAorCQkgICAgICAgUlhUWF9SRUcxMjdfRk9SQ0VfU1VNX0NBTF9TVEFSVF9NQVNLKTsKKwkvKgorCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBTdW1tZXIgY2FsaWJyYXRpb24gcmVxdWlyZXMgYSBtaW5pbXVtCisJICogb2YgMTAwdXMgdG8gY29tcGxldGUuCisJICovCisJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKwlzZXJkZXNfY2xyYml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LAorCQkJUlhUWF9SRUcxMjdfRk9SQ0VfU1VNX0NBTF9TVEFSVF9NQVNLKTsKKwkvKgorCSAqIEFzIHBlciBQSFkgZGVzaWduIHNwZWMsIHRoZSBhdXRvIGNhbGlicmF0aW9uIHJlcXVpcmVzIGEgbWluaW11bQorCSAqIG9mIDEwMHVzIHRvIGNvbXBsZXRlLgorCSAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDUwMCk7CisKKwkvKiBTdGFydCBsYXRjaCBjYWxpYnJhdGlvbiAqLworCXNlcmRlc19zZXRiaXRzKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsCisJCSAgICAgICBSWFRYX1JFRzEyN19GT1JDRV9MQVRfQ0FMX1NUQVJUX01BU0spOworCS8qCisJICogQXMgcGVyIFBIWSBkZXNpZ24gc3BlYywgdGhlIGxhdGNoIGNhbGlicmF0aW9uIHJlcXVpcmVzIGEgbWluaW11bQorCSAqIG9mIDEwMHVzIHRvIGNvbXBsZXRlLgorCSAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDUwMCk7CisJc2VyZGVzX2NscmJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNywKKwkJICAgICAgIFJYVFhfUkVHMTI3X0ZPUkNFX0xBVF9DQUxfU1RBUlRfTUFTSyk7CisKKwkvKiBDb25maWd1cmUgdGhlIFBIWSBsYW5lIGZvciBjYWxpYnJhdGlvbiAqLworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMjgsIDB4Nyk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUczMSwgMHg3ZTAwKTsKKwlzZXJkZXNfY2xyYml0cyhjdHgsIGxhbmUsIFJYVFhfUkVHNCwKKwkJICAgICAgIFJYVFhfUkVHNF9UWF9MT09QQkFDS19CVUZfRU5fTUFTSyk7CisJc2VyZGVzX2NscmJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzcsCisJCSAgICAgICBSWFRYX1JFRzdfTE9PUF9CQUNLX0VOQV9DVExFX01BU0spOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlcmRlc19yZWcpOyBpKyspCisJCXNlcmRlc193cihjdHgsIGxhbmUsIHNlcmRlc19yZWdbaV0ucmVnLAorCQkJICBzZXJkZXNfcmVnW2ldLnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX3BoeV9yZXNldF9yeGQoc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCwgaW50IGxhbmUpCit7CisJLyogUmVzZXQgZGlnaXRhbCBSeCAqLworCXNlcmRlc19jbHJiaXRzKGN0eCwgbGFuZSwgUlhUWF9SRUc3LCBSWFRYX1JFRzdfUkVTRVRCX1JYRF9NQVNLKTsKKwkvKiBBcyBwZXIgUEhZIGRlc2lnbiBzcGVjLCB0aGUgcmVzZXQgcmVxdWlyZXMgYSBtaW5pbXVtIG9mIDEwMHVzLiAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDE1MCk7CisJc2VyZGVzX3NldGJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzcsIFJYVFhfUkVHN19SRVNFVEJfUlhEX01BU0spOworfQorCitzdGF0aWMgaW50IHhnZW5lX3BoeV9nZXRfYXZnKGludCBhY2N1bSwgaW50IHNhbXBsZXMpCit7CisJcmV0dXJuIChhY2N1bSArIChzYW1wbGVzIC8gMikpIC8gc2FtcGxlczsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X2dlbl9hdmdfdmFsKHN0cnVjdCB4Z2VuZV9waHlfY3R4ICpjdHgsIGludCBsYW5lKQoreworCWludCBtYXhfbG9vcCA9IDEwOworCWludCBhdmdfbG9vcCA9IDA7CisJaW50IGxhdF9kbyA9IDAsIGxhdF94byA9IDAsIGxhdF9lbyA9IDAsIGxhdF9zbyA9IDA7CisJaW50IGxhdF9kZSA9IDAsIGxhdF94ZSA9IDAsIGxhdF9lZSA9IDAsIGxhdF9zZSA9IDA7CisJaW50IHN1bV9jYWwgPSAwOworCWludCBsYXRfZG9faXRyLCBsYXRfeG9faXRyLCBsYXRfZW9faXRyLCBsYXRfc29faXRyOworCWludCBsYXRfZGVfaXRyLCBsYXRfeGVfaXRyLCBsYXRfZWVfaXRyLCBsYXRfc2VfaXRyOworCWludCBzdW1fY2FsX2l0cjsKKwlpbnQgZmFpbF9ldmVuOworCWludCBmYWlsX29kZDsKKwl1MzIgdmFsOworCisJZGV2X2RiZyhjdHgtPmRldiwgIkdlbmVyYXRpbmcgYXZnIGNhbGlicmF0aW9uIHZhbHVlIGZvciBsYW5lICVkXG4iLAorCQlsYW5lKTsKKworCS8qIEVuYWJsZSBSWCBIaS1aIHRlcm1pbmF0aW9uICovCisJc2VyZGVzX3NldGJpdHMoY3R4LCBsYW5lLCBSWFRYX1JFRzEyLAorCQkJUlhUWF9SRUcxMl9SWF9ERVRfVEVSTV9FTkFCTEVfTUFTSyk7CisJLyogVHVybiBvZmYgREZFICovCisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcyOCwgMHgwMDAwKTsKKwkvKiBERkUgUHJlc2V0cyB0byB6ZXJvICovCisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUczMSwgMHgwMDAwKTsKKworCS8qCisJICogUmVjZWl2ZXIgT2Zmc2V0IENhbGlicmF0aW9uOgorCSAqIENhbGlicmF0ZSB0aGUgcmVjZWl2ZXIgc2lnbmFsIHBhdGggb2Zmc2V0IGluIHR3byBzdGVwcyAtIHN1bW1hcgorCSAqIGFuZCBsYXRjaCBjYWxpYnJhdGlvbi4KKwkgKiBSdW5zIHRoZSAiUmVjZWl2ZXIgT2Zmc2V0IENhbGlicmF0aW9uIG11bHRpcGxlIHRpbWVzIHRvIGRldGVybWluZQorCSAqIHRoZSBhdmVyYWdlIHZhbHVlIHRvIHVzZS4KKwkgKi8KKwl3aGlsZSAoYXZnX2xvb3AgPCBtYXhfbG9vcCkgeworCQkvKiBTdGFydCB0aGUgY2FsaWJyYXRpb24gKi8KKwkJeGdlbmVfcGh5X2ZvcmNlX2xhdF9zdW1tZXJfY2FsKGN0eCwgbGFuZSk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyMSwgJnZhbCk7CisJCWxhdF9kb19pdHIgPSBSWFRYX1JFRzIxX0RPX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCQlsYXRfeG9faXRyID0gUlhUWF9SRUcyMV9YT19MQVRDSF9DQUxPVVRfUkQodmFsKTsKKwkJZmFpbF9vZGQgPSBSWFRYX1JFRzIxX0xBVENIX0NBTF9GQUlMX09ERF9SRCh2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMjIsICZ2YWwpOworCQlsYXRfZW9faXRyID0gUlhUWF9SRUcyMl9FT19MQVRDSF9DQUxPVVRfUkQodmFsKTsKKwkJbGF0X3NvX2l0ciA9IFJYVFhfUkVHMjJfU09fTEFUQ0hfQ0FMT1VUX1JEKHZhbCk7CisJCWZhaWxfZXZlbiA9IFJYVFhfUkVHMjJfTEFUQ0hfQ0FMX0ZBSUxfRVZFTl9SRCh2YWwpOworCisJCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMjMsICZ2YWwpOworCQlsYXRfZGVfaXRyID0gUlhUWF9SRUcyM19ERV9MQVRDSF9DQUxPVVRfUkQodmFsKTsKKwkJbGF0X3hlX2l0ciA9IFJYVFhfUkVHMjNfWEVfTEFUQ0hfQ0FMT1VUX1JEKHZhbCk7CisKKwkJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcyNCwgJnZhbCk7CisJCWxhdF9lZV9pdHIgPSBSWFRYX1JFRzI0X0VFX0xBVENIX0NBTE9VVF9SRCh2YWwpOworCQlsYXRfc2VfaXRyID0gUlhUWF9SRUcyNF9TRV9MQVRDSF9DQUxPVVRfUkQodmFsKTsKKworCQlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyMSwgJnZhbCk7CisJCXN1bV9jYWxfaXRyID0gUlhUWF9SRUcxMjFfU1VNT1NfQ0FMX0NPREVfUkQodmFsKTsKKworCQkvKiBDaGVjayBmb3IgZmFpbHVyZS4gSWYgcGFzc2VkLCBzdW0gdGhlbSBmb3IgYXZlcmFnaW5nICovCisJCWlmICgoZmFpbF9ldmVuID09IDAgfHwgZmFpbF9ldmVuID09IDEpICYmCisJCSAgICAoZmFpbF9vZGQgPT0gMCB8fCBmYWlsX29kZCA9PSAxKSkgeworCQkJbGF0X2RvICs9IGxhdF9kb19pdHI7CisJCQlsYXRfeG8gKz0gbGF0X3hvX2l0cjsKKwkJCWxhdF9lbyArPSBsYXRfZW9faXRyOworCQkJbGF0X3NvICs9IGxhdF9zb19pdHI7CisJCQlsYXRfZGUgKz0gbGF0X2RlX2l0cjsKKwkJCWxhdF94ZSArPSBsYXRfeGVfaXRyOworCQkJbGF0X2VlICs9IGxhdF9lZV9pdHI7CisJCQlsYXRfc2UgKz0gbGF0X3NlX2l0cjsKKwkJCXN1bV9jYWwgKz0gc3VtX2NhbF9pdHI7CisKKwkJCWRldl9kYmcoY3R4LT5kZXYsICJJdGVyYXRpb24gJWQ6XG4iLCBhdmdfbG9vcCk7CisJCQlkZXZfZGJnKGN0eC0+ZGV2LCAiRE8gMHgleCBYTyAweCV4IEVPIDB4JXggU08gMHgleFxuIiwKKwkJCQlsYXRfZG9faXRyLCBsYXRfeG9faXRyLCBsYXRfZW9faXRyLAorCQkJCWxhdF9zb19pdHIpOworCQkJZGV2X2RiZyhjdHgtPmRldiwgIkRFIDB4JXggWEUgMHgleCBFRSAweCV4IFNFIDB4JXhcbiIsCisJCQkJbGF0X2RlX2l0ciwgbGF0X3hlX2l0ciwgbGF0X2VlX2l0ciwKKwkJCQlsYXRfc2VfaXRyKTsKKwkJCWRldl9kYmcoY3R4LT5kZXYsICJTVU0gMHgleFxuIiwgc3VtX2NhbF9pdHIpOworCQkJKythdmdfbG9vcDsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoY3R4LT5kZXYsCisJCQkJIlJlY2VpdmVyIGNhbGlicmF0aW9uIGZhaWxlZCBhdCAlZCBsb29wXG4iLAorCQkJCWF2Z19sb29wKTsKKwkJfQorCQl4Z2VuZV9waHlfcmVzZXRfcnhkKGN0eCwgbGFuZSk7CisJfQorCisJLyogVXBkYXRlIGxhdGNoIG1hbnVhbCBjYWxpYnJhdGlvbiB3aXRoIGF2ZXJhZ2UgdmFsdWUgKi8KKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEyNywgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMjdfRE9fTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF9kbywgbWF4X2xvb3ApKTsKKwl2YWwgPSBSWFRYX1JFRzEyN19YT19MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X3hvLCBtYXhfbG9vcCkpOworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LCB2YWwpOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjgsICZ2YWwpOworCXZhbCA9IFJYVFhfUkVHMTI4X0VPX0xBVENIX01BTkNBTF9TRVQodmFsLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZW8sIG1heF9sb29wKSk7CisJdmFsID0gUlhUWF9SRUcxMjhfU09fTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF9zbywgbWF4X2xvb3ApKTsKKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzEyOCwgdmFsKTsKKworCXNlcmRlc19yZChjdHgsIGxhbmUsIFJYVFhfUkVHMTI5LCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzEyOV9ERV9MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X2RlLCBtYXhfbG9vcCkpOworCXZhbCA9IFJYVFhfUkVHMTI5X1hFX0xBVENIX01BTkNBTF9TRVQodmFsLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfeGUsIG1heF9sb29wKSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjksIHZhbCk7CisKKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzEzMCwgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMzBfRUVfTEFUQ0hfTUFOQ0FMX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKGxhdF9lZSwgbWF4X2xvb3ApKTsKKwl2YWwgPSBSWFRYX1JFRzEzMF9TRV9MQVRDSF9NQU5DQUxfU0VUKHZhbCwKKwkJeGdlbmVfcGh5X2dldF9hdmcobGF0X3NlLCBtYXhfbG9vcCkpOworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTMwLCB2YWwpOworCisJLyogVXBkYXRlIFNVTU1FUiBjYWxpYnJhdGlvbiB3aXRoIGF2ZXJhZ2UgdmFsdWUgKi8KKwlzZXJkZXNfcmQoY3R4LCBsYW5lLCBSWFRYX1JFRzE0LCAmdmFsKTsKKwl2YWwgPSBSWFRYX1JFRzE0X0NMVEVfTEFUQ0FMX01BTl9QUk9HX1NFVCh2YWwsCisJCXhnZW5lX3BoeV9nZXRfYXZnKHN1bV9jYWwsIG1heF9sb29wKSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxNCwgdmFsKTsKKworCWRldl9kYmcoY3R4LT5kZXYsICJBdmVyYWdlIFZhbHVlOlxuIik7CisJZGV2X2RiZyhjdHgtPmRldiwgIkRPIDB4JXggWE8gMHgleCBFTyAweCV4IFNPIDB4JXhcbiIsCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZG8sIG1heF9sb29wKSwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF94bywgbWF4X2xvb3ApLAorCQkgeGdlbmVfcGh5X2dldF9hdmcobGF0X2VvLCBtYXhfbG9vcCksCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfc28sIG1heF9sb29wKSk7CisJZGV2X2RiZyhjdHgtPmRldiwgIkRFIDB4JXggWEUgMHgleCBFRSAweCV4IFNFIDB4JXhcbiIsCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfZGUsIG1heF9sb29wKSwKKwkJIHhnZW5lX3BoeV9nZXRfYXZnKGxhdF94ZSwgbWF4X2xvb3ApLAorCQkgeGdlbmVfcGh5X2dldF9hdmcobGF0X2VlLCBtYXhfbG9vcCksCisJCSB4Z2VuZV9waHlfZ2V0X2F2ZyhsYXRfc2UsIG1heF9sb29wKSk7CisJZGV2X2RiZyhjdHgtPmRldiwgIlNVTSAweCV4XG4iLAorCQl4Z2VuZV9waHlfZ2V0X2F2ZyhzdW1fY2FsLCBtYXhfbG9vcCkpOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxNCwgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxNF9DVExFX0xBVENBTF9NQU5fRU5BX1NFVCh2YWwsIDB4MSk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxNCwgdmFsKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiRW5hYmxlIE1hbnVhbCBTdW1tZXIgY2FsaWJyYXRpb25cbiIpOworCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMjcsICZ2YWwpOworCXZhbCA9IFJYVFhfUkVHMTI3X0xBVENIX01BTl9DQUxfRU5BX1NFVCh2YWwsIDB4MSk7CisJZGV2X2RiZyhjdHgtPmRldiwgIkVuYWJsZSBNYW51YWwgTGF0Y2ggY2FsaWJyYXRpb25cbiIpOworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMTI3LCB2YWwpOworCisJLyogRGlzYWJsZSBSWCBIaS1aIHRlcm1pbmF0aW9uICovCisJc2VyZGVzX3JkKGN0eCwgbGFuZSwgUlhUWF9SRUcxMiwgJnZhbCk7CisJdmFsID0gUlhUWF9SRUcxMl9SWF9ERVRfVEVSTV9FTkFCTEVfU0VUKHZhbCwgMCk7CisJc2VyZGVzX3dyKGN0eCwgbGFuZSwgUlhUWF9SRUcxMiwgdmFsKTsKKwkvKiBUdXJuIG9uIERGRSAqLworCXNlcmRlc193cihjdHgsIGxhbmUsIFJYVFhfUkVHMjgsIDB4MDAwNyk7CisJLyogU2V0IERGRSBwcmVzZXQgKi8KKwlzZXJkZXNfd3IoY3R4LCBsYW5lLCBSWFRYX1JFRzMxLCAweDdlMDApOworfQorCitzdGF0aWMgaW50IHhnZW5lX3BoeV9od19pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgeGdlbmVfcGh5X2N0eCAqY3R4ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJaW50IHJjOworCWludCBpOworCisJcmMgPSB4Z2VuZV9waHlfaHdfaW5pdGlhbGl6ZShjdHgsIENMS19FWFRfRElGRiwgU1NDX0RJU0FCTEUpOworCWlmIChyYykgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiUEhZIGluaXRpYWxpemUgZmFpbGVkICVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBTZXR1cCBjbG9jayBwcm9wZXJseSBhZnRlciBQSFkgY29uZmlndXJhdGlvbiAqLworCWlmICghSVNfRVJSKGN0eC0+Y2xrKSkgeworCQkvKiBIVyByZXF1aXJlcyBhbiB0b2dnbGUgb2YgdGhlIGNsb2NrICovCisJCWNsa19wcmVwYXJlX2VuYWJsZShjdHgtPmNsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjdHgtPmNsayk7CisJCWNsa19wcmVwYXJlX2VuYWJsZShjdHgtPmNsayk7CisJfQorCisJLyogQ29tcHV0ZSBhdmVyYWdlIHZhbHVlICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MQU5FOyBpKyspCisJCXhnZW5lX3BoeV9nZW5fYXZnX3ZhbChjdHgsIGkpOworCisJZGV2X2RiZyhjdHgtPmRldiwgIlBIWSBpbml0aWFsaXplZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X29wcyB4Z2VuZV9waHlfb3BzID0geworCS5pbml0CQk9IHhnZW5lX3BoeV9od19pbml0LAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5ICp4Z2VuZV9waHlfeGxhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGFyZ3MtPmFyZ3NfY291bnQgPD0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGFyZ3MtPmFyZ3NbMF0gPCBNT0RFX1NBVEEgfHwgYXJncy0+YXJnc1swXSA+PSBNT0RFX01BWCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwljdHgtPm1vZGUgPSBhcmdzLT5hcmdzWzBdOworCXJldHVybiBjdHgtPnBoeTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcGh5X2dldF9wYXJhbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsIHUzMiAqYnVmZmVyLAorCQkJCWludCBjb3VudCwgdTMyICpkZWZhdWx0X3ZhbCwKKwkJCQl1MzIgY29udl9mYWN0b3IpCit7CisJaW50IGk7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHBkZXYtPmRldi5vZl9ub2RlLCBuYW1lLCBidWZmZXIsCisJCQkJCWNvdW50KSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCWJ1ZmZlcltpXSAvPSBjb252X2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKwkvKiBEb2VzIG5vdCBleGlzdCwgbG9hZCBkZWZhdWx0ICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWJ1ZmZlcltpXSA9IGRlZmF1bHRfdmFsW2kgJSAzXTsKK30KKworc3RhdGljIGludCB4Z2VuZV9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisJc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmMgPSAwOworCXUzMiBkZWZhdWx0X3NwZFtdID0gREVGQVVMVF9TQVRBX1NQRF9TRUw7CisJdTMyIGRlZmF1bHRfdHhib29zdF9nYWluW10gPSBERUZBVUxUX1NBVEFfVFhCT09TVF9HQUlOOworCXUzMiBkZWZhdWx0X3R4ZXllX2RpcmVjdGlvbltdID0gREVGQVVMVF9TQVRBX1RYRVlFRElSRUNUSU9OOworCXUzMiBkZWZhdWx0X3R4ZXllX3R1bmluZ1tdID0gREVGQVVMVF9TQVRBX1RYRVlFVFVOSU5HOworCXUzMiBkZWZhdWx0X3R4YW1wW10gPSBERUZBVUxUX1NBVEFfVFhBTVA7CisJdTMyIGRlZmF1bHRfdHhjbjFbXSA9IERFRkFVTFRfU0FUQV9UWENOMTsKKwl1MzIgZGVmYXVsdF90eGNuMltdID0gREVGQVVMVF9TQVRBX1RYQ04yOworCXUzMiBkZWZhdWx0X3R4Y3AxW10gPSBERUZBVUxUX1NBVEFfVFhDUDE7CisJaW50IGk7CisKKwljdHggPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdHgtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWN0eC0+c2RzX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGN0eC0+c2RzX2Jhc2UpKSB7CisJCXJjID0gUFRSX0VSUihjdHgtPnNkc19iYXNlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBSZXRyaWV2ZSBvcHRpb25hbCBjbG9jayAqLworCWN0eC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKworCS8qIExvYWQgb3ZlcnJpZGUgcGFyYW1hdGVycyAqLworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1leWUtdHVuaW5nIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4ZXlldHVuaW5nLCA2LCBkZWZhdWx0X3R4ZXllX3R1bmluZywgMSk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LWV5ZS1kaXJlY3Rpb24iLAorCQljdHgtPnNhdGFfcGFyYW0udHhleWVkaXJlY3Rpb24sIDYsIGRlZmF1bHRfdHhleWVfZGlyZWN0aW9uLCAxKTsKKwl4Z2VuZV9waHlfZ2V0X3BhcmFtKHBkZXYsICJhcG0sdHgtYm9vc3QtZ2FpbiIsCisJCWN0eC0+c2F0YV9wYXJhbS50eGJvb3N0Z2FpbiwgNiwgZGVmYXVsdF90eGJvb3N0X2dhaW4sIDEpOworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1hbXBsaXR1ZGUiLAorCQljdHgtPnNhdGFfcGFyYW0udHhhbXBsaXR1ZGUsIDYsIGRlZmF1bHRfdHhhbXAsIDEzMzAwKTsKKwl4Z2VuZV9waHlfZ2V0X3BhcmFtKHBkZXYsICJhcG0sdHgtcHJlLWN1cnNvcjEiLAorCQljdHgtPnNhdGFfcGFyYW0udHhwcmVjdXJzb3JfY24xLCA2LCBkZWZhdWx0X3R4Y24xLCAxODIwMCk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LXByZS1jdXJzb3IyIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4cHJlY3Vyc29yX2NuMiwgNiwgZGVmYXVsdF90eGNuMiwgMTgyMDApOworCXhnZW5lX3BoeV9nZXRfcGFyYW0ocGRldiwgImFwbSx0eC1wb3N0LWN1cnNvciIsCisJCWN0eC0+c2F0YV9wYXJhbS50eHBvc3RjdXJzb3JfY3AxLCA2LCBkZWZhdWx0X3R4Y3AxLCAxODIwMCk7CisJeGdlbmVfcGh5X2dldF9wYXJhbShwZGV2LCAiYXBtLHR4LXNwZWVkIiwKKwkJY3R4LT5zYXRhX3BhcmFtLnR4c3BlZWQsIDMsIGRlZmF1bHRfc3BkLCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xBTkU7IGkrKykKKwkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2ldID0gMjsgLyogRGVmYXVsdCB0byBHZW4zICovCisKKwljdHgtPmRldiA9ICZwZGV2LT5kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4KTsKKworCWN0eC0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGN0eC0+ZGV2LCAmeGdlbmVfcGh5X29wcywgTlVMTCk7CisJaWYgKElTX0VSUihjdHgtPnBoeSkpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBQSFlcbiIpOworCQlyYyA9IFBUUl9FUlIoY3R4LT5waHkpOworCQlnb3RvIGVycm9yOworCX0KKwlwaHlfc2V0X2RydmRhdGEoY3R4LT5waHksIGN0eCk7CisKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihjdHgtPmRldiwKKwkJCQkJCSAgICAgeGdlbmVfcGh5X3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpIHsKKwkJcmMgPSBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeGdlbmVfcGh5X29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gImFwbSx4Z2VuZS1waHkiLH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGdlbmVfcGh5X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGdlbmVfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUgPSB4Z2VuZV9waHlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAieGdlbmUtcGh5IiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IHhnZW5lX3BoeV9vZl9tYXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGdlbmVfcGh5X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVBNIFgtR2VuZSBNdWx0aS1QdXJwb3NlIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxvYyBIbyA8bGhvQGFwbS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCmluZGV4IDFlNGU2OTMuLjA2Y2VlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCkBAIC0yMjQsNyArMjI0LDcgQEAKIAogY29uZmlnIFBJTkNUUkxfTVNNOFg3NAogCXRyaXN0YXRlICJRdWFsY29tbSA4eDc0IHBpbiBjb250cm9sbGVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgT0YgJiYgT0ZfSVJRCisJZGVwZW5kcyBvbiBHUElPTElCICYmIE9GCiAJc2VsZWN0IFBJTkNUUkxfTVNNCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgcGluY3RybCwgcGlubXV4LCBwaW5jb25mIGFuZCBncGlvbGliIGRyaXZlciBmb3IgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvZGV2aWNldHJlZS5jIGIvZHJpdmVycy9waW5jdHJsL2RldmljZXRyZWUuYwppbmRleCAzNDBmYjRlLi5lZGExM2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvZGV2aWNldHJlZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9kZXZpY2V0cmVlLmMKQEAgLTE4Niw3ICsxODYsOSBAQAogCiAJLyogQ09ORklHX09GIGVuYWJsZWQsIHAtPmRldiBub3QgaW5zdGFudGlhdGVkIGZyb20gRFQgKi8KIAlpZiAoIW5wKSB7Ci0JCWRldl9kYmcocC0+ZGV2LCAibm8gb2Zfbm9kZTsgbm90IHBhcnNpbmcgcGluY3RybCBEVFxuIik7CisJCWlmIChvZl9oYXZlX3BvcHVsYXRlZF9kdCgpKQorCQkJZGV2X2RiZyhwLT5kZXYsCisJCQkJIm5vIG9mX25vZGU7IG5vdCBwYXJzaW5nIHBpbmN0cmwgRFRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L0tjb25maWcKaW5kZXggMzY2ZmE1NC4uY2MyOThmYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9LY29uZmlnCkBAIC04LDYgKzgsNyBAQAogY29uZmlnIFBJTkNUUkxfRE9WRQogCWJvb2wKIAlzZWxlY3QgUElOQ1RSTF9NVkVCVQorCXNlbGVjdCBNRkRfU1lTQ09OCiAKIGNvbmZpZyBQSU5DVFJMX0tJUktXT09ECiAJYm9vbApAQCAtMTcsNiArMTgsMTQgQEAKIAlib29sCiAJc2VsZWN0IFBJTkNUUkxfTVZFQlUKIAorY29uZmlnIFBJTkNUUkxfQVJNQURBXzM3NQorCWJvb2wKKwlzZWxlY3QgUElOQ1RSTF9NVkVCVQorCitjb25maWcgUElOQ1RSTF9BUk1BREFfMzhYCisJYm9vbAorCXNlbGVjdCBQSU5DVFJMX01WRUJVCisKIGNvbmZpZyBQSU5DVFJMX0FSTUFEQV9YUAogCWJvb2wKIAlzZWxlY3QgUElOQ1RSTF9NVkVCVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L01ha2VmaWxlIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L01ha2VmaWxlCmluZGV4IDM3YzI1MzIuLmJjMWI5ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvTWFrZWZpbGUKQEAgLTIsNCArMiw2IEBACiBvYmotJChDT05GSUdfUElOQ1RSTF9ET1ZFKQkrPSBwaW5jdHJsLWRvdmUubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfS0lSS1dPT0QpCSs9IHBpbmN0cmwta2lya3dvb2Qubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQVJNQURBXzM3MCkgKz0gcGluY3RybC1hcm1hZGEtMzcwLm8KK29iai0kKENPTkZJR19QSU5DVFJMX0FSTUFEQV8zNzUpICs9IHBpbmN0cmwtYXJtYWRhLTM3NS5vCitvYmotJChDT05GSUdfUElOQ1RSTF9BUk1BREFfMzhYKSArPSBwaW5jdHJsLWFybWFkYS0zOHgubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQVJNQURBX1hQKSAgKz0gcGluY3RybC1hcm1hZGEteHAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3MC5jIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3MC5jCmluZGV4IGFlMWY3NjAuLjY3MGU1YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzcwLmMKQEAgLTIzLDYgKzIzLDE4IEBACiAKICNpbmNsdWRlICJwaW5jdHJsLW12ZWJ1LmgiCiAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1wcF9iYXNlOworCitzdGF0aWMgaW50IGFybWFkYV8zNzBfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGFybWFkYV8zNzBfbXBwX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX21vZGUgbXY4OGY2NzEwX21wcF9tb2Rlc1tdID0gewogCU1QUF9NT0RFKDAsCiAJICAgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKQEAgLTM3Myw3ICszODUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBtdjg4ZjY3MTBfbXBwX2NvbnRyb2xzW10gPSB7Ci0JTVBQX1JFR19DVFJMKDAsIDY1KSwKKwlNUFBfRlVOQ19DVFJMKDAsIDY1LCBOVUxMLCBhcm1hZGFfMzcwX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjcxMF9tcHBfZ3Bpb19yYW5nZXNbXSA9IHsKQEAgLTM4NSw2ICszOTcsMTIgQEAKIHN0YXRpYyBpbnQgYXJtYWRhXzM3MF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9ICZhcm1hZGFfMzcwX3BpbmN0cmxfaW5mbzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJbXBwX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1wcF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXBwX2Jhc2UpOwogCiAJc29jLT52YXJpYW50ID0gMDsgLyogbm8gdmFyaWFudHMgZm9yIEFybWFkYSAzNzAgKi8KIAlzb2MtPmNvbnRyb2xzID0gbXY4OGY2NzEwX21wcF9jb250cm9sczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzUuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA3OGZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3NS5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogTWFydmVsbCBBcm1hZGEgMzc1IHBpbmN0cmwgZHJpdmVyIGJhc2VkIG9uIG12ZWJ1IHBpbmN0cmwgY29yZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBNYXJ2ZWxsCisgKgorICogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKworI2luY2x1ZGUgInBpbmN0cmwtbXZlYnUuaCIKKworc3RhdGljIHZvaWQgX19pb21lbSAqbXBwX2Jhc2U7CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3NV9tcHBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfZ2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3NV9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9zZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKworc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfbW9kZSBtdjg4ZjY3MjBfbXBwX21vZGVzW10gPSB7CisJTVBQX01PREUoMCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNwaTAiLCAiY3MxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJjczEiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvMiIpKSwKKwlNUFBfTU9ERSgxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJtb3NpIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJtb3NpIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzMiKSksCisJTVBQX01PREUoMiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkNCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInB0cCIsICJldmVudHJlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImxlZCIsICJjMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImF1ZGlvIiwgInNkaSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiaW80IiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJtb3NpIikpLAorCU1QUF9NT0RFKDMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhZDUiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwdHAiLCAidHJpZ2dlbiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImxlZCIsICJwMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImF1ZGlvIiwgIm1jbGsiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvNSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInNwaTEiLCAibWlzbyIpKSwKKwlNUFBfTU9ERSg0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQ2IiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJtaXNvIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJtaXNvIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzYiKSksCisJTVBQX01PREUoNSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImFkNyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNwaTAiLCAiY3MyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJjczIiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImlvNyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInNwaTEiLCAibWlzbyIpKSwKKwlNUFBfTU9ERSg2LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYWQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgInAxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAicmNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiaW8wIikpLAorCU1QUF9NT0RFKDcsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImRldiIsICJhZDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwdHAiLCAiY2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgInAyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAiZXh0Y2xrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJpbzEiKSksCisJTVBQX01PREUoOCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2ICIsICJib290Y3MiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJzcGkwIiwgImNzMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJjZSIpKSwKKwlNUFBfTU9ERSg5LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJuZiIsICJ3ZW4iKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJzcGkwIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAic2NrIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJ3ZSIpKSwKKwlNUFBfTU9ERSgxMCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibmYiLCAicmVuIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZHJhbSIsICJ2dHRjdHJsIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAibGVkIiwgImMxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibmFuZCIsICJyZSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInNwaTEiLCAic2NrIikpLAorCU1QUF9NT0RFKDExLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAiYTAiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJsZWQiLCAiYzIiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJhdWRpbyIsICJzZG8iKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgImNsZSIpKSwKKwlNUFBfTU9ERSgxMiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiZGV2IiwgImExIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiYXVkaW8iLCAiYmNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgIm5hbmQiLCAiYWxlIikpLAorCU1QUF9NT0RFKDEzLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJkZXYiLCAicmVhZHluIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAicGNpZTAiLCAicnN0b3V0biIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInBjaWUxIiwgInJzdG91dG4iKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJuYW5kIiwgInJiIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJtb3NpIikpLAorCU1QUF9NT0RFKDE0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJpMmMwIiwgInNkYSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInVhcnQxIiwgInR4ZCIpKSwKKwlNUFBfTU9ERSgxNSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiaTJjMCIsICJzY2siKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJ1YXJ0MSIsICJyeGQiKSksCisJTVBQX01PREUoMTYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInVhcnQwIiwgInR4ZCIpKSwKKwlNUFBfTU9ERSgxNywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidWFydDAiLCAicnhkIikpLAorCU1QUF9NT0RFKDE4LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ0ZG0iLCAiaW50biIpKSwKKwlNUFBfTU9ERSgxOSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidGRtIiwgInJzdG4iKSksCisJTVBQX01PREUoMjAsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJwY2xrIikpLAorCU1QUF9NT0RFKDIxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ0ZG0iLCAiZnN5bmMiKSksCisJTVBQX01PREUoMjIsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJkcngiKSksCisJTVBQX01PREUoMjMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInRkbSIsICJkdHgiKSksCisJTVBQX01PREUoMjQsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic2QiLCAiY21kIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDAiLCAicnRzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJjczAiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiY3MxIikpLAorCU1QUF9NT0RFKDI1LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAicDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAicnhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDAiLCAiY3RzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJtb3NpIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImNzMiIpKSwKKwlNUFBfTU9ERSgyNiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTAiLCAiY2xrcmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInJ4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzZCIsICJkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInVhcnQxIiwgInJ0cyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgInNwaTAiLCAiY3MxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAibGVkIiwgImMxIikpLAorCU1QUF9NT0RFKDI3LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJwY2llMSIsICJjbGtyZXEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAicnhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDEiLCAiY3RzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJtaXNvIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAibGVkIiwgImMyIikpLAorCU1QUF9NT0RFKDI4LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAicDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhjdGwiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzZCIsICJjbGsiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJkcmFtIiwgInZ0dGN0cmwiKSksCisJTVBQX01PREUoMjksCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUxIiwgImNsa3JlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNkIiwgImQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAic3BpMCIsICJzY2siKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJwY2llMCIsICJyc3RvdXRuIikpLAorCU1QUF9NT0RFKDMwLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhkMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MwIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgInAzIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAicHRwIiwgImV2ZW50cmVxIikpLAorCU1QUF9NT0RFKDMxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAibW9zaSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMCIpKSwKKwlNUFBfTU9ERSgzMiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInR4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInB0cCIsICJ0cmlnZ2VuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgImMwIikpLAorCU1QUF9NT0RFKDMzLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTEiLCAidHhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAibWlzbyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMiIpKSwKKwlNUFBfTU9ERSgzNCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UxIiwgInR4Y2xrb3V0IiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAic3BpMSIsICJzY2siKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAiYzEiKSksCisJTVBQX01PREUoMzUsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMSIsICJyeGN0bCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgInNwaTEiLCAiY3MxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAic3BpMCIsICJjczIiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAicDEiKSksCisJTVBQX01PREUoMzYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUwIiwgImNsa3JlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJjMiIpKSwKKwlNUFBfTU9ERSgzNywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTAiLCAiY2xrcmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAidGRtIiwgImludG4iKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJnZSIsICJtZGMiKSksCisJTVBQX01PREUoMzgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgInBjaWUxIiwgImNsa3JlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImdlIiwgIm1kaW8iKSksCisJTVBQX01PREUoMzksCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInJlZiIsICJjbGtvdXQiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJsZWQiLCAicDMiKSksCisJTVBQX01PREUoNDAsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgInVhcnQxIiwgInR4ZCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImxlZCIsICJwMCIpKSwKKwlNUFBfTU9ERSg0MSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAidWFydDEiLCAicnhkIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgInAxIikpLAorCU1QUF9NT0RFKDQyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgImNzMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJjMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgInB0cCIsICJjbGsiKSksCisJTVBQX01PREUoNDMsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgInNhdGEwIiwgInByc250IiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAiZHJhbSIsICJ2dHRjdHJsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgImMxIikpLAorCU1QUF9NT0RFKDQ0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJzYXRhMCIsICJwcnNudCIpKSwKKwlNUFBfTU9ERSg0NSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAic3BpMCIsICJjczIiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJwY2llMCIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg1LCAibGVkIiwgImMyIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAic3BpMSIsICJjczIiKSksCisJTVBQX01PREUoNDYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJ0eGQwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInR4ZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAid2VuMSIpKSwKKwlNUFBfTU9ERSg0NywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgInAxIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4ZDEiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAidHhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgInB0cCIsICJ0cmlnZ2VuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFsZTAiKSksCisJTVBQX01PREUoNDgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MSwgImxlZCIsICJwMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJ0eGQyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInR4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWxlMSIpKSwKKwlNUFBfTU9ERSg0OSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgInAzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4ZDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAidHhkMyIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhMiIpKSwKKwlNUFBfTU9ERSg1MCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgImMwIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4ZDAiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAicnhkMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgInB0cCIsICJldmVudHJlcSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDEyIikpLAorCU1QUF9NT0RFKDUxLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJsZWQiLCAiYzEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJnZTAiLCAicnhkMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJyeGQxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkOCIpKSwKKwlNUFBfTU9ERSg1MiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAibGVkIiwgImMyIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4ZDIiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJnZTEiLCAicnhkMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NSwgImkyYzAiLCAic2RhIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkOSIpKSwKKwlNUFBfTU9ERSg1MywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAicGNpZTEiLCAicnN0b3V0biIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJyeGQzIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInJ4ZDMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJpMmMwIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDEwIikpLAorCU1QUF9NT0RFKDU0LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJwY2llMCIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInJ4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInJ4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImFkMTEiKSksCisJTVBQX01PREUoNTUsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJyeGNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJyeGNsayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJjczAiKSksCisJTVBQX01PREUoNTYsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MiwgImdlMCIsICJ0eGNsa291dCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4MywgImdlMSIsICJ0eGNsa291dCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJvZSIpKSwKKwlNUFBfTU9ERSg1NywKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZ2UwIiwgInR4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHgzLCAiZ2UxIiwgInR4Y3RsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgIndlbjAiKSksCisJTVBQX01PREUoNTgsCisJCSBNUFBfRlVOQ1RJT04oMHgwLCAiZ3BpbyIsIE5VTEwpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJjMCIpKSwKKwlNUFBfTU9ERSg1OSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgImMxIikpLAorCU1QUF9NT0RFKDYwLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ1YXJ0MSIsICJ0eGQiKSwKKwkJIE1QUF9GVU5DVElPTigweDQsICJsZWQiLCAiYzIiKSwKKwkJIE1QUF9GVU5DVElPTigweDYsICJkZXYiLCAiYWQxMyIpKSwKKwlNUFBfTU9ERSg2MSwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgxLCAiaTJjMSIsICJzZGEiKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJ1YXJ0MSIsICJyeGQiKSwKKwkJIE1QUF9GVU5DVElPTigweDMsICJzcGkxIiwgImNzMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJwMCIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDE0IikpLAorCU1QUF9NT0RFKDYyLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJpMmMxIiwgInNjayIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJwMSIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJhZDE1IikpLAorCU1QUF9NT0RFKDYzLAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDIsICJwdHAiLCAidHJpZ2dlbiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NCwgImxlZCIsICJwMiIpLAorCQkgTVBQX0ZVTkNUSU9OKDB4NiwgImRldiIsICJidXJzdCIpKSwKKwlNUFBfTU9ERSg2NCwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAiZHJhbSIsICJ2dHRjdHJsIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAibGVkIiwgInAzIikpLAorCU1QUF9NT0RFKDY1LAorCQkgTVBQX0ZVTkNUSU9OKDB4MCwgImdwaW8iLCBOVUxMKSwKKwkJIE1QUF9GVU5DVElPTigweDEsICJzYXRhMSIsICJwcnNudCIpKSwKKwlNUFBfTU9ERSg2NiwKKwkJIE1QUF9GVU5DVElPTigweDAsICJncGlvIiwgTlVMTCksCisJCSBNUFBfRlVOQ1RJT04oMHgyLCAicHRwIiwgImV2ZW50cmVxIiksCisJCSBNUFBfRlVOQ1RJT04oMHg0LCAic3BpMSIsICJjczMiKSwKKwkJIE1QUF9GVU5DVElPTigweDUsICJwY2llMCIsICJyc3RvdXRuIiksCisJCSBNUFBfRlVOQ1RJT04oMHg2LCAiZGV2IiwgImNzMyIpKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyBhcm1hZGFfMzc1X3BpbmN0cmxfaW5mbzsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtYWRhXzM3NV9waW5jdHJsX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12ODhmNjcyMC1waW5jdHJsIiB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY4OGY2NzIwX21wcF9jb250cm9sc1tdID0geworCU1QUF9GVU5DX0NUUkwoMCwgNjksIE5VTEwsIGFybWFkYV8zNzVfbXBwX2N0cmwpLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY4OGY2NzIwX21wcF9ncGlvX3Jhbmdlc1tdID0geworCU1QUF9HUElPX1JBTkdFKDAsICAgMCwgIDAsIDMyKSwKKwlNUFBfR1BJT19SQU5HRSgxLCAgMzIsIDMyLCAzMiksCisJTVBQX0dQSU9fUkFOR0UoMiwgIDY0LCA2NCwgIDMpLAorfTsKKworc3RhdGljIGludCBhcm1hZGFfMzc1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyAqc29jID0gJmFybWFkYV8zNzVfcGluY3RybF9pbmZvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobXBwX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihtcHBfYmFzZSk7CisKKwlzb2MtPnZhcmlhbnQgPSAwOyAvKiBubyB2YXJpYW50cyBmb3IgQXJtYWRhIDM3NSAqLworCXNvYy0+Y29udHJvbHMgPSBtdjg4ZjY3MjBfbXBwX2NvbnRyb2xzOworCXNvYy0+bmNvbnRyb2xzID0gQVJSQVlfU0laRShtdjg4ZjY3MjBfbXBwX2NvbnRyb2xzKTsKKwlzb2MtPm1vZGVzID0gbXY4OGY2NzIwX21wcF9tb2RlczsKKwlzb2MtPm5tb2RlcyA9IEFSUkFZX1NJWkUobXY4OGY2NzIwX21wcF9tb2Rlcyk7CisJc29jLT5ncGlvcmFuZ2VzID0gbXY4OGY2NzIwX21wcF9ncGlvX3JhbmdlczsKKwlzb2MtPm5ncGlvcmFuZ2VzID0gQVJSQVlfU0laRShtdjg4ZjY3MjBfbXBwX2dwaW9fcmFuZ2VzKTsKKworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gc29jOworCisJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcHJvYmUocGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3NV9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBtdmVidV9waW5jdHJsX3JlbW92ZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtYWRhXzM3NV9waW5jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhcm1hZGEtMzc1LXBpbmN0cmwiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFybWFkYV8zNzVfcGluY3RybF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBhcm1hZGFfMzc1X3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IGFybWFkYV8zNzVfcGluY3RybF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFybWFkYV8zNzVfcGluY3RybF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBBcm1hZGEgMzc1IHBpbmN0cmwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzh4LmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0OWY4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zOHguYwpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqIE1hcnZlbGwgQXJtYWRhIDM4MC8zODUgcGluY3RybCBkcml2ZXIgYmFzZWQgb24gbXZlYnUgcGluY3RybCBjb3JlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIE1hcnZlbGwKKyAqCisgKiBUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorCisjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgorCitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKKworc3RhdGljIGludCBhcm1hZGFfMzh4X21wcF9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9nZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzh4X21wcF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitlbnVtIHsKKwlWXzg4RjY4MTAgPSBCSVQoMCksCisJVl84OEY2ODIwID0gQklUKDEpLAorCVZfODhGNjgyOCA9IEJJVCgyKSwKKwlWXzg4RjY4MTBfUExVUyA9IChWXzg4RjY4MTAgfCBWXzg4RjY4MjAgfCBWXzg4RjY4MjgpLAorCVZfODhGNjgyMF9QTFVTID0gKFZfODhGNjgyMCB8IFZfODhGNjgyOCksCit9OworCitzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9tb2RlIGFybWFkYV8zOHhfbXBwX21vZGVzW10gPSB7CisJTVBQX01PREUoMCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTAiLCAgICJyeGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMCIsICAgInR4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDIsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiaTJjMCIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMwIiwgICJzZGEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlIiwgICAgIm1kYyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJ1YTEiLCAgICJ0eGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZSIsICAgICJtZGlvIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAidWExIiwgICAicnhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMCIsICAgImN0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhjbGtvdXQiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMCIsICAgImNycyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJjczMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg3LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInR4ZDAiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDkiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInR4ZDEiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDEwIiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInR4ZDIiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDExIiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxMCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJ0eGQzIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQxMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhjdGwiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMTMiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDEyLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4ZDAiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgImNzMSIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDE0IiwgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgxMywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJyeGQxIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTAiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICJjczIiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQxNSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAicnhkMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJtIiwgICAgICJ2dHRfY3RybCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAiY3MzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgIndlbjEiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDE1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4ZDMiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZSIsICAgICJtZGMgc2xhdmUiLCAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgIm1vc2kiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpKSwKKwlNUFBfTU9ERSgxNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJyeGN0bCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UiLCAgICAibWRpbyBzbGF2ZSIsIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgIm0iLCAgICAgImRlY2NfZXJyIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICJtaXNvIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAicGNpZTAiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMTcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAicnhjbGsiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTEiLCAgICJyeGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNhdGExIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDE4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImdlMCIsICAgInJ4ZXJyIiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwdHAiLCAgICJ0cmlnX2dlbiIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWExIiwgICAidHhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgImNzMCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpKSwKKwlNUFBfTU9ERSgxOSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJnZTAiLCAgICJjb2wiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicHRwIiwgICAiZXZlbnRfcmVxIiwgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUwIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAidWEwIiwgICAiY3RzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiZ2UwIiwgICAidHhjbGsiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInVhMCIsICAgInJ0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDIxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgImNzMSIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGQwIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAic2F0YTAiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImNtZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJib290Y3MiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyMiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICJtb3NpIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQwIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjMsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkMiIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDI0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgIm1pc28iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJ1YTAiLCAgICJjdHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWExIiwgICAicnhkIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImQ0IiwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJyZWFkeSIsICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgyNSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICJjczAiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAidWEwIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMSIsICAgInR4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkNSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiY3MwIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAiY3MyIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgImkyYzEiLCAgInNjayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkNiIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiY3MxIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAiY3MzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInR4Y2xrb3V0IiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJpMmMxIiwgICJzZGEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDciLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImNzMiIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDI4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInR4ZDAiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJjbGsiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWQ1IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMjksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAidHhkMSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFsZTAiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDMwLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInR4ZDIiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJvZW4iLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzMSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJ0eGQzIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYWxlMSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzIsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAidHhjdGwiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgIndlbjAiLCAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDMzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgIm0iLCAgICAgImRlY2NfZXJyIiwgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzNCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzNSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJyZWYiLCAgICJjbGtfb3V0MSIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYTEiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoMzYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicHRwIiwgICAidHJpZ19nZW4iLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImEwIiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDM3LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInB0cCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGNsayIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDMiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkOCIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDM4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInB0cCIsICAgImV2ZW50X3JlcSIsICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGQxIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicmVmIiwgICAiY2xrX291dDAiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkMCIsICAgImQwIiwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJhZDQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSgzOSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMxIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UxIiwgICAicnhkMiIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMCIsICAgImN0cyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZDAiLCAgICJkMSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAiYTIiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNDAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAiaTJjMSIsICAic2RhIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlMSIsICAgInJ4ZDMiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTAiLCAgICJydHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QwIiwgICAiZDIiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkNiIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMSIsICAgInJ4ZCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJnZTEiLCAgICJyeGN0bCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAiY3RzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgImNzMyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJidXJzdC9sYXN0IiwgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0MiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTEiLCAgICJ0eGQiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgImFkNyIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUwIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJtIiwgICAgICJ2dHRfY3RybCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAibSIsICAgICAiZGVjY19lcnIiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICJjbGtvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0NCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzYXRhMCIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAic2F0YTEiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInNhdGEyIiwgInByc250IiwgICAgICBWXzg4RjY4MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2F0YTMiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0NSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJyZWYiLCAgICJjbGtfb3V0MCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJwY2llMiIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAicGNpZTMiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNDYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicmVmIiwgICAiY2xrX291dDEiLCAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInBjaWUwIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJwY2llMSIsICJyc3RvdXQiLCAgICAgVl84OEY2ODIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAicGNpZTIiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInBjaWUzIiwgInJzdG91dCIsICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDQ3LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAic2F0YTIiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJjczIiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2F0YTMiLCAicHJzbnQiLCAgICAgIFZfODhGNjgyOCkpLAorCU1QUF9NT0RFKDQ4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJtIiwgICAgICJ2dHRfY3RybCIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAicGNsayIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgIm1jbGsiLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkNCIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg0OSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzYXRhMiIsICJwcnNudCIsICAgICAgVl84OEY2ODI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGEzIiwgInByc250IiwgICAgICBWXzg4RjY4MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAiZnN5bmMiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgImxyY2xrIiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkNSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbTJjIiwgImRyeCIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICJleHRjbGsiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiY21kIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtMmMiLCAiZHR4IiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgImF1ZGlvIiwgInNkbyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJtIiwgICAgICJkZWNjX2VyciIsICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAicGNpZTEiLCAicnN0b3V0IiwgICAgIFZfODhGNjgyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbTJjIiwgImludG4iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICJzZGkiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiZDYiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTMsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic2F0YTEiLCAicHJzbnQiLCAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ0ZG0yYyIsICJyc3RuIiwgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAiYmNsayIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImQ3IiwgICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDU0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgInByc250IiwgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJzYXRhMSIsICJwcnNudCIsICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTAiLCAicnN0b3V0IiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkMyIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1NSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTEiLCAgICJjdHMiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiZ2UiLCAgICAibWRpbyIsICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJjczEiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiZDAiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAidWExIiwgICAicnRzIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImdlIiwgICAgIm1kYyIsICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJtIiwgICAgICJkZWNjX2VyciIsICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAibW9zaSIsICAgICAgIFZfODhGNjgxMF9QTFVTKSksCisJTVBQX01PREUoNTcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgIE5VTEwsICAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAic2NrIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkMCIsICAgImNsayIsICAgICAgICBWXzg4RjY4MTBfUExVUykpLAorCU1QUF9NT0RFKDU4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICBOVUxMLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUxIiwgImNsa3JlcSIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJpMmMxIiwgICJzY2siLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTIiLCAiY2xrcmVxIiwgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgIm1pc28iLCAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZDAiLCAgICJkMSIsICAgICAgICAgVl84OEY2ODEwX1BMVVMpKSwKKwlNUFBfTU9ERSg1OSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgTlVMTCwgICAgICAgICBWXzg4RjY4MTBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwY2llMCIsICJyc3RvdXQiLCAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAiaTJjMSIsICAic2RhIiwgICAgICAgIFZfODhGNjgxMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUxIiwgInJzdG91dCIsICAgICBWXzg4RjY4MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICJjczAiLCAgICAgICAgVl84OEY2ODEwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QwIiwgICAiZDIiLCAgICAgICAgIFZfODhGNjgxMF9QTFVTKSksCit9OworCitzdGF0aWMgc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gYXJtYWRhXzM4eF9waW5jdHJsX2luZm87CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zOHhfcGluY3RybF9vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAibWFydmVsbCxtdjg4ZjY4MTAtcGluY3RybCIsCisJCS5kYXRhICAgICAgID0gKHZvaWQgKikgVl84OEY2ODEwLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12ODhmNjgyMC1waW5jdHJsIiwKKwkJLmRhdGEgICAgICAgPSAodm9pZCAqKSBWXzg4RjY4MjAsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gIm1hcnZlbGwsbXY4OGY2ODI4LXBpbmN0cmwiLAorCQkuZGF0YSAgICAgICA9ICh2b2lkICopIFZfODhGNjgyOCwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgYXJtYWRhXzM4eF9tcHBfY29udHJvbHNbXSA9IHsKKwlNUFBfRlVOQ19DVFJMKDAsIDU5LCBOVUxMLCBhcm1hZGFfMzh4X21wcF9jdHJsKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIGFybWFkYV8zOHhfbXBwX2dwaW9fcmFuZ2VzW10gPSB7CisJTVBQX0dQSU9fUkFOR0UoMCwgICAwLCAgMCwgMzIpLAorCU1QUF9HUElPX1JBTkdFKDEsICAzMiwgMzIsIDI3KSwKK307CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM4eF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9ICZhcm1hZGFfMzh4X3BpbmN0cmxfaW5mbzsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CisJCW9mX21hdGNoX2RldmljZShhcm1hZGFfMzh4X3BpbmN0cmxfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1wcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihtcHBfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcF9iYXNlKTsKKworCXNvYy0+dmFyaWFudCA9ICh1bnNpZ25lZCkgbWF0Y2gtPmRhdGEgJiAweGZmOworCXNvYy0+Y29udHJvbHMgPSBhcm1hZGFfMzh4X21wcF9jb250cm9sczsKKwlzb2MtPm5jb250cm9scyA9IEFSUkFZX1NJWkUoYXJtYWRhXzM4eF9tcHBfY29udHJvbHMpOworCXNvYy0+Z3Bpb3JhbmdlcyA9IGFybWFkYV8zOHhfbXBwX2dwaW9fcmFuZ2VzOworCXNvYy0+bmdwaW9yYW5nZXMgPSBBUlJBWV9TSVpFKGFybWFkYV8zOHhfbXBwX2dwaW9fcmFuZ2VzKTsKKwlzb2MtPm1vZGVzID0gYXJtYWRhXzM4eF9tcHBfbW9kZXM7CisJc29jLT5ubW9kZXMgPSBhcm1hZGFfMzh4X21wcF9jb250cm9sc1swXS5ucGluczsKKworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gc29jOworCisJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcHJvYmUocGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM4eF9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBtdmVidV9waW5jdHJsX3JlbW92ZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtYWRhXzM4eF9waW5jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhcm1hZGEtMzh4LXBpbmN0cmwiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFybWFkYV8zOHhfcGluY3RybF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBhcm1hZGFfMzh4X3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IGFybWFkYV8zOHhfcGluY3RybF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFybWFkYV8zOHhfcGluY3RybF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBBcm1hZGEgMzh4IHBpbmN0cmwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEteHAuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCmluZGV4IDg0M2E1MWYuLmRlMzExMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCkBAIC0zMyw2ICszMywxOCBAQAogCiAjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgogCitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKKworc3RhdGljIGludCBhcm1hZGFfeHBfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGFybWFkYV94cF9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwlyZXR1cm4gZGVmYXVsdF9tcHBfY3RybF9zZXQobXBwX2Jhc2UsIHBpZCwgY29uZmlnKTsKK30KKwogZW51bSBhcm1hZGFfeHBfdmFyaWFudCB7CiAJVl9NVjc4MjMwCT0gQklUKDApLAogCVZfTVY3ODI2MAk9IEJJVCgxKSwKQEAgLTM2Niw3ICszNzgsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdmVidV9tcHBfY3RybCBtdjc4MjMwX21wcF9jb250cm9sc1tdID0gewotCU1QUF9SRUdfQ1RSTCgwLCA0OCksCisJTVBQX0ZVTkNfQ1RSTCgwLCA0OCwgTlVMTCwgYXJtYWRhX3hwX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12NzgyMzBfbXBwX2dwaW9fcmFuZ2VzW10gPSB7CkBAIC0zNzUsNyArMzg3LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgbXY3ODI2MF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgNjYpLAorCU1QUF9GVU5DX0NUUkwoMCwgNjYsIE5VTEwsIGFybWFkYV94cF9tcHBfY3RybCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBtdjc4MjYwX21wcF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzg1LDcgKzM5Nyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12Nzg0NjBfbXBwX2NvbnRyb2xzW10gPSB7Ci0JTVBQX1JFR19DVFJMKDAsIDY2KSwKKwlNUFBfRlVOQ19DVFJMKDAsIDY2LCBOVUxMLCBhcm1hZGFfeHBfbXBwX2N0cmwpLAogfTsKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgbXY3ODQ2MF9tcHBfZ3Bpb19yYW5nZXNbXSA9IHsKQEAgLTM5OSwxMCArNDExLDE2IEBACiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9ICZhcm1hZGFfeHBfcGluY3RybF9pbmZvOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoID0KIAkJb2ZfbWF0Y2hfZGV2aWNlKGFybWFkYV94cF9waW5jdHJsX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCWlmICghbWF0Y2gpCiAJCXJldHVybiAtRU5PREVWOwogCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobXBwX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihtcHBfYmFzZSk7CisKIAlzb2MtPnZhcmlhbnQgPSAodW5zaWduZWQpIG1hdGNoLT5kYXRhICYgMHhmZjsKIAogCXN3aXRjaCAoc29jLT52YXJpYW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1kb3ZlLmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1kb3ZlLmMKaW5kZXggNDcyNjgzOS4uM2IwMjIxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtZG92ZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWRvdmUuYwpAQCAtMTgsMTA3ICsxOCwxMjIgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KIAogI2luY2x1ZGUgInBpbmN0cmwtbXZlYnUuaCIKIAotI2RlZmluZSBET1ZFX1NCX1JFR1NfVklSVF9CQVNFCQlJT01FTSgweGZkZTAwMDAwKQotI2RlZmluZSBET1ZFX01QUF9WSVJUX0JBU0UJCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhkMDIwMCkKLSNkZWZpbmUgRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTAkoRE9WRV9NUFBfVklSVF9CQVNFICsgMHgxMCkKLSNkZWZpbmUgIERPVkVfQVUwX0FDOTdfU0VMCQlCSVQoMTYpCi0jZGVmaW5lIERPVkVfUE1VX1NJR05BTF9TRUxFQ1RfMAkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZDgwMkMpCi0jZGVmaW5lIERPVkVfUE1VX1NJR05BTF9TRUxFQ1RfMQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZDgwMzApCi0jZGVmaW5lIERPVkVfR0xPQkFMX0NPTkZJR18xCQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwMkMpCi0jZGVmaW5lIERPVkVfR0xPQkFMX0NPTkZJR18xCQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwMkMpCi0jZGVmaW5lICBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjEJQklUKDcpCi0jZGVmaW5lIERPVkVfR0xPQkFMX0NPTkZJR18yCQkoRE9WRV9TQl9SRUdTX1ZJUlRfQkFTRSArIDB4ZTgwMzApCi0jZGVmaW5lICBET1ZFX1RXU0lfRU5BQkxFX09QVElPTjIJQklUKDIwKQotI2RlZmluZSAgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zCUJJVCgyMSkKLSNkZWZpbmUgIERPVkVfVFdTSV9PUFRJT04zX0dQSU8JCUJJVCgyMikKLSNkZWZpbmUgRE9WRV9TU1BfQ1RSTF9TVEFUVVNfMQkJKERPVkVfU0JfUkVHU19WSVJUX0JBU0UgKyAweGU4MDM0KQotI2RlZmluZSAgRE9WRV9TU1BfT05fQVUxCQlCSVQoMCkKLSNkZWZpbmUgRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UJKERPVkVfU0JfUkVHU19WSVJUX0JBU0UgKyAweGU4MDNjKQotI2RlZmluZSAgRE9WRV9BVTFfU1BESUZPX0dQSU9fRU4JQklUKDEpCi0jZGVmaW5lICBET1ZFX05BTkRfR1BJT19FTgkJQklUKDApCi0jZGVmaW5lIERPVkVfR1BJT19MT19WSVJUX0JBU0UJCShET1ZFX1NCX1JFR1NfVklSVF9CQVNFICsgMHhkMDQwMCkKLSNkZWZpbmUgRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFCShET1ZFX0dQSU9fTE9fVklSVF9CQVNFICsgMHg0MCkKLSNkZWZpbmUgIERPVkVfU1BJX0dQSU9fU0VMCQlCSVQoNSkKLSNkZWZpbmUgIERPVkVfVUFSVDFfR1BJT19TRUwJCUJJVCg0KQotI2RlZmluZSAgRE9WRV9BVTFfR1BJT19TRUwJCUJJVCgzKQotI2RlZmluZSAgRE9WRV9DQU1fR1BJT19TRUwJCUJJVCgyKQotI2RlZmluZSAgRE9WRV9TRDFfR1BJT19TRUwJCUJJVCgxKQotI2RlZmluZSAgRE9WRV9TRDBfR1BJT19TRUwJCUJJVCgwKQorLyogSW50ZXJuYWwgcmVnaXN0ZXJzIGNhbiBiZSBjb25maWd1cmVkIGF0IGFueSAxIE1pQiBhbGlnbmVkIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU5UX1JFR1NfTUFTSwkJfihTWl8xTSAtIDEpCisjZGVmaW5lIE1QUDRfUkVHU19PRkZTCQkweGQwNDQwCisjZGVmaW5lIFBNVV9SRUdTX09GRlMJCTB4ZDgwMmMKKyNkZWZpbmUgR0NfUkVHU19PRkZTCQkweGU4MDJjCiAKLSNkZWZpbmUgTVBQU19QRVJfUkVHCTgKLSNkZWZpbmUgTVBQX0JJVFMJNAotI2RlZmluZSBNUFBfTUFTSwkweGYKKy8qIE1QUCBCYXNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBQTVVfTVBQX0dFTkVSQUxfQ1RSTAkweDEwCisjZGVmaW5lICBBVTBfQUM5N19TRUwJCUJJVCgxNikKKworLyogTVBQIENvbnRyb2wgNCByZWdpc3RlciAqLworI2RlZmluZSBTUElfR1BJT19TRUwJCUJJVCg1KQorI2RlZmluZSBVQVJUMV9HUElPX1NFTAkJQklUKDQpCisjZGVmaW5lIEFVMV9HUElPX1NFTAkJQklUKDMpCisjZGVmaW5lIENBTV9HUElPX1NFTAkJQklUKDIpCisjZGVmaW5lIFNEMV9HUElPX1NFTAkJQklUKDEpCisjZGVmaW5lIFNEMF9HUElPX1NFTAkJQklUKDApCisKKy8qIFBNVSBTaWduYWwgU2VsZWN0IHJlZ2lzdGVycyAqLworI2RlZmluZSBQTVVfU0lHTkFMX1NFTEVDVF8wCTB4MDAKKyNkZWZpbmUgUE1VX1NJR05BTF9TRUxFQ1RfMQkweDA0CisKKy8qIEdsb2JhbCBDb25maWcgcmVnbWFwIHJlZ2lzdGVycyAqLworI2RlZmluZSBHTE9CQUxfQ09ORklHXzEJCTB4MDAKKyNkZWZpbmUgIFRXU0lfRU5BQkxFX09QVElPTjEJQklUKDcpCisjZGVmaW5lIEdMT0JBTF9DT05GSUdfMgkJMHgwNAorI2RlZmluZSAgVFdTSV9FTkFCTEVfT1BUSU9OMglCSVQoMjApCisjZGVmaW5lICBUV1NJX0VOQUJMRV9PUFRJT04zCUJJVCgyMSkKKyNkZWZpbmUgIFRXU0lfT1BUSU9OM19HUElPCUJJVCgyMikKKyNkZWZpbmUgU1NQX0NUUkxfU1RBVFVTXzEJMHgwOAorI2RlZmluZSAgU1NQX09OX0FVMQkJQklUKDApCisjZGVmaW5lIE1QUF9HRU5FUkFMX0NPTkZJRwkweDEwCisjZGVmaW5lICBBVTFfU1BESUZPX0dQSU9fRU4JQklUKDEpCisjZGVmaW5lICBOQU5EX0dQSU9fRU4JCUJJVCgwKQogCiAjZGVmaW5lIENPTkZJR19QTVUJQklUKDQpCiAKLXN0YXRpYyBpbnQgZG92ZV9wbXVfbXBwX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCQkgdW5zaWduZWQgbG9uZyAqY29uZmlnKQorc3RhdGljIHZvaWQgX19pb21lbSAqbXBwX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICptcHA0X2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpwbXVfYmFzZTsKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwICpnY29uZm1hcDsKKworc3RhdGljIGludCBkb3ZlX21wcF9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKLQl1bnNpZ25lZCBvZmYgPSAoY3RybC0+cGlkIC8gTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIHNoaWZ0ID0gKGN0cmwtPnBpZCAlIE1QUFNfUEVSX1JFRykgKiBNUFBfQklUUzsKLQl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGRvdmVfbXBwX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgZG92ZV9wbXVfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXVuc2lnbmVkIG9mZiA9IChwaWQgLyBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgc2hpZnQgPSAocGlkICUgTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwobXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CiAJdW5zaWduZWQgbG9uZyBmdW5jOwogCi0JaWYgKHBtdSAmICgxIDw8IGN0cmwtPnBpZCkpIHsKLQkJZnVuYyA9IHJlYWRsKERPVkVfUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7Ci0JCSpjb25maWcgPSAoZnVuYyA+PiBzaGlmdCkgJiBNUFBfTUFTSzsKLQkJKmNvbmZpZyB8PSBDT05GSUdfUE1VOwotCX0gZWxzZSB7Ci0JCWZ1bmMgPSByZWFkbChET1ZFX01QUF9WSVJUX0JBU0UgKyBvZmYpOwotCQkqY29uZmlnID0gKGZ1bmMgPj4gc2hpZnQpICYgTVBQX01BU0s7Ci0JfQorCWlmICgocG11ICYgQklUKHBpZCkpID09IDApCisJCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworCisJZnVuYyA9IHJlYWRsKHBtdV9iYXNlICsgUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7CisJKmNvbmZpZyA9IChmdW5jID4+IHNoaWZ0KSAmIE1WRUJVX01QUF9NQVNLOworCSpjb25maWcgfD0gQ09ORklHX1BNVTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfcG11X21wcF9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJIHVuc2lnbmVkIGxvbmcgY29uZmlnKQorc3RhdGljIGludCBkb3ZlX3BtdV9tcHBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBvZmYgPSAoY3RybC0+cGlkIC8gTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIHNoaWZ0ID0gKGN0cmwtPnBpZCAlIE1QUFNfUEVSX1JFRykgKiBNUFBfQklUUzsKLQl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCXVuc2lnbmVkIG9mZiA9IChwaWQgLyBNVkVCVV9NUFBTX1BFUl9SRUcpICogTVZFQlVfTVBQX0JJVFM7CisJdW5zaWduZWQgc2hpZnQgPSAocGlkICUgTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwobXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CiAJdW5zaWduZWQgbG9uZyBmdW5jOwogCi0JaWYgKGNvbmZpZyAmIENPTkZJR19QTVUpIHsKLQkJd3JpdGVsKHBtdSB8ICgxIDw8IGN0cmwtPnBpZCksIERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOwotCQlmdW5jID0gcmVhZGwoRE9WRV9QTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKLQkJZnVuYyAmPSB+KE1QUF9NQVNLIDw8IHNoaWZ0KTsKLQkJZnVuYyB8PSAoY29uZmlnICYgTVBQX01BU0spIDw8IHNoaWZ0OwotCQl3cml0ZWwoZnVuYywgRE9WRV9QTVVfU0lHTkFMX1NFTEVDVF8wICsgb2ZmKTsKLQl9IGVsc2UgewotCQl3cml0ZWwocG11ICYgfigxIDw8IGN0cmwtPnBpZCksIERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOwotCQlmdW5jID0gcmVhZGwoRE9WRV9NUFBfVklSVF9CQVNFICsgb2ZmKTsKLQkJZnVuYyAmPSB+KE1QUF9NQVNLIDw8IHNoaWZ0KTsKLQkJZnVuYyB8PSAoY29uZmlnICYgTVBQX01BU0spIDw8IHNoaWZ0OwotCQl3cml0ZWwoZnVuYywgRE9WRV9NUFBfVklSVF9CQVNFICsgb2ZmKTsKKwlpZiAoKGNvbmZpZyAmIENPTkZJR19QTVUpID09IDApIHsKKwkJd3JpdGVsKHBtdSAmIH5CSVQocGlkKSwgbXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisJCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOwogCX0KKworCXdyaXRlbChwbXUgfCBCSVQocGlkKSwgbXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisJZnVuYyA9IHJlYWRsKHBtdV9iYXNlICsgUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7CisJZnVuYyAmPSB+KE1WRUJVX01QUF9NQVNLIDw8IHNoaWZ0KTsKKwlmdW5jIHw9IChjb25maWcgJiBNVkVCVV9NUFBfTUFTSykgPDwgc2hpZnQ7CisJd3JpdGVsKGZ1bmMsIHBtdV9iYXNlICsgUE1VX1NJR05BTF9TRUxFQ1RfMCArIG9mZik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX21wcDRfY3RybF9nZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqY29uZmlnKQorc3RhdGljIGludCBkb3ZlX21wcDRfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCiB7Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKKwl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChtcHA0X2Jhc2UpOwogCXVuc2lnbmVkIGxvbmcgbWFzazsKIAotCXN3aXRjaCAoY3RybC0+cGlkKSB7CisJc3dpdGNoIChwaWQpIHsKIAljYXNlIDI0OiAvKiBtcHBfY2FtZXJhICovCi0JCW1hc2sgPSBET1ZFX0NBTV9HUElPX1NFTDsKKwkJbWFzayA9IENBTV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0MDogLyogbXBwX3NkaW8wICovCi0JCW1hc2sgPSBET1ZFX1NEMF9HUElPX1NFTDsKKwkJbWFzayA9IFNEMF9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0NjogLyogbXBwX3NkaW8xICovCi0JCW1hc2sgPSBET1ZFX1NEMV9HUElPX1NFTDsKKwkJbWFzayA9IFNEMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA1ODogLyogbXBwX3NwaTAgKi8KLQkJbWFzayA9IERPVkVfU1BJX0dQSU9fU0VMOworCQltYXNrID0gU1BJX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDYyOiAvKiBtcHBfdWFydDEgKi8KLQkJbWFzayA9IERPVkVfVUFSVDFfR1BJT19TRUw7CisJCW1hc2sgPSBVQVJUMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjksMjcgKzE0NCwyNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfbXBwNF9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3N0YXRpYyBpbnQgZG92ZV9tcHA0X2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCiB7Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKKwl1bnNpZ25lZCBsb25nIG1wcDQgPSByZWFkbChtcHA0X2Jhc2UpOwogCXVuc2lnbmVkIGxvbmcgbWFzazsKIAotCXN3aXRjaCAoY3RybC0+cGlkKSB7CisJc3dpdGNoIChwaWQpIHsKIAljYXNlIDI0OiAvKiBtcHBfY2FtZXJhICovCi0JCW1hc2sgPSBET1ZFX0NBTV9HUElPX1NFTDsKKwkJbWFzayA9IENBTV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0MDogLyogbXBwX3NkaW8wICovCi0JCW1hc2sgPSBET1ZFX1NEMF9HUElPX1NFTDsKKwkJbWFzayA9IFNEMF9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA0NjogLyogbXBwX3NkaW8xICovCi0JCW1hc2sgPSBET1ZFX1NEMV9HUElPX1NFTDsKKwkJbWFzayA9IFNEMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJY2FzZSA1ODogLyogbXBwX3NwaTAgKi8KLQkJbWFzayA9IERPVkVfU1BJX0dQSU9fU0VMOworCQltYXNrID0gU1BJX0dQSU9fU0VMOwogCQlicmVhazsKIAljYXNlIDYyOiAvKiBtcHBfdWFydDEgKi8KLQkJbWFzayA9IERPVkVfVUFSVDFfR1BJT19TRUw7CisJCW1hc2sgPSBVQVJUMV9HUElPX1NFTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTksNzQgKzE3Myw2OSBAQAogCWlmIChjb25maWcpCiAJCW1wcDQgfD0gbWFzazsKIAotCXdyaXRlbChtcHA0LCBET1ZFX01QUF9DVFJMNF9WSVJUX0JBU0UpOworCXdyaXRlbChtcHA0LCBtcHA0X2Jhc2UpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG92ZV9uYW5kX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3N0YXRpYyBpbnQgZG92ZV9uYW5kX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQogewotCXVuc2lnbmVkIGxvbmcgZ21wcCA9IHJlYWRsKERPVkVfTVBQX0dFTkVSQUxfVklSVF9CQVNFKTsKKwl1bnNpZ25lZCBpbnQgZ21wcDsKIAotCSpjb25maWcgPSAoKGdtcHAgJiBET1ZFX05BTkRfR1BJT19FTikgIT0gMCk7CisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIE1QUF9HRU5FUkFMX0NPTkZJRywgJmdtcHApOworCSpjb25maWcgPSAoKGdtcHAgJiBOQU5EX0dQSU9fRU4pICE9IDApOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG92ZV9uYW5kX2N0cmxfc2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29uZmlnKQorc3RhdGljIGludCBkb3ZlX25hbmRfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIGdtcHAgPSByZWFkbChET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRSk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdjb25mbWFwLCBNUFBfR0VORVJBTF9DT05GSUcsCisJCQkgICBOQU5EX0dQSU9fRU4sCisJCQkgICAoY29uZmlnKSA/IE5BTkRfR1BJT19FTiA6IDApOworCXJldHVybiAwOworfQogCi0JZ21wcCAmPSB+RE9WRV9OQU5EX0dQSU9fRU47CitzdGF0aWMgaW50IGRvdmVfYXVkaW8wX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwobXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CisKKwkqY29uZmlnID0gKChwbXUgJiBBVTBfQUM5N19TRUwpICE9IDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG92ZV9hdWRpbzBfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKG1wcF9iYXNlICsgUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCisJcG11ICY9IH5BVTBfQUM5N19TRUw7CiAJaWYgKGNvbmZpZykKLQkJZ21wcCB8PSBET1ZFX05BTkRfR1BJT19FTjsKLQotCXdyaXRlbChnbXBwLCBET1ZFX01QUF9HRU5FUkFMX1ZJUlRfQkFTRSk7CisJCXBtdSB8PSBBVTBfQUM5N19TRUw7CisJd3JpdGVsKHBtdSwgbXBwX2Jhc2UgKyBQTVVfTVBQX0dFTkVSQUxfQ1RSTCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX2F1ZGlvMF9jdHJsX2dldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJdW5zaWduZWQgbG9uZyAqY29uZmlnKQorc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIHBtdSA9IHJlYWRsKERPVkVfUE1VX01QUF9HRU5FUkFMX0NUUkwpOworCXVuc2lnbmVkIGludCBtcHA0ID0gcmVhZGwobXBwNF9iYXNlKTsKKwl1bnNpZ25lZCBpbnQgc3NwYzE7CisJdW5zaWduZWQgaW50IGdtcHA7CisJdW5zaWduZWQgaW50IGdjZmcyOwogCi0JKmNvbmZpZyA9ICgocG11ICYgRE9WRV9BVTBfQUM5N19TRUwpICE9IDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZG92ZV9hdWRpbzBfY3RybF9zZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJCXVuc2lnbmVkIGxvbmcgY29uZmlnKQotewotCXVuc2lnbmVkIGxvbmcgcG11ID0gcmVhZGwoRE9WRV9QTVVfTVBQX0dFTkVSQUxfQ1RSTCk7Ci0KLQlwbXUgJj0gfkRPVkVfQVUwX0FDOTdfU0VMOwotCWlmIChjb25maWcpCi0JCXBtdSB8PSBET1ZFX0FVMF9BQzk3X1NFTDsKLQl3cml0ZWwocG11LCBET1ZFX1BNVV9NUFBfR0VORVJBTF9DVFJMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfZ2V0KHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwKLQkJCQl1bnNpZ25lZCBsb25nICpjb25maWcpCi17Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKLQl1bnNpZ25lZCBsb25nIHNzcGMxID0gcmVhZGwoRE9WRV9TU1BfQ1RSTF9TVEFUVVNfMSk7Ci0JdW5zaWduZWQgbG9uZyBnbXBwID0gcmVhZGwoRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIFNTUF9DVFJMX1NUQVRVU18xLCAmc3NwYzEpOworCXJlZ21hcF9yZWFkKGdjb25mbWFwLCBNUFBfR0VORVJBTF9DT05GSUcsICZnbXBwKTsKKwlyZWdtYXBfcmVhZChnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18yLCAmZ2NmZzIpOwogCiAJKmNvbmZpZyA9IDA7Ci0JaWYgKG1wcDQgJiBET1ZFX0FVMV9HUElPX1NFTCkKKwlpZiAobXBwNCAmIEFVMV9HUElPX1NFTCkKIAkJKmNvbmZpZyB8PSBCSVQoMyk7Ci0JaWYgKHNzcGMxICYgRE9WRV9TU1BfT05fQVUxKQorCWlmIChzc3BjMSAmIFNTUF9PTl9BVTEpCiAJCSpjb25maWcgfD0gQklUKDIpOwotCWlmIChnbXBwICYgRE9WRV9BVTFfU1BESUZPX0dQSU9fRU4pCisJaWYgKGdtcHAgJiBBVTFfU1BESUZPX0dQSU9fRU4pCiAJCSpjb25maWcgfD0gQklUKDEpOwotCWlmIChnY2ZnMiAmIERPVkVfVFdTSV9PUFRJT04zX0dQSU8pCisJaWYgKGdjZmcyICYgVFdTSV9PUFRJT04zX0dQSU8pCiAJCSpjb25maWcgfD0gQklUKDApOwogCiAJLyogU1NQL1RXU0kgb25seSBpZiBJMlMxIG5vdCBzZXQqLwpAQCAtMjM4LDM1ICsyNDcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX3NldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkJdW5zaWduZWQgbG9uZyBjb25maWcpCitzdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCiB7Ci0JdW5zaWduZWQgbG9uZyBtcHA0ID0gcmVhZGwoRE9WRV9NUFBfQ1RSTDRfVklSVF9CQVNFKTsKLQl1bnNpZ25lZCBsb25nIHNzcGMxID0gcmVhZGwoRE9WRV9TU1BfQ1RSTF9TVEFUVVNfMSk7Ci0JdW5zaWduZWQgbG9uZyBnbXBwID0gcmVhZGwoRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJdW5zaWduZWQgaW50IG1wcDQgPSByZWFkbChtcHA0X2Jhc2UpOwogCi0JLyoKLQkgKiBjbGVhciBhbGwgYXVkaW8xIHJlbGF0ZWQgYml0cyBiZWZvcmUgY29uZmlndXJlCi0JICovCi0JZ2NmZzIgJj0gfkRPVkVfVFdTSV9PUFRJT04zX0dQSU87Ci0JZ21wcCAmPSB+RE9WRV9BVTFfU1BESUZPX0dQSU9fRU47Ci0Jc3NwYzEgJj0gfkRPVkVfU1NQX09OX0FVMTsKLQltcHA0ICY9IH5ET1ZFX0FVMV9HUElPX1NFTDsKLQotCWlmIChjb25maWcgJiBCSVQoMCkpCi0JCWdjZmcyIHw9IERPVkVfVFdTSV9PUFRJT04zX0dQSU87Ci0JaWYgKGNvbmZpZyAmIEJJVCgxKSkKLQkJZ21wcCB8PSBET1ZFX0FVMV9TUERJRk9fR1BJT19FTjsKLQlpZiAoY29uZmlnICYgQklUKDIpKQotCQlzc3BjMSB8PSBET1ZFX1NTUF9PTl9BVTE7CisJbXBwNCAmPSB+QVUxX0dQSU9fU0VMOwogCWlmIChjb25maWcgJiBCSVQoMykpCi0JCW1wcDQgfD0gRE9WRV9BVTFfR1BJT19TRUw7CisJCW1wcDQgfD0gQVUxX0dQSU9fU0VMOworCXdyaXRlbChtcHA0LCBtcHA0X2Jhc2UpOwogCi0Jd3JpdGVsKG1wcDQsIERPVkVfTVBQX0NUUkw0X1ZJUlRfQkFTRSk7Ci0Jd3JpdGVsKHNzcGMxLCBET1ZFX1NTUF9DVFJMX1NUQVRVU18xKTsKLQl3cml0ZWwoZ21wcCwgRE9WRV9NUFBfR0VORVJBTF9WSVJUX0JBU0UpOwotCXdyaXRlbChnY2ZnMiwgRE9WRV9HTE9CQUxfQ09ORklHXzIpOworCXJlZ21hcF91cGRhdGVfYml0cyhnY29uZm1hcCwgU1NQX0NUUkxfU1RBVFVTXzEsCisJCQkgICBTU1BfT05fQVUxLAorCQkJICAgKGNvbmZpZyAmIEJJVCgyKSkgPyBTU1BfT05fQVUxIDogMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGdjb25mbWFwLCBNUFBfR0VORVJBTF9DT05GSUcsCisJCQkgICBBVTFfU1BESUZPX0dQSU9fRU4sCisJCQkgICAoY29uZmlnICYgQklUKDEpKSA/IEFVMV9TUERJRk9fR1BJT19FTiA6IDApOworCXJlZ21hcF91cGRhdGVfYml0cyhnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18yLAorCQkJICAgVFdTSV9PUFRJT04zX0dQSU8sCisJCQkgICAoY29uZmlnICYgQklUKDApKSA/IFRXU0lfT1BUSU9OM19HUElPIDogMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3NiwxMSArMjc0LDExIEBACiAgKiBicmVhayBvdGhlciBmdW5jdGlvbnMuIElmIHlvdSByZXF1aXJlIGFsbCBtcHBzIGFzIGdwaW8KICAqIGVuZm9yY2UgZ3BpbyBzZXR0aW5nIGJ5IHBpbmN0cmwgbWFwcGluZy4KICAqLwotc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX2dwaW9fcmVxKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdTggcGlkKQorc3RhdGljIGludCBkb3ZlX2F1ZGlvMV9jdHJsX2dwaW9fcmVxKHVuc2lnbmVkIHBpZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvbmZpZzsKIAotCWRvdmVfYXVkaW8xX2N0cmxfZ2V0KGN0cmwsICZjb25maWcpOworCWRvdmVfYXVkaW8xX2N0cmxfZ2V0KHBpZCwgJmNvbmZpZyk7CiAKIAlzd2l0Y2ggKGNvbmZpZykgewogCWNhc2UgMHgwMjogLyogaTJzMSA6IGdwaW9bNTY6NTddICovCkBAIC0zMDMsNzYgKzMwMSw2MiBAQAogfQogCiAvKiBtcHBbNTI6NTddIGhhcyBncGlvIHBpbnMgY2FwYWJsZSBvZiBpbiBhbmQgb3V0ICovCi1zdGF0aWMgaW50IGRvdmVfYXVkaW8xX2N0cmxfZ3Bpb19kaXIoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLCB1OCBwaWQsCi0JCQkJYm9vbCBpbnB1dCkKK3N0YXRpYyBpbnQgZG92ZV9hdWRpbzFfY3RybF9ncGlvX2Rpcih1bnNpZ25lZCBwaWQsIGJvb2wgaW5wdXQpCiB7CiAJaWYgKHBpZCA8IDUyIHx8IHBpZCA+IDU3KQogCQlyZXR1cm4gLUVOT1RTVVBQOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRvdmVfdHdzaV9jdHJsX2dldChzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICpjb25maWcpCitzdGF0aWMgaW50IGRvdmVfdHdzaV9jdHJsX2dldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIGdjZmcxID0gcmVhZGwoRE9WRV9HTE9CQUxfQ09ORklHXzEpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7CisJdW5zaWduZWQgaW50IGdjZmcxOworCXVuc2lnbmVkIGludCBnY2ZnMjsKKworCXJlZ21hcF9yZWFkKGdjb25mbWFwLCBHTE9CQUxfQ09ORklHXzEsICZnY2ZnMSk7CisJcmVnbWFwX3JlYWQoZ2NvbmZtYXAsIEdMT0JBTF9DT05GSUdfMiwgJmdjZmcyKTsKIAogCSpjb25maWcgPSAwOwotCWlmIChnY2ZnMSAmIERPVkVfVFdTSV9FTkFCTEVfT1BUSU9OMSkKKwlpZiAoZ2NmZzEgJiBUV1NJX0VOQUJMRV9PUFRJT04xKQogCQkqY29uZmlnID0gMTsKLQllbHNlIGlmIChnY2ZnMiAmIERPVkVfVFdTSV9FTkFCTEVfT1BUSU9OMikKKwllbHNlIGlmIChnY2ZnMiAmIFRXU0lfRU5BQkxFX09QVElPTjIpCiAJCSpjb25maWcgPSAyOwotCWVsc2UgaWYgKGdjZmcyICYgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zKQorCWVsc2UgaWYgKGdjZmcyICYgVFdTSV9FTkFCTEVfT1BUSU9OMykKIAkJKmNvbmZpZyA9IDM7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb3ZlX3R3c2lfY3RybF9zZXQoc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsLAotCQkJCXVuc2lnbmVkIGxvbmcgY29uZmlnKQorc3RhdGljIGludCBkb3ZlX3R3c2lfY3RybF9zZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKIHsKLQl1bnNpZ25lZCBsb25nIGdjZmcxID0gcmVhZGwoRE9WRV9HTE9CQUxfQ09ORklHXzEpOwotCXVuc2lnbmVkIGxvbmcgZ2NmZzIgPSByZWFkbChET1ZFX0dMT0JBTF9DT05GSUdfMik7Ci0KLQlnY2ZnMSAmPSB+RE9WRV9UV1NJX0VOQUJMRV9PUFRJT04xOwotCWdjZmcyICY9IH4oRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04yIHwgRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zKTsKKwl1bnNpZ25lZCBpbnQgZ2NmZzEgPSAwOworCXVuc2lnbmVkIGludCBnY2ZnMiA9IDA7CiAKIAlzd2l0Y2ggKGNvbmZpZykgewogCWNhc2UgMToKLQkJZ2NmZzEgfD0gRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04xOworCQlnY2ZnMSA9IFRXU0lfRU5BQkxFX09QVElPTjE7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJZ2NmZzIgfD0gRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04yOworCQlnY2ZnMiA9IFRXU0lfRU5BQkxFX09QVElPTjI7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQkJZ2NmZzIgfD0gRE9WRV9UV1NJX0VOQUJMRV9PUFRJT04zOworCQlnY2ZnMiA9IFRXU0lfRU5BQkxFX09QVElPTjM7CiAJCWJyZWFrOwogCX0KIAotCXdyaXRlbChnY2ZnMSwgRE9WRV9HTE9CQUxfQ09ORklHXzEpOwotCXdyaXRlbChnY2ZnMiwgRE9WRV9HTE9CQUxfQ09ORklHXzIpOworCXJlZ21hcF91cGRhdGVfYml0cyhnY29uZm1hcCwgR0xPQkFMX0NPTkZJR18xLAorCQkJICAgVFdTSV9FTkFCTEVfT1BUSU9OMSwKKwkJCSAgIGdjZmcxKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZ2NvbmZtYXAsIEdMT0JBTF9DT05GSUdfMiwKKwkJCSAgIFRXU0lfRU5BQkxFX09QVElPTjIgfCBUV1NJX0VOQUJMRV9PUFRJT04zLAorCQkJICAgZ2NmZzIpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgZG92ZV9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfRlVOQ19DVFJMKDAsIDAsICJtcHAwIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMSwgMSwgIm1wcDEiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgyLCAyLCAibXBwMiIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDMsIDMsICJtcHAzIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoNCwgNCwgIm1wcDQiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCg1LCA1LCAibXBwNSIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDYsIDYsICJtcHA2IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoNywgNywgIm1wcDciLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCg4LCA4LCAibXBwOCIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDksIDksICJtcHA5IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMTAsIDEwLCAibXBwMTAiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgxMSwgMTEsICJtcHAxMSIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDEyLCAxMiwgIm1wcDEyIiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9GVU5DX0NUUkwoMTMsIDEzLCAibXBwMTMiLCBkb3ZlX3BtdV9tcHBfY3RybCksCi0JTVBQX0ZVTkNfQ1RSTCgxNCwgMTQsICJtcHAxNCIsIGRvdmVfcG11X21wcF9jdHJsKSwKLQlNUFBfRlVOQ19DVFJMKDE1LCAxNSwgIm1wcDE1IiwgZG92ZV9wbXVfbXBwX2N0cmwpLAotCU1QUF9SRUdfQ1RSTCgxNiwgMjMpLAorCU1QUF9GVU5DX0NUUkwoMCwgMTUsIE5VTEwsIGRvdmVfcG11X21wcF9jdHJsKSwKKwlNUFBfRlVOQ19DVFJMKDE2LCAyMywgTlVMTCwgZG92ZV9tcHBfY3RybCksCiAJTVBQX0ZVTkNfQ1RSTCgyNCwgMzksICJtcHBfY2FtZXJhIiwgZG92ZV9tcHA0X2N0cmwpLAogCU1QUF9GVU5DX0NUUkwoNDAsIDQ1LCAibXBwX3NkaW8wIiwgZG92ZV9tcHA0X2N0cmwpLAogCU1QUF9GVU5DX0NUUkwoNDYsIDUxLCAibXBwX3NkaW8xIiwgZG92ZV9tcHA0X2N0cmwpLApAQCAtNzcyLDggKzc1NiwxNyBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGdjX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnZhbF9iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS5tYXhfcmVnaXN0ZXIgPSA1LAorfTsKKwogc3RhdGljIGludCBkb3ZlX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKm1wcF9yZXM7CisJc3RydWN0IHJlc291cmNlIGZiX3JlczsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CiAJCW9mX21hdGNoX2RldmljZShkb3ZlX3BpbmN0cmxfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKiltYXRjaC0+ZGF0YTsKQEAgLTc4OSw2ICs3ODIsNTkgQEAKIAl9CiAJY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7CiAKKwltcHBfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtcHBfcmVzKTsKKwlpZiAoSVNfRVJSKG1wcF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXBwX2Jhc2UpOworCisJLyogcHJlcGFyZSBmYWxsYmFjayByZXNvdXJjZSAqLworCW1lbWNweSgmZmJfcmVzLCBtcHBfcmVzLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJZmJfcmVzLnN0YXJ0ID0gMDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhbGxpbmcgYmFjayB0byBoYXJkY29kZWQgTVBQNCByZXNvdXJjZVxuIik7CisJCWFkanVzdF9yZXNvdXJjZSgmZmJfcmVzLAorCQkJKG1wcF9yZXMtPnN0YXJ0ICYgSU5UX1JFR1NfTUFTSykgKyBNUFA0X1JFR1NfT0ZGUywgMHg0KTsKKwkJcmVzID0gJmZiX3JlczsKKwl9CisKKwltcHA0X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1wcDRfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcDRfYmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDIpOworCWlmICghcmVzKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmYWxsaW5nIGJhY2sgdG8gaGFyZGNvZGVkIFBNVSByZXNvdXJjZVxuIik7CisJCWFkanVzdF9yZXNvdXJjZSgmZmJfcmVzLAorCQkJKG1wcF9yZXMtPnN0YXJ0ICYgSU5UX1JFR1NfTUFTSykgKyBQTVVfUkVHU19PRkZTLCAweDgpOworCQlyZXMgPSAmZmJfcmVzOworCX0KKworCXBtdV9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwbXVfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBtdV9iYXNlKTsKKworCWdjb25mbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgibWFydmVsbCxkb3ZlLWdsb2JhbC1jb25maWciKTsKKwlpZiAoSVNfRVJSKGdjb25mbWFwKSkgeworCQl2b2lkIF9faW9tZW0gKmdjX2Jhc2U7CisKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhbGxpbmcgYmFjayB0byBoYXJkY29kZWQgZ2xvYmFsIHJlZ2lzdGVyc1xuIik7CisJCWFkanVzdF9yZXNvdXJjZSgmZmJfcmVzLAorCQkJKG1wcF9yZXMtPnN0YXJ0ICYgSU5UX1JFR1NfTUFTSykgKyBHQ19SRUdTX09GRlMsIDB4MTQpOworCQlnY19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsICZmYl9yZXMpOworCQlpZiAoSVNfRVJSKGdjX2Jhc2UpKQorCQkJcmV0dXJuIFBUUl9FUlIoZ2NfYmFzZSk7CisJCWdjb25mbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvKCZwZGV2LT5kZXYsCisJCQkJCQkgZ2NfYmFzZSwgJmdjX3JlZ21hcF9jb25maWcpOworCQlpZiAoSVNfRVJSKGdjb25mbWFwKSkKKwkJCXJldHVybiBQVFJfRVJSKGdjb25mbWFwKTsKKwl9CisKKwkvKiBXYXJuIG9uIGFueSBtaXNzaW5nIERUIHJlc291cmNlICovCisJaWYgKGZiX3Jlcy5zdGFydCkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgRldfQlVHICJNaXNzaW5nIHBpbmN0cmwgcmVncyBpbiBEVEIuIFBsZWFzZSB1cGRhdGUgeW91ciBmaXJtd2FyZS5cbiIpOworCiAJcmV0dXJuIG12ZWJ1X3BpbmN0cmxfcHJvYmUocGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWtpcmt3b29kLmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1raXJrd29vZC5jCmluZGV4IDZiNTA0YjUuLjBkMDIxMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWtpcmt3b29kLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwta2lya3dvb2QuYwpAQCAtMjEsNiArMjEsMTggQEAKIAogI2luY2x1ZGUgInBpbmN0cmwtbXZlYnUuaCIKIAorc3RhdGljIHZvaWQgX19pb21lbSAqbXBwX2Jhc2U7CisKK3N0YXRpYyBpbnQga2lya3dvb2RfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGtpcmt3b29kX21wcF9jdHJsX3NldCh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX3NldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCiAjZGVmaW5lIFYoZjYxODAsIGY2MTkwLCBmNjE5MiwgZjYyODEsIGY2MjgyLCBkeDQxMjIpCVwKIAkoKGY2MTgwIDw8IDApIHwgKGY2MTkwIDw8IDEpIHwgKGY2MTkyIDw8IDIpIHwJXAogCSAoZjYyODEgPDwgMykgfCAoZjYyODIgPDwgNCkgfCAoZHg0MTIyIDw8IDUpKQpAQCAtMzU5LDcgKzM3MSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12ODhmNjE4MF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgMjkpLAorCU1QUF9GVU5DX0NUUkwoMCwgMjksIE5VTEwsIGtpcmt3b29kX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjE4MF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzY3LDcgKzM3OSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12ODhmNjE5eF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgMzUpLAorCU1QUF9GVU5DX0NUUkwoMCwgMzUsIE5VTEwsIGtpcmt3b29kX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjE5eF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtMzc2LDcgKzM4OCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIG12ODhmNjI4eF9tcHBfY29udHJvbHNbXSA9IHsKLQlNUFBfUkVHX0NUUkwoMCwgNDkpLAorCU1QUF9GVU5DX0NUUkwoMCwgNDksIE5VTEwsIGtpcmt3b29kX21wcF9jdHJsKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlIG12ODhmNjI4eF9ncGlvX3Jhbmdlc1tdID0gewpAQCAtNDU2LDkgKzQ2OCwxNiBAQAogCiBzdGF0aWMgaW50IGtpcmt3b29kX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CiAJCW9mX21hdGNoX2RldmljZShraXJrd29vZF9waW5jdHJsX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKIAlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopbWF0Y2gtPmRhdGE7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1wcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihtcHBfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKG1wcF9iYXNlKTsKKwogCXJldHVybiBtdmVidV9waW5jdHJsX3Byb2JlKHBkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5jIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtbXZlYnUuYwppbmRleCAwZmQxYWQzLi45OTA4Mzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmMKQEAgLTUwLDcgKzUwLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2OwogCXN0cnVjdCBwaW5jdHJsX2Rlc2MgZGVzYzsKLQl2b2lkIF9faW9tZW0gKmJhc2U7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfZ3JvdXAgKmdyb3VwczsKIAl1bnNpZ25lZCBudW1fZ3JvdXBzOwogCXN0cnVjdCBtdmVidV9waW5jdHJsX2Z1bmN0aW9uICpmdW5jdGlvbnM7CkBAIC0xMzgsNDMgKzEzNyw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBDb21tb24gbXBwIHBpbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBvbiBNVkVCVSBhcmUKLSAqIHJlZ2lzdGVycyBvZiBlaWdodCA0LWJpdCB2YWx1ZXMgZm9yIGVhY2ggbXBwIHNldHRpbmcuCi0gKiBSZWdpc3RlciBvZmZzZXQgYW5kIGJpdCBtYXNrIGFyZSBjYWxjdWxhdGVkIGFjY29yZGluZ2x5IGJlbG93LgotICovCi1zdGF0aWMgaW50IG12ZWJ1X2NvbW1vbl9tcHBfZ2V0KHN0cnVjdCBtdmVidV9waW5jdHJsICpwY3RsLAotCQkJCXN0cnVjdCBtdmVidV9waW5jdHJsX2dyb3VwICpncnAsCi0JCQkJdW5zaWduZWQgbG9uZyAqY29uZmlnKQotewotCXVuc2lnbmVkIHBpbiA9IGdycC0+Z2lkOwotCXVuc2lnbmVkIG9mZiA9IChwaW4gLyBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0JdW5zaWduZWQgc2hpZnQgPSAocGluICUgTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCi0JKmNvbmZpZyA9IHJlYWRsKHBjdGwtPmJhc2UgKyBvZmYpOwotCSpjb25maWcgPj49IHNoaWZ0OwotCSpjb25maWcgJj0gTVBQX01BU0s7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtdmVidV9jb21tb25fbXBwX3NldChzdHJ1Y3QgbXZlYnVfcGluY3RybCAqcGN0bCwKLQkJCQlzdHJ1Y3QgbXZlYnVfcGluY3RybF9ncm91cCAqZ3JwLAotCQkJCXVuc2lnbmVkIGxvbmcgY29uZmlnKQotewotCXVuc2lnbmVkIHBpbiA9IGdycC0+Z2lkOwotCXVuc2lnbmVkIG9mZiA9IChwaW4gLyBNUFBTX1BFUl9SRUcpICogTVBQX0JJVFM7Ci0JdW5zaWduZWQgc2hpZnQgPSAocGluICUgTVBQU19QRVJfUkVHKSAqIE1QUF9CSVRTOwotCXVuc2lnbmVkIGxvbmcgcmVnOwotCi0JcmVnID0gcmVhZGwocGN0bC0+YmFzZSArIG9mZik7Ci0JcmVnICY9IH4oTVBQX01BU0sgPDwgc2hpZnQpOwotCXJlZyB8PSAoY29uZmlnIDw8IHNoaWZ0KTsKLQl3cml0ZWwocmVnLCBwY3RsLT5iYXNlICsgb2ZmKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG12ZWJ1X3BpbmNvbmZfZ3JvdXBfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKIAkJCQl1bnNpZ25lZCBnaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKIHsKQEAgLTE4NCwxMCArMTQ2LDcgQEAKIAlpZiAoIWdycC0+Y3RybCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZ3JwLT5jdHJsLT5tcHBfZ2V0KQotCQlyZXR1cm4gZ3JwLT5jdHJsLT5tcHBfZ2V0KGdycC0+Y3RybCwgY29uZmlnKTsKLQotCXJldHVybiBtdmVidV9jb21tb25fbXBwX2dldChwY3RsLCBncnAsIGNvbmZpZyk7CisJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dldChncnAtPnBpbnNbMF0sIGNvbmZpZyk7CiB9CiAKIHN0YXRpYyBpbnQgbXZlYnVfcGluY29uZl9ncm91cF9zZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LApAQCAtMjAyLDExICsxNjEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgaSsrKSB7Ci0JCWlmIChncnAtPmN0cmwtPm1wcF9zZXQpCi0JCQlyZXQgPSBncnAtPmN0cmwtPm1wcF9zZXQoZ3JwLT5jdHJsLCBjb25maWdzW2ldKTsKLQkJZWxzZQotCQkJcmV0ID0gbXZlYnVfY29tbW9uX21wcF9zZXQocGN0bCwgZ3JwLCBjb25maWdzW2ldKTsKLQorCQlyZXQgPSBncnAtPmN0cmwtPm1wcF9zZXQoZ3JwLT5waW5zWzBdLCBjb25maWdzW2ldKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfSAvKiBmb3IgZWFjaCBjb25maWcgKi8KQEAgLTM0Nyw3ICszMDIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChncnAtPmN0cmwtPm1wcF9ncGlvX3JlcSkKLQkJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dwaW9fcmVxKGdycC0+Y3RybCwgb2Zmc2V0KTsKKwkJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dwaW9fcmVxKG9mZnNldCk7CiAKIAlzZXR0aW5nID0gbXZlYnVfcGluY3RybF9maW5kX2dwaW9fc2V0dGluZyhwY3RsLCBncnApOwogCWlmICghc2V0dGluZykKQEAgLTM3MCw3ICszMjUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChncnAtPmN0cmwtPm1wcF9ncGlvX2RpcikKLQkJcmV0dXJuIGdycC0+Y3RybC0+bXBwX2dwaW9fZGlyKGdycC0+Y3RybCwgb2Zmc2V0LCBpbnB1dCk7CisJCXJldHVybiBncnAtPmN0cmwtPm1wcF9ncGlvX2RpcihvZmZzZXQsIGlucHV0KTsKIAogCXNldHRpbmcgPSBtdmVidV9waW5jdHJsX2ZpbmRfZ3Bpb19zZXR0aW5nKHBjdGwsIGdycCk7CiAJaWYgKCFzZXR0aW5nKQpAQCAtNTkzLDExICs1NDgsMTIgQEAKIGludCBtdmVidV9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmwgKnBjdGw7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwogCXN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjICpwZGVzYzsKIAl1bnNpZ25lZCBnaWQsIG4sIGs7CisJdW5zaWduZWQgc2l6ZSwgbm9uYW1lID0gMDsKKwljaGFyICpub25hbWVfYnVmOworCXZvaWQgKnA7CiAJaW50IHJldDsKIAogCWlmICghc29jIHx8ICFzb2MtPmNvbnRyb2xzIHx8ICFzb2MtPm1vZGVzKSB7CkBAIC02MDUsMTEgKzU2MSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19FUlIoYmFzZSkpCi0JCXJldHVybiBQVFJfRVJSKGJhc2UpOwotCiAJcGN0bCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG12ZWJ1X3BpbmN0cmwpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwY3RsKSB7CkBAIC02MjMsNyArNTc0LDYgQEAKIAlwY3RsLT5kZXNjLnBteG9wcyA9ICZtdmVidV9waW5tdXhfb3BzOwogCXBjdGwtPmRlc2MuY29uZm9wcyA9ICZtdmVidV9waW5jb25mX29wczsKIAlwY3RsLT52YXJpYW50ID0gc29jLT52YXJpYW50OwotCXBjdGwtPmJhc2UgPSBiYXNlOwogCXBjdGwtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGN0bCk7CiAKQEAgLTYzMywzMyArNTgzLDIzIEBACiAJcGN0bC0+ZGVzYy5ucGlucyA9IDA7CiAJZm9yIChuID0gMDsgbiA8IHNvYy0+bmNvbnRyb2xzOyBuKyspIHsKIAkJc3RydWN0IG12ZWJ1X21wcF9jdHJsICpjdHJsID0gJnNvYy0+Y29udHJvbHNbbl07Ci0JCWNoYXIgKm5hbWVzOwogCiAJCXBjdGwtPmRlc2MubnBpbnMgKz0gY3RybC0+bnBpbnM7Ci0JCS8qIGluaXRpYWwgY29udHJvbCBwaW5zICovCisJCS8qIGluaXRpYWxpemUgY29udHJvbCdzIHBpbnNbXSBhcnJheSAqLwogCQlmb3IgKGsgPSAwOyBrIDwgY3RybC0+bnBpbnM7IGsrKykKIAkJCWN0cmwtPnBpbnNba10gPSBjdHJsLT5waWQgKyBrOwogCi0JCS8qIHNwZWNpYWwgc29jIHNwZWNpZmljIGNvbnRyb2wgKi8KLQkJaWYgKGN0cmwtPm1wcF9nZXQgfHwgY3RybC0+bXBwX3NldCkgewotCQkJaWYgKCFjdHJsLT5uYW1lIHx8ICFjdHJsLT5tcHBfZ2V0IHx8ICFjdHJsLT5tcHBfc2V0KSB7Ci0JCQkJZGV2X2VycigmcGRldi0+ZGV2LCAid3Jvbmcgc29jIGNvbnRyb2wgaW5mb1xuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CisJCS8qCisJCSAqIFdlIGFsbG93IHRvIHBhc3MgY29udHJvbHMgd2l0aCBOVUxMIG5hbWUgdGhhdCB3ZSB0cmVhdAorCQkgKiBhcyBhIHJhbmdlIG9mIG9uZS1waW4gZ3JvdXBzIHdpdGggZ2VuZXJpYyBtdmVidSByZWdpc3RlcgorCQkgKiBjb250cm9scy4KKwkJICovCisJCWlmICghY3RybC0+bmFtZSkgeworCQkJcGN0bC0+bnVtX2dyb3VwcyArPSBjdHJsLT5ucGluczsKKwkJCW5vbmFtZSArPSBjdHJsLT5ucGluczsKKwkJfSBlbHNlIHsKIAkJCXBjdGwtPm51bV9ncm91cHMgKz0gMTsKLQkJCWNvbnRpbnVlOwogCQl9Ci0KLQkJLyogZ2VuZXJpYyBtdmVidSByZWdpc3RlciBjb250cm9sICovCi0JCW5hbWVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGN0cmwtPm5waW5zICogOCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmFtZXMpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBtcHAgbmFtZXNcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJZm9yIChrID0gMDsgayA8IGN0cmwtPm5waW5zOyBrKyspCi0JCQlzcHJpbnRmKG5hbWVzICsgOCprLCAibXBwJWQiLCBjdHJsLT5waWQrayk7Ci0JCWN0cmwtPm5hbWUgPSBuYW1lczsKLQkJcGN0bC0+bnVtX2dyb3VwcyArPSBjdHJsLT5ucGluczsKIAl9CiAKIAlwZGVzYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBwY3RsLT5kZXNjLm5waW5zICoKQEAgLTY3MywxMiArNjEzLDE3IEBACiAJCXBkZXNjW25dLm51bWJlciA9IG47CiAJcGN0bC0+ZGVzYy5waW5zID0gcGRlc2M7CiAKLQlwY3RsLT5ncm91cHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgcGN0bC0+bnVtX2dyb3VwcyAqCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgbXZlYnVfcGluY3RybF9ncm91cCksIEdGUF9LRVJORUwpOwotCWlmICghcGN0bC0+Z3JvdXBzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBwaW5jdHJsIGdyb3Vwc1xuIik7CisJLyoKKwkgKiBhbGxvY2F0ZSBncm91cHMgYW5kIG5hbWUgYnVmZmVycyBmb3IgdW5uYW1lZCBncm91cHMuCisJICovCisJc2l6ZSA9IHBjdGwtPm51bV9ncm91cHMgKiBzaXplb2YoKnBjdGwtPmdyb3VwcykgKyBub25hbWUgKiA4OworCXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBncm91cCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCXBjdGwtPmdyb3VwcyA9IHA7CisJbm9uYW1lX2J1ZiA9IHAgKyBwY3RsLT5udW1fZ3JvdXBzICogc2l6ZW9mKCpwY3RsLT5ncm91cHMpOwogCiAJLyogYXNzaWduIG1wcCBjb250cm9scyB0byBncm91cHMgKi8KIAlnaWQgPSAwOwpAQCAtNjkwLDE3ICs2MzUsMjYgQEAKIAkJcGN0bC0+Z3JvdXBzW2dpZF0ucGlucyA9IGN0cmwtPnBpbnM7CiAJCXBjdGwtPmdyb3Vwc1tnaWRdLm5waW5zID0gY3RybC0+bnBpbnM7CiAKLQkJLyogZ2VuZXJpYyBtdmVidSByZWdpc3RlciBjb250cm9sIG1hcHMgdG8gYSBudW1iZXIgb2YgZ3JvdXBzICovCi0JCWlmICghY3RybC0+bXBwX2dldCAmJiAhY3RybC0+bXBwX3NldCkgeworCQkvKgorCQkgKiBXZSB0cmVhdCB1bm5hbWVkIGNvbnRyb2xzIGFzIGEgcmFuZ2Ugb2Ygb25lLXBpbiBncm91cHMKKwkJICogd2l0aCBnZW5lcmljIG12ZWJ1IHJlZ2lzdGVyIGNvbnRyb2xzLiBVc2Ugb25lIGdyb3VwIGZvcgorCQkgKiBlYWNoIGluIHRoaXMgcmFuZ2UgYW5kIGFzc2lnbiBhIGRlZmF1bHQgZ3JvdXAgbmFtZS4KKwkJICovCisJCWlmICghY3RybC0+bmFtZSkgeworCQkJcGN0bC0+Z3JvdXBzW2dpZF0ubmFtZSA9IG5vbmFtZV9idWY7CiAJCQlwY3RsLT5ncm91cHNbZ2lkXS5ucGlucyA9IDE7CisJCQlzcHJpbnRmKG5vbmFtZV9idWYsICJtcHAlZCIsIGN0cmwtPnBpZCswKTsKKwkJCW5vbmFtZV9idWYgKz0gODsKIAogCQkJZm9yIChrID0gMTsgayA8IGN0cmwtPm5waW5zOyBrKyspIHsKIAkJCQlnaWQrKzsKIAkJCQlwY3RsLT5ncm91cHNbZ2lkXS5naWQgPSBnaWQ7CiAJCQkJcGN0bC0+Z3JvdXBzW2dpZF0uY3RybCA9IGN0cmw7Ci0JCQkJcGN0bC0+Z3JvdXBzW2dpZF0ubmFtZSA9ICZjdHJsLT5uYW1lWzgqa107CisJCQkJcGN0bC0+Z3JvdXBzW2dpZF0ubmFtZSA9IG5vbmFtZV9idWY7CiAJCQkJcGN0bC0+Z3JvdXBzW2dpZF0ucGlucyA9ICZjdHJsLT5waW5zW2tdOwogCQkJCXBjdGwtPmdyb3Vwc1tnaWRdLm5waW5zID0gMTsKKwkJCQlzcHJpbnRmKG5vbmFtZV9idWYsICJtcHAlZCIsIGN0cmwtPnBpZCtrKTsKKwkJCQlub25hbWVfYnVmICs9IDg7CiAJCQl9CiAJCX0KIAkJZ2lkKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5oIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtbXZlYnUuaAppbmRleCA5MGJkM2JlLi42NWE5OGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1tdmVidS5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW12ZWJ1LmgKQEAgLTI4LDIwICsyOCwxOSBAQAogICogYmV0d2VlbiB0d28gb3IgbW9yZSBkaWZmZXJlbnQgc2V0dGluZ3MsIGUuZy4gYXNzaWduIG1wcCBwaW4gMTMgdG8KICAqIHVhcnQxIG9yIHNhdGEuCiAgKgotICogSWYgb3B0aW9uYWwgbXBwX2dldC9fc2V0IGZ1bmN0aW9ucyBhcmUgc2V0IHRoZXNlIGFyZSB1c2VkIHRvIGdldC9zZXQKLSAqIGEgc3BlY2lmaWMgbW9kZS4gT3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbXBwIGNvbnRyb2wgaXMgYmFzZWQKLSAqIG9uIDQtYml0IGdyb3VwcyBpbiBzdWJzZXF1ZW50IHJlZ2lzdGVycy4gVGhlIG9wdGlvbmFsIG1wcF9ncGlvX3JlcS9fZGlyCi0gKiBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gYWxsb3cgcGluIHNldHRpbmdzIHdpdGggdmFyeWluZyBncGlvIHBpbnMuCisgKiBUaGUgbXBwX2dldC9fc2V0IGZ1bmN0aW9ucyBhcmUgbWFuZGF0b3J5IGFuZCBhcmUgdXNlZCB0byBnZXQvc2V0IGEKKyAqIHNwZWNpZmljIG1vZGUuIFRoZSBvcHRpb25hbCBtcHBfZ3Bpb19yZXEvX2RpciBmdW5jdGlvbnMgY2FuIGJlIHVzZWQKKyAqIHRvIGFsbG93IHBpbiBzZXR0aW5ncyB3aXRoIHZhcnlpbmcgZ3BpbyBwaW5zLgogICovCiBzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdTggcGlkOwogCXU4IG5waW5zOwogCXVuc2lnbmVkICpwaW5zOwotCWludCAoKm1wcF9nZXQpKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKTsKLQlpbnQgKCptcHBfc2V0KShzdHJ1Y3QgbXZlYnVfbXBwX2N0cmwgKmN0cmwsIHVuc2lnbmVkIGxvbmcgY29uZmlnKTsKLQlpbnQgKCptcHBfZ3Bpb19yZXEpKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdTggcGlkKTsKLQlpbnQgKCptcHBfZ3Bpb19kaXIpKHN0cnVjdCBtdmVidV9tcHBfY3RybCAqY3RybCwgdTggcGlkLCBib29sIGlucHV0KTsKKwlpbnQgKCptcHBfZ2V0KSh1bnNpZ25lZCBwaWQsIHVuc2lnbmVkIGxvbmcgKmNvbmZpZyk7CisJaW50ICgqbXBwX3NldCkodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nIGNvbmZpZyk7CisJaW50ICgqbXBwX2dwaW9fcmVxKSh1bnNpZ25lZCBwaWQpOworCWludCAoKm1wcF9ncGlvX2RpcikodW5zaWduZWQgcGlkLCBib29sIGlucHV0KTsKIH07CiAKIC8qKgpAQCAtMTE0LDE4ICsxMTMsNiBAQAogCWludCBuZ3Bpb3JhbmdlczsKIH07CiAKLSNkZWZpbmUgTVBQX1JFR19DVFJMKF9pZGwsIF9pZGgpCQkJCVwKLQl7CQkJCQkJCVwKLQkJLm5hbWUgPSBOVUxMLAkJCQkJXAotCQkucGlkID0gX2lkbCwJCQkJCVwKLQkJLm5waW5zID0gX2lkaCAtIF9pZGwgKyAxLAkJCVwKLQkJLnBpbnMgPSAodW5zaWduZWRbX2lkaCAtIF9pZGwgKyAxXSkgeyB9LAlcCi0JCS5tcHBfZ2V0ID0gTlVMTCwJCQkJXAotCQkubXBwX3NldCA9IE5VTEwsCQkJCVwKLQkJLm1wcF9ncGlvX3JlcSA9IE5VTEwsCQkJCVwKLQkJLm1wcF9ncGlvX2RpciA9IE5VTEwsCQkJCVwKLQl9Ci0KICNkZWZpbmUgTVBQX0ZVTkNfQ1RSTChfaWRsLCBfaWRoLCBfbmFtZSwgX2Z1bmMpCQkJXAogCXsJCQkJCQkJXAogCQkubmFtZSA9IF9uYW1lLAkJCQkJXApAQCAtMTg2LDYgKzE3MywzNCBAQAogCQkubnBpbnMgPSBfbnBpbnMsCQkJCVwKIAl9CiAKKyNkZWZpbmUgTVZFQlVfTVBQU19QRVJfUkVHCTgKKyNkZWZpbmUgTVZFQlVfTVBQX0JJVFMJCTQKKyNkZWZpbmUgTVZFQlVfTVBQX01BU0sJCTB4ZgorCitzdGF0aWMgaW5saW5lIGludCBkZWZhdWx0X21wcF9jdHJsX2dldCh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCBwaWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3sKKwl1bnNpZ25lZCBvZmYgPSAocGlkIC8gTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIHNoaWZ0ID0gKHBpZCAlIE1WRUJVX01QUFNfUEVSX1JFRykgKiBNVkVCVV9NUFBfQklUUzsKKworCSpjb25maWcgPSAocmVhZGwoYmFzZSArIG9mZikgPj4gc2hpZnQpICYgTVZFQlVfTVBQX01BU0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVmYXVsdF9tcHBfY3RybF9zZXQodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgcGlkLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbmZpZykKK3sKKwl1bnNpZ25lZCBvZmYgPSAocGlkIC8gTVZFQlVfTVBQU19QRVJfUkVHKSAqIE1WRUJVX01QUF9CSVRTOworCXVuc2lnbmVkIHNoaWZ0ID0gKHBpZCAlIE1WRUJVX01QUFNfUEVSX1JFRykgKiBNVkVCVV9NUFBfQklUUzsKKwl1bnNpZ25lZCBsb25nIHJlZzsKKworCXJlZyA9IHJlYWRsKGJhc2UgKyBvZmYpICYgfihNVkVCVV9NUFBfTUFTSyA8PCBzaGlmdCk7CisJd3JpdGVsKHJlZyB8IChjb25maWcgPDwgc2hpZnQpLCBiYXNlICsgb2ZmKTsKKworCXJldHVybiAwOworfQorCiBpbnQgbXZlYnVfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIGludCBtdmVidV9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjU0eC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjU0eC5jCmluZGV4IGVhOWQ5YWIuLjAwOGEyOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY1NHguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLWJmNTR4LmMKQEAgLTMwOSwzOSArMzA5LDYgQEAKIAlHUElPX1BFNCwgR1BJT19QRTUsIEdQSU9fUEU2LCBHUElPX1BFNywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRpX3Bpbl9ncm91cCBhZGlfcGluX2dyb3Vwc1tdID0gewotCUFESV9QSU5fR1JPVVAoInVhcnQwZ3JwIiwgdWFydDBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidWFydDFncnAiLCB1YXJ0MV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MWN0c3J0c2dycCIsIHVhcnQxX2N0c3J0c19waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MmdycCIsIHVhcnQyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQzZ3JwIiwgdWFydDNfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidWFydDNjdHNydHNncnAiLCB1YXJ0M19jdHNydHNfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicnNpMGdycCIsIHJzaTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BpMGdycCIsIHNwaTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BpMWdycCIsIHNwaTFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidHdpMGdycCIsIHR3aTBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgidHdpMWdycCIsIHR3aTFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicm90YXJ5Z3JwIiwgcm90YXJ5X3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImNhbjBncnAiLCBjYW4wX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImNhbjFncnAiLCBjYW4xX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNtYzBncnAiLCBzbWMwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0MGdycCIsIHNwb3J0MF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcG9ydDFncnAiLCBzcG9ydDFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BvcnQyZ3JwIiwgc3BvcnQyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0M2dycCIsIHNwb3J0M19waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzhiZ3JwIiwgcHBpMF84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzE2YmdycCIsIHBwaTBfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfMjRiZ3JwIiwgcHBpMF8yNGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV84YmdycCIsIHBwaTFfOGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV8xNmJncnAiLCBwcGkxXzE2Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkyXzhiZ3JwIiwgcHBpMl84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJhdGFwaWdycCIsIGF0YXBpX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImF0YXBpYWx0ZXJncnAiLCBhdGFwaV9hbHRlcl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJuZmMwZ3JwIiwgbmZjMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJrZXlzXzR4NGdycCIsIGtleXNfNHg0X3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImtleXNfOHg4Z3JwIiwga2V5c184eDhfcGlucyksCi19OwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgdWFydDBfbXV4W10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwKIAkwCkBAIC01MTMsNiArNDgwLDM5IEBACiAJMAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluX2dyb3VwIGFkaV9waW5fZ3JvdXBzW10gPSB7CisJQURJX1BJTl9HUk9VUCgidWFydDBncnAiLCB1YXJ0MF9waW5zLCB1YXJ0MF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQxZ3JwIiwgdWFydDFfcGlucywgdWFydDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ1YXJ0MWN0c3J0c2dycCIsIHVhcnQxX2N0c3J0c19waW5zLCB1YXJ0MV9jdHNydHNfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ1YXJ0MmdycCIsIHVhcnQyX3BpbnMsIHVhcnQyX211eCksCisJQURJX1BJTl9HUk9VUCgidWFydDNncnAiLCB1YXJ0M19waW5zLCB1YXJ0M19tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQzY3RzcnRzZ3JwIiwgdWFydDNfY3RzcnRzX3BpbnMsIHVhcnQzX2N0c3J0c19tdXgpLAorCUFESV9QSU5fR1JPVVAoInJzaTBncnAiLCByc2kwX3BpbnMsIHJzaTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcGkwZ3JwIiwgc3BpMF9waW5zLCBzcGkwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BpMWdycCIsIHNwaTFfcGlucywgc3BpMV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInR3aTBncnAiLCB0d2kwX3BpbnMsIHR3aTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ0d2kxZ3JwIiwgdHdpMV9waW5zLCB0d2kxX211eCksCisJQURJX1BJTl9HUk9VUCgicm90YXJ5Z3JwIiwgcm90YXJ5X3BpbnMsIHJvdGFyeV9tdXgpLAorCUFESV9QSU5fR1JPVVAoImNhbjBncnAiLCBjYW4wX3BpbnMsIGNhbjBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJjYW4xZ3JwIiwgY2FuMV9waW5zLCBjYW4xX211eCksCisJQURJX1BJTl9HUk9VUCgic21jMGdycCIsIHNtYzBfcGlucywgc21jMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0MGdycCIsIHNwb3J0MF9waW5zLCBzcG9ydDBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcG9ydDFncnAiLCBzcG9ydDFfcGlucywgc3BvcnQxX211eCksCisJQURJX1BJTl9HUk9VUCgic3BvcnQyZ3JwIiwgc3BvcnQyX3BpbnMsIHNwb3J0Ml9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0M2dycCIsIHNwb3J0M19waW5zLCBzcG9ydDNfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkwXzhiZ3JwIiwgcHBpMF84Yl9waW5zLCBwcGkwXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMF8xNmJncnAiLCBwcGkwXzE2Yl9waW5zLCBwcGkwXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTBfMjRiZ3JwIiwgcHBpMF8yNGJfcGlucywgcHBpMF8yNGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkxXzhiZ3JwIiwgcHBpMV84Yl9waW5zLCBwcGkxXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMV8xNmJncnAiLCBwcGkxXzE2Yl9waW5zLCBwcGkxXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTJfOGJncnAiLCBwcGkyXzhiX3BpbnMsIHBwaTJfOGJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJhdGFwaWdycCIsIGF0YXBpX3BpbnMsIGF0YXBpX211eCksCisJQURJX1BJTl9HUk9VUCgiYXRhcGlhbHRlcmdycCIsIGF0YXBpX2FsdGVyX3BpbnMsIGF0YXBpX2FsdGVyX211eCksCisJQURJX1BJTl9HUk9VUCgibmZjMGdycCIsIG5mYzBfcGlucywgbmZjMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoImtleXNfNHg0Z3JwIiwga2V5c180eDRfcGlucywga2V5c180eDRfbXV4KSwKKwlBRElfUElOX0dST1VQKCJrZXlzXzh4OGdycCIsIGtleXNfOHg4X3BpbnMsIGtleXNfOHg4X211eCksCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQwZ3JwW10gPSB7ICJ1YXJ0MGdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDFncnBbXSA9IHsgInVhcnQxZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0MWN0c3J0c2dycFtdID0geyAidWFydDFjdHNydHNncnAiIH07CkBAIC01MzIsNDkgKzUzMiw0NSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcG9ydDFncnBbXSA9IHsgInNwb3J0MWdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BvcnQyZ3JwW10gPSB7ICJzcG9ydDJncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwb3J0M2dycFtdID0geyAic3BvcnQzZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwXzhiZ3JwW10gPSB7ICJwcGkwXzhiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwXzE2YmdycFtdID0geyAicHBpMF8xNmJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfMjRiZ3JwW10gPSB7ICJwcGkwXzI0YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMV84YmdycFtdID0geyAicHBpMV84YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMV8xNmJncnBbXSA9IHsgInBwaTFfMTZiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkyXzhiZ3JwW10gPSB7ICJwcGkyXzhiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkwZ3JwW10gPSB7ICJwcGkwXzhiZ3JwIiwKKwkJCQkJInBwaTBfMTZiZ3JwIiwKKwkJCQkJInBwaTBfMjRiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxZ3JwW10gPSB7ICJwcGkxXzhiZ3JwIiwKKwkJCQkJInBwaTFfMTZiZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkyZ3JwW10gPSB7ICJwcGkyXzhiZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGFwaWdycFtdID0geyAiYXRhcGlncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0YXBpYWx0ZXJncnBbXSA9IHsgImF0YXBpYWx0ZXJncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5mYzBncnBbXSA9IHsgIm5mYzBncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleXNfNHg0Z3JwW10gPSB7ICJrZXlzXzR4NGdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5c184eDhncnBbXSA9IHsgImtleXNfOHg4Z3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlzZ3JwW10gPSB7ICJrZXlzXzR4NGdycCIsCisJCQkJCSJrZXlzXzh4OGdycCIgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcG14X2Z1bmMgYWRpX3BteF9mdW5jdGlvbnNbXSA9IHsKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MCIsIHVhcnQwZ3JwLCB1YXJ0MF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxIiwgdWFydDFncnAsIHVhcnQxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDFfY3RzcnRzIiwgdWFydDFjdHNydHNncnAsIHVhcnQxX2N0c3J0c19tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInVhcnQyIiwgdWFydDJncnAsIHVhcnQyX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDMiLCB1YXJ0M2dycCwgdWFydDNfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0M19jdHNydHMiLCB1YXJ0M2N0c3J0c2dycCwgdWFydDNfY3RzcnRzX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicnNpMCIsIHJzaTBncnAsIHJzaTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcGkwIiwgc3BpMGdycCwgc3BpMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwaTEiLCBzcGkxZ3JwLCBzcGkxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidHdpMCIsIHR3aTBncnAsIHR3aTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kxIiwgdHdpMWdycCwgdHdpMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInJvdGFyeSIsIHJvdGFyeWdycCwgcm90YXJ5X211eCksCi0JQURJX1BNWF9GVU5DVElPTigiY2FuMCIsIGNhbjBncnAsIGNhbjBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJjYW4xIiwgY2FuMWdycCwgY2FuMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNtYzAiLCBzbWMwZ3JwLCBzbWMwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQwIiwgc3BvcnQwZ3JwLCBzcG9ydDBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDEiLCBzcG9ydDFncnAsIHNwb3J0MV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MiIsIHNwb3J0MmdycCwgc3BvcnQyX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQzIiwgc3BvcnQzZ3JwLCBzcG9ydDNfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkwXzhiIiwgcHBpMF84YmdycCwgcHBpMF84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTBfMTZiIiwgcHBpMF8xNmJncnAsIHBwaTBfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMF8yNGIiLCBwcGkwXzI0YmdycCwgcHBpMF8yNGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxXzhiIiwgcHBpMV84YmdycCwgcHBpMV84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTFfMTZiIiwgcHBpMV8xNmJncnAsIHBwaTFfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMl84YiIsIHBwaTJfOGJncnAsIHBwaTJfOGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJhdGFwaSIsIGF0YXBpZ3JwLCBhdGFwaV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImF0YXBpX2FsdGVyIiwgYXRhcGlhbHRlcmdycCwgYXRhcGlfYWx0ZXJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJuZmMwIiwgbmZjMGdycCwgbmZjMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImtleXNfNHg0Iiwga2V5c180eDRncnAsIGtleXNfNHg0X211eCksCi0JQURJX1BNWF9GVU5DVElPTigia2V5c184eDgiLCBrZXlzXzh4OGdycCwga2V5c184eDhfbXV4KSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MCIsIHVhcnQwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MSIsIHVhcnQxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MV9jdHNydHMiLCB1YXJ0MWN0c3J0c2dycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDIiLCB1YXJ0MmdycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDMiLCB1YXJ0M2dycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDNfY3RzcnRzIiwgdWFydDNjdHNydHNncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInJzaTAiLCByc2kwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcGkwIiwgc3BpMGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BpMSIsIHNwaTFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInR3aTAiLCB0d2kwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kxIiwgdHdpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicm90YXJ5Iiwgcm90YXJ5Z3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJjYW4wIiwgY2FuMGdycCksCisJQURJX1BNWF9GVU5DVElPTigiY2FuMSIsIGNhbjFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNtYzAiLCBzbWMwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDAiLCBzcG9ydDBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MSIsIHNwb3J0MWdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BvcnQyIiwgc3BvcnQyZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDMiLCBzcG9ydDNncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInBwaTAiLCBwcGkwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxIiwgcHBpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicHBpMiIsIHBwaTJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImF0YXBpIiwgYXRhcGlncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImF0YXBpX2FsdGVyIiwgYXRhcGlhbHRlcmdycCksCisJQURJX1BNWF9GVU5DVElPTigibmZjMCIsIG5mYzBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImtleXMiLCBrZXlzZ3JwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRpX3BpbmN0cmxfc29jX2RhdGEgYWRpX2JmNTR4X3NvYyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY2MHguYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTItYmY2MHguYwppbmRleCBiZjU3YWVhLi40Y2I1OWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLWJmNjB4LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi1iZjYweC5jCkBAIC0yNTksMzcgKzI1OSw2IEBACiAJR1BJT19QRjEyLCBHUElPX1BGMTMsIEdQSU9fUEYxNCwgR1BJT19QRjE1LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluX2dyb3VwIGFkaV9waW5fZ3JvdXBzW10gPSB7Ci0JQURJX1BJTl9HUk9VUCgidWFydDBncnAiLCB1YXJ0MF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MGN0c3J0c2dycCIsIHVhcnQwX2N0c3J0c19waW5zKSwKLQlBRElfUElOX0dST1VQKCJ1YXJ0MWdycCIsIHVhcnQxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInVhcnQxY3RzcnRzZ3JwIiwgdWFydDFfY3RzcnRzX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInJzaTBncnAiLCByc2kwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImV0aDBncnAiLCBldGgwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImV0aDFncnAiLCBldGgxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwaTBncnAiLCBzcGkwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwaTFncnAiLCBzcGkxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInR3aTBncnAiLCB0d2kwX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInR3aTFncnAiLCB0d2kxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInJvdGFyeWdycCIsIHJvdGFyeV9waW5zKSwKLQlBRElfUElOX0dST1VQKCJjYW4wZ3JwIiwgY2FuMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzbWMwZ3JwIiwgc21jMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJzcG9ydDBncnAiLCBzcG9ydDBfcGlucyksCi0JQURJX1BJTl9HUk9VUCgic3BvcnQxZ3JwIiwgc3BvcnQxX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInNwb3J0MmdycCIsIHNwb3J0Ml9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzhiZ3JwIiwgcHBpMF84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkwXzE2YmdycCIsIHBwaTBfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoInBwaTBfMjRiZ3JwIiwgcHBpMF8yNGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV84YmdycCIsIHBwaTFfOGJfcGlucyksCi0JQURJX1BJTl9HUk9VUCgicHBpMV8xNmJncnAiLCBwcGkxXzE2Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkyXzhiZ3JwIiwgcHBpMl84Yl9waW5zKSwKLQlBRElfUElOX0dST1VQKCJwcGkyXzE2YmdycCIsIHBwaTJfMTZiX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImxwMGdycCIsIGxwMF9waW5zKSwKLQlBRElfUElOX0dST1VQKCJscDFncnAiLCBscDFfcGlucyksCi0JQURJX1BJTl9HUk9VUCgibHAyZ3JwIiwgbHAyX3BpbnMpLAotCUFESV9QSU5fR1JPVVAoImxwM2dycCIsIGxwM19waW5zKSwKLX07Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB1YXJ0MF9tdXhbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLAogCTAKQEAgLTQ0Niw2ICs0MTUsMzcgQEAKICAgICAgICAgMAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlfcGluX2dyb3VwIGFkaV9waW5fZ3JvdXBzW10gPSB7CisJQURJX1BJTl9HUk9VUCgidWFydDBncnAiLCB1YXJ0MF9waW5zLCB1YXJ0MF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQwY3RzcnRzZ3JwIiwgdWFydDBfY3RzcnRzX3BpbnMsIHVhcnQwX2N0c3J0c19tdXgpLAorCUFESV9QSU5fR1JPVVAoInVhcnQxZ3JwIiwgdWFydDFfcGlucywgdWFydDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ1YXJ0MWN0c3J0c2dycCIsIHVhcnQxX2N0c3J0c19waW5zLCB1YXJ0MV9jdHNydHNfbXV4KSwKKwlBRElfUElOX0dST1VQKCJyc2kwZ3JwIiwgcnNpMF9waW5zLCByc2kwX211eCksCisJQURJX1BJTl9HUk9VUCgiZXRoMGdycCIsIGV0aDBfcGlucywgZXRoMF9tdXgpLAorCUFESV9QSU5fR1JPVVAoImV0aDFncnAiLCBldGgxX3BpbnMsIGV0aDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcGkwZ3JwIiwgc3BpMF9waW5zLCBzcGkwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BpMWdycCIsIHNwaTFfcGlucywgc3BpMV9tdXgpLAorCUFESV9QSU5fR1JPVVAoInR3aTBncnAiLCB0d2kwX3BpbnMsIHR3aTBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJ0d2kxZ3JwIiwgdHdpMV9waW5zLCB0d2kxX211eCksCisJQURJX1BJTl9HUk9VUCgicm90YXJ5Z3JwIiwgcm90YXJ5X3BpbnMsIHJvdGFyeV9tdXgpLAorCUFESV9QSU5fR1JPVVAoImNhbjBncnAiLCBjYW4wX3BpbnMsIGNhbjBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzbWMwZ3JwIiwgc21jMF9waW5zLCBzbWMwX211eCksCisJQURJX1BJTl9HUk9VUCgic3BvcnQwZ3JwIiwgc3BvcnQwX3BpbnMsIHNwb3J0MF9tdXgpLAorCUFESV9QSU5fR1JPVVAoInNwb3J0MWdycCIsIHNwb3J0MV9waW5zLCBzcG9ydDFfbXV4KSwKKwlBRElfUElOX0dST1VQKCJzcG9ydDJncnAiLCBzcG9ydDJfcGlucywgc3BvcnQyX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMF84YmdycCIsIHBwaTBfOGJfcGlucywgcHBpMF84Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTBfMTZiZ3JwIiwgcHBpMF8xNmJfcGlucywgcHBpMF8xNmJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkwXzI0YmdycCIsIHBwaTBfMjRiX3BpbnMsIHBwaTBfMjRiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMV84YmdycCIsIHBwaTFfOGJfcGlucywgcHBpMV84Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoInBwaTFfMTZiZ3JwIiwgcHBpMV8xNmJfcGlucywgcHBpMV8xNmJfbXV4KSwKKwlBRElfUElOX0dST1VQKCJwcGkyXzhiZ3JwIiwgcHBpMl84Yl9waW5zLCBwcGkyXzhiX211eCksCisJQURJX1BJTl9HUk9VUCgicHBpMl8xNmJncnAiLCBwcGkyXzE2Yl9waW5zLCBwcGkyXzE2Yl9tdXgpLAorCUFESV9QSU5fR1JPVVAoImxwMGdycCIsIGxwMF9waW5zLCBscDBfbXV4KSwKKwlBRElfUElOX0dST1VQKCJscDFncnAiLCBscDFfcGlucywgbHAxX211eCksCisJQURJX1BJTl9HUk9VUCgibHAyZ3JwIiwgbHAyX3BpbnMsIGxwMl9tdXgpLAorCUFESV9QSU5fR1JPVVAoImxwM2dycCIsIGxwM19waW5zLCBscDNfbXV4KSwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDBncnBbXSA9IHsgInVhcnQwZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0MGN0c3J0c2dycFtdID0geyAidWFydDBjdHNydHNncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQxZ3JwW10gPSB7ICJ1YXJ0MWdycCIgfTsKQEAgLTQ2Myw0NyArNDYzLDQzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwb3J0MGdycFtdID0geyAic3BvcnQwZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcG9ydDFncnBbXSA9IHsgInNwb3J0MWdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BvcnQyZ3JwW10gPSB7ICJzcG9ydDJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfOGJncnBbXSA9IHsgInBwaTBfOGJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTBfMTZiZ3JwW10gPSB7ICJwcGkwXzE2YmdycCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMF8yNGJncnBbXSA9IHsgInBwaTBfMjRiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxXzhiZ3JwW10gPSB7ICJwcGkxXzhiZ3JwIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcGkxXzE2YmdycFtdID0geyAicHBpMV8xNmJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTJfOGJncnBbXSA9IHsgInBwaTJfOGJncnAiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBwaTJfMTZiZ3JwW10gPSB7ICJwcGkyXzE2YmdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMGdycFtdID0geyAicHBpMF84YmdycCIsCisJCQkJCSJwcGkwXzE2YmdycCIsCisJCQkJCSJwcGkwXzI0YmdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMWdycFtdID0geyAicHBpMV84YmdycCIsCisJCQkJCSJwcGkxXzE2YmdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHBpMmdycFtdID0geyAicHBpMl84YmdycCIsCisJCQkJCSJwcGkyXzE2YmdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbHAwZ3JwW10gPSB7ICJscDBncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxwMWdycFtdID0geyAibHAxZ3JwIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBscDJncnBbXSA9IHsgImxwMmdycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbHAzZ3JwW10gPSB7ICJscDNncnAiIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRpX3BteF9mdW5jIGFkaV9wbXhfZnVuY3Rpb25zW10gPSB7Ci0JQURJX1BNWF9GVU5DVElPTigidWFydDAiLCB1YXJ0MGdycCwgdWFydDBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MF9jdHNydHMiLCB1YXJ0MGN0c3J0c2dycCwgdWFydDBfY3RzcnRzX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidWFydDEiLCB1YXJ0MWdycCwgdWFydDFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJ1YXJ0MV9jdHNydHMiLCB1YXJ0MWN0c3J0c2dycCwgdWFydDFfY3RzcnRzX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicnNpMCIsIHJzaTBncnAsIHJzaTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJldGgwIiwgZXRoMGdycCwgZXRoMF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImV0aDEiLCBldGgxZ3JwLCBldGgxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BpMCIsIHNwaTBncnAsIHNwaTBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcGkxIiwgc3BpMWdycCwgc3BpMV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInR3aTAiLCB0d2kwZ3JwLCB0d2kwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigidHdpMSIsIHR3aTFncnAsIHR3aTFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJyb3RhcnkiLCByb3RhcnlncnAsIHJvdGFyeV9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImNhbjAiLCBjYW4wZ3JwLCBjYW4wX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic21jMCIsIHNtYzBncnAsIHNtYzBfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDAiLCBzcG9ydDBncnAsIHNwb3J0MF9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MSIsIHNwb3J0MWdycCwgc3BvcnQxX211eCksCi0JQURJX1BNWF9GVU5DVElPTigic3BvcnQyIiwgc3BvcnQyZ3JwLCBzcG9ydDJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkwXzhiIiwgcHBpMF84YmdycCwgcHBpMF84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTBfMTZiIiwgcHBpMF8xNmJncnAsIHBwaTBfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMF8yNGIiLCBwcGkwXzI0YmdycCwgcHBpMF8yNGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxXzhiIiwgcHBpMV84YmdycCwgcHBpMV84Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oInBwaTFfMTZiIiwgcHBpMV8xNmJncnAsIHBwaTFfMTZiX211eCksCi0JQURJX1BNWF9GVU5DVElPTigicHBpMl84YiIsIHBwaTJfOGJncnAsIHBwaTJfOGJfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJwcGkyXzE2YiIsIHBwaTJfMTZiZ3JwLCBwcGkyXzE2Yl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImxwMCIsIGxwMGdycCwgbHAwX211eCksCi0JQURJX1BNWF9GVU5DVElPTigibHAxIiwgbHAxZ3JwLCBscDFfbXV4KSwKLQlBRElfUE1YX0ZVTkNUSU9OKCJscDIiLCBscDJncnAsIGxwMl9tdXgpLAotCUFESV9QTVhfRlVOQ1RJT04oImxwMyIsIGxwM2dycCwgbHAzX211eCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDAiLCB1YXJ0MGdycCksCisJQURJX1BNWF9GVU5DVElPTigidWFydDBfY3RzcnRzIiwgdWFydDBjdHNydHNncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxIiwgdWFydDFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInVhcnQxX2N0c3J0cyIsIHVhcnQxY3RzcnRzZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJyc2kwIiwgcnNpMGdycCksCisJQURJX1BNWF9GVU5DVElPTigiZXRoMCIsIGV0aDBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImV0aDEiLCBldGgxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcGkwIiwgc3BpMGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BpMSIsIHNwaTFncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInR3aTAiLCB0d2kwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJ0d2kxIiwgdHdpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicm90YXJ5Iiwgcm90YXJ5Z3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJjYW4wIiwgY2FuMGdycCksCisJQURJX1BNWF9GVU5DVElPTigic21jMCIsIHNtYzBncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInNwb3J0MCIsIHNwb3J0MGdycCksCisJQURJX1BNWF9GVU5DVElPTigic3BvcnQxIiwgc3BvcnQxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJzcG9ydDIiLCBzcG9ydDJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oInBwaTAiLCBwcGkwZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJwcGkxIiwgcHBpMWdycCksCisJQURJX1BNWF9GVU5DVElPTigicHBpMiIsIHBwaTJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImxwMCIsIGxwMGdycCksCisJQURJX1BNWF9GVU5DVElPTigibHAxIiwgbHAxZ3JwKSwKKwlBRElfUE1YX0ZVTkNUSU9OKCJscDIiLCBscDJncnApLAorCUFESV9QTVhfRlVOQ1RJT04oImxwMyIsIGxwM2dycCksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkaV9waW5jdHJsX3NvY19kYXRhIGFkaV9iZjYweF9zb2MgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmMKaW5kZXggN2EzOTU2Mi4uMjAwZWExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuYwpAQCAtODksNiArODksMTkgQEAKIAl1MzIgbXV4OwogfTsKIAorLyoKKyAqIHN0cnVjdCBncGlvX3BpbnRfc2F2ZWQgLSBQSU5UIHJlZ2lzdGVycyBzYXZlZCBpbiBQTSBvcGVyYXRpb25zCisgKgorICogQGFzc2lnbjogQVNTSUdOIHJlZ2lzdGVyCisgKiBAZWRnZV9zZXQ6IEVER0VfU0VUIHJlZ2lzdGVyCisgKiBAaW52ZXJ0X3NldDogSU5WRVJUX1NFVCByZWdpc3RlcgorICovCitzdHJ1Y3QgZ3Bpb19waW50X3NhdmVkIHsKKwl1MzIgYXNzaWduOworCXUzMiBlZGdlX3NldDsKKwl1MzIgaW52ZXJ0X3NldDsKK307CisKIC8qKgogICogc3RydWN0IGdwaW9fcGludCAtIFBpbiBpbnRlcnJ1cHQgY29udHJvbGxlciBkZXZpY2UuIE11bHRpcGxlIEFESSBHUElPCiAgKiBiYW5rcyBjYW4gYmUgbWFwcGVkIGludG8gb25lIFBpbiBpbnRlcnJ1cHQgY29udHJvbGxlci4KQEAgLTExNCw3ICsxMjcsNyBAQAogCWludCBpcnE7CiAJc3RydWN0IGlycV9kb21haW4gKmRvbWFpblsyXTsKIAlzdHJ1Y3QgZ3Bpb19waW50X3JlZ3MgKnJlZ3M7Ci0Jc3RydWN0IGFkaV9wbV9waW50X3NhdmUgc2F2ZWRfZGF0YTsKKwlzdHJ1Y3QgZ3Bpb19waW50X3NhdmVkIHNhdmVkX2RhdGE7CiAJaW50IG1hcF9jb3VudDsKIAlzcGlubG9ja190IGxvY2s7CiAKQEAgLTE2MCw3ICsxNzMsNyBAQAogc3RydWN0IGdwaW9fcG9ydCB7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwogCXZvaWQgX19pb21lbSAqYmFzZTsKLQl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7CisJaW50IGlycV9iYXNlOwogCXVuc2lnbmVkIGludCB3aWR0aDsKIAlzdHJ1Y3QgZ3Bpb19wb3J0X3QgKnJlZ3M7CiAJc3RydWN0IGdwaW9fcG9ydF9zYXZlZCBzYXZlZF9kYXRhOwpAQCAtNjA1LDggKzYxOCw4IEBACiAJLmdldF9ncm91cF9waW5zID0gYWRpX2dldF9ncm91cF9waW5zLAogfTsKIAotc3RhdGljIGludCBhZGlfcGlubXV4X2VuYWJsZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIHNlbGVjdG9yLAotCXVuc2lnbmVkIGdyb3VwKQorc3RhdGljIGludCBhZGlfcGlubXV4X2VuYWJsZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGZ1bmNfaWQsCisJdW5zaWduZWQgZ3JvdXBfaWQpCiB7CiAJc3RydWN0IGFkaV9waW5jdHJsICpwaW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CiAJc3RydWN0IGdwaW9fcG9ydCAqcG9ydDsKQEAgLTYxNCw3ICs2MjcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgKm11eCwgcGluOwogCi0JbXV4ID0gKHVuc2lnbmVkIHNob3J0ICopcGluY3RybC0+c29jLT5mdW5jdGlvbnNbc2VsZWN0b3JdLm11eDsKKwltdXggPSAodW5zaWduZWQgc2hvcnQgKilwaW5jdHJsLT5zb2MtPmdyb3Vwc1tncm91cF9pZF0ubXV4OwogCiAJd2hpbGUgKCptdXgpIHsKIAkJcGluID0gUF9JREVOVCgqbXV4KTsKQEAgLTYyOCw3ICs2NDEsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJCXBvcnRtdXhfc2V0dXAocG9ydCwgcGluX3RvX29mZnNldChyYW5nZSwgcGluKSwKLQkJCQkgUF9GVU5DVDJNVVgoKm11eCkpOworCQkJCVBfRlVOQ1QyTVVYKCptdXgpKTsKIAkJcG9ydF9zZXR1cChwb3J0LCBwaW5fdG9fb2Zmc2V0KHJhbmdlLCBwaW4pLCBmYWxzZSk7CiAJCW11eCsrOwogCkBAIC02MzgsOCArNjUxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWRpX3Bpbm11eF9kaXNhYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgc2VsZWN0b3IsCi0JdW5zaWduZWQgZ3JvdXApCitzdGF0aWMgdm9pZCBhZGlfcGlubXV4X2Rpc2FibGUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBmdW5jX2lkLAorCXVuc2lnbmVkIGdyb3VwX2lkKQogewogCXN0cnVjdCBhZGlfcGluY3RybCAqcGluY3RybCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwogCXN0cnVjdCBncGlvX3BvcnQgKnBvcnQ7CkBAIC02NDcsNyArNjYwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNob3J0ICptdXgsIHBpbjsKIAotCW11eCA9ICh1bnNpZ25lZCBzaG9ydCAqKXBpbmN0cmwtPnNvYy0+ZnVuY3Rpb25zW3NlbGVjdG9yXS5tdXg7CisJbXV4ID0gKHVuc2lnbmVkIHNob3J0ICopcGluY3RybC0+c29jLT5ncm91cHNbZ3JvdXBfaWRdLm11eDsKIAogCXdoaWxlICgqbXV4KSB7CiAJCXBpbiA9IFBfSURFTlQoKm11eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmggYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hZGkyLmgKaW5kZXggMWYwNmY4ZC4uM2NhMjk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYWRpMi5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFkaTIuaApAQCAtMjEsMTMgKzIxLDE1IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCB1bnNpZ25lZCAqcGluczsKIAljb25zdCB1bnNpZ25lZCBudW07CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKm11eDsKIH07CiAKLSNkZWZpbmUgQURJX1BJTl9HUk9VUChuLCBwKSAgXAorI2RlZmluZSBBRElfUElOX0dST1VQKG4sIHAsIG0pICBcCiAJewkJCVwKIAkJLm5hbWUgPSBuLAlcCiAJCS5waW5zID0gcCwJXAogCQkubnVtID0gQVJSQVlfU0laRShwKSwJXAorCQkubXV4ID0gbSwJCQlcCiAJfQogCiAgLyoqCkBAIC00MSwxNSArNDMsMTMgQEAKIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqZ3JvdXBzOwogCWNvbnN0IHVuc2lnbmVkIG51bV9ncm91cHM7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgKm11eDsKIH07CiAKLSNkZWZpbmUgQURJX1BNWF9GVU5DVElPTihuLCBnLCBtKQkJXAorI2RlZmluZSBBRElfUE1YX0ZVTkNUSU9OKG4sIGcpCQlcCiAJewkJCQkJXAogCQkubmFtZSA9IG4sCQkJXAogCQkuZ3JvdXBzID0gZywJCQlcCiAJCS5udW1fZ3JvdXBzID0gQVJSQVlfU0laRShnKSwJXAotCQkubXV4ID0gbSwJCQlcCiAJfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYwppbmRleCBkOTkwZTMzLi41ZDI0YWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCkBAIC0xMTM3LDYgKzExMzcsMTcgQEAKIAlwaW5jdHJsX2ZyZWVfZ3BpbyhncGlvKTsKIH0KIAorc3RhdGljIGludCBhdDkxX2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGF0OTFfZ3Bpb19jaGlwICphdDkxX2dwaW8gPSB0b19hdDkxX2dwaW9fY2hpcChjaGlwKTsKKwl2b2lkIF9faW9tZW0gKnBpbyA9IGF0OTFfZ3Bpby0+cmVnYmFzZTsKKwl1bnNpZ25lZCBtYXNrID0gMSA8PCBvZmZzZXQ7CisJdTMyIG9zcjsKKworCW9zciA9IHJlYWRsX3JlbGF4ZWQocGlvICsgUElPX09TUik7CisJcmV0dXJuICEob3NyICYgbWFzayk7Cit9CisKIHN0YXRpYyBpbnQgYXQ5MV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJc3RydWN0IGF0OTFfZ3Bpb19jaGlwICphdDkxX2dwaW8gPSB0b19hdDkxX2dwaW9fY2hpcChjaGlwKTsKQEAgLTEzMjUsNiArMTMzNiwzMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9faXJxX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBhdDkxX2dwaW9fY2hpcCAqYXQ5MV9ncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQJcGluID0gZC0+aHdpcnE7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9fbG9ja19hc19pcnEoJmF0OTFfZ3Bpby0+Y2hpcCwgcGluKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoYXQ5MV9ncGlvLT5jaGlwLmRldiwgInVuYWJsZSB0byBsb2NrIHBpbmQgJWx1IElSUVxuIiwKKwkJCWQtPmh3aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZ3Bpb19pcnFfdW5tYXNrKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBncGlvX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGF0OTFfZ3Bpb19jaGlwICphdDkxX2dwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZAlwaW4gPSBkLT5od2lycTsKKworCWdwaW9faXJxX21hc2soZCk7CisJZ3Bpb191bmxvY2tfYXNfaXJxKCZhdDkxX2dwaW8tPmNoaXAsIHBpbik7Cit9CisKICNpZmRlZiBDT05GSUdfUE0KIAogc3RhdGljIHUzMiB3YWtldXBzW01BWF9HUElPX0JBTktTXTsKQEAgLTEzOTksNiArMTQzNSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFjaGlwID0gewogCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX3N0YXJ0dXAJPSBncGlvX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBncGlvX2lycV9zaHV0ZG93biwKIAkuaXJxX2Rpc2FibGUJPSBncGlvX2lycV9tYXNrLAogCS5pcnFfbWFzawk9IGdwaW9faXJxX21hc2ssCiAJLmlycV91bm1hc2sJPSBncGlvX2lycV91bm1hc2ssCkBAIC0xNTQzLDYgKzE1ODEsNyBAQAogc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgYXQ5MV9ncGlvX3RlbXBsYXRlID0gewogCS5yZXF1ZXN0CQk9IGF0OTFfZ3Bpb19yZXF1ZXN0LAogCS5mcmVlCQkJPSBhdDkxX2dwaW9fZnJlZSwKKwkuZ2V0X2RpcmVjdGlvbgkJPSBhdDkxX2dwaW9fZ2V0X2RpcmVjdGlvbiwKIAkuZGlyZWN0aW9uX2lucHV0CT0gYXQ5MV9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKIAkuZ2V0CQkJPSBhdDkxX2dwaW9fZ2V0LAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gYXQ5MV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1iYXl0cmFpbC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYmF5dHJhaWwuYwppbmRleCA2NjViOTZiLi5iZjJiM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1iYXl0cmFpbC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWJheXRyYWlsLmMKQEAgLTYwLDYgKzYwLDEwIEBACiAjZGVmaW5lIEJZVF9OR1BJT19OQ09SRQkJMjgKICNkZWZpbmUgQllUX05HUElPX1NVUwkJNDQKIAorI2RlZmluZSBCWVRfU0NPUkVfQUNQSV9VSUQJIjEiCisjZGVmaW5lIEJZVF9OQ09SRV9BQ1BJX1VJRAkiMiIKKyNkZWZpbmUgQllUX1NVU19BQ1BJX1VJRAkiMyIKKwogLyoKICAqIEJheXRyYWlsIGdwaW8gY29udHJvbGxlciBjb25zaXN0IG9mIHRocmVlIHNlcGFyYXRlIHN1Yi1jb250cm9sbGVycyBjYWxsZWQKICAqIFNDT1JFLCBOQ09SRSBhbmQgU1VTLiBUaGUgc3ViLWNvbnRyb2xsZXJzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGFjcGkgVUlELgpAQCAtMTAyLDE3ICsxMDYsMTcgQEAKIAogc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgYnl0X3Jhbmdlc1tdID0gewogCXsKLQkJLm5hbWUgPSAiMSIsIC8qIG1hdGNoIHdpdGggYWNwaSBfVUlEIGluIHByb2JlICovCisJCS5uYW1lID0gQllUX1NDT1JFX0FDUElfVUlELCAvKiBtYXRjaCB3aXRoIGFjcGkgX1VJRCBpbiBwcm9iZSAqLwogCQkubnBpbnMgPSBCWVRfTkdQSU9fU0NPUkUsCiAJCS5waW5zID0gc2NvcmVfcGlucywKIAl9LAogCXsKLQkJLm5hbWUgPSAiMiIsCisJCS5uYW1lID0gQllUX05DT1JFX0FDUElfVUlELAogCQkubnBpbnMgPSBCWVRfTkdQSU9fTkNPUkUsCiAJCS5waW5zID0gbmNvcmVfcGlucywKIAl9LAogCXsKLQkJLm5hbWUgPSAiMyIsCisJCS5uYW1lID0gQllUX1NVU19BQ1BJX1VJRCwKIAkJLm5waW5zID0gQllUX05HUElPX1NVUywKIAkJLnBpbnMgPSBzdXNfcGlucywKIAl9LApAQCAtMTQ1LDkgKzE0OSw0MSBAQAogCXJldHVybiB2Zy0+cmVnX2Jhc2UgKyByZWdfb2Zmc2V0ICsgcmVnOwogfQogCitzdGF0aWMgYm9vbCBpc19zcGVjaWFsX3BpbihzdHJ1Y3QgYnl0X2dwaW8gKnZnLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJLyogU0NPUkUgcGluIDkyLTkzICovCisJaWYgKCFzdHJjbXAodmctPnJhbmdlLT5uYW1lLCBCWVRfU0NPUkVfQUNQSV9VSUQpICYmCisJCW9mZnNldCA+PSA5MiAmJiBvZmZzZXQgPD0gOTMpCisJCXJldHVybiB0cnVlOworCisJLyogU1VTIHBpbiAxMS0yMSAqLworCWlmICghc3RyY21wKHZnLT5yYW5nZS0+bmFtZSwgQllUX1NVU19BQ1BJX1VJRCkgJiYKKwkJb2Zmc2V0ID49IDExICYmIG9mZnNldCA8PSAyMSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbnQgYnl0X2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJc3RydWN0IGJ5dF9ncGlvICp2ZyA9IHRvX2J5dF9ncGlvKGNoaXApOworCXZvaWQgX19pb21lbSAqcmVnID0gYnl0X2dwaW9fcmVnKGNoaXAsIG9mZnNldCwgQllUX0NPTkYwX1JFRyk7CisJdTMyIHZhbHVlOworCWJvb2wgc3BlY2lhbDsKKworCS8qCisJICogSW4gbW9zdCBjYXNlcywgZnVuYyBwaW4gbXV4IDAwMCBtZWFucyBHUElPIGZ1bmN0aW9uLgorCSAqIEJ1dCwgc29tZSBwaW5zIG1heSBoYXZlIGZ1bmMgcGluIG11eCAwMDEgcmVwcmVzZW50cworCSAqIEdQSU8gZnVuY3Rpb24uIE9ubHkgYWxsb3cgdXNlciB0byBleHBvcnQgcGluIHdpdGgKKwkgKiBmdW5jIHBpbiBtdXggcHJlc2V0IGFzIEdQSU8gZnVuY3Rpb24gYnkgQklPUy9GVy4KKwkgKi8KKwl2YWx1ZSA9IHJlYWRsKHJlZykgJiBCWVRfUElOX01VWDsKKwlzcGVjaWFsID0gaXNfc3BlY2lhbF9waW4odmcsIG9mZnNldCk7CisJaWYgKChzcGVjaWFsICYmIHZhbHVlICE9IDEpIHx8ICghc3BlY2lhbCAmJiB2YWx1ZSkpIHsKKwkJZGV2X2VycigmdmctPnBkZXYtPmRldiwKKwkJCSJwaW4gJXUgY2Fubm90IGJlIHVzZWQgYXMgR1BJTy5cbiIsIG9mZnNldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXBtX3J1bnRpbWVfZ2V0KCZ2Zy0+cGRldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtZXh5bm9zLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1leHlub3MuYwppbmRleCAxNTViMWIzLi4wN2M4MTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1leHlub3MuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1leHlub3MuYwpAQCAtMTA0Miw2ICsxMDQyLDg4IEBACiAJfSwKIH07CiAKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1MjYwIHBpbi1jb250cm9sbGVyIDAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19waW5fYmFuayBleHlub3M1MjYwX3Bpbl9iYW5rczBbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwMDAsICJncGEwIiwgMHgwMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDcsIDB4MDIwLCAiZ3BhMSIsIDB4MDQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDA0MCwgImdwYTIiLCAweDA4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNSwgMHgwNjAsICJncGIwIiwgMHgwYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDQsIDB4MDgwLCAiZ3BiMSIsIDB4MTApLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg1LCAweDBhMCwgImdwYjIiLCAweDE0KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgwYzAsICJncGIzIiwgMHgxOCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDgsIDB4MGUwLCAiZ3BiNCIsIDB4MWMpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDEwMCwgImdwYjUiLCAweDIwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgxMjAsICJncGQwIiwgMHgyNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDcsIDB4MTQwLCAiZ3BkMSIsIDB4MjgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg1LCAweDE2MCwgImdwZDIiLCAweDJjKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgxODAsICJncGUwIiwgMHgzMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDUsIDB4MWEwLCAiZ3BlMSIsIDB4MzQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg0LCAweDFjMCwgImdwZjAiLCAweDM4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgxZTAsICJncGYxIiwgMHgzYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDIsIDB4MjAwLCAiZ3BrMCIsIDB4NDApLAorCUVYWU5PU19QSU5fQkFOS19FSU5UVyg4LCAweGMwMCwgImdweDAiLCAweDAwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVFcoOCwgMHhjMjAsICJncHgxIiwgMHgwNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRXKDgsIDB4YzQwLCAiZ3B4MiIsIDB4MDgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5UVyg4LCAweGM2MCwgImdweDMiLCAweDBjKSwKK307CisKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1MjYwIHBpbi1jb250cm9sbGVyIDEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19waW5fYmFuayBleHlub3M1MjYwX3Bpbl9iYW5rczFbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNywgMHgwMDAsICJncGMwIiwgMHgwMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDYsIDB4MDIwLCAiZ3BjMSIsIDB4MDQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg3LCAweDA0MCwgImdwYzIiLCAweDA4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwNjAsICJncGMzIiwgMHgwYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDQsIDB4MDgwLCAiZ3BjNCIsIDB4MTApLAorfTsKKworLyogcGluIGJhbmtzIG9mIGV4eW5vczUyNjAgcGluLWNvbnRyb2xsZXIgMiAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rIGV4eW5vczUyNjBfcGluX2JhbmtzMltdID0geworCUVYWU5PU19QSU5fQkFOS19FSU5URyg3LCAweDAwMCwgImdwejAiLCAweDAwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNCwgMHgwMjAsICJncHoxIiwgMHgwNCksCit9OworCisvKgorICogU2Ftc3VuZyBwaW5jdHJsIGRyaXZlciBkYXRhIGZvciBFeHlub3M1MjYwIFNvQy4gRXh5bm9zNTI2MCBTb0MgaW5jbHVkZXMKKyAqIHRocmVlIGdwaW8vcGluLW11eC9waW5jb25maWcgY29udHJvbGxlcnMuCisgKi8KK3N0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczUyNjBfcGluX2N0cmxbXSA9IHsKKwl7CisJCS8qIHBpbi1jb250cm9sbGVyIGluc3RhbmNlIDAgZGF0YSAqLworCQkucGluX2JhbmtzCT0gZXh5bm9zNTI2MF9waW5fYmFua3MwLAorCQkubnJfYmFua3MJPSBBUlJBWV9TSVpFKGV4eW5vczUyNjBfcGluX2JhbmtzMCksCisJCS5nZWludF9jb24JPSBFWFlOT1NfR1BJT19FQ09OX09GRlNFVCwKKwkJLmdlaW50X21hc2sJPSBFWFlOT1NfR1BJT19FTUFTS19PRkZTRVQsCisJCS5nZWludF9wZW5kCT0gRVhZTk9TX0dQSU9fRVBFTkRfT0ZGU0VULAorCQkud2VpbnRfY29uCT0gRVhZTk9TX1dLVVBfRUNPTl9PRkZTRVQsCisJCS53ZWludF9tYXNrCT0gRVhZTk9TX1dLVVBfRU1BU0tfT0ZGU0VULAorCQkud2VpbnRfcGVuZAk9IEVYWU5PU19XS1VQX0VQRU5EX09GRlNFVCwKKwkJLnN2YwkJPSBFWFlOT1NfU1ZDX09GRlNFVCwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuZWludF93a3VwX2luaXQgPSBleHlub3NfZWludF93a3VwX2luaXQsCisJCS5sYWJlbAkJPSAiZXh5bm9zNTI2MC1ncGlvLWN0cmwwIiwKKwl9LCB7CisJCS8qIHBpbi1jb250cm9sbGVyIGluc3RhbmNlIDEgZGF0YSAqLworCQkucGluX2JhbmtzCT0gZXh5bm9zNTI2MF9waW5fYmFua3MxLAorCQkubnJfYmFua3MJPSBBUlJBWV9TSVpFKGV4eW5vczUyNjBfcGluX2JhbmtzMSksCisJCS5nZWludF9jb24JPSBFWFlOT1NfR1BJT19FQ09OX09GRlNFVCwKKwkJLmdlaW50X21hc2sJPSBFWFlOT1NfR1BJT19FTUFTS19PRkZTRVQsCisJCS5nZWludF9wZW5kCT0gRVhZTk9TX0dQSU9fRVBFTkRfT0ZGU0VULAorCQkuc3ZjCQk9IEVYWU5PU19TVkNfT0ZGU0VULAorCQkuZWludF9ncGlvX2luaXQgPSBleHlub3NfZWludF9ncGlvX2luaXQsCisJCS5sYWJlbAkJPSAiZXh5bm9zNTI2MC1ncGlvLWN0cmwxIiwKKwl9LCB7CisJCS8qIHBpbi1jb250cm9sbGVyIGluc3RhbmNlIDIgZGF0YSAqLworCQkucGluX2JhbmtzCT0gZXh5bm9zNTI2MF9waW5fYmFua3MyLAorCQkubnJfYmFua3MJPSBBUlJBWV9TSVpFKGV4eW5vczUyNjBfcGluX2JhbmtzMiksCisJCS5nZWludF9jb24JPSBFWFlOT1NfR1BJT19FQ09OX09GRlNFVCwKKwkJLmdlaW50X21hc2sJPSBFWFlOT1NfR1BJT19FTUFTS19PRkZTRVQsCisJCS5nZWludF9wZW5kCT0gRVhZTk9TX0dQSU9fRVBFTkRfT0ZGU0VULAorCQkuc3ZjCQk9IEVYWU5PU19TVkNfT0ZGU0VULAorCQkuZWludF9ncGlvX2luaXQgPSBleHlub3NfZWludF9ncGlvX2luaXQsCisJCS5sYWJlbAkJPSAiZXh5bm9zNTI2MC1ncGlvLWN0cmwyIiwKKwl9LAorfTsKKwogLyogcGluIGJhbmtzIG9mIGV4eW5vczU0MjAgcGluLWNvbnRyb2xsZXIgMCAqLwogc3RhdGljIHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rIGV4eW5vczU0MjBfcGluX2JhbmtzMFtdID0gewogCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDAwMCwgImdweTciLCAweDAwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWlteC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtaW14LmMKaW5kZXggNDc3OWI4ZS4uZTExOGZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtaW14LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtaW14LmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCQkJcGluLT5tdXhfbW9kZSB8PSBJT01VWENfQ09ORklHX1NJT047CiAJCXBpbi0+Y29uZmlnID0gY29uZmlnICYgfklNWF9QQURfU0lPTjsKIAotCQlkZXZfZGJnKGluZm8tPmRldiwgIiVzOiAlZCAweCUwOGx4IiwgaW5mby0+cGluc1tpXS5uYW1lLAorCQlkZXZfZGJnKGluZm8tPmRldiwgIiVzOiAlZCAweCUwOGx4IiwgaW5mby0+cGluc1twaW5faWRdLm5hbWUsCiAJCQkJcGluLT5tdXhfbW9kZSwgcGluLT5jb25maWcpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbXNtLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uYwppbmRleCBlZjJiZjMxLi4zNDNmNDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSAiY29yZS5oIgpAQCAtNTAsNyArNDksNiBAQAogICogQGVuYWJsZWRfaXJxczogICBCaXRtYXAgb2YgY3VycmVudGx5IGVuYWJsZWQgaXJxcy4KICAqIEBkdWFsX2VkZ2VfaXJxczogQml0bWFwIG9mIGlycXMgdGhhdCBuZWVkIHN3IGVtdWxhdGVkIGR1YWwgZWRnZQogICogICAgICAgICAgICAgICAgICBkZXRlY3Rpb24uCi0gKiBAd2FrZV9pcnFzOiAgICAgIEJpdG1hcCBvZiBpcnFzIHdpdGggcmVxdWVzdGVkIGFzIHdha2V1cCBzb3VyY2UuCiAgKiBAc29jOyAgICAgICAgICAgIFJlZmVyZW5jZSB0byBzb2NfZGF0YSBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhLgogICogQHJlZ3M6ICAgICAgICAgICBCYXNlIGFkZHJlc3MgZm9yIHRoZSBUTE1NIHJlZ2lzdGVyIG1hcC4KICAqLwpAQCAtNjUsNyArNjMsNiBAQAogCiAJREVDTEFSRV9CSVRNQVAoZHVhbF9lZGdlX2lycXMsIE1BWF9OUl9HUElPKTsKIAlERUNMQVJFX0JJVE1BUChlbmFibGVkX2lycXMsIE1BWF9OUl9HUElPKTsKLQlERUNMQVJFX0JJVE1BUCh3YWtlX2lycXMsIE1BWF9OUl9HUElPKTsKIAogCWNvbnN0IHN0cnVjdCBtc21fcGluY3RybF9zb2NfZGF0YSAqc29jOwogCXZvaWQgX19pb21lbSAqcmVnczsKQEAgLTIwMyw0MiArMjAwLDI5IEBACiBzdGF0aWMgaW50IG1zbV9jb25maWdfcmVnKHN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwsCiAJCQkgIGNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmcsCiAJCQkgIHVuc2lnbmVkIHBhcmFtLAotCQkJICBzMTYgKnJlZywKIAkJCSAgdW5zaWduZWQgKm1hc2ssCiAJCQkgIHVuc2lnbmVkICpiaXQpCiB7CiAJc3dpdGNoIChwYXJhbSkgewogCWNhc2UgUElOX0NPTkZJR19CSUFTX0RJU0FCTEU6Ci0JCSpyZWcgPSBnLT5jdGxfcmVnOwotCQkqYml0ID0gZy0+cHVsbF9iaXQ7Ci0JCSptYXNrID0gMzsKLQkJYnJlYWs7CiAJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9ET1dOOgotCQkqcmVnID0gZy0+Y3RsX3JlZzsKLQkJKmJpdCA9IGctPnB1bGxfYml0OwotCQkqbWFzayA9IDM7Ci0JCWJyZWFrOwogCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfVVA6Ci0JCSpyZWcgPSBnLT5jdGxfcmVnOwogCQkqYml0ID0gZy0+cHVsbF9iaXQ7CiAJCSptYXNrID0gMzsKIAkJYnJlYWs7CiAJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgotCQkqcmVnID0gZy0+Y3RsX3JlZzsKIAkJKmJpdCA9IGctPmRydl9iaXQ7CiAJCSptYXNrID0gNzsKIAkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX09VVFBVVDoKKwkJKmJpdCA9IGctPm9lX2JpdDsKKwkJKm1hc2sgPSAxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJJbnZhbGlkIGNvbmZpZyBwYXJhbSAlMDR4XG4iLCBwYXJhbSk7CiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCi0JaWYgKCpyZWcgPCAwKSB7Ci0JCWRldl9lcnIocGN0cmwtPmRldiwgIkNvbmZpZyBwYXJhbSAlMDR4IG5vdCBzdXBwb3J0ZWQgb24gZ3JvdXAgJXNcbiIsCi0JCQlwYXJhbSwgZy0+bmFtZSk7Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MSw4ICsyNDUsMTAgQEAKICNkZWZpbmUgTVNNX1BVTExfRE9XTgkxCiAjZGVmaW5lIE1TTV9QVUxMX1VQCTMKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1zbV9yZWd2YWxfdG9fZHJpdmVbXSA9IHsgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBtc21fZHJpdmVfdG9fcmVndmFsW10gPSB7IC0xLCAtMSwgMCwgLTEsIDEsIC0xLCAyLCAtMSwgMywgLTEsIDQsIC0xLCA1LCAtMSwgNiwgLTEsIDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBtc21fcmVndmFsX3RvX2RyaXZlKHUzMiB2YWwpCit7CisJcmV0dXJuICh2YWwgKyAxKSAqIDI7Cit9CiAKIHN0YXRpYyBpbnQgbXNtX2NvbmZpZ19ncm91cF9nZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAogCQkJCXVuc2lnbmVkIGludCBncm91cCwKQEAgLTI3NCwxNyArMjYwLDE2IEBACiAJdW5zaWduZWQgbWFzazsKIAl1bnNpZ25lZCBhcmc7CiAJdW5zaWduZWQgYml0OwotCXMxNiByZWc7CiAJaW50IHJldDsKIAl1MzIgdmFsOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbZ3JvdXBdOwogCi0JcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmcmVnLCAmbWFzaywgJmJpdCk7CisJcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmbWFzaywgJmJpdCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIHJlZyk7CisJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBnLT5jdGxfcmVnKTsKIAlhcmcgPSAodmFsID4+IGJpdCkgJiBtYXNrOwogCiAJLyogQ29udmVydCByZWdpc3RlciB2YWx1ZSB0byBwaW5jb25mIHZhbHVlICovCkBAIC0yOTksNyArMjg0LDE1IEBACiAJCWFyZyA9IGFyZyA9PSBNU01fUFVMTF9VUDsKIAkJYnJlYWs7CiAJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgotCQlhcmcgPSBtc21fcmVndmFsX3RvX2RyaXZlW2FyZ107CisJCWFyZyA9IG1zbV9yZWd2YWxfdG9fZHJpdmUoYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX09VVFBVVDoKKwkJLyogUGluIGlzIG5vdCBvdXRwdXQgKi8KKwkJaWYgKCFhcmcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CisJCWFyZyA9ICEhKHZhbCAmIEJJVChnLT5pbl9iaXQpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycihwY3RybC0+ZGV2LCAiVW5zdXBwb3J0ZWQgY29uZmlnIHBhcmFtZXRlcjogJXhcbiIsCkBAIC0zMjQsNyArMzE3LDYgQEAKIAl1bnNpZ25lZCBtYXNrOwogCXVuc2lnbmVkIGFyZzsKIAl1bnNpZ25lZCBiaXQ7Ci0JczE2IHJlZzsKIAlpbnQgcmV0OwogCXUzMiB2YWw7CiAJaW50IGk7CkBAIC0zMzUsNyArMzI3LDcgQEAKIAkJcGFyYW0gPSBwaW5jb25mX3RvX2NvbmZpZ19wYXJhbShjb25maWdzW2ldKTsKIAkJYXJnID0gcGluY29uZl90b19jb25maWdfYXJndW1lbnQoY29uZmlnc1tpXSk7CiAKLQkJcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmcmVnLCAmbWFzaywgJmJpdCk7CisJCXJldCA9IG1zbV9jb25maWdfcmVnKHBjdHJsLCBnLCBwYXJhbSwgJm1hc2ssICZiaXQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTM1MiwxMCArMzQ0LDI0IEBACiAJCQlicmVhazsKIAkJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgogCQkJLyogQ2hlY2sgZm9yIGludmFsaWQgdmFsdWVzICovCi0JCQlpZiAoYXJnID49IEFSUkFZX1NJWkUobXNtX2RyaXZlX3RvX3JlZ3ZhbCkpCisJCQlpZiAoYXJnID4gMTYgfHwgYXJnIDwgMiB8fCAoYXJnICUgMikgIT0gMCkKIAkJCQlhcmcgPSAtMTsKIAkJCWVsc2UKLQkJCQlhcmcgPSBtc21fZHJpdmVfdG9fcmVndmFsW2FyZ107CisJCQkJYXJnID0gKGFyZyAvIDIpIC0gMTsKKwkJCWJyZWFrOworCQljYXNlIFBJTl9DT05GSUdfT1VUUFVUOgorCQkJLyogc2V0IG91dHB1dCB2YWx1ZSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CisJCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CisJCQlpZiAoYXJnKQorCQkJCXZhbCB8PSBCSVQoZy0+b3V0X2JpdCk7CisJCQllbHNlCisJCQkJdmFsICY9IH5CSVQoZy0+b3V0X2JpdCk7CisJCQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJCQkvKiBlbmFibGUgb3V0cHV0ICovCisJCQlhcmcgPSAxOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJVbnN1cHBvcnRlZCBjb25maWcgcGFyYW1ldGVyOiAleFxuIiwKQEAgLTM3MCwxMCArMzc2LDEwIEBACiAJCX0KIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKLQkJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyByZWcpOworCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCQl2YWwgJj0gfihtYXNrIDw8IGJpdCk7CiAJCXZhbCB8PSBhcmcgPDwgYml0OwotCQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIHJlZyk7CisJCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+Y3RsX3JlZyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAJfQogCkBAIC00MDIsOCArNDA4LDYgQEAKIAl1MzIgdmFsOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbb2Zmc2V0XTsKLQlpZiAoV0FSTl9PTihnLT5pb19yZWcgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNDI0LDggKzQyOCw2IEBACiAJdTMyIHZhbDsKIAogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW29mZnNldF07Ci0JaWYgKFdBUk5fT04oZy0+aW9fcmVnIDwgMCkpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTQ1Miw4ICs0NTQsNiBAQAogCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tvZmZzZXRdOwotCWlmIChXQVJOX09OKGctPmlvX3JlZyA8IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKIAlyZXR1cm4gISEodmFsICYgQklUKGctPmluX2JpdCkpOwpAQCAtNDY3LDggKzQ2Nyw2IEBACiAJdTMyIHZhbDsKIAogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW29mZnNldF07Ci0JaWYgKFdBUk5fT04oZy0+aW9fcmVnIDwgMCkpCi0JCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC01MzQsNyArNTMyLDcgQEAKIAlwdWxsID0gKGN0bF9yZWcgPj4gZy0+cHVsbF9iaXQpICYgMzsKIAogCXNlcV9wcmludGYocywgIiAlLThzOiAlLTNzICVkIiwgZy0+bmFtZSwgaXNfb3V0ID8gIm91dCIgOiAiaW4iLCBmdW5jKTsKLQlzZXFfcHJpbnRmKHMsICIgJWRtQSIsIG1zbV9yZWd2YWxfdG9fZHJpdmVbZHJpdmVdKTsKKwlzZXFfcHJpbnRmKHMsICIgJWRtQSIsIG1zbV9yZWd2YWxfdG9fZHJpdmUoZHJpdmUpKTsKIAlzZXFfcHJpbnRmKHMsICIgJXMiLCBwdWxsc1twdWxsXSk7CiB9CiAKQEAgLTYxNyw4ICs2MTUsNiBAQAogCiAJcGN0cmwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JaWYgKFdBUk5fT04oZy0+aW50cl9jZmdfcmVnIDwgMCkpCi0JCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC02NDAsOCArNjM2LDYgQEAKIAogCXBjdHJsID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbZC0+aHdpcnFdOwotCWlmIChXQVJOX09OKGctPmludHJfc3RhdHVzX3JlZyA8IDApKQotCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNjY3LDggKzY2MSw2IEBACiAKIAlwY3RybCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW2QtPmh3aXJxXTsKLQlpZiAoV0FSTl9PTihnLT5pbnRyX3N0YXR1c19yZWcgPCAwKSkKLQkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTY5Myw4ICs2ODUsNiBAQAogCiAJcGN0cmwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JaWYgKFdBUk5fT04oZy0+aW50cl9jZmdfcmVnIDwgMCkpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTc4MywyMiArNzczLDEyIEBACiB7CiAJc3RydWN0IG1zbV9waW5jdHJsICpwY3RybDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIG5ncGlvOwogCiAJcGN0cmwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQluZ3BpbyA9IHBjdHJsLT5jaGlwLm5ncGlvOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAob24pIHsKLQkJaWYgKGJpdG1hcF9lbXB0eShwY3RybC0+d2FrZV9pcnFzLCBuZ3BpbykpCi0JCQllbmFibGVfaXJxX3dha2UocGN0cmwtPmlycSk7Ci0JCXNldF9iaXQoZC0+aHdpcnEsIHBjdHJsLT53YWtlX2lycXMpOwotCX0gZWxzZSB7Ci0JCWNsZWFyX2JpdChkLT5od2lycSwgcGN0cmwtPndha2VfaXJxcyk7Ci0JCWlmIChiaXRtYXBfZW1wdHkocGN0cmwtPndha2VfaXJxcywgbmdwaW8pKQotCQkJZGlzYWJsZV9pcnFfd2FrZShwY3RybC0+aXJxKTsKLQl9CisJaXJxX3NldF9pcnFfd2FrZShwY3RybC0+aXJxLCBvbik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC04NjksNiArODQ5LDEyIEBACiAJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKIH0KIAorLyoKKyAqIFRoaXMgbG9jayBjbGFzcyB0ZWxscyBsb2NrZGVwIHRoYXQgR1BJTyBpcnFzIGFyZSBpbiBhIGRpZmZlcmVudAorICogY2F0ZWdvcnkgdGhhbiB0aGVpciBwYXJlbnRzLCBzbyBpdCB3b24ndCByZXBvcnQgZmFsc2UgcmVjdXJzaW9uLgorICovCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGdwaW9fbG9ja19jbGFzczsKKwogc3RhdGljIGludCBtc21fZ3Bpb19pbml0KHN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwpCiB7CiAJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKQEAgLTg3NiwxMCArODYyLDE0IEBACiAJaW50IHJldDsKIAlpbnQgaTsKIAlpbnQgcjsKKwl1bnNpZ25lZCBuZ3BpbyA9IHBjdHJsLT5zb2MtPm5ncGlvczsKKworCWlmIChXQVJOX09OKG5ncGlvID4gTUFYX05SX0dQSU8pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNoaXAgPSAmcGN0cmwtPmNoaXA7CiAJY2hpcC0+YmFzZSA9IDA7Ci0JY2hpcC0+bmdwaW8gPSBwY3RybC0+c29jLT5uZ3Bpb3M7CisJY2hpcC0+bmdwaW8gPSBuZ3BpbzsKIAljaGlwLT5sYWJlbCA9IGRldl9uYW1lKHBjdHJsLT5kZXYpOwogCWNoaXAtPmRldiA9IHBjdHJsLT5kZXY7CiAJY2hpcC0+b3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTkwNyw2ICs4OTcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPm5ncGlvOyBpKyspIHsKIAkJaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKHBjdHJsLT5kb21haW4sIGkpOworCQlpcnFfc2V0X2xvY2tkZXBfY2xhc3MoaXJxLCAmZ3Bpb19sb2NrX2NsYXNzKTsKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJm1zbV9ncGlvX2lycV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIHBjdHJsKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbS5oCmluZGV4IDIwNmU3ODJlLi44ZmJlOWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc20uaApAQCAtMTMsMTAgKzEzLDcgQEAKICNpZm5kZWYgX19QSU5DVFJMX01TTV9IX18KICNkZWZpbmUgX19QSU5DVFJMX01TTV9IX18KIAotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9tYWNoaW5lLmg+CitzdHJ1Y3QgcGluY3RybF9waW5fZGVzYzsKIAogLyoqCiAgKiBzdHJ1Y3QgbXNtX2Z1bmN0aW9uIC0gYSBwaW5tdXggZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbTh4NzQuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW1zbTh4NzQuYwppbmRleCBmOTQ0YmYyLi5kZGU1NTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1tc204eDc0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbXNtOHg3NC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgogCiAjaW5jbHVkZSAicGluY3RybC1tc20uaCIKIApAQCAtNDA2LDYgKzQwNSw3IEBACiAJTVNNX01VWF9ibHNwX2kyYzYsCiAJTVNNX01VWF9ibHNwX2kyYzExLAogCU1TTV9NVVhfYmxzcF9zcGkxLAorCU1TTV9NVVhfYmxzcF9zcGk4LAogCU1TTV9NVVhfYmxzcF91YXJ0MiwKIAlNU01fTVVYX2Jsc3BfdWFydDgsCiAJTVNNX01VWF9zbGltYnVzLApAQCAtNDE2LDYgKzQxNiw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfaTJjNl9ncm91cHNbXSA9IHsgImdwaW8yOSIsICJncGlvMzAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfaTJjMTFfZ3JvdXBzW10gPSB7ICJncGlvODMiLCAiZ3Bpbzg0IiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3NwaTFfZ3JvdXBzW10gPSB7ICJncGlvMCIsICJncGlvMSIsICJncGlvMiIsICJncGlvMyIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9zcGk4X2dyb3Vwc1tdID0geworCSJncGlvNDUiLCAiZ3BpbzQ2IiwgImdwaW80NyIsICJncGlvNDgiCit9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3VhcnQyX2dyb3Vwc1tdID0geyAiZ3BpbzQiLCAiZ3BpbzUiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDhfZ3JvdXBzW10gPSB7ICJncGlvNDUiLCAiZ3BpbzQ2IiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbGltYnVzX2dyb3Vwc1tdID0geyAiZ3BpbzcwIiwgImdwaW83MSIgfTsKQEAgLTQyNSw2ICs0MjgsNyBAQAogCUZVTkNUSU9OKGJsc3BfaTJjNiksCiAJRlVOQ1RJT04oYmxzcF9pMmMxMSksCiAJRlVOQ1RJT04oYmxzcF9zcGkxKSwKKwlGVU5DVElPTihibHNwX3NwaTgpLAogCUZVTkNUSU9OKGJsc3BfdWFydDIpLAogCUZVTkNUSU9OKGJsc3BfdWFydDgpLAogCUZVTkNUSU9OKHNsaW1idXMpLApAQCAtNDc2LDEwICs0ODAsMTAgQEAKIAlQSU5HUk9VUCg0MiwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg0MywgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg0NCwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0NSwgIE5BLCBibHNwX3VhcnQ4LCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDQ2LCAgTkEsIGJsc3BfdWFydDgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDcsICBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDgsICBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDUsICBibHNwX3NwaTgsIGJsc3BfdWFydDgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDYsICBibHNwX3NwaTgsIGJsc3BfdWFydDgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDcsICBibHNwX3NwaTgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDQ4LCAgYmxzcF9zcGk4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg0OSwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg1MCwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlQSU5HUk9VUCg1MSwgIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW5vbWFkaWsuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLW5vbWFkaWsuYwppbmRleCA1M2ExMTExLi5jZWM3NzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1ub21hZGlrLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtbm9tYWRpay5jCkBAIC0yMDM1LDI3ICsyMDM1LDI5IEBACiAJe30sCiB9OwogCi1zdGF0aWMgaW50IG5ta19waW5jdHJsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBubWtfcGluY3RybF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgbm1rX3BpbmN0cmwgKm5wY3Q7CiAKLQlucGN0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJbnBjdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWlmICghbnBjdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gcGluY3RybF9mb3JjZV9zbGVlcChucGN0LT5wY3RsKTsKIH0KIAotc3RhdGljIGludCBubWtfcGluY3RybF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgbm1rX3BpbmN0cmxfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgbm1rX3BpbmN0cmwgKm5wY3Q7CiAKLQlucGN0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJbnBjdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWlmICghbnBjdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gcGluY3RybF9mb3JjZV9kZWZhdWx0KG5wY3QtPnBjdGwpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgbm1rX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTIxNDQsMTcgKzIxNDYsMTggQEAKIAkucHJvYmUgPSBubWtfZ3Bpb19wcm9iZSwKIH07CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhubWtfcGluY3RybF9wbV9vcHMsCisJCQlubWtfcGluY3RybF9zdXNwZW5kLAorCQkJbm1rX3BpbmN0cmxfcmVzdW1lKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbm1rX3BpbmN0cmxfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkubmFtZSA9ICJwaW5jdHJsLW5vbWFkaWsiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBubWtfcGluY3RybF9tYXRjaCwKKwkJLnBtID0gJm5ta19waW5jdHJsX3BtX29wcywKIAl9LAogCS5wcm9iZSA9IG5ta19waW5jdHJsX3Byb2JlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gbm1rX3BpbmN0cmxfc3VzcGVuZCwKLQkucmVzdW1lID0gbm1rX3BpbmN0cmxfcmVzdW1lLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBubWtfZ3Bpb19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmMKaW5kZXggNDdlYzJlOC4uMDMyNGQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuYwpAQCAtMTEyMCw2ICsxMTIwLDggQEAKIAkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczR4MTJfcGluX2N0cmwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI1MC1waW5jdHJsIiwKIAkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczUyNTBfcGluX2N0cmwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI2MC1waW5jdHJsIiwKKwkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczUyNjBfcGluX2N0cmwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQyMC1waW5jdHJsIiwKIAkJLmRhdGEgPSAodm9pZCAqKWV4eW5vczU0MjBfcGluX2N0cmwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsczVwdjIxMC1waW5jdHJsIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNhbXN1bmcuaAppbmRleCAzMDYyMmQ5Li5iYWI5YzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zYW1zdW5nLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2Ftc3VuZy5oCkBAIC0yNTQsNiArMjU0LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBleHlub3M0MjEwX3Bpbl9jdHJsW107CiBleHRlcm4gc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNHgxMl9waW5fY3RybFtdOwogZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczUyNTBfcGluX2N0cmxbXTsKK2V4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBleHlub3M1MjYwX3Bpbl9jdHJsW107CiBleHRlcm4gc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNTQyMF9waW5fY3RybFtdOwogZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIHMzYzY0eHhfcGluX2N0cmxbXTsKIGV4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBzM2MyNDEyX3Bpbl9jdHJsW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zaW5nbGUuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jCmluZGV4IGRlNjQ1OTYuLjgxMDc1ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jCkBAIC02NjIsNiArNjYyLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6CiAJCWNhc2UgUElOX0NPTkZJR19TTEVXX1JBVEU6CisJCWNhc2UgUElOX0NPTkZJR19MT1dfUE9XRVJfTU9ERToKIAkJZGVmYXVsdDoKIAkJCSpjb25maWcgPSBkYXRhOwogCQkJYnJlYWs7CkBAIC02OTksNiArNzAwLDcgQEAKIAkJCWNhc2UgUElOX0NPTkZJR19JTlBVVF9TQ0hNSVRUOgogCQkJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgogCQkJY2FzZSBQSU5fQ09ORklHX1NMRVdfUkFURToKKwkJCWNhc2UgUElOX0NPTkZJR19MT1dfUE9XRVJfTU9ERToKIAkJCQlzaGlmdCA9IGZmcyhmdW5jLT5jb25mW2ldLm1hc2spIC0gMTsKIAkJCQlkYXRhICY9IH5mdW5jLT5jb25mW2ldLm1hc2s7CiAJCQkJZGF0YSB8PSAoYXJnIDw8IHNoaWZ0KSAmIGZ1bmMtPmNvbmZbaV0ubWFzazsKQEAgLTExMDEsNiArMTEwMyw3IEBACiAJCXsgInBpbmN0cmwtc2luZ2xlLGRyaXZlLXN0cmVuZ3RoIiwgUElOX0NPTkZJR19EUklWRV9TVFJFTkdUSCwgfSwKIAkJeyAicGluY3RybC1zaW5nbGUsc2xldy1yYXRlIiwgUElOX0NPTkZJR19TTEVXX1JBVEUsIH0sCiAJCXsgInBpbmN0cmwtc2luZ2xlLGlucHV0LXNjaG1pdHQiLCBQSU5fQ09ORklHX0lOUFVUX1NDSE1JVFQsIH0sCisJCXsgInBpbmN0cmwtc2luZ2xlLGxvdy1wb3dlci1tb2RlIiwgUElOX0NPTkZJR19MT1dfUE9XRVJfTU9ERSwgfSwKIAl9OwogCXN0cnVjdCBwY3NfY29uZl90eXBlIHByb3A0W10gPSB7CiAJCXsgInBpbmN0cmwtc2luZ2xlLGJpYXMtcHVsbHVwIiwgUElOX0NPTkZJR19CSUFTX1BVTExfVVAsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYwppbmRleCAzMjBjMjczLi5iZDcyNWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMKQEAgLTEzLDcgKzEzLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZGVzYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CkBAIC0yNjYsMTEgKzI3MSw1OSBAQAogCXN0cnVjdCBzdF9waW5jb25mCSpwaW5fY29uZjsKIH07CiAKKy8qCisgKiBFZGdlIHRyaWdnZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IGhhcmR3YXJlIGxldmVsLCBpdCBpcyBzdXBwb3J0ZWQgYnkKKyAqIHNvZnR3YXJlIGJ5IGV4cGxvaXRpbmcgdGhlIGxldmVsIHRyaWdnZXIgc3VwcG9ydCBpbiBoYXJkd2FyZS4KKyAqIFNvZnR3YXJlIHVzZXMgYSB2aXJ0dWFsIHJlZ2lzdGVyIChFREdFX0NPTkYpIGZvciBlZGdlIHRyaWdnZXIgY29uZmlndXJhdGlvbgorICogb2YgZWFjaCBncGlvIHBpbiBpbiBhIEdQSU8gYmFuay4KKyAqCisgKiBFYWNoIGJhbmsgaGFzIGEgMzIgYml0IEVER0VfQ09ORiByZWdpc3RlciB3aGljaCBpcyBkaXZpZGVkIGluIHRvIDggcGFydHMgb2YKKyAqIDQtYml0cy4gRWFjaCA0LWJpdCBzcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIGVhY2ggcGluIGluIGEgZ3BpbyBiYW5rLgorICoKKyAqIGJpdCBhbGxvY2F0aW9uIHBlciBwaW4gaXM6CisgKiBCaXRzOiAgWzAgLSAzXSB8IFs0IC0gN10gIFs4IC0gMTFdIC4uLiAuLi4gLi4uIC4uLiAgWyAyOCAtIDMxXQorICogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgIHwgIHBpbi0wICB8ICBwaW4tMiB8IHBpbi0zICB8IC4uLiAuLi4gLi4uIC4uLiB8IHBpbiAtNyB8CisgKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBBIHBpbiBjYW4gaGF2ZSBvbmUgb2YgZm9sbG93aW5nIHRoZSB2YWx1ZXMgaW4gaXRzIGVkZ2UgY29uZmlndXJhdGlvbiBmaWVsZC4KKyAqCisgKgktLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJWzAtM10JLSBEZXNjcmlwdGlvbgorICoJLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCTAwMDAJLSBObyBlZGdlIElSUS4KKyAqCTAwMDEJLSBGYWxsaW5nIGVkZ2UgSVJRLgorICoJMDAxMAktIFJpc2luZyBlZGdlIElSUS4KKyAqCTAwMTEJLSBSaXNpbmcgYW5kIEZhbGxpbmcgZWRnZSBJUlEuCisgKgktLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4JNAorI2RlZmluZSBTVF9JUlFfRURHRV9NQVNLCQkweGYKKyNkZWZpbmUgU1RfSVJRX0VER0VfRkFMTElORwkJQklUKDApCisjZGVmaW5lIFNUX0lSUV9FREdFX1JJU0lORwkJQklUKDEpCisjZGVmaW5lIFNUX0lSUV9FREdFX0JPVEgJCShCSVQoMCkgfCBCSVQoMSkpCisKKyNkZWZpbmUgU1RfSVJRX1JJU0lOR19FREdFX0NPTkYocGluKSBcCisJKFNUX0lSUV9FREdFX1JJU0lORyA8PCAocGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pKQorCisjZGVmaW5lIFNUX0lSUV9GQUxMSU5HX0VER0VfQ09ORihwaW4pIFwKKwkoU1RfSVJRX0VER0VfRkFMTElORyA8PCAocGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pKQorCisjZGVmaW5lIFNUX0lSUV9CT1RIX0VER0VfQ09ORihwaW4pIFwKKwkoU1RfSVJRX0VER0VfQk9USCA8PCAocGluICogU1RfSVJRX0VER0VfQ09ORl9CSVRTX1BFUl9QSU4pKQorCisjZGVmaW5lIFNUX0lSUV9FREdFX0NPTkYoY29uZiwgcGluKSBcCisJKGNvbmYgPj4gKHBpbiAqIFNUX0lSUV9FREdFX0NPTkZfQklUU19QRVJfUElOKSAmIFNUX0lSUV9FREdFX01BU0spCisKIHN0cnVjdCBzdF9ncGlvX2JhbmsgewogCXN0cnVjdCBncGlvX2NoaXAJCWdwaW9fY2hpcDsKIAlzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlCXJhbmdlOwogCXZvaWQgX19pb21lbQkJCSpiYXNlOwogCXN0cnVjdCBzdF9waW9fY29udHJvbAkJcGM7CisJc3RydWN0CWlycV9kb21haW4JCSpkb21haW47CisJdW5zaWduZWQgbG9uZwkJCWlycV9lZGdlX2NvbmY7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICAgICBsb2NrOwogfTsKIAogc3RydWN0IHN0X3BpbmN0cmwgewpAQCAtMjg0LDYgKzMzNyw3IEBACiAJaW50CQkJCW5ncm91cHM7CiAJc3RydWN0IHJlZ21hcAkJCSpyZWdtYXA7CiAJY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YQkqZGF0YTsKKwl2b2lkIF9faW9tZW0JCQkqaXJxbXV4X2Jhc2U7CiB9OwogCiAvKiBTT0Mgc3BlY2lmaWMgZGF0YSAqLwpAQCAtMzMwLDEyICszODQsMjUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDE2X2RhdGEgPSB7CiAJLnJ0X3N0eWxlCT0gc3RfcmV0aW1lX3N0eWxlX2RlZGljYXRlZCwKIAkuaW5wdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCi0JLm5pbnB1dF9kZWxheXMJPSAxNCwKKwkubmlucHV0X2RlbGF5cwk9IEFSUkFZX1NJWkUoc3RpaDQxNl9kZWxheXMpLAogCS5vdXRwdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCi0JLm5vdXRwdXRfZGVsYXlzID0gMTQsCisJLm5vdXRwdXRfZGVsYXlzID0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCiAJLmFsdCA9IDAsIC5vZSA9IDQwLCAucHUgPSA1MCwgLm9kID0gNjAsIC5ydCA9IDEwMCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhIHN0aWg0MDdfZmxhc2hkYXRhID0geworCS5ydF9zdHlsZQk9IHN0X3JldGltZV9zdHlsZV9ub25lLAorCS5pbnB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKKwkubmlucHV0X2RlbGF5cwk9IEFSUkFZX1NJWkUoc3RpaDQxNl9kZWxheXMpLAorCS5vdXRwdXRfZGVsYXlzCT0gc3RpaDQxNl9kZWxheXMsCisJLm5vdXRwdXRfZGVsYXlzID0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCisJLmFsdCA9IDAsCisJLm9lID0gLTEsIC8qIE5vdCBBdmFpbGFibGUgKi8KKwkucHUgPSAtMSwgLyogTm90IEF2YWlsYWJsZSAqLworCS5vZCA9IDYwLAorCS5ydCA9IDEwMCwKK307CisKIC8qIExvdyBsZXZlbCBmdW5jdGlvbnMuLiAqLwogc3RhdGljIGlubGluZSBpbnQgc3RfZ3Bpb19iYW5rKGludCBncGlvKQogewpAQCAtMzU2LDI1ICs0MjMsMjkgQEAKIAl1bnNpZ25lZCBpbnQgb2VfdmFsdWUsIHB1X3ZhbHVlLCBvZF92YWx1ZTsKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSBCSVQocGluKTsKIAotCXJlZ21hcF9maWVsZF9yZWFkKG91dHB1dF9lbmFibGUsICZvZV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3JlYWQocHVsbF91cCwgJnB1X3ZhbHVlKTsKLQlyZWdtYXBfZmllbGRfcmVhZChvcGVuX2RyYWluLCAmb2RfdmFsdWUpOworCWlmIChvdXRwdXRfZW5hYmxlKSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKG91dHB1dF9lbmFibGUsICZvZV92YWx1ZSk7CisJCW9lX3ZhbHVlICY9IH5tYXNrOworCQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9PRSkKKwkJCW9lX3ZhbHVlIHw9IG1hc2s7CisJCXJlZ21hcF9maWVsZF93cml0ZShvdXRwdXRfZW5hYmxlLCBvZV92YWx1ZSk7CisJfQogCi0JLyogQ2xlYXIgb2xkIHZhbHVlcyAqLwotCW9lX3ZhbHVlICY9IH5tYXNrOwotCXB1X3ZhbHVlICY9IH5tYXNrOwotCW9kX3ZhbHVlICY9IH5tYXNrOworCWlmIChwdWxsX3VwKSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKHB1bGxfdXAsICZwdV92YWx1ZSk7CisJCXB1X3ZhbHVlICY9IH5tYXNrOworCQlpZiAoY29uZmlnICYgU1RfUElOQ09ORl9QVSkKKwkJCXB1X3ZhbHVlIHw9IG1hc2s7CisJCXJlZ21hcF9maWVsZF93cml0ZShwdWxsX3VwLCBwdV92YWx1ZSk7CisJfQogCi0JaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfT0UpCi0JCW9lX3ZhbHVlIHw9IG1hc2s7Ci0JaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfUFUpCi0JCXB1X3ZhbHVlIHw9IG1hc2s7Ci0JaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfT0QpCi0JCW9kX3ZhbHVlIHw9IG1hc2s7Ci0KLQlyZWdtYXBfZmllbGRfd3JpdGUob3V0cHV0X2VuYWJsZSwgb2VfdmFsdWUpOwotCXJlZ21hcF9maWVsZF93cml0ZShwdWxsX3VwLCBwdV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3dyaXRlKG9wZW5fZHJhaW4sIG9kX3ZhbHVlKTsKKwlpZiAob3Blbl9kcmFpbikgeworCQlyZWdtYXBfZmllbGRfcmVhZChvcGVuX2RyYWluLCAmb2RfdmFsdWUpOworCQlvZF92YWx1ZSAmPSB+bWFzazsKKwkJaWYgKGNvbmZpZyAmIFNUX1BJTkNPTkZfT0QpCisJCQlvZF92YWx1ZSB8PSBtYXNrOworCQlyZWdtYXBfZmllbGRfd3JpdGUob3Blbl9kcmFpbiwgb2RfdmFsdWUpOworCX0KIH0KIAogc3RhdGljIHZvaWQgc3RfcGN0bF9zZXRfZnVuY3Rpb24oc3RydWN0IHN0X3Bpb19jb250cm9sICpwYywKQEAgLTM4NSw2ICs0NTYsOSBAQAogCWludCBwaW4gPSBzdF9ncGlvX3BpbihwaW5faWQpOwogCWludCBvZmZzZXQgPSBwaW4gKiA0OwogCisJaWYgKCFhbHQpCisJCXJldHVybjsKKwogCXJlZ21hcF9maWVsZF9yZWFkKGFsdCwgJnZhbCk7CiAJdmFsICY9IH4oMHhmIDw8IG9mZnNldCk7CiAJdmFsIHw9IGZ1bmN0aW9uIDw8IG9mZnNldDsKQEAgLTUyMiwxNyArNTk2LDIzIEBACiB7CiAJdW5zaWduZWQgaW50IG9lX3ZhbHVlLCBwdV92YWx1ZSwgb2RfdmFsdWU7CiAKLQlyZWdtYXBfZmllbGRfcmVhZChwYy0+b2UsICZvZV92YWx1ZSk7Ci0JcmVnbWFwX2ZpZWxkX3JlYWQocGMtPnB1LCAmcHVfdmFsdWUpOwotCXJlZ21hcF9maWVsZF9yZWFkKHBjLT5vZCwgJm9kX3ZhbHVlKTsKKwlpZiAocGMtPm9lKSB7CisJCXJlZ21hcF9maWVsZF9yZWFkKHBjLT5vZSwgJm9lX3ZhbHVlKTsKKwkJaWYgKG9lX3ZhbHVlICYgQklUKHBpbikpCisJCQlTVF9QSU5DT05GX1BBQ0tfT0UoKmNvbmZpZyk7CisJfQogCi0JaWYgKG9lX3ZhbHVlICYgQklUKHBpbikpCi0JCVNUX1BJTkNPTkZfUEFDS19PRSgqY29uZmlnKTsKLQlpZiAocHVfdmFsdWUgJiBCSVQocGluKSkKLQkJU1RfUElOQ09ORl9QQUNLX1BVKCpjb25maWcpOwotCWlmIChvZF92YWx1ZSAmIEJJVChwaW4pKQotCQlTVF9QSU5DT05GX1BBQ0tfT0QoKmNvbmZpZyk7CisJaWYgKHBjLT5wdSkgeworCQlyZWdtYXBfZmllbGRfcmVhZChwYy0+cHUsICZwdV92YWx1ZSk7CisJCWlmIChwdV92YWx1ZSAmIEJJVChwaW4pKQorCQkJU1RfUElOQ09ORl9QQUNLX1BVKCpjb25maWcpOworCX0KIAorCWlmIChwYy0+b2QpIHsKKwkJcmVnbWFwX2ZpZWxkX3JlYWQocGMtPm9kLCAmb2RfdmFsdWUpOworCQlpZiAob2RfdmFsdWUgJiBCSVQocGluKSkKKwkJCVNUX1BJTkNPTkZfUEFDS19PRCgqY29uZmlnKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgc3RfcGluY29uZl9nZXRfcmV0aW1lX3BhY2tlZChzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbywKQEAgLTEwNTEsOCArMTEzMSwyMSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IHN0X3BhcnNlX3N5c2NmZ3Moc3RydWN0IHN0X3BpbmN0cmwgKmluZm8sCi0JCWludCBiYW5rLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorCitzdGF0aWMgc3RydWN0IHJlZ21hcF9maWVsZCAqc3RfcGNfZ2V0X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50IGJhbmssCisJCQkJCSAgICBpbnQgZGF0YSwgaW50IGxzYiwgaW50IG1zYikKK3sKKwlzdHJ1Y3QgcmVnX2ZpZWxkIHJlZyA9IFJFR19GSUVMRCgoZGF0YSArIGJhbmspICogNCwgbHNiLCBtc2IpOworCisJaWYgKGRhdGEgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIHJlZ21hcCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc3RfcGFyc2Vfc3lzY2ZncyhzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbywgaW50IGJhbmssCisJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAqZGF0YSA9IGluZm8tPmRhdGE7CiAJLyoqCkBAIC0xMDYyLDI5ICsxMTU1LDIxIEBACiAJICovCiAJaW50IGxzYiA9IChiYW5rJTQpICogU1RfR1BJT19QSU5TX1BFUl9CQU5LOwogCWludCBtc2IgPSBsc2IgKyBTVF9HUElPX1BJTlNfUEVSX0JBTksgLSAxOwotCXN0cnVjdCByZWdfZmllbGQgYWx0X3JlZyA9IFJFR19GSUVMRCgoZGF0YS0+YWx0ICsgYmFuaykgKiA0LCAwLCAzMSk7Ci0Jc3RydWN0IHJlZ19maWVsZCBvZV9yZWcgPSBSRUdfRklFTEQoKGRhdGEtPm9lICsgYmFuay80KSAqIDQsIGxzYiwgbXNiKTsKLQlzdHJ1Y3QgcmVnX2ZpZWxkIHB1X3JlZyA9IFJFR19GSUVMRCgoZGF0YS0+cHUgKyBiYW5rLzQpICogNCwgbHNiLCBtc2IpOwotCXN0cnVjdCByZWdfZmllbGQgb2RfcmVnID0gUkVHX0ZJRUxEKChkYXRhLT5vZCArIGJhbmsvNCkgKiA0LCBsc2IsIG1zYik7CiAJc3RydWN0IHN0X3Bpb19jb250cm9sICpwYyA9ICZpbmZvLT5iYW5rc1tiYW5rXS5wYzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwICA9IGluZm8tPnJlZ21hcDsKIAotCXBjLT5hbHQgPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIHJlZ21hcCwgYWx0X3JlZyk7Ci0JcGMtPm9lID0gZGV2bV9yZWdtYXBfZmllbGRfYWxsb2MoZGV2LCByZWdtYXAsIG9lX3JlZyk7Ci0JcGMtPnB1ID0gZGV2bV9yZWdtYXBfZmllbGRfYWxsb2MoZGV2LCByZWdtYXAsIHB1X3JlZyk7Ci0JcGMtPm9kID0gZGV2bV9yZWdtYXBfZmllbGRfYWxsb2MoZGV2LCByZWdtYXAsIG9kX3JlZyk7Ci0KLQlpZiAoSVNfRVJSKHBjLT5hbHQpIHx8IElTX0VSUihwYy0+b2UpIHx8Ci0JCQlJU19FUlIocGMtPnB1KSB8fCBJU19FUlIocGMtPm9kKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcGMtPmFsdCA9IHN0X3BjX2dldF92YWx1ZShkZXYsIHJlZ21hcCwgYmFuaywgZGF0YS0+YWx0LCAwLCAzMSk7CisJcGMtPm9lID0gc3RfcGNfZ2V0X3ZhbHVlKGRldiwgcmVnbWFwLCBiYW5rLzQsIGRhdGEtPm9lLCBsc2IsIG1zYik7CisJcGMtPnB1ID0gc3RfcGNfZ2V0X3ZhbHVlKGRldiwgcmVnbWFwLCBiYW5rLzQsIGRhdGEtPnB1LCBsc2IsIG1zYik7CisJcGMtPm9kID0gc3RfcGNfZ2V0X3ZhbHVlKGRldiwgcmVnbWFwLCBiYW5rLzQsIGRhdGEtPm9kLCBsc2IsIG1zYik7CiAKIAkvKiByZXRpbWUgYXZhaWFibGUgZm9yIGFsbCBwaW5zIGJ5IGRlZmF1bHQgKi8KIAlwYy0+cnRfcGluX21hc2sgPSAweGZmOwogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3QscmV0aW1lLXBpbi1tYXNrIiwgJnBjLT5ydF9waW5fbWFzayk7CiAJc3RfcGN0bF9kdF9zZXR1cF9yZXRpbWUoaW5mbywgYmFuaywgcGMpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogfQogCiAvKgpAQCAtMTIwMCw2ICsxMjg1LDE5NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN0X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gZ3Bpb19jaGlwX3RvX2JhbmsoY2hpcCk7CisJaW50IGlycSA9IC1FTlhJTzsKKworCWlmIChvZmZzZXQgPCBjaGlwLT5uZ3BpbykKKwkJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhiYW5rLT5kb21haW4sIG9mZnNldCk7CisKKwlkZXZfaW5mbyhjaGlwLT5kZXYsICIlczogcmVxdWVzdCBJUlEgZm9yIEdQSU8gJWQsIHJldHVybiAlZFxuIiwKKwkJCQljaGlwLT5sYWJlbCwgb2Zmc2V0ICsgY2hpcC0+YmFzZSwgaXJxKTsKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgdm9pZCBzdF9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwl3cml0ZWwoQklUKGQtPmh3aXJxKSwgYmFuay0+YmFzZSArIFJFR19QSU9fQ0xSX1BNQVNLKTsKK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwl3cml0ZWwoQklUKGQtPmh3aXJxKSwgYmFuay0+YmFzZSArIFJFR19QSU9fU0VUX1BNQVNLKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzdF9ncGlvX2lycV9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwlpZiAoZ3Bpb19sb2NrX2FzX2lycSgmYmFuay0+Z3Bpb19jaGlwLCBkLT5od2lycSkpCisJCWRldl9lcnIoYmFuay0+Z3Bpb19jaGlwLmRldiwKKwkJCSJ1bmFibGUgdG8gbG9jayBIVyBJUlEgJWx1IGZvciBJUlFcbiIsCisJCQlkLT5od2lycSk7CisKKwlzdF9ncGlvX2lycV91bm1hc2soZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFfc2h1dGRvd24oc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCXN0X2dwaW9faXJxX21hc2soZCk7CisJZ3Bpb191bmxvY2tfYXNfaXJxKCZiYW5rLT5ncGlvX2NoaXAsIGQtPmh3aXJxKTsKK30KKworc3RhdGljIGludCBzdF9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHR5cGUpCit7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvbXAsIHBpbiA9IGQtPmh3aXJxOworCXUzMiB2YWw7CisJdTMyIHBpbl9lZGdlX2NvbmYgPSAwOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQljb21wID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCWNvbXAgPSAwOworCQlwaW5fZWRnZV9jb25mID0gU1RfSVJRX0ZBTExJTkdfRURHRV9DT05GKHBpbik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQljb21wID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJY29tcCA9IDE7CisJCXBpbl9lZGdlX2NvbmYgPSBTVF9JUlFfUklTSU5HX0VER0VfQ09ORihwaW4pOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJY29tcCA9IHN0X2dwaW9fZ2V0KCZiYW5rLT5ncGlvX2NoaXAsIHBpbik7CisJCXBpbl9lZGdlX2NvbmYgPSBTVF9JUlFfQk9USF9FREdFX0NPTkYocGluKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKKwliYW5rLT5pcnFfZWRnZV9jb25mICY9ICB+KFNUX0lSUV9FREdFX01BU0sgPDwgKAorCQkJCXBpbiAqIFNUX0lSUV9FREdFX0NPTkZfQklUU19QRVJfUElOKSk7CisJYmFuay0+aXJxX2VkZ2VfY29uZiB8PSBwaW5fZWRnZV9jb25mOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHJlYWRsKGJhbmstPmJhc2UgKyBSRUdfUElPX1BDT01QKTsKKwl2YWwgJj0gfkJJVChwaW4pOworCXZhbCB8PSAoY29tcCA8PCBwaW4pOworCXdyaXRlbCh2YWwsIGJhbmstPmJhc2UgKyBSRUdfUElPX1BDT01QKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQXMgZWRnZSB0cmlnZ2VycyBhcmUgbm90IHN1cHBvcnRlZCBhdCBoYXJkd2FyZSBsZXZlbCwgaXQgaXMgc3VwcG9ydGVkIGJ5CisgKiBzb2Z0d2FyZSBieSBleHBsb2l0aW5nIHRoZSBsZXZlbCB0cmlnZ2VyIHN1cHBvcnQgaW4gaGFyZHdhcmUuCisgKgorICogU3RlcHMgZm9yIGRldGVjdGlvbiByYWlzaW5nIGVkZ2UgaW50ZXJydXB0IGluIHNvZnR3YXJlLgorICoKKyAqIFN0ZXAgMTogQ09ORklHVVJFIHBpbiB0byBkZXRlY3QgbGV2ZWwgTE9XIGludGVycnVwdHMuCisgKgorICogU3RlcCAyOiBERVRFQ1QgbGV2ZWwgTE9XIGludGVycnVwdCBhbmQgaW4gaXJxbXV4L2dwaW8gYmFuayBpbnRlcnJ1cHQgaGFuZGxlciwKKyAqIGlmIHRoZSB2YWx1ZSBvZiBwaW4gaXMgbG93LCB0aGVuIENPTkZJR1VSRSBwaW4gZm9yIGxldmVsIEhJR0ggaW50ZXJydXB0LgorICogSUdOT1JFIGNhbGxpbmcgdGhlIGFjdHVhbCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHBpbiBhdCB0aGlzIHN0YWdlLgorICoKKyAqIFN0ZXAgMzogREVURUNUIGxldmVsIEhJR0ggaW50ZXJydXB0IGFuZCBpbiBpcnFtdXgvZ3Bpby1iYW5rIGludGVycnVwdCBoYW5kbGVyCisgKiBpZiB0aGUgdmFsdWUgb2YgcGluIGlzIEhJR0gsIENPTkZJR1VSRSBwaW4gZm9yIGxldmVsIExPVyBpbnRlcnJ1cHQgYW5kIHRoZW4KKyAqIERJU1BBVENIIHRoZSBpbnRlcnJ1cHQgdG8gdGhlIGludGVycnVwdCBoYW5kbGVyIG9mIHRoZSBwaW4uCisgKgorICoJCSBzdGVwLTEgIF9fX19fX19fICAgICBfX19fX19fX19fCisgKgkJCQl8ICAgICB8IHN0ZXAgLSAzCisgKgkJCSAgICAgICAgfCAgICAgfAorICoJCQlzdGVwIC0yIHxfX19fX3wKKyAqCisgKiBmYWxsaW5nIGVkZ2UgaXMgYWxzbyBkZXRlY3RlZCBpbnQgdGhlIHNhbWUgd2F5LgorICoKKyAqLworc3RhdGljIHZvaWQgX19ncGlvX2lycV9oYW5kbGVyKHN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmspCit7CisJdW5zaWduZWQgbG9uZyBwb3J0X2luLCBwb3J0X21hc2ssIHBvcnRfY29tcCwgYWN0aXZlX2lycXM7CisJdW5zaWduZWQgbG9uZyBiYW5rX2VkZ2VfbWFzaywgZmxhZ3M7CisJaW50IG4sIHZhbCwgZWNmZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7CisJYmFua19lZGdlX21hc2sgPSBiYW5rLT5pcnFfZWRnZV9jb25mOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKKworCWZvciAoOzspIHsKKwkJcG9ydF9pbiA9IHJlYWRsKGJhbmstPmJhc2UgKyBSRUdfUElPX1BJTik7CisJCXBvcnRfY29tcCA9IHJlYWRsKGJhbmstPmJhc2UgKyBSRUdfUElPX1BDT01QKTsKKwkJcG9ydF9tYXNrID0gcmVhZGwoYmFuay0+YmFzZSArIFJFR19QSU9fUE1BU0spOworCisJCWFjdGl2ZV9pcnFzID0gKHBvcnRfaW4gXiBwb3J0X2NvbXApICYgcG9ydF9tYXNrOworCisJCWlmIChhY3RpdmVfaXJxcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJZm9yX2VhY2hfc2V0X2JpdChuLCAmYWN0aXZlX2lycXMsIEJJVFNfUEVSX0xPTkcpIHsKKwkJCS8qIGNoZWNrIGlmIHdlIGFyZSBkZXRlY3RpbmcgZmFrZSBlZGdlcyAuLi4gKi8KKwkJCWVjZmcgPSBTVF9JUlFfRURHRV9DT05GKGJhbmtfZWRnZV9tYXNrLCBuKTsKKworCQkJaWYgKGVjZmcpIHsKKwkJCQkvKiBlZGdlIGRldGVjdGlvbi4gKi8KKwkJCQl2YWwgPSBzdF9ncGlvX2dldCgmYmFuay0+Z3Bpb19jaGlwLCBuKTsKKworCQkJCXdyaXRlbChCSVQobiksCisJCQkJCXZhbCA/IGJhbmstPmJhc2UgKyBSRUdfUElPX1NFVF9QQ09NUCA6CisJCQkJCWJhbmstPmJhc2UgKyBSRUdfUElPX0NMUl9QQ09NUCk7CisKKwkJCQlpZiAoZWNmZyAhPSBTVF9JUlFfRURHRV9CT1RIICYmCisJCQkJCSEoKGVjZmcgJiBTVF9JUlFfRURHRV9GQUxMSU5HKSBeIHZhbCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX2ZpbmRfbWFwcGluZyhiYW5rLT5kb21haW4sIG4pKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwkvKiBpbnRlcnJ1cHQgZGVkaWNhdGVkIHBlciBiYW5rICovCisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKwlfX2dwaW9faXJxX2hhbmRsZXIoYmFuayk7CisJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKK30KKworc3RhdGljIHZvaWQgc3RfZ3Bpb19pcnFtdXhfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZ2V0X2NoaXAoaXJxKTsKKwlzdHJ1Y3Qgc3RfcGluY3RybCAqaW5mbyA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJaW50IG47CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCXN0YXR1cyA9IHJlYWRsKGluZm8tPmlycW11eF9iYXNlKTsKKworCWZvcl9lYWNoX3NldF9iaXQobiwgJnN0YXR1cywgU1RfR1BJT19QSU5TX1BFUl9CQU5LKQorCQlfX2dwaW9faXJxX2hhbmRsZXIoJmluZm8tPmJhbmtzW25dKTsKKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHN0X2dwaW9fdGVtcGxhdGUgPSB7CiAJLnJlcXVlc3QJCT0gc3RfZ3Bpb19yZXF1ZXN0LAogCS5mcmVlCQkJPSBzdF9ncGlvX2ZyZWUsCkBAIC0xMjEwLDYgKzE0ODMsMzQgQEAKIAkubmdwaW8JCQk9IFNUX0dQSU9fUElOU19QRVJfQkFOSywKIAkub2ZfZ3Bpb19uX2NlbGxzCT0gMSwKIAkub2ZfeGxhdGUJCT0gc3RfZ3Bpb194bGF0ZSwKKwkudG9faXJxCQkJPSBzdF9ncGlvX3RvX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3RfZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX21hc2sJPSBzdF9ncGlvX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCT0gc3RfZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJPSBzdF9ncGlvX2lycV9zZXRfdHlwZSwKKwkuaXJxX3N0YXJ0dXAJPSBzdF9ncGlvX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBzdF9ncGlvX2lycV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgc3RfZ3Bpb19pcnFfZG9tYWluX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqaCwKKwkJCXVuc2lnbmVkIGludCB2aXJxLCBpcnFfaHdfbnVtYmVyX3QgaHcpCit7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGgtPmhvc3RfZGF0YTsKKworCWlycV9zZXRfY2hpcCh2aXJxLCAmc3RfZ3Bpb19pcnFjaGlwKTsKKwlpcnFfc2V0X2hhbmRsZXIodmlycSwgaGFuZGxlX3NpbXBsZV9pcnEpOworCXNldF9pcnFfZmxhZ3ModmlycSwgSVJRRl9WQUxJRCk7CisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgYmFuayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluX29wcyBzdF9ncGlvX2lycV9vcHMgPSB7CisJLm1hcAk9IHN0X2dwaW9faXJxX2RvbWFpbl9tYXAsCisJLnhsYXRlCT0gaXJxX2RvbWFpbl94bGF0ZV90d29jZWxsLAogfTsKIAogc3RhdGljIGludCBzdF9ncGlvbGliX3JlZ2lzdGVyX2Jhbmsoc3RydWN0IHN0X3BpbmN0cmwgKmluZm8sCkBAIC0xMjE5LDggKzE1MjAsOCBAQAogCXN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlID0gJmJhbmstPnJhbmdlOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGluZm8tPmRldjsKIAlpbnQgYmFua19udW0gPSBvZl9hbGlhc19nZXRfaWQobnAsICJncGlvIik7Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKLQlpbnQgZXJyOworCXN0cnVjdCByZXNvdXJjZSByZXMsIGlycV9yZXM7CisJaW50IGdwaW9faXJxID0gMCwgZXJyLCBpOwogCiAJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEyMzMsNiArMTUzNCw3IEBACiAJYmFuay0+Z3Bpb19jaGlwLmJhc2UgPSBiYW5rX251bSAqIFNUX0dQSU9fUElOU19QRVJfQkFOSzsKIAliYW5rLT5ncGlvX2NoaXAubmdwaW8gPSBTVF9HUElPX1BJTlNfUEVSX0JBTks7CiAJYmFuay0+Z3Bpb19jaGlwLm9mX25vZGUgPSBucDsKKwlzcGluX2xvY2tfaW5pdCgmYmFuay0+bG9jayk7CiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgInN0LGJhbmstbmFtZSIsICZyYW5nZS0+bmFtZSk7CiAJYmFuay0+Z3Bpb19jaGlwLmxhYmVsID0gcmFuZ2UtPm5hbWU7CkBAIC0xMjQ4LDYgKzE1NTAsNTEgQEAKIAl9CiAJZGV2X2luZm8oZGV2LCAiJXMgYmFuayBhZGRlZC5cbiIsIHJhbmdlLT5uYW1lKTsKIAorCS8qKgorCSAqIEdQSU8gYmFuayBjYW4gaGF2ZSBvbmUgb2YgdGhlIHR3byBwb3NzaWJsZSB0eXBlcyBvZgorCSAqIGludGVycnVwdC13aXJpbmdzLgorCSAqCisJICogRmlyc3QgdHlwZSBpcyB2aWEgaXJxbXV4LCBzaW5nbGUgaW50ZXJydXB0IGlzIHVzZWQgYnkgbXVsdGlwbGUKKwkgKiBncGlvIGJhbmtzLiBUaGlzIHJlZHVjZXMgbnVtYmVyIG9mIG92ZXJhbGwgaW50ZXJydXB0cyBudW1iZXJzCisJICogcmVxdWlyZWQuIEFsbCB0aGVzZSBiYW5rcyBiZWxvbmcgdG8gYSBzaW5nbGUgcGluY29udHJvbGxlci4KKwkgKgkJICBfX19fX19fX18KKwkgKgkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4pICAgIF0KKwkgKgkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAxKV0KKwkgKglbaXJxTl0tLSB8IGlycS1tdXggfC0tLS0+IFtncGlvLWJhbmsgKG4gKyAyKV0KKwkgKgkJIHwJICAgfC0tLS0+IFtncGlvLWJhbmsgKC4uLiAgKV0KKwkgKgkJIHxfX19fX19fX198LS0tLT4gW2dwaW8tYmFuayAobiArIDcpXQorCSAqCisJICogU2Vjb25kIHR5cGUgaGFzIGEgZGVkaWNhdGVkIGludGVycnVwdCBwZXIgZWFjaCBncGlvIGJhbmsuCisJICoKKwkgKglbaXJxTl0tLS0tPiBbZ3Bpby1iYW5rIChuKV0KKwkgKi8KKworCWlmIChvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZpcnFfcmVzKSkgeworCQlncGlvX2lycSA9IGlycV9yZXMuc3RhcnQ7CisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGdwaW9faXJxLCBzdF9ncGlvX2lycV9oYW5kbGVyKTsKKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEoZ3Bpb19pcnEsIGJhbmspOworCX0KKworCWlmIChpbmZvLT5pcnFtdXhfYmFzZSA+IDAgfHwgZ3Bpb19pcnEgPiAwKSB7CisJCS8qIFNldHVwIElSUSBkb21haW4gKi8KKwkJYmFuay0+ZG9tYWluICA9IGlycV9kb21haW5fYWRkX2xpbmVhcihucCwKKwkJCQkJCVNUX0dQSU9fUElOU19QRVJfQkFOSywKKwkJCQkJCSZzdF9ncGlvX2lycV9vcHMsIGJhbmspOworCQlpZiAoIWJhbmstPmRvbWFpbikgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWRkIGlycSBkb21haW4gZm9yICVzXG4iLAorCQkJCW5wLT5mdWxsX25hbWUpOworCQl9IGVsc2UgIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBTVF9HUElPX1BJTlNfUEVSX0JBTks7IGkrKykgeworCQkJCWlmIChpcnFfY3JlYXRlX21hcHBpbmcoYmFuay0+ZG9tYWluLCBpKSA8IDApCisJCQkJCWRldl9lcnIoZGV2LAorCQkJCQkJIkZhaWxlZCB0byBtYXAgSVJRICVpXG4iLCBpKTsKKwkJCX0KKwkJfQorCisJfSBlbHNlIHsKKwkJZGV2X2luZm8oZGV2LCAiTm8gSVJRIHN1cHBvcnQgZm9yICVzIGJhbmtcbiIsIG5wLT5mdWxsX25hbWUpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMjY0LDYgKzE2MTEsMTAgQEAKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtcmVhci1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtZnZkcC1mZS1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtZnZkcC1saXRlLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1zYmMtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LWZyb250LXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1yZWFyLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1mbGFzaC1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQwN19mbGFzaGRhdGF9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIApAQCAtMTI3Niw2ICsxNjI3LDggQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKIAlpbnQgZ3JwX2luZGV4ID0gMDsKKwlpbnQgaXJxID0gMDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCXN0X3BjdGxfZHRfY2hpbGRfY291bnQoaW5mbywgbnApOwogCWlmICghaW5mby0+bmJhbmtzKSB7CkBAIC0xMzA2LDYgKzE2NTksMjEgQEAKIAl9CiAJaW5mby0+ZGF0YSA9IG9mX21hdGNoX25vZGUoc3RfcGN0bF9vZl9tYXRjaCwgbnApLT5kYXRhOwogCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWlmIChpcnEgPiAwKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKKwkJCQkJSU9SRVNPVVJDRV9NRU0sICJpcnFtdXgiKTsKKwkJaW5mby0+aXJxbXV4X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKworCQlpZiAoSVNfRVJSKGluZm8tPmlycW11eF9iYXNlKSkKKwkJCXJldHVybiBQVFJfRVJSKGluZm8tPmlycW11eF9iYXNlKTsKKworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIHN0X2dwaW9faXJxbXV4X2hhbmRsZXIpOworCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsIGluZm8pOworCisJfQorCiAJcGN0bF9kZXNjLT5ucGlucyA9IGluZm8tPm5iYW5rcyAqIFNUX0dQSU9fUElOU19QRVJfQkFOSzsKIAlwZGVzYyA9CWRldm1fa3phbGxvYygmcGRldi0+ZGV2LAogCQkJc2l6ZW9mKCpwZGVzYykgKiBwY3RsX2Rlc2MtPm5waW5zLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN1bnhpLXBpbnMuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN1bnhpLXBpbnMuaAppbmRleCA2ZmQ4ZDRkLi4zZDYwNjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdW54aS1waW5zLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3VueGktcGlucy5oCkBAIC0xOTMyLDI3ICsxOTMyLDI3IEBACiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOX1BGMCwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMwIikpLAkJLyogRDEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIikpLAkJLyogRDEgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEYxLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBEMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBEMCAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTl9QRjIsCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMCIpKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBDTEsgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEYzLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBDTUQgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIikpLAkJLyogQ01EICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOX1BGNCwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMwIikpLAkJLyogRDMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIikpLAkJLyogRDMgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEY1LAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzAiKSksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSksCQkvKiBEMiAqLwogCS8qIEhvbGUgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU5fUEcwLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5jCmluZGV4IGU3NjczNTUuLjY1NDU4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuYwpAQCAtMzksNiArMzksNyBAQAogCXN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bDsKIAogCWNvbnN0IHN0cnVjdCB0ZWdyYV9waW5jdHJsX3NvY19kYXRhICpzb2M7CisJY29uc3QgY2hhciAqKmdyb3VwX3BpbnM7CiAKIAlpbnQgbmJhbmtzOwogCXZvaWQgX19pb21lbSAqKnJlZ3M7CkBAIC02MjAsNiArNjIxLDggQEAKIAlzdHJ1Y3QgdGVncmFfcG14ICpwbXg7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGk7CisJY29uc3QgY2hhciAqKmdyb3VwX3BpbnM7CisJaW50IGZuLCBnbiwgZ2ZuOwogCiAJcG14ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG14KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbXgpIHsKQEAgLTYyOSw2ICs2MzIsNDEgQEAKIAlwbXgtPmRldiA9ICZwZGV2LT5kZXY7CiAJcG14LT5zb2MgPSBzb2NfZGF0YTsKIAorCS8qCisJICogRWFjaCBtdXggZ3JvdXAgd2lsbCBhcHBlYXIgaW4gNCBmdW5jdGlvbnMnIGxpc3Qgb2YgZ3JvdXBzLgorCSAqIFRoaXMgb3Zlci1hbGxvY2F0ZXMgc2xpZ2h0bHksIHNpbmNlIG5vdCBhbGwgZ3JvdXBzIGFyZSBtdXggZ3JvdXBzLgorCSAqLworCXBteC0+Z3JvdXBfcGlucyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQlzb2NfZGF0YS0+bmdyb3VwcyAqIDQgKiBzaXplb2YoKnBteC0+Z3JvdXBfcGlucyksCisJCUdGUF9LRVJORUwpOworCWlmICghcG14LT5ncm91cF9waW5zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdyb3VwX3BpbnMgPSBwbXgtPmdyb3VwX3BpbnM7CisJZm9yIChmbiA9IDA7IGZuIDwgc29jX2RhdGEtPm5mdW5jdGlvbnM7IGZuKyspIHsKKwkJc3RydWN0IHRlZ3JhX2Z1bmN0aW9uICpmdW5jID0gJnNvY19kYXRhLT5mdW5jdGlvbnNbZm5dOworCisJCWZ1bmMtPmdyb3VwcyA9IGdyb3VwX3BpbnM7CisKKwkJZm9yIChnbiA9IDA7IGduIDwgc29jX2RhdGEtPm5ncm91cHM7IGduKyspIHsKKwkJCWNvbnN0IHN0cnVjdCB0ZWdyYV9waW5ncm91cCAqZyA9ICZzb2NfZGF0YS0+Z3JvdXBzW2duXTsKKworCQkJaWYgKGctPm11eF9yZWcgPT0gLTEpCisJCQkJY29udGludWU7CisKKwkJCWZvciAoZ2ZuID0gMDsgZ2ZuIDwgNDsgZ2ZuKyspCisJCQkJaWYgKGctPmZ1bmNzW2dmbl0gPT0gZm4pCisJCQkJCWJyZWFrOworCQkJaWYgKGdmbiA9PSA0KQorCQkJCWNvbnRpbnVlOworCisJCQlCVUdfT04oZ3JvdXBfcGlucyAtIHBteC0+Z3JvdXBfcGlucyA+PQorCQkJCXNvY19kYXRhLT5uZ3JvdXBzICogNCk7CisJCQkqZ3JvdXBfcGlucysrID0gZy0+bmFtZTsKKwkJCWZ1bmMtPm5ncm91cHMrKzsKKwkJfQorCX0KKwogCXRlZ3JhX3BpbmN0cmxfZ3Bpb19yYW5nZS5ucGlucyA9IHBteC0+c29jLT5uZ3Bpb3M7CiAJdGVncmFfcGluY3RybF9kZXNjLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAl0ZWdyYV9waW5jdHJsX2Rlc2MucGlucyA9IHBteC0+c29jLT5waW5zOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmgKaW5kZXggODE3ZjcwNi4uNjA1MzgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5oCkBAIC03Miw3ICs3Miw3IEBACiAgKi8KIHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB7CiAJY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICogY29uc3QgKmdyb3VwczsKKwljb25zdCBjaGFyICoqZ3JvdXBzOwogCXVuc2lnbmVkIG5ncm91cHM7CiB9OwogCkBAIC0xOTMsNyArMTkzLDcgQEAKIAl1bnNpZ25lZCBuZ3Bpb3M7CiAJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKnBpbnM7CiAJdW5zaWduZWQgbnBpbnM7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uICpmdW5jdGlvbnM7CisJc3RydWN0IHRlZ3JhX2Z1bmN0aW9uICpmdW5jdGlvbnM7CiAJdW5zaWduZWQgbmZ1bmN0aW9uczsKIAljb25zdCBzdHJ1Y3QgdGVncmFfcGluZ3JvdXAgKmdyb3VwczsKIAl1bnNpZ25lZCBuZ3JvdXBzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMTQuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTE0LmMKaW5kZXggOTNjOWUzOC4uNjNmZTc2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMTQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTExNC5jCkBAIC0xLDEwICsxLDggQEAKIC8qCi0gKiBQaW5jdHJsIGRhdGEgYW5kIGRyaXZlciBmb3IgdGhlIE5WSURJQSBUZWdyYTExNCBwaW5tdXgKKyAqIFBpbmN0cmwgZGF0YSBmb3IgdGhlIE5WSURJQSBUZWdyYTExNCBwaW5tdXgKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBBdXRob3I6ICBQcml0ZXNoIFJhaXRoYXRoYSA8cHJhaXRoYXRoYUBudmlkaWEuY29tPgotICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAogICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTEzLDkgKzExLDYgQEAKICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yMDMsOCArMTk4LDggQEAKICNkZWZpbmUgVEVHUkFfUElOX1NETU1DM19DTEtfTEJfSU5fUEVFNQkJX0dQSU8oMjQ1KQogCiAvKiBBbGwgbm9uLUdQSU8gcGlucyBmb2xsb3cgKi8KLSNkZWZpbmUgTlVNX0dQSU9TCShURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1ICsgMSkKLSNkZWZpbmUgX1BJTihvZmZzZXQpCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKKyNkZWZpbmUgTlVNX0dQSU9TCQkJCShURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1ICsgMSkKKyNkZWZpbmUgX1BJTihvZmZzZXQpCQkJCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKIAogLyogTm9uLUdQSU8gcGlucyAqLwogI2RlZmluZSBURUdSQV9QSU5fQ09SRV9QV1JfUkVRCQkJX1BJTigwKQpAQCAtMjEyLDggKzIwNywxMSBAQAogI2RlZmluZSBURUdSQV9QSU5fUFdSX0lOVF9OCQkJX1BJTigyKQogI2RlZmluZSBURUdSQV9QSU5fUkVTRVRfT1VUX04JCQlfUElOKDMpCiAjZGVmaW5lIFRFR1JBX1BJTl9PV1IJCQkJX1BJTig0KQorI2RlZmluZSBURUdSQV9QSU5fSlRBR19SVENLCQkJX1BJTig1KQorI2RlZmluZSBURUdSQV9QSU5fQ0xLXzMyS19JTgkJCV9QSU4oNikKKyNkZWZpbmUgVEVHUkFfUElOX0dNSV9DTEtfTEIJCQlfUElOKDcpCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAgdGVncmExMTRfcGluc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIHRlZ3JhMTE0X3BpbnNbXSA9IHsKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLXzMyS19PVVRfUEEwLCAiQ0xLXzMyS19PVVQgUEEwIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VBUlQzX0NUU19OX1BBMSwgIlVBUlQzX0NUU19OIFBBMSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EQVAyX0ZTX1BBMiwgIkRBUDJfRlMgUEEyIiksCkBAIC0zODUsOSArMzgzLDEyIEBACiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NETU1DM19DTEtfTEJfSU5fUEVFNSwgIlNETU1DM19DTEtfTEJfSU4gUEVFNSIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DT1JFX1BXUl9SRVEsICJDT1JFX1BXUl9SRVEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ1BVX1BXUl9SRVEsICJDUFVfUFdSX1JFUSIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9PV1IsICJPV1IiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fUFdSX0lOVF9OLCAiUFdSX0lOVF9OIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1JFU0VUX09VVF9OLCAiUkVTRVRfT1VUX04iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fT1dSLCAiT1dSIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0pUQUdfUlRDSywgIkpUQUdfUlRDSyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DTEtfMzJLX0lOLCAiQ0xLXzMyS19JTiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HTUlfQ0xLX0xCLCAiR01JX0NMS19MQiIpLAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNsa18zMmtfb3V0X3BhMF9waW5zW10gPSB7CkBAIC0xMDc0LDEwICsxMDc1LDYgQEAKIAlURUdSQV9QSU5fQ1BVX1BXUl9SRVEsCiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgb3dyX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fT1dSLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHB3cl9pbnRfbl9waW5zW10gPSB7CiAJVEVHUkFfUElOX1BXUl9JTlRfTiwKIH07CkBAIC0xMDg2LDYgKzEwODMsMjIgQEAKIAlURUdSQV9QSU5fUkVTRVRfT1VUX04sCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgb3dyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fT1dSLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGp0YWdfcnRja19waW5zW10gPSB7CisJVEVHUkFfUElOX0pUQUdfUlRDSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjbGtfMzJrX2luX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0xLXzMyS19JTiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBnbWlfY2xrX2xiX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR01JX0NMS19MQiwKK307CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9hbzFfcGluc1tdID0gewogCVRFR1JBX1BJTl9LQl9ST1cwX1BSMCwKIAlURUdSQV9QSU5fS0JfUk9XMV9QUjEsCkBAIC0xMTI3LDcgKzExNDAsNiBAQAogCVRFR1JBX1BJTl9HTUlfQUQxM19QSDUsCiAJVEVHUkFfUElOX0dNSV9BRDE0X1BINiwKIAlURUdSQV9QSU5fR01JX0FEMTVfUEg3LAotCiAJVEVHUkFfUElOX0dNSV9JT1JEWV9QSTUsCiAJVEVHUkFfUElOX0dNSV9DUzdfTl9QSTYsCiB9OwpAQCAtMTE0MSwxNSArMTE1MywxMiBAQAogCVRFR1JBX1BJTl9HTUlfQUQ1X1BHNSwKIAlURUdSQV9QSU5fR01JX0FENl9QRzYsCiAJVEVHUkFfUElOX0dNSV9BRDdfUEc3LAotCiAJVEVHUkFfUElOX0dNSV9XUl9OX1BJMCwKIAlURUdSQV9QSU5fR01JX09FX05fUEkxLAogCVRFR1JBX1BJTl9HTUlfQ1M2X05fUEkzLAogCVRFR1JBX1BJTl9HTUlfUlNUX05fUEk0LAogCVRFR1JBX1BJTl9HTUlfV0FJVF9QSTcsCi0KIAlURUdSQV9QSU5fR01JX0RRU19QX1BKMywKLQogCVRFR1JBX1BJTl9HTUlfQURWX05fUEswLAogCVRFR1JBX1BJTl9HTUlfQ0xLX1BLMSwKIAlURUdSQV9QSU5fR01JX0NTNF9OX1BLMiwKQEAgLTEzNDIsMTQgKzEzNTEsMzcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9kZXYzX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fQ0xLM19PVVRfUEVFMCwKLQlURUdSQV9QSU5fQ0xLM19SRVFfUEVFMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9jZWNfcGluc1tdID0geworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2F0Nl9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfZGFwNV9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfdXNiX3ZidXNfZW5fcGluc1tdID0geworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2FvM19waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfaHYwX3BpbnNbXSA9IHsKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9zZGlvNF9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfYW8wX3BpbnNbXSA9IHsKIH07CiAKIGVudW0gdGVncmFfbXV4IHsKIAlURUdSQV9NVVhfQkxJTkssCiAJVEVHUkFfTVVYX0NFQywKIAlURUdSQV9NVVhfQ0xEVkZTLAorCVRFR1JBX01VWF9DTEssCiAJVEVHUkFfTVVYX0NMSzEyLAogCVRFR1JBX01VWF9DUFUsCiAJVEVHUkFfTVVYX0RBUCwKQEAgLTEzOTQsNiArMTQyNiw3IEBACiAJVEVHUkFfTVVYX1JTVkQyLAogCVRFR1JBX01VWF9SU1ZEMywKIAlURUdSQV9NVVhfUlNWRDQsCisJVEVHUkFfTVVYX1JUQ0ssCiAJVEVHUkFfTVVYX1NETU1DMSwKIAlURUdSQV9NVVhfU0RNTUMyLAogCVRFR1JBX01VWF9TRE1NQzMsCkBAIC0xNDI1LDk0NCArMTQ1OCwxNiBAQAogCVRFR1JBX01VWF9WSV9BTFQzLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibGlua19ncm91cHNbXSA9IHsKLQkiY2xrXzMya19vdXRfcGEwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2VjX2dyb3Vwc1tdID0gewotCSJoZG1pX2NlY19wZWUzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xkdmZzX2dyb3Vwc1tdID0gewotCSJnbWlfYWQ5X3BoMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJkdmZzX3B3bV9weDAiLAotCSJkdmZzX2Nsa19weDIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGsxMl9ncm91cHNbXSA9IHsKLQkic2RtbWMxX3dwX25fcHYzIiwKLQkic2RtbWMxX2Nsa19wejAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcHVfZ3JvdXBzW10gPSB7Ci0JImNwdV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwX2dyb3Vwc1tdID0gewotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMl9yZXFfcGNjNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDFfZ3JvdXBzW10gPSB7Ci0JImNsazFfcmVxX3BlZTIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXAyX2dyb3Vwc1tdID0gewotCSJjbGsxX291dF9wdzQiLAotCSJncGlvX3g0X2F1ZF9weDQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXYzX2dyb3Vwc1tdID0gewotCSJjbGszX3JlcV9wZWUxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGlzcGxheWFfZ3JvdXBzW10gPSB7Ci0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9jb2wzX3BxMyIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2FsdF9ncm91cHNbXSA9IHsKLQkia2Jfcm93Nl9wcjYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5Yl9ncm91cHNbXSA9IHsKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19zY2xrX3BwMyIsCi0JInB1MyIsCi0JInB1NCIsCi0JInB1NSIsCi0JInB1NiIsCi0JInBiYjMiLAotCSJwYmI0IiwKLQkicGJiNSIsCi0JInBiYjYiLAotCSJrYl9yb3czX3ByMyIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c2X3ByNiIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR0dl9ncm91cHNbXSA9IHsKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZ21pX3dhaXRfcGk3IiwKLQkiZ21pX2FkOF9waDAiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbWNfZGxsX2dyb3Vwc1tdID0gewotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMV9ncm91cHNbXSA9IHsKLQkiY2xrMV9vdXRfcHc0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMl9ncm91cHNbXSA9IHsKLQkiY2xrMl9vdXRfcHc1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoM19ncm91cHNbXSA9IHsKLQkiY2xrM19vdXRfcGVlMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9ncm91cHNbXSA9IHsKLQkiZ21pX3dwX25fcGM3IiwKLQotCSJnbWlfYWQwX3BnMCIsCi0JImdtaV9hZDFfcGcxIiwKLQkiZ21pX2FkMl9wZzIiLAotCSJnbWlfYWQzX3BnMyIsCi0JImdtaV9hZDRfcGc0IiwKLQkiZ21pX2FkNV9wZzUiLAotCSJnbWlfYWQ2X3BnNiIsCi0JImdtaV9hZDdfcGc3IiwKLQkiZ21pX2FkOF9waDAiLAotCSJnbWlfYWQ5X3BoMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImdtaV9hZDExX3BoMyIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfcnN0X25fcGk0IiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9jczdfbl9waTYiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9kcXNfcF9wajMiLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3M0X25fcGsyIiwKLQkiZ21pX2NzMl9uX3BrMyIsCi0JImdtaV9jczNfbl9wazQiLAotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnbWlfYWx0X2dyb3Vwc1tdID0gewotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2ExNl9wajciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZGFfZ3JvdXBzW10gPSB7Ci0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHNpX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjMV9ncm91cHNbXSA9IHsKLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMyX2dyb3Vwc1tdID0gewotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzNfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjNF9ncm91cHNbXSA9IHsKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY3B3cl9ncm91cHNbXSA9IHsKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMF9ncm91cHNbXSA9IHsKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczFfZ3JvdXBzW10gPSB7Ci0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMyX2dyb3Vwc1tdID0gewotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX3NjbGtfcHAzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzM19ncm91cHNbXSA9IHsKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczRfZ3JvdXBzW10gPSB7Ci0JInBjYzEiLAotCSJwYmIwIiwKLQkicGJiNyIsCi0JInBjYzIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpcmRhX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtiY19ncm91cHNbXSA9IHsKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFuZF9ncm91cHNbXSA9IHsKLQkiZ21pX3dwX25fcGM3IiwKLQkiZ21pX3dhaXRfcGk3IiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2FkMTBfcGgyIiwKLQkiZ21pX2FkMTFfcGgzIiwKLQkiZ21pX2FkMTJfcGg0IiwKLQkiZ21pX2FkMTNfcGg1IiwKLQkiZ21pX2FkMTRfcGg2IiwKLQkiZ21pX2FkMTVfcGg3IiwKLQkiZ21pX3dyX25fcGkwIiwKLQkiZ21pX29lX25fcGkxIiwKLQkiZ21pX2Rxc19wX3BqMyIsCi0JImdtaV9yc3Rfbl9waTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW5kX2FsdF9ncm91cHNbXSA9IHsKLQkiZ21pX2NzNl9uX3BpMyIsCi0JImdtaV9jczdfbl9waTYiLAotCSJnbWlfcnN0X25fcGk0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3dyX2dyb3Vwc1tdID0gewotCSJwdTAiLAotCSJrYl9jb2w0X3BxNCIsCi0JIm93ciIsCi0JInNkbW1jM19jZF9uX3B2MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBtaV9ncm91cHNbXSA9IHsKLQkicHdyX2ludF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtMF9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkicHUzIiwKLQkiZ21pX2FkOF9waDAiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20xX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJwdTQiLAotCSJnbWlfYWQ5X3BoMSIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTJfZ3JvdXBzW10gPSB7Ci0JInB1NSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtM19ncm91cHNbXSA9IHsKLQkicHU2IiwKLQkiZ21pX2FkMTFfcGgzIiwKLQkic2RtbWMzX2NtZF9wYTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3Jvbl9ncm91cHNbXSA9IHsKLQkiY29yZV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVzZXRfb3V0X25fZ3JvdXBzW10gPSB7Ci0JInJlc2V0X291dF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDFfZ3JvdXBzW10gPSB7Ci0JInB2MSIsCi0JImhkbWlfaW50X3BuNyIsCi0JInB1MSIsCi0JInB1MiIsCi0JImdtaV93cF9uX3BjNyIsCi0JImdtaV9hZHZfbl9wazAiLAotCSJnbWlfY3MwX25fcGowIiwKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJnbWlfb2Vfbl9waTEiLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCi0JInJlc2V0X291dF9uIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDJfZ3JvdXBzW10gPSB7Ci0JInB2MCIsCi0JInB2MSIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0JImdtaV9pb3JkeV9waTUiLAotCSJnbWlfYTE3X3BiMCIsCi0JImdtaV9hMThfcGIxIiwKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJwY2MxIiwKLQkicGJiNyIsCi0JInBjYzIiLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9jb2wxX3BxMSIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkic3lzX2Nsa19yZXFfcHo1IiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJvd3IiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJyZXNldF9vdXRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQzX2dyb3Vwc1tdID0gewotCSJwdjAiLAotCSJwdjEiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JImNsazJfb3V0X3B3NSIsCi0JImNsazJfcmVxX3BjYzUiLAotCSJoZG1pX2ludF9wbjciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0JInBjYzEiLAotCSJjYW1faTJjX3NjbF9wYmIxIiwKLQkiY2FtX2kyY19zZGFfcGJiMiIsCi0JInBiYjciLAotCSJwY2MyIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JInN5c19jbGtfcmVxX3B6NSIsCi0JImNvcmVfcHdyX3JlcSIsCi0JImNwdV9wd3JfcmVxIiwKLQkicHdyX2ludF9uIiwKLQkib3dyIiwKLQkiY2xrMV9yZXFfcGVlMiIsCi0JImNsazFfb3V0X3B3NCIsCi0JInNwZGlmX291dF9wazUiLAotCSJzcGRpZl9pbl9wazYiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZHZmc19wd21fcHgwIiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQkiZ3Bpb194M19hdWRfcHgzIiwKLQkiZHZmc19jbGtfcHgyIiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJoZG1pX2NlY19wZWUzIiwKLQkic2RtbWMzX2NkX25fcHYyIiwKLQkidXNiX3ZidXNfZW4wX3BuNCIsCi0JInVzYl92YnVzX2VuMV9wbjUiLAotCSJzZG1tYzNfY2xrX2xiX291dF9wZWU0IiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkicmVzZXRfb3V0X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkNF9ncm91cHNbXSA9IHsKLQkicHYwIiwKLQkicHYxIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0JInNkbW1jNF9jbGtfcGNjNCIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNkbW1jNF9kYXQ0X3BhYTQiLAotCSJzZG1tYzRfZGF0NV9wYWE1IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJjYW1fbWNsa19wY2MwIiwKLQkicGNjMSIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JInBiYjciLAotCSJwY2MyIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJjbGtfMzJrX291dF9wYTAiLAotCSJzeXNfY2xrX3JlcV9wejUiLAotCSJjb3JlX3B3cl9yZXEiLAotCSJjcHVfcHdyX3JlcSIsCi0JInB3cl9pbnRfbiIsCi0JIm93ciIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMV9vdXRfcHc0IiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkdmZzX3B3bV9weDAiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJkdmZzX2Nsa19weDIiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJzZG1tYzNfY2Rfbl9wdjIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfaW5fcGVlNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzFfZ3JvdXBzW10gPSB7Ci0KLQkic2RtbWMxX2Nsa19wejAiLAotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JImtiX2NvbDVfcHE1IiwKLQkic2RtbWMxX3dwX25fcHYzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMyX2dyb3Vwc1tdID0gewotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczdfbl9waTYiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfZHFzX3BfcGozIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMzX2dyb3Vwc1tdID0gewotCSJrYl9jb2w0X3BxNCIsCi0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJoZG1pX2NlY19wZWUzIiwKLQkic2RtbWMzX2NkX25fcHYyIiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jNF9ncm91cHNbXSA9IHsKLQkic2RtbWM0X2Nsa19wY2M0IiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNvY19ncm91cHNbXSA9IHsKLQkiZ21pX2NzMV9uX3BqMiIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JImhkbWlfY2VjX3BlZTMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGRpZl9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi0JInNwZGlmX2luX3BrNiIsCi0JInNwZGlmX291dF9wazUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkxX2dyb3Vwc1tdID0gewotCSJ1bHBpX2Nsa19weTAiLAotCSJ1bHBpX2Rpcl9weTEiLAotCSJ1bHBpX254dF9weTIiLAotCSJ1bHBpX3N0cF9weTMiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkyX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkiZ3Bpb194NF9hdWRfcHg0IiwKLQkiZ3Bpb194NV9hdWRfcHg1IiwKLQkiZ3Bpb194Nl9hdWRfcHg2IiwKLQkiZ3Bpb194N19hdWRfcHg3IiwKLQkiZ3Bpb193Ml9hdWRfcHcyIiwKLQkiZ3Bpb193M19hdWRfcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpM19ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTRfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWFydDNfcnhkX3B3NyIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JImdtaV93YWl0X3BpNyIsCi0JImdtaV9jczZfbl9waTMiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYTE5X3BrNyIsCi0JImdtaV93cl9uX3BpMCIsCi0JInNkbW1jMV93cF9uX3B2MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTVfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk2X2dyb3Vwc1tdID0gewotCSJkdmZzX3B3bV9weDAiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJkdmZzX2Nsa19weDIiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNjbGtfZ3JvdXBzW10gPSB7Ci0JInN5c19jbGtfcmVxX3B6NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYWNlX2dyb3Vwc1tdID0gewotCSJnbWlfaW9yZHlfcGk1IiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMl9uX3BrMyIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JImdtaV9kcXNfcF9wajMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0YV9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzFfd3Bfbl9wdjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Yl9ncm91cHNbXSA9IHsKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGNfZ3JvdXBzW10gPSB7Ci0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGRfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JImdtaV9hMTZfcGo3IiwKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9hMTlfcGs3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWxwaV9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzYl9ncm91cHNbXSA9IHsKLQkicHYwIiwKLQkicHU2IiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfYWQxMV9waDMiLAotCSJrYl9jb2wwX3BxMCIsCi0JInNwZGlmX2luX3BrNiIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwMV9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDJfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2RhX3BiYjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AzX2dyb3Vwc1tdID0gewotCSJwYmIzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNF9ncm91cHNbXSA9IHsKLQkicGJiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDVfZ3JvdXBzW10gPSB7Ci0JInBiYjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A2X2dyb3Vwc1tdID0gewotCSJwYmI2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJwYmIwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfYWx0MV9ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi0JInBiYjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQzX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLQkicGJiMCIsCi19OwotCiAjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCi0JCS5ncm91cHMgPSBmbmFtZSMjX2dyb3VwcywJCVwKLQkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGZuYW1lIyNfZ3JvdXBzKSwJXAogCX0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiAgdGVncmExMTRfZnVuY3Rpb25zW10gPSB7CitzdGF0aWMgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHRlZ3JhMTE0X2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGJsaW5rKSwKIAlGVU5DVElPTihjZWMpLAogCUZVTkNUSU9OKGNsZHZmcyksCisJRlVOQ1RJT04oY2xrKSwKIAlGVU5DVElPTihjbGsxMiksCiAJRlVOQ1RJT04oY3B1KSwKIAlGVU5DVElPTihkYXApLApAQCAtMjQwNyw2ICsxNTEyLDcgQEAKIAlGVU5DVElPTihyc3ZkMiksCiAJRlVOQ1RJT04ocnN2ZDMpLAogCUZVTkNUSU9OKHJzdmQ0KSwKKwlGVU5DVElPTihydGNrKSwKIAlGVU5DVElPTihzZG1tYzEpLAogCUZVTkNUSU9OKHNkbW1jMiksCiAJRlVOQ1RJT04oc2RtbWMzKSwKQEAgLTI0MzgsMTEgKzE1NDQsMTEgQEAKIAlGVU5DVElPTih2aV9hbHQzKSwKIH07CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19TVEFSVAkJCTB4ODY4CS8qIGJhbmsgMCAqLwotI2RlZmluZSBQSU5HUk9VUF9SRUdfU1RBUlQJCQkweDMwMDAJLyogYmFuayAxICovCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfQQkJMHg4NjgJLyogYmFuayAwICovCisjZGVmaW5lIFBJTkdST1VQX1JFR19BCQkJMHgzMDAwCS8qIGJhbmsgMSAqLwogCi0jZGVmaW5lIFBJTkdST1VQX1JFR19ZKHIpCQkJKChyKSAtIFBJTkdST1VQX1JFR19TVEFSVCkKLSNkZWZpbmUgUElOR1JPVVBfUkVHX04ocikJCQktMQorI2RlZmluZSBQSU5HUk9VUF9SRUdfWShyKQkJKChyKSAtIFBJTkdST1VQX1JFR19BKQorI2RlZmluZSBQSU5HUk9VUF9SRUdfTihyKQkJLTEKIAogI2RlZmluZSBQSU5HUk9VUChwZ19uYW1lLCBmMCwgZjEsIGYyLCBmMywgZl9zYWZlLCByLCBvZCwgaW9yLCByY3Zfc2VsKQlcCiAJewkJCQkJCQkJXApAQCAtMjQ4NCwxMyArMTU5MCwxNCBAQAogCQkuZHJ2dHlwZV9yZWcgPSAtMSwJCQkJCVwKIAl9CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX0RWUlRZUEVfWShyKSAoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19TVEFSVCkKLSNkZWZpbmUgRFJWX1BJTkdST1VQX0RWUlRZUEVfTihyKSAtMQorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX1kocikJCSgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfTihyKQkJLTEKKwogCiAjZGVmaW5lIERSVl9QSU5HUk9VUChwZ19uYW1lLCByLCBoc21fYiwgc2NobWl0dF9iLCBscG1kX2IsCQlcCi0JCQlkcnZkbl9iLCBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LAkJXAotCQkJc2x3cl9iLCBzbHdyX3csIHNsd2ZfYiwgc2x3Zl93LAkJCVwKLQkJCWRydnR5cGUpCQkJCQlcCisJCSAgICAgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywJCVwKKwkJICAgICBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3csCQkJXAorCQkgICAgIGRydnR5cGUpCQkJCQkJXAogCXsJCQkJCQkJCVwKIAkJLm5hbWUgPSAiZHJpdmVfIiAjcGdfbmFtZSwJCQkJXAogCQkucGlucyA9IGRyaXZlXyMjcGdfbmFtZSMjX3BpbnMsCQkJCVwKQEAgLTI1MDMsNyArMTYxMCw3IEBACiAJCS5sb2NrX3JlZyA9IC0xLAkJCQkJCVwKIAkJLmlvcmVzZXRfcmVnID0gLTEsCQkJCQlcCiAJCS5yY3Zfc2VsX3JlZyA9IC0xLAkJCQkJXAotCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9EVlJUWVBFX1kociksCQkJXAorCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9SRUdfWShyKSwJCQlcCiAJCS5kcnZfYmFuayA9IDAsCQkJCQkJXAogCQkuaHNtX2JpdCA9IGhzbV9iLAkJCQkJXAogCQkuc2NobWl0dF9iaXQgPSBzY2htaXR0X2IsCQkJCVwKQEAgLTI1MTYsMTQgKzE2MjMsMTMgQEAKIAkJLnNsd3Jfd2lkdGggPSBzbHdyX3csCQkJCQlcCiAJCS5zbHdmX2JpdCA9IHNsd2ZfYiwJCQkJCVwKIAkJLnNsd2Zfd2lkdGggPSBzbHdmX3csCQkJCQlcCi0JCS5kcnZ0eXBlX3JlZyA9IERSVl9QSU5HUk9VUF9EVlJUWVBFXyMjZHJ2dHlwZShyKSwJXAorCQkuZHJ2dHlwZV9yZWcgPSBEUlZfUElOR1JPVVBfUkVHXyMjZHJ2dHlwZShyKSwJCVwKIAkJLmRydnR5cGVfYmFuayA9IDAsCQkJCQlcCiAJCS5kcnZ0eXBlX2JpdCA9IDYsCQkJCQlcCiAJfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3Bpbmdyb3VwIHRlZ3JhMTE0X2dyb3Vwc1tdID0gewogCS8qICAgICAgIHBnX25hbWUsICAgICAgICAgICAgICAgIGYwLCAgICAgICAgIGYxLCAgICAgICAgIGYyLCAgICAgICAgICAgZjMsICAgICAgICAgIHNhZmUsICAgICByLCAgICAgIG9kLCBpb3IsIHJjdl9zZWwgKi8KLQkvKiBGSVhNRTogRmlsbCBpbiBjb3JyZWN0IGRhdGEgaW4gc2FmZSBjb2x1bW4gKi8KIAlQSU5HUk9VUCh1bHBpX2RhdGEwX3BvMSwgICAgICAgICBTUEkzLCAgICAgICBIU0ksICAgICAgICBVQVJUQSwgICAgICAgIFVMUEksICAgICAgICBVTFBJLCAgICAgMHgzMDAwLCAgTiwgIE4sICBOKSwKIAlQSU5HUk9VUCh1bHBpX2RhdGExX3BvMiwgICAgICAgICBTUEkzLCAgICAgICBIU0ksICAgICAgICBVQVJUQSwgICAgICAgIFVMUEksICAgICAgICBVTFBJLCAgICAgMHgzMDA0LCAgTiwgIE4sICBOKSwKIAlQSU5HUk9VUCh1bHBpX2RhdGEyX3BvMywgICAgICAgICBTUEkzLCAgICAgICBIU0ksICAgICAgICBVQVJUQSwgICAgICAgIFVMUEksICAgICAgICBVTFBJLCAgICAgMHgzMDA4LCAgTiwgIE4sICBOKSwKQEAgLTI2MzUsNiArMTc0MSw3IEBACiAJUElOR1JPVVAocGJiNiwgICAgICAgICAgICAgICAgICAgVkdQNiwgICAgICAgRElTUExBWUEsICAgRElTUExBWUIsICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJhNCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocGJiNywgICAgICAgICAgICAgICAgICAgSTJTNCwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJhOCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocGNjMiwgICAgICAgICAgICAgICAgICAgSTJTNCwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJhYywgIE4sICBOLCAgTiksCisJUElOR1JPVVAoanRhZ19ydGNrLCAgICAgICAgICAgICAgUlRDSywgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlRDSywgICAgIDB4MzJiMCwgIE4sICBOLCAgTiksCiAJUElOR1JPVVAocHdyX2kyY19zY2xfcHo2LCAgICAgICAgSTJDUFdSLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJiNCwgIFksICBOLCAgTiksCiAJUElOR1JPVVAocHdyX2kyY19zZGFfcHo3LCAgICAgICAgSTJDUFdSLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJiOCwgIFksICBOLCAgTiksCiAJUElOR1JPVVAoa2Jfcm93MF9wcjAsICAgICAgICAgICAgS0JDLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgUlNWRDQsICAgIDB4MzJiYywgIE4sICBOLCAgTiksCkBAIC0yNjYxLDYgKzE3NjgsNyBAQAogCVBJTkdST1VQKGNvcmVfcHdyX3JlcSwgICAgICAgICAgIFBXUk9OLCAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMjQsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKGNwdV9wd3JfcmVxLCAgICAgICAgICAgIENQVSwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMjgsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHB3cl9pbnRfbiwgICAgICAgICAgICAgIFBNSSwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMmMsICBOLCAgTiwgIE4pLAorCVBJTkdST1VQKGNsa18zMmtfaW4sICAgICAgICAgICAgIENMSywgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIENMSywgICAgICAweDMzMzAsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKG93ciwgICAgICAgICAgICAgICAgICAgIE9XUiwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMzQsICBOLCAgTiwgIFkpLAogCVBJTkdST1VQKGRhcDFfZnNfcG4wLCAgICAgICAgICAgIEkyUzAsICAgICAgIEhEQSwgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzMzgsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKGRhcDFfZGluX3BuMSwgICAgICAgICAgIEkyUzAsICAgICAgIEhEQSwgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzM2MsICBOLCAgTiwgIE4pLApAQCAtMjY5NywzOCArMTgwNSw0OCBAQAogCVBJTkdST1VQKHVzYl92YnVzX2VuMV9wbjUsICAgICAgIFVTQiwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzZjgsICBZLCAgTiwgIE4pLAogCVBJTkdST1VQKHNkbW1jM19jbGtfbGJfaW5fcGVlNSwgIFNETU1DMywgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDMzZmMsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHNkbW1jM19jbGtfbGJfb3V0X3BlZTQsIFNETU1DMywgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFJTVkQ0LCAgICAweDM0MDAsICBOLCAgTiwgIE4pLAorCVBJTkdST1VQKGdtaV9jbGtfbGIsICAgICAgICAgICAgIFNETU1DMiwgICAgIE5BTkQsICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIEdNSSwgICAgICAweDM0MDQsICBOLCAgTiwgIE4pLAogCVBJTkdST1VQKHJlc2V0X291dF9uLCAgICAgICAgICAgIFJTVkQxLCAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUkVTRVRfT1VUX04sIFJTVkQzLCAgICAweDM0MDgsICBOLCAgTiwgIE4pLAogCiAJLyogcGdfbmFtZSwgciwgaHNtX2IsIHNjaG1pdHRfYiwgbHBtZF9iLCBkcnZkbl9iLCBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LCBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3csIGRydnR5cGUgKi8KLQlEUlZfUElOR1JPVVAoYW8xLCAgIDB4ODY4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGFvMiwgICAweDg2YywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChhdDEsICAgMHg4NzAsICAyLCAgMywgIDQsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKLQlEUlZfUElOR1JPVVAoYXQyLCAgIDB4ODc0LCAgMiwgIDMsICA0LCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCi0JRFJWX1BJTkdST1VQKGF0MywgICAweDg3OCwgIDIsICAzLCAgNCwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAotCURSVl9QSU5HUk9VUChhdDQsICAgMHg4N2MsICAyLCAgMywgIDQsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKLQlEUlZfUElOR1JPVVAoYXQ1LCAgIDB4ODgwLCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGNkZXYxLCAweDg4NCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChjZGV2MiwgMHg4ODgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGFwMSwgIDB4ODkwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGRhcDIsICAweDg5NCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChkYXAzLCAgMHg4OTgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGFwNCwgIDB4ODljLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGRiZywgICAweDhhMCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChzZGlvMywgMHg4YjAsICAyLCAgMywgLTEsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoc3BpLCAgIDB4OGI0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHVhYSwgICAweDhiOCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUCh1YWIsICAgMHg4YmMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAodWFydDIsIDB4OGMwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHVhcnQzLCAweDhjNCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChzZGlvMSwgMHg4ZWMsICAyLCAgMywgLTEsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZGRjLCAgIDB4OGZjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGdtYSwgICAweDkwMCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAotCURSVl9QSU5HUk9VUChnbWUsICAgMHg5MTAsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAoZ21mLCAgIDB4OTE0LCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKGdtZywgICAweDkxOCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAotCURSVl9QSU5HUk9VUChnbWgsICAgMHg5MWMsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKLQlEUlZfUElOR1JPVVAob3dyLCAgIDB4OTIwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCi0JRFJWX1BJTkdST1VQKHVkYSwgICAweDkyNCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChhbzEsICAgICAgICAgMHg4NjgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYW8yLCAgICAgICAgIDB4ODZjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGF0MSwgICAgICAgICAweDg3MCwgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAorCURSVl9QSU5HUk9VUChhdDIsICAgICAgICAgMHg4NzQsICAyLCAgMywgLTEsICAxMiwgIDcsICAyMCwgIDcsICAyOCwgIDIsICAzMCwgIDIsICBZKSwKKwlEUlZfUElOR1JPVVAoYXQzLCAgICAgICAgIDB4ODc4LCAgMiwgIDMsIC0xLCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCisJRFJWX1BJTkdST1VQKGF0NCwgICAgICAgICAweDg3YywgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIFkpLAorCURSVl9QSU5HUk9VUChhdDUsICAgICAgICAgMHg4ODAsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoY2RldjEsICAgICAgIDB4ODg0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGNkZXYyLCAgICAgICAweDg4OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkYXAxLCAgICAgICAgMHg4OTAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZGFwMiwgICAgICAgIDB4ODk0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGRhcDMsICAgICAgICAweDg5OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkYXA0LCAgICAgICAgMHg4OWMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZGJnLCAgICAgICAgIDB4OGEwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHNkaW8zLCAgICAgICAweDhiMCwgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChzcGksICAgICAgICAgMHg4YjQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAodWFhLCAgICAgICAgIDB4OGI4LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHVhYiwgICAgICAgICAweDhiYywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUCh1YXJ0MiwgICAgICAgMHg4YzAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAodWFydDMsICAgICAgIDB4OGM0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKHNkaW8xLCAgICAgICAweDhlYywgIDIsICAzLCAtMSwgIDEyLCAgNywgIDIwLCAgNywgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChkZGMsICAgICAgICAgMHg4ZmMsICAyLCAgMywgLTEsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZ21hLCAgICAgICAgIDB4OTAwLCAgMiwgIDMsIC0xLCAgMTQsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGdtZSwgICAgICAgICAweDkxMCwgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChnbWYsICAgICAgICAgMHg5MTQsICAyLCAgMywgIDQsICAxNCwgIDUsICAxOSwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoZ21nLCAgICAgICAgIDB4OTE4LCAgMiwgIDMsICA0LCAgMTQsICA1LCAgMTksICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGdtaCwgICAgICAgICAweDkxYywgIDIsICAzLCAgNCwgIDE0LCAgNSwgIDE5LCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChvd3IsICAgICAgICAgMHg5MjAsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAodWRhLCAgICAgICAgIDB4OTI0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCisJRFJWX1BJTkdST1VQKGRldjMsICAgICAgICAweDkyYywgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUChjZWMsICAgICAgICAgMHg5MzgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYXQ2LCAgICAgICAgIDB4OTk0LCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCisJRFJWX1BJTkdST1VQKGRhcDUsICAgICAgICAweDk5OCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIDIwLCAgNSwgIDI4LCAgMiwgIDMwLCAgMiwgIE4pLAorCURSVl9QSU5HUk9VUCh1c2JfdmJ1c19lbiwgMHg5OWMsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYW8zLCAgICAgICAgIDB4OWEwLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgLTEsIC0xLCAgMjgsICAyLCAgLTEsIC0xLCAgTiksCisJRFJWX1BJTkdST1VQKGh2MCwgICAgICAgICAweDlhNCwgIDIsICAzLCAgNCwgIDEyLCAgNSwgIC0xLCAtMSwgIDI4LCAgMiwgIC0xLCAtMSwgIE4pLAorCURSVl9QSU5HUk9VUChzZGlvNCwgICAgICAgMHg5YTgsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKKwlEUlZfUElOR1JPVVAoYW8wLCAgICAgICAgIDB4OWFjLCAgMiwgIDMsICA0LCAgMTIsICA1LCAgMjAsICA1LCAgMjgsICAyLCAgMzAsICAyLCAgTiksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3BpbmN0cmxfc29jX2RhdGEgdGVncmExMTRfcGluY3RybCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTI0LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTEyNC5jCmluZGV4IGMyMGUwZTEuLjczNzczNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTI0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMjQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBQaW5jdHJsIGRhdGEgZm9yIHRoZSBOVklESUEgVGVncmExMjQgcGlubXV4CiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIE5WSURJQSBDT1JQT1JBVElPTi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yMTIsOCArMjEyLDggQEAKICNkZWZpbmUgVEVHUkFfUElOX1BGRjIJCQkJX0dQSU8oMjUwKQogCiAvKiBBbGwgbm9uLUdQSU8gcGlucyBmb2xsb3cgKi8KLSNkZWZpbmUgTlVNX0dQSU9TCShURUdSQV9QSU5fUEZGMiArIDEpCi0jZGVmaW5lIF9QSU4ob2Zmc2V0KQkoTlVNX0dQSU9TICsgKG9mZnNldCkpCisjZGVmaW5lIE5VTV9HUElPUwkJCQkoVEVHUkFfUElOX1BGRjIgKyAxKQorI2RlZmluZSBfUElOKG9mZnNldCkJCQkJKE5VTV9HUElPUyArIChvZmZzZXQpKQogCiAvKiBOb24tR1BJTyBwaW5zICovCiAjZGVmaW5lIFRFR1JBX1BJTl9DT1JFX1BXUl9SRVEJCQlfUElOKDApCkBAIC0zMjUsMTMgKzMyNSwxMyBAQAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1c4X1BTMCwgIktCX1JPVzggUFMwIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzlfUFMxLCAiS0JfUk9XOSBQUzEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTBfUFMyLCAiS0JfUk9XMTAgUFMyIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzExX1BTMywgIktCX1JPVzEwIFBTMyIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxMl9QUzQsICJLQl9ST1cxMCBQUzQiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTNfUFM1LCAiS0JfUk9XMTAgUFM1IiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE0X1BTNiwgIktCX1JPVzEwIFBTNiIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxNV9QUzcsICJLQl9ST1cxMCBQUzciKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTZfUFQwLCAiS0JfUk9XMTAgUFQwIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE3X1BUMSwgIktCX1JPVzEwIFBUMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxMV9QUzMsICJLQl9ST1cxMSBQUzMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTJfUFM0LCAiS0JfUk9XMTIgUFM0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzEzX1BTNSwgIktCX1JPVzEzIFBTNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxNF9QUzYsICJLQl9ST1cxNCBQUzYiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fS0JfUk9XMTVfUFM3LCAiS0JfUk9XMTUgUFM3IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0tCX1JPVzE2X1BUMCwgIktCX1JPVzE2IFBUMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9LQl9ST1cxN19QVDEsICJLQl9ST1cxNyBQVDEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fR0VOMl9JMkNfU0NMX1BUNSwgIkdFTjJfSTJDX1NDTCBQVDUiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fR0VOMl9JMkNfU0RBX1BUNiwgIkdFTjJfSTJDX1NEQSBQVDYiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUM0X0NNRF9QVDcsICJTRE1NQzRfQ01EIFBUNyIpLApAQCAtNDA2LDE2ICs0MDYsMTYgQEAKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fSERNSV9DRUNfUEVFMywgIkhETUlfQ0VDIFBFRTMiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9PVVRfUEVFNCwgIlNETU1DM19DTEtfTEJfT1VUIFBFRTQiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMzX0NMS19MQl9JTl9QRUU1LCAiU0RNTUMzX0NMS19MQl9JTiBQRUU1IiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NPUkVfUFdSX1JFUSwgIkNPUkVfUFdSX1JFUSIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DUFVfUFdSX1JFUSwgIkNQVV9QV1JfUkVRIiksCi0JUElOQ1RSTF9QSU4oVEVHUkFfUElOX09XUiwgIk9XUiIpLAotCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QV1JfSU5UX04sICJQV1JfSU5UX04iKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fUkVTRVRfT1VUX04sICJSRVNFVF9PVVRfTiIpLAogCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EUF9IUERfUEZGMCwgIkRQX0hQRCBQRkYwIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VTQl9WQlVTX0VOMl9QRkYxLCAiVVNCX1ZCVVNfRU4yIFBGRjEiKSwKIAlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEZGMiwgIlBGRjIiKSwKLQlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLXzMyS19JTiwgIkNMS18zMktfSU4iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ09SRV9QV1JfUkVRLCAiQ09SRV9QV1JfUkVRIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NQVV9QV1JfUkVRLCAiQ1BVX1BXUl9SRVEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUFdSX0lOVF9OLCAiUFdSX0lOVF9OIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0dNSV9DTEtfTEIsICJHTUlfQ0xLX0xCIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1JFU0VUX09VVF9OLCAiUkVTRVRfT1VUX04iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fT1dSLCAiT1dSIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NMS18zMktfSU4sICJDTEtfMzJLX0lOIiksCiAJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0pUQUdfUlRDSywgIkpUQUdfUlRDSyIpLAogfTsKIApAQCAtMTEzOCw2ICsxMTM4LDcgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzZG1tYzNfY2xrX2xiX2luX3BlZTVfcGluc1tdID0gewogCVRFR1JBX1BJTl9TRE1NQzNfQ0xLX0xCX0lOX1BFRTUsCiB9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgZHBfaHBkX3BmZjBfcGluc1tdID0gewogCVRFR1JBX1BJTl9EUF9IUERfUEZGMCwKIH07CkBAIC0xMTU4LDI0ICsxMTU5LDI0IEBACiAJVEVHUkFfUElOX0NQVV9QV1JfUkVRLAogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIG93cl9waW5zW10gPSB7Ci0JVEVHUkFfUElOX09XUiwKLX07Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBwd3JfaW50X25fcGluc1tdID0gewogCVRFR1JBX1BJTl9QV1JfSU5UX04sCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZ21pX2Nsa19sYl9waW5zW10gPSB7CisJVEVHUkFfUElOX0dNSV9DTEtfTEIsCit9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgcmVzZXRfb3V0X25fcGluc1tdID0gewogCVRFR1JBX1BJTl9SRVNFVF9PVVRfTiwKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjbGtfMzJrX2luX3BpbnNbXSA9IHsKLQlURUdSQV9QSU5fQ0xLXzMyS19JTiwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBvd3JfcGluc1tdID0geworCVRFR1JBX1BJTl9PV1IsCiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgZ21pX2Nsa19sYl9waW5zW10gPSB7Ci0JVEVHUkFfUElOX0dNSV9DTEtfTEIsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2xrXzMya19pbl9waW5zW10gPSB7CisJVEVHUkFfUElOX0NMS18zMktfSU4sCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQganRhZ19ydGNrX3BpbnNbXSA9IHsKQEAgLTE0NDEsMTUgKzE0NDIsMTUgQEAKIAlURUdSQV9QSU5fUEZGMiwKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9jZWNfcGluc1tdID0gewotCVRFR1JBX1BJTl9IRE1JX0NFQ19QRUUzLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2RldjNfcGluc1tdID0gewogCVRFR1JBX1BJTl9DTEszX09VVF9QRUUwLAogCVRFR1JBX1BJTl9DTEszX1JFUV9QRUUxLAogfTsKIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX2NlY19waW5zW10gPSB7CisJVEVHUkFfUElOX0hETUlfQ0VDX1BFRTMsCit9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfYXQ2X3BpbnNbXSA9IHsKIAlURUdSQV9QSU5fUEsxLAogCVRFR1JBX1BJTl9QSzMsCkBAIC0xNDk2LDggKzE0OTcsMTAgQEAKIAogZW51bSB0ZWdyYV9tdXggewogCVRFR1JBX01VWF9CTElOSywKKwlURUdSQV9NVVhfQ0NMQSwKIAlURUdSQV9NVVhfQ0VDLAogCVRFR1JBX01VWF9DTERWRlMsCisJVEVHUkFfTVVYX0NMSywKIAlURUdSQV9NVVhfQ0xLMTIsCiAJVEVHUkFfTVVYX0NQVSwKIAlURUdSQV9NVVhfREFQLApAQCAtMTUwNyw2ICsxNTEwLDcgQEAKIAlURUdSQV9NVVhfRElTUExBWUEsCiAJVEVHUkFfTVVYX0RJU1BMQVlBX0FMVCwKIAlURUdSQV9NVVhfRElTUExBWUIsCisJVEVHUkFfTVVYX0RQLAogCVRFR1JBX01VWF9EVFYsCiAJVEVHUkFfTVVYX0VYVFBFUklQSDEsCiAJVEVHUkFfTVVYX0VYVFBFUklQSDIsCkBAIC0xNTI4LDYgKzE1MzIsOSBAQAogCVRFR1JBX01VWF9JUkRBLAogCVRFR1JBX01VWF9LQkMsCiAJVEVHUkFfTVVYX09XUiwKKwlURUdSQV9NVVhfUEUsCisJVEVHUkFfTVVYX1BFMCwKKwlURUdSQV9NVVhfUEUxLAogCVRFR1JBX01VWF9QTUksCiAJVEVHUkFfTVVYX1BXTTAsCiAJVEVHUkFfTVVYX1BXTTEsCkBAIC0xNTM5LDYgKzE1NDYsOCBAQAogCVRFR1JBX01VWF9SU1ZEMiwKIAlURUdSQV9NVVhfUlNWRDMsCiAJVEVHUkFfTVVYX1JTVkQ0LAorCVRFR1JBX01VWF9SVENLLAorCVRFR1JBX01VWF9TQVRBLAogCVRFR1JBX01VWF9TRE1NQzEsCiAJVEVHUkFfTVVYX1NETU1DMiwKIAlURUdSQV9NVVhfU0RNTUMzLApAQCAtMTU1MSw2ICsxNTYwLDggQEAKIAlURUdSQV9NVVhfU1BJNCwKIAlURUdSQV9NVVhfU1BJNSwKIAlURUdSQV9NVVhfU1BJNiwKKwlURUdSQV9NVVhfU1lTLAorCVRFR1JBX01VWF9UTURTLAogCVRFR1JBX01VWF9UUkFDRSwKIAlURUdSQV9NVVhfVUFSVEEsCiAJVEVHUkFfTVVYX1VBUlRCLApAQCAtMTU2OSwxMTM0ICsxNTgwLDE5IEBACiAJVEVHUkFfTVVYX1ZJX0FMVDMsCiAJVEVHUkFfTVVYX1ZJTUNMSzIsCiAJVEVHUkFfTVVYX1ZJTUNMSzJfQUxULAotCVRFR1JBX01VWF9TQVRBLAotCVRFR1JBX01VWF9DQ0xBLAotCVRFR1JBX01VWF9QRTAsCi0JVEVHUkFfTVVYX1BFLAotCVRFR1JBX01VWF9QRTEsCi0JVEVHUkFfTVVYX0RQLAotCVRFR1JBX01VWF9SVENLLAotCVRFR1JBX01VWF9TWVMsCi0JVEVHUkFfTVVYX0NMSywKLQlURUdSQV9NVVhfVE1EUywKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxpbmtfZ3JvdXBzW10gPSB7Ci0JImNsa18zMmtfb3V0X3BhMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNlY19ncm91cHNbXSA9IHsKLQkiaGRtaV9jZWNfcGVlMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsZHZmc19ncm91cHNbXSA9IHsKLQkicGgyIiwKLQkicGgzIiwKLQkia2Jfcm93N19wcjciLAotCSJrYl9yb3c4X3BzMCIsCi0JImR2ZnNfcHdtX3B4MCIsCi0JImR2ZnNfY2xrX3B4MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsazEyX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfd3Bfbl9wdjMiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNwdV9ncm91cHNbXSA9IHsKLQkiY3B1X3B3cl9yZXEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXBfZ3JvdXBzW10gPSB7Ci0JImRhcF9tY2xrMV9wZWUyIiwKLQkiY2xrMl9yZXFfcGNjNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDFfZ3JvdXBzW10gPSB7Ci0JImRhcF9tY2xrMV9wZWUyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwMl9ncm91cHNbXSA9IHsKLQkiZGFwX21jbGsxX3B3NCIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRldjNfZ3JvdXBzW10gPSB7Ci0JImNsazNfcmVxX3BlZTEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5YV9ncm91cHNbXSA9IHsKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkicGgxIiwKLQkicGk0IiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9jb2wzX3BxMyIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2FsdF9ncm91cHNbXSA9IHsKLQkia2Jfcm93Nl9wcjYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5Yl9ncm91cHNbXSA9IHsKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX3NjbGtfcHAzIiwKLQotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCi0JInBiYjMiLAotCSJwYmI0IiwKLQkicGJiNiIsCi0KLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCi0JInNkbW1jM19kYXQzX3BiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR0dl9ncm91cHNbXSA9IHsKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkicGk3IiwKLQkicGgwIiwKLQkicGg2IiwKLQkicGg3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMV9ncm91cHNbXSA9IHsKLQkiZGFwX21jbGsxX3B3NCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dHBlcmlwaDJfZ3JvdXBzW10gPSB7Ci0JImNsazJfb3V0X3B3NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dHBlcmlwaDNfZ3JvdXBzW10gPSB7Ci0JImNsazNfb3V0X3BlZTAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnbWlfZ3JvdXBzW10gPSB7Ci0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9kaW5fcHA1IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfc2Nsa19wcDciLAotCi0JInBjNyIsCi0KLQkicGcwIiwKLQkicGcxIiwKLQkicGcyIiwKLQkicGczIiwKLQkicGc0IiwKLQkicGc1IiwKLQkicGc2IiwKLQkicGc3IiwKLQotCSJwaDAiLAotCSJwaDEiLAotCSJwaDIiLAotCSJwaDMiLAotCSJwaDQiLAotCSJwaDUiLAotCSJwaDYiLAotCSJwaDciLAotCi0JInBpMCIsCi0JInBpMSIsCi0JInBpMiIsCi0JInBpMyIsCi0JInBpNCIsCi0JInBpNSIsCi0JInBpNiIsCi0JInBpNyIsCi0KLQkicGowIiwKLQkicGoyIiwKLQotCSJwazAiLAotCSJwazEiLAotCSJwazIiLAotCSJwazMiLAotCSJwazQiLAotCi0JInBqNyIsCi0JInBiMCIsCi0JInBiMSIsCi0JInBrNyIsCi0KLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi0JInNkbW1jNF9kYXQ3X3BhYTciLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JImdtaV9jbGtfbGIiLAotCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfc2Nsa19wbjMiLAotCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9kaW5fcGE0IiwKLQkiZGFwMl9kb3V0X3BhNSIsCi0JImRhcDJfc2Nsa19wYTMiLAotCi0JImR2ZnNfcHdtX3B4MCIsCi0JImR2ZnNfY2xrX3B4MiIsCi0JImdwaW9feDFfYXVkX3B4MSIsCi0JImdwaW9feDNfYXVkX3B4MyIsCi0JImdwaW9feDRfYXVkX3B4NCIsCi0JImdwaW9feDVfYXVkX3B4NSIsCi0JImdwaW9feDZfYXVkX3B4NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9hbHRfZ3JvdXBzW10gPSB7Ci0JInBjNyIsCi0JInBrNCIsCi0JInBqNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkYV9ncm91cHNbXSA9IHsKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoc2lfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMxX2dyb3Vwc1tdID0gewotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JImdwaW9fdzJfYXVkX3B3MiIsCi0JImdwaW9fdzNfYXVkX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzJfZ3JvdXBzW10gPSB7Ci0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjM19ncm91cHNbXSA9IHsKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjNF9ncm91cHNbXSA9IHsKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY3B3cl9ncm91cHNbXSA9IHsKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMF9ncm91cHNbXSA9IHsKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczFfZ3JvdXBzW10gPSB7Ci0JImRhcDJfZnNfcGEyIiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMyX2dyb3Vwc1tdID0gewotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX3NjbGtfcHAzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzM19ncm91cHNbXSA9IHsKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9zY2xrX3BwNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczRfZ3JvdXBzW10gPSB7Ci0JInBjYzEiLAotCSJwYmI2IiwKLQkicGJiNyIsCi0JInBjYzIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpcmRhX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtiY19ncm91cHNbXSA9IHsKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9yb3cxMV9wczMiLAotCSJrYl9yb3cxMl9wczQiLAotCSJrYl9yb3cxM19wczUiLAotCSJrYl9yb3cxNF9wczYiLAotCSJrYl9yb3cxNV9wczciLAotCSJrYl9yb3cxNl9wdDAiLAotCSJrYl9yb3cxN19wdDEiLAotCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvd3JfZ3JvdXBzW10gPSB7Ci0JInB1MCIsCi0JImtiX2NvbDRfcHE0IiwKLQkib3dyIiwKLQkic2RtbWMzX2NkX25fcHYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcG1pX2dyb3Vwc1tdID0gewotCSJwd3JfaW50X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20wX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJwdTMiLAotCSJwaDAiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20xX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJwdTQiLAotCSJwaDEiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20yX2dyb3Vwc1tdID0gewotCSJwdTUiLAotCSJwaDIiLAotCSJrYl9jb2wzX3BxMyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTNfZ3JvdXBzW10gPSB7Ci0JInB1NiIsCi0JInBoMyIsCi0JInNkbW1jM19jbWRfcGE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyb25fZ3JvdXBzW10gPSB7Ci0JImNvcmVfcHdyX3JlcSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJlc2V0X291dF9uX2dyb3Vwc1tdID0gewotCSJyZXNldF9vdXRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQxX2dyb3Vwc1tdID0gewotCSJwdjAiLAotCSJwdjEiLAotCi0JImhkbWlfaW50X3BuNyIsCi0JInB1MSIsCi0JInB1MiIsCi0JInBjNyIsCi0JInBpNyIsCi0JInBrMCIsCi0JInBqMCIsCi0JInBqMiIsCi0JInBrMiIsCi0JInBpMyIsCi0JInBpNiIsCi0KLQkicGcwIiwKLQkicGcxIiwKLQkicGcyIiwKLQkicGczIiwKLQkicGc0IiwKLQkicGc1IiwKLQkicGc2IiwKLQkicGc3IiwKLQotCSJwaTAiLAotCSJwaTEiLAotCi0JImdwaW9feDdfYXVkX3B4NyIsCi0KLQkicmVzZXRfb3V0X24iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkMl9ncm91cHNbXSA9IHsKLQkicHYwIiwKLQkicHYxIiwKLQotCSJzZG1tYzFfZGF0MF9weTciLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0KLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQotCSJjbGsyX291dF9wZWUwIiwKLQkiY2xrMl9yZXFfcGVlMSIsCi0JInBjNyIsCi0JInBpNSIsCi0JInBqMCIsCi0JInBqMiIsCi0KLQkicGs0IiwKLQkicGsyIiwKLQkicGkzIiwKLQkicGk2IiwKLQkicGcwIiwKLQkicGcxIiwKLQkicGc1IiwKLQkicGc2IiwKLQkicGc3IiwKLQotCSJwaDQiLAotCSJwaDUiLAotCSJwajciLAotCSJwYjAiLAotCSJwYjEiLAotCSJwazciLAotCSJwaTAiLAotCSJwaTEiLAotCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQkic2RtbWM0X2Nsa19wY2M0IiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQkicGNjMSIsCi0JInBiYjYiLAotCSJwYmI3IiwKLQkicGNjMiIsCi0JImp0YWdfcnRjayIsCi0KLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQotCSJrYl9yb3cwX3ByMCIsCi0JImtiX3JvdzFfcHIxIiwKLQkia2Jfcm93Ml9wcjIiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9yb3cxMV9wczMiLAotCSJrYl9yb3cxMl9wczQiLAotCSJrYl9yb3cxM19wczUiLAotCSJrYl9yb3cxNF9wczYiLAotCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDVfcHE1IiwKLQkia2JfY29sNl9wcTYiLAotCSJrYl9jb2w3X3BxNyIsCi0KLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJjbGtfMzJrX2luIiwKLQkib3dyIiwKLQotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0KLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi0JInBleF93YWtlX25fcGRkMyIsCi0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wxX2Nsa3JlcV9uX3BkZDYiLAotCSJoZG1pX2NlY19wZWUzIiwKLQotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInNkbW1jM19jbGtfbGJfb3V0X3BlZTQiLAotCSJzZG1tYzNfY2xrX2xiX2luX3BlZTUiLAotCSJnbWlfY2xrX2xiIiwKLQkicmVzZXRfb3V0X24iLAotCSJrYl9yb3cxNl9wdDAiLAotCSJrYl9yb3cxN19wdDEiLAotCSJkcF9ocGRfcGZmMCIsCi0JInVzYl92YnVzX2VuMl9wZmYxIiwKLQkicGZmMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQzX2dyb3Vwc1tdID0gewotCSJkYXAzX3NjbGtfcHAzIiwKLQkicHYwIiwKLQkicHYxIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQotCSJwdTYiLAotCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X3NjbGtfcHA3IiwKLQotCSJjbGszX291dF9wZWUwIiwKLQkiY2xrM19yZXFfcGVlMSIsCi0KLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JImdwaW9fcGNjMSIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkicGJiNSIsCi0JInBiYjciLAotCSJqdGFnX3J0Y2siLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzRfcHI0IiwKLQkia2Jfcm93NV9wcjUiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzE1X3BzNyIsCi0KLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJwd3JfaW50X24iLAotCSJjbGtfMzJrX2luIiwKLQkib3dyIiwKLQotCSJkYXBfbWNsazFfcHc0IiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQotCSJwZXhfbDBfcnN0X25fcGRkMSIsCi0JInBleF9sMF9jbGtyZXFfbl9wZGQyIiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkicGV4X2wxX3JzdF9uX3BkZDUiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JImhkbWlfY2VjX3BlZTMiLAotCi0JInNkbW1jM19jZF9uX3B2MiIsCi0JInVzYl92YnVzX2VuMF9wbjQiLAotCSJ1c2JfdmJ1c19lbjFfcG41IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi0JInNkbW1jM19jbGtfbGJfaW5fcGVlNSIsCi0JInJlc2V0X291dF9uIiwKLQkia2Jfcm93MTZfcHQwIiwKLQkia2Jfcm93MTdfcHQxIiwKLQkiZHBfaHBkX3BmZjAiLAotCSJ1c2JfdmJ1c19lbjJfcGZmMSIsCi0JInBmZjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkNF9ncm91cHNbXSA9IHsKLQkiZGFwM19kb3V0X3BwMiIsCi0JInB2MCIsCi0JInB2MSIsCi0JInNkbW1jMV9jbGtfcHowIiwKLQotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiaGRtaV9pbnRfcG43IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0KLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCi0JInB1MCIsCi0JInB1MSIsCi0JInB1MiIsCi0KLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCi0JImRhcDRfZnNfcHA0IiwKLQkiZGFwNF9kb3V0X3BwNiIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfc2Nsa19wcDciLAotCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQotCSJwaTUiLAotCSJwazEiLAotCSJwazIiLAotCSJwZzAiLAotCSJwZzEiLAotCSJwZzIiLAotCSJwZzMiLAotCSJwaDQiLAotCSJwaDUiLAotCSJwYjAiLAotCSJwYjEiLAotCSJwazciLAotCSJwaTAiLAotCSJwaTEiLAotCSJwaTIiLAotCi0JImdlbjJfaTJjX3NjbF9wdDUiLAotCSJnZW4yX2kyY19zZGFfcHQ2IiwKLQotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQotCSJqdGFnX3J0Y2siLAotCSJwd3JfaTJjX3NjbF9wejYiLAotCSJwd3JfaTJjX3NkYV9wejciLAotCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0KLQkia2JfY29sMF9wcTAiLAotCSJrYl9jb2wxX3BxMSIsCi0JImtiX2NvbDJfcHEyIiwKLQkia2JfY29sNV9wcTUiLAotCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JImNvcmVfcHdyX3JlcSIsCi0JImNwdV9wd3JfcmVxIiwKLQkicHdyX2ludF9uIiwKLQkiY2xrXzMya19pbiIsCi0JIm93ciIsCi0KLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX3NjbGtfcG4zIiwKLQkiZGFwX21jbGsxX3JlcV9wZWUyIiwKLQkiZGFwX21jbGsxX3B3NSIsCi0KLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9zY2xrX3BhMyIsCi0KLQkiZHZmc19wd21fcHgwIiwKLQkiZHZmc19jbGtfcHgyIiwKLQkiZ3Bpb194MV9hdWRfcHgxIiwKLQkiZ3Bpb194M19hdWRfcHgzIiwKLQotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCi0JInBleF9sMF9yc3Rfbl9wZGQxIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfd2FrZV9uX3BkZDMiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMV9jbGtyZXFfbl9wZGQ2IiwKLQkiaGRtaV9jZWNfcGVlMyIsCi0KLQkic2RtbWMzX2NkX25fcHYyIiwKLQkidXNiX3ZidXNfZW4wX3BuNCIsCi0JInVzYl92YnVzX2VuMV9wbjUiLAotCSJzZG1tYzNfY2xrX2xiX291dF9wZWU0IiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkiZ21pX2Nsa19sYiIsCi0KLQkiZHBfaHBkX3BmZjAiLAotCSJ1c2JfdmJ1c19lbjJfcGZmMSIsCi0JInBmZjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzFfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9jbGtfcHowIiwKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2MiLAotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJzZG1tYzFfd3Bfbl9wdjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzJfZ3JvdXBzW10gPSB7Ci0JInBpNSIsCi0JInBrMSIsCi0JInBrMyIsCi0JInBrNCIsCi0JInBpNiIsCi0JInBoNCIsCi0JInBoNSIsCi0JInBoNiIsCi0JInBoNyIsCi0JInBpMiIsCi0JImNhbV9tY2xrX3BjYzAiLAotCSJwY2MxIiwKLQkicGJiMCIsCi0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JInBiYjciLAotCSJwY2MyIiwKLQkiZ21pX2Nsa19sYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jM19ncm91cHNbXSA9IHsKLQkicGswIiwKLQkicGNjMiIsCi0KLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0KLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQzX3BiNCIsCi0KLQkic2RtbWMzX2NkX25fcHYyIiwKLQkic2RtbWMzX2Nsa19sYl9pbl9wZWU1IiwKLQkic2RtbWMzX2Nsa19sYl9vdXRfcGVlNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkbW1jNF9ncm91cHNbXSA9IHsKLQkic2RtbWM0X2Nsa19wY2M0IiwKLQkic2RtbWM0X2NtZF9wdDciLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNvY19ncm91cHNbXSA9IHsKLQkicGswIiwKLQkicGoyIiwKLQkia2Jfcm93MTVfcHM3IiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BkaWZfZ3JvdXBzW10gPSB7Ci0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkidWFydDJfcnhkX3BjMyIsCi0JInVhcnQyX3R4ZF9wYzIiLAotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMV9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkiZ3Bpb194M19hdWRfcHgzIiwKLQkiZ3Bpb194NF9hdWRfcHg0IiwKLQkiZ3Bpb194NV9hdWRfcHg1IiwKLQkiZ3Bpb194Nl9hdWRfcHg2IiwKLQkiZ3Bpb194N19hdWRfcHg3IiwKLQkiZ3Bpb193M19hdWRfcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9ncm91cHNbXSA9IHsKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX2NvbDBfcHEwIiwKLQkia2JfY29sMV9wcTEiLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJncGlvX3g0X2F1ZF9weDQiLAotCSJncGlvX3g1X2F1ZF9weDUiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3g3X2F1ZF9weDciLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkzX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzNfY2xrX3BhNiIsCi0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLQkic2RtbWMzX2RhdDNfcGI0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNF9ncm91cHNbXSA9IHsKLQkic2RtbWMxX2NtZF9wejEiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0MF9weTciLAotCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQkidWFydDNfdHhkX3B3NiIsCi0JInVhcnQzX3J4ZF9wdzciLAotCi0JInBpMyIsCi0JInBnNCIsCi0JInBnNSIsCi0JInBnNiIsCi0JInBnNyIsCi0JInBoMyIsCi0JInBpNCIsCi0JInNkbW1jMV93cF9uX3B2MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTVfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfc2Nsa19wcDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk2X2dyb3Vwc1tdID0gewotCSJkdmZzX3B3bV9weDAiLAotCSJncGlvX3gxX2F1ZF9weDEiLAotCSJncGlvX3gzX2F1ZF9weDMiLAotCSJkdmZzX2Nsa19weDIiLAotCSJncGlvX3g2X2F1ZF9weDYiLAotCSJncGlvX3cyX2F1ZF9wdzIiLAotCSJncGlvX3czX2F1ZF9wdzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0cmFjZV9ncm91cHNbXSA9IHsKLQkicGkyIiwKLQkicGk0IiwKLQkicGk3IiwKLQkicGgwIiwKLQkicGg2IiwKLQkicGg3IiwKLQkicGcyIiwKLQkicGczIiwKLQkicGsxIiwKLQkicGszIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGFfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQotCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLQotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCi0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMxX3dwX25fcHYzIiwKLQotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Yl9ncm91cHNbXSA9IHsKLQkidWFydDJfcnRzX25fcGo2IiwKLQkidWFydDJfY3RzX25fcGo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGNfZ3JvdXBzW10gPSB7Ci0JInVhcnQzX3R4ZF9wdzYiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfY3RzX25fcGExIiwKLQkidWFydDNfcnRzX25fcGMwIiwKLQkia2Jfcm93MTZfcHQwIiwKLQkia25fcm93MTdfcHQxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGRfZ3JvdXBzW10gPSB7Ci0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi0JInBqNyIsCi0JInBiMCIsCi0JInBiMSIsCi0JInBrNyIsCi0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1bHBpX2dyb3Vwc1tdID0gewotCSJ1bHBpX2RhdGEwX3BvMSIsCi0JInVscGlfZGF0YTFfcG8yIiwKLQkidWxwaV9kYXRhMl9wbzMiLAotCSJ1bHBpX2RhdGEzX3BvNCIsCi0JInVscGlfZGF0YTRfcG81IiwKLQkidWxwaV9kYXRhNV9wbzYiLAotCSJ1bHBpX2RhdGE2X3BvNyIsCi0JInVscGlfZGF0YTdfcG8wIiwKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiX2dyb3Vwc1tdID0gewotCSJwajAiLAotCSJ1c2JfdmJ1c19lbjBfcG40IiwKLQkidXNiX3ZidXNfZW4xX3BuNSIsCi0JInVzYl92YnVzX2VuMl9wZmYxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwMV9ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDJfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2RhX3BiYjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AzX2dyb3Vwc1tdID0gewotCSJwYmIzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNF9ncm91cHNbXSA9IHsKLQkicGJiNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDVfZ3JvdXBzW10gPSB7Ci0JInBiYjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A2X2dyb3Vwc1tdID0gewotCSJwYmIwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQxX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfYWx0M19ncm91cHNbXSA9IHsKLQkiY2FtX21jbGtfcGNjMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpbWNsazJfZ3JvdXBzW10gPSB7Ci0JInBiYjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aW1jbGsyX2FsdF9ncm91cHNbXSA9IHsKLQkicGJiMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNhdGFfZ3JvdXBzW10gPSB7Ci0JImRhcF9tY2xrMV9yZXFfcGVlMiIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJwZmYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2NsYV9ncm91cHNbXSA9IHsKLQkicGszIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnRja19ncm91cHNbXSA9IHsKLQkianRhZ19ydGNrIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzX2dyb3Vwc1tdID0gewotCSJrYl9yb3czX3ByMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBlMF9ncm91cHNbXSA9IHsKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDBfY2xrcmVxX25fcGRkMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBlX2dyb3Vwc1tdID0gewotCSJwZXhfd2FrZV9uX3BkZDMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwZTFfZ3JvdXBzW10gPSB7Ci0JInBleF9sMV9yc3Rfbl9wZGQ1IiwKLQkicGV4X2wxX2Nsa3JlcV9uX3BkZDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkcF9ncm91cHNbXSA9IHsKLQkiZHBfaHBkX3BmZjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGtfZ3JvdXBzW10gPSB7Ci0JImNsa18zMmtfaW4iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0bWRzX2dyb3Vwc1tdID0gewotCSJwZzQiLAotCSJwaDEiLAotCSJwaDIiLAogfTsKIAogI2RlZmluZSBGVU5DVElPTihmbmFtZSkJCQkJCVwKIAl7CQkJCQkJXAogCQkubmFtZSA9ICNmbmFtZSwJCQkJXAotCQkuZ3JvdXBzID0gZm5hbWUjI19ncm91cHMsCQlcCi0JCS5uZ3JvdXBzID0gQVJSQVlfU0laRShmbmFtZSMjX2dyb3VwcyksCVwKIAl9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmExMjRfZnVuY3Rpb25zW10gPSB7CitzdGF0aWMgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHRlZ3JhMTI0X2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGJsaW5rKSwKKwlGVU5DVElPTihjY2xhKSwKIAlGVU5DVElPTihjZWMpLAogCUZVTkNUSU9OKGNsZHZmcyksCisJRlVOQ1RJT04oY2xrKSwKIAlGVU5DVElPTihjbGsxMiksCiAJRlVOQ1RJT04oY3B1KSwKIAlGVU5DVElPTihkYXApLApAQCAtMjcwNiw2ICsxNjAyLDcgQEAKIAlGVU5DVElPTihkaXNwbGF5YSksCiAJRlVOQ1RJT04oZGlzcGxheWFfYWx0KSwKIAlGVU5DVElPTihkaXNwbGF5YiksCisJRlVOQ1RJT04oZHApLAogCUZVTkNUSU9OKGR0diksCiAJRlVOQ1RJT04oZXh0cGVyaXBoMSksCiAJRlVOQ1RJT04oZXh0cGVyaXBoMiksCkBAIC0yNzI3LDYgKzE2MjQsOSBAQAogCUZVTkNUSU9OKGlyZGEpLAogCUZVTkNUSU9OKGtiYyksCiAJRlVOQ1RJT04ob3dyKSwKKwlGVU5DVElPTihwZSksCisJRlVOQ1RJT04ocGUwKSwKKwlGVU5DVElPTihwZTEpLAogCUZVTkNUSU9OKHBtaSksCiAJRlVOQ1RJT04ocHdtMCksCiAJRlVOQ1RJT04ocHdtMSksCkBAIC0yNzM4LDYgKzE2MzgsOCBAQAogCUZVTkNUSU9OKHJzdmQyKSwKIAlGVU5DVElPTihyc3ZkMyksCiAJRlVOQ1RJT04ocnN2ZDQpLAorCUZVTkNUSU9OKHJ0Y2spLAorCUZVTkNUSU9OKHNhdGEpLAogCUZVTkNUSU9OKHNkbW1jMSksCiAJRlVOQ1RJT04oc2RtbWMyKSwKIAlGVU5DVElPTihzZG1tYzMpLApAQCAtMjc1MCw2ICsxNjUyLDggQEAKIAlGVU5DVElPTihzcGk0KSwKIAlGVU5DVElPTihzcGk1KSwKIAlGVU5DVElPTihzcGk2KSwKKwlGVU5DVElPTihzeXMpLAorCUZVTkNUSU9OKHRtZHMpLAogCUZVTkNUSU9OKHRyYWNlKSwKIAlGVU5DVElPTih1YXJ0YSksCiAJRlVOQ1RJT04odWFydGIpLApAQCAtMjc2OCwyMyArMTY3MiwxMyBAQAogCUZVTkNUSU9OKHZpX2FsdDMpLAogCUZVTkNUSU9OKHZpbWNsazIpLAogCUZVTkNUSU9OKHZpbWNsazJfYWx0KSwKLQlGVU5DVElPTihzYXRhKSwKLQlGVU5DVElPTihjY2xhKSwKLQlGVU5DVElPTihwZTApLAotCUZVTkNUSU9OKHBlKSwKLQlGVU5DVElPTihwZTEpLAotCUZVTkNUSU9OKGRwKSwKLQlGVU5DVElPTihydGNrKSwKLQlGVU5DVElPTihzeXMpLAotCUZVTkNUSU9OKGNsayksCi0JRlVOQ1RJT04odG1kcyksCiB9OwogCi0jZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfQQkweDg2OAkvKiBiYW5rIDAgKi8KLSNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCTB4MzAwMAkvKiBiYW5rIDEgKi8KKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCQkweDg2OAkvKiBiYW5rIDAgKi8KKyNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCQkweDMwMDAJLyogYmFuayAxICovCiAKLSNkZWZpbmUgUElOR1JPVVBfUkVHX1kocikJKChyKSAtIFBJTkdST1VQX1JFR19BKQotI2RlZmluZSBQSU5HUk9VUF9SRUdfTihyKQktMQorI2RlZmluZSBQSU5HUk9VUF9SRUdfWShyKQkJKChyKSAtIFBJTkdST1VQX1JFR19BKQorI2RlZmluZSBQSU5HUk9VUF9SRUdfTihyKQkJLTEKIAogI2RlZmluZSBQSU5HUk9VUChwZ19uYW1lLCBmMCwgZjEsIGYyLCBmMywgZl9zYWZlLCByLCBvZCwgaW9yLCByY3Zfc2VsKQlcCiAJewkJCQkJCQkJXApAQCAtMjc5MiwxMiArMTY4NiwxMiBAQAogCQkucGlucyA9IHBnX25hbWUjI19waW5zLAkJCQkJXAogCQkubnBpbnMgPSBBUlJBWV9TSVpFKHBnX25hbWUjI19waW5zKSwJCQlcCiAJCS5mdW5jcyA9IHsJCQkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYwLAkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYxLAkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYyLAkJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYzLAkJCQlcCisJCQlURUdSQV9NVVhfIyNmMCwJCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YxLAkJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjIsCQkJCQlcCisJCQlURUdSQV9NVVhfIyNmMywJCQkJCVwKIAkJfSwJCQkJCQkJXAotCQkuZnVuY19zYWZlID0gVEVHUkFfTVVYXyAjIyBmX3NhZmUsCQkJXAorCQkuZnVuY19zYWZlID0gVEVHUkFfTVVYXyMjZl9zYWZlLAkJCVwKIAkJLm11eF9yZWcgPSBQSU5HUk9VUF9SRUdfWShyKSwJCQkJXAogCQkubXV4X2JhbmsgPSAxLAkJCQkJCVwKIAkJLm11eF9iaXQgPSAwLAkJCQkJCVwKQEAgLTI4MjYsOCArMTcyMCw5IEBACiAJCS5kcnZ0eXBlX3JlZyA9IC0xLAkJCQkJXAogCX0KIAotI2RlZmluZSBEUlZfUElOR1JPVVBfRFZSVFlQRV9ZKHIpICgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCi0jZGVmaW5lIERSVl9QSU5HUk9VUF9EVlJUWVBFX04ocikgLTEKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKQorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX04ocikJCS0xCisKIAogI2RlZmluZSBEUlZfUElOR1JPVVAocGdfbmFtZSwgciwgaHNtX2IsIHNjaG1pdHRfYiwgbHBtZF9iLAkJXAogCQkgICAgIGRydmRuX2IsIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csCQlcCkBAIC0yODQ1LDcgKzE3NDAsNyBAQAogCQkubG9ja19yZWcgPSAtMSwJCQkJCQlcCiAJCS5pb3Jlc2V0X3JlZyA9IC0xLAkJCQkJXAogCQkucmN2X3NlbF9yZWcgPSAtMSwJCQkJCVwKLQkJLmRydl9yZWcgPSBEUlZfUElOR1JPVVBfRFZSVFlQRV9ZKHIpLAkJCVwKKwkJLmRydl9yZWcgPSBEUlZfUElOR1JPVVBfUkVHX1kociksCQkJXAogCQkuZHJ2X2JhbmsgPSAwLAkJCQkJCVwKIAkJLmhzbV9iaXQgPSBoc21fYiwJCQkJCVwKIAkJLnNjaG1pdHRfYml0ID0gc2NobWl0dF9iLAkJCQlcCkBAIC0yODU4LDcgKzE3NTMsNyBAQAogCQkuc2x3cl93aWR0aCA9IHNsd3JfdywJCQkJCVwKIAkJLnNsd2ZfYml0ID0gc2x3Zl9iLAkJCQkJXAogCQkuc2x3Zl93aWR0aCA9IHNsd2ZfdywJCQkJCVwKLQkJLmRydnR5cGVfcmVnID0gRFJWX1BJTkdST1VQX0RWUlRZUEVfIyNkcnZ0eXBlKHIpLAlcCisJCS5kcnZ0eXBlX3JlZyA9IERSVl9QSU5HUk9VUF9SRUdfIyNkcnZ0eXBlKHIpLAkJXAogCQkuZHJ2dHlwZV9iYW5rID0gMCwJCQkJCVwKIAkJLmRydnR5cGVfYml0ID0gNiwJCQkJCVwKIAl9CkBAIC0yOTA5LDggKzE4MDQsOCBAQAogICAgICAgIFBJTkdST1VQKHB1NCwgICAgICAgICAgICAgICAgICAgIFBXTTEsICAgICAgIFVBUlRBLCAgICAgIEdNSSwgICAgICAgICAgRElTUExBWUIsICAgIFBXTTEsICAgICAgIDB4MzE5NCwgIE4sICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAocHU1LCAgICAgICAgICAgICAgICAgICAgUFdNMiwgICAgICAgVUFSVEEsICAgICAgR01JLCAgICAgICAgICBESVNQTEFZQiwgICAgUFdNMiwgICAgICAgMHgzMTk4LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChwdTYsICAgICAgICAgICAgICAgICAgICBQV00zLCAgICAgICBVQVJUQSwgICAgICBSU1ZEMywgICAgICAgIEdNSSwgICAgICAgICBSU1ZEMywgICAgICAweDMxOWMsICBOLCAgTiwgIE4pLAotICAgICAgIFBJTkdST1VQKGdlbjFfaTJjX3NjbF9wYzQsICAgICAgIEkyQzEsICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIEkyQzEsICAgICAgIDB4MzFhMCwgIFksICBOLCAgTiksCi0gICAgICAgUElOR1JPVVAoZ2VuMV9pMmNfc2RhX3BjNSwgICAgICAgSTJDMSwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgSTJDMSwgICAgICAgMHgzMWE0LCAgWSwgIE4sICBOKSwKKyAgICAgICBQSU5HUk9VUChnZW4xX2kyY19zZGFfcGM1LCAgICAgICBJMkMxLCAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBJMkMxLCAgICAgICAweDMxYTAsICBZLCAgTiwgIE4pLAorICAgICAgIFBJTkdST1VQKGdlbjFfaTJjX3NjbF9wYzQsICAgICAgIEkyQzEsICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIEkyQzEsICAgICAgIDB4MzFhNCwgIFksICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoZGFwNF9mc19wcDQsICAgICAgICAgICAgSTJTMywgICAgICAgR01JLCAgICAgICAgRFRWLCAgICAgICAgICBSU1ZENCwgICAgICAgSTJTMywgICAgICAgMHgzMWE4LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChkYXA0X2Rpbl9wcDUsICAgICAgICAgICBJMlMzLCAgICAgICBHTUksICAgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBJMlMzLCAgICAgICAweDMxYWMsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKGRhcDRfZG91dF9wcDYsICAgICAgICAgIEkyUzMsICAgICAgIEdNSSwgICAgICAgIERUViwgICAgICAgICAgUlNWRDQsICAgICAgIEkyUzMsICAgICAgIDB4MzFiMCwgIE4sICBOLCAgTiksCkBAIC0yOTY0LDkgKzE4NTksOSBAQAogICAgICAgIFBJTkdST1VQKHNkbW1jNF9kYXQ0X3BhYTQsICAgICAgIFNETU1DNCwgICAgIFNQSTMsICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFNETU1DNCwgICAgIDB4MzI3MCwgIE4sICBZLCAgTiksCiAgICAgICAgUElOR1JPVVAoc2RtbWM0X2RhdDVfcGFhNSwgICAgICAgU0RNTUM0LCAgICAgU1BJMywgICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgU0RNTUM0LCAgICAgMHgzMjc0LCAgTiwgIFksICBOKSwKICAgICAgICBQSU5HUk9VUChzZG1tYzRfZGF0Nl9wYWE2LCAgICAgICBTRE1NQzQsICAgICBTUEkzLCAgICAgICBHTUksICAgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzQsICAgICAweDMyNzgsICBOLCAgWSwgIE4pLAotICAgICAgIFBJTkdST1VQKHNkbW1jNF9kYXQ3X3BhYTcsICAgICAgIFNETU1DNCwgICAgIFJTVkQxLCAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgIFNETU1DNCwgICAgIDB4MzI3YywgIE4sICBZLCAgTiksCisgICAgICAgUElOR1JPVVAoc2RtbWM0X2RhdDdfcGFhNywgICAgICAgU0RNTUM0LCAgICAgUlNWRDIsICAgICAgR01JLCAgICAgICAgICBSU1ZENCwgICAgICAgU0RNTUM0LCAgICAgMHgzMjdjLCAgTiwgIFksICBOKSwKICAgICAgICBQSU5HUk9VUChjYW1fbWNsa19wY2MwLCAgICAgICAgICBWSSwgICAgICAgICBWSV9BTFQxLCAgICBWSV9BTFQzLCAgICAgIFNETU1DMiwgICAgICBWSSwgICAgICAgICAweDMyODQsICBOLCAgTiwgIE4pLAotICAgICAgIFBJTkdST1VQKHBjYzEsICAgICAgICAgICAgICAgICAgIEkyUzQsICAgICAgIFJTVkQxLCAgICAgIFJTVkQzLCAgICAgICAgU0RNTUMyLCAgICAgIEkyUzQsICAgICAgIDB4MzI4OCwgIE4sICBOLCAgTiksCisgICAgICAgUElOR1JPVVAocGNjMSwgICAgICAgICAgICAgICAgICAgSTJTNCwgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBTRE1NQzIsICAgICAgSTJTNCwgICAgICAgMHgzMjg4LCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChwYmIwLCAgICAgICAgICAgICAgICAgICBWR1A2LCAgICAgICBWSU1DTEsyLCAgICBTRE1NQzIsICAgICAgIFZJTUNMSzJfQUxULCBWR1A2LCAgICAgICAweDMyOGMsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKGNhbV9pMmNfc2NsX3BiYjEsICAgICAgIFZHUDEsICAgICAgIEkyQzMsICAgICAgIFJTVkQzLCAgICAgICAgU0RNTUMyLCAgICAgIFZHUDEsICAgICAgIDB4MzI5MCwgIFksICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoY2FtX2kyY19zZGFfcGJiMiwgICAgICAgVkdQMiwgICAgICAgSTJDMywgICAgICAgUlNWRDMsICAgICAgICBTRE1NQzIsICAgICAgVkdQMiwgICAgICAgMHgzMjk0LCAgWSwgIE4sICBOKSwKQEAgLTMwNDcsOCArMTk0Miw4IEBACiAgICAgICAgUElOR1JPVVAoZ3Bpb193M19hdWRfcHczLCAgICAgICAgU1BJNiwgICAgICAgU1BJMSwgICAgICAgU1BJMiwgICAgICAgICBJMkMxLCAgICAgICAgU1BJMSwgICAgICAgMHgzM2YwLCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUCh1c2JfdmJ1c19lbjBfcG40LCAgICAgICBVU0IsICAgICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBVU0IsICAgICAgICAweDMzZjQsICBZLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKHVzYl92YnVzX2VuMV9wbjUsICAgICAgIFVTQiwgICAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFVTQiwgICAgICAgIDB4MzNmOCwgIFksICBOLCAgTiksCi0gICAgICAgUElOR1JPVVAoc2RtbWMzX2Nsa19sYl9vdXRfcGVlNCwgU0RNTUMzLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgU0RNTUMzLCAgICAgMHgzM2ZjLCAgTiwgIE4sICBOKSwKLSAgICAgICBQSU5HUk9VUChzZG1tYzNfY2xrX2xiX2luX3BlZTUsICBTRE1NQzMsICAgICBSU1ZEMiwgICAgICBSU1ZEMywgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzMsICAgICAweDM0MDAsICBOLCAgTiwgIE4pLAorICAgICAgIFBJTkdST1VQKHNkbW1jM19jbGtfbGJfaW5fcGVlNSwgIFNETU1DMywgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUlNWRDQsICAgICAgIFNETU1DMywgICAgIDB4MzNmYywgIE4sICBOLCAgTiksCisgICAgICAgUElOR1JPVVAoc2RtbWMzX2Nsa19sYl9vdXRfcGVlNCwgU0RNTUMzLCAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgU0RNTUMzLCAgICAgMHgzNDAwLCAgTiwgIE4sICBOKSwKICAgICAgICBQSU5HUk9VUChnbWlfY2xrX2xiLCAgICAgICAgICAgICBTRE1NQzIsICAgICBSU1ZEMiwgICAgICBHTUksICAgICAgICAgIFJTVkQ0LCAgICAgICBTRE1NQzIsICAgICAweDM0MDQsICBOLCAgTiwgIE4pLAogICAgICAgIFBJTkdST1VQKHJlc2V0X291dF9uLCAgICAgICAgICAgIFJTVkQxLCAgICAgIFJTVkQyLCAgICAgIFJTVkQzLCAgICAgICAgUkVTRVRfT1VUX04sIFJTVkQxLCAgICAgIDB4MzQwOCwgIE4sICBOLCAgTiksCiAgICAgICAgUElOR1JPVVAoa2Jfcm93MTZfcHQwLCAgICAgICAgICAgS0JDLCAgICAgICAgUlNWRDIsICAgICAgUlNWRDMsICAgICAgICBVQVJUQywgICAgICAgS0JDLCAgICAgICAgMHgzNDBjLCAgTiwgIE4sICBOKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjAuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjAuYwppbmRleCBmY2ZiN2QwLi5lMGI1MDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTIwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEyMC5jCkBAIC0xODk0LDYzNyArMTg5NCwxMiBAQAogCVRFR1JBX01VWF9YSU8sCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFoYl9jbGtfZ3JvdXBzW10gPSB7Ci0JImNkZXYyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXBiX2Nsa19ncm91cHNbXSA9IHsKLQkiY2RldjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRpb19zeW5jX2dyb3Vwc1tdID0gewotCSJjZGV2MSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNydF9ncm91cHNbXSA9IHsKLQkiY3J0cCIsCi0JImxtMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDFfZ3JvdXBzW10gPSB7Ci0JImRhcDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXAyX2dyb3Vwc1tdID0gewotCSJkYXAyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFwM19ncm91cHNbXSA9IHsKLQkiZGFwMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcDRfZ3JvdXBzW10gPSB7Ci0JImRhcDQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXA1X2dyb3Vwc1tdID0gewotCSJnbWUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5YV9ncm91cHNbXSA9IHsKLQkibGNzbiIsCi0JImxkMCIsCi0JImxkMSIsCi0JImxkMTAiLAotCSJsZDExIiwKLQkibGQxMiIsCi0JImxkMTMiLAotCSJsZDE0IiwKLQkibGQxNSIsCi0JImxkMTYiLAotCSJsZDE3IiwKLQkibGQyIiwKLQkibGQzIiwKLQkibGQ0IiwKLQkibGQ1IiwKLQkibGQ2IiwKLQkibGQ3IiwKLQkibGQ4IiwKLQkibGQ5IiwKLQkibGRjIiwKLQkibGRpIiwKLQkibGhwMCIsCi0JImxocDEiLAotCSJsaHAyIiwKLQkibGhzIiwKLQkibG0wIiwKLQkibG0xIiwKLQkibHBwIiwKLQkibHB3MCIsCi0JImxwdzEiLAotCSJscHcyIiwKLQkibHNjMCIsCi0JImxzYzEiLAotCSJsc2NrIiwKLQkibHNkYSIsCi0JImxzZGkiLAotCSJsc3BpIiwKLQkibHZwMCIsCi0JImx2cDEiLAotCSJsdnMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkaXNwbGF5Yl9ncm91cHNbXSA9IHsKLQkibGNzbiIsCi0JImxkMCIsCi0JImxkMSIsCi0JImxkMTAiLAotCSJsZDExIiwKLQkibGQxMiIsCi0JImxkMTMiLAotCSJsZDE0IiwKLQkibGQxNSIsCi0JImxkMTYiLAotCSJsZDE3IiwKLQkibGQyIiwKLQkibGQzIiwKLQkibGQ0IiwKLQkibGQ1IiwKLQkibGQ2IiwKLQkibGQ3IiwKLQkibGQ4IiwKLQkibGQ5IiwKLQkibGRjIiwKLQkibGRpIiwKLQkibGhwMCIsCi0JImxocDEiLAotCSJsaHAyIiwKLQkibGhzIiwKLQkibG0wIiwKLQkibG0xIiwKLQkibHBwIiwKLQkibHB3MCIsCi0JImxwdzEiLAotCSJscHcyIiwKLQkibHNjMCIsCi0JImxzYzEiLAotCSJsc2NrIiwKLQkibHNkYSIsCi0JImxzZGkiLAotCSJsc3BpIiwKLQkibHZwMCIsCi0JImx2cDEiLAotCSJsdnMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbWNfdGVzdDBfZGxsX2dyb3Vwc1tdID0gewotCSJrYmNhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZW1jX3Rlc3QxX2RsbF9ncm91cHNbXSA9IHsKLQkia2JjYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9ncm91cHNbXSA9IHsKLQkiYXRhIiwKLQkiYXRiIiwKLQkiYXRjIiwKLQkiYXRkIiwKLQkiYXRlIiwKLQkiZGFwMSIsCi0JImRhcDIiLAotCSJkYXA0IiwKLQkiZ21hIiwKLQkiZ21iIiwKLQkiZ21jIiwKLQkiZ21kIiwKLQkiZ21lIiwKLQkiZ3B1IiwKLQkiaXJyeCIsCi0JImlydHgiLAotCSJwdGEiLAotCSJzcGlhIiwKLQkic3BpYiIsCi0JInNwaWMiLAotCSJzcGlkIiwKLQkic3BpZSIsCi0JInVjYSIsCi0JInVjYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9pbnRfZ3JvdXBzW10gPSB7Ci0JImdtYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkbWlfZ3JvdXBzW10gPSB7Ci0JImhkaW50IiwKLQkibHB3MCIsCi0JImxwdzIiLAotCSJsc2MxIiwKLQkibHNjayIsCi0JImxzZGEiLAotCSJsc3BpIiwKLQkicHRhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjcF9ncm91cHNbXSA9IHsKLQkiaTJjcCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzFfZ3JvdXBzW10gPSB7Ci0JInJtIiwKLQkic3BkaSIsCi0JInNwZG8iLAotCSJzcGlnIiwKLQkic3BpaCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzJfZ3JvdXBzW10gPSB7Ci0JImRkYyIsCi0JInB0YSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzNfZ3JvdXBzW10gPSB7Ci0JImR0ZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlkZV9ncm91cHNbXSA9IHsKLQkiYXRhIiwKLQkiYXRiIiwKLQkiYXRjIiwKLQkiYXRkIiwKLQkiYXRlIiwKLQkiZ21iIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaXJkYV9ncm91cHNbXSA9IHsKLQkidWFkIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2JjX2dyb3Vwc1tdID0gewotCSJrYmNhIiwKLQkia2JjYiIsCi0JImtiY2MiLAotCSJrYmNkIiwKLQkia2JjZSIsCi0JImtiY2YiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaW9fZ3JvdXBzW10gPSB7Ci0JImtiY2IiLAotCSJrYmNkIiwKLQkia2JjZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcGlfaHNfZ3JvdXBzW10gPSB7Ci0JInVhYSIsCi0JInVhYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfZ3JvdXBzW10gPSB7Ci0JImF0YSIsCi0JImF0YiIsCi0JImF0YyIsCi0JImF0ZCIsCi0JImF0ZSIsCi0JImdtYiIsCi0JImdtZCIsCi0JImtiY2EiLAotCSJrYmNiIiwKLQkia2JjYyIsCi0JImtiY2QiLAotCSJrYmNlIiwKLQkia2JjZiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG9zY19ncm91cHNbXSA9IHsKLQkiY2RldjEiLAotCSJjZGV2MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG93cl9ncm91cHNbXSA9IHsKLQkia2JjZSIsCi0JIm93YyIsCi0JInVhYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjaWVfZ3JvdXBzW10gPSB7Ci0JImdwdiIsCi0JInNseGEiLAotCSJzbHhrIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsYV9vdXRfZ3JvdXBzW10gPSB7Ci0JImNkZXYxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsY19vdXQxX2dyb3Vwc1tdID0gewotCSJjc3VzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsbV9vdXQxX2dyb3Vwc1tdID0gewotCSJjZGV2MSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbHBfb3V0Ml9ncm91cHNbXSA9IHsKLQkiY3N1cyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbHBfb3V0M19ncm91cHNbXSA9IHsKLQkiY3N1cyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbHBfb3V0NF9ncm91cHNbXSA9IHsKLQkiY2RldjIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fZ3JvdXBzW10gPSB7Ci0JImdwdSIsCi0JInNkYiIsCi0JInNkYyIsCi0JInNkZCIsCi0JInVjYiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3cl9pbnRyX2dyb3Vwc1tdID0gewotCSJwbWMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3Jfb25fZ3JvdXBzW10gPSB7Ci0JInBtYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQxX2dyb3Vwc1tdID0gewotCSJkdGEiLAotCSJkdGIiLAotCSJkdGMiLAotCSJkdGQiLAotCSJkdGUiLAotCSJnbWQiLAotCSJnbWUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkMl9ncm91cHNbXSA9IHsKLQkiY3J0cCIsCi0JImRhcDEiLAotCSJkYXAzIiwKLQkiZGFwNCIsCi0JImRkYyIsCi0JImR0YiIsCi0JImR0YyIsCi0JImR0ZSIsCi0JImR0ZiIsCi0JImdwdTciLAotCSJncHYiLAotCSJoZGludCIsCi0JImkyY3AiLAotCSJvd2MiLAotCSJybSIsCi0JInNkaW8xIiwKLQkic3BkaSIsCi0JInNwZG8iLAotCSJ1YWMiLAotCSJ1Y2EiLAotCSJ1ZGEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkM19ncm91cHNbXSA9IHsKLQkiY3J0cCIsCi0JImRhcDIiLAotCSJkYXAzIiwKLQkiZGRjIiwKLQkiZ3B1NyIsCi0JImdwdiIsCi0JImhkaW50IiwKLQkiaTJjcCIsCi0JImxkMTciLAotCSJsZGMiLAotCSJsZGkiLAotCSJsaHAwIiwKLQkibGhwMSIsCi0JImxocDIiLAotCSJsbTEiLAotCSJscHAiLAotCSJscHcxIiwKLQkibHZwMCIsCi0JImx2cDEiLAotCSJvd2MiLAotCSJwbWMiLAotCSJybSIsCi0JInVhYyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQ0X2dyb3Vwc1tdID0gewotCSJhdGEiLAotCSJhdGUiLAotCSJjcnRwIiwKLQkiZGFwMyIsCi0JImRhcDQiLAotCSJkZGMiLAotCSJkdGEiLAotCSJkdGMiLAotCSJkdGQiLAotCSJkdGYiLAotCSJncHUiLAotCSJncHU3IiwKLQkiZ3B2IiwKLQkiaGRpbnQiLAotCSJpMmNwIiwKLQkia2JjZSIsCi0JImxjc24iLAotCSJsZDAiLAotCSJsZDEiLAotCSJsZDIiLAotCSJsZDMiLAotCSJsZDQiLAotCSJsZDUiLAotCSJsZDYiLAotCSJsZDciLAotCSJsZDgiLAotCSJsZDkiLAotCSJsZDEwIiwKLQkibGQxMSIsCi0JImxkMTIiLAotCSJsZDEzIiwKLQkibGQxNCIsCi0JImxkMTUiLAotCSJsZDE2IiwKLQkibGQxNyIsCi0JImxkYyIsCi0JImxkaSIsCi0JImxocDAiLAotCSJsaHAxIiwKLQkibGhwMiIsCi0JImxocyIsCi0JImxtMCIsCi0JImxwcCIsCi0JImxwdzEiLAotCSJsc2MwIiwKLQkibHNkaSIsCi0JImx2cDAiLAotCSJsdnAxIiwKLQkibHZzIiwKLQkib3djIiwKLQkicG1jIiwKLQkicHRhIiwKLQkicm0iLAotCSJzcGlmIiwKLQkidWFjIiwKLQkidWNhIiwKLQkidWNiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnRja19ncm91cHNbXSA9IHsKLQkiZ3B1NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW8xX2dyb3Vwc1tdID0gewotCSJzZGlvMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW8yX2dyb3Vwc1tdID0gewotCSJkYXAxIiwKLQkiZHRhIiwKLQkiZHRkIiwKLQkia2JjYSIsCi0JImtiY2IiLAotCSJrYmNkIiwKLQkic3BkaSIsCi0JInNwZG8iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGlvM19ncm91cHNbXSA9IHsKLQkic2RiIiwKLQkic2RjIiwKLQkic2RkIiwKLQkic2x4YSIsCi0JInNseGMiLAotCSJzbHhkIiwKLQkic2x4ayIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaW80X2dyb3Vwc1tdID0gewotCSJhdGIiLAotCSJhdGMiLAotCSJhdGQiLAotCSJnbWEiLAotCSJnbWUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZmxhc2hfZ3JvdXBzW10gPSB7Ci0JImdtYyIsCi0JImdtZCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwZGlmX2dyb3Vwc1tdID0gewotCSJzbHhjIiwKLQkic2x4ZCIsCi0JInNwZGkiLAotCSJzcGRvIiwKLQkidWFkIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMV9ncm91cHNbXSA9IHsKLQkiZHRiIiwKLQkiZHRlIiwKLQkic3BpYSIsCi0JInNwaWIiLAotCSJzcGljIiwKLQkic3BpZCIsCi0JInNwaWUiLAotCSJzcGlmIiwKLQkidWRhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9ncm91cHNbXSA9IHsKLQkic2RiIiwKLQkic2x4YSIsCi0JInNseGMiLAotCSJzbHhkIiwKLQkic2x4ayIsCi0JInNwaWEiLAotCSJzcGliIiwKLQkic3BpYyIsCi0JInNwaWQiLAotCSJzcGllIiwKLQkic3BpZiIsCi0JInNwaWciLAotCSJzcGloIiwKLQkidWFiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMl9hbHRfZ3JvdXBzW10gPSB7Ci0JInNwaWQiLAotCSJzcGllIiwKLQkic3BpZyIsCi0JInNwaWgiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkzX2dyb3Vwc1tdID0gewotCSJnbWEiLAotCSJsY3NuIiwKLQkibG0wIiwKLQkibHB3MCIsCi0JImxwdzIiLAotCSJsc2MxIiwKLQkibHNjayIsCi0JImxzZGEiLAotCSJsc2RpIiwKLQkic2RjIiwKLQkic2RkIiwKLQkic3BpYSIsCi0JInNwaWIiLAotCSJzcGljIiwKLQkic3BpZiIsCi0JInNwaWciLAotCSJzcGloIiwKLQkidWFhIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNF9ncm91cHNbXSA9IHsKLQkiZ21jIiwKLQkiaXJyeCIsCi0JImlydHgiLAotCSJzbHhhIiwKLQkic2x4YyIsCi0JInNseGQiLAotCSJzbHhrIiwKLQkidWFkIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHJhY2VfZ3JvdXBzW10gPSB7Ci0JImtiY2MiLAotCSJrYmNmIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHdjX2dyb3Vwc1tdID0gewotCSJkYXAyIiwKLQkic2RjIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGFfZ3JvdXBzW10gPSB7Ci0JImdwdSIsCi0JImlycngiLAotCSJpcnR4IiwKLQkic2RiIiwKLQkic2RkIiwKLQkic2RpbzEiLAotCSJ1YWEiLAotCSJ1YWIiLAotCSJ1YWQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Yl9ncm91cHNbXSA9IHsKLQkiaXJyeCIsCi0JImlydHgiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0Y19ncm91cHNbXSA9IHsKLQkidWNhIiwKLQkidWNiIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydGRfZ3JvdXBzW10gPSB7Ci0JImdtYyIsCi0JInVkYSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRlX2dyb3Vwc1tdID0gewotCSJnbWEiLAotCSJzZGlvMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVscGlfZ3JvdXBzW10gPSB7Ci0JInVhYSIsCi0JInVhYiIsCi0JInVkYSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2dyb3Vwc1tdID0gewotCSJkdGEiLAotCSJkdGIiLAotCSJkdGMiLAotCSJkdGQiLAotCSJkdGUiLAotCSJkdGYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9zZW5zb3JfY2xrX2dyb3Vwc1tdID0gewotCSJjc3VzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeGlvX2dyb3Vwc1tdID0gewotCSJsZDAiLAotCSJsZDEiLAotCSJsZDEwIiwKLQkibGQxMSIsCi0JImxkMTIiLAotCSJsZDEzIiwKLQkibGQxNCIsCi0JImxkMTUiLAotCSJsZDE2IiwKLQkibGQyIiwKLQkibGQzIiwKLQkibGQ0IiwKLQkibGQ1IiwKLQkibGQ2IiwKLQkibGQ3IiwKLQkibGQ4IiwKLQkibGQ5IiwKLQkibGhzIiwKLQkibHNjMCIsCi0JImxzcGkiLAotCSJsdnMiLAotfTsKLQogI2RlZmluZSBGVU5DVElPTihmbmFtZSkJCQkJCVwKIAl7CQkJCQkJXAogCQkubmFtZSA9ICNmbmFtZSwJCQkJXAotCQkuZ3JvdXBzID0gZm5hbWUjI19ncm91cHMsCQlcCi0JCS5uZ3JvdXBzID0gQVJSQVlfU0laRShmbmFtZSMjX2dyb3VwcyksCVwKIAl9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmEyMF9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfZnVuY3Rpb24gdGVncmEyMF9mdW5jdGlvbnNbXSA9IHsKIAlGVU5DVElPTihhaGJfY2xrKSwKIAlGVU5DVElPTihhcGJfY2xrKSwKIAlGVU5DVElPTihhdWRpb19zeW5jKSwKQEAgLTI4ODEsMTggKzIyNTYsNyBAQAogCS5wcm9iZSA9IHRlZ3JhMjBfcGluY3RybF9wcm9iZSwKIAkucmVtb3ZlID0gdGVncmFfcGluY3RybF9yZW1vdmUsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0ZWdyYTIwX3BpbmN0cmxfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhMjBfcGluY3RybF9kcml2ZXIpOwotfQotYXJjaF9pbml0Y2FsbCh0ZWdyYTIwX3BpbmN0cmxfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0ZWdyYTIwX3BpbmN0cmxfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYTIwX3BpbmN0cmxfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHRlZ3JhMjBfcGluY3RybF9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGVncmEyMF9waW5jdHJsX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gV2FycmVuIDxzd2FycmVuQG52aWRpYS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk5WSURJQSBUZWdyYTIwIHBpbmN0cmwgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTMwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTMwLmMKaW5kZXggMjMwMGRlYi4uNDFkMjRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEzMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMzAuYwpAQCAtMjUsNyArMjUsNyBAQAogICogTW9zdCBwaW5zIGFmZmVjdGVkIGJ5IHRoZSBwaW5tdXggY2FuIGFsc28gYmUgR1BJT3MuIERlZmluZSB0aGVzZSBmaXJzdC4KICAqIFRoZXNlIG11c3QgbWF0Y2ggaG93IHRoZSBHUElPIGRyaXZlciBuYW1lcy9udW1iZXJzIGl0cyBwaW5zLgogICovCi0jZGVmaW5lIF9HUElPKG9mZnNldCkJCQkJKG9mZnNldCkKKyNkZWZpbmUgX0dQSU8ob2Zmc2V0KQkJCShvZmZzZXQpCiAKICNkZWZpbmUgVEVHUkFfUElOX0NMS18zMktfT1VUX1BBMAlfR1BJTygwKQogI2RlZmluZSBURUdSQV9QSU5fVUFSVDNfQ1RTX05fUEExCV9HUElPKDEpCkBAIC0yNzcsOCArMjc3LDggQEAKICNkZWZpbmUgVEVHUkFfUElOX1BFRTcJCQlfR1BJTygyNDcpCiAKIC8qIEFsbCBub24tR1BJTyBwaW5zIGZvbGxvdyAqLwotI2RlZmluZSBOVU1fR1BJT1MJCQkJKFRFR1JBX1BJTl9QRUU3ICsgMSkKLSNkZWZpbmUgX1BJTihvZmZzZXQpCQkJCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKKyNkZWZpbmUgTlVNX0dQSU9TCQkJKFRFR1JBX1BJTl9QRUU3ICsgMSkKKyNkZWZpbmUgX1BJTihvZmZzZXQpCQkJKE5VTV9HUElPUyArIChvZmZzZXQpKQogCiAvKiBOb24tR1BJTyBwaW5zICovCiAjZGVmaW5lIFRFR1JBX1BJTl9DTEtfMzJLX0lOCQlfUElOKDApCkBAIC0yMDE1LDEyNTMgKzIwMTUsMTMgQEAKIAlURUdSQV9NVVhfVklfQUxUMiwKIAlURUdSQV9NVVhfVklfQUxUMywKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsaW5rX2dyb3Vwc1tdID0gewotCSJjbGtfMzJrX291dF9wYTAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZWNfZ3JvdXBzW10gPSB7Ci0JImhkbWlfY2VjX3BlZTMiLAotCSJvd3IiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGtfMTJtX291dF9ncm91cHNbXSA9IHsKLQkicHYzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xrXzMya19pbl9ncm91cHNbXSA9IHsKLQkiY2xrXzMya19pbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvcmVfcHdyX3JlcV9ncm91cHNbXSA9IHsKLQkiY29yZV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3B1X3B3cl9yZXFfZ3JvdXBzW10gPSB7Ci0JImNwdV9wd3JfcmVxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3J0X2dyb3Vwc1tdID0gewotCSJjcnRfaHN5bmNfcHY2IiwKLQkiY3J0X3ZzeW5jX3B2NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhcF9ncm91cHNbXSA9IHsKLQkiY2xrMV9yZXFfcGVlMiIsCi0JImNsazJfcmVxX3BjYzUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZHJfZ3JvdXBzW10gPSB7Ci0JInZpX2QwX3B0NCIsCi0JInZpX2QxX3BkNSIsCi0JInZpX2QxMF9wdDIiLAotCSJ2aV9kMTFfcHQzIiwKLQkidmlfZDJfcGwwIiwKLQkidmlfZDNfcGwxIiwKLQkidmlfZDRfcGwyIiwKLQkidmlfZDVfcGwzIiwKLQkidmlfZDZfcGw0IiwKLQkidmlfZDdfcGw1IiwKLQkidmlfZDhfcGw2IiwKLQkidmlfZDlfcGw3IiwKLQkidmlfaHN5bmNfcGQ3IiwKLQkidmlfdnN5bmNfcGQ2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGV2M19ncm91cHNbXSA9IHsKLQkiY2xrM19yZXFfcGVlMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXlhX2dyb3Vwc1tdID0gewotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX3NjbGtfcHAzIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JImxjZF9jczBfbl9wbjQiLAotCSJsY2RfY3MxX25fcHcwIiwKLQkibGNkX2QwX3BlMCIsCi0JImxjZF9kMV9wZTEiLAotCSJsY2RfZDEwX3BmMiIsCi0JImxjZF9kMTFfcGYzIiwKLQkibGNkX2QxMl9wZjQiLAotCSJsY2RfZDEzX3BmNSIsCi0JImxjZF9kMTRfcGY2IiwKLQkibGNkX2QxNV9wZjciLAotCSJsY2RfZDE2X3BtMCIsCi0JImxjZF9kMTdfcG0xIiwKLQkibGNkX2QxOF9wbTIiLAotCSJsY2RfZDE5X3BtMyIsCi0JImxjZF9kMl9wZTIiLAotCSJsY2RfZDIwX3BtNCIsCi0JImxjZF9kMjFfcG01IiwKLQkibGNkX2QyMl9wbTYiLAotCSJsY2RfZDIzX3BtNyIsCi0JImxjZF9kM19wZTMiLAotCSJsY2RfZDRfcGU0IiwKLQkibGNkX2Q1X3BlNSIsCi0JImxjZF9kNl9wZTYiLAotCSJsY2RfZDdfcGU3IiwKLQkibGNkX2Q4X3BmMCIsCi0JImxjZF9kOV9wZjEiLAotCSJsY2RfZGMwX3BuNiIsCi0JImxjZF9kYzFfcGQyIiwKLQkibGNkX2RlX3BqMSIsCi0JImxjZF9oc3luY19wajMiLAotCSJsY2RfbTFfcHcxIiwKLQkibGNkX3BjbGtfcGIzIiwKLQkibGNkX3B3cjBfcGIyIiwKLQkibGNkX3B3cjFfcGMxIiwKLQkibGNkX3B3cjJfcGM2IiwKLQkibGNkX3Nja19wejQiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2Rfc2RvdXRfcG41IiwKLQkibGNkX3ZzeW5jX3BqNCIsCi0JImxjZF93cl9uX3B6MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpc3BsYXliX2dyb3Vwc1tdID0gewotCSJkYXAzX2Rpbl9wcDEiLAotCSJkYXAzX2RvdXRfcHAyIiwKLQkiZGFwM19mc19wcDAiLAotCSJkYXAzX3NjbGtfcHAzIiwKLQkicGJiMyIsCi0JInBiYjQiLAotCSJwYmI1IiwKLQkicGJiNiIsCi0JImxjZF9jczBfbl9wbjQiLAotCSJsY2RfY3MxX25fcHcwIiwKLQkibGNkX2QwX3BlMCIsCi0JImxjZF9kMV9wZTEiLAotCSJsY2RfZDEwX3BmMiIsCi0JImxjZF9kMTFfcGYzIiwKLQkibGNkX2QxMl9wZjQiLAotCSJsY2RfZDEzX3BmNSIsCi0JImxjZF9kMTRfcGY2IiwKLQkibGNkX2QxNV9wZjciLAotCSJsY2RfZDE2X3BtMCIsCi0JImxjZF9kMTdfcG0xIiwKLQkibGNkX2QxOF9wbTIiLAotCSJsY2RfZDE5X3BtMyIsCi0JImxjZF9kMl9wZTIiLAotCSJsY2RfZDIwX3BtNCIsCi0JImxjZF9kMjFfcG01IiwKLQkibGNkX2QyMl9wbTYiLAotCSJsY2RfZDIzX3BtNyIsCi0JImxjZF9kM19wZTMiLAotCSJsY2RfZDRfcGU0IiwKLQkibGNkX2Q1X3BlNSIsCi0JImxjZF9kNl9wZTYiLAotCSJsY2RfZDdfcGU3IiwKLQkibGNkX2Q4X3BmMCIsCi0JImxjZF9kOV9wZjEiLAotCSJsY2RfZGMwX3BuNiIsCi0JImxjZF9kYzFfcGQyIiwKLQkibGNkX2RlX3BqMSIsCi0JImxjZF9oc3luY19wajMiLAotCSJsY2RfbTFfcHcxIiwKLQkibGNkX3BjbGtfcGIzIiwKLQkibGNkX3B3cjBfcGIyIiwKLQkibGNkX3B3cjFfcGMxIiwKLQkibGNkX3B3cjJfcGM2IiwKLQkibGNkX3Nja19wejQiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2Rfc2RvdXRfcG41IiwKLQkibGNkX3ZzeW5jX3BqNCIsCi0JImxjZF93cl9uX3B6MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR0dl9ncm91cHNbXSA9IHsKLQkiZ21pX2ExN19wYjAiLAotCSJnbWlfYTE4X3BiMSIsCi0JImdtaV9jczBfbl9wajAiLAotCSJnbWlfY3MxX25fcGoyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMV9ncm91cHNbXSA9IHsKLQkiY2xrMV9vdXRfcHc0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoMl9ncm91cHNbXSA9IHsKLQkiY2xrMl9vdXRfcHc1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0cGVyaXBoM19ncm91cHNbXSA9IHsKLQkiY2xrM19vdXRfcGVlMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdtaV9ncm91cHNbXSA9IHsKLQkiZGFwMV9kaW5fcG4xIiwKLQkiZGFwMV9kb3V0X3BuMiIsCi0JImRhcDFfZnNfcG4wIiwKLQkiZGFwMV9zY2xrX3BuMyIsCi0JImRhcDJfZGluX3BhNCIsCi0JImRhcDJfZG91dF9wYTUiLAotCSJkYXAyX2ZzX3BhMiIsCi0JImRhcDJfc2Nsa19wYTMiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X3NjbGtfcHA3IiwKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQxMF9waDIiLAotCSJnbWlfYWQxMV9waDMiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9kcXNfcGkyIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQkic3BpMV9jczBfbl9weDYiLAotCSJzcGkxX21vc2lfcHg0IiwKLQkic3BpMV9zY2tfcHg1IiwKLQkic3BpMl9jczBfbl9weDMiLAotCSJzcGkyX21pc29fcHgxIiwKLQkic3BpMl9tb3NpX3B4MCIsCi0JInNwaTJfc2NrX3B4MiIsCi0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M190eGRfcHc2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ21pX2FsdF9ncm91cHNbXSA9IHsKLQkiZ21pX2ExNl9wajciLAotCSJnbWlfY3MzX25fcGs0IiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV93cF9uX3BjNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkYV9ncm91cHNbXSA9IHsKLQkiY2xrMV9yZXFfcGVlMiIsCi0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfc2Nsa19wbjMiLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkic3BkaWZfaW5fcGs2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRjcF9ncm91cHNbXSA9IHsKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotCSJsY2RfcHdyMF9wYjIiLAotCSJsY2RfcHdyMl9wYzYiLAotCSJsY2Rfc2NrX3B6NCIsCi0JImxjZF9zZG91dF9wbjUiLAotCSJsY2Rfd3Jfbl9wejMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZG1pX2dyb3Vwc1tdID0gewotCSJoZG1pX2ludF9wbjciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoc2lfZ3JvdXBzW10gPSB7Ci0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLQkidWxwaV9kYXRhNF9wbzUiLAotCSJ1bHBpX2RhdGE1X3BvNiIsCi0JInVscGlfZGF0YTZfcG83IiwKLQkidWxwaV9kYXRhN19wbzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMxX2dyb3Vwc1tdID0gewotCSJnZW4xX2kyY19zY2xfcGM0IiwKLQkiZ2VuMV9pMmNfc2RhX3BjNSIsCi0JInNwZGlmX2luX3BrNiIsCi0JInNwZGlmX291dF9wazUiLAotCSJzcGkyX2NzMV9uX3B3MiIsCi0JInNwaTJfY3MyX25fcHczIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjMl9ncm91cHNbXSA9IHsKLQkiZ2VuMl9pMmNfc2NsX3B0NSIsCi0JImdlbjJfaTJjX3NkYV9wdDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmMzX2dyb3Vwc1tdID0gewotCSJjYW1faTJjX3NjbF9wYmIxIiwKLQkiY2FtX2kyY19zZGFfcGJiMiIsCi0JInNkbW1jNF9jbWRfcHQ3IiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyYzRfZ3JvdXBzW10gPSB7Ci0JImRkY19zY2xfcHY0IiwKLQkiZGRjX3NkYV9wdjUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNwd3JfZ3JvdXBzW10gPSB7Ci0JInB3cl9pMmNfc2NsX3B6NiIsCi0JInB3cl9pMmNfc2RhX3B6NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczBfZ3JvdXBzW10gPSB7Ci0JImRhcDFfZGluX3BuMSIsCi0JImRhcDFfZG91dF9wbjIiLAotCSJkYXAxX2ZzX3BuMCIsCi0JImRhcDFfc2Nsa19wbjMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMxX2dyb3Vwc1tdID0gewotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMl9ncm91cHNbXSA9IHsKLQkiZGFwM19kaW5fcHAxIiwKLQkiZGFwM19kb3V0X3BwMiIsCi0JImRhcDNfZnNfcHAwIiwKLQkiZGFwM19zY2xrX3BwMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczNfZ3JvdXBzW10gPSB7Ci0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfc2Nsa19wcDciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnM0X2dyb3Vwc1tdID0gewotCSJwYmIwIiwKLQkicGJiNyIsCi0JInBjYzEiLAotCSJwY2MyIiwKLQkic2RtbWM0X2RhdDRfcGFhNCIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotCSJzZG1tYzRfZGF0Nl9wYWE2IiwKLQkic2RtbWM0X2RhdDdfcGFhNyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfZ3JvdXBzW10gPSB7Ci0JImtiX3JvdzNfcHIzIiwKLQkic2RtbWM0X2Nsa19wY2M0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2JjX2dyb3Vwc1tdID0gewotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaW9fZ3JvdXBzW10gPSB7Ci0JImtiX2NvbDZfcHE2IiwKLQkia2JfY29sN19wcTciLAotCSJrYl9yb3cxMF9wczIiLAotCSJrYl9yb3cxMV9wczMiLAotCSJrYl9yb3cxMl9wczQiLAotCSJrYl9yb3cxM19wczUiLAotCSJrYl9yb3cxNF9wczYiLAotCSJrYl9yb3cxNV9wczciLAotCSJrYl9yb3c2X3ByNiIsCi0JImtiX3JvdzdfcHI3IiwKLQkia2Jfcm93OF9wczAiLAotCSJrYl9yb3c5X3BzMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfZ3JvdXBzW10gPSB7Ci0JImdtaV9hZDBfcGcwIiwKLQkiZ21pX2FkMV9wZzEiLAotCSJnbWlfYWQxMF9waDIiLAotCSJnbWlfYWQxMV9waDMiLAotCSJnbWlfYWQxMl9waDQiLAotCSJnbWlfYWQxM19waDUiLAotCSJnbWlfYWQxNF9waDYiLAotCSJnbWlfYWQxNV9waDciLAotCSJnbWlfYWQyX3BnMiIsCi0JImdtaV9hZDNfcGczIiwKLQkiZ21pX2FkNF9wZzQiLAotCSJnbWlfYWQ1X3BnNSIsCi0JImdtaV9hZDZfcGc2IiwKLQkiZ21pX2FkN19wZzciLAotCSJnbWlfYWQ4X3BoMCIsCi0JImdtaV9hZDlfcGgxIiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9kcXNfcGkyIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzEwX3BzMiIsCi0JImtiX3JvdzExX3BzMyIsCi0JImtiX3JvdzEyX3BzNCIsCi0JImtiX3JvdzEzX3BzNSIsCi0JImtiX3JvdzE0X3BzNiIsCi0JImtiX3JvdzE1X3BzNyIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJrYl9yb3c0X3ByNCIsCi0JImtiX3JvdzVfcHI1IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbmRfYWx0X2dyb3Vwc1tdID0gewotCSJnbWlfY3M2X25fcGkzIiwKLQkiZ21pX2NzN19uX3BpNiIsCi0JImdtaV9yc3Rfbl9waTQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvd3JfZ3JvdXBzW10gPSB7Ci0JInB1MCIsCi0JInB2MiIsCi0JImtiX3JvdzVfcHI1IiwKLQkib3dyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpZV9ncm91cHNbXSA9IHsKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtMF9ncm91cHNbXSA9IHsKLQkiZ21pX2FkOF9waDAiLAotCSJwdTMiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJzZG1tYzNfZGF0NV9wZDAiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20xX2dyb3Vwc1tdID0gewotCSJnbWlfYWQ5X3BoMSIsCi0JInB1NCIsCi0JInNkbW1jM19kYXQyX3BiNSIsCi0JInNkbW1jM19kYXQ0X3BkMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bTJfZ3JvdXBzW10gPSB7Ci0JImdtaV9hZDEwX3BoMiIsCi0JInB1NSIsCi0JInNkbW1jM19jbGtfcGE2IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtM19ncm91cHNbXSA9IHsKLQkiZ21pX2FkMTFfcGgzIiwKLQkicHU2IiwKLQkic2RtbWMzX2NtZF9wYTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3JfaW50X25fZ3JvdXBzW10gPSB7Ci0JInB3cl9pbnRfbiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQxX2dyb3Vwc1tdID0gewotCSJnbWlfYWQwX3BnMCIsCi0JImdtaV9hZDFfcGcxIiwKLQkiZ21pX2FkMTJfcGg0IiwKLQkiZ21pX2FkMTNfcGg1IiwKLQkiZ21pX2FkMTRfcGg2IiwKLQkiZ21pX2FkMTVfcGg3IiwKLQkiZ21pX2FkMl9wZzIiLAotCSJnbWlfYWQzX3BnMyIsCi0JImdtaV9hZDRfcGc0IiwKLQkiZ21pX2FkNV9wZzUiLAotCSJnbWlfYWQ2X3BnNiIsCi0JImdtaV9hZDdfcGc3IiwKLQkiZ21pX2Fkdl9uX3BrMCIsCi0JImdtaV9jbGtfcGsxIiwKLQkiZ21pX2NzMF9uX3BqMCIsCi0JImdtaV9jczFfbl9wajIiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzM19uX3BrNCIsCi0JImdtaV9jczRfbl9wazIiLAotCSJnbWlfZHFzX3BpMiIsCi0JImdtaV9pb3JkeV9waTUiLAotCSJnbWlfb2Vfbl9waTEiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Bfbl9wYzciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdjAiLAotCSJwdjEiLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJ2aV9wY2xrX3B0MCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJzdmQyX2dyb3Vwc1tdID0gewotCSJjbGsxX291dF9wdzQiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiY2xrM19vdXRfcGVlMCIsCi0JImNsazNfcmVxX3BlZTEiLAotCSJjbGtfMzJrX2luIiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJjcnRfaHN5bmNfcHY2IiwKLQkiY3J0X3ZzeW5jX3B2NyIsCi0JImRhcDNfZGluX3BwMSIsCi0JImRhcDNfZG91dF9wcDIiLAotCSJkYXAzX2ZzX3BwMCIsCi0JImRhcDNfc2Nsa19wcDMiLAotCSJkYXA0X2Rpbl9wcDUiLAotCSJkYXA0X2RvdXRfcHA2IiwKLQkiZGFwNF9mc19wcDQiLAotCSJkYXA0X3NjbGtfcHA3IiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkicGJiMCIsCi0JInBiYjciLAotCSJwY2MxIiwKLQkicGNjMiIsCi0JInB2MCIsCi0JInB2MSIsCi0JInB2MiIsCi0JInB2MyIsCi0JImhkbWlfY2VjX3BlZTMiLAotCSJoZG1pX2ludF9wbjciLAotCSJqdGFnX3J0Y2tfcHU3IiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkicHdyX2ludF9uIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jMV9kYXQwX3B5NyIsCi0JInNkbW1jMV9kYXQxX3B5NiIsCi0JInNkbW1jMV9kYXQyX3B5NSIsCi0JInNkbW1jMV9kYXQzX3B5NCIsCi0JInNkbW1jM19kYXQwX3BiNyIsCi0JInNkbW1jM19kYXQxX3BiNiIsCi0JInNkbW1jNF9yc3Rfbl9wY2MzIiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInN5c19jbGtfcmVxX3B6NSIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kaXJfcHkxIiwKLQkidWxwaV9ueHRfcHkyIiwKLQkidWxwaV9zdHBfcHkzIiwKLQkidmlfZDBfcHQ0IiwKLQkidmlfZDEwX3B0MiIsCi0JInZpX2QxMV9wdDMiLAotCSJ2aV9oc3luY19wZDciLAotCSJ2aV92c3luY19wZDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByc3ZkM19ncm91cHNbXSA9IHsKLQkiY2FtX2kyY19zY2xfcGJiMSIsCi0JImNhbV9pMmNfc2RhX3BiYjIiLAotCSJjbGsxX291dF9wdzQiLAotCSJjbGsxX3JlcV9wZWUyIiwKLQkiY2xrMl9vdXRfcHc1IiwKLQkiY2xrMl9yZXFfcGNjNSIsCi0JImNsazNfb3V0X3BlZTAiLAotCSJjbGszX3JlcV9wZWUxIiwKLQkiY2xrXzMya19pbiIsCi0JImNsa18zMmtfb3V0X3BhMCIsCi0JImNvcmVfcHdyX3JlcSIsCi0JImNwdV9wd3JfcmVxIiwKLQkiY3J0X2hzeW5jX3B2NiIsCi0JImNydF92c3luY19wdjciLAotCSJkYXAyX2Rpbl9wYTQiLAotCSJkYXAyX2RvdXRfcGE1IiwKLQkiZGFwMl9mc19wYTIiLAotCSJkYXAyX3NjbGtfcGEzIiwKLQkiZGRjX3NjbF9wdjQiLAotCSJkZGNfc2RhX3B2NSIsCi0JImdlbjFfaTJjX3NjbF9wYzQiLAotCSJnZW4xX2kyY19zZGFfcGM1IiwKLQkicGJiMCIsCi0JInBiYjciLAotCSJwY2MxIiwKLQkicGNjMiIsCi0JInB2MCIsCi0JInB2MSIsCi0JInB2MiIsCi0JInB2MyIsCi0JImhkbWlfY2VjX3BlZTMiLAotCSJoZG1pX2ludF9wbjciLAotCSJqdGFnX3J0Y2tfcHU3IiwKLQkia2Jfcm93MF9wcjAiLAotCSJrYl9yb3cxX3ByMSIsCi0JImtiX3JvdzJfcHIyIiwKLQkia2Jfcm93M19wcjMiLAotCSJsY2RfZDBfcGUwIiwKLQkibGNkX2QxX3BlMSIsCi0JImxjZF9kMTBfcGYyIiwKLQkibGNkX2QxMV9wZjMiLAotCSJsY2RfZDEyX3BmNCIsCi0JImxjZF9kMTNfcGY1IiwKLQkibGNkX2QxNF9wZjYiLAotCSJsY2RfZDE1X3BmNyIsCi0JImxjZF9kMTZfcG0wIiwKLQkibGNkX2QxN19wbTEiLAotCSJsY2RfZDE4X3BtMiIsCi0JImxjZF9kMTlfcG0zIiwKLQkibGNkX2QyX3BlMiIsCi0JImxjZF9kMjBfcG00IiwKLQkibGNkX2QyMV9wbTUiLAotCSJsY2RfZDIyX3BtNiIsCi0JImxjZF9kMjNfcG03IiwKLQkibGNkX2QzX3BlMyIsCi0JImxjZF9kNF9wZTQiLAotCSJsY2RfZDVfcGU1IiwKLQkibGNkX2Q2X3BlNiIsCi0JImxjZF9kN19wZTciLAotCSJsY2RfZDhfcGYwIiwKLQkibGNkX2Q5X3BmMSIsCi0JImxjZF9kYzBfcG42IiwKLQkibGNkX2RjMV9wZDIiLAotCSJsY2RfZGVfcGoxIiwKLQkibGNkX2hzeW5jX3BqMyIsCi0JImxjZF9tMV9wdzEiLAotCSJsY2RfcGNsa19wYjMiLAotCSJsY2RfcHdyMV9wYzEiLAotCSJsY2RfdnN5bmNfcGo0IiwKLQkib3dyIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkicHdyX2ludF9uIiwKLQkic2RtbWMxX2Nsa19wejAiLAotCSJzZG1tYzFfY21kX3B6MSIsCi0JInNkbW1jNF9yc3Rfbl9wY2MzIiwKLQkic3lzX2Nsa19yZXFfcHo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnN2ZDRfZ3JvdXBzW10gPSB7Ci0JImNsazFfb3V0X3B3NCIsCi0JImNsazFfcmVxX3BlZTIiLAotCSJjbGsyX291dF9wdzUiLAotCSJjbGsyX3JlcV9wY2M1IiwKLQkiY2xrM19vdXRfcGVlMCIsCi0JImNsazNfcmVxX3BlZTEiLAotCSJjbGtfMzJrX2luIiwKLQkiY2xrXzMya19vdXRfcGEwIiwKLQkiY29yZV9wd3JfcmVxIiwKLQkiY3B1X3B3cl9yZXEiLAotCSJjcnRfaHN5bmNfcHY2IiwKLQkiY3J0X3ZzeW5jX3B2NyIsCi0JImRhcDRfZGluX3BwNSIsCi0JImRhcDRfZG91dF9wcDYiLAotCSJkYXA0X2ZzX3BwNCIsCi0JImRhcDRfc2Nsa19wcDciLAotCSJkZGNfc2NsX3B2NCIsCi0JImRkY19zZGFfcHY1IiwKLQkiZ2VuMV9pMmNfc2NsX3BjNCIsCi0JImdlbjFfaTJjX3NkYV9wYzUiLAotCSJnZW4yX2kyY19zY2xfcHQ1IiwKLQkiZ2VuMl9pMmNfc2RhX3B0NiIsCi0JImdtaV9hMTlfcGs3IiwKLQkiZ21pX2FkMF9wZzAiLAotCSJnbWlfYWQxX3BnMSIsCi0JImdtaV9hZDEwX3BoMiIsCi0JImdtaV9hZDExX3BoMyIsCi0JImdtaV9hZDEyX3BoNCIsCi0JImdtaV9hZDEzX3BoNSIsCi0JImdtaV9hZDE0X3BoNiIsCi0JImdtaV9hZDE1X3BoNyIsCi0JImdtaV9hZDJfcGcyIiwKLQkiZ21pX2FkM19wZzMiLAotCSJnbWlfYWQ0X3BnNCIsCi0JImdtaV9hZDVfcGc1IiwKLQkiZ21pX2FkNl9wZzYiLAotCSJnbWlfYWQ3X3BnNyIsCi0JImdtaV9hZDhfcGgwIiwKLQkiZ21pX2FkOV9waDEiLAotCSJnbWlfYWR2X25fcGswIiwKLQkiZ21pX2Nsa19wazEiLAotCSJnbWlfY3MyX25fcGszIiwKLQkiZ21pX2NzNF9uX3BrMiIsCi0JImdtaV9kcXNfcGkyIiwKLQkiZ21pX2lvcmR5X3BpNSIsCi0JImdtaV9vZV9uX3BpMSIsCi0JImdtaV9yc3Rfbl9waTQiLAotCSJnbWlfd2FpdF9waTciLAotCSJnbWlfd3Jfbl9waTAiLAotCSJwY2MyIiwKLQkicHUwIiwKLQkicHUxIiwKLQkicHUyIiwKLQkicHUzIiwKLQkicHU0IiwKLQkicHU1IiwKLQkicHU2IiwKLQkicHYwIiwKLQkicHYxIiwKLQkicHYyIiwKLQkicHYzIiwKLQkiaGRtaV9jZWNfcGVlMyIsCi0JImhkbWlfaW50X3BuNyIsCi0JImp0YWdfcnRja19wdTciLAotCSJrYl9jb2wyX3BxMiIsCi0JImtiX2NvbDNfcHEzIiwKLQkia2JfY29sNF9wcTQiLAotCSJrYl9jb2w1X3BxNSIsCi0JImtiX3JvdzBfcHIwIiwKLQkia2Jfcm93MV9wcjEiLAotCSJrYl9yb3cyX3ByMiIsCi0JImtiX3JvdzRfcHI0IiwKLQkibGNkX2NzMF9uX3BuNCIsCi0JImxjZF9jczFfbl9wdzAiLAotCSJsY2RfZDBfcGUwIiwKLQkibGNkX2QxX3BlMSIsCi0JImxjZF9kMTBfcGYyIiwKLQkibGNkX2QxMV9wZjMiLAotCSJsY2RfZDEyX3BmNCIsCi0JImxjZF9kMTNfcGY1IiwKLQkibGNkX2QxNF9wZjYiLAotCSJsY2RfZDE1X3BmNyIsCi0JImxjZF9kMTZfcG0wIiwKLQkibGNkX2QxN19wbTEiLAotCSJsY2RfZDE4X3BtMiIsCi0JImxjZF9kMTlfcG0zIiwKLQkibGNkX2QyX3BlMiIsCi0JImxjZF9kMjBfcG00IiwKLQkibGNkX2QyMV9wbTUiLAotCSJsY2RfZDIyX3BtNiIsCi0JImxjZF9kMjNfcG03IiwKLQkibGNkX2QzX3BlMyIsCi0JImxjZF9kNF9wZTQiLAotCSJsY2RfZDVfcGU1IiwKLQkibGNkX2Q2X3BlNiIsCi0JImxjZF9kN19wZTciLAotCSJsY2RfZDhfcGYwIiwKLQkibGNkX2Q5X3BmMSIsCi0JImxjZF9kYzBfcG42IiwKLQkibGNkX2RjMV9wZDIiLAotCSJsY2RfZGVfcGoxIiwKLQkibGNkX2hzeW5jX3BqMyIsCi0JImxjZF9tMV9wdzEiLAotCSJsY2RfcGNsa19wYjMiLAotCSJsY2RfcHdyMV9wYzEiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2RfdnN5bmNfcGo0IiwKLQkib3dyIiwKLQkicGV4X2wwX2Nsa3JlcV9uX3BkZDIiLAotCSJwZXhfbDBfcHJzbnRfbl9wZGQwIiwKLQkicGV4X2wwX3JzdF9uX3BkZDEiLAotCSJwZXhfbDFfY2xrcmVxX25fcGRkNiIsCi0JInBleF9sMV9wcnNudF9uX3BkZDQiLAotCSJwZXhfbDFfcnN0X25fcGRkNSIsCi0JInBleF9sMl9jbGtyZXFfbl9wY2M3IiwKLQkicGV4X2wyX3Byc250X25fcGRkNyIsCi0JInBleF9sMl9yc3Rfbl9wY2M2IiwKLQkicGV4X3dha2Vfbl9wZGQzIiwKLQkicHdyX2kyY19zY2xfcHo2IiwKLQkicHdyX2kyY19zZGFfcHo3IiwKLQkicHdyX2ludF9uIiwKLQkic3BpMV9taXNvX3B4NyIsCi0JInN5c19jbGtfcmVxX3B6NSIsCi0JInVhcnQzX2N0c19uX3BhMSIsCi0JInVhcnQzX3J0c19uX3BjMCIsCi0JInVhcnQzX3J4ZF9wdzciLAotCSJ1YXJ0M190eGRfcHc2IiwKLQkidmlfZDBfcHQ0IiwKLQkidmlfZDFfcGQ1IiwKLQkidmlfZDEwX3B0MiIsCi0JInZpX2QxMV9wdDMiLAotCSJ2aV9kMl9wbDAiLAotCSJ2aV9kM19wbDEiLAotCSJ2aV9kNF9wbDIiLAotCSJ2aV9kNV9wbDMiLAotCSJ2aV9kNl9wbDQiLAotCSJ2aV9kN19wbDUiLAotCSJ2aV9kOF9wbDYiLAotCSJ2aV9kOV9wbDciLAotCSJ2aV9oc3luY19wZDciLAotCSJ2aV9wY2xrX3B0MCIsCi0JInZpX3ZzeW5jX3BkNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ0Y2tfZ3JvdXBzW10gPSB7Ci0JImp0YWdfcnRja19wdTciLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYXRhX2dyb3Vwc1tdID0gewotCSJnbWlfY3M2X25fcGkzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMxX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfY2xrX3B6MCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RtbWMyX2dyb3Vwc1tdID0gewotCSJkYXAxX2Rpbl9wbjEiLAotCSJkYXAxX2RvdXRfcG4yIiwKLQkiZGFwMV9mc19wbjAiLAotCSJkYXAxX3NjbGtfcG4zIiwKLQkia2Jfcm93MTBfcHMyIiwKLQkia2Jfcm93MTFfcHMzIiwKLQkia2Jfcm93MTJfcHM0IiwKLQkia2Jfcm93MTNfcHM1IiwKLQkia2Jfcm93MTRfcHM2IiwKLQkia2Jfcm93MTVfcHM3IiwKLQkia2Jfcm93Nl9wcjYiLAotCSJrYl9yb3c3X3ByNyIsCi0JImtiX3JvdzhfcHMwIiwKLQkia2Jfcm93OV9wczEiLAotCSJzcGRpZl9pbl9wazYiLAotCSJzcGRpZl9vdXRfcGs1IiwKLQkidmlfZDFfcGQ1IiwKLQkidmlfZDJfcGwwIiwKLQkidmlfZDNfcGwxIiwKLQkidmlfZDRfcGwyIiwKLQkidmlfZDVfcGwzIiwKLQkidmlfZDZfcGw0IiwKLQkidmlfZDdfcGw1IiwKLQkidmlfZDhfcGw2IiwKLQkidmlfZDlfcGw3IiwKLQkidmlfcGNsa19wdDAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzNfZ3JvdXBzW10gPSB7Ci0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2NtZF9wYTciLAotCSJzZG1tYzNfZGF0MF9wYjciLAotCSJzZG1tYzNfZGF0MV9wYjYiLAotCSJzZG1tYzNfZGF0Ml9wYjUiLAotCSJzZG1tYzNfZGF0M19wYjQiLAotCSJzZG1tYzNfZGF0NF9wZDEiLAotCSJzZG1tYzNfZGF0NV9wZDAiLAotCSJzZG1tYzNfZGF0Nl9wZDMiLAotCSJzZG1tYzNfZGF0N19wZDQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZG1tYzRfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2NsX3BiYjEiLAotCSJjYW1faTJjX3NkYV9wYmIyIiwKLQkiY2FtX21jbGtfcGNjMCIsCi0JInBiYjAiLAotCSJwYmIzIiwKLQkicGJiNCIsCi0JInBiYjUiLAotCSJwYmI2IiwKLQkicGJiNyIsCi0JInBjYzEiLAotCSJzZG1tYzRfY2xrX3BjYzQiLAotCSJzZG1tYzRfY21kX3B0NyIsCi0JInNkbW1jNF9kYXQwX3BhYTAiLAotCSJzZG1tYzRfZGF0MV9wYWExIiwKLQkic2RtbWM0X2RhdDJfcGFhMiIsCi0JInNkbW1jNF9kYXQzX3BhYTMiLAotCSJzZG1tYzRfZGF0NF9wYWE0IiwKLQkic2RtbWM0X2RhdDVfcGFhNSIsCi0JInNkbW1jNF9kYXQ2X3BhYTYiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLQkic2RtbWM0X3JzdF9uX3BjYzMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGRpZl9ncm91cHNbXSA9IHsKLQkic2RtbWMzX2RhdDZfcGQzIiwKLQkic2RtbWMzX2RhdDdfcGQ0IiwKLQkic3BkaWZfaW5fcGs2IiwKLQkic3BkaWZfb3V0X3BrNSIsCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpMV9ncm91cHNbXSA9IHsKLQkic3BpMV9jczBfbl9weDYiLAotCSJzcGkxX21pc29fcHg3IiwKLQkic3BpMV9tb3NpX3B4NCIsCi0JInNwaTFfc2NrX3B4NSIsCi0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTJfZ3JvdXBzW10gPSB7Ci0JInNkbW1jM19jbWRfcGE3IiwKLQkic2RtbWMzX2RhdDRfcGQxIiwKLQkic2RtbWMzX2RhdDVfcGQwIiwKLQkic2RtbWMzX2RhdDZfcGQzIiwKLQkic2RtbWMzX2RhdDdfcGQ0IiwKLQkic3BpMV9jczBfbl9weDYiLAotCSJzcGkxX21vc2lfcHg0IiwKLQkic3BpMV9zY2tfcHg1IiwKLQkic3BpMl9jczBfbl9weDMiLAotCSJzcGkyX2NzMV9uX3B3MiIsCi0JInNwaTJfY3MyX25fcHczIiwKLQkic3BpMl9taXNvX3B4MSIsCi0JInNwaTJfbW9zaV9weDAiLAotCSJzcGkyX3Nja19weDIiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTJfYWx0X2dyb3Vwc1tdID0gewotCSJzcGkxX2NzMF9uX3B4NiIsCi0JInNwaTFfbWlzb19weDciLAotCSJzcGkxX21vc2lfcHg0IiwKLQkic3BpMV9zY2tfcHg1IiwKLQkic3BpMl9jczFfbl9wdzIiLAotCSJzcGkyX2NzMl9uX3B3MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTNfZ3JvdXBzW10gPSB7Ci0JInNkbW1jM19jbGtfcGE2IiwKLQkic2RtbWMzX2RhdDBfcGI3IiwKLQkic2RtbWMzX2RhdDFfcGI2IiwKLQkic2RtbWMzX2RhdDJfcGI1IiwKLQkic2RtbWMzX2RhdDNfcGI0IiwKLQkic2RtbWM0X2RhdDBfcGFhMCIsCi0JInNkbW1jNF9kYXQxX3BhYTEiLAotCSJzZG1tYzRfZGF0Ml9wYWEyIiwKLQkic2RtbWM0X2RhdDNfcGFhMyIsCi0JInNwaTFfbWlzb19weDciLAotCSJzcGkyX2NzMF9uX3B4MyIsCi0JInNwaTJfY3MxX25fcHcyIiwKLQkic3BpMl9jczJfbl9wdzMiLAotCSJzcGkyX21pc29fcHgxIiwKLQkic3BpMl9tb3NpX3B4MCIsCi0JInNwaTJfc2NrX3B4MiIsCi0JInVscGlfZGF0YTBfcG8xIiwKLQkidWxwaV9kYXRhMV9wbzIiLAotCSJ1bHBpX2RhdGEyX3BvMyIsCi0JInVscGlfZGF0YTNfcG80IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNF9ncm91cHNbXSA9IHsKLQkiZ21pX2ExNl9wajciLAotCSJnbWlfYTE3X3BiMCIsCi0JImdtaV9hMThfcGIxIiwKLQkiZ21pX2ExOV9wazciLAotCSJzZG1tYzNfZGF0NF9wZDEiLAotCSJzZG1tYzNfZGF0NV9wZDAiLAotCSJzZG1tYzNfZGF0Nl9wZDMiLAotCSJzZG1tYzNfZGF0N19wZDQiLAotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaTVfZ3JvdXBzW10gPSB7Ci0JImxjZF9jczBfbl9wbjQiLAotCSJsY2RfY3MxX25fcHcwIiwKLQkibGNkX3B3cjBfcGIyIiwKLQkibGNkX3B3cjJfcGM2IiwKLQkibGNkX3Nja19wejQiLAotCSJsY2Rfc2Rpbl9wejIiLAotCSJsY2Rfc2RvdXRfcG41IiwKLQkibGNkX3dyX25fcHozIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNl9ncm91cHNbXSA9IHsKLQkic3BpMl9jczBfbl9weDMiLAotCSJzcGkyX21pc29fcHgxIiwKLQkic3BpMl9tb3NpX3B4MCIsCi0JInNwaTJfc2NrX3B4MiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5c2Nsa19ncm91cHNbXSA9IHsKLQkic3lzX2Nsa19yZXFfcHo1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVzdF9ncm91cHNbXSA9IHsKLQkia2JfY29sMF9wcTAiLAotCSJrYl9jb2wxX3BxMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYWNlX2dyb3Vwc1tdID0gewotCSJrYl9jb2wwX3BxMCIsCi0JImtiX2NvbDFfcHExIiwKLQkia2JfY29sMl9wcTIiLAotCSJrYl9jb2wzX3BxMyIsCi0JImtiX2NvbDRfcHE0IiwKLQkia2JfY29sNV9wcTUiLAotCSJrYl9jb2w2X3BxNiIsCi0JImtiX2NvbDdfcHE3IiwKLQkia2Jfcm93NF9wcjQiLAotCSJrYl9yb3c1X3ByNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRhX2dyb3Vwc1tdID0gewotCSJwdTAiLAotCSJwdTEiLAotCSJwdTIiLAotCSJwdTMiLAotCSJwdTQiLAotCSJwdTUiLAotCSJwdTYiLAotCSJzZG1tYzFfY2xrX3B6MCIsCi0JInNkbW1jMV9jbWRfcHoxIiwKLQkic2RtbWMxX2RhdDBfcHk3IiwKLQkic2RtbWMxX2RhdDFfcHk2IiwKLQkic2RtbWMxX2RhdDJfcHk1IiwKLQkic2RtbWMxX2RhdDNfcHk0IiwKLQkic2RtbWMzX2Nsa19wYTYiLAotCSJzZG1tYzNfY21kX3BhNyIsCi0JInVhcnQyX2N0c19uX3BqNSIsCi0JInVhcnQyX3J0c19uX3BqNiIsCi0JInVhcnQyX3J4ZF9wYzMiLAotCSJ1YXJ0Ml90eGRfcGMyIiwKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRiX2dyb3Vwc1tdID0gewotCSJ1YXJ0Ml9jdHNfbl9wajUiLAotCSJ1YXJ0Ml9ydHNfbl9wajYiLAotCSJ1YXJ0Ml9yeGRfcGMzIiwKLQkidWFydDJfdHhkX3BjMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRjX2dyb3Vwc1tdID0gewotCSJ1YXJ0M19jdHNfbl9wYTEiLAotCSJ1YXJ0M19ydHNfbl9wYzAiLAotCSJ1YXJ0M19yeGRfcHc3IiwKLQkidWFydDNfdHhkX3B3NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRkX2dyb3Vwc1tdID0gewotCSJnbWlfYTE2X3BqNyIsCi0JImdtaV9hMTdfcGIwIiwKLQkiZ21pX2ExOF9wYjEiLAotCSJnbWlfYTE5X3BrNyIsCi0JInVscGlfY2xrX3B5MCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRlX2dyb3Vwc1tdID0gewotCSJzZG1tYzFfZGF0MF9weTciLAotCSJzZG1tYzFfZGF0MV9weTYiLAotCSJzZG1tYzFfZGF0Ml9weTUiLAotCSJzZG1tYzFfZGF0M19weTQiLAotCSJzZG1tYzRfZGF0MF9wYWEwIiwKLQkic2RtbWM0X2RhdDFfcGFhMSIsCi0JInNkbW1jNF9kYXQyX3BhYTIiLAotCSJzZG1tYzRfZGF0M19wYWEzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWxwaV9ncm91cHNbXSA9IHsKLQkidWxwaV9jbGtfcHkwIiwKLQkidWxwaV9kYXRhMF9wbzEiLAotCSJ1bHBpX2RhdGExX3BvMiIsCi0JInVscGlfZGF0YTJfcG8zIiwKLQkidWxwaV9kYXRhM19wbzQiLAotCSJ1bHBpX2RhdGE0X3BvNSIsCi0JInVscGlfZGF0YTVfcG82IiwKLQkidWxwaV9kYXRhNl9wbzciLAotCSJ1bHBpX2RhdGE3X3BvMCIsCi0JInVscGlfZGlyX3B5MSIsCi0JInVscGlfbnh0X3B5MiIsCi0JInVscGlfc3RwX3B5MyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDFfZ3JvdXBzW10gPSB7Ci0JImNhbV9pMmNfc2NsX3BiYjEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3AyX2dyb3Vwc1tdID0gewotCSJjYW1faTJjX3NkYV9wYmIyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwM19ncm91cHNbXSA9IHsKLQkicGJiMyIsCi0JInNkbW1jNF9kYXQ1X3BhYTUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2Z3A0X2dyb3Vwc1tdID0gewotCSJwYmI0IiwKLQkic2RtbWM0X2RhdDZfcGFhNiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZncDVfZ3JvdXBzW10gPSB7Ci0JInBiYjUiLAotCSJzZG1tYzRfZGF0N19wYWE3IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmdwNl9ncm91cHNbXSA9IHsKLQkicGJiNiIsCi0JInNkbW1jNF9yc3Rfbl9wY2MzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJ2aV9kMF9wdDQiLAotCSJ2aV9kMV9wZDUiLAotCSJ2aV9kMTBfcHQyIiwKLQkidmlfZDExX3B0MyIsCi0JInZpX2QyX3BsMCIsCi0JInZpX2QzX3BsMSIsCi0JInZpX2Q0X3BsMiIsCi0JInZpX2Q1X3BsMyIsCi0JInZpX2Q2X3BsNCIsCi0JInZpX2Q3X3BsNSIsCi0JInZpX2Q4X3BsNiIsCi0JInZpX2Q5X3BsNyIsCi0JInZpX2hzeW5jX3BkNyIsCi0JInZpX21jbGtfcHQxIiwKLQkidmlfcGNsa19wdDAiLAotCSJ2aV92c3luY19wZDYiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQxX2dyb3Vwc1tdID0gewotCSJjYW1fbWNsa19wY2MwIiwKLQkidmlfbWNsa19wdDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aV9hbHQyX2dyb3Vwc1tdID0gewotCSJ2aV9tY2xrX3B0MSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpX2FsdDNfZ3JvdXBzW10gPSB7Ci0JImNhbV9tY2xrX3BjYzAiLAotCSJ2aV9tY2xrX3B0MSIsCi19OwogCiAjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCi0JCS5ncm91cHMgPSBmbmFtZSMjX2dyb3VwcywJCVwKLQkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGZuYW1lIyNfZ3JvdXBzKSwJXAogCX0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB0ZWdyYTMwX2Z1bmN0aW9uc1tdID0geworc3RhdGljIHN0cnVjdCB0ZWdyYV9mdW5jdGlvbiB0ZWdyYTMwX2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGJsaW5rKSwKIAlGVU5DVElPTihjZWMpLAogCUZVTkNUSU9OKGNsa18xMm1fb3V0KSwKQEAgLTMzNDUsMTEgKzIxMDUsMTEgQEAKIAlGVU5DVElPTih2aV9hbHQzKSwKIH07CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCTB4ODY4CS8qIGJhbmsgMCAqLwotI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJMHgzMDAwCS8qIGJhbmsgMSAqLworI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX0EJCTB4ODY4CS8qIGJhbmsgMCAqLworI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJCTB4MzAwMAkvKiBiYW5rIDEgKi8KIAotI2RlZmluZSBQSU5HUk9VUF9SRUdfWShyKSAoKHIpIC0gUElOR1JPVVBfUkVHX0EpCi0jZGVmaW5lIFBJTkdST1VQX1JFR19OKHIpIC0xCisjZGVmaW5lIFBJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gUElOR1JPVVBfUkVHX0EpCisjZGVmaW5lIFBJTkdST1VQX1JFR19OKHIpCQktMQogCiAjZGVmaW5lIFBJTkdST1VQKHBnX25hbWUsIGYwLCBmMSwgZjIsIGYzLCBmX3NhZmUsIHIsIG9kLCBpb3IpCVwKIAl7CQkJCQkJCVwKQEAgLTMzNTcsMTIgKzIxMTcsMTIgQEAKIAkJLnBpbnMgPSBwZ19uYW1lIyNfcGlucywJCQkJXAogCQkubnBpbnMgPSBBUlJBWV9TSVpFKHBnX25hbWUjI19waW5zKSwJCVwKIAkJLmZ1bmNzID0gewkJCQkJXAotCQkJVEVHUkFfTVVYXyAjIyBmMCwJCQlcCi0JCQlURUdSQV9NVVhfICMjIGYxLAkJCVwKLQkJCVRFR1JBX01VWF8gIyMgZjIsCQkJXAotCQkJVEVHUkFfTVVYXyAjIyBmMywJCQlcCisJCQlURUdSQV9NVVhfIyNmMCwJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjEsCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YyLAkJCQlcCisJCQlURUdSQV9NVVhfIyNmMywJCQkJXAogCQl9LAkJCQkJCVwKLQkJLmZ1bmNfc2FmZSA9IFRFR1JBX01VWF8gIyMgZl9zYWZlLAkJXAorCQkuZnVuY19zYWZlID0gVEVHUkFfTVVYXyMjZl9zYWZlLAkJXAogCQkubXV4X3JlZyA9IFBJTkdST1VQX1JFR19ZKHIpLAkJCVwKIAkJLm11eF9iYW5rID0gMSwJCQkJCVwKIAkJLm11eF9iaXQgPSAwLAkJCQkJXApAQCAtMzM4OSw2ICsyMTQ5LDkgQEAKIAkJLmRydnR5cGVfcmVnID0gLTEsCQkJCVwKIAl9CiAKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19ZKHIpCQkoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKQorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX04ocikJCS0xCisKICNkZWZpbmUgRFJWX1BJTkdST1VQKHBnX25hbWUsIHIsIGhzbV9iLCBzY2htaXR0X2IsIGxwbWRfYiwJXAogCQkgICAgIGRydmRuX2IsIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csCVwKIAkJICAgICBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3cpCQlcCkBAIC0zNDA0LDcgKzIxNjcsNyBAQAogCQkubG9ja19yZWcgPSAtMSwJCQkJCVwKIAkJLmlvcmVzZXRfcmVnID0gLTEsCQkJCVwKIAkJLnJjdl9zZWxfcmVnID0gLTEsCQkJCVwKLQkJLmRydl9yZWcgPSAoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKSwJCVwKKwkJLmRydl9yZWcgPSBEUlZfUElOR1JPVVBfUkVHX1kociksCQlcCiAJCS5kcnZfYmFuayA9IDAsCQkJCQlcCiAJCS5oc21fYml0ID0gaHNtX2IsCQkJCVwKIAkJLnNjaG1pdHRfYml0ID0gc2NobWl0dF9iLAkJCVwKQEAgLTM0MjIsNyArMjE4NSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfcGluZ3JvdXAgdGVncmEzMF9ncm91cHNbXSA9IHsKIAkvKiAgICAgICBwZ19uYW1lLCAgICAgICAgICAgICAgZjAsICAgICAgICAgICBmMSwgICAgICAgICAgIGYyLCAgICAgICAgICAgZjMsICAgICAgICAgICBzYWZlLCAgICAgICAgIHIsICAgICAgb2QsIGlvciAqLwotCS8qIEZJWE1FOiBGaWxsIGluIGNvcnJlY3QgZGF0YSBpbiBzYWZlIGNvbHVtbiAqLwogCVBJTkdST1VQKGNsa18zMmtfb3V0X3BhMCwgICAgICBCTElOSywgICAgICAgIFJTVkQyLCAgICAgICAgUlNWRDMsICAgICAgICBSU1ZENCwgICAgICAgIFJTVkQ0LCAgICAgICAgMHgzMzFjLCBOLCBOKSwKIAlQSU5HUk9VUCh1YXJ0M19jdHNfbl9wYTEsICAgICAgVUFSVEMsICAgICAgICBSU1ZEMiwgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDQsICAgICAgICBSU1ZENCwgICAgICAgIDB4MzE3YywgTiwgTiksCiAJUElOR1JPVVAoZGFwMl9mc19wYTIsICAgICAgICAgIEkyUzEsICAgICAgICAgSERBLCAgICAgICAgICBSU1ZEMywgICAgICAgIEdNSSwgICAgICAgICAgUlNWRDMsICAgICAgICAweDMzNTgsIE4sIE4pLApAQCAtMzczNSw2ICsyNDk3LDcgQEAKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTMwLXBpbm11eCIsIH0sCiAJeyB9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhMzBfcGluY3RybF9vZl9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhMzBfcGluY3RybF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKQEAgLTM3NDUsMjAgKzI1MDgsOCBAQAogCS5wcm9iZSA9IHRlZ3JhMzBfcGluY3RybF9wcm9iZSwKIAkucmVtb3ZlID0gdGVncmFfcGluY3RybF9yZW1vdmUsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0ZWdyYTMwX3BpbmN0cmxfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhMzBfcGluY3RybF9kcml2ZXIpOwotfQotYXJjaF9pbml0Y2FsbCh0ZWdyYTMwX3BpbmN0cmxfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0ZWdyYTMwX3BpbmN0cmxfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYTMwX3BpbmN0cmxfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHRlZ3JhMzBfcGluY3RybF9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGVncmEzMF9waW5jdHJsX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gV2FycmVuIDxzd2FycmVuQG52aWRpYS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk5WSURJQSBUZWdyYTMwIHBpbmN0cmwgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0ZWdyYTMwX3BpbmN0cmxfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MC5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MC5jCmluZGV4IGMzODFhZTYuLjQ4MDkzNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkwLmMKQEAgLTIyNjAsNiArMjI2MCw0MiBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfbXV4W10gPSB7CiAJTVNJT0YwX1RYRF9NQVJLLAogfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfY2xrX2JfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEsIDIzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU0NLX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczFfYl9waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oMSwgMTIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMV9iX211eFtdID0geworCU1TSU9GMF9TUzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMl9iX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTigxLCAxMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MyX2JfbXV4W10gPSB7CisJTVNJT0YwX1NTMl9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfYl9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMSwgMjkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X2JfbXV4W10gPSB7CisJTVNJT0YwX1JYRF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfYl9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMSwgMjgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X2JfbXV4W10gPSB7CisJTVNJT0YwX1RYRF9CX01BUkssCit9OwogLyogLSBNU0lPRjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19waW5zW10gPSB7CiAJLyogU0NLICovCkBAIC0yMzAzLDYgKzIzMzksNDIgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X211eFtdID0gewogCU1TSU9GMV9UWERfTUFSSywKIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigxLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YxX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2JfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDAsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczFfYl9tdXhbXSA9IHsKKwlNU0lPRjFfU1MxX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczJfYl9waW5zW10gPSB7CisJLyogU1MyICovCisJUkNBUl9HUF9QSU4oMCwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMl9iX211eFtdID0geworCU1TSU9GMV9TUzJfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2JfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDEsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9iX211eFtdID0geworCU1TSU9GMV9SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDAsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9iX211eFtdID0geworCU1TSU9GMV9UWERfQl9NQVJLLAorfTsKIC8qIC0gTVNJT0YyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfcGluc1tdID0gewogCS8qIFNDSyAqLwpAQCAtMjM4OSw2ICsyNDYxLDU4IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM190eF9tdXhbXSA9IHsKIAlNU0lPRjNfVFhEX01BUkssCiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMCwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YzX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfc3luY19iX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMCwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjNfc3luY19iX211eFtdID0geworCU1TSU9GM19TWU5DX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19yeF9iX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigwLCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mM19yeF9iX211eFtdID0geworCU1TSU9GM19SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDAsIDMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YzX3R4X2JfbXV4W10gPSB7CisJTVNJT0YzX1RYRF9CX01BUkssCit9OworLyogLSBRU1BJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9jdHJsX3BpbnNbXSA9IHsKKwkvKiBTUENMSywgU1NMICovCisJUkNBUl9HUF9QSU4oMSwgNCksIFJDQVJfR1BfUElOKDEsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9jdHJsX211eFtdID0geworCVNQQ0xLX01BUkssIFNTTF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xICovCisJUkNBUl9HUF9QSU4oMSwgNSksIFJDQVJfR1BfUElOKDEsIDYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9tdXhbXSA9IHsKKwlNT1NJX0lPMF9NQVJLLCBNSVNPX0lPMV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xLCBJTzIsIElPMyAqLworCVJDQVJfR1BfUElOKDEsIDUpLCBSQ0FSX0dQX1BJTigxLCA2KSwgUkNBUl9HUF9QSU4oMSwgNyksCisJUkNBUl9HUF9QSU4oMSwgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGE0X211eFtdID0geworCU1PU0lfSU8wX01BUkssIE1JU09fSU8xX01BUkssIElPMl9NQVJLLCBJTzNfTUFSSywKK307CiAvKiAtIFNDSUYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9kYXRhX3BpbnNbXSA9IHsKIAkvKiBSWCwgVFggKi8KQEAgLTMyMzEsNiArMzM1NSwxMyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1c2IwX211eFtdID0gewogCVVTQjBfUFdFTl9NQVJLLCBVU0IwX09WQ19WQlVTX01BUkssCiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1c2IwX292Y192YnVzX3BpbnNbXSA9IHsKKwkvKiBPVkMvVkJVUyAqLworCVJDQVJfR1BfUElOKDUsIDE5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVzYjBfb3ZjX3ZidXNfbXV4W10gPSB7CisJVVNCMF9PVkNfVkJVU19NQVJLLAorfTsKIC8qIC0gVVNCMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVzYjFfcGluc1tdID0gewogCS8qIFBXRU4sIE9WQyAqLwpAQCAtMzY1MywxMiArMzc4NCwyMiBAQAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MxX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMl9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF90eF9iKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGspLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3N5bmMpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3NzMSksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MyKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeCksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfdHgpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2Nsa19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MyX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3R4X2IpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX2NsayksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3luYyksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3MxKSwKQEAgLTM2NzEsNiArMzgxMiwxMyBAQAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YzX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjNfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YzX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mM19jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjNfc3luY19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mM19yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mM190eF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGEyKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTQpLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YSksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9jbGspLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfY3RybCksCkBAIC0zNzg5LDYgKzM5MzcsNyBAQAogCVNIX1BGQ19QSU5fR1JPVVAodHB1MF90bzIpLAogCVNIX1BGQ19QSU5fR1JPVVAodHB1MF90bzMpLAogCVNIX1BGQ19QSU5fR1JPVVAodXNiMCksCisJU0hfUEZDX1BJTl9HUk9VUCh1c2IwX292Y192YnVzKSwKIAlTSF9QRkNfUElOX0dST1VQKHVzYjEpLAogCVNIX1BGQ19QSU5fR1JPVVAodXNiMiksCiAJVklOX0RBVEFfUElOX0dST1VQKHZpbjBfZGF0YSwgMjQpLApAQCAtMzk0MSw2ICs0MDkwLDExIEBACiAJIm1zaW9mMF9zczIiLAogCSJtc2lvZjBfcngiLAogCSJtc2lvZjBfdHgiLAorCSJtc2lvZjBfY2xrX2IiLAorCSJtc2lvZjBfc3MxX2IiLAorCSJtc2lvZjBfc3MyX2IiLAorCSJtc2lvZjBfcnhfYiIsCisJIm1zaW9mMF90eF9iIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNpb2YxX2dyb3Vwc1tdID0gewpAQCAtMzk1MCw2ICs0MTA0LDExIEBACiAJIm1zaW9mMV9zczIiLAogCSJtc2lvZjFfcngiLAogCSJtc2lvZjFfdHgiLAorCSJtc2lvZjFfY2xrX2IiLAorCSJtc2lvZjFfc3MxX2IiLAorCSJtc2lvZjFfc3MyX2IiLAorCSJtc2lvZjFfcnhfYiIsCisJIm1zaW9mMV90eF9iIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNpb2YyX2dyb3Vwc1tdID0gewpAQCAtMzk2OCw2ICs0MTI3LDE2IEBACiAJIm1zaW9mM19zczIiLAogCSJtc2lvZjNfcngiLAogCSJtc2lvZjNfdHgiLAorCSJtc2lvZjNfY2xrX2IiLAorCSJtc2lvZjNfc3luY19iIiwKKwkibXNpb2YzX3J4X2IiLAorCSJtc2lvZjNfdHhfYiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGlfZ3JvdXBzW10gPSB7CisJInFzcGlfY3RybCIsCisJInFzcGlfZGF0YTIiLAorCSJxc3BpX2RhdGE0IiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjBfZ3JvdXBzW10gPSB7CkBAIC00MTM0LDYgKzQzMDMsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzYjBfZ3JvdXBzW10gPSB7CiAJInVzYjAiLAorCSJ1c2IwX292Y192YnVzIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiMV9ncm91cHNbXSA9IHsKQEAgLTQyMTMsNiArNDM4Myw3IEBACiAJU0hfUEZDX0ZVTkNUSU9OKG1zaW9mMSksCiAJU0hfUEZDX0ZVTkNUSU9OKG1zaW9mMiksCiAJU0hfUEZDX0ZVTkNUSU9OKG1zaW9mMyksCisJU0hfUEZDX0ZVTkNUSU9OKHFzcGkpLAogCVNIX1BGQ19GVU5DVElPTihzY2lmMCksCiAJU0hfUEZDX0ZVTkNUSU9OKHNjaWYxKSwKIAlTSF9QRkNfRlVOQ1RJT04oc2NpZjIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jCmluZGV4IDU2N2Q2OTEuLjUxODZkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkxLmMKQEAgLTE5NDUsNiArMTk0NSw1MCBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM0X2NfbXV4W10gPSB7CiAJU0NMNF9DX01BUkssIFNEQTRfQ19NQVJLLAogfTsKKy8qIC0gSTJDNyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzdfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNSwgMTUpLCBSQ0FSX0dQX1BJTig1LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM3X211eFtdID0geworCVNDTDdfTUFSSywgU0RBN19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjN19iX3BpbnNbXSA9IHsKKwkvKiBTQ0wsIFNEQSAqLworCVJDQVJfR1BfUElOKDIsIDIpLCBSQ0FSX0dQX1BJTigyLCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzdfYl9tdXhbXSA9IHsKKwlTQ0w3X0JfTUFSSywgU0RBN19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM3X2NfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNiwgMjgpLCBSQ0FSX0dQX1BJTig2LCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM3X2NfbXV4W10gPSB7CisJU0NMN19DX01BUkssIFNEQTdfQ19NQVJLLAorfTsKKy8qIC0gSTJDOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzhfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNCwgMTMpLCBSQ0FSX0dQX1BJTig0LCAxNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM4X211eFtdID0geworCVNDTDhfTUFSSywgU0RBOF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjOF9iX3BpbnNbXSA9IHsKKwkvKiBTQ0wsIFNEQSAqLworCVJDQVJfR1BfUElOKDIsIDQpLCBSQ0FSX0dQX1BJTigyLCA1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyYzhfYl9tdXhbXSA9IHsKKwlTQ0w4X0JfTUFSSywgU0RBOF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM4X2NfcGluc1tdID0geworCS8qIFNDTCwgU0RBICovCisJUkNBUl9HUF9QSU4oNiwgMjIpLCBSQ0FSX0dQX1BJTig2LCAyMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmM4X2NfbXV4W10gPSB7CisJU0NMOF9DX01BUkssIFNEQThfQ19NQVJLLAorfTsKIC8qIC0gSU5UQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGludGNfaXJxMF9waW5zW10gPSB7CiAJLyogSVJRICovCkBAIC0yMDUxLDYgKzIwOTUsOTIgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X211eFtdID0gewogCU1TSU9GMF9UWERfTUFSSywKIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigwLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfY2xrX2JfbXV4W10gPSB7CisJTVNJT0YwX1NDS19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3luY19iX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMCwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3N5bmNfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU1lOQ19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MxX2JfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDAsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczFfYl9tdXhbXSA9IHsKKwlNU0lPRjBfU1MxX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczJfYl9waW5zW10gPSB7CisJLyogU1MyICovCisJUkNBUl9HUF9QSU4oMCwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMl9iX211eFtdID0geworCU1TSU9GMF9TUzJfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X2JfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDAsIDIxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9yeF9iX211eFtdID0geworCU1TSU9GMF9SWERfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X2JfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDAsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF90eF9iX211eFtdID0geworCU1TSU9GMF9UWERfQl9NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfY2xrX2NfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDUsIDI2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfY19tdXhbXSA9IHsKKwlNU0lPRjBfU0NLX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zeW5jX2NfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTig1LCAyNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3luY19jX211eFtdID0geworCU1TSU9GMF9TWU5DX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9zczFfY19waW5zW10gPSB7CisJLyogU1MxICovCisJUkNBUl9HUF9QSU4oNSwgMjcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMV9jX211eFtdID0geworCU1TSU9GMF9TUzFfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3NzMl9jX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTig1LCAyOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3MyX2NfbXV4W10gPSB7CisJTVNJT0YwX1NTMl9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfY19waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oNSwgMjkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X2NfbXV4W10gPSB7CisJTVNJT0YwX1JYRF9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfY19waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oNSwgMzApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X2NfbXV4W10gPSB7CisJTVNJT0YwX1RYRF9DX01BUkssCit9OwogLyogLSBNU0lPRjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19waW5zW10gPSB7CiAJLyogU0NLICovCkBAIC0yMDk0LDYgKzIyMjQsMTQzIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9tdXhbXSA9IHsKIAlNU0lPRjFfVFhEX01BUkssCiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMiwgMjkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19iX211eFtdID0geworCU1TSU9GMV9TQ0tfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfYl9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDIsIDMwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX2JfbXV4W10gPSB7CisJTVNJT0YxX1NZTkNfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMV9iX3BpbnNbXSA9IHsKKwkvKiBTUzEgKi8KKwlSQ0FSX0dQX1BJTigyLCAzMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2JfbXV4W10gPSB7CisJTVNJT0YxX1NTMV9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MyX2JfcGluc1tdID0geworCS8qIFNTMiAqLworCVJDQVJfR1BfUElOKDcsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zczJfYl9tdXhbXSA9IHsKKwlNU0lPRjFfU1MyX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9iX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfYl9tdXhbXSA9IHsKKwlNU0lPRjFfUlhEX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9iX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfYl9tdXhbXSA9IHsKKwlNU0lPRjFfVFhEX0JfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19jX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfY2xrX2NfbXV4W10gPSB7CisJTVNJT0YxX1NDS19DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19jX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMiwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfY19tdXhbXSA9IHsKKwlNU0lPRjFfU1lOQ19DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfY19waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMiwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2NfbXV4W10gPSB7CisJTVNJT0YxX1JYRF9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfY19waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMiwgMTcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2NfbXV4W10gPSB7CisJTVNJT0YxX1RYRF9DX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfZF9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMCwgMjgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19kX211eFtdID0geworCU1TSU9GMV9TQ0tfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfZF9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDAsIDMwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX2RfbXV4W10gPSB7CisJTVNJT0YxX1NZTkNfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3NzMV9kX3BpbnNbXSA9IHsKKwkvKiBTUzEgKi8KKwlSQ0FSX0dQX1BJTigwLCAyOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3MxX2RfbXV4W10gPSB7CisJTVNJT0YxX1NTMV9EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfZF9waW5zW10gPSB7CisJLyogUlhEICovCisJUkNBUl9HUF9QSU4oMCwgMjcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2RfbXV4W10gPSB7CisJTVNJT0YxX1JYRF9EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfZF9waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMCwgMjYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2RfbXV4W10gPSB7CisJTVNJT0YxX1RYRF9EX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfZV9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNSwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX2Nsa19lX211eFtdID0geworCU1TSU9GMV9TQ0tfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfZV9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDUsIDE5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9zeW5jX2VfbXV4W10gPSB7CisJTVNJT0YxX1NZTkNfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X2VfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDUsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9yeF9lX211eFtdID0geworCU1TSU9GMV9SWERfRV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X2VfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDUsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV90eF9lX211eFtdID0geworCU1TSU9GMV9UWERfRV9NQVJLLAorfTsKIC8qIC0gTVNJT0YyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfcGluc1tdID0gewogCS8qIFNDSyAqLwpAQCAtMjEzNyw2ICsyNDA0LDE5NyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfbXV4W10gPSB7CiAJTVNJT0YyX1RYRF9NQVJLLAogfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2JfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDMsIDApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19iX211eFtdID0geworCU1TSU9GMl9TQ0tfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfYl9waW5zW10gPSB7CisJLyogU1lOQyAqLworCVJDQVJfR1BfUElOKDMsIDEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfYl9tdXhbXSA9IHsKKwlNU0lPRjJfU1lOQ19CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3MxX2JfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDMsIDgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMV9iX211eFtdID0geworCU1TSU9GMl9TUzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMl9iX3BpbnNbXSA9IHsKKwkvKiBTUzIgKi8KKwlSQ0FSX0dQX1BJTigzLCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczJfYl9tdXhbXSA9IHsKKwlNU0lPRjJfU1MyX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9iX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigzLCAxNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfcnhfYl9tdXhbXSA9IHsKKwlNU0lPRjJfUlhEX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9iX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigzLCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfYl9tdXhbXSA9IHsKKwlNU0lPRjJfVFhEX0JfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19jX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfY19tdXhbXSA9IHsKKwlNU0lPRjJfU0NLX0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2NfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigyLCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2NfbXV4W10gPSB7CisJTVNJT0YyX1NZTkNfQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2NfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDIsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2NfbXV4W10gPSB7CisJTVNJT0YyX1JYRF9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfY19waW5zW10gPSB7CisJLyogVFhEICovCisJUkNBUl9HUF9QSU4oMiwgNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfY19tdXhbXSA9IHsKKwlNU0lPRjJfVFhEX0NfTUFSSywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX2Nsa19kX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2RfbXV4W10gPSB7CisJTVNJT0YyX1NDS19EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3luY19kX3BpbnNbXSA9IHsKKwkvKiBTWU5DICovCisJUkNBUl9HUF9QSU4oMiwgMTUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3N5bmNfZF9tdXhbXSA9IHsKKwlNU0lPRjJfU1lOQ19EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3MxX2RfcGluc1tdID0geworCS8qIFNTMSAqLworCVJDQVJfR1BfUElOKDIsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczFfZF9tdXhbXSA9IHsKKwlNU0lPRjJfU1MxX0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zczJfZF9waW5zW10gPSB7CisJLyogU1MyICovCisJUkNBUl9HUF9QSU4oMiwgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3NzMl9kX211eFtdID0geworCU1TSU9GMl9TUzJfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3J4X2RfcGluc1tdID0geworCS8qIFJYRCAqLworCVJDQVJfR1BfUElOKDIsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9kX211eFtdID0geworCU1TSU9GMl9SWERfRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YyX3R4X2RfcGluc1tdID0geworCS8qIFRYRCAqLworCVJDQVJfR1BfUElOKDIsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9kX211eFtdID0geworCU1TSU9GMl9UWERfRF9NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfY2xrX2VfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDcsIDE1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9jbGtfZV9tdXhbXSA9IHsKKwlNU0lPRjJfU0NLX0VfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9zeW5jX2VfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTig3LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfc3luY19lX211eFtdID0geworCU1TSU9GMl9TWU5DX0VfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl9yeF9lX3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfcnhfZV9tdXhbXSA9IHsKKwlNU0lPRjJfUlhEX0VfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMl90eF9lX3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTig3LCAxMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjJfdHhfZV9tdXhbXSA9IHsKKwlNU0lPRjJfVFhEX0VfTUFSSywKK307CisvKiAtIFFTUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfcGluc1tdID0geworCS8qIFNQQ0xLLCBTU0wgKi8KKwlSQ0FSX0dQX1BJTigxLCA0KSwgUkNBUl9HUF9QSU4oMSwgOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfbXV4W10gPSB7CisJU1BDTEtfTUFSSywgU1NMX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEgKi8KKwlSQ0FSX0dQX1BJTigxLCA1KSwgUkNBUl9HUF9QSU4oMSwgNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGEyX211eFtdID0geworCU1PU0lfSU8wX01BUkssIE1JU09fSU8xX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEsIElPMiwgSU8zICovCisJUkNBUl9HUF9QSU4oMSwgNSksIFJDQVJfR1BfUElOKDEsIDYpLCBSQ0FSX0dQX1BJTigxLCA3KSwKKwlSQ0FSX0dQX1BJTigxLCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTRfbXV4W10gPSB7CisJTU9TSV9JTzBfTUFSSywgTUlTT19JTzFfTUFSSywgSU8yX01BUkssIElPM19NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxc3BpX2N0cmxfYl9waW5zW10gPSB7CisJLyogU1BDTEssIFNTTCAqLworCVJDQVJfR1BfUElOKDYsIDApLCBSQ0FSX0dQX1BJTig2LCA1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfY3RybF9iX211eFtdID0geworCVNQQ0xLX0JfTUFSSywgU1NMX0JfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTJfYl9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xICovCisJUkNBUl9HUF9QSU4oNiwgMSksIFJDQVJfR1BfUElOKDYsIDIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9iX211eFtdID0geworCU1PU0lfSU8wX0JfTUFSSywgTUlTT19JTzFfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9iX3BpbnNbXSA9IHsKKwkvKiBNT1NJX0lPMCwgTUlTT19JTzEsIElPMiwgSU8zICovCisJUkNBUl9HUF9QSU4oNiwgMSksIFJDQVJfR1BfUElOKDYsIDIpLCBSQ0FSX0dQX1BJTig2LCAzKSwKKwlSQ0FSX0dQX1BJTig2LCA0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTRfYl9tdXhbXSA9IHsKKwlTUENMS19CX01BUkssIE1PU0lfSU8wX0JfTUFSSywgTUlTT19JTzFfQl9NQVJLLAorCUlPMl9CX01BUkssIElPM19CX01BUkssIFNTTF9CX01BUkssCit9OwogLyogLSBTQ0lGMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjBfZGF0YV9waW5zW10gPSB7CiAJLyogUlgsIFRYICovCkBAIC0zMTI1LDYgKzM1ODMsMTIgQEAKIAlTSF9QRkNfUElOX0dST1VQKGkyYzQpLAogCVNIX1BGQ19QSU5fR1JPVVAoaTJjNF9iKSwKIAlTSF9QRkNfUElOX0dST1VQKGkyYzRfYyksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM3KSwKKwlTSF9QRkNfUElOX0dST1VQKGkyYzdfYiksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM3X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAoaTJjOCksCisJU0hfUEZDX1BJTl9HUk9VUChpMmM4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoaTJjOF9jKSwKIAlTSF9QRkNfUElOX0dST1VQKGludGNfaXJxMCksCiAJU0hfUEZDX1BJTl9HUk9VUChpbnRjX2lycTEpLAogCVNIX1BGQ19QSU5fR1JPVVAoaW50Y19pcnEyKSwKQEAgLTMxMzksMTggKzM2MDMsNzUgQEAKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zczIpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3J4KSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF90eCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3N5bmNfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MxX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3NzMl9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF90eF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9jbGtfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3luY19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMF9zczFfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3MyX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3J4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4X2MpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX2NsayksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luYyksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MxKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczIpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4KSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3N5bmNfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3MxX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3NzMl9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGtfYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luY19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9yeF9jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eF9jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGtfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfc3luY19kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9zczFfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfcnhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfdHhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfY2xrX2UpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3N5bmNfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfcnhfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjFfdHhfZSksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfY2xrKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jKSwKIAlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczEpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3NzMiksCiAJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcngpLAogCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9jbGtfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3luY19iKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfc3MyX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3J4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3R4X2IpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX2Nsa19jKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3J4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3R4X2MpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX2Nsa19kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zeW5jX2QpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3NzMV9kKSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMl9zczJfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcnhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfdHhfZCksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfY2xrX2UpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YyX3N5bmNfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfcnhfZSksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjJfdHhfZSksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAocXNwaV9kYXRhMiksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGE0KSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfY3RybF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHFzcGlfZGF0YTJfYiksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGE0X2IpLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YSksCiAJU0hfUEZDX1BJTl9HUk9VUChzY2lmMF9kYXRhX2IpLAogCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfZGF0YV9jKSwKQEAgLTMzMzcsNiArMzg1OCwxOCBAQAogCSJpMmM0X2MiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmM3X2dyb3Vwc1tdID0geworCSJpMmM3IiwKKwkiaTJjN19iIiwKKwkiaTJjN19jIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjOF9ncm91cHNbXSA9IHsKKwkiaTJjOCIsCisJImkyYzhfYiIsCisJImkyYzhfYyIsCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludGNfZ3JvdXBzW10gPSB7CiAJImludGNfaXJxMCIsCiAJImludGNfaXJxMSIsCkBAIC0zMzU4LDYgKzM4OTEsMTggQEAKIAkibXNpb2YwX3NzMiIsCiAJIm1zaW9mMF9yeCIsCiAJIm1zaW9mMF90eCIsCisJIm1zaW9mMF9jbGtfYiIsCisJIm1zaW9mMF9zeW5jX2IiLAorCSJtc2lvZjBfc3MxX2IiLAorCSJtc2lvZjBfc3MyX2IiLAorCSJtc2lvZjBfcnhfYiIsCisJIm1zaW9mMF90eF9iIiwKKwkibXNpb2YwX2Nsa19jIiwKKwkibXNpb2YwX3N5bmNfYyIsCisJIm1zaW9mMF9zczFfYyIsCisJIm1zaW9mMF9zczJfYyIsCisJIm1zaW9mMF9yeF9jIiwKKwkibXNpb2YwX3R4X2MiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2lvZjFfZ3JvdXBzW10gPSB7CkBAIC0zMzY3LDYgKzM5MTIsMjUgQEAKIAkibXNpb2YxX3NzMiIsCiAJIm1zaW9mMV9yeCIsCiAJIm1zaW9mMV90eCIsCisJIm1zaW9mMV9jbGtfYiIsCisJIm1zaW9mMV9zeW5jX2IiLAorCSJtc2lvZjFfc3MxX2IiLAorCSJtc2lvZjFfc3MyX2IiLAorCSJtc2lvZjFfcnhfYiIsCisJIm1zaW9mMV90eF9iIiwKKwkibXNpb2YxX2Nsa19jIiwKKwkibXNpb2YxX3N5bmNfYyIsCisJIm1zaW9mMV9yeF9jIiwKKwkibXNpb2YxX3R4X2MiLAorCSJtc2lvZjFfY2xrX2QiLAorCSJtc2lvZjFfc3luY19kIiwKKwkibXNpb2YxX3NzMV9kIiwKKwkibXNpb2YxX3J4X2QiLAorCSJtc2lvZjFfdHhfZCIsCisJIm1zaW9mMV9jbGtfZSIsCisJIm1zaW9mMV9zeW5jX2UiLAorCSJtc2lvZjFfcnhfZSIsCisJIm1zaW9mMV90eF9lIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNpb2YyX2dyb3Vwc1tdID0gewpAQCAtMzM3Niw2ICszOTQwLDM1IEBACiAJIm1zaW9mMl9zczIiLAogCSJtc2lvZjJfcngiLAogCSJtc2lvZjJfdHgiLAorCSJtc2lvZjJfY2xrX2IiLAorCSJtc2lvZjJfc3luY19iIiwKKwkibXNpb2YyX3NzMV9iIiwKKwkibXNpb2YyX3NzMl9iIiwKKwkibXNpb2YyX3J4X2IiLAorCSJtc2lvZjJfdHhfYiIsCisJIm1zaW9mMl9jbGtfYyIsCisJIm1zaW9mMl9zeW5jX2MiLAorCSJtc2lvZjJfcnhfYyIsCisJIm1zaW9mMl90eF9jIiwKKwkibXNpb2YyX2Nsa19kIiwKKwkibXNpb2YyX3N5bmNfZCIsCisJIm1zaW9mMl9zczFfZCIsCisJIm1zaW9mMl9zczJfZCIsCisJIm1zaW9mMl9yeF9kIiwKKwkibXNpb2YyX3R4X2QiLAorCSJtc2lvZjJfY2xrX2UiLAorCSJtc2lvZjJfc3luY19lIiwKKwkibXNpb2YyX3J4X2UiLAorCSJtc2lvZjJfdHhfZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGlfZ3JvdXBzW10gPSB7CisJInFzcGlfY3RybCIsCisJInFzcGlfZGF0YTIiLAorCSJxc3BpX2RhdGE0IiwKKwkicXNwaV9jdHJsX2IiLAorCSJxc3BpX2RhdGEyX2IiLAorCSJxc3BpX2RhdGE0X2IiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzY2lmMF9ncm91cHNbXSA9IHsKQEAgLTM1NjgsMTEgKzQxNjEsMTQgQEAKIAlTSF9QRkNfRlVOQ1RJT04oaTJjMiksCiAJU0hfUEZDX0ZVTkNUSU9OKGkyYzMpLAogCVNIX1BGQ19GVU5DVElPTihpMmM0KSwKKwlTSF9QRkNfRlVOQ1RJT04oaTJjNyksCisJU0hfUEZDX0ZVTkNUSU9OKGkyYzgpLAogCVNIX1BGQ19GVU5DVElPTihpbnRjKSwKIAlTSF9QRkNfRlVOQ1RJT04obW1jKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YwKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YxKSwKIAlTSF9QRkNfRlVOQ1RJT04obXNpb2YyKSwKKwlTSF9QRkNfRlVOQ1RJT04ocXNwaSksCiAJU0hfUEZDX0ZVTkNUSU9OKHNjaWYwKSwKIAlTSF9QRkNfRlVOQ1RJT04oc2NpZjEpLAogCVNIX1BGQ19GVU5DVElPTihzY2lmMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNi5jIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1hdGxhczYuYwppbmRleCAyYjlmMzIwLi5jNGRkM2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtYXRsYXM2LmMKQEAgLTEsNyArMSw4IEBACiAvKgogICogcGluY3RybCBwYWRzLCBncm91cHMsIGZ1bmN0aW9ucyBmb3IgQ1NSIFNpUkZhdGxhc1ZJCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICogQ29weXJpZ2h0IChjKSAyMDExIC0gMjAxNCBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAKKyAqIGNvbXBhbnkuCiAgKgogICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCiAgKi8KQEAgLTUyOSw2ICs1MzAsNDAgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVzcDBfcGluc1tdID0geyA1MSwgNTIsIDUzLCA1NCwgNTUgfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzaXJmc29jX211eG1hc2sgdXNwMF9vbmx5X3V0ZnNfbXV4bWFza1tdID0geworCXsKKwkJLmdyb3VwID0gMSwKKwkJLm1hc2sgPSBCSVQoMTkpIHwgQklUKDIwKSB8IEJJVCgyMSkgfCBCSVQoMjIpLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpcmZzb2NfcGFkbXV4IHVzcDBfb25seV91dGZzX3BhZG11eCA9IHsKKwkubXV4bWFza19jb3VudHMgPSBBUlJBWV9TSVpFKHVzcDBfb25seV91dGZzX211eG1hc2spLAorCS5tdXhtYXNrID0gdXNwMF9vbmx5X3V0ZnNfbXV4bWFzaywKKwkuY3RybHJlZyA9IFNJUkZTT0NfUlNDX1BJTl9NVVgsCisJLmZ1bmNtYXNrID0gQklUKDEpIHwgQklUKDIpIHwgQklUKDYpLAorCS5mdW5jdmFsID0gMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1c3AwX29ubHlfdXRmc19waW5zW10gPSB7IDUxLCA1MiwgNTMsIDU0IH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lyZnNvY19tdXhtYXNrIHVzcDBfb25seV91cmZzX211eG1hc2tbXSA9IHsKKwl7CisJCS5ncm91cCA9IDEsCisJCS5tYXNrID0gQklUKDE5KSB8IEJJVCgyMCkgfCBCSVQoMjEpIHwgQklUKDIzKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaXJmc29jX3BhZG11eCB1c3AwX29ubHlfdXJmc19wYWRtdXggPSB7CisJLm11eG1hc2tfY291bnRzID0gQVJSQVlfU0laRSh1c3AwX29ubHlfdXJmc19tdXhtYXNrKSwKKwkubXV4bWFzayA9IHVzcDBfb25seV91cmZzX211eG1hc2ssCisJLmN0cmxyZWcgPSBTSVJGU09DX1JTQ19QSU5fTVVYLAorCS5mdW5jbWFzayA9IEJJVCgxKSB8IEJJVCgyKSB8IEJJVCg5KSwKKwkuZnVuY3ZhbCA9IDAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdXNwMF9vbmx5X3VyZnNfcGluc1tdID0geyA1MSwgNTIsIDUzLCA1NSB9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNpcmZzb2NfbXV4bWFzayB1c3AwX3VhcnRfbm9zdHJlYW1jdHJsX211eG1hc2tbXSA9IHsKIAl7CiAJCS5ncm91cCA9IDEsCkBAIC05MDUsNiArOTQwLDggQEAKIAlTSVJGU09DX1BJTl9HUk9VUCgidXNwMGdycCIsIHVzcDBfcGlucyksCiAJU0lSRlNPQ19QSU5fR1JPVVAoInVzcDBfdWFydF9ub3N0cmVhbWN0cmxfZ3JwIiwKIAkJCQkJdXNwMF91YXJ0X25vc3RyZWFtY3RybF9waW5zKSwKKwlTSVJGU09DX1BJTl9HUk9VUCgidXNwMF9vbmx5X3V0ZnNfZ3JwIiwgdXNwMF9vbmx5X3V0ZnNfcGlucyksCisJU0lSRlNPQ19QSU5fR1JPVVAoInVzcDBfb25seV91cmZzX2dycCIsIHVzcDBfb25seV91cmZzX3BpbnMpLAogCVNJUkZTT0NfUElOX0dST1VQKCJ1c3AxZ3JwIiwgdXNwMV9waW5zKSwKIAlTSVJGU09DX1BJTl9HUk9VUCgidXNwMV91YXJ0X25vc3RyZWFtY3RybF9ncnAiLAogCQkJCQl1c3AxX3VhcnRfbm9zdHJlYW1jdHJsX3BpbnMpLApAQCAtOTUzLDYgKzk5MCw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDBfdWFydF9ub3N0cmVhbWN0cmxfZ3JwW10gPSB7CiAJCQkJCSJ1c3AwX3VhcnRfbm9zdHJlYW1jdHJsX2dycCIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMGdycFtdID0geyAidXNwMGdycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNwMF9vbmx5X3V0ZnNfZ3JwW10gPSB7ICJ1c3AwX29ubHlfdXRmc19ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDBfb25seV91cmZzX2dycFtdID0geyAidXNwMF9vbmx5X3VyZnNfZ3JwIiB9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDFncnBbXSA9IHsgInVzcDFncnAiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzcDFfdWFydF9ub3N0cmVhbWN0cmxfZ3JwW10gPSB7CiAJCQkJCSJ1c3AxX3VhcnRfbm9zdHJlYW1jdHJsX2dycCIgfTsKQEAgLTEwMDMsNiArMTA0MywxMCBAQAogCVNJUkZTT0NfUE1YX0ZVTkNUSU9OKCJ1c3AwX3VhcnRfbm9zdHJlYW1jdHJsIiwKIAkJCQkJCXVzcDBfdWFydF9ub3N0cmVhbWN0cmxfZ3JwLAogCQkJCQkJdXNwMF91YXJ0X25vc3RyZWFtY3RybF9wYWRtdXgpLAorCVNJUkZTT0NfUE1YX0ZVTkNUSU9OKCJ1c3AwX29ubHlfdXRmcyIsIHVzcDBfb25seV91dGZzX2dycCwKKwkJCQkJCXVzcDBfb25seV91dGZzX3BhZG11eCksCisJU0lSRlNPQ19QTVhfRlVOQ1RJT04oInVzcDBfb25seV91cmZzIiwgdXNwMF9vbmx5X3VyZnNfZ3JwLAorCQkJCQkJdXNwMF9vbmx5X3VyZnNfcGFkbXV4KSwKIAlTSVJGU09DX1BNWF9GVU5DVElPTigidXNwMSIsIHVzcDFncnAsIHVzcDFfcGFkbXV4KSwKIAlTSVJGU09DX1BNWF9GVU5DVElPTigidXNwMV91YXJ0X25vc3RyZWFtY3RybCIsCiAJCQkJCQl1c3AxX3VhcnRfbm9zdHJlYW1jdHJsX2dycCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtcHJpbWEyLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXByaW1hMi5jCmluZGV4IGRkZTAyODUuLjhhYTc2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtcHJpbWEyLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1wcmltYTIuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBwaW5jdHJsIHBhZHMsIGdyb3VwcywgZnVuY3Rpb25zIGZvciBDU1IgU2lSRnByaW1hSUkKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgLSAyMDE0IENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cAorICogY29tcGFueS4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYwppbmRleCA2MTdhNDkxLi41ZjNhZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBwaW5tdXggZHJpdmVyIGZvciBDU1IgU2lSRnByaW1hSUkKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgLSAyMDE0IENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cAorICogY29tcGFueS4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCmluZGV4IGRlZmI2YWYuLjk0YmI2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKQEAgLTY3NzYsOCArNjc3Niw5IEBACiAJc3RydWN0IHNuZF9rY29udHJvbCAqY3RsX211dGU7CiAJaW50IHJjOwogCi0JcmMgPSBzbmRfY2FyZF9jcmVhdGUoYWxzYV9pbmRleCwgYWxzYV9pZCwgVEhJU19NT0RVTEUsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCB0cGFjcGlfYWxzYV9kYXRhKSwgJmNhcmQpOworCXJjID0gc25kX2NhcmRfbmV3KCZ0cGFjcGlfcGRldi0+ZGV2LAorCQkJICBhbHNhX2luZGV4LCBhbHNhX2lkLCBUSElTX01PRFVMRSwKKwkJCSAgc2l6ZW9mKHN0cnVjdCB0cGFjcGlfYWxzYV9kYXRhKSwgJmNhcmQpOwogCWlmIChyYyA8IDAgfHwgIWNhcmQpIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIEFMU0EgY2FyZCBzdHJ1Y3R1cmVzOiAlZFxuIiwgcmMpOwogCQlyZXR1cm4gMTsKQEAgLTY4MjgsNyArNjgyOSw2IEBACiAJfQogCWRhdGEtPmN0bF9tdXRlX2lkID0gJmN0bF9tdXRlLT5pZDsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnRwYWNwaV9wZGV2LT5kZXYpOwogCXJjID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBBTFNBIGNhcmQ6ICVkXG4iLCByYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL2Jpb3NjYWxscy5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9iaW9zY2FsbHMuYwppbmRleCA3NjlkMjY1Li5kZWI3ZjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBiaW9zL2Jpb3NjYWxscy5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvYmlvc2NhbGxzLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgInBucGJpb3MuaCIKIAotc3RhdGljIHN0cnVjdCB7CitfX3Zpc2libGUgc3RydWN0IHsKIAl1MTYgb2Zmc2V0OwogCXUxNiBzZWdtZW50OwogfSBwbnBfYmlvc19jYWxscG9pbnQ7CkBAIC00MSw2ICs0MSw3IEBACiAKIF9fYXNtX18oIi50ZXh0CQkJXG4iCiAJX19BTElHTl9TVFIgIlxuIgorCSIuZ2xvYmwgcG5wX2Jpb3NfY2FsbGZ1bmNcbiIKIAkicG5wX2Jpb3NfY2FsbGZ1bmM6XG4iCiAJIglwdXNobCAlZWR4CVxuIgogCSIJcHVzaGwgJWVjeAlcbiIKQEAgLTY2LDkgKzY3LDkgQEAKICAqIGFmdGVyIFBuUCBCSU9TIG9vcHNlcy4KICAqLwogCi11MzIgcG5wX2Jpb3NfZmF1bHRfZXNwOwotdTMyIHBucF9iaW9zX2ZhdWx0X2VpcDsKLXUzMiBwbnBfYmlvc19pc191dHRlcl9jcmFwID0gMDsKK19fdmlzaWJsZSB1MzIgcG5wX2Jpb3NfZmF1bHRfZXNwOworX192aXNpYmxlIHUzMiBwbnBfYmlvc19mYXVsdF9laXA7CitfX3Zpc2libGUgdTMyIHBucF9iaW9zX2lzX3V0dGVyX2NyYXAgPSAwOwogCiBzdGF0aWMgc3BpbmxvY2tfdCBwbnBfYmlvc19sb2NrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYyBiL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jCmluZGV4IGZiNzMwMDguLmJjMWU1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jCisrKyBiL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jCkBAIC02OTksOCArNjk5LDYgQEAKIAogCUJVR19PTighYnl0ZXMpOwogCi0JUFJFUEFSRV9XT1JLKCZwcml2LT5yeF9saXN0Lndvcmsud29yaywgcHMzX3Z1YXJ0X3dvcmspOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgPj0gYnl0ZXMpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHNjaGVkdWxlX3dvcmsgJXhoIGJ5dGVzXG4iLApAQCAtMTA1Miw3ICsxMDUwLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+cnhfbGlzdC5oZWFkKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cnhfbGlzdC5sb2NrKTsKIAotCUlOSVRfV09SSygmcHJpdi0+cnhfbGlzdC53b3JrLndvcmssIE5VTEwpOworCUlOSVRfV09SSygmcHJpdi0+cnhfbGlzdC53b3JrLndvcmssIHBzM192dWFydF93b3JrKTsKIAlwcml2LT5yeF9saXN0LndvcmsudHJpZ2dlciA9IDA7CiAJcHJpdi0+cnhfbGlzdC53b3JrLmRldiA9IGRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvODhwbTgwMC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvODhwbTgwMC5jCmluZGV4IGQzMzNmN2UuLjdhNzIxZDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODAwLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvODhwbTgwMC5jCkBAIC0zMTAsMTAgKzMxMCw4IEBACiAKIAlwbTgwMF9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG04MDBfZGF0YSksCiAJCQkJCUdGUF9LRVJORUwpOwotCWlmICghcG04MDBfZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcG04MDBfcmVndWFsdG9ycyIpOworCWlmICghcG04MDBfZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcG04MDBfZGF0YS0+bWFwID0gY2hpcC0+c3ViY2hpcC0+cmVnbWFwX3Bvd2VyOwogCXBtODAwX2RhdGEtPmNoaXAgPSBjaGlwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvODhwbTg2MDcuYyBiL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMKaW5kZXggZjcwNGQ4My4uMzM3NjM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvODhwbTg2MDcuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jCkBAIC0yLDcgKzIsNyBAQAogICogUmVndWxhdG9ycyBkcml2ZXIgZm9yIE1hcnZlbGwgODhQTTg2MDcKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KLSAqIAlIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVsbC5jb20+CisgKglIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVsbC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC03OCw3ICs3OCw3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEJVQ0szX3RhYmxlW10gPSB7Ci0gICAgICAgICAgICAgIDAsICAgMjUwMDAsICAgNTAwMDAsICAgNzUwMDAsICAxMDAwMDAsICAxMjUwMDAsICAxNTAwMDAsICAxNzUwMDAsCisJICAgICAgMCwgICAyNTAwMCwgICA1MDAwMCwgICA3NTAwMCwgIDEwMDAwMCwgIDEyNTAwMCwgIDE1MDAwMCwgIDE3NTAwMCwKIAkgMjAwMDAwLCAgMjI1MDAwLCAgMjUwMDAwLCAgMjc1MDAwLCAgMzAwMDAwLCAgMzI1MDAwLCAgMzUwMDAwLCAgMzc1MDAwLAogCSA0MDAwMDAsICA0MjUwMDAsICA0NTAwMDAsICA0NzUwMDAsICA1MDAwMDAsICA1MjUwMDAsICA1NTAwMDAsICA1NzUwMDAsCiAJIDYwMDAwMCwgIDYyNTAwMCwgIDY1MDAwMCwgIDY3NTAwMCwgIDcwMDAwMCwgIDcyNTAwMCwgIDc1MDAwMCwgIDc3NTAwMCwKQEAgLTg5LDcgKzg5LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgQlVDSzNfc3VzcGVuZF90YWJsZVtdID0gewotICAgICAgICAgICAgICAwLCAgIDI1MDAwLCAgIDUwMDAwLCAgIDc1MDAwLCAgMTAwMDAwLCAgMTI1MDAwLCAgMTUwMDAwLCAgMTc1MDAwLAorCSAgICAgIDAsICAgMjUwMDAsICAgNTAwMDAsICAgNzUwMDAsICAxMDAwMDAsICAxMjUwMDAsICAxNTAwMDAsICAxNzUwMDAsCiAJIDIwMDAwMCwgIDIyNTAwMCwgIDI1MDAwMCwgIDI3NTAwMCwgIDMwMDAwMCwgIDMyNTAwMCwgIDM1MDAwMCwgIDM3NTAwMCwKIAkgNDAwMDAwLCAgNDI1MDAwLCAgNDUwMDAwLCAgNDc1MDAwLCAgNTAwMDAwLCAgNTI1MDAwLCAgNTUwMDAwLCAgNTc1MDAwLAogCSA2MDAwMDAsICA2MjUwMDAsICA2NTAwMDAsICA2NzUwMDAsICA3MDAwMDAsICA3MjUwMDAsICA3NTAwMDAsICA3NzUwMDAsCkBAIC0zMjIsNyArMzIyLDcgQEAKIAlucHJvb3QgPSBvZl9ub2RlX2dldChwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKTsKIAlpZiAoIW5wcm9vdCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JbnByb290ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnByb290LCAicmVndWxhdG9ycyIpOworCW5wcm9vdCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wcm9vdCwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIW5wcm9vdCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZmluZCByZWd1bGF0b3JzIG5vZGVcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCmluZGV4IDZhNzkzMjguLjFjZDg1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwpAQCAtMTM5LDYgKzEzOSwxNCBAQAogCSAgQVMzNzIyIFBNSUMuIFRoaXMgd2lsbCBlbmFibGUgc3VwcG9ydCBmb3IgYWxsIHRoZSBzb2Z0d2FyZQogCSAgY29udHJvbGxhYmxlIERDREMvTERPIHJlZ3VsYXRvcnMuCiAKK2NvbmZpZyBSRUdVTEFUT1JfQkNNNTkwWFgKKwl0cmlzdGF0ZSAiQnJvYWRjb20gQkNNNTkweHggUE1VIFJlZ3VsYXRvcnMiCisJZGVwZW5kcyBvbiBNRkRfQkNNNTkwWFgKKwloZWxwCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgdm9sdGFnZSByZWd1bGF0b3JzIG9uIHRoZQorCSAgQkNNNTkweHggUE1Vcy4gVGhpcyB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgc29mdHdhcmUKKwkgIGNvbnRyb2xsYWJsZSBMRE8vU3dpdGNoaW5nIHJlZ3VsYXRvcnMuCisKIGNvbmZpZyBSRUdVTEFUT1JfREE5MDNYCiAJdHJpc3RhdGUgIkRpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzMC9EQTkwMzQgcmVndWxhdG9ycyIKIAlkZXBlbmRzIG9uIFBNSUNfREE5MDNYCkBAIC0zOTksMTIgKzQwNywxMiBAQAogCSBvbiBQQ0Y1MDYzMwogCiBjb25maWcgUkVHVUxBVE9SX1BGVVpFMTAwCi0JdHJpc3RhdGUgIkZyZWVzY2FsZSBQRlVaRTEwMCByZWd1bGF0b3IgZHJpdmVyIgorCXRyaXN0YXRlICJGcmVlc2NhbGUgUEZVWkUxMDAvUEZVWkUyMDAgcmVndWxhdG9yIGRyaXZlciIKIAlkZXBlbmRzIG9uIEkyQwogCXNlbGVjdCBSRUdNQVBfSTJDCiAJaGVscAotCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IHRoZSByZWd1bGF0b3JzIGZvdW5kIG9uIHRoZSBGcmVlc2NhbGUgUEZVWkUxMDAKLQkgIFBNSUMuCisJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIHJlZ3VsYXRvcnMgZm91bmQgb24gdGhlIEZyZWVzY2FsZQorCSAgUEZVWkUxMDAvUEZVWkUyMDAgUE1JQy4KIAogY29uZmlnIFJFR1VMQVRPUl9SQzVUNTgzCiAJdHJpc3RhdGUgIlJJQ09IIFJDNVQ1ODMgUG93ZXIgcmVndWxhdG9ycyIKQEAgLTQxNiwxMyArNDI0LDIxIEBACiAJICB0aHJvdWdoIHJlZ3VsYXRvciBpbnRlcmZhY2UuIFRoZSBkZXZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgRENEQy9MRE8KIAkgIG91dHB1dHMgd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgYnkgaTJjIGNvbW11bmljYXRpb24uCiAKLWNvbmZpZyBSRUdVTEFUT1JfUzJNUFMxMQotCXRyaXN0YXRlICJTYW1zdW5nIFMyTVBTMTEgdm9sdGFnZSByZWd1bGF0b3IiCitjb25maWcgUkVHVUxBVE9SX1MyTVBBMDEKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTMk1QQTAxIHZvbHRhZ2UgcmVndWxhdG9yIgogCWRlcGVuZHMgb24gTUZEX1NFQ19DT1JFCiAJaGVscAotCSBUaGlzIGRyaXZlciBzdXBwb3J0cyBhIFNhbXN1bmcgUzJNUFMxMSB2b2x0YWdlIG91dHB1dCByZWd1bGF0b3IKLQkgdmlhIEkyQyBidXMuIFMyTVBTMTEgaXMgY29tcHJpc2VkIG9mIGhpZ2ggZWZmaWNpZW50IEJ1Y2sgY29udmVydGVycwotCSBpbmNsdWRpbmcgRHVhbC1QaGFzZSBCdWNrIGNvbnZlcnRlciwgQnVjay1Cb29zdCBjb252ZXJ0ZXIsIHZhcmlvdXMgTERPcy4KKwkgVGhpcyBkcml2ZXIgY29udHJvbHMgU2Ftc3VuZyBTMk1QQTAxIHZvbHRhZ2Ugb3V0cHV0IHJlZ3VsYXRvcgorCSB2aWEgSTJDIGJ1cy4gUzJNUEEwMSBoYXMgMTAgQnVja3MgYW5kIDI2IExETyBvdXRwdXRzLgorCitjb25maWcgUkVHVUxBVE9SX1MyTVBTMTEKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTMk1QUzExL1MyTVBTMTQgdm9sdGFnZSByZWd1bGF0b3IiCisJZGVwZW5kcyBvbiBNRkRfU0VDX0NPUkUKKwloZWxwCisJIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGEgU2Ftc3VuZyBTMk1QUzExL1MyTVBTMTQgdm9sdGFnZSBvdXRwdXQKKwkgcmVndWxhdG9yIHZpYSBJMkMgYnVzLiBUaGUgY2hpcCBpcyBjb21wcmlzZWQgb2YgaGlnaCBlZmZpY2llbnQgQnVjaworCSBjb252ZXJ0ZXJzIGluY2x1ZGluZyBEdWFsLVBoYXNlIEJ1Y2sgY29udmVydGVyLCBCdWNrLUJvb3N0IGNvbnZlcnRlciwKKwkgdmFyaW91cyBMRE9zLgogCiBjb25maWcgUkVHVUxBVE9SX1M1TTg3NjcKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTNU04NzY3QSB2b2x0YWdlIHJlZ3VsYXRvciIKQEAgLTQzMiw2ICs0NDgsMTIgQEAKIAkgdmlhIEkyQyBidXMuIFM1TTg3NjdBIGhhdmUgOSBCdWNrcyBhbmQgMjggTERPcyBvdXRwdXQgYW5kCiAJIHN1cHBvcnRzIERWUyBtb2RlIHdpdGggOGJpdHMgb2Ygb3V0cHV0IHZvbHRhZ2UgY29udHJvbC4KIAorY29uZmlnIFJFR1VMQVRPUl9TVF9QV00KKwl0cmlzdGF0ZSAiU1RNaWNyb2VsZWN0cm9uaWNzIFBXTSB2b2x0YWdlIHJlZ3VsYXRvciIKKwlkZXBlbmRzIG9uIEFSQ0hfU1RJCisJaGVscAorCSBUaGlzIGRyaXZlciBzdXBwb3J0cyBTVCdzIFBXTSBjb250cm9sbGVkIHZvbHRhZ2UgcmVndWxhdG9ycy4KKwogY29uZmlnIFJFR1VMQVRPUl9USV9BQkIKIAl0cmlzdGF0ZSAiVEkgQWRhcHRpdmUgQm9keSBCaWFzIG9uLWNoaXAgTERPIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQCkBAIC01MTMsNiArNTM1LDE1IEBACiAJICB2b2x0YWdlIHJlZ3VsYXRvcnMuIEl0IHN1cHBvcnRzIHNvZnR3YXJlIGJhc2VkIHZvbHRhZ2UgY29udHJvbAogCSAgZm9yIGRpZmZlcmVudCB2b2x0YWdlIGRvbWFpbnMKIAorY29uZmlnIFJFR1VMQVRPUl9UUFM2NTIxOAorCXRyaXN0YXRlICJUSSBUUFM2NTIxOCBQb3dlciByZWd1bGF0b3JzIgorCWRlcGVuZHMgb24gTUZEX1RQUzY1MjE4ICYmIE9GCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgVFBTNjUyMTggdm9sdGFnZSByZWd1bGF0b3IgY2hpcHMuIFRQUzY1MjE4CisJICBwcm92aWRlcyBzaXggc3RlcC1kb3duIGNvbnZlcnRlcnMgYW5kIG9uZSBnZW5lcmFsLXB1cnBvc2UgTERPCisJICB2b2x0YWdlIHJlZ3VsYXRvcnMuIEl0IHN1cHBvcnRzIHNvZnR3YXJlIGJhc2VkIHZvbHRhZ2UgY29udHJvbAorCSAgZm9yIGRpZmZlcmVudCB2b2x0YWdlIGRvbWFpbnMKKwogY29uZmlnIFJFR1VMQVRPUl9UUFM2NTI0WAogCXRyaXN0YXRlICJUSSBUUFM2NTI0WCBQb3dlciByZWd1bGF0b3JzIgogCWRlcGVuZHMgb24gU1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZSBiL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCmluZGV4IDk3OWY5ZGQuLmYwZmUwYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCkBAIC0yMCw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0FSSVpPTkEpICs9IGFyaXpvbmEtbWljc3VwcC5vIGFyaXpvbmEtbGRvMS5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0FTMzcxMSkgKz0gYXMzNzExLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0FTMzcyMikgKz0gYXMzNzIyLXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX0JDTTU5MFhYKSArPSBiY201OTB4eC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9EQTkwM1gpCSs9IGRhOTAzeC5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0RBOTA1MikJKz0gZGE5MDUyLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0RBOTA1NSkJKz0gZGE5MDU1LXJlZ3VsYXRvci5vCkBAIC01Nyw4ICs1OCwxMCBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9QQ0FQKSArPSBwY2FwLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1BDRjUwNjMzKSArPSBwY2Y1MDYzMy1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9SQzVUNTgzKSAgKz0gcmM1dDU4My1yZWd1bGF0b3Iubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9TMk1QQTAxKSArPSBzMm1wYTAxLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfUzJNUFMxMSkgKz0gczJtcHMxMS5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1M1TTg3NjcpICs9IHM1bTg3Njcubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9TVF9QV00pICs9IHN0LXB3bS5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1NUVzQ4MVhfVk1NQykgKz0gc3R3NDgxeC12bW1jLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVElfQUJCKSArPSB0aS1hYmItcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjEwNVgpICs9IHRwczYxMDV4LXJlZ3VsYXRvci5vCkBAIC02Nyw2ICs3MCw3IEBACiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MDdYKSArPSB0cHM2NTA3eC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTA5MCkgKz0gdHBzNjUwOTAtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUyMTcpICs9IHRwczY1MjE3LXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MjE4KSArPSB0cHM2NTIxOC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTI0WCkgKz0gdHBzNjUyNHgtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjU4NlgpICs9IHRwczY1ODZ4LXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1OTEwKSArPSB0cHM2NTkxMC1yZWd1bGF0b3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKaW5kZXggZjcwYTliZi4uYzg3M2VlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jCkBAIC05OSw2ICs5OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBhYXQyODcwX2xkb19vcHMgPSB7CiAJLmxpc3Rfdm9sdGFnZSA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfdGFibGUsCisJLm1hcF92b2x0YWdlID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2FzY2VuZCwKIAkuc2V0X3ZvbHRhZ2Vfc2VsID0gYWF0Mjg3MF9sZG9fc2V0X3ZvbHRhZ2Vfc2VsLAogCS5nZXRfdm9sdGFnZV9zZWwgPSBhYXQyODcwX2xkb19nZXRfdm9sdGFnZV9zZWwsCiAJLmVuYWJsZSA9IGFhdDI4NzBfbGRvX2VuYWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FjdDg4NjUtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci5jCmluZGV4IDA4NGNjMDguLmI5MmQ3ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FjdDg4NjUtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYWN0ODg2NS1yZWd1bGF0b3IuYwpAQCAtNjIsNyArNjIsNiBAQAogI2RlZmluZQlBQ1Q4ODY1X1ZPTFRBR0VfTlVNCTY0CiAKIHN0cnVjdCBhY3Q4ODY1IHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldltBQ1Q4ODY1X1JFR19OVU1dOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIH07CiAKQEAgLTIxMyw3ICsyMTIsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJc3RydWN0IGFjdDg4NjVfcmVndWxhdG9yX2RhdGEgKnJlZ3VsYXRvcjsKIAotCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCW5wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghbnApIHsKIAkJZGV2X2VycihkZXYsICJtaXNzaW5nICdyZWd1bGF0b3JzJyBzdWJub2RlIGluIERUXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjEsMTcgKzIyMCwxNSBAQAogCiAJbWF0Y2hlZCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIG5wLAogCQkJCWFjdDg4NjVfbWF0Y2hlcywgQVJSQVlfU0laRShhY3Q4ODY1X21hdGNoZXMpKTsKKwlvZl9ub2RlX3B1dChucCk7CiAJaWYgKG1hdGNoZWQgPD0gMCkKIAkJcmV0dXJuIG1hdGNoZWQ7CiAKIAlwZGF0YS0+cmVndWxhdG9ycyA9IGRldm1fa3phbGxvYyhkZXYsCiAJCQkJc2l6ZW9mKHN0cnVjdCBhY3Q4ODY1X3JlZ3VsYXRvcl9kYXRhKSAqCiAJCQkJQVJSQVlfU0laRShhY3Q4ODY1X21hdGNoZXMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhLT5yZWd1bGF0b3JzKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBhY3Q4ODY1IHJlZ2lzdG9yXG4iLAotCQkJCQkJX19mdW5jX18pOworCWlmICghcGRhdGEtPnJlZ3VsYXRvcnMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBkYXRhLT5udW1fcmVndWxhdG9ycyA9IG1hdGNoZWQ7CiAJcmVndWxhdG9yID0gcGRhdGEtPnJlZ3VsYXRvcnM7CkBAIC0yNTgsNyArMjU1LDcgQEAKIHN0YXRpYyBpbnQgYWN0ODg2NV9wbWljX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGFjdDg4NjVfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwpAQCAtMjkyLDggKzI4OSw2IEBACiAJaWYgKCFhY3Q4ODY1KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJkZXYgPSBhY3Q4ODY1LT5yZGV2OwotCiAJYWN0ODg2NS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWN0ODg2NV9yZWdtYXBfY29uZmlnKTsKIAlpZiAoSVNfRVJSKGFjdDg4NjUtPnJlZ21hcCkpIHsKIAkJZXJyb3IgPSBQVFJfRVJSKGFjdDg4NjUtPnJlZ21hcCk7CkBAIC0zMTMsMTIgKzMwOCwxMiBAQAogCQljb25maWcuZHJpdmVyX2RhdGEgPSBhY3Q4ODY1OwogCQljb25maWcucmVnbWFwID0gYWN0ODg2NS0+cmVnbWFwOwogCi0JCXJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsCi0JCQkJCQkmYWN0ODg2NV9yZWdbaV0sICZjb25maWcpOwotCQlpZiAoSVNfRVJSKHJkZXZbaV0pKSB7CisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZhY3Q4ODY1X3JlZ1tpXSwKKwkJCQkJICAgICAgICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciAlc1xuIiwKIAkJCQlhY3Q4ODY1X3JlZ1tpZF0ubmFtZSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihyZGV2W2ldKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hbmF0b3AtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hbmF0b3AtcmVndWxhdG9yLmMKaW5kZXggODYyZTYzZS4uN2MzOTdiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYW5hdG9wLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FuYXRvcC1yZWd1bGF0b3IuYwpAQCAtMzQsNiArMzQsOSBAQAogI2RlZmluZSBMRE9fUkFNUF9VUF9VTklUX0lOX0NZQ0xFUyAgICAgIDY0IC8qIDY0IGN5Y2xlcyBwZXIgc3RlcCAqLwogI2RlZmluZSBMRE9fUkFNUF9VUF9GUkVRX0lOX01IWiAgICAgICAgIDI0IC8qIGN5Y2xlIGJhc2VkIG9uIDI0TSBPU0MgKi8KIAorI2RlZmluZSBMRE9fUE9XRVJfR0FURQkJCTB4MDAKKyNkZWZpbmUgTERPX0ZFVF9GVUxMX09OCQkJMHgxZgorCiBzdHJ1Y3QgYW5hdG9wX3JlZ3VsYXRvciB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1MzIgY29udHJvbF9yZWc7CkBAIC00OCwxOSArNTEsMTAgQEAKIAlpbnQgbWF4X3ZvbHRhZ2U7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJkZXNjOwogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0ZGF0YTsKKwlib29sIGJ5cGFzczsKKwlpbnQgc2VsOwogfTsKIAotc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX3NldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnLAotCQkJCQl1bnNpZ25lZCBzZWxlY3RvcikKLXsKLQlzdHJ1Y3QgYW5hdG9wX3JlZ3VsYXRvciAqYW5hdG9wX3JlZyA9IHJkZXZfZ2V0X2RydmRhdGEocmVnKTsKLQotCWlmICghYW5hdG9wX3JlZy0+Y29udHJvbF9yZWcpCi0JCXJldHVybiAtRU5PVFNVUFA7Ci0KLQlyZXR1cm4gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnLCBzZWxlY3Rvcik7Ci19Ci0KIHN0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9zZXRfdm9sdGFnZV90aW1lX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnLAogCXVuc2lnbmVkIGludCBvbGRfc2VsLAogCXVuc2lnbmVkIGludCBuZXdfc2VsKQpAQCAtODcsMjQgKzgxLDEwMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZykKK3N0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZykKK3sKKwlzdHJ1Y3QgYW5hdG9wX3JlZ3VsYXRvciAqYW5hdG9wX3JlZyA9IHJkZXZfZ2V0X2RydmRhdGEocmVnKTsKKwlpbnQgc2VsOworCisJc2VsID0gYW5hdG9wX3JlZy0+YnlwYXNzID8gTERPX0ZFVF9GVUxMX09OIDogYW5hdG9wX3JlZy0+c2VsOworCXJldHVybiByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcsIHNlbCk7Cit9CisKK3N0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcpCit7CisJcmV0dXJuIHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZywgTERPX1BPV0VSX0dBVEUpOworfQorCitzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnKQoreworCXJldHVybiByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcpICE9IExET19QT1dFUl9HQVRFOworfQorCitzdGF0aWMgaW50IGFuYXRvcF9yZWdtYXBfY29yZV9zZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZywKKwkJCQkJICAgICAgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IGFuYXRvcF9yZWd1bGF0b3IgKmFuYXRvcF9yZWcgPSByZGV2X2dldF9kcnZkYXRhKHJlZyk7CisJaW50IHJldDsKKworCWlmIChhbmF0b3BfcmVnLT5ieXBhc3MgfHwgIWFuYXRvcF9yZWdtYXBfaXNfZW5hYmxlZChyZWcpKSB7CisJCWFuYXRvcF9yZWctPnNlbCA9IHNlbGVjdG9yOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcChyZWcsIHNlbGVjdG9yKTsKKwlpZiAoIXJldCkKKwkJYW5hdG9wX3JlZy0+c2VsID0gc2VsZWN0b3I7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbmF0b3BfcmVnbWFwX2NvcmVfZ2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcpCiB7CiAJc3RydWN0IGFuYXRvcF9yZWd1bGF0b3IgKmFuYXRvcF9yZWcgPSByZGV2X2dldF9kcnZkYXRhKHJlZyk7CiAKLQlpZiAoIWFuYXRvcF9yZWctPmNvbnRyb2xfcmVnKQotCQlyZXR1cm4gLUVOT1RTVVBQOworCWlmIChhbmF0b3BfcmVnLT5ieXBhc3MgfHwgIWFuYXRvcF9yZWdtYXBfaXNfZW5hYmxlZChyZWcpKQorCQlyZXR1cm4gYW5hdG9wX3JlZy0+c2VsOwogCiAJcmV0dXJuIHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZyk7CiB9CiAKK3N0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9nZXRfYnlwYXNzKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcsIGJvb2wgKmVuYWJsZSkKK3sKKwlzdHJ1Y3QgYW5hdG9wX3JlZ3VsYXRvciAqYW5hdG9wX3JlZyA9IHJkZXZfZ2V0X2RydmRhdGEocmVnKTsKKwlpbnQgc2VsOworCisJc2VsID0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAocmVnKTsKKwlpZiAoc2VsID09IExET19GRVRfRlVMTF9PTikKKwkJV0FSTl9PTighYW5hdG9wX3JlZy0+YnlwYXNzKTsKKwllbHNlIGlmIChzZWwgIT0gTERPX1BPV0VSX0dBVEUpCisJCVdBUk5fT04oYW5hdG9wX3JlZy0+YnlwYXNzKTsKKworCSplbmFibGUgPSBhbmF0b3BfcmVnLT5ieXBhc3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW5hdG9wX3JlZ21hcF9zZXRfYnlwYXNzKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWcsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBhbmF0b3BfcmVndWxhdG9yICphbmF0b3BfcmVnID0gcmRldl9nZXRfZHJ2ZGF0YShyZWcpOworCWludCBzZWw7CisKKwlpZiAoZW5hYmxlID09IGFuYXRvcF9yZWctPmJ5cGFzcykKKwkJcmV0dXJuIDA7CisKKwlzZWwgPSBlbmFibGUgPyBMRE9fRkVUX0ZVTExfT04gOiBhbmF0b3BfcmVnLT5zZWw7CisJYW5hdG9wX3JlZy0+YnlwYXNzID0gZW5hYmxlOworCisJcmV0dXJuIHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwKHJlZywgc2VsKTsKK30KKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGFuYXRvcF9yb3BzID0gewotCS5zZXRfdm9sdGFnZV9zZWwgPSBhbmF0b3BfcmVnbWFwX3NldF92b2x0YWdlX3NlbCwKLQkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwgPSBhbmF0b3BfcmVnbWFwX3NldF92b2x0YWdlX3RpbWVfc2VsLAotCS5nZXRfdm9sdGFnZV9zZWwgPSBhbmF0b3BfcmVnbWFwX2dldF92b2x0YWdlX3NlbCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAogCS5saXN0X3ZvbHRhZ2UgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKIAkubWFwX3ZvbHRhZ2UgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAogfTsKIAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGFuYXRvcF9jb3JlX3JvcHMgPSB7CisJLmVuYWJsZSA9IGFuYXRvcF9yZWdtYXBfZW5hYmxlLAorCS5kaXNhYmxlID0gYW5hdG9wX3JlZ21hcF9kaXNhYmxlLAorCS5pc19lbmFibGVkID0gYW5hdG9wX3JlZ21hcF9pc19lbmFibGVkLAorCS5zZXRfdm9sdGFnZV9zZWwgPSBhbmF0b3BfcmVnbWFwX2NvcmVfc2V0X3ZvbHRhZ2Vfc2VsLAorCS5zZXRfdm9sdGFnZV90aW1lX3NlbCA9IGFuYXRvcF9yZWdtYXBfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCisJLmdldF92b2x0YWdlX3NlbCA9IGFuYXRvcF9yZWdtYXBfY29yZV9nZXRfdm9sdGFnZV9zZWwsCisJLmxpc3Rfdm9sdGFnZSA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorCS5tYXBfdm9sdGFnZSA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXIsCisJLmdldF9ieXBhc3MgPSBhbmF0b3BfcmVnbWFwX2dldF9ieXBhc3MsCisJLnNldF9ieXBhc3MgPSBhbmF0b3BfcmVnbWFwX3NldF9ieXBhc3MsCit9OworCiBzdGF0aWMgaW50IGFuYXRvcF9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwpAQCAtMTE2LDYgKzE4Nyw3IEBACiAJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRkYXRhOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKIAlpbnQgcmV0ID0gMDsKKwl1MzIgdmFsOwogCiAJaW5pdGRhdGEgPSBvZl9nZXRfcmVndWxhdG9yX2luaXRfZGF0YShkZXYsIG5wKTsKIAlzcmVnID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzcmVnKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMjUsNyArMTk3LDYgQEAKIAlzcmVnLT5uYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVndWxhdG9yLW5hbWUiLCBOVUxMKTsKIAlyZGVzYyA9ICZzcmVnLT5yZGVzYzsKIAlyZGVzYy0+bmFtZSA9IHNyZWctPm5hbWU7Ci0JcmRlc2MtPm9wcyA9ICZhbmF0b3Bfcm9wczsKIAlyZGVzYy0+dHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFOwogCXJkZXNjLT5vd25lciA9IFRISVNfTU9EVUxFOwogCkBAIC0xOTcsNiArMjY4LDI1IEBACiAJY29uZmlnLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAljb25maWcucmVnbWFwID0gc3JlZy0+YW5hdG9wOwogCisJLyogT25seSBjb3JlIHJlZ3VsYXRvcnMgaGF2ZSB0aGUgcmFtcCB1cCBkZWxheSBjb25maWd1cmF0aW9uLiAqLworCWlmIChzcmVnLT5jb250cm9sX3JlZyAmJiBzcmVnLT5kZWxheV9iaXRfd2lkdGgpIHsKKwkJcmRlc2MtPm9wcyA9ICZhbmF0b3BfY29yZV9yb3BzOworCisJCXJldCA9IHJlZ21hcF9yZWFkKGNvbmZpZy5yZWdtYXAsIHJkZXNjLT52c2VsX3JlZywgJnZhbCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlYWQgaW5pdGlhbCBzdGF0ZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc3JlZy0+c2VsID0gKHZhbCAmIHJkZXNjLT52c2VsX21hc2spID4+IHNyZWctPnZvbF9iaXRfc2hpZnQ7CisJCWlmIChzcmVnLT5zZWwgPT0gTERPX0ZFVF9GVUxMX09OKSB7CisJCQlzcmVnLT5zZWwgPSAwOworCQkJc3JlZy0+YnlwYXNzID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSB7CisJCXJkZXNjLT5vcHMgPSAmYW5hdG9wX3JvcHM7CisJfQorCiAJLyogcmVnaXN0ZXIgcmVndWxhdG9yICovCiAJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKGRldiwgcmRlc2MsICZjb25maWcpOwogCWlmIChJU19FUlIocmRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbGRvMS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1sZG8xLmMKaW5kZXggNGY2YzIwNS4uYjEwMzNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1sZG8xLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1sZG8xLmMKQEAgLTE1MywxMSArMTUzLDkgQEAKIAogCS52c2VsX3JlZyA9IEFSSVpPTkFfTERPMV9DT05UUk9MXzEsCiAJLnZzZWxfbWFzayA9IEFSSVpPTkFfTERPMV9WU0VMX01BU0ssCi0JLmJ5cGFzc19yZWcgPSBBUklaT05BX0xETzFfQ09OVFJPTF8xLAotCS5ieXBhc3NfbWFzayA9IEFSSVpPTkFfTERPMV9CWVBBU1MsCiAJLm1pbl91ViA9IDkwMDAwMCwKLQkudVZfc3RlcCA9IDUwMDAwLAotCS5uX3ZvbHRhZ2VzID0gNywKKwkudVZfc3RlcCA9IDI1MDAwLAorCS5uX3ZvbHRhZ2VzID0gMTMsCiAJLmVuYWJsZV90aW1lID0gNTAwLAogCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC0xODksMTAgKzE4Nyw4IEBACiAJaW50IHJldDsKIAogCWxkbzEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpsZG8xKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxkbzEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWxkbzEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxkbzEtPmFyaXpvbmEgPSBhcml6b25hOwogCkBAIC0yMDMsNiArMTk5LDcgQEAKIAkgKi8KIAlzd2l0Y2ggKGFyaXpvbmEtPnR5cGUpIHsKIAljYXNlIFdNNTEwMjoKKwljYXNlIFdNODk5NzoKIAkJZGVzYyA9ICZhcml6b25hX2xkbzFfaGM7CiAJCWxkbzEtPmluaXRfZGF0YSA9IGFyaXpvbmFfbGRvMV9kdmZzOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbWljc3VwcC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1taWNzdXBwLmMKaW5kZXggMDM0ZWNlNy4uNmZkZDliZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1taWNzdXBwLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1taWNzdXBwLmMKQEAgLTIwNCwxMCArMjA0LDggQEAKIAlpbnQgcmV0OwogCiAJbWljc3VwcCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1pY3N1cHApLCBHRlBfS0VSTkVMKTsKLQlpZiAobWljc3VwcCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbWljc3VwcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJbWljc3VwcC0+YXJpem9uYSA9IGFyaXpvbmE7CiAJSU5JVF9XT1JLKCZtaWNzdXBwLT5jaGVja19jcF93b3JrLCBhcml6b25hX21pY3N1cHBfY2hlY2tfY3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzExLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzExLXJlZ3VsYXRvci5jCmluZGV4IGM3N2E1ODQuLmI0NzI4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcxMS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MTEtcmVndWxhdG9yLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogewogCXN0cnVjdCBhczM3MTFfcmVndWxhdG9yX3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ3VsYXRvcnMgPQotCQlvZl9maW5kX25vZGVfYnlfbmFtZShkZXYtPnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwkJb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqbWF0Y2g7CiAJaW50IHJldCwgaTsKIApAQCAtMjIxLDcgKzIyMSw2IEBACiB7CiAJc3RydWN0IGFzMzcxMV9yZWd1bGF0b3JfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3QgYXMzNzExICphczM3MTEgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnJlZ19kYXRhOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsuZGV2ID0gJnBkZXYtPmRldix9OwogCXN0cnVjdCBhczM3MTFfcmVndWxhdG9yICpyZWcgPSBOVUxMOwogCXN0cnVjdCBhczM3MTFfcmVndWxhdG9yICpyZWdzOwpAQCAtMjQ2LDIyICsyNDUsMTQgQEAKIAogCXJlZ3MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgQVMzNzExX1JFR1VMQVRPUl9OVU0gKgogCQkJc2l6ZW9mKHN0cnVjdCBhczM3MTFfcmVndWxhdG9yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWdzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBleGl0aW5nLi5cbiIpOworCWlmICghcmVncykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChpZCA9IDAsIHJpID0gYXMzNzExX3JlZ19pbmZvOyBpZCA8IEFTMzcxMV9SRUdVTEFUT1JfTlVNOyArK2lkLCByaSsrKSB7Ci0JCXJlZ19kYXRhID0gcGRhdGEtPmluaXRfZGF0YVtpZF07Ci0KLQkJLyogTm8gbmVlZCB0byByZWdpc3RlciBpZiB0aGVyZSBpcyBubyByZWd1bGF0b3IgZGF0YSAqLwotCQlpZiAoIXJlZ19kYXRhKQotCQkJY29udGludWU7Ci0KIAkJcmVnID0gJnJlZ3NbaWRdOwogCQlyZWctPnJlZ19pbmZvID0gcmk7CiAKLQkJY29uZmlnLmluaXRfZGF0YSA9IHJlZ19kYXRhOworCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPmluaXRfZGF0YVtpZF07CiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHJlZzsKIAkJY29uZmlnLnJlZ21hcCA9IGFzMzcxMS0+cmVnbWFwOwogCQljb25maWcub2Zfbm9kZSA9IG9mX25vZGVbaWRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzIyLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYXMzNzIyLXJlZ3VsYXRvci5jCmluZGV4IDhiMTdkNzguLjg1NTg1MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FzMzcyMi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hczM3MjItcmVndWxhdG9yLmMKQEAgLTcxOSw2ICs3MTksNyBAQAogCiAJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIG5wLCBhczM3MjJfcmVndWxhdG9yX21hdGNoZXMsCiAJCQlBUlJBWV9TSVpFKGFzMzcyMl9yZWd1bGF0b3JfbWF0Y2hlcykpOworCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQYXJzaW5nIG9mIHJlZ3VsYXRvciBub2RlIGZhaWxlZDogJWRcbiIsCiAJCQlyZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYmNtNTkweHgtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9iY201OTB4eC1yZWd1bGF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA4Y2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYmNtNTkweHgtcmVndWxhdG9yLmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBCcm9hZGNvbSBCQ001OTB4eCByZWd1bGF0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIExpbWl0ZWQKKyAqIEF1dGhvcjogTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2JjbTU5MHh4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBSZWdpc3RlciBkZWZzICovCisjZGVmaW5lIEJDTTU5MFhYX1JGTERPUE1DVFJMMQkweDYwCisjZGVmaW5lIEJDTTU5MFhYX0lPU1IxUE1DVFJMMQkweDdhCisjZGVmaW5lIEJDTTU5MFhYX0lPU1IyUE1DVFJMMQkweDdjCisjZGVmaW5lIEJDTTU5MFhYX0NTUlBNQ1RSTDEJMHg3ZQorI2RlZmluZSBCQ001OTBYWF9TRFNSMVBNQ1RSTDEJMHg4MgorI2RlZmluZSBCQ001OTBYWF9TRFNSMlBNQ1RSTDEJMHg4NgorI2RlZmluZSBCQ001OTBYWF9NU1JQTUNUUkwxCTB4OGEKKyNkZWZpbmUgQkNNNTkwWFhfVlNSUE1DVFJMMQkweDhlCisjZGVmaW5lIEJDTTU5MFhYX1JFR19FTkFCTEUJQklUKDcpCisKKyNkZWZpbmUgQkNNNTkwWFhfUkZMRE9DVFJMCTB4OTYKKyNkZWZpbmUgQkNNNTkwWFhfQ1NSVk9VVDEJMHhjMAorI2RlZmluZSBCQ001OTBYWF9MRE9fVlNFTF9NQVNLCUdFTk1BU0soNSwgMykKKyNkZWZpbmUgQkNNNTkwWFhfU1JfVlNFTF9NQVNLCUdFTk1BU0soNSwgMCkKKworLyogTERPIHJlZ3VsYXRvciBJRHMgKi8KKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1JGTERPCTAKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0NBTUxETzEJMQorI2RlZmluZSBCQ001OTBYWF9SRUdfQ0FNTERPMgkyCisjZGVmaW5lIEJDTTU5MFhYX1JFR19TSU1MRE8xCTMKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1NJTUxETzIJNAorI2RlZmluZSBCQ001OTBYWF9SRUdfU0RMRE8JNQorI2RlZmluZSBCQ001OTBYWF9SRUdfU0RYTERPCTYKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX01NQ0xETzEJNworI2RlZmluZSBCQ001OTBYWF9SRUdfTU1DTERPMgk4CisjZGVmaW5lIEJDTTU5MFhYX1JFR19BVURMRE8JOQorI2RlZmluZSBCQ001OTBYWF9SRUdfTUlDTERPCTEwCisjZGVmaW5lIEJDTTU5MFhYX1JFR19VU0JMRE8JMTEKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1ZJQkxETwkxMgorCisvKiBEQ0RDIHJlZ3VsYXRvciBJRHMgKi8KKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0NTUgkxMworI2RlZmluZSBCQ001OTBYWF9SRUdfSU9TUjEJMTQKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX0lPU1IyCTE1CisjZGVmaW5lIEJDTTU5MFhYX1JFR19NU1IJMTYKKyNkZWZpbmUgQkNNNTkwWFhfUkVHX1NEU1IxCTE3CisjZGVmaW5lIEJDTTU5MFhYX1JFR19TRFNSMgkxOAorI2RlZmluZSBCQ001OTBYWF9SRUdfVlNSCTE5CisKKyNkZWZpbmUgQkNNNTkwWFhfTlVNX1JFR1MJMjAKKworI2RlZmluZSBCQ001OTBYWF9SRUdfSVNfTERPKG4pCShuIDwgQkNNNTkwWFhfUkVHX0NTUikKKworc3RydWN0IGJjbTU5MHh4X2JvYXJkIHsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqYmNtNTkweHhfcG11X2luaXRfZGF0YVtCQ001OTBYWF9OVU1fUkVHU107Cit9OworCisvKiBMRE8gZ3JvdXAgQTogc3VwcG9ydGVkIHZvbHRhZ2VzIGluIG1pY3Jvdm9sdHMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGRvX2FfdGFibGVbXSA9IHsKKwkxMjAwMDAwLCAxODAwMDAwLCAyNTAwMDAwLCAyNzAwMDAwLCAyODAwMDAwLAorCTI5MDAwMDAsIDMwMDAwMDAsIDMzMDAwMDAsCit9OworCisvKiBMRE8gZ3JvdXAgQzogc3VwcG9ydGVkIHZvbHRhZ2VzIGluIG1pY3Jvdm9sdHMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGRvX2NfdGFibGVbXSA9IHsKKwkzMTAwMDAwLCAxODAwMDAwLCAyNTAwMDAwLCAyNzAwMDAwLCAyODAwMDAwLAorCTI5MDAwMDAsIDMwMDAwMDAsIDMzMDAwMDAsCit9OworCisvKiBEQ0RDIGdyb3VwIENTUjogc3VwcG9ydGVkIHZvbHRhZ2VzIGluIG1pY3Jvdm9sdHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSBkY2RjX2Nzcl9yYW5nZXNbXSA9IHsKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDg2MDAwMCwgMiwgNTAsIDEwMDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDEzNjAwMDAsIDUxLCA1NSwgMjAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoOTAwMDAwLCA1NiwgNjMsIDApLAorfTsKKworLyogRENEQyBncm91cCBJT1NSMTogc3VwcG9ydGVkIHZvbHRhZ2VzIGluIG1pY3Jvdm9sdHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSBkY2RjX2lvc3IxX3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoODYwMDAwLCAyLCA1MSwgMTAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTUwMDAwMCwgNTIsIDUyLCAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE4MDAwMDAsIDUzLCA1MywgMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg5MDAwMDAsIDU0LCA2MywgMCksCit9OworCisvKiBEQ0RDIGdyb3VwIFNEU1IxOiBzdXBwb3J0ZWQgdm9sdGFnZXMgaW4gbWljcm92b2x0cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGRjZGNfc2RzcjFfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg4NjAwMDAsIDIsIDUwLCAxMDAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxMzQwMDAwLCA1MSwgNTEsIDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoOTAwMDAwLCA1MiwgNjMsIDApLAorfTsKKworc3RydWN0IGJjbTU5MHh4X2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqdmluX25hbWU7CisJdTggbl92b2x0YWdlczsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnZvbHRfdGFibGU7CisJdTggbl9saW5lYXJfcmFuZ2VzOworCWNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlICpsaW5lYXJfcmFuZ2VzOworfTsKKworI2RlZmluZSBCQ001OTBYWF9SRUdfVEFCTEUoX25hbWUsIF90YWJsZSkgXAorCXsgXAorCQkubmFtZSA9ICNfbmFtZSwgXAorCQkubl92b2x0YWdlcyA9IEFSUkFZX1NJWkUoX3RhYmxlKSwgXAorCQkudm9sdF90YWJsZSA9IF90YWJsZSwgXAorCX0KKworI2RlZmluZSBCQ001OTBYWF9SRUdfUkFOR0VTKF9uYW1lLCBfcmFuZ2VzKSBcCisJeyBcCisJCS5uYW1lID0gI19uYW1lLCBcCisJCS5uX2xpbmVhcl9yYW5nZXMgPSBBUlJBWV9TSVpFKF9yYW5nZXMpLCBcCisJCS5saW5lYXJfcmFuZ2VzID0gX3JhbmdlcywgXAorCX0KKworc3RhdGljIHN0cnVjdCBiY201OTB4eF9pbmZvIGJjbTU5MHh4X3JlZ3NbXSA9IHsKKwlCQ001OTBYWF9SRUdfVEFCTEUocmZsZG8sIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUoY2FtbGRvMSwgbGRvX2NfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShjYW1sZG8yLCBsZG9fY190YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKHNpbWxkbzEsIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUoc2ltbGRvMiwgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShzZGxkbywgbGRvX2NfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShzZHhsZG8sIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUobW1jbGRvMSwgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShtbWNsZG8yLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKGF1ZGxkbywgbGRvX2FfdGFibGUpLAorCUJDTTU5MFhYX1JFR19UQUJMRShtaWNsZG8sIGxkb19hX3RhYmxlKSwKKwlCQ001OTBYWF9SRUdfVEFCTEUodXNibGRvLCBsZG9fYV90YWJsZSksCisJQkNNNTkwWFhfUkVHX1RBQkxFKHZpYmxkbywgbGRvX2NfdGFibGUpLAorCUJDTTU5MFhYX1JFR19SQU5HRVMoY3NyLCBkY2RjX2Nzcl9yYW5nZXMpLAorCUJDTTU5MFhYX1JFR19SQU5HRVMoaW9zcjEsIGRjZGNfaW9zcjFfcmFuZ2VzKSwKKwlCQ001OTBYWF9SRUdfUkFOR0VTKGlvc3IyLCBkY2RjX2lvc3IxX3JhbmdlcyksCisJQkNNNTkwWFhfUkVHX1JBTkdFUyhtc3IsIGRjZGNfaW9zcjFfcmFuZ2VzKSwKKwlCQ001OTBYWF9SRUdfUkFOR0VTKHNkc3IxLCBkY2RjX3Nkc3IxX3JhbmdlcyksCisJQkNNNTkwWFhfUkVHX1JBTkdFUyhzZHNyMiwgZGNkY19pb3NyMV9yYW5nZXMpLAorCUJDTTU5MFhYX1JFR19SQU5HRVModnNyLCBkY2RjX2lvc3IxX3JhbmdlcyksCit9OworCitzdHJ1Y3QgYmNtNTkweHhfcmVnIHsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2M7CisJc3RydWN0IGJjbTU5MHh4ICptZmQ7CisJc3RydWN0IGJjbTU5MHh4X2luZm8gKippbmZvOworfTsKKworc3RhdGljIGludCBiY201OTB4eF9nZXRfdnNlbF9yZWdpc3RlcihpbnQgaWQpCit7CisJaWYgKEJDTTU5MFhYX1JFR19JU19MRE8oaWQpKQorCQlyZXR1cm4gQkNNNTkwWFhfUkZMRE9DVFJMICsgaWQ7CisJZWxzZQorCQlyZXR1cm4gQkNNNTkwWFhfQ1NSVk9VVDEgKyAoaWQgLSBCQ001OTBYWF9SRUdfQ1NSKSAqIDM7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTkweHhfZ2V0X2VuYWJsZV9yZWdpc3RlcihpbnQgaWQpCit7CisJaW50IHJlZyA9IDA7CisKKwlpZiAoQkNNNTkwWFhfUkVHX0lTX0xETyhpZCkpCisJCXJlZyA9IEJDTTU5MFhYX1JGTERPUE1DVFJMMSArIGlkICogMjsKKwllbHNlCisJCXN3aXRjaCAoaWQpIHsKKwkJY2FzZSBCQ001OTBYWF9SRUdfQ1NSOgorCQkJcmVnID0gQkNNNTkwWFhfQ1NSUE1DVFJMMTsKKwkJCWJyZWFrOworCQljYXNlIEJDTTU5MFhYX1JFR19JT1NSMToKKwkJCXJlZyA9IEJDTTU5MFhYX0lPU1IxUE1DVFJMMTsKKwkJCWJyZWFrOworCQljYXNlIEJDTTU5MFhYX1JFR19JT1NSMjoKKwkJCXJlZyA9IEJDTTU5MFhYX0lPU1IyUE1DVFJMMTsKKwkJCWJyZWFrOworCQljYXNlIEJDTTU5MFhYX1JFR19NU1I6CisJCQlyZWcgPSBCQ001OTBYWF9NU1JQTUNUUkwxOworCQkJYnJlYWs7CisJCWNhc2UgQkNNNTkwWFhfUkVHX1NEU1IxOgorCQkJcmVnID0gQkNNNTkwWFhfU0RTUjFQTUNUUkwxOworCQkJYnJlYWs7CisJCWNhc2UgQkNNNTkwWFhfUkVHX1NEU1IyOgorCQkJcmVnID0gQkNNNTkwWFhfU0RTUjJQTUNUUkwxOworCQkJYnJlYWs7CisJCX07CisKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgYmNtNTkweHhfb3BzX2xkbyA9IHsKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX3RhYmxlLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfaXRlcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBiY201OTB4eF9vcHNfZGNkYyA9IHsKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhcl9yYW5nZSwKKwkubWFwX3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcl9yYW5nZSwKK307CisKKyNkZWZpbmUgQkNNNTkwWFhfTUFUQ0goX25hbWUsIF9pZCkgXAorCXsgXAorCQkubmFtZSA9ICNfbmFtZSwgXAorCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZiY201OTB4eF9yZWdzW0JDTTU5MFhYX1JFR18jI19pZF0sIFwKKwl9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIGJjbTU5MHh4X21hdGNoZXNbXSA9IHsKKwlCQ001OTBYWF9NQVRDSChyZmxkbywgUkZMRE8pLAorCUJDTTU5MFhYX01BVENIKGNhbWxkbzEsIENBTUxETzEpLAorCUJDTTU5MFhYX01BVENIKGNhbWxkbzIsIENBTUxETzIpLAorCUJDTTU5MFhYX01BVENIKHNpbWxkbzEsIFNJTUxETzEpLAorCUJDTTU5MFhYX01BVENIKHNpbWxkbzIsIFNJTUxETzIpLAorCUJDTTU5MFhYX01BVENIKHNkbGRvLCBTRExETyksCisJQkNNNTkwWFhfTUFUQ0goc2R4bGRvLCBTRFhMRE8pLAorCUJDTTU5MFhYX01BVENIKG1tY2xkbzEsIE1NQ0xETzEpLAorCUJDTTU5MFhYX01BVENIKG1tY2xkbzIsIE1NQ0xETzIpLAorCUJDTTU5MFhYX01BVENIKGF1ZGxkbywgQVVETERPKSwKKwlCQ001OTBYWF9NQVRDSChtaWNsZG8sIE1JQ0xETyksCisJQkNNNTkwWFhfTUFUQ0godXNibGRvLCBVU0JMRE8pLAorCUJDTTU5MFhYX01BVENIKHZpYmxkbywgVklCTERPKSwKKwlCQ001OTBYWF9NQVRDSChjc3IsIENTUiksCisJQkNNNTkwWFhfTUFUQ0goaW9zcjEsIElPU1IxKSwKKwlCQ001OTBYWF9NQVRDSChpb3NyMiwgSU9TUjIpLAorCUJDTTU5MFhYX01BVENIKG1zciwgTVNSKSwKKwlCQ001OTBYWF9NQVRDSChzZHNyMSwgU0RTUjEpLAorCUJDTTU5MFhYX01BVENIKHNkc3IyLCBTRFNSMiksCisJQkNNNTkwWFhfTUFUQ0godnNyLCBWU1IpLAorfTsKKworc3RhdGljIHN0cnVjdCBiY201OTB4eF9ib2FyZCAqYmNtNTkweHhfcGFyc2VfZHRfcmVnX2RhdGEoCisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKipiY201OTB4eF9yZWdfbWF0Y2hlcykKK3sKKwlzdHJ1Y3QgYmNtNTkweHhfYm9hcmQgKmRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpyZWd1bGF0b3JzOworCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKm1hdGNoZXMgPSBiY201OTB4eF9tYXRjaGVzOworCWludCBjb3VudCA9IEFSUkFZX1NJWkUoYmNtNTkweHhfbWF0Y2hlcyk7CisJaW50IGlkeCA9IDA7CisJaW50IHJldDsKKworCWlmICghbnApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAib2Ygbm9kZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVndWxhdG9yIGJvYXJkIGRhdGFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlucCA9IG9mX25vZGVfZ2V0KG5wKTsKKwlyZWd1bGF0b3JzID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CisJaWYgKCFyZWd1bGF0b3JzKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJyZWd1bGF0b3Igbm9kZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSBvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgcmVndWxhdG9ycywgbWF0Y2hlcywgY291bnQpOworCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIHBhcnNpbmcgcmVndWxhdG9yIGluaXQgZGF0YTogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqYmNtNTkweHhfcmVnX21hdGNoZXMgPSBtYXRjaGVzOworCisJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspIHsKKwkJaWYgKCFtYXRjaGVzW2lkeF0uaW5pdF9kYXRhIHx8ICFtYXRjaGVzW2lkeF0ub2Zfbm9kZSkKKwkJCWNvbnRpbnVlOworCisJCWRhdGEtPmJjbTU5MHh4X3BtdV9pbml0X2RhdGFbaWR4XSA9IG1hdGNoZXNbaWR4XS5pbml0X2RhdGE7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTkweHhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmNtNTkweHggKmJjbTU5MHh4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBiY201OTB4eF9ib2FyZCAqcG11X2RhdGEgPSBOVUxMOworCXN0cnVjdCBiY201OTB4eF9yZWcgKnBtdTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CisJc3RydWN0IGJjbTU5MHh4X2luZm8gKmluZm87CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnJlZ19kYXRhOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKmJjbTU5MHh4X3JlZ19tYXRjaGVzID0gTlVMTDsKKwlpbnQgaTsKKworCXBtdV9kYXRhID0gYmNtNTkweHhfcGFyc2VfZHRfcmVnX2RhdGEocGRldiwKKwkJCQkJICAgICAgJmJjbTU5MHh4X3JlZ19tYXRjaGVzKTsKKworCXBtdSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBtdSksIEdGUF9LRVJORUwpOworCWlmICghcG11KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgcG11XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG11LT5tZmQgPSBiY201OTB4eDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBtdSk7CisKKwlwbXUtPmRlc2MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgQkNNNTkwWFhfTlVNX1JFR1MgKgorCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghcG11LT5kZXNjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlscyBmb3IgZGVzY1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBtdS0+aW5mbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBCQ001OTBYWF9OVU1fUkVHUyAqCisJCQlzaXplb2Yoc3RydWN0IGJjbTU5MHh4X2luZm8gKiksIEdGUF9LRVJORUwpOworCWlmICghcG11LT5pbmZvKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlscyBmb3IgaW5mb1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWluZm8gPSBiY201OTB4eF9yZWdzOworCisJZm9yIChpID0gMDsgaSA8IEJDTTU5MFhYX05VTV9SRUdTOyBpKyssIGluZm8rKykgeworCQlpZiAocG11X2RhdGEpCisJCQlyZWdfZGF0YSA9IHBtdV9kYXRhLT5iY201OTB4eF9wbXVfaW5pdF9kYXRhW2ldOworCQllbHNlCisJCQlyZWdfZGF0YSA9IE5VTEw7CisKKwkJLyogUmVnaXN0ZXIgdGhlIHJlZ3VsYXRvcnMgKi8KKwkJcG11LT5pbmZvW2ldID0gaW5mbzsKKworCQlwbXUtPmRlc2NbaV0ubmFtZSA9IGluZm8tPm5hbWU7CisJCXBtdS0+ZGVzY1tpXS5zdXBwbHlfbmFtZSA9IGluZm8tPnZpbl9uYW1lOworCQlwbXUtPmRlc2NbaV0uaWQgPSBpOworCQlwbXUtPmRlc2NbaV0udm9sdF90YWJsZSA9IGluZm8tPnZvbHRfdGFibGU7CisJCXBtdS0+ZGVzY1tpXS5uX3ZvbHRhZ2VzID0gaW5mby0+bl92b2x0YWdlczsKKwkJcG11LT5kZXNjW2ldLmxpbmVhcl9yYW5nZXMgPSBpbmZvLT5saW5lYXJfcmFuZ2VzOworCQlwbXUtPmRlc2NbaV0ubl9saW5lYXJfcmFuZ2VzID0gaW5mby0+bl9saW5lYXJfcmFuZ2VzOworCisJCWlmIChCQ001OTBYWF9SRUdfSVNfTERPKGkpKSB7CisJCQlwbXUtPmRlc2NbaV0ub3BzID0gJmJjbTU5MHh4X29wc19sZG87CisJCQlwbXUtPmRlc2NbaV0udnNlbF9tYXNrID0gQkNNNTkwWFhfTERPX1ZTRUxfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCXBtdS0+ZGVzY1tpXS5vcHMgPSAmYmNtNTkweHhfb3BzX2RjZGM7CisJCQlwbXUtPmRlc2NbaV0udnNlbF9tYXNrID0gQkNNNTkwWFhfU1JfVlNFTF9NQVNLOworCQl9CisKKwkJcG11LT5kZXNjW2ldLnZzZWxfcmVnID0gYmNtNTkweHhfZ2V0X3ZzZWxfcmVnaXN0ZXIoaSk7CisJCXBtdS0+ZGVzY1tpXS5lbmFibGVfaXNfaW52ZXJ0ZWQgPSB0cnVlOworCQlwbXUtPmRlc2NbaV0uZW5hYmxlX21hc2sgPSBCQ001OTBYWF9SRUdfRU5BQkxFOworCQlwbXUtPmRlc2NbaV0uZW5hYmxlX3JlZyA9IGJjbTU5MHh4X2dldF9lbmFibGVfcmVnaXN0ZXIoaSk7CisJCXBtdS0+ZGVzY1tpXS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0U7CisJCXBtdS0+ZGVzY1tpXS5vd25lciA9IFRISVNfTU9EVUxFOworCisJCWNvbmZpZy5kZXYgPSBiY201OTB4eC0+ZGV2OworCQljb25maWcuaW5pdF9kYXRhID0gcmVnX2RhdGE7CisJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHBtdTsKKwkJY29uZmlnLnJlZ21hcCA9IGJjbTU5MHh4LT5yZWdtYXA7CisKKwkJaWYgKGJjbTU5MHh4X3JlZ19tYXRjaGVzKQorCQkJY29uZmlnLm9mX25vZGUgPSBiY201OTB4eF9yZWdfbWF0Y2hlc1tpXS5vZl9ub2RlOworCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcG11LT5kZXNjW2ldLAorCQkJCQkgICAgICAgJmNvbmZpZyk7CisJCWlmIChJU19FUlIocmRldikpIHsKKwkJCWRldl9lcnIoYmNtNTkweHgtPmRldiwKKwkJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHJlZ3VsYXRvclxuIiwKKwkJCQlwZGV2LT5uYW1lKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbTU5MHh4X3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmNtNTkweHgtdnJlZ3MiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGJjbTU5MHh4X3Byb2JlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYmNtNTkweHhfcmVndWxhdG9yX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hdHQgUG9ydGVyIDxtcG9ydGVyQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJDTTU5MHh4IHZvbHRhZ2UgcmVndWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiY201OTB4eC12cmVncyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCmluZGV4IGFmY2ExYmMuLmJhYzQ4NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKQEAgLTIzOTksNiArMjM5OSw3IEBACiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSByZWd1bGF0b3ItPnJkZXY7CiAJaW50IHJldCA9IDA7CiAJaW50IG9sZF9taW5fdVYsIG9sZF9tYXhfdVY7CisJaW50IGN1cnJlbnRfdVY7CiAKIAltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CiAKQEAgLTI0MDksNiArMjQxMCwxOSBAQAogCWlmIChyZWd1bGF0b3ItPm1pbl91ViA9PSBtaW5fdVYgJiYgcmVndWxhdG9yLT5tYXhfdVYgPT0gbWF4X3VWKQogCQlnb3RvIG91dDsKIAorCS8qIElmIHdlJ3JlIHRyeWluZyB0byBzZXQgYSByYW5nZSB0aGF0IG92ZXJsYXBzIHRoZSBjdXJyZW50IHZvbHRhZ2UsCisJICogcmV0dXJuIHN1Y2Nlc2Z1bGx5IGV2ZW4gdGhvdWdoIHRoZSByZWd1bGF0b3IgZG9lcyBub3Qgc3VwcG9ydAorCSAqIGNoYW5naW5nIHRoZSB2b2x0YWdlLgorCSAqLworCWlmICghKHJkZXYtPmNvbnN0cmFpbnRzLT52YWxpZF9vcHNfbWFzayAmIFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSkpIHsKKwkJY3VycmVudF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldik7CisJCWlmIChtaW5fdVYgPD0gY3VycmVudF91ViAmJiBjdXJyZW50X3VWIDw9IG1heF91VikgeworCQkJcmVndWxhdG9yLT5taW5fdVYgPSBtaW5fdVY7CisJCQlyZWd1bGF0b3ItPm1heF91ViA9IG1heF91VjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKCFyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlICYmCiAJICAgICFyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlX3NlbCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDUyLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDUyLXJlZ3VsYXRvci5jCmluZGV4IDNhZGVhZWYuLmZkYjZlYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1Mi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTItcmVndWxhdG9yLmMKQEAgLTI0MCw2ICsyNDAsMzEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGRhOTA1Ml9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJCQkgdW5zaWduZWQgaW50IG9sZF9zZWwsCisJCQkJCQkgdW5zaWduZWQgaW50IG5ld19zZWwpCit7CisJc3RydWN0IGRhOTA1Ml9yZWd1bGF0b3IgKnJlZ3VsYXRvciA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGRhOTA1Ml9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJlZ3VsYXRvci0+aW5mbzsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFRoZSBEVkMgY29udHJvbGxlZCBMRE9zIGFuZCBEQ0RDcyByYW1wIHdpdGggNi4yNW1WL8K1cyBhZnRlciBlbmFibGluZworCSAqIHRoZSBhY3RpdmF0ZSBiaXQuCisJICovCisJc3dpdGNoIChpZCkgeworCWNhc2UgREE5MDUyX0lEX0JVQ0sxOgorCWNhc2UgREE5MDUyX0lEX0JVQ0syOgorCWNhc2UgREE5MDUyX0lEX0JVQ0szOgorCWNhc2UgREE5MDUyX0lEX0xETzI6CisJY2FzZSBEQTkwNTJfSURfTERPMzoKKwkJcmV0ID0gKG5ld19zZWwgLSBvbGRfc2VsKSAqIGluZm8tPnN0ZXBfdVYgLyA2MjUwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgZGE5MDUyX2RjZGNfb3BzID0gewogCS5nZXRfY3VycmVudF9saW1pdCA9IGRhOTA1Ml9kY2RjX2dldF9jdXJyZW50X2xpbWl0LAogCS5zZXRfY3VycmVudF9saW1pdCA9IGRhOTA1Ml9kY2RjX3NldF9jdXJyZW50X2xpbWl0LApAQCAtMjQ4LDYgKzI3Myw3IEBACiAJLm1hcF92b2x0YWdlID0gZGE5MDUyX21hcF92b2x0YWdlLAogCS5nZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIAkuc2V0X3ZvbHRhZ2Vfc2VsID0gZGE5MDUyX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWwsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsID0gZGE5MDUyX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbCwKIAkuaXNfZW5hYmxlZCA9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKIAkuZW5hYmxlID0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCiAJLmRpc2FibGUgPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCkBAIC0yNTgsNiArMjg0LDcgQEAKIAkubWFwX3ZvbHRhZ2UgPSBkYTkwNTJfbWFwX3ZvbHRhZ2UsCiAJLmdldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAogCS5zZXRfdm9sdGFnZV9zZWwgPSBkYTkwNTJfcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbCwKKwkuc2V0X3ZvbHRhZ2VfdGltZV9zZWwgPSBkYTkwNTJfcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsLAogCS5pc19lbmFibGVkID0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAogCS5lbmFibGUgPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKIAkuZGlzYWJsZSA9IHJlZ3VsYXRvcl9kaXNhYmxlX3JlZ21hcCwKQEAgLTQwMSw3ICs0MjgsNyBAQAogCQlpZiAoIW5wcm9vdCkKIAkJCXJldHVybiAtRU5PREVWOwogCi0JCW5wcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wcm9vdCwgInJlZ3VsYXRvcnMiKTsKKwkJbnByb290ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnByb290LCAicmVndWxhdG9ycyIpOwogCQlpZiAoIW5wcm9vdCkKIAkJCXJldHVybiAtRU5PREVWOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTUtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNTUtcmVndWxhdG9yLmMKaW5kZXggYjE0ZWJkYS4uOTUxNjMxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDU1LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA1NS1yZWd1bGF0b3IuYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgogCiAjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA1NS9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA1NS9yZWcuaD4KQEAgLTQ0Niw2ICs0NDgsOSBAQAogCXN0cnVjdCBkYTkwNTVfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZWd1bGF0b3ItPmluZm87CiAJaW50IHJldCA9IDA7CiAKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gMDsKKwogCWlmIChwZGF0YS0+Z3Bpb19yZW4gJiYgcGRhdGEtPmdwaW9fcmVuW2lkXSkgewogCQljaGFyIG5hbWVbMThdOwogCQlpbnQgZ3Bpb19tdXggPSBwZGF0YS0+Z3Bpb19yZW5baWRdOwpAQCAtNTMwLDYgKzUzNSw1OSBAQAogCXJldHVybiBOVUxMOwogfQogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCBkYTkwNTVfcmVnX21hdGNoZXNbXSA9IHsKKwl7IC5uYW1lID0gIkJVQ0sxIiwgfSwKKwl7IC5uYW1lID0gIkJVQ0syIiwgfSwKKwl7IC5uYW1lID0gIkxETzEiLCB9LAorCXsgLm5hbWUgPSAiTERPMiIsIH0sCisJeyAubmFtZSA9ICJMRE8zIiwgfSwKKwl7IC5uYW1lID0gIkxETzQiLCB9LAorCXsgLm5hbWUgPSAiTERPNSIsIH0sCisJeyAubmFtZSA9ICJMRE82IiwgfSwKK307CisKK3N0YXRpYyBpbnQgZGE5MDU1X3JlZ3VsYXRvcl9kdF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgIHN0cnVjdCBkYTkwNTVfcmVndWxhdG9yICpyZWd1bGF0b3IsCisJCQkJICAgIHN0cnVjdCByZWd1bGF0b3JfY29uZmlnICpjb25maWcsCisJCQkJICAgIGludCByZWdpZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wcm9vdCwgKm5wOworCWludCByZXQ7CisKKwlucHJvb3QgPSBvZl9ub2RlX2dldChwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKTsKKwlpZiAoIW5wcm9vdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wcm9vdCwgInJlZ3VsYXRvcnMiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaCgmcGRldi0+ZGV2LCBucCwgJmRhOTA1NV9yZWdfbWF0Y2hlc1tyZWdpZF0sIDEpOworCW9mX25vZGVfcHV0KG5wcm9vdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgbWF0Y2hpbmcgcmVndWxhdG9yOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljb25maWctPmluaXRfZGF0YSA9IGRhOTA1NV9yZWdfbWF0Y2hlc1tyZWdpZF0uaW5pdF9kYXRhOworCWNvbmZpZy0+b2Zfbm9kZSA9IGRhOTA1NV9yZWdfbWF0Y2hlc1tyZWdpZF0ub2Zfbm9kZTsKKworCWlmICghY29uZmlnLT5vZl9ub2RlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGRhOTA1NV9yZWd1bGF0b3JfZHRfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGE5MDU1X3JlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCSAgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgICBpbnQgcmVnaWQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYgLyogQ09ORklHX09GICovCisKIHN0YXRpYyBpbnQgZGE5MDU1X3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKQEAgLTUzOCw5ICs1OTYsNiBAQAogCXN0cnVjdCBkYTkwNTVfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkYTkwNTUtPmRldik7CiAJaW50IHJldCwgaXJxOwogCi0JaWYgKHBkYXRhID09IE5VTEwgfHwgcGRhdGEtPnJlZ3VsYXRvcnNbcGRldi0+aWRdID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCiAJcmVndWxhdG9yID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZGE5MDU1X3JlZ3VsYXRvciksCiAJCQkJIEdGUF9LRVJORUwpOwogCWlmICghcmVndWxhdG9yKQpAQCAtNTU3LDggKzYxMiwxNCBAQAogCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHJlZ3VsYXRvcjsKIAljb25maWcucmVnbWFwID0gZGE5MDU1LT5yZWdtYXA7CiAKLQlpZiAocGRhdGEgJiYgcGRhdGEtPnJlZ3VsYXRvcnMpCisJaWYgKHBkYXRhICYmIHBkYXRhLT5yZWd1bGF0b3JzKSB7CiAJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1twZGV2LT5pZF07CisJfSBlbHNlIHsKKwkJcmV0ID0gZGE5MDU1X3JlZ3VsYXRvcl9kdF9pbml0KHBkZXYsIHJlZ3VsYXRvciwgJmNvbmZpZywKKwkJCQkJICAgICAgIHBkZXYtPmlkKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXJldCA9IGRhOTA1NV9ncGlvX2luaXQocmVndWxhdG9yLCAmY29uZmlnLCBwZGF0YSwgcGRldi0+aWQpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDYzLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDYzLXJlZ3VsYXRvci5jCmluZGV4IDkxZTk5YTIuLjdjOTQ2MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTA2My1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwNjMtcmVndWxhdG9yLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogCiAJc2VsID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcihyZGV2LCB1ViwgdVYpOwogCWlmIChzZWwgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHNlbDsKIAogCXNlbCA8PD0gZmZzKHJkZXYtPmRlc2MtPnZzZWxfbWFzaykgLSAxOwogCkBAIC02NjYsNyArNjY2LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAJaW50IGksIG4sIG51bTsKIAotCW5vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCW5vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghbm9kZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSZWd1bGF0b3JzIGRldmljZSBub2RlIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwpAQCAtNjc0LDYgKzY3NCw3IEBACiAKIAludW0gPSBvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgbm9kZSwgZGE5MDYzX21hdGNoZXMsCiAJCQkJIEFSUkFZX1NJWkUoZGE5MDYzX21hdGNoZXMpKTsKKwlvZl9ub2RlX3B1dChub2RlKTsKIAlpZiAobnVtIDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gbWF0Y2ggcmVndWxhdG9yc1xuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtNzEwLDcgKzcxMSw3IEBACiAJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKipkYTkwNjNfcmVnX21hdGNoZXMpCiB7Ci0JZGE5MDYzX3JlZ19tYXRjaGVzID0gTlVMTDsKKwkqZGE5MDYzX3JlZ19tYXRjaGVzID0gTlVMTDsKIAlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIH0KICNlbmRpZgpAQCAtNzU2LDcgKzc1Nyw3IEBACiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIkVycm9yIHdoaWxlIHJlYWRpbmcgQlVDS3MgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAliY29yZXNfbWVyZ2VkID0gdmFsICYgREE5MDYzX0JDT1JFX01FUkdFOwogCWJtZW1fYmlvX21lcmdlZCA9IHZhbCAmIERBOTA2M19CVUNLX01FUkdFOwpAQCAtNzc1LDEwICs3NzYsOCBAQAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGRhOTA2M19yZWd1bGF0b3JzKSArCiAJCW5fcmVndWxhdG9ycyAqIHNpemVvZihzdHJ1Y3QgZGE5MDYzX3JlZ3VsYXRvcik7CiAJcmVndWxhdG9ycyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlZ3VsYXRvcnMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gbWVtb3J5IGZvciByZWd1bGF0b3JzXG4iKTsKKwlpZiAoIXJlZ3VsYXRvcnMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJlZ3VsYXRvcnMtPm5fcmVndWxhdG9ycyA9IG5fcmVndWxhdG9yczsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByZWd1bGF0b3JzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTIxMC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTIxMC1yZWd1bGF0b3IuYwppbmRleCA2ZjVlY2JlLi43YTMyMGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkyMTAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MjEwLXJlZ3VsYXRvci5jCkBAIC0xMzQsMTEgKzEzNCw4IEBACiAJaW50IGVycm9yOwogCiAJY2hpcCA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZihzdHJ1Y3QgZGE5MjEwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gY2hpcCkgewotCQlkZXZfZXJyKCZpMmMtPmRldiwKLQkJCSJDYW5ub3Qga3phbGxvYyBtZW1vcnkgZm9yIHJlZ3VsYXRvciBzdHJ1Y3R1cmVcbiIpOworCWlmICghY2hpcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJY2hpcC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmZGE5MjEwX3JlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIoY2hpcC0+cmVnbWFwKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYwppbmRleCA4NDZhY2YyLi42MTdjMWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYwpAQCAtMjYzLDYgKzI2Myw4IEBACiAJCQkub3BzCT0gJmRiODUwMF9yZWd1bGF0b3Jfb3BzLAogCQkJLnR5cGUJPSBSRUdVTEFUT1JfVk9MVEFHRSwKIAkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmZpeGVkX3VWID0gMTgwMDAwMCwKKwkJCS5uX3ZvbHRhZ2VzID0gMSwKIAkJfSwKIAkJLmV4Y2x1ZGVfZnJvbV9wb3dlcl9zdGF0ZSA9IHRydWUsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKaW5kZXggY2U4OWY3OC4uMmQxNmI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKQEAgLTc4LDYgKzc4LDcgQEAKIHZvaWQgdXg1MDBfcmVndWxhdG9yX3N1c3BlbmRfZGVidWcodm9pZCkKIHsKIAlpbnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCByZGVidWcubnVtX3JlZ3VsYXRvcnM7IGkrKykKIAkJcmRlYnVnLnN0YXRlX2JlZm9yZV9zdXNwZW5kW2ldID0KIAkJCXJkZWJ1Zy5yZWd1bGF0b3JfYXJyYXlbaV0uaXNfZW5hYmxlZDsKQEAgLTg2LDYgKzg3LDcgQEAKIHZvaWQgdXg1MDBfcmVndWxhdG9yX3Jlc3VtZV9kZWJ1Zyh2b2lkKQogewogCWludCBpOworCiAJZm9yIChpID0gMDsgaSA8IHJkZWJ1Zy5udW1fcmVndWxhdG9yczsgaSsrKQogCQlyZGVidWcuc3RhdGVfYWZ0ZXJfc3VzcGVuZFtpXSA9CiAJCQlyZGVidWcucmVndWxhdG9yX2FycmF5W2ldLmlzX2VuYWJsZWQ7CkBAIC0xMjcsOSArMTI5LDkgQEAKIAlpbnQgaTsKIAogCS8qIHByaW50IGR1bXAgaGVhZGVyICovCi0JZXJyID0gc2VxX3ByaW50ZihzLCAidXg1MDAtcmVndWxhdG9yIHN0YXR1czpcbiIpOworCWVyciA9IHNlcV9wdXRzKHMsICJ1eDUwMC1yZWd1bGF0b3Igc3RhdHVzOlxuIik7CiAJaWYgKGVyciA8IDApCi0JCWRldl9lcnIoZGV2LCAic2VxX3ByaW50ZiBvdmVyZmxvd1xuIik7CisJCWRldl9lcnIoZGV2LCAic2VxX3B1dHMgb3ZlcmZsb3dcbiIpOwogCiAJZXJyID0gc2VxX3ByaW50ZihzLCAiJTMxcyA6ICU4cyA6ICU4c1xuIiwgImN1cnJlbnQiLAogCQkiYmVmb3JlIiwgImFmdGVyIik7CkBAIC0yMDIsMTggKzIwNCwxMiBAQAogCXJkZWJ1Zy5udW1fcmVndWxhdG9ycyA9IG51bV9yZWd1bGF0b3JzOwogCiAJcmRlYnVnLnN0YXRlX2JlZm9yZV9zdXNwZW5kID0ga3phbGxvYyhudW1fcmVndWxhdG9ycywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZGVidWcuc3RhdGVfYmVmb3JlX3N1c3BlbmQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNhdmluZyBzdGF0ZVxuIik7CisJaWYgKCFyZGVidWcuc3RhdGVfYmVmb3JlX3N1c3BlbmQpCiAJCWdvdG8gZXhpdF9kZXN0cm95X3Bvd2VyX3N0YXRlOwotCX0KIAogCXJkZWJ1Zy5zdGF0ZV9hZnRlcl9zdXNwZW5kID0ga3phbGxvYyhudW1fcmVndWxhdG9ycywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZGVidWcuc3RhdGVfYWZ0ZXJfc3VzcGVuZCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc2F2aW5nIHN0YXRlXG4iKTsKKwlpZiAoIXJkZWJ1Zy5zdGF0ZV9hZnRlcl9zdXNwZW5kKQogCQlnb3RvIGV4aXRfZnJlZTsKLQl9CiAKIAlkYng1MDBfcmVndWxhdG9yX3Rlc3RjYXNlKHJlZ3VsYXRvcl9pbmZvLCBudW1fcmVndWxhdG9ycyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYwppbmRleCBkZjlmNDI1Li4yNDM2ZGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKQEAgLTI1LDcgKzI1LDExIEBACiAKIHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkdW1teV9yZWd1bGF0b3JfcmRldjsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGR1bW15X2luaXRkYXRhOworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGR1bW15X2luaXRkYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLmFsd2F5c19vbiA9IDEsCisJfSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBkdW1teV9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2ZhbjUzNTU1LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9mYW41MzU1NS5jCmluZGV4IDdjYTNkOWUuLjcxNGZkOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2ZhbjUzNTU1LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZmFuNTM1NTUuYwpAQCAtOTAsMTEgKzkwLDExIEBACiAJCXJldHVybiAwOwogCXJldCA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXIocmRldiwgdVYsIHVWKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRpLT5yZWdtYXAsIGRpLT5zbGVlcF9yZWcsCiAJCQkJCVZTRUxfTlNFTF9NQVNLLCByZXQpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAkvKiBDYWNoZSB0aGUgc2xlZXAgdm9sdGFnZSBzZXR0aW5nLgogCSAqIE1pZ2h0IG5vdCBiZSB0aGUgcmVhbCB2b2x0YWdlIHdoaWNoIGlzIHJvdW5kZWQgKi8KIAlkaS0+c2xlZXBfdm9sX2NhY2hlID0gdVY7CkBAIC0yNDQsMTAgKzI0NCw5IEBACiAKIAlkaSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgZmFuNTM1NTVfZGV2aWNlX2luZm8pLAogCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWRpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZSBpbmZvIGRhdGEhXG4iKTsKKwlpZiAoIWRpKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlkaS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmZmFuNTM1NTVfcmVnbWFwX2NvbmZpZyk7CiAJaWYgKElTX0VSUihkaS0+cmVnbWFwKSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdtYXAhXG4iKTsKQEAgLTI2MCwxNCArMjU5LDE0IEBACiAJcmV0ID0gcmVnbWFwX3JlYWQoZGktPnJlZ21hcCwgRkFONTM1NTVfSUQxLCAmdmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBnZXQgY2hpcCBJRCFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIHJldDsKIAl9CiAJZGktPmNoaXBfaWQgPSB2YWwgJiBESUVfSUQ7CiAJLyogR2V0IGNoaXAgcmV2aXNpb24gKi8KIAlyZXQgPSByZWdtYXBfcmVhZChkaS0+cmVnbWFwLCBGQU41MzU1NV9JRDIsICZ2YWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjaGlwIFJldiFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIHJldDsKIAl9CiAJZGktPmNoaXBfcmV2ID0gdmFsICYgRElFX1JFVjsKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJGQU41MzU1NSBPcHRpb25bJWRdIFJldlslZF0gRGV0ZWN0ZWQhXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZml4ZWQuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMKaW5kZXggNWVhNjRiOS4uYzYxZjdlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZml4ZWQuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9maXhlZC5jCkBAIC0xMzAsMTcgKzEzMCwxNSBAQAogCiAJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGZpeGVkX3ZvbHRhZ2VfZGF0YSksCiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRydmRhdGEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIGRhdGFcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9CisJaWYgKCFkcnZkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCWRydmRhdGEtPmRlc2MubmFtZSA9IGtzdHJkdXAoY29uZmlnLT5zdXBwbHlfbmFtZSwgR0ZQX0tFUk5FTCk7CisJZHJ2ZGF0YS0+ZGVzYy5uYW1lID0gZGV2bV9rc3RyZHVwKCZwZGV2LT5kZXYsCisJCQkJCSAgY29uZmlnLT5zdXBwbHlfbmFtZSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoZHJ2ZGF0YS0+ZGVzYy5uYW1lID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN1cHBseSBuYW1lXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAlkcnZkYXRhLT5kZXNjLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRTsKIAlkcnZkYXRhLT5kZXNjLm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC0xNDksMTMgKzE0NywxMyBAQAogCWRydmRhdGEtPmRlc2MuZW5hYmxlX3RpbWUgPSBjb25maWctPnN0YXJ0dXBfZGVsYXk7CiAKIAlpZiAoY29uZmlnLT5pbnB1dF9zdXBwbHkpIHsKLQkJZHJ2ZGF0YS0+ZGVzYy5zdXBwbHlfbmFtZSA9IGtzdHJkdXAoY29uZmlnLT5pbnB1dF9zdXBwbHksCi0JCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWRydmRhdGEtPmRlc2Muc3VwcGx5X25hbWUgPSBkZXZtX2tzdHJkdXAoJnBkZXYtPmRldiwKKwkJCQkJICAgIGNvbmZpZy0+aW5wdXRfc3VwcGx5LAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghZHJ2ZGF0YS0+ZGVzYy5zdXBwbHlfbmFtZSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgaW5wdXQgc3VwcGx5XG4iKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9uYW1lOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9CiAKQEAgLTE4NiwxMSArMTg0LDEyIEBACiAJY2ZnLmRyaXZlcl9kYXRhID0gZHJ2ZGF0YTsKIAljZmcub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCi0JZHJ2ZGF0YS0+ZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZkcnZkYXRhLT5kZXNjLCAmY2ZnKTsKKwlkcnZkYXRhLT5kZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZHJ2ZGF0YS0+ZGVzYywKKwkJCQkJICAgICAgICZjZmcpOwogCWlmIChJU19FUlIoZHJ2ZGF0YS0+ZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmRldik7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3I6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9pbnB1dDsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkcnZkYXRhKTsKQEAgLTE5OSwyNCArMTk4LDYgQEAKIAkJZHJ2ZGF0YS0+ZGVzYy5maXhlZF91Vik7CiAKIAlyZXR1cm4gMDsKLQotZXJyX2lucHV0OgotCWtmcmVlKGRydmRhdGEtPmRlc2Muc3VwcGx5X25hbWUpOwotZXJyX25hbWU6Ci0Ja2ZyZWUoZHJ2ZGF0YS0+ZGVzYy5uYW1lKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJlZ19maXhlZF92b2x0YWdlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBmaXhlZF92b2x0YWdlX2RhdGEgKmRydmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKGRydmRhdGEtPmRldik7Ci0Ja2ZyZWUoZHJ2ZGF0YS0+ZGVzYy5zdXBwbHlfbmFtZSk7Ci0Ja2ZyZWUoZHJ2ZGF0YS0+ZGVzYy5uYW1lKTsKLQotCXJldHVybiAwOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfT0YpCkBAIC0yMjksNyArMjEwLDYgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmVndWxhdG9yX2ZpeGVkX3ZvbHRhZ2VfZHJpdmVyID0gewogCS5wcm9iZQkJPSByZWdfZml4ZWRfdm9sdGFnZV9wcm9iZSwKLQkucmVtb3ZlCQk9IHJlZ19maXhlZF92b2x0YWdlX3JlbW92ZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmMKaW5kZXggYzBhMWQwMC4uOTg5YjIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5jCkBAIC0xMzYsNyArMTM2LDYgQEAKIG9mX2dldF9ncGlvX3JlZ3VsYXRvcl9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9jb25maWcgKmNvbmZpZzsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJY29uc3QgY2hhciAqcmVndHlwZTsKIAlpbnQgcHJvcGxlbiwgZ3BpbywgaTsKIAlpbnQgcmV0OwpAQCAtMTcyLDIyICsxNzEsMzUgQEAKIAlpZiAoIWNvbmZpZy0+Z3Bpb3MpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCisJcHJvcGxlbiA9IG9mX3Byb3BlcnR5X2NvdW50X3UzMl9lbGVtcyhucCwgImdwaW9zLXN0YXRlcyIpOworCS8qIG9wdGlvbmFsIHByb3BlcnR5ICovCisJaWYgKHByb3BsZW4gPCAwKQorCQlwcm9wbGVuID0gMDsKKworCWlmIChwcm9wbGVuID4gMCAmJiBwcm9wbGVuICE9IGNvbmZpZy0+bnJfZ3Bpb3MpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZ3Bpb3MgPC0+IGdwaW9zLXN0YXRlcyBtaXNtYXRjaFxuIik7CisJCXByb3BsZW4gPSAwOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPm5yX2dwaW9zOyBpKyspIHsKIAkJZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAiZ3Bpb3MiLCBpKTsKIAkJaWYgKGdwaW8gPCAwKQogCQkJYnJlYWs7CiAJCWNvbmZpZy0+Z3Bpb3NbaV0uZ3BpbyA9IGdwaW87CisJCWlmIChwcm9wbGVuID4gMCkgeworCQkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJncGlvcy1zdGF0ZXMiLCBpLCAmcmV0KTsKKwkJCWlmIChyZXQpCisJCQkJY29uZmlnLT5ncGlvc1tpXS5mbGFncyA9IEdQSU9GX09VVF9JTklUX0hJR0g7CisJCX0KIAl9CiAKIAkvKiBGZXRjaCBzdGF0ZXMuICovCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJzdGF0ZXMiLCBOVUxMKTsKLQlpZiAoIXByb3ApIHsKKwlwcm9wbGVuID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKG5wLCAic3RhdGVzIik7CisJaWYgKHByb3BsZW4gPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiTm8gJ3N0YXRlcycgcHJvcGVydHkgZm91bmRcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQlwcm9wbGVuID0gcHJvcC0+bGVuZ3RoIC8gc2l6ZW9mKGludCk7Ci0KIAljb25maWctPnN0YXRlcyA9IGRldm1fa3phbGxvYyhkZXYsCiAJCQkJc2l6ZW9mKHN0cnVjdCBncGlvX3JlZ3VsYXRvcl9zdGF0ZSkKIAkJCQkqIChwcm9wbGVuIC8gMiksCkBAIC0xOTYsMTAgKzIwOCwxMCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWZvciAoaSA9IDA7IGkgPCBwcm9wbGVuIC8gMjsgaSsrKSB7Ci0JCWNvbmZpZy0+c3RhdGVzW2ldLnZhbHVlID0KLQkJCWJlMzJfdG9fY3B1cCgoaW50ICopcHJvcC0+dmFsdWUgKyAoaSAqIDIpKTsKLQkJY29uZmlnLT5zdGF0ZXNbaV0uZ3Bpb3MgPQotCQkJYmUzMl90b19jcHVwKChpbnQgKilwcm9wLT52YWx1ZSArIChpICogMiArIDEpKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJzdGF0ZXMiLCBpICogMiwKKwkJCQkJICAgJmNvbmZpZy0+c3RhdGVzW2ldLnZhbHVlKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJzdGF0ZXMiLCBpICogMiArIDEsCisJCQkJCSAgICZjb25maWctPnN0YXRlc1tpXS5ncGlvcyk7CiAJfQogCWNvbmZpZy0+bnJfc3RhdGVzID0gaTsKIApAQCAtMjM5LDEwICsyNTEsOCBAQAogCiAJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEpLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChkcnZkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZSBkYXRhXG4iKTsKKwlpZiAoZHJ2ZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkcnZkYXRhLT5kZXNjLm5hbWUgPSBrc3RyZHVwKGNvbmZpZy0+c3VwcGx5X25hbWUsIEdGUF9LRVJORUwpOwogCWlmIChkcnZkYXRhLT5kZXNjLm5hbWUgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvaGVscGVycy5jIGIvZHJpdmVycy9yZWd1bGF0b3IvaGVscGVycy5jCmluZGV4IGUyMjFhMjcuLmNiYzM5MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2hlbHBlcnMuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9oZWxwZXJzLmMKQEAgLTM3LDEwICszNywxNyBAQAogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfaXNfaW52ZXJ0ZWQpCi0JCXJldHVybiAodmFsICYgcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2spID09IDA7Ci0JZWxzZQotCQlyZXR1cm4gKHZhbCAmIHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrKSAhPSAwOworCXZhbCAmPSByZGV2LT5kZXNjLT5lbmFibGVfbWFzazsKKworCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfaXNfaW52ZXJ0ZWQpIHsKKwkJaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV92YWwpCisJCQlyZXR1cm4gdmFsICE9IHJkZXYtPmRlc2MtPmVuYWJsZV92YWw7CisJCXJldHVybiB2YWwgPT0gMDsKKwl9IGVsc2UgeworCQlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX3ZhbCkKKwkJCXJldHVybiB2YWwgPT0gcmRldi0+ZGVzYy0+ZW5hYmxlX3ZhbDsKKwkJcmV0dXJuIHZhbCAhPSAwOworCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCk7CiAKQEAgLTU3LDEwICs2NCwxMyBAQAogewogCXVuc2lnbmVkIGludCB2YWw7CiAKLQlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX2lzX2ludmVydGVkKQotCQl2YWwgPSAwOwotCWVsc2UKLQkJdmFsID0gcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2s7CisJaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV9pc19pbnZlcnRlZCkgeworCQl2YWwgPSByZGV2LT5kZXNjLT5kaXNhYmxlX3ZhbDsKKwl9IGVsc2UgeworCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfdmFsOworCQlpZiAoIXZhbCkKKwkJCXZhbCA9IHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrOworCX0KIAogCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZGV2LT5kZXNjLT5lbmFibGVfcmVnLAogCQkJCSAgcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2ssIHZhbCk7CkBAIC04MCwxMCArOTAsMTMgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCi0JaWYgKHJkZXYtPmRlc2MtPmVuYWJsZV9pc19pbnZlcnRlZCkKLQkJdmFsID0gcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2s7Ci0JZWxzZQotCQl2YWwgPSAwOworCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfaXNfaW52ZXJ0ZWQpIHsKKwkJdmFsID0gcmRldi0+ZGVzYy0+ZW5hYmxlX3ZhbDsKKwkJaWYgKCF2YWwpCisJCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfbWFzazsKKwl9IGVsc2UgeworCQl2YWwgPSByZGV2LT5kZXNjLT5kaXNhYmxlX3ZhbDsKKwl9CiAKIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+ZW5hYmxlX3JlZywKIAkJCQkgIHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrLCB2YWwpOwpAQCAtNDE5LDEwICs0MzIsMTMgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCi0JaWYgKGVuYWJsZSkKLQkJdmFsID0gcmRldi0+ZGVzYy0+YnlwYXNzX21hc2s7Ci0JZWxzZQotCQl2YWwgPSAwOworCWlmIChlbmFibGUpIHsKKwkJdmFsID0gcmRldi0+ZGVzYy0+YnlwYXNzX3ZhbF9vbjsKKwkJaWYgKCF2YWwpCisJCQl2YWwgPSByZGV2LT5kZXNjLT5ieXBhc3NfbWFzazsKKwl9IGVsc2UgeworCQl2YWwgPSByZGV2LT5kZXNjLT5ieXBhc3NfdmFsX29mZjsKKwl9CiAKIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+YnlwYXNzX3JlZywKIAkJCQkgIHJkZXYtPmRlc2MtPmJ5cGFzc19tYXNrLCB2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcxLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYwppbmRleCAzYjExMDJiLi42NmZkMjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYwpAQCAtMzI3LDcgKzMyNyw3IEBACiAJCXJldHVybiAtRUlPOwogCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpMmMsIHJlZyk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCiAJKmRlc3QgPSByZXQ7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9scDg3MnguYyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwODcyeC5jCmluZGV4IDJlNDczNGYuLjJlMDIyYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2xwODcyeC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwODcyeC5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAogCXJldCA9IGxwODcyeF9yZWFkX2J5dGUobHAsIExQODcyWF9HRU5FUkFMX0NGRywgJnZhbCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAKIAl2YWwgPSAodmFsICYgbWFzaykgPj4gc2hpZnQ7CiAJaWYgKHZhbCA+PSBzaXplKQpAQCAtMjI5LDcgKzIyOSw3IEBACiAJdTggYWRkciwgdmFsOwogCiAJaWYgKHRpbWVfc3RlcF91cyA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gdGltZV9zdGVwX3VzOwogCiAJc3dpdGNoIChyaWQpIHsKIAljYXNlIExQODcyMF9JRF9MRE8xIC4uLiBMUDg3MjBfSURfQlVDSzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny5jCmluZGV4IGUwNjE5NTIuLmVkNjBiYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzcuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBtYXgxNDU3Ny5jIC0gUmVndWxhdG9yIGRyaXZlciBmb3IgdGhlIE1heGltIDE0NTc3CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIENvcHlyaWdodCAoQykgMjAxMywyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKICAqIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0yMiwxMiArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9tYXgxNDU3Ny1wcml2YXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgogCi1zdHJ1Y3QgbWF4MTQ1NzdfcmVndWxhdG9yIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG1heDE0NTc3ICptYXgxNDU3NzsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJlZ3VsYXRvcnM7Ci19OwotCiBzdGF0aWMgaW50IG1heDE0NTc3X3JlZ19pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewogCWludCByaWQgPSByZGV2X2dldF9pZChyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDE1ODYuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDE1ODYuYwppbmRleCBlMjQyZGQzLi5kMjNkMDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNTg2LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTU4Ni5jCkBAIC00Niw4ICs0Niw2IEBACiAKIAl1bnNpZ25lZCBpbnQgdjNfY3Vycl9zZWw7CiAJdW5zaWduZWQgaW50IHY2X2N1cnJfc2VsOwotCi0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbMF07CiB9OwogCiAvKgpAQCAtMTYyLDE0ICsxNjAsMTIgQEAKIHN0YXRpYyBpbnQgbWF4MTU4Nl9wbWljX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppMmNfaWQpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OwogCXN0cnVjdCBtYXgxNTg2X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKIAlzdHJ1Y3QgbWF4MTU4Nl9kYXRhICptYXgxNTg2OwogCWludCBpLCBpZDsKIAotCW1heDE1ODYgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IG1heDE1ODZfZGF0YSkgKwotCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopICogKE1BWDE1ODZfVjYgKyAxKSwKKwltYXgxNTg2ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBtYXgxNTg2X2RhdGEpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFtYXgxNTg2KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE4Niw4ICsxODIsOSBAQAogCW1heDE1ODYtPnYzX2N1cnJfc2VsID0gMjQ7IC8qIDEuM1YgKi8KIAltYXgxNTg2LT52Nl9jdXJyX3NlbCA9IDA7CiAKLQlyZGV2ID0gbWF4MTU4Ni0+cmRldjsKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9zdWJkZXZzICYmIGkgPD0gTUFYMTU4Nl9WNjsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCiAJCWlkID0gcGRhdGEtPnN1YmRldnNbaV0uaWQ7CiAJCWlmICghcGRhdGEtPnN1YmRldnNbaV0ucGxhdGZvcm1fZGF0YSkKIAkJCWNvbnRpbnVlOwpAQCAtMjA3LDEyICsyMDQsMTIgQEAKIAkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5zdWJkZXZzW2ldLnBsYXRmb3JtX2RhdGE7CiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IG1heDE1ODY7CiAKLQkJcmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKIAkJCQkJCSAgJm1heDE1ODZfcmVnW2lkXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocmRldltpXSkpIHsKKwkJaWYgKElTX0VSUihyZGV2KSkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJbWF4MTU4Nl9yZWdbaWRdLm5hbWUpOwotCQkJcmV0dXJuIFBUUl9FUlIocmRldltpXSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2ODYuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDc3Njg2LmMKaW5kZXggYWUwMDFjYy4uZWYxYWYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2ODYuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY4Ni5jCkBAIC02NSw3ICs2NSw2IEBACiB9OwogCiBzdHJ1Y3QgbWF4Nzc2ODZfZGF0YSB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbTUFYNzc2ODZfUkVHVUxBVE9SU107CiAJdW5zaWduZWQgaW50IG9wbW9kZVtNQVg3NzY4Nl9SRUdVTEFUT1JTXTsKIH07CiAKQEAgLTQwMCw3ICszOTksNyBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJcG1pY19ucCA9IGlvZGV2LT5kZXYtPm9mX25vZGU7Ci0JcmVndWxhdG9yc19ucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBtaWNfbnAsICJ2b2x0YWdlLXJlZ3VsYXRvcnMiKTsKKwlyZWd1bGF0b3JzX25wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUocG1pY19ucCwgInZvbHRhZ2UtcmVndWxhdG9ycyIpOwogCWlmICghcmVndWxhdG9yc19ucCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZmluZCByZWd1bGF0b3JzIHN1Yi1ub2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MTAsOCArNDA5LDcgQEAKIAlyZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnJkYXRhKSAqCiAJCQkgICAgIHBkYXRhLT5udW1fcmVndWxhdG9ycywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVndWxhdG9yIGRhdGFcbiIpOworCQlvZl9ub2RlX3B1dChyZWd1bGF0b3JzX25wKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00MjUsNiArNDIzLDcgQEAKIAl9CiAKIAlwZGF0YS0+cmVndWxhdG9ycyA9IHJkYXRhOworCW9mX25vZGVfcHV0KHJlZ3VsYXRvcnNfbnApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NzQsMTYgKzQ3MywxOCBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1heDc3Njg2KTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVg3NzY4Nl9SRUdVTEFUT1JTOyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisKIAkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JzW2ldLmluaXRkYXRhOwogCQljb25maWcub2Zfbm9kZSA9IHBkYXRhLT5yZWd1bGF0b3JzW2ldLm9mX25vZGU7CiAKIAkJbWF4Nzc2ODYtPm9wbW9kZVtpXSA9IHJlZ3VsYXRvcnNbaV0uZW5hYmxlX21hc2s7Ci0JCW1heDc3Njg2LT5yZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCiAJCQkJCQkmcmVndWxhdG9yc1tpXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIobWF4Nzc2ODYtPnJkZXZbaV0pKSB7CisJCWlmIChJU19FUlIocmRldikpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkicmVndWxhdG9yIGluaXQgZmFpbGVkIGZvciAlZFxuIiwgaSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihtYXg3NzY4Ni0+cmRldltpXSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLmMKaW5kZXggNWZiODk5Zi4uNjUzYTU4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My5jCkBAIC0zNCwxMyArMzQsNiBAQAogCiAjZGVmaW5lIENIR0lOX0lMSU1fU1RFUF8yMG1BCQkJMjAwMDAKIAotc3RydWN0IG1heDc3NjkzX3BtaWNfZGV2IHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG1heDc3NjkzX2RldiAqaW9kZXY7Ci0JaW50IG51bV9yZWd1bGF0b3JzOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKLX07Ci0KIC8qIENIQVJHRVIgcmVndWxhdG9yIG9wcyAqLwogLyogQ0hBUkdFUiByZWd1bGF0b3IgdXNlcyB0d28gYml0cyBmb3IgZW5hYmxpbmcgKi8KIHN0YXRpYyBpbnQgbWF4Nzc2OTNfY2hnX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCkBAIC0xNzAsMTkgKzE2MywyMiBAQAogCXN0cnVjdCBtYXg3NzY5M19yZWd1bGF0b3JfZGF0YSAqdG1wOwogCWludCBpLCBtYXRjaGVkID0gMDsKIAotCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoZGV2LT5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CisJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPnBhcmVudC0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJtYXRjaCA9IGRldm1fa3phbGxvYyhkZXYsCiAJCSBzaXplb2YoKnJtYXRjaCkgKiBBUlJBWV9TSVpFKHJlZ3VsYXRvcnMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJtYXRjaCkKKwlpZiAoIXJtYXRjaCkgeworCQlvZl9ub2RlX3B1dChucCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3VsYXRvcnMpOyBpKyspCiAJCXJtYXRjaFtpXS5uYW1lID0gcmVndWxhdG9yc1tpXS5uYW1lOwogCiAJbWF0Y2hlZCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIG5wLCBybWF0Y2gsIEFSUkFZX1NJWkUocmVndWxhdG9ycykpOworCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAobWF0Y2hlZCA8PSAwKQogCQlyZXR1cm4gbWF0Y2hlZDsKIAkqcmRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKipyZGF0YSkgKiBtYXRjaGVkLCBHRlBfS0VSTkVMKTsKQEAgLTIyOSw3ICsyMjUsNiBAQAogc3RhdGljIGludCBtYXg3NzY5M19wbWljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG1heDc3NjkzX2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IG1heDc3NjkzX3BtaWNfZGV2ICptYXg3NzY5M19wbWljOwogCXN0cnVjdCBtYXg3NzY5M19yZWd1bGF0b3JfZGF0YSAqcmRhdGEgPSBOVUxMOwogCWludCBudW1fcmRhdGEsIGk7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnOwpAQCAtMjQwLDM5ICsyMzUsMjIgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JbWF4Nzc2OTNfcG1pYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJCXNpemVvZihzdHJ1Y3QgbWF4Nzc2OTNfcG1pY19kZXYpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmICghbWF4Nzc2OTNfcG1pYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltYXg3NzY5M19wbWljLT5yZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopICogbnVtX3JkYXRhLAotCQkJCUdGUF9LRVJORUwpOwotCWlmICghbWF4Nzc2OTNfcG1pYy0+cmRldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltYXg3NzY5M19wbWljLT5kZXYgPSAmcGRldi0+ZGV2OwotCW1heDc3NjkzX3BtaWMtPmlvZGV2ID0gaW9kZXY7Ci0JbWF4Nzc2OTNfcG1pYy0+bnVtX3JlZ3VsYXRvcnMgPSBudW1fcmRhdGE7Ci0KIAljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKIAljb25maWcucmVnbWFwID0gaW9kZXYtPnJlZ21hcDsKLQljb25maWcuZHJpdmVyX2RhdGEgPSBtYXg3NzY5M19wbWljOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1heDc3NjkzX3BtaWMpOwogCi0JZm9yIChpID0gMDsgaSA8IG1heDc3NjkzX3BtaWMtPm51bV9yZWd1bGF0b3JzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JkYXRhOyBpKyspIHsKIAkJaW50IGlkID0gcmRhdGFbaV0uaWQ7CisJCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCiAJCWNvbmZpZy5pbml0X2RhdGEgPSByZGF0YVtpXS5pbml0ZGF0YTsKIAkJY29uZmlnLm9mX25vZGUgPSByZGF0YVtpXS5vZl9ub2RlOwogCi0JCW1heDc3NjkzX3BtaWMtPnJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKIAkJCQkJCSZyZWd1bGF0b3JzW2lkXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIobWF4Nzc2OTNfcG1pYy0+cmRldltpXSkpIHsKLQkJCWRldl9lcnIobWF4Nzc2OTNfcG1pYy0+ZGV2LAorCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIHJlZ3VsYXRvci0lZFxuIiwgaWQpOwotCQkJcmV0dXJuIFBUUl9FUlIobWF4Nzc2OTNfcG1pYy0+cmRldltpXSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jCmluZGV4IDdmMDQ5YzkuLjMxNzJkYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMKQEAgLTQ5LDcgKzQ5LDYgQEAKICNkZWZpbmUgTUFYODY0OV9SQU1QX0RPV04JKDEgPDwgMSkKIAogc3RydWN0IG1heDg2NDlfcmVndWxhdG9yX2luZm8gewotCXN0cnVjdCByZWd1bGF0b3JfZGV2CSpyZWd1bGF0b3I7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgcmVnbWFwCQkqcmVnbWFwOwogCkBAIC0xNTQsNiArMTUzLDcgQEAKIHsKIAlzdHJ1Y3QgbWF4ODY0OV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKIAlzdHJ1Y3QgbWF4ODY0OV9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcjsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJdW5zaWduZWQgaW50IHZhbDsKIAl1bnNpZ25lZCBjaGFyIGRhdGE7CkBAIC0yMzQsMTIgKzIzNCwxMiBAQAogCWNvbmZpZy5kcml2ZXJfZGF0YSA9IGluZm87CiAJY29uZmlnLnJlZ21hcCA9IGluZm8tPnJlZ21hcDsKIAotCWluZm8tPnJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRjZGNfZGVzYywKKwlyZWd1bGF0b3IgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkY2RjX2Rlc2MsCiAJCQkJCQkgICZjb25maWcpOwotCWlmIChJU19FUlIoaW5mby0+cmVndWxhdG9yKSkgeworCWlmIChJU19FUlIocmVndWxhdG9yKSkgewogCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3IgJXNcbiIsCiAJCQlkY2RjX2Rlc2MubmFtZSk7Ci0JCXJldHVybiBQVFJfRVJSKGluZm8tPnJlZ3VsYXRvcik7CisJCXJldHVybiBQVFJfRVJSKHJlZ3VsYXRvcik7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjYwLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjYwLmMKaW5kZXggOGQ5NGQzZC4uMmZjNDExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY2MC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYwpAQCAtODEsMTYgKzgxLDE3IEBACiBzdHJ1Y3QgbWF4ODY2MCB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAl1OCBzaGFkb3dfcmVnc1tNQVg4NjYwX05fUkVHU107CQkvKiBhcyBjaGlwIGlzIHdyaXRlIG9ubHkgKi8KLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldltdOwogfTsKIAogc3RhdGljIGludCBtYXg4NjYwX3dyaXRlKHN0cnVjdCBtYXg4NjYwICptYXg4NjYwLCB1OCByZWcsIHU4IG1hc2ssIHU4IHZhbCkKIHsKLQlzdGF0aWMgY29uc3QgdTggbWF4ODY2MF9hZGRyZXNzZXNbTUFYODY2MF9OX1JFR1NdID0KLQkgIHsgMHgxMCwgMHgxMiwgMHgyMCwgMHgyMywgMHgyNCwgMHgyOSwgMHgyYSwgMHgzMiwgMHgzMywgMHgzOSwgMHg4MCB9OworCXN0YXRpYyBjb25zdCB1OCBtYXg4NjYwX2FkZHJlc3Nlc1tNQVg4NjYwX05fUkVHU10gPSB7CisJIDB4MTAsIDB4MTIsIDB4MjAsIDB4MjMsIDB4MjQsIDB4MjksIDB4MmEsIDB4MzIsIDB4MzMsIDB4MzksIDB4ODAKKwl9OwogCiAJaW50IHJldDsKIAl1OCByZWdfdmFsID0gKG1heDg2NjAtPnNoYWRvd19yZWdzW3JlZ10gJiBtYXNrKSB8IHZhbDsKKwogCWRldl92ZGJnKCZtYXg4NjYwLT5jbGllbnQtPmRldiwgIldyaXRpbmcgcmVnICUwMnggd2l0aCAlMDJ4XG4iLAogCQkJbWF4ODY2MF9hZGRyZXNzZXNbcmVnXSwgcmVnX3ZhbCk7CiAKQEAgLTExMiw2ICsxMTMsNyBAQAogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1OCB2YWwgPSBtYXg4NjYwLT5zaGFkb3dfcmVnc1tNQVg4NjYwX09WRVIxXTsKIAl1OCBtYXNrID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjMpID8gMSA6IDQ7CisKIAlyZXR1cm4gISEodmFsICYgbWFzayk7CiB9CiAKQEAgLTExOSw2ICsxMjEsNyBAQAogewogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1OCBiaXQgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WMykgPyAxIDogNDsKKwogCXJldHVybiBtYXg4NjYwX3dyaXRlKG1heDg2NjAsIE1BWDg2NjBfT1ZFUjEsIDB4ZmYsIGJpdCk7CiB9CiAKQEAgLTEyNiwxNSArMTI5LDE2IEBACiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IG1hc2sgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WMykgPyB+MSA6IH40OworCiAJcmV0dXJuIG1heDg2NjBfd3JpdGUobWF4ODY2MCwgTUFYODY2MF9PVkVSMSwgbWFzaywgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbWF4ODY2MF9kY2RjX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3QgbWF4ODY2MCAqbWF4ODY2MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0KIAl1OCByZWcgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WMykgPyBNQVg4NjYwX0FEVFYyIDogTUFYODY2MF9TRFRWMjsKIAl1OCBzZWxlY3RvciA9IG1heDg2NjAtPnNoYWRvd19yZWdzW3JlZ107CisKIAlyZXR1cm4gc2VsZWN0b3I7CiB9CiAKQEAgLTIwNyw2ICsyMTEsNyBAQAogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1OCB2YWwgPSBtYXg4NjYwLT5zaGFkb3dfcmVnc1tNQVg4NjYwX09WRVIyXTsKIAl1OCBtYXNrID0gKHJkZXZfZ2V0X2lkKHJkZXYpID09IE1BWDg2NjBfVjYpID8gMiA6IDQ7CisKIAlyZXR1cm4gISEodmFsICYgbWFzayk7CiB9CiAKQEAgLTIxNCw2ICsyMTksNyBAQAogewogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1OCBiaXQgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WNikgPyAyIDogNDsKKwogCXJldHVybiBtYXg4NjYwX3dyaXRlKG1heDg2NjAsIE1BWDg2NjBfT1ZFUjIsIDB4ZmYsIGJpdCk7CiB9CiAKQEAgLTIyMSwxNSArMjI3LDE2IEBACiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IG1hc2sgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WNikgPyB+MiA6IH40OworCiAJcmV0dXJuIG1heDg2NjBfd3JpdGUobWF4ODY2MCwgTUFYODY2MF9PVkVSMiwgbWFzaywgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbWF4ODY2MF9sZG82N19nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCiAJdTggc2hpZnQgPSAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WNikgPyAwIDogNDsKIAl1OCBzZWxlY3RvciA9IChtYXg4NjYwLT5zaGFkb3dfcmVnc1tNQVg4NjYwX0wxMlZDUl0gPj4gc2hpZnQpICYgMHhmOworCiAJcmV0dXJuIHNlbGVjdG9yOwogfQogCkBAIC0zMzAsNyArMzM3LDcgQEAKIAlzdHJ1Y3QgbWF4ODY2MF9zdWJkZXZfZGF0YSAqc3ViOwogCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggcm1hdGNoW0FSUkFZX1NJWkUobWF4ODY2MF9yZWcpXTsKIAotCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOworCW5wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghbnApIHsKIAkJZGV2X2VycihkZXYsICJtaXNzaW5nICdyZWd1bGF0b3JzJyBzdWJub2RlIGluIERUXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNDAsNiArMzQ3LDcgQEAKIAkJcm1hdGNoW2ldLm5hbWUgPSBtYXg4NjYwX3JlZ1tpXS5uYW1lOwogCiAJbWF0Y2hlZCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIG5wLCBybWF0Y2gsIEFSUkFZX1NJWkUocm1hdGNoKSk7CisJb2Zfbm9kZV9wdXQobnApOwogCWlmIChtYXRjaGVkIDw9IDApCiAJCXJldHVybiBtYXRjaGVkOwogCkBAIC0zNzMsNyArMzgxLDYgQEAKIHN0YXRpYyBpbnQgbWF4ODY2MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppMmNfaWQpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgbWF4ODY2MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CkBAIC00MDYsMTQgKzQxMywxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltYXg4NjYwID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXg4NjYwKSArCi0JCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKikgKiBNQVg4NjYwX1ZfRU5ELAotCQkJR0ZQX0tFUk5FTCk7CisJbWF4ODY2MCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbWF4ODY2MCksIEdGUF9LRVJORUwpOwogCWlmICghbWF4ODY2MCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltYXg4NjYwLT5jbGllbnQgPSBjbGllbnQ7Ci0JcmRldiA9IG1heDg2NjAtPnJkZXY7CiAKIAlpZiAocGRhdGEtPmVuMzRfaXNfaGlnaCkgewogCQkvKiBTaW11bGF0ZSBhbHdheXMgb24gKi8KQEAgLTQ4MSw2ICs0ODUsNyBAQAogCiAJLyogRmluYWxseSByZWdpc3RlciBkZXZpY2VzICovCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fc3ViZGV2czsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCiAJCWlkID0gcGRhdGEtPnN1YmRldnNbaV0uaWQ7CiAKQEAgLTQ4OSwxMyArNDk0LDEzIEBACiAJCWNvbmZpZy5vZl9ub2RlID0gb2Zfbm9kZVtpXTsKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gbWF4ODY2MDsKIAotCQlyZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAorCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAogCQkJCQkJICAmbWF4ODY2MF9yZWdbaWRdLCAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihyZGV2W2ldKSkgewotCQkJcmV0ID0gUFRSX0VSUihyZGV2W2ldKTsKKwkJaWYgKElTX0VSUihyZGV2KSkgeworCQkJcmV0ID0gUFRSX0VSUihyZGV2KTsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLAogCQkJCW1heDg2NjBfcmVnW2lkXS5uYW1lKTsKLQkJCXJldHVybiBQVFJfRVJSKHJkZXZbaV0pOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MDctcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTA3LXJlZ3VsYXRvci5jCmluZGV4IDBjNWZlNmMuLjk2MjNlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MDctcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkwNy1yZWd1bGF0b3IuYwpAQCAtMzQsNyArMzQsNiBAQAogCiBzdHJ1Y3QgbWF4ODkwN19yZWd1bGF0b3IgewogCXN0cnVjdCByZWd1bGF0b3JfZGVzYyBkZXNjW01BWDg5MDdfTlVNX1JFR1VMQVRPUlNdOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W01BWDg5MDdfTlVNX1JFR1VMQVRPUlNdOwogfTsKIAogI2RlZmluZSBSRUdfTUJBVFQoKSBcCkBAIC0yMzEsNyArMjMwLDcgQEAKIAlpZiAoIW5wKQogCQlyZXR1cm4gMDsKIAotCXJlZ3VsYXRvcnMgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgInJlZ3VsYXRvcnMiKTsKKwlyZWd1bGF0b3JzID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFyZWd1bGF0b3JzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ3VsYXRvcnMgbm9kZSBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI5MiwxMCArMjkxLDkgQEAKIAkJcmV0dXJuIHJldDsKIAogCXBtaWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwbWljKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWljKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvYyBwbWljXG4iKTsKKwlpZiAoIXBtaWMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBtaWMpOwogCiAJbWVtY3B5KHBtaWMtPmRlc2MsIG1heDg5MDdfcmVndWxhdG9ycywgc2l6ZW9mKHBtaWMtPmRlc2MpKTsKQEAgLTMxMSw2ICszMDksOCBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBNQVg4OTA3X05VTV9SRUdVTEFUT1JTOyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisKIAkJY29uZmlnLmRldiA9IHBkZXYtPmRldi5wYXJlbnQ7CiAJCWlmIChwZGF0YSkKIAkJCWlkYXRhID0gcGRhdGEtPmluaXRfZGF0YVtpXTsKQEAgLTM1MCwxMyArMzUwLDEzIEBACiAJCQkJcG1pYy0+ZGVzY1tpXS5vcHMgPSAmbWF4ODkwN19vdXQ1dl9od2N0bF9vcHM7CiAJCX0KIAotCQlwbWljLT5yZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCiAJCQkJCQkmcG1pYy0+ZGVzY1tpXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocG1pYy0+cmRldltpXSkpIHsKKwkJaWYgKElTX0VSUihyZGV2KSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgcmVndWxhdG9yXG4iLAogCQkJCXBtaWMtPmRlc2NbaV0ubmFtZSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihwbWljLT5yZGV2W2ldKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYwppbmRleCA3NTk1MTA3Li5kYWQyYmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MjUtcmVndWxhdG9yLmMKQEAgLTM2LDkgKzM2LDcgQEAKIAogc3RydWN0IG1heDg5MjVfcmVndWxhdG9yX2luZm8gewogCXN0cnVjdCByZWd1bGF0b3JfZGVzYwlkZXNjOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2CSpyZWd1bGF0b3I7CiAJc3RydWN0IGkyY19jbGllbnQJKmkyYzsKLQlzdHJ1Y3QgbWF4ODkyNV9jaGlwCSpjaGlwOwogCiAJaW50CXZvbF9yZWc7CiAJaW50CWVuYWJsZV9yZWc7CkBAIC0yNTEsMTAgKzI0OSwxMSBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnByb290LCAqbnA7CiAJaW50IHJjb3VudDsKKwogCW5wcm9vdCA9IG9mX25vZGVfZ2V0KHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpOwogCWlmICghbnByb290KQogCQlyZXR1cm4gLUVOT0RFVjsKLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wcm9vdCwgInJlZ3VsYXRvcnMiKTsKKwlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wcm9vdCwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIW5wKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBmaW5kIHJlZ3VsYXRvcnMgbm9kZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjY0LDcgKzI2Myw3IEBACiAJCQkJJm1heDg5MjVfcmVndWxhdG9yX21hdGNoZXNbcmlkeF0sIDEpOwogCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAocmNvdW50IDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiByY291bnQ7CiAJY29uZmlnLT5pbml0X2RhdGEgPQltYXg4OTI1X3JlZ3VsYXRvcl9tYXRjaGVzW3JpZHhdLmluaXRfZGF0YTsKIAljb25maWctPm9mX25vZGUgPSBtYXg4OTI1X3JlZ3VsYXRvcl9tYXRjaGVzW3JpZHhdLm9mX25vZGU7CiAKQEAgLTMwMyw3ICszMDIsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmktPmkyYyA9IGNoaXAtPmkyYzsKLQlyaS0+Y2hpcCA9IGNoaXA7CiAKIAljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKIAljb25maWcuZHJpdmVyX2RhdGEgPSByaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYwppbmRleCA3ODhlNWFlLi5kOTIwZjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCkBAIC00OCw5ICs0OCw3IEBACiAKIHN0cnVjdCBtYXg4OTUyX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgbWF4ODk1Ml9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldgkqcmRldjsKIAogCWJvb2wgdmlkMDsKIAlib29sIHZpZDE7CkBAIC01OSw2ICs1Nyw3IEBACiBzdGF0aWMgaW50IG1heDg5NTJfcmVhZF9yZWcoc3RydWN0IG1heDg5NTJfZGF0YSAqbWF4ODk1MiwgdTggcmVnKQogewogCWludCByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobWF4ODk1Mi0+Y2xpZW50LCByZWcpOworCiAJaWYgKHJldCA+IDApCiAJCXJldCAmPSAweGZmOwogCkBAIC0xNDQsMTAgKzE0Myw4IEBACiAJaW50IGk7CiAKIAlwZCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHBsYXRmb3JtIGRhdGFcbiIpOworCWlmICghcGQpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXBkLT5ncGlvX3ZpZDAgPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgIm1heDg5NTIsdmlkLWdwaW9zIiwgMCk7CiAJcGQtPmdwaW9fdmlkMSA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAibWF4ODk1Mix2aWQtZ3Bpb3MiLCAxKTsKQEAgLTE5OSw2ICsxOTYsNyBAQAogCXN0cnVjdCBtYXg4OTUyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKIAlzdHJ1Y3QgbWF4ODk1Ml9kYXRhICptYXg4OTUyOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCiAJaW50IHJldCA9IDAsIGVyciA9IDA7CiAKQEAgLTIxOSwxMCArMjE3LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltYXg4OTUyLT5jbGllbnQgPSBjbGllbnQ7Ci0JbWF4ODk1Mi0+ZGV2ID0gJmNsaWVudC0+ZGV2OwogCW1heDg5NTItPnBkYXRhID0gcGRhdGE7CiAKLQljb25maWcuZGV2ID0gbWF4ODk1Mi0+ZGV2OworCWNvbmZpZy5kZXYgPSAmY2xpZW50LT5kZXY7CiAJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5yZWdfZGF0YTsKIAljb25maWcuZHJpdmVyX2RhdGEgPSBtYXg4OTUyOwogCWNvbmZpZy5vZl9ub2RlID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKQEAgLTIzMSwxMSArMjI4LDExIEBACiAJaWYgKHBkYXRhLT5yZWdfZGF0YS0+Y29uc3RyYWludHMuYm9vdF9vbikKIAkJY29uZmlnLmVuYV9ncGlvX2ZsYWdzIHw9IEdQSU9GX09VVF9JTklUX0hJR0g7CiAKLQltYXg4OTUyLT5yZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZyZWd1bGF0b3IsICZjb25maWcpOworCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZyZWd1bGF0b3IsICZjb25maWcpOwogCi0JaWYgKElTX0VSUihtYXg4OTUyLT5yZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKG1heDg5NTItPnJkZXYpOwotCQlkZXZfZXJyKG1heDg5NTItPmRldiwgInJlZ3VsYXRvciBpbml0IGZhaWxlZCAoJWQpXG4iLCByZXQpOworCWlmIChJU19FUlIocmRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihyZGV2KTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWd1bGF0b3IgaW5pdCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI2Myw3ICsyNjAsNyBAQAogCQllcnIgPSAzOwogCiAJaWYgKGVycikgewotCQlkZXZfd2FybihtYXg4OTUyLT5kZXYsICJWSUQwLzEgZ3BpbyBpbnZhbGlkOiAiCisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlZJRDAvMSBncGlvIGludmFsaWQ6ICIKIAkJCQkiRFZTIG5vdCBhdmFpbGFibGUuXG4iKTsKIAkJbWF4ODk1Mi0+dmlkMCA9IDA7CiAJCW1heDg5NTItPnZpZDEgPSAwOwpAQCAtMjc0LDcgKzI3MSw3IEBACiAJCS8qIERpc2FibGUgUHVsbGRvd24gb2YgRU4gb25seSAqLwogCQltYXg4OTUyX3dyaXRlX3JlZyhtYXg4OTUyLCBNQVg4OTUyX1JFR19DT05UUk9MLCAweDYwKTsKIAotCQlkZXZfZXJyKG1heDg5NTItPmRldiwgIkRWUyBtb2RlcyBkaXNhYmxlZCBiZWNhdXNlIFZJRDAgYW5kIFZJRDEiCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRFZTIG1vZGVzIGRpc2FibGVkIGJlY2F1c2UgVklEMCBhbmQgVklEMSIKIAkJCQkiIGRvIG5vdCBoYXZlIHByb3BlciBjb250cm9scy5cbiIpOwogCX0gZWxzZSB7CiAJCS8qCkBAIC0zMjEsOSArMzE4LDYgQEAKIHsKIAlzdHJ1Y3QgbWF4ODk1Ml9kYXRhICptYXg4OTUyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IG1heDg5NTJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBtYXg4OTUyLT5wZGF0YTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IG1heDg5NTItPnJkZXY7Ci0KLQlyZWd1bGF0b3JfdW5yZWdpc3RlcihyZGV2KTsKIAogCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb192aWQwKTsKIAlncGlvX2ZyZWUocGRhdGEtPmdwaW9fdmlkMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTczLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk3My1yZWd1bGF0b3IuYwppbmRleCA4OTJhYTFlLi5kYmVkZjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTczLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NzMtcmVndWxhdG9yLmMKQEAgLTkzLDcgKzkzLDYgQEAKIHN0cnVjdCBtYXg4OTczX2NoaXAgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzYzsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJYm9vbCBlbmFibGVfZXh0ZXJuYWxfY29udHJvbDsKIAlpbnQgZHZzX2dwaW87CkBAIC0zNzksMTAgKzM3OCw4IEBACiAJfQogCiAJbWF4ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCptYXgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1heCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZvciBtYXggZmFpbGVkXG4iKTsKKwlpZiAoIW1heCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJbWF4LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZtYXg4OTczX3JlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIobWF4LT5yZWdtYXApKSB7CkBAIC00NzQsNyArNDcxLDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQltYXgtPnJkZXYgPSByZGV2OwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKaW5kZXggMmQ2MThmYy4uOTBiNGM1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYwpAQCAtMzgsNyArMzgsNiBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWF4ODk5N19kZXYgKmlvZGV2OwogCWludCBudW1fcmVndWxhdG9yczsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CiAJaW50IHJhbXBfZGVsYXk7IC8qIGluIG1WL3VzICovCiAKIAlib29sIGJ1Y2sxX2dwaW9kdnM7CkBAIC05MjQsNyArOTIzLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcmVndWxhdG9yc19ucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBtaWNfbnAsICJyZWd1bGF0b3JzIik7CisJcmVndWxhdG9yc19ucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBtaWNfbnAsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFyZWd1bGF0b3JzX25wKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBmaW5kIHJlZ3VsYXRvcnMgc3ViLW5vZGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTkzNyw3ICs5MzYsNiBAQAogCQkJCXBkYXRhLT5udW1fcmVndWxhdG9ycywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZGF0YSkgewogCQlvZl9ub2RlX3B1dChyZWd1bGF0b3JzX25wKTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVndWxhdG9yIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEwMzAsMTAgKzEwMjgsMTAgQEAKIAlzdHJ1Y3QgbWF4ODk5N19kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gaW9kZXYtPnBkYXRhOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IG1heDg5OTdfZGF0YSAqbWF4ODk5NzsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOwotCWludCBpLCByZXQsIHNpemUsIG5yX2R2czsKKwlpbnQgaSwgcmV0LCBucl9kdnM7CiAJdTggbWF4X2J1Y2sxID0gMCwgbWF4X2J1Y2syID0gMCwgbWF4X2J1Y2s1ID0gMDsKIAogCWlmICghcGRhdGEpIHsKQEAgLTEwNTIsMTIgKzEwNTAsNiBAQAogCWlmICghbWF4ODk5NykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopICogcGRhdGEtPm51bV9yZWd1bGF0b3JzOwotCW1heDg5OTctPnJkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXg4OTk3LT5yZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJkZXYgPSBtYXg4OTk3LT5yZGV2OwogCW1heDg5OTctPmRldiA9ICZwZGV2LT5kZXY7CiAJbWF4ODk5Ny0+aW9kZXYgPSBpb2RldjsKIAltYXg4OTk3LT5udW1fcmVndWxhdG9ycyA9IHBkYXRhLT5udW1fcmVndWxhdG9yczsKQEAgLTEyMDUsMTIgKzExOTcsMTIgQEAKIAkJY29uZmlnLmRyaXZlcl9kYXRhID0gbWF4ODk5NzsKIAkJY29uZmlnLm9mX25vZGUgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5yZWdfbm9kZTsKIAotCQlyZGV2W2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnJlZ3VsYXRvcnNbaWRdLAotCQkJCQkJICAmY29uZmlnKTsKLQkJaWYgKElTX0VSUihyZGV2W2ldKSkgeworCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnJlZ3VsYXRvcnNbaWRdLAorCQkJCQkgICAgICAgJmNvbmZpZyk7CisJCWlmIChJU19FUlIocmRldikpIHsKIAkJCWRldl9lcnIobWF4ODk5Ny0+ZGV2LCAicmVndWxhdG9yIGluaXQgZmFpbGVkIGZvciAlZFxuIiwKIAkJCQkJaWQpOwotCQkJcmV0dXJuIFBUUl9FUlIocmRldltpXSk7CisJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5OC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5OC5jCmluZGV4IGFlM2YwNjUuLjk2MTA5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTguYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk4LmMKQEAgLTQwLDcgKzQwLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBtYXg4OTk4X2RldgkqaW9kZXY7CiAJaW50CQkJbnVtX3JlZ3VsYXRvcnM7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYJKipyZGV2OwogCXU4ICAgICAgICAgICAgICAgICAgICAgIGJ1Y2sxX3ZvbFs0XTsgLyogdm9sdGFnZXMgZm9yIHNlbGVjdGlvbiAqLwogCXU4ICAgICAgICAgICAgICAgICAgICAgIGJ1Y2syX3ZvbFsyXTsKIAl1bnNpZ25lZCBpbnQJCWJ1Y2sxX2lkeDsgLyogaW5kZXggdG8gbGFzdCBjaGFuZ2VkIHZvbHRhZ2UgKi8KQEAgLTY3NCw4ICs2NzMsMTAgQEAKIAogCXJkYXRhID0gZGV2bV9remFsbG9jKGlvZGV2LT5kZXYsIHNpemVvZigqcmRhdGEpICoKIAkJCQlwZGF0YS0+bnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwotCWlmICghcmRhdGEpCisJaWYgKCFyZGF0YSkgeworCQlvZl9ub2RlX3B1dChyZWd1bGF0b3JzX25wKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJcGRhdGEtPnJlZ3VsYXRvcnMgPSByZGF0YTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWd1bGF0b3JzKTsgKytpKSB7CkBAIC02OTIsNiArNjkzLDkgQEAKIAl9CiAJcGRhdGEtPm51bV9yZWd1bGF0b3JzID0gcmRhdGEgLSBwZGF0YS0+cmVndWxhdG9yczsKIAorCW9mX25vZGVfcHV0KHJlZ19ucCk7CisJb2Zfbm9kZV9wdXQocmVndWxhdG9yc19ucCk7CisKIAlyZXQgPSBtYXg4OTk4X3BtaWNfZHRfcGFyc2VfZHZzX2dwaW8oaW9kZXYsIHBkYXRhLCBwbWljX25wKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc0MSwxMCArNzQ1LDEwIEBACiAJc3RydWN0IG1heDg5OThfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgbWF4ODk5OF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGlvZGV2LT5wZGF0YTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipyZGV2OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCXN0cnVjdCBtYXg4OTk4X2RhdGEgKm1heDg5OTg7CiAJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKLQlpbnQgaSwgcmV0LCBzaXplOworCWludCBpLCByZXQ7CiAJdW5zaWduZWQgaW50IHY7CiAKIAlpZiAoIXBkYXRhKSB7CkBAIC03NjMsMTIgKzc2Nyw2IEBACiAJaWYgKCFtYXg4OTk4KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKikgKiBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7Ci0JbWF4ODk5OC0+cmRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDg5OTgtPnJkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmRldiA9IG1heDg5OTgtPnJkZXY7CiAJbWF4ODk5OC0+ZGV2ID0gJnBkZXYtPmRldjsKIAltYXg4OTk4LT5pb2RldiA9IGlvZGV2OwogCW1heDg5OTgtPm51bV9yZWd1bGF0b3JzID0gcGRhdGEtPm51bV9yZWd1bGF0b3JzOwpAQCAtODcyLDEzICs4NzAsMTIgQEAKIAkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JzW2ldLmluaXRkYXRhOwogCQljb25maWcuZHJpdmVyX2RhdGEgPSBtYXg4OTk4OwogCi0JCXJkZXZbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAotCQkJCQkJICAmcmVndWxhdG9yc1tpbmRleF0sICZjb25maWcpOwotCQlpZiAoSVNfRVJSKHJkZXZbaV0pKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHJkZXZbaV0pOworCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnJlZ3VsYXRvcnNbaW5kZXhdLAorCQkJCQkgICAgICAgJmNvbmZpZyk7CisJCWlmIChJU19FUlIocmRldikpIHsKKwkJCXJldCA9IFBUUl9FUlIocmRldik7CiAJCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgInJlZ3VsYXRvciAlcyBpbml0IGZhaWxlZCAoJWQpXG4iLAogCQkJCQkJcmVndWxhdG9yc1tpbmRleF0ubmFtZSwgcmV0KTsKLQkJCXJkZXZbaV0gPSBOVUxMOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYwppbmRleCBkYTQ4NTkyLi4wNWI5NzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5jCkBAIC0xNjcsOCArMTY3LDEwIEBACiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CiAJaW50IG51bTsKIAotCW9mX25vZGVfZ2V0KHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpOwotCXBhcmVudCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CisJaWYgKCFwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBhcmVudCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xODcsOCArMTg5LDEwIEBACiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsICpjaGlsZDsKIAlpbnQgaSwgcGFyc2VkID0gMDsKIAotCW9mX25vZGVfZ2V0KHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUpOwotCXBhcmVudCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CisJaWYgKCFwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCXBhcmVudCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsICJyZWd1bGF0b3JzIik7CiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9wZnV6ZTEwMC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3BmdXplMTAwLXJlZ3VsYXRvci5jCmluZGV4IGFiMTc0ZjIuLjY3ZTY3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3BmdXplMTAwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3BmdXplMTAwLXJlZ3VsYXRvci5jCkBAIC01Niw2ICs1Niw4IEBACiAjZGVmaW5lIFBGVVpFMTAwX1ZHRU41Vk9MCTB4NzAKICNkZWZpbmUgUEZVWkUxMDBfVkdFTjZWT0wJMHg3MQogCitlbnVtIGNoaXBzIHsgUEZVWkUxMDAsIFBGVVpFMjAwIH07CisKIHN0cnVjdCBwZnV6ZV9yZWd1bGF0b3IgewogCXN0cnVjdCByZWd1bGF0b3JfZGVzYyBkZXNjOwogCXVuc2lnbmVkIGNoYXIgc3RieV9yZWc7CkBAIC02Myw2ICs2NSw3IEBACiB9OwogCiBzdHJ1Y3QgcGZ1emVfY2hpcCB7CisJaW50CWNoaXBfaWQ7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGZ1emVfcmVndWxhdG9yIHJlZ3VsYXRvcl9kZXNjc1tQRlVaRTEwMF9NQVhfUkVHVUxBVE9SXTsKQEAgLTc4LDIxICs4MSwyMyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBmdXplX2RldmljZV9pZFtdID0gewotCXsubmFtZSA9ICJwZnV6ZTEwMCJ9LAotCXt9LAorCXsubmFtZSA9ICJwZnV6ZTEwMCIsIC5kcml2ZXJfZGF0YSA9IFBGVVpFMTAwfSwKKwl7Lm5hbWUgPSAicGZ1emUyMDAiLCAuZHJpdmVyX2RhdGEgPSBQRlVaRTIwMH0sCisJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHBmdXplX2RldmljZV9pZCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBmdXplX2R0X2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHBmdXplMTAwIiB9LAotCXt9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHBmdXplMTAwIiwgLmRhdGEgPSAodm9pZCAqKVBGVVpFMTAwfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxwZnV6ZTIwMCIsIC5kYXRhID0gKHZvaWQgKilQRlVaRTIwMH0sCisJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcGZ1emVfZHRfaWRzKTsKIAogc3RhdGljIGludCBwZnV6ZTEwMF9zZXRfcmFtcF9kZWxheShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IHJhbXBfZGVsYXkpCiB7CiAJc3RydWN0IHBmdXplX2NoaXAgKnBmdXplMTAwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgaWQgPSByZGV2LT5kZXNjLT5pZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKIAl1bnNpZ25lZCBpbnQgcmFtcF9iaXRzOwogCWludCByZXQ7CiAKQEAgLTEzOSwxNCArMTQ0LDE0IEBACiAKIH07CiAKLSNkZWZpbmUgUEZVWkUxMDBfRklYRURfUkVHKF9uYW1lLCBiYXNlLCB2b2x0YWdlKQlcCi0JW1BGVVpFMTAwXyAjIyBfbmFtZV0gPSB7CVwKKyNkZWZpbmUgUEZVWkUxMDBfRklYRURfUkVHKF9jaGlwLCBfbmFtZSwgYmFzZSwgdm9sdGFnZSkJXAorCVtfY2hpcCAjIyBfICMjIF9uYW1lXSA9IHsJXAogCQkuZGVzYyA9IHsJXAogCQkJLm5hbWUgPSAjX25hbWUsCVwKIAkJCS5uX3ZvbHRhZ2VzID0gMSwJXAogCQkJLm9wcyA9ICZwZnV6ZTEwMF9maXhlZF9yZWd1bGF0b3Jfb3BzLAlcCiAJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCi0JCQkuaWQgPSBQRlVaRTEwMF8gIyMgX25hbWUsCVwKKwkJCS5pZCA9IF9jaGlwICMjIF8gIyMgX25hbWUsCVwKIAkJCS5vd25lciA9IFRISVNfTU9EVUxFLAlcCiAJCQkubWluX3VWID0gKHZvbHRhZ2UpLAlcCiAJCQkuZW5hYmxlX3JlZyA9IChiYXNlKSwJXApAQCAtMTU0LDE0ICsxNTksMTQgQEAKIAkJfSwJXAogCX0KIAotI2RlZmluZSBQRlVaRTEwMF9TV19SRUcoX25hbWUsIGJhc2UsIG1pbiwgbWF4LCBzdGVwKQlcCi0JW1BGVVpFMTAwXyAjIyBfbmFtZV0gPSB7CVwKKyNkZWZpbmUgUEZVWkUxMDBfU1dfUkVHKF9jaGlwLCBfbmFtZSwgYmFzZSwgbWluLCBtYXgsIHN0ZXApCVwKKwlbX2NoaXAgIyMgXyAjIyBfbmFtZV0gPSB7CVwKIAkJLmRlc2MgPSB7CVwKIAkJCS5uYW1lID0gI19uYW1lLFwKIAkJCS5uX3ZvbHRhZ2VzID0gKChtYXgpIC0gKG1pbikpIC8gKHN0ZXApICsgMSwJXAogCQkJLm9wcyA9ICZwZnV6ZTEwMF9zd19yZWd1bGF0b3Jfb3BzLAlcCiAJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCi0JCQkuaWQgPSBQRlVaRTEwMF8gIyMgX25hbWUsCVwKKwkJCS5pZCA9IF9jaGlwICMjIF8gIyMgX25hbWUsCVwKIAkJCS5vd25lciA9IFRISVNfTU9EVUxFLAlcCiAJCQkubWluX3VWID0gKG1pbiksCVwKIAkJCS51Vl9zdGVwID0gKHN0ZXApLAlcCkBAIC0xNzIsMTQgKzE3NywxNCBAQAogCQkuc3RieV9tYXNrID0gMHgzZiwJXAogCX0KIAotI2RlZmluZSBQRlVaRTEwMF9TV0JfUkVHKF9uYW1lLCBiYXNlLCBtYXNrLCB2b2x0YWdlcykJXAotCVtQRlVaRTEwMF8gIyMgX25hbWVdID0gewlcCisjZGVmaW5lIFBGVVpFMTAwX1NXQl9SRUcoX2NoaXAsIF9uYW1lLCBiYXNlLCBtYXNrLCB2b2x0YWdlcykJXAorCVtfY2hpcCAjIyBfICMjICBfbmFtZV0gPSB7CVwKIAkJLmRlc2MgPSB7CVwKIAkJCS5uYW1lID0gI19uYW1lLAlcCiAJCQkubl92b2x0YWdlcyA9IEFSUkFZX1NJWkUodm9sdGFnZXMpLAlcCiAJCQkub3BzID0gJnBmdXplMTAwX3N3Yl9yZWd1bGF0b3Jfb3BzLAlcCiAJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCi0JCQkuaWQgPSBQRlVaRTEwMF8gIyMgX25hbWUsCVwKKwkJCS5pZCA9IF9jaGlwICMjIF8gIyMgX25hbWUsCVwKIAkJCS5vd25lciA9IFRISVNfTU9EVUxFLAlcCiAJCQkudm9sdF90YWJsZSA9IHZvbHRhZ2VzLAlcCiAJCQkudnNlbF9yZWcgPSAoYmFzZSksCVwKQEAgLTE4NywxNCArMTkyLDE0IEBACiAJCX0sCVwKIAl9CiAKLSNkZWZpbmUgUEZVWkUxMDBfVkdFTl9SRUcoX25hbWUsIGJhc2UsIG1pbiwgbWF4LCBzdGVwKQlcCi0JW1BGVVpFMTAwXyAjIyBfbmFtZV0gPSB7CVwKKyNkZWZpbmUgUEZVWkUxMDBfVkdFTl9SRUcoX2NoaXAsIF9uYW1lLCBiYXNlLCBtaW4sIG1heCwgc3RlcCkJXAorCVtfY2hpcCAjIyBfICMjIF9uYW1lXSA9IHsJXAogCQkuZGVzYyA9IHsJXAogCQkJLm5hbWUgPSAjX25hbWUsCVwKIAkJCS5uX3ZvbHRhZ2VzID0gKChtYXgpIC0gKG1pbikpIC8gKHN0ZXApICsgMSwJXAogCQkJLm9wcyA9ICZwZnV6ZTEwMF9sZG9fcmVndWxhdG9yX29wcywJXAogCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJXAotCQkJLmlkID0gUEZVWkUxMDBfICMjIF9uYW1lLAlcCisJCQkuaWQgPSBfY2hpcCAjIyBfICMjIF9uYW1lLAlcCiAJCQkub3duZXIgPSBUSElTX01PRFVMRSwJXAogCQkJLm1pbl91ViA9IChtaW4pLAlcCiAJCQkudVZfc3RlcCA9IChzdGVwKSwJXApAQCAtMjA3LDI1ICsyMTIsNDUgQEAKIAkJLnN0YnlfbWFzayA9IDB4MjAsCVwKIAl9CiAKKy8qIFBGVVpFMTAwICovCiBzdGF0aWMgc3RydWN0IHBmdXplX3JlZ3VsYXRvciBwZnV6ZTEwMF9yZWd1bGF0b3JzW10gPSB7Ci0JUEZVWkUxMDBfU1dfUkVHKFNXMUFCLCBQRlVaRTEwMF9TVzFBQlZPTCwgMzAwMDAwLCAxODc1MDAwLCAyNTAwMCksCi0JUEZVWkUxMDBfU1dfUkVHKFNXMUMsIFBGVVpFMTAwX1NXMUNWT0wsIDMwMDAwMCwgMTg3NTAwMCwgMjUwMDApLAotCVBGVVpFMTAwX1NXX1JFRyhTVzIsIFBGVVpFMTAwX1NXMlZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCi0JUEZVWkUxMDBfU1dfUkVHKFNXM0EsIFBGVVpFMTAwX1NXM0FWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAotCVBGVVpFMTAwX1NXX1JFRyhTVzNCLCBQRlVaRTEwMF9TVzNCVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKLQlQRlVaRTEwMF9TV19SRUcoU1c0LCBQRlVaRTEwMF9TVzRWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAotCVBGVVpFMTAwX1NXQl9SRUcoU1dCU1QsIFBGVVpFMTAwX1NXQlNUQ09OMSwgMHgzICwgcGZ1emUxMDBfc3dic3QpLAotCVBGVVpFMTAwX1NXQl9SRUcoVlNOVlMsIFBGVVpFMTAwX1ZTTlZTVk9MLCAweDcsIHBmdXplMTAwX3ZzbnZzKSwKLQlQRlVaRTEwMF9GSVhFRF9SRUcoVlJFRkREUiwgUEZVWkUxMDBfVlJFRkREUkNPTiwgNzUwMDAwKSwKLQlQRlVaRTEwMF9WR0VOX1JFRyhWR0VOMSwgUEZVWkUxMDBfVkdFTjFWT0wsIDgwMDAwMCwgMTU1MDAwMCwgNTAwMDApLAotCVBGVVpFMTAwX1ZHRU5fUkVHKFZHRU4yLCBQRlVaRTEwMF9WR0VOMlZPTCwgODAwMDAwLCAxNTUwMDAwLCA1MDAwMCksCi0JUEZVWkUxMDBfVkdFTl9SRUcoVkdFTjMsIFBGVVpFMTAwX1ZHRU4zVk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAotCVBGVVpFMTAwX1ZHRU5fUkVHKFZHRU40LCBQRlVaRTEwMF9WR0VONFZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKLQlQRlVaRTEwMF9WR0VOX1JFRyhWR0VONSwgUEZVWkUxMDBfVkdFTjVWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCi0JUEZVWkUxMDBfVkdFTl9SRUcoVkdFTjYsIFBGVVpFMTAwX1ZHRU42Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1cxQUIsIFBGVVpFMTAwX1NXMUFCVk9MLCAzMDAwMDAsIDE4NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUxMDAsIFNXMUMsIFBGVVpFMTAwX1NXMUNWT0wsIDMwMDAwMCwgMTg3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1cyLCBQRlVaRTEwMF9TVzJWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXX1JFRyhQRlVaRTEwMCwgU1czQSwgUEZVWkUxMDBfU1czQVZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMTAwLCBTVzNCLCBQRlVaRTEwMF9TVzNCVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUxMDAsIFNXNCwgUEZVWkUxMDBfU1c0Vk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV0JfUkVHKFBGVVpFMTAwLCBTV0JTVCwgUEZVWkUxMDBfU1dCU1RDT04xLCAweDMgLCBwZnV6ZTEwMF9zd2JzdCksCisJUEZVWkUxMDBfU1dCX1JFRyhQRlVaRTEwMCwgVlNOVlMsIFBGVVpFMTAwX1ZTTlZTVk9MLCAweDcsIHBmdXplMTAwX3ZzbnZzKSwKKwlQRlVaRTEwMF9GSVhFRF9SRUcoUEZVWkUxMDAsIFZSRUZERFIsIFBGVVpFMTAwX1ZSRUZERFJDT04sIDc1MDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU4xLCBQRlVaRTEwMF9WR0VOMVZPTCwgODAwMDAwLCAxNTUwMDAwLCA1MDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU4yLCBQRlVaRTEwMF9WR0VOMlZPTCwgODAwMDAwLCAxNTUwMDAwLCA1MDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU4zLCBQRlVaRTEwMF9WR0VOM1ZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTEwMCwgVkdFTjQsIFBGVVpFMTAwX1ZHRU40Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMTAwLCBWR0VONSwgUEZVWkUxMDBfVkdFTjVWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUxMDAsIFZHRU42LCBQRlVaRTEwMF9WR0VONlZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGZ1emVfcmVndWxhdG9yIHBmdXplMjAwX3JlZ3VsYXRvcnNbXSA9IHsKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUyMDAsIFNXMUFCLCBQRlVaRTEwMF9TVzFBQlZPTCwgMzAwMDAwLCAxODc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMjAwLCBTVzIsIFBGVVpFMTAwX1NXMlZPTCwgNDAwMDAwLCAxOTc1MDAwLCAyNTAwMCksCisJUEZVWkUxMDBfU1dfUkVHKFBGVVpFMjAwLCBTVzNBLCBQRlVaRTEwMF9TVzNBVk9MLCA0MDAwMDAsIDE5NzUwMDAsIDI1MDAwKSwKKwlQRlVaRTEwMF9TV19SRUcoUEZVWkUyMDAsIFNXM0IsIFBGVVpFMTAwX1NXM0JWT0wsIDQwMDAwMCwgMTk3NTAwMCwgMjUwMDApLAorCVBGVVpFMTAwX1NXQl9SRUcoUEZVWkUyMDAsIFNXQlNULCBQRlVaRTEwMF9TV0JTVENPTjEsIDB4MyAsIHBmdXplMTAwX3N3YnN0KSwKKwlQRlVaRTEwMF9TV0JfUkVHKFBGVVpFMjAwLCBWU05WUywgUEZVWkUxMDBfVlNOVlNWT0wsIDB4NywgcGZ1emUxMDBfdnNudnMpLAorCVBGVVpFMTAwX0ZJWEVEX1JFRyhQRlVaRTIwMCwgVlJFRkREUiwgUEZVWkUxMDBfVlJFRkREUkNPTiwgNzUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjEsIFBGVVpFMTAwX1ZHRU4xVk9MLCA4MDAwMDAsIDE1NTAwMDAsIDUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjIsIFBGVVpFMTAwX1ZHRU4yVk9MLCA4MDAwMDAsIDE1NTAwMDAsIDUwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjMsIFBGVVpFMTAwX1ZHRU4zVk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorCVBGVVpFMTAwX1ZHRU5fUkVHKFBGVVpFMjAwLCBWR0VONCwgUEZVWkUxMDBfVkdFTjRWT0wsIDE4MDAwMDAsIDMzMDAwMDAsIDEwMDAwMCksCisJUEZVWkUxMDBfVkdFTl9SRUcoUEZVWkUyMDAsIFZHRU41LCBQRlVaRTEwMF9WR0VONVZPTCwgMTgwMDAwMCwgMzMwMDAwMCwgMTAwMDAwKSwKKwlQRlVaRTEwMF9WR0VOX1JFRyhQRlVaRTIwMCwgVkdFTjYsIFBGVVpFMTAwX1ZHRU42Vk9MLCAxODAwMDAwLCAzMzAwMDAwLCAxMDAwMDApLAorfTsKKworc3RhdGljIHN0cnVjdCBwZnV6ZV9yZWd1bGF0b3IgKnBmdXplX3JlZ3VsYXRvcnM7CisKICNpZmRlZiBDT05GSUdfT0YKKy8qIFBGVVpFMTAwICovCiBzdGF0aWMgc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCBwZnV6ZTEwMF9tYXRjaGVzW10gPSB7CiAJeyAubmFtZSA9ICJzdzFhYiIsCX0sCiAJeyAubmFtZSA9ICJzdzFjIiwJfSwKQEAgLTI0NCwyNCArMjY5LDU2IEBACiAJeyAubmFtZSA9ICJ2Z2VuNiIsCX0sCiB9OwogCisvKiBQRlVaRTIwMCAqLworc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggcGZ1emUyMDBfbWF0Y2hlc1tdID0geworCisJeyAubmFtZSA9ICJzdzFhYiIsCX0sCisJeyAubmFtZSA9ICJzdzIiLAl9LAorCXsgLm5hbWUgPSAic3czYSIsCX0sCisJeyAubmFtZSA9ICJzdzNiIiwJfSwKKwl7IC5uYW1lID0gInN3YnN0IiwJfSwKKwl7IC5uYW1lID0gInZzbnZzIiwJfSwKKwl7IC5uYW1lID0gInZyZWZkZHIiLAl9LAorCXsgLm5hbWUgPSAidmdlbjEiLAl9LAorCXsgLm5hbWUgPSAidmdlbjIiLAl9LAorCXsgLm5hbWUgPSAidmdlbjMiLAl9LAorCXsgLm5hbWUgPSAidmdlbjQiLAl9LAorCXsgLm5hbWUgPSAidmdlbjUiLAl9LAorCXsgLm5hbWUgPSAidmdlbjYiLAl9LAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKnBmdXplX21hdGNoZXM7CisKIHN0YXRpYyBpbnQgcGZ1emVfcGFyc2VfcmVndWxhdG9yc19kdChzdHJ1Y3QgcGZ1emVfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjaGlwLT5kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnBhcmVudDsKIAlpbnQgcmV0OwogCi0JbnAgPSBvZl9ub2RlX2dldChkZXYtPnBhcmVudC0+b2Zfbm9kZSk7CisJbnAgPSBvZl9ub2RlX2dldChkZXYtPm9mX25vZGUpOwogCWlmICghbnApCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBhcmVudCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOworCXBhcmVudCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwogCWlmICghcGFyZW50KSB7CiAJCWRldl9lcnIoZGV2LCAicmVndWxhdG9ycyBub2RlIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIHBhcmVudCwgcGZ1emUxMDBfbWF0Y2hlcywKLQkJCQkgQVJSQVlfU0laRShwZnV6ZTEwMF9tYXRjaGVzKSk7CisJc3dpdGNoIChjaGlwLT5jaGlwX2lkKSB7CisJY2FzZSBQRlVaRTIwMDoKKwkJcGZ1emVfbWF0Y2hlcyA9IHBmdXplMjAwX21hdGNoZXM7CisJCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIHBhcmVudCwgcGZ1emUyMDBfbWF0Y2hlcywKKwkJCQkJIEFSUkFZX1NJWkUocGZ1emUyMDBfbWF0Y2hlcykpOworCQlicmVhazsKKworCWNhc2UgUEZVWkUxMDA6CisJZGVmYXVsdDoKKwkJcGZ1emVfbWF0Y2hlcyA9IHBmdXplMTAwX21hdGNoZXM7CisJCXJldCA9IG9mX3JlZ3VsYXRvcl9tYXRjaChkZXYsIHBhcmVudCwgcGZ1emUxMDBfbWF0Y2hlcywKKwkJCQkJIEFSUkFZX1NJWkUocGZ1emUxMDBfbWF0Y2hlcykpOworCQlicmVhazsKKwl9CiAKIAlvZl9ub2RlX3B1dChwYXJlbnQpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0yNzUsMTIgKzMzMiwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICptYXRjaF9pbml0X2RhdGEoaW50IGluZGV4KQogewotCXJldHVybiBwZnV6ZTEwMF9tYXRjaGVzW2luZGV4XS5pbml0X2RhdGE7CisJcmV0dXJuIHBmdXplX21hdGNoZXNbaW5kZXhdLmluaXRfZGF0YTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm1hdGNoX29mX25vZGUoaW50IGluZGV4KQogewotCXJldHVybiBwZnV6ZTEwMF9tYXRjaGVzW2luZGV4XS5vZl9ub2RlOworCXJldHVybiBwZnV6ZV9tYXRjaGVzW2luZGV4XS5vZl9ub2RlOwogfQogI2Vsc2UKIHN0YXRpYyBpbnQgcGZ1emVfcGFyc2VfcmVndWxhdG9yc19kdChzdHJ1Y3QgcGZ1emVfY2hpcCAqY2hpcCkKQEAgLTMwOCwxNiArMzY1LDE0IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXN3aXRjaCAodmFsdWUgJiAweDBmKSB7Ci0JLyoKLQkgKiBGcmVlc2NhbGUgbWlzcHJvZ3JhbW1lZCAxLTMlIG9mIHBhcnRzIHByaW9yIHRvIHdlZWsgOCBvZiAyMDEzCi0JICogYXMgSUQ9OAotCSAqLwotCWNhc2UgMHg4OgorCWlmICgoKHZhbHVlICYgMHgwZikgPT0gMHg4KSAmJiAocGZ1emVfY2hpcC0+Y2hpcF9pZCA9PSBQRlVaRTEwMCkpIHsKKwkJLyoKKwkJICogRnJlZXNjYWxlIG1pc3Byb2dyYW1tZWQgMS0zJSBvZiBwYXJ0cyBwcmlvciB0byB3ZWVrIDggb2YgMjAxMworCQkgKiBhcyBJRD04IGluIFBGVVpFMTAwCisJCSAqLwogCQlkZXZfaW5mbyhwZnV6ZV9jaGlwLT5kZXYsICJBc3N1bWluZyBtaXNwcm9ncmFtbWVkIElEPTB4OCIpOwotCWNhc2UgMHgwOgotCQlicmVhazsKLQlkZWZhdWx0OgorCX0gZWxzZSBpZiAoKHZhbHVlICYgMHgwZikgIT0gcGZ1emVfY2hpcC0+Y2hpcF9pZCkgeworCQkvKiBkZXZpY2UgaWQgTk9UIG1hdGNoIHdpdGggeW91ciBzZXR0aW5nICovCiAJCWRldl93YXJuKHBmdXplX2NoaXAtPmRldiwgIklsbGVnYWwgSUQ6ICV4XG4iLCB2YWx1ZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTM1MywxNyArNDA4LDMxIEBACiAJICAgIGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJaW50IGksIHJldDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwl1MzIgcmVndWxhdG9yX251bTsKKwl1MzIgc3dfY2hlY2tfc3RhcnQsIHN3X2NoZWNrX2VuZDsKIAogCXBmdXplX2NoaXAgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnBmdXplX2NoaXApLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZnV6ZV9jaGlwKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWlmIChjbGllbnQtPmRldi5vZl9ub2RlKSB7CisJCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihwZnV6ZV9kdF9pZHMpLAorCQkJCSZjbGllbnQtPmRldik7CisJCWlmICghbWF0Y2gpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXJyb3I6IE5vIGRldmljZSBtYXRjaCBmb3VuZFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlwZnV6ZV9jaGlwLT5jaGlwX2lkID0gKGludCkobG9uZyltYXRjaC0+ZGF0YTsKKwl9IGVsc2UgaWYgKGlkKSB7CisJCXBmdXplX2NoaXAtPmNoaXBfaWQgPSBpZC0+ZHJpdmVyX2RhdGE7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJObyBkdHMgbWF0Y2ggb3IgaWQgdGFibGUgbWF0Y2ggZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwZnV6ZV9jaGlwKTsKLQotCW1lbWNweShwZnV6ZV9jaGlwLT5yZWd1bGF0b3JfZGVzY3MsIHBmdXplMTAwX3JlZ3VsYXRvcnMsCi0JCXNpemVvZihwZnV6ZV9jaGlwLT5yZWd1bGF0b3JfZGVzY3MpKTsKLQogCXBmdXplX2NoaXAtPmRldiA9ICZjbGllbnQtPmRldjsKIAogCXBmdXplX2NoaXAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnBmdXplX3JlZ21hcF9jb25maWcpOwpAQCAtMzgwLDExICs0NDksMzQgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKiB1c2UgdGhlIHJpZ2h0IHJlZ3VsYXRvcnMgYWZ0ZXIgaWRlbnRpZnkgdGhlIHJpZ2h0IGRldmljZSAqLworCXN3aXRjaCAocGZ1emVfY2hpcC0+Y2hpcF9pZCkgeworCWNhc2UgUEZVWkUyMDA6CisJCXBmdXplX3JlZ3VsYXRvcnMgPSBwZnV6ZTIwMF9yZWd1bGF0b3JzOworCQlyZWd1bGF0b3JfbnVtID0gQVJSQVlfU0laRShwZnV6ZTIwMF9yZWd1bGF0b3JzKTsKKwkJc3dfY2hlY2tfc3RhcnQgPSBQRlVaRTIwMF9TVzI7CisJCXN3X2NoZWNrX2VuZCA9IFBGVVpFMjAwX1NXM0I7CisJCWJyZWFrOworCisJY2FzZSBQRlVaRTEwMDoKKwlkZWZhdWx0OgorCQlwZnV6ZV9yZWd1bGF0b3JzID0gcGZ1emUxMDBfcmVndWxhdG9yczsKKwkJcmVndWxhdG9yX251bSA9IEFSUkFZX1NJWkUocGZ1emUxMDBfcmVndWxhdG9ycyk7CisJCXN3X2NoZWNrX3N0YXJ0ID0gUEZVWkUxMDBfU1cyOworCQlzd19jaGVja19lbmQgPSBQRlVaRTEwMF9TVzQ7CisJCWJyZWFrOworCX0KKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJwZnV6ZSVzIGZvdW5kLlxuIiwKKwkJKHBmdXplX2NoaXAtPmNoaXBfaWQgPT0gUEZVWkUxMDApID8gIjEwMCIgOiAiMjAwIik7CisKKwltZW1jcHkocGZ1emVfY2hpcC0+cmVndWxhdG9yX2Rlc2NzLCBwZnV6ZV9yZWd1bGF0b3JzLAorCQlzaXplb2YocGZ1emVfY2hpcC0+cmVndWxhdG9yX2Rlc2NzKSk7CisKIAlyZXQgPSBwZnV6ZV9wYXJzZV9yZWd1bGF0b3JzX2R0KHBmdXplX2NoaXApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUEZVWkUxMDBfTUFYX1JFR1VMQVRPUjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHJlZ3VsYXRvcl9udW07IGkrKykgewogCQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhOwogCQlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2M7CiAJCWludCB2YWw7CkBAIC0zOTcsNyArNDg5LDcgQEAKIAkJCWluaXRfZGF0YSA9IG1hdGNoX2luaXRfZGF0YShpKTsKIAogCQkvKiBTVzJ+U1c0IGhpZ2ggYml0IGNoZWNrIGFuZCBtb2RpZnkgdGhlIHZvbHRhZ2UgdmFsdWUgdGFibGUgKi8KLQkJaWYgKGkgPiBQRlVaRTEwMF9TVzFDICYmIGkgPCBQRlVaRTEwMF9TV0JTVCkgeworCQlpZiAoaSA+PSBzd19jaGVja19zdGFydCAmJiBpIDw9IHN3X2NoZWNrX2VuZCkgewogCQkJcmVnbWFwX3JlYWQocGZ1emVfY2hpcC0+cmVnbWFwLCBkZXNjLT52c2VsX3JlZywgJnZhbCk7CiAJCQlpZiAodmFsICYgMHg0MCkgewogCQkJCWRlc2MtPm1pbl91ViA9IDgwMDAwMDsKQEAgLTQxNSw3ICs1MDcsNyBAQAogCQkJZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBkZXNjLCAmY29uZmlnKTsKIAkJaWYgKElTX0VSUihwZnV6ZV9jaGlwLT5yZWd1bGF0b3JzW2ldKSkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWdpc3RlciByZWd1bGF0b3IlcyBmYWlsZWRcbiIsCi0JCQkJcGZ1emUxMDBfcmVndWxhdG9yc1tpXS5kZXNjLm5hbWUpOworCQkJCXBmdXplX3JlZ3VsYXRvcnNbaV0uZGVzYy5uYW1lKTsKIAkJCXJldHVybiBQVFJfRVJSKHBmdXplX2NoaXAtPnJlZ3VsYXRvcnNbaV0pOwogCQl9CiAJfQpAQCAtNDM1LDYgKzUyNyw2IEBACiBtb2R1bGVfaTJjX2RyaXZlcihwZnV6ZV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJSb2JpbiBHb25nIDxiMzgzNDNAZnJlZXNjYWxlLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUmVndWxhdG9yIERyaXZlciBmb3IgRnJlZXNjYWxlIFBGVVpFMTAwIFBNSUMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVndWxhdG9yIERyaXZlciBmb3IgRnJlZXNjYWxlIFBGVVpFMTAwL1BGVVpFMjAwIFBNSUMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9BTElBUygiaTJjOnBmdXplMTAwLXJlZ3VsYXRvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcmM1dDU4My1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3JjNXQ1ODMtcmVndWxhdG9yLmMKaW5kZXggYjU4YWZmYi4uNGM0MTRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcmM1dDU4My1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9yYzV0NTgzLXJlZ3VsYXRvci5jCkBAIC0xMTksNyArMTE5LDYgQEAKIHsKIAlzdHJ1Y3QgcmM1dDU4MyAqcmM1dDU4MyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgcmM1dDU4M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocmM1dDU4My0+ZGV2KTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCXN0cnVjdCByYzV0NTgzX3JlZ3VsYXRvciAqcmVnID0gTlVMTDsKIAlzdHJ1Y3QgcmM1dDU4M19yZWd1bGF0b3IgKnJlZ3M7CkBAIC0xMzUsMTkgKzEzNCwxMSBAQAogCiAJcmVncyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBSQzVUNTgzX1JFR1VMQVRPUl9NQVggKgogCQkJc2l6ZW9mKHN0cnVjdCByYzV0NTgzX3JlZ3VsYXRvciksIEdGUF9LRVJORUwpOwotCWlmICghcmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZXhpdGluZy4uXG4iKTsKKwlpZiAoIXJlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCiAJZm9yIChpZCA9IDA7IGlkIDwgUkM1VDU4M19SRUdVTEFUT1JfTUFYOyArK2lkKSB7Ci0JCXJlZ19kYXRhID0gcGRhdGEtPnJlZ19pbml0X2RhdGFbaWRdOwotCi0JCS8qIE5vIG5lZWQgdG8gcmVnaXN0ZXIgaWYgdGhlcmUgaXMgbm8gcmVndWxhdG9yIGRhdGEgKi8KLQkJaWYgKCFyZWdfZGF0YSkKLQkJCWNvbnRpbnVlOwotCiAJCXJlZyA9ICZyZWdzW2lkXTsKIAkJcmkgPSAmcmM1dDU4M19yZWdfaW5mb1tpZF07CiAJCXJlZy0+cmVnX2luZm8gPSByaTsKQEAgLTE2OSw3ICsxNjAsNyBAQAogCiBza2lwX2V4dF9wd3JfY29uZmlnOgogCQljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKLQkJY29uZmlnLmluaXRfZGF0YSA9IHJlZ19kYXRhOworCQljb25maWcuaW5pdF9kYXRhID0gcGRhdGEtPnJlZ19pbml0X2RhdGFbaWRdOwogCQljb25maWcuZHJpdmVyX2RhdGEgPSByZWc7CiAJCWNvbmZpZy5yZWdtYXAgPSByYzV0NTgzLT5yZWdtYXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3MybXBhMDEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3MybXBhMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhiM2FhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvczJtcGEwMS5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2Ftc3VuZy9zMm1wYTAxLmg+CisKKyNkZWZpbmUgUzJNUEEwMV9SRUdVTEFUT1JfQ05UIEFSUkFZX1NJWkUocmVndWxhdG9ycykKKworc3RydWN0IHMybXBhMDFfaW5mbyB7CisJaW50IHJhbXBfZGVsYXkyNDsKKwlpbnQgcmFtcF9kZWxheTM7CisJaW50IHJhbXBfZGVsYXk1OworCWludCByYW1wX2RlbGF5MTY7CisJaW50IHJhbXBfZGVsYXk3OworCWludCByYW1wX2RlbGF5ODkxMDsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3JhbXBfZGVsYXkoaW50IHJhbXBfZGVsYXkpCit7CisJdW5zaWduZWQgY2hhciBjbnQgPSAwOworCisJcmFtcF9kZWxheSAvPSA2MjUwOworCisJd2hpbGUgKHRydWUpIHsKKwkJcmFtcF9kZWxheSA9IHJhbXBfZGVsYXkgPj4gMTsKKwkJaWYgKHJhbXBfZGVsYXkgPT0gMCkKKwkJCWJyZWFrOworCQljbnQrKzsKKwl9CisKKwlpZiAoY250ID4gMykKKwkJY250ID0gMzsKKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgczJtcGEwMV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgdW5zaWduZWQgaW50IG9sZF9zZWxlY3RvciwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbmV3X3NlbGVjdG9yKQoreworCXN0cnVjdCBzMm1wYTAxX2luZm8gKnMybXBhMDEgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXVuc2lnbmVkIGludCByYW1wX2RlbGF5ID0gMDsKKwlpbnQgb2xkX3ZvbHQsIG5ld192b2x0OworCisJc3dpdGNoIChyZGV2LT5kZXNjLT5pZCkgeworCWNhc2UgUzJNUEEwMV9CVUNLMjoKKwljYXNlIFMyTVBBMDFfQlVDSzQ6CisJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5MjQ7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLMzoKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkzOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzU6CisJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5NTsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0sxOgorCWNhc2UgUzJNUEEwMV9CVUNLNjoKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkxNjsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s3OgorCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTc7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLODoKKwljYXNlIFMyTVBBMDFfQlVDSzk6CisJY2FzZSBTMk1QQTAxX0JVQ0sxMDoKKwkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXk4OTEwOworCQlicmVhazsKKwl9CisKKwlpZiAocmFtcF9kZWxheSA9PSAwKQorCQlyYW1wX2RlbGF5ID0gcmRldi0+ZGVzYy0+cmFtcF9kZWxheTsKKworCW9sZF92b2x0ID0gcmRldi0+ZGVzYy0+bWluX3VWICsgKHJkZXYtPmRlc2MtPnVWX3N0ZXAgKiBvbGRfc2VsZWN0b3IpOworCW5ld192b2x0ID0gcmRldi0+ZGVzYy0+bWluX3VWICsgKHJkZXYtPmRlc2MtPnVWX3N0ZXAgKiBuZXdfc2VsZWN0b3IpOworCisJcmV0dXJuIERJVl9ST1VORF9VUChhYnMobmV3X3ZvbHQgLSBvbGRfdm9sdCksIHJhbXBfZGVsYXkpOworfQorCitzdGF0aWMgaW50IHMybXBhMDFfc2V0X3JhbXBfZGVsYXkoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCByYW1wX2RlbGF5KQoreworCXN0cnVjdCBzMm1wYTAxX2luZm8gKnMybXBhMDEgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXVuc2lnbmVkIGludCByYW1wX3ZhbCwgcmFtcF9zaGlmdCwgcmFtcF9yZWcgPSBTMk1QQTAxX1JFR19SQU1QMjsKKwl1bnNpZ25lZCBpbnQgcmFtcF9lbmFibGUgPSAxLCBlbmFibGVfc2hpZnQgPSAwOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJkZXYtPmRlc2MtPmlkKSB7CisJY2FzZSBTMk1QQTAxX0JVQ0sxOgorCQllbmFibGVfc2hpZnQgPSBTMk1QQTAxX0JVQ0sxX1JBTVBfRU5fU0hJRlQ7CisJCWlmICghcmFtcF9kZWxheSkgeworCQkJcmFtcF9lbmFibGUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmFtcF9kZWxheSA+IHMybXBhMDEtPnJhbXBfZGVsYXkxNikKKwkJCXMybXBhMDEtPnJhbXBfZGVsYXkxNiA9IHJhbXBfZGVsYXk7CisJCWVsc2UKKwkJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5MTY7CisKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzE2X1JBTVBfU0hJRlQ7CisJCXJhbXBfcmVnID0gUzJNUEEwMV9SRUdfUkFNUDE7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLMjoKKwkJZW5hYmxlX3NoaWZ0ID0gUzJNUEEwMV9CVUNLMl9SQU1QX0VOX1NISUZUOworCQlpZiAoIXJhbXBfZGVsYXkpIHsKKwkJCXJhbXBfZW5hYmxlID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJhbXBfZGVsYXkgPiBzMm1wYTAxLT5yYW1wX2RlbGF5MjQpCisJCQlzMm1wYTAxLT5yYW1wX2RlbGF5MjQgPSByYW1wX2RlbGF5OworCQllbHNlCisJCQlyYW1wX2RlbGF5ID0gczJtcGEwMS0+cmFtcF9kZWxheTI0OworCisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0syNF9SQU1QX1NISUZUOworCQlyYW1wX3JlZyA9IFMyTVBBMDFfUkVHX1JBTVAxOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzM6CisJCWVuYWJsZV9zaGlmdCA9IFMyTVBBMDFfQlVDSzNfUkFNUF9FTl9TSElGVDsKKwkJaWYgKCFyYW1wX2RlbGF5KSB7CisJCQlyYW1wX2VuYWJsZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXMybXBhMDEtPnJhbXBfZGVsYXkzID0gcmFtcF9kZWxheTsKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzNfUkFNUF9TSElGVDsKKwkJcmFtcF9yZWcgPSBTMk1QQTAxX1JFR19SQU1QMTsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s0OgorCQllbmFibGVfc2hpZnQgPSBTMk1QQTAxX0JVQ0s0X1JBTVBfRU5fU0hJRlQ7CisJCWlmICghcmFtcF9kZWxheSkgeworCQkJcmFtcF9lbmFibGUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmFtcF9kZWxheSA+IHMybXBhMDEtPnJhbXBfZGVsYXkyNCkKKwkJCXMybXBhMDEtPnJhbXBfZGVsYXkyNCA9IHJhbXBfZGVsYXk7CisJCWVsc2UKKwkJCXJhbXBfZGVsYXkgPSBzMm1wYTAxLT5yYW1wX2RlbGF5MjQ7CisKKwkJcmFtcF9zaGlmdCA9IFMyTVBBMDFfQlVDSzI0X1JBTVBfU0hJRlQ7CisJCXJhbXBfcmVnID0gUzJNUEEwMV9SRUdfUkFNUDE7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLNToKKwkJczJtcGEwMS0+cmFtcF9kZWxheTUgPSByYW1wX2RlbGF5OworCQlyYW1wX3NoaWZ0ID0gUzJNUEEwMV9CVUNLNV9SQU1QX1NISUZUOworCQlicmVhazsKKwljYXNlIFMyTVBBMDFfQlVDSzY6CisJCWlmIChyYW1wX2RlbGF5ID4gczJtcGEwMS0+cmFtcF9kZWxheTE2KQorCQkJczJtcGEwMS0+cmFtcF9kZWxheTE2ID0gcmFtcF9kZWxheTsKKwkJZWxzZQorCQkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXkxNjsKKworCQlyYW1wX3NoaWZ0ID0gUzJNUEEwMV9CVUNLMTZfUkFNUF9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBTMk1QQTAxX0JVQ0s3OgorCQlzMm1wYTAxLT5yYW1wX2RlbGF5NyA9IHJhbXBfZGVsYXk7CisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0s3X1JBTVBfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgUzJNUEEwMV9CVUNLODoKKwljYXNlIFMyTVBBMDFfQlVDSzk6CisJY2FzZSBTMk1QQTAxX0JVQ0sxMDoKKwkJaWYgKHJhbXBfZGVsYXkgPiBzMm1wYTAxLT5yYW1wX2RlbGF5ODkxMCkKKwkJCXMybXBhMDEtPnJhbXBfZGVsYXk4OTEwID0gcmFtcF9kZWxheTsKKwkJZWxzZQorCQkJcmFtcF9kZWxheSA9IHMybXBhMDEtPnJhbXBfZGVsYXk4OTEwOworCisJCXJhbXBfc2hpZnQgPSBTMk1QQTAxX0JVQ0s4OTEwX1JBTVBfU0hJRlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWlmICghcmFtcF9lbmFibGUpCisJCWdvdG8gcmFtcF9kaXNhYmxlOworCisJaWYgKGVuYWJsZV9zaGlmdCkgeworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCBTMk1QQTAxX1JFR19SQU1QMSwKKwkJCQkJMSA8PCBlbmFibGVfc2hpZnQsIDEgPDwgZW5hYmxlX3NoaWZ0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcmRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSByYW1wIHJhdGVcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJhbXBfdmFsID0gZ2V0X3JhbXBfZGVsYXkocmFtcF9kZWxheSk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmFtcF9yZWcsIDB4MyA8PCByYW1wX3NoaWZ0LAorCQkJCSAgcmFtcF92YWwgPDwgcmFtcF9zaGlmdCk7CisKK3JhbXBfZGlzYWJsZToKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgUzJNUEEwMV9SRUdfUkFNUDEsCisJCQkJICAxIDw8IGVuYWJsZV9zaGlmdCwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBzMm1wYTAxX2xkb19vcHMgPSB7CisJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKKwkubWFwX3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhciwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHMybXBhMDFfYnVja19vcHMgPSB7CisJLmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKKwkubWFwX3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhciwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gczJtcGEwMV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwsCisJLnNldF9yYW1wX2RlbGF5CQk9IHMybXBhMDFfc2V0X3JhbXBfZGVsYXksCit9OworCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2xkbzEobnVtKQl7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUEEwMV9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2xkb19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfTERPX01JTiwJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfTERPX1NURVAxLAkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUEEwMV9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJXAorfQorI2RlZmluZSByZWd1bGF0b3JfZGVzY19sZG8yKG51bSkJewkJXAorCS5uYW1lCQk9ICJMRE8iI251bSwJCQlcCisJLmlkCQk9IFMyTVBBMDFfTERPIyNudW0sCQlcCisJLm9wcwkJPSAmczJtcGEwMV9sZG9fb3BzLAkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0xET19NSU4sCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0xET19TVEVQMiwJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBBMDFfTERPX05fVk9MVEFHRVMsCVwKKwkudnNlbF9yZWcJPSBTMk1QQTAxX1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfTERPX1ZTRUxfTUFTSywJXAorCS5lbmFibGVfcmVnCT0gUzJNUEEwMV9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBBMDFfRU5BQkxFX01BU0sJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrMV80KG51bSkJewkJCVwKKwkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSyMjbnVtLAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMSwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDEsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0IxQ1RSTDIgKyAobnVtIC0gMSkgKiAyLAlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19CMUNUUkwxICsgKG51bSAtIDEpICogMiwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBBMDFfRU5BQkxFX01BU0sJCQlcCit9CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazUJewkJCQlcCisJLm5hbWUJCT0gIkJVQ0s1IiwJCQkJXAorCS5pZAkJPSBTMk1QQTAxX0JVQ0s1LAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMiwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDEsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0I1Q1RSTDIsCQkJXAorCS52c2VsX21hc2sJPSBTMk1QQTAxX0JVQ0tfVlNFTF9NQVNLLAkJXAorCS5lbmFibGVfcmVnCT0gUzJNUEEwMV9SRUdfQjVDVFJMMSwJCQlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrNl83KG51bSkJewkJCVwKKwkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSyMjbnVtLAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMSwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDEsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0I2Q1RSTDIgKyAobnVtIC0gNikgKiAyLAlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19CNkNUUkwxICsgKG51bSAtIDYpICogMiwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBBMDFfRU5BQkxFX01BU0sJCQlcCit9CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazgJewkJCQlcCisJLm5hbWUJCT0gIkJVQ0s4IiwJCQkJXAorCS5pZAkJPSBTMk1QQTAxX0JVQ0s4LAkJCVwKKwkub3BzCQk9ICZzMm1wYTAxX2J1Y2tfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QQTAxX0JVQ0tfTUlOMiwJCQlcCisJLnVWX3N0ZXAJPSBTMk1QQTAxX0JVQ0tfU1RFUDIsCQkJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMsCQlcCisJLnJhbXBfZGVsYXkJPSBTMk1QQTAxX1JBTVBfREVMQVksCQkJXAorCS52c2VsX3JlZwk9IFMyTVBBMDFfUkVHX0I4Q1RSTDIsCQkJXAorCS52c2VsX21hc2sJPSBTMk1QQTAxX0JVQ0tfVlNFTF9NQVNLLAkJXAorCS5lbmFibGVfcmVnCT0gUzJNUEEwMV9SRUdfQjhDVFJMMSwJCQlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrOQl7CQkJCVwKKwkubmFtZQkJPSAiQlVDSzkiLAkJCQlcCisJLmlkCQk9IFMyTVBBMDFfQlVDSzksCQkJXAorCS5vcHMJCT0gJnMybXBhMDFfYnVja19vcHMsCQkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJCVwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCQkJCVwKKwkubWluX3VWCQk9IFMyTVBBMDFfQlVDS19NSU40LAkJCVwKKwkudVZfc3RlcAk9IFMyTVBBMDFfQlVDS19TVEVQMiwJCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QQTAxX0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBBMDFfUkFNUF9ERUxBWSwJCQlcCisJLnZzZWxfcmVnCT0gUzJNUEEwMV9SRUdfQjlDVFJMMiwJCQlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19COUNUUkwxLAkJCVwKKwkuZW5hYmxlX21hc2sJPSBTMk1QQTAxX0VOQUJMRV9NQVNLCQkJXAorfQorCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2sxMAl7CQkJCVwKKwkubmFtZQkJPSAiQlVDSzEwIiwJCQkJXAorCS5pZAkJPSBTMk1QQTAxX0JVQ0sxMCwJCQlcCisJLm9wcwkJPSAmczJtcGEwMV9idWNrX29wcywJCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQkJXAorCS5taW5fdVYJCT0gUzJNUEEwMV9CVUNLX01JTjMsCQkJXAorCS51Vl9zdGVwCT0gUzJNUEEwMV9CVUNLX1NURVAyLAkJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBBMDFfQlVDS19OX1ZPTFRBR0VTLAkJXAorCS5yYW1wX2RlbGF5CT0gUzJNUEEwMV9SQU1QX0RFTEFZLAkJCVwKKwkudnNlbF9yZWcJPSBTMk1QQTAxX1JFR19CMTBDVFJMMiwJCQlcCisJLnZzZWxfbWFzawk9IFMyTVBBMDFfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QQTAxX1JFR19CMTBDVFJMMSwJCQlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUEEwMV9FTkFCTEVfTUFTSwkJCVwKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfZGVzYyByZWd1bGF0b3JzW10gPSB7CisJcmVndWxhdG9yX2Rlc2NfbGRvMigxKSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDIpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzEoMyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSg0KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDUpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzIoNiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSg3KSwKKwlyZWd1bGF0b3JfZGVzY19sZG8xKDgpLAorCXJlZ3VsYXRvcl9kZXNjX2xkbzEoOSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxMCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMigxMSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxMiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxMyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxNyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxOCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgxOSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyMCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyMSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMigyMiksCisJcmVndWxhdG9yX2Rlc2NfbGRvMigyMyksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyNCksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyNSksCisJcmVndWxhdG9yX2Rlc2NfbGRvMSgyNiksCisJcmVndWxhdG9yX2Rlc2NfYnVjazFfNCgxKSwKKwlyZWd1bGF0b3JfZGVzY19idWNrMV80KDIpLAorCXJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQoMyksCisJcmVndWxhdG9yX2Rlc2NfYnVjazFfNCg0KSwKKwlyZWd1bGF0b3JfZGVzY19idWNrNSwKKwlyZWd1bGF0b3JfZGVzY19idWNrNl83KDYpLAorCXJlZ3VsYXRvcl9kZXNjX2J1Y2s2XzcoNyksCisJcmVndWxhdG9yX2Rlc2NfYnVjazgsCisJcmVndWxhdG9yX2Rlc2NfYnVjazksCisJcmVndWxhdG9yX2Rlc2NfYnVjazEwLAorfTsKKworc3RhdGljIGludCBzMm1wYTAxX3BtaWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2VjX3BtaWNfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc2VjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShpb2Rldi0+ZGV2KTsKKwlzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIHJkYXRhW1MyTVBBMDFfUkVHVUxBVE9SX01BWF07CisJc3RydWN0IGRldmljZV9ub2RlICpyZWdfbnAgPSBOVUxMOworCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKKwlzdHJ1Y3QgczJtcGEwMV9pbmZvICpzMm1wYTAxOworCWludCBpOworCisJczJtcGEwMSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnMybXBhMDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMybXBhMDEpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IFMyTVBBMDFfUkVHVUxBVE9SX0NOVDsgaSsrKQorCQlyZGF0YVtpXS5uYW1lID0gcmVndWxhdG9yc1tpXS5uYW1lOworCisJaWYgKGlvZGV2LT5kZXYtPm9mX25vZGUpIHsKKwkJcmVnX25wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoaW9kZXYtPmRldi0+b2Zfbm9kZSwKKwkJCQkJCQkicmVndWxhdG9ycyIpOworCQkJaWYgKCFyZWdfbnApIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJCSJjb3VsZCBub3QgZmluZCByZWd1bGF0b3JzIHN1Yi1ub2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQlvZl9yZWd1bGF0b3JfbWF0Y2goJnBkZXYtPmRldiwgcmVnX25wLCByZGF0YSwKKwkJCQkJCVMyTVBBMDFfUkVHVUxBVE9SX01BWCk7CisJCW9mX25vZGVfcHV0KHJlZ19ucCk7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgczJtcGEwMSk7CisKKwljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKKwljb25maWcucmVnbWFwID0gaW9kZXYtPnJlZ21hcF9wbWljOworCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHMybXBhMDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgUzJNUEEwMV9SRUdVTEFUT1JfTUFYOyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisJCWlmIChwZGF0YSkKKwkJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pbml0ZGF0YTsKKwkJZWxzZQorCQkJY29uZmlnLmluaXRfZGF0YSA9IHJkYXRhW2ldLmluaXRfZGF0YTsKKworCQlpZiAocmVnX25wKQorCQkJY29uZmlnLm9mX25vZGUgPSByZGF0YVtpXS5vZl9ub2RlOworCisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQkJCQkJJnJlZ3VsYXRvcnNbaV0sICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWd1bGF0b3IgaW5pdCBmYWlsZWQgZm9yICVkXG4iLAorCQkJCWkpOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgczJtcGEwMV9wbWljX2lkW10gPSB7CisJeyAiczJtcGEwMS1wbWljIiwgMH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHMybXBhMDFfcG1pY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMybXBhMDFfcG1pY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiczJtcGEwMS1wbWljIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBzMm1wYTAxX3BtaWNfcHJvYmUsCisJLmlkX3RhYmxlID0gczJtcGEwMV9wbWljX2lkLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzMm1wYTAxX3BtaWNfZHJpdmVyKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJTYW5nYmVvbSBLaW0gPHNia2ltNzNAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTYWNoaW4gS2FtYXQgPHNhY2hpbi5rYW1hdEBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0FNU1VORyBTMk1QQTAxIFJlZ3VsYXRvciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYwppbmRleCBjZDBiOWUzNS4uNjhmZDU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvczJtcHMxMS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3MybXBzMTEuYwpAQCAtMSwxMyArMSwxOCBAQAogLyoKICAqIHMybXBzMTEuYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCiAgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbQogICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqLwogCkBAIC0yNCwxOCArMjksMjEgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxhdG9yLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NhbXN1bmcvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTEuaD4KLQotI2RlZmluZSBTMk1QUzExX1JFR1VMQVRPUl9DTlQgQVJSQVlfU0laRShyZWd1bGF0b3JzKQorI2luY2x1ZGUgPGxpbnV4L21mZC9zYW1zdW5nL3MybXBzMTQuaD4KIAogc3RydWN0IHMybXBzMTFfaW5mbyB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbUzJNUFMxMV9SRUdVTEFUT1JfTUFYXTsKLQorCXVuc2lnbmVkIGludCByZGV2X251bTsKIAlpbnQgcmFtcF9kZWxheTI7CiAJaW50IHJhbXBfZGVsYXkzNDsKIAlpbnQgcmFtcF9kZWxheTU7CiAJaW50IHJhbXBfZGVsYXkxNjsKIAlpbnQgcmFtcF9kZWxheTc4MTA7CiAJaW50IHJhbXBfZGVsYXk5OworCS8qCisJICogT25lIGJpdCBmb3IgZWFjaCBTMk1QUzE0IHJlZ3VsYXRvciB3aGV0aGVyIHRoZSBzdXNwZW5kIG1vZGUKKwkgKiB3YXMgZW5hYmxlZC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgczJtcHMxNF9zdXNwZW5kX3N0YXRlOjMwOwogfTsKIAogc3RhdGljIGludCBnZXRfcmFtcF9kZWxheShpbnQgcmFtcF9kZWxheSkKQEAgLTY1LDcgKzczLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmFtcF9kZWxheSA9IDA7CiAJaW50IG9sZF92b2x0LCBuZXdfdm9sdDsKIAotCXN3aXRjaCAocmRldi0+ZGVzYy0+aWQpIHsKKwlzd2l0Y2ggKHJkZXZfZ2V0X2lkKHJkZXYpKSB7CiAJY2FzZSBTMk1QUzExX0JVQ0syOgogCQlyYW1wX2RlbGF5ID0gczJtcHMxMS0+cmFtcF9kZWxheTI7CiAJCWJyZWFrOwpAQCAtMTA1LDcgKzExMyw3IEBACiAJdW5zaWduZWQgaW50IHJhbXBfZW5hYmxlID0gMSwgZW5hYmxlX3NoaWZ0ID0gMDsKIAlpbnQgcmV0OwogCi0Jc3dpdGNoIChyZGV2LT5kZXNjLT5pZCkgeworCXN3aXRjaCAocmRldl9nZXRfaWQocmRldikpIHsKIAljYXNlIFMyTVBTMTFfQlVDSzE6CiAJCWlmIChyYW1wX2RlbGF5ID4gczJtcHMxMS0+cmFtcF9kZWxheTE2KQogCQkJczJtcHMxMS0+cmFtcF9kZWxheTE2ID0gcmFtcF9kZWxheTsKQEAgLTIzNiw3ICsyNDQsNyBAQAogCS5zZXRfcmFtcF9kZWxheQkJPSBzMm1wczExX3NldF9yYW1wX2RlbGF5LAogfTsKIAotI2RlZmluZSByZWd1bGF0b3JfZGVzY19sZG8xKG51bSkJewkJXAorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEobnVtKQl7CQlcCiAJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKIAkuaWQJCT0gUzJNUFMxMV9MRE8jI251bSwJCVwKIAkub3BzCQk9ICZzMm1wczExX2xkb19vcHMsCQlcCkBAIC0yNTAsNyArMjU4LDcgQEAKIAkuZW5hYmxlX3JlZwk9IFMyTVBTMTFfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKIAkuZW5hYmxlX21hc2sJPSBTMk1QUzExX0VOQUJMRV9NQVNLCQlcCiB9Ci0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2xkbzIobnVtKQl7CQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMihudW0pIHsJCVwKIAkubmFtZQkJPSAiTERPIiNudW0sCQkJXAogCS5pZAkJPSBTMk1QUzExX0xETyMjbnVtLAkJXAogCS5vcHMJCT0gJnMybXBzMTFfbGRvX29wcywJCVwKQEAgLTI2NSw3ICsyNzMsNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCVwKIH0KIAotI2RlZmluZSByZWd1bGF0b3JfZGVzY19idWNrMV80KG51bSkJewkJCVwKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMV80KG51bSkgewkJCVwKIAkubmFtZQkJPSAiQlVDSyIjbnVtLAkJCQlcCiAJLmlkCQk9IFMyTVBTMTFfQlVDSyMjbnVtLAkJCVwKIAkub3BzCQk9ICZzMm1wczExX2J1Y2tfb3BzLAkJCVwKQEAgLTI4MSw3ICsyODksNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCQlcCiB9CiAKLSNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazUJewkJCQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazUgewkJCQlcCiAJLm5hbWUJCT0gIkJVQ0s1IiwJCQkJXAogCS5pZAkJPSBTMk1QUzExX0JVQ0s1LAkJCVwKIAkub3BzCQk9ICZzMm1wczExX2J1Y2tfb3BzLAkJCVwKQEAgLTI5Nyw3ICszMDUsNyBAQAogCS5lbmFibGVfbWFzawk9IFMyTVBTMTFfRU5BQkxFX01BU0sJCQlcCiB9CiAKLSNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfYnVjazZfOChudW0pCXsJCQlcCisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazZfOChudW0pIHsJCQlcCiAJLm5hbWUJCT0gIkJVQ0siI251bSwJCQkJXAogCS5pZAkJPSBTMk1QUzExX0JVQ0sjI251bSwJCQlcCiAJLm9wcwkJPSAmczJtcHMxMV9idWNrX29wcywJCQlcCkBAIC0zMTMsNyArMzIxLDcgQEAKIAkuZW5hYmxlX21hc2sJPSBTMk1QUzExX0VOQUJMRV9NQVNLCQkJXAogfQogCi0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2s5CXsJCQkJXAorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s5IHsJCQkJXAogCS5uYW1lCQk9ICJCVUNLOSIsCQkJCVwKIAkuaWQJCT0gUzJNUFMxMV9CVUNLOSwJCQlcCiAJLm9wcwkJPSAmczJtcHMxMV9idWNrX29wcywJCQlcCkBAIC0zMjksNyArMzM3LDcgQEAKIAkuZW5hYmxlX21hc2sJPSBTMk1QUzExX0VOQUJMRV9NQVNLCQkJXAogfQogCi0jZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX2J1Y2sxMAl7CQkJCVwKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMTAgewkJCQlcCiAJLm5hbWUJCT0gIkJVQ0sxMCIsCQkJCVwKIAkuaWQJCT0gUzJNUFMxMV9CVUNLMTAsCQkJXAogCS5vcHMJCT0gJnMybXBzMTFfYnVja19vcHMsCQkJXApAQCAtMzQ1LDcyICszNTMsMjUyIEBACiAJLmVuYWJsZV9tYXNrCT0gUzJNUFMxMV9FTkFCTEVfTUFTSwkJCVwKIH0KIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfZGVzYyByZWd1bGF0b3JzW10gPSB7Ci0JcmVndWxhdG9yX2Rlc2NfbGRvMigxKSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDIpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzEoMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSg0KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDUpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzIoNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSg3KSwKLQlyZWd1bGF0b3JfZGVzY19sZG8xKDgpLAotCXJlZ3VsYXRvcl9kZXNjX2xkbzEoOSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxMCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigxMSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxMiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxNyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxOCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgxOSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyMCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyMSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigyMiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigyMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyNCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyNSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMigyNyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyOCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgyOSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzMyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNCksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNSksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNiksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzNyksCi0JcmVndWxhdG9yX2Rlc2NfbGRvMSgzOCksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazFfNCgxKSwKLQlyZWd1bGF0b3JfZGVzY19idWNrMV80KDIpLAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2sxXzQoMyksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazFfNCg0KSwKLQlyZWd1bGF0b3JfZGVzY19idWNrNSwKLQlyZWd1bGF0b3JfZGVzY19idWNrNl84KDYpLAotCXJlZ3VsYXRvcl9kZXNjX2J1Y2s2XzgoNyksCi0JcmVndWxhdG9yX2Rlc2NfYnVjazZfOCg4KSwKLQlyZWd1bGF0b3JfZGVzY19idWNrOSwKLQlyZWd1bGF0b3JfZGVzY19idWNrMTAsCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHMybXBzMTFfcmVndWxhdG9yc1tdID0geworCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMigxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSg0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoNSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSg3KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoOCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDkpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxMCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDExKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDE0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxNiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDE3KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMTgpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgxOSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDIwKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMjEpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMigyMiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8yKDIzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMjQpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgyNSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDI2KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzIoMjcpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgyOCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDI5KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzApLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDMyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDM1KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2xkbzEoMzYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfbGRvMSgzNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9sZG8xKDM4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2sxXzQoMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrMV80KDIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazFfNCgzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2sxXzQoNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrNSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s2XzgoNiksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxMV9idWNrNl84KDcpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazZfOCg4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczExX2J1Y2s5LAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTFfYnVjazEwLAorfTsKKworc3RhdGljIGludCBzMm1wczE0X3JlZ3VsYXRvcl9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHMybXBzMTFfaW5mbyAqczJtcHMxMSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChzMm1wczExLT5zMm1wczE0X3N1c3BlbmRfc3RhdGUgJiAoMSA8PCByZGV2X2dldF9pZChyZGV2KSkpCisJCXZhbCA9IFMyTVBTMTRfRU5BQkxFX1NVU1BFTkQ7CisJZWxzZQorCQl2YWwgPSByZGV2LT5kZXNjLT5lbmFibGVfbWFzazsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZGV2LT5kZXNjLT5lbmFibGVfcmVnLAorCQkJcmRldi0+ZGVzYy0+ZW5hYmxlX21hc2ssIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgczJtcHMxNF9yZWd1bGF0b3Jfc2V0X3N1c3BlbmRfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IHMybXBzMTFfaW5mbyAqczJtcHMxMSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisKKwkvKiBMRE8zIHNob3VsZCBiZSBhbHdheXMgb24gYW5kIGRvZXMgbm90IHN1cHBvcnQgc3VzcGVuZCBtb2RlICovCisJaWYgKHJkZXZfZ2V0X2lkKHJkZXYpID09IFMyTVBTMTRfTERPMykKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZGV2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPmVuYWJsZV9yZWcsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJczJtcHMxMS0+czJtcHMxNF9zdXNwZW5kX3N0YXRlIHw9ICgxIDw8IHJkZXZfZ2V0X2lkKHJkZXYpKTsKKwkvKgorCSAqIERvbid0IGVuYWJsZSBzdXNwZW5kIG1vZGUgaWYgcmVndWxhdG9yIGlzIGFscmVhZHkgZGlzYWJsZWQgYmVjYXVzZQorCSAqIHRoaXMgd291bGQgZWZmZWN0aXZlbHkgZm9yIGEgc2hvcnQgdGltZSB0dXJuIG9uIHRoZSByZWd1bGF0b3IgYWZ0ZXIKKwkgKiByZXN1bWluZy4KKwkgKiBIb3dldmVyIHdlIHN0aWxsIHdhbnQgdG8gdG9nZ2xlIHRoZSBzdXNwZW5kX3N0YXRlIGJpdCBmb3IgcmVndWxhdG9yCisJICogaW4gY2FzZSBpZiBpdCBnb3QgZW5hYmxlZCBiZWZvcmUgc3VzcGVuZGluZyB0aGUgc3lzdGVtLgorCSAqLworCWlmICghKHZhbCAmIHJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+ZW5hYmxlX3JlZywKKwkJCXJkZXYtPmRlc2MtPmVuYWJsZV9tYXNrLCBTMk1QUzE0X0VOQUJMRV9TVVNQRU5EKTsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHMybXBzMTRfcmVnX29wcyA9IHsKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAorCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSBzMm1wczE0X3JlZ3VsYXRvcl9lbmFibGUsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWVfc2VsLAorCS5zZXRfc3VzcGVuZF9kaXNhYmxlCT0gczJtcHMxNF9yZWd1bGF0b3Jfc2V0X3N1c3BlbmRfZGlzYWJsZSwKK307CisKKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKG51bSkgewkJXAorCS5uYW1lCQk9ICJMRE8iI251bSwJCQlcCisJLmlkCQk9IFMyTVBTMTRfTERPIyNudW0sCQlcCisJLm9wcwkJPSAmczJtcHMxNF9yZWdfb3BzLAkJXAorCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQlcCisJLm1pbl91VgkJPSBTMk1QUzE0X0xET19NSU5fODAwTVYsCVwKKwkudVZfc3RlcAk9IFMyTVBTMTRfTERPX1NURVBfMjVNViwJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUFMxNF9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBTMTRfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QUzE0X1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJXAorfQorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIobnVtKSB7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUFMxNF9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wczE0X3JlZ19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBTMTRfTERPX01JTl8xODAwTVYsCVwKKwkudVZfc3RlcAk9IFMyTVBTMTRfTERPX1NURVBfMjVNViwJXAorCS5uX3ZvbHRhZ2VzCT0gUzJNUFMxNF9MRE9fTl9WT0xUQUdFUywJXAorCS52c2VsX3JlZwk9IFMyTVBTMTRfUkVHX0wxQ1RSTCArIG51bSAtIDEsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9MRE9fVlNFTF9NQVNLLAlcCisJLmVuYWJsZV9yZWcJPSBTMk1QUzE0X1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJXAorfQorI2RlZmluZSByZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMobnVtKSB7CQlcCisJLm5hbWUJCT0gIkxETyIjbnVtLAkJCVwKKwkuaWQJCT0gUzJNUFMxNF9MRE8jI251bSwJCVwKKwkub3BzCQk9ICZzMm1wczE0X3JlZ19vcHMsCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCVwKKwkubWluX3VWCQk9IFMyTVBTMTRfTERPX01JTl84MDBNViwJXAorCS51Vl9zdGVwCT0gUzJNUFMxNF9MRE9fU1RFUF8xMl81TVYsCVwKKwkubl92b2x0YWdlcwk9IFMyTVBTMTRfTERPX05fVk9MVEFHRVMsCVwKKwkudnNlbF9yZWcJPSBTMk1QUzE0X1JFR19MMUNUUkwgKyBudW0gLSAxLAlcCisJLnZzZWxfbWFzawk9IFMyTVBTMTRfTERPX1ZTRUxfTUFTSywJXAorCS5lbmFibGVfcmVnCT0gUzJNUFMxNF9SRUdfTDFDVFJMICsgbnVtIC0gMSwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBTMTRfRU5BQkxFX01BU0sJCVwKK30KKyNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrMTIzNShudW0pIHsJCQlcCisJLm5hbWUJCT0gIkJVQ0siI251bSwJCQkJXAorCS5pZAkJPSBTMk1QUzE0X0JVQ0sjI251bSwJCQlcCisJLm9wcwkJPSAmczJtcHMxNF9yZWdfb3BzLAkJCVwKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJLm1pbl91VgkJPSBTMk1QUzE0X0JVQ0sxMjM1X01JTl82MDBNViwJCVwKKwkudVZfc3RlcAk9IFMyTVBTMTRfQlVDSzEyMzVfU1RFUF82XzI1TVYsCQlcCisJLm5fdm9sdGFnZXMJPSBTMk1QUzE0X0JVQ0tfTl9WT0xUQUdFUywJCVwKKwkubGluZWFyX21pbl9zZWwgPSBTMk1QUzE0X0JVQ0sxMjM1X1NUQVJUX1NFTCwJCVwKKwkucmFtcF9kZWxheQk9IFMyTVBTMTRfQlVDS19SQU1QX0RFTEFZLAkJXAorCS52c2VsX3JlZwk9IFMyTVBTMTRfUkVHX0IxQ1RSTDIgKyAobnVtIC0gMSkgKiAyLAlcCisJLnZzZWxfbWFzawk9IFMyTVBTMTRfQlVDS19WU0VMX01BU0ssCQlcCisJLmVuYWJsZV9yZWcJPSBTMk1QUzE0X1JFR19CMUNUUkwxICsgKG51bSAtIDEpICogMiwJXAorCS5lbmFibGVfbWFzawk9IFMyTVBTMTRfRU5BQkxFX01BU0sJCQlcCit9CisjZGVmaW5lIHJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfYnVjazQobnVtKSB7CQkJXAorCS5uYW1lCQk9ICJCVUNLIiNudW0sCQkJCVwKKwkuaWQJCT0gUzJNUFMxNF9CVUNLIyNudW0sCQkJXAorCS5vcHMJCT0gJnMybXBzMTRfcmVnX29wcywJCQlcCisJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJXAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQkJXAorCS5taW5fdVYJCT0gUzJNUFMxNF9CVUNLNF9NSU5fMTQwME1WLAkJXAorCS51Vl9zdGVwCT0gUzJNUFMxNF9CVUNLNF9TVEVQXzEyXzVNViwJCVwKKwkubl92b2x0YWdlcwk9IFMyTVBTMTRfQlVDS19OX1ZPTFRBR0VTLAkJXAorCS5saW5lYXJfbWluX3NlbCA9IFMyTVBTMTRfQlVDSzRfU1RBUlRfU0VMLAkJXAorCS5yYW1wX2RlbGF5CT0gUzJNUFMxNF9CVUNLX1JBTVBfREVMQVksCQlcCisJLnZzZWxfcmVnCT0gUzJNUFMxNF9SRUdfQjFDVFJMMiArIChudW0gLSAxKSAqIDIsCVwKKwkudnNlbF9tYXNrCT0gUzJNUFMxNF9CVUNLX1ZTRUxfTUFTSywJCVwKKwkuZW5hYmxlX3JlZwk9IFMyTVBTMTRfUkVHX0IxQ1RSTDEgKyAobnVtIC0gMSkgKiAyLAlcCisJLmVuYWJsZV9tYXNrCT0gUzJNUFMxNF9FTkFCTEVfTUFTSwkJCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBzMm1wczE0X3JlZ3VsYXRvcnNbXSA9IHsKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8zKDIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgzKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEoNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8zKDUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMyg2KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEoNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDgpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMyg5KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoMTApLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgxMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDEyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMTMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMigxNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDE1KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMTYpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMigxNyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDE4KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzEoMTkpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgyMCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8xKDIxKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzMoMjIpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfbGRvMSgyMyksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9sZG8yKDI0KSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2xkbzIoMjUpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfYnVjazEyMzUoMSksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrMTIzNSgyKSwKKwlyZWd1bGF0b3JfZGVzY19zMm1wczE0X2J1Y2sxMjM1KDMpLAorCXJlZ3VsYXRvcl9kZXNjX3MybXBzMTRfYnVjazQoNCksCisJcmVndWxhdG9yX2Rlc2NfczJtcHMxNF9idWNrMTIzNSg1KSwKIH07CiAKIHN0YXRpYyBpbnQgczJtcHMxMV9wbWljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNlY19wbWljX2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHNlY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaW9kZXYtPmRldik7Ci0Jc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCByZGF0YVtTMk1QUzExX1JFR1VMQVRPUl9NQVhdOworCXN0cnVjdCBzZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBpb2Rldi0+cGRhdGE7CisJc3RydWN0IG9mX3JlZ3VsYXRvcl9tYXRjaCAqcmRhdGEgPSBOVUxMOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVnX25wID0gTlVMTDsKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07CiAJc3RydWN0IHMybXBzMTFfaW5mbyAqczJtcHMxMTsKLQlpbnQgaSwgcmV0OworCWludCBpLCByZXQgPSAwOworCWNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmVndWxhdG9yczsKKwllbnVtIHNlY19kZXZpY2VfdHlwZSBkZXZfdHlwZTsKIAogCXMybXBzMTEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzMm1wczExX2luZm8pLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghczJtcHMxMSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkZXZfdHlwZSA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOworCXN3aXRjaCAoZGV2X3R5cGUpIHsKKwljYXNlIFMyTVBTMTFYOgorCQlzMm1wczExLT5yZGV2X251bSA9IEFSUkFZX1NJWkUoczJtcHMxMV9yZWd1bGF0b3JzKTsKKwkJcmVndWxhdG9ycyA9IHMybXBzMTFfcmVndWxhdG9yczsKKwkJYnJlYWs7CisJY2FzZSBTMk1QUzE0WDoKKwkJczJtcHMxMS0+cmRldl9udW0gPSBBUlJBWV9TSVpFKHMybXBzMTRfcmVndWxhdG9ycyk7CisJCXJlZ3VsYXRvcnMgPSBzMm1wczE0X3JlZ3VsYXRvcnM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgZGV2aWNlIHR5cGU6ICV1XG4iLCBkZXZfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKIAlpZiAoIWlvZGV2LT5kZXYtPm9mX25vZGUpIHsKIAkJaWYgKHBkYXRhKSB7CiAJCQlnb3RvIGNvbW1vbl9yZWc7CkBAIC00MjEsMTYgKzYwOSwyMiBAQAogCQl9CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFMyTVBTMTFfUkVHVUxBVE9SX0NOVDsgaSsrKQorCXJkYXRhID0ga3phbGxvYyhzaXplb2YoKnJkYXRhKSAqIHMybXBzMTEtPnJkZXZfbnVtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBzMm1wczExLT5yZGV2X251bTsgaSsrKQogCQlyZGF0YVtpXS5uYW1lID0gcmVndWxhdG9yc1tpXS5uYW1lOwogCi0JcmVnX25wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoaW9kZXYtPmRldi0+b2Zfbm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlyZWdfbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShpb2Rldi0+ZGV2LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVnX25wKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBmaW5kIHJlZ3VsYXRvcnMgc3ViLW5vZGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAJfQogCi0Jb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ19ucCwgcmRhdGEsIFMyTVBTMTFfUkVHVUxBVE9SX01BWCk7CisJb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ19ucCwgcmRhdGEsIHMybXBzMTEtPnJkZXZfbnVtKTsKKwlvZl9ub2RlX3B1dChyZWdfbnApOwogCiBjb21tb25fcmVnOgogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHMybXBzMTEpOwpAQCAtNDM4LDcgKzYzMiw5IEBACiAJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CiAJY29uZmlnLnJlZ21hcCA9IGlvZGV2LT5yZWdtYXBfcG1pYzsKIAljb25maWcuZHJpdmVyX2RhdGEgPSBzMm1wczExOwotCWZvciAoaSA9IDA7IGkgPCBTMk1QUzExX1JFR1VMQVRPUl9NQVg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzMm1wczExLT5yZGV2X251bTsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3I7CisKIAkJaWYgKCFyZWdfbnApIHsKIAkJCWNvbmZpZy5pbml0X2RhdGEgPSBwZGF0YS0+cmVndWxhdG9yc1tpXS5pbml0ZGF0YTsKIAkJCWNvbmZpZy5vZl9ub2RlID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0ucmVnX25vZGU7CkBAIC00NDcsMjEgKzY0MywyNSBAQAogCQkJY29uZmlnLm9mX25vZGUgPSByZGF0YVtpXS5vZl9ub2RlOwogCQl9CiAKLQkJczJtcHMxMS0+cmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCiAJCQkJCQkmcmVndWxhdG9yc1tpXSwgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIoczJtcHMxMS0+cmRldltpXSkpIHsKLQkJCXJldCA9IFBUUl9FUlIoczJtcHMxMS0+cmRldltpXSk7CisJCWlmIChJU19FUlIocmVndWxhdG9yKSkgeworCQkJcmV0ID0gUFRSX0VSUihyZWd1bGF0b3IpOwogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVndWxhdG9yIGluaXQgZmFpbGVkIGZvciAlZFxuIiwKIAkJCQlpKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAotCXJldHVybiAwOworb3V0OgorCWtmcmVlKHJkYXRhKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHMybXBzMTFfcG1pY19pZFtdID0gewotCXsgInMybXBzMTEtcG1pYyIsIDB9LAorCXsgInMybXBzMTEtcG1pYyIsIFMyTVBTMTFYfSwKKwl7ICJzMm1wczE0LXBtaWMiLCBTMk1QUzE0WH0sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHMybXBzMTFfcG1pY19pZCk7CkBAIC00ODksNSArNjg5LDUgQEAKIAogLyogTW9kdWxlIGluZm9ybWF0aW9uICovCiBNT0RVTEVfQVVUSE9SKCJTYW5nYmVvbSBLaW0gPHNia2ltNzNAc2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNBTVNVTkcgUzJNUFMxMSBSZWd1bGF0b3IgRHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNBTVNVTkcgUzJNUFMxMS9TMk1QUzE0IFJlZ3VsYXRvciBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3M1bTg3NjcuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3M1bTg3NjcuYwppbmRleCBkOTU4ZGZhLi5mMDViYWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9zNW04NzY3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvczVtODc2Ny5jCkBAIC0xMSwxMSArMTEsOCBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgpAQCAtMTcwLDEyICsxNjcsMTEgQEAKIAl7MHgwLCAweDMsIDB4MSwgMHgxfSwgLyogQlVDSzkgKi8KIH07CiAKLXN0YXRpYyBpbnQgczVtODc2N19nZXRfcmVnaXN0ZXIoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCAqcmVnLAotCQkJCWludCAqZW5hYmxlX2N0cmwpCitzdGF0aWMgaW50IHM1bTg3NjdfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcsIGludCByZWdfaWQsCisJCQkJaW50ICpyZWcsIGludCAqZW5hYmxlX2N0cmwpCiB7Ci0JaW50IGksIHJlZ19pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWludCBpOwogCXVuc2lnbmVkIGludCBtb2RlOwotCXN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCiAJc3dpdGNoIChyZWdfaWQpIHsKIAljYXNlIFM1TTg3NjdfTERPMSAuLi4gUzVNODc2N19MRE8yOgpAQCAtMjE0LDUzICsyMTAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHM1bTg3NjdfcmVnX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JaW50IHJldCwgcmVnOwotCWludCBlbmFibGVfY3RybDsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JcmV0ID0gczVtODc2N19nZXRfcmVnaXN0ZXIocmRldiwgJnJlZywgJmVuYWJsZV9jdHJsKTsKLQlpZiAocmV0ID09IC1FSU5WQUwpCi0JCXJldHVybiAxOwotCWVsc2UgaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKHM1bTg3NjctPmlvZGV2LT5yZWdtYXBfcG1pYywgcmVnLCAmdmFsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuICh2YWwgJiBTNU04NzY3X0VOQ1RSTF9NQVNLKSA9PSBlbmFibGVfY3RybDsKLX0KLQotc3RhdGljIGludCBzNW04NzY3X3JlZ19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JaW50IHJldCwgcmVnOwotCWludCBlbmFibGVfY3RybDsKLQotCXJldCA9IHM1bTg3NjdfZ2V0X3JlZ2lzdGVyKHJkZXYsICZyZWcsICZlbmFibGVfY3RybCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoczVtODc2Ny0+aW9kZXYtPnJlZ21hcF9wbWljLCByZWcsCi0JCQlTNU04NzY3X0VOQ1RSTF9NQVNLLCBlbmFibGVfY3RybCk7Ci19Ci0KLXN0YXRpYyBpbnQgczVtODc2N19yZWdfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKLXsKLQlzdHJ1Y3QgczVtODc2N19pbmZvICpzNW04NzY3ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgcmV0LCByZWcsIGVuYWJsZV9jdHJsOwotCi0JcmV0ID0gczVtODc2N19nZXRfcmVnaXN0ZXIocmRldiwgJnJlZywgJmVuYWJsZV9jdHJsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhzNW04NzY3LT5pb2Rldi0+cmVnbWFwX3BtaWMsIHJlZywKLQkJCVM1TTg3NjdfRU5DVFJMX01BU0ssIH5TNU04NzY3X0VOQ1RSTF9NQVNLKTsKLX0KLQogc3RhdGljIGludCBzNW04NzY3X2dldF92c2VsX3JlZyhpbnQgcmVnX2lkLCBzdHJ1Y3QgczVtODc2N19pbmZvICpzNW04NzY3KQogewogCWludCByZWc7CkBAIC00MTAsOSArMzU5LDkgQEAKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHM1bTg3Njdfb3BzID0gewogCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCi0JLmlzX2VuYWJsZWQJCT0gczVtODc2N19yZWdfaXNfZW5hYmxlZCwKLQkuZW5hYmxlCQkJPSBzNW04NzY3X3JlZ19lbmFibGUsCi0JLmRpc2FibGUJCT0gczVtODc2N19yZWdfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAogCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIAkuc2V0X3ZvbHRhZ2Vfc2VsCT0gczVtODc2N19zZXRfdm9sdGFnZV9zZWwsCiAJLnNldF92b2x0YWdlX3RpbWVfc2VsCT0gczVtODc2N19zZXRfdm9sdGFnZV90aW1lX3NlbCwKQEAgLTQyMCw5ICszNjksOSBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgczVtODc2N19idWNrNzhfb3BzID0gewogCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCi0JLmlzX2VuYWJsZWQJCT0gczVtODc2N19yZWdfaXNfZW5hYmxlZCwKLQkuZW5hYmxlCQkJPSBzNW04NzY3X3JlZ19lbmFibGUsCi0JLmRpc2FibGUJCT0gczVtODc2N19yZWdfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZAkJPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAogCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKIAkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCiB9OwpAQCAtNDgzLDYgKzQzMiw2NiBAQAogCXM1bTg3NjdfcmVndWxhdG9yX2Rlc2MoQlVDSzkpLAogfTsKIAorLyoKKyAqIEVuYWJsZSBHUElPIGNvbnRyb2wgb3ZlciBCVUNLOSBpbiByZWd1bGF0b3JfY29uZmlnIGZvciB0aGF0IHJlZ3VsYXRvci4KKyAqLworc3RhdGljIHZvaWQgczVtODc2N19yZWd1bGF0b3JfY29uZmlnX2V4dF9jb250cm9sKHN0cnVjdCBzNW04NzY3X2luZm8gKnM1bTg3NjcsCisJCXN0cnVjdCBzZWNfcmVndWxhdG9yX2RhdGEgKnJkYXRhLAorCQlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyAqY29uZmlnKQoreworCWludCBpLCBtb2RlID0gMDsKKworCWlmIChyZGF0YS0+aWQgIT0gUzVNODc2N19CVUNLOSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgaWYgb3Btb2RlIGZvciByZWd1bGF0b3IgbWF0Y2hlcyBTNU04NzY3X0VOQ1RSTF9VU0VfR1BJTyAqLworCWZvciAoaSA9IDA7IGkgPCBzNW04NzY3LT5udW1fcmVndWxhdG9yczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBzZWNfb3Btb2RlX2RhdGEgKm9wbW9kZSA9ICZzNW04NzY3LT5vcG1vZGVbaV07CisJCWlmIChvcG1vZGUtPmlkID09IHJkYXRhLT5pZCkgeworCQkJbW9kZSA9IHM1bTg3Njdfb3Btb2RlX3JlZ1tyZGF0YS0+aWRdW29wbW9kZS0+bW9kZV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobW9kZSAhPSBTNU04NzY3X0VOQ1RSTF9VU0VfR1BJTykgeworCQlkZXZfd2FybihzNW04NzY3LT5kZXYsCisJCQkJImV4dC1jb250cm9sIGZvciAlczogbWlzbWF0Y2hlZCBvcF9tb2RlICgleCksIGlnbm9yaW5nXG4iLAorCQkJCXJkYXRhLT5yZWdfbm9kZS0+bmFtZSwgbW9kZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWdwaW9faXNfdmFsaWQocmRhdGEtPmV4dF9jb250cm9sX2dwaW8pKSB7CisJCWRldl93YXJuKHM1bTg3NjctPmRldiwKKwkJCQkiZXh0LWNvbnRyb2wgZm9yICVzOiBHUElPIG5vdCB2YWxpZCwgaWdub3JpbmdcbiIsCisJCQkJcmRhdGEtPnJlZ19ub2RlLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWNvbmZpZy0+ZW5hX2dwaW8gPSByZGF0YS0+ZXh0X2NvbnRyb2xfZ3BpbzsKKwljb25maWctPmVuYV9ncGlvX2ZsYWdzID0gR1BJT0ZfT1VUX0lOSVRfSElHSDsKK30KKworLyoKKyAqIFR1cm4gb24gR1BJTyBjb250cm9sIG92ZXIgQlVDSzkuCisgKi8KK3N0YXRpYyBpbnQgczVtODc2N19lbmFibGVfZXh0X2NvbnRyb2woc3RydWN0IHM1bTg3NjdfaW5mbyAqczVtODc2NywKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IHJldCwgcmVnLCBlbmFibGVfY3RybDsKKworCWlmIChpZCAhPSBTNU04NzY3X0JVQ0s5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHM1bTg3NjdfZ2V0X3JlZ2lzdGVyKHM1bTg3NjcsIGlkLCAmcmVnLCAmZW5hYmxlX2N0cmwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHM1bTg3NjctPmlvZGV2LT5yZWdtYXBfcG1pYywKKwkJCXJlZywgUzVNODc2N19FTkNUUkxfTUFTSywKKwkJCVM1TTg3NjdfRU5DVFJMX1VTRV9HUElPIDw8IFM1TTg3NjdfRU5DVFJMX1NISUZUKTsKK30KKworCiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgaW50IHM1bTg3NjdfcG1pY19kdF9wYXJzZV9kdnNfZ3BpbyhzdHJ1Y3Qgc2VjX3BtaWNfZGV2ICppb2RldiwKIAkJCXN0cnVjdCBzZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEsCkBAIC01MjAsNiArNTI5LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHM1bTg3NjdfcG1pY19kdF9wYXJzZV9leHRfY29udHJvbF9ncGlvKHN0cnVjdCBzZWNfcG1pY19kZXYgKmlvZGV2LAorCQlzdHJ1Y3Qgc2VjX3JlZ3VsYXRvcl9kYXRhICpyZGF0YSwKKwkJc3RydWN0IGRldmljZV9ub2RlICpyZWdfbnApCit7CisJcmRhdGEtPmV4dF9jb250cm9sX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhyZWdfbnAsCisJCQkiczVtODc2NyxwbWljLWV4dC1jb250cm9sLWdwaW9zIiwgMCk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKHJkYXRhLT5leHRfY29udHJvbF9ncGlvKSkKKwkJcmRhdGEtPmV4dF9jb250cm9sX2dwaW8gPSAwOworfQorCiBzdGF0aWMgaW50IHM1bTg3NjdfcG1pY19kdF9wYXJzZV9wZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJCQlzdHJ1Y3Qgc2VjX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewpAQCAtNTQ2LDE5ICs1NjUsMTMgQEAKIAogCXJkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcmRhdGEpICoKIAkJCQlwZGF0YS0+bnVtX3JlZ3VsYXRvcnMsIEdGUF9LRVJORUwpOwotCWlmICghcmRhdGEpIHsKLQkJZGV2X2Vycihpb2Rldi0+ZGV2LAotCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlZ3VsYXRvciBkYXRhXG4iKTsKKwlpZiAoIXJkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlybW9kZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnJtb2RlKSAqCiAJCQkJcGRhdGEtPm51bV9yZWd1bGF0b3JzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJtb2RlKSB7Ci0JCWRldl9lcnIoaW9kZXYtPmRldiwKLQkJCSJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWd1bGF0b3IgbW9kZVxuIik7CisJaWYgKCFybW9kZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcGRhdGEtPnJlZ3VsYXRvcnMgPSByZGF0YTsKIAlwZGF0YS0+b3Btb2RlID0gcm1vZGU7CkBAIC01NzQsNiArNTg3LDggQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJczVtODc2N19wbWljX2R0X3BhcnNlX2V4dF9jb250cm9sX2dwaW8oaW9kZXYsIHJkYXRhLCByZWdfbnApOworCiAJCXJkYXRhLT5pZCA9IGk7CiAJCXJkYXRhLT5pbml0ZGF0YSA9IG9mX2dldF9yZWd1bGF0b3JfaW5pdF9kYXRhKAogCQkJCQkJJnBkZXYtPmRldiwgcmVnX25wKTsKQEAgLTkyMiw2ICs5MzcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7IGkrKykgewogCQljb25zdCBzdHJ1Y3Qgc2VjX3ZvbHRhZ2VfZGVzYyAqZGVzYzsKIAkJaW50IGlkID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0uaWQ7CisJCWludCBlbmFibGVfcmVnLCBlbmFibGVfdmFsOwogCiAJCWRlc2MgPSByZWdfdm9sdGFnZV9tYXBbaWRdOwogCQlpZiAoZGVzYykgewpAQCAtOTM1LDYgKzk1MSwxMiBAQAogCQkJCXJlZ3VsYXRvcnNbaWRdLnZzZWxfbWFzayA9IDB4M2Y7CiAJCQllbHNlCiAJCQkJcmVndWxhdG9yc1tpZF0udnNlbF9tYXNrID0gMHhmZjsKKworCQkJczVtODc2N19nZXRfcmVnaXN0ZXIoczVtODc2NywgaWQsICZlbmFibGVfcmVnLAorCQkJCQkgICAgICZlbmFibGVfdmFsKTsKKwkJCXJlZ3VsYXRvcnNbaWRdLmVuYWJsZV9yZWcgPSBlbmFibGVfcmVnOworCQkJcmVndWxhdG9yc1tpZF0uZW5hYmxlX21hc2sgPSBTNU04NzY3X0VOQ1RSTF9NQVNLOworCQkJcmVndWxhdG9yc1tpZF0uZW5hYmxlX3ZhbCA9IGVuYWJsZV92YWw7CiAJCX0KIAogCQljb25maWcuZGV2ID0gczVtODc2Ny0+ZGV2OwpAQCAtOTQyLDYgKzk2NCw5IEBACiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHM1bTg3Njc7CiAJCWNvbmZpZy5yZWdtYXAgPSBpb2Rldi0+cmVnbWFwX3BtaWM7CiAJCWNvbmZpZy5vZl9ub2RlID0gcGRhdGEtPnJlZ3VsYXRvcnNbaV0ucmVnX25vZGU7CisJCWlmIChwZGF0YS0+cmVndWxhdG9yc1tpXS5leHRfY29udHJvbF9ncGlvKQorCQkJczVtODc2N19yZWd1bGF0b3JfY29uZmlnX2V4dF9jb250cm9sKHM1bTg3NjcsCisJCQkJCSZwZGF0YS0+cmVndWxhdG9yc1tpXSwgJmNvbmZpZyk7CiAKIAkJcmRldltpXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyZWd1bGF0b3JzW2lkXSwKIAkJCQkJCSAgJmNvbmZpZyk7CkBAIC05NTEsNiArOTc2LDE2IEBACiAJCQkJCWlkKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KKworCQlpZiAocGRhdGEtPnJlZ3VsYXRvcnNbaV0uZXh0X2NvbnRyb2xfZ3BpbykgeworCQkJcmV0ID0gczVtODc2N19lbmFibGVfZXh0X2NvbnRyb2woczVtODc2NywgcmRldltpXSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoczVtODc2Ny0+ZGV2LAorCQkJCQkJImZhaWxlZCB0byBlbmFibGUgZ3BpbyBjb250cm9sIG92ZXIgJXM6ICVkXG4iLAorCQkJCQkJcmRldltpXS0+ZGVzYy0+bmFtZSwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9zdC1wd20uYyBiL2RyaXZlcnMvcmVndWxhdG9yL3N0LXB3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjdhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9zdC1wd20uYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIFJlZ3VsYXRvciBkcml2ZXIgZm9yIFNUJ3MgUFdNIFJlZ3VsYXRvcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgLSBTVE1pY3JvZWxlY3Ryb25pY3MgSW5jLgorICoKKyAqIEF1dGhvcjogTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHdtLmg+CisKKyNkZWZpbmUgU1RfUFdNX1JFR19QRVJJT0QgODQ0OAorCitzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9wZGF0YSB7CisJY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjOworCXN0cnVjdCBzdF9wd21fdm9sdGFnZXMgKmR1dHlfY3ljbGVfdGFibGU7Cit9OworCitzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9kYXRhIHsKKwljb25zdCBzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHB3bV9kZXZpY2UgKnB3bTsKKwlib29sIGVuYWJsZWQ7CisJaW50IHN0YXRlOworfTsKKworc3RydWN0IHN0X3B3bV92b2x0YWdlcyB7CisJdW5zaWduZWQgaW50IHVWOworCXVuc2lnbmVkIGludCBkdXR5Y3ljbGU7Cit9OworCitzdGF0aWMgaW50IHN0X3B3bV9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHN0X3B3bV9yZWd1bGF0b3JfZGF0YSAqZHJ2ZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBkcnZkYXRhLT5zdGF0ZTsKK30KKworc3RhdGljIGludCBzdF9wd21fcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQkgICAgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IHN0X3B3bV9yZWd1bGF0b3JfZGF0YSAqZHJ2ZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZHV0eWN5Y2xlOworCWludCByZXQ7CisKKwlkdXR5Y3ljbGUgPSAoU1RfUFdNX1JFR19QRVJJT0QgLyAxMDApICoKKwkJZHJ2ZGF0YS0+cGRhdGEtPmR1dHlfY3ljbGVfdGFibGVbc2VsZWN0b3JdLmR1dHljeWNsZTsKKworCXJldCA9IHB3bV9jb25maWcoZHJ2ZGF0YS0+cHdtLCBkdXR5Y3ljbGUsIFNUX1BXTV9SRUdfUEVSSU9EKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBQV01cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRydmRhdGEtPnN0YXRlID0gc2VsZWN0b3I7CisKKwlpZiAoIWRydmRhdGEtPmVuYWJsZWQpIHsKKwkJcmV0ID0gcHdtX2VuYWJsZShkcnZkYXRhLT5wd20pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgUFdNXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZHJ2ZGF0YS0+ZW5hYmxlZCA9IHRydWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RfcHdtX3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCBzdF9wd21fcmVndWxhdG9yX2RhdGEgKmRydmRhdGEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoc2VsZWN0b3IgPj0gZGV2LT5kZXNjLT5uX3ZvbHRhZ2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkcnZkYXRhLT5wZGF0YS0+ZHV0eV9jeWNsZV90YWJsZVtzZWxlY3Rvcl0udVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBzdF9wd21fcmVndWxhdG9yX3ZvbHRhZ2Vfb3BzID0geworCS5zZXRfdm9sdGFnZV9zZWwgPSBzdF9wd21fcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gc3RfcHdtX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWwsCisJLmxpc3Rfdm9sdGFnZSAgICA9IHN0X3B3bV9yZWd1bGF0b3JfbGlzdF92b2x0YWdlLAorCS5tYXBfdm9sdGFnZSAgICAgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfaXRlcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RfcHdtX3ZvbHRhZ2VzIGIyMTA1X2R1dHlfY3ljbGVfdGFibGVbXSA9IHsKKwl7IC51ViA9IDExMTQwMDAsIC5kdXR5Y3ljbGUgPSAwLCAgfSwKKwl7IC51ViA9IDEwOTUwMDAsIC5kdXR5Y3ljbGUgPSAxMCwgfSwKKwl7IC51ViA9IDEwNzYwMDAsIC5kdXR5Y3ljbGUgPSAyMCwgfSwKKwl7IC51ViA9IDEwNTYwMDAsIC5kdXR5Y3ljbGUgPSAzMCwgfSwKKwl7IC51ViA9IDEwMzYwMDAsIC5kdXR5Y3ljbGUgPSA0MCwgfSwKKwl7IC51ViA9IDEwMTYwMDAsIC5kdXR5Y3ljbGUgPSA1MCwgfSwKKwkvKiBXQVJOSU5HOiBWYWx1ZXMgYWJvdmUgNTAlIGR1dHktY3ljbGUgY2F1c2UgYm9vdCBmYWlsdXJlcy4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgYjIxMDVfZGVzYyA9IHsKKwkubmFtZQkJPSAiYjIxMDUtcHdtLXJlZ3VsYXRvciIsCisJLm9wcwkJPSAmc3RfcHdtX3JlZ3VsYXRvcl92b2x0YWdlX29wcywKKwkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5fdm9sdGFnZXMJPSBBUlJBWV9TSVpFKGIyMTA1X2R1dHlfY3ljbGVfdGFibGUpLAorCS5zdXBwbHlfbmFtZSAgICA9ICJwd20iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wd21fcmVndWxhdG9yX3BkYXRhIGIyMTA1X2luZm8gPSB7CisJLmRlc2MJCSAgPSAmYjIxMDVfZGVzYywKKwkuZHV0eV9jeWNsZV90YWJsZSA9IGIyMTA1X2R1dHlfY3ljbGVfdGFibGUsCit9OworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdF9wd21fb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0LGIyMTA1LXB3bS1yZWd1bGF0b3IiLCAuZGF0YSA9ICZiMjEwNV9pbmZvLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdF9wd21fb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IHN0X3B3bV9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3RfcHdtX3JlZ3VsYXRvcl9kYXRhICpkcnZkYXRhOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3I7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaDsKKworCWlmICghbnApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRGV2aWNlIFRyZWUgbm9kZSBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJb2ZfbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uoc3RfcHdtX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlpZiAoIW9mX21hdGNoKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXRjaCBvZiBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZHJ2ZGF0YS0+cGRhdGEgPSBvZl9tYXRjaC0+ZGF0YTsKKworCWNvbmZpZy5pbml0X2RhdGEgPSBvZl9nZXRfcmVndWxhdG9yX2luaXRfZGF0YSgmcGRldi0+ZGV2LCBucCk7CisJaWYgKCFjb25maWcuaW5pdF9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbmZpZy5vZl9ub2RlID0gbnA7CisJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CisJY29uZmlnLmRyaXZlcl9kYXRhID0gZHJ2ZGF0YTsKKworCWRydmRhdGEtPnB3bSA9IGRldm1fcHdtX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGRydmRhdGEtPnB3bSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBQV01cbiIpOworCQlyZXR1cm4gUFRSX0VSUihkcnZkYXRhLT5wd20pOworCX0KKworCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCSAgICBkcnZkYXRhLT5wZGF0YS0+ZGVzYywgJmNvbmZpZyk7CisJaWYgKElTX0VSUihyZWd1bGF0b3IpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3IgJXNcbiIsCisJCQlkcnZkYXRhLT5wZGF0YS0+ZGVzYy0+bmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHJlZ3VsYXRvcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0X3B3bV9yZWd1bGF0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJzdC1wd20tcmVndWxhdG9yIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoc3RfcHdtX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IHN0X3B3bV9yZWd1bGF0b3JfcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN0X3B3bV9yZWd1bGF0b3JfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1QgUFdNIFJlZ3VsYXRvciBEcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3RfcHdtLXJlZ3VsYXRvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdGktYWJiLXJlZ3VsYXRvci5jCmluZGV4IGIxODdiNmIuLmEyZGFiYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RpLWFiYi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90aS1hYmItcmVndWxhdG9yLmMKQEAgLTU0LDggKzU0LDggQEAKIAogLyoqCiAgKiBzdHJ1Y3QgdGlfYWJiX3JlZyAtIFJlZ2lzdGVyIGRlc2NyaXB0aW9uIGZvciBBQkIgYmxvY2sKLSAqIEBzZXR1cF9yZWc6CQkJc2V0dXAgcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZQotICogQGNvbnRyb2xfcmVnOgkJY29udHJvbCByZWdpc3RlciBvZmZzZXQgZnJvbSBiYXNlCisgKiBAc2V0dXBfb2ZmOgkJCXNldHVwIHJlZ2lzdGVyIG9mZnNldCBmcm9tIGJhc2UKKyAqIEBjb250cm9sX29mZjoJCWNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZQogICogQHNyMl93dGNudF92YWx1ZV9tYXNrOglzZXR1cCByZWdpc3Rlci0gc3IyX3d0Y250X3ZhbHVlIG1hc2sKICAqIEBmYmJfc2VsX21hc2s6CQlzZXR1cCByZWdpc3Rlci0gRkJCIHNlbCBtYXNrCiAgKiBAcmJiX3NlbF9tYXNrOgkJc2V0dXAgcmVnaXN0ZXItIFJCQiBzZWwgbWFzawpAQCAtNjQsOCArNjQsOCBAQAogICogQG9wcF9zZWxfbWFzazoJCWNvbnRyb2wgcmVnaXN0ZXIgLSBtYXNrIGZvciBtb2RlIHRvIG9wZXJhdGUKICAqLwogc3RydWN0IHRpX2FiYl9yZWcgewotCXUzMiBzZXR1cF9yZWc7Ci0JdTMyIGNvbnRyb2xfcmVnOworCXUzMiBzZXR1cF9vZmY7CisJdTMyIGNvbnRyb2xfb2ZmOwogCiAJLyogU2V0dXAgcmVnaXN0ZXIgZmllbGRzICovCiAJdTMyIHNyMl93dGNudF92YWx1ZV9tYXNrOwpAQCAtODMsNiArODMsOCBAQAogICogQHJkZXNjOgkJCXJlZ3VsYXRvciBkZXNjcmlwdG9yCiAgKiBAY2xrOgkJCWNsb2NrKHVzdWFsbHkgc3lzY2xrKSBzdXBwbHlpbmcgQUJCIGJsb2NrCiAgKiBAYmFzZToJCQliYXNlIGFkZHJlc3Mgb2YgQUJCIGJsb2NrCisgKiBAc2V0dXBfcmVnOgkJCXNldHVwIHJlZ2lzdGVyIG9mIEFCQiBibG9jaworICogQGNvbnRyb2xfcmVnOgkJY29udHJvbCByZWdpc3RlciBvZiBBQkIgYmxvY2sKICAqIEBpbnRfYmFzZToJCQlpbnRlcnJ1cHQgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCiAgKiBAZWZ1c2VfYmFzZToJCQkob3B0aW9uYWwpIGVmdXNlIGJhc2UgYWRkcmVzcyBmb3IgQUJCIG1vZGVzCiAgKiBAbGRvX2Jhc2U6CQkJKG9wdGlvbmFsKSBMRE9WQkIgdnNldCBvdmVycmlkZSBiYXNlIGFkZHJlc3MKQEAgLTk5LDYgKzEwMSw4IEBACiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJkZXNjOwogCXN0cnVjdCBjbGsgKmNsazsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CisJdm9pZCBfX2lvbWVtICpzZXR1cF9yZWc7CisJdm9pZCBfX2lvbWVtICpjb250cm9sX3JlZzsKIAl2b2lkIF9faW9tZW0gKmludF9iYXNlOwogCXZvaWQgX19pb21lbSAqZWZ1c2VfYmFzZTsKIAl2b2lkIF9faW9tZW0gKmxkb19iYXNlOwpAQCAtMTE4LDIwICsxMjIsMTggQEAKICAqIHRpX2FiYl9ybXcoKSAtIGhhbmR5IHdyYXBwZXIgdG8gc2V0IHNwZWNpZmljIHJlZ2lzdGVyIGJpdHMKICAqIEBtYXNrOgltYXNrIGZvciByZWdpc3RlciBmaWVsZAogICogQHZhbHVlOgl2YWx1ZSBzaGlmdGVkIHRvIG1hc2sgbG9jYXRpb24gYW5kIHdyaXR0ZW4KLSAqIEBvZmZzZXQ6CW9mZnNldCBvZiByZWdpc3RlcgotICogQGJhc2U6CWJhc2UgYWRkcmVzcworICogQHJlZzoJcmVnaXN0ZXIgYWRkcmVzcwogICoKICAqIFJldHVybjogZmluYWwgcmVnaXN0ZXIgdmFsdWUgKG1heSBiZSB1bnVzZWQpCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIHRpX2FiYl9ybXcodTMyIG1hc2ssIHUzMiB2YWx1ZSwgdTMyIG9mZnNldCwKLQkJCSAgICAgdm9pZCBfX2lvbWVtICpiYXNlKQorc3RhdGljIGlubGluZSB1MzIgdGlfYWJiX3Jtdyh1MzIgbWFzaywgdTMyIHZhbHVlLCB2b2lkIF9faW9tZW0gKnJlZykKIHsKIAl1MzIgdmFsOwogCi0JdmFsID0gcmVhZGwoYmFzZSArIG9mZnNldCk7CisJdmFsID0gcmVhZGwocmVnKTsKIAl2YWwgJj0gfm1hc2s7CiAJdmFsIHw9ICh2YWx1ZSA8PCBfX2ZmcyhtYXNrKSkgJiBtYXNrOwotCXdyaXRlbCh2YWwsIGJhc2UgKyBvZmZzZXQpOworCXdyaXRlbCh2YWwsIHJlZyk7CiAKIAlyZXR1cm4gdmFsOwogfQpAQCAtMjYzLDIxICsyNjUsMTkgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXRpX2FiYl9ybXcocmVncy0+ZmJiX3NlbF9tYXNrIHwgcmVncy0+cmJiX3NlbF9tYXNrLCAwLCByZWdzLT5zZXR1cF9yZWcsCi0JCSAgIGFiYi0+YmFzZSk7CisJdGlfYWJiX3JtdyhyZWdzLT5mYmJfc2VsX21hc2sgfCByZWdzLT5yYmJfc2VsX21hc2ssIDAsIGFiYi0+c2V0dXBfcmVnKTsKIAogCXN3aXRjaCAoaW5mby0+b3BwX3NlbCkgewogCWNhc2UgVElfQUJCX1NMT1dfT1BQOgotCQl0aV9hYmJfcm13KHJlZ3MtPnJiYl9zZWxfbWFzaywgMSwgcmVncy0+c2V0dXBfcmVnLCBhYmItPmJhc2UpOworCQl0aV9hYmJfcm13KHJlZ3MtPnJiYl9zZWxfbWFzaywgMSwgYWJiLT5zZXR1cF9yZWcpOwogCQlicmVhazsKIAljYXNlIFRJX0FCQl9GQVNUX09QUDoKLQkJdGlfYWJiX3JtdyhyZWdzLT5mYmJfc2VsX21hc2ssIDEsIHJlZ3MtPnNldHVwX3JlZywgYWJiLT5iYXNlKTsKKwkJdGlfYWJiX3JtdyhyZWdzLT5mYmJfc2VsX21hc2ssIDEsIGFiYi0+c2V0dXBfcmVnKTsKIAkJYnJlYWs7CiAJfQogCiAJLyogcHJvZ3JhbSBuZXh0IHN0YXRlIG9mIEFCQiBsZG8gKi8KLQl0aV9hYmJfcm13KHJlZ3MtPm9wcF9zZWxfbWFzaywgaW5mby0+b3BwX3NlbCwgcmVncy0+Y29udHJvbF9yZWcsCi0JCSAgIGFiYi0+YmFzZSk7CisJdGlfYWJiX3JtdyhyZWdzLT5vcHBfc2VsX21hc2ssIGluZm8tPm9wcF9zZWwsIGFiYi0+Y29udHJvbF9yZWcpOwogCiAJLyoKIAkgKiBwcm9ncmFtIExETyBWQkIgdnNldCBvdmVycmlkZSBpZiBuZWVkZWQgZm9yICFieXBhc3MgbW9kZQpAQCAtMjg4LDcgKzI4OCw3IEBACiAJCXRpX2FiYl9wcm9ncmFtX2xkb3ZiYihkZXYsIGFiYiwgaW5mbyk7CiAKIAkvKiBJbml0aWF0ZSBBQkIgbGRvIGNoYW5nZSAqLwotCXRpX2FiYl9ybXcocmVncy0+b3BwX2NoYW5nZV9tYXNrLCAxLCByZWdzLT5jb250cm9sX3JlZywgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KHJlZ3MtPm9wcF9jaGFuZ2VfbWFzaywgMSwgYWJiLT5jb250cm9sX3JlZyk7CiAKIAkvKiBXYWl0IGZvciBBQkIgTERPIHRvIGNvbXBsZXRlIHRyYW5zaXRpb24gdG8gbmV3IEJpYXMgc2V0dGluZyAqLwogCXJldCA9IHRpX2FiYl93YWl0X3R4ZG9uZShkZXYsIGFiYik7CkBAIC00OTAsOCArNDkwLDcgQEAKIAlkZXZfZGJnKGRldiwgIiVzOiBDbGtfcmF0ZT0lbGQsIHNyMl9jbnQ9MHglMDh4XG4iLCBfX2Z1bmNfXywKIAkJY2xrX2dldF9yYXRlKGFiYi0+Y2xrKSwgc3IyX3d0X2NudF92YWwpOwogCi0JdGlfYWJiX3JtdyhyZWdzLT5zcjJfd3RjbnRfdmFsdWVfbWFzaywgc3IyX3d0X2NudF92YWwsIHJlZ3MtPnNldHVwX3JlZywKLQkJICAgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KHJlZ3MtPnNyMl93dGNudF92YWx1ZV9tYXNrLCBzcjJfd3RfY250X3ZhbCwgYWJiLT5zZXR1cF9yZWcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDgsMzIgKzUwNywyNCBAQAogCQkJICAgICBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmluaXRfZGF0YSkKIHsKIAlzdHJ1Y3QgdGlfYWJiX2luZm8gKmluZm87Ci0JY29uc3Qgc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCWNvbnN0IF9fYmUzMiAqYWJiX2luZm87CiAJY29uc3QgdTMyIG51bV92YWx1ZXMgPSA2OwogCWNoYXIgKnBuYW1lID0gInRpLGFiYl9pbmZvIjsKLQl1MzIgbnVtX2VudHJpZXMsIGk7CisJdTMyIGk7CiAJdW5zaWduZWQgaW50ICp2b2x0X3RhYmxlOwotCWludCBtaW5fdVYgPSBJTlRfTUFYLCBtYXhfdVYgPSAwOworCWludCBudW1fZW50cmllcywgbWluX3VWID0gSU5UX01BWCwgbWF4X3VWID0gMDsKIAlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAqYyA9ICZyaW5pdF9kYXRhLT5jb25zdHJhaW50czsKIAotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgcG5hbWUsIE5VTEwpOwotCWlmICghcHJvcCkgewotCQlkZXZfZXJyKGRldiwgIk5vICclcycgcHJvcGVydHk/XG4iLCBwbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmICghcHJvcC0+dmFsdWUpIHsKLQkJZGV2X2VycihkZXYsICJFbXB0eSAnJXMnIHByb3BlcnR5P1xuIiwgcG5hbWUpOwotCQlyZXR1cm4gLUVOT0RBVEE7Ci0JfQotCiAJLyoKIAkgKiBFYWNoIGFiYl9pbmZvIGlzIGEgc2V0IG9mIG4tdHVwbGUsIHdoZXJlIG4gaXMgbnVtX3ZhbHVlcywgY29uc2lzdGluZwogCSAqIG9mIHZvbHRhZ2UgYW5kIGEgc2V0IG9mIGRldGVjdGlvbiBsb2dpYyBmb3IgQUJCIGluZm9ybWF0aW9uIGZvciB0aGF0CiAJICogdm9sdGFnZSB0byBhcHBseS4KIAkgKi8KLQludW1fZW50cmllcyA9IHByb3AtPmxlbmd0aCAvIHNpemVvZih1MzIpOworCW51bV9lbnRyaWVzID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKGRldi0+b2Zfbm9kZSwgcG5hbWUpOworCWlmIChudW1fZW50cmllcyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJObyAnJXMnIHByb3BlcnR5P1xuIiwgcG5hbWUpOworCQlyZXR1cm4gbnVtX2VudHJpZXM7CisJfQorCiAJaWYgKCFudW1fZW50cmllcyB8fCAobnVtX2VudHJpZXMgJSBudW1fdmFsdWVzKSkgewogCQlkZXZfZXJyKGRldiwgIkFsbCAnJXMnIGxpc3QgZW50cmllcyBuZWVkICVkIHZhbHNcbiIsIHBuYW1lLAogCQkJbnVtX3ZhbHVlcyk7CkBAIC01NDIsMzggKzUzMywzOCBAQAogCW51bV9lbnRyaWVzIC89IG51bV92YWx1ZXM7CiAKIAlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppbmZvKSAqIG51bV9lbnRyaWVzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8pIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBpbmZvIHRhYmxlIGZvciAnJXMnIHByb3BlcnR5XG4iLAotCQkJcG5hbWUpOworCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJYWJiLT5pbmZvID0gaW5mbzsKIAogCXZvbHRfdGFibGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YodW5zaWduZWQgaW50KSAqIG51bV9lbnRyaWVzLAogCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2b2x0X3RhYmxlKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgdm9sdGFnZSB0YWJsZSBmb3IgJyVzJyBwcm9wZXJ0eVxuIiwKLQkJCXBuYW1lKTsKKwlpZiAoIXZvbHRfdGFibGUpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWFiYi0+cmRlc2Mubl92b2x0YWdlcyA9IG51bV9lbnRyaWVzOwogCWFiYi0+cmRlc2Mudm9sdF90YWJsZSA9IHZvbHRfdGFibGU7CiAJLyogV2UgZG8gbm90IGtub3cgd2hlcmUgdGhlIE9QUCB2b2x0YWdlIGlzIGF0IHRoZSBtb21lbnQgKi8KIAlhYmItPmN1cnJlbnRfaW5mb19pZHggPSAtRUlOVkFMOwogCi0JYWJiX2luZm8gPSBwcm9wLT52YWx1ZTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKywgaW5mbysrLCB2b2x0X3RhYmxlKyspIHsKIAkJdTMyIGVmdXNlX29mZnNldCwgcmJiX21hc2ssIGZiYl9tYXNrLCB2c2V0X21hc2s7CiAJCXUzMiBlZnVzZV92YWw7CiAKIAkJLyogTk9URTogbnVtX3ZhbHVlcyBzaG91bGQgZXF1YWwgdG8gZW50cmllcyBwaWNrZWQgdXAgaGVyZSAqLwotCQkqdm9sdF90YWJsZSA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKLQkJaW5mby0+b3BwX3NlbCA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKLQkJZWZ1c2Vfb2Zmc2V0ID0gYmUzMl90b19jcHVwKGFiYl9pbmZvKyspOwotCQlyYmJfbWFzayA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKLQkJZmJiX21hc2sgPSBiZTMyX3RvX2NwdXAoYWJiX2luZm8rKyk7Ci0JCXZzZXRfbWFzayA9IGJlMzJfdG9fY3B1cChhYmJfaW5mbysrKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoZGV2LT5vZl9ub2RlLCBwbmFtZSwgaSAqIG51bV92YWx1ZXMsCisJCQkJCSAgIHZvbHRfdGFibGUpOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25vZGUsIHBuYW1lLAorCQkJCQkgICBpICogbnVtX3ZhbHVlcyArIDEsICZpbmZvLT5vcHBfc2VsKTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoZGV2LT5vZl9ub2RlLCBwbmFtZSwKKwkJCQkJICAgaSAqIG51bV92YWx1ZXMgKyAyLCAmZWZ1c2Vfb2Zmc2V0KTsKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoZGV2LT5vZl9ub2RlLCBwbmFtZSwKKwkJCQkJICAgaSAqIG51bV92YWx1ZXMgKyAzLCAmcmJiX21hc2spOworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChkZXYtPm9mX25vZGUsIHBuYW1lLAorCQkJCQkgICBpICogbnVtX3ZhbHVlcyArIDQsICZmYmJfbWFzayk7CisJCW9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KGRldi0+b2Zfbm9kZSwgcG5hbWUsCisJCQkJCSAgIGkgKiBudW1fdmFsdWVzICsgNSwgJnZzZXRfbWFzayk7CiAKIAkJZGV2X2RiZyhkZXYsCiAJCQkiWyVkXXY9JWQgQUJCPSVkIGVmPTB4JXggcmJiPTB4JXggZmJiPTB4JXggdnNldD0weCV4XG4iLApAQCAtNjQ4LDggKzYzOSw4IEBACiAvKiBEZWZhdWx0IEFCQiBibG9jayBvZmZzZXRzLCBJRiB0aGlzIGNoYW5nZXMgaW4gZnV0dXJlLCBjcmVhdGUgbmV3IG9uZSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB0aV9hYmJfcmVnIGFiYl9yZWdzX3YxID0gewogCS8qIFdBUk5JTkc6IHJlZ2lzdGVycyBhcmUgd3JvbmdseSBkb2N1bWVudGVkIGluIFRSTSAqLwotCS5zZXR1cF9yZWcJCT0gMHgwNCwKLQkuY29udHJvbF9yZWcJCT0gMHgwMCwKKwkuc2V0dXBfb2ZmCQk9IDB4MDQsCisJLmNvbnRyb2xfb2ZmCQk9IDB4MDAsCiAKIAkuc3IyX3d0Y250X3ZhbHVlX21hc2sJPSAoMHhmZiA8PCA4KSwKIAkuZmJiX3NlbF9tYXNrCQk9ICgweDAxIDw8IDIpLApAQCAtNjYxLDggKzY1Miw4IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRpX2FiYl9yZWcgYWJiX3JlZ3NfdjIgPSB7Ci0JLnNldHVwX3JlZwkJPSAweDAwLAotCS5jb250cm9sX3JlZwkJPSAweDA0LAorCS5zZXR1cF9vZmYJCT0gMHgwMCwKKwkuY29udHJvbF9vZmYJCT0gMHgwNCwKIAogCS5zcjJfd3RjbnRfdmFsdWVfbWFzawk9ICgweGZmIDw8IDgpLAogCS5mYmJfc2VsX21hc2sJCT0gKDB4MDEgPDwgMiksCkBAIC02NzMsOSArNjY0LDIwIEBACiAJLm9wcF9zZWxfbWFzawkJPSAoMHgwMyA8PCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGlfYWJiX3JlZyBhYmJfcmVnc19nZW5lcmljID0geworCS5zcjJfd3RjbnRfdmFsdWVfbWFzawk9ICgweGZmIDw8IDgpLAorCS5mYmJfc2VsX21hc2sJCT0gKDB4MDEgPDwgMiksCisJLnJiYl9zZWxfbWFzawkJPSAoMHgwMSA8PCAxKSwKKwkuc3IyX2VuX21hc2sJCT0gKDB4MDEgPDwgMCksCisKKwkub3BwX2NoYW5nZV9tYXNrCT0gKDB4MDEgPDwgMiksCisJLm9wcF9zZWxfbWFzawkJPSAoMHgwMyA8PCAwKSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRpX2FiYl9vZl9tYXRjaFtdID0gewogCXsuY29tcGF0aWJsZSA9ICJ0aSxhYmItdjEiLCAuZGF0YSA9ICZhYmJfcmVnc192MX0sCiAJey5jb21wYXRpYmxlID0gInRpLGFiYi12MiIsIC5kYXRhID0gJmFiYl9yZWdzX3YyfSwKKwl7LmNvbXBhdGlibGUgPSAidGksYWJiLXYzIiwgLmRhdGEgPSAmYWJiX3JlZ3NfZ2VuZXJpY30sCiAJeyB9LAogfTsKIApAQCAtNzIyLDExICs3MjQsMjkgQEAKIAlhYmItPnJlZ3MgPSBtYXRjaC0+ZGF0YTsKIAogCS8qIE1hcCBBQkIgcmVzb3VyY2VzICovCi0JcG5hbWUgPSAiYmFzZS1hZGRyZXNzIjsKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBwbmFtZSk7Ci0JYWJiLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKGFiYi0+YmFzZSkpCi0JCXJldHVybiBQVFJfRVJSKGFiYi0+YmFzZSk7CisJaWYgKGFiYi0+cmVncy0+c2V0dXBfb2ZmIHx8IGFiYi0+cmVncy0+Y29udHJvbF9vZmYpIHsKKwkJcG5hbWUgPSAiYmFzZS1hZGRyZXNzIjsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcG5hbWUpOworCQlhYmItPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGFiYi0+YmFzZSkpCisJCQlyZXR1cm4gUFRSX0VSUihhYmItPmJhc2UpOworCisJCWFiYi0+c2V0dXBfcmVnID0gYWJiLT5iYXNlICsgYWJiLT5yZWdzLT5zZXR1cF9vZmY7CisJCWFiYi0+Y29udHJvbF9yZWcgPSBhYmItPmJhc2UgKyBhYmItPnJlZ3MtPmNvbnRyb2xfb2ZmOworCisJfSBlbHNlIHsKKwkJcG5hbWUgPSAiY29udHJvbC1hZGRyZXNzIjsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcG5hbWUpOworCQlhYmItPmNvbnRyb2xfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihhYmItPmNvbnRyb2xfcmVnKSkKKwkJCXJldHVybiBQVFJfRVJSKGFiYi0+Y29udHJvbF9yZWcpOworCisJCXBuYW1lID0gInNldHVwLWFkZHJlc3MiOworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBwbmFtZSk7CisJCWFiYi0+c2V0dXBfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihhYmItPnNldHVwX3JlZykpCisJCQlyZXR1cm4gUFRSX0VSUihhYmItPnNldHVwX3JlZyk7CisJfQogCiAJcG5hbWUgPSAiaW50LWFkZHJlc3MiOwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sIHBuYW1lKTsKQEAgLTg2MCw3ICs4ODAsNyBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJkZXYpOwogCiAJLyogRW5hYmxlIHRoZSBsZG8gaWYgbm90IGFscmVhZHkgZG9uZSBieSBib290bG9hZGVyICovCi0JdGlfYWJiX3JtdyhhYmItPnJlZ3MtPnNyMl9lbl9tYXNrLCAxLCBhYmItPnJlZ3MtPnNldHVwX3JlZywgYWJiLT5iYXNlKTsKKwl0aV9hYmJfcm13KGFiYi0+cmVncy0+c3IyX2VuX21hc2ssIDEsIGFiYi0+c2V0dXBfcmVnKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNTE2MzItcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM1MTYzMi1yZWd1bGF0b3IuYwppbmRleCBiMzc2NGY1Li5mMzFmMjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM1MTYzMi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM1MTYzMi1yZWd1bGF0b3IuYwpAQCAtMjI3LDEwICsyMjcsOCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAKIAlwZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWxlZCBmb3IgcGxhdGZvcm0gZGF0YVxuIik7CisJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcGRhdGEtPnJlZ19pbml0X2RhdGEgPSBvZl9nZXRfcmVndWxhdG9yX2luaXRfZGF0YShkZXYsIGRldi0+b2Zfbm9kZSk7CiAJaWYgKCFwZGF0YS0+cmVnX2luaXRfZGF0YSkgewpAQCAtMjk5LDEwICsyOTcsOCBAQAogCX0KIAogCXRwcyA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqdHBzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cHMpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWlmICghdHBzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl0cHMtPmRldiA9ICZjbGllbnQtPmRldjsKIAl0cHMtPmRlc2MubmFtZSA9IGNsaWVudC0+bmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczYyMzYwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjIzNjAtcmVndWxhdG9yLmMKaW5kZXggYzNmYTE1YS4uYTE2NzIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjIzNjAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjIzNjAtcmVndWxhdG9yLmMKQEAgLTI5OSwxMCArMjk5LDggQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwogCiAJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKGRldiwgIk1lbW9yeSBhbGxvYyBmYWlsZWQgZm9yIHBsYXRmb3JtIGRhdGFcbiIpOworCWlmICghcGRhdGEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXBkYXRhLT5yZWdfaW5pdF9kYXRhID0gb2ZfZ2V0X3JlZ3VsYXRvcl9pbml0X2RhdGEoZGV2LCBkZXYtPm9mX25vZGUpOwogCWlmICghcGRhdGEtPnJlZ19pbml0X2RhdGEpIHsKQEAgLTM3NywxMSArMzc1LDggQEAKIAl9CiAKIAl0cHMgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnRwcyksIEdGUF9LRVJORUwpOwotCWlmICghdHBzKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMoKTogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLAotCQkJCQkJX19mdW5jX18pOworCWlmICghdHBzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl0cHMtPmVuX2Rpc2NoYXJnZSA9IHBkYXRhLT5lbl9kaXNjaGFyZ2U7CiAJdHBzLT5lbl9pbnRlcm5hbF9wdWxsZG4gPSBwZGF0YS0+ZW5faW50ZXJuYWxfcHVsbGRuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYwppbmRleCAxNjJhMGZhLi45OGU2NmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYwpAQCAtMzU5LDcgKzM1OSw2IEBACiAJLm1hcF92b2x0YWdlID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2FzY2VuZCwKIH07CiAKLSNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcmVndWxhdG9yX21hdGNoIHRwczY1MDd4X21hdGNoZXNbXSA9IHsKIAl7IC5uYW1lID0gIlZEQ0RDMSJ9LAogCXsgLm5hbWUgPSAiVkRDREMyIn0sCkBAIC0zODEsMTIgKzM4MCwxMCBAQAogCiAJdHBzX2JvYXJkID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHBzX2JvYXJkKSwKIAkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cHNfYm9hcmQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbHVyZSB0byBhbGxvYyBwZGF0YSBmb3IgcmVndWxhdG9ycy5cbiIpOworCWlmICghdHBzX2JvYXJkKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKLQlyZWd1bGF0b3JzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJyZWd1bGF0b3JzIik7CisJcmVndWxhdG9ycyA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwogCWlmICghcmVndWxhdG9ycykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWd1bGF0b3Igbm9kZSBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTM5Niw2ICszOTMsNyBAQAogCW1hdGNoZXMgPSB0cHM2NTA3eF9tYXRjaGVzOwogCiAJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ3VsYXRvcnMsIG1hdGNoZXMsIGNvdW50KTsKKwlvZl9ub2RlX3B1dChyZWd1bGF0b3JzKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBwYXJzaW5nIHJlZ3VsYXRvciBpbml0IGRhdGE6ICVkXG4iLAogCQkJcmV0KTsKQEAgLTQwNiwxMCArNDA0LDggQEAKIAogCXJlZ19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIChzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEpCiAJCQkJCSogVFBTNjUwN1hfTlVNX1JFR1VMQVRPUiksIEdGUF9LRVJORUwpOwotCWlmICghcmVnX2RhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbHVyZSB0byBhbGxvYyBpbml0IGRhdGEgZm9yIHJlZ3VsYXRvcnMuXG4iKTsKKwlpZiAoIXJlZ19kYXRhKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAl0cHNfYm9hcmQtPnRwczY1MDd4X3BtaWNfaW5pdF9kYXRhID0gcmVnX2RhdGE7CiAKQEAgLTQyNCwxNSArNDIwLDcgQEAKIAogCXJldHVybiB0cHNfYm9hcmQ7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdHBzNjUwN3hfYm9hcmQgKnRwczY1MDd4X3BhcnNlX2R0X3JlZ19kYXRhKAotCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKip0cHM2NTA3eF9yZWdfbWF0Y2hlcykKLXsKLQkqdHBzNjUwN3hfcmVnX21hdGNoZXMgPSBOVUxMOwotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCisKIHN0YXRpYyBpbnQgdHBzNjUwN3hfcG1pY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB0cHM2NTA3eF9kZXYgKnRwczY1MDd4X2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKQEAgLTQ1Myw5ICs0NDEsMTAgQEAKIAkgKi8KIAogCXRwc19ib2FyZCA9IGRldl9nZXRfcGxhdGRhdGEodHBzNjUwN3hfZGV2LT5kZXYpOwotCWlmICghdHBzX2JvYXJkICYmIHRwczY1MDd4X2Rldi0+ZGV2LT5vZl9ub2RlKQorCWlmIChJU19FTkFCTEVEKENPTkZJR19PRikgJiYgIXRwc19ib2FyZCAmJgorCQl0cHM2NTA3eF9kZXYtPmRldi0+b2Zfbm9kZSkKIAkJdHBzX2JvYXJkID0gdHBzNjUwN3hfcGFyc2VfZHRfcmVnX2RhdGEocGRldiwKLQkJCQkJCSZ0cHM2NTA3eF9yZWdfbWF0Y2hlcyk7CisJCQkJJnRwczY1MDd4X3JlZ19tYXRjaGVzKTsKIAlpZiAoIXRwc19ib2FyZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTQ4MSw3ICs0NzAsNyBAQAogCQl0cHMtPmluZm9baV0gPSBpbmZvOwogCQlpZiAoaW5pdF9kYXRhLT5kcml2ZXJfZGF0YSkgewogCQkJc3RydWN0IHRwczY1MDd4X3JlZ19wbGF0Zm9ybV9kYXRhICpkYXRhID0KLQkJCQkJCQlpbml0X2RhdGEtPmRyaXZlcl9kYXRhOworCQkJCQlpbml0X2RhdGEtPmRyaXZlcl9kYXRhOwogCQkJdHBzLT5pbmZvW2ldLT5kZWZkY2RjX2RlZmF1bHQgPSBkYXRhLT5kZWZkY2RjX2RlZmF1bHQ7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwOTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA5MC1yZWd1bGF0b3IuYwppbmRleCA2NzZmNzU1Li4yZTkyZWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA5MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA5MC1yZWd1bGF0b3IuYwpAQCAtMTY4LDE3ICsxNjgsMTMgQEAKIAogCXRwczY1MDkwX3BkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHBzNjUwOTBfcGRhdGEpLAogCQkJCUdGUF9LRVJORUwpOwotCWlmICghdHBzNjUwOTBfcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZvciB0cHM2NTA5MF9wZGF0YSBmYWlsZWRcbiIpOworCWlmICghdHBzNjUwOTBfcGRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KIAogCXJlZ19wZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBUUFM2NTA5MF9SRUdVTEFUT1JfTUFYICoKIAkJCQlzaXplb2YoKnJlZ19wZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcmVnX3BkYXRhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmb3IgcmVnX3BkYXRhIGZhaWxlZFxuIik7CisJaWYgKCFyZWdfcGRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KIAogCXJlZ3VsYXRvcnMgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXJlZ3VsYXRvcnMpIHsKQEAgLTE4OCw2ICsxODQsNyBAQAogCiAJcmV0ID0gb2ZfcmVndWxhdG9yX21hdGNoKCZwZGV2LT5kZXYsIHJlZ3VsYXRvcnMsIHRwczY1MDkwX21hdGNoZXMsCiAJCQlBUlJBWV9TSVpFKHRwczY1MDkwX21hdGNoZXMpKTsKKwlvZl9ub2RlX3B1dChyZWd1bGF0b3JzKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiRXJyb3IgcGFyc2luZyByZWd1bGF0b3IgaW5pdCBkYXRhOiAlZFxuIiwgcmV0KTsKQEAgLTI1MiwxMCArMjQ5LDggQEAKIAogCXBtaWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgVFBTNjUwOTBfUkVHVUxBVE9SX01BWCAqIHNpemVvZigqcG1pYyksCiAJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBtaWMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWVtIGFsbG9jIGZvciBwbWljIGZhaWxlZFxuIik7CisJaWYgKCFwbWljKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKG51bSA9IDA7IG51bSA8IFRQUzY1MDkwX1JFR1VMQVRPUl9NQVg7IG51bSsrKSB7CiAJCXRwc19wZGF0YSA9IHRwczY1MDkwX3BkYXRhLT5yZWdfcGRhdGFbbnVtXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE3LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTctcmVndWxhdG9yLmMKaW5kZXggOWVhMWJmMi4uMTBiNzhkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTctcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTctcmVndWxhdG9yLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVnczsKIAlpbnQgaSwgY291bnQ7CiAKLQlyZWdzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobm9kZSwgInJlZ3VsYXRvcnMiKTsKKwlyZWdzID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobm9kZSwgInJlZ3VsYXRvcnMiKTsKIAlpZiAoIXJlZ3MpCiAJCXJldHVybiBOVUxMOwogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAoIXJlZ19tYXRjaGVzW2ldLmluaXRfZGF0YSB8fCAhcmVnX21hdGNoZXNbaV0ub2Zfbm9kZSkKKwkJaWYgKCFyZWdfbWF0Y2hlc1tpXS5vZl9ub2RlKQogCQkJY29udGludWU7CiAKIAkJcGRhdGEtPnRwczY1MjE3X2luaXRfZGF0YVtpXSA9IHJlZ19tYXRjaGVzW2ldLmluaXRfZGF0YTsKQEAgLTIyMiw3ICsyMjIsNiBAQAogewogCXN0cnVjdCB0cHM2NTIxNyAqdHBzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB0cHM2NTIxN19ib2FyZCAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHRwcy0+ZGV2KTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCWludCBpOwpAQCAtMjQzLDE5ICsyNDIsOSBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRwcyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVFBTNjUyMTdfTlVNX1JFR1VMQVRPUjsgaSsrKSB7Ci0KLQkJcmVnX2RhdGEgPSBwZGF0YS0+dHBzNjUyMTdfaW5pdF9kYXRhW2ldOwotCi0JCS8qCi0JCSAqIFJlZ3VsYXRvciBBUEkgaGFuZGxlcyBlbXB0eSBjb25zdHJhaW50cyBidXQgbm90IE5VTEwKLQkJICogY29uc3RyYWludHMKLQkJICovCi0JCWlmICghcmVnX2RhdGEpCi0JCQljb250aW51ZTsKLQogCQkvKiBSZWdpc3RlciB0aGUgcmVndWxhdG9ycyAqLwogCQljb25maWcuZGV2ID0gdHBzLT5kZXY7Ci0JCWNvbmZpZy5pbml0X2RhdGEgPSByZWdfZGF0YTsKKwkJY29uZmlnLmluaXRfZGF0YSA9IHBkYXRhLT50cHM2NTIxN19pbml0X2RhdGFbaV07CiAJCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHRwczsKIAkJY29uZmlnLnJlZ21hcCA9IHRwcy0+cmVnbWFwOwogCQlpZiAodHBzLT5kZXYtPm9mX25vZGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxOC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzcyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxOC1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIHRwczY1MjE4LXJlZ3VsYXRvci5jCisgKgorICogUmVndWxhdG9yIGRyaXZlciBmb3IgVFBTNjUyMTggUE1JQworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzZWQgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjUyMTguaD4KKworc3RhdGljIHVuc2lnbmVkIGludCB0cHM2NTIxOF9yYW1wX2RlbGF5ID0gNDAwMDsKKworZW51bSB0cHM2NTIxOF9yZWd1bGF0b3JzIHsgRENEQzEsIERDREMyLCBEQ0RDMywgRENEQzQsIERDREM1LCBEQ0RDNiwgTERPMSB9OworCisjZGVmaW5lIFRQUzY1MjE4X1JFR1VMQVRPUihfbmFtZSwgX2lkLCBfb3BzLCBfbiwgX3ZyLCBfdm0sIF9lciwgX2VtLCBfdCwgXAorCQkJICAgIF9sciwgX25scikJCQkJXAorCXsJCQkJCQkJXAorCQkubmFtZQkJCT0gX25hbWUsCQlcCisJCS5pZAkJCT0gX2lkLAkJCVwKKwkJLm9wcwkJCT0gJl9vcHMsCQlcCisJCS5uX3ZvbHRhZ2VzCQk9IF9uLAkJCVwKKwkJLnR5cGUJCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCisJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCQlcCisJCS52c2VsX3JlZwkJPSBfdnIsCQkJXAorCQkudnNlbF9tYXNrCQk9IF92bSwJCQlcCisJCS5lbmFibGVfcmVnCQk9IF9lciwJCQlcCisJCS5lbmFibGVfbWFzawkJPSBfZW0sCQkJXAorCQkudm9sdF90YWJsZQkJPSBfdCwJCQlcCisJCS5saW5lYXJfcmFuZ2VzCQk9IF9sciwJCQlcCisJCS5uX2xpbmVhcl9yYW5nZXMJPSBfbmxyLAkJCVwKKwl9CQkJCQkJCVwKKworI2RlZmluZSBUUFM2NTIxOF9JTkZPKF9pZCwgX25tLCBfbWluLCBfbWF4KQlcCisJewkJCQkJCVwKKwkJLmlkCQk9IF9pZCwJCQlcCisJCS5uYW1lCQk9IF9ubSwJCQlcCisJCS5taW5fdVYJCT0gX21pbiwJCQlcCisJCS5tYXhfdVYJCT0gX21heCwJCQlcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgZGNkYzFfZGNkYzJfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg4NTAwMDAsIDB4MCwgMHgzMiwgMTAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTM3NTAwMCwgMHgzMywgMHgzZiwgMjUwMDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGxkbzFfZGNkYzNfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg5MDAwMDAsIDB4MCwgMHgxYSwgMjUwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTYwMDAwMCwgMHgxYiwgMHgzZiwgNTAwMDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGRjZGM0X3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTE3NTAwMCwgMHgwLCAweGYsIDI1MDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE1NTAwMDAsIDB4MTAsIDB4MzQsIDUwMDAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBzX2luZm8gdHBzNjUyMThfcG1pY19yZWdzW10gPSB7CisJVFBTNjUyMThfSU5GTygwLCAiRENEQzEiLCA4NTAwMDAsIDE2NzUwMCksCisJVFBTNjUyMThfSU5GTygxLCAiRENEQzIiLCA4NTAwMDAsIDE2NzUwMDApLAorCVRQUzY1MjE4X0lORk8oMiwgIkRDREMzIiwgOTAwMDAwLCAzNDAwMDAwKSwKKwlUUFM2NTIxOF9JTkZPKDMsICJEQ0RDNCIsIDExNzUwMDAsIDM0MDAwMDApLAorCVRQUzY1MjE4X0lORk8oNCwgIkRDREM1IiwgMTAwMDAwMCwgMTAwMDAwMCksCisJVFBTNjUyMThfSU5GTyg1LCAiRENEQzYiLCAxODAwMDAwLCAxODAwMDAwKSwKKwlUUFM2NTIxOF9JTkZPKDYsICJMRE8xIiwgOTAwMDAwLCAzNDAwMDAwKSwKK307CisKKyNkZWZpbmUgVFBTNjUyMThfT0ZfTUFUQ0goY29tcCwgbGFiZWwpIFwKKwl7IFwKKwkJLmNvbXBhdGlibGUgPSBjb21wLCBcCisJCS5kYXRhID0gJmxhYmVsLCBcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0cHM2NTIxOF9vZl9tYXRjaFtdID0geworCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjMSIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDMV0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjMiIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDMl0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjMyIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDM10pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjNCIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDNF0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjNSIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDNV0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1kY2RjNiIsIHRwczY1MjE4X3BtaWNfcmVnc1tEQ0RDNl0pLAorCVRQUzY1MjE4X09GX01BVENIKCJ0aSx0cHM2NTIxOC1sZG8xIiwgdHBzNjUyMThfcG1pY19yZWdzW0xETzFdKSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0cHM2NTIxOF9vZl9tYXRjaCk7CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcG1pY19zZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCWludCByZXQ7CisJc3RydWN0IHRwczY1MjE4ICp0cHMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHJpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwkvKiBTZXQgdGhlIHZvbHRhZ2UgYmFzZWQgb24gdnNlbCB2YWx1ZSBhbmQgd3JpdGUgcHJvdGVjdCBsZXZlbCBpcyAyICovCisJcmV0ID0gdHBzNjUyMThfc2V0X2JpdHModHBzLCBkZXYtPmRlc2MtPnZzZWxfcmVnLCBkZXYtPmRlc2MtPnZzZWxfbWFzaywKKwkJCQlzZWxlY3RvciwgVFBTNjUyMThfUFJPVEVDVF9MMSk7CisKKwkvKiBTZXQgR08gYml0IGZvciBEQ0RDMS8yIHRvIGluaXRpYXRlIHZvbHRhZ2UgdHJhbnNpc3Rpb24gKi8KKwlzd2l0Y2ggKHJpZCkgeworCWNhc2UgVFBTNjUyMThfRENEQ18xOgorCWNhc2UgVFBTNjUyMThfRENEQ18yOgorCQlyZXQgPSB0cHM2NTIxOF9zZXRfYml0cyh0cHMsIFRQUzY1MjE4X1JFR19DT05UUkxfU0xFV19SQVRFLAorCQkJCQlUUFM2NTIxOF9TTEVXX1JBVEVfR08sCisJCQkJCVRQUzY1MjE4X1NMRVdfUkFURV9HTywKKwkJCQkJVFBTNjUyMThfUFJPVEVDVF9MMSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcG1pY19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjUyMTggKnRwcyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmlkID0gcmRldl9nZXRfaWQoZGV2KTsKKworCWlmIChyaWQgPCBUUFM2NTIxOF9EQ0RDXzEgfHwgcmlkID4gVFBTNjUyMThfTERPXzEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRW5hYmxlIHRoZSByZWd1bGF0b3IgYW5kIHBhc3N3b3JkIHByb3RlY3Rpb24gaXMgbGV2ZWwgMSAqLworCXJldHVybiB0cHM2NTIxOF9zZXRfYml0cyh0cHMsIGRldi0+ZGVzYy0+ZW5hYmxlX3JlZywKKwkJCQkgZGV2LT5kZXNjLT5lbmFibGVfbWFzaywgZGV2LT5kZXNjLT5lbmFibGVfbWFzaywKKwkJCQkgVFBTNjUyMThfUFJPVEVDVF9MMSk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcG1pY19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1MjE4ICp0cHMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHJpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwlpZiAocmlkIDwgVFBTNjUyMThfRENEQ18xIHx8IHJpZCA+IFRQUzY1MjE4X0xET18xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpc2FibGUgdGhlIHJlZ3VsYXRvciBhbmQgcGFzc3dvcmQgcHJvdGVjdGlvbiBpcyBsZXZlbCAxICovCisJcmV0dXJuIHRwczY1MjE4X2NsZWFyX2JpdHModHBzLCBkZXYtPmRlc2MtPmVuYWJsZV9yZWcsCisJCQkJICAgZGV2LT5kZXNjLT5lbmFibGVfbWFzaywgVFBTNjUyMThfUFJPVEVDVF9MMSk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfc2V0X3ZvbHRhZ2VfdGltZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJdW5zaWduZWQgaW50IG9sZF9zZWxlY3RvciwgdW5zaWduZWQgaW50IG5ld19zZWxlY3RvcikKK3sKKwlpbnQgb2xkX3V2LCBuZXdfdXY7CisKKwlvbGRfdXYgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhcl9yYW5nZShyZGV2LCBvbGRfc2VsZWN0b3IpOworCWlmIChvbGRfdXYgPCAwKQorCQlyZXR1cm4gb2xkX3V2OworCisJbmV3X3V2ID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXJfcmFuZ2UocmRldiwgbmV3X3NlbGVjdG9yKTsKKwlpZiAobmV3X3V2IDwgMCkKKwkJcmV0dXJuIG5ld191djsKKworCXJldHVybiBESVZfUk9VTkRfVVAoYWJzKG9sZF91diAtIG5ld191diksIHRwczY1MjE4X3JhbXBfZGVsYXkpOworfQorCisvKiBPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBEQ0RDMSwgRENEQzIgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB0cHM2NTIxOF9kY2RjMTJfb3BzID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSB0cHM2NTIxOF9wbWljX2VuYWJsZSwKKwkuZGlzYWJsZQkJPSB0cHM2NTIxOF9wbWljX2Rpc2FibGUsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSB0cHM2NTIxOF9wbWljX3NldF92b2x0YWdlX3NlbCwKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorCS5zZXRfdm9sdGFnZV90aW1lX3NlbAk9IHRwczY1MjE4X3NldF92b2x0YWdlX3RpbWVfc2VsLAorfTsKKworLyogT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gRENEQzMsIERDREM0IGFuZCBMRE8xICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHBzNjUyMThfbGRvMV9kY2RjMzRfb3BzID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSB0cHM2NTIxOF9wbWljX2VuYWJsZSwKKwkuZGlzYWJsZQkJPSB0cHM2NTIxOF9wbWljX2Rpc2FibGUsCisJLmdldF92b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFnZV9zZWwJPSB0cHM2NTIxOF9wbWljX3NldF92b2x0YWdlX3NlbCwKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyX3JhbmdlLAorfTsKKworLyogT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gRENEQzUsIERDREM2ICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHBzNjUyMThfZGNkYzU2X3BtaWNfb3BzID0geworCS5pc19lbmFibGVkCQk9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuZW5hYmxlCQkJPSB0cHM2NTIxOF9wbWljX2VuYWJsZSwKKwkuZGlzYWJsZQkJPSB0cHM2NTIxOF9wbWljX2Rpc2FibGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJlZ3VsYXRvcnNbXSA9IHsKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREMxIiwgVFBTNjUyMThfRENEQ18xLCB0cHM2NTIxOF9kY2RjMTJfb3BzLCA2NCwKKwkJCSAgIFRQUzY1MjE4X1JFR19DT05UUk9MX0RDREMxLAorCQkJICAgVFBTNjUyMThfQ09OVFJPTF9EQ0RDMV9NQVNLLAorCQkJICAgVFBTNjUyMThfUkVHX0VOQUJMRTEsIFRQUzY1MjE4X0VOQUJMRTFfREMxX0VOLCBOVUxMLAorCQkJICAgZGNkYzFfZGNkYzJfcmFuZ2VzLCAyKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREMyIiwgVFBTNjUyMThfRENEQ18yLCB0cHM2NTIxOF9kY2RjMTJfb3BzLCA2NCwKKwkJCSAgIFRQUzY1MjE4X1JFR19DT05UUk9MX0RDREMyLAorCQkJICAgVFBTNjUyMThfQ09OVFJPTF9EQ0RDMl9NQVNLLAorCQkJICAgVFBTNjUyMThfUkVHX0VOQUJMRTEsIFRQUzY1MjE4X0VOQUJMRTFfREMyX0VOLCBOVUxMLAorCQkJICAgZGNkYzFfZGNkYzJfcmFuZ2VzLCAyKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREMzIiwgVFBTNjUyMThfRENEQ18zLCB0cHM2NTIxOF9sZG8xX2RjZGMzNF9vcHMsCisJCQkgICA2NCwgVFBTNjUyMThfUkVHX0NPTlRST0xfRENEQzMsCisJCQkgICBUUFM2NTIxOF9DT05UUk9MX0RDREMzX01BU0ssIFRQUzY1MjE4X1JFR19FTkFCTEUxLAorCQkJICAgVFBTNjUyMThfRU5BQkxFMV9EQzNfRU4sIE5VTEwsCisJCQkgICBsZG8xX2RjZGMzX3JhbmdlcywgMiksCisJVFBTNjUyMThfUkVHVUxBVE9SKCJEQ0RDNCIsIFRQUzY1MjE4X0RDRENfNCwgdHBzNjUyMThfbGRvMV9kY2RjMzRfb3BzLAorCQkJICAgNTMsIFRQUzY1MjE4X1JFR19DT05UUk9MX0RDREM0LAorCQkJICAgVFBTNjUyMThfQ09OVFJPTF9EQ0RDNF9NQVNLLAorCQkJICAgVFBTNjUyMThfUkVHX0VOQUJMRTEsIFRQUzY1MjE4X0VOQUJMRTFfREM0X0VOLCBOVUxMLAorCQkJICAgZGNkYzRfcmFuZ2VzLCAyKSwKKwlUUFM2NTIxOF9SRUdVTEFUT1IoIkRDREM1IiwgVFBTNjUyMThfRENEQ181LCB0cHM2NTIxOF9kY2RjNTZfcG1pY19vcHMsCisJCQkgICAxLCAtMSwgLTEsIFRQUzY1MjE4X1JFR19FTkFCTEUxLAorCQkJICAgVFBTNjUyMThfRU5BQkxFMV9EQzVfRU4sIE5VTEwsIE5VTEwsIDApLAorCVRQUzY1MjE4X1JFR1VMQVRPUigiRENEQzYiLCBUUFM2NTIxOF9EQ0RDXzYsIHRwczY1MjE4X2RjZGM1Nl9wbWljX29wcywKKwkJCSAgIDEsIC0xLCAtMSwgVFBTNjUyMThfUkVHX0VOQUJMRTEsCisJCQkgICBUUFM2NTIxOF9FTkFCTEUxX0RDNl9FTiwgTlVMTCwgTlVMTCwgMCksCisJVFBTNjUyMThfUkVHVUxBVE9SKCJMRE8xIiwgVFBTNjUyMThfTERPXzEsIHRwczY1MjE4X2xkbzFfZGNkYzM0X29wcywgNjQsCisJCQkgICBUUFM2NTIxOF9SRUdfQ09OVFJPTF9EQ0RDNCwKKwkJCSAgIFRQUzY1MjE4X0NPTlRST0xfTERPMV9NQVNLLCBUUFM2NTIxOF9SRUdfRU5BQkxFMiwKKwkJCSAgIFRQUzY1MjE4X0VOQUJMRTJfTERPMV9FTiwgTlVMTCwgbGRvMV9kY2RjM19yYW5nZXMsCisJCQkgICAyKSwKK307CisKK3N0YXRpYyBpbnQgdHBzNjUyMThfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1MjE4ICp0cHMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YTsKKwljb25zdCBzdHJ1Y3QgdHBzX2luZm8JKnRlbXBsYXRlOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQJKm1hdGNoOworCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKKwlpbnQgaWQ7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZSh0cHM2NTIxOF9vZl9tYXRjaCwgJnBkZXYtPmRldik7CisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0ZW1wbGF0ZSA9IG1hdGNoLT5kYXRhOworCWlkID0gdGVtcGxhdGUtPmlkOworCWluaXRfZGF0YSA9IG9mX2dldF9yZWd1bGF0b3JfaW5pdF9kYXRhKCZwZGV2LT5kZXYsIHBkZXYtPmRldi5vZl9ub2RlKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRwcyk7CisKKwl0cHMtPmluZm9baWRdID0gJnRwczY1MjE4X3BtaWNfcmVnc1tpZF07CisJY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CisJY29uZmlnLmluaXRfZGF0YSA9IGluaXRfZGF0YTsKKwljb25maWcuZHJpdmVyX2RhdGEgPSB0cHM7CisJY29uZmlnLnJlZ21hcCA9IHRwcy0+cmVnbWFwOworCisJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZyZWd1bGF0b3JzW2lkXSwgJmNvbmZpZyk7CisJaWYgKElTX0VSUihyZGV2KSkgeworCQlkZXZfZXJyKHRwcy0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHJlZ3VsYXRvclxuIiwKKwkJCXBkZXYtPm5hbWUpOworCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBzNjUyMThfcmVndWxhdG9yX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0cHM2NTIxOC1wbWljIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRwczY1MjE4X29mX21hdGNoLAorCX0sCisJLnByb2JlID0gdHBzNjUyMThfcmVndWxhdG9yX3Byb2JlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0cHM2NTIxOF9yZWd1bGF0b3JfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSiBLZWVydGh5IDxqLWtlZXJ0aHlAdGkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTIxOCB2b2x0YWdlIHJlZ3VsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHBzNjUyMTgtcG1pYyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyNHgtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYwppbmRleCA5ZjZiZmRhLi41YjQ5NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYwpAQCAtNTkzLDEwICs1OTMsOSBAQAogCX0KIAogCWh3ID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKHN0cnVjdCB0cHM2NTI0eCksIEdGUF9LRVJORUwpOwotCWlmICghaHcpIHsKLQkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgcmVndWxhdG9yIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFodykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgaHcpOwogCiAJbWVtc2V0KGh3LCAwLCBzaXplb2Yoc3RydWN0IHRwczY1MjR4KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jCmluZGV4IDA0ODVkNDcuLjMyZjM4YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jCkBAIC0zNjMsMTAgKzM2Myw4IEBACiAJfQogCiAJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jdGlvbiBmYWlsZWRcbiIpOworCWlmICghcGRhdGEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQlpbnQgaWQ7CkBAIC0zOTgsNyArMzk2LDcgQEAKIHsKIAlzdHJ1Y3QgdHBzNjU4NnhfcmVndWxhdG9yICpyaSA9IE5VTEw7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CiAJc3RydWN0IHRwczY1ODZ4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKnRwczY1ODZ4X3JlZ19tYXRjaGVzID0gTlVMTDsKQEAgLTQxOCwxMyArNDE2LDYgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcmRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBUUFM2NTg2WF9JRF9NQVhfUkVHVUxBVE9SICoKLQkJCQlzaXplb2YoKnJkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJkZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTW1lbW9yeSBhbGxvYyBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAl2ZXJzaW9uID0gdHBzNjU4NnhfZ2V0X3ZlcnNpb24ocGRldi0+ZGV2LnBhcmVudCk7CiAKIAlmb3IgKGlkID0gMDsgaWQgPCBUUFM2NTg2WF9JRF9NQVhfUkVHVUxBVE9SOyArK2lkKSB7CkBAIC00NTEsMTIgKzQ0MiwxMSBAQAogCQlpZiAodHBzNjU4NnhfcmVnX21hdGNoZXMpCiAJCQljb25maWcub2Zfbm9kZSA9IHRwczY1ODZ4X3JlZ19tYXRjaGVzW2lkXS5vZl9ub2RlOwogCi0JCXJkZXZbaWRdID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnJpLT5kZXNjLAotCQkJCQkJICAgJmNvbmZpZyk7Ci0JCWlmIChJU19FUlIocmRldltpZF0pKSB7CisJCXJkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcmktPmRlc2MsICZjb25maWcpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yICVzXG4iLAogCQkJCQlyaS0+ZGVzYy5uYW1lKTsKLQkJCXJldHVybiBQVFJfRVJSKHJkZXZbaWRdKTsKKwkJCXJldHVybiBQVFJfRVJSKHJkZXYpOwogCQl9CiAKIAkJaWYgKHJlZ19kYXRhKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCmluZGV4IGY1MGRkODQuLmZhN2RiODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCkBAIC0xMDExLDExICsxMDExLDggQEAKIAogCXBtaWNfcGxhdF9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcG1pY19wbGF0X2RhdGEpLAogCQkJCQlHRlBfS0VSTkVMKTsKLQotCWlmICghcG1pY19wbGF0X2RhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbHVyZSB0byBhbGxvYyBwZGF0YSBmb3IgcmVndWxhdG9ycy5cbiIpOworCWlmICghcG1pY19wbGF0X2RhdGEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCW5wID0gb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7CiAJcmVndWxhdG9ycyA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAicmVndWxhdG9ycyIpOwpAQCAtMTA5OCwxMCArMTA5NSw4IEBACiAJfQogCiAJcG1pYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBtaWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBtaWMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBwbWljXG4iKTsKKwlpZiAoIXBtaWMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBtaWMtPm1mZCA9IHRwczY1OTEwOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBtaWMpOwpAQCAtMTEzMCwyNCArMTEyNSwxOCBAQAogCiAJcG1pYy0+ZGVzYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBwbWljLT5udW1fcmVndWxhdG9ycyAqCiAJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWljLT5kZXNjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlscyBmb3IgZGVzY1xuIik7CisJaWYgKCFwbWljLT5kZXNjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwbWljLT5pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHBtaWMtPm51bV9yZWd1bGF0b3JzICoKIAkJCXNpemVvZihzdHJ1Y3QgdHBzX2luZm8gKiksIEdGUF9LRVJORUwpOwotCWlmICghcG1pYy0+aW5mbykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHMgZm9yIGluZm9cbiIpOworCWlmICghcG1pYy0+aW5mbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcG1pYy0+cmRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBwbWljLT5udW1fcmVndWxhdG9ycyAqCiAJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiksIEdGUF9LRVJORUwpOwotCWlmICghcG1pYy0+cmRldikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNZW1vcnkgYWxsb2MgZmFpbHMgZm9yIHJkZXZcbiIpOworCWlmICghcG1pYy0+cmRldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IHBtaWMtPm51bV9yZWd1bGF0b3JzICYmIGkgPCBUUFM2NTkxMF9OVU1fUkVHUzsKIAkJCWkrKywgaW5mbysrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM4MDAzMS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczgwMDMxLXJlZ3VsYXRvci5jCmluZGV4IDcxZjQ1N2EuLjI2YWE2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczgwMDMxLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczgwMDMxLXJlZ3VsYXRvci5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJCXJpLT5yaW5mby0+c3RhdGVfcmVnLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gKChyZWdfdmFsICYgVFBTODAwMzFfU1RBVEVfTUFTSykgPT0gVFBTODAwMzFfU1RBVEVfT04pOworCXJldHVybiAocmVnX3ZhbCAmIFRQUzgwMDMxX1NUQVRFX01BU0spID09IFRQUzgwMDMxX1NUQVRFX09OOwogfQogCiBzdGF0aWMgaW50IHRwczgwMDMxX3JlZ19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCkBAIC02OTMsMTAgKzY5Myw4IEBACiAKIAlwbWljID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQlUUFM4MDAzMV9SRUdVTEFUT1JfTUFYICogc2l6ZW9mKCpwbWljKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWljKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm1lbSBhbGxvYyBmb3IgcG1pYyBmYWlsZWRcbiIpOworCWlmICghcG1pYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChudW0gPSAwOyBudW0gPCBUUFM4MDAzMV9SRUdVTEFUT1JfTUFYOyArK251bSkgewogCQl0cHNfcGRhdGEgPSBwZGF0YS0+cmVndWxhdG9yX3BkYXRhW251bV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYwppbmRleCAwNGNmOWMxLi4wZDg4YTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMKQEAgLTQ2OSwxMCArNDY5LDggQEAKIAogCWRjZGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgIHNpemVvZihzdHJ1Y3Qgd204MzF4X2RjZGMpLAogCQkJICAgIEdGUF9LRVJORUwpOwotCWlmIChkY2RjID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFkY2RjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkY2RjLT53bTgzMXggPSB3bTgzMXg7CiAKQEAgLTYyMiwxMCArNjIwLDggQEAKIAogCWRjZGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfZGNkYyksCiAJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRjZGMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWRjZGMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRjZGMtPndtODMxeCA9IHdtODMxeDsKIApAQCAtNzUyLDEwICs3NDgsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWRjZGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfZGNkYyksIEdGUF9LRVJORUwpOwotCWlmIChkY2RjID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFkY2RjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkY2RjLT53bTgzMXggPSB3bTgzMXg7CiAKQEAgLTg0MiwxMCArODM2LDggQEAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIEVQRSVkXG4iLCBpZCArIDEpOwogCiAJZGNkYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODMxeF9kY2RjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRjZGMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWRjZGMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRjZGMtPndtODMxeCA9IHdtODMxeDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWlzaW5rLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtaXNpbmsuYwppbmRleCAwMzM5Yjg4Li43MmUzODVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtaXNpbmsuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtaXNpbmsuYwpAQCAtMTY1LDEwICsxNjUsOCBAQAogCiAJaXNpbmsgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfaXNpbmspLAogCQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoaXNpbmsgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhXG4iKTsKKwlpZiAoIWlzaW5rKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpc2luay0+d204MzF4ID0gd204MzF4OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMKaW5kZXggNDZkNjcwMC4uZWNhMGVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1sZG8uYwpAQCAtMjM1LDEwICsyMzUsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlsZG8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfbGRvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxkbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbGRvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlsZG8tPndtODMxeCA9IHdtODMxeDsKIApAQCAtNDQ3LDEwICs0NDUsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlsZG8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfbGRvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxkbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbGRvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlsZG8tPndtODMxeCA9IHdtODMxeDsKIApAQCAtNTk0LDEwICs1OTAsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlsZG8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3bTgzMXhfbGRvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxkbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCWlmICghbGRvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlsZG8tPndtODMxeCA9IHdtODMxeDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCmluZGV4IGRlN2I5YzcuLjdlYzdjMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKQEAgLTM2MSw3ICszNjEsNyBAQAogCiAJc2VsID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcihyZGV2LCB1ViwgdVYpOwogCWlmIChzZWwgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHNlbDsKIAogCS8qIGFsbCBEQ0RDcyBoYXZlIHNhbWUgbVYgYml0cyAqLwogCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHZvbHRfcmVnKSAmIH5XTTgzNTBfREMxX1ZTRUxfTUFTSzsKQEAgLTU3NCw3ICs1NzQsNyBAQAogCiAJc2VsID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcl9yYW5nZShyZGV2LCB1ViwgdVYpOwogCWlmIChzZWwgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHNlbDsKIAogCS8qIGFsbCBMRE9zIGhhdmUgc2FtZSBtViBiaXRzICovCiAJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgfldNODM1MF9MRE8xX1ZTRUxfTUFTSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYwppbmRleCA3MWM1OTExLi5jMjQzNDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCkBAIC0xMzQsMTAgKzEzNCw4IEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWxkbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODk5NF9sZG8pLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRvID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIik7CisJaWYgKCFsZG8pCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWxkby0+d204OTk0ID0gd204OTk0OwogCWxkby0+c3VwcGx5ID0gd204OTk0X2xkb19jb25zdW1lcltpZF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCBlYmY0MWUyLi5lZTBlODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKQEAgLTMwNCwxMiArMzA0LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGRjc3NibGtfdW5yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLQlwdXRfZGV2aWNlKGRldik7Ci19Ci0KIC8qCiAgKiBkZXZpY2UgYXR0cmlidXRlIGZvciBzd2l0Y2hpbmcgc2hhcmVkL25vbnNoYXJlZCAoZXhjbHVzaXZlKQogICogb3BlcmF0aW9uIChzaG93ICsgc3RvcmUpCkBAIC0zOTcsNyArMzkxLDEzIEBACiAJYmxrX2NsZWFudXBfcXVldWUoZGV2X2luZm8tPmRjc3NibGtfcXVldWUpOwogCWRldl9pbmZvLT5nZC0+cXVldWUgPSBOVUxMOwogCXB1dF9kaXNrKGRldl9pbmZvLT5nZCk7Ci0JcmMgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soZGV2LCBkY3NzYmxrX3VucmVnaXN0ZXJfY2FsbGJhY2spOworCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKKworCWlmIChkZXZpY2VfcmVtb3ZlX2ZpbGVfc2VsZihkZXYsIGF0dHIpKSB7CisJCWRldmljZV91bnJlZ2lzdGVyKGRldik7CisJCXB1dF9kZXZpY2UoZGV2KTsKKwl9CisJcmV0dXJuIHJjOwogb3V0OgogCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKaW5kZXggZWI1ZDIyNy4uNWFmN2YwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYwpAQCAtOTIyLDcgKzkyMiw3IEBACiAJCXJhdzMyMTVfZnJlZWxpc3QgPSByZXE7CiAJfQogCi0JY2RldiA9IGNjd19kZXZpY2VfcHJvYmVfY29uc29sZSgpOworCWNkZXYgPSBjY3dfZGV2aWNlX2NyZWF0ZV9jb25zb2xlKCZyYXczMjE1X2Njd19kcml2ZXIpOwogCWlmIChJU19FUlIoY2RldikpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC05MzIsNiArOTMyLDEyIEBACiAJY2Rldi0+aGFuZGxlciA9IHJhdzMyMTVfaXJxOwogCiAJcmF3LT5mbGFncyB8PSBSQVczMjE1X0ZJWEVEOworCWlmIChjY3dfZGV2aWNlX2VuYWJsZV9jb25zb2xlKGNkZXYpKSB7CisJCWNjd19kZXZpY2VfZGVzdHJveV9jb25zb2xlKGNkZXYpOworCQlyYXczMjE1X2ZyZWVfaW5mbyhyYXcpOworCQlyYXczMjE1WzBdID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJLyogUmVxdWVzdCB0aGUgY29uc29sZSBpcnEgKi8KIAlpZiAocmF3MzIxNV9zdGFydHVwKHJhdykgIT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCmluZGV4IDY5OWZkM2UuLjc1ZmZlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKQEAgLTcsNiArNyw3IEBACiAgKiAgICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAzLCAyMDA5CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zMCw2ICszMSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmF3MzI3MF9mbiBjb24zMjcwX2ZuOwogCitzdGF0aWMgYm9vbCBhdXRvX3VwZGF0ZSA9IDE7Cittb2R1bGVfcGFyYW0oYXV0b191cGRhdGUsIGJvb2wsIDApOworCiAvKgogICogTWFpbiAzMjcwIGNvbnNvbGUgdmlldyBkYXRhIHN0cnVjdHVyZS4KICAqLwpAQCAtMjA0LDYgKzIwOCw4IEBACiAJc3RydWN0IHN0cmluZyAqcywgKm47CiAJaW50IHJjOwogCisJaWYgKCFhdXRvX3VwZGF0ZSAmJiAhcmF3MzI3MF92aWV3X2FjdGl2ZSgmY3AtPnZpZXcpKQorCQlyZXR1cm47CiAJaWYgKGNwLT52aWV3LmRldikKIAkJcmF3MzI3MF9hY3RpdmF0ZV92aWV3KCZjcC0+dmlldyk7CiAKQEAgLTUyOSw2ICs1MzUsNyBAQAogCWlmICghY3AtPnZpZXcuZGV2KQogCQlyZXR1cm47CiAJcmF3MzI3MF9wbV91bmZyZWV6ZSgmY3AtPnZpZXcpOworCXJhdzMyNzBfYWN0aXZhdGVfdmlldygmY3AtPnZpZXcpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+dmlldy5sb2NrLCBmbGFncyk7CiAJY29uMzI3MF93YWl0X3dyaXRlKGNwKTsKIAljcC0+bnJfdXAgPSAwOwpAQCAtNTc2LDcgKzU4Myw2IEBACiBzdGF0aWMgaW50IF9faW5pdAogY29uMzI3MF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJc3RydWN0IHJhdzMyNzAgKnJwOwogCXZvaWQgKmNidWY7CiAJaW50IGk7CkBAIC01OTEsMTAgKzU5Nyw3IEBACiAJCWNwY21kKCJURVJNIEFVVE9DUiBPRkYiLCBOVUxMLCAwLCBOVUxMKTsKIAl9CiAKLQljZGV2ID0gY2N3X2RldmljZV9wcm9iZV9jb25zb2xlKCk7Ci0JaWYgKElTX0VSUihjZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcnAgPSByYXczMjcwX3NldHVwX2NvbnNvbGUoY2Rldik7CisJcnAgPSByYXczMjcwX3NldHVwX2NvbnNvbGUoKTsKIAlpZiAoSVNfRVJSKHJwKSkKIAkJcmV0dXJuIFBUUl9FUlIocnApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKaW5kZXggMmNkZWMyMS4uOWY4NDlkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYwpAQCAtMjc2LDYgKzI3NiwxNSBAQAogfQogCiBpbnQKK3JhdzMyNzBfdmlld19hY3RpdmUoc3RydWN0IHJhdzMyNzBfdmlldyAqdmlldykKK3sKKwlzdHJ1Y3QgcmF3MzI3MCAqcnAgPSB2aWV3LT5kZXY7CisKKwlyZXR1cm4gcnAgJiYgcnAtPnZpZXcgPT0gdmlldyAmJgorCQkhdGVzdF9iaXQoUkFXMzI3MF9GTEFHU19GUk9aRU4sICZycC0+ZmxhZ3MpOworfQorCitpbnQKIHJhdzMyNzBfc3RhcnQoc3RydWN0IHJhdzMyNzBfdmlldyAqdmlldywgc3RydWN0IHJhdzMyNzBfcmVxdWVzdCAqcnEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc3NiwyMiArNzg1LDM3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfVE4zMjcwX0NPTlNPTEUKKy8qIFRlbnRhdGl2ZSBkZWZpbml0aW9uIC0gc2VlIGJlbG93IGZvciBhY3R1YWwgZGVmaW5pdGlvbi4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2N3X2RyaXZlciByYXczMjcwX2Njd19kcml2ZXI7CisKIC8qCiAgKiBTZXR1cCAzMjcwIGRldmljZSBjb25maWd1cmVkIGFzIGNvbnNvbGUuCiAgKi8KLXN0cnVjdCByYXczMjcwIF9faW5pdCAqcmF3MzI3MF9zZXR1cF9jb25zb2xlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQorc3RydWN0IHJhdzMyNzAgX19pbml0ICpyYXczMjcwX3NldHVwX2NvbnNvbGUodm9pZCkKIHsKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCByYXczMjcwICpycDsKIAljaGFyICphc2NlYmM7CiAJaW50IHJjOwogCisJY2RldiA9IGNjd19kZXZpY2VfY3JlYXRlX2NvbnNvbGUoJnJhdzMyNzBfY2N3X2RyaXZlcik7CisJaWYgKElTX0VSUihjZGV2KSkKKwkJcmV0dXJuIEVSUl9DQVNUKGNkZXYpOworCiAJcnAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmF3MzI3MCksIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlhc2NlYmMgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CiAJcmMgPSByYXczMjcwX3NldHVwX2RldmljZShjZGV2LCBycCwgYXNjZWJjKTsKIAlpZiAocmMpCiAJCXJldHVybiBFUlJfUFRSKHJjKTsKIAlzZXRfYml0KFJBVzMyNzBfRkxBR1NfQ09OU09MRSwgJnJwLT5mbGFncyk7CisKKwlyYyA9IGNjd19kZXZpY2VfZW5hYmxlX2NvbnNvbGUoY2Rldik7CisJaWYgKHJjKSB7CisJCWNjd19kZXZpY2VfZGVzdHJveV9jb25zb2xlKGNkZXYpOworCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJfQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJwLT5jZGV2KSwgZmxhZ3MpOwogCWRvIHsKIAkJX19yYXczMjcwX3Jlc2V0X2RldmljZShycCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmggYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmgKaW5kZXggN2I3M2ZmOC4uZTFlNDFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5oCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuaApAQCAtMTczLDYgKzE3Myw3IEBACiBpbnQgcmF3MzI3MF9zdGFydF9pcnEoc3RydWN0IHJhdzMyNzBfdmlldyAqLCBzdHJ1Y3QgcmF3MzI3MF9yZXF1ZXN0ICopOwogaW50IHJhdzMyNzBfcmVzZXQoc3RydWN0IHJhdzMyNzBfdmlldyAqKTsKIHN0cnVjdCByYXczMjcwX3ZpZXcgKnJhdzMyNzBfdmlldyhzdHJ1Y3QgcmF3MzI3MF92aWV3ICopOworaW50IHJhdzMyNzBfdmlld19hY3RpdmUoc3RydWN0IHJhdzMyNzBfdmlldyAqKTsKIAogLyogUmVmZXJlbmNlIGNvdW50IGlubGluZXIgZm9yIHZpZXcgc3RydWN0dXJlcy4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTkwLDcgKzE5MSw3IEBACiAJCXdha2VfdXAoJnJhdzMyNzBfd2FpdF9xdWV1ZSk7CiB9CiAKLXN0cnVjdCByYXczMjcwICpyYXczMjcwX3NldHVwX2NvbnNvbGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOworc3RydWN0IHJhdzMyNzAgKnJhdzMyNzBfc2V0dXBfY29uc29sZSh2b2lkKTsKIHZvaWQgcmF3MzI3MF93YWl0X2NvbnNfZGV2KHN0cnVjdCByYXczMjcwICopOwogCiAvKiBOb3RpZmllciBmb3IgZGV2aWNlIGFkZGl0aW9uL3JlbW92YWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfZWFybHkuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfZWFybHkuYwppbmRleCA4MmYyYzM4Li4xNDE5NmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2Vhcmx5LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9lYXJseS5jCkBAIC0yMCw3ICsyMCw5IEBACiAJc3RydWN0CXNjY2JfaGVhZGVyIGhlYWRlcjsJLyogMC03ICovCiAJdTE2CXJubWF4OwkJCS8qIDgtOSAqLwogCXU4CXJuc2l6ZTsJCQkvKiAxMCAqLwotCXU4CV9yZXNlcnZlZDBbMjQgLSAxMV07CS8qIDExLTE1ICovCisJdTgJX3Jlc2VydmVkMFsxNiAtIDExXTsJLyogMTEtMTUgKi8KKwl1MTYJbmNwdXJsOwkJCS8qIDE2LTE3ICovCisJdTgJX3Jlc2VydmVkN1syNCAtIDE4XTsJLyogMTgtMjMgKi8KIAl1OAlsb2FkcGFybVs4XTsJCS8qIDI0LTMxICovCiAJdTgJX3Jlc2VydmVkMVs0OCAtIDMyXTsJLyogMzItNDcgKi8KIAl1NjQJZmFjaWxpdGllczsJCS8qIDQ4LTU1ICovCkBAIC0zMiwxMyArMzQsMTYgQEAKIAl1OAlfcmVzZXJ2ZWQ0WzEwMCAtIDkyXTsJLyogOTItOTkgKi8KIAl1MzIJcm5zaXplMjsJCS8qIDEwMC0xMDMgKi8KIAl1NjQJcm5tYXgyOwkJCS8qIDEwNC0xMTEgKi8KLQl1OAlfcmVzZXJ2ZWQ1WzQwOTYgLSAxMTJdOwkvKiAxMTItNDA5NSAqLworCXU4CV9yZXNlcnZlZDVbMTIwIC0gMTEyXTsJLyogMTEyLTExOSAqLworCXUxNgloY3B1YTsJCQkvKiAxMjAtMTIxICovCisJdTgJX3Jlc2VydmVkNls0MDk2IC0gMTIyXTsJLyogMTIyLTQwOTUgKi8KIH0gX19wYWNrZWQgX19hbGlnbmVkKFBBR0VfU0laRSk7CiAKIHN0YXRpYyBjaGFyIHNjY2JfZWFybHlbUEFHRV9TSVpFXSBfX2FsaWduZWQoUEFHRV9TSVpFKSBfX2luaXRkYXRhOwogc3RhdGljIHVuc2lnbmVkIGludCBzY2xwX2Nvbl9oYXNfdnQyMjAgX19pbml0ZGF0YTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2NscF9jb25faGFzX2xpbmVtb2RlIF9faW5pdGRhdGE7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzY2xwX2hzYV9zaXplOworc3RhdGljIHVuc2lnbmVkIGludCBzY2xwX21heF9jcHU7CiBzdGF0aWMgc3RydWN0IHNjbHBfaXBsX2luZm8gc2NscF9pcGxfaW5mbzsKIAogdTY0IHNjbHBfZmFjaWxpdGllczsKQEAgLTEwMiw2ICsxMDcsMTUgQEAKIAlzY2xwX3J6bSA9IHNjY2ItPnJuc2l6ZSA/IHNjY2ItPnJuc2l6ZSA6IHNjY2ItPnJuc2l6ZTI7CiAJc2NscF9yem0gPDw9IDIwOwogCisJaWYgKCFzY2NiLT5oY3B1YSkgeworCQlpZiAoTUFDSElORV9JU19WTSkKKwkJCXNjbHBfbWF4X2NwdSA9IDY0OworCQllbHNlCisJCQlzY2xwX21heF9jcHUgPSBzY2NiLT5uY3B1cmw7CisJfSBlbHNlIHsKKwkJc2NscF9tYXhfY3B1ID0gc2NjYi0+aGNwdWEgKyAxOworCX0KKwogCS8qIFNhdmUgSVBMIGluZm9ybWF0aW9uICovCiAJc2NscF9pcGxfaW5mby5pc192YWxpZCA9IDE7CiAJaWYgKHNjY2ItPmZsYWdzICYgMHgyKQpAQCAtMTI5LDYgKzE0MywxMSBAQAogCXJldHVybiBzY2xwX3J6bTsKIH0KIAordW5zaWduZWQgaW50IHNjbHBfZ2V0X21heF9jcHUodm9pZCkKK3sKKwlyZXR1cm4gc2NscF9tYXhfY3B1OworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciBzY2xwX2ZhY2lsaXRpZXNfZGV0ZWN0KCksIHdoaWNoIGdldHMKICAqIGNhbGxlZCBmcm9tIGVhcmx5LmMgY29kZS4gVGhlIHNjbHBfZmFjaWxpdGllc19kZXRlY3QoKSBmdW5jdGlvbiByZXRyaWV2ZXMKQEAgLTE4NCw5ICsyMDMsOSBAQAogCXNjY2JfaW5pdF9lcV9zaXplKHNjY2IpOwogCWlmIChzY2xwX2NtZF9lYXJseShTQ0xQX0NNRFdfV1JJVEVfRVZFTlRfREFUQSwgc2NjYikpCiAJCXJldHVybiAtRUlPOwotCWlmIChzY2NiLT5ldmJ1Zi5ibGtfY250ICE9IDApCi0JCXJldHVybiAoc2NjYi0+ZXZidWYuYmxrX2NudCAtIDEpICogUEFHRV9TSVpFOwotCXJldHVybiAwOworCWlmIChzY2NiLT5ldmJ1Zi5ibGtfY250ID09IDApCisJCXJldHVybiAwOworCXJldHVybiAoc2NjYi0+ZXZidWYuYmxrX2NudCAtIDEpICogUEFHRV9TSVpFOwogfQogCiBzdGF0aWMgbG9uZyBfX2luaXQgc2NscF9oc2FfY29weV93YWl0KHN0cnVjdCBzY2NiX2hlYWRlciAqc2NjYikKQEAgLTE5NSw2ICsyMTQsOCBAQAogCXNjY2ItPmxlbmd0aCA9IFBBR0VfU0laRTsKIAlpZiAoc2NscF9jbWRfZWFybHkoU0NMUF9DTURXX1JFQURfRVZFTlRfREFUQSwgc2NjYikpCiAJCXJldHVybiAtRUlPOworCWlmICgoKHN0cnVjdCBzZGlhc19zY2NiICopIHNjY2IpLT5ldmJ1Zi5ibGtfY250ID09IDApCisJCXJldHVybiAwOwogCXJldHVybiAoKChzdHJ1Y3Qgc2RpYXNfc2NjYiAqKSBzY2NiKS0+ZXZidWYuYmxrX2NudCAtIDEpICogUEFHRV9TSVpFOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYyBiL2RyaXZlcnMvczM5MC9jaW8vYWlycS5jCmluZGV4IGYwNTVkZjAuLjQ0NTU2NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vYWlycS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vYWlycS5jCkBAIC0xODYsNTUgKzE4Niw3MSBAQAogRVhQT1JUX1NZTUJPTChhaXJxX2l2X3JlbGVhc2UpOwogCiAvKioKLSAqIGFpcnFfaXZfYWxsb2NfYml0IC0gYWxsb2NhdGUgYW4gaXJxIGJpdCBmcm9tIGFuIGludGVycnVwdCB2ZWN0b3IKKyAqIGFpcnFfaXZfYWxsb2MgLSBhbGxvY2F0ZSBpcnEgYml0cyBmcm9tIGFuIGludGVycnVwdCB2ZWN0b3IKICAqIEBpdjogcG9pbnRlciB0byBhbiBpbnRlcnJ1cHQgdmVjdG9yIHN0cnVjdHVyZQorICogQG51bTogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGlycSBiaXRzIHRvIGFsbG9jYXRlCiAgKgotICogUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgYWxsb2NhdGVkIGlycSwgb3IgLTFVTCBpZiBubyBiaXQKLSAqIGlzIGF2YWlsYWJsZSBvciB0aGUgQUlSUV9JVl9BTExPQyBmbGFnIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQKKyAqIFJldHVybnMgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGZpcnN0IGlycSBpbiB0aGUgYWxsb2NhdGVkIGJsb2NrIG9mIGlycXMsCisgKiBvciAtMVVMIGlmIG5vIGJpdCBpcyBhdmFpbGFibGUgb3IgdGhlIEFJUlFfSVZfQUxMT0MgZmxhZyBoYXMgbm90IGJlZW4KKyAqIHNwZWNpZmllZAogICovCi11bnNpZ25lZCBsb25nIGFpcnFfaXZfYWxsb2NfYml0KHN0cnVjdCBhaXJxX2l2ICppdikKK3Vuc2lnbmVkIGxvbmcgYWlycV9pdl9hbGxvYyhzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgbnVtKQogewotCXVuc2lnbmVkIGxvbmcgYml0OworCXVuc2lnbmVkIGxvbmcgYml0LCBpOwogCi0JaWYgKCFpdi0+YXZhaWwpCisJaWYgKCFpdi0+YXZhaWwgfHwgbnVtID09IDApCiAJCXJldHVybiAtMVVMOwogCXNwaW5fbG9jaygmaXYtPmxvY2spOwogCWJpdCA9IGZpbmRfZmlyc3RfYml0X2ludihpdi0+YXZhaWwsIGl2LT5iaXRzKTsKLQlpZiAoYml0IDwgaXYtPmJpdHMpIHsKLQkJY2xlYXJfYml0X2ludihiaXQsIGl2LT5hdmFpbCk7Ci0JCWlmIChiaXQgPj0gaXYtPmVuZCkKLQkJCWl2LT5lbmQgPSBiaXQgKyAxOwotCX0gZWxzZQorCXdoaWxlIChiaXQgKyBudW0gPD0gaXYtPmJpdHMpIHsKKwkJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQkJaWYgKCF0ZXN0X2JpdF9pbnYoYml0ICsgaSwgaXYtPmF2YWlsKSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPj0gbnVtKSB7CisJCQkvKiBGb3VuZCBhIHN1aXRhYmxlIGJsb2NrIG9mIGlycXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJCQljbGVhcl9iaXRfaW52KGJpdCArIGksIGl2LT5hdmFpbCk7CisJCQlpZiAoYml0ICsgbnVtID49IGl2LT5lbmQpCisJCQkJaXYtPmVuZCA9IGJpdCArIG51bSArIDE7CisJCQlicmVhazsKKwkJfQorCQliaXQgPSBmaW5kX25leHRfYml0X2ludihpdi0+YXZhaWwsIGl2LT5iaXRzLCBiaXQgKyBpICsgMSk7CisJfQorCWlmIChiaXQgKyBudW0gPiBpdi0+Yml0cykKIAkJYml0ID0gLTFVTDsKIAlzcGluX3VubG9jaygmaXYtPmxvY2spOwogCXJldHVybiBiaXQ7CiAKIH0KLUVYUE9SVF9TWU1CT0woYWlycV9pdl9hbGxvY19iaXQpOworRVhQT1JUX1NZTUJPTChhaXJxX2l2X2FsbG9jKTsKIAogLyoqCi0gKiBhaXJxX2l2X2ZyZWVfYml0IC0gZnJlZSBhbiBpcnEgYml0IG9mIGFuIGludGVycnVwdCB2ZWN0b3IKKyAqIGFpcnFfaXZfZnJlZSAtIGZyZWUgaXJxIGJpdHMgb2YgYW4gaW50ZXJydXB0IHZlY3RvcgogICogQGl2OiBwb2ludGVyIHRvIGludGVycnVwdCB2ZWN0b3Igc3RydWN0dXJlCi0gKiBAYml0OiBudW1iZXIgb2YgdGhlIGlycSBiaXQgdG8gZnJlZQorICogQGJpdDogbnVtYmVyIG9mIHRoZSBmaXJzdCBpcnEgYml0IHRvIGZyZWUKKyAqIEBudW06IG51bWJlciBvZiBjb25zZWN1dGl2ZSBpcnEgYml0cyB0byBmcmVlCiAgKi8KLXZvaWQgYWlycV9pdl9mcmVlX2JpdChzdHJ1Y3QgYWlycV9pdiAqaXYsIHVuc2lnbmVkIGxvbmcgYml0KQordm9pZCBhaXJxX2l2X2ZyZWUoc3RydWN0IGFpcnFfaXYgKml2LCB1bnNpZ25lZCBsb25nIGJpdCwgdW5zaWduZWQgbG9uZyBudW0pCiB7Ci0JaWYgKCFpdi0+YXZhaWwpCisJdW5zaWduZWQgbG9uZyBpOworCisJaWYgKCFpdi0+YXZhaWwgfHwgbnVtID09IDApCiAJCXJldHVybjsKIAlzcGluX2xvY2soJml2LT5sb2NrKTsKLQkvKiBDbGVhciAocG9zc2libHkgbGVmdCBvdmVyKSBpbnRlcnJ1cHQgYml0ICovCi0JY2xlYXJfYml0X2ludihiaXQsIGl2LT52ZWN0b3IpOwotCS8qIE1ha2UgdGhlIGJpdCBwb3NpdGlvbiBhdmFpbGFibGUgYWdhaW4gKi8KLQlzZXRfYml0X2ludihiaXQsIGl2LT5hdmFpbCk7Ci0JaWYgKGJpdCA9PSBpdi0+ZW5kIC0gMSkgeworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkvKiBDbGVhciAocG9zc2libHkgbGVmdCBvdmVyKSBpbnRlcnJ1cHQgYml0ICovCisJCWNsZWFyX2JpdF9pbnYoYml0ICsgaSwgaXYtPnZlY3Rvcik7CisJCS8qIE1ha2UgdGhlIGJpdCBwb3NpdGlvbnMgYXZhaWxhYmxlIGFnYWluICovCisJCXNldF9iaXRfaW52KGJpdCArIGksIGl2LT5hdmFpbCk7CisJfQorCWlmIChiaXQgKyBudW0gPj0gaXYtPmVuZCkgewogCQkvKiBGaW5kIG5ldyBlbmQgb2YgYml0LWZpZWxkICovCi0JCXdoaWxlICgtLWl2LT5lbmQgPiAwKQotCQkJaWYgKCF0ZXN0X2JpdF9pbnYoaXYtPmVuZCAtIDEsIGl2LT5hdmFpbCkpCi0JCQkJYnJlYWs7CisJCXdoaWxlIChpdi0+ZW5kID4gMCAmJiAhdGVzdF9iaXRfaW52KGl2LT5lbmQgLSAxLCBpdi0+YXZhaWwpKQorCQkJaXYtPmVuZC0tOwogCX0KIAlzcGluX3VubG9jaygmaXYtPmxvY2spOwogfQotRVhQT1JUX1NZTUJPTChhaXJxX2l2X2ZyZWVfYml0KTsKK0VYUE9SVF9TWU1CT0woYWlycV9pdl9mcmVlKTsKIAogLyoqCiAgKiBhaXJxX2l2X3NjYW4gLSBzY2FuIGludGVycnVwdCB2ZWN0b3IgZm9yIG5vbi16ZXJvIGJpdHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCBmZDMzNjdhMS4uZGZkN2JjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtMTY4LDE0ICsxNjgsMTIgQEAKICAqIFByb3ZpZGUgYW4gJ3VuZ3JvdXAnIGF0dHJpYnV0ZSBzbyB0aGUgdXNlciBjYW4gcmVtb3ZlIGdyb3VwIGRldmljZXMgbm8KICAqIGxvbmdlciBuZWVkZWQgb3IgYWNjaWRlbnRpYWxseSBjcmVhdGVkLiBTYXZlcyBtZW1vcnkgOikKICAqLwotc3RhdGljIHZvaWQgY2N3Z3JvdXBfdW5ncm91cF9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjY3dncm91cF91bmdyb3VwKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCiB7Ci0Jc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7Ci0KIAltdXRleF9sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZ2Rldi0+ZGV2KSkgewogCQlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyhnZGV2KTsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmdkZXYtPmRldik7CiAJCV9fY2N3Z3JvdXBfcmVtb3ZlX2NkZXZfcmVmcyhnZGV2KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwpAQCAtMTk1LDEwICsxOTMsOSBAQAogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KLQkvKiBOb3RlIHRoYXQgd2UgY2Fubm90IHVucmVnaXN0ZXIgdGhlIGRldmljZSBmcm9tIG9uZSBvZiBpdHMKLQkgKiBhdHRyaWJ1dGUgbWV0aG9kcywgc28gd2UgaGF2ZSB0byB1c2UgdGhpcyByb3VuZGFib3V0IGFwcHJvYWNoLgotCSAqLwotCXJjID0gZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKGRldiwgY2N3Z3JvdXBfdW5ncm91cF9jYWxsYmFjayk7CisKKwlpZiAoZGV2aWNlX3JlbW92ZV9maWxlX3NlbGYoZGV2LCBhdHRyKSkKKwkJY2N3Z3JvdXBfdW5ncm91cChnZGV2KTsKIG91dDoKIAlpZiAocmMpIHsKIAkJaWYgKHJjICE9IC1FQUdBSU4pCkBAIC0yMjQsNiArMjIxLDE0IEBACiAJTlVMTCwKIH07CiAKK3N0YXRpYyB2b2lkIGNjd2dyb3VwX3VuZ3JvdXBfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dncm91cF9kZXZpY2UsIHVuZ3JvdXBfd29yayk7CisKKwljY3dncm91cF91bmdyb3VwKGdkZXYpOworfQorCiBzdGF0aWMgdm9pZCBjY3dncm91cF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlrZnJlZSh0b19jY3dncm91cGRldihkZXYpKTsKQEAgLTMyMyw2ICszMjgsNyBAQAogCWF0b21pY19zZXQoJmdkZXYtPm9ub2ZmLCAwKTsKIAltdXRleF9pbml0KCZnZGV2LT5yZWdfbXV0ZXgpOwogCW11dGV4X2xvY2soJmdkZXYtPnJlZ19tdXRleCk7CisJSU5JVF9XT1JLKCZnZGV2LT51bmdyb3VwX3dvcmssIGNjd2dyb3VwX3VuZ3JvdXBfd29ya2ZuKTsKIAlnZGV2LT5jb3VudCA9IG51bV9kZXZpY2VzOwogCWdkZXYtPmRldi5idXMgPSAmY2N3Z3JvdXBfYnVzX3R5cGU7CiAJZ2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKQEAgLTQwNCwxMCArNDEwLDEwIEBACiBzdGF0aWMgaW50IGNjd2dyb3VwX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAogCQkJICAgICB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRhdGEpOwogCiAJaWYgKGFjdGlvbiA9PSBCVVNfTk9USUZZX1VOQklORF9EUklWRVIpCi0JCWRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIGNjd2dyb3VwX3VuZ3JvdXBfY2FsbGJhY2spOworCQlzY2hlZHVsZV93b3JrKCZnZGV2LT51bmdyb3VwX3dvcmspOwogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hzY19zY2guYyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzY19zY2guYwppbmRleCA3YjI5ZDBiLi4xZDM2NjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2Nfc2NoLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjX3NjaC5jCkBAIC0xNzMsOCArMTczLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgY2hzY19pbml0X2RiZnModm9pZCkKIHsKLQljaHNjX2RlYnVnX21zZ19pZCA9IGRlYnVnX3JlZ2lzdGVyKCJjaHNjX21zZyIsIDE2LCAxLAotCQkJCQkgICAxNiAqIHNpemVvZihsb25nKSk7CisJY2hzY19kZWJ1Z19tc2dfaWQgPSBkZWJ1Z19yZWdpc3RlcigiY2hzY19tc2ciLCA4LCAxLCA0ICogc2l6ZW9mKGxvbmcpKTsKIAlpZiAoIWNoc2NfZGVidWdfbXNnX2lkKQogCQlnb3RvIG91dDsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3KGNoc2NfZGVidWdfbXNnX2lkLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDhlZTg4YzQuLjllMDU4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTI4LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vY2hwaWQuaD4KICNpbmNsdWRlIDxhc20vYWlycS5oPgogI2luY2x1ZGUgPGFzbS9pc2MuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KICNpbmNsdWRlIDxhc20vZmN4Lmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9jcncuaD4KQEAgLTU0LDcgKzU1LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgY2lvX2RlYnVnX2luaXQodm9pZCkKIHsKLQljaW9fZGVidWdfbXNnX2lkID0gZGVidWdfcmVnaXN0ZXIoImNpb19tc2ciLCAxNiwgMSwgMTYgKiBzaXplb2YobG9uZykpOworCWNpb19kZWJ1Z19tc2dfaWQgPSBkZWJ1Z19yZWdpc3RlcigiY2lvX21zZyIsIDE2LCAxLCAxMSAqIHNpemVvZihsb25nKSk7CiAJaWYgKCFjaW9fZGVidWdfbXNnX2lkKQogCQlnb3RvIG91dF91bnJlZ2lzdGVyOwogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcoY2lvX2RlYnVnX21zZ19pZCwgJmRlYnVnX3NwcmludGZfdmlldyk7CkBAIC02NCw3ICs2NSw3IEBACiAJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAJZGVidWdfcmVnaXN0ZXJfdmlldyhjaW9fZGVidWdfdHJhY2VfaWQsICZkZWJ1Z19oZXhfYXNjaWlfdmlldyk7CiAJZGVidWdfc2V0X2xldmVsKGNpb19kZWJ1Z190cmFjZV9pZCwgMik7Ci0JY2lvX2RlYnVnX2Nyd19pZCA9IGRlYnVnX3JlZ2lzdGVyKCJjaW9fY3J3IiwgMTYsIDEsIDE2ICogc2l6ZW9mKGxvbmcpKTsKKwljaW9fZGVidWdfY3J3X2lkID0gZGVidWdfcmVnaXN0ZXIoImNpb19jcnciLCA4LCAxLCA4ICogc2l6ZW9mKGxvbmcpKTsKIAlpZiAoIWNpb19kZWJ1Z19jcndfaWQpCiAJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAJZGVidWdfcmVnaXN0ZXJfdmlldyhjaW9fZGVidWdfY3J3X2lkLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKQEAgLTU4NCw4ICs1ODUsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfZGVzYyAqaXJxX2Rlc2NfaW87Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlvX2ludGVycnVwdCA9IHsKIAkubmFtZQkgPSAiSU8iLAogCS5oYW5kbGVyID0gZG9fY2lvX2ludGVycnVwdCwKQEAgLTU5Niw3ICs1OTUsNiBAQAogCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihJT19JTlRFUlJVUFQsCiAJCQkJICZkdW1teV9pcnFfY2hpcCwgaGFuZGxlX3BlcmNwdV9pcnEpOwogCXNldHVwX2lycShJT19JTlRFUlJVUFQsICZpb19pbnRlcnJ1cHQpOwotCWlycV9kZXNjX2lvID0gaXJxX3RvX2Rlc2MoSU9fSU5URVJSVVBUKTsKIH0KIAogI2lmZGVmIENPTkZJR19DQ1dfQ09OU09MRQpAQCAtNjIzLDcgKzYyMSw3IEBACiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAkJaXJxX2VudGVyKCk7CiAJfQotCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShJT19JTlRFUlJVUFQsIGlycV9kZXNjX2lvKTsKKwlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShJT19JTlRFUlJVUFQpOwogCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+aXJxKQogCQlzY2gtPmRyaXZlci0+aXJxKHNjaCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggZTlkNzgzNS4uZDhkOWI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC0xNTcxLDEyICsxNTcxLDI3IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWZkZWYgQ09ORklHX0NDV19DT05TT0xFCi1zdGF0aWMgaW50IGNjd19kZXZpY2VfY29uc29sZV9lbmFibGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsCi0JCQkJICAgICBzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQorc3RhdGljIHZvaWQgY2N3X2RldmljZV9zZXRfaW50X2NsYXNzKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogeworCXN0cnVjdCBjY3dfZHJpdmVyICpjZHJ2ID0gY2Rldi0+ZHJ2OworCisJLyogTm90ZTogd2UgaW50ZXJwcmV0IGNsYXNzIDAgaW4gdGhpcyBjb250ZXh0IGFzIGFuIHVuaW5pdGlhbGl6ZWQKKwkgKiBmaWVsZCBzaW5jZSBpdCB0cmFuc2xhdGVzIHRvIGEgbm9uLUkvTyBpbnRlcnJ1cHQgY2xhc3MuICovCisJaWYgKGNkcnYtPmludF9jbGFzcyAhPSAwKQorCQljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBjZHJ2LT5pbnRfY2xhc3M7CisJZWxzZQorCQljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBJUlFJT19DSU87Cit9CisKKyNpZmRlZiBDT05GSUdfQ0NXX0NPTlNPTEUKK2ludCBfX2luaXQgY2N3X2RldmljZV9lbmFibGVfY29uc29sZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAlpbnQgcmM7CiAKKwlpZiAoIWNkZXYtPmRydiB8fCAhY2Rldi0+aGFuZGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpb19zdWJjaGFubmVsX2luaXRfZmllbGRzKHNjaCk7CiAJcmMgPSBjaW9fY29tbWl0X2NvbmZpZyhzY2gpOwogCWlmIChyYykKQEAgLTE2MDksMTIgKzE2MjQsMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0cnVjdCBjY3dfZGV2aWNlICpjY3dfZGV2aWNlX3Byb2JlX2NvbnNvbGUodm9pZCkKK3N0cnVjdCBjY3dfZGV2aWNlICogX19pbml0IGNjd19kZXZpY2VfY3JlYXRlX2NvbnNvbGUoc3RydWN0IGNjd19kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgaW9fc3ViY2hhbm5lbF9wcml2YXRlICppb19wcml2OwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JaW50IHJldDsKIAogCXNjaCA9IGNpb19wcm9iZV9jb25zb2xlKCk7CiAJaWYgKElTX0VSUihzY2gpKQpAQCAtMTYzMSwxOCArMTY0NSwyMyBAQAogCQlrZnJlZShpb19wcml2KTsKIAkJcmV0dXJuIGNkZXY7CiAJfQorCWNkZXYtPmRydiA9IGRydjsKIAlzZXRfaW9fcHJpdmF0ZShzY2gsIGlvX3ByaXYpOwotCXJldCA9IGNjd19kZXZpY2VfY29uc29sZV9lbmFibGUoY2Rldiwgc2NoKTsKLQlpZiAocmV0KSB7Ci0JCXNldF9pb19wcml2YXRlKHNjaCwgTlVMTCk7Ci0JCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKLQkJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKLQkJa2ZyZWUoaW9fcHJpdik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQorCWNjd19kZXZpY2Vfc2V0X2ludF9jbGFzcyhjZGV2KTsKIAlyZXR1cm4gY2RldjsKIH0KIAordm9pZCBfX2luaXQgY2N3X2RldmljZV9kZXN0cm95X2NvbnNvbGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGlvX3N1YmNoYW5uZWxfcHJpdmF0ZSAqaW9fcHJpdiA9IHRvX2lvX3ByaXZhdGUoc2NoKTsKKworCXNldF9pb19wcml2YXRlKHNjaCwgTlVMTCk7CisJcHV0X2RldmljZSgmc2NoLT5kZXYpOworCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CisJa2ZyZWUoaW9fcHJpdik7Cit9CisKIC8qKgogICogY2N3X2RldmljZV93YWl0X2lkbGUoKSAtIGJ1c3kgd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBpZGxlCiAgKiBAY2RldjogY2N3IGRldmljZQpAQCAtMTcyNiwxNSArMTc0NSw4IEBACiAJaW50IHJldDsKIAogCWNkZXYtPmRydiA9IGNkcnY7IC8qIHRvIGxldCB0aGUgZHJpdmVyIGNhbGwgX3NldF9vbmxpbmUgKi8KLQkvKiBOb3RlOiB3ZSBpbnRlcnByZXQgY2xhc3MgMCBpbiB0aGlzIGNvbnRleHQgYXMgYW4gdW5pbml0aWFsaXplZAotCSAqIGZpZWxkIHNpbmNlIGl0IHRyYW5zbGF0ZXMgdG8gYSBub24tSS9PIGludGVycnVwdCBjbGFzcy4gKi8KLQlpZiAoY2Rydi0+aW50X2NsYXNzICE9IDApCi0JCWNkZXYtPnByaXZhdGUtPmludF9jbGFzcyA9IGNkcnYtPmludF9jbGFzczsKLQllbHNlCi0JCWNkZXYtPnByaXZhdGUtPmludF9jbGFzcyA9IElSUUlPX0NJTzsKLQorCWNjd19kZXZpY2Vfc2V0X2ludF9jbGFzcyhjZGV2KTsKIAlyZXQgPSBjZHJ2LT5wcm9iZSA/IGNkcnYtPnByb2JlKGNkZXYpIDogLUVOT0RFVjsKLQogCWlmIChyZXQpIHsKIAkJY2Rldi0+ZHJ2ID0gTlVMTDsKIAkJY2Rldi0+cHJpdmF0ZS0+aW50X2NsYXNzID0gSVJRSU9fQ0lPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IDc5NWVkNjEuLmEwYWZmMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTMzLDggKzMzLDggQEAKIAkvKiAgICAgICAgICAgICAgICAgICBOICBQICBBICAgIE0gIEwgIFYgICAgICAgICAgICAgICAgICAgICAgSCAgKi8KIAlbUUVUSF9EQkZfU0VUVVBdID0geyJxZXRoX3NldHVwIiwKIAkJCQk4LCAxLCAgIDgsIDUsICZkZWJ1Z19oZXhfYXNjaWlfdmlldywgTlVMTH0sCi0JW1FFVEhfREJGX01TR10gICA9IHsicWV0aF9tc2ciLAotCQkJCTgsIDEsIDEyOCwgMywgJmRlYnVnX3NwcmludGZfdmlldywgICBOVUxMfSwKKwlbUUVUSF9EQkZfTVNHXQkgPSB7InFldGhfbXNnIiwgOCwgMSwgMTEgKiBzaXplb2YobG9uZyksIDMsCisJCQkgICAgJmRlYnVnX3NwcmludGZfdmlldywgTlVMTH0sCiAJW1FFVEhfREJGX0NUUkxdICA9IHsicWV0aF9jb250cm9sIiwKIAkJOCwgMSwgUUVUSF9EQkZfQ1RSTF9MRU4sIDUsICZkZWJ1Z19oZXhfYXNjaWlfdmlldywgTlVMTH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKaW5kZXggMWU5ZDZhZC4uYmNkMjIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL05DUjUzODAuYworKysgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCkBAIC01ODQsNyArNTg0LDcgQEAKIAlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKIAogCWZvciAodHJ5aW5nX2lycXMgPSBpID0gMCwgbWFzayA9IDE7IGkgPCAxNjsgKytpLCBtYXNrIDw8PSAxKQotCQlpZiAoKG1hc2sgJiBwb3NzaWJsZSkgJiYgKHJlcXVlc3RfaXJxKGksICZwcm9iZV9pbnRyLCBJUlFGX0RJU0FCTEVELCAiTkNSLXByb2JlIiwgTlVMTCkgPT0gMCkpCisJCWlmICgobWFzayAmIHBvc3NpYmxlKSAmJiAocmVxdWVzdF9pcnEoaSwgJnByb2JlX2ludHIsIDAsICJOQ1ItcHJvYmUiLCBOVUxMKSA9PSAwKSkKIAkJCXRyeWluZ19pcnFzIHw9IG1hc2s7CiAKIAl0aW1lb3V0ID0gamlmZmllcyArICgyNTAgKiBIWiAvIDEwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCmluZGV4IDkzMjNkMDUuLmVhYWY4NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKQEAgLTEyLDcgKzEyLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZm5kZWYgQUFDX0RSSVZFUl9CVUlMRAotIyBkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRCAzMDIwMAorIyBkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRCAzMDMwMAogIyBkZWZpbmUgQUFDX0RSSVZFUl9CUkFOQ0ggIi1tcyIKICNlbmRpZgogI2RlZmluZSBNQVhJTVVNX05VTV9DT05UQUlORVJTCTMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwppbmRleCBkYWRhMzhhLi41YzZhODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCiBzdGF0aWMgaW50IGFhY19yeF9yZXN0YXJ0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldiwgaW50IGJsZWQpCiB7Ci0JdTMyIHZhcjsKKwl1MzIgdmFyID0gMDsKIAogCWlmICghKGRldi0+c3VwcGxlbWVudF9hZGFwdGVyX2luZm8uU3VwcG9ydGVkT3B0aW9uczIgJgogCSAgQUFDX09QVElPTl9NVV9SRVNFVCkgfHwgKGJsZWQgPj0gMCkgfHwgKGJsZWQgPT0gLTIpKSB7CkBAIC01MDAsMTMgKzUwMCwxNCBAQAogCQlpZiAoYmxlZCAmJiAoYmxlZCAhPSAtRVRJTUVET1VUKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoYmxlZCB8fCAodmFyID09IDB4MzgwMzAwMEYpKSB7IC8qIFVTRV9PVEhFUl9NRVRIT0QgKi8KKwlpZiAoYmxlZCAmJiAodmFyID09IDB4MzgwMzAwMEYpKSB7IC8qIFVTRV9PVEhFUl9NRVRIT0QgKi8KIAkJcnhfd3JpdGVsKGRldiwgTVVuaXQucmVzZXJ2ZWQyLCAzKTsKIAkJbXNsZWVwKDUwMDApOyAvKiBEZWxheSA1IHNlY29uZHMgKi8KIAkJdmFyID0gMHgwMDAwMDAwMTsKIAl9Ci0JaWYgKHZhciAhPSAweDAwMDAwMDAxKQorCWlmIChibGVkICYmICh2YXIgIT0gMHgwMDAwMDAwMSkpCiAJCXJldHVybiAtRUlOVkFMOworCXNzbGVlcCg1KTsKIAlpZiAocnhfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKSAmIEtFUk5FTF9QQU5JQykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHN0YXJ0dXBfdGltZW91dCA8IDMwMCkKQEAgLTY0Niw3ICs2NDcsNyBAQAogCWRldi0+c3luY19tb2RlID0gMDsJLyogc3luYy4gbW9kZSBub3Qgc3VwcG9ydGVkICovCiAJZGV2LT5tc2kgPSBhYWNfbXNpICYmICFwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOwogCWlmIChyZXF1ZXN0X2lycShkZXYtPnBkZXYtPmlycSwgZGV2LT5hX29wcy5hZGFwdGVyX2ludHIsCi0JCQlJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CisJCQlJUlFGX1NIQVJFRCwgImFhY3JhaWQiLCBkZXYpIDwgMCkgewogCQlpZiAoZGV2LT5tc2kpCiAJCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcyVkOiBJbnRlcnJ1cHQgdW5hdmFpbGFibGUuXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKaW5kZXggMjI0NGYzMS4uZTY2NDc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jCkBAIC0zODcsOCArMzg3LDcgQEAKIAkJZ290byBlcnJvcl9pcnE7CiAJZGV2LT5zeW5jX21vZGUgPSAwOwkvKiBzeW5jLiBtb2RlIG5vdCBzdXBwb3J0ZWQgKi8KIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldi0+YV9vcHMuYWRhcHRlcl9pbnRyLAotCQkJSVJRRl9TSEFSRUR8SVJRRl9ESVNBQkxFRCwKLQkJCSJhYWNyYWlkIiwgKHZvaWQgKilkZXYgKSA8IDApIHsKKwkJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsICh2b2lkICopZGV2KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMlZDogSW50ZXJydXB0IHVuYXZhaWxhYmxlLlxuIiwKIAkJCW5hbWUsIGluc3RhbmNlKTsKIAkJZ290byBlcnJvcl9pb3VubWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc3JjLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwppbmRleCA3ZTE3MTA3Li45YzY1YWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJZGV2LT5tc2kgPSBhYWNfbXNpICYmICFwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOwogCiAJaWYgKHJlcXVlc3RfaXJxKGRldi0+cGRldi0+aXJxLCBkZXYtPmFfb3BzLmFkYXB0ZXJfaW50ciwKLQkJCUlSUUZfU0hBUkVEfElSUUZfRElTQUJMRUQsICJhYWNyYWlkIiwgZGV2KSA8IDApIHsKKwkJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CiAKIAkJaWYgKGRldi0+bXNpKQogCQkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CkBAIC04MDQsNyArODA0LDcgQEAKIAkJZ290byBlcnJvcl9pb3VubWFwOwogCWRldi0+bXNpID0gYWFjX21zaSAmJiAhcGNpX2VuYWJsZV9tc2koZGV2LT5wZGV2KTsKIAlpZiAocmVxdWVzdF9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldi0+YV9vcHMuYWRhcHRlcl9pbnRyLAotCQlJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CisJCUlSUUZfU0hBUkVELCAiYWFjcmFpZCIsIGRldikgPCAwKSB7CiAJCWlmIChkZXYtPm1zaSkKIAkJCXBjaV9kaXNhYmxlX21zaShkZXYtPnBkZXYpOwogCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IEludGVycnVwdCB1bmF2YWlsYWJsZS5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwppbmRleCAzZjdiNmZlLi5lODZlYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCVNFVFBPUlQoU0lNT0RFMCwgMCk7CiAJU0VUUE9SVChTSU1PREUxLCAwKTsKIAotCWlmKCByZXF1ZXN0X2lycShzaHBudC0+aXJxLCBzd2ludHIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCWlmIChyZXF1ZXN0X2lycShzaHBudC0+aXJxLCBzd2ludHIsIElSUUZfU0hBUkVELCAiYWhhMTUyeCIsIHNocG50KSkgewogCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogaXJxICVkIGJ1c3kuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CiAJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KQEAgLTg5MSw3ICs4OTEsNyBAQAogCVNFVFBPUlQoU1NUQVQwLCAweDdmKTsKIAlTRVRQT1JUKFNTVEFUMSwgMHhlZik7CiAKLQlpZiAoIHJlcXVlc3RfaXJxKHNocG50LT5pcnEsIGludHIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCWlmIChyZXF1ZXN0X2lycShzaHBudC0+aXJxLCBpbnRyLCBJUlFGX1NIQVJFRCwgImFoYTE1MngiLCBzaHBudCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGZhaWxlZCB0byByZWFzc2lnbiBpcnEgJWQuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CiAJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vYWljYXNtX2luc2Zvcm1hdC5oCmluZGV4IDlkZjllMmMuLjgzNzM0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaApAQCAtMjA5LDcgKzIwOSw2IEBACiAjZGVmaW5lIEFJQ19PUF9KQzE2CTB4OTEwNQogI2RlZmluZSBBSUNfT1BfSk5DMTYJMHg5MjA1CiAjZGVmaW5lIEFJQ19PUF9DQUxMMTYJMHg5MzA1Ci0jZGVmaW5lIEFJQ19PUF9DQUxMMTYJMHg5MzA1CiAKIC8qIFBhZ2UgZXh0ZW5zaW9uIGlzIGxvdyB0aHJlZSBiaXRzIG9mIHNlY29uZCBvcGNvZGUgYnl0ZS4gKi8KICNkZWZpbmUgQUlDX09QX0pNUEYJMHhBMDA1CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCmluZGV4IDRmNmEzMGIuLjY1MmI0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCkBAIC0yNTAwLDE2ICsyNTAwLDE1IEBACiBzdGF0aWMgaW50IGFyY21zcl9pb3BfY29uZmlybShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiKQogewogCXVpbnQzMl90IGNkYl9waHlhZGRyLCBjZGJfcGh5YWRkcl9oaTMyOwotCWRtYV9hZGRyX3QgZG1hX2NvaGVyZW50X2hhbmRsZTsKKwogCS8qCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkqKiBoZXJlIHdlIG5lZWQgdG8gdGVsbCBpb3AgMzMxIG91ciBmcmVlY2NiLkhpZ2hQYXJ0CiAJKiogaWYgZnJlZWNjYi5IaWdoUGFydCBpcyBub3QgemVybwogCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJKi8KLQlkbWFfY29oZXJlbnRfaGFuZGxlID0gYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlOwotCWNkYl9waHlhZGRyID0gKHVpbnQzMl90KShkbWFfY29oZXJlbnRfaGFuZGxlKTsKLQljZGJfcGh5YWRkcl9oaTMyID0gKHVpbnQzMl90KSgoY2RiX3BoeWFkZHIgPj4gMTYpID4+IDE2KTsKKwljZGJfcGh5YWRkciA9IGxvd2VyXzMyX2JpdHMoYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlKTsKKwljZGJfcGh5YWRkcl9oaTMyID0gdXBwZXJfMzJfYml0cyhhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUpOwogCWFjYi0+Y2RiX3BoeWFkZHJfaGkzMiA9IGNkYl9waHlhZGRyX2hpMzI7CiAJLyoKIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKaW5kZXggMDliYTE4Ni4uMDU5ZmY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYXJtL2Fjb3Juc2NzaS5jCkBAIC0yOTcxLDcgKzI5NzEsNyBAQAogCWVjLT5pcnFhZGRyCT0gYXNob3N0LT5mYXN0ICsgSU5UX1JFRzsKIAllYy0+aXJxbWFzawk9IDB4MGE7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGFjb3Juc2NzaV9pbnRyLCBJUlFGX0RJU0FCTEVELCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKKwlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGFjb3Juc2NzaV9pbnRyLCAwLCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0NSSVQgInNjc2klZDogSVJRJWQgbm90IGZyZWU6ICVkXG4iLAogCQkJaG9zdC0+aG9zdF9ubywgYXNob3N0LT5zY3NpLmlycSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYwppbmRleCBiNjc5Nzc4Li5mOGUwNjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8xLmMKKysrIGIvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMS5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIDAsCiAJCQkgICJDdW1hbmFTQ1NJLTEiLCBob3N0KTsKIAlpZiAocmV0KSB7CiAJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZTogJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMgYi9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMKaW5kZXggNTg5MTVmMi4uYWJjNjZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMi5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzIuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBjdW1hbmFzY3NpXzJfaW50ciwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgImN1bWFuYXNjc2kyIiwgaW5mbyk7CisJCQkgIDAsICJjdW1hbmFzY3NpMiIsIGluZm8pOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKIAkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGVjLT5pcnEsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMKaW5kZXggYWJjOTU5My4uNWUxYjczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9wb3dlcnRlYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcG93ZXJ0ZWMuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBwb3dlcnRlY3Njc2lfaW50ciwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgInBvd2VydGVjIiwgaW5mbyk7CisJCQkgIDAsICJwb3dlcnRlYyIsIGluZm8pOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKIAkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGVjLT5pcnEsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYwppbmRleCBhM2U2YzhhLi4yOTZjOTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMKQEAgLTkwLDYgKzkwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbnZyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vYXRhcmlody5oPgpAQCAtNTQ5LDggKzU1MCwxMCBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0Jd2hpbGUgKCFpbl9pcnEoKSAmJiBmYWxjb25fZ290X2xvY2sgJiYgc3RkbWFfb3RoZXJzX3dhaXRpbmcoKSkKLQkJc2xlZXBfb24oJmZhbGNvbl9mYWlybmVzc193YWl0KTsKKwl3YWl0X2V2ZW50X2NtZChmYWxjb25fZmFpcm5lc3Nfd2FpdCwKKwkJaW5faW50ZXJydXB0KCkgfHwgIWZhbGNvbl9nb3RfbG9jayB8fCAhc3RkbWFfb3RoZXJzX3dhaXRpbmcoKSwKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpLAorCQlsb2NhbF9pcnFfc2F2ZShmbGFncykpOwogCiAJd2hpbGUgKCFmYWxjb25fZ290X2xvY2spIHsKIAkJaWYgKGluX2lycSgpKQpAQCAtNTYyLDcgKzU2NSwxMCBAQAogCQkJZmFsY29uX3RyeWluZ19sb2NrID0gMDsKIAkJCXdha2VfdXAoJmZhbGNvbl90cnlfd2FpdCk7CiAJCX0gZWxzZSB7Ci0JCQlzbGVlcF9vbigmZmFsY29uX3RyeV93YWl0KTsKKwkJCXdhaXRfZXZlbnRfY21kKGZhbGNvbl90cnlfd2FpdCwKKwkJCQlmYWxjb25fZ290X2xvY2sgJiYgIWZhbGNvbl90cnlpbmdfbG9jaywKKwkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyksCisJCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaAppbmRleCAyZTI4ZjZjLi4xYmZiMGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaApAQCAtOTgsNiArOTgsMTQgQEAKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBjcTsKIH07CiAKK3N0cnVjdCBiZWlzY3NpX21jY190YWdfc3RhdGUgeworI2RlZmluZSBNQ0NfVEFHX1NUQVRFX0NPTVBMRVRFRCAweDAwCisjZGVmaW5lIE1DQ19UQUdfU1RBVEVfUlVOTklORyAgIDB4MDEKKyNkZWZpbmUgTUNDX1RBR19TVEFURV9USU1FT1VUICAgMHgwMgorCXVpbnQ4X3QgdGFnX3N0YXRlOworCXN0cnVjdCBiZV9kbWFfbWVtIHRhZ19tZW1fc3RhdGU7Cit9OworCiBzdHJ1Y3QgYmVfY3RybF9pbmZvIHsKIAl1OCBfX2lvbWVtICpjc3I7CiAJdTggX19pb21lbSAqZGI7CQkvKiBEb29yIEJlbGwgKi8KQEAgLTEyMiw2ICsxMzAsOCBAQAogCXVuc2lnbmVkIHNob3J0IG1jY19hbGxvY19pbmRleDsKIAl1bnNpZ25lZCBzaG9ydCBtY2NfZnJlZV9pbmRleDsKIAl1bnNpZ25lZCBpbnQgbWNjX3RhZ19hdmFpbGFibGU7CisKKwlzdHJ1Y3QgYmVpc2NzaV9tY2NfdGFnX3N0YXRlIHB0YWdfc3RhdGVbTUFYX01DQ19DTUQgKyAxXTsKIH07CiAKICNpbmNsdWRlICJiZV9jbWRzLmgiCkBAIC0xMjksNiArMTM5LDcgQEAKICNkZWZpbmUgUEFHRV9TSElGVF80SyAxMgogI2RlZmluZSBQQUdFX1NJWkVfNEsgKDEgPDwgUEFHRV9TSElGVF80SykKICNkZWZpbmUgbWNjX3RpbWVvdXQJCTEyMDAwMCAvKiAxMnMgdGltZW91dCAqLworI2RlZmluZSBCRUlTQ1NJX0xPR09VVF9TWU5DX0RFTEFZCTI1MAogCiAvKiBSZXR1cm5zIG51bWJlciBvZiBwYWdlcyBzcGFubmVkIGJ5IHRoZSBkYXRhIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBhZGRyICovCiAjZGVmaW5lIFBBR0VTXzRLX1NQQU5ORUQoX2FkZHJlc3MsIHNpemUpCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCmluZGV4IDMzMzgzOTEuLjE0MzJlZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAgKiBAcGhiYTogRHJpdmVyIHByaXZhdGUgc3RydWN0dXJlCiAgKiBAdGFnOiBUYWcgZm9yIHRoZSBNQlggQ29tbWFuZAogICogQHdyYjogdGhlIFdSQiB1c2VkIGZvciB0aGUgTUJYIENvbW1hbmQKLSAqIEBjbWRfaGRyOiBJT0NUTCBIZHIgZm9yIHRoZSBNQlggQ21kCisgKiBAbWJ4X2NtZF9tZW06IHB0ciB0byBtZW1vcnkgYWxsb2NhdGVkIGZvciBNQlggQ21kCiAgKgogICogV2FpdHMgZm9yIE1CWCBjb21wbGV0aW9uIHdpdGggdGhlIHBhc3NlZCBUQUcuCiAgKgpAQCAtMTQ4LDIxICsxNDgsMjYgQEAKICAqKi8KIGludCBiZWlzY3NpX21jY3FfY29tcGwoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQl1aW50MzJfdCB0YWcsIHN0cnVjdCBiZV9tY2Nfd3JiICoqd3JiLAotCQl2b2lkICpjbWRfaGRyKQorCQlzdHJ1Y3QgYmVfZG1hX21lbSAqbWJ4X2NtZF9tZW0pCiB7CiAJaW50IHJjID0gMDsKIAl1aW50MzJfdCBtY2NfdGFnX3Jlc3BvbnNlOwogCXVpbnQxNl90IHN0YXR1cyA9IDAsIGFkZGxfc3RhdHVzID0gMCwgd3JiX251bSA9IDA7CiAJc3RydWN0IGJlX21jY193cmIgKnRlbXBfd3JiOwotCXN0cnVjdCBiZV9jbWRfcmVxX2hkciAqaW9jdGxfaGRyOwotCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKmlvY3RsX3Jlc3BfaGRyOworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciAqbWJ4X2hkcjsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICptYnhfcmVzcF9oZHI7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jY3EgPSAmcGhiYS0+Y3RybC5tY2Nfb2JqLnE7CiAKIAlpZiAoYmVpc2NzaV9lcnJvcihwaGJhKSkgewogCQlmcmVlX21jY190YWcoJnBoYmEtPmN0cmwsIHRhZyk7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVQRVJNOwogCX0KIAorCS8qIFNldCBNQlggVGFnIHN0YXRlIHRvIEFjdGl2ZSAqLworCXNwaW5fbG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCXBoYmEtPmN0cmwucHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSA9IE1DQ19UQUdfU1RBVEVfUlVOTklORzsKKwlzcGluX3VubG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCiAJLyogd2FpdCBmb3IgdGhlIG1jY3EgY29tcGxldGlvbiAqLwogCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCiAJCQkJcGhiYS0+Y3RybC5tY2Nfd2FpdFt0YWddLApAQCAtMTcxLDU2ICsxNzYsNzEgQEAKIAkJCQlCRUlTQ1NJX0hPU1RfTUJYX1RJTUVPVVQpKTsKIAogCWlmIChyYyA8PSAwKSB7CisJCXN0cnVjdCBiZV9kbWFfbWVtICp0YWdfbWVtOworCQkvKiBTZXQgTUJYIFRhZyBzdGF0ZSB0byB0aW1lb3V0ICovCisJCXNwaW5fbG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCQlwaGJhLT5jdHJsLnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUgPSBNQ0NfVEFHX1NUQVRFX1RJTUVPVVQ7CisJCXNwaW5fdW5sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisKKwkJLyogU3RvcmUgcmVzb3VyY2UgYWRkciB0byBiZSBmcmVlZCBsYXRlciAqLworCQl0YWdfbWVtID0gJnBoYmEtPmN0cmwucHRhZ19zdGF0ZVt0YWddLnRhZ19tZW1fc3RhdGU7CisJCWlmIChtYnhfY21kX21lbSkgeworCQkJdGFnX21lbS0+c2l6ZSA9IG1ieF9jbWRfbWVtLT5zaXplOworCQkJdGFnX21lbS0+dmEgPSBtYnhfY21kX21lbS0+dmE7CisJCQl0YWdfbWVtLT5kbWEgPSBtYnhfY21kX21lbS0+ZG1hOworCQl9IGVsc2UKKwkJCXRhZ19tZW0tPnNpemUgPSAwOworCiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAogCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19FSCB8CiAJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHLAogCQkJICAgICJCQ18lZCA6IE1CWCBDbWQgQ29tcGxldGlvbiB0aW1lZCBvdXRcbiIpOwotCQlyYyA9IC1FQlVTWTsKLQotCQkvKiBkZWNyZW1lbnQgdGhlIG1jY3EgdXNlZCBjb3VudCAqLwotCQlhdG9taWNfZGVjKCZwaGJhLT5jdHJsLm1jY19vYmoucS51c2VkKTsKLQotCQlnb3RvIHJlbGVhc2VfbWNjX3RhZzsKLQl9IGVsc2UKKwkJcmV0dXJuIC1FQlVTWTsKKwl9IGVsc2UgewogCQlyYyA9IDA7CisJCS8qIFNldCBNQlggVGFnIHN0YXRlIHRvIGNvbXBsZXRlZCAqLworCQlzcGluX2xvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKKwkJcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID0gTUNDX1RBR19TVEFURV9DT01QTEVURUQ7CisJCXNwaW5fdW5sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CisJfQogCiAJbWNjX3RhZ19yZXNwb25zZSA9IHBoYmEtPmN0cmwubWNjX251bXRhZ1t0YWddOwogCXN0YXR1cyA9IChtY2NfdGFnX3Jlc3BvbnNlICYgQ1FFX1NUQVRVU19NQVNLKTsKIAlhZGRsX3N0YXR1cyA9ICgobWNjX3RhZ19yZXNwb25zZSAmIENRRV9TVEFUVVNfQURETF9NQVNLKSA+PgogCQkJQ1FFX1NUQVRVU19BRERMX1NISUZUKTsKIAotCWlmIChjbWRfaGRyKSB7Ci0JCWlvY3RsX2hkciA9IChzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgKiljbWRfaGRyOworCWlmIChtYnhfY21kX21lbSkgeworCQltYnhfaGRyID0gKHN0cnVjdCBiZV9jbWRfcmVxX2hkciAqKW1ieF9jbWRfbWVtLT52YTsKIAl9IGVsc2UgewogCQl3cmJfbnVtID0gKG1jY190YWdfcmVzcG9uc2UgJiBDUUVfU1RBVFVTX1dSQl9NQVNLKSA+PgogCQkJICAgQ1FFX1NUQVRVU19XUkJfU0hJRlQ7CiAJCXRlbXBfd3JiID0gKHN0cnVjdCBiZV9tY2Nfd3JiICopcXVldWVfZ2V0X3dyYihtY2NxLCB3cmJfbnVtKTsKLQkJaW9jdGxfaGRyID0gZW1iZWRkZWRfcGF5bG9hZCh0ZW1wX3dyYik7CisJCW1ieF9oZHIgPSBlbWJlZGRlZF9wYXlsb2FkKHRlbXBfd3JiKTsKIAogCQlpZiAod3JiKQogCQkJKndyYiA9IHRlbXBfd3JiOwogCX0KIAogCWlmIChzdGF0dXMgfHwgYWRkbF9zdGF0dXMpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKIAkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfRUggfAogCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKIAkJCSAgICAiQkNfJWQgOiBNQlggQ21kIEZhaWxlZCBmb3IgIgogCQkJICAgICJTdWJzeXMgOiAlZCBPcGNvZGUgOiAlZCB3aXRoICIKIAkJCSAgICAiU3RhdHVzIDogJWQgYW5kIEV4dGRfU3RhdHVzIDogJWRcbiIsCi0JCQkgICAgaW9jdGxfaGRyLT5zdWJzeXN0ZW0sCi0JCQkgICAgaW9jdGxfaGRyLT5vcGNvZGUsCisJCQkgICAgbWJ4X2hkci0+c3Vic3lzdGVtLAorCQkJICAgIG1ieF9oZHItPm9wY29kZSwKIAkJCSAgICBzdGF0dXMsIGFkZGxfc3RhdHVzKTsKIAogCQlpZiAoc3RhdHVzID09IE1DQ19TVEFUVVNfSU5TVUZGSUNJRU5UX0JVRkZFUikgewotCQkJaW9jdGxfcmVzcF9oZHIgPSAoc3RydWN0IGJlX2NtZF9yZXNwX2hkciAqKSBpb2N0bF9oZHI7CisJCQltYnhfcmVzcF9oZHIgPSAoc3RydWN0IGJlX2NtZF9yZXNwX2hkciAqKSBtYnhfaGRyOwogCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAogCQkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfRUggfAogCQkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCiAJCQkJICAgICJCQ18lZCA6IEluc3VmZmljZW50IEJ1ZmZlciBFcnJvciAiCiAJCQkJICAgICJSZXNwX0xlbiA6ICVkIEFjdHVhbF9SZXNwX0xlbiA6ICVkXG4iLAotCQkJCSAgICBpb2N0bF9yZXNwX2hkci0+cmVzcG9uc2VfbGVuZ3RoLAotCQkJCSAgICBpb2N0bF9yZXNwX2hkci0+YWN0dWFsX3Jlc3BfbGVuKTsKKwkJCQkgICAgbWJ4X3Jlc3BfaGRyLT5yZXNwb25zZV9sZW5ndGgsCisJCQkJICAgIG1ieF9yZXNwX2hkci0+YWN0dWFsX3Jlc3BfbGVuKTsKIAogCQkJcmMgPSAtRUFHQUlOOwogCQkJZ290byByZWxlYXNlX21jY190YWc7CkBAIC0zMTksNiArMzM5LDcgQEAKIGludCBiZV9tY2NfY29tcGxfcHJvY2Vzc19pc3Ioc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKIAkJCQkgICAgc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwpCiB7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gcGNpX2dldF9kcnZkYXRhKGN0cmwtPnBkZXYpOwogCXUxNiBjb21wbF9zdGF0dXMsIGV4dGRfc3RhdHVzOwogCXVuc2lnbmVkIHNob3J0IHRhZzsKIApAQCAtMzM4LDcgKzM1OSwzMiBAQAogCWN0cmwtPm1jY19udW10YWdbdGFnXSB8PSAoY29tcGwtPnRhZzAgJiAweDAwRkYwMDAwKTsKIAljdHJsLT5tY2NfbnVtdGFnW3RhZ10gfD0gKGV4dGRfc3RhdHVzICYgMHgwMDAwMDBGRikgPDwgODsKIAljdHJsLT5tY2NfbnVtdGFnW3RhZ10gfD0gKGNvbXBsX3N0YXR1cyAmIDB4MDAwMDAwRkYpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3RybC0+bWNjX3dhaXRbdGFnXSk7CisKKwlpZiAoY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSA9PSBNQ0NfVEFHX1NUQVRFX1JVTk5JTkcpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHJsLT5tY2Nfd2FpdFt0YWddKTsKKwl9IGVsc2UgaWYgKGN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUgPT0gTUNDX1RBR19TVEFURV9USU1FT1VUKSB7CisJCXN0cnVjdCBiZV9kbWFfbWVtICp0YWdfbWVtOworCQl0YWdfbWVtID0gJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfbWVtX3N0YXRlOworCisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKKwkJCSAgICBCRUlTQ1NJX0xPR19NQk9YIHwgQkVJU0NTSV9MT0dfSU5JVCB8CisJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHLAorCQkJICAgICJCQ18lZCA6IE1CWCBDb21wbGV0aW9uIGZvciB0aW1lb3V0IENvbW1hbmQgIgorCQkJICAgICJmcm9tIEZXXG4iKTsKKwkJLyogQ2hlY2sgaWYgbWVtb3J5IG5lZWRzIHRvIGJlIGZyZWVkICovCisJCWlmICh0YWdfbWVtLT5zaXplKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChjdHJsLT5wZGV2LCB0YWdfbWVtLT5zaXplLAorCQkJCQkgICAgdGFnX21lbS0+dmEsIHRhZ19tZW0tPmRtYSk7CisKKwkJLyogQ2hhbmdlIHRhZyBzdGF0ZSAqLworCQlzcGluX2xvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKKwkJY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSA9IE1DQ19UQUdfU1RBVEVfQ09NUExFVEVEOworCQlzcGluX3VubG9jaygmcGhiYS0+Y3RybC5tYm94X2xvY2spOworCisJCS8qIEZyZWUgTUNDIFRhZyAqLworCQlmcmVlX21jY190YWcoY3RybCwgdGFnKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU0LDggKzQwMCwyMyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBiZTJpc2NzaV9mYWlsX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbikKKy8qKgorICogYmUyaXNjc2lfZmFpbF9zZXNzaW9uKCk6IENsb3Npbmcgc2Vzc2lvbiB3aXRoIGFwcHJvcHJpYXRlIGVycm9yCisgKiBAY2xzX3Nlc3Npb246IHB0ciB0byBzZXNzaW9uCisgKgorICogRGVwZW5kaW5nIG9uIGFkYXB0ZXIgc3RhdGUgYXBwcm9wcmlhdGUgZXJyb3IgZmxhZyBpcyBwYXNzZWQuCisgKiovCit2b2lkIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQogeworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChjbHNfc2Vzc2lvbik7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKKwl1aW50MzJfdCBpc2NzaV9lcnJfZmxhZzsKKworCWlmIChwaGJhLT5zdGF0ZSAmIEJFX0FEQVBURVJfU1RBVEVfU0hVVERPV04pCisJCWlzY3NpX2Vycl9mbGFnID0gSVNDU0lfRVJSX0lOVkFMSURfSE9TVDsKKwllbHNlCisJCWlzY3NpX2Vycl9mbGFnID0gSVNDU0lfRVJSX0NPTk5fRkFJTEVEOworCiAJaXNjc2lfc2Vzc2lvbl9mYWlsdXJlKGNsc19zZXNzaW9uLT5kZF9kYXRhLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogfQogCkBAIC0zODYsMTggKzQ0Nyw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBiZWlzY3NpX2NxX25vdGlmeShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHUxNiBxaWQsIGJvb2wgYXJtLAotCQkgICAgICAgdTE2IG51bV9wb3BwZWQpCi17Ci0JdTMyIHZhbCA9IDA7Ci0JdmFsIHw9IHFpZCAmIERCX0NRX1JJTkdfSURfTUFTSzsKLQlpZiAoYXJtKQotCQl2YWwgfD0gMSA8PCBEQl9DUV9SRUFSTV9TSElGVDsKLQl2YWwgfD0gbnVtX3BvcHBlZCA8PCBEQl9DUV9OVU1fUE9QUEVEX1NISUZUOwotCWlvd3JpdGUzMih2YWwsIHBoYmEtPmRiX3ZhICsgREJfQ1FfT0ZGU0VUKTsKLX0KLQotCiBpbnQgYmVpc2NzaV9wcm9jZXNzX21jYyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJc3RydWN0IGJlX21jY19jb21wbCAqY29tcGw7CkBAIC00MjgsNyArNDc3LDcgQEAKIAl9CiAKIAlpZiAobnVtKQotCQliZWlzY3NpX2NxX25vdGlmeShwaGJhLCBwaGJhLT5jdHJsLm1jY19vYmouY3EuaWQsIHRydWUsIG51bSk7CisJCWh3aV9yaW5nX2NxX2RiKHBoYmEsIHBoYmEtPmN0cmwubWNjX29iai5jcS5pZCwgbnVtLCAxLCAwKTsKIAogCXNwaW5fdW5sb2NrX2JoKCZwaGJhLT5jdHJsLm1jY19jcV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKaW5kZXggNjI3ZWJiZS4uN2NmN2Y5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogLyoqKioqKioqKiogTUNDIGRvb3IgYmVsbCAqKioqKioqKioqKiovCiAjZGVmaW5lIERCX01DQ1FfT0ZGU0VUIDB4MTQwCi0jZGVmaW5lIERCX01DQ1FfUklOR19JRF9NQVNLIDB4N0ZGCQkvKiBiaXRzIDAgLSAxMCAqLworI2RlZmluZSBEQl9NQ0NRX1JJTkdfSURfTUFTSyAweEZGRkYJCS8qIGJpdHMgMCAtIDE1ICovCiAvKiBOdW1iZXIgb2YgZW50cmllcyBwb3N0ZWQgKi8KICNkZWZpbmUgREJfTUNDUV9OVU1fUE9TVEVEX1NISUZUIDE2CQkvKiBiaXRzIDE2IC0gMjkgKi8KIApAQCAtNzA5LDcgKzcwOSw4IEBACiB2b2lkIGZyZWVfbWNjX3RhZyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCB1bnNpZ25lZCBpbnQgdGFnKTsKIAogaW50IGJlaXNjc2lfbWNjcV9jb21wbChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCQl1aW50MzJfdCB0YWcsIHN0cnVjdCBiZV9tY2Nfd3JiICoqd3JiLCB2b2lkICpjbWRfdmEpOworCQkJdWludDMyX3QgdGFnLCBzdHJ1Y3QgYmVfbWNjX3dyYiAqKndyYiwKKwkJCXN0cnVjdCBiZV9kbWFfbWVtICptYnhfY21kX21lbSk7CiAvKklTQ1NJIEZ1bmN0dWlvbnMgKi8KIGludCBiZV9jbWRfZndfaW5pdGlhbGl6ZShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKTsKIGludCBiZV9jbWRfZndfdW5pbml0KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOwpAQCAtMTAxNyw4ICsxMDE4LDggQEAKIAlpbnQgKnVzZXJzX2ZpbmFsX3N0YXR1czsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgREJfREVGX1BEVV9SSU5HX0lEX01BU0sJCTB4M0ZGCS8qIGJpdHMgMCAtIDkgKi8KLSNkZWZpbmUgREJfREVGX1BEVV9DUVBST0NfTUFTSwkJMHgzRkZGCS8qIGJpdHMgMCAtIDkgKi8KKyNkZWZpbmUgREJfREVGX1BEVV9SSU5HX0lEX01BU0sJMHgzRkZGCS8qIGJpdHMgMCAtIDEzICovCisjZGVmaW5lIERCX0RFRl9QRFVfQ1FQUk9DX01BU0sJCTB4M0ZGRgkvKiBiaXRzIDE2IC0gMjkgKi8KICNkZWZpbmUgREJfREVGX1BEVV9SRUFSTV9TSElGVAkJMTQKICNkZWZpbmUgREJfREVGX1BEVV9FVkVOVF9TSElGVAkJMTUKICNkZWZpbmUgREJfREVGX1BEVV9DUVBST0NfU0hJRlQJCTE2CkBAIC0xMzE3LDQgKzEzMTgsNSBAQAogdm9pZCBiZV9jbWRfaGRyX3ByZXBhcmUoc3RydWN0IGJlX2NtZF9yZXFfaGRyICpyZXFfaGRyLAogCQkJdTggc3Vic3lzdGVtLCB1OCBvcGNvZGUsIGludCBjbWRfbGVuKTsKIAordm9pZCBiZTJpc2NzaV9mYWlsX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbik7CiAjZW5kaWYgLyogIUJFSVNDU0lfQ01EU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jCmluZGV4IDg4OTA2NmQuLmEzZGY0MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jCkBAIC03OTMsNyArNzkzLDcgQEAKIAkJaWhvc3QtPnBvcnRfc3BlZWQgPSBJU0NTSV9QT1JUX1NQRUVEXzEwTUJQUzsKIAkJYnJlYWs7CiAJY2FzZSBCRTJJU0NTSV9MSU5LX1NQRUVEXzEwME1CUFM6Ci0JCWlob3N0LT5wb3J0X3NwZWVkID0gQkUySVNDU0lfTElOS19TUEVFRF8xMDBNQlBTOworCQlpaG9zdC0+cG9ydF9zcGVlZCA9IElTQ1NJX1BPUlRfU1BFRURfMTAwTUJQUzsKIAkJYnJlYWs7CiAJY2FzZSBCRTJJU0NTSV9MSU5LX1NQRUVEXzFHQlBTOgogCQlpaG9zdC0+cG9ydF9zcGVlZCA9IElTQ1NJX1BPUlRfU1BFRURfMUdCUFM7CkBAIC0xMTUzLDE2ICsxMTUzLDE4IEBACiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAotCXJldCA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsIG5vbmVtYl9jbWQudmEpOworCXJldCA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsICZub25lbWJfY21kKTsKIAlpZiAocmV0KSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAogCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCiAJCQkgICAgIkJTXyVkIDogbWdtdF9vcGVuX2Nvbm5lY3Rpb24gRmFpbGVkIik7CiAKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKLQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisJCWlmIChyZXQgIT0gLUVCVVNZKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKKwkJCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKKwogCQliZWlzY3NpX2ZyZWVfZXAoYmVpc2NzaV9lcCk7Ci0JCXJldHVybiAtRUJVU1k7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcHRjcGNuY3Rfb3V0ID0gKHN0cnVjdCB0Y3BfY29ubmVjdF9hbmRfb2ZmbG9hZF9vdXQgKilub25lbWJfY21kLnZhOwpAQCAtMTM1OSw2ICsxMzYxLDcgQEAKIAliZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCBOVUxMKTsKIAliZWlzY3NpX2Nsb3NlX2Nvbm4oYmVpc2NzaV9lcCwgdGNwX3VwbG9hZF9mbGFnKTsKIGZyZWVfZXA6CisJbXNsZWVwKEJFSVNDU0lfTE9HT1VUX1NZTkNfREVMQVkpOwogCWJlaXNjc2lfZnJlZV9lcChiZWlzY3NpX2VwKTsKIAliZWlzY3NpX3VuYmluZF9jb25uX3RvX2NpZChwaGJhLCBiZWlzY3NpX2VwLT5lcF9jaWQpOwogCWlzY3NpX2Rlc3Ryb3lfZW5kcG9pbnQoYmVpc2NzaV9lcC0+b3BlbmlzY3NpX2VwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCmluZGV4IDU2NDJhOWIuLjBkODIyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwpAQCAtMjI4LDI0ICsyMjgsMjUgQEAKIAlzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kX3RhYmxlICppbnZfdGJsOwogCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7CiAJdW5zaWduZWQgaW50IGNpZCwgdGFnLCBudW1faW52YWxpZGF0ZTsKKwlpbnQgcmM7CiAKIAljbHNfc2Vzc2lvbiA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7CiAJc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFhYm9ydGVkX3Rhc2sgfHwgIWFib3J0ZWRfdGFzay0+c2MpIHsKIAkJLyogd2UgcmFjZWQgKi8KLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJcmV0dXJuIFNVQ0NFU1M7CiAJfQogCiAJYWJvcnRlZF9pb190YXNrID0gYWJvcnRlZF90YXNrLT5kZF9kYXRhOwogCWlmICghYWJvcnRlZF9pb190YXNrLT5zY3NpX2NtbmQpIHsKIAkJLyogcmFjZWQgb3IgaW52YWxpZCBjb21tYW5kICovCi0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybiBTVUNDRVNTOwogCX0KLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJLyogSW52YWxpZGF0ZSBXUkIgUG9zdGVkIGZvciB0aGlzIFRhc2sgKi8KIAlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgaW52bGQsCiAJCSAgICAgIGFib3J0ZWRfaW9fdGFzay0+cHdyYl9oYW5kbGUtPnB3cmIsCkBAIC0yODUsOSArMjg2LDExIEBACiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC52YSk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKLQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisJcmMgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCBOVUxMLCAmbm9uZW1iX2NtZCk7CisJaWYgKHJjICE9IC1FQlVTWSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKKwkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCiAJcmV0dXJuIGlzY3NpX2VoX2Fib3J0KHNjKTsKIH0KIApAQCAtMzAzLDEzICszMDYsMTQgQEAKIAlzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kX3RhYmxlICppbnZfdGJsOwogCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7CiAJdW5zaWduZWQgaW50IGNpZCwgdGFnLCBpLCBudW1faW52YWxpZGF0ZTsKKwlpbnQgcmM7CiAKIAkvKiBpbnZhbGlkYXRlIGlvY2JzICovCiAJY2xzX3Nlc3Npb24gPSBzdGFyZ2V0X3RvX3Nlc3Npb24oc2NzaV90YXJnZXQoc2MtPmRldmljZSkpOwogCXNlc3Npb24gPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoIXNlc3Npb24tPmxlYWRjb25uIHx8IHNlc3Npb24tPnN0YXRlICE9IElTQ1NJX1NUQVRFX0xPR0dFRF9JTikgewotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAljb25uID0gc2Vzc2lvbi0+bGVhZGNvbm47CkBAIC0zMzgsNyArMzQyLDcgQEAKIAkJbnVtX2ludmFsaWRhdGUrKzsKIAkJaW52X3RibCsrOwogCX0KLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaW52X3RibCA9IHBoYmEtPmludl90Ymw7CiAKIAlub25lbWJfY21kLnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LApAQCAtMzYzLDkgKzM2NywxMCBAQAogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAotCWJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsIG5vbmVtYl9jbWQudmEpOwotCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCi0JCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgJm5vbmVtYl9jbWQpOworCWlmIChyYyAhPSAtRUJVU1kpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCisJCQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKIAlyZXR1cm4gaXNjc2lfZWhfZGV2aWNlX3Jlc2V0KHNjKTsKIH0KIApAQCAtNjc0LDggKzY3OSwxOSBAQAogCX0KIAogCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7Ci0JaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7Ci0JCXJldCA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2lkZXYsIERNQV9CSVRfTUFTSygzMikpOworCXJldCA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJDb3VsZCBub3Qgc2V0IFBDSSBETUEgTWFza1xuIik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKKwkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpZGV2LAorCQkJCQkJCSAgRE1BX0JJVF9NQVNLKDMyKSk7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soNjQpKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJDb3VsZCBub3Qgc2V0IFBDSSBETUEgTWFza1xuIik7CiAJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKQEAgLTgwNCwxNCArODIwLDIzIEBACiAJCQkgICB1bnNpZ25lZCBjaGFyIHJlYXJtLCB1bnNpZ25lZCBjaGFyIGV2ZW50KQogewogCXUzMiB2YWwgPSAwOwotCXZhbCB8PSBpZCAmIERCX0VRX1JJTkdfSURfTUFTSzsKKwogCWlmIChyZWFybSkKIAkJdmFsIHw9IDEgPDwgREJfRVFfUkVBUk1fU0hJRlQ7CiAJaWYgKGNscl9pbnRlcnJ1cHQpCiAJCXZhbCB8PSAxIDw8IERCX0VRX0NMUl9TSElGVDsKIAlpZiAoZXZlbnQpCiAJCXZhbCB8PSAxIDw8IERCX0VRX0VWTlRfU0hJRlQ7CisKIAl2YWwgfD0gbnVtX3Byb2Nlc3NlZCA8PCBEQl9FUV9OVU1fUE9QUEVEX1NISUZUOworCS8qIFNldHRpbmcgbG93ZXIgb3JkZXIgRVFfSUQgQml0cyAqLworCXZhbCB8PSAoaWQgJiBEQl9FUV9SSU5HX0lEX0xPV19NQVNLKTsKKworCS8qIFNldHRpbmcgSGlnaGVyIG9yZGVyIEVRX0lEIEJpdHMgKi8KKwl2YWwgfD0gKCgoaWQgPj4gREJfRVFfSElHSF9GRUlMRF9TSElGVCkgJgorCQkgIERCX0VRX1JJTkdfSURfSElHSF9NQVNLKQorCQkgIDw8IERCX0VRX0hJR0hfU0VUX1NISUZUKTsKKwogCWlvd3JpdGUzMih2YWwsIHBoYmEtPmRiX3ZhICsgREJfRVFfT0ZGU0VUKTsKIH0KIApAQCAtODczLDcgKzg5OCw2IEBACiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxOwogCXVuc2lnbmVkIGludCBudW1fZXFfcHJvY2Vzc2VkOwogCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcGJlX2VxID0gZGV2X2lkOwogCWVxID0gJnBiZV9lcS0+cTsKQEAgLTg4MiwzMSArOTA2LDE1IEBACiAKIAlwaGJhID0gcGJlX2VxLT5waGJhOwogCW51bV9lcV9wcm9jZXNzZWQgPSAwOwotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpIHsKLQkJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQotCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7Ci0JCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmcGJlX2VxLT5pb3BvbGwpKQotCQkJCWJsa19pb3BvbGxfc2NoZWQoJnBiZV9lcS0+aW9wb2xsKTsKKwl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCisJCQkJJiBFUUVfVkFMSURfTUFTSykgeworCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmcGJlX2VxLT5pb3BvbGwpKQorCQkJYmxrX2lvcG9sbF9zY2hlZCgmcGJlX2VxLT5pb3BvbGwpOwogCi0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCQludW1fZXFfcHJvY2Vzc2VkKys7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCi0JCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJCXBiZV9lcS0+dG9kb19jcSA9IHRydWU7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7Ci0JCQlxdWV1ZV90YWlsX2luYyhlcSk7Ci0JCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOwotCQkJbnVtX2VxX3Byb2Nlc3NlZCsrOwotCQl9Ci0KLQkJaWYgKHBiZV9lcS0+dG9kb19jcSkKLQkJCXF1ZXVlX3dvcmsocGhiYS0+d3EsICZwYmVfZXEtPndvcmtfY3FzKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7CisJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKKwkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKKwkJbnVtX2VxX3Byb2Nlc3NlZCsrOwogCX0KIAogCWlmIChudW1fZXFfcHJvY2Vzc2VkKQpAQCAtOTI3LDcgKzkzNSw2IEBACiAJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwogCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7Ci0Jc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxOwogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2M7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgaW5kZXg7CiAJdW5zaWduZWQgaW50IG51bV9tY2NlcV9wcm9jZXNzZWQsIG51bV9pb2VxX3Byb2Nlc3NlZDsKQEAgLTk1Myw3MiArOTYwLDQwIEBACiAKIAludW1faW9lcV9wcm9jZXNzZWQgPSAwOwogCW51bV9tY2NlcV9wcm9jZXNzZWQgPSAwOwotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpIHsKLQkJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQotCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7Ci0JCQlpZiAoKChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LAotCQkJICAgICByZXNvdXJjZV9pZCkgLyAzMl0gJgotCQkJICAgICBFUUVfUkVTSURfTUFTSykgPj4gMTYpID09IG1jYy0+aWQpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJCQlwYmVfZXEtPnRvZG9fbWNjX2NxID0gdHJ1ZTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJCW51bV9tY2NlcV9wcm9jZXNzZWQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFibGtfaW9wb2xsX3NjaGVkX3ByZXAoJnBiZV9lcS0+aW9wb2xsKSkKLQkJCQkJYmxrX2lvcG9sbF9zY2hlZCgmcGJlX2VxLT5pb3BvbGwpOwotCQkJCW51bV9pb2VxX3Byb2Nlc3NlZCsrOwotCQkJfQotCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7Ci0JCQlxdWV1ZV90YWlsX2luYyhlcSk7Ci0JCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOwotCQl9Ci0JCWlmIChudW1faW9lcV9wcm9jZXNzZWQgfHwgbnVtX21jY2VxX3Byb2Nlc3NlZCkgewotCQkJaWYgKHBiZV9lcS0+dG9kb19tY2NfY3EpCi0JCQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBiZV9lcS0+d29ya19jcXMpOwotCi0JCQlpZiAoKG51bV9tY2NlcV9wcm9jZXNzZWQpICYmICghbnVtX2lvZXFfcHJvY2Vzc2VkKSkKLQkJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDAsCi0JCQkJCSAgICAgIChudW1faW9lcV9wcm9jZXNzZWQgKwotCQkJCQkgICAgICAgbnVtX21jY2VxX3Byb2Nlc3NlZCkgLCAxLCAxKTsKLQkJCWVsc2UKLQkJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDAsCi0JCQkJCSAgICAgICAobnVtX2lvZXFfcHJvY2Vzc2VkICsKLQkJCQkJCW51bV9tY2NlcV9wcm9jZXNzZWQpLCAwLCAxKTsKLQotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9IGVsc2UKLQkJCXJldHVybiBJUlFfTk9ORTsKLQl9IGVsc2UgewotCQljcSA9ICZwaHdpX2NvbnRleHQtPmJlX2NxWzBdOwotCQl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCi0JCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7Ci0KLQkJCWlmICgoKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksCi0JCQkgICAgIHJlc291cmNlX2lkKSAvIDMyXSAmCi0JCQkgICAgIEVRRV9SRVNJRF9NQVNLKSA+PiAxNikgIT0gY3EtPmlkKSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQkJcGJlX2VxLT50b2RvX21jY19jcSA9IHRydWU7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQkJcGJlX2VxLT50b2RvX2NxID0gdHJ1ZTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJfQotCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7Ci0JCQlxdWV1ZV90YWlsX2luYyhlcSk7Ci0JCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KKwkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CisJCWlmICgoKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksCisJCSAgICAgcmVzb3VyY2VfaWQpIC8gMzJdICYKKwkJICAgICBFUUVfUkVTSURfTUFTSykgPj4gMTYpID09IG1jYy0+aWQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOworCQkJcGJlX2VxLT50b2RvX21jY19jcSA9IHRydWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOworCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCsrOworCQl9IGVsc2UgeworCQkJaWYgKCFibGtfaW9wb2xsX3NjaGVkX3ByZXAoJnBiZV9lcS0+aW9wb2xsKSkKKwkJCQlibGtfaW9wb2xsX3NjaGVkKCZwYmVfZXEtPmlvcG9sbCk7CiAJCQludW1faW9lcV9wcm9jZXNzZWQrKzsKIAkJfQotCQlpZiAocGJlX2VxLT50b2RvX2NxIHx8IHBiZV9lcS0+dG9kb19tY2NfY3EpCisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOworCQlxdWV1ZV90YWlsX2luYyhlcSk7CisJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJfQorCWlmIChudW1faW9lcV9wcm9jZXNzZWQgfHwgbnVtX21jY2VxX3Byb2Nlc3NlZCkgeworCQlpZiAocGJlX2VxLT50b2RvX21jY19jcSkKIAkJCXF1ZXVlX3dvcmsocGhiYS0+d3EsICZwYmVfZXEtPndvcmtfY3FzKTsKIAotCQlpZiAobnVtX2lvZXFfcHJvY2Vzc2VkKSB7CisJCWlmICgobnVtX21jY2VxX3Byb2Nlc3NlZCkgJiYgKCFudW1faW9lcV9wcm9jZXNzZWQpKQogCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLAotCQkJCSAgICAgICBudW1faW9lcV9wcm9jZXNzZWQsIDEsIDEpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9IGVsc2UKLQkJCXJldHVybiBJUlFfTk9ORTsKLQl9CisJCQkJICAgICAgKG51bV9pb2VxX3Byb2Nlc3NlZCArCisJCQkJICAgICAgIG51bV9tY2NlcV9wcm9jZXNzZWQpICwgMSwgMSk7CisJCWVsc2UKKwkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKKwkJCQkgICAgICAgKG51bV9pb2VxX3Byb2Nlc3NlZCArCisJCQkJCW51bV9tY2NlcV9wcm9jZXNzZWQpLCAwLCAxKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlCisJCXJldHVybiBJUlFfTk9ORTsKIH0KIAogc3RhdGljIGludCBiZWlzY3NpX2luaXRfaXJxcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCkBAIC0xMDkzLDE1ICsxMDY4LDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaHdpX3JpbmdfY3FfZGIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAordm9pZCBod2lfcmluZ19jcV9kYihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCQkgICB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBudW1fcHJvY2Vzc2VkLAogCQkJICAgdW5zaWduZWQgY2hhciByZWFybSwgdW5zaWduZWQgY2hhciBldmVudCkKIHsKIAl1MzIgdmFsID0gMDsKLQl2YWwgfD0gaWQgJiBEQl9DUV9SSU5HX0lEX01BU0s7CisKIAlpZiAocmVhcm0pCiAJCXZhbCB8PSAxIDw8IERCX0NRX1JFQVJNX1NISUZUOworCiAJdmFsIHw9IG51bV9wcm9jZXNzZWQgPDwgREJfQ1FfTlVNX1BPUFBFRF9TSElGVDsKKworCS8qIFNldHRpbmcgbG93ZXIgb3JkZXIgQ1FfSUQgQml0cyAqLworCXZhbCB8PSAoaWQgJiBEQl9DUV9SSU5HX0lEX0xPV19NQVNLKTsKKworCS8qIFNldHRpbmcgSGlnaGVyIG9yZGVyIENRX0lEIEJpdHMgKi8KKwl2YWwgfD0gKCgoaWQgPj4gREJfQ1FfSElHSF9GRUlMRF9TSElGVCkgJgorCQkgIERCX0NRX1JJTkdfSURfSElHSF9NQVNLKQorCQkgIDw8IERCX0NRX0hJR0hfU0VUX1NISUZUKTsKKwogCWlvd3JpdGUzMih2YWwsIHBoYmEtPmRiX3ZhICsgREJfQ1FfT0ZGU0VUKTsKIH0KIApAQCAtMTE1MCw5ICsxMTM1LDkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKilwcGR1LCBwYnVmZmVyLCBidWZfbGVuKTsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNDIsOCArMTMyNywxMCBAQAogCXJlc2lkID0gY3NvbF9jcWUtPnJlc19jbnQ7CiAKIAlpZiAoIXRhc2stPnNjKSB7Ci0JCWlmIChpb190YXNrLT5zY3NpX2NtbmQpCisJCWlmIChpb190YXNrLT5zY3NpX2NtbmQpIHsKIAkJCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CisJCQlpb190YXNrLT5zY3NpX2NtbmQgPSBOVUxMOworCQl9CiAKIAkJcmV0dXJuOwogCX0KQEAgLTEzODAsNiArMTM2Nyw3IEBACiAJCWNvbm4tPnJ4ZGF0YV9vY3RldHMgKz0gcmVzaWQ7CiB1bm1hcDoKIAlzY3NpX2RtYV91bm1hcChpb190YXNrLT5zY3NpX2NtbmQpOworCWlvX3Rhc2stPnNjc2lfY21uZCA9IE5VTEw7CiAJaXNjc2lfY29tcGxldGVfc2NzaV90YXNrKHRhc2ssIGV4cF9jbWRzbiwgbWF4X2NtZHNuKTsKIH0KIApAQCAtMTU2OCw3ICsxNTU2LDcgQEAKIAlwd3JiID0gcHdyYl9oYW5kbGUtPnB3cmI7CiAJdHlwZSA9ICgoc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqKXRhc2stPmRkX2RhdGEpLT53cmJfdHlwZTsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgSFdIX1RZUEVfSU86CiAJY2FzZSBIV0hfVFlQRV9JT19SRDoKQEAgLTE2MDcsNyArMTU5NSw3IEBACiAJCWJyZWFrOwogCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmh3aV9nZXRfYXN5bmNfYnVzeV9saXN0KHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQKQEAgLTQzNjAsMTIgKzQzNDgsMTYgQEAKIAkJZ290byBib290X2ZyZWVtZW07CiAJfQogCi0JcmV0ID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZC52YSk7CisJcmV0ID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgJm5vbmVtYl9jbWQpOwogCWlmIChyZXQpIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCiAJCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0NPTkZJRywKIAkJCSAgICAiQk1fJWQgOiBiZWlzY3NpX2dldF9zZXNzaW9uX2luZm8gRmFpbGVkIik7Ci0JCWdvdG8gYm9vdF9mcmVlbWVtOworCisJCWlmIChyZXQgIT0gLUVCVVNZKQorCQkJZ290byBib290X2ZyZWVtZW07CisJCWVsc2UKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJc2Vzc2lvbl9yZXNwID0gbm9uZW1iX2NtZC52YSA7CkBAIC00NjI1LDYgKzQ2MTcsMTEgQEAKIAkJCXNwaW5fdW5sb2NrKCZwaGJhLT5pb19zZ2xfbG9jayk7CiAJCQlpb190YXNrLT5wc2dsX2hhbmRsZSA9IE5VTEw7CiAJCX0KKworCQlpZiAoaW9fdGFzay0+c2NzaV9jbW5kKSB7CisJCQlzY3NpX2RtYV91bm1hcChpb190YXNrLT5zY3NpX2NtbmQpOworCQkJaW9fdGFzay0+c2NzaV9jbW5kID0gTlVMTDsKKwkJfQogCX0gZWxzZSB7CiAJCWlmICghYmVpc2NzaV9jb25uLT5sb2dpbl9pbl9wcm9ncmVzcykKIAkJCWJlaXNjc2lfZnJlZV9tZ210X3Rhc2tfaGFuZGxlcyhiZWlzY3NpX2Nvbm4sIHRhc2spOwpAQCAtNDY0Niw5ICs0NjQzLDkgQEAKIAkgKiBsb2dpbi9zdGFydHVwIHJlbGF0ZWQgdGFza3MuCiAJICovCiAJYmVpc2NzaV9jb25uLT5sb2dpbl9pbl9wcm9ncmVzcyA9IDA7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJYmVpc2NzaV9jbGVhbnVwX3Rhc2sodGFzayk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCiAJcHdyYl9oYW5kbGUgPSBhbGxvY193cmJfaGFuZGxlKHBoYmEsIGJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCk7CiAKQEAgLTUyMTYsMTEgKzUyMTMsMTAgQEAKIAkJfQogCXBjaV9kaXNhYmxlX21zaXgocGhiYS0+cGNpZGV2KTsKIAotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpCi0JCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7Ci0JCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJCWJsa19pb3BvbGxfZGlzYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwotCQl9CisJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKKwkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07CisJCWJsa19pb3BvbGxfZGlzYWJsZSgmcGJlX2VxLT5pb3BvbGwpOworCX0KIAogCWlmICh1bmxvYWRfc3RhdGUgPT0gQkVJU0NTSV9DTEVBTl9VTkxPQUQpIHsKIAkJZGVzdHJveV93b3JrcXVldWUocGhiYS0+d3EpOwpAQCAtNTI3Myw2ICs1MjY5LDggQEAKIAkJcmV0dXJuOwogCX0KIAorCXBoYmEtPnN0YXRlID0gQkVfQURBUFRFUl9TVEFURV9TSFVURE9XTjsKKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24ocGhiYS0+c2hvc3QsIGJlMmlzY3NpX2ZhaWxfc2Vzc2lvbik7CiAJYmVpc2NzaV9xdWllc2NlKHBoYmEsIEJFSVNDU0lfQ0xFQU5fVU5MT0FEKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKIH0KQEAgLTU0MjksMzIgKzU0MjcsMTggQEAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7Ci0JCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJCWJsa19pb3BvbGxfaW5pdCgmcGJlX2VxLT5pb3BvbGwsIGJlX2lvcG9sbF9idWRnZXQsCi0JCQkJCWJlX2lvcG9sbCk7Ci0JCQlibGtfaW9wb2xsX2VuYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwotCQl9Ci0KLQkJaSA9IChwaGJhLT5tc2l4X2VuYWJsZWQpID8gaSA6IDA7Ci0JCS8qIFdvcmsgaXRlbSBmb3IgTUNDIGhhbmRsaW5nICovCisJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKIAkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOwotCX0gZWxzZSB7Ci0JCWlmIChwaGJhLT5tc2l4X2VuYWJsZWQpIHsKLQkJCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bnVtX2NwdXM7IGkrKykgewotCQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQkJCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywKLQkJCQkJICBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVswXTsKLQkJCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywKLQkJCQkgIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKLQkJfQorCQlibGtfaW9wb2xsX2luaXQoJnBiZV9lcS0+aW9wb2xsLCBiZV9pb3BvbGxfYnVkZ2V0LAorCQkJCWJlX2lvcG9sbCk7CisJCWJsa19pb3BvbGxfZW5hYmxlKCZwYmVfZXEtPmlvcG9sbCk7CiAJfQogCisJaSA9IChwaGJhLT5tc2l4X2VuYWJsZWQpID8gaSA6IDA7CisJLyogV29yayBpdGVtIGZvciBNQ0MgaGFuZGxpbmcgKi8KKwlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKKwlJTklUX1dPUksoJnBiZV9lcS0+d29ya19jcXMsIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKKwogCXJldCA9IGJlaXNjc2lfaW5pdF9pcnFzKHBoYmEpOwogCWlmIChyZXQgPCAwKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULApAQCAtNTU5NCw2ICs1NTc4LDggQEAKIAkJcGhiYS0+Y3RybC5tY2NfdGFnW2ldID0gaSArIDE7CiAJCXBoYmEtPmN0cmwubWNjX251bXRhZ1tpICsgMV0gPSAwOwogCQlwaGJhLT5jdHJsLm1jY190YWdfYXZhaWxhYmxlKys7CisJCW1lbXNldCgmcGhiYS0+Y3RybC5wdGFnX3N0YXRlW2ldLnRhZ19tZW1fc3RhdGUsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGJlaXNjc2lfbWNjX3RhZ19zdGF0ZSkpOwogCX0KIAogCXBoYmEtPmN0cmwubWNjX2FsbG9jX2luZGV4ID0gcGhiYS0+Y3RybC5tY2NfZnJlZV9pbmRleCA9IDA7CkBAIC01NjE0LDMyICs1NjAwLDE4IEBACiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CiAJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwogCi0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgewotCQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCQlibGtfaW9wb2xsX2luaXQoJnBiZV9lcS0+aW9wb2xsLCBiZV9pb3BvbGxfYnVkZ2V0LAotCQkJCQliZV9pb3BvbGwpOwotCQkJYmxrX2lvcG9sbF9lbmFibGUoJnBiZV9lcS0+aW9wb2xsKTsKLQkJfQotCi0JCWkgPSAocGhiYS0+bXNpeF9lbmFibGVkKSA/IGkgOiAwOwotCQkvKiBXb3JrIGl0ZW0gZm9yIE1DQyBoYW5kbGluZyAqLworCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7CiAJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOwotCQlJTklUX1dPUksoJnBiZV9lcS0+d29ya19jcXMsIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKLQl9IGVsc2UgewotCQlpZiAocGhiYS0+bXNpeF9lbmFibGVkKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJCQlJTklUX1dPUksoJnBiZV9lcS0+d29ya19jcXMsCi0JCQkJCSAgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxWzBdOwotCQkJCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywKLQkJCQkJICBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7Ci0JCQl9CisJCWJsa19pb3BvbGxfaW5pdCgmcGJlX2VxLT5pb3BvbGwsIGJlX2lvcG9sbF9idWRnZXQsCisJCQkJYmVfaW9wb2xsKTsKKwkJYmxrX2lvcG9sbF9lbmFibGUoJnBiZV9lcS0+aW9wb2xsKTsKIAl9CiAKKwlpID0gKHBoYmEtPm1zaXhfZW5hYmxlZCkgPyBpIDogMDsKKwkvKiBXb3JrIGl0ZW0gZm9yIE1DQyBoYW5kbGluZyAqLworCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCUlOSVRfV09SSygmcGJlX2VxLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOworCiAJcmV0ID0gYmVpc2NzaV9pbml0X2lycXMocGhiYSk7CiAJaWYgKHJldCA8IDApIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCkBAIC01NjY4LDExICs1NjQwLDEwIEBACiAKIGZyZWVfYmxrZW5ibGQ6CiAJZGVzdHJveV93b3JrcXVldWUocGhiYS0+d3EpOwotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpCi0JCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7Ci0JCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJCWJsa19pb3BvbGxfZGlzYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwotCQl9CisJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKKwkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07CisJCWJsa19pb3BvbGxfZGlzYWJsZSgmcGJlX2VxLT5pb3BvbGwpOworCX0KIGZyZWVfdHdxOgogCWJlaXNjc2lfY2xlYW5fcG9ydChwaGJhKTsKIAliZWlzY3NpX2ZyZWVfbWVtKHBoYmEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKaW5kZXggMzFmYTI3Yi4uOTM4MGI1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCQkiYmUyaXNjc2kiCi0jZGVmaW5lIEJVSUxEX1NUUgkJIjEwLjAuNjU5LjAiCisjZGVmaW5lIEJVSUxEX1NUUgkJIjEwLjIuMTI1LjAiCiAjZGVmaW5lIEJFX05BTUUJCQkiRW11bGV4IE9uZUNvbm5lY3QiIFwKIAkJCQkiT3Blbi1pU0NTSSBEcml2ZXIgdmVyc2lvbiIgQlVJTERfU1RSCiAjZGVmaW5lIERSVl9ERVNDCQlCRV9OQU1FICIgIiAiRHJpdmVyIgpAQCAtOTcsOSArOTcsMTQgQEAKIAogI2RlZmluZSBJTlZBTElEX1NFU1NfSEFORExFCTB4RkZGRkZGRkYKIAorLyoqCisgKiBBZGFwdGVyIFN0YXRlcworICoqLwogI2RlZmluZSBCRV9BREFQVEVSX0xJTktfVVAJMHgwMDEKICNkZWZpbmUgQkVfQURBUFRFUl9MSU5LX0RPV04JMHgwMDIKICNkZWZpbmUgQkVfQURBUFRFUl9QQ0lfRVJSCTB4MDA0CisjZGVmaW5lIEJFX0FEQVBURVJfU1RBVEVfU0hVVERPV04JMHgwMDgKKwogCiAjZGVmaW5lIEJFSVNDU0lfQ0xFQU5fVU5MT0FECTB4MDEKICNkZWZpbmUgQkVJU0NTSV9FRUhfVU5MT0FECTB4MDIKQEAgLTEzNSwxMSArMTQwLDE1IEBACiAjZGVmaW5lIERCX1JYVUxQMF9PRkZTRVQgMHhBMAogLyoqKioqKioqKiBFdmVudCBRIGRvb3IgYmVsbCAqKioqKioqKioqKioqLwogI2RlZmluZSBEQl9FUV9PRkZTRVQJCQlEQl9DUV9PRkZTRVQKLSNkZWZpbmUgREJfRVFfUklOR19JRF9NQVNLCQkweDFGRgkvKiBiaXRzIDAgLSA4ICovCisjZGVmaW5lIERCX0VRX1JJTkdfSURfTE9XX01BU0sJCTB4MUZGCS8qIGJpdHMgMCAtIDggKi8KIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgZm9yIHRoaXMgZXEgKi8KICNkZWZpbmUgREJfRVFfQ0xSX1NISUZUCQkJKDkpCS8qIGJpdCA5ICovCiAvKiBNdXN0IGJlIDEgKi8KICNkZWZpbmUgREJfRVFfRVZOVF9TSElGVAkJKDEwKQkvKiBiaXQgMTAgKi8KKy8qIEhpZ2hlciBPcmRlciBFUV9JRCBiaXQgKi8KKyNkZWZpbmUgREJfRVFfUklOR19JRF9ISUdIX01BU0sJMHgxRiAvKiBiaXRzIDExIC0gMTUgKi8KKyNkZWZpbmUgREJfRVFfSElHSF9TRVRfU0hJRlQJMTEKKyNkZWZpbmUgREJfRVFfSElHSF9GRUlMRF9TSElGVAk5CiAvKiBOdW1iZXIgb2YgZXZlbnQgZW50cmllcyBwcm9jZXNzZWQgKi8KICNkZWZpbmUgREJfRVFfTlVNX1BPUFBFRF9TSElGVAkJKDE2KQkvKiBiaXRzIDE2IC0gMjggKi8KIC8qIFJlYXJtIGJpdCAqLwpAQCAtMTQ3LDcgKzE1NiwxMiBAQAogCiAvKioqKioqKioqIENvbXBsIFEgZG9vciBiZWxsICoqKioqKioqKioqKiovCiAjZGVmaW5lIERCX0NRX09GRlNFVAkJCTB4MTIwCi0jZGVmaW5lIERCX0NRX1JJTkdfSURfTUFTSwkJMHgzRkYJLyogYml0cyAwIC0gOSAqLworI2RlZmluZSBEQl9DUV9SSU5HX0lEX0xPV19NQVNLCQkweDNGRgkvKiBiaXRzIDAgLSA5ICovCisvKiBIaWdoZXIgT3JkZXIgQ1FfSUQgYml0ICovCisjZGVmaW5lIERCX0NRX1JJTkdfSURfSElHSF9NQVNLCTB4MUYgLyogYml0cyAxMSAtIDE1ICovCisjZGVmaW5lIERCX0NRX0hJR0hfU0VUX1NISUZUCTExCisjZGVmaW5lIERCX0NRX0hJR0hfRkVJTERfU0hJRlQJMTAKKwogLyogTnVtYmVyIG9mIGV2ZW50IGVudHJpZXMgcHJvY2Vzc2VkICovCiAjZGVmaW5lIERCX0NRX05VTV9QT1BQRURfU0hJRlQJCSgxNikJLyogYml0cyAxNiAtIDI4ICovCiAvKiBSZWFybSBiaXQgKi8KQEAgLTgyMSw2ICs4MzUsOSBAQAogdm9pZCBiZWlzY3NpX2ZyZWVfbWdtdF90YXNrX2hhbmRsZXMoc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAogCQkJCSAgICAgc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spOwogCit2b2lkIGh3aV9yaW5nX2NxX2RiKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJICAgICB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBudW1fcHJvY2Vzc2VkLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgcmVhcm0sIHVuc2lnbmVkIGNoYXIgZXZlbnQpOwogc3RhdGljIGlubGluZSBib29sIGJlaXNjc2lfZXJyb3Ioc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQogewogCXJldHVybiBwaGJhLT51ZV9kZXRlY3RlZCB8fCBwaGJhLT5md190aW1lb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMKaW5kZXggYjJmY2FjNy4uMDg4YmRmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCkBAIC04MjgsMjIgKzgyOCwyNSBAQAogCWJlX21jY19ub3RpZnkocGhiYSk7CiAJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CiAKLQlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsIG5vbmVtYl9jbWQtPnZhKTsKLQlpZiAocmMpIHsKLQkJLyogQ2hlY2sgaWYgdGhlIElPQ1RMIG5lZWRzIHRvIGJlIHJlLWlzc3VlZCAqLwotCQlpZiAocmMgPT0gLUVBR0FJTikKLQkJCXJldHVybiByYzsKLQotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YLAotCQkJICAgICJCR18lZCA6IG1nbXRfZXhlY19ub25lbWJfY21kIEZhaWxlZCBzdGF0dXNcbiIpOwotCi0JCWdvdG8gZnJlZV9jbWQ7Ci0JfQorCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsKHBoYmEsIHRhZywgTlVMTCwgbm9uZW1iX2NtZCk7CiAKIAlpZiAocmVzcF9idWYpCiAJCW1lbWNweShyZXNwX2J1Ziwgbm9uZW1iX2NtZC0+dmEsIHJlc3BfYnVmX2xlbik7CiAKKwlpZiAocmMpIHsKKwkJLyogQ2hlY2sgaWYgdGhlIE1CWCBDbWQgbmVlZHMgdG8gYmUgcmUtaXNzdWVkICovCisJCWlmIChyYyA9PSAtRUFHQUlOKQorCQkJcmV0dXJuIHJjOworCisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKKwkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YLAorCQkJICAgICJCR18lZCA6IG1nbXRfZXhlY19ub25lbWJfY21kIEZhaWxlZCBzdGF0dXNcbiIpOworCisJCWlmIChyYyAhPSAtRUJVU1kpCisJCQlnb3RvIGZyZWVfY21kOworCQllbHNlCisJCQlyZXR1cm4gcmM7CisJfQogZnJlZV9jbWQ6CiAJcGNpX2ZyZWVfY29uc2lzdGVudChjdHJsLT5wZGV2LCBub25lbWJfY21kLT5zaXplLAogCQkJICAgIG5vbmVtYl9jbWQtPnZhLCBub25lbWJfY21kLT5kbWEpOwpAQCAtMTM0OCw3ICsxMzUxLDYgQEAKIHsKIAlpbnQgcmM7CiAJdW5zaWduZWQgaW50IHRhZzsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gTlVMTDsKIAogCXRhZyA9IGJlX2NtZF9zZXRfdmxhbihwaGJhLCB2bGFuX3RhZyk7CiAJaWYgKCF0YWcpIHsKQEAgLTEzNTgsNyArMTM2MCw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JcmMgPSBiZWlzY3NpX21jY3FfY29tcGwocGhiYSwgdGFnLCAmd3JiLCBOVUxMKTsKKwlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbChwaGJhLCB0YWcsIE5VTEwsIE5VTEwpOwogCWlmIChyYykgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKIAkJCSAgICAoQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jCmluZGV4IDY1MTgwZTEuLjMxNWQ2ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jCkBAIC0zODc4LDcgKzM4NzgsNyBAQAogCQliZmFfdHJjKHNmcCwgc2ZwLT5kYXRhX3ZhbGlkKTsKIAkJaWYgKHNmcC0+ZGF0YV92YWxpZCkgewogCQkJdTMyCXNpemUgPSBzaXplb2Yoc3RydWN0IHNmcF9tZW1fcyk7Ci0JCQl1OCAqZGVzID0gKHU4ICopICYoc2ZwLT5zZnBtZW0tPnNybGlkX2Jhc2UpOworCQkJdTggKmRlcyA9ICh1OCAqKSAmKHNmcC0+c2ZwbWVtKTsKIAkJCW1lbWNweShkZXMsIHNmcC0+ZGJ1Zl9rdmEsIHNpemUpOwogCQl9CiAJCS8qCkBAIC02ODUxLDcgKzY4NTEsNyBAQAogYmZhX2ZsYXNoX3N0YXR1c19yZWFkKHZvaWQgX19pb21lbSAqcGNpX2JhcikKIHsKIAl1bmlvbiBiZmFfZmxhc2hfZGV2X3N0YXR1c19yZWdfdQlkZXZfc3RhdHVzOwotCXUzMgkJCQlzdGF0dXM7CisJaW50CQkJCXN0YXR1czsKIAl1MzIJCQlyZXRfc3RhdHVzOwogCWludAkJCQlpOwogCkBAIC02ODk5LDcgKzY4OTksNyBAQAogYmZhX2ZsYXNoX3JlYWRfc3RhcnQodm9pZCBfX2lvbWVtICpwY2lfYmFyLCB1MzIgb2Zmc2V0LCB1MzIgbGVuLAogCQkJIGNoYXIgKmJ1ZikKIHsKLQl1MzIgc3RhdHVzOworCWludCBzdGF0dXM7CiAKIAkvKgogCSAqIGxlbiBtdXN0IGJlIG11dGlwbGUgb2YgNCBhbmQgbm90IGV4Y2VlZGluZyBmaWZvIHNpemUKQEAgLTcwMDYsNyArNzAwNiw3IEBACiAJd2hpbGUgKCFiZmFfcmF3X3NlbV9nZXQoYmFyKSkgewogCQlpZiAoLS1uIDw9IDApCiAJCQlyZXR1cm4gQkZBX1NUQVRVU19CQURGTEFTSDsKLQkJdWRlbGF5KDEwMDAwKTsKKwkJbWRlbGF5KDEwKTsKIAl9CiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CkBAIC03MDIxLDcgKzcwMjEsOCBAQAogYmZhX2ZsYXNoX3Jhd19yZWFkKHZvaWQgX19pb21lbSAqcGNpX2JhciwgdTMyIG9mZnNldCwgY2hhciAqYnVmLAogCQkgICAgICAgdTMyIGxlbikKIHsKLQl1MzIgbiwgc3RhdHVzOworCXUzMiBuOworCWludCBzdGF0dXM7CiAJdTMyIG9mZiwgbCwgcywgcmVzaWR1ZSwgZmlmb19zejsKIAogCXJlc2lkdWUgPSBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMKaW5kZXggMTU3ZjYwNC4uODk5NGZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYwpAQCAtMjMwNCw4ICsyMzA0LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CiAKLQlpZiAoYmZhX2ZjcG9ydF9pc19kcG9ydCgmYmZhZC0+YmZhKSkKKwlpZiAoYmZhX2ZjcG9ydF9pc19kcG9ydCgmYmZhZC0+YmZhKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIEJGQV9TVEFUVVNfRFBPUlRfRVJSOworCX0KIAogCWlmICgoZmNwb3J0LT5jZmcudG9wb2xvZ3kgPT0gQkZBX1BPUlRfVE9QT0xPR1lfTE9PUCkgfHwKIAkJKGZjcG9ydC0+dG9wb2xvZ3kgPT0gQkZBX1BPUlRfVE9QT0xPR1lfTE9PUCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jCmluZGV4IDk5NjdmOWMuLmYwNjczMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jCkBAIC03Myw5ICs3MywxNCBAQAogCiAJCWJyZWFrOwogCi0JY2FzZSBCRklfSU9JTV9TVFNfQUJPUlRFRDoKIAljYXNlIEJGSV9JT0lNX1NUU19USU1FRE9VVDoKKwkJaG9zdF9zdGF0dXMgPSBESURfVElNRV9PVVQ7CisJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoaG9zdF9zdGF0dXMsIDApOworCQlicmVhazsKIAljYXNlIEJGSV9JT0lNX1NUU19QQVRIVE9WOgorCQlob3N0X3N0YXR1cyA9IERJRF9UUkFOU1BPUlRfRElTUlVQVEVEOworCQljbW5kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KGhvc3Rfc3RhdHVzLCAwKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CiAJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoaG9zdF9zdGF0dXMsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaCBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKaW5kZXggMWViZjNmYi4uNmE5NzY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCkBAIC02NCw3ICs2NCw3IEBACiAjaW5jbHVkZSAiYm54MmZjX2NvbnN0YW50cy5oIgogCiAjZGVmaW5lIEJOWDJGQ19OQU1FCQkiYm54MmZjIgotI2RlZmluZSBCTlgyRkNfVkVSU0lPTgkJIjIuNC4xIgorI2RlZmluZSBCTlgyRkNfVkVSU0lPTgkJIjIuNC4yIgogCiAjZGVmaW5lIFBGWAkJCSJibngyZmM6ICIKIApAQCAtMzY3LDYgKzM2Nyw3IEBACiAJYXRvbWljX3QgbnVtX2FjdGl2ZV9pb3M7CiAJdTMyIGZsdXNoX2luX3Byb2c7CiAJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CisJdW5zaWduZWQgbG9uZyByZXRyeV9kZWxheV90aW1lc3RhbXA7CiAJc3RydWN0IGxpc3RfaGVhZCBmcmVlX3Rhc2tfbGlzdDsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqcGVuZGluZ19xdWV1ZVtCTlgyRkNfU1FfV1FFU19NQVgrMV07CiAJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmVfY21kX3F1ZXVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCmluZGV4IDliOTQ4NTAuLjYyODdmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyZmMiCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTglCTlgyRkNfVkVSU0lPTgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIlNlcCAxNywgMjAxMyIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJEZWMgMTEsIDIwMTMiCiAKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdID0KQEAgLTg1MCw2ICs4NTAsOSBAQAogCQkJCV9fYm54MmZjX2Rlc3Ryb3koaW50ZXJmYWNlKTsKIAkJfQogCQltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CisKKwkJLyogRW5zdXJlIEFMTCBkZXN0cm95IHdvcmsgaGFzIGJlZW4gY29tcGxldGVkIGJlZm9yZSByZXR1cm4gKi8KKwkJZmx1c2hfd29ya3F1ZXVlKGJueDJmY193cSk7CiAJCXJldHVybjsKIAogCWRlZmF1bHQ6CkBAIC0yMzg5LDYgKzIzOTIsOSBAQAogCQkJX19ibngyZmNfZGVzdHJveShpbnRlcmZhY2UpOwogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAorCS8qIEVuc3VyZSBBTEwgZGVzdHJveSB3b3JrIGhhcyBiZWVuIGNvbXBsZXRlZCBiZWZvcmUgcmV0dXJuICovCisJZmx1c2hfd29ya3F1ZXVlKGJueDJmY193cSk7CisKIAlibngyZmNfdWxwX3N0b3AoaGJhKTsKIAkvKiB1bnJlZ2lzdGVyIGNuaWMgZGV2aWNlICovCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfQ05JQ19SRUdJU1RFUkVELCAmaGJhLT5yZWdfd2l0aF9jbmljKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCmluZGV4IGVkODgwODkuLjMyYTVlMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYwpAQCAtNTk0LDEzICs1OTQsMTMgQEAKIAkJbXBfcmVxLT5tcF9yZXNwX2JkID0gTlVMTDsKIAl9CiAJaWYgKG1wX3JlcS0+cmVxX2J1ZikgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJICAgICBtcF9yZXEtPnJlcV9idWYsCiAJCQkJICAgICBtcF9yZXEtPnJlcV9idWZfZG1hKTsKIAkJbXBfcmVxLT5yZXFfYnVmID0gTlVMTDsKIAl9CiAJaWYgKG1wX3JlcS0+cmVzcF9idWYpIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJCSAgICAgbXBfcmVxLT5yZXNwX2J1ZiwKIAkJCQkgICAgIG1wX3JlcS0+cmVzcF9idWZfZG1hKTsKIAkJbXBfcmVxLT5yZXNwX2J1ZiA9IE5VTEw7CkBAIC02MjIsNyArNjIyLDcgQEAKIAogCW1wX3JlcS0+cmVxX2xlbiA9IHNpemVvZihzdHJ1Y3QgZmNwX2NtbmQpOwogCWlvX3JlcS0+ZGF0YV94ZmVyX2xlbiA9IG1wX3JlcS0+cmVxX2xlbjsKLQltcF9yZXEtPnJlcV9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwltcF9yZXEtPnJlcV9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJCQkgICAgICZtcF9yZXEtPnJlcV9idWZfZG1hLAogCQkJCQkgICAgIEdGUF9BVE9NSUMpOwogCWlmICghbXBfcmVxLT5yZXFfYnVmKSB7CkBAIC02MzEsNyArNjMxLDcgQEAKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKLQltcF9yZXEtPnJlc3BfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJbXBfcmVxLT5yZXNwX2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJCSAgICAgICZtcF9yZXEtPnJlc3BfYnVmX2RtYSwKIAkJCQkJICAgICAgR0ZQX0FUT01JQyk7CiAJaWYgKCFtcF9yZXEtPnJlc3BfYnVmKSB7CkBAIC02MzksOCArNjM5LDggQEAKIAkJYm54MmZjX2ZyZWVfbXBfcmVzYyhpb19yZXEpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KLQltZW1zZXQobXBfcmVxLT5yZXFfYnVmLCAwLCBQQUdFX1NJWkUpOwotCW1lbXNldChtcF9yZXEtPnJlc3BfYnVmLCAwLCBQQUdFX1NJWkUpOworCW1lbXNldChtcF9yZXEtPnJlcV9idWYsIDAsIENOSUNfUEFHRV9TSVpFKTsKKwltZW1zZXQobXBfcmVxLT5yZXNwX2J1ZiwgMCwgQ05JQ19QQUdFX1NJWkUpOwogCiAJLyogQWxsb2NhdGUgYW5kIG1hcCBtcF9yZXFfYmQgYW5kIG1wX3Jlc3BfYmQgKi8KIAlzeiA9IHNpemVvZihzdHJ1Y3QgZmNvZV9iZF9jdHgpOwpAQCAtNjY1LDcgKzY2NSw3IEBACiAJbXBfcmVxX2JkID0gbXBfcmVxLT5tcF9yZXFfYmQ7CiAJbXBfcmVxX2JkLT5idWZfYWRkcl9sbyA9ICh1MzIpYWRkciAmIDB4ZmZmZmZmZmY7CiAJbXBfcmVxX2JkLT5idWZfYWRkcl9oaSA9ICh1MzIpKCh1NjQpYWRkciA+PiAzMik7Ci0JbXBfcmVxX2JkLT5idWZfbGVuID0gUEFHRV9TSVpFOworCW1wX3JlcV9iZC0+YnVmX2xlbiA9IENOSUNfUEFHRV9TSVpFOwogCW1wX3JlcV9iZC0+ZmxhZ3MgPSAwOwogCiAJLyoKQEAgLTY3Nyw3ICs2NzcsNyBAQAogCWFkZHIgPSBtcF9yZXEtPnJlc3BfYnVmX2RtYTsKIAltcF9yZXNwX2JkLT5idWZfYWRkcl9sbyA9ICh1MzIpYWRkciAmIDB4ZmZmZmZmZmY7CiAJbXBfcmVzcF9iZC0+YnVmX2FkZHJfaGkgPSAodTMyKSgodTY0KWFkZHIgPj4gMzIpOwotCW1wX3Jlc3BfYmQtPmJ1Zl9sZW4gPSBQQUdFX1NJWkU7CisJbXBfcmVzcF9iZC0+YnVmX2xlbiA9IENOSUNfUEFHRV9TSVpFOwogCW1wX3Jlc3BfYmQtPmZsYWdzID0gMDsKIAogCXJldHVybiBTVUNDRVNTOwpAQCAtMTg3MSw3ICsxODcxLDE1IEBACiAJCXJjID0gU0NTSV9NTFFVRVVFX1RBUkdFVF9CVVNZOwogCQlnb3RvIGV4aXRfcWNtZDsKIAl9Ci0KKwlpZiAodGd0LT5yZXRyeV9kZWxheV90aW1lc3RhbXApIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGd0LT5yZXRyeV9kZWxheV90aW1lc3RhbXApKSB7CisJCQl0Z3QtPnJldHJ5X2RlbGF5X3RpbWVzdGFtcCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBJZiByZXRyeV9kZWxheSB0aW1lciBpcyBhY3RpdmUsIGZsb3cgb2ZmIHRoZSBNTCAqLworCQkJcmMgPSBTQ1NJX01MUVVFVUVfVEFSR0VUX0JVU1k7CisJCQlnb3RvIGV4aXRfcWNtZDsKKwkJfQorCX0KIAlpb19yZXEgPSBibngyZmNfY21kX2FsbG9jKHRndCk7CiAJaWYgKCFpb19yZXEpIHsKIAkJcmMgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwpAQCAtMTk2MSw2ICsxOTY5LDE1IEBACiAJCQkJICIgZmNwX3Jlc2lkID0gMHgleFxuIiwKIAkJCQlpb19yZXEtPmNkYl9zdGF0dXMsIGlvX3JlcS0+ZmNwX3Jlc2lkKTsKIAkJCXNjX2NtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBpb19yZXEtPmNkYl9zdGF0dXM7CisKKwkJCWlmIChpb19yZXEtPmNkYl9zdGF0dXMgPT0gU0FNX1NUQVRfVEFTS19TRVRfRlVMTCB8fAorCQkJICAgIGlvX3JlcS0+Y2RiX3N0YXR1cyA9PSBTQU1fU1RBVF9CVVNZKSB7CisJCQkJLyogU2V0IHRoZSBqaWZmaWVzICsgcmV0cnlfZGVsYXlfdGltZXIgKiAxMDBtcworCQkJCSAgIGZvciB0aGUgcnBvcnQvdGd0ICovCisJCQkJdGd0LT5yZXRyeV9kZWxheV90aW1lc3RhbXAgPSBqaWZmaWVzICsKKwkJCQkJZmNwX3JzcC0+cmV0cnlfZGVsYXlfdGltZXIgKiBIWiAvIDEwOworCQkJfQorCiAJCX0KIAkJaWYgKGlvX3JlcS0+ZmNwX3Jlc2lkKQogCQkJc2NzaV9zZXRfcmVzaWQoc2NfY21kLCBpb19yZXEtPmZjcF9yZXNpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY190Z3QuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCmluZGV4IDRkOTMxNzcuLjY4NzBjZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCkBAIC0zODYsNiArMzg2LDcgQEAKIAl0Z3QtPnJxX3Byb2RfaWR4ID0gMHg4MDAwOwogCXRndC0+cnFfY29uc19pZHggPSAwOwogCWF0b21pY19zZXQoJnRndC0+bnVtX2FjdGl2ZV9pb3MsIDApOworCXRndC0+cmV0cnlfZGVsYXlfdGltZXN0YW1wID0gMDsKIAogCWlmIChyZGF0YS0+ZmxhZ3MgJiBGQ19SUF9GTEFHU19SRVRSWSAmJgogCSAgICByZGF0YS0+aWRzLnJvbGVzICYgRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VUICYmCkBAIC02NzMsNyArNjc0LDggQEAKIAogCS8qIEFsbG9jYXRlIGFuZCBtYXAgU1EgKi8KIAl0Z3QtPnNxX21lbV9zaXplID0gdGd0LT5tYXhfc3FlcyAqIEJOWDJGQ19TUV9XUUVfU0laRTsKLQl0Z3QtPnNxX21lbV9zaXplID0gKHRndC0+c3FfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCXRndC0+c3FfbWVtX3NpemUgPSAodGd0LT5zcV9tZW1fc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmCisJCQkgICBDTklDX1BBR0VfTUFTSzsKIAogCXRndC0+c3EgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+c3FfbWVtX3NpemUsCiAJCQkJICAgICAmdGd0LT5zcV9kbWEsIEdGUF9LRVJORUwpOwpAQCAtNjg2LDcgKzY4OCw4IEBACiAKIAkvKiBBbGxvY2F0ZSBhbmQgbWFwIENRICovCiAJdGd0LT5jcV9tZW1fc2l6ZSA9IHRndC0+bWF4X2NxZXMgKiBCTlgyRkNfQ1FfV1FFX1NJWkU7Ci0JdGd0LT5jcV9tZW1fc2l6ZSA9ICh0Z3QtPmNxX21lbV9zaXplICsgKFBBR0VfU0laRSAtIDEpKSAmIFBBR0VfTUFTSzsKKwl0Z3QtPmNxX21lbV9zaXplID0gKHRndC0+Y3FfbWVtX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJgorCQkJICAgQ05JQ19QQUdFX01BU0s7CiAKIAl0Z3QtPmNxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPmNxX21lbV9zaXplLAogCQkJCSAgICAgJnRndC0+Y3FfZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTY5OSw3ICs3MDIsOCBAQAogCiAJLyogQWxsb2NhdGUgYW5kIG1hcCBSUSBhbmQgUlEgUEJMICovCiAJdGd0LT5ycV9tZW1fc2l6ZSA9IHRndC0+bWF4X3JxZXMgKiBCTlgyRkNfUlFfV1FFX1NJWkU7Ci0JdGd0LT5ycV9tZW1fc2l6ZSA9ICh0Z3QtPnJxX21lbV9zaXplICsgKFBBR0VfU0laRSAtIDEpKSAmIFBBR0VfTUFTSzsKKwl0Z3QtPnJxX21lbV9zaXplID0gKHRndC0+cnFfbWVtX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJgorCQkJICAgQ05JQ19QQUdFX01BU0s7CiAKIAl0Z3QtPnJxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPnJxX21lbV9zaXplLAogCQkJCQkmdGd0LT5ycV9kbWEsIEdGUF9LRVJORUwpOwpAQCAtNzEwLDggKzcxNCw5IEBACiAJfQogCW1lbXNldCh0Z3QtPnJxLCAwLCB0Z3QtPnJxX21lbV9zaXplKTsKIAotCXRndC0+cnFfcGJsX3NpemUgPSAodGd0LT5ycV9tZW1fc2l6ZSAvIFBBR0VfU0laRSkgKiBzaXplb2Yodm9pZCAqKTsKLQl0Z3QtPnJxX3BibF9zaXplID0gKHRndC0+cnFfcGJsX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCXRndC0+cnFfcGJsX3NpemUgPSAodGd0LT5ycV9tZW1fc2l6ZSAvIENOSUNfUEFHRV9TSVpFKSAqIHNpemVvZih2b2lkICopOworCXRndC0+cnFfcGJsX3NpemUgPSAodGd0LT5ycV9wYmxfc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmCisJCQkgICBDTklDX1BBR0VfTUFTSzsKIAogCXRndC0+cnFfcGJsID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPnJxX3BibF9zaXplLAogCQkJCQkgJnRndC0+cnFfcGJsX2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC03MjIsNyArNzI3LDcgQEAKIAl9CiAKIAltZW1zZXQodGd0LT5ycV9wYmwsIDAsIHRndC0+cnFfcGJsX3NpemUpOwotCW51bV9wYWdlcyA9IHRndC0+cnFfbWVtX3NpemUgLyBQQUdFX1NJWkU7CisJbnVtX3BhZ2VzID0gdGd0LT5ycV9tZW1fc2l6ZSAvIENOSUNfUEFHRV9TSVpFOwogCXBhZ2UgPSB0Z3QtPnJxX2RtYTsKIAlwYmwgPSAodTMyICopdGd0LT5ycV9wYmw7CiAKQEAgLTczMSwxMyArNzM2LDEzIEBACiAJCXBibCsrOwogCQkqcGJsID0gKHUzMikoKHU2NClwYWdlID4+IDMyKTsKIAkJcGJsKys7Ci0JCXBhZ2UgKz0gUEFHRV9TSVpFOworCQlwYWdlICs9IENOSUNfUEFHRV9TSVpFOwogCX0KIAogCS8qIEFsbG9jYXRlIGFuZCBtYXAgWEZFUlEgKi8KIAl0Z3QtPnhmZXJxX21lbV9zaXplID0gdGd0LT5tYXhfc3FlcyAqIEJOWDJGQ19YRkVSUV9XUUVfU0laRTsKLQl0Z3QtPnhmZXJxX21lbV9zaXplID0gKHRndC0+eGZlcnFfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYKLQkJCSAgICAgICBQQUdFX01BU0s7CisJdGd0LT54ZmVycV9tZW1fc2l6ZSA9ICh0Z3QtPnhmZXJxX21lbV9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYKKwkJCSAgICAgICBDTklDX1BBR0VfTUFTSzsKIAogCXRndC0+eGZlcnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+eGZlcnFfbWVtX3NpemUsCiAJCQkJCSZ0Z3QtPnhmZXJxX2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC03NTAsOCArNzU1LDggQEAKIAogCS8qIEFsbG9jYXRlIGFuZCBtYXAgQ09ORlEgJiBDT05GUSBQQkwgKi8KIAl0Z3QtPmNvbmZxX21lbV9zaXplID0gdGd0LT5tYXhfc3FlcyAqIEJOWDJGQ19DT05GUV9XUUVfU0laRTsKLQl0Z3QtPmNvbmZxX21lbV9zaXplID0gKHRndC0+Y29uZnFfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYKLQkJCSAgICAgICBQQUdFX01BU0s7CisJdGd0LT5jb25mcV9tZW1fc2l6ZSA9ICh0Z3QtPmNvbmZxX21lbV9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYKKwkJCSAgICAgICBDTklDX1BBR0VfTUFTSzsKIAogCXRndC0+Y29uZnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+Y29uZnFfbWVtX3NpemUsCiAJCQkJCSZ0Z3QtPmNvbmZxX2RtYSwgR0ZQX0tFUk5FTCk7CkBAIC03NjMsOSArNzY4LDkgQEAKIAltZW1zZXQodGd0LT5jb25mcSwgMCwgdGd0LT5jb25mcV9tZW1fc2l6ZSk7CiAKIAl0Z3QtPmNvbmZxX3BibF9zaXplID0KLQkJKHRndC0+Y29uZnFfbWVtX3NpemUgLyBQQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CisJCSh0Z3QtPmNvbmZxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CiAJdGd0LT5jb25mcV9wYmxfc2l6ZSA9Ci0JCSh0Z3QtPmNvbmZxX3BibF9zaXplICsgKFBBR0VfU0laRSAtIDEpKSAmIFBBR0VfTUFTSzsKKwkJKHRndC0+Y29uZnFfcGJsX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJiBDTklDX1BBR0VfTUFTSzsKIAogCXRndC0+Y29uZnFfcGJsID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LAogCQkJCQkgICAgdGd0LT5jb25mcV9wYmxfc2l6ZSwKQEAgLTc3Nyw3ICs3ODIsNyBAQAogCX0KIAogCW1lbXNldCh0Z3QtPmNvbmZxX3BibCwgMCwgdGd0LT5jb25mcV9wYmxfc2l6ZSk7Ci0JbnVtX3BhZ2VzID0gdGd0LT5jb25mcV9tZW1fc2l6ZSAvIFBBR0VfU0laRTsKKwludW1fcGFnZXMgPSB0Z3QtPmNvbmZxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkU7CiAJcGFnZSA9IHRndC0+Y29uZnFfZG1hOwogCXBibCA9ICh1MzIgKil0Z3QtPmNvbmZxX3BibDsKIApAQCAtNzg2LDcgKzc5MSw3IEBACiAJCXBibCsrOwogCQkqcGJsID0gKHUzMikoKHU2NClwYWdlID4+IDMyKTsKIAkJcGJsKys7Ci0JCXBhZ2UgKz0gUEFHRV9TSVpFOworCQlwYWdlICs9IENOSUNfUEFHRV9TSVpFOwogCX0KIAogCS8qIEFsbG9jYXRlIGFuZCBtYXAgQ29ubkRCICovCkBAIC04MDUsOCArODEwLDggQEAKIAogCS8qIEFsbG9jYXRlIGFuZCBtYXAgTENRICovCiAJdGd0LT5sY3FfbWVtX3NpemUgPSAodGd0LT5tYXhfc3FlcyArIDgpICogQk5YMkZDX1NRX1dRRV9TSVpFOwotCXRndC0+bGNxX21lbV9zaXplID0gKHRndC0+bGNxX21lbV9zaXplICsgKFBBR0VfU0laRSAtIDEpKSAmCi0JCQkgICAgIFBBR0VfTUFTSzsKKwl0Z3QtPmxjcV9tZW1fc2l6ZSA9ICh0Z3QtPmxjcV9tZW1fc2l6ZSArIChDTklDX1BBR0VfU0laRSAtIDEpKSAmCisJCQkgICAgIENOSUNfUEFHRV9NQVNLOwogCiAJdGd0LT5sY3EgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+bGNxX21lbV9zaXplLAogCQkJCSAgICAgICZ0Z3QtPmxjcV9kbWEsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCmluZGV4IGU0Y2YyM2QuLmI1ZmZkMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkgKiB5aWVsZCBpbnRlZ3JhbCBudW0gb2YgcGFnZSBidWZmZXJzCiAJICovCiAJLyogYWRqdXN0IFNRICovCi0JbnVtX2VsZW1lbnRzX3Blcl9wZyA9IFBBR0VfU0laRSAvIEJOWDJJX1NRX1dRRV9TSVpFOworCW51bV9lbGVtZW50c19wZXJfcGcgPSBDTklDX1BBR0VfU0laRSAvIEJOWDJJX1NRX1dRRV9TSVpFOwogCWlmIChoYmEtPm1heF9zcWVzIDwgbnVtX2VsZW1lbnRzX3Blcl9wZykKIAkJaGJhLT5tYXhfc3FlcyA9IG51bV9lbGVtZW50c19wZXJfcGc7CiAJZWxzZSBpZiAoaGJhLT5tYXhfc3FlcyAlIG51bV9lbGVtZW50c19wZXJfcGcpCkBAIC02OSw3ICs2OSw3IEBACiAJCQkJIH4obnVtX2VsZW1lbnRzX3Blcl9wZyAtIDEpOwogCiAJLyogYWRqdXN0IENRICovCi0JbnVtX2VsZW1lbnRzX3Blcl9wZyA9IFBBR0VfU0laRSAvIEJOWDJJX0NRRV9TSVpFOworCW51bV9lbGVtZW50c19wZXJfcGcgPSBDTklDX1BBR0VfU0laRSAvIEJOWDJJX0NRRV9TSVpFOwogCWlmIChoYmEtPm1heF9jcWVzIDwgbnVtX2VsZW1lbnRzX3Blcl9wZykKIAkJaGJhLT5tYXhfY3FlcyA9IG51bV9lbGVtZW50c19wZXJfcGc7CiAJZWxzZSBpZiAoaGJhLT5tYXhfY3FlcyAlIG51bV9lbGVtZW50c19wZXJfcGcpCkBAIC03Nyw3ICs3Nyw3IEBACiAJCQkJIH4obnVtX2VsZW1lbnRzX3Blcl9wZyAtIDEpOwogCiAJLyogYWRqdXN0IFJRICovCi0JbnVtX2VsZW1lbnRzX3Blcl9wZyA9IFBBR0VfU0laRSAvIEJOWDJJX1JRX1dRRV9TSVpFOworCW51bV9lbGVtZW50c19wZXJfcGcgPSBDTklDX1BBR0VfU0laRSAvIEJOWDJJX1JRX1dRRV9TSVpFOwogCWlmIChoYmEtPm1heF9ycWVzIDwgbnVtX2VsZW1lbnRzX3Blcl9wZykKIAkJaGJhLT5tYXhfcnFlcyA9IG51bV9lbGVtZW50c19wZXJfcGc7CiAJZWxzZSBpZiAoaGJhLT5tYXhfcnFlcyAlIG51bV9lbGVtZW50c19wZXJfcGcpCkBAIC05NTksNyArOTU5LDcgQEAKIAogCS8qIFNRIHBhZ2UgdGFibGUgKi8KIAltZW1zZXQoZXAtPnFwLnNxX3BndGJsX3ZpcnQsIDAsIGVwLT5xcC5zcV9wZ3RibF9zaXplKTsKLQludW1fcGFnZXMgPSBlcC0+cXAuc3FfbWVtX3NpemUgLyBQQUdFX1NJWkU7CisJbnVtX3BhZ2VzID0gZXAtPnFwLnNxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkU7CiAJcGFnZSA9IGVwLT5xcC5zcV9waHlzOwogCiAJaWYgKGNuaWNfZGV2XzEwZykKQEAgLTk3Myw3ICs5NzMsNyBAQAogCQkJcHRibCsrOwogCQkJKnB0YmwgPSAodTMyKSAoKHU2NCkgcGFnZSA+PiAzMik7CiAJCQlwdGJsKys7Ci0JCQlwYWdlICs9IFBBR0VfU0laRTsKKwkJCXBhZ2UgKz0gQ05JQ19QQUdFX1NJWkU7CiAJCX0gZWxzZSB7CiAJCQkvKiBQVEUgaXMgd3JpdHRlbiBpbiBiaWcgZW5kaWFuIGZvcm1hdCBmb3IKIAkJCSAqIDU3MDYvNTcwOC81NzA5IGRldmljZXMgKi8KQEAgLTk4MSwxMyArOTgxLDEzIEBACiAJCQlwdGJsKys7CiAJCQkqcHRibCA9ICh1MzIpIHBhZ2U7CiAJCQlwdGJsKys7Ci0JCQlwYWdlICs9IFBBR0VfU0laRTsKKwkJCXBhZ2UgKz0gQ05JQ19QQUdFX1NJWkU7CiAJCX0KIAl9CiAKIAkvKiBSUSBwYWdlIHRhYmxlICovCiAJbWVtc2V0KGVwLT5xcC5ycV9wZ3RibF92aXJ0LCAwLCBlcC0+cXAucnFfcGd0Ymxfc2l6ZSk7Ci0JbnVtX3BhZ2VzID0gZXAtPnFwLnJxX21lbV9zaXplIC8gUEFHRV9TSVpFOworCW51bV9wYWdlcyA9IGVwLT5xcC5ycV9tZW1fc2l6ZSAvIENOSUNfUEFHRV9TSVpFOwogCXBhZ2UgPSBlcC0+cXAucnFfcGh5czsKIAogCWlmIChjbmljX2Rldl8xMGcpCkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogCQkJcHRibCsrOwogCQkJKnB0YmwgPSAodTMyKSAoKHU2NCkgcGFnZSA+PiAzMik7CiAJCQlwdGJsKys7Ci0JCQlwYWdlICs9IFBBR0VfU0laRTsKKwkJCXBhZ2UgKz0gQ05JQ19QQUdFX1NJWkU7CiAJCX0gZWxzZSB7CiAJCQkvKiBQVEUgaXMgd3JpdHRlbiBpbiBiaWcgZW5kaWFuIGZvcm1hdCBmb3IKIAkJCSAqIDU3MDYvNTcwOC81NzA5IGRldmljZXMgKi8KQEAgLTEwMDksMTMgKzEwMDksMTMgQEAKIAkJCXB0YmwrKzsKIAkJCSpwdGJsID0gKHUzMikgcGFnZTsKIAkJCXB0YmwrKzsKLQkJCXBhZ2UgKz0gUEFHRV9TSVpFOworCQkJcGFnZSArPSBDTklDX1BBR0VfU0laRTsKIAkJfQogCX0KIAogCS8qIENRIHBhZ2UgdGFibGUgKi8KIAltZW1zZXQoZXAtPnFwLmNxX3BndGJsX3ZpcnQsIDAsIGVwLT5xcC5jcV9wZ3RibF9zaXplKTsKLQludW1fcGFnZXMgPSBlcC0+cXAuY3FfbWVtX3NpemUgLyBQQUdFX1NJWkU7CisJbnVtX3BhZ2VzID0gZXAtPnFwLmNxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkU7CiAJcGFnZSA9IGVwLT5xcC5jcV9waHlzOwogCiAJaWYgKGNuaWNfZGV2XzEwZykKQEAgLTEwMjksNyArMTAyOSw3IEBACiAJCQlwdGJsKys7CiAJCQkqcHRibCA9ICh1MzIpICgodTY0KSBwYWdlID4+IDMyKTsKIAkJCXB0YmwrKzsKLQkJCXBhZ2UgKz0gUEFHRV9TSVpFOworCQkJcGFnZSArPSBDTklDX1BBR0VfU0laRTsKIAkJfSBlbHNlIHsKIAkJCS8qIFBURSBpcyB3cml0dGVuIGluIGJpZyBlbmRpYW4gZm9ybWF0IGZvcgogCQkJICogNTcwNi81NzA4LzU3MDkgZGV2aWNlcyAqLwpAQCAtMTAzNyw3ICsxMDM3LDcgQEAKIAkJCXB0YmwrKzsKIAkJCSpwdGJsID0gKHUzMikgcGFnZTsKIAkJCXB0YmwrKzsKLQkJCXBhZ2UgKz0gUEFHRV9TSVpFOworCQkJcGFnZSArPSBDTklDX1BBR0VfU0laRTsKIAkJfQogCX0KIH0KQEAgLTEwNjQsMTEgKzEwNjQsMTEgQEAKIAkvKiBBbGxvY2F0ZSBwYWdlIHRhYmxlIG1lbW9yeSBmb3IgU1Egd2hpY2ggaXMgcGFnZSBhbGlnbmVkICovCiAJZXAtPnFwLnNxX21lbV9zaXplID0gaGJhLT5tYXhfc3FlcyAqIEJOWDJJX1NRX1dRRV9TSVpFOwogCWVwLT5xcC5zcV9tZW1fc2l6ZSA9Ci0JCShlcC0+cXAuc3FfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCQkoZXAtPnFwLnNxX21lbV9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYgQ05JQ19QQUdFX01BU0s7CiAJZXAtPnFwLnNxX3BndGJsX3NpemUgPQotCQkoZXAtPnFwLnNxX21lbV9zaXplIC8gUEFHRV9TSVpFKSAqIHNpemVvZih2b2lkICopOworCQkoZXAtPnFwLnNxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CiAJZXAtPnFwLnNxX3BndGJsX3NpemUgPQotCQkoZXAtPnFwLnNxX3BndGJsX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCQkoZXAtPnFwLnNxX3BndGJsX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJiBDTklDX1BBR0VfTUFTSzsKIAogCWVwLT5xcC5zcV9wZ3RibF92aXJ0ID0KIAkJZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBlcC0+cXAuc3FfcGd0Ymxfc2l6ZSwKQEAgLTExMDEsMTEgKzExMDEsMTEgQEAKIAkvKiBBbGxvY2F0ZSBwYWdlIHRhYmxlIG1lbW9yeSBmb3IgQ1Egd2hpY2ggaXMgcGFnZSBhbGlnbmVkICovCiAJZXAtPnFwLmNxX21lbV9zaXplID0gaGJhLT5tYXhfY3FlcyAqIEJOWDJJX0NRRV9TSVpFOwogCWVwLT5xcC5jcV9tZW1fc2l6ZSA9Ci0JCShlcC0+cXAuY3FfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCQkoZXAtPnFwLmNxX21lbV9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYgQ05JQ19QQUdFX01BU0s7CiAJZXAtPnFwLmNxX3BndGJsX3NpemUgPQotCQkoZXAtPnFwLmNxX21lbV9zaXplIC8gUEFHRV9TSVpFKSAqIHNpemVvZih2b2lkICopOworCQkoZXAtPnFwLmNxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CiAJZXAtPnFwLmNxX3BndGJsX3NpemUgPQotCQkoZXAtPnFwLmNxX3BndGJsX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCQkoZXAtPnFwLmNxX3BndGJsX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJiBDTklDX1BBR0VfTUFTSzsKIAogCWVwLT5xcC5jcV9wZ3RibF92aXJ0ID0KIAkJZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBlcC0+cXAuY3FfcGd0Ymxfc2l6ZSwKQEAgLTExNDQsMTEgKzExNDQsMTEgQEAKIAkvKiBBbGxvY2F0ZSBwYWdlIHRhYmxlIG1lbW9yeSBmb3IgUlEgd2hpY2ggaXMgcGFnZSBhbGlnbmVkICovCiAJZXAtPnFwLnJxX21lbV9zaXplID0gaGJhLT5tYXhfcnFlcyAqIEJOWDJJX1JRX1dRRV9TSVpFOwogCWVwLT5xcC5ycV9tZW1fc2l6ZSA9Ci0JCShlcC0+cXAucnFfbWVtX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCQkoZXAtPnFwLnJxX21lbV9zaXplICsgKENOSUNfUEFHRV9TSVpFIC0gMSkpICYgQ05JQ19QQUdFX01BU0s7CiAJZXAtPnFwLnJxX3BndGJsX3NpemUgPQotCQkoZXAtPnFwLnJxX21lbV9zaXplIC8gUEFHRV9TSVpFKSAqIHNpemVvZih2b2lkICopOworCQkoZXAtPnFwLnJxX21lbV9zaXplIC8gQ05JQ19QQUdFX1NJWkUpICogc2l6ZW9mKHZvaWQgKik7CiAJZXAtPnFwLnJxX3BndGJsX3NpemUgPQotCQkoZXAtPnFwLnJxX3BndGJsX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgUEFHRV9NQVNLOworCQkoZXAtPnFwLnJxX3BndGJsX3NpemUgKyAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgJiBDTklDX1BBR0VfTUFTSzsKIAogCWVwLT5xcC5ycV9wZ3RibF92aXJ0ID0KIAkJZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBlcC0+cXAucnFfcGd0Ymxfc2l6ZSwKQEAgLTEyNzAsNyArMTI3MCw3IEBACiAJYm54MmlfYWRqdXN0X3FwX3NpemUoaGJhKTsKIAogCWlzY3NpX2luaXQuZmxhZ3MgPQotCQlJU0NTSV9QQUdFX1NJWkVfNEsgPDwgSVNDU0lfS1dRRV9JTklUMV9QQUdFX1NJWkVfU0hJRlQ7CisJCShDTklDX1BBR0VfQklUUyAtIDgpIDw8IElTQ1NJX0tXUUVfSU5JVDFfUEFHRV9TSVpFX1NISUZUOwogCWlmIChlbl90Y3BfZGFjaykKIAkJaXNjc2lfaW5pdC5mbGFncyB8PSBJU0NTSV9LV1FFX0lOSVQxX0RFTEFZRURfQUNLX0VOQUJMRTsKIAlpc2NzaV9pbml0LnJlc2VydmVkMCA9IDA7CkBAIC0xMjg4LDE1ICsxMjg4LDE1IEBACiAJCQkoKGhiYS0+bnVtX2NjZWxsICYgMHhGRkZGKSB8IChoYmEtPm1heF9zcWVzIDw8IDE2KSk7CiAJaXNjc2lfaW5pdC5udW1fY2NlbGxzX3Blcl9jb25uID0gaGJhLT5udW1fY2NlbGw7CiAJaXNjc2lfaW5pdC5udW1fdGFza3NfcGVyX2Nvbm4gPSBoYmEtPm1heF9zcWVzOwotCWlzY3NpX2luaXQuc3Ffd3Flc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIEJOWDJJX1NRX1dRRV9TSVpFOworCWlzY3NpX2luaXQuc3Ffd3Flc19wZXJfcGFnZSA9IENOSUNfUEFHRV9TSVpFIC8gQk5YMklfU1FfV1FFX1NJWkU7CiAJaXNjc2lfaW5pdC5zcV9udW1fd3FlcyA9IGhiYS0+bWF4X3NxZXM7CiAJaXNjc2lfaW5pdC5jcV9sb2dfd3Flc19wZXJfcGFnZSA9Ci0JCSh1OCkgYm54MmlfcG93ZXJfb2YyKFBBR0VfU0laRSAvIEJOWDJJX0NRRV9TSVpFKTsKKwkJKHU4KSBibngyaV9wb3dlcl9vZjIoQ05JQ19QQUdFX1NJWkUgLyBCTlgySV9DUUVfU0laRSk7CiAJaXNjc2lfaW5pdC5jcV9udW1fd3FlcyA9IGhiYS0+bWF4X2NxZXM7CiAJaXNjc2lfaW5pdC5jcV9udW1fcGFnZXMgPSAoaGJhLT5tYXhfY3FlcyAqIEJOWDJJX0NRRV9TSVpFICsKLQkJCQkgICAoUEFHRV9TSVpFIC0gMSkpIC8gUEFHRV9TSVpFOworCQkJCSAgIChDTklDX1BBR0VfU0laRSAtIDEpKSAvIENOSUNfUEFHRV9TSVpFOwogCWlzY3NpX2luaXQuc3FfbnVtX3BhZ2VzID0gKGhiYS0+bWF4X3NxZXMgKiBCTlgySV9TUV9XUUVfU0laRSArCi0JCQkJICAgKFBBR0VfU0laRSAtIDEpKSAvIFBBR0VfU0laRTsKKwkJCQkgICAoQ05JQ19QQUdFX1NJWkUgLSAxKSkgLyBDTklDX1BBR0VfU0laRTsKIAlpc2NzaV9pbml0LnJxX2J1ZmZlcl9zaXplID0gQk5YMklfUlFfV1FFX1NJWkU7CiAJaXNjc2lfaW5pdC5ycV9udW1fd3FlcyA9IGhiYS0+bWF4X3JxZXM7CiAKQEAgLTEzNjEsNyArMTM2MSw3IEBACiAJdTMyIGRhdGFsZW4gPSAwOwogCiAJcmVzcF9jcWUgPSAoc3RydWN0IGJueDJpX2NtZF9yZXNwb25zZSAqKWNxZTsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwKIAkJCQkgcmVzcF9jcWUtPml0dCAmIElTQ1NJX0NNRF9SRVNQT05TRV9JTkRFWCk7CiAJaWYgKCF0YXNrKQpAQCAtMTQzMiw3ICsxNDMyLDcgQEAKIAlfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKWhkciwKIAkJCSAgICAgY29ubi0+ZGF0YSwgZGF0YWxlbik7CiBmYWlsOgotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ1Nyw3ICsxNDU3LDcgQEAKIAlpbnQgcGFkX2xlbjsKIAogCWxvZ2luID0gKHN0cnVjdCBibngyaV9sb2dpbl9yZXNwb25zZSAqKSBjcWU7Ci0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCiAJCQkJIGxvZ2luLT5pdHQgJiBJU0NTSV9MT0dJTl9SRVNQT05TRV9JTkRFWCk7CiAJaWYgKCF0YXNrKQpAQCAtMTUwMCw3ICsxNTAwLDcgQEAKIAkJYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2J1ZiwKIAkJYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX3dyX3B0ciAtIGJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9idWYpOwogZG9uZToKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1MjUsNyArMTUyNSw3IEBACiAJaW50IHBhZF9sZW47CiAKIAl0ZXh0ID0gKHN0cnVjdCBibngyaV90ZXh0X3Jlc3BvbnNlICopIGNxZTsKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soY29ubiwgdGV4dC0+aXR0ICYgSVNDU0lfTE9HSU5fUkVTUE9OU0VfSU5ERVgpOwogCWlmICghdGFzaykKIAkJZ290byBkb25lOwpAQCAtMTU2MSw3ICsxNTYxLDcgQEAKIAkJCSAgICAgYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX3dyX3B0ciAtCiAJCQkgICAgIGJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9idWYpOwogZG9uZToKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1ODQsNyArMTU4NCw3IEBACiAJc3RydWN0IGlzY3NpX3RtX3JzcCAqcmVzcF9oZHI7CiAKIAl0bWZfY3FlID0gKHN0cnVjdCBibngyaV90bWZfcmVzcG9uc2UgKiljcWU7Ci0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCiAJCQkJIHRtZl9jcWUtPml0dCAmIElTQ1NJX1RNRl9SRVNQT05TRV9JTkRFWCk7CiAJaWYgKCF0YXNrKQpAQCAtMTYwMCw3ICsxNjAwLDcgQEAKIAogCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopcmVzcF9oZHIsIE5VTEwsIDApOwogZG9uZToKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MjMsNyArMTYyMyw3IEBACiAJc3RydWN0IGlzY3NpX2xvZ291dF9yc3AgKnJlc3BfaGRyOwogCiAJbG9nb3V0ID0gKHN0cnVjdCBibngyaV9sb2dvdXRfcmVzcG9uc2UgKikgY3FlOwotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLAogCQkJCSBsb2dvdXQtPml0dCAmIElTQ1NJX0xPR09VVF9SRVNQT05TRV9JTkRFWCk7CiAJaWYgKCF0YXNrKQpAQCAtMTY0Nyw3ICsxNjQ3LDcgQEAKIAogCWJueDJpX2Nvbm4tPmVwLT5zdGF0ZSA9IEVQX1NUQVRFX0xPR09VVF9SRVNQX1JDVkQ7CiBkb25lOgotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY2OCwxMiArMTY2OCwxMiBAQAogCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOwogCiAJbm9wX2luID0gKHN0cnVjdCBibngyaV9ub3BfaW5fbXNnICopY3FlOwotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLAogCQkJCSBub3BfaW4tPml0dCAmIElTQ1NJX05PUF9JTl9NU0dfSU5ERVgpOwogCWlmICh0YXNrKQogCQlfX2lzY3NpX3B1dF90YXNrKHRhc2spOwotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIH0KIAogLyoqCkBAIC0xNzEyLDcgKzE3MTIsNyBAQAogCiAJbm9wX2luID0gKHN0cnVjdCBibngyaV9ub3BfaW5fbXNnICopY3FlOwogCi0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJaGRyID0gKHN0cnVjdCBpc2NzaV9ub3BpbiAqKSZibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfaGRyOwogCW1lbXNldChoZHIsIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSk7CiAJaGRyLT5vcGNvZGUgPSBub3BfaW4tPm9wX2NvZGU7CkBAIC0xNzM4LDcgKzE3MzgsNyBAQAogCX0KIGRvbmU6CiAJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKiloZHIsIE5VTEwsIDApOwotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAogCXJldHVybiB0Z3RfYXN5bmNfbm9wOwogfQpAQCAtMTc3MSw3ICsxNzcxLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXJlc3BfaGRyID0gKHN0cnVjdCBpc2NzaV9hc3luYyAqKSAmYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2hkcjsKIAltZW1zZXQocmVzcF9oZHIsIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSk7CiAJcmVzcF9oZHItPm9wY29kZSA9IGFzeW5jX2NxZS0+b3BfY29kZTsKQEAgLTE3OTAsNyArMTc5MCw3IEBACiAKIAlfX2lzY3NpX2NvbXBsZXRlX3BkdShibngyaV9jb25uLT5jbHNfY29ubi0+ZGRfZGF0YSwKIAkJCSAgICAgKHN0cnVjdCBpc2NzaV9oZHIgKilyZXNwX2hkciwgTlVMTCwgMCk7Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogfQogCiAKQEAgLTE4MTcsNyArMTgxNyw3IEBACiAJfSBlbHNlCiAJCWJueDJpX3Vuc29sX3BkdV9hZGp1c3RfcnEoYm54MmlfY29ubik7CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAloZHIgPSAoc3RydWN0IGlzY3NpX3JlamVjdCAqKSAmYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2hkcjsKIAltZW1zZXQoaGRyLCAwLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwogCWhkci0+b3Bjb2RlID0gcmVqZWN0LT5vcF9jb2RlOwpAQCAtMTgyOCw3ICsxODI4LDcgQEAKIAloZHItPmZmZmZmZmZmID0gY3B1X3RvX2JlMzIoUkVTRVJWRURfSVRUKTsKIAlfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKWhkciwgY29ubi0+ZGF0YSwKIAkJCSAgICAgcmVqZWN0LT5kYXRhX2xlbmd0aCk7Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogfQogCiAvKioKQEAgLTE4NDgsMTMgKzE4NDgsMTMgQEAKIAlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKIAogCWNtZF9jbGVhbl9yc3AgPSAoc3RydWN0IGJueDJpX2NsZWFudXBfcmVzcG9uc2UgKiljcWU7Ci0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCiAJCQljbWRfY2xlYW5fcnNwLT5pdHQgJiBJU0NTSV9DTEVBTlVQX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2spCiAJCXByaW50ayhLRVJOX0FMRVJUICJibngyaTogY21kIGNsZWFuIElUVCAleCBub3QgYWN0aXZlXG4iLAogCQkJY21kX2NsZWFuX3JzcC0+aXR0ICYgSVNDU0lfQ0xFQU5VUF9SRVNQT05TRV9JTkRFWCk7Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCWNvbXBsZXRlKCZibngyaV9jb25uLT5jbWRfY2xlYW51cF9jbXBsKTsKIH0KIApAQCAtMTkyMSwxMSArMTkyMSwxMSBAQAogCWludCByYyA9IDA7CiAJaW50IGNwdTsKIAotCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhibngyaV9jb25uLT5jbHNfY29ubi0+ZGRfZGF0YSwKIAkJCQkgY3FlLT5pdHQgJiBJU0NTSV9DTURfUkVTUE9OU0VfSU5ERVgpOwogCWlmICghdGFzayB8fCAhdGFzay0+c2MpIHsKLQkJc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNjID0gdGFzay0+c2M7CkBAIC0xOTM1LDcgKzE5MzUsNyBAQAogCWVsc2UKIAkJY3B1ID0gc2MtPnJlcXVlc3QtPmNwdTsKIAotCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAogCXAgPSAmcGVyX2NwdShibngyaV9wZXJjcHUsIGNwdSk7CiAJc3Bpbl9sb2NrKCZwLT5wX3dvcmtfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCmluZGV4IDg1NGRhZDcuLjE2NjU0M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCkBAIC01MjUsNyArNTI1LDcgQEAKIAlzdHJ1Y3QgaXNjc2lfYmQgKm1wX2JkdDsKIAl1NjQgYWRkcjsKIAotCWhiYS0+bXBfYmRfdGJsID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJaGJhLT5tcF9iZF90YmwgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJCQkgICAgJmhiYS0+bXBfYmRfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhiYS0+bXBfYmRfdGJsKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGFsbG9jYXRlIE1pZGRsZSBQYXRoIEJEVFxuIik7CkBAIC01MzMsMTEgKzUzMywxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQloYmEtPmR1bW15X2J1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCWhiYS0+ZHVtbXlfYnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LAorCQkJCQkgICAgICAgQ05JQ19QQUdFX1NJWkUsCiAJCQkJCSAgICAgICAmaGJhLT5kdW1teV9idWZfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhiYS0+ZHVtbXlfYnVmZmVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGFsbG9jIE1pZGRsZSBQYXRoIER1bW15IEJ1ZmZlclxuIik7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkgIGhiYS0+bXBfYmRfdGJsLCBoYmEtPm1wX2JkX2RtYSk7CiAJCWhiYS0+bXBfYmRfdGJsID0gTlVMTDsKIAkJcmMgPSAtMTsKQEAgLTU0OCw3ICs1NDksNyBAQAogCWFkZHIgPSAodW5zaWduZWQgbG9uZykgaGJhLT5kdW1teV9idWZfZG1hOwogCW1wX2JkdC0+YnVmZmVyX2FkZHJfbG8gPSBhZGRyICYgMHhmZmZmZmZmZjsKIAltcF9iZHQtPmJ1ZmZlcl9hZGRyX2hpID0gYWRkciA+PiAzMjsKLQltcF9iZHQtPmJ1ZmZlcl9sZW5ndGggPSBQQUdFX1NJWkU7CisJbXBfYmR0LT5idWZmZXJfbGVuZ3RoID0gQ05JQ19QQUdFX1NJWkU7CiAJbXBfYmR0LT5mbGFncyA9IElTQ1NJX0JEX0xBU1RfSU5fQkRfQ0hBSU4gfAogCQkJSVNDU0lfQkRfRklSU1RfSU5fQkRfQ0hBSU47CiBvdXQ6CkBAIC01NjUsMTIgKzU2NiwxMiBAQAogc3RhdGljIHZvaWQgYm54MmlfZnJlZV9tcF9iZHQoc3RydWN0IGJueDJpX2hiYSAqaGJhKQogewogCWlmIChoYmEtPm1wX2JkX3RibCkgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJICBoYmEtPm1wX2JkX3RibCwgaGJhLT5tcF9iZF9kbWEpOwogCQloYmEtPm1wX2JkX3RibCA9IE5VTEw7CiAJfQogCWlmIChoYmEtPmR1bW15X2J1ZmZlcikgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJICBoYmEtPmR1bW15X2J1ZmZlciwgaGJhLT5kdW1teV9idWZfZG1hKTsKIAkJaGJhLT5kdW1teV9idWZmZXIgPSBOVUxMOwogCX0KQEAgLTkzNCwxNCArOTM1LDE0IEBACiAJCQkJCSAgICBzdHJ1Y3QgYm54MmlfY29ubiAqYm54MmlfY29ubikKIHsKIAlpZiAoYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2JkX3RibCkgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgQ05JQ19QQUdFX1NJWkUsCiAJCQkJICBibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYmRfdGJsLAogCQkJCSAgYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2JkX2RtYSk7CiAJCWJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9iZF90YmwgPSBOVUxMOwogCX0KIAogCWlmIChibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF90YmwpIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJCSAgYm54MmlfY29ubi0+Z2VuX3BkdS5yZXFfYmRfdGJsLAogCQkJCSAgYm54MmlfY29ubi0+Z2VuX3BkdS5yZXFfYmRfZG1hKTsKIAkJYm54MmlfY29ubi0+Z2VuX3BkdS5yZXFfYmRfdGJsID0gTlVMTDsKQEAgLTk5OCwxMyArOTk5LDEzIEBACiAJYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX3dyX3B0ciA9IGJueDJpX2Nvbm4tPmdlbl9wZHUucmVzcF9idWY7CiAKIAlibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF90YmwgPQotCQlkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBDTklDX1BBR0VfU0laRSwKIAkJCQkgICAmYm54MmlfY29ubi0+Z2VuX3BkdS5yZXFfYmRfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoYm54MmlfY29ubi0+Z2VuX3BkdS5yZXFfYmRfdGJsID09IE5VTEwpCiAJCWdvdG8gbG9naW5fcmVxX2JkX3RibF9mYWlsdXJlOwogCiAJYm54MmlfY29ubi0+Z2VuX3BkdS5yZXNwX2JkX3RibCA9Ci0JCWRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQlkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJCSAgICZibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYmRfZG1hLAogCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmIChibngyaV9jb25uLT5nZW5fcGR1LnJlc3BfYmRfdGJsID09IE5VTEwpCkBAIC0xMDEzLDcgKzEwMTQsNyBAQAogCXJldHVybiAwOwogCiBsb2dpbl9yZXNwX2JkX3RibF9mYWlsdXJlOgotCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCisJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIENOSUNfUEFHRV9TSVpFLAogCQkJICBibngyaV9jb25uLT5nZW5fcGR1LnJlcV9iZF90YmwsCiAJCQkgIGJueDJpX2Nvbm4tPmdlbl9wZHUucmVxX2JkX2RtYSk7CiAJYm54MmlfY29ubi0+Z2VuX3BkdS5yZXFfYmRfdGJsID0gTlVMTDsKQEAgLTExNjksMTAgKzExNzAsMTAgQEAKIAlpZiAodGFzay0+c3RhdGUgPT0gSVNDU0lfVEFTS19BQlJUX1RNRikgewogCQlibngyaV9zZW5kX2NtZF9jbGVhbnVwX3JlcShoYmEsIHRhc2stPmRkX2RhdGEpOwogCi0JCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYm54MmlfY29ubi0+Y21kX2NsZWFudXBfY21wbCwKIAkJCQltc2Vjc190b19qaWZmaWVzKElTQ1NJX0NNRF9DTEVBTlVQX1RJTUVPVVQpKTsKLQkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCX0KIAlibngyaV9pc2NzaV91bm1hcF9zZ19saXN0KHRhc2stPmRkX2RhdGEpOwogfQpAQCAtMjA1OSw3ICsyMDYwLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoc2Vzc2lvbikgewotCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlmIChibngyaV9lcC0+c3RhdGUgIT0gRVBfU1RBVEVfVENQX0ZJTl9SQ1ZEKSB7CiAJCQlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfTE9HR0lOR19PVVQpIHsKIAkJCQlpZiAoYm54MmlfZXAtPnN0YXRlID09IEVQX1NUQVRFX0xPR09VVF9TRU5UKSB7CkBAIC0yMDc1LDcgKzIwNzYsNyBAQAogCQl9IGVsc2UKIAkJCWNsb3NlID0gMTsKIAotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCX0KIAogCWJueDJpX2VwLT5zdGF0ZSA9IEVQX1NUQVRFX0RJU0NPTk5fU1RBUlQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwppbmRleCA1YTlmODQyLi5lOGVlNWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKQEAgLTE3NSw1MiArMTc1LDYgQEAKIAkJCXNpemVvZihzdHJ1Y3QgZndfb2ZsZF90eF9kYXRhX3dyKSk7CiB9CiAKLQotI2RlZmluZSBWTEFOX05PTkUgMHhmZmYKLSNkZWZpbmUgRklMVEVSX1NFTF9WTEFOX05PTkUgMHhmZmZmCi0jZGVmaW5lIEZJTFRFUl9TRUxfV0lEVEhfUF9GQyAoMysxKSAvKiBwb3J0IHVzZXMgMyBiaXRzLCBGQ29FIG9uZSBiaXQgKi8KLSNkZWZpbmUgRklMVEVSX1NFTF9XSURUSF9WSU5fUF9GQyBcCi0JKDYgKyA3ICsgRklMVEVSX1NFTF9XSURUSF9QX0ZDKSAvKiA2IGJpdHMgYXJlIHVudXNlZCwgVkYgdXNlcyA3IGJpdHMqLwotI2RlZmluZSBGSUxURVJfU0VMX1dJRFRIX1RBR19QX0ZDIFwKLQkoMyArIEZJTFRFUl9TRUxfV0lEVEhfVklOX1BfRkMpIC8qIFBGIHVzZXMgMyBiaXRzICovCi0jZGVmaW5lIEZJTFRFUl9TRUxfV0lEVEhfVkxEX1RBR19QX0ZDICgxICsgRklMVEVSX1NFTF9XSURUSF9UQUdfUF9GQykKLQotc3RhdGljIHVuc2lnbmVkIGludCBzZWxlY3RfbnR1cGxlKHN0cnVjdCBjeGdiaV9kZXZpY2UgKmNkZXYsCi0JCQkJc3RydWN0IGwydF9lbnRyeSAqbDJ0KQotewotCXN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkaSA9IGN4Z2JpX2NkZXZfcHJpdihjZGV2KTsKLQl1bnNpZ25lZCBpbnQgbnR1cGxlID0gMDsKLQl1MzIgdmlpZDsKLQotCXN3aXRjaCAobGxkaS0+ZmlsdF9tb2RlKSB7Ci0KLQkvKiBkZWZhdWx0IGZpbHRlciBtb2RlICovCi0JY2FzZSBIV19UUExfRlJfTVRfUFJfSVZfUF9GQzoKLQkJaWYgKGwydC0+dmxhbiA9PSBWTEFOX05PTkUpCi0JCQludHVwbGUgfD0gRklMVEVSX1NFTF9WTEFOX05PTkUgPDwgRklMVEVSX1NFTF9XSURUSF9QX0ZDOwotCQllbHNlIHsKLQkJCW50dXBsZSB8PSBsMnQtPnZsYW4gPDwgRklMVEVSX1NFTF9XSURUSF9QX0ZDOwotCQkJbnR1cGxlIHw9IDEgPDwgRklMVEVSX1NFTF9XSURUSF9WTERfVEFHX1BfRkM7Ci0JCX0KLQkJbnR1cGxlIHw9IGwydC0+bHBvcnQgPDwgU19QT1JUIHwgSVBQUk9UT19UQ1AgPDwKLQkJCSAgRklMVEVSX1NFTF9XSURUSF9WTERfVEFHX1BfRkM7Ci0JCWJyZWFrOwotCWNhc2UgSFdfVFBMX0ZSX01UX1BSX09WX1BfRkM6IHsKLQkJdmlpZCA9IGN4Z2I0X3BvcnRfdmlpZChsMnQtPm5laWdoLT5kZXYpOwotCi0JCW50dXBsZSB8PSBGV19WSUlEX1ZJTl9HRVQodmlpZCkgPDwgRklMVEVSX1NFTF9XSURUSF9QX0ZDOwotCQludHVwbGUgfD0gRldfVklJRF9QRk5fR0VUKHZpaWQpIDw8IEZJTFRFUl9TRUxfV0lEVEhfVklOX1BfRkM7Ci0JCW50dXBsZSB8PSBGV19WSUlEX1ZJVkxEX0dFVCh2aWlkKSA8PCBGSUxURVJfU0VMX1dJRFRIX1RBR19QX0ZDOwotCQludHVwbGUgfD0gbDJ0LT5scG9ydCA8PCBTX1BPUlQgfCBJUFBST1RPX1RDUCA8PAotCQkJICBGSUxURVJfU0VMX1dJRFRIX1ZMRF9UQUdfUF9GQzsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbnR1cGxlOwotfQotCiBzdGF0aWMgdm9pZCBzZW5kX2FjdF9vcGVuX3JlcShzdHJ1Y3QgY3hnYmlfc29jayAqY3NrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCXN0cnVjdCBsMnRfZW50cnkgKmUpCiB7CkBAIC0yNDgsOCArMjAyLDYgQEAKIAkJc3RydWN0IGNwbF9hY3Rfb3Blbl9yZXEgKnJlcSA9CiAJCQkJKHN0cnVjdCBjcGxfYWN0X29wZW5fcmVxICopc2tiLT5oZWFkOwogCi0JCXJlcSA9IChzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqKXNrYi0+aGVhZDsKLQogCQlJTklUX1RQX1dSKHJlcSwgMCk7CiAJCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX0FDVF9PUEVOX1JFUSwKIAkJCQkJcWlkX2F0aWQpKTsKQEAgLTI1OCw3ICsyMTAsOSBAQAogCQlyZXEtPmxvY2FsX2lwID0gY3NrLT5zYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJCXJlcS0+cGVlcl9pcCA9IGNzay0+ZGFkZHIuc2luX2FkZHIuc19hZGRyOwogCQlyZXEtPm9wdDAgPSBjcHVfdG9fYmU2NChvcHQwKTsKLQkJcmVxLT5wYXJhbXMgPSBjcHVfdG9fYmUzMihzZWxlY3RfbnR1cGxlKGNzay0+Y2RldiwgY3NrLT5sMnQpKTsKKwkJcmVxLT5wYXJhbXMgPSBjcHVfdG9fYmUzMihjeGdiNF9zZWxlY3RfbnR1cGxlKAorCQkJCQljc2stPmNkZXYtPnBvcnRzW2Nzay0+cG9ydF9pZF0sCisJCQkJCWNzay0+bDJ0KSk7CiAJCW9wdDIgfD0gMSA8PCAyMjsKIAkJcmVxLT5vcHQyID0gY3B1X3RvX2JlMzIob3B0Mik7CiAKQEAgLTI3MSw4ICsyMjUsNiBAQAogCQlzdHJ1Y3QgY3BsX3Q1X2FjdF9vcGVuX3JlcSAqcmVxID0KIAkJCQkoc3RydWN0IGNwbF90NV9hY3Rfb3Blbl9yZXEgKilza2ItPmhlYWQ7CiAKLQkJcmVxID0gKHN0cnVjdCBjcGxfdDVfYWN0X29wZW5fcmVxICopc2tiLT5oZWFkOwotCiAJCUlOSVRfVFBfV1IocmVxLCAwKTsKIAkJT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUNUX09QRU5fUkVRLAogCQkJCQlxaWRfYXRpZCkpOwpAQCAtMjgxLDcgKzIzMywxMCBAQAogCQlyZXEtPmxvY2FsX2lwID0gY3NrLT5zYWRkci5zaW5fYWRkci5zX2FkZHI7CiAJCXJlcS0+cGVlcl9pcCA9IGNzay0+ZGFkZHIuc2luX2FkZHIuc19hZGRyOwogCQlyZXEtPm9wdDAgPSBjcHVfdG9fYmU2NChvcHQwKTsKLQkJcmVxLT5wYXJhbXMgPSBjcHVfdG9fYmUzMihzZWxlY3RfbnR1cGxlKGNzay0+Y2RldiwgY3NrLT5sMnQpKTsKKwkJcmVxLT5wYXJhbXMgPSBjcHVfdG9fYmU2NChWX0ZJTFRFUl9UVVBMRSgKKwkJCQljeGdiNF9zZWxlY3RfbnR1cGxlKAorCQkJCQljc2stPmNkZXYtPnBvcnRzW2Nzay0+cG9ydF9pZF0sCisJCQkJCWNzay0+bDJ0KSkpOwogCQlvcHQyIHw9IDEgPDwgMzE7CiAJCXJlcS0+b3B0MiA9IGNwdV90b19iZTMyKG9wdDIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHRjLmMgYi9kcml2ZXJzL3Njc2kvZHRjLmMKaW5kZXggZDAxZjAxNi4uZWIyOWZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2R0Yy5jCisrKyBiL2RyaXZlcnMvc2NzaS9kdGMuYwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJCS8qIFdpdGggaW50ZXJydXB0cyBlbmFibGVkLCBpdCB3aWxsIHNvbWV0aW1lcyBoYW5nIHdoZW4gZG9pbmcgaGVhdnkKIAkJICogcmVhZHMuIFNvIGJldHRlciBub3QgZW5hYmxlIHRoZW0gdW50aWwgSSBmaW5nZXIgaXQgb3V0LiAqLwogCQlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQotCQkJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIGR0Y19pbnRyLCBJUlFGX0RJU0FCTEVELAorCQkJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIGR0Y19pbnRyLCAwLAogCQkJCQkiZHRjIiwgaW5zdGFuY2UpKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOwogCQkJCWluc3RhbmNlLT5pcnEgPSBTQ1NJX0lSUV9OT05FOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VhdGEuYyBiL2RyaXZlcnMvc2NzaS9lYXRhLmMKaW5kZXggOTRkZTg4OS4uZWJmNTczNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VhdGEuYworKysgYi9kcml2ZXJzL3Njc2kvZWF0YS5jCkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogCiAJLyogQm9hcmQgZGV0ZWN0ZWQsIGFsbG9jYXRlIGl0cyBJUlEgKi8KIAlpZiAocmVxdWVzdF9pcnEoaXJxLCBkb19pbnRlcnJ1cHRfaGFuZGxlciwKLQkJCUlSUUZfRElTQUJMRUQgfCAoKHN1YnZlcnNpb24gPT0gRVNBKSA/IElSUUZfU0hBUkVEIDogMCksCisJCQkoc3VidmVyc2lvbiA9PSBFU0EpID8gSVJRRl9TSEFSRUQgOiAwLAogCQkJZHJpdmVyX25hbWUsICh2b2lkICopJnNoYVtqXSkpIHsKIAkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAldSwgZGV0YWNoaW5nLlxuIiwgbmFtZSwKIAkJICAgICAgIGlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZWF0YV9waW8uYyBiL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jCmluZGV4IDE2NjMxNzMuLjgzMTlkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jCisrKyBiL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jCkBAIC02ODcsNyArNjg3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIXJlZ19JUlFbZ2MtPklSUV0pIHsJLyogSW50ZXJydXB0IGFscmVhZHkgcmVnaXN0ZXJlZCA/ICovCi0JCWlmICghcmVxdWVzdF9pcnEoZ2MtPklSUSwgZG9fZWF0YV9waW9faW50X2hhbmRsZXIsIElSUUZfRElTQUJMRUQsICJFQVRBLVBJTyIsIHNoKSkgeworCQlpZiAoIXJlcXVlc3RfaXJxKGdjLT5JUlEsIGRvX2VhdGFfcGlvX2ludF9oYW5kbGVyLCAwLCAiRUFUQS1QSU8iLCBzaCkpIHsKIAkJCXJlZ19JUlFbZ2MtPklSUV0rKzsKIAkJCWlmICghZ2MtPklSUV9UUikKIAkJCQlyZWdfSVJRTFtnYy0+SVJRXSA9IDE7CS8qIElSUSBpcyBlZGdlIHRyaWdnZXJlZCAqLwpAQCAtOTIxLDcgKzkyMSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYSVJROyBpKyspCiAJCWlmIChyZWdfSVJRW2ldKQotCQkJcmVxdWVzdF9pcnEoaSwgZG9fZWF0YV9waW9faW50X2hhbmRsZXIsIElSUUZfRElTQUJMRUQsICJFQVRBLVBJTyIsIE5VTEwpOworCQkJcmVxdWVzdF9pcnEoaSwgZG9fZWF0YV9waW9faW50X2hhbmRsZXIsIDAsICJFQVRBLVBJTyIsIE5VTEwpOwogCiAJSEJBX3B0ciA9IGZpcnN0X0hCQTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VzYXMyci9lc2FzMnJfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2VzYXMyci9lc2FzMnJfaW5pdC5jCmluZGV4IGI5NzUwZTIuLjY3NzY5MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9pbml0LmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCiBzdGF0aWMgdm9pZCBlc2FzMnJfY2xhaW1faW50ZXJydXB0cyhzdHJ1Y3QgZXNhczJyX2FkYXB0ZXIgKmEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IElSUUZfRElTQUJMRUQ7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKIAlpZiAoYS0+aW50cl9tb2RlID09IElOVFJfTU9ERV9MRUdBQ1kpCiAJCWZsYWdzIHw9IElSUUZfU0hBUkVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VzYXMyci9lc2FzMnJfbG9nLmMgYi9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9sb2cuYwppbmRleCA5YmYyODVkLi5hODIwMzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9sb2cuYworKysgYi9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9sb2cuYwpAQCAtMTY1LDEzICsxNjUsOSBAQAogCiAJCS8qCiAJCSAqIFB1dCBhIGxpbmUgYnJlYWsgYXQgdGhlIGVuZCBvZiB0aGUgZm9ybWF0dGVkIHN0cmluZyBzbyB0aGF0Ci0JCSAqIHdlIGRvbid0IHdpbmQgdXAgd2l0aCBydW4tb24gbWVzc2FnZXMuICBvbmx5IGFwcGVuZCBpZiB0aGVyZQotCQkgKiBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlci4KKwkJICogd2UgZG9uJ3Qgd2luZCB1cCB3aXRoIHJ1bi1vbiBtZXNzYWdlcy4KIAkJICovCi0JCWlmIChzdHJsZW4oZXZlbnRfYnVmZmVyKSA8IGJ1ZmxlbikKLQkJCXN0cmNhdChidWZmZXIsICJcbiIpOwotCi0JCXByaW50ayhldmVudF9idWZmZXIpOworCQlwcmludGsoIiVzXG4iLCBldmVudF9idWZmZXIpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50X2J1ZmZlcl9sb2NrLCBmbGFncyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5jIGIvZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5jCmluZGV4IDVjZWM2YzYuLjcxNzYzNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9nX05DUjUzODAuYworKysgYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmMKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCiAJCWlmIChpbnN0YW5jZS0+aXJxICE9IFNDU0lfSVJRX05PTkUpCiAJCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgZ2VuZXJpY19OQ1I1MzgwX2ludHIsCi0JCQkJCUlSUUZfRElTQUJMRUQsICJOQ1I1MzgwIiwgaW5zdGFuY2UpKSB7CisJCQkJCTAsICJOQ1I1MzgwIiwgaW5zdGFuY2UpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogSVJRJWQgbm90IGZyZWUsIGludGVycnVwdHMgZGlzYWJsZWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKIAkJCQlpbnN0YW5jZS0+aXJxID0gU0NTSV9JUlFfTk9ORTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nZHRoLmMgYi9kcml2ZXJzL3Njc2kvZ2R0aC5jCmluZGV4IGNlNWVmMDE5MC4uMGYxYWUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2dkdGguYworKysgYi9kcml2ZXJzL3Njc2kvZ2R0aC5jCkBAIC00NzExLDcgKzQ3MTEsNyBAQAogCXByaW50aygiQ29uZmlndXJpbmcgR0RULUlTQSBIQSBhdCBCSU9TIDB4JTA1WCBJUlEgJXUgRFJRICV1XG4iLAogCQlpc2FfYmlvcywgaGEtPmlycSwgaGEtPmRycSk7CiAKLQllcnJvciA9IHJlcXVlc3RfaXJxKGhhLT5pcnEsIGdkdGhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiZ2R0aCIsIGhhKTsKKwllcnJvciA9IHJlcXVlc3RfaXJxKGhhLT5pcnEsIGdkdGhfaW50ZXJydXB0LCAwLCAiZ2R0aCIsIGhhKTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKCJHRFQtSVNBOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKIAkJZ290byBvdXRfaG9zdF9wdXQ7CkBAIC00ODQzLDcgKzQ4NDMsNyBAQAogCXByaW50aygiQ29uZmlndXJpbmcgR0RULUVJU0EgSEEgYXQgU2xvdCAlZCBJUlEgJXVcbiIsCiAJCWVpc2Ffc2xvdCA+PiAxMiwgaGEtPmlycSk7CiAKLQllcnJvciA9IHJlcXVlc3RfaXJxKGhhLT5pcnEsIGdkdGhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiZ2R0aCIsIGhhKTsKKwllcnJvciA9IHJlcXVlc3RfaXJxKGhhLT5pcnEsIGdkdGhfaW50ZXJydXB0LCAwLCAiZ2R0aCIsIGhhKTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKCJHRFQtRUlTQTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7CiAJCWdvdG8gb3V0X2hvc3RfcHV0OwpAQCAtNDk3OSw3ICs0OTc5LDcgQEAKIAkJaGEtPmlycSk7CiAKIAllcnJvciA9IHJlcXVlc3RfaXJxKGhhLT5pcnEsIGdkdGhfaW50ZXJydXB0LAotCQkJCUlSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJnZHRoIiwgaGEpOworCQkJCUlSUUZfU0hBUkVELCAiZ2R0aCIsIGhhKTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKCJHRFQtUENJOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKIAkJZ290byBvdXRfaG9zdF9wdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaG9zdHMuYyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCmluZGV4IGYyOGVhMDcuLjNjYmI1N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jCisrKyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCkBAIC0zOTgsNyArMzk4LDcgQEAKIAlzaG9zdC0+b3JkZXJlZF90YWcgPSBzaHQtPm9yZGVyZWRfdGFnOwogCXNob3N0LT5ub193cml0ZV9zYW1lID0gc2h0LT5ub193cml0ZV9zYW1lOwogCi0JaWYgKHNob3N0X2VoX2RlYWRsaW5lID09IC0xKQorCWlmIChzaG9zdF9laF9kZWFkbGluZSA9PSAtMSB8fCAhc2h0LT5laF9ob3N0X3Jlc2V0X2hhbmRsZXIpCiAJCXNob3N0LT5laF9kZWFkbGluZSA9IC0xOwogCWVsc2UgaWYgKCh1bG9uZykgc2hvc3RfZWhfZGVhZGxpbmUgKiBIWiA+IElOVF9NQVgpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgc2hvc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYS5jIGIvZHJpdmVycy9zY3NpL2hwc2EuYwppbmRleCA4NjgzMThhLi44Y2Y0YTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHBzYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogICAgRGlzayBBcnJheSBkcml2ZXIgZm9yIEhQIFNtYXJ0IEFycmF5IFNBUyBjb250cm9sbGVycwotICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMDkgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqICAgIENvcHlyaWdodCAyMDAwLCAyMDE0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCiAgKgogICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC00NywxMyArNDcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgImhwc2FfY21kLmgiCiAjaW5jbHVkZSAiaHBzYS5oIgogCiAvKiBIUFNBX0RSSVZFUl9WRVJTSU9OIG11c3QgYmUgMyBieXRlIHZhbHVlcyAoMC0yNTUpIHNlcGFyYXRlZCBieSAnLicgKi8KLSNkZWZpbmUgSFBTQV9EUklWRVJfVkVSU0lPTiAiMy40LjAtMSIKKyNkZWZpbmUgSFBTQV9EUklWRVJfVkVSU0lPTiAiMy40LjQtMSIKICNkZWZpbmUgRFJJVkVSX05BTUUgIkhQIEhQU0EgRHJpdmVyICh2ICIgSFBTQV9EUklWRVJfVkVSU0lPTiAiKSIKICNkZWZpbmUgSFBTQSAiaHBzYSIKIApAQCAtMTE4LDYgKzExOCwxMSBAQAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTSSwgICAgIDB4MTAzQywgMHgyMUM3fSwKIAl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0ksICAgICAweDEwM0MsIDB4MjFDOH0sCiAJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NJLCAgICAgMHgxMDNDLCAweDIxQzl9LAorCXtQQ0lfVkVORE9SX0lEX0hQXzNQQVIsIDB4MDA3NSwgMHgxNTkwLCAweDAwNzZ9LAorCXtQQ0lfVkVORE9SX0lEX0hQXzNQQVIsIDB4MDA3NSwgMHgxNTkwLCAweDAwODd9LAorCXtQQ0lfVkVORE9SX0lEX0hQXzNQQVIsIDB4MDA3NSwgMHgxNTkwLCAweDAwN0R9LAorCXtQQ0lfVkVORE9SX0lEX0hQXzNQQVIsIDB4MDA3NSwgMHgxNTkwLCAweDAwODh9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAweDMzM2YsIDB4MTAzYywgMHgzMzNmfSwKIAl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9BTllfSUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCiAJCVBDSV9DTEFTU19TVE9SQUdFX1JBSUQgPDwgOCwgMHhmZmZmIDw8IDgsIDB9LAogCXswLH0KQEAgLTE2Myw2ICsxNjgsMTEgQEAKIAl7MHgyMUM3MTAzQywgIlNtYXJ0IEFycmF5IiwgJlNBNV9hY2Nlc3N9LAogCXsweDIxQzgxMDNDLCAiU21hcnQgQXJyYXkiLCAmU0E1X2FjY2Vzc30sCiAJezB4MjFDOTEwM0MsICJTbWFydCBBcnJheSIsICZTQTVfYWNjZXNzfSwKKwl7MHgwMDc2MTU5MCwgIkhQIFN0b3JhZ2UgUDEyMjQgQXJyYXkgQ29udHJvbGxlciIsICZTQTVfYWNjZXNzfSwKKwl7MHgwMDg3MTU5MCwgIkhQIFN0b3JhZ2UgUDEyMjRlIEFycmF5IENvbnRyb2xsZXIiLCAmU0E1X2FjY2Vzc30sCisJezB4MDA3RDE1OTAsICJIUCBTdG9yYWdlIFAxMjI4IEFycmF5IENvbnRyb2xsZXIiLCAmU0E1X2FjY2Vzc30sCisJezB4MDA4ODE1OTAsICJIUCBTdG9yYWdlIFAxMjI4ZSBBcnJheSBDb250cm9sbGVyIiwgJlNBNV9hY2Nlc3N9LAorCXsweDMzM2YxMDNjLCAiSFAgU3RvcmFnZVdvcmtzIDEyMTBtIEFycmF5IENvbnRyb2xsZXIiLCAmU0E1X2FjY2Vzc30sCiAJezB4RkZGRjEwM0MsICJVbmtub3duIFNtYXJ0IEFycmF5IiwgJlNBNV9hY2Nlc3N9LAogfTsKIApAQCAtMTgyLDggKzE5Miw5IEBACiBzdGF0aWMgc3RydWN0IENvbW1hbmRMaXN0ICpjbWRfYWxsb2Moc3RydWN0IGN0bHJfaW5mbyAqaCk7CiBzdGF0aWMgc3RydWN0IENvbW1hbmRMaXN0ICpjbWRfc3BlY2lhbF9hbGxvYyhzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKIHN0YXRpYyBpbnQgZmlsbF9jbWQoc3RydWN0IENvbW1hbmRMaXN0ICpjLCB1OCBjbWQsIHN0cnVjdCBjdGxyX2luZm8gKmgsCi0Jdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHU4IHBhZ2VfY29kZSwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAorCXZvaWQgKmJ1ZmYsIHNpemVfdCBzaXplLCB1MTYgcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCiAJaW50IGNtZF90eXBlKTsKKyNkZWZpbmUgVlBEX1BBR0UgKDEgPDwgOCkKIAogc3RhdGljIGludCBocHNhX3Njc2lfcXVldWVfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpoLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogc3RhdGljIHZvaWQgaHBzYV9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKik7CkBAIC0yMDQsNyArMjE1LDcgQEAKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpOwogLyogcGVyZm9ybWFudCBtb2RlIGhlbHBlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIGNhbGNfYnVja2V0X21hcChpbnQgKmJ1Y2tldCwgaW50IG51bV9idWNrZXRzLAotCWludCBuc2dzLCBpbnQgKmJ1Y2tldF9tYXApOworCWludCBuc2dzLCBpbnQgbWluX2Jsb2NrcywgaW50ICpidWNrZXRfbWFwKTsKIHN0YXRpYyB2b2lkIGhwc2FfcHV0X2N0bHJfaW50b19wZXJmb3JtYW50X21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCk7CiBzdGF0aWMgaW5saW5lIHUzMiBuZXh0X2NvbW1hbmQoc3RydWN0IGN0bHJfaW5mbyAqaCwgdTggcSk7CiBzdGF0aWMgaW50IGhwc2FfZmluZF9jZmdfYWRkcnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqdmFkZHIsCkBAIC0yMTYsOCArMjI3LDE0IEBACiBzdGF0aWMgaW50IGhwc2Ffd2FpdF9mb3JfYm9hcmRfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqdmFkZHIsCiAJCQkJICAgICBpbnQgd2FpdF9mb3JfcmVhZHkpOwogc3RhdGljIGlubGluZSB2b2lkIGZpbmlzaF9jbWQoc3RydWN0IENvbW1hbmRMaXN0ICpjKTsKK3N0YXRpYyB2b2lkIGhwc2Ffd2FpdF9mb3JfbW9kZV9jaGFuZ2VfYWNrKHN0cnVjdCBjdGxyX2luZm8gKmgpOwogI2RlZmluZSBCT0FSRF9OT1RfUkVBRFkgMAogI2RlZmluZSBCT0FSRF9SRUFEWSAxCitzdGF0aWMgdm9pZCBocHNhX2RyYWluX2FjY2VsX2NvbW1hbmRzKHN0cnVjdCBjdGxyX2luZm8gKmgpOworc3RhdGljIHZvaWQgaHBzYV9mbHVzaF9jYWNoZShzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKK3N0YXRpYyBpbnQgaHBzYV9zY3NpX2lvYWNjZWxfcXVldWVfY29tbWFuZChzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXN0cnVjdCBDb21tYW5kTGlzdCAqYywgdTMyIGlvYWNjZWxfaGFuZGxlLCB1OCAqY2RiLCBpbnQgY2RiX2xlbiwKKwl1OCAqc2NzaTNhZGRyKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY3Rscl9pbmZvICpzZGV2X3RvX2hiYShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CkBAIC0yODAsNiArMjk3LDU1IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGhvc3Rfc3RvcmVfaHBfc3NkX3NtYXJ0X3BhdGhfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHN0YXR1cywgbGVuOworCXN0cnVjdCBjdGxyX2luZm8gKmg7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCWNoYXIgdG1wYnVmWzEwXTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJbGVuID0gY291bnQgPiBzaXplb2YodG1wYnVmKSAtIDEgPyBzaXplb2YodG1wYnVmKSAtIDEgOiBjb3VudDsKKwlzdHJuY3B5KHRtcGJ1ZiwgYnVmLCBsZW4pOworCXRtcGJ1ZltsZW5dID0gJ1wwJzsKKwlpZiAoc3NjYW5mKHRtcGJ1ZiwgIiVkIiwgJnN0YXR1cykgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaCA9IHNob3N0X3RvX2hiYShzaG9zdCk7CisJaC0+YWNjaW9wYXRoX3N0YXR1cyA9ICEhc3RhdHVzOworCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCSJocHNhOiBIUCBTU0QgU21hcnQgUGF0aCAlcyB2aWEgc3lzZnMgdXBkYXRlLlxuIiwKKwkJaC0+YWNjaW9wYXRoX3N0YXR1cyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgaG9zdF9zdG9yZV9yYWlkX29mZmxvYWRfZGVidWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgZGVidWdfbGV2ZWwsIGxlbjsKKwlzdHJ1Y3QgY3Rscl9pbmZvICpoOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwljaGFyIHRtcGJ1ZlsxMF07CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRUFDQ0VTOworCWxlbiA9IGNvdW50ID4gc2l6ZW9mKHRtcGJ1ZikgLSAxID8gc2l6ZW9mKHRtcGJ1ZikgLSAxIDogY291bnQ7CisJc3RybmNweSh0bXBidWYsIGJ1ZiwgbGVuKTsKKwl0bXBidWZbbGVuXSA9ICdcMCc7CisJaWYgKHNzY2FuZih0bXBidWYsICIlZCIsICZkZWJ1Z19sZXZlbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRlYnVnX2xldmVsIDwgMCkKKwkJZGVidWdfbGV2ZWwgPSAwOworCWggPSBzaG9zdF90b19oYmEoc2hvc3QpOworCWgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA9IGRlYnVnX2xldmVsOworCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJocHNhOiBTZXQgcmFpZF9vZmZsb2FkX2RlYnVnIGxldmVsID0gJWRcbiIsCisJCWgtPnJhaWRfb2ZmbG9hZF9kZWJ1Zyk7CisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBob3N0X3N0b3JlX3Jlc2NhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTMyNyw2ICszOTMsMTcgQEAKIAkJCSJwZXJmb3JtYW50IiA6ICJzaW1wbGUiKTsKIH0KIAorc3RhdGljIHNzaXplX3QgaG9zdF9zaG93X2hwX3NzZF9zbWFydF9wYXRoX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3Rscl9pbmZvICpoOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKworCWggPSBzaG9zdF90b19oYmEoc2hvc3QpOworCXJldHVybiBzbnByaW50ZihidWYsIDMwLCAiSFAgU1NEIFNtYXJ0IFBhdGggJXNcbiIsCisJCShoLT5hY2Npb3BhdGhfc3RhdHVzID09IDEpID8gICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworfQorCiAvKiBMaXN0IG9mIGNvbnRyb2xsZXJzIHdoaWNoIGNhbm5vdCBiZSBoYXJkIHJlc2V0IG9uIGtleGVjIHdpdGggcmVzZXRfZGV2aWNlcyAqLwogc3RhdGljIHUzMiB1bnJlc2V0dGFibGVfY29udHJvbGxlcltdID0gewogCTB4MzI0YTEwM0MsIC8qIFNtYXJ0IEFycmF5IFA3MTJtICovCkBAIC00MTYsNiArNDkzLDEzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqcmFpZF9sYWJlbFtdID0geyAiMCIsICI0IiwgIjEoMSswKSIsICI1IiwgIjUrMSIsICJBREciLAogCSIxKEFETSkiLCAiVU5LTk9XTiIKIH07CisjZGVmaW5lIEhQU0FfUkFJRF8wCTAKKyNkZWZpbmUgSFBTQV9SQUlEXzQJMQorI2RlZmluZSBIUFNBX1JBSURfMQkyCS8qIGFsc28gdXNlZCBmb3IgUkFJRCAxMCAqLworI2RlZmluZSBIUFNBX1JBSURfNQkzCS8qIGFsc28gdXNlZCBmb3IgUkFJRCA1MCAqLworI2RlZmluZSBIUFNBX1JBSURfNTEJNAorI2RlZmluZSBIUFNBX1JBSURfNgk1CS8qIGFsc28gdXNlZCBmb3IgUkFJRCA2MCAqLworI2RlZmluZSBIUFNBX1JBSURfQURNCTYJLyogYWxzbyB1c2VkIGZvciBSQUlEIDErMCBBRE0gKi8KICNkZWZpbmUgUkFJRF9VTktOT1dOIChBUlJBWV9TSVpFKHJhaWRfbGFiZWwpIC0gMSkKIAogc3RhdGljIHNzaXplX3QgcmFpZF9sZXZlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTUwNCwxMCArNTg4LDM5IEBACiAJCQlzblsxMl0sIHNuWzEzXSwgc25bMTRdLCBzblsxNV0pOwogfQogCitzdGF0aWMgc3NpemVfdCBob3N0X3Nob3dfaHBfc3NkX3NtYXJ0X3BhdGhfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjdGxyX2luZm8gKmg7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmhkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2ZmbG9hZF9lbmFibGVkOworCisJc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJaCA9IHNkZXZfdG9faGJhKHNkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJaGRldiA9IHNkZXYtPmhvc3RkYXRhOworCWlmICghaGRldikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlvZmZsb2FkX2VuYWJsZWQgPSBoZGV2LT5vZmZsb2FkX2VuYWJsZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJWRcbiIsIG9mZmxvYWRfZW5hYmxlZCk7Cit9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihyYWlkX2xldmVsLCBTX0lSVUdPLCByYWlkX2xldmVsX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGx1bmlkLCBTX0lSVUdPLCBsdW5pZF9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih1bmlxdWVfaWQsIFNfSVJVR08sIHVuaXF1ZV9pZF9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihyZXNjYW4sIFNfSVdVU1IsIE5VTEwsIGhvc3Rfc3RvcmVfcmVzY2FuKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihocF9zc2Rfc21hcnRfcGF0aF9lbmFibGVkLCBTX0lSVUdPLAorCQkJaG9zdF9zaG93X2hwX3NzZF9zbWFydF9wYXRoX2VuYWJsZWQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGhwX3NzZF9zbWFydF9wYXRoX3N0YXR1cywgU19JV1VTUnxTX0lSVUdPfFNfSVJPVEgsCisJCWhvc3Rfc2hvd19ocF9zc2Rfc21hcnRfcGF0aF9zdGF0dXMsCisJCWhvc3Rfc3RvcmVfaHBfc3NkX3NtYXJ0X3BhdGhfc3RhdHVzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyYWlkX29mZmxvYWRfZGVidWcsIFNfSVdVU1IsIE5VTEwsCisJCQlob3N0X3N0b3JlX3JhaWRfb2ZmbG9hZF9kZWJ1Zyk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZmlybXdhcmVfcmV2aXNpb24sIFNfSVJVR08sCiAJaG9zdF9zaG93X2Zpcm13YXJlX3JldmlzaW9uLCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihjb21tYW5kc19vdXRzdGFuZGluZywgU19JUlVHTywKQEAgLTUyMSw2ICs2MzQsNyBAQAogCSZkZXZfYXR0cl9yYWlkX2xldmVsLAogCSZkZXZfYXR0cl9sdW5pZCwKIAkmZGV2X2F0dHJfdW5pcXVlX2lkLAorCSZkZXZfYXR0cl9ocF9zc2Rfc21hcnRfcGF0aF9lbmFibGVkLAogCU5VTEwsCiB9OwogCkBAIC01MzAsNiArNjQ0LDggQEAKIAkmZGV2X2F0dHJfY29tbWFuZHNfb3V0c3RhbmRpbmcsCiAJJmRldl9hdHRyX3RyYW5zcG9ydF9tb2RlLAogCSZkZXZfYXR0cl9yZXNldHRhYmxlLAorCSZkZXZfYXR0cl9ocF9zc2Rfc21hcnRfcGF0aF9zdGF0dXMsCisJJmRldl9hdHRyX3JhaWRfb2ZmbG9hZF9kZWJ1ZywKIAlOVUxMLAogfTsKIApAQCAtNTcwLDYgKzY4Niw5IEBACiAJc3RydWN0IHJlcGx5X3Bvb2wgKnJxID0gJmgtPnJlcGx5X3F1ZXVlW3FdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAoaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxKQorCQlyZXR1cm4gaC0+YWNjZXNzLmNvbW1hbmRfY29tcGxldGVkKGgsIHEpOworCiAJaWYgKHVubGlrZWx5KCEoaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCkpKQogCQlyZXR1cm4gaC0+YWNjZXNzLmNvbW1hbmRfY29tcGxldGVkKGgsIHEpOwogCkBAIC01OTAsNiArNzA5LDMyIEBACiAJcmV0dXJuIGE7CiB9CiAKKy8qCisgKiBUaGVyZSBhcmUgc29tZSBzcGVjaWFsIGJpdHMgaW4gdGhlIGJ1cyBhZGRyZXNzIG9mIHRoZQorICogY29tbWFuZCB0aGF0IHdlIGhhdmUgdG8gc2V0IGZvciB0aGUgY29udHJvbGxlciB0byBrbm93CisgKiBob3cgdG8gcHJvY2VzcyB0aGUgY29tbWFuZDoKKyAqCisgKiBOb3JtYWwgcGVyZm9ybWFudCBtb2RlOgorICogYml0IDA6IDEgbWVhbnMgcGVyZm9ybWFudCBtb2RlLCAwIG1lYW5zIHNpbXBsZSBtb2RlLgorICogYml0cyAxLTMgPSBibG9jayBmZXRjaCB0YWJsZSBlbnRyeQorICogYml0cyA0LTYgPSBjb21tYW5kIHR5cGUgKD09IDApCisgKgorICogaW9hY2NlbDEgbW9kZToKKyAqIGJpdCAwID0gInBlcmZvcm1hbnQgbW9kZSIgYml0LgorICogYml0cyAxLTMgPSBibG9jayBmZXRjaCB0YWJsZSBlbnRyeQorICogYml0cyA0LTYgPSBjb21tYW5kIHR5cGUgKD09IDExMCkKKyAqIChjb21tYW5kIHR5cGUgaXMgbmVlZGVkIGJlY2F1c2UgaW9hY2NlbDEgbW9kZQorICogY29tbWFuZHMgYXJlIHN1Ym1pdHRlZCB0aHJvdWdoIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIG5vcm1hbAorICogbW9kZSBjb21tYW5kcywgc28gdGhpcyBpcyBob3cgdGhlIGNvbnRyb2xsZXIga25vd3Mgd2hldGhlcgorICogdGhlIGNvbW1hbmQgaXMgbm9ybWFsIG1vZGUgb3IgaW9hY2NlbDEgbW9kZS4pCisgKgorICogaW9hY2NlbDIgbW9kZToKKyAqIGJpdCAwID0gInBlcmZvcm1hbnQgbW9kZSIgYml0LgorICogYml0cyAxLTQgPSBibG9jayBmZXRjaCB0YWJsZSBlbnRyeSAobm90ZSBleHRyYSBiaXQpCisgKiBiaXRzIDQtNiA9IG5vdCBuZWVkZWQsIGJlY2F1c2UgaW9hY2NlbDIgbW9kZSBoYXMKKyAqIGEgc2VwYXJhdGUgc3BlY2lhbCByZWdpc3RlciBmb3Igc3VibWl0dGluZyBjb21tYW5kcy4KKyAqLworCiAvKiBzZXRfcGVyZm9ybWFudF9tb2RlOiBNb2RpZnkgdGhlIHRhZyBmb3IgY2Npc3MgcGVyZm9ybWFudAogICogc2V0IGJpdCAwIGZvciBwdWxsIG1vZGVsLCBiaXRzIDMtMSBmb3IgYmxvY2sgZmV0Y2gKICAqIHJlZ2lzdGVyIG51bWJlcgpAQCAtNTk4LDEyICs3NDMsNDcgQEAKIHsKIAlpZiAobGlrZWx5KGgtPnRyYW5zTWV0aG9kICYgQ0ZHVEJMX1RyYW5zX1BlcmZvcm1hbnQpKSB7CiAJCWMtPmJ1c2FkZHIgfD0gMSB8IChoLT5ibG9ja0ZldGNoVGFibGVbYy0+SGVhZGVyLlNHTGlzdF0gPDwgMSk7Ci0JCWlmIChsaWtlbHkoaC0+bXNpeF92ZWN0b3IpKQorCQlpZiAobGlrZWx5KGgtPm1zaXhfdmVjdG9yID4gMCkpCiAJCQljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9CiAJCQkJcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAlIGgtPm5yZXBseV9xdWV1ZXM7CiAJfQogfQogCitzdGF0aWMgdm9pZCBzZXRfaW9hY2NlbDFfcGVyZm9ybWFudF9tb2RlKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCQlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJc3RydWN0IGlvX2FjY2VsMV9jbWQgKmNwID0gJmgtPmlvYWNjZWxfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCisJLyogVGVsbCB0aGUgY29udHJvbGxlciB0byBwb3N0IHRoZSByZXBseSB0byB0aGUgcXVldWUgZm9yIHRoaXMKKwkgKiBwcm9jZXNzb3IuICBUaGlzIHNlZW1zIHRvIGdpdmUgdGhlIGJlc3QgSS9PIHRocm91Z2hwdXQuCisJICovCisJY3AtPlJlcGx5UXVldWUgPSBzbXBfcHJvY2Vzc29yX2lkKCkgJSBoLT5ucmVwbHlfcXVldWVzOworCS8qIFNldCB0aGUgYml0cyBpbiB0aGUgYWRkcmVzcyBzZW50IGRvd24gdG8gaW5jbHVkZToKKwkgKiAgLSBwZXJmb3JtYW50IG1vZGUgYml0IChiaXQgMCkKKwkgKiAgLSBwdWxsIGNvdW50IChiaXRzIDEtMykKKwkgKiAgLSBjb21tYW5kIHR5cGUgKGJpdHMgNC02KQorCSAqLworCWMtPmJ1c2FkZHIgfD0gMSB8IChoLT5pb2FjY2VsMV9ibG9ja0ZldGNoVGFibGVbYy0+SGVhZGVyLlNHTGlzdF0gPDwgMSkgfAorCQkJCQlJT0FDQ0VMMV9CVVNBRERSX0NNRFRZUEU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pb2FjY2VsMl9wZXJmb3JtYW50X21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCQkJCXN0cnVjdCBDb21tYW5kTGlzdCAqYykKK3sKKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqY3AgPSAmaC0+aW9hY2NlbDJfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCisJLyogVGVsbCB0aGUgY29udHJvbGxlciB0byBwb3N0IHRoZSByZXBseSB0byB0aGUgcXVldWUgZm9yIHRoaXMKKwkgKiBwcm9jZXNzb3IuICBUaGlzIHNlZW1zIHRvIGdpdmUgdGhlIGJlc3QgSS9PIHRocm91Z2hwdXQuCisJICovCisJY3AtPnJlcGx5X3F1ZXVlID0gc21wX3Byb2Nlc3Nvcl9pZCgpICUgaC0+bnJlcGx5X3F1ZXVlczsKKwkvKiBTZXQgdGhlIGJpdHMgaW4gdGhlIGFkZHJlc3Mgc2VudCBkb3duIHRvIGluY2x1ZGU6CisJICogIC0gcGVyZm9ybWFudCBtb2RlIGJpdCBub3QgdXNlZCBpbiBpb2FjY2VsIG1vZGUgMgorCSAqICAtIHB1bGwgY291bnQgKGJpdHMgMC0zKQorCSAqICAtIGNvbW1hbmQgdHlwZSBpc24ndCBuZWVkZWQgZm9yIGlvYWNjZWwyCisJICovCisJYy0+YnVzYWRkciB8PSAoaC0+aW9hY2NlbDJfYmxvY2tGZXRjaFRhYmxlW2NwLT5zZ19jb3VudF0pOworfQorCiBzdGF0aWMgaW50IGlzX2Zpcm13YXJlX2ZsYXNoX2NtZCh1OCAqY2RiKQogewogCXJldHVybiBjZGJbMF0gPT0gQk1JQ19XUklURSAmJiBjZGJbNl0gPT0gQk1JQ19GTEFTSF9GSVJNV0FSRTsKQEAgLTYzOCw3ICs4MTgsMTYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc2V0X3BlcmZvcm1hbnRfbW9kZShoLCBjKTsKKwlzd2l0Y2ggKGMtPmNtZF90eXBlKSB7CisJY2FzZSBDTURfSU9BQ0NFTDE6CisJCXNldF9pb2FjY2VsMV9wZXJmb3JtYW50X21vZGUoaCwgYyk7CisJCWJyZWFrOworCWNhc2UgQ01EX0lPQUNDRUwyOgorCQlzZXRfaW9hY2NlbDJfcGVyZm9ybWFudF9tb2RlKGgsIGMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXRfcGVyZm9ybWFudF9tb2RlKGgsIGMpOworCX0KIAlkaWFsX2Rvd25fbG9ja3VwX2RldGVjdGlvbl9kdXJpbmdfZndfZmxhc2goaCwgYyk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKIAlhZGRRKCZoLT5yZXFRLCBjKTsKQEAgLTc4Miw2ICs5NzEsMTQgQEAKIAogCS8qIFJhaWQgbGV2ZWwgY2hhbmdlZC4gKi8KIAloLT5kZXZbZW50cnldLT5yYWlkX2xldmVsID0gbmV3X2VudHJ5LT5yYWlkX2xldmVsOworCisJLyogUmFpZCBvZmZsb2FkIHBhcmFtZXRlcnMgY2hhbmdlZC4gKi8KKwloLT5kZXZbZW50cnldLT5vZmZsb2FkX2NvbmZpZyA9IG5ld19lbnRyeS0+b2ZmbG9hZF9jb25maWc7CisJaC0+ZGV2W2VudHJ5XS0+b2ZmbG9hZF9lbmFibGVkID0gbmV3X2VudHJ5LT5vZmZsb2FkX2VuYWJsZWQ7CisJaC0+ZGV2W2VudHJ5XS0+aW9hY2NlbF9oYW5kbGUgPSBuZXdfZW50cnktPmlvYWNjZWxfaGFuZGxlOworCWgtPmRldltlbnRyeV0tPm9mZmxvYWRfdG9fbWlycm9yID0gbmV3X2VudHJ5LT5vZmZsb2FkX3RvX21pcnJvcjsKKwloLT5kZXZbZW50cnldLT5yYWlkX21hcCA9IG5ld19lbnRyeS0+cmFpZF9tYXA7CisKIAlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiJXMgZGV2aWNlIGMlZGIlZHQlZGwlZCB1cGRhdGVkLlxuIiwKIAkJc2NzaV9kZXZpY2VfdHlwZShuZXdfZW50cnktPmRldnR5cGUpLCBob3N0bm8sIG5ld19lbnRyeS0+YnVzLAogCQluZXdfZW50cnktPnRhcmdldCwgbmV3X2VudHJ5LT5sdW4pOwpAQCAtOTAyLDYgKzEwOTksMTAgQEAKIAkgKi8KIAlpZiAoZGV2MS0+cmFpZF9sZXZlbCAhPSBkZXYyLT5yYWlkX2xldmVsKQogCQlyZXR1cm4gMTsKKwlpZiAoZGV2MS0+b2ZmbG9hZF9jb25maWcgIT0gZGV2Mi0+b2ZmbG9hZF9jb25maWcpCisJCXJldHVybiAxOworCWlmIChkZXYxLT5vZmZsb2FkX2VuYWJsZWQgIT0gZGV2Mi0+b2ZmbG9hZF9lbmFibGVkKQorCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTMyLDYgKzExMzMsOSBAQAogCQkJCQlyZXR1cm4gREVWSUNFX1VQREFURUQ7CiAJCQkJcmV0dXJuIERFVklDRV9TQU1FOwogCQkJfSBlbHNlIHsKKwkJCQkvKiBLZWVwIG9mZmxpbmUgZGV2aWNlcyBvZmZsaW5lICovCisJCQkJaWYgKG5lZWRsZS0+dm9sdW1lX29mZmxpbmUpCisJCQkJCXJldHVybiBERVZJQ0VfTk9UX0ZPVU5EOwogCQkJCXJldHVybiBERVZJQ0VfQ0hBTkdFRDsKIAkJCX0KIAkJfQpAQCAtOTQwLDYgKzExNDQsMTEwIEBACiAJcmV0dXJuIERFVklDRV9OT1RfRk9VTkQ7CiB9CiAKK3N0YXRpYyB2b2lkIGhwc2FfbW9uaXRvcl9vZmZsaW5lX2RldmljZShzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQkJCQl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcltdKQoreworCXN0cnVjdCBvZmZsaW5lX2RldmljZV9lbnRyeSAqZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgZGV2aWNlIGlzIGFscmVhZHkgb24gdGhlIGxpc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmaC0+b2ZmbGluZV9kZXZpY2VfbGlzdCwgb2ZmbGluZV9saXN0KSB7CisJCWlmIChtZW1jbXAoZGV2aWNlLT5zY3NpM2FkZHIsIHNjc2kzYWRkciwKKwkJCXNpemVvZihkZXZpY2UtPnNjc2kzYWRkcikpID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7CisKKwkvKiBEZXZpY2UgaXMgbm90IG9uIHRoZSBsaXN0LCBhZGQgaXQuICovCisJZGV2aWNlID0ga21hbGxvYyhzaXplb2YoKmRldmljZSksIEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluICVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJbWVtY3B5KGRldmljZS0+c2NzaTNhZGRyLCBzY3NpM2FkZHIsIHNpemVvZihkZXZpY2UtPnNjc2kzYWRkcikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5vZmZsaW5lX2xpc3QsICZoLT5vZmZsaW5lX2RldmljZV9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qIFByaW50IGEgbWVzc2FnZSBleHBsYWluaW5nIHZhcmlvdXMgb2ZmbGluZSB2b2x1bWUgc3RhdGVzICovCitzdGF0aWMgdm9pZCBocHNhX3Nob3dfdm9sdW1lX3N0YXR1cyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKnNkKQoreworCWlmIChzZC0+dm9sdW1lX29mZmxpbmUgPT0gSFBTQV9WUERfTFZfU1RBVFVTX1VOU1VQUE9SVEVEKQorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgdGhyb3VnaCB2aXRhbCBwcm9kdWN0IGRhdGEgcGFnZXMuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJc3dpdGNoIChzZC0+dm9sdW1lX29mZmxpbmUpIHsKKwljYXNlIEhQU0FfTFZfT0s6CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VSQVNFOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgaXMgdW5kZXJnb2luZyBiYWNrZ3JvdW5kIGVyYXNlIHByb2Nlc3MuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX1JQSToKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJDJWQ6QiVkOlQlZDpMJWQgVm9sdW1lIGlzIHVuZGVyZ29pbmcgcmFwaWQgcGFyaXR5IGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9QRU5ESU5HX1JQSToKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBxdWV1ZWQgZm9yIHJhcGlkIHBhcml0eSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuIiwKKwkJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9FTkNSWVBURURfTk9fS0VZOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgaXMgZW5jcnlwdGVkIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgYmVjYXVzZSBrZXkgaXMgbm90IHByZXNlbnQuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9QTEFJTlRFWFRfSU5fRU5DUllQVF9PTkxZX0NPTlRST0xMRVI6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBub3QgZW5jcnlwdGVkIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgYmVjYXVzZSBjb250cm9sbGVyIGlzIGluIGVuY3J5cHRpb24tb25seSBtb2RlLlxuIiwKKwkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywKKwkJCXNkLT5idXMsIHNkLT50YXJnZXQsIHNkLT5sdW4pOworCQlicmVhazsKKwljYXNlIEhQU0FfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgaXMgdW5kZXJnb2luZyBlbmNyeXB0aW9uIHByb2Nlc3MuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT05fUkVLRVlJTkc6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyB1bmRlcmdvaW5nIGVuY3J5cHRpb24gcmUta2V5aW5nIHByb2Nlc3MuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9FTkNSWVBURURfSU5fTk9OX0VOQ1JZUFRFRF9DT05UUk9MTEVSOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgaXMgZW5jcnlwdGVkIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgYmVjYXVzZSBjb250cm9sbGVyIGRvZXMgbm90IGhhdmUgZW5jcnlwdGlvbiBlbmFibGVkLlxuIiwKKwkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywKKwkJCXNkLT5idXMsIHNkLT50YXJnZXQsIHNkLT5sdW4pOworCQlicmVhazsKKwljYXNlIEhQU0FfTFZfUEVORElOR19FTkNSWVBUSU9OOgorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIkMlZDpCJWQ6VCVkOkwlZCBWb2x1bWUgaXMgcGVuZGluZyBtaWdyYXRpb24gdG8gZW5jcnlwdGVkIHN0YXRlLCBidXQgcHJvY2VzcyBoYXMgbm90IHN0YXJ0ZWQuXG4iLAorCQkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJc2QtPmJ1cywgc2QtPnRhcmdldCwgc2QtPmx1bik7CisJCWJyZWFrOworCWNhc2UgSFBTQV9MVl9QRU5ESU5HX0VOQ1JZUFRJT05fUkVLRVlJTkc6CisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsCisJCQkiQyVkOkIlZDpUJWQ6TCVkIFZvbHVtZSBpcyBlbmNyeXB0ZWQgYW5kIGlzIHBlbmRpbmcgZW5jcnlwdGlvbiByZWtleWluZy5cbiIsCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQlzZC0+YnVzLCBzZC0+dGFyZ2V0LCBzZC0+bHVuKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgdm9pZCBhZGp1c3RfaHBzYV9zY3NpX3RhYmxlKHN0cnVjdCBjdGxyX2luZm8gKmgsIGludCBob3N0bm8sCiAJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqc2RbXSwgaW50IG5zZHMpCiB7CkBAIC0xMDA0LDYgKzEzMTIsMjAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnNkczsgaSsrKSB7CiAJCWlmICghc2RbaV0pIC8qIGlmIGFscmVhZHkgYWRkZWQgYWJvdmUuICovCiAJCQljb250aW51ZTsKKworCQkvKiBEb24ndCBhZGQgZGV2aWNlcyB3aGljaCBhcmUgTk9UIFJFQURZLCBGT1JNQVQgSU4gUFJPR1JFU1MKKwkJICogYXMgdGhlIFNDU0kgbWlkLWxheWVyIGRvZXMgbm90IGhhbmRsZSBzdWNoIGRldmljZXMgd2VsbC4KKwkJICogSXQgcmVsZW50bGVzc2x5IGxvb3BzIHNlbmRpbmcgVFVSIGF0IDNIeiwgdGhlbiBSRUFEKDEwKQorCQkgKiBhdCAxNjBIeiwgYW5kIHByZXZlbnRzIHRoZSBzeXN0ZW0gZnJvbSBjb21pbmcgdXAuCisJCSAqLworCQlpZiAoc2RbaV0tPnZvbHVtZV9vZmZsaW5lKSB7CisJCQlocHNhX3Nob3dfdm9sdW1lX3N0YXR1cyhoLCBzZFtpXSk7CisJCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiYyVkYiVkdCVkbCVkOiB0ZW1wb3JhcmlseSBvZmZsaW5lXG4iLAorCQkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywKKwkJCQlzZFtpXS0+YnVzLCBzZFtpXS0+dGFyZ2V0LCBzZFtpXS0+bHVuKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJZGV2aWNlX2NoYW5nZSA9IGhwc2Ffc2NzaV9maW5kX2VudHJ5KHNkW2ldLCBoLT5kZXYsCiAJCQkJCWgtPm5kZXZpY2VzLCAmZW50cnkpOwogCQlpZiAoZGV2aWNlX2NoYW5nZSA9PSBERVZJQ0VfTk9UX0ZPVU5EKSB7CkBAIC0xMDIyLDYgKzEzNDQsMTcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+ZGV2bG9jaywgZmxhZ3MpOwogCisJLyogTW9uaXRvciBkZXZpY2VzIHdoaWNoIGFyZSBpbiBvbmUgb2Ygc2V2ZXJhbCBOT1QgUkVBRFkgc3RhdGVzIHRvIGJlCisJICogYnJvdWdodCBvbmxpbmUgbGF0ZXIuIFRoaXMgbXVzdCBiZSBkb25lIHdpdGhvdXQgaG9sZGluZyBoLT5kZXZsb2NrLAorCSAqIHNvIGRvbid0IHRvdWNoIGgtPmRldltdCisJICovCisJZm9yIChpID0gMDsgaSA8IG5zZHM7IGkrKykgeworCQlpZiAoIXNkW2ldKSAvKiBpZiBhbHJlYWR5IGFkZGVkIGFib3ZlLiAqLworCQkJY29udGludWU7CisJCWlmIChzZFtpXS0+dm9sdW1lX29mZmxpbmUpCisJCQlocHNhX21vbml0b3Jfb2ZmbGluZV9kZXZpY2UoaCwgc2RbaV0tPnNjc2kzYWRkcik7CisJfQorCiAJLyogRG9uJ3Qgbm90aWZ5IHNjc2kgbWlkIGxheWVyIG9mIGFueSBjaGFuZ2VzIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKIAkgKiAob3IgaWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMpIHNjc2lfc2Nhbl9ob3N0IHdpbGwgZG8gaXQgbGF0ZXIgdGhlCiAJICogZmlyc3QgdGltZSB0aHJvdWdoLgpAQCAtMTE4NywxMSArMTUyMCwxNjMgQEAKIAlwY2lfdW5tYXBfc2luZ2xlKGgtPnBkZXYsIHRlbXA2NC52YWwsIGNoYWluX3NnLT5MZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwogfQogCisKKy8qIERlY29kZSB0aGUgdmFyaW91cyB0eXBlcyBvZiBlcnJvcnMgb24gaW9hY2NlbDIgcGF0aC4KKyAqIFJldHVybiAxIGZvciBhbnkgZXJyb3IgdGhhdCBzaG91bGQgZ2VuZXJhdGUgYSBSQUlEIHBhdGggcmV0cnkuCisgKiBSZXR1cm4gMCBmb3IgZXJyb3JzIHRoYXQgZG9uJ3QgcmVxdWlyZSBhIFJBSUQgcGF0aCByZXRyeS4KKyAqLworc3RhdGljIGludCBoYW5kbGVfaW9hY2NlbF9tb2RlMl9lcnJvcihzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQkJCQlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsCisJCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkJc3RydWN0IGlvX2FjY2VsMl9jbWQgKmMyKQoreworCWludCBkYXRhX2xlbjsKKwlpbnQgcmV0cnkgPSAwOworCisJc3dpdGNoIChjMi0+ZXJyb3JfZGF0YS5zZXJ2X3Jlc3BvbnNlKSB7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX0NPTVBMRVRFOgorCQlzd2l0Y2ggKGMyLT5lcnJvcl9kYXRhLnN0YXR1cykgeworCQljYXNlIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfR09PRDoKKwkJCWJyZWFrOworCQljYXNlIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfQ0hLX0NPTkQ6CisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogdGFzayBjb21wbGV0ZSB3aXRoIGNoZWNrIGNvbmRpdGlvbi5cbiIsCisJCQkJIkhQIFNTRCBTbWFydCBQYXRoIik7CisJCQlpZiAoYzItPmVycm9yX2RhdGEuZGF0YV9wcmVzZW50ICE9CisJCQkJCUlPQUNDRUwyX1NFTlNFX0RBVEFfUFJFU0VOVCkKKwkJCQlicmVhazsKKwkJCS8qIGNvcHkgdGhlIHNlbnNlIGRhdGEgKi8KKwkJCWRhdGFfbGVuID0gYzItPmVycm9yX2RhdGEuc2Vuc2VfZGF0YV9sZW47CisJCQlpZiAoZGF0YV9sZW4gPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCisJCQkJZGF0YV9sZW4gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJCQlpZiAoZGF0YV9sZW4gPiBzaXplb2YoYzItPmVycm9yX2RhdGEuc2Vuc2VfZGF0YV9idWZmKSkKKwkJCQlkYXRhX2xlbiA9CisJCQkJCXNpemVvZihjMi0+ZXJyb3JfZGF0YS5zZW5zZV9kYXRhX2J1ZmYpOworCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLAorCQkJCWMyLT5lcnJvcl9kYXRhLnNlbnNlX2RhdGFfYnVmZiwgZGF0YV9sZW4pOworCQkJY21kLT5yZXN1bHQgfD0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQkJcmV0cnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9CVVNZOgorCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiJXM6IHRhc2sgY29tcGxldGUgd2l0aCBCVVNZIHN0YXR1cy5cbiIsCisJCQkJIkhQIFNTRCBTbWFydCBQYXRoIik7CisJCQlyZXRyeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX1JFU19DT046CisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogdGFzayBjb21wbGV0ZSB3aXRoIHJlc2VydmF0aW9uIGNvbmZsaWN0LlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJCXJldHJ5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfU0VUX0ZVTEw6CisJCQkvKiBNYWtlIHNjc2kgbWlkbGF5ZXIgZG8gdW5saW1pdGVkIHJldHJpZXMgKi8KKwkJCWNtZC0+cmVzdWx0ID0gRElEX0lNTV9SRVRSWSA8PCAxNjsKKwkJCWJyZWFrOworCQljYXNlIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfQUJPUlRFRDoKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiB0YXNrIGNvbXBsZXRlIHdpdGggYWJvcnRlZCBzdGF0dXMuXG4iLAorCQkJCSJIUCBTU0QgU21hcnQgUGF0aCIpOworCQkJcmV0cnkgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogdGFzayBjb21wbGV0ZSB3aXRoIHVucmVjb2duaXplZCBzdGF0dXM6IDB4JTAyeFxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiLCBjMi0+ZXJyb3JfZGF0YS5zdGF0dXMpOworCQkJcmV0cnkgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX0ZBSUxVUkU6CisJCS8qIGRvbid0IGV4cGVjdCB0byBnZXQgaGVyZS4gKi8KKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJ1bmV4cGVjdGVkIGRlbGl2ZXJ5IG9yIHRhcmdldCBmYWlsdXJlLCBzdGF0dXMgPSAweCUwMnhcbiIsCisJCQljMi0+ZXJyb3JfZGF0YS5zdGF0dXMpOworCQlyZXRyeSA9IDE7CisJCWJyZWFrOworCWNhc2UgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfQ09NUExFVEU6CisJCWJyZWFrOworCWNhc2UgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfU1VDQ0VTUzoKKwkJYnJlYWs7CisJY2FzZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX1RNRl9SRUpFQ1RFRDoKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgInRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbiByZWplY3RlZC5cbiIpOworCQlyZXRyeSA9IDE7CisJCWJyZWFrOworCWNhc2UgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfV1JPTkdfTFVOOgorCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAidGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9uIGludmFsaWQgTFVOXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSIlczogVW5yZWNvZ25pemVkIHNlcnZlciByZXNwb25zZTogMHglMDJ4XG4iLAorCQkJIkhQIFNTRCBTbWFydCBQYXRoIiwKKwkJCWMyLT5lcnJvcl9kYXRhLnNlcnZfcmVzcG9uc2UpOworCQlyZXRyeSA9IDE7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXRyeTsJLyogcmV0cnkgb24gcmFpZCBwYXRoPyAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2lvYWNjZWwyX2NvbXBsZXRpb24oc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJc3RydWN0IENvbW1hbmRMaXN0ICpjLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldikKK3sKKwlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqYzIgPSAmaC0+aW9hY2NlbDJfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCWludCByYWlkX3JldHJ5ID0gMDsKKworCS8qIGNoZWNrIGZvciBnb29kIHN0YXR1cyAqLworCWlmIChsaWtlbHkoYzItPmVycm9yX2RhdGEuc2Vydl9yZXNwb25zZSA9PSAwICYmCisJCQljMi0+ZXJyb3JfZGF0YS5zdGF0dXMgPT0gMCkpIHsKKwkJY21kX2ZyZWUoaCwgYyk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbnkgUkFJRCBvZmZsb2FkIGVycm9yIHJlc3VsdHMgaW4gcmV0cnkgd2hpY2ggd2lsbCB1c2UKKwkgKiB0aGUgbm9ybWFsIEkvTyBwYXRoIHNvIHRoZSBjb250cm9sbGVyIGNhbiBoYW5kbGUgd2hhdGV2ZXIncworCSAqIHdyb25nLgorCSAqLworCWlmIChpc19sb2dpY2FsX2Rldl9hZGRyX21vZGUoZGV2LT5zY3NpM2FkZHIpICYmCisJCWMyLT5lcnJvcl9kYXRhLnNlcnZfcmVzcG9uc2UgPT0KKwkJCUlPQUNDRUwyX1NFUlZfUkVTUE9OU0VfRkFJTFVSRSkgeworCQlpZiAoYzItPmVycm9yX2RhdGEuc3RhdHVzID09CisJCQlJT0FDQ0VMMl9TVEFUVVNfU1JfSU9BQ0NFTF9ESVNBQkxFRCkKKwkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJIiVzOiBQYXRoIGlzIHVuYXZhaWxhYmxlLCByZXRyeWluZyBvbiBzdGFuZGFyZCBwYXRoLlxuIiwKKwkJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJZWxzZQorCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCQkiJXM6IEVycm9yIDB4JTAyeCwgcmV0cnlpbmcgb24gc3RhbmRhcmQgcGF0aC5cbiIsCisJCQkJIkhQIFNTRCBTbWFydCBQYXRoIiwgYzItPmVycm9yX2RhdGEuc3RhdHVzKTsKKworCQlkZXYtPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisJCWgtPmRydl9yZXFfcmVzY2FuID0gMTsJLyogc2NoZWR1bGUgY29udHJvbGxlciBmb3IgYSByZXNjYW4gKi8KKwkJY21kLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKwkJY21kX2ZyZWUoaCwgYyk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCXJldHVybjsKKwl9CisJcmFpZF9yZXRyeSA9IGhhbmRsZV9pb2FjY2VsX21vZGUyX2Vycm9yKGgsIGMsIGNtZCwgYzIpOworCS8qIElmIGVycm9yIGZvdW5kLCBkaXNhYmxlIFNtYXJ0IFBhdGgsIHNjaGVkdWxlIGEgcmVzY2FuLAorCSAqIGFuZCBmb3JjZSBhIHJldHJ5IG9uIHRoZSBzdGFuZGFyZCBwYXRoLgorCSAqLworCWlmIChyYWlkX3JldHJ5KSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICIlczogUmV0cnlpbmcgb24gc3RhbmRhcmQgcGF0aC5cbiIsCisJCQkiSFAgU1NEIFNtYXJ0IFBhdGgiKTsKKwkJZGV2LT5vZmZsb2FkX2VuYWJsZWQgPSAwOyAvKiBEaXNhYmxlIFNtYXJ0IFBhdGggKi8KKwkJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAxOwkgIC8qIHNjaGVkdWxlIGNvbnRyb2xsZXIgcmVzY2FuICovCisJCWNtZC0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisJfQorCWNtZF9mcmVlKGgsIGMpOworCWNtZC0+c2NzaV9kb25lKGNtZCk7Cit9CisKIHN0YXRpYyB2b2lkIGNvbXBsZXRlX3Njc2lfY29tbWFuZChzdHJ1Y3QgQ29tbWFuZExpc3QgKmNwKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAlzdHJ1Y3QgY3Rscl9pbmZvICpoOwogCXN0cnVjdCBFcnJvckluZm8gKmVpOworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldjsKIAogCXVuc2lnbmVkIGNoYXIgc2Vuc2Vfa2V5OwogCXVuc2lnbmVkIGNoYXIgYXNjOyAgICAgIC8qIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSAqLwpAQCAtMTIwMSwxMyArMTY4NiwxOSBAQAogCWVpID0gY3AtPmVycl9pbmZvOwogCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNwLT5zY3NpX2NtZDsKIAloID0gY3AtPmg7CisJZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOwogCiAJc2NzaV9kbWFfdW5tYXAoY21kKTsgLyogdW5kbyB0aGUgRE1BIG1hcHBpbmdzICovCi0JaWYgKGNwLT5IZWFkZXIuU0dUb3RhbCA+IGgtPm1heF9jbWRfc2dfZW50cmllcykKKwlpZiAoKGNwLT5jbWRfdHlwZSA9PSBDTURfU0NTSSkgJiYKKwkJKGNwLT5IZWFkZXIuU0dUb3RhbCA+IGgtPm1heF9jbWRfc2dfZW50cmllcykpCiAJCWhwc2FfdW5tYXBfc2dfY2hhaW5fYmxvY2soaCwgY3ApOwogCiAJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsgCQkvKiBob3N0IGJ5dGUgKi8KIAljbWQtPnJlc3VsdCB8PSAoQ09NTUFORF9DT01QTEVURSA8PCA4KTsJLyogbXNnIGJ5dGUgKi8KKworCWlmIChjcC0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwyKQorCQlyZXR1cm4gcHJvY2Vzc19pb2FjY2VsMl9jb21wbGV0aW9uKGgsIGNwLCBjbWQsIGRldik7CisKIAljbWQtPnJlc3VsdCB8PSBlaS0+U2NzaVN0YXR1czsKIAogCS8qIGNvcHkgdGhlIHNlbnNlIGRhdGEgd2hldGhlciB3ZSBuZWVkIHRvIG9yIG5vdC4gKi8KQEAgLTEyMjcsNiArMTcxOCwzMiBAQAogCQlyZXR1cm47CiAJfQogCisJLyogRm9yIEkvTyBhY2NlbGVyYXRvciBjb21tYW5kcywgY29weSBvdmVyIHNvbWUgZmllbGRzIHRvIHRoZSBub3JtYWwKKwkgKiBDSVNTIGhlYWRlciB1c2VkIGJlbG93IGZvciBlcnJvciBoYW5kbGluZy4KKwkgKi8KKwlpZiAoY3AtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMSkgeworCQlzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqYyA9ICZoLT5pb2FjY2VsX2NtZF9wb29sW2NwLT5jbWRpbmRleF07CisJCWNwLT5IZWFkZXIuU0dMaXN0ID0gY3AtPkhlYWRlci5TR1RvdGFsID0gc2NzaV9zZ19jb3VudChjbWQpOworCQljcC0+UmVxdWVzdC5DREJMZW4gPSBjLT5pb19mbGFncyAmIElPQUNDRUwxX0lPRkxBR1NfQ0RCTEVOX01BU0s7CisJCWNwLT5IZWFkZXIuVGFnLmxvd2VyID0gYy0+VGFnLmxvd2VyOworCQljcC0+SGVhZGVyLlRhZy51cHBlciA9IGMtPlRhZy51cHBlcjsKKwkJbWVtY3B5KGNwLT5IZWFkZXIuTFVOLkx1bkFkZHJCeXRlcywgYy0+Q0lTU19MVU4sIDgpOworCQltZW1jcHkoY3AtPlJlcXVlc3QuQ0RCLCBjLT5DREIsIGNwLT5SZXF1ZXN0LkNEQkxlbik7CisKKwkJLyogQW55IFJBSUQgb2ZmbG9hZCBlcnJvciByZXN1bHRzIGluIHJldHJ5IHdoaWNoIHdpbGwgdXNlCisJCSAqIHRoZSBub3JtYWwgSS9PIHBhdGggc28gdGhlIGNvbnRyb2xsZXIgY2FuIGhhbmRsZSB3aGF0ZXZlcidzCisJCSAqIHdyb25nLgorCQkgKi8KKwkJaWYgKGlzX2xvZ2ljYWxfZGV2X2FkZHJfbW9kZShkZXYtPnNjc2kzYWRkcikpIHsKKwkJCWlmIChlaS0+Q29tbWFuZFN0YXR1cyA9PSBDTURfSU9BQ0NFTF9ESVNBQkxFRCkKKwkJCQlkZXYtPm9mZmxvYWRfZW5hYmxlZCA9IDA7CisJCQljbWQtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OworCQkJY21kX2ZyZWUoaCwgY3ApOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwogCS8qIGFuIGVycm9yIGhhcyBvY2N1cnJlZCAqLwogCXN3aXRjaCAoZWktPkNvbW1hbmRTdGF0dXMpIHsKIApAQCAtMTM4OSw2ICsxOTA2LDE0IEBACiAJCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiQ29tbWFuZCB1bmFib3J0YWJsZVxuIik7CiAJCWJyZWFrOworCWNhc2UgQ01EX0lPQUNDRUxfRElTQUJMRUQ6CisJCS8qIFRoaXMgb25seSBoYW5kbGVzIHRoZSBkaXJlY3QgcGFzcy10aHJvdWdoIGNhc2Ugc2luY2UgUkFJRAorCQkgKiBvZmZsb2FkIGlzIGhhbmRsZWQgYWJvdmUuICBKdXN0IGF0dGVtcHQgYSByZXRyeS4KKwkJICovCisJCWNtZC0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkJImNwICVwIGhhZCBIUCBTU0QgU21hcnQgUGF0aCBlcnJvclxuIiwgY3ApOworCQlicmVhazsKIAlkZWZhdWx0OgogCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKIAkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImNwICVwIHJldHVybmVkIHVua25vd24gc3RhdHVzICV4XG4iLApAQCAtMTQzOCw2ICsxOTYzLDcgQEAKIAljcC0+U0dbMF0uQWRkci51cHBlciA9CiAJICAodTMyKSAoKGFkZHI2NCA+PiAzMikgJiAodTY0KSAweDAwMDAwMDAwRkZGRkZGRkYpOwogCWNwLT5TR1swXS5MZW4gPSBidWZsZW47CisJY3AtPlNHWzBdLkV4dCA9IEhQU0FfU0dfTEFTVDsgLyogd2UgYXJlIG5vdCBjaGFpbmluZyAqLwogCWNwLT5IZWFkZXIuU0dMaXN0ID0gKHU4KSAxOyAgIC8qIG5vLiBTR3MgY29udGlnIGluIHRoaXMgY21kICovCiAJY3AtPkhlYWRlci5TR1RvdGFsID0gKHUxNikgMTsgLyogdG90YWwgc2dzIGluIHRoaXMgY21kIGxpc3QgKi8KIAlyZXR1cm4gMDsKQEAgLTE0OTAsMTcgKzIwMTYsMzcgQEAKIAlocHNhX3BjaV91bm1hcChoLT5wZGV2LCBjLCAxLCBkYXRhX2RpcmVjdGlvbik7CiB9CiAKLXN0YXRpYyB2b2lkIGhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3Ioc3RydWN0IENvbW1hbmRMaXN0ICpjcCkKK3N0YXRpYyB2b2lkIGhwc2FfcHJpbnRfY21kKHN0cnVjdCBjdGxyX2luZm8gKmgsIGNoYXIgKnR4dCwKKwkJCQlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCiB7Ci0Jc3RydWN0IEVycm9ySW5mbyAqZWk7Ci0Jc3RydWN0IGRldmljZSAqZCA9ICZjcC0+aC0+cGRldi0+ZGV2OworCWNvbnN0IHU4ICpjZGIgPSBjLT5SZXF1ZXN0LkNEQjsKKwljb25zdCB1OCAqbHVuID0gYy0+SGVhZGVyLkxVTi5MdW5BZGRyQnl0ZXM7CiAKLQllaSA9IGNwLT5lcnJfaW5mbzsKKwlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiJXM6IExVTjolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKwkiIENEQjolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQl0eHQsIGx1blswXSwgbHVuWzFdLCBsdW5bMl0sIGx1blszXSwKKwkJbHVuWzRdLCBsdW5bNV0sIGx1bls2XSwgbHVuWzddLAorCQljZGJbMF0sIGNkYlsxXSwgY2RiWzJdLCBjZGJbM10sCisJCWNkYls0XSwgY2RiWzVdLCBjZGJbNl0sIGNkYls3XSwKKwkJY2RiWzhdLCBjZGJbOV0sIGNkYlsxMF0sIGNkYlsxMV0sCisJCWNkYlsxMl0sIGNkYlsxM10sIGNkYlsxNF0sIGNkYlsxNV0pOworfQorCitzdGF0aWMgdm9pZCBocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQlzdHJ1Y3QgQ29tbWFuZExpc3QgKmNwKQoreworCWNvbnN0IHN0cnVjdCBFcnJvckluZm8gKmVpID0gY3AtPmVycl9pbmZvOworCXN0cnVjdCBkZXZpY2UgKmQgPSAmY3AtPmgtPnBkZXYtPmRldjsKKwljb25zdCB1OCAqc2QgPSBlaS0+U2Vuc2VJbmZvOworCiAJc3dpdGNoIChlaS0+Q29tbWFuZFN0YXR1cykgewogCWNhc2UgQ01EX1RBUkdFVF9TVEFUVVM6Ci0JCWRldl93YXJuKGQsICJjbWQgJXAgaGFzIGNvbXBsZXRlZCB3aXRoIGVycm9yc1xuIiwgY3ApOwotCQlkZXZfd2FybihkLCAiY21kICVwIGhhcyBTQ1NJIFN0YXR1cyA9ICV4XG4iLCBjcCwKLQkJCQllaS0+U2NzaVN0YXR1cyk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJTQ1NJIHN0YXR1cyIsIGNwKTsKKwkJaWYgKGVpLT5TY3NpU3RhdHVzID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikKKwkJCWRldl93YXJuKGQsICJTQ1NJIFN0YXR1cyA9IDAyLCBTZW5zZSBrZXkgPSAlMDJ4LCBBU0MgPSAlMDJ4LCBBU0NRID0gJTAyeFxuIiwKKwkJCQlzZFsyXSAmIDB4MGYsIHNkWzEyXSwgc2RbMTNdKTsKKwkJZWxzZQorCQkJZGV2X3dhcm4oZCwgIlNDU0kgU3RhdHVzID0gJTAyeFxuIiwgZWktPlNjc2lTdGF0dXMpOwogCQlpZiAoZWktPlNjc2lTdGF0dXMgPT0gMCkKIAkJCWRldl93YXJuKGQsICJTQ1NJIHN0YXR1cyBpcyBhYm5vcm1hbGx5IHplcm8uICAiCiAJCQkiKHByb2JhYmx5IGluZGljYXRlcyBzZWxlY3Rpb24gdGltZW91dCAiCkBAIC0xNTA4LDU0ICsyMDU0LDUxIEBACiAJCQkiZmlybXdhcmUgYnVnLCBjaXJjYSBKdWx5LCAyMDAxLilcbiIpOwogCQlicmVhazsKIAljYXNlIENNRF9EQVRBX1VOREVSUlVOOiAvKiBsZXQgbWlkIGxheWVyIGhhbmRsZSBpdC4gKi8KLQkJCWRldl9pbmZvKGQsICJVTkRFUlJVTlxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0RBVEFfT1ZFUlJVTjoKLQkJZGV2X3dhcm4oZCwgImNwICVwIGhhcyBjb21wbGV0ZWQgd2l0aCBkYXRhIG92ZXJydW5cbiIsIGNwKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgIm92ZXJydW4gY29uZGl0aW9uIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9JTlZBTElEOiB7CiAJCS8qIGNvbnRyb2xsZXIgdW5mb3J0dW5hdGVseSByZXBvcnRzIFNDU0kgcGFzc3RocnUncwogCQkgKiB0byBub24tZXhpc3RlbnQgdGFyZ2V0cyBhcyBpbnZhbGlkIGNvbW1hbmRzLgogCQkgKi8KLQkJZGV2X3dhcm4oZCwgImNwICVwIGlzIHJlcG9ydGVkIGludmFsaWQgKHByb2JhYmx5IG1lYW5zICIKLQkJCSJ0YXJnZXQgZGV2aWNlIG5vIGxvbmdlciBwcmVzZW50KVxuIiwgY3ApOwotCQkvKiBwcmludF9ieXRlcygodW5zaWduZWQgY2hhciAqKSBjcCwgc2l6ZW9mKCpjcCksIDEsIDApOwotCQlwcmludF9jbWQoY3ApOyAgKi8KKwkJaHBzYV9wcmludF9jbWQoaCwgImludmFsaWQgY29tbWFuZCIsIGNwKTsKKwkJZGV2X3dhcm4oZCwgInByb2JhYmx5IG1lYW5zIGRldmljZSBubyBsb25nZXIgcHJlc2VudFxuIik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDTURfUFJPVE9DT0xfRVJSOgotCQlkZXZfd2FybihkLCAiY3AgJXAgaGFzIHByb3RvY29sIGVycm9yIFxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAicHJvdG9jb2wgZXJyb3IiLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0hBUkRXQVJFX0VSUjoKLQkJLyogY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7ICovCi0JCWRldl93YXJuKGQsICJjcCAlcCBoYWQgaGFyZHdhcmUgZXJyb3JcbiIsIGNwKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgImhhcmR3YXJlIGVycm9yIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9DT05ORUNUSU9OX0xPU1Q6Ci0JCWRldl93YXJuKGQsICJjcCAlcCBoYWQgY29ubmVjdGlvbiBsb3N0XG4iLCBjcCk7CisJCWhwc2FfcHJpbnRfY21kKGgsICJjb25uZWN0aW9uIGxvc3QiLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX0FCT1JURUQ6Ci0JCWRldl93YXJuKGQsICJjcCAlcCB3YXMgYWJvcnRlZFxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAiYWJvcnRlZCIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfQUJPUlRfRkFJTEVEOgotCQlkZXZfd2FybihkLCAiY3AgJXAgcmVwb3J0cyBhYm9ydCBmYWlsZWRcbiIsIGNwKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgImFib3J0IGZhaWxlZCIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6Ci0JCWRldl93YXJuKGQsICJjcCAlcCBhYm9ydGVkIGR1ZSB0byBhbiB1bnNvbGljaXRlZCBhYm9ydFxuIiwgY3ApOworCQlocHNhX3ByaW50X2NtZChoLCAidW5zb2xpY2l0ZWQgYWJvcnQiLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX1RJTUVPVVQ6Ci0JCWRldl93YXJuKGQsICJjcCAlcCB0aW1lZCBvdXRcbiIsIGNwKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgInRpbWVkIG91dCIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfVU5BQk9SVEFCTEU6Ci0JCWRldl93YXJuKGQsICJDb21tYW5kIHVuYWJvcnRhYmxlXG4iKTsKKwkJaHBzYV9wcmludF9jbWQoaCwgInVuYWJvcnRhYmxlIiwgY3ApOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfd2FybihkLCAiY3AgJXAgcmV0dXJuZWQgdW5rbm93biBzdGF0dXMgJXhcbiIsIGNwLAorCQlocHNhX3ByaW50X2NtZChoLCAidW5rbm93biBzdGF0dXMiLCBjcCk7CisJCWRldl93YXJuKGQsICJVbmtub3duIGNvbW1hbmQgc3RhdHVzICV4XG4iLAogCQkJCWVpLT5Db21tYW5kU3RhdHVzKTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgaHBzYV9zY3NpX2RvX2lucXVpcnkoc3RydWN0IGN0bHJfaW5mbyAqaCwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAotCQkJdW5zaWduZWQgY2hhciBwYWdlLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQl1MTYgcGFnZSwgdW5zaWduZWQgY2hhciAqYnVmLAogCQkJdW5zaWduZWQgY2hhciBidWZzaXplKQogewogCWludCByYyA9IElPX09LOwpAQCAtMTU3Nyw3ICsyMTIwLDcgQEAKIAlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF93aXRoX3JldHJ5KGgsIGMsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJZWkgPSBjLT5lcnJfaW5mbzsKIAlpZiAoZWktPkNvbW1hbmRTdGF0dXMgIT0gMCAmJiBlaS0+Q29tbWFuZFN0YXR1cyAhPSBDTURfREFUQV9VTkRFUlJVTikgewotCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGMpOworCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGgsIGMpOwogCQlyYyA9IC0xOwogCX0KIG91dDoKQEAgLTE1ODUsNyArMjEyOCwzOSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBocHNhX3NlbmRfcmVzZXQoc3RydWN0IGN0bHJfaW5mbyAqaCwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyKQorc3RhdGljIGludCBocHNhX2JtaWNfY3RybF9tb2RlX3NlbnNlKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCXVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgdW5zaWduZWQgY2hhciBwYWdlLAorCQlzdHJ1Y3QgYm1pY19jb250cm9sbGVyX3BhcmFtZXRlcnMgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpCit7CisJaW50IHJjID0gSU9fT0s7CisJc3RydWN0IENvbW1hbmRMaXN0ICpjOworCXN0cnVjdCBFcnJvckluZm8gKmVpOworCisJYyA9IGNtZF9zcGVjaWFsX2FsbG9jKGgpOworCisJaWYgKGMgPT0gTlVMTCkgewkJCS8qIHRyb3VibGUuLi4gKi8KKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImNtZF9zcGVjaWFsX2FsbG9jIHJldHVybmVkIE5VTEwhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGZpbGxfY21kKGMsIEJNSUNfU0VOU0VfQ09OVFJPTExFUl9QQVJBTUVURVJTLCBoLCBidWYsIGJ1ZnNpemUsCisJCQlwYWdlLCBzY3NpM2FkZHIsIFRZUEVfQ01EKSkgeworCQlyYyA9IC0xOworCQlnb3RvIG91dDsKKwl9CisJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfd2l0aF9yZXRyeShoLCBjLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWVpID0gYy0+ZXJyX2luZm87CisJaWYgKGVpLT5Db21tYW5kU3RhdHVzICE9IDAgJiYgZWktPkNvbW1hbmRTdGF0dXMgIT0gQ01EX0RBVEFfVU5ERVJSVU4pIHsKKwkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihoLCBjKTsKKwkJcmMgPSAtMTsKKwl9CitvdXQ6CisJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKKwlyZXR1cm4gcmM7CisJfQorCitzdGF0aWMgaW50IGhwc2Ffc2VuZF9yZXNldChzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCisJdTggcmVzZXRfdHlwZSkKIHsKIAlpbnQgcmMgPSBJT19PSzsKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CkBAIC0xNTk5LDE0ICsyMTc0LDE1IEBACiAJfQogCiAJLyogZmlsbF9jbWQgY2FuJ3QgZmFpbCBoZXJlLCBubyBkYXRhIGJ1ZmZlciB0byBtYXAuICovCi0JKHZvaWQpIGZpbGxfY21kKGMsIEhQU0FfREVWSUNFX1JFU0VUX01TRywgaCwKLQkJCU5VTEwsIDAsIDAsIHNjc2kzYWRkciwgVFlQRV9NU0cpOworCSh2b2lkKSBmaWxsX2NtZChjLCBIUFNBX0RFVklDRV9SRVNFVF9NU0csIGgsIE5VTEwsIDAsIDAsCisJCQlzY3NpM2FkZHIsIFRZUEVfTVNHKTsKKwljLT5SZXF1ZXN0LkNEQlsxXSA9IHJlc2V0X3R5cGU7IC8qIGZpbGxfY21kIGRlZmF1bHRzIHRvIExVTiByZXNldCAqLwogCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmUoaCwgYyk7CiAJLyogbm8gdW5tYXAgbmVlZGVkIGhlcmUgYmVjYXVzZSBubyBkYXRhIHhmZXIuICovCiAKIAllaSA9IGMtPmVycl9pbmZvOwogCWlmIChlaS0+Q29tbWFuZFN0YXR1cyAhPSAwKSB7Ci0JCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoYyk7CisJCWhwc2Ffc2NzaV9pbnRlcnByZXRfZXJyb3IoaCwgYyk7CiAJCXJjID0gLTE7CiAJfQogCWNtZF9zcGVjaWFsX2ZyZWUoaCwgYyk7CkBAIC0xNjIzLDcgKzIxOTksNyBAQAogCWJ1ZiA9IGt6YWxsb2MoNjQsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm47Ci0JcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIDB4QzEsIGJ1ZiwgNjQpOworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLCBWUERfUEFHRSB8IDB4QzEsIGJ1ZiwgNjQpOwogCWlmIChyYyA9PSAwKQogCQkqcmFpZF9sZXZlbCA9IGJ1Zls4XTsKIAlpZiAoKnJhaWRfbGV2ZWwgPiBSQUlEX1VOS05PV04pCkBAIC0xNjMyLDYgKzIyMDgsMjA0IEBACiAJcmV0dXJuOwogfQogCisjZGVmaW5lIEhQU0FfTUFQX0RFQlVHCisjaWZkZWYgSFBTQV9NQVBfREVCVUcKK3N0YXRpYyB2b2lkIGhwc2FfZGVidWdfbWFwX2J1ZmYoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IHJjLAorCQkJCXN0cnVjdCByYWlkX21hcF9kYXRhICptYXBfYnVmZikKK3sKKwlzdHJ1Y3QgcmFpZF9tYXBfZGlza19kYXRhICpkZCA9ICZtYXBfYnVmZi0+ZGF0YVswXTsKKwlpbnQgbWFwLCByb3csIGNvbDsKKwl1MTYgbWFwX2NudCwgcm93X2NudCwgZGlza3NfcGVyX3JvdzsKKworCWlmIChyYyAhPSAwKQorCQlyZXR1cm47CisKKwkvKiBTaG93IGRldGFpbHMgb25seSBpZiBkZWJ1Z2dpbmcgaGFzIGJlZW4gYWN0aXZhdGVkLiAqLworCWlmIChoLT5yYWlkX29mZmxvYWRfZGVidWcgPCAyKQorCQlyZXR1cm47CisKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAic3RydWN0dXJlX3NpemUgPSAldVxuIiwKKwkJCQlsZTMyX3RvX2NwdShtYXBfYnVmZi0+c3RydWN0dXJlX3NpemUpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAidm9sdW1lX2Jsa19zaXplID0gJXVcbiIsCisJCQlsZTMyX3RvX2NwdShtYXBfYnVmZi0+dm9sdW1lX2Jsa19zaXplKSk7CisJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgInZvbHVtZV9ibGtfY250ID0gMHglbGx4XG4iLAorCQkJbGU2NF90b19jcHUobWFwX2J1ZmYtPnZvbHVtZV9ibGtfY250KSk7CisJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgInBoeXNpY2FsQmxvY2tTaGlmdCA9ICV1XG4iLAorCQkJbWFwX2J1ZmYtPnBoeXNfYmxrX3NoaWZ0KTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAicGFyaXR5X3JvdGF0aW9uX3NoaWZ0ID0gJXVcbiIsCisJCQltYXBfYnVmZi0+cGFyaXR5X3JvdGF0aW9uX3NoaWZ0KTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAic3RyaXBfc2l6ZSA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPnN0cmlwX3NpemUpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiZGlza19zdGFydGluZ19ibGsgPSAweCVsbHhcbiIsCisJCQlsZTY0X3RvX2NwdShtYXBfYnVmZi0+ZGlza19zdGFydGluZ19ibGspKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiZGlza19ibGtfY250ID0gMHglbGx4XG4iLAorCQkJbGU2NF90b19jcHUobWFwX2J1ZmYtPmRpc2tfYmxrX2NudCkpOworCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJkYXRhX2Rpc2tzX3Blcl9yb3cgPSAldVxuIiwKKwkJCWxlMTZfdG9fY3B1KG1hcF9idWZmLT5kYXRhX2Rpc2tzX3Blcl9yb3cpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAibWV0YWRhdGFfZGlza3NfcGVyX3JvdyA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPm1ldGFkYXRhX2Rpc2tzX3Blcl9yb3cpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAicm93X2NudCA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPnJvd19jbnQpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAibGF5b3V0X21hcF9jb3VudCA9ICV1XG4iLAorCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPmxheW91dF9tYXBfY291bnQpKTsKKwlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiZmxhZ3MgPSAldVxuIiwKKwkJCWxlMTZfdG9fY3B1KG1hcF9idWZmLT5mbGFncykpOworCWlmIChtYXBfYnVmZi0+ZmxhZ3MgJiBSQUlEX01BUF9GTEFHX0VOQ1JZUFRfT04pCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJlbmNyeXB5dGlvbiA9IE9OXG4iKTsKKwllbHNlCisJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJlbmNyeXB5dGlvbiA9IE9GRlxuIik7CisJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwgImRla2luZGV4ID0gJXVcbiIsCisJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+ZGVraW5kZXgpKTsKKworCW1hcF9jbnQgPSBsZTE2X3RvX2NwdShtYXBfYnVmZi0+bGF5b3V0X21hcF9jb3VudCk7CisJZm9yIChtYXAgPSAwOyBtYXAgPCBtYXBfY250OyBtYXArKykgeworCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiTWFwJXU6XG4iLCBtYXApOworCQlyb3dfY250ID0gbGUxNl90b19jcHUobWFwX2J1ZmYtPnJvd19jbnQpOworCQlmb3IgKHJvdyA9IDA7IHJvdyA8IHJvd19jbnQ7IHJvdysrKSB7CisJCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiICBSb3cldTpcbiIsIHJvdyk7CisJCQlkaXNrc19wZXJfcm93ID0KKwkJCQlsZTE2X3RvX2NwdShtYXBfYnVmZi0+ZGF0YV9kaXNrc19wZXJfcm93KTsKKwkJCWZvciAoY29sID0gMDsgY29sIDwgZGlza3NfcGVyX3JvdzsgY29sKyssIGRkKyspCisJCQkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCQkJIiAgICBEJTAydTogaD0weCUwNHggeG9yPSV1LCV1XG4iLAorCQkJCQljb2wsIGRkLT5pb2FjY2VsX2hhbmRsZSwKKwkJCQkJZGQtPnhvcl9tdWx0WzBdLCBkZC0+eG9yX211bHRbMV0pOworCQkJZGlza3NfcGVyX3JvdyA9CisJCQkJbGUxNl90b19jcHUobWFwX2J1ZmYtPm1ldGFkYXRhX2Rpc2tzX3Blcl9yb3cpOworCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBkaXNrc19wZXJfcm93OyBjb2wrKywgZGQrKykKKwkJCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJCQkiICAgIE0lMDJ1OiBoPTB4JTA0eCB4b3I9JXUsJXVcbiIsCisJCQkJCWNvbCwgZGQtPmlvYWNjZWxfaGFuZGxlLAorCQkJCQlkZC0+eG9yX211bHRbMF0sIGRkLT54b3JfbXVsdFsxXSk7CisJCX0KKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaHBzYV9kZWJ1Z19tYXBfYnVmZihfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQkJX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IHJjLAorCQkJX19hdHRyaWJ1dGVfXygodW51c2VkKSkgc3RydWN0IHJhaWRfbWFwX2RhdGEgKm1hcF9idWZmKQoreworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaHBzYV9nZXRfcmFpZF9tYXAoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwl1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsIHN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKnRoaXNfZGV2aWNlKQoreworCWludCByYyA9IDA7CisJc3RydWN0IENvbW1hbmRMaXN0ICpjOworCXN0cnVjdCBFcnJvckluZm8gKmVpOworCisJYyA9IGNtZF9zcGVjaWFsX2FsbG9jKGgpOworCWlmIChjID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImNtZF9zcGVjaWFsX2FsbG9jIHJldHVybmVkIE5VTEwhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChmaWxsX2NtZChjLCBIUFNBX0dFVF9SQUlEX01BUCwgaCwgJnRoaXNfZGV2aWNlLT5yYWlkX21hcCwKKwkJCXNpemVvZih0aGlzX2RldmljZS0+cmFpZF9tYXApLCAwLAorCQkJc2NzaTNhZGRyLCBUWVBFX0NNRCkpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIk91dCBvZiBtZW1vcnkgaW4gaHBzYV9nZXRfcmFpZF9tYXAoKVxuIik7CisJCWNtZF9zcGVjaWFsX2ZyZWUoaCwgYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF93aXRoX3JldHJ5KGgsIGMsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZWkgPSBjLT5lcnJfaW5mbzsKKwlpZiAoZWktPkNvbW1hbmRTdGF0dXMgIT0gMCAmJiBlaS0+Q29tbWFuZFN0YXR1cyAhPSBDTURfREFUQV9VTkRFUlJVTikgeworCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGgsIGMpOworCQljbWRfc3BlY2lhbF9mcmVlKGgsIGMpOworCQlyZXR1cm4gLTE7CisJfQorCWNtZF9zcGVjaWFsX2ZyZWUoaCwgYyk7CisKKwkvKiBAdG9kbyBpbiB0aGUgZnV0dXJlLCBkeW5hbWljYWxseSBhbGxvY2F0ZSBSQUlEIG1hcCBtZW1vcnkgKi8KKwlpZiAobGUzMl90b19jcHUodGhpc19kZXZpY2UtPnJhaWRfbWFwLnN0cnVjdHVyZV9zaXplKSA+CisJCQkJc2l6ZW9mKHRoaXNfZGV2aWNlLT5yYWlkX21hcCkpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIlJBSUQgbWFwIHNpemUgaXMgdG9vIGxhcmdlIVxuIik7CisJCXJjID0gLTE7CisJfQorCWhwc2FfZGVidWdfbWFwX2J1ZmYoaCwgcmMsICZ0aGlzX2RldmljZS0+cmFpZF9tYXApOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBocHNhX3ZwZF9wYWdlX3N1cHBvcnRlZChzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10sIHU4IHBhZ2UpCit7CisJaW50IHJjOworCWludCBpOworCWludCBwYWdlczsKKwl1bnNpZ25lZCBjaGFyICpidWYsIGJ1ZnNpemU7CisKKwlidWYgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAwOworCisJLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwYWdlIGxpc3QgZmlyc3QgKi8KKwlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwKKwkJCQlWUERfUEFHRSB8IEhQU0FfVlBEX1NVUFBPUlRFRF9QQUdFUywKKwkJCQlidWYsIEhQU0FfVlBEX0hFQURFUl9TWik7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZXhpdF91bnN1cHBvcnRlZDsKKwlwYWdlcyA9IGJ1ZlszXTsKKwlpZiAoKHBhZ2VzICsgSFBTQV9WUERfSEVBREVSX1NaKSA8PSAyNTUpCisJCWJ1ZnNpemUgPSBwYWdlcyArIEhQU0FfVlBEX0hFQURFUl9TWjsKKwllbHNlCisJCWJ1ZnNpemUgPSAyNTU7CisKKwkvKiBHZXQgdGhlIHdob2xlIFZQRCBwYWdlIGxpc3QgKi8KKwlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwKKwkJCQlWUERfUEFHRSB8IEhQU0FfVlBEX1NVUFBPUlRFRF9QQUdFUywKKwkJCQlidWYsIGJ1ZnNpemUpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIGV4aXRfdW5zdXBwb3J0ZWQ7CisKKwlwYWdlcyA9IGJ1ZlszXTsKKwlmb3IgKGkgPSAxOyBpIDw9IHBhZ2VzOyBpKyspCisJCWlmIChidWZbMyArIGldID09IHBhZ2UpCisJCQlnb3RvIGV4aXRfc3VwcG9ydGVkOworZXhpdF91bnN1cHBvcnRlZDoKKwlrZnJlZShidWYpOworCXJldHVybiAwOworZXhpdF9zdXBwb3J0ZWQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaHBzYV9nZXRfaW9hY2NlbF9zdGF0dXMoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwl1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsIHN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKnRoaXNfZGV2aWNlKQoreworCWludCByYzsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdTggaW9hY2NlbF9zdGF0dXM7CisKKwl0aGlzX2RldmljZS0+b2ZmbG9hZF9jb25maWcgPSAwOworCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPSAwOworCisJYnVmID0ga3phbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKwlpZiAoIWhwc2FfdnBkX3BhZ2Vfc3VwcG9ydGVkKGgsIHNjc2kzYWRkciwgSFBTQV9WUERfTFZfSU9BQ0NFTF9TVEFUVVMpKQorCQlnb3RvIG91dDsKKwlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwKKwkJCVZQRF9QQUdFIHwgSFBTQV9WUERfTFZfSU9BQ0NFTF9TVEFUVVMsIGJ1ZiwgNjQpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dDsKKworI2RlZmluZSBJT0FDQ0VMX1NUQVRVU19CWVRFIDQKKyNkZWZpbmUgT0ZGTE9BRF9DT05GSUdVUkVEX0JJVCAweDAxCisjZGVmaW5lIE9GRkxPQURfRU5BQkxFRF9CSVQgMHgwMgorCWlvYWNjZWxfc3RhdHVzID0gYnVmW0lPQUNDRUxfU1RBVFVTX0JZVEVdOworCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2NvbmZpZyA9CisJCSEhKGlvYWNjZWxfc3RhdHVzICYgT0ZGTE9BRF9DT05GSUdVUkVEX0JJVCk7CisJaWYgKHRoaXNfZGV2aWNlLT5vZmZsb2FkX2NvbmZpZykgeworCQl0aGlzX2RldmljZS0+b2ZmbG9hZF9lbmFibGVkID0KKwkJCSEhKGlvYWNjZWxfc3RhdHVzICYgT0ZGTE9BRF9FTkFCTEVEX0JJVCk7CisJCWlmIChocHNhX2dldF9yYWlkX21hcChoLCBzY3NpM2FkZHIsIHRoaXNfZGV2aWNlKSkKKwkJCXRoaXNfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPSAwOworCX0KK291dDoKKwlrZnJlZShidWYpOworCXJldHVybjsKK30KKwogLyogR2V0IHRoZSBkZXZpY2UgaWQgZnJvbSBpbnF1aXJ5IHBhZ2UgMHg4MyAqLwogc3RhdGljIGludCBocHNhX2dldF9kZXZpY2VfaWQoc3RydWN0IGN0bHJfaW5mbyAqaCwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAogCXVuc2lnbmVkIGNoYXIgKmRldmljZV9pZCwgaW50IGJ1ZmxlbikKQEAgLTE2NDQsNyArMjQxOCw3IEBACiAJYnVmID0ga3phbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtMTsKLQlyYyA9IGhwc2Ffc2NzaV9kb19pbnF1aXJ5KGgsIHNjc2kzYWRkciwgMHg4MywgYnVmLCA2NCk7CisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgMHg4MywgYnVmLCA2NCk7CiAJaWYgKHJjID09IDApCiAJCW1lbWNweShkZXZpY2VfaWQsICZidWZbOF0sIGJ1Zmxlbik7CiAJa2ZyZWUoYnVmKTsKQEAgLTE2NzgsOCArMjQ1MiwxNiBAQAogCWVpID0gYy0+ZXJyX2luZm87CiAJaWYgKGVpLT5Db21tYW5kU3RhdHVzICE9IDAgJiYKIAkgICAgZWktPkNvbW1hbmRTdGF0dXMgIT0gQ01EX0RBVEFfVU5ERVJSVU4pIHsKLQkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihjKTsKKwkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihoLCBjKTsKIAkJcmMgPSAtMTsKKwl9IGVsc2UgeworCQlpZiAoYnVmLT5leHRlbmRlZF9yZXNwb25zZV9mbGFnICE9IGV4dGVuZGVkX3Jlc3BvbnNlKSB7CisJCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsCisJCQkJInJlcG9ydCBsdW5zIHJlcXVlc3RlZCBmb3JtYXQgJXUsIGdvdCAldVxuIiwKKwkJCQlleHRlbmRlZF9yZXNwb25zZSwKKwkJCQlidWYtPmV4dGVuZGVkX3Jlc3BvbnNlX2ZsYWcpOworCQkJcmMgPSAtMTsKKwkJfQogCX0KIG91dDoKIAljbWRfc3BlY2lhbF9mcmVlKGgsIGMpOwpAQCAtMTcwNyw2ICsyNDg5LDExNyBAQAogCWRldmljZS0+bHVuID0gbHVuOwogfQogCisvKiBVc2UgVlBEIGlucXVpcnkgdG8gZ2V0IGRldGFpbHMgb2Ygdm9sdW1lIHN0YXR1cyAqLworc3RhdGljIGludCBocHNhX2dldF92b2x1bWVfc3RhdHVzKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJCQkJCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10pCit7CisJaW50IHJjOworCWludCBzdGF0dXM7CisJaW50IHNpemU7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJYnVmID0ga3phbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiBIUFNBX1ZQRF9MVl9TVEFUVVNfVU5TVVBQT1JURUQ7CisKKwkvKiBEb2VzIGNvbnRyb2xsZXIgaGF2ZSBWUEQgZm9yIGxvZ2ljYWwgdm9sdW1lIHN0YXR1cz8gKi8KKwlpZiAoIWhwc2FfdnBkX3BhZ2Vfc3VwcG9ydGVkKGgsIHNjc2kzYWRkciwgSFBTQV9WUERfTFZfU1RBVFVTKSkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiTG9naWNhbCB2b2x1bWUgc3RhdHVzIFZQRCBwYWdlIGlzIHVuc3VwcG9ydGVkLlxuIik7CisJCWdvdG8gZXhpdF9mYWlsZWQ7CisJfQorCisJLyogR2V0IHRoZSBzaXplIG9mIHRoZSBWUEQgcmV0dXJuIGJ1ZmZlciAqLworCXJjID0gaHBzYV9zY3NpX2RvX2lucXVpcnkoaCwgc2NzaTNhZGRyLCBWUERfUEFHRSB8IEhQU0FfVlBEX0xWX1NUQVRVUywKKwkJCQkJYnVmLCBIUFNBX1ZQRF9IRUFERVJfU1opOworCWlmIChyYyAhPSAwKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJMb2dpY2FsIHZvbHVtZSBzdGF0dXMgVlBEIGlucXVpcnkgZmFpbGVkLlxuIik7CisJCWdvdG8gZXhpdF9mYWlsZWQ7CisJfQorCXNpemUgPSBidWZbM107CisKKwkvKiBOb3cgZ2V0IHRoZSB3aG9sZSBWUEQgYnVmZmVyICovCisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgSFBTQV9WUERfTFZfU1RBVFVTLAorCQkJCQlidWYsIHNpemUgKyBIUFNBX1ZQRF9IRUFERVJfU1opOworCWlmIChyYyAhPSAwKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJMb2dpY2FsIHZvbHVtZSBzdGF0dXMgVlBEIGlucXVpcnkgZmFpbGVkLlxuIik7CisJCWdvdG8gZXhpdF9mYWlsZWQ7CisJfQorCXN0YXR1cyA9IGJ1Zls0XTsgLyogc3RhdHVzIGJ5dGUgKi8KKworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHN0YXR1czsKK2V4aXRfZmFpbGVkOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIEhQU0FfVlBEX0xWX1NUQVRVU19VTlNVUFBPUlRFRDsKK30KKworLyogRGV0ZXJtaW5lIG9mZmxpbmUgc3RhdHVzIG9mIGEgdm9sdW1lLgorICogUmV0dXJuIGVpdGhlcjoKKyAqICAwIChub3Qgb2ZmbGluZSkKKyAqIC0xIChvZmZsaW5lIGZvciB1bmtub3duIHJlYXNvbnMpCisgKiAgIyAoaW50ZWdlciBjb2RlIGluZGljYXRpbmcgb25lIG9mIHNldmVyYWwgTk9UIFJFQURZIHN0YXRlcworICogICAgIGRlc2NyaWJpbmcgd2h5IGEgdm9sdW1lIGlzIHRvIGJlIGtlcHQgb2ZmbGluZSkKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgaHBzYV92b2x1bWVfb2ZmbGluZShzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCQkJCQl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcltdKQoreworCXN0cnVjdCBDb21tYW5kTGlzdCAqYzsKKwl1bnNpZ25lZCBjaGFyICpzZW5zZSwgc2Vuc2Vfa2V5LCBhc2MsIGFzY3E7CisJaW50IGxkc3RhdCA9IDA7CisJdTE2IGNtZF9zdGF0dXM7CisJdTggc2NzaV9zdGF0dXM7CisjZGVmaW5lIEFTQ19MVU5fTk9UX1JFQURZIDB4MDQKKyNkZWZpbmUgQVNDUV9MVU5fTk9UX1JFQURZX0ZPUk1BVF9JTl9QUk9HUkVTUyAweDA0CisjZGVmaW5lIEFTQ1FfTFVOX05PVF9SRUFEWV9JTklUSUFMSVpJTkdfQ01EX1JFUSAweDAyCisKKwljID0gY21kX2FsbG9jKGgpOworCWlmICghYykKKwkJcmV0dXJuIDA7CisJKHZvaWQpIGZpbGxfY21kKGMsIFRFU1RfVU5JVF9SRUFEWSwgaCwgTlVMTCwgMCwgMCwgc2NzaTNhZGRyLCBUWVBFX0NNRCk7CisJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKKwlzZW5zZSA9IGMtPmVycl9pbmZvLT5TZW5zZUluZm87CisJc2Vuc2Vfa2V5ID0gc2Vuc2VbMl07CisJYXNjID0gc2Vuc2VbMTJdOworCWFzY3EgPSBzZW5zZVsxM107CisJY21kX3N0YXR1cyA9IGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzOworCXNjc2lfc3RhdHVzID0gYy0+ZXJyX2luZm8tPlNjc2lTdGF0dXM7CisJY21kX2ZyZWUoaCwgYyk7CisJLyogSXMgdGhlIHZvbHVtZSAnbm90IHJlYWR5Jz8gKi8KKwlpZiAoY21kX3N0YXR1cyAhPSBDTURfVEFSR0VUX1NUQVRVUyB8fAorCQlzY3NpX3N0YXR1cyAhPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04gfHwKKwkJc2Vuc2Vfa2V5ICE9IE5PVF9SRUFEWSB8fAorCQlhc2MgIT0gQVNDX0xVTl9OT1RfUkVBRFkpICB7CisJCXJldHVybiAwOworCX0KKworCS8qIERldGVybWluZSB0aGUgcmVhc29uIGZvciBub3QgcmVhZHkgc3RhdGUgKi8KKwlsZHN0YXQgPSBocHNhX2dldF92b2x1bWVfc3RhdHVzKGgsIHNjc2kzYWRkcik7CisKKwkvKiBLZWVwIHZvbHVtZSBvZmZsaW5lIGluIGNlcnRhaW4gY2FzZXM6ICovCisJc3dpdGNoIChsZHN0YXQpIHsKKwljYXNlIEhQU0FfTFZfVU5ERVJHT0lOR19FUkFTRToKKwljYXNlIEhQU0FfTFZfVU5ERVJHT0lOR19SUEk6CisJY2FzZSBIUFNBX0xWX1BFTkRJTkdfUlBJOgorCWNhc2UgSFBTQV9MVl9FTkNSWVBURURfTk9fS0VZOgorCWNhc2UgSFBTQV9MVl9QTEFJTlRFWFRfSU5fRU5DUllQVF9PTkxZX0NPTlRST0xMRVI6CisJY2FzZSBIUFNBX0xWX1VOREVSR09JTkdfRU5DUllQVElPTjoKKwljYXNlIEhQU0FfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OX1JFS0VZSU5HOgorCWNhc2UgSFBTQV9MVl9FTkNSWVBURURfSU5fTk9OX0VOQ1JZUFRFRF9DT05UUk9MTEVSOgorCQlyZXR1cm4gbGRzdGF0OworCWNhc2UgSFBTQV9WUERfTFZfU1RBVFVTX1VOU1VQUE9SVEVEOgorCQkvKiBJZiBWUEQgc3RhdHVzIHBhZ2UgaXNuJ3QgYXZhaWxhYmxlLAorCQkgKiB1c2UgQVNDL0FTQ1EgdG8gZGV0ZXJtaW5lIHN0YXRlCisJCSAqLworCQlpZiAoKGFzY3EgPT0gQVNDUV9MVU5fTk9UX1JFQURZX0ZPUk1BVF9JTl9QUk9HUkVTUykgfHwKKwkJCShhc2NxID09IEFTQ1FfTFVOX05PVF9SRUFEWV9JTklUSUFMSVpJTkdfQ01EX1JFUSkpCisJCQlyZXR1cm4gbGRzdGF0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaHBzYV91cGRhdGVfZGV2aWNlX2luZm8oc3RydWN0IGN0bHJfaW5mbyAqaCwKIAl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcltdLCBzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICp0aGlzX2RldmljZSwKIAl1bnNpZ25lZCBjaGFyICppc19PQkRSX2RldmljZSkKQEAgLTE3NDUsMTAgKzI2MzgsMTggQEAKIAkJc2l6ZW9mKHRoaXNfZGV2aWNlLT5kZXZpY2VfaWQpKTsKIAogCWlmICh0aGlzX2RldmljZS0+ZGV2dHlwZSA9PSBUWVBFX0RJU0sgJiYKLQkJaXNfbG9naWNhbF9kZXZfYWRkcl9tb2RlKHNjc2kzYWRkcikpCisJCWlzX2xvZ2ljYWxfZGV2X2FkZHJfbW9kZShzY3NpM2FkZHIpKSB7CiAJCWhwc2FfZ2V0X3JhaWRfbGV2ZWwoaCwgc2NzaTNhZGRyLCAmdGhpc19kZXZpY2UtPnJhaWRfbGV2ZWwpOwotCWVsc2UKKwkJaWYgKGgtPmZ3X3N1cHBvcnQgJiBNSVNDX0ZXX1JBSURfT0ZGTE9BRF9CQVNJQykKKwkJCWhwc2FfZ2V0X2lvYWNjZWxfc3RhdHVzKGgsIHNjc2kzYWRkciwgdGhpc19kZXZpY2UpOworCQl0aGlzX2RldmljZS0+dm9sdW1lX29mZmxpbmUgPQorCQkJaHBzYV92b2x1bWVfb2ZmbGluZShoLCBzY3NpM2FkZHIpOworCX0gZWxzZSB7CiAJCXRoaXNfZGV2aWNlLT5yYWlkX2xldmVsID0gUkFJRF9VTktOT1dOOworCQl0aGlzX2RldmljZS0+b2ZmbG9hZF9jb25maWcgPSAwOworCQl0aGlzX2RldmljZS0+b2ZmbG9hZF9lbmFibGVkID0gMDsKKwkJdGhpc19kZXZpY2UtPnZvbHVtZV9vZmZsaW5lID0gMDsKKwl9CiAKIAlpZiAoaXNfT0JEUl9kZXZpY2UpIHsKIAkJLyogU2VlIGlmIHRoaXMgaXMgYSBPbmUtQnV0dG9uLURpc2FzdGVyLVJlY292ZXJ5IGRldmljZQpAQCAtMTg3OCw2ICsyNzc5LDEwNSBAQAogfQogCiAvKgorICogR2V0IGFkZHJlc3Mgb2YgcGh5c2ljYWwgZGlzayB1c2VkIGZvciBhbiBpb2FjY2VsMiBtb2RlIGNvbW1hbmQ6CisgKgkxLiBFeHRyYWN0IGlvYWNjZWwyIGhhbmRsZSBmcm9tIHRoZSBjb21tYW5kLgorICoJMi4gRmluZCBhIG1hdGNoaW5nIGlvYWNjZWwyIGhhbmRsZSBmcm9tIGxpc3Qgb2YgcGh5c2ljYWwgZGlza3MuCisgKgkzLiBSZXR1cm46CisgKgkJMSBhbmQgc2V0IHNjc2kzYWRkciB0byBhZGRyZXNzIG9mIG1hdGNoaW5nIHBoeXNpY2FsCisgKgkJMCBpZiBubyBtYXRjaGluZyBwaHlzaWNhbCBkaXNrIHdhcyBmb3VuZC4KKyAqLworc3RhdGljIGludCBocHNhX2dldF9wZGlza19vZl9pb2FjY2VsMihzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXN0cnVjdCBDb21tYW5kTGlzdCAqaW9hY2NlbDJfY21kX3RvX2Fib3J0LCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIpCit7CisJc3RydWN0IFJlcG9ydEV4dGVuZGVkTFVOZGF0YSAqcGh5c2ljYWxzID0gTlVMTDsKKwlpbnQgcmVzcG9uc2VzaXplID0gMjQ7CS8qIHNpemUgb2YgcGh5c2ljYWwgZXh0ZW5kZWQgcmVzcG9uc2UgKi8KKwlpbnQgZXh0ZW5kZWQgPSAyOwkvKiBmbGFnIGZvcmNlcyByZXBvcnRpbmcgJ290aGVyIGRldiBpbmZvJy4gKi8KKwlpbnQgcmVwb3J0c2l6ZSA9IHNpemVvZigqcGh5c2ljYWxzKSArIEhQU0FfTUFYX1BIWVNfTFVOICogcmVzcG9uc2VzaXplOworCXUzMiBucGh5c2ljYWxzID0gMDsJLyogbnVtYmVyIG9mIHJlcG9ydGVkIHBoeXNpY2FsIGRldnMgKi8KKwlpbnQgZm91bmQgPSAwOwkJLyogZm91bmQgbWF0Y2ggKDEpIG9yIG5vdCAoMCkgKi8KKwl1MzIgZmluZDsJCS8qIGhhbmRsZSB3ZSBuZWVkIHRvIG1hdGNoICovCisJaW50IGk7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsJLyogc2NzaSBjb21tYW5kIHdpdGhpbiByZXF1ZXN0IGJlaW5nIGFib3J0ZWQgKi8KKwlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpkOyAvKiBkZXZpY2Ugb2YgcmVxdWVzdCBiZWluZyBhYm9ydGVkICovCisJc3RydWN0IGlvX2FjY2VsMl9jbWQgKmMyYTsgLyogaW9hY2NlbDIgY29tbWFuZCB0byBhYm9ydCAqLworCXUzMiBpdF9uZXh1czsJCS8qIDQgYnl0ZSBkZXZpY2UgaGFuZGxlIGZvciB0aGUgaW9hY2NlbDIgY21kICovCisJdTMyIHNjc2lfbmV4dXM7CQkvKiA0IGJ5dGUgZGV2aWNlIGhhbmRsZSBmb3IgdGhlIGlvYWNjZWwyIGNtZCAqLworCisJaWYgKGlvYWNjZWwyX2NtZF90b19hYm9ydC0+Y21kX3R5cGUgIT0gQ01EX0lPQUNDRUwyKQorCQlyZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KKworCS8qIHBvaW50IHRvIHRoZSBpb2FjY2VsMiBkZXZpY2UgaGFuZGxlICovCisJYzJhID0gJmgtPmlvYWNjZWwyX2NtZF9wb29sW2lvYWNjZWwyX2NtZF90b19hYm9ydC0+Y21kaW5kZXhdOworCWlmIChjMmEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIG5vIG1hdGNoICovCisKKwlzY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaW9hY2NlbDJfY21kX3RvX2Fib3J0LT5zY3NpX2NtZDsKKwlpZiAoc2NtZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KKworCWQgPSBzY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCWlmIChkID09IE5VTEwpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCisJaXRfbmV4dXMgPSBjcHVfdG9fbGUzMigodTMyKSBkLT5pb2FjY2VsX2hhbmRsZSk7CisJc2NzaV9uZXh1cyA9IGNwdV90b19sZTMyKCh1MzIpIGMyYS0+c2NzaV9uZXh1cyk7CisJZmluZCA9IGMyYS0+c2NzaV9uZXh1czsKKworCWlmIChoLT5yYWlkX29mZmxvYWRfZGVidWcgPiAwKQorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIiVzOiBzY3NpX25leHVzOjB4JTA4eCBkZXZpY2UgaWQ6IDB4JTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCV9fZnVuY19fLCBzY3NpX25leHVzLAorCQkJZC0+ZGV2aWNlX2lkWzBdLCBkLT5kZXZpY2VfaWRbMV0sIGQtPmRldmljZV9pZFsyXSwKKwkJCWQtPmRldmljZV9pZFszXSwgZC0+ZGV2aWNlX2lkWzRdLCBkLT5kZXZpY2VfaWRbNV0sCisJCQlkLT5kZXZpY2VfaWRbNl0sIGQtPmRldmljZV9pZFs3XSwgZC0+ZGV2aWNlX2lkWzhdLAorCQkJZC0+ZGV2aWNlX2lkWzldLCBkLT5kZXZpY2VfaWRbMTBdLCBkLT5kZXZpY2VfaWRbMTFdLAorCQkJZC0+ZGV2aWNlX2lkWzEyXSwgZC0+ZGV2aWNlX2lkWzEzXSwgZC0+ZGV2aWNlX2lkWzE0XSwKKwkJCWQtPmRldmljZV9pZFsxNV0pOworCisJLyogR2V0IHRoZSBsaXN0IG9mIHBoeXNpY2FsIGRldmljZXMgKi8KKwlwaHlzaWNhbHMgPSBremFsbG9jKHJlcG9ydHNpemUsIEdGUF9LRVJORUwpOworCWlmIChocHNhX3Njc2lfZG9fcmVwb3J0X3BoeXNfbHVucyhoLCAoc3RydWN0IFJlcG9ydExVTmRhdGEgKikgcGh5c2ljYWxzLAorCQlyZXBvcnRzaXplLCBleHRlbmRlZCkpIHsKKwkJZGV2X2VycigmaC0+cGRldi0+ZGV2LAorCQkJIkNhbid0IGxvb2t1cCAlcyBkZXZpY2UgaGFuZGxlOiByZXBvcnQgcGh5c2ljYWwgTFVOcyBmYWlsZWQuXG4iLAorCQkJIkhQIFNTRCBTbWFydCBQYXRoIik7CisJCWtmcmVlKHBoeXNpY2Fscyk7CisJCXJldHVybiAwOworCX0KKwlucGh5c2ljYWxzID0gYmUzMl90b19jcHUoKigoX19iZTMyICopcGh5c2ljYWxzLT5MVU5MaXN0TGVuZ3RoKSkgLworCQkJCQkJCXJlc3BvbnNlc2l6ZTsKKworCisJLyogZmluZCBpb2FjY2VsMiBoYW5kbGUgaW4gbGlzdCBvZiBwaHlzaWNhbHM6ICovCisJZm9yIChpID0gMDsgaSA8IG5waHlzaWNhbHM7IGkrKykgeworCQkvKiBoYW5kbGUgaXMgaW4gYnl0ZXMgMjgtMzEgb2YgZWFjaCBsdW4gKi8KKwkJaWYgKG1lbWNtcCgmKChzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICopCisJCQkJcGh5c2ljYWxzKS0+TFVOW2ldWzIwXSwgJmZpbmQsIDQpICE9IDApIHsKKwkJCWNvbnRpbnVlOyAvKiBkaWRuJ3QgbWF0Y2ggKi8KKwkJfQorCQlmb3VuZCA9IDE7CisJCW1lbWNweShzY3NpM2FkZHIsICYoKHN0cnVjdCBSZXBvcnRFeHRlbmRlZExVTmRhdGEgKikKKwkJCQkJcGh5c2ljYWxzKS0+TFVOW2ldWzBdLCA4KTsKKwkJaWYgKGgtPnJhaWRfb2ZmbG9hZF9kZWJ1ZyA+IDApCisJCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJCSIlczogU2VhcmNoZWQgaD0weCUwOHgsIEZvdW5kIGg9MHglMDh4LCBzY3NpYWRkciAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJCV9fZnVuY19fLCBmaW5kLAorCQkJCSgoc3RydWN0IFJlcG9ydEV4dGVuZGVkTFVOZGF0YSAqKQorCQkJCQlwaHlzaWNhbHMpLT5MVU5baV1bMjBdLAorCQkJCXNjc2kzYWRkclswXSwgc2NzaTNhZGRyWzFdLCBzY3NpM2FkZHJbMl0sCisJCQkJc2NzaTNhZGRyWzNdLCBzY3NpM2FkZHJbNF0sIHNjc2kzYWRkcls1XSwKKwkJCQlzY3NpM2FkZHJbNl0sIHNjc2kzYWRkcls3XSk7CisJCWJyZWFrOyAvKiBmb3VuZCBpdCAqLworCX0KKworCWtmcmVlKHBoeXNpY2Fscyk7CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworCit9CisvKgogICogRG8gQ0lTU19SRVBPUlRfUEhZUyBhbmQgQ0lTU19SRVBPUlRfTE9HLiAgRGF0YSBpcyByZXR1cm5lZCBpbiBwaHlzZGV2LAogICogbG9nZGV2LiAgVGhlIG51bWJlciBvZiBsdW5zIGluIHBoeXNkZXYgYW5kIGxvZ2RldiBhcmUgcmV0dXJuZWQgaW4KICAqICpucGh5c2ljYWxzIGFuZCAqbmxvZ2ljYWxzLCByZXNwZWN0aXZlbHkuCkBAIC0xODg1LDE0ICsyODg1LDI2IEBACiAgKi8KIHN0YXRpYyBpbnQgaHBzYV9nYXRoZXJfbHVuX2luZm8oc3RydWN0IGN0bHJfaW5mbyAqaCwKIAlpbnQgcmVwb3J0bHVuc2l6ZSwKLQlzdHJ1Y3QgUmVwb3J0TFVOZGF0YSAqcGh5c2RldiwgdTMyICpucGh5c2ljYWxzLAorCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpwaHlzZGV2LCB1MzIgKm5waHlzaWNhbHMsIGludCAqcGh5c2ljYWxfbW9kZSwKIAlzdHJ1Y3QgUmVwb3J0TFVOZGF0YSAqbG9nZGV2LCB1MzIgKm5sb2dpY2FscykKIHsKLQlpZiAoaHBzYV9zY3NpX2RvX3JlcG9ydF9waHlzX2x1bnMoaCwgcGh5c2RldiwgcmVwb3J0bHVuc2l6ZSwgMCkpIHsKKwlpbnQgcGh5c2ljYWxfZW50cnlfc2l6ZSA9IDg7CisKKwkqcGh5c2ljYWxfbW9kZSA9IDA7CisKKwkvKiBGb3IgSS9PIGFjY2VsZXJhdG9yIG1vZGUgd2UgbmVlZCB0byByZWFkIHBoeXNpY2FsIGRldmljZSBoYW5kbGVzICovCisJaWYgKGgtPnRyYW5zTWV0aG9kICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSB8fAorCQloLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDIpIHsKKwkJKnBoeXNpY2FsX21vZGUgPSBIUFNBX1JFUE9SVF9QSFlTX0VYVEVOREVEOworCQlwaHlzaWNhbF9lbnRyeV9zaXplID0gMjQ7CisJfQorCWlmIChocHNhX3Njc2lfZG9fcmVwb3J0X3BoeXNfbHVucyhoLCBwaHlzZGV2LCByZXBvcnRsdW5zaXplLAorCQkJCQkJCSpwaHlzaWNhbF9tb2RlKSkgewogCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsICJyZXBvcnQgcGh5c2ljYWwgTFVOcyBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KLQkqbnBoeXNpY2FscyA9IGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKXBoeXNkZXYtPkxVTkxpc3RMZW5ndGgpKSAvIDg7CisJKm5waHlzaWNhbHMgPSBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKilwaHlzZGV2LT5MVU5MaXN0TGVuZ3RoKSkgLworCQkJCQkJCXBoeXNpY2FsX2VudHJ5X3NpemU7CiAJaWYgKCpucGh5c2ljYWxzID4gSFBTQV9NQVhfUEhZU19MVU4pIHsKIAkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm1heGltdW0gcGh5c2ljYWwgTFVOcyAoJWQpIGV4Y2VlZGVkLiIKIAkJCSIgICVkIExVTnMgaWdub3JlZC5cbiIsIEhQU0FfTUFYX1BIWVNfTFVOLApAQCAtMTkyMyw3ICsyOTM1LDggQEAKIH0KIAogdTggKmZpZ3VyZV9sdW5hZGRyYnl0ZXMoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IHJhaWRfY3Rscl9wb3NpdGlvbiwgaW50IGksCi0JaW50IG5waHlzaWNhbHMsIGludCBubG9naWNhbHMsIHN0cnVjdCBSZXBvcnRMVU5kYXRhICpwaHlzZGV2X2xpc3QsCisJaW50IG5waHlzaWNhbHMsIGludCBubG9naWNhbHMsCisJc3RydWN0IFJlcG9ydEV4dGVuZGVkTFVOZGF0YSAqcGh5c2Rldl9saXN0LAogCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpsb2dkZXZfbGlzdCkKIHsKIAkvKiBIZWxwZXIgZnVuY3Rpb24sIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIExVTiBJRCBpbmZvIGlzIGNvbWluZyBmcm9tCkBAIC0xOTQ3LDYgKzI5NjAsMjQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBocHNhX2hiYV9tb2RlX2VuYWJsZWQoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJtaWNfY29udHJvbGxlcl9wYXJhbWV0ZXJzICpjdGxyX3BhcmFtczsKKwljdGxyX3BhcmFtcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibWljX2NvbnRyb2xsZXJfcGFyYW1ldGVycyksCisJCUdGUF9LRVJORUwpOworCisJaWYgKCFjdGxyX3BhcmFtcykKKwkJcmV0dXJuIDA7CisJcmMgPSBocHNhX2JtaWNfY3RybF9tb2RlX3NlbnNlKGgsIFJBSURfQ1RMUl9MVU5JRCwgMCwgY3Rscl9wYXJhbXMsCisJCXNpemVvZihzdHJ1Y3QgYm1pY19jb250cm9sbGVyX3BhcmFtZXRlcnMpKTsKKwlpZiAocmMgIT0gMCkgeworCQlrZnJlZShjdGxyX3BhcmFtcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gY3Rscl9wYXJhbXMtPm52cmFtX2ZsYWdzICYgKDEgPDwgMykgPyAxIDogMDsKK30KKwogc3RhdGljIHZvaWQgaHBzYV91cGRhdGVfc2NzaV9kZXZpY2VzKHN0cnVjdCBjdGxyX2luZm8gKmgsIGludCBob3N0bm8pCiB7CiAJLyogdGhlIGlkZWEgaGVyZSBpcyB3ZSBjb3VsZCBnZXQgbm90aWZpZWQKQEAgLTE5NTksMTYgKzI5OTAsMTggQEAKIAkgKiB0ZWxsIHdoaWNoIGRldmljZXMgd2UgYWxyZWFkeSBrbm93IGFib3V0LCB2cy4gbmV3CiAJICogZGV2aWNlcywgdnMuICBkaXNhcHBlYXJpbmcgZGV2aWNlcy4KIAkgKi8KLQlzdHJ1Y3QgUmVwb3J0TFVOZGF0YSAqcGh5c2Rldl9saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgUmVwb3J0RXh0ZW5kZWRMVU5kYXRhICpwaHlzZGV2X2xpc3QgPSBOVUxMOwogCXN0cnVjdCBSZXBvcnRMVU5kYXRhICpsb2dkZXZfbGlzdCA9IE5VTEw7CiAJdTMyIG5waHlzaWNhbHMgPSAwOwogCXUzMiBubG9naWNhbHMgPSAwOworCWludCBwaHlzaWNhbF9tb2RlID0gMDsKIAl1MzIgbmRldl9hbGxvY2F0ZWQgPSAwOwogCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKipjdXJyZW50c2QsICp0aGlzX2RldmljZSwgKnRtcGRldmljZTsKIAlpbnQgbmN1cnJlbnQgPSAwOwotCWludCByZXBvcnRsdW5zaXplID0gc2l6ZW9mKCpwaHlzZGV2X2xpc3QpICsgSFBTQV9NQVhfUEhZU19MVU4gKiA4OworCWludCByZXBvcnRsdW5zaXplID0gc2l6ZW9mKCpwaHlzZGV2X2xpc3QpICsgSFBTQV9NQVhfUEhZU19MVU4gKiAyNDsKIAlpbnQgaSwgbl9leHRfdGFyZ2V0X2RldnMsIG5kZXZzX3RvX2FsbG9jYXRlOwogCWludCByYWlkX2N0bHJfcG9zaXRpb247CisJdTggcmVzY2FuX2hiYV9tb2RlOwogCURFQ0xBUkVfQklUTUFQKGx1bnplcm9iaXRzLCBNQVhfRVhUX1RBUkdFVFMpOwogCiAJY3VycmVudHNkID0ga3phbGxvYyhzaXplb2YoKmN1cnJlbnRzZCkgKiBIUFNBX01BWF9ERVZJQ0VTLCBHRlBfS0VSTkVMKTsKQEAgLTE5ODIsOCArMzAxNSwxOCBAQAogCX0KIAltZW1zZXQobHVuemVyb2JpdHMsIDAsIHNpemVvZihsdW56ZXJvYml0cykpOwogCi0JaWYgKGhwc2FfZ2F0aGVyX2x1bl9pbmZvKGgsIHJlcG9ydGx1bnNpemUsIHBoeXNkZXZfbGlzdCwgJm5waHlzaWNhbHMsCi0JCQlsb2dkZXZfbGlzdCwgJm5sb2dpY2FscykpCisJcmVzY2FuX2hiYV9tb2RlID0gaHBzYV9oYmFfbW9kZV9lbmFibGVkKGgpOworCisJaWYgKCFoLT5oYmFfbW9kZV9lbmFibGVkICYmIHJlc2Nhbl9oYmFfbW9kZSkKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkhCQSBtb2RlIGVuYWJsZWRcbiIpOworCWVsc2UgaWYgKGgtPmhiYV9tb2RlX2VuYWJsZWQgJiYgIXJlc2Nhbl9oYmFfbW9kZSkKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkhCQSBtb2RlIGRpc2FibGVkXG4iKTsKKworCWgtPmhiYV9tb2RlX2VuYWJsZWQgPSByZXNjYW5faGJhX21vZGU7CisKKwlpZiAoaHBzYV9nYXRoZXJfbHVuX2luZm8oaCwgcmVwb3J0bHVuc2l6ZSwKKwkJCShzdHJ1Y3QgUmVwb3J0TFVOZGF0YSAqKSBwaHlzZGV2X2xpc3QsICZucGh5c2ljYWxzLAorCQkJJnBoeXNpY2FsX21vZGUsIGxvZ2Rldl9saXN0LCAmbmxvZ2ljYWxzKSkKIAkJZ290byBvdXQ7CiAKIAkvKiBXZSBtaWdodCBzZWUgdXAgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIGRpc2tzCkBAIC0yMDY0LDkgKzMxMDcsMjggQEAKIAkJCQluY3VycmVudCsrOwogCQkJYnJlYWs7CiAJCWNhc2UgVFlQRV9ESVNLOgotCQkJaWYgKGkgPCBucGh5c2ljYWxzKQorCQkJaWYgKGgtPmhiYV9tb2RlX2VuYWJsZWQpIHsKKwkJCQkvKiBuZXZlciB1c2UgcmFpZCBtYXBwZXIgaW4gSEJBIG1vZGUgKi8KKwkJCQl0aGlzX2RldmljZS0+b2ZmbG9hZF9lbmFibGVkID0gMDsKKwkJCQluY3VycmVudCsrOwogCQkJCWJyZWFrOwotCQkJbmN1cnJlbnQrKzsKKwkJCX0gZWxzZSBpZiAoaC0+YWNjaW9wYXRoX3N0YXR1cykgeworCQkJCWlmIChpID49IG5waHlzaWNhbHMpIHsKKwkJCQkJbmN1cnJlbnQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaSA8IG5waHlzaWNhbHMpCisJCQkJCWJyZWFrOworCQkJCW5jdXJyZW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocGh5c2ljYWxfbW9kZSA9PSBIUFNBX1JFUE9SVF9QSFlTX0VYVEVOREVEKSB7CisJCQkJbWVtY3B5KCZ0aGlzX2RldmljZS0+aW9hY2NlbF9oYW5kbGUsCisJCQkJCSZsdW5hZGRyYnl0ZXNbMjBdLAorCQkJCQlzaXplb2YodGhpc19kZXZpY2UtPmlvYWNjZWxfaGFuZGxlKSk7CisJCQkJbmN1cnJlbnQrKzsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRZUEVfVEFQRToKIAkJY2FzZSBUWVBFX01FRElVTV9DSEFOR0VSOgpAQCAtMjEzNiw3ICszMTk4LDcgQEAKIAkJY3Vycl9zZy0+QWRkci5sb3dlciA9ICh1MzIpIChhZGRyNjQgJiAweDBGRkZGRkZGRlVMTCk7CiAJCWN1cnJfc2ctPkFkZHIudXBwZXIgPSAodTMyKSAoKGFkZHI2NCA+PiAzMikgJiAweDBGRkZGRkZGRlVMTCk7CiAJCWN1cnJfc2ctPkxlbiA9IGxlbjsKLQkJY3Vycl9zZy0+RXh0ID0gMDsgIC8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KKwkJY3Vycl9zZy0+RXh0ID0gKGkgPCBzY3NpX3NnX2NvdW50KGNtZCkgLSAxKSA/IDAgOiBIUFNBX1NHX0xBU1Q7CiAJCWN1cnJfc2crKzsKIAl9CiAKQEAgLTIxNjAsNiArMzIyMiw3MjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBJT19BQ0NFTF9JTkVMSUdJQkxFICgxKQorc3RhdGljIGludCBmaXh1cF9pb2FjY2VsX2NkYih1OCAqY2RiLCBpbnQgKmNkYl9sZW4pCit7CisJaW50IGlzX3dyaXRlID0gMDsKKwl1MzIgYmxvY2s7CisJdTMyIGJsb2NrX2NudDsKKworCS8qIFBlcmZvcm0gc29tZSBDREIgZml4dXBzIGlmIG5lZWRlZCB1c2luZyAxMCBieXRlIHJlYWRzL3dyaXRlcyBvbmx5ICovCisJc3dpdGNoIChjZGJbMF0pIHsKKwljYXNlIFdSSVRFXzY6CisJY2FzZSBXUklURV8xMjoKKwkJaXNfd3JpdGUgPSAxOworCWNhc2UgUkVBRF82OgorCWNhc2UgUkVBRF8xMjoKKwkJaWYgKCpjZGJfbGVuID09IDYpIHsKKwkJCWJsb2NrID0gKCgodTMyKSBjZGJbMl0pIDw8IDgpIHwgY2RiWzNdOworCQkJYmxvY2tfY250ID0gY2RiWzRdOworCQl9IGVsc2UgeworCQkJQlVHX09OKCpjZGJfbGVuICE9IDEyKTsKKwkJCWJsb2NrID0gKCgodTMyKSBjZGJbMl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjZGJbM10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjZGJbNF0pIDw8IDgpIHwKKwkJCQljZGJbNV07CisJCQlibG9ja19jbnQgPQorCQkJCSgoKHUzMikgY2RiWzZdKSA8PCAyNCkgfAorCQkJCSgoKHUzMikgY2RiWzddKSA8PCAxNikgfAorCQkJCSgoKHUzMikgY2RiWzhdKSA8PCA4KSB8CisJCQkJY2RiWzldOworCQl9CisJCWlmIChibG9ja19jbnQgPiAweGZmZmYpCisJCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKworCQljZGJbMF0gPSBpc193cml0ZSA/IFdSSVRFXzEwIDogUkVBRF8xMDsKKwkJY2RiWzFdID0gMDsKKwkJY2RiWzJdID0gKHU4KSAoYmxvY2sgPj4gMjQpOworCQljZGJbM10gPSAodTgpIChibG9jayA+PiAxNik7CisJCWNkYls0XSA9ICh1OCkgKGJsb2NrID4+IDgpOworCQljZGJbNV0gPSAodTgpIChibG9jayk7CisJCWNkYls2XSA9IDA7CisJCWNkYls3XSA9ICh1OCkgKGJsb2NrX2NudCA+PiA4KTsKKwkJY2RiWzhdID0gKHU4KSAoYmxvY2tfY250KTsKKwkJY2RiWzldID0gMDsKKwkJKmNkYl9sZW4gPSAxMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhwc2Ffc2NzaV9pb2FjY2VsMV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjLCB1MzIgaW9hY2NlbF9oYW5kbGUsIHU4ICpjZGIsIGludCBjZGJfbGVuLAorCXU4ICpzY3NpM2FkZHIpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGlvX2FjY2VsMV9jbWQgKmNwID0gJmgtPmlvYWNjZWxfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IHRvdGFsX2xlbiA9IDA7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1NjQgYWRkcjY0OworCWludCB1c2Vfc2csIGk7CisJc3RydWN0IFNHRGVzY3JpcHRvciAqY3Vycl9zZzsKKwl1MzIgY29udHJvbCA9IElPQUNDRUwxX0NPTlRST0xfU0lNUExFUVVFVUU7CisKKwkvKiBUT0RPOiBpbXBsZW1lbnQgY2hhaW5pbmcgc3VwcG9ydCAqLworCWlmIChzY3NpX3NnX2NvdW50KGNtZCkgPiBoLT5pb2FjY2VsX21heHNnKQorCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKworCUJVR19PTihjbWQtPmNtZF9sZW4gPiBJT0FDQ0VMMV9JT0ZMQUdTX0NEQkxFTl9NQVgpOworCisJaWYgKGZpeHVwX2lvYWNjZWxfY2RiKGNkYiwgJmNkYl9sZW4pKQorCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKworCWMtPmNtZF90eXBlID0gQ01EX0lPQUNDRUwxOworCisJLyogQWRqdXN0IHRoZSBETUEgYWRkcmVzcyB0byBwb2ludCB0byB0aGUgYWNjZWxlcmF0ZWQgY29tbWFuZCBidWZmZXIgKi8KKwljLT5idXNhZGRyID0gKHUzMikgaC0+aW9hY2NlbF9jbWRfcG9vbF9kaGFuZGxlICsKKwkJCQkoYy0+Y21kaW5kZXggKiBzaXplb2YoKmNwKSk7CisJQlVHX09OKGMtPmJ1c2FkZHIgJiAweDAwMDAwMDdGKTsKKworCXVzZV9zZyA9IHNjc2lfZG1hX21hcChjbWQpOworCWlmICh1c2Vfc2cgPCAwKQorCQlyZXR1cm4gdXNlX3NnOworCisJaWYgKHVzZV9zZykgeworCQljdXJyX3NnID0gY3AtPlNHOworCQlzY3NpX2Zvcl9lYWNoX3NnKGNtZCwgc2csIHVzZV9zZywgaSkgeworCQkJYWRkcjY0ID0gKHU2NCkgc2dfZG1hX2FkZHJlc3Moc2cpOworCQkJbGVuICA9IHNnX2RtYV9sZW4oc2cpOworCQkJdG90YWxfbGVuICs9IGxlbjsKKwkJCWN1cnJfc2ctPkFkZHIubG93ZXIgPSAodTMyKSAoYWRkcjY0ICYgMHgwRkZGRkZGRkZVTEwpOworCQkJY3Vycl9zZy0+QWRkci51cHBlciA9CisJCQkJKHUzMikgKChhZGRyNjQgPj4gMzIpICYgMHgwRkZGRkZGRkZVTEwpOworCQkJY3Vycl9zZy0+TGVuID0gbGVuOworCisJCQlpZiAoaSA9PSAoc2NzaV9zZ19jb3VudChjbWQpIC0gMSkpCisJCQkJY3Vycl9zZy0+RXh0ID0gSFBTQV9TR19MQVNUOworCQkJZWxzZQorCQkJCWN1cnJfc2ctPkV4dCA9IDA7ICAvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCisJCQljdXJyX3NnKys7CisJCX0KKworCQlzd2l0Y2ggKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwkJY2FzZSBETUFfVE9fREVWSUNFOgorCQkJY29udHJvbCB8PSBJT0FDQ0VMMV9DT05UUk9MX0RBVEFfT1VUOworCQkJYnJlYWs7CisJCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQkJY29udHJvbCB8PSBJT0FDQ0VMMV9DT05UUk9MX0RBVEFfSU47CisJCQlicmVhazsKKwkJY2FzZSBETUFfTk9ORToKKwkJCWNvbnRyb2wgfD0gSU9BQ0NFTDFfQ09OVFJPTF9OT0RBVEFYRkVSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsICJ1bmtub3duIGRhdGEgZGlyZWN0aW9uOiAlZFxuIiwKKwkJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJQlVHKCk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWNvbnRyb2wgfD0gSU9BQ0NFTDFfQ09OVFJPTF9OT0RBVEFYRkVSOworCX0KKworCWMtPkhlYWRlci5TR0xpc3QgPSB1c2Vfc2c7CisJLyogRmlsbCBvdXQgdGhlIGNvbW1hbmQgc3RydWN0dXJlIHRvIHN1Ym1pdCAqLworCWNwLT5kZXZfaGFuZGxlID0gaW9hY2NlbF9oYW5kbGUgJiAweEZGRkY7CisJY3AtPnRyYW5zZmVyX2xlbiA9IHRvdGFsX2xlbjsKKwljcC0+aW9fZmxhZ3MgPSBJT0FDQ0VMMV9JT0ZMQUdTX0lPX1JFUSB8CisJCQkoY2RiX2xlbiAmIElPQUNDRUwxX0lPRkxBR1NfQ0RCTEVOX01BU0spOworCWNwLT5jb250cm9sID0gY29udHJvbDsKKwltZW1jcHkoY3AtPkNEQiwgY2RiLCBjZGJfbGVuKTsKKwltZW1jcHkoY3AtPkNJU1NfTFVOLCBzY3NpM2FkZHIsIDgpOworCS8qIFRhZyB3YXMgYWxyZWFkeSBzZXQgYXQgaW5pdCB0aW1lLiAqLworCWVucXVldWVfY21kX2FuZF9zdGFydF9pbyhoLCBjKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFF1ZXVlIGEgY29tbWFuZCBkaXJlY3RseSB0byBhIGRldmljZSBiZWhpbmQgdGhlIGNvbnRyb2xsZXIgdXNpbmcgdGhlCisgKiBJL08gYWNjZWxlcmF0b3IgcGF0aC4KKyAqLworc3RhdGljIGludCBocHNhX3Njc2lfaW9hY2NlbF9kaXJlY3RfbWFwKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGMtPnNjc2lfY21kOworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldiA9IGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCXJldHVybiBocHNhX3Njc2lfaW9hY2NlbF9xdWV1ZV9jb21tYW5kKGgsIGMsIGRldi0+aW9hY2NlbF9oYW5kbGUsCisJCWNtZC0+Y21uZCwgY21kLT5jbWRfbGVuLCBkZXYtPnNjc2kzYWRkcik7Cit9CisKKy8qCisgKiBTZXQgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgaW9hY2NlbDIgcmVxdWVzdAorICovCitzdGF0aWMgdm9pZCBzZXRfZW5jcnlwdF9pb2FjY2VsMihzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXN0cnVjdCBDb21tYW5kTGlzdCAqYywgc3RydWN0IGlvX2FjY2VsMl9jbWQgKmNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGMtPnNjc2lfY21kOworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldiA9IGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgcmFpZF9tYXBfZGF0YSAqbWFwID0gJmRldi0+cmFpZF9tYXA7CisJdTY0IGZpcnN0X2Jsb2NrOworCisJQlVHX09OKCEoZGV2LT5vZmZsb2FkX2NvbmZpZyAmJiBkZXYtPm9mZmxvYWRfZW5hYmxlZCkpOworCisJLyogQXJlIHdlIGRvaW5nIGVuY3J5cHRpb24gb24gdGhpcyBkZXZpY2UgKi8KKwlpZiAoIShtYXAtPmZsYWdzICYgUkFJRF9NQVBfRkxBR19FTkNSWVBUX09OKSkKKwkJcmV0dXJuOworCS8qIFNldCB0aGUgZGF0YSBlbmNyeXB0aW9uIGtleSBpbmRleC4gKi8KKwljcC0+ZGVraW5kZXggPSBtYXAtPmRla2luZGV4OworCisJLyogU2V0IHRoZSBlbmNyeXB0aW9uIGVuYWJsZSBmbGFnLCBlbmNvZGVkIGludG8gZGlyZWN0aW9uIGZpZWxkLiAqLworCWNwLT5kaXJlY3Rpb24gfD0gSU9BQ0NFTDJfRElSRUNUSU9OX0VOQ1JZUFRfTUFTSzsKKworCS8qIFNldCBlbmNyeXB0aW9uIHR3ZWFrIHZhbHVlcyBiYXNlZCBvbiBsb2dpY2FsIGJsb2NrIGFkZHJlc3MKKwkgKiBJZiBibG9jayBzaXplIGlzIDUxMiwgdHdlYWsgdmFsdWUgaXMgTEJBLgorCSAqIEZvciBvdGhlciBibG9jayBzaXplcywgdHdlYWsgaXMgKExCQSAqIGJsb2NrIHNpemUpLyA1MTIpCisJICovCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwkvKiBSZXF1aXJlZD8gNi1ieXRlIGNkYnMgZWxpbWluYXRlZCBieSBmaXh1cF9pb2FjY2VsX2NkYiAqLworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFJFQURfNjoKKwkJaWYgKG1hcC0+dm9sdW1lX2Jsa19zaXplID09IDUxMikgeworCQkJY3AtPnR3ZWFrX2xvd2VyID0KKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFsyXSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbM107CisJCQljcC0+dHdlYWtfdXBwZXIgPSAwOworCQl9IGVsc2UgeworCQkJZmlyc3RfYmxvY2sgPQorCQkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFszXTsKKwkJCWZpcnN0X2Jsb2NrID0gKGZpcnN0X2Jsb2NrICogbWFwLT52b2x1bWVfYmxrX3NpemUpLzUxMjsKKwkJCWNwLT50d2Vha19sb3dlciA9ICh1MzIpZmlyc3RfYmxvY2s7CisJCQljcC0+dHdlYWtfdXBwZXIgPSAodTMyKShmaXJzdF9ibG9jayA+PiAzMik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXUklURV8xMDoKKwljYXNlIFJFQURfMTA6CisJCWlmIChtYXAtPnZvbHVtZV9ibGtfc2l6ZSA9PSA1MTIpIHsKKwkJCWNwLT50d2Vha19sb3dlciA9CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbMl0pIDw8IDI0KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkJKCgodTMyKSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQkJY3AtPnR3ZWFrX3VwcGVyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0X2Jsb2NrID0KKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFszXSkgPDwgMTYpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs0XSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbNV07CisJCQlmaXJzdF9ibG9jayA9IChmaXJzdF9ibG9jayAqIG1hcC0+dm9sdW1lX2Jsa19zaXplKS81MTI7CisJCQljcC0+dHdlYWtfbG93ZXIgPSAodTMyKWZpcnN0X2Jsb2NrOworCQkJY3AtPnR3ZWFrX3VwcGVyID0gKHUzMikoZmlyc3RfYmxvY2sgPj4gMzIpOworCQl9CisJCWJyZWFrOworCS8qIFJlcXVpcmVkPyAxMi1ieXRlIGNkYnMgZWxpbWluYXRlZCBieSBmaXh1cF9pb2FjY2VsX2NkYiAqLworCWNhc2UgV1JJVEVfMTI6CisJY2FzZSBSRUFEXzEyOgorCQlpZiAobWFwLT52b2x1bWVfYmxrX3NpemUgPT0gNTEyKSB7CisJCQljcC0+dHdlYWtfbG93ZXIgPQorCQkJCSgoKHUzMikgY21kLT5jbW5kWzJdKSA8PCAyNCkgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzNdKSA8PCAxNikgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzRdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs1XTsKKwkJCWNwLT50d2Vha191cHBlciA9IDA7CisJCX0gZWxzZSB7CisJCQlmaXJzdF9ibG9jayA9CisJCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDI0KSB8CisJCQkJKCgodTY0KSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8CisJCQkJKCgodTY0KSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQkJZmlyc3RfYmxvY2sgPSAoZmlyc3RfYmxvY2sgKiBtYXAtPnZvbHVtZV9ibGtfc2l6ZSkvNTEyOworCQkJY3AtPnR3ZWFrX2xvd2VyID0gKHUzMilmaXJzdF9ibG9jazsKKwkJCWNwLT50d2Vha191cHBlciA9ICh1MzIpKGZpcnN0X2Jsb2NrID4+IDMyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdSSVRFXzE2OgorCWNhc2UgUkVBRF8xNjoKKwkJaWYgKG1hcC0+dm9sdW1lX2Jsa19zaXplID09IDUxMikgeworCQkJY3AtPnR3ZWFrX2xvd2VyID0KKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFs2XSkgPDwgMjQpIHwKKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFs3XSkgPDwgMTYpIHwKKwkJCQkoKCh1MzIpIGNtZC0+Y21uZFs4XSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbOV07CisJCQljcC0+dHdlYWtfdXBwZXIgPQorCQkJCSgoKHUzMikgY21kLT5jbW5kWzJdKSA8PCAyNCkgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzNdKSA8PCAxNikgfAorCQkJCSgoKHUzMikgY21kLT5jbW5kWzRdKSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs1XTsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0X2Jsb2NrID0KKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFsyXSkgPDwgNTYpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFszXSkgPDwgNDgpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs0XSkgPDwgNDApIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs1XSkgPDwgMzIpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs2XSkgPDwgMjQpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs3XSkgPDwgMTYpIHwKKwkJCQkoKCh1NjQpIGNtZC0+Y21uZFs4XSkgPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbOV07CisJCQlmaXJzdF9ibG9jayA9IChmaXJzdF9ibG9jayAqIG1hcC0+dm9sdW1lX2Jsa19zaXplKS81MTI7CisJCQljcC0+dHdlYWtfbG93ZXIgPSAodTMyKWZpcnN0X2Jsb2NrOworCQkJY3AtPnR3ZWFrX3VwcGVyID0gKHUzMikoZmlyc3RfYmxvY2sgPj4gMzIpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwKKwkJCSJFUlJPUjogJXM6IElPQUNDRUwgcmVxdWVzdCBDREIgc2l6ZSBub3Qgc3VwcG9ydGVkIGZvciBlbmNyeXB0aW9uXG4iLAorCQkJX19mdW5jX18pOworCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGhwc2Ffc2NzaV9pb2FjY2VsMl9xdWV1ZV9jb21tYW5kKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjLCB1MzIgaW9hY2NlbF9oYW5kbGUsIHU4ICpjZGIsIGludCBjZGJfbGVuLAorCXU4ICpzY3NpM2FkZHIpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYy0+c2NzaV9jbWQ7CisJc3RydWN0IGlvX2FjY2VsMl9jbWQgKmNwID0gJmgtPmlvYWNjZWwyX2NtZF9wb29sW2MtPmNtZGluZGV4XTsKKwlzdHJ1Y3QgaW9hY2NlbDJfc2dfZWxlbWVudCAqY3Vycl9zZzsKKwlpbnQgdXNlX3NnLCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdTY0IGFkZHI2NDsKKwl1MzIgbGVuOworCXUzMiB0b3RhbF9sZW4gPSAwOworCisJaWYgKHNjc2lfc2dfY291bnQoY21kKSA+IGgtPmlvYWNjZWxfbWF4c2cpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJaWYgKGZpeHVwX2lvYWNjZWxfY2RiKGNkYiwgJmNkYl9sZW4pKQorCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKwljLT5jbWRfdHlwZSA9IENNRF9JT0FDQ0VMMjsKKwkvKiBBZGp1c3QgdGhlIERNQSBhZGRyZXNzIHRvIHBvaW50IHRvIHRoZSBhY2NlbGVyYXRlZCBjb21tYW5kIGJ1ZmZlciAqLworCWMtPmJ1c2FkZHIgPSAodTMyKSBoLT5pb2FjY2VsMl9jbWRfcG9vbF9kaGFuZGxlICsKKwkJCQkoYy0+Y21kaW5kZXggKiBzaXplb2YoKmNwKSk7CisJQlVHX09OKGMtPmJ1c2FkZHIgJiAweDAwMDAwMDdGKTsKKworCW1lbXNldChjcCwgMCwgc2l6ZW9mKCpjcCkpOworCWNwLT5JVV90eXBlID0gSU9BQ0NFTDJfSVVfVFlQRTsKKworCXVzZV9zZyA9IHNjc2lfZG1hX21hcChjbWQpOworCWlmICh1c2Vfc2cgPCAwKQorCQlyZXR1cm4gdXNlX3NnOworCisJaWYgKHVzZV9zZykgeworCQlCVUdfT04odXNlX3NnID4gSU9BQ0NFTDJfTUFYU0dFTlRSSUVTKTsKKwkJY3Vycl9zZyA9IGNwLT5zZzsKKwkJc2NzaV9mb3JfZWFjaF9zZyhjbWQsIHNnLCB1c2Vfc2csIGkpIHsKKwkJCWFkZHI2NCA9ICh1NjQpIHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCWxlbiAgPSBzZ19kbWFfbGVuKHNnKTsKKwkJCXRvdGFsX2xlbiArPSBsZW47CisJCQljdXJyX3NnLT5hZGRyZXNzID0gY3B1X3RvX2xlNjQoYWRkcjY0KTsKKwkJCWN1cnJfc2ctPmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbik7CisJCQljdXJyX3NnLT5yZXNlcnZlZFswXSA9IDA7CisJCQljdXJyX3NnLT5yZXNlcnZlZFsxXSA9IDA7CisJCQljdXJyX3NnLT5yZXNlcnZlZFsyXSA9IDA7CisJCQljdXJyX3NnLT5jaGFpbl9pbmRpY2F0b3IgPSAwOworCQkJY3Vycl9zZysrOworCQl9CisKKwkJc3dpdGNoIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSB7CisJCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJCWNwLT5kaXJlY3Rpb24gJj0gfklPQUNDRUwyX0RJUkVDVElPTl9NQVNLOworCQkJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJfREFUQV9PVVQ7CisJCQlicmVhazsKKwkJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCQljcC0+ZGlyZWN0aW9uICY9IH5JT0FDQ0VMMl9ESVJFQ1RJT05fTUFTSzsKKwkJCWNwLT5kaXJlY3Rpb24gfD0gSU9BQ0NFTDJfRElSX0RBVEFfSU47CisJCQlicmVhazsKKwkJY2FzZSBETUFfTk9ORToKKwkJCWNwLT5kaXJlY3Rpb24gJj0gfklPQUNDRUwyX0RJUkVDVElPTl9NQVNLOworCQkJY3AtPmRpcmVjdGlvbiB8PSBJT0FDQ0VMMl9ESVJfTk9fREFUQTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2VycigmaC0+cGRldi0+ZGV2LCAidW5rbm93biBkYXRhIGRpcmVjdGlvbjogJWRcbiIsCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJY3AtPmRpcmVjdGlvbiAmPSB+SU9BQ0NFTDJfRElSRUNUSU9OX01BU0s7CisJCWNwLT5kaXJlY3Rpb24gfD0gSU9BQ0NFTDJfRElSX05PX0RBVEE7CisJfQorCisJLyogU2V0IGVuY3J5cHRpb24gcGFyYW1ldGVycywgaWYgbmVjZXNzYXJ5ICovCisJc2V0X2VuY3J5cHRfaW9hY2NlbDIoaCwgYywgY3ApOworCisJY3AtPnNjc2lfbmV4dXMgPSBpb2FjY2VsX2hhbmRsZTsKKwljcC0+VGFnID0gKGMtPmNtZGluZGV4IDw8IERJUkVDVF9MT09LVVBfU0hJRlQpIHwKKwkJCQlESVJFQ1RfTE9PS1VQX0JJVDsKKwltZW1jcHkoY3AtPmNkYiwgY2RiLCBzaXplb2YoY3AtPmNkYikpOworCisJLyogZmlsbCBpbiBzZyBlbGVtZW50cyAqLworCWNwLT5zZ19jb3VudCA9ICh1OCkgdXNlX3NnOworCisJY3AtPmRhdGFfbGVuID0gY3B1X3RvX2xlMzIodG90YWxfbGVuKTsKKwljcC0+ZXJyX3B0ciA9IGNwdV90b19sZTY0KGMtPmJ1c2FkZHIgKworCQkJb2Zmc2V0b2Yoc3RydWN0IGlvX2FjY2VsMl9jbWQsIGVycm9yX2RhdGEpKTsKKwljcC0+ZXJyX2xlbiA9IGNwdV90b19sZTMyKCh1MzIpIHNpemVvZihjcC0+ZXJyb3JfZGF0YSkpOworCisJZW5xdWV1ZV9jbWRfYW5kX3N0YXJ0X2lvKGgsIGMpOworCXJldHVybiAwOworfQorCisvKgorICogUXVldWUgYSBjb21tYW5kIHRvIHRoZSBjb3JyZWN0IEkvTyBhY2NlbGVyYXRvciBwYXRoLgorICovCitzdGF0aWMgaW50IGhwc2Ffc2NzaV9pb2FjY2VsX3F1ZXVlX2NvbW1hbmQoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiBpb2FjY2VsX2hhbmRsZSwgdTggKmNkYiwgaW50IGNkYl9sZW4sCisJdTggKnNjc2kzYWRkcikKK3sKKwlpZiAoaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxKQorCQlyZXR1cm4gaHBzYV9zY3NpX2lvYWNjZWwxX3F1ZXVlX2NvbW1hbmQoaCwgYywgaW9hY2NlbF9oYW5kbGUsCisJCQkJCQljZGIsIGNkYl9sZW4sIHNjc2kzYWRkcik7CisJZWxzZQorCQlyZXR1cm4gaHBzYV9zY3NpX2lvYWNjZWwyX3F1ZXVlX2NvbW1hbmQoaCwgYywgaW9hY2NlbF9oYW5kbGUsCisJCQkJCQljZGIsIGNkYl9sZW4sIHNjc2kzYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWRfbWFwX2hlbHBlcihzdHJ1Y3QgcmFpZF9tYXBfZGF0YSAqbWFwLAorCQlpbnQgb2ZmbG9hZF90b19taXJyb3IsIHUzMiAqbWFwX2luZGV4LCB1MzIgKmN1cnJlbnRfZ3JvdXApCit7CisJaWYgKG9mZmxvYWRfdG9fbWlycm9yID09IDApICB7CisJCS8qIHVzZSBwaHlzaWNhbCBkaXNrIGluIHRoZSBmaXJzdCBtaXJyb3JlZCBncm91cC4gKi8KKwkJKm1hcF9pbmRleCAlPSBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJcmV0dXJuOworCX0KKwlkbyB7CisJCS8qIGRldGVybWluZSBtaXJyb3IgZ3JvdXAgdGhhdCAqbWFwX2luZGV4IGluZGljYXRlcyAqLworCQkqY3VycmVudF9ncm91cCA9ICptYXBfaW5kZXggLyBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJaWYgKG9mZmxvYWRfdG9fbWlycm9yID09ICpjdXJyZW50X2dyb3VwKQorCQkJY29udGludWU7CisJCWlmICgqY3VycmVudF9ncm91cCA8IChtYXAtPmxheW91dF9tYXBfY291bnQgLSAxKSkgeworCQkJLyogc2VsZWN0IG1hcCBpbmRleCBmcm9tIG5leHQgZ3JvdXAgKi8KKwkJCSptYXBfaW5kZXggKz0gbWFwLT5kYXRhX2Rpc2tzX3Blcl9yb3c7CisJCQkoKmN1cnJlbnRfZ3JvdXApKys7CisJCX0gZWxzZSB7CisJCQkvKiBzZWxlY3QgbWFwIGluZGV4IGZyb20gZmlyc3QgZ3JvdXAgKi8KKwkJCSptYXBfaW5kZXggJT0gbWFwLT5kYXRhX2Rpc2tzX3Blcl9yb3c7CisJCQkqY3VycmVudF9ncm91cCA9IDA7CisJCX0KKwl9IHdoaWxlIChvZmZsb2FkX3RvX21pcnJvciAhPSAqY3VycmVudF9ncm91cCk7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIHBlcmZvcm0gb2ZmbG9hZCBSQUlEIG1hcHBpbmcgZm9yIGEgbG9naWNhbCB2b2x1bWUgSS9PLgorICovCitzdGF0aWMgaW50IGhwc2Ffc2NzaV9pb2FjY2VsX3JhaWRfbWFwKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGMtPnNjc2lfY21kOworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldiA9IGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgcmFpZF9tYXBfZGF0YSAqbWFwID0gJmRldi0+cmFpZF9tYXA7CisJc3RydWN0IHJhaWRfbWFwX2Rpc2tfZGF0YSAqZGQgPSAmbWFwLT5kYXRhWzBdOworCWludCBpc193cml0ZSA9IDA7CisJdTMyIG1hcF9pbmRleDsKKwl1NjQgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2s7CisJdTMyIGJsb2NrX2NudDsKKwl1MzIgYmxvY2tzX3Blcl9yb3c7CisJdTY0IGZpcnN0X3JvdywgbGFzdF9yb3c7CisJdTMyIGZpcnN0X3Jvd19vZmZzZXQsIGxhc3Rfcm93X29mZnNldDsKKwl1MzIgZmlyc3RfY29sdW1uLCBsYXN0X2NvbHVtbjsKKwl1NjQgcjBfZmlyc3Rfcm93LCByMF9sYXN0X3JvdzsKKwl1MzIgcjVvcjZfYmxvY2tzX3Blcl9yb3c7CisJdTY0IHI1b3I2X2ZpcnN0X3JvdywgcjVvcjZfbGFzdF9yb3c7CisJdTMyIHI1b3I2X2ZpcnN0X3Jvd19vZmZzZXQsIHI1b3I2X2xhc3Rfcm93X29mZnNldDsKKwl1MzIgcjVvcjZfZmlyc3RfY29sdW1uLCByNW9yNl9sYXN0X2NvbHVtbjsKKwl1MzIgdG90YWxfZGlza3NfcGVyX3JvdzsKKwl1MzIgc3RyaXBlc2l6ZTsKKwl1MzIgZmlyc3RfZ3JvdXAsIGxhc3RfZ3JvdXAsIGN1cnJlbnRfZ3JvdXA7CisJdTMyIG1hcF9yb3c7CisJdTMyIGRpc2tfaGFuZGxlOworCXU2NCBkaXNrX2Jsb2NrOworCXUzMiBkaXNrX2Jsb2NrX2NudDsKKwl1OCBjZGJbMTZdOworCXU4IGNkYl9sZW47CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCXU2NCB0bXBkaXY7CisjZW5kaWYKKwlpbnQgb2ZmbG9hZF90b19taXJyb3I7CisKKwlCVUdfT04oIShkZXYtPm9mZmxvYWRfY29uZmlnICYmIGRldi0+b2ZmbG9hZF9lbmFibGVkKSk7CisKKwkvKiBjaGVjayBmb3IgdmFsaWQgb3Bjb2RlLCBnZXQgTEJBIGFuZCBibG9jayBjb3VudCAqLworCXN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CisJY2FzZSBXUklURV82OgorCQlpc193cml0ZSA9IDE7CisJY2FzZSBSRUFEXzY6CisJCWZpcnN0X2Jsb2NrID0KKwkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCA4KSB8CisJCQljbWQtPmNtbmRbM107CisJCWJsb2NrX2NudCA9IGNtZC0+Y21uZFs0XTsKKwkJYnJlYWs7CisJY2FzZSBXUklURV8xMDoKKwkJaXNfd3JpdGUgPSAxOworCWNhc2UgUkVBRF8xMDoKKwkJZmlyc3RfYmxvY2sgPQorCQkJKCgodTY0KSBjbWQtPmNtbmRbMl0pIDw8IDI0KSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFszXSkgPDwgMTYpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzRdKSA8PCA4KSB8CisJCQljbWQtPmNtbmRbNV07CisJCWJsb2NrX2NudCA9CisJCQkoKCh1MzIpIGNtZC0+Y21uZFs3XSkgPDwgOCkgfAorCQkJY21kLT5jbW5kWzhdOworCQlicmVhazsKKwljYXNlIFdSSVRFXzEyOgorCQlpc193cml0ZSA9IDE7CisJY2FzZSBSRUFEXzEyOgorCQlmaXJzdF9ibG9jayA9CisJCQkoKCh1NjQpIGNtZC0+Y21uZFsyXSkgPDwgMjQpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzNdKSA8PCAxNikgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbNF0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFs1XTsKKwkJYmxvY2tfY250ID0KKwkJCSgoKHUzMikgY21kLT5jbW5kWzZdKSA8PCAyNCkgfAorCQkJKCgodTMyKSBjbWQtPmNtbmRbN10pIDw8IDE2KSB8CisJCQkoKCh1MzIpIGNtZC0+Y21uZFs4XSkgPDwgOCkgfAorCQljbWQtPmNtbmRbOV07CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTY6CisJCWlzX3dyaXRlID0gMTsKKwljYXNlIFJFQURfMTY6CisJCWZpcnN0X2Jsb2NrID0KKwkJCSgoKHU2NCkgY21kLT5jbW5kWzJdKSA8PCA1NikgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbM10pIDw8IDQ4KSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFs0XSkgPDwgNDApIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzVdKSA8PCAzMikgfAorCQkJKCgodTY0KSBjbWQtPmNtbmRbNl0pIDw8IDI0KSB8CisJCQkoKCh1NjQpIGNtZC0+Y21uZFs3XSkgPDwgMTYpIHwKKwkJCSgoKHU2NCkgY21kLT5jbW5kWzhdKSA8PCA4KSB8CisJCQljbWQtPmNtbmRbOV07CisJCWJsb2NrX2NudCA9CisJCQkoKCh1MzIpIGNtZC0+Y21uZFsxMF0pIDw8IDI0KSB8CisJCQkoKCh1MzIpIGNtZC0+Y21uZFsxMV0pIDw8IDE2KSB8CisJCQkoKCh1MzIpIGNtZC0+Y21uZFsxMl0pIDw8IDgpIHwKKwkJCWNtZC0+Y21uZFsxM107CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOyAvKiBwcm9jZXNzIHZpYSBub3JtYWwgSS9PIHBhdGggKi8KKwl9CisJQlVHX09OKGJsb2NrX2NudCA9PSAwKTsKKwlsYXN0X2Jsb2NrID0gZmlyc3RfYmxvY2sgKyBibG9ja19jbnQgLSAxOworCisJLyogY2hlY2sgZm9yIHdyaXRlIHRvIG5vbi1SQUlELTAgKi8KKwlpZiAoaXNfd3JpdGUgJiYgZGV2LT5yYWlkX2xldmVsICE9IDApCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJLyogY2hlY2sgZm9yIGludmFsaWQgYmxvY2sgb3Igd3JhcGFyb3VuZCAqLworCWlmIChsYXN0X2Jsb2NrID49IG1hcC0+dm9sdW1lX2Jsa19jbnQgfHwgbGFzdF9ibG9jayA8IGZpcnN0X2Jsb2NrKQorCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKworCS8qIGNhbGN1bGF0ZSBzdHJpcGUgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0ICovCisJYmxvY2tzX3Blcl9yb3cgPSBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdyAqIG1hcC0+c3RyaXBfc2l6ZTsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJdG1wZGl2ID0gZmlyc3RfYmxvY2s7CisJKHZvaWQpIGRvX2Rpdih0bXBkaXYsIGJsb2Nrc19wZXJfcm93KTsKKwlmaXJzdF9yb3cgPSB0bXBkaXY7CisJdG1wZGl2ID0gbGFzdF9ibG9jazsKKwkodm9pZCkgZG9fZGl2KHRtcGRpdiwgYmxvY2tzX3Blcl9yb3cpOworCWxhc3Rfcm93ID0gdG1wZGl2OworCWZpcnN0X3Jvd19vZmZzZXQgPSAodTMyKSAoZmlyc3RfYmxvY2sgLSAoZmlyc3Rfcm93ICogYmxvY2tzX3Blcl9yb3cpKTsKKwlsYXN0X3Jvd19vZmZzZXQgPSAodTMyKSAobGFzdF9ibG9jayAtIChsYXN0X3JvdyAqIGJsb2Nrc19wZXJfcm93KSk7CisJdG1wZGl2ID0gZmlyc3Rfcm93X29mZnNldDsKKwkodm9pZCkgZG9fZGl2KHRtcGRpdiwgIG1hcC0+c3RyaXBfc2l6ZSk7CisJZmlyc3RfY29sdW1uID0gdG1wZGl2OworCXRtcGRpdiA9IGxhc3Rfcm93X29mZnNldDsKKwkodm9pZCkgZG9fZGl2KHRtcGRpdiwgbWFwLT5zdHJpcF9zaXplKTsKKwlsYXN0X2NvbHVtbiA9IHRtcGRpdjsKKyNlbHNlCisJZmlyc3Rfcm93ID0gZmlyc3RfYmxvY2sgLyBibG9ja3NfcGVyX3JvdzsKKwlsYXN0X3JvdyA9IGxhc3RfYmxvY2sgLyBibG9ja3NfcGVyX3JvdzsKKwlmaXJzdF9yb3dfb2Zmc2V0ID0gKHUzMikgKGZpcnN0X2Jsb2NrIC0gKGZpcnN0X3JvdyAqIGJsb2Nrc19wZXJfcm93KSk7CisJbGFzdF9yb3dfb2Zmc2V0ID0gKHUzMikgKGxhc3RfYmxvY2sgLSAobGFzdF9yb3cgKiBibG9ja3NfcGVyX3JvdykpOworCWZpcnN0X2NvbHVtbiA9IGZpcnN0X3Jvd19vZmZzZXQgLyBtYXAtPnN0cmlwX3NpemU7CisJbGFzdF9jb2x1bW4gPSBsYXN0X3Jvd19vZmZzZXQgLyBtYXAtPnN0cmlwX3NpemU7CisjZW5kaWYKKworCS8qIGlmIHRoaXMgaXNuJ3QgYSBzaW5nbGUgcm93L2NvbHVtbiB0aGVuIGdpdmUgdG8gdGhlIGNvbnRyb2xsZXIgKi8KKwlpZiAoKGZpcnN0X3JvdyAhPSBsYXN0X3JvdykgfHwgKGZpcnN0X2NvbHVtbiAhPSBsYXN0X2NvbHVtbikpCisJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJLyogcHJvY2VlZGluZyB3aXRoIGRyaXZlciBtYXBwaW5nICovCisJdG90YWxfZGlza3NfcGVyX3JvdyA9IG1hcC0+ZGF0YV9kaXNrc19wZXJfcm93ICsKKwkJCQltYXAtPm1ldGFkYXRhX2Rpc2tzX3Blcl9yb3c7CisJbWFwX3JvdyA9ICgodTMyKShmaXJzdF9yb3cgPj4gbWFwLT5wYXJpdHlfcm90YXRpb25fc2hpZnQpKSAlCisJCQkJbWFwLT5yb3dfY250OworCW1hcF9pbmRleCA9IChtYXBfcm93ICogdG90YWxfZGlza3NfcGVyX3JvdykgKyBmaXJzdF9jb2x1bW47CisKKwlzd2l0Y2ggKGRldi0+cmFpZF9sZXZlbCkgeworCWNhc2UgSFBTQV9SQUlEXzA6CisJCWJyZWFrOyAvKiBub3RoaW5nIHNwZWNpYWwgdG8gZG8gKi8KKwljYXNlIEhQU0FfUkFJRF8xOgorCQkvKiBIYW5kbGVzIGxvYWQgYmFsYW5jZSBhY3Jvc3MgUkFJRCAxIG1lbWJlcnMuCisJCSAqICgyLWRyaXZlIFIxIGFuZCBSMTAgd2l0aCBldmVuICMgb2YgZHJpdmVzLikKKwkJICogQXBwcm9wcmlhdGUgZm9yIFNTRHMsIG5vdCBvcHRpbWFsIGZvciBIRERzCisJCSAqLworCQlCVUdfT04obWFwLT5sYXlvdXRfbWFwX2NvdW50ICE9IDIpOworCQlpZiAoZGV2LT5vZmZsb2FkX3RvX21pcnJvcikKKwkJCW1hcF9pbmRleCArPSBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJZGV2LT5vZmZsb2FkX3RvX21pcnJvciA9ICFkZXYtPm9mZmxvYWRfdG9fbWlycm9yOworCQlicmVhazsKKwljYXNlIEhQU0FfUkFJRF9BRE06CisJCS8qIEhhbmRsZXMgTi13YXkgbWlycm9ycyAgKFIxLUFETSkKKwkJICogYW5kIFIxMCB3aXRoICMgb2YgZHJpdmVzIGRpdmlzaWJsZSBieSAzLikKKwkJICovCisJCUJVR19PTihtYXAtPmxheW91dF9tYXBfY291bnQgIT0gMyk7CisKKwkJb2ZmbG9hZF90b19taXJyb3IgPSBkZXYtPm9mZmxvYWRfdG9fbWlycm9yOworCQlyYWlkX21hcF9oZWxwZXIobWFwLCBvZmZsb2FkX3RvX21pcnJvciwKKwkJCQkmbWFwX2luZGV4LCAmY3VycmVudF9ncm91cCk7CisJCS8qIHNldCBtaXJyb3IgZ3JvdXAgdG8gdXNlIG5leHQgdGltZSAqLworCQlvZmZsb2FkX3RvX21pcnJvciA9CisJCQkob2ZmbG9hZF90b19taXJyb3IgPj0gbWFwLT5sYXlvdXRfbWFwX2NvdW50IC0gMSkKKwkJCT8gMCA6IG9mZmxvYWRfdG9fbWlycm9yICsgMTsKKwkJLyogRklYTUU6IHJlbW92ZSBhZnRlciBkZWJ1Zy9kZXYgKi8KKwkJQlVHX09OKG9mZmxvYWRfdG9fbWlycm9yID49IG1hcC0+bGF5b3V0X21hcF9jb3VudCk7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkiREVCVUc6IFVzaW5nIHBoeXNpY2FsIGRpc2sgbWFwIGluZGV4ICVkIGZyb20gbWlycm9yIGdyb3VwICVkXG4iLAorCQkJbWFwX2luZGV4LCBvZmZsb2FkX3RvX21pcnJvcik7CisJCWRldi0+b2ZmbG9hZF90b19taXJyb3IgPSBvZmZsb2FkX3RvX21pcnJvcjsKKwkJLyogQXZvaWQgZGlyZWN0IHVzZSBvZiBkZXYtPm9mZmxvYWRfdG9fbWlycm9yIHdpdGhpbiB0aGlzCisJCSAqIGZ1bmN0aW9uIHNpbmNlIG11bHRpcGxlIHRocmVhZHMgbWlnaHQgc2ltdWx0YW5lb3VzbHkKKwkJICogaW5jcmVtZW50IGl0IGJleW9uZCB0aGUgcmFuZ2Ugb2YgZGV2LT5sYXlvdXRfbWFwX2NvdW50IC0xLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBIUFNBX1JBSURfNToKKwljYXNlIEhQU0FfUkFJRF82OgorCQlpZiAobWFwLT5sYXlvdXRfbWFwX2NvdW50IDw9IDEpCisJCQlicmVhazsKKworCQkvKiBWZXJpZnkgZmlyc3QgYW5kIGxhc3QgYmxvY2sgYXJlIGluIHNhbWUgUkFJRCBncm91cCAqLworCQlyNW9yNl9ibG9ja3NfcGVyX3JvdyA9CisJCQltYXAtPnN0cmlwX3NpemUgKiBtYXAtPmRhdGFfZGlza3NfcGVyX3JvdzsKKwkJQlVHX09OKHI1b3I2X2Jsb2Nrc19wZXJfcm93ID09IDApOworCQlzdHJpcGVzaXplID0gcjVvcjZfYmxvY2tzX3Blcl9yb3cgKiBtYXAtPmxheW91dF9tYXBfY291bnQ7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQl0bXBkaXYgPSBmaXJzdF9ibG9jazsKKwkJZmlyc3RfZ3JvdXAgPSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJdG1wZGl2ID0gZmlyc3RfZ3JvdXA7CisJCSh2b2lkKSBkb19kaXYodG1wZGl2LCByNW9yNl9ibG9ja3NfcGVyX3Jvdyk7CisJCWZpcnN0X2dyb3VwID0gdG1wZGl2OworCQl0bXBkaXYgPSBsYXN0X2Jsb2NrOworCQlsYXN0X2dyb3VwID0gZG9fZGl2KHRtcGRpdiwgc3RyaXBlc2l6ZSk7CisJCXRtcGRpdiA9IGxhc3RfZ3JvdXA7CisJCSh2b2lkKSBkb19kaXYodG1wZGl2LCByNW9yNl9ibG9ja3NfcGVyX3Jvdyk7CisJCWxhc3RfZ3JvdXAgPSB0bXBkaXY7CisjZWxzZQorCQlmaXJzdF9ncm91cCA9IChmaXJzdF9ibG9jayAlIHN0cmlwZXNpemUpIC8gcjVvcjZfYmxvY2tzX3Blcl9yb3c7CisJCWxhc3RfZ3JvdXAgPSAobGFzdF9ibG9jayAlIHN0cmlwZXNpemUpIC8gcjVvcjZfYmxvY2tzX3Blcl9yb3c7CisjZW5kaWYKKwkJaWYgKGZpcnN0X2dyb3VwICE9IGxhc3RfZ3JvdXApCisJCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKworCQkvKiBWZXJpZnkgcmVxdWVzdCBpcyBpbiBhIHNpbmdsZSByb3cgb2YgUkFJRCA1LzYgKi8KKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJCXRtcGRpdiA9IGZpcnN0X2Jsb2NrOworCQkodm9pZCkgZG9fZGl2KHRtcGRpdiwgc3RyaXBlc2l6ZSk7CisJCWZpcnN0X3JvdyA9IHI1b3I2X2ZpcnN0X3JvdyA9IHIwX2ZpcnN0X3JvdyA9IHRtcGRpdjsKKwkJdG1wZGl2ID0gbGFzdF9ibG9jazsKKwkJKHZvaWQpIGRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQlyNW9yNl9sYXN0X3JvdyA9IHIwX2xhc3Rfcm93ID0gdG1wZGl2OworI2Vsc2UKKwkJZmlyc3Rfcm93ID0gcjVvcjZfZmlyc3Rfcm93ID0gcjBfZmlyc3Rfcm93ID0KKwkJCQkJCWZpcnN0X2Jsb2NrIC8gc3RyaXBlc2l6ZTsKKwkJcjVvcjZfbGFzdF9yb3cgPSByMF9sYXN0X3JvdyA9IGxhc3RfYmxvY2sgLyBzdHJpcGVzaXplOworI2VuZGlmCisJCWlmIChyNW9yNl9maXJzdF9yb3cgIT0gcjVvcjZfbGFzdF9yb3cpCisJCQlyZXR1cm4gSU9fQUNDRUxfSU5FTElHSUJMRTsKKworCisJCS8qIFZlcmlmeSByZXF1ZXN0IGlzIGluIGEgc2luZ2xlIGNvbHVtbiAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwkJdG1wZGl2ID0gZmlyc3RfYmxvY2s7CisJCWZpcnN0X3Jvd19vZmZzZXQgPSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJdG1wZGl2ID0gZmlyc3Rfcm93X29mZnNldDsKKwkJZmlyc3Rfcm93X29mZnNldCA9ICh1MzIpIGRvX2Rpdih0bXBkaXYsIHI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKwkJcjVvcjZfZmlyc3Rfcm93X29mZnNldCA9IGZpcnN0X3Jvd19vZmZzZXQ7CisJCXRtcGRpdiA9IGxhc3RfYmxvY2s7CisJCXI1b3I2X2xhc3Rfcm93X29mZnNldCA9IGRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQl0bXBkaXYgPSByNW9yNl9sYXN0X3Jvd19vZmZzZXQ7CisJCXI1b3I2X2xhc3Rfcm93X29mZnNldCA9IGRvX2Rpdih0bXBkaXYsIHI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKwkJdG1wZGl2ID0gcjVvcjZfZmlyc3Rfcm93X29mZnNldDsKKwkJKHZvaWQpIGRvX2Rpdih0bXBkaXYsIG1hcC0+c3RyaXBfc2l6ZSk7CisJCWZpcnN0X2NvbHVtbiA9IHI1b3I2X2ZpcnN0X2NvbHVtbiA9IHRtcGRpdjsKKwkJdG1wZGl2ID0gcjVvcjZfbGFzdF9yb3dfb2Zmc2V0OworCQkodm9pZCkgZG9fZGl2KHRtcGRpdiwgbWFwLT5zdHJpcF9zaXplKTsKKwkJcjVvcjZfbGFzdF9jb2x1bW4gPSB0bXBkaXY7CisjZWxzZQorCQlmaXJzdF9yb3dfb2Zmc2V0ID0gcjVvcjZfZmlyc3Rfcm93X29mZnNldCA9CisJCQkodTMyKSgoZmlyc3RfYmxvY2sgJSBzdHJpcGVzaXplKSAlCisJCQkJCQlyNW9yNl9ibG9ja3NfcGVyX3Jvdyk7CisKKwkJcjVvcjZfbGFzdF9yb3dfb2Zmc2V0ID0KKwkJCSh1MzIpKChsYXN0X2Jsb2NrICUgc3RyaXBlc2l6ZSkgJQorCQkJCQkJcjVvcjZfYmxvY2tzX3Blcl9yb3cpOworCisJCWZpcnN0X2NvbHVtbiA9IHI1b3I2X2ZpcnN0X2NvbHVtbiA9CisJCQlyNW9yNl9maXJzdF9yb3dfb2Zmc2V0IC8gbWFwLT5zdHJpcF9zaXplOworCQlyNW9yNl9sYXN0X2NvbHVtbiA9CisJCQlyNW9yNl9sYXN0X3Jvd19vZmZzZXQgLyBtYXAtPnN0cmlwX3NpemU7CisjZW5kaWYKKwkJaWYgKHI1b3I2X2ZpcnN0X2NvbHVtbiAhPSByNW9yNl9sYXN0X2NvbHVtbikKKwkJCXJldHVybiBJT19BQ0NFTF9JTkVMSUdJQkxFOworCisJCS8qIFJlcXVlc3QgaXMgZWxpZ2libGUgKi8KKwkJbWFwX3JvdyA9ICgodTMyKShmaXJzdF9yb3cgPj4gbWFwLT5wYXJpdHlfcm90YXRpb25fc2hpZnQpKSAlCisJCQltYXAtPnJvd19jbnQ7CisKKwkJbWFwX2luZGV4ID0gKGZpcnN0X2dyb3VwICoKKwkJCShtYXAtPnJvd19jbnQgKiB0b3RhbF9kaXNrc19wZXJfcm93KSkgKworCQkJKG1hcF9yb3cgKiB0b3RhbF9kaXNrc19wZXJfcm93KSArIGZpcnN0X2NvbHVtbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElPX0FDQ0VMX0lORUxJR0lCTEU7CisJfQorCisJZGlza19oYW5kbGUgPSBkZFttYXBfaW5kZXhdLmlvYWNjZWxfaGFuZGxlOworCWRpc2tfYmxvY2sgPSBtYXAtPmRpc2tfc3RhcnRpbmdfYmxrICsgKGZpcnN0X3JvdyAqIG1hcC0+c3RyaXBfc2l6ZSkgKworCQkJKGZpcnN0X3Jvd19vZmZzZXQgLSAoZmlyc3RfY29sdW1uICogbWFwLT5zdHJpcF9zaXplKSk7CisJZGlza19ibG9ja19jbnQgPSBibG9ja19jbnQ7CisKKwkvKiBoYW5kbGUgZGlmZmVyaW5nIGxvZ2ljYWwvcGh5c2ljYWwgYmxvY2sgc2l6ZXMgKi8KKwlpZiAobWFwLT5waHlzX2Jsa19zaGlmdCkgeworCQlkaXNrX2Jsb2NrIDw8PSBtYXAtPnBoeXNfYmxrX3NoaWZ0OworCQlkaXNrX2Jsb2NrX2NudCA8PD0gbWFwLT5waHlzX2Jsa19zaGlmdDsKKwl9CisJQlVHX09OKGRpc2tfYmxvY2tfY250ID4gMHhmZmZmKTsKKworCS8qIGJ1aWxkIHRoZSBuZXcgQ0RCIGZvciB0aGUgcGh5c2ljYWwgZGlzayBJL08gKi8KKwlpZiAoZGlza19ibG9jayA+IDB4ZmZmZmZmZmYpIHsKKwkJY2RiWzBdID0gaXNfd3JpdGUgPyBXUklURV8xNiA6IFJFQURfMTY7CisJCWNkYlsxXSA9IDA7CisJCWNkYlsyXSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gNTYpOworCQljZGJbM10gPSAodTgpIChkaXNrX2Jsb2NrID4+IDQ4KTsKKwkJY2RiWzRdID0gKHU4KSAoZGlza19ibG9jayA+PiA0MCk7CisJCWNkYls1XSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gMzIpOworCQljZGJbNl0gPSAodTgpIChkaXNrX2Jsb2NrID4+IDI0KTsKKwkJY2RiWzddID0gKHU4KSAoZGlza19ibG9jayA+PiAxNik7CisJCWNkYls4XSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gOCk7CisJCWNkYls5XSA9ICh1OCkgKGRpc2tfYmxvY2spOworCQljZGJbMTBdID0gKHU4KSAoZGlza19ibG9ja19jbnQgPj4gMjQpOworCQljZGJbMTFdID0gKHU4KSAoZGlza19ibG9ja19jbnQgPj4gMTYpOworCQljZGJbMTJdID0gKHU4KSAoZGlza19ibG9ja19jbnQgPj4gOCk7CisJCWNkYlsxM10gPSAodTgpIChkaXNrX2Jsb2NrX2NudCk7CisJCWNkYlsxNF0gPSAwOworCQljZGJbMTVdID0gMDsKKwkJY2RiX2xlbiA9IDE2OworCX0gZWxzZSB7CisJCWNkYlswXSA9IGlzX3dyaXRlID8gV1JJVEVfMTAgOiBSRUFEXzEwOworCQljZGJbMV0gPSAwOworCQljZGJbMl0gPSAodTgpIChkaXNrX2Jsb2NrID4+IDI0KTsKKwkJY2RiWzNdID0gKHU4KSAoZGlza19ibG9jayA+PiAxNik7CisJCWNkYls0XSA9ICh1OCkgKGRpc2tfYmxvY2sgPj4gOCk7CisJCWNkYls1XSA9ICh1OCkgKGRpc2tfYmxvY2spOworCQljZGJbNl0gPSAwOworCQljZGJbN10gPSAodTgpIChkaXNrX2Jsb2NrX2NudCA+PiA4KTsKKwkJY2RiWzhdID0gKHU4KSAoZGlza19ibG9ja19jbnQpOworCQljZGJbOV0gPSAwOworCQljZGJfbGVuID0gMTA7CisJfQorCXJldHVybiBocHNhX3Njc2lfaW9hY2NlbF9xdWV1ZV9jb21tYW5kKGgsIGMsIGRpc2tfaGFuZGxlLCBjZGIsIGNkYl9sZW4sCisJCQkJCQlkZXYtPnNjc2kzYWRkcik7Cit9CiAKIHN0YXRpYyBpbnQgaHBzYV9zY3NpX3F1ZXVlX2NvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKIAl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKQEAgLTIxNjksNiArMzk1MSw3IEBACiAJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbOF07CiAJc3RydWN0IENvbW1hbmRMaXN0ICpjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKIAogCS8qIEdldCB0aGUgcHRyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZSBvdXQgb2YgY21kLT5ob3N0LiAqLwogCWggPSBzZGV2X3RvX2hiYShjbWQtPmRldmljZSk7CkBAIC0yMjAzLDYgKzM5ODYsMzIgQEAKIAogCWMtPmNtZF90eXBlID0gQ01EX1NDU0k7CiAJYy0+c2NzaV9jbWQgPSBjbWQ7CisKKwkvKiBDYWxsIGFsdGVybmF0ZSBzdWJtaXQgcm91dGluZSBmb3IgSS9PIGFjY2VsZXJhdGVkIGNvbW1hbmRzLgorCSAqIFJldHJpZXMgYWx3YXlzIGdvIGRvd24gdGhlIG5vcm1hbCBJL08gcGF0aC4KKwkgKi8KKwlpZiAobGlrZWx5KGNtZC0+cmV0cmllcyA9PSAwICYmCisJCWNtZC0+cmVxdWVzdC0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfRlMgJiYKKwkJaC0+YWNjaW9wYXRoX3N0YXR1cykpIHsKKwkJaWYgKGRldi0+b2ZmbG9hZF9lbmFibGVkKSB7CisJCQlyYyA9IGhwc2Ffc2NzaV9pb2FjY2VsX3JhaWRfbWFwKGgsIGMpOworCQkJaWYgKHJjID09IDApCisJCQkJcmV0dXJuIDA7IC8qIFNlbnQgb24gaW9hY2NlbCBwYXRoICovCisJCQlpZiAocmMgPCAwKSB7ICAgLyogc2NzaV9kbWFfbWFwIGZhaWxlZC4gKi8KKwkJCQljbWRfZnJlZShoLCBjKTsKKwkJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwkJCX0KKwkJfSBlbHNlIGlmIChkZXYtPmlvYWNjZWxfaGFuZGxlKSB7CisJCQlyYyA9IGhwc2Ffc2NzaV9pb2FjY2VsX2RpcmVjdF9tYXAoaCwgYyk7CisJCQlpZiAocmMgPT0gMCkKKwkJCQlyZXR1cm4gMDsgLyogU2VudCBvbiBkaXJlY3QgbWFwIHBhdGggKi8KKwkJCWlmIChyYyA8IDApIHsgICAvKiBzY3NpX2RtYV9tYXAgZmFpbGVkLiAqLworCQkJCWNtZF9mcmVlKGgsIGMpOworCQkJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQkJfQorCQl9CisJfQorCiAJYy0+SGVhZGVyLlJlcGx5UXVldWUgPSAwOyAgLyogdW51c2VkIGluIHNpbXBsZSBtb2RlICovCiAJbWVtY3B5KCZjLT5IZWFkZXIuTFVOLkx1bkFkZHJCeXRlc1swXSwgJnNjc2kzYWRkclswXSwgOCk7CiAJYy0+SGVhZGVyLlRhZy5sb3dlciA9IChjLT5jbWRpbmRleCA8PCBESVJFQ1RfTE9PS1VQX1NISUZUKTsKQEAgLTIyNjIsMTEgKzQwNzEsMzggQEAKIAogc3RhdGljIERFRl9TQ1NJX1FDTUQoaHBzYV9zY3NpX3F1ZXVlX2NvbW1hbmQpCiAKK3N0YXRpYyBpbnQgZG9fbm90X3NjYW5faWZfY29udHJvbGxlcl9sb2NrZWRfdXAoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBEb24ndCBsZXQgcmVzY2FucyBiZSBpbml0aWF0ZWQgb24gYSBjb250cm9sbGVyIGtub3duCisJICogdG8gYmUgbG9ja2VkIHVwLiAgSWYgdGhlIGNvbnRyb2xsZXIgbG9ja3MgdXAgKmR1cmluZyoKKwkgKiBhIHJlc2NhbiwgdGhhdCB0aHJlYWQgaXMgcHJvYmFibHkgaG9zZWQsIGJ1dCBhdCBsZWFzdAorCSAqIHdlIGNhbiBwcmV2ZW50IG5ldyByZXNjYW4gdGhyZWFkcyBmcm9tIHBpbGluZyB1cCBvbiBhCisJICogbG9ja2VkIHVwIGNvbnRyb2xsZXIuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoaC0+bG9ja3VwX2RldGVjdGVkKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5zY2FuX2xvY2ssIGZsYWdzKTsKKwkJaC0+c2Nhbl9maW5pc2hlZCA9IDE7CisJCXdha2VfdXBfYWxsKCZoLT5zY2FuX3dhaXRfcXVldWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5zY2FuX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgaHBzYV9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNoKQogewogCXN0cnVjdCBjdGxyX2luZm8gKmggPSBzaG9zdF90b19oYmEoc2gpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAoZG9fbm90X3NjYW5faWZfY29udHJvbGxlcl9sb2NrZWRfdXAoaCkpCisJCXJldHVybjsKKwogCS8qIHdhaXQgdW50aWwgYW55IHNjYW4gYWxyZWFkeSBpbiBwcm9ncmVzcyBpcyBmaW5pc2hlZC4gKi8KIAl3aGlsZSAoMSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+c2Nhbl9sb2NrLCBmbGFncyk7CkBAIC0yMjgzLDYgKzQxMTksOSBAQAogCWgtPnNjYW5fZmluaXNoZWQgPSAwOyAvKiBtYXJrIHNjYW4gYXMgaW4gcHJvZ3Jlc3MgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5zY2FuX2xvY2ssIGZsYWdzKTsKIAorCWlmIChkb19ub3Rfc2Nhbl9pZl9jb250cm9sbGVyX2xvY2tlZF91cChoKSkKKwkJcmV0dXJuOworCiAJaHBzYV91cGRhdGVfc2NzaV9kZXZpY2VzKGgsIGgtPnNjc2lfaG9zdC0+aG9zdF9ubyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+c2Nhbl9sb2NrLCBmbGFncyk7CkBAIC0yMzQ2LDcgKzQxODUsMTAgQEAKIAlzaC0+bWF4X2x1biA9IEhQU0FfTUFYX0xVTjsKIAlzaC0+bWF4X2lkID0gSFBTQV9NQVhfTFVOOwogCXNoLT5jYW5fcXVldWUgPSBoLT5ucl9jbWRzOwotCXNoLT5jbWRfcGVyX2x1biA9IGgtPm5yX2NtZHM7CisJaWYgKGgtPmhiYV9tb2RlX2VuYWJsZWQpCisJCXNoLT5jbWRfcGVyX2x1biA9IDc7CisJZWxzZQorCQlzaC0+Y21kX3Blcl9sdW4gPSBoLT5ucl9jbWRzOwogCXNoLT5zZ190YWJsZXNpemUgPSBoLT5tYXhzZ2VudHJpZXM7CiAJaC0+c2NzaV9ob3N0ID0gc2g7CiAJc2gtPmhvc3RkYXRhWzBdID0gKHVuc2lnbmVkIGxvbmcpIGg7CkBAIC0yMzcyLDcgKzQyMTQsNyBAQAogc3RhdGljIGludCB3YWl0X2Zvcl9kZXZpY2VfdG9fYmVjb21lX3JlYWR5KHN0cnVjdCBjdGxyX2luZm8gKmgsCiAJdW5zaWduZWQgY2hhciBsdW5hZGRyW10pCiB7Ci0JaW50IHJjID0gMDsKKwlpbnQgcmM7CiAJaW50IGNvdW50ID0gMDsKIAlpbnQgd2FpdHRpbWUgPSAxOyAvKiBzZWNvbmRzICovCiAJc3RydWN0IENvbW1hbmRMaXN0ICpjOwpAQCAtMjM5Miw2ICs0MjM0LDcgQEAKIAkJICovCiAJCW1zbGVlcCgxMDAwICogd2FpdHRpbWUpOwogCQljb3VudCsrOworCQlyYyA9IDA7IC8qIERldmljZSByZWFkeS4gKi8KIAogCQkvKiBJbmNyZWFzZSB3YWl0IHRpbWUgd2l0aCBlYWNoIHRyeSwgdXAgdG8gYSBwb2ludC4gKi8KIAkJaWYgKHdhaXR0aW1lIDwgSFBTQV9NQVhfV0FJVF9JTlRFUlZBTF9TRUNTKQpAQCAtMjQ0OCw3ICs0MjkxLDcgQEAKIAlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAicmVzZXR0aW5nIGRldmljZSAlZDolZDolZDolZFxuIiwKIAkJaC0+c2NzaV9ob3N0LT5ob3N0X25vLCBkZXYtPmJ1cywgZGV2LT50YXJnZXQsIGRldi0+bHVuKTsKIAkvKiBzZW5kIGEgcmVzZXQgdG8gdGhlIFNDU0kgTFVOIHdoaWNoIHRoZSBjb21tYW5kIHdhcyBzZW50IHRvICovCi0JcmMgPSBocHNhX3NlbmRfcmVzZXQoaCwgZGV2LT5zY3NpM2FkZHIpOworCXJjID0gaHBzYV9zZW5kX3Jlc2V0KGgsIGRldi0+c2NzaTNhZGRyLCBIUFNBX1JFU0VUX1RZUEVfTFVOKTsKIAlpZiAocmMgPT0gMCAmJiB3YWl0X2Zvcl9kZXZpY2VfdG9fYmVjb21lX3JlYWR5KGgsIGRldi0+c2NzaTNhZGRyKSA9PSAwKQogCQlyZXR1cm4gU1VDQ0VTUzsKIApAQCAtMjQ3MSwxMiArNDMxNCwzNiBAQAogCXRhZ1s3XSA9IG9yaWdpbmFsX3RhZ1s0XTsKIH0KIAorc3RhdGljIHZvaWQgaHBzYV9nZXRfdGFnKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjLCB1MzIgKnRhZ2xvd2VyLCB1MzIgKnRhZ3VwcGVyKQoreworCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDEpIHsKKwkJc3RydWN0IGlvX2FjY2VsMV9jbWQgKmNtMSA9IChzdHJ1Y3QgaW9fYWNjZWwxX2NtZCAqKQorCQkJJmgtPmlvYWNjZWxfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCQkqdGFndXBwZXIgPSBjbTEtPlRhZy51cHBlcjsKKwkJKnRhZ2xvd2VyID0gY20xLT5UYWcubG93ZXI7CisJCXJldHVybjsKKwl9CisJaWYgKGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMikgeworCQlzdHJ1Y3QgaW9fYWNjZWwyX2NtZCAqY20yID0gKHN0cnVjdCBpb19hY2NlbDJfY21kICopCisJCQkmaC0+aW9hY2NlbDJfY21kX3Bvb2xbYy0+Y21kaW5kZXhdOworCQkvKiB1cHBlciB0YWcgbm90IHVzZWQgaW4gaW9hY2NlbDIgbW9kZSAqLworCQltZW1zZXQodGFndXBwZXIsIDAsIHNpemVvZigqdGFndXBwZXIpKTsKKwkJKnRhZ2xvd2VyID0gY20yLT5UYWc7CisJCXJldHVybjsKKwl9CisJKnRhZ3VwcGVyID0gYy0+SGVhZGVyLlRhZy51cHBlcjsKKwkqdGFnbG93ZXIgPSBjLT5IZWFkZXIuVGFnLmxvd2VyOworfQorCisKIHN0YXRpYyBpbnQgaHBzYV9zZW5kX2Fib3J0KHN0cnVjdCBjdGxyX2luZm8gKmgsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmFib3J0LCBpbnQgc3dpenpsZSkKIHsKIAlpbnQgcmMgPSBJT19PSzsKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmM7CiAJc3RydWN0IEVycm9ySW5mbyAqZWk7CisJdTMyIHRhZ3VwcGVyLCB0YWdsb3dlcjsKIAogCWMgPSBjbWRfc3BlY2lhbF9hbGxvYyhoKTsKIAlpZiAoYyA9PSBOVUxMKSB7CS8qIHRyb3VibGUuLi4gKi8KQEAgLTI0OTAsOCArNDM1Nyw5IEBACiAJaWYgKHN3aXp6bGUpCiAJCXN3aXp6bGVfYWJvcnRfdGFnKCZjLT5SZXF1ZXN0LkNEQls0XSk7CiAJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKKwlocHNhX2dldF90YWcoaCwgYWJvcnQsICZ0YWdsb3dlciwgJnRhZ3VwcGVyKTsKIAlkZXZfZGJnKCZoLT5wZGV2LT5kZXYsICIlczogVGFnOjB4JTA4eDolMDh4OiBkb19zaW1wbGVfY21kX2NvcmUgY29tcGxldGVkLlxuIiwKLQkJX19mdW5jX18sIGFib3J0LT5IZWFkZXIuVGFnLnVwcGVyLCBhYm9ydC0+SGVhZGVyLlRhZy5sb3dlcik7CisJCV9fZnVuY19fLCB0YWd1cHBlciwgdGFnbG93ZXIpOwogCS8qIG5vIHVubWFwIG5lZWRlZCBoZXJlIGJlY2F1c2Ugbm8gZGF0YSB4ZmVyLiAqLwogCiAJZWkgPSBjLT5lcnJfaW5mbzsKQEAgLTI1MDMsMTUgKzQzNzEsMTQgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2RiZygmaC0+cGRldi0+ZGV2LCAiJXM6IFRhZzoweCUwOHg6JTA4eDogaW50ZXJwcmV0aW5nIGVycm9yLlxuIiwKLQkJCV9fZnVuY19fLCBhYm9ydC0+SGVhZGVyLlRhZy51cHBlciwKLQkJCWFib3J0LT5IZWFkZXIuVGFnLmxvd2VyKTsKLQkJaHBzYV9zY3NpX2ludGVycHJldF9lcnJvcihjKTsKKwkJCV9fZnVuY19fLCB0YWd1cHBlciwgdGFnbG93ZXIpOworCQlocHNhX3Njc2lfaW50ZXJwcmV0X2Vycm9yKGgsIGMpOwogCQlyYyA9IC0xOwogCQlicmVhazsKIAl9CiAJY21kX3NwZWNpYWxfZnJlZShoLCBjKTsKLQlkZXZfZGJnKCZoLT5wZGV2LT5kZXYsICIlczogVGFnOjB4JTA4eDolMDh4OiBGaW5pc2hlZC5cbiIsIF9fZnVuY19fLAotCQlhYm9ydC0+SGVhZGVyLlRhZy51cHBlciwgYWJvcnQtPkhlYWRlci5UYWcubG93ZXIpOworCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIiVzOiBUYWc6MHglMDh4OiUwOHg6IEZpbmlzaGVkLlxuIiwKKwkJX19mdW5jX18sIHRhZ3VwcGVyLCB0YWdsb3dlcik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNTY1LDYgKzQ0MzIsODMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyogaW9hY2NlbDIgcGF0aCBmaXJtd2FyZSBjYW5ub3QgaGFuZGxlIGFib3J0IHRhc2sgcmVxdWVzdHMuCisgKiBDaGFuZ2UgYWJvcnQgcmVxdWVzdHMgdG8gcGh5c2ljYWwgdGFyZ2V0IHJlc2V0LCBhbmQgc2VuZCB0byB0aGUKKyAqIGFkZHJlc3Mgb2YgdGhlIHBoeXNpY2FsIGRpc2sgdXNlZCBmb3IgdGhlIGlvYWNjZWwgMiBjb21tYW5kLgorICogUmV0dXJuIDAgb24gc3VjY2VzcyAoSU9fT0spCisgKgkgLTEgb24gZmFpbHVyZQorICovCisKK3N0YXRpYyBpbnQgaHBzYV9zZW5kX3Jlc2V0X2FzX2Fib3J0X2lvYWNjZWwyKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLCBzdHJ1Y3QgQ29tbWFuZExpc3QgKmFib3J0KQoreworCWludCByYyA9IElPX09LOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7IC8qIHNjc2kgY29tbWFuZCB3aXRoaW4gcmVxdWVzdCBiZWluZyBhYm9ydGVkICovCisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2OyAvKiBkZXZpY2UgdG8gd2hpY2ggc2NzaSBjbWQgd2FzIHNlbnQgKi8KKwl1bnNpZ25lZCBjaGFyIHBoeXNfc2NzaTNhZGRyWzhdOyAvKiBhZGRyIG9mIHBoeXMgZGlzayB3aXRoIHZvbHVtZSAqLworCXVuc2lnbmVkIGNoYXIgKnBzYSA9ICZwaHlzX3Njc2kzYWRkclswXTsKKworCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIGhwc2EgbG9naWNhbCBkZXZpY2UuICovCisJc2NtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGFib3J0LT5zY3NpX2NtZDsKKwlkZXYgPSAoc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqKShzY21kLT5kZXZpY2UtPmhvc3RkYXRhKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJDYW5ub3QgYWJvcnQ6IG5vIGRldmljZSBwb2ludGVyIGZvciBjb21tYW5kLlxuIik7CisJCQlyZXR1cm4gLTE7IC8qIG5vdCBhYm9ydGFibGUgKi8KKwl9CisKKwlpZiAoaC0+cmFpZF9vZmZsb2FkX2RlYnVnID4gMCkKKwkJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJCSJSZXNldCBhcyBhYm9ydDogQWJvcnQgcmVxdWVzdGVkIG9uIEMlZDpCJWQ6VCVkOkwlZCBzY3NpM2FkZHIgMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCWgtPnNjc2lfaG9zdC0+aG9zdF9ubywgZGV2LT5idXMsIGRldi0+dGFyZ2V0LCBkZXYtPmx1biwKKwkJCXNjc2kzYWRkclswXSwgc2NzaTNhZGRyWzFdLCBzY3NpM2FkZHJbMl0sIHNjc2kzYWRkclszXSwKKwkJCXNjc2kzYWRkcls0XSwgc2NzaTNhZGRyWzVdLCBzY3NpM2FkZHJbNl0sIHNjc2kzYWRkcls3XSk7CisKKwlpZiAoIWRldi0+b2ZmbG9hZF9lbmFibGVkKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkiQ2FuJ3QgYWJvcnQ6IGRldmljZSBpcyBub3Qgb3BlcmF0aW5nIGluIEhQIFNTRCBTbWFydCBQYXRoIG1vZGUuXG4iKTsKKwkJcmV0dXJuIC0xOyAvKiBub3QgYWJvcnRhYmxlICovCisJfQorCisJLyogSW5jb21pbmcgc2NzaTNhZGRyIGlzIGxvZ2ljYWwgYWRkci4gV2UgbmVlZCBwaHlzaWNhbCBkaXNrIGFkZHIuICovCisJaWYgKCFocHNhX2dldF9wZGlza19vZl9pb2FjY2VsMihoLCBhYm9ydCwgcHNhKSkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiQ2FuJ3QgYWJvcnQ6IEZhaWxlZCBsb29rdXAgb2YgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gLTE7IC8qIG5vdCBhYm9ydGFibGUgKi8KKwl9CisKKwkvKiBzZW5kIHRoZSByZXNldCAqLworCWlmIChoLT5yYWlkX29mZmxvYWRfZGVidWcgPiAwKQorCQlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LAorCQkJIlJlc2V0IGFzIGFib3J0OiBSZXNldHRpbmcgcGh5c2ljYWwgZGV2aWNlIGF0IHNjc2kzYWRkciAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJcHNhWzBdLCBwc2FbMV0sIHBzYVsyXSwgcHNhWzNdLAorCQkJcHNhWzRdLCBwc2FbNV0sIHBzYVs2XSwgcHNhWzddKTsKKwlyYyA9IGhwc2Ffc2VuZF9yZXNldChoLCBwc2EsIEhQU0FfUkVTRVRfVFlQRV9UQVJHRVQpOworCWlmIChyYyAhPSAwKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkiUmVzZXQgYXMgYWJvcnQ6IEZhaWxlZCBvbiBwaHlzaWNhbCBkZXZpY2UgYXQgc2NzaTNhZGRyIDB4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQlwc2FbMF0sIHBzYVsxXSwgcHNhWzJdLCBwc2FbM10sCisJCQlwc2FbNF0sIHBzYVs1XSwgcHNhWzZdLCBwc2FbN10pOworCQlyZXR1cm4gcmM7IC8qIGZhaWxlZCB0byByZXNldCAqLworCX0KKworCS8qIHdhaXQgZm9yIGRldmljZSB0byByZWNvdmVyICovCisJaWYgKHdhaXRfZm9yX2RldmljZV90b19iZWNvbWVfcmVhZHkoaCwgcHNhKSAhPSAwKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkiUmVzZXQgYXMgYWJvcnQ6IEZhaWxlZDogRGV2aWNlIG5ldmVyIHJlY292ZXJlZCBmcm9tIHJlc2V0OiAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJcHNhWzBdLCBwc2FbMV0sIHBzYVsyXSwgcHNhWzNdLAorCQkJcHNhWzRdLCBwc2FbNV0sIHBzYVs2XSwgcHNhWzddKTsKKwkJcmV0dXJuIC0xOyAgLyogZmFpbGVkIHRvIHJlY292ZXIgKi8KKwl9CisKKwkvKiBkZXZpY2UgcmVjb3ZlcmVkICovCisJZGV2X2luZm8oJmgtPnBkZXYtPmRldiwKKwkJIlJlc2V0IGFzIGFib3J0OiBEZXZpY2UgcmVjb3ZlcmVkIGZyb20gcmVzZXQ6IHNjc2kzYWRkciAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQlwc2FbMF0sIHBzYVsxXSwgcHNhWzJdLCBwc2FbM10sCisJCXBzYVs0XSwgcHNhWzVdLCBwc2FbNl0sIHBzYVs3XSk7CisKKwlyZXR1cm4gcmM7IC8qIHN1Y2Nlc3MgKi8KK30KKwogLyogU29tZSBTbWFydCBBcnJheXMgbmVlZCB0aGUgYWJvcnQgdGFnIHN3aXp6bGVkLCBhbmQgc29tZSBkb24ndC4gIEl0J3MgaGFyZCB0bwogICogdGVsbCB3aGljaCBraW5kIHdlJ3JlIGRlYWxpbmcgd2l0aCwgc28gd2Ugc2VuZCB0aGUgYWJvcnQgYm90aCB3YXlzLiAgVGhlcmUKICAqIHNob3VsZG4ndCBiZSBhbnkgY29sbGlzaW9ucyBiZXR3ZWVuIHN3aXp6bGVkIGFuZCB1bnN3aXp6bGVkIHRhZ3MgZHVlIHRvIHRoZQpAQCAtMjU3OCw2ICs0NTIyLDE0IEBACiAJc3RydWN0IENvbW1hbmRMaXN0ICpjOwogCWludCByYyA9IDAsIHJjMiA9IDA7CiAKKwkvKiBpb2NjZWxlcmF0b3IgbW9kZSAyIGNvbW1hbmRzIHNob3VsZCBiZSBhYm9ydGVkIHZpYSB0aGUKKwkgKiBhY2NlbGVyYXRlZCBwYXRoLCBzaW5jZSBSQUlEIHBhdGggaXMgdW5hd2FyZSBvZiB0aGVzZSBjb21tYW5kcywKKwkgKiBidXQgdW5kZXJseWluZyBmaXJtd2FyZSBjYW4ndCBoYW5kbGUgYWJvcnQgVE1GLgorCSAqIENoYW5nZSBhYm9ydCB0byBwaHlzaWNhbCBkZXZpY2UgcmVzZXQuCisJICovCisJaWYgKGFib3J0LT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDIpCisJCXJldHVybiBocHNhX3NlbmRfcmVzZXRfYXNfYWJvcnRfaW9hY2NlbDIoaCwgc2NzaTNhZGRyLCBhYm9ydCk7CisKIAkvKiB3ZSBkbyBub3QgZXhwZWN0IHRvIGZpbmQgdGhlIHN3aXp6bGVkIHRhZyBpbiBvdXIgcXVldWUsIGJ1dAogCSAqIGNoZWNrIGFueXdheSBqdXN0IHRvIGJlIHN1cmUgdGhlIGFzc3VtcHRpb25zIHdoaWNoIG1ha2UgdGhpcwogCSAqIHRoZSBjYXNlIGhhdmVuJ3QgYmVjb21lIHdyb25nLgpAQCAtMjYxNiw2ICs0NTY4LDcgQEAKIAlzdHJ1Y3Qgc2NzaV9jbW5kICphczsJLyogcHRyIHRvIHNjc2kgY21kIGluc2lkZSBhYm9ydGVkIGNvbW1hbmQuICovCiAJY2hhciBtc2dbMjU2XTsJCS8qIEZvciBkZWJ1ZyBtZXNzYWdpbmcuICovCiAJaW50IG1sID0gMDsKKwl1MzIgdGFndXBwZXIsIHRhZ2xvd2VyOwogCiAJLyogRmluZCB0aGUgY29udHJvbGxlciBvZiB0aGUgY29tbWFuZCB0byBiZSBhYm9ydGVkICovCiAJaCA9IHNkZXZfdG9faGJhKHNjLT5kZXZpY2UpOwpAQCAtMjY0OCw5ICs0NjAxLDggQEAKIAkJCQltc2cpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KLQotCW1sICs9IHNwcmludGYobXNnK21sLCAiVGFnOjB4JTA4eDolMDh4ICIsCi0JCWFib3J0LT5IZWFkZXIuVGFnLnVwcGVyLCBhYm9ydC0+SGVhZGVyLlRhZy5sb3dlcik7CisJaHBzYV9nZXRfdGFnKGgsIGFib3J0LCAmdGFnbG93ZXIsICZ0YWd1cHBlcik7CisJbWwgKz0gc3ByaW50Zihtc2crbWwsICJUYWc6MHglMDh4OiUwOHggIiwgdGFndXBwZXIsIHRhZ2xvd2VyKTsKIAlhcyAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBhYm9ydC0+c2NzaV9jbWQ7CiAJaWYgKGFzICE9IE5VTEwpCiAJCW1sICs9IHNwcmludGYobXNnK21sLCAiQ29tbWFuZDoweCV4IFNOOjB4JWx4ICIsCkBAIC0yNzc2LDYgKzQ3MjgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAltZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7CiAKKwljLT5jbWRfdHlwZSA9IENNRF9TQ1NJOwogCWMtPmNtZGluZGV4ID0gLTE7CiAKIAljLT5lcnJfaW5mbyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZigqYy0+ZXJyX2luZm8pLApAQCAtMzAzOCw3ICs0OTkxLDcgQEAKIAkJYy0+U0dbMF0uQWRkci5sb3dlciA9IHRlbXA2NC52YWwzMi5sb3dlcjsKIAkJYy0+U0dbMF0uQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKIAkJYy0+U0dbMF0uTGVuID0gaW9jb21tYW5kLmJ1Zl9zaXplOwotCQljLT5TR1swXS5FeHQgPSAwOyAvKiB3ZSBhcmUgbm90IGNoYWluaW5nKi8KKwkJYy0+U0dbMF0uRXh0ID0gSFBTQV9TR19MQVNUOyAvKiB3ZSBhcmUgbm90IGNoYWluaW5nKi8KIAl9CiAJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZV9pZl9ub19sb2NrdXAoaCwgYyk7CiAJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDApCkBAIC0zMTY4LDggKzUxMjEsNyBAQAogCQkJYy0+U0dbaV0uQWRkci5sb3dlciA9IHRlbXA2NC52YWwzMi5sb3dlcjsKIAkJCWMtPlNHW2ldLkFkZHIudXBwZXIgPSB0ZW1wNjQudmFsMzIudXBwZXI7CiAJCQljLT5TR1tpXS5MZW4gPSBidWZmX3NpemVbaV07Ci0JCQkvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCi0JCQljLT5TR1tpXS5FeHQgPSAwOworCQkJYy0+U0dbaV0uRXh0ID0gaSA8IHNnX3VzZWQgLSAxID8gMCA6IEhQU0FfU0dfTEFTVDsKIAkJfQogCX0KIAlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlX2lmX25vX2xvY2t1cChoLCBjKTsKQEAgLTMzMDQsNyArNTI1Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZmlsbF9jbWQoc3RydWN0IENvbW1hbmRMaXN0ICpjLCB1OCBjbWQsIHN0cnVjdCBjdGxyX2luZm8gKmgsCi0Jdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHU4IHBhZ2VfY29kZSwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAorCXZvaWQgKmJ1ZmYsIHNpemVfdCBzaXplLCB1MTYgcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCiAJaW50IGNtZF90eXBlKQogewogCWludCBwY2lfZGlyID0gWEZFUl9OT05FOwpAQCAtMzMyNyw5ICs1Mjc5LDkgQEAKIAkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBIUFNBX0lOUVVJUlk6CiAJCQkvKiBhcmUgd2UgdHJ5aW5nIHRvIHJlYWQgYSB2aXRhbCBwcm9kdWN0IHBhZ2UgKi8KLQkJCWlmIChwYWdlX2NvZGUgIT0gMCkgeworCQkJaWYgKHBhZ2VfY29kZSAmIFZQRF9QQUdFKSB7CiAJCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAweDAxOwotCQkJCWMtPlJlcXVlc3QuQ0RCWzJdID0gcGFnZV9jb2RlOworCQkJCWMtPlJlcXVlc3QuQ0RCWzJdID0gKHBhZ2VfY29kZSAmIDB4ZmYpOwogCQkJfQogCQkJYy0+UmVxdWVzdC5DREJMZW4gPSA2OwogCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOwpAQCAtMzM2OSw2ICs1MzIxLDI4IEBACiAJCQljLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID0gWEZFUl9OT05FOwogCQkJYy0+UmVxdWVzdC5UaW1lb3V0ID0gMDsKIAkJCWJyZWFrOworCQljYXNlIEhQU0FfR0VUX1JBSURfTUFQOgorCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxMjsKKwkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKKwkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1JFQUQ7CisJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOworCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBIUFNBX0NJU1NfUkVBRDsKKwkJCWMtPlJlcXVlc3QuQ0RCWzFdID0gY21kOworCQkJYy0+UmVxdWVzdC5DREJbNl0gPSAoc2l6ZSA+PiAyNCkgJiAweEZGOyAvKiBNU0IgKi8KKwkJCWMtPlJlcXVlc3QuQ0RCWzddID0gKHNpemUgPj4gMTYpICYgMHhGRjsKKwkJCWMtPlJlcXVlc3QuQ0RCWzhdID0gKHNpemUgPj4gOCkgJiAweEZGOworCQkJYy0+UmVxdWVzdC5DREJbOV0gPSBzaXplICYgMHhGRjsKKwkJCWJyZWFrOworCQljYXNlIEJNSUNfU0VOU0VfQ09OVFJPTExFUl9QQVJBTUVURVJTOgorCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxMDsKKwkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKKwkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1JFQUQ7CisJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOworCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBCTUlDX1JFQUQ7CisJCQljLT5SZXF1ZXN0LkNEQls2XSA9IEJNSUNfU0VOU0VfQ09OVFJPTExFUl9QQVJBTUVURVJTOworCQkJYy0+UmVxdWVzdC5DREJbN10gPSAoc2l6ZSA+PiAxNikgJiAweEZGOworCQkJYy0+UmVxdWVzdC5DREJbOF0gPSAoc2l6ZSA+PiA4KSAmIDB4RkY7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJ1bmtub3duIGNvbW1hbmQgMHglY1xuIiwgY21kKTsKIAkJCUJVRygpOwpAQCAtMzU2Miw3ICs1NTM2LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CiAKIAlkaWFsX3VwX2xvY2t1cF9kZXRlY3Rpb25fb25fZndfZmxhc2hfY29tcGxldGUoYy0+aCwgYyk7Ci0JaWYgKGxpa2VseShjLT5jbWRfdHlwZSA9PSBDTURfU0NTSSkpCisJaWYgKGxpa2VseShjLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDEgfHwgYy0+Y21kX3R5cGUgPT0gQ01EX1NDU0kKKwkJCXx8IGMtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMikpCiAJCWNvbXBsZXRlX3Njc2lfY29tbWFuZChjKTsKIAllbHNlIGlmIChjLT5jbWRfdHlwZSA9PSBDTURfSU9DVExfUEVORCkKIAkJY29tcGxldGUoYy0+d2FpdGluZyk7CkBAIC00MTY5LDIxICs2MTQ0LDI0IEBACiAJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKIAlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShoLT5wZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKSB7CiAJCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICJNU0lYXG4iKTsKKwkJaC0+bXNpeF92ZWN0b3IgPSBNQVhfUkVQTFlfUVVFVUVTOwogCQllcnIgPSBwY2lfZW5hYmxlX21zaXgoaC0+cGRldiwgaHBzYV9tc2l4X2VudHJpZXMsCi0JCQkJCQlNQVhfUkVQTFlfUVVFVUVTKTsKLQkJaWYgKCFlcnIpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVQTFlfUVVFVUVTOyBpKyspCi0JCQkJaC0+aW50cltpXSA9IGhwc2FfbXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKLQkJCWgtPm1zaXhfdmVjdG9yID0gMTsKLQkJCXJldHVybjsKLQkJfQorCQkJCSAgICAgIGgtPm1zaXhfdmVjdG9yKTsKIAkJaWYgKGVyciA+IDApIHsKIAkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJvbmx5ICVkIE1TSS1YIHZlY3RvcnMgIgogCQkJICAgICAgICJhdmFpbGFibGVcbiIsIGVycik7Ci0JCQlnb3RvIGRlZmF1bHRfaW50X21vZGU7CisJCQloLT5tc2l4X3ZlY3RvciA9IGVycjsKKwkJCWVyciA9IHBjaV9lbmFibGVfbXNpeChoLT5wZGV2LCBocHNhX21zaXhfZW50cmllcywKKwkJCQkJICAgICAgaC0+bXNpeF92ZWN0b3IpOworCQl9CisJCWlmICghZXJyKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgaC0+bXNpeF92ZWN0b3I7IGkrKykKKwkJCQloLT5pbnRyW2ldID0gaHBzYV9tc2l4X2VudHJpZXNbaV0udmVjdG9yOworCQkJcmV0dXJuOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIk1TSS1YIGluaXQgZmFpbGVkICVkXG4iLAogCQkJICAgICAgIGVycik7CisJCQloLT5tc2l4X3ZlY3RvciA9IDA7CiAJCQlnb3RvIGRlZmF1bHRfaW50X21vZGU7CiAJCX0KIAl9CkBAIC00MzM2LDYgKzYzMTQsNyBAQAogCWhwc2FfZ2V0X21heF9wZXJmX21vZGVfY21kcyhoKTsKIAloLT5ucl9jbWRzID0gaC0+bWF4X2NvbW1hbmRzIC0gNDsgLyogQWxsb3cgcm9vbSBmb3Igc29tZSBpb2N0bHMgKi8KIAloLT5tYXhzZ2VudHJpZXMgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5NYXhTY2F0dGVyR2F0aGVyRWxlbWVudHMpKTsKKwloLT5md19zdXBwb3J0ID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+bWlzY19md19zdXBwb3J0KSk7CiAJLyoKIAkgKiBMaW1pdCBpbi1jb21tYW5kIHMvZyBlbGVtZW50cyB0byAzMiBzYXZlIGRtYSdhYmxlIG1lbW9yeS4KIAkgKiBIb3d2ZXZlciBzcGVjIHNheXMgaWYgMCwgdXNlIDMxCkBAIC00MzUyLDYgKzYzMzEsMTAgQEAKIAogCS8qIEZpbmQgb3V0IHdoYXQgdGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkIGFuZCBjYWNoZSAqLwogCWgtPlRNRlN1cHBvcnRGbGFncyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRNRlN1cHBvcnRGbGFncykpOworCWlmICghKEhQU0FUTUZfUEhZU19UQVNLX0FCT1JUICYgaC0+VE1GU3VwcG9ydEZsYWdzKSkKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIlBoeXNpY2FsIGFib3J0cyBub3Qgc3VwcG9ydGVkXG4iKTsKKwlpZiAoIShIUFNBVE1GX0xPR19UQVNLX0FCT1JUICYgaC0+VE1GU3VwcG9ydEZsYWdzKSkKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkxvZ2ljYWwgYWJvcnRzIG5vdCBzdXBwb3J0ZWRcbiIpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaHBzYV9DSVNTX3NpZ25hdHVyZV9wcmVzZW50KHN0cnVjdCBjdGxyX2luZm8gKmgpCkBAIC00MzkwLDYgKzYzNzMsMjMgQEAKIAl3cml0ZWwoZG1hX3ByZWZldGNoLCBoLT52YWRkciArIEkyT19ETUExX0NGRyk7CiB9CiAKK3N0YXRpYyB2b2lkIGhwc2Ffd2FpdF9mb3JfY2xlYXJfZXZlbnRfbm90aWZ5X2FjayhzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWludCBpOworCXUzMiBkb29yYmVsbF92YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIHdhaXQgdW50aWwgdGhlIGNsZWFyX2V2ZW50X25vdGlmeSBiaXQgNiBpcyBjbGVhcmVkIGJ5IGNvbnRyb2xsZXIuICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT05GSUdfV0FJVDsgaSsrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJCWRvb3JiZWxsX3ZhbHVlID0gcmVhZGwoaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJCWlmICghKGRvb3JiZWxsX3ZhbHVlICYgRE9PUkJFTExfQ0xFQVJfRVZFTlRTKSkKKwkJCWJyZWFrOworCQkvKiBkZWxheSBhbmQgdHJ5IGFnYWluICovCisJCW1zbGVlcCgyMCk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhzdHJ1Y3QgY3Rscl9pbmZvICpoKQogewogCWludCBpOwpAQCAtNDQyMCwxOCArNjQyMCwyMCBAQAogCQlyZXR1cm4gLUVOT1RTVVBQOwogCiAJaC0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+Q21kc091dE1heCkpOworCiAJLyogVXBkYXRlIHRoZSBmaWVsZCwgYW5kIHRoZW4gcmluZyB0aGUgZG9vcmJlbGwgKi8KIAl3cml0ZWwoQ0ZHVEJMX1RyYW5zX1NpbXBsZSwgJihoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwl3cml0ZWwoMCwgJmgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuY29tbWFuZF9wb29sX2FkZHJfaGkpOwogCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CiAJaHBzYV93YWl0X2Zvcl9tb2RlX2NoYW5nZV9hY2soaCk7CiAJcHJpbnRfY2ZnX3RhYmxlKCZoLT5wZGV2LT5kZXYsIGgtPmNmZ3RhYmxlKTsKLQlpZiAoIShyZWFkbCgmKGgtPmNmZ3RhYmxlLT5UcmFuc3BvcnRBY3RpdmUpKSAmIENGR1RCTF9UcmFuc19TaW1wbGUpKSB7Ci0JCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCi0JCQkidW5hYmxlIHRvIGdldCBib2FyZCBpbnRvIHNpbXBsZSBtb2RlXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlmICghKHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydEFjdGl2ZSkpICYgQ0ZHVEJMX1RyYW5zX1NpbXBsZSkpCisJCWdvdG8gZXJyb3I7CiAJaC0+dHJhbnNNZXRob2QgPSBDRkdUQkxfVHJhbnNfU2ltcGxlOwogCXJldHVybiAwOworZXJyb3I6CisJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgYm9hcmQgaW50byBzaW1wbGUgbW9kZVxuIik7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKIHN0YXRpYyBpbnQgaHBzYV9wY2lfaW5pdChzdHJ1Y3QgY3Rscl9pbmZvICpoKQpAQCAtNDU3NywxMSArNjU3OSwxOSBAQAogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsCiAJCQkgICAgaC0+bnJfY21kcyAqIHNpemVvZihzdHJ1Y3QgQ29tbWFuZExpc3QpLAogCQkJICAgIGgtPmNtZF9wb29sLCBoLT5jbWRfcG9vbF9kaGFuZGxlKTsKKwlpZiAoaC0+aW9hY2NlbDJfY21kX3Bvb2wpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWwyX2NtZF9wb29sKSwKKwkJCWgtPmlvYWNjZWwyX2NtZF9wb29sLCBoLT5pb2FjY2VsMl9jbWRfcG9vbF9kaGFuZGxlKTsKIAlpZiAoaC0+ZXJyaW5mb19wb29sKQogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsCiAJCQkgICAgaC0+bnJfY21kcyAqIHNpemVvZihzdHJ1Y3QgRXJyb3JJbmZvKSwKIAkJCSAgICBoLT5lcnJpbmZvX3Bvb2wsCiAJCQkgICAgaC0+ZXJyaW5mb19wb29sX2RoYW5kbGUpOworCWlmIChoLT5pb2FjY2VsX2NtZF9wb29sKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsCisJCQloLT5ucl9jbWRzICogc2l6ZW9mKHN0cnVjdCBpb19hY2NlbDFfY21kKSwKKwkJCWgtPmlvYWNjZWxfY21kX3Bvb2wsIGgtPmlvYWNjZWxfY21kX3Bvb2xfZGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBpbnQgaHBzYV9yZXF1ZXN0X2lycShzdHJ1Y3QgY3Rscl9pbmZvICpoLApAQCAtNDU5NywxNSArNjYwNywxNSBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVQTFlfUVVFVUVTOyBpKyspCiAJCWgtPnFbaV0gPSAodTgpIGk7CiAKLQlpZiAoaC0+aW50cl9tb2RlID09IFBFUkZfTU9ERV9JTlQgJiYgaC0+bXNpeF92ZWN0b3IpIHsKKwlpZiAoaC0+aW50cl9tb2RlID09IFBFUkZfTU9ERV9JTlQgJiYgaC0+bXNpeF92ZWN0b3IgPiAwKSB7CiAJCS8qIElmIHBlcmZvcm1hbnQgbW9kZSBhbmQgTVNJLVgsIHVzZSBtdWx0aXBsZSByZXBseSBxdWV1ZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9SRVBMWV9RVUVVRVM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGgtPm1zaXhfdmVjdG9yOyBpKyspCiAJCQlyYyA9IHJlcXVlc3RfaXJxKGgtPmludHJbaV0sIG1zaXhoYW5kbGVyLAogCQkJCQkwLCBoLT5kZXZuYW1lLAogCQkJCQkmaC0+cVtpXSk7CiAJfSBlbHNlIHsKIAkJLyogVXNlIHNpbmdsZSByZXBseSBwb29sICovCi0JCWlmIChoLT5tc2l4X3ZlY3RvciB8fCBoLT5tc2lfdmVjdG9yKSB7CisJCWlmIChoLT5tc2l4X3ZlY3RvciA+IDAgfHwgaC0+bXNpX3ZlY3RvcikgewogCQkJcmMgPSByZXF1ZXN0X2lycShoLT5pbnRyW2gtPmludHJfbW9kZV0sCiAJCQkJbXNpeGhhbmRsZXIsIDAsIGgtPmRldm5hbWUsCiAJCQkJJmgtPnFbaC0+aW50cl9tb2RlXSk7CkBAIC00NjU4LDcgKzY2NjgsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9SRVBMWV9RVUVVRVM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgaC0+bXNpeF92ZWN0b3I7IGkrKykKIAkJZnJlZV9pcnEoaC0+aW50cltpXSwgJmgtPnFbaV0pOwogfQogCkBAIC00NjgxLDYgKzY2OTEsNyBAQAogCWhwc2FfZnJlZV9pcnFzX2FuZF9kaXNhYmxlX21zaXgoaCk7CiAJaHBzYV9mcmVlX3NnX2NoYWluX2Jsb2NrcyhoKTsKIAlocHNhX2ZyZWVfY21kX3Bvb2woaCk7CisJa2ZyZWUoaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlKTsKIAlrZnJlZShoLT5ibG9ja0ZldGNoVGFibGUpOwogCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwgaC0+cmVwbHlfcG9vbF9zaXplLAogCQloLT5yZXBseV9wb29sLCBoLT5yZXBseV9wb29sX2RoYW5kbGUpOwpAQCAtNDc2MCw2ICs2NzcxLDkyIEBACiAJaC0+bGFzdF9oZWFydGJlYXRfdGltZXN0YW1wID0gbm93OwogfQogCitzdGF0aWMgdm9pZCBocHNhX2Fja19jdGxyX2V2ZW50cyhzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWludCBpOworCWNoYXIgKmV2ZW50X3R5cGU7CisKKwkvKiBDbGVhciB0aGUgZHJpdmVyLXJlcXVlc3RlZCByZXNjYW4gZmxhZyAqLworCWgtPmRydl9yZXFfcmVzY2FuID0gMDsKKworCS8qIEFzayB0aGUgY29udHJvbGxlciB0byBjbGVhciB0aGUgZXZlbnRzIHdlJ3JlIGhhbmRsaW5nLiAqLworCWlmICgoaC0+dHJhbnNNZXRob2QgJiAoQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMQorCQkJfCBDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSkgJiYKKwkJKGgtPmV2ZW50cyAmIEhQU0FfRVZFTlRfTk9USUZZX0FDQ0VMX0lPX1BBVEhfU1RBVEVfQ0hBTkdFIHx8CisJCSBoLT5ldmVudHMgJiBIUFNBX0VWRU5UX05PVElGWV9BQ0NFTF9JT19QQVRIX0NPTkZJR19DSEFOR0UpKSB7CisKKwkJaWYgKGgtPmV2ZW50cyAmIEhQU0FfRVZFTlRfTk9USUZZX0FDQ0VMX0lPX1BBVEhfU1RBVEVfQ0hBTkdFKQorCQkJZXZlbnRfdHlwZSA9ICJzdGF0ZSBjaGFuZ2UiOworCQlpZiAoaC0+ZXZlbnRzICYgSFBTQV9FVkVOVF9OT1RJRllfQUNDRUxfSU9fUEFUSF9DT05GSUdfQ0hBTkdFKQorCQkJZXZlbnRfdHlwZSA9ICJjb25maWd1cmF0aW9uIGNoYW5nZSI7CisJCS8qIFN0b3Agc2VuZGluZyBuZXcgUkFJRCBvZmZsb2FkIHJlcXMgdmlhIHRoZSBJTyBhY2NlbGVyYXRvciAqLworCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGgtPnNjc2lfaG9zdCk7CisJCWZvciAoaSA9IDA7IGkgPCBoLT5uZGV2aWNlczsgaSsrKQorCQkJaC0+ZGV2W2ldLT5vZmZsb2FkX2VuYWJsZWQgPSAwOworCQlocHNhX2RyYWluX2FjY2VsX2NvbW1hbmRzKGgpOworCQkvKiBTZXQgJ2FjY2VsZXJhdG9yIHBhdGggY29uZmlnIGNoYW5nZScgYml0ICovCisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkiQWNrbm93bGVkZ2luZyBldmVudDogMHglMDh4IChIUCBTU0QgU21hcnQgUGF0aCAlcylcbiIsCisJCQloLT5ldmVudHMsIGV2ZW50X3R5cGUpOworCQl3cml0ZWwoaC0+ZXZlbnRzLCAmKGgtPmNmZ3RhYmxlLT5jbGVhcl9ldmVudF9ub3RpZnkpKTsKKwkJLyogU2V0IHRoZSAiY2xlYXIgZXZlbnQgbm90aWZ5IGZpZWxkIHVwZGF0ZSIgYml0IDYgKi8KKwkJd3JpdGVsKERPT1JCRUxMX0NMRUFSX0VWRU5UUywgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQkvKiBXYWl0IHVudGlsIGN0bHIgY2xlYXJzICdjbGVhciBldmVudCBub3RpZnkgZmllbGQnLCBiaXQgNiAqLworCQlocHNhX3dhaXRfZm9yX2NsZWFyX2V2ZW50X25vdGlmeV9hY2soaCk7CisJCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhoLT5zY3NpX2hvc3QpOworCX0gZWxzZSB7CisJCS8qIEFja25vd2xlZGdlIGNvbnRyb2xsZXIgbm90aWZpY2F0aW9uIGV2ZW50cy4gKi8KKwkJd3JpdGVsKGgtPmV2ZW50cywgJihoLT5jZmd0YWJsZS0+Y2xlYXJfZXZlbnRfbm90aWZ5KSk7CisJCXdyaXRlbChET09SQkVMTF9DTEVBUl9FVkVOVFMsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKKwkJaHBzYV93YWl0X2Zvcl9jbGVhcl9ldmVudF9ub3RpZnlfYWNrKGgpOworI2lmIDAKKwkJd3JpdGVsKENGR1RCTF9DaGFuZ2VSZXEsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKKwkJaHBzYV93YWl0X2Zvcl9tb2RlX2NoYW5nZV9hY2soaCk7CisjZW5kaWYKKwl9CisJcmV0dXJuOworfQorCisvKiBDaGVjayBhIHJlZ2lzdGVyIG9uIHRoZSBjb250cm9sbGVyIHRvIHNlZSBpZiB0aGVyZSBhcmUgY29uZmlndXJhdGlvbgorICogY2hhbmdlcyAoYWRkZWQvY2hhbmdlZC9yZW1vdmVkIGxvZ2ljYWwgZHJpdmVzLCBldGMuKSB3aGljaCBtZWFuIHRoYXQKKyAqIHdlIHNob3VsZCByZXNjYW4gdGhlIGNvbnRyb2xsZXIgZm9yIGRldmljZXMuCisgKiBBbHNvIGNoZWNrIGZsYWcgZm9yIGRyaXZlci1pbml0aWF0ZWQgcmVzY2FuLgorICovCitzdGF0aWMgaW50IGhwc2FfY3Rscl9uZWVkc19yZXNjYW4oc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlpZiAoaC0+ZHJ2X3JlcV9yZXNjYW4pCisJCXJldHVybiAxOworCisJaWYgKCEoaC0+Zndfc3VwcG9ydCAmIE1JU0NfRldfRVZFTlRfTk9USUZZKSkKKwkJcmV0dXJuIDA7CisKKwloLT5ldmVudHMgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5ldmVudF9ub3RpZnkpKTsKKwlyZXR1cm4gaC0+ZXZlbnRzICYgUkVTQ0FOX1JFUVVJUkVEX0VWRU5UX0JJVFM7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhbnkgb2YgdGhlIG9mZmxpbmUgZGV2aWNlcyBoYXZlIGJlY29tZSByZWFkeQorICovCitzdGF0aWMgaW50IGhwc2Ffb2ZmbGluZV9kZXZpY2VzX3JlYWR5KHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgb2ZmbGluZV9kZXZpY2VfZW50cnkgKmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqdGhpcywgKnRtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5vZmZsaW5lX2RldmljZV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRoaXMsIHRtcCwgJmgtPm9mZmxpbmVfZGV2aWNlX2xpc3QpIHsKKwkJZCA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IG9mZmxpbmVfZGV2aWNlX2VudHJ5LAorCQkJCW9mZmxpbmVfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFocHNhX3ZvbHVtZV9vZmZsaW5lKGgsIGQtPnNjc2kzYWRkcikpCisJCQlyZXR1cm4gMTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPm9mZmxpbmVfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyB2b2lkIGhwc2FfbW9uaXRvcl9jdGxyX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ3NjgsNiArNjg2NSwxNSBAQAogCWRldGVjdF9jb250cm9sbGVyX2xvY2t1cChoKTsKIAlpZiAoaC0+bG9ja3VwX2RldGVjdGVkKQogCQlyZXR1cm47CisKKwlpZiAoaHBzYV9jdGxyX25lZWRzX3Jlc2NhbihoKSB8fCBocHNhX29mZmxpbmVfZGV2aWNlc19yZWFkeShoKSkgeworCQlzY3NpX2hvc3RfZ2V0KGgtPnNjc2lfaG9zdCk7CisJCWgtPmRydl9yZXFfcmVzY2FuID0gMDsKKwkJaHBzYV9hY2tfY3Rscl9ldmVudHMoaCk7CisJCWhwc2Ffc2Nhbl9zdGFydChoLT5zY3NpX2hvc3QpOworCQlzY3NpX2hvc3RfcHV0KGgtPnNjc2lfaG9zdCk7CisJfQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKIAlpZiAoaC0+cmVtb3ZlX2luX3Byb2dyZXNzKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKQEAgLTQ4MDcsNyArNjkxMyw3IEBACiAJICogdGhlIDUgbG93ZXIgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgdXNlZCBieSB0aGUgaGFyZHdhcmUuIGFuZCBieQogCSAqIHRoZSBkcml2ZXIuICBTZWUgY29tbWVudHMgaW4gaHBzYS5oIGZvciBtb3JlIGluZm8uCiAJICovCi0jZGVmaW5lIENPTU1BTkRMSVNUX0FMSUdOTUVOVCAzMgorI2RlZmluZSBDT01NQU5ETElTVF9BTElHTk1FTlQgMTI4CiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgQ29tbWFuZExpc3QpICUgQ09NTUFORExJU1RfQUxJR05NRU5UKTsKIAloID0ga3phbGxvYyhzaXplb2YoKmgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWgpCkBAIC00ODE3LDcgKzY5MjMsOSBAQAogCWgtPmludHJfbW9kZSA9IGhwc2Ffc2ltcGxlX21vZGUgPyBTSU1QTEVfTU9ERV9JTlQgOiBQRVJGX01PREVfSU5UOwogCUlOSVRfTElTVF9IRUFEKCZoLT5jbXBRKTsKIAlJTklUX0xJU1RfSEVBRCgmaC0+cmVxUSk7CisJSU5JVF9MSVNUX0hFQUQoJmgtPm9mZmxpbmVfZGV2aWNlX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZoLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaC0+b2ZmbGluZV9kZXZpY2VfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmgtPnNjYW5fbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmgtPnBhc3N0aHJ1X2NvdW50X2xvY2spOwogCXJjID0gaHBzYV9wY2lfaW5pdChoKTsKQEAgLTQ4NTksNiArNjk2Nyw3IEBACiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgaCk7CiAJaC0+bmRldmljZXMgPSAwOworCWgtPmhiYV9tb2RlX2VuYWJsZWQgPSAwOwogCWgtPnNjc2lfaG9zdCA9IE5VTEw7CiAJc3Bpbl9sb2NrX2luaXQoJmgtPmRldmxvY2spOwogCWhwc2FfcHV0X2N0bHJfaW50b19wZXJmb3JtYW50X21vZGUoaCk7CkBAIC00OTE4LDYgKzcwMjcsMTEgQEAKIAkJZ290byByZWluaXRfYWZ0ZXJfc29mdF9yZXNldDsKIAl9CiAKKwkJLyogRW5hYmxlIEFjY2VsZXJhdGVkIElPIHBhdGggYXQgZHJpdmVyIGxheWVyICovCisJCWgtPmFjY2lvcGF0aF9zdGF0dXMgPSAxOworCisJaC0+ZHJ2X3JlcV9yZXNjYW4gPSAwOworCiAJLyogVHVybiB0aGUgaW50ZXJydXB0cyBvbiBzbyB3ZSBjYW4gc2VydmljZSByZXF1ZXN0cyAqLwogCWgtPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGgsIEhQU0FfSU5UUl9PTik7CiAKQEAgLTUwMzQsNiArNzE0OCw4IEBACiAJCWgtPnJlcGx5X3Bvb2wsIGgtPnJlcGx5X3Bvb2xfZGhhbmRsZSk7CiAJa2ZyZWUoaC0+Y21kX3Bvb2xfYml0cyk7CiAJa2ZyZWUoaC0+YmxvY2tGZXRjaFRhYmxlKTsKKwlrZnJlZShoLT5pb2FjY2VsMV9ibG9ja0ZldGNoVGFibGUpOworCWtmcmVlKGgtPmlvYWNjZWwyX2Jsb2NrRmV0Y2hUYWJsZSk7CiAJa2ZyZWUoaC0+aGJhX2lucXVpcnlfZGF0YSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CkBAIC01MDc0LDIwICs3MTkwLDE3IEBACiAgKiBiaXRzIG9mIHRoZSBjb21tYW5kIGFkZHJlc3MuCiAgKi8KIHN0YXRpYyB2b2lkICBjYWxjX2J1Y2tldF9tYXAoaW50IGJ1Y2tldFtdLCBpbnQgbnVtX2J1Y2tldHMsCi0JaW50IG5zZ3MsIGludCAqYnVja2V0X21hcCkKKwlpbnQgbnNncywgaW50IG1pbl9ibG9ja3MsIGludCAqYnVja2V0X21hcCkKIHsKIAlpbnQgaSwgaiwgYiwgc2l6ZTsKIAotCS8qIGV2ZW4gYSBjb21tYW5kIHdpdGggMCBTR3MgcmVxdWlyZXMgNCBibG9ja3MgKi8KLSNkZWZpbmUgTUlOSU1VTV9UUkFOU0ZFUl9CTE9DS1MgNAotI2RlZmluZSBOVU1fQlVDS0VUUyA4CiAJLyogTm90ZSwgYnVja2V0X21hcCBtdXN0IGhhdmUgbnNncysxIGVudHJpZXMuICovCiAJZm9yIChpID0gMDsgaSA8PSBuc2dzOyBpKyspIHsKIAkJLyogQ29tcHV0ZSBzaXplIG9mIGEgY29tbWFuZCB3aXRoIGkgU0cgZW50cmllcyAqLwotCQlzaXplID0gaSArIE1JTklNVU1fVFJBTlNGRVJfQkxPQ0tTOworCQlzaXplID0gaSArIG1pbl9ibG9ja3M7CiAJCWIgPSBudW1fYnVja2V0czsgLyogQXNzdW1lIHRoZSBiaWdnZXN0IGJ1Y2tldCAqLwogCQkvKiBGaW5kIHRoZSBidWNrZXQgdGhhdCBpcyBqdXN0IGJpZyBlbm91Z2ggKi8KLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQlmb3IgKGogPSAwOyBqIDwgbnVtX2J1Y2tldHM7IGorKykgewogCQkJaWYgKGJ1Y2tldFtqXSA+PSBzaXplKSB7CiAJCQkJYiA9IGo7CiAJCQkJYnJlYWs7CkBAIC01MDk4LDEwICs3MjExLDE2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBocHNhX2VudGVyX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1MzIgdXNlX3Nob3J0X3RhZ3MpCitzdGF0aWMgdm9pZCBocHNhX2VudGVyX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoLCB1MzIgdHJhbnNfc3VwcG9ydCkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgdHJhbnNNZXRob2QgPSBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCB8CisJCQkodHJhbnNfc3VwcG9ydCAmIENGR1RCTF9UcmFuc191c2Vfc2hvcnRfdGFncykgfAorCQkJCUNGR1RCTF9UcmFuc19lbmFibGVfZGlyZWN0ZWRfbXNpeCB8CisJCQkodHJhbnNfc3VwcG9ydCAmIChDRkdUQkxfVHJhbnNfaW9fYWNjZWwxIHwKKwkJCQlDRkdUQkxfVHJhbnNfaW9fYWNjZWwyKSk7CisJc3RydWN0IGFjY2Vzc19tZXRob2QgYWNjZXNzID0gU0E1X3BlcmZvcm1hbnRfYWNjZXNzOwogCiAJLyogVGhpcyBpcyBhIGJpdCBjb21wbGljYXRlZC4gIFRoZXJlIGFyZSA4IHJlZ2lzdGVycyBvbgogCSAqIHRoZSBjb250cm9sbGVyIHdoaWNoIHdlIHdyaXRlIHRvIHRvIHRlbGwgaXQgOCBkaWZmZXJlbnQKQEAgLTUxMjEsNiArNzI0MCwxNiBAQAogCSAqIHNpemVzIGZvciBzbWFsbCBjb21tYW5kcywgYW5kIGZld2VyIHNpemVzIGZvciBsYXJnZXIgY29tbWFuZHMuCiAJICovCiAJaW50IGJmdFs4XSA9IHs1LCA2LCA4LCAxMCwgMTIsIDIwLCAyOCwgU0dfRU5UUklFU19JTl9DTUQgKyA0fTsKKyNkZWZpbmUgTUlOX0lPQUNDRUwyX0JGVF9FTlRSWSA1CisjZGVmaW5lIEhQU0FfSU9BQ0NFTDJfSEVBREVSX1NaIDQKKwlpbnQgYmZ0MlsxNl0gPSB7TUlOX0lPQUNDRUwyX0JGVF9FTlRSWSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwKKwkJCTEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LAorCQkJSFBTQV9JT0FDQ0VMMl9IRUFERVJfU1ogKyBJT0FDQ0VMMl9NQVhTR0VOVFJJRVN9OworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGJmdDIpICE9IDE2KTsKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShiZnQpICE9IDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaW9fYWNjZWwyX2NtZCwgc2cpID4KKwkJCQkgMTYgKiBNSU5fSU9BQ0NFTDJfQkZUX0VOVFJZKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpb2FjY2VsMl9zZ19lbGVtZW50KSAhPSAxNik7CiAJQlVJTERfQlVHX09OKDI4ID4gU0dfRU5UUklFU19JTl9DTUQgKyA0KTsKIAkvKiAgNSA9IDEgcy9nIGVudHJ5IG9yIDRrCiAJICogIDYgPSAyIHMvZyBlbnRyeSBvciA4awpAQCAtNTEzMyw3ICs3MjYyLDcgQEAKIAogCWJmdFs3XSA9IFNHX0VOVFJJRVNfSU5fQ01EICsgNDsKIAljYWxjX2J1Y2tldF9tYXAoYmZ0LCBBUlJBWV9TSVpFKGJmdCksCi0JCQkJU0dfRU5UUklFU19JTl9DTUQsIGgtPmJsb2NrRmV0Y2hUYWJsZSk7CisJCQkJU0dfRU5UUklFU19JTl9DTUQsIDQsIGgtPmJsb2NrRmV0Y2hUYWJsZSk7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJd3JpdGVsKGJmdFtpXSwgJmgtPnRyYW5zdGFibGUtPkJsb2NrRmV0Y2hbaV0pOwogCkBAIC01MTUwLDkgKzcyNzksMjIgQEAKIAkJCSZoLT50cmFuc3RhYmxlLT5SZXBRQWRkcltpXS5sb3dlcik7CiAJfQogCi0Jd3JpdGVsKENGR1RCTF9UcmFuc19QZXJmb3JtYW50IHwgdXNlX3Nob3J0X3RhZ3MgfAotCQlDRkdUQkxfVHJhbnNfZW5hYmxlX2RpcmVjdGVkX21zaXgsCi0JCSYoaC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5UcmFuc3BvcnRSZXF1ZXN0KSk7CisJd3JpdGVsKDAsICZoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLmNvbW1hbmRfcG9vbF9hZGRyX2hpKTsKKwl3cml0ZWwodHJhbnNNZXRob2QsICYoaC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5UcmFuc3BvcnRSZXF1ZXN0KSk7CisJLyoKKwkgKiBlbmFibGUgb3V0Ym91bmQgaW50ZXJydXB0IGNvYWxlc2NpbmcgaW4gYWNjZWxlcmF0b3IgbW9kZTsKKwkgKi8KKwlpZiAodHJhbnNfc3VwcG9ydCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDEpIHsKKwkJYWNjZXNzID0gU0E1X2lvYWNjZWxfbW9kZTFfYWNjZXNzOworCQl3cml0ZWwoMTAsICZoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnREZWxheSk7CisJCXdyaXRlbCg0LCAmaC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50Q291bnQpOworCX0gZWxzZSB7CisJCWlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMikgeworCQkJYWNjZXNzID0gU0E1X2lvYWNjZWxfbW9kZTJfYWNjZXNzOworCQkJd3JpdGVsKDEwLCAmaC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpOworCQkJd3JpdGVsKDQsICZoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnRDb3VudCk7CisJCX0KKwl9CiAJd3JpdGVsKENGR1RCTF9DaGFuZ2VSZXEsIGgtPnZhZGRyICsgU0E1X0RPT1JCRUxMKTsKIAlocHNhX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKIAlyZWdpc3Rlcl92YWx1ZSA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydEFjdGl2ZSkpOwpAQCAtNTE2MiwyMyArNzMwNCwxODYgQEAKIAkJcmV0dXJuOwogCX0KIAkvKiBDaGFuZ2UgdGhlIGFjY2VzcyBtZXRob2RzIHRvIHRoZSBwZXJmb3JtYW50IGFjY2VzcyBtZXRob2RzICovCi0JaC0+YWNjZXNzID0gU0E1X3BlcmZvcm1hbnRfYWNjZXNzOwotCWgtPnRyYW5zTWV0aG9kID0gQ0ZHVEJMX1RyYW5zX1BlcmZvcm1hbnQ7CisJaC0+YWNjZXNzID0gYWNjZXNzOworCWgtPnRyYW5zTWV0aG9kID0gdHJhbnNNZXRob2Q7CisKKwlpZiAoISgodHJhbnNfc3VwcG9ydCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDEpIHx8CisJCSh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMikpKQorCQlyZXR1cm47CisKKwlpZiAodHJhbnNfc3VwcG9ydCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDEpIHsKKwkJLyogU2V0IHVwIEkvTyBhY2NlbGVyYXRvciBtb2RlICovCisJCWZvciAoaSA9IDA7IGkgPCBoLT5ucmVwbHlfcXVldWVzOyBpKyspIHsKKwkJCXdyaXRlbChpLCBoLT52YWRkciArIElPQUNDRUxfTU9ERTFfUkVQTFlfUVVFVUVfSU5ERVgpOworCQkJaC0+cmVwbHlfcXVldWVbaV0uY3VycmVudF9lbnRyeSA9CisJCQkJcmVhZGwoaC0+dmFkZHIgKyBJT0FDQ0VMX01PREUxX1BST0RVQ0VSX0lOREVYKTsKKwkJfQorCQliZnRbN10gPSBoLT5pb2FjY2VsX21heHNnICsgODsKKwkJY2FsY19idWNrZXRfbWFwKGJmdCwgQVJSQVlfU0laRShiZnQpLCBoLT5pb2FjY2VsX21heHNnLCA4LAorCQkJCWgtPmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZSk7CisKKwkJLyogaW5pdGlhbGl6ZSBhbGwgcmVwbHkgcXVldWUgZW50cmllcyB0byB1bnVzZWQgKi8KKwkJbWVtc2V0KGgtPnJlcGx5X3Bvb2wsICh1OCkgSU9BQ0NFTF9NT0RFMV9SRVBMWV9VTlVTRUQsCisJCQkJaC0+cmVwbHlfcG9vbF9zaXplKTsKKworCQkvKiBzZXQgYWxsIHRoZSBjb25zdGFudCBmaWVsZHMgaW4gdGhlIGFjY2VsZXJhdG9yIGNvbW1hbmQKKwkJICogZnJhbWVzIG9uY2UgYXQgaW5pdCB0aW1lIHRvIHNhdmUgQ1BVIGN5Y2xlcyBsYXRlci4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBoLT5ucl9jbWRzOyBpKyspIHsKKwkJCXN0cnVjdCBpb19hY2NlbDFfY21kICpjcCA9ICZoLT5pb2FjY2VsX2NtZF9wb29sW2ldOworCisJCQljcC0+ZnVuY3Rpb24gPSBJT0FDQ0VMMV9GVU5DVElPTl9TQ1NJSU87CisJCQljcC0+ZXJyX2luZm8gPSAodTMyKSAoaC0+ZXJyaW5mb19wb29sX2RoYW5kbGUgKworCQkJCQkoaSAqIHNpemVvZihzdHJ1Y3QgRXJyb3JJbmZvKSkpOworCQkJY3AtPmVycl9pbmZvX2xlbiA9IHNpemVvZihzdHJ1Y3QgRXJyb3JJbmZvKTsKKwkJCWNwLT5zZ2xfb2Zmc2V0ID0gSU9BQ0NFTDFfU0dMT0ZGU0VUOworCQkJY3AtPmhvc3RfY29udGV4dF9mbGFncyA9IElPQUNDRUwxX0hDRkxBR1NfQ0lTU19GT1JNQVQ7CisJCQljcC0+dGltZW91dF9zZWMgPSAwOworCQkJY3AtPlJlcGx5UXVldWUgPSAwOworCQkJY3AtPlRhZy5sb3dlciA9IChpIDw8IERJUkVDVF9MT09LVVBfU0hJRlQpIHwKKwkJCQkJCURJUkVDVF9MT09LVVBfQklUOworCQkJY3AtPlRhZy51cHBlciA9IDA7CisJCQljcC0+aG9zdF9hZGRyLmxvd2VyID0KKwkJCQkodTMyKSAoaC0+aW9hY2NlbF9jbWRfcG9vbF9kaGFuZGxlICsKKwkJCQkJKGkgKiBzaXplb2Yoc3RydWN0IGlvX2FjY2VsMV9jbWQpKSk7CisJCQljcC0+aG9zdF9hZGRyLnVwcGVyID0gMDsKKwkJfQorCX0gZWxzZSBpZiAodHJhbnNfc3VwcG9ydCAmIENGR1RCTF9UcmFuc19pb19hY2NlbDIpIHsKKwkJdTY0IGNmZ19vZmZzZXQsIGNmZ19iYXNlX2FkZHJfaW5kZXg7CisJCXUzMiBiZnQyX29mZnNldCwgY2ZnX2Jhc2VfYWRkcjsKKwkJaW50IHJjOworCisJCXJjID0gaHBzYV9maW5kX2NmZ19hZGRycyhoLT5wZGV2LCBoLT52YWRkciwgJmNmZ19iYXNlX2FkZHIsCisJCQkmY2ZnX2Jhc2VfYWRkcl9pbmRleCwgJmNmZ19vZmZzZXQpOworCQlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGlvX2FjY2VsMl9jbWQsIHNnKSAhPSA2NCk7CisJCWJmdDJbMTVdID0gaC0+aW9hY2NlbF9tYXhzZyArIEhQU0FfSU9BQ0NFTDJfSEVBREVSX1NaOworCQljYWxjX2J1Y2tldF9tYXAoYmZ0MiwgQVJSQVlfU0laRShiZnQyKSwgaC0+aW9hY2NlbF9tYXhzZywKKwkJCQk0LCBoLT5pb2FjY2VsMl9ibG9ja0ZldGNoVGFibGUpOworCQliZnQyX29mZnNldCA9IHJlYWRsKCZoLT5jZmd0YWJsZS0+aW9fYWNjZWxfcmVxdWVzdF9zaXplX29mZnNldCk7CisJCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgQ2ZnVGFibGUsCisJCQkJaW9fYWNjZWxfcmVxdWVzdF9zaXplX29mZnNldCkgIT0gMHhiOCk7CisJCWgtPmlvYWNjZWwyX2JmdDJfcmVncyA9CisJCQlyZW1hcF9wY2lfbWVtKHBjaV9yZXNvdXJjZV9zdGFydChoLT5wZGV2LAorCQkJCQljZmdfYmFzZV9hZGRyX2luZGV4KSArCisJCQkJCWNmZ19vZmZzZXQgKyBiZnQyX29mZnNldCwKKwkJCQkJQVJSQVlfU0laRShiZnQyKSAqCisJCQkJCXNpemVvZigqaC0+aW9hY2NlbDJfYmZ0Ml9yZWdzKSk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJmdDIpOyBpKyspCisJCQl3cml0ZWwoYmZ0MltpXSwgJmgtPmlvYWNjZWwyX2JmdDJfcmVnc1tpXSk7CisJfQorCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJaHBzYV93YWl0X2Zvcl9tb2RlX2NoYW5nZV9hY2soaCk7Cit9CisKK3N0YXRpYyBpbnQgaHBzYV9hbGxvY19pb2FjY2VsX2NtZF9hbmRfYmZ0KHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJaC0+aW9hY2NlbF9tYXhzZyA9CisJCXJlYWRsKCYoaC0+Y2ZndGFibGUtPmlvX2FjY2VsX21heF9lbWJlZGRlZF9zZ19jb3VudCkpOworCWlmIChoLT5pb2FjY2VsX21heHNnID4gSU9BQ0NFTDFfTUFYU0dFTlRSSUVTKQorCQloLT5pb2FjY2VsX21heHNnID0gSU9BQ0NFTDFfTUFYU0dFTlRSSUVTOworCisJLyogQ29tbWFuZCBzdHJ1Y3R1cmVzIG11c3QgYmUgYWxpZ25lZCBvbiBhIDEyOC1ieXRlIGJvdW5kYXJ5CisJICogYmVjYXVzZSB0aGUgNyBsb3dlciBiaXRzIG9mIHRoZSBhZGRyZXNzIGFyZSB1c2VkIGJ5IHRoZQorCSAqIGhhcmR3YXJlLgorCSAqLworI2RlZmluZSBJT0FDQ0VMMV9DT01NQU5ETElTVF9BTElHTk1FTlQgMTI4CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW9fYWNjZWwxX2NtZCkgJQorCQkJSU9BQ0NFTDFfQ09NTUFORExJU1RfQUxJR05NRU5UKTsKKwloLT5pb2FjY2VsX2NtZF9wb29sID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWxfY21kX3Bvb2wpLAorCQkJJihoLT5pb2FjY2VsX2NtZF9wb29sX2RoYW5kbGUpKTsKKworCWgtPmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZSA9CisJCWttYWxsb2MoKChoLT5pb2FjY2VsX21heHNnICsgMSkgKgorCQkJCXNpemVvZih1MzIpKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoKGgtPmlvYWNjZWxfY21kX3Bvb2wgPT0gTlVMTCkgfHwKKwkJKGgtPmlvYWNjZWwxX2Jsb2NrRmV0Y2hUYWJsZSA9PSBOVUxMKSkKKwkJZ290byBjbGVhbl91cDsKKworCW1lbXNldChoLT5pb2FjY2VsX2NtZF9wb29sLCAwLAorCQloLT5ucl9jbWRzICogc2l6ZW9mKCpoLT5pb2FjY2VsX2NtZF9wb29sKSk7CisJcmV0dXJuIDA7CisKK2NsZWFuX3VwOgorCWlmIChoLT5pb2FjY2VsX2NtZF9wb29sKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsCisJCQloLT5ucl9jbWRzICogc2l6ZW9mKCpoLT5pb2FjY2VsX2NtZF9wb29sKSwKKwkJCWgtPmlvYWNjZWxfY21kX3Bvb2wsIGgtPmlvYWNjZWxfY21kX3Bvb2xfZGhhbmRsZSk7CisJa2ZyZWUoaC0+aW9hY2NlbDFfYmxvY2tGZXRjaFRhYmxlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpb2FjY2VsMl9hbGxvY19jbWRzX2FuZF9iZnQoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwkvKiBBbGxvY2F0ZSBpb2FjY2VsMiBtb2RlIGNvbW1hbmQgYmxvY2tzIGFuZCBibG9jayBmZXRjaCB0YWJsZSAqLworCisJaC0+aW9hY2NlbF9tYXhzZyA9CisJCXJlYWRsKCYoaC0+Y2ZndGFibGUtPmlvX2FjY2VsX21heF9lbWJlZGRlZF9zZ19jb3VudCkpOworCWlmIChoLT5pb2FjY2VsX21heHNnID4gSU9BQ0NFTDJfTUFYU0dFTlRSSUVTKQorCQloLT5pb2FjY2VsX21heHNnID0gSU9BQ0NFTDJfTUFYU0dFTlRSSUVTOworCisjZGVmaW5lIElPQUNDRUwyX0NPTU1BTkRMSVNUX0FMSUdOTUVOVCAxMjgKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpb19hY2NlbDJfY21kKSAlCisJCQlJT0FDQ0VMMl9DT01NQU5ETElTVF9BTElHTk1FTlQpOworCWgtPmlvYWNjZWwyX2NtZF9wb29sID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaC0+cGRldiwKKwkJCWgtPm5yX2NtZHMgKiBzaXplb2YoKmgtPmlvYWNjZWwyX2NtZF9wb29sKSwKKwkJCSYoaC0+aW9hY2NlbDJfY21kX3Bvb2xfZGhhbmRsZSkpOworCisJaC0+aW9hY2NlbDJfYmxvY2tGZXRjaFRhYmxlID0KKwkJa21hbGxvYygoKGgtPmlvYWNjZWxfbWF4c2cgKyAxKSAqCisJCQkJc2l6ZW9mKHUzMikpLCBHRlBfS0VSTkVMKTsKKworCWlmICgoaC0+aW9hY2NlbDJfY21kX3Bvb2wgPT0gTlVMTCkgfHwKKwkJKGgtPmlvYWNjZWwyX2Jsb2NrRmV0Y2hUYWJsZSA9PSBOVUxMKSkKKwkJZ290byBjbGVhbl91cDsKKworCW1lbXNldChoLT5pb2FjY2VsMl9jbWRfcG9vbCwgMCwKKwkJaC0+bnJfY21kcyAqIHNpemVvZigqaC0+aW9hY2NlbDJfY21kX3Bvb2wpKTsKKwlyZXR1cm4gMDsKKworY2xlYW5fdXA6CisJaWYgKGgtPmlvYWNjZWwyX2NtZF9wb29sKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsCisJCQloLT5ucl9jbWRzICogc2l6ZW9mKCpoLT5pb2FjY2VsMl9jbWRfcG9vbCksCisJCQloLT5pb2FjY2VsMl9jbWRfcG9vbCwgaC0+aW9hY2NlbDJfY21kX3Bvb2xfZGhhbmRsZSk7CisJa2ZyZWUoaC0+aW9hY2NlbDJfYmxvY2tGZXRjaFRhYmxlKTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgaHBzYV9wdXRfY3Rscl9pbnRvX3BlcmZvcm1hbnRfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKQogewogCXUzMiB0cmFuc19zdXBwb3J0OworCXVuc2lnbmVkIGxvbmcgdHJhbnNNZXRob2QgPSBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCB8CisJCQkJCUNGR1RCTF9UcmFuc191c2Vfc2hvcnRfdGFnczsKIAlpbnQgaTsKIAogCWlmIChocHNhX3NpbXBsZV9tb2RlKQogCQlyZXR1cm47CiAKKwkvKiBDaGVjayBmb3IgSS9PIGFjY2VsZXJhdG9yIG1vZGUgc3VwcG9ydCAqLworCWlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMSkgeworCQl0cmFuc01ldGhvZCB8PSBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxIHwKKwkJCQlDRkdUQkxfVHJhbnNfZW5hYmxlX2RpcmVjdGVkX21zaXg7CisJCWlmIChocHNhX2FsbG9jX2lvYWNjZWxfY21kX2FuZF9iZnQoaCkpCisJCQlnb3RvIGNsZWFuX3VwOworCX0gZWxzZSB7CisJCWlmICh0cmFuc19zdXBwb3J0ICYgQ0ZHVEJMX1RyYW5zX2lvX2FjY2VsMikgeworCQkJCXRyYW5zTWV0aG9kIHw9IENGR1RCTF9UcmFuc19pb19hY2NlbDIgfAorCQkJCUNGR1RCTF9UcmFuc19lbmFibGVfZGlyZWN0ZWRfbXNpeDsKKwkJaWYgKGlvYWNjZWwyX2FsbG9jX2NtZHNfYW5kX2JmdChoKSkKKwkJCWdvdG8gY2xlYW5fdXA7CisJCX0KKwl9CisKKwkvKiBUT0RPLCBjaGVjayB0aGF0IHRoaXMgbmV4dCBsaW5lIGgtPm5yZXBseV9xdWV1ZXMgaXMgY29ycmVjdCAqLwogCXRyYW5zX3N1cHBvcnQgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5UcmFuc3BvcnRTdXBwb3J0KSk7CiAJaWYgKCEodHJhbnNfc3VwcG9ydCAmIFBFUkZPUk1BTlRfTU9ERSkpCiAJCXJldHVybjsKIAotCWgtPm5yZXBseV9xdWV1ZXMgPSBoLT5tc2l4X3ZlY3RvciA/IE1BWF9SRVBMWV9RVUVVRVMgOiAxOworCWgtPm5yZXBseV9xdWV1ZXMgPSBoLT5tc2l4X3ZlY3RvciA+IDAgPyBoLT5tc2l4X3ZlY3RvciA6IDE7CiAJaHBzYV9nZXRfbWF4X3BlcmZfbW9kZV9jbWRzKGgpOwogCS8qIFBlcmZvcm1hbnQgbW9kZSByaW5nIGJ1ZmZlciBhbmQgc3VwcG9ydGluZyBkYXRhIHN0cnVjdHVyZXMgKi8KIAloLT5yZXBseV9wb29sX3NpemUgPSBoLT5tYXhfY29tbWFuZHMgKiBzaXplb2YodTY0KSAqIGgtPm5yZXBseV9xdWV1ZXM7CkBAIC01MjAwLDkgKzc1MDUsNyBAQAogCQl8fCAoaC0+YmxvY2tGZXRjaFRhYmxlID09IE5VTEwpKQogCQlnb3RvIGNsZWFuX3VwOwogCi0JaHBzYV9lbnRlcl9wZXJmb3JtYW50X21vZGUoaCwKLQkJdHJhbnNfc3VwcG9ydCAmIENGR1RCTF9UcmFuc191c2Vfc2hvcnRfdGFncyk7Ci0KKwlocHNhX2VudGVyX3BlcmZvcm1hbnRfbW9kZShoLCB0cmFuc19zdXBwb3J0KTsKIAlyZXR1cm47CiAKIGNsZWFuX3VwOgpAQCAtNTIxMiw2ICs3NTE1LDMxIEBACiAJa2ZyZWUoaC0+YmxvY2tGZXRjaFRhYmxlKTsKIH0KIAorc3RhdGljIGludCBpc19hY2NlbGVyYXRlZF9jbWQoc3RydWN0IENvbW1hbmRMaXN0ICpjKQoreworCXJldHVybiBjLT5jbWRfdHlwZSA9PSBDTURfSU9BQ0NFTDEgfHwgYy0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwyOworfQorCitzdGF0aWMgdm9pZCBocHNhX2RyYWluX2FjY2VsX2NvbW1hbmRzKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJc3RydWN0IENvbW1hbmRMaXN0ICpjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBhY2NlbF9jbWRzX291dDsKKworCWRvIHsgLyogd2FpdCBmb3IgYWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzIHRvIGRyYWluIG91dCAqLworCQlhY2NlbF9jbWRzX291dCA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmgtPmNtcFEsIGxpc3QpCisJCQlhY2NlbF9jbWRzX291dCArPSBpc19hY2NlbGVyYXRlZF9jbWQoYyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmgtPnJlcVEsIGxpc3QpCisJCQlhY2NlbF9jbWRzX291dCArPSBpc19hY2NlbGVyYXRlZF9jbWQoYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGFjY2VsX2NtZHNfb3V0IDw9IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKIC8qCiAgKiAgVGhpcyBpcyBpdC4gIFJlZ2lzdGVyIHRoZSBQQ0kgZHJpdmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY2FyZHMgd2UgY29udHJvbAogICogIHRoZSBPUyB3aWxsIGNhbGwgb3VyIHJlZ2lzdGVyZWQgcm91dGluZXMgd2hlbiBpdCBmaW5kcyBvbmUgb2Ygb3VyIGNhcmRzLgpAQCAtNTIyNiw1ICs3NTU0LDgzIEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZocHNhX3BjaV9kcml2ZXIpOwogfQogCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSB2ZXJpZnlfb2Zmc2V0cyh2b2lkKQoreworI2RlZmluZSBWRVJJRllfT0ZGU0VUKG1lbWJlciwgb2Zmc2V0KSBcCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCByYWlkX21hcF9kYXRhLCBtZW1iZXIpICE9IG9mZnNldCkKKworCVZFUklGWV9PRkZTRVQoc3RydWN0dXJlX3NpemUsIDApOworCVZFUklGWV9PRkZTRVQodm9sdW1lX2Jsa19zaXplLCA0KTsKKwlWRVJJRllfT0ZGU0VUKHZvbHVtZV9ibGtfY250LCA4KTsKKwlWRVJJRllfT0ZGU0VUKHBoeXNfYmxrX3NoaWZ0LCAxNik7CisJVkVSSUZZX09GRlNFVChwYXJpdHlfcm90YXRpb25fc2hpZnQsIDE3KTsKKwlWRVJJRllfT0ZGU0VUKHN0cmlwX3NpemUsIDE4KTsKKwlWRVJJRllfT0ZGU0VUKGRpc2tfc3RhcnRpbmdfYmxrLCAyMCk7CisJVkVSSUZZX09GRlNFVChkaXNrX2Jsa19jbnQsIDI4KTsKKwlWRVJJRllfT0ZGU0VUKGRhdGFfZGlza3NfcGVyX3JvdywgMzYpOworCVZFUklGWV9PRkZTRVQobWV0YWRhdGFfZGlza3NfcGVyX3JvdywgMzgpOworCVZFUklGWV9PRkZTRVQocm93X2NudCwgNDApOworCVZFUklGWV9PRkZTRVQobGF5b3V0X21hcF9jb3VudCwgNDIpOworCVZFUklGWV9PRkZTRVQoZmxhZ3MsIDQ0KTsKKwlWRVJJRllfT0ZGU0VUKGRla2luZGV4LCA0Nik7CisJLyogVkVSSUZZX09GRlNFVChyZXNlcnZlZCwgNDggKi8KKwlWRVJJRllfT0ZGU0VUKGRhdGEsIDY0KTsKKworI3VuZGVmIFZFUklGWV9PRkZTRVQKKworI2RlZmluZSBWRVJJRllfT0ZGU0VUKG1lbWJlciwgb2Zmc2V0KSBcCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpb19hY2NlbDJfY21kLCBtZW1iZXIpICE9IG9mZnNldCkKKworCVZFUklGWV9PRkZTRVQoSVVfdHlwZSwgMCk7CisJVkVSSUZZX09GRlNFVChkaXJlY3Rpb24sIDEpOworCVZFUklGWV9PRkZTRVQocmVwbHlfcXVldWUsIDIpOworCS8qIFZFUklGWV9PRkZTRVQocmVzZXJ2ZWQxLCAzKTsgICovCisJVkVSSUZZX09GRlNFVChzY3NpX25leHVzLCA0KTsKKwlWRVJJRllfT0ZGU0VUKFRhZywgOCk7CisJVkVSSUZZX09GRlNFVChjZGIsIDE2KTsKKwlWRVJJRllfT0ZGU0VUKGNjaXNzX2x1biwgMzIpOworCVZFUklGWV9PRkZTRVQoZGF0YV9sZW4sIDQwKTsKKwlWRVJJRllfT0ZGU0VUKGNtZF9wcmlvcml0eV90YXNrX2F0dHIsIDQ0KTsKKwlWRVJJRllfT0ZGU0VUKHNnX2NvdW50LCA0NSk7CisJLyogVkVSSUZZX09GRlNFVChyZXNlcnZlZDMgKi8KKwlWRVJJRllfT0ZGU0VUKGVycl9wdHIsIDQ4KTsKKwlWRVJJRllfT0ZGU0VUKGVycl9sZW4sIDU2KTsKKwkvKiBWRVJJRllfT0ZGU0VUKHJlc2VydmVkNCAgKi8KKwlWRVJJRllfT0ZGU0VUKHNnLCA2NCk7CisKKyN1bmRlZiBWRVJJRllfT0ZGU0VUCisKKyNkZWZpbmUgVkVSSUZZX09GRlNFVChtZW1iZXIsIG9mZnNldCkgXAorCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaW9fYWNjZWwxX2NtZCwgbWVtYmVyKSAhPSBvZmZzZXQpCisKKwlWRVJJRllfT0ZGU0VUKGRldl9oYW5kbGUsIDB4MDApOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQxLCAweDAyKTsKKwlWRVJJRllfT0ZGU0VUKGZ1bmN0aW9uLCAweDAzKTsKKwlWRVJJRllfT0ZGU0VUKHJlc2VydmVkMiwgMHgwNCk7CisJVkVSSUZZX09GRlNFVChlcnJfaW5mbywgMHgwQyk7CisJVkVSSUZZX09GRlNFVChyZXNlcnZlZDMsIDB4MTApOworCVZFUklGWV9PRkZTRVQoZXJyX2luZm9fbGVuLCAweDEyKTsKKwlWRVJJRllfT0ZGU0VUKHJlc2VydmVkNCwgMHgxMyk7CisJVkVSSUZZX09GRlNFVChzZ2xfb2Zmc2V0LCAweDE0KTsKKwlWRVJJRllfT0ZGU0VUKHJlc2VydmVkNSwgMHgxNSk7CisJVkVSSUZZX09GRlNFVCh0cmFuc2Zlcl9sZW4sIDB4MUMpOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ2LCAweDIwKTsKKwlWRVJJRllfT0ZGU0VUKGlvX2ZsYWdzLCAweDI0KTsKKwlWRVJJRllfT0ZGU0VUKHJlc2VydmVkNywgMHgyNik7CisJVkVSSUZZX09GRlNFVChMVU4sIDB4MzQpOworCVZFUklGWV9PRkZTRVQoY29udHJvbCwgMHgzQyk7CisJVkVSSUZZX09GRlNFVChDREIsIDB4NDApOworCVZFUklGWV9PRkZTRVQocmVzZXJ2ZWQ4LCAweDUwKTsKKwlWRVJJRllfT0ZGU0VUKGhvc3RfY29udGV4dF9mbGFncywgMHg2MCk7CisJVkVSSUZZX09GRlNFVCh0aW1lb3V0X3NlYywgMHg2Mik7CisJVkVSSUZZX09GRlNFVChSZXBseVF1ZXVlLCAweDY0KTsKKwlWRVJJRllfT0ZGU0VUKHJlc2VydmVkOSwgMHg2NSk7CisJVkVSSUZZX09GRlNFVChUYWcsIDB4NjgpOworCVZFUklGWV9PRkZTRVQoaG9zdF9hZGRyLCAweDcwKTsKKwlWRVJJRllfT0ZGU0VUKENJU1NfTFVOLCAweDc4KTsKKwlWRVJJRllfT0ZGU0VUKFNHLCAweDc4ICsgOCk7CisjdW5kZWYgVkVSSUZZX09GRlNFVAorfQorCiBtb2R1bGVfaW5pdChocHNhX2luaXQpOwogbW9kdWxlX2V4aXQoaHBzYV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmggYi9kcml2ZXJzL3Njc2kvaHBzYS5oCmluZGV4IDAxYzMyODMuLjQ0MjM1YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhLmgKKysrIGIvZHJpdmVycy9zY3NpL2hwc2EuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgICBEaXNrIEFycmF5IGRyaXZlciBmb3IgSFAgU21hcnQgQXJyYXkgU0FTIGNvbnRyb2xsZXJzCi0gKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAwOSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMTQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KICAqCiAgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ2LDYgKzQ2LDE1IEBACiAJdW5zaWduZWQgY2hhciB2ZW5kb3JbOF07ICAgICAgICAvKiBieXRlcyA4LTE1IG9mIGlucXVpcnkgZGF0YSAqLwogCXVuc2lnbmVkIGNoYXIgbW9kZWxbMTZdOyAgICAgICAgLyogYnl0ZXMgMTYtMzEgb2YgaW5xdWlyeSBkYXRhICovCiAJdW5zaWduZWQgY2hhciByYWlkX2xldmVsOwkvKiBmcm9tIGlucXVpcnkgcGFnZSAweEMxICovCisJdW5zaWduZWQgY2hhciB2b2x1bWVfb2ZmbGluZTsJLyogZGlzY292ZXJlZCB2aWEgVFVSIG9yIFZQRCAqLworCXUzMiBpb2FjY2VsX2hhbmRsZTsKKwlpbnQgb2ZmbG9hZF9jb25maWc7CQkvKiBJL08gYWNjZWwgUkFJRCBvZmZsb2FkIGNvbmZpZ3VyZWQgKi8KKwlpbnQgb2ZmbG9hZF9lbmFibGVkOwkJLyogSS9PIGFjY2VsIFJBSUQgb2ZmbG9hZCBlbmFibGVkICovCisJaW50IG9mZmxvYWRfdG9fbWlycm9yOwkJLyogU2VuZCBuZXh0IEkvTyBhY2NlbGVyYXRvciBSQUlECisJCQkJCSAqIG9mZmxvYWQgcmVxdWVzdCB0byBtaXJyb3IgZHJpdmUKKwkJCQkJICovCisJc3RydWN0IHJhaWRfbWFwX2RhdGEgcmFpZF9tYXA7CS8qIEkvTyBhY2NlbGVyYXRvciBSQUlEIG1hcCAqLworCiB9OwogCiBzdHJ1Y3QgcmVwbHlfcG9vbCB7CkBAIC01NSw2ICs2NCw0NiBAQAogCXUzMiBjdXJyZW50X2VudHJ5OwogfTsKIAorI3ByYWdtYSBwYWNrKDEpCitzdHJ1Y3QgYm1pY19jb250cm9sbGVyX3BhcmFtZXRlcnMgeworCXU4ICAgbGVkX2ZsYWdzOworCXU4ICAgZW5hYmxlX2NvbW1hbmRfbGlzdF92ZXJpZmljYXRpb247CisJdTggICBiYWNrZWRfb3V0X3dyaXRlX2RyaXZlczsKKwl1MTYgIHN0cmlwZXNfZm9yX3Bhcml0eTsKKwl1OCAgIHBhcml0eV9kaXN0cmlidXRpb25fbW9kZV9mbGFnczsKKwl1MTYgIG1heF9kcml2ZXJfcmVxdWVzdHM7CisJdTE2ICBlbGV2YXRvcl90cmVuZF9jb3VudDsKKwl1OCAgIGRpc2FibGVfZWxldmF0b3I7CisJdTggICBmb3JjZV9zY2FuX2NvbXBsZXRlOworCXU4ICAgc2NzaV90cmFuc2Zlcl9tb2RlOworCXU4ICAgZm9yY2VfbmFycm93OworCXU4ICAgcmVidWlsZF9wcmlvcml0eTsKKwl1OCAgIGV4cGFuZF9wcmlvcml0eTsKKwl1OCAgIGhvc3Rfc2RiX2FzaWNfZml4OworCXU4ICAgcGRwaV9idXJzdF9mcm9tX2hvc3RfZGlzYWJsZWQ7CisJY2hhciBzb2Z0d2FyZV9uYW1lWzY0XTsKKwljaGFyIGhhcmR3YXJlX25hbWVbMzJdOworCXU4ICAgYnJpZGdlX3JldmlzaW9uOworCXU4ICAgc25hcHNob3RfcHJpb3JpdHk7CisJdTMyICBvc19zcGVjaWZpYzsKKwl1OCAgIHBvc3RfcHJvbXB0X3RpbWVvdXQ7CisJdTggICBhdXRvbWF0aWNfZHJpdmVfc2xhbW1pbmc7CisJdTggICByZXNlcnZlZDE7CisJdTggICBudnJhbV9mbGFnczsKKwl1OCAgIGNhY2hlX252cmFtX2ZsYWdzOworCXU4ICAgZHJpdmVfY29uZmlnX2ZsYWdzOworCXUxNiAgcmVzZXJ2ZWQyOworCXU4ICAgdGVtcF93YXJuaW5nX2xldmVsOworCXU4ICAgdGVtcF9zaHV0ZG93bl9sZXZlbDsKKwl1OCAgIHRlbXBfY29uZGl0aW9uX3Jlc2V0OworCXU4ICAgbWF4X2NvYWxlc2NlX2NvbW1hbmRzOworCXUzMiAgbWF4X2NvYWxlc2NlX2RlbGF5OworCXU4ICAgb3JjYV9wYXNzd29yZFs0XTsKKwl1OCAgIGFjY2Vzc19pZFsxNl07CisJdTggICByZXNlcnZlZFszNTZdOworfTsKKyNwcmFnbWEgcGFjaygpCisKIHN0cnVjdCBjdGxyX2luZm8gewogCWludAljdGxyOwogCWNoYXIJZGV2bmFtZVs4XTsKQEAgLTgwLDYgKzEyOSw3IEBACiAJdW5zaWduZWQgaW50IG1zaV92ZWN0b3I7CiAJaW50IGludHJfbW9kZTsgLyogZWl0aGVyIFBFUkZfTU9ERV9JTlQgb3IgU0lNUExFX01PREVfSU5UICovCiAJc3RydWN0IGFjY2Vzc19tZXRob2QgYWNjZXNzOworCWNoYXIgaGJhX21vZGVfZW5hYmxlZDsKIAogCS8qIHF1ZXVlIGFuZCBxdWV1ZSBJbmZvICovCiAJc3RydWN0IGxpc3RfaGVhZCByZXFROwpAQCAtOTUsNiArMTQ1LDEwIEBACiAJLyogcG9pbnRlcnMgdG8gY29tbWFuZCBhbmQgZXJyb3IgaW5mbyBwb29sICovCiAJc3RydWN0IENvbW1hbmRMaXN0IAkqY21kX3Bvb2w7CiAJZG1hX2FkZHJfdAkJY21kX3Bvb2xfZGhhbmRsZTsKKwlzdHJ1Y3QgaW9fYWNjZWwxX2NtZAkqaW9hY2NlbF9jbWRfcG9vbDsKKwlkbWFfYWRkcl90CQlpb2FjY2VsX2NtZF9wb29sX2RoYW5kbGU7CisJc3RydWN0IGlvX2FjY2VsMl9jbWQJKmlvYWNjZWwyX2NtZF9wb29sOworCWRtYV9hZGRyX3QJCWlvYWNjZWwyX2NtZF9wb29sX2RoYW5kbGU7CiAJc3RydWN0IEVycm9ySW5mbyAJKmVycmluZm9fcG9vbDsKIAlkbWFfYWRkcl90CQllcnJpbmZvX3Bvb2xfZGhhbmRsZTsKIAl1bnNpZ25lZCBsb25nICAJCSpjbWRfcG9vbF9iaXRzOwpAQCAtMTI4LDcgKzE4MiwxNCBAQAogCXU4IG5yZXBseV9xdWV1ZXM7CiAJZG1hX2FkZHJfdCByZXBseV9wb29sX2RoYW5kbGU7CiAJdTMyICpibG9ja0ZldGNoVGFibGU7CisJdTMyICppb2FjY2VsMV9ibG9ja0ZldGNoVGFibGU7CisJdTMyICppb2FjY2VsMl9ibG9ja0ZldGNoVGFibGU7CisJdTMyICppb2FjY2VsMl9iZnQyX3JlZ3M7CiAJdW5zaWduZWQgY2hhciAqaGJhX2lucXVpcnlfZGF0YTsKKwl1MzIgZHJpdmVyX3N1cHBvcnQ7CisJdTMyIGZ3X3N1cHBvcnQ7CisJaW50IGlvYWNjZWxfc3VwcG9ydDsKKwlpbnQgaW9hY2NlbF9tYXhzZzsKIAl1NjQgbGFzdF9pbnRyX3RpbWVzdGFtcDsKIAl1MzIgbGFzdF9oZWFydGJlYXQ7CiAJdTY0IGxhc3RfaGVhcnRiZWF0X3RpbWVzdGFtcDsKQEAgLTE2MSw3ICsyMjIsMzUgQEAKICNkZWZpbmUgSFBTQVRNRl9MT0dfUVJZX1RBU0sgICAgKDEgPDwgMjMpCiAjZGVmaW5lIEhQU0FUTUZfTE9HX1FSWV9UU0VUICAgICgxIDw8IDI0KQogI2RlZmluZSBIUFNBVE1GX0xPR19RUllfQVNZTkMgICAoMSA8PCAyNSkKKwl1MzIgZXZlbnRzOworI2RlZmluZSBDVExSX1NUQVRFX0NIQU5HRV9FVkVOVAkJCQkoMSA8PCAwKQorI2RlZmluZSBDVExSX0VOQ0xPU1VSRV9IT1RfUExVR19FVkVOVAkJCSgxIDw8IDEpCisjZGVmaW5lIENUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UX1BIWVNJQ0FMX0RSVgkJKDEgPDwgNCkKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfTE9HSUNBTF9EUlYJCSgxIDw8IDUpCisjZGVmaW5lIENUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UX1JFRFVOREFOVF9DTlRSTAkJKDEgPDwgNikKKyNkZWZpbmUgQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfQUlPX0VOQUJMRURfRElTQUJMRUQJKDEgPDwgMzApCisjZGVmaW5lIENUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UX0FJT19DT05GSUdfQ0hBTkdFCSgxIDw8IDMxKQorCisjZGVmaW5lIFJFU0NBTl9SRVFVSVJFRF9FVkVOVF9CSVRTIFwKKwkJKENUTFJfU1RBVEVfQ0hBTkdFX0VWRU5UIHwgXAorCQlDVExSX0VOQ0xPU1VSRV9IT1RfUExVR19FVkVOVCB8IFwKKwkJQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfUEhZU0lDQUxfRFJWIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9MT0dJQ0FMX0RSViB8IFwKKwkJQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfUkVEVU5EQU5UX0NOVFJMIHwgXAorCQlDVExSX1NUQVRFX0NIQU5HRV9FVkVOVF9BSU9fRU5BQkxFRF9ESVNBQkxFRCB8IFwKKwkJQ1RMUl9TVEFURV9DSEFOR0VfRVZFTlRfQUlPX0NPTkZJR19DSEFOR0UpCisJc3BpbmxvY2tfdCBvZmZsaW5lX2RldmljZV9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgb2ZmbGluZV9kZXZpY2VfbGlzdDsKKwlpbnQJYWNjaW9wYXRoX3N0YXR1czsKKwlpbnQJZHJ2X3JlcV9yZXNjYW47CS8qIGZsYWcgZm9yIGRyaXZlciB0byByZXF1ZXN0IHJlc2NhbiBldmVudCAqLworCWludAlyYWlkX29mZmxvYWRfZGVidWc7CiB9OworCitzdHJ1Y3Qgb2ZmbGluZV9kZXZpY2VfZW50cnkgeworCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyWzhdOworCXN0cnVjdCBsaXN0X2hlYWQgb2ZmbGluZV9saXN0OworfTsKKwogI2RlZmluZSBIUFNBX0FCT1JUX01TRyAwCiAjZGVmaW5lIEhQU0FfREVWSUNFX1JFU0VUX01TRyAxCiAjZGVmaW5lIEhQU0FfUkVTRVRfVFlQRV9DT05UUk9MTEVSIDB4MDAKQEAgLTI0Miw2ICszMzEsMTQgQEAKIAogI2RlZmluZSBIUFNBX0lOVFJfT04gCTEKICNkZWZpbmUgSFBTQV9JTlRSX09GRgkwCisKKy8qCisgKiBJbmJvdW5kIFBvc3QgUXVldWUgb2Zmc2V0cyBmb3IgSU8gQWNjZWxlcmF0b3IgTW9kZSAyCisgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfSU5CT1VORF9QT1NUUV8zMgkweDQ4CisjZGVmaW5lIElPQUNDRUwyX0lOQk9VTkRfUE9TVFFfNjRfTE9XCTB4ZDAKKyNkZWZpbmUgSU9BQ0NFTDJfSU5CT1VORF9QT1NUUV82NF9ISQkweGQ0CisKIC8qCiAJU2VuZCB0aGUgY29tbWFuZCB0byB0aGUgaGFyZHdhcmUKICovCkBAIC0yNTQsNiArMzUxLDE4IEBACiAJKHZvaWQpIHJlYWRsKGgtPnZhZGRyICsgU0E1X1NDUkFUQ0hQQURfT0ZGU0VUKTsKIH0KIAorc3RhdGljIHZvaWQgU0E1X3N1Ym1pdF9jb21tYW5kX2lvYWNjZWwyKHN0cnVjdCBjdGxyX2luZm8gKmgsCisJc3RydWN0IENvbW1hbmRMaXN0ICpjKQoreworCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIlNlbmRpbmcgJXgsIHRhZyA9ICV4XG4iLCBjLT5idXNhZGRyLAorCQljLT5IZWFkZXIuVGFnLmxvd2VyKTsKKwlpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwyKQorCQl3cml0ZWwoYy0+YnVzYWRkciwgaC0+dmFkZHIgKyBJT0FDQ0VMMl9JTkJPVU5EX1BPU1RRXzMyKTsKKwllbHNlCisJCXdyaXRlbChjLT5idXNhZGRyLCBoLT52YWRkciArIFNBNV9SRVFVRVNUX1BPUlRfT0ZGU0VUKTsKKwkodm9pZCkgcmVhZGwoaC0+dmFkZHIgKyBTQTVfU0NSQVRDSFBBRF9PRkZTRVQpOworfQorCiAvKgogICogIFRoaXMgY2FyZCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG90aGVyIGNhcmRzLgogICogICAwIHR1cm5zIGludGVycnVwdHMgb24uLi4KQEAgLTM4Nyw2ICs0OTYsNTAgQEAKIAlyZXR1cm4gcmVnaXN0ZXJfdmFsdWUgJiBTQTVfT1VUREJfU1RBVFVTX1BFUkZfQklUOwogfQogCisjZGVmaW5lIFNBNV9JT0FDQ0VMX01PREUxX0lOVFJfU1RBVFVTX0NNUF9CSVQgICAgMHgxMDAKKworc3RhdGljIGJvb2wgU0E1X2lvYWNjZWxfbW9kZTFfaW50cl9wZW5kaW5nKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJdW5zaWduZWQgbG9uZyByZWdpc3Rlcl92YWx1ZSA9IHJlYWRsKGgtPnZhZGRyICsgU0E1X0lOVFJfU1RBVFVTKTsKKworCXJldHVybiAocmVnaXN0ZXJfdmFsdWUgJiBTQTVfSU9BQ0NFTF9NT0RFMV9JTlRSX1NUQVRVU19DTVBfQklUKSA/CisJCXRydWUgOiBmYWxzZTsKK30KKworI2RlZmluZSBJT0FDQ0VMX01PREUxX1JFUExZX1FVRVVFX0lOREVYICAweDFBMAorI2RlZmluZSBJT0FDQ0VMX01PREUxX1BST0RVQ0VSX0lOREVYICAgICAweDFCOAorI2RlZmluZSBJT0FDQ0VMX01PREUxX0NPTlNVTUVSX0lOREVYICAgICAweDFCQworI2RlZmluZSBJT0FDQ0VMX01PREUxX1JFUExZX1VOVVNFRCAgICAgICAweEZGRkZGRkZGRkZGRkZGRkZVTEwKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgU0E1X2lvYWNjZWxfbW9kZTFfY29tcGxldGVkKHN0cnVjdCBjdGxyX2luZm8gKmgsIHU4IHEpCit7CisJdTY0IHJlZ2lzdGVyX3ZhbHVlOworCXN0cnVjdCByZXBseV9wb29sICpycSA9ICZoLT5yZXBseV9xdWV1ZVtxXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQlVHX09OKHEgPj0gaC0+bnJlcGx5X3F1ZXVlcyk7CisKKwlyZWdpc3Rlcl92YWx1ZSA9IHJxLT5oZWFkW3JxLT5jdXJyZW50X2VudHJ5XTsKKwlpZiAocmVnaXN0ZXJfdmFsdWUgIT0gSU9BQ0NFTF9NT0RFMV9SRVBMWV9VTlVTRUQpIHsKKwkJcnEtPmhlYWRbcnEtPmN1cnJlbnRfZW50cnldID0gSU9BQ0NFTF9NT0RFMV9SRVBMWV9VTlVTRUQ7CisJCWlmICgrK3JxLT5jdXJyZW50X2VudHJ5ID09IHJxLT5zaXplKQorCQkJcnEtPmN1cnJlbnRfZW50cnkgPSAwOworCQkvKgorCQkgKiBAdG9kbworCQkgKgorCQkgKiBEb24ndCByZWFsbHkgbmVlZCB0byB3cml0ZSB0aGUgbmV3IGluZGV4IGFmdGVyIGVhY2ggY29tbWFuZCwKKwkJICogYnV0IHdpdGggY3VycmVudCBkcml2ZXIgZGVzaWduIHRoaXMgaXMgZWFzaWVzdC4KKwkJICovCisJCXdtYigpOworCQl3cml0ZWwoKHEgPDwgMjQpIHwgcnEtPmN1cnJlbnRfZW50cnksIGgtPnZhZGRyICsKKwkJCQlJT0FDQ0VMX01PREUxX0NPTlNVTUVSX0lOREVYKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJaC0+Y29tbWFuZHNfb3V0c3RhbmRpbmctLTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIHJlZ2lzdGVyX3ZhbHVlOworfQorCiBzdGF0aWMgc3RydWN0IGFjY2Vzc19tZXRob2QgU0E1X2FjY2VzcyA9IHsKIAlTQTVfc3VibWl0X2NvbW1hbmQsCiAJU0E1X2ludHJfbWFzaywKQEAgLTM5NSw2ICs1NDgsMjIgQEAKIAlTQTVfY29tcGxldGVkLAogfTsKIAorc3RhdGljIHN0cnVjdCBhY2Nlc3NfbWV0aG9kIFNBNV9pb2FjY2VsX21vZGUxX2FjY2VzcyA9IHsKKwlTQTVfc3VibWl0X2NvbW1hbmQsCisJU0E1X3BlcmZvcm1hbnRfaW50cl9tYXNrLAorCVNBNV9maWZvX2Z1bGwsCisJU0E1X2lvYWNjZWxfbW9kZTFfaW50cl9wZW5kaW5nLAorCVNBNV9pb2FjY2VsX21vZGUxX2NvbXBsZXRlZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNjZXNzX21ldGhvZCBTQTVfaW9hY2NlbF9tb2RlMl9hY2Nlc3MgPSB7CisJU0E1X3N1Ym1pdF9jb21tYW5kX2lvYWNjZWwyLAorCVNBNV9wZXJmb3JtYW50X2ludHJfbWFzaywKKwlTQTVfZmlmb19mdWxsLAorCVNBNV9wZXJmb3JtYW50X2ludHJfcGVuZGluZywKKwlTQTVfcGVyZm9ybWFudF9jb21wbGV0ZWQsCit9OworCiBzdGF0aWMgc3RydWN0IGFjY2Vzc19tZXRob2QgU0E1X3BlcmZvcm1hbnRfYWNjZXNzID0gewogCVNBNV9zdWJtaXRfY29tbWFuZCwKIAlTQTVfcGVyZm9ybWFudF9pbnRyX21hc2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYV9jbWQuaCBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCmluZGV4IGJmYzhjNGUuLmI1Y2M3MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICAgIERpc2sgQXJyYXkgZHJpdmVyIGZvciBIUCBTbWFydCBBcnJheSBTQVMgY29udHJvbGxlcnMKLSAqICAgIENvcHlyaWdodCAyMDAwLCAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAxNCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgogICoKICAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBTRU5TRUlORk9CWVRFUyAgICAgICAgICAzMiAvKiBtYXkgdmFyeSBiZXR3ZWVuIGhiYXMgKi8KICNkZWZpbmUgU0dfRU5UUklFU19JTl9DTUQJMzIgLyogTWF4IFNHIGVudHJpZXMgZXhjbHVkaW5nIGNoYWluIGJsb2NrcyAqLwogI2RlZmluZSBIUFNBX1NHX0NIQUlOCQkweDgwMDAwMDAwCisjZGVmaW5lIEhQU0FfU0dfTEFTVAkJMHg0MDAwMDAwMAogI2RlZmluZSBNQVhSRVBMWVFTICAgICAgICAgICAgICAyNTYKIAogLyogQ29tbWFuZCBTdGF0dXMgdmFsdWUgKi8KQEAgLTQxLDYgKzQyLDggQEAKICNkZWZpbmUgQ01EX1VOU09MSUNJVEVEX0FCT1JUICAgMHgwMDBBCiAjZGVmaW5lIENNRF9USU1FT1VUICAgICAgICAgICAgIDB4MDAwQgogI2RlZmluZSBDTURfVU5BQk9SVEFCTEUJCTB4MDAwQworI2RlZmluZSBDTURfSU9BQ0NFTF9ESVNBQkxFRAkweDAwMEUKKwogCiAvKiBVbml0IEF0dGVudGlvbnMgQVNDJ3MgYXMgZGVmaW5lZCBmb3IgdGhlIE1TQTIwMTJzYSAqLwogI2RlZmluZSBQT1dFUl9PUl9SRVNFVAkJCTB4MjkKQEAgLTc5LDggKzgyLDkgQEAKICNkZWZpbmUgQVRUUl9BQ0EgICAgICAgICAgICAgICAgMHgwNwogCiAvKiBjZGIgdHlwZSAqLwotI2RlZmluZSBUWVBFX0NNRAkJCQkweDAwCi0jZGVmaW5lIFRZUEVfTVNHCQkJCTB4MDEKKyNkZWZpbmUgVFlQRV9DTUQJCTB4MDAKKyNkZWZpbmUgVFlQRV9NU0cJCTB4MDEKKyNkZWZpbmUgVFlQRV9JT0FDQ0VMMl9DTUQJMHg4MSAvKiAweDgxIGlzIG5vdCB1c2VkIGJ5IGhhcmR3YXJlICovCiAKIC8qIE1lc3NhZ2UgVHlwZXMgICovCiAjZGVmaW5lIEhQU0FfVEFTS19NQU5BR0VNRU5UICAgIDB4MDAKQEAgLTEyNSw5ICsxMjksMTIgQEAKICNkZWZpbmUgQ0ZHVEJMX0FjY0NtZHMgICAgICAgICAgMHgwMDAwMDAwMWwKICNkZWZpbmUgRE9PUkJFTExfQ1RMUl9SRVNFVAkweDAwMDAwMDA0bAogI2RlZmluZSBET09SQkVMTF9DVExSX1JFU0VUMgkweDAwMDAwMDIwbAorI2RlZmluZSBET09SQkVMTF9DTEVBUl9FVkVOVFMJMHgwMDAwMDA0MGwKIAogI2RlZmluZSBDRkdUQkxfVHJhbnNfU2ltcGxlICAgICAweDAwMDAwMDAybAogI2RlZmluZSBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCAweDAwMDAwMDA0bAorI2RlZmluZSBDRkdUQkxfVHJhbnNfaW9fYWNjZWwxCTB4MDAwMDAwODBsCisjZGVmaW5lIENGR1RCTF9UcmFuc19pb19hY2NlbDIJMHgwMDAwMDEwMGwKICNkZWZpbmUgQ0ZHVEJMX1RyYW5zX3VzZV9zaG9ydF90YWdzIDB4MjAwMDAwMDBsCiAjZGVmaW5lIENGR1RCTF9UcmFuc19lbmFibGVfZGlyZWN0ZWRfbXNpeCAoMSA8PCAzMCkKIApAQCAtMTM1LDYgKzE0MiwyOCBAQAogI2RlZmluZSBDRkdUQkxfQnVzVHlwZV9VbHRyYTMgICAweDAwMDAwMDAybAogI2RlZmluZSBDRkdUQkxfQnVzVHlwZV9GaWJyZTFHICAweDAwMDAwMTAwbAogI2RlZmluZSBDRkdUQkxfQnVzVHlwZV9GaWJyZTJHICAweDAwMDAwMjAwbAorCisvKiBWUEQgSW5xdWlyeSB0eXBlcyAqLworI2RlZmluZSBIUFNBX1ZQRF9TVVBQT1JURURfUEFHRVMgICAgICAgIDB4MDAKKyNkZWZpbmUgSFBTQV9WUERfTFZfREVWSUNFX0dFT01FVFJZICAgICAweEMxCisjZGVmaW5lIEhQU0FfVlBEX0xWX0lPQUNDRUxfU1RBVFVTICAgICAgMHhDMgorI2RlZmluZSBIUFNBX1ZQRF9MVl9TVEFUVVMJCTB4QzMKKyNkZWZpbmUgSFBTQV9WUERfSEVBREVSX1NaICAgICAgICAgICAgICA0CisKKy8qIExvZ2ljYWwgdm9sdW1lIHN0YXRlcyAqLworI2RlZmluZSBIUFNBX1ZQRF9MVl9TVEFUVVNfVU5TVVBQT1JURUQJCQktMQorI2RlZmluZSBIUFNBX0xWX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSFBTQV9MVl9VTkRFUkdPSU5HX0VSQVNFCQkJMHgwRgorI2RlZmluZSBIUFNBX0xWX1VOREVSR09JTkdfUlBJCQkJCTB4MTIKKyNkZWZpbmUgSFBTQV9MVl9QRU5ESU5HX1JQSQkJCQkweDEzCisjZGVmaW5lIEhQU0FfTFZfRU5DUllQVEVEX05PX0tFWQkJCTB4MTQKKyNkZWZpbmUgSFBTQV9MVl9QTEFJTlRFWFRfSU5fRU5DUllQVF9PTkxZX0NPTlRST0xMRVIJMHgxNQorI2RlZmluZSBIUFNBX0xWX1VOREVSR09JTkdfRU5DUllQVElPTgkJCTB4MTYKKyNkZWZpbmUgSFBTQV9MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT05fUkVLRVlJTkcJCTB4MTcKKyNkZWZpbmUgSFBTQV9MVl9FTkNSWVBURURfSU5fTk9OX0VOQ1JZUFRFRF9DT05UUk9MTEVSCTB4MTgKKyNkZWZpbmUgSFBTQV9MVl9QRU5ESU5HX0VOQ1JZUFRJT04JCQkweDE5CisjZGVmaW5lIEhQU0FfTFZfUEVORElOR19FTkNSWVBUSU9OX1JFS0VZSU5HCQkweDFBCisKIHN0cnVjdCB2YWxzMzIgewogCXUzMiAgIGxvd2VyOwogCXUzMiAgIHVwcGVyOwpAQCAtMTYyLDkgKzE5MSw1MCBAQAogCiAjZGVmaW5lIEhQU0FfUkVQT1JUX0xPRyAweGMyICAgIC8qIFJlcG9ydCBMb2dpY2FsIExVTnMgKi8KICNkZWZpbmUgSFBTQV9SRVBPUlRfUEhZUyAweGMzICAgLyogUmVwb3J0IFBoeXNpY2FsIExVTnMgKi8KKyNkZWZpbmUgSFBTQV9SRVBPUlRfUEhZU19FWFRFTkRFRCAweDAyCisjZGVmaW5lIEhQU0FfQ0lTU19SRUFECTB4YzAJLyogQ0lTUyBSZWFkICovCisjZGVmaW5lIEhQU0FfR0VUX1JBSURfTUFQIDB4YzgJLyogQ0lTUyBHZXQgUkFJRCBMYXlvdXQgTWFwICovCisKKyNkZWZpbmUgUkFJRF9NQVBfTUFYX0VOVFJJRVMgICAyNTYKKworc3RydWN0IHJhaWRfbWFwX2Rpc2tfZGF0YSB7CisJdTMyICAgaW9hY2NlbF9oYW5kbGU7ICAgICAgICAgLyoqPCBIYW5kbGUgdG8gYWNjZXNzIHRoaXMgZGlzayB2aWEgdGhlCisJCQkJCSogIEkvTyBhY2NlbGVyYXRvciAqLworCXU4ICAgIHhvcl9tdWx0WzJdOyAgICAgICAgICAgIC8qKjwgWE9SIG11bHRpcGxpZXJzIGZvciB0aGlzIHBvc2l0aW9uLAorCQkJCQkqICB2YWxpZCBmb3IgZGF0YSBkaXNrcyBvbmx5ICovCisJdTggICAgcmVzZXJ2ZWRbMl07Cit9OworCitzdHJ1Y3QgcmFpZF9tYXBfZGF0YSB7CisJdTMyICAgc3RydWN0dXJlX3NpemU7CQkvKiBTaXplIG9mIGVudGlyZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKwl1MzIgICB2b2x1bWVfYmxrX3NpemU7CQkvKiBieXRlcyAvIGJsb2NrIGluIHRoZSB2b2x1bWUgKi8KKwl1NjQgICB2b2x1bWVfYmxrX2NudDsJCS8qIGxvZ2ljYWwgYmxvY2tzIG9uIHRoZSB2b2x1bWUgKi8KKwl1OCAgICBwaHlzX2Jsa19zaGlmdDsJCS8qIFNoaWZ0IGZhY3RvciB0byBjb252ZXJ0IGJldHdlZW4KKwkJCQkJICogdW5pdHMgb2YgbG9naWNhbCBibG9ja3MgYW5kIHBoeXNpY2FsCisJCQkJCSAqIGRpc2sgYmxvY2tzICovCisJdTggICAgcGFyaXR5X3JvdGF0aW9uX3NoaWZ0OwkvKiBTaGlmdCBmYWN0b3IgdG8gY29udmVydCBiZXR3ZWVuIHVuaXRzCisJCQkJCSAqIG9mIGxvZ2ljYWwgc3RyaXBlcyBhbmQgcGh5c2ljYWwKKwkJCQkJICogc3RyaXBlcyAqLworCXUxNiAgIHN0cmlwX3NpemU7CQkvKiBibG9ja3MgdXNlZCBvbiBlYWNoIGRpc2sgLyBzdHJpcGUgKi8KKwl1NjQgICBkaXNrX3N0YXJ0aW5nX2JsazsJLyogRmlyc3QgZGlzayBibG9jayB1c2VkIGluIHZvbHVtZSAqLworCXU2NCAgIGRpc2tfYmxrX2NudDsJCS8qIGRpc2sgYmxvY2tzIHVzZWQgYnkgdm9sdW1lIC8gZGlzayAqLworCXUxNiAgIGRhdGFfZGlza3NfcGVyX3JvdzsJLyogZGF0YSBkaXNrIGVudHJpZXMgLyByb3cgaW4gdGhlIG1hcCAqLworCXUxNiAgIG1ldGFkYXRhX2Rpc2tzX3Blcl9yb3c7CS8qIG1pcnJvci9wYXJpdHkgZGlzayBlbnRyaWVzIC8gcm93CisJCQkJCSAqIGluIHRoZSBtYXAgKi8KKwl1MTYgICByb3dfY250OwkJCS8qIHJvd3MgaW4gZWFjaCBsYXlvdXQgbWFwICovCisJdTE2ICAgbGF5b3V0X21hcF9jb3VudDsJCS8qIGxheW91dCBtYXBzICgxIG1hcCBwZXIgbWlycm9yL3Bhcml0eQorCQkJCQkgKiBncm91cCkgKi8KKwl1MTYgICBmbGFnczsJCQkvKiBCaXQgMCBzZXQgaWYgZW5jcnlwdGlvbiBlbmFibGVkICovCisjZGVmaW5lIFJBSURfTUFQX0ZMQUdfRU5DUllQVF9PTiAgMHgwMQorCXUxNiAgIGRla2luZGV4OwkJCS8qIERhdGEgZW5jcnlwdGlvbiBrZXkgaW5kZXguICovCisJdTggICAgcmVzZXJ2ZWRbMTZdOworCXN0cnVjdCByYWlkX21hcF9kaXNrX2RhdGEgZGF0YVtSQUlEX01BUF9NQVhfRU5UUklFU107Cit9OworCiBzdHJ1Y3QgUmVwb3J0TFVOZGF0YSB7CiAJdTggTFVOTGlzdExlbmd0aFs0XTsKLQl1MzIgcmVzZXJ2ZWQ7CisJdTggZXh0ZW5kZWRfcmVzcG9uc2VfZmxhZzsKKwl1OCByZXNlcnZlZFszXTsKIAl1OCBMVU5bSFBTQV9NQVhfTFVOXVs4XTsKIH07CiAKQEAgLTE4Nyw2ICsyNTcsNyBAQAogI2RlZmluZSBCTUlDX0NBQ0hFX0ZMVVNIIDB4YzIKICNkZWZpbmUgSFBTQV9DQUNIRV9GTFVTSCAweDAxCS8qIEMyIHdhcyBhbHJlYWR5IGJlaW5nIHVzZWQgYnkgSFBTQSAqLwogI2RlZmluZSBCTUlDX0ZMQVNIX0ZJUk1XQVJFIDB4RjcKKyNkZWZpbmUgQk1JQ19TRU5TRV9DT05UUk9MTEVSX1BBUkFNRVRFUlMgMHg2NAogCiAvKiBDb21tYW5kIExpc3QgU3RydWN0dXJlICovCiB1bmlvbiBTQ1NJM0FkZHIgewpAQCAtMjgzLDYgKzM1NCw4IEBACiAvKiBDb21tYW5kIHR5cGVzICovCiAjZGVmaW5lIENNRF9JT0NUTF9QRU5EICAweDAxCiAjZGVmaW5lIENNRF9TQ1NJCTB4MDMKKyNkZWZpbmUgQ01EX0lPQUNDRUwxCTB4MDQKKyNkZWZpbmUgQ01EX0lPQUNDRUwyCTB4MDUKIAogI2RlZmluZSBESVJFQ1RfTE9PS1VQX1NISUZUIDUKICNkZWZpbmUgRElSRUNUX0xPT0tVUF9CSVQgMHgxMApAQCAtMzE0LDcgKzM4Nyw2IEBACiAJaW50CQkJICAgY21kX3R5cGU7CiAJbG9uZwkJCSAgIGNtZGluZGV4OwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmc7CiAJdm9pZCAgICpzY3NpX2NtZDsKIApAQCAtMzI3LDE2ICszOTksMTgzIEBACiAgKi8KICNkZWZpbmUgSVNfMzJfQklUICgoOCAtIHNpemVvZihsb25nKSkvNCkKICNkZWZpbmUgSVNfNjRfQklUICghSVNfMzJfQklUKQotI2RlZmluZSBQQURfMzIgKDQpCi0jZGVmaW5lIFBBRF82NCAoNCkKKyNkZWZpbmUgUEFEXzMyICg0MCkKKyNkZWZpbmUgUEFEXzY0ICgxMikKICNkZWZpbmUgQ09NTUFORExJU1RfUEFEIChJU18zMl9CSVQgKiBQQURfMzIgKyBJU182NF9CSVQgKiBQQURfNjQpCiAJdTggcGFkW0NPTU1BTkRMSVNUX1BBRF07CiB9OwogCisvKiBNYXggUy9HIGVsZW1lbnRzIGluIEkvTyBhY2NlbGVyYXRvciBjb21tYW5kICovCisjZGVmaW5lIElPQUNDRUwxX01BWFNHRU5UUklFUyAgICAgICAgICAgMjQKKyNkZWZpbmUgSU9BQ0NFTDJfTUFYU0dFTlRSSUVTCQkyOAorCisvKgorICogU3RydWN0dXJlIGZvciBJL08gYWNjZWxlcmF0b3IgKG1vZGUgMSkgY29tbWFuZHMuCisgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSAxMjgtYnl0ZSBhbGlnbmVkIGluIHNpemUuCisgKi8KK3N0cnVjdCBpb19hY2NlbDFfY21kIHsKKwl1MTYgZGV2X2hhbmRsZTsJCQkvKiAweDAwIC0gMHgwMSAqLworCXU4ICByZXNlcnZlZDE7CQkJLyogMHgwMiAqLworCXU4ICBmdW5jdGlvbjsJCQkvKiAweDAzICovCisJdTggIHJlc2VydmVkMls4XTsJCS8qIDB4MDQgLSAweDBCICovCisJdTMyIGVycl9pbmZvOwkJCS8qIDB4MEMgLSAweDBGICovCisJdTggIHJlc2VydmVkM1syXTsJCS8qIDB4MTAgLSAweDExICovCisJdTggIGVycl9pbmZvX2xlbjsJCS8qIDB4MTIgKi8KKwl1OCAgcmVzZXJ2ZWQ0OwkJCS8qIDB4MTMgKi8KKwl1OCAgc2dsX29mZnNldDsJCQkvKiAweDE0ICovCisJdTggIHJlc2VydmVkNVs3XTsJCS8qIDB4MTUgLSAweDFCICovCisJdTMyIHRyYW5zZmVyX2xlbjsJCS8qIDB4MUMgLSAweDFGICovCisJdTggIHJlc2VydmVkNls0XTsJCS8qIDB4MjAgLSAweDIzICovCisJdTE2IGlvX2ZsYWdzOwkJCS8qIDB4MjQgLSAweDI1ICovCisJdTggIHJlc2VydmVkN1sxNF07CQkvKiAweDI2IC0gMHgzMyAqLworCXU4ICBMVU5bOF07CQkJLyogMHgzNCAtIDB4M0IgKi8KKwl1MzIgY29udHJvbDsJCQkvKiAweDNDIC0gMHgzRiAqLworCXU4ICBDREJbMTZdOwkJCS8qIDB4NDAgLSAweDRGICovCisJdTggIHJlc2VydmVkOFsxNl07CQkvKiAweDUwIC0gMHg1RiAqLworCXUxNiBob3N0X2NvbnRleHRfZmxhZ3M7CQkvKiAweDYwIC0gMHg2MSAqLworCXUxNiB0aW1lb3V0X3NlYzsJCS8qIDB4NjIgLSAweDYzICovCisJdTggIFJlcGx5UXVldWU7CQkJLyogMHg2NCAqLworCXU4ICByZXNlcnZlZDlbM107CQkvKiAweDY1IC0gMHg2NyAqLworCXN0cnVjdCB2YWxzMzIgVGFnOwkJLyogMHg2OCAtIDB4NkYgKi8KKwlzdHJ1Y3QgdmFsczMyIGhvc3RfYWRkcjsJLyogMHg3MCAtIDB4NzcgKi8KKwl1OCAgQ0lTU19MVU5bOF07CQkvKiAweDc4IC0gMHg3RiAqLworCXN0cnVjdCBTR0Rlc2NyaXB0b3IgU0dbSU9BQ0NFTDFfTUFYU0dFTlRSSUVTXTsKKyNkZWZpbmUgSU9BQ0NFTDFfUEFEXzY0IDAKKyNkZWZpbmUgSU9BQ0NFTDFfUEFEXzMyIDAKKyNkZWZpbmUgSU9BQ0NFTDFfUEFEIChJU18zMl9CSVQgKiBJT0FDQ0VMMV9QQURfMzIgKyBcCisJCQlJU182NF9CSVQgKiBJT0FDQ0VMMV9QQURfNjQpCisJdTggcGFkW0lPQUNDRUwxX1BBRF07Cit9OworCisjZGVmaW5lIElPQUNDRUwxX0ZVTkNUSU9OX1NDU0lJTyAgICAgICAgMHgwMAorI2RlZmluZSBJT0FDQ0VMMV9TR0xPRkZTRVQgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgSU9BQ0NFTDFfSU9GTEFHU19JT19SRVEgICAgICAgICAweDQwMDAKKyNkZWZpbmUgSU9BQ0NFTDFfSU9GTEFHU19DREJMRU5fTUFTSyAgICAweDAwMUYKKyNkZWZpbmUgSU9BQ0NFTDFfSU9GTEFHU19DREJMRU5fTUFYICAgICAxNgorCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfTk9EQVRBWEZFUiAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBJT0FDQ0VMMV9DT05UUk9MX0RBVEFfT1VUICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9EQVRBX0lOICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfVEFTS1BSSU9fTUFTSyAgMHgwMDAwNzgwMAorI2RlZmluZSBJT0FDQ0VMMV9DT05UUk9MX1RBU0tQUklPX1NISUZUIDExCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfU0lNUExFUVVFVUUgICAgMHgwMDAwMDAwMAorI2RlZmluZSBJT0FDQ0VMMV9DT05UUk9MX0hFQURPRlFVRVVFICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSU9BQ0NFTDFfQ09OVFJPTF9PUkRFUkVEUVVFVUUgICAweDAwMDAwMjAwCisjZGVmaW5lIElPQUNDRUwxX0NPTlRST0xfQUNBICAgICAgICAgICAgMHgwMDAwMDQwMAorCisjZGVmaW5lIElPQUNDRUwxX0hDRkxBR1NfQ0lTU19GT1JNQVQgICAgMHgwMDEzCisKKyNkZWZpbmUgSU9BQ0NFTDFfQlVTQUREUl9DTURUWVBFICAgICAgICAweDAwMDAwMDYwCisKK3N0cnVjdCBpb2FjY2VsMl9zZ19lbGVtZW50IHsKKwl1NjQgYWRkcmVzczsKKwl1MzIgbGVuZ3RoOworCXU4IHJlc2VydmVkWzNdOworCXU4IGNoYWluX2luZGljYXRvcjsKKyNkZWZpbmUgSU9BQ0NFTDJfQ0hBSU4gMHg4MAorfTsKKworLyoKKyAqIFNDU0kgUmVzcG9uc2UgRm9ybWF0IHN0cnVjdHVyZSBmb3IgSU8gQWNjZWxlcmF0b3IgTW9kZSAyCisgKi8KK3N0cnVjdCBpb19hY2NlbDJfc2NzaV9yZXNwb25zZSB7CisJdTggSVVfdHlwZTsKKyNkZWZpbmUgSU9BQ0NFTDJfSVVfVFlQRV9TUkYJCQkweDYwCisJdTggcmVzZXJ2ZWQxWzNdOworCXU4IHJlcV9pZFs0XTsJCS8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworCXU4IHJlc2VydmVkMls0XTsKKwl1OCBzZXJ2X3Jlc3BvbnNlOwkJLyogc2VydmljZSByZXNwb25zZSAqLworI2RlZmluZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX0NPTVBMRVRFCQkweDAwMAorI2RlZmluZSBJT0FDQ0VMMl9TRVJWX1JFU1BPTlNFX0ZBSUxVUkUJCTB4MDAxCisjZGVmaW5lIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfVE1GX0NPTVBMRVRFCTB4MDAyCisjZGVmaW5lIElPQUNDRUwyX1NFUlZfUkVTUE9OU0VfVE1GX1NVQ0NFU1MJMHgwMDMKKyNkZWZpbmUgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfUkVKRUNURUQJMHgwMDQKKyNkZWZpbmUgSU9BQ0NFTDJfU0VSVl9SRVNQT05TRV9UTUZfV1JPTkdfTFVOCTB4MDA1CisJdTggc3RhdHVzOwkJCS8qIHN0YXR1cyAqLworI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX0dPT0QJMHgwMAorI2RlZmluZSBJT0FDQ0VMMl9TVEFUVVNfU1JfVEFTS19DT01QX0NIS19DT05ECTB4MDIKKyNkZWZpbmUgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9CVVNZCTB4MDgKKyNkZWZpbmUgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9SRVNfQ09OCTB4MTgKKyNkZWZpbmUgSU9BQ0NFTDJfU1RBVFVTX1NSX1RBU0tfQ09NUF9TRVRfRlVMTAkweDI4CisjZGVmaW5lIElPQUNDRUwyX1NUQVRVU19TUl9UQVNLX0NPTVBfQUJPUlRFRAkweDQwCisjZGVmaW5lIElPQUNDRUwyX1NUQVRVU19TUl9JT0FDQ0VMX0RJU0FCTEVECTB4MEUKKwl1OCBkYXRhX3ByZXNlbnQ7CQkvKiBsb3cgMiBiaXRzICovCisjZGVmaW5lIElPQUNDRUwyX05PX0RBVEFQUkVTRU5UCQkweDAwMAorI2RlZmluZSBJT0FDQ0VMMl9SRVNQT05TRV9EQVRBUFJFU0VOVAkweDAwMQorI2RlZmluZSBJT0FDQ0VMMl9TRU5TRV9EQVRBX1BSRVNFTlQJMHgwMDIKKyNkZWZpbmUgSU9BQ0NFTDJfUkVTRVJWRUQJCTB4MDAzCisJdTggc2Vuc2VfZGF0YV9sZW47CQkvKiBzZW5zZS9yZXNwb25zZSBkYXRhIGxlbmd0aCAqLworCXU4IHJlc2lkX2NudFs0XTsJCS8qIHJlc2lkdWFsIGNvdW50ICovCisJdTggc2Vuc2VfZGF0YV9idWZmWzMyXTsJCS8qIHNlbnNlL3Jlc3BvbnNlIGRhdGEgYnVmZmVyICovCit9OworCisjZGVmaW5lIElPQUNDRUwyXzY0X1BBRCA3NgorI2RlZmluZSBJT0FDQ0VMMl8zMl9QQUQgNzYKKyNkZWZpbmUgSU9BQ0NFTDJfUEFEIChJU18zMl9CSVQgKiBJT0FDQ0VMMl8zMl9QQUQgKyBcCisJCQlJU182NF9CSVQgKiBJT0FDQ0VMMl82NF9QQUQpCisvKgorICogU3RydWN0dXJlIGZvciBJL08gYWNjZWxlcmF0b3IgKG1vZGUgMiBvciBtMikgY29tbWFuZHMuCisgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSAxMjgtYnl0ZSBhbGlnbmVkIGluIHNpemUuCisgKi8KK3N0cnVjdCBpb19hY2NlbDJfY21kIHsKKwl1OCAgSVVfdHlwZTsJCQkvKiBJVSBUeXBlICovCisJdTggIGRpcmVjdGlvbjsJCQkvKiBkaXJlY3Rpb24sIG1lbXR5cGUsIGFuZCBlbmNyeXB0aW9uICovCisjZGVmaW5lIElPQUNDRUwyX0RJUkVDVElPTl9NQVNLCQkweDAzIC8qIGJpdHMgMCwxOiBkaXJlY3Rpb24gICovCisjZGVmaW5lIElPQUNDRUwyX0RJUkVDVElPTl9NRU1UWVBFX01BU0sJMHgwNCAvKiBiaXQgMjogbWVtdHlwZSBzb3VyY2UvZGVzdCAqLworCQkJCQkgICAgIC8qICAgICAwYj1QQ0llLCAxYj1ERFIgKi8KKyNkZWZpbmUgSU9BQ0NFTDJfRElSRUNUSU9OX0VOQ1JZUFRfTUFTSwkweDA4IC8qIGJpdCAzOiBlbmNyeXB0aW9uIGZsYWcgKi8KKwkJCQkJICAgICAvKiAgICAgMD1vZmYsIDE9b24gKi8KKwl1OCAgcmVwbHlfcXVldWU7CQkvKiBSZXBseSBRdWV1ZSBJRCAqLworCXU4ICByZXNlcnZlZDE7CQkJLyogUmVzZXJ2ZWQgKi8KKwl1MzIgc2NzaV9uZXh1czsJCQkvKiBEZXZpY2UgSGFuZGxlICovCisJdTMyIFRhZzsJCQkvKiBjY2lzcyB0YWcsIGxvd2VyIDQgYnl0ZXMgb25seSAqLworCXUzMiB0d2Vha19sb3dlcjsJCS8qIEVuY3J5cHRpb24gdHdlYWssIGxvd2VyIDQgYnl0ZXMgKi8KKwl1OCAgY2RiWzE2XTsJCQkvKiBTQ1NJIENvbW1hbmQgRGVzY3JpcHRvciBCbG9jayAqLworCXU4ICBjY2lzc19sdW5bOF07CQkvKiA4IGJ5dGUgU0NTSSBhZGRyZXNzICovCisJdTMyIGRhdGFfbGVuOwkJCS8qIFRvdGFsIGJ5dGVzIHRvIHRyYW5zZmVyICovCisJdTggIGNtZF9wcmlvcml0eV90YXNrX2F0dHI7CS8qIHByaW9yaXR5IGFuZCB0YXNrIGF0dHJzICovCisjZGVmaW5lIElPQUNDRUwyX1BSSU9SSVRZX01BU0sgMHg3OAorI2RlZmluZSBJT0FDQ0VMMl9BVFRSX01BU0sgMHgwNworCXU4ICBzZ19jb3VudDsJCQkvKiBOdW1iZXIgb2Ygc2cgZWxlbWVudHMgKi8KKwl1MTYgZGVraW5kZXg7CQkJLyogRGF0YSBlbmNyeXB0aW9uIGtleSBpbmRleCAqLworCXU2NCBlcnJfcHRyOwkJCS8qIEVycm9yIFBvaW50ZXIgKi8KKwl1MzIgZXJyX2xlbjsJCQkvKiBFcnJvciBMZW5ndGgqLworCXUzMiB0d2Vha191cHBlcjsJCS8qIEVuY3J5cHRpb24gdHdlYWssIHVwcGVyIDQgYnl0ZXMgKi8KKwlzdHJ1Y3QgaW9hY2NlbDJfc2dfZWxlbWVudCBzZ1tJT0FDQ0VMMl9NQVhTR0VOVFJJRVNdOworCXN0cnVjdCBpb19hY2NlbDJfc2NzaV9yZXNwb25zZSBlcnJvcl9kYXRhOworCXU4IHBhZFtJT0FDQ0VMMl9QQURdOworfTsKKworLyoKKyAqIGRlZmluZXMgZm9yIE1vZGUgMiBjb21tYW5kIHN0cnVjdAorICogRklYTUU6IHRoaXMgY2FuJ3QgYmUgYWxsIEkgbmVlZCBtZm0KKyAqLworI2RlZmluZSBJT0FDQ0VMMl9JVV9UWVBFCTB4NDAKKyNkZWZpbmUgSU9BQ0NFTDJfSVVfVE1GX1RZUEUJMHg0MQorI2RlZmluZSBJT0FDQ0VMMl9ESVJfTk9fREFUQQkweDAwCisjZGVmaW5lIElPQUNDRUwyX0RJUl9EQVRBX0lOCTB4MDEKKyNkZWZpbmUgSU9BQ0NFTDJfRElSX0RBVEFfT1VUCTB4MDIKKy8qCisgKiBTQ1NJIFRhc2sgTWFuYWdlbWVudCBSZXF1ZXN0IGZvcm1hdCBmb3IgQWNjZWxlcmF0b3IgTW9kZSAyCisgKi8KK3N0cnVjdCBocHNhX3RtZl9zdHJ1Y3QgeworCXU4IGl1X3R5cGU7CQkvKiBJbmZvcm1hdGlvbiBVbml0IFR5cGUgKi8KKwl1OCByZXBseV9xdWV1ZTsJCS8qIFJlcGx5IFF1ZXVlIElEICovCisJdTggdG1mOwkJCS8qIFRhc2sgTWFuYWdlbWVudCBGdW5jdGlvbiAqLworCXU4IHJlc2VydmVkMTsJCS8qIGJ5dGUgMyBSZXNlcnZlZCAqLworCXUzMiBpdF9uZXh1czsJCS8qIFNDU0kgSS1UIE5leHVzICovCisJdTggbHVuX2lkWzhdOwkJLyogTFVOIElEIGZvciBUTUYgcmVxdWVzdCAqLworCXN0cnVjdCB2YWxzMzIgVGFnOwkvKiBjY2lzcyB0YWcgYXNzb2NpYXRlZCB3LyByZXF1ZXN0ICovCisJc3RydWN0IHZhbHMzMiBhYm9ydF90YWc7LyogY2Npc3MgdGFnIG9mIFNDU0kgY21kIG9yIHRhc2sgdG8gYWJvcnQgKi8KKwl1NjQgZXJyb3JfcHRyOwkJLyogRXJyb3IgUG9pbnRlciAqLworCXUzMiBlcnJvcl9sZW47CQkvKiBFcnJvciBMZW5ndGggKi8KK307CisKIC8qIENvbmZpZ3VyYXRpb24gVGFibGUgU3RydWN0dXJlICovCiBzdHJ1Y3QgSG9zdFdyaXRlIHsKIAl1MzIgVHJhbnNwb3J0UmVxdWVzdDsKLQl1MzIgUmVzZXJ2ZWQ7CisJdTMyIGNvbW1hbmRfcG9vbF9hZGRyX2hpOwogCXUzMiBDb2FsSW50RGVsYXk7CiAJdTMyIENvYWxJbnRDb3VudDsKIH07CkBAIC0zNDQsNiArNTgzLDkgQEAKICNkZWZpbmUgU0lNUExFX01PREUgICAgIDB4MDIKICNkZWZpbmUgUEVSRk9STUFOVF9NT0RFIDB4MDQKICNkZWZpbmUgTUVNUV9NT0RFICAgICAgIDB4MDgKKyNkZWZpbmUgSU9BQ0NFTF9NT0RFXzEgIDB4ODAKKworI2RlZmluZSBEUklWRVJfU1VQUE9SVF9VQV9FTkFCTEUgICAgICAgIDB4MDAwMDAwMDEKIAogc3RydWN0IENmZ1RhYmxlIHsKIAl1OCAgICAgICAgICAgIFNpZ25hdHVyZVs0XTsKQEAgLTM3Myw4ICs2MTUsMTggQEAKIAl1MzIJCW1pc2NfZndfc3VwcG9ydDsgLyogb2Zmc2V0IDB4NzggKi8KICNkZWZpbmUJCQlNSVNDX0ZXX0RPT1JCRUxMX1JFU0VUICgweDAyKQogI2RlZmluZQkJCU1JU0NfRldfRE9PUkJFTExfUkVTRVQyICgweDAxMCkKKyNkZWZpbmUJCQlNSVNDX0ZXX1JBSURfT0ZGTE9BRF9CQVNJQyAoMHgwMjApCisjZGVmaW5lCQkJTUlTQ19GV19FVkVOVF9OT1RJRlkgKDB4MDgwKQogCXU4CQlkcml2ZXJfdmVyc2lvblszMl07Ci0KKwl1MzIgICAgICAgICAgICAgbWF4X2NhY2hlZF93cml0ZV9zaXplOworCXU4ICAgICAgICAgICAgICBkcml2ZXJfc2NyYXRjaHBhZFsxNl07CisJdTMyICAgICAgICAgICAgIG1heF9lcnJvcl9pbmZvX2xlbmd0aDsKKwl1MzIJCWlvX2FjY2VsX21heF9lbWJlZGRlZF9zZ19jb3VudDsKKwl1MzIJCWlvX2FjY2VsX3JlcXVlc3Rfc2l6ZV9vZmZzZXQ7CisJdTMyCQlldmVudF9ub3RpZnk7CisjZGVmaW5lIEhQU0FfRVZFTlRfTk9USUZZX0FDQ0VMX0lPX1BBVEhfU1RBVEVfQ0hBTkdFICgxIDw8IDMwKQorI2RlZmluZSBIUFNBX0VWRU5UX05PVElGWV9BQ0NFTF9JT19QQVRIX0NPTkZJR19DSEFOR0UgKDEgPDwgMzEpCisJdTMyCQljbGVhcl9ldmVudF9ub3RpZnk7CiB9OwogCiAjZGVmaW5lIE5VTV9CTE9DS0ZFVENIX0VOVFJJRVMgOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzdGd0LmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYwppbmRleCBiZjllY2E4Li41NmY4YTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJfQogCiAJZXJyID0gcmVxdWVzdF9pcnEodnBvcnQtPmRtYV9kZXYtPmlycSwgJmlibXZzdGd0X2ludGVycnVwdCwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgImlibXZzdGd0IiwgdGFyZ2V0KTsKKwkJCSAgMCwgImlibXZzdGd0IiwgdGFyZ2V0KTsKIAlpZiAoZXJyKQogCQlnb3RvIHJlcV9pcnFfZmFpbGVkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW4yMDAwLmMgYi9kcml2ZXJzL3Njc2kvaW4yMDAwLmMKaW5kZXggYmYwMjgyMS4uYjFjNGQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2luMjAwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pbjIwMDAuYwpAQCAtMjAxNSw3ICsyMDE1LDcgQEAKIAkJd3JpdGUxX2lvKDAsIElPX0ZJRk9fUkVBRCk7CS8qIHN0YXJ0IGZpZm8gb3V0IGluIHJlYWQgbW9kZSAqLwogCQl3cml0ZTFfaW8oMCwgSU9fSU5UUl9NQVNLKTsJLyogYWxsb3cgYWxsIGludHMgKi8KIAkJeCA9IGludF90YWJbKHN3aXRjaGVzICYgKFNXX0lOVDAgfCBTV19JTlQxKSkgPj4gU1dfSU5UX1NISUZUXTsKLQkJaWYgKHJlcXVlc3RfaXJxKHgsIGluMjAwMF9pbnRyLCBJUlFGX0RJU0FCTEVELCAiaW4yMDAwIiwgaW5zdGFuY2UpKSB7CisJCWlmIChyZXF1ZXN0X2lycSh4LCBpbjIwMDBfaW50ciwgMCwgImluMjAwMCIsIGluc3RhbmNlKSkgewogCQkJcHJpbnRrKCJpbjIwMDBfZGV0ZWN0OiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRLlxuIik7CiAJCQlkZXRlY3RfY291bnQtLTsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luaXRpby5jIGIvZHJpdmVycy9zY3NpL2luaXRpby5jCmluZGV4IDI4MGQ1YWYuLmU1ZGFlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pbml0aW8uYworKysgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKQEAgLTI5MzEsNyArMjkzMSw3IEBACiAJc2hvc3QtPmJhc2UgPSBob3N0LT5hZGRyOwogCXNob3N0LT5zZ190YWJsZXNpemUgPSBUT1RBTF9TR19FTlRSWTsKIAotCWVycm9yID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpOTF1X2ludHIsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsICJpOTF1Iiwgc2hvc3QpOworCWVycm9yID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpOTF1X2ludHIsIElSUUZfU0hBUkVELCAiaTkxdSIsIHNob3N0KTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImluaXRpbzogVW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkXG4iLCBwZGV2LT5pcnEpOwogCQlnb3RvIG91dF9mcmVlX3NjYnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggM2Y1YjU2YS4uOTI0YjBiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtMTE0Myw2ICsxMTQzLDcgQEAKIAlyZXMtPmFkZF90b19tbCA9IDA7CiAJcmVzLT5kZWxfZnJvbV9tbCA9IDA7CiAJcmVzLT5yZXNldHRpbmdfZGV2aWNlID0gMDsKKwlyZXMtPnJlc2V0X29jY3VycmVkID0gMDsKIAlyZXMtPnNkZXYgPSBOVUxMOwogCXJlcy0+c2F0YV9wb3J0ID0gTlVMTDsKIApAQCAtMjM2Nyw2ICsyMzY4LDQyIEBACiB9CiAKIC8qKgorICogaXByX2xvZ19zaXM2NF9kZXZpY2VfZXJyb3IgLSBMb2cgYSBjYWNoZSBlcnJvci4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGhvc3RyY2I6CWhvc3RyY2Igc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9sb2dfc2lzNjRfZGV2aWNlX2Vycm9yKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkJIHN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYikKK3sKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8yMV9lcnJvciAqZXJyb3I7CisJY2hhciBidWZmZXJbSVBSX01BWF9SRVNfUEFUSF9MRU5HVEhdOworCisJZXJyb3IgPSAmaG9zdHJjYi0+aGNhbS51LmVycm9yNjQudS50eXBlXzIxX2Vycm9yOworCisJaXByX2VycigiLS0tLS1GYWlsaW5nIERldmljZSBJbmZvcm1hdGlvbi0tLS0tXG4iKTsKKwlpcHJfZXJyKCJXb3JsZCBXaWRlIFVuaXF1ZSBJRDogJTA4WCUwOFglMDhYJTA4WFxuIiwKKwkJYmUzMl90b19jcHUoZXJyb3ItPnd3blswXSksIGJlMzJfdG9fY3B1KGVycm9yLT53d25bMV0pLAorCQkgYmUzMl90b19jcHUoZXJyb3ItPnd3blsyXSksIGJlMzJfdG9fY3B1KGVycm9yLT53d25bM10pKTsKKwlpcHJfZXJyKCJEZXZpY2UgUmVzb3VyY2UgUGF0aDogJXNcbiIsCisJCV9faXByX2Zvcm1hdF9yZXNfcGF0aChlcnJvci0+cmVzX3BhdGgsCisJCQkJICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOworCWVycm9yLT5wcmltYXJ5X3Byb2JsZW1fZGVzY1tzaXplb2YoZXJyb3ItPnByaW1hcnlfcHJvYmxlbV9kZXNjKSAtIDFdID0gJ1wwJzsKKwllcnJvci0+c2Vjb25kX3Byb2JsZW1fZGVzY1tzaXplb2YoZXJyb3ItPnNlY29uZF9wcm9ibGVtX2Rlc2MpIC0gMV0gPSAnXDAnOworCWlwcl9lcnIoIlByaW1hcnkgUHJvYmxlbSBEZXNjcmlwdGlvbjogJXNcbiIsIGVycm9yLT5wcmltYXJ5X3Byb2JsZW1fZGVzYyk7CisJaXByX2VycigiU2Vjb25kYXJ5IFByb2JsZW0gRGVzY3JpcHRpb246ICAlc1xuIiwgZXJyb3ItPnNlY29uZF9wcm9ibGVtX2Rlc2MpOworCWlwcl9lcnIoIlNDU0kgU2Vuc2UgRGF0YTpcbiIpOworCWlwcl9sb2dfaGV4X2RhdGEoaW9hX2NmZywgZXJyb3ItPnNlbnNlX2RhdGEsIHNpemVvZihlcnJvci0+c2Vuc2VfZGF0YSkpOworCWlwcl9lcnIoIlNDU0kgQ29tbWFuZCBEZXNjcmlwdG9yIEJsb2NrOiBcbiIpOworCWlwcl9sb2dfaGV4X2RhdGEoaW9hX2NmZywgZXJyb3ItPmNkYiwgc2l6ZW9mKGVycm9yLT5jZGIpKTsKKworCWlwcl9lcnIoIkFkZGl0aW9uYWwgSU9BIERhdGE6XG4iKTsKKwlpcHJfbG9nX2hleF9kYXRhKGlvYV9jZmcsIGVycm9yLT5pb2FfZGF0YSwgYmUzMl90b19jcHUoZXJyb3ItPmxlbmd0aF9vZl9lcnJvcikpOworfQorCisvKioKICAqIGlwcl9nZXRfZXJyb3IgLSBGaW5kIHRoZSBzcGVjZmllZCBJT0FTQyBpbiB0aGUgaXByX2Vycm9yX3RhYmxlLgogICogQGlvYXNjOglJT0FTQwogICoKQEAgLTI0NjcsNiArMjUwNCw5IEBACiAJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yMDoKIAkJaXByX2xvZ19mYWJyaWNfZXJyb3IoaW9hX2NmZywgaG9zdHJjYik7CiAJCWJyZWFrOworCWNhc2UgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjE6CisJCWlwcl9sb2dfc2lzNjRfZGV2aWNlX2Vycm9yKGlvYV9jZmcsIGhvc3RyY2IpOworCQlicmVhazsKIAljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIzOgogCQlpcHJfbG9nX3NpczY0X2NvbmZpZ19lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKIAkJYnJlYWs7CkBAIC0zNjMwLDE2ICszNjcwLDE0IEBACiAJCXJldHVybiBzdHJsZW4oYnVmKTsKIAl9CiAKLQlpZiAoYmxrX2lvcG9sbF9lbmFibGVkICYmIGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYKLQkJCWlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgeworCWlmIChpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmIGlvYV9jZmctPnNpczY0ICYmIGlvYV9jZmctPm52ZWN0b3JzID4gMSkgewogCQlmb3IgKGkgPSAxOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykKIAkJCWJsa19pb3BvbGxfZGlzYWJsZSgmaW9hX2NmZy0+aHJycVtpXS5pb3BvbGwpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCWlvYV9jZmctPmlvcG9sbF93ZWlnaHQgPSB1c2VyX2lvcG9sbF93ZWlnaHQ7Ci0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCAmJiBpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmCi0JCQlpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKKwlpZiAoaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJiBpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKIAkJZm9yIChpID0gMTsgaSA8IGlvYV9jZmctPmhycnFfbnVtOyBpKyspIHsKIAkJCWJsa19pb3BvbGxfaW5pdCgmaW9hX2NmZy0+aHJycVtpXS5pb3BvbGwsCiAJCQkJCWlvYV9jZmctPmlvcG9sbF93ZWlnaHQsIGlwcl9pb3BvbGwpOwpAQCAtNTAxNSw2ICs1MDUzLDcgQEAKIAl9IGVsc2UKIAkJcmMgPSBpcHJfZGV2aWNlX3Jlc2V0KGlvYV9jZmcsIHJlcyk7CiAJcmVzLT5yZXNldHRpbmdfZGV2aWNlID0gMDsKKwlyZXMtPnJlc2V0X29jY3VycmVkID0gMTsKIAogCUxFQVZFOwogCXJldHVybiByYyA/IEZBSUxFRCA6IFNVQ0NFU1M7CkBAIC01NDg0LDggKzU1MjMsNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCi0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCAmJiBpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmCi0JCQlpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKKwlpZiAoaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJiBpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKIAkJaWYgKChiZTMyX3RvX2NwdSgqaHJycS0+aHJycV9jdXJyKSAmIElQUl9IUlJRX1RPR0dMRV9CSVQpID09CiAJCSAgICAgICBocnJxLT50b2dnbGVfYml0KSB7CiAJCQlpZiAoIWJsa19pb3BvbGxfc2NoZWRfcHJlcCgmaHJycS0+aW9wb2xsKSkKQEAgLTYxODMsOCArNjIyMSwxMCBAQAogCQkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9OT19VTEVOX0NISzsKIAogCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfaGkgfD0gSVBSX0ZMQUdTX0hJX05PX0xJTktfREVTQzsKLQkJaWYgKGlwcl9pc19nc2NzaShyZXMpKQorCQlpZiAoaXByX2lzX2dzY3NpKHJlcykgJiYgcmVzLT5yZXNldF9vY2N1cnJlZCkgeworCQkJcmVzLT5yZXNldF9vY2N1cnJlZCA9IDA7CiAJCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfbG8gfD0gSVBSX0ZMQUdTX0xPX0RFTEFZX0FGVEVSX1JTVDsKKwkJfQogCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfbG8gfD0gSVBSX0ZMQUdTX0xPX0FMSUdORURfQkZSOwogCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfbG8gfD0gaXByX2dldF90YXNrX2F0dHJpYnV0ZXMoc2NzaV9jbWQpOwogCX0KQEAgLTg2NDEsNiArODY4MSwyNSBAQAogfQogCiAvKioKKyAqIGlwcl9wY2lfbW1pb19lbmFibGVkIC0gQ2FsbGVkIHdoZW4gTU1JTyBoYXMgYmVlbiByZS1lbmFibGVkCisgKiBAcGRldjoJUENJIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byB0ZWxsIHVzIHRoYXQgdGhlIE1NSU8KKyAqIGFjY2VzcyB0byB0aGUgSU9BIGhhcyBiZWVuIHJlc3RvcmVkCisgKi8KK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGlwcl9wY2lfbW1pb19lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmICghaW9hX2NmZy0+cHJvYmVfZG9uZSkKKwkJcGNpX3NhdmVfc3RhdGUocGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKK30KKworLyoqCiAgKiBpcHJfcGNpX2Zyb3plbiAtIENhbGxlZCB3aGVuIHNsb3QgaGFzIGV4cGVyaWVuY2VkIGEgUENJIGJ1cyBlcnJvci4KICAqIEBwZGV2OglQQ0kgZGV2aWNlIHN0cnVjdAogICoKQEAgLTg2NTQsNyArODcxMyw4IEBACiAJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgaXByX3Jlc2V0X2ZyZWV6ZSwgSVBSX1NIVVRET1dOX05PTkUpOworCWlmIChpb2FfY2ZnLT5wcm9iZV9kb25lKQorCQlfaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBpcHJfcmVzZXRfZnJlZXplLCBJUFJfU0hVVERPV05fTk9ORSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtODY3MiwxMSArODczMiwxNCBAQAogCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCWlmIChpb2FfY2ZnLT5uZWVkc193YXJtX3Jlc2V0KQotCQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT05FKTsKLQllbHNlCi0JCV9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIGlwcl9yZXNldF9yZXN0b3JlX2NmZ19zcGFjZSwKLQkJCQkJSVBSX1NIVVRET1dOX05PTkUpOworCWlmIChpb2FfY2ZnLT5wcm9iZV9kb25lKSB7CisJCWlmIChpb2FfY2ZnLT5uZWVkc193YXJtX3Jlc2V0KQorCQkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJCWVsc2UKKwkJCV9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIGlwcl9yZXNldF9yZXN0b3JlX2NmZ19zcGFjZSwKKwkJCQkJCUlQUl9TSFVURE9XTl9OT05FKTsKKwl9IGVsc2UKKwkJd2FrZV91cF9hbGwoJmlvYV9jZmctPmVlaF93YWl0X3EpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKIH0KQEAgLTg2OTUsMTcgKzg3NTgsMjAgQEAKIAlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gV0FJVF9GT1JfRFVNUCkKLQkJaW9hX2NmZy0+c2R0X3N0YXRlID0gQUJPUlRfRFVNUDsKLQlpb2FfY2ZnLT5yZXNldF9yZXRyaWVzID0gSVBSX05VTV9SRVNFVF9SRUxPQURfUkVUUklFUyAtIDE7Ci0JaW9hX2NmZy0+aW5faW9hX2JyaW5nZG93biA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IGlvYV9jZmctPmhycnFfbnVtOyBpKyspIHsKLQkJc3Bpbl9sb2NrKCZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrKTsKLQkJaW9hX2NmZy0+aHJycVtpXS5hbGxvd19jbWRzID0gMDsKLQkJc3Bpbl91bmxvY2soJmlvYV9jZmctPmhycnFbaV0uX2xvY2spOwotCX0KLQl3bWIoKTsKLQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT05FKTsKKwlpZiAoaW9hX2NmZy0+cHJvYmVfZG9uZSkgeworCQlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IFdBSVRfRk9SX0RVTVApCisJCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBBQk9SVF9EVU1QOworCQlpb2FfY2ZnLT5yZXNldF9yZXRyaWVzID0gSVBSX05VTV9SRVNFVF9SRUxPQURfUkVUUklFUyAtIDE7CisJCWlvYV9jZmctPmluX2lvYV9icmluZ2Rvd24gPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykgeworCQkJc3Bpbl9sb2NrKCZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrKTsKKwkJCWlvYV9jZmctPmhycnFbaV0uYWxsb3dfY21kcyA9IDA7CisJCQlzcGluX3VubG9jaygmaW9hX2NmZy0+aHJycVtpXS5fbG9jayk7CisJCX0KKwkJd21iKCk7CisJCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOworCX0gZWxzZQorCQl3YWtlX3VwX2FsbCgmaW9hX2NmZy0+ZWVoX3dhaXRfcSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtODcyNSw3ICs4NzkxLDcgQEAKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBwY2lfY2hhbm5lbF9pb19mcm96ZW46CiAJCWlwcl9wY2lfZnJvemVuKHBkZXYpOwotCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSOwogCWNhc2UgcGNpX2NoYW5uZWxfaW9fcGVybV9mYWlsdXJlOgogCQlpcHJfcGNpX3Blcm1fZmFpbHVyZShwZGV2KTsKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CkBAIC04NzU1LDYgKzg4MjEsNyBAQAogCUVOVEVSOwogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgaG9zdF9sb2NrX2ZsYWdzKTsKIAlkZXZfZGJnKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJpb2FfY2ZnIGFkeDogMHglcFxuIiwgaW9hX2NmZyk7CisJaW9hX2NmZy0+cHJvYmVfZG9uZSA9IDE7CiAJaWYgKGlvYV9jZmctPm5lZWRzX2hhcmRfcmVzZXQpIHsKIAkJaW9hX2NmZy0+bmVlZHNfaGFyZF9yZXNldCA9IDA7CiAJCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PTkUpOwpAQCAtOTAzMCwxNiArOTA5Nyw2IEBACiAJaWYgKCFpb2FfY2ZnLT52cGRfY2JzKQogCQlnb3RvIG91dF9mcmVlX3Jlc19lbnRyaWVzOwogCi0JZm9yIChpID0gMDsgaSA8IGlvYV9jZmctPmhycnFfbnVtOyBpKyspIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhycnFbaV0uaHJycV9mcmVlX3EpOwotCQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aHJycVtpXS5ocnJxX3BlbmRpbmdfcSk7Ci0JCXNwaW5fbG9ja19pbml0KCZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrKTsKLQkJaWYgKGkgPT0gMCkKLQkJCWlvYV9jZmctPmhycnFbaV0ubG9jayA9IGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jazsKLQkJZWxzZQotCQkJaW9hX2NmZy0+aHJycVtpXS5sb2NrID0gJmlvYV9jZmctPmhycnFbaV0uX2xvY2s7Ci0JfQotCiAJaWYgKGlwcl9hbGxvY19jbWRfYmxrcyhpb2FfY2ZnKSkKIAkJZ290byBvdXRfZnJlZV92cGRfY2JzOwogCkBAIC05MTQwLDYxICs5MTk3LDE4IEBACiB9CiAKIC8qKgotICogaXByX2luaXRfaW9hX2NmZyAtIEluaXRpYWxpemUgSU9BIGNvbmZpZyBzdHJ1Y3QKKyAqIGlwcl9pbml0X3JlZ3MgLSBJbml0aWFsaXplIElPQSByZWdpc3RlcnMKICAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAotICogQGhvc3Q6CQlzY3NpIGhvc3Qgc3RydWN0Ci0gKiBAcGRldjoJCVBDSSBkZXYgc3RydWN0CiAgKgogICogUmV0dXJuIHZhbHVlOgotICogCW5vbmUKKyAqCW5vbmUKICAqKi8KLXN0YXRpYyB2b2lkIGlwcl9pbml0X2lvYV9jZmcoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAotCQkJICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIGlwcl9pbml0X3JlZ3Moc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQogewogCWNvbnN0IHN0cnVjdCBpcHJfaW50ZXJydXB0X29mZnNldHMgKnA7CiAJc3RydWN0IGlwcl9pbnRlcnJ1cHRzICp0OwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAotCWlvYV9jZmctPmhvc3QgPSBob3N0OwotCWlvYV9jZmctPnBkZXYgPSBwZGV2OwotCWlvYV9jZmctPmxvZ19sZXZlbCA9IGlwcl9sb2dfbGV2ZWw7Ci0JaW9hX2NmZy0+ZG9vcmJlbGwgPSBJUFJfRE9PUkJFTEw7Ci0Jc3ByaW50Zihpb2FfY2ZnLT5leWVfY2F0Y2hlciwgSVBSX0VZRUNBVENIRVIpOwotCXNwcmludGYoaW9hX2NmZy0+dHJhY2Vfc3RhcnQsIElQUl9UUkFDRV9TVEFSVF9MQUJFTCk7Ci0Jc3ByaW50Zihpb2FfY2ZnLT5jZmdfdGFibGVfc3RhcnQsIElQUl9DRkdfVEJMX1NUQVJUKTsKLQlzcHJpbnRmKGlvYV9jZmctPnJlc291cmNlX3RhYmxlX2xhYmVsLCBJUFJfUkVTX1RBQkxFX0xBQkVMKTsKLQlzcHJpbnRmKGlvYV9jZmctPmlwcl9oY2FtX2xhYmVsLCBJUFJfSENBTV9MQUJFTCk7Ci0Jc3ByaW50Zihpb2FfY2ZnLT5pcHJfY21kX2xhYmVsLCBJUFJfQ01EX0xBQkVMKTsKLQotCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhvc3RyY2JfcGVuZGluZ19xKTsKLQlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPnVzZWRfcmVzX3EpOwotCUlOSVRfV09SSygmaW9hX2NmZy0+d29ya19xLCBpcHJfd29ya2VyX3RocmVhZCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmaW9hX2NmZy0+cmVzZXRfd2FpdF9xKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpb2FfY2ZnLT5tc2lfd2FpdF9xKTsKLQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBJTkFDVElWRTsKLQotCWlwcl9pbml0aWFsaXplX2J1c19hdHRyKGlvYV9jZmcpOwotCWlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCA9IGlwcl9tYXhfZGV2czsKLQotCWlmIChpb2FfY2ZnLT5zaXM2NCkgewotCQlob3N0LT5tYXhfaWQgPSBJUFJfTUFYX1NJUzY0X1RBUkdFVFNfUEVSX0JVUzsKLQkJaG9zdC0+bWF4X2x1biA9IElQUl9NQVhfU0lTNjRfTFVOU19QRVJfVEFSR0VUOwotCQlpZiAoaXByX21heF9kZXZzID4gSVBSX01BWF9TSVM2NF9ERVZTKQotCQkJaW9hX2NmZy0+bWF4X2RldnNfc3VwcG9ydGVkID0gSVBSX01BWF9TSVM2NF9ERVZTOwotCX0gZWxzZSB7Ci0JCWhvc3QtPm1heF9pZCA9IElQUl9NQVhfTlVNX1RBUkdFVFNfUEVSX0JVUzsKLQkJaG9zdC0+bWF4X2x1biA9IElQUl9NQVhfTlVNX0xVTlNfUEVSX1RBUkdFVDsKLQkJaWYgKGlwcl9tYXhfZGV2cyA+IElQUl9NQVhfUEhZU0lDQUxfREVWUykKLQkJCWlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCA9IElQUl9NQVhfUEhZU0lDQUxfREVWUzsKLQl9Ci0JaG9zdC0+bWF4X2NoYW5uZWwgPSBJUFJfTUFYX0JVU19UT19TQ0FOOwotCWhvc3QtPnVuaXF1ZV9pZCA9IGhvc3QtPmhvc3Rfbm87Ci0JaG9zdC0+bWF4X2NtZF9sZW4gPSBJUFJfTUFYX0NEQl9MRU47Ci0JaG9zdC0+Y2FuX3F1ZXVlID0gaW9hX2NmZy0+bWF4X2NtZHM7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIGlvYV9jZmcpOwotCiAJcCA9ICZpb2FfY2ZnLT5jaGlwX2NmZy0+cmVnczsKIAl0ID0gJmlvYV9jZmctPnJlZ3M7CiAJYmFzZSA9IGlvYV9jZmctPmhkd19kbWFfcmVnczsKQEAgLTkyMjUsNiArOTIzOSw3OSBAQAogfQogCiAvKioKKyAqIGlwcl9pbml0X2lvYV9jZmcgLSBJbml0aWFsaXplIElPQSBjb25maWcgc3RydWN0CisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBob3N0OgkJc2NzaSBob3N0IHN0cnVjdAorICogQHBkZXY6CQlQQ0kgZGV2IHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaW5pdF9pb2FfY2ZnKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCSAgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGk7CisKKwlpb2FfY2ZnLT5ob3N0ID0gaG9zdDsKKwlpb2FfY2ZnLT5wZGV2ID0gcGRldjsKKwlpb2FfY2ZnLT5sb2dfbGV2ZWwgPSBpcHJfbG9nX2xldmVsOworCWlvYV9jZmctPmRvb3JiZWxsID0gSVBSX0RPT1JCRUxMOworCXNwcmludGYoaW9hX2NmZy0+ZXllX2NhdGNoZXIsIElQUl9FWUVDQVRDSEVSKTsKKwlzcHJpbnRmKGlvYV9jZmctPnRyYWNlX3N0YXJ0LCBJUFJfVFJBQ0VfU1RBUlRfTEFCRUwpOworCXNwcmludGYoaW9hX2NmZy0+Y2ZnX3RhYmxlX3N0YXJ0LCBJUFJfQ0ZHX1RCTF9TVEFSVCk7CisJc3ByaW50Zihpb2FfY2ZnLT5yZXNvdXJjZV90YWJsZV9sYWJlbCwgSVBSX1JFU19UQUJMRV9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5pcHJfaGNhbV9sYWJlbCwgSVBSX0hDQU1fTEFCRUwpOworCXNwcmludGYoaW9hX2NmZy0+aXByX2NtZF9sYWJlbCwgSVBSX0NNRF9MQUJFTCk7CisKKwlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ob3N0cmNiX3BlbmRpbmdfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmZyZWVfcmVzX3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT51c2VkX3Jlc19xKTsKKwlJTklUX1dPUksoJmlvYV9jZmctPndvcmtfcSwgaXByX3dvcmtlcl90aHJlYWQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlvYV9jZmctPnJlc2V0X3dhaXRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW9hX2NmZy0+bXNpX3dhaXRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW9hX2NmZy0+ZWVoX3dhaXRfcSk7CisJaW9hX2NmZy0+c2R0X3N0YXRlID0gSU5BQ1RJVkU7CisKKwlpcHJfaW5pdGlhbGl6ZV9idXNfYXR0cihpb2FfY2ZnKTsKKwlpb2FfY2ZnLT5tYXhfZGV2c19zdXBwb3J0ZWQgPSBpcHJfbWF4X2RldnM7CisKKwlpZiAoaW9hX2NmZy0+c2lzNjQpIHsKKwkJaG9zdC0+bWF4X2lkID0gSVBSX01BWF9TSVM2NF9UQVJHRVRTX1BFUl9CVVM7CisJCWhvc3QtPm1heF9sdW4gPSBJUFJfTUFYX1NJUzY0X0xVTlNfUEVSX1RBUkdFVDsKKwkJaWYgKGlwcl9tYXhfZGV2cyA+IElQUl9NQVhfU0lTNjRfREVWUykKKwkJCWlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCA9IElQUl9NQVhfU0lTNjRfREVWUzsKKwkJaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkcjY0KQorCQkJCQkgICArICgoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2VudHJ5NjQpCisJCQkJCSAgICAgICAqIGlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCkpKTsKKwl9IGVsc2UgeworCQlob3N0LT5tYXhfaWQgPSBJUFJfTUFYX05VTV9UQVJHRVRTX1BFUl9CVVM7CisJCWhvc3QtPm1heF9sdW4gPSBJUFJfTUFYX05VTV9MVU5TX1BFUl9UQVJHRVQ7CisJCWlmIChpcHJfbWF4X2RldnMgPiBJUFJfTUFYX1BIWVNJQ0FMX0RFVlMpCisJCQlpb2FfY2ZnLT5tYXhfZGV2c19zdXBwb3J0ZWQgPSBJUFJfTUFYX1BIWVNJQ0FMX0RFVlM7CisJCWlvYV9jZmctPmNmZ190YWJsZV9zaXplID0gKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9oZHIpCisJCQkJCSAgICsgKChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkpCisJCQkJCSAgICAgICAqIGlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCkpKTsKKwl9CisKKwlob3N0LT5tYXhfY2hhbm5lbCA9IElQUl9NQVhfQlVTX1RPX1NDQU47CisJaG9zdC0+dW5pcXVlX2lkID0gaG9zdC0+aG9zdF9ubzsKKwlob3N0LT5tYXhfY21kX2xlbiA9IElQUl9NQVhfQ0RCX0xFTjsKKwlob3N0LT5jYW5fcXVldWUgPSBpb2FfY2ZnLT5tYXhfY21kczsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaW9hX2NmZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb2FfY2ZnLT5ocnJxKTsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ocnJxW2ldLmhycnFfZnJlZV9xKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhycnFbaV0uaHJycV9wZW5kaW5nX3EpOworCQlzcGluX2xvY2tfaW5pdCgmaW9hX2NmZy0+aHJycVtpXS5fbG9jayk7CisJCWlmIChpID09IDApCisJCQlpb2FfY2ZnLT5ocnJxW2ldLmxvY2sgPSBpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2s7CisJCWVsc2UKKwkJCWlvYV9jZmctPmhycnFbaV0ubG9jayA9ICZpb2FfY2ZnLT5ocnJxW2ldLl9sb2NrOworCX0KK30KKworLyoqCiAgKiBpcHJfZ2V0X2NoaXBfaW5mbyAtIEZpbmQgYWRhcHRlciBjaGlwIGluZm9ybWF0aW9uCiAgKiBAZGV2X2lkOgkJUENJIGRldmljZSBpZCBzdHJ1Y3QKICAqCkBAIC05MjQzLDU0ICs5MzMwLDYzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8qKgorICogaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3ZlcnkgLSBXYWl0IGZvciBhbnkgUENJIGVycm9yIHJlY292ZXJ5IHRvIGNvbXBsZXRlCisgKgkJCQkJCWR1cmluZyBwcm9iZSB0aW1lCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJTm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3Zlcnkoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaW9hX2NmZy0+cGRldjsKKworCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCXdhaXRfZXZlbnRfdGltZW91dChpb2FfY2ZnLT5lZWhfd2FpdF9xLAorCQkJCSAgICFwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpLAorCQkJCSAgIElQUl9QQ0lfRVJST1JfUkVDT1ZFUllfVElNRU9VVCk7CisJCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCX0KK30KKwogc3RhdGljIGludCBpcHJfZW5hYmxlX21zaXgoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQogewogCXN0cnVjdCBtc2l4X2VudHJ5IGVudHJpZXNbSVBSX01BWF9NU0lYX1ZFQ1RPUlNdOwotCWludCBpLCBlcnIsIHZlY3RvcnM7CisJaW50IGksIHZlY3RvcnM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbnRyaWVzKTsgKytpKQogCQllbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAotCXZlY3RvcnMgPSBpcHJfbnVtYmVyX29mX21zaXg7Ci0KLQl3aGlsZSAoKGVyciA9IHBjaV9lbmFibGVfbXNpeChpb2FfY2ZnLT5wZGV2LCBlbnRyaWVzLCB2ZWN0b3JzKSkgPiAwKQotCQkJdmVjdG9ycyA9IGVycjsKLQotCWlmIChlcnIgPCAwKSB7Ci0JCXBjaV9kaXNhYmxlX21zaXgoaW9hX2NmZy0+cGRldik7Ci0JCXJldHVybiBlcnI7CisJdmVjdG9ycyA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShpb2FfY2ZnLT5wZGV2LAorCQkJCQllbnRyaWVzLCAxLCBpcHJfbnVtYmVyX29mX21zaXgpOworCWlmICh2ZWN0b3JzIDwgMCkgeworCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwkJcmV0dXJuIHZlY3RvcnM7CiAJfQogCi0JaWYgKCFlcnIpIHsKLQkJZm9yIChpID0gMDsgaSA8IHZlY3RvcnM7IGkrKykKLQkJCWlvYV9jZmctPnZlY3RvcnNfaW5mb1tpXS52ZWMgPSBlbnRyaWVzW2ldLnZlY3RvcjsKLQkJaW9hX2NmZy0+bnZlY3RvcnMgPSB2ZWN0b3JzOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yczsgaSsrKQorCQlpb2FfY2ZnLT52ZWN0b3JzX2luZm9baV0udmVjID0gZW50cmllc1tpXS52ZWN0b3I7CisJaW9hX2NmZy0+bnZlY3RvcnMgPSB2ZWN0b3JzOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpcHJfZW5hYmxlX21zaShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCiB7Ci0JaW50IGksIGVyciwgdmVjdG9yczsKKwlpbnQgaSwgdmVjdG9yczsKIAotCXZlY3RvcnMgPSBpcHJfbnVtYmVyX29mX21zaXg7Ci0KLQl3aGlsZSAoKGVyciA9IHBjaV9lbmFibGVfbXNpX2Jsb2NrKGlvYV9jZmctPnBkZXYsIHZlY3RvcnMpKSA+IDApCi0JCQl2ZWN0b3JzID0gZXJyOwotCi0JaWYgKGVyciA8IDApIHsKLQkJcGNpX2Rpc2FibGVfbXNpKGlvYV9jZmctPnBkZXYpOwotCQlyZXR1cm4gZXJyOworCXZlY3RvcnMgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShpb2FfY2ZnLT5wZGV2LCAxLCBpcHJfbnVtYmVyX29mX21zaXgpOworCWlmICh2ZWN0b3JzIDwgMCkgeworCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwkJcmV0dXJuIHZlY3RvcnM7CiAJfQogCi0JaWYgKCFlcnIpIHsKLQkJZm9yIChpID0gMDsgaSA8IHZlY3RvcnM7IGkrKykKLQkJCWlvYV9jZmctPnZlY3RvcnNfaW5mb1tpXS52ZWMgPSBpb2FfY2ZnLT5wZGV2LT5pcnEgKyBpOwotCQlpb2FfY2ZnLT5udmVjdG9ycyA9IHZlY3RvcnM7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JzOyBpKyspCisJCWlvYV9jZmctPnZlY3RvcnNfaW5mb1tpXS52ZWMgPSBpb2FfY2ZnLT5wZGV2LT5pcnEgKyBpOworCWlvYV9jZmctPm52ZWN0b3JzID0gdmVjdG9yczsKIAotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG5hbWVfbXNpX3ZlY3RvcnMoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQpAQCAtOTM1NSw3ICs5NDUxLDcgQEAKICAqIGlwcl90ZXN0X21zaSAtIFRlc3QgZm9yIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0IChNU0kpIHN1cHBvcnQuCiAgKiBAcGRldjoJCVBDSSBkZXZpY2Ugc3RydWN0CiAgKgotICogRGVzY3JpcHRpb246IFRoZSByZXR1cm4gdmFsdWUgZnJvbSBwY2lfZW5hYmxlX21zaSgpIGNhbiBub3QgYWx3YXlzIGJlCisgKiBEZXNjcmlwdGlvbjogVGhlIHJldHVybiB2YWx1ZSBmcm9tIHBjaV9lbmFibGVfbXNpX3JhbmdlKCkgY2FuIG5vdCBhbHdheXMgYmUKICAqIHRydXN0ZWQuICBUaGlzIHJvdXRpbmUgc2V0cyB1cCBhbmQgaW5pdGlhdGVzIGEgdGVzdCBpbnRlcnJ1cHQgdG8gZGV0ZXJtaW5lCiAgKiBpZiB0aGUgaW50ZXJydXB0IGlzIHJlY2VpdmVkIHZpYSB0aGUgaXByX3Rlc3RfaW50cigpIHNlcnZpY2Ugcm91dGluZS4KICAqIElmIHRoZSB0ZXN0cyBmYWlscywgdGhlIGRyaXZlciB3aWxsIGZhbGwgYmFjayB0byBMU0kuCkBAIC05NDM0LDE5ICs5NTMwLDEzIEBACiAKIAlFTlRFUjsKIAotCWlmICgocmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBhZGFwdGVyXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkZvdW5kIElPQSB3aXRoIElSUTogJWRcbiIsIHBkZXYtPmlycSk7Ci0KIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkcml2ZXJfdGVtcGxhdGUsIHNpemVvZigqaW9hX2NmZykpOwogCiAJaWYgKCFob3N0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbGwgdG8gc2NzaV9ob3N0X2FsbG9jIGZhaWxlZCFcbiIpOwogCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2Rpc2FibGU7CisJCWdvdG8gb3V0OwogCX0KIAogCWlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopaG9zdC0+aG9zdGRhdGE7CkBAIC05NDc2LDYgKzk1NjYsOCBAQAogCiAJaW9hX2NmZy0+cmV2aWQgPSBwZGV2LT5yZXZpc2lvbjsKIAorCWlwcl9pbml0X2lvYV9jZmcoaW9hX2NmZywgaG9zdCwgcGRldik7CisKIAlpcHJfcmVnc19wY2kgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAKIAlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgSVBSX05BTUUpOwpAQCAtOTQ4NSwyMiArOTU3NywzNSBAQAogCQlnb3RvIG91dF9zY3NpX2hvc3RfcHV0OwogCX0KIAorCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisKKwlpZiAocmMgfHwgcGNpX2NoYW5uZWxfb2ZmbGluZShwZGV2KSkgeworCQlpZiAocGNpX2NoYW5uZWxfb2ZmbGluZShwZGV2KSkgeworCQkJaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3ZlcnkoaW9hX2NmZyk7CisJCQlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCQl9CisKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIGFkYXB0ZXJcbiIpOworCQkJaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3ZlcnkoaW9hX2NmZyk7CisJCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbnM7CisJCX0KKwl9CisKIAlpcHJfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKIAogCWlmICghaXByX3JlZ3MpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIkNvdWxkbid0IG1hcCBtZW1vcnkgcmFuZ2Ugb2YgcmVnaXN0ZXJzXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbnM7CisJCWdvdG8gb3V0X2Rpc2FibGU7CiAJfQogCiAJaW9hX2NmZy0+aGR3X2RtYV9yZWdzID0gaXByX3JlZ3M7CiAJaW9hX2NmZy0+aGR3X2RtYV9yZWdzX3BjaSA9IGlwcl9yZWdzX3BjaTsKIAlpb2FfY2ZnLT5pb2FfbWFpbGJveCA9IGlvYV9jZmctPmNoaXBfY2ZnLT5tYWlsYm94ICsgaXByX3JlZ3M7CiAKLQlpcHJfaW5pdF9pb2FfY2ZnKGlvYV9jZmcsIGhvc3QsIHBkZXYpOwotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7CisJaXByX2luaXRfcmVncyhpb2FfY2ZnKTsKIAogCWlmIChpb2FfY2ZnLT5zaXM2NCkgewogCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CkBAIC05NTA4LDcgKzk2MTMsNiBAQAogCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHNldCA2NCBiaXQgUENJIERNQSBtYXNrXG4iKTsKIAkJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJfQotCiAJfSBlbHNlCiAJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIApAQCAtOTUyMiwxMCArOTYyNiwxNSBAQAogCiAJaWYgKHJjICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJXcml0ZSBvZiBjYWNoZSBsaW5lIHNpemUgZmFpbGVkXG4iKTsKKwkJaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3ZlcnkoaW9hX2NmZyk7CiAJCXJjID0gLUVJTzsKIAkJZ290byBjbGVhbnVwX25vbWVtOwogCX0KIAorCS8qIElzc3VlIE1NSU8gcmVhZCB0byBlbnN1cmUgY2FyZCBpcyBub3QgaW4gRUVIICovCisJaW50ZXJydXB0cyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfaW50ZXJydXB0X3JlZyk7CisJaXByX3dhaXRfZm9yX3BjaV9lcnJfcmVjb3ZlcnkoaW9hX2NmZyk7CisKIAlpZiAoaXByX251bWJlcl9vZl9tc2l4ID4gSVBSX01BWF9NU0lYX1ZFQ1RPUlMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVGhlIG1heCBudW1iZXIgb2YgTVNJWCBpcyAlZFxuIiwKIAkJCUlQUl9NQVhfTVNJWF9WRUNUT1JTKTsKQEAgLTk1NDQsMTAgKzk2NTMsMjIgQEAKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkNhbm5vdCBlbmFibGUgTVNJLlxuIik7CiAJfQogCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAocGNpX2NoYW5uZWxfb2ZmbGluZShwZGV2KSkgeworCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisJCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKHBkZXYpKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKKwkJfQorCX0KKwogCWlmIChpb2FfY2ZnLT5pbnRyX2ZsYWcgPT0gSVBSX1VTRV9NU0kgfHwKIAkgICAgaW9hX2NmZy0+aW50cl9mbGFnID09IElQUl9VU0VfTVNJWCkgewogCQlyYyA9IGlwcl90ZXN0X21zaShpb2FfY2ZnLCBwZGV2KTsKIAkJaWYgKHJjID09IC1FT1BOT1RTVVBQKSB7CisJCQlpcHJfd2FpdF9mb3JfcGNpX2Vycl9yZWNvdmVyeShpb2FfY2ZnKTsKIAkJCWlmIChpb2FfY2ZnLT5pbnRyX2ZsYWcgPT0gSVBSX1VTRV9NU0kpIHsKIAkJCQlpb2FfY2ZnLT5pbnRyX2ZsYWcgJj0gfklQUl9VU0VfTVNJOwogCQkJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKQEAgLTk1NzcsMzAgKzk2OTgsMTIgQEAKIAkJCQkodW5zaWduZWQgaW50KW51bV9vbmxpbmVfY3B1cygpLAogCQkJCSh1bnNpZ25lZCBpbnQpSVBSX01BWF9IUlJRX05VTSk7CiAKLQkvKiBTYXZlIGF3YXkgUENJIGNvbmZpZyBzcGFjZSBmb3IgdXNlIGZvbGxvd2luZyBJT0EgcmVzZXQgKi8KLQlyYyA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCi0JaWYgKHJjICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2F2ZSBQQ0kgY29uZmlnIHNwYWNlXG4iKTsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKLQl9Ci0KIAlpZiAoKHJjID0gaXByX3NhdmVfcGNpeF9jbWRfcmVnKGlvYV9jZmcpKSkKIAkJZ290byBvdXRfbXNpX2Rpc2FibGU7CiAKIAlpZiAoKHJjID0gaXByX3NldF9wY2l4X2NtZF9yZWcoaW9hX2NmZykpKQogCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKIAotCWlmIChpb2FfY2ZnLT5zaXM2NCkKLQkJaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkcjY0KQotCQkJCSsgKChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnk2NCkKLQkJCQkqIGlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCkpKTsKLQllbHNlCi0JCWlvYV9jZmctPmNmZ190YWJsZV9zaXplID0gKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9oZHIpCi0JCQkJKyAoKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSkKLQkJCQkqIGlvYV9jZmctPm1heF9kZXZzX3N1cHBvcnRlZCkpKTsKLQogCXJjID0gaXByX2FsbG9jX21lbShpb2FfY2ZnKTsKIAlpZiAocmMgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKQEAgLTk2MDgsNiArOTcxMSwxNSBAQAogCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKIAl9CiAKKwkvKiBTYXZlIGF3YXkgUENJIGNvbmZpZyBzcGFjZSBmb3IgdXNlIGZvbGxvd2luZyBJT0EgcmVzZXQgKi8KKwlyYyA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJaWYgKHJjICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2F2ZSBQQ0kgY29uZmlnIHNwYWNlXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGNsZWFudXBfbm9sb2c7CisJfQorCiAJLyoKIAkgKiBJZiBIUlJRIHVwZGF0ZWQgaW50ZXJydXB0IGlzIG5vdCBtYXNrZWQsIG9yIHJlc2V0IGFsZXJ0IGlzIHNldCwKIAkgKiB0aGUgY2FyZCBpcyBpbiBhbiB1bmtub3duIHN0YXRlIGFuZCBuZWVkcyBhIGhhcmQgcmVzZXQKQEAgLTk2NjQsMTggKzk3NzYsMTkgQEAKIGNsZWFudXBfbm9sb2c6CiAJaXByX2ZyZWVfbWVtKGlvYV9jZmcpOwogb3V0X21zaV9kaXNhYmxlOgorCWlwcl93YWl0X2Zvcl9wY2lfZXJyX3JlY292ZXJ5KGlvYV9jZmcpOwogCWlmIChpb2FfY2ZnLT5pbnRyX2ZsYWcgPT0gSVBSX1VTRV9NU0kpCiAJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAllbHNlIGlmIChpb2FfY2ZnLT5pbnRyX2ZsYWcgPT0gSVBSX1VTRV9NU0lYKQogCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOwogY2xlYW51cF9ub21lbToKIAlpb3VubWFwKGlwcl9yZWdzKTsKK291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIG91dF9yZWxlYXNlX3JlZ2lvbnM6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIG91dF9zY3NpX2hvc3RfcHV0OgogCXNjc2lfaG9zdF9wdXQoaG9zdCk7Ci1vdXRfZGlzYWJsZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTk4NTksOCArOTk3Miw3IEBACiAJaW9hX2NmZy0+aG9zdC0+bWF4X2NoYW5uZWwgPSBJUFJfVlNFVF9CVVM7CiAJaW9hX2NmZy0+aW9wb2xsX3dlaWdodCA9IGlvYV9jZmctPmNoaXBfY2ZnLT5pb3BvbGxfd2VpZ2h0OwogCi0JaWYgKGJsa19pb3BvbGxfZW5hYmxlZCAmJiBpb2FfY2ZnLT5pb3BvbGxfd2VpZ2h0ICYmCi0JCQlpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKKwlpZiAoaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJiBpb2FfY2ZnLT5zaXM2NCAmJiBpb2FfY2ZnLT5udmVjdG9ycyA+IDEpIHsKIAkJZm9yIChpID0gMTsgaSA8IGlvYV9jZmctPmhycnFfbnVtOyBpKyspIHsKIAkJCWJsa19pb3BvbGxfaW5pdCgmaW9hX2NmZy0+aHJycVtpXS5pb3BvbGwsCiAJCQkJCWlvYV9jZmctPmlvcG9sbF93ZWlnaHQsIGlwcl9pb3BvbGwpOwpAQCAtOTg4OSw4ICsxMDAwMSw3IEBACiAJaW50IGk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwotCWlmIChibGtfaW9wb2xsX2VuYWJsZWQgJiYgaW9hX2NmZy0+aW9wb2xsX3dlaWdodCAmJgotCQkJaW9hX2NmZy0+c2lzNjQgJiYgaW9hX2NmZy0+bnZlY3RvcnMgPiAxKSB7CisJaWYgKGlvYV9jZmctPmlvcG9sbF93ZWlnaHQgJiYgaW9hX2NmZy0+c2lzNjQgJiYgaW9hX2NmZy0+bnZlY3RvcnMgPiAxKSB7CiAJCWlvYV9jZmctPmlvcG9sbF93ZWlnaHQgPSAwOwogCQlmb3IgKGkgPSAxOyBpIDwgaW9hX2NmZy0+aHJycV9udW07IGkrKykKIAkJCWJsa19pb3BvbGxfZGlzYWJsZSgmaW9hX2NmZy0+aHJycVtpXS5pb3BvbGwpOwpAQCAtOTk5NCw2ICsxMDEwNSw4IEBACiAJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ09ESUxFLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3RDksIDAsIDAsIDAgfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdEQSwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKIAkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0VCLCAwLCAwLCAwIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ09ESUxFLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3RUMsIDAsIDAsIDAgfSwKQEAgLTEwMDA1LDEyICsxMDExOCwxOSBAQAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3RUYsIDAsIDAsIDAgfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdGMCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NPRElMRSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF8yQ0NBLCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ09ESUxFLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzJDRDIsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DT0RJTEUsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfMkNDRCwgMCwgMCwgMCB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpcHJfcGNpX3RhYmxlKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgaXByX2Vycl9oYW5kbGVyID0gewogCS5lcnJvcl9kZXRlY3RlZCA9IGlwcl9wY2lfZXJyb3JfZGV0ZWN0ZWQsCisJLm1taW9fZW5hYmxlZCA9IGlwcl9wY2lfbW1pb19lbmFibGVkLAogCS5zbG90X3Jlc2V0ID0gaXByX3BjaV9zbG90X3Jlc2V0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5oIGIvZHJpdmVycy9zY3NpL2lwci5oCmluZGV4IDljZTM4YTIuLjMxZWQxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuaAorKysgYi9kcml2ZXJzL3Njc2kvaXByLmgKQEAgLTEwMSwxMiArMTAxLDE2IEBACiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0Q3ICAgIDB4MDNGRgogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdEOCAgICAweDAzRkUKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RDkgICAgMHgwNDZECisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0RBICAgIDB4MDRDQQogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdFQiAgICAweDA0NzQKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RUMgICAgMHgwNDc1CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0VEICAgIDB4MDQ5OQogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdFRSAgICAweDA0OUEKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3RUYgICAgMHgwNDlCCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0YwICAgIDB4MDQ5QworI2RlZmluZSBJUFJfU1VCU19ERVZfSURfMkNDQQkweDA0QzcKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzJDRDIJMHgwNEM4CisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF8yQ0NECTB4MDRDOQogI2RlZmluZSBJUFJfTkFNRQkJCQkiaXByIgogCiAvKgpAQCAtMjMwLDYgKzIzNCw3IEBACiAjZGVmaW5lIElQUl9XQUlUX0ZPUl9SRVNFVF9USU1FT1VUCQkoMiAqIEhaKQogI2RlZmluZSBJUFJfQ0hFQ0tfRk9SX1JFU0VUX1RJTUVPVVQJCShIWiAvIDEwKQogI2RlZmluZSBJUFJfV0FJVF9GT1JfQklTVF9USU1FT1VUCQkoMiAqIEhaKQorI2RlZmluZSBJUFJfUENJX0VSUk9SX1JFQ09WRVJZX1RJTUVPVVQJKDEyMCAqIEhaKQogI2RlZmluZSBJUFJfUENJX1JFU0VUX1RJTUVPVVQJCQkoSFogLyAyKQogI2RlZmluZSBJUFJfU0lTMzJfRFVNUF9USU1FT1VUCQkJKDE1ICogSFopCiAjZGVmaW5lIElQUl9TSVM2NF9EVU1QX1RJTUVPVVQJCQkoNDAgKiBIWikKQEAgLTg5Nyw2ICs5MDIsMTggQEAKIAlfX2JlMzIgaW9hX2RhdGFbMjM2XTsKIH1fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CiAKK3N0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzIxX2Vycm9yIHsKKwlfX2JlMzIgd3duWzRdOworCXU4IHJlc19wYXRoWzhdOworCXU4IHByaW1hcnlfcHJvYmxlbV9kZXNjWzMyXTsKKwl1OCBzZWNvbmRfcHJvYmxlbV9kZXNjWzMyXTsKKwlfX2JlMzIgc2Vuc2VfZGF0YVs4XTsKKwlfX2JlMzIgY2RiWzRdOworCV9fYmUzMiByZXNpZHVhbF90cmFuc19sZW5ndGg7CisJX19iZTMyIGxlbmd0aF9vZl9lcnJvcjsKKwlfX2JlMzIgaW9hX2RhdGFbMjM2XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKIHN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzAyX2Vycm9yIHsKIAlzdHJ1Y3QgaXByX3ZwZCBpb2FfdnBkOwogCXN0cnVjdCBpcHJfdnBkIGNmY192cGQ7CkBAIC0xMTI2LDYgKzExNDMsNyBAQAogCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV9mZl9lcnJvciB0eXBlX2ZmX2Vycm9yOwogCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8xMl9lcnJvciB0eXBlXzEyX2Vycm9yOwogCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8xN19lcnJvciB0eXBlXzE3X2Vycm9yOworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8yMV9lcnJvciB0eXBlXzIxX2Vycm9yOwogCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8yM19lcnJvciB0eXBlXzIzX2Vycm9yOwogCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8yNF9lcnJvciB0eXBlXzI0X2Vycm9yOwogCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8zMF9lcnJvciB0eXBlXzMwX2Vycm9yOwpAQCAtMTE2OSw2ICsxMTg3LDcgQEAKICNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMTYJCQkJMHgxNgogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8xNwkJCQkweDE3CiAjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIwCQkJCTB4MjAKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjEJCQkJMHgyMQogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yMwkJCQkweDIzCiAjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzI0CQkJCTB4MjQKICNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjYJCQkJMHgyNgpAQCAtMTI1Miw2ICsxMjcxLDcgQEAKIAl1OCBhZGRfdG9fbWw6MTsKIAl1OCBkZWxfZnJvbV9tbDoxOwogCXU4IHJlc2V0dGluZ19kZXZpY2U6MTsKKwl1OCByZXNldF9vY2N1cnJlZDoxOwogCiAJdTMyIGJ1czsJCS8qIEFLQSBjaGFubmVsICovCiAJdTMyIHRhcmdldDsJCS8qIEFLQSBpZCAqLwpAQCAtMTQ0MSw2ICsxNDYxLDcgQEAKIAl1OCBkdW1wX3RpbWVvdXQ6MTsKIAl1OCBjZmdfbG9ja2VkOjE7CiAJdTggY2xlYXJfaXNyOjE7CisJdTggcHJvYmVfZG9uZToxOwogCiAJdTggcmV2aWQ7CiAKQEAgLTE1MTksNiArMTU0MCw3IEBACiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCByZXNldF93YWl0X3E7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgbXNpX3dhaXRfcTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBlZWhfd2FpdF9xOwogCiAJc3RydWN0IGlwcl9kdW1wICpkdW1wOwogCWVudW0gaXByX3NkdF9zdGF0ZSBzZHRfc3RhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMKaW5kZXggZDI1ZDBkOC4uNjk1YjM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwpAQCAtNjYsNyArNjYsNyBAQAogI2luY2x1ZGUgInByb2JlX3JvbXMuaCIKIAogI2RlZmluZSBNQUogMQotI2RlZmluZSBNSU4gMQorI2RlZmluZSBNSU4gMgogI2RlZmluZSBCVUlMRCAwCiAjZGVmaW5lIERSVl9WRVJTSU9OIF9fc3RyaW5naWZ5KE1BSikgIi4iIF9fc3RyaW5naWZ5KE1JTikgIi4iIFwKIAlfX3N0cmluZ2lmeShCVUlMRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYwppbmRleCA5OWQyOTMwLi41NmUzODA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCkBAIC0yNzIzLDEzICsyNzIzLDkgQEAKIAltZW1jcHkocmVzcC0+ZW5kaW5nX2ZpcywgZmlzLCBzaXplb2YoKmZpcykpOwogCXRzLT5idWZfdmFsaWRfc2l6ZSA9IHNpemVvZigqcmVzcCk7CiAKLQkvKiBJZiB0aGUgZGV2aWNlIGZhdWx0IGJpdCBpcyBzZXQgaW4gdGhlIHN0YXR1cyByZWdpc3RlciwgdGhlbgotCSAqIHNldCB0aGUgc2Vuc2UgZGF0YSBhbmQgcmV0dXJuLgotCSAqLwotCWlmIChmaXMtPnN0YXR1cyAmIEFUQV9ERikKKwkvKiBJZiBhbiBlcnJvciBpcyBmbGFnZ2VkIGxldCBsaWJhdGEgZGVjb2RlIHRoZSBmaXMgKi8KKwlpZiAoYWNfZXJyX21hc2soZmlzLT5zdGF0dXMpKQogCQl0cy0+c3RhdCA9IFNBU19QUk9UT19SRVNQT05TRTsKLQllbHNlIGlmIChmaXMtPnN0YXR1cyAmIEFUQV9FUlIpCi0JCXRzLT5zdGF0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCWVsc2UKIAkJdHMtPnN0YXQgPSBTQU1fU1RBVF9HT09EOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfYm9vdF9zeXNmcy5jIGIvZHJpdmVycy9zY3NpL2lzY3NpX2Jvb3Rfc3lzZnMuYwppbmRleCAxNGMxYzhmLi42ODBiZjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfYm9vdF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV9ib290X3N5c2ZzLmMKQEAgLTQ5MCw1ICs0OTAsNiBAQAogCQlpc2NzaV9ib290X3JlbW92ZV9rb2JqKGJvb3Rfa29iaik7CiAKIAlrc2V0X3VucmVnaXN0ZXIoYm9vdF9rc2V0LT5rc2V0KTsKKwlrZnJlZShib290X2tzZXQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfYm9vdF9kZXN0cm95X2tzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCmluZGV4IGFkZDZkMTUuLmJmYjZkMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKQEAgLTU5Myw5ICs1OTMsOSBAQAogCWlzY3NpX3N3X3RjcF9jb25uX3Jlc3RvcmVfY2FsbGJhY2tzKGNvbm4pOwogCXNvY2tfcHV0KHNvY2stPnNrKTsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCXRjcF9zd19jb25uLT5zb2NrID0gTlVMTDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJc29ja2ZkX3B1dChzb2NrKTsKIH0KIApAQCAtNjYzLDEwICs2NjMsMTAgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWVfc29ja2V0OwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJLyogYmluZCBpU0NTSSBjb25uZWN0aW9uIGFuZCBzb2NrZXQgKi8KIAl0Y3Bfc3dfY29ubi0+c29jayA9IHNvY2s7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJLyogc2V0dXAgU29ja2V0IHBhcmFtZXRlcnMgKi8KIAlzayA9IHNvY2stPnNrOwpAQCAtNzI2LDE0ICs3MjYsMTQgQEAKIAlzd2l0Y2gocGFyYW0pIHsKIAljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKIAljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKLQkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCQlpZiAoIXRjcF9zd19jb25uIHx8ICF0Y3Bfc3dfY29ubi0+c29jaykgewotCQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCQlyZXR1cm4gLUVOT1RDT05OOwogCQl9CiAJCXJjID0ga2VybmVsX2dldHBlZXJuYW1lKHRjcF9zd19jb25uLT5zb2NrLAogCQkJCQkoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZsZW4pOwotCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAKQEAgLTc1OSwyMyArNzU5LDI2IEBACiAKIAlzd2l0Y2ggKHBhcmFtKSB7CiAJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzoKLQkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJaWYgKCFzZXNzaW9uKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKworCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWNvbm4gPSBzZXNzaW9uLT5sZWFkY29ubjsKIAkJaWYgKCFjb25uKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJCXJldHVybiAtRU5PVENPTk47CiAJCX0KIAkJdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwogCiAJCXRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CiAJCWlmICghdGNwX3N3X2Nvbm4tPnNvY2spIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQkJcmV0dXJuIC1FTk9UQ09OTjsKIAkJfQogCiAJCXJjID0ga2VybmVsX2dldHNvY2tuYW1lKHRjcF9zd19jb25uLT5zb2NrLAogCQkJCQkoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZsZW4pOwotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKaW5kZXggNDA0NjI0MS4uNWI4NjA1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKQEAgLTExMCwxNiArMTEwLDggQEAKIAkJc2Vzc2lvbi0+ZXhwX2NtZHNuID0gZXhwX2NtZHNuOwogCiAJaWYgKG1heF9jbWRzbiAhPSBzZXNzaW9uLT5tYXhfY21kc24gJiYKLQkgICAgIWlzY3NpX3NuYV9sdChtYXhfY21kc24sIHNlc3Npb24tPm1heF9jbWRzbikpIHsKKwkgICAgIWlzY3NpX3NuYV9sdChtYXhfY21kc24sIHNlc3Npb24tPm1heF9jbWRzbikpCiAJCXNlc3Npb24tPm1heF9jbWRzbiA9IG1heF9jbWRzbjsKLQkJLyoKLQkJICogaWYgdGhlIHdpbmRvdyBjbG9zZWQgd2l0aCBJTyBxdWV1ZWQsIHRoZW4ga2ljayB0aGUKLQkJICogeG1pdCB0aHJlYWQKLQkJICovCi0JCWlmICghbGlzdF9lbXB0eSgmc2Vzc2lvbi0+bGVhZGNvbm4tPmNtZHF1ZXVlKSB8fAotCQkgICAgIWxpc3RfZW1wdHkoJnNlc3Npb24tPmxlYWRjb25uLT5tZ210cXVldWUpKQotCQkJaXNjc2lfY29ubl9xdWV1ZV93b3JrKHNlc3Npb24tPmxlYWRjb25uKTsKLQl9CiB9CiAKIHZvaWQgaXNjc2lfdXBkYXRlX2NtZHNuKHN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3QgaXNjc2lfbm9waW4gKmhkcikKQEAgLTQ4MSw3ICs0NzMsNyBAQAogICogaXNjc2lfZnJlZV90YXNrIC0gZnJlZSBhIHRhc2sKICAqIEB0YXNrOiBpc2NzaSBjbWQgdGFzawogICoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggc2Vzc2lvbiBsb2NrLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzZXNzaW9uIGJhY2tfbG9jay4KICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2NzaSBjb21tYW5kIHRvIHNjc2ktbWwgb3IgY2xlYW5zCiAgKiB1cCBtZ210IHRhc2tzIHRoZW4gcmV0dXJucyB0aGUgdGFzayB0byB0aGUgcG9vbC4KICAqLwpAQCAtNTM1LDkgKzUyNywxMCBAQAogewogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gdGFzay0+Y29ubi0+c2Vzc2lvbjsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJLyogcmVndWxhciBSWCBwYXRoIHVzZXMgYmFja19sb2NrICovCisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCV9faXNjc2lfcHV0X3Rhc2sodGFzayk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfcHV0X3Rhc2spOwogCkBAIC01NDYsNyArNTM5LDcgQEAKICAqIEB0YXNrOiBpc2NzaSBjbWQgdGFzawogICogQHN0YXRlOiBzdGF0ZSB0byBjb21wbGV0ZSB0YXNrIHdpdGgKICAqCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gbG9jay4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggc2Vzc2lvbiBiYWNrX2xvY2suCiAgKi8KIHN0YXRpYyB2b2lkIGlzY3NpX2NvbXBsZXRlX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssIGludCBzdGF0ZSkKIHsKQEAgLTU4NSw3ICs1NzgsNyBAQAogICogVGhpcyBpcyB1c2VkIHdoZW4gZHJpdmVycyBkbyBub3QgbmVlZCBvciBjYW5ub3QgcGVyZm9ybQogICogbG93ZXIgbGV2ZWwgcGR1IHByb2Nlc3NpbmcuCiAgKgotICogQ2FsbGVkIHdpdGggc2Vzc2lvbiBsb2NrCisgKiBDYWxsZWQgd2l0aCBzZXNzaW9uIGJhY2tfbG9jawogICovCiB2b2lkIGlzY3NpX2NvbXBsZXRlX3Njc2lfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywKIAkJCSAgICAgIHVpbnQzMl90IGV4cF9jbWRzbiwgdWludDMyX3QgbWF4X2NtZHNuKQpAQCAtNjAyLDcgKzU5NSw3IEBACiAKIAogLyoKLSAqIHNlc3Npb24gbG9jayBtdXN0IGJlIGhlbGQgYW5kIGlmIG5vdCBjYWxsZWQgZm9yIGEgdGFzayB0aGF0IGlzCisgKiBzZXNzaW9uIGJhY2tfbG9jayBtdXN0IGJlIGhlbGQgYW5kIGlmIG5vdCBjYWxsZWQgZm9yIGEgdGFzayB0aGF0IGlzCiAgKiBzdGlsbCBwZW5kaW5nIG9yIGZyb20gdGhlIHhtaXQgdGhyZWFkLCB0aGVuIHhtaXQgdGhyZWFkIG11c3QKICAqIGJlIHN1c3BlbmRlZC4KICAqLwpAQCAtNjQyLDcgKzYzNSwxMCBAQAogCQlzY3NpX2luKHNjKS0+cmVzaWQgPSBzY3NpX2luKHNjKS0+bGVuZ3RoOwogCX0KIAorCS8qIHJlZ3VsYXIgUlggcGF0aCB1c2VzIGJhY2tfbG9jayAqLworCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAlpc2NzaV9jb21wbGV0ZV90YXNrKHRhc2ssIHN0YXRlKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIH0KIAogc3RhdGljIGludCBpc2NzaV9wcmVwX21nbXRfdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwKQEAgLTc4MCw3ICs3NzYsMTAgQEAKIAlyZXR1cm4gdGFzazsKIAogZnJlZV90YXNrOgorCS8qIHJlZ3VsYXIgUlggcGF0aCB1c2VzIGJhY2tfbG9jayAqLworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAlfX2lzY3NpX3B1dF90YXNrKHRhc2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCXJldHVybiBOVUxMOwogfQogCkBAIC03OTEsMTAgKzc5MCwxMCBAQAogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmICghX19pc2NzaV9jb25uX3NlbmRfcGR1KGNvbm4sIGhkciwgZGF0YSwgZGF0YV9zaXplKSkKIAkJZXJyID0gLUVQRVJNOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfY29ubl9zZW5kX3BkdSk7CkBAIC0xMDEzLDEzICsxMDEyLDEzIEBACiAJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAogCQkJCSAgInBkdSAob3AgMHgleCBpdHQgMHgleCkgcmVqZWN0ZWQgIgogCQkJCSAgImR1ZSB0byBEYXRhRGlnZXN0IGVycm9yLlxuIiwKLQkJCQkgIHJlamVjdGVkX3BkdS5pdHQsIG9wY29kZSk7CisJCQkJICBvcGNvZGUsIHJlamVjdGVkX3BkdS5pdHQpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX1JFQVNPTl9JTU1fQ01EX1JFSkVDVDoKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCiAJCQkJICAicGR1IChvcCAweCV4IGl0dCAweCV4KSByZWplY3RlZC4gVG9vIG1hbnkgIgogCQkJCSAgImltbWVkaWF0ZSBjb21tYW5kcy5cbiIsCi0JCQkJICByZWplY3RlZF9wZHUuaXR0LCBvcGNvZGUpOworCQkJCSAgb3Bjb2RlLCByZWplY3RlZF9wZHUuaXR0KTsKIAkJLyoKIAkJICogV2Ugb25seSBzZW5kIG9uZSBUTUYgYXQgYSB0aW1lIHNvIGlmIHRoZSB0YXJnZXQgY291bGQgbm90CiAJCSAqIGhhbmRsZSBpdCwgdGhlbiBpdCBzaG91bGQgZ2V0IGZpeGVkIChSRkMgbWFuZGF0ZXMgdGhhdApAQCAtMTAzMSwxNCArMTAzMCwxOSBAQAogCQlpZiAob3Bjb2RlICE9IElTQ1NJX09QX05PT1BfT1VUKQogCQkJcmV0dXJuIDA7CiAKLQkJIGlmIChyZWplY3RlZF9wZHUuaXR0ID09IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpCisJCSBpZiAocmVqZWN0ZWRfcGR1Lml0dCA9PSBjcHVfdG9fYmUzMihJU0NTSV9SRVNFUlZFRF9UQUcpKSB7CiAJCQkvKgogCQkJICogbm9wLW91dCBpbiByZXNwb25zZSB0byB0YXJnZXQncyBub3Atb3V0IHJlamVjdGVkLgogCQkJICogSnVzdCByZXNlbmQuCiAJCQkgKi8KKwkJCS8qIEluIFJYIHBhdGggd2UgYXJlIHVuZGVyIGJhY2sgbG9jayAqLworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CisJCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCQlpc2NzaV9zZW5kX25vcG91dChjb25uLAogCQkJCQkgIChzdHJ1Y3QgaXNjc2lfbm9waW4qKSZyZWplY3RlZF9wZHUpOwotCQllbHNlIHsKKwkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOworCQkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOworCQl9IGVsc2UgewogCQkJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CiAJCQkvKgogCQkJICogT3VyIG5vcCBhcyBwaW5nIGdvdCBkcm9wcGVkLiBXZSBrbm93IHRoZSB0YXJnZXQKQEAgLTEwNTksOCArMTA2Myw4IEBACiAJZGVmYXVsdDoKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCiAJCQkJICAicGR1IChvcCAweCV4IGl0dCAweCV4KSByZWplY3RlZC4gUmVhc29uICIKLQkJCQkgICJjb2RlIDB4JXhcbiIsIHJlamVjdGVkX3BkdS5pdHQsCi0JCQkJICByZWplY3RlZF9wZHUub3Bjb2RlLCByZWplY3QtPnJlYXNvbik7CisJCQkJICAiY29kZSAweCV4XG4iLCByZWplY3RlZF9wZHUub3Bjb2RlLAorCQkJCSAgcmVqZWN0ZWRfcGR1Lml0dCwgcmVqZWN0LT5yZWFzb24pOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIHJjOwpAQCAtMTA3NCw3ICsxMDc4LDcgQEAKICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIG1nbXQgdGFza3MgbGlrZSBsb2dpbiBhbmQgbm9wcywgb3IgaWYKICAqIHRoZSBMREQncyBpdHQgc3BhY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2Vzc2lvbiBhZ2UuCiAgKgotICogVGhlIHNlc3Npb24gbG9jayBtdXN0IGJlIGhlbGQuCisgKiBUaGUgc2Vzc2lvbiBiYWNrX2xvY2sgbXVzdCBiZSBoZWxkLgogICovCiBzdHJ1Y3QgaXNjc2lfdGFzayAqaXNjc2lfaXR0X3RvX3Rhc2soc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIGl0dF90IGl0dCkKIHsKQEAgLTExMDMsNyArMTEwNyw3IEBACiAgKiBAZGF0YWxlbjogbGVuIG9mIGRhdGEgYnVmZmVyCiAgKgogICogQ29tcGxldGVzIHBkdSBwcm9jZXNzaW5nIGJ5IGZyZWVpbmcgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgYXQKLSAqIHF1ZXVlY29tbWFuZCBvciBzZW5kIGdlbmVyaWMuIHNlc3Npb24gbG9jayBtdXN0IGJlIGhlbGQgYW5kIHZlcmlmeQorICogcXVldWVjb21tYW5kIG9yIHNlbmQgZ2VuZXJpYy4gc2Vzc2lvbiBiYWNrX2xvY2sgbXVzdCBiZSBoZWxkIGFuZCB2ZXJpZnkKICAqIGl0dCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCiAgKi8KIGludCBfX2lzY3NpX2NvbXBsZXRlX3BkdShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLApAQCAtMTE0MCw3ICsxMTQ0LDEyIEBACiAJCQlpZiAoaGRyLT50dHQgPT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSkKIAkJCQlicmVhazsKIAorCQkJLyogSW4gUlggcGF0aCB3ZSBhcmUgdW5kZXIgYmFjayBsb2NrICovCisJCQlzcGluX3VubG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKKwkJCXNwaW5fbG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJCWlzY3NpX3NlbmRfbm9wb3V0KGNvbm4sIChzdHJ1Y3QgaXNjc2lfbm9waW4qKWhkcik7CisJCQlzcGluX3VubG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKKwkJCXNwaW5fbG9jaygmc2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJCWJyZWFrOwogCQljYXNlIElTQ1NJX09QX1JFSkVDVDoKIAkJCXJjID0gaXNjc2lfaGFuZGxlX3JlamVjdChjb25uLCBoZHIsIGRhdGEsIGRhdGFsZW4pOwpAQCAtMTI0Nyw5ICsxMjU2LDkgQEAKIHsKIAlpbnQgcmM7CiAKLQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAlyYyA9IF9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIGhkciwgZGF0YSwgZGF0YWxlbik7Ci0Jc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2NvbXBsZXRlX3BkdSk7CkBAIC0xMjkzLDcgKzEzMDIsNyBAQAogICoKICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGNtZCB0YXNrcy4KICAqCi0gKiBUaGUgc2Vzc2lvbiBsb2NrIG11c3QgYmUgaGVsZC4KKyAqIFRoZSBzZXNzaW9uIGJhY2tfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KIHN0cnVjdCBpc2NzaV90YXNrICppc2NzaV9pdHRfdG9fY3Rhc2soc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIGl0dF90IGl0dCkKIHsKQEAgLTEzMjMsMTUgKzEzMzIsMTUgQEAKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAljb25uID0gc2Vzc2lvbi0+bGVhZGNvbm47CiAJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX1RFUk1JTkFURSB8fCAhY29ubikgewotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlyZXR1cm47CiAJfQogCiAJZGV2ID0gZ2V0X2RldmljZSgmY29ubi0+Y2xzX2Nvbm4tPmRldik7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmICghZGV2KQogCSAgICAgICAgcmV0dXJuOwogCS8qCkBAIC0xMzUxLDE1ICsxMzYwLDE1IEBACiB7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX0ZBSUxFRCkgewotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGNvbm4tPnN0b3Bfc3RhZ2UgPT0gMCkKIAkJc2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9GQUlMRUQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJc2V0X2JpdChJU0NTSV9TVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfdHgpOwogCXNldF9iaXQoSVNDU0lfU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3J4KTsKQEAgLTEzOTMsMTUgKzE0MDIsMTggQEAKIAkJcmV0dXJuIC1FTk9EQVRBOwogCiAJX19pc2NzaV9nZXRfdGFzayh0YXNrKTsKLQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJcmMgPSBjb25uLT5zZXNzaW9uLT50dC0+eG1pdF90YXNrKHRhc2spOwotCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogCWlmICghcmMpIHsKIAkJLyogZG9uZSB3aXRoIHRoaXMgdGFzayAqLwogCQl0YXNrLT5sYXN0X3hmZXIgPSBqaWZmaWVzOwogCQljb25uLT50YXNrID0gTlVMTDsKIAl9CisJLyogcmVndWxhciBSWCBwYXRoIHVzZXMgYmFja19sb2NrICovCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCV9faXNjc2lfcHV0X3Rhc2sodGFzayk7CisJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNDEwLDcgKzE0MjIsNyBAQAogICogQHRhc2s6IHRhc2sgdG8gcmVxdWV1ZQogICoKICAqIExMRHMgdGhhdCBuZWVkIHRvIHJ1biBhIHRhc2sgZnJvbSB0aGUgc2Vzc2lvbiB3b3JrcXVldWUgc2hvdWxkIGNhbGwKLSAqIHRoaXMuIFRoZSBzZXNzaW9uIGxvY2sgbXVzdCBiZSBoZWxkLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICogdGhpcy4gVGhlIHNlc3Npb24gZnJ3ZF9sb2NrIG11c3QgYmUgaGVsZC4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQKICAqIGJ5IHNvZnR3YXJlIGRyaXZlcnMuCiAgKi8KIHZvaWQgaXNjc2lfcmVxdWV1ZV90YXNrKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQpAQCAtMTQ0MSwxMCArMTQ1MywxMCBAQAogCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOwogCWludCByYyA9IDA7CiAKLQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAodGVzdF9iaXQoSVNDU0lfU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3R4KSkgewogCQlJU0NTSV9EQkdfU0VTU0lPTihjb25uLT5zZXNzaW9uLCAiVHggc3VzcGVuZGVkIVxuIik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybiAtRU5PREFUQTsKIAl9CiAKQEAgLTE0NjUsNyArMTQ3NywxMCBAQAogCQkJCQkgc3RydWN0IGlzY3NpX3Rhc2ssIHJ1bm5pbmcpOwogCQlsaXN0X2RlbF9pbml0KCZjb25uLT50YXNrLT5ydW5uaW5nKTsKIAkJaWYgKGlzY3NpX3ByZXBfbWdtdF90YXNrKGNvbm4sIGNvbm4tPnRhc2spKSB7CisJCQkvKiByZWd1bGFyIFJYIHBhdGggdXNlcyBiYWNrX2xvY2sgKi8KKwkJCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJCV9faXNjc2lfcHV0X3Rhc2soY29ubi0+dGFzayk7CisJCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJCWNvbm4tPnRhc2sgPSBOVUxMOwogCQkJY29udGludWU7CiAJCX0KQEAgLTE1MjcsMTEgKzE1NDIsMTEgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZjb25uLT5tZ210cXVldWUpKQogCQkJZ290byBjaGVja19tZ210OwogCX0KLQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmZyd2RfbG9jayk7CiAJcmV0dXJuIC1FTk9EQVRBOwogCiBkb25lOgotCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE2MDAsNyArMTYxNSw3IEBACiAKIAljbHNfc2Vzc2lvbiA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7CiAJc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJcmVhc29uID0gaXNjc2lfc2Vzc2lvbl9jaGtyZWFkeShjbHNfc2Vzc2lvbik7CiAJaWYgKHJlYXNvbikgewpAQCAtMTY4NiwxMyArMTcwMSwxMyBAQAogCX0KIAogCXNlc3Npb24tPnF1ZXVlZF9jbWRzbisrOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlyZXR1cm4gMDsKIAogcHJlcGRfcmVqZWN0OgogCWlzY3NpX2NvbXBsZXRlX3Rhc2sodGFzaywgSVNDU0lfVEFTS19SRVFVRVVFX1NDU0lRKTsKIHJlamVjdDoKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJSVNDU0lfREJHX1NFU1NJT04oc2Vzc2lvbiwgImNtZCAweCV4IHJlamVjdGVkICglZClcbiIsCiAJCQkgIHNjLT5jbW5kWzBdLCByZWFzb24pOwogCXJldHVybiBTQ1NJX01MUVVFVUVfVEFSR0VUX0JVU1k7CkBAIC0xNzAwLDcgKzE3MTUsNyBAQAogcHJlcGRfZmF1bHQ6CiAJaXNjc2lfY29tcGxldGVfdGFzayh0YXNrLCBJU0NTSV9UQVNLX1JFUVVFVUVfU0NTSVEpOwogZmF1bHQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCUlTQ1NJX0RCR19TRVNTSU9OKHNlc3Npb24sICJpc2NzaTogY21kIDB4JXggaXMgbm90IHF1ZXVlZCAoJWQpXG4iLAogCQkJICBzYy0+Y21uZFswXSwgcmVhc29uKTsKIAlpZiAoIXNjc2lfYmlkaV9jbW5kKHNjKSkKQEAgLTE3NDgsMTQgKzE3NjMsMTQgQEAKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IChzdHJ1Y3QgaXNjc2lfY29ubiAqKWRhdGE7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCi0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKGNvbm4tPnRtZl9zdGF0ZSA9PSBUTUZfUVVFVUVEKSB7CiAJCWNvbm4tPnRtZl9zdGF0ZSA9IFRNRl9USU1FRE9VVDsKIAkJSVNDU0lfREJHX0VIKHNlc3Npb24sICJ0bWYgdGltZWRvdXRcbiIpOwogCQkvKiB1bmJsb2NrIGVoX2Fib3J0KCkgKi8KIAkJd2FrZV91cCgmY29ubi0+ZWh3YWl0KTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogfQogCiBzdGF0aWMgaW50IGlzY3NpX2V4ZWNfdGFza19tZ210X2ZuKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLApAQCAtMTc2OCwxMCArMTc4MywxMCBAQAogCXRhc2sgPSBfX2lzY3NpX2Nvbm5fc2VuZF9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKiloZHIsCiAJCQkJICAgICAgTlVMTCwgMCk7CiAJaWYgKCF0YXNrKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLCAiQ291bGQgbm90IHNlbmQgVE1GLlxuIik7CiAJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwotCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCWNvbm4tPnRtZmNtZF9wZHVzX2NudCsrOwpAQCAtMTc4MSw3ICsxNzk2LDcgQEAKIAlhZGRfdGltZXIoJmNvbm4tPnRtZl90aW1lcik7CiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJ0bWYgc2V0IHRpbWVvdXRcbiIpOwogCi0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCiAJLyoKQEAgLTE4MDAsNyArMTgxNSw3IEBACiAJZGVsX3RpbWVyX3N5bmMoJmNvbm4tPnRtZl90aW1lcik7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7Ci0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJLyogaWYgdGhlIHNlc3Npb24gZHJvcHMgaXQgd2lsbCBjbGVhbiB1cCB0aGUgdGFzayAqLwogCWlmIChhZ2UgIT0gc2Vzc2lvbi0+YWdlIHx8CiAJICAgIHNlc3Npb24tPnN0YXRlICE9IElTQ1NJX1NUQVRFX0xPR0dFRF9JTikKQEAgLTE4MzcsNyArMTg1Miw3IEBACiAgKiBpc2NzaV9zdXNwZW5kX3F1ZXVlIC0gc3VzcGVuZCBpc2NzaV9xdWV1ZWNvbW1hbmQKICAqIEBjb25uOiBpc2NzaSBjb25uIHRvIHN0b3AgcXVldWVpbmcgSU8gb24KICAqCi0gKiBUaGlzIGdyYWJzIHRoZSBzZXNzaW9uIGxvY2sgdG8gbWFrZSBzdXJlIG5vIG9uZSBpcyBpbgorICogVGhpcyBncmFicyB0aGUgc2Vzc2lvbiBmcndkX2xvY2sgdG8gbWFrZSBzdXJlIG5vIG9uZSBpcyBpbgogICogeG1pdF90YXNrL3F1ZXVlY29tbWFuZCwgYW5kIHRoZW4gc2V0cyBzdXNwZW5kIHRvIHByZXZlbnQKICAqIG5ldyBjb21tYW5kcyBmcm9tIGJlaW5nIHF1ZXVlZC4gVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZAogICogYnkgb2ZmbG9hZCBkcml2ZXJzIHRoYXQgbmVlZCB0byBzeW5jIGEgcGF0aCBsaWtlIGVwIGRpc2Nvbm5lY3QKQEAgLTE4NDYsOSArMTg2MSw5IEBACiAgKi8KIHZvaWQgaXNjc2lfc3VzcGVuZF9xdWV1ZShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKIHsKLQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlzZXRfYml0KElTQ1NJX1NVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF90eCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5mcndkX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfc3VzcGVuZF9xdWV1ZSk7CiAKQEAgLTE5MDcsNyArMTkyMiw3IEBACiAKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInNjc2kgY21kICVwIHRpbWVkb3V0XG4iLCBzYyk7CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAl0YXNrID0gKHN0cnVjdCBpc2NzaV90YXNrICopc2MtPlNDcC5wdHI7CiAJaWYgKCF0YXNrKSB7CiAJCS8qCkBAIC0yMDIxLDcgKzIwMzYsNyBAQAogZG9uZToKIAlpZiAodGFzaykKIAkJdGFzay0+bGFzdF90aW1lb3V0ID0gamlmZmllczsKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJyZXR1cm4gJXNcbiIsIHJjID09IEJMS19FSF9SRVNFVF9USU1FUiA/CiAJCSAgICAgInRpbWVyIHJlc2V0IiA6ICJuaCIpOwogCXJldHVybiByYzsKQEAgLTIwMzMsNyArMjA0OCw3IEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCXVuc2lnbmVkIGxvbmcgcmVjdl90aW1lb3V0LCBuZXh0X3RpbWVvdXQgPSAwLCBsYXN0X3JlY3Y7CiAKLQlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9jaygmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKQogCQlnb3RvIGRvbmU7CiAKQEAgLTIwNTAsNyArMjA2NSw3IEBACiAJCQkJICAibGFzdCBwaW5nICVsdSwgbm93ICVsdVxuIiwKIAkJCQkgIGNvbm4tPnBpbmdfdGltZW91dCwgY29ubi0+cmVjdl90aW1lb3V0LAogCQkJCSAgbGFzdF9yZWN2LCBjb25uLT5sYXN0X3BpbmcsIGppZmZpZXMpOwotCQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIwNjYsNyArMjA4MSw3IEBACiAJSVNDU0lfREJHX0NPTk4oY29ubiwgIlNldHRpbmcgbmV4dCB0bW8gJWx1XG4iLCBuZXh0X3RpbWVvdXQpOwogCW1vZF90aW1lcigmY29ubi0+dHJhbnNwb3J0X3RpbWVyLCBuZXh0X3RpbWVvdXQpOwogZG9uZToKLQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNlc3Npb24tPmZyd2RfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzY3NpX3ByZXBfYWJvcnRfdGFza19wZHUoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssCkBAIC0yMDk2LDcgKzIxMTEsNyBAQAogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAiYWJvcnRpbmcgc2MgJXBcbiIsIHNjKTsKIAogCW11dGV4X2xvY2soJnNlc3Npb24tPmVoX211dGV4KTsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkvKgogCSAqIGlmIHNlc3Npb24gd2FzIElTQ1NJX1NUQVRFX0lOX1JFQ09WRVJZIHRoZW4gd2UgbWF5IG5vdCBoYXZlCiAJICogZ290IHRoZSBjb21tYW5kLgpAQCAtMjEwNCw3ICsyMTE5LDcgQEAKIAlpZiAoIXNjLT5TQ3AucHRyKSB7CiAJCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAic2MgbmV2ZXIgcmVhY2hlZCBpc2NzaSBsYXllciBvciAiCiAJCQkJICAgICAgIml0IGNvbXBsZXRlZC5cbiIpOwotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIAkJcmV0dXJuIFNVQ0NFU1M7CiAJfQpAQCAtMjExNSw3ICsyMTMwLDcgQEAKIAkgKi8KIAlpZiAoIXNlc3Npb24tPmxlYWRjb25uIHx8IHNlc3Npb24tPnN0YXRlICE9IElTQ1NJX1NUQVRFX0xPR0dFRF9JTiB8fAogCSAgICBzYy0+U0NwLnBoYXNlICE9IHNlc3Npb24tPmFnZSkgewotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIAkJSVNDU0lfREJHX0VIKHNlc3Npb24sICJmYWlsaW5nIGFib3J0IGR1ZSB0byBkcm9wcGVkICIKIAkJCQkgICJzZXNzaW9uLlxuIik7CkBAIC0yMTU2LDcgKzIxNzEsNyBAQAogCiAJc3dpdGNoIChjb25uLT50bWZfc3RhdGUpIHsKIAljYXNlIFRNRl9TVUNDRVNTOgotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQkvKgogCQkgKiBzdG9wIHR4IHNpZGUgaW5jYXNlIHRoZSB0YXJnZXQgaGFkIHNlbnQgYSBhYm9ydCByc3AgYnV0CiAJCSAqIHRoZSBpbml0aWF0b3Igd2FzIHN0aWxsIHdyaXRpbmcgb3V0IGRhdGEuCkBAIC0yMTY3LDE1ICsyMTgyLDE1IEBACiAJCSAqIGdvb2QgYW5kIGhhdmUgbmV2ZXIgc2VudCB1cyBhIHN1Y2Nlc3NmdWwgdG1mIHJlc3BvbnNlCiAJCSAqIHRoZW4gc2VudCBtb3JlIGRhdGEgZm9yIHRoZSBjbWQuCiAJCSAqLwotCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWZhaWxfc2NzaV90YXNrKHRhc2ssIERJRF9BQk9SVCk7CiAJCWNvbm4tPnRtZl9zdGF0ZSA9IFRNRl9JTklUSUFMOwogCQltZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOwotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlpc2NzaV9zdGFydF90eChjb25uKTsKIAkJZ290byBzdWNjZXNzX3VubG9ja2VkOwogCWNhc2UgVE1GX1RJTUVET1VUOgotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgSVNDU0lfRVJSX1NDU0lfRUhfU0VTU0lPTl9SU1QpOwogCQlnb3RvIGZhaWxlZF91bmxvY2tlZDsKIAljYXNlIFRNRl9OT1RfRk9VTkQ6CkBAIC0yMTk0LDcgKzIyMDksNyBAQAogCX0KIAogc3VjY2VzczoKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiBzdWNjZXNzX3VubG9ja2VkOgogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAiYWJvcnQgc3VjY2VzcyBbc2MgJXAgaXR0IDB4JXhdXG4iLAogCQkgICAgIHNjLCB0YXNrLT5pdHQpOwpAQCAtMjIwMiw3ICsyMjE3LDcgQEAKIAlyZXR1cm4gU1VDQ0VTUzsKIAogZmFpbGVkOgotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIGZhaWxlZF91bmxvY2tlZDoKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgImFib3J0IGZhaWxlZCBbc2MgJXAgaXR0IDB4JXhdXG4iLCBzYywKIAkJICAgICB0YXNrID8gdGFzay0+aXR0IDogMCk7CkBAIC0yMjM1LDcgKzIyNTAsNyBAQAogCUlTQ1NJX0RCR19FSChzZXNzaW9uLCAiTFUgUmVzZXQgW3NjICVwIGx1biAldV1cbiIsIHNjLCBzYy0+ZGV2aWNlLT5sdW4pOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCS8qCiAJICogSnVzdCBjaGVjayBpZiB3ZSBhcmUgbm90IGxvZ2dlZCBpbi4gV2UgY2Fubm90IGNoZWNrIGZvcgogCSAqIHRoZSBwaGFzZSBiZWNhdXNlIHRoZSByZXNldCBjb3VsZCBjb21lIGZyb20gYSBpb2N0bC4KQEAgLTIyNjIsNyArMjI3Nyw3IEBACiAJY2FzZSBUTUZfU1VDQ0VTUzoKIAkJYnJlYWs7CiAJY2FzZSBUTUZfVElNRURPVVQ6Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfU0NTSV9FSF9TRVNTSU9OX1JTVCk7CiAJCWdvdG8gZG9uZTsKIAlkZWZhdWx0OgpAQCAtMjI3MSwyMSArMjI4NiwyMSBAQAogCX0KIAogCXJjID0gU1VDQ0VTUzsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlpc2NzaV9zdXNwZW5kX3R4KGNvbm4pOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKIAlmYWlsX3Njc2lfdGFza3MoY29ubiwgc2MtPmRldmljZS0+bHVuLCBESURfRVJST1IpOwogCWNvbm4tPnRtZl9zdGF0ZSA9IFRNRl9JTklUSUFMOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWlzY3NpX3N0YXJ0X3R4KGNvbm4pOwogCWdvdG8gZG9uZTsKIAogdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIGRvbmU6CiAJSVNDU0lfREJHX0VIKHNlc3Npb24sICJkZXYgcmVzZXQgcmVzdWx0ID0gJXNcbiIsCiAJCSAgICAgcmMgPT0gU1VDQ0VTUyA/ICJTVUNDRVNTIiA6ICJGQUlMRUQiKTsKQEAgLTIyOTgsMTMgKzIzMTMsMTMgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKHNlc3Npb24tPnN0YXRlICE9IElTQ1NJX1NUQVRFX0xPR0dFRF9JTikgewogCQlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NUQVRFX1JFQ09WRVJZX0ZBSUxFRDsKIAkJaWYgKHNlc3Npb24tPmxlYWRjb25uKQogCQkJd2FrZV91cCgmc2Vzc2lvbi0+bGVhZGNvbm4tPmVod2FpdCk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3Nlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQpOwogCkBAIC0yMzI2LDE5ICsyMzQxLDE5IEBACiAJY29ubiA9IHNlc3Npb24tPmxlYWRjb25uOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9URVJNSU5BVEUpIHsKIGZhaWxlZDoKIAkJSVNDU0lfREJHX0VIKHNlc3Npb24sCiAJCQkgICAgICJmYWlsaW5nIHNlc3Npb24gcmVzZXQ6IENvdWxkIG5vdCBsb2cgYmFjayBpbnRvICIKIAkJCSAgICAgIiVzLCAlcyBbYWdlICVkXVxuIiwgc2Vzc2lvbi0+dGFyZ2V0bmFtZSwKIAkJCSAgICAgY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzLCBzZXNzaW9uLT5hZ2UpOwotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCQltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiAJLyoKIAkgKiB3ZSBkcm9wIHRoZSBsb2NrIGhlcmUgYnV0IHRoZSBsZWFkY29ubiBjYW5ub3QgYmUgZGVzdG95ZWQgd2hpbGUKQEAgLTIzNTUsMTQgKzIzNzAsMTQgQEAKIAkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKIAogCW11dGV4X2xvY2soJnNlc3Npb24tPmVoX211dGV4KTsKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7CiAJCUlTQ1NJX0RCR19FSChzZXNzaW9uLAogCQkJICAgICAic2Vzc2lvbiByZXNldCBzdWNjZWVkZWQgZm9yICVzLCVzXG4iLAogCQkJICAgICBzZXNzaW9uLT50YXJnZXRuYW1lLCBjb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MpOwogCX0gZWxzZQogCQlnb3RvIGZhaWxlZDsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiAJcmV0dXJuIFNVQ0NFU1M7CiB9CkBAIC0yMzk4LDcgKzI0MTMsNyBAQAogCQkgICAgIHNlc3Npb24tPnRhcmdldG5hbWUpOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCS8qCiAJICogSnVzdCBjaGVjayBpZiB3ZSBhcmUgbm90IGxvZ2dlZCBpbi4gV2UgY2Fubm90IGNoZWNrIGZvcgogCSAqIHRoZSBwaGFzZSBiZWNhdXNlIHRoZSByZXNldCBjb3VsZCBjb21lIGZyb20gYSBpb2N0bC4KQEAgLTI0MjUsNyArMjQ0MCw3IEBACiAJY2FzZSBUTUZfU1VDQ0VTUzoKIAkJYnJlYWs7CiAJY2FzZSBUTUZfVElNRURPVVQ6Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfU0NTSV9FSF9TRVNTSU9OX1JTVCk7CiAJCWdvdG8gZG9uZTsKIAlkZWZhdWx0OgpAQCAtMjQzNCwyMSArMjQ0OSwyMSBAQAogCX0KIAogCXJjID0gU1VDQ0VTUzsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlpc2NzaV9zdXNwZW5kX3R4KGNvbm4pOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKIAlmYWlsX3Njc2lfdGFza3MoY29ubiwgLTEsIERJRF9FUlJPUik7CiAJY29ubi0+dG1mX3N0YXRlID0gVE1GX0lOSVRJQUw7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJaXNjc2lfc3RhcnRfdHgoY29ubik7CiAJZ290byBkb25lOwogCiB1bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogZG9uZToKIAlJU0NTSV9EQkdfRUgoc2Vzc2lvbiwgInRndCAlcyByZXNldCByZXN1bHQgPSAlc1xuIiwgc2Vzc2lvbi0+dGFyZ2V0bmFtZSwKIAkJICAgICByYyA9PSBTVUNDRVNTID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpOwpAQCAtMjc0Niw4ICsyNzYxLDEwIEBACiAJc2Vzc2lvbi0+bWF4X3IydCA9IDE7CiAJc2Vzc2lvbi0+dHQgPSBpc2NzaXQ7CiAJc2Vzc2lvbi0+ZGRfZGF0YSA9IGNsc19zZXNzaW9uLT5kZF9kYXRhICsgc2l6ZW9mKCpzZXNzaW9uKTsKKwogCW11dGV4X2luaXQoJnNlc3Npb24tPmVoX211dGV4KTsKLQlzcGluX2xvY2tfaW5pdCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnNlc3Npb24tPmZyd2RfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAKIAkvKiBpbml0aWFsaXplIFNDU0kgUERVIGNvbW1hbmRzIHBvb2wgKi8KIAlpZiAoaXNjc2lfcG9vbF9pbml0KCZzZXNzaW9uLT5jbWRwb29sLCBzZXNzaW9uLT5jbWRzX21heCwKQEAgLTI4NjEsMTQgKzI4NzgsMTQgQEAKIAlJTklUX1dPUksoJmNvbm4tPnhtaXR3b3JrLCBpc2NzaV94bWl0d29ya2VyKTsKIAogCS8qIGFsbG9jYXRlIGxvZ2luX3Rhc2sgdXNlZCBmb3IgdGhlIGxvZ2luL3RleHQgc2VxdWVuY2VzICovCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKCFrZmlmb19vdXQoJnNlc3Npb24tPmNtZHBvb2wucXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZjb25uLT5sb2dpbl90YXNrLAogCQkJIHNpemVvZih2b2lkKikpKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCWdvdG8gbG9naW5fdGFza19hbGxvY19mYWlsOwogCX0KLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAlkYXRhID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAogCQkJCQkgZ2V0X29yZGVyKElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOKSk7CkBAIC0yOTA1LDcgKzI5MjIsNyBAQAogCiAJZGVsX3RpbWVyX3N5bmMoJmNvbm4tPnRyYW5zcG9ydF90aW1lcik7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAljb25uLT5jX3N0YWdlID0gSVNDU0lfQ09OTl9DTEVBTlVQX1dBSVQ7CiAJaWYgKHNlc3Npb24tPmxlYWRjb25uID09IGNvbm4pIHsKIAkJLyoKQEAgLTI5MTQsNyArMjkzMSw3IEBACiAJCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU1RBVEVfVEVSTUlOQVRFOwogCQl3YWtlX3VwKCZjb25uLT5laHdhaXQpOwogCX0KLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAkvKgogCSAqIEJsb2NrIHVudGlsIGFsbCBpbi1wcm9ncmVzcyBjb21tYW5kcyBmb3IgdGhpcyBjb25uZWN0aW9uCkBAIC0yOTQxLDE2ICsyOTU4LDE5IEBACiAJLyogZmx1c2ggcXVldWVkIHVwIHdvcmsgYmVjYXVzZSB3ZSBmcmVlIHRoZSBjb25uZWN0aW9uIGJlbG93ICovCiAJaXNjc2lfc3VzcGVuZF90eChjb25uKTsKIAotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGNvbm4tPmRhdGEsCiAJCSAgIGdldF9vcmRlcihJU0NTSV9ERUZfTUFYX1JFQ1ZfU0VHX0xFTikpOwogCWtmcmVlKGNvbm4tPnBlcnNpc3RlbnRfYWRkcmVzcyk7CiAJa2ZyZWUoY29ubi0+bG9jYWxfaXBhZGRyKTsKKwkvKiByZWd1bGFyIFJYIHBhdGggdXNlcyBiYWNrX2xvY2sgKi8KKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiAJa2ZpZm9faW4oJnNlc3Npb24tPmNtZHBvb2wucXVldWUsICh2b2lkKikmY29ubi0+bG9naW5fdGFzaywKIAkJICAgIHNpemVvZih2b2lkKikpOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwogCWlmIChzZXNzaW9uLT5sZWFkY29ubiA9PSBjb25uKQogCQlzZXNzaW9uLT5sZWFkY29ubiA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCiAJaXNjc2lfZGVzdHJveV9jb25uKGNsc19jb25uKTsKIH0KQEAgLTI5ODcsNyArMzAwNyw3IEBACiAJCWNvbm4tPnBpbmdfdGltZW91dCA9IDU7CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJY29ubi0+Y19zdGFnZSA9IElTQ1NJX0NPTk5fU1RBUlRFRDsKIAlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NUQVRFX0xPR0dFRF9JTjsKIAlzZXNzaW9uLT5xdWV1ZWRfY21kc24gPSBzZXNzaW9uLT5jbWRzbjsKQEAgLTMwMTYsNyArMzAzNiw3IEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihzZXNzaW9uLT5jbHNfc2Vzc2lvbik7CiAJd2FrZV91cCgmY29ubi0+ZWh3YWl0KTsKQEAgLTMwNTUsOSArMzA3NSw5IEBACiAJaW50IG9sZF9zdG9wX3N0YWdlOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwotCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCWlmIChjb25uLT5zdG9wX3N0YWdlID09IFNUT1BfQ09OTl9URVJNKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogCQlyZXR1cm47CiAJfQpAQCAtMzA3NCwxNCArMzA5NCwxNCBAQAogCiAJb2xkX3N0b3Bfc3RhZ2UgPSBjb25uLT5zdG9wX3N0YWdlOwogCWNvbm4tPnN0b3Bfc3RhZ2UgPSBmbGFnOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCWRlbF90aW1lcl9zeW5jKCZjb25uLT50cmFuc3BvcnRfdGltZXIpOwogCWlzY3NpX3N1c3BlbmRfdHgoY29ubik7CiAKLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAljb25uLT5jX3N0YWdlID0gSVNDU0lfQ09OTl9TVE9QUEVEOwotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAogCS8qCiAJICogZm9yIGNvbm5lY3Rpb24gbGV2ZWwgcmVjb3Zlcnkgd2Ugc2hvdWxkIG5vdCBjYWxjdWxhdGUKQEAgLTMxMDIsMTEgKzMxMjIsMTEgQEAKIAkvKgogCSAqIGZsdXNoIHF1ZXVlcy4KIAkgKi8KLQlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAlmYWlsX3Njc2lfdGFza3MoY29ubiwgLTEsIERJRF9UUkFOU1BPUlRfRElTUlVQVEVEKTsKIAlmYWlsX21nbXRfdGFza3Moc2Vzc2lvbiwgY29ubik7CiAJbWVtc2V0KCZjb25uLT50bWhkciwgMCwgc2l6ZW9mKGNvbm4tPnRtaGRyKSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5mcndkX2xvY2spOwogCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+ZWhfbXV0ZXgpOwogfQogCkBAIC0zMTMzLDEwICszMTUzLDEwIEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwogCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAJaWYgKGlzX2xlYWRpbmcpCiAJCXNlc3Npb24tPmxlYWRjb25uID0gY29ubjsKLQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmZyd2RfbG9jayk7CiAKIAkvKgogCSAqIFVuYmxvY2sgeG1pdHdvcmtlcigpLCBMb2dpbiBQaGFzZSB3aWxsIHBhc3MgdGhyb3VnaC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYwppbmRleCAxZDU4ZDUzLi42MGNiNmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCkBAIC00NDYsNyArNDQ2LDcgQEAKICAqIGlzY3NpX3RjcF9jbGVhbnVwX3Rhc2sgLSBmcmVlIHRjcF90YXNrIHJlc291cmNlcwogICogQHRhc2s6IGlzY3NpIHRhc2sKICAqCi0gKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gbG9jaworICogbXVzdCBiZSBjYWxsZWQgd2l0aCBzZXNzaW9uIGJhY2tfbG9jawogICovCiB2b2lkIGlzY3NpX3RjcF9jbGVhbnVwX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCiB7CkBAIC00NTcsNiArNDU3LDcgQEAKIAlpZiAoIXRhc2stPnNjKQogCQlyZXR1cm47CiAKKwlzcGluX2xvY2tfYmgoJnRjcF90YXNrLT5xdWV1ZTJwb29sKTsKIAkvKiBmbHVzaCB0YXNrJ3MgcjJ0IHF1ZXVlcyAqLwogCXdoaWxlIChrZmlmb19vdXQoJnRjcF90YXNrLT5yMnRxdWV1ZSwgKHZvaWQqKSZyMnQsIHNpemVvZih2b2lkKikpKSB7CiAJCWtmaWZvX2luKCZ0Y3BfdGFzay0+cjJ0cG9vbC5xdWV1ZSwgKHZvaWQqKSZyMnQsCkBAIC00NzAsNiArNDcxLDcgQEAKIAkJCSAgICBzaXplb2Yodm9pZCopKTsKIAkJdGNwX3Rhc2stPnIydCA9IE5VTEw7CiAJfQorCXNwaW5fdW5sb2NrX2JoKCZ0Y3BfdGFzay0+cXVldWUycG9vbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90Y3BfY2xlYW51cF90YXNrKTsKIApAQCAtNTI5LDYgKzUzMSw4IEBACiAJc3RydWN0IGlzY3NpX3IydF9yc3AgKnJoZHIgPSAoc3RydWN0IGlzY3NpX3IydF9yc3AgKil0Y3BfY29ubi0+aW4uaGRyOwogCXN0cnVjdCBpc2NzaV9yMnRfaW5mbyAqcjJ0OwogCWludCByMnRzbiA9IGJlMzJfdG9fY3B1KHJoZHItPnIydHNuKTsKKwl1MzIgZGF0YV9sZW5ndGg7CisJdTMyIGRhdGFfb2Zmc2V0OwogCWludCByYzsKIAogCWlmICh0Y3BfY29ubi0+aW4uZGF0YWxlbikgewpAQCAtNTU0LDM5ICs1NTgsNDAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmMgPSBrZmlmb19vdXQoJnRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwgc2l6ZW9mKHZvaWQqKSk7CisJZGF0YV9sZW5ndGggPSBiZTMyX3RvX2NwdShyaGRyLT5kYXRhX2xlbmd0aCk7CisJaWYgKGRhdGFfbGVuZ3RoID09IDApIHsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiaW52YWxpZCBSMlQgd2l0aCB6ZXJvIGRhdGEgbGVuXG4iKTsKKwkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOworCX0KKworCWlmIChkYXRhX2xlbmd0aCA+IHNlc3Npb24tPm1heF9idXJzdCkKKwkJSVNDU0lfREJHX1RDUChjb25uLCAiaW52YWxpZCBSMlQgd2l0aCBkYXRhIGxlbiAldSBhbmQgbWF4ICIKKwkJCSAgICAgICJidXJzdCAldS4gQXR0ZW1wdGluZyB0byBleGVjdXRlIHJlcXVlc3QuXG4iLAorCQkJICAgICAgZGF0YV9sZW5ndGgsIHNlc3Npb24tPm1heF9idXJzdCk7CisKKwlkYXRhX29mZnNldCA9IGJlMzJfdG9fY3B1KHJoZHItPmRhdGFfb2Zmc2V0KTsKKwlpZiAoZGF0YV9vZmZzZXQgKyBkYXRhX2xlbmd0aCA+IHNjc2lfb3V0KHRhc2stPnNjKS0+bGVuZ3RoKSB7CisJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAorCQkJCSAgImludmFsaWQgUjJUIHdpdGggZGF0YSBsZW4gJXUgYXQgb2Zmc2V0ICV1ICIKKwkJCQkgICJhbmQgdG90YWwgbGVuZ3RoICVkXG4iLCBkYXRhX2xlbmd0aCwKKwkJCQkgIGRhdGFfb2Zmc2V0LCBzY3NpX291dCh0YXNrLT5zYyktPmxlbmd0aCk7CisJCXJldHVybiBJU0NTSV9FUlJfREFUQUxFTjsKKwl9CisKKwlzcGluX2xvY2soJnRjcF90YXNrLT5wb29sMnF1ZXVlKTsKKwlyYyA9IGtmaWZvX291dCgmdGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkICopJnIydCwgc2l6ZW9mKHZvaWQgKikpOwogCWlmICghcmMpIHsKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJDb3VsZCBub3QgYWxsb2NhdGUgUjJULiAiCiAJCQkJICAiVGFyZ2V0IGhhcyBzZW50IG1vcmUgUjJUcyB0aGFuIGl0ICIKIAkJCQkgICJuZWdvdGlhdGVkIGZvciBvciBkcml2ZXIgaGFzIGxlYWtlZC5cbiIpOworCQlzcGluX3VubG9jaygmdGNwX3Rhc2stPnBvb2wycXVldWUpOwogCQlyZXR1cm4gSVNDU0lfRVJSX1BST1RPOwogCX0KIAogCXIydC0+ZXhwX3N0YXRzbiA9IHJoZHItPnN0YXRzbjsKLQlyMnQtPmRhdGFfbGVuZ3RoID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9sZW5ndGgpOwotCWlmIChyMnQtPmRhdGFfbGVuZ3RoID09IDApIHsKLQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCi0JCQkJICAiaW52YWxpZCBSMlQgd2l0aCB6ZXJvIGRhdGEgbGVuXG4iKTsKLQkJa2ZpZm9faW4oJnRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwKLQkJCSAgICBzaXplb2Yodm9pZCopKTsKLQkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOwotCX0KLQotCWlmIChyMnQtPmRhdGFfbGVuZ3RoID4gc2Vzc2lvbi0+bWF4X2J1cnN0KQotCQlJU0NTSV9EQkdfVENQKGNvbm4sICJpbnZhbGlkIFIyVCB3aXRoIGRhdGEgbGVuICV1IGFuZCBtYXggIgotCQkJICAgICAgImJ1cnN0ICV1LiBBdHRlbXB0aW5nIHRvIGV4ZWN1dGUgcmVxdWVzdC5cbiIsCi0JCQkgICAgICByMnQtPmRhdGFfbGVuZ3RoLCBzZXNzaW9uLT5tYXhfYnVyc3QpOwotCi0JcjJ0LT5kYXRhX29mZnNldCA9IGJlMzJfdG9fY3B1KHJoZHItPmRhdGFfb2Zmc2V0KTsKLQlpZiAocjJ0LT5kYXRhX29mZnNldCArIHIydC0+ZGF0YV9sZW5ndGggPiBzY3NpX291dCh0YXNrLT5zYyktPmxlbmd0aCkgewotCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKLQkJCQkgICJpbnZhbGlkIFIyVCB3aXRoIGRhdGEgbGVuICV1IGF0IG9mZnNldCAldSAiCi0JCQkJICAiYW5kIHRvdGFsIGxlbmd0aCAlZFxuIiwgcjJ0LT5kYXRhX2xlbmd0aCwKLQkJCQkgIHIydC0+ZGF0YV9vZmZzZXQsIHNjc2lfb3V0KHRhc2stPnNjKS0+bGVuZ3RoKTsKLQkJa2ZpZm9faW4oJnRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwKLQkJCSAgICBzaXplb2Yodm9pZCopKTsKLQkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOwotCX0KKwlyMnQtPmRhdGFfbGVuZ3RoID0gZGF0YV9sZW5ndGg7CisJcjJ0LT5kYXRhX29mZnNldCA9IGRhdGFfb2Zmc2V0OwogCiAJcjJ0LT50dHQgPSByaGRyLT50dHQ7IC8qIG5vIGZsaXAgKi8KIAlyMnQtPmRhdGFzbiA9IDA7CkBAIC01OTUsNiArNjAwLDcgQEAKIAl0Y3BfdGFzay0+ZXhwX2RhdGFzbiA9IHIydHNuICsgMTsKIAlrZmlmb19pbigmdGNwX3Rhc2stPnIydHF1ZXVlLCAodm9pZCopJnIydCwgc2l6ZW9mKHZvaWQqKSk7CiAJY29ubi0+cjJ0X3BkdXNfY250Kys7CisJc3Bpbl91bmxvY2soJnRjcF90YXNrLT5wb29sMnF1ZXVlKTsKIAogCWlzY3NpX3JlcXVldWVfdGFzayh0YXNrKTsKIAlyZXR1cm4gMDsKQEAgLTY2NywxNCArNjczLDE0IEBACiAKIAlzd2l0Y2gob3Bjb2RlKSB7CiAJY2FzZSBJU0NTSV9PUF9TQ1NJX0RBVEFfSU46Ci0JCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJdGFzayA9IGlzY3NpX2l0dF90b19jdGFzayhjb25uLCBoZHItPml0dCk7CiAJCWlmICghdGFzaykKIAkJCXJjID0gSVNDU0lfRVJSX0JBRF9JVFQ7CiAJCWVsc2UKIAkJCXJjID0gaXNjc2lfdGNwX2RhdGFfaW4oY29ubiwgdGFzayk7CiAJCWlmIChyYykgewotCQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJCQlicmVhazsKIAkJfQogCkBAIC03MDcsMTEgKzcxMywxMSBAQAogCQkJCQkJICAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sCiAJCQkJCQkgICBpc2NzaV90Y3BfcHJvY2Vzc19kYXRhX2luLAogCQkJCQkJICAgcnhfaGFzaCk7Ci0JCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJCXJldHVybiByYzsKIAkJfQogCQlyYyA9IF9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIGhkciwgTlVMTCwgMCk7Ci0JCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfU0NTSV9DTURfUlNQOgogCQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pIHsKQEAgLTcyMSwxOCArNzI3LDIwIEBACiAJCXJjID0gaXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIGhkciwgTlVMTCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfT1BfUjJUOgotCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJCXRhc2sgPSBpc2NzaV9pdHRfdG9fY3Rhc2soY29ubiwgaGRyLT5pdHQpOworCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+YmFja19sb2NrKTsKIAkJaWYgKCF0YXNrKQogCQkJcmMgPSBJU0NTSV9FUlJfQkFEX0lUVDsKIAkJZWxzZSBpZiAoYWhzbGVuKQogCQkJcmMgPSBJU0NTSV9FUlJfQUhTTEVOOwogCQllbHNlIGlmICh0YXNrLT5zYy0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewogCQkJdGFzay0+bGFzdF94ZmVyID0gamlmZmllczsKKwkJCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJCXJjID0gaXNjc2lfdGNwX3IydF9yc3AoY29ubiwgdGFzayk7CisJCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+ZnJ3ZF9sb2NrKTsKIAkJfSBlbHNlCiAJCQlyYyA9IElTQ1NJX0VSUl9QUk9UTzsKLQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOwogCQlicmVhazsKIAljYXNlIElTQ1NJX09QX0xPR0lOX1JTUDoKIAljYXNlIElTQ1NJX09QX1RFWFRfUlNQOgpAQCAtOTgwLDE0ICs5ODgsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBpc2NzaV9yMnRfaW5mbyAqaXNjc2lfdGNwX2dldF9jdXJyX3IydChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKIHsKLQlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IHRhc2stPmNvbm4tPnNlc3Npb247CiAJc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQgPSBOVUxMOwogCiAJaWYgKGlzY3NpX3Rhc2tfaGFzX3Vuc29sX2RhdGEodGFzaykpCiAJCXIydCA9ICZ0YXNrLT51bnNvbF9yMnQ7CiAJZWxzZSB7Ci0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmdGNwX3Rhc2stPnF1ZXVlMnBvb2wpOwogCQlpZiAodGNwX3Rhc2stPnIydCkgewogCQkJcjJ0ID0gdGNwX3Rhc2stPnIydDsKIAkJCS8qIENvbnRpbnVlIHdpdGggdGhpcyBSMlQ/ICovCkBAIC0xMDA5LDcgKzEwMTYsNyBAQAogCQkJZWxzZQogCQkJCXIydCA9IHRjcF90YXNrLT5yMnQ7CiAJCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmdGNwX3Rhc2stPnF1ZXVlMnBvb2wpOwogCX0KIAogCXJldHVybiByMnQ7CkBAIC0xMTM5LDYgKzExNDYsOCBAQAogCQkJaXNjc2lfcG9vbF9mcmVlKCZ0Y3BfdGFzay0+cjJ0cG9vbCk7CiAJCQlnb3RvIHIydF9hbGxvY19mYWlsOwogCQl9CisJCXNwaW5fbG9ja19pbml0KCZ0Y3BfdGFzay0+cG9vbDJxdWV1ZSk7CisJCXNwaW5fbG9ja19pbml0KCZ0Y3BfdGFzay0+cXVldWUycG9vbCk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19hdGEuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCmluZGV4IGQyODk1ODMuLjc2NjA5OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCkBAIC03MDAsNDYgKzcwMCwyNiBAQAogCiB9CiAKLXN0YXRpYyBib29sIHNhc19hdGFfZmx1c2hfcG1fZWgoc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCwgY29uc3QgY2hhciAqZnVuYykKK3N0YXRpYyB2b2lkIHNhc19hdGFfZmx1c2hfcG1fZWgoc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCwgY29uc3QgY2hhciAqZnVuYykKIHsKIAlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCAqbjsKLQlib29sIHJldHJ5ID0gZmFsc2U7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCBuLCAmcG9ydC0+ZGV2X2xpc3QsIGRldl9saXN0X25vZGUpIHsKLQkJaW50IHJjOwotCiAJCWlmICghZGV2X2lzX3NhdGEoZGV2KSkKIAkJCWNvbnRpbnVlOwogCiAJCXNhc19hdGFfd2FpdF9laChkZXYpOwotCQlyYyA9IGRldi0+c2F0YV9kZXYucG1fcmVzdWx0OwotCQlpZiAocmMgPT0gLUVBR0FJTikKLQkJCXJldHJ5ID0gdHJ1ZTsKLQkJZWxzZSBpZiAocmMpIHsKLQkJCS8qIHNpbmNlIHdlIGRvbid0IGhhdmUgYQotCQkJICogLT5wb3J0X3tzdXNwZW5kfHJlc3VtZX0gcm91dGluZSBpbiBvdXIKLQkJCSAqICBhdGFfcG9ydCBvcHMsIGFuZCBubyBlbnRhbmdsZW1lbnRzIHdpdGgKLQkJCSAqICBhY3BpLCBzdXNwZW5kIHNob3VsZCBqdXN0IGJlIG1lY2hhbmljYWwgdHJpcAotCQkJICogIHRocm91Z2ggZWgsIGNhdGNoIGNhc2VzIHdoZXJlIHRoZXNlCi0JCQkgKiAgYXNzdW1wdGlvbnMgYXJlIGludmFsaWRhdGVkCi0JCQkgKi8KLQkJCVdBUk5fT05DRSgxLCAiZmFpbGVkICVzICVzIGVycm9yOiAlZFxuIiwgZnVuYywKLQkJCQkgZGV2X25hbWUoJmRldi0+cnBoeS0+ZGV2KSwgcmMpOwotCQl9CiAKIAkJLyogaWYgbGliYXRhIGZhaWxlZCB0byBwb3dlciBtYW5hZ2UgdGhlIGRldmljZSwgdGVhciBpdCBkb3duICovCiAJCWlmIChhdGFfZGV2X2Rpc2FibGVkKHNhc190b19hdGFfZGV2KGRldikpKQogCQkJc2FzX2ZhaWxfcHJvYmUoZGV2LCBmdW5jLCAtRU5PREVWKTsKIAl9Ci0KLQlyZXR1cm4gcmV0cnk7CiB9CiAKIHZvaWQgc2FzX3N1c3BlbmRfc2F0YShzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0KQogewogCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXY7CiAKLSByZXRyeToKIAltdXRleF9sb2NrKCZwb3J0LT5oYS0+ZGlzY29fbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcG9ydC0+ZGV2X2xpc3QsIGRldl9saXN0X25vZGUpIHsKIAkJc3RydWN0IHNhdGFfZGV2aWNlICpzYXRhOwpAQCAtNzUxLDIwICs3MzEsMTcgQEAKIAkJaWYgKHNhdGEtPmFwLT5wbV9tZXNnLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpCiAJCQljb250aW51ZTsKIAotCQlzYXRhLT5wbV9yZXN1bHQgPSAtRUlPOwotCQlhdGFfc2FzX3BvcnRfYXN5bmNfc3VzcGVuZChzYXRhLT5hcCwgJnNhdGEtPnBtX3Jlc3VsdCk7CisJCWF0YV9zYXNfcG9ydF9zdXNwZW5kKHNhdGEtPmFwKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZwb3J0LT5oYS0+ZGlzY29fbXV0ZXgpOwogCi0JaWYgKHNhc19hdGFfZmx1c2hfcG1fZWgocG9ydCwgX19mdW5jX18pKQotCQlnb3RvIHJldHJ5OworCXNhc19hdGFfZmx1c2hfcG1fZWgocG9ydCwgX19mdW5jX18pOwogfQogCiB2b2lkIHNhc19yZXN1bWVfc2F0YShzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0KQogewogCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXY7CiAKLSByZXRyeToKIAltdXRleF9sb2NrKCZwb3J0LT5oYS0+ZGlzY29fbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcG9ydC0+ZGV2X2xpc3QsIGRldl9saXN0X25vZGUpIHsKIAkJc3RydWN0IHNhdGFfZGV2aWNlICpzYXRhOwpAQCAtNzc2LDEzICs3NTMsMTEgQEAKIAkJaWYgKHNhdGEtPmFwLT5wbV9tZXNnLmV2ZW50ID09IFBNX0VWRU5UX09OKQogCQkJY29udGludWU7CiAKLQkJc2F0YS0+cG1fcmVzdWx0ID0gLUVJTzsKLQkJYXRhX3Nhc19wb3J0X2FzeW5jX3Jlc3VtZShzYXRhLT5hcCwgJnNhdGEtPnBtX3Jlc3VsdCk7CisJCWF0YV9zYXNfcG9ydF9yZXN1bWUoc2F0YS0+YXApOwogCX0KIAltdXRleF91bmxvY2soJnBvcnQtPmhhLT5kaXNjb19tdXRleCk7CiAKLQlpZiAoc2FzX2F0YV9mbHVzaF9wbV9laChwb3J0LCBfX2Z1bmNfXykpCi0JCWdvdG8gcmV0cnk7CisJc2FzX2F0YV9mbHVzaF9wbV9laChwb3J0LCBfX2Z1bmNfXyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwppbmRleCBkYTNhZWUxLi4yNWQwZjEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKQEAgLTg2Miw3ICs4NjIsNyBAQAogCiBlbnVtIGJsa19laF90aW1lcl9yZXR1cm4gc2FzX3Njc2lfdGltZWRfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQlzY21kX3ByaW50ayhLRVJOX0RFQlVHLCBjbWQsICJjb21tYW5kICVwIHRpbWVkIG91dFxuIiwgY21kKTsKKwlzY21kX2RiZyhjbWQsICJjb21tYW5kICVwIHRpbWVkIG91dFxuIiwgY21kKTsKIAogCXJldHVybiBCTEtfRUhfTk9UX0hBTkRMRUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggNGUxYjc1Yy4uOTRhM2NhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtNzMsOCArNzMsNiBAQAogICovCiAvKiAxIFNlY29uZCAqLwogI2RlZmluZSBRVUVVRV9SQU1QX0RPV05fSU5URVJWQUwJKG1zZWNzX3RvX2ppZmZpZXMoMTAwMCAqIDEpKQotLyogNSBtaW51dGVzICovCi0jZGVmaW5lIFFVRVVFX1JBTVBfVVBfSU5URVJWQUwJCShtc2Vjc190b19qaWZmaWVzKDEwMDAgKiAzMDApKQogCiAvKiBOdW1iZXIgb2YgZXhjaGFuZ2VzIHJlc2VydmVkIGZvciBkaXNjb3ZlcnkgdG8gY29tcGxldGUgKi8KICNkZWZpbmUgTFBGQ19ESVNDX0lPQ0JfQlVGRl9DT1VOVCAyMApAQCAtNzIyLDYgKzcyMCwyMCBAQAogCXVpbnQzMl90IGNmZ19oYmFfcXVldWVfZGVwdGg7CiAJdWludDMyX3QgY2ZnX2VuYWJsZV9oYmFfcmVzZXQ7CiAJdWludDMyX3QgY2ZnX2VuYWJsZV9oYmFfaGVhcnRiZWF0OworCXVpbnQzMl90IGNmZ19mb2Y7CisJdWludDMyX3QgY2ZnX0VuYWJsZVhMYW5lOworCXVpbnQ4X3QgY2ZnX29hc190Z3Rfd3dwbls4XTsKKwl1aW50OF90IGNmZ19vYXNfdnB0X3d3cG5bOF07CisJdWludDMyX3QgY2ZnX29hc19sdW5fc3RhdGU7CisjZGVmaW5lIE9BU19MVU5fRU5BQkxFCTEKKyNkZWZpbmUgT0FTX0xVTl9ESVNBQkxFCTAKKwl1aW50MzJfdCBjZmdfb2FzX2x1bl9zdGF0dXM7CisjZGVmaW5lIE9BU19MVU5fU1RBVFVTX0VYSVNUUwkweDAxCisJdWludDMyX3QgY2ZnX29hc19mbGFnczsKKyNkZWZpbmUgT0FTX0ZJTkRfQU5ZX1ZQT1JUCTB4MDEKKyNkZWZpbmUgT0FTX0ZJTkRfQU5ZX1RBUkdFVAkweDAyCisjZGVmaW5lIE9BU19MVU5fVkFMSUQJMHgwNAorCXVpbnQzMl90IGNmZ19YTGFuZVByaW9yaXR5OwogCXVpbnQzMl90IGNmZ19lbmFibGVfYmc7CiAJdWludDMyX3QgY2ZnX2hvc3RtZW1faGdwOwogCXVpbnQzMl90IGNmZ19sb2dfdmVyYm9zZTsKQEAgLTczMCw2ICs3NDIsNyBAQAogCXVpbnQzMl90IGNmZ19yZXF1ZXN0X2Zpcm13YXJlX3VwZ3JhZGU7CiAJdWludDMyX3QgY2ZnX2lvY2JfY250OwogCXVpbnQzMl90IGNmZ19zdXBwcmVzc19saW5rX3VwOworCXVpbnQzMl90IGNmZ19ycnFfeHJpX2JpdG1hcF9zejsKICNkZWZpbmUgTFBGQ19JTklUSUFMSVpFX0xJTksgICAgICAgICAgICAgIDAJLyogZG8gbm9ybWFsIGluaXRfbGluayBtYm94ICovCiAjZGVmaW5lIExQRkNfREVMQVlfSU5JVF9MSU5LICAgICAgICAgICAgICAxCS8qIGxheWVyZWQgZHJpdmVyIGhvbGQgb2ZmICovCiAjZGVmaW5lIExQRkNfREVMQVlfSU5JVF9MSU5LX0lOREVGSU5JVEVMWSAyCS8qIHdhaXQsIG1hbnVhbCBpbnRlcnZlbnRpb24gKi8KQEAgLTgzNSw2ICs4NDgsNyBAQAogCW1lbXBvb2xfdCAqbWJveF9tZW1fcG9vbDsKIAltZW1wb29sX3QgKm5scF9tZW1fcG9vbDsKIAltZW1wb29sX3QgKnJycV9wb29sOworCW1lbXBvb2xfdCAqYWN0aXZlX3JycV9wb29sOwogCiAJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyBsaW5rX3N0YXRzOwogCWVudW0gaW50cl90eXBlX3QgaW50cl90eXBlOwpAQCAtODY5LDcgKzg4Myw2IEBACiAJYXRvbWljX3QgbnVtX2NtZF9zdWNjZXNzOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9yc3JjX2Vycm9yX3RpbWU7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3JhbXBfZG93bl90aW1lOwotCXVuc2lnbmVkIGxvbmcgbGFzdF9yYW1wX3VwX3RpbWU7CiAjaWZkZWYgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUwogCXN0cnVjdCBkZW50cnkgKmhiYV9kZWJ1Z2ZzX3Jvb3Q7CiAJYXRvbWljX3QgZGVidWdmc192cG9ydF9jb3VudDsKQEAgLTk3MSw2ICs5ODQsOSBAQAogCWF0b21pY190IHNkZXZfY250OwogCXVpbnQ4X3QgZmlwc19zcGVjX3JldjsKIAl1aW50OF90IGZpcHNfbGV2ZWw7CisJc3BpbmxvY2tfdCBkZXZpY2Vsb2NrOwkvKiBsb2NrIGZvciBsdW5zIGxpc3QgKi8KKwltZW1wb29sX3QgKmRldmljZV9kYXRhX21lbV9wb29sOworCXN0cnVjdCBsaXN0X2hlYWQgbHVuczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jCmluZGV4IDAwNjU2ZmMuLjhkNWI2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jCkBAIC01MjksNiArNTI5LDI3IEBACiB9CiAKIC8qKgorICogbHBmY19vYXNfc3VwcG9ydGVkX3Nob3cgLSBSZXR1cm4gd2hldGhlciBvciBub3QgT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlCisgKgkJCSAgICAoT0FTKSBpcyBzdXBwb3J0ZWQuCisgKiBAZGV2OiBjbGFzcyB1bnVzZWQgdmFyaWFibGUuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBvbiByZXR1cm4gY29udGFpbnMgdGhlIG1vZHVsZSBkZXNjcmlwdGlvbiB0ZXh0LgorICoKKyAqIFJldHVybnM6IHNpemUgb2YgZm9ybWF0dGVkIHN0cmluZy4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc19zdXBwb3J0ZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJCXBoYmEtPnNsaTRfaGJhLnBjX3NsaTRfcGFyYW1zLm9hc19zdXBwb3J0ZWQpOworfQorCisvKioKICAqIGxwZmNfbGlua19zdGF0ZV9zdG9yZSAtIFRyYW5zaXRpb24gdGhlIGxpbmtfc3RhdGUgb24gYW4gSEJBIHBvcnQKICAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgogICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgpAQCAtMjA0MSw5ICsyMDYyLDUzIEBACiBzdGF0aWMgREVWSUNFX0FUVFIobHBmY19zcmlvdl9od19tYXhfdmlydGZuLCBTX0lSVUdPLAogCQkgICBscGZjX3NyaW92X2h3X21heF92aXJ0Zm5fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIocHJvdG9jb2wsIFNfSVJVR08sIGxwZmNfc2xpNF9wcm90b2NvbF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3hsYW5lX3N1cHBvcnRlZCwgU19JUlVHTywgbHBmY19vYXNfc3VwcG9ydGVkX3Nob3csCisJCSAgIE5VTEwpOwogCiBzdGF0aWMgY2hhciAqbHBmY19zb2Z0X3d3bl9rZXkgPSAiQzk5RzcxU0w4MDMyQSI7CisjZGVmaW5lIFdXTl9TWiA4CisvKioKKyAqIGxwZmNfd3duX3NldCAtIENvbnZlcnQgc3RyaW5nIHRvIHRoZSA4IGJ5dGUgV1dOIHZhbHVlLgorICogQGJ1ZjogV1dOIHN0cmluZy4KKyAqIEBjbnQ6IExlbmd0aCBvZiBzdHJpbmcuCisgKiBAd3duOiBBcnJheSB0byByZWNlaXZlIGNvbnZlcnRlZCB3d24gdmFsdWUuCisgKgorICogUmV0dXJuczoKKyAqIC1FSU5WQUwgaWYgdGhlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgd3duCisgKiAwIHN1Y2Nlc3MKKyAqKi8KK3N0YXRpYyBzaXplX3QKK2xwZmNfd3duX3NldChjb25zdCBjaGFyICpidWYsIHNpemVfdCBjbnQsIGNoYXIgd3duW10pCit7CisJdW5zaWduZWQgaW50IGksIGo7CiAKKwkvKiBDb3VudCBtYXkgaW5jbHVkZSBhIExGIGF0IGVuZCBvZiBzdHJpbmcgKi8KKwlpZiAoYnVmW2NudC0xXSA9PSAnXG4nKQorCQljbnQtLTsKKworCWlmICgoY250IDwgMTYpIHx8IChjbnQgPiAxOCkgfHwgKChjbnQgPT0gMTcpICYmICgqYnVmKysgIT0gJ3gnKSkgfHwKKwkgICAgKChjbnQgPT0gMTgpICYmICgoKmJ1ZisrICE9ICcwJykgfHwgKCpidWYrKyAhPSAneCcpKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHd3biwgMCwgV1dOX1NaKTsKKworCS8qIFZhbGlkYXRlIGFuZCBzdG9yZSB0aGUgbmV3IG5hbWUgKi8KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKCgqYnVmID49ICdhJykgJiYgKCpidWYgPD0gJ2YnKSkKKwkJCWogPSAoKGogPDwgNCkgfCAoKCpidWYrKyAtICdhJykgKyAxMCkpOworCQllbHNlIGlmICgoKmJ1ZiA+PSAnQScpICYmICgqYnVmIDw9ICdGJykpCisJCQlqID0gKChqIDw8IDQpIHwgKCgqYnVmKysgLSAnQScpICsgMTApKTsKKwkJZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKQorCQkJaiA9ICgoaiA8PCA0KSB8ICgqYnVmKysgLSAnMCcpKTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChpICUgMikgeworCQkJd3duW2kvMl0gPSBqICYgMHhmZjsKKwkJCWogPSAwOworCQl9CisJfQorCXJldHVybiAwOworfQogLyoqCiAgKiBscGZjX3NvZnRfd3duX2VuYWJsZV9zdG9yZSAtIEFsbG93cyBzZXR0aW5nIG9mIHRoZSB3d24gaWYgdGhlIGtleSBpcyB2YWxpZAogICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCkBAIC0yMTMyLDkgKzIxOTcsOSBAQAogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKIAlzdHJ1Y3QgY29tcGxldGlvbiBvbmxpbmVfY29tcGw7Ci0JaW50IHN0YXQxPTAsIHN0YXQyPTA7Ci0JdW5zaWduZWQgaW50IGksIGosIGNudD1jb3VudDsKLQl1OCB3d3BuWzhdOworCWludCBzdGF0MSA9IDAsIHN0YXQyID0gMDsKKwl1bnNpZ25lZCBpbnQgY250ID0gY291bnQ7CisJdTggd3dwbltXV05fU1pdOwogCWludCByYzsKIAogCWlmICghcGhiYS0+Y2ZnX2VuYWJsZV9oYmFfcmVzZXQpCkBAIC0yMTQ5LDI5ICsyMjE0LDE5IEBACiAJaWYgKGJ1ZltjbnQtMV0gPT0gJ1xuJykKIAkJY250LS07CiAKLQlpZiAoIXBoYmEtPnNvZnRfd3duX2VuYWJsZSB8fCAoY250IDwgMTYpIHx8IChjbnQgPiAxOCkgfHwKLQkgICAgKChjbnQgPT0gMTcpICYmICgqYnVmKysgIT0gJ3gnKSkgfHwKLQkgICAgKChjbnQgPT0gMTgpICYmICgoKmJ1ZisrICE9ICcwJykgfHwgKCpidWYrKyAhPSAneCcpKSkpCisJaWYgKCFwaGJhLT5zb2Z0X3d3bl9lbmFibGUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogbG9jayBzZXR0aW5nIHd3cG4sIHd3bm4gZG93biAqLwogCXBoYmEtPnNvZnRfd3duX2VuYWJsZSA9IDA7CiAKLQltZW1zZXQod3dwbiwgMCwgc2l6ZW9mKHd3cG4pKTsKLQotCS8qIFZhbGlkYXRlIGFuZCBzdG9yZSB0aGUgbmV3IG5hbWUgKi8KLQlmb3IgKGk9MCwgaj0wOyBpIDwgMTY7IGkrKykgewotCQlpbnQgdmFsdWU7Ci0KLQkJdmFsdWUgPSBoZXhfdG9fYmluKCpidWYrKyk7Ci0JCWlmICh2YWx1ZSA+PSAwKQotCQkJaiA9IChqIDw8IDQpIHwgdmFsdWU7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoaSAlIDIpIHsKLQkJCXd3cG5baS8yXSA9IGogJiAweGZmOwotCQkJaiA9IDA7Ci0JCX0KKwlyYyA9IGxwZmNfd3duX3NldChidWYsIGNudCwgd3dwbik7CisJaWYgKCFyYykgeworCQkvKiBub3QgYWJsZSB0byBzZXQgd3dwbiwgdW5sb2NrIGl0ICovCisJCXBoYmEtPnNvZnRfd3duX2VuYWJsZSA9IDE7CisJCXJldHVybiByYzsKIAl9CisKIAlwaGJhLT5jZmdfc29mdF93d3BuID0gd3duX3RvX3U2NCh3d3BuKTsKIAlmY19ob3N0X3BvcnRfbmFtZShzaG9zdCkgPSBwaGJhLT5jZmdfc29mdF93d3BuOwogCWlmIChwaGJhLT5jZmdfc29mdF93d25uKQpAQCAtMjE5OCw3ICsyMjUzLDcgQEAKIAkJCQkicmVpbml0IGFkYXB0ZXIgLSAlZFxuIiwgc3RhdDIpOwogCXJldHVybiAoc3RhdDEgfHwgc3RhdDIpID8gLUVJTyA6IGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKGxwZmNfc29mdF93d3BuLCBTX0lSVUdPIHwgU19JV1VTUixcCitzdGF0aWMgREVWSUNFX0FUVFIobHBmY19zb2Z0X3d3cG4sIFNfSVJVR08gfCBTX0lXVVNSLAogCQkgICBscGZjX3NvZnRfd3dwbl9zaG93LCBscGZjX3NvZnRfd3dwbl9zdG9yZSk7CiAKIC8qKgpAQCAtMjIzNSwzOSArMjI5MCwyNSBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKLQl1bnNpZ25lZCBpbnQgaSwgaiwgY250PWNvdW50OwotCXU4IHd3bm5bOF07CisJdW5zaWduZWQgaW50IGNudCA9IGNvdW50OworCXU4IHd3bm5bV1dOX1NaXTsKKwlpbnQgcmM7CiAKIAkvKiBjb3VudCBtYXkgaW5jbHVkZSBhIExGIGF0IGVuZCBvZiBzdHJpbmcgKi8KIAlpZiAoYnVmW2NudC0xXSA9PSAnXG4nKQogCQljbnQtLTsKIAotCWlmICghcGhiYS0+c29mdF93d25fZW5hYmxlIHx8IChjbnQgPCAxNikgfHwgKGNudCA+IDE4KSB8fAotCSAgICAoKGNudCA9PSAxNykgJiYgKCpidWYrKyAhPSAneCcpKSB8fAotCSAgICAoKGNudCA9PSAxOCkgJiYgKCgqYnVmKysgIT0gJzAnKSB8fCAoKmJ1ZisrICE9ICd4JykpKSkKKwlpZiAoIXBoYmEtPnNvZnRfd3duX2VuYWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKgotCSAqIEFsbG93IHd3bm4gdG8gYmUgc2V0IG1hbnkgdGltZXMsIGFzIGxvbmcgYXMgdGhlIGVuYWJsZSBpcyBzZXQuCi0JICogSG93ZXZlciwgb25jZSB0aGUgd3dwbiBpcyBzZXQsIGV2ZXJ5dGhpbmcgbG9ja3MuCi0JICovCi0KLQltZW1zZXQod3dubiwgMCwgc2l6ZW9mKHd3bm4pKTsKLQotCS8qIFZhbGlkYXRlIGFuZCBzdG9yZSB0aGUgbmV3IG5hbWUgKi8KLQlmb3IgKGk9MCwgaj0wOyBpIDwgMTY7IGkrKykgewotCQlpbnQgdmFsdWU7Ci0KLQkJdmFsdWUgPSBoZXhfdG9fYmluKCpidWYrKyk7Ci0JCWlmICh2YWx1ZSA+PSAwKQotCQkJaiA9IChqIDw8IDQpIHwgdmFsdWU7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoaSAlIDIpIHsKLQkJCXd3bm5baS8yXSA9IGogJiAweGZmOwotCQkJaiA9IDA7Ci0JCX0KKwlyYyA9IGxwZmNfd3duX3NldChidWYsIGNudCwgd3dubik7CisJaWYgKCFyYykgeworCQkvKiBBbGxvdyB3d25uIHRvIGJlIHNldCBtYW55IHRpbWVzLCBhcyBsb25nIGFzIHRoZSBlbmFibGUKKwkJICogaXMgc2V0LiBIb3dldmVyLCBvbmNlIHRoZSB3d3BuIGlzIHNldCwgZXZlcnl0aGluZyBsb2Nrcy4KKwkJICovCisJCXJldHVybiByYzsKIAl9CisKIAlwaGJhLT5jZmdfc29mdF93d25uID0gd3duX3RvX3U2NCh3d25uKTsKIAogCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZwaGJhLT5wY2lkZXYtPmRldiwKQEAgLTIyNzYsOSArMjMxNyw0MzggQEAKIAogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihscGZjX3NvZnRfd3dubiwgU19JUlVHTyB8IFNfSVdVU1IsXAorc3RhdGljIERFVklDRV9BVFRSKGxwZmNfc29mdF93d25uLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJICAgbHBmY19zb2Z0X3d3bm5fc2hvdywgbHBmY19zb2Z0X3d3bm5fc3RvcmUpOwogCisvKioKKyAqIGxwZmNfb2FzX3RndF9zaG93IC0gUmV0dXJuIHd3cG4gb2YgdGFyZ2V0IHdob3NlIGx1bnMgbWF5YmUgZW5hYmxlZCBmb3IKKyAqCQkgICAgICBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiB2YWx1ZSBvZiBjb3VudAorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX3RndF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JWxseFxuIiwKKwkJCXd3bl90b191NjQocGhiYS0+Y2ZnX29hc190Z3Rfd3dwbikpOworfQorCisvKioKKyAqIGxwZmNfb2FzX3RndF9zdG9yZSAtIFN0b3JlIHd3cG4gb2YgdGFyZ2V0IHdob3NlIGx1bnMgbWF5YmUgZW5hYmxlZCBmb3IKKyAqCQkgICAgICBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICogQGNvdW50OiBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogLUVJTlZBTCBjb3VudCBpcyBpbnZhbGlkLCBpbnZhbGlkIHd3cG4gYnl0ZSBpbnZhbGlkCisgKiAtRVBFUk0gb2FzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaGJhCisgKiB2YWx1ZSBvZiBjb3VudCBvbiBzdWNjZXNzCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfdGd0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKwl1bnNpZ25lZCBpbnQgY250ID0gY291bnQ7CisJdWludDhfdCB3d3BuW1dXTl9TWl07CisJaW50IHJjOworCisJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBjb3VudCBtYXkgaW5jbHVkZSBhIExGIGF0IGVuZCBvZiBzdHJpbmcgKi8KKwlpZiAoYnVmW2NudC0xXSA9PSAnXG4nKQorCQljbnQtLTsKKworCXJjID0gbHBmY193d25fc2V0KGJ1ZiwgY250LCB3d3BuKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCW1lbWNweShwaGJhLT5jZmdfb2FzX3RndF93d3BuLCB3d3BuLCAoOCAqIHNpemVvZih1aW50OF90KSkpOworCW1lbWNweShwaGJhLT5zbGk0X2hiYS5vYXNfbmV4dF90Z3Rfd3dwbiwgd3dwbiwgKDggKiBzaXplb2YodWludDhfdCkpKTsKKwlpZiAod3duX3RvX3U2NCh3d3BuKSA9PSAwKQorCQlwaGJhLT5jZmdfb2FzX2ZsYWdzIHw9IE9BU19GSU5EX0FOWV9UQVJHRVQ7CisJZWxzZQorCQlwaGJhLT5jZmdfb2FzX2ZsYWdzICY9IH5PQVNfRklORF9BTllfVEFSR0VUOworCXBoYmEtPmNmZ19vYXNfZmxhZ3MgJj0gfk9BU19MVU5fVkFMSUQ7CisJcGhiYS0+c2xpNF9oYmEub2FzX25leHRfbHVuID0gRklORF9GSVJTVF9PQVNfTFVOOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3hsYW5lX3RndCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGxwZmNfb2FzX3RndF9zaG93LCBscGZjX29hc190Z3Rfc3RvcmUpOworCisvKioKKyAqIGxwZmNfb2FzX3ZwdF9zaG93IC0gUmV0dXJuIHd3cG4gb2YgdnBvcnQgd2hvc2UgdGFyZ2V0cyBtYXliZSBlbmFibGVkCisgKgkJICAgICAgZm9yIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZSAoT0FTKSBvcGVyYXRpb25zLgorICogQGRldjogY2xhc3MgZGV2aWNlIHRoYXQgaXMgY29udmVydGVkIGludG8gYSBTY3NpX2hvc3QuCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSwgbm90IHVzZWQuCisgKiBAYnVmOiBidWZmZXIgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqIHZhbHVlIG9mIGNvdW50IG9uIHN1Y2Nlc3MKKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX29hc192cHRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCVsbHhcbiIsCisJCQl3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4pKTsKK30KKworLyoqCisgKiBscGZjX29hc192cHRfc3RvcmUgLSBTdG9yZSB3d3BuIG9mIHZwb3J0IHdob3NlIHRhcmdldHMgbWF5YmUgZW5hYmxlZAorICoJCSAgICAgIGZvciBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICogQGNvdW50OiBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogLUVJTlZBTCBjb3VudCBpcyBpbnZhbGlkLCBpbnZhbGlkIHd3cG4gYnl0ZSBpbnZhbGlkCisgKiAtRVBFUk0gb2FzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaGJhCisgKiB2YWx1ZSBvZiBjb3VudCBvbiBzdWNjZXNzCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfdnB0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKwl1bnNpZ25lZCBpbnQgY250ID0gY291bnQ7CisJdWludDhfdCB3d3BuW1dXTl9TWl07CisJaW50IHJjOworCisJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBjb3VudCBtYXkgaW5jbHVkZSBhIExGIGF0IGVuZCBvZiBzdHJpbmcgKi8KKwlpZiAoYnVmW2NudC0xXSA9PSAnXG4nKQorCQljbnQtLTsKKworCXJjID0gbHBmY193d25fc2V0KGJ1ZiwgY250LCB3d3BuKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCW1lbWNweShwaGJhLT5jZmdfb2FzX3ZwdF93d3BuLCB3d3BuLCAoOCAqIHNpemVvZih1aW50OF90KSkpOworCW1lbWNweShwaGJhLT5zbGk0X2hiYS5vYXNfbmV4dF92cHRfd3dwbiwgd3dwbiwgKDggKiBzaXplb2YodWludDhfdCkpKTsKKwlpZiAod3duX3RvX3U2NCh3d3BuKSA9PSAwKQorCQlwaGJhLT5jZmdfb2FzX2ZsYWdzIHw9IE9BU19GSU5EX0FOWV9WUE9SVDsKKwllbHNlCisJCXBoYmEtPmNmZ19vYXNfZmxhZ3MgJj0gfk9BU19GSU5EX0FOWV9WUE9SVDsKKwlwaGJhLT5jZmdfb2FzX2ZsYWdzICY9IH5PQVNfTFVOX1ZBTElEOworCXBoYmEtPnNsaTRfaGJhLm9hc19uZXh0X2x1biA9IEZJTkRfRklSU1RfT0FTX0xVTjsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobHBmY194bGFuZV92cHQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBscGZjX29hc192cHRfc2hvdywgbHBmY19vYXNfdnB0X3N0b3JlKTsKKworLyoqCisgKiBscGZjX29hc19sdW5fc3RhdGVfc2hvdyAtIFJldHVybiB0aGUgY3VycmVudCBzdGF0ZSAoZW5hYmxlZCBvciBkaXNhYmxlZCkKKyAqCQkJICAgIG9mIHdoZXRoZXIgbHVucyB3aWxsIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqCQkJICAgIGZvciBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiBzaXplIG9mIGZvcm1hdHRlZCBzdHJpbmcuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfbHVuX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcGhiYS0+Y2ZnX29hc19sdW5fc3RhdGUpOworfQorCisvKioKKyAqIGxwZmNfb2FzX2x1bl9zdGF0ZV9zdG9yZSAtIFN0b3JlIHRoZSBzdGF0ZSAoZW5hYmxlZCBvciBkaXNhYmxlZCkKKyAqCQkJICAgIG9mIHdoZXRoZXIgbHVucyB3aWxsIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqCQkJICAgIGZvciBPcHRpbWl6ZWQgQWNjZXNzIFN0b3JhZ2UgKE9BUykgb3BlcmF0aW9ucy4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICogQGNvdW50OiBTaXplIG9mIHRoZSBkYXRhIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogLUVJTlZBTCBjb3VudCBpcyBpbnZhbGlkLCBpbnZhbGlkIHd3cG4gYnl0ZSBpbnZhbGlkCisgKiAtRVBFUk0gb2FzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaGJhCisgKiB2YWx1ZSBvZiBjb3VudCBvbiBzdWNjZXNzCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfbHVuX3N0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCWludCB2YWwgPSAwOworCisJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIWlzZGlnaXQoYnVmWzBdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVpIiwgJnZhbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbCAhPSAwKSAmJiAodmFsICE9IDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBoYmEtPmNmZ19vYXNfbHVuX3N0YXRlID0gdmFsOworCisJcmV0dXJuIHN0cmxlbihidWYpOworfQorc3RhdGljIERFVklDRV9BVFRSKGxwZmNfeGxhbmVfbHVuX3N0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgbHBmY19vYXNfbHVuX3N0YXRlX3Nob3csIGxwZmNfb2FzX2x1bl9zdGF0ZV9zdG9yZSk7CisKKy8qKgorICogbHBmY19vYXNfbHVuX3N0YXR1c19zaG93IC0gUmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIE9wdGltaXplZCBBY2Nlc3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlIChPQVMpIGx1biByZXR1cm5lZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBscGZjX29hc19sdW5fc2hvdyBmdW5jdGlvbi4KKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiBzaXplIG9mIGZvcm1hdHRlZCBzdHJpbmcuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfbHVuX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCWlmICghKHBoYmEtPmNmZ19vYXNfZmxhZ3MgJiBPQVNfTFVOX1ZBTElEKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcGhiYS0+Y2ZnX29hc19sdW5fc3RhdHVzKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3hsYW5lX2x1bl9zdGF0dXMsIFNfSVJVR08sCisJCSAgIGxwZmNfb2FzX2x1bl9zdGF0dXNfc2hvdywgTlVMTCk7CisKKworLyoqCisgKiBscGZjX29hc19sdW5fc3RhdGVfc2V0IC0gZW5hYmxlIG9yIGRpc2FibGUgYSBsdW4gZm9yIE9wdGltaXplZCBBY2Nlc3MgU3RvcmFnZQorICoJCQkgICAoT0FTKSBvcGVyYXRpb25zLgorICogQHBoYmE6IGxwZmNfaGJhIHBvaW50ZXIuCisgKiBAbmRscDogcG9pbnRlciB0byBmY3AgdGFyZ2V0IG5vZGUuCisgKiBAbHVuOiB0aGUgZmMgbHVuIGZvciBzZXR0aW5nIG9hcyBzdGF0ZS4KKyAqIEBvYXNfc3RhdGU6IHRoZSBvYXMgc3RhdGUgdG8gYmUgc2V0IHRvIHRoZSBsdW4uCisgKgorICogUmV0dXJuczoKKyAqIFNVQ0NFU1MgOiAwCisgKiAtRVBFUk0gT0FTIGlzIG5vdCBlbmFibGVkIG9yIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwb3J0LgorICoKKyAqLworc3RhdGljIHNpemVfdAorbHBmY19vYXNfbHVuX3N0YXRlX3NldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQ4X3QgdnB0X3d3cG5bXSwKKwkJICAgICAgIHVpbnQ4X3QgdGd0X3d3cG5bXSwgdWludDY0X3QgbHVuLCB1aW50MzJfdCBvYXNfc3RhdGUpCit7CisKKwlpbnQgcmMgPSAwOworCisJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAob2FzX3N0YXRlKSB7CisJCWlmICghbHBmY19lbmFibGVfb2FzX2x1bihwaGJhLCAoc3RydWN0IGxwZmNfbmFtZSAqKXZwdF93d3BuLAorCQkJCQkgKHN0cnVjdCBscGZjX25hbWUgKil0Z3Rfd3dwbiwgbHVuKSkKKwkJCXJjID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQlscGZjX2Rpc2FibGVfb2FzX2x1bihwaGJhLCAoc3RydWN0IGxwZmNfbmFtZSAqKXZwdF93d3BuLAorCQkJCSAgICAgKHN0cnVjdCBscGZjX25hbWUgKil0Z3Rfd3dwbiwgbHVuKTsKKwl9CisJcmV0dXJuIHJjOworCit9CisKKy8qKgorICogbHBmY19vYXNfbHVuX2dldF9uZXh0IC0gZ2V0IHRoZSBuZXh0IGx1biB0aGF0IGhhcyBiZWVuIGVuYWJsZWQgZm9yIE9wdGltaXplZAorICoJCQkgIEFjY2VzcyBTdG9yYWdlIChPQVMpIG9wZXJhdGlvbnMuCisgKiBAcGhiYTogbHBmY19oYmEgcG9pbnRlci4KKyAqIEB2cHRfd3dwbjogd3dwbiBvZiB0aGUgdnBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBsdW4KKyAqIEB0Z3Rfd3dwbjogd3dwbiBvZiB0aGUgdGFyZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV0dXJuZWQgbHVuCisgKiBAbHVuX3N0YXR1czogc3RhdHVzIG9mIHRoZSBsdW4gcmV0dXJuZWQgbHVuCisgKgorICogUmV0dXJucyB0aGUgZmlyc3Qgb3IgbmV4dCBsdW4gZW5hYmxlZCBmb3IgT0FTIG9wZXJhdGlvbnMgZm9yIHRoZSB2cG9ydC90YXJnZXQKKyAqIHNwZWNpZmllZC4gIElmIGEgbHVuIGlzIGZvdW5kLCBpdHMgdnBvcnQgd3dwbiwgdGFyZ2V0IHd3cG4gYW5kIHN0YXR1cyBpcworICogcmV0dXJuZWQuICBJZiB0aGUgbHVuIGlzIG5vdCBmb3VuZCwgTk9UX09BU19FTkFCTEVEX0xVTiBpcyByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm46CisgKiBsdW4gdGhhdCBpcyBPQVMgZW5hYmxlZCBmb3IgdGhlIHZwb3J0L3RhcmdldAorICogTk9UX09BU19FTkFCTEVEX0xVTiB3aGVuIG5vIG9hcyBlbmFibGVkIGx1biBmb3VuZC4KKyAqLworc3RhdGljIHVpbnQ2NF90CitscGZjX29hc19sdW5fZ2V0X25leHQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50OF90IHZwdF93d3BuW10sCisJCSAgICAgIHVpbnQ4X3QgdGd0X3d3cG5bXSwgdWludDMyX3QgKmx1bl9zdGF0dXMpCit7CisJdWludDY0X3QgZm91bmRfbHVuOworCisJaWYgKHVubGlrZWx5KCFwaGJhKSB8fCAhdnB0X3d3cG4gfHwgIXRndF93d3BuKQorCQlyZXR1cm4gTk9UX09BU19FTkFCTEVEX0xVTjsKKwlpZiAobHBmY19maW5kX25leHRfb2FzX2x1bihwaGJhLCAoc3RydWN0IGxwZmNfbmFtZSAqKQorCQkJCSAgIHBoYmEtPnNsaTRfaGJhLm9hc19uZXh0X3ZwdF93d3BuLAorCQkJCSAgIChzdHJ1Y3QgbHBmY19uYW1lICopCisJCQkJICAgcGhiYS0+c2xpNF9oYmEub2FzX25leHRfdGd0X3d3cG4sCisJCQkJICAgJnBoYmEtPnNsaTRfaGJhLm9hc19uZXh0X2x1biwKKwkJCQkgICAoc3RydWN0IGxwZmNfbmFtZSAqKXZwdF93d3BuLAorCQkJCSAgIChzdHJ1Y3QgbHBmY19uYW1lICopdGd0X3d3cG4sCisJCQkJICAgJmZvdW5kX2x1biwgbHVuX3N0YXR1cykpCisJCXJldHVybiBmb3VuZF9sdW47CisJZWxzZQorCQlyZXR1cm4gTk9UX09BU19FTkFCTEVEX0xVTjsKK30KKworLyoqCisgKiBscGZjX29hc19sdW5fc3RhdGVfY2hhbmdlIC0gZW5hYmxlL2Rpc2FibGUgYSBsdW4gZm9yIE9BUyBvcGVyYXRpb25zCisgKiBAcGhiYTogbHBmY19oYmEgcG9pbnRlci4KKyAqIEB2cHRfd3dwbjogdnBvcnQgd3dwbiBieSByZWZlcmVuY2UuCisgKiBAdGd0X3d3cG46IHRhcmdldCB3d3BuIGJ5IHJlZmVyZW5jZS4KKyAqIEBsdW46IHRoZSBmYyBsdW4gZm9yIHNldHRpbmcgb2FzIHN0YXRlLgorICogQG9hc19zdGF0ZTogdGhlIG9hcyBzdGF0ZSB0byBiZSBzZXQgdG8gdGhlIG9hc19sdW4uCisgKgorICogVGhpcyByb3V0aW5lIGVuYWJsZXMgKE9BU19MVU5fRU5BQkxFKSBvciBkaXNhYmxlcyAoT0FTX0xVTl9ESVNBQkxFKQorICogYSBsdW4gZm9yIE9BUyBvcGVyYXRpb25zLgorICoKKyAqIFJldHVybjoKKyAqIFNVQ0NFU1M6IDAKKyAqIC1FTk9NRU06IGZhaWxlZCB0byBlbmFibGUgYW4gbHVuIGZvciBPQVMgb3BlcmF0aW9ucworICogLUVQRVJNOiBPQVMgaXMgbm90IGVuYWJsZWQKKyAqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX2x1bl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50OF90IHZwdF93d3BuW10sCisJCQkgIHVpbnQ4X3QgdGd0X3d3cG5bXSwgdWludDY0X3QgbHVuLAorCQkJICB1aW50MzJfdCBvYXNfc3RhdGUpCit7CisKKwlpbnQgcmM7CisKKwlyYyA9IGxwZmNfb2FzX2x1bl9zdGF0ZV9zZXQocGhiYSwgdnB0X3d3cG4sIHRndF93d3BuLCBsdW4sCisJCQkJCW9hc19zdGF0ZSk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGxwZmNfb2FzX2x1bl9zaG93IC0gUmV0dXJuIG9hcyBlbmFibGVkIGx1bnMgZnJvbSBhIGNob3NlbiB0YXJnZXQKKyAqIEBkZXY6IGNsYXNzIGRldmljZSB0aGF0IGlzIGNvbnZlcnRlZCBpbnRvIGEgU2NzaV9ob3N0LgorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUsIG5vdCB1c2VkLgorICogQGJ1ZjogYnVmZmVyIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIGEgbHVuIGVuYWJsZWQgZm9yIE9BUyBlYWNoIHRpbWUgdGhlIGZ1bmN0aW9uCisgKiBpcyBjYWxsZWQuCisgKgorICogUmV0dXJuczoKKyAqIFNVQ0NFU1M6IHNpemUgb2YgZm9ybWF0dGVkIHN0cmluZy4KKyAqIC1FRkFVTFQ6IHRhcmdldCBvciB2cG9ydCB3d3BuIHdhcyBub3Qgc2V0IHByb3Blcmx5LgorICogLUVQRVJNOiBvYXMgaXMgbm90IGVuYWJsZWQuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19vYXNfbHVuX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOworCisJdWludDY0X3Qgb2FzX2x1bjsKKwlpbnQgbGVuID0gMDsKKworCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHd3bl90b191NjQocGhiYS0+Y2ZnX29hc192cHRfd3dwbikgPT0gMCkKKwkJaWYgKCEocGhiYS0+Y2ZnX29hc19mbGFncyAmIE9BU19GSU5EX0FOWV9WUE9SVCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh3d25fdG9fdTY0KHBoYmEtPmNmZ19vYXNfdGd0X3d3cG4pID09IDApCisJCWlmICghKHBoYmEtPmNmZ19vYXNfZmxhZ3MgJiBPQVNfRklORF9BTllfVEFSR0VUKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJb2FzX2x1biA9IGxwZmNfb2FzX2x1bl9nZXRfbmV4dChwaGJhLCBwaGJhLT5jZmdfb2FzX3ZwdF93d3BuLAorCQkJCQlwaGJhLT5jZmdfb2FzX3RndF93d3BuLAorCQkJCQkmcGhiYS0+Y2ZnX29hc19sdW5fc3RhdHVzKTsKKwlpZiAob2FzX2x1biAhPSBOT1RfT0FTX0VOQUJMRURfTFVOKQorCQlwaGJhLT5jZmdfb2FzX2ZsYWdzIHw9IE9BU19MVU5fVkFMSUQ7CisKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUtbGVuLCAiMHglbGx4Iiwgb2FzX2x1bik7CisKKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIGxwZmNfb2FzX2x1bl9zdG9yZSAtIFNldHMgdGhlIE9BUyBzdGF0ZSBmb3IgbHVuCisgKiBAZGV2OiBjbGFzcyBkZXZpY2UgdGhhdCBpcyBjb252ZXJ0ZWQgaW50byBhIFNjc2lfaG9zdC4KKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlLCBub3QgdXNlZC4KKyAqIEBidWY6IGJ1ZmZlciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIE9BUyBzdGF0ZSBmb3IgbHVuLiAgQmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLAorICogdGhlIHZwb3J0IHd3cG4sIHRhcmdldCB3d3BuLCBhbmQgb2FzIHN0YXRlIG5lZWQgdG8gYmUgc2V0LgorICoKKyAqIFJldHVybnM6CisgKiBTVUNDRVNTOiBzaXplIG9mIGZvcm1hdHRlZCBzdHJpbmcuCisgKiAtRUZBVUxUOiB0YXJnZXQgb3IgdnBvcnQgd3dwbiB3YXMgbm90IHNldCBwcm9wZXJseS4KKyAqIC1FUEVSTTogb2FzIGlzIG5vdCBlbmFibGVkLgorICogc2l6ZSBvZiBmb3JtYXR0ZWQgc3RyaW5nLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfb2FzX2x1bl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKChzdHJ1Y3QgbHBmY192cG9ydCAqKXNob3N0LT5ob3N0ZGF0YSktPnBoYmE7CisJdWludDY0X3Qgc2NzaV9sdW47CisJc3NpemVfdCByYzsKKworCWlmICghcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHd3bl90b191NjQocGhiYS0+Y2ZnX29hc192cHRfd3dwbikgPT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAod3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3RndF93d3BuKSA9PSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghaXNkaWdpdChidWZbMF0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzc2NhbmYoYnVmLCAiMHglbGx4IiwgJnNjc2lfbHVuKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJIjMzNzIgVHJ5IHRvIHNldCB2cG9ydCAweCVsbHggdGFyZ2V0IDB4JWxseCBsdW46JWxsZCAiCisJCQkid2l0aCBvYXMgc2V0IHRvICVkXG4iLAorCQkJd3duX3RvX3U2NChwaGJhLT5jZmdfb2FzX3ZwdF93d3BuKSwKKwkJCXd3bl90b191NjQocGhiYS0+Y2ZnX29hc190Z3Rfd3dwbiksIHNjc2lfbHVuLAorCQkJcGhiYS0+Y2ZnX29hc19sdW5fc3RhdGUpOworCisJcmMgPSBscGZjX29hc19sdW5fc3RhdGVfY2hhbmdlKHBoYmEsIHBoYmEtPmNmZ19vYXNfdnB0X3d3cG4sCisJCQkJCSAgIHBoYmEtPmNmZ19vYXNfdGd0X3d3cG4sIHNjc2lfbHVuLAorCQkJCQkgICBwaGJhLT5jZmdfb2FzX2x1bl9zdGF0ZSk7CisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihscGZjX3hsYW5lX2x1biwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGxwZmNfb2FzX2x1bl9zaG93LCBscGZjX29hc19sdW5fc3RvcmUpOwogCiBzdGF0aWMgaW50IGxwZmNfcG9sbCA9IDA7CiBtb2R1bGVfcGFyYW0obHBmY19wb2xsLCBpbnQsIFNfSVJVR08pOwpAQCAtMzgxOCw3ICs0Mjg4LDcgQEAKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKIAlzdHJ1Y3QgbHBmY192ZWN0b3JfbWFwX2luZm8gKmNwdXA7Ci0JaW50ICBpZHgsIGxlbiA9IDA7CisJaW50ICBsZW4gPSAwOwogCiAJaWYgKChwaGJhLT5zbGlfcmV2ICE9IExQRkNfU0xJX1JFVjQpIHx8CiAJICAgIChwaGJhLT5pbnRyX3R5cGUgIT0gTVNJWCkpCkBAIC0zODQ2LDIzICs0MzE2LDM5IEBACiAJCWJyZWFrOwogCX0KIAotCWNwdXAgPSBwaGJhLT5zbGk0X2hiYS5jcHVfbWFwOwotCWZvciAoaWR4ID0gMDsgaWR4IDwgcGhiYS0+c2xpNF9oYmEubnVtX3ByZXNlbnRfY3B1OyBpZHgrKykgeworCXdoaWxlIChwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1IDwgcGhiYS0+c2xpNF9oYmEubnVtX3ByZXNlbnRfY3B1KSB7CisJCWNwdXAgPSAmcGhiYS0+c2xpNF9oYmEuY3B1X21hcFtwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1XTsKKworCQkvKiBtYXJnaW4gc2hvdWxkIGZpdCBpbiB0aGlzIGFuZCB0aGUgdHJ1bmNhdGVkIG1lc3NhZ2UgKi8KIAkJaWYgKGNwdXAtPmlycSA9PSBMUEZDX1ZFQ1RPUl9NQVBfRU1QVFkpCiAJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUtbGVuLAogCQkJCQkiQ1BVICUwMmQgaW9fY2hhbiAlMDJkICIKIAkJCQkJInBoeXNpZCAlZCBjb3JlaWQgJWRcbiIsCi0JCQkJCWlkeCwgY3B1cC0+Y2hhbm5lbF9pZCwgY3B1cC0+cGh5c19pZCwKKwkJCQkJcGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSwKKwkJCQkJY3B1cC0+Y2hhbm5lbF9pZCwgY3B1cC0+cGh5c19pZCwKIAkJCQkJY3B1cC0+Y29yZV9pZCk7CiAJCWVsc2UKIAkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sCiAJCQkJCSJDUFUgJTAyZCBpb19jaGFuICUwMmQgIgogCQkJCQkicGh5c2lkICVkIGNvcmVpZCAlZCBJUlEgJWRcbiIsCi0JCQkJCWlkeCwgY3B1cC0+Y2hhbm5lbF9pZCwgY3B1cC0+cGh5c19pZCwKKwkJCQkJcGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSwKKwkJCQkJY3B1cC0+Y2hhbm5lbF9pZCwgY3B1cC0+cGh5c19pZCwKIAkJCQkJY3B1cC0+Y29yZV9pZCwgY3B1cC0+aXJxKTsKIAotCQljcHVwKys7CisJCXBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUrKzsKKworCQkvKiBkaXNwbGF5IG1heCBudW1iZXIgb2YgQ1BVcyBrZWVwaW5nIHNvbWUgbWFyZ2luICovCisJCWlmIChwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1IDwKKwkJCQlwaGJhLT5zbGk0X2hiYS5udW1fcHJlc2VudF9jcHUgJiYKKwkJCQkobGVuID49IChQQUdFX1NJWkUgLSA2NCkpKSB7CisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUtbGVuLCAibW9yZS4uLlxuIik7CisJCQlicmVhazsKKwkJfQogCX0KKworCWlmIChwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1ID09IHBoYmEtPnNsaTRfaGJhLm51bV9wcmVzZW50X2NwdSkKKwkJcGhiYS0+c2xpNF9oYmEuY3Vycl9kaXNwX2NwdSA9IDA7CisKIAlyZXR1cm4gbGVuOwogfQogCkBAIC00MTU3LDYgKzQ2NDMsMjEgQEAKIExQRkNfQVRUUl9SKGVuYWJsZV9oYmFfaGVhcnRiZWF0LCAwLCAwLCAxLCAiRW5hYmxlIEhCQSBIZWFydGJlYXQuIik7CiAKIC8qCisjIGxwZmNfRW5hYmxlWExhbmU6IEVuYWJsZSBFeHByZXNzIExhbmUgRmVhdHVyZQorIyAgICAgIDB4MCAgIEV4cHJlc3MgTGFuZSBGZWF0dXJlIGRpc2FibGVkCisjICAgICAgMHgxICAgRXhwcmVzcyBMYW5lIEZlYXR1cmUgZW5hYmxlZAorIyBWYWx1ZSByYW5nZSBpcyBbMCwxXS4gRGVmYXVsdCB2YWx1ZSBpcyAwLgorKi8KK0xQRkNfQVRUUl9SKEVuYWJsZVhMYW5lLCAwLCAwLCAxLCAiRW5hYmxlIEV4cHJlc3MgTGFuZSBGZWF0dXJlLiIpOworCisvKgorIyBscGZjX1hMYW5lUHJpb3JpdHk6ICBEZWZpbmUgQ1NfQ1RMIHByaW9yaXR5IGZvciBFeHByZXNzIExhbmUgRmVhdHVyZQorIyAgICAgICAweDAgLSAweDdmICA9IENTX0NUTCBmaWVsZCBpbiBGQyBoZWFkZXIgKGhpZ2ggNyBiaXRzKQorIyBWYWx1ZSByYW5nZSBpcyBbMHgwLDB4N2ZdLiBEZWZhdWx0IHZhbHVlIGlzIDAKKyovCitMUEZDX0FUVFJfUihYTGFuZVByaW9yaXR5LCAwLCAweDAsIDB4N2YsICJDU19DVEwgZm9yIEV4cHJlc3MgTGFuZSBGZWF0dXJlLiIpOworCisvKgogIyBscGZjX2VuYWJsZV9iZzogRW5hYmxlIEJsb2NrR3VhcmQgKEVtdWxleCdzIEltcGxlbWVudGF0aW9uIG9mIFQxMC1ESUYpCiAjICAgICAgIDAgID0gQmxvY2tHdWFyZCBkaXNhYmxlZCAoZGVmYXVsdCkKICMgICAgICAgMSAgPSBCbG9ja0d1YXJkIGVuYWJsZWQKQEAgLTQzMTcsNiArNDgxOCwxMyBAQAogCSZkZXZfYXR0cl9scGZjX3NvZnRfd3duX2VuYWJsZSwKIAkmZGV2X2F0dHJfbHBmY19lbmFibGVfaGJhX3Jlc2V0LAogCSZkZXZfYXR0cl9scGZjX2VuYWJsZV9oYmFfaGVhcnRiZWF0LAorCSZkZXZfYXR0cl9scGZjX0VuYWJsZVhMYW5lLAorCSZkZXZfYXR0cl9scGZjX1hMYW5lUHJpb3JpdHksCisJJmRldl9hdHRyX2xwZmNfeGxhbmVfbHVuLAorCSZkZXZfYXR0cl9scGZjX3hsYW5lX3RndCwKKwkmZGV2X2F0dHJfbHBmY194bGFuZV92cHQsCisJJmRldl9hdHRyX2xwZmNfeGxhbmVfbHVuX3N0YXRlLAorCSZkZXZfYXR0cl9scGZjX3hsYW5lX2x1bl9zdGF0dXMsCiAJJmRldl9hdHRyX2xwZmNfc2dfc2VnX2NudCwKIAkmZGV2X2F0dHJfbHBmY19tYXhfc2NzaWNtcGxfdGltZSwKIAkmZGV2X2F0dHJfbHBmY19zdGF0X2RhdGFfY3RybCwKQEAgLTQzMzUsNiArNDg0Myw3IEBACiAJJmRldl9hdHRyX2xwZmNfZHNzLAogCSZkZXZfYXR0cl9scGZjX3NyaW92X2h3X21heF92aXJ0Zm4sCiAJJmRldl9hdHRyX3Byb3RvY29sLAorCSZkZXZfYXR0cl9scGZjX3hsYW5lX3N1cHBvcnRlZCwKIAlOVUxMLAogfTsKIApAQCAtNTI5NiwxMSArNTgwNSwyMCBAQAogCWxwZmNfZmNwX2lvX2NoYW5uZWxfaW5pdChwaGJhLCBscGZjX2ZjcF9pb19jaGFubmVsKTsKIAlscGZjX2VuYWJsZV9oYmFfcmVzZXRfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9oYmFfcmVzZXQpOwogCWxwZmNfZW5hYmxlX2hiYV9oZWFydGJlYXRfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9oYmFfaGVhcnRiZWF0KTsKKwlscGZjX0VuYWJsZVhMYW5lX2luaXQocGhiYSwgbHBmY19FbmFibGVYTGFuZSk7CisJaWYgKHBoYmEtPnNsaV9yZXYgIT0gTFBGQ19TTElfUkVWNCkKKwkJcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lID0gMDsKKwlscGZjX1hMYW5lUHJpb3JpdHlfaW5pdChwaGJhLCBscGZjX1hMYW5lUHJpb3JpdHkpOworCW1lbXNldChwaGJhLT5jZmdfb2FzX3RndF93d3BuLCAwLCAoOCAqIHNpemVvZih1aW50OF90KSkpOworCW1lbXNldChwaGJhLT5jZmdfb2FzX3ZwdF93d3BuLCAwLCAoOCAqIHNpemVvZih1aW50OF90KSkpOworCXBoYmEtPmNmZ19vYXNfbHVuX3N0YXRlID0gMDsKKwlwaGJhLT5jZmdfb2FzX2x1bl9zdGF0dXMgPSAwOworCXBoYmEtPmNmZ19vYXNfZmxhZ3MgPSAwOwogCWxwZmNfZW5hYmxlX2JnX2luaXQocGhiYSwgbHBmY19lbmFibGVfYmcpOwogCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCiAJCXBoYmEtPmNmZ19wb2xsID0gMDsKIAllbHNlCi0JcGhiYS0+Y2ZnX3BvbGwgPSBscGZjX3BvbGw7CisJCXBoYmEtPmNmZ19wb2xsID0gbHBmY19wb2xsOwogCXBoYmEtPmNmZ19zb2Z0X3d3bm4gPSAwTDsKIAlwaGJhLT5jZmdfc29mdF93d3BuID0gMEw7CiAJbHBmY19zZ19zZWdfY250X2luaXQocGhiYSwgbHBmY19zZ19zZWdfY250KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jCmluZGV4IDgyMTM0ZDIwLi5jYTJmNGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMKQEAgLTQxNTMsNiArNDE1Myw3IEBACiAJCWlmIChzdWJzeXMgPT0gU0xJX0NPTkZJR19TVUJTWVNfRkNPRSkgewogCQkJc3dpdGNoIChvcGNvZGUpIHsKIAkJCWNhc2UgRkNPRV9PUENPREVfUkVBRF9GQ0Y6CisJCQljYXNlIEZDT0VfT1BDT0RFX0dFVF9EUE9SVF9SRVNVTFRTOgogCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19MSUJERkMsCiAJCQkJCQkiMjk1NyBIYW5kbGVkIFNMSV9DT05GSUcgIgogCQkJCQkJInN1YnN5c19mY29lLCBvcGNvZGU6eCV4XG4iLApAQCAtNDE2MSw2ICs0MTYyLDggQEAKIAkJCQkJCQluZW1iX21zZSwgZG1hYnVmKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgRkNPRV9PUENPREVfQUREX0ZDRjoKKwkJCWNhc2UgRkNPRV9PUENPREVfU0VUX0RQT1JUX01PREU6CisJCQljYXNlIExQRkNfTUJPWF9PUENPREVfRkNPRV9MSU5LX0RJQUdfU1RBVEU6CiAJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0xJQkRGQywKIAkJCQkJCSIyOTU4IEhhbmRsZWQgU0xJX0NPTkZJRyAiCiAJCQkJCQkic3Vic3lzX2Zjb2UsIG9wY29kZTp4JXhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuaAppbmRleCA2N2Y3ZDBhLi5hOTRkNGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmgKQEAgLTIzMSw2ICsyMzEsOCBAQAogI2RlZmluZSBTTElfQ09ORklHX1NVQlNZU19GQ09FCQkweDBDCiAjZGVmaW5lIEZDT0VfT1BDT0RFX1JFQURfRkNGCQkweDA4CiAjZGVmaW5lIEZDT0VfT1BDT0RFX0FERF9GQ0YJCTB4MDkKKyNkZWZpbmUgRkNPRV9PUENPREVfU0VUX0RQT1JUX01PREUJMHgyNworI2RlZmluZSBGQ09FX09QQ09ERV9HRVRfRFBPUlRfUkVTVUxUUwkweDI4CiB9OwogCiBzdHJ1Y3QgbHBmY19zbGlfY29uZmlnX2VtYjFfc3Vic3lzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKaW5kZXggY2RhMDc2YS4uYWRkYTBiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKQEAgLTE4Nyw2ICsxODcsMTEgQEAKIHZvaWQgbHBmY19vZmZsaW5lKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19yZXNldF9oYmEoc3RydWN0IGxwZmNfaGJhICopOwogCitpbnQgbHBmY19mb2ZfcXVldWVfY3JlYXRlKHN0cnVjdCBscGZjX2hiYSAqKTsKK2ludCBscGZjX2ZvZl9xdWV1ZV9zZXR1cChzdHJ1Y3QgbHBmY19oYmEgKik7CitpbnQgbHBmY19mb2ZfcXVldWVfZGVzdHJveShzdHJ1Y3QgbHBmY19oYmEgKik7CitpcnFyZXR1cm5fdCBscGZjX3NsaTRfZm9mX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKik7CisKIGludCBscGZjX3NsaV9zZXR1cChzdHJ1Y3QgbHBmY19oYmEgKik7CiBpbnQgbHBmY19zbGlfcXVldWVfc2V0dXAoc3RydWN0IGxwZmNfaGJhICopOwogCkBAIC0yNDIsNiArMjQ3LDcgQEAKIHZvaWQgbHBmY19zbGk0X2NsZWFyX2ZjZl9ycl9ibWFzayhzdHJ1Y3QgbHBmY19oYmEgKik7CiAKIGludCBscGZjX21lbV9hbGxvYyhzdHJ1Y3QgbHBmY19oYmEgKiwgaW50IGFsaWduKTsKK2ludCBscGZjX21lbV9hbGxvY19hY3RpdmVfcnJxX3Bvb2xfczQoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX21lbV9mcmVlKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19tZW1fZnJlZV9hbGwoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3N0b3BfdnBvcnRfdGltZXJzKHN0cnVjdCBscGZjX3Zwb3J0ICopOwpAQCAtMzk5LDcgKzQwNSw2IEBACiB2b2lkIGxwZmNfdW5ibG9ja19mYWJyaWNfaW9jYnMoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3JhbXBkb3duX3F1ZXVlX2RlcHRoKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19yYW1wX2Rvd25fcXVldWVfaGFuZGxlcihzdHJ1Y3QgbHBmY19oYmEgKik7Ci12b2lkIGxwZmNfcmFtcF91cF9xdWV1ZV9oYW5kbGVyKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19zY3NpX2Rldl9ibG9jayhzdHJ1Y3QgbHBmY19oYmEgKik7CiAKIHZvaWQKQEAgLTQ3MSwzICs0NzYsMjAgQEAKIHVpbnQzMl90IGxwZmNfc2xpX3BvcnRfc3BlZWRfZ2V0KHN0cnVjdCBscGZjX2hiYSAqKTsKIGludCBscGZjX3NsaTRfcmVxdWVzdF9maXJtd2FyZV91cGRhdGUoc3RydWN0IGxwZmNfaGJhICosIHVpbnQ4X3QpOwogdm9pZCBscGZjX3NsaTRfb2ZmbGluZV9lcmF0dChzdHJ1Y3QgbHBmY19oYmEgKik7CisKK3N0cnVjdCBscGZjX2RldmljZV9kYXRhICpscGZjX2NyZWF0ZV9kZXZpY2VfZGF0YShzdHJ1Y3QgbHBmY19oYmEgKiwKKwkJCQkJCXN0cnVjdCBscGZjX25hbWUgKiwKKwkJCQkJCXN0cnVjdCBscGZjX25hbWUgKiwKKwkJCQkJCXVpbnQ2NF90LCBib29sKTsKK3ZvaWQgbHBmY19kZWxldGVfZGV2aWNlX2RhdGEoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX2RldmljZV9kYXRhKik7CitzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqX19scGZjX2dldF9kZXZpY2VfZGF0YShzdHJ1Y3QgbHBmY19oYmEgKiwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCQkJc3RydWN0IGxwZmNfbmFtZSAqLAorCQkJCQlzdHJ1Y3QgbHBmY19uYW1lICosIHVpbnQ2NF90KTsKK2Jvb2wgbHBmY19lbmFibGVfb2FzX2x1bihzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfbmFtZSAqLAorCQkJIHN0cnVjdCBscGZjX25hbWUgKiwgdWludDY0X3QpOworYm9vbCBscGZjX2Rpc2FibGVfb2FzX2x1bihzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfbmFtZSAqLAorCQkJICBzdHJ1Y3QgbHBmY19uYW1lICosIHVpbnQ2NF90KTsKK2Jvb2wgbHBmY19maW5kX25leHRfb2FzX2x1bihzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfbmFtZSAqLAorCQkJICAgIHN0cnVjdCBscGZjX25hbWUgKiwgdWludDY0X3QgKiwgc3RydWN0IGxwZmNfbmFtZSAqLAorCQkJICAgIHN0cnVjdCBscGZjX25hbWUgKiwgdWludDY0X3QgKiwgdWludDMyX3QgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCmluZGV4IGI4MDBjYzkuLjgyOGMwOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCkBAIC0yMjgwLDYgKzIyODAsMTA0IEBACiAJCX0KIAl9CiAKKwlpZiAocGhiYS0+Y2ZnX2ZvZikgeworCQkvKiBGT0YgRVEgKi8KKwkJcXAgPSBwaGJhLT5zbGk0X2hiYS5mb2ZfZXE7CisJCWlmICghcXApCisJCQlnb3RvIG91dDsKKworCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkiXG5GT0YgRVEgaW5mbzogIgorCQkJIkVRLVNUQVRbbWF4OngleCBub0U6eCV4ICIKKwkJCSJiczp4JXggcHJvYzp4JWxseF1cbiIsCisJCQlxcC0+cV9jbnRfMSwgcXAtPnFfY250XzIsCisJCQlxcC0+cV9jbnRfMywgKHVuc2lnbmVkIGxvbmcgbG9uZylxcC0+cV9jbnRfNCk7CisKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJIkVRSURbJTAyZF0sICIKKwkJCSJRRS1DTlRbJTA0ZF0sIFFFLVNJWkVbJTA0ZF0sICIKKwkJCSJIT1NULUlEWFslMDRkXSwgUE9SVC1JRFhbJTA0ZF0iLAorCQkJcXAtPnF1ZXVlX2lkLAorCQkJcXAtPmVudHJ5X2NvdW50LAorCQkJcXAtPmVudHJ5X3NpemUsCisJCQlxcC0+aG9zdF9pbmRleCwKKwkJCXFwLT5oYmFfaW5kZXgpOworCisJCS8qIFJlc2V0IG1heCBjb3VudGVyICovCisJCXFwLT5FUV9tYXhfZXFlID0gMDsKKworCQlsZW4gKz0gIHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLCAiXG4iKTsKKwkJaWYgKGxlbiA+PSBtYXhfY250KQorCQkJZ290byB0b29fYmlnOworCX0KKworCWlmIChwaGJhLT5jZmdfRW5hYmxlWExhbmUpIHsKKworCQkvKiBPQVMgQ1EgKi8KKwkJcXAgPSBwaGJhLT5zbGk0X2hiYS5vYXNfY3E7CisJCWlmIChxcCkgeworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCQkiXHRPQVMgQ1EgaW5mbzogIik7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLAorCQkJCSJBc3NvY0VRSURbJTAyZF06ICIKKwkJCQkiQ1EgU1RBVFttYXg6eCV4IHJlbHc6eCV4ICIKKwkJCQkieGFidDp4JXggd3E6eCVsbHhdXG4iLAorCQkJCXFwLT5hc3NvY19xaWQsCisJCQkJcXAtPnFfY250XzEsIHFwLT5xX2NudF8yLAorCQkJCXFwLT5xX2NudF8zLCAodW5zaWduZWQgbG9uZyBsb25nKXFwLT5xX2NudF80KTsKKwkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkJIlx0Q1FJRFslMDJkXSwgIgorCQkJCSJRRS1DTlRbJTA0ZF0sIFFFLVNJWkVbJTA0ZF0sICIKKwkJCQkiSE9TVC1JRFhbJTA0ZF0sIFBPUlQtSURYWyUwNGRdIiwKKwkJCQlxcC0+cXVldWVfaWQsIHFwLT5lbnRyeV9jb3VudCwKKwkJCQlxcC0+ZW50cnlfc2l6ZSwgcXAtPmhvc3RfaW5kZXgsCisJCQkJcXAtPmhiYV9pbmRleCk7CisKKwkJCS8qIFJlc2V0IG1heCBjb3VudGVyICovCisJCQlxcC0+Q1FfbWF4X2NxZSA9IDA7CisKKwkJCWxlbiArPSAgc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJTFBGQ19RVUVfSU5GT19HRVRfQlVGX1NJWkUtbGVuLCAiXG4iKTsKKwkJCWlmIChsZW4gPj0gbWF4X2NudCkKKwkJCQlnb3RvIHRvb19iaWc7CisJCX0KKworCQkvKiBPQVMgV1EgKi8KKwkJcXAgPSBwaGJhLT5zbGk0X2hiYS5vYXNfd3E7CisJCWlmIChxcCkgeworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCQkiXHRcdE9BUyBXUSBpbmZvOiAiKTsKKwkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sCisJCQkJIkFzc29jQ1FJRFslMDJkXTogIgorCQkJCSJXUS1TVEFUW29mbG93OngleCBwb3N0ZWQ6eCVsbHhdXG4iLAorCQkJCXFwLT5hc3NvY19xaWQsCisJCQkJcXAtPnFfY250XzEsICh1bnNpZ25lZCBsb25nIGxvbmcpcXAtPnFfY250XzQpOworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCUxQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFLWxlbiwKKwkJCQkiXHRcdFdRSURbJTAyZF0sICIKKwkJCQkiUUUtQ05UWyUwNGRdLCBRRS1TSVpFWyUwNGRdLCAiCisJCQkJIkhPU1QtSURYWyUwNGRdLCBQT1JULUlEWFslMDRkXSIsCisJCQkJcXAtPnF1ZXVlX2lkLAorCQkJCXFwLT5lbnRyeV9jb3VudCwKKwkJCQlxcC0+ZW50cnlfc2l6ZSwKKwkJCQlxcC0+aG9zdF9pbmRleCwKKwkJCQlxcC0+aGJhX2luZGV4KTsKKworCQkJbGVuICs9ICBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQlMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRS1sZW4sICJcbiIpOworCQkJaWYgKGxlbiA+PSBtYXhfY250KQorCQkJCWdvdG8gdG9vX2JpZzsKKwkJfQorCX0KK291dDoKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGJ1ZmZlciwgbGVuKTsKIApAQCAtMzkyNyw2ICs0MDI1LDcgQEAKIAlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9IHZwb3J0LT5waGJhOwogCWNoYXIgbmFtZVs2NF07CiAJdWludDMyX3QgbnVtLCBpOworCWJvb2wgcHBvcnRfc2V0dXAgPSBmYWxzZTsKIAogCWlmICghbHBmY19kZWJ1Z2ZzX2VuYWJsZSkKIAkJcmV0dXJuOwpAQCAtMzk0Nyw2ICs0MDQ2LDcgQEAKIAkvKiBTZXR1cCBmdW5jWCBkaXJlY3RvcnkgZm9yIHNwZWNpZmljIEhCQSBQQ0kgZnVuY3Rpb24gKi8KIAlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJmbiVkIiwgcGhiYS0+YnJkX25vKTsKIAlpZiAoIXBoYmEtPmhiYV9kZWJ1Z2ZzX3Jvb3QpIHsKKwkJcHBvcnRfc2V0dXAgPSB0cnVlOwogCQlwaGJhLT5oYmFfZGVidWdmc19yb290ID0KIAkJCWRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBscGZjX2RlYnVnZnNfcm9vdCk7CiAJCWlmICghcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCkgewpAQCAtNDIzOSw2ICs0MzM5LDE0IEBACiAJfQogCiAJLyoKKwkgKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gaXMgZm9yIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMvZmlsZXMgZm9yIHRoZQorCSAqIHBoeXNpY2FsIHBvcnQuCisJICovCisKKwlpZiAoIXBwb3J0X3NldHVwKQorCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKworCS8qCiAJICogaURpYWcgZGVidWdmcyByb290IGVudHJ5IHBvaW50cyBmb3IgU0xJNCBkZXZpY2Ugb25seQogCSAqLwogCWlmIChwaGJhLT5zbGlfcmV2IDwgTFBGQ19TTElfUkVWNCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGlzYy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKaW5kZXggZTQwOWJhNS4uMWE2ZmU1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kaXNjLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogCWF0b21pY190IGNtZF9wZW5kaW5nOwogCXVpbnQzMl90IGNtZF9xZGVwdGg7CiAJdW5zaWduZWQgbG9uZyBsYXN0X2NoYW5nZV90aW1lOwotCXN0cnVjdCBscGZjX25vZGVfcnJxcyBhY3RpdmVfcnJxczsKKwl1bnNpZ25lZCBsb25nICphY3RpdmVfcnJxc194cmlfYml0bWFwOwogCXN0cnVjdCBscGZjX3Njc2ljbWRfYmt0ICpsYXRfZGF0YTsJLyogTGF0ZW5jeSBkYXRhICovCiB9Owogc3RydWN0IGxwZmNfbm9kZV9ycnEgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKaW5kZXggMTEwNDQ1Zi4uNjI0ZmUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCkBAIC0xNTE2LDcgKzE1MTYsNyBAQAogCXVpbnQzMl90IHJjLCBrZWVwRElEID0gMDsKIAlpbnQgIHB1dF9ub2RlOwogCWludCAgcHV0X3Jwb3J0OwotCXN0cnVjdCBscGZjX25vZGVfcnJxcyBycnE7CisJdW5zaWduZWQgbG9uZyAqYWN0aXZlX3JycXNfeHJpX2JpdG1hcCA9IE5VTEw7CiAKIAkvKiBGYWJyaWMgbm9kZXMgY2FuIGhhdmUgdGhlIHNhbWUgV1dQTiBzbyB3ZSBkb24ndCBib3RoZXIgc2VhcmNoaW5nCiAJICogYnkgV1dQTi4gIEp1c3QgcmV0dXJuIHRoZSBuZGxwIHRoYXQgd2FzIGdpdmVuIHRvIHVzLgpAQCAtMTUzNCw3ICsxNTM0LDEzIEBACiAKIAlpZiAobmV3X25kbHAgPT0gbmRscCAmJiBOTFBfQ0hLX05PREVfQUNUKG5ld19uZGxwKSkKIAkJcmV0dXJuIG5kbHA7Ci0JbWVtc2V0KCZycnEueHJpX2JpdG1hcCwgMCwgc2l6ZW9mKG5ld19uZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgeworCQlhY3RpdmVfcnJxc194cmlfYml0bWFwID0gbWVtcG9vbF9hbGxvYyhwaGJhLT5hY3RpdmVfcnJxX3Bvb2wsCisJCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJbWVtc2V0KGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsIDAsCisJCQkgICAgICAgcGhiYS0+Y2ZnX3JycV94cmlfYml0bWFwX3N6KTsKKwl9CiAKIAlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19FTFMsCiAJCSAiMzE3OCBQTE9HSSBjb25maXJtOiBuZGxwICVwIHgleDogbmV3X25kbHAgJXBcbiIsCkBAIC0xNTQzLDQxICsxNTQ5LDU4IEBACiAJaWYgKCFuZXdfbmRscCkgewogCQlyYyA9IG1lbWNtcCgmbmRscC0+bmxwX3BvcnRuYW1lLCBuYW1lLAogCQkJICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7Ci0JCWlmICghcmMpCisJCWlmICghcmMpIHsKKwkJCWlmIChhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJCW1lbXBvb2xfZnJlZShhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJCQkgICAgIHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCk7CiAJCQlyZXR1cm4gbmRscDsKKwkJfQogCQluZXdfbmRscCA9IG1lbXBvb2xfYWxsb2MocGhiYS0+bmxwX21lbV9wb29sLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFuZXdfbmRscCkKKwkJaWYgKCFuZXdfbmRscCkgeworCQkJaWYgKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQkJbWVtcG9vbF9mcmVlKGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkJCSAgICAgcGhiYS0+YWN0aXZlX3JycV9wb29sKTsKIAkJCXJldHVybiBuZGxwOworCQl9CiAJCWxwZmNfbmxwX2luaXQodnBvcnQsIG5ld19uZGxwLCBuZGxwLT5ubHBfRElEKTsKIAl9IGVsc2UgaWYgKCFOTFBfQ0hLX05PREVfQUNUKG5ld19uZGxwKSkgewogCQlyYyA9IG1lbWNtcCgmbmRscC0+bmxwX3BvcnRuYW1lLCBuYW1lLAogCQkJICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7Ci0JCWlmICghcmMpCisJCWlmICghcmMpIHsKKwkJCWlmIChhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJCW1lbXBvb2xfZnJlZShhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJCQkgICAgIHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCk7CiAJCQlyZXR1cm4gbmRscDsKKwkJfQogCQluZXdfbmRscCA9IGxwZmNfZW5hYmxlX25vZGUodnBvcnQsIG5ld19uZGxwLAogCQkJCQkJTkxQX1NURV9VTlVTRURfTk9ERSk7Ci0JCWlmICghbmV3X25kbHApCisJCWlmICghbmV3X25kbHApIHsKKwkJCWlmIChhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJCW1lbXBvb2xfZnJlZShhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJCQkgICAgIHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCk7CiAJCQlyZXR1cm4gbmRscDsKKwkJfQogCQlrZWVwRElEID0gbmV3X25kbHAtPm5scF9ESUQ7Ci0JCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCi0JCQltZW1jcHkoJnJycS54cmlfYml0bWFwLAotCQkJCSZuZXdfbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCwKLQkJCQlzaXplb2YobmV3X25kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKTsKKwkJaWYgKChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpICYmIGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQltZW1jcHkoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBuZXdfbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBwaGJhLT5jZmdfcnJxX3hyaV9iaXRtYXBfc3opOwogCX0gZWxzZSB7CiAJCWtlZXBESUQgPSBuZXdfbmRscC0+bmxwX0RJRDsKLQkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKLQkJCW1lbWNweSgmcnJxLnhyaV9iaXRtYXAsCi0JCQkJJm5ld19uZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwLAotCQkJCXNpemVvZihuZXdfbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpOworCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0ICYmCisJCSAgICBhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJbWVtY3B5KGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgbmV3X25kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgcGhiYS0+Y2ZnX3JycV94cmlfYml0bWFwX3N6KTsKIAl9CiAKIAlscGZjX3VucmVnX3JwaSh2cG9ydCwgbmV3X25kbHApOwogCW5ld19uZGxwLT5ubHBfRElEID0gbmRscC0+bmxwX0RJRDsKIAluZXdfbmRscC0+bmxwX3ByZXZfc3RhdGUgPSBuZGxwLT5ubHBfcHJldl9zdGF0ZTsKIAlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQotCQltZW1jcHkobmV3X25kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXAsCi0JCQkmbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCwKLQkJCXNpemVvZihuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSk7CisJCW1lbWNweShuZXdfbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJICAgICAgIG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCSAgICAgICBwaGJhLT5jZmdfcnJxX3hyaV9iaXRtYXBfc3opOwogCiAJaWYgKG5kbHAtPm5scF9mbGFnICYgTkxQX05QUl8yQl9ESVNDKQogCQluZXdfbmRscC0+bmxwX2ZsYWcgfD0gTkxQX05QUl8yQl9ESVNDOwpAQCAtMTYxOSwxMCArMTY0MiwxMSBAQAogCiAJCS8qIFR3byBuZGxwcyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBkaWQgb24gdGhlIG5vZGVsaXN0ICovCiAJCW5kbHAtPm5scF9ESUQgPSBrZWVwRElEOwotCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQotCQkJbWVtY3B5KCZuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwLAotCQkJCSZycnEueHJpX2JpdG1hcCwKLQkJCQlzaXplb2YobmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpOworCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0ICYmCisJCSAgICBhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQkJbWVtY3B5KG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkgICAgICAgYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBwaGJhLT5jZmdfcnJxX3hyaV9iaXRtYXBfc3opOwogCQlscGZjX2Ryb3Bfbm9kZSh2cG9ydCwgbmRscCk7CiAJfQogCWVsc2UgewpAQCAtMTYzNCwxMCArMTY1OCwxMSBAQAogCiAJCS8qIFR3byBuZGxwcyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBkaWQgKi8KIAkJbmRscC0+bmxwX0RJRCA9IGtlZXBESUQ7Ci0JCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCi0JCQltZW1jcHkoJm5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXAsCi0JCQkJJnJycS54cmlfYml0bWFwLAotCQkJCXNpemVvZihuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSk7CisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQgJiYKKwkJICAgIGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCQltZW1jcHkobmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgICBhY3RpdmVfcnJxc194cmlfYml0bWFwLAorCQkJICAgICAgIHBoYmEtPmNmZ19ycnFfeHJpX2JpdG1hcF9zeik7CiAKIAkJLyogU2luY2Ugd2UgYXJlIHN3YXBwaW5nIHRoZSBuZGxwIHBhc3NlZCBpbiB3aXRoIHRoZSBuZXcgb25lCiAJCSAqIGFuZCB0aGUgZGlkIGhhcyBhbHJlYWR5IGJlZW4gc3dhcHBlZCwgY29weSBvdmVyIHN0YXRlLgpAQCAtMTY2OCw2ICsxNjkzLDEwIEBACiAJCQkJcHV0X2RldmljZSgmcnBvcnQtPmRldik7CiAJCX0KIAl9CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCAmJgorCSAgICBhY3RpdmVfcnJxc194cmlfYml0bWFwKQorCQltZW1wb29sX2ZyZWUoYWN0aXZlX3JycXNfeHJpX2JpdG1hcCwKKwkJCSAgICAgcGhiYS0+YWN0aXZlX3JycV9wb29sKTsKIAlyZXR1cm4gbmV3X25kbHA7CiB9CiAKQEAgLTI3NzIsNiArMjgwMSw3IEBACiAJLyogVGhpcyB3aWxsIGNhdXNlIHRoZSBjYWxsYmFjay1mdW5jdGlvbiBscGZjX2NtcGxfZWxzX2NtZCB0bwogCSAqIHRyaWdnZXIgdGhlIHJlbGVhc2Ugb2Ygbm9kZS4KIAkgKi8KKwogCWxwZmNfbmxwX3B1dChuZGxwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTYxOTMsMTEgKzYyMjMsMTEgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2cG9ydC0+d29ya19wb3J0X2xvY2ssIGlmbGFnKTsKIAl0bW9fcG9zdGVkID0gdnBvcnQtPndvcmtfcG9ydF9ldmVudHMgJiBXT1JLRVJfRUxTX1RNTzsKLQlpZiAoIXRtb19wb3N0ZWQpCisJaWYgKCghdG1vX3Bvc3RlZCkgJiYgKCEodnBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpKQogCQl2cG9ydC0+d29ya19wb3J0X2V2ZW50cyB8PSBXT1JLRVJfRUxTX1RNTzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cG9ydC0+d29ya19wb3J0X2xvY2ssIGlmbGFnKTsKIAotCWlmICghdG1vX3Bvc3RlZCkKKwlpZiAoKCF0bW9fcG9zdGVkKSAmJiAoISh2cG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkpCiAJCWxwZmNfd29ya2VyX3dha2VfdXAocGhiYSk7CiAJcmV0dXJuOwogfQpAQCAtNjIyMywxOSArNjI1MywyNiBAQAogCXVpbnQzMl90IGVsc19jb21tYW5kID0gMDsKIAl1aW50MzJfdCB0aW1lb3V0OwogCXVpbnQzMl90IHJlbW90ZV9JRCA9IDB4ZmZmZmZmZmY7Ci0JTElTVF9IRUFEKHR4Y21wbHFfY29tcGxldGlvbnMpOwogCUxJU1RfSEVBRChhYm9ydF9saXN0KTsKIAogCiAJdGltZW91dCA9ICh1aW50MzJfdCkocGhiYS0+ZmNfcmF0b3YgPDwgMSk7CiAKIAlwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKLQorCWlmICgocGhiYS0+cHBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpCisJCXJldHVybjsKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlsaXN0X3NwbGljZV9pbml0KCZwcmluZy0+dHhjbXBscSwgJnR4Y21wbHFfY29tcGxldGlvbnMpOwotCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl9sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZ0eGNtcGxxX2NvbXBsZXRpb25zLCBsaXN0KSB7CisJaWYgKChwaGJhLT5wcG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkgeworCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQkJc3Bpbl91bmxvY2soJnByaW5nLT5yaW5nX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJnByaW5nLT50eGNtcGxxLCBsaXN0KSB7CiAJCWNtZCA9ICZwaW9jYi0+aW9jYjsKIAogCQlpZiAoKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX0xJQkRGQykgIT0gMCB8fApAQCAtNjI3NCwxMSArNjMxMSwxMiBAQAogCQl9CiAJCWxpc3RfYWRkX3RhaWwoJnBpb2NiLT5kbGlzdCwgJmFib3J0X2xpc3QpOwogCX0KLQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlsaXN0X3NwbGljZSgmdHhjbXBscV9jb21wbGV0aW9ucywgJnByaW5nLT50eGNtcGxxKTsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX3VubG9jaygmcHJpbmctPnJpbmdfbG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZhYm9ydF9saXN0LCBkbGlzdCkgeworCQljbWQgPSAmcGlvY2ItPmlvY2I7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRUxTLAogCQkJICIwMTI3IEVMUyB0aW1lb3V0IERhdGE6IHgleCB4JXggeCV4ICIKIAkJCSAieCV4XG4iLCBlbHNfY29tbWFuZCwKQEAgLTYyOTAsOCArNjMyOCw5IEBACiAJfQogCiAJaWYgKCFsaXN0X2VtcHR5KCZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXS50eGNtcGxxKSkKLQkJbW9kX3RpbWVyKCZ2cG9ydC0+ZWxzX3Rtb2Z1bmMsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDAgKiB0aW1lb3V0KSk7CisJCWlmICghKHBoYmEtPnBwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKQorCQkJbW9kX3RpbWVyKCZ2cG9ydC0+ZWxzX3Rtb2Z1bmMsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwICogdGltZW91dCkpOwogfQogCiAvKioKQEAgLTYzMTcsMTUgKzYzNTYsNTAgQEAKIHZvaWQKIGxwZmNfZWxzX2ZsdXNoX2NtZChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQpCiB7Ci0JTElTVF9IRUFEKGNvbXBsZXRpb25zKTsKKwlMSVNUX0hFQUQoYWJvcnRfbGlzdCk7CiAJc3RydWN0IGxwZmNfaGJhICAqcGhiYSA9IHZwb3J0LT5waGJhOwogCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKIAlzdHJ1Y3QgbHBmY19pb2NicSAqdG1wX2lvY2IsICpwaW9jYjsKIAlJT0NCX3QgKmNtZCA9IE5VTEw7CiAKIAlscGZjX2ZhYnJpY19hYm9ydF92cG9ydCh2cG9ydCk7CisJLyoKKwkgKiBGb3IgU0xJMywgb25seSB0aGUgaGJhbG9jayBpcyByZXF1aXJlZC4gIEJ1dCBTTEk0IG5lZWRzIHRvIGNvb3JkaW5hdGUKKwkgKiB3aXRoIHRoZSByaW5nIGluc2VydCBvcGVyYXRpb24uICBCZWNhdXNlIGxwZmNfc2xpX2lzc3VlX2Fib3J0X2lvdGFnCisJICogdWx0aW1hdGVseSBncmFicyB0aGUgcmluZ19sb2NrLCB0aGUgZHJpdmVyIG11c3Qgc3BsaWNlIHRoZSBsaXN0IGludG8KKwkgKiBhIHdvcmtpbmcgbGlzdCBhbmQgcmVsZWFzZSB0aGUgbG9ja3MgYmVmb3JlIGNhbGxpbmcgdGhlIGFib3J0LgorCSAqLworCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fbG9jaygmcHJpbmctPnJpbmdfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmcHJpbmctPnR4Y21wbHEsIGxpc3QpIHsKKwkJaWYgKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX0lPX0xJQkRGQykKKwkJCWNvbnRpbnVlOworCisJCWlmIChwaW9jYi0+dnBvcnQgIT0gdnBvcnQpCisJCQljb250aW51ZTsKKwkJbGlzdF9hZGRfdGFpbCgmcGlvY2ItPmRsaXN0LCAmYWJvcnRfbGlzdCk7CisJfQorCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fdW5sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCS8qIEFib3J0IGVhY2ggaW9jYiBvbiB0aGUgYWJvcnRlZCBsaXN0IGFuZCByZW1vdmUgdGhlIGRsaXN0IGxpbmtzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZhYm9ydF9saXN0LCBkbGlzdCkgeworCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmcGlvY2ItPmRsaXN0KTsKKwkJbHBmY19zbGlfaXNzdWVfYWJvcnRfaW90YWcocGhiYSwgcHJpbmcsIHBpb2NiKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZhYm9ydF9saXN0KSkKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19FTFMsCisJCQkJICIzMzg3IGFib3J0IGxpc3QgZm9yIHR4cSBub3QgZW1wdHlcbiIpOworCUlOSVRfTElTVF9IRUFEKCZhYm9ydF9saXN0KTsKIAogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fbG9jaygmcHJpbmctPnJpbmdfbG9jayk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGlvY2IsIHRtcF9pb2NiLCAmcHJpbmctPnR4cSwgbGlzdCkgewogCQljbWQgPSAmcGlvY2ItPmlvY2I7CiAKQEAgLTYzNDMsMjQgKzY0MTcsMTYgQEAKIAkJaWYgKHBpb2NiLT52cG9ydCAhPSB2cG9ydCkKIAkJCWNvbnRpbnVlOwogCi0JCWxpc3RfbW92ZV90YWlsKCZwaW9jYi0+bGlzdCwgJmNvbXBsZXRpb25zKTsKKwkJbGlzdF9kZWxfaW5pdCgmcGlvY2ItPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwaW9jYi0+bGlzdCwgJmFib3J0X2xpc3QpOwogCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZwcmluZy0+dHhjbXBscSwgbGlzdCkgewotCQlpZiAocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfSU9fTElCREZDKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChwaW9jYi0+dnBvcnQgIT0gdnBvcnQpCi0JCQljb250aW51ZTsKLQotCQlscGZjX3NsaV9pc3N1ZV9hYm9ydF9pb3RhZyhwaGJhLCBwcmluZywgcGlvY2IpOwotCX0KKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX3VubG9jaygmcHJpbmctPnJpbmdfbG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAogCS8qIENhbmNlbGwgYWxsIHRoZSBJT0NCcyBmcm9tIHRoZSBjb21wbGV0aW9ucyBsaXN0ICovCi0JbHBmY19zbGlfY2FuY2VsX2lvY2JzKHBoYmEsICZjb21wbGV0aW9ucywgSU9TVEFUX0xPQ0FMX1JFSkVDVCwKLQkJCSAgICAgIElPRVJSX1NMSV9BQk9SVEVEKTsKKwlscGZjX3NsaV9jYW5jZWxfaW9jYnMocGhiYSwgJmFib3J0X2xpc3QsCisJCQkgICAgICBJT1NUQVRfTE9DQUxfUkVKRUNULCBJT0VSUl9TTElfQUJPUlRFRCk7CiAKIAlyZXR1cm47CiB9CkBAIC02Mzg1LDM1ICs2NDUxLDkgQEAKIHZvaWQKIGxwZmNfZWxzX2ZsdXNoX2FsbF9jbWQoc3RydWN0IGxwZmNfaGJhICAqcGhiYSkKIHsKLQlMSVNUX0hFQUQoY29tcGxldGlvbnMpOwotCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKLQlzdHJ1Y3QgbHBmY19pb2NicSAqdG1wX2lvY2IsICpwaW9jYjsKLQlJT0NCX3QgKmNtZCA9IE5VTEw7Ci0KLQlscGZjX2ZhYnJpY19hYm9ydF9oYmEocGhiYSk7Ci0Jc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBpb2NiLCB0bXBfaW9jYiwgJnByaW5nLT50eHEsIGxpc3QpIHsKLQkJY21kID0gJnBpb2NiLT5pb2NiOwotCQlpZiAocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfSU9fTElCREZDKQotCQkJY29udGludWU7Ci0JCS8qIERvIG5vdCBmbHVzaCBvdXQgdGhlIFFVRV9SSU5HIGFuZCBBQk9SVC9DTE9TRSBpb2NicyAqLwotCQlpZiAoY21kLT51bHBDb21tYW5kID09IENNRF9RVUVfUklOR19CVUZfQ04gfHwKLQkJICAgIGNtZC0+dWxwQ29tbWFuZCA9PSBDTURfUVVFX1JJTkdfQlVGNjRfQ04gfHwKLQkJICAgIGNtZC0+dWxwQ29tbWFuZCA9PSBDTURfQ0xPU0VfWFJJX0NOIHx8Ci0JCSAgICBjbWQtPnVscENvbW1hbmQgPT0gQ01EX0FCT1JUX1hSSV9DTikKLQkJCWNvbnRpbnVlOwotCQlsaXN0X21vdmVfdGFpbCgmcGlvY2ItPmxpc3QsICZjb21wbGV0aW9ucyk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW9jYiwgdG1wX2lvY2IsICZwcmluZy0+dHhjbXBscSwgbGlzdCkgewotCQlpZiAocGlvY2ItPmlvY2JfZmxhZyAmIExQRkNfSU9fTElCREZDKQotCQkJY29udGludWU7Ci0JCWxwZmNfc2xpX2lzc3VlX2Fib3J0X2lvdGFnKHBoYmEsIHByaW5nLCBwaW9jYik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0KLQkvKiBDYW5jZWwgYWxsIHRoZSBJT0NCcyBmcm9tIHRoZSBjb21wbGV0aW9ucyBsaXN0ICovCi0JbHBmY19zbGlfY2FuY2VsX2lvY2JzKHBoYmEsICZjb21wbGV0aW9ucywgSU9TVEFUX0xPQ0FMX1JFSkVDVCwKLQkJCSAgICAgIElPRVJSX1NMSV9BQk9SVEVEKTsKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cG9ydCwgJnBoYmEtPnBvcnRfbGlzdCwgbGlzdGVudHJ5KQorCQlscGZjX2Vsc19mbHVzaF9jbWQodnBvcnQpOwogCiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCA4ODNlYTJkLi41OWI1MWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtNjc0LDggKzY3NCw2IEBACiAJCQkJbHBmY19mZG1pX3RpbWVvdXRfaGFuZGxlcih2cG9ydCk7CiAJCQlpZiAod29ya19wb3J0X2V2ZW50cyAmIFdPUktFUl9SQU1QX0RPV05fUVVFVUUpCiAJCQkJbHBmY19yYW1wX2Rvd25fcXVldWVfaGFuZGxlcihwaGJhKTsKLQkJCWlmICh3b3JrX3BvcnRfZXZlbnRzICYgV09SS0VSX1JBTVBfVVBfUVVFVUUpCi0JCQkJbHBmY19yYW1wX3VwX3F1ZXVlX2hhbmRsZXIocGhiYSk7CiAJCQlpZiAod29ya19wb3J0X2V2ZW50cyAmIFdPUktFUl9ERUxBWUVEX0RJU0NfVE1PKQogCQkJCWxwZmNfZGVsYXllZF9kaXNjX3RpbWVvdXRfaGFuZGxlcih2cG9ydCk7CiAJCX0KQEAgLTI1NDUsOCArMjU0MywxMSBAQAogCWlmICghbmV3X2ZjZl9yZWNvcmQpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0ZJUCwKIAkJCQkiMjc2NiBNYWlsYm94IGNvbW1hbmQgUkVBRF9GQ0ZfUkVDT1JEICIKLQkJCQkiZmFpbGVkIHRvIHJldHJpZXZlIGEgRkNGIHJlY29yZC5cbiIpOwotCQlnb3RvIGVycm9yX291dDsKKwkJCQkiZmFpbGVkIHRvIHJldHJpZXZlIGEgRkNGIHJlY29yZC4gIgorCQkJCSJoYmFfZmxnIHgleCBmY2ZfZmxnIHgleFxuIiwgcGhiYS0+aGJhX2ZsYWcsCisJCQkJcGhiYS0+ZmNmLmZjZl9mbGFnKTsKKwkJbHBmY191bnJlZ2lzdGVyX2ZjZl9yZXNjYW4ocGhiYSk7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qIEdldCB0aGUgbmVlZGVkIHBhcmFtZXRlcnMgZnJvbSBGQ0YgcmVjb3JkICovCkBAIC0zOTczLDcgKzM5NzQsMTAgQEAKIAkJdnBvcnQtPmZjX21hcF9jbnQgKz0gY291bnQ7CiAJCWJyZWFrOwogCWNhc2UgTkxQX1NURV9OUFJfTk9ERToKLQkJdnBvcnQtPmZjX25wcl9jbnQgKz0gY291bnQ7CisJCWlmICh2cG9ydC0+ZmNfbnByX2NudCA9PSAwICYmIGNvdW50ID09IC0xKQorCQkJdnBvcnQtPmZjX25wcl9jbnQgPSAwOworCQllbHNlCisJCQl2cG9ydC0+ZmNfbnByX2NudCArPSBjb3VudDsKIAkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKQEAgLTQxODAsNiArNDE4NCw3IEBACiAJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7CiAJdWludDMyX3QgZGlkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAqYWN0aXZlX3JycXNfeHJpX2JpdG1hcCA9IE5VTEw7CiAKIAlpZiAoIW5kbHApCiAJCXJldHVybiBOVUxMOwpAQCAtNDIwOCwxMiArNDIxMywxNyBAQAogCiAJLyogS2VlcCB0aGUgb3JpZ2luYWwgRElEICovCiAJZGlkID0gbmRscC0+bmxwX0RJRDsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlhY3RpdmVfcnJxc194cmlfYml0bWFwID0gbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcDsKIAogCS8qIHJlLWluaXRpYWxpemUgbmRscCBleGNlcHQgb2YgbmRscCBsaW5rZWQgbGlzdCBwb2ludGVyICovCiAJbWVtc2V0KCgoKGNoYXIgKiluZGxwKSArIHNpemVvZiAoc3RydWN0IGxpc3RfaGVhZCkpLCAwLAogCQlzaXplb2YgKHN0cnVjdCBscGZjX25vZGVsaXN0KSAtIHNpemVvZiAoc3RydWN0IGxpc3RfaGVhZCkpOwogCWxwZmNfaW5pdGlhbGl6ZV9ub2RlKHZwb3J0LCBuZGxwLCBkaWQpOwogCisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCA9IGFjdGl2ZV9ycnFzX3hyaV9iaXRtYXA7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5uZGxwX2xvY2ssIGZsYWdzKTsKIAlpZiAodnBvcnQtPnBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKIAkJbmRscC0+bmxwX3JwaSA9IGxwZmNfc2xpNF9hbGxvY19ycGkodnBvcnQtPnBoYmEpOwpAQCAtNDc5OSw5ICs0ODA5LDEwIEBACiAJCQkJICgodWludDMyX3QpIG5kbHAtPm5scF9ycGkgJiAweGZmKSk7CiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19OT0RFLAogCQkJCQkgIjA5MjkgRklORCBub2RlIERJRCAiCi0JCQkJCSAiRGF0YTogeCVwIHgleCB4JXggeCV4XG4iLAorCQkJCQkgIkRhdGE6IHglcCB4JXggeCV4IHgleCAlcFxuIiwKIAkJCQkJIG5kbHAsIG5kbHAtPm5scF9ESUQsCi0JCQkJCSBuZGxwLT5ubHBfZmxhZywgZGF0YTEpOworCQkJCQkgbmRscC0+bmxwX2ZsYWcsIGRhdGExLAorCQkJCQkgbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCk7CiAJCQlyZXR1cm4gbmRscDsKIAkJfQogCX0KQEAgLTU2MTgsOCArNTYyOSwxMyBAQAogCiAJbHBmY19pbml0aWFsaXplX25vZGUodnBvcnQsIG5kbHAsIGRpZCk7CiAJSU5JVF9MSVNUX0hFQUQoJm5kbHAtPm5scF9saXN0cCk7Ci0JaWYgKHZwb3J0LT5waGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJaWYgKHZwb3J0LT5waGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpIHsKIAkJbmRscC0+bmxwX3JwaSA9IGxwZmNfc2xpNF9hbGxvY19ycGkodnBvcnQtPnBoYmEpOworCQluZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwID0KKwkJCQltZW1wb29sX2FsbG9jKHZwb3J0LT5waGJhLT5hY3RpdmVfcnJxX3Bvb2wsCisJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCX0KKwogCiAKIAlscGZjX2RlYnVnZnNfZGlzY190cmModnBvcnQsIExQRkNfRElTQ19UUkNfTk9ERSwKQEAgLTU2NjQsNiArNTY4MCw5IEBACiAJLyogZnJlZSBuZGxwIG1lbW9yeSBmb3IgZmluYWwgbmRscCByZWxlYXNlICovCiAJaWYgKE5MUF9DSEtfRlJFRV9SRVEobmRscCkpIHsKIAkJa2ZyZWUobmRscC0+bGF0X2RhdGEpOworCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQkJbWVtcG9vbF9mcmVlKG5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXAsCisJCQkJICAgICBuZGxwLT5waGJhLT5hY3RpdmVfcnJxX3Bvb2wpOwogCQltZW1wb29sX2ZyZWUobmRscCwgbmRscC0+cGhiYS0+bmxwX21lbV9wb29sKTsKIAl9CiB9CkBAIC02MTcwLDEwICs2MTg5LDYgQEAKIAogCQltZW1jcHkoJmNvbm5fZW50cnktPmNvbm5fcmVjLCAmY29ubl9yZWNbaV0sCiAJCQlzaXplb2Yoc3RydWN0IGxwZmNfZmNmX2Nvbm5fcmVjKSk7Ci0JCWNvbm5fZW50cnktPmNvbm5fcmVjLnZsYW5fdGFnID0KLQkJCWNvbm5fZW50cnktPmNvbm5fcmVjLnZsYW5fdGFnOwotCQljb25uX2VudHJ5LT5jb25uX3JlYy5mbGFncyA9Ci0JCQljb25uX2VudHJ5LT5jb25uX3JlYy5mbGFnczsKIAkJbGlzdF9hZGRfdGFpbCgmY29ubl9lbnRyeS0+bGlzdCwKIAkJCSZwaGJhLT5mY2ZfY29ubl9yZWNfbGlzdCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCmluZGV4IDZmOTI3ZDMuLjNkOTQzOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICNkZWZpbmUgTFBGQ19FWFRSQV9SSU5HICAgICAgICAgIDEJLyogcmluZyAxIGZvciBvdGhlciBwcm90b2NvbHMgKi8KICNkZWZpbmUgTFBGQ19FTFNfUklORyAgICAgICAgICAgIDIJLyogcmluZyAyIGZvciBFTFMgY29tbWFuZHMgKi8KICNkZWZpbmUgTFBGQ19GQ1BfTkVYVF9SSU5HICAgICAgIDMKKyNkZWZpbmUgTFBGQ19GQ1BfT0FTX1JJTkcgICAgICAgIDMKIAogI2RlZmluZSBTTEkyX0lPQ0JfQ01EX1IwX0VOVFJJRVMgICAgMTcyCS8qIFNMSS0yIEZDUCBjb21tYW5kIHJpbmcgZW50cmllcyAqLwogI2RlZmluZSBTTEkyX0lPQ0JfUlNQX1IwX0VOVFJJRVMgICAgMTM0CS8qIFNMSS0yIEZDUCByZXNwb25zZSByaW5nIGVudHJpZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCmluZGV4IDU0NjRiMTEuLmZkNzlmN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaApAQCAtMjYxNiw2ICsyNjE2LDkgQEAKICNkZWZpbmUgY2ZnX3Bod3FfU0hJRlQJCQkJMTUKICNkZWZpbmUgY2ZnX3Bod3FfTUFTSwkJCQkweDAwMDAwMDAxCiAjZGVmaW5lIGNmZ19waHdxX1dPUkQJCQkJd29yZDEyCisjZGVmaW5lIGNmZ19vYXNfU0hJRlQJCQkJMjUKKyNkZWZpbmUgY2ZnX29hc19NQVNLCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgY2ZnX29hc19XT1JECQkJCXdvcmQxMgogI2RlZmluZSBjZmdfbG9vcGJrX3Njb3BlX1NISUZUCQkJMjgKICNkZWZpbmUgY2ZnX2xvb3Bia19zY29wZV9NQVNLCQkJMHgwMDAwMDAwZgogI2RlZmluZSBjZmdfbG9vcGJrX3Njb3BlX1dPUkQJCQl3b3JkMTIKQEAgLTMzMjIsNiArMzMyNSw5IEBACiAjZGVmaW5lIHdxZV9lYmRlX2NudF9TSElGVCAgICAwCiAjZGVmaW5lIHdxZV9lYmRlX2NudF9NQVNLICAgICAweDAwMDAwMDBmCiAjZGVmaW5lIHdxZV9lYmRlX2NudF9XT1JEICAgICB3b3JkMTAKKyNkZWZpbmUgd3FlX29hc19TSElGVCAgICAgICAgIDYKKyNkZWZpbmUgd3FlX29hc19NQVNLICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgd3FlX29hc19XT1JEICAgICAgICAgIHdvcmQxMAogI2RlZmluZSB3cWVfbGVubG9jX1NISUZUICAgICAgNwogI2RlZmluZSB3cWVfbGVubG9jX01BU0sgICAgICAgMHgwMDAwMDAwMwogI2RlZmluZSB3cWVfbGVubG9jX1dPUkQgICAgICAgd29yZDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCmluZGV4IDY4Yzk0Y2MuLjYzNWVlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCkBAIC04MCw2ICs4MCw3IEBACiBzdGF0aWMgdm9pZCBscGZjX3NsaTRfY3FfZXZlbnRfcmVsZWFzZV9hbGwoc3RydWN0IGxwZmNfaGJhICopOwogc3RhdGljIHZvaWQgbHBmY19zbGk0X2Rpc2FibGVfaW50cihzdHJ1Y3QgbHBmY19oYmEgKik7CiBzdGF0aWMgdWludDMyX3QgbHBmY19zbGk0X2VuYWJsZV9pbnRyKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MzJfdCk7CitzdGF0aWMgdm9pZCBscGZjX3NsaTRfb2FzX3ZlcmlmeShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpOwogCiBzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpscGZjX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpscGZjX3Zwb3J0X3RyYW5zcG9ydF90ZW1wbGF0ZSA9IE5VTEw7CkBAIC0xMDA1LDkgKzEwMDYsMTQgQEAKIAogCXBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopcHRyOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5wcG9ydC0+d29ya19wb3J0X2xvY2ssIGlmbGFnKTsKLQlwaGJhLT5oYmFfZmxhZyB8PSBIQkFfUlJRX0FDVElWRTsKKwlpZiAoIShwaGJhLT5wcG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkKKwkJcGhiYS0+aGJhX2ZsYWcgfD0gSEJBX1JSUV9BQ1RJVkU7CisJZWxzZQorCQlwaGJhLT5oYmFfZmxhZyAmPSB+SEJBX1JSUV9BQ1RJVkU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9sb2NrLCBpZmxhZyk7Ci0JbHBmY193b3JrZXJfd2FrZV91cChwaGJhKTsKKworCWlmICghKHBoYmEtPnBwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKQorCQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOwogfQogCiAvKioKQEAgLTE0NjgsNyArMTQ3NCw4IEBACiAgKiBmb3IgaGFuZGxpbmcgcG9zc2libGUgcG9ydCByZXNvdXJjZSBjaGFuZ2UuCiAgKiovCiBzdGF0aWMgaW50Ci1scGZjX3NsaTRfcG9ydF9zdGFfZm5fcmVzZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBpbnQgbWJ4X2FjdGlvbikKK2xwZmNfc2xpNF9wb3J0X3N0YV9mbl9yZXNldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGludCBtYnhfYWN0aW9uLAorCQkJICAgIGJvb2wgZW5fcm5fbXNnKQogewogCWludCByYzsKIAl1aW50MzJfdCBpbnRyX21vZGU7CkBAIC0xNDgwLDkgKzE0ODcsMTAgQEAKIAlyYyA9IGxwZmNfc2xpNF9wZGV2X3N0YXR1c19yZWdfd2FpdChwaGJhKTsKIAlpZiAoIXJjKSB7CiAJCS8qIG5lZWQgcmVzZXQ6IGF0dGVtcHQgZm9yIHBvcnQgcmVjb3ZlcnkgKi8KLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMjg4NyBSZXNldCBOZWVkZWQ6IEF0dGVtcHRpbmcgUG9ydCAiCi0JCQkJIlJlY292ZXJ5Li4uXG4iKTsKKwkJaWYgKGVuX3JuX21zZykKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSIyODg3IFJlc2V0IE5lZWRlZDogQXR0ZW1wdGluZyBQb3J0ICIKKwkJCQkJIlJlY292ZXJ5Li4uXG4iKTsKIAkJbHBmY19vZmZsaW5lX3ByZXAocGhiYSwgbWJ4X2FjdGlvbik7CiAJCWxwZmNfb2ZmbGluZShwaGJhKTsKIAkJLyogcmVsZWFzZSBpbnRlcnJ1cHQgZm9yIHBvc3NpYmxlIHJlc291cmNlIGNoYW5nZSAqLwpAQCAtMTUyMiw2ICsxNTMwLDcgQEAKIAl1aW50MzJfdCByZWdfZXJyMSwgcmVnX2VycjI7CiAJdWludDMyX3QgdWVycmxvX3JlZywgdWVtYXNrbG9fcmVnOwogCXVpbnQzMl90IHBjaV9yZF9yYzEsIHBjaV9yZF9yYzI7CisJYm9vbCBlbl9ybl9tc2cgPSB0cnVlOwogCWludCByYzsKIAogCS8qIElmIHRoZSBwY2kgY2hhbm5lbCBpcyBvZmZsaW5lLCBpZ25vcmUgcG9zc2libGUgZXJyb3JzLCBzaW5jZQpAQCAtMTU3MiwxMCArMTU4MSwxMiBAQAogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHJlZ19lcnIxID09IFNMSVBPUlRfRVJSMV9SRUdfRVJSX0NPREVfMiAmJgotCQkgICAgcmVnX2VycjIgPT0gU0xJUE9SVF9FUlIyX1JFR19GV19SRVNUQVJUKQorCQkgICAgcmVnX2VycjIgPT0gU0xJUE9SVF9FUlIyX1JFR19GV19SRVNUQVJUKSB7CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCQkiMzE0MyBQb3J0IERvd246IEZpcm13YXJlIFJlc3RhcnRlZFxuIik7Ci0JCWVsc2UgaWYgKHJlZ19lcnIxID09IFNMSVBPUlRfRVJSMV9SRUdfRVJSX0NPREVfMiAmJgorCQkJCQkiMzE0MyBQb3J0IERvd246IEZpcm13YXJlIFVwZGF0ZSAiCisJCQkJCSJEZXRlY3RlZFxuIik7CisJCQllbl9ybl9tc2cgPSBmYWxzZTsKKwkJfSBlbHNlIGlmIChyZWdfZXJyMSA9PSBTTElQT1JUX0VSUjFfUkVHX0VSUl9DT0RFXzIgJiYKIAkJCSByZWdfZXJyMiA9PSBTTElQT1JUX0VSUjJfUkVHX0ZPUkNFRF9EVU1QKQogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKIAkJCQkJIjMxNDQgUG9ydCBEb3duOiBEZWJ1ZyBEdW1wXG4iKTsKQEAgLTE1ODUsNyArMTU5Niw4IEBACiAJCQkJCSIzMTQ1IFBvcnQgRG93bjogUHJvdmlzaW9uaW5nXG4iKTsKIAogCQkvKiBDaGVjayBwb3J0IHN0YXR1cyByZWdpc3RlciBmb3IgZnVuY3Rpb24gcmVzZXQgKi8KLQkJcmMgPSBscGZjX3NsaTRfcG9ydF9zdGFfZm5fcmVzZXQocGhiYSwgTFBGQ19NQlhfTk9fV0FJVCk7CisJCXJjID0gbHBmY19zbGk0X3BvcnRfc3RhX2ZuX3Jlc2V0KHBoYmEsIExQRkNfTUJYX05PX1dBSVQsCisJCQkJZW5fcm5fbXNnKTsKIAkJaWYgKHJjID09IDApIHsKIAkJCS8qIGRvbid0IHJlcG9ydCBldmVudCBvbiBmb3JjZWQgZGVidWcgZHVtcCAqLwogCQkJaWYgKHJlZ19lcnIxID09IFNMSVBPUlRfRVJSMV9SRUdfRVJSX0NPREVfMiAmJgpAQCAtNDg1Niw2ICs0ODY4LDcgQEAKIAl1aW50OF90IHBuX3BhZ2VbTFBGQ19NQVhfU1VQUE9SVEVEX1BBR0VTXSA9IHswfTsKIAlzdHJ1Y3QgbHBmY19tcWUgKm1xZTsKIAlpbnQgbG9uZ3M7CisJaW50IGZvZl92ZWN0b3JzID0gMDsKIAogCS8qIEdldCBhbGwgdGhlIG1vZHVsZSBwYXJhbXMgZm9yIGNvbmZpZ3VyaW5nIHRoaXMgaG9zdCAqLwogCWxwZmNfZ2V0X2NmZ3BhcmFtKHBoYmEpOwpAQCAtNTA2MSw2ICs1MDc0LDkgQEAKIAlyYyA9IGxwZmNfc2xpNF9yZWFkX2NvbmZpZyhwaGJhKTsKIAlpZiAodW5saWtlbHkocmMpKQogCQlnb3RvIG91dF9mcmVlX2JzbWJ4OworCXJjID0gbHBmY19tZW1fYWxsb2NfYWN0aXZlX3JycV9wb29sX3M0KHBoYmEpOworCWlmICh1bmxpa2VseShyYykpCisJCWdvdG8gb3V0X2ZyZWVfYnNtYng7CiAKIAkvKiBJRiBUeXBlIDAgcG9ydHMgZ2V0IGluaXRpYWxpemVkIG5vdy4gKi8KIAlpZiAoYmZfZ2V0KGxwZmNfc2xpX2ludGZfaWZfdHlwZSwgJnBoYmEtPnNsaTRfaGJhLnNsaV9pbnRmKSA9PQpAQCAtNTExOCw2ICs1MTM0LDEyIEBACiAJCX0KIAl9CiAJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKKworCS8qIFZlcmlmeSBPQVMgaXMgc3VwcG9ydGVkICovCisJbHBmY19zbGk0X29hc192ZXJpZnkocGhiYSk7CisJaWYgKHBoYmEtPmNmZ19mb2YpCisJCWZvZl92ZWN0b3JzID0gMTsKKwogCS8qIFZlcmlmeSBhbGwgdGhlIFNMSTQgcXVldWVzICovCiAJcmMgPSBscGZjX3NsaTRfcXVldWVfdmVyaWZ5KHBoYmEpOwogCWlmIChyYykKQEAgLTUxNTksNyArNTE4MSw4IEBACiAKIAlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsID0KIAkJCWt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgbHBmY19mY3BfZXFfaGRsKSAqCi0JCQkgICAgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisJCQkgICAgKGZvZl92ZWN0b3JzICsgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsKSksCisJCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjI1NzIgRmFpbGVkIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgpAQCAtNTE2OSw3ICs1MTkyLDggQEAKIAl9CiAKIAlwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXMgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpICoKLQkJCQkgICAgICBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKwkJCQkgIChmb2ZfdmVjdG9ycyArCisJCQkJICAgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsKSksIEdGUF9LRVJORUwpOwogCWlmICghcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjI1NzMgRmFpbGVkIGFsbG9jYXRlIG1lbW9yeSBmb3IgbXNpLXggIgpAQCAtNTI2Nyw2ICs1MjkxLDcgQEAKIAlrZnJlZShwaGJhLT5zbGk0X2hiYS5jcHVfbWFwKTsKIAlwaGJhLT5zbGk0X2hiYS5udW1fcHJlc2VudF9jcHUgPSAwOwogCXBoYmEtPnNsaTRfaGJhLm51bV9vbmxpbmVfY3B1ID0gMDsKKwlwaGJhLT5zbGk0X2hiYS5jdXJyX2Rpc3BfY3B1ID0gMDsKIAogCS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbXNpLXggaW50ZXJydXB0IHZlY3RvciBlbnRyaWVzICovCiAJa2ZyZWUocGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzKTsKQEAgLTUzOTAsNiArNTQxNSwxMCBAQAogCS8qIEluaXRpYWxpemUgRkNGIGNvbm5lY3Rpb24gcmVjIGxpc3QgKi8KIAlJTklUX0xJU1RfSEVBRCgmcGhiYS0+ZmNmX2Nvbm5fcmVjX2xpc3QpOwogCisJLyogSW5pdGlhbGl6ZSBPQVMgY29uZmlndXJhdGlvbiBsaXN0ICovCisJc3Bpbl9sb2NrX2luaXQoJnBoYmEtPmRldmljZWxvY2spOworCUlOSVRfTElTVF9IRUFEKCZwaGJhLT5sdW5zKTsKKwogCXJldHVybiAwOwogfQogCkBAIC02ODE2LDYgKzY4NDUsNyBAQAogCWludCBjZmdfZmNwX2lvX2NoYW5uZWw7CiAJdWludDMyX3QgY3B1OwogCXVpbnQzMl90IGkgPSAwOworCWludCBmb2ZfdmVjdG9ycyA9IHBoYmEtPmNmZ19mb2YgPyAxIDogMDsKIAogCS8qCiAJICogU2FuaXR5IGNoZWNrIGZvciBjb25maWd1cmVkIHF1ZXVlIHBhcmFtZXRlcnMgYWdhaW5zdCB0aGUgcnVuLXRpbWUKQEAgLTY4MzIsNiArNjg2Miw3IEBACiAJfQogCXBoYmEtPnNsaTRfaGJhLm51bV9vbmxpbmVfY3B1ID0gaTsKIAlwaGJhLT5zbGk0X2hiYS5udW1fcHJlc2VudF9jcHUgPSBscGZjX3ByZXNlbnRfY3B1OworCXBoYmEtPnNsaTRfaGJhLmN1cnJfZGlzcF9jcHUgPSAwOwogCiAJaWYgKGkgPCBjZmdfZmNwX2lvX2NoYW5uZWwpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsCkBAIC02ODQyLDcgKzY4NzMsNyBAQAogCQljZmdfZmNwX2lvX2NoYW5uZWwgPSBpOwogCX0KIAotCWlmIChjZmdfZmNwX2lvX2NoYW5uZWwgPgorCWlmIChjZmdfZmNwX2lvX2NoYW5uZWwgKyBmb2ZfdmVjdG9ycyA+CiAJICAgIHBoYmEtPnNsaTRfaGJhLm1heF9jZmdfcGFyYW0ubWF4X2VxKSB7CiAJCWlmIChwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF9lcSA8CiAJCSAgICBMUEZDX0ZDUF9JT19DSEFOX01JTikgewpAQCAtNjg1OSw3ICs2ODkwLDggQEAKIAkJCQkiYXZhaWxhYmxlIEVRczogZnJvbSAlZCB0byAlZFxuIiwKIAkJCQljZmdfZmNwX2lvX2NoYW5uZWwsCiAJCQkJcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfZXEpOwotCQljZmdfZmNwX2lvX2NoYW5uZWwgPSBwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF9lcTsKKwkJY2ZnX2ZjcF9pb19jaGFubmVsID0gcGhiYS0+c2xpNF9oYmEubWF4X2NmZ19wYXJhbS5tYXhfZXEgLQorCQkJZm9mX3ZlY3RvcnM7CiAJfQogCiAJLyogVGhlIGFjdHVhbCBudW1iZXIgb2YgRkNQIGV2ZW50IHF1ZXVlcyBhZG9wdGVkICovCkBAIC03MDcwLDYgKzcxMDIsOSBAQAogCX0KIAlwaGJhLT5zbGk0X2hiYS5kYXRfcnEgPSBxZGVzYzsKIAorCS8qIENyZWF0ZSB0aGUgUXVldWVzIG5lZWRlZCBmb3IgRmxhc2ggT3B0aW1pemVkIEZhYnJpYyBvcGVyYXRpb25zICovCisJaWYgKHBoYmEtPmNmZ19mb2YpCisJCWxwZmNfZm9mX3F1ZXVlX2NyZWF0ZShwaGJhKTsKIAlyZXR1cm4gMDsKIAogb3V0X2Vycm9yOgpAQCAtNzA5NCw2ICs3MTI5LDkgQEAKIHsKIAlpbnQgaWR4OwogCisJaWYgKHBoYmEtPmNmZ19mb2YpCisJCWxwZmNfZm9mX3F1ZXVlX2Rlc3Ryb3kocGhiYSk7CisKIAlpZiAocGhiYS0+c2xpNF9oYmEuaGJhX2VxICE9IE5VTEwpIHsKIAkJLyogUmVsZWFzZSBIQkEgZXZlbnQgcXVldWUgKi8KIAkJZm9yIChpZHggPSAwOyBpZHggPCBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWw7IGlkeCsrKSB7CkBAIC03NDc4LDggKzc1MTYsMjAgQEAKIAkJCXBoYmEtPnNsaTRfaGJhLmhkcl9ycS0+cXVldWVfaWQsCiAJCQlwaGJhLT5zbGk0X2hiYS5kYXRfcnEtPnF1ZXVlX2lkLAogCQkJcGhiYS0+c2xpNF9oYmEuZWxzX2NxLT5xdWV1ZV9pZCk7CisKKwlpZiAocGhiYS0+Y2ZnX2ZvZikgeworCQlyYyA9IGxwZmNfZm9mX3F1ZXVlX3NldHVwKHBoYmEpOworCQlpZiAocmMpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSIwNTQ5IEZhaWxlZCBzZXR1cCBvZiBGT0YgUXVldWVzOiAiCisJCQkJCSJyYyA9IDB4JXhcbiIsIHJjKTsKKwkJCWdvdG8gb3V0X2Rlc3Ryb3lfZWxzX3JxOworCQl9CisJfQogCXJldHVybiAwOwogCitvdXRfZGVzdHJveV9lbHNfcnE6CisJbHBmY19ycV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLmhkcl9ycSwgcGhiYS0+c2xpNF9oYmEuZGF0X3JxKTsKIG91dF9kZXN0cm95X2Vsc193cToKIAlscGZjX3dxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEuZWxzX3dxKTsKIG91dF9kZXN0cm95X21ieF93cToKQEAgLTc1MTgsNiArNzU2OCw5IEBACiB7CiAJaW50IGZjcF9xaWR4OwogCisJLyogVW5zZXQgdGhlIHF1ZXVlcyBjcmVhdGVkIGZvciBGbGFzaCBPcHRpbWl6ZWQgRmFicmljIG9wZXJhdGlvbnMgKi8KKwlpZiAocGhiYS0+Y2ZnX2ZvZikKKwkJbHBmY19mb2ZfcXVldWVfZGVzdHJveShwaGJhKTsKIAkvKiBVbnNldCBtYWlsYm94IGNvbW1hbmQgd29yayBxdWV1ZSAqLwogCWxwZmNfbXFfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5tYnhfd3EpOwogCS8qIFVuc2V0IEVMUyB3b3JrIHF1ZXVlICovCkBAIC04NjM1LDYgKzg2ODgsMTAgQEAKIAogCS8qIENvbmZpZ3VyZSBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwogCXZlY3RvcnMgPSBwaGJhLT5jZmdfZmNwX2lvX2NoYW5uZWw7CisJaWYgKHBoYmEtPmNmZ19mb2YpIHsKKwkJcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzW2luZGV4XS5lbnRyeSA9IGluZGV4OworCQl2ZWN0b3JzKys7CisJfQogZW5hYmxlX21zaXhfdmVjdG9yczoKIAlyYyA9IHBjaV9lbmFibGVfbXNpeChwaGJhLT5wY2lkZXYsIHBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllcywKIAkJCSAgICAgdmVjdG9ycyk7CkBAIC04NjY0LDcgKzg3MjEsMTUgQEAKIAkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0uaWR4ID0gaW5kZXg7CiAJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLnBoYmEgPSBwaGJhOwogCQlhdG9taWNfc2V0KCZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5mY3BfZXFfaW5fdXNlLCAxKTsKLQkJcmMgPSByZXF1ZXN0X2lycShwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvciwKKwkJaWYgKHBoYmEtPmNmZ19mb2YgJiYgKGluZGV4ID09ICh2ZWN0b3JzIC0gMSkpKQorCQkJcmMgPSByZXF1ZXN0X2lycSgKKwkJCQlwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvciwKKwkJCQkgJmxwZmNfc2xpNF9mb2ZfaW50cl9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCQkgKGNoYXIgKikmcGhiYS0+c2xpNF9oYmEuaGFuZGxlcl9uYW1lW2luZGV4XSwKKwkJCQkgJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdKTsKKwkJZWxzZQorCQkJcmMgPSByZXF1ZXN0X2lycSgKKwkJCQlwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvciwKIAkJCQkgJmxwZmNfc2xpNF9oYmFfaW50cl9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCQkgKGNoYXIgKikmcGhiYS0+c2xpNF9oYmEuaGFuZGxlcl9uYW1lW2luZGV4XSwKIAkJCQkgJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdKTsKQEAgLTg2NzYsNiArODc0MSw5IEBACiAJCX0KIAl9CiAKKwlpZiAocGhiYS0+Y2ZnX2ZvZikKKwkJdmVjdG9ycy0tOworCiAJaWYgKHZlY3RvcnMgIT0gcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjMyMzggUmVkdWNpbmcgSU8gY2hhbm5lbHMgdG8gbWF0Y2ggbnVtYmVyIG9mICIKQEAgLTg3MjEsNyArODc4OSwxMCBAQAogCQlmcmVlX2lycShwaGJhLT5zbGk0X2hiYS5tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvciwKIAkJCSAmcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0pOwogCX0KLQorCWlmIChwaGJhLT5jZmdfZm9mKSB7CisJCWZyZWVfaXJxKHBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllc1tpbmRleF0udmVjdG9yLAorCQkJICZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XSk7CisJfQogCS8qIERpc2FibGUgTVNJLVggKi8KIAlwY2lfZGlzYWJsZV9tc2l4KHBoYmEtPnBjaWRldik7CiAKQEAgLTg3NzEsNiArODg0MiwxMCBAQAogCQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5waGJhID0gcGhiYTsKIAl9CiAKKwlpZiAocGhiYS0+Y2ZnX2ZvZikgeworCQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS5pZHggPSBpbmRleDsKKwkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbFtpbmRleF0ucGhiYSA9IHBoYmE7CisJfQogCXJldHVybiAwOwogfQogCkBAIC04ODUzLDYgKzg5MjgsMTIgQEAKIAkJCQlhdG9taWNfc2V0KCZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsW2luZGV4XS4KIAkJCQkJZmNwX2VxX2luX3VzZSwgMSk7CiAJCQl9CisJCQlpZiAocGhiYS0+Y2ZnX2ZvZikgeworCQkJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLmlkeCA9IGluZGV4OworCQkJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLnBoYmEgPSBwaGJhOworCQkJCWF0b21pY19zZXQoJnBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGxbaW5kZXhdLgorCQkJCQlmY3BfZXFfaW5fdXNlLCAxKTsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gaW50cl9tb2RlOwpAQCAtOTE2Myw2ICs5MjQ0LDcgQEAKIAkJcGhiYS0+c2xpM19vcHRpb25zICY9IH5MUEZDX1NMSTRfUEhXUV9FTkFCTEVEOwogCXNsaTRfcGFyYW1zLT5zZ2Vfc3VwcF9sZW4gPSBtYnhfc2xpNF9wYXJhbWV0ZXJzLT5zZ2Vfc3VwcF9sZW47CiAJc2xpNF9wYXJhbXMtPmxvb3Bia19zY29wZSA9IGJmX2dldChsb29wYmtfc2NvcGUsIG1ieF9zbGk0X3BhcmFtZXRlcnMpOworCXNsaTRfcGFyYW1zLT5vYXNfc3VwcG9ydGVkID0gYmZfZ2V0KGNmZ19vYXMsIG1ieF9zbGk0X3BhcmFtZXRlcnMpOwogCXNsaTRfcGFyYW1zLT5jcXYgPSBiZl9nZXQoY2ZnX2NxdiwgbWJ4X3NsaTRfcGFyYW1ldGVycyk7CiAJc2xpNF9wYXJhbXMtPm1xdiA9IGJmX2dldChjZmdfbXF2LCBtYnhfc2xpNF9wYXJhbWV0ZXJzKTsKIAlzbGk0X3BhcmFtcy0+d3F2ID0gYmZfZ2V0KGNmZ193cXYsIG1ieF9zbGk0X3BhcmFtZXRlcnMpOwpAQCAtMTA3OTYsNiArMTA4NzgsMTY5IEBACiAJcmV0dXJuOwogfQogCisvKioKKyAqIGxwZmNfc2xpNF9vYXNfdmVyaWZ5IC0gVmVyaWZ5IE9BUyBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIHRvIHNlZSBpZiBPQVMgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGFkYXB0ZXIuIElmCisgKiBzdXBwb3J0ZWQsIHRoZSBjb25maWd1cmUgRmxhc2ggT3B0aW1pemVkIEZhYnJpYyBmbGFnIGlzIHNldC4gIE90aGVyd2lzZSwKKyAqIHRoZSBlbmFibGUgb2FzIGZsYWcgaXMgY2xlYXJlZCBhbmQgdGhlIHBvb2wgY3JlYXRlZCBmb3IgT0FTIGRldmljZSBkYXRhCisgKiBpcyBkZXN0cm95ZWQuCisgKgorICoqLwordm9pZAorbHBmY19zbGk0X29hc192ZXJpZnkoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCisJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybjsKKworCWlmIChwaGJhLT5zbGk0X2hiYS5wY19zbGk0X3BhcmFtcy5vYXNfc3VwcG9ydGVkKSB7CisJCXBoYmEtPmNmZ19mb2YgPSAxOworCX0gZWxzZSB7CisJCXBoYmEtPmNmZ19FbmFibGVYTGFuZSA9IDA7CisJCWlmIChwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCkKKwkJCW1lbXBvb2xfZGVzdHJveShwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCk7CisJCXBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sID0gTlVMTDsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogbHBmY19mb2ZfcXVldWVfc2V0dXAgLSBTZXQgdXAgYWxsIHRoZSBmb2YgcXVldWVzCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB0byBzZXQgdXAgYWxsIHRoZSBmb2YgcXVldWVzIGZvciB0aGUgRkMgSEJBCisgKiBvcGVyYXRpb24uCisgKgorICogUmV0dXJuIGNvZGVzCisgKiAgICAgIDAgLSBzdWNjZXNzZnVsCisgKiAgICAgIC1FTk9NRU0gLSBObyBhdmFpbGFibGUgbWVtb3J5CisgKiovCitpbnQKK2xwZmNfZm9mX3F1ZXVlX3NldHVwKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgbHBmY19zbGkgKnBzbGkgPSAmcGhiYS0+c2xpOworCWludCByYzsKKworCXJjID0gbHBmY19lcV9jcmVhdGUocGhiYSwgcGhiYS0+c2xpNF9oYmEuZm9mX2VxLCBMUEZDX01BWF9JTUFYKTsKKwlpZiAocmMpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkgeworCisJCXJjID0gbHBmY19jcV9jcmVhdGUocGhiYSwgcGhiYS0+c2xpNF9oYmEub2FzX2NxLAorCQkJCSAgICBwaGJhLT5zbGk0X2hiYS5mb2ZfZXEsIExQRkNfV0NRLCBMUEZDX0ZDUCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0X29hc19jcTsKKworCQlyYyA9IGxwZmNfd3FfY3JlYXRlKHBoYmEsIHBoYmEtPnNsaTRfaGJhLm9hc193cSwKKwkJCQkgICAgcGhiYS0+c2xpNF9oYmEub2FzX2NxLCBMUEZDX0ZDUCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0X29hc193cTsKKworCQlwaGJhLT5zbGk0X2hiYS5vYXNfY3EtPnByaW5nID0gJnBzbGktPnJpbmdbTFBGQ19GQ1BfT0FTX1JJTkddOworCQlwaGJhLT5zbGk0X2hiYS5vYXNfcmluZyA9ICZwc2xpLT5yaW5nW0xQRkNfRkNQX09BU19SSU5HXTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X29hc193cToKKwlpZiAocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlscGZjX2NxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEub2FzX2NxKTsKK291dF9vYXNfY3E6CisJbHBmY19lcV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLmZvZl9lcSk7CisJcmV0dXJuIHJjOworCit9CisKKy8qKgorICogbHBmY19mb2ZfcXVldWVfY3JlYXRlIC0gQ3JlYXRlIGFsbCB0aGUgZm9mIHF1ZXVlcworICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gYWxsb2NhdGUgYWxsIHRoZSBmb2YgcXVldWVzIGZvciB0aGUgRkMgSEJBCisgKiBvcGVyYXRpb24uIEZvciBlYWNoIFNMSTQgcXVldWUgdHlwZSwgdGhlIHBhcmFtZXRlcnMgc3VjaCBhcyBxdWV1ZSBlbnRyeQorICogY291bnQgKHF1ZXVlIGRlcHRoKSBzaGFsbCBiZSB0YWtlbiBmcm9tIHRoZSBtb2R1bGUgcGFyYW1ldGVyLiBGb3Igbm93LAorICogd2UganVzdCB1c2Ugc29tZSBjb25zdGFudCBudW1iZXIgYXMgcGxhY2UgaG9sZGVyLgorICoKKyAqIFJldHVybiBjb2RlcworICogICAgICAwIC0gc3VjY2Vzc2Z1bAorICogICAgICAtRU5PTUVNIC0gTm8gYXZhaWxibGUgbWVtb3J5CisgKiAgICAgIC1FSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgorICoqLworaW50CitscGZjX2ZvZl9xdWV1ZV9jcmVhdGUoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCXN0cnVjdCBscGZjX3F1ZXVlICpxZGVzYzsKKworCS8qIENyZWF0ZSBGT0YgRVEgKi8KKwlxZGVzYyA9IGxwZmNfc2xpNF9xdWV1ZV9hbGxvYyhwaGJhLCBwaGJhLT5zbGk0X2hiYS5lcV9lc2l6ZSwKKwkJCQkgICAgICBwaGJhLT5zbGk0X2hiYS5lcV9lY291bnQpOworCWlmICghcWRlc2MpCisJCWdvdG8gb3V0X2Vycm9yOworCisJcGhiYS0+c2xpNF9oYmEuZm9mX2VxID0gcWRlc2M7CisKKwlpZiAocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSB7CisKKwkJLyogQ3JlYXRlIE9BUyBDUSAqLworCQlxZGVzYyA9IGxwZmNfc2xpNF9xdWV1ZV9hbGxvYyhwaGJhLCBwaGJhLT5zbGk0X2hiYS5jcV9lc2l6ZSwKKwkJCQkJCSAgICAgIHBoYmEtPnNsaTRfaGJhLmNxX2Vjb3VudCk7CisJCWlmICghcWRlc2MpCisJCQlnb3RvIG91dF9lcnJvcjsKKworCQlwaGJhLT5zbGk0X2hiYS5vYXNfY3EgPSBxZGVzYzsKKworCQkvKiBDcmVhdGUgT0FTIFdRICovCisJCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLndxX2VzaXplLAorCQkJCQkgICAgICBwaGJhLT5zbGk0X2hiYS53cV9lY291bnQpOworCQlpZiAoIXFkZXNjKQorCQkJZ290byBvdXRfZXJyb3I7CisKKwkJcGhiYS0+c2xpNF9oYmEub2FzX3dxID0gcWRlc2M7CisKKwl9CisJcmV0dXJuIDA7CisKK291dF9lcnJvcjoKKwlscGZjX2ZvZl9xdWV1ZV9kZXN0cm95KHBoYmEpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIGxwZmNfZm9mX3F1ZXVlX2Rlc3Ryb3kgLSBEZXN0cm95IGFsbCB0aGUgZm9mIHF1ZXVlcworICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gcmVsZWFzZSBhbGwgdGhlIFNMSTQgcXVldWVzIHdpdGggdGhlIEZDIEhCQQorICogb3BlcmF0aW9uLgorICoKKyAqIFJldHVybiBjb2RlcworICogICAgICAwIC0gc3VjY2Vzc2Z1bAorICoqLworaW50CitscGZjX2ZvZl9xdWV1ZV9kZXN0cm95KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwkvKiBSZWxlYXNlIEZPRiBFdmVudCBxdWV1ZSAqLworCWlmIChwaGJhLT5zbGk0X2hiYS5mb2ZfZXEgIT0gTlVMTCkgeworCQlscGZjX3NsaTRfcXVldWVfZnJlZShwaGJhLT5zbGk0X2hiYS5mb2ZfZXEpOworCQlwaGJhLT5zbGk0X2hiYS5mb2ZfZXEgPSBOVUxMOworCX0KKworCS8qIFJlbGVhc2UgT0FTIENvbXBsZXRpb24gcXVldWUgKi8KKwlpZiAocGhiYS0+c2xpNF9oYmEub2FzX2NxICE9IE5VTEwpIHsKKwkJbHBmY19zbGk0X3F1ZXVlX2ZyZWUocGhiYS0+c2xpNF9oYmEub2FzX2NxKTsKKwkJcGhiYS0+c2xpNF9oYmEub2FzX2NxID0gTlVMTDsKKwl9CisKKwkvKiBSZWxlYXNlIE9BUyBXb3JrIHF1ZXVlICovCisJaWYgKHBoYmEtPnNsaTRfaGJhLm9hc193cSAhPSBOVUxMKSB7CisJCWxwZmNfc2xpNF9xdWV1ZV9mcmVlKHBoYmEtPnNsaTRfaGJhLm9hc193cSk7CisJCXBoYmEtPnNsaTRfaGJhLm9hc193cSA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbHBmY19pZF90YWJsZVtdID0gewogCXtQQ0lfVkVORE9SX0lEX0VNVUxFWCwgUENJX0RFVklDRV9JRF9WSVBFUiwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWVtLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21lbS5jCmluZGV4IDgxMmQwY2QuLmVkNDE5YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWVtLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tZW0uYwpAQCAtMzgsMTAgKzM4LDI5IEBACiAjaW5jbHVkZSAibHBmY19zY3NpLmgiCiAjaW5jbHVkZSAibHBmYy5oIgogI2luY2x1ZGUgImxwZmNfY3J0bi5oIgorI2luY2x1ZGUgImxwZmNfbG9nbXNnLmgiCiAKICNkZWZpbmUgTFBGQ19NQlVGX1BPT0xfU0laRSAgICAgNjQgICAgICAvKiBtYXggZWxlbWVudHMgaW4gTUJVRiBzYWZldHkgcG9vbCAqLwogI2RlZmluZSBMUEZDX01FTV9QT09MX1NJWkUgICAgICA2NCAgICAgIC8qIG1heCBlbGVtIGluIG5vbi1ETUEgc2FmZXR5IHBvb2wgKi8KKyNkZWZpbmUgTFBGQ19ERVZJQ0VfREFUQV9QT09MX1NJWkUgNjQgICAvKiBtYXggZWxlbWVudHMgaW4gZGV2aWNlIGRhdGEgcG9vbCAqLwogCitpbnQKK2xwZmNfbWVtX2FsbG9jX2FjdGl2ZV9ycnFfcG9vbF9zNChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpIHsKKwlzaXplX3QgYnl0ZXM7CisJaW50IG1heF94cmkgPSBwaGJhLT5zbGk0X2hiYS5tYXhfY2ZnX3BhcmFtLm1heF94cmk7CisKKwlpZiAobWF4X3hyaSA8PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlieXRlcyA9ICgoQklUU19QRVJfTE9ORyAtIDEgKyBtYXhfeHJpKSAvIEJJVFNfUEVSX0xPTkcpICoKKwkJICBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJcGhiYS0+Y2ZnX3JycV94cmlfYml0bWFwX3N6ID0gYnl0ZXM7CisJcGhiYS0+YWN0aXZlX3JycV9wb29sID0gbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKExQRkNfTUVNX1BPT0xfU0laRSwKKwkJCQkJCQkgICAgYnl0ZXMpOworCWlmICghcGhiYS0+YWN0aXZlX3JycV9wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKKwllbHNlCisJCXJldHVybiAwOworfQogCiAvKioKICAqIGxwZmNfbWVtX2FsbG9jIC0gY3JlYXRlIGFuZCBhbGxvY2F0ZSBhbGwgUENJIGFuZCBtZW1vcnkgcG9vbHMKQEAgLTE0Niw2ICsxNjUsMTYgQEAKIAkJcGhiYS0+bHBmY19kcmJfcG9vbCA9IE5VTEw7CiAJfQogCisJaWYgKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkgeworCQlwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbCgKKwkJCQkJTFBGQ19ERVZJQ0VfREFUQV9QT09MX1NJWkUsCisJCQkJCXNpemVvZihzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSkpOworCQlpZiAoIXBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sKQorCQkJZ290byBmYWlsX2ZyZWVfaHJiX3Bvb2w7CisJfSBlbHNlIHsKKwkJcGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wgPSBOVUxMOworCX0KKwogCXJldHVybiAwOwogIGZhaWxfZnJlZV9ocmJfcG9vbDoKIAlwY2lfcG9vbF9kZXN0cm95KHBoYmEtPmxwZmNfaHJiX3Bvb2wpOwpAQCAtMTg4LDYgKzIxNyw3IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IGxwZmNfZG1hX3Bvb2wgKnBvb2wgPSAmcGhiYS0+bHBmY19tYnVmX3NhZmV0eV9wb29sOworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpkZXZpY2VfZGF0YTsKIAogCS8qIEZyZWUgSEJRIHBvb2xzICovCiAJbHBmY19zbGlfaGJxYnVmX2ZyZWVfYWxsKHBoYmEpOwpAQCAtMjA5LDYgKzIzOSwxMCBAQAogCS8qIEZyZWUgTkxQIG1lbW9yeSBwb29sICovCiAJbWVtcG9vbF9kZXN0cm95KHBoYmEtPm5scF9tZW1fcG9vbCk7CiAJcGhiYS0+bmxwX21lbV9wb29sID0gTlVMTDsKKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0ICYmIHBoYmEtPmFjdGl2ZV9ycnFfcG9vbCkgeworCQltZW1wb29sX2Rlc3Ryb3kocGhiYS0+YWN0aXZlX3JycV9wb29sKTsKKwkJcGhiYS0+YWN0aXZlX3JycV9wb29sID0gTlVMTDsKKwl9CiAKIAkvKiBGcmVlIG1ib3ggbWVtb3J5IHBvb2wgKi8KIAltZW1wb29sX2Rlc3Ryb3kocGhiYS0+bWJveF9tZW1fcG9vbCk7CkBAIC0yMjcsNiArMjYxLDE5IEBACiAJcGNpX3Bvb2xfZGVzdHJveShwaGJhLT5scGZjX3Njc2lfZG1hX2J1Zl9wb29sKTsKIAlwaGJhLT5scGZjX3Njc2lfZG1hX2J1Zl9wb29sID0gTlVMTDsKIAorCS8qIEZyZWUgRGV2aWNlIERhdGEgbWVtb3J5IHBvb2wgKi8KKwlpZiAocGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wpIHsKKwkJLyogRW5zdXJlIGFsbCBvYmplY3RzIGhhdmUgYmVlbiByZXR1cm5lZCB0byB0aGUgcG9vbCAqLworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnBoYmEtPmx1bnMpKSB7CisJCQlkZXZpY2VfZGF0YSA9IGxpc3RfZmlyc3RfZW50cnkoJnBoYmEtPmx1bnMsCisJCQkJCQkgICAgICAgc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEsCisJCQkJCQkgICAgICAgbGlzdGVudHJ5KTsKKwkJCWxpc3RfZGVsKCZkZXZpY2VfZGF0YS0+bGlzdGVudHJ5KTsKKwkJCW1lbXBvb2xfZnJlZShkZXZpY2VfZGF0YSwgcGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wpOworCQl9CisJCW1lbXBvb2xfZGVzdHJveShwaGJhLT5kZXZpY2VfZGF0YV9tZW1fcG9vbCk7CisJfQorCXBoYmEtPmRldmljZV9kYXRhX21lbV9wb29sID0gTlVMTDsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCmluZGV4IGFiYzM2MTIuLmMzNDJmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYwpAQCAtMjAzLDggKzIwMyw2IEBACiBpbnQKIGxwZmNfZWxzX2Fib3J0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHApCiB7Ci0JTElTVF9IRUFEKGNvbXBsZXRpb25zKTsKLQlMSVNUX0hFQUQodHhjbXBscV9jb21wbGV0aW9ucyk7CiAJTElTVF9IRUFEKGFib3J0X2xpc3QpOwogCXN0cnVjdCBscGZjX3NsaSAgKnBzbGkgPSAmcGhiYS0+c2xpOwogCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwc2xpLT5yaW5nW0xQRkNfRUxTX1JJTkddOwpAQCAtMjE2LDMyICsyMTQsMjcgQEAKIAkJCSAiRGF0YTogeCV4IHgleCB4JXhcbiIsCiAJCQkgbmRscC0+bmxwX0RJRCwgbmRscC0+bmxwX2ZsYWcsIG5kbHAtPm5scF9zdGF0ZSwKIAkJCSBuZGxwLT5ubHBfcnBpKTsKLQorCS8qIENsZWFuIHVwIGFsbCBmYWJyaWMgSU9zIGZpcnN0LiovCiAJbHBmY19mYWJyaWNfYWJvcnRfbnBvcnQobmRscCk7CiAKLQkvKiBGaXJzdCBjaGVjayB0aGUgdHhxICovCisJLyoKKwkgKiBMb2NrIHRoZSBFTFMgcmluZyB0eGNtcGxxIGZvciBTTEkzL1NMSTQgYW5kIGJ1aWxkIGEgbG9jYWwgbGlzdAorCSAqIG9mIGFsbCBFTFMgSU9zIHRoYXQgbmVlZCBhbiBBQlRTLiAgVGhlIElPcyBuZWVkIHRvIHN0YXkgb24gdGhlCisJICogdHhjbXBscSBzbyB0aGF0IHRoZSBhYm9ydCBvcGVyYXRpb24gY29tcGxldGVzIHRoZW0gc3VjY2Vzc2Z1bGx5LgorCSAqLwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpb2NiLCBuZXh0X2lvY2IsICZwcmluZy0+dHhxLCBsaXN0KSB7Ci0JCS8qIENoZWNrIHRvIHNlZSBpZiBpb2NiIG1hdGNoZXMgdGhlIG5wb3J0IHdlIGFyZSBsb29raW5nIGZvciAqLwotCQlpZiAobHBmY19jaGVja19zbGlfbmRscChwaGJhLCBwcmluZywgaW9jYiwgbmRscCkpIHsKLQkJCS8qIEl0IG1hdGNoZXMsIHNvIGRlcXVlIGFuZCBjYWxsIGNvbXBsIHdpdGggYW5wIGVycm9yICovCi0JCQlsaXN0X21vdmVfdGFpbCgmaW9jYi0+bGlzdCwgJmNvbXBsZXRpb25zKTsKLQkJfQotCX0KLQotCS8qIE5leHQgY2hlY2sgdGhlIHR4Y21wbHEgKi8KLQlsaXN0X3NwbGljZV9pbml0KCZwcmluZy0+dHhjbXBscSwgJnR4Y21wbHFfY29tcGxldGlvbnMpOwotCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW9jYiwgbmV4dF9pb2NiLCAmdHhjbXBscV9jb21wbGV0aW9ucywgbGlzdCkgewotCQkvKiBDaGVjayB0byBzZWUgaWYgaW9jYiBtYXRjaGVzIHRoZSBucG9ydCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlzcGluX2xvY2soJnByaW5nLT5yaW5nX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpb2NiLCBuZXh0X2lvY2IsICZwcmluZy0+dHhjbXBscSwgbGlzdCkgeworCS8qIEFkZCB0byBhYm9ydF9saXN0IG9uIG9uIE5ETFAgbWF0Y2guICovCiAJCWlmIChscGZjX2NoZWNrX3NsaV9uZGxwKHBoYmEsIHByaW5nLCBpb2NiLCBuZGxwKSkKIAkJCWxpc3RfYWRkX3RhaWwoJmlvY2ItPmRsaXN0LCAmYWJvcnRfbGlzdCk7CiAJfQotCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCWxpc3Rfc3BsaWNlKCZ0eGNtcGxxX2NvbXBsZXRpb25zLCAmcHJpbmctPnR4Y21wbHEpOworCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCXNwaW5fdW5sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCisJLyogQWJvcnQgdGhlIHRhcmdldGVkIElPcyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgYWJvcnQgbGlzdC4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW9jYiwgbmV4dF9pb2NiLCAmYWJvcnRfbGlzdCwgZGxpc3QpIHsKIAkJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCQkJbGlzdF9kZWxfaW5pdCgmaW9jYi0+ZGxpc3QpOwpAQCAtMjQ5LDkgKzI0MiwyOCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAl9CiAKKwlJTklUX0xJU1RfSEVBRCgmYWJvcnRfbGlzdCk7CisKKwkvKiBOb3cgcHJvY2VzcyB0aGUgdHhxICovCisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl9sb2NrKCZwcmluZy0+cmluZ19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpb2NiLCBuZXh0X2lvY2IsICZwcmluZy0+dHhxLCBsaXN0KSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiBpb2NiIG1hdGNoZXMgdGhlIG5wb3J0IHdlIGFyZSBsb29raW5nIGZvciAqLworCQlpZiAobHBmY19jaGVja19zbGlfbmRscChwaGJhLCBwcmluZywgaW9jYiwgbmRscCkpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmlvY2ItPmxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmaW9jYi0+bGlzdCwgJmFib3J0X2xpc3QpOworCQl9CisJfQorCisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKKwkJc3Bpbl91bmxvY2soJnByaW5nLT5yaW5nX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisKIAkvKiBDYW5jZWwgYWxsIHRoZSBJT0NCcyBmcm9tIHRoZSBjb21wbGV0aW9ucyBsaXN0ICovCi0JbHBmY19zbGlfY2FuY2VsX2lvY2JzKHBoYmEsICZjb21wbGV0aW9ucywgSU9TVEFUX0xPQ0FMX1JFSkVDVCwKLQkJCSAgICAgIElPRVJSX1NMSV9BQk9SVEVEKTsKKwlscGZjX3NsaV9jYW5jZWxfaW9jYnMocGhiYSwgJmFib3J0X2xpc3QsCisJCQkgICAgICBJT1NUQVRfTE9DQUxfUkVKRUNULCBJT0VSUl9TTElfQUJPUlRFRCk7CiAKIAlscGZjX2NhbmNlbF9yZXRyeV9kZWxheV90bW8ocGhiYS0+cHBvcnQsIG5kbHApOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwppbmRleCBiMmVkZTA1Li40NjI0NTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwpAQCAtNjgsNiArNjgsMTcgQEAKIAlfX2JlMzIgcmVmX3RhZzsgICAgICAgICAvKiBUYXJnZXQgTEJBIG9yIGluZGlyZWN0IExCQSAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKgorbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKHZwb3J0LT5waGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiAoKHN0cnVjdCBscGZjX2RldmljZV9kYXRhICopc2Rldi0+aG9zdGRhdGEpLT5ycG9ydF9kYXRhOworCWVsc2UKKwkJcmV0dXJuIChzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICopc2Rldi0+aG9zdGRhdGE7Cit9CisKIHN0YXRpYyB2b2lkCiBscGZjX3JlbGVhc2Vfc2NzaV9idWZfczQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19zY3NpX2J1ZiAqcHNiKTsKIHN0YXRpYyB2b2lkCkBAIC0zMDQsOSArMzE1LDI3IEBACiAJdW5zaWduZWQgbG9uZyBuZXdfcXVldWVfZGVwdGgsIG9sZF9xdWV1ZV9kZXB0aDsKIAogCW9sZF9xdWV1ZV9kZXB0aCA9IHNkZXYtPnF1ZXVlX2RlcHRoOwotCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBxZGVwdGgpOworCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIFNDU0lfUURFUFRIX0RFRkFVTFQ6CisJCS8qIGNoYW5nZSByZXF1ZXN0IGZyb20gc3lzZnMsIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU0NTSV9RREVQVEhfUkFNUF9VUDoKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIHFkZXB0aCk7CisJCWJyZWFrOworCWNhc2UgU0NTSV9RREVQVEhfUUZVTEw6CisJCWlmIChzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwoc2RldiwgcWRlcHRoKSA9PSAwKQorCQkJcmV0dXJuIHNkZXYtPnF1ZXVlX2RlcHRoOworCisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0ZDUCwKKwkJCQkgIjA3MTEgZGV0ZWN0ZWQgcXVldWUgZnVsbCAtIGx1biBxdWV1ZSAiCisJCQkJICJkZXB0aCBhZGp1c3RlZCB0byAlZC5cbiIsIHNkZXYtPnF1ZXVlX2RlcHRoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwogCW5ld19xdWV1ZV9kZXB0aCA9IHNkZXYtPnF1ZXVlX2RlcHRoOwotCXJkYXRhID0gc2Rldi0+aG9zdGRhdGE7CisJcmRhdGEgPSBscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShzZGV2KTsKIAlpZiAocmRhdGEpCiAJCWxwZmNfc2VuZF9zZGV2X3F1ZXVlZGVwdGhfY2hhbmdlX2V2ZW50KHBoYmEsIHZwb3J0LAogCQkJCQkJICAgICAgIHJkYXRhLT5wbm9kZSwgc2Rldi0+bHVuLApAQCAtMzc3LDUwICs0MDYsNiBAQAogfQogCiAvKioKLSAqIGxwZmNfcmFtcHVwX3F1ZXVlX2RlcHRoIC0gUG9zdCBSQU1QX1VQX1FVRVVFIGV2ZW50IGZvciB3b3JrZXIgdGhyZWFkCi0gKiBAcGhiYTogVGhlIEhiYSBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgotICoKLSAqIFRoaXMgcm91dGluZSBwb3N0IFdPUktFUl9SQU1QX1VQX1FVRVVFIGV2ZW50IGZvciBAcGhiYSB2cG9ydC4gVGhpcyByb3V0aW5lCi0gKiBwb3N0IGF0IG1vc3QgMSBldmVudCBldmVyeSA1IG1pbnV0ZSBhZnRlciBsYXN0X3JhbXBfdXBfdGltZSBvcgotICogbGFzdF9yc3JjX2Vycm9yX3RpbWUuICBUaGlzIHJvdXRpbmUgd2FrZXMgdXAgd29ya2VyIHRocmVhZCBvZiBAcGhiYQotICogdG8gcHJvY2VzcyBXT1JLRVJfUkFNX0RPV05fRVZFTlQgZXZlbnQuCi0gKgotICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBubyBsb2NrIGhlbGQuCi0gKiovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWxwZmNfcmFtcHVwX3F1ZXVlX2RlcHRoKHN0cnVjdCBscGZjX3Zwb3J0ICAqdnBvcnQsCi0JCQl1aW50MzJfdCBxdWV1ZV9kZXB0aCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IHZwb3J0LT5waGJhOwotCXVpbnQzMl90IGV2dF9wb3N0ZWQ7Ci0JYXRvbWljX2luYygmcGhiYS0+bnVtX2NtZF9zdWNjZXNzKTsKLQotCWlmICh2cG9ydC0+Y2ZnX2x1bl9xdWV1ZV9kZXB0aCA8PSBxdWV1ZV9kZXB0aCkKLQkJcmV0dXJuOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7Ci0JaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsCi0JCQlwaGJhLT5sYXN0X3JhbXBfdXBfdGltZSArIFFVRVVFX1JBTVBfVVBfSU5URVJWQUwpIHx8Ci0JICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsCi0JCQlwaGJhLT5sYXN0X3JzcmNfZXJyb3JfdGltZSArIFFVRVVFX1JBTVBfVVBfSU5URVJWQUwpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlwaGJhLT5sYXN0X3JhbXBfdXBfdGltZSA9IGppZmZpZXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPnBwb3J0LT53b3JrX3BvcnRfbG9jaywgZmxhZ3MpOwotCWV2dF9wb3N0ZWQgPSBwaGJhLT5wcG9ydC0+d29ya19wb3J0X2V2ZW50cyAmIFdPUktFUl9SQU1QX1VQX1FVRVVFOwotCWlmICghZXZ0X3Bvc3RlZCkKLQkJcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9ldmVudHMgfD0gV09SS0VSX1JBTVBfVVBfUVVFVUU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWV2dF9wb3N0ZWQpCi0JCWxwZmNfd29ya2VyX3dha2VfdXAocGhiYSk7Ci0JcmV0dXJuOwotfQotCi0vKioKICAqIGxwZmNfcmFtcF9kb3duX3F1ZXVlX2hhbmRsZXIgLSBXT1JLRVJfUkFNUF9ET1dOX1FVRVVFIGV2ZW50IGhhbmRsZXIKICAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCiAgKgpAQCAtNDcyLDQxICs0NTcsNiBAQAogfQogCiAvKioKLSAqIGxwZmNfcmFtcF91cF9xdWV1ZV9oYW5kbGVyIC0gV09SS0VSX1JBTVBfVVBfUVVFVUUgZXZlbnQgaGFuZGxlcgotICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvICBwcm9jZXNzIFdPUktFUl9SQU1QX1VQX1FVRVVFIGV2ZW50IGZvciB3b3JrZXIKLSAqIHRocmVhZC5UaGlzIHJvdXRpbmUgaW5jcmVhc2VzIHF1ZXVlIGRlcHRoIGZvciBhbGwgc2NzaSBkZXZpY2Ugb24gZWFjaCB2cG9ydAotICogYXNzb2NpYXRlZCB3aXRoIEBwaGJhIGJ5IDEuIFRoaXMgcm91dGluZSBhbHNvIHNldHMgQHBoYmEgbnVtX3JzcmNfZXJyIGFuZAotICogbnVtX2NtZF9zdWNjZXNzIHRvIHplcm8uCi0gKiovCi12b2lkCi1scGZjX3JhbXBfdXBfcXVldWVfaGFuZGxlcihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCi17Ci0Jc3RydWN0IGxwZmNfdnBvcnQgKip2cG9ydHM7Ci0Jc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0OwotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKLQlpbnQgaTsKLQotCXZwb3J0cyA9IGxwZmNfY3JlYXRlX3Zwb3J0X3dvcmtfYXJyYXkocGhiYSk7Ci0JaWYgKHZwb3J0cyAhPSBOVUxMKQotCQlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm1heF92cG9ydHMgJiYgdnBvcnRzW2ldICE9IE5VTEw7IGkrKykgewotCQkJc2hvc3QgPSBscGZjX3Nob3N0X2Zyb21fdnBvcnQodnBvcnRzW2ldKTsKLQkJCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgewotCQkJCWlmICh2cG9ydHNbaV0tPmNmZ19sdW5fcXVldWVfZGVwdGggPD0KLQkJCQkgICAgc2Rldi0+cXVldWVfZGVwdGgpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWxwZmNfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsCi0JCQkJCQkJc2Rldi0+cXVldWVfZGVwdGgrMSwKLQkJCQkJCQlTQ1NJX1FERVBUSF9SQU1QX1VQKTsKLQkJCX0KLQkJfQotCWxwZmNfZGVzdHJveV92cG9ydF93b3JrX2FycmF5KHBoYmEsIHZwb3J0cyk7Ci0JYXRvbWljX3NldCgmcGhiYS0+bnVtX3JzcmNfZXJyLCAwKTsKLQlhdG9taWNfc2V0KCZwaGJhLT5udW1fY21kX3N1Y2Nlc3MsIDApOwotfQotCi0vKioKICAqIGxwZmNfc2NzaV9kZXZfYmxvY2sgLSBzZXQgYWxsIHNjc2kgaG9zdHMgdG8gYmxvY2sgc3RhdGUKICAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KICAqCkBAIC0xNTAyLDcgKzE0NTIsNyBAQAogCX0KIAogCS8qIE5leHQgY2hlY2sgaWYgd2UgbmVlZCB0byBtYXRjaCB0aGUgcmVtb3RlIE5Qb3J0SUQgb3IgV1dQTiAqLwotCXJkYXRhID0gc2MtPmRldmljZS0+aG9zdGRhdGE7CisJcmRhdGEgPSBscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShzYy0+ZGV2aWNlKTsKIAlpZiAocmRhdGEgJiYgcmRhdGEtPnBub2RlKSB7CiAJCW5kbHAgPSByZGF0YS0+cG5vZGU7CiAKQEAgLTM1MDcsNiArMzQ1NywxNCBAQAogCSAqIHdlIG5lZWQgdG8gc2V0IHdvcmQgNCBvZiBJT0NCIGhlcmUKIAkgKi8KIAlpb2NiX2NtZC0+dW4uZmNwaS5mY3BpX3Bhcm0gPSBzY3NpX2J1ZmZsZW4oc2NzaV9jbW5kKTsKKworCS8qCisJICogSWYgdGhlIE9BUyBkcml2ZXIgZmVhdHVyZSBpcyBlbmFibGVkIGFuZCB0aGUgbHVuIGlzIGVuYWJsZWQgZm9yCisJICogT0FTLCBzZXQgdGhlIG9hcyBpb2NiIHJlbGF0ZWQgZmxhZ3MuCisJICovCisJaWYgKChwaGJhLT5jZmdfRW5hYmxlWExhbmUpICYmICgoc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKikKKwkJc2NzaV9jbW5kLT5kZXZpY2UtPmhvc3RkYXRhKS0+b2FzX2VuYWJsZWQpCisJCWxwZmNfY21kLT5jdXJfaW9jYnEuaW9jYl9mbGFnIHw9IExQRkNfSU9fT0FTOwogCXJldHVybiAwOwogfQogCkBAIC00MDIxLDcgKzM5NzksNiBAQAogCXN0cnVjdCBscGZjX25vZGVsaXN0ICpwbm9kZSA9IHJkYXRhLT5wbm9kZTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnRtcF9zZGV2OwogCWludCBkZXB0aDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBscGZjX2Zhc3RfcGF0aF9ldmVudCAqZmFzdF9wYXRoX2V2dDsKQEAgLTQyNjYsMzIgKzQyMjMsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFyZXN1bHQpCi0JCWxwZmNfcmFtcHVwX3F1ZXVlX2RlcHRoKHZwb3J0LCBxdWV1ZV9kZXB0aCk7Ci0KLQkvKgotCSAqIENoZWNrIGZvciBxdWV1ZSBmdWxsLiAgSWYgdGhlIGx1biBpcyByZXBvcnRpbmcgcXVldWUgZnVsbCwgdGhlbgotCSAqIGJhY2sgb2ZmIHRoZSBsdW4gcXVldWUgZGVwdGggdG8gcHJldmVudCB0YXJnZXQgb3ZlcmxvYWRzLgotCSAqLwotCWlmIChyZXN1bHQgPT0gU0FNX1NUQVRfVEFTS19TRVRfRlVMTCAmJiBwbm9kZSAmJgotCSAgICBOTFBfQ0hLX05PREVfQUNUKHBub2RlKSkgewotCQlzaG9zdF9mb3JfZWFjaF9kZXZpY2UodG1wX3NkZXYsIHNob3N0KSB7Ci0JCQlpZiAodG1wX3NkZXYtPmlkICE9IHNjc2lfaWQpCi0JCQkJY29udGludWU7Ci0JCQlkZXB0aCA9IHNjc2lfdHJhY2tfcXVldWVfZnVsbCh0bXBfc2RldiwKLQkJCQkJCSAgICAgIHRtcF9zZGV2LT5xdWV1ZV9kZXB0aC0xKTsKLQkJCWlmIChkZXB0aCA8PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfRkNQLAotCQkJCQkgIjA3MTEgZGV0ZWN0ZWQgcXVldWUgZnVsbCAtIGx1biBxdWV1ZSAiCi0JCQkJCSAiZGVwdGggYWRqdXN0ZWQgdG8gJWQuXG4iLCBkZXB0aCk7Ci0JCQlscGZjX3NlbmRfc2Rldl9xdWV1ZWRlcHRoX2NoYW5nZV9ldmVudChwaGJhLCB2cG9ydCwKLQkJCQkJCQkgICAgICAgcG5vZGUsCi0JCQkJCQkJICAgICAgIHRtcF9zZGV2LT5sdW4sCi0JCQkJCQkJICAgICAgIGRlcHRoKzEsIGRlcHRoKTsKLQkJfQotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7CiAJbHBmY19jbWQtPnBDbWQgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKQEAgLTQ0OTIsNiArNDQyMyw4IEBACiAJfQogCXBpb2NiLT51bHBGQ1AyUmN2eSA9IChuZGxwLT5ubHBfZmNwX2luZm8gJiBOTFBfRkNQXzJfREVWSUNFKSA/IDEgOiAwOwogCXBpb2NiLT51bHBDbGFzcyA9IChuZGxwLT5ubHBfZmNwX2luZm8gJiAweDBmKTsKKwlwaW9jYi0+dWxwUFUgPSAwOworCXBpb2NiLT51bi5mY3BpLmZjcGlfcGFybSA9IDA7CiAKIAkvKiB1bHBUaW1lb3V0IGlzIG9ubHkgb25lIGJ5dGUgKi8KIAlpZiAobHBmY19jbWQtPnRpbWVvdXQgPiAweGZmKSB7CkBAIC00NjkxLDEyICs0NjI0LDEzIEBACiB7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNob3N0LT5ob3N0ZGF0YTsKIAlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9IHZwb3J0LT5waGJhOwotCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YTsKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqbmRscDsKIAlzdHJ1Y3QgbHBmY19zY3NpX2J1ZiAqbHBmY19jbWQ7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoY21uZC0+ZGV2aWNlKSk7CiAJaW50IGVycjsKIAorCXJkYXRhID0gbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2UoY21uZC0+ZGV2aWNlKTsKIAllcnIgPSBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCk7CiAJaWYgKGVycikgewogCQljbW5kLT5yZXN1bHQgPSBlcnI7CkBAIC00NzgyLDYgKzQ3MTYsMjQgQEAKIAkJCQkgICZscGZjX2NtZC0+Y3VyX2lvY2JxLCBTTElfSU9DQl9SRVRfSU9DQik7CiAJaWYgKGVycikgewogCQlhdG9taWNfZGVjKCZuZGxwLT5jbWRfcGVuZGluZyk7CisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0ZDUCwKKwkJCQkgIjMzNzYgRkNQIGNvdWxkIG5vdCBpc3N1ZSBJT0NCIGVyciAleCIKKwkJCQkgIkZDUCBjbWQgeCV4IDwlZC8lZD4gIgorCQkJCSAic2lkOiB4JXggZGlkOiB4JXggb3hpZDogeCV4ICIKKwkJCQkgIkRhdGE6IHgleCB4JXggeCV4IHgleFxuIiwKKwkJCQkgZXJyLCBjbW5kLT5jbW5kWzBdLAorCQkJCSBjbW5kLT5kZXZpY2UgPyBjbW5kLT5kZXZpY2UtPmlkIDogMHhmZmZmLAorCQkJCSBjbW5kLT5kZXZpY2UgPyBjbW5kLT5kZXZpY2UtPmx1biA6IDB4ZmZmZiwKKwkJCQkgdnBvcnQtPmZjX215RElELCBuZGxwLT5ubHBfRElELAorCQkJCSBwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQgPworCQkJCSBscGZjX2NtZC0+Y3VyX2lvY2JxLnNsaTRfeHJpdGFnIDogMHhmZmZmLAorCQkJCSBscGZjX2NtZC0+Y3VyX2lvY2JxLmlvY2IudWxwQ29udGV4dCwKKwkJCQkgbHBmY19jbWQtPmN1cl9pb2NicS5pb2NiLnVscElvVGFnLAorCQkJCSBscGZjX2NtZC0+Y3VyX2lvY2JxLmlvY2IudWxwVGltZW91dCwKKwkJCQkgKHVpbnQzMl90KQorCQkJCSAoY21uZC0+cmVxdWVzdC0+dGltZW91dCAvIDEwMDApKTsKKworCiAJCWdvdG8gb3V0X2hvc3RfYnVzeV9mcmVlX2J1ZjsKIAl9CiAJaWYgKHBoYmEtPmNmZ19wb2xsICYgRU5BQkxFX0ZDUF9SSU5HX1BPTExJTkcpIHsKQEAgLTUxNjEsMTAgKzUxMTMsMTEgQEAKIHN0YXRpYyBpbnQKIGxwZmNfY2hrX3RndF9tYXBwZWQoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQogewotCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YTsKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqcG5vZGU7CiAJdW5zaWduZWQgbG9uZyBsYXRlcjsKIAorCXJkYXRhID0gbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2UoY21uZC0+ZGV2aWNlKTsKIAlpZiAoIXJkYXRhKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0ZDUCwKIAkJCSIwNzk3IFRndCBNYXAgcnBvcnQgZmFpbHVyZTogcmRhdGEgeCVwXG4iLCByZGF0YSk7CkBAIC01MTgyLDcgKzUxMzUsNyBAQAogCQlpZiAocG5vZGUtPm5scF9zdGF0ZSA9PSBOTFBfU1RFX01BUFBFRF9OT0RFKQogCQkJcmV0dXJuIFNVQ0NFU1M7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7Ci0JCXJkYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwkJcmRhdGEgPSBscGZjX3Jwb3J0X2RhdGFfZnJvbV9zY3NpX2RldmljZShjbW5kLT5kZXZpY2UpOwogCQlpZiAoIXJkYXRhKQogCQkJcmV0dXJuIEZBSUxFRDsKIAkJcG5vZGUgPSByZGF0YS0+cG5vZGU7CkBAIC01MjU0LDEzICs1MjA3LDE0IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0ID0gY21uZC0+ZGV2aWNlLT5ob3N0OwogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7Ci0Jc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGEgPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX3Jwb3J0X2RhdGEgKnJkYXRhOwogCXN0cnVjdCBscGZjX25vZGVsaXN0ICpwbm9kZTsKIAl1bnNpZ25lZCB0Z3RfaWQgPSBjbW5kLT5kZXZpY2UtPmlkOwogCXVuc2lnbmVkIGludCBsdW5faWQgPSBjbW5kLT5kZXZpY2UtPmx1bjsKIAlzdHJ1Y3QgbHBmY19zY3NpX2V2ZW50X2hlYWRlciBzY3NpX2V2ZW50OwogCWludCBzdGF0dXM7CiAKKwlyZGF0YSA9IGxwZmNfcnBvcnRfZGF0YV9mcm9tX3Njc2lfZGV2aWNlKGNtbmQtPmRldmljZSk7CiAJaWYgKCFyZGF0YSkgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0ZDUCwKIAkJCSIwNzk4IERldmljZSBSZXNldCBycG9ydCBmYWlsdXJlOiByZGF0YSB4JXBcbiIsIHJkYXRhKTsKQEAgLTUzMjMsMTMgKzUyNzcsMTQgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBjbW5kLT5kZXZpY2UtPmhvc3Q7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNob3N0LT5ob3N0ZGF0YTsKLQlzdHJ1Y3QgbHBmY19ycG9ydF9kYXRhICpyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcmRhdGE7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlOwogCXVuc2lnbmVkIHRndF9pZCA9IGNtbmQtPmRldmljZS0+aWQ7CiAJdW5zaWduZWQgaW50IGx1bl9pZCA9IGNtbmQtPmRldmljZS0+bHVuOwogCXN0cnVjdCBscGZjX3Njc2lfZXZlbnRfaGVhZGVyIHNjc2lfZXZlbnQ7CiAJaW50IHN0YXR1czsKIAorCXJkYXRhID0gbHBmY19ycG9ydF9kYXRhX2Zyb21fc2NzaV9kZXZpY2UoY21uZC0+ZGV2aWNlKTsKIAlpZiAoIXJkYXRhKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRkNQLAogCQkJIjA3OTkgVGFyZ2V0IFJlc2V0IHJwb3J0IGZhaWx1cmU6IHJkYXRhIHglcFxuIiwgcmRhdGEpOwpAQCAtNTUyOSwxMSArNTQ4NCw0NSBAQAogCXVpbnQzMl90IG51bV90b19hbGxvYyA9IDA7CiAJaW50IG51bV9hbGxvY2F0ZWQgPSAwOwogCXVpbnQzMl90IHNkZXZfY250OworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpkZXZpY2VfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBscGZjX25hbWUgdGFyZ2V0X3d3cG47CiAKIAlpZiAoIXJwb3J0IHx8IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KSkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCXNkZXYtPmhvc3RkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJaWYgKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkgeworCisJCS8qCisJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgZGV2aWNlIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgbHVuCisJCSAqIGV4aXN0cy4gIElmIG5vdCwgY3JlYXRlIG9uZS4KKwkJICovCisKKwkJdTY0X3RvX3d3bihycG9ydC0+cG9ydF9uYW1lLCB0YXJnZXRfd3dwbi51Lnd3bik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCWRldmljZV9kYXRhID0gX19scGZjX2dldF9kZXZpY2VfZGF0YShwaGJhLAorCQkJCQkJICAgICAmcGhiYS0+bHVucywKKwkJCQkJCSAgICAgJnZwb3J0LT5mY19wb3J0bmFtZSwKKwkJCQkJCSAgICAgJnRhcmdldF93d3BuLAorCQkJCQkJICAgICBzZGV2LT5sdW4pOworCQlpZiAoIWRldmljZV9kYXRhKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCQlkZXZpY2VfZGF0YSA9IGxwZmNfY3JlYXRlX2RldmljZV9kYXRhKHBoYmEsCisJCQkJCQkJJnZwb3J0LT5mY19wb3J0bmFtZSwKKwkJCQkJCQkmdGFyZ2V0X3d3cG4sCisJCQkJCQkJc2Rldi0+bHVuLCB0cnVlKTsKKwkJCWlmICghZGV2aWNlX2RhdGEpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQkJbGlzdF9hZGRfdGFpbCgmZGV2aWNlX2RhdGEtPmxpc3RlbnRyeSwgJnBoYmEtPmx1bnMpOworCQl9CisJCWRldmljZV9kYXRhLT5ycG9ydF9kYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJCWRldmljZV9kYXRhLT5hdmFpbGFibGUgPSB0cnVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJCXNkZXYtPmhvc3RkYXRhID0gZGV2aWNlX2RhdGE7CisJfSBlbHNlIHsKKwkJc2Rldi0+aG9zdGRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwl9CiAJc2Rldl9jbnQgPSBhdG9taWNfaW5jX3JldHVybigmcGhiYS0+c2Rldl9jbnQpOwogCiAJLyoKQEAgLTU2MjMsMTEgKzU2MTIsMzQ0IEBACiB7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqZGV2aWNlX2RhdGEgPSBzZGV2LT5ob3N0ZGF0YTsKKwogCWF0b21pY19kZWMoJnBoYmEtPnNkZXZfY250KTsKKwlpZiAoKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkgJiYgKGRldmljZV9kYXRhKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQlkZXZpY2VfZGF0YS0+YXZhaWxhYmxlID0gZmFsc2U7CisJCWlmICghZGV2aWNlX2RhdGEtPm9hc19lbmFibGVkKQorCQkJbHBmY19kZWxldGVfZGV2aWNlX2RhdGEocGhiYSwgZGV2aWNlX2RhdGEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJfQogCXNkZXYtPmhvc3RkYXRhID0gTlVMTDsKIAlyZXR1cm47CiB9CiAKKy8qKgorICogbHBmY19jcmVhdGVfZGV2aWNlX2RhdGEgLSBjcmVhdGVzIGFuZCBpbml0aWFsaXplcyBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgZm9yIE9BUworICogQHBoYTogUG9pbnRlciB0byBob3N0IGJ1cyBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEB2cG9ydF93d3BuOiBQb2ludGVyIHRvIHZwb3J0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQHRhcmdldF93d3BuOiBQb2ludGVyIHRvIHRhcmdldCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEBsdW46IEx1biBvbiB0YXJnZXQKKyAqIEBhdG9taWNfY3JlYXRlOiBGbGFnIHRvIGluZGljYXRlIGlmIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkIHVzaW5nIHRoZQorICoJCSAgR0ZQX0FUT01JQyBmbGFnIG9yIG5vdC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhIGRldmljZSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3aWxsIGNvbnRhaW4gaWRlbnRpZnlpbmcKKyAqIGluZm9ybWF0aW9uIGZvciB0aGUgZGV2aWNlIChob3N0IHd3cG4sIHRhcmdldCB3d3BuLCBsdW4pLCBzdGF0ZSBvZiBPQVMsCisgKiB3aGV0aGVyIG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBsdW4gaXMgYXZhaWxhYmxlIGJ5IHRoZSBzeXN0ZW0sCisgKiBhbmQgcG9pbnRlciB0byB0aGUgcnBvcnQgZGF0YS4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIE5VTEwgLSBFcnJvcgorICogICBQb2ludGVyIHRvIGxwZmNfZGV2aWNlX2RhdGEgLSBTdWNjZXNzCisgKiovCitzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSoKK2xwZmNfY3JlYXRlX2RldmljZV9kYXRhKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfbmFtZSAqdnBvcnRfd3dwbiwKKwkJCXN0cnVjdCBscGZjX25hbWUgKnRhcmdldF93d3BuLCB1aW50NjRfdCBsdW4sCisJCQlib29sIGF0b21pY19jcmVhdGUpCit7CisKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqbHVuX2luZm87CisJaW50IG1lbW9yeV9mbGFnczsKKworCWlmICh1bmxpa2VseSghcGhiYSkgfHwgIXZwb3J0X3d3cG4gfHwgIXRhcmdldF93d3BuICB8fAorCSAgICAhKHBoYmEtPmNmZ19FbmFibGVYTGFuZSkpCisJCXJldHVybiBOVUxMOworCisJLyogQXR0ZW1wdCB0byBjcmVhdGUgdGhlIGRldmljZSBkYXRhIHRvIGNvbnRhaW4gbHVuIGluZm8gKi8KKworCWlmIChhdG9taWNfY3JlYXRlKQorCQltZW1vcnlfZmxhZ3MgPSBHRlBfQVRPTUlDOworCWVsc2UKKwkJbWVtb3J5X2ZsYWdzID0gR0ZQX0tFUk5FTDsKKwlsdW5faW5mbyA9IG1lbXBvb2xfYWxsb2MocGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wsIG1lbW9yeV9mbGFncyk7CisJaWYgKCFsdW5faW5mbykKKwkJcmV0dXJuIE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJmx1bl9pbmZvLT5saXN0ZW50cnkpOworCWx1bl9pbmZvLT5ycG9ydF9kYXRhICA9IE5VTEw7CisJbWVtY3B5KCZsdW5faW5mby0+ZGV2aWNlX2lkLnZwb3J0X3d3cG4sIHZwb3J0X3d3cG4sCisJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJbWVtY3B5KCZsdW5faW5mby0+ZGV2aWNlX2lkLnRhcmdldF93d3BuLCB0YXJnZXRfd3dwbiwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwlsdW5faW5mby0+ZGV2aWNlX2lkLmx1biA9IGx1bjsKKwlsdW5faW5mby0+b2FzX2VuYWJsZWQgPSBmYWxzZTsKKwlsdW5faW5mby0+YXZhaWxhYmxlID0gZmFsc2U7CisJcmV0dXJuIGx1bl9pbmZvOworfQorCisvKioKKyAqIGxwZmNfZGVsZXRlX2RldmljZV9kYXRhIC0gZnJlZXMgYSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgZm9yIE9BUworICogQHBoYTogUG9pbnRlciB0byBob3N0IGJ1cyBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEBsdW5faW5mbzogUG9pbnRlciB0byBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgdG8gZnJlZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZnJlZXMgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGRldmljZSBkYXRhIHN0cnVjdHVyZSBwYXNzZWQuCisgKgorICoqLwordm9pZAorbHBmY19kZWxldGVfZGV2aWNlX2RhdGEoc3RydWN0IGxwZmNfaGJhICpwaGJhLAorCQkJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmx1bl9pbmZvKQoreworCisJaWYgKHVubGlrZWx5KCFwaGJhKSB8fCAhbHVuX2luZm8gIHx8CisJICAgICEocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKSkKKwkJcmV0dXJuOworCisJaWYgKCFsaXN0X2VtcHR5KCZsdW5faW5mby0+bGlzdGVudHJ5KSkKKwkJbGlzdF9kZWwoJmx1bl9pbmZvLT5saXN0ZW50cnkpOworCW1lbXBvb2xfZnJlZShsdW5faW5mbywgcGhiYS0+ZGV2aWNlX2RhdGFfbWVtX3Bvb2wpOworCXJldHVybjsKK30KKworLyoqCisgKiBfX2xwZmNfZ2V0X2RldmljZV9kYXRhIC0gcmV0dXJucyB0aGUgZGV2aWNlIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgbHVuCisgKiBAcGhhOiBQb2ludGVyIHRvIGhvc3QgYnVzIGFkYXB0ZXIgc3RydWN0dXJlLgorICogQGxpc3Q6IFBvaW50IHRvIGxpc3QgdG8gc2VhcmNoLgorICogQHZwb3J0X3d3cG46IFBvaW50ZXIgdG8gdnBvcnQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAdGFyZ2V0X3d3cG46IFBvaW50ZXIgdG8gdGFyZ2V0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQGx1bjogTHVuIG9uIHRhcmdldAorICoKKyAqIFRoaXMgcm91dGluZSBzZWFyY2hlcyB0aGUgbGlzdCBwYXNzZWQgZm9yIHRoZSBzcGVjaWZpZWQgbHVuJ3MgZGV2aWNlIGRhdGEuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhvbGQgbG9ja3MsIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyCisgKiB0byBlbnN1cmUgdGhlIHByb3BlciBsb2NrIGlzIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybiBjb2RlczoKKyAqICAgTlVMTCAtIEVycm9yCisgKiAgIFBvaW50ZXIgdG8gbHBmY19kZXZpY2VfZGF0YSAtIFN1Y2Nlc3MKKyAqKi8KK3N0cnVjdCBscGZjX2RldmljZV9kYXRhKgorX19scGZjX2dldF9kZXZpY2VfZGF0YShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCSAgICAgICBzdHJ1Y3QgbHBmY19uYW1lICp2cG9ydF93d3BuLAorCQkgICAgICAgc3RydWN0IGxwZmNfbmFtZSAqdGFyZ2V0X3d3cG4sIHVpbnQ2NF90IGx1bikKK3sKKworCXN0cnVjdCBscGZjX2RldmljZV9kYXRhICpsdW5faW5mbzsKKworCWlmICh1bmxpa2VseSghcGhiYSkgfHwgIWxpc3QgfHwgIXZwb3J0X3d3cG4gfHwgIXRhcmdldF93d3BuIHx8CisJICAgICFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiBOVUxMOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsdW4gaXMgYWxyZWFkeSBlbmFibGVkIGZvciBPQVMuICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGx1bl9pbmZvLCBsaXN0LCBsaXN0ZW50cnkpIHsKKwkJaWYgKChtZW1jbXAoJmx1bl9pbmZvLT5kZXZpY2VfaWQudnBvcnRfd3dwbiwgdnBvcnRfd3dwbiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpID09IDApICYmCisJCSAgICAobWVtY21wKCZsdW5faW5mby0+ZGV2aWNlX2lkLnRhcmdldF93d3BuLCB0YXJnZXRfd3dwbiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpID09IDApICYmCisJCSAgICAobHVuX2luZm8tPmRldmljZV9pZC5sdW4gPT0gbHVuKSkKKwkJCXJldHVybiBsdW5faW5mbzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBscGZjX2ZpbmRfbmV4dF9vYXNfbHVuIC0gc2VhcmNoZXMgZm9yIHRoZSBuZXh0IG9hcyBsdW4KKyAqIEBwaGE6IFBvaW50ZXIgdG8gaG9zdCBidXMgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBAdnBvcnRfd3dwbjogUG9pbnRlciB0byB2cG9ydCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEB0YXJnZXRfd3dwbjogUG9pbnRlciB0byB0YXJnZXQncyB3d3BuIGluZm9ybWF0aW9uCisgKiBAc3RhcnRpbmdfbHVuOiBQb2ludGVyIHRvIHRoZSBsdW4gdG8gc3RhcnQgc2VhcmNoaW5nIGZvcgorICogQGZvdW5kX3Zwb3J0X3d3cG46IFBvaW50ZXIgdG8gdGhlIGZvdW5kIGx1bidzIHZwb3J0IHd3cG4gaW5mb3JtYXRpb24KKyAqIEBmb3VuZF90YXJnZXRfd3dwbjogUG9pbnRlciB0byB0aGUgZm91bmQgbHVuJ3MgdGFyZ2V0IHd3cG4gaW5mb3JtYXRpb24KKyAqIEBmb3VuZF9sdW46IFBvaW50ZXIgdG8gdGhlIGZvdW5kIGx1bi4KKyAqIEBmb3VuZF9sdW5fc3RhdHVzOiBQb2ludGVyIHRvIHN0YXR1cyBvZiB0aGUgZm91bmQgbHVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzZWFyY2hlcyB0aGUgbHVucyBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGx1bgorICogb3IgdGhlIGZpcnN0IGx1biBmb3IgdGhlIHZwb3J0L3RhcmdldC4gIElmIHRoZSB2cG9ydCB3d3BuIGNvbnRhaW5zCisgKiBhIHplcm8gdmFsdWUgdGhlbiBhIHNwZWNpZmljIHZwb3J0IGlzIG5vdCBzcGVjaWZpZWQuIEluIHRoaXMgY2FzZQorICogYW55IHZwb3J0IHdoaWNoIGNvbnRhaW5zIHRoZSBsdW4gd2lsbCBiZSBjb25zaWRlcmVkIGEgbWF0Y2guICBJZiB0aGUKKyAqIHRhcmdldCB3d3BuIGNvbnRhaW5zIGEgemVybyB2YWx1ZSB0aGVuIGEgc3BlY2lmaWMgdGFyZ2V0IGlzIG5vdCBzcGVjaWZpZWQuCisgKiBJbiB0aGlzIGNhc2UgYW55IHRhcmdldCB3aGljaCBjb250YWlucyB0aGUgbHVuIHdpbGwgYmUgY29uc2lkZXJlZCBhCisgKiBtYXRjaC4gIElmIHRoZSBsdW4gaXMgZm91bmQsIHRoZSBsdW4sIHZwb3J0IHd3cG4sIHRhcmdldCB3d3BuIGFuZCBsdW4gc3RhdHVzCisgKiBhcmUgcmV0dXJuZWQuICBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvIHJldHVybiB0aGUgbmV4dCBsdW4gaWYgYXZhaWxhYmxlLgorICogSWYgdGhlIG5leHQgbHVuIGlzIG5vdCBmb3VuZCwgc3RhcnRpbmdfbHVuIHBhcmFtZXRlciB3aWxsIGJlIHNldCB0bworICogTk9fTU9SRV9PQVNfTFVOLgorICoKKyAqIFJldHVybiBjb2RlczoKKyAqICAgbm9uLTAgLSBFcnJvcgorICogICAwIC0gU3VjY2VzcworICoqLworYm9vbAorbHBmY19maW5kX25leHRfb2FzX2x1bihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX25hbWUgKnZwb3J0X3d3cG4sCisJCSAgICAgICBzdHJ1Y3QgbHBmY19uYW1lICp0YXJnZXRfd3dwbiwgdWludDY0X3QgKnN0YXJ0aW5nX2x1biwKKwkJICAgICAgIHN0cnVjdCBscGZjX25hbWUgKmZvdW5kX3Zwb3J0X3d3cG4sCisJCSAgICAgICBzdHJ1Y3QgbHBmY19uYW1lICpmb3VuZF90YXJnZXRfd3dwbiwKKwkJICAgICAgIHVpbnQ2NF90ICpmb3VuZF9sdW4sCisJCSAgICAgICB1aW50MzJfdCAqZm91bmRfbHVuX3N0YXR1cykKK3sKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmx1bl9pbmZvOworCXN0cnVjdCBscGZjX2RldmljZV9pZCAqZGV2aWNlX2lkOworCXVpbnQ2NF90IGx1bjsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlpZiAodW5saWtlbHkoIXBoYmEpIHx8ICF2cG9ydF93d3BuIHx8ICF0YXJnZXRfd3dwbiB8fAorCSAgICAhc3RhcnRpbmdfbHVuIHx8ICFmb3VuZF92cG9ydF93d3BuIHx8CisJICAgICFmb3VuZF90YXJnZXRfd3dwbiB8fCAhZm91bmRfbHVuIHx8ICFmb3VuZF9sdW5fc3RhdHVzIHx8CisJICAgICgqc3RhcnRpbmdfbHVuID09IE5PX01PUkVfT0FTX0xVTikgfHwKKwkgICAgIXBoYmEtPmNmZ19FbmFibGVYTGFuZSkKKwkJcmV0dXJuIGZhbHNlOworCisJbHVuID0gKnN0YXJ0aW5nX2x1bjsKKwkqZm91bmRfbHVuID0gTk9fTU9SRV9PQVNfTFVOOworCSpzdGFydGluZ19sdW4gPSBOT19NT1JFX09BU19MVU47CisKKwkvKiBTZWFyY2ggZm9yIGx1biBvciB0aGUgbHVuIGNsb3NldCBpbiB2YWx1ZSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGx1bl9pbmZvLCAmcGhiYS0+bHVucywgbGlzdGVudHJ5KSB7CisJCWlmICgoKHd3bl90b191NjQodnBvcnRfd3dwbi0+dS53d24pID09IDApIHx8CisJCSAgICAgKG1lbWNtcCgmbHVuX2luZm8tPmRldmljZV9pZC52cG9ydF93d3BuLCB2cG9ydF93d3BuLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSkgPT0gMCkpICYmCisJCSAgICAoKHd3bl90b191NjQodGFyZ2V0X3d3cG4tPnUud3duKSA9PSAwKSB8fAorCQkgICAgIChtZW1jbXAoJmx1bl9pbmZvLT5kZXZpY2VfaWQudGFyZ2V0X3d3cG4sIHRhcmdldF93d3BuLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSkgPT0gMCkpICYmCisJCSAgICAobHVuX2luZm8tPm9hc19lbmFibGVkKSkgeworCQkJZGV2aWNlX2lkID0gJmx1bl9pbmZvLT5kZXZpY2VfaWQ7CisJCQlpZiAoKCFmb3VuZCkgJiYKKwkJCSAgICAoKGx1biA9PSBGSU5EX0ZJUlNUX09BU19MVU4pIHx8CisJCQkgICAgIChkZXZpY2VfaWQtPmx1biA9PSBsdW4pKSkgeworCQkJCSpmb3VuZF9sdW4gPSBkZXZpY2VfaWQtPmx1bjsKKwkJCQltZW1jcHkoZm91bmRfdnBvcnRfd3dwbiwKKwkJCQkgICAgICAgJmRldmljZV9pZC0+dnBvcnRfd3dwbiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwkJCQltZW1jcHkoZm91bmRfdGFyZ2V0X3d3cG4sCisJCQkJICAgICAgICZkZXZpY2VfaWQtPnRhcmdldF93d3BuLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCQkJCWlmIChsdW5faW5mby0+YXZhaWxhYmxlKQorCQkJCQkqZm91bmRfbHVuX3N0YXR1cyA9CisJCQkJCQlPQVNfTFVOX1NUQVRVU19FWElTVFM7CisJCQkJZWxzZQorCQkJCQkqZm91bmRfbHVuX3N0YXR1cyA9IDA7CisJCQkJaWYgKHBoYmEtPmNmZ19vYXNfZmxhZ3MgJiBPQVNfRklORF9BTllfVlBPUlQpCisJCQkJCW1lbXNldCh2cG9ydF93d3BuLCAweDAsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCQkJCWlmIChwaGJhLT5jZmdfb2FzX2ZsYWdzICYgT0FTX0ZJTkRfQU5ZX1RBUkdFVCkKKwkJCQkJbWVtc2V0KHRhcmdldF93d3BuLCAweDAsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoZm91bmQpIHsKKwkJCQkqc3RhcnRpbmdfbHVuID0gZGV2aWNlX2lkLT5sdW47CisJCQkJbWVtY3B5KHZwb3J0X3d3cG4sICZkZXZpY2VfaWQtPnZwb3J0X3d3cG4sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJCQkJbWVtY3B5KHRhcmdldF93d3BuLCAmZGV2aWNlX2lkLT50YXJnZXRfd3dwbiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisJcmV0dXJuIGZvdW5kOworfQorCisvKioKKyAqIGxwZmNfZW5hYmxlX29hc19sdW4gLSBlbmFibGVzIGEgbHVuIGZvciBPQVMgb3BlcmF0aW9ucworICogQHBoYTogUG9pbnRlciB0byBob3N0IGJ1cyBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEB2cG9ydF93d3BuOiBQb2ludGVyIHRvIHZwb3J0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQHRhcmdldF93d3BuOiBQb2ludGVyIHRvIHRhcmdldCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEBsdW46IEx1bgorICoKKyAqIFRoaXMgcm91dGluZSBlbmFibGVzIGEgbHVuIGZvciBvYXMgb3BlcmF0aW9ucy4gIFRoZSByb3V0aW5lcyBkb2VzIHNvIGJ5CisgKiBkb2luZyB0aGUgZm9sbG93aW5nIDoKKyAqCisgKiAgIDEpIENoZWNrcyB0byBzZWUgaWYgdGhlIGRldmljZSBkYXRhIGZvciB0aGUgbHVuIGhhcyBiZWVuIGNyZWF0ZWQuCisgKiAgIDIpIElmIGZvdW5kLCBzZXRzIHRoZSBPQVMgZW5hYmxlZCBmbGFnIGlmIG5vdCBzZXQgYW5kIHJldHVybnMuCisgKiAgIDMpIE90aGVyd2lzZSwgY3JlYXRlcyBhIGRldmljZSBkYXRhIHN0cnVjdHVyZS4KKyAqICAgNCkgSWYgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGluZGljYXRlcyB0aGUgZGV2aWNlIGRhdGEgaXMgZm9yIGFuIE9BUyBsdW4sCisgKiAgIGluZGljYXRlcyB0aGUgbHVuIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFkZCB0byB0aGUgbGlzdCBvZiBsdW5zLgorICoKKyAqIFJldHVybiBjb2RlczoKKyAqICAgZmFsc2UgLSBFcnJvcgorICogICB0cnVlIC0gU3VjY2VzcworICoqLworYm9vbAorbHBmY19lbmFibGVfb2FzX2x1bihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX25hbWUgKnZwb3J0X3d3cG4sCisJCSAgICBzdHJ1Y3QgbHBmY19uYW1lICp0YXJnZXRfd3dwbiwgdWludDY0X3QgbHVuKQoreworCisJc3RydWN0IGxwZmNfZGV2aWNlX2RhdGEgKmx1bl9pbmZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodW5saWtlbHkoIXBoYmEpIHx8ICF2cG9ydF93d3BuIHx8ICF0YXJnZXRfd3dwbiB8fAorCSAgICAhcGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2UgZGF0YSBmb3IgdGhlIGx1biBoYXMgYmVlbiBjcmVhdGVkICovCisJbHVuX2luZm8gPSBfX2xwZmNfZ2V0X2RldmljZV9kYXRhKHBoYmEsICZwaGJhLT5sdW5zLCB2cG9ydF93d3BuLAorCQkJCQkgIHRhcmdldF93d3BuLCBsdW4pOworCWlmIChsdW5faW5mbykgeworCQlpZiAoIWx1bl9pbmZvLT5vYXNfZW5hYmxlZCkKKwkJCWx1bl9pbmZvLT5vYXNfZW5hYmxlZCA9IHRydWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogQ3JlYXRlIGFuIGx1biBpbmZvIHN0cnVjdHVyZSBhbmQgYWRkIHRvIGxpc3Qgb2YgbHVucyAqLworCWx1bl9pbmZvID0gbHBmY19jcmVhdGVfZGV2aWNlX2RhdGEocGhiYSwgdnBvcnRfd3dwbiwgdGFyZ2V0X3d3cG4sIGx1biwKKwkJCQkJICAgZmFsc2UpOworCWlmIChsdW5faW5mbykgeworCQlsdW5faW5mby0+b2FzX2VuYWJsZWQgPSB0cnVlOworCQlsdW5faW5mby0+YXZhaWxhYmxlID0gZmFsc2U7CisJCWxpc3RfYWRkX3RhaWwoJmx1bl9pbmZvLT5saXN0ZW50cnksICZwaGJhLT5sdW5zKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBscGZjX2Rpc2FibGVfb2FzX2x1biAtIGRpc2FibGVzIGEgbHVuIGZvciBPQVMgb3BlcmF0aW9ucworICogQHBoYTogUG9pbnRlciB0byBob3N0IGJ1cyBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEB2cG9ydF93d3BuOiBQb2ludGVyIHRvIHZwb3J0J3Mgd3dwbiBpbmZvcm1hdGlvbgorICogQHRhcmdldF93d3BuOiBQb2ludGVyIHRvIHRhcmdldCdzIHd3cG4gaW5mb3JtYXRpb24KKyAqIEBsdW46IEx1bgorICoKKyAqIFRoaXMgcm91dGluZSBkaXNhYmxlcyBhIGx1biBmb3Igb2FzIG9wZXJhdGlvbnMuICBUaGUgcm91dGluZXMgZG9lcyBzbyBieQorICogZG9pbmcgdGhlIGZvbGxvd2luZyA6CisgKgorICogICAxKSBDaGVja3MgdG8gc2VlIGlmIHRoZSBkZXZpY2UgZGF0YSBmb3IgdGhlIGx1biBpcyBjcmVhdGVkLgorICogICAyKSBJZiBwcmVzZW50LCBjbGVhcnMgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGlzIGx1biBpcyBmb3IgT0FTLgorICogICAzKSBJZiB0aGUgbHVuIGlzIG5vdCBhdmFpbGFibGUgYnkgdGhlIHN5c3RlbSwgdGhlIGRldmljZSBkYXRhIGlzCisgKiAgIGZyZWVkLgorICoKKyAqIFJldHVybiBjb2RlczoKKyAqICAgZmFsc2UgLSBFcnJvcgorICogICB0cnVlIC0gU3VjY2VzcworICoqLworYm9vbAorbHBmY19kaXNhYmxlX29hc19sdW4oc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19uYW1lICp2cG9ydF93d3BuLAorCQkgICAgIHN0cnVjdCBscGZjX25hbWUgKnRhcmdldF93d3BuLCB1aW50NjRfdCBsdW4pCit7CisKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSAqbHVuX2luZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh1bmxpa2VseSghcGhiYSkgfHwgIXZwb3J0X3d3cG4gfHwgIXRhcmdldF93d3BuIHx8CisJICAgICFwaGJhLT5jZmdfRW5hYmxlWExhbmUpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5kZXZpY2Vsb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGx1biBpcyBhdmFpbGFibGUuICovCisJbHVuX2luZm8gPSBfX2xwZmNfZ2V0X2RldmljZV9kYXRhKHBoYmEsCisJCQkJCSAgJnBoYmEtPmx1bnMsIHZwb3J0X3d3cG4sCisJCQkJCSAgdGFyZ2V0X3d3cG4sIGx1bik7CisJaWYgKGx1bl9pbmZvKSB7CisJCWx1bl9pbmZvLT5vYXNfZW5hYmxlZCA9IGZhbHNlOworCQlpZiAoIWx1bl9pbmZvLT5hdmFpbGFibGUpCisJCQlscGZjX2RlbGV0ZV9kZXZpY2VfZGF0YShwaGJhLCBsdW5faW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmRldmljZWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+ZGV2aWNlbG9jaywgZmxhZ3MpOworCXJldHVybiBmYWxzZTsKK30KIAogc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBscGZjX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuaAppbmRleCA4NTJmZjdkLi4wMTIwYmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuaApAQCAtNDEsNiArNDEsMjAgQEAKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqcG5vZGU7CS8qIFBvaW50ZXIgdG8gdGhlIG5vZGUgc3RydWN0dXJlLiAqLwogfTsKIAorc3RydWN0IGxwZmNfZGV2aWNlX2lkIHsKKwlzdHJ1Y3QgbHBmY19uYW1lIHZwb3J0X3d3cG47CisJc3RydWN0IGxwZmNfbmFtZSB0YXJnZXRfd3dwbjsKKwl1aW50NjRfdCBsdW47Cit9OworCitzdHJ1Y3QgbHBmY19kZXZpY2VfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0ZW50cnk7CisJc3RydWN0IGxwZmNfcnBvcnRfZGF0YSAqcnBvcnRfZGF0YTsKKwlzdHJ1Y3QgbHBmY19kZXZpY2VfaWQgZGV2aWNlX2lkOworCWJvb2wgb2FzX2VuYWJsZWQ7CisJYm9vbCBhdmFpbGFibGU7Cit9OworCiBzdHJ1Y3QgZmNwX3JzcCB7CiAJdWludDMyX3QgcnNwUnN2ZDE7CS8qIEZDIFdvcmQgMCwgYnl0ZSAwOjMgKi8KIAl1aW50MzJfdCByc3BSc3ZkMjsJLyogRkMgV29yZCAxLCBieXRlIDA6MyAqLwpAQCAtMTY2LDMgKzE4MCw3IEBACiAjZGVmaW5lIExQRkNfU0NTSV9ETUFfRVhUX1NJWkUgMjY0CiAjZGVmaW5lIExQRkNfQlBMX1NJWkUgICAgICAgICAgMTAyNAogI2RlZmluZSBNREFDX0RJUkVDVF9DTUQgICAgICAgICAgICAgICAgICAweDIyCisKKyNkZWZpbmUgRklORF9GSVJTVF9PQVNfTFVOCQkgMAorI2RlZmluZSBOT19NT1JFX09BU19MVU4JCQktMQorI2RlZmluZSBOT1RfT0FTX0VOQUJMRURfTFVOCQlOT19NT1JFX09BU19MVU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDhmNTgwZmQuLjZiYjUxZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKQEAgLTYzNSw3ICs2MzUsNyBAQAogCWlmICghbmRscCkKIAkJZ290byBvdXQ7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KHhyaXRhZywgbmRscC0+YWN0aXZlX3JycXMueHJpX2JpdG1hcCkpIHsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KHhyaXRhZywgbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCkpIHsKIAkJcnJxLT5zZW5kX3JycSA9IDA7CiAJCXJycS0+eHJpdGFnID0gMDsKIAkJcnJxLT5ycnFfc3RvcF90aW1lID0gMDsKQEAgLTY3OCw3ICs2NzgsOCBAQAogCQkJbmV4dF90aW1lID0gcnJxLT5ycnFfc3RvcF90aW1lOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmcGhiYS0+YWN0aXZlX3JycV9saXN0KSkKKwlpZiAoKCFsaXN0X2VtcHR5KCZwaGJhLT5hY3RpdmVfcnJxX2xpc3QpKSAmJgorCSAgICAoIShwaGJhLT5wcG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkpCiAJCW1vZF90aW1lcigmcGhiYS0+cnJxX3RtciwgbmV4dF90aW1lKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnJxLCBuZXh0cnJxLCAmc2VuZF9ycnEsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJnJycS0+bGlzdCk7CkBAIC03OTIsNyArNzkzLDkgQEAKIAkJbGlzdF9kZWwoJnJycS0+bGlzdCk7CiAJCWxwZmNfY2xyX3JycV9hY3RpdmUocGhiYSwgcnJxLT54cml0YWcsIHJycSk7CiAJfQotCWlmICghbGlzdF9lbXB0eSgmcGhiYS0+YWN0aXZlX3JycV9saXN0KSkKKwlpZiAoKCFsaXN0X2VtcHR5KCZwaGJhLT5hY3RpdmVfcnJxX2xpc3QpKSAmJgorCSAgICAoIShwaGJhLT5wcG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSkpCisKIAkJbW9kX3RpbWVyKCZwaGJhLT5ycnFfdG1yLCBuZXh0X3RpbWUpOwogfQogCkBAIC04MTMsNyArODE2LDkgQEAKIHsKIAlpZiAoIW5kbHApCiAJCXJldHVybiAwOwotCWlmICh0ZXN0X2JpdCh4cml0YWcsIG5kbHAtPmFjdGl2ZV9ycnFzLnhyaV9iaXRtYXApKQorCWlmICghbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCkKKwkJcmV0dXJuIDA7CisJaWYgKHRlc3RfYml0KHhyaXRhZywgbmRscC0+YWN0aXZlX3JycXNfeHJpX2JpdG1hcCkpCiAJCQlyZXR1cm4gMTsKIAllbHNlCiAJCXJldHVybiAwOwpAQCAtODYzLDcgKzg2OCwxMCBAQAogCWlmIChuZGxwLT52cG9ydCAmJiAobmRscC0+dnBvcnQtPmxvYWRfZmxhZyAmIEZDX1VOTE9BRElORykpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoeHJpdGFnLCBuZGxwLT5hY3RpdmVfcnJxcy54cmlfYml0bWFwKSkKKwlpZiAoIW5kbHAtPmFjdGl2ZV9ycnFzX3hyaV9iaXRtYXApCisJCWdvdG8gb3V0OworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoeHJpdGFnLCBuZGxwLT5hY3RpdmVfcnJxc194cmlfYml0bWFwKSkKIAkJZ290byBvdXQ7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOwpAQCAtMTMxOCw3ICsxMzI2LDggQEAKIAogCWlmICgodW5saWtlbHkocHJpbmctPnJpbmdubyA9PSBMUEZDX0VMU19SSU5HKSkgJiYKIAkgICAocGlvY2ItPmlvY2IudWxwQ29tbWFuZCAhPSBDTURfQUJPUlRfWFJJX0NOKSAmJgotCSAgIChwaW9jYi0+aW9jYi51bHBDb21tYW5kICE9IENNRF9DTE9TRV9YUklfQ04pKSB7CisJICAgKHBpb2NiLT5pb2NiLnVscENvbW1hbmQgIT0gQ01EX0NMT1NFX1hSSV9DTikgJiYKKwkgKCEocGlvY2ItPnZwb3J0LT5sb2FkX2ZsYWcgJiBGQ19VTkxPQURJTkcpKSkgewogCQlpZiAoIXBpb2NiLT52cG9ydCkKIAkJCUJVRygpOwogCQllbHNlCkBAIC00OTcxLDEyICs0OTgwLDE5IEBACiAJCQkJCSAgICAgTFBGQ19RVUVVRV9SRUFSTSk7CiAJCX0gd2hpbGUgKCsrZmNwX2VxaWR4IDwgcGhiYS0+Y2ZnX2ZjcF9pb19jaGFubmVsKTsKIAl9CisKKwlpZiAocGhiYS0+Y2ZnX0VuYWJsZVhMYW5lKQorCQlscGZjX3NsaTRfY3FfcmVsZWFzZShwaGJhLT5zbGk0X2hiYS5vYXNfY3EsIExQRkNfUVVFVUVfUkVBUk0pOworCiAJaWYgKHBoYmEtPnNsaTRfaGJhLmhiYV9lcSkgewogCQlmb3IgKGZjcF9lcWlkeCA9IDA7IGZjcF9lcWlkeCA8IHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbDsKIAkJICAgICBmY3BfZXFpZHgrKykKIAkJCWxwZmNfc2xpNF9lcV9yZWxlYXNlKHBoYmEtPnNsaTRfaGJhLmhiYV9lcVtmY3BfZXFpZHhdLAogCQkJCQkgICAgIExQRkNfUVVFVUVfUkVBUk0pOwogCX0KKworCWlmIChwaGJhLT5jZmdfZm9mKQorCQlscGZjX3NsaTRfZXFfcmVsZWFzZShwaGJhLT5zbGk0X2hiYS5mb2ZfZXEsIExQRkNfUVVFVUVfUkVBUk0pOwogfQogCiAvKioKQEAgLTgwMzIsNyArODA0OCw4IEBACiAJc3RydWN0IGxwZmNfdmVjdG9yX21hcF9pbmZvICpjcHVwOwogCWludCBjaGFubiwgY3B1OwogCi0JaWYgKHBoYmEtPmNmZ19mY3BfaW9fc2NoZWQgPT0gTFBGQ19GQ1BfU0NIRURfQllfQ1BVKSB7CisJaWYgKHBoYmEtPmNmZ19mY3BfaW9fc2NoZWQgPT0gTFBGQ19GQ1BfU0NIRURfQllfQ1BVCisJICAgICYmIHBoYmEtPmNmZ19mY3BfaW9fY2hhbm5lbCA+IDEpIHsKIAkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCQlpZiAoY3B1IDwgcGhiYS0+c2xpNF9oYmEubnVtX3ByZXNlbnRfY3B1KSB7CiAJCQljcHVwID0gcGhiYS0+c2xpNF9oYmEuY3B1X21hcDsKQEAgLTgyNTAsNiArODI2NywxNCBAQAogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sIDApOwogCQliZl9zZXQod3FlX3B1LCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sIGlvY2JxLT5pb2NiLnVscFBVKTsKIAkJYmZfc2V0KHdxZV9kYmRlLCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sIDEpOworCQlpZiAoaW9jYnEtPmlvY2JfZmxhZyAmIExQRkNfSU9fT0FTKSB7CisJCQliZl9zZXQod3FlX29hcywgJndxZS0+ZmNwX2l3cml0ZS53cWVfY29tLCAxKTsKKwkJCWlmIChwaGJhLT5jZmdfWExhbmVQcmlvcml0eSkgeworCQkJCWJmX3NldCh3cWVfY2NwZSwgJndxZS0+ZmNwX2l3cml0ZS53cWVfY29tLCAxKTsKKwkJCQliZl9zZXQod3FlX2NjcCwgJndxZS0+ZmNwX2l3cml0ZS53cWVfY29tLAorCQkJCSAgICAgICAocGhiYS0+Y2ZnX1hMYW5lUHJpb3JpdHkgPDwgMSkpOworCQkJfQorCQl9CiAJCWJyZWFrOwogCWNhc2UgQ01EX0ZDUF9JUkVBRDY0X0NSOgogCQkvKiB3b3JkMyBpb2NiPWlvdGFnIHdxZT1wYXlsb2FkX29mZnNldF9sZW4gKi8KQEAgLTgyNzEsNiArODI5NiwxNCBAQAogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT5mY3BfaXJlYWQud3FlX2NvbSwgMCk7CiAJCWJmX3NldCh3cWVfcHUsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLCBpb2NicS0+aW9jYi51bHBQVSk7CiAJCWJmX3NldCh3cWVfZGJkZSwgJndxZS0+ZmNwX2lyZWFkLndxZV9jb20sIDEpOworCQlpZiAoaW9jYnEtPmlvY2JfZmxhZyAmIExQRkNfSU9fT0FTKSB7CisJCQliZl9zZXQod3FlX29hcywgJndxZS0+ZmNwX2lyZWFkLndxZV9jb20sIDEpOworCQkJaWYgKHBoYmEtPmNmZ19YTGFuZVByaW9yaXR5KSB7CisJCQkJYmZfc2V0KHdxZV9jY3BlLCAmd3FlLT5mY3BfaXJlYWQud3FlX2NvbSwgMSk7CisJCQkJYmZfc2V0KHdxZV9jY3AsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLAorCQkJCSAgICAgICAocGhiYS0+Y2ZnX1hMYW5lUHJpb3JpdHkgPDwgMSkpOworCQkJfQorCQl9CiAJCWJyZWFrOwogCWNhc2UgQ01EX0ZDUF9JQ01ORDY0X0NSOgogCQkvKiB3b3JkMyBpb2NiPWlvdGFnIHdxZT1wYXlsb2FkX29mZnNldF9sZW4gKi8KQEAgLTgyOTEsNiArODMyNCwxNCBAQAogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT5mY3BfaWNtZC53cWVfY29tLCAwKTsKIAkJYmZfc2V0KHdxZV9lcnAsICZ3cWUtPmZjcF9pY21kLndxZV9jb20sCiAJCSAgICAgICBpb2NicS0+aW9jYi51bHBGQ1AyUmN2eSk7CisJCWlmIChpb2NicS0+aW9jYl9mbGFnICYgTFBGQ19JT19PQVMpIHsKKwkJCWJmX3NldCh3cWVfb2FzLCAmd3FlLT5mY3BfaWNtZC53cWVfY29tLCAxKTsKKwkJCWlmIChwaGJhLT5jZmdfWExhbmVQcmlvcml0eSkgeworCQkJCWJmX3NldCh3cWVfY2NwZSwgJndxZS0+ZmNwX2ljbWQud3FlX2NvbSwgMSk7CisJCQkJYmZfc2V0KHdxZV9jY3AsICZ3cWUtPmZjcF9pY21kLndxZV9jb20sCisJCQkJICAgICAgIChwaGJhLT5jZmdfWExhbmVQcmlvcml0eSA8PCAxKSk7CisJCQl9CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDTURfR0VOX1JFUVVFU1Q2NF9DUjoKIAkJLyogRm9yIHRoaXMgY29tbWFuZCBjYWxjdWxhdGUgdGhlIHhtaXQgbGVuZ3RoIG9mIHRoZQpAQCAtODUyMyw2ICs4NTY0LDcgQEAKIHsKIAlzdHJ1Y3QgbHBmY19zZ2xxICpzZ2xxOwogCXVuaW9uIGxwZmNfd3FlIHdxZTsKKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqd3E7CiAJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nID0gJnBoYmEtPnNsaS5yaW5nW3JpbmdfbnVtYmVyXTsKIAogCWlmIChwaW9jYi0+c2xpNF94cml0YWcgPT0gTk9fWFJJKSB7CkBAIC04NTc1LDExICs4NjE3LDE0IEBACiAJCXJldHVybiBJT0NCX0VSUk9SOwogCiAJaWYgKChwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19JT19GQ1ApIHx8Ci0JCShwaW9jYi0+aW9jYl9mbGFnICYgTFBGQ19VU0VfRkNQV1FJRFgpKSB7Ci0JCWlmICh1bmxpa2VseSghcGhiYS0+c2xpNF9oYmEuZmNwX3dxKSkKLQkJCXJldHVybiBJT0NCX0VSUk9SOwotCQlpZiAobHBmY19zbGk0X3dxX3B1dChwaGJhLT5zbGk0X2hiYS5mY3Bfd3FbcGlvY2ItPmZjcF93cWlkeF0sCi0JCQkJICAgICAmd3FlKSkKKwkgICAgKHBpb2NiLT5pb2NiX2ZsYWcgJiBMUEZDX1VTRV9GQ1BXUUlEWCkpIHsKKwkJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUgfHwgKCEocGlvY2ItPmlvY2JfZmxhZyAmCisJCQlMUEZDX0lPX09BUykpKSB7CisJCQl3cSA9IHBoYmEtPnNsaTRfaGJhLmZjcF93cVtwaW9jYi0+ZmNwX3dxaWR4XTsKKwkJfSBlbHNlIHsKKwkJCXdxID0gcGhiYS0+c2xpNF9oYmEub2FzX3dxOworCQl9CisJCWlmIChscGZjX3NsaTRfd3FfcHV0KHdxLCAmd3FlKSkKIAkJCXJldHVybiBJT0NCX0VSUk9SOwogCX0gZWxzZSB7CiAJCWlmICh1bmxpa2VseSghcGhiYS0+c2xpNF9oYmEuZWxzX3dxKSkKQEAgLTg2NjksMTIgKzg3MTQsMjAgQEAKIAogCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpIHsKIAkJaWYgKHBpb2NiLT5pb2NiX2ZsYWcgJiAgTFBGQ19JT19GQ1ApIHsKLQkJCWlmICh1bmxpa2VseSghcGhiYS0+c2xpNF9oYmEuZmNwX3dxKSkKLQkJCQlyZXR1cm4gSU9DQl9FUlJPUjsKLQkJCWlkeCA9IGxwZmNfc2xpNF9zY21kX3RvX3dxaWR4X2Rpc3RyKHBoYmEpOwotCQkJcGlvY2ItPmZjcF93cWlkeCA9IGlkeDsKLQkJCXJpbmdfbnVtYmVyID0gTUFYX1NMSTNfQ09ORklHVVJFRF9SSU5HUyArIGlkeDsKLQorCQkJaWYgKCFwaGJhLT5jZmdfRW5hYmxlWExhbmUgfHwgKCEocGlvY2ItPmlvY2JfZmxhZyAmCisJCQkJTFBGQ19JT19PQVMpKSkgeworCQkJCWlmICh1bmxpa2VseSghcGhiYS0+c2xpNF9oYmEuZmNwX3dxKSkKKwkJCQkJcmV0dXJuIElPQ0JfRVJST1I7CisJCQkJaWR4ID0gbHBmY19zbGk0X3NjbWRfdG9fd3FpZHhfZGlzdHIocGhiYSk7CisJCQkJcGlvY2ItPmZjcF93cWlkeCA9IGlkeDsKKwkJCQlyaW5nX251bWJlciA9IE1BWF9TTEkzX0NPTkZJR1VSRURfUklOR1MgKyBpZHg7CisJCQl9IGVsc2UgeworCQkJCWlmICh1bmxpa2VseSghcGhiYS0+c2xpNF9oYmEub2FzX3dxKSkKKwkJCQkJcmV0dXJuIElPQ0JfRVJST1I7CisJCQkJaWR4ID0gMDsKKwkJCQlwaW9jYi0+ZmNwX3dxaWR4ID0gMDsKKwkJCQlyaW5nX251bWJlciA9ICBMUEZDX0ZDUF9PQVNfUklORzsKKwkJCX0KIAkJCXByaW5nID0gJnBoYmEtPnNsaS5yaW5nW3JpbmdfbnVtYmVyXTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcmluZy0+cmluZ19sb2NrLCBpZmxhZ3MpOwogCQkJcmMgPSBfX2xwZmNfc2xpX2lzc3VlX2lvY2IocGhiYSwgcmluZ19udW1iZXIsIHBpb2NiLApAQCAtMTIxMzIsNiArMTIxODUsMTc1IEBACiAJbHBmY19zbGk0X2VxX3JlbGVhc2UoZXEsIExQRkNfUVVFVUVfUkVBUk0pOwogfQogCisKKy8qKgorICogbHBmY19zbGk0X2ZvZl9oYW5kbGVfZXFlIC0gUHJvY2VzcyBhIEZsYXNoIE9wdGltaXplZCBGYWJyaWMgZXZlbnQgcXVldWUKKyAqCQkJICAgICBlbnRyeQorICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgorICogQGVxZTogUG9pbnRlciB0byBmYXN0LXBhdGggZXZlbnQgcXVldWUgZW50cnkuCisgKgorICogVGhpcyByb3V0aW5lIHByb2Nlc3MgYSBldmVudCBxdWV1ZSBlbnRyeSBmcm9tIHRoZSBGbGFzaCBPcHRpbWl6ZWQgRmFicmljCisgKiBldmVudCBxdWV1ZS4gIEl0IHdpbGwgY2hlY2sgdGhlIE1ham9yQ29kZSBhbmQgTWlub3JDb2RlIHRvIGRldGVybWluZSB0aGlzCisgKiBpcyBmb3IgYSBjb21wbGV0aW9uIGV2ZW50IG9uIGEgY29tcGxldGlvbiBxdWV1ZSwgaWYgbm90LCBhbiBlcnJvciBzaGFsbCBiZQorICogbG9nZ2VkIGFuZCBqdXN0IHJldHVybi4gT3RoZXJ3aXNlLCBpdCB3aWxsIGdldCB0byB0aGUgY29ycmVzcG9uZGluZworICogY29tcGxldGlvbiBxdWV1ZSBhbmQgcHJvY2VzcyBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGNvbXBsZXRpb24gcXVldWUsIHJlYXJtCisgKiB0aGUgY29tcGxldGlvbiBxdWV1ZSwgYW5kIHRoZW4gcmV0dXJuLgorICoqLworc3RhdGljIHZvaWQKK2xwZmNfc2xpNF9mb2ZfaGFuZGxlX2VxZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX2VxZSAqZXFlKQoreworCXN0cnVjdCBscGZjX3F1ZXVlICpjcTsKKwlzdHJ1Y3QgbHBmY19jcWUgKmNxZTsKKwlib29sIHdvcmtwb3N0ZWQgPSBmYWxzZTsKKwl1aW50MTZfdCBjcWlkOworCWludCBlY291bnQgPSAwOworCisJaWYgKHVubGlrZWx5KGJmX2dldF9sZTMyKGxwZmNfZXFlX21ham9yX2NvZGUsIGVxZSkgIT0gMCkpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCSI5MTQ3IE5vdCBhIHZhbGlkIGNvbXBsZXRpb24gIgorCQkJCSJldmVudDogbWFqb3Jjb2RlPXgleCwgbWlub3Jjb2RlPXgleFxuIiwKKwkJCQliZl9nZXRfbGUzMihscGZjX2VxZV9tYWpvcl9jb2RlLCBlcWUpLAorCQkJCWJmX2dldF9sZTMyKGxwZmNfZXFlX21pbm9yX2NvZGUsIGVxZSkpOworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQ1EgKi8KKwljcWlkID0gYmZfZ2V0X2xlMzIobHBmY19lcWVfcmVzb3VyY2VfaWQsIGVxZSk7CisKKwkvKiBOZXh0IGNoZWNrIGZvciBPQVMgKi8KKwljcSA9IHBoYmEtPnNsaTRfaGJhLm9hc19jcTsKKwlpZiAodW5saWtlbHkoIWNxKSkgeworCQlpZiAocGhiYS0+c2xpLnNsaV9mbGFnICYgTFBGQ19TTElfQUNUSVZFKQorCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAorCQkJCQkiOTE0OCBPQVMgY29tcGxldGlvbiBxdWV1ZSAiCisJCQkJCSJkb2VzIG5vdCBleGlzdFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoY3FpZCAhPSBjcS0+cXVldWVfaWQpKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkiOTE0OSBNaXNzLW1hdGNoZWQgZmFzdC1wYXRoIGNvbXBsICIKKwkJCQkicXVldWUgaWQ6IGVxY3FpZD0lZCwgZmNwY3FpZD0lZFxuIiwKKwkJCQljcWlkLCBjcS0+cXVldWVfaWQpOworCQlyZXR1cm47CisJfQorCisJLyogUHJvY2VzcyBhbGwgdGhlIGVudHJpZXMgdG8gdGhlIE9BUyBDUSAqLworCXdoaWxlICgoY3FlID0gbHBmY19zbGk0X2NxX2dldChjcSkpKSB7CisJCXdvcmtwb3N0ZWQgfD0gbHBmY19zbGk0X2ZwX2hhbmRsZV93Y3FlKHBoYmEsIGNxLCBjcWUpOworCQlpZiAoISgrK2Vjb3VudCAlIGNxLT5lbnRyeV9yZXBvc3QpKQorCQkJbHBmY19zbGk0X2NxX3JlbGVhc2UoY3EsIExQRkNfUVVFVUVfTk9BUk0pOworCX0KKworCS8qIFRyYWNrIHRoZSBtYXggbnVtYmVyIG9mIENRRXMgcHJvY2Vzc2VkIGluIDEgRVEgKi8KKwlpZiAoZWNvdW50ID4gY3EtPkNRX21heF9jcWUpCisJCWNxLT5DUV9tYXhfY3FlID0gZWNvdW50OworCisJLyogQ2F0Y2ggdGhlIG5vIGNxIGVudHJ5IGNvbmRpdGlvbiAqLworCWlmICh1bmxpa2VseShlY291bnQgPT0gMCkpCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkiOTE1MyBObyBlbnRyeSBmcm9tIGZhc3QtcGF0aCBjb21wbGV0aW9uICIKKwkJCQkicXVldWUgZmNwY3FpZD0lZFxuIiwgY3EtPnF1ZXVlX2lkKTsKKworCS8qIEluIGFueSBjYXNlLCBmbGFzaCBhbmQgcmUtYXJtIHRoZSBDUSAqLworCWxwZmNfc2xpNF9jcV9yZWxlYXNlKGNxLCBMUEZDX1FVRVVFX1JFQVJNKTsKKworCS8qIHdha2UgdXAgd29ya2VyIHRocmVhZCBpZiB0aGVyZSBhcmUgd29ya3MgdG8gYmUgZG9uZSAqLworCWlmICh3b3JrcG9zdGVkKQorCQlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOworfQorCisvKioKKyAqIGxwZmNfc2xpNF9mb2ZfaW50cl9oYW5kbGVyIC0gSEJBIGludGVycnVwdCBoYW5kbGVyIHRvIFNMSS00IGRldmljZQorICogQGlycTogSW50ZXJydXB0IG51bWJlci4KKyAqIEBkZXZfaWQ6IFRoZSBkZXZpY2UgY29udGV4dCBwb2ludGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZGlyZWN0bHkgY2FsbGVkIGZyb20gdGhlIFBDSSBsYXllciBhcyBhbiBpbnRlcnJ1cHQKKyAqIHNlcnZpY2Ugcm91dGluZSB3aGVuIGRldmljZSB3aXRoIFNMSS00IGludGVyZmFjZSBzcGVjIGlzIGVuYWJsZWQgd2l0aAorICogTVNJLVggbXVsdGktbWVzc2FnZSBpbnRlcnJ1cHQgbW9kZSBhbmQgdGhlcmUgaXMgYSBGbGFzaCBPcHRpbWl6ZWQgRmFicmljCisgKiBJT0NCIHJpbmcgZXZlbnQgaW4gdGhlIEhCQS4gSG93ZXZlciwgd2hlbiB0aGUgZGV2aWNlIGlzIGVuYWJsZWQgd2l0aCBlaXRoZXIKKyAqIE1TSSBvciBQaW4tSVJRIGludGVycnVwdCBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZQorICogZGV2aWNlLWxldmVsIGludGVycnVwdCBoYW5kbGVyLiBXaGVuIHRoZSBQQ0kgc2xvdCBpcyBpbiBlcnJvciByZWNvdmVyeQorICogb3IgdGhlIEhCQSBpcyB1bmRlcmdvaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBub3QKKyAqIHByb2Nlc3MgdGhlIGludGVycnVwdC4gVGhlIEZsYXNoIE9wdGltaXplZCBGYWJyaWMgcmluZyBldmVudCBhcmUgaGFuZGxlZCBpbgorICogdGhlIGludHJydXB0IGNvbnRleHQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2sgaGVsZC4KKyAqIEl0IGdldHMgdGhlIGhiYWxvY2sgdG8gYWNjZXNzIGFuZCB1cGRhdGUgU0xJIGRhdGEgc3RydWN0dXJlcy4gTm90ZSB0aGF0LAorICogdGhlIEVRIHRvIENRIGFyZSBvbmUtdG8tb25lIG1hcCBzdWNoIHRoYXQgdGhlIEVRIGluZGV4IGlzCisgKiBlcXVhbCB0byB0aGF0IG9mIENRIGluZGV4LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBJUlFfSEFORExFRCB3aGVuIGludGVycnVwdCBpcyBoYW5kbGVkIGVsc2UgaXQKKyAqIHJldHVybnMgSVJRX05PTkUuCisgKiovCitpcnFyZXR1cm5fdAorbHBmY19zbGk0X2ZvZl9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBscGZjX2hiYSAqcGhiYTsKKwlzdHJ1Y3QgbHBmY19mY3BfZXFfaGRsICpmY3BfZXFfaGRsOworCXN0cnVjdCBscGZjX3F1ZXVlICplcTsKKwlzdHJ1Y3QgbHBmY19lcWUgKmVxZTsKKwl1bnNpZ25lZCBsb25nIGlmbGFnOworCWludCBlY291bnQgPSAwOworCXVpbnQzMl90IGVxaWR4OworCisJLyogR2V0IHRoZSBkcml2ZXIncyBwaGJhIHN0cnVjdHVyZSBmcm9tIHRoZSBkZXZfaWQgKi8KKwlmY3BfZXFfaGRsID0gKHN0cnVjdCBscGZjX2ZjcF9lcV9oZGwgKilkZXZfaWQ7CisJcGhiYSA9IGZjcF9lcV9oZGwtPnBoYmE7CisJZXFpZHggPSBmY3BfZXFfaGRsLT5pZHg7CisKKwlpZiAodW5saWtlbHkoIXBoYmEpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBHZXQgdG8gdGhlIEVRIHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB2ZWN0b3IgKi8KKwllcSA9IHBoYmEtPnNsaTRfaGJhLmZvZl9lcTsKKwlpZiAodW5saWtlbHkoIWVxKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogQ2hlY2sgZGV2aWNlIHN0YXRlIGZvciBoYW5kbGluZyBpbnRlcnJ1cHQgKi8KKwlpZiAodW5saWtlbHkobHBmY19pbnRyX3N0YXRlX2NoZWNrKHBoYmEpKSkgeworCQllcS0+RVFfYmFkc3RhdGUrKzsKKwkJLyogQ2hlY2sgYWdhaW4gZm9yIGxpbmtfc3RhdGUgd2l0aCBsb2NrIGhlbGQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKKwkJaWYgKHBoYmEtPmxpbmtfc3RhdGUgPCBMUEZDX0xJTktfRE9XTikKKwkJCS8qIEZsdXNoLCBjbGVhciBpbnRlcnJ1cHQsIGFuZCByZWFybSB0aGUgRVEgKi8KKwkJCWxwZmNfc2xpNF9lcV9mbHVzaChwaGJhLCBlcSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qCisJICogUHJvY2VzcyBhbGwgdGhlIGV2ZW50IG9uIEZDUCBmYXN0LXBhdGggRVEKKwkgKi8KKwl3aGlsZSAoKGVxZSA9IGxwZmNfc2xpNF9lcV9nZXQoZXEpKSkgeworCQlscGZjX3NsaTRfZm9mX2hhbmRsZV9lcWUocGhiYSwgZXFlKTsKKwkJaWYgKCEoKytlY291bnQgJSBlcS0+ZW50cnlfcmVwb3N0KSkKKwkJCWxwZmNfc2xpNF9lcV9yZWxlYXNlKGVxLCBMUEZDX1FVRVVFX05PQVJNKTsKKwkJZXEtPkVRX3Byb2Nlc3NlZCsrOworCX0KKworCS8qIFRyYWNrIHRoZSBtYXggbnVtYmVyIG9mIEVRRXMgcHJvY2Vzc2VkIGluIDEgaW50ciAqLworCWlmIChlY291bnQgPiBlcS0+RVFfbWF4X2VxZSkKKwkJZXEtPkVRX21heF9lcWUgPSBlY291bnQ7CisKKworCWlmICh1bmxpa2VseShlY291bnQgPT0gMCkpIHsKKwkJZXEtPkVRX25vX2VudHJ5Kys7CisKKwkJaWYgKHBoYmEtPmludHJfdHlwZSA9PSBNU0lYKQorCQkJLyogTVNJLVggdHJlYXRlZCBpbnRlcnJ1cHQgc2VydmVkIGFzIG5vIEVRIHNoYXJlIElOVCAqLworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX1NMSSwKKwkJCQkJIjkxNDUgTVNJLVggaW50ZXJydXB0IHdpdGggbm8gRVFFXG4iKTsKKwkJZWxzZSB7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCisJCQkJCSI5MTQ2IElTUiBpbnRlcnJ1cHQgd2l0aCBubyBFUUVcbiIpOworCQkJLyogTm9uIE1TSS1YIHRyZWF0ZWQgb24gaW50ZXJydXB0IGFzIEVRIHNoYXJlIElOVCAqLworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJfQorCS8qIEFsd2F5cyBjbGVhciBhbmQgcmUtYXJtIHRoZSBmYXN0LXBhdGggRVEgKi8KKwlscGZjX3NsaTRfZXFfcmVsZWFzZShlcSwgTFBGQ19RVUVVRV9SRUFSTSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiAvKioKICAqIGxwZmNfc2xpNF9oYmFfaW50cl9oYW5kbGVyIC0gSEJBIGludGVycnVwdCBoYW5kbGVyIHRvIFNMSS00IGRldmljZQogICogQGlycTogSW50ZXJydXB0IG51bWJlci4KQEAgLTEyMjg3LDYgKzEyNTA5LDEzIEBACiAJCQloYmFfaGFuZGxlZCB8PSB0cnVlOwogCX0KIAorCWlmIChwaGJhLT5jZmdfZm9mKSB7CisJCWhiYV9pcnFfcmMgPSBscGZjX3NsaTRfZm9mX2ludHJfaGFuZGxlcihpcnEsCisJCQkJCSZwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsWzBdKTsKKwkJaWYgKGhiYV9pcnFfcmMgPT0gSVJRX0hBTkRMRUQpCisJCQloYmFfaGFuZGxlZCB8PSB0cnVlOworCX0KKwogCXJldHVybiAoaGJhX2hhbmRsZWQgPT0gdHJ1ZSkgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwogfSAvKiBscGZjX3NsaTRfaW50cl9oYW5kbGVyICovCiAKQEAgLTE2NTQ0LDcgKzE2NzczLDcgQEAKIHsKIAlMSVNUX0hFQUQoY29tcGxldGlvbnMpOwogCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZyA9ICZwaGJhLT5zbGkucmluZ1tMUEZDX0VMU19SSU5HXTsKLQlzdHJ1Y3QgbHBmY19pb2NicSAqcGlvY2JxID0gMDsKKwlzdHJ1Y3QgbHBmY19pb2NicSAqcGlvY2JxID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGlmbGFncyA9IDA7CiAJY2hhciAqZmFpbF9tc2cgPSBOVUxMOwogCXN0cnVjdCBscGZjX3NnbHEgKnNnbHE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaAppbmRleCA2YjBmMjQ3Li42ZjA0MDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKQEAgLTc4LDYgKzc4LDggQEAKICNkZWZpbmUgTFBGQ19GSVBfRUxTX0lEX01BU0sJMHhjMDAwCS8qIEVMU19JRCByYW5nZSAwLTMsIG5vbi1zaGlmdGVkIG1hc2sgKi8KICNkZWZpbmUgTFBGQ19GSVBfRUxTX0lEX1NISUZUCTE0CiAKKyNkZWZpbmUgTFBGQ19JT19PQVMJCTB4MTAwMDAgLyogT0FTIEZDUCBJTyAqLworCiAJdWludDMyX3QgZHJ2clRpbWVvdXQ7CS8qIGRyaXZlciB0aW1lb3V0IGluIHNlY29uZHMgKi8KIAl1aW50MzJfdCBmY3Bfd3FpZHg7CS8qIGluZGV4IHRvIEZDUCB3b3JrIHF1ZXVlICovCiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0Oy8qIHZpcnR1YWwgcG9ydCBwb2ludGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oCmluZGV4IDI5OGM4Y2QuLjliOGNkYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oCkBAIC0zOSw2ICszOSwxMCBAQAogI2RlZmluZSBMUEZDX0ZDUF9JT19DSEFOX01JTiAgICAgICAxCiAjZGVmaW5lIExQRkNfRkNQX0lPX0NIQU5fTUFYICAgICAgIDE2CiAKKy8qIE51bWJlciBvZiBjaGFubmVscyB1c2VkIGZvciBGbGFzaCBPcHRpbWl6ZWQgRmFicmljIChGT0YpIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBMUEZDX0ZPRl9JT19DSEFOX05VTSAgICAgICAxCisKIC8qCiAgKiBQcm92aWRlIHRoZSBkZWZhdWx0IEZDRiBSZWNvcmQgYXR0cmlidXRlcyB1c2VkIGJ5IHRoZSBkcml2ZXIKICAqIHdoZW4gbm9uRklQIG1vZGUgaXMgY29uZmlndXJlZCBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgZGVmYXVsdApAQCAtMzk5LDYgKzQwMyw3IEBACiAJdWludDMyX3QgaWZfcGFnZV9zejsKIAl1aW50MzJfdCBycV9kYl93aW5kb3c7CiAJdWludDMyX3QgbG9vcGJrX3Njb3BlOworCXVpbnQzMl90IG9hc19zdXBwb3J0ZWQ7CiAJdWludDMyX3QgZXFfcGFnZXNfbWF4OwogCXVpbnQzMl90IGVxZV9zaXplOwogCXVpbnQzMl90IGNxX3BhZ2VzX21heDsKQEAgLTQzOSw2ICs0NDQsOCBAQAogCXVpbnQ4X3QgbG5rX25vOwogfTsKIAorI2RlZmluZSBMUEZDX1NMSTRfSEFORExFUl9DTlQJCShMUEZDX0ZDUF9JT19DSEFOX01BWCsgXAorCQkJCQkgTFBGQ19GT0ZfSU9fQ0hBTl9OVU0pCiAjZGVmaW5lIExQRkNfU0xJNF9IQU5ETEVSX05BTUVfU1oJMTYKIAogLyogVXNlZCBmb3IgSVJRIHZlY3RvciB0byBDUFUgbWFwcGluZyAqLwpAQCAtNTA3LDcgKzUxNCw3IEBACiAJc3RydWN0IGxwZmNfcmVnaXN0ZXIgc2xpX2ludGY7CiAJc3RydWN0IGxwZmNfcGNfc2xpNF9wYXJhbXMgcGNfc2xpNF9wYXJhbXM7CiAJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKLQl1aW50OF90IGhhbmRsZXJfbmFtZVtMUEZDX0ZDUF9JT19DSEFOX01BWF1bTFBGQ19TTEk0X0hBTkRMRVJfTkFNRV9TWl07CisJdWludDhfdCBoYW5kbGVyX25hbWVbTFBGQ19TTEk0X0hBTkRMRVJfQ05UXVtMUEZDX1NMSTRfSEFORExFUl9OQU1FX1NaXTsKIAlzdHJ1Y3QgbHBmY19mY3BfZXFfaGRsICpmY3BfZXFfaGRsOyAvKiBGQ1AgcGVyLVdRIGhhbmRsZSAqLwogCiAJLyogUG9pbnRlcnMgdG8gdGhlIGNvbnN0cnVjdGVkIFNMSTQgcXVldWVzICovCkBAIC01MjcsNiArNTM0LDE3IEBACiAJdWludDMyX3QgdWxwMF9tb2RlOwkvKiBVTFAwIHByb3RvY29sIG1vZGUgKi8KIAl1aW50MzJfdCB1bHAxX21vZGU7CS8qIFVMUDEgcHJvdG9jb2wgbW9kZSAqLwogCisJc3RydWN0IGxwZmNfcXVldWUgKmZvZl9lcTsgLyogRmxhc2ggT3B0aW1pemVkIEZhYnJpYyBFdmVudCBxdWV1ZSAqLworCisJLyogT3B0aW1pemVkIEFjY2VzcyBTdG9yYWdlIHNwZWNpZmljIHF1ZXVlcy9zdHJ1Y3R1cmVzICovCisKKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqb2FzX2NxOyAvKiBPQVMgY29tcGxldGlvbiBxdWV1ZSAqLworCXN0cnVjdCBscGZjX3F1ZXVlICpvYXNfd3E7IC8qIE9BUyBXb3JrIHF1ZXVlICovCisJc3RydWN0IGxwZmNfc2xpX3JpbmcgKm9hc19yaW5nOworCXVpbnQ2NF90IG9hc19uZXh0X2x1bjsKKwl1aW50OF90IG9hc19uZXh0X3RndF93d3BuWzhdOworCXVpbnQ4X3Qgb2FzX25leHRfdnB0X3d3cG5bOF07CisKIAkvKiBTZXR1cCBpbmZvcm1hdGlvbiBmb3IgdmFyaW91cyBxdWV1ZSBwYXJhbWV0ZXJzICovCiAJaW50IGVxX2VzaXplOwogCWludCBlcV9lY291bnQ7CkBAIC01ODksNiArNjA3LDcgQEAKIAlzdHJ1Y3QgbHBmY192ZWN0b3JfbWFwX2luZm8gKmNwdV9tYXA7CiAJdWludDE2X3QgbnVtX29ubGluZV9jcHU7CiAJdWludDE2X3QgbnVtX3ByZXNlbnRfY3B1OworCXVpbnQxNl90IGN1cnJfZGlzcF9jcHU7CiB9OwogCiBlbnVtIGxwZmNfc2dlX3R5cGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaAppbmRleCBlMzA5NGM0Li5lMzJjYmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaApAQCAtMTgsNyArMTgsNyBAQAogICogaW5jbHVkZWQgd2l0aCB0aGlzIHBhY2thZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMy40MyIKKyNkZWZpbmUgTFBGQ19EUklWRVJfVkVSU0lPTiAiOC4zLjQ1IgogI2RlZmluZSBMUEZDX0RSSVZFUl9OQU1FCQkibHBmYyIKIAogLyogVXNlZCBmb3IgU0xJIDIvMyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwppbmRleCA4MTZkYjEyLi5iNzc3MDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwpAQCAtNTMxLDEzICs1MzEsNiBAQAogCWludAl0YXJnZXQgPSAwOwogCWludAlsZHJ2X251bSA9IDA7ICAgLyogbG9naWNhbCBkcml2ZSBudW1iZXIgKi8KIAotCi0JLyoKLQkgKiBmaWx0ZXIgdGhlIGludGVybmFsIGFuZCBpb2N0bCBjb21tYW5kcwotCSAqLwotCWlmKChjbWQtPmNtbmRbMF0gPT0gTUVHQV9JTlRFUk5BTF9DTUQpKQotCQlyZXR1cm4gKHNjYl90ICopY21kLT5ob3N0X3NjcmliYmxlOwotCiAJLyoKIAkgKiBXZSBrbm93IHdoYXQgY2hhbm5lbHMgb3VyIGxvZ2ljYWwgZHJpdmVzIGFyZSBvbiAtIG1lZ2FfZmluZF9jYXJkKCkKIAkgKi8KQEAgLTE0MzksMTkgKzE0MzIsMjIgQEAKIAogCQljbWRpZCA9IGNvbXBsZXRlZFtpXTsKIAotCQlpZiggY21kaWQgPT0gQ01ESURfSU5UX0NNRFMgKSB7IC8qIGludGVybmFsIGNvbW1hbmQgKi8KKwkJLyoKKwkJICogT25seSBmcmVlIFNDQnMgZm9yIHRoZSBjb21tYW5kcyBjb21pbmcgZG93biBmcm9tIHRoZQorCQkgKiBtaWQtbGF5ZXIsIG5vdCBmb3Igd2hpY2ggd2VyZSBpc3N1ZWQgaW50ZXJuYWxseQorCQkgKgorCQkgKiBGb3IgaW50ZXJuYWwgY29tbWFuZCwgcmVzdG9yZSB0aGUgc3RhdHVzIHJldHVybmVkIGJ5IHRoZQorCQkgKiBmaXJtd2FyZSBzbyB0aGF0IHVzZXIgY2FuIGludGVycHJldCBpdC4KKwkJICovCisJCWlmIChjbWRpZCA9PSBDTURJRF9JTlRfQ01EUykgewogCQkJc2NiID0gJmFkYXB0ZXItPmludF9zY2I7Ci0JCQljbWQgPSBzY2ItPmNtZDsKLQkJCW1ib3ggPSAobWJveF90ICopc2NiLT5yYXdfbWJveDsKIAotCQkJLyoKLQkJCSAqIEludGVybmFsIGNvbW1hbmQgaW50ZXJmYWNlIGRvIG5vdCBmaXJlIHRoZSBleHRlbmRlZAotCQkJICogcGFzc3RocnUgb3IgNjQtYml0IHBhc3N0aHJ1Ci0JCQkgKi8KLQkJCXB0aHJ1ID0gc2NiLT5wdGhydTsKKwkJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisJCQlzY2ItPnN0YXRlID0gU0NCX0ZSRUU7CiAKLQkJfQotCQllbHNlIHsKKwkJCWFkYXB0ZXItPmludF9zdGF0dXMgPSBzdGF0dXM7CisJCQljb21wbGV0ZSgmYWRhcHRlci0+aW50X3dhaXRxKTsKKwkJfSBlbHNlIHsKIAkJCXNjYiA9ICZhZGFwdGVyLT5zY2JfbGlzdFtjbWRpZF07CiAKIAkJCS8qCkBAIC0xNjQwLDI1ICsxNjM2LDcgQEAKIAkJCQljbWQtPnJlc3VsdCB8PSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpfHN0YXR1czsKIAkJfQogCi0JCS8qCi0JCSAqIE9ubHkgZnJlZSBTQ0JzIGZvciB0aGUgY29tbWFuZHMgY29taW5nIGRvd24gZnJvbSB0aGUKLQkJICogbWlkLWxheWVyLCBub3QgZm9yIHdoaWNoIHdlcmUgaXNzdWVkIGludGVybmFsbHkKLQkJICoKLQkJICogRm9yIGludGVybmFsIGNvbW1hbmQsIHJlc3RvcmUgdGhlIHN0YXR1cyByZXR1cm5lZCBieSB0aGUKLQkJICogZmlybXdhcmUgc28gdGhhdCB1c2VyIGNhbiBpbnRlcnByZXQgaXQuCi0JCSAqLwotCQlpZiggY21kaWQgPT0gQ01ESURfSU5UX0NNRFMgKSB7IC8qIGludGVybmFsIGNvbW1hbmQgKi8KLQkJCWNtZC0+cmVzdWx0ID0gc3RhdHVzOwotCi0JCQkvKgotCQkJICogUmVtb3ZlIHRoZSBpbnRlcm5hbCBjb21tYW5kIGZyb20gdGhlIHBlbmRpbmcgbGlzdAotCQkJICovCi0JCQlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOwotCQkJc2NiLT5zdGF0ZSA9IFNDQl9GUkVFOwotCQl9Ci0JCWVsc2UgewotCQkJbWVnYV9mcmVlX3NjYihhZGFwdGVyLCBzY2IpOwotCQl9CisJCW1lZ2FfZnJlZV9zY2IoYWRhcHRlciwgc2NiKTsKIAogCQkvKiBBZGQgU2NzaV9Db21tYW5kIHRvIGVuZCBvZiBjb21wbGV0ZWQgcXVldWUgKi8KIAkJbGlzdF9hZGRfdGFpbChTQ1NJX0xJU1QoY21kKSwgJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKQEAgLTQxMzMsMjMgKzQxMTEsMTUgQEAKICAqIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBwYXNzdGhydSBzdHJ1Y3R1cmUgaWYgdGhlIGNvbW1hbmQKICAqIHRvIGJlIGZpcmVkIGlzIGEgcGFzc3RocnUgY29tbWFuZAogICoKLSAqIGxvY2tzY29wZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGFjcXVpcmVkIHRoZSBsb2NrLiBPZgotICogY291cnNlLCB0aGUgY2FsbGVyIG11c3Qga25vdyB3aGljaCBsb2NrIHdlIGFyZSB0YWxraW5nIGFib3V0LgotICoKICAqIE5vdGU6IHBhcmFtZXRlciAncHRocnUnIGlzIG51bGwgZm9yIG5vbi1wYXNzdGhydSBjb21tYW5kcy4KICAqLwogc3RhdGljIGludAogbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXJfdCAqYWRhcHRlciwgbWVnYWNtZF90ICptYywgbWVnYV9wYXNzdGhydSAqcHRocnUpCiB7Ci0JU2NzaV9DbW5kCSpzY21kOwotCXN0cnVjdAlzY3NpX2RldmljZSAqc2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNjYl90CSpzY2I7CiAJaW50CXJ2YWw7CiAKLQlzY21kID0gc2NzaV9hbGxvY2F0ZV9jb21tYW5kKEdGUF9LRVJORUwpOwotCWlmICghc2NtZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAkvKgogCSAqIFRoZSBpbnRlcm5hbCBjb21tYW5kcyBzaGFyZSBvbmUgY29tbWFuZCBpZCBhbmQgaGVuY2UgYXJlCiAJICogc2VyaWFsaXplZC4gVGhpcyBpcyBzbyBiZWNhdXNlIHdlIHdhbnQgdG8gcmVzZXJ2ZSBtYXhpbXVtIG51bWJlciBvZgpAQCAtNDE2MCw3MyArNDEzMCw0NSBAQAogCXNjYiA9ICZhZGFwdGVyLT5pbnRfc2NiOwogCW1lbXNldChzY2IsIDAsIHNpemVvZihzY2JfdCkpOwogCi0Jc2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzY3NpX2RldmljZSksIEdGUF9LRVJORUwpOwotCXNjbWQtPmRldmljZSA9IHNkZXY7Ci0KLQltZW1zZXQoYWRhcHRlci0+aW50X2NkYiwgMCwgc2l6ZW9mKGFkYXB0ZXItPmludF9jZGIpKTsKLQlzY21kLT5jbW5kID0gYWRhcHRlci0+aW50X2NkYjsKLQlzY21kLT5kZXZpY2UtPmhvc3QgPSBhZGFwdGVyLT5ob3N0OwotCXNjbWQtPmhvc3Rfc2NyaWJibGUgPSAodm9pZCAqKXNjYjsKLQlzY21kLT5jbW5kWzBdID0gTUVHQV9JTlRFUk5BTF9DTUQ7Ci0KLQlzY2ItPnN0YXRlIHw9IFNDQl9BQ1RJVkU7Ci0Jc2NiLT5jbWQgPSBzY21kOworCXNjYi0+aWR4ID0gQ01ESURfSU5UX0NNRFM7CisJc2NiLT5zdGF0ZSB8PSBTQ0JfQUNUSVZFIHwgU0NCX1BFTkRROwogCiAJbWVtY3B5KHNjYi0+cmF3X21ib3gsIG1jLCBzaXplb2YobWVnYWNtZF90KSk7CiAKIAkvKgogCSAqIElzIGl0IGEgcGFzc3RocnUgY29tbWFuZAogCSAqLwotCWlmKCBtYy0+Y21kID09IE1FR0FfTUJPWENNRF9QQVNTVEhSVSApIHsKLQorCWlmIChtYy0+Y21kID09IE1FR0FfTUJPWENNRF9QQVNTVEhSVSkKIAkJc2NiLT5wdGhydSA9IHB0aHJ1OwotCX0KIAotCXNjYi0+aWR4ID0gQ01ESURfSU5UX0NNRFM7Ci0KLQltZWdhcmFpZF9xdWV1ZV9sY2soc2NtZCwgbWVnYV9pbnRlcm5hbF9kb25lKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCk7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgSEJBIGlzIGluIHF1aWVzY2VudCBzdGF0ZSwgZS5nLiwgZHVyaW5nIGEKKwkgKiBkZWxldGUgbG9naWNhbCBkcml2ZSBvcGVydGlvbi4gSWYgaXQgaXMsIGRvbid0IHJ1bgorCSAqIHRoZSBwZW5kaW5nX2xpc3QuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZhZGFwdGVyLT5xdWllc2NlbnQpID09IDApCisJCW1lZ2FfcnVucGVuZHEoYWRhcHRlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogCiAJd2FpdF9mb3JfY29tcGxldGlvbigmYWRhcHRlci0+aW50X3dhaXRxKTsKIAotCXJ2YWwgPSBzY21kLT5yZXN1bHQ7Ci0JbWMtPnN0YXR1cyA9IHNjbWQtPnJlc3VsdDsKLQlrZnJlZShzZGV2KTsKKwltYy0+c3RhdHVzID0gcnZhbCA9IGFkYXB0ZXItPmludF9zdGF0dXM7CiAKIAkvKgogCSAqIFByaW50IGEgZGVidWcgbWVzc2FnZSBmb3IgYWxsIGZhaWxlZCBjb21tYW5kcy4gQXBwbGljYXRpb25zIGNhbiB1c2UKIAkgKiB0aGlzIGluZm9ybWF0aW9uLgogCSAqLwotCWlmKCBzY21kLT5yZXN1bHQgJiYgdHJhY2VfbGV2ZWwgKSB7CisJaWYgKHJ2YWwgJiYgdHJhY2VfbGV2ZWwpIHsKIAkJcHJpbnRrKCJtZWdhcmFpZDogY21kIFsleCwgJXgsICV4XSBzdGF0dXM6WyV4XVxuIiwKLQkJCW1jLT5jbWQsIG1jLT5vcGNvZGUsIG1jLT5zdWJvcGNvZGUsIHNjbWQtPnJlc3VsdCk7CisJCQltYy0+Y21kLCBtYy0+b3Bjb2RlLCBtYy0+c3Vib3Bjb2RlLCBydmFsKTsKIAl9CiAKIAltdXRleF91bmxvY2soJmFkYXB0ZXItPmludF9tdHgpOwotCi0Jc2NzaV9mcmVlX2NvbW1hbmQoR0ZQX0tFUk5FTCwgc2NtZCk7Ci0KIAlyZXR1cm4gcnZhbDsKIH0KIAotCi0vKioKLSAqIG1lZ2FfaW50ZXJuYWxfZG9uZSgpCi0gKiBAc2NtZCAtIGludGVybmFsIHNjc2kgY29tbWFuZAotICoKLSAqIENhbGxiYWNrIHJvdXRpbmUgZm9yIGludGVybmFsIGNvbW1hbmRzLgotICovCi1zdGF0aWMgdm9pZAotbWVnYV9pbnRlcm5hbF9kb25lKFNjc2lfQ21uZCAqc2NtZCkKLXsKLQlhZGFwdGVyX3QJKmFkYXB0ZXI7Ci0KLQlhZGFwdGVyID0gKGFkYXB0ZXJfdCAqKXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0KLQljb21wbGV0ZSgmYWRhcHRlci0+aW50X3dhaXRxKTsKLQotfQotCi0KIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIG1lZ2FyYWlkX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJCQk9ICJNZWdhUkFJRCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCmluZGV4IDRkMGNlNGUuLjUwOGQ2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCkBAIC04NTMsMTAgKzg1MywxMCBAQAogCiAJdTgJc2dsZW47CS8qIGYvdyBzdXBwb3J0ZWQgc2NhdHRlci1nYXRoZXIgbGlzdCBsZW5ndGggKi8KIAotCXVuc2lnbmVkIGNoYXIgaW50X2NkYltNQVhfQ09NTUFORF9TSVpFXTsKIAlzY2JfdAkJCWludF9zY2I7CiAJc3RydWN0IG11dGV4CQlpbnRfbXR4OwkvKiBUbyBzeW5jaHJvbml6ZSB0aGUgaW50ZXJuYWwKIAkJCQkJCWNvbW1hbmRzICovCisJaW50CQkJaW50X3N0YXR1czsJLyogc3RhdHVzIG9mIGludGVybmFsIGNtZCAqLwogCXN0cnVjdCBjb21wbGV0aW9uCWludF93YWl0cTsJLyogd2FpdCBxdWV1ZSBmb3IgaW50ZXJuYWwKIAkJCQkJCSBjbWRzICovCiAKQEAgLTEwMDQsNyArMTAwNCw2IEBACiBzdGF0aWMgaW50IG1lZ2FfZG9fZGVsX2xvZ2RydihhZGFwdGVyX3QgKiwgaW50KTsKIHN0YXRpYyB2b2lkIG1lZ2FfZ2V0X21heF9zZ2woYWRhcHRlcl90ICopOwogc3RhdGljIGludCBtZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlcl90ICosIG1lZ2FjbWRfdCAqLCBtZWdhX3Bhc3N0aHJ1ICopOwotc3RhdGljIHZvaWQgbWVnYV9pbnRlcm5hbF9kb25lKFNjc2lfQ21uZCAqKTsKIHN0YXRpYyBpbnQgbWVnYV9zdXBwb3J0X2NsdXN0ZXIoYWRhcHRlcl90ICopOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmMKaW5kZXggZGZmZmQwZi4uYTcwNjkyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmMKQEAgLTQ4Niw2ICs0ODYsOCBAQAogCiAJcHRocnUzMi0+ZGF0YXhmZXJhZGRyCT0ga2lvYy0+YnVmX3BhZGRyOwogCWlmIChraW9jLT5kYXRhX2RpciAmIFVJT0NfV1IpIHsKKwkJaWYgKHB0aHJ1MzItPmRhdGF4ZmVybGVuID4ga2lvYy0+eGZlcmxlbikKKwkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoY29weV9mcm9tX3VzZXIoa2lvYy0+YnVmX3ZhZGRyLCBraW9jLT51c2VyX2RhdGEsCiAJCQkJCQlwdGhydTMyLT5kYXRheGZlcmxlbikpIHsKIAkJCXJldHVybiAoLUVGQVVMVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKaW5kZXggMzQ0NTJlYS4uMzIxNjZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaApAQCAtMzMsOSArMzMsOSBAQAogLyoKICAqIE1lZ2FSQUlEIFNBUyBEcml2ZXIgbWV0YSBkYXRhCiAgKi8KLSNkZWZpbmUgTUVHQVNBU19WRVJTSU9OCQkJCSIwNi43MDAuMDYuMDAtcmMxIgotI2RlZmluZSBNRUdBU0FTX1JFTERBVEUJCQkJIkF1Zy4gMzEsIDIwMTMiCi0jZGVmaW5lIE1FR0FTQVNfRVhUX1ZFUlNJT04JCQkiU2F0LiBBdWcuIDMxIDE3OjAwOjAwIFBEVCAyMDEzIgorI2RlZmluZSBNRUdBU0FTX1ZFUlNJT04JCQkJIjA2LjgwMy4wMS4wMC1yYzEiCisjZGVmaW5lIE1FR0FTQVNfUkVMREFURQkJCQkiTWFyLiAxMCwgMjAxNCIKKyNkZWZpbmUgTUVHQVNBU19FWFRfVkVSU0lPTgkJCSJNb24uIE1hci4gMTAgMTc6MDA6MDAgUERUIDIwMTQiCiAKIC8qCiAgKiBEZXZpY2UgSURzCkBAIC00OCw2ICs0OCw3IEBACiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzNTS0lOTlkJCTB4MDA3MwogI2RlZmluZQlQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDcxU0tJTk5ZCQkweDAwNzEKICNkZWZpbmUJUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OCQkweDAwNWIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfUExBU01BCQkweDAwMmYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUgkJMHgwMDVkCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkJCQkweDAwNWYKIApAQCAtNTU5LDcgKzU2MCw4IEBACiAJCXU4IFBDSUU6MTsKIAkJdTggaVNDU0k6MTsKIAkJdTggU0FTXzNHOjE7Ci0JCXU4IHJlc2VydmVkXzA6NDsKKwkJdTggU1JJT1Y6MTsKKwkJdTggcmVzZXJ2ZWRfMDozOwogCQl1OCByZXNlcnZlZF8xWzZdOwogCQl1OCBwb3J0X2NvdW50OwogCQl1NjQgcG9ydF9hZGRyWzhdOwpAQCAtODM5LDcgKzg0MSwxMiBAQAogCiAJc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qN0E0aCAqLwogI2lmICAgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCi0JCXUzMiAgICAgcmVzZXJ2ZWQ6MTE7CisJCXUzMiAgICAgcmVzZXJ2ZWQ6NTsKKwkJdTMyCWFjdGl2ZVBhc3NpdmU6MjsKKwkJdTMyCXN1cHBvcnRDb25maWdBdXRvQmFsYW5jZToxOworCQl1MzIJbXBpbzoxOworCQl1MzIJc3VwcG9ydERhdGFMRG9uU1NDQXJyYXk6MTsKKwkJdTMyCXN1cHBvcnRQb2ludEluVGltZVByb2dyZXNzOjE7CiAJCXUzMiAgICAgc3VwcG9ydFVuZXZlblNwYW5zOjE7CiAJCXUzMiAgICAgZGVkaWNhdGVkSG90U3BhcmVzTGltaXRlZDoxOwogCQl1MzIgICAgIGhlYWRsZXNzTW9kZToxOwpAQCAtODg2LDcgKzg5MywxMiBAQAogCiAKIAkJdTMyICAgICBzdXBwb3J0VW5ldmVuU3BhbnM6MTsKLQkJdTMyICAgICByZXNlcnZlZDoxMTsKKwkJdTMyCXN1cHBvcnRQb2ludEluVGltZVByb2dyZXNzOjE7CisJCXUzMglzdXBwb3J0RGF0YUxEb25TU0NBcnJheToxOworCQl1MzIJbXBpbzoxOworCQl1MzIJc3VwcG9ydENvbmZpZ0F1dG9CYWxhbmNlOjE7CisJCXUzMglhY3RpdmVQYXNzaXZlOjI7CisJCXUzMiAgICAgcmVzZXJ2ZWQ6NTsKICNlbmRpZgogCX0gYWRhcHRlck9wZXJhdGlvbnMyOwogCkBAIC05MTQsOCArOTI2LDE0IEBACiAJfSBjbHVzdGVyOwogCiAJY2hhciBjbHVzdGVySWRbMTZdOyAgICAgICAgICAgICAgICAgICAgIC8qN0Q0aCAqLworCXN0cnVjdCB7CisJCXU4ICBtYXhWRnNTdXBwb3J0ZWQ7ICAgICAgICAgICAgLyoweDdFNCovCisJCXU4ICBudW1WRnNFbmFibGVkOyAgICAgICAgICAgICAgLyoweDdFNSovCisJCXU4ICByZXF1ZXN0b3JJZDsgICAgICAgICAgICAgICAgLyoweDdFNiAwOlBGLCAxOlZGMSwgMjpWRjIqLworCQl1OCAgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qMHg3RTcqLworCX0gaW92OwogCi0JdTggICAgICAgICAgcGFkWzB4ODAwLTB4N0U0XTsgICAgICAgICAgIC8qN0U0ICovCisJdTggICAgICAgICAgcGFkWzB4ODAwLTB4N0U4XTsgICAgICAgICAgIC8qMHg3RTggcGFkIHRvIDJrICovCiB9IF9fcGFja2VkOwogCiAvKgpAQCAtOTg2LDcgKzEwMDQsOSBAQAogCiAjZGVmaW5lIE1GSV9PQl9JTlRSX1NUQVRVU19NQVNLCQkJMHgwMDAwMDAwMgogI2RlZmluZSBNRklfUE9MTF9USU1FT1VUX1NFQ1MJCQk2MAotCisjZGVmaW5lIE1FR0FTQVNfU1JJT1ZfSEVBUlRCRUFUX0lOVEVSVkFMX1ZGCSg1ICogSFopCisjZGVmaW5lIE1FR0FTQVNfT0NSX1NFVFRMRV9USU1FX1ZGCQkoMTAwMCAqIDMwKQorI2RlZmluZSBNRUdBU0FTX1JPVVRJTkVfV0FJVF9USU1FX1ZGCQkzMDAKICNkZWZpbmUgTUZJX1JFUExZXzEwNzhfTUVTU0FHRV9JTlRFUlJVUFQJMHg4MDAwMDAwMAogI2RlZmluZSBNRklfUkVQTFlfR0VOMl9NRVNTQUdFX0lOVEVSUlVQVAkweDAwMDAwMDAxCiAjZGVmaW5lIE1GSV9HRU4yX0VOQUJMRV9JTlRFUlJVUFRfTUFTSwkJKDB4MDAwMDAwMDEgfCAweDAwMDAwMDA0KQpAQCAtMTM0Nyw5ICsxMzY3LDE1IEBACiB1bmlvbiBtZWdhc2FzX2V2dF9jbGFzc19sb2NhbGUgewogCiAJc3RydWN0IHsKKyNpZm5kZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECiAJCXUxNiBsb2NhbGU7CiAJCXU4IHJlc2VydmVkOwogCQlzOCBjbGFzczsKKyNlbHNlCisJCXM4IGNsYXNzOworCQl1OCByZXNlcnZlZDsKKwkJdTE2IGxvY2FsZTsKKyNlbmRpZgogCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lbWJlcnM7CiAKIAl1MzIgd29yZDsKQEAgLTE1MjMsNiArMTU0OSwxMiBAQAogCWRtYV9hZGRyX3QgcHJvZHVjZXJfaDsKIAl1MzIgKmNvbnN1bWVyOwogCWRtYV9hZGRyX3QgY29uc3VtZXJfaDsKKwlzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04gKnZmX2FmZmlsaWF0aW9uOworCWRtYV9hZGRyX3QgdmZfYWZmaWxpYXRpb25faDsKKwlzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExICp2Zl9hZmZpbGlhdGlvbl8xMTE7CisJZG1hX2FkZHJfdCB2Zl9hZmZpbGlhdGlvbl8xMTFfaDsKKwlzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSAqaGJfaG9zdF9tZW07CisJZG1hX2FkZHJfdCBoYl9ob3N0X21lbV9oOwogCiAJdTMyICpyZXBseV9xdWV1ZTsKIAlkbWFfYWRkcl90IHJlcGx5X3F1ZXVlX2g7CkBAIC0xNTk4LDEwICsxNjMwLDczIEBACiAJdW5zaWduZWQgbG9uZyBiYXI7CiAJbG9uZyByZXNldF9mbGFnczsKIAlzdHJ1Y3QgbXV0ZXggcmVzZXRfbXV0ZXg7CisJc3RydWN0IHRpbWVyX2xpc3Qgc3Jpb3ZfaGVhcnRiZWF0X3RpbWVyOworCWNoYXIgc2tpcF9oZWFydGJlYXRfdGltZXJfZGVsOworCXU4IHJlcXVlc3RvcklkOworCXU2NCBpbml0aWF0b3Jfc2FzX2FkZHJlc3M7CisJdTY0IGxkX3Nhc19hZGRyZXNzWzY0XTsKKwljaGFyIFBsYXNtYUZXMTExOworCWNoYXIgbXBpbzsKIAlpbnQgdGhyb3R0bGVxdWV1ZWRlcHRoOwogCXU4IG1hc2tfaW50ZXJydXB0czsKIAl1OCBpc19pbXI7CiB9Oworc3RydWN0IE1SX0xEX1ZGX01BUCB7CisJdTMyIHNpemU7CisJdW5pb24gTVJfTERfUkVGIHJlZjsKKwl1OCBsZFZmQ291bnQ7CisJdTggcmVzZXJ2ZWRbNl07CisJdTggcG9saWN5WzFdOworfTsKKworc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OIHsKKwl1MzIgc2l6ZTsKKwl1OCBsZENvdW50OworCXU4IHZmQ291bnQ7CisJdTggdGhpc1ZmOworCXU4IHJlc2VydmVkWzldOworCXN0cnVjdCBNUl9MRF9WRl9NQVAgbWFwWzFdOworfTsKKworLyogUGxhc21hIDEuMTEgRlcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIElPVl8xMTFfT0ZGU0VUIDB4N0NFCisjZGVmaW5lIE1BWF9WSVJUVUFMX0ZVTkNUSU9OUyA4CisKK3N0cnVjdCBJT1ZfMTExIHsKKwl1OCBtYXhWRnNTdXBwb3J0ZWQ7CisJdTggbnVtVkZzRW5hYmxlZDsKKwl1OCByZXF1ZXN0b3JJZDsKKwl1OCByZXNlcnZlZFs1XTsKK307CisKK3N0cnVjdCBNUl9MRF9WRl9NQVBfMTExIHsKKwl1OCB0YXJnZXRJZDsKKwl1OCByZXNlcnZlZFszXTsKKwl1OCBwb2xpY3lbTUFYX1ZJUlRVQUxfRlVOQ1RJT05TXTsKK307CisKK3N0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEgeworCXU4IHZkQ291bnQ7CisJdTggdmZDb3VudDsKKwl1OCB0aGlzVmY7CisJdTggcmVzZXJ2ZWRbNV07CisJc3RydWN0IE1SX0xEX1ZGX01BUF8xMTEgbWFwW01BWF9MT0dJQ0FMX0RSSVZFU107Cit9OworCitzdHJ1Y3QgTVJfQ1RSTF9IQl9IT1NUX01FTSB7CisJc3RydWN0IHsKKwkJdTMyIGZ3Q291bnRlcjsJLyogRmlybXdhcmUgaGVhcnQgYmVhdCBjb3VudGVyICovCisJCXN0cnVjdCB7CisJCQl1MzIgZGVidWdtb2RlOjE7IC8qIDE9RmlybXdhcmUgaXMgaW4gZGVidWcgbW9kZS4KKwkJCQkJICAgIEhlYXJ0IGJlYXQgd2lsbCBub3QgYmUgdXBkYXRlZC4gKi8KKwkJCXUzMiByZXNlcnZlZDozMTsKKwkJfSBkZWJ1ZzsKKwkJdTMyIHJlc2VydmVkX2Z3WzZdOworCQl1MzIgZHJpdmVyQ291bnRlcjsgLyogRHJpdmVyIGhlYXJ0IGJlYXQgY291bnRlci4gIDB4MjAgKi8KKwkJdTMyIHJlc2VydmVkX2RyaXZlcls3XTsKKwl9IEhCOworCXU4IHBhZFsweDQwMC0weDQwXTsKK307CiAKIGVudW0gewogCU1FR0FTQVNfSEJBX09QRVJBVElPTkFMCQkJPSAwLApAQCAtMTYwOSw2ICsxNzA0LDcgQEAKIAlNRUdBU0FTX0FEUFJFU0VUX1NNX0ZXX1JFU0VUX1NVQ0NFU1MJPSAyLAogCU1FR0FTQVNfQURQUkVTRVRfU01fT1BFUkFUSU9OQUwJCT0gMywKIAlNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SCQk9IDQsCisJTUVHQVNBU19BRFBSRVNFVF9TTV9QT0xMSU5HCQk9IDUsCiAJTUVHQVNBU19BRFBSRVNFVF9JTlBST0dfU0lHTgkJPSAweERFQURERUFELAogfTsKIApAQCAtMTcyOCw3ICsxODI0LDcgQEAKIAkJICAgIHN0cnVjdCBJT19SRVFVRVNUX0lORk8gKmlvX2luZm8sCiAJCSAgICBzdHJ1Y3QgUkFJRF9DT05URVhUICpwUkFJRF9Db250ZXh0LAogCQkgICAgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwLCB1OCAqKnJhaWRMVU4pOwotdTE2IE1SX1RhcmdldElkVG9MZEdldCh1MzIgbGRUZ3RJZCwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKTsKK3U4IE1SX1RhcmdldElkVG9MZEdldCh1MzIgbGRUZ3RJZCwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKTsKIHN0cnVjdCBNUl9MRF9SQUlEICpNUl9MZFJhaWRHZXQodTMyIGxkLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApOwogdTE2IE1SX0FyUGRHZXQodTMyIGFyLCB1MzIgYXJtLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApOwogdTE2IE1SX0xkU3BhbkFycmF5R2V0KHUzMiBsZCwgdTMyIHNwYW4sIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jCmluZGV4IDNiN2FkMTAuLmQ4NGQwMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqCiAgKiAgRklMRTogbWVnYXJhaWRfc2FzX2Jhc2UuYwotICogIFZlcnNpb24gOiAwNi43MDAuMDYuMDAtcmMxCisgKiAgVmVyc2lvbiA6IDA2LjgwMy4wMS4wMC1yYzEKICAqCiAgKiAgQXV0aG9yczogTFNJIENvcnBvcmF0aW9uCiAgKiAgICAgICAgICAgU3JlZW5pdmFzIEJhZ2Fsa290ZQpAQCAtNzUsNiArNzUsMTAgQEAKIG1vZHVsZV9wYXJhbShtc2l4X3ZlY3RvcnMsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG1zaXhfdmVjdG9ycywgIk1TSS1YIG1heCB2ZWN0b3IgY291bnQuIERlZmF1bHQ6IFNldCBieSBGVyIpOwogCitzdGF0aWMgaW50IGFsbG93X3ZmX2lvY3RsczsKK21vZHVsZV9wYXJhbShhbGxvd192Zl9pb2N0bHMsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGFsbG93X3ZmX2lvY3RscywgIkFsbG93IGlvY3RscyBpbiBTUi1JT1YgVkYgbW9kZS4gRGVmYXVsdDogMCIpOworCiBzdGF0aWMgaW50IHRocm90dGxlcXVldWVkZXB0aCA9IE1FR0FTQVNfVEhST1RUTEVfUVVFVUVfREVQVEg7CiBtb2R1bGVfcGFyYW0odGhyb3R0bGVxdWV1ZWRlcHRoLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyh0aHJvdHRsZXF1ZXVlZGVwdGgsCkBAIC0xMjIsNiArMTI2LDggQEAKIAkvKiB4c2NhbGUgSU9QICovCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTil9LAogCS8qIEZ1c2lvbiAqLworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpfSwKKwkvKiBQbGFzbWEgKi8KIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUil9LAogCS8qIEludmFkZXIgKi8KIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfRlVSWSl9LApAQCAtMTMyLDcgKzEzOCw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWVnYXNhc19wY2lfdGFibGUpOwogCiBzdGF0aWMgaW50IG1lZ2FzYXNfbWdtdF9tYWpvcm5vOwotc3RhdGljIHN0cnVjdCBtZWdhc2FzX21nbXRfaW5mbyBtZWdhc2FzX21nbXRfaW5mbzsKK3N0cnVjdCBtZWdhc2FzX21nbXRfaW5mbyBtZWdhc2FzX21nbXRfaW5mbzsKIHN0YXRpYyBzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqbWVnYXNhc19hc3luY19xdWV1ZTsKIHN0YXRpYyBERUZJTkVfTVVURVgobWVnYXNhc19hc3luY19xdWV1ZV9tdXRleCk7CiAKQEAgLTE3MSwxMCArMTc3LDE1IEBACiBpbnQKIG1lZ2FzYXNfc3luY19tYXBfaW5mbyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOwogaW50Ci13YWl0X2FuZF9wb2xsKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpOword2FpdF9hbmRfcG9sbChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLAorCWludCBzZWNvbmRzKTsKIHZvaWQgbWVnYXNhc19yZXNldF9yZXBseV9kZXNjKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7Ci1pbnQgbWVnYXNhc19yZXNldF9mdXNpb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOworaW50IG1lZ2FzYXNfcmVzZXRfZnVzaW9uKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgaW90aW1lb3V0KTsKIHZvaWQgbWVnYXNhc19mdXNpb25fb2NyX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgaW50IG1lZ2FzYXNfZ2V0X2xkX3ZmX2FmZmlsaWF0aW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCQkJIGludCBpbml0aWFsKTsKK2ludCBtZWdhc2FzX2NoZWNrX21waW9fcGF0aHMoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKTsKIAogdm9pZAogbWVnYXNhc19pc3N1ZV9kY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCkBAIC0yMjQsNiArMjM1LDcgQEAKIAljbWQtPnNjbWQgPSBOVUxMOwogCWNtZC0+ZnJhbWVfY291bnQgPSAwOwogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pICYmCisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgJiYKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgJiYKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkgJiYKIAkgICAgKHJlc2V0X2RldmljZXMpKQpAQCAtODc3LDYgKzg4OSw3IEBACiBpbnQKIG1lZ2FzYXNfaXNzdWVfcG9sbGVkKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCiB7CisJaW50IHNlY29uZHM7CiAKIAlzdHJ1Y3QgbWVnYXNhc19oZWFkZXIgKmZyYW1lX2hkciA9ICZjbWQtPmZyYW1lLT5oZHI7CiAKQEAgLTg5MSwxMyArOTA0LDE4IEBACiAJLyoKIAkgKiBXYWl0IGZvciBjbWRfc3RhdHVzIHRvIGNoYW5nZQogCSAqLwotCXJldHVybiB3YWl0X2FuZF9wb2xsKGluc3RhbmNlLCBjbWQpOworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpCisJCXNlY29uZHMgPSBNRUdBU0FTX1JPVVRJTkVfV0FJVF9USU1FX1ZGOworCWVsc2UKKwkJc2Vjb25kcyA9IE1GSV9QT0xMX1RJTUVPVVRfU0VDUzsKKwlyZXR1cm4gd2FpdF9hbmRfcG9sbChpbnN0YW5jZSwgY21kLCBzZWNvbmRzKTsKIH0KIAogLyoqCiAgKiBtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kIC0JU3luY2hyb25vdXMgd3JhcHBlciBhcm91bmQgcmVndWxhciBGVyBjbWRzCiAgKiBAaW5zdGFuY2U6CQkJQWRhcHRlciBzb2Z0IHN0YXRlCiAgKiBAY21kOgkJCUNvbW1hbmQgdG8gYmUgaXNzdWVkCisgKiBAdGltZW91dDoJCQlUaW1lb3V0IGluIHNlY29uZHMKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIG9uIGFuIGV2ZW50IGZvciB0aGUgY29tbWFuZCB0byBiZSByZXR1cm5lZCBmcm9tIElTUi4KICAqIE1heCB3YWl0IHRpbWUgaXMgTUVHQVNBU19JTlRFUk5BTF9DTURfV0FJVF9USU1FIHNlY3MKQEAgLTkwNSwxMyArOTIzLDIwIEBACiAgKi8KIHN0YXRpYyBpbnQKIG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAotCQkJICBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCkKKwkJCSAgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQsIGludCB0aW1lb3V0KQogeworCWludCByZXQgPSAwOwogCWNtZC0+Y21kX3N0YXR1cyA9IEVOT0RBVEE7CiAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5pc3N1ZV9kY21kKGluc3RhbmNlLCBjbWQpOwotCi0Jd2FpdF9ldmVudChpbnN0YW5jZS0+aW50X2NtZF93YWl0X3EsIGNtZC0+Y21kX3N0YXR1cyAhPSBFTk9EQVRBKTsKKwlpZiAodGltZW91dCkgeworCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaW5zdGFuY2UtPmludF9jbWRfd2FpdF9xLAorCQkJCWNtZC0+Y21kX3N0YXR1cyAhPSBFTk9EQVRBLCB0aW1lb3V0ICogSFopOworCQlpZiAoIXJldCkKKwkJCXJldHVybiAxOworCX0gZWxzZQorCQl3YWl0X2V2ZW50KGluc3RhbmNlLT5pbnRfY21kX3dhaXRfcSwKKwkJCQljbWQtPmNtZF9zdGF0dXMgIT0gRU5PREFUQSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkyMCwxOCArOTQ1LDIwIEBACiAgKiBtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfYWJvcnRfY21kIC0JQWJvcnRzIHByZXZpb3VzbHkgaXNzdWVkIGNtZAogICogQGluc3RhbmNlOgkJCQlBZGFwdGVyIHNvZnQgc3RhdGUKICAqIEBjbWRfdG9fYWJvcnQ6CQkJUHJldmlvdXNseSBpc3N1ZWQgY21kIHRvIGJlIGFib3J0ZWQKKyAqIEB0aW1lb3V0OgkJCQlUaW1lb3V0IGluIHNlY29uZHMKICAqCi0gKiBNRkkgZmlybXdhcmUgY2FuIGFib3J0IHByZXZpb3VzbHkgaXNzdWVkIEFFTiBjb21tYW5kIChhdXRvbWF0aWMgZXZlbnQKKyAqIE1GSSBmaXJtd2FyZSBjYW4gYWJvcnQgcHJldmlvdXNseSBpc3N1ZWQgQUVOIGNvbWFtbmQgKGF1dG9tYXRpYyBldmVudAogICogbm90aWZpY2F0aW9uKS4gVGhlIG1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9hYm9ydF9jbWQoKSBpc3N1ZXMgc3VjaCBhYm9ydAogICogY21kIGFuZCB3YWl0cyBmb3IgcmV0dXJuIHN0YXR1cy4KICAqIE1heCB3YWl0IHRpbWUgaXMgTUVHQVNBU19JTlRFUk5BTF9DTURfV0FJVF9USU1FIHNlY3MKICAqLwogc3RhdGljIGludAogbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2Fib3J0X2NtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCi0JCQkJc3RydWN0IG1lZ2FzYXNfY21kICpjbWRfdG9fYWJvcnQpCisJCQkJc3RydWN0IG1lZ2FzYXNfY21kICpjbWRfdG9fYWJvcnQsIGludCB0aW1lb3V0KQogewogCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kOwogCXN0cnVjdCBtZWdhc2FzX2Fib3J0X2ZyYW1lICphYm9ydF9mcjsKKwlpbnQgcmV0ID0gMDsKIAogCWNtZCA9IG1lZ2FzYXNfZ2V0X2NtZChpbnN0YW5jZSk7CiAKQEAgLTk1NywxMCArOTg0LDE4IEBACiAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5pc3N1ZV9kY21kKGluc3RhbmNlLCBjbWQpOwogCi0JLyoKLQkgKiBXYWl0IGZvciB0aGlzIGNtZCB0byBjb21wbGV0ZQotCSAqLwotCXdhaXRfZXZlbnQoaW5zdGFuY2UtPmFib3J0X2NtZF93YWl0X3EsIGNtZC0+Y21kX3N0YXR1cyAhPSAweEZGKTsKKwlpZiAodGltZW91dCkgeworCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaW5zdGFuY2UtPmFib3J0X2NtZF93YWl0X3EsCisJCQkJY21kLT5jbWRfc3RhdHVzICE9IEVOT0RBVEEsIHRpbWVvdXQgKiBIWik7CisJCWlmICghcmV0KSB7CisJCQlkZXZfZXJyKCZpbnN0YW5jZS0+cGRldi0+ZGV2LCAiQ29tbWFuZCB0aW1lZG91dCIKKwkJCQkiZnJvbSAlc1xuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UKKwkJd2FpdF9ldmVudChpbnN0YW5jZS0+YWJvcnRfY21kX3dhaXRfcSwKKwkJCQljbWQtPmNtZF9zdGF0dXMgIT0gRU5PREFUQSk7CisKIAljbWQtPnN5bmNfY21kID0gMDsKIAogCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKQEAgLTE1MTQsOSArMTU0OSwyMyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5oYmFfbG9jaywgZmxhZ3MpOwogCisJLyogQ2hlY2sgZm9yIGFuIG1waW8gcGF0aCBhbmQgYWRqdXN0IGJlaGF2aW9yICovCisJaWYgKGluc3RhbmNlLT5hZHByZWNvdmVyeSA9PSBNRUdBU0FTX0FEUFJFU0VUX1NNX0lORkFVTFQpIHsKKwkJaWYgKG1lZ2FzYXNfY2hlY2tfbXBpb19wYXRocyhpbnN0YW5jZSwgc2NtZCkgPT0KKwkJICAgIChESURfUkVTRVQgPDwgMTYpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+aGJhX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPmhiYV9sb2NrLCBmbGFncyk7CisJCQlzY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCWRvbmUoc2NtZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwogCWlmIChpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPT0gTUVHQVNBU19IV19DUklUSUNBTF9FUlJPUikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+aGJhX2xvY2ssIGZsYWdzKTsKLQkJc2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlzY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKIAkJZG9uZShzY21kKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTY0MSw5ICsxNjkwLDE0IEBACiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzNTS0lOTlkpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkgewogCQl3cml0ZWwoTUZJX1NUT1BfQURQLCAmaW5zdGFuY2UtPnJlZ19zZXQtPmRvb3JiZWxsKTsKKwkJLyogRmx1c2ggKi8KKwkJcmVhZGwoJmluc3RhbmNlLT5yZWdfc2V0LT5kb29yYmVsbCk7CisJCWlmIChpbnN0YW5jZS0+bXBpbyAmJiBpbnN0YW5jZS0+cmVxdWVzdG9ySWQpCisJCQltZW1zZXQoaW5zdGFuY2UtPmxkX2lkcywgMHhmZiwgTUVHQVNBU19NQVhfTERfSURTKTsKIAl9IGVsc2UgewogCQl3cml0ZWwoTUZJX1NUT1BfQURQLCAmaW5zdGFuY2UtPnJlZ19zZXQtPmluYm91bmRfZG9vcmJlbGwpOwogCX0KQEAgLTE3MzAsNiArMTc4NCwyNSBAQAogCW1lZ2FzYXNfY2hlY2tfYW5kX3Jlc3RvcmVfcXVldWVfZGVwdGgoaW5zdGFuY2UpOwogfQogCisvKioKKyAqIG1lZ2FzYXNfc3RhcnRfdGltZXIgLSBJbml0aWFsaXplcyBhIHRpbWVyIG9iamVjdAorICogQGluc3RhbmNlOgkJQWRhcHRlciBzb2Z0IHN0YXRlCisgKiBAdGltZXI6CQl0aW1lciBvYmplY3QgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIEBmbjoJCQl0aW1lciBmdW5jdGlvbgorICogQGludGVydmFsOgkJdGltZSBpbnRlcnZhbCBiZXR3ZWVuIHRpbWVyIGZ1bmN0aW9uIGNhbGwKKyAqCisgKi8KK3ZvaWQgbWVnYXNhc19zdGFydF90aW1lcihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsCisJCQl2b2lkICpmbiwgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKK3sKKwlpbml0X3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBpbnRlcnZhbDsKKwl0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluc3RhbmNlOworCXRpbWVyLT5mdW5jdGlvbiA9IGZuOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKIHN0YXRpYyB2b2lkCiBtZWdhc2FzX2ludGVybmFsX3Jlc2V0X2RlZmVyX2NtZHMoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKIApAQCAtMTc1Miw2ICsxODI1LDI5NSBAQAogCXByb2Nlc3NfZndfc3RhdGVfY2hhbmdlX3dxKCZpbnN0YW5jZS0+d29ya19pbml0KTsKIH0KIAorLyogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgY3VycmVudCBTUi1JT1YgTEQvVkYgYWZmaWxpYXRpb24gKi8KK3N0YXRpYyBpbnQgbWVnYXNhc19nZXRfbGRfdmZfYWZmaWxpYXRpb24oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCWludCBpbml0aWFsKQoreworCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kOworCXN0cnVjdCBtZWdhc2FzX2RjbWRfZnJhbWUgKmRjbWQ7CisJc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OICpuZXdfYWZmaWxpYXRpb24gPSBOVUxMOworCXN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEgKm5ld19hZmZpbGlhdGlvbl8xMTEgPSBOVUxMOworCXN0cnVjdCBNUl9MRF9WRl9NQVAgKm5ld21hcCA9IE5VTEwsICpzYXZlZG1hcCA9IE5VTEw7CisJZG1hX2FkZHJfdCBuZXdfYWZmaWxpYXRpb25faDsKKwlkbWFfYWRkcl90IG5ld19hZmZpbGlhdGlvbl8xMTFfaDsKKwlpbnQgbGQsIHJldHZhbCA9IDA7CisJdTggdGhpc1ZmOworCisJY21kID0gbWVnYXNhc19nZXRfY21kKGluc3RhbmNlKTsKKworCWlmICghY21kKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBtZWdhc2FzX2dldF9sZF92Zl8iCisJCSAgICAgICAiYWZmaWxpYXRpb246IEZhaWxlZCB0byBnZXQgY21kIGZvciBzY3NpJWQuXG4iLAorCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkY21kID0gJmNtZC0+ZnJhbWUtPmRjbWQ7CisKKwlpZiAoIWluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbiAmJiAhaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IENvdWxkbid0IGdldCBMRC9WRiAiCisJCSAgICAgICAiYWZmaWxpYXRpb24gZm9yIHNjc2klZC5cbiIsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaW5pdGlhbCkKKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJCW1lbXNldChpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExLCAwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKSk7CisJCWVsc2UKKwkJCW1lbXNldChpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24sIDAsCisJCQkgICAgICAgKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKSk7CisJZWxzZSB7CisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCQluZXdfYWZmaWxpYXRpb25fMTExID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChpbnN0YW5jZS0+cGRldiwKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTl8xMTEpLAorCQkJCQkJICAgICAmbmV3X2FmZmlsaWF0aW9uXzExMV9oKTsKKwkJZWxzZQorCQkJbmV3X2FmZmlsaWF0aW9uID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChpbnN0YW5jZS0+cGRldiwKKwkJCQkJCSAgICAgKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTiksCisJCQkJCQkgICAgICZuZXdfYWZmaWxpYXRpb25faCk7CisJCWlmICghbmV3X2FmZmlsaWF0aW9uICYmICFuZXdfYWZmaWxpYXRpb25fMTExKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogU1ItSU9WOiBDb3VsZG4ndCBhbGxvY2F0ZSAiCisJCQkgICAgICAgIm1lbW9yeSBmb3IgbmV3IGFmZmlsaWF0aW9uIGZvciBzY3NpJWQuXG4iLAorCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCW1lZ2FzYXNfcmV0dXJuX2NtZChpbnN0YW5jZSwgY21kKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCQltZW1zZXQobmV3X2FmZmlsaWF0aW9uXzExMSwgMCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSkpOworCQllbHNlCisJCQltZW1zZXQobmV3X2FmZmlsaWF0aW9uLCAwLCAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pKTsKKwl9CisKKwltZW1zZXQoZGNtZC0+bWJveC5iLCAwLCBNRklfTUJPWF9TSVpFKTsKKworCWRjbWQtPmNtZCA9IE1GSV9DTURfRENNRDsKKwlkY21kLT5jbWRfc3RhdHVzID0gMHhGRjsKKwlkY21kLT5zZ2VfY291bnQgPSAxOworCWRjbWQtPmZsYWdzID0gTUZJX0ZSQU1FX0RJUl9CT1RIOworCWRjbWQtPnRpbWVvdXQgPSAwOworCWRjbWQtPnBhZF8wID0gMDsKKwlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKSB7CisJCWRjbWQtPmRhdGFfeGZlcl9sZW4gPSBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSk7CisJCWRjbWQtPm9wY29kZSA9IE1SX0RDTURfTERfVkZfTUFQX0dFVF9BTExfTERTXzExMTsKKwl9IGVsc2UgeworCQlkY21kLT5kYXRhX3hmZXJfbGVuID0gKE1BWF9MT0dJQ0FMX0RSSVZFUyArIDEpICoKKwkJCXNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pOworCQlkY21kLT5vcGNvZGUgPSBNUl9EQ01EX0xEX1ZGX01BUF9HRVRfQUxMX0xEUzsKKwl9CisKKwlpZiAoaW5pdGlhbCkgeworCQlpZiAoaW5zdGFuY2UtPlBsYXNtYUZXMTExKQorCQkJZGNtZC0+c2dsLnNnZTMyWzBdLnBoeXNfYWRkciA9CisJCQkgIGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTFfaDsKKwkJZWxzZQorCQkJZGNtZC0+c2dsLnNnZTMyWzBdLnBoeXNfYWRkciA9CisJCQkgIGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl9oOworCX0gZWxzZSB7CisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCQlkY21kLT5zZ2wuc2dlMzJbMF0ucGh5c19hZGRyID0gbmV3X2FmZmlsaWF0aW9uXzExMV9oOworCQllbHNlCisJCQlkY21kLT5zZ2wuc2dlMzJbMF0ucGh5c19hZGRyID0gbmV3X2FmZmlsaWF0aW9uX2g7CisJfQorCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCWRjbWQtPnNnbC5zZ2UzMlswXS5sZW5ndGggPQorCQkgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKTsKKwllbHNlCisJCWRjbWQtPnNnbC5zZ2UzMlswXS5sZW5ndGggPSAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJc2l6ZW9mKHN0cnVjdCBNUl9MRF9WRl9BRkZJTElBVElPTik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IEdldHRpbmcgTEQvVkYgYWZmaWxpYXRpb24gZm9yICIKKwkgICAgICAgInNjc2klZFxuIiwgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCisJbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kLCAwKTsKKworCWlmIChkY21kLT5jbWRfc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogTEQvVkYgYWZmaWxpYXRpb24gRENNRCIKKwkJICAgICAgICIgZmFpbGVkIHdpdGggc3RhdHVzIDB4JXggZm9yIHNjc2klZC5cbiIsCisJCSAgICAgICBkY21kLT5jbWRfc3RhdHVzLCBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHZhbCA9IDE7IC8qIERvIGEgc2NhbiBpZiB3ZSBjb3VsZG4ndCBnZXQgYWZmaWxpYXRpb24gKi8KKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFpbml0aWFsKSB7CisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpIHsKKwkJCWlmICghbmV3X2FmZmlsaWF0aW9uXzExMS0+dmRDb3VudCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogR290IG5ldyAiCisJCQkJICAgICAgICJMRC9WRiBhZmZpbGlhdGlvbiBmb3IgcGFzc2l2ZSBwYXRoICIKKwkJCQkgICAgICAgImZvciBzY3NpJWQuXG4iLAorCQkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQkJcmV0dmFsID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXRoaXNWZiA9IG5ld19hZmZpbGlhdGlvbl8xMTEtPnRoaXNWZjsKKwkJCWZvciAobGQgPSAwIDsgbGQgPCBuZXdfYWZmaWxpYXRpb25fMTExLT52ZENvdW50OyBsZCsrKQorCQkJCWlmIChpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExLT5tYXBbbGRdLnBvbGljeVt0aGlzVmZdICE9IG5ld19hZmZpbGlhdGlvbl8xMTEtPm1hcFtsZF0ucG9saWN5W3RoaXNWZl0pIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiAiCisJCQkJCSAgICAgICAiR290IG5ldyBMRC9WRiBhZmZpbGlhdGlvbiAiCisJCQkJCSAgICAgICAiZm9yIHNjc2klZC5cbiIsCisJCQkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCQkJCW1lbWNweShpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExLAorCQkJCQkgICAgICAgbmV3X2FmZmlsaWF0aW9uXzExMSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKSk7CisJCQkJCXJldHZhbCA9IDE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghbmV3X2FmZmlsaWF0aW9uLT5sZENvdW50KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBHb3QgbmV3ICIKKwkJCQkgICAgICAgIkxEL1ZGIGFmZmlsaWF0aW9uIGZvciBwYXNzaXZlICIKKwkJCQkgICAgICAgInBhdGggZm9yIHNjc2klZC5cbiIsCisJCQkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCQlyZXR2YWwgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJbmV3bWFwID0gbmV3X2FmZmlsaWF0aW9uLT5tYXA7CisJCQlzYXZlZG1hcCA9IGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbi0+bWFwOworCQkJdGhpc1ZmID0gbmV3X2FmZmlsaWF0aW9uLT50aGlzVmY7CisJCQlmb3IgKGxkID0gMCA7IGxkIDwgbmV3X2FmZmlsaWF0aW9uLT5sZENvdW50OyBsZCsrKSB7CisJCQkJaWYgKHNhdmVkbWFwLT5wb2xpY3lbdGhpc1ZmXSAhPQorCQkJCSAgICBuZXdtYXAtPnBvbGljeVt0aGlzVmZdKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogIgorCQkJCQkgICAgICAgIkdvdCBuZXcgTEQvVkYgYWZmaWxpYXRpb24gIgorCQkJCQkgICAgICAgImZvciBzY3NpJWQuXG4iLAorCQkJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJCQltZW1jcHkoaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uLAorCQkJCQkgICAgICAgbmV3X2FmZmlsaWF0aW9uLAorCQkJCQkgICAgICAgbmV3X2FmZmlsaWF0aW9uLT5zaXplKTsKKwkJCQkJcmV0dmFsID0gMTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXNhdmVkbWFwID0gKHN0cnVjdCBNUl9MRF9WRl9NQVAgKikKKwkJCQkJKCh1bnNpZ25lZCBjaGFyICopc2F2ZWRtYXAgKworCQkJCQkgc2F2ZWRtYXAtPnNpemUpOworCQkJCW5ld21hcCA9IChzdHJ1Y3QgTVJfTERfVkZfTUFQICopCisJCQkJCSgodW5zaWduZWQgY2hhciAqKW5ld21hcCArCisJCQkJCSBuZXdtYXAtPnNpemUpOworCQkJfQorCQl9CisJfQorb3V0OgorCWlmIChuZXdfYWZmaWxpYXRpb24pIHsKKwkJaWYgKGluc3RhbmNlLT5QbGFzbWFGVzExMSkKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW5zdGFuY2UtPnBkZXYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OXzExMSksCisJCQkJCSAgICBuZXdfYWZmaWxpYXRpb25fMTExLAorCQkJCQkgICAgbmV3X2FmZmlsaWF0aW9uXzExMV9oKTsKKwkJZWxzZQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChpbnN0YW5jZS0+cGRldiwKKwkJCQkJICAgIChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKSwKKwkJCQkJICAgIG5ld19hZmZpbGlhdGlvbiwgbmV3X2FmZmlsaWF0aW9uX2gpOworCX0KKwltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGVsbCBGVyB0byBzdGFydCB0aGUgU1ItSU9WIGhlYXJ0YmVhdCAqLworaW50IG1lZ2FzYXNfc3Jpb3Zfc3RhcnRfaGVhcnRiZWF0KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCQkJIGludCBpbml0aWFsKQoreworCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kOworCXN0cnVjdCBtZWdhc2FzX2RjbWRfZnJhbWUgKmRjbWQ7CisJaW50IHJldHZhbCA9IDA7CisKKwljbWQgPSBtZWdhc2FzX2dldF9jbWQoaW5zdGFuY2UpOworCisJaWYgKCFjbWQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IG1lZ2FzYXNfc3Jpb3Zfc3RhcnRfaGVhcnRiZWF0OiAiCisJCSAgICAgICAiRmFpbGVkIHRvIGdldCBjbWQgZm9yIHNjc2klZC5cbiIsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRjbWQgPSAmY21kLT5mcmFtZS0+ZGNtZDsKKworCWlmIChpbml0aWFsKSB7CisJCWluc3RhbmNlLT5oYl9ob3N0X21lbSA9CisJCQlwY2lfYWxsb2NfY29uc2lzdGVudChpbnN0YW5jZS0+cGRldiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0pLAorCQkJCQkgICAgICZpbnN0YW5jZS0+aGJfaG9zdF9tZW1faCk7CisJCWlmICghaW5zdGFuY2UtPmhiX2hvc3RfbWVtKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogU1ItSU9WOiBDb3VsZG4ndCBhbGxvY2F0ZSIKKwkJCSAgICAgICAiIG1lbW9yeSBmb3IgaGVhcnRiZWF0IGhvc3QgbWVtb3J5IGZvciAiCisJCQkgICAgICAgInNjc2klZC5cbiIsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQltZW1zZXQoaW5zdGFuY2UtPmhiX2hvc3RfbWVtLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNKSk7CisJfQorCisJbWVtc2V0KGRjbWQtPm1ib3guYiwgMCwgTUZJX01CT1hfU0laRSk7CisKKwlkY21kLT5tYm94LnNbMF0gPSBzaXplb2Yoc3RydWN0IE1SX0NUUkxfSEJfSE9TVF9NRU0pOworCWRjbWQtPmNtZCA9IE1GSV9DTURfRENNRDsKKwlkY21kLT5jbWRfc3RhdHVzID0gMHhGRjsKKwlkY21kLT5zZ2VfY291bnQgPSAxOworCWRjbWQtPmZsYWdzID0gTUZJX0ZSQU1FX0RJUl9CT1RIOworCWRjbWQtPnRpbWVvdXQgPSAwOworCWRjbWQtPnBhZF8wID0gMDsKKwlkY21kLT5kYXRhX3hmZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNKTsKKwlkY21kLT5vcGNvZGUgPSBNUl9EQ01EX0NUUkxfU0hBUkVEX0hPU1RfTUVNX0FMTE9DOworCWRjbWQtPnNnbC5zZ2UzMlswXS5waHlzX2FkZHIgPSBpbnN0YW5jZS0+aGJfaG9zdF9tZW1faDsKKwlkY21kLT5zZ2wuc2dlMzJbMF0ubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogU3RhcnRpbmcgaGVhcnRiZWF0IGZvciBzY3NpJWRcbiIsCisJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKworCWlmICghbWVnYXNhc19pc3N1ZV9wb2xsZWQoaW5zdGFuY2UsIGNtZCkpIHsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhc2FzOiBTUi1JT1Y6IE1SX0RDTURfQ1RSTF9TSEFSRURfSE9TVCIKKwkJICAgICAgICJfTUVNX0FMTE9DIERDTUQgdGltZWQgb3V0IGZvciBzY3NpJWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCXJldHZhbCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCisJaWYgKGRjbWQtPmNtZF9zdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiBNUl9EQ01EX0NUUkxfU0hBUkVEX0hPU1QiCisJCSAgICAgICAiX01FTV9BTExPQyBEQ01EIGZhaWxlZCB3aXRoIHN0YXR1cyAweCV4IGZvciBzY3NpJWRcbiIsCisJCSAgICAgICBkY21kLT5jbWRfc3RhdHVzLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR2YWwgPSAxOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBIYW5kbGVyIGZvciBTUi1JT1YgaGVhcnRiZWF0ICovCit2b2lkIG1lZ2FzYXNfc3Jpb3ZfaGVhcnRiZWF0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBpbnN0YW5jZV9hZGRyKQoreworCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSA9CisJCShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqKWluc3RhbmNlX2FkZHI7CisKKwlpZiAoaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5md0NvdW50ZXIgIT0KKwkgICAgaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5kcml2ZXJDb3VudGVyKSB7CisJCWluc3RhbmNlLT5oYl9ob3N0X21lbS0+SEIuZHJpdmVyQ291bnRlciA9CisJCQlpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmZ3Q291bnRlcjsKKwkJbW9kX3RpbWVyKCZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyLAorCQkJICBqaWZmaWVzICsgTUVHQVNBU19TUklPVl9IRUFSVEJFQVRfSU5URVJWQUxfVkYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjogSGVhcnRiZWF0IG5ldmVyICIKKwkJICAgICAgICJjb21wbGV0ZWQgZm9yIHNjc2klZFxuIiwgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlzY2hlZHVsZV93b3JrKCZpbnN0YW5jZS0+d29ya19pbml0KTsKKwl9Cit9CisKIC8qKgogICogbWVnYXNhc193YWl0X2Zvcl9vdXRzdGFuZGluZyAtCVdhaXQgZm9yIGFsbCBvdXRzdGFuZGluZyBjbWRzCiAgKiBAaW5zdGFuY2U6CQkJCUFkYXB0ZXIgc29mdCBzdGF0ZQpAQCAtMjAxNCw5ICsyMzc2LDEwIEBACiAJICogRmlyc3Qgd2FpdCBmb3IgYWxsIGNvbW1hbmRzIHRvIGNvbXBsZXRlCiAJICovCiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkKLQkJcmV0ID0gbWVnYXNhc19yZXNldF9mdXNpb24oc2NtZC0+ZGV2aWNlLT5ob3N0KTsKKwkJcmV0ID0gbWVnYXNhc19yZXNldF9mdXNpb24oc2NtZC0+ZGV2aWNlLT5ob3N0LCAxKTsKIAllbHNlCiAJCXJldCA9IG1lZ2FzYXNfZ2VuZXJpY19yZXNldChzY21kKTsKIApAQCAtMjczMSw2ICszMDk0LDggQEAKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJCVBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJCVBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKKwkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJCVBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQlQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkgewpAQCAtMjc1NSw2ICszMTIwLDggQEAKIAkJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJICAgICBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CiAJCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCSAgICAgUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAorCQkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkgICAgIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCSAgICAgUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpIHsKQEAgLTI3ODAsNiArMzE0Nyw4IEBACiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UKIAkJCQkJPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlCisJCQkJCT09IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKKwkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZQogCQkJCQk9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlCiAJCQkJCT09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKSB7CkBAIC0yNzg4LDYgKzMxNTcsOCBAQAogCQkJCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJCQlQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CiAJCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkJCVBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKKwkJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQkJUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQkJUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpIHsKQEAgLTMwMTQsNiArMzM4NSw3IEBACiAJCWNtZC0+ZnJhbWUtPmlvLmNvbnRleHQgPSBjcHVfdG9fbGUzMihjbWQtPmluZGV4KTsKIAkJY21kLT5mcmFtZS0+aW8ucGFkXzAgPSAwOwogCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSAmJgorCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSAmJgogCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgJiYKIAkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpICYmCiAJCSAgICAocmVzZXRfZGV2aWNlcykpCkBAIC0zNjIwLDYgKzM5OTIsNyBAQAogCXN0cnVjdCBtZWdhc2FzX2N0cmxfaW5mbyAqY3RybF9pbmZvOwogCXVuc2lnbmVkIGxvbmcgYmFyX2xpc3Q7CiAJaW50IGksIGxvb3AsIGZ3X21zaXhfY291bnQgPSAwOworCXN0cnVjdCBJT1ZfMTExICppb3ZQdHI7CiAKIAkvKiBGaW5kIGZpcnN0IG1lbW9yeSBiYXIgKi8KIAliYXJfbGlzdCA9IHBjaV9zZWxlY3RfYmFycyhpbnN0YW5jZS0+cGRldiwgSU9SRVNPVVJDRV9NRU0pOwpAQCAtMzY0Miw2ICs0MDE1LDcgQEAKIAogCXN3aXRjaCAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OOgorCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfUExBU01BOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUjoKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlk6CiAJCWluc3RhbmNlLT5pbnN0YW5jZXQgPSAmbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZV9mdXNpb247CkBAIC0zNjk2LDcgKzQwNzAsOCBAQAogCQlzY3JhdGNoX3BhZF8yID0gcmVhZGwKIAkJCSgmaW5zdGFuY2UtPnJlZ19zZXQtPm91dGJvdW5kX3NjcmF0Y2hfcGFkXzIpOwogCQkvKiBDaGVjayBtYXggTVNJLVggdmVjdG9ycyAqLwotCQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHsKKwkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkpIHsKIAkJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPSAoc2NyYXRjaF9wYWRfMgogCQkJCSYgTVJfTUFYX1JFUExZX1FVRVVFU19PRkZTRVQpICsgMTsKIAkJCWZ3X21zaXhfY291bnQgPSBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOwpAQCAtMzc2Myw3ICs0MTM4LDEwIEBACiAKIAltZW1zZXQoaW5zdGFuY2UtPnBkX2xpc3QsIDAgLAogCQkoTUVHQVNBU19NQVhfUEQgKiBzaXplb2Yoc3RydWN0IG1lZ2FzYXNfcGRfbGlzdCkpKTsKLQltZWdhc2FzX2dldF9wZF9saXN0KGluc3RhbmNlKTsKKwlpZiAobWVnYXNhc19nZXRfcGRfbGlzdChpbnN0YW5jZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVnYXNhczogZmFpbGVkIHRvIGdldCBQRCBsaXN0XG4iKTsKKwkJZ290byBmYWlsX2luaXRfYWRhcHRlcjsKKwl9CiAKIAltZW1zZXQoaW5zdGFuY2UtPmxkX2lkcywgMHhmZiwgTUVHQVNBU19NQVhfTERfSURTKTsKIAlpZiAobWVnYXNhc19sZF9saXN0X3F1ZXJ5KGluc3RhbmNlLApAQCAtMzgwNyw2ICs0MTg1LDcgQEAKIAkJY3RybF9pbmZvLT5wcm9wZXJ0aWVzLk9uT2ZmUHJvcGVydGllcy5kaXNhYmxlT25saW5lQ3RybFJlc2V0OwogCQkvKiBhZGFwdGVyT3BlcmF0aW9uczIgYXJlIGNvbnZlcnRlZCBpbnRvIENQVSBhcmNoKi8KIAkJbGUzMl90b19jcHVzKCh1MzIgKikmY3RybF9pbmZvLT5hZGFwdGVyT3BlcmF0aW9uczIpOworCQlpbnN0YW5jZS0+bXBpbyA9IGN0cmxfaW5mby0+YWRhcHRlck9wZXJhdGlvbnMyLm1waW87CiAJCWluc3RhbmNlLT5VbmV2ZW5TcGFuU3VwcG9ydCA9CiAJCQljdHJsX2luZm8tPmFkYXB0ZXJPcGVyYXRpb25zMi5zdXBwb3J0VW5ldmVuU3BhbnM7CiAJCWlmIChpbnN0YW5jZS0+VW5ldmVuU3BhblN1cHBvcnQpIHsKQEAgLTM4MTksNiArNDE5OCwyMCBAQAogCQkJCWZ1c2lvbi0+ZmFzdF9wYXRoX2lvID0gMDsKIAogCQl9CisJCWlmIChjdHJsX2luZm8tPmhvc3RfaW50ZXJmYWNlLlNSSU9WKSB7CisJCQlpZiAoIWN0cmxfaW5mby0+YWRhcHRlck9wZXJhdGlvbnMyLmFjdGl2ZVBhc3NpdmUpCisJCQkJaW5zdGFuY2UtPlBsYXNtYUZXMTExID0gMTsKKworCQkJaWYgKCFpbnN0YW5jZS0+UGxhc21hRlcxMTEpCisJCQkJaW5zdGFuY2UtPnJlcXVlc3RvcklkID0KKwkJCQkJY3RybF9pbmZvLT5pb3YucmVxdWVzdG9ySWQ7CisJCQllbHNlIHsKKwkJCQlpb3ZQdHIgPSAoc3RydWN0IElPVl8xMTEgKikoKHVuc2lnbmVkIGNoYXIgKiljdHJsX2luZm8gKyBJT1ZfMTExX09GRlNFVCk7CisJCQkJaW5zdGFuY2UtPnJlcXVlc3RvcklkID0gaW92UHRyLT5yZXF1ZXN0b3JJZDsKKwkJCX0KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogSSBhbSBWRiAiCisJCQkgICAgICAgInJlcXVlc3RvcklkICVkXG4iLCBpbnN0YW5jZS0+cmVxdWVzdG9ySWQpOworCQl9CiAJfQogCWluc3RhbmNlLT5tYXhfc2VjdG9yc19wZXJfcmVxID0gaW5zdGFuY2UtPm1heF9udW1fc2dlICoKIAkJCQkJCVBBR0VfU0laRSAvIDUxMjsKQEAgLTM4NTEsNiArNDI0NCwxNyBAQAogCXRhc2tsZXRfaW5pdCgmaW5zdGFuY2UtPmlzcl90YXNrbGV0LCBpbnN0YW5jZS0+aW5zdGFuY2V0LT50YXNrbGV0LAogCQkodW5zaWduZWQgbG9uZylpbnN0YW5jZSk7CiAKKwkvKiBMYXVuY2ggU1ItSU9WIGhlYXJ0YmVhdCB0aW1lciAqLworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpIHsKKwkJaWYgKCFtZWdhc2FzX3NyaW92X3N0YXJ0X2hlYXJ0YmVhdChpbnN0YW5jZSwgMSkpCisJCQltZWdhc2FzX3N0YXJ0X3RpbWVyKGluc3RhbmNlLAorCQkJCQkgICAgJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIsCisJCQkJCSAgICBtZWdhc2FzX3NyaW92X2hlYXJ0YmVhdF9oYW5kbGVyLAorCQkJCQkgICAgTUVHQVNBU19TUklPVl9IRUFSVEJFQVRfSU5URVJWQUxfVkYpOworCQllbHNlCisJCQlpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsID0gMTsKKwl9CisKIAlyZXR1cm4gMDsKIAogZmFpbF9pbml0X2FkYXB0ZXI6CkBAIC0zOTMzLDE2ICs0MzM3LDE5IEBACiAJZGNtZC0+c2dsLnNnZTMyWzBdLnBoeXNfYWRkciA9IGNwdV90b19sZTMyKGVsX2luZm9faCk7CiAJZGNtZC0+c2dsLnNnZTMyWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3QgbWVnYXNhc19ldnRfbG9nX2luZm8pKTsKIAotCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCk7Ci0KLQkvKgotCSAqIENvcHkgdGhlIGRhdGEgYmFjayBpbnRvIGNhbGxlcnMgYnVmZmVyCi0JICovCi0JZWxpLT5uZXdlc3Rfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPm5ld2VzdF9zZXFfbnVtKTsKLQllbGktPm9sZGVzdF9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+b2xkZXN0X3NlcV9udW0pOwotCWVsaS0+Y2xlYXJfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPmNsZWFyX3NlcV9udW0pOwotCWVsaS0+c2h1dGRvd25fc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPnNodXRkb3duX3NlcV9udW0pOwotCWVsaS0+Ym9vdF9zZXFfbnVtID0gbGUzMl90b19jcHUoZWxfaW5mby0+Ym9vdF9zZXFfbnVtKTsKKwlpZiAobWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kLCAzMCkpCisJCWRldl9lcnIoJmluc3RhbmNlLT5wZGV2LT5kZXYsICJDb21tYW5kIHRpbWVkb3V0IgorCQkJImZyb20gJXNcbiIsIF9fZnVuY19fKTsKKwllbHNlIHsKKwkJLyoKKwkJICogQ29weSB0aGUgZGF0YSBiYWNrIGludG8gY2FsbGVycyBidWZmZXIKKwkJICovCisJCWVsaS0+bmV3ZXN0X3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5uZXdlc3Rfc2VxX251bSk7CisJCWVsaS0+b2xkZXN0X3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5vbGRlc3Rfc2VxX251bSk7CisJCWVsaS0+Y2xlYXJfc2VxX251bSA9IGxlMzJfdG9fY3B1KGVsX2luZm8tPmNsZWFyX3NlcV9udW0pOworCQllbGktPnNodXRkb3duX3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5zaHV0ZG93bl9zZXFfbnVtKTsKKwkJZWxpLT5ib290X3NlcV9udW0gPSBsZTMyX3RvX2NwdShlbF9pbmZvLT5ib290X3NlcV9udW0pOworCX0KIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW5zdGFuY2UtPnBkZXYsIHNpemVvZihzdHJ1Y3QgbWVnYXNhc19ldnRfbG9nX2luZm8pLAogCQkJICAgIGVsX2luZm8sIGVsX2luZm9faCk7CkBAIC00MDE4LDcgKzQ0MjUsNyBAQAogCQkJaW5zdGFuY2UtPmFlbl9jbWQtPmFib3J0X2FlbiA9IDE7CiAJCQlyZXRfdmFsID0gbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2Fib3J0X2NtZChpbnN0YW5jZSwKIAkJCQkJCQkJICBpbnN0YW5jZS0+Ci0JCQkJCQkJCSAgYWVuX2NtZCk7CisJCQkJCQkJCSAgYWVuX2NtZCwgMzApOwogCiAJCQlpZiAocmV0X3ZhbCkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGYWlsZWQgdG8gYWJvcnQgIgpAQCAtNDE2MCw2ICs0NTY3LDcgQEAKIAogCS8qIEZ1c2lvbiBvbmx5IHN1cHBvcnRzIGhvc3QgcmVzZXQgKi8KIAlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9QTEFTTUEpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKSB7CiAJCWhvc3QtPmhvc3R0LT5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IE5VTEw7CkBAIC00MTk3LDYgKzQ2MDUsMTkgQEAKIAkJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkgIT0gMCkKIAkJCWdvdG8gZmFpbF9zZXRfZG1hX21hc2s7CiAJfQorCS8qCisJICogRW5zdXJlIHRoYXQgYWxsIGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIGluIDMyLWJpdAorCSAqIG1lbW9yeS4KKwkgKi8KKwlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpICE9IDApIHsKKwkJLyogVHJ5IDMyYml0IERNQSBtYXNrIGFuZCAzMiBiaXQgQ29uc2lzdGVudCBkbWEgbWFzayAqLworCQlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkKKwkJCSYmICFwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkpCisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAic2V0IDMyYml0IERNQSBtYXNrIgorCQkJCSJhbmQgMzIgYml0IGNvbnNpc3RlbnQgbWFza1xuIik7CisJCWVsc2UKKwkJCWdvdG8gZmFpbF9zZXRfZG1hX21hc2s7CisJfQogCiAJcmV0dXJuIDA7CiAKQEAgLTQyMTIsNyArNDYzMyw3IEBACiBzdGF0aWMgaW50IG1lZ2FzYXNfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0JaW50IHJ2YWwsIHBvcywgaSwgajsKKwlpbnQgcnZhbCwgcG9zLCBpLCBqLCBjcHU7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CiAJdTE2IGNvbnRyb2wgPSAwOwpAQCAtNDI3Miw2ICs0NjkzLDcgQEAKIAogCXN3aXRjaCAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OOgorCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfUExBU01BOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUjoKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlk6CiAJewpAQCAtNDM2OCw2ICs0NzkwLDcgQEAKIAlpbnN0YW5jZS0+VW5ldmVuU3BhblN1cHBvcnQgPSAwOwogCiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfUExBU01BKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZKSkKIAkJSU5JVF9XT1JLKCZpbnN0YW5jZS0+d29ya19pbml0LCBtZWdhc2FzX2Z1c2lvbl9vY3Jfd3EpOwpAQCAtNDM4MCwxMiArNDgwMywzMyBAQAogCWlmIChtZWdhc2FzX2luaXRfZncoaW5zdGFuY2UpKQogCQlnb3RvIGZhaWxfaW5pdF9tZmk7CiAKKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKSB7CisJCWlmIChpbnN0YW5jZS0+UGxhc21hRlcxMTEpIHsKKwkJCWluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEgPQorCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKSwKKwkJCQkJCSAgICAgJmluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTFfaCk7CisJCQlpZiAoIWluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl8xMTEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogQ2FuJ3QgYWxsb2NhdGUgIgorCQkJCSAgICAgICAibWVtb3J5IGZvciBWRiBhZmZpbGlhdGlvbiBidWZmZXJcbiIpOworCQl9IGVsc2UgeworCQkJaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJCQkJICAgICAoTUFYX0xPR0lDQUxfRFJJVkVTICsgMSkgKgorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IE1SX0xEX1ZGX0FGRklMSUFUSU9OKSwKKwkJCQkJCSAgICAgJmluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl9oKTsKKwkJCWlmICghaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IENhbid0IGFsbG9jYXRlICIKKwkJCQkgICAgICAgIm1lbW9yeSBmb3IgVkYgYWZmaWxpYXRpb24gYnVmZmVyXG4iKTsKKwkJfQorCX0KKwogcmV0cnlfaXJxX3JlZ2lzdGVyOgogCS8qCiAJICogUmVnaXN0ZXIgSVJRCiAJICovCiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpIHsKLQkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKKwkJY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOworCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKSB7CiAJCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0uaW5zdGFuY2UgPSBpbnN0YW5jZTsKIAkJCWluc3RhbmNlLT5pcnFfY29udGV4dFtpXS5NU0l4SW5kZXggPSBpOwogCQkJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLApAQCAtNDM5NCwxNCArNDgzOCwyMiBAQAogCQkJCQkmaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldKSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGYWlsZWQgdG8gIgogCQkJCSAgICAgICAicmVnaXN0ZXIgSVJRIGZvciB2ZWN0b3IgJWQuXG4iLCBpKTsKLQkJCQlmb3IgKGogPSAwIDsgaiA8IGkgOyBqKyspCisJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2pdLnZlY3RvciwgTlVMTCk7CiAJCQkJCWZyZWVfaXJxKAogCQkJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtqXS52ZWN0b3IsCiAJCQkJCQkmaW5zdGFuY2UtPmlycV9jb250ZXh0W2pdKTsKKwkJCQl9CiAJCQkJLyogUmV0cnkgaXJxIHJlZ2lzdGVyIGZvciBJT19BUElDICovCiAJCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IDA7CiAJCQkJZ290byByZXRyeV9pcnFfcmVnaXN0ZXI7CiAJCQl9CisJCQlpZiAoaXJxX3NldF9hZmZpbml0eV9oaW50KGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLAorCQkJCWdldF9jcHVfbWFzayhjcHUpKSkKKwkJCQlkZXZfZXJyKCZpbnN0YW5jZS0+cGRldi0+ZGV2LCAiRXJyb3Igc2V0dGluZyIKKwkJCQkJImFmZmluaXR5IGhpbnQgZm9yIGNwdSAlZFxuIiwgY3B1KTsKKwkJCWNwdSA9IGNwdW1hc2tfbmV4dChjcHUsIGNwdV9vbmxpbmVfbWFzayk7CiAJCX0KIAl9IGVsc2UgewogCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0uaW5zdGFuY2UgPSBpbnN0YW5jZTsKQEAgLTQ0NTUsMTMgKzQ5MDcsMTcgQEAKIAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZSk7CiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCi0JCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKSB7CisJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsIE5VTEwpOwogCQkJZnJlZV9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCiAJCQkJICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pOworCQl9CiAJZWxzZQogCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKIGZhaWxfaXJxOgogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQSkgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgfHwKIAkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpCiAJCW1lZ2FzYXNfcmVsZWFzZV9mdXNpb24oaW5zdGFuY2UpOwpAQCAtNDUyMiw3ICs0OTc4LDkgQEAKIAlkY21kLT5vcGNvZGUgPSBjcHVfdG9fbGUzMihNUl9EQ01EX0NUUkxfQ0FDSEVfRkxVU0gpOwogCWRjbWQtPm1ib3guYlswXSA9IE1SX0ZMVVNIX0NUUkxfQ0FDSEUgfCBNUl9GTFVTSF9ESVNLX0NBQ0hFOwogCi0JbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kKTsKKwlpZiAobWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kLCAzMCkpCisJCWRldl9lcnIoJmluc3RhbmNlLT5wZGV2LT5kZXYsICJDb21tYW5kIHRpbWVkb3V0IgorCQkJIiBmcm9tICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7CiAKQEAgLTQ1NDksMTAgKzUwMDcsMTEgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGluc3RhbmNlLT5hZW5fY21kKQotCQltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfYWJvcnRfY21kKGluc3RhbmNlLCBpbnN0YW5jZS0+YWVuX2NtZCk7CisJCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9hYm9ydF9jbWQoaW5zdGFuY2UsCisJCQlpbnN0YW5jZS0+YWVuX2NtZCwgMzApOwogCWlmIChpbnN0YW5jZS0+bWFwX3VwZGF0ZV9jbWQpCiAJCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9hYm9ydF9jbWQoaW5zdGFuY2UsCi0JCQkJCQlpbnN0YW5jZS0+bWFwX3VwZGF0ZV9jbWQpOworCQkJaW5zdGFuY2UtPm1hcF91cGRhdGVfY21kLCAzMCk7CiAJZGNtZCA9ICZjbWQtPmZyYW1lLT5kY21kOwogCiAJbWVtc2V0KGRjbWQtPm1ib3guYiwgMCwgTUZJX01CT1hfU0laRSk7CkBAIC00NTY2LDcgKzUwMjUsOSBAQAogCWRjbWQtPmRhdGFfeGZlcl9sZW4gPSAwOwogCWRjbWQtPm9wY29kZSA9IGNwdV90b19sZTMyKG9wY29kZSk7CiAKLQltZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQpOworCWlmIChtZWdhc2FzX2lzc3VlX2Jsb2NrZWRfY21kKGluc3RhbmNlLCBjbWQsIDMwKSkKKwkJZGV2X2VycigmaW5zdGFuY2UtPnBkZXYtPmRldiwgIkNvbW1hbmQgdGltZWRvdXQiCisJCQkiZnJvbSAlc1xuIiwgX19mdW5jX18pOwogCiAJbWVnYXNhc19yZXR1cm5fY21kKGluc3RhbmNlLCBjbWQpOwogCkBAIC00NTkwLDYgKzUwNTEsMTAgQEAKIAlob3N0ID0gaW5zdGFuY2UtPmhvc3Q7CiAJaW5zdGFuY2UtPnVubG9hZCA9IDE7CiAKKwkvKiBTaHV0ZG93biBTUi1JT1YgaGVhcnRiZWF0IHRpbWVyICovCisJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJiAhaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCkKKwkJZGVsX3RpbWVyX3N5bmMoJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIpOworCiAJbWVnYXNhc19mbHVzaF9jYWNoZShpbnN0YW5jZSk7CiAJbWVnYXNhc19zaHV0ZG93bl9jb250cm9sbGVyKGluc3RhbmNlLCBNUl9EQ01EX0hJQkVSTkFURV9TSFVURE9XTik7CiAKQEAgLTQ2MDYsOSArNTA3MSwxMiBAQAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZSk7CiAKIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKLQkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKKwkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwgTlVMTCk7CiAJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKIAkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJCX0KIAllbHNlCiAJCWZyZWVfaXJxKGluc3RhbmNlLT5wZGV2LT5pcnEsICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0pOwogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQpAQCAtNDYyOSw3ICs1MDk3LDcgQEAKIHN0YXRpYyBpbnQKIG1lZ2FzYXNfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWludCBydmFsLCBpLCBqOworCWludCBydmFsLCBpLCBqLCBjcHU7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CiAKQEAgLTQ2NzMsNiArNTE0MSw3IEBACiAKIAlzd2l0Y2ggKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX1BMQVNNQToKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVI6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVJZOgogCXsKQEAgLTQ3MDEsNiArNTE3MCw3IEBACiAJICogUmVnaXN0ZXIgSVJRCiAJICovCiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpIHsKKwkJY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwogCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgewogCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLmluc3RhbmNlID0gaW5zdGFuY2U7CiAJCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0uTVNJeEluZGV4ID0gaTsKQEAgLTQ3MTAsMTIgKzUxODAsMjEgQEAKIAkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSkpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRmFpbGVkIHRvICIKIAkJCQkgICAgICAgInJlZ2lzdGVyIElSUSBmb3IgdmVjdG9yICVkLlxuIiwgaSk7Ci0JCQkJZm9yIChqID0gMCA7IGogPCBpIDsgaisrKQorCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtqXS52ZWN0b3IsIE5VTEwpOwogCQkJCQlmcmVlX2lycSgKIAkJCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbal0udmVjdG9yLAogCQkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtqXSk7CisJCQkJfQogCQkJCWdvdG8gZmFpbF9pcnE7CiAJCQl9CisKKwkJCWlmIChpcnFfc2V0X2FmZmluaXR5X2hpbnQoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCisJCQkJZ2V0X2NwdV9tYXNrKGNwdSkpKQorCQkJCWRldl9lcnIoJmluc3RhbmNlLT5wZGV2LT5kZXYsICJFcnJvciBzZXR0aW5nIgorCQkJCQkiYWZmaW5pdHkgaGludCBmb3IgY3B1ICVkXG4iLCBjcHUpOworCQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1X29ubGluZV9tYXNrKTsKIAkJfQogCX0gZWxzZSB7CiAJCWluc3RhbmNlLT5pcnFfY29udGV4dFswXS5pbnN0YW5jZSA9IGluc3RhbmNlOwpAQCAtNDcyOCw2ICs1MjA3LDE3IEBACiAJCX0KIAl9CiAKKwkvKiBSZS1sYXVuY2ggU1ItSU9WIGhlYXJ0YmVhdCB0aW1lciAqLworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpIHsKKwkJaWYgKCFtZWdhc2FzX3NyaW92X3N0YXJ0X2hlYXJ0YmVhdChpbnN0YW5jZSwgMCkpCisJCQltZWdhc2FzX3N0YXJ0X3RpbWVyKGluc3RhbmNlLAorCQkJCQkgICAgJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIsCisJCQkJCSAgICBtZWdhc2FzX3NyaW92X2hlYXJ0YmVhdF9oYW5kbGVyLAorCQkJCQkgICAgTUVHQVNBU19TUklPVl9IRUFSVEJFQVRfSU5URVJWQUxfVkYpOworCQllbHNlCisJCQlpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsID0gMTsKKwl9CisKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihpbnN0YW5jZSk7CiAJaW5zdGFuY2UtPnVubG9hZCA9IDA7CiAKQEAgLTQ3ODIsNiArNTI3MiwxMCBAQAogCWhvc3QgPSBpbnN0YW5jZS0+aG9zdDsKIAlmdXNpb24gPSBpbnN0YW5jZS0+Y3RybF9jb250ZXh0OwogCisJLyogU2h1dGRvd24gU1ItSU9WIGhlYXJ0YmVhdCB0aW1lciAqLworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYgIWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwpCisJCWRlbF90aW1lcl9zeW5jKCZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyKTsKKwogCXNjc2lfcmVtb3ZlX2hvc3QoaW5zdGFuY2UtPmhvc3QpOwogCW1lZ2FzYXNfZmx1c2hfY2FjaGUoaW5zdGFuY2UpOwogCW1lZ2FzYXNfc2h1dGRvd25fY29udHJvbGxlcihpbnN0YW5jZSwgTVJfRENNRF9DVFJMX1NIVVRET1dOKTsKQEAgLTQ3OTMsNiArNTI4Nyw5IEBACiAJCWluc3RhbmNlLT5ldiA9IE5VTEw7CiAJfQogCisJLyogY2FuY2VsIGFsbCB3YWl0IGV2ZW50cyAqLworCXdha2VfdXBfYWxsKCZpbnN0YW5jZS0+aW50X2NtZF93YWl0X3EpOworCiAJdGFza2xldF9raWxsKCZpbnN0YW5jZS0+aXNyX3Rhc2tsZXQpOwogCiAJLyoKQEAgLTQ4MTEsOSArNTMwOCwxMiBAQAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZSk7CiAKIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKLQkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKKwkJCWlycV9zZXRfYWZmaW5pdHlfaGludCgKKwkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwgTlVMTCk7CiAJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKIAkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJCX0KIAllbHNlCiAJCWZyZWVfaXJxKGluc3RhbmNlLT5wZGV2LT5pcnEsICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0pOwogCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQpAQCAtNDgyMSw2ICs1MzIxLDcgQEAKIAogCXN3aXRjaCAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OOgorCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfUExBU01BOgogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUjoKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlk6CiAJCW1lZ2FzYXNfcmVsZWFzZV9mdXNpb24oaW5zdGFuY2UpOwpAQCAtNDg0Nyw2ICs1MzQ4LDI0IEBACiAJaWYgKGluc3RhbmNlLT5ldnRfZGV0YWlsKQogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgbWVnYXNhc19ldnRfZGV0YWlsKSwKIAkJCQlpbnN0YW5jZS0+ZXZ0X2RldGFpbCwgaW5zdGFuY2UtPmV2dF9kZXRhaWxfaCk7CisKKwlpZiAoaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIChNQVhfTE9HSUNBTF9EUklWRVMgKyAxKSAqCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT04pLAorCQkJCSAgICBpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb24sCisJCQkJICAgIGluc3RhbmNlLT52Zl9hZmZpbGlhdGlvbl9oKTsKKworCWlmIChpbnN0YW5jZS0+dmZfYWZmaWxpYXRpb25fMTExKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgTVJfTERfVkZfQUZGSUxJQVRJT05fMTExKSwKKwkJCQkgICAgaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMSwKKwkJCQkgICAgaW5zdGFuY2UtPnZmX2FmZmlsaWF0aW9uXzExMV9oKTsKKworCWlmIChpbnN0YW5jZS0+aGJfaG9zdF9tZW0pCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBNUl9DVFJMX0hCX0hPU1RfTUVNKSwKKwkJCQkgICAgaW5zdGFuY2UtPmhiX2hvc3RfbWVtLAorCQkJCSAgICBpbnN0YW5jZS0+aGJfaG9zdF9tZW1faCk7CisKIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpAQCAtNDg2OCw5ICs1Mzg3LDEyIEBACiAJbWVnYXNhc19zaHV0ZG93bl9jb250cm9sbGVyKGluc3RhbmNlLCBNUl9EQ01EX0NUUkxfU0hVVERPV04pOwogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZSk7CiAJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCi0JCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKSB7CisJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsIE5VTEwpOwogCQkJZnJlZV9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCiAJCQkJICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pOworCQl9CiAJZWxzZQogCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKIAlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKQEAgLTUwNDUsNyArNTU2Nyw3IEBACiAJICogY21kIHRvIHRoZSBTQ1NJIG1pZC1sYXllcgogCSAqLwogCWNtZC0+c3luY19jbWQgPSAxOwotCW1lZ2FzYXNfaXNzdWVfYmxvY2tlZF9jbWQoaW5zdGFuY2UsIGNtZCk7CisJbWVnYXNhc19pc3N1ZV9ibG9ja2VkX2NtZChpbnN0YW5jZSwgY21kLCAwKTsKIAljbWQtPnN5bmNfY21kID0gMDsKIAogCS8qCkBAIC01MTMyLDYgKzU2NTQsMTYgQEAKIAkJZ290byBvdXRfa2ZyZWVfaW9jOwogCX0KIAorCS8qIEFkanVzdCBpb2N0bCB3YWl0IHRpbWUgZm9yIFZGIG1vZGUgKi8KKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKQorCQl3YWl0X3RpbWUgPSBNRUdBU0FTX1JPVVRJTkVfV0FJVF9USU1FX1ZGOworCisJLyogQmxvY2sgaW9jdGxzIGluIFZGIG1vZGUgKi8KKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmICFhbGxvd192Zl9pb2N0bHMpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIG91dF9rZnJlZV9pb2M7CisJfQorCiAJaWYgKGluc3RhbmNlLT5hZHByZWNvdmVyeSA9PSBNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ29udHJvbGxlciBpbiBjcml0IGVycm9yXG4iKTsKIAkJZXJyb3IgPSAtRU5PREVWOwpAQCAtNTQ0MSw3ICs1OTczLDcgQEAKIAl1MTYgICAgIHBkX2luZGV4ID0gMDsKIAl1MTYJbGRfaW5kZXggPSAwOwogCWludCAgICAgaSwgaiwgZG9zY2FuID0gMDsKLQl1MzIgc2VxX251bTsKKwl1MzIgc2VxX251bSwgd2FpdF90aW1lID0gTUVHQVNBU19SRVNFVF9XQUlUX1RJTUU7CiAJaW50IGVycm9yOwogCiAJaWYgKCFpbnN0YW5jZSkgewpAQCAtNTQ0OSw2ICs1OTgxLDIzIEBACiAJCWtmcmVlKGV2KTsKIAkJcmV0dXJuOwogCX0KKworCS8qIEFkanVzdCBldmVudCB3b3JrcXVldWUgdGhyZWFkIHdhaXQgdGltZSBmb3IgVkYgbW9kZSAqLworCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQpCisJCXdhaXRfdGltZSA9IE1FR0FTQVNfUk9VVElORV9XQUlUX1RJTUVfVkY7CisKKwkvKiBEb24ndCBydW4gdGhlIGV2ZW50IHdvcmtxdWV1ZSB0aHJlYWQgaWYgT0NSIGlzIHJ1bm5pbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd2FpdF90aW1lOyBpKyspIHsKKwkJaWYgKGluc3RhbmNlLT5hZHByZWNvdmVyeSA9PSBNRUdBU0FTX0hCQV9PUEVSQVRJT05BTCkKKwkJCWJyZWFrOworCQlpZiAoIShpICUgTUVHQVNBU19SRVNFVF9OT1RJQ0VfSU5URVJWQUwpKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1lZ2FzYXM6ICVzIHdhaXRpbmcgZm9yICIKKwkJCSAgICAgICAiY29udHJvbGxlciByZXNldCB0byBmaW5pc2ggZm9yIHNjc2klZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQl9CisJCW1zbGVlcCgxMDAwKTsKKwl9CisKIAlpbnN0YW5jZS0+ZXYgPSBOVUxMOwogCWhvc3QgPSBpbnN0YW5jZS0+aG9zdDsKIAlpZiAoaW5zdGFuY2UtPmV2dF9kZXRhaWwpIHsKQEAgLTU1MTUsNjUgKzYwNjQsNjQgQEAKIAkJY2FzZSBNUl9FVlRfTERfT0ZGTElORToKIAkJY2FzZSBNUl9FVlRfQ0ZHX0NMRUFSRUQ6CiAJCWNhc2UgTVJfRVZUX0xEX0RFTEVURUQ6Ci0JCQlpZiAobWVnYXNhc19sZF9saXN0X3F1ZXJ5KGluc3RhbmNlLAotCQkJCQlNUl9MRF9RVUVSWV9UWVBFX0VYUE9TRURfVE9fSE9TVCkpCi0JCQkJbWVnYXNhc19nZXRfbGRfbGlzdChpbnN0YW5jZSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfTERfQ0hBTk5FTFM7IGkrKykgewotCQkJCWZvciAoaiA9IDA7Ci0JCQkJaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsKLQkJCQlqKyspIHsKKwkJCWlmICghaW5zdGFuY2UtPnJlcXVlc3RvcklkIHx8CisJCQkgICAgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJgorCQkJICAgICBtZWdhc2FzX2dldF9sZF92Zl9hZmZpbGlhdGlvbihpbnN0YW5jZSwgMCkpKSB7CisJCQkJaWYgKG1lZ2FzYXNfbGRfbGlzdF9xdWVyeShpbnN0YW5jZSwKKwkJCQkJCQkgIE1SX0xEX1FVRVJZX1RZUEVfRVhQT1NFRF9UT19IT1NUKSkKKwkJCQkJbWVnYXNhc19nZXRfbGRfbGlzdChpbnN0YW5jZSk7CisJCQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX0xEX0NIQU5ORUxTOyBpKyspIHsKKwkJCQkJZm9yIChqID0gMDsKKwkJCQkJICAgICBqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOworCQkJCQkgICAgIGorKykgewogCi0JCQkJbGRfaW5kZXggPQotCQkJCShpICogTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKSArIGo7CisJCQkJCQlsZF9pbmRleCA9CisJCQkJCQkJKGkgKiBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwpICsgajsKIAotCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsCi0JCQkJCU1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwKLQkJCQkJaiwKLQkJCQkJMCk7CisJCQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LCBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksIGosIDApOwogCi0JCQkJaWYgKGluc3RhbmNlLT5sZF9pZHNbbGRfaW5kZXhdICE9IDB4ZmYpIHsKLQkJCQkJaWYgKHNkZXYxKSB7Ci0JCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHNkZXYxKSB7Ci0JCQkJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2RldjEpOwotCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkb3NjYW4gPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVJfRVZUX0xEX0NSRUFURUQ6Ci0JCQlpZiAobWVnYXNhc19sZF9saXN0X3F1ZXJ5KGluc3RhbmNlLAotCQkJCQlNUl9MRF9RVUVSWV9UWVBFX0VYUE9TRURfVE9fSE9TVCkpCi0JCQkJbWVnYXNhc19nZXRfbGRfbGlzdChpbnN0YW5jZSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfTERfQ0hBTk5FTFM7IGkrKykgewotCQkJCWZvciAoaiA9IDA7Ci0JCQkJCWogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7Ci0JCQkJCWorKykgewotCQkJCQlsZF9pbmRleCA9Ci0JCQkJCShpICogTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKSArIGo7Ci0KLQkJCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwKLQkJCQkJCU1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICsgaSwKLQkJCQkJCWosIDApOwotCi0JCQkJCWlmIChpbnN0YW5jZS0+bGRfaWRzW2xkX2luZGV4XSAhPQotCQkJCQkJCQkweGZmKSB7Ci0JCQkJCQlpZiAoIXNkZXYxKSB7Ci0JCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGhvc3QsCi0JCQkJCQlNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksCi0JCQkJCQkJCWosIDApOworCQkJCQkJaWYgKGluc3RhbmNlLT5sZF9pZHNbbGRfaW5kZXhdCisJCQkJCQkgICAgIT0gMHhmZikgeworCQkJCQkJCWlmIChzZGV2MSkKKwkJCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHNkZXYxKSB7CisJCQkJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2MSk7CisJCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCWlmIChzZGV2MSkgewotCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQl9CisJCQkJZG9zY2FuID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE1SX0VWVF9MRF9DUkVBVEVEOgorCQkJaWYgKCFpbnN0YW5jZS0+cmVxdWVzdG9ySWQgfHwKKwkJCSAgICAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmCisJCQkgICAgIG1lZ2FzYXNfZ2V0X2xkX3ZmX2FmZmlsaWF0aW9uKGluc3RhbmNlLCAwKSkpIHsKKwkJCQlpZiAobWVnYXNhc19sZF9saXN0X3F1ZXJ5KGluc3RhbmNlLAorCQkJCQkJCSAgTVJfTERfUVVFUllfVFlQRV9FWFBPU0VEX1RPX0hPU1QpKQorCQkJCQltZWdhc2FzX2dldF9sZF9saXN0KGluc3RhbmNlKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfTERfQ0hBTk5FTFM7IGkrKykgeworCQkJCQlmb3IgKGogPSAwOworCQkJCQkgICAgIGogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7CisJCQkJCSAgICAgaisrKSB7CisJCQkJCQlsZF9pbmRleCA9CisJCQkJCQkJKGkgKiBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwpICsgajsKKworCQkJCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLCBqLCAwKTsKKworCQkJCQkJaWYgKGluc3RhbmNlLT5sZF9pZHNbbGRfaW5kZXhdCisJCQkJCQkgICAgIT0gMHhmZikgeworCQkJCQkJCWlmICghc2RldjEpCisJCQkJCQkJCXNjc2lfYWRkX2RldmljZShob3N0LCBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksIGosIDApOworCQkJCQkJfQorCQkJCQkJaWYgKHNkZXYxKQorCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CiAJCQkJCX0KIAkJCQl9CisJCQkJZG9zY2FuID0gMDsKIAkJCX0KLQkJCWRvc2NhbiA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNUl9FVlRfQ1RSTF9IT1NUX0JVU19TQ0FOX1JFUVVFU1RFRDoKIAkJY2FzZSBNUl9FVlRfRk9SRUlHTl9DRkdfSU1QT1JURUQ6CkBAIC01NTkxLDUwICs2MTM5LDU1IEBACiAJfQogCiAJaWYgKGRvc2NhbikgewotCQlwcmludGsoS0VSTl9JTkZPICJzY2FubmluZyAuLi5cbiIpOwotCQltZWdhc2FzX2dldF9wZF9saXN0KGluc3RhbmNlKTsKLQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTOyBpKyspIHsKLQkJCWZvciAoaiA9IDA7IGogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7IGorKykgewotCQkJCXBkX2luZGV4ID0gaSpNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUwgKyBqOwotCQkJCXNkZXYxID0gc2NzaV9kZXZpY2VfbG9va3VwKGhvc3QsIGksIGosIDApOwotCQkJCWlmIChpbnN0YW5jZS0+cGRfbGlzdFtwZF9pbmRleF0uZHJpdmVTdGF0ZSA9PQotCQkJCQkJCU1SX1BEX1NUQVRFX1NZU1RFTSkgewotCQkJCQlpZiAoIXNkZXYxKSB7Ci0JCQkJCQlzY3NpX2FkZF9kZXZpY2UoaG9zdCwgaSwgaiwgMCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNkZXYxKQotCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoc2RldjEpIHsKLQkJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2MSk7Ci0JCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOworCQlwcmludGsoS0VSTl9JTkZPICJtZWdhcmFpZF9zYXM6IHNjYW5uaW5nIGZvciBzY3NpJWQuLi5cbiIsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CisJCWlmIChtZWdhc2FzX2dldF9wZF9saXN0KGluc3RhbmNlKSA9PSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFM7IGkrKykgeworCQkJCWZvciAoaiA9IDA7IGogPCBNRUdBU0FTX01BWF9ERVZfUEVSX0NIQU5ORUw7IGorKykgeworCQkJCQlwZF9pbmRleCA9IGkqTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMICsgajsKKwkJCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwgaSwgaiwgMCk7CisJCQkJCWlmIChpbnN0YW5jZS0+cGRfbGlzdFtwZF9pbmRleF0uZHJpdmVTdGF0ZSA9PQorCQkJCQkgICAgTVJfUERfU1RBVEVfU1lTVEVNKSB7CisJCQkJCQlpZiAoIXNkZXYxKSB7CisJCQkJCQkJc2NzaV9hZGRfZGV2aWNlKGhvc3QsIGksIGosIDApOworCQkJCQkJfQorCQkJCQkJaWYgKHNkZXYxKQorCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoc2RldjEpIHsKKwkJCQkJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2RldjEpOworCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KIAotCQlpZiAobWVnYXNhc19sZF9saXN0X3F1ZXJ5KGluc3RhbmNlLAotCQkJCQkgIE1SX0xEX1FVRVJZX1RZUEVfRVhQT1NFRF9UT19IT1NUKSkKLQkJCW1lZ2FzYXNfZ2V0X2xkX2xpc3QoaW5zdGFuY2UpOwotCQlmb3IgKGkgPSAwOyBpIDwgTUVHQVNBU19NQVhfTERfQ0hBTk5FTFM7IGkrKykgewotCQkJZm9yIChqID0gMDsgaiA8IE1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTDsgaisrKSB7Ci0JCQkJbGRfaW5kZXggPQotCQkJCShpICogTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKSArIGo7CisJCWlmICghaW5zdGFuY2UtPnJlcXVlc3RvcklkIHx8CisJCSAgICAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmCisJCSAgICAgbWVnYXNhc19nZXRfbGRfdmZfYWZmaWxpYXRpb24oaW5zdGFuY2UsIDApKSkgeworCQkJaWYgKG1lZ2FzYXNfbGRfbGlzdF9xdWVyeShpbnN0YW5jZSwKKwkJCQkJCSAgTVJfTERfUVVFUllfVFlQRV9FWFBPU0VEX1RPX0hPU1QpKQorCQkJCW1lZ2FzYXNfZ2V0X2xkX2xpc3QoaW5zdGFuY2UpOworCQkJZm9yIChpID0gMDsgaSA8IE1FR0FTQVNfTUFYX0xEX0NIQU5ORUxTOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMOworCQkJCSAgICAgaisrKSB7CisJCQkJCWxkX2luZGV4ID0KKwkJCQkJCShpICogTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKSArIGo7CiAKLQkJCQlzZGV2MSA9IHNjc2lfZGV2aWNlX2xvb2t1cChob3N0LAotCQkJCQlNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksIGosIDApOwotCQkJCWlmIChpbnN0YW5jZS0+bGRfaWRzW2xkX2luZGV4XSAhPSAweGZmKSB7Ci0JCQkJCWlmICghc2RldjEpIHsKLQkJCQkJCXNjc2lfYWRkX2RldmljZShob3N0LAotCQkJCQkJTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLAotCQkJCQkJCQlqLCAwKTsKKwkJCQkJc2RldjEgPSBzY3NpX2RldmljZV9sb29rdXAoaG9zdCwKKwkJCQkJCQkJICAgTUVHQVNBU19NQVhfUERfQ0hBTk5FTFMgKyBpLCBqLCAwKTsKKwkJCQkJaWYgKGluc3RhbmNlLT5sZF9pZHNbbGRfaW5kZXhdCisJCQkJCSAgICAhPSAweGZmKSB7CisJCQkJCQlpZiAoIXNkZXYxKQorCQkJCQkJCXNjc2lfYWRkX2RldmljZShob3N0LCBNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyArIGksIGosIDApOworCQkJCQkJZWxzZQorCQkJCQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2MSk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlzY3NpX2RldmljZV9wdXQoc2RldjEpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHNkZXYxKSB7Ci0JCQkJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2RldjEpOwotCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQkJCWlmIChzZGV2MSkgeworCQkJCQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2MSk7CisJCQkJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYxKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYwppbmRleCBlMjRiNmViLi4wODFiZmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jCkBAIC0xNDMsMTIgKzE0MywxMiBAQAogCiB1MTYgTVJfR2V0TERUZ3RJZCh1MzIgbGQsIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCkKIHsKLQlyZXR1cm4gbWFwLT5yYWlkTWFwLmxkU3Bhbk1hcFtsZF0ubGRSYWlkLnRhcmdldElkOworCXJldHVybiBsZTE2X3RvX2NwdShtYXAtPnJhaWRNYXAubGRTcGFuTWFwW2xkXS5sZFJhaWQudGFyZ2V0SWQpOwogfQogCi11MTYgTVJfVGFyZ2V0SWRUb0xkR2V0KHUzMiBsZFRndElkLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApCit1OCBNUl9UYXJnZXRJZFRvTGRHZXQodTMyIGxkVGd0SWQsIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCkKIHsKLQlyZXR1cm4gbGUxNl90b19jcHUobWFwLT5yYWlkTWFwLmxkVGd0SWRUb0xkW2xkVGd0SWRdKTsKKwlyZXR1cm4gbWFwLT5yYWlkTWFwLmxkVGd0SWRUb0xkW2xkVGd0SWRdOwogfQogCiBzdGF0aWMgc3RydWN0IE1SX0xEX1NQQU4gKk1SX0xkU3BhblB0ckdldCh1MzIgbGQsIHUzMiBzcGFuLApAQCAtOTc1LDcgKzk3NSwxMCBAQAogCQkJcmVnU2l6ZSArPSBzdHJpcFNpemU7CiAJfQogCi0JcFJBSURfQ29udGV4dC0+dGltZW91dFZhbHVlICAgICA9IGNwdV90b19sZTE2KG1hcC0+cmFpZE1hcC5mcFBkSW9UaW1lb3V0U2VjKTsKKwlwUkFJRF9Db250ZXh0LT50aW1lb3V0VmFsdWUgPQorCQljcHVfdG9fbGUxNihyYWlkLT5mcElvVGltZW91dEZvckxkID8KKwkJCSAgICByYWlkLT5mcElvVGltZW91dEZvckxkIDoKKwkJCSAgICBtYXAtPnJhaWRNYXAuZnBQZElvVGltZW91dFNlYyk7CiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHx8CiAJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVUlkpKQogCQlwUkFJRF9Db250ZXh0LT5yZWdMb2NrRmxhZ3MgPSAoaXNSZWFkKSA/CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYwppbmRleCBmNjU1NTkyLi4yMjYwMDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMKQEAgLTYyLDcgKzYyLDggQEAKIAkJICAgICBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCwgdTggYWx0X3N0YXR1cyk7CiBpbnQgbWVnYXNhc19pc19sZGlvKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBpbnQKLXdhaXRfYW5kX3BvbGwoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCk7Cit3YWl0X2FuZF9wb2xsKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQsCisJICAgICAgaW50IHNlY29uZHMpOwogCiB2b2lkCiBtZWdhc2FzX3JldHVybl9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCk7CkBAIC04MSw2ICs4MiwxMyBAQAogdm9pZCBtZWdhcmFpZF9zYXNfa2lsbF9oYmEoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKIAogZXh0ZXJuIHUzMiBtZWdhc2FzX2RiZ19sdmw7Cit2b2lkIG1lZ2FzYXNfc3Jpb3ZfaGVhcnRiZWF0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBpbnN0YW5jZV9hZGRyKTsKK2ludCBtZWdhc2FzX3NyaW92X3N0YXJ0X2hlYXJ0YmVhdChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkJICBpbnQgaW5pdGlhbCk7Cit2b2lkIG1lZ2FzYXNfc3RhcnRfdGltZXIoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAorCQkJIHZvaWQgKmZuLCB1bnNpZ25lZCBsb25nIGludGVydmFsKTsKK2V4dGVybiBzdHJ1Y3QgbWVnYXNhc19tZ210X2luZm8gbWVnYXNhc19tZ210X2luZm87CiBleHRlcm4gaW50IHJlc2V0d2FpdHRpbWU7CiAKIC8qKgpAQCAtNTQ5LDEyICs1NTcsMTMgQEAKICAqIEZvciBwb2xsaW5nLCBNRkkgcmVxdWlyZXMgdGhlIGNtZF9zdGF0dXMgdG8gYmUgc2V0IHRvIDB4RkYgYmVmb3JlIHBvc3RpbmcuCiAgKi8KIGludAotd2FpdF9hbmRfcG9sbChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQord2FpdF9hbmRfcG9sbChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLAorCWludCBzZWNvbmRzKQogewogCWludCBpOwogCXN0cnVjdCBtZWdhc2FzX2hlYWRlciAqZnJhbWVfaGRyID0gJmNtZC0+ZnJhbWUtPmhkcjsKIAotCXUzMiBtc2VjcyA9IE1GSV9QT0xMX1RJTUVPVVRfU0VDUyAqIDEwMDA7CisJdTMyIG1zZWNzID0gc2Vjb25kcyAqIDEwMDA7CiAKIAkvKgogCSAqIFdhaXQgZm9yIGNtZF9zdGF0dXMgdG8gY2hhbmdlCkBAIC01ODUsNyArNTk0LDcgQEAKIAlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZDsKIAl1OCByZXQ7CiAJc3RydWN0IGZ1c2lvbl9jb250ZXh0ICpmdXNpb247Ci0JdW5pb24gTUVHQVNBU19SRVFVRVNUX0RFU0NSSVBUT1JfVU5JT04gKnJlcV9kZXNjOworCXVuaW9uIE1FR0FTQVNfUkVRVUVTVF9ERVNDUklQVE9SX1VOSU9OIHJlcV9kZXNjOwogCWludCBpOwogCXN0cnVjdCBtZWdhc2FzX2hlYWRlciAqZnJhbWVfaGRyOwogCkBAIC02NDQsMTggKzY1MywxOCBAQAogCS8qIENvbnZlcnQgY2FwYWJpbGl0eSB0byBMRTMyICovCiAJY3B1X3RvX2xlMzJzKCh1MzIgKikmaW5pdF9mcmFtZS0+ZHJpdmVyX29wZXJhdGlvbnMubWZpX2NhcGFiaWxpdGllcyk7CiAKLQlpbml0X2ZyYW1lLT5xdWV1ZV9pbmZvX25ld19waHlzX2FkZHJfbG8gPSBjcHVfdG9fbGUzMigodTMyKWlvY19pbml0X2hhbmRsZSk7CisJaW5pdF9mcmFtZS0+cXVldWVfaW5mb19uZXdfcGh5c19hZGRyX2hpID0KKwkJY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhpb2NfaW5pdF9oYW5kbGUpKTsKKwlpbml0X2ZyYW1lLT5xdWV1ZV9pbmZvX25ld19waHlzX2FkZHJfbG8gPQorCQljcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKGlvY19pbml0X2hhbmRsZSkpOwogCWluaXRfZnJhbWUtPmRhdGFfeGZlcl9sZW4gPSBjcHVfdG9fbGUzMihzaXplb2Yoc3RydWN0IE1QSTJfSU9DX0lOSVRfUkVRVUVTVCkpOwogCi0JcmVxX2Rlc2MgPQotCSAgKHVuaW9uIE1FR0FTQVNfUkVRVUVTVF9ERVNDUklQVE9SX1VOSU9OICopZnVzaW9uLT5yZXFfZnJhbWVzX2Rlc2M7Ci0KLQlyZXFfZGVzYy0+V29yZHMgPSAwOwotCXJlcV9kZXNjLT5NRkFJby5SZXF1ZXN0RmxhZ3MgPQorCXJlcV9kZXNjLldvcmRzID0gMDsKKwlyZXFfZGVzYy5NRkFJby5SZXF1ZXN0RmxhZ3MgPQogCQkoTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfTUZBIDw8CiAJCSBNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19UWVBFX1NISUZUKTsKLQljcHVfdG9fbGUzMnMoKHUzMiAqKSZyZXFfZGVzYy0+TUZBSW8pOwotCXJlcV9kZXNjLT5Xb3JkcyB8PSBjcHVfdG9fbGU2NChjbWQtPmZyYW1lX3BoeXNfYWRkcik7CisJY3B1X3RvX2xlMzJzKCh1MzIgKikmcmVxX2Rlc2MuTUZBSW8pOworCXJlcV9kZXNjLldvcmRzIHw9IGNwdV90b19sZTY0KGNtZC0+ZnJhbWVfcGh5c19hZGRyKTsKIAogCS8qCiAJICogZGlzYWJsZSB0aGUgaW50ciBiZWZvcmUgZmlyaW5nIHRoZSBpbml0IGZyYW1lCkBAIC02NjksMTAgKzY3OCwxMCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaW5zdGFuY2UtPmluc3RhbmNldC0+ZmlyZV9jbWQoaW5zdGFuY2UsIHJlcV9kZXNjLT51LmxvdywKLQkJCQkgICAgICByZXFfZGVzYy0+dS5oaWdoLCBpbnN0YW5jZS0+cmVnX3NldCk7CisJaW5zdGFuY2UtPmluc3RhbmNldC0+ZmlyZV9jbWQoaW5zdGFuY2UsIHJlcV9kZXNjLnUubG93LAorCQkJCSAgICAgIHJlcV9kZXNjLnUuaGlnaCwgaW5zdGFuY2UtPnJlZ19zZXQpOwogCi0Jd2FpdF9hbmRfcG9sbChpbnN0YW5jZSwgY21kKTsKKwl3YWl0X2FuZF9wb2xsKGluc3RhbmNlLCBjbWQsIE1GSV9QT0xMX1RJTUVPVVRfU0VDUyk7CiAKIAlmcmFtZV9oZHIgPSAmY21kLT5mcmFtZS0+aGRyOwogCWlmIChmcmFtZV9oZHItPmNtZF9zdGF0dXMgIT0gMCkgewpAQCAtNzIzLDcgKzczMiw3IEBACiAKIAlpZiAoIWZ1c2lvbikgewogCQltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsIGNtZCk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVOWElPOwogCX0KIAogCWRjbWQgPSAmY21kLT5mcmFtZS0+ZGNtZDsKQEAgLTE2MDQsMTMgKzE2MTMsMTUgQEAKIAkJCU1SX1JBSURfQ1RYX1JBSURfRkxBR1NfSU9fU1VCX1RZUEVfU0hJRlQ7CiAJCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB8fAogCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVSWSkpCi0JCQlpb19yZXF1ZXN0LT5Jb0ZsYWdzIHw9Ci0JCQkJTVBJMjVfU0FTX0RFVklDRTBfRkxBR1NfRU5BQkxFRF9GQVNUX1BBVEg7CisJCQlpb19yZXF1ZXN0LT5Jb0ZsYWdzIHw9IGNwdV90b19sZTE2KAorCQkJCU1QSTI1X1NBU19ERVZJQ0UwX0ZMQUdTX0VOQUJMRURfRkFTVF9QQVRIKTsKIAkJY21kLT5yZXF1ZXN0X2Rlc2MtPlNDU0lJTy5SZXF1ZXN0RmxhZ3MgPQogCQkJKE1QSTJfUkVRX0RFU0NSSVBUX0ZMQUdTX0hJR0hfUFJJT1JJVFkgPDwKIAkJCSBNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19UWVBFX1NISUZUKTsKIAkJY21kLT5yZXF1ZXN0X2Rlc2MtPlNDU0lJTy5EZXZIYW5kbGUgPQogCQkJbG9jYWxfbWFwX3B0ci0+cmFpZE1hcC5kZXZIbmRsSW5mb1tkZXZpY2VfaWRdLmN1ckRldkhkbDsKKwkJY21kLT5yZXF1ZXN0X2Rlc2MtPlNDU0lJTy5NU0l4SW5kZXggPQorCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA/IHNtcF9wcm9jZXNzb3JfaWQoKSAlIGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgOiAwOwogCQkvKgogCQkgKiBJZiB0aGUgY29tbWFuZCBpcyBmb3IgdGhlIHRhcGUgZGV2aWNlLCBzZXQgdGhlCiAJCSAqIEZQIHRpbWVvdXQgdG8gdGhlIG9zIGxheWVyIHRpbWVvdXQgdmFsdWUuCkBAIC0xNzcwLDcgKzE3ODEsOCBAQAogCiAJaWYgKGluZGV4ID49IGluc3RhbmNlLT5tYXhfZndfY21kcykgewogCQlwcmludGsoS0VSTl9FUlIgIm1lZ2FzYXM6IEludmFsaWQgU01JRCAoMHgleClyZXF1ZXN0IGZvciAiCi0JCSAgICAgICAiZGVzY3JpcHRvclxuIiwgaW5kZXgpOworCQkgICAgICAgImRlc2NyaXB0b3IgZm9yIHNjc2klZFxuIiwgaW5kZXgsCisJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlmdXNpb24gPSBpbnN0YW5jZS0+Y3RybF9jb250ZXh0OwpAQCAtMjAzOCw4ICsyMDUwLDExIEBACiAJCS8qIElmIHdlIGRpZG4ndCBjb21wbGV0ZSBhbnkgY29tbWFuZHMsIGNoZWNrIGZvciBGVyBmYXVsdCAqLwogCQlmd19zdGF0ZSA9IGluc3RhbmNlLT5pbnN0YW5jZXQtPnJlYWRfZndfc3RhdHVzX3JlZygKIAkJCWluc3RhbmNlLT5yZWdfc2V0KSAmIE1GSV9TVEFURV9NQVNLOwotCQlpZiAoZndfc3RhdGUgPT0gTUZJX1NUQVRFX0ZBVUxUKQorCQlpZiAoZndfc3RhdGUgPT0gTUZJX1NUQVRFX0ZBVUxUKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IElvcDJTeXNEb29yYmVsbEludCIKKwkJCSAgICAgICAiZm9yIHNjc2klZFxuIiwgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJc2NoZWR1bGVfd29yaygmaW5zdGFuY2UtPndvcmtfaW5pdCk7CisJCX0KIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0yMjEwLDkgKzIyMjUsMTAgQEAKIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3Igb3V0c3RhbmRpbmcgY29tbWFuZHMgb24gZnVzaW9uIHRvIGNvbXBsZXRlICovCi1pbnQgbWVnYXNhc193YWl0X2Zvcl9vdXRzdGFuZGluZ19mdXNpb24oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKQoraW50IG1lZ2FzYXNfd2FpdF9mb3Jfb3V0c3RhbmRpbmdfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCQkJaW50IGlvdGltZW91dCwgaW50ICpjb252ZXJ0KQogewotCWludCBpLCBvdXRzdGFuZGluZywgcmV0dmFsID0gMDsKKwlpbnQgaSwgb3V0c3RhbmRpbmcsIHJldHZhbCA9IDAsIGhiX3NlY29uZHNfbWlzc2VkID0gMDsKIAl1MzIgZndfc3RhdGU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmVzZXR3YWl0dGltZTsgaSsrKSB7CkBAIC0yMjIxLDEwICsyMjM3LDQwIEBACiAJCQlpbnN0YW5jZS0+cmVnX3NldCkgJiBNRklfU1RBVEVfTUFTSzsKIAkJaWYgKGZ3X3N0YXRlID09IE1GSV9TVEFURV9GQVVMVCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogRm91bmQgRlcgaW4gRkFVTFQgc3RhdGUsIgotCQkJICAgICAgICIgd2lsbCByZXNldCBhZGFwdGVyLlxuIik7CisJCQkgICAgICAgIiB3aWxsIHJlc2V0IGFkYXB0ZXIgc2NzaSVkLlxuIiwKKwkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQlyZXR2YWwgPSAxOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJLyogSWYgU1ItSU9WIFZGIG1vZGUgJiBoZWFydGJlYXQgdGltZW91dCwgZG9uJ3Qgd2FpdCAqLworCQlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmICFpb3RpbWVvdXQpIHsKKwkJCXJldHZhbCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIElmIFNSLUlPViBWRiBtb2RlICYgSS9PIHRpbWVvdXQsIGNoZWNrIGZvciBIQiB0aW1lb3V0ICovCisJCWlmIChpbnN0YW5jZS0+cmVxdWVzdG9ySWQgJiYgaW90aW1lb3V0KSB7CisJCQlpZiAoaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5md0NvdW50ZXIgIT0KKwkJCSAgICBpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmRyaXZlckNvdW50ZXIpIHsKKwkJCQlpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmRyaXZlckNvdW50ZXIgPQorCQkJCQlpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmZ3Q291bnRlcjsKKwkJCQloYl9zZWNvbmRzX21pc3NlZCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWhiX3NlY29uZHNfbWlzc2VkKys7CisJCQkJaWYgKGhiX3NlY29uZHNfbWlzc2VkID09CisJCQkJICAgIChNRUdBU0FTX1NSSU9WX0hFQVJUQkVBVF9JTlRFUlZBTF9WRi9IWikpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiIKKwkJCQkJICAgICAgICIgSGVhcnRiZWF0IG5ldmVyIGNvbXBsZXRlZCAiCisJCQkJCSAgICAgICAiIHdoaWxlIHBvbGxpbmcgZHVyaW5nIEkvTyAiCisJCQkJCSAgICAgICAiIHRpbWVvdXQgaGFuZGxpbmcgZm9yICIKKwkJCQkJICAgICAgICJzY3NpJWQuXG4iLAorCQkJCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJCQkgICAgICAgKmNvbnZlcnQgPSAxOworCQkJCQkgICAgICAgcmV0dmFsID0gMTsKKwkJCQkJICAgICAgIGdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQogCiAJCW91dHN0YW5kaW5nID0gYXRvbWljX3JlYWQoJmluc3RhbmNlLT5md19vdXRzdGFuZGluZyk7CiAJCWlmICghb3V0c3RhbmRpbmcpCkBAIC0yMjMyLDcgKzIyNzgsOCBAQAogCiAJCWlmICghKGkgJSBNRUdBU0FTX1JFU0VUX05PVElDRV9JTlRFUlZBTCkpIHsKIAkJCXByaW50ayhLRVJOX05PVElDRSAibWVnYXNhczogWyUyZF13YWl0aW5nIGZvciAlZCAiCi0JCQkgICAgICAgImNvbW1hbmRzIHRvIGNvbXBsZXRlXG4iLCBpLCBvdXRzdGFuZGluZyk7CisJCQkgICAgICAgImNvbW1hbmRzIHRvIGNvbXBsZXRlIGZvciBzY3NpJWRcbiIsIGksCisJCQkgICAgICAgb3V0c3RhbmRpbmcsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCW1lZ2FzYXNfY29tcGxldGVfY21kX2RwY19mdXNpb24oCiAJCQkJKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UpOwogCQl9CkBAIC0yMjQxLDcgKzIyODgsOCBAQAogCiAJaWYgKGF0b21pY19yZWFkKCZpbnN0YW5jZS0+Zndfb3V0c3RhbmRpbmcpKSB7CiAJCXByaW50aygibWVnYXJhaWRfc2FzOiBwZW5kaW5nIGNvbW1hbmRzIHJlbWFpbiBhZnRlciB3YWl0aW5nLCAiCi0JCSAgICAgICAid2lsbCByZXNldCBhZGFwdGVyLlxuIik7CisJCSAgICAgICAid2lsbCByZXNldCBhZGFwdGVyIHNjc2klZC5cbiIsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCXJldHZhbCA9IDE7CiAJfQogb3V0OgpAQCAtMjI2MywxMCArMjMxMSwzNCBAQAogCQlyZXBseV9kZXNjLT5Xb3JkcyA9IFVMTE9OR19NQVg7CiB9CiAKLS8qIENvcmUgZnVzaW9uIHJlc2V0IGZ1bmN0aW9uICovCi1pbnQgbWVnYXNhc19yZXNldF9mdXNpb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCisvKiBDaGVjayBmb3IgYSBzZWNvbmQgcGF0aCB0aGF0IGlzIGN1cnJlbnRseSBVUCAqLworaW50IG1lZ2FzYXNfY2hlY2tfbXBpb19wYXRocyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKIHsKLQlpbnQgcmV0dmFsID0gU1VDQ0VTUywgaSwgaiwgcmV0cnkgPSAwOworCWludCBpLCBqLCByZXR2YWwgPSAoRElEX1JFU0VUIDw8IDE2KTsKKworCWlmIChpbnN0YW5jZS0+bXBpbyAmJiBpbnN0YW5jZS0+cmVxdWVzdG9ySWQpIHsKKwkJZm9yIChpID0gMCA7IGkgPCBNQVhfTUdNVF9BREFQVEVSUyA7IGkrKykKKwkJCWZvciAoaiA9IDAgOyBqIDwgTUFYX0xPR0lDQUxfRFJJVkVTOyBqKyspCisJCQkJaWYgKG1lZ2FzYXNfbWdtdF9pbmZvLmluc3RhbmNlW2ldICYmCisJCQkJICAgIChtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXSAhPSBpbnN0YW5jZSkgJiYKKwkJCQkgICAgbWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV0tPm1waW8gJiYKKwkJCQkgICAgbWVnYXNhc19tZ210X2luZm8uaW5zdGFuY2VbaV0tPnJlcXVlc3RvcklkCisJCQkJICAgICYmCisJCQkJICAgIChtZWdhc2FzX21nbXRfaW5mby5pbnN0YW5jZVtpXS0+bGRfaWRzW2pdCisJCQkJICAgICA9PSBzY21kLT5kZXZpY2UtPmlkKSkgeworCQkJCQkgICAgcmV0dmFsID0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJCQkJICAgIGdvdG8gb3V0OworCQkJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogQ29yZSBmdXNpb24gcmVzZXQgZnVuY3Rpb24gKi8KK2ludCBtZWdhc2FzX3Jlc2V0X2Z1c2lvbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IGlvdGltZW91dCkKK3sKKwlpbnQgcmV0dmFsID0gU1VDQ0VTUywgaSwgaiwgcmV0cnkgPSAwLCBjb252ZXJ0ID0gMDsKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CiAJc3RydWN0IG1lZ2FzYXNfY21kX2Z1c2lvbiAqY21kX2Z1c2lvbjsKIAlzdHJ1Y3QgZnVzaW9uX2NvbnRleHQgKmZ1c2lvbjsKQEAgLTIyNzcsMjggKzIzNDksMzkgQEAKIAlpbnN0YW5jZSA9IChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqKXNob3N0LT5ob3N0ZGF0YTsKIAlmdXNpb24gPSBpbnN0YW5jZS0+Y3RybF9jb250ZXh0OwogCisJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnJlc2V0X211dGV4KTsKKwogCWlmIChpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPT0gTUVHQVNBU19IV19DUklUSUNBTF9FUlJPUikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IEhhcmR3YXJlIGNyaXRpY2FsIGVycm9yLCAiCi0JCSAgICAgICAicmV0dXJuaW5nIEZBSUxFRC5cbiIpOworCQkgICAgICAgInJldHVybmluZyBGQUlMRUQgZm9yIHNjc2klZC5cbiIsCisJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnJlc2V0X211dGV4KTsKKwlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkICYmICFpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsKQorCQlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnNyaW92X2hlYXJ0YmVhdF90aW1lcik7CiAJc2V0X2JpdChNRUdBU0FTX0ZVU0lPTl9JTl9SRVNFVCwgJmluc3RhbmNlLT5yZXNldF9mbGFncyk7Ci0JaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19BRFBSRVNFVF9TTV9JTkZBVUxUOworCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfQURQUkVTRVRfU01fUE9MTElORzsKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIoaW5zdGFuY2UpOwogCW1zbGVlcCgxMDAwKTsKIAogCS8qIEZpcnN0IHRyeSB3YWl0aW5nIGZvciBjb21tYW5kcyB0byBjb21wbGV0ZSAqLwotCWlmIChtZWdhc2FzX3dhaXRfZm9yX291dHN0YW5kaW5nX2Z1c2lvbihpbnN0YW5jZSkpIHsKKwlpZiAobWVnYXNhc193YWl0X2Zvcl9vdXRzdGFuZGluZ19mdXNpb24oaW5zdGFuY2UsIGlvdGltZW91dCwKKwkJCQkJCSZjb252ZXJ0KSkgeworCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0FEUFJFU0VUX1NNX0lORkFVTFQ7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogcmVzZXR0aW5nIGZ1c2lvbiAiCi0JCSAgICAgICAiYWRhcHRlci5cbiIpOworCQkgICAgICAgImFkYXB0ZXIgc2NzaSVkLlxuIiwgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQlpZiAoY29udmVydCkKKwkJCWlvdGltZW91dCA9IDA7CisKIAkJLyogTm93IHJldHVybiBjb21tYW5kcyBiYWNrIHRvIHRoZSBPUyAqLwogCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tYXhfZndfY21kczsgaSsrKSB7CiAJCQljbWRfZnVzaW9uID0gZnVzaW9uLT5jbWRfbGlzdFtpXTsKIAkJCWlmIChjbWRfZnVzaW9uLT5zY21kKSB7CiAJCQkJc2NzaV9kbWFfdW5tYXAoY21kX2Z1c2lvbi0+c2NtZCk7Ci0JCQkJY21kX2Z1c2lvbi0+c2NtZC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCQkJY21kX2Z1c2lvbi0+c2NtZC0+cmVzdWx0ID0KKwkJCQkJbWVnYXNhc19jaGVja19tcGlvX3BhdGhzKGluc3RhbmNlLAorCQkJCQkJCQkgY21kX2Z1c2lvbi0+c2NtZCk7CiAJCQkJY21kX2Z1c2lvbi0+c2NtZC0+c2NzaV9kb25lKGNtZF9mdXNpb24tPnNjbWQpOwogCQkJCW1lZ2FzYXNfcmV0dXJuX2NtZF9mdXNpb24oaW5zdGFuY2UsIGNtZF9mdXNpb24pOwogCQkJCWF0b21pY19kZWMoJmluc3RhbmNlLT5md19vdXRzdGFuZGluZyk7CkBAIC0yMzEzLDEzICsyMzk2LDY3IEBACiAJCSAgICAoYWJzX3N0YXRlID09IE1GSV9TVEFURV9GQVVMVCAmJiAhcmVzZXRfYWRhcHRlcikpIHsKIAkJCS8qIFJlc2V0IG5vdCBzdXBwb3J0ZWQsIGtpbGwgYWRhcHRlciAqLwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBSZXNldCBub3Qgc3VwcG9ydGVkIgotCQkJICAgICAgICIsIGtpbGxpbmcgYWRhcHRlci5cbiIpOworCQkJICAgICAgICIsIGtpbGxpbmcgYWRhcHRlciBzY3NpJWQuXG4iLAorCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCW1lZ2FyYWlkX3Nhc19raWxsX2hiYShpbnN0YW5jZSk7CisJCQlpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsID0gMTsKIAkJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1I7CiAJCQlyZXR2YWwgPSBGQUlMRUQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCisJCS8qIExldCBTUi1JT1YgVkYgJiBQRiBzeW5jIHVwIGlmIHRoZXJlIHdhcyBhIEhCIGZhaWx1cmUgKi8KKwkJaWYgKGluc3RhbmNlLT5yZXF1ZXN0b3JJZCAmJiAhaW90aW1lb3V0KSB7CisJCQltc2xlZXAoTUVHQVNBU19PQ1JfU0VUVExFX1RJTUVfVkYpOworCQkJLyogTG9vayBmb3IgYSBsYXRlIEhCIHVwZGF0ZSBhZnRlciBWRiBzZXR0bGUgdGltZSAqLworCQkJaWYgKGFic19zdGF0ZSA9PSBNRklfU1RBVEVfT1BFUkFUSU9OQUwgJiYKKwkJCSAgICAoaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5md0NvdW50ZXIgIT0KKwkJCSAgICAgaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5kcml2ZXJDb3VudGVyKSkgeworCQkJCQlpbnN0YW5jZS0+aGJfaG9zdF9tZW0tPkhCLmRyaXZlckNvdW50ZXIgPQorCQkJCQkJaW5zdGFuY2UtPmhiX2hvc3RfbWVtLT5IQi5md0NvdW50ZXI7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXM6IFNSLUlPVjoiCisJCQkJCSAgICAgICAiTGF0ZSBGVyBoZWFydGJlYXQgdXBkYXRlIGZvciAiCisJCQkJCSAgICAgICAic2NzaSVkLlxuIiwKKwkJCQkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSW4gVkYgbW9kZSwgZmlyc3QgcG9sbCBmb3IgRlcgcmVhZHkgKi8KKwkJCQlmb3IgKGkgPSAwOworCQkJCSAgICAgaSA8IChNRUdBU0FTX1JFU0VUX1dBSVRfVElNRSAqIDEwMDApOworCQkJCSAgICAgaSArPSAyMCkgeworCQkJCQlzdGF0dXNfcmVnID0KKwkJCQkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPgorCQkJCQkJcmVhZF9md19zdGF0dXNfcmVnKAorCQkJCQkJCWluc3RhbmNlLT5yZWdfc2V0KTsKKwkJCQkJYWJzX3N0YXRlID0gc3RhdHVzX3JlZyAmCisJCQkJCQlNRklfU1RBVEVfTUFTSzsKKwkJCQkJaWYgKGFic19zdGF0ZSA9PSBNRklfU1RBVEVfUkVBRFkpIHsKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FzYXMiCisJCQkJCQkgICAgICAgIjogU1ItSU9WOiBGVyB3YXMgZm91bmQiCisJCQkJCQkgICAgICAgInRvIGJlIGluIHJlYWR5IHN0YXRlICIKKwkJCQkJCSAgICAgICAiZm9yIHNjc2klZC5cbiIsCisJCQkJCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbXNsZWVwKDIwKTsKKwkJCQl9CisJCQkJaWYgKGFic19zdGF0ZSAhPSBNRklfU1RBVEVfUkVBRFkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXNhczogU1ItSU9WOiAiCisJCQkJCSAgICAgICAiRlcgbm90IGluIHJlYWR5IHN0YXRlIGFmdGVyICVkIgorCQkJCQkgICAgICAgIiBzZWNvbmRzIGZvciBzY3NpJWQsIHN0YXR1c19yZWcgPSAiCisJCQkJCSAgICAgICAiMHgleC5cbiIsCisJCQkJCSAgICAgICBNRUdBU0FTX1JFU0VUX1dBSVRfVElNRSwKKwkJCQkJICAgICAgIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vLAorCQkJCQkgICAgICAgc3RhdHVzX3JlZyk7CisJCQkJCW1lZ2FyYWlkX3Nhc19raWxsX2hiYShpbnN0YW5jZSk7CisJCQkJCWluc3RhbmNlLT5za2lwX2hlYXJ0YmVhdF90aW1lcl9kZWwgPSAxOworCQkJCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPQorCQkJCQkJTUVHQVNBU19IV19DUklUSUNBTF9FUlJPUjsKKwkJCQkJcmV0dmFsID0gRkFJTEVEOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCX0KKwogCQkvKiBOb3cgdHJ5IHRvIHJlc2V0IHRoZSBjaGlwICovCiAJCWZvciAoaSA9IDA7IGkgPCBNRUdBU0FTX0ZVU0lPTl9NQVhfUkVTRVRfVFJJRVM7IGkrKykgewogCQkJd3JpdGVsKE1QSTJfV1JTRVFfRkxVU0hfS0VZX1ZBTFVFLApAQCAtMjM0Niw3ICsyNDgzLDkgQEAKIAkJCQlyZWFkbCgmaW5zdGFuY2UtPnJlZ19zZXQtPmZ1c2lvbl9ob3N0X2RpYWcpOwogCQkJCWlmIChyZXRyeSsrID09IDEwMCkgewogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6ICIKLQkJCQkJICAgICAgICJIb3N0IGRpYWcgdW5sb2NrIGZhaWxlZCFcbiIpOworCQkJCQkgICAgICAgIkhvc3QgZGlhZyB1bmxvY2sgZmFpbGVkISAiCisJCQkJCSAgICAgICAiZm9yIHNjc2klZFxuIiwKKwkJCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMjM2OCw3ICsyNTA3LDggQEAKIAkJCQlpZiAocmV0cnkrKyA9PSAxMDAwKSB7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogIgogCQkJCQkgICAgICAgIkRpYWcgcmVzZXQgYWRhcHRlciBuZXZlciAiCi0JCQkJCSAgICAgICAiY2xlYXJlZCFcbiIpOworCQkJCQkgICAgICAgImNsZWFyZWQgZm9yIHNjc2klZCFcbiIsCisJCQkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTIzOTAsMjkgKzI1MzAsMjkgQEAKIAkJCWlmIChhYnNfc3RhdGUgPD0gTUZJX1NUQVRFX0ZXX0lOSVQpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IGZpcm13YXJlICIKIAkJCQkgICAgICAgInN0YXRlIDwgTUZJX1NUQVRFX0ZXX0lOSVQsIHN0YXRlID0gIgotCQkJCSAgICAgICAiMHgleFxuIiwgYWJzX3N0YXRlKTsKKwkJCQkgICAgICAgIjB4JXggZm9yIHNjc2klZFxuIiwgYWJzX3N0YXRlLAorCQkJCQlpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCS8qIFdhaXQgZm9yIEZXIHRvIGJlY29tZSByZWFkeSAqLwogCQkJaWYgKG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShpbnN0YW5jZSwgMSkpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IEZhaWxlZCB0byAiCi0JCQkJICAgICAgICJ0cmFuc2l0aW9uIGNvbnRyb2xsZXIgdG8gcmVhZHkuXG4iKTsKKwkJCQkgICAgICAgInRyYW5zaXRpb24gY29udHJvbGxlciB0byByZWFkeSAiCisJCQkJICAgICAgICJmb3Igc2NzaSVkLlxuIiwKKwkJCQkgICAgICAgaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQltZWdhc2FzX3Jlc2V0X3JlcGx5X2Rlc2MoaW5zdGFuY2UpOwogCQkJaWYgKG1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uKGluc3RhbmNlKSkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogIgotCQkJCSAgICAgICAibWVnYXNhc19pb2NfaW5pdF9mdXNpb24oKSBmYWlsZWQhXG4iKTsKKwkJCQkgICAgICAgIm1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uKCkgZmFpbGVkISIKKwkJCQkgICAgICAgIiBmb3Igc2NzaSVkXG4iLAorCQkJCSAgICAgICBpbnN0YW5jZS0+aG9zdC0+aG9zdF9ubyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWNsZWFyX2JpdChNRUdBU0FTX0ZVU0lPTl9JTl9SRVNFVCwKLQkJCQkgICZpbnN0YW5jZS0+cmVzZXRfZmxhZ3MpOwotCQkJaW5zdGFuY2UtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIoaW5zdGFuY2UpOwotCQkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19IQkFfT1BFUkFUSU9OQUw7Ci0KIAkJCS8qIFJlLWZpcmUgbWFuYWdlbWVudCBjb21tYW5kcyAqLwogCQkJZm9yIChqID0gMCA7IGogPCBpbnN0YW5jZS0+bWF4X2Z3X2NtZHM7IGorKykgewogCQkJCWNtZF9mdXNpb24gPSBmdXNpb24tPmNtZF9saXN0W2pdOwpAQCAtMjQyMiw3ICsyNTYyLDcgQEAKIAkJCQkJaW5zdGFuY2UtPgogCQkJCQljbWRfbGlzdFtjbWRfZnVzaW9uLT5zeW5jX2NtZF9pZHhdOwogCQkJCQlpZiAoY21kX21maS0+ZnJhbWUtPmRjbWQub3Bjb2RlID09Ci0JCQkJCSAgICBNUl9EQ01EX0xEX01BUF9HRVRfSU5GTykgeworCQkJCQkgICAgY3B1X3RvX2xlMzIoTVJfRENNRF9MRF9NQVBfR0VUX0lORk8pKSB7CiAJCQkJCQltZWdhc2FzX3JldHVybl9jbWQoaW5zdGFuY2UsCiAJCQkJCQkJCSAgIGNtZF9tZmkpOwogCQkJCQkJbWVnYXNhc19yZXR1cm5fY21kX2Z1c2lvbigKQEAgLTI0MzMsMTEgKzI1NzMsMTUgQEAKIAkJCQkJCQlpbnN0YW5jZSwKIAkJCQkJCQljbWRfbWZpLT5jb250ZXh0LnNtaWQKIAkJCQkJCQktMSk7Ci0JCQkJCQlpZiAoIXJlcV9kZXNjKQorCQkJCQkJaWYgKCFyZXFfZGVzYykgewogCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkJCQkgICAgICAgInJlcV9kZXNjIE5VTEwiCi0JCQkJCQkJICAgICAgICJcbiIpOwotCQkJCQkJZWxzZSB7CisJCQkJCQkJICAgICAgICIgZm9yIHNjc2klZFxuIiwKKwkJCQkJCQkJaW5zdGFuY2UtPmhvc3QtPmhvc3Rfbm8pOworCQkJCQkJCS8qIFJldHVybiBsZWFrZWQgTVBUCisJCQkJCQkJICAgZnJhbWUgKi8KKwkJCQkJCQltZWdhc2FzX3JldHVybl9jbWRfZnVzaW9uKGluc3RhbmNlLCBjbWRfZnVzaW9uKTsKKwkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJaW5zdGFuY2UtPmluc3RhbmNldC0+CiAJCQkJCQkJZmlyZV9jbWQoaW5zdGFuY2UsCiAJCQkJCQkJCSByZXFfZGVzYy0+CkBAIC0yNDUxLDYgKzI1OTUsMTEgQEAKIAkJCQl9CiAJCQl9CiAKKwkJCWNsZWFyX2JpdChNRUdBU0FTX0ZVU0lPTl9JTl9SRVNFVCwKKwkJCQkgICZpbnN0YW5jZS0+cmVzZXRfZmxhZ3MpOworCQkJaW5zdGFuY2UtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19IQkFfT1BFUkFUSU9OQUw7CisKIAkJCS8qIFJlc2V0IGxvYWQgYmFsYW5jZSBpbmZvICovCiAJCQltZW1zZXQoZnVzaW9uLT5sb2FkX2JhbGFuY2VfaW5mbywgMCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IExEX0xPQURfQkFMQU5DRV9JTkZPKQpAQCAtMjQ1OSwxOCArMjYwOCwzOSBAQAogCQkJaWYgKCFtZWdhc2FzX2dldF9tYXBfaW5mbyhpbnN0YW5jZSkpCiAJCQkJbWVnYXNhc19zeW5jX21hcF9pbmZvKGluc3RhbmNlKTsKIAorCQkJLyogUmVzdGFydCBTUi1JT1YgaGVhcnRiZWF0ICovCisJCQlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKSB7CisJCQkJaWYgKCFtZWdhc2FzX3NyaW92X3N0YXJ0X2hlYXJ0YmVhdChpbnN0YW5jZSwgMCkpCisJCQkJCW1lZ2FzYXNfc3RhcnRfdGltZXIoaW5zdGFuY2UsCisJCQkJCQkJICAgICZpbnN0YW5jZS0+c3Jpb3ZfaGVhcnRiZWF0X3RpbWVyLAorCQkJCQkJCSAgICBtZWdhc2FzX3NyaW92X2hlYXJ0YmVhdF9oYW5kbGVyLAorCQkJCQkJCSAgICBNRUdBU0FTX1NSSU9WX0hFQVJUQkVBVF9JTlRFUlZBTF9WRik7CisJCQkJZWxzZQorCQkJCQlpbnN0YW5jZS0+c2tpcF9oZWFydGJlYXRfdGltZXJfZGVsID0gMTsKKwkJCX0KKwogCQkJLyogQWRhcHRlciByZXNldCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IFJlc2V0ICIKLQkJCSAgICAgICAic3VjY2Vzc2Z1bC5cbiIpOworCQkJICAgICAgICJzdWNjZXNzZnVsIGZvciBzY3NpJWQuXG4iLAorCQkJCWluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJCXJldHZhbCA9IFNVQ0NFU1M7CiAJCQlnb3RvIG91dDsKIAkJfQogCQkvKiBSZXNldCBmYWlsZWQsIGtpbGwgdGhlIGFkYXB0ZXIgKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBSZXNldCBmYWlsZWQsIGtpbGxpbmcgIgotCQkgICAgICAgImFkYXB0ZXIuXG4iKTsKKwkJICAgICAgICJhZGFwdGVyIHNjc2klZC5cbiIsIGluc3RhbmNlLT5ob3N0LT5ob3N0X25vKTsKIAkJbWVnYXJhaWRfc2FzX2tpbGxfaGJhKGluc3RhbmNlKTsKKwkJaW5zdGFuY2UtPnNraXBfaGVhcnRiZWF0X3RpbWVyX2RlbCA9IDE7CisJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1I7CiAJCXJldHZhbCA9IEZBSUxFRDsKIAl9IGVsc2UgeworCQkvKiBGb3IgVkY6IFJlc3RhcnQgSEIgdGltZXIgaWYgd2UgZGlkbid0IE9DUiAqLworCQlpZiAoaW5zdGFuY2UtPnJlcXVlc3RvcklkKSB7CisJCQltZWdhc2FzX3N0YXJ0X3RpbWVyKGluc3RhbmNlLAorCQkJCQkgICAgJmluc3RhbmNlLT5zcmlvdl9oZWFydGJlYXRfdGltZXIsCisJCQkJCSAgICBtZWdhc2FzX3NyaW92X2hlYXJ0YmVhdF9oYW5kbGVyLAorCQkJCQkgICAgTUVHQVNBU19TUklPVl9IRUFSVEJFQVRfSU5URVJWQUxfVkYpOworCQl9CiAJCWNsZWFyX2JpdChNRUdBU0FTX0ZVU0lPTl9JTl9SRVNFVCwgJmluc3RhbmNlLT5yZXNldF9mbGFncyk7CiAJCWluc3RhbmNlLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKGluc3RhbmNlKTsKIAkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19IQkFfT1BFUkFUSU9OQUw7CkBAIC0yNDg3LDcgKzI2NTcsNyBAQAogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSwgd29ya19pbml0KTsKIAotCW1lZ2FzYXNfcmVzZXRfZnVzaW9uKGluc3RhbmNlLT5ob3N0KTsKKwltZWdhc2FzX3Jlc2V0X2Z1c2lvbihpbnN0YW5jZS0+aG9zdCwgMCk7CiB9CiAKIHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlX3RlbXBsYXRlIG1lZ2FzYXNfaW5zdGFuY2VfdGVtcGxhdGVfZnVzaW9uID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmgKaW5kZXggMzVhNTEzOS4uZTc2YWY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oCkBAIC00ODUsNiArNDg1LDkgQEAKICNkZWZpbmUgTUFYX1BIWVNJQ0FMX0RFVklDRVMgMjU2CiAjZGVmaW5lIE1BWF9SQUlETUFQX1BIWVNJQ0FMX0RFVklDRVMgKE1BWF9QSFlTSUNBTF9ERVZJQ0VTKQogI2RlZmluZSBNUl9EQ01EX0xEX01BUF9HRVRfSU5GTyAgICAgICAgICAgICAweDAzMDBlMTAxCisjZGVmaW5lIE1SX0RDTURfQ1RSTF9TSEFSRURfSE9TVF9NRU1fQUxMT0MgIDB4MDEwZTg0ODUgICAvKiBTUi1JT1YgSEIgYWxsb2MqLworI2RlZmluZSBNUl9EQ01EX0xEX1ZGX01BUF9HRVRfQUxMX0xEU18xMTEgICAweDAzMjAwMjAwCisjZGVmaW5lIE1SX0RDTURfTERfVkZfTUFQX0dFVF9BTExfTERTICAgICAgIDB4MDMxNTAyMDAKIAogc3RydWN0IE1SX0RFVl9IQU5ETEVfSU5GTyB7CiAJdTE2ICAgICBjdXJEZXZIZGw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGFzMTYuYyBiL2RyaXZlcnMvc2NzaS9wYXMxNi5jCmluZGV4IDYyZjFhNjAuLjBkNzhhNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wYXMxNi5jCisrKyBiL2RyaXZlcnMvc2NzaS9wYXMxNi5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAkgICAgaW5zdGFuY2UtPmlycSA9IE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLCBQQVMxNl9JUlFTKTsKIAogCWlmIChpbnN0YW5jZS0+aXJxICE9IFNDU0lfSVJRX05PTkUpIAotCSAgICBpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgcGFzMTZfaW50ciwgSVJRRl9ESVNBQkxFRCwKKwkgICAgaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHBhczE2X2ludHIsIDAsCiAJCQkgICAgInBhczE2IiwgaW5zdGFuY2UpKSB7CiAJCXByaW50aygic2NzaSVkIDogSVJRJWQgbm90IGZyZWUsIGludGVycnVwdHMgZGlzYWJsZWRcbiIsIAogCQkgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfY3RsLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9jdGwuYwppbmRleCBhMDRiNGZmLi4yOGI0ZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9jdGwuYwpAQCAtMzIzLDI0ICszMjMsMTcgQEAKIAlpbnQgb2Zmc2V0OwogCWNoYXIgKnN0ciA9IGJ1ZjsKIAlpbnQgc3RhcnQgPSAwOwotI2RlZmluZSBJQl9NRU1NQVAoYykJCVwKLQkJKCoodTMyICopKCh1OCAqKXBtODAwMV9oYS0+CQlcCi0JCW1lbW9yeU1hcC5yZWdpb25bSUJdLnZpcnRfcHRyICsJCVwKKyNkZWZpbmUgSUJfTUVNTUFQKGMpCVwKKwkJKCoodTMyICopKCh1OCAqKXBtODAwMV9oYS0+CVwKKwkJbWVtb3J5TWFwLnJlZ2lvbltJQl0udmlydF9wdHIgKwlcCiAJCXBtODAwMV9oYS0+ZXZ0bG9nX2liX29mZnNldCArIChjKSkpCiAKIAlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IElCX09CX1JFQURfVElNRVM7IG9mZnNldCsrKSB7Ci0JCWlmIChwbTgwMDFfaGEtPmNoaXBfaWQgIT0gY2hpcF84MDAxKQotCQkJc3RyICs9IHNwcmludGYoc3RyLCAiMHglMDh4XG4iLCBJQl9NRU1NQVAoc3RhcnQpKTsKLQkJZWxzZQotCQkJc3RyICs9IHNwcmludGYoc3RyLCAiMHglMDh4XG4iLCBJQl9NRU1NQVAoc3RhcnQpKTsKKwkJc3RyICs9IHNwcmludGYoc3RyLCAiMHglMDh4XG4iLCBJQl9NRU1NQVAoc3RhcnQpKTsKIAkJc3RhcnQgPSBzdGFydCArIDQ7CiAJfQogCXBtODAwMV9oYS0+ZXZ0bG9nX2liX29mZnNldCArPSBTWVNGU19PRkZTRVQ7Ci0JaWYgKCgoKHBtODAwMV9oYS0+ZXZ0bG9nX2liX29mZnNldCkgJSAoUE04MFhYX0lCX09CX1FVRVVFX1NJWkUpKSA9PSAwKQotCQkmJiAocG04MDAxX2hhLT5jaGlwX2lkICE9IGNoaXBfODAwMSkpCi0JCXBtODAwMV9oYS0+ZXZ0bG9nX2liX29mZnNldCA9IDA7Ci0JaWYgKCgoKHBtODAwMV9oYS0+ZXZ0bG9nX2liX29mZnNldCkgJSAoUE04MDAxX0lCX09CX1FVRVVFX1NJWkUpKSA9PSAwKQotCQkmJiAocG04MDAxX2hhLT5jaGlwX2lkID09IGNoaXBfODAwMSkpCisJaWYgKCgocG04MDAxX2hhLT5ldnRsb2dfaWJfb2Zmc2V0KSAlIChQTTgwWFhfSUJfT0JfUVVFVUVfU0laRSkpID09IDApCiAJCXBtODAwMV9oYS0+ZXZ0bG9nX2liX29mZnNldCA9IDA7CiAKIAlyZXR1cm4gc3RyIC0gYnVmOwpAQCAtMzYzLDI0ICszNTYsMTcgQEAKIAlpbnQgb2Zmc2V0OwogCWNoYXIgKnN0ciA9IGJ1ZjsKIAlpbnQgc3RhcnQgPSAwOwotI2RlZmluZSBPQl9NRU1NQVAoYykJCVwKLQkJKCoodTMyICopKCh1OCAqKXBtODAwMV9oYS0+CQlcCi0JCW1lbW9yeU1hcC5yZWdpb25bT0JdLnZpcnRfcHRyICsJCVwKKyNkZWZpbmUgT0JfTUVNTUFQKGMpCVwKKwkJKCoodTMyICopKCh1OCAqKXBtODAwMV9oYS0+CVwKKwkJbWVtb3J5TWFwLnJlZ2lvbltPQl0udmlydF9wdHIgKwlcCiAJCXBtODAwMV9oYS0+ZXZ0bG9nX29iX29mZnNldCArIChjKSkpCiAKIAlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IElCX09CX1JFQURfVElNRVM7IG9mZnNldCsrKSB7Ci0JCWlmIChwbTgwMDFfaGEtPmNoaXBfaWQgIT0gY2hpcF84MDAxKQotCQkJc3RyICs9IHNwcmludGYoc3RyLCAiMHglMDh4XG4iLCBPQl9NRU1NQVAoc3RhcnQpKTsKLQkJZWxzZQotCQkJc3RyICs9IHNwcmludGYoc3RyLCAiMHglMDh4XG4iLCBPQl9NRU1NQVAoc3RhcnQpKTsKKwkJc3RyICs9IHNwcmludGYoc3RyLCAiMHglMDh4XG4iLCBPQl9NRU1NQVAoc3RhcnQpKTsKIAkJc3RhcnQgPSBzdGFydCArIDQ7CiAJfQogCXBtODAwMV9oYS0+ZXZ0bG9nX29iX29mZnNldCArPSBTWVNGU19PRkZTRVQ7Ci0JaWYgKCgoKHBtODAwMV9oYS0+ZXZ0bG9nX29iX29mZnNldCkgJSAoUE04MFhYX0lCX09CX1FVRVVFX1NJWkUpKSA9PSAwKQotCQkJJiYgKHBtODAwMV9oYS0+Y2hpcF9pZCAhPSBjaGlwXzgwMDEpKQotCQlwbTgwMDFfaGEtPmV2dGxvZ19vYl9vZmZzZXQgPSAwOwotCWlmICgoKChwbTgwMDFfaGEtPmV2dGxvZ19vYl9vZmZzZXQpICUgKFBNODAwMV9JQl9PQl9RVUVVRV9TSVpFKSkgPT0gMCkKLQkJCSYmIChwbTgwMDFfaGEtPmNoaXBfaWQgPT0gY2hpcF84MDAxKSkKKwlpZiAoKChwbTgwMDFfaGEtPmV2dGxvZ19vYl9vZmZzZXQpICUgKFBNODBYWF9JQl9PQl9RVUVVRV9TSVpFKSkgPT0gMCkKIAkJcG04MDAxX2hhLT5ldnRsb2dfb2Jfb2Zmc2V0ID0gMDsKIAogCXJldHVybiBzdHIgLSBidWY7CkBAIC00NjYsNyArNDUyLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHBtODAwMV9jdGxfZmF0YWxfbG9nX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXUzMiBjb3VudDsKKwlzc2l6ZV90IGNvdW50OwogCiAJY291bnQgPSBwbTgweHhfZ2V0X2ZhdGFsX2R1bXAoY2RldiwgYXR0ciwgYnVmKTsKIAlyZXR1cm4gY291bnQ7CkBAIC00ODQsNyArNDcwLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHBtODAwMV9jdGxfZ3NtX2xvZ19zaG93KHN0cnVjdCBkZXZpY2UgKmNkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQl1MzIgY291bnQ7CisJc3NpemVfdCBjb3VudDsKIAogCWNvdW50ID0gcG04MDAxX2dldF9nc21fZHVtcChjZGV2LCBTWVNGU19PRkZTRVQsIGJ1Zik7CiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYwppbmRleCAwYTEyOTZhLi5hOTdiZTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocG04MDAxX2hhLT5wZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlaWQpOwogCS8qIDgwODEgY29udHJvbGxlcnMgbmVlZCBCQVIgc2hpZnQgdG8gYWNjZXNzIE1QSSBzcGFjZQogCSogYXMgdGhpcyBpcyBzaGFyZWQgd2l0aCBCSU9TIGRhdGEgKi8KLQlpZiAoZGV2aWNlaWQgPT0gMHg4MDgxKSB7CisJaWYgKGRldmljZWlkID09IDB4ODA4MSB8fCBkZXZpY2VpZCA9PSAweDAwNDIpIHsKIAkJaWYgKC0xID09IHBtODAwMV9iYXI0X3NoaWZ0KHBtODAwMV9oYSwgR1NNX1NNX0JBU0UpKSB7CiAJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAogCQkJCXBtODAwMV9wcmludGsoIlNoaWZ0IEJhcjQgdG8gMHgleCBmYWlsZWRcbiIsCkBAIC02NzMsNyArNjczLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgUE04MDAxX01BWF9PVVRCX05VTTsgaSsrKQogCQl1cGRhdGVfb3V0Ym5kX3F1ZXVlX3RhYmxlKHBtODAwMV9oYSwgaSk7CiAJLyogODA4MSBjb250cm9sbGVyIGRvbm90IHJlcXVpcmUgdGhlc2Ugb3BlcmF0aW9ucyAqLwotCWlmIChkZXZpY2VpZCAhPSAweDgwODEpIHsKKwlpZiAoZGV2aWNlaWQgIT0gMHg4MDgxICYmIGRldmljZWlkICE9IDB4MDA0MikgewogCQltcGlfc2V0X3BoeXNfZzNfd2l0aF9zc2MocG04MDAxX2hhLCAwKTsKIAkJLyogNy0+MTMwbXMsIDM0LT41MDBtcywgMTE5LT4xLjVzICovCiAJCW1waV9zZXRfb3Blbl9yZXRyeV9pbnRlcnZhbF9yZWcocG04MDAxX2hhLCAxMTkpOwpAQCAtNzAxLDcgKzcwMSw3IEBACiAJdTMyIGdzdF9sZW5fbXBpc3RhdGU7CiAJdTE2IGRldmljZWlkOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBtODAwMV9oYS0+cGRldiwgUENJX0RFVklDRV9JRCwgJmRldmljZWlkKTsKLQlpZiAoZGV2aWNlaWQgPT0gMHg4MDgxKSB7CisJaWYgKGRldmljZWlkID09IDB4ODA4MSB8fCBkZXZpY2VpZCA9PSAweDAwNDIpIHsKIAkJaWYgKC0xID09IHBtODAwMV9iYXI0X3NoaWZ0KHBtODAwMV9oYSwgR1NNX1NNX0JBU0UpKSB7CiAJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAogCQkJCXBtODAwMV9wcmludGsoIlNoaWZ0IEJhcjQgdG8gMHgleCBmYWlsZWRcbiIsCkBAIC0yNTAyLDExICsyNTAyLDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjUyMiwxMSArMjUxOCw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjU1MCwxMSArMjU0Miw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfU1RQX1JFU09VUkNFU19CVVNZKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qIGRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjYxNywxMSArMjYwNSw3IEBACiAJCQkJICAgIElPX0RTX05PTl9PUEVSQVRJT05BTCk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjY0MSwxMSArMjYyNSw3IEBACiAJCQkJICAgIElPX0RTX0lOX0VSUk9SKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yNjc0LDIwICsyNjU0LDkgQEAKIAkJCSIgcmVzcCAweCV4IHN0YXQgMHgleCBidXQgYWJvcnRlZCBieSB1cHBlciBsYXllciFcbiIsCiAJCQl0LCBzdGF0dXMsIHRzLT5yZXNwLCB0cy0+c3RhdCkpOwogCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQl9IGVsc2UgaWYgKHQtPnVsZGRfdGFzaykgeworCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKiBkaXR0byAqLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQl9IGVsc2UgaWYgKCF0LT51bGRkX3Rhc2spIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qZGl0dG8qLwotCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCXQtPnRhc2tfZG9uZSh0KTsKLQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAl9CiB9CiAKQEAgLTI3OTYsMTEgKzI3NjUsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTI5MDksMjAgKzI4NzQsOSBAQAogCQkJIiByZXNwIDB4JXggc3RhdCAweCV4IGJ1dCBhYm9ydGVkIGJ5IHVwcGVyIGxheWVyIVxuIiwKIAkJCXQsIGV2ZW50LCB0cy0+cmVzcCwgdHMtPnN0YXQpKTsKIAkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JfSBlbHNlIGlmICh0LT51bGRkX3Rhc2spIHsKKwl9IGVsc2UgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LyogZGl0dG8gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JfSBlbHNlIGlmICghdC0+dWxkZF90YXNrKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKmRpdHRvKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJfQogfQogCkBAIC00NDY3LDIzICs0NDIxLDExIEBACiAJCQkJCSIgc3RhdCAweCV4IGJ1dCBhYm9ydGVkIGJ5IHVwcGVyIGxheWVyICIKIAkJCQkJIlxuIiwgdGFzaywgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CiAJCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0YXNrLCBjY2IsIHRhZyk7Ci0JCQl9IGVsc2UgaWYgKHRhc2stPnVsZGRfdGFzaykgeworCQkJfSBlbHNlIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssCiAJCQkJCQkJZmxhZ3MpOwotCQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdGFzaywgY2NiLCB0YWcpOwotCQkJCW1iKCk7LyogZGl0dG8gKi8KLQkJCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQkJdGFzay0+dGFza19kb25lKHRhc2spOwotCQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgaWYgKCF0YXNrLT51bGRkX3Rhc2spIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssCi0JCQkJCQkJZmxhZ3MpOwotCQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdGFzaywgY2NiLCB0YWcpOwotCQkJCW1iKCk7LypkaXR0byovCi0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKLQkJCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0YXNrLAorCQkJCQkJCQljY2IsIHRhZyk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTUwMjAsNyArNDk2Miw3IEBACiAJLyogY2hlY2sgbWF4IGlzIDEgTWJ5dGVzICovCiAJaWYgKChsZW5ndGggPiAweDEwMDAwMCkgfHwgKGdzbV9kdW1wX29mZnNldCAmIDMpIHx8CiAJCSgoZ3NtX2R1bXBfb2Zmc2V0ICsgbGVuZ3RoKSA+IDB4MTAwMDAwMCkpCi0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHBtODAwMV9oYS0+Y2hpcF9pZCA9PSBjaGlwXzgwMDEpCiAJCWJhciA9IDI7CkBAIC01MDQ4LDEyICs0OTkwLDEyIEBACiAJCQkJZ3NtX2Jhc2UgPSBHU01fQkFTRTsKIAkJCQlpZiAoLTEgPT0gcG04MDAxX2JhcjRfc2hpZnQocG04MDAxX2hhLAogCQkJCQkJKGdzbV9iYXNlICsgc2hpZnRfdmFsdWUpKSkKLQkJCQkJcmV0dXJuIDE7CisJCQkJCXJldHVybiAtRUlPOwogCQkJfSBlbHNlIHsKIAkJCQlnc21fYmFzZSA9IDA7CiAJCQkJaWYgKC0xID09IHBtODB4eF9iYXI0X3NoaWZ0KHBtODAwMV9oYSwKIAkJCQkJCShnc21fYmFzZSArIHNoaWZ0X3ZhbHVlKSkpCi0JCQkJCXJldHVybiAxOworCQkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJCWdzbV9kdW1wX29mZnNldCA9IChnc21fZHVtcF9vZmZzZXQgKyBvZmZzZXQpICYKIAkJCQkJCTB4RkZGRjAwMDA7CkBAIC01MDcyLDEzICs1MDE0LDggQEAKIAkJZGlyZWN0X2RhdGEgKz0gc3ByaW50ZihkaXJlY3RfZGF0YSwgIiUwOHggIiwgdmFsdWUpOwogCX0KIAkvKiBTaGlmdCBiYWNrIHRvIEJBUjQgb3JpZ2luYWwgYWRkcmVzcyAqLwotCWlmIChwbTgwMDFfaGEtPmNoaXBfaWQgPT0gY2hpcF84MDAxKSB7Ci0JCWlmICgtMSA9PSBwbTgwMDFfYmFyNF9zaGlmdChwbTgwMDFfaGEsIDApKQotCQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJaWYgKC0xID09IHBtODB4eF9iYXI0X3NoaWZ0KHBtODAwMV9oYSwgMCkpCi0JCQlyZXR1cm4gMTsKLQl9CisJaWYgKC0xID09IHBtODAwMV9iYXI0X3NoaWZ0KHBtODAwMV9oYSwgMCkpCisJCQlyZXR1cm4gLUVJTzsKIAlwbTgwMDFfaGEtPmZhdGFsX2ZvcmVuc2ljX3NoaWZ0X29mZnNldCArPSAxMDI0OwogCiAJaWYgKHBtODAwMV9oYS0+ZmF0YWxfZm9yZW5zaWNfc2hpZnRfb2Zmc2V0ID49IDB4MTAwMDAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jCmluZGV4IDczYTEyMGQuLmM0ZjMxYjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jCkBAIC02MjUsNyArNjI1LDcgQEAKIAlwbTgwMDFfaGEtPm52bWRfY29tcGxldGlvbiA9ICZjb21wbGV0aW9uOwogCiAJaWYgKHBtODAwMV9oYS0+Y2hpcF9pZCA9PSBjaGlwXzgwMDEpIHsKLQkJaWYgKGRldmljZWlkID09IDB4ODA4MSkgeworCQlpZiAoZGV2aWNlaWQgPT0gMHg4MDgxIHx8IGRldmljZWlkID09IDB4MDA0MikgewogCQkJcGF5bG9hZC5taW5vcl9mdW5jdGlvbiA9IDQ7CiAJCQlwYXlsb2FkLmxlbmd0aCA9IDQwOTY7CiAJCX0gZWxzZSB7CkBAIC02NDYsNiArNjQ2LDkgQEAKIAkJCWlmIChkZXZpY2VpZCA9PSAweDgwODEpCiAJCQkJcG04MDAxX2hhLT5zYXNfYWRkcltqXSA9CiAJCQkJCXBheWxvYWQuZnVuY19zcGVjaWZpY1sweDcwNCArIGldOworCQkJZWxzZSBpZiAoZGV2aWNlaWQgPT0gMHgwMDQyKQorCQkJCXBtODAwMV9oYS0+c2FzX2FkZHJbal0gPQorCQkJCQlwYXlsb2FkLmZ1bmNfc3BlY2lmaWNbMHgwMTAgKyBpXTsKIAkJfSBlbHNlCiAJCQlwbTgwMDFfaGEtPnNhc19hZGRyW2pdID0KIAkJCQkJcGF5bG9hZC5mdW5jX3NwZWNpZmljWzB4ODA0ICsgaV07CkBAIC03MTMsMTEgKzcxNiw5IEBACiAJLyogU1BDdiBjb250cm9sbGVycyBzdXBwb3J0cyA2NCBtc2kteCAqLwogCWlmIChwbTgwMDFfaGEtPmNoaXBfaWQgPT0gY2hpcF84MDAxKSB7CiAJCW51bWJlcl9vZl9pbnRyID0gMTsKLQkJZmxhZyB8PSBJUlFGX0RJU0FCTEVEOwogCX0gZWxzZSB7CiAJCW51bWJlcl9vZl9pbnRyID0gUE04MDAxX01BWF9NU0lYX1ZFQzsKIAkJZmxhZyAmPSB+SVJRRl9TSEFSRUQ7Ci0JCWZsYWcgfD0gSVJRRl9ESVNBQkxFRDsKIAl9CiAKIAltYXhfZW50cnkgPSBzaXplb2YocG04MDAxX2hhLT5tc2l4X2VudHJpZXMpIC8KQEAgLTEwNzIsMTAgKzEwNzMsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcG04MDAxX3BjaV90YWJsZVtdID0gewogCXsgUENJX1ZERVZJQ0UoUE1DX1NpZXJyYSwgMHg4MDAxKSwgY2hpcF84MDAxIH0sCi0JewotCQlQQ0lfREVWSUNFKDB4MTE3YywgMHgwMDQyKSwKLQkJLmRyaXZlcl9kYXRhID0gY2hpcF84MDAxCi0JfSwKKwl7IFBDSV9WREVWSUNFKEFUVE8sIDB4MDA0MiksIGNoaXBfODAwMSB9LAogCS8qIFN1cHBvcnQgZm9yIFNQQy9TUEN2L1NQQ3ZlIGNvbnRyb2xsZXJzICovCiAJeyBQQ0lfVkRFVklDRShBREFQVEVDMiwgMHg4MDAxKSwgY2hpcF84MDAxIH0sCiAJeyBQQ0lfVkRFVklDRShQTUNfU2llcnJhLCAweDgwMDgpLCBjaGlwXzgwMDggfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMKaW5kZXggZjUwYWM0NC4uOGE0NGJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMKQEAgLTQzNCw2ICs0MzQsNyBAQAogCQljY2ItPm5fZWxlbSA9IG5fZWxlbTsKIAkJY2NiLT5jY2JfdGFnID0gdGFnOwogCQljY2ItPnRhc2sgPSB0OworCQljY2ItPmRldmljZSA9IHBtODAwMV9kZXY7CiAJCXN3aXRjaCAodC0+dGFza19wcm90bykgewogCQljYXNlIFNBU19QUk9UT0NPTF9TTVA6CiAJCQlyYyA9IHBtODAwMV90YXNrX3ByZXBfc21wKHBtODAwMV9oYSwgY2NiKTsKQEAgLTg2NSwxMyArODY2LDExIEBACiBzdGF0aWMgdm9pZCBwbTgwMDFfZGV2X2dvbmVfbm90aWZ5KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdTMyIHRhZzsKIAlzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGE7CiAJc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9kZXYgPSBkZXYtPmxsZGRfZGV2OwogCiAJcG04MDAxX2hhID0gcG04MDAxX2ZpbmRfaGFfYnlfZGV2KGRldik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBtODAwMV9oYS0+bG9jaywgZmxhZ3MpOwotCXBtODAwMV90YWdfYWxsb2MocG04MDAxX2hhLCAmdGFnKTsKIAlpZiAocG04MDAxX2RldikgewogCQl1MzIgZGV2aWNlX2lkID0gcG04MDAxX2Rldi0+ZGV2aWNlX2lkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuaCBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oCmluZGV4IDZjNWZkNWUuLjFlZTA2ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oCkBAIC03MDgsNSArNzA4LDE3IEBACiAvKiBjdGwgc2hhcmVkIEFQSSAqLwogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpwbTgwMDFfaG9zdF9hdHRyc1tdOwogCitzdGF0aWMgaW5saW5lIHZvaWQKK3BtODAwMV9jY2JfdGFza19mcmVlX2RvbmUoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAorCQkJc3RydWN0IHNhc190YXNrICp0YXNrLCBzdHJ1Y3QgcG04MDAxX2NjYl9pbmZvICpjY2IsCisJCQl1MzIgY2NiX2lkeCkKK3sKKwlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHRhc2ssIGNjYiwgY2NiX2lkeCk7CisJc21wX21iKCk7IC8qaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nKi8KKwlzcGluX3VubG9jaygmcG04MDAxX2hhLT5sb2NrKTsKKwl0YXNrLT50YXNrX2RvbmUodGFzayk7CisJc3Bpbl9sb2NrKCZwbTgwMDFfaGEtPmxvY2spOworfQorCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgweHhfaHdpLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODB4eF9od2kuYwppbmRleCBjOTUwZGM1Li5kNzA1ODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODB4eF9od2kuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODB4eF9od2kuYwpAQCAtOTEsNyArOTEsNiBAQAogCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOwogCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHNoYS0+bGxkZF9oYTsKIAl2b2lkIF9faW9tZW0gKmZhdGFsX3RhYmxlX2FkZHJlc3MgPSBwbTgwMDFfaGEtPmZhdGFsX3RibF9hZGRyOwotCXUzMiBzdGF0dXMgPSAxOwogCXUzMiBhY2N1bV9sZW4gLCByZWdfdmFsLCBpbmRleCwgKnRlbXA7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKIAl1OCAqZGlyZWN0X2RhdGE7CkBAIC0xMTEsMTMgKzExMCwxMCBAQAogCQlkaXJlY3RfZGF0YSA9ICh1OCAqKWZhdGFsX2Vycm9yX2RhdGE7CiAJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX3R5cGUgPSBUWVBFX05PTl9GQVRBTDsKIAkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9sZW4gPSBTWVNGU19PRkZTRVQ7Ci0JCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3Rfb2Zmc2V0ID0gMDsKIAkJcG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLnJlYWRfbGVuID0gMDsKIAogCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2RhdGEgPSBkaXJlY3RfZGF0YTsKLQl9CiAKLQlpZiAocG04MDAxX2hhLT5mb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9vZmZzZXQgPT0gMCkgewogCQkvKiBzdGFydCB0byBnZXQgZGF0YSAqLwogCQkvKiBQcm9ncmFtIHRoZSBNRU1CQVNFIElJIFNoaWZ0aW5nIFJlZ2lzdGVyIHdpdGggMHgwMC4qLwogCQlwbTgwMDFfY3czMihwbTgwMDFfaGEsIDAsIE1FTUJBU0VfSUlfU0hJRlRfUkVHSVNURVIsCkBAIC0xMjYsNiArMTIyLDcgQEAKIAkJcG04MDAxX2hhLT5mb3JlbnNpY19mYXRhbF9zdGVwID0gMDsKIAkJcG04MDAxX2hhLT5mYXRhbF9iYXJfbG9jID0gMDsKIAl9CisKIAkvKiBSZWFkIHVudGlsIGFjY3VtX2xlbiBpcyByZXRyaXZlZCAqLwogCWFjY3VtX2xlbiA9IHBtODAwMV9tcjMyKGZhdGFsX3RhYmxlX2FkZHJlc3MsCiAJCQkJTVBJX0ZBVEFMX0VEVU1QX1RBQkxFX0FDQ1VNX0xFTik7CkBAIC0xMzUsNyArMTMyLDcgQEAKIAkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCiAJCQlwbTgwMDFfcHJpbnRrKCJQb3NzaWJsZSBQQ0kgaXNzdWUgMHgleCBub3QgZXhwZWN0ZWRcbiIsCiAJCQkJYWNjdW1fbGVuKSk7Ci0JCXJldHVybiBzdGF0dXM7CisJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoYWNjdW1fbGVuID09IDAgfHwgYWNjdW1fbGVuID49IDB4MTAwMDAwKSB7CiAJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfZGF0YSArPQpAQCAtMTc4LDcgKzE3NSw2IEBACiAJCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2ZhdGFsX3N0ZXAgPSAxOwogCQkJcG04MDAxX2hhLT5mYXRhbF9mb3JlbnNpY19zaGlmdF9vZmZzZXQgPSAwOwogCQkJcG04MDAxX2hhLT5mb3JlbnNpY19sYXN0X29mZnNldAk9IDA7Ci0JCQlzdGF0dXMgPSAwOwogCQkJcmV0dXJuIChjaGFyICopcG04MDAxX2hhLT4KIAkJCQlmb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9kYXRhIC0KIAkJCQkoY2hhciAqKWJ1ZjsKQEAgLTE5NCw3ICsxOTAsNiBAQAogCQkJCQlmb3JlbnNpY19pbmZvLmRhdGFfYnVmLmRpcmVjdF9kYXRhLAogCQkJCQkiJTA4eCAiLCAqKHRlbXAgKyBpbmRleCkpOwogCQkJfQotCQkJc3RhdHVzID0gMDsKIAkJCXJldHVybiAoY2hhciAqKXBtODAwMV9oYS0+CiAJCQkJZm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfZGF0YSAtCiAJCQkJKGNoYXIgKilidWY7CkBAIC0yMTQsNyArMjA5LDYgQEAKIAkJcG04MDAxX2N3MzIocG04MDAxX2hhLCAwLCBNRU1CQVNFX0lJX1NISUZUX1JFR0lTVEVSLAogCQkJcG04MDAxX2hhLT5mYXRhbF9mb3JlbnNpY19zaGlmdF9vZmZzZXQpOwogCQlwbTgwMDFfaGEtPmZhdGFsX2Jhcl9sb2MgPSAwOwotCQlzdGF0dXMgPSAwOwogCQlyZXR1cm4gKGNoYXIgKilwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X2RhdGEgLQogCQkJKGNoYXIgKilidWY7CiAJfQpAQCAtMjM5LDcgKzIzMyw3IEBACiAJCQlQTTgwMDFfRkFJTF9EQkcocG04MDAxX2hhLAogCQkJcG04MDAxX3ByaW50aygiVElNRU9VVDpNRU1CQVNFX0lJX1NISUZUX1JFR0lTVEVSIgogCQkJIiA9IDB4JXhcbiIsIHJlZ192YWwpKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUlPOwogCQl9CiAKIAkJLyogUmVhZCB0aGUgbmV4dCA2NEsgb2YgdGhlIGRlYnVnIGRhdGEuICovCkBAIC0yNTksNyArMjUzLDYgQEAKIAkJCXBtODAwMV9oYS0+Zm9yZW5zaWNfaW5mby5kYXRhX2J1Zi5kaXJlY3RfbGVuID0gIDA7CiAJCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYuZGlyZWN0X29mZnNldCA9IDA7CiAJCQlwbTgwMDFfaGEtPmZvcmVuc2ljX2luZm8uZGF0YV9idWYucmVhZF9sZW4gPSAwOwotCQkJc3RhdHVzID0gMDsKIAkJfQogCX0KIApAQCAtMjE3NSwxMSArMjE2OCw3IEBACiAJCQkJSU9fT1BFTl9DTlhfRVJST1JfSVRfTkVYVVNfTE9TUyk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmluIG9yZGVyIHRvIGZvcmNlIENQVSBvcmRlcmluZyovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTIxOTUsMTEgKzIxODQsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX0lUX05FWFVTX0xPU1MpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTIyMjEsMTEgKzIyMDYsNyBAQAogCQkJCUlPX09QRU5fQ05YX0VSUk9SX1NUUF9SRVNPVVJDRVNfQlVTWSk7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKiBkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTIyODgsMTEgKzIyNjksNyBAQAogCQkJCQlJT19EU19OT05fT1BFUkFUSU9OQUwpOwogCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKIAkJCXRzLT5zdGF0ID0gU0FTX1FVRVVFX0ZVTEw7Ci0JCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJCW1iKCk7LypkaXR0byovCi0JCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQl0LT50YXNrX2RvbmUodCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKIAkJCXJldHVybjsKIAkJfQogCQlicmVhazsKQEAgLTIzMTIsMTEgKzIyODksNyBAQAogCQkJCQlJT19EU19JTl9FUlJPUik7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwogCQkJdHMtPnN0YXQgPSBTQVNfUVVFVUVfRlVMTDsKLQkJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQkJbWIoKTsvKmRpdHRvKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCXQtPnRhc2tfZG9uZSh0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtMjM0NSwyMCArMjMxOCw5IEBACiAJCQkiIHJlc3AgMHgleCBzdGF0IDB4JXggYnV0IGFib3J0ZWQgYnkgdXBwZXIgbGF5ZXIhXG4iLAogCQkJdCwgc3RhdHVzLCB0cy0+cmVzcCwgdHMtPnN0YXQpKTsKIAkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JfSBlbHNlIGlmICh0LT51bGRkX3Rhc2spIHsKKwl9IGVsc2UgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LyogZGl0dG8gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JfSBlbHNlIGlmICghdC0+dWxkZF90YXNrKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHQsIGNjYiwgdGFnKTsKLQkJbWIoKTsvKmRpdHRvKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQl0LT50YXNrX2RvbmUodCk7Ci0JCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJfQogfQogCkBAIC0yNDcwLDExICsyNDMyLDcgQEAKIAkJCQlJT19PUEVOX0NOWF9FUlJPUl9JVF9ORVhVU19MT1NTKTsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CiAJCQl0cy0+c3RhdCA9IFNBU19RVUVVRV9GVUxMOwotCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCQltYigpOy8qZGl0dG8qLwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCQkJdC0+dGFza19kb25lKHQpOwotCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKKwkJCXBtODAwMV9jY2JfdGFza19mcmVlX2RvbmUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CkBAIC0yNTk2LDIwICsyNTU0LDkgQEAKIAkJCSIgcmVzcCAweCV4IHN0YXQgMHgleCBidXQgYWJvcnRlZCBieSB1cHBlciBsYXllciFcbiIsCiAJCQl0LCBldmVudCwgdHMtPnJlc3AsIHRzLT5zdGF0KSk7CiAJCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCX0gZWxzZSBpZiAodC0+dWxkZF90YXNrKSB7CisJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXBtODAwMV9jY2JfdGFza19mcmVlKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwotCQltYigpOy8qIGRpdHRvICovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOwotCX0gZWxzZSBpZiAoIXQtPnVsZGRfdGFzaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0LT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0LCBjY2IsIHRhZyk7Ci0JCW1iKCk7LypkaXR0byovCi0JCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJdC0+dGFza19kb25lKHQpOwotCQlzcGluX2xvY2tfaXJxKCZwbTgwMDFfaGEtPmxvY2spOworCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZV9kb25lKHBtODAwMV9oYSwgdCwgY2NiLCB0YWcpOwogCX0KIH0KIApAQCAtNDMwNCwyMyArNDI1MSwxMSBAQAogCQkJCQkiXG4iLCB0YXNrLCB0cy0+cmVzcCwgdHMtPnN0YXQpKTsKIAkJCQlwbTgwMDFfY2NiX3Rhc2tfZnJlZShwbTgwMDFfaGEsIHRhc2ssIGNjYiwgdGFnKTsKIAkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAodGFzay0+dWxkZF90YXNrKSB7CisJCQl9IGVsc2UgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywKIAkJCQkJCQlmbGFncyk7Ci0JCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0YXNrLCBjY2IsIHRhZyk7Ci0JCQkJbWIoKTsvKiBkaXR0byAqLwotCQkJCXNwaW5fdW5sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCQl0YXNrLT50YXNrX2RvbmUodGFzayk7Ci0JCQkJc3Bpbl9sb2NrX2lycSgmcG04MDAxX2hhLT5sb2NrKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAoIXRhc2stPnVsZGRfdGFzaykgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywKLQkJCQkJCQlmbGFncyk7Ci0JCQkJcG04MDAxX2NjYl90YXNrX2ZyZWUocG04MDAxX2hhLCB0YXNrLCBjY2IsIHRhZyk7Ci0JCQkJbWIoKTsvKmRpdHRvKi8KLQkJCQlzcGluX3VubG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7Ci0JCQkJdGFzay0+dGFza19kb25lKHRhc2spOwotCQkJCXNwaW5fbG9ja19pcnEoJnBtODAwMV9oYS0+bG9jayk7CisJCQkJcG04MDAxX2NjYl90YXNrX2ZyZWVfZG9uZShwbTgwMDFfaGEsIHRhc2ssCisJCQkJCQkJCWNjYiwgdGFnKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKaW5kZXggOTdkYWJkMy4uMTU4MDIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCkBAIC0zNzksMTQgKzM3OSw3IEBACiAjZGVmaW5lICBERUJVR19QUklOVF9OVlJBTQkwCiAjZGVmaW5lICBERUJVR19RTEExMjgwCQkwCiAKLS8qCi0gKiBUaGUgU0dJIFZJU1dTIGlzIGJyb2tlbiBhbmQgZG9lc24ndCBzdXBwb3J0IE1NSU8gOy0oCi0gKi8KLSNpZmRlZiBDT05GSUdfWDg2X1ZJU1dTCi0jZGVmaW5lCU1FTU9SWV9NQVBQRURfSU8JMAotI2Vsc2UKICNkZWZpbmUJTUVNT1JZX01BUFBFRF9JTwkxCi0jZW5kaWYKIAogI2luY2x1ZGUgInFsYTEyODAuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9NYWtlZmlsZQppbmRleCBmZjBmYzdjLi40NGRlZjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9NYWtlZmlsZQpAQCAtMSw2ICsxLDYgQEAKIHFsYTJ4eHgteSA6PSBxbGFfb3MubyBxbGFfaW5pdC5vIHFsYV9tYngubyBxbGFfaW9jYi5vIHFsYV9pc3IubyBxbGFfZ3MubyBcCiAJCXFsYV9kYmcubyBxbGFfc3VwLm8gcWxhX2F0dHIubyBxbGFfbWlkLm8gcWxhX2Rmcy5vIHFsYV9ic2cubyBcCi0gICAgICAgIHFsYV9ueC5vIHFsYV9tci5vIHFsYV9ueDIubyBxbGFfdGFyZ2V0Lm8KKwkJcWxhX254Lm8gcWxhX21yLm8gcWxhX254Mi5vIHFsYV90YXJnZXQubyBxbGFfdG1wbC5vCiAKIG9iai0kKENPTkZJR19TQ1NJX1FMQV9GQykgKz0gcWxhMnh4eC5vCiBvYmotJChDT05GSUdfVENNX1FMQTJYWFgpICs9IHRjbV9xbGEyeHh4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IDRhMGQ3YzkuLjA3YmVmY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMTQ3LDYgKzE0Nyw5MiBAQAogfTsKIAogc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfc3lzZnNfcmVhZF9md19kdW1wX3RlbXBsYXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCWlmICghaGEtPmZ3X2R1bXBfdGVtcGxhdGUgfHwgIWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbikKKwkJcmV0dXJuIDA7CisKKwlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MGUyLAorCSAgICAiY2h1bmsgPC0gb2ZmPSVsbHggY291bnQ9JXp4XG4iLCBvZmYsIGNvdW50KTsKKwlyZXR1cm4gbWVtb3J5X3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJm9mZiwKKwkgICAgaGEtPmZ3X2R1bXBfdGVtcGxhdGUsIGhhLT5md19kdW1wX3RlbXBsYXRlX2xlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX3N5c2ZzX3dyaXRlX2Z3X2R1bXBfdGVtcGxhdGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCSAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCisJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3Qgc2l6ZTsKKworCWlmIChvZmYgPT0gMCkgeworCQlpZiAoaGEtPmZ3X2R1bXApCisJCQl2ZnJlZShoYS0+ZndfZHVtcCk7CisJCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKworCQloYS0+ZndfZHVtcCA9IE5VTEw7CisJCWhhLT5md19kdW1wX2xlbiA9IDA7CisJCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwkJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKKworCQlzaXplID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX3NpemUoYnVmKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzBkMSwKKwkJICAgICItPiBhbGxvY2F0aW5nIGZ3ZHQgKCV4IGJ5dGVzKS4uLlxuIiwgc2l6ZSk7CisJCWhhLT5md19kdW1wX3RlbXBsYXRlID0gdm1hbGxvYyhzaXplKTsKKwkJaWYgKCFoYS0+ZndfZHVtcF90ZW1wbGF0ZSkgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzBkMiwKKwkJCSAgICAiRmFpbGVkIGFsbG9jYXRlIGZ3ZHQgKCV4IGJ5dGVzKS5cbiIsIHNpemUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gc2l6ZTsKKwl9CisKKwlpZiAob2ZmICsgY291bnQgPiBoYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4pIHsKKwkJY291bnQgPSBoYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gLSBvZmY7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwZDMsCisJCSAgICAiY2h1bmsgLT4gdHJ1bmNhdGluZyB0byAlenggYnl0ZXMuXG4iLCBjb3VudCk7CisJfQorCisJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzBkNCwKKwkgICAgImNodW5rIC0+IG9mZj0lbGx4IGNvdW50PSV6eFxuIiwgb2ZmLCBjb3VudCk7CisJbWVtY3B5KGhhLT5md19kdW1wX3RlbXBsYXRlICsgb2ZmLCBidWYsIGNvdW50KTsKKworCWlmIChvZmYgKyBjb3VudCA9PSBoYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4pIHsKKwkJc2l6ZSA9IHFsYTI3eHhfZndkdF9jYWxjdWxhdGVfZHVtcF9zaXplKHZoYSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwZDUsCisJCSAgICAiLT4gYWxsb2NhdGluZyBmd2R1bXAgKCV4IGJ5dGVzKS4uLlxuIiwgc2l6ZSk7CisJCWhhLT5md19kdW1wID0gdm1hbGxvYyhzaXplKTsKKwkJaWYgKCFoYS0+ZndfZHVtcCkgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzBkNiwKKwkJCSAgICAiRmFpbGVkIGFsbG9jYXRlIGZ3ZHVtcCAoJXggYnl0ZXMpLlxuIiwgc2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQloYS0+ZndfZHVtcF9sZW4gPSBzaXplOworCX0KKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzeXNmc19md19kdW1wX3RlbXBsYXRlX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gImZ3X2R1bXBfdGVtcGxhdGUiLAorCQkubW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSLAorCX0sCisJLnNpemUgPSAwLAorCS5yZWFkID0gcWxhMngwMF9zeXNmc19yZWFkX2Z3X2R1bXBfdGVtcGxhdGUsCisJLndyaXRlID0gcWxhMngwMF9zeXNmc193cml0ZV9md19kdW1wX3RlbXBsYXRlLAorfTsKKworc3RhdGljIHNzaXplX3QKIHFsYTJ4MDBfc3lzZnNfcmVhZF9udnJhbShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAogCQkJIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQpAQCAtMjQxLDEyICszMjcsMTcgQEAKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCiAJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3NpemVfdCBydmFsID0gMDsKIAogCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TUkVBRElORykKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gbWVtb3J5X3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJm9mZiwgaGEtPm9wdHJvbV9idWZmZXIsCi0JCQkJCWhhLT5vcHRyb21fcmVnaW9uX3NpemUpOworCW11dGV4X2xvY2soJmhhLT5vcHRyb21fbXV0ZXgpOworCXJ2YWwgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmb2ZmLCBoYS0+b3B0cm9tX2J1ZmZlciwKKwkgICAgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKKworCXJldHVybiBydmFsOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMjY1LDcgKzM1Niw5IEBACiAJaWYgKG9mZiArIGNvdW50ID4gaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSkKIAkJY291bnQgPSBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplIC0gb2ZmOwogCisJbXV0ZXhfbG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJbWVtY3B5KCZoYS0+b3B0cm9tX2J1ZmZlcltvZmZdLCBidWYsIGNvdW50KTsKKwltdXRleF91bmxvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMjg4LDEwICszODEsMTAgQEAKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCiAJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0KIAl1aW50MzJfdCBzdGFydCA9IDA7CiAJdWludDMyX3Qgc2l6ZSA9IGhhLT5vcHRyb21fc2l6ZTsKIAlpbnQgdmFsLCB2YWxpZDsKKwlzc2l6ZV90IHJ2YWwgPSBjb3VudDsKIAogCWlmIChvZmYpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzA0LDEyICszOTcsMTQgQEAKIAlpZiAoc3RhcnQgPiBoYS0+b3B0cm9tX3NpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV0ZXhfbG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJc3dpdGNoICh2YWwpIHsKIAljYXNlIDA6CiAJCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TUkVBRElORyAmJgotCQkgICAgaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dSSVRJTkcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQorCQkgICAgaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dSSVRJTkcpIHsKKwkJCXJ2YWwgPSAgLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7CiAKIAkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2MSwKQEAgLTMyMCw4ICs0MTUsMTAgQEAKIAkJaGEtPm9wdHJvbV9idWZmZXIgPSBOVUxMOwogCQlicmVhazsKIAljYXNlIDE6Ci0JCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV0FJVElORykKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dBSVRJTkcpIHsKKwkJCXJ2YWwgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KIAogCQloYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCA9IHN0YXJ0OwogCQloYS0+b3B0cm9tX3JlZ2lvbl9zaXplID0gc3RhcnQgKyBzaXplID4gaGEtPm9wdHJvbV9zaXplID8KQEAgLTMzNSwxMyArNDMyLDE1IEBACiAJCQkgICAgIigleCkuXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcnZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2MywKIAkJCSAgICAiSEJBIG5vdCBvbmxpbmUsIGZhaWxpbmcgTlZSQU0gdXBkYXRlLlxuIik7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJ2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDY0LApAQCAtMzUzLDggKzQ1MiwxMCBAQAogCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV0FJVElORykKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dBSVRJTkcpIHsKKwkJCXJ2YWwgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KIAogCQkvKgogCQkgKiBXZSBuZWVkIHRvIGJlIG1vcmUgcmVzdHJpY3RpdmUgb24gd2hpY2ggRkxBU0ggcmVnaW9ucyBhcmUKQEAgLTM4OCw3ICs0ODksOCBAQAogCQlpZiAoIXZhbGlkKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDY1LAogCQkJICAgICJJbnZhbGlkIHN0YXJ0IHJlZ2lvbiAweCV4LzB4JXguXG4iLCBzdGFydCwgc2l6ZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJ2YWwgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQloYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCA9IHN0YXJ0OwpAQCAtNDAzLDcgKzUwNSw4IEBACiAJCQkgICAgIigleClcbiIsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCiAJCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlydmFsID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2NywKQEAgLTQxMywxMyArNTE2LDE2IEBACiAJCW1lbXNldChoYS0+b3B0cm9tX2J1ZmZlciwgMCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXUklUSU5HKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV1JJVElORykgeworCQkJcnZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQogCiAJCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2OCwKIAkJCSAgICAiSEJBIG5vdCBvbmxpbmUsIGZhaWxpbmcgZmxhc2ggdXBkYXRlLlxuIik7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJ2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDY5LApAQCAtNDMwLDkgKzUzNiwxMiBAQAogCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcnZhbCA9IC1FSU5WQUw7CiAJfQotCXJldHVybiBjb3VudDsKKworb3V0OgorCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CisJcmV0dXJuIHJ2YWw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzeXNmc19vcHRyb21fY3RsX2F0dHIgPSB7CkBAIC04MjIsNiArOTMxLDcgQEAKIAlpbnQgaXM0R0JwX29ubHk7CiB9IGJpbl9maWxlX2VudHJpZXNbXSA9IHsKIAl7ICJmd19kdW1wIiwgJnN5c2ZzX2Z3X2R1bXBfYXR0ciwgfSwKKwl7ICJmd19kdW1wX3RlbXBsYXRlIiwgJnN5c2ZzX2Z3X2R1bXBfdGVtcGxhdGVfYXR0ciwgMHgyNyB9LAogCXsgIm52cmFtIiwgJnN5c2ZzX252cmFtX2F0dHIsIH0sCiAJeyAib3B0cm9tIiwgJnN5c2ZzX29wdHJvbV9hdHRyLCB9LAogCXsgIm9wdHJvbV9jdGwiLCAmc3lzZnNfb3B0cm9tX2N0bF9hdHRyLCB9LApAQCAtODQ3LDYgKzk1Nyw4IEBACiAJCQljb250aW51ZTsKIAkJaWYgKGl0ZXItPmlzNEdCcF9vbmx5ID09IDMgJiYgIShJU19DTkFfQ0FQQUJMRSh2aGEtPmh3KSkpCiAJCQljb250aW51ZTsKKwkJaWYgKGl0ZXItPmlzNEdCcF9vbmx5ID09IDB4MjcgJiYgIUlTX1FMQTI3WFgodmhhLT5odykpCisJCQljb250aW51ZTsKIAogCQlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLAogCQkgICAgaXRlci0+YXR0cik7CkBAIC0xMTg3LDcgKzEyOTksNyBAQAogCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCWlmICghSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpKQorCWlmICghSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpICYmICFJU19RTEEyN1hYKGhhKSkKIAkJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIlxuIik7CiAKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQuJTAyZC4lMDJkICglZClcbiIsCkBAIC0xMzkxLDYgKzE1MDMsMzcgQEAKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHNpemUpOwogfQogCitzdGF0aWMgc3NpemVfdAorcWxhMngwMF9hbGxvd19jbmFfZndfZHVtcF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKworCWlmICghSVNfUDNQX1RZUEUodmhhLT5odykpCisJCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCQkgICAgdmhhLT5ody0+YWxsb3dfY25hX2Z3X2R1bXAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfYWxsb3dfY25hX2Z3X2R1bXBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJaW50IHZhbCA9IDA7CisKKwlpZiAoIUlTX1AzUF9UWVBFKHZoYS0+aHcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdmFsKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZoYS0+aHctPmFsbG93X2NuYV9md19kdW1wID0gdmFsICE9IDA7CisKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihkcml2ZXJfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9kcnZyX3ZlcnNpb25fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZndfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9md192ZXJzaW9uX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHNlcmlhbF9udW0sIFNfSVJVR08sIHFsYTJ4MDBfc2VyaWFsX251bV9zaG93LCBOVUxMKTsKQEAgLTE0MzIsNiArMTU3NSw5IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoZGlhZ19yZXF1ZXN0cywgU19JUlVHTywgcWxhMngwMF9kaWFnX3JlcXVlc3RzX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGRpYWdfbWVnYWJ5dGVzLCBTX0lSVUdPLCBxbGEyeDAwX2RpYWdfbWVnYWJ5dGVzX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGZ3X2R1bXBfc2l6ZSwgU19JUlVHTywgcWxhMngwMF9md19kdW1wX3NpemVfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxsb3dfY25hX2Z3X2R1bXAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBxbGEyeDAwX2FsbG93X2NuYV9md19kdW1wX3Nob3csCisJCSAgIHFsYTJ4MDBfYWxsb3dfY25hX2Z3X2R1bXBfc3RvcmUpOwogCiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqcWxhMngwMF9ob3N0X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX2RyaXZlcl92ZXJzaW9uLApAQCAtMTQ2NCw2ICsxNjEwLDcgQEAKIAkmZGV2X2F0dHJfZGlhZ19yZXF1ZXN0cywKIAkmZGV2X2F0dHJfZGlhZ19tZWdhYnl0ZXMsCiAJJmRldl9hdHRyX2Z3X2R1bXBfc2l6ZSwKKwkmZGV2X2F0dHJfYWxsb3dfY25hX2Z3X2R1bXAsCiAJTlVMTCwKIH07CiAKQEAgLTE1MDksNiArMTY1Niw5IEBACiAJY2FzZSBQT1JUX1NQRUVEXzE2R0I6CiAJCXNwZWVkID0gRkNfUE9SVFNQRUVEXzE2R0JJVDsKIAkJYnJlYWs7CisJY2FzZSBQT1JUX1NQRUVEXzMyR0I6CisJCXNwZWVkID0gRkNfUE9SVFNQRUVEXzMyR0JJVDsKKwkJYnJlYWs7CiAJfQogCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gc3BlZWQ7CiB9CkBAIC0yMTYwLDYgKzIzMTAsOSBAQAogCWVsc2UgaWYgKElTX1FMQUZYMDAoaGEpKQogCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF84R0JJVCB8IEZDX1BPUlRTUEVFRF80R0JJVCB8CiAJCSAgICBGQ19QT1JUU1BFRURfMkdCSVQgfCBGQ19QT1JUU1BFRURfMUdCSVQ7CisJZWxzZSBpZiAoSVNfUUxBMjdYWChoYSkpCisJCXNwZWVkID0gRkNfUE9SVFNQRUVEXzMyR0JJVCB8IEZDX1BPUlRTUEVFRF8xNkdCSVQgfAorCQkgICAgRkNfUE9SVFNQRUVEXzhHQklUOwogCWVsc2UKIAkJc3BlZWQgPSBGQ19QT1JUU1BFRURfMUdCSVQ7CiAJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKHZoYS0+aG9zdCkgPSBzcGVlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYwppbmRleCBmMTVkMDNlLi43MWZmMzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCkBAIC0xNDM3LDkgKzE0MzcsMTIgQEAKIAlpZiAoaGEtPmZsYWdzLm5pY19jb3JlX3Jlc2V0X2hkbHJfYWN0aXZlKQogCQlyZXR1cm4gLUVCVVNZOwogCisJbXV0ZXhfbG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJcnZhbCA9IHFsYTJ4MDBfb3B0cm9tX3NldHVwKGJzZ19qb2IsIHZoYSwgMCk7Ci0JaWYgKHJ2YWwpCisJaWYgKHJ2YWwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAkJcmV0dXJuIHJ2YWw7CisJfQogCiAJaGEtPmlzcF9vcHMtPnJlYWRfb3B0cm9tKHZoYSwgaGEtPm9wdHJvbV9idWZmZXIsCiAJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKQEAgLTE0NTMsNiArMTQ1Niw3IEBACiAJdmZyZWUoaGEtPm9wdHJvbV9idWZmZXIpOwogCWhhLT5vcHRyb21fYnVmZmVyID0gTlVMTDsKIAloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOworCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJYnNnX2pvYi0+am9iX2RvbmUoYnNnX2pvYik7CiAJcmV0dXJuIHJ2YWw7CiB9CkBAIC0xNDY1LDkgKzE0NjksMTIgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgcnZhbCA9IDA7CiAKKwltdXRleF9sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAlydmFsID0gcWxhMngwMF9vcHRyb21fc2V0dXAoYnNnX2pvYiwgdmhhLCAxKTsKLQlpZiAocnZhbCkKKwlpZiAocnZhbCkgeworCQltdXRleF91bmxvY2soJmhhLT5vcHRyb21fbXV0ZXgpOwogCQlyZXR1cm4gcnZhbDsKKwl9CiAKIAkvKiBTZXQgdGhlIGlzcDgyeHhfbm9fbWRfY2FwIG5vdCB0byBjYXB0dXJlIG1pbmlkdW1wICovCiAJaGEtPmZsYWdzLmlzcDgyeHhfbm9fbWRfY2FwID0gMTsKQEAgLTE0ODMsNiArMTQ5MCw3IEBACiAJdmZyZWUoaGEtPm9wdHJvbV9idWZmZXIpOwogCWhhLT5vcHRyb21fYnVmZmVyID0gTlVMTDsKIAloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOworCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJYnNnX2pvYi0+am9iX2RvbmUoYnNnX2pvYik7CiAJcmV0dXJuIHJ2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKaW5kZXggZjYxMDNmNS4uOTcyNTVmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwpAQCAtMTEsMTMgKzExLDE1IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiB8ICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgfCAgIExhc3QgVmFsdWUgVXNlZCAgfCAgICAgSG9sZXMJfAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCBNb2R1bGUgSW5pdCBhbmQgUHJvYmUgICAgICAgIHwgICAgICAgMHgwMTViICAgICAgIHwgMHg0YiwweGJhLDB4ZmEgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgweDAxNWEJfAotICogfCBNYWlsYm94IGNvbW1hbmRzICAgICAgICAgICAgIHwgICAgICAgMHgxMTg3ICAgICAgIHwgMHgxMTFhLTB4MTExYiAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgxMTU1LTB4MTE1OCAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgxMDE4LTB4MTAxOSAgfAorICogfCBNb2R1bGUgSW5pdCBhbmQgUHJvYmUgICAgICAgIHwgICAgICAgMHgwMTdkICAgICAgIHwgMHgwMDRiLDB4MDE0MQl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDAxNDQsMHgwMTQ2CXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MDE1Yi0weDAxNjAJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgwMTZlLTB4MDE3MAl8CisgKiB8IE1haWxib3ggY29tbWFuZHMgICAgICAgICAgICAgfCAgICAgICAweDExODcgICAgICAgfCAweDEwMTgtMHgxMDE5CXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MTBjYSAgICAgICAgIHwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MTExNS0weDExMTYgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4MTBjYQkJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHgxMTFhLTB4MTExYgl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDExNTUtMHgxMTU4ICB8CiAgKiB8IERldmljZSBEaXNjb3ZlcnkgICAgICAgICAgICAgfCAgICAgICAweDIwOTUgICAgICAgfCAweDIwMjAtMHgyMDIyLCB8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDIwMTEtMHgyMDEyLCB8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDIwMTYgICAgICAgICB8CkBAIC0zMiwxOCArMzQsMTcgQEAKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NTA0NywweDUwNTIgIHwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NTA4NCwweDUwNzUJfAogICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg1MDNkLDB4NTA0NCAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHg1MDdiCQl8CiAgKiB8IFRpbWVyIFJvdXRpbmVzICAgICAgICAgICAgICAgfCAgICAgICAweDYwMTIgICAgICAgfCAgICAgICAgICAgICAgICB8Ci0gKiB8IFVzZXIgU3BhY2UgSW50ZXJhY3Rpb25zICAgICAgfCAgICAgICAweDcwZTEgICAgICAgfCAweDcwMTgsMHg3MDJlLCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwMjAsMHg3MDI0LCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwMzksMHg3MDQ1LCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwNzMtMHg3MDc1LCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwN2IsMHg3MDhjLCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwYTUsMHg3MGE2LCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwYTgsMHg3MGFiLCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwYWQtMHg3MGFlLCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwZDEtMHg3MGRiLCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwNDcsMHg3MDNiCXwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4NzBkZS0weDcwZGYsIHwKKyAqIHwgVXNlciBTcGFjZSBJbnRlcmFjdGlvbnMgICAgICB8ICAgICAgIDB4NzBlMiAgICAgICB8IDB4NzAxOCwweDcwMmUgIHwKKyAqIHwJCQkJICB8CQkgICAgICAgfCAweDcwMjAsMHg3MDI0ICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwMzksMHg3MDQ1ICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwNzMtMHg3MDc1ICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwYTUtMHg3MGE2ICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwYTgsMHg3MGFiICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwYWQtMHg3MGFlICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwZDctMHg3MGRiICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDcwZGUtMHg3MGRmICB8CiAgKiB8IFRhc2sgTWFuYWdlbWVudCAgICAgICAgICAgICAgfCAgICAgICAweDgwM2QgICAgICAgfCAweDgwMjUtMHg4MDI2ICB8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweDgwMGIsMHg4MDM5ICB8CiAgKiB8IEFFUi9FRUggICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweDkwMTEgICAgICAgfAkJfApAQCAtNTksNyArNjAsMTEgQEAKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4YjEzYy0weGIxNDAgIHwKICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4YjE0OQkJfAogICogfCBNdWx0aVEgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHhjMDBjICAgICAgIHwJCXwKLSAqIHwgTWlzYyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4ZDAxMCAgICAgICB8CQl8CisgKiB8IE1pc2MgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweGQyZmYgICAgICAgfCAweGQwMTctMHhkMDE5CXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4ZDAyMAkJfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgMHhkMDJlLTB4ZDBmZgl8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweGQxMDEtMHhkMWZlCXwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IDB4ZDIxMi0weGQyZmUJfAogICogfCBUYXJnZXQgTW9kZQkJICB8CSAgMHhlMDcwICAgICAgIHwgMHhlMDIxCQl8CiAgKiB8IFRhcmdldCBNb2RlIE1hbmFnZW1lbnQJICB8CSAgMHhmMDcyICAgICAgIHwgMHhmMDAyLTB4ZjAwMwl8CiAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAweGYwNDYtMHhmMDQ5ICB8CkBAIC0xMDQsNyArMTA5LDg3IEBACiAJcmV0dXJuIHB0ciArIChyc3AtPmxlbmd0aCAqIHNpemVvZihyZXNwb25zZV90KSk7CiB9CiAKLXN0YXRpYyBpbnQKK2ludAorcWxhMjd4eF9kdW1wX21waV9yYW0oc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgKnJhbSwKKwl1aW50MzJfdCByYW1fZHdvcmRzLCB2b2lkICoqbnh0KQoreworCWludCBydmFsOworCXVpbnQzMl90IGNudCwgc3RhdCwgdGltZXIsIGR3b3JkcywgaWR4OworCXVpbnQxNl90IG1iMCwgbWIxOworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OworCWRtYV9hZGRyX3QgZHVtcF9kbWEgPSBoYS0+Z2lkX2xpc3RfZG1hOworCXVpbnQzMl90ICpkdW1wID0gKHVpbnQzMl90ICopaGEtPmdpZF9saXN0OworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCW1iMCA9IDA7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDAsIE1CQ19MT0FEX0RVTVBfTVBJX1JBTSk7CisJY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwlkd29yZHMgPSBxbGEyeDAwX2dpZF9saXN0X3NpemUoaGEpIC8gNDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHJhbV9kd29yZHMgJiYgcnZhbCA9PSBRTEFfU1VDQ0VTUzsKKwkgICAgY250ICs9IGR3b3JkcywgYWRkciArPSBkd29yZHMpIHsKKwkJaWYgKGNudCArIGR3b3JkcyA+IHJhbV9kd29yZHMpCisJCQlkd29yZHMgPSByYW1fZHdvcmRzIC0gY250OworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MSwgTFNXKGFkZHIpKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g4LCBNU1coYWRkcikpOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MiwgTVNXKGR1bXBfZG1hKSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MywgTFNXKGR1bXBfZG1hKSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NiwgTVNXKE1TRChkdW1wX2RtYSkpKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g3LCBMU1coTVNEKGR1bXBfZG1hKSkpOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCwgTVNXKGR3b3JkcykpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDUsIExTVyhkd29yZHMpKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDksIDApOworCQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1NFVF9IT1NUX0lOVCk7CisKKwkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMDsKKwkJZm9yICh0aW1lciA9IDYwMDAwMDA7IHRpbWVyOyB0aW1lci0tKSB7CisJCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCQkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT5ob3N0X3N0YXR1cyk7CisJCQlpZiAoc3RhdCAmIEhTUlhfUklTQ19JTlQpIHsKKwkJCQlzdGF0ICY9IDB4ZmY7CisKKwkJCQlpZiAoc3RhdCA9PSAweDEgfHwgc3RhdCA9PSAweDIgfHwKKwkJCQkgICAgc3RhdCA9PSAweDEwIHx8IHN0YXQgPT0gMHgxMSkgeworCQkJCQlzZXRfYml0KE1CWF9JTlRFUlJVUFQsCisJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCQkJCW1iMCA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gwKTsKKwkJCQkJbWIxID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDEpOworCisJCQkJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwKKwkJCQkJICAgIEhDQ1JYX0NMUl9SSVNDX0lOVCk7CisJCQkJCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogQ2xlYXIgdGhpcyBpbnRyOyBpdCB3YXNuJ3QgYSBtYWlsYm94IGludHIgKi8KKwkJCQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX0NMUl9SSVNDX0lOVCk7CisJCQkJUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOworCQkJfQorCQkJdWRlbGF5KDUpOworCQl9CisJCWhhLT5mbGFncy5tYm94X2ludCA9IDE7CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpKSB7CisJCQlydmFsID0gbWIwICYgTUJTX01BU0s7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGR3b3JkczsgaWR4KyspCisJCQkJcmFtW2NudCArIGlkeF0gPSBJU19RTEEyN1hYKGhhKSA/CisJCQkJICAgIGxlMzJfdG9fY3B1KGR1bXBbaWR4XSkgOiBzd2FiMzIoZHVtcFtpZHhdKTsKKwkJfSBlbHNlIHsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9CisJfQorCisJKm54dCA9IHJ2YWwgPT0gUUxBX1NVQ0NFU1MgPyAmcmFtW2NudF0gOiBOVUxMOworCXJldHVybiBydmFsOworfQorCitpbnQKIHFsYTI0eHhfZHVtcF9yYW0oc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgKnJhbSwKICAgICB1aW50MzJfdCByYW1fZHdvcmRzLCB2b2lkICoqbnh0KQogewpAQCAtMTM5LDYgKzIyNCw3IEBACiAJCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NSwgTFNXKGR3b3JkcykpOwogCQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1NFVF9IT1NUX0lOVCk7CiAKKwkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMDsKIAkJZm9yICh0aW1lciA9IDYwMDAwMDA7IHRpbWVyOyB0aW1lci0tKSB7CiAJCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLwogCQkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT5ob3N0X3N0YXR1cyk7CkBAIC0xNjQsMTEgKzI1MCwxMyBAQAogCQkJfQogCQkJdWRlbGF5KDUpOwogCQl9CisJCWhhLT5mbGFncy5tYm94X2ludCA9IDE7CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpKSB7CiAJCQlydmFsID0gbWIwICYgTUJTX01BU0s7CiAJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGR3b3JkczsgaWR4KyspCi0JCQkJcmFtW2NudCArIGlkeF0gPSBzd2FiMzIoZHVtcFtpZHhdKTsKKwkJCQlyYW1bY250ICsgaWR4XSA9IElTX1FMQTI3WFgoaGEpID8KKwkJCQkgICAgbGUzMl90b19jcHUoZHVtcFtpZHhdKSA6IHN3YWIzMihkdW1wW2lkeF0pOwogCQl9IGVsc2UgewogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0KQEAgLTIwOCw3ICsyOTYsNyBAQAogCXJldHVybiBidWY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitpbnQKIHFsYTI0eHhfcGF1c2VfcmlzYyhzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZykKIHsKIAlpbnQgcnZhbCA9IFFMQV9TVUNDRVNTOwpAQCAtMjI3LDcgKzMxNSw3IEBACiAJcmV0dXJuIHJ2YWw7CiB9CiAKLXN0YXRpYyBpbnQKK2ludAogcWxhMjR4eF9zb2Z0X3Jlc2V0KHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJaW50IHJ2YWwgPSBRTEFfU1VDQ0VTUzsKQEAgLTUzNyw3ICs2MjUsNyBAQAogCXN0cnVjdCBxbGEyeHh4X21xX2NoYWluICptcSA9IHB0cjsKIAlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOwogCi0JaWYgKCFoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkpCisJaWYgKCFoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCXJldHVybiBwdHI7CiAKIAltcSA9IHB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAppbmRleCAzNWUyMGI0Li5jYzk2MTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCkBAIC0zNDgsMyArMzQ4LDEwIEBACiAjZGVmaW5lIHFsX2RiZ190Z3QJMHgwMDAwNDAwMCAvKiBUYXJnZXQgbW9kZSAqLwogI2RlZmluZSBxbF9kYmdfdGd0X21ndAkweDAwMDAyMDAwIC8qIFRhcmdldCBtb2RlIG1hbmFnZW1lbnQgKi8KICNkZWZpbmUgcWxfZGJnX3RndF90bXIJMHgwMDAwMTAwMCAvKiBUYXJnZXQgbW9kZSB0YXNrIG1hbmFnZW1lbnQgKi8KKworZXh0ZXJuIGludCBxbGEyN3h4X2R1bXBfbXBpX3JhbShzdHJ1Y3QgcWxhX2h3X2RhdGEgKiwgdWludDMyX3QsIHVpbnQzMl90ICosCisJdWludDMyX3QsIHZvaWQgKiopOworZXh0ZXJuIGludCBxbGEyNHh4X2R1bXBfcmFtKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCB1aW50MzJfdCwgdWludDMyX3QgKiwKKwl1aW50MzJfdCwgdm9pZCAqKik7CitleHRlcm4gaW50IHFsYTI0eHhfcGF1c2VfcmlzYyhzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKik7CitleHRlcm4gaW50IHFsYTI0eHhfc29mdF9yZXNldChzdHJ1Y3QgcWxhX2h3X2RhdGEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKaW5kZXggMjY2NzI0Yi4uNmExMDYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaApAQCAtNjU0LDcgKzY1NCw3IEBACiAJCXN0cnVjdCBkZXZpY2VfcmVnXzI1eHhtcSBpc3AyNW1xOwogCQlzdHJ1Y3QgZGV2aWNlX3JlZ184Mnh4IGlzcDgyOwogCQlzdHJ1Y3QgZGV2aWNlX3JlZ19meDAwIGlzcGZ4MDA7Ci19IGRldmljZV9yZWdfdDsKK30gX19pb21lbSBkZXZpY2VfcmVnX3Q7CiAKICNkZWZpbmUgSVNQX1JFUV9RX0lOKGhhLCByZWcpIFwKIAkoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkgPyBcCkBAIC04MDgsNyArODA4LDcgQEAKIAkJCQkJICAgTm90aWZpY2F0aW9uICovCiAjZGVmaW5lIE1CQV9GV19QT0xMX1NUQVRFCTB4ODYwMCAgLyogRmlybXdhcmUgaW4gcG9sbCBkaWFnbm9zdGljIHN0YXRlICovCiAjZGVmaW5lIE1CQV9GV19SRVNFVF9GQ1QJMHg4NTAyCS8qIEZpcm13YXJlIHJlc2V0IGZhY3RvcnkgZGVmYXVsdHMgKi8KLQorI2RlZmluZSBNQkFfRldfSU5JVF9JTlBST0dSRVNTCTB4ODUwMAkvKiBGaXJtd2FyZSBib290IGluIHByb2dyZXNzICovCiAvKiA4M1hYIEZDb0Ugc3BlY2lmaWMgKi8KICNkZWZpbmUgTUJBX0lEQ19BRU4JCTB4ODIwMCAgLyogRkNvRTogTklDIENvcmUgc3RhdGUgY2hhbmdlIEFFTiAqLwogCkBAIC05MzgsNiArOTM4LDcgQEAKICAqLwogI2RlZmluZSBNQkNfV1JJVEVfU0VSREVTCQkweDMJLyogV3JpdGUgc2VyZGVzIHdvcmQuICovCiAjZGVmaW5lIE1CQ19SRUFEX1NFUkRFUwkJCTB4NAkvKiBSZWFkIHNlcmRlcyB3b3JkLiAqLworI2RlZmluZSBNQkNfTE9BRF9EVU1QX01QSV9SQU0JCTB4NQkvKiBMb2FkL0R1bXAgTVBJIFJBTS4gKi8KICNkZWZpbmUgTUJDX1NFUkRFU19QQVJBTVMJCTB4MTAJLyogU2VyZGVzIFR4IFBhcmFtZXRlcnMuICovCiAjZGVmaW5lIE1CQ19HRVRfSU9DQl9TVEFUVVMJCTB4MTIJLyogR2V0IElPQ0Igc3RhdHVzIGNvbW1hbmQuICovCiAjZGVmaW5lIE1CQ19QT1JUX1BBUkFNUwkJCTB4MUEJLyogUG9ydCBpRE1BIFBhcmFtZXRlcnMuICovCkBAIC0xMTk3LDMwICsxMTk4LDYgQEAKIAl1aW50OF90ICByZXNlcnZlZF8zWzI2XTsKIH0gaW5pdF9jYl90OwogCi0KLXN0cnVjdCBpbml0X2NiX2Z4IHsKLQl1aW50MTZfdAl2ZXJzaW9uOwotCXVpbnQxNl90CXJlc2VydmVkXzFbMTNdOwotCV9fbGUxNgkJcmVxdWVzdF9xX291dHBvaW50ZXI7Ci0JX19sZTE2CQlyZXNwb25zZV9xX2lucG9pbnRlcjsKLQl1aW50MTZfdAlyZXNlcnZlZF8yWzJdOwotCV9fbGUxNgkJcmVzcG9uc2VfcV9sZW5ndGg7Ci0JX19sZTE2CQlyZXF1ZXN0X3FfbGVuZ3RoOwotCXVpbnQxNl90CXJlc2VydmVkXzNbMl07Ci0JX19sZTMyCQlyZXF1ZXN0X3FfYWRkcmVzc1syXTsKLQlfX2xlMzIJCXJlc3BvbnNlX3FfYWRkcmVzc1syXTsKLQl1aW50MTZfdAlyZXNlcnZlZF80WzRdOwotCXVpbnQ4X3QJCXJlc3BvbnNlX3FfbXNpdmVjOwotCXVpbnQ4X3QJCXJlc2VydmVkXzVbMTldOwotCXVpbnQxNl90CWludGVycnVwdF9kZWxheV90aW1lcjsKLQl1aW50MTZfdAlyZXNlcnZlZF82OwotCXVpbnQzMl90CWZ3b3B0aW9uczE7Ci0JdWludDMyX3QJZndvcHRpb25zMjsKLQl1aW50MzJfdAlmd29wdGlvbnMzOwotCXVpbnQ4X3QJCXJlc2VydmVkXzdbMjRdOwotfTsKLQotCiAvKgogICogR2V0IExpbmsgU3RhdHVzIG1haWxib3ggY29tbWFuZCByZXR1cm4gYnVmZmVyLgogICovCkBAIC0yMTcyLDYgKzIxNDksNyBAQAogI2RlZmluZSBGRE1JX1BPUlRfU1BFRURfNEdCCQkweDgKICNkZWZpbmUgRkRNSV9QT1JUX1NQRUVEXzhHQgkJMHgxMAogI2RlZmluZSBGRE1JX1BPUlRfU1BFRURfMTZHQgkJMHgyMAorI2RlZmluZSBGRE1JX1BPUlRfU1BFRURfMzJHQgkJMHg0MAogI2RlZmluZSBGRE1JX1BPUlRfU1BFRURfVU5LTk9XTgkJMHg4MDAwCiAKIHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciB7CkBAIC0yNjgwLDcgKzI2NTgsNyBAQAogI2RlZmluZSBRTEFfTVFfU0laRSAzMgogI2RlZmluZSBRTEFfTUFYX1FVRVVFUyAyNTYKICNkZWZpbmUgSVNQX1FVRV9SRUcoaGEsIGlkKSBcCi0JKChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkpID8gXAorCSgoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSA/IFwKIAkgKCh2b2lkIF9faW9tZW0gKiloYS0+bXFpb2Jhc2UgKyAoUUxBX1FVRV9QQUdFICogaWQpKSA6XAogCSAoKHZvaWQgX19pb21lbSAqKWhhLT5pb2Jhc2UpKQogI2RlZmluZSBRTEFfUkVRX1FVRV9JRCh0YWcpIFwKQEAgLTI4MTgsNyArMjc5Niw2IEBACiAJCXVpbnQzMl90CWZhY19zdXBwb3J0ZWQJCToxOwogCiAJCXVpbnQzMl90CWNoaXBfcmVzZXRfZG9uZQkJOjE7Ci0JCXVpbnQzMl90CXBvcnQwCQkJOjE7CiAJCXVpbnQzMl90CXJ1bm5pbmdfZ29sZF9mdwkJOjE7CiAJCXVpbnQzMl90CWVlaF9idXN5CQk6MTsKIAkJdWludDMyX3QJY3B1X2FmZmluaXR5X2VuYWJsZWQJOjE7CkBAIC0yODQ5LDcgKzI4MjYsNyBAQAogCXNwaW5sb2NrX3QJaGFyZHdhcmVfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAJaW50CQliYXJzOwogCWludAkJbWVtX29ubHk7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKmlvYmFzZTsgICAgICAgICAgIC8qIEJhc2UgSS9PIGFkZHJlc3MgKi8KKwlkZXZpY2VfcmVnX3QgKmlvYmFzZTsgICAgICAgICAgIC8qIEJhc2UgSS9PIGFkZHJlc3MgKi8KIAlyZXNvdXJjZV9zaXplX3QgcGlvX2FkZHJlc3M7CiAKICNkZWZpbmUgTUlOX0lPQkFTRV9MRU4gICAgICAgICAgMHgxMDAKQEAgLTI4NjgsOCArMjg0NSw4IEBACiAJdWludDMyX3QJCXJzcF9xdWVfb2ZmOwogCiAJLyogTXVsdGkgcXVldWUgZGF0YSBzdHJ1Y3RzICovCi0JZGV2aWNlX3JlZ190IF9faW9tZW0gKm1xaW9iYXNlOwotCWRldmljZV9yZWdfdCBfX2lvbWVtICptc2l4YmFzZTsKKwlkZXZpY2VfcmVnX3QgKm1xaW9iYXNlOworCWRldmljZV9yZWdfdCAqbXNpeGJhc2U7CiAJdWludDE2X3QgICAgICAgIG1zaXhfY291bnQ7CiAJdWludDhfdCAgICAgICAgIG1xZW5hYmxlOwogCXN0cnVjdCByZXFfcXVlICoqcmVxX3FfbWFwOwpAQCAtMjkwNSw2ICsyODgyLDcgQEAKICNkZWZpbmUgUE9SVF9TUEVFRF80R0IgIDB4MDMKICNkZWZpbmUgUE9SVF9TUEVFRF84R0IgIDB4MDQKICNkZWZpbmUgUE9SVF9TUEVFRF8xNkdCIDB4MDUKKyNkZWZpbmUgUE9SVF9TUEVFRF8zMkdCIDB4MDYKICNkZWZpbmUgUE9SVF9TUEVFRF8xMEdCCTB4MTMKIAl1aW50MTZfdAlsaW5rX2RhdGFfcmF0ZTsgICAgICAgICAvKiBGL1cgb3BlcmF0aW5nIHNwZWVkICovCiAKQEAgLTI5MjgsNiArMjkwNiw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMDEJMHg4MDAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMzEJMHg4MDMxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIwMzEJMHgyMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIwNzEJMHgyMDcxCiAJdWludDMyX3QJZGV2aWNlX3R5cGU7CiAjZGVmaW5lIERUX0lTUDIxMDAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKICNkZWZpbmUgRFRfSVNQMjIwMCAgICAgICAgICAgICAgICAgICAgICBCSVRfMQpAQCAtMjk0OCw3ICsyOTI3LDggQEAKICNkZWZpbmUgRFRfSVNQODAzMQkJCUJJVF8xNgogI2RlZmluZSBEVF9JU1BGWDAwCQkJQklUXzE3CiAjZGVmaW5lIERUX0lTUDgwNDQJCQlCSVRfMTgKLSNkZWZpbmUgRFRfSVNQX0xBU1QJCQkoRFRfSVNQODA0NCA8PCAxKQorI2RlZmluZSBEVF9JU1AyMDcxCQkJQklUXzE5CisjZGVmaW5lIERUX0lTUF9MQVNUCQkJKERUX0lTUDIwNzEgPDwgMSkKIAogI2RlZmluZSBEVF9UMTBfUEkgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNQogI2RlZmluZSBEVF9JSURNQSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNgpAQCAtMjk3OCw2ICsyOTU4LDcgQEAKICNkZWZpbmUgSVNfUUxBMjAzMShoYSkJKERUX01BU0soaGEpICYgRFRfSVNQMjAzMSkKICNkZWZpbmUgSVNfUUxBODAzMShoYSkJKERUX01BU0soaGEpICYgRFRfSVNQODAzMSkKICNkZWZpbmUgSVNfUUxBRlgwMChoYSkJKERUX01BU0soaGEpICYgRFRfSVNQRlgwMCkKKyNkZWZpbmUgSVNfUUxBMjA3MShoYSkJKERUX01BU0soaGEpICYgRFRfSVNQMjA3MSkKIAogI2RlZmluZSBJU19RTEEyM1hYKGhhKSAgKElTX1FMQTIzMDAoaGEpIHx8IElTX1FMQTIzMTIoaGEpIHx8IElTX1FMQTIzMjIoaGEpIHx8IFwKIAkJCUlTX1FMQTYzMTIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKQpAQCAtMjk4Niw2ICsyOTY3LDcgQEAKICNkZWZpbmUgSVNfUUxBMjVYWChoYSkgIChJU19RTEEyNTMyKGhhKSkKICNkZWZpbmUgSVNfUUxBODNYWChoYSkJKElTX1FMQTIwMzEoaGEpIHx8IElTX1FMQTgwMzEoaGEpKQogI2RlZmluZSBJU19RTEE4NFhYKGhhKSAgKElTX1FMQTg0MzIoaGEpKQorI2RlZmluZSBJU19RTEEyN1hYKGhhKSAgKElTX1FMQTIwNzEoaGEpKQogI2RlZmluZSBJU19RTEEyNFhYX1RZUEUoaGEpICAgICAoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBNTRYWChoYSkgfHwgXAogCQkJCUlTX1FMQTg0WFgoaGEpKQogI2RlZmluZSBJU19DTkFfQ0FQQUJMRShoYSkJKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgyWFgoaGEpIHx8IFwKQEAgLTI5OTQsMTEgKzI5NzYsMTMgQEAKICNkZWZpbmUgSVNfUUxBMlhYWF9NSURUWVBFKGhhKQkoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBODRYWChoYSkgfHwgXAogCQkJCUlTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpIHx8IFwKIAkJCQlJU19RTEE4MlhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSB8fCBcCi0JCQkJSVNfUUxBODA0NChoYSkpCisJCQkJSVNfUUxBODA0NChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAjZGVmaW5lIElTX01TSVhfTkFDS19DQVBBQkxFKGhhKSAoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkpCiAjZGVmaW5lIElTX05PUE9MTElOR19UWVBFKGhhKQkoSVNfUUxBODFYWChoYSkgJiYgKGhhKS0+ZmxhZ3MubXNpeF9lbmFibGVkKQotI2RlZmluZSBJU19GQUNfUkVRVUlSRUQoaGEpCShJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSkKLSNkZWZpbmUgSVNfTk9DQUNIRV9WUERfVFlQRShoYSkJKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpKQorI2RlZmluZSBJU19GQUNfUkVRVUlSRUQoaGEpCShJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSB8fCBcCisJCQkJSVNfUUxBMjdYWChoYSkpCisjZGVmaW5lIElTX05PQ0FDSEVfVlBEX1RZUEUoaGEpCShJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSB8fCBcCisJCQkJSVNfUUxBMjdYWChoYSkpCiAjZGVmaW5lIElTX0FMT0dJT19DQVBBQkxFKGhhKQkoSVNfUUxBMjNYWChoYSkgfHwgSVNfRldJMl9DQVBBQkxFKGhhKSkKIAogI2RlZmluZSBJU19UMTBfUElfQ0FQQUJMRShoYSkgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9UMTBfUEkpCkBAIC0zMDA4LDcgKzI5OTIsOCBAQAogI2RlZmluZSBJU19PRU1fMDAxKGhhKSAgICAgICAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9PRU1fMDAxKQogI2RlZmluZSBIQVNfRVhURU5ERURfSURTKGhhKSAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9FWFRFTkRFRF9JRFMpCiAjZGVmaW5lIElTX0NUNl9TVVBQT1JURUQoaGEpCSgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX0NUNl9TVVBQT1JURUQpCi0jZGVmaW5lIElTX01RVUVfQ0FQQUJMRShoYSkJKChoYSktPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpKQorI2RlZmluZSBJU19NUVVFX0NBUEFCTEUoaGEpCSgoaGEpLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSB8fCBcCisJCQkJSVNfUUxBMjdYWChoYSkpCiAjZGVmaW5lIElTX0JJRElfQ0FQQUJMRShoYSkJKChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEEyMDMxKGhhKSkpCiAvKiBCaXQgMjEgb2YgZndfYXR0cmlidXRlcyBkZWNpZGVzIHRoZSBNQ1RQIGNhcGFiaWxpdGllcyAqLwogI2RlZmluZSBJU19NQ1RQX0NBUEFCTEUoaGEpCShJU19RTEEyMDMxKGhhKSAmJiBcCkBAIC0zMTMzLDYgKzMxMTgsOSBAQAogCXVpbnQxNl90CWZ3X3hjYl9jb3VudDsKIAl1aW50MTZfdAlmd19pb2NiX2NvdW50OwogCisJdWludDMyX3QJZndfc2hhcmVkX3JhbV9zdGFydDsKKwl1aW50MzJfdAlmd19zaGFyZWRfcmFtX2VuZDsKKwogCXVpbnQxNl90CWZ3X29wdGlvbnNbMTZdOyAgICAgICAgIC8qIHNsb3RzOiAxLDIsMywxMCwxMSAqLwogCXVpbnQ4X3QJCWZ3X3NlcmlhbGxpbmtfb3B0aW9uc1s0XTsKIAl1aW50MTZfdAlmd19zZXJpYWxsaW5rX29wdGlvbnMyNFs0XTsKQEAgLTMxNDEsNiArMzEyOSw5IEBACiAJdWludDMyX3QJbXBpX2NhcGFiaWxpdGllczsKIAl1aW50OF90CQlwaHlfdmVyc2lvblszXTsKIAorCS8qIEZpcm13YXJlIGR1bXAgdGVtcGxhdGUgKi8KKwl2b2lkCQkqZndfZHVtcF90ZW1wbGF0ZTsKKwl1aW50MzJfdAlmd19kdW1wX3RlbXBsYXRlX2xlbjsKIAkvKiBGaXJtd2FyZSBkdW1wIGluZm9ybWF0aW9uLiAqLwogCXN0cnVjdCBxbGEyeHh4X2Z3X2R1bXAgKmZ3X2R1bXA7CiAJdWludDMyX3QJZndfZHVtcF9sZW47CkBAIC0zMTgzLDYgKzMxNzQsNyBAQAogI2RlZmluZSBRTEFfU1dSSVRJTkcJMgogCXVpbnQzMl90CW9wdHJvbV9yZWdpb25fc3RhcnQ7CiAJdWludDMyX3QJb3B0cm9tX3JlZ2lvbl9zaXplOworCXN0cnVjdCBtdXRleAlvcHRyb21fbXV0ZXg7CiAKIC8qIFBDSSBleHBhbnNpb24gUk9NIGltYWdlIGluZm9ybWF0aW9uLiAqLwogI2RlZmluZSBST01fQ09ERV9UWVBFX0JJT1MJMApAQCAtMzMwOSw2ICszMzAxLDcgQEAKIAlzdHJ1Y3QgbXJfZGF0YV9meDAwIG1yOwogCiAJc3RydWN0IHFsdF9od19kYXRhIHRndDsKKwlpbnQJYWxsb3dfY25hX2Z3X2R1bXA7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCmluZGV4IDc5MmEyOTIuLjMyYWI4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKQEAgLTExNCw3ICsxMTQsOCBAQAogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpKQorCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSAmJgorCSAgICAhSVNfUUxBMjdYWChoYSkpCiAJCWdvdG8gb3V0OwogCWlmICghaGEtPmZjZSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCmluZGV4IDYxMGQzYWE5Li4zYTczNTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaApAQCAtMTM3OCw2ICsxMzc4LDEwIEBACiAjZGVmaW5lIEZMVF9SRUdfTlZSQU1fMAkJMHgxNQogI2RlZmluZSBGTFRfUkVHX1ZQRF8xCQkweDE2CiAjZGVmaW5lIEZMVF9SRUdfTlZSQU1fMQkJMHgxNworI2RlZmluZSBGTFRfUkVHX1ZQRF8yCQkweEQ0CisjZGVmaW5lIEZMVF9SRUdfTlZSQU1fMgkJMHhENQorI2RlZmluZSBGTFRfUkVHX1ZQRF8zCQkweEQ2CisjZGVmaW5lIEZMVF9SRUdfTlZSQU1fMwkJMHhENwogI2RlZmluZSBGTFRfUkVHX0ZEVAkJMHgxYQogI2RlZmluZSBGTFRfUkVHX0ZMVAkJMHgxYwogI2RlZmluZSBGTFRfUkVHX0hXX0VWRU5UXzAJMHgxZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCmluZGV4IDFmNDI2NjIuLmU2NjVlODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKQEAgLTMzMCw2ICszMzAsNyBAQAogICAgIGRtYV9hZGRyX3QpOwogCiBleHRlcm4gaW50IHFsYTI0eHhfYWJvcnRfY29tbWFuZChzcmJfdCAqKTsKK2V4dGVybiBpbnQgcWxhMjR4eF9hc3luY19hYm9ydF9jb21tYW5kKHNyYl90ICopOwogZXh0ZXJuIGludAogcWxhMjR4eF9hYm9ydF90YXJnZXQoc3RydWN0IGZjX3BvcnQgKiwgdW5zaWduZWQgaW50LCBpbnQpOwogZXh0ZXJuIGludApAQCAtNTExLDYgKzUxMiwxNiBAQAogZXh0ZXJuIHZvaWQgcWxhMjR4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgcWxhMjV4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgcWxhODF4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcWxhODJ4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgcWxhODA0NF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworCitleHRlcm4gdm9pZCBxbGEyN3h4X2Z3ZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKK2V4dGVybiB1bG9uZyBxbGEyN3h4X2Z3ZHRfY2FsY3VsYXRlX2R1bXBfc2l6ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK2V4dGVybiBpbnQgcWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKHZvaWQgKik7CitleHRlcm4gdWxvbmcgcWxhMjd4eF9md2R0X3RlbXBsYXRlX3NpemUodm9pZCAqKTsKK2V4dGVybiBjb25zdCB2b2lkICpxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdCh2b2lkKTsKK2V4dGVybiB1bG9uZyBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdF9zaXplKHZvaWQpOworCiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfcmVncyhzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfYnVmZmVyKHVpbnQ4X3QgKiwgdWludDMyX3QpOwogZXh0ZXJuIHZvaWQgcWxhMngwMF9kdW1wX2J1ZmZlcl96aXBwZWQodWludDhfdCAqLCB1aW50MzJfdCk7CkBAIC01OTQsNyArNjA1LDYgQEAKIGV4dGVybiBpcnFyZXR1cm5fdCBxbGFmeDAwX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKik7CiBleHRlcm4gdm9pZCBxbGFmeDAwX2VuYWJsZV9pbnRycyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKik7CiBleHRlcm4gdm9pZCBxbGFmeDAwX2Rpc2FibGVfaW50cnMoc3RydWN0IHFsYV9od19kYXRhICopOwotZXh0ZXJuIGludCBxbGFmeDAwX2Fib3J0X2NvbW1hbmQoc3JiX3QgKik7CiBleHRlcm4gaW50IHFsYWZ4MDBfYWJvcnRfdGFyZ2V0KGZjX3BvcnRfdCAqLCB1bnNpZ25lZCBpbnQsIGludCk7CiBleHRlcm4gaW50IHFsYWZ4MDBfbHVuX3Jlc2V0KGZjX3BvcnRfdCAqLCB1bnNpZ25lZCBpbnQsIGludCk7CiBleHRlcm4gaW50IHFsYWZ4MDBfc3RhcnRfc2NzaShzcmJfdCAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKaW5kZXggY2Q0N2YxYi4uZTM3N2Y5ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCkBAIC0xNTMyLDYgKzE1MzIsMTAgQEAKIAlpZiAoSVNfQ05BX0NBUEFCTEUoaGEpKQogCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKAogCQkgICAgRkRNSV9QT1JUX1NQRUVEXzEwR0IpOworCWVsc2UgaWYgKElTX1FMQTI3WFgoaGEpKQorCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKAorCQkgICAgRkRNSV9QT1JUX1NQRUVEXzMyR0J8RkRNSV9QT1JUX1NQRUVEXzE2R0J8CisJCSAgICBGRE1JX1BPUlRfU1BFRURfOEdCKTsKIAllbHNlIGlmIChJU19RTEEyNVhYKGhhKSkKIAkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigKIAkJICAgIEZETUlfUE9SVF9TUEVFRF8xR0J8RkRNSV9QT1JUX1NQRUVEXzJHQnwKQEAgLTE1ODAsNiArMTU4NCwxMCBAQAogCQllaXRlci0+YS5jdXJfc3BlZWQgPQogCQkgICAgX19jb25zdGFudF9jcHVfdG9fYmUzMihGRE1JX1BPUlRfU1BFRURfMTZHQik7CiAJCWJyZWFrOworCWNhc2UgUE9SVF9TUEVFRF8zMkdCOgorCQllaXRlci0+YS5jdXJfc3BlZWQgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fYmUzMihGRE1JX1BPUlRfU1BFRURfMzJHQik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVpdGVyLT5hLmN1cl9zcGVlZCA9CiAJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfUE9SVF9TUEVFRF9VTktOT1dOKTsKQEAgLTE4ODksNiArMTg5Nyw5IEBACiAJCQljYXNlIEJJVF8xMDoKIAkJCQlsaXN0W2ldLmZwX3NwZWVkID0gUE9SVF9TUEVFRF8xNkdCOwogCQkJCWJyZWFrOworCQkJY2FzZSBCSVRfODoKKwkJCQlsaXN0W2ldLmZwX3NwZWVkID0gUE9SVF9TUEVFRF8zMkdCOworCQkJCWJyZWFrOwogCQkJfQogCiAJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDViLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKaW5kZXggZTdlNWY0Zi4uMzhhZWI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC0yNzEsNTYgKzI3MSw0NiBAQAogfQogCiBzdGF0aWMgdm9pZAotcWxhMngwMF9hc3luY190bV9jbWRfZG9uZSh2b2lkICpkYXRhLCB2b2lkICpwdHIsIGludCByZXMpCitxbGEyeDAwX3RtZl9pb2NiX3RpbWVvdXQodm9pZCAqZGF0YSkKK3sKKwlzcmJfdCAqc3AgPSAoc3JiX3QgKilkYXRhOworCXN0cnVjdCBzcmJfaW9jYiAqdG1mID0gJnNwLT51LmlvY2JfY21kOworCisJdG1mLT51LnRtZi5jb21wX3N0YXR1cyA9IENTX1RJTUVPVVQ7CisJY29tcGxldGUoJnRtZi0+dS50bWYuY29tcCk7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyeDAwX3RtZl9zcF9kb25lKHZvaWQgKmRhdGEsIHZvaWQgKnB0ciwgaW50IHJlcykKIHsKIAlzcmJfdCAqc3AgPSAoc3JiX3QgKilwdHI7Ci0Jc3RydWN0IHNyYl9pb2NiICppb2NiID0gJnNwLT51LmlvY2JfY21kOwotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSAoc2NzaV9xbGFfaG9zdF90ICopZGF0YTsKLQl1aW50MzJfdCBmbGFnczsKLQl1aW50MTZfdCBsdW47Ci0JaW50IHJ2YWw7Ci0KLQlpZiAoIXRlc3RfYml0KFVOTE9BRElORywgJnZoYS0+ZHBjX2ZsYWdzKSkgewotCQlmbGFncyA9IGlvY2ItPnUudG1mLmZsYWdzOwotCQlsdW4gPSAodWludDE2X3QpaW9jYi0+dS50bWYubHVuOwotCi0JCS8qIElzc3VlIE1hcmtlciBJT0NCICovCi0JCXJ2YWwgPSBxbGEyeDAwX21hcmtlcih2aGEsIHZoYS0+aHctPnJlcV9xX21hcFswXSwKLQkJCXZoYS0+aHctPnJzcF9xX21hcFswXSwgc3AtPmZjcG9ydC0+bG9vcF9pZCwgbHVuLAotCQkJZmxhZ3MgPT0gVENGX0xVTl9SRVNFVCA/IE1LX1NZTkNfSURfTFVOIDogTUtfU1lOQ19JRCk7Ci0KLQkJaWYgKChydmFsICE9IFFMQV9TVUNDRVNTKSB8fCBpb2NiLT51LnRtZi5kYXRhKSB7Ci0JCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAzMCwKLQkJCSAgICAiVE0gSU9DQiBmYWlsZWQgKCV4KS5cbiIsIHJ2YWwpOwotCQl9Ci0JfQotCXNwLT5mcmVlKHNwLT5mY3BvcnQtPnZoYSwgc3ApOworCXN0cnVjdCBzcmJfaW9jYiAqdG1mID0gJnNwLT51LmlvY2JfY21kOworCWNvbXBsZXRlKCZ0bWYtPnUudG1mLmNvbXApOwogfQogCiBpbnQKLXFsYTJ4MDBfYXN5bmNfdG1fY21kKGZjX3BvcnRfdCAqZmNwb3J0LCB1aW50MzJfdCB0bV9mbGFncywgdWludDMyX3QgbHVuLAorcWxhMngwMF9hc3luY190bV9jbWQoZmNfcG9ydF90ICpmY3BvcnQsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBsdW4sCiAJdWludDMyX3QgdGFnKQogewogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBmY3BvcnQtPnZoYTsKKwlzdHJ1Y3Qgc3JiX2lvY2IgKnRtX2lvY2I7CiAJc3JiX3QgKnNwOwotCXN0cnVjdCBzcmJfaW9jYiAqdGNmOwotCWludCBydmFsOworCWludCBydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCXNwID0gcWxhMngwMF9nZXRfc3AodmhhLCBmY3BvcnQsIEdGUF9LRVJORUwpOwogCWlmICghc3ApCiAJCWdvdG8gZG9uZTsKIAorCXRtX2lvY2IgPSAmc3AtPnUuaW9jYl9jbWQ7CiAJc3AtPnR5cGUgPSBTUkJfVE1fQ01EOwogCXNwLT5uYW1lID0gInRtZiI7Ci0JcWxhMngwMF9pbml0X3RpbWVyKHNwLCBxbGEyeDAwX2dldF9hc3luY190aW1lb3V0KHZoYSkgKyAyKTsKLQotCXRjZiA9ICZzcC0+dS5pb2NiX2NtZDsKLQl0Y2YtPnUudG1mLmZsYWdzID0gdG1fZmxhZ3M7Ci0JdGNmLT51LnRtZi5sdW4gPSBsdW47Ci0JdGNmLT51LnRtZi5kYXRhID0gdGFnOwotCXRjZi0+dGltZW91dCA9IHFsYTJ4MDBfYXN5bmNfaW9jYl90aW1lb3V0OwotCXNwLT5kb25lID0gcWxhMngwMF9hc3luY190bV9jbWRfZG9uZTsKKwlxbGEyeDAwX2luaXRfdGltZXIoc3AsIHFsYTJ4MDBfZ2V0X2FzeW5jX3RpbWVvdXQodmhhKSk7CisJdG1faW9jYi0+dS50bWYuZmxhZ3MgPSBmbGFnczsKKwl0bV9pb2NiLT51LnRtZi5sdW4gPSBsdW47CisJdG1faW9jYi0+dS50bWYuZGF0YSA9IHRhZzsKKwlzcC0+ZG9uZSA9IHFsYTJ4MDBfdG1mX3NwX2RvbmU7CisJdG1faW9jYi0+dGltZW91dCA9IHFsYTJ4MDBfdG1mX2lvY2JfdGltZW91dDsKKwlpbml0X2NvbXBsZXRpb24oJnRtX2lvY2ItPnUudG1mLmNvbXApOwogCiAJcnZhbCA9IHFsYTJ4MDBfc3RhcnRfc3Aoc3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQpAQCAtMzMwLDE0ICszMjAsMTIxIEBACiAJICAgICJBc3luYy10bWYgaGRsPSV4IGxvb3AtaWQ9JXggcG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCiAJICAgIHNwLT5oYW5kbGUsIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAogCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7Ci0JcmV0dXJuIHJ2YWw7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0bV9pb2NiLT51LnRtZi5jb21wKTsKKworCXJ2YWwgPSB0bV9pb2NiLT51LnRtZi5jb21wX3N0YXR1cyA9PSBDU19DT01QTEVURSA/CisJICAgIFFMQV9TVUNDRVNTIDogUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCWlmICgocnZhbCAhPSBRTEFfU1VDQ0VTUykgfHwgdG1faW9jYi0+dS50bWYuZGF0YSkgeworCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAzMCwKKwkJICAgICJUTSBJT0NCIGZhaWxlZCAoJXgpLlxuIiwgcnZhbCk7CisJfQorCisJaWYgKCF0ZXN0X2JpdChVTkxPQURJTkcsICZ2aGEtPmRwY19mbGFncykgJiYgIUlTX1FMQUZYMDAodmhhLT5odykpIHsKKwkJZmxhZ3MgPSB0bV9pb2NiLT51LnRtZi5mbGFnczsKKwkJbHVuID0gKHVpbnQxNl90KXRtX2lvY2ItPnUudG1mLmx1bjsKKworCQkvKiBJc3N1ZSBNYXJrZXIgSU9DQiAqLworCQlxbGEyeDAwX21hcmtlcih2aGEsIHZoYS0+aHctPnJlcV9xX21hcFswXSwKKwkJICAgIHZoYS0+aHctPnJzcF9xX21hcFswXSwgc3AtPmZjcG9ydC0+bG9vcF9pZCwgbHVuLAorCQkgICAgZmxhZ3MgPT0gVENGX0xVTl9SRVNFVCA/IE1LX1NZTkNfSURfTFVOIDogTUtfU1lOQ19JRCk7CisJfQogCiBkb25lX2ZyZWVfc3A6Ci0Jc3AtPmZyZWUoZmNwb3J0LT52aGEsIHNwKTsKKwlzcC0+ZnJlZSh2aGEsIHNwKTsKIGRvbmU6CiAJcmV0dXJuIHJ2YWw7CiB9CiAKK3N0YXRpYyB2b2lkCitxbGEyNHh4X2Fib3J0X2lvY2JfdGltZW91dCh2b2lkICpkYXRhKQoreworCXNyYl90ICpzcCA9IChzcmJfdCAqKWRhdGE7CisJc3RydWN0IHNyYl9pb2NiICphYnQgPSAmc3AtPnUuaW9jYl9jbWQ7CisKKwlhYnQtPnUuYWJ0LmNvbXBfc3RhdHVzID0gQ1NfVElNRU9VVDsKKwljb21wbGV0ZSgmYWJ0LT51LmFidC5jb21wKTsKK30KKworc3RhdGljIHZvaWQKK3FsYTI0eHhfYWJvcnRfc3BfZG9uZSh2b2lkICpkYXRhLCB2b2lkICpwdHIsIGludCByZXMpCit7CisJc3JiX3QgKnNwID0gKHNyYl90ICopcHRyOworCXN0cnVjdCBzcmJfaW9jYiAqYWJ0ID0gJnNwLT51LmlvY2JfY21kOworCisJY29tcGxldGUoJmFidC0+dS5hYnQuY29tcCk7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI0eHhfYXN5bmNfYWJvcnRfY21kKHNyYl90ICpjbWRfc3ApCit7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBjbWRfc3AtPmZjcG9ydC0+dmhhOworCWZjX3BvcnRfdCAqZmNwb3J0ID0gY21kX3NwLT5mY3BvcnQ7CisJc3RydWN0IHNyYl9pb2NiICphYnRfaW9jYjsKKwlzcmJfdCAqc3A7CisJaW50IHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJc3AgPSBxbGEyeDAwX2dldF9zcCh2aGEsIGZjcG9ydCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcCkKKwkJZ290byBkb25lOworCisJYWJ0X2lvY2IgPSAmc3AtPnUuaW9jYl9jbWQ7CisJc3AtPnR5cGUgPSBTUkJfQUJUX0NNRDsKKwlzcC0+bmFtZSA9ICJhYm9ydCI7CisJcWxhMngwMF9pbml0X3RpbWVyKHNwLCBxbGEyeDAwX2dldF9hc3luY190aW1lb3V0KHZoYSkpOworCWFidF9pb2NiLT51LmFidC5jbWRfaG5kbCA9IGNtZF9zcC0+aGFuZGxlOworCXNwLT5kb25lID0gcWxhMjR4eF9hYm9ydF9zcF9kb25lOworCWFidF9pb2NiLT50aW1lb3V0ID0gcWxhMjR4eF9hYm9ydF9pb2NiX3RpbWVvdXQ7CisJaW5pdF9jb21wbGV0aW9uKCZhYnRfaW9jYi0+dS5hYnQuY29tcCk7CisKKwlydmFsID0gcWxhMngwMF9zdGFydF9zcChzcCk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJCWdvdG8gZG9uZV9mcmVlX3NwOworCisJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwN2MsCisJICAgICJBYm9ydCBjb21tYW5kIGlzc3VlZCAtIGhkbD0leCwgdGFyZ2V0X2lkPSV4XG4iLAorCSAgICBjbWRfc3AtPmhhbmRsZSwgZmNwb3J0LT50Z3RfaWQpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmYWJ0X2lvY2ItPnUuYWJ0LmNvbXApOworCisJcnZhbCA9IGFidF9pb2NiLT51LmFidC5jb21wX3N0YXR1cyA9PSBDU19DT01QTEVURSA/CisJICAgIFFMQV9TVUNDRVNTIDogUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworZG9uZV9mcmVlX3NwOgorCXNwLT5mcmVlKHZoYSwgc3ApOworZG9uZToKKwlyZXR1cm4gcnZhbDsKK30KKworaW50CitxbGEyNHh4X2FzeW5jX2Fib3J0X2NvbW1hbmQoc3JiX3QgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFncyA9IDA7CisKKwl1aW50MzJfdAloYW5kbGU7CisJZmNfcG9ydF90CSpmY3BvcnQgPSBzcC0+ZmNwb3J0OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBmY3BvcnQtPnZoYTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gdmhhLT5yZXE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGhhbmRsZSA9IDE7IGhhbmRsZSA8IHJlcS0+bnVtX291dHN0YW5kaW5nX2NtZHM7IGhhbmRsZSsrKSB7CisJCWlmIChyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9PSBzcCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWlmIChoYW5kbGUgPT0gcmVxLT5udW1fb3V0c3RhbmRpbmdfY21kcykgeworCQkvKiBDb21tYW5kIG5vdCBmb3VuZC4gKi8KKwkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfQorCWlmIChzcC0+dHlwZSA9PSBTUkJfRlhJT0NCX0RDTUQpCisJCXJldHVybiBxbGFmeDAwX2Z4X2Rpc2ModmhhLCAmdmhhLT5ody0+bXIuZmNwb3J0LAorCQkgICAgRlhESVNDX0FCT1JUX0lPQ1RMKTsKKworCXJldHVybiBxbGEyNHh4X2FzeW5jX2Fib3J0X2NtZChzcCk7Cit9CisKIHZvaWQKIHFsYTJ4MDBfYXN5bmNfbG9naW5fZG9uZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKICAgICB1aW50MTZfdCAqZGF0YSkKQEAgLTEzNzksNyArMTQ3NiwxMiBAQAogCX0KIAogCWhhLT5md19kdW1wZWQgPSAwOwotCWZpeGVkX3NpemUgPSBtZW1fc2l6ZSA9IGVmdF9zaXplID0gZmNlX3NpemUgPSBtcV9zaXplID0gMDsKKwlkdW1wX3NpemUgPSBmaXhlZF9zaXplID0gbWVtX3NpemUgPSBlZnRfc2l6ZSA9IGZjZV9zaXplID0gbXFfc2l6ZSA9IDA7CisJcmVxX3Ffc2l6ZSA9IHJzcF9xX3NpemUgPSAwOworCisJaWYgKElTX1FMQTI3WFgoaGEpKQorCQlnb3RvIHRyeV9mY2U7CisKIAlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKIAkJZml4ZWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcWxhMjEwMF9md19kdW1wKTsKIAl9IGVsc2UgaWYgKElTX1FMQTIzWFgoaGEpKSB7CkBAIC0xMzk1LDYgKzE0OTcsNyBAQAogCQkJZml4ZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAsIGV4dF9tZW0pOwogCQllbHNlCiAJCQlmaXhlZF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IHFsYTI0eHhfZndfZHVtcCwgZXh0X21lbSk7CisKIAkJbWVtX3NpemUgPSAoaGEtPmZ3X21lbW9yeV9zaXplIC0gMHgxMDAwMDAgKyAxKSAqCiAJCSAgICBzaXplb2YodWludDMyX3QpOwogCQlpZiAoaGEtPm1xZW5hYmxlKSB7CkBAIC0xNDEyLDkgKzE1MTUsMTYgQEAKIAkJaWYgKGhhLT50Z3QuYXRpb19yaW5nKQogCQkJbXFfc2l6ZSArPSBoYS0+dGd0LmF0aW9fcV9sZW5ndGggKiBzaXplb2YocmVxdWVzdF90KTsKIAkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBGaWJyZSBDaGFubmVsIEV2ZW50IEJ1ZmZlci4gKi8KLQkJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpKQorCQlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkgJiYKKwkJICAgICFJU19RTEEyN1hYKGhhKSkKIAkJCWdvdG8gdHJ5X2VmdDsKIAordHJ5X2ZjZToKKwkJaWYgKGhhLT5mY2UpCisJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJCSAgICBGQ0VfU0laRSwgaGEtPmZjZSwgaGEtPmZjZV9kbWEpOworCisJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgRmlicmUgQ2hhbm5lbCBFdmVudCBCdWZmZXIuICovCiAJCXRjID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBGQ0VfU0laRSwgJnRjX2RtYSwKIAkJICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIXRjKSB7CkBAIC0xNDQyLDcgKzE1NTIsMTIgQEAKIAkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMTsKIAkJaGEtPmZjZV9kbWEgPSB0Y19kbWE7CiAJCWhhLT5mY2UgPSB0YzsKKwogdHJ5X2VmdDoKKwkJaWYgKGhhLT5lZnQpCisJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJCSAgICBFRlRfU0laRSwgaGEtPmVmdCwgaGEtPmVmdF9kbWEpOworCiAJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgRXh0ZW5kZWQgVHJhY2UgQnVmZmVyLiAqLwogCQl0YyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRUZUX1NJWkUsICZ0Y19kbWEsCiAJCSAgICBHRlBfS0VSTkVMKTsKQEAgLTE0NjksMTUgKzE1ODQsMjggQEAKIAkJaGEtPmVmdF9kbWEgPSB0Y19kbWE7CiAJCWhhLT5lZnQgPSB0YzsKIAl9CisKIGNvbnRfYWxsb2M6CisJaWYgKElTX1FMQTI3WFgoaGEpKSB7CisJCWlmICghaGEtPmZ3X2R1bXBfdGVtcGxhdGUpIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwYmEsCisJCQkgICAgIkZhaWxlZCBtaXNzaW5nIGZ3ZHVtcCB0ZW1wbGF0ZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJZHVtcF9zaXplID0gcWxhMjd4eF9md2R0X2NhbGN1bGF0ZV9kdW1wX3NpemUodmhhKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBmYSwKKwkJICAgICItPiBhbGxvY2F0aW5nIGZ3ZHVtcCAoJXggYnl0ZXMpLi4uXG4iLCBkdW1wX3NpemUpOworCQlnb3RvIGFsbG9jYXRlOworCX0KKwogCXJlcV9xX3NpemUgPSByZXEtPmxlbmd0aCAqIHNpemVvZihyZXF1ZXN0X3QpOwogCXJzcF9xX3NpemUgPSByc3AtPmxlbmd0aCAqIHNpemVvZihyZXNwb25zZV90KTsKLQogCWR1bXBfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyeHh4X2Z3X2R1bXAsIGlzcCk7CiAJZHVtcF9zaXplICs9IGZpeGVkX3NpemUgKyBtZW1fc2l6ZSArIHJlcV9xX3NpemUgKyByc3BfcV9zaXplICsgZWZ0X3NpemU7CiAJaGEtPmNoYWluX29mZnNldCA9IGR1bXBfc2l6ZTsKIAlkdW1wX3NpemUgKz0gbXFfc2l6ZSArIGZjZV9zaXplOwogCithbGxvY2F0ZToKIAloYS0+ZndfZHVtcCA9IHZtYWxsb2MoZHVtcF9zaXplKTsKIAlpZiAoIWhhLT5md19kdW1wKSB7CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwYzQsCkBAIC0xNDk5LDEwICsxNjI3LDEzIEBACiAJCX0KIAkJcmV0dXJuOwogCX0KKwloYS0+ZndfZHVtcF9sZW4gPSBkdW1wX3NpemU7CiAJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBjNSwKIAkgICAgIkFsbG9jYXRlZCAoJWQgS0IpIGZvciBmaXJtd2FyZSBkdW1wLlxuIiwgZHVtcF9zaXplIC8gMTAyNCk7CiAKLQloYS0+ZndfZHVtcF9sZW4gPSBkdW1wX3NpemU7CisJaWYgKElTX1FMQTI3WFgoaGEpKQorCQlyZXR1cm47CisKIAloYS0+ZndfZHVtcC0+c2lnbmF0dXJlWzBdID0gJ1EnOwogCWhhLT5md19kdW1wLT5zaWduYXR1cmVbMV0gPSAnTCc7CiAJaGEtPmZ3X2R1bXAtPnNpZ25hdHVyZVsyXSA9ICdHJzsKQEAgLTE3MTgsOSArMTg0OSw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJfQogCi0JaWYgKElTX1FMQTgzWFgoaGEpKQotCQlnb3RvIHNraXBfZmFjX2NoZWNrOwotCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MgJiYgSVNfRkFDX1JFUVVJUkVEKGhhKSkgewogCQl1aW50MzJfdCBzaXplOwogCkBAIC0xNzMzLDggKzE4NjEsOCBAQAogCQkJICAgICJVbnN1cHBvcnRlZCBGQUMgZmlybXdhcmUgKCVkLiUwMmQuJTAyZCkuXG4iLAogCQkJICAgIGhhLT5md19tYWpvcl92ZXJzaW9uLCBoYS0+ZndfbWlub3JfdmVyc2lvbiwKIAkJCSAgICBoYS0+Zndfc3VibWlub3JfdmVyc2lvbik7Ci1za2lwX2ZhY19jaGVjazoKLQkJCWlmIChJU19RTEE4M1hYKGhhKSkgeworCisJCQlpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJCQloYS0+ZmxhZ3MuZmFjX3N1cHBvcnRlZCA9IDA7CiAJCQkJcnZhbCA9IFFMQV9TVUNDRVNTOwogCQkJfQpAQCAtMTkzMyw3ICsyMDYxLDcgQEAKIAlpY2ItPmF0aW9fcV9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKGhhLT50Z3QuYXRpb19kbWEpKTsKIAlpY2ItPmF0aW9fcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT50Z3QuYXRpb19kbWEpKTsKIAotCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkpIHsKKwlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCWljYi0+cW9zID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihRTEFfREVGQVVMVF9RVUVfUU9TKTsKIAkJaWNiLT5yaWQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHJpZCk7CiAJCWlmIChoYS0+ZmxhZ3MubXNpeF9lbmFibGVkKSB7CkBAIC00NzkyLDEzICs0OTIwLDE0IEBACiAJbnYgPSBoYS0+bnZyYW07CiAKIAkvKiBEZXRlcm1pbmUgTlZSQU0gc3RhcnRpbmcgYWRkcmVzcy4gKi8KLQlpZiAoaGEtPmZsYWdzLnBvcnQwKSB7CisJaWYgKGhhLT5wb3J0X25vID09IDApIHsKIAkJaGEtPm52cmFtX2Jhc2UgPSBGQV9OVlJBTV9GVU5DMF9BRERSOwogCQloYS0+dnBkX2Jhc2UgPSBGQV9OVlJBTV9WUEQwX0FERFI7CiAJfSBlbHNlIHsKIAkJaGEtPm52cmFtX2Jhc2UgPSBGQV9OVlJBTV9GVU5DMV9BRERSOwogCQloYS0+dnBkX2Jhc2UgPSBGQV9OVlJBTV9WUEQxX0FERFI7CiAJfQorCiAJaGEtPm52cmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IG52cmFtXzI0eHgpOwogCWhhLT52cGRfc2l6ZSA9IEZBX05WUkFNX1ZQRF9TSVpFOwogCkBAIC00ODQyLDcgKzQ5NzEsNyBAQAogCQludi0+ZXhjaGFuZ2VfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOwogCQludi0+aGFyZF9hZGRyZXNzID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxMjQpOwogCQludi0+cG9ydF9uYW1lWzBdID0gMHgyMTsKLQkJbnYtPnBvcnRfbmFtZVsxXSA9IDB4MDAgKyBoYS0+cG9ydF9ubzsKKwkJbnYtPnBvcnRfbmFtZVsxXSA9IDB4MDAgKyBoYS0+cG9ydF9ubyArIDE7CiAJCW52LT5wb3J0X25hbWVbMl0gPSAweDAwOwogCQludi0+cG9ydF9uYW1lWzNdID0gMHhlMDsKIAkJbnYtPnBvcnRfbmFtZVs0XSA9IDB4OGI7CkBAIC01MTE3LDYgKzUyNDYsOTkgQEAKIAkJc2VnbWVudHMtLTsKIAl9CiAKKwlpZiAoIUlTX1FMQTI3WFgoaGEpKQorCQlyZXR1cm4gcnZhbDsKKworCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOworCisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE2MSwKKwkgICAgIkxvYWRpbmcgZndkdW1wIHRlbXBsYXRlIGZyb20gJXhcbiIsIGZhZGRyKTsKKwlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YSh2aGEsIGRjb2RlLCBmYWRkciwgNyk7CisJcmlzY19zaXplID0gYmUzMl90b19jcHUoZGNvZGVbMl0pOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNjIsCisJICAgICItPiBhcnJheSBzaXplICV4IGR3b3Jkc1xuIiwgcmlzY19zaXplKTsKKwlpZiAocmlzY19zaXplID09IDAgfHwgcmlzY19zaXplID09IH4wKQorCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisKKwlkbGVuID0gKHJpc2Nfc2l6ZSAtIDgpICogc2l6ZW9mKCpkY29kZSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE2MywKKwkgICAgIi0+IHRlbXBsYXRlIGFsbG9jYXRpbmcgJXggYnl0ZXMuLi5cbiIsIGRsZW4pOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gdm1hbGxvYyhkbGVuKTsKKwlpZiAoIWhhLT5md19kdW1wX3RlbXBsYXRlKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNjQsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSBhbGxvY2F0ZSAleCBieXRlcy5cbiIsIHJpc2Nfc2l6ZSk7CisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKwl9CisKKwlmYWRkciArPSA3OworCXJpc2Nfc2l6ZSAtPSA4OworCWRjb2RlID0gaGEtPmZ3X2R1bXBfdGVtcGxhdGU7CisJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkY29kZSwgZmFkZHIsIHJpc2Nfc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IHJpc2Nfc2l6ZTsgaSsrKQorCQlkY29kZVtpXSA9IGxlMzJfdG9fY3B1KGRjb2RlW2ldKTsKKworCWlmICghcWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKGRjb2RlKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTY1LAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgdmFsaWRhdGVcbiIpOworCQlnb3RvIGRlZmF1bHRfdGVtcGxhdGU7CisJfQorCisJZGxlbiA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9zaXplKGRjb2RlKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTY2LAorCSAgICAiLT4gdGVtcGxhdGUgc2l6ZSAleCBieXRlc1xuIiwgZGxlbik7CisJaWYgKGRsZW4gPiByaXNjX3NpemUgKiBzaXplb2YoKmRjb2RlKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTY3LAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgZXhjZWVkcyBhcnJheSBieSAleCBieXRlc1xuIiwKKwkJICAgICh1aW50MzJfdCkoZGxlbiAtIHJpc2Nfc2l6ZSAqIHNpemVvZigqZGNvZGUpKSk7CisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKwl9CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gZGxlbjsKKwlyZXR1cm4gcnZhbDsKKworZGVmYXVsdF90ZW1wbGF0ZToKKwlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTY4LCAiVXNpbmcgZGVmYXVsdCBmd2R1bXAgdGVtcGxhdGVcbiIpOworCWlmIChoYS0+ZndfZHVtcF90ZW1wbGF0ZSkKKwkJdmZyZWUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCWhhLT5md19kdW1wX3RlbXBsYXRlID0gTlVMTDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSAwOworCisJZGxlbiA9IHFsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0X3NpemUoKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTY5LAorCSAgICAiLT4gdGVtcGxhdGUgYWxsb2NhdGluZyAleCBieXRlcy4uLlxuIiwgZGxlbik7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSB2bWFsbG9jKGRsZW4pOworCWlmICghaGEtPmZ3X2R1bXBfdGVtcGxhdGUpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE2YSwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIGFsbG9jYXRlICV4IGJ5dGVzLlxuIiwgcmlzY19zaXplKTsKKwkJZ290byBmYWlsZWRfdGVtcGxhdGU7CisJfQorCisJZGNvZGUgPSBoYS0+ZndfZHVtcF90ZW1wbGF0ZTsKKwlyaXNjX3NpemUgPSBkbGVuIC8gc2l6ZW9mKCpkY29kZSk7CisJbWVtY3B5KGRjb2RlLCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfZGVmYXVsdCgpLCBkbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmlzY19zaXplOyBpKyspCisJCWRjb2RlW2ldID0gYmUzMl90b19jcHUoZGNvZGVbaV0pOworCisJaWYgKCFxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfdmFsaWQoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNmIsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSB2YWxpZGF0ZVxuIik7CisJCWdvdG8gZmFpbGVkX3RlbXBsYXRlOworCX0KKworCWRsZW4gPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfc2l6ZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE2YywKKwkgICAgIi0+IHRlbXBsYXRlIHNpemUgJXggYnl0ZXNcbiIsIGRsZW4pOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IGRsZW47CisJcmV0dXJuIHJ2YWw7CisKK2ZhaWxlZF90ZW1wbGF0ZToKKwlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTZkLCAiRmFpbGVkIGRlZmF1bHQgZndkdW1wIHRlbXBsYXRlXG4iKTsKKwlpZiAoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpCisJCXZmcmVlKGhhLT5md19kdW1wX3RlbXBsYXRlKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtNTIzMSw3ICs1NDUzLDggQEAKIAl1aW50MzJfdCByaXNjX3NpemU7CiAJdWludDMyX3QgaTsKIAlzdHJ1Y3QgZndfYmxvYiAqYmxvYjsKLQl1aW50MzJfdCAqZndjb2RlLCBmd2NsZW47CisJY29uc3QgdWludDMyX3QgKmZ3Y29kZTsKKwl1aW50MzJfdCBmd2NsZW47CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiAKQEAgLTUyNjMsNyArNTQ4Niw3IEBACiAJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDkzLAogCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlICglWmQpLlxuIiwKIAkJICAgIGJsb2ItPmZ3LT5zaXplKTsKLQkJZ290byBmYWlsX2Z3X2ludGVncml0eTsKKwkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCWRjb2RlW2ldID0gYmUzMl90b19jcHUoZndjb2RlW2kgKyA0XSk7CkBAIC01Mjc3LDcgKzU1MDAsNyBAQAogCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA5NSwKIAkJICAgICJGaXJtd2FyZSBkYXRhOiAlMDh4ICUwOHggJTA4eCAlMDh4LlxuIiwKIAkJICAgIGRjb2RlWzBdLCBkY29kZVsxXSwgZGNvZGVbMl0sIGRjb2RlWzNdKTsKLQkJZ290byBmYWlsX2Z3X2ludGVncml0eTsKKwkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCiAJd2hpbGUgKHNlZ21lbnRzICYmIHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTUyOTEsOCArNTUxNCw3IEBACiAJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA5NiwKIAkJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgIgogCQkJICAgICIoJVpkKS5cbiIsIGJsb2ItPmZ3LT5zaXplKTsKLQotCQkJZ290byBmYWlsX2Z3X2ludGVncml0eTsKKwkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CiAKIAkJZnJhZ21lbnQgPSAwOwpAQCAtNTMyNiwxMCArNTU0OCwxMDAgQEAKIAkJLyogTmV4dCBzZWdtZW50LiAqLwogCQlzZWdtZW50cy0tOwogCX0KKworCWlmICghSVNfUUxBMjdYWChoYSkpCisJCXJldHVybiBydmFsOworCisJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CisKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgxNzEsCisJICAgICJMb2FkaW5nIGZ3ZHVtcCB0ZW1wbGF0ZSBmcm9tICV4XG4iLAorCSAgICAodWludDMyX3QpKCh2b2lkICopZndjb2RlIC0gKHZvaWQgKilibG9iLT5mdy0+ZGF0YSkpOworCXJpc2Nfc2l6ZSA9IGJlMzJfdG9fY3B1KGZ3Y29kZVsyXSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MTcyLAorCSAgICAiLT4gYXJyYXkgc2l6ZSAleCBkd29yZHNcbiIsIHJpc2Nfc2l6ZSk7CisJaWYgKHJpc2Nfc2l6ZSA9PSAwIHx8IHJpc2Nfc2l6ZSA9PSB+MCkKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCisJZGxlbiA9IChyaXNjX3NpemUgLSA4KSAqIHNpemVvZigqZndjb2RlKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTczLAorCSAgICAiLT4gdGVtcGxhdGUgYWxsb2NhdGluZyAleCBieXRlcy4uLlxuIiwgZGxlbik7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSB2bWFsbG9jKGRsZW4pOworCWlmICghaGEtPmZ3X2R1bXBfdGVtcGxhdGUpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE3NCwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIGFsbG9jYXRlICV4IGJ5dGVzLlxuIiwgcmlzY19zaXplKTsKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCX0KKworCWZ3Y29kZSArPSA3OworCXJpc2Nfc2l6ZSAtPSA4OworCWRjb2RlID0gaGEtPmZ3X2R1bXBfdGVtcGxhdGU7CisJZm9yIChpID0gMDsgaSA8IHJpc2Nfc2l6ZTsgaSsrKQorCQlkY29kZVtpXSA9IGxlMzJfdG9fY3B1KGZ3Y29kZVtpXSk7CisKKwlpZiAoIXFsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZChkY29kZSkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE3NSwKKwkJICAgICJGYWlsZWQgZndkdW1wIHRlbXBsYXRlIHZhbGlkYXRlXG4iKTsKKwkJZ290byBkZWZhdWx0X3RlbXBsYXRlOworCX0KKworCWRsZW4gPSBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGVfc2l6ZShkY29kZSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDE3NiwKKwkgICAgIi0+IHRlbXBsYXRlIHNpemUgJXggYnl0ZXNcbiIsIGRsZW4pOworCWlmIChkbGVuID4gcmlzY19zaXplICogc2l6ZW9mKCpmd2NvZGUpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNzcsCisJCSAgICAiRmFpbGVkIGZ3ZHVtcCB0ZW1wbGF0ZSBleGNlZWRzIGFycmF5IGJ5ICV4IGJ5dGVzXG4iLAorCQkgICAgKHVpbnQzMl90KShkbGVuIC0gcmlzY19zaXplICogc2l6ZW9mKCpmd2NvZGUpKSk7CisJCWdvdG8gZGVmYXVsdF90ZW1wbGF0ZTsKKwl9CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gZGxlbjsKIAlyZXR1cm4gcnZhbDsKIAotZmFpbF9md19pbnRlZ3JpdHk6Ci0JcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CitkZWZhdWx0X3RlbXBsYXRlOgorCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxNzgsICJVc2luZyBkZWZhdWx0IGZ3ZHVtcCB0ZW1wbGF0ZVxuIik7CisJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CisKKwlkbGVuID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHRfc2l6ZSgpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxNzksCisJICAgICItPiB0ZW1wbGF0ZSBhbGxvY2F0aW5nICV4IGJ5dGVzLi4uXG4iLCBkbGVuKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IHZtYWxsb2MoZGxlbik7CisJaWYgKCFoYS0+ZndfZHVtcF90ZW1wbGF0ZSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTdhLAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgYWxsb2NhdGUgJXggYnl0ZXMuXG4iLCByaXNjX3NpemUpOworCQlnb3RvIGZhaWxlZF90ZW1wbGF0ZTsKKwl9CisKKwlkY29kZSA9IGhhLT5md19kdW1wX3RlbXBsYXRlOworCXJpc2Nfc2l6ZSA9IGRsZW4gLyBzaXplb2YoKmZ3Y29kZSk7CisJZndjb2RlID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX2RlZmF1bHQoKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmlzY19zaXplOyBpKyspCisJCWRjb2RlW2ldID0gYmUzMl90b19jcHUoZndjb2RlW2ldKTsKKworCWlmICghcWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKGhhLT5md19kdW1wX3RlbXBsYXRlKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTdiLAorCQkgICAgIkZhaWxlZCBmd2R1bXAgdGVtcGxhdGUgdmFsaWRhdGVcbiIpOworCQlnb3RvIGZhaWxlZF90ZW1wbGF0ZTsKKwl9CisKKwlkbGVuID0gcWxhMjd4eF9md2R0X3RlbXBsYXRlX3NpemUoaGEtPmZ3X2R1bXBfdGVtcGxhdGUpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAxN2MsCisJICAgICItPiB0ZW1wbGF0ZSBzaXplICV4IGJ5dGVzXG4iLCBkbGVuKTsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZV9sZW4gPSBkbGVuOworCXJldHVybiBydmFsOworCitmYWlsZWRfdGVtcGxhdGU6CisJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDE3ZCwgIkZhaWxlZCBkZWZhdWx0IGZ3ZHVtcCB0ZW1wbGF0ZVxuIik7CisJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGUgPSBOVUxMOworCWhhLT5md19kdW1wX3RlbXBsYXRlX2xlbiA9IDA7CisJcmV0dXJuIHJ2YWw7CiB9CiAKIGludApAQCAtNTYwNSw3ICs1OTE3LDcgQEAKIAkJbnYtPmV4ZWN1dGlvbl90aHJvdHRsZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHhGRkZGKTsKIAkJbnYtPmV4Y2hhbmdlX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKIAkJbnYtPnBvcnRfbmFtZVswXSA9IDB4MjE7Ci0JCW52LT5wb3J0X25hbWVbMV0gPSAweDAwICsgaGEtPnBvcnRfbm87CisJCW52LT5wb3J0X25hbWVbMV0gPSAweDAwICsgaGEtPnBvcnRfbm8gKyAxOwogCQludi0+cG9ydF9uYW1lWzJdID0gMHgwMDsKIAkJbnYtPnBvcnRfbmFtZVszXSA9IDB4ZTA7CiAJCW52LT5wb3J0X25hbWVbNF0gPSAweDhiOwpAQCAtNTYzOSw3ICs1OTUxLDcgQEAKIAkJbnYtPmVub2RlX21hY1syXSA9IDB4REQ7CiAJCW52LT5lbm9kZV9tYWNbM10gPSAweDA0OwogCQludi0+ZW5vZGVfbWFjWzRdID0gMHgwNTsKLQkJbnYtPmVub2RlX21hY1s1XSA9IDB4MDYgKyBoYS0+cG9ydF9ubzsKKwkJbnYtPmVub2RlX21hY1s1XSA9IDB4MDYgKyBoYS0+cG9ydF9ubyArIDE7CiAKIAkJcnZhbCA9IDE7CiAJfQpAQCAtNTY3Nyw3ICs1OTg5LDcgQEAKIAkJaWNiLT5lbm9kZV9tYWNbMl0gPSAweEREOwogCQlpY2ItPmVub2RlX21hY1szXSA9IDB4MDQ7CiAJCWljYi0+ZW5vZGVfbWFjWzRdID0gMHgwNTsKLQkJaWNiLT5lbm9kZV9tYWNbNV0gPSAweDA2ICsgaGEtPnBvcnRfbm87CisJCWljYi0+ZW5vZGVfbWFjWzVdID0gMHgwNiArIGhhLT5wb3J0X25vICsgMTsKIAl9CiAKIAkvKiBVc2UgZXh0ZW5kZWQtaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4gKi8KQEAgLTU3ODAsNyArNjA5Miw3IEBACiAJCWhhLT5sb2dpbl9yZXRyeV9jb3VudCA9IHFsMnhsb2dpbnJldHJ5Y291bnQ7CiAKIAkvKiBpZiBub3QgcnVubmluZyBNU0ktWCB3ZSBuZWVkIGhhbmRzaGFraW5nIG9uIGludGVycnVwdHMgKi8KLQlpZiAoIXZoYS0+aHctPmZsYWdzLm1zaXhfZW5hYmxlZCAmJiBJU19RTEE4M1hYKGhhKSkKKwlpZiAoIXZoYS0+aHctPmZsYWdzLm1zaXhfZW5hYmxlZCAmJiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpKQogCQlpY2ItPmZpcm13YXJlX29wdGlvbnNfMiB8PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKEJJVF8yMik7CiAKIAkvKiBFbmFibGUgWklPLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKaW5kZXggNDZiOTMwNy4uZTYwNzU2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCkBAIC00ODgsNyArNDg4LDcgQEAKIAkJCXJlcS0+cmluZ19wdHIrKzsKIAogCQkvKiBTZXQgY2hpcCBuZXcgcmluZyBpbmRleC4gKi8KLQkJaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSkgeworCQlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCQlXUlRfUkVHX0RXT1JEKHJlcS0+cmVxX3FfaW4sIHJlcS0+cmluZ19pbmRleCk7CiAJCQlSRF9SRUdfRFdPUkRfUkVMQVhFRCgmaGEtPmlvYmFzZS0+aXNwMjQuaGNjcik7CiAJCX0gZWxzZSBpZiAoSVNfUUxBRlgwMChoYSkpIHsKQEAgLTUyNCw3ICs1MjQsNiBAQAogewogCW1ya19lbnRyeV90ICptcms7CiAJc3RydWN0IG1ya19lbnRyeV8yNHh4ICptcmsyNCA9IE5VTEw7Ci0Jc3RydWN0IG1ya19lbnRyeV9meDAwICptcmtmeCA9IE5VTEw7CiAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKQEAgLTU0MSwxNSArNTQwLDcgQEAKIAltcmstPmVudHJ5X3R5cGUgPSBNQVJLRVJfVFlQRTsKIAltcmstPm1vZGlmaWVyID0gdHlwZTsKIAlpZiAodHlwZSAhPSBNS19TWU5DX0FMTCkgewotCQlpZiAoSVNfUUxBRlgwMChoYSkpIHsKLQkJCW1ya2Z4ID0gKHN0cnVjdCBtcmtfZW50cnlfZngwMCAqKSBtcms7Ci0JCQltcmtmeC0+aGFuZGxlID0gTUFLRV9IQU5ETEUocmVxLT5pZCwgbXJrZngtPmhhbmRsZSk7Ci0JCQltcmtmeC0+aGFuZGxlX2hpID0gMDsKLQkJCW1ya2Z4LT50Z3RfaWQgPSBjcHVfdG9fbGUxNihsb29wX2lkKTsKLQkJCW1ya2Z4LT5sdW5bMV0gPSBMU0IobHVuKTsKLQkJCW1ya2Z4LT5sdW5bMl0gPSBNU0IobHVuKTsKLQkJCWhvc3RfdG9fZmNwX3N3YXAobXJrZngtPmx1biwgc2l6ZW9mKG1ya2Z4LT5sdW4pKTsKLQkJfSBlbHNlIGlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CisJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CiAJCQltcmsyNCA9IChzdHJ1Y3QgbXJrX2VudHJ5XzI0eHggKikgbXJrOwogCQkJbXJrMjQtPm5wb3J0X2hhbmRsZSA9IGNwdV90b19sZTE2KGxvb3BfaWQpOwogCQkJbXJrMjQtPmx1blsxXSA9IExTQihsdW4pOwpAQCAtMTgyMyw3ICsxODE0LDcgQEAKIAogCS8qIENoZWNrIGZvciByb29tIGluIG91dHN0YW5kaW5nIGNvbW1hbmQgbGlzdC4gKi8KIAloYW5kbGUgPSByZXEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kOwotCWZvciAoaW5kZXggPSAxOyByZXEtPm51bV9vdXRzdGFuZGluZ19jbWRzOyBpbmRleCsrKSB7CisJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgcmVxLT5udW1fb3V0c3RhbmRpbmdfY21kczsgaW5kZXgrKykgewogCQloYW5kbGUrKzsKIAkJaWYgKGhhbmRsZSA9PSByZXEtPm51bV9vdXRzdGFuZGluZ19jbWRzKQogCQkJaGFuZGxlID0gMTsKQEAgLTE4NDgsNyArMTgzOSw3IEBACiBza2lwX2NtZF9hcnJheToKIAkvKiBDaGVjayBmb3Igcm9vbSBvbiByZXF1ZXN0IHF1ZXVlLiAqLwogCWlmIChyZXEtPmNudCA8IHJlcV9jbnQpIHsKLQkJaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSkKKwkJaWYgKGhhLT5tcWVuYWJsZSB8fCBJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJCWNudCA9IFJEX1JFR19EV09SRCgmcmVnLT5pc3AyNW1xLnJlcV9xX291dCk7CiAJCWVsc2UgaWYgKElTX1AzUF9UWVBFKGhhKSkKIAkJCWNudCA9IFJEX1JFR19EV09SRCgmcmVnLT5pc3A4Mi5yZXFfcV9vdXQpOwpAQCAtMjU5NCw2ICsyNTg1LDI5IEBACiAJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiB9CiAKK3ZvaWQKK3FsYTI0eHhfYWJvcnRfaW9jYihzcmJfdCAqc3AsIHN0cnVjdCBhYm9ydF9lbnRyeV8yNHh4ICphYnRfaW9jYikKK3sKKwlzdHJ1Y3Qgc3JiX2lvY2IgKmFpbyA9ICZzcC0+dS5pb2NiX2NtZDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gdmhhLT5yZXE7CisKKwltZW1zZXQoYWJ0X2lvY2IsIDAsIHNpemVvZihzdHJ1Y3QgYWJvcnRfZW50cnlfMjR4eCkpOworCWFidF9pb2NiLT5lbnRyeV90eXBlID0gQUJPUlRfSU9DQl9UWVBFOworCWFidF9pb2NiLT5lbnRyeV9jb3VudCA9IDE7CisJYWJ0X2lvY2ItPmhhbmRsZSA9IGNwdV90b19sZTMyKE1BS0VfSEFORExFKHJlcS0+aWQsIHNwLT5oYW5kbGUpKTsKKwlhYnRfaW9jYi0+bnBvcnRfaGFuZGxlID0gY3B1X3RvX2xlMTYoc3AtPmZjcG9ydC0+bG9vcF9pZCk7CisJYWJ0X2lvY2ItPmhhbmRsZV90b19hYm9ydCA9CisJICAgIGNwdV90b19sZTMyKE1BS0VfSEFORExFKHJlcS0+aWQsIGFpby0+dS5hYnQuY21kX2huZGwpKTsKKwlhYnRfaW9jYi0+cG9ydF9pZFswXSA9IHNwLT5mY3BvcnQtPmRfaWQuYi5hbF9wYTsKKwlhYnRfaW9jYi0+cG9ydF9pZFsxXSA9IHNwLT5mY3BvcnQtPmRfaWQuYi5hcmVhOworCWFidF9pb2NiLT5wb3J0X2lkWzJdID0gc3AtPmZjcG9ydC0+ZF9pZC5iLmRvbWFpbjsKKwlhYnRfaW9jYi0+dnBfaW5kZXggPSB2aGEtPnZwX2lkeDsKKwlhYnRfaW9jYi0+cmVxX3F1ZV9ubyA9IGNwdV90b19sZTE2KHJlcS0+aWQpOworCS8qIFNlbmQgdGhlIGNvbW1hbmQgdG8gdGhlIGZpcm13YXJlICovCisJd21iKCk7Cit9CisKIGludAogcWxhMngwMF9zdGFydF9zcChzcmJfdCAqc3ApCiB7CkBAIC0yNjQ3LDcgKzI2NjEsOSBAQAogCQlxbGFmeDAwX2Z4ZGlzY19pb2NiKHNwLCBwa3QpOwogCQlicmVhazsKIAljYXNlIFNSQl9BQlRfQ01EOgotCQlxbGFmeDAwX2Fib3J0X2lvY2Ioc3AsIHBrdCk7CisJCUlTX1FMQUZYMDAoaGEpID8KKwkJCXFsYWZ4MDBfYWJvcnRfaW9jYihzcCwgcGt0KSA6CisJCQlxbGEyNHh4X2Fib3J0X2lvY2Ioc3AsIHBrdCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IDBhMWRjYjQuLjk1MzE0ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTM1NiwxNSArMzU2LDE2IEBACiBjb25zdCBjaGFyICoKIHFsYTJ4MDBfZ2V0X2xpbmtfc3BlZWRfc3RyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQxNl90IHNwZWVkKQogewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGlua19zcGVlZHNbXSA9IHsKLQkJIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIsICIxNiIsICIxMCIKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbGlua19zcGVlZHNbXSA9IHsKKwkJIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIsICIxNiIsICIzMiIsICIxMCIKIAl9OworI2RlZmluZQlRTEFfTEFTVF9TUEVFRAk3CiAKIAlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCiAJCXJldHVybiBsaW5rX3NwZWVkc1swXTsKIAllbHNlIGlmIChzcGVlZCA9PSAweDEzKQotCQlyZXR1cm4gbGlua19zcGVlZHNbNl07Ci0JZWxzZSBpZiAoc3BlZWQgPCA2KQorCQlyZXR1cm4gbGlua19zcGVlZHNbUUxBX0xBU1RfU1BFRURdOworCWVsc2UgaWYgKHNwZWVkIDwgUUxBX0xBU1RfU1BFRUQpCiAJCXJldHVybiBsaW5rX3NwZWVkc1tzcGVlZF07CiAJZWxzZQogCQlyZXR1cm4gbGlua19zcGVlZHNbTFNfVU5LTk9XTl07CkBAIC02NDksNyArNjUwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9TWVNURU1fRVJSOgkJLyogU3lzdGVtIEVycm9yICovCi0JCW1ieCA9IChJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSkgPworCQltYnggPSAoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpID8KIAkJCVJEX1JFR19XT1JEKCZyZWcyNC0+bWFpbGJveDcpIDogMDsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAwMywKIAkJICAgICJJU1AgU3lzdGVtIEVycm9yIC0gbWJ4MT0leGggbWJ4Mj0leGggbWJ4Mz0leGggIgpAQCAtNjY2LDcgKzY2Nyw3IEBACiAJCQkJdmhhLT5kZXZpY2VfZmxhZ3MgfD0gREZMR19ERVZfRkFJTEVEOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBDaGVjayB0byBzZWUgaWYgTVBJIHRpbWVvdXQgb2NjdXJyZWQgKi8KLQkJCQlpZiAoKG1ieCAmIE1CWF8zKSAmJiAoaGEtPmZsYWdzLnBvcnQwKSkKKwkJCQlpZiAoKG1ieCAmIE1CWF8zKSAmJiAoaGEtPnBvcnRfbm8gPT0gMCkpCiAJCQkJCXNldF9iaXQoTVBJX1JFU0VUX05FRURFRCwKIAkJCQkJICAgICZ2aGEtPmRwY19mbGFncyk7CiAKQEAgLTE0OTcsOCArMTQ5OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyNHh4X3RtX2lvY2JfZW50cnkoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEsCi0gICAgc3RydWN0IHRza19tZ210X2VudHJ5ICp0c2spCitxbGEyNHh4X3RtX2lvY2JfZW50cnkoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEsIHZvaWQgKnRzaykKIHsKIAljb25zdCBjaGFyIGZ1bmNbXSA9ICJUTUYtSU9DQiI7CiAJY29uc3QgY2hhciAqdHlwZTsKQEAgLTE1MDYsNyArMTUwNiw2IEBACiAJc3JiX3QgKnNwOwogCXN0cnVjdCBzcmJfaW9jYiAqaW9jYjsKIAlzdHJ1Y3Qgc3RzX2VudHJ5XzI0eHggKnN0cyA9IChzdHJ1Y3Qgc3RzX2VudHJ5XzI0eHggKil0c2s7Ci0JaW50IGVycm9yID0gMTsKIAogCXNwID0gcWxhMngwMF9nZXRfc3BfZnJvbV9oYW5kbGUodmhhLCBmdW5jLCByZXEsIHRzayk7CiAJaWYgKCFzcCkKQEAgLTE1MTUsMzcgKzE1MTQsMzUgQEAKIAlpb2NiID0gJnNwLT51LmlvY2JfY21kOwogCXR5cGUgPSBzcC0+bmFtZTsKIAlmY3BvcnQgPSBzcC0+ZmNwb3J0OworCWlvY2ItPnUudG1mLmRhdGEgPSBRTEFfU1VDQ0VTUzsKIAogCWlmIChzdHMtPmVudHJ5X3N0YXR1cykgewogCQlxbF9sb2cocWxfbG9nX3dhcm4sIGZjcG9ydC0+dmhhLCAweDUwMzgsCiAJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBoZGw9JXggZW50cnktc3RhdHVzKCV4KS5cbiIsCiAJCSAgICB0eXBlLCBzcC0+aGFuZGxlLCBzdHMtPmVudHJ5X3N0YXR1cyk7CisJCWlvY2ItPnUudG1mLmRhdGEgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSBpZiAoc3RzLT5jb21wX3N0YXR1cyAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENTX0NPTVBMRVRFKSkgewogCQlxbF9sb2cocWxfbG9nX3dhcm4sIGZjcG9ydC0+dmhhLCAweDUwMzksCiAJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBoZGw9JXggY29tcGxldGlvbiBzdGF0dXMoJXgpLlxuIiwKIAkJICAgIHR5cGUsIHNwLT5oYW5kbGUsIHN0cy0+Y29tcF9zdGF0dXMpOwotCX0gZWxzZSBpZiAoIShsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSAmCisJCWlvY2ItPnUudG1mLmRhdGEgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSBpZiAoKGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpICYKIAkgICAgU1NfUkVTUE9OU0VfSU5GT19MRU5fVkFMSUQpKSB7Ci0JCXFsX2xvZyhxbF9sb2dfd2FybiwgZmNwb3J0LT52aGEsIDB4NTAzYSwKLQkJICAgICJBc3luYy0lcyBlcnJvciAtIGhkbD0leCBubyByZXNwb25zZSBpbmZvKCV4KS5cbiIsCi0JCSAgICB0eXBlLCBzcC0+aGFuZGxlLCBzdHMtPnNjc2lfc3RhdHVzKTsKLQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KHN0cy0+cnNwX2RhdGFfbGVuKSA8IDQpIHsKLQkJcWxfbG9nKHFsX2xvZ193YXJuLCBmY3BvcnQtPnZoYSwgMHg1MDNiLAotCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gaGRsPSV4IG5vdCBlbm91Z2ggcmVzcG9uc2UoJWQpLlxuIiwKLQkJICAgIHR5cGUsIHNwLT5oYW5kbGUsIHN0cy0+cnNwX2RhdGFfbGVuKTsKLQl9IGVsc2UgaWYgKHN0cy0+ZGF0YVszXSkgewotCQlxbF9sb2cocWxfbG9nX3dhcm4sIGZjcG9ydC0+dmhhLCAweDUwM2MsCi0JCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBoZGw9JXggcmVzcG9uc2UoJXgpLlxuIiwKLQkJICAgIHR5cGUsIHNwLT5oYW5kbGUsIHN0cy0+ZGF0YVszXSk7Ci0JfSBlbHNlIHsKLQkJZXJyb3IgPSAwOworCQlpZiAobGUzMl90b19jcHUoc3RzLT5yc3BfZGF0YV9sZW4pIDwgNCkgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCBmY3BvcnQtPnZoYSwgMHg1MDNiLAorCQkJICAgICJBc3luYy0lcyBlcnJvciAtIGhkbD0leCBub3QgZW5vdWdoIHJlc3BvbnNlKCVkKS5cbiIsCisJCQkgICAgdHlwZSwgc3AtPmhhbmRsZSwgc3RzLT5yc3BfZGF0YV9sZW4pOworCQl9IGVsc2UgaWYgKHN0cy0+ZGF0YVszXSkgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCBmY3BvcnQtPnZoYSwgMHg1MDNjLAorCQkJICAgICJBc3luYy0lcyBlcnJvciAtIGhkbD0leCByZXNwb25zZSgleCkuXG4iLAorCQkJICAgIHR5cGUsIHNwLT5oYW5kbGUsIHN0cy0+ZGF0YVszXSk7CisJCWlvY2ItPnUudG1mLmRhdGEgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9CiAJfQogCi0JaWYgKGVycm9yKSB7Ci0JCWlvY2ItPnUudG1mLmRhdGEgPSBlcnJvcjsKKwlpZiAoaW9jYi0+dS50bWYuZGF0YSAhPSBRTEFfU1VDQ0VTUykKIAkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2FzeW5jICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDUwNTUsCiAJCSAgICAodWludDhfdCAqKXN0cywgc2l6ZW9mKCpzdHMpKTsKLQl9CiAKIAlzcC0+ZG9uZSh2aGEsIHNwLCAwKTsKIH0KQEAgLTIwMjUsNiArMjAyMiwxMiBAQAogCQlyZXR1cm47CiAJfQogCisJLyogVGFzayBNYW5hZ2VtZW50IGNvbXBsZXRpb24uICovCisJaWYgKHNwLT50eXBlID09IFNSQl9UTV9DTUQpIHsKKwkJcWxhMjR4eF90bV9pb2NiX2VudHJ5KHZoYSwgcmVxLCBwa3QpOworCQlyZXR1cm47CisJfQorCiAJLyogRmFzdCBwYXRoIGNvbXBsZXRpb24uICovCiAJaWYgKGNvbXBfc3RhdHVzID09IENTX0NPTVBMRVRFICYmIHNjc2lfc3RhdHVzID09IDApIHsKIAkJcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KHZoYSwgcmVxLCBoYW5kbGUpOwpAQCAtMjQyNSw2ICsyNDI4LDIzIEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorcWxhMjR4eF9hYm9ydF9pb2NiX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxLAorCXN0cnVjdCBhYm9ydF9lbnRyeV8yNHh4ICpwa3QpCit7CisJY29uc3QgY2hhciBmdW5jW10gPSAiQUJUX0lPQ0IiOworCXNyYl90ICpzcDsKKwlzdHJ1Y3Qgc3JiX2lvY2IgKmFidDsKKworCXNwID0gcWxhMngwMF9nZXRfc3BfZnJvbV9oYW5kbGUodmhhLCBmdW5jLCByZXEsIHBrdCk7CisJaWYgKCFzcCkKKwkJcmV0dXJuOworCisJYWJ0ID0gJnNwLT51LmlvY2JfY21kOworCWFidC0+dS5hYnQuY29tcF9zdGF0dXMgPSBsZTMyX3RvX2NwdShwa3QtPm5wb3J0X2hhbmRsZSk7CisJc3AtPmRvbmUodmhhLCBzcCwgMCk7Cit9CisKIC8qKgogICogcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKCkgLSBQcm9jZXNzIHJlc3BvbnNlIHF1ZXVlIGVudHJpZXMuCiAgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKQEAgLTI0NzQsMTAgKzI0OTQsNiBAQAogCQkJcWxhMjR4eF9sb2dpb19lbnRyeSh2aGEsIHJzcC0+cmVxLAogCQkJICAgIChzdHJ1Y3QgbG9naW9fZW50cnlfMjR4eCAqKXBrdCk7CiAJCQlicmVhazsKLQkJY2FzZSBUU0tfTUdNVF9JT0NCX1RZUEU6Ci0JCQlxbGEyNHh4X3RtX2lvY2JfZW50cnkodmhhLCByc3AtPnJlcSwKLQkJCSAgICAoc3RydWN0IHRza19tZ210X2VudHJ5ICopcGt0KTsKLQkJCWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQ1RfSU9DQl9UWVBFOgogCQkJcWxhMjR4eF9lbHNfY3RfZW50cnkodmhhLCByc3AtPnJlcSwgcGt0LCBDVF9JT0NCX1RZUEUpOwogCQkJYnJlYWs7CkBAIC0yNDk3LDYgKzI1MTMsMTAgQEAKIAkJCSAqIGZyb20gZmFsbGluZyBpbnRvIGRlZmF1bHQgY2FzZQogCQkJICovCiAJCQlicmVhazsKKwkJY2FzZSBBQk9SVF9JT0NCX1RZUEU6CisJCQlxbGEyNHh4X2Fib3J0X2lvY2JfZW50cnkodmhhLCByc3AtPnJlcSwKKwkJCSAgICAoc3RydWN0IGFib3J0X2VudHJ5XzI0eHggKilwa3QpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiBUeXBlIE5vdCBTdXBwb3J0ZWQuICovCiAJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0MiwKQEAgLTI1MjUsNyArMjU0NSw4IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAKLQlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSAmJiAhSVNfUUxBODNYWChoYSkpCisJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpICYmCisJICAgICFJU19RTEEyN1hYKGhhKSkKIAkJcmV0dXJuOwogCiAJcnZhbCA9IFFMQV9TVUNDRVNTOwpAQCAtMjk3OSw3ICszMDAwLDcgQEAKIAl9CiAKIAkvKiBFbmFibGUgTVNJLVggdmVjdG9yIGZvciByZXNwb25zZSBxdWV1ZSB1cGRhdGUgZm9yIHF1ZXVlIDAgKi8KLQlpZiAoSVNfUUxBODNYWChoYSkpIHsKKwlpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpIHsKIAkJaWYgKGhhLT5tc2l4YmFzZSAmJiBoYS0+bXFpb2Jhc2UgJiYKIAkJICAgIChoYS0+bWF4X3JzcF9xdWV1ZXMgPiAxIHx8IGhhLT5tYXhfcmVxX3F1ZXVlcyA+IDEpKQogCQkJaGEtPm1xZW5hYmxlID0gMTsKQEAgLTMwMDMsMTIgKzMwMjQsMTMgQEAKIHFsYTJ4MDBfcmVxdWVzdF9pcnFzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHN0cnVjdCByc3BfcXVlICpyc3ApCiB7CiAJaW50IHJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJZGV2aWNlX3JlZ190ICpyZWcgPSBoYS0+aW9iYXNlOwogCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCS8qIElmIHBvc3NpYmxlLCBlbmFibGUgTVNJLVguICovCiAJaWYgKCFJU19RTEEyNDMyKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYgIUlTX1FMQTg0MzIoaGEpICYmCi0JCSFJU19DTkFfQ0FQQUJMRShoYSkgJiYgIUlTX1FMQTIwMzEoaGEpICYmICFJU19RTEFGWDAwKGhhKSkKKwkgICAgIUlTX0NOQV9DQVBBQkxFKGhhKSAmJiAhSVNfUUxBMjAzMShoYSkgJiYgIUlTX1FMQUZYMDAoaGEpICYmCisJICAgICFJU19RTEEyN1hYKGhhKSkKIAkJZ290byBza2lwX21zaTsKIAogCWlmIChoYS0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0hQICYmCkBAIC0zMDQzLDcgKzMwNjUsOCBAQAogCSAgICAiRmFsbGluZyBiYWNrLXRvIE1TSSBtb2RlIC0lZC5cbiIsIHJldCk7CiAKIAlpZiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJiAhSVNfUUxBODQzMihoYSkgJiYKLQkgICAgIUlTX1FMQTgwMDEoaGEpICYmICFJU19QM1BfVFlQRShoYSkgJiYgIUlTX1FMQUZYMDAoaGEpKQorCSAgICAhSVNfUUxBODAwMShoYSkgJiYgIUlTX1AzUF9UWVBFKGhhKSAmJiAhSVNfUUxBRlgwMChoYSkgJiYKKwkgICAgIUlTX1FMQTI3WFgoaGEpKQogCQlnb3RvIHNraXBfbXNpOwogCiAJcmV0ID0gcGNpX2VuYWJsZV9tc2koaGEtPnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCmluZGV4IGI5NDUxMWEuLjI1Mjg3MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKQEAgLTM1LDcgKzM1LDcgQEAKIHsKIAlpbnQJCXJ2YWw7CiAJdW5zaWduZWQgbG9uZyAgICBmbGFncyA9IDA7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKKwlkZXZpY2VfcmVnX3QgKnJlZzsKIAl1aW50OF90CQlhYm9ydF9hY3RpdmU7CiAJdWludDhfdAkJaW9fbG9ja19vbjsKIAl1aW50MTZfdAljb21tYW5kID0gMDsKQEAgLTQ2OCw3ICs0NjgsOCBAQAogCQltY3AtPm1iWzFdID0gTVNXKHJpc2NfYWRkcik7CiAJCW1jcC0+bWJbMl0gPSBMU1cocmlzY19hZGRyKTsKIAkJbWNwLT5tYlszXSA9IDA7Ci0JCWlmIChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSkgeworCQlpZiAoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkgfHwKKwkJICAgIElTX1FMQTI3WFgoaGEpKSB7CiAJCQlzdHJ1Y3QgbnZyYW1fODF4eCAqbnYgPSBoYS0+bnZyYW07CiAJCQltY3AtPm1iWzRdID0gKG52LT5lbmhhbmNlZF9mZWF0dXJlcyAmCiAJCQkgICAgRVhURU5ERURfQkJfQ1JFRElUUyk7CkBAIC01MzksNiArNTQwLDggQEAKIAkJbWNwLT5pbl9tYiB8PSBNQlhfMTN8TUJYXzEyfE1CWF8xMXxNQlhfMTB8TUJYXzl8TUJYXzg7CiAJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCW1jcC0+aW5fbWIgfD0gTUJYXzE3fE1CWF8xNnxNQlhfMTU7CisJaWYgKElTX1FMQTI3WFgoaGEpKQorCQltY3AtPmluX21iIHw9IE1CWF8yMXxNQlhfMjB8TUJYXzE5fE1CWF8xODsKIAltY3AtPmZsYWdzID0gMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwpAQCAtNTc0LDYgKzU3NywxMCBAQAogCQkgICAgIiVzOiBFeHRfRndBdHRyaWJ1dGVzIFVwcGVyOiAweCV4LCBMb3dlcjogMHgleC5cbiIsCiAJCSAgICBfX2Z1bmNfXywgbWNwLT5tYlsxN10sIG1jcC0+bWJbMTZdKTsKIAl9CisJaWYgKElTX1FMQTI3WFgoaGEpKSB7CisJCWhhLT5md19zaGFyZWRfcmFtX3N0YXJ0ID0gKG1jcC0+bWJbMTldIDw8IDE2KSB8IG1jcC0+bWJbMThdOworCQloYS0+Zndfc2hhcmVkX3JhbV9lbmQgPSAobWNwLT5tYlsyMV0gPDwgMTYpIHwgbWNwLT5tYlsyMF07CisJfQogCiBmYWlsZWQ6CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTEyMjUsNyArMTIzMiw3IEBACiAJfQogCS8qIDEgYW5kIDIgc2hvdWxkIG5vcm1hbGx5IGJlIGNhcHR1cmVkLiAqLwogCW1jcC0+aW5fbWIgPSBNQlhfMnxNQlhfMXxNQlhfMDsKLQlpZiAoSVNfUUxBODNYWChoYSkpCisJaWYgKElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQkvKiBtYjMgaXMgYWRkaXRpb25hbCBpbmZvIGFib3V0IHRoZSBpbnN0YWxsZWQgU0ZQLiAqLwogCQltY3AtPmluX21iICB8PSBNQlhfMzsKIAltY3AtPmJ1Zl9zaXplID0gc2l6ZTsKQEAgLTIzNDksNyArMjM1Niw3IEBACiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfUkVTT1VSQ0VfQ09VTlRTOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF8xMXxNQlhfMTB8TUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7Ci0JaWYgKElTX1FMQTgxWFgodmhhLT5odykgfHwgSVNfUUxBODNYWCh2aGEtPmh3KSkKKwlpZiAoSVNfUUxBODFYWCh2aGEtPmh3KSB8fCBJU19RTEE4M1hYKHZoYS0+aHcpIHx8IElTX1FMQTI3WFgodmhhLT5odykpCiAJCW1jcC0+aW5fbWIgfD0gTUJYXzEyOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwpAQCAtMjU5MCw2ICsyNTk3LDkgQEAKIAlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ192ZXJib3NlLCB2aGEsIDB4MTA4YywKIAkgICAgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKKwlpZiAocWwyeGFzeW5jdG1mZW5hYmxlKQorCQlyZXR1cm4gcWxhMjR4eF9hc3luY19hYm9ydF9jb21tYW5kKHNwKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCWZvciAoaGFuZGxlID0gMTsgaGFuZGxlIDwgcmVxLT5udW1fb3V0c3RhbmRpbmdfY21kczsgaGFuZGxlKyspIHsKIAkJaWYgKHJlcS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID09IHNwKQpAQCAtMzAzMiw3ICszMDQyLDcgQEAKIAkgICAgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIUlTX1FMQTI1WFgodmhhLT5odykgJiYgIUlTX1FMQTgxWFgodmhhLT5odykgJiYKLQkgICAgIUlTX1FMQTgzWFgodmhhLT5odykpCisJICAgICFJU19RTEE4M1hYKHZoYS0+aHcpICYmICFJU19RTEEyN1hYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKHZoYS0+aHctPnBkZXYpKSkKQEAgLTM2NjIsNyArMzY3Miw3IEBACiAJbWNwLT5tYlsxMl0gPSByZXEtPnFvczsKIAltY3AtPm1iWzExXSA9IHJlcS0+dnBfaWR4OwogCW1jcC0+bWJbMTNdID0gcmVxLT5yaWQ7Ci0JaWYgKElTX1FMQTgzWFgoaGEpKQorCWlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJbWNwLT5tYlsxNV0gPSAwOwogCiAJbWNwLT5tYls0XSA9IHJlcS0+aWQ7CkBAIC0zNjc2LDkgKzM2ODYsOSBAQAogCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX09VVDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUyAqIDI7CiAKLQlpZiAoSVNfUUxBODFYWChoYSkgfHwgSVNfUUxBODNYWChoYSkpCisJaWYgKElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQltY3AtPmluX21iIHw9IE1CWF8xOwotCWlmIChJU19RTEE4M1hYKGhhKSkgeworCWlmIChJU19RTEE4M1hYKGhhKSB8fCAhSVNfUUxBMjdYWChoYSkpIHsKIAkJbWNwLT5vdXRfbWIgfD0gTUJYXzE1OwogCQkvKiBkZWJ1ZyBxIGNyZWF0ZSBpc3N1ZSBpbiBTUi1JT1YgKi8KIAkJbWNwLT5pbl9tYiB8PSBNQlhfOSB8IE1CWF84IHwgTUJYXzc7CkBAIC0zNjg3LDcgKzM2OTcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCWlmICghKHJlcS0+b3B0aW9ucyAmIEJJVF8wKSkgewogCQlXUlRfUkVHX0RXT1JEKHJlcS0+cmVxX3FfaW4sIDApOwotCQlpZiAoIUlTX1FMQTgzWFgoaGEpKQorCQlpZiAoIUlTX1FMQTgzWFgoaGEpIHx8ICFJU19RTEEyN1hYKGhhKSkKIAkJCVdSVF9SRUdfRFdPUkQocmVxLT5yZXFfcV9vdXQsIDApOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMzcyNSw3ICszNzM1LDcgQEAKIAltY3AtPm1iWzVdID0gcnNwLT5sZW5ndGg7CiAJbWNwLT5tYlsxNF0gPSByc3AtPm1zaXgtPmVudHJ5OwogCW1jcC0+bWJbMTNdID0gcnNwLT5yaWQ7Ci0JaWYgKElTX1FMQTgzWFgoaGEpKQorCWlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJbWNwLT5tYlsxNV0gPSAwOwogCiAJbWNwLT5tYls0XSA9IHJzcC0+aWQ7CkBAIC0zNzQyLDcgKzM3NTIsNyBAQAogCWlmIChJU19RTEE4MVhYKGhhKSkgewogCQltY3AtPm91dF9tYiB8PSBNQlhfMTJ8TUJYXzExfE1CWF8xMDsKIAkJbWNwLT5pbl9tYiB8PSBNQlhfMTsKLQl9IGVsc2UgaWYgKElTX1FMQTgzWFgoaGEpKSB7CisJfSBlbHNlIGlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQltY3AtPm91dF9tYiB8PSBNQlhfMTV8TUJYXzEyfE1CWF8xMXxNQlhfMTA7CiAJCW1jcC0+aW5fbWIgfD0gTUJYXzE7CiAJCS8qIGRlYnVnIHEgY3JlYXRlIGlzc3VlIGluIFNSLUlPViAqLwpAQCAtMzgwOSw3ICszODE5LDggQEAKIAlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ192ZXJib3NlLCB2aGEsIDB4MTBkYywKIAkgICAgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykgJiYgIUlTX1FMQTgzWFgodmhhLT5odykpCisJaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpICYmICFJU19RTEE4M1hYKHZoYS0+aHcpICYmCisJICAgICFJU19RTEEyN1hYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCW1jcC0+bWJbMF0gPSBNQkNfRkxBU0hfQUNDRVNTX0NUUkw7CkBAIC0zODQwLDcgKzM4NTEsOCBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODNYWCh2aGEtPmh3KSkKKwlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykgJiYgIUlTX1FMQTgzWFgodmhhLT5odykgJiYKKwkgICAgIUlTX1FMQTI3WFgodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfdmVyYm9zZSwgdmhhLCAweDEwZGYsCkBAIC0zODc0LDcgKzM4ODYsOCBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSAmJiAhSVNfUUxBODNYWCh2aGEtPmh3KSkKKwlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykgJiYgIUlTX1FMQTgzWFgodmhhLT5odykgJiYKKwkgICAgIUlTX1FMQTI3WFgodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfdmVyYm9zZSwgdmhhLCAweDEwZTIsCkBAIC00NTQ1LDcgKzQ1NTgsNyBAQAogCW1jcC0+bWJbMV0gPSAwOwogCW1jcC0+b3V0X21iID0gTUJYXzF8TUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOwotCWlmIChJU19RTEE4M1hYKGhhKSkKKwlpZiAoSVNfUUxBODNYWChoYSkgfHwgSVNfUUxBMjdYWChoYSkpCiAJCW1jcC0+aW5fbWIgfD0gTUJYXzM7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IDA7CkBAIC00NTc0LDcgKzQ1ODcsOCBAQAogCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX3ZlcmJvc2UsIHZoYSwgMHgxMTA5LAogCSAgICAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAotCWlmICghSVNfUUxBODFYWChoYSkgJiYgIUlTX1FMQTgzWFgoaGEpICYmICFJU19RTEE4MDQ0KGhhKSkKKwlpZiAoIUlTX1FMQTgxWFgoaGEpICYmICFJU19RTEE4M1hYKGhhKSAmJiAhSVNfUUxBODA0NChoYSkgJiYKKwkgICAgIUlTX1FMQTI3WFgoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9QT1JUX0NPTkZJRzsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwpAQCAtNTA3MCw3ICs1MDg0LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlpZiAoIUlTX1FMQTgzWFgoaGEpKQorCWlmICghSVNfUUxBODNYWChoYSkgJiYgIUlTX1FMQTI3WFgoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX3ZlcmJvc2UsIHZoYSwgMHgxMTMwLApAQCAtNTE0NSw3ICs1MTU5LDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1bnNpZ25lZCBsb25nIHJldHJ5X21heF90aW1lID0gamlmZmllcyArICgyICogSFopOwogCi0JaWYgKCFJU19RTEE4M1hYKGhhKSkKKwlpZiAoIUlTX1FMQTgzWFgoaGEpICYmICFJU19RTEEyN1hYKGhhKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExNGIsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCmluZGV4IGE3MmRmNzAuLmYwYTg1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKQEAgLTYzMCw3ICs2MzAsNyBAQAogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBOVUxMOwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAJdWludDE2X3QgcXVlX2lkID0gMDsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOworCWRldmljZV9yZWdfdCAqcmVnOwogCXVpbnQzMl90IGNudDsKIAogCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXFfcXVlKSwgR0ZQX0tFUk5FTCk7CkBAIC03NTQsNyArNzU0LDcgQEAKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gTlVMTDsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCXVpbnQxNl90IHF1ZV9pZCA9IDA7Ci0JZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKKwlkZXZpY2VfcmVnX3QgKnJlZzsKIAogCXJzcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByc3BfcXVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJzcCA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5jCmluZGV4IGJhNmY4YjEuLjBhYWY2YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tci5jCkBAIC00MCw3ICs0MCw3IEBACiB7CiAJaW50CQlydmFsOwogCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3MgPSAwOwotCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CisJZGV2aWNlX3JlZ190ICpyZWc7CiAJdWludDhfdAkJYWJvcnRfYWN0aXZlOwogCXVpbnQ4X3QJCWlvX2xvY2tfb247CiAJdWludDE2X3QJY29tbWFuZCA9IDA7CkBAIC02MzEsMjAgKzYzMSw2IEBACiB7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfZngwMCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwZngwMDsKLQlzdHJ1Y3QgaW5pdF9jYl9meCAqaWNiOwotCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwotCXN0cnVjdCByc3BfcXVlICpyc3AgPSBoYS0+cnNwX3FfbWFwWzBdOwotCi0JLyogU2V0dXAgcmluZyBwYXJhbWV0ZXJzIGluIGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suICovCi0JaWNiID0gKHN0cnVjdCBpbml0X2NiX2Z4ICopaGEtPmluaXRfY2I7Ci0JaWNiLT5yZXF1ZXN0X3Ffb3V0cG9pbnRlciA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7Ci0JaWNiLT5yZXNwb25zZV9xX2lucG9pbnRlciA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7Ci0JaWNiLT5yZXF1ZXN0X3FfbGVuZ3RoID0gY3B1X3RvX2xlMTYocmVxLT5sZW5ndGgpOwotCWljYi0+cmVzcG9uc2VfcV9sZW5ndGggPSBjcHVfdG9fbGUxNihyc3AtPmxlbmd0aCk7Ci0JaWNiLT5yZXF1ZXN0X3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChyZXEtPmRtYSkpOwotCWljYi0+cmVxdWVzdF9xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QocmVxLT5kbWEpKTsKLQlpY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChyc3AtPmRtYSkpOwotCWljYi0+cmVzcG9uc2VfcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKHJzcC0+ZG1hKSk7CiAKIAlXUlRfUkVHX0RXT1JEKCZyZWctPnJlcV9xX2luLCAwKTsKIAlXUlRfUkVHX0RXT1JEKCZyZWctPnJlcV9xX291dCwgMCk7CkBAIC02OTksNzggKzY4NSwxNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkCi1xbGFmeDAwX3RtZl9pb2NiX3RpbWVvdXQodm9pZCAqZGF0YSkKLXsKLQlzcmJfdCAqc3AgPSAoc3JiX3QgKilkYXRhOwotCXN0cnVjdCBzcmJfaW9jYiAqdG1mID0gJnNwLT51LmlvY2JfY21kOwotCi0JdG1mLT51LnRtZi5jb21wX3N0YXR1cyA9IGNwdV90b19sZTE2KCh1aW50MTZfdClDU19USU1FT1VUKTsKLQljb21wbGV0ZSgmdG1mLT51LnRtZi5jb21wKTsKLX0KLQotc3RhdGljIHZvaWQKLXFsYWZ4MDBfdG1mX3NwX2RvbmUodm9pZCAqZGF0YSwgdm9pZCAqcHRyLCBpbnQgcmVzKQotewotCXNyYl90ICpzcCA9IChzcmJfdCAqKXB0cjsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKnRtZiA9ICZzcC0+dS5pb2NiX2NtZDsKLQotCWNvbXBsZXRlKCZ0bWYtPnUudG1mLmNvbXApOwotfQotCi1zdGF0aWMgaW50Ci1xbGFmeDAwX2FzeW5jX3RtX2NtZChmY19wb3J0X3QgKmZjcG9ydCwgdWludDMyX3QgZmxhZ3MsCi0JCSAgICAgdWludDMyX3QgbHVuLCB1aW50MzJfdCB0YWcpCi17Ci0Jc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBmY3BvcnQtPnZoYTsKLQlzdHJ1Y3Qgc3JiX2lvY2IgKnRtX2lvY2I7Ci0Jc3JiX3QgKnNwOwotCWludCBydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQotCXNwID0gcWxhMngwMF9nZXRfc3AodmhhLCBmY3BvcnQsIEdGUF9LRVJORUwpOwotCWlmICghc3ApCi0JCWdvdG8gZG9uZTsKLQotCXRtX2lvY2IgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0Jc3AtPnR5cGUgPSBTUkJfVE1fQ01EOwotCXNwLT5uYW1lID0gInRtZiI7Ci0JcWxhMngwMF9pbml0X3RpbWVyKHNwLCBxbGEyeDAwX2dldF9hc3luY190aW1lb3V0KHZoYSkpOwotCXRtX2lvY2ItPnUudG1mLmZsYWdzID0gZmxhZ3M7Ci0JdG1faW9jYi0+dS50bWYubHVuID0gbHVuOwotCXRtX2lvY2ItPnUudG1mLmRhdGEgPSB0YWc7Ci0Jc3AtPmRvbmUgPSBxbGFmeDAwX3RtZl9zcF9kb25lOwotCXRtX2lvY2ItPnRpbWVvdXQgPSBxbGFmeDAwX3RtZl9pb2NiX3RpbWVvdXQ7Ci0JaW5pdF9jb21wbGV0aW9uKCZ0bV9pb2NiLT51LnRtZi5jb21wKTsKLQotCXJ2YWwgPSBxbGEyeDAwX3N0YXJ0X3NwKHNwKTsKLQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKLQkJZ290byBkb25lX2ZyZWVfc3A7Ci0KLQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA3YiwKLQkgICAgIlRhc2sgbWFuYWdlbWVudCBjb21tYW5kIGlzc3VlZCB0YXJnZXRfaWQ9JXhcbiIsCi0JICAgIGZjcG9ydC0+dGd0X2lkKTsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRtX2lvY2ItPnUudG1mLmNvbXApOwotCi0JcnZhbCA9IHRtX2lvY2ItPnUudG1mLmNvbXBfc3RhdHVzID09IENTX0NPTVBMRVRFID8KLQkgICAgUUxBX1NVQ0NFU1MgOiBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCi1kb25lX2ZyZWVfc3A6Ci0Jc3AtPmZyZWUodmhhLCBzcCk7Ci1kb25lOgotCXJldHVybiBydmFsOwotfQotCiBpbnQKIHFsYWZ4MDBfYWJvcnRfdGFyZ2V0KGZjX3BvcnRfdCAqZmNwb3J0LCB1bnNpZ25lZCBpbnQgbCwgaW50IHRhZykKIHsKLQlyZXR1cm4gcWxhZngwMF9hc3luY190bV9jbWQoZmNwb3J0LCBUQ0ZfVEFSR0VUX1JFU0VULCBsLCB0YWcpOworCXJldHVybiBxbGEyeDAwX2FzeW5jX3RtX2NtZChmY3BvcnQsIFRDRl9UQVJHRVRfUkVTRVQsIGwsIHRhZyk7CiB9CiAKIGludAogcWxhZngwMF9sdW5fcmVzZXQoZmNfcG9ydF90ICpmY3BvcnQsIHVuc2lnbmVkIGludCBsLCBpbnQgdGFnKQogewotCXJldHVybiBxbGFmeDAwX2FzeW5jX3RtX2NtZChmY3BvcnQsIFRDRl9MVU5fUkVTRVQsIGwsIHRhZyk7CisJcmV0dXJuIHFsYTJ4MDBfYXN5bmNfdG1fY21kKGZjcG9ydCwgVENGX0xVTl9SRVNFVCwgbCwgdGFnKTsKIH0KIAogaW50CkBAIC05OTcsNiArOTIxLDkgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CisJCQlpZiAoKGFlbm1ieCAmIDB4RkYwMCkgPT0gTUJBX0ZXX0lOSVRfSU5QUk9HUkVTUykKKwkJCQlicmVhazsKKwogCQkJLyogSWYgZncgaXMgYXBwYXJlbnRseSBub3QgcmVhZHkuIEluIG9yZGVyIHRvIGNvbnRpbnVlLAogCQkJICogd2UgbWlnaHQgbmVlZCB0byBpc3N1ZSBNYm94IGNtZCwgYnV0IHRoZSBwcm9ibGVtIGlzCiAJCQkgKiB0aGF0IHRoZSBEb29yQmVsbCB2ZWN0b3IgdmFsdWVzIHRoYXQgY29tZSB3aXRoIHRoZQpAQCAtMjAxNCw3ICsxOTQxLDggQEAKIAkJbWVtY3B5KHZoYS0+aHctPmdpZF9saXN0LCBwaW5mbywgUUxBRlgwMF9UR1RfTk9ERV9MSVNUX1NJWkUpOwogCX0gZWxzZSBpZiAoZnhfdHlwZSA9PSBGWERJU0NfQUJPUlRfSU9DVEwpCiAJCWZkaXNjLT51LmZ4aW9jYi5yZXN1bHQgPQotCQkgICAgKGZkaXNjLT51LmZ4aW9jYi5yZXN1bHQgPT0gY3B1X3RvX2xlMzIoMHg2OCkpID8KKwkJICAgIChmZGlzYy0+dS5meGlvY2IucmVzdWx0ID09CisJCQljcHVfdG9fbGUzMihRTEFGWDAwX0lPQ1RMX0lDT0JfQUJPUlRfU1VDQ0VTUykpID8KIAkJICAgIGNwdV90b19sZTMyKFFMQV9TVUNDRVNTKSA6IGNwdV90b19sZTMyKFFMQV9GVU5DVElPTl9GQUlMRUQpOwogCiAJcnZhbCA9IGxlMzJfdG9fY3B1KGZkaXNjLT51LmZ4aW9jYi5yZXN1bHQpOwpAQCAtMjAzNCw5NCArMTk2Miw2IEBACiAJcmV0dXJuIHJ2YWw7CiB9CiAKLXN0YXRpYyB2b2lkCi1xbGFmeDAwX2Fib3J0X2lvY2JfdGltZW91dCh2b2lkICpkYXRhKQotewotCXNyYl90ICpzcCA9IChzcmJfdCAqKWRhdGE7Ci0Jc3RydWN0IHNyYl9pb2NiICphYnQgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0KLQlhYnQtPnUuYWJ0LmNvbXBfc3RhdHVzID0gY3B1X3RvX2xlMTYoKHVpbnQxNl90KUNTX1RJTUVPVVQpOwotCWNvbXBsZXRlKCZhYnQtPnUuYWJ0LmNvbXApOwotfQotCi1zdGF0aWMgdm9pZAotcWxhZngwMF9hYm9ydF9zcF9kb25lKHZvaWQgKmRhdGEsIHZvaWQgKnB0ciwgaW50IHJlcykKLXsKLQlzcmJfdCAqc3AgPSAoc3JiX3QgKilwdHI7Ci0Jc3RydWN0IHNyYl9pb2NiICphYnQgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0KLQljb21wbGV0ZSgmYWJ0LT51LmFidC5jb21wKTsKLX0KLQotc3RhdGljIGludAotcWxhZngwMF9hc3luY19hYnRfY21kKHNyYl90ICpjbWRfc3ApCi17Ci0Jc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBjbWRfc3AtPmZjcG9ydC0+dmhhOwotCWZjX3BvcnRfdCAqZmNwb3J0ID0gY21kX3NwLT5mY3BvcnQ7Ci0Jc3RydWN0IHNyYl9pb2NiICphYnRfaW9jYjsKLQlzcmJfdCAqc3A7Ci0JaW50IHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCi0Jc3AgPSBxbGEyeDAwX2dldF9zcCh2aGEsIGZjcG9ydCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcCkKLQkJZ290byBkb25lOwotCi0JYWJ0X2lvY2IgPSAmc3AtPnUuaW9jYl9jbWQ7Ci0Jc3AtPnR5cGUgPSBTUkJfQUJUX0NNRDsKLQlzcC0+bmFtZSA9ICJhYm9ydCI7Ci0JcWxhMngwMF9pbml0X3RpbWVyKHNwLCBGWERJU0NfVElNRU9VVCk7Ci0JYWJ0X2lvY2ItPnUuYWJ0LmNtZF9obmRsID0gY21kX3NwLT5oYW5kbGU7Ci0Jc3AtPmRvbmUgPSBxbGFmeDAwX2Fib3J0X3NwX2RvbmU7Ci0JYWJ0X2lvY2ItPnRpbWVvdXQgPSBxbGFmeDAwX2Fib3J0X2lvY2JfdGltZW91dDsKLQlpbml0X2NvbXBsZXRpb24oJmFidF9pb2NiLT51LmFidC5jb21wKTsKLQotCXJ2YWwgPSBxbGEyeDAwX3N0YXJ0X3NwKHNwKTsKLQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKLQkJZ290byBkb25lX2ZyZWVfc3A7Ci0KLQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA3YywKLQkgICAgIkFib3J0IGNvbW1hbmQgaXNzdWVkIC0gaGRsPSV4LCB0YXJnZXRfaWQ9JXhcbiIsCi0JICAgIGNtZF9zcC0+aGFuZGxlLCBmY3BvcnQtPnRndF9pZCk7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhYnRfaW9jYi0+dS5hYnQuY29tcCk7Ci0KLQlydmFsID0gYWJ0X2lvY2ItPnUuYWJ0LmNvbXBfc3RhdHVzID09IENTX0NPTVBMRVRFID8KLQkgICAgUUxBX1NVQ0NFU1MgOiBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCi1kb25lX2ZyZWVfc3A6Ci0Jc3AtPmZyZWUodmhhLCBzcCk7Ci1kb25lOgotCXJldHVybiBydmFsOwotfQotCi1pbnQKLXFsYWZ4MDBfYWJvcnRfY29tbWFuZChzcmJfdCAqc3ApCi17Ci0JdW5zaWduZWQgbG9uZyAgIGZsYWdzID0gMDsKLQotCXVpbnQzMl90CWhhbmRsZTsKLQlmY19wb3J0X3QJKmZjcG9ydCA9IHNwLT5mY3BvcnQ7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IGZjcG9ydC0+dmhhOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPnJlcTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCWZvciAoaGFuZGxlID0gMTsgaGFuZGxlIDwgREVGQVVMVF9PVVRTVEFORElOR19DT01NQU5EUzsgaGFuZGxlKyspIHsKLQkJaWYgKHJlcS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID09IHNwKQotCQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JaWYgKGhhbmRsZSA9PSBERUZBVUxUX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7Ci0JCS8qIENvbW1hbmQgbm90IGZvdW5kLiAqLwotCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQl9Ci0JaWYgKHNwLT50eXBlID09IFNSQl9GWElPQ0JfRENNRCkKLQkJcmV0dXJuIHFsYWZ4MDBfZnhfZGlzYyh2aGEsICZ2aGEtPmh3LT5tci5mY3BvcnQsCi0JCSAgICBGWERJU0NfQUJPUlRfSU9DVEwpOwotCi0JcmV0dXJuIHFsYWZ4MDBfYXN5bmNfYWJ0X2NtZChzcCk7Ci19Ci0KIC8qCiAgKiBxbGFmeDAwX2luaXRpYWxpemVfYWRhcHRlcgogICogICAgICBJbml0aWFsaXplIGJvYXJkLgpAQCAtMjE1MCw3ICsxOTkwLDYgQEAKIAl2aGEtPmRldmljZV9mbGFncyA9IERGTEdfTk9fQ0FCTEU7CiAJdmhhLT5kcGNfZmxhZ3MgPSAwOwogCXZoYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKLQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAwOwogCWhhLT5pc3BfYWJvcnRfY250ID0gMDsKIAloYS0+YmVhY29uX2JsaW5rX2xlZCA9IDA7CiAKQEAgLTIzNTQsOCArMjE5Myw3IEBACiAJCWZzdGF0dXMuaW9jdGxfZmxhZ3MgPSBwa3QtPmZ3X2lvdGNsX2ZsYWdzOwogCQlmc3RhdHVzLmlvY3RsX2RhdGEgPSBwa3QtPmRhdGF3b3JkX3I7CiAJCWZzdGF0dXMuYWRhcGlkID0gcGt0LT5hZGFwaWQ7Ci0JCWZzdGF0dXMuYWRhcGlkX2hpID0gcGt0LT5hZGFwaWRfaGk7Ci0JCWZzdGF0dXMucmVzZXJ2ZWRfMiA9IHBrdC0+cmVzZXJ2ZWRfMTsKKwkJZnN0YXR1cy5yZXNlcnZlZF8yID0gcGt0LT5kYXRhd29yZF9yX2V4dHJhOwogCQlmc3RhdHVzLnJlc19jb3VudCA9IHBrdC0+cmVzaWR1YWxsZW47CiAJCWZzdGF0dXMuc3RhdHVzID0gcGt0LT5zdGF0dXM7CiAJCWZzdGF0dXMuc2VxX251bWJlciA9IHBrdC0+c2VxX25vOwpAQCAtMjgwNCw3ICsyNjQyLDcgQEAKIAlzcmJfdCAqc3A7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJY29uc3QgY2hhciBmdW5jW10gPSAiRVJST1ItSU9DQiI7Ci0JdWludDE2X3QgcXVlID0gTVNXKHBrdC0+aGFuZGxlKTsKKwl1aW50MTZfdCBxdWUgPSAwOwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBOVUxMOwogCWludCByZXMgPSBESURfRVJST1IgPDwgMTY7CiAKQEAgLTI4MzMsMTYgKzI2NzEsMjIgQEAKIHsKIAlzdHJ1Y3Qgc3RzX2VudHJ5X2Z4MDAgKnBrdDsKIAlyZXNwb25zZV90ICpscHRyOworCXVpbnQxNl90IGxyZXFfcV9pbiA9IDA7CisJdWludDE2X3QgbHJlcV9xX291dCA9IDA7CiAKLQl3aGlsZSAoUkRfUkVHX0RXT1JEKCh2b2lkIF9faW9tZW0gKikmKHJzcC0+cmluZ19wdHItPnNpZ25hdHVyZSkpICE9Ci0JICAgIFJFU1BPTlNFX1BST0NFU1NFRCkgeworCWxyZXFfcV9pbiA9IFJEX1JFR19EV09SRChyc3AtPnJzcF9xX2luKTsKKwlscmVxX3Ffb3V0ID0gUkRfUkVHX0RXT1JEKHJzcC0+cnNwX3Ffb3V0KTsKKworCXdoaWxlIChscmVxX3FfaW4gIT0gbHJlcV9xX291dCkgewogCQlscHRyID0gcnNwLT5yaW5nX3B0cjsKIAkJbWVtY3B5X2Zyb21pbyhyc3AtPnJzcF9wa3QsICh2b2lkIF9faW9tZW0gKilscHRyLAogCQkgICAgc2l6ZW9mKHJzcC0+cnNwX3BrdCkpOwogCQlwa3QgPSAoc3RydWN0IHN0c19lbnRyeV9meDAwICopcnNwLT5yc3BfcGt0OwogCiAJCXJzcC0+cmluZ19pbmRleCsrOworCQlscmVxX3Ffb3V0Kys7CiAJCWlmIChyc3AtPnJpbmdfaW5kZXggPT0gcnNwLT5sZW5ndGgpIHsKKwkJCWxyZXFfcV9vdXQgPSAwOwogCQkJcnNwLT5yaW5nX2luZGV4ID0gMDsKIAkJCXJzcC0+cmluZ19wdHIgPSByc3AtPnJpbmc7CiAJCX0gZWxzZSB7CkBAIC0yODU0LDcgKzI2OTgsNiBAQAogCQkJcWxhZngwMF9lcnJvcl9lbnRyeSh2aGEsIHJzcCwKIAkJCSAgICAoc3RydWN0IHN0c19lbnRyeV9meDAwICopcGt0LCBwa3QtPmVudHJ5X3N0YXR1cywKIAkJCSAgICBwa3QtPmVudHJ5X3R5cGUpOwotCQkJZ290byBuZXh0X2l0ZXI7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yODg4LDEwICsyNzMxLDYgQEAKIAkJCSAgICBwa3QtPmVudHJ5X3R5cGUsIHBrdC0+ZW50cnlfc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9Ci1uZXh0X2l0ZXI6Ci0JCVdSVF9SRUdfRFdPUkQoKHZvaWQgX19pb21lbSAqKSZscHRyLT5zaWduYXR1cmUsCi0JCSAgICBSRVNQT05TRV9QUk9DRVNTRUQpOwotCQl3bWIoKTsKIAl9CiAKIAkvKiBBZGp1c3QgcmluZyBpbmRleCAqLwpAQCAtMjkyNiw5ICsyNzY1LDkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFFMQUZYMDBfTUJBX1BPUlRfVVBEQVRFOgkJLyogUG9ydCBkYXRhYmFzZSB1cGRhdGUgKi8KLQkJaGEtPmFlbm1iWzFdID0gUkRfUkVHX1dPUkQoJnJlZy0+YWVubWFpbGJveDEpOwotCQloYS0+YWVubWJbMl0gPSBSRF9SRUdfV09SRCgmcmVnLT5hZW5tYWlsYm94Mik7Ci0JCWhhLT5hZW5tYlszXSA9IFJEX1JFR19XT1JEKCZyZWctPmFlbm1haWxib3gzKTsKKwkJaGEtPmFlbm1iWzFdID0gUkRfUkVHX0RXT1JEKCZyZWctPmFlbm1haWxib3gxKTsKKwkJaGEtPmFlbm1iWzJdID0gUkRfUkVHX0RXT1JEKCZyZWctPmFlbm1haWxib3gyKTsKKwkJaGEtPmFlbm1iWzNdID0gUkRfUkVHX0RXT1JEKCZyZWctPmFlbm1haWxib3gzKTsKIAkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNzcsCiAJCSAgICAiQXN5bmNocm9ub3VzIHBvcnQgVXBkYXRlIHJlY2VpdmVkICIKIAkJICAgICJhZW5tYlswXTogJXgsIGFlbm1iWzFdOiAleCwgYWVubWJbMl06ICV4LCBhZW5tYlszXTogJXhcbiIsCkBAIC0yOTg1LDcgKzI4MjQsNyBAQAogcWxhZngwMF9tYnhfY29tcGxldGlvbihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDMyX3QgbWIwKQogewogCXVpbnQxNl90CWNudDsKLQl1aW50MTZfdCBfX2lvbWVtICp3cHRyOworCXVpbnQzMl90IF9faW9tZW0gKndwdHI7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfZngwMCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwZngwMDsKIApAQCAtMjk5NSwxMCArMjgzNCwxMCBAQAogCS8qIExvYWQgcmV0dXJuIG1haWxib3ggcmVnaXN0ZXJzLiAqLwogCWhhLT5mbGFncy5tYm94X2ludCA9IDE7CiAJaGEtPm1haWxib3hfb3V0MzJbMF0gPSBtYjA7Ci0Jd3B0ciA9ICh1aW50MTZfdCBfX2lvbWVtICopJnJlZy0+bWFpbGJveDE3OworCXdwdHIgPSAodWludDMyX3QgX19pb21lbSAqKSZyZWctPm1haWxib3gxNzsKIAogCWZvciAoY250ID0gMTsgY250IDwgaGEtPm1ieF9jb3VudDsgY250KyspIHsKLQkJaGEtPm1haWxib3hfb3V0MzJbY250XSA9IFJEX1JFR19XT1JEKHdwdHIpOworCQloYS0+bWFpbGJveF9vdXQzMltjbnRdID0gUkRfUkVHX0RXT1JEKHdwdHIpOwogCQl3cHRyKys7CiAJfQogfQpAQCAtMzAyNSw2ICsyODY0LDcgQEAKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJdWludDMyX3QgY2xyX2ludHIgPSAwOworCXVpbnQzMl90IGludHJfc3RhdCA9IDA7CiAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CkBAIC0zMDQ2LDM0ICsyODg2LDI2IEBACiAJCXN0YXQgPSBRTEFGWDAwX1JEX0lOVFJfUkVHKGhhKTsKIAkJaWYgKHFsYTJ4MDBfY2hlY2tfcmVnX2Zvcl9kaXNjb25uZWN0KHZoYSwgc3RhdCkpCiAJCQlicmVhazsKLQkJaWYgKChzdGF0ICYgUUxBRlgwMF9IU1RfSU5UX1NUU19CSVRTKSA9PSAwKQorCQlpbnRyX3N0YXQgPSBzdGF0ICYgUUxBRlgwMF9IU1RfSU5UX1NUU19CSVRTOworCQlpZiAoIWludHJfc3RhdCkKIAkJCWJyZWFrOwogCi0JCXN3aXRjaCAoc3RhdCAmIFFMQUZYMDBfSFNUX0lOVF9TVFNfQklUUykgewotCQljYXNlIFFMQUZYMDBfSU5UUl9NQl9DTVBMVDoKLQkJY2FzZSBRTEFGWDAwX0lOVFJfTUJfUlNQX0NNUExUOgotCQljYXNlIFFMQUZYMDBfSU5UUl9NQl9BU1lOQ19DTVBMVDoKLQkJY2FzZSBRTEFGWDAwX0lOVFJfQUxMX0NNUExUOgorCQlpZiAoc3RhdCAmIFFMQUZYMDBfSU5UUl9NQl9DTVBMVCkgewogCQkJbWJbMF0gPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MTYpOwogCQkJcWxhZngwMF9tYnhfY29tcGxldGlvbih2aGEsIG1iWzBdKTsKIAkJCXN0YXR1cyB8PSBNQlhfSU5URVJSVVBUOwogCQkJY2xyX2ludHIgfD0gUUxBRlgwMF9JTlRSX01CX0NNUExUOwotCQkJYnJlYWs7Ci0JCWNhc2UgUUxBRlgwMF9JTlRSX0FTWU5DX0NNUExUOgotCQljYXNlIFFMQUZYMDBfSU5UUl9SU1BfQVNZTkNfQ01QTFQ6CisJCX0KKwkJaWYgKGludHJfc3RhdCAmIFFMQUZYMDBfSU5UUl9BU1lOQ19DTVBMVCkgewogCQkJaGEtPmFlbm1iWzBdID0gUkRfUkVHX1dPUkQoJnJlZy0+YWVubWFpbGJveDApOwogCQkJcWxhZngwMF9hc3luY19ldmVudCh2aGEpOwogCQkJY2xyX2ludHIgfD0gUUxBRlgwMF9JTlRSX0FTWU5DX0NNUExUOwotCQkJYnJlYWs7Ci0JCWNhc2UgUUxBRlgwMF9JTlRSX1JTUF9DTVBMVDoKKwkJfQorCQlpZiAoaW50cl9zdGF0ICYgUUxBRlgwMF9JTlRSX1JTUF9DTVBMVCkgewogCQkJcWxhZngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHZoYSwgcnNwKTsKIAkJCWNscl9pbnRyIHw9IFFMQUZYMDBfSU5UUl9SU1BfQ01QTFQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDdhLAotCQkJICAgICJVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsIHN0YXQpOwotCQkJYnJlYWs7CiAJCX0KKwogCQlRTEFGWDAwX0NMUl9JTlRSX1JFRyhoYSwgY2xyX2ludHIpOwogCQlRTEFGWDAwX1JEX0lOVFJfUkVHKGhhKTsKIAl9CkBAIC0zMjIzLDE3ICszMDU1LDYgQEAKIAkvKiBTbyB3ZSBrbm93IHdlIGhhdmVuJ3QgcGNpX21hcCdlZCBhbnl0aGluZyB5ZXQgKi8KIAl0b3RfZHNkcyA9IDA7CiAKLQkvKiBGb3JjaW5nIG1hcmtlciBuZWVkZWQgZm9yIG5vdyAqLwotCXZoYS0+bWFya2VyX25lZWRlZCA9IDA7Ci0KLQkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZCAqLwotCWlmICh2aGEtPm1hcmtlcl9uZWVkZWQgIT0gMCkgewotCQlpZiAocWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgMCwgMCwgTUtfU1lOQ19BTEwpICE9Ci0JCSAgICBRTEFfU1VDQ0VTUykKLQkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAwOwotCX0KLQogCS8qIEFjcXVpcmUgcmluZyBzcGVjaWZpYyBsb2NrICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKQEAgLTMyODQsNyArMzEwNSw5IEBACiAJbWVtc2V0KCZsY21kX3BrdCwgMCwgUkVRVUVTVF9FTlRSWV9TSVpFKTsKIAogCWxjbWRfcGt0LmhhbmRsZSA9IE1BS0VfSEFORExFKHJlcS0+aWQsIHNwLT5oYW5kbGUpOwotCWxjbWRfcGt0LmhhbmRsZV9oaSA9IDA7CisJbGNtZF9wa3QucmVzZXJ2ZWRfMCA9IDA7CisJbGNtZF9wa3QucG9ydF9wYXRoX2N0cmwgPSAwOworCWxjbWRfcGt0LnJlc2VydmVkXzEgPSAwOwogCWxjbWRfcGt0LmRzZWdfY291bnQgPSBjcHVfdG9fbGUxNih0b3RfZHNkcyk7CiAJbGNtZF9wa3QudGd0X2lkeCA9IGNwdV90b19sZTE2KHNwLT5mY3BvcnQtPnRndF9pZCk7CiAKQEAgLTMzNjQsOCArMzE4Nyw3IEBACiAJdG1faW9jYi5lbnRyeV90eXBlID0gVFNLX01HTVRfSU9DQl9UWVBFX0ZYMDA7CiAJdG1faW9jYi5lbnRyeV9jb3VudCA9IDE7CiAJdG1faW9jYi5oYW5kbGUgPSBjcHVfdG9fbGUzMihNQUtFX0hBTkRMRShyZXEtPmlkLCBzcC0+aGFuZGxlKSk7Ci0JdG1faW9jYi5oYW5kbGVfaGkgPSAwOwotCXRtX2lvY2IudGltZW91dCA9IGNwdV90b19sZTE2KHFsYTJ4MDBfZ2V0X2FzeW5jX3RpbWVvdXQodmhhKSArIDIpOworCXRtX2lvY2IucmVzZXJ2ZWRfMCA9IDA7CiAJdG1faW9jYi50Z3RfaWQgPSBjcHVfdG9fbGUxNihzcC0+ZmNwb3J0LT50Z3RfaWQpOwogCXRtX2lvY2IuY29udHJvbF9mbGFncyA9IGNwdV90b19sZTMyKGZ4aW8tPnUudG1mLmZsYWdzKTsKIAlpZiAodG1faW9jYi5jb250cm9sX2ZsYWdzID09IGNwdV90b19sZTMyKCh1aW50MzJfdClUQ0ZfTFVOX1JFU0VUKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21yLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuaAppbmRleCA2Y2Q3MDcyLi5lNTI5ZGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbXIuaApAQCAtMjIsMTMgKzIyLDE2IEBACiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCiAKIAl1aW50MzJfdCBoYW5kbGU7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwotCXVpbnQzMl90IGhhbmRsZV9oaTsKKwl1aW50OF90IHJlc2VydmVkXzA7CisJdWludDhfdCBwb3J0X3BhdGhfY3RybDsKKwl1aW50MTZfdCByZXNlcnZlZF8xOwogCiAJX19sZTE2IHRndF9pZHg7CQkvKiBUYXJnZXQgSWR4LiAqLwogCXVpbnQxNl90IHRpbWVvdXQ7CQkvKiBDb21tYW5kIHRpbWVvdXQuICovCiAKIAlfX2xlMTYgZHNlZ19jb3VudDsJCS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KLQl1aW50MTZfdCBzY3NpX3JzcF9kc2RfbGVuOworCXVpbnQ4X3QJc2NzaV9yc3BfZHNkX2xlbjsKKwl1aW50OF90IHJlc2VydmVkXzI7CiAKIAlzdHJ1Y3Qgc2NzaV9sdW4gbHVuOwkJLyogTFVOIChMRSkuICovCiAKQEAgLTQ3LDMwICs1MCw2IEBACiAJdWludDMyX3QgZHNlZ18wX2xlbjsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KIH07CiAKLS8qCi0gKiBJU1AgcXVldWUgLSBtYXJrZXIgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCi0gKi8KLXN0cnVjdCBtcmtfZW50cnlfZngwMCB7Ci0JdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KLQl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCi0JdWludDhfdCBoYW5kbGVfY291bnQ7CQkvKiBIYW5kbGUgY291bnQuICovCi0JdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCi0KLQl1aW50MzJfdCBoYW5kbGU7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwotCXVpbnQzMl90IGhhbmRsZV9oaTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCi0KLQl1aW50MTZfdCB0Z3RfaWQ7CQkvKiBUYXJnZXQgSUQuICovCi0KLQl1aW50OF90IG1vZGlmaWVyOwkJLyogTW9kaWZpZXIgKDctMCkuICovCi0JdWludDhfdCByZXNlcnZlZF8xOwotCi0JdWludDhfdCByZXNlcnZlZF8yWzVdOwotCi0JdWludDhfdCBsdW5bOF07CQkJLyogRkNQIExVTiAoQkUpLiAqLwotCXVpbnQ4X3QgcmVzZXJ2ZWRfM1szNl07Ci19OwotCi0KICNkZWZpbmUJU1RBVFVTX1RZUEVfRlgwMAkweDAxCQkvKiBTdGF0dXMgZW50cnkuICovCiBzdHJ1Y3Qgc3RzX2VudHJ5X2Z4MDAgewogCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCkBAIC03OSw3ICs1OCw3IEBACiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCiAKIAl1aW50MzJfdCBoYW5kbGU7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLwotCXVpbnQzMl90IGhhbmRsZV9oaTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJdWludDMyX3QgcmVzZXJ2ZWRfMzsJCS8qIFN5c3RlbSBoYW5kbGUuICovCiAKIAlfX2xlMTYgY29tcF9zdGF0dXM7CQkvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KIAl1aW50MTZfdCByZXNlcnZlZF8wOwkJLyogT1hfSUQgdXNlZCBieSB0aGUgZmlybXdhcmUuICovCkBAIC0xMDIsNyArODEsNyBAQAogCiBzdHJ1Y3QgbXVsdGlfc3RzX2VudHJ5X2Z4MDAgewogCXVpbnQ4X3QgZW50cnlfdHlwZTsJCS8qIEVudHJ5IHR5cGUuICovCi0JdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJCS8qIEVudHJ5IGNvdW50LiAqLwogCXVpbnQ4X3QgaGFuZGxlX2NvdW50OwogCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwogCkBAIC0xMTgsMTUgKzk3LDEzIEBACiAKIAlfX2xlMzIgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KIAotCXVpbnQzMl90IGhhbmRsZV9oaTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJdWludDMyX3QgcmVzZXJ2ZWRfMDsKIAogCV9fbGUxNiB0Z3RfaWQ7CQkvKiBUYXJnZXQgSWR4LiAqLwogCiAJdWludDE2X3QgcmVzZXJ2ZWRfMTsKLQotCXVpbnQxNl90IGRlbGF5OwkJCS8qIEFjdGl2aXR5IGRlbGF5IGluIHNlY29uZHMuICovCi0KLQlfX2xlMTYgdGltZW91dDsJCS8qIENvbW1hbmQgdGltZW91dC4gKi8KKwl1aW50MTZfdCByZXNlcnZlZF8zOworCXVpbnQxNl90IHJlc2VydmVkXzQ7CiAKIAlzdHJ1Y3Qgc2NzaV9sdW4gbHVuOwkJLyogTFVOIChMRSkuICovCiAKQEAgLTE0NCwxMyArMTIxLDEzIEBACiAJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCiAKIAlfX2xlMzIgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KLQlfX2xlMzIgaGFuZGxlX2hpOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwlfX2xlMzIgcmVzZXJ2ZWRfMDsKIAogCV9fbGUxNiB0Z3RfaWRfc3RzOwkJLyogQ29tcGxldGlvbiBzdGF0dXMuICovCiAJX19sZTE2IG9wdGlvbnM7CiAKIAlfX2xlMzIgYWJvcnRfaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KLQlfX2xlMzIgYWJvcnRfaGFuZGxlX2hpOwkvKiBTeXN0ZW0gaGFuZGxlLiAqLworCV9fbGUzMiByZXNlcnZlZF8yOwogCiAJX19sZTE2IHJlcV9xdWVfbm87CiAJdWludDhfdCByZXNlcnZlZF8xWzM4XTsKQEAgLTE3MSw4ICsxNDgsNyBAQAogCiAJX19sZTMyIGRhdGF3b3JkX3I7CQkvKiBEYXRhIHdvcmQgcmV0dXJuZWQgKi8KIAl1aW50MzJfdCBhZGFwaWQ7CQkvKiBBZGFwdGVyIElEICovCi0JdWludDMyX3QgYWRhcGlkX2hpOwkJLyogQWRhcHRlciBJRCBoaWdoICovCi0JdWludDMyX3QgcmVzZXJ2ZWRfMTsKKwl1aW50MzJfdCBkYXRhd29yZF9yX2V4dHJhOwogCiAJX19sZTMyIHNlcV9ubzsKIAl1aW50OF90IHJlc2VydmVkXzJbMjBdOwpAQCAtMzYwLDExICszMzYsNyBAQAogCiAjZGVmaW5lIFFMQUZYMDBfSU5UUl9NQl9DTVBMVAkJMHgxCiAjZGVmaW5lIFFMQUZYMDBfSU5UUl9SU1BfQ01QTFQJCTB4MgotI2RlZmluZSBRTEFGWDAwX0lOVFJfTUJfUlNQX0NNUExUCTB4MwogI2RlZmluZSBRTEFGWDAwX0lOVFJfQVNZTkNfQ01QTFQJMHg0Ci0jZGVmaW5lIFFMQUZYMDBfSU5UUl9NQl9BU1lOQ19DTVBMVAkweDUKLSNkZWZpbmUgUUxBRlgwMF9JTlRSX1JTUF9BU1lOQ19DTVBMVAkweDYKLSNkZWZpbmUgUUxBRlgwMF9JTlRSX0FMTF9DTVBMVAkJMHg3CiAKICNkZWZpbmUgUUxBRlgwMF9NQkFfU1lTVEVNX0VSUgkJMHg4MDAyCiAjZGVmaW5lIFFMQUZYMDBfTUJBX1RFTVBfT1ZFUgkJMHg4MDA1CkBAIC01NDgsNCArNTIwLDcgQEAKIC8qIE1heCBjb25uY3VycmVudCBJT3MgdGhhdCBjYW4gYmUgcXVldWVkICovCiAjZGVmaW5lIFFMQUZYMDBfTUFYX0NBTlFVRVVFCQkxMDI0CiAKKy8qIElPQ1RMIElPQ0IgYWJvcnQgc3VjY2VzcyAqLworI2RlZmluZSBRTEFGWDAwX0lPQ1RMX0lDT0JfQUJPUlRfU1VDQ0VTUwkweDY4CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYwppbmRleCAxZTZiYTRhLi41NTExZTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYwpAQCAtMTY2NCwxMCArMTY2NCwxMCBAQAogCS8qIE1hcHBpbmcgb2YgSU8gYmFzZSBwb2ludGVyICovCiAJaWYgKElTX1FMQTgwNDQoaGEpKSB7CiAJCWhhLT5pb2Jhc2UgPQotCQkgICAgKGRldmljZV9yZWdfdCBfX2lvbWVtICopKCh1aW50OF90ICopaGEtPm54X3BjaWJhc2UpOworCQkgICAgKGRldmljZV9yZWdfdCAqKSgodWludDhfdCAqKWhhLT5ueF9wY2liYXNlKTsKIAl9IGVsc2UgaWYgKElTX1FMQTgyWFgoaGEpKSB7CiAJCWhhLT5pb2Jhc2UgPQotCQkgICAgKGRldmljZV9yZWdfdCBfX2lvbWVtICopKCh1aW50OF90ICopaGEtPm54X3BjaWJhc2UgKworCQkgICAgKGRldmljZV9yZWdfdCAqKSgodWludDhfdCAqKWhhLT5ueF9wY2liYXNlICsKIAkJCTB4YmMwMDAgKyAoaGEtPnBkZXYtPmRldmZuIDw8IDExKSk7CiAJfQogCkBAIC00NTAyLDMgKzQ1MDIsMjAgQEAKIAlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwogCXJldHVybiBydmFsOwogfQorCit2b2lkCitxbGE4Mnh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlpZiAoIWhhLT5hbGxvd19jbmFfZndfZHVtcCkKKwkJcmV0dXJuOworCisJc2NzaV9ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOworCWhhLT5mbGFncy5pc3A4Mnh4X25vX21kX2NhcCA9IDE7CisJcWxhODJ4eF9pZGNfbG9jayhoYSk7CisJcWxhODJ4eF9zZXRfcmVzZXRfb3duZXIodmhhKTsKKwlxbGE4Mnh4X2lkY191bmxvY2soaGEpOworCXFsYTJ4MDBfd2FpdF9mb3JfY2hpcF9yZXNldCh2aGEpOworCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254Mi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254Mi5jCmluZGV4IGY2MDk4OWQuLjg2Y2YxMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueDIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbngyLmMKQEAgLTE1NzgsOCArMTU3OCw4IEBACiAJCWRvIHsKIAkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGRldl9pbml0X3RpbWVvdXQpKSB7CiAJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjBjNCwKLQkJCQkgICAgIiVzOiBOb24gUmVzZXQgb3duZXIgREVWIElOSVQgIgotCQkJCSAgICAiVElNRU9VVCFcbiIsIF9fZnVuY19fKTsKKwkJCQkgICAgIiVzOiBOb24gUmVzZXQgb3duZXI6IFJlc2V0IEFjayBUaW1lb3V0IVxuIiwKKwkJCQkgICAgX19mdW5jX18pOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC0yMDE0LDggKzIwMTQsNiBAQAogCiAJLyogZG9uJ3QgcG9sbCBpZiByZXNldCBpcyBnb2luZyBvbiBvciBGVyBoYW5nIGluIHF1aWVzY2VudCBzdGF0ZSAqLwogCWlmICghKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRkNPRV9DVFhfUkVTRVRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSkgewogCQlkZXZfc3RhdGUgPSBxbGE4MDQ0X3JkX2RpcmVjdCh2aGEsIFFMQTgwNDRfQ1JCX0RFVl9TVEFURV9JTkRFWCk7CiAKQEAgLTM3MTUsMyArMzcxMywxOSBAQAogCXJldHVybiBydmFsOwogfQogCit2b2lkCitxbGE4MDQ0X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlpZiAoIWhhLT5hbGxvd19jbmFfZndfZHVtcCkKKwkJcmV0dXJuOworCisJc2NzaV9ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOworCWhhLT5mbGFncy5pc3A4Mnh4X25vX21kX2NhcCA9IDE7CisJcWxhODA0NF9pZGNfbG9jayhoYSk7CisJcWxhODJ4eF9zZXRfcmVzZXRfb3duZXIodmhhKTsKKwlxbGE4MDQ0X2lkY191bmxvY2soaGEpOworCXFsYTJ4MDBfd2FpdF9mb3JfY2hpcF9yZXNldCh2aGEpOworCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCA4OWE1MzAwLi4xOWU5OWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMTIwLDE1ICsxMjAsMTcgQEAKIGludCBxbDJ4ZW5hYmxlZGlmID0gMjsKIG1vZHVsZV9wYXJhbShxbDJ4ZW5hYmxlZGlmLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4ZW5hYmxlZGlmLAotCQkiIEVuYWJsZSBUMTAtQ1JDLURJRiAiCi0JCSIgRGVmYXVsdCBpcyAwIC0gTm8gRElGIFN1cHBvcnQuIDEgLSBFbmFibGUgaXQiCi0JCSIsIDIgLSBFbmFibGUgRElGIGZvciBhbGwgdHlwZXMsIGV4Y2VwdCBUeXBlIDAuIik7CisJCSIgRW5hYmxlIFQxMC1DUkMtRElGOlxuIgorCQkiIERlZmF1bHQgaXMgMi5cbiIKKwkJIiAgMCAtLSBObyBESUYgU3VwcG9ydFxuIgorCQkiICAxIC0tIEVuYWJsZSBESUYgZm9yIGFsbCB0eXBlc1xuIgorCQkiICAyIC0tIEVuYWJsZSBESUYgZm9yIGFsbCB0eXBlcywgZXhjZXB0IFR5cGUgMC5cbiIpOwogCiBpbnQgcWwyeGVuYWJsZWhiYV9lcnJfY2hrID0gMjsKIG1vZHVsZV9wYXJhbShxbDJ4ZW5hYmxlaGJhX2Vycl9jaGssIGludCwgU19JUlVHT3xTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGVuYWJsZWhiYV9lcnJfY2hrLAogCQkiIEVuYWJsZSBUMTAtQ1JDLURJRiBFcnJvciBpc29sYXRpb24gYnkgSEJBOlxuIgotCQkiIERlZmF1bHQgaXMgMS5cbiIKKwkJIiBEZWZhdWx0IGlzIDIuXG4iCiAJCSIgIDAgLS0gRXJyb3IgaXNvbGF0aW9uIGRpc2FibGVkXG4iCiAJCSIgIDEgLS0gRXJyb3IgaXNvbGF0aW9uIGVuYWJsZWQgb25seSBmb3IgRElYIFR5cGUgMFxuIgogCQkiICAyIC0tIEVycm9yIGlzb2xhdGlvbiBlbmFibGVkIGZvciBhbGwgVHlwZXNcbiIpOwpAQCAtMTk3NSw3ICsxOTc3LDcgQEAKIAkucHJlcF9tc19mZG1pX2lvY2IJPSBxbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiLAogCS5yZWFkX252cmFtCQk9IHFsYTI0eHhfcmVhZF9udnJhbV9kYXRhLAogCS53cml0ZV9udnJhbQkJPSBxbGEyNHh4X3dyaXRlX252cmFtX2RhdGEsCi0JLmZ3X2R1bXAJCT0gcWxhMjR4eF9md19kdW1wLAorCS5md19kdW1wCQk9IHFsYTgyeHhfZndfZHVtcCwKIAkuYmVhY29uX29uCQk9IHFsYTgyeHhfYmVhY29uX29uLAogCS5iZWFjb25fb2ZmCQk9IHFsYTgyeHhfYmVhY29uX29mZiwKIAkuYmVhY29uX2JsaW5rCQk9IE5VTEwsCkBAIC0yMDEzLDExICsyMDE1LDExIEBACiAJLnByZXBfbXNfZmRtaV9pb2NiCT0gcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYiwKIAkucmVhZF9udnJhbQkJPSBOVUxMLAogCS53cml0ZV9udnJhbQkJPSBOVUxMLAotCS5md19kdW1wCQk9IHFsYTI0eHhfZndfZHVtcCwKKwkuZndfZHVtcAkJPSBxbGE4MDQ0X2Z3X2R1bXAsCiAJLmJlYWNvbl9vbgkJPSBxbGE4Mnh4X2JlYWNvbl9vbiwKIAkuYmVhY29uX29mZgkJPSBxbGE4Mnh4X2JlYWNvbl9vZmYsCiAJLmJlYWNvbl9ibGluawkJPSBOVUxMLAotCS5yZWFkX29wdHJvbQkJPSBxbGE4Mnh4X3JlYWRfb3B0cm9tX2RhdGEsCisJLnJlYWRfb3B0cm9tCQk9IHFsYTgwNDRfcmVhZF9vcHRyb21fZGF0YSwKIAkud3JpdGVfb3B0cm9tCQk9IHFsYTgwNDRfd3JpdGVfb3B0cm9tX2RhdGEsCiAJLmdldF9mbGFzaF92ZXJzaW9uCT0gcWxhODJ4eF9nZXRfZmxhc2hfdmVyc2lvbiwKIAkuc3RhcnRfc2NzaSAgICAgICAgICAgICA9IHFsYTgyeHhfc3RhcnRfc2NzaSwKQEAgLTIwNzgsNyArMjA4MCw3IEBACiAJLmludHJfaGFuZGxlcgkJPSBxbGFmeDAwX2ludHJfaGFuZGxlciwKIAkuZW5hYmxlX2ludHJzCQk9IHFsYWZ4MDBfZW5hYmxlX2ludHJzLAogCS5kaXNhYmxlX2ludHJzCQk9IHFsYWZ4MDBfZGlzYWJsZV9pbnRycywKLQkuYWJvcnRfY29tbWFuZAkJPSBxbGFmeDAwX2Fib3J0X2NvbW1hbmQsCisJLmFib3J0X2NvbW1hbmQJCT0gcWxhMjR4eF9hc3luY19hYm9ydF9jb21tYW5kLAogCS50YXJnZXRfcmVzZXQJCT0gcWxhZngwMF9hYm9ydF90YXJnZXQsCiAJLmx1bl9yZXNldAkJPSBxbGFmeDAwX2x1bl9yZXNldCwKIAkuZmFicmljX2xvZ2luCQk9IE5VTEwsCkBAIC0yMTAyLDYgKzIxMDQsNDQgQEAKIAkuaW5pdGlhbGl6ZV9hZGFwdGVyCT0gcWxhZngwMF9pbml0aWFsaXplX2FkYXB0ZXIsCiB9OwogCitzdGF0aWMgc3RydWN0IGlzcF9vcGVyYXRpb25zIHFsYTI3eHhfaXNwX29wcyA9IHsKKwkucGNpX2NvbmZpZwkJPSBxbGEyNXh4X3BjaV9jb25maWcsCisJLnJlc2V0X2NoaXAJCT0gcWxhMjR4eF9yZXNldF9jaGlwLAorCS5jaGlwX2RpYWcJCT0gcWxhMjR4eF9jaGlwX2RpYWcsCisJLmNvbmZpZ19yaW5ncwkJPSBxbGEyNHh4X2NvbmZpZ19yaW5ncywKKwkucmVzZXRfYWRhcHRlcgkJPSBxbGEyNHh4X3Jlc2V0X2FkYXB0ZXIsCisJLm52cmFtX2NvbmZpZwkJPSBxbGE4MXh4X252cmFtX2NvbmZpZywKKwkudXBkYXRlX2Z3X29wdGlvbnMJPSBxbGE4MXh4X3VwZGF0ZV9md19vcHRpb25zLAorCS5sb2FkX3Jpc2MJCT0gcWxhODF4eF9sb2FkX3Jpc2MsCisJLnBjaV9pbmZvX3N0cgkJPSBxbGEyNHh4X3BjaV9pbmZvX3N0ciwKKwkuZndfdmVyc2lvbl9zdHIJCT0gcWxhMjR4eF9md192ZXJzaW9uX3N0ciwKKwkuaW50cl9oYW5kbGVyCQk9IHFsYTI0eHhfaW50cl9oYW5kbGVyLAorCS5lbmFibGVfaW50cnMJCT0gcWxhMjR4eF9lbmFibGVfaW50cnMsCisJLmRpc2FibGVfaW50cnMJCT0gcWxhMjR4eF9kaXNhYmxlX2ludHJzLAorCS5hYm9ydF9jb21tYW5kCQk9IHFsYTI0eHhfYWJvcnRfY29tbWFuZCwKKwkudGFyZ2V0X3Jlc2V0CQk9IHFsYTI0eHhfYWJvcnRfdGFyZ2V0LAorCS5sdW5fcmVzZXQJCT0gcWxhMjR4eF9sdW5fcmVzZXQsCisJLmZhYnJpY19sb2dpbgkJPSBxbGEyNHh4X2xvZ2luX2ZhYnJpYywKKwkuZmFicmljX2xvZ291dAkJPSBxbGEyNHh4X2ZhYnJpY19sb2dvdXQsCisJLmNhbGNfcmVxX2VudHJpZXMJPSBOVUxMLAorCS5idWlsZF9pb2NicwkJPSBOVUxMLAorCS5wcmVwX21zX2lvY2IJCT0gcWxhMjR4eF9wcmVwX21zX2lvY2IsCisJLnByZXBfbXNfZmRtaV9pb2NiCT0gcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYiwKKwkucmVhZF9udnJhbQkJPSBOVUxMLAorCS53cml0ZV9udnJhbQkJPSBOVUxMLAorCS5md19kdW1wCQk9IHFsYTI3eHhfZndkdW1wLAorCS5iZWFjb25fb24JCT0gcWxhMjR4eF9iZWFjb25fb24sCisJLmJlYWNvbl9vZmYJCT0gcWxhMjR4eF9iZWFjb25fb2ZmLAorCS5iZWFjb25fYmxpbmsJCT0gcWxhODN4eF9iZWFjb25fYmxpbmssCisJLnJlYWRfb3B0cm9tCQk9IHFsYTI1eHhfcmVhZF9vcHRyb21fZGF0YSwKKwkud3JpdGVfb3B0cm9tCQk9IHFsYTI0eHhfd3JpdGVfb3B0cm9tX2RhdGEsCisJLmdldF9mbGFzaF92ZXJzaW9uCT0gcWxhMjR4eF9nZXRfZmxhc2hfdmVyc2lvbiwKKwkuc3RhcnRfc2NzaQkJPSBxbGEyNHh4X2RpZl9zdGFydF9zY3NpLAorCS5hYm9ydF9pc3AJCT0gcWxhMngwMF9hYm9ydF9pc3AsCisJLmlvc3BhY2VfY29uZmlnCQk9IHFsYTgzeHhfaW9zcGFjZV9jb25maWcsCisJLmluaXRpYWxpemVfYWRhcHRlcgk9IHFsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyLAorfTsKKwogc3RhdGljIGlubGluZSB2b2lkCiBxbGEyeDAwX3NldF9pc3BfZmxhZ3Moc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKQEAgLTIyMjMsMjEgKzIyNjMsMjkgQEAKIAljYXNlIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUEYwMDE6CiAJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9JU1BGWDAwOwogCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIwNzE6CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9JU1AyMDcxOworCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfWklPX1NVUFBPUlRFRDsKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0ZXSTI7CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9JSURNQTsKKwkJaGEtPmZ3X3NyaXNjX2FkZHJlc3MgPSBSSVNDX1NUQVJUX0FERFJFU1NfMjQwMDsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKElTX1FMQTgyWFgoaGEpKQotCQloYS0+cG9ydF9ubyA9ICEoaGEtPnBvcnRudW0gJiAxKTsKLQllbHNlCisJCWhhLT5wb3J0X25vID0gaGEtPnBvcnRudW0gJiAxOworCWVsc2UgewogCQkvKiBHZXQgYWRhcHRlciBwaHlzaWNhbCBwb3J0IG5vIGZyb20gaW50ZXJydXB0IHBpbiByZWdpc3Rlci4gKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaGEtPnBkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmaGEtPnBvcnRfbm8pOworCQlpZiAoSVNfUUxBMjdYWChoYSkpCisJCQloYS0+cG9ydF9uby0tOworCQllbHNlCisJCQloYS0+cG9ydF9ubyA9ICEoaGEtPnBvcnRfbm8gJiAxKTsKKwl9CiAKLQlpZiAoaGEtPnBvcnRfbm8gJiAxKQotCQloYS0+ZmxhZ3MucG9ydDAgPSAxOwotCWVsc2UKLQkJaGEtPmZsYWdzLnBvcnQwID0gMDsKIAlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBoYS0+cGRldiwgMHgwMDBiLAogCSAgICAiZGV2aWNlX3R5cGU9MHgleCBwb3J0PSVkIGZ3X3NyaXNjX2FkZHJlc3M9MHgleC5cbiIsCi0JICAgIGhhLT5kZXZpY2VfdHlwZSwgaGEtPmZsYWdzLnBvcnQwLCBoYS0+Zndfc3Jpc2NfYWRkcmVzcyk7CisJICAgIGhhLT5kZXZpY2VfdHlwZSwgaGEtPnBvcnRfbm8sIGhhLT5md19zcmlzY19hZGRyZXNzKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTIyOTcsNyArMjM0NSw4IEBACiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMDMxIHx8CiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDMxIHx8CiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1BGMDAxIHx8Ci0JICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDQ0KSB7CisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDQ0IHx8CisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMDcxKSB7CiAJCWJhcnMgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pOwogCQltZW1fb25seSA9IDE7CiAJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIHBkZXYsIDB4MDAwNywKQEAgLTIzMzQsMTMgKzIzODMsMTQgQEAKIAlzcGluX2xvY2tfaW5pdCgmaGEtPmhhcmR3YXJlX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZoYS0+dnBvcnRfc2xvY2spOwogCW11dGV4X2luaXQoJmhhLT5zZWxmbG9naW5fbG9jayk7CisJbXV0ZXhfaW5pdCgmaGEtPm9wdHJvbV9tdXRleCk7CiAKIAkvKiBTZXQgSVNQLXR5cGUgaW5mb3JtYXRpb24uICovCiAJcWxhMngwMF9zZXRfaXNwX2ZsYWdzKGhhKTsKIAogCS8qIFNldCBFRUggcmVzZXQgdHlwZSB0byBmdW5kYW1lbnRhbCBpZiByZXF1aXJlZCBieSBoYmEgKi8KIAlpZiAoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkgfHwKLQkgICAgSVNfUUxBODNYWChoYSkpCisJICAgIElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKQogCQlwZGV2LT5uZWVkc19mcmVzZXQgPSAxOwogCiAJaGEtPnByZXZfdG9wb2xvZ3kgPSAwOwpAQCAtMjQ4OCw3ICsyNTM4LDYgQEAKIAkJaGEtPmFlbl9tYnhfY291bnQgPSBBRU5fTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF9GWDAwOwogCQlyZXFfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfRlgwMDsKIAkJcnNwX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF9GWDAwOwotCQloYS0+aW5pdF9jYl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbml0X2NiX2Z4KTsKIAkJaGEtPmlzcF9vcHMgPSAmcWxhZngwMF9pc3Bfb3BzOwogCQloYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID0gMzA7IC8qIGRlZmF1bHQgdmFsdWUgKi8KIAkJaGEtPm1yLmZ3X2hidF9jbnQgPSBRTEFGWDAwX0hFQVJUQkVBVF9JTlRFUlZBTDsKQEAgLTI0OTcsNiArMjU0NiwyMiBAQAogCQloYS0+bXIuZndfaGJ0X2VuID0gMTsKIAkJaGEtPm1yLmhvc3RfaW5mb19yZXNlbmQgPSBmYWxzZTsKIAkJaGEtPm1yLmhpbmZvX3Jlc2VuZF90aW1lcl90aWNrID0gUUxBRlgwMF9ISU5GT19SRVNFTkRfSU5URVJWQUw7CisJfSBlbHNlIGlmIChJU19RTEEyN1hYKGhhKSkgeworCQloYS0+cG9ydG51bSA9IFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbik7CisJCWhhLT5tYXhfZmlicmVfZGV2aWNlcyA9IE1BWF9GSUJSRV9ERVZJQ0VTXzI0MDA7CisJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOworCQlyZXFfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjRYWDsKKwkJcnNwX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF8yMzAwOworCQloYS0+bWF4X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIzMDA7CisJCWhhLT5pbml0X2NiX3NpemUgPSBzaXplb2Yoc3RydWN0IG1pZF9pbml0X2NiXzgxeHgpOworCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gODsKKwkJaGEtPm9wdHJvbV9zaXplID0gT1BUUk9NX1NJWkVfODNYWDsKKwkJaGEtPm52cmFtX25waXZfc2l6ZSA9IFFMQV9NQVhfVlBPUlRTX1FMQTI1WFg7CisJCWhhLT5pc3Bfb3BzID0gJnFsYTI3eHhfaXNwX29wczsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gRkFSWF9BQ0NFU1NfRkxBU0hfQ09ORl84MVhYOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBXzgxWFg7CisJCWhhLT5udnJhbV9jb25mX29mZiA9IH4wOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSB+MDsKIAl9CiAKIAlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBwZGV2LCAweDAwMWUsCkBAIC0yNTM2LDcgKzI2MDEsNyBAQAogCSAgICBoYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPyAiZW5hYmxlIiA6CiAJICAgICJkaXNhYmxlIik7CiAJcmV0ID0gcWxhMngwMF9tZW1fYWxsb2MoaGEsIHJlcV9sZW5ndGgsIHJzcF9sZW5ndGgsICZyZXEsICZyc3ApOwotCWlmICghcmV0KSB7CisJaWYgKHJldCkgewogCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgcGRldiwgMHgwMDMxLAogCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXIsIGFib3J0aW5nLlxuIik7CiAKQEAgLTI1NjEsMTAgKzI2MjYsNiBAQAogCiAJaG9zdCA9IGJhc2VfdmhhLT5ob3N0OwogCWJhc2VfdmhhLT5yZXEgPSByZXE7Ci0JaWYgKElTX1FMQUZYMDAoaGEpKQotCQlob3N0LT5jYW5fcXVldWUgPSBRTEFGWDAwX01BWF9DQU5RVUVVRTsKLQllbHNlCi0JCWhvc3QtPmNhbl9xdWV1ZSA9IHJlcS0+bGVuZ3RoICsgMTI4OwogCWlmIChJU19RTEEyWFhYX01JRFRZUEUoaGEpKQogCQliYXNlX3ZoYS0+bWdtdF9zdnJfbG9vcF9pZCA9IDEwICsgYmFzZV92aGEtPnZwX2lkeDsKIAllbHNlCkBAIC0yNTg3LDExICsyNjQ4LDYgQEAKIAkJaWYgKCFJU19RTEE4MlhYKGhhKSkKIAkJCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IFFMQV9TR19BTEw7CiAJfQotCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDAzMiwKLQkgICAgImNhbl9xdWV1ZT0lZCwgcmVxPSVwLCAiCi0JICAgICJtZ210X3N2cl9sb29wX2lkPSVkLCBzZ190YWJsZXNpemU9JWQuXG4iLAotCSAgICBob3N0LT5jYW5fcXVldWUsIGJhc2VfdmhhLT5yZXEsCi0JICAgIGJhc2VfdmhhLT5tZ210X3N2cl9sb29wX2lkLCBob3N0LT5zZ190YWJsZXNpemUpOwogCWhvc3QtPm1heF9pZCA9IGhhLT5tYXhfZmlicmVfZGV2aWNlczsKIAlob3N0LT5jbWRfcGVyX2x1biA9IDM7CiAJaG9zdC0+dW5pcXVlX2lkID0gaG9zdC0+aG9zdF9ubzsKQEAgLTI2NDYsNyArMjcwMiw3IEBACiAJcmVxLT5yZXFfcV9vdXQgPSAmaGEtPmlvYmFzZS0+aXNwMjQucmVxX3Ffb3V0OwogCXJzcC0+cnNwX3FfaW4gPSAmaGEtPmlvYmFzZS0+aXNwMjQucnNwX3FfaW47CiAJcnNwLT5yc3BfcV9vdXQgPSAmaGEtPmlvYmFzZS0+aXNwMjQucnNwX3Ffb3V0OwotCWlmIChoYS0+bXFlbmFibGUgfHwgSVNfUUxBODNYWChoYSkpIHsKKwlpZiAoaGEtPm1xZW5hYmxlIHx8IElTX1FMQTgzWFgoaGEpIHx8IElTX1FMQTI3WFgoaGEpKSB7CiAJCXJlcS0+cmVxX3FfaW4gPSAmaGEtPm1xaW9iYXNlLT5pc3AyNW1xLnJlcV9xX2luOwogCQlyZXEtPnJlcV9xX291dCA9ICZoYS0+bXFpb2Jhc2UtPmlzcDI1bXEucmVxX3Ffb3V0OwogCQlyc3AtPnJzcF9xX2luID0gJmhhLT5tcWlvYmFzZS0+aXNwMjVtcS5yc3BfcV9pbjsKQEAgLTI3MDcsNiArMjc2MywxNiBAQAogCQlnb3RvIHByb2JlX2ZhaWxlZDsKIAl9CiAKKwlpZiAoSVNfUUxBRlgwMChoYSkpCisJCWhvc3QtPmNhbl9xdWV1ZSA9IFFMQUZYMDBfTUFYX0NBTlFVRVVFOworCWVsc2UKKwkJaG9zdC0+Y2FuX3F1ZXVlID0gcmVxLT5udW1fb3V0c3RhbmRpbmdfY21kcyAtIDEwOworCisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMDMyLAorCSAgICAiY2FuX3F1ZXVlPSVkLCByZXE9JXAsIG1nbXRfc3ZyX2xvb3BfaWQ9JWQsIHNnX3RhYmxlc2l6ZT0lZC5cbiIsCisJICAgIGhvc3QtPmNhbl9xdWV1ZSwgYmFzZV92aGEtPnJlcSwKKwkgICAgYmFzZV92aGEtPm1nbXRfc3ZyX2xvb3BfaWQsIGhvc3QtPnNnX3RhYmxlc2l6ZSk7CisKIAlpZiAoaGEtPm1xZW5hYmxlKSB7CiAJCWlmIChxbGEyNXh4X3NldHVwX21vZGUoYmFzZV92aGEpKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDAwZWMsCkBAIC0yODg3LDkgKzI5NTMsOSBAQAogaW9zcGFjZV9jb25maWdfZmFpbGVkOgogCWlmIChJU19QM1BfVFlQRShoYSkpIHsKIAkJaWYgKCFoYS0+bnhfcGNpYmFzZSkKLQkJCWlvdW5tYXAoKGRldmljZV9yZWdfdCBfX2lvbWVtICopaGEtPm54X3BjaWJhc2UpOworCQkJaW91bm1hcCgoZGV2aWNlX3JlZ190ICopaGEtPm54X3BjaWJhc2UpOwogCQlpZiAoIXFsMnhkYndyKQotCQkJaW91bm1hcCgoZGV2aWNlX3JlZ190IF9faW9tZW0gKiloYS0+bnhkYl93cl9wdHIpOworCQkJaW91bm1hcCgoZGV2aWNlX3JlZ190ICopaGEtPm54ZGJfd3JfcHRyKTsKIAl9IGVsc2UgewogCQlpZiAoaGEtPmlvYmFzZSkKIAkJCWlvdW5tYXAoaGEtPmlvYmFzZSk7CkBAIC0zMDIwLDkgKzMwODYsOSBAQAogewogCWlmIChJU19RTEE4MlhYKGhhKSkgewogCi0JCWlvdW5tYXAoKGRldmljZV9yZWdfdCBfX2lvbWVtICopaGEtPm54X3BjaWJhc2UpOworCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgKiloYS0+bnhfcGNpYmFzZSk7CiAJCWlmICghcWwyeGRid3IpCi0JCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgX19pb21lbSAqKWhhLT5ueGRiX3dyX3B0cik7CisJCQlpb3VubWFwKChkZXZpY2VfcmVnX3QgKiloYS0+bnhkYl93cl9wdHIpOwogCX0gZWxzZSB7CiAJCWlmIChoYS0+aW9iYXNlKQogCQkJaW91bm1hcChoYS0+aW9iYXNlKTsKQEAgLTMwMzMsNyArMzA5OSw3IEBACiAJCWlmIChoYS0+bXFpb2Jhc2UpCiAJCQlpb3VubWFwKGhhLT5tcWlvYmFzZSk7CiAKLQkJaWYgKElTX1FMQTgzWFgoaGEpICYmIGhhLT5tc2l4YmFzZSkKKwkJaWYgKChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgJiYgaGEtPm1zaXhiYXNlKQogCQkJaW91bm1hcChoYS0+bXNpeGJhc2UpOwogCX0KIH0KQEAgLTM0NDcsNyArMzUxMyw3IEBACiAJCWhhLT5ucGl2X2luZm8gPSBOVUxMOwogCiAJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgRVgtSU5JVC1DQi4gKi8KLQlpZiAoSVNfQ05BX0NBUEFCTEUoaGEpIHx8IElTX1FMQTIwMzEoaGEpKSB7CisJaWYgKElTX0NOQV9DQVBBQkxFKGhhKSB8fCBJU19RTEEyMDMxKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQloYS0+ZXhfaW5pdF9jYiA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLAogCQkgICAgJmhhLT5leF9pbml0X2NiX2RtYSk7CiAJCWlmICghaGEtPmV4X2luaXRfY2IpCkBAIC0zNDc4LDEwICszNTQ0LDEwIEBACiAJZWxzZSB7CiAJCXFsYTJ4MDBfc2V0X3Jlc2VydmVkX2xvb3BfaWRzKGhhKTsKIAkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDEyMywKLQkJICAgICJsb29wX2lkX21hcD0lcC4gXG4iLCBoYS0+bG9vcF9pZF9tYXApOworCQkgICAgImxvb3BfaWRfbWFwPSVwLlxuIiwgaGEtPmxvb3BfaWRfbWFwKTsKIAl9CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIAogZmFpbF9hc3luY19wZDoKIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBoYS0+ZXhfaW5pdF9jYiwgaGEtPmV4X2luaXRfY2JfZG1hKTsKQEAgLTM1NjIsMjIgKzM2MjgsMjggQEAKIHFsYTJ4MDBfZnJlZV9md19kdW1wKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJaWYgKGhhLT5mY2UpCi0JCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBGQ0VfU0laRSwgaGEtPmZjZSwKLQkJICAgIGhhLT5mY2VfZG1hKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCSAgICBGQ0VfU0laRSwgaGEtPmZjZSwgaGEtPmZjZV9kbWEpOwogCi0JaWYgKGhhLT5md19kdW1wKSB7Ci0JCWlmIChoYS0+ZWZ0KQotCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCi0JCQkgICAgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKSwgaGEtPmVmdCwgaGEtPmVmdF9kbWEpOworCWlmIChoYS0+ZWZ0KQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJICAgIEVGVF9TSVpFLCBoYS0+ZWZ0LCBoYS0+ZWZ0X2RtYSk7CisKKwlpZiAoaGEtPmZ3X2R1bXApCiAJCXZmcmVlKGhhLT5md19kdW1wKTsKLQl9CisJaWYgKGhhLT5md19kdW1wX3RlbXBsYXRlKQorCQl2ZnJlZShoYS0+ZndfZHVtcF90ZW1wbGF0ZSk7CisKIAloYS0+ZmNlID0gTlVMTDsKIAloYS0+ZmNlX2RtYSA9IDA7CiAJaGEtPmVmdCA9IE5VTEw7CiAJaGEtPmVmdF9kbWEgPSAwOwotCWhhLT5md19kdW1wID0gTlVMTDsKIAloYS0+ZndfZHVtcGVkID0gMDsKIAloYS0+ZndfZHVtcF9yZWFkaW5nID0gMDsKKwloYS0+ZndfZHVtcCA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfbGVuID0gMDsKKwloYS0+ZndfZHVtcF90ZW1wbGF0ZSA9IE5VTEw7CisJaGEtPmZ3X2R1bXBfdGVtcGxhdGVfbGVuID0gMDsKIH0KIAogLyoKQEAgLTUyNDIsNyArNTMxNCw3IEBACiAKIC8qIEZpcm13YXJlIGludGVyZmFjZSByb3V0aW5lcy4gKi8KIAotI2RlZmluZSBGV19CTE9CUwkxMAorI2RlZmluZSBGV19CTE9CUwkxMQogI2RlZmluZSBGV19JU1AyMVhYCTAKICNkZWZpbmUgRldfSVNQMjJYWAkxCiAjZGVmaW5lIEZXX0lTUDIzMDAJMgpAQCAtNTI1Myw2ICs1MzI1LDcgQEAKICNkZWZpbmUgRldfSVNQODJYWAk3CiAjZGVmaW5lIEZXX0lTUDIwMzEJOAogI2RlZmluZSBGV19JU1A4MDMxCTkKKyNkZWZpbmUgRldfSVNQMjA3MQkxMAogCiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjFYWAkicWwyMTAwX2Z3LmJpbiIKICNkZWZpbmUgRldfRklMRV9JU1AyMlhYCSJxbDIyMDBfZncuYmluIgpAQCAtNTI2NCw2ICs1MzM3LDggQEAKICNkZWZpbmUgRldfRklMRV9JU1A4MlhYCSJxbDgyMDBfZncuYmluIgogI2RlZmluZSBGV19GSUxFX0lTUDIwMzEJInFsMjYwMF9mdy5iaW4iCiAjZGVmaW5lIEZXX0ZJTEVfSVNQODAzMQkicWw4MzAwX2Z3LmJpbiIKKyNkZWZpbmUgRldfRklMRV9JU1AyMDcxCSJxbDI3MDBfZncuYmluIgorCiAKIHN0YXRpYyBERUZJTkVfTVVURVgocWxhX2Z3X2xvY2spOwogCkBAIC01Mjc4LDYgKzUzNTMsNyBAQAogCXsgLm5hbWUgPSBGV19GSUxFX0lTUDgyWFgsIH0sCiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQMjAzMSwgfSwKIAl7IC5uYW1lID0gRldfRklMRV9JU1A4MDMxLCB9LAorCXsgLm5hbWUgPSBGV19GSUxFX0lTUDIwNzEsIH0sCiB9OwogCiBzdHJ1Y3QgZndfYmxvYiAqCkBAIC01MzA2LDYgKzUzODIsOCBAQAogCQlibG9iID0gJnFsYV9md19ibG9ic1tGV19JU1AyMDMxXTsKIAl9IGVsc2UgaWYgKElTX1FMQTgwMzEoaGEpKSB7CiAJCWJsb2IgPSAmcWxhX2Z3X2Jsb2JzW0ZXX0lTUDgwMzFdOworCX0gZWxzZSBpZiAoSVNfUUxBMjA3MShoYSkpIHsKKwkJYmxvYiA9ICZxbGFfZndfYmxvYnNbRldfSVNQMjA3MV07CiAJfSBlbHNlIHsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNTYzNSw2ICs1NzEzLDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMzEpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1BGMDAxKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODA0NCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIwNzEpIH0sCiAJeyAwIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTJ4eHhfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKaW5kZXggYmQ1NmNkZS4uZjI4MTIzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwpAQCAtNTY4LDcgKzU2OCw3IEBACiAJZWxzZSBpZiAoSVNfUDNQX1RZUEUoaGEpKSB7CiAJCSpzdGFydCA9IEZBX0ZMQVNIX0xBWU9VVF9BRERSXzgyOwogCQlnb3RvIGVuZDsKLQl9IGVsc2UgaWYgKElTX1FMQTgzWFgoaGEpKSB7CisJfSBlbHNlIGlmIChJU19RTEE4M1hYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkgewogCQkqc3RhcnQgPSBGQV9GTEFTSF9MQVlPVVRfQUREUl84MzsKIAkJZ290byBlbmQ7CiAJfQpAQCAtNjgyLDcgKzY4Miw3IEBACiAJLyogQXNzaWduIEZDUCBwcmlvIHJlZ2lvbiBzaW5jZSBvbGRlciBhZGFwdGVycyBtYXkgbm90IGhhdmUgRkxULCBvcgogCSAgIEZDUCBwcmlvIHJlZ2lvbiBpbiBpdCdzIEZMVC4KIAkgKi8KLQloYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbyA9IGhhLT5mbGFncy5wb3J0MCA/CisJaGEtPmZsdF9yZWdpb25fZmNwX3ByaW8gPSAoaGEtPnBvcnRfbm8gPT0gMCkgPwogCSAgICBmY3BfcHJpb19jZmcwW2RlZl0gOiBmY3BfcHJpb19jZmcxW2RlZl07CiAKIAloYS0+Zmx0X3JlZ2lvbl9mbHQgPSBmbHRfYWRkcjsKQEAgLTc0Myw0NyArNzQzLDcxIEBACiAJCQloYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0gPSBzdGFydDsKIAkJCWlmIChJU19QM1BfVFlQRShoYSkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDApCiAJCQkJaGEtPmZsdF9yZWdpb25fdnBkID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX1ZQRF8xOgogCQkJaWYgKElTX1AzUF9UWVBFKGhhKSB8fCBJU19RTEE4MDMxKGhhKSkKIAkJCQlicmVhazsKLQkJCWlmICghaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDEpCisJCQkJaGEtPmZsdF9yZWdpb25fdnBkID0gc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBGTFRfUkVHX1ZQRF8yOgorCQkJaWYgKCFJU19RTEEyN1hYKGhhKSkKKwkJCQlicmVhazsKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAyKQorCQkJCWhhLT5mbHRfcmVnaW9uX3ZwZCA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19WUERfMzoKKwkJCWlmICghSVNfUUxBMjdYWChoYSkpCisJCQkJYnJlYWs7CisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMykKIAkJCQloYS0+Zmx0X3JlZ2lvbl92cGQgPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfTlZSQU1fMDoKIAkJCWlmIChJU19RTEE4MDMxKGhhKSkKIAkJCQlicmVhazsKLQkJCWlmIChoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMCkKIAkJCQloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19OVlJBTV8xOgogCQkJaWYgKElTX1FMQTgwMzEoaGEpKQogCQkJCWJyZWFrOwotCQkJaWYgKCFoYS0+ZmxhZ3MucG9ydDApCisJCQlpZiAoaGEtPnBvcnRfbm8gPT0gMSkKKwkJCQloYS0+Zmx0X3JlZ2lvbl9udnJhbSA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19OVlJBTV8yOgorCQkJaWYgKCFJU19RTEEyN1hYKGhhKSkKKwkJCQlicmVhazsKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAyKQorCQkJCWhhLT5mbHRfcmVnaW9uX252cmFtID0gc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBGTFRfUkVHX05WUkFNXzM6CisJCQlpZiAoIUlTX1FMQTI3WFgoaGEpKQorCQkJCWJyZWFrOworCQkJaWYgKGhhLT5wb3J0X25vID09IDMpCiAJCQkJaGEtPmZsdF9yZWdpb25fbnZyYW0gPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfRkRUOgogCQkJaGEtPmZsdF9yZWdpb25fZmR0ID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX05QSVZfQ09ORl8wOgotCQkJaWYgKGhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAwKQogCQkJCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19OUElWX0NPTkZfMToKLQkJCWlmICghaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDEpCiAJCQkJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0dPTERfRlc6CiAJCQloYS0+Zmx0X3JlZ2lvbl9nb2xkX2Z3ID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0ZDUF9QUklPXzA6Ci0JCQlpZiAoaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDApCiAJCQkJaGEtPmZsdF9yZWdpb25fZmNwX3ByaW8gPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfRkNQX1BSSU9fMToKLQkJCWlmICghaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDEpCiAJCQkJaGEtPmZsdF9yZWdpb25fZmNwX3ByaW8gPSBzdGFydDsKIAkJCWJyZWFrOwogCQljYXNlIEZMVF9SRUdfQk9PVF9DT0RFXzgyWFg6CkBAIC04MTMsMTMgKzgzNywxMyBAQAogCQljYXNlIEZMVF9SRUdfRkNPRV9OVlJBTV8wOgogCQkJaWYgKCEoSVNfUUxBODAzMShoYSkgfHwgSVNfUUxBODA0NChoYSkpKQogCQkJCWJyZWFrOwotCQkJaWYgKGhhLT5mbGFncy5wb3J0MCkKKwkJCWlmIChoYS0+cG9ydF9ubyA9PSAwKQogCQkJCWhhLT5mbHRfcmVnaW9uX252cmFtID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0ZDT0VfTlZSQU1fMToKIAkJCWlmICghKElTX1FMQTgwMzEoaGEpIHx8IElTX1FMQTgwNDQoaGEpKSkKIAkJCQlicmVhazsKLQkJCWlmICghaGEtPmZsYWdzLnBvcnQwKQorCQkJaWYgKGhhLT5wb3J0X25vID09IDEpCiAJCQkJaGEtPmZsdF9yZWdpb25fbnZyYW0gPSBzdGFydDsKIAkJCWJyZWFrOwogCQl9CkBAIC04MzIsMTIgKzg1NiwxMiBAQAogCWhhLT5mbHRfcmVnaW9uX2Z3ID0gZGVmX2Z3W2RlZl07CiAJaGEtPmZsdF9yZWdpb25fYm9vdCA9IGRlZl9ib290W2RlZl07CiAJaGEtPmZsdF9yZWdpb25fdnBkX252cmFtID0gZGVmX3ZwZF9udnJhbVtkZWZdOwotCWhhLT5mbHRfcmVnaW9uX3ZwZCA9IGhhLT5mbGFncy5wb3J0MCA/CisJaGEtPmZsdF9yZWdpb25fdnBkID0gKGhhLT5wb3J0X25vID09IDApID8KIAkgICAgZGVmX3ZwZDBbZGVmXSA6IGRlZl92cGQxW2RlZl07Ci0JaGEtPmZsdF9yZWdpb25fbnZyYW0gPSBoYS0+ZmxhZ3MucG9ydDAgPworCWhhLT5mbHRfcmVnaW9uX252cmFtID0gKGhhLT5wb3J0X25vID09IDApID8KIAkgICAgZGVmX252cmFtMFtkZWZdIDogZGVmX252cmFtMVtkZWZdOwogCWhhLT5mbHRfcmVnaW9uX2ZkdCA9IGRlZl9mZHRbZGVmXTsKLQloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSBoYS0+ZmxhZ3MucG9ydDAgPworCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IChoYS0+cG9ydF9ubyA9PSAwKSA/CiAJICAgIGRlZl9ucGl2X2NvbmYwW2RlZl0gOiBkZWZfbnBpdl9jb25mMVtkZWZdOwogZG9uZToKIAlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDRhLApAQCAtOTg5LDcgKzEwMTMsNyBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKCFJU19RTEEyNFhYX1RZUEUoaGEpICYmICFJU19RTEEyNVhYKGhhKSAmJgotCSAgICAhSVNfQ05BX0NBUEFCTEUoaGEpICYmICFJU19RTEEyMDMxKGhhKSkKKwkgICAgIUlTX0NOQV9DQVBBQkxFKGhhKSAmJiAhSVNfUUxBMjAzMShoYSkgJiYgIUlTX1FMQTI3WFgoaGEpKQogCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAKIAlyZXQgPSBxbGEyeHh4X2ZpbmRfZmx0X3N0YXJ0KHZoYSwgJmZsdF9hZGRyKTsKQEAgLTExOTIsNyArMTIxNiw4IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAkvKiBQcmVwYXJlIGJ1cnN0LWNhcGFibGUgd3JpdGUgb24gc3VwcG9ydGVkIElTUHMuICovCi0JaWYgKChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSB8fCBJU19RTEE4M1hYKGhhKSkgJiYKKwlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpIHx8IElTX1FMQTgzWFgoaGEpIHx8CisJICAgIElTX1FMQTI3WFgoaGEpKSAmJgogCSAgICAhKGZhZGRyICYgMHhmZmYpICYmIGR3b3JkcyA+IE9QVFJPTV9CVVJTVF9EV09SRFMpIHsKIAkJb3B0cm9tID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBPUFRST01fQlVSU1RfU0laRSwKIAkJICAgICZvcHRyb21fZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTE2NzUsNyArMTcwMCw3IEBACiAJaWYgKCFJU19RTEE4M1hYKGhhKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoaGEtPmZsYWdzLnBvcnQwKQorCWlmIChoYS0+cG9ydF9ubyA9PSAwKQogCQlsZWRfc2VsZWN0X3ZhbHVlID0gUUxBODNYWF9MRURfUE9SVDA7CiAJZWxzZQogCQlsZWRfc2VsZWN0X3ZhbHVlID0gUUxBODNYWF9MRURfUE9SVDE7CkBAIC0yMzMyLDcgKzIzNTcsNyBAQAogCQkJCSAqLwogCQkJCXJlc3RfYWRkciA9IDB4ZmZmZjsKIAkJCQlzZWNfbWFzayA9IDB4MTAwMDA7Ci0JCQkJYnJlYWs7ICAgCisJCQkJYnJlYWs7CiAJCQl9CiAJCQkvKgogCQkJICogU1QgbTI5dzAxMGIgcGFydCAtIDE2a2Igc2VjdG9yIHNpemUKQEAgLTI1NTgsNyArMjU4Myw3IEBACiAJdWludDMyX3QgZmFkZHIsIGxlZnQsIGJ1cnN0OwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JaWYgKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKQorCWlmIChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSB8fCBJU19RTEEyN1hYKGhhKSkKIAkJZ290byB0cnlfZmFzdDsKIAlpZiAob2Zmc2V0ICYgMHhmZmYpCiAJCWdvdG8gc2xvd19yZWFkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RtcGwuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90bXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNGU5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90bXBsLmMKQEAgLTAsMCArMSw5MDkgQEAKKy8qCisgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTMgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgInFsYV9kZWYuaCIKKyNpbmNsdWRlICJxbGFfdG1wbC5oIgorCisvKiBub3RlIGRlZmF1bHQgdGVtcGxhdGUgaXMgaW4gYmlnIGVuZGlhbiAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IHFsMjd4eF9md2R0X2RlZmF1bHRfdGVtcGxhdGVbXSA9IHsKKwkweDYzMDAwMDAwLCAweGE0MDAwMDAwLCAweDdjMDUwMDAwLCAweDAwMDAwMDAwLAorCTB4MzAwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDAwMDAsIDB4YzA0MDZlYjQsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDQwMTAwMDAsIDB4MTQwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMjAwMDAwMCwgMHg0NDAwMDAwMCwgMHgwOTAxMDAwMCwgMHgxMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAxMDEwMDAwLCAweDFjMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDA2MDAwMDAsIDB4MDAwMDAwMDAsCisJMHhjMDAwMDAwMCwgMHgwMTAxMDAwMCwgMHgxYzAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAyMDAwMDAwLCAweDAwNjAwMDAwLCAweDAwMDAwMDAwLCAweGNjMDAwMDAwLAorCTB4MDEwMTAwMDAsIDB4MWMwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsCisJMHgxMDYwMDAwMCwgMHgwMDAwMDAwMCwgMHhkNDAwMDAwMCwgMHgwMTAxMDAwMCwKKwkweDFjMDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLAorCTB4MDAwMDAwNjAsIDB4ZjAwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDcwMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MTA3MDAwMDAsIDB4MDQxMDAwYzAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg0MDcwMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAxMDEwMDAwLCAweDFjMDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MDA3YzAwMDAsIDB4MDEwMDAwMDAsIDB4YzAwMDAwMDAsIDB4MDAwMTAwMDAsCisJMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDdjMDAwMCwKKwkweDA0MDMwMGM0LCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4MDA3YzAwMDAsIDB4MDQwMTAwYzAsIDB4MDEwMTAwMDAsCisJMHgxYzAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDdjMDAwMCwKKwkweDAwMDAwMDAwLCAweGMwMDAwMDAwLCAweDAwMDEwMDAwLCAweDE4MDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDA3YzAwMDAsIDB4MDQyMDAwMDAsCisJMHgwYjAxMDAwMCwgMHgxODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDBjMDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwMDBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDEwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDAyMGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwMzBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDQwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDA1MGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwNjBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMDcwYjAsIDB4MDIwMTAwMDAsIDB4MjAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHg3MDBmMDAwMCwgMHgwNDAxMDBmYywKKwkweGYwMDAwMDAwLCAweDAwMDA4MGIwLCAweDAyMDEwMDAwLCAweDIwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDIwMDAwMDAsIDB4NzAwZjAwMDAsIDB4MDQwMTAwZmMsCisJMHhmMDAwMDAwMCwgMHgwMDAwOTBiMCwgMHgwMjAxMDAwMCwgMHgyMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDcwMGYwMDAwLCAweDA0MDEwMGZjLAorCTB4ZjAwMDAwMDAsIDB4MDAwMGEwYjAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwYTAwMDAwMCwgMHgwNDAxMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MGEwMDAwMDAsIDB4MDQyMDAwODAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMGJlMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MTBiZTAwMDAsIDB4MDQxMDAwYzAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgyMGJlMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MzBiZTAwMDAsIDB4MDQxMDAwYzAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMGIwMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MTBiMDAwMDAsIDB4MDQxMDAwYzAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgyMGIwMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MzBiMDAwMDAsIDB4MDQxMDAwYzAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDMwMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MTAzMDAwMDAsIDB4MDQxMDAwYzAsIDB4MDAwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgyMDMwMDAwMCwgMHgwNDEwMDBjMCwKKwkweDAwMDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MzAzMDAwMDAsIDB4MDQxMDAwYzAsIDB4MGEwMTAwMDAsIDB4MTAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNjAxMDAwMCwgMHgxYzAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAyMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDAwMjAwLAorCTB4ZmYyMzAyMDAsIDB4MDYwMTAwMDAsIDB4MWMwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMjAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMDAwMCwKKwkweDA3MDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDcwMTAwMDAsIDB4MTgwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwKKwkweDA3MDEwMDAwLCAweDE4MDAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MGQwMTAwMDAsIDB4MTQwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMDAwMDAwMCwgMHhmZjAwMDAwMCwKKwkweDEwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDgwLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKgorcWxhMjd4eF9pc3BfcmVnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCit7CisJcmV0dXJuICZ2aGEtPmh3LT5pb2Jhc2UtPmlzcDI0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfaW5zZXJ0MTYodWludDE2X3QgdmFsdWUsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlpZiAoYnVmKSB7CisJCWJ1ZiArPSAqbGVuOworCQkqKF9fbGUxNiAqKWJ1ZiA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwl9CisJKmxlbiArPSBzaXplb2YodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfaW5zZXJ0MzIodWludDMyX3QgdmFsdWUsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlpZiAoYnVmKSB7CisJCWJ1ZiArPSAqbGVuOworCQkqKF9fbGUzMiAqKWJ1ZiA9IGNwdV90b19sZTMyKHZhbHVlKTsKKwl9CisJKmxlbiArPSBzaXplb2YodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfaW5zZXJ0YnVmKHZvaWQgKm1lbSwgdWxvbmcgc2l6ZSwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVsb25nIGNudCA9IHNpemU7CisKKwlpZiAoYnVmICYmIG1lbSkgeworCQlidWYgKz0gKmxlbjsKKwkJd2hpbGUgKGNudCA+PSBzaXplb2YodWludDMyX3QpKSB7CisJCQkqKF9fbGUzMiAqKWJ1ZiA9IGNwdV90b19sZTMycChtZW0pOworCQkJYnVmICs9IHNpemVvZih1aW50MzJfdCk7CisJCQltZW0gKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWNudCAtPSBzaXplb2YodWludDMyX3QpOworCQl9CisJCWlmIChjbnQpCisJCQltZW1jcHkoYnVmLCBtZW0sIGNudCk7CisJfQorCSpsZW4gKz0gc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGEyN3h4X3JlYWQ4KHZvaWQgKndpbmRvdywgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVpbnQ4X3QgdmFsdWUgPSB+MDsKKworCWlmIChidWYpIHsKKwkJdmFsdWUgPSBSRF9SRUdfQllURSgoX19pb21lbSB2b2lkICopd2luZG93KTsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCBOVUxMLCAweGQwMTEsCisJCSAgICAiJXM6IC0+ICV4XG4iLCBfX2Z1bmNfXywgdmFsdWUpOworCX0KKwlxbGEyN3h4X2luc2VydDMyKHZhbHVlLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9yZWFkMTYodm9pZCAqd2luZG93LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWludDE2X3QgdmFsdWUgPSB+MDsKKworCWlmIChidWYpIHsKKwkJdmFsdWUgPSBSRF9SRUdfV09SRCgoX19pb21lbSB2b2lkICopd2luZG93KTsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCBOVUxMLCAweGQwMTIsCisJCSAgICAiJXM6IC0+ICV4XG4iLCBfX2Z1bmNfXywgdmFsdWUpOworCX0KKwlxbGEyN3h4X2luc2VydDMyKHZhbHVlLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9yZWFkMzIodm9pZCAqd2luZG93LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJdWludDMyX3QgdmFsdWUgPSB+MDsKKworCWlmIChidWYpIHsKKwkJdmFsdWUgPSBSRF9SRUdfRFdPUkQoKF9faW9tZW0gdm9pZCAqKXdpbmRvdyk7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgTlVMTCwgMHhkMDEzLAorCQkgICAgIiVzOiAtPiAleFxuIiwgX19mdW5jX18sIHZhbHVlKTsKKwl9CisJcWxhMjd4eF9pbnNlcnQzMih2YWx1ZSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKCpxbGEyN3h4X3JlYWRfdmVjdG9yKHVpbnQgd2lkdGgpKSh2b2lkICosIHZvaWQgKiwgdWxvbmcgKikKK3sKKwlyZXR1cm4KKwkgICAgKHdpZHRoID09IDEpID8gcWxhMjd4eF9yZWFkOCA6CisJICAgICh3aWR0aCA9PSAyKSA/IHFsYTI3eHhfcmVhZDE2IDoKKwkJCSAgIHFsYTI3eHhfcmVhZDMyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTI3eHhfcmVhZF9yZWcoX19pb21lbSBzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4ICpyZWcsCisJdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl2b2lkICp3aW5kb3cgPSAodm9pZCAqKXJlZyArIG9mZnNldDsKKworCWlmIChidWYpIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCBOVUxMLCAweGQwMTQsCisJCSAgICAiJXM6IEAleFxuIiwgX19mdW5jX18sIG9mZnNldCk7CisJfQorCXFsYTI3eHhfaW5zZXJ0MzIob2Zmc2V0LCBidWYsIGxlbik7CisJcWxhMjd4eF9yZWFkMzIod2luZG93LCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF93cml0ZV9yZWcoX19pb21lbSBzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4ICpyZWcsCisJdWludCBvZmZzZXQsIHVpbnQzMl90IGRhdGEsIHZvaWQgKmJ1ZikKK3sKKwlfX2lvbWVtIHZvaWQgKndpbmRvdyA9IHJlZyArIG9mZnNldDsKKworCWlmIChidWYpIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCBOVUxMLCAweGQwMTUsCisJCSAgICAiJXM6IEAleCA8LSAleFxuIiwgX19mdW5jX18sIG9mZnNldCwgZGF0YSk7CisJCVdSVF9SRUdfRFdPUkQod2luZG93LCBkYXRhKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9yZWFkX3dpbmRvdyhfX2lvbWVtIHN0cnVjdCBkZXZpY2VfcmVnXzI0eHggKnJlZywKKwl1aW50MzJfdCBiYXNlLCB1aW50IG9mZnNldCwgdWludCBjb3VudCwgdWludCB3aWR0aCwgdm9pZCAqYnVmLAorCXVsb25nICpsZW4pCit7CisJdm9pZCAqd2luZG93ID0gKHZvaWQgKilyZWcgKyBvZmZzZXQ7CisJdm9pZCAoKnJlYWRuKSh2b2lkICosIHZvaWQgKiwgdWxvbmcgKikgPSBxbGEyN3h4X3JlYWRfdmVjdG9yKHdpZHRoKTsKKworCWlmIChidWYpIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCBOVUxMLCAweGQwMTYsCisJCSAgICAiJXM6IGJhc2U9JXggb2Zmc2V0PSV4IGNvdW50PSV4IHdpZHRoPSV4XG4iLAorCQkgICAgX19mdW5jX18sIGJhc2UsIG9mZnNldCwgY291bnQsIHdpZHRoKTsKKwl9CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBJT0JBU0VfQUREUiwgYmFzZSwgYnVmKTsKKwl3aGlsZSAoY291bnQtLSkgeworCQlxbGEyN3h4X2luc2VydDMyKGJhc2UsIGJ1ZiwgbGVuKTsKKwkJcmVhZG4od2luZG93LCBidWYsIGxlbik7CisJCXdpbmRvdyArPSB3aWR0aDsKKwkJYmFzZSArPSB3aWR0aDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMjd4eF9za2lwX2VudHJ5KHN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmKQoreworCWlmIChidWYpCisJCWVudC0+aGRyLmRyaXZlcl9mbGFncyB8PSBEUklWRVJfRkxBR19TS0lQX0VOVFJZOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMTAwLAorCSAgICAiJXM6IG5vcCBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjU1KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDFmZiwKKwkgICAgIiVzOiBlbmQgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCisJLyogdGVybWluYXRlICovCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjU2KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDAsCisJICAgICIlczogcmRpbyB0MSBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfcmVhZF93aW5kb3cocmVnLCBlbnQtPnQyNTYuYmFzZV9hZGRyLCBlbnQtPnQyNTYucGNpX29mZnNldCwKKwkgICAgZW50LT50MjU2LnJlZ19jb3VudCwgZW50LT50MjU2LnJlZ193aWR0aCwgYnVmLCBsZW4pOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1NyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjAxLAorCSAgICAiJXM6IHdyaW8gdDEgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIElPQkFTRV9BRERSLCBlbnQtPnQyNTcuYmFzZV9hZGRyLCBidWYpOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgZW50LT50MjU3LnBjaV9vZmZzZXQsIGVudC0+dDI1Ny53cml0ZV9kYXRhLCBidWYpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1OChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjAyLAorCSAgICAiJXM6IHJkaW8gdDIgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIGVudC0+dDI1OC5iYW5rc2VsX29mZnNldCwgZW50LT50MjU4LmJhbmssIGJ1Zik7CisJcWxhMjd4eF9yZWFkX3dpbmRvdyhyZWcsIGVudC0+dDI1OC5iYXNlX2FkZHIsIGVudC0+dDI1OC5wY2lfb2Zmc2V0LAorCSAgICBlbnQtPnQyNTgucmVnX2NvdW50LCBlbnQtPnQyNTgucmVnX3dpZHRoLCBidWYsIGxlbik7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjU5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDMsCisJICAgICIlczogd3JpbyB0MiBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgSU9CQVNFX0FERFIsIGVudC0+dDI1OS5iYXNlX2FkZHIsIGJ1Zik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBlbnQtPnQyNTkuYmFua3NlbF9vZmZzZXQsIGVudC0+dDI1OS5iYW5rLCBidWYpOworCXFsYTI3eHhfd3JpdGVfcmVnKHJlZywgZW50LT50MjU5LnBjaV9vZmZzZXQsIGVudC0+dDI1OS53cml0ZV9kYXRhLCBidWYpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjA0LAorCSAgICAiJXM6IHJkcGNpIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF9yZWFkX3JlZyhyZWcsIGVudC0+dDI2MC5wY2lfYWRkciwgYnVmLCBsZW4pOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjA1LAorCSAgICAiJXM6IHdycGNpIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBlbnQtPnQyNjEucGNpX2FkZHIsIGVudC0+dDI2MS53cml0ZV9kYXRhLCBidWYpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVsb25nIGR3b3JkczsKKwl1bG9uZyBzdGFydDsKKwl1bG9uZyBlbmQ7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjA2LAorCSAgICAiJXM6IHJkcmFtKCV4KSBbJWx4XVxuIiwgX19mdW5jX18sIGVudC0+dDI2Mi5yYW1fYXJlYSwgKmxlbik7CisJc3RhcnQgPSBlbnQtPnQyNjIuc3RhcnRfYWRkcjsKKwllbmQgPSBlbnQtPnQyNjIuZW5kX2FkZHI7CisKKwlpZiAoZW50LT50MjYyLnJhbV9hcmVhID09IFQyNjJfUkFNX0FSRUFfQ1JJVElDQUxfUkFNKSB7CisJCTsKKwl9IGVsc2UgaWYgKGVudC0+dDI2Mi5yYW1fYXJlYSA9PSBUMjYyX1JBTV9BUkVBX0VYVEVSTkFMX1JBTSkgeworCQllbmQgPSB2aGEtPmh3LT5md19tZW1vcnlfc2l6ZTsKKwkJaWYgKGJ1ZikKKwkJCWVudC0+dDI2Mi5lbmRfYWRkciA9IGVuZDsKKwl9IGVsc2UgaWYgKGVudC0+dDI2Mi5yYW1fYXJlYSA9PSBUMjYyX1JBTV9BUkVBX1NIQVJFRF9SQU0pIHsKKwkJc3RhcnQgPSB2aGEtPmh3LT5md19zaGFyZWRfcmFtX3N0YXJ0OworCQllbmQgPSB2aGEtPmh3LT5md19zaGFyZWRfcmFtX2VuZDsKKwkJaWYgKGJ1ZikgeworCQkJZW50LT50MjYyLnN0YXJ0X2FkZHIgPSBzdGFydDsKKwkJCWVudC0+dDI2Mi5lbmRfYWRkciA9IGVuZDsKKwkJfQorCX0gZWxzZSBpZiAoZW50LT50MjYyLnJhbV9hcmVhID09IFQyNjJfUkFNX0FSRUFfRERSX1JBTSkgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDIxLAorCQkgICAgIiVzOiB1bnN1cHBvcnRlZCBkZHIgcmFtXG4iLCBfX2Z1bmNfXyk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDIyLAorCQkgICAgIiVzOiB1bmtub3duIGFyZWEgJXVcbiIsIF9fZnVuY19fLCBlbnQtPnQyNjIucmFtX2FyZWEpOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGVuZCA8IHN0YXJ0KSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjMsCisJCSAgICAiJXM6IGJhZCByYW5nZSAoc3RhcnQ9JXggZW5kPSV4KVxuIiwgX19mdW5jX18sCisJCSAgICBlbnQtPnQyNjIuZW5kX2FkZHIsIGVudC0+dDI2Mi5zdGFydF9hZGRyKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwkJZ290byBkb25lOworCX0KKworCWR3b3JkcyA9IGVuZCAtIHN0YXJ0ICsgMTsKKwlpZiAoYnVmKSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjQsCisJCSAgICAiJXM6IEAlbHggLT4gKCVseCBkd29yZHMpXG4iLCBfX2Z1bmNfXywgc3RhcnQsIGR3b3Jkcyk7CisJCWJ1ZiArPSAqbGVuOworCQlxbGEyNHh4X2R1bXBfcmFtKHZoYS0+aHcsIHN0YXJ0LCBidWYsIGR3b3JkcywgJmJ1Zik7CisJfQorCSpsZW4gKz0gZHdvcmRzICogc2l6ZW9mKHVpbnQzMl90KTsKK2RvbmU6CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVpbnQgY291bnQgPSAwOworCXVpbnQgaTsKKwl1aW50IGxlbmd0aDsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDcsCisJICAgICIlczogZ2V0cSgleCkgWyVseF1cbiIsIF9fZnVuY19fLCBlbnQtPnQyNjMucXVldWVfdHlwZSwgKmxlbik7CisJaWYgKGVudC0+dDI2My5xdWV1ZV90eXBlID09IFQyNjNfUVVFVUVfVFlQRV9SRVEpIHsKKwkJZm9yIChpID0gMDsgaSA8IHZoYS0+aHctPm1heF9yZXFfcXVldWVzOyBpKyspIHsKKwkJCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPmh3LT5yZXFfcV9tYXBbaV07CisJCQlpZiAocmVxIHx8ICFidWYpIHsKKwkJCQlsZW5ndGggPSByZXEgPworCQkJCSAgICByZXEtPmxlbmd0aCA6IFJFUVVFU1RfRU5UUllfQ05UXzI0WFg7CisJCQkJcWxhMjd4eF9pbnNlcnQxNihpLCBidWYsIGxlbik7CisJCQkJcWxhMjd4eF9pbnNlcnQxNihsZW5ndGgsIGJ1ZiwgbGVuKTsKKwkJCQlxbGEyN3h4X2luc2VydGJ1ZihyZXEgPyByZXEtPnJpbmcgOiBOVUxMLAorCQkJCSAgICBsZW5ndGggKiBzaXplb2YoKnJlcS0+cmluZyksIGJ1ZiwgbGVuKTsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlbnQtPnQyNjMucXVldWVfdHlwZSA9PSBUMjYzX1FVRVVFX1RZUEVfUlNQKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2aGEtPmh3LT5tYXhfcnNwX3F1ZXVlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gdmhhLT5ody0+cnNwX3FfbWFwW2ldOworCQkJaWYgKHJzcCB8fCAhYnVmKSB7CisJCQkJbGVuZ3RoID0gcnNwID8KKwkJCQkgICAgcnNwLT5sZW5ndGggOiBSRVNQT05TRV9FTlRSWV9DTlRfTVE7CisJCQkJcWxhMjd4eF9pbnNlcnQxNihpLCBidWYsIGxlbik7CisJCQkJcWxhMjd4eF9pbnNlcnQxNihsZW5ndGgsIGJ1ZiwgbGVuKTsKKwkJCQlxbGEyN3h4X2luc2VydGJ1Zihyc3AgPyByc3AtPnJpbmcgOiBOVUxMLAorCQkJCSAgICBsZW5ndGggKiBzaXplb2YoKnJzcC0+cmluZyksIGJ1ZiwgbGVuKTsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlbnQtPnQyNjMucXVldWVfdHlwZSA9PSBUMjYzX1FVRVVFX1RZUEVfQVRJTykgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDI1LAorCQkgICAgIiVzOiB1bnN1cHBvcnRlZCBhdGlvIHF1ZXVlXG4iLCBfX2Z1bmNfXyk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDI2LAorCQkgICAgIiVzOiB1bmtub3duIHF1ZXVlICV1XG4iLCBfX2Z1bmNfXywgZW50LT50MjYzLnF1ZXVlX3R5cGUpOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGJ1ZikKKwkJZW50LT50MjYzLm51bV9xdWV1ZXMgPSBjb3VudDsKK2RvbmU6CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMDgsCisJICAgICIlczogZ2V0ZmNlIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJaWYgKHZoYS0+aHctPmZjZSkgeworCQlpZiAoYnVmKSB7CisJCQllbnQtPnQyNjQuZmNlX3RyYWNlX3NpemUgPSBGQ0VfU0laRTsKKwkJCWVudC0+dDI2NC53cml0ZV9wb2ludGVyID0gdmhhLT5ody0+ZmNlX3dyOworCQkJZW50LT50MjY0LmJhc2VfcG9pbnRlciA9IHZoYS0+aHctPmZjZV9kbWE7CisJCQllbnQtPnQyNjQuZmNlX2VuYWJsZV9tYjAgPSB2aGEtPmh3LT5mY2VfbWJbMF07CisJCQllbnQtPnQyNjQuZmNlX2VuYWJsZV9tYjIgPSB2aGEtPmh3LT5mY2VfbWJbMl07CisJCQllbnQtPnQyNjQuZmNlX2VuYWJsZV9tYjMgPSB2aGEtPmh3LT5mY2VfbWJbM107CisJCQllbnQtPnQyNjQuZmNlX2VuYWJsZV9tYjQgPSB2aGEtPmh3LT5mY2VfbWJbNF07CisJCQllbnQtPnQyNjQuZmNlX2VuYWJsZV9tYjUgPSB2aGEtPmh3LT5mY2VfbWJbNV07CisJCQllbnQtPnQyNjQuZmNlX2VuYWJsZV9tYjYgPSB2aGEtPmh3LT5mY2VfbWJbNl07CisJCX0KKwkJcWxhMjd4eF9pbnNlcnRidWYodmhhLT5ody0+ZmNlLCBGQ0VfU0laRSwgYnVmLCBsZW4pOworCX0gZWxzZSB7CisJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjcsCisJCSAgICAiJXM6IG1pc3NpbmcgZmNlXG4iLCBfX2Z1bmNfXyk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjA5LAorCSAgICAiJXM6IHBhdXNlIHJpc2MgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlpZiAoYnVmKQorCQlxbGEyNHh4X3BhdXNlX3Jpc2MocmVnKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjYoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjBhLAorCSAgICAiJXM6IHJlc2V0IHJpc2MgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlpZiAoYnVmKQorCQlxbGEyNHh4X3NvZnRfcmVzZXQodmhhLT5odyk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTI3eHhfZndkdF9lbnRyeV90MjY3KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSBxbGEyN3h4X2lzcF9yZWcodmhhKTsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMGIsCisJICAgICIlczogZGlzIGludHIgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIGVudC0+dDI2Ny5wY2lfb2Zmc2V0LCBlbnQtPnQyNjcuZGF0YSwgYnVmKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjBjLAorCSAgICAiJXM6IGdldGhiKCV4KSBbJWx4XVxuIiwgX19mdW5jX18sIGVudC0+dDI2OC5idWZfdHlwZSwgKmxlbik7CisJaWYgKGVudC0+dDI2OC5idWZfdHlwZSA9PSBUMjY4X0JVRl9UWVBFX0VYVERfVFJBQ0UpIHsKKwkJaWYgKHZoYS0+aHctPmVmdCkgeworCQkJaWYgKGJ1ZikgeworCQkJCWVudC0+dDI2OC5idWZfc2l6ZSA9IEVGVF9TSVpFOworCQkJCWVudC0+dDI2OC5zdGFydF9hZGRyID0gdmhhLT5ody0+ZWZ0X2RtYTsKKwkJCX0KKwkJCXFsYTI3eHhfaW5zZXJ0YnVmKHZoYS0+aHctPmVmdCwgRUZUX1NJWkUsIGJ1ZiwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQwMjgsCisJCQkgICAgIiVzOiBtaXNzaW5nIGVmdFxuIiwgX19mdW5jX18pOworCQkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwkJfQorCX0gZWxzZSBpZiAoZW50LT50MjY4LmJ1Zl90eXBlID09IFQyNjhfQlVGX1RZUEVfRVhDSF9CVUZPRkYpIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyOSwKKwkJICAgICIlczogdW5zdXBwb3J0ZWQgZXhjaGFuZ2Ugb2ZmbG9hZCBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKwl9IGVsc2UgaWYgKGVudC0+dDI2OC5idWZfdHlwZSA9PSBUMjY4X0JVRl9UWVBFX0VYVERfTE9HSU4pIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyYSwKKwkJICAgICIlczogdW5zdXBwb3J0ZWQgZXh0ZW5kZWQgbG9naW4gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXFsYTI3eHhfc2tpcF9lbnRyeShlbnQsIGJ1Zik7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyYiwKKwkJICAgICIlczogdW5rbm93biBidWYgJXhcbiIsIF9fZnVuY19fLCBlbnQtPnQyNjguYnVmX3R5cGUpOworCQlxbGEyN3h4X3NraXBfZW50cnkoZW50LCBidWYpOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNjkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjBkLAorCSAgICAiJXM6IHNjcmF0Y2ggWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X2luc2VydDMyKDB4YWFhYWFhYWEsIGJ1ZiwgbGVuKTsKKwlxbGEyN3h4X2luc2VydDMyKDB4YmJiYmJiYmIsIGJ1ZiwgbGVuKTsKKwlxbGEyN3h4X2luc2VydDMyKDB4Y2NjY2NjY2MsIGJ1ZiwgbGVuKTsKKwlxbGEyN3h4X2luc2VydDMyKDB4ZGRkZGRkZGQsIGJ1ZiwgbGVuKTsKKwlxbGEyN3h4X2luc2VydDMyKCpsZW4gKyBzaXplb2YodWludDMyX3QpLCBidWYsIGxlbik7CisJaWYgKGJ1ZikKKwkJZW50LT50MjY5LnNjcmF0Y2hfc2l6ZSA9IDUgKiBzaXplb2YodWludDMyX3QpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gcWxhMjd4eF9pc3BfcmVnKHZoYSk7CisJdm9pZCAqd2luZG93ID0gKHZvaWQgKilyZWcgKyAweGM0OworCXVsb25nIGR3b3JkcyA9IGVudC0+dDI3MC5jb3VudDsKKwl1bG9uZyBhZGRyID0gZW50LT50MjcwLmFkZHI7CisKKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMjBlLAorCSAgICAiJXM6IHJkcmVtcmVnIFslbHhdXG4iLCBfX2Z1bmNfXywgKmxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCBJT0JBU0VfQUREUiwgMHg0MCwgYnVmKTsKKwl3aGlsZSAoZHdvcmRzLS0pIHsKKwkJcWxhMjd4eF93cml0ZV9yZWcocmVnLCAweGMwLCBhZGRyfDB4ODAwMDAwMDAsIGJ1Zik7CisJCXFsYTI3eHhfcmVhZF9yZWcocmVnLCAweGM0LCBidWYsIGxlbik7CisJCXFsYTI3eHhfaW5zZXJ0MzIoYWRkciwgYnVmLCBsZW4pOworCQlxbGEyN3h4X3JlYWQzMih3aW5kb3csIGJ1ZiwgbGVuKTsKKwkJYWRkcisrOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNzEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9IHFsYTI3eHhfaXNwX3JlZyh2aGEpOworCXVsb25nIGFkZHIgPSBlbnQtPnQyNzEuYWRkcjsKKworCXFsX2RiZyhxbF9kYmdfbWlzYywgdmhhLCAweGQyMGYsCisJICAgICIlczogd3JyZW1yZWcgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwlxbGEyN3h4X3dyaXRlX3JlZyhyZWcsIElPQkFTRV9BRERSLCAweDQwLCBidWYpOworCXFsYTI3eHhfcmVhZF9yZWcocmVnLCAweGM0LCBidWYsIGxlbik7CisJcWxhMjd4eF9pbnNlcnQzMihhZGRyLCBidWYsIGxlbik7CisJcWxhMjd4eF93cml0ZV9yZWcocmVnLCAweGMwLCBhZGRyLCBidWYpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXVsb25nIGR3b3JkcyA9IGVudC0+dDI3Mi5jb3VudDsKKwl1bG9uZyBzdGFydCA9IGVudC0+dDI3Mi5hZGRyOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIxMCwKKwkgICAgIiVzOiByZHJlbXJhbSBbJWx4XVxuIiwgX19mdW5jX18sICpsZW4pOworCWlmIChidWYpIHsKKwkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyYywKKwkJICAgICIlczogQCVseCAtPiAoJWx4IGR3b3JkcylcbiIsIF9fZnVuY19fLCBzdGFydCwgZHdvcmRzKTsKKwkJYnVmICs9ICpsZW47CisJCXFsYTI3eHhfZHVtcF9tcGlfcmFtKHZoYS0+aHcsIHN0YXJ0LCBidWYsIGR3b3JkcywgJmJ1Zik7CisJfQorCSpsZW4gKz0gZHdvcmRzICogc2l6ZW9mKHVpbnQzMl90KTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X3QyNzMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICplbnQsIHZvaWQgKmJ1ZiwgdWxvbmcgKmxlbikKK3sKKwl1bG9uZyBkd29yZHMgPSBlbnQtPnQyNzMuY291bnQ7CisJdWxvbmcgYWRkciA9IGVudC0+dDI3My5hZGRyOworCXVpbnQzMl90IHZhbHVlOworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDIxMSwKKwkgICAgIiVzOiBwY2ljZmcgWyVseF1cbiIsIF9fZnVuY19fLCAqbGVuKTsKKwl3aGlsZSAoZHdvcmRzLS0pIHsKKwkJdmFsdWUgPSB+MDsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZCh2aGEtPmh3LT5wZGV2LCBhZGRyLCAmdmFsdWUpKQorCQkJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAyZCwKKwkJCSAgICAiJXM6IGZhaWxlZCBwY2ljZmcgcmVhZCBhdCAlbHhcbiIsIF9fZnVuY19fLCBhZGRyKTsKKwkJcWxhMjd4eF9pbnNlcnQzMihhZGRyLCBidWYsIGxlbik7CisJCXFsYTI3eHhfaW5zZXJ0MzIodmFsdWUsIGJ1ZiwgbGVuKTsKKwkJYWRkciArPSA0OworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludAorcWxhMjd4eF9md2R0X2VudHJ5X290aGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50LCB2b2lkICpidWYsIHVsb25nICpsZW4pCit7CisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDJmZiwKKwkgICAgIiVzOiB0eXBlICV4IFslbHhdXG4iLCBfX2Z1bmNfXywgZW50LT5oZHIuZW50cnlfdHlwZSwgKmxlbik7CisJcWxhMjd4eF9za2lwX2VudHJ5KGVudCwgYnVmKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeV9jYWxsIHsKKwlpbnQgdHlwZTsKKwlpbnQgKCpjYWxsKSgKKwkgICAgc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwKKwkgICAgc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqLAorCSAgICB2b2lkICosCisJICAgIHVsb25nICopOworfTsKKworc3RhdGljIHN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnlfY2FsbCBxbDI3eHhfZndkdF9lbnRyeV9jYWxsX2xpc3RbXSA9IHsKKwl7IEVOVFJZX1RZUEVfTk9QCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MCAgICB9ICwKKwl7IEVOVFJZX1RZUEVfVE1QX0VORAkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1NSAgfSAsCisJeyBFTlRSWV9UWVBFX1JEX0lPQl9UMQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1NiAgfSAsCisJeyBFTlRSWV9UWVBFX1dSX0lPQl9UMQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1NyAgfSAsCisJeyBFTlRSWV9UWVBFX1JEX0lPQl9UMgkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1OCAgfSAsCisJeyBFTlRSWV9UWVBFX1dSX0lPQl9UMgkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI1OSAgfSAsCisJeyBFTlRSWV9UWVBFX1JEX1BDSQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MCAgfSAsCisJeyBFTlRSWV9UWVBFX1dSX1BDSQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MSAgfSAsCisJeyBFTlRSWV9UWVBFX1JEX1JBTQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MiAgfSAsCisJeyBFTlRSWV9UWVBFX0dFVF9RVUVVRQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2MyAgfSAsCisJeyBFTlRSWV9UWVBFX0dFVF9GQ0UJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjQgIH0gLAorCXsgRU5UUllfVFlQRV9QU0VfUklTQwkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2NSAgfSAsCisJeyBFTlRSWV9UWVBFX1JTVF9SSVNDCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjY2ICB9ICwKKwl7IEVOVFJZX1RZUEVfRElTX0lOVFIJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjcgIH0gLAorCXsgRU5UUllfVFlQRV9HRVRfSEJVRgkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI2OCAgfSAsCisJeyBFTlRSWV9UWVBFX1NDUkFUQ0gJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNjkgIH0gLAorCXsgRU5UUllfVFlQRV9SRFJFTVJFRwkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfdDI3MCAgfSAsCisJeyBFTlRSWV9UWVBFX1dSUkVNUkVHCQksIHFsYTI3eHhfZndkdF9lbnRyeV90MjcxICB9ICwKKwl7IEVOVFJZX1RZUEVfUkRSRU1SQU0JCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNzIgIH0gLAorCXsgRU5UUllfVFlQRV9QQ0lDRkcJCSwgcWxhMjd4eF9md2R0X2VudHJ5X3QyNzMgIH0gLAorCXsgLTEJCQkJLCBxbGEyN3h4X2Z3ZHRfZW50cnlfb3RoZXIgfQorfTsKKworc3RhdGljIGlubGluZSBpbnQgKCpxbGEyN3h4X2ZpbmRfZW50cnkoaW50IHR5cGUpKQorCShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5ICosIHZvaWQgKiwgdWxvbmcgKikKK3sKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X2VudHJ5X2NhbGwgKmxpc3QgPSBxbDI3eHhfZndkdF9lbnRyeV9jYWxsX2xpc3Q7CisKKwl3aGlsZSAobGlzdC0+dHlwZSAhPSAtMSAmJiBsaXN0LT50eXBlICE9IHR5cGUpCisJCWxpc3QrKzsKKworCXJldHVybiBsaXN0LT5jYWxsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorcWxhMjd4eF9uZXh0X2VudHJ5KHZvaWQgKnApCit7CisJc3RydWN0IHFsYTI3eHhfZndkdF9lbnRyeSAqZW50ID0gcDsKKworCXJldHVybiBwICsgZW50LT5oZHIuZW50cnlfc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK3FsYTI3eHhfd2Fsa190ZW1wbGF0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLAorCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCwgdm9pZCAqYnVmLCB1bG9uZyAqbGVuKQoreworCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfZW50cnkgKmVudCA9ICh2b2lkICopdG1wICsgdG1wLT5lbnRyeV9vZmZzZXQ7CisJdWxvbmcgY291bnQgPSB0bXAtPmVudHJ5X2NvdW50OworCisJcWxfZGJnKHFsX2RiZ19taXNjLCB2aGEsIDB4ZDAxYSwKKwkgICAgIiVzOiBlbnRyeSBjb3VudCAlbHhcbiIsIF9fZnVuY19fLCBjb3VudCk7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKHFsYTI3eHhfZmluZF9lbnRyeShlbnQtPmhkci5lbnRyeV90eXBlKSh2aGEsIGVudCwgYnVmLCBsZW4pKQorCQkJYnJlYWs7CisJCWVudCA9IHFsYTI3eHhfbmV4dF9lbnRyeShlbnQpOworCX0KKwlxbF9kYmcocWxfZGJnX21pc2MsIHZoYSwgMHhkMDFiLAorCSAgICAiJXM6IGxlbj0lbHhcbiIsIF9fZnVuY19fLCAqbGVuKTsKK30KKworc3RhdGljIHZvaWQKK3FsYTI3eHhfdGltZV9zdGFtcChzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXApCit7CisJdG1wLT5jYXB0dXJlX3RpbWVzdGFtcCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyN3h4X2RyaXZlcl9pbmZvKHN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCkKK3sKKwl1aW50OF90IHZbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCWludCBydmFsID0gMDsKKworCXJ2YWwgPSBzc2NhbmYocWxhMngwMF92ZXJzaW9uX3N0ciwgIiVoaHUuJWhodS4laGh1LiVoaHUuJWhodS4laGh1IiwKKwkgICAgdiswLCB2KzEsIHYrMiwgdiszLCB2KzQsIHYrNSk7CisKKwl0bXAtPmRyaXZlcl9pbmZvWzBdID0gdlszXSA8PCAyNCB8IHZbMl0gPDwgMTYgfCB2WzFdIDw8IDggfCB2WzBdOworCXRtcC0+ZHJpdmVyX2luZm9bMV0gPSB2WzVdIDw8IDggfCB2WzRdOworCXRtcC0+ZHJpdmVyX2luZm9bMl0gPSAweDEyMzQ1Njc4OworfQorCitzdGF0aWMgdm9pZAorcWxhMjd4eF9maXJtd2FyZV9pbmZvKHN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCwKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCXRtcC0+ZmlybXdhcmVfdmVyc2lvblswXSA9IHZoYS0+aHctPmZ3X21ham9yX3ZlcnNpb247CisJdG1wLT5maXJtd2FyZV92ZXJzaW9uWzFdID0gdmhhLT5ody0+ZndfbWlub3JfdmVyc2lvbjsKKwl0bXAtPmZpcm13YXJlX3ZlcnNpb25bMl0gPSB2aGEtPmh3LT5md19zdWJtaW5vcl92ZXJzaW9uOworCXRtcC0+ZmlybXdhcmVfdmVyc2lvblszXSA9CisJICAgIHZoYS0+aHctPmZ3X2F0dHJpYnV0ZXNfaCA8PCAxNiB8IHZoYS0+aHctPmZ3X2F0dHJpYnV0ZXM7CisJdG1wLT5maXJtd2FyZV92ZXJzaW9uWzRdID0KKwkgICAgdmhhLT5ody0+ZndfYXR0cmlidXRlc19leHRbMV0gPDwgMTYgfCB2aGEtPmh3LT5md19hdHRyaWJ1dGVzX2V4dFswXTsKK30KKworc3RhdGljIHZvaWQKK3FsMjd4eF9lZGl0X3RlbXBsYXRlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wKQoreworCXFsYTI3eHhfdGltZV9zdGFtcCh0bXApOworCXFsYTI3eHhfZHJpdmVyX2luZm8odG1wKTsKKwlxbGEyN3h4X2Zpcm13YXJlX2luZm8odG1wLCB2aGEpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitxbGEyN3h4X3RlbXBsYXRlX2NoZWNrc3VtKHZvaWQgKnAsIHVsb25nIHNpemUpCit7CisJdWludDMyX3QgKmJ1ZiA9IHA7CisJdWludDY0X3Qgc3VtID0gMDsKKworCXNpemUgLz0gc2l6ZW9mKCpidWYpOworCisJd2hpbGUgKHNpemUtLSkKKwkJc3VtICs9ICpidWYrKzsKKworCXN1bSA9IChzdW0gJiAweGZmZmZmZmZmKSArIChzdW0gPj4gMzIpOworCisJcmV0dXJuIH5zdW07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitxbGEyN3h4X3ZlcmlmeV90ZW1wbGF0ZV9jaGVja3N1bShzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXApCit7CisJcmV0dXJuIHFsYTI3eHhfdGVtcGxhdGVfY2hlY2tzdW0odG1wLCB0bXAtPnRlbXBsYXRlX3NpemUpID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitxbGEyN3h4X3ZlcmlmeV90ZW1wbGF0ZV9oZWFkZXIoc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wKQoreworCXJldHVybiB0bXAtPnRlbXBsYXRlX3R5cGUgPT0gVEVNUExBVEVfVFlQRV9GV0RVTVA7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyN3h4X2V4ZWN1dGVfZndkdF90ZW1wbGF0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCXN0cnVjdCBxbGEyN3h4X2Z3ZHRfdGVtcGxhdGUgKnRtcCA9IHZoYS0+aHctPmZ3X2R1bXBfdGVtcGxhdGU7CisJdWxvbmcgbGVuOworCisJaWYgKHFsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZCh0bXApKSB7CisJCWxlbiA9IHRtcC0+dGVtcGxhdGVfc2l6ZTsKKwkJdG1wID0gbWVtY3B5KHZoYS0+aHctPmZ3X2R1bXAsIHRtcCwgbGVuKTsKKwkJcWwyN3h4X2VkaXRfdGVtcGxhdGUodmhhLCB0bXApOworCQlxbGEyN3h4X3dhbGtfdGVtcGxhdGUodmhhLCB0bXAsIHRtcCwgJmxlbik7CisJCXZoYS0+aHctPmZ3X2R1bXBfbGVuID0gbGVuOworCQl2aGEtPmh3LT5md19kdW1wZWQgPSAxOworCX0KK30KKwordWxvbmcKK3FsYTI3eHhfZndkdF9jYWxjdWxhdGVfZHVtcF9zaXplKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCit7CisJc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wID0gdmhhLT5ody0+ZndfZHVtcF90ZW1wbGF0ZTsKKwl1bG9uZyBsZW4gPSAwOworCisJaWYgKHFsYTI3eHhfZndkdF90ZW1wbGF0ZV92YWxpZCh0bXApKSB7CisJCWxlbiA9IHRtcC0+dGVtcGxhdGVfc2l6ZTsKKwkJcWxhMjd4eF93YWxrX3RlbXBsYXRlKHZoYSwgdG1wLCBOVUxMLCAmbGVuKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCit1bG9uZworcWxhMjd4eF9md2R0X3RlbXBsYXRlX3NpemUodm9pZCAqcCkKK3sKKwlzdHJ1Y3QgcWxhMjd4eF9md2R0X3RlbXBsYXRlICp0bXAgPSBwOworCisJcmV0dXJuIHRtcC0+dGVtcGxhdGVfc2l6ZTsKK30KKwordWxvbmcKK3FsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0X3NpemUodm9pZCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHFsMjd4eF9md2R0X2RlZmF1bHRfdGVtcGxhdGUpOworfQorCitjb25zdCB2b2lkICoKK3FsYTI3eHhfZndkdF90ZW1wbGF0ZV9kZWZhdWx0KHZvaWQpCit7CisJcmV0dXJuIHFsMjd4eF9md2R0X2RlZmF1bHRfdGVtcGxhdGU7Cit9CisKK2ludAorcWxhMjd4eF9md2R0X3RlbXBsYXRlX3ZhbGlkKHZvaWQgKnApCit7CisJc3RydWN0IHFsYTI3eHhfZndkdF90ZW1wbGF0ZSAqdG1wID0gcDsKKworCWlmICghcWxhMjd4eF92ZXJpZnlfdGVtcGxhdGVfaGVhZGVyKHRtcCkpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBOVUxMLCAweGQwMWMsCisJCSAgICAiJXM6IHRlbXBsYXRlIHR5cGUgJXhcbiIsIF9fZnVuY19fLCB0bXAtPnRlbXBsYXRlX3R5cGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCFxbGEyN3h4X3ZlcmlmeV90ZW1wbGF0ZV9jaGVja3N1bSh0bXApKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgTlVMTCwgMHhkMDFkLAorCQkgICAgIiVzOiBmYWlsZWQgdGVtcGxhdGUgY2hlY2tzdW1cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCit2b2lkCitxbGEyN3h4X2Z3ZHVtcChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50IGhhcmR3YXJlX2xvY2tlZCkKK3sKKwl1bG9uZyBmbGFncyA9IDA7CisKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZoYS0+aHctPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCWlmICghdmhhLT5ody0+ZndfZHVtcCkKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAxZSwgImZ3ZHVtcCBidWZmZXIgbWlzc2luZy5cbiIpOworCWVsc2UgaWYgKCF2aGEtPmh3LT5md19kdW1wX3RlbXBsYXRlKQorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDFmLCAiZndkdW1wIHRlbXBsYXRlIG1pc3NpbmcuXG4iKTsKKwllbHNlCisJCXFsYTI3eHhfZXhlY3V0ZV9md2R0X3RlbXBsYXRlKHZoYSk7CisKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhhLT5ody0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3RtcGwuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90bXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkMmZmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV90bXBsLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMTMgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUUxBX0RNUDI3X0hfXworI2RlZmluZQlfX1FMQV9ETVAyN19IX18KKworI2RlZmluZSBJT0JBU0VfQUREUglvZmZzZXRvZihzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4LCBpb2Jhc2VfYWRkcikKKworc3RydWN0IF9fcGFja2VkIHFsYTI3eHhfZndkdF90ZW1wbGF0ZSB7CisJdWludDMyX3QgdGVtcGxhdGVfdHlwZTsKKwl1aW50MzJfdCBlbnRyeV9vZmZzZXQ7CisJdWludDMyX3QgdGVtcGxhdGVfc2l6ZTsKKwl1aW50MzJfdCByZXNlcnZlZF8xOworCisJdWludDMyX3QgZW50cnlfY291bnQ7CisJdWludDMyX3QgdGVtcGxhdGVfdmVyc2lvbjsKKwl1aW50MzJfdCBjYXB0dXJlX3RpbWVzdGFtcDsKKwl1aW50MzJfdCB0ZW1wbGF0ZV9jaGVja3N1bTsKKworCXVpbnQzMl90IHJlc2VydmVkXzI7CisJdWludDMyX3QgZHJpdmVyX2luZm9bM107CisKKwl1aW50MzJfdCBzYXZlZF9zdGF0ZVsxNl07CisKKwl1aW50MzJfdCByZXNlcnZlZF8zWzhdOworCXVpbnQzMl90IGZpcm13YXJlX3ZlcnNpb25bNV07Cit9OworCisjZGVmaW5lIFRFTVBMQVRFX1RZUEVfRldEVU1QCQk5OQorCisjZGVmaW5lIEVOVFJZX1RZUEVfTk9QCQkJMAorI2RlZmluZSBFTlRSWV9UWVBFX1RNUF9FTkQJCTI1NQorI2RlZmluZSBFTlRSWV9UWVBFX1JEX0lPQl9UMQkJMjU2CisjZGVmaW5lIEVOVFJZX1RZUEVfV1JfSU9CX1QxCQkyNTcKKyNkZWZpbmUgRU5UUllfVFlQRV9SRF9JT0JfVDIJCTI1OAorI2RlZmluZSBFTlRSWV9UWVBFX1dSX0lPQl9UMgkJMjU5CisjZGVmaW5lIEVOVFJZX1RZUEVfUkRfUENJCQkyNjAKKyNkZWZpbmUgRU5UUllfVFlQRV9XUl9QQ0kJCTI2MQorI2RlZmluZSBFTlRSWV9UWVBFX1JEX1JBTQkJMjYyCisjZGVmaW5lIEVOVFJZX1RZUEVfR0VUX1FVRVVFCQkyNjMKKyNkZWZpbmUgRU5UUllfVFlQRV9HRVRfRkNFCQkyNjQKKyNkZWZpbmUgRU5UUllfVFlQRV9QU0VfUklTQwkJMjY1CisjZGVmaW5lIEVOVFJZX1RZUEVfUlNUX1JJU0MJCTI2NgorI2RlZmluZSBFTlRSWV9UWVBFX0RJU19JTlRSCQkyNjcKKyNkZWZpbmUgRU5UUllfVFlQRV9HRVRfSEJVRgkJMjY4CisjZGVmaW5lIEVOVFJZX1RZUEVfU0NSQVRDSAkJMjY5CisjZGVmaW5lIEVOVFJZX1RZUEVfUkRSRU1SRUcJCTI3MAorI2RlZmluZSBFTlRSWV9UWVBFX1dSUkVNUkVHCQkyNzEKKyNkZWZpbmUgRU5UUllfVFlQRV9SRFJFTVJBTQkJMjcyCisjZGVmaW5lIEVOVFJZX1RZUEVfUENJQ0ZHCQkyNzMKKworI2RlZmluZSBDQVBUVVJFX0ZMQUdfUEhZU19PTkxZCQlCSVRfMAorI2RlZmluZSBDQVBUVVJFX0ZMQUdfUEhZU19WSVJUCQlCSVRfMQorCisjZGVmaW5lIERSSVZFUl9GTEFHX1NLSVBfRU5UUlkJCUJJVF83CisKK3N0cnVjdCBfX3BhY2tlZCBxbGEyN3h4X2Z3ZHRfZW50cnkgeworCXN0cnVjdCBfX3BhY2tlZCB7CisJCXVpbnQzMl90IGVudHJ5X3R5cGU7CisJCXVpbnQzMl90IGVudHJ5X3NpemU7CisJCXVpbnQzMl90IHJlc2VydmVkXzE7CisKKwkJdWludDhfdCAgY2FwdHVyZV9mbGFnczsKKwkJdWludDhfdCAgcmVzZXJ2ZWRfMlsyXTsKKwkJdWludDhfdCAgZHJpdmVyX2ZsYWdzOworCX0gaGRyOworCXVuaW9uIF9fcGFja2VkIHsKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJfSB0MDsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQl9IHQyNTU7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGJhc2VfYWRkcjsKKwkJCXVpbnQ4X3QgIHJlZ193aWR0aDsKKwkJCXVpbnQxNl90IHJlZ19jb3VudDsKKwkJCXVpbnQ4X3QgIHBjaV9vZmZzZXQ7CisJCX0gdDI1NjsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYmFzZV9hZGRyOworCQkJdWludDMyX3Qgd3JpdGVfZGF0YTsKKwkJCXVpbnQ4X3QgIHBjaV9vZmZzZXQ7CisJCQl1aW50OF90ICByZXNlcnZlZFszXTsKKwkJfSB0MjU3OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBiYXNlX2FkZHI7CisJCQl1aW50OF90ICByZWdfd2lkdGg7CisJCQl1aW50MTZfdCByZWdfY291bnQ7CisJCQl1aW50OF90ICBwY2lfb2Zmc2V0OworCQkJdWludDhfdCAgYmFua3NlbF9vZmZzZXQ7CisJCQl1aW50OF90ICByZXNlcnZlZFszXTsKKwkJCXVpbnQzMl90IGJhbms7CisJCX0gdDI1ODsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYmFzZV9hZGRyOworCQkJdWludDMyX3Qgd3JpdGVfZGF0YTsKKwkJCXVpbnQ4X3QgIHJlc2VydmVkWzJdOworCQkJdWludDhfdCAgcGNpX29mZnNldDsKKwkJCXVpbnQ4X3QgIGJhbmtzZWxfb2Zmc2V0OworCQkJdWludDMyX3QgYmFuazsKKwkJfSB0MjU5OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50OF90IHBjaV9hZGRyOworCQkJdWludDhfdCByZXNlcnZlZFszXTsKKwkJfSB0MjYwOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50OF90IHBjaV9hZGRyOworCQkJdWludDhfdCByZXNlcnZlZFszXTsKKwkJCXVpbnQzMl90IHdyaXRlX2RhdGE7CisJCX0gdDI2MTsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDhfdCAgcmFtX2FyZWE7CisJCQl1aW50OF90ICByZXNlcnZlZFszXTsKKwkJCXVpbnQzMl90IHN0YXJ0X2FkZHI7CisJCQl1aW50MzJfdCBlbmRfYWRkcjsKKwkJfSB0MjYyOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBudW1fcXVldWVzOworCQkJdWludDhfdCAgcXVldWVfdHlwZTsKKwkJCXVpbnQ4X3QgIHJlc2VydmVkWzNdOworCQl9IHQyNjM7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGZjZV90cmFjZV9zaXplOworCQkJdWludDY0X3Qgd3JpdGVfcG9pbnRlcjsKKwkJCXVpbnQ2NF90IGJhc2VfcG9pbnRlcjsKKwkJCXVpbnQzMl90IGZjZV9lbmFibGVfbWIwOworCQkJdWludDMyX3QgZmNlX2VuYWJsZV9tYjI7CisJCQl1aW50MzJfdCBmY2VfZW5hYmxlX21iMzsKKwkJCXVpbnQzMl90IGZjZV9lbmFibGVfbWI0OworCQkJdWludDMyX3QgZmNlX2VuYWJsZV9tYjU7CisJCQl1aW50MzJfdCBmY2VfZW5hYmxlX21iNjsKKwkJfSB0MjY0OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCX0gdDI2NTsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQl9IHQyNjY7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQ4X3QgIHBjaV9vZmZzZXQ7CisJCQl1aW50OF90ICByZXNlcnZlZFszXTsKKwkJCXVpbnQzMl90IGRhdGE7CisJCX0gdDI2NzsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDhfdCAgYnVmX3R5cGU7CisJCQl1aW50OF90ICByZXNlcnZlZFszXTsKKwkJCXVpbnQzMl90IGJ1Zl9zaXplOworCQkJdWludDY0X3Qgc3RhcnRfYWRkcjsKKwkJfSB0MjY4OworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBzY3JhdGNoX3NpemU7CisJCX0gdDI2OTsKKworCQlzdHJ1Y3QgX19wYWNrZWQgeworCQkJdWludDMyX3QgYWRkcjsKKwkJCXVpbnQzMl90IGNvdW50OworCQl9IHQyNzA7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGFkZHI7CisJCQl1aW50MzJfdCBkYXRhOworCQl9IHQyNzE7CisKKwkJc3RydWN0IF9fcGFja2VkIHsKKwkJCXVpbnQzMl90IGFkZHI7CisJCQl1aW50MzJfdCBjb3VudDsKKwkJfSB0MjcyOworCisJCXN0cnVjdCBfX3BhY2tlZCB7CisJCQl1aW50MzJfdCBhZGRyOworCQkJdWludDMyX3QgY291bnQ7CisJCX0gdDI3MzsKKwl9OworfTsKKworI2RlZmluZSBUMjYyX1JBTV9BUkVBX0NSSVRJQ0FMX1JBTQkxCisjZGVmaW5lIFQyNjJfUkFNX0FSRUFfRVhURVJOQUxfUkFNCTIKKyNkZWZpbmUgVDI2Ml9SQU1fQVJFQV9TSEFSRURfUkFNCTMKKyNkZWZpbmUgVDI2Ml9SQU1fQVJFQV9ERFJfUkFNCQk0CisKKyNkZWZpbmUgVDI2M19RVUVVRV9UWVBFX1JFUQkJMQorI2RlZmluZSBUMjYzX1FVRVVFX1RZUEVfUlNQCQkyCisjZGVmaW5lIFQyNjNfUVVFVUVfVFlQRV9BVElPCQkzCisKKyNkZWZpbmUgVDI2OF9CVUZfVFlQRV9FWFREX1RSQUNFCTEKKyNkZWZpbmUgVDI2OF9CVUZfVFlQRV9FWENIX0JVRk9GRgkyCisjZGVmaW5lIFQyNjhfQlVGX1RZUEVfRVhURF9MT0dJTgkzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKaW5kZXggMzFkMTk1My4uZTM2Yjk0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCkBAIC03LDkgKzcsOSBAQAogLyoKICAqIERyaXZlciB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDYuMDAuMTItayIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDcuMDAuMDItayIKIAogI2RlZmluZSBRTEFfRFJJVkVSX01BSk9SX1ZFUgk4Ci0jZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTYKKyNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJNwogI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkwCiAjZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0XzgzeHguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF84M3h4LmMKaW5kZXggOTE5Mjg0OC4uMmViYTM1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0XzgzeHguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfODN4eC5jCkBAIC0xMzA0LDEyICsxMzA0LDI0IEBACiBzdGF0aWMgaW50IHFsYTRfODN4eF9yZXN0YXJ0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlpbnQgcmV0X3ZhbCA9IFFMQV9TVUNDRVNTOworCXVpbnQzMl90IGlkY19jdHJsOwogCiAJcWxhNF84M3h4X3Byb2Nlc3Nfc3RvcF9zZXEoaGEpOwogCi0JLyogQ29sbGVjdCBtaW5pZHVtcCovCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQUZfODNYWF9OT19GV19EVU1QLCAmaGEtPmZsYWdzKSkKKwkvKgorCSAqIENvbGxlY3QgbWluaWR1bXAuCisJICogSWYgSURDX0NUUkwgQklUMSBpcyBzZXQsIGNsZWFyIGl0IG9uIGdvaW5nIHRvIElOSVQgc3RhdGUgYW5kCisJICogZG9uJ3QgY29sbGVjdCBtaW5pZHVtcAorCSAqLworCWlkY19jdHJsID0gcWxhNF84M3h4X3JkX3JlZyhoYSwgUUxBODNYWF9JRENfRFJWX0NUUkwpOworCWlmIChpZGNfY3RybCAmIEdSQUNFRlVMX1JFU0VUX0JJVDEpIHsKKwkJcWxhNF84M3h4X3dyX3JlZyhoYSwgUUxBODNYWF9JRENfRFJWX0NUUkwsCisJCQkJIChpZGNfY3RybCAmIH5HUkFDRUZVTF9SRVNFVF9CSVQxKSk7CisJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBHcmFjZWZ1bCBSRVNFVDogTm90IGNvbGxlY3RpbmcgbWluaWR1bXBcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKIAkJcWxhNF84eHh4X2dldF9taW5pZHVtcChoYSk7CisJfQogCiAJcWxhNF84M3h4X3Byb2Nlc3NfaW5pdF9zZXEoaGEpOwogCkBAIC0xNjY0LDMgKzE2NzYsMjMgQEAKIAlfX3FsYTRfODN4eF9kaXNhYmxlX3BhdXNlKGhhKTsKIAloYS0+aXNwX29wcy0+aWRjX3VubG9jayhoYSk7CiB9CisKKy8qKgorICogcWxhNF84M3h4X2lzX2RldGFjaGVkIC0gQ2hlY2sgaWYgd2UgYXJlIG1hcmtlZCBpbnZpc2libGUuCisgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqKi8KK2ludCBxbGE0XzgzeHhfaXNfZGV0YWNoZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IGRydl9hY3RpdmU7CisKKwlkcnZfYWN0aXZlID0gcWxhNF84eHh4X3JkX2RpcmVjdChoYSwgUUxBOFhYWF9DUkJfRFJWX0FDVElWRSk7CisKKwlpZiAodGVzdF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKSAmJgorCSAgICAhKGRydl9hY3RpdmUgJiAoMSA8PCBoYS0+ZnVuY19udW0pKSkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGRydl9hY3RpdmUgPSAweCVYXG4iLAorCQkJCSAgX19mdW5jX18sIGRydl9hY3RpdmUpKTsKKwkJcmV0dXJuIFFMQV9TVUNDRVNTOworCX0KKworCXJldHVybiBRTEFfRVJST1I7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmMKaW5kZXggMDRhMDAyNy4uOWY5MmNiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ic2cuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCQkJCQkoaGEtPmlkY19leHRlbmRfdG1vICogSFopKSkgewogCQkJCWhhLT5ub3RpZnlfaWRjX2NvbXAgPSAwOwogCQkJCWhhLT5ub3RpZnlfbGlua191cF9jb21wID0gMDsKLQkJCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogSURDIENvbXBsZXRlIG5vdGlmaWNhdGlvbiBub3QgcmVjZWl2ZWQiLAorCQkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBBYm9ydGluZzogSURDIENvbXBsZXRlIG5vdGlmaWNhdGlvbiBub3QgcmVjZWl2ZWQiLAogCQkJCQkgICBfX2Z1bmNfXyk7CiAJCQkJc3RhdHVzID0gUUxBX0VSUk9SOwogCQkJCWdvdG8gZXhpdF93YWl0OwpAQCAtNTM4LDcgKzUzOCw3IEBACiAJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZoYS0+bGlua191cF9jb21wLAogCQkJCQkJIChJRENfQ09NUF9UT1YgKiBIWikpKSB7CiAJCQloYS0+bm90aWZ5X2xpbmtfdXBfY29tcCA9IDA7Ci0JCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogTElOSyBVUCBub3RpZmljYXRpb24gbm90IHJlY2VpdmVkIiwKKwkJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBBYm9ydGluZzogTElOSyBVUCBub3RpZmljYXRpb24gbm90IHJlY2VpdmVkIiwKIAkJCQkgICBfX2Z1bmNfXyk7CiAJCQlzdGF0dXMgPSBRTEFfRVJST1I7CiAJCQlnb3RvIGV4aXRfd2FpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaAppbmRleCBhYTY3YmI5Li43M2E1MDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCkBAIC0xOTQsNyArMTk0LDcgQEAKICNkZWZpbmUgQURBUFRFUl9JTklUX1RPVgkJMzAKICNkZWZpbmUgQURBUFRFUl9SRVNFVF9UT1YJCTE4MAogI2RlZmluZSBFWFRFTkRfQ01EX1RPVgkJCTYwCi0jZGVmaW5lIFdBSVRfQ01EX1RPVgkJCTMwCisjZGVmaW5lIFdBSVRfQ01EX1RPVgkJCTUKICNkZWZpbmUgRUhfV0FJVF9DTURfVE9WCQkJMTIwCiAjZGVmaW5lIEZJUk1XQVJFX1VQX1RPVgkJCTYwCiAjZGVmaW5lIFJFU0VUX0ZJUk1XQVJFX1RPVgkJMzAKQEAgLTI5Nyw2ICsyOTcsOCBAQAogCiAJLyogRHJpdmVyIFJlLWxvZ2luICAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkgIC8qIEREQiBGbGFncyAqLworI2RlZmluZSBEREJfQ09OTl9DTE9TRV9GQUlMVVJFCQkwIC8qIDB4MDAwMDAwMDEgKi8KKwogCXVpbnQxNl90IGRlZmF1bHRfcmVsb2dpbl90aW1lb3V0OyAvKiAgTWF4IHRpbWUgdG8gd2FpdCBmb3IKIAkJCQkJICAgKiAgcmVsb2dpbiB0byBjb21wbGV0ZSAqLwogCWF0b21pY190IHJldHJ5X3JlbG9naW5fdGltZXI7CSAgLyogTWluIFRpbWUgYmV0d2VlbiByZWxvZ2lucwpAQCAtNTgwLDcgKzU4Miw2IEBACiAjZGVmaW5lIEFGXzgyWFhfRldfRFVNUEVECQkyNCAvKiAweDAxMDAwMDAwICovCiAjZGVmaW5lIEFGXzhYWFhfUlNUX09XTkVSCQkyNSAvKiAweDAyMDAwMDAwICovCiAjZGVmaW5lIEFGXzgyWFhfRFVNUF9SRUFESU5HCQkyNiAvKiAweDA0MDAwMDAwICovCi0jZGVmaW5lIEFGXzgzWFhfTk9fRldfRFVNUAkJMjcgLyogMHgwODAwMDAwMCAqLwogI2RlZmluZSBBRl84M1hYX0lPQ0JfSU5UUl9PTgkJMjggLyogMHgxMDAwMDAwMCAqLwogI2RlZmluZSBBRl84M1hYX01CT1hfSU5UUl9PTgkJMjkgLyogMHgyMDAwMDAwMCAqLwogCkBAIC01OTUsMTAgKzU5NiwxMCBAQAogI2RlZmluZSBEUENfQUVOCQkJCTkgLyogMHgwMDAwMDIwMCAqLwogI2RlZmluZSBEUENfR0VUX0RIQ1BfSVBfQUREUgkJMTUgLyogMHgwMDAwODAwMCAqLwogI2RlZmluZSBEUENfTElOS19DSEFOR0VECQkxOCAvKiAweDAwMDQwMDAwICovCi0jZGVmaW5lIERQQ19SRVNFVF9BQ1RJVkUJCTIwIC8qIDB4MDAwNDAwMDAgKi8KLSNkZWZpbmUgRFBDX0hBX1VOUkVDT1ZFUkFCTEUJCTIxIC8qIDB4MDAwODAwMDAgSVNQLTgyeHggb25seSovCi0jZGVmaW5lIERQQ19IQV9ORUVEX1FVSUVTQ0VOVAkJMjIgLyogMHgwMDEwMDAwMCBJU1AtODJ4eCBvbmx5Ki8KLSNkZWZpbmUgRFBDX1BPU1RfSURDX0FDSwkJMjMgLyogMHgwMDIwMDAwMCAqLworI2RlZmluZSBEUENfUkVTRVRfQUNUSVZFCQkyMCAvKiAweDAwMTAwMDAwICovCisjZGVmaW5lIERQQ19IQV9VTlJFQ09WRVJBQkxFCQkyMSAvKiAweDAwMjAwMDAwIElTUC04Mnh4IG9ubHkqLworI2RlZmluZSBEUENfSEFfTkVFRF9RVUlFU0NFTlQJCTIyIC8qIDB4MDA0MDAwMDAgSVNQLTgyeHggb25seSovCisjZGVmaW5lIERQQ19QT1NUX0lEQ19BQ0sJCTIzIC8qIDB4MDA4MDAwMDAgKi8KICNkZWZpbmUgRFBDX1JFU1RPUkVfQUNCCQkJMjQgLyogMHgwMTAwMDAwMCAqLwogCiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsgLyogcG9pbnRlciB0byBob3N0IGRhdGEgKi8KQEAgLTc2OCw2ICs3NjksNyBAQAogCXVpbnQzMl90IGZ3X2R1bXBfY2FwdHVyZV9tYXNrOwogCXZvaWQgKmZ3X2R1bXBfdG1wbHRfaGRyOwogCXVpbnQzMl90IGZ3X2R1bXBfdG1wbHRfc2l6ZTsKKwl1aW50MzJfdCBmd19kdW1wX3NraXBfc2l6ZTsKIAogCXN0cnVjdCBjb21wbGV0aW9uIG1ieF9pbnRyX2NvbXA7CiAKQEAgLTkxMCw3ICs5MTIsOCBAQAogc3RhdGljIGlubGluZSBpbnQgaXNfYWVyX3N1cHBvcnRlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJcmV0dXJuICgoaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDIyKSB8fAotCQkoaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MzI0KSk7CisJCShoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgzMjQpIHx8CisJCShoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwNDIpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYWRhcHRlcl91cChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oCmluZGV4IDhkNDA5MmIuLjIwOTg1M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oCkBAIC0zOTAsNiArMzkwLDcgQEAKICNkZWZpbmUgTUJPWF9DTURfQ0xFQVJfREFUQUJBU0VfRU5UUlkJCTB4MDAzMQogI2RlZmluZSBNQk9YX0NNRF9DT05OX09QRU4JCQkweDAwNzQKICNkZWZpbmUgTUJPWF9DTURfQ09OTl9DTE9TRV9TRVNTX0xPR09VVAkJMHgwMDU2CisjZGVmaW5lIEREQl9OT1RfTE9HR0VEX0lOCQkJMHgwOQogI2RlZmluZSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT04JCTB4MDAwMgogI2RlZmluZSBMT0dPVVRfT1BUSU9OX1JFTE9HSU4JCQkweDAwMDQKICNkZWZpbmUgTE9HT1VUX09QVElPTl9GUkVFX0REQgkJCTB4MDAwOApAQCAtNTA1LDkgKzUwNiw5IEBACiAjZGVmaW5lIE1CT1hfQVNUU19SRVNQT05TRV9RVUVVRV9GVUxMCQkweDgwMjgKICNkZWZpbmUgTUJPWF9BU1RTX0lQX0FERFJfU1RBVEVfQ0hBTkdFRAkJMHg4MDI5CiAjZGVmaW5lIE1CT1hfQVNUU19JUFY2X0RFRkFVTFRfUk9VVEVSX0NIQU5HRUQJMHg4MDJBCi0jZGVmaW5lIE1CT1hfQVNUU19JUFY2X1BSRUZJWF9FWFBJUkVECQkweDgwMkIKLSNkZWZpbmUgTUJPWF9BU1RTX0lQVjZfTkRfUFJFRklYX0lHTk9SRUQJMHg4MDJDCi0jZGVmaW5lIE1CT1hfQVNUU19JUFY2X0xDTF9QUkVGSVhfSUdOT1JFRAkweDgwMkQKKyNkZWZpbmUgTUJPWF9BU1RTX0lQVjZfTElOS19NVFVfQ0hBTkdFCQkweDgwMkIKKyNkZWZpbmUgTUJPWF9BU1RTX0lQVjZfQVVUT19QUkVGSVhfSUdOT1JFRAkweDgwMkMKKyNkZWZpbmUgTUJPWF9BU1RTX0lQVjZfTkRfTE9DQUxfUFJFRklYX0lHTk9SRUQJMHg4MDJECiAjZGVmaW5lIE1CT1hfQVNUU19JQ01QVjZfRVJST1JfTVNHX1JDVkQJCTB4ODAyRQogI2RlZmluZSBNQk9YX0FTVFNfSU5JVElBTElaQVRJT05fRkFJTEVECQkweDgwMzEKICNkZWZpbmUgTUJPWF9BU1RTX1NZU1RFTV9XQVJOSU5HX0VWRU5UCQkweDgwMzYKQEAgLTUyOCwxNCArNTI5LDE0IEBACiAjZGVmaW5lIEFDQl9DT05GSUdfRElTQUJMRQkJMHgwMAogI2RlZmluZSBBQ0JfQ09ORklHX1NFVAkJCTB4MDEKIAotLyogQUNCIFN0YXRlIERlZmluZXMgKi8KLSNkZWZpbmUgQUNCX1NUQVRFX1VOQ09ORklHVVJFRAkweDAwCi0jZGVmaW5lIEFDQl9TVEFURV9JTlZBTElECTB4MDEKLSNkZWZpbmUgQUNCX1NUQVRFX0FDUVVJUklORwkweDAyCi0jZGVmaW5lIEFDQl9TVEFURV9URU5UQVRJVkUJMHgwMwotI2RlZmluZSBBQ0JfU1RBVEVfREVQUklDQVRFRAkweDA0Ci0jZGVmaW5lIEFDQl9TVEFURV9WQUxJRAkJMHgwNQotI2RlZmluZSBBQ0JfU1RBVEVfRElTQUJMSU5HCTB4MDYKKy8qIEFDQi9JUCBBZGRyZXNzIFN0YXRlIERlZmluZXMgKi8KKyNkZWZpbmUgSVBfQUREUlNUQVRFX1VOQ09ORklHVVJFRAkwCisjZGVmaW5lIElQX0FERFJTVEFURV9JTlZBTElECQkxCisjZGVmaW5lIElQX0FERFJTVEFURV9BQ1FVSVJJTkcJCTIKKyNkZWZpbmUgSVBfQUREUlNUQVRFX1RFTlRBVElWRQkJMworI2RlZmluZSBJUF9BRERSU1RBVEVfREVQUklDQVRFRAkJNAorI2RlZmluZSBJUF9BRERSU1RBVEVfUFJFRkVSUkVECQk1CisjZGVmaW5lIElQX0FERFJTVEFURV9ESVNBQkxJTkcJCTYKIAogLyogRkxBU0ggb2Zmc2V0cyAqLwogI2RlZmluZSBGTEFTSF9TRUdNRU5UX0lGQ0IJMHgwNDAwMDAwMApAQCAtNjk4LDE0ICs2OTksNiBAQAogCXVpbnQ4X3QgaXB2Nl9sbmtfbGNsX2FkZHJfc3RhdGU7LyogMjIyICovCiAJdWludDhfdCBpcHY2X2FkZHIwX3N0YXRlOwkvKiAyMjMgKi8KIAl1aW50OF90IGlwdjZfYWRkcjFfc3RhdGU7CS8qIDIyNCAqLwotI2RlZmluZSBJUF9BRERSU1RBVEVfVU5DT05GSUdVUkVECTAKLSNkZWZpbmUgSVBfQUREUlNUQVRFX0lOVkFMSUQJCTEKLSNkZWZpbmUgSVBfQUREUlNUQVRFX0FDUVVJUklORwkJMgotI2RlZmluZSBJUF9BRERSU1RBVEVfVEVOVEFUSVZFCQkzCi0jZGVmaW5lIElQX0FERFJTVEFURV9ERVBSSUNBVEVECQk0Ci0jZGVmaW5lIElQX0FERFJTVEFURV9QUkVGRVJSRUQJCTUKLSNkZWZpbmUgSVBfQUREUlNUQVRFX0RJU0FCTElORwkJNgotCiAJdWludDhfdCBpcHY2X2RmbHRfcnRyX3N0YXRlOyAgICAvKiAyMjUgKi8KICNkZWZpbmUgSVBWNl9SVFJTVEFURV9VTktOT1dOICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgSVBWNl9SVFJTVEFURV9NQU5VQUwgICAgICAgICAgICAgICAgICAgIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCmluZGV4IGQ2N2M1MGUuLmIxYTE5Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaApAQCAtMjc5LDYgKzI3OSw4IEBACiB1aW50OF90IHFsYTR4eHhfc2V0X2lwYWRkcl9zdGF0ZSh1aW50OF90IGZ3X2lwYWRkcl9zdGF0ZSk7CiBpbnQgcWxhNF84M3h4X2dldF9wb3J0X2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICpjb25maWcpOwogaW50IHFsYTRfODN4eF9zZXRfcG9ydF9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCAqY29uZmlnKTsKK2ludCBxbGE0Xzh4eHhfY2hlY2tfaW5pdF9hZGFwdGVyX3JldHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNF84M3h4X2lzX2RldGFjaGVkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiAKIGV4dGVybiBpbnQgcWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmc7CiBleHRlcm4gaW50IHFsNHhkb250cmVzZXRoYmE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYwppbmRleCA3NDU2ZWViLi4yOGZiZWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKQEAgLTk1OSwxMyArOTU5LDggQEAKIAkJcWxhNHh4eF9idWlsZF9kZGJfbGlzdChoYSwgaXNfcmVzZXQpOwogCiAJc2V0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpOwotZXhpdF9pbml0X2hiYToKLQlpZiAoaXNfcWxhODBYWChoYSkgJiYgKHN0YXR1cyA9PSBRTEFfRVJST1IpKSB7Ci0JCS8qIFNpbmNlIGludGVycnVwdHMgYXJlIHJlZ2lzdGVyZWQgaW4gc3RhcnRfZmlybXdhcmUgZm9yCi0JCSAqIDgwWFgsIHJlbGVhc2UgdGhlbSBoZXJlIGlmIGluaXRpYWxpemVfYWRhcHRlciBmYWlscyAqLwotCQlxbGE0eHh4X2ZyZWVfaXJxcyhoYSk7Ci0JfQogCitleGl0X2luaXRfaGJhOgogCURFQlVHMihwcmludGsoInNjc2klbGQ6IGluaXRpYWxpemUgYWRhcHRlcjogJXNcbiIsIGhhLT5ob3N0X25vLAogCSAgICBzdGF0dXMgPT0gUUxBX0VSUk9SID8gIkZBSUxFRCIgOiAiU1VDQ0VFREVEIikpOwogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMKaW5kZXggYTNjOGJjNy4uYjE5MjVkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYwpAQCAtMzg1LDkgKzM4NSw5IEBACiAKIAljbHNfY29ubiA9IGRkYl9lbnRyeS0+Y29ubjsKIAljb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7Ci0Jc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmJhY2tfbG9jayk7CiAJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sIGl0dCk7Ci0Jc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5iYWNrX2xvY2spOwogCiAJaWYgKHRhc2sgPT0gTlVMTCkgewogCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBUYXNrIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKQEAgLTYzNSw2ICs2MzUsMTggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZGVmYXVsdF9yb3V0ZXJfY2hhbmdlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJCSAgIHVpbnQzMl90ICptYm94X3N0cykKK3sKKwltZW1jcHkoJmhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLnM2X2FkZHIzMlswXSwKKwkgICAgICAgJm1ib3hfc3RzWzJdLCBzaXplb2YodWludDMyX3QpKTsKKwltZW1jcHkoJmhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLnM2X2FkZHIzMlsxXSwKKwkgICAgICAgJm1ib3hfc3RzWzNdLCBzaXplb2YodWludDMyX3QpKTsKKwltZW1jcHkoJmhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLnM2X2FkZHIzMlsyXSwKKwkgICAgICAgJm1ib3hfc3RzWzRdLCBzaXplb2YodWludDMyX3QpKTsKKwltZW1jcHkoJmhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLnM2X2FkZHIzMlszXSwKKwkgICAgICAgJm1ib3hfc3RzWzVdLCBzaXplb2YodWludDMyX3QpKTsKK30KIAogLyoqCiAgKiBxbGE0eHh4X2lzcl9kZWNvZGVfbWFpbGJveCAtIGRlY29kZXMgbWFpbGJveCBzdGF0dXMKQEAgLTc4MSwyNyArNzkzLDQ0IEBACiAJCQkJCQkgICAgbWJveF9zdHNbM10pOwogCQkJLyogbWJveF9zdHNbMl0gPSBPbGQgQUNCIHN0YXRlCiAJCQkgKiBtYm94X3N0c1szXSA9IG5ldyBBQ0Igc3RhdGUgKi8KLQkJCWlmICgobWJveF9zdHNbM10gPT0gQUNCX1NUQVRFX1ZBTElEKSAmJgotCQkJICAgICgobWJveF9zdHNbMl0gPT0gQUNCX1NUQVRFX1RFTlRBVElWRSkgfHwKLQkJCSAgICAobWJveF9zdHNbMl0gPT0gQUNCX1NUQVRFX0FDUVVJUklORykpKSB7CisJCQlpZiAoKG1ib3hfc3RzWzNdID09IElQX0FERFJTVEFURV9QUkVGRVJSRUQpICYmCisJCQkgICAgKChtYm94X3N0c1syXSA9PSBJUF9BRERSU1RBVEVfVEVOVEFUSVZFKSB8fAorCQkJICAgICAobWJveF9zdHNbMl0gPT0gSVBfQUREUlNUQVRFX0FDUVVJUklORykpKSB7CiAJCQkJc2V0X2JpdChEUENfR0VUX0RIQ1BfSVBfQUREUiwgJmhhLT5kcGNfZmxhZ3MpOwotCQkJfSBlbHNlIGlmICgobWJveF9zdHNbM10gPT0gQUNCX1NUQVRFX0FDUVVJUklORykgJiYKLQkJCQkgICAobWJveF9zdHNbMl0gPT0gQUNCX1NUQVRFX1ZBTElEKSkgeworCQkJfSBlbHNlIGlmICgobWJveF9zdHNbM10gPT0gSVBfQUREUlNUQVRFX0FDUVVJUklORykgJiYKKwkJCQkgICAobWJveF9zdHNbMl0gPT0gSVBfQUREUlNUQVRFX1BSRUZFUlJFRCkpIHsKIAkJCQlpZiAoaXNfcWxhODBYWChoYSkpCiAJCQkJCXNldF9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsCiAJCQkJCQkmaGEtPmRwY19mbGFncyk7CiAJCQkJZWxzZQogCQkJCQlzZXRfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOwotCQkJfSBlbHNlIGlmIChtYm94X3N0c1szXSA9PSBBQ0JfU1RBVEVfRElTQUJMSU5HKSB7CisJCQl9IGVsc2UgaWYgKG1ib3hfc3RzWzNdID09IElQX0FERFJTVEFURV9ESVNBQkxJTkcpIHsKIAkJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogQUNCIGluIGRpc2FibGluZyBzdGF0ZVxuIiwKIAkJCQkJICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKLQkJCX0gZWxzZSBpZiAoKG1ib3hfc3RzWzNdID09IEFDQl9TVEFURV9VTkNPTkZJR1VSRUQpKSB7CisJCQl9IGVsc2UgaWYgKG1ib3hfc3RzWzNdID09IElQX0FERFJTVEFURV9VTkNPTkZJR1VSRUQpIHsKIAkJCQljb21wbGV0ZSgmaGEtPmRpc2FibGVfYWNiX2NvbXApOwogCQkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBBQ0Igc3RhdGUgdW5jb25maWd1cmVkXG4iLAogCQkJCQkgICBoYS0+aG9zdF9ubywgX19mdW5jX18pOwogCQkJfQogCQkJYnJlYWs7CiAKKwkJY2FzZSBNQk9YX0FTVFNfSVBWNl9MSU5LX01UVV9DSEFOR0U6CisJCWNhc2UgTUJPWF9BU1RTX0lQVjZfQVVUT19QUkVGSVhfSUdOT1JFRDoKKwkJY2FzZSBNQk9YX0FTVFNfSVBWNl9ORF9MT0NBTF9QUkVGSVhfSUdOT1JFRDoKKwkJCS8qIE5vIGFjdGlvbiAqLworCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6IEFFTiAlMDR4XG4iLAorCQkJCQkgIGhhLT5ob3N0X25vLCBtYm94X3N0YXR1cykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNQk9YX0FTVFNfSUNNUFY2X0VSUk9SX01TR19SQ1ZEOgorCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkJICAic2NzaSVsZDogQUVOICUwNHgsIElQdjYgRVJST1IsICIKKwkJCQkJICAibWJveF9zdHNbMV09JTA4eCwgbWJveF9zdHNbMl09JTA4eCwgbWJveF9zdHNbM309JTA4eCwgbWJveF9zdHNbNF09JTA4eCBtYm94X3N0c1s1XT0lMDh4XG4iLAorCQkJCQkgIGhhLT5ob3N0X25vLCBtYm94X3N0c1swXSwgbWJveF9zdHNbMV0sCisJCQkJCSAgbWJveF9zdHNbMl0sIG1ib3hfc3RzWzNdLCBtYm94X3N0c1s0XSwKKwkJCQkJICBtYm94X3N0c1s1XSkpOworCQkJYnJlYWs7CisKIAkJY2FzZSBNQk9YX0FTVFNfTUFDX0FERFJFU1NfQ0hBTkdFRDoKIAkJY2FzZSBNQk9YX0FTVFNfRE5TOgogCQkJLyogTm8gYWN0aW9uICovCkBAIC05MzksNiArOTY4LDcgQEAKIAkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCQkJCSAgInNjc2klbGQ6IEFFTiAlMDR4IFJlY2VpdmVkIElQdjYgZGVmYXVsdCByb3V0ZXIgY2hhbmdlZCBub3RpZmljYXRpb25cbiIsCiAJCQkJCSAgaGEtPmhvc3Rfbm8sIG1ib3hfc3RzWzBdKSk7CisJCQlxbGE0eHh4X2RlZmF1bHRfcm91dGVyX2NoYW5nZWQoaGEsIG1ib3hfc3RzKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUJPWF9BU1RTX0lEQ19USU1FX0VYVEVORF9OT1RJRklDQVRJT046CkBAIC0xMDIyLDcgKzEwNTIsOCBAQAogICAgIHVpbnQzMl90IGludHJfc3RhdHVzKQogewogCS8qIFByb2Nlc3MgcmVzcG9uc2UgcXVldWUgaW50ZXJydXB0LiAqLwotCWlmIChpbnRyX3N0YXR1cyAmIEhTUlhfUklTQ19JT0NCX0lOVCkKKwlpZiAoKGludHJfc3RhdHVzICYgSFNSWF9SSVNDX0lPQ0JfSU5UKSAmJgorCSAgICB0ZXN0X2JpdChBRl9JTklUX0RPTkUsICZoYS0+ZmxhZ3MpKQogCQlxbGE0eHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOwogCiAJLyogUHJvY2VzcyBtYWlsYm94L2FzeW5jaCBldmVudCBpbnRlcnJ1cHQuKi8KQEAgLTEzOTksNiArMTQzMCw3IEBACiB7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGV2X2lkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGludHJfc3RhdHVzOwogCXVpbnQzMl90IGl2YWwgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC0xNDEyLDggKzE0NDQsMTUgQEAKIAkJcWxhNHh4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKIAkJd3JpdGVsKDAsICZoYS0+cWxhNF84M3h4X3JlZy0+aW9jYl9pbnRfbWFzayk7CiAJfSBlbHNlIHsKLQkJcWxhNHh4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKLQkJd3JpdGVsKDAsICZoYS0+cWxhNF84Mnh4X3JlZy0+aG9zdF9pbnQpOworCQlpbnRyX3N0YXR1cyA9IHJlYWRsKCZoYS0+cWxhNF84Mnh4X3JlZy0+aG9zdF9zdGF0dXMpOworCQlpZiAoaW50cl9zdGF0dXMgJiBIU1JYX1JJU0NfSU9DQl9JTlQpIHsKKwkJCXFsYTR4eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CisJCQl3cml0ZWwoMCwgJmhhLT5xbGE0XzgyeHhfcmVnLT5ob3N0X2ludCk7CisJCX0gZWxzZSB7CisJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogc3B1cmlvdXMgaW9jYiBpbnRlcnJ1cHQuLi5cbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJZ290byBleGl0X21zaXhfcnNwX3E7CisJCX0KIAl9CiAJaGEtPmlzcl9jb3VudCsrOwogZXhpdF9tc2l4X3JzcF9xOgpAQCAtMTQ4OCw2ICsxNTI3LDcgQEAKIGludCBxbGE0eHh4X3JlcXVlc3RfaXJxcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJaW50IHJldDsKKwlpbnQgcnZhbCA9IFFMQV9FUlJPUjsKIAogCWlmIChpc19xbGE0MFhYKGhhKSkKIAkJZ290byB0cnlfaW50eDsKQEAgLTE1NjgsOSArMTYwOCwxMCBAQAogCXNldF9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKTsKIAloYS0+aG9zdC0+aXJxID0gaGEtPnBkZXYtPmlycTsKIAlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogaXJxICVkIGF0dGFjaGVkXG4iLAotCSAgICBfX2Z1bmNfXywgaGEtPnBkZXYtPmlycSk7CisJCSAgIF9fZnVuY19fLCBoYS0+cGRldi0+aXJxKTsKKwlydmFsID0gUUxBX1NVQ0NFU1M7CiBpcnFfbm90X2F0dGFjaGVkOgotCXJldHVybiByZXQ7CisJcmV0dXJuIHJ2YWw7CiB9CiAKIHZvaWQgcWxhNHh4eF9mcmVlX2lycXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCmluZGV4IDlhZThjYTMuLjBhNmI3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKQEAgLTIxMiw5ICsyMTIsOCBAQAogCQkJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwogCQkJZ290byBtYm94X2V4aXQ7CiAJCX0KLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogTWFpbGJveCBDbWQgMHglMDhYIHRpbWVkIG91dCAuLi4sIgotCQkJICAgICAgIiBTY2hlZHVsaW5nIEFkYXB0ZXIgUmVzZXRcbiIsIGhhLT5ob3N0X25vLAotCQkJICAgICAgbWJ4X2NtZFswXSkpOworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpJWxkOiBNYWlsYm94IENtZCAweCUwOFggdGltZWQgb3V0LCBTY2hlZHVsaW5nIEFkYXB0ZXIgUmVzZXRcbiIsCisJCQkgICBoYS0+aG9zdF9ubywgbWJ4X2NtZFswXSk7CiAJCWhhLT5tYWlsYm94X3RpbWVvdXRfY291bnQrKzsKIAkJbWJ4X3N0c1swXSA9ICgtMSk7CiAJCXNldF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CkBAIC0yNTEsMTUgKzI1MCwxNiBAQAogCQlicmVhazsKIAogCWNhc2UgTUJPWF9TVFNfQlVTWToKLQkJREVCVUcyKCBwcmludGsoInNjc2klbGQ6ICVzOiBDbWQgPSAlMDhYLCBJU1AgQlVTWVxuIiwKLQkJCSAgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIG1ieF9jbWRbMF0pKTsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSVsZDogJXM6IENtZCA9ICUwOFgsIElTUCBCVVNZXG4iLAorCQkJICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBtYnhfY21kWzBdKTsKIAkJaGEtPm1haWxib3hfdGltZW91dF9jb3VudCsrOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiAqKioqIEZBSUxFRCwgY21kID0gJTA4WCwgIgotCQkJICAgICAgInN0cyA9ICUwOFggKioqKlxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJICAgICAgbWJ4X2NtZFswXSwgbWJ4X3N0c1swXSkpOworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpJWxkOiAlczogRkFJTEVELCBNQk9YIENNRCA9ICUwOFgsIE1CT1ggU1RTID0gJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYXG4iLAorCQkJICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBtYnhfY21kWzBdLCBtYnhfc3RzWzBdLAorCQkJICAgbWJ4X3N0c1sxXSwgbWJ4X3N0c1syXSwgbWJ4X3N0c1szXSwgbWJ4X3N0c1s0XSwKKwkJCSAgIG1ieF9zdHNbNV0sIG1ieF9zdHNbNl0sIG1ieF9zdHNbN10pOwogCQlicmVhazsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKQEAgLTM4Myw3ICszODMsNiBAQAogCW1ib3hfY21kWzJdID0gTFNEVyhpbml0X2Z3X2NiX2RtYSk7CiAJbWJveF9jbWRbM10gPSBNU0RXKGluaXRfZndfY2JfZG1hKTsKIAltYm94X2NtZFs0XSA9IHNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2Jsayk7Ci0JbWJveF9jbWRbNV0gPSAoSUZDQl9WRVJfTUFYIDw8IDgpIHwgSUZDQl9WRVJfTUlOOwogCiAJaWYgKHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCA2LCA2LCBtYm94X2NtZCwgbWJveF9zdHMpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CkBAIC02NDgsOSArNjQ3LDYgQEAKIAkJZ290byBleGl0X2luaXRfZndfY2I7CiAJfQogCi0JLyogSW5pdGlhbGl6ZSByZXF1ZXN0IGFuZCByZXNwb25zZSBxdWV1ZXMuICovCi0JcWxhNHh4eF9pbml0X3JpbmdzKGhhKTsKLQogCS8qIEZpbGwgaW4gdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHF1ZXVlIGluZm9ybWF0aW9uLiAqLwogCWluaXRfZndfY2ItPnJxcV9jb25zdW1lcl9pZHggPSBjcHVfdG9fbGUxNihoYS0+cmVxdWVzdF9vdXQpOwogCWluaXRfZndfY2ItPmNvbXBxX3Byb2R1Y2VyX2lkeCA9IGNwdV90b19sZTE2KGhhLT5yZXNwb25zZV9pbik7CkBAIC0xMDAyLDYgKzk5OCwxMCBAQAogCQkJCSAgIiVzOiBNQk9YX0NNRF9DT05OX0NMT1NFX1NFU1NfTE9HT1VUICIKIAkJCQkgICJmYWlsZWQgc3RzICUwNFggJTA0WCIsIF9fZnVuY19fLAogCQkJCSAgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzFdKSk7CisJCWlmICgobWJveF9zdHNbMF0gPT0gTUJPWF9TVFNfQ09NTUFORF9FUlJPUikgJiYKKwkJICAgIChtYm94X3N0c1sxXSA9PSBEREJfTk9UX0xPR0dFRF9JTikpIHsKKwkJCXNldF9iaXQoRERCX0NPTk5fQ0xPU0VfRkFJTFVSRSwgJmRkYl9lbnRyeS0+ZmxhZ3MpOworCQl9CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTE5MTgsNiArMTkxOCw3IEBACiAJCQkJICBtYm94X3N0c1swXSwgbWJveF9zdHNbMV0sIG1ib3hfc3RzWzJdKSk7CiAJfSBlbHNlIHsKIAkJaWYgKGlzX3FsYTgwNDIoaGEpICYmCisJCSAgICB0ZXN0X2JpdChEUENfUE9TVF9JRENfQUNLLCAmaGEtPmRwY19mbGFncykgJiYKIAkJICAgIChtYm94X3N0c1swXSAhPSBNQk9YX1NUU19DT01NQU5EX0NPTVBMRVRFKSkgewogCQkJLyoKIAkJCSAqIERpc2FibGUgQUNCIG1haWxib3ggY29tbWFuZCB0YWtlcyB0aW1lIHRvIGNvbXBsZXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jCmluZGV4IGQwMDEyMDIuLjYzMzI4YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jCkBAIC0yMzgzLDYgKzIzODMsMTEgQEAKIAkJCSAgInNjc2koJWxkKTogU2tpcHBpbmcgZW50cnlbJWRdOiBFVFlQRVsweCV4XS1FTEVWRUxbMHgleF1cbiIsCiAJCQkgIGhhLT5ob3N0X25vLCBpbmRleCwgZW50cnlfaGRyLT5lbnRyeV90eXBlLAogCQkJICBlbnRyeV9oZHItPmRfY3RybC5lbnRyeV9jYXB0dXJlX21hc2spKTsKKwkvKiBJZiBkcml2ZXIgZW5jb3VudGVycyBhIG5ldyBlbnRyeSB0eXBlIHRoYXQgaXQgY2Fubm90IHByb2Nlc3MsCisJICogaXQgc2hvdWxkIGp1c3Qgc2tpcCB0aGUgZW50cnkgYW5kIGFkanVzdCB0aGUgdG90YWwgYnVmZmVyIHNpemUgYnkKKwkgKiBmcm9tIHN1YnRyYWN0aW5nIHRoZSBza2lwcGVkIGJ5dGVzIGZyb20gaXQKKwkgKi8KKwloYS0+ZndfZHVtcF9za2lwX3NpemUgKz0gZW50cnlfaGRyLT5lbnRyeV9jYXB0dXJlX3NpemU7CiB9CiAKIC8qIElTUDgzeHggZnVuY3Rpb25zIHRvIHByb2Nlc3MgbmV3IG1pbmlkdW1wIGVudHJpZXMuLi4gKi8KQEAgLTI1OTAsNiArMjU5NSw3IEBACiAJdWludDY0X3Qgbm93OwogCXVpbnQzMl90IHRpbWVzdGFtcDsKIAorCWhhLT5md19kdW1wX3NraXBfc2l6ZSA9IDA7CiAJaWYgKCFoYS0+ZndfZHVtcCkgewogCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlcyglbGQpIE5vIGJ1ZmZlciB0byBkdW1wXG4iLAogCQkJICAgX19mdW5jX18sIGhhLT5ob3N0X25vKTsKQEAgLTI3NjEsNyArMjc2Nyw3IEBACiAJCQkJIGVudHJ5X2hkci0+ZW50cnlfc2l6ZSk7CiAJfQogCi0JaWYgKGRhdGFfY29sbGVjdGVkICE9IGhhLT5md19kdW1wX3NpemUpIHsKKwlpZiAoKGRhdGFfY29sbGVjdGVkICsgaGEtPmZ3X2R1bXBfc2tpcF9zaXplKSAhPSBoYS0+ZndfZHVtcF9zaXplKSB7CiAJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJCSAgICJEdW1wIGRhdGEgbWlzbWF0Y2g6IERhdGEgY29sbGVjdGVkOiBbMHgleF0sIHRvdGFsX2RhdGFfc2l6ZTpbMHgleF1cbiIsCiAJCQkgICBkYXRhX2NvbGxlY3RlZCwgaGEtPmZ3X2R1bXBfc2l6ZSk7CkBAIC0yODIwLDYzICsyODI2LDM1IEBACiBpbnQgcWxhNF84eHh4X2RldmljZV9ib290c3RyYXAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCWludCBydmFsID0gUUxBX0VSUk9SOwotCWludCBpLCB0aW1lb3V0OwotCXVpbnQzMl90IG9sZF9jb3VudCwgY291bnQsIGlkY19jdHJsOwotCWludCBuZWVkX3Jlc2V0ID0gMCwgcGVnX3N0dWNrID0gMTsKKwlpbnQgaTsKKwl1aW50MzJfdCBvbGRfY291bnQsIGNvdW50OworCWludCBuZWVkX3Jlc2V0ID0gMDsKIAogCW5lZWRfcmVzZXQgPSBoYS0+aXNwX29wcy0+bmVlZF9yZXNldChoYSk7Ci0Jb2xkX2NvdW50ID0gcWxhNF84eHh4X3JkX2RpcmVjdChoYSwgUUxBOFhYWF9QRUdfQUxJVkVfQ09VTlRFUik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQl0aW1lb3V0ID0gbXNsZWVwX2ludGVycnVwdGlibGUoMjAwKTsKLQkJaWYgKHRpbWVvdXQpIHsKLQkJCXFsYTRfOHh4eF93cl9kaXJlY3QoaGEsIFFMQThYWFhfQ1JCX0RFVl9TVEFURSwKLQkJCQkJICAgIFFMQThYWFhfREVWX0ZBSUxFRCk7Ci0JCQlyZXR1cm4gcnZhbDsKLQkJfQotCi0JCWNvdW50ID0gcWxhNF84eHh4X3JkX2RpcmVjdChoYSwgUUxBOFhYWF9QRUdfQUxJVkVfQ09VTlRFUik7Ci0JCWlmIChjb3VudCAhPSBvbGRfY291bnQpCi0JCQlwZWdfc3R1Y2sgPSAwOwotCX0KIAogCWlmIChuZWVkX3Jlc2V0KSB7CiAJCS8qIFdlIGFyZSB0cnlpbmcgdG8gcGVyZm9ybSBhIHJlY292ZXJ5IGhlcmUuICovCi0JCWlmIChwZWdfc3R1Y2spCisJCWlmICh0ZXN0X2JpdChBRl9GV19SRUNPVkVSWSwgJmhhLT5mbGFncykpCiAJCQloYS0+aXNwX29wcy0+cm9tX2xvY2tfcmVjb3ZlcnkoaGEpOwotCQlnb3RvIGRldl9pbml0aWFsaXplOwogCX0gZWxzZSAgewotCQkvKiBTdGFydCBvZiBkYXkgZm9yIHRoaXMgaGEgY29udGV4dC4gKi8KLQkJaWYgKHBlZ19zdHVjaykgewotCQkJLyogRWl0aGVyIHdlIGFyZSB0aGUgZmlyc3Qgb3IgcmVjb3ZlcnkgaW4gcHJvZ3Jlc3MuICovCi0JCQloYS0+aXNwX29wcy0+cm9tX2xvY2tfcmVjb3ZlcnkoaGEpOwotCQkJZ290byBkZXZfaW5pdGlhbGl6ZTsKLQkJfSBlbHNlIHsKLQkJCS8qIEZpcm13YXJlIGFscmVhZHkgcnVubmluZy4gKi8KLQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKLQkJCWdvdG8gZGV2X3JlYWR5OworCQlvbGRfY291bnQgPSBxbGE0Xzh4eHhfcmRfZGlyZWN0KGhhLCBRTEE4WFhYX1BFR19BTElWRV9DT1VOVEVSKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCW1zbGVlcCgyMDApOworCQkJY291bnQgPSBxbGE0Xzh4eHhfcmRfZGlyZWN0KGhhLAorCQkJCQkJICAgIFFMQThYWFhfUEVHX0FMSVZFX0NPVU5URVIpOworCQkJaWYgKGNvdW50ICE9IG9sZF9jb3VudCkgeworCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwkJCQlnb3RvIGRldl9yZWFkeTsKKwkJCX0KIAkJfQorCQloYS0+aXNwX29wcy0+cm9tX2xvY2tfcmVjb3ZlcnkoaGEpOwogCX0KIAotZGV2X2luaXRpYWxpemU6CiAJLyogc2V0IHRvIERFVl9JTklUSUFMSVpJTkcgKi8KIAlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogSU5JVElBTElaSU5HXG4iKTsKIAlxbGE0Xzh4eHhfd3JfZGlyZWN0KGhhLCBRTEE4WFhYX0NSQl9ERVZfU1RBVEUsCiAJCQkgICAgUUxBOFhYWF9ERVZfSU5JVElBTElaSU5HKTsKIAotCS8qCi0JICogRm9yIElTUDgzMjQgYW5kIElTUDgwNDIsIGlmIElEQ19DVFJMIEdSQUNFRlVMX1JFU0VUX0JJVDEgaXMgc2V0LAotCSAqIHJlc2V0IGl0IGFmdGVyIGRldmljZSBnb2VzIHRvIElOSVQgc3RhdGUuCi0JICovCi0JaWYgKGlzX3FsYTgwMzIoaGEpIHx8IGlzX3FsYTgwNDIoaGEpKSB7Ci0JCWlkY19jdHJsID0gcWxhNF84M3h4X3JkX3JlZyhoYSwgUUxBODNYWF9JRENfRFJWX0NUUkwpOwotCQlpZiAoaWRjX2N0cmwgJiBHUkFDRUZVTF9SRVNFVF9CSVQxKSB7Ci0JCQlxbGE0XzgzeHhfd3JfcmVnKGhhLCBRTEE4M1hYX0lEQ19EUlZfQ1RSTCwKLQkJCQkJIChpZGNfY3RybCAmIH5HUkFDRUZVTF9SRVNFVF9CSVQxKSk7Ci0JCQlzZXRfYml0KEFGXzgzWFhfTk9fRldfRFVNUCwgJmhhLT5mbGFncyk7Ci0JCX0KLQl9Ci0KIAloYS0+aXNwX29wcy0+aWRjX3VubG9jayhoYSk7CiAKIAlpZiAoaXNfcWxhODAyMihoYSkpCkBAIC0zMjA5LDYgKzMxODcsMTAgQEAKIAogCXJldHZhbCA9IHFsYTRfOHh4eF9kZXZpY2Vfc3RhdGVfaGFuZGxlcihoYSk7CiAKKwkvKiBJbml0aWFsaXplIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHF1ZXVlcy4gKi8KKwlpZiAocmV0dmFsID09IFFMQV9TVUNDRVNTKQorCQlxbGE0eHh4X2luaXRfcmluZ3MoaGEpOworCiAJaWYgKHJldHZhbCA9PSBRTEFfU1VDQ0VTUyAmJiAhdGVzdF9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKSkKIAkJcmV0dmFsID0gcWxhNHh4eF9yZXF1ZXN0X2lycXMoaGEpOwogCkBAIC0zODM2LDMgKzM4MTgsMjQgQEAKIG1zaXhfb3V0OgogCXJldHVybiByZXQ7CiB9CisKK2ludCBxbGE0Xzh4eHhfY2hlY2tfaW5pdF9hZGFwdGVyX3JldHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisKKwkvKiBEb250IHJldHJ5IGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gaWYgSVJRIGFsbG9jYXRpb24gZmFpbGVkICovCisJaWYgKCF0ZXN0X2JpdChBRl9JUlFfQVRUQUNIRUQsICZoYS0+ZmxhZ3MpKSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBTa2lwcGluZyByZXRyeSBvZiBhZGFwdGVyIGluaXRpYWxpemF0aW9uIGFzIElSUXMgYXJlIG5vdCBhdHRhY2hlZFxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gUUxBX0VSUk9SOworCQlnb3RvIGV4aXRfaW5pdF9hZGFwdGVyX2ZhaWx1cmU7CisJfQorCisJLyogU2luY2UgaW50ZXJydXB0cyBhcmUgcmVnaXN0ZXJlZCBpbiBzdGFydF9maXJtd2FyZSBmb3IKKwkgKiA4eHh4LCByZWxlYXNlIHRoZW0gaGVyZSBpZiBpbml0aWFsaXplX2FkYXB0ZXIgZmFpbHMKKwkgKiBhbmQgcmV0cnkgYWRhcHRlciBpbml0aWFsaXphdGlvbiAqLworCXFsYTR4eHhfZnJlZV9pcnFzKGhhKTsKKworZXhpdF9pbml0X2FkYXB0ZXJfZmFpbHVyZToKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwppbmRleCBjMjFhZGMzLi40NTliOWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwpAQCAtMTY3MCwxNiArMTY3MCwxMyBAQAogCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNjsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAlpZiAoIXNob3N0KSB7CiAJCXJldCA9IC1FTlhJTzsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2hvc3QgaXMgTlVMTFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogc2hvc3QgaXMgTlVMTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAogCWhhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKLQogCWVwID0gaXNjc2lfY3JlYXRlX2VuZHBvaW50KHNpemVvZihzdHJ1Y3QgcWxhX2VuZHBvaW50KSk7CiAJaWYgKCFlcCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTY5OSw2ICsxNjk2LDkgQEAKIAkJYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZxbGFfZXAtPmRzdF9hZGRyOwogCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6ICVwSTZcbiIsIF9fZnVuY19fLAogCQkJCSAgKGNoYXIgKikmYWRkcjYtPnNpbjZfYWRkcikpOworCX0gZWxzZSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBJbnZhbGlkIGVuZHBvaW50XG4iLAorCQkJICAgX19mdW5jX18pOwogCX0KIAogCXFsYV9lcC0+aG9zdCA9IHNob3N0OwpAQCAtMTcxMiw5ICsxNzEyLDkgQEAKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CiAJaW50IHJldCA9IDA7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CiAJcWxhX2VwID0gZXAtPmRkX2RhdGE7CiAJaGEgPSB0b19xbGFfaG9zdChxbGFfZXAtPmhvc3QpOworCURFQlVHMihwcl9pbmZvX3JhdGVsaW1pdGVkKCIlczogaG9zdDogJWxkXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKIAogCWlmIChhZGFwdGVyX3VwKGhhKSAmJiAhdGVzdF9iaXQoQUZfQlVJTERfRERCX0xJU1QsICZoYS0+ZmxhZ3MpKQogCQlyZXQgPSAxOwpAQCAtMTcyNCw3ICsxNzI0LDEzIEBACiAKIHN0YXRpYyB2b2lkIHFsYTR4eHhfZXBfZGlzY29ubmVjdChzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwKQogewotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlzdHJ1Y3QgcWxhX2VuZHBvaW50ICpxbGFfZXA7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCisJcWxhX2VwID0gZXAtPmRkX2RhdGE7CisJaGEgPSB0b19xbGFfaG9zdChxbGFfZXAtPmhvc3QpOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogaG9zdDogJWxkXG4iLCBfX2Z1bmNfXywKKwkJCSAgaGEtPmhvc3Rfbm8pKTsKIAlpc2NzaV9kZXN0cm95X2VuZHBvaW50KGVwKTsKIH0KIApAQCAtMTczNCw4ICsxNzQwLDExIEBACiB7CiAJc3RydWN0IHFsYV9lbmRwb2ludCAqcWxhX2VwID0gZXAtPmRkX2RhdGE7CiAJc3RydWN0IHNvY2thZGRyICpkc3RfYWRkcjsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisJaGEgPSB0b19xbGFfaG9zdChxbGFfZXAtPmhvc3QpOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogaG9zdDogJWxkXG4iLCBfX2Z1bmNfXywKKwkJCSAgaGEtPmhvc3Rfbm8pKTsKIAogCXN3aXRjaCAocGFyYW0pIHsKIAljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKQEAgLTE3NjYsMTMgKzE3NzUsMTMgQEAKIAlpbnQgcmV0OwogCWRtYV9hZGRyX3QgaXNjc2lfc3RhdHNfZG1hOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwotCiAJY2xzX3Nlc3MgPSBpc2NzaV9jb25uX3RvX3Nlc3Npb24oY2xzX2Nvbm4pOwogCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOwogCWhhID0gZGRiX2VudHJ5LT5oYTsKIAorCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogaG9zdDogJWxkXG4iLCBfX2Z1bmNfXywKKwkJCSAgaGEtPmhvc3Rfbm8pKTsKIAlzdGF0c19zaXplID0gUEFHRV9BTElHTihzaXplb2Yoc3RydWN0IHFsX2lzY3NpX3N0YXRzKSk7CiAJLyogQWxsb2NhdGUgbWVtb3J5ICovCiAJcWxfaXNjc2lfc3RhdHMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHN0YXRzX3NpemUsCkBAIC0yMTAwLDcgKzIxMDksOCBAQAogCQkJCWNwdV90b19sZTE2KElQVjZfVENQT1BUX0RFTEFZRURfQUNLX0RJU0FCTEUpOwogCQllbHNlCiAJCQlpbml0X2Z3X2NiLT5pcHY2X3RjcF9vcHRzICY9Ci0JCQkJY3B1X3RvX2xlMTYofklQVjZfVENQT1BUX0RFTEFZRURfQUNLX0RJU0FCTEUpOworCQkJCWNwdV90b19sZTE2KH5JUFY2X1RDUE9QVF9ERUxBWUVEX0FDS19ESVNBQkxFICYKKwkJCQkJICAgIDB4RkZGRik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1RDUF9OQUdMRV9ESVNBQkxFOgogCQlpZiAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSAmIDB4MSkKQEAgLTIyOTcsNyArMjMwNyw4IEBACiAJCQkJY3B1X3RvX2xlMTYoVENQT1BUX0RFTEFZRURfQUNLX0RJU0FCTEUpOwogCQllbHNlCiAJCQlpbml0X2Z3X2NiLT5pcHY0X3RjcF9vcHRzICY9Ci0JCQkJY3B1X3RvX2xlMTYoflRDUE9QVF9ERUxBWUVEX0FDS19ESVNBQkxFKTsKKwkJCQljcHVfdG9fbGUxNih+VENQT1BUX0RFTEFZRURfQUNLX0RJU0FCTEUgJgorCQkJCQkgICAgMHhGRkZGKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVENQX05BR0xFX0RJU0FCTEU6CiAJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQpAQCAtMzA0NSw3ICszMDU2LDYgQEAKIAlzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyOwogCWludCByZXQ7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CiAJaWYgKCFlcCkgewogCQlwcmludGsoS0VSTl9FUlIgInFsYTR4eHg6IG1pc3NpbmcgZXAuXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0zMDU0LDYgKzMwNjQsOCBAQAogCXFsYV9lcCA9IGVwLT5kZF9kYXRhOwogCWRzdF9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZxbGFfZXAtPmRzdF9hZGRyOwogCWhhID0gdG9fcWxhX2hvc3QocWxhX2VwLT5ob3N0KTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGhvc3Q6ICVsZFxuIiwgX19mdW5jX18sCisJCQkgIGhhLT5ob3N0X25vKSk7CiAKIAlyZXQgPSBxbGE0eHh4X2dldF9kZGJfaW5kZXgoaGEsICZkZGJfaW5kZXgpOwogCWlmIChyZXQgPT0gUUxBX0VSUk9SKQpAQCAtMzA3NCw2ICszMDg2LDcgQEAKIAlkZGJfZW50cnktPnNlc3MgPSBjbHNfc2VzczsKIAlkZGJfZW50cnktPnVuYmxvY2tfc2VzcyA9IHFsYTR4eHhfdW5ibG9ja19kZGI7CiAJZGRiX2VudHJ5LT5kZGJfY2hhbmdlID0gcWxhNHh4eF9kZGJfY2hhbmdlOworCWNsZWFyX2JpdChEREJfQ09OTl9DTE9TRV9GQUlMVVJFLCAmZGRiX2VudHJ5LT5mbGFncyk7CiAJY2xzX3Nlc3MtPnJlY292ZXJ5X3RtbyA9IHFsNHhzZXNzX3JlY292ZXJ5X3RtbzsKIAloYS0+ZndfZGRiX2luZGV4X21hcFtkZGJfZW50cnktPmZ3X2RkYl9pbmRleF0gPSBkZGJfZW50cnk7CiAJaGEtPnRvdF9kZGJzKys7CkBAIC0zMDkyLDEwICszMTA1LDExIEBACiAJdWludDMyX3QgZGRiX3N0YXRlOwogCWludCByZXQ7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CiAJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOwogCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CiAJaGEgPSBkZGJfZW50cnktPmhhOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogaG9zdDogJWxkXG4iLCBfX2Z1bmNfXywKKwkJCSAgaGEtPmhvc3Rfbm8pKTsKIAogCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAogCQkJCQkgICZmd19kZGJfZW50cnlfZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTMxMjMsNyArMzEzNyw4IEBACiAKIGRlc3Ryb3lfc2Vzc2lvbjoKIAlxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOwotCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEREJfQ09OTl9DTE9TRV9GQUlMVVJFLCAmZGRiX2VudHJ5LT5mbGFncykpCisJCWNsZWFyX2JpdChkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwgaGEtPmRkYl9pZHhfbWFwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlxbGE0eHh4X2ZyZWVfZGRiKGhhLCBkZGJfZW50cnkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC0zMTQxLDE3ICszMTU2LDIzIEBACiAJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKIAlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOwogCWNsc19jb25uID0gaXNjc2lfY29ubl9zZXR1cChjbHNfc2Vzcywgc2l6ZW9mKHN0cnVjdCBxbGFfY29ubiksCiAJCQkJICAgIGNvbm5faWR4KTsKLQlpZiAoIWNsc19jb25uKQorCWlmICghY2xzX2Nvbm4pIHsKKwkJcHJfaW5mbygiJXM6IENhbiBub3QgY3JlYXRlIGNvbm5lY3Rpb24gZm9yIGNvbm5faWR4ID0gJXVcbiIsCisJCQlfX2Z1bmNfXywgY29ubl9pZHgpOwogCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnktPmNvbm4gPSBjbHNfY29ubjsKIAorCWhhID0gZGRiX2VudHJ5LT5oYTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGNvbm5faWR4ID0gJXVcbiIsIF9fZnVuY19fLAorCQkJICBjb25uX2lkeCkpOwogCXJldHVybiBjbHNfY29ubjsKIH0KIApAQCAtMzE2Miw4ICszMTgzLDE2IEBACiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CiAJc3RydWN0IHFsYV9jb25uICpxbGFfY29ubjsKIAlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisJc2VzcyA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJaGEgPSBkZGJfZW50cnktPmhhOworCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBzaWQgPSAlZCwgY2lkID0gJWRcbiIsIF9fZnVuY19fLAorCQkJICBjbHNfc2Vzc2lvbi0+c2lkLCBjbHNfY29ubi0+Y2lkKSk7CiAKIAlpZiAoaXNjc2lfY29ubl9iaW5kKGNsc19zZXNzaW9uLCBjbHNfY29ubiwgaXNfbGVhZGluZykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzE4NiwxMCArMzIxNSwxMSBAQAogCWludCByZXQgPSAwOwogCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKIAotCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKIAloYSA9IGRkYl9lbnRyeS0+aGE7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBzaWQgPSAlZCwgY2lkID0gJWRcbiIsIF9fZnVuY19fLAorCQkJICBjbHNfc2Vzcy0+c2lkLCBjbHNfY29ubi0+Y2lkKSk7CiAKIAkvKiBDaGVjayBpZiB3ZSBoYXZlICBtYXRjaGluZyBGVyBEREIsIGlmIHllcyB0aGVuIGRvIG5vdAogCSAqIGxvZ2luIHRvIHRoaXMgdGFyZ2V0LiBUaGlzIGNvdWxkIGNhdXNlIHRhcmdldCB0byBsb2dvdXQgcHJldmlvdXMKQEAgLTMyNjMsMTAgKzMyOTMsMTEgQEAKIAlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CiAJaW50IG9wdGlvbnM7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CiAJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOwogCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CiAJaGEgPSBkZGJfZW50cnktPmhhOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogY2lkID0gJWRcbiIsIF9fZnVuY19fLAorCQkJICBjbHNfY29ubi0+Y2lkKSk7CiAKIAlvcHRpb25zID0gTE9HT1VUX09QVElPTl9DTE9TRV9TRVNTSU9OOwogCWlmIChxbGE0eHh4X3Nlc3Npb25fbG9nb3V0X2RkYihoYSwgZGRiX2VudHJ5LCBvcHRpb25zKSA9PSBRTEFfRVJST1IpCkBAIC00MzcyLDYgKzQ0MDMsMTEgQEAKIAl1aW50MzJfdCBkZXZfc3RhdGU7CiAJdWludDMyX3QgaWRjX2N0cmw7CiAKKwlpZiAoaXNfcWxhODAzMihoYSkgJiYKKwkgICAgKHFsYTRfODN4eF9pc19kZXRhY2hlZChoYSkgPT0gUUxBX1NVQ0NFU1MpKQorCQlXQVJOX09OQ0UoMSwgIiVzOiBpU0NTSSBmdW5jdGlvbiAlZCBtYXJrZWQgaW52aXNpYmxlXG4iLAorCQkJICBfX2Z1bmNfXywgaGEtPmZ1bmNfbnVtKTsKKwogCS8qIGRvbid0IHBvbGwgaWYgcmVzZXQgaXMgZ29pbmcgb24gKi8KIAlpZiAoISh0ZXN0X2JpdChEUENfUkVTRVRfQUNUSVZFLCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykgfHwKQEAgLTQ1NTQsMTEgKzQ1OTAsMTkgQEAKIAl1aW50MzJfdCBpbmRleCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJdW5zaWduZWQgbG9uZyB3dGltZTsKKwl1aW50MzJfdCB3dG1vOwogCi0JdW5zaWduZWQgbG9uZyB3dGltZSA9IGppZmZpZXMgKyAoV0FJVF9DTURfVE9WICogSFopOworCWlmIChpc19xbGE0MFhYKGhhKSkKKwkJd3RtbyA9IFdBSVRfQ01EX1RPVjsKKwllbHNlCisJCXd0bW8gPSBoYS0+bnhfcmVzZXRfdGltZW91dCAvIDI7CiAKLQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiV2FpdCB1cCB0byAlZCBzZWNvbmRzIGZvciBjbWRzIHRvICIKLQkgICAgImNvbXBsZXRlXG4iLCBXQUlUX0NNRF9UT1YpKTsKKwl3dGltZSA9IGppZmZpZXMgKyAod3RtbyAqIEhaKTsKKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICJXYWl0IHVwIHRvICV1IHNlY29uZHMgZm9yIGNtZHMgdG8gY29tcGxldGVcbiIsCisJCQkgIHd0bW8pKTsKIAogCXdoaWxlICghdGltZV9hZnRlcl9lcShqaWZmaWVzLCB3dGltZSkpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC00ODYxLDExICs0OTA1LDExIEBACiAJCQlxbGE0eHh4X2NtZF93YWl0KGhhKTsKIAogCQlxbGE0eHh4X3Byb2Nlc3NfYWVuKGhhLCBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TKTsKLQkJcWxhNHh4eF9hYm9ydF9hY3RpdmVfY21kcyhoYSwgRElEX1JFU0VUIDw8IDE2KTsKIAkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJICAgICJzY3NpJWxkOiAlcyAtIFBlcmZvcm1pbmcgY2hpcCByZXNldC4uXG4iLAogCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CiAJCXN0YXR1cyA9IGhhLT5pc3Bfb3BzLT5yZXNldF9jaGlwKGhhKTsKKwkJcWxhNHh4eF9hYm9ydF9hY3RpdmVfY21kcyhoYSwgRElEX1JFU0VUIDw8IDE2KTsKIAl9CiAKIAkvKiBGbHVzaCBhbnkgcGVuZGluZyBkZGIgY2hhbmdlZCBBRU5zICovCkBAIC00ODgxLDggKzQ5MjUsMjEgQEAKIAkJCXNzbGVlcCg2KTsKIAogCQkvKiBOT1RFOiBBRl9PTkxJTkUgZmxhZyBzZXQgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YKLQkJICogICAgICAgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIgKi8KKwkJICogcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIgKi8KIAkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFJFU0VUX0FEQVBURVIpOworCQlpZiAoaXNfcWxhODBYWChoYSkgJiYgKHN0YXR1cyA9PSBRTEFfRVJST1IpKSB7CisJCQlzdGF0dXMgPSBxbGE0Xzh4eHhfY2hlY2tfaW5pdF9hZGFwdGVyX3JldHJ5KGhhKTsKKwkJCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSB7CisJCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IERvbid0IHJldHJ5IHJlY292ZXIgYWRhcHRlclxuIiwKKwkJCQkJICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKKwkJCQlxbGE0eHh4X2RlYWRfYWRhcHRlcl9jbGVhbnVwKGhhKTsKKwkJCQljbGVhcl9iaXQoRFBDX1JFVFJZX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJCQkJY2xlYXJfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCWNsZWFyX2JpdChEUENfUkVTRVRfSEFfRldfQ09OVEVYVCwKKwkJCQkJICAmaGEtPmRwY19mbGFncyk7CisJCQkJZ290byBleGl0X3JlY292ZXI7CisJCQl9CisJCX0KIAl9CiAKIAkvKiBSZXRyeSBmYWlsZWQgYWRhcHRlciBpbml0aWFsaXphdGlvbiwgaWYgbmVjZXNzYXJ5CkBAIC01MjI4LDkgKzUyODUsOSBAQAogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjc2lfcWxhX2hvc3QsIGRwY193b3JrKTsKIAlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwogCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IERQQyBoYW5kbGVyIHdha2luZyB1cC4iCi0JICAgICJmbGFncyA9IDB4JTA4bHgsIGRwY19mbGFncyA9IDB4JTA4bHhcbiIsCi0JICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgaGEtPmZsYWdzLCBoYS0+ZHBjX2ZsYWdzKSkKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAic2NzaSVsZDogJXM6IERQQyBoYW5kbGVyIHdha2luZyB1cC4gZmxhZ3MgPSAweCUwOGx4LCBkcGNfZmxhZ3MgPSAweCUwOGx4XG4iLAorCQkJICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5mbGFncywgaGEtPmRwY19mbGFncykpOwogCiAJLyogSW5pdGlhbGl6YXRpb24gbm90IHlldCBmaW5pc2hlZC4gRG9uJ3QgZG8gYW55dGhpbmcgeWV0LiAqLwogCWlmICghdGVzdF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKSkKQEAgLTg2ODEsMTEgKzg3MzgsOCBAQAogCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBJTklUX0FEQVBURVIpOwogCiAJLyogRG9udCByZXRyeSBhZGFwdGVyIGluaXRpYWxpemF0aW9uIGlmIElSUSBhbGxvY2F0aW9uIGZhaWxlZCAqLwotCWlmIChpc19xbGE4MFhYKGhhKSAmJiAhdGVzdF9iaXQoQUZfSVJRX0FUVEFDSEVELCAmaGEtPmZsYWdzKSkgewotCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogU2tpcHBpbmcgcmV0cnkgb2YgYWRhcHRlciBpbml0aWFsaXphdGlvblxuIiwKLQkJCSAgIF9fZnVuY19fKTsKKwlpZiAoaXNfcWxhODBYWChoYSkgJiYgKHN0YXR1cyA9PSBRTEFfRVJST1IpKQogCQlnb3RvIHNraXBfcmV0cnlfaW5pdDsKLQl9CiAKIAl3aGlsZSAoKCF0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSAmJgogCSAgICBpbml0X3JldHJ5X2NvdW50KysgPCBNQVhfSU5JVF9SRVRSSUVTKSB7CkBAIC04NzA5LDYgKzg3NjMsMTAgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBJTklUX0FEQVBURVIpOworCQlpZiAoaXNfcWxhODBYWChoYSkgJiYgKHN0YXR1cyA9PSBRTEFfRVJST1IpKSB7CisJCQlpZiAocWxhNF84eHh4X2NoZWNrX2luaXRfYWRhcHRlcl9yZXRyeShoYSkgPT0gUUxBX0VSUk9SKQorCQkJCWdvdG8gc2tpcF9yZXRyeV9pbml0OworCQl9CiAJfQogCiBza2lwX3JldHJ5X2luaXQ6CkBAIC04ODU3LDEwICs4OTE1LDU2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBxbGE0eHh4X2Rlc3Ryb3lfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQoreworCXN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeSA9IE5VTEw7CisJZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hOworCXVuc2lnbmVkIGxvbmcgd3RpbWU7CisJdWludDMyX3QgZGRiX3N0YXRlOworCWludCBvcHRpb25zOworCWludCBzdGF0dXM7CisKKwlvcHRpb25zID0gTE9HT1VUX09QVElPTl9DTE9TRV9TRVNTSU9OOworCWlmIChxbGE0eHh4X3Nlc3Npb25fbG9nb3V0X2RkYihoYSwgZGRiX2VudHJ5LCBvcHRpb25zKSA9PSBRTEFfRVJST1IpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogTG9nb3V0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGNsZWFyX2RkYjsKKwl9CisKKwlmd19kZGJfZW50cnkgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19kZGJfZW50cnkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkgICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gY2xlYXJfZGRiOworCX0KKworCXd0aW1lID0gamlmZmllcyArIChIWiAqIExPR09VVF9UT1YpOworCWRvIHsKKwkJc3RhdHVzID0gcWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAorCQkJCQkJIGZ3X2RkYl9lbnRyeSwgZndfZGRiX2VudHJ5X2RtYSwKKwkJCQkJCSBOVUxMLCBOVUxMLCAmZGRiX3N0YXRlLCBOVUxMLAorCQkJCQkJIE5VTEwsIE5VTEwpOworCQlpZiAoc3RhdHVzID09IFFMQV9FUlJPUikKKwkJCWdvdG8gZnJlZV9kZGI7CisKKwkJaWYgKChkZGJfc3RhdGUgPT0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFKSB8fAorCQkgICAgKGRkYl9zdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9GQUlMRUQpKQorCQkJZ290byBmcmVlX2RkYjsKKworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7CisJfSB3aGlsZSAoKHRpbWVfYWZ0ZXIod3RpbWUsIGppZmZpZXMpKSk7CisKK2ZyZWVfZGRiOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJCQkgIGZ3X2RkYl9lbnRyeSwgZndfZGRiX2VudHJ5X2RtYSk7CitjbGVhcl9kZGI6CisJcWxhNHh4eF9jbGVhcl9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKK30KKwogc3RhdGljIHZvaWQgcWxhNHh4eF9kZXN0cm95X2Z3X2RkYl9zZXNzaW9uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7Ci0JaW50IG9wdGlvbnM7CiAJaW50IGlkeDsKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0REQl9FTlRSSUVTOyBpZHgrKykgewpAQCAtODg2OSwxMyArODk3Myw3IEBACiAJCWlmICgoZGRiX2VudHJ5ICE9IE5VTEwpICYmCiAJCSAgICAoZGRiX2VudHJ5LT5kZGJfdHlwZSA9PSBGTEFTSF9EREIpKSB7CiAKLQkJCW9wdGlvbnMgPSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT047Ci0JCQlpZiAocWxhNHh4eF9zZXNzaW9uX2xvZ291dF9kZGIoaGEsIGRkYl9lbnRyeSwgb3B0aW9ucykKLQkJCSAgICA9PSBRTEFfRVJST1IpCi0JCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogTG9nb3V0IGZhaWxlZFxuIiwKLQkJCQkJICAgX19mdW5jX18pOwotCi0JCQlxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCQkJcWxhNHh4eF9kZXN0cm95X2RkYihoYSwgZGRiX2VudHJ5KTsKIAkJCS8qCiAJCQkgKiB3ZSBoYXZlIGRlY3JlbWVudGVkIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRyaXZlcgogCQkJICogd2hlbiB3ZSBzZXR1cCB0aGUgc2Vzc2lvbiB0byBoYXZlIHRoZSBkcml2ZXIgdW5sb2FkCkBAIC05MTM2LDE0ICs5MjM0LDE1IEBACiAJaW50IHJldCA9IFNVQ0NFU1M7CiAJaW50IHdhaXQgPSAwOwogCi0JcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAic2NzaSVsZDolZDolZDogQWJvcnQgY29tbWFuZCBpc3N1ZWQgY21kPSVwXG4iLAotCSAgICBoYS0+aG9zdF9ubywgaWQsIGx1biwgY21kKTsKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiVkOiVkOiBBYm9ydCBjb21tYW5kIGlzc3VlZCBjbWQ9JXAsIGNkYj0weCV4XG4iLAorCQkgICBoYS0+aG9zdF9ubywgaWQsIGx1biwgY21kLCBjbWQtPmNtbmRbMF0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJc3JiID0gKHN0cnVjdCBzcmIgKikgQ01EX1NQKGNtZCk7CiAJaWYgKCFzcmIpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDolZDolZDogU3BlY2lmaWVkIGNvbW1hbmQgaGFzIGFscmVhZHkgY29tcGxldGVkLlxuIiwKKwkJCSAgIGhhLT5ob3N0X25vLCBpZCwgbHVuKTsKIAkJcmV0dXJuIFNVQ0NFU1M7CiAJfQogCWtyZWZfZ2V0KCZzcmItPnNyYl9yZWYpOwpAQCAtOTU2MCwyOCArOTY1OSwzNiBAQAogCX0KIAogCWZuID0gUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKLQl3aGlsZSAoZm4gPiAwKSB7Ci0JCWZuLS07Ci0JCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBGaW5kaW5nIFBDSSBkZXZpY2UgYXQgIgotCQkgICAgImZ1bmMgJXhcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZm4pOwotCQkvKiBHZXQgdGhlIHBjaSBkZXZpY2UgZ2l2ZW4gdGhlIGRvbWFpbiwgYnVzLAotCQkgKiBzbG90L2Z1bmN0aW9uIG51bWJlciAqLwotCQlvdGhlcl9wZGV2ID0KLQkJICAgIHBjaV9nZXRfZG9tYWluX2J1c19hbmRfc2xvdChwY2lfZG9tYWluX25yKGhhLT5wZGV2LT5idXMpLAotCQkgICAgaGEtPnBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfREVWRk4oUENJX1NMT1QoaGEtPnBkZXYtPmRldmZuKSwKLQkJICAgIGZuKSk7CisJaWYgKGlzX3FsYTgwMjIoaGEpKSB7CisJCXdoaWxlIChmbiA+IDApIHsKKwkJCWZuLS07CisJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogRmluZGluZyBQQ0kgZGV2aWNlIGF0IGZ1bmMgJXhcbiIsCisJCQkJICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBmbik7CisJCQkvKiBHZXQgdGhlIHBjaSBkZXZpY2UgZ2l2ZW4gdGhlIGRvbWFpbiwgYnVzLAorCQkJICogc2xvdC9mdW5jdGlvbiBudW1iZXIgKi8KKwkJCW90aGVyX3BkZXYgPSBwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QoCisJCQkJCSAgIHBjaV9kb21haW5fbnIoaGEtPnBkZXYtPmJ1cyksCisJCQkJCSAgIGhhLT5wZGV2LT5idXMtPm51bWJlciwKKwkJCQkJICAgUENJX0RFVkZOKFBDSV9TTE9UKGhhLT5wZGV2LT5kZXZmbiksCisJCQkJCSAgIGZuKSk7CiAKLQkJaWYgKCFvdGhlcl9wZGV2KQotCQkJY29udGludWU7CisJCQlpZiAoIW90aGVyX3BkZXYpCisJCQkJY29udGludWU7CiAKLQkJaWYgKGF0b21pY19yZWFkKCZvdGhlcl9wZGV2LT5lbmFibGVfY250KSkgewotCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IEZvdW5kIFBDSSAiCi0JCQkgICAgImZ1bmMgaW4gZW5hYmxlZCBzdGF0ZSV4XG4iLCBoYS0+aG9zdF9ubywKLQkJCSAgICBfX2Z1bmNfXywgZm4pOworCQkJaWYgKGF0b21pY19yZWFkKCZvdGhlcl9wZGV2LT5lbmFibGVfY250KSkgeworCQkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBGb3VuZCBQQ0kgZnVuYyBpbiBlbmFibGVkIHN0YXRlJXhcbiIsCisJCQkJCSAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZm4pOworCQkJCXBjaV9kZXZfcHV0KG90aGVyX3BkZXYpOworCQkJCWJyZWFrOworCQkJfQogCQkJcGNpX2Rldl9wdXQob3RoZXJfcGRldik7Ci0JCQlicmVhazsKIAkJfQotCQlwY2lfZGV2X3B1dChvdGhlcl9wZGV2KTsKKwl9IGVsc2UgeworCQkvKiB0aGlzIGNhc2UgaXMgbWVhbnQgZm9yIElTUDgzeHgvSVNQODR4eCBvbmx5ICovCisJCWlmIChxbGE0XzgzeHhfY2FuX3BlcmZvcm1fcmVzZXQoaGEpKSB7CisJCQkvKiByZXNldCBmbiBhcyBpU0NTSSBpcyBnb2luZyB0byBwZXJmb3JtIHRoZSByZXNldCAqLworCQkJZm4gPSAwOworCQl9CiAJfQogCiAJLyogVGhlIGZpcnN0IGZ1bmN0aW9uIG9uIHRoZSBjYXJkLCB0aGUgcmVzZXQgb3duZXIgd2lsbApAQCAtOTYxNSw2ICs5NzIyLDcgQEAKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBIVyBTdGF0ZTogIgogCQkJICAgICJGQUlMRURcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CisJCQlxbGE0eHh4X2ZyZWVfaXJxcyhoYSk7CiAJCQloYS0+aXNwX29wcy0+aWRjX2xvY2soaGEpOwogCQkJcWxhNF84eHh4X2NsZWFyX2Rydl9hY3RpdmUoaGEpOwogCQkJcWxhNF84eHh4X3dyX2RpcmVjdChoYSwgUUxBOFhYWF9DUkJfREVWX1NUQVRFLApAQCAtOTY0Miw2ICs5NzUwLDggQEAKIAkJCXJ2YWwgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgUkVTRVRfQURBUFRFUik7CiAJCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykKIAkJCQloYS0+aXNwX29wcy0+ZW5hYmxlX2ludHJzKGhhKTsKKwkJCWVsc2UKKwkJCQlxbGE0eHh4X2ZyZWVfaXJxcyhoYSk7CiAKIAkJCWhhLT5pc3Bfb3BzLT5pZGNfbG9jayhoYSk7CiAJCQlxbGE0Xzh4eHhfc2V0X2Rydl9hY3RpdmUoaGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKaW5kZXggOWIyOTQ2Ni4uYzZiYTBhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCkBAIC01LDQgKzUsNCBAQAogICogU2VlIExJQ0VOU0UucWxhNHh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwogCi0jZGVmaW5lIFFMQTRYWFhfRFJJVkVSX1ZFUlNJT04JIjUuMDQuMDAtazMiCisjZGVmaW5lIFFMQTRYWFhfRFJJVkVSX1ZFUlNJT04JIjUuMDQuMDAtazQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2kuYwppbmRleCBkOGFmZWM4Li5jNGQ2MzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKQEAgLTE2MSw0NyArMTYxLDIwIEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGhvc3RfY21kX3Bvb2xfbXV0ZXgpOwogCiAvKioKLSAqIHNjc2lfcG9vbF9hbGxvY19jb21tYW5kIC0gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IGEgZnVsbHkgYWxsb2NhdGVkIGNvbW1hbmQKLSAqIEBwb29sOglzbGFiIHBvb2wgdG8gYWxsb2NhdGUgdGhlIGNvbW1hbmQgZnJvbQotICogQGdmcF9tYXNrOgltYXNrIGZvciB0aGUgYWxsb2NhdGlvbgotICoKLSAqIFJldHVybnMgYSBmdWxseSBhbGxvY2F0ZWQgY29tbWFuZCAod2l0aCB0aGUgYWxsaWVkIHNlbnNlIGJ1ZmZlcikgb3IKLSAqIE5VTEwgb24gZmFpbHVyZQotICovCi1zdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqCi1zY3NpX3Bvb2xfYWxsb2NfY29tbWFuZChzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sLCBnZnBfdCBnZnBfbWFzaykKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7Ci0KLQljbWQgPSBrbWVtX2NhY2hlX3phbGxvYyhwb29sLT5jbWRfc2xhYiwgZ2ZwX21hc2sgfCBwb29sLT5nZnBfbWFzayk7Ci0JaWYgKCFjbWQpCi0JCXJldHVybiBOVUxMOwotCi0JY21kLT5zZW5zZV9idWZmZXIgPSBrbWVtX2NhY2hlX2FsbG9jKHBvb2wtPnNlbnNlX3NsYWIsCi0JCQkJCSAgICAgZ2ZwX21hc2sgfCBwb29sLT5nZnBfbWFzayk7Ci0JaWYgKCFjbWQtPnNlbnNlX2J1ZmZlcikgewotCQlrbWVtX2NhY2hlX2ZyZWUocG9vbC0+Y21kX3NsYWIsIGNtZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBjbWQ7Ci19Ci0KLS8qKgotICogc2NzaV9wb29sX2ZyZWVfY29tbWFuZCAtIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlbGVhc2UgYSBjb21tYW5kCi0gKiBAcG9vbDoJc2xhYiBwb29sIHRvIGFsbG9jYXRlIHRoZSBjb21tYW5kIGZyb20KKyAqIHNjc2lfaG9zdF9mcmVlX2NvbW1hbmQgLSBpbnRlcm5hbCBmdW5jdGlvbiB0byByZWxlYXNlIGEgY29tbWFuZAorICogQHNob3N0Oglob3N0IHRvIGZyZWUgdGhlIGNvbW1hbmQgZm9yCiAgKiBAY21kOgljb21tYW5kIHRvIHJlbGVhc2UKICAqCiAgKiB0aGUgY29tbWFuZCBtdXN0IHByZXZpb3VzbHkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBieQotICogc2NzaV9wb29sX2FsbG9jX2NvbW1hbmQuCisgKiBzY3NpX2hvc3RfYWxsb2NfY29tbWFuZC4KICAqLwogc3RhdGljIHZvaWQKLXNjc2lfcG9vbF9mcmVlX2NvbW1hbmQoc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbCwKLQkJCSBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCitzY3NpX2hvc3RfZnJlZV9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CisJc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbCA9IHNob3N0LT5jbWRfcG9vbDsKKwogCWlmIChjbWQtPnByb3Rfc2RiKQogCQlrbWVtX2NhY2hlX2ZyZWUoc2NzaV9zZGJfY2FjaGUsIGNtZC0+cHJvdF9zZGIpOwotCiAJa21lbV9jYWNoZV9mcmVlKHBvb2wtPnNlbnNlX3NsYWIsIGNtZC0+c2Vuc2VfYnVmZmVyKTsKIAlrbWVtX2NhY2hlX2ZyZWUocG9vbC0+Y21kX3NsYWIsIGNtZCk7CiB9CkBAIC0yMTcsMjIgKzE5MCwzMiBAQAogc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKgogc2NzaV9ob3N0X2FsbG9jX2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGdmcF90IGdmcF9tYXNrKQogeworCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2wgPSBzaG9zdC0+Y21kX3Bvb2w7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCi0JY21kID0gc2NzaV9wb29sX2FsbG9jX2NvbW1hbmQoc2hvc3QtPmNtZF9wb29sLCBnZnBfbWFzayk7CisJY21kID0ga21lbV9jYWNoZV96YWxsb2MocG9vbC0+Y21kX3NsYWIsIGdmcF9tYXNrIHwgcG9vbC0+Z2ZwX21hc2spOwogCWlmICghY21kKQotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBmYWlsOworCisJY21kLT5zZW5zZV9idWZmZXIgPSBrbWVtX2NhY2hlX2FsbG9jKHBvb2wtPnNlbnNlX3NsYWIsCisJCQkJCSAgICAgZ2ZwX21hc2sgfCBwb29sLT5nZnBfbWFzayk7CisJaWYgKCFjbWQtPnNlbnNlX2J1ZmZlcikKKwkJZ290byBmYWlsX2ZyZWVfY21kOwogCiAJaWYgKHNjc2lfaG9zdF9nZXRfcHJvdChzaG9zdCkgPj0gU0hPU1RfRElYX1RZUEUwX1BST1RFQ1RJT04pIHsKIAkJY21kLT5wcm90X3NkYiA9IGttZW1fY2FjaGVfemFsbG9jKHNjc2lfc2RiX2NhY2hlLCBnZnBfbWFzayk7Ci0KLQkJaWYgKCFjbWQtPnByb3Rfc2RiKSB7Ci0JCQlzY3NpX3Bvb2xfZnJlZV9jb21tYW5kKHNob3N0LT5jbWRfcG9vbCwgY21kKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisJCWlmICghY21kLT5wcm90X3NkYikKKwkJCWdvdG8gZmFpbF9mcmVlX3NlbnNlOwogCX0KIAogCXJldHVybiBjbWQ7CisKK2ZhaWxfZnJlZV9zZW5zZToKKwlrbWVtX2NhY2hlX2ZyZWUocG9vbC0+c2Vuc2Vfc2xhYiwgY21kLT5zZW5zZV9idWZmZXIpOworZmFpbF9mcmVlX2NtZDoKKwlrbWVtX2NhY2hlX2ZyZWUocG9vbC0+Y21kX3NsYWIsIGNtZCk7CitmYWlsOgorCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTI4NCwyNyArMjY3LDE5IEBACiAgKi8KIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfZ2V0X2NvbW1hbmQoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGdmcF90IGdmcF9tYXNrKQogewotCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBfX3Njc2lfZ2V0X2NvbW1hbmQoZGV2LT5ob3N0LCBnZnBfbWFzayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIEJhaWwgaWYgd2UgY2FuJ3QgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgKi8KLQlpZiAoIWdldF9kZXZpY2UoJmRldi0+c2Rldl9nZW5kZXYpKQorCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpCiAJCXJldHVybiBOVUxMOwogCi0JY21kID0gX19zY3NpX2dldF9jb21tYW5kKGRldi0+aG9zdCwgZ2ZwX21hc2spOwotCi0JaWYgKGxpa2VseShjbWQgIT0gTlVMTCkpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQljbWQtPmRldmljZSA9IGRldjsKLQkJSU5JVF9MSVNUX0hFQUQoJmNtZC0+bGlzdCk7Ci0JCUlOSVRfREVMQVlFRF9XT1JLKCZjbWQtPmFib3J0X3dvcmssIHNjbWRfZWhfYWJvcnRfaGFuZGxlcik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZjbWQtPmxpc3QsICZkZXYtPmNtZF9saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKLQkJY21kLT5qaWZmaWVzX2F0X2FsbG9jID0gamlmZmllczsKLQl9IGVsc2UKLQkJcHV0X2RldmljZSgmZGV2LT5zZGV2X2dlbmRldik7Ci0KKwljbWQtPmRldmljZSA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmY21kLT5saXN0KTsKKwlJTklUX0RFTEFZRURfV09SSygmY21kLT5hYm9ydF93b3JrLCBzY21kX2VoX2Fib3J0X2hhbmRsZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmNtZC0+bGlzdCwgJmRldi0+Y21kX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bGlzdF9sb2NrLCBmbGFncyk7CisJY21kLT5qaWZmaWVzX2F0X2FsbG9jID0gamlmZmllczsKIAlyZXR1cm4gY21kOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX2dldF9jb21tYW5kKTsKQEAgLTMxMywyNSArMjg4LDIyIEBACiAgKiBfX3Njc2lfcHV0X2NvbW1hbmQgLSBGcmVlIGEgc3RydWN0IHNjc2lfY21uZAogICogQHNob3N0OiBkZXYtPmhvc3QKICAqIEBjbWQ6IENvbW1hbmQgdG8gZnJlZQotICogQGRldjogcGFyZW50IHNjc2kgZGV2aWNlCiAgKi8KLXZvaWQgX19zY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCit2b2lkIF9fc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBjaGFuZ2luZyBsb2NrcyBoZXJlLCBkb24ndCBuZWVkIHRvIHJlc3RvcmUgdGhlIGlycSBzdGF0ZSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZzaG9zdC0+ZnJlZV9saXN0X2xvY2ssIGZsYWdzKTsKIAlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmc2hvc3QtPmZyZWVfbGlzdCkpKSB7Ci0JCWxpc3RfYWRkKCZjbWQtPmxpc3QsICZzaG9zdC0+ZnJlZV9saXN0KTsKLQkJY21kID0gTlVMTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eSgmc2hvc3QtPmZyZWVfbGlzdCkpIHsKKwkJCWxpc3RfYWRkKCZjbWQtPmxpc3QsICZzaG9zdC0+ZnJlZV9saXN0KTsKKwkJCWNtZCA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hvc3QtPmZyZWVfbGlzdF9sb2NrLCBmbGFncyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGxpa2VseShjbWQgIT0gTlVMTCkpCi0JCXNjc2lfcG9vbF9mcmVlX2NvbW1hbmQoc2hvc3QtPmNtZF9wb29sLCBjbWQpOwotCi0JcHV0X2RldmljZShkZXYpOworCQlzY3NpX2hvc3RfZnJlZV9jb21tYW5kKHNob3N0LCBjbWQpOwogfQogRVhQT1JUX1NZTUJPTChfX3Njc2lfcHV0X2NvbW1hbmQpOwogCkBAIC0zNDUsNyArMzE3LDYgQEAKICAqLwogdm9pZCBzY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogc2VyaW91cyBlcnJvciBpZiB0aGUgY29tbWFuZCBoYXNuJ3QgY29tZSBmcm9tIGEgZGV2aWNlIGxpc3QgKi8KQEAgLTM1Niw1MCArMzI3LDEwNyBAQAogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmY21kLT5hYm9ydF93b3JrKTsKIAotCV9fc2NzaV9wdXRfY29tbWFuZChjbWQtPmRldmljZS0+aG9zdCwgY21kLCAmc2Rldi0+c2Rldl9nZW5kZXYpOworCV9fc2NzaV9wdXRfY29tbWFuZChjbWQtPmRldmljZS0+aG9zdCwgY21kKTsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV9wdXRfY29tbWFuZCk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpzY3NpX2dldF9ob3N0X2NtZF9wb29sKGdmcF90IGdmcF9tYXNrKQorc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKgorc2NzaV9maW5kX2hvc3RfY21kX3Bvb2woc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CisJaWYgKHNob3N0LT5ob3N0dC0+Y21kX3NpemUpCisJCXJldHVybiBzaG9zdC0+aG9zdHQtPmNtZF9wb29sOworCWlmIChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEpCisJCXJldHVybiAmc2NzaV9jbWRfZG1hX3Bvb2w7CisJcmV0dXJuICZzY3NpX2NtZF9wb29sOworfQorCitzdGF0aWMgdm9pZAorc2NzaV9mcmVlX2hvc3RfY21kX3Bvb2woc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCAqcG9vbCkKK3sKKwlrZnJlZShwb29sLT5zZW5zZV9uYW1lKTsKKwlrZnJlZShwb29sLT5jbWRfbmFtZSk7CisJa2ZyZWUocG9vbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICoKK3Njc2lfYWxsb2NfaG9zdF9jbWRfcG9vbChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpob3N0dCA9IHNob3N0LT5ob3N0dDsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sOworCisJcG9vbCA9IGt6YWxsb2Moc2l6ZW9mKCpwb29sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb29sKQorCQlyZXR1cm4gTlVMTDsKKworCXBvb2wtPmNtZF9uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc19jbWQiLCBob3N0dC0+bmFtZSk7CisJcG9vbC0+c2Vuc2VfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfc2Vuc2UiLCBob3N0dC0+bmFtZSk7CisJaWYgKCFwb29sLT5jbWRfbmFtZSB8fCAhcG9vbC0+c2Vuc2VfbmFtZSkgeworCQlzY3NpX2ZyZWVfaG9zdF9jbWRfcG9vbChwb29sKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcG9vbC0+c2xhYl9mbGFncyA9IFNMQUJfSFdDQUNIRV9BTElHTjsKKwlpZiAoc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKSB7CisJCXBvb2wtPnNsYWJfZmxhZ3MgfD0gU0xBQl9DQUNIRV9ETUE7CisJCXBvb2wtPmdmcF9tYXNrID0gX19HRlBfRE1BOworCX0KKwlyZXR1cm4gcG9vbDsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKgorc2NzaV9nZXRfaG9zdF9jbWRfcG9vbChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpob3N0dCA9IHNob3N0LT5ob3N0dDsKIAlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpyZXR2YWwgPSBOVUxMLCAqcG9vbDsKKwlzaXplX3QgY21kX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjc2lfY21uZCkgKyBob3N0dC0+Y21kX3NpemU7CisKIAkvKgogCSAqIFNlbGVjdCBhIGNvbW1hbmQgc2xhYiBmb3IgdGhpcyBob3N0IGFuZCBjcmVhdGUgaXQgaWYgbm90CiAJICogeWV0IGV4aXN0ZW50LgogCSAqLwogCW11dGV4X2xvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwotCXBvb2wgPSAoZ2ZwX21hc2sgJiBfX0dGUF9ETUEpID8gJnNjc2lfY21kX2RtYV9wb29sIDoKLQkJJnNjc2lfY21kX3Bvb2w7CisJcG9vbCA9IHNjc2lfZmluZF9ob3N0X2NtZF9wb29sKHNob3N0KTsKKwlpZiAoIXBvb2wpIHsKKwkJcG9vbCA9IHNjc2lfYWxsb2NfaG9zdF9jbWRfcG9vbChzaG9zdCk7CisJCWlmICghcG9vbCkKKwkJCWdvdG8gb3V0OworCX0KKwogCWlmICghcG9vbC0+dXNlcnMpIHsKLQkJcG9vbC0+Y21kX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShwb29sLT5jbWRfbmFtZSwKLQkJCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSwgMCwKKwkJcG9vbC0+Y21kX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShwb29sLT5jbWRfbmFtZSwgY21kX3NpemUsIDAsCiAJCQkJCQkgICBwb29sLT5zbGFiX2ZsYWdzLCBOVUxMKTsKIAkJaWYgKCFwb29sLT5jbWRfc2xhYikKLQkJCWdvdG8gZmFpbDsKKwkJCWdvdG8gb3V0X2ZyZWVfcG9vbDsKIAogCQlwb29sLT5zZW5zZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUocG9vbC0+c2Vuc2VfbmFtZSwKIAkJCQkJCSAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLCAwLAogCQkJCQkJICAgICBwb29sLT5zbGFiX2ZsYWdzLCBOVUxMKTsKLQkJaWYgKCFwb29sLT5zZW5zZV9zbGFiKSB7Ci0JCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocG9vbC0+Y21kX3NsYWIpOwotCQkJZ290byBmYWlsOwotCQl9CisJCWlmICghcG9vbC0+c2Vuc2Vfc2xhYikKKwkJCWdvdG8gb3V0X2ZyZWVfc2xhYjsKIAl9CiAKIAlwb29sLT51c2VycysrOwogCXJldHZhbCA9IHBvb2w7Ci0gZmFpbDoKK291dDoKIAltdXRleF91bmxvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CisKK291dF9mcmVlX3NsYWI6CisJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPmNtZF9zbGFiKTsKK291dF9mcmVlX3Bvb2w6CisJaWYgKGhvc3R0LT5jbWRfc2l6ZSkKKwkJc2NzaV9mcmVlX2hvc3RfY21kX3Bvb2wocG9vbCk7CisJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNjc2lfcHV0X2hvc3RfY21kX3Bvb2woZ2ZwX3QgZ2ZwX21hc2spCitzdGF0aWMgdm9pZCBzY3NpX3B1dF9ob3N0X2NtZF9wb29sKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogeworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKmhvc3R0ID0gc2hvc3QtPmhvc3R0OwogCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2w7CiAKIAltdXRleF9sb2NrKCZob3N0X2NtZF9wb29sX211dGV4KTsKLQlwb29sID0gKGdmcF9tYXNrICYgX19HRlBfRE1BKSA/ICZzY3NpX2NtZF9kbWFfcG9vbCA6Ci0JCSZzY3NpX2NtZF9wb29sOworCXBvb2wgPSBzY3NpX2ZpbmRfaG9zdF9jbWRfcG9vbChzaG9zdCk7CisKIAkvKgogCSAqIFRoaXMgbWF5IGhhcHBlbiBpZiBhIGRyaXZlciBoYXMgYSBtaXNtYXRjaGVkIGdldCBhbmQgcHV0CiAJICogb2YgdGhlIGNvbW1hbmQgcG9vbDsgdGhlIGRyaXZlciBzaG91bGQgYmUgaW1wbGljYXRlZCBpbgpAQCAtNDEwLDY3ICs0MzgsMTMgQEAKIAlpZiAoIS0tcG9vbC0+dXNlcnMpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPmNtZF9zbGFiKTsKIAkJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPnNlbnNlX3NsYWIpOworCQlpZiAoaG9zdHQtPmNtZF9zaXplKQorCQkJc2NzaV9mcmVlX2hvc3RfY21kX3Bvb2wocG9vbCk7CiAJfQogCW11dGV4X3VubG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiB9CiAKIC8qKgotICogc2NzaV9hbGxvY2F0ZV9jb21tYW5kIC0gZ2V0IGEgZnVsbHkgYWxsb2NhdGVkIFNDU0kgY29tbWFuZAotICogQGdmcF9tYXNrOglhbGxvY2F0aW9uIG1hc2sKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciB1c2Ugb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGhvc3QgYmFzZWQgcG9vbHMuCi0gKiBJdCBhbGxvY2F0ZXMgdGhlIHJlbGV2YW50IGNvbW1hbmQgYW5kIHRha2VzIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlCi0gKiBvbiB0aGUgcG9vbCBpdCB1c2VkLiAgVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgcGFpcmVkIHdpdGgKLSAqIHNjc2lfZnJlZV9jb21tYW5kIHdoaWNoIGFsc28gaGFzIHRoZSBpZGVudGljYWwgbWFzaywgb3RoZXJ3aXNlIHRoZQotICogZnJlZSBwb29sIGNvdW50cyB3aWxsIGV2ZW50dWFsbHkgZ28gd3JvbmcgYW5kIHlvdSdsbCB0cmlnZ2VyIGEgYnVnLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkICpvbmx5KiBiZSB1c2VkIGJ5IGRyaXZlcnMgdGhhdCBuZWVkIGEgc3RhdGljCi0gKiBjb21tYW5kIGFsbG9jYXRpb24gYXQgc3RhcnQgb2YgZGF5IGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuCi0gKi8KLXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfYWxsb2NhdGVfY29tbWFuZChnZnBfdCBnZnBfbWFzaykKLXsKLQlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sID0gc2NzaV9nZXRfaG9zdF9jbWRfcG9vbChnZnBfbWFzayk7Ci0KLQlpZiAoIXBvb2wpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIHNjc2lfcG9vbF9hbGxvY19jb21tYW5kKHBvb2wsIGdmcF9tYXNrKTsKLX0KLUVYUE9SVF9TWU1CT0woc2NzaV9hbGxvY2F0ZV9jb21tYW5kKTsKLQotLyoqCi0gKiBzY3NpX2ZyZWVfY29tbWFuZCAtIGZyZWUgYSBjb21tYW5kIGFsbG9jYXRlZCBieSBzY3NpX2FsbG9jYXRlX2NvbW1hbmQKLSAqIEBnZnBfbWFzazoJbWFzayB1c2VkIGluIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uCi0gKiBAY21kOgljb21tYW5kIHRvIGZyZWUKLSAqCi0gKiBOb3RlOiB1c2luZyB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBtYXNrIGlzIHZpdGFsIGJlY2F1c2UgdGhhdCdzCi0gKiB3aGF0IGRldGVybWluZXMgd2hpY2ggY29tbWFuZCBwb29sIHdlIHVzZSB0byBmcmVlIHRoZSBjb21tYW5kLiAgQW55Ci0gKiBtaXNtYXRjaCB3aWxsIGNhdXNlIHRoZSBzeXN0ZW0gdG8gQlVHIGV2ZW50dWFsbHkuCi0gKi8KLXZvaWQgc2NzaV9mcmVlX2NvbW1hbmQoZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLXsKLQlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpwb29sID0gc2NzaV9nZXRfaG9zdF9jbWRfcG9vbChnZnBfbWFzayk7Ci0KLQkvKgotCSAqIHRoaXMgY291bGQgdHJpZ2dlciBpZiB0aGUgbWFzayB0byBzY3NpX2FsbG9jYXRlX2NvbW1hbmQKLQkgKiBkb2Vzbid0IG1hdGNoIHRoaXMgbWFzay4gIE90aGVyd2lzZSB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgdGhpcwotCSAqIHN1Y2NlZWRzIGJlY2F1c2Ugc2NzaV9hbGxvY2F0ZV9jb21tYW5kIG11c3QgaGF2ZSB0YWtlbiBhIHJlZmVyZW5jZQotCSAqIG9uIHRoZSBwb29sCi0JICovCi0JQlVHX09OKCFwb29sKTsKLQotCXNjc2lfcG9vbF9mcmVlX2NvbW1hbmQocG9vbCwgY21kKTsKLQkvKgotCSAqIHNjc2lfcHV0X2hvc3RfY21kX3Bvb2wgaXMgY2FsbGVkIHR3aWNlOyBvbmNlIHRvIHJlbGVhc2UgdGhlCi0JICogcmVmZXJlbmNlIHdlIHRvb2sgYWJvdmUsIGFuZCBvbmNlIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZQotCSAqIG9yaWdpbmFsbHkgdGFrZW4gYnkgc2NzaV9hbGxvY2F0ZV9jb21tYW5kCi0JICovCi0Jc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChnZnBfbWFzayk7Ci0Jc2NzaV9wdXRfaG9zdF9jbWRfcG9vbChnZnBfbWFzayk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNjc2lfZnJlZV9jb21tYW5kKTsKLQotLyoqCiAgKiBzY3NpX3NldHVwX2NvbW1hbmRfZnJlZWxpc3QgLSBTZXR1cCB0aGUgY29tbWFuZCBmcmVlbGlzdCBmb3IgYSBzY3NpIGhvc3QuCiAgKiBAc2hvc3Q6IGhvc3QgdG8gYWxsb2NhdGUgdGhlIGZyZWVsaXN0IGZvci4KICAqCkBAIC00ODIsMTQgKzQ1NiwxMyBAQAogICovCiBpbnQgc2NzaV9zZXR1cF9jb21tYW5kX2ZyZWVsaXN0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAljb25zdCBnZnBfdCBnZnBfbWFzayA9IHNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA/IEdGUF9ETUEgOiBHRlBfS0VSTkVMOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAogCXNwaW5fbG9ja19pbml0KCZzaG9zdC0+ZnJlZV9saXN0X2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+ZnJlZV9saXN0KTsKIAotCXNob3N0LT5jbWRfcG9vbCA9IHNjc2lfZ2V0X2hvc3RfY21kX3Bvb2woZ2ZwX21hc2spOwotCisJc2hvc3QtPmNtZF9wb29sID0gc2NzaV9nZXRfaG9zdF9jbWRfcG9vbChzaG9zdCk7CiAJaWYgKCFzaG9zdC0+Y21kX3Bvb2wpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC00OTgsNyArNDcxLDcgQEAKIAkgKi8KIAljbWQgPSBzY3NpX2hvc3RfYWxsb2NfY29tbWFuZChzaG9zdCwgZ2ZwX21hc2spOwogCWlmICghY21kKSB7Ci0JCXNjc2lfcHV0X2hvc3RfY21kX3Bvb2woZ2ZwX21hc2spOworCQlzY3NpX3B1dF9ob3N0X2NtZF9wb29sKHNob3N0KTsKIAkJc2hvc3QtPmNtZF9wb29sID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNTI0LDEwICs0OTcsMTAgQEAKIAogCQljbWQgPSBsaXN0X2VudHJ5KHNob3N0LT5mcmVlX2xpc3QubmV4dCwgc3RydWN0IHNjc2lfY21uZCwgbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJmNtZC0+bGlzdCk7Ci0JCXNjc2lfcG9vbF9mcmVlX2NvbW1hbmQoc2hvc3QtPmNtZF9wb29sLCBjbWQpOworCQlzY3NpX2hvc3RfZnJlZV9jb21tYW5kKHNob3N0LCBjbWQpOwogCX0KIAlzaG9zdC0+Y21kX3Bvb2wgPSBOVUxMOwotCXNjc2lfcHV0X2hvc3RfY21kX3Bvb2woc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID8gR0ZQX0RNQSA6IEdGUF9LRVJORUwpOworCXNjc2lfcHV0X2hvc3RfY21kX3Bvb2woc2hvc3QpOwogfQogCiAjaWZkZWYgQ09ORklHX1NDU0lfTE9HR0lORwpAQCAtOTU0LDcgKzkyNyw3IEBACiAgKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlciBmdW5jdGlvbi4gIFlvdSBwcm9iYWJseSB3YW50IHRvIHVzZQogICogc2NzaV9nZXRfdnBkX3BhZ2UgaW5zdGVhZC4KICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqIFJldHVybnMgc2l6ZSBvZiB0aGUgdnBkIHBhZ2Ugb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KICAqLwogc3RhdGljIGludCBzY3NpX3ZwZF9pbnF1aXJ5KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAogCQkJCQkJCXU4IHBhZ2UsIHVuc2lnbmVkIGxlbikKQEAgLTk2Miw2ICs5MzUsOSBAQAogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgY2hhciBjbWRbMTZdOwogCisJaWYgKGxlbiA8IDQpCisJCXJldHVybiAtRUlOVkFMOworCiAJY21kWzBdID0gSU5RVUlSWTsKIAljbWRbMV0gPSAxOwkJLyogRVZQRCAqLwogCWNtZFsyXSA9IHBhZ2U7CkBAIC05NzYsMTMgKzk1MiwxMyBAQAogCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfRlJPTV9ERVZJQ0UsIGJ1ZmZlciwKIAkJCQkgIGxlbiwgTlVMTCwgMzAgKiBIWiwgMywgTlVMTCk7CiAJaWYgKHJlc3VsdCkKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIC1FSU87CiAKIAkvKiBTYW5pdHkgY2hlY2sgdGhhdCB3ZSBnb3QgdGhlIHBhZ2UgYmFjayB0aGF0IHdlIGFza2VkIGZvciAqLwogCWlmIChidWZmZXJbMV0gIT0gcGFnZSkKIAkJcmV0dXJuIC1FSU87CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ2V0X3VuYWxpZ25lZF9iZTE2KCZidWZmZXJbMl0pICsgNDsKIH0KIAogLyoqCkBAIC0xMDA5LDE4ICs5ODUsMTggQEAKIAogCS8qIEFzayBmb3IgYWxsIHRoZSBwYWdlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UgKi8KIAlyZXN1bHQgPSBzY3NpX3ZwZF9pbnF1aXJ5KHNkZXYsIGJ1ZiwgMCwgYnVmX2xlbik7Ci0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0IDwgNCkKIAkJZ290byBmYWlsOwogCiAJLyogSWYgdGhlIHVzZXIgYWN0dWFsbHkgd2FudGVkIHRoaXMgcGFnZSwgd2UgY2FuIHNraXAgdGhlIHJlc3QgKi8KIAlpZiAocGFnZSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBtaW4oKGludClidWZbM10sIGJ1Zl9sZW4gLSA0KTsgaSsrKQotCQlpZiAoYnVmW2kgKyA0XSA9PSBwYWdlKQorCWZvciAoaSA9IDQ7IGkgPCBtaW4ocmVzdWx0LCBidWZfbGVuKTsgaSsrKQorCQlpZiAoYnVmW2ldID09IHBhZ2UpCiAJCQlnb3RvIGZvdW5kOwogCi0JaWYgKGkgPCBidWZbM10gJiYgaSA+PSBidWZfbGVuIC0gNCkKKwlpZiAoaSA8IHJlc3VsdCAmJiBpID49IGJ1Zl9sZW4pCiAJCS8qIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBnaXZlIHVzIGJlbmVmaXQgb2YgZG91YnQgKi8KIAkJZ290byBmb3VuZDsKIAkvKiBUaGUgZGV2aWNlIGNsYWltcyBpdCBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBwYWdlICovCkBAIC0xMDI4LDcgKzEwMDQsNyBAQAogCiAgZm91bmQ6CiAJcmVzdWx0ID0gc2NzaV92cGRfaW5xdWlyeShzZGV2LCBidWYsIHBhZ2UsIGJ1Zl9sZW4pOwotCWlmIChyZXN1bHQpCisJaWYgKHJlc3VsdCA8IDApCiAJCWdvdG8gZmFpbDsKIAogCXJldHVybiAwOwpAQCAtMTAzOSw2ICsxMDE1LDkzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2dldF92cGRfcGFnZSk7CiAKIC8qKgorICogc2NzaV9hdHRhY2hfdnBkIC0gQXR0YWNoIFZpdGFsIFByb2R1Y3QgRGF0YSB0byBhIFNDU0kgZGV2aWNlIHN0cnVjdHVyZQorICogQHNkZXY6IFRoZSBkZXZpY2UgdG8gYXNrCisgKgorICogQXR0YWNoIHRoZSAnRGV2aWNlIElkZW50aWZpY2F0aW9uJyBWUEQgcGFnZSAoMHg4MykgYW5kIHRoZQorICogJ1VuaXQgU2VyaWFsIE51bWJlcicgVlBEIHBhZ2UgKDB4ODApIHRvIGEgU0NTSSBkZXZpY2UKKyAqIHN0cnVjdHVyZS4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgZGV2aWNlCisgKiB1bmlxdWVseS4KKyAqLwordm9pZCBzY3NpX2F0dGFjaF92cGQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWludCByZXN1bHQsIGk7CisJaW50IHZwZF9sZW4gPSBTQ1NJX1ZQRF9QR19MRU47CisJaW50IHBnODBfc3VwcG9ydGVkID0gMDsKKwlpbnQgcGc4M19zdXBwb3J0ZWQgPSAwOworCXVuc2lnbmVkIGNoYXIgKnZwZF9idWY7CisKKwlpZiAoc2Rldi0+c2tpcF92cGRfcGFnZXMpCisJCXJldHVybjsKK3JldHJ5X3BnMDoKKwl2cGRfYnVmID0ga21hbGxvYyh2cGRfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZwZF9idWYpCisJCXJldHVybjsKKworCS8qIEFzayBmb3IgYWxsIHRoZSBwYWdlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UgKi8KKwlyZXN1bHQgPSBzY3NpX3ZwZF9pbnF1aXJ5KHNkZXYsIHZwZF9idWYsIDAsIHZwZF9sZW4pOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWtmcmVlKHZwZF9idWYpOworCQlyZXR1cm47CisJfQorCWlmIChyZXN1bHQgPiB2cGRfbGVuKSB7CisJCXZwZF9sZW4gPSByZXN1bHQ7CisJCWtmcmVlKHZwZF9idWYpOworCQlnb3RvIHJldHJ5X3BnMDsKKwl9CisKKwlmb3IgKGkgPSA0OyBpIDwgcmVzdWx0OyBpKyspIHsKKwkJaWYgKHZwZF9idWZbaV0gPT0gMHg4MCkKKwkJCXBnODBfc3VwcG9ydGVkID0gMTsKKwkJaWYgKHZwZF9idWZbaV0gPT0gMHg4MykKKwkJCXBnODNfc3VwcG9ydGVkID0gMTsKKwl9CisJa2ZyZWUodnBkX2J1Zik7CisJdnBkX2xlbiA9IFNDU0lfVlBEX1BHX0xFTjsKKworCWlmIChwZzgwX3N1cHBvcnRlZCkgeworcmV0cnlfcGc4MDoKKwkJdnBkX2J1ZiA9IGttYWxsb2ModnBkX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdnBkX2J1ZikKKwkJCXJldHVybjsKKworCQlyZXN1bHQgPSBzY3NpX3ZwZF9pbnF1aXJ5KHNkZXYsIHZwZF9idWYsIDB4ODAsIHZwZF9sZW4pOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJa2ZyZWUodnBkX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHJlc3VsdCA+IHZwZF9sZW4pIHsKKwkJCXZwZF9sZW4gPSByZXN1bHQ7CisJCQlrZnJlZSh2cGRfYnVmKTsKKwkJCWdvdG8gcmV0cnlfcGc4MDsKKwkJfQorCQlzZGV2LT52cGRfcGc4MF9sZW4gPSByZXN1bHQ7CisJCXNkZXYtPnZwZF9wZzgwID0gdnBkX2J1ZjsKKwkJdnBkX2xlbiA9IFNDU0lfVlBEX1BHX0xFTjsKKwl9CisKKwlpZiAocGc4M19zdXBwb3J0ZWQpIHsKK3JldHJ5X3BnODM6CisJCXZwZF9idWYgPSBrbWFsbG9jKHZwZF9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXZwZF9idWYpCisJCQlyZXR1cm47CisKKwkJcmVzdWx0ID0gc2NzaV92cGRfaW5xdWlyeShzZGV2LCB2cGRfYnVmLCAweDgzLCB2cGRfbGVuKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWtmcmVlKHZwZF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChyZXN1bHQgPiB2cGRfbGVuKSB7CisJCQl2cGRfbGVuID0gcmVzdWx0OworCQkJa2ZyZWUodnBkX2J1Zik7CisJCQlnb3RvIHJldHJ5X3BnODM7CisJCX0KKwkJc2Rldi0+dnBkX3BnODNfbGVuID0gcmVzdWx0OworCQlzZGV2LT52cGRfcGc4MyA9IHZwZF9idWY7CisJfQorfQorCisvKioKICAqIHNjc2lfcmVwb3J0X29wY29kZSAtIEZpbmQgb3V0IGlmIGEgZ2l2ZW4gY29tbWFuZCBvcGNvZGUgaXMgc3VwcG9ydGVkCiAgKiBAc2RldjoJc2NzaSBkZXZpY2UgdG8gcXVlcnkKICAqIEBidWZmZXI6CXNjcmF0Y2ggYnVmZmVyIChtdXN0IGJlIGF0IGxlYXN0IDIwIGJ5dGVzIGxvbmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwppbmRleCAyZGVjYzY0Li5mM2U5Y2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKQEAgLTY0LDYgKzY0LDcgQEAKIC8qIEFkZGl0aW9uYWwgU2Vuc2UgQ29kZSAoQVNDKSAqLwogI2RlZmluZSBOT19BRERJVElPTkFMX1NFTlNFIDB4MAogI2RlZmluZSBMT0dJQ0FMX1VOSVRfTk9UX1JFQURZIDB4NAorI2RlZmluZSBMT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFIDB4OAogI2RlZmluZSBVTlJFQ09WRVJFRF9SRUFEX0VSUiAweDExCiAjZGVmaW5lIFBBUkFNRVRFUl9MSVNUX0xFTkdUSF9FUlIgMHgxYQogI2RlZmluZSBJTlZBTElEX09QQ09ERSAweDIwCkBAIC0xOTUsNiArMTk2LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2NzaV9kZWJ1Z191bm1hcF9tYXhfZGVzYyA9IERFRl9VTk1BUF9NQVhfREVTQzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2NzaV9kZWJ1Z193cml0ZV9zYW1lX2xlbmd0aCA9IERFRl9XUklURVNBTUVfTEVOR1RIOwogc3RhdGljIGJvb2wgc2NzaV9kZWJ1Z19yZW1vdmFibGUgPSBERUZfUkVNT1ZBQkxFOworc3RhdGljIGJvb2wgc2NzaV9kZWJ1Z19jbHVzdGVyaW5nOwogCiBzdGF0aWMgaW50IHNjc2lfZGVidWdfY21uZF9jb3VudCA9IDA7CiAKQEAgLTE3ODAsNyArMTc4Miw2IEBACiAJICAgIGJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZykgIT0gZWlfbGJhKSB7CiAJCXByX2VycigiJXM6IFJFRiBjaGVjayBmYWlsZWQgb24gc2VjdG9yICVsdVxuIiwKIAkJCV9fZnVuY19fLCAodW5zaWduZWQgbG9uZylzZWN0b3IpOwotCQkJZGlmX2Vycm9ycysrOwogCQlyZXR1cm4gMHgwMzsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNzg5LDIzICsxNzkwLDI3IEBACiBzdGF0aWMgdm9pZCBkaWZfY29weV9wcm90KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBzZWN0b3JfdCBzZWN0b3IsCiAJCQkgIHVuc2lnbmVkIGludCBzZWN0b3JzLCBib29sIHJlYWQpCiB7Ci0JdW5zaWduZWQgaW50IGksIHJlc2lkOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqcHNnbDsKKwlzaXplX3QgcmVzaWQ7CiAJdm9pZCAqcGFkZHI7CiAJY29uc3Qgdm9pZCAqZGlmX3N0b3JlX2VuZCA9IGRpZl9zdG9yZXAgKyBzZGVidWdfc3RvcmVfc2VjdG9yczsKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyIG1pdGVyOwogCiAJLyogQnl0ZXMgb2YgcHJvdGVjdGlvbiBkYXRhIHRvIGNvcHkgaW50byBzZ2wgKi8KIAlyZXNpZCA9IHNlY3RvcnMgKiBzaXplb2YoKmRpZl9zdG9yZXApOwogCi0Jc2NzaV9mb3JfZWFjaF9wcm90X3NnKFNDcG50LCBwc2dsLCBzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpLCBpKSB7Ci0JCWludCBsZW4gPSBtaW4ocHNnbC0+bGVuZ3RoLCByZXNpZCk7CisJc2dfbWl0ZXJfc3RhcnQoJm1pdGVyLCBzY3NpX3Byb3Rfc2dsaXN0KFNDcG50KSwKKwkJCXNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCksIFNHX01JVEVSX0FUT01JQyB8CisJCQkocmVhZCA/IFNHX01JVEVSX1RPX1NHIDogU0dfTUlURVJfRlJPTV9TRykpOworCisJd2hpbGUgKHNnX21pdGVyX25leHQoJm1pdGVyKSAmJiByZXNpZCA+IDApIHsKKwkJc2l6ZV90IGxlbiA9IG1pbihtaXRlci5sZW5ndGgsIHJlc2lkKTsKIAkJdm9pZCAqc3RhcnQgPSBkaWZfc3RvcmUoc2VjdG9yKTsKLQkJaW50IHJlc3QgPSAwOworCQlzaXplX3QgcmVzdCA9IDA7CiAKIAkJaWYgKGRpZl9zdG9yZV9lbmQgPCBzdGFydCArIGxlbikKIAkJCXJlc3QgPSBzdGFydCArIGxlbiAtIGRpZl9zdG9yZV9lbmQ7CiAKLQkJcGFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHBzZ2wpKSArIHBzZ2wtPm9mZnNldDsKKwkJcGFkZHIgPSBtaXRlci5hZGRyOwogCiAJCWlmIChyZWFkKQogCQkJbWVtY3B5KHBhZGRyLCBzdGFydCwgbGVuIC0gcmVzdCk7CkBAIC0xODIxLDggKzE4MjYsOCBAQAogCiAJCXNlY3RvciArPSBsZW4gLyBzaXplb2YoKmRpZl9zdG9yZXApOwogCQlyZXNpZCAtPSBsZW47Ci0JCWt1bm1hcF9hdG9taWMocGFkZHIpOwogCX0KKwlzZ19taXRlcl9zdG9wKCZtaXRlcik7CiB9CiAKIHN0YXRpYyBpbnQgcHJvdF92ZXJpZnlfcmVhZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgc2VjdG9yX3Qgc3RhcnRfc2VjLApAQCAtMTgzMiw3ICsxODM3LDcgQEAKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQ7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCi0JZm9yIChpID0gMDsgaSA8IHNlY3RvcnM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzZWN0b3JzOyBpKyssIGVpX2xiYSsrKSB7CiAJCWludCByZXQ7CiAKIAkJc2VjdG9yID0gc3RhcnRfc2VjICsgaTsKQEAgLTE4NDYsOCArMTg1MSw2IEBACiAJCQlkaWZfZXJyb3JzKys7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0KLQkJZWlfbGJhKys7CiAJfQogCiAJZGlmX2NvcHlfcHJvdChTQ3BudCwgc3RhcnRfc2VjLCBzZWN0b3JzLCB0cnVlKTsKQEAgLTE4ODYsMTcgKzE4ODksMTkgQEAKIAkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CiAJfQogCisJcmVhZF9sb2NrX2lycXNhdmUoJmF0b21pY19ydywgaWZsYWdzKTsKKwogCS8qIERJWCArIFQxMCBESUYgKi8KIAlpZiAoc2NzaV9kZWJ1Z19kaXggJiYgc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSkgewogCQlpbnQgcHJvdF9yZXQgPSBwcm90X3ZlcmlmeV9yZWFkKFNDcG50LCBsYmEsIG51bSwgZWlfbGJhKTsKIAogCQlpZiAocHJvdF9yZXQpIHsKKwkJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19ydywgaWZsYWdzKTsKIAkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgQUJPUlRFRF9DT01NQU5ELCAweDEwLCBwcm90X3JldCk7CiAJCQlyZXR1cm4gaWxsZWdhbF9jb25kaXRpb25fcmVzdWx0OwogCQl9CiAJfQogCi0JcmVhZF9sb2NrX2lycXNhdmUoJmF0b21pY19ydywgaWZsYWdzKTsKIAlyZXQgPSBkb19kZXZpY2VfYWNjZXNzKFNDcG50LCBkZXZpcCwgbGJhLCBudW0sIDApOwogCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19ydywgaWZsYWdzKTsKIAlpZiAocmV0ID09IC0xKQpAQCAtMTkzMSw1NSArMTkzNiw2MiBAQAogc3RhdGljIGludCBwcm90X3ZlcmlmeV93cml0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgc2VjdG9yX3Qgc3RhcnRfc2VjLAogCQkJICAgICB1bnNpZ25lZCBpbnQgc2VjdG9ycywgdTMyIGVpX2xiYSkKIHsKLQlpbnQgaSwgaiwgcmV0OworCWludCByZXQ7CiAJc3RydWN0IHNkX2RpZl90dXBsZSAqc2R0OwotCXN0cnVjdCBzY2F0dGVybGlzdCAqZHNnbDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzZ2wgPSBzY3NpX3Byb3Rfc2dsaXN0KFNDcG50KTsKLQl2b2lkICpkYWRkciwgKnBhZGRyOworCXZvaWQgKmRhZGRyOwogCXNlY3Rvcl90IHNlY3RvciA9IHN0YXJ0X3NlYzsKIAlpbnQgcHBhZ2Vfb2Zmc2V0OworCWludCBkcGFnZV9vZmZzZXQ7CisJc3RydWN0IHNnX21hcHBpbmdfaXRlciBkaXRlcjsKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyIHBpdGVyOwogCiAJQlVHX09OKHNjc2lfc2dfY291bnQoU0NwbnQpID09IDApOwogCUJVR19PTihzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpID09IDApOwogCi0JcHBhZ2Vfb2Zmc2V0ID0gMDsKKwlzZ19taXRlcl9zdGFydCgmcGl0ZXIsIHNjc2lfcHJvdF9zZ2xpc3QoU0NwbnQpLAorCQkJc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSwKKwkJCVNHX01JVEVSX0FUT01JQyB8IFNHX01JVEVSX0ZST01fU0cpOworCXNnX21pdGVyX3N0YXJ0KCZkaXRlciwgc2NzaV9zZ2xpc3QoU0NwbnQpLCBzY3NpX3NnX2NvdW50KFNDcG50KSwKKwkJCVNHX01JVEVSX0FUT01JQyB8IFNHX01JVEVSX0ZST01fU0cpOwogCi0JLyogRm9yIGVhY2ggZGF0YSBwYWdlICovCi0Jc2NzaV9mb3JfZWFjaF9zZyhTQ3BudCwgZHNnbCwgc2NzaV9zZ19jb3VudChTQ3BudCksIGkpIHsKLQkJZGFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKGRzZ2wpKSArIGRzZ2wtPm9mZnNldDsKLQkJcGFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHBzZ2wpKSArIHBzZ2wtPm9mZnNldDsKKwkvKiBGb3IgZWFjaCBwcm90ZWN0aW9uIHBhZ2UgKi8KKwl3aGlsZSAoc2dfbWl0ZXJfbmV4dCgmcGl0ZXIpKSB7CisJCWRwYWdlX29mZnNldCA9IDA7CisJCWlmIChXQVJOX09OKCFzZ19taXRlcl9uZXh0KCZkaXRlcikpKSB7CisJCQlyZXQgPSAweDAxOworCQkJZ290byBvdXQ7CisJCX0KIAotCQkvKiBGb3IgZWFjaCBzZWN0b3Itc2l6ZWQgY2h1bmsgaW4gZGF0YSBwYWdlICovCi0JCWZvciAoaiA9IDA7IGogPCBkc2dsLT5sZW5ndGg7IGogKz0gc2NzaV9kZWJ1Z19zZWN0b3Jfc2l6ZSkgewotCisJCWZvciAocHBhZ2Vfb2Zmc2V0ID0gMDsgcHBhZ2Vfb2Zmc2V0IDwgcGl0ZXIubGVuZ3RoOworCQkgICAgIHBwYWdlX29mZnNldCArPSBzaXplb2Yoc3RydWN0IHNkX2RpZl90dXBsZSkpIHsKIAkJCS8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQKLQkJCSAqIHByb3RlY3Rpb24gcGFnZSBhZHZhbmNlIHRvIHRoZSBuZXh0IG9uZQorCQkJICogZGF0YSBwYWdlIGFkdmFuY2UgdG8gdGhlIG5leHQgb25lCiAJCQkgKi8KLQkJCWlmIChwcGFnZV9vZmZzZXQgPj0gcHNnbC0+bGVuZ3RoKSB7Ci0JCQkJa3VubWFwX2F0b21pYyhwYWRkcik7Ci0JCQkJcHNnbCA9IHNnX25leHQocHNnbCk7Ci0JCQkJQlVHX09OKHBzZ2wgPT0gTlVMTCk7Ci0JCQkJcGFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHBzZ2wpKQotCQkJCQkrIHBzZ2wtPm9mZnNldDsKLQkJCQlwcGFnZV9vZmZzZXQgPSAwOworCQkJaWYgKGRwYWdlX29mZnNldCA+PSBkaXRlci5sZW5ndGgpIHsKKwkJCQlpZiAoV0FSTl9PTighc2dfbWl0ZXJfbmV4dCgmZGl0ZXIpKSkgeworCQkJCQlyZXQgPSAweDAxOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJZHBhZ2Vfb2Zmc2V0ID0gMDsKIAkJCX0KIAotCQkJc2R0ID0gcGFkZHIgKyBwcGFnZV9vZmZzZXQ7CisJCQlzZHQgPSBwaXRlci5hZGRyICsgcHBhZ2Vfb2Zmc2V0OworCQkJZGFkZHIgPSBkaXRlci5hZGRyICsgZHBhZ2Vfb2Zmc2V0OwogCi0JCQlyZXQgPSBkaWZfdmVyaWZ5KHNkdCwgZGFkZHIgKyBqLCBzZWN0b3IsIGVpX2xiYSk7CisJCQlyZXQgPSBkaWZfdmVyaWZ5KHNkdCwgZGFkZHIsIHNlY3RvciwgZWlfbGJhKTsKIAkJCWlmIChyZXQpIHsKLQkJCQlkdW1wX3NlY3RvcihkYWRkciArIGosIHNjc2lfZGVidWdfc2VjdG9yX3NpemUpOworCQkJCWR1bXBfc2VjdG9yKGRhZGRyLCBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAogCQkJc2VjdG9yKys7CiAJCQllaV9sYmErKzsKLQkJCXBwYWdlX29mZnNldCArPSBzaXplb2Yoc3RydWN0IHNkX2RpZl90dXBsZSk7CisJCQlkcGFnZV9vZmZzZXQgKz0gc2NzaV9kZWJ1Z19zZWN0b3Jfc2l6ZTsKIAkJfQotCi0JCWt1bm1hcF9hdG9taWMocGFkZHIpOwotCQlrdW5tYXBfYXRvbWljKGRhZGRyKTsKKwkJZGl0ZXIuY29uc3VtZWQgPSBkcGFnZV9vZmZzZXQ7CisJCXNnX21pdGVyX3N0b3AoJmRpdGVyKTsKIAl9CisJc2dfbWl0ZXJfc3RvcCgmcGl0ZXIpOwogCiAJZGlmX2NvcHlfcHJvdChTQ3BudCwgc3RhcnRfc2VjLCBzZWN0b3JzLCBmYWxzZSk7CiAJZGl4X3dyaXRlcysrOwpAQCAtMTk4OCw4ICsyMDAwLDggQEAKIAogb3V0OgogCWRpZl9lcnJvcnMrKzsKLQlrdW5tYXBfYXRvbWljKHBhZGRyKTsKLQlrdW5tYXBfYXRvbWljKGRhZGRyKTsKKwlzZ19taXRlcl9zdG9wKCZkaXRlcik7CisJc2dfbWl0ZXJfc3RvcCgmcGl0ZXIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwODksMTcgKzIxMDEsMTkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJd3JpdGVfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CisKIAkvKiBESVggKyBUMTAgRElGICovCiAJaWYgKHNjc2lfZGVidWdfZGl4ICYmIHNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCkpIHsKIAkJaW50IHByb3RfcmV0ID0gcHJvdF92ZXJpZnlfd3JpdGUoU0NwbnQsIGxiYSwgbnVtLCBlaV9sYmEpOwogCiAJCWlmIChwcm90X3JldCkgeworCQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19ydywgaWZsYWdzKTsKIAkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULCAweDEwLCBwcm90X3JldCk7CiAJCQlyZXR1cm4gaWxsZWdhbF9jb25kaXRpb25fcmVzdWx0OwogCQl9CiAJfQogCi0Jd3JpdGVfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CiAJcmV0ID0gZG9fZGV2aWNlX2FjY2VzcyhTQ3BudCwgZGV2aXAsIGxiYSwgbnVtLCAxKTsKIAlpZiAoc2NzaV9kZWJ1Z19sYnAoKSkKIAkJbWFwX3JlZ2lvbihsYmEsIG51bSk7CkBAIC0yMTc4LDYgKzIxOTIsNyBAQAogCXN0cnVjdCB1bm1hcF9ibG9ja19kZXNjICpkZXNjOwogCXVuc2lnbmVkIGludCBpLCBwYXlsb2FkX2xlbiwgZGVzY3JpcHRvcnM7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKIAogCXJldCA9IGNoZWNrX3JlYWRpbmVzcyhzY21kLCAxLCBkZXZpcCk7CiAJaWYgKHJldCkKQEAgLTIxOTksNiArMjIxNCw4IEBACiAKIAlkZXNjID0gKHZvaWQgKikmYnVmWzhdOwogCisJd3JpdGVfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CisKIAlmb3IgKGkgPSAwIDsgaSA8IGRlc2NyaXB0b3JzIDsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmEgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJmRlc2NbaV0ubGJhKTsKIAkJdW5zaWduZWQgaW50IG51bSA9IGdldF91bmFsaWduZWRfYmUzMigmZGVzY1tpXS5ibG9ja3MpOwpAQCAtMjIxMyw2ICsyMjMwLDcgQEAKIAlyZXQgPSAwOwogCiBvdXQ6CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19ydywgaWZsYWdzKTsKIAlrZnJlZShidWYpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIzMTMsMzYgKzIzMzEsMzcgQEAKIHN0YXRpYyBpbnQgcmVzcF94ZHdyaXRlcmVhZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYmEsCiAJCQkgICAgdW5zaWduZWQgaW50IG51bSwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqZGV2aXApCiB7Ci0JaW50IGksIGosIHJldCA9IC0xOworCWludCBqOwogCXVuc2lnbmVkIGNoYXIgKmthZGRyLCAqYnVmOwogCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlzdHJ1Y3Qgc2NzaV9kYXRhX2J1ZmZlciAqc2RiID0gc2NzaV9pbihzY3ApOworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgbWl0ZXI7CiAKIAkvKiBiZXR0ZXIgbm90IHRvIHVzZSB0ZW1wb3JhcnkgYnVmZmVyLiAqLwogCWJ1ZiA9IGttYWxsb2Moc2NzaV9idWZmbGVuKHNjcCksIEdGUF9BVE9NSUMpOwotCWlmICghYnVmKQotCQlyZXR1cm4gcmV0OworCWlmICghYnVmKSB7CisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgTk9UX1JFQURZLAorCQkJCUxPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkUsIDApOworCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwl9CiAKIAlzY3NpX3NnX2NvcHlfdG9fYnVmZmVyKHNjcCwgYnVmLCBzY3NpX2J1ZmZsZW4oc2NwKSk7CiAKIAlvZmZzZXQgPSAwOwotCWZvcl9lYWNoX3NnKHNkYi0+dGFibGUuc2dsLCBzZywgc2RiLT50YWJsZS5uZW50cywgaSkgewotCQlrYWRkciA9ICh1bnNpZ25lZCBjaGFyICopa21hcF9hdG9taWMoc2dfcGFnZShzZykpOwotCQlpZiAoIWthZGRyKQotCQkJZ290byBvdXQ7CisJc2dfbWl0ZXJfc3RhcnQoJm1pdGVyLCBzZGItPnRhYmxlLnNnbCwgc2RiLT50YWJsZS5uZW50cywKKwkJCVNHX01JVEVSX0FUT01JQyB8IFNHX01JVEVSX1RPX1NHKTsKIAotCQlmb3IgKGogPSAwOyBqIDwgc2ctPmxlbmd0aDsgaisrKQotCQkJKihrYWRkciArIHNnLT5vZmZzZXQgKyBqKSBePSAqKGJ1ZiArIG9mZnNldCArIGopOworCXdoaWxlIChzZ19taXRlcl9uZXh0KCZtaXRlcikpIHsKKwkJa2FkZHIgPSBtaXRlci5hZGRyOworCQlmb3IgKGogPSAwOyBqIDwgbWl0ZXIubGVuZ3RoOyBqKyspCisJCQkqKGthZGRyICsgaikgXj0gKihidWYgKyBvZmZzZXQgKyBqKTsKIAotCQlvZmZzZXQgKz0gc2ctPmxlbmd0aDsKLQkJa3VubWFwX2F0b21pYyhrYWRkcik7CisJCW9mZnNldCArPSBtaXRlci5sZW5ndGg7CiAJfQotCXJldCA9IDA7Ci1vdXQ6CisJc2dfbWl0ZXJfc3RvcCgmbWl0ZXIpOwogCWtmcmVlKGJ1Zik7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKiBXaGVuIHRpbWVyIGdvZXMgb2ZmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLwpAQCAtMjc0NCw2ICsyNzYzLDcgQEAKICAqLwogbW9kdWxlX3BhcmFtX25hbWVkKGFkZF9ob3N0LCBzY3NpX2RlYnVnX2FkZF9ob3N0LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChhdG8sIHNjc2lfZGVidWdfYXRvLCBpbnQsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtX25hbWVkKGNsdXN0ZXJpbmcsIHNjc2lfZGVidWdfY2x1c3RlcmluZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlbGF5LCBzY3NpX2RlYnVnX2RlbGF5LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZXZfc2l6ZV9tYiwgc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiwgaW50LCBTX0lSVUdPKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkaWYsIHNjc2lfZGVidWdfZGlmLCBpbnQsIFNfSVJVR08pOwpAQCAtMjc4Nyw2ICsyODA3LDcgQEAKIAogTU9EVUxFX1BBUk1fREVTQyhhZGRfaG9zdCwgIjAuLjEyNyBob3N0cyBhbGxvd2VkKGRlZj0xKSIpOwogTU9EVUxFX1BBUk1fREVTQyhhdG8sICJhcHBsaWNhdGlvbiB0YWcgb3duZXJzaGlwOiAwPWRpc2sgMT1ob3N0IChkZWY9MSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2x1c3RlcmluZywgIndoZW4gc2V0IGVuYWJsZXMgbGFyZ2VyIHRyYW5zZmVycyAoZGVmPTApIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlbGF5LCAiIyBvZiBqaWZmaWVzIHRvIGRlbGF5IHJlc3BvbnNlKGRlZj0xKSIpOwogTU9EVUxFX1BBUk1fREVTQyhkZXZfc2l6ZV9tYiwgInNpemUgaW4gTUIgb2YgcmFtIHNoYXJlZCBieSBkZXZzKGRlZj04KSIpOwogTU9EVUxFX1BBUk1fREVTQyhkaWYsICJkYXRhIGludGVncml0eSBmaWVsZCB0eXBlOiAwLTMgKGRlZj0wKSIpOwpAQCAtMzI0OCw3ICszMjY5LDcgQEAKIH07CiBBVFRSSUJVVEVfR1JPVVBTKHNkZWJ1Z19kcnYpOwogCi1zdHJ1Y3QgZGV2aWNlICpwc2V1ZG9fcHJpbWFyeTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpwc2V1ZG9fcHJpbWFyeTsKIAogc3RhdGljIGludCBfX2luaXQgc2NzaV9kZWJ1Z19pbml0KHZvaWQpCiB7CkBAIC0zOTM0LDYgKzM5NTUsOCBAQAogCXNkYmdfaG9zdCA9IHRvX3NkZWJ1Z19ob3N0KGRldik7CiAKIAlzZGVidWdfZHJpdmVyX3RlbXBsYXRlLmNhbl9xdWV1ZSA9IHNjc2lfZGVidWdfbWF4X3F1ZXVlOworCWlmIChzY3NpX2RlYnVnX2NsdXN0ZXJpbmcpCisJCXNkZWJ1Z19kcml2ZXJfdGVtcGxhdGUudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORzsKIAlocG50ID0gc2NzaV9ob3N0X2FsbG9jKCZzZGVidWdfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2Yoc2RiZ19ob3N0KSk7CiAJaWYgKE5VTEwgPT0gaHBudCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzY3NpX3JlZ2lzdGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKaW5kZXggNzhiMDA0ZC4uNzcxYzE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCkBAIC0yMjg4LDYgKzIyODgsMTEgQEAKIAlpZiAoc2NzaV9hdXRvcG1fZ2V0X2hvc3Qoc2hvc3QpIDwgMCkKIAkJcmV0dXJuIEZBSUxFRDsKIAorCWlmICghZ2V0X2RldmljZSgmZGV2LT5zZGV2X2dlbmRldikpIHsKKwkJcnRuID0gRkFJTEVEOworCQlnb3RvIG91dF9wdXRfYXV0b3BtX2hvc3Q7CisJfQorCiAJc2NtZCA9IHNjc2lfZ2V0X2NvbW1hbmQoZGV2LCBHRlBfS0VSTkVMKTsKIAlibGtfcnFfaW5pdChOVUxMLCAmcmVxKTsKIAlzY21kLT5yZXF1ZXN0ID0gJnJlcTsKQEAgLTIzNDUsNiArMjM1MCw3IEBACiAJc2NzaV9ydW5faG9zdF9xdWV1ZXMoc2hvc3QpOwogCiAJc2NzaV9uZXh0X2NvbW1hbmQoc2NtZCk7CitvdXRfcHV0X2F1dG9wbV9ob3N0OgogCXNjc2lfYXV0b3BtX3B1dF9ob3N0KHNob3N0KTsKIAlyZXR1cm4gcnRuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCA2MmVjODRiLi41NjgxYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtNzUsMjggKzc1LDYgQEAKICAqLwogI2RlZmluZSBTQ1NJX1FVRVVFX0RFTEFZCTMKIAotLyoKLSAqIEZ1bmN0aW9uOglzY3NpX3VucHJlcF9yZXF1ZXN0KCkKLSAqCi0gKiBQdXJwb3NlOglSZW1vdmUgYWxsIHByZXBhcmF0aW9uIGRvbmUgZm9yIGEgcmVxdWVzdCwgaW5jbHVkaW5nIGl0cwotICoJCWFzc29jaWF0ZWQgc2NzaV9jbW5kLCBzbyB0aGF0IGl0IGNhbiBiZSByZXF1ZXVlZC4KLSAqCi0gKiBBcmd1bWVudHM6CXJlcQktIHJlcXVlc3QgdG8gdW5wcmVwYXJlCi0gKgotICogTG9jayBzdGF0dXM6CUFzc3VtZWQgdGhhdCBubyBsb2NrcyBhcmUgaGVsZCB1cG9uIGVudHJ5LgotICoKLSAqIFJldHVybnM6CU5vdGhpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIHNjc2lfdW5wcmVwX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSByZXEtPnNwZWNpYWw7Ci0KLQlibGtfdW5wcmVwX3JlcXVlc3QocmVxKTsKLQlyZXEtPnNwZWNpYWwgPSBOVUxMOwotCi0Jc2NzaV9wdXRfY29tbWFuZChjbWQpOwotfQotCiAvKioKICAqIF9fc2NzaV9xdWV1ZV9pbnNlcnQgLSBwcml2YXRlIHF1ZXVlIGluc2VydGlvbgogICogQGNtZDogVGhlIFNDU0kgY29tbWFuZCBiZWluZyByZXF1ZXVlZApAQCAtMzg1LDI5ICszNjMsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEZ1bmN0aW9uOglzY3NpX3J1bl9xdWV1ZSgpCi0gKgotICogUHVycG9zZToJU2VsZWN0IGEgcHJvcGVyIHJlcXVlc3QgcXVldWUgdG8gc2VydmUgbmV4dAotICoKLSAqIEFyZ3VtZW50czoJcQktIGxhc3QgcmVxdWVzdCdzIHF1ZXVlCi0gKgotICogUmV0dXJuczogICAgIE5vdGhpbmcKLSAqCi0gKiBOb3RlczoJVGhlIHByZXZpb3VzIGNvbW1hbmQgd2FzIGNvbXBsZXRlbHkgZmluaXNoZWQsIHN0YXJ0Ci0gKgkJYSBuZXcgb25lIGlmIHBvc3NpYmxlLgotICovCi1zdGF0aWMgdm9pZCBzY3NpX3J1bl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3N0YXRpYyB2b2lkIHNjc2lfc3RhcnZlZF9saXN0X3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJTElTVF9IRUFEKHN0YXJ2ZWRfbGlzdCk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzaG9zdCA9IHNkZXYtPmhvc3Q7Ci0JaWYgKHNjc2lfdGFyZ2V0KHNkZXYpLT5zaW5nbGVfbHVuKQotCQlzY3NpX3NpbmdsZV9sdW5fcnVuKHNkZXYpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWxpc3Rfc3BsaWNlX2luaXQoJnNob3N0LT5zdGFydmVkX2xpc3QsICZzdGFydmVkX2xpc3QpOwogCkBAIC00NTksNiArNDIwLDI4IEBACiAJLyogcHV0IGFueSB1bnByb2Nlc3NlZCBlbnRyaWVzIGJhY2sgKi8KIAlsaXN0X3NwbGljZSgmc3RhcnZlZF9saXN0LCAmc2hvc3QtPnN0YXJ2ZWRfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICBzY3NpX3J1bl9xdWV1ZSgpCisgKgorICogUHVycG9zZTogICAgU2VsZWN0IGEgcHJvcGVyIHJlcXVlc3QgcXVldWUgdG8gc2VydmUgbmV4dAorICoKKyAqIEFyZ3VtZW50czogIHEgICAgICAgLSBsYXN0IHJlcXVlc3QncyBxdWV1ZQorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTm90ZXM6ICAgICAgVGhlIHByZXZpb3VzIGNvbW1hbmQgd2FzIGNvbXBsZXRlbHkgZmluaXNoZWQsIHN0YXJ0CisgKiAgICAgICAgICAgICBhIG5ldyBvbmUgaWYgcG9zc2libGUuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfcnVuX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKKworCWlmIChzY3NpX3RhcmdldChzZGV2KS0+c2luZ2xlX2x1bikKKwkJc2NzaV9zaW5nbGVfbHVuX3J1bihzZGV2KTsKKwlpZiAoIWxpc3RfZW1wdHkoJnNkZXYtPmhvc3QtPnN0YXJ2ZWRfbGlzdCkpCisJCXNjc2lfc3RhcnZlZF9saXN0X3J1bihzZGV2LT5ob3N0KTsKIAogCWJsa19ydW5fcXVldWUocSk7CiB9CkBAIC00OTcsMTYgKzQ4MCwxMCBAQAogCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qCi0JICogV2UgbmVlZCB0byBob2xkIGEgcmVmZXJlbmNlIG9uIHRoZSBkZXZpY2UgdG8gYXZvaWQgdGhlIHF1ZXVlIGJlaW5nCi0JICoga2lsbGVkIGFmdGVyIHRoZSB1bmxvY2sgYW5kIGJlZm9yZSBzY3NpX3J1bl9xdWV1ZSBpcyBpbnZva2VkIHdoaWNoCi0JICogbWF5IGhhcHBlbiBiZWNhdXNlIHNjc2lfdW5wcmVwX3JlcXVlc3QoKSBwdXRzIHRoZSBjb21tYW5kIHdoaWNoCi0JICogcmVsZWFzZXMgaXRzIHJlZmVyZW5jZSBvbiB0aGUgZGV2aWNlLgotCSAqLwotCWdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQlzY3NpX3VucHJlcF9yZXF1ZXN0KHJlcSk7CisJYmxrX3VucHJlcF9yZXF1ZXN0KHJlcSk7CisJcmVxLT5zcGVjaWFsID0gTlVMTDsKKwlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CiAJYmxrX3JlcXVldWVfcmVxdWVzdChxLCByZXEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCkBAIC01MjAsMTMgKzQ5Nyw5IEBACiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBzZGV2LT5yZXF1ZXN0X3F1ZXVlOwogCi0JLyogbmVlZCB0byBob2xkIGEgcmVmZXJlbmNlIG9uIHRoZSBkZXZpY2UgYmVmb3JlIHdlIGxldCBnbyBvZiB0aGUgY21kICovCi0JZ2V0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwotCiAJc2NzaV9wdXRfY29tbWFuZChjbWQpOwogCXNjc2lfcnVuX3F1ZXVlKHEpOwogCi0JLyogb2sgdG8gcmVtb3ZlIGRldmljZSBub3cgKi8KIAlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiB9CiAKQEAgLTc4OCw2ICs3NjEsNyBAQAogCWVudW0ge0FDVElPTl9GQUlMLCBBQ1RJT05fUkVQUkVQLCBBQ1RJT05fUkVUUlksCiAJICAgICAgQUNUSU9OX0RFTEFZRURfUkVUUll9IGFjdGlvbjsKIAljaGFyICpkZXNjcmlwdGlvbiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB3YWl0X2ZvciA9IChjbWQtPmFsbG93ZWQgKyAxKSAqIHJlcS0+dGltZW91dDsKIAogCWlmIChyZXN1bHQpIHsKIAkJc2Vuc2VfdmFsaWQgPSBzY3NpX2NvbW1hbmRfbm9ybWFsaXplX3NlbnNlKGNtZCwgJnNzaGRyKTsKQEAgLTk4OSw2ICs5NjMsMTIgQEAKIAkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CiAJfQogCisJaWYgKGFjdGlvbiAhPSBBQ1RJT05fRkFJTCAmJgorCSAgICB0aW1lX2JlZm9yZShjbWQtPmppZmZpZXNfYXRfYWxsb2MgKyB3YWl0X2ZvciwgamlmZmllcykpIHsKKwkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CisJCWRlc2NyaXB0aW9uID0gIkNvbW1hbmQgdGltZWQgb3V0IjsKKwl9CisKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQUNUSU9OX0ZBSUw6CiAJCS8qIEdpdmUgdXAgYW5kIGZhaWwgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVxdWVzdCAqLwpAQCAtMTExMSw2ICsxMDkxLDcgQEAKIAlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCWNtZC0+cmVxdWVzdC0+c3BlY2lhbCA9IE5VTEw7CiAJc2NzaV9wdXRfY29tbWFuZChjbWQpOworCXB1dF9kZXZpY2UoJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldik7CiAJcmV0dXJuIGVycm9yOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX2luaXRfaW8pOwpAQCAtMTEyMSw5ICsxMTAyLDE1IEBACiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCiAJaWYgKCFyZXEtPnNwZWNpYWwpIHsKLQkJY21kID0gc2NzaV9nZXRfY29tbWFuZChzZGV2LCBHRlBfQVRPTUlDKTsKLQkJaWYgKHVubGlrZWx5KCFjbWQpKQorCQkvKiBCYWlsIGlmIHdlIGNhbid0IGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlICovCisJCWlmICghZ2V0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpKQogCQkJcmV0dXJuIE5VTEw7CisKKwkJY21kID0gc2NzaV9nZXRfY29tbWFuZChzZGV2LCBHRlBfQVRPTUlDKTsKKwkJaWYgKHVubGlrZWx5KCFjbWQpKSB7CisJCQlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCQlyZXEtPnNwZWNpYWwgPSBjbWQ7CiAJfSBlbHNlIHsKIAkJY21kID0gcmVxLT5zcGVjaWFsOwpAQCAtMTI4Niw2ICsxMjczLDcgQEAKIAkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHJlcS0+c3BlY2lhbDsKIAkJCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CiAJCQlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CisJCQlwdXRfZGV2aWNlKCZjbWQtPmRldmljZS0+c2Rldl9nZW5kZXYpOwogCQkJcmVxLT5zcGVjaWFsID0gTlVMTDsKIAkJfQogCQlicmVhazsKQEAgLTE1NDMsMTYgKzE1MzEsMTQgQEAKICAqIExvY2sgc3RhdHVzOiBJTyByZXF1ZXN0IGxvY2sgYXNzdW1lZCB0byBiZSBoZWxkIHdoZW4gY2FsbGVkLgogICovCiBzdGF0aWMgdm9pZCBzY3NpX3JlcXVlc3RfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCisJX19yZWxlYXNlcyhxLT5xdWV1ZV9sb2NrKQorCV9fYWNxdWlyZXMocS0+cXVldWVfbG9jaykKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAKLQlpZighZ2V0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpKQotCQkvKiBXZSBtdXN0IGJlIHRlYXJpbmcgdGhlIGJsb2NrIHF1ZXVlIGRvd24gYWxyZWFkeSAqLwotCQlyZXR1cm47Ci0KIAkvKgogCSAqIFRvIHN0YXJ0IHdpdGgsIHdlIGtlZXAgbG9vcGluZyB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHksIG9yIHVudGlsCiAJICogdGhlIGhvc3QgaXMgbm8gbG9uZ2VyIGFibGUgdG8gYWNjZXB0IGFueSBtb3JlIHJlcXVlc3RzLgpAQCAtMTY0MSw3ICsxNjI3LDcgQEAKIAkJCWdvdG8gb3V0X2RlbGF5OwogCX0KIAotCWdvdG8gb3V0OworCXJldHVybjsKIAogIG5vdF9yZWFkeToKIAlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CkBAIC0xNjYwLDEyICsxNjQ2LDYgQEAKIG91dF9kZWxheToKIAlpZiAoc2Rldi0+ZGV2aWNlX2J1c3kgPT0gMCkKIAkJYmxrX2RlbGF5X3F1ZXVlKHEsIFNDU0lfUVVFVUVfREVMQVkpOwotb3V0OgotCS8qIG11c3QgYmUgY2FyZWZ1bCBoZXJlLi4uaWYgd2UgdHJpZ2dlciB0aGUgLT5yZW1vdmUoKSBmdW5jdGlvbgotCSAqIHdlIGNhbm5vdCBiZSBob2xkaW5nIHRoZSBxIGxvY2sgKi8KLQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwotCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiB9CiAKIHU2NCBzY3NpX2NhbGN1bGF0ZV9ib3VuY2VfbGltaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKaW5kZXggMzA3YTgxMS4uMjdmOTZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMzIwLDYgKzMyMCw3IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2LT5wYXJlbnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzdGFyZ2V0LT5zdGF0ZSA9IFNUQVJHRVRfREVMOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZShkZXYpOwogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlpZiAoc2hvc3QtPmhvc3R0LT50YXJnZXRfZGVzdHJveSkKQEAgLTM3MSw2ICszNzIsMzcgQEAKIH0KIAogLyoqCisgKiBzY3NpX3RhcmdldF9yZWFwX3JlZl9yZWxlYXNlIC0gcmVtb3ZlIHRhcmdldCBmcm9tIHZpc2liaWxpdHkKKyAqIEBrcmVmOiB0aGUgcmVhcF9yZWYgaW4gdGhlIHRhcmdldCBiZWluZyByZWxlYXNlZAorICoKKyAqIENhbGxlZCBvbiBsYXN0IHB1dCBvZiByZWFwX3JlZiwgd2hpY2ggaXMgdGhlIGluZGljYXRpb24gdGhhdCBubyBkZXZpY2UKKyAqIHVuZGVyIHRoaXMgdGFyZ2V0IGlzIHZpc2libGUgYW55bW9yZSwgc28gcmVuZGVyIHRoZSB0YXJnZXQgaW52aXNpYmxlIGluCisgKiBzeXNmcy4gIE5vdGU6IHdlIGhhdmUgdG8gYmUgaW4gdXNlciBjb250ZXh0IGhlcmUgYmVjYXVzZSB0aGUgdGFyZ2V0IHJlYXBzCisgKiBzaG91bGQgYmUgZG9uZSBpbiBwbGFjZXMgd2hlcmUgdGhlIHNjc2kgZGV2aWNlIHZpc2liaWxpdHkgaXMgYmVpbmcgcmVtb3ZlZC4KKyAqLworc3RhdGljIHZvaWQgc2NzaV90YXJnZXRfcmVhcF9yZWZfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQKKwkJPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHNjc2lfdGFyZ2V0LCByZWFwX3JlZik7CisKKwkvKgorCSAqIGlmIHdlIGdldCBoZXJlIGFuZCB0aGUgdGFyZ2V0IGlzIHN0aWxsIGluIHRoZSBDUkVBVEVEIHN0YXRlIHRoYXQKKwkgKiBtZWFucyBpdCB3YXMgYWxsb2NhdGVkIGJ1dCBuZXZlciBtYWRlIHZpc2libGUgKGJlY2F1c2UgYSBzY2FuCisJICogdHVybmVkIHVwIG5vIExVTnMpLCBzbyBkb24ndCBjYWxsIGRldmljZV9kZWwoKSBvbiBpdC4KKwkgKi8KKwlpZiAoc3RhcmdldC0+c3RhdGUgIT0gU1RBUkdFVF9DUkVBVEVEKSB7CisJCXRyYW5zcG9ydF9yZW1vdmVfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCQlkZXZpY2VfZGVsKCZzdGFyZ2V0LT5kZXYpOworCX0KKwlzY3NpX3RhcmdldF9kZXN0cm95KHN0YXJnZXQpOworfQorCitzdGF0aWMgdm9pZCBzY3NpX3RhcmdldF9yZWFwX3JlZl9wdXQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCWtyZWZfcHV0KCZzdGFyZ2V0LT5yZWFwX3JlZiwgc2NzaV90YXJnZXRfcmVhcF9yZWZfcmVsZWFzZSk7Cit9CisKKy8qKgogICogc2NzaV9hbGxvY190YXJnZXQgLSBhbGxvY2F0ZSBhIG5ldyBvciBmaW5kIGFuIGV4aXN0aW5nIHRhcmdldAogICogQHBhcmVudDoJcGFyZW50IG9mIHRoZSB0YXJnZXQgKG5lZWQgbm90IGJlIGEgc2NzaSBob3N0KQogICogQGNoYW5uZWw6CXRhcmdldCBjaGFubmVsIG51bWJlciAoemVybyBpZiBubyBjaGFubmVscykKQEAgLTM5Miw3ICs0MjQsNyBAQAogCQkrIHNob3N0LT50cmFuc3BvcnR0LT50YXJnZXRfc2l6ZTsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpmb3VuZF90YXJnZXQ7Ci0JaW50IGVycm9yOworCWludCBlcnJvciwgcmVmX2dvdDsKIAogCXN0YXJnZXQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghc3RhcmdldCkgewpAQCAtNDAxLDcgKzQzMyw3IEBACiAJfQogCWRldiA9ICZzdGFyZ2V0LT5kZXY7CiAJZGV2aWNlX2luaXRpYWxpemUoZGV2KTsKLQlzdGFyZ2V0LT5yZWFwX3JlZiA9IDE7CisJa3JlZl9pbml0KCZzdGFyZ2V0LT5yZWFwX3JlZik7CiAJZGV2LT5wYXJlbnQgPSBnZXRfZGV2aWNlKHBhcmVudCk7CiAJZGV2X3NldF9uYW1lKGRldiwgInRhcmdldCVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIGlkKTsKIAlkZXYtPmJ1cyA9ICZzY3NpX2J1c190eXBlOwpAQCAtNDQxLDI5ICs0NzMsMzYgQEAKIAlyZXR1cm4gc3RhcmdldDsKIAogIGZvdW5kOgotCWZvdW5kX3RhcmdldC0+cmVhcF9yZWYrKzsKKwkvKgorCSAqIHJlbGVhc2Ugcm91dGluZSBhbHJlYWR5IGZpcmVkIGlmIGtyZWYgaXMgemVybywgc28gaWYgd2UgY2FuIHN0aWxsCisJICogdGFrZSB0aGUgcmVmZXJlbmNlLCB0aGUgdGFyZ2V0IG11c3QgYmUgYWxpdmUuICBJZiB3ZSBjYW4ndCwgaXQgbXVzdAorCSAqIGJlIGR5aW5nIGFuZCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGEgbmV3IHRhcmdldAorCSAqLworCXJlZl9nb3QgPSBrcmVmX2dldF91bmxlc3NfemVybygmZm91bmRfdGFyZ2V0LT5yZWFwX3JlZik7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlpZiAoZm91bmRfdGFyZ2V0LT5zdGF0ZSAhPSBTVEFSR0VUX0RFTCkgeworCWlmIChyZWZfZ290KSB7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAkJcmV0dXJuIGZvdW5kX3RhcmdldDsKIAl9Ci0JLyogVW5mb3J0dW5hdGVseSwgd2UgZm91bmQgYSBkeWluZyB0YXJnZXQ7IG5lZWQgdG8KLQkgKiB3YWl0IHVudGlsIGl0J3MgZGVhZCBiZWZvcmUgd2UgY2FuIGdldCBhIG5ldyBvbmUgKi8KKwkvKgorCSAqIFVuZm9ydHVuYXRlbHksIHdlIGZvdW5kIGEgZHlpbmcgdGFyZ2V0OyBuZWVkIHRvIHdhaXQgdW50aWwgaXQncworCSAqIGRlYWQgYmVmb3JlIHdlIGNhbiBnZXQgYSBuZXcgb25lLiAgVGhlcmUgaXMgYW4gYW5vbWFseSBoZXJlLiAgV2UKKwkgKiAqc2hvdWxkKiBjYWxsIHNjc2lfdGFyZ2V0X3JlYXAoKSB0byBiYWxhbmNlIHRoZSBrcmVmX2dldCgpIG9mIHRoZQorCSAqIHJlYXBfcmVmIGFib3ZlLiAgSG93ZXZlciwgc2luY2UgdGhlIHRhcmdldCBiZWluZyByZWxlYXNlZCwgaXQncworCSAqIGFscmVhZHkgaW52aXNpYmxlIGFuZCB0aGUgcmVhcF9yZWYgaXMgaXJyZWxldmFudC4gIElmIHdlIGNhbGwKKwkgKiBzY3NpX3RhcmdldF9yZWFwKCkgd2UgbWlnaHQgc3B1cmlvdXNseSBkbyBhbm90aGVyIGRldmljZV9kZWwoKSBvbgorCSAqIGFuIGFscmVhZHkgaW52aXNpYmxlIHRhcmdldC4KKwkgKi8KIAlwdXRfZGV2aWNlKCZmb3VuZF90YXJnZXQtPmRldik7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkvKgorCSAqIGxlbmd0aCBvZiB0aW1lIGlzIGlycmVsZXZhbnQgaGVyZSwgd2UganVzdCB3YW50IHRvIHlpZWxkIHRoZSBDUFUKKwkgKiBmb3IgYSB0aWNrIHRvIGF2b2lkIGJ1c3kgd2FpdGluZyBmb3IgdGhlIHRhcmdldCB0byBkaWUuCisJICovCisJbXNsZWVwKDEpOwogCWdvdG8gcmV0cnk7CiB9CiAKLXN0YXRpYyB2b2lkIHNjc2lfdGFyZ2V0X3JlYXBfdXNlcmNvbnRleHQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NzaV90YXJnZXQsIGV3LndvcmspOwotCi0JdHJhbnNwb3J0X3JlbW92ZV9kZXZpY2UoJnN0YXJnZXQtPmRldik7Ci0JZGV2aWNlX2RlbCgmc3RhcmdldC0+ZGV2KTsKLQlzY3NpX3RhcmdldF9kZXN0cm95KHN0YXJnZXQpOwotfQotCiAvKioKICAqIHNjc2lfdGFyZ2V0X3JlYXAgLSBjaGVjayB0byBzZWUgaWYgdGFyZ2V0IGlzIGluIHVzZSBhbmQgZGVzdHJveSBpZiBub3QKICAqIEBzdGFyZ2V0OiB0YXJnZXQgdG8gYmUgY2hlY2tlZApAQCAtNDc0LDI4ICs1MTMsMTMgQEAKICAqLwogdm9pZCBzY3NpX3RhcmdldF9yZWFwKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWVudW0gc2NzaV90YXJnZXRfc3RhdGUgc3RhdGU7Ci0JaW50IGVtcHR5ID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlzdGF0ZSA9IHN0YXJnZXQtPnN0YXRlOwotCWlmICgtLXN0YXJnZXQtPnJlYXBfcmVmID09IDAgJiYgbGlzdF9lbXB0eSgmc3RhcmdldC0+ZGV2aWNlcykpIHsKLQkJZW1wdHkgPSAxOwotCQlzdGFyZ2V0LT5zdGF0ZSA9IFNUQVJHRVRfREVMOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQotCWlmICghZW1wdHkpCi0JCXJldHVybjsKLQotCUJVR19PTihzdGF0ZSA9PSBTVEFSR0VUX0RFTCk7Ci0JaWYgKHN0YXRlID09IFNUQVJHRVRfQ1JFQVRFRCkKLQkJc2NzaV90YXJnZXRfZGVzdHJveShzdGFyZ2V0KTsKLQllbHNlCi0JCWV4ZWN1dGVfaW5fcHJvY2Vzc19jb250ZXh0KHNjc2lfdGFyZ2V0X3JlYXBfdXNlcmNvbnRleHQsCi0JCQkJCSAgICZzdGFyZ2V0LT5ldyk7CisJLyoKKwkgKiBzZXJpb3VzIHByb2JsZW0gaWYgdGhpcyB0cmlnZ2VyczogU1RBUkdFVF9ERUwgaXMgb25seSBzZXQgaW4gdGhlIGlmCisJICogdGhlIHJlYXBfcmVmIGRyb3BzIHRvIHplcm8sIHNvIHdlJ3JlIHRyeWluZyB0byBkbyBhbm90aGVyIGZpbmFsIHB1dAorCSAqIG9uIGFuIGFscmVhZHkgcmVsZWFzZWQga3JlZgorCSAqLworCUJVR19PTihzdGFyZ2V0LT5zdGF0ZSA9PSBTVEFSR0VUX0RFTCk7CisJc2NzaV90YXJnZXRfcmVhcF9yZWZfcHV0KHN0YXJnZXQpOwogfQogCiAvKioKQEAgLTk0Niw2ICs5NzAsOSBAQAogCQl9CiAJfQogCisJaWYgKHNkZXYtPnNjc2lfbGV2ZWwgPj0gU0NTSV8zKQorCQlzY3NpX2F0dGFjaF92cGQoc2Rldik7CisKIAlzZGV2LT5tYXhfcXVldWVfZGVwdGggPSBzZGV2LT5xdWV1ZV9kZXB0aDsKIAogCS8qCkBAIC0xNTMyLDYgKzE1NTksMTAgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJc2NzaV9hdXRvcG1fcHV0X3RhcmdldChzdGFyZ2V0KTsKKwkvKgorCSAqIHBhaXJlZCB3aXRoIHNjc2lfYWxsb2NfdGFyZ2V0KCkuICBUYXJnZXQgd2lsbCBiZSBkZXN0cm95ZWQgdW5sZXNzCisJICogc2NzaV9wcm9iZV9hbmRfYWRkX2x1biBtYWRlIGFuIHVuZGVybHlpbmcgZGV2aWNlIHZpc2libGUKKwkgKi8KIAlzY3NpX3RhcmdldF9yZWFwKHN0YXJnZXQpOwogCXB1dF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CiAKQEAgLTE2MTIsOCArMTY0MywxMCBAQAogCiAgb3V0X3JlYXA6CiAJc2NzaV9hdXRvcG1fcHV0X3RhcmdldChzdGFyZ2V0KTsKLQkvKiBub3cgZGV0ZXJtaW5lIGlmIHRoZSB0YXJnZXQgaGFzIGFueSBjaGlsZHJlbiBhdCBhbGwKLQkgKiBhbmQgaWYgbm90LCBudWtlIGl0ICovCisJLyoKKwkgKiBwYWlyZWQgd2l0aCBzY3NpX2FsbG9jX3RhcmdldCgpOiBkZXRlcm1pbmUgaWYgdGhlIHRhcmdldCBoYXMKKwkgKiBhbnkgY2hpbGRyZW4gYXQgYWxsIGFuZCBpZiBub3QsIG51a2UgaXQKKwkgKi8KIAlzY3NpX3RhcmdldF9yZWFwKHN0YXJnZXQpOwogCiAJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IDkxMTdkMGIuLjA3NGU4Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMzAwLDcgKzMwMCw5IEBACiAJaW50IHJldCA9IC1FSU5WQUw7CiAJdW5zaWduZWQgbG9uZyBkZWFkbGluZSwgZmxhZ3M7CiAKLQlpZiAoc2hvc3QtPnRyYW5zcG9ydHQgJiYgc2hvc3QtPnRyYW5zcG9ydHQtPmVoX3N0cmF0ZWd5X2hhbmRsZXIpCisJaWYgKHNob3N0LT50cmFuc3BvcnR0ICYmCisJICAgIChzaG9zdC0+dHJhbnNwb3J0dC0+ZWhfc3RyYXRlZ3lfaGFuZGxlciB8fAorCSAgICAgIXNob3N0LT5ob3N0dC0+ZWhfaG9zdF9yZXNldF9oYW5kbGVyKSkKIAkJcmV0dXJuIHJldDsKIAogCWlmICghc3RybmNtcChidWYsICJvZmYiLCBzdHJsZW4oIm9mZiIpKSkKQEAgLTM4MywxNyArMzg1LDE0IEBACiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKLQlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqdGhpcywgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc2RldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UsIGV3LndvcmspOwogCiAJcGFyZW50ID0gc2Rldi0+c2Rldl9nZW5kZXYucGFyZW50OwotCXN0YXJnZXQgPSB0b19zY3NpX3RhcmdldChwYXJlbnQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0Jc3RhcmdldC0+cmVhcF9yZWYrKzsKIAlsaXN0X2RlbCgmc2Rldi0+c2libGluZ3MpOwogCWxpc3RfZGVsKCZzZGV2LT5zYW1lX3RhcmdldF9zaWJsaW5ncyk7CiAJbGlzdF9kZWwoJnNkZXYtPnN0YXJ2ZWRfZW50cnkpOwpAQCAtNDEzLDggKzQxMiw4IEBACiAJLyogTlVMTCBxdWV1ZSBtZWFucyB0aGUgZGV2aWNlIGNhbid0IGJlIHVzZWQgKi8KIAlzZGV2LT5yZXF1ZXN0X3F1ZXVlID0gTlVMTDsKIAotCXNjc2lfdGFyZ2V0X3JlYXAoc2NzaV90YXJnZXQoc2RldikpOwotCisJa2ZyZWUoc2Rldi0+dnBkX3BnODMpOworCWtmcmVlKHNkZXYtPnZwZF9wZzgwKTsKIAlrZnJlZShzZGV2LT5pbnF1aXJ5KTsKIAlrZnJlZShzZGV2KTsKIApAQCAtNTc5LDcgKzU3OCw2IEBACiAgKiBDcmVhdGUgdGhlIGFjdHVhbCBzaG93L3N0b3JlIGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgogICovCiBzZGV2X3JkX2F0dHIgKGRldmljZV9ibG9ja2VkLCAiJWRcbiIpOwotc2Rldl9yZF9hdHRyIChxdWV1ZV9kZXB0aCwgIiVkXG4iKTsKIHNkZXZfcmRfYXR0ciAoZGV2aWNlX2J1c3ksICIlZFxuIik7CiBzZGV2X3JkX2F0dHIgKHR5cGUsICIlZFxuIik7CiBzZGV2X3JkX2F0dHIgKHNjc2lfbGV2ZWwsICIlZFxuIik7CkBAIC02NDksMjMgKzY0NywxMiBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKHJlc2NhbiwgU19JV1VTUiwgTlVMTCwgc3RvcmVfcmVzY2FuX2ZpZWxkKTsKIAotc3RhdGljIHZvaWQgc2Rldl9zdG9yZV9kZWxldGVfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2KQotewotCXNjc2lfcmVtb3ZlX2RldmljZSh0b19zY3NpX2RldmljZShkZXYpKTsKLX0KLQogc3RhdGljIHNzaXplX3QKIHNkZXZfc3RvcmVfZGVsZXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50IHJjOwotCi0JLyogQW4gYXR0cmlidXRlIGNhbm5vdCBiZSB1bnJlZ2lzdGVyZWQgYnkgb25lIG9mIGl0cyBvd24gbWV0aG9kcywKLQkgKiBzbyB3ZSBoYXZlIHRvIHVzZSB0aGlzIHJvdW5kYWJvdXQgYXBwcm9hY2guCi0JICovCi0JcmMgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soZGV2LCBzZGV2X3N0b3JlX2RlbGV0ZV9jYWxsYmFjayk7Ci0JaWYgKHJjKQotCQljb3VudCA9IHJjOworCWlmIChkZXZpY2VfcmVtb3ZlX2ZpbGVfc2VsZihkZXYsIGF0dHIpKQorCQlzY3NpX3JlbW92ZV9kZXZpY2UodG9fc2NzaV9kZXZpY2UoZGV2KSk7CiAJcmV0dXJuIGNvdW50OwogfTsKIHN0YXRpYyBERVZJQ0VfQVRUUihkZWxldGUsIFNfSVdVU1IsIE5VTEwsIHNkZXZfc3RvcmVfZGVsZXRlKTsKQEAgLTcyMywxMCArNzEwLDY0IEBACiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlc1xuIiwgbmFtZSk7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihxdWV1ZV90eXBlLCBTX0lSVUdPLCBzaG93X3F1ZXVlX3R5cGVfZmllbGQsIE5VTEwpOworc3RhdGljIHNzaXplX3QKK3N0b3JlX3F1ZXVlX3R5cGVfZmllbGQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0ID0gc2Rldi0+aG9zdC0+aG9zdHQ7CisJaW50IHRhZ190eXBlID0gMCwgcmV0dmFsOworCWludCBwcmV2X3RhZ190eXBlID0gc2NzaV9nZXRfdGFnX3R5cGUoc2Rldik7CisKKwlpZiAoIXNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgfHwgIXNodC0+Y2hhbmdlX3F1ZXVlX3R5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0cm5jbXAoYnVmLCAib3JkZXJlZCIsIDcpID09IDApCisJCXRhZ190eXBlID0gTVNHX09SREVSRURfVEFHOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAic2ltcGxlIiwgNikgPT0gMCkKKwkJdGFnX3R5cGUgPSBNU0dfU0lNUExFX1RBRzsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgIm5vbmUiLCA0KSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YWdfdHlwZSA9PSBwcmV2X3RhZ190eXBlKQorCQlyZXR1cm4gY291bnQ7CisKKwlyZXR2YWwgPSBzaHQtPmNoYW5nZV9xdWV1ZV90eXBlKHNkZXYsIHRhZ190eXBlKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHF1ZXVlX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3F1ZXVlX3R5cGVfZmllbGQsCisJCSAgIHN0b3JlX3F1ZXVlX3R5cGVfZmllbGQpOworCisjZGVmaW5lIHNkZXZfdnBkX3BnX2F0dHIoX3BhZ2UpCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJXAorc2hvd192cGRfIyNfcGFnZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCVwKKwkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwJCQlcCisJCSBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsJXAorCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CQkJXAorCWlmICghc2Rldi0+dnBkXyMjX3BhZ2UpCQkJCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJcmV0dXJuIG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsCQlcCisJCQkJICAgICAgIHNkZXYtPnZwZF8jI19wYWdlLAkJXAorCQkJCSAgICAgICBzZGV2LT52cGRfIyNfcGFnZSMjX2xlbik7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZGV2X2F0dHJfdnBkXyMjX3BhZ2UgPSB7CQlcCisJLmF0dHIgPQl7Lm5hbWUgPSBfX3N0cmluZ2lmeSh2cGRfIyNfcGFnZSksIC5tb2RlID0gU19JUlVHTyB9LAlcCisJLnNpemUgPSAwLAkJCQkJCQlcCisJLnJlYWQgPSBzaG93X3ZwZF8jI19wYWdlLAkJCQkJXAorfTsKKworc2Rldl92cGRfcGdfYXR0cihwZzgzKTsKK3NkZXZfdnBkX3BnX2F0dHIocGc4MCk7CiAKIHN0YXRpYyBzc2l6ZV90Ci1zaG93X2lvc3RhdF9jb3VudGVyYml0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCQkJY2hhciAqYnVmKQorc2hvd19pb3N0YXRfY291bnRlcmJpdHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVkXG4iLCAoaW50KXNpemVvZihhdG9taWNfdCkgKiA4KTsKIH0KQEAgLTc5Nyw0NiArODM4LDkgQEAKIERFQ0xBUkVfRVZUKG1vZGVfcGFyYW1ldGVyX2NoYW5nZV9yZXBvcnRlZCwgTU9ERV9QQVJBTUVURVJfQ0hBTkdFX1JFUE9SVEVEKQogREVDTEFSRV9FVlQobHVuX2NoYW5nZV9yZXBvcnRlZCwgTFVOX0NIQU5HRV9SRVBPUlRFRCkKIAotLyogRGVmYXVsdCB0ZW1wbGF0ZSBmb3IgZGV2aWNlIGF0dHJpYnV0ZXMuICBNYXkgTk9UIGJlIG1vZGlmaWVkICovCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2NzaV9zZGV2X2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX2RldmljZV9ibG9ja2VkLmF0dHIsCi0JJmRldl9hdHRyX3R5cGUuYXR0ciwKLQkmZGV2X2F0dHJfc2NzaV9sZXZlbC5hdHRyLAotCSZkZXZfYXR0cl9kZXZpY2VfYnVzeS5hdHRyLAotCSZkZXZfYXR0cl92ZW5kb3IuYXR0ciwKLQkmZGV2X2F0dHJfbW9kZWwuYXR0ciwKLQkmZGV2X2F0dHJfcmV2LmF0dHIsCi0JJmRldl9hdHRyX3Jlc2Nhbi5hdHRyLAotCSZkZXZfYXR0cl9kZWxldGUuYXR0ciwKLQkmZGV2X2F0dHJfc3RhdGUuYXR0ciwKLQkmZGV2X2F0dHJfdGltZW91dC5hdHRyLAotCSZkZXZfYXR0cl9laF90aW1lb3V0LmF0dHIsCi0JJmRldl9hdHRyX2lvY291bnRlcmJpdHMuYXR0ciwKLQkmZGV2X2F0dHJfaW9yZXF1ZXN0X2NudC5hdHRyLAotCSZkZXZfYXR0cl9pb2RvbmVfY250LmF0dHIsCi0JJmRldl9hdHRyX2lvZXJyX2NudC5hdHRyLAotCSZkZXZfYXR0cl9tb2RhbGlhcy5hdHRyLAotCVJFRl9FVlQobWVkaWFfY2hhbmdlKSwKLQlSRUZfRVZUKGlucXVpcnlfY2hhbmdlX3JlcG9ydGVkKSwKLQlSRUZfRVZUKGNhcGFjaXR5X2NoYW5nZV9yZXBvcnRlZCksCi0JUkVGX0VWVChzb2Z0X3RocmVzaG9sZF9yZWFjaGVkKSwKLQlSRUZfRVZUKG1vZGVfcGFyYW1ldGVyX2NoYW5nZV9yZXBvcnRlZCksCi0JUkVGX0VWVChsdW5fY2hhbmdlX3JlcG9ydGVkKSwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzY3NpX3NkZXZfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPQlzY3NpX3NkZXZfYXR0cnMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqc2NzaV9zZGV2X2F0dHJfZ3JvdXBzW10gPSB7Ci0JJnNjc2lfc2Rldl9hdHRyX2dyb3VwLAotCU5VTEwKLX07Ci0KIHN0YXRpYyBzc2l6ZV90Ci1zZGV2X3N0b3JlX3F1ZXVlX2RlcHRoX3J3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc2Rldl9zdG9yZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IGRlcHRoLCByZXR2YWw7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKQEAgLTg1OSwxMCArODYzLDEwIEBACiAKIAlyZXR1cm4gY291bnQ7CiB9CitzZGV2X3Nob3dfZnVuY3Rpb24ocXVldWVfZGVwdGgsICIlZFxuIik7CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzZGV2X2F0dHJfcXVldWVfZGVwdGhfcncgPQotCV9fQVRUUihxdWV1ZV9kZXB0aCwgU19JUlVHTyB8IFNfSVdVU1IsIHNkZXZfc2hvd19xdWV1ZV9kZXB0aCwKLQkgICAgICAgc2Rldl9zdG9yZV9xdWV1ZV9kZXB0aF9ydyk7CitzdGF0aWMgREVWSUNFX0FUVFIocXVldWVfZGVwdGgsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGV2X3Nob3dfcXVldWVfZGVwdGgsCisJCSAgIHNkZXZfc3RvcmVfcXVldWVfZGVwdGgpOwogCiBzdGF0aWMgc3NpemVfdAogc2Rldl9zaG93X3F1ZXVlX3JhbXBfdXBfcGVyaW9kKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTg5MCw0MCArODk0LDc5IEBACiAJcmV0dXJuIHBlcmlvZDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNkZXZfYXR0cl9xdWV1ZV9yYW1wX3VwX3BlcmlvZCA9Ci0JX19BVFRSKHF1ZXVlX3JhbXBfdXBfcGVyaW9kLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkgICAgICAgc2Rldl9zaG93X3F1ZXVlX3JhbXBfdXBfcGVyaW9kLAotCSAgICAgICBzZGV2X3N0b3JlX3F1ZXVlX3JhbXBfdXBfcGVyaW9kKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihxdWV1ZV9yYW1wX3VwX3BlcmlvZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNkZXZfc2hvd19xdWV1ZV9yYW1wX3VwX3BlcmlvZCwKKwkJICAgc2Rldl9zdG9yZV9xdWV1ZV9yYW1wX3VwX3BlcmlvZCk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1zZGV2X3N0b3JlX3F1ZXVlX3R5cGVfcncoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyB1bW9kZV90IHNjc2lfc2Rldl9hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaSkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSBzZGV2LT5ob3N0LT5ob3N0dDsKLQlpbnQgdGFnX3R5cGUgPSAwLCByZXR2YWw7Ci0JaW50IHByZXZfdGFnX3R5cGUgPSBzY3NpX2dldF90YWdfdHlwZShzZGV2KTsKIAotCWlmICghc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCB8fCAhc2h0LT5jaGFuZ2VfcXVldWVfdHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoc3RybmNtcChidWYsICJvcmRlcmVkIiwgNykgPT0gMCkKLQkJdGFnX3R5cGUgPSBNU0dfT1JERVJFRF9UQUc7Ci0JZWxzZSBpZiAoc3RybmNtcChidWYsICJzaW1wbGUiLCA2KSA9PSAwKQotCQl0YWdfdHlwZSA9IE1TR19TSU1QTEVfVEFHOwotCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpICE9IDApCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChhdHRyID09ICZkZXZfYXR0cl9xdWV1ZV9kZXB0aC5hdHRyICYmCisJICAgICFzZGV2LT5ob3N0LT5ob3N0dC0+Y2hhbmdlX3F1ZXVlX2RlcHRoKQorCQlyZXR1cm4gU19JUlVHTzsKIAotCWlmICh0YWdfdHlwZSA9PSBwcmV2X3RhZ190eXBlKQotCQlyZXR1cm4gY291bnQ7CisJaWYgKGF0dHIgPT0gJmRldl9hdHRyX3F1ZXVlX3JhbXBfdXBfcGVyaW9kLmF0dHIgJiYKKwkgICAgIXNkZXYtPmhvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfZGVwdGgpCisJCXJldHVybiAwOwogCi0JcmV0dmFsID0gc2h0LT5jaGFuZ2VfcXVldWVfdHlwZShzZGV2LCB0YWdfdHlwZSk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7CisJaWYgKGF0dHIgPT0gJmRldl9hdHRyX3F1ZXVlX3R5cGUuYXR0ciAmJgorCSAgICAhc2Rldi0+aG9zdC0+aG9zdHQtPmNoYW5nZV9xdWV1ZV90eXBlKQorCQlyZXR1cm4gU19JUlVHTzsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gYXR0ci0+bW9kZTsKIH0KIAorLyogRGVmYXVsdCB0ZW1wbGF0ZSBmb3IgZGV2aWNlIGF0dHJpYnV0ZXMuICBNYXkgTk9UIGJlIG1vZGlmaWVkICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2NzaV9zZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2RldmljZV9ibG9ja2VkLmF0dHIsCisJJmRldl9hdHRyX3R5cGUuYXR0ciwKKwkmZGV2X2F0dHJfc2NzaV9sZXZlbC5hdHRyLAorCSZkZXZfYXR0cl9kZXZpY2VfYnVzeS5hdHRyLAorCSZkZXZfYXR0cl92ZW5kb3IuYXR0ciwKKwkmZGV2X2F0dHJfbW9kZWwuYXR0ciwKKwkmZGV2X2F0dHJfcmV2LmF0dHIsCisJJmRldl9hdHRyX3Jlc2Nhbi5hdHRyLAorCSZkZXZfYXR0cl9kZWxldGUuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdGUuYXR0ciwKKwkmZGV2X2F0dHJfdGltZW91dC5hdHRyLAorCSZkZXZfYXR0cl9laF90aW1lb3V0LmF0dHIsCisJJmRldl9hdHRyX2lvY291bnRlcmJpdHMuYXR0ciwKKwkmZGV2X2F0dHJfaW9yZXF1ZXN0X2NudC5hdHRyLAorCSZkZXZfYXR0cl9pb2RvbmVfY250LmF0dHIsCisJJmRldl9hdHRyX2lvZXJyX2NudC5hdHRyLAorCSZkZXZfYXR0cl9tb2RhbGlhcy5hdHRyLAorCSZkZXZfYXR0cl9xdWV1ZV9kZXB0aC5hdHRyLAorCSZkZXZfYXR0cl9xdWV1ZV90eXBlLmF0dHIsCisJJmRldl9hdHRyX3F1ZXVlX3JhbXBfdXBfcGVyaW9kLmF0dHIsCisJUkVGX0VWVChtZWRpYV9jaGFuZ2UpLAorCVJFRl9FVlQoaW5xdWlyeV9jaGFuZ2VfcmVwb3J0ZWQpLAorCVJFRl9FVlQoY2FwYWNpdHlfY2hhbmdlX3JlcG9ydGVkKSwKKwlSRUZfRVZUKHNvZnRfdGhyZXNob2xkX3JlYWNoZWQpLAorCVJFRl9FVlQobW9kZV9wYXJhbWV0ZXJfY2hhbmdlX3JlcG9ydGVkKSwKKwlSRUZfRVZUKGx1bl9jaGFuZ2VfcmVwb3J0ZWQpLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqc2NzaV9zZGV2X2Jpbl9hdHRyc1tdID0geworCSZkZXZfYXR0cl92cGRfcGc4MywKKwkmZGV2X2F0dHJfdnBkX3BnODAsCisJTlVMTAorfTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjc2lfc2Rldl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9CXNjc2lfc2Rldl9hdHRycywKKwkuYmluX2F0dHJzID0Jc2NzaV9zZGV2X2Jpbl9hdHRycywKKwkuaXNfdmlzaWJsZSA9CXNjc2lfc2Rldl9hdHRyX2lzX3Zpc2libGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqc2NzaV9zZGV2X2F0dHJfZ3JvdXBzW10gPSB7CisJJnNjc2lfc2Rldl9hdHRyX2dyb3VwLAorCU5VTEwKK307CisKIHN0YXRpYyBpbnQgc2NzaV90YXJnZXRfYWRkKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKIAlpbnQgZXJyb3I7CkBAIC05NDYsMTAgKzk4OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzZGV2X2F0dHJfcXVldWVfdHlwZV9ydyA9Ci0JX19BVFRSKHF1ZXVlX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3F1ZXVlX3R5cGVfZmllbGQsCi0JICAgICAgIHNkZXZfc3RvcmVfcXVldWVfdHlwZV9ydyk7Ci0KIC8qKgogICogc2NzaV9zeXNmc19hZGRfc2RldiAtIGFkZCBzY3NpIGRldmljZSB0byBzeXNmcwogICogQHNkZXY6CXNjc2lfZGV2aWNlIHRvIGFkZApAQCAtMTAwMywyNSArMTA0Miw2IEBACiAJdHJhbnNwb3J0X2FkZF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIAlzZGV2LT5pc192aXNpYmxlID0gMTsKIAotCS8qIGNyZWF0ZSBxdWV1ZSBmaWxlcywgd2hpY2ggbWF5IGJlIHdyaXRhYmxlLCBkZXBlbmRpbmcgb24gdGhlIGhvc3QgKi8KLQlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCkgewotCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2Rldi0+c2Rldl9nZW5kZXYsCi0JCQkJCSAgICZzZGV2X2F0dHJfcXVldWVfZGVwdGhfcncpOwotCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2Rldi0+c2Rldl9nZW5kZXYsCi0JCQkJCSAgICZzZGV2X2F0dHJfcXVldWVfcmFtcF91cF9wZXJpb2QpOwotCX0KLQllbHNlCi0JCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5zZGV2X2dlbmRldiwgJmRldl9hdHRyX3F1ZXVlX2RlcHRoKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+Y2hhbmdlX3F1ZXVlX3R5cGUpCi0JCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5zZGV2X2dlbmRldiwgJnNkZXZfYXR0cl9xdWV1ZV90eXBlX3J3KTsKLQllbHNlCi0JCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5zZGV2X2dlbmRldiwgJmRldl9hdHRyX3F1ZXVlX3R5cGUpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCiAJZXJyb3IgPSBic2dfcmVnaXN0ZXJfcXVldWUocnEsICZzZGV2LT5zZGV2X2dlbmRldiwgTlVMTCwgTlVMTCk7CiAKIAlpZiAoZXJyb3IpCkBAIC0xMDcxLDYgKzEwOTEsMTMgQEAKIAkJc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2Rlc3Ryb3koc2Rldik7CiAJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKGRldik7CiAKKwkvKgorCSAqIFBhaXJlZCB3aXRoIHRoZSBrcmVmX2dldCgpIGluIHNjc2lfc3lzZnNfaW5pdGlhbGl6ZSgpLiAgV2UgaGF2ZQorCSAqIHJlbW9lZCBzeXNmcyB2aXNpYmlsaXR5IGZyb20gdGhlIGRldmljZSwgc28gbWFrZSB0aGUgdGFyZ2V0CisJICogaW52aXNpYmxlIGlmIHRoaXMgd2FzIHRoZSBsYXN0IGRldmljZSB1bmRlcm5lYXRoIGl0LgorCSAqLworCXNjc2lfdGFyZ2V0X3JlYXAoc2NzaV90YXJnZXQoc2RldikpOworCiAJcHV0X2RldmljZShkZXYpOwogfQogCkBAIC0xMTMzLDcgKzExNjAsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChzdGFyZ2V0LT5kZXYucGFyZW50ID09IGRldiB8fCAmc3RhcmdldC0+ZGV2ID09IGRldikgewogCQkJLyogYXNzdW1pbmcgbmV3IHRhcmdldHMgYXJyaXZlIGF0IHRoZSBlbmQgKi8KLQkJCXN0YXJnZXQtPnJlYXBfcmVmKys7CisJCQlrcmVmX2dldCgmc3RhcmdldC0+cmVhcF9yZWYpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCQlpZiAobGFzdCkKIAkJCQlzY3NpX3RhcmdldF9yZWFwKGxhc3QpOwpAQCAtMTIxNyw2ICsxMjQ0LDEyIEBACiAJbGlzdF9hZGRfdGFpbCgmc2Rldi0+c2FtZV90YXJnZXRfc2libGluZ3MsICZzdGFyZ2V0LT5kZXZpY2VzKTsKIAlsaXN0X2FkZF90YWlsKCZzZGV2LT5zaWJsaW5ncywgJnNob3N0LT5fX2RldmljZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCS8qCisJICogZGV2aWNlIGNhbiBub3cgb25seSBiZSByZW1vdmVkIHZpYSBfX3Njc2lfcmVtb3ZlX2RldmljZSgpIHNvIGhvbGQKKwkgKiB0aGUgdGFyZ2V0LiAgVGFyZ2V0IHdpbGwgYmUgaGVsZCBpbiBDUkVBVEVEIHN0YXRlIHVudGlsIHNvbWV0aGluZworCSAqIGJlbmVhdGggaXQgYmVjb21lcyB2aXNpYmxlIChpbiB3aGljaCBjYXNlIGl0IG1vdmVzIHRvIFJVTk5JTkcpCisJICovCisJa3JlZl9nZXQoJnN0YXJnZXQtPnJlYXBfcmVmKTsKIH0KIAogaW50IHNjc2lfaXNfc2Rldl9kZXZpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2xpYi5jCmluZGV4IDg0YTFmZGYuLmU1MWFkZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMKQEAgLTE1NSw3ICsxNTUsOCBAQAogCV9fYmxrX3B1dF9yZXF1ZXN0KHEsIHJxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAotCV9fc2NzaV9wdXRfY29tbWFuZChzaG9zdCwgY21kLCAmc2hvc3QtPnNob3N0X2dlbmRldik7CisJX19zY3NpX3B1dF9jb21tYW5kKHNob3N0LCBjbWQpOworCXB1dF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV9ob3N0X3B1dF9jb21tYW5kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwppbmRleCA0NjI4ZmQ1Li5mODA5MDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpAQCAtMjYxLDYgKzI2MSw3IEBACiAJeyBGQ19QT1JUU1BFRURfMTBHQklULAkJIjEwIEdiaXQiIH0sCiAJeyBGQ19QT1JUU1BFRURfOEdCSVQsCQkiOCBHYml0IiB9LAogCXsgRkNfUE9SVFNQRUVEXzE2R0JJVCwJCSIxNiBHYml0IiB9LAorCXsgRkNfUE9SVFNQRUVEXzMyR0JJVCwJCSIzMiBHYml0IiB9LAogCXsgRkNfUE9SVFNQRUVEX05PVF9ORUdPVElBVEVELAkiTm90IE5lZ290aWF0ZWQiIH0sCiB9OwogZmNfYml0ZmllbGRfbmFtZV9zZWFyY2gocG9ydF9zcGVlZCwgZmNfcG9ydF9zcGVlZF9uYW1lcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggNDcwOTU0YS4uODllNmMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTE0NjMsOCArMTQ2Myw4IEBACiAJCQlzZF9wcmludF9zZW5zZV9oZHIoc2RrcCwgJnNzaGRyKTsKIAkJLyogd2UgbmVlZCB0byBldmFsdWF0ZSB0aGUgZXJyb3IgcmV0dXJuICAqLwogCQlpZiAoc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpICYmCi0JCQkvKiAweDNhIGlzIG1lZGl1bSBub3QgcHJlc2VudCAqLwotCQkJc3NoZHIuYXNjID09IDB4M2EpCisJCQkoc3NoZHIuYXNjID09IDB4M2EgfHwJLyogbWVkaXVtIG5vdCBwcmVzZW50ICovCisJCQkgc3NoZHIuYXNjID09IDB4MjApKQkvKiBpbnZhbGlkIGNvbW1hbmQgKi8KIAkJCQkvKiB0aGlzIGlzIG5vIGVycm9yIGhlcmUgKi8KIAkJCQlyZXR1cm4gMDsKIApAQCAtMjI4MSw3ICsyMjgxLDcgQEAKIAogCXNldF9kaXNrX3JvKHNka3AtPmRpc2ssIDApOwogCWlmIChzZHAtPnNraXBfbXNfcGFnZV8zZikgewotCQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJBc3N1bWluZyBXcml0ZSBFbmFibGVkXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiQXNzdW1pbmcgV3JpdGUgRW5hYmxlZFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIzMTMsNyArMjMxMyw3IEBACiAJfQogCiAJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpIHsKLQkJc2RfcHJpbnRrKEtFUk5fV0FSTklORywgc2RrcCwKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fV0FSTklORywgc2RrcCwKIAkJCSAgIlRlc3QgV1AgZmFpbGVkLCBhc3N1bWUgV3JpdGUgRW5hYmxlZFxuIik7CiAJfSBlbHNlIHsKIAkJc2RrcC0+d3JpdGVfcHJvdCA9ICgoZGF0YS5kZXZpY2Vfc3BlY2lmaWMgJiAweDgwKSAhPSAwKTsKQEAgLTIzODEsNyArMjM4MSw4IEBACiAJaWYgKCFkYXRhLmhlYWRlcl9sZW5ndGgpIHsKIAkJbW9kZXBhZ2UgPSA2OwogCQlmaXJzdF9sZW4gPSAwOwotCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJNaXNzaW5nIGhlYWRlciBpbiBNT0RFX1NFTlNFIHJlc3BvbnNlXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLAorCQkJCSJNaXNzaW5nIGhlYWRlciBpbiBNT0RFX1NFTlNFIHJlc3BvbnNlXG4iKTsKIAl9CiAKIAkvKiB0aGF0IHdlbnQgT0ssIG5vdyBhc2sgZm9yIHRoZSBwcm9wZXIgbGVuZ3RoICovCkBAIC0yMzk0LDcgKzIzOTUsNyBAQAogCWlmIChsZW4gPCAzKQogCQlnb3RvIGJhZF9zZW5zZTsKIAllbHNlIGlmIChsZW4gPiBTRF9CVUZfU0laRSkgewotCQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJUcnVuY2F0aW5nIG1vZGUgcGFyYW1ldGVyICIKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiVHJ1bmNhdGluZyBtb2RlIHBhcmFtZXRlciAiCiAJCQkgICJkYXRhIGZyb20gJWQgdG8gJWQgYnl0ZXNcbiIsIGxlbiwgU0RfQlVGX1NJWkUpOwogCQlsZW4gPSBTRF9CVUZfU0laRTsKIAl9CkBAIC0yNDE3LDggKzI0MTgsOSBAQAogCQkJCS8qIFdlJ3JlIGludGVyZXN0ZWQgb25seSBpbiB0aGUgZmlyc3QgMyBieXRlcy4KIAkJCQkgKi8KIAkJCQlpZiAobGVuIC0gb2Zmc2V0IDw9IDIpIHsKLQkJCQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiSW5jb21wbGV0ZSAiCi0JCQkJCQkgICJtb2RlIHBhcmFtZXRlciBkYXRhXG4iKTsKKwkJCQkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLAorCQkJCQkJIkluY29tcGxldGUgbW9kZSBwYXJhbWV0ZXIgIgorCQkJCQkJCSJkYXRhXG4iKTsKIAkJCQkJZ290byBkZWZhdWx0czsKIAkJCQl9IGVsc2UgewogCQkJCQltb2RlcGFnZSA9IHBhZ2VfY29kZTsKQEAgLTI0MzIsMTQgKzI0MzQsMTUgQEAKIAkJCQllbHNlIGlmICghc3BmICYmIGxlbiAtIG9mZnNldCA+IDEpCiAJCQkJCW9mZnNldCArPSAyICsgYnVmZmVyW29mZnNldCsxXTsKIAkJCQllbHNlIHsKLQkJCQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiSW5jb21wbGV0ZSAiCi0JCQkJCQkgICJtb2RlIHBhcmFtZXRlciBkYXRhXG4iKTsKKwkJCQkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLAorCQkJCQkJCSJJbmNvbXBsZXRlIG1vZGUgIgorCQkJCQkJCSJwYXJhbWV0ZXIgZGF0YVxuIik7CiAJCQkJCWdvdG8gZGVmYXVsdHM7CiAJCQkJfQogCQkJfQogCQl9CiAKLQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiTm8gQ2FjaGluZyBtb2RlIHBhZ2UgZm91bmRcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJObyBDYWNoaW5nIG1vZGUgcGFnZSBmb3VuZFxuIik7CiAJCWdvdG8gZGVmYXVsdHM7CiAKIAlQYWdlX2ZvdW5kOgpAQCAtMjQ1Myw3ICsyNDU2LDcgQEAKIAogCQlzZGtwLT5EUE9GVUEgPSAoZGF0YS5kZXZpY2Vfc3BlY2lmaWMgJiAweDEwKSAhPSAwOwogCQlpZiAoc2RrcC0+RFBPRlVBICYmICFzZGtwLT5kZXZpY2UtPnVzZV8xMF9mb3JfcncpIHsKLQkJCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwKKwkJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwKIAkJCQkgICJVc2VzIFJFQUQvV1JJVEUoNiksIGRpc2FibGluZyBGVUFcbiIpOwogCQkJc2RrcC0+RFBPRlVBID0gMDsKIAkJfQpAQCAtMjQ3NSwxNiArMjQ3OCwxOSBAQAogCSAgICBzc2hkci5zZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUICYmCiAJICAgIHNzaGRyLmFzYyA9PSAweDI0ICYmIHNzaGRyLmFzY3EgPT0gMHgwKQogCQkvKiBJbnZhbGlkIGZpZWxkIGluIENEQiAqLwotCQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJDYWNoZSBkYXRhIHVuYXZhaWxhYmxlXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiQ2FjaGUgZGF0YSB1bmF2YWlsYWJsZVxuIik7CiAJZWxzZQotCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJBc2tpbmcgZm9yIGNhY2hlIGRhdGEgZmFpbGVkXG4iKTsKKwkJc2RfZmlyc3RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLAorCQkJCSJBc2tpbmcgZm9yIGNhY2hlIGRhdGEgZmFpbGVkXG4iKTsKIAogZGVmYXVsdHM6CiAJaWYgKHNkcC0+d2NlX2RlZmF1bHRfb24pIHsKLQkJc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiQXNzdW1pbmcgZHJpdmUgY2FjaGU6IHdyaXRlIGJhY2tcbiIpOworCQlzZF9maXJzdF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsCisJCQkJIkFzc3VtaW5nIGRyaXZlIGNhY2hlOiB3cml0ZSBiYWNrXG4iKTsKIAkJc2RrcC0+V0NFID0gMTsKIAl9IGVsc2UgewotCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgdGhyb3VnaFxuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX0VSUiwgc2RrcCwKKwkJCQkiQXNzdW1pbmcgZHJpdmUgY2FjaGU6IHdyaXRlIHRocm91Z2hcbiIpOwogCQlzZGtwLT5XQ0UgPSAwOwogCX0KIAlzZGtwLT5SQ0QgPSAwOwpAQCAtMjUxMyw3ICsyNTE5LDcgQEAKIAogCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyZXMpIHx8ICFkYXRhLmhlYWRlcl9sZW5ndGggfHwKIAkgICAgZGF0YS5sZW5ndGggPCA2KSB7Ci0JCXNkX3ByaW50ayhLRVJOX1dBUk5JTkcsIHNka3AsCisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNka3AsCiAJCQkgICJnZXR0aW5nIENvbnRyb2wgbW9kZSBwYWdlIGZhaWxlZCwgYXNzdW1lIG5vIEFUT1xuIik7CiAKIAkJaWYgKHNjc2lfc2Vuc2VfdmFsaWQoJnNzaGRyKSkKQEAgLTI1MjUsNyArMjUzMSw3IEBACiAJb2Zmc2V0ID0gZGF0YS5oZWFkZXJfbGVuZ3RoICsgZGF0YS5ibG9ja19kZXNjcmlwdG9yX2xlbmd0aDsKIAogCWlmICgoYnVmZmVyW29mZnNldF0gJiAweDNmKSAhPSAweDBhKSB7Ci0JCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIkFUTyBHb3Qgd3JvbmcgcGFnZVxuIik7CisJCXNkX2ZpcnN0X3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIkFUTyBHb3Qgd3JvbmcgcGFnZVxuIik7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5oIGIvZHJpdmVycy9zY3NpL3NkLmgKaW5kZXggMjY4OTVmZi4uNjIwODcxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmgKKysrIGIvZHJpdmVycy9zY3NpL3NkLmgKQEAgLTEwNCw2ICsxMDQsMTIgQEAKIAkJICAgIChzZHNrKS0+ZGlzay0+ZGlza19uYW1lLCAjI2EpIDoJCQlcCiAJc2Rldl9wcmludGsocHJlZml4LCAoc2RzayktPmRldmljZSwgZm10LCAjI2EpCiAKKyNkZWZpbmUgc2RfZmlyc3RfcHJpbnRrKHByZWZpeCwgc2RzaywgZm10LCBhLi4uKQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICgoc2RrcCktPmZpcnN0X3NjYW4pCQkJCQlcCisJCQlzZF9wcmludGsocHJlZml4LCBzZHNrLCBmbXQsICMjYSk7CQlcCisJfSB3aGlsZSAoMCkKKwogc3RhdGljIGlubGluZSBpbnQgc2NzaV9tZWRpdW1fYWNjZXNzX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKIHsKIAlzd2l0Y2ggKHNjbWQtPmNtbmRbMF0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZXMuYyBiL2RyaXZlcnMvc2NzaS9zZXMuYwppbmRleCBlYmExODNjLi44MGJmZWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2VzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Nlcy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZW5jbG9zdXJlLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTQ0OCwyNyArNDQ5LDE4IEBACiBzdGF0aWMgdm9pZCBzZXNfbWF0Y2hfdG9fZW5jbG9zdXJlKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAogCQkJCSAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKLQl1bnNpZ25lZCBjaGFyICpidWY7CiAJdW5zaWduZWQgY2hhciAqZGVzYzsKLQl1bnNpZ25lZCBpbnQgdnBkX2xlbjsKIAlzdHJ1Y3QgZWZkIGVmZCA9IHsKIAkJLmFkZHIgPSAwLAogCX07CiAKLQlidWYgPSBrbWFsbG9jKElOSVRfQUxMT0NfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYgfHwgc2NzaV9nZXRfdnBkX3BhZ2Uoc2RldiwgMHg4MywgYnVmLCBJTklUX0FMTE9DX1NJWkUpKQotCQlnb3RvIGZyZWU7Ci0KIAlzZXNfZW5jbG9zdXJlX2RhdGFfcHJvY2VzcyhlZGV2LCB0b19zY3NpX2RldmljZShlZGV2LT5lZGV2LnBhcmVudCksIDApOwogCi0JdnBkX2xlbiA9ICgoYnVmWzJdIDw8IDgpIHwgYnVmWzNdKSArIDQ7Ci0Ja2ZyZWUoYnVmKTsKLQlidWYgPSBrbWFsbG9jKHZwZF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghYnVmIHx8c2NzaV9nZXRfdnBkX3BhZ2Uoc2RldiwgMHg4MywgYnVmLCB2cGRfbGVuKSkKLQkJZ290byBmcmVlOworCWlmICghc2Rldi0+dnBkX3BnODNfbGVuKQorCQlyZXR1cm47CiAKLQlkZXNjID0gYnVmICsgNDsKLQl3aGlsZSAoZGVzYyA8IGJ1ZiArIHZwZF9sZW4pIHsKKwlkZXNjID0gc2Rldi0+dnBkX3BnODMgKyA0OworCXdoaWxlIChkZXNjIDwgc2Rldi0+dnBkX3BnODMgKyBzZGV2LT52cGRfcGc4M19sZW4pIHsKIAkJZW51bSBzY3NpX3Byb3RvY29sIHByb3RvID0gZGVzY1swXSA+PiA0OwogCQl1OCBjb2RlX3NldCA9IGRlc2NbMF0gJiAweDBmOwogCQl1OCBwaXYgPSBkZXNjWzFdICYgMHg4MDsKQEAgLTQ3OCwyNSArNDcwLDE1IEBACiAKIAkJaWYgKHBpdiAmJiBjb2RlX3NldCA9PSAxICYmIGFzc29jID09IDEKIAkJICAgICYmIHByb3RvID09IFNDU0lfUFJPVE9DT0xfU0FTICYmIHR5cGUgPT0gMyAmJiBsZW4gPT0gOCkKLQkJCWVmZC5hZGRyID0gKHU2NClkZXNjWzRdIDw8IDU2IHwKLQkJCQkodTY0KWRlc2NbNV0gPDwgNDggfAotCQkJCSh1NjQpZGVzY1s2XSA8PCA0MCB8Ci0JCQkJKHU2NClkZXNjWzddIDw8IDMyIHwKLQkJCQkodTY0KWRlc2NbOF0gPDwgMjQgfAotCQkJCSh1NjQpZGVzY1s5XSA8PCAxNiB8Ci0JCQkJKHU2NClkZXNjWzEwXSA8PCA4IHwKLQkJCQkodTY0KWRlc2NbMTFdOworCQkJZWZkLmFkZHIgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJmRlc2NbNF0pOwogCiAJCWRlc2MgKz0gbGVuICsgNDsKIAl9Ci0JaWYgKCFlZmQuYWRkcikKLQkJZ290byBmcmVlOworCWlmIChlZmQuYWRkcikgeworCQllZmQuZGV2ID0gJnNkZXYtPnNkZXZfZ2VuZGV2OwogCi0JZWZkLmRldiA9ICZzZGV2LT5zZGV2X2dlbmRldjsKLQotCWVuY2xvc3VyZV9mb3JfZWFjaF9kZXZpY2Uoc2VzX2VuY2xvc3VyZV9maW5kX2J5X2FkZHIsICZlZmQpOwotIGZyZWU6Ci0Ja2ZyZWUoYnVmKTsKKwkJZW5jbG9zdXJlX2Zvcl9lYWNoX2RldmljZShzZXNfZW5jbG9zdXJlX2ZpbmRfYnlfYWRkciwgJmVmZCk7CisJfQogfQogCiBzdGF0aWMgaW50IHNlc19pbnRmX2FkZChzdHJ1Y3QgZGV2aWNlICpjZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCBhMWQ2OTg2Li5hZmM4MzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMjE5OCwxMiArMjE5OCwxOSBAQAogCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CiAJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOwogCXN0cnVjdCBjZGV2ICpjZDAsICpjZDE7CisJc3RydWN0IGRldmljZSAqZDAsICpkMTsKIAogCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOwogCWlmICghU1RtLT5kZWZpbmVkKSB7Ci0JCWNkMCA9IFNUbS0+Y2RldnNbMF07IGNkMSA9IFNUbS0+Y2RldnNbMV07CisJCWNkMCA9IFNUbS0+Y2RldnNbMF07CisJCWNkMSA9IFNUbS0+Y2RldnNbMV07CisJCWQwICA9IFNUbS0+ZGV2c1swXTsKKwkJZDEgID0gU1RtLT5kZXZzWzFdOwogCQltZW1jcHkoU1RtLCAmKFNUcC0+bW9kZXNbMF0pLCBzaXplb2Yoc3RydWN0IHN0X21vZGVkZWYpKTsKLQkJU1RtLT5jZGV2c1swXSA9IGNkMDsgU1RtLT5jZGV2c1sxXSA9IGNkMTsKKwkJU1RtLT5jZGV2c1swXSA9IGNkMDsKKwkJU1RtLT5jZGV2c1sxXSA9IGNkMTsKKwkJU1RtLT5kZXZzWzBdICA9IGQwOworCQlTVG0tPmRldnNbMV0gID0gZDE7CiAJCW1vZGVzX2RlZmluZWQgPSAxOwogICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEluaXRpYWxpemVkIG1vZGUgJWQgZGVmaW5pdGlvbiBmcm9tIG1vZGUgMFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS90MTI4LmMgYi9kcml2ZXJzL3Njc2kvdDEyOC5jCmluZGV4IGYxZTRiNDEuLmE0YWJjZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS90MTI4LmMKKysrIGIvZHJpdmVycy9zY3NpL3QxMjguYwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJICAgIGluc3RhbmNlLT5pcnEgPSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwgVDEyOF9JUlFTKTsKIAogCWlmIChpbnN0YW5jZS0+aXJxICE9IFNDU0lfSVJRX05PTkUpIAotCSAgICBpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgdDEyOF9pbnRyLCBJUlFGX0RJU0FCTEVELCAidDEyOCIsCisJICAgIGlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCB0MTI4X2ludHIsIDAsICJ0MTI4IiwKIAkJCSAgICBpbnN0YW5jZSkpIHsKIAkJcHJpbnRrKCJzY3NpJWQgOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwgCiAJCSAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jIGIvZHJpdmVycy9zY3NpL3UxNC0zNGYuYwppbmRleCA5YzIxNmU1Li41YTAzYmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCisrKyBiL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKQEAgLTg3Myw3ICs4NzMsNyBAQAogCiAgICAvKiBCb2FyZCBkZXRlY3RlZCwgYWxsb2NhdGUgaXRzIElSUSAqLwogICAgaWYgKHJlcXVlc3RfaXJxKGlycSwgZG9faW50ZXJydXB0X2hhbmRsZXIsCi0gICAgICAgICAgICAgSVJRRl9ESVNBQkxFRCB8ICgoc3VidmVyc2lvbiA9PSBFU0EpID8gSVJRRl9TSEFSRUQgOiAwKSwKKyAgICAgICAgICAgICAoc3VidmVyc2lvbiA9PSBFU0EpID8gSVJRRl9TSEFSRUQgOiAwLAogICAgICAgICAgICAgIGRyaXZlcl9uYW1lLCAodm9pZCAqKSAmc2hhW2pdKSkgewogICAgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAldSwgZGV0YWNoaW5nLlxuIiwgbmFtZSwgaXJxKTsKICAgICAgIGdvdG8gZnJlZWxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5jIGIvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuYwppbmRleCBiOTc1NWVjLi5jODhlMTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogTGludXggZHJpdmVyIGZvciBWTXdhcmUncyBwYXJhLXZpcnR1YWxpemVkIFNDU0kgSEJBLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDE0LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAKICNpbmNsdWRlICJ2bXdfcHZzY3NpLmgiCiAKQEAgLTQ0LDcgKzQ1LDcgQEAKIAogI2RlZmluZSBQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfUEVSX1JJTkcJOAogI2RlZmluZSBQVlNDU0lfREVGQVVMVF9OVU1fUEFHRVNfTVNHX1JJTkcJMQotI2RlZmluZSBQVlNDU0lfREVGQVVMVF9RVUVVRV9ERVBUSAkJNjQKKyNkZWZpbmUgUFZTQ1NJX0RFRkFVTFRfUVVFVUVfREVQVEgJCTI1NAogI2RlZmluZSBTR0xfU0laRQkJCQlQQUdFX1NJWkUKIAogc3RydWN0IHB2c2NzaV9zZ19saXN0IHsKQEAgLTYyLDYgKzYzLDcgQEAKIAlkbWFfYWRkcl90CQlkYXRhUEE7CiAJZG1hX2FkZHJfdAkJc2Vuc2VQQTsKIAlkbWFfYWRkcl90CQlzZ2xQQTsKKwlzdHJ1Y3QgY29tcGxldGlvbgkqYWJvcnRfY21wOwogfTsKIAogc3RydWN0IHB2c2NzaV9hZGFwdGVyIHsKQEAgLTcxLDYgKzczLDcgQEAKIAlib29sCQkJCXVzZV9tc2k7CiAJYm9vbAkJCQl1c2VfbXNpeDsKIAlib29sCQkJCXVzZV9tc2c7CisJYm9vbAkJCQl1c2VfcmVxX3RocmVzaG9sZDsKIAogCXNwaW5sb2NrX3QJCQlod19sb2NrOwogCkBAIC0xMDIsMTggKzEwNSwyMiBAQAogCiAKIC8qIENvbW1hbmQgbGluZSBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IHB2c2NzaV9yaW5nX3BhZ2VzICAgICA9IFBWU0NTSV9ERUZBVUxUX05VTV9QQUdFU19QRVJfUklORzsKK3N0YXRpYyBpbnQgcHZzY3NpX3JpbmdfcGFnZXM7CiBzdGF0aWMgaW50IHB2c2NzaV9tc2dfcmluZ19wYWdlcyA9IFBWU0NTSV9ERUZBVUxUX05VTV9QQUdFU19NU0dfUklORzsKIHN0YXRpYyBpbnQgcHZzY3NpX2NtZF9wZXJfbHVuICAgID0gUFZTQ1NJX0RFRkFVTFRfUVVFVUVfREVQVEg7CiBzdGF0aWMgYm9vbCBwdnNjc2lfZGlzYWJsZV9tc2k7CiBzdGF0aWMgYm9vbCBwdnNjc2lfZGlzYWJsZV9tc2l4Owogc3RhdGljIGJvb2wgcHZzY3NpX3VzZV9tc2cgICAgICAgPSB0cnVlOworc3RhdGljIGJvb2wgcHZzY3NpX3VzZV9yZXFfdGhyZXNob2xkID0gdHJ1ZTsKIAogI2RlZmluZSBQVlNDU0lfUlcgKFNfSVJVU1IgfCBTX0lXVVNSKQogCiBtb2R1bGVfcGFyYW1fbmFtZWQocmluZ19wYWdlcywgcHZzY3NpX3JpbmdfcGFnZXMsIGludCwgUFZTQ1NJX1JXKTsKIE1PRFVMRV9QQVJNX0RFU0MocmluZ19wYWdlcywgIk51bWJlciBvZiBwYWdlcyBwZXIgcmVxL2NtcCByaW5nIC0gKGRlZmF1bHQ9IgotCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HKSAiKSIpOworCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HKQorCQkgIlt1cCB0byAxNiB0YXJnZXRzXSwiCisJCSBfX3N0cmluZ2lmeShQVlNDU0lfU0VUVVBfUklOR1NfTUFYX05VTV9QQUdFUykKKwkJICJbZm9yIDE2KyB0YXJnZXRzXSkiKTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKG1zZ19yaW5nX3BhZ2VzLCBwdnNjc2lfbXNnX3JpbmdfcGFnZXMsIGludCwgUFZTQ1NJX1JXKTsKIE1PRFVMRV9QQVJNX0RFU0MobXNnX3JpbmdfcGFnZXMsICJOdW1iZXIgb2YgcGFnZXMgZm9yIHRoZSBtc2cgcmluZyAtIChkZWZhdWx0PSIKQEAgLTEyMSw3ICsxMjgsNyBAQAogCiBtb2R1bGVfcGFyYW1fbmFtZWQoY21kX3Blcl9sdW4sIHB2c2NzaV9jbWRfcGVyX2x1biwgaW50LCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyhjbWRfcGVyX2x1biwgIk1heGltdW0gY29tbWFuZHMgcGVyIGx1biAtIChkZWZhdWx0PSIKLQkJIF9fc3RyaW5naWZ5KFBWU0NTSV9NQVhfUkVRX1FVRVVFX0RFUFRIKSAiKSIpOworCQkgX19zdHJpbmdpZnkoUFZTQ1NJX0RFRkFVTFRfUVVFVUVfREVQVEgpICIpIik7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX21zaSwgcHZzY3NpX2Rpc2FibGVfbXNpLCBib29sLCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX21zaSwgIkRpc2FibGUgTVNJIHVzZSBpbiBkcml2ZXIgLSAoZGVmYXVsdD0wKSIpOwpAQCAtMTMyLDYgKzEzOSwxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9tc2csIHB2c2NzaV91c2VfbXNnLCBib29sLCBQVlNDU0lfUlcpOwogTU9EVUxFX1BBUk1fREVTQyh1c2VfbXNnLCAiVXNlIG1zZyByaW5nIHdoZW4gYXZhaWxhYmxlIC0gKGRlZmF1bHQ9MSkiKTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9yZXFfdGhyZXNob2xkLCBwdnNjc2lfdXNlX3JlcV90aHJlc2hvbGQsCisJCSAgIGJvb2wsIFBWU0NTSV9SVyk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9yZXFfdGhyZXNob2xkLCAiVXNlIGRyaXZlci1iYXNlZCByZXF1ZXN0IGNvYWxlc2NpbmcgaWYgY29uZmlndXJlZCAtIChkZWZhdWx0PTEpIik7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwdnNjc2lfcGNpX3RibFtdID0gewogCXsgUENJX1ZERVZJQ0UoVk1XQVJFLCBQQ0lfREVWSUNFX0lEX1ZNV0FSRV9QVlNDU0kpIH0sCiAJeyAwIH0KQEAgLTE3Nyw2ICsxODgsNyBAQAogCQkJCSAgIHN0cnVjdCBwdnNjc2lfY3R4ICpjdHgpCiB7CiAJY3R4LT5jbWQgPSBOVUxMOworCWN0eC0+YWJvcnRfY21wID0gTlVMTDsKIAlsaXN0X2FkZCgmY3R4LT5saXN0LCAmYWRhcHRlci0+Y21kX3Bvb2wpOwogfQogCkBAIC0yODAsMTAgKzI5MiwxNSBAQAogc3RhdGljIHZvaWQgcHZzY3NpX2tpY2tfaW8oY29uc3Qgc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgdW5zaWduZWQgY2hhciBvcCkKIHsKLQlpZiAoc2NzaV9pc19ydyhvcCkpCi0JCXB2c2NzaV9raWNrX3J3X2lvKGFkYXB0ZXIpOwotCWVsc2UKKwlpZiAoc2NzaV9pc19ydyhvcCkpIHsKKwkJc3RydWN0IFBWU0NTSVJpbmdzU3RhdGUgKnMgPSBhZGFwdGVyLT5yaW5nc19zdGF0ZTsKKworCQlpZiAoIWFkYXB0ZXItPnVzZV9yZXFfdGhyZXNob2xkIHx8CisJCSAgICBzLT5yZXFQcm9kSWR4IC0gcy0+cmVxQ29uc0lkeCA+PSBzLT5yZXFDYWxsVGhyZXNob2xkKQorCQkJcHZzY3NpX2tpY2tfcndfaW8oYWRhcHRlcik7CisJfSBlbHNlIHsKIAkJcHZzY3NpX3Byb2Nlc3NfcmVxdWVzdF9yaW5nKGFkYXB0ZXIpOworCX0KIH0KIAogc3RhdGljIHZvaWQgbGxfYWRhcHRlcl9yZXNldChjb25zdCBzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00ODcsNiArNTA0LDM1IEBACiAJfQogfQogCitzdGF0aWMgaW50IHB2c2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCSAgICAgaW50IHFkZXB0aCwKKwkJCQkgICAgIGludCByZWFzb24pCit7CisJaW50IG1heF9kZXB0aDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CisKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCS8qCisJCSAqIFdlIHN1cHBvcnQgb25seSBjaGFuZ2luZyBkZWZhdWx0LgorCQkgKi8KKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWF4X2RlcHRoID0gc2hvc3QtPmNhbl9xdWV1ZTsKKwlpZiAoIXNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCW1heF9kZXB0aCA9IDE7CisJaWYgKHFkZXB0aCA+IG1heF9kZXB0aCkKKwkJcWRlcHRoID0gbWF4X2RlcHRoOworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBxZGVwdGgpOworCisJaWYgKHNkZXYtPmlucXVpcnlfbGVuID4gNykKKwkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LAorCQkJICAgICJxZGVwdGgoJWQpLCB0YWdnZWQoJWQpLCBzaW1wbGUoJWQpLCBvcmRlcmVkKCVkKSwgc2NzaV9sZXZlbCglZCksIGNtZF9xdWUoJWQpXG4iLAorCQkJICAgIHNkZXYtPnF1ZXVlX2RlcHRoLCBzZGV2LT50YWdnZWRfc3VwcG9ydGVkLAorCQkJICAgIHNkZXYtPnNpbXBsZV90YWdzLCBzZGV2LT5vcmRlcmVkX3RhZ3MsCisJCQkgICAgc2Rldi0+c2NzaV9sZXZlbCwgKHNkZXYtPmlucXVpcnlbN10gJiAyKSA+PiAxKTsKKwlyZXR1cm4gc2Rldi0+cXVldWVfZGVwdGg7Cit9CisKIC8qCiAgKiBQdWxsIGEgY29tcGxldGlvbiBkZXNjcmlwdG9yIG9mZiBhbmQgcGFzcyB0aGUgY29tcGxldGlvbiBiYWNrCiAgKiB0byB0aGUgU0NTSSBtaWQgbGF5ZXIuCkBAIC00OTYsMTUgKzU0MiwyNyBAQAogewogCXN0cnVjdCBwdnNjc2lfY3R4ICpjdHg7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBjb21wbGV0aW9uICphYm9ydF9jbXA7CiAJdTMyIGJ0c3RhdCA9IGUtPmhvc3RTdGF0dXM7CiAJdTMyIHNkc3RhdCA9IGUtPnNjc2lTdGF0dXM7CiAKIAljdHggPSBwdnNjc2lfZ2V0X2NvbnRleHQoYWRhcHRlciwgZS0+Y29udGV4dCk7CiAJY21kID0gY3R4LT5jbWQ7CisJYWJvcnRfY21wID0gY3R4LT5hYm9ydF9jbXA7CiAJcHZzY3NpX3VubWFwX2J1ZmZlcnMoYWRhcHRlciwgY3R4KTsKIAlwdnNjc2lfcmVsZWFzZV9jb250ZXh0KGFkYXB0ZXIsIGN0eCk7Ci0JY21kLT5yZXN1bHQgPSAwOworCWlmIChhYm9ydF9jbXApIHsKKwkJLyoKKwkJICogVGhlIGNvbW1hbmQgd2FzIHJlcXVlc3RlZCB0byBiZSBhYm9ydGVkLiBKdXN0IHNpZ25hbCB0aGF0CisJCSAqIHRoZSByZXF1ZXN0IGNvbXBsZXRlZCBhbmQgc3dhbGxvdyB0aGUgYWN0dWFsIGNtZCBjb21wbGV0aW9uCisJCSAqIGhlcmUuIFRoZSBhYm9ydCBoYW5kbGVyIHdpbGwgcG9zdCBhIGNvbXBsZXRpb24gZm9yIHRoaXMKKwkJICogY29tbWFuZCBpbmRpY2F0aW5nIHRoYXQgaXQgZ290IHN1Y2Nlc3NmdWxseSBhYm9ydGVkLgorCQkgKi8KKwkJY29tcGxldGUoYWJvcnRfY21wKTsKKwkJcmV0dXJuOworCX0KIAorCWNtZC0+cmVzdWx0ID0gMDsKIAlpZiAoc2RzdGF0ICE9IFNBTV9TVEFUX0dPT0QgJiYKIAkgICAgKGJ0c3RhdCA9PSBCVFNUQVRfU1VDQ0VTUyB8fAogCSAgICAgYnRzdGF0ID09IEJUU1RBVF9MSU5LRURfQ09NTUFORF9DT01QTEVURUQgfHwKQEAgLTcyNiw2ICs3ODQsOCBAQAogCXN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOwogCXN0cnVjdCBwdnNjc2lfY3R4ICpjdHg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWx0ID0gU1VDQ0VTUzsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhhYm9ydF9jbXApOwogCiAJc2NtZF9wcmludGsoS0VSTl9ERUJVRywgY21kLCAidGFzayBhYm9ydCBvbiBob3N0ICV1LCAlcFxuIiwKIAkJICAgIGFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8sIGNtZCk7CkBAIC03NDgsMTMgKzgwOCw0MCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlwdnNjc2lfYWJvcnRfY21kKGFkYXB0ZXIsIGN0eCk7CisJLyoKKwkgKiBNYXJrIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIGJlIGFib3J0ZWQgYW5kIGlzc3VlCisJICogdGhlIGFib3J0LgorCSAqLworCWN0eC0+YWJvcnRfY21wID0gJmFib3J0X2NtcDsKIAotCXB2c2NzaV9wcm9jZXNzX2NvbXBsZXRpb25fcmluZyhhZGFwdGVyKTsKKwlwdnNjc2lfYWJvcnRfY21kKGFkYXB0ZXIsIGN0eCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aHdfbG9jaywgZmxhZ3MpOworCS8qIFdhaXQgZm9yIDIgc2VjcyBmb3IgdGhlIGNvbXBsZXRpb24uICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhYm9ydF9jbXAsIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7CisKKwlpZiAoIWNvbXBsZXRpb25fZG9uZSgmYWJvcnRfY21wKSkgeworCQkvKgorCQkgKiBGYWlsZWQgdG8gYWJvcnQgdGhlIGNvbW1hbmQsIHVubWFyayB0aGUgZmFjdCB0aGF0IGl0CisJCSAqIHdhcyByZXF1ZXN0ZWQgdG8gYmUgYWJvcnRlZC4KKwkJICovCisJCWN0eC0+YWJvcnRfY21wID0gTlVMTDsKKwkJcmVzdWx0ID0gRkFJTEVEOworCQlzY21kX3ByaW50ayhLRVJOX0RFQlVHLCBjbWQsCisJCQkgICAgIkZhaWxlZCB0byBnZXQgY29tcGxldGlvbiBmb3IgYWJvcnRlZCBjbWQgJXBcbiIsCisJCQkgICAgY21kKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTdWNjZXNzZnVsbHkgYWJvcnRlZCB0aGUgY29tbWFuZC4KKwkgKi8KKwljbWQtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOworCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5od19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIFNVQ0NFU1M7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTkxMSw2ICs5OTgsNyBAQAogCS5kbWFfYm91bmRhcnkJCQk9IFVJTlRfTUFYLAogCS5tYXhfc2VjdG9ycwkJCT0gMHhmZmZmLAogCS51c2VfY2x1c3RlcmluZwkJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmNoYW5nZV9xdWV1ZV9kZXB0aAkJPSBwdnNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoLAogCS5laF9hYm9ydF9oYW5kbGVyCQk9IHB2c2NzaV9hYm9ydCwKIAkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBwdnNjc2lfZGV2aWNlX3Jlc2V0LAogCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBwdnNjc2lfYnVzX3Jlc2V0LApAQCAtMTAzNCw2ICsxMTIyLDM0IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBib29sIHB2c2NzaV9zZXR1cF9yZXFfdGhyZXNob2xkKHN0cnVjdCBwdnNjc2lfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgICBib29sIGVuYWJsZSkKK3sKKwl1MzIgdmFsOworCisJaWYgKCFwdnNjc2lfdXNlX3JlcV90aHJlc2hvbGQpCisJCXJldHVybiBmYWxzZTsKKworCXB2c2NzaV9yZWdfd3JpdGUoYWRhcHRlciwgUFZTQ1NJX1JFR19PRkZTRVRfQ09NTUFORCwKKwkJCSBQVlNDU0lfQ01EX1NFVFVQX1JFUUNBTExUSFJFU0hPTEQpOworCXZhbCA9IHB2c2NzaV9yZWdfcmVhZChhZGFwdGVyLCBQVlNDU0lfUkVHX09GRlNFVF9DT01NQU5EX1NUQVRVUyk7CisJaWYgKHZhbCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ2bXdfcHZzY3NpOiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCByZXFfdGhyZXNob2xkXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCXN0cnVjdCBQVlNDU0lDbWREZXNjU2V0dXBSZXFDYWxsIGNtZF9tc2cgPSB7IDAgfTsKKwkJY21kX21zZy5lbmFibGUgPSBlbmFibGU7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJ2bXdfcHZzY3NpOiAlc2FibGluZyByZXFDYWxsVGhyZXNob2xkXG4iLAorCQkJZW5hYmxlID8gImVuIiA6ICJkaXMiKTsKKwkJcHZzY3NpX3dyaXRlX2NtZF9kZXNjKGFkYXB0ZXIsCisJCQkJICAgICAgUFZTQ1NJX0NNRF9TRVRVUF9SRVFDQUxMVEhSRVNIT0xELAorCQkJCSAgICAgICZjbWRfbXNnLCBzaXplb2YoY21kX21zZykpOworCQlyZXR1cm4gcHZzY3NpX3JlZ19yZWFkKGFkYXB0ZXIsCisJCQkJICAgICAgIFBWU0NTSV9SRUdfT0ZGU0VUX0NPTU1BTkRfU1RBVFVTKSAhPSAwOworCX0KK30KKwogc3RhdGljIGlycXJldHVybl90IHB2c2NzaV9pc3IoaW50IGlycSwgdm9pZCAqZGV2cCkKIHsKIAlzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZwOwpAQCAtMTIzNiwxMSArMTM1MiwxMiBAQAogc3RhdGljIGludCBwdnNjc2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHB2c2NzaV9hZGFwdGVyIGFkYXB0ZXJfdGVtcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlpbnQgZXJyb3I7CisJdTMyIG1heF9pZDsKIAogCWVycm9yID0gLUVOT0RFVjsKIApAQCAtMTI1OCwzNCArMTM3NSwxOSBAQAogCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKIAl9CiAKLQlwdnNjc2lfdGVtcGxhdGUuY2FuX3F1ZXVlID0KLQkJbWluKFBWU0NTSV9NQVhfTlVNX1BBR0VTX1JFUV9SSU5HLCBwdnNjc2lfcmluZ19wYWdlcykgKgotCQlQVlNDU0lfTUFYX05VTV9SRVFfRU5UUklFU19QRVJfUEFHRTsKLQlwdnNjc2lfdGVtcGxhdGUuY21kX3Blcl9sdW4gPQotCQltaW4ocHZzY3NpX3RlbXBsYXRlLmNhbl9xdWV1ZSwgcHZzY3NpX2NtZF9wZXJfbHVuKTsKLQlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZwdnNjc2lfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgcHZzY3NpX2FkYXB0ZXIpKTsKLQlpZiAoIWhvc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiBmYWlsZWQgdG8gYWxsb2NhdGUgaG9zdFxuIik7Ci0JCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOwotCX0KLQotCWFkYXB0ZXIgPSBzaG9zdF9wcml2KGhvc3QpOworCS8qCisJICogTGV0J3MgdXNlIGEgdGVtcCBwdnNjc2lfYWRhcHRlciBzdHJ1Y3QgdW50aWwgd2UgZmluZCB0aGUgbnVtYmVyIG9mCisJICogdGFyZ2V0cyBvbiB0aGUgYWRhcHRlciwgYWZ0ZXIgdGhhdCB3ZSB3aWxsIHN3aXRjaCB0byB0aGUgcmVhbAorCSAqIGFsbG9jYXRlZCBzdHJ1Y3QuCisJICovCisJYWRhcHRlciA9ICZhZGFwdGVyX3RlbXA7CiAJbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZigqYWRhcHRlcikpOwogCWFkYXB0ZXItPmRldiAgPSBwZGV2OwotCWFkYXB0ZXItPmhvc3QgPSBob3N0OwotCi0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmh3X2xvY2spOwotCi0JaG9zdC0+bWF4X2NoYW5uZWwgPSAwOwotCWhvc3QtPm1heF9pZCAgICAgID0gMTY7Ci0JaG9zdC0+bWF4X2x1biAgICAgPSAxOwotCWhvc3QtPm1heF9jbWRfbGVuID0gMTY7Ci0KIAlhZGFwdGVyLT5yZXYgPSBwZGV2LT5yZXZpc2lvbjsKIAogCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJ2bXdfcHZzY3NpIikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ2bXdfcHZzY3NpOiBwY2kgbWVtb3J5IHNlbGVjdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9mcmVlX2hvc3Q7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewpAQCAtMTMwMSw3ICsxNDAzLDcgQEAKIAlpZiAoaSA9PSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAidm13X3B2c2NzaTogYWRhcHRlciBoYXMgbm8gc3VpdGFibGUgTU1JTyByZWdpb25cbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlczsKKwkJZ290byBvdXRfcmVsZWFzZV9yZXNvdXJjZXNfYW5kX2Rpc2FibGU7CiAJfQogCiAJYWRhcHRlci0+bW1pb0Jhc2UgPSBwY2lfaW9tYXAocGRldiwgaSwgUFZTQ1NJX01FTV9TUEFDRV9TSVpFKTsKQEAgLTEzMTAsMTAgKzE0MTIsNjAgQEAKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAidm13X3B2c2NzaTogY2FuJ3QgaW9tYXAgZm9yIEJBUiAlZCBtZW1zaXplICVsdVxuIiwKIAkJICAgICAgIGksIFBWU0NTSV9NRU1fU1BBQ0VfU0laRSk7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVzb3VyY2VzOworCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlc19hbmRfZGlzYWJsZTsKIAl9CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qCisJICogQXNrIHRoZSBkZXZpY2UgZm9yIG1heCBudW1iZXIgb2YgdGFyZ2V0cyBiZWZvcmUgZGVjaWRpbmcgdGhlCisJICogZGVmYXVsdCBwdnNjc2lfcmluZ19wYWdlcyB2YWx1ZS4KKwkgKi8KKwltYXhfaWQgPSBwdnNjc2lfZ2V0X21heF90YXJnZXRzKGFkYXB0ZXIpOworCXByaW50ayhLRVJOX0lORk8gInZtd19wdnNjc2k6IG1heF9pZDogJXVcbiIsIG1heF9pZCk7CisKKwlpZiAocHZzY3NpX3JpbmdfcGFnZXMgPT0gMCkKKwkJLyoKKwkJICogU2V0IHRoZSByaWdodCBkZWZhdWx0IHZhbHVlLiBVcCB0byAxNiBpdCBpcyA4LCBhYm92ZSBpdCBpcworCQkgKiBtYXguCisJCSAqLworCQlwdnNjc2lfcmluZ19wYWdlcyA9IChtYXhfaWQgPiAxNikgPworCQkJUFZTQ1NJX1NFVFVQX1JJTkdTX01BWF9OVU1fUEFHRVMgOgorCQkJUFZTQ1NJX0RFRkFVTFRfTlVNX1BBR0VTX1BFUl9SSU5HOworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgInZtd19wdnNjc2k6IHNldHRpbmcgcmluZ19wYWdlcyB0byAlZFxuIiwKKwkgICAgICAgcHZzY3NpX3JpbmdfcGFnZXMpOworCisJcHZzY3NpX3RlbXBsYXRlLmNhbl9xdWV1ZSA9CisJCW1pbihQVlNDU0lfTUFYX05VTV9QQUdFU19SRVFfUklORywgcHZzY3NpX3JpbmdfcGFnZXMpICoKKwkJUFZTQ1NJX01BWF9OVU1fUkVRX0VOVFJJRVNfUEVSX1BBR0U7CisJcHZzY3NpX3RlbXBsYXRlLmNtZF9wZXJfbHVuID0KKwkJbWluKHB2c2NzaV90ZW1wbGF0ZS5jYW5fcXVldWUsIHB2c2NzaV9jbWRfcGVyX2x1bik7CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcHZzY3NpX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IHB2c2NzaV9hZGFwdGVyKSk7CisJaWYgKCFob3N0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidm13X3B2c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIGhvc3RcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3Jlc291cmNlc19hbmRfZGlzYWJsZTsKKwl9CisKKwkvKgorCSAqIExldCdzIHVzZSB0aGUgcmVhbCBwdnNjc2lfYWRhcHRlciBzdHJ1Y3QgaGVyZSBvbndhcmRzLgorCSAqLworCWFkYXB0ZXIgPSBzaG9zdF9wcml2KGhvc3QpOworCW1lbXNldChhZGFwdGVyLCAwLCBzaXplb2YoKmFkYXB0ZXIpKTsKKwlhZGFwdGVyLT5kZXYgID0gcGRldjsKKwlhZGFwdGVyLT5ob3N0ID0gaG9zdDsKKwkvKgorCSAqIENvcHkgYmFjayB3aGF0IHdlIGFscmVhZHkgaGF2ZSB0byB0aGUgYWxsb2NhdGVkIGFkYXB0ZXIgc3RydWN0LgorCSAqLworCWFkYXB0ZXItPnJldiA9IGFkYXB0ZXJfdGVtcC5yZXY7CisJYWRhcHRlci0+bW1pb0Jhc2UgPSBhZGFwdGVyX3RlbXAubW1pb0Jhc2U7CisKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+aHdfbG9jayk7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCWhvc3QtPm1heF9sdW4gICAgID0gMTsKKwlob3N0LT5tYXhfY21kX2xlbiA9IDE2OworCWhvc3QtPm1heF9pZCAgICAgID0gbWF4X2lkOworCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCiAJbGxfYWRhcHRlcl9yZXNldChhZGFwdGVyKTsKQEAgLTEzMjcsMTMgKzE0NzksNiBAQAogCX0KIAogCS8qCi0JICogQXNrIHRoZSBkZXZpY2UgZm9yIG1heCBudW1iZXIgb2YgdGFyZ2V0cy4KLQkgKi8KLQlob3N0LT5tYXhfaWQgPSBwdnNjc2lfZ2V0X21heF90YXJnZXRzKGFkYXB0ZXIpOwotCWRldiA9IHB2c2NzaV9kZXYoYWRhcHRlcik7Ci0JZGV2X2luZm8oZGV2LCAidm13X3B2c2NzaTogaG9zdC0+bWF4X2lkOiAldVxuIiwgaG9zdC0+bWF4X2lkKTsKLQotCS8qCiAJICogRnJvbSB0aGlzIHBvaW50IG9uIHdlIHNob3VsZCByZXNldCB0aGUgYWRhcHRlciBpZiBhbnl0aGluZyBnb2VzCiAJICogd3JvbmcuCiAJICovCkBAIC0xMzczLDYgKzE1MTgsMTAgQEAKIAkJZmxhZ3MgPSBJUlFGX1NIQVJFRDsKIAl9CiAKKwlhZGFwdGVyLT51c2VfcmVxX3RocmVzaG9sZCA9IHB2c2NzaV9zZXR1cF9yZXFfdGhyZXNob2xkKGFkYXB0ZXIsIHRydWUpOworCXByaW50ayhLRVJOX0RFQlVHICJ2bXdfcHZzY3NpOiBkcml2ZXItYmFzZWQgcmVxdWVzdCBjb2FsZXNjaW5nICVzYWJsZWRcbiIsCisJICAgICAgIGFkYXB0ZXItPnVzZV9yZXFfdGhyZXNob2xkID8gImVuIiA6ICJkaXMiKTsKKwogCWVycm9yID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+aXJxLCBwdnNjc2lfaXNyLCBmbGFncywKIAkJCSAgICAidm13X3B2c2NzaSIsIGFkYXB0ZXIpOwogCWlmIChlcnJvcikgewpAQCAtMTQwMiwxMiArMTU1MSwxNSBAQAogCWxsX2FkYXB0ZXJfcmVzZXQoYWRhcHRlcik7CiBvdXRfcmVsZWFzZV9yZXNvdXJjZXM6CiAJcHZzY3NpX3JlbGVhc2VfcmVzb3VyY2VzKGFkYXB0ZXIpOwotb3V0X2ZyZWVfaG9zdDoKIAlzY3NpX2hvc3RfcHV0KGhvc3QpOwogb3V0X2Rpc2FibGVfZGV2aWNlOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAogCXJldHVybiBlcnJvcjsKKworb3V0X3JlbGVhc2VfcmVzb3VyY2VzX2FuZF9kaXNhYmxlOgorCXB2c2NzaV9yZWxlYXNlX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKIH0KIAogc3RhdGljIHZvaWQgX19wdnNjc2lfc2h1dGRvd24oc3RydWN0IHB2c2NzaV9hZGFwdGVyICphZGFwdGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuaCBiL2RyaXZlcnMvc2NzaS92bXdfcHZzY3NpLmgKaW5kZXggMzU0NmU4Ni4uY2U0NTg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Ztd19wdnNjc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvdm13X3B2c2NzaS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFZNd2FyZSBQVlNDU0kgaGVhZGVyIGZpbGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNCwgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI2RlZmluZSBQVlNDU0lfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMC4yLjAtayIKKyNkZWZpbmUgUFZTQ1NJX0RSSVZFUl9WRVJTSU9OX1NUUklORyAgICIxLjAuNS4wLWsiCiAKICNkZWZpbmUgUFZTQ1NJX01BWF9OVU1fU0dfRU5UUklFU19QRVJfU0VHTUVOVCAxMjgKIApAQCAtMTE3LDggKzExNyw5IEBACiAJUFZTQ1NJX0NNRF9DT05GSUcgICAgICAgICAgICA9IDcsCiAJUFZTQ1NJX0NNRF9TRVRVUF9NU0dfUklORyAgICA9IDgsCiAJUFZTQ1NJX0NNRF9ERVZJQ0VfVU5QTFVHICAgICA9IDksCisJUFZTQ1NJX0NNRF9TRVRVUF9SRVFDQUxMVEhSRVNIT0xEICAgICA9IDEwLAogCi0JUFZTQ1NJX0NNRF9MQVNUICAgICAgICAgICAgICA9IDEwICAvKiBoYXMgdG8gYmUgbGFzdCAqLworCVBWU0NTSV9DTURfTEFTVCAgICAgICAgICAgICAgPSAxMSAgLyogaGFzIHRvIGJlIGxhc3QgKi8KIH07CiAKIC8qCkBAIC0xNDEsNiArMTQyLDE0IEBACiAJdTMyIF9wYWQ7CiB9IF9fcGFja2VkOwogCisvKgorICogQ29tbWFuZCBkZXNjcmlwdG9yIGZvciBQVlNDU0lfQ01EX1NFVFVQX1JFUUNBTExUSFJFU0hPTEQgLS0KKyAqLworCitzdHJ1Y3QgUFZTQ1NJQ21kRGVzY1NldHVwUmVxQ2FsbCB7CisJdTMyIGVuYWJsZTsKK30gX19wYWNrZWQ7CisKIGVudW0gUFZTQ1NJQ29uZmlnUGFnZVR5cGUgewogCVBWU0NTSV9DT05GSUdfUEFHRV9DT05UUk9MTEVSID0gMHgxOTU4LAogCVBWU0NTSV9DT05GSUdfUEFHRV9QSFkgICAgICAgID0gMHgxOTU5LApAQCAtMjYxLDcgKzI3MCw5IEBACiAJdTMyCWNtcENvbnNJZHg7CiAJdTMyCWNtcE51bUVudHJpZXNMb2cyOwogCi0JdTgJX3BhZFsxMDRdOworCXUzMglyZXFDYWxsVGhyZXNob2xkOworCisJdTgJX3BhZFsxMDBdOwogCiAJdTMyCW1zZ1Byb2RJZHg7CiAJdTMyCW1zZ0NvbnNJZHg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMgYi9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKaW5kZXggZjlhNmU0Yi4uMzI2NzQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS93ZDcwMDAuYwpAQCAtMTI1Miw3ICsxMjUyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAotCWlmIChyZXF1ZXN0X2lycShob3N0LT5pcnEsIHdkNzAwMF9pbnRyLCBJUlFGX0RJU0FCTEVELCAid2Q3MDAwIiwgaG9zdCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxLCB3ZDcwMDBfaW50ciwgMCwgIndkNzAwMCIsIGhvc3QpKSB7CiAJCXByaW50aygid2Q3MDAwX2luaXQ6IGNhbid0IGdldCBJUlEgJWQuXG4iLCBob3N0LT5pcnEpOwogCQlyZXR1cm4gKDApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IDU4MWVlMmEuLmVmZTE5NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMTUwLDcgKzE1MCw3IEBACiAKIGNvbmZpZyBTUElfQ0xQUzcxMVgKIAl0cmlzdGF0ZSAiQ0xQUzcxMVggaG9zdCBTUEkgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSQ0hfQ0xQUzcxMVgKKwlkZXBlbmRzIG9uIEFSQ0hfQ0xQUzcxMVggfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIGRlZGljYXRlZCBnZW5lcmFsIHB1cnBvc2UgU1BJL01pY3Jvd2lyZTEtY29tcGF0aWJsZQogCSAgbWFzdGVyIG1vZGUgaW50ZXJmYWNlIChTU0kxKSBmb3IgQ0xQUzcxMVgtYmFzZWQgQ1BVcy4KQEAgLTIxMiw3ICsyMTIsNiBAQAogCXRyaXN0YXRlICJGcmVlc2NhbGUgaS5NWCBTUEkgY29udHJvbGxlcnMiCiAJZGVwZW5kcyBvbiBBUkNIX01YQyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU1BJX0JJVEJBTkcKLQlkZWZhdWx0IG0gaWYgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgRnJlZXNjYWxlIGkuTVggU1BJIGNvbnRyb2xsZXJzIGluIG1hc3RlcgogCSAgbW9kZS4KQEAgLTI3MCw2ICsyNjksNyBAQAogY29uZmlnIFNQSV9GU0xfRFNQSQogCXRyaXN0YXRlICJGcmVlc2NhbGUgRFNQSSBjb250cm9sbGVyIgogCXNlbGVjdCBTUElfQklUQkFORworCXNlbGVjdCBSRUdNQVBfTU1JTwogCWRlcGVuZHMgb24gU09DX1ZGNjEwIHx8IENPTVBJTEVfVEVTVAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIERTUEkgY29udHJvbGxlciBpbiBtYXN0ZXIKQEAgLTMwNyw3ICszMDcsNyBAQAogCiBjb25maWcgU1BJX09NQVAyNFhYCiAJdHJpc3RhdGUgIk1jU1BJIGRyaXZlciBmb3IgT01BUCIKLQlkZXBlbmRzIG9uIEFSTSB8fCBBUk02NCB8fCBBVlIzMiB8fCBIRVhBR09OIHx8IE1JUFMgfHwgU0gKKwlkZXBlbmRzIG9uIEFSTSB8fCBBUk02NCB8fCBBVlIzMiB8fCBIRVhBR09OIHx8IE1JUFMgfHwgU1VQRVJICiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUyB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZm9yIE9NQVAyNFhYIGFuZCBsYXRlciBNdWx0aWNoYW5uZWwgU1BJCkBAIC0zODEsNiArMzgxLDE5IEBACiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgUmVuZXNhcyBSU1BJIGFuZCBRU1BJIGJsb2Nrcy4KIAorY29uZmlnIFNQSV9RVVAKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gU1BJIGNvbnRyb2xsZXIgd2l0aCBRVVAgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gQVJDSF9NU01fRFQgfHwgKEFSTSAmJiBDT01QSUxFX1RFU1QpCisJaGVscAorCSAgUXVhbGNvbW0gVW5pdmVyc2FsIFBlcmlwaGVyYWwgKFFVUCkgY29yZSBpcyBhbiBBSEIgc2xhdmUgdGhhdAorCSAgcHJvdmlkZXMgYSBjb21tb24gZGF0YSBwYXRoIChhbiBvdXRwdXQgRklGTyBhbmQgYW4gaW5wdXQgRklGTykKKwkgIGZvciBzZXJpYWwgcGVyaXBoZXJhbCBpbnRlcmZhY2UgKFNQSSkgbWluaS1jb3JlLiBTUEkgaW4gbWFzdGVyCisJICBtb2RlIHN1cHBvcnRzIHVwIHRvIDUwTUh6LCB1cCB0byBmb3VyIGNoaXAgc2VsZWN0cywgcHJvZ3JhbW1hYmxlCisJICBkYXRhIHBhdGggZnJvbSA0IGJpdHMgdG8gMzIgYml0cyBhbmQgbnVtZXJvdXMgcHJvdG9jb2wgdmFyaWFudHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNwaV9xdXAuCisKIGNvbmZpZyBTUElfUzNDMjRYWAogCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0WFggc2VyaWVzIFNQSSIKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjRYWApAQCAtNDE2LDcgKzQyOSw2IEBACiAJdHJpc3RhdGUgIlN1cGVySCBNU0lPRiBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEhBVkVfQ0xLCiAJZGVwZW5kcyBvbiBTVVBFUkggfHwgQVJDSF9TSE1PQklMRSB8fCBDT01QSUxFX1RFU1QKLQlzZWxlY3QgU1BJX0JJVEJBTkcKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBTdXBlckggYW5kIFNIIE1vYmlsZSBNU0lPRiBibG9ja3MuCiAKQEAgLTQ0Niw2ICs0NTgsMTkgQEAKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBDU1IgU2lSRnByaW1hSUkgU29DcwogCitjb25maWcgU1BJX1NVTjRJCisJdHJpc3RhdGUgIkFsbHdpbm5lciBBMTAgU29DcyBTUEkgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkgfHwgQ09NUElMRV9URVNUCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgQWxsd2lubmVyIHN1bjRpLCBzdW41aSBhbmQgc3VuN2kgU29DcworCitjb25maWcgU1BJX1NVTjZJCisJdHJpc3RhdGUgIkFsbHdpbm5lciBBMzEgU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBBUkNIX1NVTlhJIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gUkVTRVRfQ09OVFJPTExFUgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgU1BJIGNvbnRyb2xsZXIgb24gdGhlIEFsbHdpbm5lciBBMzEgU29Dcy4KKwogY29uZmlnIFNQSV9NWFMKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1YUyBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfTVhTCkBAIC00NzgsMTMgKzUwMyw2IEBACiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgTnZpZGlhIFRlZ3JhMjAvVGVncmEzMCBTTElOSyBDb250cm9sbGVyIGludGVyZmFjZS4KIAotY29uZmlnIFNQSV9USV9TU1AKLQl0cmlzdGF0ZSAiVEkgU2VxdWVuY2VyIFNlcmlhbCBQb3J0IC0gU1BJIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNRkRfVElfU1NQCi0JaGVscAotCSAgVGhpcyBzZWxlY3RzIGFuIFNQSSBtYXN0ZXIgaW1wbGVtZW50YXRpb24gdXNpbmcgYSBUSSBzZXF1ZW5jZXIKLQkgIHNlcmlhbCBwb3J0LgotCiBjb25maWcgU1BJX1RPUENMSUZGX1BDSAogCXRyaXN0YXRlICJJbnRlbCBFRzIwVCBQQ0gvTEFQSVMgU2VtaWNvbiBJT0goTUw3MjEzL01MNzIyMy9NTDc4MzEpIFNQSSIKIAlkZXBlbmRzIG9uIFBDSQpAQCAtNTIwLDYgKzUzOCwxOSBAQAogCiAJICBPciBmb3IgdGhlIERTNTcwLCBzZWUgIlhQUyBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgKHYyLjAwYikiCiAKK2NvbmZpZyBTUElfWFRFTlNBX1hURlBHQQorCXRyaXN0YXRlICJYdGVuc2EgU1BJIGNvbnRyb2xsZXIgZm9yIHh0ZnBnYSIKKwlkZXBlbmRzIG9uIChYVEVOU0EgJiYgWFRFTlNBX1BMQVRGT1JNX1hURlBHQSkgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgeHRmcGdhIFNQSSBtYXN0ZXIgY29udHJvbGxlci4KKworCSAgVGhpcyBzaW1wbGUgU1BJIG1hc3RlciBjb250cm9sbGVyIGlzIGJ1aWx0IGludG8geHRmcGdhIGJpdHN0cmVhbXMKKwkgIGFuZCBpcyB1c2VkIHRvIGNvbnRyb2wgZGF1Z2h0ZXJib2FyZCBhdWRpbyBjb2RlYy4gSXQgYWx3YXlzIHRyYW5zZmVycworCSAgMTYgYml0IHdvcmRzIGluIFNQSSBtb2RlIDAsIGF1dG9tYXRpY2FsbHkgYXNzZXJ0aW5nIENTIG9uIHRyYW5zZmVyCisJICBzdGFydCBhbmQgZGVhc3NlcnRpbmcgb24gZW5kLgorCisKIGNvbmZpZyBTUElfTlVDOTAwCiAJdHJpc3RhdGUgIk51dm90b24gTlVDOTAwIHNlcmllcyBTUEkiCiAJZGVwZW5kcyBvbiBBUkNIX1c5MFg5MDAKQEAgLTU0Niw3ICs1NzcsNyBAQAogCiBjb25maWcgU1BJX0RXX01NSU8KIAl0cmlzdGF0ZSAiTWVtb3J5LW1hcHBlZCBpbyBpbnRlcmZhY2UgZHJpdmVyIGZvciBEVyBTUEkgY29yZSIKLQlkZXBlbmRzIG9uIFNQSV9ERVNJR05XQVJFICYmIEhBVkVfQ0xLCisJZGVwZW5kcyBvbiBTUElfREVTSUdOV0FSRQogCiAjCiAjIFRoZXJlIGFyZSBsb3RzIG9mIFNQSSBkZXZpY2UgdHlwZXMsIHdpdGggc2Vuc29ycyBhbmQgbWVtb3J5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IDk1YWY0OGQuLmJkNzkyNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC01OSw2ICs1OSw3IEBACiBzcGktcHhhMnh4LXBsYXRmb3JtLSQoQ09ORklHX1NQSV9QWEEyWFhfRE1BKQkrPSBzcGktcHhhMnh4LWRtYS5vCiBvYmotJChDT05GSUdfU1BJX1BYQTJYWCkJCSs9IHNwaS1weGEyeHgtcGxhdGZvcm0ubwogb2JqLSQoQ09ORklHX1NQSV9QWEEyWFhfUENJKQkJKz0gc3BpLXB4YTJ4eC1wY2kubworb2JqLSQoQ09ORklHX1NQSV9RVVApCQkJKz0gc3BpLXF1cC5vCiBvYmotJChDT05GSUdfU1BJX1JTUEkpCQkJKz0gc3BpLXJzcGkubwogb2JqLSQoQ09ORklHX1NQSV9TM0MyNFhYKQkJKz0gc3BpLXMzYzI0eHgtaHcubwogc3BpLXMzYzI0eHgtaHcteQkJCTo9IHNwaS1zM2MyNHh4Lm8KQEAgLTcwLDEyICs3MSwxNCBAQAogb2JqLSQoQ09ORklHX1NQSV9TSF9NU0lPRikJCSs9IHNwaS1zaC1tc2lvZi5vCiBvYmotJChDT05GSUdfU1BJX1NIX1NDSSkJCSs9IHNwaS1zaC1zY2kubwogb2JqLSQoQ09ORklHX1NQSV9TSVJGKQkJKz0gc3BpLXNpcmYubworb2JqLSQoQ09ORklHX1NQSV9TVU40SSkJCQkrPSBzcGktc3VuNGkubworb2JqLSQoQ09ORklHX1NQSV9TVU42SSkJCQkrPSBzcGktc3VuNmkubwogb2JqLSQoQ09ORklHX1NQSV9URUdSQTExNCkJCSs9IHNwaS10ZWdyYTExNC5vCiBvYmotJChDT05GSUdfU1BJX1RFR1JBMjBfU0ZMQVNIKQkrPSBzcGktdGVncmEyMC1zZmxhc2gubwogb2JqLSQoQ09ORklHX1NQSV9URUdSQTIwX1NMSU5LKQkJKz0gc3BpLXRlZ3JhMjAtc2xpbmsubwotb2JqLSQoQ09ORklHX1NQSV9USV9TU1ApCQkrPSBzcGktdGktc3NwLm8KIG9iai0kKENPTkZJR19TUElfVExFNjJYMCkJCSs9IHNwaS10bGU2MngwLm8KIG9iai0kKENPTkZJR19TUElfVE9QQ0xJRkZfUENIKQkJKz0gc3BpLXRvcGNsaWZmLXBjaC5vCiBvYmotJChDT05GSUdfU1BJX1RYWDkpCQkJKz0gc3BpLXR4eDkubwogb2JqLSQoQ09ORklHX1NQSV9YQ09NTSkJCSs9IHNwaS14Y29tbS5vCiBvYmotJChDT05GSUdfU1BJX1hJTElOWCkJCSs9IHNwaS14aWxpbngubworb2JqLSQoQ09ORklHX1NQSV9YVEVOU0FfWFRGUEdBKQkJKz0gc3BpLXh0ZW5zYS14dGZwZ2EubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jIGIvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jCmluZGV4IDVkN2RlYWYuLjViNTcwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hbHRlcmEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMKQEAgLTEzLDcgKzEzLDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTIwMCw3ICsxOTksNiBAQAogCiBzdGF0aWMgaW50IGFsdGVyYV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgYWx0ZXJhX3NwaV9wbGF0Zm9ybV9kYXRhICpwbGF0cCA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IGFsdGVyYV9zcGkgKmh3OwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC0yMTQsNiArMjEyLDggQEAKIAltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMTY7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1NfSElHSDsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfUkFOR0VfTUFTSygxLCAxNik7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaHcpOwpAQCAtMjQ1LDkgKzI0NSw2IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIGV4aXQ7CiAJfQotCS8qIGZpbmQgcGxhdGZvcm0gZGF0YSAqLwotCWlmICghcGxhdHApCi0JCWh3LT5iaXRiYW5nLm1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCS8qIHJlZ2lzdGVyIG91ciBzcGkgY29udHJvbGxlciAqLwogCWVyciA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZody0+Yml0YmFuZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXRoNzkuYyBiL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCmluZGV4IGMzYjJmYjkuLjM4OThiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCkBAIC0xNCw3ICsxNCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMgYi9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYwppbmRleCA1ZDdiMDdmLi44MDA1Zjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYwpAQCAtOSw3ICs5LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjYsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgogCiAvKiBTUEkgcmVnaXN0ZXIgb2Zmc2V0cyAqLwogI2RlZmluZSBTUElfQ1IJCQkJCTB4MDAwMApAQCAtOTkzLDEzICs5OTMsNiBAQAogCiAJYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCWlmIChzcGktPmNoaXBfc2VsZWN0ID4gc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0KSB7Ci0JCWRldl9kYmcoJnNwaS0+ZGV2LAotCQkJCSJzZXR1cDogaW52YWxpZCBjaGlwc2VsZWN0ICV1ICgldSBkZWZpbmVkKVxuIiwKLQkJCQlzcGktPmNoaXBfc2VsZWN0LCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAkvKiBzZWUgbm90ZXMgYWJvdmUgcmUgY2hpcHNlbGVjdCAqLwogCWlmICghYXRtZWxfc3BpX2lzX3YyKGFzKQogCQkJJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwCkBAIC0xMDg3LDE0ICsxMDgwLDYgQEAKIAkJfQogCX0KIAotCWlmICh4ZmVyLT5iaXRzX3Blcl93b3JkID4gOCkgewotCQlpZiAoeGZlci0+bGVuICUgMikgewotCQkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkiYnVmZmVyIGxlbiBzaG91bGQgYmUgMTYgYml0cyBhbGlnbmVkXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCiAJLyoKIAkgKiBETUEgbWFwIGVhcmx5LCBmb3IgcGVyZm9ybWFuY2UgKGVtcHRpZXMgZGNhY2hlIEFTQVApIGFuZAogCSAqIGJldHRlciBmYXVsdCByZXBvcnRpbmcuCkBAIC0xMjIxLDkgKzEyMDYsNiBAQAogCWRldl9kYmcoJnNwaS0+ZGV2LCAibmV3IG1lc3NhZ2UgJXAgc3VibWl0dGVkIGZvciAlc1xuIiwKIAkJCQkJbXNnLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKIAotCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZtc2ctPnRyYW5zZmVycykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWF0bWVsX3NwaV9sb2NrKGFzKTsKIAljc19hY3RpdmF0ZShhcywgc3BpKTsKIApAQCAtMTI0NCwxMCArMTIyNiwxMCBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKIAkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkiICB4ZmVyICVwOiBsZW4gJXUgdHggJXAvJTA4eCByeCAlcC8lMDh4XG4iLAorCQkJIiAgeGZlciAlcDogbGVuICV1IHR4ICVwLyVwYWQgcnggJXAvJXBhZFxuIiwKIAkJCXhmZXIsIHhmZXItPmxlbiwKLQkJCXhmZXItPnR4X2J1ZiwgeGZlci0+dHhfZG1hLAotCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5yeF9kbWEpOworCQkJeGZlci0+dHhfYnVmLCAmeGZlci0+dHhfZG1hLAorCQkJeGZlci0+cnhfYnVmLCAmeGZlci0+cnhfZG1hKTsKIAl9CiAKIG1zZ19kb25lOgpAQCAtMTMwMyw2ICsxMjg1LDkgQEAKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwogCXN0cnVjdCBhdG1lbF9zcGkJKmFzOwogCisJLyogU2VsZWN0IGRlZmF1bHQgcGluIHN0YXRlICovCisJcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZSgmcGRldi0+ZGV2KTsKKwogCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcmVncykKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTE0NjUsNiArMTQ1MCw5IEBACiAJfQogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFzLT5jbGspOworCisJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDc0LDYgKzE0NjIsOCBAQAogCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCWludCByZXQ7CiAKKwlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKGRldik7CisKIAljbGtfcHJlcGFyZV9lbmFibGUoYXMtPmNsayk7CiAKIAkvKiBTdGFydCB0aGUgcXVldWUgcnVubmluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jIGIvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jCmluZGV4IGM0MTQxYzkuLjY3Mzc1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdTE1NTAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKQEAgLTU1LDggKzU1LDYgQEAKIAogCXZvbGF0aWxlIHBzY19zcGlfdCBfX2lvbWVtICpyZWdzOwogCWludCBpcnE7Ci0JdW5zaWduZWQgZnJlcV9tYXg7Ci0JdW5zaWduZWQgZnJlcV9taW47CiAKIAl1bnNpZ25lZCBsZW47CiAJdW5zaWduZWQgdHhfY291bnQ7CkBAIC0yNDgsMTEgKzI0Niw4IEBACiAJCQloeiA9IHQtPnNwZWVkX2h6OwogCX0KIAotCWlmIChoeiA+IHNwaS0+bWF4X3NwZWVkX2h6IHx8IGh6ID4gaHctPmZyZXFfbWF4IHx8IGh6IDwgaHctPmZyZXFfbWluKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAic2V0dXB4ZmVyOiBjbG9jayByYXRlPSVkIG91dCBvZiByYW5nZVxuIiwKLQkJCWh6KTsKKwlpZiAoIWh6KQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlhdTE1NTBfc3BpX2JpdHNfaGFuZGxlcnNfc2V0KGh3LCBzcGktPmJpdHNfcGVyX3dvcmQpOwogCkBAIC0yODcsMjMgKzI4Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXUxNTUwX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID09IDApCi0JCXNwaS0+bWF4X3NwZWVkX2h6ID0gaHctPmZyZXFfbWF4OwotCWlmIChzcGktPm1heF9zcGVlZF9oeiA+IGh3LT5mcmVxX21heAotCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPCBody0+ZnJlcV9taW4pCi0JCXJldHVybiAtRUlOVkFMOwotCS8qCi0JICogTk9URTogY2Fubm90IGNoYW5nZSBzcGVlZCBhbmQgb3RoZXIgaHcgc2V0dGluZ3MgaW1tZWRpYXRlbHksCi0JICogICAgICAgb3RoZXJ3aXNlIHNoYXJpbmcgb2Ygc3BpIGJ1cyBpcyBub3QgcG9zc2libGUsCi0JICogICAgICAgc28gZG8gbm90IGNhbGwgc2V0dXB4ZmVyKHNwaSwgTlVMTCkgaGVyZQotCSAqLwotCXJldHVybiAwOwotfQotCiAvKgogICogZm9yIGRtYSBzcGkgdHJhbnNmZXJzLCB3ZSBoYXZlIHRvIHNldHVwIHJ4IGNoYW5uZWwsIG90aGVyd2lzZSB0aGVyZSBpcwogICogbm8gcmVsaWFibGUgd2F5IGhvdyB0byByZWNvZ25pemUgdGhhdCBzcGkgdHJhbnNmZXIgaXMgZG9uZQpAQCAtODM4LDcgKzgxNiw2IEBACiAJaHctPmJpdGJhbmcubWFzdGVyID0gaHctPm1hc3RlcjsKIAlody0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IGF1MTU1MF9zcGlfc2V0dXB4ZmVyOwogCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBhdTE1NTBfc3BpX2NoaXBzZWw7Ci0JaHctPmJpdGJhbmcubWFzdGVyLT5zZXR1cCA9IGF1MTU1MF9zcGlfc2V0dXA7CiAJaHctPmJpdGJhbmcudHhyeF9idWZzID0gYXUxNTUwX3NwaV90eHJ4X2J1ZnM7CiAKIAlpZiAoaHctPnVzZWRtYSkgewpAQCAtOTA5LDggKzg4Niw5IEBACiAJewogCQlpbnQgbWluX2RpdiA9ICgyIDw8IDApICogKDIgKiAoNCArIDEpKTsKIAkJaW50IG1heF9kaXYgPSAoMiA8PCAzKSAqICgyICogKDYzICsgMSkpOwotCQlody0+ZnJlcV9tYXggPSBody0+cGRhdGEtPm1haW5jbGtfaHogLyBtaW5fZGl2OwotCQlody0+ZnJlcV9taW4gPSBody0+cGRhdGEtPm1haW5jbGtfaHogLyAobWF4X2RpdiArIDEpICsgMTsKKwkJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBody0+cGRhdGEtPm1haW5jbGtfaHogLyBtaW5fZGl2OworCQltYXN0ZXItPm1pbl9zcGVlZF9oeiA9CisJCQkJaHctPnBkYXRhLT5tYWluY2xrX2h6IC8gKG1heF9kaXYgKyAxKSArIDE7CiAJfQogCiAJYXUxNTUwX3NwaV9zZXR1cF9wc2NfYXNfc3BpKGh3KTsKQEAgLTk5OSw2ICs5NzcsMTUgQEAKIAkgKiBjcmVhdGUgbWVtb3J5IGRldmljZSB3aXRoIDggYml0cyBkZXZfZGV2d2lkdGgKIAkgKiBuZWVkZWQgZm9yIHByb3BlciBieXRlIG9yZGVyaW5nIHRvIHNwaSBmaWZvCiAJICovCisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTU1MDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTMwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJaWYgKHVzZWRtYSkgewogCQlkZG1hX21lbWlkID0gYXUxeHh4X2RkbWFfYWRkX2RldmljZSgmYXUxNTUwX3NwaV9tZW1fZGJkZXYpOwogCQlpZiAoIWRkbWFfbWVtaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtMjgzNS5jIGIvZHJpdmVycy9zcGkvc3BpLWJjbTI4MzUuYwppbmRleCA4YTg5ZGQxLi42OTE2NzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYmNtMjgzNS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iY20yODM1LmMKQEAgLTMxNSw3ICszMTUsNiBAQAogCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBCQ00yODM1X1NQSV9NT0RFX0JJVFM7CiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7Ci0JbWFzdGVyLT5idXNfbnVtID0gLTE7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDM7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGJjbTI4MzVfc3BpX3RyYW5zZmVyX29uZTsKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC1oc3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHgtaHNzcGkuYwppbmRleCBiNTI4ZjlmLi41YTIxMWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC1oc3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iY202M3h4LWhzc3BpLmMKQEAgLTE4MCw3ICsxODAsNyBAQAogCXdoaWxlIChwZW5kaW5nID4gMCkgewogCQlpbnQgY3Vycl9zdGVwID0gbWluX3QoaW50LCBzdGVwX3NpemUsIHBlbmRpbmcpOwogCi0JCWluaXRfY29tcGxldGlvbigmYnMtPmRvbmUpOworCQlyZWluaXRfY29tcGxldGlvbigmYnMtPmRvbmUpOwogCQlpZiAodHgpIHsKIAkJCW1lbWNweV90b2lvKGJzLT5maWZvICsgSFNTUElfT1BDT0RFX0xFTiwgdHgsIGN1cnJfc3RlcCk7CiAJCQl0eCArPSBjdXJyX3N0ZXA7CkBAIC0zNjksNiArMzY5LDcgQEAKIAlicy0+ZmlmbyA9ICh1OCBfX2lvbWVtICopKGJzLT5yZWdzICsgSFNTUElfRklGT19SRUcoMCkpOwogCiAJbXV0ZXhfaW5pdCgmYnMtPmJ1c19tdXRleCk7CisJaW5pdF9jb21wbGV0aW9uKCZicy0+ZG9uZSk7CiAKIAltYXN0ZXItPmJ1c19udW0gPSBIU1NQSV9CVVNfTlVNOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSA4OwpAQCAtNDUzLDkgKzQ1NCw4IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGJjbTYzeHhfaHNzcGlfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGJjbTYzeHhfaHNzcGlfc3VzcGVuZCwgYmNtNjN4eF9oc3NwaV9yZXN1bWUpCi19Oworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGJjbTYzeHhfaHNzcGlfcG1fb3BzLCBiY202M3h4X2hzc3BpX3N1c3BlbmQsCisJCQkgYmNtNjN4eF9oc3NwaV9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY202M3h4X2hzc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHguYyBiL2RyaXZlcnMvc3BpL3NwaS1iY202M3h4LmMKaW5kZXggNzcyODZhZS4uMDI1MGZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJjbTYzeHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmNtNjN4eC5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzUsOCArMzQsNiBAQAogCiAjaW5jbHVkZSA8YmNtNjN4eF9kZXZfc3BpLmg+CiAKLSNkZWZpbmUgUEZYCQlLQlVJTERfTU9ETkFNRQotCiAjZGVmaW5lIEJDTTYzWFhfU1BJX01BWF9QUkVQRU5ECQkxNQogCiBzdHJ1Y3QgYmNtNjN4eF9zcGkgewpAQCAtMTY5LDcgKzE2Niw3IEBACiAJCQkgICAgICAgdHJhbnNmZXJfbGlzdCk7CiAJfQogCi0JaW5pdF9jb21wbGV0aW9uKCZicy0+ZG9uZSk7CisJcmVpbml0X2NvbXBsZXRpb24oJmJzLT5kb25lKTsKIAogCS8qIEZpbGwgaW4gdGhlIE1lc3NhZ2UgY29udHJvbCByZWdpc3RlciAqLwogCW1zZ19jdGwgPSAobGVuIDw8IFNQSV9CWVRFX0NOVF9TSElGVCk7CkBAIC0zNTMsNiArMzUwLDcgQEAKIAl9CiAKIAlicyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbml0X2NvbXBsZXRpb24oJmJzLT5kb25lKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAJYnMtPnBkZXYgPSBwZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYyBiL2RyaXZlcnMvc3BpL3NwaS1iZmluLXNwb3J0LmMKaW5kZXggMzg5NDFlNS4uZjUxNWM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi1zcG9ydC5jCkBAIC04LDcgKzgsNiBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXYzLmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi12My5jCmluZGV4IDhmODU5ODguLjQwODlkMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXYzLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW4tdjMuYwpAQCAtODIyLDcgKzgyMiw4IEBACiAJbWFzdGVyLT5jbGVhbnVwID0gYmZpbl9zcGlfY2xlYW51cDsKIAltYXN0ZXItPnNldHVwID0gYmZpbl9zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGJmaW5fc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOwotCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gQklUKDMyIC0gMSkgfCBCSVQoMTYgLSAxKSB8IEJJVCg4IC0gMSk7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soMzIpIHwgU1BJX0JQV19NQVNLKDE2KSB8CisJCQkJICAgICBTUElfQlBXX01BU0soOCk7CiAKIAlkcnZfZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAlkcnZfZGF0YS0+bWFzdGVyID0gbWFzdGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMKaW5kZXggZjBmMTk1YS4uNTVlNTdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmZpbjV4eC5jCkBAIC0zNTAsNyArMzUwLDYgQEAKIHN0YXRpYyB2b2lkIGJmaW5fc3BpX2dpdmViYWNrKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7CiAJc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqbGFzdF90cmFuc2ZlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOwogCkBAIC0zNjIsOSArMzYxLDYgQEAKIAlxdWV1ZV93b3JrKGRydl9kYXRhLT53b3JrcXVldWUsICZkcnZfZGF0YS0+cHVtcF9tZXNzYWdlcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKIAotCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KG1zZy0+dHJhbnNmZXJzLnByZXYsCi0JCQkJICAgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7Ci0KIAltc2ctPnN0YXRlID0gTlVMTDsKIAogCWlmICghZHJ2X2RhdGEtPmNzX2NoYW5nZSkKQEAgLTEwMzAsMTAgKzEwMjYsNiBAQAogCX0KIAogCS8qIHRyYW5zbGF0ZSBjb21tb24gc3BpIGZyYW1ld29yayBpbnRvIG91ciByZWdpc3RlciAqLwotCWlmIChzcGktPm1vZGUgJiB+KFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfTFNCX0ZJUlNUKSkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgInVuc3VwcG9ydGVkIHNwaSBtb2RlcyBkZXRlY3RlZFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQogCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKIAkJY2hpcC0+Y3RsX3JlZyB8PSBCSVRfQ1RMX0NQT0w7CiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYyBiL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLmMKaW5kZXggYmQyMjJmNi4uZGM3ZDJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNDY3LDExICs0NjYsOSBAQAogLyoqCiAgKiBzcGlfYml0YmFuZ19zdG9wIC0gc3RvcHMgdGhlIHRhc2sgcHJvdmlkaW5nIHNwaSBjb21tdW5pY2F0aW9uCiAgKi8KLWludCBzcGlfYml0YmFuZ19zdG9wKHN0cnVjdCBzcGlfYml0YmFuZyAqYml0YmFuZykKK3ZvaWQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmcpCiB7CiAJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGJpdGJhbmctPm1hc3Rlcik7Ci0KLQlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3N0b3ApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMgYi9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMKaW5kZXggODA4MWY5Ni4uZWU0ZjkxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1idXR0ZXJmbHkuYwpAQCAtMzA5LDcgKzMwOSw2IEBACiBzdGF0aWMgdm9pZCBidXR0ZXJmbHlfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQogewogCXN0cnVjdCBidXR0ZXJmbHkJKnBwOwotCWludAkJCXN0YXR1czsKIAogCS8qIEZJWE1FIHRoaXMgZ2xvYmFsIGlzIHVnbHkgLi4uIGJ1dCwgaG93IHRvIHF1aWNrbHkgZ2V0IGZyb20KIAkgKiB0aGUgcGFycG9ydCB0byB0aGUgInN0cnVjdCBidXR0ZXJmbHkiIGFzc29jaWF0ZWQgd2l0aCBpdD8KQEAgLTMyMSw3ICszMjAsNyBAQAogCWJ1dHRlcmZseSA9IE5VTEw7CiAKIAkvKiBzdG9wKCkgdW5yZWdpc3RlcnMgY2hpbGQgZGV2aWNlcyB0b28gKi8KLQlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7CisJc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOwogCiAJLyogdHVybiBvZmYgVkNDICovCiAJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1jbHBzNzExeC5jIGIvZHJpdmVycy9zcGkvc3BpLWNscHM3MTF4LmMKaW5kZXggMzc0YmE0YS4uNGNkNjJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWNscHM3MTF4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWNscHM3MTF4LmMKQEAgLTExLDE1OCArMTEsMTI1IEBACiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi9jbHBzNzExeC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1jbHBzNzExeC5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJzcGktY2xwczcxMXgiCiAKLXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSB7Ci0Jc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKKyNkZWZpbmUgU1lOQ0lPX0ZSTUxFTih4KQkoKHgpIDw8IDgpCisjZGVmaW5lIFNZTkNJT19UWEZSTUVOCQkoMSA8PCAxNCkKIAorc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhIHsKKwl2b2lkIF9faW9tZW0JCSpzeW5jaW87CisJc3RydWN0IHJlZ21hcAkJKnN5c2NvbjsKKwlzdHJ1Y3QgcmVnbWFwCQkqc3lzY29uMTsKIAlzdHJ1Y3QgY2xrCQkqc3BpX2NsazsKLQl1MzIJCQltYXhfc3BlZWRfaHo7CiAKIAl1OAkJCSp0eF9idWY7CiAJdTgJCQkqcnhfYnVmOwotCWludAkJCWNvdW50OworCXVuc2lnbmVkIGludAkJYnB3OwogCWludAkJCWxlbjsKLQotCWludAkJCWNoaXBzZWxlY3RbMF07CiB9OwogCiBzdGF0aWMgaW50IHNwaV9jbHBzNzExeF9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQogCS8qIFdlIGFyZSBleHBlY3QgdGhhdCBTUEktZGV2aWNlIGlzIG5vdCBzZWxlY3RlZCAqLwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChody0+Y2hpcHNlbGVjdFtzcGktPmNoaXBfc2VsZWN0XSwKLQkJCSAgICAgICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jc19ncGlvLCAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc3BpX2NscHM3MTF4X3NldHVwX21vZGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3N0YXRpYyB2b2lkIHNwaV9jbHBzNzExeF9zZXR1cF94ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0JLyogU2V0dXAgZWRnZSBmb3IgdHJhbnNmZXIgKi8KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCi0JCWNscHNfd3JpdGV3KGNscHNfcmVhZHcoU1lTQ09OMykgfCBTWVNDT04zX0FEQ0NLTlNFTiwgU1lTQ09OMyk7Ci0JZWxzZQotCQljbHBzX3dyaXRldyhjbHBzX3JlYWR3KFNZU0NPTjMpICYgflNZU0NPTjNfQURDQ0tOU0VOLCBTWVNDT04zKTsKLX0KLQotc3RhdGljIGludCBzcGlfY2xwczcxMXhfc2V0dXBfeGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCi17Ci0JdTMyIHNwZWVkID0geGZlci0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwotCXU4IGJwdyA9IHhmZXItPmJpdHNfcGVyX3dvcmQ7Ci0Jc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKGJwdyAhPSA4KSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiVW5zdXBwb3J0ZWQgbWFzdGVyIGJ1cyB3aWR0aCAlaVxuIiwgYnB3KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGktPm1hc3RlcjsKKwlzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJLyogU2V0dXAgU1BJIGZyZXF1ZW5jeSBkaXZpZGVyICovCi0JaWYgKCFzcGVlZCB8fCAoc3BlZWQgPj0gaHctPm1heF9zcGVlZF9oeikpCi0JCWNscHNfd3JpdGVsKChjbHBzX3JlYWRsKFNZU0NPTjEpICYgflNZU0NPTjFfQURDS1NFTF9NQVNLKSB8Ci0JCQkgICAgU1lTQ09OMV9BRENLU0VMKDMpLCBTWVNDT04xKTsKLQllbHNlIGlmIChzcGVlZCA+PSAoaHctPm1heF9zcGVlZF9oeiAvIDIpKQotCQljbHBzX3dyaXRlbCgoY2xwc19yZWFkbChTWVNDT04xKSAmIH5TWVNDT04xX0FEQ0tTRUxfTUFTSykgfAotCQkJICAgIFNZU0NPTjFfQURDS1NFTCgyKSwgU1lTQ09OMSk7Ci0JZWxzZSBpZiAoc3BlZWQgPj0gKGh3LT5tYXhfc3BlZWRfaHogLyA4KSkKLQkJY2xwc193cml0ZWwoKGNscHNfcmVhZGwoU1lTQ09OMSkgJiB+U1lTQ09OMV9BRENLU0VMX01BU0spIHwKLQkJCSAgICBTWVNDT04xX0FEQ0tTRUwoMSksIFNZU0NPTjEpOworCWlmICh4ZmVyLT5zcGVlZF9oeiA+PSBtYXN0ZXItPm1heF9zcGVlZF9oeikKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGh3LT5zeXNjb24xLCBTWVNDT05fT0ZGU0VULAorCQkJCSAgIFNZU0NPTjFfQURDS1NFTF9NQVNLLCBTWVNDT04xX0FEQ0tTRUwoMykpOworCWVsc2UgaWYgKHhmZXItPnNwZWVkX2h6ID49IChtYXN0ZXItPm1heF9zcGVlZF9oeiAvIDIpKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbjEsIFNZU0NPTl9PRkZTRVQsCisJCQkJICAgU1lTQ09OMV9BRENLU0VMX01BU0ssIFNZU0NPTjFfQURDS1NFTCgyKSk7CisJZWxzZSBpZiAoeGZlci0+c3BlZWRfaHogPj0gKG1hc3Rlci0+bWF4X3NwZWVkX2h6IC8gOCkpCisJCXJlZ21hcF91cGRhdGVfYml0cyhody0+c3lzY29uMSwgU1lTQ09OX09GRlNFVCwKKwkJCQkgICBTWVNDT04xX0FEQ0tTRUxfTUFTSywgU1lTQ09OMV9BRENLU0VMKDEpKTsKIAllbHNlCi0JCWNscHNfd3JpdGVsKChjbHBzX3JlYWRsKFNZU0NPTjEpICYgflNZU0NPTjFfQURDS1NFTF9NQVNLKSB8Ci0JCQkgICAgU1lTQ09OMV9BRENLU0VMKDApLCBTWVNDT04xKTsKLQotCXJldHVybiAwOworCQlyZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbjEsIFNZU0NPTl9PRkZTRVQsCisJCQkJICAgU1lTQ09OMV9BRENLU0VMX01BU0ssIFNZU0NPTjFfQURDS1NFTCgwKSk7CiB9CiAKLXN0YXRpYyBpbnQgc3BpX2NscHM3MTF4X3RyYW5zZmVyX29uZV9tZXNzYWdlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCi0JCQkJCSAgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCitzdGF0aWMgaW50IHNwaV9jbHBzNzExeF9wcmVwYXJlX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOwotCWludCBzdGF0dXMgPSAwLCBjcyA9IGh3LT5jaGlwc2VsZWN0W21zZy0+c3BpLT5jaGlwX3NlbGVjdF07Ci0JdTMyIGRhdGE7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOwogCi0Jc3BpX2NscHM3MTF4X3NldHVwX21vZGUobXNnLT5zcGkpOworCS8qIFNldHVwIG1vZGUgZm9yIHRyYW5zZmVyICovCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhody0+c3lzY29uLCBTWVNDT05fT0ZGU0VULCBTWVNDT04zX0FEQ0NLTlNFTiwKKwkJCQkgIChzcGktPm1vZGUgJiBTUElfQ1BIQSkgPworCQkJCSAgU1lTQ09OM19BRENDS05TRU4gOiAwKTsKK30KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmIChzcGlfY2xwczcxMXhfc2V0dXBfeGZlcihtc2ctPnNwaSwgeGZlcikpIHsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dF94ZnI7Ci0JCX0KK3N0YXRpYyBpbnQgc3BpX2NscHM3MTF4X3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgICAgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1OCBkYXRhOwogCi0JCWdwaW9fc2V0X3ZhbHVlKGNzLCAhIShtc2ctPnNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJc3BpX2NscHM3MTF4X3NldHVwX3hmZXIoc3BpLCB4ZmVyKTsKIAotCQlyZWluaXRfY29tcGxldGlvbigmaHctPmRvbmUpOworCWh3LT5sZW4gPSB4ZmVyLT5sZW47CisJaHctPmJwdyA9IHhmZXItPmJpdHNfcGVyX3dvcmQ7CisJaHctPnR4X2J1ZiA9ICh1OCAqKXhmZXItPnR4X2J1ZjsKKwlody0+cnhfYnVmID0gKHU4ICopeGZlci0+cnhfYnVmOwogCi0JCWh3LT5jb3VudCA9IDA7Ci0JCWh3LT5sZW4gPSB4ZmVyLT5sZW47Ci0JCWh3LT50eF9idWYgPSAodTggKil4ZmVyLT50eF9idWY7Ci0JCWh3LT5yeF9idWYgPSAodTggKil4ZmVyLT5yeF9idWY7CisJLyogSW5pdGlhdGUgdHJhbnNmZXIgKi8KKwlkYXRhID0gaHctPnR4X2J1ZiA/ICpody0+dHhfYnVmKysgOiAwOworCXdyaXRlbChkYXRhIHwgU1lOQ0lPX0ZSTUxFTihody0+YnB3KSB8IFNZTkNJT19UWEZSTUVOLCBody0+c3luY2lvKTsKIAotCQkvKiBJbml0aWF0ZSB0cmFuc2ZlciAqLwotCQlkYXRhID0gaHctPnR4X2J1ZiA/IGh3LT50eF9idWZbaHctPmNvdW50XSA6IDA7Ci0JCWNscHNfd3JpdGVsKGRhdGEgfCBTWU5DSU9fRlJNTEVOKDgpIHwgU1lOQ0lPX1RYRlJNRU4sIFNZTkNJTyk7Ci0KLQkJd2FpdF9mb3JfY29tcGxldGlvbigmaHctPmRvbmUpOwotCi0JCWlmICh4ZmVyLT5kZWxheV91c2VjcykKLQkJCXVkZWxheSh4ZmVyLT5kZWxheV91c2Vjcyk7Ci0KLQkJaWYgKHhmZXItPmNzX2NoYW5nZSB8fAotCQkgICAgbGlzdF9pc19sYXN0KCZ4ZmVyLT50cmFuc2Zlcl9saXN0LCAmbXNnLT50cmFuc2ZlcnMpKQotCQkJZ3Bpb19zZXRfdmFsdWUoY3MsICEobXNnLT5zcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOwotCi0JCW1zZy0+YWN0dWFsX2xlbmd0aCArPSB4ZmVyLT5sZW47Ci0JfQotCi1vdXRfeGZyOgotCW1zZy0+c3RhdHVzID0gc3RhdHVzOwotCXNwaV9maW5hbGl6ZV9jdXJyZW50X21lc3NhZ2UobWFzdGVyKTsKLQotCXJldHVybiAwOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3BpX2NscHM3MTF4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodyA9IChzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgKilkZXZfaWQ7Ci0JdTMyIGRhdGE7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9pZDsKKwlzdHJ1Y3Qgc3BpX2NscHM3MTF4X2RhdGEgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXU4IGRhdGE7CiAKIAkvKiBIYW5kbGUgUlggKi8KLQlkYXRhID0gY2xwc19yZWFkYihTWU5DSU8pOworCWRhdGEgPSByZWFkYihody0+c3luY2lvKTsKIAlpZiAoaHctPnJ4X2J1ZikKLQkJaHctPnJ4X2J1Zltody0+Y291bnRdID0gKHU4KWRhdGE7Ci0KLQlody0+Y291bnQrKzsKKwkJKmh3LT5yeF9idWYrKyA9IGRhdGE7CiAKIAkvKiBIYW5kbGUgVFggKi8KLQlpZiAoaHctPmNvdW50IDwgaHctPmxlbikgewotCQlkYXRhID0gaHctPnR4X2J1ZiA/IGh3LT50eF9idWZbaHctPmNvdW50XSA6IDA7Ci0JCWNscHNfd3JpdGVsKGRhdGEgfCBTWU5DSU9fRlJNTEVOKDgpIHwgU1lOQ0lPX1RYRlJNRU4sIFNZTkNJTyk7CisJaWYgKC0taHctPmxlbiA+IDApIHsKKwkJZGF0YSA9IGh3LT50eF9idWYgPyAqaHctPnR4X2J1ZisrIDogMDsKKwkJd3JpdGVsKGRhdGEgfCBTWU5DSU9fRlJNTEVOKGh3LT5icHcpIHwgU1lOQ0lPX1RYRlJNRU4sCisJCSAgICAgICBody0+c3luY2lvKTsKIAl9IGVsc2UKLQkJY29tcGxldGUoJmh3LT5kb25lKTsKKwkJc3BpX2ZpbmFsaXplX2N1cnJlbnRfdHJhbnNmZXIobWFzdGVyKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGludCBzcGlfY2xwczcxMXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgaSwgcmV0OwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IHNwaV9jbHBzNzExeF9kYXRhICpodzsKIAlzdHJ1Y3Qgc3BpX2NscHM3MTF4X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgaXJxLCByZXQ7CiAKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOwpAQCAtMTc0LDMzICsxNDEsMzcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBzcGlfY2xwczcxMXhfZGF0YSkgKwotCQkJCSAgc2l6ZW9mKGludCkgKiBwZGF0YS0+bnVtX2NoaXBzZWxlY3QpOwotCWlmICghbWFzdGVyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlNQSSBhbGxvY2F0aW5nIG1lbW9yeSBlcnJvclxuIik7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKCpodykpOworCWlmICghbWFzdGVyKQogCQlyZXR1cm4gLUVOT01FTTsKKworCW1hc3Rlci0+Y3NfZ3Bpb3MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKGludCkgKgorCQkJCQlwZGF0YS0+bnVtX2NoaXBzZWxlY3QsIEdGUF9LRVJORUwpOworCWlmICghbWFzdGVyLT5jc19ncGlvcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwotCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gIFNQSV9CUFdfUkFOR0VfTUFTSygxLCA4KTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm51bV9jaGlwc2VsZWN0OwogCW1hc3Rlci0+c2V0dXAgPSBzcGlfY2xwczcxMXhfc2V0dXA7Ci0JbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IHNwaV9jbHBzNzExeF90cmFuc2Zlcl9vbmVfbWVzc2FnZTsKKwltYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IHNwaV9jbHBzNzExeF9wcmVwYXJlX21lc3NhZ2U7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzcGlfY2xwczcxMXhfdHJhbnNmZXJfb25lOwogCiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7Ci0JCWh3LT5jaGlwc2VsZWN0W2ldID0gcGRhdGEtPmNoaXBzZWxlY3RbaV07Ci0JCWlmICghZ3Bpb19pc192YWxpZChody0+Y2hpcHNlbGVjdFtpXSkpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgQ1MgR1BJTyAlaVxuIiwgaSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JCWlmIChkZXZtX2dwaW9fcmVxdWVzdCgmcGRldi0+ZGV2LCBody0+Y2hpcHNlbGVjdFtpXSwgTlVMTCkpIHsKKwkJbWFzdGVyLT5jc19ncGlvc1tpXSA9IHBkYXRhLT5jaGlwc2VsZWN0W2ldOworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdCgmcGRldi0+ZGV2LCBtYXN0ZXItPmNzX2dwaW9zW2ldLAorCQkJCQlEUklWRVJfTkFNRSk7CisJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBDUyBHUElPICVpXG4iLCBpKTsKLQkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAl9CkBAIC0yMTEsMjkgKzE4Miw0NSBAQAogCQlyZXQgPSBQVFJfRVJSKGh3LT5zcGlfY2xrKTsKIAkJZ290byBlcnJfb3V0OwogCX0KLQlody0+bWF4X3NwZWVkX2h6ID0gY2xrX2dldF9yYXRlKGh3LT5zcGlfY2xrKTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IGNsa19nZXRfcmF0ZShody0+c3BpX2Nsayk7CiAKLQlpbml0X2NvbXBsZXRpb24oJmh3LT5kb25lKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCi0JLyogRGlzYWJsZSBleHRlbmRlZCBtb2RlIGR1ZSBoYXJkd2FyZSBwcm9ibGVtcyAqLwotCWNscHNfd3JpdGV3KGNscHNfcmVhZHcoU1lTQ09OMykgJiB+U1lTQ09OM19BRENDT04sIFNZU0NPTjMpOwotCi0JLyogQ2xlYXIgcG9zc2libGUgcGVuZGluZyBpbnRlcnJ1cHQgKi8KLQljbHBzX3JlYWRsKFNZTkNJTyk7Ci0KLQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIElSUV9TU0VPVEksIHNwaV9jbHBzNzExeF9pc3IsIDAsCi0JCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIGh3KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHJlcXVlc3QgSVJRXG4iKTsKKwlody0+c3lzY29uID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGRldm5hbWUoInN5c2Nvbi4zIik7CisJaWYgKElTX0VSUihody0+c3lzY29uKSkgeworCQlyZXQgPSBQVFJfRVJSKGh3LT5zeXNjb24pOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaHctPnN5c2NvbjEgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9wZGV2bmFtZSgic3lzY29uLjEiKTsKKwlpZiAoSVNfRVJSKGh3LT5zeXNjb24xKSkgeworCQlyZXQgPSBQVFJfRVJSKGh3LT5zeXNjb24xKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaHctPnN5bmNpbyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoaHctPnN5bmNpbykpIHsKKwkJcmV0ID0gUFRSX0VSUihody0+c3luY2lvKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIERpc2FibGUgZXh0ZW5kZWQgbW9kZSBkdWUgaGFyZHdhcmUgcHJvYmxlbXMgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMoaHctPnN5c2NvbiwgU1lTQ09OX09GRlNFVCwgU1lTQ09OM19BRENDT04sIDApOworCisJLyogQ2xlYXIgcG9zc2libGUgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwlyZWFkbChody0+c3luY2lvKTsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBzcGlfY2xwczcxMXhfaXNyLCAwLAorCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBtYXN0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKwogCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOwogCWlmICghcmV0KSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsCiAJCQkgIlNQSSBidXMgZHJpdmVyIGluaXRpYWxpemVkLiBNYXN0ZXIgY2xvY2sgJXUgSHpcbiIsCi0JCQkgaHctPm1heF9zcGVlZF9oeik7CisJCQkgbWFzdGVyLT5tYXhfc3BlZWRfaHopOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jCmluZGV4IDI4YWU0NzAuLmUyZmE2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWNvbGRmaXJlLXFzcGkuYwpAQCAtNzcsOCArNzcsNiBAQAogCXN0cnVjdCBtY2Zxc3BpX2NzX2NvbnRyb2wgKmNzX2NvbnRyb2w7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKLQotCXN0cnVjdCBkZXZpY2UgKmRldjsKIH07CiAKIHN0YXRpYyB2b2lkIG1jZnFzcGlfd3JfcW1yKHN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpLCB1MTYgdmFsKQpAQCAtMTM1LDEzICsxMzMsMTMgQEAKIAogc3RhdGljIGludCBtY2Zxc3BpX2NzX3NldHVwKHN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpKQogewotCXJldHVybiAobWNmcXNwaS0+Y3NfY29udHJvbCAmJiBtY2Zxc3BpLT5jc19jb250cm9sLT5zZXR1cCkgPworCXJldHVybiAobWNmcXNwaS0+Y3NfY29udHJvbC0+c2V0dXApID8KIAkJbWNmcXNwaS0+Y3NfY29udHJvbC0+c2V0dXAobWNmcXNwaS0+Y3NfY29udHJvbCkgOiAwOwogfQogCiBzdGF0aWMgdm9pZCBtY2Zxc3BpX2NzX3RlYXJkb3duKHN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpKQogewotCWlmIChtY2Zxc3BpLT5jc19jb250cm9sICYmIG1jZnFzcGktPmNzX2NvbnRyb2wtPnRlYXJkb3duKQorCWlmIChtY2Zxc3BpLT5jc19jb250cm9sLT50ZWFyZG93bikKIAkJbWNmcXNwaS0+Y3NfY29udHJvbC0+dGVhcmRvd24obWNmcXNwaS0+Y3NfY29udHJvbCk7CiB9CiAKQEAgLTMwMCw2OCArMjk4LDQ1IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1jZnFzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKLQkJCQkJIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQorc3RhdGljIHZvaWQgbWNmcXNwaV9zZXRfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IG1jZnFzcGkgKm1jZnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlib29sIGNzX2hpZ2ggPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKworCWlmIChlbmFibGUpCisJCW1jZnFzcGlfY3Nfc2VsZWN0KG1jZnFzcGksIHNwaS0+Y2hpcF9zZWxlY3QsIGNzX2hpZ2gpOworCWVsc2UKKwkJbWNmcXNwaV9jc19kZXNlbGVjdChtY2Zxc3BpLCBzcGktPmNoaXBfc2VsZWN0LCBjc19oaWdoKTsKK30KKworc3RhdGljIGludCBtY2Zxc3BpX3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKIHsKIAlzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbXNnLT5zcGk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQlpbnQgc3RhdHVzID0gMDsKKwl1MTYgcW1yID0gTUNGUVNQSV9RTVJfTVNUUjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWJvb2wgY3NfaGlnaCA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOwotCQl1MTYgcW1yID0gTUNGUVNQSV9RTVJfTVNUUjsKKwlxbXIgfD0gdC0+Yml0c19wZXJfd29yZCA8PCAxMDsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCisJCXFtciB8PSBNQ0ZRU1BJX1FNUl9DUEhBOworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJcW1yIHw9IE1DRlFTUElfUU1SX0NQT0w7CisJcW1yIHw9IG1jZnFzcGlfcW1yX2JhdWQodC0+c3BlZWRfaHopOworCW1jZnFzcGlfd3JfcW1yKG1jZnFzcGksIHFtcik7CiAKLQkJcW1yIHw9IHQtPmJpdHNfcGVyX3dvcmQgPDwgMTA7Ci0JCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJCXFtciB8PSBNQ0ZRU1BJX1FNUl9DUEhBOwotCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCi0JCQlxbXIgfD0gTUNGUVNQSV9RTVJfQ1BPTDsKLQkJaWYgKHQtPnNwZWVkX2h6KQotCQkJcW1yIHw9IG1jZnFzcGlfcW1yX2JhdWQodC0+c3BlZWRfaHopOwotCQllbHNlCi0JCQlxbXIgfD0gbWNmcXNwaV9xbXJfYmF1ZChzcGktPm1heF9zcGVlZF9oeik7Ci0JCW1jZnFzcGlfd3JfcW1yKG1jZnFzcGksIHFtcik7CisJbWNmcXNwaV93cl9xaXIobWNmcXNwaSwgTUNGUVNQSV9RSVJfU1BJRkUpOworCWlmICh0LT5iaXRzX3Blcl93b3JkID09IDgpCisJCW1jZnFzcGlfdHJhbnNmZXJfbXNnOChtY2Zxc3BpLCB0LT5sZW4sIHQtPnR4X2J1ZiwgdC0+cnhfYnVmKTsKKwllbHNlCisJCW1jZnFzcGlfdHJhbnNmZXJfbXNnMTYobWNmcXNwaSwgdC0+bGVuIC8gMiwgdC0+dHhfYnVmLAorCQkJCSAgICAgICB0LT5yeF9idWYpOworCW1jZnFzcGlfd3JfcWlyKG1jZnFzcGksIDApOwogCi0JCW1jZnFzcGlfY3Nfc2VsZWN0KG1jZnFzcGksIHNwaS0+Y2hpcF9zZWxlY3QsIGNzX2hpZ2gpOwotCi0JCW1jZnFzcGlfd3JfcWlyKG1jZnFzcGksIE1DRlFTUElfUUlSX1NQSUZFKTsKLQkJaWYgKHQtPmJpdHNfcGVyX3dvcmQgPT0gOCkKLQkJCW1jZnFzcGlfdHJhbnNmZXJfbXNnOChtY2Zxc3BpLCB0LT5sZW4sIHQtPnR4X2J1ZiwKLQkJCQkJdC0+cnhfYnVmKTsKLQkJZWxzZQotCQkJbWNmcXNwaV90cmFuc2Zlcl9tc2cxNihtY2Zxc3BpLCB0LT5sZW4gLyAyLCB0LT50eF9idWYsCi0JCQkJCXQtPnJ4X2J1Zik7Ci0JCW1jZnFzcGlfd3JfcWlyKG1jZnFzcGksIDApOwotCi0JCWlmICh0LT5kZWxheV91c2VjcykKLQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7Ci0JCWlmICh0LT5jc19jaGFuZ2UpIHsKLQkJCWlmICghbGlzdF9pc19sYXN0KCZ0LT50cmFuc2Zlcl9saXN0LCAmbXNnLT50cmFuc2ZlcnMpKQotCQkJCW1jZnFzcGlfY3NfZGVzZWxlY3QobWNmcXNwaSwgc3BpLT5jaGlwX3NlbGVjdCwKLQkJCQkJCWNzX2hpZ2gpOwotCQl9IGVsc2UgewotCQkJaWYgKGxpc3RfaXNfbGFzdCgmdC0+dHJhbnNmZXJfbGlzdCwgJm1zZy0+dHJhbnNmZXJzKSkKLQkJCQltY2Zxc3BpX2NzX2Rlc2VsZWN0KG1jZnFzcGksIHNwaS0+Y2hpcF9zZWxlY3QsCi0JCQkJCQljc19oaWdoKTsKLQkJfQotCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOwotCX0KLQltc2ctPnN0YXR1cyA9IHN0YXR1czsKLQlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbWNmcXNwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWlmIChzcGktPmNoaXBfc2VsZWN0ID49IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdCkgewotCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIGNoaXAgc2VsZWN0IGlzIG91dCBvZiByYW5nZVxuIiwKLQkJCXNwaS0+Y2hpcF9zZWxlY3QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAltY2Zxc3BpX2NzX2Rlc2VsZWN0KHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpLAogCQkJICAgIHNwaS0+Y2hpcF9zZWxlY3QsIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKTsKIApAQCAtMzg4LDYgKzM2MywxMSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKKwlpZiAoIXBkYXRhLT5jc19jb250cm9sKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInBkYXRhLT5jc19jb250cm9sIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqbWNmcXNwaSkpOwogCWlmIChtYXN0ZXIgPT0gTlVMTCkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJzcGlfYWxsb2NfbWFzdGVyIGZhaWxlZFxuIik7CkBAIC00MzYsMTIgKzQxNiwxMiBAQAogCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1jZnFzcGktPndhaXRxKTsKLQltY2Zxc3BpLT5kZXYgPSAmcGRldi0+ZGV2OwogCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1NfSElHSCB8IFNQSV9DUE9MIHwgU1BJX0NQSEE7CiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX1JBTkdFX01BU0soOCwgMTYpOwogCW1hc3Rlci0+c2V0dXAgPSBtY2Zxc3BpX3NldHVwOwotCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBtY2Zxc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOworCW1hc3Rlci0+c2V0X2NzID0gbWNmcXNwaV9zZXRfY3M7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBtY2Zxc3BpX3RyYW5zZmVyX29uZTsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwpAQCAtNDUxLDcgKzQzMSw3IEBACiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInNwaV9yZWdpc3Rlcl9tYXN0ZXIgZmFpbGVkXG4iKTsKIAkJZ290byBmYWlsMjsKIAl9Ci0JcG1fcnVudGltZV9lbmFibGUobWNmcXNwaS0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJDb2xkZmlyZSBRU1BJIGJ1cyBkcml2ZXJcbiIpOwogCkBAIC00NzMsOSArNDUzLDggQEAKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG1jZnFzcGkgKm1jZnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCi0JcG1fcnVudGltZV9kaXNhYmxlKG1jZnFzcGktPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCS8qIGRpc2FibGUgdGhlIGhhcmR3YXJlIChzZXQgdGhlIGJhdWQgcmF0ZSB0byAwKSAqLwogCW1jZnFzcGlfd3JfcW1yKG1jZnFzcGksIE1DRlFTUElfUU1SX01TVFIpOwogCkBAIC00OTAsOCArNDY5LDExIEBACiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBtY2Zxc3BpICptY2Zxc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CiAKLQlzcGlfbWFzdGVyX3N1c3BlbmQobWFzdGVyKTsKKwlyZXQgPSBzcGlfbWFzdGVyX3N1c3BlbmQobWFzdGVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJY2xrX2Rpc2FibGUobWNmcXNwaS0+Y2xrKTsKIApAQCAtNTAzLDExICs0ODUsOSBAQAogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgbWNmcXNwaSAqbWNmcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAotCXNwaV9tYXN0ZXJfcmVzdW1lKG1hc3Rlcik7Ci0KIAljbGtfZW5hYmxlKG1jZnFzcGktPmNsayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3BpX21hc3Rlcl9yZXN1bWUobWFzdGVyKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jIGIvZHJpdmVycy9zcGkvc3BpLWRhdmluY2kuYwppbmRleCA1ZTczODlmLi41MGY3NTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kYXZpbmNpLmMKQEAgLTgwMiw4ICs4MDIsNyBAQAogCXBkYXRhID0gJmRzcGktPnBkYXRhOwogCiAJcGRhdGEtPnZlcnNpb24gPSBTUElfVkVSU0lPTl8xOwotCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihkYXZpbmNpX3NwaV9vZl9tYXRjaCksCi0JCQkJJnBkZXYtPmRldik7CisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoZGF2aW5jaV9zcGlfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwogCWlmICghbWF0Y2gpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC04MjQsNyArODIzLDYgQEAKIAlyZXR1cm4gMDsKIH0KICNlbHNlCi0jZGVmaW5lIGRhdmluY2lfc3BpX29mX21hdGNoIE5VTEwKIHN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9zcGlfcGxhdGZvcm1fZGF0YQogCSpzcGlfZGF2aW5jaV9nZXRfcGRhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJc3RydWN0IGRhdmluY2lfc3BpICpkc3BpKQpAQCAtODY0LDEwICs4NjIsNiBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAKIAlkc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCWlmIChkc3BpID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBmcmVlX21hc3RlcjsKLQl9CiAKIAlpZiAoZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KSkgewogCQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CkBAIC05MDgsMTAgKzkwMiw2IEBACiAJCWdvdG8gZnJlZV9tYXN0ZXI7CiAKIAlkc3BpLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKLQlpZiAoZHNwaS0+Yml0YmFuZy5tYXN0ZXIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfbWFzdGVyOwotCX0KIAogCWRzcGktPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGRzcGktPmNsaykpIHsKQEAgLTEwNDAsNyArMTAzMCw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic3BpX2RhdmluY2kiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gZGF2aW5jaV9zcGlfb2ZfbWF0Y2gsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkYXZpbmNpX3NwaV9vZl9tYXRjaCksCiAJfSwKIAkucHJvYmUgPSBkYXZpbmNpX3NwaV9wcm9iZSwKIAkucmVtb3ZlID0gZGF2aW5jaV9zcGlfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMKaW5kZXggOWFmNTZjZC4uMTQ5MmY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYworKysgYi9kcml2ZXJzL3NwaS9zcGktZHctbW1pby5jCkBAIC02Niw3ICs2Niw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWR3cy0+YnVzX251bSA9IDA7CisJZHdzLT5idXNfbnVtID0gcGRldi0+aWQ7CiAJZHdzLT5udW1fY3MgPSA0OwogCWR3cy0+bWF4X2ZyZXEgPSBjbGtfZ2V0X3JhdGUoZHdzbW1pby0+Y2xrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LmMgYi9kcml2ZXJzL3NwaS9zcGktZHcuYwppbmRleCBiZjk4ZDYzLi43MTJhYzU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKQEAgLTI3Niw4ICsyNzYsNyBAQAogCXF1ZXVlX3dvcmsoZHdzLT53b3JrcXVldWUsICZkd3MtPnB1bXBfbWVzc2FnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwogCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkobXNnLT50cmFuc2ZlcnMucHJldiwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKKwlsYXN0X3RyYW5zZmVyID0gbGlzdF9sYXN0X2VudHJ5KCZtc2ctPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKIAkJCQkJdHJhbnNmZXJfbGlzdCk7CiAKIAlpZiAoIWxhc3RfdHJhbnNmZXItPmNzX2NoYW5nZSAmJiBkd3MtPmNzX2NvbnRyb2wpCkBAIC00MzksMTIgKzQzOCw2IEBACiAKIAkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiAhPSBzcGVlZCkgewogCQkJc3BlZWQgPSB0cmFuc2Zlci0+c3BlZWRfaHo7Ci0JCQlpZiAoc3BlZWQgPiBkd3MtPm1heF9mcmVxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJNUlNUIFNQSTA6IHVuc3VwcG9ydGVkIgotCQkJCQkiZnJlcTogJWRIelxuIiwgc3BlZWQpOwotCQkJCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87Ci0JCQkJZ290byBlYXJseV9leGl0OwotCQkJfQogCiAJCQkvKiBjbGtfZGl2IGRvZXNuJ3Qgc3VwcG9ydCBvZGQgbnVtYmVyICovCiAJCQljbGtfZGl2ID0gZHdzLT5tYXhfZnJlcSAvIHNwZWVkOwpAQCAtNjcxLDEyICs2NjQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkd19zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQlrZnJlZShjaGlwKTsKLX0KLQogc3RhdGljIGludCBpbml0X3F1ZXVlKHN0cnVjdCBkd19zcGkgKmR3cykKIHsKIAlJTklUX0xJU1RfSEVBRCgmZHdzLT5xdWV1ZSk7CkBAIC04MDYsOSArNzkzLDkgQEAKIAltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KSB8IFNQSV9CUFdfTUFTSygxNik7CiAJbWFzdGVyLT5idXNfbnVtID0gZHdzLT5idXNfbnVtOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBkd3MtPm51bV9jczsKLQltYXN0ZXItPmNsZWFudXAgPSBkd19zcGlfY2xlYW51cDsKIAltYXN0ZXItPnNldHVwID0gZHdfc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXIgPSBkd19zcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBkd3MtPm1heF9mcmVxOwogCiAJLyogQmFzaWMgSFcgaW5pdCAqLwogCXNwaV9od19pbml0KGR3cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZWZtMzIuYyBiL2RyaXZlcnMvc3BpL3NwaS1lZm0zMi5jCmluZGV4IGQ0ZDNjYzUuLmJlNDRhM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1lZm0zMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1lZm0zMi5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogCWVmbTMyX3NwaV9maWxsdHgoZGRhdGEpOwogCi0JaW5pdF9jb21wbGV0aW9uKCZkZGF0YS0+ZG9uZSk7CisJcmVpbml0X2NvbXBsZXRpb24oJmRkYXRhLT5kb25lKTsKIAogCWVmbTMyX3NwaV93cml0ZTMyKGRkYXRhLCBSRUdfSUZfVFhCTCB8IFJFR19JRl9SWERBVEFWLCBSRUdfSUVOKTsKIApAQCAtMjg3LDE3ICsyODcsMTcgQEAKIAlyZXR1cm4gKHJlZyAmIFJFR19ST1VURV9MT0NBVElPTl9fTUFTSykgPj4gX19mZnMoUkVHX1JPVVRFX0xPQ0FUSU9OX19NQVNLKTsKIH0KIAotc3RhdGljIGludCBlZm0zMl9zcGlfcHJvYmVfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKK3N0YXRpYyB2b2lkIGVmbTMyX3NwaV9wcm9iZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZWZtMzJfc3BpX2RkYXRhICpkZGF0YSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJdTMyIGxvY2F0aW9uOwogCWludCByZXQ7CiAKLQlpZiAoIW5wKQotCQlyZXR1cm4gMTsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibG9jYXRpb24iLCAmbG9jYXRpb24pOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZWZtMzIsbG9jYXRpb24iLCAmbG9jYXRpb24pOworCWlmIChyZXQpCisJCS8qIGZhbGwgYmFjayB0byBvbGQgYW5kICh3cm9uZ2x5KSBnZW5lcmljIHByb3BlcnR5ICJsb2NhdGlvbiIgKi8KKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJsb2NhdGlvbiIsICZsb2NhdGlvbik7CiAJaWYgKCFyZXQpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAidXNpbmcgbG9jYXRpb24gJXVcbiIsIGxvY2F0aW9uKTsKIAl9IGVsc2UgewpAQCAtMzA4LDExICszMDgsNiBAQAogCX0KIAogCWRkYXRhLT5wZGF0YS5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0JLyogc3BpIGNvcmUgdGFrZXMgY2FyZSBhYm91dCB0aGUgYnVzIG51bWJlciB1c2luZyBhbiBhbGlhcyAqLwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZWZtMzJfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0zMjIsOSArMzE3LDE0IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQl1bnNpZ25lZCBpbnQgbnVtX2NzLCBpOworCWludCBudW1fY3MsIGk7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW51bV9jcyA9IG9mX2dwaW9fbmFtZWRfY291bnQobnAsICJjcy1ncGlvcyIpOworCWlmIChudW1fY3MgPCAwKQorCQlyZXR1cm4gbnVtX2NzOwogCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LAogCQkJc2l6ZW9mKCpkZGF0YSkgKyBudW1fY3MgKiBzaXplb2YodW5zaWduZWQpKTsKQEAgLTM0OSw2ICszNDksNyBAQAogCWRkYXRhLT5iaXRiYW5nLnR4cnhfYnVmcyA9IGVmbTMyX3NwaV90eHJ4X2J1ZnM7CiAKIAlzcGluX2xvY2tfaW5pdCgmZGRhdGEtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmZGRhdGEtPmRvbmUpOwogCiAJZGRhdGEtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGRkYXRhLT5jbGspKSB7CkBAIC00MTUsMjMgKzQxNiw3IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IGVmbTMyX3NwaV9wcm9iZV9kdChwZGV2LCBtYXN0ZXIsIGRkYXRhKTsKLQlpZiAocmV0ID4gMCkgewotCQkvKiBub3QgY3JlYXRlZCBieSBkZXZpY2UgdHJlZSAqLwotCQljb25zdCBzdHJ1Y3QgZWZtMzJfc3BpX3BkYXRhICpwZGF0YSA9Ci0JCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCi0JCWlmIChwZGF0YSkKLQkJCWRkYXRhLT5wZGF0YSA9ICpwZGF0YTsKLQkJZWxzZQotCQkJZGRhdGEtPnBkYXRhLmxvY2F0aW9uID0KLQkJCQllZm0zMl9zcGlfZ2V0X2NvbmZpZ3VyZWRfbG9jYXRpb24oZGRhdGEpOwotCi0JCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOwotCi0JfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0JCWdvdG8gZXJyX2Rpc2FibGVfY2xrOwotCX0KKwllZm0zMl9zcGlfcHJvYmVfZHQocGRldiwgbWFzdGVyLCBkZGF0YSk7CiAKIAllZm0zMl9zcGlfd3JpdGUzMihkZGF0YSwgMCwgUkVHX0lFTik7CiAJZWZtMzJfc3BpX3dyaXRlMzIoZGRhdGEsIFJFR19ST1VURV9UWFBFTiB8IFJFR19ST1VURV9SWFBFTiB8CkBAIC00ODcsNiArNDcyLDkgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZWZtMzJfc3BpX2R0X2lkc1tdID0gewogCXsKKwkJLmNvbXBhdGlibGUgPSAiZW5lcmd5bWljcm8sZWZtMzItc3BpIiwKKwl9LCB7CisJCS8qIGRvZXNuJ3QgZm9sbG93IHRoZSAidmVuZG9yLGRldmljZSIgc2NoZW1lLCBkb24ndCB1c2UgKi8KIAkJLmNvbXBhdGlibGUgPSAiZWZtMzIsc3BpIiwKIAl9LCB7CiAJCS8qIHNlbnRpbmVsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMgYi9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMKaW5kZXggMWJmYWVkNi4uMmY2NzVkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1lcDkzeHguYwpAQCAtNzMsOCArNzMsNiBAQAogICogQGNsazogY2xvY2sgZm9yIHRoZSBjb250cm9sbGVyCiAgKiBAcmVnc19iYXNlOiBwb2ludGVyIHRvIGlvcmVtYXAoKSdkIHJlZ2lzdGVycwogICogQHNzcGRyX3BoeXM6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFNTUERSIHJlZ2lzdGVyCi0gKiBAbWluX3JhdGU6IG1pbmltdW0gY2xvY2sgcmF0ZSAoaW4gSHopIHN1cHBvcnRlZCBieSB0aGUgY29udHJvbGxlcgotICogQG1heF9yYXRlOiBtYXhpbXVtIGNsb2NrIHJhdGUgKGluIEh6KSBzdXBwb3J0ZWQgYnkgdGhlIGNvbnRyb2xsZXIKICAqIEB3YWl0OiB3YWl0IGhlcmUgdW50aWwgZ2l2ZW4gdHJhbnNmZXIgaXMgY29tcGxldGVkCiAgKiBAY3VycmVudF9tc2c6IG1lc3NhZ2UgdGhhdCBpcyBjdXJyZW50bHkgcHJvY2Vzc2VkIChvciAlTlVMTCBpZiBub25lKQogICogQHR4OiBjdXJyZW50IGJ5dGUgaW4gdHJhbnNmZXIgdG8gdHJhbnNtaXQKQEAgLTk1LDggKzkzLDYgQEAKIAlzdHJ1Y3QgY2xrCQkJKmNsazsKIAl2b2lkIF9faW9tZW0JCQkqcmVnc19iYXNlOwogCXVuc2lnbmVkIGxvbmcJCQlzc3Bkcl9waHlzOwotCXVuc2lnbmVkIGxvbmcJCQltaW5fcmF0ZTsKLQl1bnNpZ25lZCBsb25nCQkJbWF4X3JhdGU7CiAJc3RydWN0IGNvbXBsZXRpb24JCXdhaXQ7CiAJc3RydWN0IHNwaV9tZXNzYWdlCQkqY3VycmVudF9tc2c7CiAJc2l6ZV90CQkJCXR4OwpAQCAtMTk5LDkgKzE5NSw5IEBACiAgKiBAZGl2X3NjcjogcG9pbnRlciB0byByZXR1cm4gdGhlIHNjciBkaXZpZGVyCiAgKi8KIHN0YXRpYyBpbnQgZXA5M3h4X3NwaV9jYWxjX2Rpdmlzb3JzKGNvbnN0IHN0cnVjdCBlcDkzeHhfc3BpICplc3BpLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCQkJICAgIHU4ICpkaXZfY3BzciwgdTggKmRpdl9zY3IpCisJCQkJICAgIHUzMiByYXRlLCB1OCAqZGl2X2Nwc3IsIHU4ICpkaXZfc2NyKQogeworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShlc3BpLT5wZGV2KTsKIAl1bnNpZ25lZCBsb25nIHNwaV9jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShlc3BpLT5jbGspOwogCWludCBjcHNyLCBzY3I7CiAKQEAgLTIxMCw3ICsyMDYsNyBAQAogCSAqIGNvbnRyb2xsZXIuIE5vdGUgdGhhdCBtaW5pbXVtIHZhbHVlIGlzIGFscmVhZHkgY2hlY2tlZCBpbgogCSAqIGVwOTN4eF9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2UoKS4KIAkgKi8KLQlyYXRlID0gY2xhbXAocmF0ZSwgZXNwaS0+bWluX3JhdGUsIGVzcGktPm1heF9yYXRlKTsKKwlyYXRlID0gY2xhbXAocmF0ZSwgbWFzdGVyLT5taW5fc3BlZWRfaHosIG1hc3Rlci0+bWF4X3NwZWVkX2h6KTsKIAogCS8qCiAJICogQ2FsY3VsYXRlIGRpdmlzb3JzIHNvIHRoYXQgd2UgY2FuIGdldCBzcGVlZCBhY2NvcmRpbmcgdGhlCkBAIC03MzUsMTMgKzczMSw2IEBACiAJCQkJCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7Ci0KLQkvKiBmaXJzdCB2YWxpZGF0ZSBlYWNoIHRyYW5zZmVyICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJaWYgKHQtPnNwZWVkX2h6IDwgZXNwaS0+bWluX3JhdGUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAltc2ctPnN0YXRlID0gTlVMTDsKIAltc2ctPnN0YXR1cyA9IDA7CkBAIC05MTcsOCArOTA2LDggQEAKIAkgKiBDYWxjdWxhdGUgbWF4aW11bSBhbmQgbWluaW11bSBzdXBwb3J0ZWQgY2xvY2sgcmF0ZXMKIAkgKiBmb3IgdGhlIGNvbnRyb2xsZXIuCiAJICovCi0JZXNwaS0+bWF4X3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvIDI7Ci0JZXNwaS0+bWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvICgyNTQgKiAyNTYpOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gY2xrX2dldF9yYXRlKGVzcGktPmNsaykgLyAyOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gY2xrX2dldF9yYXRlKGVzcGktPmNsaykgLyAoMjU0ICogMjU2KTsKIAllc3BpLT5wZGV2ID0gcGRldjsKIAogCWVzcGktPnNzcGRyX3BoeXMgPSByZXMtPnN0YXJ0ICsgU1NQRFI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZmFsY29uLmMgYi9kcml2ZXJzL3NwaS9zcGktZmFsY29uLmMKaW5kZXggZGQ1YmQ0Ni4uMDk5NjVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZhbGNvbi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1mYWxjb24uYwpAQCAtMzEyLDkgKzMxMiw2IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChzcGktPmNoaXBfc2VsZWN0ID4gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWJ1X2xvY2ssIGZsYWdzKTsKIAogCWlmIChzcGktPm1heF9zcGVlZF9oeiA+PSBDTE9DS18xMDBNKSB7CkBAIC00MjIsOSArNDE5LDcgQEAKIAlwcml2LT5tYXN0ZXIgPSBtYXN0ZXI7CiAKIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9NT0RFXzM7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDE7CiAJbWFzdGVyLT5mbGFncyA9IFNQSV9NQVNURVJfSEFMRl9EVVBMRVg7Ci0JbWFzdGVyLT5idXNfbnVtID0gLTE7CiAJbWFzdGVyLT5zZXR1cCA9IGZhbGNvbl9zZmxhc2hfc2V0dXA7CiAJbWFzdGVyLT5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0gZmFsY29uX3NmbGFzaF9wcmVwYXJlX3hmZXI7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGZhbGNvbl9zZmxhc2hfeGZlcl9vbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtZHNwaS5jCmluZGV4IGEyNTM5MjAuLmQ1NjVlZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtZHNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtZHNwaS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTEwOCwxMSArMTA5LDExIEBACiAJc3RydWN0IHNwaV9iaXRiYW5nCWJpdGJhbmc7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKIAotCXZvaWQgX19pb21lbQkJKmJhc2U7CisJc3RydWN0IHJlZ21hcAkJKnJlZ21hcDsKIAlpbnQJCQlpcnE7Ci0Jc3RydWN0IGNsayAJCSpjbGs7CisJc3RydWN0IGNsawkJKmNsazsKIAotCXN0cnVjdCBzcGlfdHJhbnNmZXIgCSpjdXJfdHJhbnNmZXI7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqY3VyX3RyYW5zZmVyOwogCXN0cnVjdCBjaGlwX2RhdGEJKmN1cl9jaGlwOwogCXNpemVfdAkJCWxlbjsKIAl2b2lkCQkJKnR4OwpAQCAtMTIzLDI0ICsxMjQsMTcgQEAKIAl1OAkJCWNzOwogCXUxNgkJCXZvaWRfd3JpdGVfZGF0YTsKIAotCXdhaXRfcXVldWVfaGVhZF90IAl3YWl0cTsKLQl1MzIgCQkJd2FpdGZsYWdzOworCXdhaXRfcXVldWVfaGVhZF90CXdhaXRxOworCXUzMgkJCXdhaXRmbGFnczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2RvdWJsZV9ieXRlX21vZGUoc3RydWN0IGZzbF9kc3BpICpkc3BpKQogewotCXJldHVybiAoKHJlYWRsKGRzcGktPmJhc2UgKyBTUElfQ1RBUihkc3BpLT5jcykpICYgU1BJX0ZSQU1FX0JJVFNfTUFTSykKLQkJCT09IFNQSV9GUkFNRV9CSVRTKDgpKSA/IDAgOiAxOwotfQorCXVuc2lnbmVkIGludCB2YWw7CiAKLXN0YXRpYyB2b2lkIHNldF9iaXRfbW9kZShzdHJ1Y3QgZnNsX2RzcGkgKmRzcGksIHVuc2lnbmVkIGNoYXIgYml0cykKLXsKLQl1MzIgdGVtcDsKKwlyZWdtYXBfcmVhZChkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwgJnZhbCk7CiAKLQl0ZW1wID0gcmVhZGwoZHNwaS0+YmFzZSArIFNQSV9DVEFSKGRzcGktPmNzKSk7Ci0JdGVtcCAmPSB+U1BJX0ZSQU1FX0JJVFNfTUFTSzsKLQl0ZW1wIHw9IFNQSV9GUkFNRV9CSVRTKGJpdHMpOwotCXdyaXRlbCh0ZW1wLCBkc3BpLT5iYXNlICsgU1BJX0NUQVIoZHNwaS0+Y3MpKTsKKwlyZXR1cm4gKCh2YWwgJiBTUElfRlJBTUVfQklUU19NQVNLKSA9PSBTUElfRlJBTUVfQklUUyg4KSkgPyAwIDogMTsKIH0KIAogc3RhdGljIHZvaWQgaHpfdG9fc3BpX2JhdWQoY2hhciAqcGJyLCBjaGFyICpiciwgaW50IHNwZWVkX2h6LApAQCAtMTg4LDcgKzE4Miw4IEBACiAJICovCiAJaWYgKHR4X3dvcmQgJiYgKGRzcGktPmxlbiA9PSAxKSkgewogCQlkc3BpLT5kYXRhZmxhZ3MgfD0gVFJBTl9TVEFURV9XT1JEX09ERF9OVU07Ci0JCXNldF9iaXRfbW9kZShkc3BpLCA4KTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcGktPnJlZ21hcCwgU1BJX0NUQVIoZHNwaS0+Y3MpLAorCQkJCVNQSV9GUkFNRV9CSVRTX01BU0ssIFNQSV9GUkFNRV9CSVRTKDgpKTsKIAkJdHhfd29yZCA9IDA7CiAJfQogCkBAIC0yMzgsNyArMjMzLDggQEAKIAkJCWRzcGlfcHVzaHIgfD0gU1BJX1BVU0hSX0NUQ05UOyAvKiBjbGVhciBjb3VudGVyICovCiAJCX0KIAotCQl3cml0ZWwoZHNwaV9wdXNociwgZHNwaS0+YmFzZSArIFNQSV9QVVNIUik7CisJCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9QVVNIUiwgZHNwaV9wdXNocik7CisKIAkJdHhfY291bnQrKzsKIAl9CiAKQEAgLTI1MywxNyArMjQ5LDIzIEBACiAJd2hpbGUgKChkc3BpLT5yeCA8IGRzcGktPnJ4X2VuZCkKIAkJCSYmIChyeF9jb3VudCA8IERTUElfRklGT19TSVpFKSkgewogCQlpZiAocnhfd29yZCkgeworCQkJdW5zaWduZWQgaW50IHZhbDsKKwogCQkJaWYgKChkc3BpLT5yeF9lbmQgLSBkc3BpLT5yeCkgPT0gMSkKIAkJCQlicmVhazsKIAotCQkJZCA9IFNQSV9QT1BSX1JYREFUQShyZWFkbChkc3BpLT5iYXNlICsgU1BJX1BPUFIpKTsKKwkJCXJlZ21hcF9yZWFkKGRzcGktPnJlZ21hcCwgU1BJX1BPUFIsICZ2YWwpOworCQkJZCA9IFNQSV9QT1BSX1JYREFUQSh2YWwpOwogCiAJCQlpZiAoIShkc3BpLT5kYXRhZmxhZ3MgJiBUUkFOX1NUQVRFX1JYX1ZPSUQpKQogCQkJCSoodTE2ICopZHNwaS0+cnggPSBkOwogCQkJZHNwaS0+cnggKz0gMjsKIAogCQl9IGVsc2UgewotCQkJZCA9IFNQSV9QT1BSX1JYREFUQShyZWFkbChkc3BpLT5iYXNlICsgU1BJX1BPUFIpKTsKKwkJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJCXJlZ21hcF9yZWFkKGRzcGktPnJlZ21hcCwgU1BJX1BPUFIsICZ2YWwpOworCQkJZCA9IFNQSV9QT1BSX1JYREFUQSh2YWwpOwogCQkJaWYgKCEoZHNwaS0+ZGF0YWZsYWdzICYgVFJBTl9TVEFURV9SWF9WT0lEKSkKIAkJCQkqKHU4ICopZHNwaS0+cnggPSBkOwogCQkJZHNwaS0+cngrKzsKQEAgLTI5NSwxMyArMjk3LDEzIEBACiAJaWYgKCFkc3BpLT50eCkKIAkJZHNwaS0+ZGF0YWZsYWdzIHw9IFRSQU5fU1RBVEVfVFhfVk9JRDsKIAotCXdyaXRlbChkc3BpLT5jdXJfY2hpcC0+bWNyX3ZhbCwgZHNwaS0+YmFzZSArIFNQSV9NQ1IpOwotCXdyaXRlbChkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwsIGRzcGktPmJhc2UgKyBTUElfQ1RBUihkc3BpLT5jcykpOwotCXdyaXRlbChTUElfUlNFUl9FT1FGRSwgZHNwaS0+YmFzZSArIFNQSV9SU0VSKTsKKwlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfTUNSLCBkc3BpLT5jdXJfY2hpcC0+bWNyX3ZhbCk7CisJcmVnbWFwX3dyaXRlKGRzcGktPnJlZ21hcCwgU1BJX0NUQVIoZHNwaS0+Y3MpLCBkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwpOworCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9SU0VSLCBTUElfUlNFUl9FT1FGRSk7CiAKIAlpZiAodC0+c3BlZWRfaHopCi0JCXdyaXRlbChkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwsCi0JCQkJZHNwaS0+YmFzZSArIFNQSV9DVEFSKGRzcGktPmNzKSk7CisJCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwKKwkJCQlkc3BpLT5jdXJfY2hpcC0+Y3Rhcl92YWwpOwogCiAJZHNwaV90cmFuc2Zlcl93cml0ZShkc3BpKTsKIApAQCAtMzE1LDcgKzMxNyw5IEBACiBzdGF0aWMgdm9pZCBkc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQogewogCXN0cnVjdCBmc2xfZHNwaSAqZHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXUzMiBwdXNociA9IHJlYWRsKGRzcGktPmJhc2UgKyBTUElfUFVTSFIpOworCXVuc2lnbmVkIGludCBwdXNocjsKKworCXJlZ21hcF9yZWFkKGRzcGktPnJlZ21hcCwgU1BJX1BVU0hSLCAmcHVzaHIpOwogCiAJc3dpdGNoICh2YWx1ZSkgewogCWNhc2UgQklUQkFOR19DU19BQ1RJVkU6CkBAIC0zMjYsNyArMzMwLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jd3JpdGVsKHB1c2hyLCBkc3BpLT5iYXNlICsgU1BJX1BVU0hSKTsKKwlyZWdtYXBfd3JpdGUoZHNwaS0+cmVnbWFwLCBTUElfUFVTSFIsIHB1c2hyKTsKIH0KIAogc3RhdGljIGludCBkc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCkBAIC0zMzgsNyArMzQyLDggQEAKIAkvKiBPbmx5IGFsbG9jIG9uIGZpcnN0IHNldHVwICovCiAJY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwogCWlmIChjaGlwID09IE5VTEwpIHsKLQkJY2hpcCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjaGlwX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJY2hpcCA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZihzdHJ1Y3QgY2hpcF9kYXRhKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghY2hpcCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTM0OSw3ICszNTQsNiBAQAogCQlmbXN6ID0gc3BpLT5iaXRzX3Blcl93b3JkIC0gMTsKIAl9IGVsc2UgewogCQlwcl9lcnIoIkludmFsaWQgd29yZHNpemVcbiIpOwotCQlrZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0zODIsMTMgKzM4NiwxNSBAQAogewogCXN0cnVjdCBmc2xfZHNwaSAqZHNwaSA9IChzdHJ1Y3QgZnNsX2RzcGkgKilkZXZfaWQ7CiAKLQl3cml0ZWwoU1BJX1NSX0VPUUYsIGRzcGktPmJhc2UgKyBTUElfU1IpOworCXJlZ21hcF93cml0ZShkc3BpLT5yZWdtYXAsIFNQSV9TUiwgU1BJX1NSX0VPUUYpOwogCiAJZHNwaV90cmFuc2Zlcl9yZWFkKGRzcGkpOwogCiAJaWYgKCFkc3BpLT5sZW4pIHsKIAkJaWYgKGRzcGktPmRhdGFmbGFncyAmIFRSQU5fU1RBVEVfV09SRF9PRERfTlVNKQotCQkJc2V0X2JpdF9tb2RlKGRzcGksIDE2KTsKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhkc3BpLT5yZWdtYXAsIFNQSV9DVEFSKGRzcGktPmNzKSwKKwkJCQlTUElfRlJBTUVfQklUU19NQVNLLCBTUElfRlJBTUVfQklUUygxNikpOworCiAJCWRzcGktPndhaXRmbGFncyA9IDE7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZHNwaS0+d2FpdHEpOwogCX0gZWxzZSB7CkBAIC00MzAsOCArNDM2LDEzIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBkc3BpX3BtID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGRzcGlfc3VzcGVuZCwgZHNwaV9yZXN1bWUpCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoZHNwaV9wbSwgZHNwaV9zdXNwZW5kLCBkc3BpX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBkc3BpX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnZhbF9iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS5tYXhfcmVnaXN0ZXIgPSAweDg4LAogfTsKIAogc3RhdGljIGludCBkc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC00NDAsNiArNDUxLDcgQEAKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCBmc2xfZHNwaSAqZHNwaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IHJldCA9IDAsIGNzX251bSwgYnVzX251bTsKIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBmc2xfZHNwaSkpOwpAQCAtNDc0LDEyICs0ODYsMjQgQEAKIAltYXN0ZXItPmJ1c19udW0gPSBidXNfbnVtOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlkc3BpLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihkc3BpLT5iYXNlKSkgewotCQlyZXQgPSBQVFJfRVJSKGRzcGktPmJhc2UpOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGJhc2UpKSB7CisJCXJldCA9IFBUUl9FUlIoYmFzZSk7CiAJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CiAJfQogCisJZHNwaV9yZWdtYXBfY29uZmlnLmxvY2tfYXJnID0gZHNwaTsKKwlkc3BpX3JlZ21hcF9jb25maWcudmFsX2Zvcm1hdF9lbmRpYW4gPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuIikKKwkJCT8gUkVHTUFQX0VORElBTl9CSUcgOiBSRUdNQVBfRU5ESUFOX0RFRkFVTFQ7CisJZHNwaS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsaygmcGRldi0+ZGV2LCAiZHNwaSIsIGJhc2UsCisJCQkJCQkmZHNwaV9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGRzcGktPnJlZ21hcCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgcmVnbWFwOiAlbGRcbiIsCisJCQkJUFRSX0VSUihkc3BpLT5yZWdtYXApKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHNwaS0+cmVnbWFwKTsKKwl9CisKIAlkc3BpLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChkc3BpLT5pcnEgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBwbGF0Zm9ybSBpcnFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwppbmRleCA0MjhkYzdhLi42ZmIyYjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwpAQCAtMjE5LDEzICsyMTksOCBAQAogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOwotCXU4IGJpdHNfcGVyX3dvcmQ7CiAJaW50IHJldDsKIAotCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKHQtPmJpdHNfcGVyX3dvcmQpCi0JCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOwotCiAJbXBjOHh4eF9zcGktPmxlbiA9IHQtPmxlbjsKIAlsZW4gPSByb3VuZHVwKGxlbiwgNCkgLyA0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5jIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1saWIuYwppbmRleCAwYjc1ZjI2Li5lNWQ0NWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCWNvbnN0IHZvaWQgKnByb3A7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKLQlwaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpwaW5mbyksIEdGUF9LRVJORUwpOworCXBpbmZvID0gZGV2bV9remFsbG9jKCZvZmRldi0+ZGV2LCBzaXplb2YoKnBpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIxNSwxNSArMjE1LDEzIEBACiAJcGRhdGEtPnN5c2NsayA9IGdldF9icmdmcmVxKCk7CiAJaWYgKHBkYXRhLT5zeXNjbGsgPT0gLTEpIHsKIAkJcGRhdGEtPnN5c2NsayA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsKLQkJaWYgKHBkYXRhLT5zeXNjbGsgPT0gLTEpIHsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjsKLQkJfQorCQlpZiAocGRhdGEtPnN5c2NsayA9PSAtMSkKKwkJCXJldHVybiAtRU5PREVWOwogCX0KICNlbHNlCiAJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLCAmcGRhdGEtPnN5c2Nsayk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCXJldHVybiByZXQ7CiAjZW5kaWYKIAogCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlIiwgTlVMTCk7CkBAIC0yMzcsOCArMjM1LDQgQEAKIAkJcGRhdGEtPmZsYWdzID0gU1BJX0NQTV9NT0RFIHwgU1BJX0NQTTE7CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCWtmcmVlKHBpbmZvKTsKLQlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtc3BpLmMKaW5kZXggMTE5ZjdhZi4uZjM1NDg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLXNwaS5jCkBAIC0yMzksMTIgKzIzOSw2IEBACiAJaWYgKCFiaXRzX3Blcl93b3JkKQogCQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwogCi0JLyogTWFrZSBzdXJlIGl0cyBhIGJpdCB3aWR0aCB3ZSBzdXBwb3J0IFs0Li4xNiwgMzJdICovCi0JaWYgKChiaXRzX3Blcl93b3JkIDwgNCkKLQkgICAgfHwgKChiaXRzX3Blcl93b3JkID4gMTYpICYmIChiaXRzX3Blcl93b3JkICE9IDMyKSkKLQkgICAgfHwgKGJpdHNfcGVyX3dvcmQgPiBtcGM4eHh4X3NwaS0+bWF4X2JpdHNfcGVyX3dvcmQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWlmICghaHopCiAJCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CiAKQEAgLTM2MiwxOCArMzU2LDI4IEBACiBzdGF0aWMgdm9pZCBmc2xfc3BpX2RvX29uZV9tc2coc3RydWN0IHNwaV9tZXNzYWdlICptKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtLT5zcGk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCAqZmlyc3Q7CiAJdW5zaWduZWQgaW50IGNzX2NoYW5nZTsKIAljb25zdCBpbnQgbnNlY3MgPSA1MDsKIAlpbnQgc3RhdHVzOwogCisJLyogRG9uJ3QgYWxsb3cgY2hhbmdlcyBpZiBDUyBpcyBhY3RpdmUgKi8KKwlmaXJzdCA9IGxpc3RfZmlyc3RfZW50cnkoJm0tPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCXRyYW5zZmVyX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAoKGZpcnN0LT5iaXRzX3Blcl93b3JkICE9IHQtPmJpdHNfcGVyX3dvcmQpIHx8CisJCQkoZmlyc3QtPnNwZWVkX2h6ICE9IHQtPnNwZWVkX2h6KSkgeworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJCSJiaXRzX3Blcl93b3JkL3NwZWVkX2h6IHNob3VsZCBiZSBzYW1lIGZvciB0aGUgc2FtZSBTUEkgdHJhbnNmZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCiAJY3NfY2hhbmdlID0gMTsKLQlzdGF0dXMgPSAwOworCXN0YXR1cyA9IC1FSU5WQUw7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CiAJCWlmICh0LT5iaXRzX3Blcl93b3JkIHx8IHQtPnNwZWVkX2h6KSB7Ci0JCQkvKiBEb24ndCBhbGxvdyBjaGFuZ2VzIGlmIENTIGlzIGFjdGl2ZSAqLwotCQkJc3RhdHVzID0gLUVJTlZBTDsKLQogCQkJaWYgKGNzX2NoYW5nZSkKIAkJCQlzdGF0dXMgPSBmc2xfc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7CiAJCQlpZiAoc3RhdHVzIDwgMCkKQEAgLTY0MSw2ICs2NDUsMTAgQEAKIAlpZiAobXBjOHh4eF9zcGktPnR5cGUgPT0gVFlQRV9HUkxJQikKIAkJZnNsX3NwaV9ncmxpYl9wcm9iZShkZXYpOwogCisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPQorCQkoU1BJX0JQV19SQU5HRV9NQVNLKDQsIDE2KSB8IFNQSV9CUFdfTUFTSygzMikpICYKKwkJU1BJX0JQV19SQU5HRV9NQVNLKDEsIG1wYzh4eHhfc3BpLT5tYXhfYml0c19wZXJfd29yZCk7CisKIAlpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX1FFX0NQVV9NT0RFKQogCQltcGM4eHh4X3NwaS0+c2V0X3NoaWZ0cyA9IGZzbF9zcGlfcWVfY3B1X3NldF9zaGlmdHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMgYi9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jCmluZGV4IDdiZWViMjkuLjA5ODIzMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWdwaW8uYwpAQCAtMTksNyArMTksNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpAQCAtMjUwLDcgKzI0OSw3IEBACiAJCS8qCiAJCSAqIC4uLiBvdGhlcndpc2UsIHRha2UgaXQgZnJvbSBzcGktPmNvbnRyb2xsZXJfZGF0YQogCQkgKi8KLQkJY3MgPSAodW5zaWduZWQgaW50KSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwkJY3MgPSAodW5zaWduZWQgaW50KSh1aW50cHRyX3QpIHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCX0KIAogCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKSB7CkBAIC01MDMsMTMgKzUwMiwxMiBAQAogewogCXN0cnVjdCBzcGlfZ3BpbwkJCSpzcGlfZ3BpbzsKIAlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQkqcGRhdGE7Ci0JaW50CQkJCXN0YXR1czsKIAogCXNwaV9ncGlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCiAJLyogc3RvcCgpIHVucmVnaXN0ZXJzIGNoaWxkIGRldmljZXMgdG9vICovCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmc3BpX2dwaW8tPmJpdGJhbmcpOworCXNwaV9iaXRiYW5nX3N0b3AoJnNwaV9ncGlvLT5iaXRiYW5nKTsKIAogCWlmIChTUElfTUlTT19HUElPICE9IFNQSV9HUElPX05PX01JU08pCiAJCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKQEAgLTUxOCw3ICs1MTYsNyBAQAogCWdwaW9fZnJlZShTUElfU0NLX0dQSU8pOwogCXNwaV9tYXN0ZXJfcHV0KHNwaV9ncGlvLT5iaXRiYW5nLm1hc3Rlcik7CiAKLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiAwOwogfQogCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWlteC5jIGIvZHJpdmVycy9zcGkvc3BpLWlteC5jCmluZGV4IDQ3ZjE1ZDkuLjVkYWZmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1pbXguYworKysgYi9kcml2ZXJzL3NwaS9zcGktaW14LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTc0MSw3ICs3NDAsNyBAQAogCXNwaV9pbXgtPmNvdW50ID0gdHJhbnNmZXItPmxlbjsKIAlzcGlfaW14LT50eGZpZm8gPSAwOwogCi0JaW5pdF9jb21wbGV0aW9uKCZzcGlfaW14LT54ZmVyX2RvbmUpOworCXJlaW5pdF9jb21wbGV0aW9uKCZzcGlfaW14LT54ZmVyX2RvbmUpOwogCiAJc3BpX2lteF9wdXNoKHNwaV9pbXgpOwogCkBAIC04ODAsMTIgKzg3OSwxMiBAQAogCiAJc3BpX2lteC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoc3BpX2lteC0+aXJxIDwgMCkgewotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBzcGlfaW14LT5pcnE7CiAJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CiAJfQogCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBzcGlfaW14LT5pcnEsIHNwaV9pbXhfaXNyLCAwLAotCQkJICAgICAgIERSSVZFUl9OQU1FLCBzcGlfaW14KTsKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgc3BpX2lteCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgaXJxJWQ6ICVkXG4iLCBzcGlfaW14LT5pcnEsIHJldCk7CiAJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jCmluZGV4IDUwMzIxNDEuLjM4MjJlZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jCkBAIC0xNiw3ICsxNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CkBAIC00NjYsMTAgKzQ2NSw4IEBACiAJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLCBvbm9mZik7CiB9CiAKLS8qIGJ1c19udW0gaXMgdXNlZCBvbmx5IGZvciB0aGUgY2FzZSBkZXYtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCAqLwogc3RhdGljIGludCBtcGM1MTJ4X3BzY19zcGlfZG9fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVnYWRkciwKLQkJCQkJICAgICAgdTMyIHNpemUsIHVuc2lnbmVkIGludCBpcnEsCi0JCQkJCSAgICAgIHMxNiBidXNfbnVtKQorCQkJCQkgICAgICB1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAlzdHJ1Y3QgbXBjNTEyeF9wc2Nfc3BpICptcHM7CkBAIC00ODgsNyArNDg1LDYgQEAKIAogCWlmIChwZGF0YSA9PSBOVUxMKSB7CiAJCW1wcy0+Y3NfY29udHJvbCA9IG1wYzUxMnhfc3BpX2NzX2NvbnRyb2w7Ci0JCW1hc3Rlci0+YnVzX251bSA9IGJ1c19udW07CiAJfSBlbHNlIHsKIAkJbXBzLT5jc19jb250cm9sID0gcGRhdGEtPmNzX2NvbnRyb2w7CiAJCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOwpAQCAtNTc0LDcgKzU3MCw2IEBACiB7CiAJY29uc3QgdTMyICpyZWdhZGRyX3A7CiAJdTY0IHJlZ2FkZHI2NCwgc2l6ZTY0OwotCXMxNiBpZCA9IC0xOwogCiAJcmVnYWRkcl9wID0gb2ZfZ2V0X2FkZHJlc3Mob3AtPmRldi5vZl9ub2RlLCAwLCAmc2l6ZTY0LCBOVUxMKTsKIAlpZiAoIXJlZ2FkZHJfcCkgewpAQCAtNTgzLDE2ICs1NzgsOCBAQAogCX0KIAlyZWdhZGRyNjQgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhvcC0+ZGV2Lm9mX25vZGUsIHJlZ2FkZHJfcCk7CiAKLQkvKiBnZXQgUFNDIGlkICgwLi4xMSwgdXNlZCBieSBwb3J0X2NvbmZpZykgKi8KLQlpZCA9IG9mX2FsaWFzX2dldF9pZChvcC0+ZGV2Lm9mX25vZGUsICJzcGkiKTsKLQlpZiAoaWQgPCAwKSB7Ci0JCWRldl9lcnIoJm9wLT5kZXYsICJubyBhbGlhcyBpZCBmb3IgJXNcbiIsCi0JCQlvcC0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KIAlyZXR1cm4gbXBjNTEyeF9wc2Nfc3BpX2RvX3Byb2JlKCZvcC0+ZGV2LCAodTMyKSByZWdhZGRyNjQsICh1MzIpIHNpemU2NCwKLQkJCQlpcnFfb2ZfcGFyc2VfYW5kX21hcChvcC0+ZGV2Lm9mX25vZGUsIDApLCBpZCk7CisJCQkJaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKSk7CiB9CiAKIHN0YXRpYyBpbnQgbXBjNTEyeF9wc2Nfc3BpX29mX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LXBzYy5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKaW5kZXggMDBiYTkxMC4uM2QxOGQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC5jCmluZGV4IDdjNjc1ZmUuLmFhYzJhNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHguYwpAQCAtMTIsNyArMTIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzU3LDIwICszNTYsNiBAQAogICogc3BpX21hc3RlciBvcHMKICAqLwogCi1zdGF0aWMgaW50IG1wYzUyeHhfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JaWYgKHNwaS0+Yml0c19wZXJfd29yZCAlIDgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHNwaS0+bW9kZSAmIH4oU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9MU0JfRklSU1QpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChzcGktPmNoaXBfc2VsZWN0ID49IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtcGM1Mnh4X3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCiB7CiAJc3RydWN0IG1wYzUyeHhfc3BpICptcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtNDMzLDkgKzQxOCw5IEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAotCW1hc3Rlci0+c2V0dXAgPSBtcGM1Mnh4X3NwaV9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyID0gbXBjNTJ4eF9zcGlfdHJhbnNmZXI7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVDsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KTsKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gb3AtPmRldi5vZl9ub2RlOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEob3AsIG1hc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbXhzLmMgYi9kcml2ZXJzL3NwaS9zcGktbXhzLmMKaW5kZXggNzllNWFhMi4uMjg4NGYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW14cy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1teHMuYwpAQCAtMjksNyArMjksNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KQEAgLTM3MSw3ICszNzAsNyBAQAogewogCXN0cnVjdCBteHNfc3BpICpzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJc3RydWN0IG14c19zc3AgKnNzcCA9ICZzcGktPnNzcDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCAqdG1wX3Q7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKIAl1bnNpZ25lZCBpbnQgZmxhZzsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMzgxLDcgKzM4MCw3IEBACiAJd3JpdGVsKG14c19zcGlfY3NfdG9fcmVnKG0tPnNwaS0+Y2hpcF9zZWxlY3QpLAogCSAgICAgICBzc3AtPmJhc2UgKyBIV19TU1BfQ1RSTDAgKyBTVE1QX09GRlNFVF9SRUdfU0VUKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0LCB0bXBfdCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCiAJCXN0YXR1cyA9IG14c19zcGlfc2V0dXBfdHJhbnNmZXIobS0+c3BpLCB0KTsKIAkJaWYgKHN0YXR1cykKQEAgLTQ3Myw3ICs0NzIsNyBAQAogCWlvcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnFfZXJyID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoaXJxX2VyciA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gaXJxX2VycjsKIAogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgaW9yZXMpOwogCWlmIChJU19FUlIoYmFzZSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMgYi9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMKaW5kZXggYmFlOTdmZi4uMTZlMzBkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1udWM5MDAuYwpAQCAtOSw3ICs5LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zOCw3ICszNyw5IEBACiAvKiB1c2kgcmVnaXN0ZXIgYml0ICovCiAjZGVmaW5lIEVOSU5UCQkoMHgwMSA8PCAxNykKICNkZWZpbmUgRU5GTEcJCSgweDAxIDw8IDE2KQorI2RlZmluZSBTTEVFUAkJKDB4MGYgPDwgMTIpCiAjZGVmaW5lIFRYTlVNCQkoMHgwMyA8PCA4KQorI2RlZmluZSBUWEJJVExFTgkoMHgxZiA8PCAzKQogI2RlZmluZSBUWE5FRwkJKDB4MDEgPDwgMikKICNkZWZpbmUgUlhORUcJCSgweDAxIDw8IDEpCiAjZGVmaW5lIExTQgkJKDB4MDEgPDwgMTApCkBAIC01OCwxMSArNTksOCBAQAogCXVuc2lnbmVkIGNoYXIJCSpyeDsKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0Jc3RydWN0IHNwaV9kZXZpY2UJKmN1cmRldjsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBudWM5MDBfc3BpX2luZm8gKnBkYXRhOwogCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IHJlc291cmNlCQkqcmVzOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbnVjOTAwX3NwaSAqdG9faHcoc3RydWN0IHNwaV9kZXZpY2UgKnNkZXYpCkBAIC0xMTksMTkgKzExNywxNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9zZXR1cF90eG51bShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsCi0JCQkJCQkJdW5zaWduZWQgaW50IHR4bnVtKQorc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9zZXR1cF90eG51bShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsIHVuc2lnbmVkIGludCB0eG51bSkKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKIAotCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKSAmIH5UWE5VTTsKIAotCWlmICghdHhudW0pCi0JCXZhbCAmPSB+VFhOVU07Ci0JZWxzZQorCWlmICh0eG51bSkKIAkJdmFsIHw9IHR4bnVtIDw8IDB4MDg7CiAKIAlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOwpAQCAtMTQ4LDcgKzE0Myw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKIAotCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKSAmIH5UWEJJVExFTjsKIAogCXZhbCB8PSAodHhiaXRsZW4gPDwgMHgwMyk7CiAKQEAgLTI4NywxMiArMjgyLDExIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKIAotCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKSAmIH5TTEVFUDsKIAogCWlmIChzbGVlcCkKIAkJdmFsIHw9IChzbGVlcCA8PCAxMik7Ci0JZWxzZQotCQl2YWwgJj0gfigweDBmIDw8IDEyKTsKKwogCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOwpAQCAtMzM4LDYgKzMzMiw3IEBACiB7CiAJc3RydWN0IG51YzkwMF9zcGkgKmh3OwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGVyciA9IDA7CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbnVjOTAwX3NwaSkpOwpAQCAtMzQ5LDcgKzM0NCw2IEBACiAJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJaHctPm1hc3RlciA9IG1hc3RlcjsKIAlody0+cGRhdGEgID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlody0+ZGV2ID0gJnBkZXYtPmRldjsKIAogCWlmIChody0+cGRhdGEgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKQEAgLTM2OSw4ICszNjMsOCBAQAogCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3QgICAgID0gbnVjOTAwX3NwaV9jaGlwc2VsOwogCWh3LT5iaXRiYW5nLnR4cnhfYnVmcyAgICAgID0gbnVjOTAwX3NwaV90eHJ4OwogCi0JaHctPnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaHctPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgaHctPnJlcyk7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlody0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIoaHctPnJlZ3MpKSB7CiAJCWVyciA9IFBUUl9FUlIoaHctPnJlZ3MpOwogCQlnb3RvIGVycl9wZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMgYi9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jCmluZGV4IGY3Yzg5NmUuLjg5OThkMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9jLXRpbnkuYwpAQCAtMTUsNyArMTUsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjY3LDggKzI2Niw2IEBACiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgZm9yIHRoZSBiaXRiYW5nIGRyaXZlciAqLwogCWh3LT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKLQlpZiAoIWh3LT5iaXRiYW5nLm1hc3RlcikKLQkJcmV0dXJuIGVycjsKIAlody0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHRpbnlfc3BpX3NldHVwX3RyYW5zZmVyOwogCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3QgPSB0aW55X3NwaV9jaGlwc2VsZWN0OwogCWh3LT5iaXRiYW5nLnR4cnhfYnVmcyA9IHRpbnlfc3BpX3R4cnhfYnVmczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vY3Rlb24uYyBiL2RyaXZlcnMvc3BpL3NwaS1vY3Rlb24uYwppbmRleCA2NzI0OWE0Li5jNWUyZjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb2N0ZW9uLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9jdGVvbi5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIApAQCAtMzMsMTMgKzMyLDYgQEAKIAl1NjQgY3NfZW5heDsKIH07CiAKLXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwIHsKLQl1MzIgbWF4X3NwZWVkX2h6OwotCXU4IGNoaXBfc2VsZWN0OwotCXU4IG1vZGU7Ci0JdTggYml0c19wZXJfd29yZDsKLX07Ci0KIHN0YXRpYyB2b2lkIG9jdGVvbl9zcGlfd2FpdF9yZWFkeShzdHJ1Y3Qgb2N0ZW9uX3NwaSAqcCkKIHsKIAl1bmlvbiBjdm14X21waV9zdHMgbXBpX3N0czsKQEAgLTU3LDYgKzQ5LDcgQEAKIAkJCQkgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIsCiAJCQkJICBib29sIGxhc3RfeGZlcikKIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbXNnLT5zcGk7CiAJdW5pb24gY3ZteF9tcGlfY2ZnIG1waV9jZmc7CiAJdW5pb24gY3ZteF9tcGlfdHggbXBpX3R4OwogCXVuc2lnbmVkIGludCBjbGtkaXY7CkBAIC02OCwxOCArNjEsMTEgQEAKIAlpbnQgbGVuOwogCWludCBpOwogCi0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm1zZ19zZXR1cCA9IHNwaV9nZXRfY3RsZGF0YShtc2ctPnNwaSk7Ci0KLQlzcGVlZF9oeiA9IG1zZ19zZXR1cC0+bWF4X3NwZWVkX2h6OwotCW1vZGUgPSBtc2dfc2V0dXAtPm1vZGU7CisJbW9kZSA9IHNwaS0+bW9kZTsKIAljcGhhID0gbW9kZSAmIFNQSV9DUEhBOwogCWNwb2wgPSBtb2RlICYgU1BJX0NQT0w7CiAKLQlpZiAoeGZlci0+c3BlZWRfaHopCi0JCXNwZWVkX2h6ID0geGZlci0+c3BlZWRfaHo7Ci0KLQlpZiAoc3BlZWRfaHogPiBPQ1RFT05fU1BJX01BWF9DTE9DS19IWikKLQkJc3BlZWRfaHogPSBPQ1RFT05fU1BJX01BWF9DTE9DS19IWjsKKwlzcGVlZF9oeiA9IHhmZXItPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKIAogCWNsa2RpdiA9IG9jdGVvbl9nZXRfaW9fY2xvY2tfcmF0ZSgpIC8gKDIgKiBzcGVlZF9oeik7CiAKQEAgLTkzLDggKzc5LDggQEAKIAltcGlfY2ZnLnMuY3NsYXRlID0gY3BoYSA/IDEgOiAwOwogCW1waV9jZmcucy5lbmFibGUgPSAxOwogCi0JaWYgKG1zZ19zZXR1cC0+Y2hpcF9zZWxlY3QgPCA0KQotCQlwLT5jc19lbmF4IHw9IDF1bGwgPDwgKDEyICsgbXNnX3NldHVwLT5jaGlwX3NlbGVjdCk7CisJaWYgKHNwaS0+Y2hpcF9zZWxlY3QgPCA0KQorCQlwLT5jc19lbmF4IHw9IDF1bGwgPDwgKDEyICsgc3BpLT5jaGlwX3NlbGVjdCk7CiAJbXBpX2NmZy51NjQgfD0gcC0+Y3NfZW5heDsKIAogCWlmIChtcGlfY2ZnLnU2NCAhPSBwLT5sYXN0X2NmZykgewpAQCAtMTE0LDcgKzEwMCw3IEBACiAJCQljdm14X3dyaXRlX2NzcihwLT5yZWdpc3Rlcl9iYXNlICsgT0NURU9OX1NQSV9EQVQwICsgKDggKiBpKSwgZCk7CiAJCX0KIAkJbXBpX3R4LnU2NCA9IDA7Ci0JCW1waV90eC5zLmNzaWQgPSBtc2dfc2V0dXAtPmNoaXBfc2VsZWN0OworCQltcGlfdHgucy5jc2lkID0gc3BpLT5jaGlwX3NlbGVjdDsKIAkJbXBpX3R4LnMubGVhdmVjcyA9IDE7CiAJCW1waV90eC5zLnR4bnVtID0gdHhfYnVmID8gT0NURU9OX1NQSV9NQVhfQllURVMgOiAwOwogCQltcGlfdHgucy50b3RudW0gPSBPQ1RFT05fU1BJX01BWF9CWVRFUzsKQEAgLTEzOSw3ICsxMjUsNyBAQAogCX0KIAogCW1waV90eC51NjQgPSAwOwotCW1waV90eC5zLmNzaWQgPSBtc2dfc2V0dXAtPmNoaXBfc2VsZWN0OworCW1waV90eC5zLmNzaWQgPSBzcGktPmNoaXBfc2VsZWN0OwogCWlmIChsYXN0X3hmZXIpCiAJCW1waV90eC5zLmxlYXZlY3MgPSB4ZmVyLT5jc19jaGFuZ2U7CiAJZWxzZQpAQCAtMTY5LDE3ICsxNTUsOSBAQAogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CiAKLQkvKgotCSAqIFdlIGJldHRlciBoYXZlIHNldCB0aGUgY29uZmlndXJhdGlvbiB2aWEgYSBjYWxsIHRvIC5zZXR1cAotCSAqIGJlZm9yZSB3ZSBnZXQgaGVyZS4KLQkgKi8KLQlpZiAoc3BpX2dldF9jdGxkYXRhKG1zZy0+c3BpKSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWJvb2wgbGFzdF94ZmVyID0gJnhmZXItPnRyYW5zZmVyX2xpc3QgPT0gbXNnLT50cmFuc2ZlcnMucHJldjsKKwkJYm9vbCBsYXN0X3hmZXIgPSBsaXN0X2lzX2xhc3QoJnhmZXItPnRyYW5zZmVyX2xpc3QsCisJCQkJCSAgICAgICZtc2ctPnRyYW5zZmVycyk7CiAJCWludCByID0gb2N0ZW9uX3NwaV9kb190cmFuc2ZlcihwLCBtc2csIHhmZXIsIGxhc3RfeGZlcik7CiAJCWlmIChyIDwgMCkgewogCQkJc3RhdHVzID0gcjsKQEAgLTE5NCw0MSArMTcyLDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm9jdGVvbl9zcGlfbmV3X3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKnNldHVwID0ga3phbGxvYyhzaXplb2YoKnNldHVwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXR1cCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzZXR1cC0+bWF4X3NwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0Jc2V0dXAtPmNoaXBfc2VsZWN0ID0gc3BpLT5jaGlwX3NlbGVjdDsKLQlzZXR1cC0+bW9kZSA9IHNwaS0+bW9kZTsKLQlzZXR1cC0+Yml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQlyZXR1cm4gc2V0dXA7Ci19Ci0KLXN0YXRpYyBpbnQgb2N0ZW9uX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBvY3Rlb25fc3BpX3NldHVwICpuZXdfc2V0dXA7Ci0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm9sZF9zZXR1cCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwotCi0JbmV3X3NldHVwID0gb2N0ZW9uX3NwaV9uZXdfc2V0dXAoc3BpKTsKLQlpZiAoIW5ld19zZXR1cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBuZXdfc2V0dXApOwotCWtmcmVlKG9sZF9zZXR1cCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb2N0ZW9uX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IG9jdGVvbl9zcGlfc2V0dXAgKm9sZF9zZXR1cCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwotCXNwaV9zZXRfY3RsZGF0YShzcGksIE5VTEwpOwotCWtmcmVlKG9sZF9zZXR1cCk7Ci19Ci0KIHN0YXRpYyBpbnQgb2N0ZW9uX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzX21lbTsKQEAgLTI1Nyw4ICsyMDAsNiBAQAogCXAtPnJlZ2lzdGVyX2Jhc2UgPSAodTY0KWRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXNfbWVtLT5zdGFydCwKIAkJCQkJICAgICByZXNvdXJjZV9zaXplKHJlc19tZW0pKTsKIAotCS8qIER5bmFtaWMgYnVzIG51bWJlcmluZyAqLwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSA0OwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQSEEgfAogCQkJICAgIFNQSV9DUE9MIHwKQEAgLTI2NiwxMCArMjA3LDkgQEAKIAkJCSAgICBTUElfTFNCX0ZJUlNUIHwKIAkJCSAgICBTUElfM1dJUkU7CiAKLQltYXN0ZXItPnNldHVwID0gb2N0ZW9uX3NwaV9zZXR1cDsKLQltYXN0ZXItPmNsZWFudXAgPSBvY3Rlb25fc3BpX2NsZWFudXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IG9jdGVvbl9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CiAJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBPQ1RFT05fU1BJX01BWF9DTE9DS19IWjsKIAogCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAllcnIgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwLTEwMGsuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwLTEwMGsuYwppbmRleCAwZDMyMDU0Li5lN2ZmY2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb21hcC0xMDBrLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtMTAway5jCkBAIC04MywxNSArODMsMTEgQEAKICNkZWZpbmUgU1BJX1NIVVRET1dOCTEKIAogc3RydWN0IG9tYXAxX3NwaTEwMGsgewotCXN0cnVjdCBzcGlfbWFzdGVyICAgICAgICptYXN0ZXI7CiAJc3RydWN0IGNsayAgICAgICAgICAgICAgKmljazsKIAlzdHJ1Y3QgY2xrICAgICAgICAgICAgICAqZmNrOwogCiAJLyogVmlydHVhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgKi8KIAl2b2lkIF9faW9tZW0gICAgICAgICAgICAqYmFzZTsKLQotCS8qIFN0YXRlIG9mIHRoZSBTUEkgKi8KLQl1bnNpZ25lZCBpbnQJCXN0YXRlOwogfTsKIAogc3RydWN0IG9tYXAxX3NwaTEwMGtfY3MgewpAQCAtOTksMTMgKzk1LDYgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgICB3b3JkX2xlbjsKIH07CiAKLSNkZWZpbmUgTU9EX1JFR19CSVQodmFsLCBtYXNrLCBzZXQpIGRvIHsgXAotCWlmIChzZXQpIFwKLQkJdmFsIHw9IG1hc2s7IFwKLQllbHNlIFwKLQkJdmFsICY9IH5tYXNrOyBcCi19IHdoaWxlICgwKQotCiBzdGF0aWMgdm9pZCBzcGkxMDBrX2VuYWJsZV9jbG9jayhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQogewogCXVuc2lnbmVkIGludCB2YWw7CkBAIC0xMzksNyArMTI4LDcgQEAKIAl9CiAKIAlzcGkxMDBrX2VuYWJsZV9jbG9jayhtYXN0ZXIpOwotCXdyaXRldyggZGF0YSAsIHNwaTEwMGstPmJhc2UgKyBTUElfVFhfTVNCKTsKKwl3cml0ZXcoZGF0YSAsIHNwaTEwMGstPmJhc2UgKyBTUElfVFhfTVNCKTsKIAogCXdyaXRldyhTUElfQ1RSTF9TRU4oMCkgfAogCSAgICAgICBTUElfQ1RSTF9XT1JEX1NJWkUobGVuKSB8CkBAIC0xNDcsNyArMTM2LDggQEAKIAkgICAgICAgc3BpMTAway0+YmFzZSArIFNQSV9DVFJMKTsKIAogCS8qIFdhaXQgZm9yIGJpdCBhY2sgc2VuZCBjaGFuZ2UgKi8KLQl3aGlsZSgocmVhZHcoc3BpMTAway0+YmFzZSArIFNQSV9TVEFUVVMpICYgU1BJX1NUQVRVU19XRSkgIT0gU1BJX1NUQVRVU19XRSk7CisJd2hpbGUgKChyZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1NUQVRVUykgJiBTUElfU1RBVFVTX1dFKSAhPSBTUElfU1RBVFVTX1dFKQorCQk7CiAJdWRlbGF5KDEwMDApOwogCiAJc3BpMTAwa19kaXNhYmxlX2Nsb2NrKG1hc3Rlcik7CkBAIC0xNTUsNyArMTQ1LDcgQEAKIAogc3RhdGljIGludCBzcGkxMDBrX3JlYWRfZGF0YShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgbGVuKQogewotCWludCBkYXRhSCxkYXRhTDsKKwlpbnQgZGF0YUgsIGRhdGFMOwogCXN0cnVjdCBvbWFwMV9zcGkxMDBrICpzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJLyogQWx3YXlzIGRvIGF0IGxlYXN0IDE2IGJpdHMgKi8KQEAgLTE2OCw3ICsxNTgsOCBAQAogCSAgICAgICBTUElfQ1RSTF9SRCwKIAkgICAgICAgc3BpMTAway0+YmFzZSArIFNQSV9DVFJMKTsKIAotCXdoaWxlKChyZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1NUQVRVUykgJiBTUElfU1RBVFVTX1JEKSAhPSBTUElfU1RBVFVTX1JEKTsKKwl3aGlsZSAoKHJlYWR3KHNwaTEwMGstPmJhc2UgKyBTUElfU1RBVFVTKSAmIFNQSV9TVEFUVVNfUkQpICE9IFNQSV9TVEFUVVNfUkQpCisJCTsKIAl1ZGVsYXkoMTAwMCk7CiAKIAlkYXRhTCA9IHJlYWR3KHNwaTEwMGstPmJhc2UgKyBTUElfUlhfTFNCKTsKQEAgLTIwNCwxMiArMTk1LDEwIEBACiBzdGF0aWMgdW5zaWduZWQKIG9tYXAxX3NwaTEwMGtfdHhyeF9waW8oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKLQlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAgICAqc3BpMTAwazsKIAlzdHJ1Y3Qgb21hcDFfc3BpMTAwa19jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgY291bnQsIGM7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgd29yZF9sZW47CiAKLQlzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJY291bnQgPSB4ZmVyLT5sZW47CiAJYyA9IGNvdW50OwogCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOwpAQCAtMjIxLDEyICsyMTAsMTIgQEAKIAkJcnggPSB4ZmVyLT5yeF9idWY7CiAJCXR4ID0geGZlci0+dHhfYnVmOwogCQlkbyB7Ci0JCQljLT0xOworCQkJYyAtPSAxOwogCQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKQogCQkJCXNwaTEwMGtfd3JpdGVfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4sICp0eCsrKTsKIAkJCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTCkKIAkJCQkqcngrKyA9IHNwaTEwMGtfcmVhZF9kYXRhKHNwaS0+bWFzdGVyLCB3b3JkX2xlbik7Ci0JCX0gd2hpbGUoYyk7CisJCX0gd2hpbGUgKGMpOwogCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMTYpIHsKIAkJdTE2ICAgICAgICAgICAgICpyeDsKIAkJY29uc3QgdTE2ICAgICAgICp0eDsKQEAgLTIzNCwxMiArMjIzLDEyIEBACiAJCXJ4ID0geGZlci0+cnhfYnVmOwogCQl0eCA9IHhmZXItPnR4X2J1ZjsKIAkJZG8gewotCQkJYy09MjsKKwkJCWMgLT0gMjsKIAkJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTCkKLQkJCQlzcGkxMDBrX3dyaXRlX2RhdGEoc3BpLT5tYXN0ZXIsd29yZF9sZW4sICp0eCsrKTsKKwkJCQlzcGkxMDBrX3dyaXRlX2RhdGEoc3BpLT5tYXN0ZXIsIHdvcmRfbGVuLCAqdHgrKyk7CiAJCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpCi0JCQkJKnJ4KysgPSBzcGkxMDBrX3JlYWRfZGF0YShzcGktPm1hc3Rlcix3b3JkX2xlbik7Ci0JCX0gd2hpbGUoYyk7CisJCQkJKnJ4KysgPSBzcGkxMDBrX3JlYWRfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4pOworCQl9IHdoaWxlIChjKTsKIAl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDMyKSB7CiAJCXUzMiAgICAgICAgICAgICAqcng7CiAJCWNvbnN0IHUzMiAgICAgICAqdHg7CkBAIC0yNDcsMTIgKzIzNiwxMiBAQAogCQlyeCA9IHhmZXItPnJ4X2J1ZjsKIAkJdHggPSB4ZmVyLT50eF9idWY7CiAJCWRvIHsKLQkJCWMtPTQ7CisJCQljIC09IDQ7CiAJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwpCi0JCQkJc3BpMTAwa193cml0ZV9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuLCAqdHgpOworCQkJCXNwaTEwMGtfd3JpdGVfZGF0YShzcGktPm1hc3Rlciwgd29yZF9sZW4sICp0eCk7CiAJCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpCi0JCQkJKnJ4ID0gc3BpMTAwa19yZWFkX2RhdGEoc3BpLT5tYXN0ZXIsd29yZF9sZW4pOwotCQl9IHdoaWxlKGMpOworCQkJCSpyeCA9IHNwaTEwMGtfcmVhZF9kYXRhKHNwaS0+bWFzdGVyLCB3b3JkX2xlbik7CisJCX0gd2hpbGUgKGMpOwogCX0KIAlyZXR1cm4gY291bnQgLSBjOwogfQpAQCAtMjk0LDcgKzI4Myw3IEBACiAJc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCiAJaWYgKCFjcykgewotCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWNzID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpjcyksIEdGUF9LRVJORUwpOwogCQlpZiAoIWNzKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWNzLT5iYXNlID0gc3BpMTAway0+YmFzZSArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OwpAQCAtNDExLDE0ICs0MDAsMTQgQEAKIAlpZiAoIXBkZXYtPmlkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICpzcGkxMDBrKTsKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqc3BpMTAwaykpOwogCWlmIChtYXN0ZXIgPT0gTlVMTCkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtYXN0ZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocGRldi0+aWQgIT0gLTEpCi0JICAgICAgIG1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKIAogCW1hc3Rlci0+c2V0dXAgPSBvbWFwMV9zcGkxMDBrX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBvbWFwMV9zcGkxMDBrX3RyYW5zZmVyX29uZV9tZXNzYWdlOwpAQCAtNDM0LDcgKzQyMyw2IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIAogCXNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3BpMTAway0+bWFzdGVyID0gbWFzdGVyOwogCiAJLyoKIAkgKiBUaGUgbWVtb3J5IHJlZ2lvbiBiYXNlIGFkZHJlc3MgaXMgdGFrZW4gYXMgdGhlIHBsYXRmb3JtX2RhdGEuCkBAIC00NjEsOCArNDQ5LDYgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBlcnI7CiAKLQlzcGkxMDBrLT5zdGF0ZSA9IFNQSV9SVU5OSU5HOwotCiAJcmV0dXJuIHN0YXR1czsKIAogZXJyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMKaW5kZXggOTMxM2ZkMy4uYmUyYTJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYworKysgYi9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jCkBAIC05OSw3ICs5OSw2IEBACiB9OwogCiBzdHJ1Y3QgdXdpcmVfc3RhdGUgewotCXVuc2lnbmVkCWJpdHNfcGVyX3dvcmQ7CiAJdW5zaWduZWQJZGl2MV9pZHg7CiB9OwogCkBAIC0yMTAsOSArMjA5LDggQEAKIAogc3RhdGljIGludCB1d2lyZV90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7Ci0Jc3RydWN0IHV3aXJlX3N0YXRlICp1c3QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQJbGVuID0gdC0+bGVuOwotCXVuc2lnbmVkCWJpdHMgPSB1c3QtPmJpdHNfcGVyX3dvcmQ7CisJdW5zaWduZWQJYml0cyA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKIAl1bnNpZ25lZAlieXRlczsKIAl1MTYJCXZhbCwgdzsKIAlpbnQJCXN0YXR1cyA9IDA7CkBAIC0yMjAsMTAgKzIxOCw2IEBACiAJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZikKIAkJcmV0dXJuIDA7CiAKLQkvKiBNaWNyb3dpcmUgZG9lc24ndCByZWFkIGFuZCB3cml0ZSBjb25jdXJyZW50bHkgKi8KLQlpZiAodC0+dHhfYnVmICYmIHQtPnJ4X2J1ZikKLQkJcmV0dXJuIC1FUEVSTTsKLQogCXcgPSBzcGktPmNoaXBfc2VsZWN0IDw8IDEwOwogCXcgfD0gQ1NfQ01EOwogCkBAIC0zMjIsNyArMzE2LDYgQEAKIAlzdHJ1Y3QgdXdpcmVfc3RhdGUJKnVzdCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAlzdHJ1Y3QgdXdpcmVfc3BpCSp1d2lyZTsKIAl1bnNpZ25lZAkJZmxhZ3MgPSAwOwotCXVuc2lnbmVkCQliaXRzOwogCXVuc2lnbmVkCQloejsKIAl1bnNpZ25lZCBsb25nCQlyYXRlOwogCWludAkJCWRpdjFfaWR4OwpAQCAtMzMyLDIzICszMjUsNiBAQAogCiAJdXdpcmUgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCWlmIChzcGktPmNoaXBfc2VsZWN0ID4gMykgewotCQlwcl9kZWJ1ZygiJXM6IGNzJWQ/XG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpLCBzcGktPmNoaXBfc2VsZWN0KTsKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQotCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKHQgIT0gTlVMTCAmJiB0LT5iaXRzX3Blcl93b3JkKQotCQliaXRzID0gdC0+Yml0c19wZXJfd29yZDsKLQotCWlmIChiaXRzID4gMTYpIHsKLQkJcHJfZGVidWcoIiVzOiB3b3Jkc2l6ZSAlZD9cbiIsIGRldl9uYW1lKCZzcGktPmRldiksIGJpdHMpOwotCQlzdGF0dXMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCXVzdC0+Yml0c19wZXJfd29yZCA9IGJpdHM7Ci0KIAkvKiBtb2RlIDAuLjMsIGNsb2NrIGludmVydGVkIHNlcGFyYXRlbHk7CiAJICogc3RhbmRhcmQgbkNTIHNpZ25hbGluZzsKIAkgKiBkb24ndCB0cmVhdCBEST1oaWdoIGFzICJub3QgcmVhZHkiCkBAIC01MDIsNiArNDc4LDcgQEAKIAkJc3RhdHVzID0gUFRSX0VSUih1d2lyZS0+Y2spOwogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyBmdW5jdGlvbmFsIGNsb2NrP1xuIik7CiAJCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJCWlvdW5tYXAodXdpcmVfYmFzZSk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCWNsa19lbmFibGUodXdpcmUtPmNrKTsKQEAgLTUxNSw3ICs0OTIsNyBAQAogCiAJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7Ci0KKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfUkFOR0VfTUFTSygxLCAxNik7CiAJbWFzdGVyLT5mbGFncyA9IFNQSV9NQVNURVJfSEFMRl9EVVBMRVg7CiAKIAltYXN0ZXItPmJ1c19udW0gPSAyOwkvKiAib2ZmaWNpYWwiICovCkBAIC01MzksMTQgKzUxNiwxMyBAQAogc3RhdGljIGludCB1d2lyZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdXdpcmVfc3BpCSp1d2lyZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludAkJCXN0YXR1czsKIAogCS8vIEZJWE1FIHJlbW92ZSBhbGwgY2hpbGQgZGV2aWNlcywgc29tZXdoZXJlIC4uLgogCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmdXdpcmUtPmJpdGJhbmcpOworCXNwaV9iaXRiYW5nX3N0b3AoJnV3aXJlLT5iaXRiYW5nKTsKIAl1d2lyZV9vZmYodXdpcmUpOwogCWlvdW5tYXAodXdpcmVfYmFzZSk7Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gMDsKIH0KIAogLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCmluZGV4IGE3MjEyN2YuLjI5NDFjNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCkBAIC0yMiw3ICsyMiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTQ1LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1vbWFwMi1tY3NwaS5oPgogCiAjZGVmaW5lIE9NQVAyX01DU1BJX01BWF9GUkVRCQk0ODAwMDAwMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRElWSURFUgkJNDA5NgogI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRklGT0RFUFRICTY0CiAjZGVmaW5lIE9NQVAyX01DU1BJX01BWF9GSUZPV0NOVAkweEZGRkYKICNkZWZpbmUgU1BJX0FVVE9TVVNQRU5EX1RJTUVPVVQJCTIwMDAKQEAgLTg5LDYgKzg5LDcgQEAKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFCUJJVCgyMCkKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZGRVQJCUJJVCgyNykKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZGRVIJCUJJVCgyOCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0NMS0cJCUJJVCgyOSkKIAogI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTCQlCSVQoMCkKICNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX1RYUwkJQklUKDEpCkBAIC05Niw2ICs5Nyw3IEBACiAjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9UWEZGRQlCSVQoMykKIAogI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkxfRU4JCUJJVCgwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkxfRVhUQ0xLX01BU0sJKDB4ZmYgPDwgOCkKIAogI2RlZmluZSBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEVfV0tFTglCSVQoMCkKIApAQCAtMTQ5LDcgKzE1MSw3IEBACiAJaW50CQkJd29yZF9sZW47CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwogCS8qIENvbnRleHQgc2F2ZSBhbmQgcmVzdG9yZSBzaGFkb3cgcmVnaXN0ZXIgKi8KLQl1MzIJCQljaGNvbmYwOworCXUzMgkJCWNoY29uZjAsIGNoY3RybDA7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWNzcGlfd3JpdGVfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCkBAIC0yMzAsMTAgKzIzMiwxNiBAQAogCiBzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBlbmFibGUpCiB7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAl1MzIgbDsKIAotCWwgPSBlbmFibGUgPyBPTUFQMl9NQ1NQSV9DSENUUkxfRU4gOiAwOwotCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ1RSTDAsIGwpOworCWwgPSBjcy0+Y2hjdHJsMDsKKwlpZiAoZW5hYmxlKQorCQlsIHw9IE9NQVAyX01DU1BJX0NIQ1RSTF9FTjsKKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ1RSTF9FTjsKKwljcy0+Y2hjdHJsMCA9IGw7CisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCwgY3MtPmNoY3RybDApOwogCS8qIEZsYXNoIHBvc3Qtd3JpdGVzICovCiAJbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENUUkwwKTsKIH0KQEAgLTg0MCw3ICs4NDgsNyBAQAogCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaTsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2NudHJsOwotCXUzMiBsID0gMCwgZGl2ID0gMDsKKwl1MzIgbCA9IDAsIGNsa2QgPSAwLCBkaXYsIGV4dGNsayA9IDAsIGNsa2cgPSAwOwogCXU4IHdvcmRfbGVuID0gc3BpLT5iaXRzX3Blcl93b3JkOwogCXUzMiBzcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwogCkBAIC04NTYsNyArODY0LDE3IEBACiAJCXNwZWVkX2h6ID0gdC0+c3BlZWRfaHo7CiAKIAlzcGVlZF9oeiA9IG1pbl90KHUzMiwgc3BlZWRfaHosIE9NQVAyX01DU1BJX01BWF9GUkVRKTsKLQlkaXYgPSBvbWFwMl9tY3NwaV9jYWxjX2Rpdmlzb3Ioc3BlZWRfaHopOworCWlmIChzcGVlZF9oeiA8IChPTUFQMl9NQ1NQSV9NQVhfRlJFUSAvIE9NQVAyX01DU1BJX01BWF9ESVZJREVSKSkgeworCQljbGtkID0gb21hcDJfbWNzcGlfY2FsY19kaXZpc29yKHNwZWVkX2h6KTsKKwkJc3BlZWRfaHogPSBPTUFQMl9NQ1NQSV9NQVhfRlJFUSA+PiBjbGtkOworCQljbGtnID0gMDsKKwl9IGVsc2UgeworCQlkaXYgPSAoT01BUDJfTUNTUElfTUFYX0ZSRVEgKyBzcGVlZF9oeiAtIDEpIC8gc3BlZWRfaHo7CisJCXNwZWVkX2h6ID0gT01BUDJfTUNTUElfTUFYX0ZSRVEgLyBkaXY7CisJCWNsa2QgPSAoZGl2IC0gMSkgJiAweGY7CisJCWV4dGNsayA9IChkaXYgLSAxKSA+PiA0OworCQljbGtnID0gT01BUDJfTUNTUElfQ0hDT05GX0NMS0c7CisJfQogCiAJbCA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7CiAKQEAgLTg4NSw3ICs5MDMsMTYgQEAKIAogCS8qIHNldCBjbG9jayBkaXZpc29yICovCiAJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX0NMS0RfTUFTSzsKLQlsIHw9IGRpdiA8PCAyOworCWwgfD0gY2xrZCA8PCAyOworCisJLyogc2V0IGNsb2NrIGdyYW51bGFyaXR5ICovCisJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX0NMS0c7CisJbCB8PSBjbGtnOworCWlmIChjbGtnKSB7CisJCWNzLT5jaGN0cmwwICY9IH5PTUFQMl9NQ1NQSV9DSENUUkxfRVhUQ0xLX01BU0s7CisJCWNzLT5jaGN0cmwwIHw9IGV4dGNsayA8PCA4OworCQltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENUUkwwLCBjcy0+Y2hjdHJsMCk7CisJfQogCiAJLyogc2V0IFNQSSBtb2RlIDAuLjMgKi8KIAlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCkBAIC05MDAsNyArOTI3LDcgQEAKIAltY3NwaV93cml0ZV9jaGNvbmYwKHNwaSwgbCk7CiAKIAlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBzcGVlZCAlZCwgc2FtcGxlICVzIGVkZ2UsIGNsayAlc1xuIiwKLQkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IGRpdiwKKwkJCXNwZWVkX2h6LAogCQkJKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSA/ICJ0cmFpbGluZyIgOiAibGVhZGluZyIsCiAJCQkoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gImludmVydGVkIiA6ICJub3JtYWwiKTsKIApAQCAtOTcyLDYgKzk5OSw3IEBACiAJCWNzLT5iYXNlID0gbWNzcGktPmJhc2UgKyBzcGktPmNoaXBfc2VsZWN0ICogMHgxNDsKIAkJY3MtPnBoeXMgPSBtY3NwaS0+cGh5cyArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OwogCQljcy0+Y2hjb25mMCA9IDA7CisJCWNzLT5jaGN0cmwwID0gMDsKIAkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CiAJCS8qIExpbmsgdGhpcyB0byBjb250ZXh0IHNhdmUgbGlzdCAqLwogCQlsaXN0X2FkZF90YWlsKCZjcy0+bm9kZSwgJmN0eC0+Y3MpOwpAQCAtMTA1NywxMiArMTA4NSwxNSBAQAogCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgeworCQlpZiAocGFyX292ZXJyaWRlIHx8CisJCSAgICAodC0+c3BlZWRfaHogIT0gc3BpLT5tYXhfc3BlZWRfaHopIHx8CisJCSAgICAodC0+Yml0c19wZXJfd29yZCAhPSBzcGktPmJpdHNfcGVyX3dvcmQpKSB7CiAJCQlwYXJfb3ZlcnJpZGUgPSAxOwogCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKIAkJCWlmIChzdGF0dXMgPCAwKQogCQkJCWJyZWFrOwotCQkJaWYgKCF0LT5zcGVlZF9oeiAmJiAhdC0+Yml0c19wZXJfd29yZCkKKwkJCWlmICh0LT5zcGVlZF9oeiA9PSBzcGktPm1heF9zcGVlZF9oeiAmJgorCQkJICAgIHQtPmJpdHNfcGVyX3dvcmQgPT0gc3BpLT5iaXRzX3Blcl93b3JkKQogCQkJCXBhcl9vdmVycmlkZSA9IDA7CiAJCX0KIAkJaWYgKGNkICYmIGNkLT5jc19wZXJfd29yZCkgewpAQCAtMTE3NiwxNiArMTIwNywxMiBAQAogCW0tPmFjdHVhbF9sZW5ndGggPSAwOwogCW0tPnN0YXR1cyA9IDA7CiAKLQkvKiByZWplY3QgaW52YWxpZCBtZXNzYWdlcyBhbmQgdHJhbnNmZXJzICovCi0JaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykpCi0JCXJldHVybiAtRUlOVkFMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCQljb25zdCB2b2lkCSp0eF9idWYgPSB0LT50eF9idWY7CiAJCXZvaWQJCSpyeF9idWYgPSB0LT5yeF9idWY7CiAJCXVuc2lnbmVkCWxlbiA9IHQtPmxlbjsKIAotCQlpZiAodC0+c3BlZWRfaHogPiBPTUFQMl9NQ1NQSV9NQVhfRlJFUQotCQkJCXx8IChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkpIHsKKwkJaWYgKChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkpIHsKIAkJCWRldl9kYmcobWNzcGktPmRldiwgInRyYW5zZmVyOiAlZCBIeiwgJWQgJXMlcywgJWQgYnB3XG4iLAogCQkJCQl0LT5zcGVlZF9oeiwKIAkJCQkJbGVuLApAQCAtMTE5NCwxMiArMTIyMSw2IEBACiAJCQkJCXQtPmJpdHNfcGVyX3dvcmQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKHQtPnNwZWVkX2h6ICYmIHQtPnNwZWVkX2h6IDwgKE9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KSkgewotCQkJZGV2X2RiZyhtY3NwaS0+ZGV2LCAic3BlZWRfaHogJWQgYmVsb3cgbWluaW11bSAlZCBIelxuIiwKLQkJCQkJdC0+c3BlZWRfaHosCi0JCQkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAKIAkJaWYgKG0tPmlzX2RtYV9tYXBwZWQgfHwgbGVuIDwgRE1BX01JTl9CWVRFUykKIAkJCWNvbnRpbnVlOwpAQCAtMTMxMSw2ICsxMzMyLDggQEAKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gb21hcDJfbWNzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CiAJbWFzdGVyLT5jbGVhbnVwID0gb21hcDJfbWNzcGlfY2xlYW51cDsKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gbm9kZTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IE9NQVAyX01DU1BJX01BWF9GUkVROworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gT01BUDJfTUNTUElfTUFYX0ZSRVEgPj4gMTU7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb3Jpb24uYyBiL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCmluZGV4IDdmMjEyMWYuLmQwMThhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCkBAIC05LDcgKzksNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNDMsOCArNDIsNiBAQAogc3RydWN0IG9yaW9uX3NwaSB7CiAJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKIAl2b2lkIF9faW9tZW0JCSpiYXNlOwotCXVuc2lnbmVkIGludAkJbWF4X3NwZWVkOwotCXVuc2lnbmVkIGludAkJbWluX3NwZWVkOwogCXN0cnVjdCBjbGsgICAgICAgICAgICAgICpjbGs7CiB9OwogCkBAIC03NSwyMyArNzIsNiBAQAogCXdyaXRlbCh2YWwsIHJlZ19hZGRyKTsKIH0KIAotc3RhdGljIGludCBvcmlvbl9zcGlfc2V0X3RyYW5zZmVyX3NpemUoc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpLCBpbnQgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA9PSAxNikgewotCQlvcmlvbl9zcGlfc2V0Yml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHLAotCQkJCSAgT1JJT05fU1BJX0lGXzhfMTZfQklUX01PREUpOwotCX0gZWxzZSBpZiAoc2l6ZSA9PSA4KSB7Ci0JCW9yaW9uX3NwaV9jbHJiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NPTkZJR19SRUcsCi0JCQkJICBPUklPTl9TUElfSUZfOF8xNl9CSVRfTU9ERSk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIkJhZCBiaXRzIHBlciB3b3JkIHZhbHVlICVkIChvbmx5IDggb3IgMTYgYXJlIGFsbG93ZWQpLlxuIiwKLQkJCXNpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBvcmlvbl9zcGlfYmF1ZHJhdGVfc2V0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIGludCBzcGVlZCkKIHsKIAl1MzIgdGNsa19oejsKQEAgLTE3MCw3ICsxNTAsMTQgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXJldHVybiBvcmlvbl9zcGlfc2V0X3RyYW5zZmVyX3NpemUob3Jpb25fc3BpLCBiaXRzX3Blcl93b3JkKTsKKwlpZiAoYml0c19wZXJfd29yZCA9PSAxNikKKwkJb3Jpb25fc3BpX3NldGJpdHMob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ09ORklHX1JFRywKKwkJCQkgIE9SSU9OX1NQSV9JRl84XzE2X0JJVF9NT0RFKTsKKwllbHNlCisJCW9yaW9uX3NwaV9jbHJiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NPTkZJR19SRUcsCisJCQkJICBPUklPTl9TUElfSUZfOF8xNl9CSVRfTU9ERSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgb3Jpb25fc3BpX3NldF9jcyhzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGksIGludCBlbmFibGUpCkBAIC0yNjAsMTEgKzI0Nyw5IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CiBvcmlvbl9zcGlfd3JpdGVfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewotCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaTsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAJaW50IHdvcmRfbGVuOwogCi0Jb3Jpb25fc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJd29yZF9sZW4gPSBzcGktPmJpdHNfcGVyX3dvcmQ7CiAJY291bnQgPSB4ZmVyLT5sZW47CiAKQEAgLTMxMCwyNyArMjk1LDYgQEAKIAkJZ290byBtc2dfZG9uZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQkvKiBtYWtlIHN1cmUgYnVmZmVyIGxlbmd0aCBpcyBldmVuIHdoZW4gd29ya2luZyBpbiAxNgotCQkgKiBiaXQgbW9kZSovCi0JCWlmICgodC0+Yml0c19wZXJfd29yZCA9PSAxNikgJiYgKHQtPmxlbiAmIDEpKSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkibWVzc2FnZSByZWplY3RlZCA6ICIKLQkJCQkib2RkIGRhdGEgbGVuZ3RoICVkIHdoaWxlIGluIDE2IGJpdCBtb2RlXG4iLAotCQkJCXQtPmxlbik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBtc2dfZG9uZTsKLQkJfQotCi0JCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IG9yaW9uX3NwaS0+bWluX3NwZWVkKSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkibWVzc2FnZSByZWplY3RlZCA6ICIKLQkJCQkiZGV2aWNlIG1pbiBzcGVlZCAoJWQgSHopIGV4Y2VlZHMgIgotCQkJCSJyZXF1aXJlZCB0cmFuc2ZlciBzcGVlZCAoJWQgSHopXG4iLAotCQkJCW9yaW9uX3NwaS0+bWluX3NwZWVkLCB0LT5zcGVlZF9oeik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBtc2dfZG9uZTsKLQkJfQotCiAJCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgewogCQkJcGFyX292ZXJyaWRlID0gMTsKIAkJCXN0YXR1cyA9IG9yaW9uX3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIHQpOwpAQCAtMzc1LDI4ICszMzksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9yaW9uX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaTsKLQotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKChzcGktPm1heF9zcGVlZF9oeiA9PSAwKQotCQkJfHwgKHNwaS0+bWF4X3NwZWVkX2h6ID4gb3Jpb25fc3BpLT5tYXhfc3BlZWQpKQotCQlzcGktPm1heF9zcGVlZF9oeiA9IG9yaW9uX3NwaS0+bWF4X3NwZWVkOwotCi0JaWYgKHNwaS0+bWF4X3NwZWVkX2h6IDwgb3Jpb25fc3BpLT5taW5fc3BlZWQpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cDogcmVxdWVzdGVkIHNwZWVkIHRvbyBsb3cgJWQgSHpcbiIsCi0JCQlzcGktPm1heF9zcGVlZF9oeik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogYmF1ZHJhdGUgJiB3aWR0aCB3aWxsIGJlIHNldCBvcmlvbl9zcGlfc2V0dXBfdHJhbnNmZXIKLQkgKi8KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBvcmlvbl9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwpAQCAtNDI1LDkgKzM2Nyw5IEBACiAJLyogd2Ugc3VwcG9ydCBvbmx5IG1vZGUgMCwgYW5kIG5vIG9wdGlvbnMgKi8KIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUEhBIHwgU1BJX0NQT0w7CiAKLQltYXN0ZXItPnNldHVwID0gb3Jpb25fc3BpX3NldHVwOwogCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBvcmlvbl9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IE9SSU9OX05VTV9DSElQU0VMRUNUUzsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KSB8IFNQSV9CUFdfTUFTSygxNik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwogCkBAIC00NDMsOCArMzg1LDggQEAKIAljbGtfcHJlcGFyZShzcGktPmNsayk7CiAJY2xrX2VuYWJsZShzcGktPmNsayk7CiAJdGNsa19oeiA9IGNsa19nZXRfcmF0ZShzcGktPmNsayk7Ci0Jc3BpLT5tYXhfc3BlZWQgPSBESVZfUk9VTkRfVVAodGNsa19oeiwgNCk7Ci0Jc3BpLT5taW5fc3BlZWQgPSBESVZfUk9VTkRfVVAodGNsa19oeiwgMzApOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gRElWX1JPVU5EX1VQKHRjbGtfaHosIDQpOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gRElWX1JPVU5EX1VQKHRjbGtfaHosIDMwKTsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCXNwaS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKaW5kZXggMjc4OWI0NS4uNTFkOTk3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKQEAgLTQ1OSw5ICs0NTksOCBAQAogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmxhc3RfdHJhbnNmZXI7CiAJcGwwMjItPm5leHRfbXNnX2NzX2FjdGl2ZSA9IGZhbHNlOwogCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkocGwwMjItPmN1cl9tc2ctPnRyYW5zZmVycy5wcmV2LAotCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQl0cmFuc2Zlcl9saXN0KTsKKwlsYXN0X3RyYW5zZmVyID0gbGlzdF9sYXN0X2VudHJ5KCZwbDAyMi0+Y3VyX21zZy0+dHJhbnNmZXJzLAorCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKIAogCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBiZWZvcmUgYW55IGNoYW5nZSBpbiBjaGlwIHNlbGVjdCAqLwogCWlmIChsYXN0X3RyYW5zZmVyLT5kZWxheV91c2VjcykKQEAgLTIxMDksOCArMjEwOCw2IEBACiAJcGwwMjItPmNoaXBzZWxlY3RzID0gZGV2bV9remFsbG9jKGRldiwgbnVtX2NzICogc2l6ZW9mKGludCksCiAJCQkJCSAgR0ZQX0tFUk5FTCk7CiAKLQlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKGRldik7Ci0KIAkvKgogCSAqIEJ1cyBOdW1iZXIgV2hpY2ggaGFzIGJlZW4gQXNzaWduZWQgdG8gdGhpcyBTU1AgY29udHJvbGxlcgogCSAqIG9uIHRoaXMgYm9hcmQKQEAgLTIxODMsMTMgKzIxODAsNyBAQAogCQlnb3RvIGVycl9ub19jbGs7CiAJfQogCi0Jc3RhdHVzID0gY2xrX3ByZXBhcmUocGwwMjItPmNsayk7Ci0JaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJjb3VsZCBub3QgcHJlcGFyZSBTU1AvU1BJIGJ1cyBjbG9ja1xuIik7Ci0JCWdvdG8gIGVycl9jbGtfcHJlcDsKLQl9Ci0KLQlzdGF0dXMgPSBjbGtfZW5hYmxlKHBsMDIyLT5jbGspOworCXN0YXR1cyA9IGNsa19wcmVwYXJlX2VuYWJsZShwbDAyMi0+Y2xrKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJmFkZXYtPmRldiwgImNvdWxkIG5vdCBlbmFibGUgU1NQL1NQSSBidXMgY2xvY2tcbiIpOwogCQlnb3RvIGVycl9ub19jbGtfZW47CkBAIC0yMjUwLDEwICsyMjQxLDggQEAKIAlpZiAocGxhdGZvcm1faW5mby0+ZW5hYmxlX2RtYSkKIAkJcGwwMjJfZG1hX3JlbW92ZShwbDAyMik7CiAgZXJyX25vX2lycToKLQljbGtfZGlzYWJsZShwbDAyMi0+Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGwwMjItPmNsayk7CiAgZXJyX25vX2Nsa19lbjoKLQljbGtfdW5wcmVwYXJlKHBsMDIyLT5jbGspOwotIGVycl9jbGtfcHJlcDoKICBlcnJfbm9fY2xrOgogIGVycl9ub19pb3JlbWFwOgogCWFtYmFfcmVsZWFzZV9yZWdpb25zKGFkZXYpOwpAQCAtMjI4MSw0MiArMjI3MCwxMyBAQAogCWlmIChwbDAyMi0+bWFzdGVyX2luZm8tPmVuYWJsZV9kbWEpCiAJCXBsMDIyX2RtYV9yZW1vdmUocGwwMjIpOwogCi0JY2xrX2Rpc2FibGUocGwwMjItPmNsayk7Ci0JY2xrX3VucHJlcGFyZShwbDAyMi0+Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGwwMjItPmNsayk7CiAJYW1iYV9yZWxlYXNlX3JlZ2lvbnMoYWRldik7CiAJdGFza2xldF9kaXNhYmxlKCZwbDAyMi0+cHVtcF90cmFuc2ZlcnMpOwogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU1VTUEVORCkgfHwgZGVmaW5lZChDT05GSUdfUE1fUlVOVElNRSkKLS8qCi0gKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIGZyb20gYm90aCBzdXNwZW5kL3Jlc3VtZSBhbmQKLSAqIHRoZSBydW50aW1lIGNvdW50ZXJwYXJ0cyB0byBoYW5kbGUgZXh0ZXJuYWwgcmVzb3VyY2VzIGxpa2UKLSAqIGNsb2NrcywgcGlucyBhbmQgcmVndWxhdG9ycyB3aGVuIGdvaW5nIHRvIHNsZWVwLgotICovCi1zdGF0aWMgdm9pZCBwbDAyMl9zdXNwZW5kX3Jlc291cmNlcyhzdHJ1Y3QgcGwwMjIgKnBsMDIyLCBib29sIHJ1bnRpbWUpCi17Ci0JY2xrX2Rpc2FibGUocGwwMjItPmNsayk7Ci0KLQlpZiAocnVudGltZSkKLQkJcGluY3RybF9wbV9zZWxlY3RfaWRsZV9zdGF0ZSgmcGwwMjItPmFkZXYtPmRldik7Ci0JZWxzZQotCQlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZSgmcGwwMjItPmFkZXYtPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBsMDIyX3Jlc3VtZV9yZXNvdXJjZXMoc3RydWN0IHBsMDIyICpwbDAyMiwgYm9vbCBydW50aW1lKQotewotCS8qIEZpcnN0IGdvIHRvIHRoZSBkZWZhdWx0IHN0YXRlICovCi0JcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZSgmcGwwMjItPmFkZXYtPmRldik7Ci0JaWYgKCFydW50aW1lKQotCQkvKiBUaGVuIGxldCdzIGlkbGUgdGhlIHBpbnMgdW50aWwgdGhlIG5leHQgdHJhbnNmZXIgaGFwcGVucyAqLwotCQlwaW5jdHJsX3BtX3NlbGVjdF9pZGxlX3N0YXRlKCZwbDAyMi0+YWRldi0+ZGV2KTsKLQotCWNsa19lbmFibGUocGwwMjItPmNsayk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TVVNQRU5ECisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHBsMDIyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTIzMjgsOCArMjI4OCwxMyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKLQlwbDAyMl9zdXNwZW5kX3Jlc291cmNlcyhwbDAyMiwgZmFsc2UpOworCXJldCA9IHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZChkZXYpOworCWlmIChyZXQpIHsKKwkJc3BpX21hc3Rlcl9yZXN1bWUocGwwMjItPm1hc3Rlcik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoZGV2KTsKIAogCWRldl9kYmcoZGV2LCAic3VzcGVuZGVkXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTIzNDAsOCArMjMwNSw5IEBACiAJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCByZXQ7CiAKLQlwbDAyMl9yZXN1bWVfcmVzb3VyY2VzKHBsMDIyLCBmYWxzZSk7Ci0JcG1fcnVudGltZV9wdXQoZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZShkZXYpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSByZXN1bWluZ1xuIik7CiAKIAkvKiBTdGFydCB0aGUgcXVldWUgcnVubmluZyAqLwogCXJldCA9IHNwaV9tYXN0ZXJfcmVzdW1lKHBsMDIyLT5tYXN0ZXIpOwpAQCAtMjM1MiwxNCArMjMxOCwxNiBAQAogCiAJcmV0dXJuIHJldDsKIH0KLSNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKyNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcGwwMjJfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlwbDAyMl9zdXNwZW5kX3Jlc291cmNlcyhwbDAyMiwgdHJ1ZSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsMDIyLT5jbGspOworCXBpbmN0cmxfcG1fc2VsZWN0X2lkbGVfc3RhdGUoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMzY3LDE0ICsyMzM1LDE2IEBACiB7CiAJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcGwwMjJfcmVzdW1lX3Jlc291cmNlcyhwbDAyMiwgdHJ1ZSk7CisJcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZShkZXYpOworCWNsa19wcmVwYXJlX2VuYWJsZShwbDAyMi0+Y2xrKTsKKwogCXJldHVybiAwOwogfQogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwbDAyMl9kZXZfcG1fb3BzID0gewogCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBsMDIyX3N1c3BlbmQsIHBsMDIyX3Jlc3VtZSkKLQlTRVRfUlVOVElNRV9QTV9PUFMocGwwMjJfcnVudGltZV9zdXNwZW5kLCBwbDAyMl9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKKwlTRVRfUE1fUlVOVElNRV9QTV9PUFMocGwwMjJfcnVudGltZV9zdXNwZW5kLCBwbDAyMl9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX2FybSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYwppbmRleCA1ZWU1NjcyLi44MGI4NDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHBjNHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jCkBAIC0yNCw3ICsyNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtZG1hLmMKaW5kZXggM2MwYjU1MS4uNzEzYWY0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LWRtYS5jCkBAIC05LDcgKzksNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1weGFkbWEuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcHhhZG1hLmMKaW5kZXggMjkxNmVmYy4uZThhMjZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1weGFkbWEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXB4YWRtYS5jCkBAIC0xOCw3ICsxOCw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYwppbmRleCBjNzAyZmM1Li40MTE4NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5jCkBAIC0zNjIsOCArMzYyLDcgQEAKIAlkcnZfZGF0YS0+Y3VyX21zZyA9IE5VTEw7CiAJZHJ2X2RhdGEtPmN1cl90cmFuc2ZlciA9IE5VTEw7CiAKLQlsYXN0X3RyYW5zZmVyID0gbGlzdF9lbnRyeShtc2ctPnRyYW5zZmVycy5wcmV2LAotCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAorCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2xhc3RfZW50cnkoJm1zZy0+dHJhbnNmZXJzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAogCQkJCQl0cmFuc2Zlcl9saXN0KTsKIAogCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBiZWZvcmUgYW55IGNoYW5nZSBpbiBjaGlwIHNlbGVjdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXF1cC5jIGIvZHJpdmVycy9zcGkvc3BpLXF1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzJlODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktcXVwLmMKQEAgLTAsMCArMSw3NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCwgVGhlIExpbnV4IGZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmV2IDIgYW5kCisgKiBvbmx5IHJldiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgZnJlZSBTb2Z0d2FyZSBmb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBmSVRORVNTIGZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjZGVmaW5lIFFVUF9DT05GSUcJCQkweDAwMDAKKyNkZWZpbmUgUVVQX1NUQVRFCQkJMHgwMDA0CisjZGVmaW5lIFFVUF9JT19NX01PREVTCQkJMHgwMDA4CisjZGVmaW5lIFFVUF9TV19SRVNFVAkJCTB4MDAwYworI2RlZmluZSBRVVBfT1BFUkFUSU9OQUwJCQkweDAwMTgKKyNkZWZpbmUgUVVQX0VSUk9SX0ZMQUdTCQkJMHgwMDFjCisjZGVmaW5lIFFVUF9FUlJPUl9GTEFHU19FTgkJMHgwMDIwCisjZGVmaW5lIFFVUF9PUEVSQVRJT05BTF9NQVNLCQkweDAwMjgKKyNkZWZpbmUgUVVQX0hXX1ZFUlNJT04JCQkweDAwMzAKKyNkZWZpbmUgUVVQX01YX09VVFBVVF9DTlQJCTB4MDEwMAorI2RlZmluZSBRVVBfT1VUUFVUX0ZJRk8JCQkweDAxMTAKKyNkZWZpbmUgUVVQX01YX1dSSVRFX0NOVAkJMHgwMTUwCisjZGVmaW5lIFFVUF9NWF9JTlBVVF9DTlQJCTB4MDIwMAorI2RlZmluZSBRVVBfTVhfUkVBRF9DTlQJCQkweDAyMDgKKyNkZWZpbmUgUVVQX0lOUFVUX0ZJRk8JCQkweDAyMTgKKworI2RlZmluZSBTUElfQ09ORklHCQkJMHgwMzAwCisjZGVmaW5lIFNQSV9JT19DT05UUk9MCQkJMHgwMzA0CisjZGVmaW5lIFNQSV9FUlJPUl9GTEFHUwkJCTB4MDMwOAorI2RlZmluZSBTUElfRVJST1JfRkxBR1NfRU4JCTB4MDMwYworCisvKiBRVVBfQ09ORklHIGZpZWxkcyAqLworI2RlZmluZSBRVVBfQ09ORklHX1NQSV9NT0RFCQkoMSA8PCA4KQorI2RlZmluZSBRVVBfQ09ORklHX0NMT0NLX0FVVE9fR0FURQlCSVQoMTMpCisjZGVmaW5lIFFVUF9DT05GSUdfTk9fSU5QVVQJCUJJVCg3KQorI2RlZmluZSBRVVBfQ09ORklHX05PX09VVFBVVAkJQklUKDYpCisjZGVmaW5lIFFVUF9DT05GSUdfTgkJCTB4MDAxZgorCisvKiBRVVBfU1RBVEUgZmllbGRzICovCisjZGVmaW5lIFFVUF9TVEFURV9WQUxJRAkJCUJJVCgyKQorI2RlZmluZSBRVVBfU1RBVEVfUkVTRVQJCQkwCisjZGVmaW5lIFFVUF9TVEFURV9SVU4JCQkxCisjZGVmaW5lIFFVUF9TVEFURV9QQVVTRQkJCTMKKyNkZWZpbmUgUVVQX1NUQVRFX01BU0sJCQkzCisjZGVmaW5lIFFVUF9TVEFURV9DTEVBUgkJCTIKKworI2RlZmluZSBRVVBfSFdfVkVSU0lPTl8yXzFfMQkJMHgyMDAxMDAwMQorCisvKiBRVVBfSU9fTV9NT0RFUyBmaWVsZHMgKi8KKyNkZWZpbmUgUVVQX0lPX01fUEFDS19FTgkJQklUKDE1KQorI2RlZmluZSBRVVBfSU9fTV9VTlBBQ0tfRU4JCUJJVCgxNCkKKyNkZWZpbmUgUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLX1NISUZUCTEyCisjZGVmaW5lIFFVUF9JT19NX09VVFBVVF9NT0RFX01BU0tfU0hJRlQJMTAKKyNkZWZpbmUgUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLCSgzIDw8IFFVUF9JT19NX0lOUFVUX01PREVfTUFTS19TSElGVCkKKyNkZWZpbmUgUVVQX0lPX01fT1VUUFVUX01PREVfTUFTSwkoMyA8PCBRVVBfSU9fTV9PVVRQVVRfTU9ERV9NQVNLX1NISUZUKQorCisjZGVmaW5lIFFVUF9JT19NX09VVFBVVF9CTE9DS19TSVpFKHgpCSgoKHgpICYgKDB4MDMgPDwgMCkpID4+IDApCisjZGVmaW5lIFFVUF9JT19NX09VVFBVVF9GSUZPX1NJWkUoeCkJKCgoeCkgJiAoMHgwNyA8PCAyKSkgPj4gMikKKyNkZWZpbmUgUVVQX0lPX01fSU5QVVRfQkxPQ0tfU0laRSh4KQkoKCh4KSAmICgweDAzIDw8IDUpKSA+PiA1KQorI2RlZmluZSBRVVBfSU9fTV9JTlBVVF9GSUZPX1NJWkUoeCkJKCgoeCkgJiAoMHgwNyA8PCA3KSkgPj4gNykKKworI2RlZmluZSBRVVBfSU9fTV9NT0RFX0ZJRk8JCTAKKyNkZWZpbmUgUVVQX0lPX01fTU9ERV9CTE9DSwkJMQorI2RlZmluZSBRVVBfSU9fTV9NT0RFX0RNT1YJCTIKKyNkZWZpbmUgUVVQX0lPX01fTU9ERV9CQU0JCTMKKworLyogUVVQX09QRVJBVElPTkFMIGZpZWxkcyAqLworI2RlZmluZSBRVVBfT1BfTUFYX0lOUFVUX0RPTkVfRkxBRwlCSVQoMTEpCisjZGVmaW5lIFFVUF9PUF9NQVhfT1VUUFVUX0RPTkVfRkxBRwlCSVQoMTApCisjZGVmaW5lIFFVUF9PUF9JTl9TRVJWSUNFX0ZMQUcJCUJJVCg5KQorI2RlZmluZSBRVVBfT1BfT1VUX1NFUlZJQ0VfRkxBRwkJQklUKDgpCisjZGVmaW5lIFFVUF9PUF9JTl9GSUZPX0ZVTEwJCUJJVCg3KQorI2RlZmluZSBRVVBfT1BfT1VUX0ZJRk9fRlVMTAkJQklUKDYpCisjZGVmaW5lIFFVUF9PUF9JTl9GSUZPX05PVF9FTVBUWQlCSVQoNSkKKyNkZWZpbmUgUVVQX09QX09VVF9GSUZPX05PVF9FTVBUWQlCSVQoNCkKKworLyogUVVQX0VSUk9SX0ZMQUdTIGFuZCBRVVBfRVJST1JfRkxBR1NfRU4gZmllbGRzICovCisjZGVmaW5lIFFVUF9FUlJPUl9PVVRQVVRfT1ZFUl9SVU4JQklUKDUpCisjZGVmaW5lIFFVUF9FUlJPUl9JTlBVVF9VTkRFUl9SVU4JQklUKDQpCisjZGVmaW5lIFFVUF9FUlJPUl9PVVRQVVRfVU5ERVJfUlVOCUJJVCgzKQorI2RlZmluZSBRVVBfRVJST1JfSU5QVVRfT1ZFUl9SVU4JQklUKDIpCisKKy8qIFNQSV9DT05GSUcgZmllbGRzICovCisjZGVmaW5lIFNQSV9DT05GSUdfSFNfTU9ERQkJQklUKDEwKQorI2RlZmluZSBTUElfQ09ORklHX0lOUFVUX0ZJUlNUCQlCSVQoOSkKKyNkZWZpbmUgU1BJX0NPTkZJR19MT09QQkFDSwkJQklUKDgpCisKKy8qIFNQSV9JT19DT05UUk9MIGZpZWxkcyAqLworI2RlZmluZSBTUElfSU9fQ19GT1JDRV9DUwkJQklUKDExKQorI2RlZmluZSBTUElfSU9fQ19DTEtfSURMRV9ISUdICQlCSVQoMTApCisjZGVmaW5lIFNQSV9JT19DX01YX0NTX01PREUJCUJJVCg4KQorI2RlZmluZSBTUElfSU9fQ19DU19OX1BPTEFSSVRZXzAJQklUKDQpCisjZGVmaW5lIFNQSV9JT19DX0NTX1NFTEVDVCh4KQkJKCgoeCkgJiAzKSA8PCAyKQorI2RlZmluZSBTUElfSU9fQ19DU19TRUxFQ1RfTUFTSwkJMHgwMDBjCisjZGVmaW5lIFNQSV9JT19DX1RSSVNUQVRFX0NTCQlCSVQoMSkKKyNkZWZpbmUgU1BJX0lPX0NfTk9fVFJJX1NUQVRFCQlCSVQoMCkKKworLyogU1BJX0VSUk9SX0ZMQUdTIGFuZCBTUElfRVJST1JfRkxBR1NfRU4gZmllbGRzICovCisjZGVmaW5lIFNQSV9FUlJPUl9DTEtfT1ZFUl9SVU4JCUJJVCgxKQorI2RlZmluZSBTUElfRVJST1JfQ0xLX1VOREVSX1JVTgkJQklUKDApCisKKyNkZWZpbmUgU1BJX05VTV9DSElQU0VMRUNUUwkJNAorCisvKiBoaWdoIHNwZWVkIG1vZGUgaXMgd2hlbiBidXMgcmF0ZSBpcyBncmVhdGVyIHRoZW4gMjZNSHogKi8KKyNkZWZpbmUgU1BJX0hTX01JTl9SQVRFCQkJMjYwMDAwMDAKKyNkZWZpbmUgU1BJX01BWF9SQVRFCQkJNTAwMDAwMDAKKworI2RlZmluZSBTUElfREVMQVlfVEhSRVNIT0xECQkxCisjZGVmaW5lIFNQSV9ERUxBWV9SRVRSWQkJCTEwCisKK3N0cnVjdCBzcGlfcXVwIHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGNsawkJKmNjbGs7CS8qIGNvcmUgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrCQkqaWNsazsJLyogaW50ZXJmYWNlIGNsb2NrICovCisJaW50CQkJaXJxOworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlpbnQJCQlpbl9maWZvX3N6OworCWludAkJCW91dF9maWZvX3N6OworCWludAkJCWluX2Jsa19zejsKKwlpbnQJCQlvdXRfYmxrX3N6OworCisJc3RydWN0IHNwaV90cmFuc2ZlcgkqeGZlcjsKKwlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCWludAkJCWVycm9yOworCWludAkJCXdfc2l6ZTsJLyogYnl0ZXMgcGVyIFNQSSB3b3JkICovCisJaW50CQkJdHhfYnl0ZXM7CisJaW50CQkJcnhfYnl0ZXM7Cit9OworCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzcGlfcXVwX2lzX3ZhbGlkX3N0YXRlKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyKQoreworCXUzMiBvcHN0YXRlID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX1NUQVRFKTsKKworCXJldHVybiBvcHN0YXRlICYgUVVQX1NUQVRFX1ZBTElEOworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfc2V0X3N0YXRlKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyLCB1MzIgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBsb29wOworCXUzMiBjdXJfc3RhdGU7CisKKwlsb29wID0gMDsKKwl3aGlsZSAoIXNwaV9xdXBfaXNfdmFsaWRfc3RhdGUoY29udHJvbGxlcikpIHsKKworCQl1c2xlZXBfcmFuZ2UoU1BJX0RFTEFZX1RIUkVTSE9MRCwgU1BJX0RFTEFZX1RIUkVTSE9MRCAqIDIpOworCisJCWlmICgrK2xvb3AgPiBTUElfREVMQVlfUkVUUlkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAobG9vcCkKKwkJZGV2X2RiZyhjb250cm9sbGVyLT5kZXYsICJpbnZhbGlkIHN0YXRlIGZvciAlbGQsdXMgJWRcbiIsCisJCQlsb29wLCBzdGF0ZSk7CisKKwljdXJfc3RhdGUgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfU1RBVEUpOworCS8qCisJICogUGVyIHNwZWM6IGZvciBQQVVTRV9TVEFURSB0byBSRVNFVF9TVEFURSwgdHdvIHdyaXRlcworCSAqIG9mIChiMTApIGFyZSByZXF1aXJlZAorCSAqLworCWlmICgoKGN1cl9zdGF0ZSAmIFFVUF9TVEFURV9NQVNLKSA9PSBRVVBfU1RBVEVfUEFVU0UpICYmCisJICAgIChzdGF0ZSA9PSBRVVBfU1RBVEVfUkVTRVQpKSB7CisJCXdyaXRlbF9yZWxheGVkKFFVUF9TVEFURV9DTEVBUiwgY29udHJvbGxlci0+YmFzZSArIFFVUF9TVEFURSk7CisJCXdyaXRlbF9yZWxheGVkKFFVUF9TVEFURV9DTEVBUiwgY29udHJvbGxlci0+YmFzZSArIFFVUF9TVEFURSk7CisJfSBlbHNlIHsKKwkJY3VyX3N0YXRlICY9IH5RVVBfU1RBVEVfTUFTSzsKKwkJY3VyX3N0YXRlIHw9IHN0YXRlOworCQl3cml0ZWxfcmVsYXhlZChjdXJfc3RhdGUsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfU1RBVEUpOworCX0KKworCWxvb3AgPSAwOworCXdoaWxlICghc3BpX3F1cF9pc192YWxpZF9zdGF0ZShjb250cm9sbGVyKSkgeworCisJCXVzbGVlcF9yYW5nZShTUElfREVMQVlfVEhSRVNIT0xELCBTUElfREVMQVlfVEhSRVNIT0xEICogMik7CisKKwkJaWYgKCsrbG9vcCA+IFNQSV9ERUxBWV9SRVRSWSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNwaV9xdXBfZmlmb19yZWFkKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyLAorCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJdTggKnJ4X2J1ZiA9IHhmZXItPnJ4X2J1ZjsKKwl1MzIgd29yZCwgc3RhdGU7CisJaW50IGlkeCwgc2hpZnQsIHdfc2l6ZTsKKworCXdfc2l6ZSA9IGNvbnRyb2xsZXItPndfc2l6ZTsKKworCXdoaWxlIChjb250cm9sbGVyLT5yeF9ieXRlcyA8IHhmZXItPmxlbikgeworCisJCXN0YXRlID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX09QRVJBVElPTkFMKTsKKwkJaWYgKDAgPT0gKHN0YXRlICYgUVVQX09QX0lOX0ZJRk9fTk9UX0VNUFRZKSkKKwkJCWJyZWFrOworCisJCXdvcmQgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfSU5QVVRfRklGTyk7CisKKwkJaWYgKCFyeF9idWYpIHsKKwkJCWNvbnRyb2xsZXItPnJ4X2J5dGVzICs9IHdfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChpZHggPSAwOyBpZHggPCB3X3NpemU7IGlkeCsrLCBjb250cm9sbGVyLT5yeF9ieXRlcysrKSB7CisJCQkvKgorCQkJICogVGhlIGRhdGEgZm9ybWF0IGRlcGVuZHMgb24gYnl0ZXMgcGVyIFNQSSB3b3JkOgorCQkJICogIDQgYnl0ZXM6IDB4MTIzNDU2NzgKKwkJCSAqICAyIGJ5dGVzOiAweDAwMDAxMjM0CisJCQkgKiAgMSBieXRlIDogMHgwMDAwMDAxMgorCQkJICovCisJCQlzaGlmdCA9IEJJVFNfUEVSX0JZVEU7CisJCQlzaGlmdCAqPSAod19zaXplIC0gaWR4IC0gMSk7CisJCQlyeF9idWZbY29udHJvbGxlci0+cnhfYnl0ZXNdID0gd29yZCA+PiBzaGlmdDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3BpX3F1cF9maWZvX3dyaXRlKHN0cnVjdCBzcGlfcXVwICpjb250cm9sbGVyLAorCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJY29uc3QgdTggKnR4X2J1ZiA9IHhmZXItPnR4X2J1ZjsKKwl1MzIgd29yZCwgc3RhdGUsIGRhdGE7CisJaW50IGlkeCwgd19zaXplOworCisJd19zaXplID0gY29udHJvbGxlci0+d19zaXplOworCisJd2hpbGUgKGNvbnRyb2xsZXItPnR4X2J5dGVzIDwgeGZlci0+bGVuKSB7CisKKwkJc3RhdGUgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCQlpZiAoc3RhdGUgJiBRVVBfT1BfT1VUX0ZJRk9fRlVMTCkKKwkJCWJyZWFrOworCisJCXdvcmQgPSAwOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHdfc2l6ZTsgaWR4KyssIGNvbnRyb2xsZXItPnR4X2J5dGVzKyspIHsKKworCQkJaWYgKCF0eF9idWYpIHsKKwkJCQljb250cm9sbGVyLT50eF9ieXRlcyArPSB3X3NpemU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRhdGEgPSB0eF9idWZbY29udHJvbGxlci0+dHhfYnl0ZXNdOworCQkJd29yZCB8PSBkYXRhIDw8IChCSVRTX1BFUl9CWVRFICogKDMgLSBpZHgpKTsKKwkJfQorCisJCXdyaXRlbF9yZWxheGVkKHdvcmQsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1VUUFVUX0ZJRk8pOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHNwaV9xdXBfcXVwX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBkZXZfaWQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwl1MzIgb3BmbGFncywgcXVwX2Vyciwgc3BpX2VycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnJvciA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXhmZXIgPSBjb250cm9sbGVyLT54ZmVyOworCWNvbnRyb2xsZXItPnhmZXIgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKworCXF1cF9lcnIgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfRVJST1JfRkxBR1MpOworCXNwaV9lcnIgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBTUElfRVJST1JfRkxBR1MpOworCW9wZmxhZ3MgPSByZWFkbF9yZWxheGVkKGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCisJd3JpdGVsX3JlbGF4ZWQocXVwX2VyciwgY29udHJvbGxlci0+YmFzZSArIFFVUF9FUlJPUl9GTEFHUyk7CisJd3JpdGVsX3JlbGF4ZWQoc3BpX2VyciwgY29udHJvbGxlci0+YmFzZSArIFNQSV9FUlJPUl9GTEFHUyk7CisJd3JpdGVsX3JlbGF4ZWQob3BmbGFncywgY29udHJvbGxlci0+YmFzZSArIFFVUF9PUEVSQVRJT05BTCk7CisKKwlpZiAoIXhmZXIpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChjb250cm9sbGVyLT5kZXYsICJ1bmV4cGVjdGVkIGlycSAleDA4ICV4MDggJXgwOFxuIiwKKwkJCQkgICAgcXVwX2Vyciwgc3BpX2Vyciwgb3BmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAocXVwX2VycikgeworCQlpZiAocXVwX2VyciAmIFFVUF9FUlJPUl9PVVRQVVRfT1ZFUl9SVU4pCisJCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJPVVRQVVRfT1ZFUl9SVU5cbiIpOworCQlpZiAocXVwX2VyciAmIFFVUF9FUlJPUl9JTlBVVF9VTkRFUl9SVU4pCisJCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJJTlBVVF9VTkRFUl9SVU5cbiIpOworCQlpZiAocXVwX2VyciAmIFFVUF9FUlJPUl9PVVRQVVRfVU5ERVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiT1VUUFVUX1VOREVSX1JVTlxuIik7CisJCWlmIChxdXBfZXJyICYgUVVQX0VSUk9SX0lOUFVUX09WRVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiSU5QVVRfT1ZFUl9SVU5cbiIpOworCisJCWVycm9yID0gLUVJTzsKKwl9CisKKwlpZiAoc3BpX2VycikgeworCQlpZiAoc3BpX2VyciAmIFNQSV9FUlJPUl9DTEtfT1ZFUl9SVU4pCisJCQlkZXZfd2Fybihjb250cm9sbGVyLT5kZXYsICJDTEtfT1ZFUl9SVU5cbiIpOworCQlpZiAoc3BpX2VyciAmIFNQSV9FUlJPUl9DTEtfVU5ERVJfUlVOKQorCQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiQ0xLX1VOREVSX1JVTlxuIik7CisKKwkJZXJyb3IgPSAtRUlPOworCX0KKworCWlmIChvcGZsYWdzICYgUVVQX09QX0lOX1NFUlZJQ0VfRkxBRykKKwkJc3BpX3F1cF9maWZvX3JlYWQoY29udHJvbGxlciwgeGZlcik7CisKKwlpZiAob3BmbGFncyAmIFFVUF9PUF9PVVRfU0VSVklDRV9GTEFHKQorCQlzcGlfcXVwX2ZpZm9fd3JpdGUoY29udHJvbGxlciwgeGZlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCWNvbnRyb2xsZXItPmVycm9yID0gZXJyb3I7CisJY29udHJvbGxlci0+eGZlciA9IHhmZXI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNvbnRyb2xsZXItPnJ4X2J5dGVzID09IHhmZXItPmxlbiB8fCBlcnJvcikKKwkJY29tcGxldGUoJmNvbnRyb2xsZXItPmRvbmUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIHNldCBjbG9jayBmcmVxIC4uLiBiaXRzIHBlciB3b3JkICovCitzdGF0aWMgaW50IHNwaV9xdXBfaW9fY29uZmlnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgY29uZmlnLCBpb21vZGUsIG1vZGU7CisJaW50IHJldCwgbl93b3Jkcywgd19zaXplOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QICYmIHhmZXItPmxlbiA+IGNvbnRyb2xsZXItPmluX2ZpZm9fc3opIHsKKwkJZGV2X2Vycihjb250cm9sbGVyLT5kZXYsICJ0b28gYmlnIHNpemUgZm9yIGxvb3BiYWNrICVkID4gJWRcbiIsCisJCQl4ZmVyLT5sZW4sIGNvbnRyb2xsZXItPmluX2ZpZm9fc3opOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoY29udHJvbGxlci0+Y2NsaywgeGZlci0+c3BlZWRfaHopOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb250cm9sbGVyLT5kZXYsICJmYWlsIHRvIHNldCBmcmVxdWVuY3kgJWQiLAorCQkJeGZlci0+c3BlZWRfaHopOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoc3BpX3F1cF9zZXRfc3RhdGUoY29udHJvbGxlciwgUVVQX1NUQVRFX1JFU0VUKSkgeworCQlkZXZfZXJyKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgUkVTRVQgc3RhdGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl3X3NpemUgPSA0OworCWlmICh4ZmVyLT5iaXRzX3Blcl93b3JkIDw9IDgpCisJCXdfc2l6ZSA9IDE7CisJZWxzZSBpZiAoeGZlci0+Yml0c19wZXJfd29yZCA8PSAxNikKKwkJd19zaXplID0gMjsKKworCW5fd29yZHMgPSB4ZmVyLT5sZW4gLyB3X3NpemU7CisJY29udHJvbGxlci0+d19zaXplID0gd19zaXplOworCisJaWYgKG5fd29yZHMgPD0gY29udHJvbGxlci0+aW5fZmlmb19zeikgeworCQltb2RlID0gUVVQX0lPX01fTU9ERV9GSUZPOworCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX1JFQURfQ05UKTsKKwkJd3JpdGVsX3JlbGF4ZWQobl93b3JkcywgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9XUklURV9DTlQpOworCQkvKiBtdXN0IGJlIHplcm8gZm9yIEZJRk8gKi8KKwkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9JTlBVVF9DTlQpOworCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX09VVFBVVF9DTlQpOworCX0gZWxzZSB7CisJCW1vZGUgPSBRVVBfSU9fTV9NT0RFX0JMT0NLOworCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX0lOUFVUX0NOVCk7CisJCXdyaXRlbF9yZWxheGVkKG5fd29yZHMsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfTVhfT1VUUFVUX0NOVCk7CisJCS8qIG11c3QgYmUgemVybyBmb3IgQkxPQ0sgYW5kIEJBTSAqLworCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX1JFQURfQ05UKTsKKwkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9XUklURV9DTlQpOworCX0KKworCWlvbW9kZSA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9JT19NX01PREVTKTsKKwkvKiBTZXQgaW5wdXQgYW5kIG91dHB1dCB0cmFuc2ZlciBtb2RlICovCisJaW9tb2RlICY9IH4oUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLIHwgUVVQX0lPX01fT1VUUFVUX01PREVfTUFTSyk7CisJaW9tb2RlICY9IH4oUVVQX0lPX01fUEFDS19FTiB8IFFVUF9JT19NX1VOUEFDS19FTik7CisJaW9tb2RlIHw9IChtb2RlIDw8IFFVUF9JT19NX09VVFBVVF9NT0RFX01BU0tfU0hJRlQpOworCWlvbW9kZSB8PSAobW9kZSA8PCBRVVBfSU9fTV9JTlBVVF9NT0RFX01BU0tfU0hJRlQpOworCisJd3JpdGVsX3JlbGF4ZWQoaW9tb2RlLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX0lPX01fTU9ERVMpOworCisJY29uZmlnID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgU1BJX0NPTkZJRyk7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApCisJCWNvbmZpZyB8PSBTUElfQ09ORklHX0xPT1BCQUNLOworCWVsc2UKKwkJY29uZmlnICY9IH5TUElfQ09ORklHX0xPT1BCQUNLOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQljb25maWcgJj0gflNQSV9DT05GSUdfSU5QVVRfRklSU1Q7CisJZWxzZQorCQljb25maWcgfD0gU1BJX0NPTkZJR19JTlBVVF9GSVJTVDsKKworCS8qCisJICogSFNfTU9ERSBpbXByb3ZlcyBzaWduYWwgc3RhYmlsaXR5IGZvciBzcGktY2xrIGhpZ2ggcmF0ZXMsCisJICogYnV0IGlzIGludmFsaWQgaW4gbG9vcCBiYWNrIG1vZGUuCisJICovCisJaWYgKCh4ZmVyLT5zcGVlZF9oeiA+PSBTUElfSFNfTUlOX1JBVEUpICYmICEoc3BpLT5tb2RlICYgU1BJX0xPT1ApKQorCQljb25maWcgfD0gU1BJX0NPTkZJR19IU19NT0RFOworCWVsc2UKKwkJY29uZmlnICY9IH5TUElfQ09ORklHX0hTX01PREU7CisKKwl3cml0ZWxfcmVsYXhlZChjb25maWcsIGNvbnRyb2xsZXItPmJhc2UgKyBTUElfQ09ORklHKTsKKworCWNvbmZpZyA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCWNvbmZpZyAmPSB+KFFVUF9DT05GSUdfTk9fSU5QVVQgfCBRVVBfQ09ORklHX05PX09VVFBVVCB8IFFVUF9DT05GSUdfTik7CisJY29uZmlnIHw9IHhmZXItPmJpdHNfcGVyX3dvcmQgLSAxOworCWNvbmZpZyB8PSBRVVBfQ09ORklHX1NQSV9NT0RFOworCXdyaXRlbF9yZWxheGVkKGNvbmZpZywgY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCisJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9PUEVSQVRJT05BTF9NQVNLKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BpX3F1cF9zZXRfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCXUzMiBpb2NvbnRvbCwgbWFzazsKKworCWlvY29udG9sID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgU1BJX0lPX0NPTlRST0wpOworCisJLyogRGlzYWJsZSBhdXRvIENTIHRvZ2dsZSBhbmQgdXNlIG1hbnVhbCAqLworCWlvY29udG9sICY9IH5TUElfSU9fQ19NWF9DU19NT0RFOworCWlvY29udG9sIHw9IFNQSV9JT19DX0ZPUkNFX0NTOworCisJaW9jb250b2wgJj0gflNQSV9JT19DX0NTX1NFTEVDVF9NQVNLOworCWlvY29udG9sIHw9IFNQSV9JT19DX0NTX1NFTEVDVChzcGktPmNoaXBfc2VsZWN0KTsKKworCW1hc2sgPSBTUElfSU9fQ19DU19OX1BPTEFSSVRZXzAgPDwgc3BpLT5jaGlwX3NlbGVjdDsKKworCWlmIChlbmFibGUpCisJCWlvY29udG9sIHw9IG1hc2s7CisJZWxzZQorCQlpb2NvbnRvbCAmPSB+bWFzazsKKworCXdyaXRlbF9yZWxheGVkKGlvY29udG9sLCBjb250cm9sbGVyLT5iYXNlICsgU1BJX0lPX0NPTlRST0wpOworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkgICAgICBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGZsYWdzOworCWludCByZXQgPSAtRUlPOworCisJcmV0ID0gc3BpX3F1cF9pb19jb25maWcoc3BpLCB4ZmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGltZW91dCA9IERJVl9ST1VORF9VUCh4ZmVyLT5zcGVlZF9oeiwgTVNFQ19QRVJfU0VDKTsKKwl0aW1lb3V0ID0gRElWX1JPVU5EX1VQKHhmZXItPmxlbiAqIDgsIHRpbWVvdXQpOworCXRpbWVvdXQgPSAxMDAgKiBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOworCisJcmVpbml0X2NvbXBsZXRpb24oJmNvbnRyb2xsZXItPmRvbmUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwljb250cm9sbGVyLT54ZmVyICAgICA9IHhmZXI7CisJY29udHJvbGxlci0+ZXJyb3IgICAgPSAwOworCWNvbnRyb2xsZXItPnJ4X2J5dGVzID0gMDsKKwljb250cm9sbGVyLT50eF9ieXRlcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SVU4pKSB7CisJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgUlVOIHN0YXRlXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWlmIChzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUEFVU0UpKSB7CisJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgUEFVU0Ugc3RhdGVcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3BpX3F1cF9maWZvX3dyaXRlKGNvbnRyb2xsZXIsIHhmZXIpOworCisJaWYgKHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SVU4pKSB7CisJCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgRVhFQ1VURSBzdGF0ZVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udHJvbGxlci0+ZG9uZSwgdGltZW91dCkpCisJCXJldCA9IC1FVElNRURPVVQ7CitleGl0OgorCXNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwljb250cm9sbGVyLT54ZmVyID0gTlVMTDsKKwlpZiAoIXJldCkKKwkJcmV0ID0gY29udHJvbGxlci0+ZXJyb3I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3F1cF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGNsayAqaWNsaywgKmNjbGs7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1MzIgZGF0YSwgbWF4X2ZyZXEsIGlvbW9kZTsKKwlpbnQgcmV0LCBpcnEsIHNpemU7CisKKwlkZXYgPSAmcGRldi0+ZGV2OworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihiYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gaXJxOworCisJY2NsayA9IGRldm1fY2xrX2dldChkZXYsICJjb3JlIik7CisJaWYgKElTX0VSUihjY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2Nsayk7CisKKwlpY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImlmYWNlIik7CisJaWYgKElTX0VSUihpY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoaWNsayk7CisKKwkvKiBUaGlzIGlzIG9wdGlvbmFsIHBhcmFtZXRlciAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJzcGktbWF4LWZyZXF1ZW5jeSIsICZtYXhfZnJlcSkpCisJCW1heF9mcmVxID0gU1BJX01BWF9SQVRFOworCisJaWYgKCFtYXhfZnJlcSB8fCBtYXhfZnJlcSA+IFNQSV9NQVhfUkFURSkgeworCQlkZXZfZXJyKGRldiwgImludmFsaWQgY2xvY2sgZnJlcXVlbmN5ICVkXG4iLCBtYXhfZnJlcSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNjbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZW5hYmxlIGNvcmUgY2xvY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShpY2xrKTsKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjY2xrKTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZW5hYmxlIGlmYWNlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkYXRhID0gcmVhZGxfcmVsYXhlZChiYXNlICsgUVVQX0hXX1ZFUlNJT04pOworCisJaWYgKGRhdGEgPCBRVVBfSFdfVkVSU0lPTl8yXzFfMSkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2Nsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpY2xrKTsKKwkJZGV2X2VycihkZXYsICJ2LiUwOHggaXMgbm90IHN1cHBvcnRlZFxuIiwgZGF0YSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZihzdHJ1Y3Qgc3BpX3F1cCkpOworCWlmICghbWFzdGVyKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjY2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGljbGspOworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBhbGxvY2F0ZSBtYXN0ZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MT09QOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBTUElfTlVNX0NISVBTRUxFQ1RTOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDQsIDMyKTsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IG1heF9mcmVxOworCW1hc3Rlci0+c2V0X2NzID0gc3BpX3F1cF9zZXRfY3M7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzcGlfcXVwX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKworCWNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwljb250cm9sbGVyLT5kZXYgPSBkZXY7CisJY29udHJvbGxlci0+YmFzZSA9IGJhc2U7CisJY29udHJvbGxlci0+aWNsayA9IGljbGs7CisJY29udHJvbGxlci0+Y2NsayA9IGNjbGs7CisJY29udHJvbGxlci0+aXJxID0gaXJxOworCisJc3Bpbl9sb2NrX2luaXQoJmNvbnRyb2xsZXItPmxvY2spOworCWluaXRfY29tcGxldGlvbigmY29udHJvbGxlci0+ZG9uZSk7CisKKwlpb21vZGUgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBRVVBfSU9fTV9NT0RFUyk7CisKKwlzaXplID0gUVVQX0lPX01fT1VUUFVUX0JMT0NLX1NJWkUoaW9tb2RlKTsKKwlpZiAoc2l6ZSkKKwkJY29udHJvbGxlci0+b3V0X2Jsa19zeiA9IHNpemUgKiAxNjsKKwllbHNlCisJCWNvbnRyb2xsZXItPm91dF9ibGtfc3ogPSA0OworCisJc2l6ZSA9IFFVUF9JT19NX0lOUFVUX0JMT0NLX1NJWkUoaW9tb2RlKTsKKwlpZiAoc2l6ZSkKKwkJY29udHJvbGxlci0+aW5fYmxrX3N6ID0gc2l6ZSAqIDE2OworCWVsc2UKKwkJY29udHJvbGxlci0+aW5fYmxrX3N6ID0gNDsKKworCXNpemUgPSBRVVBfSU9fTV9PVVRQVVRfRklGT19TSVpFKGlvbW9kZSk7CisJY29udHJvbGxlci0+b3V0X2ZpZm9fc3ogPSBjb250cm9sbGVyLT5vdXRfYmxrX3N6ICogKDIgPDwgc2l6ZSk7CisKKwlzaXplID0gUVVQX0lPX01fSU5QVVRfRklGT19TSVpFKGlvbW9kZSk7CisJY29udHJvbGxlci0+aW5fZmlmb19zeiA9IGNvbnRyb2xsZXItPmluX2Jsa19zeiAqICgyIDw8IHNpemUpOworCisJZGV2X2luZm8oZGV2LCAidi4lMDh4IElOOmJsb2NrOiVkLCBmaWZvOiVkLCBPVVQ6YmxvY2s6JWQsIGZpZm86JWRcbiIsCisJCSBkYXRhLCBjb250cm9sbGVyLT5pbl9ibGtfc3osIGNvbnRyb2xsZXItPmluX2ZpZm9fc3osCisJCSBjb250cm9sbGVyLT5vdXRfYmxrX3N6LCBjb250cm9sbGVyLT5vdXRfZmlmb19zeik7CisKKwl3cml0ZWxfcmVsYXhlZCgxLCBiYXNlICsgUVVQX1NXX1JFU0VUKTsKKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzZXQgUkVTRVQgc3RhdGVcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBRVVBfSU9fTV9NT0RFUyk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgYmFzZSArIFFVUF9PUEVSQVRJT05BTF9NQVNLKTsKKwl3cml0ZWxfcmVsYXhlZChTUElfRVJST1JfQ0xLX1VOREVSX1JVTiB8IFNQSV9FUlJPUl9DTEtfT1ZFUl9SVU4sCisJCSAgICAgICBiYXNlICsgU1BJX0VSUk9SX0ZMQUdTX0VOKTsKKworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBTUElfQ09ORklHKTsKKwl3cml0ZWxfcmVsYXhlZChTUElfSU9fQ19OT19UUklfU1RBVEUsIGJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLCBzcGlfcXVwX3F1cF9pcnEsCisJCQkgICAgICAgSVJRRl9UUklHR0VSX0hJR0gsIHBkZXYtPm5hbWUsIGNvbnRyb2xsZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoZGV2LCBtYXN0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXYsIE1TRUNfUEVSX1NFQyk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXJldHVybiAwOworCitlcnJvcjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGljbGspOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IHNwaV9xdXBfcG1fc3VzcGVuZF9ydW50aW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdTMyIGNvbmZpZzsKKworCS8qIEVuYWJsZSBjbG9ja3MgYXV0byBnYWl0aW5nICovCisJY29uZmlnID0gcmVhZGwoY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCWNvbmZpZyB8PSBRVVBfQ09ORklHX0NMT0NLX0FVVE9fR0FURTsKKwl3cml0ZWxfcmVsYXhlZChjb25maWcsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfQ09ORklHKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGlfcXVwX3BtX3Jlc3VtZV9ydW50aW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdTMyIGNvbmZpZzsKKworCS8qIERpc2FibGUgY2xvY2tzIGF1dG8gZ2FpdGluZyAqLworCWNvbmZpZyA9IHJlYWRsX3JlbGF4ZWQoY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOworCWNvbmZpZyAmPSB+UVVQX0NPTkZJR19DTE9DS19BVVRPX0dBVEU7CisJd3JpdGVsX3JlbGF4ZWQoY29uZmlnLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX0NPTkZJRyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBzcGlfcXVwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX21hc3Rlcl9zdXNwZW5kKG1hc3Rlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5jY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY29udHJvbGxlci0+aWNsayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3F1cF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNvbnRyb2xsZXItPmljbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY29udHJvbGxlci0+Y2Nsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcGlfbWFzdGVyX3Jlc3VtZShtYXN0ZXIpOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgaW50IHNwaV9xdXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3BpX3F1cF9zZXRfc3RhdGUoY29udHJvbGxlciwgUVVQX1NUQVRFX1JFU0VUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNvbnRyb2xsZXItPmNjbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5pY2xrKTsKKworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwaV9xdXBfZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sc3BpLXF1cC12Mi4xLjEiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcGktcXVwLXYyLjIuMSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BpX3F1cF9kdF9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzcGlfcXVwX2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoc3BpX3F1cF9zdXNwZW5kLCBzcGlfcXVwX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoc3BpX3F1cF9wbV9zdXNwZW5kX3J1bnRpbWUsCisJCQkgICBzcGlfcXVwX3BtX3Jlc3VtZV9ydW50aW1lLAorCQkJICAgTlVMTCkKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwaV9xdXBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJzcGlfcXVwIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucG0JCT0gJnNwaV9xdXBfZGV2X3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gc3BpX3F1cF9kdF9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNwaV9xdXBfcHJvYmUsCisJLnJlbW92ZSA9IHNwaV9xdXBfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3BpX3F1cF9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNwaV9xdXAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktcnNwaS5jCmluZGV4IDI4OTg3ZDkuLjFmYjBhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXJzcGkuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBTSCBSU1BJIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMyAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBHbGlkZXIgYnZiYQogICoKICAqIEJhc2VkIG9uIHNwaS1zaC5jOgogICogQ29weXJpZ2h0IChDKSAyMDExIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCkBAIC0yNSwxNCArMjYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfZG1hLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9yc3BpLmg+CkBAIC00OSw3ICs1MCw3IEBACiAjZGVmaW5lIFJTUElfU1BDS0QJCTB4MGMJLyogQ2xvY2sgRGVsYXkgUmVnaXN0ZXIgKi8KICNkZWZpbmUgUlNQSV9TU0xORAkJMHgwZAkvKiBTbGF2ZSBTZWxlY3QgTmVnYXRpb24gRGVsYXkgUmVnaXN0ZXIgKi8KICNkZWZpbmUgUlNQSV9TUE5ECQkweDBlCS8qIE5leHQtQWNjZXNzIERlbGF5IFJlZ2lzdGVyICovCi0jZGVmaW5lIFJTUElfU1BDUjIJCTB4MGYJLyogQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lIFJTUElfU1BDUjIJCTB4MGYJLyogQ29udHJvbCBSZWdpc3RlciAyIChTSCBvbmx5KSAqLwogI2RlZmluZSBSU1BJX1NQQ01EMAkJMHgxMAkvKiBDb21tYW5kIFJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgUlNQSV9TUENNRDEJCTB4MTIJLyogQ29tbWFuZCBSZWdpc3RlciAxICovCiAjZGVmaW5lIFJTUElfU1BDTUQyCQkweDE0CS8qIENvbW1hbmQgUmVnaXN0ZXIgMiAqLwpAQCAtNTgsMTYgKzU5LDIzIEBACiAjZGVmaW5lIFJTUElfU1BDTUQ1CQkweDFhCS8qIENvbW1hbmQgUmVnaXN0ZXIgNSAqLwogI2RlZmluZSBSU1BJX1NQQ01ENgkJMHgxYwkvKiBDb21tYW5kIFJlZ2lzdGVyIDYgKi8KICNkZWZpbmUgUlNQSV9TUENNRDcJCTB4MWUJLyogQ29tbWFuZCBSZWdpc3RlciA3ICovCisjZGVmaW5lIFJTUElfU1BDTUQoaSkJCShSU1BJX1NQQ01EMCArIChpKSAqIDIpCisjZGVmaW5lIFJTUElfTlVNX1NQQ01ECQk4CisjZGVmaW5lIFJTUElfUlpfTlVNX1NQQ01ECTQKKyNkZWZpbmUgUVNQSV9OVU1fU1BDTUQJCTQKKworLyogUlNQSSBvbiBSWiBvbmx5ICovCiAjZGVmaW5lIFJTUElfU1BCRkNSCQkweDIwCS8qIEJ1ZmZlciBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIFJTUElfU1BCRkRSCQkweDIyCS8qIEJ1ZmZlciBEYXRhIENvdW50IFNldHRpbmcgUmVnaXN0ZXIgKi8KIAotLypxc3BpIG9ubHkgKi8KKy8qIFFTUEkgb25seSAqLwogI2RlZmluZSBRU1BJX1NQQkZDUgkJMHgxOAkvKiBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBRU1BJX1NQQkRDUgkJMHgxYQkvKiBCdWZmZXIgRGF0YSBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSBRU1BJX1NQQk1VTDAJCTB4MWMJLyogVHJhbnNmZXIgRGF0YSBMZW5ndGggTXVsdGlwbGllciBTZXR0aW5nIFJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgUVNQSV9TUEJNVUwxCQkweDIwCS8qIFRyYW5zZmVyIERhdGEgTGVuZ3RoIE11bHRpcGxpZXIgU2V0dGluZyBSZWdpc3RlciAxICovCiAjZGVmaW5lIFFTUElfU1BCTVVMMgkJMHgyNAkvKiBUcmFuc2ZlciBEYXRhIExlbmd0aCBNdWx0aXBsaWVyIFNldHRpbmcgUmVnaXN0ZXIgMiAqLwogI2RlZmluZSBRU1BJX1NQQk1VTDMJCTB4MjgJLyogVHJhbnNmZXIgRGF0YSBMZW5ndGggTXVsdGlwbGllciBTZXR0aW5nIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUVNQSV9TUEJNVUwoaSkJCShRU1BJX1NQQk1VTDAgKyAoaSkgKiA0KQogCiAvKiBTUENSIC0gQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBTUENSX1NQUklFCQkweDgwCS8qIFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZSAqLwpAQCAtMTA0LDcgKzExMiw3IEBACiAjZGVmaW5lIFNQU1JfUEVSRgkJMHgwOAkvKiBQYXJpdHkgRXJyb3IgRmxhZyAqLwogI2RlZmluZSBTUFNSX01PREYJCTB4MDQJLyogTW9kZSBGYXVsdCBFcnJvciBGbGFnICovCiAjZGVmaW5lIFNQU1JfSURMTkYJCTB4MDIJLyogUlNQSSBJZGxlIEZsYWcgKi8KLSNkZWZpbmUgU1BTUl9PVlJGCQkweDAxCS8qIE92ZXJydW4gRXJyb3IgRmxhZyAqLworI2RlZmluZSBTUFNSX09WUkYJCTB4MDEJLyogT3ZlcnJ1biBFcnJvciBGbGFnIChSU1BJIG9ubHkpICovCiAKIC8qIFNQU0NSIC0gU2VxdWVuY2UgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBTUFNDUl9TUFNMTl9NQVNLCTB4MDcJLyogU2VxdWVuY2UgTGVuZ3RoIFNwZWNpZmljYXRpb24gKi8KQEAgLTEyMSwxMyArMTI5LDEzIEBACiAjZGVmaW5lIFNQRENSX1NQTFdPUkQJCVNQRENSX1NQTFcxCiAjZGVmaW5lIFNQRENSX1NQTEJZVEUJCVNQRENSX1NQTFcwCiAjZGVmaW5lIFNQRENSX1NQTFcJCTB4MjAJLyogQWNjZXNzIFdpZHRoIFNwZWNpZmljYXRpb24gKFNIKSAqLwotI2RlZmluZSBTUERDUl9TUFJEVEQJCTB4MTAJLyogUmVjZWl2ZSBUcmFuc21pdCBEYXRhIFNlbGVjdCAqLworI2RlZmluZSBTUERDUl9TUFJEVEQJCTB4MTAJLyogUmVjZWl2ZSBUcmFuc21pdCBEYXRhIFNlbGVjdCAoU0gpICovCiAjZGVmaW5lIFNQRENSX1NMU0VMMQkJMHgwOAogI2RlZmluZSBTUERDUl9TTFNFTDAJCTB4MDQKLSNkZWZpbmUgU1BEQ1JfU0xTRUxfTUFTSwkweDBjCS8qIFNTTDEgT3V0cHV0IFNlbGVjdCAqLworI2RlZmluZSBTUERDUl9TTFNFTF9NQVNLCTB4MGMJLyogU1NMMSBPdXRwdXQgU2VsZWN0IChTSCkgKi8KICNkZWZpbmUgU1BEQ1JfU1BGQzEJCTB4MDIKICNkZWZpbmUgU1BEQ1JfU1BGQzAJCTB4MDEKLSNkZWZpbmUgU1BEQ1JfU1BGQ19NQVNLCQkweDAzCS8qIEZyYW1lIENvdW50IFNldHRpbmcgKDEtNCkgKi8KKyNkZWZpbmUgU1BEQ1JfU1BGQ19NQVNLCQkweDAzCS8qIEZyYW1lIENvdW50IFNldHRpbmcgKDEtNCkgKFNIKSAqLwogCiAvKiBTUENLRCAtIENsb2NrIERlbGF5IFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQQ0tEX1NDS0RMX01BU0sJMHgwNwkvKiBDbG9jayBEZWxheSBTZXR0aW5nICgxLTgpICovCkBAIC0xNTEsNyArMTU5LDcgQEAKICNkZWZpbmUgU1BDTURfTFNCRgkJMHgxMDAwCS8qIExTQiBGaXJzdCAqLwogI2RlZmluZSBTUENNRF9TUEJfTUFTSwkJMHgwZjAwCS8qIERhdGEgTGVuZ3RoIFNldHRpbmcgKi8KICNkZWZpbmUgU1BDTURfU1BCXzhfVE9fMTYoYml0KQkoKChiaXQgLSAxKSA8PCA4KSAmIFNQQ01EX1NQQl9NQVNLKQotI2RlZmluZSBTUENNRF9TUEJfOEJJVAkJMHgwMDAwCS8qIHFzcGkgb25seSAqLworI2RlZmluZSBTUENNRF9TUEJfOEJJVAkJMHgwMDAwCS8qIFFTUEkgb25seSAqLwogI2RlZmluZSBTUENNRF9TUEJfMTZCSVQJCTB4MDEwMAogI2RlZmluZSBTUENNRF9TUEJfMjBCSVQJCTB4MDAwMAogI2RlZmluZSBTUENNRF9TUEJfMjRCSVQJCTB4MDEwMApAQCAtMTcwLDggKzE3OCw4IEBACiAjZGVmaW5lIFNQQ01EX0NQSEEJCTB4MDAwMQkvKiBDbG9jayBQaGFzZSBTZXR0aW5nICovCiAKIC8qIFNQQkZDUiAtIEJ1ZmZlciBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNQQkZDUl9UWFJTVAkJMHg4MAkvKiBUcmFuc21pdCBCdWZmZXIgRGF0YSBSZXNldCAocXNwaSBvbmx5KSAqLwotI2RlZmluZSBTUEJGQ1JfUlhSU1QJCTB4NDAJLyogUmVjZWl2ZSBCdWZmZXIgRGF0YSBSZXNldCAocXNwaSBvbmx5KSAqLworI2RlZmluZSBTUEJGQ1JfVFhSU1QJCTB4ODAJLyogVHJhbnNtaXQgQnVmZmVyIERhdGEgUmVzZXQgKi8KKyNkZWZpbmUgU1BCRkNSX1JYUlNUCQkweDQwCS8qIFJlY2VpdmUgQnVmZmVyIERhdGEgUmVzZXQgKi8KICNkZWZpbmUgU1BCRkNSX1RYVFJHX01BU0sJMHgzMAkvKiBUcmFuc21pdCBCdWZmZXIgRGF0YSBUcmlnZ2VyaW5nIE51bWJlciAqLwogI2RlZmluZSBTUEJGQ1JfUlhUUkdfTUFTSwkweDA3CS8qIFJlY2VpdmUgQnVmZmVyIERhdGEgVHJpZ2dlcmluZyBOdW1iZXIgKi8KIApAQCAtMTgxLDIyICsxODksMjEgQEAKIAl2b2lkIF9faW9tZW0gKmFkZHI7CiAJdTMyIG1heF9zcGVlZF9oejsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdzOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBjbGsgKmNsazsKLQl1OCBzcHNyOwogCXUxNiBzcGNtZDsKKwl1OCBzcHNyOworCXU4IHNwcGNyOworCWludCByeF9pcnEsIHR4X2lycTsKIAljb25zdCBzdHJ1Y3Qgc3BpX29wcyAqb3BzOwogCiAJLyogZm9yIGRtYWVuZ2luZSAqLwogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbl90eDsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW5fcng7Ci0JaW50IGlycTsKIAogCXVuc2lnbmVkIGRtYV93aWR0aF8xNmJpdDoxOwogCXVuc2lnbmVkIGRtYV9jYWxsYmFja2VkOjE7CisJdW5zaWduZWQgYnl0ZV9hY2Nlc3M6MTsKIH07CiAKIHN0YXRpYyB2b2lkIHJzcGlfd3JpdGU4KGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHU4IGRhdGEsIHUxNiBvZmZzZXQpCkBAIC0yMjQsMzQgKzIzMSw0NyBAQAogCXJldHVybiBpb3JlYWQxNihyc3BpLT5hZGRyICsgb2Zmc2V0KTsKIH0KIAorc3RhdGljIHZvaWQgcnNwaV93cml0ZV9kYXRhKGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHUxNiBkYXRhKQoreworCWlmIChyc3BpLT5ieXRlX2FjY2VzcykKKwkJcnNwaV93cml0ZTgocnNwaSwgZGF0YSwgUlNQSV9TUERSKTsKKwllbHNlIC8qIDE2IGJpdCAqLworCQlyc3BpX3dyaXRlMTYocnNwaSwgZGF0YSwgUlNQSV9TUERSKTsKK30KKworc3RhdGljIHUxNiByc3BpX3JlYWRfZGF0YShjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpKQoreworCWlmIChyc3BpLT5ieXRlX2FjY2VzcykKKwkJcmV0dXJuIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUERSKTsKKwllbHNlIC8qIDE2IGJpdCAqLworCQlyZXR1cm4gcnNwaV9yZWFkMTYocnNwaSwgUlNQSV9TUERSKTsKK30KKwogLyogb3B0aW9uYWwgZnVuY3Rpb25zICovCiBzdHJ1Y3Qgc3BpX29wcyB7Ci0JaW50ICgqc2V0X2NvbmZpZ19yZWdpc3RlcikoY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKLQkJCQkgICBpbnQgYWNjZXNzX3NpemUpOwotCWludCAoKnNlbmRfcGlvKShzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2csCi0JCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KTsKLQlpbnQgKCpyZWNlaXZlX3Bpbykoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCk7Ci0KKwlpbnQgKCpzZXRfY29uZmlnX3JlZ2lzdGVyKShzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBpbnQgYWNjZXNzX3NpemUpOworCWludCAoKnRyYW5zZmVyX29uZSkoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKTsKKwl1MTYgbW9kZV9iaXRzOwogfTsKIAogLyoKLSAqIGZ1bmN0aW9ucyBmb3IgUlNQSQorICogZnVuY3Rpb25zIGZvciBSU1BJIG9uIGxlZ2FjeSBTSAogICovCi1zdGF0aWMgaW50IHJzcGlfc2V0X2NvbmZpZ19yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAotCQkJCSAgICBpbnQgYWNjZXNzX3NpemUpCitzdGF0aWMgaW50IHJzcGlfc2V0X2NvbmZpZ19yZWdpc3RlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBpbnQgYWNjZXNzX3NpemUpCiB7CiAJaW50IHNwYnI7CiAKLQkvKiBTZXRzIG91dHB1dCBtb2RlKENNT1MpIGFuZCBNT1NJIHNpZ25hbChmcm9tIHByZXZpb3VzIHRyYW5zZmVyKSAqLwotCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BQQ1IpOworCS8qIFNldHMgb3V0cHV0IG1vZGUsIE1PU0kgc2lnbmFsLCBhbmQgKG9wdGlvbmFsbHkpIGxvb3BiYWNrICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaS0+c3BwY3IsIFJTUElfU1BQQ1IpOwogCiAJLyogU2V0cyB0cmFuc2ZlciBiaXQgcmF0ZSAqLwogCXNwYnIgPSBjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKSAvICgyICogcnNwaS0+bWF4X3NwZWVkX2h6KSAtIDE7CiAJcnNwaV93cml0ZTgocnNwaSwgY2xhbXAoc3BiciwgMCwgMjU1KSwgUlNQSV9TUEJSKTsKIAotCS8qIFNldHMgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSB1c2VkOiAxIGZyYW1lICovCi0JcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUERDUik7CisJLyogRGlzYWJsZSBkdW1teSB0cmFuc21pc3Npb24sIHNldCAxNi1iaXQgd29yZCBhY2Nlc3MsIDEgZnJhbWUgKi8KKwlyc3BpX3dyaXRlOChyc3BpLCAwLCBSU1BJX1NQRENSKTsKKwlyc3BpLT5ieXRlX2FjY2VzcyA9IDA7CiAKIAkvKiBTZXRzIFJTUENLLCBTU0wsIG5leHQtYWNjZXNzIGRlbGF5IHZhbHVlICovCiAJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUENLRCk7CkBAIC0yNjIsOCArMjgyLDQxIEBACiAJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUENSMik7CiAKIAkvKiBTZXRzIFNQQ01EICovCi0JcnNwaV93cml0ZTE2KHJzcGksIFNQQ01EX1NQQl84X1RPXzE2KGFjY2Vzc19zaXplKSB8IHJzcGktPnNwY21kLAotCQkgICAgIFJTUElfU1BDTUQwKTsKKwlyc3BpLT5zcGNtZCB8PSBTUENNRF9TUEJfOF9UT18xNihhY2Nlc3Nfc2l6ZSk7CisJcnNwaV93cml0ZTE2KHJzcGksIHJzcGktPnNwY21kLCBSU1BJX1NQQ01EMCk7CisKKwkvKiBTZXRzIFJTUEkgbW9kZSAqLworCXJzcGlfd3JpdGU4KHJzcGksIFNQQ1JfTVNUUiwgUlNQSV9TUENSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZnVuY3Rpb25zIGZvciBSU1BJIG9uIFJaCisgKi8KK3N0YXRpYyBpbnQgcnNwaV9yel9zZXRfY29uZmlnX3JlZ2lzdGVyKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIGludCBhY2Nlc3Nfc2l6ZSkKK3sKKwlpbnQgc3BicjsKKworCS8qIFNldHMgb3V0cHV0IG1vZGUsIE1PU0kgc2lnbmFsLCBhbmQgKG9wdGlvbmFsbHkpIGxvb3BiYWNrICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaS0+c3BwY3IsIFJTUElfU1BQQ1IpOworCisJLyogU2V0cyB0cmFuc2ZlciBiaXQgcmF0ZSAqLworCXNwYnIgPSBjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKSAvICgyICogcnNwaS0+bWF4X3NwZWVkX2h6KSAtIDE7CisJcnNwaV93cml0ZTgocnNwaSwgY2xhbXAoc3BiciwgMCwgMjU1KSwgUlNQSV9TUEJSKTsKKworCS8qIERpc2FibGUgZHVtbXkgdHJhbnNtaXNzaW9uLCBzZXQgYnl0ZSBhY2Nlc3MgKi8KKwlyc3BpX3dyaXRlOChyc3BpLCBTUERDUl9TUExCWVRFLCBSU1BJX1NQRENSKTsKKwlyc3BpLT5ieXRlX2FjY2VzcyA9IDE7CisKKwkvKiBTZXRzIFJTUENLLCBTU0wsIG5leHQtYWNjZXNzIGRlbGF5IHZhbHVlICovCisJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUENLRCk7CisJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TU0xORCk7CisJcnNwaV93cml0ZTgocnNwaSwgMHgwMCwgUlNQSV9TUE5EKTsKKworCS8qIFNldHMgU1BDTUQgKi8KKwlyc3BpLT5zcGNtZCB8PSBTUENNRF9TUEJfOF9UT18xNihhY2Nlc3Nfc2l6ZSk7CisJcnNwaV93cml0ZTE2KHJzcGksIHJzcGktPnNwY21kLCBSU1BJX1NQQ01EMCk7CiAKIAkvKiBTZXRzIFJTUEkgbW9kZSAqLwogCXJzcGlfd3JpdGU4KHJzcGksIFNQQ1JfTVNUUiwgUlNQSV9TUENSKTsKQEAgLTI3NCwyMSArMzI3LDIwIEBACiAvKgogICogZnVuY3Rpb25zIGZvciBRU1BJCiAgKi8KLXN0YXRpYyBpbnQgcXNwaV9zZXRfY29uZmlnX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCi0JCQkJICAgIGludCBhY2Nlc3Nfc2l6ZSkKK3N0YXRpYyBpbnQgcXNwaV9zZXRfY29uZmlnX3JlZ2lzdGVyKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIGludCBhY2Nlc3Nfc2l6ZSkKIHsKLQl1MTYgc3BjbWQ7CiAJaW50IHNwYnI7CiAKLQkvKiBTZXRzIG91dHB1dCBtb2RlKENNT1MpIGFuZCBNT1NJIHNpZ25hbChmcm9tIHByZXZpb3VzIHRyYW5zZmVyKSAqLwotCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BQQ1IpOworCS8qIFNldHMgb3V0cHV0IG1vZGUsIE1PU0kgc2lnbmFsLCBhbmQgKG9wdGlvbmFsbHkpIGxvb3BiYWNrICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaS0+c3BwY3IsIFJTUElfU1BQQ1IpOwogCiAJLyogU2V0cyB0cmFuc2ZlciBiaXQgcmF0ZSAqLwogCXNwYnIgPSBjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKSAvICgyICogcnNwaS0+bWF4X3NwZWVkX2h6KTsKIAlyc3BpX3dyaXRlOChyc3BpLCBjbGFtcChzcGJyLCAwLCAyNTUpLCBSU1BJX1NQQlIpOwogCi0JLyogU2V0cyBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIHVzZWQ6IDEgZnJhbWUgKi8KLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBSU1BJX1NQRENSKTsKKwkvKiBEaXNhYmxlIGR1bW15IHRyYW5zbWlzc2lvbiwgc2V0IGJ5dGUgYWNjZXNzICovCisJcnNwaV93cml0ZTgocnNwaSwgMCwgUlNQSV9TUERDUik7CisJcnNwaS0+Ynl0ZV9hY2Nlc3MgPSAxOwogCiAJLyogU2V0cyBSU1BDSywgU1NMLCBuZXh0LWFjY2VzcyBkZWxheSB2YWx1ZSAqLwogCXJzcGlfd3JpdGU4KHJzcGksIDB4MDAsIFJTUElfU1BDS0QpOwpAQCAtMjk3LDEzICszNDksMTMgQEAKIAogCS8qIERhdGEgTGVuZ3RoIFNldHRpbmcgKi8KIAlpZiAoYWNjZXNzX3NpemUgPT0gOCkKLQkJc3BjbWQgPSBTUENNRF9TUEJfOEJJVDsKKwkJcnNwaS0+c3BjbWQgfD0gU1BDTURfU1BCXzhCSVQ7CiAJZWxzZSBpZiAoYWNjZXNzX3NpemUgPT0gMTYpCi0JCXNwY21kID0gU1BDTURfU1BCXzE2QklUOworCQlyc3BpLT5zcGNtZCB8PSBTUENNRF9TUEJfMTZCSVQ7CiAJZWxzZQotCQlzcGNtZCA9IFNQQ01EX1NQQl8zMkJJVDsKKwkJcnNwaS0+c3BjbWQgfD0gU1BDTURfU1BCXzMyQklUOwogCi0Jc3BjbWQgfD0gU1BDTURfU0NLREVOIHwgU1BDTURfU0xOREVOIHwgcnNwaS0+c3BjbWQgfCBTUENNRF9TUE5ERU47CisJcnNwaS0+c3BjbWQgfD0gU1BDTURfU0NLREVOIHwgU1BDTURfU0xOREVOIHwgU1BDTURfU1BOREVOOwogCiAJLyogUmVzZXRzIHRyYW5zZmVyIGRhdGEgbGVuZ3RoICovCiAJcnNwaV93cml0ZTMyKHJzcGksIDAsIFFTUElfU1BCTVVMMCk7CkBAIC0zMTQsOSArMzY2LDkgQEAKIAlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBRU1BJX1NQQkZDUik7CiAKIAkvKiBTZXRzIFNQQ01EICovCi0JcnNwaV93cml0ZTE2KHJzcGksIHNwY21kLCBSU1BJX1NQQ01EMCk7CisJcnNwaV93cml0ZTE2KHJzcGksIHJzcGktPnNwY21kLCBSU1BJX1NQQ01EMCk7CiAKLQkvKiBFbmFibGVzIFNQSSBmdW5jdGlvbiBpbiBhIG1hc3RlciBtb2RlICovCisJLyogRW5hYmxlcyBTUEkgZnVuY3Rpb24gaW4gbWFzdGVyIG1vZGUgKi8KIAlyc3BpX3dyaXRlOChyc3BpLCBTUENSX1NQRSB8IFNQQ1JfTVNUUiwgUlNQSV9TUENSKTsKIAogCXJldHVybiAwOwpAQCAtMzQwLDYgKzM5Miw5IEBACiAJaW50IHJldDsKIAogCXJzcGktPnNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CisJaWYgKHJzcGktPnNwc3IgJiB3YWl0X21hc2spCisJCXJldHVybiAwOworCiAJcnNwaV9lbmFibGVfaXJxKHJzcGksIGVuYWJsZV9iaXQpOwogCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChyc3BpLT53YWl0LCByc3BpLT5zcHNyICYgd2FpdF9tYXNrLCBIWik7CiAJaWYgKHJldCA9PSAwICYmICEocnNwaS0+c3BzciAmIHdhaXRfbWFzaykpCkBAIC0zNDgsNzcgKzQwMywzOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByc3BpX2Fzc2VydF9zc2woY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKK3N0YXRpYyBpbnQgcnNwaV9kYXRhX291dChzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1OCBkYXRhKQogewotCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSB8IFNQQ1JfU1BFLCBSU1BJX1NQQ1IpOwotfQotCi1zdGF0aWMgdm9pZCByc3BpX25lZ2F0ZV9zc2woY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKLXsKLQlyc3BpX3dyaXRlOChyc3BpLCByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUikgJiB+U1BDUl9TUEUsIFJTUElfU1BDUik7Ci19Ci0KLXN0YXRpYyBpbnQgcnNwaV9zZW5kX3BpbyhzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2csCi0JCQkgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlpbnQgcmVtYWluID0gdC0+bGVuOwotCWNvbnN0IHU4ICpkYXRhID0gdC0+dHhfYnVmOwotCXdoaWxlIChyZW1haW4gPiAwKSB7Ci0JCXJzcGlfd3JpdGU4KHJzcGksIHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUENSKSB8IFNQQ1JfVFhNRCwKLQkJCSAgICBSU1BJX1NQQ1IpOwotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQotCQlyc3BpX3dyaXRlMTYocnNwaSwgKmRhdGEsIFJTUElfU1BEUik7Ci0JCWRhdGErKzsKLQkJcmVtYWluLS07CisJaWYgKHJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BURUYsIFNQQ1JfU1BUSUUpIDwgMCkgeworCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwgInRyYW5zbWl0IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9Ci0KLQkvKiBXYWl0aW5nIGZvciB0aGUgbGFzdCB0cmFuc21pc3Npb24gKi8KLQlyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKTsKLQorCXJzcGlfd3JpdGVfZGF0YShyc3BpLCBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBxc3BpX3NlbmRfcGlvKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZywKLQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQorc3RhdGljIGludCByc3BpX2RhdGFfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSkKIHsKLQlpbnQgcmVtYWluID0gdC0+bGVuOwotCWNvbnN0IHU4ICpkYXRhID0gdC0+dHhfYnVmOworCXU4IGRhdGE7CiAKLQlyc3BpX3dyaXRlOChyc3BpLCBTUEJGQ1JfVFhSU1QsIFFTUElfU1BCRkNSKTsKLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBRU1BJX1NQQkZDUik7Ci0KLQl3aGlsZSAocmVtYWluID4gMCkgewotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJcnNwaV93cml0ZTgocnNwaSwgKmRhdGErKywgUlNQSV9TUERSKTsKLQotCQlpZiAocnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFJGLCBTUENSX1NQUklFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogcmVjZWl2ZSB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCQlyc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BEUik7Ci0KLQkJcmVtYWluLS07CisJaWYgKHJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BSRiwgU1BDUl9TUFJJRSkgPCAwKSB7CisJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LCAicmVjZWl2ZSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQotCi0JLyogV2FpdGluZyBmb3IgdGhlIGxhc3QgdHJhbnNtaXNzaW9uICovCi0JcnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSk7Ci0KLQlyZXR1cm4gMDsKKwlkYXRhID0gcnNwaV9yZWFkX2RhdGEocnNwaSk7CisJcmV0dXJuIGRhdGE7CiB9CiAKLSNkZWZpbmUgc2VuZF9waW8oc3BpLCBtZXNnLCB0KSBzcGktPm9wcy0+c2VuZF9waW8oc3BpLCBtZXNnLCB0KQorc3RhdGljIGludCByc3BpX2RhdGFfb3V0X2luKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksIHU4IGRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IHJzcGlfZGF0YV9vdXQocnNwaSwgZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcnNwaV9kYXRhX2luKHJzcGkpOworfQogCiBzdGF0aWMgdm9pZCByc3BpX2RtYV9jb21wbGV0ZSh2b2lkICphcmcpCiB7CkBAIC00NzEsNyArNDg3LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJY29uc3Qgdm9pZCAqYnVmID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7Ci0JdW5zaWduZWQgbGVuOworCXVuc2lnbmVkIGludCBsZW47CiAJaW50IHJldCA9IDA7CiAKIAlpZiAocnNwaS0+ZG1hX3dpZHRoXzE2Yml0KSB7CkBAIC01MDksNyArNTI1LDcgQEAKIAkgKiBETUFDIG5lZWRzIFNQVElFLCBidXQgaWYgU1BUSUUgaXMgc2V0LCB0aGlzIElSUSByb3V0aW5lIHdpbGwgYmUKIAkgKiBjYWxsZWQuIFNvLCB0aGlzIGRyaXZlciBkaXNhYmxlcyB0aGUgSVJRIHdoaWxlIERNQSB0cmFuc2Zlci4KIAkgKi8KLQlkaXNhYmxlX2lycShyc3BpLT5pcnEpOworCWRpc2FibGVfaXJxKHJzcGktPnR4X2lycSk7CiAKIAlyc3BpX3dyaXRlOChyc3BpLCByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUikgfCBTUENSX1RYTUQsIFJTUElfU1BDUik7CiAJcnNwaV9lbmFibGVfaXJxKHJzcGksIFNQQ1JfU1BUSUUpOwpAQCAtNTI4LDcgKzU0NCw3IEBACiAJCXJldCA9IC1FVElNRURPVVQ7CiAJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQVElFKTsKIAotCWVuYWJsZV9pcnEocnNwaS0+aXJxKTsKKwllbmFibGVfaXJxKHJzcGktPnR4X2lycSk7CiAKIGVuZDoKIAlyc3BpX2RtYV91bm1hcF9zZygmc2csIHJzcGktPmNoYW5fdHgsIERNQV9UT19ERVZJQ0UpOwpAQCAtNTQ1LDQ2ICs1NjEsMTcgQEAKIAogCXNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CiAJaWYgKHNwc3IgJiBTUFNSX1NQUkYpCi0JCXJzcGlfcmVhZDE2KHJzcGksIFJTUElfU1BEUik7CS8qIGR1bW15IHJlYWQgKi8KKwkJcnNwaV9yZWFkX2RhdGEocnNwaSk7CS8qIGR1bW15IHJlYWQgKi8KIAlpZiAoc3BzciAmIFNQU1JfT1ZSRikKIAkJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQU1IpICYgflNQU1JfT1ZSRiwKIAkJCSAgICBSU1BJX1NQU1IpOwogfQogCi1zdGF0aWMgaW50IHJzcGlfcmVjZWl2ZV9waW8oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCitzdGF0aWMgdm9pZCByc3BpX3J6X3JlY2VpdmVfaW5pdChjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpKQogewotCWludCByZW1haW4gPSB0LT5sZW47Ci0JdTggKmRhdGE7Ci0KIAlyc3BpX3JlY2VpdmVfaW5pdChyc3BpKTsKLQotCWRhdGEgPSB0LT5yeF9idWY7Ci0Jd2hpbGUgKHJlbWFpbiA+IDApIHsKLQkJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpICYgflNQQ1JfVFhNRCwKLQkJCSAgICBSU1BJX1NQQ1IpOwotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJLyogZHVtbXkgd3JpdGUgZm9yIGdlbmVyYXRlIGNsb2NrICovCi0JCXJzcGlfd3JpdGUxNihyc3BpLCBEVU1NWV9EQVRBLCBSU1BJX1NQRFIpOwotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQUkYsIFNQQ1JfU1BSSUUpIDwgMCkgewotCQkJZGV2X2VycigmcnNwaS0+bWFzdGVyLT5kZXYsCi0JCQkJIiVzOiByZWNlaXZlIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCS8qIFNQRFIgYWxsb3dzIDE2IG9yIDMyLWJpdCBhY2Nlc3Mgb25seSAqLwotCQkqZGF0YSA9ICh1OClyc3BpX3JlYWQxNihyc3BpLCBSU1BJX1NQRFIpOwotCi0JCWRhdGErKzsKLQkJcmVtYWluLS07Ci0JfQotCi0JcmV0dXJuIDA7CisJcnNwaV93cml0ZTgocnNwaSwgU1BCRkNSX1RYUlNUIHwgU1BCRkNSX1JYUlNULCBSU1BJX1NQQkZDUik7CisJcnNwaV93cml0ZTgocnNwaSwgMCwgUlNQSV9TUEJGQ1IpOwogfQogCiBzdGF0aWMgdm9pZCBxc3BpX3JlY2VpdmVfaW5pdChjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpKQpAQCAtNTkzLDUxICs1ODAsMTcgQEAKIAogCXNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CiAJaWYgKHNwc3IgJiBTUFNSX1NQUkYpCi0JCXJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUERSKTsgICAvKiBkdW1teSByZWFkICovCisJCXJzcGlfcmVhZF9kYXRhKHJzcGkpOyAgIC8qIGR1bW15IHJlYWQgKi8KIAlyc3BpX3dyaXRlOChyc3BpLCBTUEJGQ1JfVFhSU1QgfCBTUEJGQ1JfUlhSU1QsIFFTUElfU1BCRkNSKTsKLQlyc3BpX3dyaXRlOChyc3BpLCAweDAwLCBRU1BJX1NQQkZDUik7CisJcnNwaV93cml0ZTgocnNwaSwgMCwgUVNQSV9TUEJGQ1IpOwogfQogCi1zdGF0aWMgaW50IHFzcGlfcmVjZWl2ZV9waW8oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptZXNnLAotCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0JaW50IHJlbWFpbiA9IHQtPmxlbjsKLQl1OCAqZGF0YTsKLQotCXFzcGlfcmVjZWl2ZV9pbml0KHJzcGkpOwotCi0JZGF0YSA9IHQtPnJ4X2J1ZjsKLQl3aGlsZSAocmVtYWluID4gMCkgewotCi0JCWlmIChyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKSA8IDApIHsKLQkJCWRldl9lcnIoJnJzcGktPm1hc3Rlci0+ZGV2LAotCQkJCSIlczogdHggZW1wdHkgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJLyogZHVtbXkgd3JpdGUgZm9yIGdlbmVyYXRlIGNsb2NrICovCi0JCXJzcGlfd3JpdGU4KHJzcGksIERVTU1ZX0RBVEEsIFJTUElfU1BEUik7Ci0KLQkJaWYgKHJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BSRiwgU1BDUl9TUFJJRSkgPCAwKSB7Ci0JCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwKLQkJCQkiJXM6IHJlY2VpdmUgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQkJLyogU1BEUiBhbGxvd3MgOCwgMTYgb3IgMzItYml0IGFjY2VzcyAqLwotCQkqZGF0YSsrID0gcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQRFIpOwotCQlyZW1haW4tLTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSByZWNlaXZlX3BpbyhzcGksIG1lc2csIHQpIHNwaS0+b3BzLT5yZWNlaXZlX3BpbyhzcGksIG1lc2csIHQpCi0KIHN0YXRpYyBpbnQgcnNwaV9yZWNlaXZlX2RtYShzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogewogCXN0cnVjdCBzY2F0dGVybGlzdCBzZywgc2dfZHVtbXk7CiAJdm9pZCAqZHVtbXkgPSBOVUxMLCAqcnhfYnVmID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MsICpkZXNjX2R1bW15OwotCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCWludCByZXQgPSAwOwogCiAJaWYgKHJzcGktPmRtYV93aWR0aF8xNmJpdCkgewpAQCAtNjk1LDcgKzY0OCw5IEBACiAJICogRE1BQyBuZWVkcyBTUFRJRSwgYnV0IGlmIFNQVElFIGlzIHNldCwgdGhpcyBJUlEgcm91dGluZSB3aWxsIGJlCiAJICogY2FsbGVkLiBTbywgdGhpcyBkcml2ZXIgZGlzYWJsZXMgdGhlIElSUSB3aGlsZSBETUEgdHJhbnNmZXIuCiAJICovCi0JZGlzYWJsZV9pcnEocnNwaS0+aXJxKTsKKwlkaXNhYmxlX2lycShyc3BpLT50eF9pcnEpOworCWlmIChyc3BpLT5yeF9pcnEgIT0gcnNwaS0+dHhfaXJxKQorCQlkaXNhYmxlX2lycShyc3BpLT5yeF9pcnEpOwogCiAJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpICYgflNQQ1JfVFhNRCwgUlNQSV9TUENSKTsKIAlyc3BpX2VuYWJsZV9pcnEocnNwaSwgU1BDUl9TUFRJRSB8IFNQQ1JfU1BSSUUpOwpAQCAtNzE4LDcgKzY3Myw5IEBACiAJCXJldCA9IC1FVElNRURPVVQ7CiAJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQVElFIHwgU1BDUl9TUFJJRSk7CiAKLQllbmFibGVfaXJxKHJzcGktPmlycSk7CisJZW5hYmxlX2lycShyc3BpLT50eF9pcnEpOworCWlmIChyc3BpLT5yeF9pcnEgIT0gcnNwaS0+dHhfaXJxKQorCQllbmFibGVfaXJxKHJzcGktPnJ4X2lycSk7CiAKIGVuZDoKIAlyc3BpX2RtYV91bm1hcF9zZygmc2csIHJzcGktPmNoYW5fcngsIERNQV9GUk9NX0RFVklDRSk7CkBAIC03NDYsNTYgKzcwMywxNzUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnNwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbnQgcnNwaV90cmFuc2Zlcl9vdXRfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewotCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJzcGlfZGF0YSwgd3MpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKKwlpbnQgcmVtYWluID0geGZlci0+bGVuLCByZXQ7CisJY29uc3QgdTggKnR4X2J1ZiA9IHhmZXItPnR4X2J1ZjsKKwl1OCAqcnhfYnVmID0geGZlci0+cnhfYnVmOworCXU4IHNwY3IsIGRhdGE7CiAKLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNwaS0+bG9jaywgZmxhZ3MpOwotCQlpZiAobGlzdF9lbXB0eSgmcnNwaS0+cXVldWUpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc3BpLT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKKwlyc3BpX3JlY2VpdmVfaW5pdChyc3BpKTsKKworCXNwY3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BDUik7CisJaWYgKHJ4X2J1ZikKKwkJc3BjciAmPSB+U1BDUl9UWE1EOworCWVsc2UKKwkJc3BjciB8PSBTUENSX1RYTUQ7CisJcnNwaV93cml0ZTgocnNwaSwgc3BjciwgUlNQSV9TUENSKTsKKworCXdoaWxlIChyZW1haW4gPiAwKSB7CisJCWRhdGEgPSB0eF9idWYgPyAqdHhfYnVmKysgOiBEVU1NWV9EQVRBOworCQlyZXQgPSByc3BpX2RhdGFfb3V0KHJzcGksIGRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyeF9idWYpIHsKKwkJCXJldCA9IHJzcGlfZGF0YV9pbihyc3BpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQkqcnhfYnVmKysgPSByZXQ7CiAJCX0KLQkJbWVzZyA9IGxpc3RfZW50cnkocnNwaS0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7Ci0JCWxpc3RfZGVsX2luaXQoJm1lc2ctPnF1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwaS0+bG9jaywgZmxhZ3MpOwotCi0JCXJzcGlfYXNzZXJ0X3NzbChyc3BpKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtZXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJCWlmICh0LT50eF9idWYpIHsKLQkJCQlpZiAocnNwaV9pc19kbWEocnNwaSwgdCkpCi0JCQkJCXJldCA9IHJzcGlfc2VuZF9kbWEocnNwaSwgdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXQgPSBzZW5kX3Bpbyhyc3BpLCBtZXNnLCB0KTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmICh0LT5yeF9idWYpIHsKLQkJCQlpZiAocnNwaV9pc19kbWEocnNwaSwgdCkpCi0JCQkJCXJldCA9IHJzcGlfcmVjZWl2ZV9kbWEocnNwaSwgdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXQgPSByZWNlaXZlX3Bpbyhyc3BpLCBtZXNnLCB0KTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCW1lc2ctPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOwotCQl9Ci0JCXJzcGlfbmVnYXRlX3NzbChyc3BpKTsKLQotCQltZXNnLT5zdGF0dXMgPSAwOwotCQltZXNnLT5jb21wbGV0ZShtZXNnLT5jb250ZXh0KTsKKwkJcmVtYWluLS07CiAJfQogCi0JcmV0dXJuOworCS8qIFdhaXQgZm9yIHRoZSBsYXN0IHRyYW5zbWlzc2lvbiAqLworCXJzcGlfd2FpdF9mb3JfaW50ZXJydXB0KHJzcGksIFNQU1JfU1BURUYsIFNQQ1JfU1BUSUUpOwogCi1lcnJvcjoKLQltZXNnLT5zdGF0dXMgPSByZXQ7Ci0JbWVzZy0+Y29tcGxldGUobWVzZy0+Y29udGV4dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CisKKwlpZiAoIXJzcGlfaXNfZG1hKHJzcGksIHhmZXIpKQorCQlyZXR1cm4gcnNwaV90cmFuc2Zlcl9vdXRfaW4ocnNwaSwgeGZlcik7CisKKwlpZiAoeGZlci0+dHhfYnVmKSB7CisJCXJldCA9IHJzcGlfc2VuZF9kbWEocnNwaSwgeGZlcik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHhmZXItPnJ4X2J1ZikKKwkJcmV0dXJuIHJzcGlfcmVjZWl2ZV9kbWEocnNwaSwgeGZlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc3BpX3J6X3RyYW5zZmVyX291dF9pbihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAorCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJaW50IHJlbWFpbiA9IHhmZXItPmxlbiwgcmV0OworCWNvbnN0IHU4ICp0eF9idWYgPSB4ZmVyLT50eF9idWY7CisJdTggKnJ4X2J1ZiA9IHhmZXItPnJ4X2J1ZjsKKwl1OCBkYXRhOworCisJcnNwaV9yel9yZWNlaXZlX2luaXQocnNwaSk7CisKKwl3aGlsZSAocmVtYWluID4gMCkgeworCQlkYXRhID0gdHhfYnVmID8gKnR4X2J1ZisrIDogRFVNTVlfREFUQTsKKwkJcmV0ID0gcnNwaV9kYXRhX291dF9pbihyc3BpLCBkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocnhfYnVmKQorCQkJKnJ4X2J1ZisrID0gcmV0OworCQlyZW1haW4tLTsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgbGFzdCB0cmFuc21pc3Npb24gKi8KKwlyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzcGlfcnpfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXR1cm4gcnNwaV9yel90cmFuc2Zlcl9vdXRfaW4ocnNwaSwgeGZlcik7Cit9CisKK3N0YXRpYyBpbnQgcXNwaV90cmFuc2Zlcl9vdXRfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWludCByZW1haW4gPSB4ZmVyLT5sZW4sIHJldDsKKwljb25zdCB1OCAqdHhfYnVmID0geGZlci0+dHhfYnVmOworCXU4ICpyeF9idWYgPSB4ZmVyLT5yeF9idWY7CisJdTggZGF0YTsKKworCXFzcGlfcmVjZWl2ZV9pbml0KHJzcGkpOworCisJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJZGF0YSA9IHR4X2J1ZiA/ICp0eF9idWYrKyA6IERVTU1ZX0RBVEE7CisJCXJldCA9IHJzcGlfZGF0YV9vdXRfaW4ocnNwaSwgZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJ4X2J1ZikKKwkJCSpyeF9idWYrKyA9IHJldDsKKwkJcmVtYWluLS07CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGxhc3QgdHJhbnNtaXNzaW9uICovCisJcnNwaV93YWl0X2Zvcl9pbnRlcnJ1cHQocnNwaSwgU1BTUl9TUFRFRiwgU1BDUl9TUFRJRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3BpX3RyYW5zZmVyX291dChzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWNvbnN0IHU4ICpidWYgPSB4ZmVyLT50eF9idWY7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCB4ZmVyLT5sZW47IGkrKykgeworCQlyZXQgPSByc3BpX2RhdGFfb3V0KHJzcGksICpidWYrKyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgbGFzdCB0cmFuc21pc3Npb24gKi8KKwlyc3BpX3dhaXRfZm9yX2ludGVycnVwdChyc3BpLCBTUFNSX1NQVEVGLCBTUENSX1NQVElFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzcGlfdHJhbnNmZXJfaW4oc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwl1OCAqYnVmID0geGZlci0+cnhfYnVmOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgeGZlci0+bGVuOyBpKyspIHsKKwkJcmV0ID0gcnNwaV9kYXRhX2luKHJzcGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSpidWYrKyA9IHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3BpX3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApIHsKKwkJcmV0dXJuIHFzcGlfdHJhbnNmZXJfb3V0X2luKHJzcGksIHhmZXIpOworCX0gZWxzZSBpZiAoeGZlci0+dHhfYnVmICYmIHhmZXItPnR4X25iaXRzID4gU1BJX05CSVRTX1NJTkdMRSkgeworCQkvKiBRdWFkIG9yIER1YWwgU1BJIFdyaXRlICovCisJCXJldHVybiBxc3BpX3RyYW5zZmVyX291dChyc3BpLCB4ZmVyKTsKKwl9IGVsc2UgaWYgKHhmZXItPnJ4X2J1ZiAmJiB4ZmVyLT5yeF9uYml0cyA+IFNQSV9OQklUU19TSU5HTEUpIHsKKwkJLyogUXVhZCBvciBEdWFsIFNQSSBSZWFkICovCisJCXJldHVybiBxc3BpX3RyYW5zZmVyX2luKHJzcGksIHhmZXIpOworCX0gZWxzZSB7CisJCS8qIFNpbmdsZSBTUEkgVHJhbnNmZXIgKi8KKwkJcmV0dXJuIHFzcGlfdHJhbnNmZXJfb3V0X2luKHJzcGksIHhmZXIpOworCX0KIH0KIAogc3RhdGljIGludCByc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCkBAIC04MTAsMzIgKzg4NiwxMTUgQEAKIAlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCiAJCXJzcGktPnNwY21kIHw9IFNQQ01EX0NQSEE7CiAKKwkvKiBDTU9TIG91dHB1dCBtb2RlIGFuZCBNT1NJIHNpZ25hbCBmcm9tIHByZXZpb3VzIHRyYW5zZmVyICovCisJcnNwaS0+c3BwY3IgPSAwOworCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCkKKwkJcnNwaS0+c3BwY3IgfD0gU1BQQ1JfU1BMUDsKKwogCXNldF9jb25maWdfcmVnaXN0ZXIocnNwaSwgOCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZykKK3N0YXRpYyB1MTYgcXNwaV90cmFuc2Zlcl9tb2RlKGNvbnN0IHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0Jc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltZXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQltZXNnLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNwaS0+bG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm1lc2ctPnF1ZXVlLCAmcnNwaS0+cXVldWUpOwotCXNjaGVkdWxlX3dvcmsoJnJzcGktPndzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc3BpLT5sb2NrLCBmbGFncyk7CisJaWYgKHhmZXItPnR4X2J1ZikKKwkJc3dpdGNoICh4ZmVyLT50eF9uYml0cykgeworCQljYXNlIFNQSV9OQklUU19RVUFEOgorCQkJcmV0dXJuIFNQQ01EX1NQSU1PRF9RVUFEOworCQljYXNlIFNQSV9OQklUU19EVUFMOgorCQkJcmV0dXJuIFNQQ01EX1NQSU1PRF9EVUFMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoeGZlci0+cnhfYnVmKQorCQlzd2l0Y2ggKHhmZXItPnJ4X25iaXRzKSB7CisJCWNhc2UgU1BJX05CSVRTX1FVQUQ6CisJCQlyZXR1cm4gU1BDTURfU1BJTU9EX1FVQUQgfCBTUENNRF9TUFJXOworCQljYXNlIFNQSV9OQklUU19EVUFMOgorCQkJcmV0dXJuIFNQQ01EX1NQSU1PRF9EVUFMIHwgU1BDTURfU1BSVzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnNwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgaW50IHFzcGlfc2V0dXBfc2VxdWVuY2VyKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCisJCQkJY29uc3Qgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CisJY29uc3Qgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwl1bnNpZ25lZCBpbnQgaSA9IDAsIGxlbiA9IDA7CisJdTE2IGN1cnJlbnRfbW9kZSA9IDB4ZmZmZiwgbW9kZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCW1vZGUgPSBxc3BpX3RyYW5zZmVyX21vZGUoeGZlcik7CisJCWlmIChtb2RlID09IGN1cnJlbnRfbW9kZSkgeworCQkJbGVuICs9IHhmZXItPmxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVHJhbnNmZXIgbW9kZSBjaGFuZ2UgKi8KKwkJaWYgKGkpIHsKKwkJCS8qIFNldCB0cmFuc2ZlciBkYXRhIGxlbmd0aCBvZiBwcmV2aW91cyB0cmFuc2ZlciAqLworCQkJcnNwaV93cml0ZTMyKHJzcGksIGxlbiwgUVNQSV9TUEJNVUwoaSAtIDEpKTsKKwkJfQorCisJCWlmIChpID49IFFTUElfTlVNX1NQQ01EKSB7CisJCQlkZXZfZXJyKCZtc2ctPnNwaS0+ZGV2LAorCQkJCSJUb28gbWFueSBkaWZmZXJlbnQgdHJhbnNmZXIgbW9kZXMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogUHJvZ3JhbSB0cmFuc2ZlciBtb2RlIGZvciB0aGlzIHRyYW5zZmVyICovCisJCXJzcGlfd3JpdGUxNihyc3BpLCByc3BpLT5zcGNtZCB8IG1vZGUsIFJTUElfU1BDTUQoaSkpOworCQljdXJyZW50X21vZGUgPSBtb2RlOworCQlsZW4gPSB4ZmVyLT5sZW47CisJCWkrKzsKKwl9CisJaWYgKGkpIHsKKwkJLyogU2V0IGZpbmFsIHRyYW5zZmVyIGRhdGEgbGVuZ3RoIGFuZCBzZXF1ZW5jZSBsZW5ndGggKi8KKwkJcnNwaV93cml0ZTMyKHJzcGksIGxlbiwgUVNQSV9TUEJNVUwoaSAtIDEpKTsKKwkJcnNwaV93cml0ZTgocnNwaSwgaSAtIDEsIFJTUElfU1BTQ1IpOworCX0KKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgcnNwaV9pcnEoaW50IGlycSwgdm9pZCAqX3NyKQorc3RhdGljIGludCByc3BpX3ByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCWlmIChtc2ctPnNwaS0+bW9kZSAmCisJICAgIChTUElfVFhfRFVBTCB8IFNQSV9UWF9RVUFEIHwgU1BJX1JYX0RVQUwgfCBTUElfUlhfUVVBRCkpIHsKKwkJLyogU2V0dXAgc2VxdWVuY2VyIGZvciBtZXNzYWdlcyB3aXRoIG11bHRpcGxlIHRyYW5zZmVyIG1vZGVzICovCisJCXJldCA9IHFzcGlfc2V0dXBfc2VxdWVuY2VyKHJzcGksIG1zZyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBFbmFibGUgU1BJIGZ1bmN0aW9uIGluIG1hc3RlciBtb2RlICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpIHwgU1BDUl9TUEUsIFJTUElfU1BDUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNwaV91bnByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCS8qIERpc2FibGUgU1BJIGZ1bmN0aW9uICovCisJcnNwaV93cml0ZTgocnNwaSwgcnNwaV9yZWFkOChyc3BpLCBSU1BJX1NQQ1IpICYgflNQQ1JfU1BFLCBSU1BJX1NQQ1IpOworCisJLyogUmVzZXQgc2VxdWVuY2VyIGZvciBTaW5nbGUgU1BJIFRyYW5zZmVycyAqLworCXJzcGlfd3JpdGUxNihyc3BpLCByc3BpLT5zcGNtZCwgUlNQSV9TUENNRDApOworCXJzcGlfd3JpdGU4KHJzcGksIDAsIFJTUElfU1BTQ1IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcnNwaV9pcnFfbXV4KGludCBpcnEsIHZvaWQgKl9zcikKIHsKIAlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gX3NyOwogCXU4IHNwc3I7CkBAIC04NTcsNiArMTAxNiwzNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCByc3BpX2lycV9yeChpbnQgaXJxLCB2b2lkICpfc3IpCit7CisJc3RydWN0IHJzcGlfZGF0YSAqcnNwaSA9IF9zcjsKKwl1OCBzcHNyOworCisJcnNwaS0+c3BzciA9IHNwc3IgPSByc3BpX3JlYWQ4KHJzcGksIFJTUElfU1BTUik7CisJaWYgKHNwc3IgJiBTUFNSX1NQUkYpIHsKKwkJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQUklFKTsKKwkJd2FrZV91cCgmcnNwaS0+d2FpdCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHJzcGlfaXJxX3R4KGludCBpcnEsIHZvaWQgKl9zcikKK3sKKwlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpID0gX3NyOworCXU4IHNwc3I7CisKKwlyc3BpLT5zcHNyID0gc3BzciA9IHJzcGlfcmVhZDgocnNwaSwgUlNQSV9TUFNSKTsKKwlpZiAoc3BzciAmIFNQU1JfU1BURUYpIHsKKwkJcnNwaV9kaXNhYmxlX2lycShyc3BpLCBTUENSX1NQVElFKTsKKwkJd2FrZV91cCgmcnNwaS0+d2FpdCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCByc3BpX3JlcXVlc3RfZG1hKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCiAJCQkJICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTkyMywzNCArMTExMiw4OSBAQAogCXN0cnVjdCByc3BpX2RhdGEgKnJzcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXJzcGlfcmVsZWFzZV9kbWEocnNwaSk7Ci0JY2xrX2Rpc2FibGUocnNwaS0+Y2xrKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfb3BzIHJzcGlfb3BzID0geworCS5zZXRfY29uZmlnX3JlZ2lzdGVyID0JCXJzcGlfc2V0X2NvbmZpZ19yZWdpc3RlciwKKwkudHJhbnNmZXJfb25lID0JCQlyc3BpX3RyYW5zZmVyX29uZSwKKwkubW9kZV9iaXRzID0JCQlTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0xPT1AsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9vcHMgcnNwaV9yel9vcHMgPSB7CisJLnNldF9jb25maWdfcmVnaXN0ZXIgPQkJcnNwaV9yel9zZXRfY29uZmlnX3JlZ2lzdGVyLAorCS50cmFuc2Zlcl9vbmUgPQkJCXJzcGlfcnpfdHJhbnNmZXJfb25lLAorCS5tb2RlX2JpdHMgPQkJCVNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfTE9PUCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX29wcyBxc3BpX29wcyA9IHsKKwkuc2V0X2NvbmZpZ19yZWdpc3RlciA9CQlxc3BpX3NldF9jb25maWdfcmVnaXN0ZXIsCisJLnRyYW5zZmVyX29uZSA9CQkJcXNwaV90cmFuc2Zlcl9vbmUsCisJLm1vZGVfYml0cyA9CQkJU1BJX0NQSEEgfCBTUElfQ1BPTCB8IFNQSV9MT09QIHwKKwkJCQkJU1BJX1RYX0RVQUwgfCBTUElfVFhfUVVBRCB8CisJCQkJCVNQSV9SWF9EVUFMIHwgU1BJX1JYX1FVQUQsCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByc3BpX29mX21hdGNoW10gPSB7CisJLyogUlNQSSBvbiBsZWdhY3kgU0ggKi8KKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNwaSIsIC5kYXRhID0gJnJzcGlfb3BzIH0sCisJLyogUlNQSSBvbiBSWi9BMUggKi8KKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNwaS1yeiIsIC5kYXRhID0gJnJzcGlfcnpfb3BzIH0sCisJLyogUVNQSSBvbiBSLUNhciBHZW4yICovCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHFzcGkiLCAuZGF0YSA9ICZxc3BpX29wcyB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnNwaV9vZl9tYXRjaCk7CisKK3N0YXRpYyBpbnQgcnNwaV9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJdTMyIG51bV9jczsKKwlpbnQgZXJyb3I7CisKKwkvKiBQYXJzZSBEVCBwcm9wZXJ0aWVzICovCisJZXJyb3IgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJudW0tY3MiLCAmbnVtX2NzKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkZXYsICJvZl9wcm9wZXJ0eV9yZWFkX3UzMiBudW0tY3MgZmFpbGVkICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gbnVtX2NzOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcnNwaV9vZl9tYXRjaAlOVUxMCitzdGF0aWMgaW5saW5lIGludCByc3BpX3BhcnNlX2R0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKworc3RhdGljIGludCByc3BpX3JlcXVlc3RfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycSwKKwkJCSAgICBpcnFfaGFuZGxlcl90IGhhbmRsZXIsIGNvbnN0IGNoYXIgKnN1ZmZpeCwKKwkJCSAgICB2b2lkICpkZXZfaWQpCit7CisJY29uc3QgY2hhciAqYmFzZSA9IGRldl9uYW1lKGRldik7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihiYXNlKSArIHN0cmxlbihzdWZmaXgpICsgMjsKKwljaGFyICpuYW1lID0gZGV2bV9remFsbG9jKGRldiwgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCXNucHJpbnRmKG5hbWUsIGxlbiwgIiVzOiVzIiwgYmFzZSwgc3VmZml4KTsKKwlyZXR1cm4gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycSwgaGFuZGxlciwgMCwgbmFtZSwgZGV2X2lkKTsKK30KKwogc3RhdGljIGludCByc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpOwotCWludCByZXQsIGlycTsKLQljaGFyIGNsa19uYW1lWzE2XTsKLQljb25zdCBzdHJ1Y3QgcnNwaV9wbGF0X2RhdGEgKnJzcGlfcGQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJY29uc3Qgc3RydWN0IHJzcGlfcGxhdF9kYXRhICpyc3BpX3BkOwogCWNvbnN0IHN0cnVjdCBzcGlfb3BzICpvcHM7Ci0JY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWRfZW50cnkgPSBwZGV2LT5pZF9lbnRyeTsKLQotCW9wcyA9IChzdHJ1Y3Qgc3BpX29wcyAqKWlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKLQkvKiBvcHMgcGFyYW1ldGVyIGNoZWNrICovCi0JaWYgKCFvcHMtPnNldF9jb25maWdfcmVnaXN0ZXIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidGhlcmUgaXMgbm8gc2V0X2NvbmZpZ19yZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X2lycSBlcnJvclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAogCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCByc3BpX2RhdGEpKTsKIAlpZiAobWFzdGVyID09IE5VTEwpIHsKQEAgLTk1OCw2ICsxMjAyLDI4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKHJzcGlfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCWlmIChvZl9pZCkgeworCQlvcHMgPSBvZl9pZC0+ZGF0YTsKKwkJcmV0ID0gcnNwaV9wYXJzZV9kdCgmcGRldi0+ZGV2LCBtYXN0ZXIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjE7CisJfSBlbHNlIHsKKwkJb3BzID0gKHN0cnVjdCBzcGlfb3BzICopcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhOworCQlyc3BpX3BkID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwkJaWYgKHJzcGlfcGQgJiYgcnNwaV9wZC0+bnVtX2NoaXBzZWxlY3QpCisJCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcnNwaV9wZC0+bnVtX2NoaXBzZWxlY3Q7CisJCWVsc2UKKwkJCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAyOyAvKiBkZWZhdWx0ICovCisJfTsKKworCS8qIG9wcyBwYXJhbWV0ZXIgY2hlY2sgKi8KKwlpZiAoIW9wcy0+c2V0X2NvbmZpZ19yZWdpc3RlcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0aGVyZSBpcyBubyBzZXRfY29uZmlnX3JlZ2lzdGVyXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjE7CisJfQorCiAJcnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByc3BpKTsKIAlyc3BpLT5vcHMgPSBvcHM7CkBAIC05NzAsMzkgKzEyMzYsNjEgQEAKIAkJZ290byBlcnJvcjE7CiAJfQogCi0Jc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICIlcyVkIiwgaWRfZW50cnktPm5hbWUsIHBkZXYtPmlkKTsKLQlyc3BpLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgY2xrX25hbWUpOworCXJzcGktPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHJzcGktPmNsaykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGdldCBjbG9ja1xuIik7CiAJCXJldCA9IFBUUl9FUlIocnNwaS0+Y2xrKTsKIAkJZ290byBlcnJvcjE7CiAJfQotCWNsa19lbmFibGUocnNwaS0+Y2xrKTsKIAotCUlOSVRfTElTVF9IRUFEKCZyc3BpLT5xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnJzcGktPmxvY2spOwotCUlOSVRfV09SSygmcnNwaS0+d3MsIHJzcGlfd29yayk7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyc3BpLT53YWl0KTsKIAotCWlmIChyc3BpX3BkICYmIHJzcGlfcGQtPm51bV9jaGlwc2VsZWN0KQotCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcnNwaV9wZC0+bnVtX2NoaXBzZWxlY3Q7Ci0JZWxzZQotCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMjsgLyogZGVmYXVsdCAqLwotCiAJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CiAJbWFzdGVyLT5zZXR1cCA9IHJzcGlfc2V0dXA7Ci0JbWFzdGVyLT50cmFuc2ZlciA9IHJzcGlfdHJhbnNmZXI7Ci0JbWFzdGVyLT5jbGVhbnVwID0gcnNwaV9jbGVhbnVwOwotCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQSEEgfCBTUElfQ1BPTDsKKwltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBvcHMtPnRyYW5zZmVyX29uZTsKKwltYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IHJzcGlfcHJlcGFyZV9tZXNzYWdlOworCW1hc3Rlci0+dW5wcmVwYXJlX21lc3NhZ2UgPSByc3BpX3VucHJlcGFyZV9tZXNzYWdlOworCW1hc3Rlci0+bW9kZV9iaXRzID0gb3BzLT5tb2RlX2JpdHM7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIHJzcGlfaXJxLCAwLAotCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCByc3BpKTsKKwlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAicngiKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAibXV4Iik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcnNwaS0+cnhfaXJxID0gcnNwaS0+dHhfaXJxID0gcmV0OworCX0gZWxzZSB7CisJCXJzcGktPnJ4X2lycSA9IHJldDsKKwkJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInR4Iik7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJzcGktPnR4X2lycSA9IHJldDsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X2lycSBlcnJvclxuIik7CisJCWdvdG8gZXJyb3IyOworCX0KKworCWlmIChyc3BpLT5yeF9pcnEgPT0gcnNwaS0+dHhfaXJxKSB7CisJCS8qIFNpbmdsZSBtdWx0aXBsZXhlZCBpbnRlcnJ1cHQgKi8KKwkJcmV0ID0gcnNwaV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByc3BpLT5yeF9pcnEsIHJzcGlfaXJxX211eCwKKwkJCQkgICAgICAgIm11eCIsIHJzcGkpOworCX0gZWxzZSB7CisJCS8qIE11bHRpLWludGVycnVwdCBtb2RlLCBvbmx5IFNQUkkgYW5kIFNQVEkgYXJlIHVzZWQgKi8KKwkJcmV0ID0gcnNwaV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByc3BpLT5yeF9pcnEsIHJzcGlfaXJxX3J4LAorCQkJCSAgICAgICAicngiLCByc3BpKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByc3BpX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHJzcGktPnR4X2lycSwKKwkJCQkJICAgICAgIHJzcGlfaXJxX3R4LCAidHgiLCByc3BpKTsKKwl9CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZXJyb3JcbiIpOwogCQlnb3RvIGVycm9yMjsKIAl9CiAKLQlyc3BpLT5pcnEgPSBpcnE7CiAJcmV0ID0gcnNwaV9yZXF1ZXN0X2RtYShyc3BpLCBwZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyc3BpX3JlcXVlc3RfZG1hIGZhaWxlZC5cbiIpOwpAQCAtMTAyMiwyNyArMTMxMCwxNiBAQAogZXJyb3IzOgogCXJzcGlfcmVsZWFzZV9kbWEocnNwaSk7CiBlcnJvcjI6Ci0JY2xrX2Rpc2FibGUocnNwaS0+Y2xrKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiBlcnJvcjE6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BpX29wcyByc3BpX29wcyA9IHsKLQkuc2V0X2NvbmZpZ19yZWdpc3RlciA9CQlyc3BpX3NldF9jb25maWdfcmVnaXN0ZXIsCi0JLnNlbmRfcGlvID0JCQlyc3BpX3NlbmRfcGlvLAotCS5yZWNlaXZlX3BpbyA9CQkJcnNwaV9yZWNlaXZlX3BpbywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX29wcyBxc3BpX29wcyA9IHsKLQkuc2V0X2NvbmZpZ19yZWdpc3RlciA9CQlxc3BpX3NldF9jb25maWdfcmVnaXN0ZXIsCi0JLnNlbmRfcGlvID0JCQlxc3BpX3NlbmRfcGlvLAotCS5yZWNlaXZlX3BpbyA9CQkJcXNwaV9yZWNlaXZlX3BpbywKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHNwaV9kcml2ZXJfaWRzW10gPSB7CiAJeyAicnNwaSIsCShrZXJuZWxfdWxvbmdfdCkmcnNwaV9vcHMgfSwKKwl7ICJyc3BpLXJ6IiwJKGtlcm5lbF91bG9uZ190KSZyc3BpX3J6X29wcyB9LAogCXsgInFzcGkiLAkoa2VybmVsX3Vsb25nX3QpJnFzcGlfb3BzIH0sCiAJe30sCiB9OwpAQCAtMTA1Niw2ICsxMzMzLDcgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUgPSAicmVuZXNhc19zcGkiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHJzcGlfb2ZfbWF0Y2gpLAogCX0sCiB9OwogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyc3BpX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHguYwppbmRleCA3NDY0MjRhLi5iZWQyMzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LmMKQEAgLTksNyArOSw2IEBACiAgKgogKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMTIzLDI1ICsxMjIsMTUgQEAKIHsKIAlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKIAlzdHJ1Y3QgczNjMjR4eF9zcGlfZGV2c3RhdGUgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXVuc2lnbmVkIGludCBicHc7CiAJdW5zaWduZWQgaW50IGh6OwogCXVuc2lnbmVkIGludCBkaXY7CiAJdW5zaWduZWQgbG9uZyBjbGs7CiAKLQlicHcgPSB0ID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKIAloeiAgPSB0ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKIAotCWlmICghYnB3KQotCQlicHcgPSA4OwotCiAJaWYgKCFoeikKIAkJaHogPSBzcGktPm1heF9zcGVlZF9oejsKIAotCWlmIChicHcgIT0gOCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgYml0cy1wZXItd29yZCAoJWQpXG4iLCBicHcpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAoc3BpLT5tb2RlICE9IGNzLT5tb2RlKSB7CiAJCXU4IHNwY29uID0gU1BDT05fREVGQVVMVCB8IFMzQzI0MTBfU1BDT05fRU5TQ0s7CiAKQEAgLTU0NCw2ICs1MzMsNyBAQAogCiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IGh3LT5wZGF0YS0+bnVtX2NzOwogCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlIGZvciB0aGUgYml0YmFuZyBkcml2ZXIgKi8KIApAQCAtNjQzLDYgKzYzMywxMSBAQAogc3RhdGljIGludCBzM2MyNHh4X3NwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9tYXN0ZXJfc3VzcGVuZChody0+bWFzdGVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKGh3LT5wZGF0YSAmJiBody0+cGRhdGEtPmdwaW9fc2V0dXApCiAJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDApOwpAQCAtNjU2LDcgKzY1MSw3IEBACiAJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJczNjMjR4eF9zcGlfaW5pdGlhbHNldHVwKGh3KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3BpX21hc3Rlcl9yZXN1bWUoaHctPm1hc3Rlcik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzM2MyNHh4X3NwaV9wbW9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMgYi9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCmluZGV4IGFlOTA3ZGQuLmYxOWNkOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYwpAQCAtMzQsMTAgKzM0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaD4KIAotI2lmZGVmIENPTkZJR19TM0NfRE1BCi0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNlbmRpZgotCiAjZGVmaW5lIE1BWF9TUElfUE9SVFMJCTMKICNkZWZpbmUgUzNDNjRYWF9TUElfUVVJUktfUE9MTAkJKDEgPDwgMCkKIApAQCAtMjAwLDkgKzE5Niw2IEBACiAJdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3BlZWQ7CiAJc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhCXJ4X2RtYTsKIAlzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEJdHhfZG1hOwotI2lmZGVmIENPTkZJR19TM0NfRE1BCi0Jc3RydWN0IHNhbXN1bmdfZG1hX29wcwkJKm9wczsKLSNlbmRpZgogCXN0cnVjdCBzM2M2NHh4X3NwaV9wb3J0X2NvbmZpZwkqcG9ydF9jb25mOwogCXVuc2lnbmVkIGludAkJCXBvcnRfaWQ7CiAJYm9vbAkJCQljc19ncGlvOwpAQCAtMjg0LDEwNCArMjc3LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKIH0KIAotI2lmZGVmIENPTkZJR19TM0NfRE1BCi0vKiBGSVhNRTogcmVtb3ZlIHRoaXMgc2VjdGlvbiBvbmNlIGFyY2gvYXJtL21hY2gtczNjNjR4eCB1c2VzIGRtYWVuZ2luZSAqLwotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCBzM2M2NHh4X3NwaV9kbWFfY2xpZW50ID0gewotCS5uYW1lID0gInNhbXN1bmctc3BpLWRtYSIsCi19OwotCiBzdGF0aWMgdm9pZCBwcmVwYXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSwKLQkJCQkJdW5zaWduZWQgbGVuLCBkbWFfYWRkcl90IGJ1ZikKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZDsKLQlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcHJlcCBpbmZvOwotCXN0cnVjdCBzYW1zdW5nX2RtYV9jb25maWcgY29uZmlnOwotCi0JaWYgKGRtYS0+ZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKSB7Ci0JCXNkZCA9IGNvbnRhaW5lcl9vZigodm9pZCAqKWRtYSwKLQkJCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSwgcnhfZG1hKTsKLQkJY29uZmlnLmRpcmVjdGlvbiA9IHNkZC0+cnhfZG1hLmRpcmVjdGlvbjsKLQkJY29uZmlnLmZpZm8gPSBzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1JYX0RBVEE7Ci0JCWNvbmZpZy53aWR0aCA9IHNkZC0+Y3VyX2JwdyAvIDg7Ci0JCXNkZC0+b3BzLT5jb25maWcoKGVudW0gZG1hX2NoKXNkZC0+cnhfZG1hLmNoLCAmY29uZmlnKTsKLQl9IGVsc2UgewotCQlzZGQgPSBjb250YWluZXJfb2YoKHZvaWQgKilkbWEsCi0JCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHR4X2RtYSk7Ci0JCWNvbmZpZy5kaXJlY3Rpb24gPSAgc2RkLT50eF9kbWEuZGlyZWN0aW9uOwotCQljb25maWcuZmlmbyA9IHNkZC0+c2ZyX3N0YXJ0ICsgUzNDNjRYWF9TUElfVFhfREFUQTsKLQkJY29uZmlnLndpZHRoID0gc2RkLT5jdXJfYnB3IC8gODsKLQkJc2RkLT5vcHMtPmNvbmZpZygoZW51bSBkbWFfY2gpc2RkLT50eF9kbWEuY2gsICZjb25maWcpOwotCX0KLQotCWluZm8uY2FwID0gRE1BX1NMQVZFOwotCWluZm8ubGVuID0gbGVuOwotCWluZm8uZnAgPSBzM2M2NHh4X3NwaV9kbWFjYjsKLQlpbmZvLmZwX3BhcmFtID0gZG1hOwotCWluZm8uZGlyZWN0aW9uID0gZG1hLT5kaXJlY3Rpb247Ci0JaW5mby5idWYgPSBidWY7Ci0KLQlzZGQtPm9wcy0+cHJlcGFyZSgoZW51bSBkbWFfY2gpZG1hLT5jaCwgJmluZm8pOwotCXNkZC0+b3BzLT50cmlnZ2VyKChlbnVtIGRtYV9jaClkbWEtPmNoKTsKLX0KLQotc3RhdGljIGludCBhY3F1aXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCkKLXsKLQlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcmVxIHJlcTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2RkLT5wZGV2LT5kZXY7Ci0KLQlzZGQtPm9wcyA9IHNhbXN1bmdfZG1hX2dldF9vcHMoKTsKLQotCXJlcS5jYXAgPSBETUFfU0xBVkU7Ci0JcmVxLmNsaWVudCA9ICZzM2M2NHh4X3NwaV9kbWFfY2xpZW50OwotCi0Jc2RkLT5yeF9kbWEuY2ggPSAoc3RydWN0IGRtYV9jaGFuICopKHVuc2lnbmVkIGxvbmcpc2RkLT5vcHMtPnJlcXVlc3QoCi0JCQkJCXNkZC0+cnhfZG1hLmRtYWNoLCAmcmVxLCBkZXYsICJyeCIpOwotCXNkZC0+dHhfZG1hLmNoID0gKHN0cnVjdCBkbWFfY2hhbiAqKSh1bnNpZ25lZCBsb25nKXNkZC0+b3BzLT5yZXF1ZXN0KAotCQkJCQlzZGQtPnR4X2RtYS5kbWFjaCwgJnJlcSwgZGV2LCAidHgiKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHMzYzY0eHhfc3BpX3ByZXBhcmVfdHJhbnNmZXIoc3RydWN0IHNwaV9tYXN0ZXIgKnNwaSkKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpKTsKLQotCS8qCi0JICogSWYgRE1BIHJlc291cmNlIHdhcyBub3QgYXZhaWxhYmxlIGR1cmluZwotCSAqIHByb2JlLCBubyBuZWVkIHRvIGNvbnRpbnVlIHdpdGggZG1hIHJlcXVlc3RzCi0JICogZWxzZSBBY3F1aXJlIERNQSBjaGFubmVscwotCSAqLwotCXdoaWxlICghaXNfcG9sbGluZyhzZGQpICYmICFhY3F1aXJlX2RtYShzZGQpKQotCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHMzYzY0eHhfc3BpX3VucHJlcGFyZV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGkpOwotCi0JLyogRnJlZSBETUEgY2hhbm5lbHMgKi8KLQlpZiAoIWlzX3BvbGxpbmcoc2RkKSkgewotCQlzZGQtPm9wcy0+cmVsZWFzZSgoZW51bSBkbWFfY2gpc2RkLT5yeF9kbWEuY2gsCi0JCQkJCSZzM2M2NHh4X3NwaV9kbWFfY2xpZW50KTsKLQkJc2RkLT5vcHMtPnJlbGVhc2UoKGVudW0gZG1hX2NoKXNkZC0+dHhfZG1hLmNoLAotCQkJCQkmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX2RtYV9zdG9wKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCSBzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSkKLXsKLQlzZGQtPm9wcy0+c3RvcCgoZW51bSBkbWFfY2gpZG1hLT5jaCk7Ci19Ci0jZWxzZQotCi1zdGF0aWMgdm9pZCBwcmVwYXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSwKLQkJCQkJdW5zaWduZWQgbGVuLCBkbWFfYWRkcl90IGJ1ZikKKwkJCXN0cnVjdCBzZ190YWJsZSAqc2d0KQogewogCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkOwogCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNvbmZpZzsKQEAgLTQwNyw4ICszMDQsOCBAQAogCQlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGRtYS0+Y2gsICZjb25maWcpOwogCX0KIAotCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoZG1hLT5jaCwgYnVmLCBsZW4sCi0JCQkJCWRtYS0+ZGlyZWN0aW9uLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zZyhkbWEtPmNoLCBzZ3QtPnNnbCwgc2d0LT5uZW50cywKKwkJCQkgICAgICAgZG1hLT5kaXJlY3Rpb24sIERNQV9QUkVQX0lOVEVSUlVQVCk7CiAKIAlkZXNjLT5jYWxsYmFjayA9IHMzYzY0eHhfc3BpX2RtYWNiOwogCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gZG1hOwpAQCAtNDM3LDYgKzMzNCw3IEBACiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlnb3RvIG91dDsKIAkJfQorCQlzcGktPmRtYV9yeCA9IHNkZC0+cnhfZG1hLmNoOwogCiAJCXNkZC0+dHhfZG1hLmNoID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbF9jb21wYXQobWFzaywgZmlsdGVyLAogCQkJCSAgICh2b2lkICopc2RkLT50eF9kbWEuZG1hY2gsIGRldiwgInR4Iik7CkBAIC00NDUsNiArMzQzLDcgQEAKIAkJCXJldCA9IC1FQlVTWTsKIAkJCWdvdG8gb3V0X3J4OwogCQl9CisJCXNwaS0+ZG1hX3R4ID0gc2RkLT50eF9kbWEuY2g7CiAJfQogCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmc2RkLT5wZGV2LT5kZXYpOwpAQCAtNDc3LDEyICszNzYsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfZG1hX3N0b3Aoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJIHN0cnVjdCBzM2M2NHh4X3NwaV9kbWFfZGF0YSAqZG1hKQorc3RhdGljIGJvb2wgczNjNjR4eF9zcGlfY2FuX2RtYShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChkbWEtPmNoKTsKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXJldHVybiB4ZmVyLT5sZW4gPiAoRklGT19MVkxfTUFTSyhzZGQpID4+IDEpICsgMTsKIH0KLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBlbmFibGVfZGF0YXBhdGgoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCiAJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKQEAgLTUxNSw3ICs0MTYsNyBAQAogCQljaGNmZyB8PSBTM0M2NFhYX1NQSV9DSF9UWENIX09OOwogCQlpZiAoZG1hX21vZGUpIHsKIAkJCW1vZGVjZmcgfD0gUzNDNjRYWF9TUElfTU9ERV9UWERNQV9PTjsKLQkJCXByZXBhcmVfZG1hKCZzZGQtPnR4X2RtYSwgeGZlci0+bGVuLCB4ZmVyLT50eF9kbWEpOworCQkJcHJlcGFyZV9kbWEoJnNkZC0+dHhfZG1hLCAmeGZlci0+dHhfc2cpOwogCQl9IGVsc2UgewogCQkJc3dpdGNoIChzZGQtPmN1cl9icHcpIHsKIAkJCWNhc2UgMzI6CkBAIC01NDcsNyArNDQ4LDcgQEAKIAkJCXdyaXRlbCgoKHhmZXItPmxlbiAqIDggLyBzZGQtPmN1cl9icHcpICYgMHhmZmZmKQogCQkJCQl8IFMzQzY0WFhfU1BJX1BBQ0tFVF9DTlRfRU4sCiAJCQkJCXJlZ3MgKyBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UKTsKLQkJCXByZXBhcmVfZG1hKCZzZGQtPnJ4X2RtYSwgeGZlci0+bGVuLCB4ZmVyLT5yeF9kbWEpOworCQkJcHJlcGFyZV9kbWEoJnNkZC0+cnhfZG1hLCAmeGZlci0+cnhfc2cpOwogCQl9CiAJfQogCkBAIC01NTUsMjMgKzQ1Niw2IEBACiAJd3JpdGVsKGNoY2ZnLCByZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9jcyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKLQkJCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JaWYgKHNkZC0+dGdsX3NwaSAhPSBOVUxMKSB7IC8qIElmIGxhc3QgZGV2aWNlIHRvZ2dsZWQgYWZ0ZXIgbXNzZyAqLwotCQlpZiAoc2RkLT50Z2xfc3BpICE9IHNwaSkgeyAvKiBpZiBsYXN0IG1zc2cgb24gZGlmZiBkZXZpY2UgKi8KLQkJCS8qIERlc2VsZWN0IHRoZSBsYXN0IHRvZ2dsZWQgZGV2aWNlICovCi0JCQlpZiAoc3BpLT5jc19ncGlvID49IDApCi0JCQkJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLAotCQkJCQlzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDAgOiAxKTsKLQkJfQotCQlzZGQtPnRnbF9zcGkgPSBOVUxMOwotCX0KLQotCWlmIChzcGktPmNzX2dwaW8gPj0gMCkKLQkJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDEgOiAwKTsKLX0KLQogc3RhdGljIHUzMiBzM2M2NHh4X3NwaV93YWl0X2Zvcl90aW1lb3V0KHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAogCQkJCQlpbnQgdGltZW91dF9tcykKIHsKQEAgLTU5MywxMTIgKzQ3NywxMTEgQEAKIAlyZXR1cm4gUlhfRklGT19MVkwoc3RhdHVzLCBzZGQpOwogfQogCi1zdGF0aWMgaW50IHdhaXRfZm9yX3hmZXIoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciwgaW50IGRtYV9tb2RlKQorc3RhdGljIGludCB3YWl0X2Zvcl9kbWEoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCisJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IHNkZC0+cmVnczsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwl1MzIgc3RhdHVzOwogCWludCBtczsKIAogCS8qIG1pbGxpc2VjcyB0byB4ZmVyICdsZW4nIGJ5dGVzIEAgJ2N1cl9zcGVlZCcgKi8KIAltcyA9IHhmZXItPmxlbiAqIDggKiAxMDAwIC8gc2RkLT5jdXJfc3BlZWQ7CiAJbXMgKz0gMTA7IC8qIHNvbWUgdG9sZXJhbmNlICovCiAKLQlpZiAoZG1hX21vZGUpIHsKLQkJdmFsID0gbXNlY3NfdG9famlmZmllcyhtcykgKyAxMDsKLQkJdmFsID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzZGQtPnhmZXJfY29tcGxldGlvbiwgdmFsKTsKLQl9IGVsc2UgewotCQl1MzIgc3RhdHVzOwotCQl2YWwgPSBtc2Vjc190b19sb29wcyhtcyk7Ci0JCWRvIHsKKwl2YWwgPSBtc2Vjc190b19qaWZmaWVzKG1zKSArIDEwOworCXZhbCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2RkLT54ZmVyX2NvbXBsZXRpb24sIHZhbCk7CisKKwkvKgorCSAqIElmIHRoZSBwcmV2aW91cyB4ZmVyIHdhcyBjb21wbGV0ZWQgd2l0aGluIHRpbWVvdXQsIHRoZW4KKwkgKiBwcm9jZWVkIGZ1cnRoZXIgZWxzZSByZXR1cm4gLUVJTy4KKwkgKiBEbWFUeCByZXR1cm5zIGFmdGVyIHNpbXBseSB3cml0aW5nIGRhdGEgaW4gdGhlIEZJRk8sCisJICogdy9vIHdhaXRpbmcgZm9yIHJlYWwgdHJhbnNtaXNzaW9uIG9uIHRoZSBidXMgdG8gZmluaXNoLgorCSAqIERtYVJ4IHJldHVybnMgb25seSBhZnRlciBEbWEgcmVhZCBkYXRhIGZyb20gRklGTyB3aGljaAorCSAqIG5lZWRzIGJ1cyB0cmFuc21pc3Npb24gdG8gZmluaXNoLCBzbyB3ZSBkb24ndCB3b3JyeSBpZgorCSAqIFhmZXIgaW52b2x2ZWQgUngod2l0aCBvciB3aXRob3V0IFR4KS4KKwkgKi8KKwlpZiAodmFsICYmICF4ZmVyLT5yeF9idWYpIHsKKwkJdmFsID0gbXNlY3NfdG9fbG9vcHMoMTApOworCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKKwkJd2hpbGUgKChUWF9GSUZPX0xWTChzdGF0dXMsIHNkZCkKKwkJCXx8ICFTM0M2NFhYX1NQSV9TVF9UWF9ET05FKHN0YXR1cywgc2RkKSkKKwkJICAgICAgICYmIC0tdmFsKSB7CisJCQljcHVfcmVsYXgoKTsKIAkJCXN0YXR1cyA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9TVEFUVVMpOwotCQl9IHdoaWxlIChSWF9GSUZPX0xWTChzdGF0dXMsIHNkZCkgPCB4ZmVyLT5sZW4gJiYgLS12YWwpOwotCX0KLQotCWlmIChkbWFfbW9kZSkgewotCQl1MzIgc3RhdHVzOwotCi0JCS8qCi0JCSAqIElmIHRoZSBwcmV2aW91cyB4ZmVyIHdhcyBjb21wbGV0ZWQgd2l0aGluIHRpbWVvdXQsIHRoZW4KLQkJICogcHJvY2VlZCBmdXJ0aGVyIGVsc2UgcmV0dXJuIC1FSU8uCi0JCSAqIERtYVR4IHJldHVybnMgYWZ0ZXIgc2ltcGx5IHdyaXRpbmcgZGF0YSBpbiB0aGUgRklGTywKLQkJICogdy9vIHdhaXRpbmcgZm9yIHJlYWwgdHJhbnNtaXNzaW9uIG9uIHRoZSBidXMgdG8gZmluaXNoLgotCQkgKiBEbWFSeCByZXR1cm5zIG9ubHkgYWZ0ZXIgRG1hIHJlYWQgZGF0YSBmcm9tIEZJRk8gd2hpY2gKLQkJICogbmVlZHMgYnVzIHRyYW5zbWlzc2lvbiB0byBmaW5pc2gsIHNvIHdlIGRvbid0IHdvcnJ5IGlmCi0JCSAqIFhmZXIgaW52b2x2ZWQgUngod2l0aCBvciB3aXRob3V0IFR4KS4KLQkJICovCi0JCWlmICh2YWwgJiYgIXhmZXItPnJ4X2J1ZikgewotCQkJdmFsID0gbXNlY3NfdG9fbG9vcHMoMTApOwotCQkJc3RhdHVzID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7Ci0JCQl3aGlsZSAoKFRYX0ZJRk9fTFZMKHN0YXR1cywgc2RkKQotCQkJCXx8ICFTM0M2NFhYX1NQSV9TVF9UWF9ET05FKHN0YXR1cywgc2RkKSkKLQkJCQkJJiYgLS12YWwpIHsKLQkJCQljcHVfcmVsYXgoKTsKLQkJCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKLQkJCX0KLQogCQl9CiAKLQkJLyogSWYgdGltZWQgb3V0IHdoaWxlIGNoZWNraW5nIHJ4L3R4IHN0YXR1cyByZXR1cm4gZXJyb3IgKi8KLQkJaWYgKCF2YWwpCi0JCQlyZXR1cm4gLUVJTzsKLQl9IGVsc2UgewotCQlpbnQgbG9vcHM7Ci0JCXUzMiBjcHlfbGVuOwotCQl1OCAqYnVmOwotCi0JCS8qIElmIGl0IHdhcyBvbmx5IFR4ICovCi0JCWlmICgheGZlci0+cnhfYnVmKSB7Ci0JCQlzZGQtPnN0YXRlICY9IH5UWEJVU1k7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZSByZWNlaXZlIGxlbmd0aCBpcyBiaWdnZXIgdGhhbiB0aGUgY29udHJvbGxlciBmaWZvCi0JCSAqIHNpemUsIGNhbGN1bGF0ZSB0aGUgbG9vcHMgYW5kIHJlYWQgdGhlIGZpZm8gYXMgbWFueSB0aW1lcy4KLQkJICogbG9vcHMgPSBsZW5ndGggLyBtYXggZmlmbyBzaXplIChjYWxjdWxhdGVkIGJ5IHVzaW5nIHRoZQotCQkgKiBmaWZvIG1hc2spLgotCQkgKiBGb3IgYW55IHNpemUgbGVzcyB0aGFuIHRoZSBmaWZvIHNpemUgdGhlIGJlbG93IGNvZGUgaXMKLQkJICogZXhlY3V0ZWQgYXRsZWFzdCBvbmNlLgotCQkgKi8KLQkJbG9vcHMgPSB4ZmVyLT5sZW4gLyAoKEZJRk9fTFZMX01BU0soc2RkKSA+PiAxKSArIDEpOwotCQlidWYgPSB4ZmVyLT5yeF9idWY7Ci0JCWRvIHsKLQkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjZWl2ZWQgaW4gdGhlIGZpZm8gKi8KLQkJCWNweV9sZW4gPSBzM2M2NHh4X3NwaV93YWl0X2Zvcl90aW1lb3V0KHNkZCwKLQkJCQkJCShsb29wcyA/IG1zIDogMCkpOwotCi0JCQlzd2l0Y2ggKHNkZC0+Y3VyX2JwdykgewotCQkJY2FzZSAzMjoKLQkJCQlpb3JlYWQzMl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCi0JCQkJCWJ1ZiwgY3B5X2xlbiAvIDQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjoKLQkJCQlpb3JlYWQxNl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCi0JCQkJCWJ1ZiwgY3B5X2xlbiAvIDIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpb3JlYWQ4X3JlcChyZWdzICsgUzNDNjRYWF9TUElfUlhfREFUQSwKLQkJCQkJYnVmLCBjcHlfbGVuKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJYnVmID0gYnVmICsgY3B5X2xlbjsKLQkJfSB3aGlsZSAobG9vcHMtLSk7Ci0JCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKIAl9CiAKKwkvKiBJZiB0aW1lZCBvdXQgd2hpbGUgY2hlY2tpbmcgcngvdHggc3RhdHVzIHJldHVybiBlcnJvciAqLworCWlmICghdmFsKQorCQlyZXR1cm4gLUVJTzsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9jcyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKLQkJCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgaW50IHdhaXRfZm9yX3BpbyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKKwkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7Ci0JaWYgKHNkZC0+dGdsX3NwaSA9PSBzcGkpCi0JCXNkZC0+dGdsX3NwaSA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICpyZWdzID0gc2RkLT5yZWdzOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXUzMiBzdGF0dXM7CisJaW50IGxvb3BzOworCXUzMiBjcHlfbGVuOworCXU4ICpidWY7CisJaW50IG1zOwogCi0JaWYgKHNwaS0+Y3NfZ3BpbyA+PSAwKQotCQlncGlvX3NldF92YWx1ZShzcGktPmNzX2dwaW8sIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMCA6IDEpOworCS8qIG1pbGxpc2VjcyB0byB4ZmVyICdsZW4nIGJ5dGVzIEAgJ2N1cl9zcGVlZCcgKi8KKwltcyA9IHhmZXItPmxlbiAqIDggKiAxMDAwIC8gc2RkLT5jdXJfc3BlZWQ7CisJbXMgKz0gMTA7IC8qIHNvbWUgdG9sZXJhbmNlICovCisKKwl2YWwgPSBtc2Vjc190b19sb29wcyhtcyk7CisJZG8geworCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKKwl9IHdoaWxlIChSWF9GSUZPX0xWTChzdGF0dXMsIHNkZCkgPCB4ZmVyLT5sZW4gJiYgLS12YWwpOworCisKKwkvKiBJZiBpdCB3YXMgb25seSBUeCAqLworCWlmICgheGZlci0+cnhfYnVmKSB7CisJCXNkZC0+c3RhdGUgJj0gflRYQlVTWTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcmVjZWl2ZSBsZW5ndGggaXMgYmlnZ2VyIHRoYW4gdGhlIGNvbnRyb2xsZXIgZmlmbworCSAqIHNpemUsIGNhbGN1bGF0ZSB0aGUgbG9vcHMgYW5kIHJlYWQgdGhlIGZpZm8gYXMgbWFueSB0aW1lcy4KKwkgKiBsb29wcyA9IGxlbmd0aCAvIG1heCBmaWZvIHNpemUgKGNhbGN1bGF0ZWQgYnkgdXNpbmcgdGhlCisJICogZmlmbyBtYXNrKS4KKwkgKiBGb3IgYW55IHNpemUgbGVzcyB0aGFuIHRoZSBmaWZvIHNpemUgdGhlIGJlbG93IGNvZGUgaXMKKwkgKiBleGVjdXRlZCBhdGxlYXN0IG9uY2UuCisJICovCisJbG9vcHMgPSB4ZmVyLT5sZW4gLyAoKEZJRk9fTFZMX01BU0soc2RkKSA+PiAxKSArIDEpOworCWJ1ZiA9IHhmZXItPnJ4X2J1ZjsKKwlkbyB7CisJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjZWl2ZWQgaW4gdGhlIGZpZm8gKi8KKwkJY3B5X2xlbiA9IHMzYzY0eHhfc3BpX3dhaXRfZm9yX3RpbWVvdXQoc2RkLAorCQkJCQkJICAgICAgIChsb29wcyA/IG1zIDogMCkpOworCisJCXN3aXRjaCAoc2RkLT5jdXJfYnB3KSB7CisJCWNhc2UgMzI6CisJCQlpb3JlYWQzMl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCisJCQkJICAgICBidWYsIGNweV9sZW4gLyA0KTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJaW9yZWFkMTZfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAorCQkJCSAgICAgYnVmLCBjcHlfbGVuIC8gMik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlvcmVhZDhfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAorCQkJCSAgICBidWYsIGNweV9sZW4pOworCQkJYnJlYWs7CisJCX0KKworCQlidWYgPSBidWYgKyBjcHlfbGVuOworCX0gd2hpbGUgKGxvb3BzLS0pOworCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9jb25maWcoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQpCkBAIC03NzQsODEgKzY1Nyw2IEBACiAKICNkZWZpbmUgWEZFUl9ETUFBRERSX0lOVkFMSUQgRE1BX0JJVF9NQVNLKDMyKQogCi1zdGF0aWMgaW50IHMzYzY0eHhfc3BpX21hcF9tc3NnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZC0+cGRldi0+ZGV2OwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7Ci0KLQlpZiAoaXNfcG9sbGluZyhzZGQpIHx8IG1zZy0+aXNfZG1hX21hcHBlZCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBGaXJzdCBtYXJrIGFsbCB4ZmVyIHVubWFwcGVkICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJeGZlci0+cnhfZG1hID0gWEZFUl9ETUFBRERSX0lOVkFMSUQ7Ci0JCXhmZXItPnR4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCX0KLQotCS8qIE1hcCB1bnRpbCBlbmQgb3IgZmlyc3QgZmFpbCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0KLQkJaWYgKHhmZXItPmxlbiA8PSAoKEZJRk9fTFZMX01BU0soc2RkKSA+PiAxKSArIDEpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKSB7Ci0JCQl4ZmVyLT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsCi0JCQkJCSh2b2lkICopeGZlci0+dHhfYnVmLCB4ZmVyLT5sZW4sCi0JCQkJCURNQV9UT19ERVZJQ0UpOwotCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgeGZlci0+dHhfZG1hKSkgewotCQkJCWRldl9lcnIoZGV2LCAiZG1hX21hcF9zaW5nbGUgVHggZmFpbGVkXG4iKTsKLQkJCQl4ZmVyLT50eF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfQotCi0JCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTCkgewotCQkJeGZlci0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LCB4ZmVyLT5yeF9idWYsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Ci0JCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCB4ZmVyLT5yeF9kbWEpKSB7Ci0JCQkJZGV2X2VycihkZXYsICJkbWFfbWFwX3NpbmdsZSBSeCBmYWlsZWRcbiIpOwotCQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZmVyLT50eF9kbWEsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9UT19ERVZJQ0UpOwotCQkJCXhmZXItPnR4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCQkJCXhmZXItPnJ4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX3VubWFwX21zc2coc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2RkLT5wZGV2LT5kZXY7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQotCWlmIChpc19wb2xsaW5nKHNkZCkgfHwgbXNnLT5pc19kbWFfbWFwcGVkKQotCQlyZXR1cm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCi0JCWlmICh4ZmVyLT5sZW4gPD0gKChGSUZPX0xWTF9NQVNLKHNkZCkgPj4gMSkgKyAxKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTAotCQkJCSYmIHhmZXItPnJ4X2RtYSAhPSBYRkVSX0RNQUFERFJfSU5WQUxJRCkKLQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZmVyLT5yeF9kbWEsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Ci0KLQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMCi0JCQkJJiYgeGZlci0+dHhfZG1hICE9IFhGRVJfRE1BQUREUl9JTlZBTElEKQotCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHhmZXItPnR4X2RtYSwKLQkJCQkJCXhmZXItPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JfQotfQotCiBzdGF0aWMgaW50IHMzYzY0eHhfc3BpX3ByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAogCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKIHsKQEAgLTg2NiwxMyArNjc0LDYgQEAKIAkJczNjNjR4eF9zcGlfY29uZmlnKHNkZCk7CiAJfQogCi0JLyogTWFwIGFsbCB0aGUgdHJhbnNmZXJzIGlmIG5lZWRlZCAqLwotCWlmIChzM2M2NHh4X3NwaV9tYXBfbXNzZyhzZGQsIG1zZykpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkiWGZlcjogVW5hYmxlIHRvIG1hcCBtZXNzYWdlIGJ1ZmZlcnMhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJLyogQ29uZmlndXJlIGZlZWRiYWNrIGRlbGF5ICovCiAJd3JpdGVsKGNzLT5mYl9kZWxheSAmIDB4Mywgc2RkLT5yZWdzICsgUzNDNjRYWF9TUElfRkJfQ0xLKTsKIApAQCAtODk2LDEzICs2OTcsNiBAQAogCWJwdyA9IHhmZXItPmJpdHNfcGVyX3dvcmQ7CiAJc3BlZWQgPSB4ZmVyLT5zcGVlZF9oeiA/IDogc3BpLT5tYXhfc3BlZWRfaHo7CiAKLQlpZiAoeGZlci0+bGVuICUgKGJwdyAvIDgpKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJIlhmZXIgbGVuZ3RoKCV1KSBub3QgYSBtdWx0aXBsZSBvZiB3b3JkIHNpemUoJXUpXG4iLAotCQkJeGZlci0+bGVuLCBicHcgLyA4KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCiAJaWYgKGJwdyAhPSBzZGQtPmN1cl9icHcgfHwgc3BlZWQgIT0gc2RkLT5jdXJfc3BlZWQpIHsKIAkJc2RkLT5jdXJfYnB3ID0gYnB3OwogCQlzZGQtPmN1cl9zcGVlZCA9IHNwZWVkOwpAQCAtOTI5LDcgKzcyMywxMCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CiAKLQlzdGF0dXMgPSB3YWl0X2Zvcl94ZmVyKHNkZCwgeGZlciwgdXNlX2RtYSk7CisJaWYgKHVzZV9kbWEpCisJCXN0YXR1cyA9IHdhaXRfZm9yX2RtYShzZGQsIHhmZXIpOworCWVsc2UKKwkJc3RhdHVzID0gd2FpdF9mb3JfcGlvKHNkZCwgeGZlcik7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiSS9PIEVycm9yOiByeC0lZCB0eC0lZCByZXM6cngtJWMgdHgtJWMgbGVuLSVkXG4iLApAQCAtOTQxLDEwICs3MzgsMTAgQEAKIAkJaWYgKHVzZV9kbWEpIHsKIAkJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTAogCQkJICAgICYmIChzZGQtPnN0YXRlICYgVFhCVVNZKSkKLQkJCQlzM2M2NHh4X3NwaV9kbWFfc3RvcChzZGQsICZzZGQtPnR4X2RtYSk7CisJCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc2RkLT50eF9kbWEuY2gpOwogCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMCiAJCQkgICAgJiYgKHNkZC0+c3RhdGUgJiBSWEJVU1kpKQotCQkJCXMzYzY0eHhfc3BpX2RtYV9zdG9wKHNkZCwgJnNkZC0+cnhfZG1hKTsKKwkJCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzZGQtPnJ4X2RtYS5jaCk7CiAJCX0KIAl9IGVsc2UgewogCQlmbHVzaF9maWZvKHNkZCk7CkBAIC05NTMsMTYgKzc1MCw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBzM2M2NHh4X3NwaV91bnByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAotCQkJCQkgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0KLQlzM2M2NHh4X3NwaV91bm1hcF9tc3NnKHNkZCwgbXNnKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHMzYzY0eHhfc3BpX2NzaW5mbyAqczNjNjR4eF9nZXRfc2xhdmVfY3RybGRhdGEoCiAJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTEwOTIsMTQgKzg3OSwxMiBAQAogCiAJcG1fcnVudGltZV9wdXQoJnNkZC0+cGRldi0+ZGV2KTsKIAl3cml0ZWwoUzNDNjRYWF9TUElfU0xBVkVfU0lHX0lOQUNULCBzZGQtPnJlZ3MgKyBTM0M2NFhYX1NQSV9TTEFWRV9TRUwpOwotCWRpc2FibGVfY3Moc2RkLCBzcGkpOwogCXJldHVybiAwOwogCiBzZXR1cF9leGl0OgogCXBtX3J1bnRpbWVfcHV0KCZzZGQtPnBkZXYtPmRldik7CiAJLyogc2V0dXAoKSByZXR1cm5zIHdpdGggZGV2aWNlIGRlLXNlbGVjdGVkICovCiAJd3JpdGVsKFMzQzY0WFhfU1BJX1NMQVZFX1NJR19JTkFDVCwgc2RkLT5yZWdzICsgUzNDNjRYWF9TUElfU0xBVkVfU0VMKTsKLQlkaXNhYmxlX2NzKHNkZCwgc3BpKTsKIAogCWdwaW9fZnJlZShjcy0+bGluZSk7CiAJc3BpX3NldF9jdGxkYXRhKHNwaSwgTlVMTCk7CkBAIC0xMzM4LDcgKzExMjMsNiBAQAogCW1hc3Rlci0+cHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSA9IHMzYzY0eHhfc3BpX3ByZXBhcmVfdHJhbnNmZXI7CiAJbWFzdGVyLT5wcmVwYXJlX21lc3NhZ2UgPSBzM2M2NHh4X3NwaV9wcmVwYXJlX21lc3NhZ2U7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzM2M2NHh4X3NwaV90cmFuc2Zlcl9vbmU7Ci0JbWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZSA9IHMzYzY0eHhfc3BpX3VucHJlcGFyZV9tZXNzYWdlOwogCW1hc3Rlci0+dW5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0gczNjNjR4eF9zcGlfdW5wcmVwYXJlX3RyYW5zZmVyOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBzY2ktPm51bV9jczsKIAltYXN0ZXItPmRtYV9hbGlnbm1lbnQgPSA4OwpAQCAtMTM0Nyw2ICsxMTMxLDggQEAKIAkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisJaWYgKCFpc19wb2xsaW5nKHNkZCkpCisJCW1hc3Rlci0+Y2FuX2RtYSA9IHMzYzY0eHhfc3BpX2Nhbl9kbWE7CiAKIAlzZGQtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtX3Jlcyk7CiAJaWYgKElTX0VSUihzZGQtPnJlZ3MpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMgYi9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMKaW5kZXggMTIxYzJlMS4uMjM3ZjJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zYzE4aXM2MDIuYwpAQCAtMTgzLDE3ICsxODMsOSBAQAogc3RhdGljIGludCBzYzE4aXM2MDJfY2hlY2tfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgaW50IHRsZW4pCiB7Ci0JdWludDMyX3QgaHo7Ci0KIAlpZiAodCAmJiB0LT5sZW4gKyB0bGVuID4gU0MxOElTNjAyX0JVRlNJWikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCWlmICh0ICYmIHQtPnNwZWVkX2h6KQotCQloeiA9IHQtPnNwZWVkX2h6OwotCWlmIChoeiA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMDUsMjIgKzE5NywxNSBAQAogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQkvKiBTQzE4SVM2MDIgZG9lcyBub3Qgc3VwcG9ydCBDUzIgKi8KLQlpZiAoaHctPmlkID09IHNjMThpczYwMiAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDIpIHsKLQkJc3RhdHVzID0gLUVOWElPOwotCQlnb3RvIGVycm9yOwotCX0KLQogCWh3LT50bGVuID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJdTMyIGh6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwogCQlib29sIGRvX3RyYW5zZmVyOwogCiAJCXN0YXR1cyA9IHNjMThpczYwMl9jaGVja190cmFuc2ZlcihzcGksIHQsIGh3LT50bGVuKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlicmVhazsKIAotCQlzdGF0dXMgPSBzYzE4aXM2MDJfc2V0dXBfdHJhbnNmZXIoaHcsIGh6LCBzcGktPm1vZGUpOworCQlzdGF0dXMgPSBzYzE4aXM2MDJfc2V0dXBfdHJhbnNmZXIoaHcsIHQtPnNwZWVkX2h6LCBzcGktPm1vZGUpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yMzgsNyArMjIzLDYgQEAKIAkJaWYgKHQtPmRlbGF5X3VzZWNzKQogCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKIAl9Ci1lcnJvcjoKIAltLT5zdGF0dXMgPSBzdGF0dXM7CiAJc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZShtYXN0ZXIpOwogCkBAIC0yNDcsMTAgKzIzMSwxMyBAQAogCiBzdGF0aWMgaW50IHNjMThpczYwMl9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWlmIChzcGktPm1vZGUgJiB+KFNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfTFNCX0ZJUlNUKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IHNjMThpczYwMiAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCXJldHVybiBzYzE4aXM2MDJfY2hlY2tfdHJhbnNmZXIoc3BpLCBOVUxMLCAwKTsKKwkvKiBTQzE4SVM2MDIgZG9lcyBub3Qgc3VwcG9ydCBDUzIgKi8KKwlpZiAoaHctPmlkID09IHNjMThpczYwMiAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDIpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzYzE4aXM2MDJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTMwOSw2ICsyOTYsOCBAQAogCW1hc3Rlci0+c2V0dXAgPSBzYzE4aXM2MDJfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IHNjMThpczYwMl90cmFuc2Zlcl9vbmU7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IG5wOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gaHctPmZyZXEgLyAxMjg7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBody0+ZnJlcSAvIDQ7CiAKIAllcnJvciA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcihkZXYsIG1hc3Rlcik7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNoLWhzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1oc3BpLmMKaW5kZXggODJkMmY5Mi4uOTAwOTQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLWhzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc2gtaHNwaS5jCkBAIC00Niw4ICs0Niw2IEBACiAvKiBTUFNSICovCiAjZGVmaW5lIFJYRkwJKDEgPDwgMikKIAotI2RlZmluZSBoc3BpMmluZm8oaCkJKGgtPmRldi0+cGxhdGZvcm1fZGF0YSkKLQogc3RydWN0IGhzcGlfcHJpdiB7CiAJdm9pZCBfX2lvbWVtICphZGRyOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CkBAIC0xMTMsMTQgKzExMSw5IEBACiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhzcGktPmRldjsKLQl1MzIgdGFyZ2V0X3JhdGU7CiAJdTMyIHNwY3IsIGlkaXZfY2xrOwogCXUzMiByYXRlLCBiZXN0X3JhdGUsIG1pbiwgdG1wOwogCi0JdGFyZ2V0X3JhdGUgPSB0ID8gdC0+c3BlZWRfaHogOiAwOwotCWlmICghdGFyZ2V0X3JhdGUpCi0JCXRhcmdldF9yYXRlID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0KIAkvKgogCSAqIGZpbmQgYmVzdCBJRElWL0NMS0N4IHNldHRpbmdzCiAJICovCkBAIC0xNDAsNyArMTMzLDcgQEAKIAkJcmF0ZSAvPSAoKChpZGl2X2NsayAmIDB4MUYpICsgMSkgKiAyKTsKIAogCQkvKiBzYXZlIGJlc3Qgc2V0dGluZ3MgKi8KLQkJdG1wID0gYWJzKHRhcmdldF9yYXRlIC0gcmF0ZSk7CisJCXRtcCA9IGFicyh0LT5zcGVlZF9oeiAtIHJhdGUpOwogCQlpZiAodG1wIDwgbWluKSB7CiAJCQltaW4gPSB0bXA7CiAJCQlzcGNyID0gaWRpdl9jbGs7CkBAIC0xNTMsNyArMTQ2LDcgQEAKIAlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCiAJCXNwY3IgfD0gMSA8PCA2OwogCi0JZGV2X2RiZyhkZXYsICJzcGVlZCAlZC8lZFxuIiwgdGFyZ2V0X3JhdGUsIGJlc3RfcmF0ZSk7CisJZGV2X2RiZyhkZXYsICJzcGVlZCAlZC8lZFxuIiwgdC0+c3BlZWRfaHosIGJlc3RfcmF0ZSk7CiAKIAloc3BpX3dyaXRlKGhzcGksIFNQQ1IsIHNwY3IpOwogCWhzcGlfd3JpdGUoaHNwaSwgU1BTUiwgMHgwKTsKQEAgLTIzMCwyOSArMjIzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGhzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgaHNwaV9wcml2ICpoc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaHNwaS0+ZGV2OwotCi0JaWYgKDggIT0gc3BpLT5iaXRzX3Blcl93b3JkKSB7Ci0JCWRldl9lcnIoZGV2LCAiYml0c19wZXJfd29yZCBzaG91bGQgYmUgOFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWRldl9kYmcoZGV2LCAiJXMgc2V0dXBcbiIsIHNwaS0+bW9kYWxpYXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhzcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBoc3BpX3ByaXYgKmhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoc3BpLT5kZXY7Ci0KLQlkZXZfZGJnKGRldiwgIiVzIGNsZWFudXBcbiIsIHNwaS0+bW9kYWxpYXMpOwotfQotCiBzdGF0aWMgaW50IGhzcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTI5OCwyMiArMjY4LDIzIEBACiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QJPSAxOwogCW1hc3Rlci0+YnVzX251bQkJPSBwZGV2LT5pZDsKLQltYXN0ZXItPnNldHVwCQk9IGhzcGlfc2V0dXA7Ci0JbWFzdGVyLT5jbGVhbnVwCQk9IGhzcGlfY2xlYW51cDsKIAltYXN0ZXItPm1vZGVfYml0cwk9IFNQSV9DUE9MIHwgU1BJX0NQSEE7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZQk9IHBkZXYtPmRldi5vZl9ub2RlOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlCQk9IGhzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2U7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisKIAlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzcGlfcmVnaXN0ZXJfbWFzdGVyIGVycm9yLlxuIik7Ci0JCWdvdG8gZXJyb3IxOworCQlnb3RvIGVycm9yMjsKIAl9CiAKIAlyZXR1cm4gMDsKIAorIGVycm9yMjoKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAgZXJyb3IxOgogCWNsa19wdXQoY2xrKTsKICBlcnJvcjA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCmluZGV4IDgxY2MwMmYuLmU4NTBkMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCkBAIC0xNSw1OSArMTUsMTA4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc2hfbXNpb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CiAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKKworc3RydWN0IHNoX21zaW9mX2NoaXBkYXRhIHsKKwl1MTYgdHhfZmlmb19zaXplOworCXUxNiByeF9maWZvX3NpemU7CisJdTE2IG1hc3Rlcl9mbGFnczsKK307CisKIHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiB7Ci0Jc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7IC8qIG11c3QgYmUgZmlyc3QgZm9yIHNwaV9iaXRiYW5nLmMgKi8KIAl2b2lkIF9faW9tZW0gKm1hcGJhc2U7CiAJc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJY29uc3Qgc3RydWN0IHNoX21zaW9mX2NoaXBkYXRhICpjaGlwZGF0YTsKIAlzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX2luZm8gKmluZm87CiAJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0eF9maWZvX3NpemU7CiAJaW50IHJ4X2ZpZm9fc2l6ZTsKIH07CiAKLSNkZWZpbmUgVE1EUjEJMHgwMAotI2RlZmluZSBUTURSMgkweDA0Ci0jZGVmaW5lIFRNRFIzCTB4MDgKLSNkZWZpbmUgUk1EUjEJMHgxMAotI2RlZmluZSBSTURSMgkweDE0Ci0jZGVmaW5lIFJNRFIzCTB4MTgKLSNkZWZpbmUgVFNDUgkweDIwCi0jZGVmaW5lIFJTQ1IJMHgyMgotI2RlZmluZSBDVFIJMHgyOAotI2RlZmluZSBGQ1RSCTB4MzAKLSNkZWZpbmUgU1RSCTB4NDAKLSNkZWZpbmUgSUVSCTB4NDQKLSNkZWZpbmUgVERSMQkweDQ4Ci0jZGVmaW5lIFREUjIJMHg0YwotI2RlZmluZSBURkRSCTB4NTAKLSNkZWZpbmUgUkRSMQkweDU4Ci0jZGVmaW5lIFJEUjIJMHg1YwotI2RlZmluZSBSRkRSCTB4NjAKKyNkZWZpbmUgVE1EUjEJMHgwMAkvKiBUcmFuc21pdCBNb2RlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgVE1EUjIJMHgwNAkvKiBUcmFuc21pdCBNb2RlIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgVE1EUjMJMHgwOAkvKiBUcmFuc21pdCBNb2RlIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUk1EUjEJMHgxMAkvKiBSZWNlaXZlIE1vZGUgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBSTURSMgkweDE0CS8qIFJlY2VpdmUgTW9kZSBSZWdpc3RlciAyICovCisjZGVmaW5lIFJNRFIzCTB4MTgJLyogUmVjZWl2ZSBNb2RlIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgVFNDUgkweDIwCS8qIFRyYW5zbWl0IENsb2NrIFNlbGVjdCBSZWdpc3RlciAqLworI2RlZmluZSBSU0NSCTB4MjIJLyogUmVjZWl2ZSBDbG9jayBTZWxlY3QgUmVnaXN0ZXIgKFNILCBBMSwgQVBFNikgKi8KKyNkZWZpbmUgQ1RSCTB4MjgJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBGQ1RSCTB4MzAJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNUUgkweDQwCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJRVIJMHg0NAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFREUjEJMHg0OAkvKiBUcmFuc21pdCBDb250cm9sIERhdGEgUmVnaXN0ZXIgMSAoU0gsIEExKSAqLworI2RlZmluZSBURFIyCTB4NGMJLyogVHJhbnNtaXQgQ29udHJvbCBEYXRhIFJlZ2lzdGVyIDIgKFNILCBBMSkgKi8KKyNkZWZpbmUgVEZEUgkweDUwCS8qIFRyYW5zbWl0IEZJRk8gRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBSRFIxCTB4NTgJLyogUmVjZWl2ZSBDb250cm9sIERhdGEgUmVnaXN0ZXIgMSAoU0gsIEExKSAqLworI2RlZmluZSBSRFIyCTB4NWMJLyogUmVjZWl2ZSBDb250cm9sIERhdGEgUmVnaXN0ZXIgMiAoU0gsIEExKSAqLworI2RlZmluZSBSRkRSCTB4NjAJLyogUmVjZWl2ZSBGSUZPIERhdGEgUmVnaXN0ZXIgKi8KIAotI2RlZmluZSBDVFJfVFNDS0UgKDEgPDwgMTUpCi0jZGVmaW5lIENUUl9URlNFICAoMSA8PCAxNCkKLSNkZWZpbmUgQ1RSX1RYRSAgICgxIDw8IDkpCi0jZGVmaW5lIENUUl9SWEUgICAoMSA8PCA4KQorLyogVE1EUjEgYW5kIFJNRFIxICovCisjZGVmaW5lIE1EUjFfVFJNRAkgMHg4MDAwMDAwMCAvKiBUcmFuc2ZlciBNb2RlICgxID0gTWFzdGVyIG1vZGUpICovCisjZGVmaW5lIE1EUjFfU1lOQ01EX01BU0sgMHgzMDAwMDAwMCAvKiBTWU5DIE1vZGUgKi8KKyNkZWZpbmUgTURSMV9TWU5DTURfU1BJCSAweDIwMDAwMDAwIC8qICAgTGV2ZWwgbW9kZS9TUEkgKi8KKyNkZWZpbmUgTURSMV9TWU5DTURfTFIJIDB4MzAwMDAwMDAgLyogICBML1IgbW9kZSAqLworI2RlZmluZSBNRFIxX1NZTkNBQ19TSElGVAkgMjUgLyogU3luYyBQb2xhcml0eSAoMSA9IEFjdGl2ZS1sb3cpICovCisjZGVmaW5lIE1EUjFfQklUTFNCX1NISUZUCSAyNCAvKiBNU0IvTFNCIEZpcnN0ICgxID0gTFNCIGZpcnN0KSAqLworI2RlZmluZSBNRFIxX0ZMRF9NQVNLCSAweDAwMDAwMGMwIC8qIEZyYW1lIFN5bmMgU2lnbmFsIEludGVydmFsICgwLTMpICovCisjZGVmaW5lIE1EUjFfRkxEX1NISUZUCQkgIDIKKyNkZWZpbmUgTURSMV9YWFNUUAkgMHgwMDAwMDAwMSAvKiBUcmFuc21pc3Npb24vUmVjZXB0aW9uIFN0b3Agb24gRklGTyAqLworLyogVE1EUjEgKi8KKyNkZWZpbmUgVE1EUjFfUENPTgkgMHg0MDAwMDAwMCAvKiBUcmFuc2ZlciBTaWduYWwgQ29ubmVjdGlvbiAqLwogCi0jZGVmaW5lIFNUUl9URU9GICAoMSA8PCAyMykKLSNkZWZpbmUgU1RSX1JFT0YgICgxIDw8IDcpCisvKiBUTURSMiBhbmQgUk1EUjIgKi8KKyNkZWZpbmUgTURSMl9CSVRMRU4xKGkpCSgoKGkpIC0gMSkgPDwgMjQpIC8qIERhdGEgU2l6ZSAoOC0zMiBiaXRzKSAqLworI2RlZmluZSBNRFIyX1dETEVOMShpKQkoKChpKSAtIDEpIDw8IDE2KSAvKiBXb3JkIENvdW50ICgxLTY0LzI1NiAoU0gsIEExKSkpICovCisjZGVmaW5lIE1EUjJfR1JQTUFTSzEJMHgwMDAwMDAwMSAvKiBHcm91cCBPdXRwdXQgTWFzayAxIChTSCwgQTEpICovCisKKy8qIFRTQ1IgYW5kIFJTQ1IgKi8KKyNkZWZpbmUgU0NSX0JSUFNfTUFTSwkgICAgMHgxZjAwIC8qIFByZXNjYWxlciBTZXR0aW5nICgxLTMyKSAqLworI2RlZmluZSBTQ1JfQlJQUyhpKQkoKChpKSAtIDEpIDw8IDgpCisjZGVmaW5lIFNDUl9CUkRWX01BU0sJICAgIDB4MDAwNyAvKiBCYXVkIFJhdGUgR2VuZXJhdG9yJ3MgRGl2aXNpb24gUmF0aW8gKi8KKyNkZWZpbmUgU0NSX0JSRFZfRElWXzIJICAgIDB4MDAwMAorI2RlZmluZSBTQ1JfQlJEVl9ESVZfNAkgICAgMHgwMDAxCisjZGVmaW5lIFNDUl9CUkRWX0RJVl84CSAgICAweDAwMDIKKyNkZWZpbmUgU0NSX0JSRFZfRElWXzE2CSAgICAweDAwMDMKKyNkZWZpbmUgU0NSX0JSRFZfRElWXzMyCSAgICAweDAwMDQKKyNkZWZpbmUgU0NSX0JSRFZfRElWXzEJICAgIDB4MDAwNworCisvKiBDVFIgKi8KKyNkZWZpbmUgQ1RSX1RTQ0tJWl9NQVNLCTB4YzAwMDAwMDAgLyogVHJhbnNtaXQgQ2xvY2sgSS9PIFBvbGFyaXR5IFNlbGVjdCAqLworI2RlZmluZSBDVFJfVFNDS0laX1NDSwkweDgwMDAwMDAwIC8qICAgRGlzYWJsZSBTQ0sgd2hlbiBUWCBkaXNhYmxlZCAqLworI2RlZmluZSBDVFJfVFNDS0laX1BPTF9TSElGVAkzMCAvKiAgIFRyYW5zbWl0IENsb2NrIFBvbGFyaXR5ICovCisjZGVmaW5lIENUUl9SU0NLSVpfTUFTSwkweDMwMDAwMDAwIC8qIFJlY2VpdmUgQ2xvY2sgUG9sYXJpdHkgU2VsZWN0ICovCisjZGVmaW5lIENUUl9SU0NLSVpfU0NLCTB4MjAwMDAwMDAgLyogICBNdXN0IG1hdGNoIENUUl9UU0NLSVpfU0NLICovCisjZGVmaW5lIENUUl9SU0NLSVpfUE9MX1NISUZUCTI4IC8qICAgUmVjZWl2ZSBDbG9jayBQb2xhcml0eSAqLworI2RlZmluZSBDVFJfVEVER19TSElGVAkJMjcgLyogVHJhbnNtaXQgVGltaW5nICgxID0gZmFsbGluZyBlZGdlKSAqLworI2RlZmluZSBDVFJfUkVER19TSElGVAkJMjYgLyogUmVjZWl2ZSBUaW1pbmcgKDEgPSBmYWxsaW5nIGVkZ2UpICovCisjZGVmaW5lIENUUl9UWERJWl9NQVNLCTB4MDBjMDAwMDAgLyogUGluIE91dHB1dCBXaGVuIFRYIGlzIERpc2FibGVkICovCisjZGVmaW5lIENUUl9UWERJWl9MT1cJMHgwMDAwMDAwMCAvKiAgIDAgKi8KKyNkZWZpbmUgQ1RSX1RYRElaX0hJR0gJMHgwMDQwMDAwMCAvKiAgIDEgKi8KKyNkZWZpbmUgQ1RSX1RYRElaX0hJWgkweDAwODAwMDAwIC8qICAgSGlnaC1pbXBlZGFuY2UgKi8KKyNkZWZpbmUgQ1RSX1RTQ0tFCTB4MDAwMDgwMDAgLyogVHJhbnNtaXQgU2VyaWFsIENsb2NrIE91dHB1dCBFbmFibGUgKi8KKyNkZWZpbmUgQ1RSX1RGU0UJMHgwMDAwNDAwMCAvKiBUcmFuc21pdCBGcmFtZSBTeW5jIFNpZ25hbCBPdXRwdXQgRW5hYmxlICovCisjZGVmaW5lIENUUl9UWEUJCTB4MDAwMDAyMDAgLyogVHJhbnNtaXQgRW5hYmxlICovCisjZGVmaW5lIENUUl9SWEUJCTB4MDAwMDAxMDAgLyogUmVjZWl2ZSBFbmFibGUgKi8KKworLyogU1RSIGFuZCBJRVIgKi8KKyNkZWZpbmUgU1RSX1RFT0YJMHgwMDgwMDAwMCAvKiBGcmFtZSBUcmFuc21pc3Npb24gRW5kICovCisjZGVmaW5lIFNUUl9SRU9GCTB4MDAwMDAwODAgLyogRnJhbWUgUmVjZXB0aW9uIEVuZCAqLworCiAKIHN0YXRpYyB1MzIgc2hfbXNpb2ZfcmVhZChzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsIGludCByZWdfb2ZmcykKIHsKQEAgLTEzMSwyMiArMTgwLDIxIEBACiAJdW5zaWduZWQgc2hvcnQgZGl2OwogCXVuc2lnbmVkIHNob3J0IHNjcjsKIH0gY29uc3Qgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtdID0gewotCXsgMSwgMHgwMDA3IH0sCi0JeyAyLCAweDAwMDAgfSwKLQl7IDQsIDB4MDAwMSB9LAotCXsgOCwgMHgwMDAyIH0sCi0JeyAxNiwgMHgwMDAzIH0sCi0JeyAzMiwgMHgwMDA0IH0sCi0JeyA2NCwgMHgxZjAwIH0sCi0JeyAxMjgsIDB4MWYwMSB9LAotCXsgMjU2LCAweDFmMDIgfSwKLQl7IDUxMiwgMHgxZjAzIH0sCi0JeyAxMDI0LCAweDFmMDQgfSwKKwl7IDEsCVNDUl9CUlBTKCAxKSB8IFNDUl9CUkRWX0RJVl8xIH0sCisJeyAyLAlTQ1JfQlJQUyggMSkgfCBTQ1JfQlJEVl9ESVZfMiB9LAorCXsgNCwJU0NSX0JSUFMoIDEpIHwgU0NSX0JSRFZfRElWXzQgfSwKKwl7IDgsCVNDUl9CUlBTKCAxKSB8IFNDUl9CUkRWX0RJVl84IH0sCisJeyAxNiwJU0NSX0JSUFMoIDEpIHwgU0NSX0JSRFZfRElWXzE2IH0sCisJeyAzMiwJU0NSX0JSUFMoIDEpIHwgU0NSX0JSRFZfRElWXzMyIH0sCisJeyA2NCwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzIgfSwKKwl7IDEyOCwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzQgfSwKKwl7IDI1NiwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzggfSwKKwl7IDUxMiwJU0NSX0JSUFMoMzIpIHwgU0NSX0JSRFZfRElWXzE2IH0sCisJeyAxMDI0LAlTQ1JfQlJQUygzMikgfCBTQ1JfQlJEVl9ESVZfMzIgfSwKIH07CiAKIHN0YXRpYyB2b2lkIHNoX21zaW9mX3NwaV9zZXRfY2xrX3JlZ3Moc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBzcGlfaHopCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSwgdTMyIHNwaV9oeikKIHsKIAl1bnNpZ25lZCBsb25nIGRpdiA9IDEwMjQ7CiAJc2l6ZV90IGs7CkBAIC0xNjQsNyArMjEyLDggQEAKIAlrID0gbWluX3QoaW50LCBrLCBBUlJBWV9TSVpFKHNoX21zaW9mX3NwaV9jbGtfdGFibGUpIC0gMSk7CiAKIAlzaF9tc2lvZl93cml0ZShwLCBUU0NSLCBzaF9tc2lvZl9zcGlfY2xrX3RhYmxlW2tdLnNjcik7Ci0Jc2hfbXNpb2Zfd3JpdGUocCwgUlNDUiwgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtrXS5zY3IpOworCWlmICghKHAtPmNoaXBkYXRhLT5tYXN0ZXJfZmxhZ3MgJiBTUElfTUFTVEVSX01VU1RfVFgpKQorCQlzaF9tc2lvZl93cml0ZShwLCBSU0NSLCBzaF9tc2lvZl9zcGlfY2xrX3RhYmxlW2tdLnNjcik7CiB9CiAKIHN0YXRpYyB2b2lkIHNoX21zaW9mX3NwaV9zZXRfcGluX3JlZ3Moc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLApAQCAtMTgzLDIxICsyMzIsMjUgQEAKIAkgKi8KIAlzaF9tc2lvZl93cml0ZShwLCBGQ1RSLCAwKTsKIAotCXRtcCA9IDA7Ci0JdG1wIHw9ICFjc19oaWdoIDw8IDI1OwotCXRtcCB8PSBsc2JfZmlyc3QgPDwgMjQ7Ci0Jc2hfbXNpb2Zfd3JpdGUocCwgVE1EUjEsIDB4ZTAwMDAwMDUgfCB0bXApOwotCXNoX21zaW9mX3dyaXRlKHAsIFJNRFIxLCAweDIwMDAwMDA1IHwgdG1wKTsKKwl0bXAgPSBNRFIxX1NZTkNNRF9TUEkgfCAxIDw8IE1EUjFfRkxEX1NISUZUIHwgTURSMV9YWFNUUDsKKwl0bXAgfD0gIWNzX2hpZ2ggPDwgTURSMV9TWU5DQUNfU0hJRlQ7CisJdG1wIHw9IGxzYl9maXJzdCA8PCBNRFIxX0JJVExTQl9TSElGVDsKKwlzaF9tc2lvZl93cml0ZShwLCBUTURSMSwgdG1wIHwgTURSMV9UUk1EIHwgVE1EUjFfUENPTik7CisJaWYgKHAtPmNoaXBkYXRhLT5tYXN0ZXJfZmxhZ3MgJiBTUElfTUFTVEVSX01VU1RfVFgpIHsKKwkJLyogVGhlc2UgYml0cyBhcmUgcmVzZXJ2ZWQgaWYgUlggbmVlZHMgVFggKi8KKwkJdG1wICY9IH4weDAwMDBmZmZmOworCX0KKwlzaF9tc2lvZl93cml0ZShwLCBSTURSMSwgdG1wKTsKIAotCXRtcCA9IDB4YTAwMDAwMDA7Ci0JdG1wIHw9IGNwb2wgPDwgMzA7IC8qIFRTQ0tJWiAqLwotCXRtcCB8PSBjcG9sIDw8IDI4OyAvKiBSU0NLSVogKi8KKwl0bXAgPSAwOworCXRtcCB8PSBDVFJfVFNDS0laX1NDSyB8IGNwb2wgPDwgQ1RSX1RTQ0tJWl9QT0xfU0hJRlQ7CisJdG1wIHw9IENUUl9SU0NLSVpfU0NLIHwgY3BvbCA8PCBDVFJfUlNDS0laX1BPTF9TSElGVDsKIAogCWVkZ2UgPSBjcG9sIF4gIWNwaGE7CiAKLQl0bXAgfD0gZWRnZSA8PCAyNzsgLyogVEVERyAqLwotCXRtcCB8PSBlZGdlIDw8IDI2OyAvKiBSRURHICovCi0JdG1wIHw9ICh0eF9oaV96ID8gMiA6IDApIDw8IDIyOyAvKiBUWERJWiAqLworCXRtcCB8PSBlZGdlIDw8IENUUl9URURHX1NISUZUOworCXRtcCB8PSBlZGdlIDw8IENUUl9SRURHX1NISUZUOworCXRtcCB8PSB0eF9oaV96ID8gQ1RSX1RYRElaX0hJWiA6IENUUl9UWERJWl9MT1c7CiAJc2hfbXNpb2Zfd3JpdGUocCwgQ1RSLCB0bXApOwogfQogCkBAIC0yMDUsMTIgKzI1OCwxMiBAQAogCQkJCSAgICAgICBjb25zdCB2b2lkICp0eF9idWYsIHZvaWQgKnJ4X2J1ZiwKIAkJCQkgICAgICAgdTMyIGJpdHMsIHUzMiB3b3JkcykKIHsKLQl1MzIgZHIyID0gKChiaXRzIC0gMSkgPDwgMjQpIHwgKCh3b3JkcyAtIDEpIDw8IDE2KTsKKwl1MzIgZHIyID0gTURSMl9CSVRMRU4xKGJpdHMpIHwgTURSMl9XRExFTjEod29yZHMpOwogCi0JaWYgKHR4X2J1ZikKKwlpZiAodHhfYnVmIHx8IChwLT5jaGlwZGF0YS0+bWFzdGVyX2ZsYWdzICYgU1BJX01BU1RFUl9NVVNUX1RYKSkKIAkJc2hfbXNpb2Zfd3JpdGUocCwgVE1EUjIsIGRyMik7CiAJZWxzZQotCQlzaF9tc2lvZl93cml0ZShwLCBUTURSMiwgZHIyIHwgMSk7CisJCXNoX21zaW9mX3dyaXRlKHAsIFRNRFIyLCBkcjIgfCBNRFIyX0dSUE1BU0sxKTsKIAogCWlmIChyeF9idWYpCiAJCXNoX21zaW9mX3dyaXRlKHAsIFJNRFIyLCBkcjIpOwpAQCAtMzYzLDc3ICs0MTYsNDUgQEAKIAkJcHV0X3VuYWxpZ25lZChzd2FiMzIoc2hfbXNpb2ZfcmVhZChwLCBSRkRSKSA+PiBmcyksICZidWZfMzJba10pOwogfQogCi1zdGF0aWMgaW50IHNoX21zaW9mX3NwaV9iaXRzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCitzdGF0aWMgaW50IHNoX21zaW9mX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCBiaXRzOwotCi0JYml0cyA9IHQgPyB0LT5iaXRzX3Blcl93b3JkIDogMDsKLQlpZiAoIWJpdHMpCi0JCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JcmV0dXJuIGJpdHM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNoX21zaW9mX3NwaV9oeihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQl1bnNpZ25lZCBsb25nIGh6OwotCi0JaHogPSB0ID8gdC0+c3BlZWRfaHogOiAwOwotCWlmICghaHopCi0JCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JcmV0dXJuIGh6OwotfQotCi1zdGF0aWMgaW50IHNoX21zaW9mX3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCWludCBiaXRzOwotCi0JLyogbm90aW5nIHRvIGNoZWNrIGh6IHZhbHVlcyBhZ2FpbnN0IHNpbmNlIHBhcmVudCBjbG9jayBpcyBkaXNhYmxlZCAqLwotCi0JYml0cyA9IHNoX21zaW9mX3NwaV9iaXRzKHNwaSwgdCk7Ci0JaWYgKGJpdHMgPCA4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYml0cyA+IDMyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcihzcGksIHQpOwotfQotCi1zdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCi17CisJc3RydWN0IGRldmljZV9ub2RlCSpucCA9IHNwaS0+bWFzdGVyLT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlpbnQgdmFsdWU7CiAKLQkvKiBjaGlwIHNlbGVjdCBpcyBhY3RpdmUgbG93IHVubGVzcyBTUElfQ1NfSElHSCBpcyBzZXQgKi8KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpCi0JCXZhbHVlID0gKGlzX29uID09IEJJVEJBTkdfQ1NfQUNUSVZFKSA/IDEgOiAwOwotCWVsc2UKLQkJdmFsdWUgPSAoaXNfb24gPT0gQklUQkFOR19DU19BQ1RJVkUpID8gMCA6IDE7Ci0KLQlpZiAoaXNfb24gPT0gQklUQkFOR19DU19BQ1RJVkUpIHsKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZwLT5mbGFncykpIHsKLQkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnAtPnBkZXYtPmRldik7Ci0JCQljbGtfZW5hYmxlKHAtPmNsayk7Ci0JCX0KLQotCQkvKiBDb25maWd1cmUgcGlucyBiZWZvcmUgYXNzZXJ0aW5nIENTICovCi0JCXNoX21zaW9mX3NwaV9zZXRfcGluX3JlZ3MocCwgISEoc3BpLT5tb2RlICYgU1BJX0NQT0wpLAotCQkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSwKLQkJCQkJICAhIShzcGktPm1vZGUgJiBTUElfM1dJUkUpLAotCQkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpLAotCQkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJaWYgKCFucCkgeworCQkvKgorCQkgKiBVc2Ugc3BpLT5jb250cm9sbGVyX2RhdGEgZm9yIENTIChzYW1lIHN0cmF0ZWd5IGFzIHNwaV9ncGlvKSwKKwkJICogaWYgYW55LiBvdGhlcndpc2UgbGV0IEhXIGNvbnRyb2wgQ1MKKwkJICovCisJCXNwaS0+Y3NfZ3BpbyA9ICh1aW50cHRyX3Qpc3BpLT5jb250cm9sbGVyX2RhdGE7CiAJfQogCi0JLyogdXNlIHNwaS0+Y29udHJvbGxlciBkYXRhIGZvciBDUyAoc2FtZSBzdHJhdGVneSBhcyBzcGlfZ3BpbykgKi8KLQlncGlvX3NldF92YWx1ZSgodWludHB0cl90KXNwaS0+Y29udHJvbGxlcl9kYXRhLCB2YWx1ZSk7CisJLyogQ29uZmlndXJlIHBpbnMgYmVmb3JlIGRlYXNzZXJ0aW5nIENTICovCisJc2hfbXNpb2Zfc3BpX3NldF9waW5fcmVncyhwLCAhIShzcGktPm1vZGUgJiBTUElfQ1BPTCksCisJCQkJICAhIShzcGktPm1vZGUgJiBTUElfQ1BIQSksCisJCQkJICAhIShzcGktPm1vZGUgJiBTUElfM1dJUkUpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCksCisJCQkJICAhIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOwogCi0JaWYgKGlzX29uID09IEJJVEJBTkdfQ1NfSU5BQ1RJVkUpIHsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmcC0+ZmxhZ3MpKSB7Ci0JCQljbGtfZGlzYWJsZShwLT5jbGspOwotCQkJcG1fcnVudGltZV9wdXQoJnAtPnBkZXYtPmRldik7Ci0JCX0KLQl9CisJaWYgKHNwaS0+Y3NfZ3BpbyA+PSAwKQorCQlncGlvX3NldF92YWx1ZShzcGktPmNzX2dwaW8sICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoX21zaW9mX3ByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOworCisJLyogQ29uZmlndXJlIHBpbnMgYmVmb3JlIGFzc2VydGluZyBDUyAqLworCXNoX21zaW9mX3NwaV9zZXRfcGluX3JlZ3MocCwgISEoc3BpLT5tb2RlICYgU1BJX0NQT0wpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0NQSEEpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSwKKwkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpLAorCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzaF9tc2lvZl9zcGlfdHhyeF9vbmNlKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKQEAgLTQ4Nyw3ICs1MDgsNyBAQAogCS8qIGNsZWFyIHN0YXR1cyBiaXRzICovCiAJc2hfbXNpb2ZfcmVzZXRfc3RyKHApOwogCi0JLyogc2h1dCBkb3duIGZyYW1lLCB0eC90eCBhbmQgY2xvY2sgc2lnbmFscyAqLworCS8qIHNodXQgZG93biBmcmFtZSwgcngvdHggYW5kIGNsb2NrIHNpZ25hbHMgKi8KIAlyZXQgPSBzaF9tc2lvZl9tb2RpZnlfY3RyX3dhaXQocCwgQ1RSX1RGU0UsIDApOwogCXJldCA9IHJldCA/IHJldCA6IHNoX21zaW9mX21vZGlmeV9jdHJfd2FpdChwLCBDVFJfVFhFLCAwKTsKIAlpZiAocnhfYnVmKQpAQCAtNTA1LDkgKzUyNiwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbXNpb2Zfc3BpX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3N0YXRpYyBpbnQgc2hfbXNpb2ZfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCiB7Ci0Jc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCXZvaWQgKCp0eF9maWZvKShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKiwgY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7CiAJdm9pZCAoKnJ4X2ZpZm8pKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqLCB2b2lkICosIGludCwgaW50KTsKIAlpbnQgYml0czsKQEAgLTUxNyw3ICs1NDAsNyBAQAogCWludCBuOwogCWJvb2wgc3dhYjsKIAotCWJpdHMgPSBzaF9tc2lvZl9zcGlfYml0cyhzcGksIHQpOworCWJpdHMgPSB0LT5iaXRzX3Blcl93b3JkOwogCiAJaWYgKGJpdHMgPD0gOCAmJiB0LT5sZW4gPiAxNSAmJiAhKHQtPmxlbiAmIDMpKSB7CiAJCWJpdHMgPSAzMjsKQEAgLTU2Nyw4ICs1OTAsNyBAQAogCX0KIAogCS8qIHNldHVwIGNsb2NrcyAoY2xvY2sgYWxyZWFkeSBlbmFibGVkIGluIGNoaXBzZWxlY3QoKSkgKi8KLQlzaF9tc2lvZl9zcGlfc2V0X2Nsa19yZWdzKHAsIGNsa19nZXRfcmF0ZShwLT5jbGspLAotCQkJCSAgc2hfbXNpb2Zfc3BpX2h6KHNwaSwgdCkpOworCXNoX21zaW9mX3NwaV9zZXRfY2xrX3JlZ3MocCwgY2xrX2dldF9yYXRlKHAtPmNsayksIHQtPnNwZWVkX2h6KTsKIAogCS8qIHRyYW5zZmVyIGluIGZpZm8gc2l6ZWQgY2h1bmtzICovCiAJd29yZHMgPSB0LT5sZW4gLyBieXRlc19wZXJfd29yZDsKQEAgLTU4OCwyMiArNjEwLDM2IEBACiAJCXdvcmRzIC09IG47CiAJfQogCi0JcmV0dXJuIGJ5dGVzX2RvbmU7Ci19Ci0KLXN0YXRpYyB1MzIgc2hfbXNpb2Zfc3BpX3R4cnhfd29yZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywKLQkJCQkgIHUzMiB3b3JkLCB1OCBiaXRzKQotewotCUJVRygpOyAvKiB1bnVzZWQgYnV0IG5lZWRlZCBieSBiaXRiYW5nIGNvZGUgKi8KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9tc2lvZl9jaGlwZGF0YSBzaF9kYXRhID0geworCS50eF9maWZvX3NpemUgPSA2NCwKKwkucnhfZmlmb19zaXplID0gNjQsCisJLm1hc3Rlcl9mbGFncyA9IDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX21zaW9mX2NoaXBkYXRhIHI4YTc3OXhfZGF0YSA9IHsKKwkudHhfZmlmb19zaXplID0gNjQsCisJLnJ4X2ZpZm9fc2l6ZSA9IDI1NiwKKwkubWFzdGVyX2ZsYWdzID0gU1BJX01BU1RFUl9NVVNUX1RYLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2hfbXNpb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2gtbXNpb2YiLCAgICAgICAgLmRhdGEgPSAmc2hfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaC1tb2JpbGUtbXNpb2YiLCAuZGF0YSA9ICZzaF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLG1zaW9mLXI4YTc3OTAiLCAgIC5kYXRhID0gJnI4YTc3OXhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxtc2lvZi1yOGE3NzkxIiwgICAuZGF0YSA9ICZyOGE3Nzl4X2RhdGEgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzaF9tc2lvZl9tYXRjaCk7CisKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX2luZm8gKnNoX21zaW9mX3NwaV9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNoX21zaW9mX3NwaV9pbmZvICppbmZvOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Ci0JdTMyIG51bV9jcyA9IDA7CisJdTMyIG51bV9jcyA9IDE7CiAKIAlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBzaF9tc2lvZl9zcGlfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykgewpAQCAtNjMzLDYgKzY2OSw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlCSpyOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CiAJc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwOwogCWludCBpOwogCWludCByZXQ7CkBAIC02NDYsMTAgKzY4MywxNSBAQAogCXAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShzaF9tc2lvZl9tYXRjaCwgJnBkZXYtPmRldik7CisJaWYgKG9mX2lkKSB7CisJCXAtPmNoaXBkYXRhID0gb2ZfaWQtPmRhdGE7CiAJCXAtPmluZm8gPSBzaF9tc2lvZl9zcGlfcGFyc2VfZHQoJnBkZXYtPmRldik7Ci0JZWxzZQorCX0gZWxzZSB7CisJCXAtPmNoaXBkYXRhID0gKGNvbnN0IHZvaWQgKilwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGE7CiAJCXAtPmluZm8gPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCX0KIAogCWlmICghcC0+aW5mbykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gb2J0YWluIGRldmljZSBpbmZvXG4iKTsKQEAgLTY4Nyw0OSArNzI5LDQwIEBACiAJCWdvdG8gZXJyMTsKIAl9CiAKLQlyZXQgPSBjbGtfcHJlcGFyZShwLT5jbGspOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBwcmVwYXJlIGNsb2NrXG4iKTsKLQkJZ290byBlcnIxOwotCX0KLQogCXAtPnBkZXYgPSBwZGV2OwogCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCi0JLyogVGhlIHN0YW5kYXJkIHZlcnNpb24gb2YgTVNJT0YgdXNlIDY0IHdvcmQgRklGT3MgKi8KLQlwLT50eF9maWZvX3NpemUgPSA2NDsKLQlwLT5yeF9maWZvX3NpemUgPSA2NDsKLQogCS8qIFBsYXRmb3JtIGRhdGEgbWF5IG92ZXJyaWRlIEZJRk8gc2l6ZXMgKi8KKwlwLT50eF9maWZvX3NpemUgPSBwLT5jaGlwZGF0YS0+dHhfZmlmb19zaXplOworCXAtPnJ4X2ZpZm9fc2l6ZSA9IHAtPmNoaXBkYXRhLT5yeF9maWZvX3NpemU7CiAJaWYgKHAtPmluZm8tPnR4X2ZpZm9fb3ZlcnJpZGUpCiAJCXAtPnR4X2ZpZm9fc2l6ZSA9IHAtPmluZm8tPnR4X2ZpZm9fb3ZlcnJpZGU7CiAJaWYgKHAtPmluZm8tPnJ4X2ZpZm9fb3ZlcnJpZGUpCiAJCXAtPnJ4X2ZpZm9fc2l6ZSA9IHAtPmluZm8tPnJ4X2ZpZm9fb3ZlcnJpZGU7CiAKLQkvKiBpbml0IG1hc3RlciBhbmQgYml0YmFuZyBjb2RlICovCisJLyogaW5pdCBtYXN0ZXIgY29kZSAqLwogCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwogCW1hc3Rlci0+bW9kZV9iaXRzIHw9IFNQSV9MU0JfRklSU1QgfCBTUElfM1dJUkU7Ci0JbWFzdGVyLT5mbGFncyA9IDA7CisJbWFzdGVyLT5mbGFncyA9IHAtPmNoaXBkYXRhLT5tYXN0ZXJfZmxhZ3M7CiAJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBwLT5pbmZvLT5udW1fY2hpcHNlbGVjdDsKLQltYXN0ZXItPnNldHVwID0gc3BpX2JpdGJhbmdfc2V0dXA7Ci0JbWFzdGVyLT5jbGVhbnVwID0gc3BpX2JpdGJhbmdfY2xlYW51cDsKKwltYXN0ZXItPnNldHVwID0gc2hfbXNpb2Zfc3BpX3NldHVwOworCW1hc3Rlci0+cHJlcGFyZV9tZXNzYWdlID0gc2hfbXNpb2ZfcHJlcGFyZV9tZXNzYWdlOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDgsIDMyKTsKKwltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBzaF9tc2lvZl90cmFuc2Zlcl9vbmU7CiAKLQlwLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKLQlwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzaF9tc2lvZl9zcGlfY2hpcHNlbGVjdDsKLQlwLT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gc2hfbXNpb2Zfc3BpX3NldHVwX3RyYW5zZmVyOwotCXAtPmJpdGJhbmcudHhyeF9idWZzID0gc2hfbXNpb2Zfc3BpX3R4cng7Ci0JcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBzaF9tc2lvZl9zcGlfdHhyeF93b3JkOwotCXAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc2hfbXNpb2Zfc3BpX3R4cnhfd29yZDsKLQlwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHNoX21zaW9mX3NwaV90eHJ4X3dvcmQ7Ci0JcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBzaF9tc2lvZl9zcGlfdHhyeF93b3JkOworCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNwaV9yZWdpc3Rlcl9tYXN0ZXIgZXJyb3IuXG4iKTsKKwkJZ290byBlcnIyOworCX0KIAotCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZwLT5iaXRiYW5nKTsKLQlpZiAocmV0ID09IDApCi0JCXJldHVybiAwOworCXJldHVybiAwOwogCisgZXJyMjoKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Ci0JY2xrX3VucHJlcGFyZShwLT5jbGspOwogIGVycjE6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIAlyZXR1cm4gcmV0OwpAQCAtNzM3LDMwICs3NzAsMjIgQEAKIAogc3RhdGljIGludCBzaF9tc2lvZl9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldDsKLQotCXJldCA9IHNwaV9iaXRiYW5nX3N0b3AoJnAtPmJpdGJhbmcpOwotCWlmICghcmV0KSB7Ci0JCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQkJY2xrX3VucHJlcGFyZShwLT5jbGspOwotCQlzcGlfbWFzdGVyX3B1dChwLT5iaXRiYW5nLm1hc3Rlcik7Ci0JfQotCXJldHVybiByZXQ7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaF9tc2lvZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaC1tc2lvZiIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNoLW1vYmlsZS1tc2lvZiIsIH0sCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzcGlfZHJpdmVyX2lkc1tdID0geworCXsgInNwaV9zaF9tc2lvZiIsCShrZXJuZWxfdWxvbmdfdCkmc2hfZGF0YSB9LAorCXsgInNwaV9yOGE3NzkwX21zaW9mIiwJKGtlcm5lbF91bG9uZ190KSZyOGE3Nzl4X2RhdGEgfSwKKwl7ICJzcGlfcjhhNzc5MV9tc2lvZiIsCShrZXJuZWxfdWxvbmdfdCkmcjhhNzc5eF9kYXRhIH0sCiAJe30sCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2hfbXNpb2ZfbWF0Y2gpOwotI2VuZGlmCitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBzcGlfZHJpdmVyX2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNoX21zaW9mX3NwaV9kcnYgPSB7CiAJLnByb2JlCQk9IHNoX21zaW9mX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IHNoX21zaW9mX3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gc3BpX2RyaXZlcl9pZHMsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCQk9ICJzcGlfc2hfbXNpb2YiLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2gtc2NpLmMgYi9kcml2ZXJzL3NwaS9zcGktc2gtc2NpLmMKaW5kZXggMzhlYjI0ZC4uOGI0NGI3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1zY2kuYwpAQCAtMTQsNyArMTQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpAQCAtMTA5LDcgKzEwOCw3IEBACiB7CiAJc3RydWN0IHNoX3NjaV9zcGkgKnNwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShkZXYtPm1hc3Rlcik7CiAKLQlpZiAoc3AtPmluZm8gJiYgc3AtPmluZm8tPmNoaXBfc2VsZWN0KQorCWlmIChzcC0+aW5mby0+Y2hpcF9zZWxlY3QpCiAJCShzcC0+aW5mby0+Y2hpcF9zZWxlY3QpKHNwLT5pbmZvLCBkZXYtPmNoaXBfc2VsZWN0LCB2YWx1ZSk7CiB9CiAKQEAgLTEzMSw2ICsxMzAsMTEgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgc3ApOwogCXNwLT5pbmZvID0gZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpOworCWlmICghc3AtPmluZm8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJwbGF0Zm9ybSBkYXRhIGlzIG1pc3NpbmdcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjE7CisJfQogCiAJLyogc2V0dXAgc3BpIGJpdGJhbmcgYWRhcHRvciAqLwogCXNwLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zaXJmLmMgYi9kcml2ZXJzL3NwaS9zcGktc2lyZi5jCmluZGV4IGU0MzA2ODkuLjFhNzdhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaXJmLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXNpcmYuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1kaXJlY3Rpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NpcmZzb2NfZG1hLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgInNpcmZzb2Nfc3BpIgogCkBAIC0xMzIsNiArMTMxLDggQEAKICNkZWZpbmUgSVNfRE1BX1ZBTElEKHgpICh4ICYmIEFMSUdORUQoeC0+dHhfYnVmKSAmJiBBTElHTkVEKHgtPnJ4X2J1ZikgJiYgXAogCUFMSUdORUQoeC0+bGVuKSAmJiAoeC0+bGVuIDwgMiAqIFBBR0VfU0laRSkpCiAKKyNkZWZpbmUgU0lSRlNPQ19NQVhfQ01EX0JZVEVTCTQKKwogc3RydWN0IHNpcmZzb2Nfc3BpIHsKIAlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKIAlzdHJ1Y3QgY29tcGxldGlvbiByeF9kb25lOwpAQCAtMTYyLDYgKzE2MywxMiBAQAogCXZvaWQgKmR1bW15cGFnZTsKIAlpbnQgd29yZF93aWR0aDsgLyogaW4gYnl0ZXMgKi8KIAorCS8qCisJICogaWYgdHggc2l6ZSBpcyBub3QgbW9yZSB0aGFuIDQgYW5kIHJ4IHNpemUgaXMgTlVMTCwgdXNlCisJICogY29tbWFuZCBtb2RlbAorCSAqLworCWJvb2wJdHhfYnlfY21kOworCiAJaW50IGNoaXBzZWxlY3RbMF07CiB9OwogCkBAIC0yNjAsNiArMjY3LDEyIEBACiAKIAl3cml0ZWwoc3BpX3N0YXQsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9JTlRfU1RBVFVTKTsKIAorCWlmIChzc3BpLT50eF9ieV9jbWQgJiYgKHNwaV9zdGF0ICYgU0lSRlNPQ19TUElfRlJNX0VORCkpIHsKKwkJY29tcGxldGUoJnNzcGktPnR4X2RvbmUpOworCQl3cml0ZWwoMHgwLCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfSU5UX0VOKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwogCS8qIEVycm9yIENvbmRpdGlvbnMgKi8KIAlpZiAoc3BpX3N0YXQgJiBTSVJGU09DX1NQSV9SWF9PRkxPVyB8fAogCQkJc3BpX3N0YXQgJiBTSVJGU09DX1NQSV9UWF9VRkxPVykgewpAQCAtMzEwLDYgKzMyMywzNCBAQAogCiAJd3JpdGVsKFNJUkZTT0NfU1BJX0lOVF9NQVNLX0FMTCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX0lOVF9TVEFUVVMpOwogCisJLyoKKwkgKiBmaWxsIHR4X2J1ZiBpbnRvIGNvbW1hbmQgcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIGl0cyBjb21wbGV0aW9uCisJICovCisJaWYgKHNzcGktPnR4X2J5X2NtZCkgeworCQl1MzIgY21kOworCQltZW1jcHkoJmNtZCwgc3NwaS0+dHgsIHQtPmxlbik7CisKKwkJaWYgKHNzcGktPndvcmRfd2lkdGggPT0gMSAmJiAhKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpKQorCQkJY21kID0gY3B1X3RvX2JlMzIoY21kKSA+PgorCQkJCSgoU0lSRlNPQ19NQVhfQ01EX0JZVEVTIC0gdC0+bGVuKSAqIDgpOworCQlpZiAoc3NwaS0+d29yZF93aWR0aCA9PSAyICYmIHQtPmxlbiA9PSA0ICYmCisJCQkJKCEoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkpKQorCQkJY21kID0gKChjbWQgJiAweGZmZmYpIDw8IDE2KSB8IChjbWQgPj4gMTYpOworCisJCXdyaXRlbChjbWQsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9DTUQpOworCQl3cml0ZWwoU0lSRlNPQ19TUElfRlJNX0VORF9JTlRfRU4sCisJCQlzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfSU5UX0VOKTsKKwkJd3JpdGVsKFNJUkZTT0NfU1BJX0NNRF9UWF9FTiwKKwkJCXNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9UWF9SWF9FTik7CisKKwkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc3NwaS0+dHhfZG9uZSwgdGltZW91dCkgPT0gMCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJ0cmFuc2ZlciB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0dXJuIHQtPmxlbjsKKwl9CisKIAlpZiAoc3NwaS0+bGVmdF90eF93b3JkID09IDEpIHsKIAkJd3JpdGVsKHJlYWRsKHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9DVFJMKSB8CiAJCQlTSVJGU09DX1NQSV9FTkFfQVVUT19DTFIsCkBAIC00NTksMTEgKzUwMCw2IEBACiAJCXJlZ3ZhbCB8PSBTSVJGU09DX1NQSV9UUkFOX0RBVF9GT1JNQVRfODsKIAkJc3NwaS0+cnhfd29yZCA9IHNwaV9zaXJmc29jX3J4X3dvcmRfdTg7CiAJCXNzcGktPnR4X3dvcmQgPSBzcGlfc2lyZnNvY190eF93b3JkX3U4OwotCQl0eGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKLQkJCQkJU0lSRlNPQ19TUElfRklGT19XSURUSF9CWVRFOwotCQlyeGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKLQkJCQkJU0lSRlNPQ19TUElfRklGT19XSURUSF9CWVRFOwotCQlzc3BpLT53b3JkX3dpZHRoID0gMTsKIAkJYnJlYWs7CiAJY2FzZSAxMjoKIAljYXNlIDE2OgpAQCAtNDcxLDI2ICs1MDcsMjIgQEAKIAkJCVNJUkZTT0NfU1BJX1RSQU5fREFUX0ZPUk1BVF8xNjsKIAkJc3NwaS0+cnhfd29yZCA9IHNwaV9zaXJmc29jX3J4X3dvcmRfdTE2OwogCQlzc3BpLT50eF93b3JkID0gc3BpX3NpcmZzb2NfdHhfd29yZF91MTY7Ci0JCXR4Zmlmb19jdHJsID0gU0lSRlNPQ19TUElfRklGT19USEQoU0lSRlNPQ19TUElfRklGT19TSVpFIC8gMikgfAotCQkJCQlTSVJGU09DX1NQSV9GSUZPX1dJRFRIX1dPUkQ7Ci0JCXJ4Zmlmb19jdHJsID0gU0lSRlNPQ19TUElfRklGT19USEQoU0lSRlNPQ19TUElfRklGT19TSVpFIC8gMikgfAotCQkJCQlTSVJGU09DX1NQSV9GSUZPX1dJRFRIX1dPUkQ7Ci0JCXNzcGktPndvcmRfd2lkdGggPSAyOwogCQlicmVhazsKIAljYXNlIDMyOgogCQlyZWd2YWwgfD0gU0lSRlNPQ19TUElfVFJBTl9EQVRfRk9STUFUXzMyOwogCQlzc3BpLT5yeF93b3JkID0gc3BpX3NpcmZzb2Nfcnhfd29yZF91MzI7CiAJCXNzcGktPnR4X3dvcmQgPSBzcGlfc2lyZnNvY190eF93b3JkX3UzMjsKLQkJdHhmaWZvX2N0cmwgPSBTSVJGU09DX1NQSV9GSUZPX1RIRChTSVJGU09DX1NQSV9GSUZPX1NJWkUgLyAyKSB8Ci0JCQkJCVNJUkZTT0NfU1BJX0ZJRk9fV0lEVEhfRFdPUkQ7Ci0JCXJ4Zmlmb19jdHJsID0gU0lSRlNPQ19TUElfRklGT19USEQoU0lSRlNPQ19TUElfRklGT19TSVpFIC8gMikgfAotCQkJCQlTSVJGU09DX1NQSV9GSUZPX1dJRFRIX0RXT1JEOwotCQlzc3BpLT53b3JkX3dpZHRoID0gNDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQogCisJc3NwaS0+d29yZF93aWR0aCA9IERJVl9ST1VORF9VUChiaXRzX3Blcl93b3JkLCA4KTsKKwl0eGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKKwkJCQkJICAgc3NwaS0+d29yZF93aWR0aDsKKwlyeGZpZm9fY3RybCA9IFNJUkZTT0NfU1BJX0ZJRk9fVEhEKFNJUkZTT0NfU1BJX0ZJRk9fU0laRSAvIDIpIHwKKwkJCQkJICAgc3NwaS0+d29yZF93aWR0aDsKKwogCWlmICghKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkKIAkJcmVndmFsIHw9IFNJUkZTT0NfU1BJX0NTX0lETEVfU1RBVDsKIAlpZiAoIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSkKQEAgLTUxOSw2ICs1NTEsMTQgQEAKIAl3cml0ZWwodHhmaWZvX2N0cmwsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9UWEZJRk9fQ1RSTCk7CiAJd3JpdGVsKHJ4Zmlmb19jdHJsLCBzc3BpLT5iYXNlICsgU0lSRlNPQ19TUElfUlhGSUZPX0NUUkwpOwogCisJaWYgKHQgJiYgdC0+dHhfYnVmICYmICF0LT5yeF9idWYgJiYgKHQtPmxlbiA8PSBTSVJGU09DX01BWF9DTURfQllURVMpKSB7CisJCXJlZ3ZhbCB8PSAoU0lSRlNPQ19TUElfQ01EX0JZVEVfTlVNKCh0LT5sZW4gLSAxKSkgfAorCQkJCVNJUkZTT0NfU1BJX0NNRF9NT0RFKTsKKwkJc3NwaS0+dHhfYnlfY21kID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlyZWd2YWwgJj0gflNJUkZTT0NfU1BJX0NNRF9NT0RFOworCQlzc3BpLT50eF9ieV9jbWQgPSBmYWxzZTsKKwl9CiAJd3JpdGVsKHJlZ3ZhbCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX0NUUkwpOwogCiAJaWYgKElTX0RNQV9WQUxJRCh0KSkgewpAQCAtNTQ4LDggKzU4OCw2IEBACiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9yZXM7CiAJaW50IG51bV9jcywgY3NfZ3BpbywgaXJxOwotCXUzMiByeF9kbWFfY2gsIHR4X2RtYV9jaDsKLQlkbWFfY2FwX21hc2tfdCBkbWFfY2FwX21hc2s7CiAJaW50IGk7CiAJaW50IHJldDsKIApAQCAtNTYwLDIwICs1OTgsNiBAQAogCQlnb3RvIGVycl9jczsKIAl9CiAKLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJzaXJmLHNwaS1kbWEtcngtY2hhbm5lbCIsICZyeF9kbWFfY2gpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgcnggZG1hIGNoYW5uZWxcbiIpOwotCQlnb3RvIGVycl9jczsKLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJzaXJmLHNwaS1kbWEtdHgtY2hhbm5lbCIsICZ0eF9kbWFfY2gpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgdHggZG1hIGNoYW5uZWxcbiIpOwotCQlnb3RvIGVycl9jczsKLQl9Ci0KIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqc3NwaSkgKyBzaXplb2YoaW50KSAqIG51bV9jcyk7CiAJaWYgKCFtYXN0ZXIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFNQSSBtYXN0ZXJcbiIpOwpAQCAtNjM3LDE4ICs2NjEsMTMgQEAKIAlzc3BpLT5iaXRiYW5nLm1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCS8qIHJlcXVlc3QgRE1BIGNoYW5uZWxzICovCi0JZG1hX2NhcF96ZXJvKGRtYV9jYXBfbWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX0lOVEVSTEVBVkUsIGRtYV9jYXBfbWFzayk7Ci0KLQlzc3BpLT5yeF9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChkbWFfY2FwX21hc2ssIChkbWFfZmlsdGVyX2ZuKXNpcmZzb2NfZG1hX2ZpbHRlcl9pZCwKLQkJKHZvaWQgKilyeF9kbWFfY2gpOworCXNzcGktPnJ4X2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKCZwZGV2LT5kZXYsICJyeCIpOwogCWlmICghc3NwaS0+cnhfY2hhbikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4gbm90IGFsbG9jYXRlIHJ4IGRtYSBjaGFubmVsXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBmcmVlX21hc3RlcjsKIAl9Ci0Jc3NwaS0+dHhfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX2NhcF9tYXNrLCAoZG1hX2ZpbHRlcl9mbilzaXJmc29jX2RtYV9maWx0ZXJfaWQsCi0JCSh2b2lkICopdHhfZG1hX2NoKTsKKwlzc3BpLT50eF9jaGFuID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbCgmcGRldi0+ZGV2LCAidHgiKTsKIAlpZiAoIXNzcGktPnR4X2NoYW4pIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBhbGxvY2F0ZSB0eCBkbWEgY2hhbm5lbFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CkBAIC03MjQsMTEgKzc0MywxNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHNwaV9zaXJmc29jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc2lyZnNvY19zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9tYXN0ZXJfc3VzcGVuZChtYXN0ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAljbGtfZGlzYWJsZShzc3BpLT5jbGspOwogCXJldHVybiAwOwpAQCAtNzQ1LDE1ICs3NjksMTMgQEAKIAl3cml0ZWwoU0lSRlNPQ19TUElfRklGT19TVEFSVCwgc3NwaS0+YmFzZSArIFNJUkZTT0NfU1BJX1JYRklGT19PUCk7CiAJd3JpdGVsKFNJUkZTT0NfU1BJX0ZJRk9fU1RBUlQsIHNzcGktPmJhc2UgKyBTSVJGU09DX1NQSV9UWEZJRk9fT1ApOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHNwaV9tYXN0ZXJfcmVzdW1lKG1hc3Rlcik7CiB9Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzcGlfc2lyZnNvY19wbV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBzcGlfc2lyZnNvY19zdXNwZW5kLAotCS5yZXN1bWUgPSBzcGlfc2lyZnNvY19yZXN1bWUsCi19OwogI2VuZGlmCiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzcGlfc2lyZnNvY19wbV9vcHMsIHNwaV9zaXJmc29jX3N1c3BlbmQsCisJCQkgc3BpX3NpcmZzb2NfcmVzdW1lKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3BpX3NpcmZzb2Nfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInNpcmYscHJpbWEyLXNwaSIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzaXJmLG1hcmNvLXNwaSIsIH0sCkBAIC03NjUsOSArNzg3LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IERSSVZFUl9OQU1FLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KIAkJLnBtICAgICA9ICZzcGlfc2lyZnNvY19wbV9vcHMsCi0jZW5kaWYKIAkJLm9mX21hdGNoX3RhYmxlID0gc3BpX3NpcmZzb2Nfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSBzcGlfc2lyZnNvY19wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zdW40aS5jIGIvZHJpdmVycy9zcGkvc3BpLXN1bjRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NmE4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zdW40aS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxNCBBbGx3aW5uZXIgVGVjaAorICogUGFuIE5hbiA8cGFubmFuQGFsbHdpbm5lcnRlY2guY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNYXhpbWUgUmlwYXJkCisgKiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjZGVmaW5lIFNVTjRJX0ZJRk9fREVQVEgJCTY0CisKKyNkZWZpbmUgU1VONElfUlhEQVRBX1JFRwkJMHgwMAorCisjZGVmaW5lIFNVTjRJX1RYREFUQV9SRUcJCTB4MDQKKworI2RlZmluZSBTVU40SV9DVExfUkVHCQkJMHgwOAorI2RlZmluZSBTVU40SV9DVExfRU5BQkxFCQkJQklUKDApCisjZGVmaW5lIFNVTjRJX0NUTF9NQVNURVIJCQlCSVQoMSkKKyNkZWZpbmUgU1VONElfQ1RMX0NQSEEJCQkJQklUKDIpCisjZGVmaW5lIFNVTjRJX0NUTF9DUE9MCQkJCUJJVCgzKQorI2RlZmluZSBTVU40SV9DVExfQ1NfQUNUSVZFX0xPVwkJCUJJVCg0KQorI2RlZmluZSBTVU40SV9DVExfTE1URgkJCQlCSVQoNikKKyNkZWZpbmUgU1VONElfQ1RMX1RGX1JTVAkJCUJJVCg4KQorI2RlZmluZSBTVU40SV9DVExfUkZfUlNUCQkJQklUKDkpCisjZGVmaW5lIFNVTjRJX0NUTF9YQ0gJCQkJQklUKDEwKQorI2RlZmluZSBTVU40SV9DVExfQ1NfTUFTSwkJCTB4MzAwMAorI2RlZmluZSBTVU40SV9DVExfQ1MoY3MpCQkJKCgoY3MpIDw8IDEyKSAmIFNVTjRJX0NUTF9DU19NQVNLKQorI2RlZmluZSBTVU40SV9DVExfREhCCQkJCUJJVCgxNSkKKyNkZWZpbmUgU1VONElfQ1RMX0NTX01BTlVBTAkJCUJJVCgxNikKKyNkZWZpbmUgU1VONElfQ1RMX0NTX0xFVkVMCQkJQklUKDE3KQorI2RlZmluZSBTVU40SV9DVExfVFAJCQkJQklUKDE4KQorCisjZGVmaW5lIFNVTjRJX0lOVF9DVExfUkVHCQkweDBjCisjZGVmaW5lIFNVTjRJX0lOVF9DVExfVEMJCQlCSVQoMTYpCisKKyNkZWZpbmUgU1VONElfSU5UX1NUQV9SRUcJCTB4MTAKKworI2RlZmluZSBTVU40SV9ETUFfQ1RMX1JFRwkJMHgxNAorCisjZGVmaW5lIFNVTjRJX1dBSVRfUkVHCQkJMHgxOAorCisjZGVmaW5lIFNVTjRJX0NMS19DVExfUkVHCQkweDFjCisjZGVmaW5lIFNVTjRJX0NMS19DVExfQ0RSMl9NQVNLCQkJMHhmZgorI2RlZmluZSBTVU40SV9DTEtfQ1RMX0NEUjIoZGl2KQkJCSgoZGl2KSAmIFNVTjRJX0NMS19DVExfQ0RSMl9NQVNLKQorI2RlZmluZSBTVU40SV9DTEtfQ1RMX0NEUjFfTUFTSwkJCTB4ZgorI2RlZmluZSBTVU40SV9DTEtfQ1RMX0NEUjEoZGl2KQkJCSgoKGRpdikgJiBTVU40SV9DTEtfQ1RMX0NEUjFfTUFTSykgPDwgOCkKKyNkZWZpbmUgU1VONElfQ0xLX0NUTF9EUlMJCQlCSVQoMTIpCisKKyNkZWZpbmUgU1VONElfQlVSU1RfQ05UX1JFRwkJMHgyMAorI2RlZmluZSBTVU40SV9CVVJTVF9DTlQoY250KQkJCSgoY250KSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIFNVTjRJX1hNSVRfQ05UX1JFRwkJMHgyNAorI2RlZmluZSBTVU40SV9YTUlUX0NOVChjbnQpCQkJKChjbnQpICYgMHhmZmZmZmYpCisKKyNkZWZpbmUgU1VONElfRklGT19TVEFfUkVHCQkweDI4CisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1JGX0NOVF9NQVNLCQkweDdmCisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1JGX0NOVF9CSVRTCQkwCisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1RGX0NOVF9NQVNLCQkweDdmCisjZGVmaW5lIFNVTjRJX0ZJRk9fU1RBX1RGX0NOVF9CSVRTCQkxNgorCitzdHJ1Y3Qgc3VuNGlfc3BpIHsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXZvaWQgX19pb21lbQkJKmJhc2VfYWRkcjsKKwlzdHJ1Y3QgY2xrCQkqaGNsazsKKwlzdHJ1Y3QgY2xrCQkqbWNsazsKKworCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CisKKwljb25zdCB1OAkJKnR4X2J1ZjsKKwl1OAkJCSpyeF9idWY7CisJaW50CQkJbGVuOworfTsKKworc3RhdGljIGlubGluZSB1MzIgc3VuNGlfc3BpX3JlYWQoc3RydWN0IHN1bjRpX3NwaSAqc3NwaSwgdTMyIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoc3NwaS0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjRpX3NwaV93cml0ZShzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpLCB1MzIgcmVnLCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCBzc3BpLT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VuNGlfc3BpX2RyYWluX2ZpZm8oc3RydWN0IHN1bjRpX3NwaSAqc3NwaSwgaW50IGxlbikKK3sKKwl1MzIgcmVnLCBjbnQ7CisJdTggYnl0ZTsKKworCS8qIFNlZSBob3cgbXVjaCBkYXRhIGlzIGF2YWlsYWJsZSAqLworCXJlZyA9IHN1bjRpX3NwaV9yZWFkKHNzcGksIFNVTjRJX0ZJRk9fU1RBX1JFRyk7CisJcmVnICY9IFNVTjRJX0ZJRk9fU1RBX1JGX0NOVF9NQVNLOworCWNudCA9IHJlZyA+PiBTVU40SV9GSUZPX1NUQV9SRl9DTlRfQklUUzsKKworCWlmIChsZW4gPiBjbnQpCisJCWxlbiA9IGNudDsKKworCXdoaWxlIChsZW4tLSkgeworCQlieXRlID0gcmVhZGIoc3NwaS0+YmFzZV9hZGRyICsgU1VONElfUlhEQVRBX1JFRyk7CisJCWlmIChzc3BpLT5yeF9idWYpCisJCQkqc3NwaS0+cnhfYnVmKysgPSBieXRlOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjRpX3NwaV9maWxsX2ZpZm8oc3RydWN0IHN1bjRpX3NwaSAqc3NwaSwgaW50IGxlbikKK3sKKwl1OCBieXRlOworCisJaWYgKGxlbiA+IHNzcGktPmxlbikKKwkJbGVuID0gc3NwaS0+bGVuOworCisJd2hpbGUgKGxlbi0tKSB7CisJCWJ5dGUgPSBzc3BpLT50eF9idWYgPyAqc3NwaS0+dHhfYnVmKysgOiAwOworCQl3cml0ZWIoYnl0ZSwgc3NwaS0+YmFzZV9hZGRyICsgU1VONElfVFhEQVRBX1JFRyk7CisJCXNzcGktPmxlbi0tOworCX0KK30KKworc3RhdGljIHZvaWQgc3VuNGlfc3BpX3NldF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTMyIHJlZzsKKworCXJlZyA9IHN1bjRpX3NwaV9yZWFkKHNzcGksIFNVTjRJX0NUTF9SRUcpOworCisJcmVnICY9IH5TVU40SV9DVExfQ1NfTUFTSzsKKwlyZWcgfD0gU1VONElfQ1RMX0NTKHNwaS0+Y2hpcF9zZWxlY3QpOworCisJaWYgKGVuYWJsZSkKKwkJcmVnIHw9IFNVTjRJX0NUTF9DU19MRVZFTDsKKwllbHNlCisJCXJlZyAmPSB+U1VONElfQ1RMX0NTX0xFVkVMOworCisJLyoKKwkgKiBFdmVuIHRob3VnaCB0aGlzIGxvb2tzIGlycmVsZXZhbnQgc2luY2Ugd2UgYXJlIHN1cHBvc2VkIHRvCisJICogYmUgY29udHJvbGxpbmcgdGhlIGNoaXAgc2VsZWN0IG1hbnVhbGx5LCB0aGlzIGJpdCBhbHNvCisJICogY29udHJvbHMgdGhlIGxldmVscyBvZiB0aGUgY2hpcCBzZWxlY3QgZm9yIGluYWN0aXZlCisJICogZGV2aWNlcy4KKwkgKgorCSAqIElmIHdlIGRvbid0IHNldCBpdCwgdGhlIGNoaXAgc2VsZWN0IGxldmVsIHdpbGwgZ28gbG93IGJ5CisJICogZGVmYXVsdCB3aGVuIHRoZSBkZXZpY2UgaXMgaWRsZSwgd2hpY2ggaXMgbm90IHJlYWxseQorCSAqIGV4cGVjdGVkIGluIHRoZSBjb21tb24gY2FzZSB3aGVyZSB0aGUgY2hpcCBzZWxlY3QgaXMgYWN0aXZlCisJICogbG93LgorCSAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkKKwkJcmVnICY9IH5TVU40SV9DVExfQ1NfQUNUSVZFX0xPVzsKKwllbHNlCisJCXJlZyB8PSBTVU40SV9DVExfQ1NfQUNUSVZFX0xPVzsKKworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9DVExfUkVHLCByZWcpOworfQorCitzdGF0aWMgaW50IHN1bjRpX3NwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIpCit7CisJc3RydWN0IHN1bjRpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgbWNsa19yYXRlLCBkaXYsIHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IHR4X2xlbiA9IDA7CisJaW50IHJldCA9IDA7CisJdTMyIHJlZzsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgdHJhbnNmZXIgbGFyZ2VyIHRoYW4gdGhlIEZJRk8gKi8KKwlpZiAodGZyLT5sZW4gPiBTVU40SV9GSUZPX0RFUFRIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZzc3BpLT5kb25lKTsKKwlzc3BpLT50eF9idWYgPSB0ZnItPnR4X2J1ZjsKKwlzc3BpLT5yeF9idWYgPSB0ZnItPnJ4X2J1ZjsKKwlzc3BpLT5sZW4gPSB0ZnItPmxlbjsKKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9JTlRfU1RBX1JFRywgfjApOworCisKKwlyZWcgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9DVExfUkVHKTsKKworCS8qIFJlc2V0IEZJRk9zICovCisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0NUTF9SRUcsCisJCQlyZWcgfCBTVU40SV9DVExfUkZfUlNUIHwgU1VONElfQ1RMX1RGX1JTVCk7CisKKwkvKgorCSAqIFNldHVwIHRoZSB0cmFuc2ZlciBjb250cm9sIHJlZ2lzdGVyOiBDaGlwIFNlbGVjdCwKKwkgKiBwb2xhcml0aWVzLCBldGMuCisJICovCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQlyZWcgfD0gU1VONElfQ1RMX0NQT0w7CisJZWxzZQorCQlyZWcgJj0gflNVTjRJX0NUTF9DUE9MOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlyZWcgfD0gU1VONElfQ1RMX0NQSEE7CisJZWxzZQorCQlyZWcgJj0gflNVTjRJX0NUTF9DUEhBOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpCisJCXJlZyB8PSBTVU40SV9DVExfTE1URjsKKwllbHNlCisJCXJlZyAmPSB+U1VONElfQ1RMX0xNVEY7CisKKworCS8qCisJICogSWYgaXQncyBhIFRYIG9ubHkgdHJhbnNmZXIsIHdlIGRvbid0IHdhbnQgdG8gZmlsbCB0aGUgUlgKKwkgKiBGSUZPIHdpdGggYm9ndXMgZGF0YQorCSAqLworCWlmIChzc3BpLT5yeF9idWYpCisJCXJlZyAmPSB+U1VONElfQ1RMX0RIQjsKKwllbHNlCisJCXJlZyB8PSBTVU40SV9DVExfREhCOworCisJLyogV2Ugd2FudCB0byBjb250cm9sIHRoZSBjaGlwIHNlbGVjdCBtYW51YWxseSAqLworCXJlZyB8PSBTVU40SV9DVExfQ1NfTUFOVUFMOworCisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX0NUTF9SRUcsIHJlZyk7CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgcGFyZW50IGNsb2NrIGZhc3QgZW5vdWdoICovCisJbWNsa19yYXRlID0gY2xrX2dldF9yYXRlKHNzcGktPm1jbGspOworCWlmIChtY2xrX3JhdGUgPCAoMiAqIHNwaS0+bWF4X3NwZWVkX2h6KSkgeworCQljbGtfc2V0X3JhdGUoc3NwaS0+bWNsaywgMiAqIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJbWNsa19yYXRlID0gY2xrX2dldF9yYXRlKHNzcGktPm1jbGspOworCX0KKworCS8qCisJICogU2V0dXAgY2xvY2sgZGl2aWRlci4KKwkgKgorCSAqIFdlIGhhdmUgdHdvIGNob2ljZXMgdGhlcmUuIEVpdGhlciB3ZSBjYW4gdXNlIHRoZSBjbG9jaworCSAqIGRpdmlkZSByYXRlIDEsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgdGhhbmtzIHRvIHRoaXMgZm9ybXVsYToKKwkgKiBTUElfQ0xLID0gTU9EX0NMSyAvICgyIF4gKGNkciArIDEpKQorCSAqIE9yIHdlIGNhbiB1c2UgQ0RSMiwgd2hpY2ggaXMgY2FsY3VsYXRlZCB3aXRoIHRoZSBmb3JtdWxhOgorCSAqIFNQSV9DTEsgPSBNT0RfQ0xLIC8gKDIgKiAoY2RyICsgMSkpCisJICogV2V0aGVyIHdlIHVzZSB0aGUgZm9ybWVyIG9yIHRoZSBsYXR0ZXIgaXMgc2V0IHRocm91Z2ggdGhlCisJICogRFJTIGJpdC4KKwkgKgorCSAqIEZpcnN0IHRyeSBDRFIyLCBhbmQgaWYgd2UgY2FuJ3QgcmVhY2ggdGhlIGV4cGVjdGVkCisJICogZnJlcXVlbmN5LCBmYWxsIGJhY2sgdG8gQ0RSMS4KKwkgKi8KKwlkaXYgPSBtY2xrX3JhdGUgLyAoMiAqIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwlpZiAoZGl2IDw9IChTVU40SV9DTEtfQ1RMX0NEUjJfTUFTSyArIDEpKSB7CisJCWlmIChkaXYgPiAwKQorCQkJZGl2LS07CisKKwkJcmVnID0gU1VONElfQ0xLX0NUTF9DRFIyKGRpdikgfCBTVU40SV9DTEtfQ1RMX0RSUzsKKwl9IGVsc2UgeworCQlkaXYgPSBpbG9nMihtY2xrX3JhdGUpIC0gaWxvZzIoc3BpLT5tYXhfc3BlZWRfaHopOworCQlyZWcgPSBTVU40SV9DTEtfQ1RMX0NEUjEoZGl2KTsKKwl9CisKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQ0xLX0NUTF9SRUcsIHJlZyk7CisKKwkvKiBTZXR1cCB0aGUgdHJhbnNmZXIgbm93Li4uICovCisJaWYgKHNzcGktPnR4X2J1ZikKKwkJdHhfbGVuID0gdGZyLT5sZW47CisKKwkvKiBTZXR1cCB0aGUgY291bnRlcnMgKi8KKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQlVSU1RfQ05UX1JFRywgU1VONElfQlVSU1RfQ05UKHRmci0+bGVuKSk7CisJc3VuNGlfc3BpX3dyaXRlKHNzcGksIFNVTjRJX1hNSVRfQ05UX1JFRywgU1VONElfWE1JVF9DTlQodHhfbGVuKSk7CisKKwkvKiBGaWxsIHRoZSBUWCBGSUZPICovCisJc3VuNGlfc3BpX2ZpbGxfZmlmbyhzc3BpLCBTVU40SV9GSUZPX0RFUFRIKTsKKworCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9JTlRfQ1RMX1JFRywgU1VONElfSU5UX0NUTF9UQyk7CisKKwkvKiBTdGFydCB0aGUgdHJhbnNmZXIgKi8KKwlyZWcgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9DVExfUkVHKTsKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQ1RMX1JFRywgcmVnIHwgU1VONElfQ1RMX1hDSCk7CisKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzc3BpLT5kb25lLAorCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwlpZiAoIXRpbWVvdXQpIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3VuNGlfc3BpX2RyYWluX2ZpZm8oc3NwaSwgU1VONElfRklGT19ERVBUSCk7CisKK291dDoKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfSU5UX0NUTF9SRUcsIDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHN1bjRpX3NwaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpID0gZGV2X2lkOworCXUzMiBzdGF0dXMgPSBzdW40aV9zcGlfcmVhZChzc3BpLCBTVU40SV9JTlRfU1RBX1JFRyk7CisKKwkvKiBUcmFuc2ZlciBjb21wbGV0ZSAqLworCWlmIChzdGF0dXMgJiBTVU40SV9JTlRfQ1RMX1RDKSB7CisJCXN1bjRpX3NwaV93cml0ZShzc3BpLCBTVU40SV9JTlRfU1RBX1JFRywgU1VONElfSU5UX0NUTF9UQyk7CisJCWNvbXBsZXRlKCZzc3BpLT5kb25lKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGludCBzdW40aV9zcGlfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3NwaS0+aGNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGVuYWJsZSBBSEIgY2xvY2tcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3NwaS0+bWNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGVuYWJsZSBtb2R1bGUgY2xvY2tcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlzdW40aV9zcGlfd3JpdGUoc3NwaSwgU1VONElfQ1RMX1JFRywKKwkJCVNVTjRJX0NUTF9FTkFCTEUgfCBTVU40SV9DVExfTUFTVEVSIHwgU1VONElfQ1RMX1RQKTsKKworCXJldHVybiAwOworCitlcnI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfc3BpX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzdW40aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3NwaS0+bWNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VuNGlfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgc3VuNGlfc3BpICpzc3BpOworCXN0cnVjdCByZXNvdXJjZQkqcmVzOworCWludCByZXQgPSAwLCBpcnE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3VuNGlfc3BpKSk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFNQSSBNYXN0ZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOworCXNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXNzcGktPmJhc2VfYWRkciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoc3NwaS0+YmFzZV9hZGRyKSkgeworCQlyZXQgPSBQVFJfRVJSKHNzcGktPmJhc2VfYWRkcik7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gc3BpIElSUSBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBzdW40aV9zcGlfaGFuZGxlciwKKwkJCSAgICAgICAwLCAic3VuNGktc3BpIiwgc3NwaSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVxdWVzdCBJUlFcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlzc3BpLT5tYXN0ZXIgPSBtYXN0ZXI7CisJbWFzdGVyLT5zZXRfY3MgPSBzdW40aV9zcGlfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc3VuNGlfc3BpX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MU0JfRklSU1Q7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKKworCXNzcGktPmhjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImFoYiIpOworCWlmIChJU19FUlIoc3NwaS0+aGNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgQUhCIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5oY2xrKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJc3NwaS0+bWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAibW9kIik7CisJaWYgKElTX0VSUihzc3BpLT5tY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWNxdWlyZSBtb2R1bGUgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHNzcGktPm1jbGspOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJnNzcGktPmRvbmUpOworCisJLyoKKwkgKiBUaGlzIHdha2UtdXAvc2h1dGRvd24gcGF0dGVybiBpcyB0byBiZSBhYmxlIHRvIGhhdmUgdGhlCisJICogZGV2aWNlIHdva2VuIHVwLCBldmVuIGlmIHJ1bnRpbWVfcG0gaXMgZGlzYWJsZWQKKwkgKi8KKwlyZXQgPSBzdW40aV9zcGlfcnVudGltZV9yZXN1bWUoJnBkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCByZXN1bWUgdGhlIGRldmljZVxuIik7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2lkbGUoJnBkZXYtPmRldik7CisKKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoJnBkZXYtPmRldiwgbWFzdGVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZWdpc3RlciBTUEkgbWFzdGVyXG4iKTsKKwkJZ290byBlcnJfcG1fZGlzYWJsZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3BtX2Rpc2FibGU6CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXN1bjRpX3NwaV9ydW50aW1lX3N1c3BlbmQoJnBkZXYtPmRldik7CitlcnJfZnJlZV9tYXN0ZXI6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1bjRpX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfc3BpX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXNwaSIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW40aV9zcGlfbWF0Y2gpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3VuNGlfc3BpX3BtX29wcyA9IHsKKwkucnVudGltZV9yZXN1bWUJCT0gc3VuNGlfc3BpX3J1bnRpbWVfcmVzdW1lLAorCS5ydW50aW1lX3N1c3BlbmQJPSBzdW40aV9zcGlfcnVudGltZV9zdXNwZW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3VuNGlfc3BpX2RyaXZlciA9IHsKKwkucHJvYmUJPSBzdW40aV9zcGlfcHJvYmUsCisJLnJlbW92ZQk9IHN1bjRpX3NwaV9yZW1vdmUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJCT0gInN1bjRpLXNwaSIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gc3VuNGlfc3BpX21hdGNoLAorCQkucG0JCT0gJnN1bjRpX3NwaV9wbV9vcHMsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN1bjRpX3NwaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJQYW4gTmFuIDxwYW5uYW5AYWxsd2lubmVydGVjaC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWxsd2lubmVyIEExWC9BMjAgU1BJIGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc3VuNmkuYyBiL2RyaXZlcnMvc3BpL3NwaS1zdW42aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTM0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktc3VuNmkuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTQgQWxsd2lubmVyIFRlY2gKKyAqIFBhbiBOYW4gPHBhbm5hbkBhbGx3aW5uZXJ0ZWNoLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTWF4aW1lIFJpcGFyZAorICogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjZGVmaW5lIFNVTjZJX0ZJRk9fREVQVEgJCTEyOAorCisjZGVmaW5lIFNVTjZJX0dCTF9DVExfUkVHCQkweDA0CisjZGVmaW5lIFNVTjZJX0dCTF9DVExfQlVTX0VOQUJMRQkJQklUKDApCisjZGVmaW5lIFNVTjZJX0dCTF9DVExfTUFTVEVSCQkJQklUKDEpCisjZGVmaW5lIFNVTjZJX0dCTF9DVExfVFAJCQlCSVQoNykKKyNkZWZpbmUgU1VONklfR0JMX0NUTF9SU1QJCQlCSVQoMzEpCisKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9SRUcJCTB4MDgKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DUEhBCQkJQklUKDApCisjZGVmaW5lIFNVTjZJX1RGUl9DVExfQ1BPTAkJCUJJVCgxKQorI2RlZmluZSBTVU42SV9URlJfQ1RMX1NQT0wJCQlCSVQoMikKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DU19NQVNLCQkJMHgzMAorI2RlZmluZSBTVU42SV9URlJfQ1RMX0NTKGNzKQkJCSgoKGNzKSA8PCA0KSAmIFNVTjZJX1RGUl9DVExfQ1NfTUFTSykKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DU19NQU5VQUwJCQlCSVQoNikKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9DU19MRVZFTAkJCUJJVCg3KQorI2RlZmluZSBTVU42SV9URlJfQ1RMX0RIQgkJCUJJVCg4KQorI2RlZmluZSBTVU42SV9URlJfQ1RMX0ZCUwkJCUJJVCgxMikKKyNkZWZpbmUgU1VONklfVEZSX0NUTF9YQ0gJCQlCSVQoMzEpCisKKyNkZWZpbmUgU1VONklfSU5UX0NUTF9SRUcJCTB4MTAKKyNkZWZpbmUgU1VONklfSU5UX0NUTF9SRl9PVkYJCQlCSVQoOCkKKyNkZWZpbmUgU1VONklfSU5UX0NUTF9UQwkJCUJJVCgxMikKKworI2RlZmluZSBTVU42SV9JTlRfU1RBX1JFRwkJMHgxNAorCisjZGVmaW5lIFNVTjZJX0ZJRk9fQ1RMX1JFRwkJMHgxOAorI2RlZmluZSBTVU42SV9GSUZPX0NUTF9SRl9SU1QJCQlCSVQoMTUpCisjZGVmaW5lIFNVTjZJX0ZJRk9fQ1RMX1RGX1JTVAkJCUJJVCgzMSkKKworI2RlZmluZSBTVU42SV9GSUZPX1NUQV9SRUcJCTB4MWMKKyNkZWZpbmUgU1VONklfRklGT19TVEFfUkZfQ05UX01BU0sJCTB4N2YKKyNkZWZpbmUgU1VONklfRklGT19TVEFfUkZfQ05UX0JJVFMJCTAKKyNkZWZpbmUgU1VONklfRklGT19TVEFfVEZfQ05UX01BU0sJCTB4N2YKKyNkZWZpbmUgU1VONklfRklGT19TVEFfVEZfQ05UX0JJVFMJCTE2CisKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9SRUcJCTB4MjQKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9DRFIyX01BU0sJCQkweGZmCisjZGVmaW5lIFNVTjZJX0NMS19DVExfQ0RSMihkaXYpCQkJKCgoZGl2KSAmIFNVTjZJX0NMS19DVExfQ0RSMl9NQVNLKSA8PCAwKQorI2RlZmluZSBTVU42SV9DTEtfQ1RMX0NEUjFfTUFTSwkJCTB4ZgorI2RlZmluZSBTVU42SV9DTEtfQ1RMX0NEUjEoZGl2KQkJCSgoKGRpdikgJiBTVU42SV9DTEtfQ1RMX0NEUjFfTUFTSykgPDwgOCkKKyNkZWZpbmUgU1VONklfQ0xLX0NUTF9EUlMJCQlCSVQoMTIpCisKKyNkZWZpbmUgU1VONklfQlVSU1RfQ05UX1JFRwkJMHgzMAorI2RlZmluZSBTVU42SV9CVVJTVF9DTlQoY250KQkJCSgoY250KSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIFNVTjZJX1hNSVRfQ05UX1JFRwkJMHgzNAorI2RlZmluZSBTVU42SV9YTUlUX0NOVChjbnQpCQkJKChjbnQpICYgMHhmZmZmZmYpCisKKyNkZWZpbmUgU1VONklfQlVSU1RfQ1RMX0NOVF9SRUcJCTB4MzgKKyNkZWZpbmUgU1VONklfQlVSU1RfQ1RMX0NOVF9TVEMoY250KQkJKChjbnQpICYgMHhmZmZmZmYpCisKKyNkZWZpbmUgU1VONklfVFhEQVRBX1JFRwkJMHgyMDAKKyNkZWZpbmUgU1VONklfUlhEQVRBX1JFRwkJMHgzMDAKKworc3RydWN0IHN1bjZpX3NwaSB7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwl2b2lkIF9faW9tZW0JCSpiYXNlX2FkZHI7CisJc3RydWN0IGNsawkJKmhjbGs7CisJc3RydWN0IGNsawkJKm1jbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wJKnJzdGM7CisKKwlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCisJY29uc3QgdTgJCSp0eF9idWY7CisJdTgJCQkqcnhfYnVmOworCWludAkJCWxlbjsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIHN1bjZpX3NwaV9yZWFkKHN0cnVjdCBzdW42aV9zcGkgKnNzcGksIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKHNzcGktPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW42aV9zcGlfd3JpdGUoc3RydWN0IHN1bjZpX3NwaSAqc3NwaSwgdTMyIHJlZywgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgc3NwaS0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjZpX3NwaV9kcmFpbl9maWZvKHN0cnVjdCBzdW42aV9zcGkgKnNzcGksIGludCBsZW4pCit7CisJdTMyIHJlZywgY250OworCXU4IGJ5dGU7CisKKwkvKiBTZWUgaG93IG11Y2ggZGF0YSBpcyBhdmFpbGFibGUgKi8KKwlyZWcgPSBzdW42aV9zcGlfcmVhZChzc3BpLCBTVU42SV9GSUZPX1NUQV9SRUcpOworCXJlZyAmPSBTVU42SV9GSUZPX1NUQV9SRl9DTlRfTUFTSzsKKwljbnQgPSByZWcgPj4gU1VONklfRklGT19TVEFfUkZfQ05UX0JJVFM7CisKKwlpZiAobGVuID4gY250KQorCQlsZW4gPSBjbnQ7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJYnl0ZSA9IHJlYWRiKHNzcGktPmJhc2VfYWRkciArIFNVTjZJX1JYREFUQV9SRUcpOworCQlpZiAoc3NwaS0+cnhfYnVmKQorCQkJKnNzcGktPnJ4X2J1ZisrID0gYnl0ZTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW42aV9zcGlfZmlsbF9maWZvKHN0cnVjdCBzdW42aV9zcGkgKnNzcGksIGludCBsZW4pCit7CisJdTggYnl0ZTsKKworCWlmIChsZW4gPiBzc3BpLT5sZW4pCisJCWxlbiA9IHNzcGktPmxlbjsKKworCXdoaWxlIChsZW4tLSkgeworCQlieXRlID0gc3NwaS0+dHhfYnVmID8gKnNzcGktPnR4X2J1ZisrIDogMDsKKwkJd3JpdGViKGJ5dGUsIHNzcGktPmJhc2VfYWRkciArIFNVTjZJX1RYREFUQV9SRUcpOworCQlzc3BpLT5sZW4tLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN1bjZpX3NwaV9zZXRfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXUzMiByZWc7CisKKwlyZWcgPSBzdW42aV9zcGlfcmVhZChzc3BpLCBTVU42SV9URlJfQ1RMX1JFRyk7CisJcmVnICY9IH5TVU42SV9URlJfQ1RMX0NTX01BU0s7CisJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1Moc3BpLT5jaGlwX3NlbGVjdCk7CisKKwlpZiAoZW5hYmxlKQorCQlyZWcgfD0gU1VONklfVEZSX0NUTF9DU19MRVZFTDsKKwllbHNlCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9DU19MRVZFTDsKKworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9URlJfQ1RMX1JFRywgcmVnKTsKK30KKworCitzdGF0aWMgaW50IHN1bjZpX3NwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIpCit7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgbWNsa19yYXRlLCBkaXYsIHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IHR4X2xlbiA9IDA7CisJaW50IHJldCA9IDA7CisJdTMyIHJlZzsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgdHJhbnNmZXIgbGFyZ2VyIHRoYW4gdGhlIEZJRk8gKi8KKwlpZiAodGZyLT5sZW4gPiBTVU42SV9GSUZPX0RFUFRIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZzc3BpLT5kb25lKTsKKwlzc3BpLT50eF9idWYgPSB0ZnItPnR4X2J1ZjsKKwlzc3BpLT5yeF9idWYgPSB0ZnItPnJ4X2J1ZjsKKwlzc3BpLT5sZW4gPSB0ZnItPmxlbjsKKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9JTlRfU1RBX1JFRywgfjApOworCisJLyogUmVzZXQgRklGTyAqLworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9GSUZPX0NUTF9SRUcsCisJCQlTVU42SV9GSUZPX0NUTF9SRl9SU1QgfCBTVU42SV9GSUZPX0NUTF9URl9SU1QpOworCisJLyoKKwkgKiBTZXR1cCB0aGUgdHJhbnNmZXIgY29udHJvbCByZWdpc3RlcjogQ2hpcCBTZWxlY3QsCisJICogcG9sYXJpdGllcywgZXRjLgorCSAqLworCXJlZyA9IHN1bjZpX3NwaV9yZWFkKHNzcGksIFNVTjZJX1RGUl9DVExfUkVHKTsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1BPTDsKKwllbHNlCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9DUE9MOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlyZWcgfD0gU1VONklfVEZSX0NUTF9DUEhBOworCWVsc2UKKwkJcmVnICY9IH5TVU42SV9URlJfQ1RMX0NQSEE7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkKKwkJcmVnIHw9IFNVTjZJX1RGUl9DVExfRkJTOworCWVsc2UKKwkJcmVnICY9IH5TVU42SV9URlJfQ1RMX0ZCUzsKKworCS8qCisJICogSWYgaXQncyBhIFRYIG9ubHkgdHJhbnNmZXIsIHdlIGRvbid0IHdhbnQgdG8gZmlsbCB0aGUgUlgKKwkgKiBGSUZPIHdpdGggYm9ndXMgZGF0YQorCSAqLworCWlmIChzc3BpLT5yeF9idWYpCisJCXJlZyAmPSB+U1VONklfVEZSX0NUTF9ESEI7CisJZWxzZQorCQlyZWcgfD0gU1VONklfVEZSX0NUTF9ESEI7CisKKwkvKiBXZSB3YW50IHRvIGNvbnRyb2wgdGhlIGNoaXAgc2VsZWN0IG1hbnVhbGx5ICovCisJcmVnIHw9IFNVTjZJX1RGUl9DVExfQ1NfTUFOVUFMOworCisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX1RGUl9DVExfUkVHLCByZWcpOworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHBhcmVudCBjbG9jayBmYXN0IGVub3VnaCAqLworCW1jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShzc3BpLT5tY2xrKTsKKwlpZiAobWNsa19yYXRlIDwgKDIgKiBzcGktPm1heF9zcGVlZF9oeikpIHsKKwkJY2xrX3NldF9yYXRlKHNzcGktPm1jbGssIDIgKiBzcGktPm1heF9zcGVlZF9oeik7CisJCW1jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShzc3BpLT5tY2xrKTsKKwl9CisKKwkvKgorCSAqIFNldHVwIGNsb2NrIGRpdmlkZXIuCisJICoKKwkgKiBXZSBoYXZlIHR3byBjaG9pY2VzIHRoZXJlLiBFaXRoZXIgd2UgY2FuIHVzZSB0aGUgY2xvY2sKKwkgKiBkaXZpZGUgcmF0ZSAxLCB3aGljaCBpcyBjYWxjdWxhdGVkIHRoYW5rcyB0byB0aGlzIGZvcm11bGE6CisJICogU1BJX0NMSyA9IE1PRF9DTEsgLyAoMiBeIGNkcikKKwkgKiBPciB3ZSBjYW4gdXNlIENEUjIsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgd2l0aCB0aGUgZm9ybXVsYToKKwkgKiBTUElfQ0xLID0gTU9EX0NMSyAvICgyICogKGNkciArIDEpKQorCSAqIFdldGhlciB3ZSB1c2UgdGhlIGZvcm1lciBvciB0aGUgbGF0dGVyIGlzIHNldCB0aHJvdWdoIHRoZQorCSAqIERSUyBiaXQuCisJICoKKwkgKiBGaXJzdCB0cnkgQ0RSMiwgYW5kIGlmIHdlIGNhbid0IHJlYWNoIHRoZSBleHBlY3RlZAorCSAqIGZyZXF1ZW5jeSwgZmFsbCBiYWNrIHRvIENEUjEuCisJICovCisJZGl2ID0gbWNsa19yYXRlIC8gKDIgKiBzcGktPm1heF9zcGVlZF9oeik7CisJaWYgKGRpdiA8PSAoU1VONklfQ0xLX0NUTF9DRFIyX01BU0sgKyAxKSkgeworCQlpZiAoZGl2ID4gMCkKKwkJCWRpdi0tOworCisJCXJlZyA9IFNVTjZJX0NMS19DVExfQ0RSMihkaXYpIHwgU1VONklfQ0xLX0NUTF9EUlM7CisJfSBlbHNlIHsKKwkJZGl2ID0gaWxvZzIobWNsa19yYXRlKSAtIGlsb2cyKHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJcmVnID0gU1VONklfQ0xLX0NUTF9DRFIxKGRpdik7CisJfQorCisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0NMS19DVExfUkVHLCByZWcpOworCisJLyogU2V0dXAgdGhlIHRyYW5zZmVyIG5vdy4uLiAqLworCWlmIChzc3BpLT50eF9idWYpCisJCXR4X2xlbiA9IHRmci0+bGVuOworCisJLyogU2V0dXAgdGhlIGNvdW50ZXJzICovCisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0JVUlNUX0NOVF9SRUcsIFNVTjZJX0JVUlNUX0NOVCh0ZnItPmxlbikpOworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9YTUlUX0NOVF9SRUcsIFNVTjZJX1hNSVRfQ05UKHR4X2xlbikpOworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9CVVJTVF9DVExfQ05UX1JFRywKKwkJCVNVTjZJX0JVUlNUX0NUTF9DTlRfU1RDKHR4X2xlbikpOworCisJLyogRmlsbCB0aGUgVFggRklGTyAqLworCXN1bjZpX3NwaV9maWxsX2ZpZm8oc3NwaSwgU1VONklfRklGT19ERVBUSCk7CisKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdHMgKi8KKwlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfSU5UX0NUTF9SRUcsIFNVTjZJX0lOVF9DVExfVEMpOworCisJLyogU3RhcnQgdGhlIHRyYW5zZmVyICovCisJcmVnID0gc3VuNmlfc3BpX3JlYWQoc3NwaSwgU1VONklfVEZSX0NUTF9SRUcpOworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9URlJfQ1RMX1JFRywgcmVnIHwgU1VONklfVEZSX0NUTF9YQ0gpOworCisJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc3NwaS0+ZG9uZSwKKwkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJaWYgKCF0aW1lb3V0KSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCXN1bjZpX3NwaV9kcmFpbl9maWZvKHNzcGksIFNVTjZJX0ZJRk9fREVQVEgpOworCitvdXQ6CisJc3VuNmlfc3BpX3dyaXRlKHNzcGksIFNVTjZJX0lOVF9DVExfUkVHLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdW42aV9zcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IGRldl9pZDsKKwl1MzIgc3RhdHVzID0gc3VuNmlfc3BpX3JlYWQoc3NwaSwgU1VONklfSU5UX1NUQV9SRUcpOworCisJLyogVHJhbnNmZXIgY29tcGxldGUgKi8KKwlpZiAoc3RhdHVzICYgU1VONklfSU5UX0NUTF9UQykgeworCQlzdW42aV9zcGlfd3JpdGUoc3NwaSwgU1VONklfSU5UX1NUQV9SRUcsIFNVTjZJX0lOVF9DVExfVEMpOworCQljb21wbGV0ZSgmc3NwaS0+ZG9uZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgc3VuNmlfc3BpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHN1bjZpX3NwaSAqc3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNzcGktPmhjbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBlbmFibGUgQUhCIGNsb2NrXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNzcGktPm1jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBlbmFibGUgbW9kdWxlIGNsb2NrXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChzc3BpLT5yc3RjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgZGVhc3NlcnQgdGhlIGRldmljZSBmcm9tIHJlc2V0XG4iKTsKKwkJZ290byBlcnIyOworCX0KKworCXN1bjZpX3NwaV93cml0ZShzc3BpLCBTVU42SV9HQkxfQ1RMX1JFRywKKwkJCVNVTjZJX0dCTF9DVExfQlVTX0VOQUJMRSB8IFNVTjZJX0dCTF9DVExfTUFTVEVSIHwgU1VONklfR0JMX0NUTF9UUCk7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3NwaS0+bWNsayk7CitlcnI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuNmlfc3BpX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzdW42aV9zcGkgKnNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXNldF9jb250cm9sX2Fzc2VydChzc3BpLT5yc3RjKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3NwaS0+bWNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNzcGktPmhjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VuNmlfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgc3VuNmlfc3BpICpzc3BpOworCXN0cnVjdCByZXNvdXJjZQkqcmVzOworCWludCByZXQgPSAwLCBpcnE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3VuNmlfc3BpKSk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFNQSSBNYXN0ZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOworCXNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXNzcGktPmJhc2VfYWRkciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoc3NwaS0+YmFzZV9hZGRyKSkgeworCQlyZXQgPSBQVFJfRVJSKHNzcGktPmJhc2VfYWRkcik7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gc3BpIElSUSBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBzdW42aV9zcGlfaGFuZGxlciwKKwkJCSAgICAgICAwLCAic3VuNmktc3BpIiwgc3NwaSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVxdWVzdCBJUlFcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlzc3BpLT5tYXN0ZXIgPSBtYXN0ZXI7CisJbWFzdGVyLT5zZXRfY3MgPSBzdW42aV9zcGlfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc3VuNmlfc3BpX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MU0JfRklSU1Q7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soOCk7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKKworCXNzcGktPmhjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImFoYiIpOworCWlmIChJU19FUlIoc3NwaS0+aGNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgQUhCIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzc3BpLT5oY2xrKTsKKwkJZ290byBlcnJfZnJlZV9tYXN0ZXI7CisJfQorCisJc3NwaS0+bWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAibW9kIik7CisJaWYgKElTX0VSUihzc3BpLT5tY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWNxdWlyZSBtb2R1bGUgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHNzcGktPm1jbGspOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJnNzcGktPmRvbmUpOworCisJc3NwaS0+cnN0YyA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihzc3BpLT5yc3RjKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBnZXQgcmVzZXQgY29udHJvbGxlclxuIik7CisJCXJldCA9IFBUUl9FUlIoc3NwaS0+cnN0Yyk7CisJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOworCX0KKworCS8qCisJICogVGhpcyB3YWtlLXVwL3NodXRkb3duIHBhdHRlcm4gaXMgdG8gYmUgYWJsZSB0byBoYXZlIHRoZQorCSAqIGRldmljZSB3b2tlbiB1cCwgZXZlbiBpZiBydW50aW1lX3BtIGlzIGRpc2FibGVkCisJICovCisJcmV0ID0gc3VuNmlfc3BpX3J1bnRpbWVfcmVzdW1lKCZwZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVzdW1lIHRoZSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9pZGxlKCZwZGV2LT5kZXYpOworCisJcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7CisJCWdvdG8gZXJyX3BtX2Rpc2FibGU7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9wbV9kaXNhYmxlOgorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlzdW42aV9zcGlfcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworZXJyX2ZyZWVfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdW42aV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjZpX3NwaV9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1zcGkiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNmlfc3BpX21hdGNoKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN1bjZpX3NwaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfcmVzdW1lCQk9IHN1bjZpX3NwaV9ydW50aW1lX3Jlc3VtZSwKKwkucnVudGltZV9zdXNwZW5kCT0gc3VuNmlfc3BpX3J1bnRpbWVfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjZpX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCT0gc3VuNmlfc3BpX3Byb2JlLAorCS5yZW1vdmUJPSBzdW42aV9zcGlfcmVtb3ZlLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCQk9ICJzdW42aS1zcGkiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZQk9IHN1bjZpX3NwaV9tYXRjaCwKKwkJLnBtCQk9ICZzdW42aV9zcGlfcG1fb3BzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW42aV9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUGFuIE5hbiA8cGFubmFuQGFsbHdpbm5lcnRlY2guY29tPiIpOworTU9EVUxFX0FVVEhPUigiTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFsbHdpbm5lciBBMzEgU1BJIGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdGVncmExMTQuYyBiL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTExNC5jCmluZGV4IDQxM2M3MTguLjQwMDY0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTExNC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTExNC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNzIsNyArMTcxLDYgQEAKIAl2b2lkIF9faW9tZW0JCQkJKmJhc2U7CiAJcGh5c19hZGRyX3QJCQkJcGh5czsKIAl1bnNpZ25lZAkJCQlpcnE7Ci0JdTMyCQkJCQlzcGlfbWF4X2ZyZXF1ZW5jeTsKIAl1MzIJCQkJCWN1cl9zcGVlZDsKIAogCXN0cnVjdCBzcGlfZGV2aWNlCQkJKmN1cl9zcGk7CkBAIC03NjEsMTEgKzc1OSw2IEBACiAJCXNwaS0+bW9kZSAmIFNQSV9DUEhBID8gIiIgOiAifiIsCiAJCXNwaS0+bWF4X3NwZWVkX2h6KTsKIAotCUJVR19PTihzcGktPmNoaXBfc2VsZWN0ID49IE1BWF9DSElQX1NFTEVDVCk7Ci0KLQkvKiBTZXQgc3BlZWQgdG8gdGhlIHNwaSBtYXggZmVxdWVuY3kgaWYgc3BpIGRldmljZSBoYXMgbm90IHNldCAqLwotCXNwaS0+bWF4X3NwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHogPyA6IHRzcGktPnNwaV9tYXhfZnJlcXVlbmN5OwotCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyh0c3BpLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIodHNwaS0+ZGV2LCAicG0gcnVudGltZSBmYWlsZWQsIGUgPSAlZFxuIiwgcmV0KTsKQEAgLTg1Myw4ICs4NDYsOCBAQAogCQkJCQlTUElfQ09NTUFORDEpOwogCQkJdGVncmFfc3BpX3RyYW5zZmVyX2RlbGF5KHhmZXItPmRlbGF5X3VzZWNzKTsKIAkJCWdvdG8gZXhpdDsKLQkJfSBlbHNlIGlmIChtc2ctPnRyYW5zZmVycy5wcmV2ID09ICZ4ZmVyLT50cmFuc2Zlcl9saXN0KSB7Ci0JCQkvKiBUaGlzIGlzIHRoZSBsYXN0IHRyYW5zZmVyIGluIG1lc3NhZ2UgKi8KKwkJfSBlbHNlIGlmIChsaXN0X2lzX2xhc3QoJnhmZXItPnRyYW5zZmVyX2xpc3QsCisJCQkJCSZtc2ctPnRyYW5zZmVycykpIHsKIAkJCWlmICh4ZmVyLT5jc19jaGFuZ2UpCiAJCQkJdHNwaS0+Y3NfY29udHJvbCA9IHNwaTsKIAkJCWVsc2UgewpAQCAtMTAxOSwxNiArMTAxMiw2IEBACiAJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKIH0KIAotc3RhdGljIHZvaWQgdGVncmFfc3BpX3BhcnNlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0Jc3RydWN0IHRlZ3JhX3NwaV9kYXRhICp0c3BpKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNwaS1tYXgtZnJlcXVlbmN5IiwKLQkJCQkmdHNwaS0+c3BpX21heF9mcmVxdWVuY3kpKQotCQl0c3BpLT5zcGlfbWF4X2ZyZXF1ZW5jeSA9IDI1MDAwMDAwOyAvKiAyNU1IeiAqLwotfQotCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB0ZWdyYV9zcGlfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTExNC1zcGkiLCB9LAogCXt9CkBAIC0xMDUwLDE1ICsxMDMzLDE1IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIAl0c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCi0JLyogUGFyc2UgRFQgKi8KLQl0ZWdyYV9zcGlfcGFyc2VfZHQocGRldiwgdHNwaSk7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAic3BpLW1heC1mcmVxdWVuY3kiLAorCQkJCSAmbWFzdGVyLT5tYXhfc3BlZWRfaHopKQorCQltYXN0ZXItPm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwOyAvKiAyNU1IeiAqLwogCiAJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CiAJbWFzdGVyLT5zZXR1cCA9IHRlZ3JhX3NwaV9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gdGVncmFfc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBNQVhfQ0hJUF9TRUxFQ1Q7Ci0JbWFzdGVyLT5idXNfbnVtID0gLTE7CiAJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOwogCiAJdHNwaS0+bWFzdGVyID0gbWFzdGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2ZsYXNoLmMgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zZmxhc2guYwppbmRleCAwODc5NDk3Li40Nzg2OWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zZmxhc2guYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zZmxhc2guYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTIxLDcgKzEyMCw2IEBACiAJc3RydWN0IHJlc2V0X2NvbnRyb2wJCQkqcnN0OwogCXZvaWQgX19pb21lbQkJCQkqYmFzZTsKIAl1bnNpZ25lZAkJCQlpcnE7Ci0JdTMyCQkJCQlzcGlfbWF4X2ZyZXF1ZW5jeTsKIAl1MzIJCQkJCWN1cl9zcGVlZDsKIAogCXN0cnVjdCBzcGlfZGV2aWNlCQkJKmN1cl9zcGk7CkBAIC0zMTUsMTUgKzMxMyw2IEBACiAJcmV0dXJuIHRlZ3JhX3NmbGFzaF9zdGFydF9jcHVfYmFzZWRfdHJhbnNmZXIodHNkLCB0KTsKIH0KIAotc3RhdGljIGludCB0ZWdyYV9zZmxhc2hfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgdGVncmFfc2ZsYXNoX2RhdGEgKnRzZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JLyogU2V0IHNwZWVkIHRvIHRoZSBzcGkgbWF4IGZlcXVlbmN5IGlmIHNwaSBkZXZpY2UgaGFzIG5vdCBzZXQgKi8KLQlzcGktPm1heF9zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6ID8gOiB0c2QtPnNwaV9tYXhfZnJlcXVlbmN5OwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHRlZ3JhX3NmbGFzaF90cmFuc2Zlcl9vbmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAogCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CkBAIC00MzAsMTUgKzQxOSw2IEBACiAJcmV0dXJuIGhhbmRsZV9jcHVfYmFzZWRfeGZlcih0c2QpOwogfQogCi1zdGF0aWMgdm9pZCB0ZWdyYV9zZmxhc2hfcGFyc2VfZHQoc3RydWN0IHRlZ3JhX3NmbGFzaF9kYXRhICp0c2QpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHRzZC0+ZGV2LT5vZl9ub2RlOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3BpLW1heC1mcmVxdWVuY3kiLAotCQkJCQkmdHNkLT5zcGlfbWF4X2ZyZXF1ZW5jeSkpCi0JCXRzZC0+c3BpX21heF9mcmVxdWVuY3kgPSAyNTAwMDAwMDsgLyogMjVNSHogKi8KLX0KLQogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfc2ZsYXNoX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZmxhc2giLCB9LAogCXt9CkBAIC00NjcsMTEgKzQ0Nyw5IEBACiAKIAkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEE7Ci0JbWFzdGVyLT5zZXR1cCA9IHRlZ3JhX3NmbGFzaF9zZXR1cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gdGVncmFfc2ZsYXNoX3RyYW5zZmVyX29uZV9tZXNzYWdlOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gTUFYX0NISVBfU0VMRUNUOwotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIAl0c2QgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CkBAIC00NzksNyArNDU3LDkgQEAKIAl0c2QtPmRldiA9ICZwZGV2LT5kZXY7CiAJc3Bpbl9sb2NrX2luaXQoJnRzZC0+bG9jayk7CiAKLQl0ZWdyYV9zZmxhc2hfcGFyc2VfZHQodHNkKTsKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIodHNkLT5kZXYtPm9mX25vZGUsICJzcGktbWF4LWZyZXF1ZW5jeSIsCisJCQkJICZtYXN0ZXItPm1heF9zcGVlZF9oeikpCisJCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gMjUwMDAwMDA7IC8qIDI1TUh6ICovCiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAl0c2QtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zbGluay5jIGIvZHJpdmVycy9zcGkvc3BpLXRlZ3JhMjAtc2xpbmsuYwppbmRleCBiZTNhMDY5Li5lM2MxYjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGVncmEyMC1zbGluay5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10ZWdyYTIwLXNsaW5rLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE3MSw3ICsxNzAsNiBAQAogCXZvaWQgX19pb21lbQkJCQkqYmFzZTsKIAlwaHlzX2FkZHJfdAkJCQlwaHlzOwogCXVuc2lnbmVkCQkJCWlycTsKLQl1MzIJCQkJCXNwaV9tYXhfZnJlcXVlbmN5OwogCXUzMgkJCQkJY3VyX3NwZWVkOwogCiAJc3RydWN0IHNwaV9kZXZpY2UJCQkqY3VyX3NwaTsKQEAgLTc2MSwxMCArNzU5LDYgQEAKIAkJc3BpLT5tb2RlICYgU1BJX0NQSEEgPyAiIiA6ICJ+IiwKIAkJc3BpLT5tYXhfc3BlZWRfaHopOwogCi0JQlVHX09OKHNwaS0+Y2hpcF9zZWxlY3QgPj0gTUFYX0NISVBfU0VMRUNUKTsKLQotCS8qIFNldCBzcGVlZCB0byB0aGUgc3BpIG1heCBmZXF1ZW5jeSBpZiBzcGkgZGV2aWNlIGhhcyBub3Qgc2V0ICovCi0Jc3BpLT5tYXhfc3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oeiA/IDogdHNwaS0+c3BpX21heF9mcmVxdWVuY3k7CiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyh0c3BpLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIodHNwaS0+ZGV2LCAicG0gcnVudGltZSBmYWlsZWQsIGUgPSAlZFxuIiwgcmV0KTsKQEAgLTk5OSwxNSArOTkzLDYgQEAKIAlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOwogfQogCi1zdGF0aWMgdm9pZCB0ZWdyYV9zbGlua19wYXJzZV9kdChzdHJ1Y3QgdGVncmFfc2xpbmtfZGF0YSAqdHNwaSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gdHNwaS0+ZGV2LT5vZl9ub2RlOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3BpLW1heC1mcmVxdWVuY3kiLAotCQkJCQkmdHNwaS0+c3BpX21heF9mcmVxdWVuY3kpKQotCQl0c3BpLT5zcGlfbWF4X2ZyZXF1ZW5jeSA9IDI1MDAwMDAwOyAvKiAyNU1IeiAqLwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3NsaW5rX2NoaXBfZGF0YSB0ZWdyYTMwX3NwaV9jZGF0YSA9IHsKIAkuY3NfaG9sZF90aW1lID0gdHJ1ZSwKIH07CkBAIC0xMDUzLDcgKzEwMzgsNiBAQAogCW1hc3Rlci0+dW5wcmVwYXJlX21lc3NhZ2UgPSB0ZWdyYV9zbGlua191bnByZXBhcmVfbWVzc2FnZTsKIAltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IE1BWF9DSElQX1NFTEVDVDsKLQltYXN0ZXItPmJ1c19udW0gPSAtMTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CiAJdHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKQEAgLTEwNjIsNyArMTA0Niw5IEBACiAJdHNwaS0+Y2hpcF9kYXRhID0gY2RhdGE7CiAJc3Bpbl9sb2NrX2luaXQoJnRzcGktPmxvY2spOwogCi0JdGVncmFfc2xpbmtfcGFyc2VfZHQodHNwaSk7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHRzcGktPmRldi0+b2Zfbm9kZSwgInNwaS1tYXgtZnJlcXVlbmN5IiwKKwkJCQkgJm1hc3Rlci0+bWF4X3NwZWVkX2h6KSkKKwkJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMDsgLyogMjVNSHogKi8KIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS10aS1xc3BpLmMKaW5kZXggM2QwOTI2NS4uNmMyMTFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGktcXNwaS5jCkBAIC00MjksMTMgKzQyOSwxMyBAQAogCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX1JYX0RVQUwgfCBTUElfUlhfUVVBRDsKIAotCW1hc3Rlci0+YnVzX251bSA9IC0xOwogCW1hc3Rlci0+ZmxhZ3MgPSBTUElfTUFTVEVSX0hBTEZfRFVQTEVYOwogCW1hc3Rlci0+c2V0dXAgPSB0aV9xc3BpX3NldHVwOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKIAltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gdGlfcXNwaV9zdGFydF90cmFuc2Zlcl9vbmU7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwotCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gQklUKDMyIC0gMSkgfCBCSVQoMTYgLSAxKSB8IEJJVCg4IC0gMSk7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX01BU0soMzIpIHwgU1BJX0JQV19NQVNLKDE2KSB8CisJCQkJICAgICBTUElfQlBXX01BU0soOCk7CiAKIAlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtLWNzIiwgJm51bV9jcykpCiAJCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBudW1fY3M7CkBAIC00NjEsNyArNDYxLDYgQEAKIAkJaWYgKHJlc19tbWFwID09IE5VTEwpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkibWVtb3J5IG1hcHBlZCByZXNvdXJjZSBub3QgcmVxdWlyZWRcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYyBiL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyMGUxMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGktc3NwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIFNlcXVlbmNlciBTZXJpYWwgUG9ydCAoU1NQKSBiYXNlZCBTUEkgbWFzdGVyIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvdGlfc3NwLmg+Ci0KLSNkZWZpbmUgTU9ERV9CSVRTCShTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0NTX0hJR0gpCi0KLXN0cnVjdCB0aV9zc3Bfc3BpIHsKLQlzdHJ1Y3Qgc3BpX21hc3RlcgkJKm1hc3RlcjsKLQlzdHJ1Y3QgZGV2aWNlCQkJKmRldjsKLQlzcGlubG9ja190CQkJbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQltc2dfcXVldWU7Ci0Jc3RydWN0IGNvbXBsZXRpb24JCWNvbXBsZXRlOwotCWJvb2wJCQkJc2h1dGRvd247Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3b3JrcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrOwotCXU4CQkJCW1vZGUsIGJwdzsKLQlpbnQJCQkJY3NfYWN0aXZlOwotCXUzMgkJCQlwY19lbiwgcGNfZGlzLCBwY193ciwgcGNfcmQ7Ci0Jdm9pZAkJCQkoKnNlbGVjdCkoaW50IGNzKTsKLX07Ci0KLXN0YXRpYyB1MzIgdGlfc3NwX3NwaV9yeChzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcpCi17Ci0JdTMyIHJldDsKLQotCXRpX3NzcF9ydW4oaHctPmRldiwgaHctPnBjX3JkLCAwLCAmcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB0aV9zc3Bfc3BpX3R4KHN0cnVjdCB0aV9zc3Bfc3BpICpodywgdTMyIGRhdGEpCi17Ci0JdGlfc3NwX3J1bihody0+ZGV2LCBody0+cGNfd3IsIGRhdGEgPDwgKDMyIC0gaHctPmJwdyksIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IHRpX3NzcF9zcGlfdHhyeChzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLAotCQkgICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlpbnQgY291bnQ7Ci0KLQlpZiAoaHctPmJwdyA8PSA4KSB7Ci0JCXU4CQkqcnggPSB0LT5yeF9idWY7Ci0JCWNvbnN0IHU4CSp0eCA9IHQtPnR4X2J1ZjsKLQotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0LT5sZW47IGNvdW50ICs9IDEpIHsKLQkJCWlmICh0LT50eF9idWYpCi0JCQkJdGlfc3NwX3NwaV90eChodywgKnR4KyspOwotCQkJaWYgKHQtPnJ4X2J1ZikKLQkJCQkqcngrKyA9IHRpX3NzcF9zcGlfcngoaHcpOwotCQl9Ci0JfSBlbHNlIGlmIChody0+YnB3IDw9IDE2KSB7Ci0JCXUxNgkJKnJ4ID0gdC0+cnhfYnVmOwotCQljb25zdCB1MTYJKnR4ID0gdC0+dHhfYnVmOwotCi0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHQtPmxlbjsgY291bnQgKz0gMikgewotCQkJaWYgKHQtPnR4X2J1ZikKLQkJCQl0aV9zc3Bfc3BpX3R4KGh3LCAqdHgrKyk7Ci0JCQlpZiAodC0+cnhfYnVmKQotCQkJCSpyeCsrID0gdGlfc3NwX3NwaV9yeChodyk7Ci0JCX0KLQl9IGVsc2UgewotCQl1MzIJCSpyeCA9IHQtPnJ4X2J1ZjsKLQkJY29uc3QgdTMyCSp0eCA9IHQtPnR4X2J1ZjsKLQotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0LT5sZW47IGNvdW50ICs9IDQpIHsKLQkJCWlmICh0LT50eF9idWYpCi0JCQkJdGlfc3NwX3NwaV90eChodywgKnR4KyspOwotCQkJaWYgKHQtPnJ4X2J1ZikKLQkJCQkqcngrKyA9IHRpX3NzcF9zcGlfcngoaHcpOwotCQl9Ci0JfQotCi0JbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGNvdW50OyAvKiBieXRlcyB0cmFuc2ZlcnJlZCAqLwotCi0JZGV2X2RiZygmbXNnLT5zcGktPmRldiwgInhmZXIgJXMlcywgJWQgYnl0ZXMsICVkIGJwdywgY291bnQgJWQlc1xuIiwKLQkJdC0+dHhfYnVmID8gInR4IiA6ICIiLCB0LT5yeF9idWYgPyAicngiIDogIiIsIHQtPmxlbiwKLQkJaHctPmJwdywgY291bnQsIChjb3VudCA8IHQtPmxlbikgPyAiICh1bmRlcikiIDogIiIpOwotCi0JcmV0dXJuIChjb3VudCA8IHQtPmxlbikgPyAtRUlPIDogMDsgLyogbGVmdCBvdmVyIGRhdGEgKi8KLX0KLQotc3RhdGljIHZvaWQgdGlfc3NwX3NwaV9jaGlwX3NlbGVjdChzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcsIGludCBjc19hY3RpdmUpCi17Ci0JY3NfYWN0aXZlID0gISFjc19hY3RpdmU7Ci0JaWYgKGNzX2FjdGl2ZSA9PSBody0+Y3NfYWN0aXZlKQotCQlyZXR1cm47Ci0JdGlfc3NwX3J1bihody0+ZGV2LCBjc19hY3RpdmUgPyBody0+cGNfZW4gOiBody0+cGNfZGlzLCAwLCBOVUxMKTsKLQlody0+Y3NfYWN0aXZlID0gY3NfYWN0aXZlOwotfQotCi0jZGVmaW5lIF9fU0hJRlRfT1VUKGJpdHMpCShTU1BfT1BDT0RFX1NISUZUIHwgU1NQX09VVF9NT0RFIHwgXAotCQkJCSBjc19lbiB8IGNsayB8IFNTUF9DT1VOVCgoYml0cykgKiAyIC0gMSkpCi0jZGVmaW5lIF9fU0hJRlRfSU4oYml0cykJKFNTUF9PUENPREVfU0hJRlQgfCBTU1BfSU5fTU9ERSAgfCBcCi0JCQkJIGNzX2VuIHwgY2xrIHwgU1NQX0NPVU5UKChiaXRzKSAqIDIgLSAxKSkKLQotc3RhdGljIGludCB0aV9zc3Bfc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCB0aV9zc3Bfc3BpICpodywgdTggYnB3LCB1OCBtb2RlKQotewotCWludCBlcnJvciwgaWR4ID0gMDsKLQl1MzIgc2VxcmFtWzE2XTsKLQl1MzIgY3NfZW4sIGNzX2RpcywgY2xrOwotCXUzMiB0b3BiaXRzLCBib3RiaXRzOwotCi0JbW9kZSAmPSBNT0RFX0JJVFM7Ci0JaWYgKG1vZGUgPT0gaHctPm1vZGUgJiYgYnB3ID09IGh3LT5icHcpCi0JCXJldHVybiAwOwotCi0JY3NfZW4gID0gKG1vZGUgJiBTUElfQ1NfSElHSCkgPyBTU1BfQ1NfSElHSCA6IFNTUF9DU19MT1c7Ci0JY3NfZGlzID0gKG1vZGUgJiBTUElfQ1NfSElHSCkgPyBTU1BfQ1NfTE9XICA6IFNTUF9DU19ISUdIOwotCWNsayAgICA9IChtb2RlICYgU1BJX0NQT0wpICAgID8gU1NQX0NMS19ISUdIIDogU1NQX0NMS19MT1c7Ci0KLQkvKiBDb25zdHJ1Y3QgaW5zdHJ1Y3Rpb25zICovCi0KLQkvKiBEaXNhYmxlIENoaXAgU2VsZWN0ICovCi0JaHctPnBjX2RpcyA9IGlkeDsKLQlzZXFyYW1baWR4KytdID0gU1NQX09QQ09ERV9ESVJFQ1QgfCBTU1BfT1VUX01PREUgfCBjc19kaXMgfCBjbGs7Ci0Jc2VxcmFtW2lkeCsrXSA9IFNTUF9PUENPREVfU1RPUCAgIHwgU1NQX09VVF9NT0RFIHwgY3NfZGlzIHwgY2xrOwotCi0JLyogRW5hYmxlIENoaXAgU2VsZWN0ICovCi0JaHctPnBjX2VuID0gaWR4OwotCXNlcXJhbVtpZHgrK10gPSBTU1BfT1BDT0RFX0RJUkVDVCB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCXNlcXJhbVtpZHgrK10gPSBTU1BfT1BDT0RFX1NUT1AgICB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCi0JLyogUmVhZHMgYW5kIHdyaXRlcyBuZWVkIHRvIGJlIHNwbGl0IGZvciBicHcgPiAxNiAqLwotCXRvcGJpdHMgPSAoYnB3ID4gMTYpID8gMTYgOiBicHc7Ci0JYm90Yml0cyA9IGJwdyAtIHRvcGJpdHM7Ci0KLQkvKiBXcml0ZSAqLwotCWh3LT5wY193ciA9IGlkeDsKLQlzZXFyYW1baWR4KytdID0gX19TSElGVF9PVVQodG9wYml0cykgfCBTU1BfQUREUl9SRUc7Ci0JaWYgKGJvdGJpdHMpCi0JCXNlcXJhbVtpZHgrK10gPSBfX1NISUZUX09VVChib3RiaXRzKSAgfCBTU1BfREFUQV9SRUc7Ci0Jc2VxcmFtW2lkeCsrXSA9IFNTUF9PUENPREVfU1RPUCB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCi0JLyogUmVhZCAqLwotCWh3LT5wY19yZCA9IGlkeDsKLQlpZiAoYm90Yml0cykKLQkJc2VxcmFtW2lkeCsrXSA9IF9fU0hJRlRfSU4oYm90Yml0cykgfCBTU1BfQUREUl9SRUc7Ci0Jc2VxcmFtW2lkeCsrXSA9IF9fU0hJRlRfSU4odG9wYml0cykgfCBTU1BfREFUQV9SRUc7Ci0Jc2VxcmFtW2lkeCsrXSA9IFNTUF9PUENPREVfU1RPUCB8IFNTUF9PVVRfTU9ERSB8IGNzX2VuIHwgY2xrOwotCi0JZXJyb3IgPSB0aV9zc3BfbG9hZChody0+ZGV2LCAwLCBzZXFyYW0sIGlkeCk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JZXJyb3IgPSB0aV9zc3Bfc2V0X21vZGUoaHctPmRldiwgKChtb2RlICYgU1BJX0NQSEEpID8KLQkJCQkJICAwIDogU1NQX0VBUkxZX0RJTikpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWh3LT5icHcgPSBicHc7Ci0JaHctPm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdm9pZCB0aV9zc3Bfc3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0aV9zc3Bfc3BpICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGlfc3NwX3NwaSwgd29yayk7Ci0KLQlzcGluX2xvY2soJmh3LT5sb2NrKTsKLQotCSB3aGlsZSAoIWxpc3RfZW1wdHkoJmh3LT5tc2dfcXVldWUpKSB7Ci0JCXN0cnVjdCBzcGlfbWVzc2FnZQkqbTsKLQkJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKLQkJc3RydWN0IHNwaV90cmFuc2ZlcgkqdCA9IE5VTEw7Ci0JCWludAkJCXN0YXR1cyA9IDA7Ci0KLQkJbSA9IGNvbnRhaW5lcl9vZihody0+bXNnX3F1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwKLQkJCQkgcXVldWUpOwotCi0JCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKLQotCQlzcGluX3VubG9jaygmaHctPmxvY2spOwotCi0JCXNwaSA9IG0tPnNwaTsKLQotCQlpZiAoaHctPnNlbGVjdCkKLQkJCWh3LT5zZWxlY3Qoc3BpLT5jaGlwX3NlbGVjdCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCQlpbnQgYnB3ID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCQkJaW50IHhmZXJfc3RhdHVzOwotCi0JCQlpZiAodC0+Yml0c19wZXJfd29yZCkKLQkJCQlicHcgPSB0LT5iaXRzX3Blcl93b3JkOwotCi0JCQlpZiAodGlfc3NwX3NwaV9zZXR1cF90cmFuc2ZlcihodywgYnB3LCBzcGktPm1vZGUpIDwgMCkKLQkJCQlicmVhazsKLQotCQkJdGlfc3NwX3NwaV9jaGlwX3NlbGVjdChodywgMSk7Ci0KLQkJCXhmZXJfc3RhdHVzID0gdGlfc3NwX3NwaV90eHJ4KGh3LCBtLCB0KTsKLQkJCWlmICh4ZmVyX3N0YXR1cyA8IDApCi0JCQkJc3RhdHVzID0geGZlcl9zdGF0dXM7Ci0KLQkJCWlmICh0LT5kZWxheV91c2VjcykKLQkJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOwotCi0JCQlpZiAodC0+Y3NfY2hhbmdlKQotCQkJCXRpX3NzcF9zcGlfY2hpcF9zZWxlY3QoaHcsIDApOwotCQl9Ci0KLQkJdGlfc3NwX3NwaV9jaGlwX3NlbGVjdChodywgMCk7Ci0JCW0tPnN0YXR1cyA9IHN0YXR1czsKLQkJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7Ci0KLQkJc3Bpbl9sb2NrKCZody0+bG9jayk7Ci0JfQotCi0JaWYgKGh3LT5zaHV0ZG93bikKLQkJY29tcGxldGUoJmh3LT5jb21wbGV0ZSk7Ci0KLQlzcGluX3VubG9jaygmaHctPmxvY2spOwotfQotCi1zdGF0aWMgaW50IHRpX3NzcF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQotewotCXN0cnVjdCB0aV9zc3Bfc3BpCSpodzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0OwotCWludAkJCWVycm9yID0gMDsKLQotCW0tPmFjdHVhbF9sZW5ndGggPSAwOwotCW0tPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKLQotCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0KLQlpZiAobGlzdF9lbXB0eSgmbS0+dHJhbnNmZXJzKSB8fCAhbS0+Y29tcGxldGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT5sZW4gJiYgISh0LT5yeF9idWYgfHwgdC0+dHhfYnVmKSkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIHhmZXIsIG5vIGJ1ZmZlclxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICh0LT5sZW4gJiYgdC0+cnhfYnVmICYmIHQtPnR4X2J1ZikgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIHhmZXIsIGZ1bGwgZHVwbGV4XG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrKCZody0+bG9jayk7Ci0JaWYgKGh3LT5zaHV0ZG93bikgewotCQllcnJvciA9IC1FU0hVVERPV047Ci0JCWdvdG8gZXJyb3JfdW5sb2NrOwotCX0KLQlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJmh3LT5tc2dfcXVldWUpOwotCXF1ZXVlX3dvcmsoaHctPndvcmtxdWV1ZSwgJmh3LT53b3JrKTsKLWVycm9yX3VubG9jazoKLQlzcGluX3VubG9jaygmaHctPmxvY2spOwotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCB0aV9zc3Bfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JY29uc3Qgc3RydWN0IHRpX3NzcF9zcGlfZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHRpX3NzcF9zcGkgKmh3OwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgZXJyb3IgPSAwOwotCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKGRldiwgInBsYXRmb3JtIGRhdGEgbm90IGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZihzdHJ1Y3QgdGlfc3NwX3NwaSkpOwotCWlmICghbWFzdGVyKSB7Ci0JCWRldl9lcnIoZGV2LCAiY2Fubm90IGFsbG9jYXRlIFNQSSBtYXN0ZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7Ci0KLQlody0+bWFzdGVyID0gbWFzdGVyOwotCWh3LT5kZXYgPSBkZXY7Ci0JaHctPnNlbGVjdCA9IHBkYXRhLT5zZWxlY3Q7Ci0KLQlzcGluX2xvY2tfaW5pdCgmaHctPmxvY2spOwotCWluaXRfY29tcGxldGlvbigmaHctPmNvbXBsZXRlKTsKLQlJTklUX0xJU1RfSEVBRCgmaHctPm1zZ19xdWV1ZSk7Ci0JSU5JVF9XT1JLKCZody0+d29yaywgdGlfc3NwX3NwaV93b3JrKTsKLQotCWh3LT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShkZXZfbmFtZShkZXYpKTsKLQlpZiAoIWh3LT53b3JrcXVldWUpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlkZXZfZXJyKGRldiwgIndvcmsgcXVldWUgY3JlYXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl93cTsKLQl9Ci0KLQllcnJvciA9IHRpX3NzcF9zZXRfaW9zZWwoaHctPmRldiwgcGRhdGEtPmlvc2VsKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiaW8gc2V0dXAgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl9pb3NlbDsKLQl9Ci0KLQltYXN0ZXItPmJ1c19udW0JCT0gcGRldi0+aWQ7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdAk9IHBkYXRhLT5udW1fY3M7Ci0JbWFzdGVyLT5tb2RlX2JpdHMJPSBNT0RFX0JJVFM7Ci0JbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX1JBTkdFX01BU0soMSwgMzIpOwotCW1hc3Rlci0+ZmxhZ3MJCT0gU1BJX01BU1RFUl9IQUxGX0RVUExFWDsKLQltYXN0ZXItPnRyYW5zZmVyCT0gdGlfc3NwX3NwaV90cmFuc2ZlcjsKLQotCWVycm9yID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKGRldiwgIm1hc3RlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl9yZWc7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX3JlZzoKLWVycm9yX2lvc2VsOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGh3LT53b3JrcXVldWUpOwotZXJyb3Jfd3E6Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgdGlfc3NwX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdGlfc3NwX3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgZXJyb3I7Ci0KLQlody0+c2h1dGRvd24gPSAxOwotCXdoaWxlICghbGlzdF9lbXB0eSgmaHctPm1zZ19xdWV1ZSkpIHsKLQkJZXJyb3IgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmh3LT5jb21wbGV0ZSk7Ci0JCWlmIChlcnJvciA8IDApIHsKLQkJCWh3LT5zaHV0ZG93biA9IDA7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQl9Ci0JZGVzdHJveV93b3JrcXVldWUoaHctPndvcmtxdWV1ZSk7Ci0Jc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGh3LT5tYXN0ZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRpX3NzcF9zcGlfZHJpdmVyID0gewotCS5wcm9iZQkJPSB0aV9zc3Bfc3BpX3Byb2JlLAotCS5yZW1vdmUJCT0gdGlfc3NwX3NwaV9yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInRpLXNzcC1zcGkiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGlfc3NwX3NwaV9kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNTUCBTUEkgTWFzdGVyIik7Ci1NT0RVTEVfQVVUSE9SKCJDeXJpbCBDaGVtcGFyYXRoeSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0aS1zc3Atc3BpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdG9wY2xpZmYtcGNoLmMgYi9kcml2ZXJzL3NwaS9zcGktdG9wY2xpZmYtcGNoLmMKaW5kZXggODhlYjU3ZS4uZjQwNmIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRvcGNsaWZmLXBjaC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10b3BjbGlmZi1wY2guYwpAQCAtMzMyLDcgKzMzMiw3IEBACiAJCQkJZGF0YS0+dHJhbnNmZXJfYWN0aXZlID0gZmFsc2U7CiAJCQkJd2FrZV91cCgmZGF0YS0+d2FpdCk7CiAJCQl9IGVsc2UgewotCQkJCWRldl9lcnIoJmRhdGEtPm1hc3Rlci0+ZGV2LAorCQkJCWRldl92ZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKIAkJCQkJIiVzIDogVHJhbnNmZXIgaXMgbm90IGNvbXBsZXRlZCIsCiAJCQkJCV9fZnVuY19fKTsKIAkJCX0KQEAgLTQ2NCwyMCArNDY0LDYgQEAKIAlwY2hfc3BpX3dyaXRlcmVnKG1hc3RlciwgUENIX1NSU1QsIDB4MCk7CiB9CiAKLXN0YXRpYyBpbnQgcGNoX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqcHNwaSkKLXsKLQkvKiBDaGVjayBiYXVkIHJhdGUgc2V0dGluZyAqLwotCS8qIGlmIGJhdWQgcmF0ZSBvZiBjaGlwIGlzIGdyZWF0ZXIgdGhhbgotCSAgIG1heCB3ZSBjYW4gc3VwcG9ydCxyZXR1cm4gZXJyb3IgKi8KLQlpZiAoKHBzcGktPm1heF9zcGVlZF9oeikgPiBQQ0hfTUFYX0JBVURSQVRFKQotCQlwc3BpLT5tYXhfc3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOwotCi0JZGV2X2RiZygmcHNwaS0+ZGV2LCAiJXMgTU9ERSA9ICV4XG4iLCBfX2Z1bmNfXywKLQkJKHBzcGktPm1vZGUpICYgKFNQSV9DUE9MIHwgU1BJX0NQSEEpKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHBjaF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnBzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqcG1zZykKIHsKIApAQCAtNDg2LDIzICs0NzIsNiBAQAogCWludCByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIHZhbGlkYXRlIHNwaSBtZXNzYWdlIGFuZCBiYXVkIHJhdGUgKi8KLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcG1zZy0+dHJhbnNmZXJzKSA9PSAxKSkgewotCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBsaXN0IGVtcHR5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlpZiAodW5saWtlbHkocHNwaS0+bWF4X3NwZWVkX2h6ID09IDApKSB7Ci0JCWRldl9lcnIoJnBzcGktPmRldiwgIiVzIHBjaF9zcGlfdHJhbnNmZXIgbWF4c3BlZWQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcHNwaS0+bWF4X3NwZWVkX2h6KTsKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCWRldl9kYmcoJnBzcGktPmRldiwKLQkJIiVzIFRyYW5zZmVyIExpc3Qgbm90IGVtcHR5LiBUcmFuc2ZlciBTcGVlZCBpcyBzZXQuXG4iLCBfX2Z1bmNfXyk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwogCS8qIHZhbGlkYXRlIFR4L1J4IGJ1ZmZlcnMgYW5kIFRyYW5zZmVyIGxlbmd0aCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnNmZXIsICZwbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKQEAgLTUyMywxMCArNDkyLDYgQEAKIAkJZGV2X2RiZygmcHNwaS0+ZGV2LAogCQkJIiVzIFR4L1J4IGJ1ZmZlciB2YWxpZC4gVHJhbnNmZXIgbGVuZ3RoIHZhbGlkXG4iLAogCQkJX19mdW5jX18pOwotCi0JCS8qIGlmIGJhdWQgcmF0ZSBoYXMgYmVlbiBzcGVjaWZpZWQgdmFsaWRhdGUgdGhlIHNhbWUgKi8KLQkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiA+IFBDSF9NQVhfQkFVRFJBVEUpCi0JCQl0cmFuc2Zlci0+c3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CiAKQEAgLTExNTEsOCArMTExNiw3IEBACiAJZG1hLT5uZW50ID0gbnVtOwogCWRtYS0+ZGVzY190eCA9IGRlc2NfdHg7CiAKLQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIlxuJXM6UHVsbGluZyBkb3duIFNTTiBsb3cgLSB3cml0aW5nICIKLQkJIjB4MiB0byBTU05YQ1JcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOlB1bGxpbmcgZG93biBTU04gbG93IC0gd3JpdGluZyAweDIgdG8gU1NOWENSXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwogCXBjaF9zcGlfd3JpdGVyZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1NOWENSLCBTU05fTE9XKTsKQEAgLTE0MTgsMTAgKzEzODIsMTAgQEAKIAogCS8qIGluaXRpYWxpemUgbWVtYmVycyBvZiBTUEkgbWFzdGVyICovCiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFBDSF9NQVhfQ1M7Ci0JbWFzdGVyLT5zZXR1cCA9IHBjaF9zcGlfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2ZlciA9IHBjaF9zcGlfdHJhbnNmZXI7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVDsKIAltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KSB8IFNQSV9CUFdfTUFTSygxNik7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOwogCiAJZGF0YS0+Ym9hcmRfZGF0ID0gYm9hcmRfZGF0OwogCWRhdGEtPnBsYXRfZGV2ID0gcGxhdF9kZXY7CkBAIC0xNjA1LDggKzE1NjksNyBAQAogCS5yZXN1bWUgPSBwY2hfc3BpX3BkX3Jlc3VtZQogfTsKIAotc3RhdGljIGludCBwY2hfc3BpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgcGNoX3NwaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdDsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZF9kZXYgPSBOVUxMOwpAQCAtMTY3Niw2ICsxNjM5LDggQEAKIAlyZXR1cm4gMDsKIAogZXJyX3BsYXRmb3JtX2RldmljZToKKwl3aGlsZSAoLS1pID49IDApCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkX2Rldl9zYXZlLT5wZF9zYXZlW2ldKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBwY2lfZW5hYmxlX2RldmljZToKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYyBiL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMKaW5kZXggNjE5MWNlZC4uODIwYjQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCkBAIC04MCw3ICs4MCw2IEBACiAJdm9pZCBfX2lvbWVtICptZW1iYXNlOwogCWludCBiYXNlY2xrOwogCXN0cnVjdCBjbGsgKmNsazsKLQl1MzIgbWF4X3NwZWVkX2h6LCBtaW5fc3BlZWRfaHo7CiAJaW50IGxhc3RfY2hpcHNlbGVjdDsKIAlpbnQgbGFzdF9jaGlwc2VsZWN0X3ZhbDsKIH07CkBAIC0xMTcsOSArMTE2LDcgQEAKIHsKIAlzdHJ1Y3QgdHh4OXNwaSAqYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCi0JaWYgKCFzcGktPm1heF9zcGVlZF9oegotCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHoKLQkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6KQorCWlmICghc3BpLT5tYXhfc3BlZWRfaHopCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGdwaW9fZGlyZWN0aW9uX291dHB1dChzcGktPmNoaXBfc2VsZWN0LApAQCAtMzA5LDE1ICszMDYsOCBAQAogCiAJLyogY2hlY2sgZWFjaCB0cmFuc2ZlcidzIHBhcmFtZXRlcnMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJdTMyIHNwZWVkX2h6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwotCQl1OCBiaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKLQogCQlpZiAoIXQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmIHQtPmxlbikKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodC0+bGVuICYgKChiaXRzX3Blcl93b3JkID4+IDMpIC0gMSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHNwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6IHx8IHNwZWVkX2h6ID4gYy0+bWF4X3NwZWVkX2h6KQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmxvY2ssIGZsYWdzKTsKQEAgLTM2MCwxNyArMzUwLDEyIEBACiAJCWdvdG8gZXhpdDsKIAl9CiAJYy0+YmFzZWNsayA9IGNsa19nZXRfcmF0ZShjLT5jbGspOwotCWMtPm1pbl9zcGVlZF9oeiA9IERJVl9ST1VORF9VUChjLT5iYXNlY2xrLCBTUElfTUFYX0RJVklERVIgKyAxKTsKLQljLT5tYXhfc3BlZWRfaHogPSBjLT5iYXNlY2xrIC8gKFNQSV9NSU5fRElWSURFUiArIDEpOworCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gRElWX1JPVU5EX1VQKGMtPmJhc2VjbGssIFNQSV9NQVhfRElWSURFUiArIDEpOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gYy0+YmFzZWNsayAvIChTUElfTUlOX0RJVklERVIgKyAxKTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJZ290byBleGl0X2J1c3k7Ci0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQkgICAgICJzcGlfdHh4OSIpKQotCQlnb3RvIGV4aXRfYnVzeTsKLQljLT5tZW1iYXNlID0gZGV2bV9pb3JlbWFwKCZkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlpZiAoIWMtPm1lbWJhc2UpCisJYy0+bWVtYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihjLT5tZW1iYXNlKSkKIAkJZ290byBleGl0X2J1c3k7CiAKIAkvKiBlbnRlciBjb25maWcgbW9kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXhjb21tLmMgYi9kcml2ZXJzL3NwaS9zcGkteGNvbW0uYwppbmRleCAyNGM0MGIxLi5iYjQ3OGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkteGNvbW0uYworKysgYi9kcml2ZXJzL3NwaS9zcGkteGNvbW0uYwpAQCAtOCw3ICs4LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC03NCwxNSArNzMsMTMgQEAKIHN0YXRpYyBpbnQgc3BpX3hjb21tX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfeGNvbW0gKnNwaV94Y29tbSwKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCB1bnNpZ25lZCBpbnQgKnNldHRpbmdzKQogewotCXVuc2lnbmVkIGludCBzcGVlZDsKLQogCWlmICh0LT5sZW4gPiA2MikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGVlZCA9IHQtPnNwZWVkX2h6ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKKwlpZiAodC0+c3BlZWRfaHogIT0gc3BpX3hjb21tLT5jdXJyZW50X3NwZWVkKSB7CisJCXVuc2lnbmVkIGludCBkaXZpZGVyOwogCi0JaWYgKHNwZWVkICE9IHNwaV94Y29tbS0+Y3VycmVudF9zcGVlZCkgewotCQl1bnNpZ25lZCBpbnQgZGl2aWRlciA9IERJVl9ST1VORF9VUChTUElfWENPTU1fQ0xPQ0ssIHNwZWVkKTsKKwkJZGl2aWRlciA9IERJVl9ST1VORF9VUChTUElfWENPTU1fQ0xPQ0ssIHQtPnNwZWVkX2h6KTsKIAkJaWYgKGRpdmlkZXIgPj0gNjQpCiAJCQkqc2V0dGluZ3MgfD0gU1BJX1hDT01NX1NFVFRJTkdTX0NMT0NLX0RJVl82NDsKIAkJZWxzZSBpZiAoZGl2aWRlciA+PSAxNikKQEAgLTkwLDcgKzg3LDcgQEAKIAkJZWxzZQogCQkJKnNldHRpbmdzIHw9IFNQSV9YQ09NTV9TRVRUSU5HU19DTE9DS19ESVZfNDsKIAotCQlzcGlfeGNvbW0tPmN1cnJlbnRfc3BlZWQgPSBzcGVlZDsKKwkJc3BpX3hjb21tLT5jdXJyZW50X3NwZWVkID0gdC0+c3BlZWRfaHo7CiAJfQogCiAJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQpAQCAtMTQ4LDggKzE0NSw2IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJYm9vbCBpc19sYXN0OwogCi0JaXNfZmlyc3QgPSB0cnVlOwotCiAJc3BpX3hjb21tX2NoaXBzZWxlY3Qoc3BpX3hjb21tLCBzcGksIHRydWUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYyBiL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYwppbmRleCA2ZDRjZTQ2Li5hM2IwYjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkteGlsaW54LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXhpbGlueC5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtODgsMTAgKzg3LDEwIEBACiAJY29uc3QgdTggKnR4X3B0cjsJLyogcG9pbnRlciBpbiB0aGUgUnggYnVmZmVyICovCiAJaW50IHJlbWFpbmluZ19ieXRlczsJLyogdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHRyYW5zZmVyICovCiAJdTggYml0c19wZXJfd29yZDsKLQl1bnNpZ25lZCBpbnQgKCpyZWFkX2ZuKSAodm9pZCBfX2lvbWVtICopOwotCXZvaWQgKCp3cml0ZV9mbikgKHUzMiwgdm9pZCBfX2lvbWVtICopOwotCXZvaWQgKCp0eF9mbikgKHN0cnVjdCB4aWxpbnhfc3BpICopOwotCXZvaWQgKCpyeF9mbikgKHN0cnVjdCB4aWxpbnhfc3BpICopOworCXVuc2lnbmVkIGludCAoKnJlYWRfZm4pKHZvaWQgX19pb21lbSAqKTsKKwl2b2lkICgqd3JpdGVfZm4pKHUzMiwgdm9pZCBfX2lvbWVtICopOworCXZvaWQgKCp0eF9mbikoc3RydWN0IHhpbGlueF9zcGkgKik7CisJdm9pZCAoKnJ4X2ZuKShzdHJ1Y3QgeGlsaW54X3NwaSAqKTsKIH07CiAKIHN0YXRpYyB2b2lkIHhzcGlfd3JpdGUzMih1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCkBAIC0yMDksMjYgKzIwOCwxMSBAQAogfQogCiAvKiBzcGlfYml0YmFuZyByZXF1aXJlcyBjdXN0b20gc2V0dXBfdHJhbnNmZXIoKSB0byBiZSBkZWZpbmVkIGlmIHRoZXJlIGlzIGEKLSAqIGN1c3RvbSB0eHJ4X2J1ZnMoKS4gV2UgaGF2ZSBub3RoaW5nIHRvIHNldHVwIGhlcmUgYXMgdGhlIFNQSSBJUCBibG9jawotICogc3VwcG9ydHMgOCBvciAxNiBiaXRzIHBlciB3b3JkIHdoaWNoIGNhbm5vdCBiZSBjaGFuZ2VkIGluIHNvZnR3YXJlLgotICogU1BJIGNsb2NrIGNhbid0IGJlIGNoYW5nZWQgaW4gc29mdHdhcmUgZWl0aGVyLgotICogQ2hlY2sgZm9yIGNvcnJlY3QgYml0cyBwZXIgd29yZC4gQ2hpcCBzZWxlY3QgZGVsYXkgY2FsY3VsYXRpb25zIGNvdWxkIGJlCi0gKiBhZGRlZCBoZXJlIGFzIHNvb24gYXMgYml0YmFuZ193b3JrKCkgY2FuIGJlIG1hZGUgYXdhcmUgb2YgdGhlIGRlbGF5IHZhbHVlLgorICogY3VzdG9tIHR4cnhfYnVmcygpLgogICovCiBzdGF0aWMgaW50IHhpbGlueF9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKIHsKLQlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXU4IGJpdHNfcGVyX3dvcmQ7Ci0KLQliaXRzX3Blcl93b3JkID0gKHQgJiYgdC0+Yml0c19wZXJfd29yZCkKLQkJCSA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKGJpdHNfcGVyX3dvcmQgIT0geHNwaS0+Yml0c19wZXJfd29yZCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzLCB1bnN1cHBvcnRlZCBiaXRzX3Blcl93b3JkPSVkXG4iLAotCQkJX19mdW5jX18sIGJpdHNfcGVyX3dvcmQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDA3LDYgKzM5MSw3IEBACiAJCXhzcGktPndyaXRlX2ZuID0geHNwaV93cml0ZTMyX2JlOwogCX0KIAorCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKGJpdHNfcGVyX3dvcmQpOwogCXhzcGktPmJpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkOwogCWlmICh4c3BpLT5iaXRzX3Blcl93b3JkID09IDgpIHsKIAkJeHNwaS0+dHhfZm4gPSB4c3BpX3R4ODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS14dGVuc2EteHRmcGdhLmMgYi9kcml2ZXJzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTE1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGkteHRlbnNhLXh0ZnBnYS5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogWHRlbnNhIHh0ZnBnYSBTUEkgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisjZGVmaW5lIFhURlBHQV9TUElfTkFNRSAieHRmcGdhX3NwaSIKKworI2RlZmluZSBYVEZQR0FfU1BJX1NUQVJUCTB4MAorI2RlZmluZSBYVEZQR0FfU1BJX0JVU1kJCTB4NAorI2RlZmluZSBYVEZQR0FfU1BJX0RBVEEJCTB4OAorCisjZGVmaW5lIEJVU1lfV0FJVF9VUwkJMTAwCisKK3N0cnVjdCB4dGZwZ2Ffc3BpIHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdTMyIGRhdGE7CisJdW5zaWduZWQgZGF0YV9zejsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4dGZwZ2Ffc3BpX3dyaXRlMzIoY29uc3Qgc3RydWN0IHh0ZnBnYV9zcGkgKnNwaSwKKwkJCQkgICAgICB1bnNpZ25lZCBhZGRyLCB1MzIgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIHNwaS0+cmVncyArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4dGZwZ2Ffc3BpX3JlYWQzMihjb25zdCBzdHJ1Y3QgeHRmcGdhX3NwaSAqc3BpLAorCQkJCQkgICAgIHVuc2lnbmVkIGFkZHIpCit7CisJcmV0dXJuIGlvcmVhZDMyKHNwaS0+cmVncyArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeHRmcGdhX3NwaV93YWl0X2J1c3koc3RydWN0IHh0ZnBnYV9zcGkgKnhzcGkpCit7CisJdW5zaWduZWQgaTsKKwlmb3IgKGkgPSAwOyB4dGZwZ2Ffc3BpX3JlYWQzMih4c3BpLCBYVEZQR0FfU1BJX0JVU1kpICYmCisJICAgICBpIDwgQlVTWV9XQUlUX1VTOyArK2kpCisJCXVkZWxheSgxKTsKKwlXQVJOX09OX09OQ0UoaSA9PSBCVVNZX1dBSVRfVVMpOworfQorCitzdGF0aWMgdTMyIHh0ZnBnYV9zcGlfdHhyeF93b3JkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLAorCQkJCXUzMiB2LCB1OCBiaXRzKQoreworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwl4c3BpLT5kYXRhID0gKHhzcGktPmRhdGEgPDwgYml0cykgfCAodiAmIEdFTk1BU0soYml0cyAtIDEsIDApKTsKKwl4c3BpLT5kYXRhX3N6ICs9IGJpdHM7CisJaWYgKHhzcGktPmRhdGFfc3ogPj0gMTYpIHsKKwkJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfREFUQSwKKwkJCQkgICB4c3BpLT5kYXRhID4+ICh4c3BpLT5kYXRhX3N6IC0gMTYpKTsKKwkJeHNwaS0+ZGF0YV9zeiAtPSAxNjsKKwkJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfU1RBUlQsIDEpOworCQl4dGZwZ2Ffc3BpX3dhaXRfYnVzeSh4c3BpKTsKKwkJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfU1RBUlQsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4dGZwZ2Ffc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlXQVJOX09OKHhzcGktPmRhdGFfc3ogIT0gMCk7CisJeHNwaS0+ZGF0YV9zeiA9IDA7Cit9CisKK3N0YXRpYyBpbnQgeHRmcGdhX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCWludCByZXQ7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB4dGZwZ2Ffc3BpKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJbWFzdGVyLT5mbGFncyA9IFNQSV9NQVNURVJfTk9fUlg7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBTUElfQlBXX1JBTkdFX01BU0soMSwgMTYpOworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmRldi5pZDsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwl4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXhzcGktPmJpdGJhbmcubWFzdGVyID0gbWFzdGVyOworCXhzcGktPmJpdGJhbmcuY2hpcHNlbGVjdCA9IHh0ZnBnYV9zcGlfY2hpcHNlbGVjdDsKKwl4c3BpLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IHh0ZnBnYV9zcGlfdHhyeF93b3JkOworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBtZW1vcnkgcmVzb3VyY2VcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisJeHNwaS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW0pOworCWlmIChJU19FUlIoeHNwaS0+cmVncykpIHsKKwkJcmV0ID0gUFRSX0VSUih4c3BpLT5yZWdzKTsKKwkJZ290byBlcnI7CisJfQorCisJeHRmcGdhX3NwaV93cml0ZTMyKHhzcGksIFhURlBHQV9TUElfU1RBUlQsIDApOworCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwlpZiAoeHRmcGdhX3NwaV9yZWFkMzIoeHNwaSwgWFRGUEdBX1NQSV9CVVNZKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJEZXZpY2Ugc3R1Y2sgaW4gYnVzeSBzdGF0ZVxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJnhzcGktPmJpdGJhbmcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNwaV9iaXRiYW5nX3N0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CisJcmV0dXJuIDA7CitlcnI6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHh0ZnBnYV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB4dGZwZ2Ffc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpX2JpdGJhbmdfc3RvcCgmeHNwaS0+Yml0YmFuZyk7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgWFRGUEdBX1NQSV9OQU1FKTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeHRmcGdhX3NwaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiY2Rucyx4dGZwZ2Etc3BpIiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHh0ZnBnYV9zcGlfb2ZfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHh0ZnBnYV9zcGlfZHJpdmVyID0geworCS5wcm9iZSA9IHh0ZnBnYV9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IHh0ZnBnYV9zcGlfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gWFRGUEdBX1NQSV9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHh0ZnBnYV9zcGlfb2ZfbWF0Y2gpLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4dGZwZ2Ffc3BpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1heCBGaWxpcHBvdiA8amNtdmJrYmNAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4dGVuc2EgeHRmcGdhIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggZDBiMjhiYi4uNGViOWJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CkBAIC0yNTUsMTMgKzI1NywxMiBAQAogc3RhdGljIGludCBzcGlfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3Qgc3BpX2RyaXZlcgkJKnNkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAlpbnQgcmV0OwogCi0JYWNwaV9kZXZfcG1fYXR0YWNoKCZzcGktPmRldiwgdHJ1ZSk7Ci0JcmV0ID0gc2Rydi0+cHJvYmUoc3BpKTsKKwlhY3BpX2Rldl9wbV9hdHRhY2goZGV2LCB0cnVlKTsKKwlyZXQgPSBzZHJ2LT5wcm9iZSh0b19zcGlfZGV2aWNlKGRldikpOwogCWlmIChyZXQpCi0JCWFjcGlfZGV2X3BtX2RldGFjaCgmc3BpLT5kZXYsIHRydWUpOworCQlhY3BpX2Rldl9wbV9kZXRhY2goZGV2LCB0cnVlKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNjksMTEgKzI3MCwxMCBAQAogc3RhdGljIGludCBzcGlfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJY29uc3Qgc3RydWN0IHNwaV9kcml2ZXIJCSpzZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0Jc3RydWN0IHNwaV9kZXZpY2UJCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAJaW50IHJldDsKIAotCXJldCA9IHNkcnYtPnJlbW92ZShzcGkpOwotCWFjcGlfZGV2X3BtX2RldGFjaCgmc3BpLT5kZXYsIHRydWUpOworCXJldCA9IHNkcnYtPnJlbW92ZSh0b19zcGlfZGV2aWNlKGRldikpOworCWFjcGlfZGV2X3BtX2RldGFjaChkZXYsIHRydWUpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU4MCw2ICs1ODAsMTY5IEBACiAJCXNwaS0+bWFzdGVyLT5zZXRfY3Moc3BpLCAhZW5hYmxlKTsKIH0KIAorc3RhdGljIGludCBzcGlfbWFwX2J1ZihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAorCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWNvbnN0IGJvb2wgdm1hbGxvY2VkX2J1ZiA9IGlzX3ZtYWxsb2NfYWRkcihidWYpOworCWNvbnN0IGludCBkZXNjX2xlbiA9IHZtYWxsb2NlZF9idWYgPyBQQUdFX1NJWkUgOiBtYXN0ZXItPm1heF9kbWFfbGVuOworCWNvbnN0IGludCBzZ3MgPSBESVZfUk9VTkRfVVAobGVuLCBkZXNjX2xlbik7CisJc3RydWN0IHBhZ2UgKnZtX3BhZ2U7CisJdm9pZCAqc2dfYnVmOworCXNpemVfdCBtaW47CisJaW50IGksIHJldDsKKworCXJldCA9IHNnX2FsbG9jX3RhYmxlKHNndCwgc2dzLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2dzOyBpKyspIHsKKwkJbWluID0gbWluX3Qoc2l6ZV90LCBsZW4sIGRlc2NfbGVuKTsKKworCQlpZiAodm1hbGxvY2VkX2J1ZikgeworCQkJdm1fcGFnZSA9IHZtYWxsb2NfdG9fcGFnZShidWYpOworCQkJaWYgKCF2bV9wYWdlKSB7CisJCQkJc2dfZnJlZV90YWJsZShzZ3QpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJc2dfYnVmID0gcGFnZV9hZGRyZXNzKHZtX3BhZ2UpICsKKwkJCQkoKHNpemVfdClidWYgJiB+UEFHRV9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCXNnX2J1ZiA9IGJ1ZjsKKwkJfQorCisJCXNnX3NldF9idWYoJnNndC0+c2dsW2ldLCBzZ19idWYsIG1pbik7CisKKwkJYnVmICs9IG1pbjsKKwkJbGVuIC09IG1pbjsKKwl9CisKKwlyZXQgPSBkbWFfbWFwX3NnKGRldiwgc2d0LT5zZ2wsIHNndC0+bmVudHMsIGRpcik7CisJaWYgKHJldCA8IDApIHsKKwkJc2dfZnJlZV90YWJsZShzZ3QpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNndC0+bmVudHMgPSByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BpX3VubWFwX2J1ZihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBzZ190YWJsZSAqc2d0LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJaWYgKHNndC0+b3JpZ19uZW50cykgeworCQlkbWFfdW5tYXBfc2coZGV2LCBzZ3QtPnNnbCwgc2d0LT5vcmlnX25lbnRzLCBkaXIpOworCQlzZ19mcmVlX3RhYmxlKHNndCk7CisJfQorfQorCitzdGF0aWMgaW50IHNwaV9tYXBfbXNnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBkZXZpY2UgKnR4X2RldiwgKnJ4X2RldjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOworCXZvaWQgKnRtcDsKKwl1bnNpZ25lZCBpbnQgbWF4X3R4LCBtYXhfcng7CisJaW50IHJldDsKKworCWlmIChtYXN0ZXItPmZsYWdzICYgKFNQSV9NQVNURVJfTVVTVF9SWCB8IFNQSV9NQVNURVJfTVVTVF9UWCkpIHsKKwkJbWF4X3R4ID0gMDsKKwkJbWF4X3J4ID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQkJaWYgKChtYXN0ZXItPmZsYWdzICYgU1BJX01BU1RFUl9NVVNUX1RYKSAmJgorCQkJICAgICF4ZmVyLT50eF9idWYpCisJCQkJbWF4X3R4ID0gbWF4KHhmZXItPmxlbiwgbWF4X3R4KTsKKwkJCWlmICgobWFzdGVyLT5mbGFncyAmIFNQSV9NQVNURVJfTVVTVF9SWCkgJiYKKwkJCSAgICAheGZlci0+cnhfYnVmKQorCQkJCW1heF9yeCA9IG1heCh4ZmVyLT5sZW4sIG1heF9yeCk7CisJCX0KKworCQlpZiAobWF4X3R4KSB7CisJCQl0bXAgPSBrcmVhbGxvYyhtYXN0ZXItPmR1bW15X3R4LCBtYXhfdHgsCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJCWlmICghdG1wKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWFzdGVyLT5kdW1teV90eCA9IHRtcDsKKwkJCW1lbXNldCh0bXAsIDAsIG1heF90eCk7CisJCX0KKworCQlpZiAobWF4X3J4KSB7CisJCQl0bXAgPSBrcmVhbGxvYyhtYXN0ZXItPmR1bW15X3J4LCBtYXhfcngsCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJCWlmICghdG1wKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWFzdGVyLT5kdW1teV9yeCA9IHRtcDsKKwkJfQorCisJCWlmIChtYXhfdHggfHwgbWF4X3J4KSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywKKwkJCQkJICAgIHRyYW5zZmVyX2xpc3QpIHsKKwkJCQlpZiAoIXhmZXItPnR4X2J1ZikKKwkJCQkJeGZlci0+dHhfYnVmID0gbWFzdGVyLT5kdW1teV90eDsKKwkJCQlpZiAoIXhmZXItPnJ4X2J1ZikKKwkJCQkJeGZlci0+cnhfYnVmID0gbWFzdGVyLT5kdW1teV9yeDsKKwkJCX0KKwkJfQorCX0KKworCWlmICghbWFzdGVyLT5jYW5fZG1hKQorCQlyZXR1cm4gMDsKKworCXR4X2RldiA9ICZtYXN0ZXItPmRtYV90eC0+ZGV2LT5kZXZpY2U7CisJcnhfZGV2ID0gJm1hc3Rlci0+ZG1hX3J4LT5kZXYtPmRldmljZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWlmICghbWFzdGVyLT5jYW5fZG1hKG1hc3RlciwgbXNnLT5zcGksIHhmZXIpKQorCQkJY29udGludWU7CisKKwkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKSB7CisJCQlyZXQgPSBzcGlfbWFwX2J1ZihtYXN0ZXIsIHR4X2RldiwgJnhmZXItPnR4X3NnLAorCQkJCQkgICh2b2lkICopeGZlci0+dHhfYnVmLCB4ZmVyLT5sZW4sCisJCQkJCSAgRE1BX1RPX0RFVklDRSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTCkgeworCQkJcmV0ID0gc3BpX21hcF9idWYobWFzdGVyLCByeF9kZXYsICZ4ZmVyLT5yeF9zZywKKwkJCQkJICB4ZmVyLT5yeF9idWYsIHhmZXItPmxlbiwKKwkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJc3BpX3VubWFwX2J1ZihtYXN0ZXIsIHR4X2RldiwgJnhmZXItPnR4X3NnLAorCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCisJbWFzdGVyLT5jdXJfbXNnX21hcHBlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGlfdW5tYXBfbXNnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CisJc3RydWN0IGRldmljZSAqdHhfZGV2LCAqcnhfZGV2OworCisJaWYgKCFtYXN0ZXItPmN1cl9tc2dfbWFwcGVkIHx8ICFtYXN0ZXItPmNhbl9kbWEpCisJCXJldHVybiAwOworCisJdHhfZGV2ID0gJm1hc3Rlci0+ZG1hX3R4LT5kZXYtPmRldmljZTsKKwlyeF9kZXYgPSAmbWFzdGVyLT5kbWFfcngtPmRldi0+ZGV2aWNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKCFtYXN0ZXItPmNhbl9kbWEobWFzdGVyLCBtc2ctPnNwaSwgeGZlcikpCisJCQljb250aW51ZTsKKworCQlzcGlfdW5tYXBfYnVmKG1hc3RlciwgcnhfZGV2LCAmeGZlci0+cnhfc2csIERNQV9GUk9NX0RFVklDRSk7CisJCXNwaV91bm1hcF9idWYobWFzdGVyLCB0eF9kZXYsICZ4ZmVyLT50eF9zZywgRE1BX1RPX0RFVklDRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBzcGlfdHJhbnNmZXJfb25lX21lc3NhZ2UgLSBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRyYW5zZmVyX29uZV9tZXNzYWdlKCkKICAqCkBAIC01OTEsOSArNzU0LDkgQEAKIAkJCQkgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQlib29sIGN1cl9jcyA9IHRydWU7CiAJYm9vbCBrZWVwX2NzID0gZmFsc2U7CiAJaW50IHJldCA9IDA7CisJaW50IG1zID0gMTsKIAogCXNwaV9zZXRfY3MobXNnLT5zcGksIHRydWUpOwogCkBAIC02MTEsNyArNzc0LDE2IEBACiAKIAkJaWYgKHJldCA+IDApIHsKIAkJCXJldCA9IDA7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYXN0ZXItPnhmZXJfY29tcGxldGlvbik7CisJCQltcyA9IHhmZXItPmxlbiAqIDggKiAxMDAwIC8geGZlci0+c3BlZWRfaHo7CisJCQltcyArPSAxMDsgLyogc29tZSB0b2xlcmFuY2UgKi8KKworCQkJbXMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1hc3Rlci0+eGZlcl9jb21wbGV0aW9uLAorCQkJCQkJCSBtc2Vjc190b19qaWZmaWVzKG1zKSk7CisJCX0KKworCQlpZiAobXMgPT0gMCkgeworCQkJZGV2X2VycigmbXNnLT5zcGktPmRldiwgIlNQSSB0cmFuc2ZlciB0aW1lZCBvdXRcbiIpOworCQkJbXNnLT5zdGF0dXMgPSAtRVRJTUVET1VUOwogCQl9CiAKIAkJdHJhY2Vfc3BpX3RyYW5zZmVyX3N0b3AobXNnLCB4ZmVyKTsKQEAgLTYyNyw4ICs3OTksOSBAQAogCQkJCQkgJm1zZy0+dHJhbnNmZXJzKSkgewogCQkJCWtlZXBfY3MgPSB0cnVlOwogCQkJfSBlbHNlIHsKLQkJCQljdXJfY3MgPSAhY3VyX2NzOwotCQkJCXNwaV9zZXRfY3MobXNnLT5zcGksIGN1cl9jcyk7CisJCQkJc3BpX3NldF9jcyhtc2ctPnNwaSwgZmFsc2UpOworCQkJCXVkZWxheSgxMCk7CisJCQkJc3BpX3NldF9jcyhtc2ctPnNwaSwgdHJ1ZSk7CiAJCQl9CiAJCX0KIApAQCAtNjg2LDYgKzg1OSwxMCBAQAogCQl9CiAJCW1hc3Rlci0+YnVzeSA9IGZhbHNlOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJa2ZyZWUobWFzdGVyLT5kdW1teV9yeCk7CisJCW1hc3Rlci0+ZHVtbXlfcnggPSBOVUxMOworCQlrZnJlZShtYXN0ZXItPmR1bW15X3R4KTsKKwkJbWFzdGVyLT5kdW1teV90eCA9IE5VTEw7CiAJCWlmIChtYXN0ZXItPnVucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZSAmJgogCQkgICAgbWFzdGVyLT51bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUobWFzdGVyKSkKIAkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LApAQCAtNzUyLDYgKzkyOSwxMyBAQAogCQltYXN0ZXItPmN1cl9tc2dfcHJlcGFyZWQgPSB0cnVlOwogCX0KIAorCXJldCA9IHNwaV9tYXBfbXNnKG1hc3RlciwgbWFzdGVyLT5jdXJfbXNnKTsKKwlpZiAocmV0KSB7CisJCW1hc3Rlci0+Y3VyX21zZy0+c3RhdHVzID0gcmV0OworCQlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7CisJCXJldHVybjsKKwl9CisKIAlyZXQgPSBtYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlKG1hc3RlciwgbWFzdGVyLT5jdXJfbXNnKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LApAQCAtODM5LDYgKzEwMjMsOCBAQAogCXF1ZXVlX2t0aHJlYWRfd29yaygmbWFzdGVyLT5rd29ya2VyLCAmbWFzdGVyLT5wdW1wX21lc3NhZ2VzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAorCXNwaV91bm1hcF9tc2cobWFzdGVyLCBtZXNnKTsKKwogCWlmIChtYXN0ZXItPmN1cl9tc2dfcHJlcGFyZWQgJiYgbWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZSkgewogCQlyZXQgPSBtYXN0ZXItPnVucHJlcGFyZV9tZXNzYWdlKG1hc3RlciwgbWVzZyk7CiAJCWlmIChyZXQpIHsKQEAgLTg5Miw3ICsxMDc4LDcgQEAKIAkgKi8KIAl3aGlsZSAoKCFsaXN0X2VtcHR5KCZtYXN0ZXItPnF1ZXVlKSB8fCBtYXN0ZXItPmJ1c3kpICYmIGxpbWl0LS0pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCW1zbGVlcCgxMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJfQogCkBAIC0xMzcyLDYgKzE1NTgsOCBAQAogCW11dGV4X2luaXQoJm1hc3Rlci0+YnVzX2xvY2tfbXV0ZXgpOwogCW1hc3Rlci0+YnVzX2xvY2tfZmxhZyA9IDA7CiAJaW5pdF9jb21wbGV0aW9uKCZtYXN0ZXItPnhmZXJfY29tcGxldGlvbik7CisJaWYgKCFtYXN0ZXItPm1heF9kbWFfbGVuKQorCQltYXN0ZXItPm1heF9kbWFfbGVuID0gSU5UX01BWDsKIAogCS8qIHJlZ2lzdGVyIHRoZSBkZXZpY2UsIHRoZW4gdXNlcnNwYWNlIHdpbGwgc2VlIGl0LgogCSAqIHJlZ2lzdHJhdGlvbiBmYWlscyBpZiB0aGUgYnVzIElEIGlzIGluIHVzZS4KQEAgLTE1OTcsNiArMTc4NSw5IEBACiAJaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCiAJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CiAKKwlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQorCQlzcGktPm1heF9zcGVlZF9oeiA9IHNwaS0+bWFzdGVyLT5tYXhfc3BlZWRfaHo7CisKIAlpZiAoc3BpLT5tYXN0ZXItPnNldHVwKQogCQlzdGF0dXMgPSBzcGktPm1hc3Rlci0+c2V0dXAoc3BpKTsKIApAQCAtMTYxNywxMSArMTgwOCwxMCBAQAogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGktPm1hc3RlcjsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOworCWludCB3X3NpemU7CiAKIAlpZiAobGlzdF9lbXB0eSgmbWVzc2FnZS0+dHJhbnNmZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFtZXNzYWdlLT5jb21wbGV0ZSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBIYWxmLWR1cGxleCBsaW5rcyBpbmNsdWRlIG9yaWdpbmFsIE1pY3JvV2lyZSwgYW5kIG9uZXMgd2l0aAogCSAqIG9ubHkgb25lIGRhdGEgcGluIGxpa2UgU1BJXzNXSVJFIChzd2l0Y2hlcyBkaXJlY3Rpb24pIG9yIHdoZXJlCkBAIC0xNjUyLDEyICsxODQyLDEzIEBACiAJCW1lc3NhZ2UtPmZyYW1lX2xlbmd0aCArPSB4ZmVyLT5sZW47CiAJCWlmICgheGZlci0+Yml0c19wZXJfd29yZCkKIAkJCXhmZXItPmJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JCWlmICgheGZlci0+c3BlZWRfaHopIHsKKworCQlpZiAoIXhmZXItPnNwZWVkX2h6KQogCQkJeGZlci0+c3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oejsKLQkJCWlmIChtYXN0ZXItPm1heF9zcGVlZF9oeiAmJgotCQkJICAgIHhmZXItPnNwZWVkX2h6ID4gbWFzdGVyLT5tYXhfc3BlZWRfaHopCi0JCQkJeGZlci0+c3BlZWRfaHogPSBtYXN0ZXItPm1heF9zcGVlZF9oejsKLQkJfQorCisJCWlmIChtYXN0ZXItPm1heF9zcGVlZF9oeiAmJgorCQkgICAgeGZlci0+c3BlZWRfaHogPiBtYXN0ZXItPm1heF9zcGVlZF9oeikKKwkJCXhmZXItPnNwZWVkX2h6ID0gbWFzdGVyLT5tYXhfc3BlZWRfaHo7CiAKIAkJaWYgKG1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrKSB7CiAJCQkvKiBPbmx5IDMyIGJpdHMgZml0IGluIHRoZSBtYXNrICovCkBAIC0xNjY4LDEyICsxODU5LDI0IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAorCQkvKgorCQkgKiBTUEkgdHJhbnNmZXIgbGVuZ3RoIHNob3VsZCBiZSBtdWx0aXBsZSBvZiBTUEkgd29yZCBzaXplCisJCSAqIHdoZXJlIFNQSSB3b3JkIHNpemUgc2hvdWxkIGJlIHBvd2VyLW9mLXR3byBtdWx0aXBsZQorCQkgKi8KKwkJaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJCXdfc2l6ZSA9IDE7CisJCWVsc2UgaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gMTYpCisJCQl3X3NpemUgPSAyOworCQllbHNlCisJCQl3X3NpemUgPSA0OworCisJCS8qIE5vIHBhcnRpYWwgdHJhbnNmZXJzIGFjY2VwdGVkICovCisJCWlmICh4ZmVyLT5sZW4gJSB3X3NpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQlpZiAoeGZlci0+c3BlZWRfaHogJiYgbWFzdGVyLT5taW5fc3BlZWRfaHogJiYKIAkJICAgIHhmZXItPnNwZWVkX2h6IDwgbWFzdGVyLT5taW5fc3BlZWRfaHopCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHhmZXItPnNwZWVkX2h6ICYmIG1hc3Rlci0+bWF4X3NwZWVkX2h6ICYmCi0JCSAgICB4ZmVyLT5zcGVlZF9oeiA+IG1hc3Rlci0+bWF4X3NwZWVkX2h6KQotCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKHhmZXItPnR4X2J1ZiAmJiAheGZlci0+dHhfbmJpdHMpCiAJCQl4ZmVyLT50eF9uYml0cyA9IFNQSV9OQklUU19TSU5HTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlkZXYuYyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCmluZGV4IGQ3YzZlMzYuLmUzYmMyM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaWRldi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCkBAIC03Myw3ICs3Myw4IEBACiAgKi8KICNkZWZpbmUgU1BJX01PREVfTUFTSwkJKFNQSV9DUEhBIHwgU1BJX0NQT0wgfCBTUElfQ1NfSElHSCBcCiAJCQkJfCBTUElfTFNCX0ZJUlNUIHwgU1BJXzNXSVJFIHwgU1BJX0xPT1AgXAotCQkJCXwgU1BJX05PX0NTIHwgU1BJX1JFQURZKQorCQkJCXwgU1BJX05PX0NTIHwgU1BJX1JFQURZIHwgU1BJX1RYX0RVQUwgXAorCQkJCXwgU1BJX1RYX1FVQUQgfCBTUElfUlhfRFVBTCB8IFNQSV9SWF9RVUFEKQogCiBzdHJ1Y3Qgc3BpZGV2X2RhdGEgewogCWRldl90CQkJZGV2dDsKQEAgLTI2NSw2ICsyNjYsOCBAQAogCQlidWYgKz0ga190bXAtPmxlbjsKIAogCQlrX3RtcC0+Y3NfY2hhbmdlID0gISF1X3RtcC0+Y3NfY2hhbmdlOworCQlrX3RtcC0+dHhfbmJpdHMgPSB1X3RtcC0+dHhfbmJpdHM7CisJCWtfdG1wLT5yeF9uYml0cyA9IHVfdG1wLT5yeF9uYml0czsKIAkJa190bXAtPmJpdHNfcGVyX3dvcmQgPSB1X3RtcC0+Yml0c19wZXJfd29yZDsKIAkJa190bXAtPmRlbGF5X3VzZWNzID0gdV90bXAtPmRlbGF5X3VzZWNzOwogCQlrX3RtcC0+c3BlZWRfaHogPSB1X3RtcC0+c3BlZWRfaHo7CkBAIC0zNTksNiArMzYyLDEwIEBACiAJCXJldHZhbCA9IF9fcHV0X3VzZXIoc3BpLT5tb2RlICYgU1BJX01PREVfTUFTSywKIAkJCQkJKF9fdTggX191c2VyICopYXJnKTsKIAkJYnJlYWs7CisJY2FzZSBTUElfSU9DX1JEX01PREUzMjoKKwkJcmV0dmFsID0gX19wdXRfdXNlcihzcGktPm1vZGUgJiBTUElfTU9ERV9NQVNLLAorCQkJCQkoX191MzIgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CiAJY2FzZSBTUElfSU9DX1JEX0xTQl9GSVJTVDoKIAkJcmV0dmFsID0gX19wdXRfdXNlcigoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgPyAgMSA6IDAsCiAJCQkJCShfX3U4IF9fdXNlciAqKWFyZyk7CkBAIC0zNzIsOSArMzc5LDEzIEBACiAKIAkvKiB3cml0ZSByZXF1ZXN0cyAqLwogCWNhc2UgU1BJX0lPQ19XUl9NT0RFOgotCQlyZXR2YWwgPSBfX2dldF91c2VyKHRtcCwgKHU4IF9fdXNlciAqKWFyZyk7CisJY2FzZSBTUElfSU9DX1dSX01PREUzMjoKKwkJaWYgKGNtZCA9PSBTUElfSU9DX1dSX01PREUpCisJCQlyZXR2YWwgPSBfX2dldF91c2VyKHRtcCwgKHU4IF9fdXNlciAqKWFyZyk7CisJCWVsc2UKKwkJCXJldHZhbCA9IF9fZ2V0X3VzZXIodG1wLCAodTMyIF9fdXNlciAqKWFyZyk7CiAJCWlmIChyZXR2YWwgPT0gMCkgewotCQkJdTgJc2F2ZSA9IHNwaS0+bW9kZTsKKwkJCXUzMglzYXZlID0gc3BpLT5tb2RlOwogCiAJCQlpZiAodG1wICYgflNQSV9NT0RFX01BU0spIHsKIAkJCQlyZXR2YWwgPSAtRUlOVkFMOwpAQCAtMzgyLDE4ICszOTMsMTggQEAKIAkJCX0KIAogCQkJdG1wIHw9IHNwaS0+bW9kZSAmIH5TUElfTU9ERV9NQVNLOwotCQkJc3BpLT5tb2RlID0gKHU4KXRtcDsKKwkJCXNwaS0+bW9kZSA9ICh1MTYpdG1wOwogCQkJcmV0dmFsID0gc3BpX3NldHVwKHNwaSk7CiAJCQlpZiAocmV0dmFsIDwgMCkKIAkJCQlzcGktPm1vZGUgPSBzYXZlOwogCQkJZWxzZQotCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAic3BpIG1vZGUgJTAyeFxuIiwgdG1wKTsKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgInNwaSBtb2RlICV4XG4iLCB0bXApOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU1BJX0lPQ19XUl9MU0JfRklSU1Q6CiAJCXJldHZhbCA9IF9fZ2V0X3VzZXIodG1wLCAoX191OCBfX3VzZXIgKilhcmcpOwogCQlpZiAocmV0dmFsID09IDApIHsKLQkJCXU4CXNhdmUgPSBzcGktPm1vZGU7CisJCQl1MzIJc2F2ZSA9IHNwaS0+bW9kZTsKIAogCQkJaWYgKHRtcCkKIAkJCQlzcGktPm1vZGUgfD0gU1BJX0xTQl9GSVJTVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BtaS9LY29uZmlnIGIvZHJpdmVycy9zcG1pL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BtaS9LY29uZmlnCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgU1BNSSBkcml2ZXIgY29uZmlndXJhdGlvbgorIworbWVudWNvbmZpZyBTUE1JCisJdHJpc3RhdGUgIlNQTUkgc3VwcG9ydCIKKwloZWxwCisJICBTUE1JIChTeXN0ZW0gUG93ZXIgTWFuYWdlbWVudCBJbnRlcmZhY2UpIGlzIGEgdHdvLXdpcmUKKwkgIHNlcmlhbCBpbnRlcmZhY2UgYmV0d2VlbiBiYXNlYmFuZCBhbmQgYXBwbGljYXRpb24gcHJvY2Vzc29ycworCSAgYW5kIFBvd2VyIE1hbmFnZW1lbnQgSW50ZWdyYXRlZCBDaXJjdWl0cyAoUE1JQykuCisKK2lmIFNQTUkKKworY29uZmlnIFNQTUlfTVNNX1BNSUNfQVJCCisJdHJpc3RhdGUgIlF1YWxjb21tIE1TTSBTUE1JIENvbnRyb2xsZXIgKFBNSUMgQXJiaXRlcikiCisJZGVwZW5kcyBvbiBBUk0KKwlkZXBlbmRzIG9uIElSUV9ET01BSU4KKwlkZXBlbmRzIG9uIEFSQ0hfUUNPTSB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSQ0hfUUNPTQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQorCSAgYnVpbHQtaW4gU1BNSSBQTUlDIEFyYml0ZXIgaW50ZXJmYWNlIG9uIFF1YWxjb21tIE1TTSBmYW1pbHkKKwkgIHByb2Nlc3NvcnMuCisKKwkgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBRdWFsY29tbSBQTUlDcyBhbmQKKwkgIG90aGVyIGRldmljZXMgdGhhdCBoYXZlIHRoZSBTUE1JIGludGVyZmFjZS4KKworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BtaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BtaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc1MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcG1pL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3Iga2VybmVsIFNQTUkgZnJhbWV3b3JrLgorIworb2JqLSQoQ09ORklHX1NQTUkpCSs9IHNwbWkubworCitvYmotJChDT05GSUdfU1BNSV9NU01fUE1JQ19BUkIpCSs9IHNwbWktcG1pYy1hcmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcG1pL3NwbWktcG1pYy1hcmIuYyBiL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZTAzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMKQEAgLTAsMCArMSw3NzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcG1pLmg+CisKKy8qIFBNSUMgQXJiaXRlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBQTUlDX0FSQl9WRVJTSU9OCQkweDAwMDAKKyNkZWZpbmUgUE1JQ19BUkJfSU5UX0VOCQkJMHgwMDA0CisKKy8qIFBNSUMgQXJiaXRlciBjaGFubmVsIHJlZ2lzdGVycyAqLworI2RlZmluZSBQTUlDX0FSQl9DTUQoTikJCQkoMHgwODAwICsgKDB4ODAgKiAoTikpKQorI2RlZmluZSBQTUlDX0FSQl9DT05GSUcoTikJCSgweDA4MDQgKyAoMHg4MCAqIChOKSkpCisjZGVmaW5lIFBNSUNfQVJCX1NUQVRVUyhOKQkJKDB4MDgwOCArICgweDgwICogKE4pKSkKKyNkZWZpbmUgUE1JQ19BUkJfV0RBVEEwKE4pCQkoMHgwODEwICsgKDB4ODAgKiAoTikpKQorI2RlZmluZSBQTUlDX0FSQl9XREFUQTEoTikJCSgweDA4MTQgKyAoMHg4MCAqIChOKSkpCisjZGVmaW5lIFBNSUNfQVJCX1JEQVRBMChOKQkJKDB4MDgxOCArICgweDgwICogKE4pKSkKKyNkZWZpbmUgUE1JQ19BUkJfUkRBVEExKE4pCQkoMHgwODFDICsgKDB4ODAgKiAoTikpKQorCisvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworI2RlZmluZSBTUE1JX1BJQ19PV05FUl9BQ0NfU1RBVFVTKE0sIE4pCSgweDAwMDAgKyAoKDMyICogKE0pKSArICg0ICogKE4pKSkpCisjZGVmaW5lIFNQTUlfUElDX0FDQ19FTkFCTEUoTikJCSgweDAyMDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfUElDX0lSUV9TVEFUVVMoTikJCSgweDA2MDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfUElDX0lSUV9DTEVBUihOKQkJKDB4MEEwMCArICg0ICogKE4pKSkKKworLyogTWFwcGluZyBUYWJsZSAqLworI2RlZmluZSBTUE1JX01BUFBJTkdfVEFCTEVfUkVHKE4pCSgweDBCMDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfTUFQUElOR19CSVRfSU5ERVgoWCkJKCgoWCkgPj4gMTgpICYgMHhGKQorI2RlZmluZSBTUE1JX01BUFBJTkdfQklUX0lTXzBfRkxBRyhYKQkoKChYKSA+PiAxNykgJiAweDEpCisjZGVmaW5lIFNQTUlfTUFQUElOR19CSVRfSVNfMF9SRVNVTFQoWCkJKCgoWCkgPj4gOSkgJiAweEZGKQorI2RlZmluZSBTUE1JX01BUFBJTkdfQklUX0lTXzFfRkxBRyhYKQkoKChYKSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgU1BNSV9NQVBQSU5HX0JJVF9JU18xX1JFU1VMVChYKQkoKChYKSA+PiAwKSAmIDB4RkYpCisKKyNkZWZpbmUgU1BNSV9NQVBQSU5HX1RBQkxFX0xFTgkJMjU1CisjZGVmaW5lIFNQTUlfTUFQUElOR19UQUJMRV9UUkVFX0RFUFRICTE2CS8qIE1heGltdW0gb2YgMTYtYml0cyAqLworCisvKiBPd25lcnNoaXAgVGFibGUgKi8KKyNkZWZpbmUgU1BNSV9PV05FUlNISVBfVEFCTEVfUkVHKE4pCSgweDA3MDAgKyAoNCAqIChOKSkpCisjZGVmaW5lIFNQTUlfT1dORVJTSElQX1BFUklQSDJPV05FUihYKQkoKFgpICYgMHg3KQorCisvKiBDaGFubmVsIFN0YXR1cyBmaWVsZHMgKi8KK2VudW0gcG1pY19hcmJfY2hubF9zdGF0dXMgeworCVBNSUNfQVJCX1NUQVRVU19ET05FCT0gKDEgPDwgMCksCisJUE1JQ19BUkJfU1RBVFVTX0ZBSUxVUkUJPSAoMSA8PCAxKSwKKwlQTUlDX0FSQl9TVEFUVVNfREVOSUVECT0gKDEgPDwgMiksCisJUE1JQ19BUkJfU1RBVFVTX0RST1BQRUQJPSAoMSA8PCAzKSwKK307CisKKy8qIENvbW1hbmQgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIFBNSUNfQVJCX0NNRF9NQVhfQllURV9DT1VOVAk4CisKKy8qIENvbW1hbmQgT3Bjb2RlcyAqLworZW51bSBwbWljX2FyYl9jbWRfb3BfY29kZSB7CisJUE1JQ19BUkJfT1BfRVhUX1dSSVRFTCA9IDAsCisJUE1JQ19BUkJfT1BfRVhUX1JFQURMID0gMSwKKwlQTUlDX0FSQl9PUF9FWFRfV1JJVEUgPSAyLAorCVBNSUNfQVJCX09QX1JFU0VUID0gMywKKwlQTUlDX0FSQl9PUF9TTEVFUCA9IDQsCisJUE1JQ19BUkJfT1BfU0hVVERPV04gPSA1LAorCVBNSUNfQVJCX09QX1dBS0VVUCA9IDYsCisJUE1JQ19BUkJfT1BfQVVUSEVOVElDQVRFID0gNywKKwlQTUlDX0FSQl9PUF9NU1RSX1JFQUQgPSA4LAorCVBNSUNfQVJCX09QX01TVFJfV1JJVEUgPSA5LAorCVBNSUNfQVJCX09QX0VYVF9SRUFEID0gMTMsCisJUE1JQ19BUkJfT1BfV1JJVEUgPSAxNCwKKwlQTUlDX0FSQl9PUF9SRUFEID0gMTUsCisJUE1JQ19BUkJfT1BfWkVST19XUklURSA9IDE2LAorfTsKKworLyogTWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydCBQTUlDIHBlcmlwaGVyYWxzICovCisjZGVmaW5lIFBNSUNfQVJCX01BWF9QRVJJUEhTCQkyNTYKKyNkZWZpbmUgUE1JQ19BUkJfUEVSSVBIX0lEX1ZBTElECSgxIDw8IDE1KQorI2RlZmluZSBQTUlDX0FSQl9USU1FT1VUX1VTCQkxMDAKKyNkZWZpbmUgUE1JQ19BUkJfTUFYX1RSQU5TX0JZVEVTCSg4KQorCisjZGVmaW5lIFBNSUNfQVJCX0FQSURfTUFTSwkJMHhGRgorI2RlZmluZSBQTUlDX0FSQl9QUElEX01BU0sJCTB4RkZGCisKKy8qIGludGVycnVwdCBlbmFibGUgYml0ICovCisjZGVmaW5lIFNQTUlfUElDX0FDQ19FTkFCTEVfQklUCQlCSVQoMCkKKworLyoqCisgKiBzcG1pX3BtaWNfYXJiX2RldiAtIFNQTUkgUE1JQyBBcmJpdGVyIG9iamVjdAorICoKKyAqIEBiYXNlOgkJYWRkcmVzcyBvZiB0aGUgUE1JQyBBcmJpdGVyIGNvcmUgcmVnaXN0ZXJzLgorICogQGludHI6CQlhZGRyZXNzIG9mIHRoZSBTUE1JIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVycy4KKyAqIEBjbmZnOgkJYWRkcmVzcyBvZiB0aGUgUE1JQyBBcmJpdGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICogQGxvY2s6CQlsb2NrIHRvIHN5bmNocm9uaXplIGFjY2Vzc2VzLgorICogQGNoYW5uZWw6CQl3aGljaCBjaGFubmVsIHRvIHVzZSBmb3IgYWNjZXNzZXMuCisgKiBAaXJxOgkJUE1JQyBBUkIgaW50ZXJydXB0LgorICogQGVlOgkJCXRoZSBjdXJyZW50IEV4ZWN1dGlvbiBFbnZpcm9ubWVudAorICogQG1pbl9hcGlkOgkJbWluaW11bSBBUElEICh1c2VkIGZvciBib3VuZGluZyBJUlEgc2VhcmNoKQorICogQG1heF9hcGlkOgkJbWF4aW11bSBBUElECisgKiBAbWFwcGluZ190YWJsZToJaW4tbWVtb3J5IGNvcHkgb2YgUFBJRCAtPiBBUElEIG1hcHBpbmcgdGFibGUuCisgKiBAZG9tYWluOgkJaXJxIGRvbWFpbiBvYmplY3QgZm9yIFBNSUMgSVJRIGRvbWFpbgorICogQHNwbWljOgkJU1BNSSBjb250cm9sbGVyIG9iamVjdAorICogQGFwaWRfdG9fcHBpZDoJY2FjaGVkIG1hcHBpbmcgZnJvbSBBUElEIHRvIFBQSUQKKyAqLworc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2IHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXZvaWQgX19pb21lbQkJKmludHI7CisJdm9pZCBfX2lvbWVtCQkqY25mZzsKKwlyYXdfc3BpbmxvY2tfdAkJbG9jazsKKwl1OAkJCWNoYW5uZWw7CisJaW50CQkJaXJxOworCXU4CQkJZWU7CisJdTgJCQltaW5fYXBpZDsKKwl1OAkJCW1heF9hcGlkOworCXUzMgkJCW1hcHBpbmdfdGFibGVbU1BNSV9NQVBQSU5HX1RBQkxFX0xFTl07CisJc3RydWN0IGlycV9kb21haW4JKmRvbWFpbjsKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyCSpzcG1pYzsKKwl1MTYJCQlhcGlkX3RvX3BwaWRbMjU2XTsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBtaWNfYXJiX2Jhc2VfcmVhZChzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZChkZXYtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1pY19hcmJfYmFzZV93cml0ZShzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiwKKwkJCQkgICAgICAgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGRldi0+YmFzZSArIG9mZnNldCk7Cit9CisKKy8qKgorICogcGFfcmVhZF9kYXRhOiByZWFkcyBwbWljLWFyYidzIHJlZ2lzdGVyIGFuZCBjb3B5IDEuLjQgYnl0ZXMgdG8gYnVmCisgKiBAYmM6CQlieXRlIGNvdW50IC0xLiByYW5nZTogMC4uMworICogQHJlZzoJcmVnaXN0ZXIncyBhZGRyZXNzCisgKiBAYnVmOglvdXRwdXQgcGFyYW1ldGVyLCBsZW5ndGggbXVzdCBiZSBiYyArIDEKKyAqLworc3RhdGljIHZvaWQgcGFfcmVhZF9kYXRhKHN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqZGV2LCB1OCAqYnVmLCB1MzIgcmVnLCB1OCBiYykKK3sKKwl1MzIgZGF0YSA9IHBtaWNfYXJiX2Jhc2VfcmVhZChkZXYsIHJlZyk7CisJbWVtY3B5KGJ1ZiwgJmRhdGEsIChiYyAmIDMpICsgMSk7Cit9CisKKy8qKgorICogcGFfd3JpdGVfZGF0YTogd3JpdGUgMS4uNCBieXRlcyBmcm9tIGJ1ZiB0byBwbWljLWFyYidzIHJlZ2lzdGVyCisgKiBAYmM6CQlieXRlLWNvdW50IC0xLiByYW5nZTogMC4uMy4KKyAqIEByZWc6CXJlZ2lzdGVyJ3MgYWRkcmVzcy4KKyAqIEBidWY6CWJ1ZmZlciB0byB3cml0ZS4gbGVuZ3RoIG11c3QgYmUgYmMgKyAxLgorICovCitzdGF0aWMgdm9pZAorcGFfd3JpdGVfZGF0YShzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiwgY29uc3QgdTggKmJ1ZiwgdTMyIHJlZywgdTggYmMpCit7CisJdTMyIGRhdGEgPSAwOworCW1lbWNweSgmZGF0YSwgYnVmLCAoYmMgJiAzKSArIDEpOworCXBtaWNfYXJiX2Jhc2Vfd3JpdGUoZGV2LCByZWcsIGRhdGEpOworfQorCitzdGF0aWMgaW50IHBtaWNfYXJiX3dhaXRfZm9yX2RvbmUoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKmRldiA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwl1MzIgc3RhdHVzID0gMDsKKwl1MzIgdGltZW91dCA9IFBNSUNfQVJCX1RJTUVPVVRfVVM7CisJdTMyIG9mZnNldCA9IFBNSUNfQVJCX1NUQVRVUyhkZXYtPmNoYW5uZWwpOworCisJd2hpbGUgKHRpbWVvdXQtLSkgeworCQlzdGF0dXMgPSBwbWljX2FyYl9iYXNlX3JlYWQoZGV2LCBvZmZzZXQpOworCisJCWlmIChzdGF0dXMgJiBQTUlDX0FSQl9TVEFUVVNfRE9ORSkgeworCQkJaWYgKHN0YXR1cyAmIFBNSUNfQVJCX1NUQVRVU19ERU5JRUQpIHsKKwkJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJCSIlczogdHJhbnNhY3Rpb24gZGVuaWVkICgweCV4KVxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKworCQkJaWYgKHN0YXR1cyAmIFBNSUNfQVJCX1NUQVRVU19GQUlMVVJFKSB7CisJCQkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJCQkiJXM6IHRyYW5zYWN0aW9uIGZhaWxlZCAoMHgleClcbiIsCisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCisJCQlpZiAoc3RhdHVzICYgUE1JQ19BUkJfU1RBVFVTX0RST1BQRUQpIHsKKwkJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJCSIlczogdHJhbnNhY3Rpb24gZHJvcHBlZCAoMHgleClcbiIsCisJCQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCisJCQlyZXR1cm4gMDsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCisJZGV2X2VycigmY3RybC0+ZGV2LAorCQkiJXM6IHRpbWVvdXQsIHN0YXR1cyAweCV4XG4iLAorCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogTm9uLWRhdGEgY29tbWFuZCAqLworc3RhdGljIGludCBwbWljX2FyYl9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3BjLCB1OCBzaWQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwbWljX2FyYiA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjbWQ7CisJaW50IHJjOworCisJLyogQ2hlY2sgZm9yIHZhbGlkIG5vbi1kYXRhIGNvbW1hbmQgKi8KKwlpZiAob3BjIDwgU1BNSV9DTURfUkVTRVQgfHwgb3BjID4gU1BNSV9DTURfV0FLRVVQKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZCA9ICgob3BjIHwgMHg0MCkgPDwgMjcpIHwgKChzaWQgJiAweGYpIDw8IDIwKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG1pY19hcmItPmxvY2ssIGZsYWdzKTsKKwlwbWljX2FyYl9iYXNlX3dyaXRlKHBtaWNfYXJiLCBQTUlDX0FSQl9DTUQocG1pY19hcmItPmNoYW5uZWwpLCBjbWQpOworCXJjID0gcG1pY19hcmJfd2FpdF9mb3JfZG9uZShjdHJsKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1pY19hcmItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbWljX2FyYl9yZWFkX2NtZChzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGMsIHU4IHNpZCwKKwkJCSAgICAgdTE2IGFkZHIsIHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwbWljX2FyYiA9IHNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjdHJsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGJjID0gbGVuIC0gMTsKKwl1MzIgY21kOworCWludCByYzsKKworCWlmIChiYyA+PSBQTUlDX0FSQl9NQVhfVFJBTlNfQllURVMpIHsKKwkJZGV2X2VycigmY3RybC0+ZGV2LAorCQkJInBtaWMtYXJiIHN1cHBvcnRzIDEuLiVkIGJ5dGVzIHBlciB0cmFucywgYnV0ICVkIHJlcXVlc3RlZCIsCisJCQlQTUlDX0FSQl9NQVhfVFJBTlNfQllURVMsIGxlbik7CisJCXJldHVybiAgLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayB0aGUgb3Bjb2RlICovCisJaWYgKG9wYyA+PSAweDYwICYmIG9wYyA8PSAweDdGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9SRUFEOworCWVsc2UgaWYgKG9wYyA+PSAweDIwICYmIG9wYyA8PSAweDJGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9FWFRfUkVBRDsKKwllbHNlIGlmIChvcGMgPj0gMHgzOCAmJiBvcGMgPD0gMHgzRikKKwkJb3BjID0gUE1JQ19BUkJfT1BfRVhUX1JFQURMOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbWQgPSAob3BjIDw8IDI3KSB8ICgoc2lkICYgMHhmKSA8PCAyMCkgfCAoYWRkciA8PCA0KSB8IChiYyAmIDB4Nyk7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtaWNfYXJiLT5sb2NrLCBmbGFncyk7CisJcG1pY19hcmJfYmFzZV93cml0ZShwbWljX2FyYiwgUE1JQ19BUkJfQ01EKHBtaWNfYXJiLT5jaGFubmVsKSwgY21kKTsKKwlyYyA9IHBtaWNfYXJiX3dhaXRfZm9yX2RvbmUoY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGRvbmU7CisKKwlwYV9yZWFkX2RhdGEocG1pY19hcmIsIGJ1ZiwgUE1JQ19BUkJfUkRBVEEwKHBtaWNfYXJiLT5jaGFubmVsKSwKKwkJICAgICBtaW5fdCh1OCwgYmMsIDMpKTsKKworCWlmIChiYyA+IDMpCisJCXBhX3JlYWRfZGF0YShwbWljX2FyYiwgYnVmICsgNCwKKwkJCQlQTUlDX0FSQl9SREFUQTEocG1pY19hcmItPmNoYW5uZWwpLCBiYyAtIDQpOworCitkb25lOgorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWljX2FyYi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbWljX2FyYl93cml0ZV9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3BjLCB1OCBzaWQsCisJCQkgICAgICB1MTYgYWRkciwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBtaWNfYXJiID0gc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKGN0cmwpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggYmMgPSBsZW4gLSAxOworCXUzMiBjbWQ7CisJaW50IHJjOworCisJaWYgKGJjID49IFBNSUNfQVJCX01BWF9UUkFOU19CWVRFUykgeworCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkicG1pYy1hcmIgc3VwcG9ydHMgMS4uJWQgYnl0ZXMgcGVyIHRyYW5zLCBidXQ6JWQgcmVxdWVzdGVkIiwKKwkJCVBNSUNfQVJCX01BWF9UUkFOU19CWVRFUywgbGVuKTsKKwkJcmV0dXJuICAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHRoZSBvcGNvZGUgKi8KKwlpZiAob3BjID49IDB4NDAgJiYgb3BjIDw9IDB4NUYpCisJCW9wYyA9IFBNSUNfQVJCX09QX1dSSVRFOworCWVsc2UgaWYgKG9wYyA+PSAweDAwICYmIG9wYyA8PSAweDBGKQorCQlvcGMgPSBQTUlDX0FSQl9PUF9FWFRfV1JJVEU7CisJZWxzZSBpZiAob3BjID49IDB4MzAgJiYgb3BjIDw9IDB4MzcpCisJCW9wYyA9IFBNSUNfQVJCX09QX0VYVF9XUklURUw7CisJZWxzZSBpZiAob3BjID49IDB4ODAgJiYgb3BjIDw9IDB4RkYpCisJCW9wYyA9IFBNSUNfQVJCX09QX1pFUk9fV1JJVEU7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZCA9IChvcGMgPDwgMjcpIHwgKChzaWQgJiAweGYpIDw8IDIwKSB8IChhZGRyIDw8IDQpIHwgKGJjICYgMHg3KTsKKworCS8qIFdyaXRlIGRhdGEgdG8gRklGT3MgKi8KKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtaWNfYXJiLT5sb2NrLCBmbGFncyk7CisJcGFfd3JpdGVfZGF0YShwbWljX2FyYiwgYnVmLCBQTUlDX0FSQl9XREFUQTAocG1pY19hcmItPmNoYW5uZWwpCisJCQkJCQkJLCBtaW5fdCh1OCwgYmMsIDMpKTsKKwlpZiAoYmMgPiAzKQorCQlwYV93cml0ZV9kYXRhKHBtaWNfYXJiLCBidWYgKyA0LAorCQkJCVBNSUNfQVJCX1dEQVRBMShwbWljX2FyYi0+Y2hhbm5lbCksIGJjIC0gNCk7CisKKwkvKiBTdGFydCB0aGUgdHJhbnNhY3Rpb24gKi8KKwlwbWljX2FyYl9iYXNlX3dyaXRlKHBtaWNfYXJiLCBQTUlDX0FSQl9DTUQocG1pY19hcmItPmNoYW5uZWwpLCBjbWQpOworCXJjID0gcG1pY19hcmJfd2FpdF9mb3JfZG9uZShjdHJsKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1pY19hcmItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworZW51bSBxcG5waW50X3JlZ3MgeworCVFQTlBJTlRfUkVHX1JUX1NUUwkJPSAweDEwLAorCVFQTlBJTlRfUkVHX1NFVF9UWVBFCQk9IDB4MTEsCisJUVBOUElOVF9SRUdfUE9MQVJJVFlfSElHSAk9IDB4MTIsCisJUVBOUElOVF9SRUdfUE9MQVJJVFlfTE9XCT0gMHgxMywKKwlRUE5QSU5UX1JFR19MQVRDSEVEX0NMUgkJPSAweDE0LAorCVFQTlBJTlRfUkVHX0VOX1NFVAkJPSAweDE1LAorCVFQTlBJTlRfUkVHX0VOX0NMUgkJPSAweDE2LAorCVFQTlBJTlRfUkVHX0xBVENIRURfU1RTCQk9IDB4MTgsCit9OworCitzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9xcG5waW50X3R5cGUgeworCXU4IHR5cGU7IC8qIDEgLT4gZWRnZSAqLworCXU4IHBvbGFyaXR5X2hpZ2g7CisJdTggcG9sYXJpdHlfbG93OworfSBfX3BhY2tlZDsKKworLyogU2ltcGxpZmllZCBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIGlycWNoaXAgY2FsbGJhY2tzICovCitzdGF0aWMgdm9pZCBxcG5waW50X3NwbWlfd3JpdGUoc3RydWN0IGlycV9kYXRhICpkLCB1OCByZWcsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1OCBzaWQgPSBkLT5od2lycSA+PiAyNDsKKwl1OCBwZXIgPSBkLT5od2lycSA+PiAxNjsKKworCWlmIChwbWljX2FyYl93cml0ZV9jbWQocGEtPnNwbWljLCBTUE1JX0NNRF9FWFRfV1JJVEVMLCBzaWQsCisJCQkgICAgICAgKHBlciA8PCA4KSArIHJlZywgYnVmLCBsZW4pKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZwYS0+c3BtaWMtPmRldiwKKwkJCQkiZmFpbGVkIGlycWNoaXAgdHJhbnNhY3Rpb24gb24gJXhcbiIsCisJCQkJICAgIGQtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfc3BtaV9yZWFkKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTggcmVnLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IHNpZCA9IGQtPmh3aXJxID4+IDI0OworCXU4IHBlciA9IGQtPmh3aXJxID4+IDE2OworCisJaWYgKHBtaWNfYXJiX3JlYWRfY21kKHBhLT5zcG1pYywgU1BNSV9DTURfRVhUX1JFQURMLCBzaWQsCisJCQkgICAgICAocGVyIDw8IDgpICsgcmVnLCBidWYsIGxlbikpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJnBhLT5zcG1pYy0+ZGV2LAorCQkJCSJmYWlsZWQgaXJxY2hpcCB0cmFuc2FjdGlvbiBvbiAleFxuIiwKKwkJCQkgICAgZC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgcGVyaXBoX2ludGVycnVwdChzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhLCB1OCBhcGlkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisJdTMyIHN0YXR1czsKKwlpbnQgaWQ7CisKKwlzdGF0dXMgPSByZWFkbF9yZWxheGVkKHBhLT5pbnRyICsgU1BNSV9QSUNfSVJRX1NUQVRVUyhhcGlkKSk7CisJd2hpbGUgKHN0YXR1cykgeworCQlpZCA9IGZmcyhzdGF0dXMpIC0gMTsKKwkJc3RhdHVzICY9IH4oMSA8PCBpZCk7CisJCWlycSA9IGlycV9maW5kX21hcHBpbmcocGEtPmRvbWFpbiwKKwkJCQkgICAgICAgcGEtPmFwaWRfdG9fcHBpZFthcGlkXSA8PCAxNgorCQkJCSAgICAgfCBpZCA8PCA4CisJCQkJICAgICB8IGFwaWQpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBtaWNfYXJiX2NoYWluZWRfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhID0gaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZ2V0X2NoaXAoaXJxKTsKKwl2b2lkIF9faW9tZW0gKmludHIgPSBwYS0+aW50cjsKKwlpbnQgZmlyc3QgPSBwYS0+bWluX2FwaWQgPj4gNTsKKwlpbnQgbGFzdCA9IHBhLT5tYXhfYXBpZCA+PiA1OworCXUzMiBzdGF0dXM7CisJaW50IGksIGlkOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisKKwlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyArK2kpIHsKKwkJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChpbnRyICsKKwkJCQkgICAgICAgU1BNSV9QSUNfT1dORVJfQUNDX1NUQVRVUyhwYS0+ZWUsIGkpKTsKKwkJd2hpbGUgKHN0YXR1cykgeworCQkJaWQgPSBmZnMoc3RhdHVzKSAtIDE7CisJCQlzdGF0dXMgJj0gfigxIDw8IGlkKTsKKwkJCXBlcmlwaF9pbnRlcnJ1cHQocGEsIGlkICsgaSAqIDMyKTsKKwkJfQorCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfaXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IGlycSAgPSBkLT5od2lycSA+PiA4OworCXU4IGFwaWQgPSBkLT5od2lycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGRhdGE7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBhLT5sb2NrLCBmbGFncyk7CisJd3JpdGVsX3JlbGF4ZWQoMSA8PCBpcnEsIHBhLT5pbnRyICsgU1BNSV9QSUNfSVJRX0NMRUFSKGFwaWQpKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGEtPmxvY2ssIGZsYWdzKTsKKworCWRhdGEgPSAxIDw8IGlycTsKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfTEFUQ0hFRF9DTFIsICZkYXRhLCAxKTsKK30KKworc3RhdGljIHZvaWQgcXBucGludF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IGlycSAgPSBkLT5od2lycSA+PiA4OworCXU4IGFwaWQgPSBkLT5od2lycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0dXM7CisJdTggZGF0YTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGEtPmxvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSByZWFkbF9yZWxheGVkKHBhLT5pbnRyICsgU1BNSV9QSUNfQUNDX0VOQUJMRShhcGlkKSk7CisJaWYgKHN0YXR1cyAmIFNQTUlfUElDX0FDQ19FTkFCTEVfQklUKSB7CisJCXN0YXR1cyA9IHN0YXR1cyAmIH5TUE1JX1BJQ19BQ0NfRU5BQkxFX0JJVDsKKwkJd3JpdGVsX3JlbGF4ZWQoc3RhdHVzLCBwYS0+aW50ciArIFNQTUlfUElDX0FDQ19FTkFCTEUoYXBpZCkpOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGEtPmxvY2ssIGZsYWdzKTsKKworCWRhdGEgPSAxIDw8IGlycTsKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfRU5fQ0xSLCAmZGF0YSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHFwbnBpbnRfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXU4IGlycSAgPSBkLT5od2lycSA+PiA4OworCXU4IGFwaWQgPSBkLT5od2lycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0dXM7CisJdTggZGF0YTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGEtPmxvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSByZWFkbF9yZWxheGVkKHBhLT5pbnRyICsgU1BNSV9QSUNfQUNDX0VOQUJMRShhcGlkKSk7CisJaWYgKCEoc3RhdHVzICYgU1BNSV9QSUNfQUNDX0VOQUJMRV9CSVQpKSB7CisJCXdyaXRlbF9yZWxheGVkKHN0YXR1cyB8IFNQTUlfUElDX0FDQ19FTkFCTEVfQklULAorCQkJCXBhLT5pbnRyICsgU1BNSV9QSUNfQUNDX0VOQUJMRShhcGlkKSk7CisJfQorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYS0+bG9jaywgZmxhZ3MpOworCisJZGF0YSA9IDEgPDwgaXJxOworCXFwbnBpbnRfc3BtaV93cml0ZShkLCBRUE5QSU5UX1JFR19FTl9TRVQsICZkYXRhLCAxKTsKK30KKworc3RhdGljIHZvaWQgcXBucGludF9pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1OCBpcnEgID0gZC0+aHdpcnEgPj4gODsKKwl1OCBkYXRhOworCisJcXBucGludF9pcnFfdW5tYXNrKGQpOworCisJZGF0YSA9IDEgPDwgaXJxOworCXFwbnBpbnRfc3BtaV93cml0ZShkLCBRUE5QSU5UX1JFR19MQVRDSEVEX0NMUiwgJmRhdGEsIDEpOworfQorCitzdGF0aWMgaW50IHFwbnBpbnRfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKK3sKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9xcG5waW50X3R5cGUgdHlwZTsKKwl1OCBpcnEgPSBkLT5od2lycSA+PiA4OworCisJcXBucGludF9zcG1pX3JlYWQoZCwgUVBOUElOVF9SRUdfU0VUX1RZUEUsICZ0eXBlLCBzaXplb2YodHlwZSkpOworCisJaWYgKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKSB7CisJCXR5cGUudHlwZSB8PSAxIDw8IGlycTsKKwkJaWYgKGZsb3dfdHlwZSAmIElSUUZfVFJJR0dFUl9SSVNJTkcpCisJCQl0eXBlLnBvbGFyaXR5X2hpZ2ggfD0gMSA8PCBpcnE7CisJCWlmIChmbG93X3R5cGUgJiBJUlFGX1RSSUdHRVJfRkFMTElORykKKwkJCXR5cGUucG9sYXJpdHlfbG93ICB8PSAxIDw8IGlycTsKKwl9IGVsc2UgeworCQlpZiAoKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfSElHSCkpICYmCisJCSAgICAoZmxvd190eXBlICYgKElSUUZfVFJJR0dFUl9MT1cpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXR5cGUudHlwZSAmPSB+KDEgPDwgaXJxKTsgLyogbGV2ZWwgdHJpZyAqLworCQlpZiAoZmxvd190eXBlICYgSVJRRl9UUklHR0VSX0hJR0gpCisJCQl0eXBlLnBvbGFyaXR5X2hpZ2ggfD0gMSA8PCBpcnE7CisJCWVsc2UKKwkJCXR5cGUucG9sYXJpdHlfbG93ICB8PSAxIDw8IGlycTsKKwl9CisKKwlxcG5waW50X3NwbWlfd3JpdGUoZCwgUVBOUElOVF9SRUdfU0VUX1RZUEUsICZ0eXBlLCBzaXplb2YodHlwZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBtaWNfYXJiX2lycWNoaXAgPSB7CisJLm5hbWUJCT0gInBtaWNfYXJiIiwKKwkuaXJxX2VuYWJsZQk9IHFwbnBpbnRfaXJxX2VuYWJsZSwKKwkuaXJxX2Fjawk9IHFwbnBpbnRfaXJxX2FjaywKKwkuaXJxX21hc2sJPSBxcG5waW50X2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCT0gcXBucGludF9pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJPSBxcG5waW50X2lycV9zZXRfdHlwZSwKKwkuZmxhZ3MJCT0gSVJRQ0hJUF9NQVNLX09OX1NVU1BFTkQKKwkJCXwgSVJRQ0hJUF9TS0lQX1NFVF9XQUtFLAorfTsKKworc3RydWN0IHNwbWlfcG1pY19hcmJfaXJxX3NwZWMgeworCXVuc2lnbmVkIHNsYXZlOjQ7CisJdW5zaWduZWQgcGVyOjg7CisJdW5zaWduZWQgaXJxOjM7Cit9OworCitzdGF0aWMgaW50IHNlYXJjaF9tYXBwaW5nX3RhYmxlKHN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEsCisJCQkJc3RydWN0IHNwbWlfcG1pY19hcmJfaXJxX3NwZWMgKnNwZWMsCisJCQkJdTggKmFwaWQpCit7CisJdTE2IHBwaWQgPSBzcGVjLT5zbGF2ZSA8PCA4IHwgc3BlYy0+cGVyOworCXUzMiAqbWFwcGluZ190YWJsZSA9IHBhLT5tYXBwaW5nX3RhYmxlOworCWludCBpbmRleCA9IDAsIGk7CisJdTMyIGRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1BNSV9NQVBQSU5HX1RBQkxFX1RSRUVfREVQVEg7ICsraSkgeworCQlkYXRhID0gbWFwcGluZ190YWJsZVtpbmRleF07CisKKwkJaWYgKHBwaWQgJiAoMSA8PCBTUE1JX01BUFBJTkdfQklUX0lOREVYKGRhdGEpKSkgeworCQkJaWYgKFNQTUlfTUFQUElOR19CSVRfSVNfMV9GTEFHKGRhdGEpKSB7CisJCQkJaW5kZXggPSBTUE1JX01BUFBJTkdfQklUX0lTXzFfUkVTVUxUKGRhdGEpOworCQkJfSBlbHNlIHsKKwkJCQkqYXBpZCA9IFNQTUlfTUFQUElOR19CSVRfSVNfMV9SRVNVTFQoZGF0YSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoU1BNSV9NQVBQSU5HX0JJVF9JU18wX0ZMQUcoZGF0YSkpIHsKKwkJCQlpbmRleCA9IFNQTUlfTUFQUElOR19CSVRfSVNfMF9SRVNVTFQoZGF0YSk7CisJCQl9IGVsc2UgeworCQkJCSphcGlkID0gU1BNSV9NQVBQSU5HX0JJVF9JU18wX1JFU1VMVChkYXRhKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHFwbnBpbnRfaXJxX2RvbWFpbl9kdF90cmFuc2xhdGUoc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkJICAgY29uc3QgdTMyICppbnRzcGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQoreworCXN0cnVjdCBzcG1pX3BtaWNfYXJiX2RldiAqcGEgPSBkLT5ob3N0X2RhdGE7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfaXJxX3NwZWMgc3BlYzsKKwlpbnQgZXJyOworCXU4IGFwaWQ7CisKKwlkZXZfZGJnKCZwYS0+c3BtaWMtPmRldiwKKwkJImludHNwZWNbMF0gMHglMXggaW50c3BlY1sxXSAweCUwMnggaW50c3BlY1syXSAweCUwMnhcbiIsCisJCWludHNwZWNbMF0sIGludHNwZWNbMV0sIGludHNwZWNbMl0pOworCisJaWYgKGQtPm9mX25vZGUgIT0gY29udHJvbGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGludHNpemUgIT0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGludHNwZWNbMF0gPiAweEYgfHwgaW50c3BlY1sxXSA+IDB4RkYgfHwgaW50c3BlY1syXSA+IDB4NykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGVjLnNsYXZlID0gaW50c3BlY1swXTsKKwlzcGVjLnBlciAgID0gaW50c3BlY1sxXTsKKwlzcGVjLmlycSAgID0gaW50c3BlY1syXTsKKworCWVyciA9IHNlYXJjaF9tYXBwaW5nX3RhYmxlKHBhLCAmc3BlYywgJmFwaWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwYS0+YXBpZF90b19wcGlkW2FwaWRdID0gc3BlYy5zbGF2ZSA8PCA4IHwgc3BlYy5wZXI7CisKKwkvKiBLZWVwIHRyYWNrIG9mIHttYXgsbWlufV9hcGlkIGZvciBib3VuZGluZyBzZWFyY2ggZHVyaW5nIGludGVycnVwdCAqLworCWlmIChhcGlkID4gcGEtPm1heF9hcGlkKQorCQlwYS0+bWF4X2FwaWQgPSBhcGlkOworCWlmIChhcGlkIDwgcGEtPm1pbl9hcGlkKQorCQlwYS0+bWluX2FwaWQgPSBhcGlkOworCisJKm91dF9od2lycSA9IHNwZWMuc2xhdmUgPDwgMjQKKwkJICAgfCBzcGVjLnBlciAgIDw8IDE2CisJCSAgIHwgc3BlYy5pcnEgICA8PCA4CisJCSAgIHwgYXBpZDsKKwkqb3V0X3R5cGUgID0gaW50c3BlY1szXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisKKwlkZXZfZGJnKCZwYS0+c3BtaWMtPmRldiwgIm91dF9od2lycSA9ICVsdVxuIiwgKm91dF9od2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxcG5waW50X2lycV9kb21haW5fbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLAorCQkJCSAgdW5zaWduZWQgaW50IHZpcnEsCisJCQkJICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYSA9IGQtPmhvc3RfZGF0YTsKKworCWRldl9kYmcoJnBhLT5zcG1pYy0+ZGV2LCAidmlycSA9ICV1LCBod2lycSA9ICVsdVxuIiwgdmlycSwgaHdpcnEpOworCisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZwbWljX2FyYl9pcnFjaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBkLT5ob3N0X2RhdGEpOworCWlycV9zZXRfbm9wcm9iZSh2aXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBwbWljX2FyYl9pcnFfZG9tYWluX29wcyA9IHsKKwkubWFwCT0gcXBucGludF9pcnFfZG9tYWluX21hcCwKKwkueGxhdGUJPSBxcG5waW50X2lycV9kb21haW5fZHRfdHJhbnNsYXRlLAorfTsKKworc3RhdGljIGludCBzcG1pX3BtaWNfYXJiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwbWlfcG1pY19hcmJfZGV2ICpwYTsKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXUzMiBjaGFubmVsLCBlZTsKKwlpbnQgZXJyLCBpOworCisJY3RybCA9IHNwbWlfY29udHJvbGxlcl9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBhKSk7CisJaWYgKCFjdHJsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhID0gc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKGN0cmwpOworCXBhLT5zcG1pYyA9IGN0cmw7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiY29yZSIpOworCXBhLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZjdHJsLT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwYS0+YmFzZSkpIHsKKwkJZXJyID0gUFRSX0VSUihwYS0+YmFzZSk7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJpbnRyIik7CisJcGEtPmludHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJmN0cmwtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBhLT5pbnRyKSkgeworCQllcnIgPSBQVFJfRVJSKHBhLT5pbnRyKTsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImNuZmciKTsKKwlwYS0+Y25mZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmY3RybC0+ZGV2LCByZXMpOworCWlmIChJU19FUlIocGEtPmNuZmcpKSB7CisJCWVyciA9IFBUUl9FUlIocGEtPmNuZmcpOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlwYS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInBlcmlwaF9pcnEiKTsKKwlpZiAocGEtPmlycSA8IDApIHsKKwkJZXJyID0gcGEtPmlycTsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJxY29tLGNoYW5uZWwiLCAmY2hhbm5lbCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjaGFubmVsIHVuc3BlY2lmaWVkLlxuIik7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCWlmIChjaGFubmVsID4gNSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGNoYW5uZWwgKCV1KSBzcGVjaWZpZWQuXG4iLAorCQkJY2hhbm5lbCk7CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCXBhLT5jaGFubmVsID0gY2hhbm5lbDsKKworCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicWNvbSxlZSIsICZlZSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFRSB1bnNwZWNpZmllZC5cbiIpOworCQlnb3RvIGVycl9wdXRfY3RybDsKKwl9CisKKwlpZiAoZWUgPiA1KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgRUUgKCV1KSBzcGVjaWZpZWRcbiIsIGVlKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0X2N0cmw7CisJfQorCisJcGEtPmVlID0gZWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYS0+bWFwcGluZ190YWJsZSk7ICsraSkKKwkJcGEtPm1hcHBpbmdfdGFibGVbaV0gPSByZWFkbF9yZWxheGVkKAorCQkJCXBhLT5jbmZnICsgU1BNSV9NQVBQSU5HX1RBQkxFX1JFRyhpKSk7CisKKwkvKiBJbml0aWFsaXplIG1heF9hcGlkL21pbl9hcGlkIHRvIHRoZSBvcHBvc2l0ZSBib3VuZHMsIGR1cmluZworCSAqIHRoZSBpcnEgZG9tYWluIHRyYW5zbGF0aW9uLCB3ZSBhcmUgc3VyZSB0byB1cGRhdGUgdGhlc2UgKi8KKwlwYS0+bWF4X2FwaWQgPSAwOworCXBhLT5taW5fYXBpZCA9IFBNSUNfQVJCX01BWF9QRVJJUEhTIC0gMTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0cmwpOworCXJhd19zcGluX2xvY2tfaW5pdCgmcGEtPmxvY2spOworCisJY3RybC0+Y21kID0gcG1pY19hcmJfY21kOworCWN0cmwtPnJlYWRfY21kID0gcG1pY19hcmJfcmVhZF9jbWQ7CisJY3RybC0+d3JpdGVfY21kID0gcG1pY19hcmJfd3JpdGVfY21kOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiYWRkaW5nIGlycSBkb21haW5cbiIpOworCXBhLT5kb21haW4gPSBpcnFfZG9tYWluX2FkZF90cmVlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgJnBtaWNfYXJiX2lycV9kb21haW5fb3BzLCBwYSk7CisJaWYgKCFwYS0+ZG9tYWluKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgaXJxX2RvbWFpblxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3B1dF9jdHJsOworCX0KKworCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBhLT5pcnEsIHBhKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwYS0+aXJxLCBwbWljX2FyYl9jaGFpbmVkX2lycSk7CisKKwllcnIgPSBzcG1pX2NvbnRyb2xsZXJfYWRkKGN0cmwpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2RvbWFpbl9yZW1vdmU7CisKKwlkZXZfZGJnKCZjdHJsLT5kZXYsICJQTUlDIEFyYiBWZXJzaW9uIDB4JXhcbiIsCisJCXBtaWNfYXJiX2Jhc2VfcmVhZChwYSwgUE1JQ19BUkJfVkVSU0lPTikpOworCisJcmV0dXJuIDA7CisKK2Vycl9kb21haW5fcmVtb3ZlOgorCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHBhLT5pcnEsIE5VTEwpOworCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBhLT5pcnEsIE5VTEwpOworCWlycV9kb21haW5fcmVtb3ZlKHBhLT5kb21haW4pOworZXJyX3B1dF9jdHJsOgorCXNwbWlfY29udHJvbGxlcl9wdXQoY3RybCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzcG1pX3BtaWNfYXJiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc3BtaV9wbWljX2FyYl9kZXYgKnBhID0gc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKGN0cmwpOworCXNwbWlfY29udHJvbGxlcl9yZW1vdmUoY3RybCk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocGEtPmlycSwgTlVMTCk7CisJaXJxX3NldF9oYW5kbGVyX2RhdGEocGEtPmlycSwgTlVMTCk7CisJaXJxX2RvbWFpbl9yZW1vdmUocGEtPmRvbWFpbik7CisJc3BtaV9jb250cm9sbGVyX3B1dChjdHJsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3BtaV9wbWljX2FyYl9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcG1pLXBtaWMtYXJiIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzcG1pX3BtaWNfYXJiX21hdGNoX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3BtaV9wbWljX2FyYl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHNwbWlfcG1pY19hcmJfcHJvYmUsCisJLnJlbW92ZQkJPSBzcG1pX3BtaWNfYXJiX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic3BtaV9wbWljX2FyYiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzcG1pX3BtaWNfYXJiX21hdGNoX3RhYmxlLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcG1pX3BtaWNfYXJiX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3BtaV9wbWljX2FyYiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcG1pL3NwbWkuYyBiL2RyaXZlcnMvc3BtaS9zcG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NzgwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BtaS9zcG1pLmMKQEAgLTAsMCArMSw1NzQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcG1pLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmg+CisKK3N0YXRpYyBERUZJTkVfSURBKGN0cmxfaWRhKTsKKworc3RhdGljIHZvaWQgc3BtaV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2ID0gdG9fc3BtaV9kZXZpY2UoZGV2KTsKKwlrZnJlZShzZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZpY2VfdHlwZSBzcG1pX2Rldl90eXBlID0geworCS5yZWxlYXNlCT0gc3BtaV9kZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIHNwbWlfY3RybF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsID0gdG9fc3BtaV9jb250cm9sbGVyKGRldik7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmN0cmxfaWRhLCBjdHJsLT5ucik7CisJa2ZyZWUoY3RybCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgc3BtaV9jdHJsX3R5cGUgPSB7CisJLnJlbGVhc2UJPSBzcG1pX2N0cmxfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc3BtaV9kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCWlmIChvZl9kcml2ZXJfbWF0Y2hfZGV2aWNlKGRldiwgZHJ2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZHJ2LT5uYW1lKQorCQlyZXR1cm4gc3RybmNtcChkZXZfbmFtZShkZXYpLCBkcnYtPm5hbWUsCisJCQkgICAgICAgU1BNSV9OQU1FX1NJWkUpID09IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcG1pX2RldmljZV9hZGQoKSAtIGFkZCBhIGRldmljZSBwcmV2aW91c2x5IGNvbnN0cnVjdGVkIHZpYSBzcG1pX2RldmljZV9hbGxvYygpCisgKiBAc2RldjoJc3BtaV9kZXZpY2UgdG8gYmUgYWRkZWQKKyAqLworaW50IHNwbWlfZGV2aWNlX2FkZChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCA9IHNkZXYtPmN0cmw7CisJaW50IGVycjsKKworCWRldl9zZXRfbmFtZSgmc2Rldi0+ZGV2LCAiJWQtJTAyeCIsIGN0cmwtPm5yLCBzZGV2LT51c2lkKTsKKworCWVyciA9IGRldmljZV9hZGQoJnNkZXYtPmRldik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycigmc2Rldi0+ZGV2LCAiQ2FuJ3QgYWRkICVzLCBzdGF0dXMgJWRcbiIsCisJCQlkZXZfbmFtZSgmc2Rldi0+ZGV2KSwgZXJyKTsKKwkJZ290byBlcnJfZGV2aWNlX2FkZDsKKwl9CisKKwlkZXZfZGJnKCZzZGV2LT5kZXYsICJkZXZpY2UgJXMgcmVnaXN0ZXJlZFxuIiwgZGV2X25hbWUoJnNkZXYtPmRldikpOworCitlcnJfZGV2aWNlX2FkZDoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9kZXZpY2VfYWRkKTsKKworLyoqCisgKiBzcG1pX2RldmljZV9yZW1vdmUoKTogcmVtb3ZlIGFuIFNQTUkgZGV2aWNlCisgKiBAc2RldjoJc3BtaV9kZXZpY2UgdG8gYmUgcmVtb3ZlZAorICovCit2b2lkIHNwbWlfZGV2aWNlX3JlbW92ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJZGV2aWNlX3VucmVnaXN0ZXIoJnNkZXYtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2RldmljZV9yZW1vdmUpOworCitzdGF0aWMgaW5saW5lIGludAorc3BtaV9jbWQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3Bjb2RlLCB1OCBzaWQpCit7CisJaWYgKCFjdHJsIHx8ICFjdHJsLT5jbWQgfHwgY3RybC0+ZGV2LnR5cGUgIT0gJnNwbWlfY3RybF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjdHJsLT5jbWQoY3RybCwgb3Bjb2RlLCBzaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzcG1pX3JlYWRfY21kKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsIHU4IG9wY29kZSwKKwkJCQl1OCBzaWQsIHUxNiBhZGRyLCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmICghY3RybCB8fCAhY3RybC0+cmVhZF9jbWQgfHwgY3RybC0+ZGV2LnR5cGUgIT0gJnNwbWlfY3RybF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjdHJsLT5yZWFkX2NtZChjdHJsLCBvcGNvZGUsIHNpZCwgYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBzcG1pX3dyaXRlX2NtZChzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGNvZGUsCisJCQkJIHU4IHNpZCwgdTE2IGFkZHIsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKCFjdHJsIHx8ICFjdHJsLT53cml0ZV9jbWQgfHwgY3RybC0+ZGV2LnR5cGUgIT0gJnNwbWlfY3RybF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjdHJsLT53cml0ZV9jbWQoY3RybCwgb3Bjb2RlLCBzaWQsIGFkZHIsIGJ1ZiwgbGVuKTsKK30KKworLyoqCisgKiBzcG1pX3JlZ2lzdGVyX3JlYWQoKSAtIHJlZ2lzdGVyIHJlYWQKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqIEBhZGRyOglzbGF2ZSByZWdpc3RlciBhZGRyZXNzICg1LWJpdCBhZGRyZXNzKS4KKyAqIEBidWY6CWJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQgd2l0aCBkYXRhIGZyb20gdGhlIFNsYXZlLgorICoKKyAqIFJlYWRzIDEgYnl0ZSBvZiBkYXRhIGZyb20gYSBTbGF2ZSBkZXZpY2UgcmVnaXN0ZXIuCisgKi8KK2ludCBzcG1pX3JlZ2lzdGVyX3JlYWQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCB1OCAqYnVmKQoreworCS8qIDUtYml0IHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwlpZiAoYWRkciA+IDB4MUYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwbWlfcmVhZF9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfUkVBRCwgc2Rldi0+dXNpZCwgYWRkciwKKwkJCSAgICAgYnVmLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfcmVnaXN0ZXJfcmVhZCk7CisKKy8qKgorICogc3BtaV9leHRfcmVnaXN0ZXJfcmVhZCgpIC0gZXh0ZW5kZWQgcmVnaXN0ZXIgcmVhZAorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICogQGFkZHI6CXNsYXZlIHJlZ2lzdGVyIGFkZHJlc3MgKDgtYml0IGFkZHJlc3MpLgorICogQGJ1ZjoJYnVmZmVyIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGRhdGEgZnJvbSB0aGUgU2xhdmUuCisgKiBAbGVuOgl0aGUgcmVxdWVzdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAodXAgdG8gMTYgYnl0ZXMpLgorICoKKyAqIFJlYWRzIHVwIHRvIDE2IGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgZXh0ZW5kZWQgcmVnaXN0ZXIgc3BhY2Ugb24gYQorICogU2xhdmUgZGV2aWNlLgorICovCitpbnQgc3BtaV9leHRfcmVnaXN0ZXJfcmVhZChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIHU4ICpidWYsCisJCQkgICBzaXplX3QgbGVuKQoreworCS8qIDgtYml0IHJlZ2lzdGVyIGFkZHJlc3MsIHVwIHRvIDE2IGJ5dGVzICovCisJaWYgKGxlbiA9PSAwIHx8IGxlbiA+IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcG1pX3JlYWRfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX0VYVF9SRUFELCBzZGV2LT51c2lkLCBhZGRyLAorCQkJICAgICBidWYsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkKTsKKworLyoqCisgKiBzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkbCgpIC0gZXh0ZW5kZWQgcmVnaXN0ZXIgcmVhZCBsb25nCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKiBAYWRkcjoJc2xhdmUgcmVnaXN0ZXIgYWRkcmVzcyAoMTYtYml0IGFkZHJlc3MpLgorICogQGJ1ZjoJYnVmZmVyIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGRhdGEgZnJvbSB0aGUgU2xhdmUuCisgKiBAbGVuOgl0aGUgcmVxdWVzdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAodXAgdG8gOCBieXRlcykuCisgKgorICogUmVhZHMgdXAgdG8gOCBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGV4dGVuZGVkIHJlZ2lzdGVyIHNwYWNlIG9uIGEKKyAqIFNsYXZlIGRldmljZSB1c2luZyAxNi1iaXQgYWRkcmVzcy4KKyAqLworaW50IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTE2IGFkZHIsIHU4ICpidWYsCisJCQkgICAgc2l6ZV90IGxlbikKK3sKKwkvKiAxNi1iaXQgcmVnaXN0ZXIgYWRkcmVzcywgdXAgdG8gOCBieXRlcyAqLworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcG1pX3JlYWRfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX0VYVF9SRUFETCwgc2Rldi0+dXNpZCwgYWRkciwKKwkJCSAgICAgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9leHRfcmVnaXN0ZXJfcmVhZGwpOworCisvKioKKyAqIHNwbWlfcmVnaXN0ZXJfd3JpdGUoKSAtIHJlZ2lzdGVyIHdyaXRlCisgKiBAc2RldjoJU1BNSSBkZXZpY2UKKyAqIEBhZGRyOglzbGF2ZSByZWdpc3RlciBhZGRyZXNzICg1LWJpdCBhZGRyZXNzKS4KKyAqIEBkYXRhOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgU2xhdmUuCisgKgorICogV3JpdGVzIDEgYnl0ZSBvZiBkYXRhIHRvIGEgU2xhdmUgZGV2aWNlIHJlZ2lzdGVyLgorICovCitpbnQgc3BtaV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIHU4IGRhdGEpCit7CisJLyogNS1iaXQgcmVnaXN0ZXIgYWRkcmVzcyAqLworCWlmIChhZGRyID4gMHgxRikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BtaV93cml0ZV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfV1JJVEUsIHNkZXYtPnVzaWQsIGFkZHIsCisJCQkgICAgICAmZGF0YSwgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX3JlZ2lzdGVyX3dyaXRlKTsKKworLyoqCisgKiBzcG1pX3JlZ2lzdGVyX3plcm9fd3JpdGUoKSAtIHJlZ2lzdGVyIHplcm8gd3JpdGUKKyAqIEBzZGV2OglTUE1JIGRldmljZS4KKyAqIEBkYXRhOgl0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHJlZ2lzdGVyIDAgKDctYml0cykuCisgKgorICogV3JpdGVzIGRhdGEgdG8gcmVnaXN0ZXIgMCBvZiB0aGUgU2xhdmUgZGV2aWNlLgorICovCitpbnQgc3BtaV9yZWdpc3Rlcl96ZXJvX3dyaXRlKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggZGF0YSkKK3sKKwlyZXR1cm4gc3BtaV93cml0ZV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfWkVST19XUklURSwgc2Rldi0+dXNpZCwgMCwKKwkJCSAgICAgICZkYXRhLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfcmVnaXN0ZXJfemVyb193cml0ZSk7CisKKy8qKgorICogc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGUoKSAtIGV4dGVuZGVkIHJlZ2lzdGVyIHdyaXRlCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKiBAYWRkcjoJc2xhdmUgcmVnaXN0ZXIgYWRkcmVzcyAoOC1iaXQgYWRkcmVzcykuCisgKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgU2xhdmUuCisgKiBAbGVuOgl0aGUgcmVxdWVzdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAodXAgdG8gMTYgYnl0ZXMpLgorICoKKyAqIFdyaXRlcyB1cCB0byAxNiBieXRlcyBvZiBkYXRhIHRvIHRoZSBleHRlbmRlZCByZWdpc3RlciBzcGFjZSBvZiBhCisgKiBTbGF2ZSBkZXZpY2UuCisgKi8KK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIGNvbnN0IHU4ICpidWYsCisJCQkgICAgc2l6ZV90IGxlbikKK3sKKwkvKiA4LWJpdCByZWdpc3RlciBhZGRyZXNzLCB1cCB0byAxNiBieXRlcyAqLworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BtaV93cml0ZV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfRVhUX1dSSVRFLCBzZGV2LT51c2lkLCBhZGRyLAorCQkJICAgICAgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGUpOworCisvKioKKyAqIHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlbCgpIC0gZXh0ZW5kZWQgcmVnaXN0ZXIgd3JpdGUgbG9uZworICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICogQGFkZHI6CXNsYXZlIHJlZ2lzdGVyIGFkZHJlc3MgKDE2LWJpdCBhZGRyZXNzKS4KKyAqIEBidWY6CWJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBTbGF2ZS4KKyAqIEBsZW46CXRoZSByZXF1ZXN0IG51bWJlciBvZiBieXRlcyB0byByZWFkICh1cCB0byA4IGJ5dGVzKS4KKyAqCisgKiBXcml0ZXMgdXAgdG8gOCBieXRlcyBvZiBkYXRhIHRvIHRoZSBleHRlbmRlZCByZWdpc3RlciBzcGFjZSBvZiBhCisgKiBTbGF2ZSBkZXZpY2UgdXNpbmcgMTYtYml0IGFkZHJlc3MuCisgKi8KK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1MTYgYWRkciwgY29uc3QgdTggKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGxlbikKK3sKKwkvKiA0LWJpdCBTbGF2ZSBJZGVudGlmaWVyLCAxNi1iaXQgcmVnaXN0ZXIgYWRkcmVzcywgdXAgdG8gOCBieXRlcyAqLworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcG1pX3dyaXRlX2NtZChzZGV2LT5jdHJsLCBTUE1JX0NNRF9FWFRfV1JJVEVMLCBzZGV2LT51c2lkLAorCQkJICAgICAgYWRkciwgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9leHRfcmVnaXN0ZXJfd3JpdGVsKTsKKworLyoqCisgKiBzcG1pX2NvbW1hbmRfcmVzZXQoKSAtIHNlbmRzIFJFU0VUIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBzbGF2ZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICoKKyAqIFRoZSBSZXNldCBjb21tYW5kIGluaXRpYWxpemVzIHRoZSBTbGF2ZSBhbmQgZm9yY2VzIGFsbCByZWdpc3RlcnMgdG8KKyAqIHRoZWlyIHJlc2V0IHZhbHVlcy4gVGhlIFNsYXZlIHNoYWxsIGVudGVyIHRoZSBTVEFSVFVQIHN0YXRlIGFmdGVyCisgKiByZWNlaXZpbmcgYSBSZXNldCBjb21tYW5kLgorICovCitpbnQgc3BtaV9jb21tYW5kX3Jlc2V0KHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gc3BtaV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfUkVTRVQsIHNkZXYtPnVzaWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BtaV9jb21tYW5kX3Jlc2V0KTsKKworLyoqCisgKiBzcG1pX2NvbW1hbmRfc2xlZXAoKSAtIHNlbmRzIFNMRUVQIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBTUE1JIGRldmljZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICoKKyAqIFRoZSBTbGVlcCBjb21tYW5kIGNhdXNlcyB0aGUgU2xhdmUgdG8gZW50ZXIgdGhlIHVzZXIgZGVmaW5lZCBTTEVFUCBzdGF0ZS4KKyAqLworaW50IHNwbWlfY29tbWFuZF9zbGVlcChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpCit7CisJcmV0dXJuIHNwbWlfY21kKHNkZXYtPmN0cmwsIFNQTUlfQ01EX1NMRUVQLCBzZGV2LT51c2lkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfY29tbWFuZF9zbGVlcCk7CisKKy8qKgorICogc3BtaV9jb21tYW5kX3dha2V1cCgpIC0gc2VuZHMgV0FLRVVQIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBTUE1JIGRldmljZQorICogQHNkZXY6CVNQTUkgZGV2aWNlLgorICoKKyAqIFRoZSBXYWtldXAgY29tbWFuZCBjYXVzZXMgdGhlIFNsYXZlIHRvIG1vdmUgZnJvbSB0aGUgU0xFRVAgc3RhdGUgdG8KKyAqIHRoZSBBQ1RJVkUgc3RhdGUuCisgKi8KK2ludCBzcG1pX2NvbW1hbmRfd2FrZXVwKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gc3BtaV9jbWQoc2Rldi0+Y3RybCwgU1BNSV9DTURfV0FLRVVQLCBzZGV2LT51c2lkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfY29tbWFuZF93YWtldXApOworCisvKioKKyAqIHNwbWlfY29tbWFuZF9zaHV0ZG93bigpIC0gc2VuZHMgU0hVVERPV04gY29tbWFuZCB0byB0aGUgc3BlY2lmaWVkIFNQTUkgZGV2aWNlCisgKiBAc2RldjoJU1BNSSBkZXZpY2UuCisgKgorICogVGhlIFNodXRkb3duIGNvbW1hbmQgY2F1c2VzIHRoZSBTbGF2ZSB0byBlbnRlciB0aGUgU0hVVERPV04gc3RhdGUuCisgKi8KK2ludCBzcG1pX2NvbW1hbmRfc2h1dGRvd24oc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzcG1pX2NtZChzZGV2LT5jdHJsLCBTUE1JX0NNRF9TSFVURE9XTiwgc2Rldi0+dXNpZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbW1hbmRfc2h1dGRvd24pOworCitzdGF0aWMgaW50IHNwbWlfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BtaV9kcml2ZXIgKnNkcnYgPSB0b19zcG1pX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2ID0gdG9fc3BtaV9kZXZpY2UoZGV2KTsKKwlpbnQgZXJyOworCisJLyogRW5zdXJlIHRoZSBzbGF2ZSBpcyBpbiBBQ1RJVkUgc3RhdGUgKi8KKwllcnIgPSBzcG1pX2NvbW1hbmRfd2FrZXVwKHNkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF93YWtldXA7CisKKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShkZXYpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKKwllcnIgPSBzZHJ2LT5wcm9iZShzZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfcHJvYmU7CisKKwlyZXR1cm4gMDsKKworZmFpbF9wcm9iZToKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKK2ZhaWxfd2FrZXVwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3BtaV9kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BtaV9kcml2ZXIgKnNkcnYgPSB0b19zcG1pX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJc2Rydi0+cmVtb3ZlKHRvX3NwbWlfZGV2aWNlKGRldikpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc3BtaV9idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAic3BtaSIsCisJLm1hdGNoCQk9IHNwbWlfZGV2aWNlX21hdGNoLAorCS5wcm9iZQkJPSBzcG1pX2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IHNwbWlfZHJ2X3JlbW92ZSwKK307CisKKy8qKgorICogc3BtaV9jb250cm9sbGVyX2FsbG9jKCkgLSBBbGxvY2F0ZSBhIG5ldyBTUE1JIGRldmljZQorICogQGN0cmw6CWFzc29jaWF0ZWQgY29udHJvbGxlcgorICoKKyAqIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWl0aGVyIGNhbGxpbmcgc3BtaV9kZXZpY2VfYWRkKCkgdG8gYWRkIHRoZQorICogbmV3bHkgYWxsb2NhdGVkIGNvbnRyb2xsZXIsIG9yIGNhbGxpbmcgc3BtaV9kZXZpY2VfcHV0KCkgdG8gZGlzY2FyZCBpdC4KKyAqLworc3RydWN0IHNwbWlfZGV2aWNlICpzcG1pX2RldmljZV9hbGxvYyhzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCXN0cnVjdCBzcG1pX2RldmljZSAqc2RldjsKKworCXNkZXYgPSBremFsbG9jKHNpemVvZigqc2RldiksIEdGUF9LRVJORUwpOworCWlmICghc2RldikKKwkJcmV0dXJuIE5VTEw7CisKKwlzZGV2LT5jdHJsID0gY3RybDsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmc2Rldi0+ZGV2KTsKKwlzZGV2LT5kZXYucGFyZW50ID0gJmN0cmwtPmRldjsKKwlzZGV2LT5kZXYuYnVzID0gJnNwbWlfYnVzX3R5cGU7CisJc2Rldi0+ZGV2LnR5cGUgPSAmc3BtaV9kZXZfdHlwZTsKKwlyZXR1cm4gc2RldjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZGV2aWNlX2FsbG9jKTsKKworLyoqCisgKiBzcG1pX2NvbnRyb2xsZXJfYWxsb2MoKSAtIEFsbG9jYXRlIGEgbmV3IFNQTUkgY29udHJvbGxlcgorICogQHBhcmVudDoJcGFyZW50IGRldmljZQorICogQHNpemU6CXNpemUgb2YgcHJpdmF0ZSBkYXRhCisgKgorICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlaXRoZXIgY2FsbGluZyBzcG1pX2NvbnRyb2xsZXJfYWRkKCkgdG8gYWRkIHRoZQorICogbmV3bHkgYWxsb2NhdGVkIGNvbnRyb2xsZXIsIG9yIGNhbGxpbmcgc3BtaV9jb250cm9sbGVyX3B1dCgpIHRvIGRpc2NhcmQgaXQuCisgKiBUaGUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSByZWdpb24gbWF5IGJlIGFjY2Vzc2VkIHZpYQorICogc3BtaV9jb250cm9sbGVyX2dldF9kcnZkYXRhKCkKKyAqLworc3RydWN0IHNwbWlfY29udHJvbGxlciAqc3BtaV9jb250cm9sbGVyX2FsbG9jKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCQkJICAgICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybDsKKwlpbnQgaWQ7CisKKwlpZiAoV0FSTl9PTighcGFyZW50KSkKKwkJcmV0dXJuIE5VTEw7CisKKwljdHJsID0ga3phbGxvYyhzaXplb2YoKmN0cmwpICsgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHJsKQorCQlyZXR1cm4gTlVMTDsKKworCWRldmljZV9pbml0aWFsaXplKCZjdHJsLT5kZXYpOworCWN0cmwtPmRldi50eXBlID0gJnNwbWlfY3RybF90eXBlOworCWN0cmwtPmRldi5idXMgPSAmc3BtaV9idXNfdHlwZTsKKwljdHJsLT5kZXYucGFyZW50ID0gcGFyZW50OworCWN0cmwtPmRldi5vZl9ub2RlID0gcGFyZW50LT5vZl9ub2RlOworCXNwbWlfY29udHJvbGxlcl9zZXRfZHJ2ZGF0YShjdHJsLCAmY3RybFsxXSk7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZjdHJsX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGlkIDwgMCkgeworCQlkZXZfZXJyKHBhcmVudCwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgU1BNSSBjb250cm9sbGVyIGlkZW50aWZpZXIuXG4iKTsKKwkJc3BtaV9jb250cm9sbGVyX3B1dChjdHJsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY3RybC0+bnIgPSBpZDsKKwlkZXZfc2V0X25hbWUoJmN0cmwtPmRldiwgInNwbWktJWQiLCBpZCk7CisKKwlkZXZfZGJnKCZjdHJsLT5kZXYsICJhbGxvY2F0ZWQgY29udHJvbGxlciAweCVwIGlkICVkXG4iLCBjdHJsLCBpZCk7CisJcmV0dXJuIGN0cmw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbnRyb2xsZXJfYWxsb2MpOworCitzdGF0aWMgdm9pZCBvZl9zcG1pX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJaW50IGVycjsKKworCWlmICghY3RybC0+ZGV2Lm9mX25vZGUpCisJCXJldHVybjsKKworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKGN0cmwtPmRldi5vZl9ub2RlLCBub2RlKSB7CisJCXN0cnVjdCBzcG1pX2RldmljZSAqc2RldjsKKwkJdTMyIHJlZ1syXTsKKworCQlkZXZfZGJnKCZjdHJsLT5kZXYsICJhZGRpbmcgY2hpbGQgJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwkJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobm9kZSwgInJlZyIsIHJlZywgMik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJmN0cmwtPmRldiwKKwkJCQkibm9kZSAlcyBlcnIgKCVkKSBkb2VzIG5vdCBoYXZlICdyZWcnIHByb3BlcnR5XG4iLAorCQkJCW5vZGUtPmZ1bGxfbmFtZSwgZXJyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlZ1sxXSAhPSBTUE1JX1VTSUQpIHsKKwkJCWRldl9lcnIoJmN0cmwtPmRldiwKKwkJCQkibm9kZSAlcyBjb250YWlucyB1bnN1cHBvcnRlZCAncmVnJyBlbnRyeVxuIiwKKwkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmVnWzBdID49IFNQTUlfTUFYX1NMQVZFX0lEKSB7CisJCQlkZXZfZXJyKCZjdHJsLT5kZXYsCisJCQkJImludmFsaWQgdXNpZCBvbiBub2RlICVzXG4iLAorCQkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRldl9kYmcoJmN0cmwtPmRldiwgInJlYWQgdXNpZCAlMDJ4XG4iLCByZWdbMF0pOworCisJCXNkZXYgPSBzcG1pX2RldmljZV9hbGxvYyhjdHJsKTsKKwkJaWYgKCFzZGV2KQorCQkJY29udGludWU7CisKKwkJc2Rldi0+ZGV2Lm9mX25vZGUgPSBub2RlOworCQlzZGV2LT51c2lkID0gKHU4KSByZWdbMF07CisKKwkJZXJyID0gc3BtaV9kZXZpY2VfYWRkKHNkZXYpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZzZGV2LT5kZXYsCisJCQkJImZhaWx1cmUgYWRkaW5nIGRldmljZS4gc3RhdHVzICVkXG4iLCBlcnIpOworCQkJc3BtaV9kZXZpY2VfcHV0KHNkZXYpOworCQl9CisJfQorfQorCisvKioKKyAqIHNwbWlfY29udHJvbGxlcl9hZGQoKSAtIEFkZCBhbiBTUE1JIGNvbnRyb2xsZXIKKyAqIEBjdHJsOgljb250cm9sbGVyIHRvIGJlIHJlZ2lzdGVyZWQuCisgKgorICogUmVnaXN0ZXIgYSBjb250cm9sbGVyIHByZXZpb3VzbHkgYWxsb2NhdGVkIHZpYSBzcG1pX2NvbnRyb2xsZXJfYWxsb2MoKSB3aXRoCisgKiB0aGUgU1BNSSBjb3JlLgorICovCitpbnQgc3BtaV9jb250cm9sbGVyX2FkZChzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCWludCByZXQ7CisKKwkvKiBDYW4ndCByZWdpc3RlciB1bnRpbCBhZnRlciBkcml2ZXIgbW9kZWwgaW5pdCAqLworCWlmIChXQVJOX09OKCFzcG1pX2J1c190eXBlLnApKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldCA9IGRldmljZV9hZGQoJmN0cmwtPmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19PRikpCisJCW9mX3NwbWlfcmVnaXN0ZXJfZGV2aWNlcyhjdHJsKTsKKworCWRldl9kYmcoJmN0cmwtPmRldiwgInNwbWktJWQgcmVnaXN0ZXJlZDogZGV2OiVwXG4iLAorCQljdHJsLT5uciwgJmN0cmwtPmRldik7CisKKwlyZXR1cm4gMDsKK307CitFWFBPUlRfU1lNQk9MX0dQTChzcG1pX2NvbnRyb2xsZXJfYWRkKTsKKworLyogUmVtb3ZlIGEgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgc3BtaV9jdHJsX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcG1pX2RldmljZSAqc3BtaWRldiA9IHRvX3NwbWlfZGV2aWNlKGRldik7CisJaWYgKGRldi0+dHlwZSA9PSAmc3BtaV9kZXZfdHlwZSkKKwkJc3BtaV9kZXZpY2VfcmVtb3ZlKHNwbWlkZXYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwbWlfY29udHJvbGxlcl9yZW1vdmUoKTogcmVtb3ZlIGFuIFNQTUkgY29udHJvbGxlcgorICogQGN0cmw6CWNvbnRyb2xsZXIgdG8gcmVtb3ZlCisgKgorICogUmVtb3ZlIGEgU1BNSSBjb250cm9sbGVyLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgKiBzcG1pX2NvbnRyb2xsZXJfcHV0KCkgdG8gZGlzY2FyZCB0aGUgYWxsb2NhdGVkIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgc3BtaV9jb250cm9sbGVyX3JlbW92ZShzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCWludCBkdW1teTsKKworCWlmICghY3RybCkKKwkJcmV0dXJuOworCisJZHVtbXkgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmN0cmwtPmRldiwgTlVMTCwKKwkJCQkgICAgICBzcG1pX2N0cmxfcmVtb3ZlX2RldmljZSk7CisJZGV2aWNlX2RlbCgmY3RybC0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfY29udHJvbGxlcl9yZW1vdmUpOworCisvKioKKyAqIHNwbWlfZHJpdmVyX3JlZ2lzdGVyKCkgLSBSZWdpc3RlciBjbGllbnQgZHJpdmVyIHdpdGggU1BNSSBjb3JlCisgKiBAc2RydjoJY2xpZW50IGRyaXZlciB0byBiZSBhc3NvY2lhdGVkIHdpdGggY2xpZW50LWRldmljZS4KKyAqCisgKiBUaGlzIEFQSSB3aWxsIHJlZ2lzdGVyIHRoZSBjbGllbnQgZHJpdmVyIHdpdGggdGhlIFNQTUkgZnJhbWV3b3JrLgorICogSXQgaXMgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIncyBtb2R1bGUtaW5pdCBmdW5jdGlvbi4KKyAqLworaW50IHNwbWlfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzcG1pX2RyaXZlciAqc2RydikKK3sKKwlzZHJ2LT5kcml2ZXIuYnVzID0gJnNwbWlfYnVzX3R5cGU7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmc2Rydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwbWlfZHJpdmVyX3JlZ2lzdGVyKTsKKworc3RhdGljIHZvaWQgX19leGl0IHNwbWlfZXhpdCh2b2lkKQoreworCWJ1c191bnJlZ2lzdGVyKCZzcG1pX2J1c190eXBlKTsKK30KK21vZHVsZV9leGl0KHNwbWlfZXhpdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNwbWlfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJnNwbWlfYnVzX3R5cGUpOworfQorcG9zdGNvcmVfaW5pdGNhbGwoc3BtaV9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUE1JIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzcG1pIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCmluZGV4IDk5Mzc1ZjAuLjQ3Y2YxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC0zNCw4ICszNCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZWNoby9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL0tjb25maWciCkBAIC04Miw4ICs4MCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9LY29uZmlnIgpAQCAtMTI4LDggKzEyNCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RncnAvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2IxMDV4L0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL0tjb25maWciCkBAIC0xNDYsNCArMTQwLDEwIEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RnYXAvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9LY29uZmlnIgorCiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCBkZGMzYzRhLi5kMTJmNjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC05LDcgKzksNiBAQAogb2JqLSQoQ09ORklHX1VTQklQX0NPUkUpCSs9IHVzYmlwLwogb2JqLSQoQ09ORklHX1czNVVORCkJCSs9IHdpbmJvbmQvCiBvYmotJChDT05GSUdfUFJJU00yX1VTQikJKz0gd2xhbi1uZy8KLW9iai0kKENPTkZJR19FQ0hPKQkJKz0gZWNoby8KIG9iai0kKENPTkZJR19DT01FREkpCQkrPSBjb21lZGkvCiBvYmotJChDT05GSUdfRkJfT0xQQ19EQ09OKQkrPSBvbHBjX2Rjb24vCiBvYmotJChDT05GSUdfUEFORUwpCQkrPSBwYW5lbC8KQEAgLTM1LDcgKzM0LDYgQEAKIG9iai0kKENPTkZJR19JSU8pCQkrPSBpaW8vCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMikJKz0gd2xhZ3M0OV9oMi8KIG9iai0kKENPTkZJR19XTEFHUzQ5X0gyNSkJKz0gd2xhZ3M0OV9oMjUvCi1vYmotJChDT05GSUdfRkJfU003WFgpCQkrPSBzbTd4eGZiLwogb2JqLSQoQ09ORklHX0NSWVNUQUxIRCkJCSs9IGNyeXN0YWxoZC8KIG9iai0kKENPTkZJR19DWFQxRTEpCQkrPSBjeHQxZTEvCiBvYmotJChDT05GSUdfRkJfWEdJKQkJKz0geGdpZmIvCkBAIC01Nyw3ICs1NSw2IEBACiBvYmotJChDT05GSUdfQ0VEMTQwMSkJCSs9IGNlZDE0MDEvCiBvYmotJChDT05GSUdfRFJNX0lNWCkJCSs9IGlteC1kcm0vCiBvYmotJChDT05GSUdfREdSUCkJCSs9IGRncnAvCi1vYmotJChDT05GSUdfU0IxMDVYKQkJKz0gc2IxMDV4Lwogb2JqLSQoQ09ORklHX0ZJUkVXSVJFX1NFUklBTCkJKz0gZndzZXJpYWwvCiBvYmotJChDT05GSUdfR09MREZJU0gpCQkrPSBnb2xkZmlzaC8KIG9iai0kKENPTkZJR19MVVNUUkVfRlMpCQkrPSBsdXN0cmUvCkBAIC02NSwzICs2Miw2IEBACiBvYmotJChDT05GSUdfREdOQykJCQkrPSBkZ25jLwogb2JqLSQoQ09ORklHX0RHQVApCQkJKz0gZGdhcC8KIG9iai0kKENPTkZJR19NVERfU1BJTkFORF9NVDI5RikJKz0gbXQyOWZfc3BpbmFuZC8KK29iai0kKENPTkZJR19HU19GUEdBQk9PVCkJKz0gZ3NfZnBnYWJvb3QvCitvYmotJChDT05GSUdfQlRfTk9LSUFfSDRQKQkrPSBub2tpYV9oNHAvCitvYmotJChDT05GSUdfVU5JU1lTU1BBUikJKz0gdW5pc3lzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKaW5kZXggYjkxYzc1OC4uYWIyOGQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCkBAIC0yMCw2ICsyMCwxOSBAQAogCSAgQW5kcm9pZCBwcm9jZXNzLCB1c2luZyBCaW5kZXIgdG8gaWRlbnRpZnksIGludm9rZSBhbmQgcGFzcyBhcmd1bWVudHMKIAkgIGJldHdlZW4gc2FpZCBwcm9jZXNzZXMuCiAKK2NvbmZpZyBBTkRST0lEX0JJTkRFUl9JUENfMzJCSVQKKwlib29sCisJZGVwZW5kcyBvbiAhNjRCSVQgJiYgQU5EUk9JRF9CSU5ERVJfSVBDCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhlIEJpbmRlciBBUEkgaGFzIGJlZW4gY2hhbmdlZCB0byBzdXBwb3J0IGJvdGggMzIgYW5kIDY0Yml0CisJICBhcHBsaWNhdGlvbnMgaW4gYSBtaXhlZCBlbnZpcm9ubWVudC4KKworCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBhbiBvbGQgMzItYml0IEFuZHJvaWQgdXNlci1zcGFjZSAodjQuNCBhbmQKKwkgIGVhcmxpZXIpLgorCisJICBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIGJyZWFrIG5ld2VyIEFuZHJvaWQgdXNlci1zcGFjZS4KKwogY29uZmlnIEFTSE1FTQogCWJvb2wgIkVuYWJsZSB0aGUgQW5vbnltb3VzIFNoYXJlZCBNZW1vcnkgU3Vic3lzdGVtIgogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYW5kcm9pZF9hbGFybS5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYW5kcm9pZF9hbGFybS5oCmluZGV4IDRmZDMyZjMuLjQ5NWIyMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FuZHJvaWRfYWxhcm0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hbmRyb2lkX2FsYXJtLmgKQEAgLTE2LDUwICsxNiwxMCBAQAogI2lmbmRlZiBfTElOVVhfQU5EUk9JRF9BTEFSTV9ICiAjZGVmaW5lIF9MSU5VWF9BTkRST0lEX0FMQVJNX0gKIAotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAKLWVudW0gYW5kcm9pZF9hbGFybV90eXBlIHsKLQkvKiByZXR1cm4gY29kZSBiaXQgbnVtYmVycyBvciBzZXQgYWxhcm0gYXJnICovCi0JQU5EUk9JRF9BTEFSTV9SVENfV0FLRVVQLAotCUFORFJPSURfQUxBUk1fUlRDLAotCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsCi0JQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FLAotCUFORFJPSURfQUxBUk1fU1lTVEVNVElNRSwKLQotCUFORFJPSURfQUxBUk1fVFlQRV9DT1VOVCwKLQotCS8qIHJldHVybiBjb2RlIGJpdCBudW1iZXJzICovCi0JLyogQU5EUk9JRF9BTEFSTV9USU1FX0NIQU5HRSA9IDE2ICovCi19OwotCi1lbnVtIGFuZHJvaWRfYWxhcm1fcmV0dXJuX2ZsYWdzIHsKLQlBTkRST0lEX0FMQVJNX1JUQ19XQUtFVVBfTUFTSyA9IDFVIDw8IEFORFJPSURfQUxBUk1fUlRDX1dBS0VVUCwKLQlBTkRST0lEX0FMQVJNX1JUQ19NQVNLID0gMVUgPDwgQU5EUk9JRF9BTEFSTV9SVEMsCi0JQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUF9NQVNLID0KLQkJCQkxVSA8PCBBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAotCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9NQVNLID0KLQkJCQkxVSA8PCBBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUUsCi0JQU5EUk9JRF9BTEFSTV9TWVNURU1USU1FX01BU0sgPSAxVSA8PCBBTkRST0lEX0FMQVJNX1NZU1RFTVRJTUUsCi0JQU5EUk9JRF9BTEFSTV9USU1FX0NIQU5HRV9NQVNLID0gMVUgPDwgMTYKLX07Ci0KLS8qIERpc2FibGUgYWxhcm0gKi8KLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9DTEVBUih0eXBlKSAgICAgICAgICAgX0lPKCdhJywgMCB8ICgodHlwZSkgPDwgNCkpCi0KLS8qIEFjayBsYXN0IGFsYXJtIGFuZCB3YWl0IGZvciBuZXh0ICovCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fV0FJVCAgICAgICAgICAgICAgICAgIF9JTygnYScsIDEpCi0KLSNkZWZpbmUgQUxBUk1fSU9XKGMsIHR5cGUsIHNpemUpICAgICAgICAgICAgX0lPVygnYScsIChjKSB8ICgodHlwZSkgPDwgNCksIHNpemUpCi0vKiBTZXQgYWxhcm0gKi8KLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9TRVQodHlwZSkgICAgICAgICAgICAgQUxBUk1fSU9XKDIsIHR5cGUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9TRVRfQU5EX1dBSVQodHlwZSkgICAgQUxBUk1fSU9XKDMsIHR5cGUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9HRVRfVElNRSh0eXBlKSAgICAgICAgQUxBUk1fSU9XKDQsIHR5cGUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9TRVRfUlRDICAgICAgICAgICAgICAgX0lPVygnYScsIDUsIHN0cnVjdCB0aW1lc3BlYykKLSNkZWZpbmUgQU5EUk9JRF9BTEFSTV9CQVNFX0NNRChjbWQpICAgICAgICAgKGNtZCAmIH4oX0lPQygwLCAwLCAweGYwLCAwKSkpCi0jZGVmaW5lIEFORFJPSURfQUxBUk1fSU9DVExfVE9fVFlQRShjbWQpICAgIChfSU9DX05SKGNtZCkgPj4gNCkKLQorI2luY2x1ZGUgInVhcGkvYW5kcm9pZF9hbGFybS5oIgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogI2RlZmluZSBBTkRST0lEX0FMQVJNX1NFVF9DT01QQVQodHlwZSkJCUFMQVJNX0lPVygyLCB0eXBlLCBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FzaG1lbS5oCmluZGV4IDhkYzBmMGQuLjVhYmNmZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FzaG1lbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FzaG1lbS5oCkBAIC0xNiwzNSArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKLSNkZWZpbmUgQVNITUVNX05BTUVfTEVOCQkyNTYKLQotI2RlZmluZSBBU0hNRU1fTkFNRV9ERUYJCSJkZXYvYXNobWVtIgotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gQVNITUVNX1BJTjogV2FzIHRoZSBtYXBwaW5nIHB1cmdlZCB3aGlsZSB1bnBpbm5lZD8gKi8KLSNkZWZpbmUgQVNITUVNX05PVF9QVVJHRUQJMAotI2RlZmluZSBBU0hNRU1fV0FTX1BVUkdFRAkxCi0KLS8qIFJldHVybiB2YWx1ZXMgZnJvbSBBU0hNRU1fR0VUX1BJTl9TVEFUVVM6IElzIHRoZSBtYXBwaW5nIHBpbm5lZD8gKi8KLSNkZWZpbmUgQVNITUVNX0lTX1VOUElOTkVECTAKLSNkZWZpbmUgQVNITUVNX0lTX1BJTk5FRAkxCi0KLXN0cnVjdCBhc2htZW1fcGluIHsKLQlfX3UzMiBvZmZzZXQ7CS8qIG9mZnNldCBpbnRvIHJlZ2lvbiwgaW4gYnl0ZXMsIHBhZ2UtYWxpZ25lZCAqLwotCV9fdTMyIGxlbjsJLyogbGVuZ3RoIGZvcndhcmQgZnJvbSBvZmZzZXQsIGluIGJ5dGVzLCBwYWdlLWFsaWduZWQgKi8KLX07Ci0KLSNkZWZpbmUgX19BU0hNRU1JT0MJCTB4NzcKLQotI2RlZmluZSBBU0hNRU1fU0VUX05BTUUJCV9JT1coX19BU0hNRU1JT0MsIDEsIGNoYXJbQVNITUVNX05BTUVfTEVOXSkKLSNkZWZpbmUgQVNITUVNX0dFVF9OQU1FCQlfSU9SKF9fQVNITUVNSU9DLCAyLCBjaGFyW0FTSE1FTV9OQU1FX0xFTl0pCi0jZGVmaW5lIEFTSE1FTV9TRVRfU0laRQkJX0lPVyhfX0FTSE1FTUlPQywgMywgc2l6ZV90KQotI2RlZmluZSBBU0hNRU1fR0VUX1NJWkUJCV9JTyhfX0FTSE1FTUlPQywgNCkKLSNkZWZpbmUgQVNITUVNX1NFVF9QUk9UX01BU0sJX0lPVyhfX0FTSE1FTUlPQywgNSwgdW5zaWduZWQgbG9uZykKLSNkZWZpbmUgQVNITUVNX0dFVF9QUk9UX01BU0sJX0lPKF9fQVNITUVNSU9DLCA2KQotI2RlZmluZSBBU0hNRU1fUElOCQlfSU9XKF9fQVNITUVNSU9DLCA3LCBzdHJ1Y3QgYXNobWVtX3BpbikKLSNkZWZpbmUgQVNITUVNX1VOUElOCQlfSU9XKF9fQVNITUVNSU9DLCA4LCBzdHJ1Y3QgYXNobWVtX3BpbikKLSNkZWZpbmUgQVNITUVNX0dFVF9QSU5fU1RBVFVTCV9JTyhfX0FTSE1FTUlPQywgOSkKLSNkZWZpbmUgQVNITUVNX1BVUkdFX0FMTF9DQUNIRVMJX0lPKF9fQVNITUVNSU9DLCAxMCkKKyNpbmNsdWRlICJ1YXBpL2FzaG1lbS5oIgogCiAvKiBzdXBwb3J0IG9mIDMyYml0IHVzZXJzcGFjZSBvbiA2NGJpdCBwbGF0Zm9ybXMgKi8KICNpZmRlZiBDT05GSUdfQ09NUEFUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCmluZGV4IDE0MzJkOTUuLmNmZTRiYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCkBAIC0yMjgsOCArMjI4LDggQEAKIAlpbnQgaW50ZXJuYWxfc3Ryb25nX3JlZnM7CiAJaW50IGxvY2FsX3dlYWtfcmVmczsKIAlpbnQgbG9jYWxfc3Ryb25nX3JlZnM7Ci0Jdm9pZCBfX3VzZXIgKnB0cjsKLQl2b2lkIF9fdXNlciAqY29va2llOworCWJpbmRlcl91aW50cHRyX3QgcHRyOworCWJpbmRlcl91aW50cHRyX3QgY29va2llOwogCXVuc2lnbmVkIGhhc19zdHJvbmdfcmVmOjE7CiAJdW5zaWduZWQgcGVuZGluZ19zdHJvbmdfcmVmOjE7CiAJdW5zaWduZWQgaGFzX3dlYWtfcmVmOjE7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAogc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggewogCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOwotCXZvaWQgX191c2VyICpjb29raWU7CisJYmluZGVyX3VpbnRwdHJfdCBjb29raWU7CiB9OwogCiBzdHJ1Y3QgYmluZGVyX3JlZiB7CkBAIC01MTUsMTQgKzUxNSwxNCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9idWZmZXJfbG9va3VwKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJCSAgdm9pZCBfX3VzZXIgKnVzZXJfcHRyKQorCQkJCQkJICB1aW50cHRyX3QgdXNlcl9wdHIpCiB7CiAJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycy5yYl9ub2RlOwogCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CiAJc3RydWN0IGJpbmRlcl9idWZmZXIgKmtlcm5fcHRyOwogCi0Ja2Vybl9wdHIgPSB1c2VyX3B0ciAtIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldAotCQktIG9mZnNldG9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBkYXRhKTsKKwlrZXJuX3B0ciA9IChzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqKSh1c2VyX3B0ciAtIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldAorCQktIG9mZnNldG9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBkYXRhKSk7CiAKIAl3aGlsZSAobikgewogCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CkBAIC04NTYsNyArODU2LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX2dldF9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJICAgdm9pZCBfX3VzZXIgKnB0cikKKwkJCQkJICAgYmluZGVyX3VpbnRwdHJfdCBwdHIpCiB7CiAJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5ub2Rlcy5yYl9ub2RlOwogCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKQEAgLTg3NSw4ICs4NzUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJpbmRlcl9ub2RlICpiaW5kZXJfbmV3X25vZGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJCQkgICB2b2lkIF9fdXNlciAqcHRyLAotCQkJCQkgICB2b2lkIF9fdXNlciAqY29va2llKQorCQkJCQkgICBiaW5kZXJfdWludHB0cl90IHB0ciwKKwkJCQkJICAgYmluZGVyX3VpbnRwdHJfdCBjb29raWUpCiB7CiAJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPm5vZGVzLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC05MDgsOSArOTA4LDkgQEAKIAlJTklUX0xJU1RfSEVBRCgmbm9kZS0+d29yay5lbnRyeSk7CiAJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPmFzeW5jX3RvZG8pOwogCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJICAgICAiJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIGNyZWF0ZWRcbiIsCisJCSAgICAgIiVkOiVkIG5vZGUgJWQgdSUwMTZsbHggYyUwMTZsbHggY3JlYXRlZFxuIiwKIAkJICAgICBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCi0JCSAgICAgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQkgICAgICh1NjQpbm9kZS0+cHRyLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJcmV0dXJuIG5vZGU7CiB9CiAKQEAgLTEyMjYsOSArMTIyNiw5IEBACiAKIHN0YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCiAJCQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIsCi0JCQkJCSAgICAgIHNpemVfdCAqZmFpbGVkX2F0KQorCQkJCQkgICAgICBiaW5kZXJfc2l6ZV90ICpmYWlsZWRfYXQpCiB7Ci0Jc2l6ZV90ICpvZmZwLCAqb2ZmX2VuZDsKKwliaW5kZXJfc2l6ZV90ICpvZmZwLCAqb2ZmX2VuZDsKIAlpbnQgZGVidWdfaWQgPSBidWZmZXItPmRlYnVnX2lkOwogCiAJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKQEAgLTEyMzksNyArMTIzOSw4IEBACiAJaWYgKGJ1ZmZlci0+dGFyZ2V0X25vZGUpCiAJCWJpbmRlcl9kZWNfbm9kZShidWZmZXItPnRhcmdldF9ub2RlLCAxLCAwKTsKIAotCW9mZnAgPSAoc2l6ZV90ICopKGJ1ZmZlci0+ZGF0YSArIEFMSUdOKGJ1ZmZlci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkpOworCW9mZnAgPSAoYmluZGVyX3NpemVfdCAqKShidWZmZXItPmRhdGEgKworCQkJCSBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKIAlpZiAoZmFpbGVkX2F0KQogCQlvZmZfZW5kID0gZmFpbGVkX2F0OwogCWVsc2UKQEAgLTEyNDksOCArMTI1MCw4IEBACiAJCWlmICgqb2ZmcCA+IGJ1ZmZlci0+ZGF0YV9zaXplIC0gc2l6ZW9mKCpmcCkgfHwKIAkJICAgIGJ1ZmZlci0+ZGF0YV9zaXplIDwgc2l6ZW9mKCpmcCkgfHwKIAkJICAgICFJU19BTElHTkVEKCpvZmZwLCBzaXplb2YodTMyKSkpIHsKLQkJCXByX2VycigidHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQgb2Zmc2V0ICV6ZCwgc2l6ZSAlemRcbiIsCi0JCQkgZGVidWdfaWQsICpvZmZwLCBidWZmZXItPmRhdGFfc2l6ZSk7CisJCQlwcl9lcnIoInRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG9mZnNldCAlbGxkLCBzaXplICV6ZFxuIiwKKwkJCSAgICAgICBkZWJ1Z19pZCwgKHU2NCkqb2ZmcCwgYnVmZmVyLT5kYXRhX3NpemUpOwogCQkJY29udGludWU7CiAJCX0KIAkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKShidWZmZXItPmRhdGEgKyAqb2ZmcCk7CkBAIC0xMjU5LDEzICsxMjYwLDEzIEBACiAJCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKIAkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBmcC0+YmluZGVyKTsKIAkJCWlmIChub2RlID09IE5VTEwpIHsKLQkJCQlwcl9lcnIoInRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG5vZGUgJXBcbiIsCi0JCQkJCWRlYnVnX2lkLCBmcC0+YmluZGVyKTsKKwkJCQlwcl9lcnIoInRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG5vZGUgJTAxNmxseFxuIiwKKwkJCQkgICAgICAgZGVidWdfaWQsICh1NjQpZnAtPmJpbmRlcik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgbm9kZSAlZCB1JXBcbiIsCi0JCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyKTsKKwkJCQkgICAgICIgICAgICAgIG5vZGUgJWQgdSUwMTZsbHhcbiIsCisJCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgKHU2NClub2RlLT5wdHIpOwogCQkJYmluZGVyX2RlY19ub2RlKG5vZGUsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUiwgMCk7CiAJCX0gYnJlYWs7CiAJCWNhc2UgQklOREVSX1RZUEVfSEFORExFOgpAQCAtMTMwMyw3ICsxMzA0LDcgQEAKIHsKIAlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OwogCXN0cnVjdCBiaW5kZXJfd29yayAqdGNvbXBsZXRlOwotCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CisJYmluZGVyX3NpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CiAJc3RydWN0IGJpbmRlcl9wcm9jICp0YXJnZXRfcHJvYzsKIAlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCA9IE5VTEw7CiAJc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZSA9IE5VTEw7CkBAIC0xNDMyLDE4ICsxNDMzLDIwIEBACiAKIAlpZiAocmVwbHkpCiAJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkgICAgICIlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCisJCQkgICAgICIlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgZGF0YSAlMDE2bGx4LSUwMTZsbHggc2l6ZSAlbGxkLSVsbGRcbiIsCiAJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAogCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfdGhyZWFkLT5waWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YS5wdHIuYnVmZmVyLAorCQkJICAgICAodTY0KXRyLT5kYXRhLnB0ci5vZmZzZXRzLAorCQkJICAgICAodTY0KXRyLT5kYXRhX3NpemUsICh1NjQpdHItPm9mZnNldHNfc2l6ZSk7CiAJZWxzZQogCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiJWQ6JWQgQkNfVFJBTlNBQ1RJT04gJWQgLT4gJWQgLSBub2RlICVkLCBkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKKwkJCSAgICAgIiVkOiVkIEJDX1RSQU5TQUNUSU9OICVkIC0+ICVkIC0gbm9kZSAlZCwgZGF0YSAlMDE2bGx4LSUwMTZsbHggc2l6ZSAlbGxkLSVsbGRcbiIsCiAJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAogCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfbm9kZS0+ZGVidWdfaWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwkJCSAgICAgKHU2NCl0ci0+ZGF0YS5wdHIuYnVmZmVyLAorCQkJICAgICAodTY0KXRyLT5kYXRhLnB0ci5vZmZzZXRzLAorCQkJICAgICAodTY0KXRyLT5kYXRhX3NpemUsICh1NjQpdHItPm9mZnNldHNfc2l6ZSk7CiAKIAlpZiAoIXJlcGx5ICYmICEodHItPmZsYWdzICYgVEZfT05FX1dBWSkpCiAJCXQtPmZyb20gPSB0aHJlYWQ7CkBAIC0xNDcyLDIzICsxNDc1LDI2IEBACiAJaWYgKHRhcmdldF9ub2RlKQogCQliaW5kZXJfaW5jX25vZGUodGFyZ2V0X25vZGUsIDEsIDAsIE5VTEwpOwogCi0Jb2ZmcCA9IChzaXplX3QgKikodC0+YnVmZmVyLT5kYXRhICsgQUxJR04odHItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKwlvZmZwID0gKGJpbmRlcl9zaXplX3QgKikodC0+YnVmZmVyLT5kYXRhICsKKwkJCQkgQUxJR04odHItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcih0LT5idWZmZXItPmRhdGEsIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhX3NpemUpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKHQtPmJ1ZmZlci0+ZGF0YSwgKGNvbnN0IHZvaWQgX191c2VyICopKHVpbnRwdHJfdCkKKwkJCSAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhX3NpemUpKSB7CiAJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGRhdGEgcHRyXG4iLAogCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwogCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CiAJCWdvdG8gZXJyX2NvcHlfZGF0YV9mYWlsZWQ7CiAJfQotCWlmIChjb3B5X2Zyb21fdXNlcihvZmZwLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywgdHItPm9mZnNldHNfc2l6ZSkpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIob2ZmcCwgKGNvbnN0IHZvaWQgX191c2VyICopKHVpbnRwdHJfdCkKKwkJCSAgIHRyLT5kYXRhLnB0ci5vZmZzZXRzLCB0ci0+b2Zmc2V0c19zaXplKSkgewogCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBvZmZzZXRzIHB0clxuIiwKIAkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKIAkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwogCQlnb3RvIGVycl9jb3B5X2RhdGFfZmFpbGVkOwogCX0KLQlpZiAoIUlTX0FMSUdORUQodHItPm9mZnNldHNfc2l6ZSwgc2l6ZW9mKHNpemVfdCkpKSB7Ci0JCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIG9mZnNldHMgc2l6ZSwgJXpkXG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRyLT5vZmZzZXRzX3NpemUpOworCWlmICghSVNfQUxJR05FRCh0ci0+b2Zmc2V0c19zaXplLCBzaXplb2YoYmluZGVyX3NpemVfdCkpKSB7CisJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIG9mZnNldHMgc2l6ZSwgJWxsZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KXRyLT5vZmZzZXRzX3NpemUpOwogCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CiAJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7CiAJfQpAQCAtMTQ5OCw4ICsxNTA0LDggQEAKIAkJaWYgKCpvZmZwID4gdC0+YnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSB8fAogCQkgICAgdC0+YnVmZmVyLT5kYXRhX3NpemUgPCBzaXplb2YoKmZwKSB8fAogCQkgICAgIUlTX0FMSUdORUQoKm9mZnAsIHNpemVvZih1MzIpKSkgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgb2Zmc2V0LCAlemRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICpvZmZwKTsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIG9mZnNldCwgJWxsZFxuIiwKKwkJCQkJICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KSpvZmZwKTsKIAkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKIAkJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7CiAJCX0KQEAgLTE1MTksMTAgKzE1MjUsMTAgQEAKIAkJCQlub2RlLT5hY2NlcHRfZmRzID0gISEoZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyk7CiAJCQl9CiAJCQlpZiAoZnAtPmNvb2tpZSAhPSBub2RlLT5jb29raWUpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgc2VuZGluZyB1JXAgbm9kZSAlZCwgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAorCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBzZW5kaW5nIHUlMDE2bGx4IG5vZGUgJWQsIGNvb2tpZSBtaXNtYXRjaCAlMDE2bGx4ICE9ICUwMTZsbHhcbiIsCiAJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCWZwLT5iaW5kZXIsIG5vZGUtPmRlYnVnX2lkLAotCQkJCQlmcC0+Y29va2llLCBub2RlLT5jb29raWUpOworCQkJCQkodTY0KWZwLT5iaW5kZXIsIG5vZGUtPmRlYnVnX2lkLAorCQkJCQkodTY0KWZwLT5jb29raWUsICh1NjQpbm9kZS0+Y29va2llKTsKIAkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7CiAJCQl9CiAJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZSh0YXJnZXRfcHJvYywgbm9kZSk7CkBAIC0xNTQwLDkgKzE1NDYsOSBAQAogCiAJCQl0cmFjZV9iaW5kZXJfdHJhbnNhY3Rpb25fbm9kZV90b19yZWYodCwgbm9kZSwgcmVmKTsKIAkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJICAgICAiICAgICAgICBub2RlICVkIHUlcCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKLQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIHJlZi0+ZGVidWdfaWQsCi0JCQkJICAgICByZWYtPmRlc2MpOworCQkJCSAgICAgIiAgICAgICAgbm9kZSAlZCB1JTAxNmxseCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKKwkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLCAodTY0KW5vZGUtPnB0ciwKKwkJCQkgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYyk7CiAJCX0gYnJlYWs7CiAJCWNhc2UgQklOREVSX1RZUEVfSEFORExFOgogCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOiB7CkBAIC0xNTY0LDkgKzE1NzAsOSBAQAogCQkJCWJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUiwgMCwgTlVMTCk7CiAJCQkJdHJhY2VfYmluZGVyX3RyYW5zYWN0aW9uX3JlZl90b19ub2RlKHQsIHJlZik7CiAJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiBub2RlICVkIHUlcFxuIiwKKwkJCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiBub2RlICVkIHUlMDE2bGx4XG4iLAogCQkJCQkgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5ub2RlLT5kZWJ1Z19pZCwKLQkJCQkJICAgICByZWYtPm5vZGUtPnB0cik7CisJCQkJCSAgICAgKHU2NClyZWYtPm5vZGUtPnB0cik7CiAJCQl9IGVsc2UgewogCQkJCXN0cnVjdCBiaW5kZXJfcmVmICpuZXdfcmVmOwogCQkJCW5ld19yZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZSh0YXJnZXRfcHJvYywgcmVmLT5ub2RlKTsKQEAgLTE2ODIsOSArMTY4OCw5IEBACiBlcnJfaW52YWxpZF90YXJnZXRfaGFuZGxlOgogZXJyX25vX2NvbnRleHRfbWdyX25vZGU6CiAJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04sCi0JCSAgICAgIiVkOiVkIHRyYW5zYWN0aW9uIGZhaWxlZCAlZCwgc2l6ZSAlemQtJXpkXG4iLAorCQkgICAgICIlZDolZCB0cmFuc2FjdGlvbiBmYWlsZWQgJWQsIHNpemUgJWxsZC0lbGxkXG4iLAogCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHJldHVybl9lcnJvciwKLQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwkJICAgICAodTY0KXRyLT5kYXRhX3NpemUsICh1NjQpdHItPm9mZnNldHNfc2l6ZSk7CiAKIAl7CiAJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpmZTsKQEAgLTE3MDIsOSArMTcwOCwxMSBAQAogCiBzdGF0aWMgaW50IGJpbmRlcl90aHJlYWRfd3JpdGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAogCQkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3QgKmNvbnN1bWVkKQorCQkJYmluZGVyX3VpbnRwdHJfdCBiaW5kZXJfYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKwkJCWJpbmRlcl9zaXplX3QgKmNvbnN1bWVkKQogewogCXVpbnQzMl90IGNtZDsKKwl2b2lkIF9fdXNlciAqYnVmZmVyID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdCliaW5kZXJfYnVmZmVyOwogCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7CiAJdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7CiAKQEAgLTE3NzMsMzMgKzE3ODEsMzMgQEAKIAkJfQogCQljYXNlIEJDX0lOQ1JFRlNfRE9ORToKIAkJY2FzZSBCQ19BQ1FVSVJFX0RPTkU6IHsKLQkJCXZvaWQgX191c2VyICpub2RlX3B0cjsKLQkJCXZvaWQgX191c2VyICpjb29raWU7CisJCQliaW5kZXJfdWludHB0cl90IG5vZGVfcHRyOworCQkJYmluZGVyX3VpbnRwdHJfdCBjb29raWU7CiAJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CiAKLQkJCWlmIChnZXRfdXNlcihub2RlX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJaWYgKGdldF91c2VyKG5vZGVfcHRyLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsIChiaW5kZXJfdWludHB0cl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlwdHIgKz0gc2l6ZW9mKGJpbmRlcl91aW50cHRyX3QpOwogCQkJbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBub2RlX3B0cik7CiAJCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkICVzIHUlcCBubyBtYXRjaFxuIiwKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgJXMgdSUwMTZsbHggbm8gbWF0Y2hcbiIsCiAJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJCWNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPwogCQkJCQkiQkNfSU5DUkVGU19ET05FIiA6CiAJCQkJCSJCQ19BQ1FVSVJFX0RPTkUiLAotCQkJCQlub2RlX3B0cik7CisJCQkJCSh1NjQpbm9kZV9wdHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKGNvb2tpZSAhPSBub2RlLT5jb29raWUpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgJXMgdSVwIG5vZGUgJWQgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAorCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCAlcyB1JTAxNmxseCBub2RlICVkIGNvb2tpZSBtaXNtYXRjaCAlMDE2bGx4ICE9ICUwMTZsbHhcbiIsCiAJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJCWNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPwogCQkJCQkiQkNfSU5DUkVGU19ET05FIiA6ICJCQ19BQ1FVSVJFX0RPTkUiLAotCQkJCQlub2RlX3B0ciwgbm9kZS0+ZGVidWdfaWQsCi0JCQkJCWNvb2tpZSwgbm9kZS0+Y29va2llKTsKKwkJCQkJKHU2NClub2RlX3B0ciwgbm9kZS0+ZGVidWdfaWQsCisJCQkJCSh1NjQpY29va2llLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoY21kID09IEJDX0FDUVVJUkVfRE9ORSkgewpAQCAtMTgzNSwyNyArMTg0MywyOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJY2FzZSBCQ19GUkVFX0JVRkZFUjogewotCQkJdm9pZCBfX3VzZXIgKmRhdGFfcHRyOworCQkJYmluZGVyX3VpbnRwdHJfdCBkYXRhX3B0cjsKIAkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CiAKLQkJCWlmIChnZXRfdXNlcihkYXRhX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJaWYgKGdldF91c2VyKGRhdGFfcHRyLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKIAogCQkJYnVmZmVyID0gYmluZGVyX2J1ZmZlcl9sb29rdXAocHJvYywgZGF0YV9wdHIpOwogCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlcCBubyBtYXRjaFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGF0YV9wdHIpOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JTAxNmxseCBubyBtYXRjaFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKHU2NClkYXRhX3B0cik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoIWJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlcCBtYXRjaGVkIHVucmV0dXJuZWQgYnVmZmVyXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0cik7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlMDE2bGx4IG1hdGNoZWQgdW5yZXR1cm5lZCBidWZmZXJcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICh1NjQpZGF0YV9wdHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUiwKLQkJCQkgICAgICIlZDolZCBCQ19GUkVFX0JVRkZFUiB1JXAgZm91bmQgYnVmZmVyICVkIGZvciAlcyB0cmFuc2FjdGlvblxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyLCBidWZmZXItPmRlYnVnX2lkLAorCQkJCSAgICAgIiVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlMDE2bGx4IGZvdW5kIGJ1ZmZlciAlZCBmb3IgJXMgdHJhbnNhY3Rpb25cbiIsCisJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KWRhdGFfcHRyLAorCQkJCSAgICAgYnVmZmVyLT5kZWJ1Z19pZCwKIAkJCQkgICAgIGJ1ZmZlci0+dHJhbnNhY3Rpb24gPyAiYWN0aXZlIiA6ICJmaW5pc2hlZCIpOwogCiAJCQlpZiAoYnVmZmVyLT50cmFuc2FjdGlvbikgewpAQCAtMTkyNSwxNiArMTkzNCwxNiBAQAogCQljYXNlIEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OOgogCQljYXNlIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogewogCQkJdWludDMyX3QgdGFyZ2V0OwotCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwkJCWJpbmRlcl91aW50cHRyX3QgY29va2llOwogCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKIAkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aDsKIAogCQkJaWYgKGdldF91c2VyKHRhcmdldCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAoYmluZGVyX3VpbnRwdHJfdCBfX3VzZXIgKilwdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJcHRyICs9IHNpemVvZihiaW5kZXJfdWludHB0cl90KTsKIAkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRhcmdldCk7CiAJCQlpZiAocmVmID09IE5VTEwpIHsKIAkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgJXMgaW52YWxpZCByZWYgJWRcbiIsCkBAIC0xOTQ3LDEyICsxOTU2LDEyIEBACiAJCQl9CiAKIAkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBVEhfTk9USUZJQ0FUSU9OLAotCQkJCSAgICAgIiVkOiVkICVzICVwIHJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZCBmb3Igbm9kZSAlZFxuIiwKKwkJCQkgICAgICIlZDolZCAlcyAlMDE2bGx4IHJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZCBmb3Igbm9kZSAlZFxuIiwKIAkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJICAgICBjbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPwogCQkJCSAgICAgIkJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OIiA6CiAJCQkJICAgICAiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKLQkJCQkgICAgIGNvb2tpZSwgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLAorCQkJCSAgICAgKHU2NCljb29raWUsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywKIAkJCQkgICAgIHJlZi0+c3Ryb25nLCByZWYtPndlYWssIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwogCiAJCQlpZiAoY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OKSB7CkBAIC0xOTkwLDkgKzE5OTksMTAgQEAKIAkJCQl9CiAJCQkJZGVhdGggPSByZWYtPmRlYXRoOwogCQkJCWlmIChkZWF0aC0+Y29va2llICE9IGNvb2tpZSkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiJWQ6JWQgQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdGlvbiBjb29raWUgbWlzbWF0Y2ggJXAgIT0gJXBcbiIsCisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04gZGVhdGggbm90aWZpY2F0aW9uIGNvb2tpZSBtaXNtYXRjaCAlMDE2bGx4ICE9ICUwMTZsbHhcbiIsCiAJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQkJZGVhdGgtPmNvb2tpZSwgY29va2llKTsKKwkJCQkJCSh1NjQpZGVhdGgtPmNvb2tpZSwKKwkJCQkJCSh1NjQpY29va2llKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCXJlZi0+ZGVhdGggPSBOVUxMOwpAQCAtMjAxMiw5ICsyMDIyLDkgQEAKIAkJfSBicmVhazsKIAkJY2FzZSBCQ19ERUFEX0JJTkRFUl9ET05FOiB7CiAJCQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7Ci0JCQl2b2lkIF9fdXNlciAqY29va2llOworCQkJYmluZGVyX3VpbnRwdHJfdCBjb29raWU7CiAJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGggPSBOVUxMOwotCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKHZvaWQgX191c2VyICogX191c2VyICopcHRyKSkKKwkJCWlmIChnZXRfdXNlcihjb29raWUsIChiaW5kZXJfdWludHB0cl90IF9fdXNlciAqKXB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKQEAgLTIwMjYsMTEgKzIwMzYsMTIgQEAKIAkJCQl9CiAJCQl9CiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJCSAgICAgIiVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgZm91bmQgJXBcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUsIGRlYXRoKTsKKwkJCQkgICAgICIlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICUwMTZsbHggZm91bmQgJXBcbiIsCisJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KWNvb2tpZSwKKwkJCQkgICAgIGRlYXRoKTsKIAkJCWlmIChkZWF0aCA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgbm90IGZvdW5kXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUpOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICUwMTZsbHggbm90IGZvdW5kXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAodTY0KWNvb2tpZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIwODIsOSArMjA5MywxMCBAQAogCiBzdGF0aWMgaW50IGJpbmRlcl90aHJlYWRfcmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCiAJCQkgICAgICBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkJICAgICAgdm9pZCAgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLAotCQkJICAgICAgc2l6ZV90ICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKKwkJCSAgICAgIGJpbmRlcl91aW50cHRyX3QgYmluZGVyX2J1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgICAgICBiaW5kZXJfc2l6ZV90ICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKIHsKKwl2b2lkIF9fdXNlciAqYnVmZmVyID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdCliaW5kZXJfYnVmZmVyOwogCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7CiAJdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7CiAKQEAgLTIyMjksMzIgKzIyNDEsNDAgQEAKIAkJCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQkJaWYgKHB1dF91c2VyKG5vZGUtPnB0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJCWlmIChwdXRfdXNlcihub2RlLT5wdHIsCisJCQkJCSAgICAgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlwdHIgKz0gc2l6ZW9mKGJpbmRlcl91aW50cHRyX3QpOworCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsCisJCQkJCSAgICAgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJCXB0ciArPSBzaXplb2YoYmluZGVyX3VpbnRwdHJfdCk7CiAKIAkJCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7CiAJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19VU0VSX1JFRlMsCi0JCQkJCSAgICAgIiVkOiVkICVzICVkIHUlcCBjJXBcbiIsCi0JCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY21kX25hbWUsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCQkJCSAgICAgIiVkOiVkICVzICVkIHUlMDE2bGx4IGMlMDE2bGx4XG4iLAorCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZF9uYW1lLAorCQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLAorCQkJCQkgICAgICh1NjQpbm9kZS0+cHRyLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQl9IGVsc2UgewogCQkJCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKIAkJCQlpZiAoIXdlYWsgJiYgIXN0cm9uZykgewogCQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCQkJCQkgICAgICIlZDolZCBub2RlICVkIHUlcCBjJXAgZGVsZXRlZFxuIiwKLQkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCi0JCQkJCQkgICAgIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJCQkJCSAgICAgIiVkOiVkIG5vZGUgJWQgdSUwMTZsbHggYyUwMTZsbHggZGVsZXRlZFxuIiwKKwkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsCisJCQkJCQkgICAgICh1NjQpbm9kZS0+cHRyLAorCQkJCQkJICAgICAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCQkJCXJiX2VyYXNlKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOwogCQkJCQlrZnJlZShub2RlKTsKIAkJCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfTk9ERSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJCQkJICAgICAiJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIHN0YXRlIHVuY2hhbmdlZFxuIiwKLQkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwKLQkJCQkJCSAgICAgbm9kZS0+Y29va2llKTsKKwkJCQkJCSAgICAgIiVkOiVkIG5vZGUgJWQgdSUwMTZsbHggYyUwMTZsbHggc3RhdGUgdW5jaGFuZ2VkXG4iLAorCQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJICAgICBub2RlLT5kZWJ1Z19pZCwKKwkJCQkJCSAgICAgKHU2NClub2RlLT5wdHIsCisJCQkJCQkgICAgICh1NjQpbm9kZS0+Y29va2llKTsKIAkJCQl9CiAJCQl9CiAJCX0gYnJlYWs7CkBAIC0yMjcyLDE3ICsyMjkyLDE4IEBACiAJCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHB1dF91c2VyKGRlYXRoLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCWlmIChwdXRfdXNlcihkZWF0aC0+Y29va2llLAorCQkJCSAgICAgKGJpbmRlcl91aW50cHRyX3QgX191c2VyICopcHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCXB0ciArPSBzaXplb2YoYmluZGVyX3VpbnRwdHJfdCk7CiAJCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7CiAJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTiwKLQkJCQkgICAgICIlZDolZCAlcyAlcFxuIiwKKwkJCQkgICAgICIlZDolZCAlcyAlMDE2bGx4XG4iLAogCQkJCSAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCiAJCQkJICAgICAgY21kID09IEJSX0RFQURfQklOREVSID8KIAkJCQkgICAgICAiQlJfREVBRF9CSU5ERVIiIDoKIAkJCQkgICAgICAiQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUiLAotCQkJCSAgICAgIGRlYXRoLT5jb29raWUpOworCQkJCSAgICAgICh1NjQpZGVhdGgtPmNvb2tpZSk7CiAKIAkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikgewogCQkJCWxpc3RfZGVsKCZ3LT5lbnRyeSk7CkBAIC0yMzEyLDggKzIzMzMsOCBAQAogCQkJCWJpbmRlcl9zZXRfbmljZSh0YXJnZXRfbm9kZS0+bWluX3ByaW9yaXR5KTsKIAkJCWNtZCA9IEJSX1RSQU5TQUNUSU9OOwogCQl9IGVsc2UgewotCQkJdHIudGFyZ2V0LnB0ciA9IE5VTEw7Ci0JCQl0ci5jb29raWUgPSBOVUxMOworCQkJdHIudGFyZ2V0LnB0ciA9IDA7CisJCQl0ci5jb29raWUgPSAwOwogCQkJY21kID0gQlJfUkVQTFk7CiAJCX0KIAkJdHIuY29kZSA9IHQtPmNvZGU7CkBAIC0yMzMwLDggKzIzNTEsOSBAQAogCiAJCXRyLmRhdGFfc2l6ZSA9IHQtPmJ1ZmZlci0+ZGF0YV9zaXplOwogCQl0ci5vZmZzZXRzX3NpemUgPSB0LT5idWZmZXItPm9mZnNldHNfc2l6ZTsKLQkJdHIuZGF0YS5wdHIuYnVmZmVyID0gKHZvaWQgKil0LT5idWZmZXItPmRhdGEgKwotCQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQ7CisJCXRyLmRhdGEucHRyLmJ1ZmZlciA9IChiaW5kZXJfdWludHB0cl90KSgKKwkJCQkJKHVpbnRwdHJfdCl0LT5idWZmZXItPmRhdGEgKworCQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQpOwogCQl0ci5kYXRhLnB0ci5vZmZzZXRzID0gdHIuZGF0YS5wdHIuYnVmZmVyICsKIAkJCQkJQUxJR04odC0+YnVmZmVyLT5kYXRhX3NpemUsCiAJCQkJCSAgICBzaXplb2Yodm9pZCAqKSk7CkBAIC0yMzQ2LDE0ICsyMzY4LDE0IEBACiAJCXRyYWNlX2JpbmRlcl90cmFuc2FjdGlvbl9yZWNlaXZlZCh0KTsKIAkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwogCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiJWQ6JWQgJXMgJWQgJWQ6JWQsIGNtZCAlZCBzaXplICV6ZC0lemQgcHRyICVwLSVwXG4iLAorCQkJICAgICAiJWQ6JWQgJXMgJWQgJWQ6JWQsIGNtZCAlZCBzaXplICV6ZC0lemQgcHRyICUwMTZsbHgtJTAxNmxseFxuIiwKIAkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKIAkJCSAgICAgKGNtZCA9PSBCUl9UUkFOU0FDVElPTikgPyAiQlJfVFJBTlNBQ1RJT04iIDoKIAkJCSAgICAgIkJSX1JFUExZIiwKIAkJCSAgICAgdC0+ZGVidWdfaWQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAogCQkJICAgICB0LT5mcm9tID8gdC0+ZnJvbS0+cGlkIDogMCwgY21kLAogCQkJICAgICB0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCi0JCQkgICAgIHRyLmRhdGEucHRyLmJ1ZmZlciwgdHIuZGF0YS5wdHIub2Zmc2V0cyk7CisJCQkgICAgICh1NjQpdHIuZGF0YS5wdHIuYnVmZmVyLCAodTY0KXRyLmRhdGEucHRyLm9mZnNldHMpOwogCiAJCWxpc3RfZGVsKCZ0LT53b3JrLmVudHJ5KTsKIAkJdC0+YnVmZmVyLT5hbGxvd191c2VyX2ZyZWUgPSAxOwpAQCAtMjQyMyw4ICsyNDQ1LDggQEAKIAogCQkJZGVhdGggPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9yZWZfZGVhdGgsIHdvcmspOwogCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OLAotCQkJCSJ1bmRlbGl2ZXJlZCBkZWF0aCBub3RpZmljYXRpb24sICVwXG4iLAotCQkJCWRlYXRoLT5jb29raWUpOworCQkJCSJ1bmRlbGl2ZXJlZCBkZWF0aCBub3RpZmljYXRpb24sICUwMTZsbHhcbiIsCisJCQkJKHU2NClkZWF0aC0+Y29va2llKTsKIAkJCWtmcmVlKGRlYXRoKTsKIAkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKIAkJfSBicmVhazsKQEAgLTI1ODAsMTIgKzI2MDIsMTYgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUkVBRF9XUklURSwKLQkJCSAgICAgIiVkOiVkIHdyaXRlICV6ZCBhdCAlMDE2bHgsIHJlYWQgJXpkIGF0ICUwMTZseFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgYndyLndyaXRlX3NpemUsCi0JCQkgICAgIGJ3ci53cml0ZV9idWZmZXIsIGJ3ci5yZWFkX3NpemUsIGJ3ci5yZWFkX2J1ZmZlcik7CisJCQkgICAgICIlZDolZCB3cml0ZSAlbGxkIGF0ICUwMTZsbHgsIHJlYWQgJWxsZCBhdCAlMDE2bGx4XG4iLAorCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJICAgICAodTY0KWJ3ci53cml0ZV9zaXplLCAodTY0KWJ3ci53cml0ZV9idWZmZXIsCisJCQkgICAgICh1NjQpYndyLnJlYWRfc2l6ZSwgKHU2NClid3IucmVhZF9idWZmZXIpOwogCiAJCWlmIChid3Iud3JpdGVfc2l6ZSA+IDApIHsKLQkJCXJldCA9IGJpbmRlcl90aHJlYWRfd3JpdGUocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3Iud3JpdGVfYnVmZmVyLCBid3Iud3JpdGVfc2l6ZSwgJmJ3ci53cml0ZV9jb25zdW1lZCk7CisJCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3dyaXRlKHByb2MsIHRocmVhZCwKKwkJCQkJCSAgYndyLndyaXRlX2J1ZmZlciwKKwkJCQkJCSAgYndyLndyaXRlX3NpemUsCisJCQkJCQkgICZid3Iud3JpdGVfY29uc3VtZWQpOwogCQkJdHJhY2VfYmluZGVyX3dyaXRlX2RvbmUocmV0KTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJYndyLnJlYWRfY29uc3VtZWQgPSAwOwpAQCAtMjU5NSw3ICsyNjIxLDEwIEBACiAJCQl9CiAJCX0KIAkJaWYgKGJ3ci5yZWFkX3NpemUgPiAwKSB7Ci0JCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3JlYWQocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3IucmVhZF9idWZmZXIsIGJ3ci5yZWFkX3NpemUsICZid3IucmVhZF9jb25zdW1lZCwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQkJcmV0ID0gYmluZGVyX3RocmVhZF9yZWFkKHByb2MsIHRocmVhZCwgYndyLnJlYWRfYnVmZmVyLAorCQkJCQkJIGJ3ci5yZWFkX3NpemUsCisJCQkJCQkgJmJ3ci5yZWFkX2NvbnN1bWVkLAorCQkJCQkJIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAkJCXRyYWNlX2JpbmRlcl9yZWFkX2RvbmUocmV0KTsKIAkJCWlmICghbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykpCiAJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKQEAgLTI2MDYsOSArMjYzNSwxMCBAQAogCQkJfQogCQl9CiAJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUkVBRF9XUklURSwKLQkJCSAgICAgIiVkOiVkIHdyb3RlICV6ZCBvZiAlemQsIHJlYWQgcmV0dXJuICV6ZCBvZiAlemRcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGJ3ci53cml0ZV9jb25zdW1lZCwgYndyLndyaXRlX3NpemUsCi0JCQkgICAgIGJ3ci5yZWFkX2NvbnN1bWVkLCBid3IucmVhZF9zaXplKTsKKwkJCSAgICAgIiVkOiVkIHdyb3RlICVsbGQgb2YgJWxsZCwgcmVhZCByZXR1cm4gJWxsZCBvZiAlbGxkXG4iLAorCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJICAgICAodTY0KWJ3ci53cml0ZV9jb25zdW1lZCwgKHU2NClid3Iud3JpdGVfc2l6ZSwKKwkJCSAgICAgKHU2NClid3IucmVhZF9jb25zdW1lZCwgKHU2NClid3IucmVhZF9zaXplKTsKIAkJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCAmYndyLCBzaXplb2YoYndyKSkpIHsKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCQlnb3RvIGVycjsKQEAgLTI2MzcsNyArMjY2Nyw3IEBACiAJCQl9CiAJCX0gZWxzZQogCQkJYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IGN1cnJlbnQtPmNyZWQtPmV1aWQ7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gYmluZGVyX25ld19ub2RlKHByb2MsIE5VTEwsIE5VTEwpOworCQliaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9IGJpbmRlcl9uZXdfbm9kZShwcm9jLCAwLCAwKTsKIAkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl9ub2RlID09IE5VTEwpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycjsKQEAgLTMxMzIsOCArMzE2Miw5IEBACiAJCWJyZWFrOwogCWNhc2UgQklOREVSX1dPUktfTk9ERToKIAkJbm9kZSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHdvcmspOwotCQlzZXFfcHJpbnRmKG0sICIlc25vZGUgd29yayAlZDogdSVwIGMlcFxuIiwKLQkJCSAgIHByZWZpeCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJc2VxX3ByaW50ZihtLCAiJXNub2RlIHdvcmsgJWQ6IHUlMDE2bGx4IGMlMDE2bGx4XG4iLAorCQkJICAgcHJlZml4LCBub2RlLT5kZWJ1Z19pZCwKKwkJCSAgICh1NjQpbm9kZS0+cHRyLCAodTY0KW5vZGUtPmNvb2tpZSk7CiAJCWJyZWFrOwogCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6CiAJCXNlcV9wcmludGYobSwgIiVzaGFzIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOwpAQCAtMzE5Myw4ICszMjI0LDggQEAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWYsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KQogCQljb3VudCsrOwogCi0Jc2VxX3ByaW50ZihtLCAiICBub2RlICVkOiB1JXAgYyVwIGhzICVkIGh3ICVkIGxzICVkIGx3ICVkIGlzICVkIGl3ICVkIiwKLQkJICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llLAorCXNlcV9wcmludGYobSwgIiAgbm9kZSAlZDogdSUwMTZsbHggYyUwMTZsbHggaHMgJWQgaHcgJWQgbHMgJWQgbHcgJWQgaXMgJWQgaXcgJWQiLAorCQkgICBub2RlLT5kZWJ1Z19pZCwgKHU2NClub2RlLT5wdHIsICh1NjQpbm9kZS0+Y29va2llLAogCQkgICBub2RlLT5oYXNfc3Ryb25nX3JlZiwgbm9kZS0+aGFzX3dlYWtfcmVmLAogCQkgICBub2RlLT5sb2NhbF9zdHJvbmdfcmVmcywgbm9kZS0+bG9jYWxfd2Vha19yZWZzLAogCQkgICBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcywgY291bnQpOwpAQCAtMzQ5Niw2ICszNTI3LDcgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkucG9sbCA9IGJpbmRlcl9wb2xsLAogCS51bmxvY2tlZF9pb2N0bCA9IGJpbmRlcl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gYmluZGVyX2lvY3RsLAogCS5tbWFwID0gYmluZGVyX21tYXAsCiAJLm9wZW4gPSBiaW5kZXJfb3BlbiwKIAkuZmx1c2ggPSBiaW5kZXJfZmx1c2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCmluZGV4IGNiZTM0NTEuLmViMDgzNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCkBAIC0yMCwzMTEgKzIwLDExIEBACiAjaWZuZGVmIF9MSU5VWF9CSU5ERVJfSAogI2RlZmluZSBfTElOVVhfQklOREVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaWZkZWYgQ09ORklHX0FORFJPSURfQklOREVSX0lQQ18zMkJJVAorI2RlZmluZSBCSU5ERVJfSVBDXzMyQklUIDEKKyNlbmRpZgogCi0jZGVmaW5lIEJfUEFDS19DSEFSUyhjMSwgYzIsIGMzLCBjNCkgXAotCSgoKChjMSk8PDI0KSkgfCAoKChjMik8PDE2KSkgfCAoKChjMyk8PDgpKSB8IChjNCkpCi0jZGVmaW5lIEJfVFlQRV9MQVJHRSAweDg1Ci0KLWVudW0gewotCUJJTkRFUl9UWVBFX0JJTkRFUgk9IEJfUEFDS19DSEFSUygncycsICdiJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX1dFQUtfQklOREVSCT0gQl9QQUNLX0NIQVJTKCd3JywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfSEFORExFCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2gnLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfV0VBS19IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9GRAkJPSBCX1BBQ0tfQ0hBUlMoJ2YnLCAnZCcsICcqJywgQl9UWVBFX0xBUkdFKSwKLX07Ci0KLWVudW0gewotCUZMQVRfQklOREVSX0ZMQUdfUFJJT1JJVFlfTUFTSyA9IDB4ZmYsCi0JRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyA9IDB4MTAwLAotfTsKLQotLyoKLSAqIFRoaXMgaXMgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBvZiBhIEJpbmRlciBvYmplY3QgZm9yIHRyYW5zZmVyCi0gKiBiZXR3ZWVuIHByb2Nlc3Nlcy4gIFRoZSAnb2Zmc2V0cycgc3VwcGxpZWQgYXMgcGFydCBvZiBhIGJpbmRlciB0cmFuc2FjdGlvbgotICogY29udGFpbnMgb2Zmc2V0cyBpbnRvIHRoZSBkYXRhIHdoZXJlIHRoZXNlIHN0cnVjdHVyZXMgb2NjdXIuICBUaGUgQmluZGVyCi0gKiBkcml2ZXIgdGFrZXMgY2FyZSBvZiByZS13cml0aW5nIHRoZSBzdHJ1Y3R1cmUgdHlwZSBhbmQgZGF0YSBhcyBpdCBtb3ZlcwotICogYmV0d2VlbiBwcm9jZXNzZXMuCi0gKi8KLXN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgewotCS8qIDggYnl0ZXMgZm9yIGxhcmdlX2ZsYXRfaGVhZGVyLiAqLwotCV9fdTMyCQl0eXBlOwotCV9fdTMyCQlmbGFnczsKLQotCS8qIDggYnl0ZXMgb2YgZGF0YS4gKi8KLQl1bmlvbiB7Ci0JCXZvaWQgX191c2VyCSpiaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLwotCQlfX3UzMgkgICAgaGFuZGxlOwkJLyogcmVtb3RlIG9iamVjdCAqLwotCX07Ci0KLQkvKiBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBsb2NhbCBvYmplY3QgKi8KLQl2b2lkIF9fdXNlcgkJKmNvb2tpZTsKLX07Ci0KLS8qCi0gKiBPbiA2NC1iaXQgcGxhdGZvcm1zIHdoZXJlIHVzZXIgY29kZSBtYXkgcnVuIGluIDMyLWJpdHMgdGhlIGRyaXZlciBtdXN0Ci0gKiB0cmFuc2xhdGUgdGhlIGJ1ZmZlciAoYW5kIGxvY2FsIGJpbmRlcikgYWRkcmVzc2VzIGFwcHJvcHJpYXRlbHkuCi0gKi8KLQotc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkIHsKLQlzaXplX3Qgd3JpdGVfc2l6ZTsJLyogYnl0ZXMgdG8gd3JpdGUgKi8KLQlzaXplX3Qgd3JpdGVfY29uc3VtZWQ7CS8qIGJ5dGVzIGNvbnN1bWVkIGJ5IGRyaXZlciAqLwotCXVuc2lnbmVkIGxvbmcJd3JpdGVfYnVmZmVyOwotCXNpemVfdCByZWFkX3NpemU7CS8qIGJ5dGVzIHRvIHJlYWQgKi8KLQlzaXplX3QgcmVhZF9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCi0JdW5zaWduZWQgbG9uZwlyZWFkX2J1ZmZlcjsKLX07Ci0KLS8qIFVzZSB3aXRoIEJJTkRFUl9WRVJTSU9OLCBkcml2ZXIgZmlsbHMgaW4gZmllbGRzLiAqLwotc3RydWN0IGJpbmRlcl92ZXJzaW9uIHsKLQkvKiBkcml2ZXIgcHJvdG9jb2wgdmVyc2lvbiAtLSBpbmNyZW1lbnQgd2l0aCBpbmNvbXBhdGlibGUgY2hhbmdlICovCi0JX19zMzIgICAgICAgcHJvdG9jb2xfdmVyc2lvbjsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gKi8KLSNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3Ci0KLSNkZWZpbmUgQklOREVSX1dSSVRFX1JFQUQJCV9JT1dSKCdiJywgMSwgc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKQotI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfVElNRU9VVAkJX0lPVygnYicsIDMsIF9fczY0KQotI2RlZmluZQlCSU5ERVJfU0VUX01BWF9USFJFQURTCQlfSU9XKCdiJywgNSwgX191MzIpCi0jZGVmaW5lCUJJTkRFUl9TRVRfSURMRV9QUklPUklUWQlfSU9XKCdiJywgNiwgX19zMzIpCi0jZGVmaW5lCUJJTkRFUl9TRVRfQ09OVEVYVF9NR1IJCV9JT1coJ2InLCA3LCBfX3MzMikKLSNkZWZpbmUJQklOREVSX1RIUkVBRF9FWElUCQlfSU9XKCdiJywgOCwgX19zMzIpCi0jZGVmaW5lIEJJTkRFUl9WRVJTSU9OCQkJX0lPV1IoJ2InLCA5LCBzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pCi0KLS8qCi0gKiBOT1RFOiBUd28gc3BlY2lhbCBlcnJvciBjb2RlcyB5b3Ugc2hvdWxkIGNoZWNrIGZvciB3aGVuIGNhbGxpbmcKLSAqIGluIHRvIHRoZSBkcml2ZXIgYXJlOgotICoKLSAqIEVJTlRSIC0tIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gaW50ZXJ1cHRlZC4gIFRoaXMgc2hvdWxkIGJlCi0gKiBoYW5kbGVkIGJ5IHJldHJ5aW5nIHRoZSBpb2N0bCgpIHVudGlsIGEgZGlmZmVyZW50IGVycm9yIGNvZGUKLSAqIGlzIHJldHVybmVkLgotICoKLSAqIEVDT05OUkVGVVNFRCAtLSBUaGUgZHJpdmVyIGlzIG5vIGxvbmdlciBhY2NlcHRpbmcgb3BlcmF0aW9ucwotICogZnJvbSB5b3VyIHByb2Nlc3MuICBUaGF0IGlzLCB0aGUgcHJvY2VzcyBpcyBiZWluZyBkZXN0cm95ZWQuCi0gKiBZb3Ugc2hvdWxkIGhhbmRsZSB0aGlzIGJ5IGV4aXRpbmcgZnJvbSB5b3VyIHByb2Nlc3MuICBOb3RlCi0gKiB0aGF0IG9uY2UgdGhpcyBlcnJvciBjb2RlIGlzIHJldHVybmVkLCBhbGwgZnVydGhlciBjYWxscyB0bwotICogdGhlIGRyaXZlciBmcm9tIGFueSB0aHJlYWQgd2lsbCByZXR1cm4gdGhpcyBzYW1lIGNvZGUuCi0gKi8KLQotZW51bSB0cmFuc2FjdGlvbl9mbGFncyB7Ci0JVEZfT05FX1dBWQk9IDB4MDEsCS8qIHRoaXMgaXMgYSBvbmUtd2F5IGNhbGw6IGFzeW5jLCBubyByZXR1cm4gKi8KLQlURl9ST09UX09CSkVDVAk9IDB4MDQsCS8qIGNvbnRlbnRzIGFyZSB0aGUgY29tcG9uZW50J3Mgcm9vdCBvYmplY3QgKi8KLQlURl9TVEFUVVNfQ09ERQk9IDB4MDgsCS8qIGNvbnRlbnRzIGFyZSBhIDMyLWJpdCBzdGF0dXMgY29kZSAqLwotCVRGX0FDQ0VQVF9GRFMJPSAweDEwLAkvKiBhbGxvdyByZXBsaWVzIHdpdGggZmlsZSBkZXNjcmlwdG9ycyAqLwotfTsKLQotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHsKLQkvKiBUaGUgZmlyc3QgdHdvIGFyZSBvbmx5IHVzZWQgZm9yIGJjVFJBTlNBQ1RJT04gYW5kIGJyVFJBTlNBQ1RJT04sCi0JICogaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBhbmQgY29udGVudHMgb2YgdGhlIHRyYW5zYWN0aW9uLgotCSAqLwotCXVuaW9uIHsKLQkJX191MzIJaGFuZGxlOwkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiBjb21tYW5kIHRyYW5zYWN0aW9uICovCi0JCXZvaWQJKnB0cjsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgcmV0dXJuIHRyYW5zYWN0aW9uICovCi0JfSB0YXJnZXQ7Ci0Jdm9pZAkJKmNvb2tpZTsJLyogdGFyZ2V0IG9iamVjdCBjb29raWUgKi8KLQlfX3UzMgkJY29kZTsJCS8qIHRyYW5zYWN0aW9uIGNvbW1hbmQgKi8KLQotCS8qIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zYWN0aW9uLiAqLwotCV9fdTMyCSAgICAgICAgZmxhZ3M7Ci0JcGlkX3QJCXNlbmRlcl9waWQ7Ci0JdWlkX3QJCXNlbmRlcl9ldWlkOwotCXNpemVfdAkJZGF0YV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSAqLwotCXNpemVfdAkJb2Zmc2V0c19zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2Ygb2Zmc2V0cyAqLwotCi0JLyogSWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBpbmxpbmUsIHRoZSBkYXRhIGltbWVkaWF0ZWx5Ci0JICogZm9sbG93cyBoZXJlOyBvdGhlcndpc2UsIGl0IGVuZHMgd2l0aCBhIHBvaW50ZXIgdG8KLQkgKiB0aGUgZGF0YSBidWZmZXIuCi0JICovCi0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJLyogdHJhbnNhY3Rpb24gZGF0YSAqLwotCQkJY29uc3Qgdm9pZCBfX3VzZXIJKmJ1ZmZlcjsKLQkJCS8qIG9mZnNldHMgZnJvbSBidWZmZXIgdG8gZmxhdF9iaW5kZXJfb2JqZWN0IHN0cnVjdHMgKi8KLQkJCWNvbnN0IHZvaWQgX191c2VyCSpvZmZzZXRzOwotCQl9IHB0cjsKLQkJX191OAlidWZbOF07Ci0JfSBkYXRhOwotfTsKLQotc3RydWN0IGJpbmRlcl9wdHJfY29va2llIHsKLQl2b2lkICpwdHI7Ci0Jdm9pZCAqY29va2llOwotfTsKLQotc3RydWN0IGJpbmRlcl9wcmlfZGVzYyB7Ci0JX19zMzIgcHJpb3JpdHk7Ci0JX191MzIgZGVzYzsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgewotCV9fczMyIHByaW9yaXR5OwotCXZvaWQgKnB0cjsKLQl2b2lkICpjb29raWU7Ci19OwotCi1lbnVtIGJpbmRlcl9kcml2ZXJfcmV0dXJuX3Byb3RvY29sIHsKLQlCUl9FUlJPUiA9IF9JT1IoJ3InLCAwLCBfX3MzMiksCi0JLyoKLQkgKiBpbnQ6IGVycm9yIGNvZGUKLQkgKi8KLQotCUJSX09LID0gX0lPKCdyJywgMSksCi0JLyogTm8gcGFyYW1ldGVycyEgKi8KLQotCUJSX1RSQU5TQUNUSU9OID0gX0lPUigncicsIDIsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JQlJfUkVQTFkgPSBfSU9SKCdyJywgMywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKLQkvKgotCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgcmVjZWl2ZWQgY29tbWFuZC4KLQkgKi8KLQotCUJSX0FDUVVJUkVfUkVTVUxUID0gX0lPUigncicsIDQsIF9fczMyKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50OiAwIGlmIHRoZSBsYXN0IGJjQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKiBFbHNlIHRoZSByZW1vdGUgb2JqZWN0IGhhcyBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlLgotCSAqLwotCi0JQlJfREVBRF9SRVBMWSA9IF9JTygncicsIDUpLAotCS8qCi0JICogVGhlIHRhcmdldCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgotCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGlzIG5vIGxvbmdlciB3aXRoIHVzLiAgTm8gcGFyYW1ldGVycy4KLQkgKi8KLQotCUJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFID0gX0lPKCdyJywgNiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLi4uIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhc3QgdHJhbnNhY3Rpb24gcmVxdWVzdGVkCi0JICogKGluY2x1ZGluZyByZXBsaWVzKS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2VudCBldmVuIGZvcgotCSAqIGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMuCi0JICovCi0KLQlCUl9JTkNSRUZTID0gX0lPUigncicsIDcsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JQlJfQUNRVUlSRSA9IF9JT1IoJ3InLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCUJSX1JFTEVBU0UgPSBfSU9SKCdyJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCUl9ERUNSRUZTID0gX0lPUigncicsIDEwLCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOglwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgotCSAqLwotCi0JQlJfQVRURU1QVF9BQ1FVSVJFID0gX0lPUigncicsIDExLCBzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50Oglwcmlvcml0eQotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJSX05PT1AgPSBfSU8oJ3InLCAxMiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLiAgRG8gbm90aGluZyBhbmQgZXhhbWluZSB0aGUgbmV4dCBjb21tYW5kLiAgSXQgZXhpc3RzCi0JICogcHJpbWFyaWx5IHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgaXQgd2l0aCBhIEJSX1NQQVdOX0xPT1BFUiBjb21tYW5kLgotCSAqLwotCi0JQlJfU1BBV05fTE9PUEVSID0gX0lPKCdyJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4gIFRoZSBkcml2ZXIgaGFzIGRldGVybWluZWQgdGhhdCBhIHByb2Nlc3MgaGFzIG5vCi0JICogdGhyZWFkcyB3YWl0aW5nIHRvIHNlcnZpY2UgaW5jb21pbmcgdHJhbnNhY3Rpb25zLiAgV2hlbiBhIHByb2Nlc3MKLQkgKiByZWNlaXZlcyB0aGlzIGNvbW1hbmQsIGl0IG11c3Qgc3Bhd24gYSBuZXcgc2VydmljZSB0aHJlYWQgYW5kCi0JICogcmVnaXN0ZXIgaXQgdmlhIGJjRU5URVJfTE9PUEVSLgotCSAqLwotCi0JQlJfRklOSVNIRUQgPSBfSU8oJ3InLCAxNCksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIHN0b3AgdGhyZWFkcG9vbCB0aHJlYWQKLQkgKi8KLQotCUJSX0RFQURfQklOREVSID0gX0lPUigncicsIDE1LCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQlCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSA9IF9JT1IoJ3InLCAxNiwgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCUl9GQUlMRURfUkVQTFkgPSBfSU8oJ3InLCAxNyksCi0JLyoKLQkgKiBUaGUgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKLQkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBmYWlsZWQgKGUuZy4gb3V0IG9mIG1lbW9yeSkuICBObyBwYXJhbWV0ZXJzLgotCSAqLwotfTsKLQotZW51bSBiaW5kZXJfZHJpdmVyX2NvbW1hbmRfcHJvdG9jb2wgewotCUJDX1RSQU5TQUNUSU9OID0gX0lPVygnYycsIDAsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JQkNfUkVQTFkgPSBfSU9XKCdjJywgMSwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKLQkvKgotCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgc2VudCBjb21tYW5kLgotCSAqLwotCi0JQkNfQUNRVUlSRV9SRVNVTFQgPSBfSU9XKCdjJywgMiwgX19zMzIpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBpbnQ6ICAwIGlmIHRoZSBsYXN0IEJSX0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCi0JICogRWxzZSB5b3UgaGF2ZSBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QuCi0JICovCi0KLQlCQ19GUkVFX0JVRkZFUiA9IF9JT1coJ2MnLCAzLCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gdHJhbnNhY3Rpb24gZGF0YSByZWNlaXZlZCBvbiBhIHJlYWQKLQkgKi8KLQotCUJDX0lOQ1JFRlMgPSBfSU9XKCdjJywgNCwgX191MzIpLAotCUJDX0FDUVVJUkUgPSBfSU9XKCdjJywgNSwgX191MzIpLAotCUJDX1JFTEVBU0UgPSBfSU9XKCdjJywgNiwgX191MzIpLAotCUJDX0RFQ1JFRlMgPSBfSU9XKCdjJywgNywgX191MzIpLAotCS8qCi0JICogaW50OglkZXNjcmlwdG9yCi0JICovCi0KLQlCQ19JTkNSRUZTX0RPTkUgPSBfSU9XKCdjJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCQ19BQ1FVSVJFX0RPTkUgPSBfSU9XKCdjJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJDX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1coJ2MnLCAxMCwgc3RydWN0IGJpbmRlcl9wcmlfZGVzYyksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDogcHJpb3JpdHkKLQkgKiBpbnQ6IGRlc2NyaXB0b3IKLQkgKi8KLQotCUJDX1JFR0lTVEVSX0xPT1BFUiA9IF9JTygnYycsIDExKSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuCi0JICogUmVnaXN0ZXIgYSBzcGF3bmVkIGxvb3BlciB0aHJlYWQgd2l0aCB0aGUgZGV2aWNlLgotCSAqLwotCi0JQkNfRU5URVJfTE9PUEVSID0gX0lPKCdjJywgMTIpLAotCUJDX0VYSVRfTE9PUEVSID0gX0lPKCdjJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4KLQkgKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIHNlbnQgYXMgYW4gYXBwbGljYXRpb24tbGV2ZWwgdGhyZWFkCi0JICogZW50ZXJzIGFuZCBleGl0cyB0aGUgYmluZGVyIGxvb3AsIHJlc3BlY3RpdmVseS4gIFRoZXkgYXJlCi0JICogdXNlZCBzbyB0aGUgYmluZGVyIGNhbiBoYXZlIGFuIGFjY3VyYXRlIGNvdW50IG9mIHRoZSBudW1iZXIKLQkgKiBvZiBsb29waW5nIHRocmVhZHMgaXQgaGFzIGF2YWlsYWJsZS4KLQkgKi8KLQotCUJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE0LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQotCUJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCQ19ERUFEX0JJTkRFUl9ET05FID0gX0lPVygnYycsIDE2LCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLX07CisjaW5jbHVkZSAidWFwaS9iaW5kZXIuaCIKIAogI2VuZGlmIC8qIF9MSU5VWF9CSU5ERVJfSCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXJfdHJhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oCmluZGV4IDgyYTU2N2MuLjdmMjBmM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKGludCwgZGVidWdfaWQpCiAJCV9fZmllbGQoaW50LCBub2RlX2RlYnVnX2lkKQotCQlfX2ZpZWxkKHZvaWQgX191c2VyICosIG5vZGVfcHRyKQorCQlfX2ZpZWxkKGJpbmRlcl91aW50cHRyX3QsIG5vZGVfcHRyKQogCQlfX2ZpZWxkKGludCwgcmVmX2RlYnVnX2lkKQogCQlfX2ZpZWxkKHVpbnQzMl90LCByZWZfZGVzYykKIAkpLApAQCAtMTYzLDggKzE2Myw5IEBACiAJCV9fZW50cnktPnJlZl9kZWJ1Z19pZCA9IHJlZi0+ZGVidWdfaWQ7CiAJCV9fZW50cnktPnJlZl9kZXNjID0gcmVmLT5kZXNjOwogCSksCi0JVFBfcHJpbnRrKCJ0cmFuc2FjdGlvbj0lZCBub2RlPSVkIHNyY19wdHI9MHglcCA9PT4gZGVzdF9yZWY9JWQgZGVzdF9kZXNjPSVkIiwKLQkJICBfX2VudHJ5LT5kZWJ1Z19pZCwgX19lbnRyeS0+bm9kZV9kZWJ1Z19pZCwgX19lbnRyeS0+bm9kZV9wdHIsCisJVFBfcHJpbnRrKCJ0cmFuc2FjdGlvbj0lZCBub2RlPSVkIHNyY19wdHI9MHglMDE2bGx4ID09PiBkZXN0X3JlZj0lZCBkZXN0X2Rlc2M9JWQiLAorCQkgIF9fZW50cnktPmRlYnVnX2lkLCBfX2VudHJ5LT5ub2RlX2RlYnVnX2lkLAorCQkgICh1NjQpX19lbnRyeS0+bm9kZV9wdHIsCiAJCSAgX19lbnRyeS0+cmVmX2RlYnVnX2lkLCBfX2VudHJ5LT5yZWZfZGVzYykKICk7CiAKQEAgLTE3Nyw3ICsxNzgsNyBAQAogCQlfX2ZpZWxkKGludCwgcmVmX2RlYnVnX2lkKQogCQlfX2ZpZWxkKHVpbnQzMl90LCByZWZfZGVzYykKIAkJX19maWVsZChpbnQsIG5vZGVfZGVidWdfaWQpCi0JCV9fZmllbGQodm9pZCBfX3VzZXIgKiwgbm9kZV9wdHIpCisJCV9fZmllbGQoYmluZGVyX3VpbnRwdHJfdCwgbm9kZV9wdHIpCiAJKSwKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+ZGVidWdfaWQgPSB0LT5kZWJ1Z19pZDsKQEAgLTE4Niw5ICsxODcsMTAgQEAKIAkJX19lbnRyeS0+bm9kZV9kZWJ1Z19pZCA9IHJlZi0+bm9kZS0+ZGVidWdfaWQ7CiAJCV9fZW50cnktPm5vZGVfcHRyID0gcmVmLT5ub2RlLT5wdHI7CiAJKSwKLQlUUF9wcmludGsoInRyYW5zYWN0aW9uPSVkIG5vZGU9JWQgc3JjX3JlZj0lZCBzcmNfZGVzYz0lZCA9PT4gZGVzdF9wdHI9MHglcCIsCisJVFBfcHJpbnRrKCJ0cmFuc2FjdGlvbj0lZCBub2RlPSVkIHNyY19yZWY9JWQgc3JjX2Rlc2M9JWQgPT0+IGRlc3RfcHRyPTB4JTAxNmxseCIsCiAJCSAgX19lbnRyeS0+ZGVidWdfaWQsIF9fZW50cnktPm5vZGVfZGVidWdfaWQsCi0JCSAgX19lbnRyeS0+cmVmX2RlYnVnX2lkLCBfX2VudHJ5LT5yZWZfZGVzYywgX19lbnRyeS0+bm9kZV9wdHIpCisJCSAgX19lbnRyeS0+cmVmX2RlYnVnX2lkLCBfX2VudHJ5LT5yZWZfZGVzYywKKwkJICAodTY0KV9fZW50cnktPm5vZGVfcHRyKQogKTsKIAogVFJBQ0VfRVZFTlQoYmluZGVyX3RyYW5zYWN0aW9uX3JlZl90b19yZWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKaW5kZXggNTc0MDY2Zi4uM2Q1YmYxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC01NSwxMCArNTYsMTIgQEAKIAlzdHJ1Y3QgbXV0ZXggYnVmZmVyX2xvY2s7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBsb2NrOwogCXN0cnVjdCBwbGlzdF9oZWFkIGhlYXBzOwotCWxvbmcgKCpjdXN0b21faW9jdGwpIChzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworCWxvbmcgKCpjdXN0b21faW9jdGwpKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAlzdHJ1Y3QgcmJfcm9vdCBjbGllbnRzOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqaGVhcHNfZGVidWdfcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpjbGllbnRzX2RlYnVnX3Jvb3Q7CiB9OwogCiAvKioKQEAgLTY5LDYgKzcyLDggQEAKICAqIEBpZHI6CQlhbiBpZHIgc3BhY2UgZm9yIGFsbG9jYXRpbmcgaGFuZGxlIGlkcwogICogQGxvY2s6CQlsb2NrIHByb3RlY3RpbmcgdGhlIHRyZWUgb2YgaGFuZGxlcwogICogQG5hbWU6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKKyAqIEBkaXNwbGF5X25hbWU6CXVzZWQgZm9yIGRlYnVnZ2luZyAodW5pcXVlIHZlcnNpb24gb2YgQG5hbWUpCisgKiBAZGlzcGxheV9zZXJpYWw6CXVzZWQgZm9yIGRlYnVnZ2luZyAodG8gbWFrZSBkaXNwbGF5X25hbWUgdW5pcXVlKQogICogQHRhc2s6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKICAqCiAgKiBBIGNsaWVudCByZXByZXNlbnRzIGEgbGlzdCBvZiBidWZmZXJzIHRoaXMgY2xpZW50IG1heSBhY2Nlc3MuCkBAIC04Miw2ICs4Nyw4IEBACiAJc3RydWN0IGlkciBpZHI7CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICpkaXNwbGF5X25hbWU7CisJaW50IGRpc3BsYXlfc2VyaWFsOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAlwaWRfdCBwaWQ7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfcm9vdDsKQEAgLTIwOCw3ICsyMTUsNyBAQAogCWlmIChJU19FUlIodGFibGUpKSB7CiAJCWhlYXAtPm9wcy0+ZnJlZShidWZmZXIpOwogCQlrZnJlZShidWZmZXIpOwotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKHRhYmxlKSk7CisJCXJldHVybiBFUlJfQ0FTVCh0YWJsZSk7CiAJfQogCWJ1ZmZlci0+c2dfdGFibGUgPSB0YWJsZTsKIAlpZiAoaW9uX2J1ZmZlcl9mYXVsdF91c2VyX21hcHBpbmdzKGJ1ZmZlcikpIHsKQEAgLTQyOSw3ICs0MzYsNyBAQAogCQkJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCiB7CiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZjbGllbnQtPmxvY2spKTsKLQlyZXR1cm4gKGlkcl9maW5kKCZjbGllbnQtPmlkciwgaGFuZGxlLT5pZCkgPT0gaGFuZGxlKTsKKwlyZXR1cm4gaWRyX2ZpbmQoJmNsaWVudC0+aWRyLCBoYW5kbGUtPmlkKSA9PSBoYW5kbGU7CiB9CiAKIHN0YXRpYyBpbnQgaW9uX2hhbmRsZV9hZGQoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKQEAgLTUwMSw3ICs1MDgsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAogCWlmIChJU19FUlIoYnVmZmVyKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihidWZmZXIpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGJ1ZmZlcik7CiAKIAloYW5kbGUgPSBpb25faGFuZGxlX2NyZWF0ZShjbGllbnQsIGJ1ZmZlcik7CiAKQEAgLTcwOCw2ICs3MTUsMjEgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorc3RhdGljIGludCBpb25fZ2V0X2NsaWVudF9zZXJpYWwoY29uc3Qgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCit7CisJaW50IHNlcmlhbCA9IC0xOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCWZvciAobm9kZSA9IHJiX2ZpcnN0KHJvb3QpOyBub2RlOyBub2RlID0gcmJfbmV4dChub2RlKSkgeworCQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGlvbl9jbGllbnQsCisJCQkJCQlub2RlKTsKKwkJaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsIG5hbWUpKQorCQkJY29udGludWU7CisJCXNlcmlhbCA9IG1heChzZXJpYWwsIGNsaWVudC0+ZGlzcGxheV9zZXJpYWwpOworCX0KKwlyZXR1cm4gc2VyaWFsICsgMTsKK30KKwogc3RydWN0IGlvbl9jbGllbnQgKmlvbl9jbGllbnRfY3JlYXRlKHN0cnVjdCBpb25fZGV2aWNlICpkZXYsCiAJCQkJICAgICBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtNzE2LDkgKzczOCwxMyBAQAogCXN0cnVjdCByYl9ub2RlICoqcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgaW9uX2NsaWVudCAqZW50cnk7Ci0JY2hhciBkZWJ1Z19uYW1lWzY0XTsKIAlwaWRfdCBwaWQ7CiAKKwlpZiAoIW5hbWUpIHsKKwkJcHJfZXJyKCIlczogTmFtZSBjYW5ub3QgYmUgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKIAlnZXRfdGFza19zdHJ1Y3QoY3VycmVudC0+Z3JvdXBfbGVhZGVyKTsKIAl0YXNrX2xvY2soY3VycmVudC0+Z3JvdXBfbGVhZGVyKTsKIAlwaWQgPSB0YXNrX3BpZF9ucihjdXJyZW50LT5ncm91cF9sZWFkZXIpOwpAQCAtNzMzLDIxICs3NTksMjcgQEAKIAl0YXNrX3VubG9jayhjdXJyZW50LT5ncm91cF9sZWFkZXIpOwogCiAJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbl9jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsaWVudCkgewotCQlpZiAodGFzaykKLQkJCXB1dF90YXNrX3N0cnVjdChjdXJyZW50LT5ncm91cF9sZWFkZXIpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9CisJaWYgKCFjbGllbnQpCisJCWdvdG8gZXJyX3B1dF90YXNrX3N0cnVjdDsKIAogCWNsaWVudC0+ZGV2ID0gZGV2OwogCWNsaWVudC0+aGFuZGxlcyA9IFJCX1JPT1Q7CiAJaWRyX2luaXQoJmNsaWVudC0+aWRyKTsKIAltdXRleF9pbml0KCZjbGllbnQtPmxvY2spOwotCWNsaWVudC0+bmFtZSA9IG5hbWU7CiAJY2xpZW50LT50YXNrID0gdGFzazsKIAljbGllbnQtPnBpZCA9IHBpZDsKKwljbGllbnQtPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50LT5uYW1lKQorCQlnb3RvIGVycl9mcmVlX2NsaWVudDsKIAogCWRvd25fd3JpdGUoJmRldi0+bG9jayk7CisJY2xpZW50LT5kaXNwbGF5X3NlcmlhbCA9IGlvbl9nZXRfY2xpZW50X3NlcmlhbCgmZGV2LT5jbGllbnRzLCBuYW1lKTsKKwljbGllbnQtPmRpc3BsYXlfbmFtZSA9IGthc3ByaW50ZigKKwkJR0ZQX0tFUk5FTCwgIiVzLSVkIiwgbmFtZSwgY2xpZW50LT5kaXNwbGF5X3NlcmlhbCk7CisJaWYgKCFjbGllbnQtPmRpc3BsYXlfbmFtZSkgeworCQl1cF93cml0ZSgmZGV2LT5sb2NrKTsKKwkJZ290byBlcnJfZnJlZV9jbGllbnRfbmFtZTsKKwl9CiAJcCA9ICZkZXYtPmNsaWVudHMucmJfbm9kZTsKIAl3aGlsZSAoKnApIHsKIAkJcGFyZW50ID0gKnA7CkBAIC03NjEsMTMgKzc5MywyOCBAQAogCXJiX2xpbmtfbm9kZSgmY2xpZW50LT5ub2RlLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmY2xpZW50LT5ub2RlLCAmZGV2LT5jbGllbnRzKTsKIAotCXNucHJpbnRmKGRlYnVnX25hbWUsIDY0LCAiJXUiLCBjbGllbnQtPnBpZCk7Ci0JY2xpZW50LT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZmlsZShkZWJ1Z19uYW1lLCAwNjY0LAotCQkJCQkJIGRldi0+ZGVidWdfcm9vdCwgY2xpZW50LAotCQkJCQkJICZkZWJ1Z19jbGllbnRfZm9wcyk7CisJY2xpZW50LT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZmlsZShjbGllbnQtPmRpc3BsYXlfbmFtZSwgMDY2NCwKKwkJCQkJCWRldi0+Y2xpZW50c19kZWJ1Z19yb290LAorCQkJCQkJY2xpZW50LCAmZGVidWdfY2xpZW50X2ZvcHMpOworCWlmICghY2xpZW50LT5kZWJ1Z19yb290KSB7CisJCWNoYXIgYnVmWzI1Nl0sICpwYXRoOworCQlwYXRoID0gZGVudHJ5X3BhdGgoZGV2LT5jbGllbnRzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCBkZWJ1Z2ZzIGF0ICVzLyVzXG4iLAorCQkJcGF0aCwgY2xpZW50LT5kaXNwbGF5X25hbWUpOworCX0KKwogCXVwX3dyaXRlKCZkZXYtPmxvY2spOwogCiAJcmV0dXJuIGNsaWVudDsKKworZXJyX2ZyZWVfY2xpZW50X25hbWU6CisJa2ZyZWUoY2xpZW50LT5uYW1lKTsKK2Vycl9mcmVlX2NsaWVudDoKKwlrZnJlZShjbGllbnQpOworZXJyX3B1dF90YXNrX3N0cnVjdDoKKwlpZiAodGFzaykKKwkJcHV0X3Rhc2tfc3RydWN0KGN1cnJlbnQtPmdyb3VwX2xlYWRlcik7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvbl9jbGllbnRfY3JlYXRlKTsKIApAQCAtNzkyLDYgKzgzOSw4IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGNsaWVudC0+ZGVidWdfcm9vdCk7CiAJdXBfd3JpdGUoJmRldi0+bG9jayk7CiAKKwlrZnJlZShjbGllbnQtPmRpc3BsYXlfbmFtZSk7CisJa2ZyZWUoY2xpZW50LT5uYW1lKTsKIAlrZnJlZShjbGllbnQpOwogfQogRVhQT1JUX1NZTUJPTChpb25fY2xpZW50X2Rlc3Ryb3kpOwpAQCAtOTU0LDggKzEwMDMsOCBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKCFidWZmZXItPmhlYXAtPm9wcy0+bWFwX3VzZXIpIHsKLQkJcHJfZXJyKCIlczogdGhpcyBoZWFwIGRvZXMgbm90IGRlZmluZSBhIG1ldGhvZCBmb3IgbWFwcGluZyAiCi0JCSAgICAgICAidG8gdXNlcnNwYWNlXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IHRoaXMgaGVhcCBkb2VzIG5vdCBkZWZpbmUgYSBtZXRob2QgZm9yIG1hcHBpbmcgdG8gdXNlcnNwYWNlXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwMTcsOSArMTA2Niw3IEBACiAJbXV0ZXhfbG9jaygmYnVmZmVyLT5sb2NrKTsKIAl2YWRkciA9IGlvbl9idWZmZXJfa21hcF9nZXQoYnVmZmVyKTsKIAltdXRleF91bmxvY2soJmJ1ZmZlci0+bG9jayk7Ci0JaWYgKElTX0VSUih2YWRkcikpCi0JCXJldHVybiBQVFJfRVJSKHZhZGRyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHZhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgaW9uX2RtYV9idWZfZW5kX2NwdV9hY2Nlc3Moc3RydWN0IGRtYV9idWYgKmRtYWJ1Ziwgc2l6ZV90IHN0YXJ0LApAQCAtMTEwMCw3ICsxMTQ3LDcgQEAKIAogCWRtYWJ1ZiA9IGRtYV9idWZfZ2V0KGZkKTsKIAlpZiAoSVNfRVJSKGRtYWJ1ZikpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoZG1hYnVmKSk7CisJCXJldHVybiBFUlJfQ0FTVChkbWFidWYpOwogCS8qIGlmIHRoaXMgbWVtb3J5IGNhbWUgZnJvbSBpb24gKi8KIAogCWlmIChkbWFidWYtPm9wcyAhPSAmZG1hX2J1Zl9vcHMpIHsKQEAgLTEyOTMsOSArMTM0MCwxMSBAQAogCXN0cnVjdCBtaXNjZGV2aWNlICptaXNjZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpb25fZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2YobWlzY2Rldiwgc3RydWN0IGlvbl9kZXZpY2UsIGRldik7CiAJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKKwljaGFyIGRlYnVnX25hbWVbNjRdOwogCiAJcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQljbGllbnQgPSBpb25fY2xpZW50X2NyZWF0ZShkZXYsICJ1c2VyIik7CisJc25wcmludGYoZGVidWdfbmFtZSwgNjQsICIldSIsIHRhc2tfcGlkX25yKGN1cnJlbnQtPmdyb3VwX2xlYWRlcikpOworCWNsaWVudCA9IGlvbl9jbGllbnRfY3JlYXRlKGRldiwgZGVidWdfbmFtZSk7CiAJaWYgKElTX0VSUihjbGllbnQpKQogCQlyZXR1cm4gUFRSX0VSUihjbGllbnQpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNsaWVudDsKQEAgLTEzMzgsNyArMTM4Nyw3IEBACiAJc2l6ZV90IHRvdGFsX29ycGhhbmVkX3NpemUgPSAwOwogCiAJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2LnMgJTE2LnNcbiIsICJjbGllbnQiLCAicGlkIiwgInNpemUiKTsKLQlzZXFfcHJpbnRmKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAlmb3IgKG4gPSByYl9maXJzdCgmZGV2LT5jbGllbnRzKTsgbjsgbiA9IHJiX25leHQobikpIHsKIAkJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBpb25fY2xpZW50LApAQCAtMTM1Nyw5ICsxNDA2LDggQEAKIAkJCQkgICBjbGllbnQtPnBpZCwgc2l6ZSk7CiAJCX0KIAl9Ci0Jc2VxX3ByaW50ZihzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0Jc2VxX3ByaW50ZihzLCAib3JwaGFuZWQgYWxsb2NhdGlvbnMgKGluZm8gaXMgZnJvbSBsYXN0IGtub3duIGNsaWVudCk6IgotCQkgICAiXG4iKTsKKwlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJc2VxX3B1dHMocywgIm9ycGhhbmVkIGFsbG9jYXRpb25zIChpbmZvIGlzIGZyb20gbGFzdCBrbm93biBjbGllbnQpOlxuIik7CiAJbXV0ZXhfbG9jaygmZGV2LT5idWZmZXJfbG9jayk7CiAJZm9yIChuID0gcmJfZmlyc3QoJmRldi0+YnVmZmVycyk7IG47IG4gPSByYl9uZXh0KG4pKSB7CiAJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaW9uX2J1ZmZlciwKQEAgLTEzNzYsMTQgKzE0MjQsMTQgQEAKIAkJfQogCX0KIAltdXRleF91bmxvY2soJmRldi0+YnVmZmVyX2xvY2spOwotCXNlcV9wcmludGYocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlzZXFfcHJpbnRmKHMsICIlMTYucyAlMTZ6dVxuIiwgInRvdGFsIG9ycGhhbmVkIiwKIAkJICAgdG90YWxfb3JwaGFuZWRfc2l6ZSk7CiAJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2enVcbiIsICJ0b3RhbCAiLCB0b3RhbF9zaXplKTsKIAlpZiAoaGVhcC0+ZmxhZ3MgJiBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUUpCiAJCXNlcV9wcmludGYocywgIiUxNi5zICUxNnp1XG4iLCAiZGVmZXJyZWQgZnJlZSIsCiAJCQkJaGVhcC0+ZnJlZV9saXN0X3NpemUpOwotCXNlcV9wcmludGYocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAogCWlmIChoZWFwLT5kZWJ1Z19zaG93KQogCQloZWFwLT5kZWJ1Z19zaG93KGhlYXAsIHMsIHVudXNlZCk7CkBAIC0xNDQzLDYgKzE0OTEsOCBAQAogCiB2b2lkIGlvbl9kZXZpY2VfYWRkX2hlYXAoc3RydWN0IGlvbl9kZXZpY2UgKmRldiwgc3RydWN0IGlvbl9oZWFwICpoZWFwKQogeworCXN0cnVjdCBkZW50cnkgKmRlYnVnX2ZpbGU7CisKIAlpZiAoIWhlYXAtPm9wcy0+YWxsb2NhdGUgfHwgIWhlYXAtPm9wcy0+ZnJlZSB8fCAhaGVhcC0+b3BzLT5tYXBfZG1hIHx8CiAJICAgICFoZWFwLT5vcHMtPnVubWFwX2RtYSkKIAkJcHJfZXJyKCIlczogY2FuIG5vdCBhZGQgaGVhcCB3aXRoIGludmFsaWQgb3BzIHN0cnVjdC5cbiIsCkBAIC0xNDUxLDIxICsxNTAxLDQwIEBACiAJaWYgKGhlYXAtPmZsYWdzICYgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFKQogCQlpb25faGVhcF9pbml0X2RlZmVycmVkX2ZyZWUoaGVhcCk7CiAKKwlpZiAoKGhlYXAtPmZsYWdzICYgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFKSB8fCBoZWFwLT5vcHMtPnNocmluaykKKwkJaW9uX2hlYXBfaW5pdF9zaHJpbmtlcihoZWFwKTsKKwogCWhlYXAtPmRldiA9IGRldjsKIAlkb3duX3dyaXRlKCZkZXYtPmxvY2spOwogCS8qIHVzZSBuZWdhdGl2ZSBoZWFwLT5pZCB0byByZXZlcnNlIHRoZSBwcmlvcml0eSAtLSB3aGVuIHRyYXZlcnNpbmcKIAkgICB0aGUgbGlzdCBsYXRlciBhdHRlbXB0IGhpZ2hlciBpZCBudW1iZXJzIGZpcnN0ICovCiAJcGxpc3Rfbm9kZV9pbml0KCZoZWFwLT5ub2RlLCAtaGVhcC0+aWQpOwogCXBsaXN0X2FkZCgmaGVhcC0+bm9kZSwgJmRldi0+aGVhcHMpOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoaGVhcC0+bmFtZSwgMDY2NCwgZGV2LT5kZWJ1Z19yb290LCBoZWFwLAotCQkJICAgICZkZWJ1Z19oZWFwX2ZvcHMpOworCWRlYnVnX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGhlYXAtPm5hbWUsIDA2NjQsCisJCQkJCWRldi0+aGVhcHNfZGVidWdfcm9vdCwgaGVhcCwKKwkJCQkJJmRlYnVnX2hlYXBfZm9wcyk7CisKKwlpZiAoIWRlYnVnX2ZpbGUpIHsKKwkJY2hhciBidWZbMjU2XSwgKnBhdGg7CisJCXBhdGggPSBkZW50cnlfcGF0aChkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGhlYXAgZGVidWdmcyBhdCAlcy8lc1xuIiwKKwkJCXBhdGgsIGhlYXAtPm5hbWUpOworCX0KKwogI2lmZGVmIERFQlVHX0hFQVBfU0hSSU5LRVIKIAlpZiAoaGVhcC0+c2hyaW5rZXIuc2hyaW5rKSB7CiAJCWNoYXIgZGVidWdfbmFtZVs2NF07CiAKIAkJc25wcmludGYoZGVidWdfbmFtZSwgNjQsICIlc19zaHJpbmsiLCBoZWFwLT5uYW1lKTsKLQkJZGVidWdmc19jcmVhdGVfZmlsZShkZWJ1Z19uYW1lLCAwNjQ0LCBkZXYtPmRlYnVnX3Jvb3QsIGhlYXAsCi0JCQkJICAgICZkZWJ1Z19zaHJpbmtfZm9wcyk7CisJCWRlYnVnX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKAorCQkJZGVidWdfbmFtZSwgMDY0NCwgZGV2LT5oZWFwc19kZWJ1Z19yb290LCBoZWFwLAorCQkJJmRlYnVnX3Nocmlua19mb3BzKTsKKwkJaWYgKCFkZWJ1Z19maWxlKSB7CisJCQljaGFyIGJ1ZlsyNTZdLCAqcGF0aDsKKwkJCXBhdGggPSBkZW50cnlfcGF0aChkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKKwkJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBoZWFwIHNocmlua2VyIGRlYnVnZnMgYXQgJXMvJXNcbiIsCisJCQkJcGF0aCwgZGVidWdfbmFtZSk7CisJCX0KIAl9CiAjZW5kaWYKIAl1cF93cml0ZSgmZGV2LT5sb2NrKTsKQEAgLTE0OTQsOCArMTU2MywyMSBAQAogCX0KIAogCWlkZXYtPmRlYnVnX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImlvbiIsIE5VTEwpOwotCWlmICghaWRldi0+ZGVidWdfcm9vdCkKLQkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWcgZmlsZXMuXG4iKTsKKwlpZiAoIWlkZXYtPmRlYnVnX3Jvb3QpIHsKKwkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyByb290IGRpcmVjdG9yeS5cbiIpOworCQlnb3RvIGRlYnVnZnNfZG9uZTsKKwl9CisJaWRldi0+aGVhcHNfZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiaGVhcHMiLCBpZGV2LT5kZWJ1Z19yb290KTsKKwlpZiAoIWlkZXYtPmhlYXBzX2RlYnVnX3Jvb3QpIHsKKwkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBoZWFwcyBkaXJlY3RvcnkuXG4iKTsKKwkJZ290byBkZWJ1Z2ZzX2RvbmU7CisJfQorCWlkZXYtPmNsaWVudHNfZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiY2xpZW50cyIsCisJCQkJCQlpZGV2LT5kZWJ1Z19yb290KTsKKwlpZiAoIWlkZXYtPmNsaWVudHNfZGVidWdfcm9vdCkKKwkJcHJfZXJyKCJpb246IGZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBjbGllbnRzIGRpcmVjdG9yeS5cbiIpOworCitkZWJ1Z2ZzX2RvbmU6CiAKIAlpZGV2LT5jdXN0b21faW9jdGwgPSBjdXN0b21faW9jdGw7CiAJaWRldi0+YnVmZmVycyA9IFJCX1JPT1Q7CkBAIC0xNTA5LDYgKzE1OTEsNyBAQAogdm9pZCBpb25fZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGlvbl9kZXZpY2UgKmRldikKIHsKIAltaXNjX2RlcmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGV2LT5kZWJ1Z19yb290KTsKIAkvKiBYWFggbmVlZCB0byBmcmVlIHRoZSBoZWFwcyBhbmQgY2xpZW50cyA/ICovCiAJa2ZyZWUoZGV2KTsKIH0KQEAgLTE1MjcsOCArMTYxMCw3IEBACiAJCQkJCQkgICAgZGF0YS0+aGVhcHNbaV0uYWxpZ24sCiAJCQkJCQkgICAgTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUpOwogCQkJaWYgKCFwYWRkcikgewotCQkJCXByX2VycigiJXM6IGVycm9yIGFsbG9jYXRpbmcgbWVtYmxvY2sgZm9yICIKLQkJCQkgICAgICAgImhlYXAgJWRcbiIsCisJCQkJcHJfZXJyKCIlczogZXJyb3IgYWxsb2NhdGluZyBtZW1ibG9jayBmb3IgaGVhcCAlZFxuIiwKIAkJCQkJX19mdW5jX18sIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jCmluZGV4IGYwZjk4ODkuLmNlNjhlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY21hX2hlYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NtYV9oZWFwLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNtYV9oZWFwLT5kZXY7CiAJc3RydWN0IGlvbl9jbWFfYnVmZmVyX2luZm8gKmluZm8gPSBidWZmZXItPnByaXZfdmlydDsKIAotCWRldl9kYmcoZGV2LCAiUmV0dXJuIGJ1ZmZlciAlcCBwaHlzaWNhbCBhZGRyZXNzIDB4JXBhXG4iLCBidWZmZXIsCisJZGV2X2RiZyhkZXYsICJSZXR1cm4gYnVmZmVyICVwIHBoeXNpY2FsIGFkZHJlc3MgJXBhXG4iLCBidWZmZXIsCiAJCSZpbmZvLT5oYW5kbGUpOwogCiAJKmFkZHIgPSBpbmZvLT5oYW5kbGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9kdW1teV9kcml2ZXIuYwppbmRleCAwMWNkYzhhLi4zYTQ1ZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fZHVtbXlfZHJpdmVyLmMKQEAgLTI1LDEzICsyNSwxMyBAQAogI2luY2x1ZGUgImlvbi5oIgogI2luY2x1ZGUgImlvbl9wcml2LmgiCiAKLXN0cnVjdCBpb25fZGV2aWNlICppZGV2Owotc3RydWN0IGlvbl9oZWFwICoqaGVhcHM7CitzdGF0aWMgc3RydWN0IGlvbl9kZXZpY2UgKmlkZXY7CitzdGF0aWMgc3RydWN0IGlvbl9oZWFwICoqaGVhcHM7CiAKLXZvaWQgKmNhcnZlb3V0X3B0cjsKLXZvaWQgKmNodW5rX3B0cjsKK3N0YXRpYyB2b2lkICpjYXJ2ZW91dF9wdHI7CitzdGF0aWMgdm9pZCAqY2h1bmtfcHRyOwogCi1zdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgZHVtbXlfaGVhcHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgZHVtbXlfaGVhcHNbXSA9IHsKIAkJewogCQkJLmlkCT0gSU9OX0hFQVBfVFlQRV9TWVNURU0sCiAJCQkudHlwZQk9IElPTl9IRUFQX1RZUEVfU1lTVEVNLApAQCAtNTgsNyArNTgsNyBAQAogCQl9LAogfTsKIAotc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhIGR1bW15X2lvbl9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2RhdGEgZHVtbXlfaW9uX3BkYXRhID0gewogCS5uciA9IEFSUkFZX1NJWkUoZHVtbXlfaGVhcHMpLAogCS5oZWFwcyA9IGR1bW15X2hlYXBzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25faGVhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9oZWFwLmMKaW5kZXggMzdlNjRkNS4uYmRjNmEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9oZWFwLmMKQEAgLTE3OCw3ICsxNzgsOCBAQAogCXJldHVybiBzaXplOwogfQogCi1zaXplX3QgaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4oc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzaXplX3QgX2lvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUsCisJCQkJYm9vbCBza2lwX3Bvb2xzKQogewogCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXI7CiAJc2l6ZV90IHRvdGFsX2RyYWluZWQgPSAwOwpAQCAtMTk3LDYgKzE5OCw4IEBACiAJCQkJCSAgbGlzdCk7CiAJCWxpc3RfZGVsKCZidWZmZXItPmxpc3QpOwogCQloZWFwLT5mcmVlX2xpc3Rfc2l6ZSAtPSBidWZmZXItPnNpemU7CisJCWlmIChza2lwX3Bvb2xzKQorCQkJYnVmZmVyLT5wcml2YXRlX2ZsYWdzIHw9IElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRTsKIAkJdG90YWxfZHJhaW5lZCArPSBidWZmZXItPnNpemU7CiAJCXNwaW5fdW5sb2NrKCZoZWFwLT5mcmVlX2xvY2spOwogCQlpb25fYnVmZmVyX2Rlc3Ryb3koYnVmZmVyKTsKQEAgLTIwNyw2ICsyMTAsMTYgQEAKIAlyZXR1cm4gdG90YWxfZHJhaW5lZDsKIH0KIAorc2l6ZV90IGlvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIF9pb25faGVhcF9mcmVlbGlzdF9kcmFpbihoZWFwLCBzaXplLCBmYWxzZSk7Cit9CisKK3NpemVfdCBpb25faGVhcF9mcmVlbGlzdF9zaHJpbmsoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gX2lvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKGhlYXAsIHNpemUsIHRydWUpOworfQorCiBzdGF0aWMgaW50IGlvbl9oZWFwX2RlZmVycmVkX2ZyZWUodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAgPSBkYXRhOwpAQCAtMjQ2LDEyICsyNTksNjIgQEAKIAlpZiAoSVNfRVJSKGhlYXAtPnRhc2spKSB7CiAJCXByX2VycigiJXM6IGNyZWF0aW5nIHRocmVhZCBmb3IgZGVmZXJyZWQgZnJlZSBmYWlsZWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiBQVFJfUkVUKGhlYXAtPnRhc2spOworCQlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGhlYXAtPnRhc2spOwogCX0KIAlzY2hlZF9zZXRzY2hlZHVsZXIoaGVhcC0+dGFzaywgU0NIRURfSURMRSwgJnBhcmFtKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9uX2hlYXBfc2hyaW5rX2NvdW50KHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsCisJCQkJCQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQoreworCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAorCQkJCQkgICAgIHNocmlua2VyKTsKKwlpbnQgdG90YWwgPSAwOworCisJdG90YWwgPSBpb25faGVhcF9mcmVlbGlzdF9zaXplKGhlYXApIC8gUEFHRV9TSVpFOworCWlmIChoZWFwLT5vcHMtPnNocmluaykKKwkJdG90YWwgKz0gaGVhcC0+b3BzLT5zaHJpbmsoaGVhcCwgc2MtPmdmcF9tYXNrLCAwKTsKKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9oZWFwX3Nocmlua19zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsCisJCQkJCQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQoreworCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAorCQkJCQkgICAgIHNocmlua2VyKTsKKwlpbnQgZnJlZWQgPSAwOworCWludCB0b19zY2FuID0gc2MtPm5yX3RvX3NjYW47CisKKwlpZiAodG9fc2NhbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogc2hyaW5rIHRoZSBmcmVlIGxpc3QgZmlyc3QsIG5vIHBvaW50IGluIHplcm9pbmcgdGhlIG1lbW9yeSBpZiB3ZSdyZQorCSAqIGp1c3QgZ29pbmcgdG8gcmVjbGFpbSBpdC4gQWxzbywgc2tpcCBhbnkgcG9zc2libGUgcGFnZSBwb29saW5nLgorCSAqLworCWlmIChoZWFwLT5mbGFncyAmIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSkKKwkJZnJlZWQgPSBpb25faGVhcF9mcmVlbGlzdF9zaHJpbmsoaGVhcCwgdG9fc2NhbiAqIFBBR0VfU0laRSkgLworCQkJCVBBR0VfU0laRTsKKworCXRvX3NjYW4gLT0gZnJlZWQ7CisJaWYgKHRvX3NjYW4gPD0gMCkKKwkJcmV0dXJuIGZyZWVkOworCisJaWYgKGhlYXAtPm9wcy0+c2hyaW5rKQorCQlmcmVlZCArPSBoZWFwLT5vcHMtPnNocmluayhoZWFwLCBzYy0+Z2ZwX21hc2ssIHRvX3NjYW4pOworCXJldHVybiBmcmVlZDsKK30KKwordm9pZCBpb25faGVhcF9pbml0X3Nocmlua2VyKHN0cnVjdCBpb25faGVhcCAqaGVhcCkKK3sKKwloZWFwLT5zaHJpbmtlci5jb3VudF9vYmplY3RzID0gaW9uX2hlYXBfc2hyaW5rX2NvdW50OworCWhlYXAtPnNocmlua2VyLnNjYW5fb2JqZWN0cyA9IGlvbl9oZWFwX3Nocmlua19zY2FuOworCWhlYXAtPnNocmlua2VyLnNlZWtzID0gREVGQVVMVF9TRUVLUzsKKwloZWFwLT5zaHJpbmtlci5iYXRjaCA9IDA7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmhlYXAtPnNocmlua2VyKTsKK30KKwogc3RydWN0IGlvbl9oZWFwICppb25faGVhcF9jcmVhdGUoc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICpoZWFwX2RhdGEpCiB7CiAJc3RydWN0IGlvbl9oZWFwICpoZWFwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcGFnZV9wb29sLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3BhZ2VfcG9vbC5jCmluZGV4IGZhNjkzYzIuLmVjYjVmYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcGFnZV9wb29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wYWdlX3Bvb2wuYwpAQCAtMTMwLDggKzEzMCw3IEBACiBpbnQgaW9uX3BhZ2VfcG9vbF9zaHJpbmsoc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wsIGdmcF90IGdmcF9tYXNrLAogCQkJCWludCBucl90b19zY2FuKQogewotCWludCBucl9mcmVlZCA9IDA7Ci0JaW50IGk7CisJaW50IGZyZWVkOwogCWJvb2wgaGlnaDsKIAogCWhpZ2ggPSAhIShnZnBfbWFzayAmIF9fR0ZQX0hJR0hNRU0pOwpAQCAtMTM5LDcgKzEzOCw3IEBACiAJaWYgKG5yX3RvX3NjYW4gPT0gMCkKIAkJcmV0dXJuIGlvbl9wYWdlX3Bvb2xfdG90YWwocG9vbCwgaGlnaCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfdG9fc2NhbjsgaSsrKSB7CisJZm9yIChmcmVlZCA9IDA7IGZyZWVkIDwgbnJfdG9fc2NhbjsgZnJlZWQrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCQltdXRleF9sb2NrKCZwb29sLT5tdXRleCk7CkBAIC0xNTMsMTAgKzE1Miw5IEBACiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZwb29sLT5tdXRleCk7CiAJCWlvbl9wYWdlX3Bvb2xfZnJlZV9wYWdlcyhwb29sLCBwYWdlKTsKLQkJbnJfZnJlZWQgKz0gKDEgPDwgcG9vbC0+b3JkZXIpOwogCX0KIAotCXJldHVybiBucl9mcmVlZDsKKwlyZXR1cm4gZnJlZWQ7CiB9CiAKIHN0cnVjdCBpb25fcGFnZV9wb29sICppb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaAppbmRleCBmYzJlNGZjLi4xZWJhM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3ByaXYuaApAQCAtMzgsNiArMzgsNyBAQAogICogQGRldjoJCWJhY2sgcG9pbnRlciB0byB0aGUgaW9uX2RldmljZQogICogQGhlYXA6CQliYWNrIHBvaW50ZXIgdG8gdGhlIGhlYXAgdGhlIGJ1ZmZlciBjYW1lIGZyb20KICAqIEBmbGFnczoJCWJ1ZmZlciBzcGVjaWZpYyBmbGFncworICogQHByaXZhdGVfZmxhZ3M6CWludGVybmFsIGJ1ZmZlciBzcGVjaWZpYyBmbGFncwogICogQHNpemU6CQlzaXplIG9mIHRoZSBidWZmZXIKICAqIEBwcml2X3ZpcnQ6CQlwcml2YXRlIGRhdGEgdG8gdGhlIGJ1ZmZlciByZXByZXNlbnRhYmxlIGFzCiAgKgkJCWEgdm9pZCAqCkBAIC02Niw2ICs2Nyw3IEBACiAJc3RydWN0IGlvbl9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHByaXZhdGVfZmxhZ3M7CiAJc2l6ZV90IHNpemU7CiAJdW5pb24gewogCQl2b2lkICpwcml2X3ZpcnQ7CkBAIC05OCwyMiArMTAwLDI3IEBACiAgKiBAbWFwX3VzZXIJCW1hcCBtZW1vcnkgdG8gdXNlcnNwYWNlCiAgKgogICogYWxsb2NhdGUsIHBoeXMsIGFuZCBtYXBfdXNlciByZXR1cm4gMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZXJyb3IuCi0gKiBtYXBfZG1hIGFuZCBtYXBfa2VybmVsIHJldHVybiBwb2ludGVyIG9uIHN1Y2Nlc3MsIEVSUl9QVFIgb24gZXJyb3IuCisgKiBtYXBfZG1hIGFuZCBtYXBfa2VybmVsIHJldHVybiBwb2ludGVyIG9uIHN1Y2Nlc3MsIEVSUl9QVFIgb24KKyAqIGVycm9yLiBAZnJlZSB3aWxsIGJlIGNhbGxlZCB3aXRoIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSBzZXQgaW4KKyAqIHRoZSBidWZmZXIncyBwcml2YXRlX2ZsYWdzIHdoZW4gY2FsbGVkIGZyb20gYSBzaHJpbmtlci4gSW4gdGhhdAorICogY2FzZSwgdGhlIHBhZ2VzIGJlaW5nIGZyZWUnZCBtdXN0IGJlIHRydWx5IGZyZWUnZCBiYWNrIHRvIHRoZQorICogc3lzdGVtLCBub3QgcHV0IGluIGEgcGFnZSBwb29sIG9yIG90aGVyd2lzZSBjYWNoZWQuCiAgKi8KIHN0cnVjdCBpb25faGVhcF9vcHMgewotCWludCAoKmFsbG9jYXRlKSAoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJIHVuc2lnbmVkIGxvbmcgYWxpZ24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCXZvaWQgKCpmcmVlKSAoc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0JaW50ICgqcGh5cykgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJICAgICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKTsKLQlzdHJ1Y3Qgc2dfdGFibGUgKigqbWFwX2RtYSkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0Jdm9pZCAoKnVubWFwX2RtYSkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0Jdm9pZCAqICgqbWFwX2tlcm5lbCkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0Jdm9pZCAoKnVubWFwX2tlcm5lbCkgKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0JaW50ICgqbWFwX3VzZXIpIChzdHJ1Y3QgaW9uX2hlYXAgKm1hcHBlciwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisJaW50ICgqYWxsb2NhdGUpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKKwkJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJdW5zaWduZWQgbG9uZyBhbGlnbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJdm9pZCAoKmZyZWUpKHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOworCWludCAoKnBoeXMpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKKwkJICAgIGlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pOworCXN0cnVjdCBzZ190YWJsZSAqICgqbWFwX2RtYSkoc3RydWN0IGlvbl9oZWFwICpoZWFwLAorCQkJCSAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7CisJdm9pZCAoKnVubWFwX2RtYSkoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKKwl2b2lkICogKCptYXBfa2VybmVsKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOworCXZvaWQgKCp1bm1hcF9rZXJuZWwpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7CisJaW50ICgqbWFwX3VzZXIpKHN0cnVjdCBpb25faGVhcCAqbWFwcGVyLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCWludCAoKnNocmluaykoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBnZnBfdCBnZnBfbWFzaywgaW50IG5yX3RvX3NjYW4pOwogfTsKIAogLyoqCkBAIC0xMjIsNiArMTI5LDE3IEBACiAjZGVmaW5lIElPTl9IRUFQX0ZMQUdfREVGRVJfRlJFRSAoMSA8PCAwKQogCiAvKioKKyAqIHByaXZhdGUgZmxhZ3MgLSBmbGFncyBpbnRlcm5hbCB0byBpb24KKyAqLworLyoKKyAqIEJ1ZmZlciBpcyBiZWluZyBmcmVlZCBmcm9tIGEgc2hyaW5rZXIgZnVuY3Rpb24uIFNraXAgYW55IHBvc3NpYmxlCisgKiBoZWFwLXNwZWNpZmljIGNhY2hpbmcgbWVjaGFuaXNtIChlLmcuIHBhZ2UgcG9vbHMpLiBHdWFyYW50ZWVzIHRoYXQKKyAqIGFueSBidWZmZXIgc3RvcmFnZSB0aGF0IGNhbWUgZnJvbSB0aGUgc3lzdGVtIGFsbG9jYXRvciB3aWxsIGJlCisgKiByZXR1cm5lZCB0byB0aGUgc3lzdGVtIGFsbG9jYXRvci4KKyAqLworI2RlZmluZSBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUgKDEgPDwgMCkKKworLyoqCiAgKiBzdHJ1Y3QgaW9uX2hlYXAgLSByZXByZXNlbnRzIGEgaGVhcCBpbiB0aGUgc3lzdGVtCiAgKiBAbm9kZToJCXJiIG5vZGUgdG8gcHV0IHRoZSBoZWFwIG9uIHRoZSBkZXZpY2UncyB0cmVlIG9mIGhlYXBzCiAgKiBAZGV2OgkJYmFjayBwb2ludGVyIHRvIHRoZSBpb25fZGV2aWNlCkBAIC0xMzIsMTAgKzE1MCw3IEBACiAgKgkJCWFsbG9jYXRpbmcuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IHBsYXRmb3JtIGRhdGEgYW5kCiAgKgkJCU1VU1QgYmUgdW5pcXVlCiAgKiBAbmFtZToJCXVzZWQgZm9yIGRlYnVnZ2luZwotICogQHNocmlua2VyOgkJYSBzaHJpbmtlciBmb3IgdGhlIGhlYXAsIGlmIHRoZSBoZWFwIGNhY2hlcyBzeXN0ZW0KLSAqCQkJbWVtb3J5LCBpdCBtdXN0IGRlZmluZSBhIHNocmlua2VyIHRvIHJldHVybiBpdCBvbiBsb3cKLSAqCQkJbWVtb3J5IGNvbmRpdGlvbnMsIHRoaXMgaW5jbHVkZXMgc3lzdGVtIG1lbW9yeSBjYWNoZWQKLSAqCQkJaW4gdGhlIGRlZmVycmVkIGZyZWUgbGlzdHMgZm9yIGhlYXBzIHRoYXQgc3VwcG9ydCBpdAorICogQHNocmlua2VyOgkJYSBzaHJpbmtlciBmb3IgdGhlIGhlYXAKICAqIEBmcmVlX2xpc3Q6CQlmcmVlIGxpc3QgaGVhZCBpZiBkZWZlcnJlZCBmcmVlIGlzIHVzZWQKICAqIEBmcmVlX2xpc3Rfc2l6ZQlzaXplIG9mIHRoZSBkZWZlcnJlZCBmcmVlIGxpc3QgaW4gYnl0ZXMKICAqIEBsb2NrOgkJcHJvdGVjdHMgdGhlIGZyZWUgbGlzdApAQCAtMjE5LDYgKzIzNCwxNiBAQAogaW50IGlvbl9oZWFwX3BhZ2VzX3plcm8oc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBzaXplLCBwZ3Byb3RfdCBwZ3Byb3QpOwogCiAvKioKKyAqIGlvbl9oZWFwX2luaXRfc2hyaW5rZXIKKyAqIEBoZWFwOgkJdGhlIGhlYXAKKyAqCisgKiBJZiBhIGhlYXAgc2V0cyB0aGUgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFIGZsYWcgb3IgZGVmaW5lcyB0aGUgc2hyaW5rIG9wCisgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRvIHNldHVwIGEgc2hyaW5rZXIgdG8gc2hyaW5rIHRoZSBmcmVlbGlzdHMKKyAqIGFuZCBjYWxsIHRoZSBoZWFwJ3Mgc2hyaW5rIG9wLgorICovCit2b2lkIGlvbl9oZWFwX2luaXRfc2hyaW5rZXIoc3RydWN0IGlvbl9oZWFwICpoZWFwKTsKKworLyoqCiAgKiBpb25faGVhcF9pbml0X2RlZmVycmVkX2ZyZWUgLS0gaW5pdGlhbGl6ZSBkZWZlcnJlZCBmcmVlIGZ1bmN0aW9uYWxpdHkKICAqIEBoZWFwOgkJdGhlIGhlYXAKICAqCkBAIC0yNTAsNiArMjc1LDI5IEBACiBzaXplX3QgaW9uX2hlYXBfZnJlZWxpc3RfZHJhaW4oc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzaXplX3Qgc2l6ZSk7CiAKIC8qKgorICogaW9uX2hlYXBfZnJlZWxpc3Rfc2hyaW5rIC0gZHJhaW4gdGhlIGRlZmVycmVkIGZyZWUKKyAqCQkJCWxpc3QsIHNraXBwaW5nIGFueSBoZWFwLXNwZWNpZmljCisgKgkJCQlwb29saW5nIG9yIGNhY2hpbmcgbWVjaGFuaXNtcworICoKKyAqIEBoZWFwOgkJdGhlIGhlYXAKKyAqIEBzaXplOgkJYW1vdW50IG9mIG1lbW9yeSB0byBkcmFpbiBpbiBieXRlcworICoKKyAqIERyYWlucyB0aGUgaW5kaWNhdGVkIGFtb3VudCBvZiBtZW1vcnkgZnJvbSB0aGUgZGVmZXJyZWQgZnJlZWxpc3QgaW1tZWRpYXRlbHkuCisgKiBSZXR1cm5zIHRoZSB0b3RhbCBhbW91bnQgZnJlZWQuICBUaGUgdG90YWwgZnJlZWQgbWF5IGJlIGhpZ2hlciBkZXBlbmRpbmcKKyAqIG9uIHRoZSBzaXplIG9mIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCwgb3IgbG93ZXIgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50CisgKiB0b3RhbCBtZW1vcnkgb24gdGhlIGZyZWVsaXN0LgorICoKKyAqIFVubGlrZSB3aXRoIEBpb25faGVhcF9mcmVlbGlzdF9kcmFpbiwgZG9uJ3QgcHV0IGFueSBwYWdlcyBiYWNrIGludG8KKyAqIHBhZ2UgcG9vbHMgb3Igb3RoZXJ3aXNlIGNhY2hlIHRoZSBwYWdlcy4gRXZlcnl0aGluZyBtdXN0IGJlCisgKiBnZW51aW5lbHkgZnJlZSdkIGJhY2sgdG8gdGhlIHN5c3RlbS4gSWYgeW91J3JlIGZyZWUnaW5nIGZyb20gYQorICogc2hyaW5rZXIgeW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHRoaXMuIE5vdGUgdGhhdCB0aGlzIHJlbGllcyBvbgorICogdGhlIGhlYXAub3BzLmZyZWUgY2FsbGJhY2sgaG9ub3JpbmcgdGhlIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRQorICogZmxhZy4KKyAqLworc2l6ZV90IGlvbl9oZWFwX2ZyZWVsaXN0X3NocmluayhzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCisJCQkJCXNpemVfdCBzaXplKTsKKworLyoqCiAgKiBpb25faGVhcF9mcmVlbGlzdF9zaXplIC0gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZnJlZWxpc3QgaW4gYnl0ZXMKICAqIEBoZWFwOgkJdGhlIGhlYXAKICAqLwpAQCAtMzA1LDEzICszNTMsOCBAQAogICogQGxvd19jb3VudDoJCW51bWJlciBvZiBsb3dtZW0gaXRlbXMgaW4gdGhlIHBvb2wKICAqIEBoaWdoX2l0ZW1zOgkJbGlzdCBvZiBoaWdobWVtIGl0ZW1zCiAgKiBAbG93X2l0ZW1zOgkJbGlzdCBvZiBsb3dtZW0gaXRlbXMKLSAqIEBzaHJpbmtlcjoJCWEgc2hyaW5rZXIgZm9yIHRoZSBpdGVtcwogICogQG11dGV4OgkJbG9jayBwcm90ZWN0aW5nIHRoaXMgc3RydWN0IGFuZCBlc3BlY2lhbGx5IHRoZSBjb3VudAogICoJCQlpdGVtIGxpc3QKLSAqIEBhbGxvYzoJCWZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gYWxsb2NhdGUgcGFnZW9yeSB3aGVuIHRoZSBwb29sCi0gKgkJCWlzIGVtcHR5Ci0gKiBAZnJlZToJCWZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gZnJlZSBwYWdlb3J5IGJhY2sgdG8gdGhlIHN5c3RlbQotICoJCQl3aGVuIHRoZSBzaHJpbmtlciBmaXJlcwogICogQGdmcF9tYXNrOgkJZ2ZwX21hc2sgdG8gdXNlIGZyb20gYWxsb2MKICAqIEBvcmRlcjoJCW9yZGVyIG9mIHBhZ2VzIGluIHRoZSBwb29sCiAgKiBAbGlzdDoJCXBsaXN0IG5vZGUgZm9yIGxpc3Qgb2YgcG9vbHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYwppbmRleCA5ODQ5ZjM5Li5jOTIzNjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3N5c3RlbV9oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9zeXN0ZW1faGVhcC5jCkBAIC05MCw3ICs5MCw3IEBACiB7CiAJYm9vbCBjYWNoZWQgPSBpb25fYnVmZmVyX2NhY2hlZChidWZmZXIpOwogCi0JaWYgKCFjYWNoZWQpIHsKKwlpZiAoIWNhY2hlZCAmJiAhKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkpIHsKIAkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBoZWFwLT5wb29sc1tvcmRlcl90b19pbmRleChvcmRlcildOwogCQlpb25fcGFnZV9wb29sX2ZyZWUocG9vbCwgcGFnZSk7CiAJfSBlbHNlIHsKQEAgLTIwOSw3ICsyMDksNyBAQAogCiAJLyogdW5jYWNoZWQgcGFnZXMgY29tZSBmcm9tIHRoZSBwYWdlIHBvb2xzLCB6ZXJvIHRoZW0gYmVmb3JlIHJldHVybmluZwogCSAgIGZvciBzZWN1cml0eSBwdXJwb3NlcyAob3RoZXIgYWxsb2NhdGlvbnMgYXJlIHplcm9kIGF0IGFsbG9jIHRpbWUgKi8KLQlpZiAoIWNhY2hlZCkKKwlpZiAoIWNhY2hlZCAmJiAhKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkpCiAJCWlvbl9oZWFwX2J1ZmZlcl96ZXJvKGJ1ZmZlcik7CiAKIAlmb3JfZWFjaF9zZyh0YWJsZS0+c2dsLCBzZywgdGFibGUtPm5lbnRzLCBpKQpAQCAtMjMxLDYgKzIzMSwyMyBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBpb25fc3lzdGVtX2hlYXBfc2hyaW5rKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgZ2ZwX3QgZ2ZwX21hc2ssCisJCQkJCWludCBucl90b19zY2FuKQoreworCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKnN5c19oZWFwOworCWludCBucl90b3RhbCA9IDA7CisJaW50IGk7CisKKwlzeXNfaGVhcCA9IGNvbnRhaW5lcl9vZihoZWFwLCBzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwLCBoZWFwKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKKwkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBzeXNfaGVhcC0+cG9vbHNbaV07CisJCW5yX3RvdGFsICs9IGlvbl9wYWdlX3Bvb2xfc2hyaW5rKHBvb2wsIGdmcF9tYXNrLCBucl90b19zY2FuKTsKKwl9CisKKwlyZXR1cm4gbnJfdG90YWw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaW9uX2hlYXBfb3BzIHN5c3RlbV9oZWFwX29wcyA9IHsKIAkuYWxsb2NhdGUgPSBpb25fc3lzdGVtX2hlYXBfYWxsb2NhdGUsCiAJLmZyZWUgPSBpb25fc3lzdGVtX2hlYXBfZnJlZSwKQEAgLTIzOSw2NyArMjU2LDkgQEAKIAkubWFwX2tlcm5lbCA9IGlvbl9oZWFwX21hcF9rZXJuZWwsCiAJLnVubWFwX2tlcm5lbCA9IGlvbl9oZWFwX3VubWFwX2tlcm5lbCwKIAkubWFwX3VzZXIgPSBpb25faGVhcF9tYXBfdXNlciwKKwkuc2hyaW5rID0gaW9uX3N5c3RlbV9oZWFwX3NocmluaywKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9zeXN0ZW1faGVhcF9zaHJpbmtfY291bnQoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKLQkJCQkgIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCi17Ci0Jc3RydWN0IGlvbl9oZWFwICpoZWFwID0gY29udGFpbmVyX29mKHNocmlua2VyLCBzdHJ1Y3QgaW9uX2hlYXAsCi0JCQkJCSAgICAgc2hyaW5rZXIpOwotCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKnN5c19oZWFwID0gY29udGFpbmVyX29mKGhlYXAsCi0JCQkJCQkJc3RydWN0IGlvbl9zeXN0ZW1faGVhcCwKLQkJCQkJCQloZWFwKTsKLQlpbnQgbnJfdG90YWwgPSAwOwotCWludCBpOwotCi0JLyogdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGlzIHdoYXRldmVyIHRoZSBwYWdlIHBvb2xzIGFyZSBob2xkaW5nCi0JICAgcGx1cyB3aGF0ZXZlcidzIGluIHRoZSBmcmVlbGlzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKLQkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBzeXNfaGVhcC0+cG9vbHNbaV07Ci0JCW5yX3RvdGFsICs9IGlvbl9wYWdlX3Bvb2xfc2hyaW5rKHBvb2wsIHNjLT5nZnBfbWFzaywgMCk7Ci0JfQotCW5yX3RvdGFsICs9IGlvbl9oZWFwX2ZyZWVsaXN0X3NpemUoaGVhcCkgLyBQQUdFX1NJWkU7Ci0JcmV0dXJuIG5yX3RvdGFsOwotCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbl9zeXN0ZW1faGVhcF9zaHJpbmtfc2NhbihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLAotCQkJCSAgc3RydWN0IHNocmlua19jb250cm9sICpzYykKLXsKLQotCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAotCQkJCQkgICAgIHNocmlua2VyKTsKLQlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpzeXNfaGVhcCA9IGNvbnRhaW5lcl9vZihoZWFwLAotCQkJCQkJCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAsCi0JCQkJCQkJaGVhcCk7Ci0JaW50IG5yX2ZyZWVkID0gMDsKLQlpbnQgaTsKLQotCWlmIChzYy0+bnJfdG9fc2NhbiA9PSAwKQotCQlnb3RvIGVuZDsKLQotCS8qIHNocmluayB0aGUgZnJlZSBsaXN0IGZpcnN0LCBubyBwb2ludCBpbiB6ZXJvaW5nIHRoZSBtZW1vcnkgaWYKLQkgICB3ZSdyZSBqdXN0IGdvaW5nIHRvIHJlY2xhaW0gaXQgKi8KLQlucl9mcmVlZCArPSBpb25faGVhcF9mcmVlbGlzdF9kcmFpbihoZWFwLCBzYy0+bnJfdG9fc2NhbiAqIFBBR0VfU0laRSkgLwotCQlQQUdFX1NJWkU7Ci0KLQlpZiAobnJfZnJlZWQgPj0gc2MtPm5yX3RvX3NjYW4pCi0JCWdvdG8gZW5kOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9vcmRlcnM7IGkrKykgewotCQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbCA9IHN5c19oZWFwLT5wb29sc1tpXTsKLQotCQlucl9mcmVlZCArPSBpb25fcGFnZV9wb29sX3Nocmluayhwb29sLCBzYy0+Z2ZwX21hc2ssCi0JCQkJCQkgc2MtPm5yX3RvX3NjYW4pOwotCQlpZiAobnJfZnJlZWQgPj0gc2MtPm5yX3RvX3NjYW4pCi0JCQlicmVhazsKLQl9Ci0KLWVuZDoKLQlyZXR1cm4gbnJfZnJlZWQ7Ci0KLX0KLQogc3RhdGljIGludCBpb25fc3lzdGVtX2hlYXBfZGVidWdfc2hvdyhzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBzZXFfZmlsZSAqcywKIAkJCQkgICAgICB2b2lkICp1bnVzZWQpCiB7CkBAIC0zNDcsMTEgKzMwNiw2IEBACiAJCWhlYXAtPnBvb2xzW2ldID0gcG9vbDsKIAl9CiAKLQloZWFwLT5oZWFwLnNocmlua2VyLnNjYW5fb2JqZWN0cyA9IGlvbl9zeXN0ZW1faGVhcF9zaHJpbmtfc2NhbjsKLQloZWFwLT5oZWFwLnNocmlua2VyLmNvdW50X29iamVjdHMgPSBpb25fc3lzdGVtX2hlYXBfc2hyaW5rX2NvdW50OwotCWhlYXAtPmhlYXAuc2hyaW5rZXIuc2Vla3MgPSBERUZBVUxUX1NFRUtTOwotCWhlYXAtPmhlYXAuc2hyaW5rZXIuYmF0Y2ggPSAwOwotCXJlZ2lzdGVyX3Nocmlua2VyKCZoZWFwLT5oZWFwLnNocmlua2VyKTsKIAloZWFwLT5oZWFwLmRlYnVnX3Nob3cgPSBpb25fc3lzdGVtX2hlYXBfZGVidWdfc2hvdzsKIAlyZXR1cm4gJmhlYXAtPmhlYXA7CiBlcnJfY3JlYXRlX3Bvb2w6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vdGVncmEvdGVncmFfaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vdGVncmEvdGVncmFfaW9uLmMKaW5kZXggMzQ3NGM2NS4uMTFjN2NjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL3RlZ3JhL3RlZ3JhX2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi90ZWdyYS90ZWdyYV9pb24uYwpAQCAtMzIsMTMgKzMyLDEzIEBACiAKIAludW1faGVhcHMgPSBwZGF0YS0+bnI7CiAKLQloZWFwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb25faGVhcCAqKSAqIHBkYXRhLT5uciwgR0ZQX0tFUk5FTCk7CisJaGVhcHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb25faGVhcCAqKSAqIHBkYXRhLT5uciwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CiAKIAlpZGV2ID0gaW9uX2RldmljZV9jcmVhdGUoTlVMTCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGlkZXYpKSB7Ci0JCWtmcmVlKGhlYXBzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoaWRldikpCiAJCXJldHVybiBQVFJfRVJSKGlkZXYpOwotCX0KIAogCS8qIGNyZWF0ZSB0aGUgaGVhcHMgYXMgc3BlY2lmaWVkIGluIHRoZSBib2FyZCBmaWxlICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9oZWFwczsgaSsrKSB7CkBAIC01OCw3ICs1OCw2IEBACiAJCWlmIChoZWFwc1tpXSkKIAkJCWlvbl9oZWFwX2Rlc3Ryb3koaGVhcHNbaV0pOwogCX0KLQlrZnJlZShoZWFwcyk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzAsNyArNjksNiBAQAogCWlvbl9kZXZpY2VfZGVzdHJveShpZGV2KTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2hlYXBzOyBpKyspCiAJCWlvbl9oZWFwX2Rlc3Ryb3koaGVhcHNbaV0pOwotCWtmcmVlKGhlYXBzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwppbmRleCA2ZjA5NGIzLi5iNTQ1ZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwpAQCAtODgsNyArODgsOCBAQAogCWludCBhcnJheV9zaXplID0gQVJSQVlfU0laRShsb3dtZW1fYWRqKTsKIAlpbnQgb3RoZXJfZnJlZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZSRUVfUEFHRVMpIC0gdG90YWxyZXNlcnZlX3BhZ2VzOwogCWludCBvdGhlcl9maWxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9QQUdFUykgLQotCQkJCQkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0hNRU0pOworCQkJCQkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0hNRU0pIC0KKwkJCQkJCXRvdGFsX3N3YXBjYWNoZV9wYWdlcygpOwogCiAJaWYgKGxvd21lbV9hZGpfc2l6ZSA8IGFycmF5X3NpemUpCiAJCWFycmF5X3NpemUgPSBsb3dtZW1fYWRqX3NpemU7CkBAIC0xNTksOCArMTYwLDggQEAKIAkJCSAgICAgc2VsZWN0ZWQtPnBpZCwgc2VsZWN0ZWQtPmNvbW0sCiAJCQkgICAgIHNlbGVjdGVkX29vbV9zY29yZV9hZGosIHNlbGVjdGVkX3Rhc2tzaXplKTsKIAkJbG93bWVtX2RlYXRocGVuZGluZ190aW1lb3V0ID0gamlmZmllcyArIEhaOwotCQlzZW5kX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCwgMCk7CiAJCXNldF90c2tfdGhyZWFkX2ZsYWcoc2VsZWN0ZWQsIFRJRl9NRU1ESUUpOworCQlzZW5kX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCwgMCk7CiAJCXJlbSArPSBzZWxlY3RlZF90YXNrc2l6ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuaAppbmRleCA1YWFmNzFkLi4xYTUwNjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zd19zeW5jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3dfc3luYy5oCkBAIC0xOCwxMCArMTgsOSBAQAogI2RlZmluZSBfTElOVVhfU1dfU1lOQ19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaWZkZWYgX19LRVJORUxfXwotCisjaW5jbHVkZSA8bGludXgva2NvbmZpZy5oPgogI2luY2x1ZGUgInN5bmMuaCIKKyNpbmNsdWRlICJ1YXBpL3N3X3N5bmMuaCIKIAogc3RydWN0IHN3X3N5bmNfdGltZWxpbmUgewogCXN0cnVjdAlzeW5jX3RpbWVsaW5lCW9iajsKQEAgLTU3LDE5ICs1Niw0IEBACiB9CiAjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfU1dfU1lOQykgKi8KIAotI2VuZGlmIC8qIF9fS0VSTkVMIF9fICovCi0KLXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhIHsKLQlfX3UzMgl2YWx1ZTsKLQljaGFyCW5hbWVbMzJdOwotCV9fczMyCWZlbmNlOyAvKiBmZCBvZiBuZXcgZmVuY2UgKi8KLX07Ci0KLSNkZWZpbmUgU1dfU1lOQ19JT0NfTUFHSUMJJ1cnCi0KLSNkZWZpbmUgU1dfU1lOQ19JT0NfQ1JFQVRFX0ZFTkNFCV9JT1dSKFNXX1NZTkNfSU9DX01BR0lDLCAwLFwKLQkJc3RydWN0IHN3X3N5bmNfY3JlYXRlX2ZlbmNlX2RhdGEpCi0jZGVmaW5lIFNXX1NZTkNfSU9DX0lOQwkJCV9JT1coU1dfU1lOQ19JT0NfTUFHSUMsIDEsIF9fdTMyKQotCi0KICNlbmRpZiAvKiBfTElOVVhfU1dfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmgKaW5kZXggNjJlMjI1NWIuLmVhZjU3Y2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luYy5oCkBAIC0xNCwxNCArMTQsMTQgQEAKICNkZWZpbmUgX0xJTlVYX1NZTkNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKKyNpbmNsdWRlICJ1YXBpL3N5bmMuaCIKKwogc3RydWN0IHN5bmNfdGltZWxpbmU7CiBzdHJ1Y3Qgc3luY19wdDsKIHN0cnVjdCBzeW5jX2ZlbmNlOwpAQCAtNTMsNyArNTMsNyBAQAogCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOwogCiAJLyogcmVxdWlyZWQgKi8KLQlzdHJ1Y3Qgc3luY19wdCAqKCpkdXApKHN0cnVjdCBzeW5jX3B0ICpwdCk7CisJc3RydWN0IHN5bmNfcHQgKiAoKmR1cCkoc3RydWN0IHN5bmNfcHQgKnB0KTsKIAogCS8qIHJlcXVpcmVkICovCiAJaW50ICgqaGFzX3NpZ25hbGVkKShzdHJ1Y3Qgc3luY19wdCAqcHQpOwpAQCAtMzQxLDg2ICszNDEsNCBAQAogICovCiBpbnQgc3luY19mZW5jZV93YWl0KHN0cnVjdCBzeW5jX2ZlbmNlICpmZW5jZSwgbG9uZyB0aW1lb3V0KTsKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotLyoqCi0gKiBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIC0gZGF0YSBwYXNzZWQgdG8gbWVyZ2UgaW9jdGwKLSAqIEBmZDI6CWZpbGUgZGVzY3JpcHRvciBvZiBzZWNvbmQgZmVuY2UKLSAqIEBuYW1lOgluYW1lIG9mIG5ldyBmZW5jZQotICogQGZlbmNlOglyZXR1cm5zIHRoZSBmZCBvZiB0aGUgbmV3IGZlbmNlIHRvIHVzZXJzcGFjZQotICovCi1zdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIHsKLQlfX3MzMglmZDI7IC8qIGZkIG9mIHNlY29uZCBmZW5jZSAqLwotCWNoYXIJbmFtZVszMl07IC8qIG5hbWUgb2YgbmV3IGZlbmNlICovCi0JX19zMzIJZmVuY2U7IC8qIGZkIG9uIG5ld2x5IGNyZWF0ZWQgZmVuY2UgKi8KLX07Ci0KLS8qKgotICogc3RydWN0IHN5bmNfcHRfaW5mbyAtIGRldGFpbGVkIHN5bmNfcHQgaW5mb3JtYXRpb24KLSAqIEBsZW46CQlsZW5ndGggb2Ygc3luY19wdF9pbmZvIGluY2x1ZGluZyBhbnkgZHJpdmVyX2RhdGEKLSAqIEBvYmpfbmFtZToJCW5hbWUgb2YgcGFyZW50IHN5bmNfdGltZWxpbmUKLSAqIEBkcml2ZXJfbmFtZToJbmFtZSBvZiBkcml2ZXIgaW1wbGVtZW50aW5nIHRoZSBwYXJlbnQKLSAqIEBzdGF0dXM6CQlzdGF0dXMgb2YgdGhlIHN5bmNfcHQgMDphY3RpdmUgMTpzaWduYWxlZCA8MDplcnJvcgotICogQHRpbWVzdGFtcF9uczoJdGltZXN0YW1wIG9mIHN0YXR1cyBjaGFuZ2UgaW4gbmFub3NlY29uZHMKLSAqIEBkcml2ZXJfZGF0YToJYW55IGRyaXZlciBkZXBlbmRlbnQgZGF0YQotICovCi1zdHJ1Y3Qgc3luY19wdF9pbmZvIHsKLQlfX3UzMglsZW47Ci0JY2hhcglvYmpfbmFtZVszMl07Ci0JY2hhcglkcml2ZXJfbmFtZVszMl07Ci0JX19zMzIJc3RhdHVzOwotCV9fdTY0CXRpbWVzdGFtcF9uczsKLQotCV9fdTgJZHJpdmVyX2RhdGFbMF07Ci19OwotCi0vKioKLSAqIHN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSAtIGRhdGEgcmV0dXJuZWQgZnJvbSBmZW5jZSBpbmZvIGlvY3RsCi0gKiBAbGVuOglpb2N0bCBjYWxsZXIgd3JpdGVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXRzIHBhc3NpbmcgaW4uCi0gKgkJaW9jdGwgcmV0dXJucyBsZW5ndGggb2Ygc3luY19mZW5jZV9kYXRhIHJldHVybmVkIHRvIHVzZXJzcGFjZQotICoJCWluY2x1ZGluZyBwdF9pbmZvLgotICogQG5hbWU6CW5hbWUgb2YgZmVuY2UKLSAqIEBzdGF0dXM6CXN0YXR1cyBvZiBmZW5jZS4gMTogc2lnbmFsZWQgMDphY3RpdmUgPDA6ZXJyb3IKLSAqIEBwdF9pbmZvOglhIHN5bmNfcHRfaW5mbyBzdHJ1Y3QgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlCi0gKi8KLXN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSB7Ci0JX191MzIJbGVuOwotCWNoYXIJbmFtZVszMl07Ci0JX19zMzIJc3RhdHVzOwotCi0JX191OAlwdF9pbmZvWzBdOwotfTsKLQotI2RlZmluZSBTWU5DX0lPQ19NQUdJQwkJJz4nCi0KLS8qKgotICogRE9DOiBTWU5DX0lPQ19XQUlUIC0gd2FpdCBmb3IgYSBmZW5jZSB0byBzaWduYWwKLSAqCi0gKiBwYXNzIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAgV2FpdHMgaW5kZWZpbml0ZWx5IHRpbWVvdXQgPCAwLgotICovCi0jZGVmaW5lIFNZTkNfSU9DX1dBSVQJCV9JT1coU1lOQ19JT0NfTUFHSUMsIDAsIF9fczMyKQotCi0vKioKLSAqIERPQzogU1lOQ19JT0NfTUVSR0UgLSBtZXJnZSB0d28gZmVuY2VzCi0gKgotICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhLiAgQ3JlYXRlcyBhIG5ldyBmZW5jZSBjb250YWluaW5nIGNvcGllcyBvZgotICogdGhlIHN5bmNfcHRzIGluIGJvdGggdGhlIGNhbGxpbmcgZmQgYW5kIHN5bmNfbWVyZ2VfZGF0YS5mZDIuICBSZXR1cm5zIHRoZQotICogbmV3IGZlbmNlJ3MgZmQgaW4gc3luY19tZXJnZV9kYXRhLmZlbmNlCi0gKi8KLSNkZWZpbmUgU1lOQ19JT0NfTUVSR0UJCV9JT1dSKFNZTkNfSU9DX01BR0lDLCAxLCBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhKQotCi0vKioKLSAqIERPQzogU1lOQ19JT0NfRkVOQ0VfSU5GTyAtIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBhIGZlbmNlCi0gKgotICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgd2l0aCBleHRyYSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHB0X2luZm8uCi0gKiBDYWxsZXIgc2hvdWxkIHdyaXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW50byBsZW4uICBPbiByZXR1cm4sIGxlbiBpcwotICogdXBkYXRlZCB0byByZWZsZWN0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzeW5jX2ZlbmNlX2luZm9fZGF0YSBpbmNsdWRpbmcKLSAqIHB0X2luZm8uCi0gKgotICogcHRfaW5mbyBpcyBhIGJ1ZmZlciBjb250YWluaW5nIHN5bmNfcHRfaW5mb3MgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlLgotICogVG8gaXRlcmF0ZSBvdmVyIHRoZSBzeW5jX3B0X2luZm9zLCB1c2UgdGhlIHN5bmNfcHRfaW5mby5sZW4gZmllbGQuCi0gKi8KLSNkZWZpbmUgU1lOQ19JT0NfRkVOQ0VfSU5GTwlfSU9XUihTWU5DX0lPQ19NQUdJQywgMixcCi0Jc3RydWN0IHN5bmNfZmVuY2VfaW5mb19kYXRhKQotCiAjZW5kaWYgLyogX0xJTlVYX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jCmluZGV4IGU4MTQ1MTQuLjBjN2ZkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMKQEAgLTkwLDggKzkwLDkgQEAKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JZ3Bpb19kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpbWVkX2dwaW9fZGF0YSkgKiBwZGF0YS0+bnVtX2dwaW9zLAotCQkJR0ZQX0tFUk5FTCk7CisJZ3Bpb19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEpICogcGRhdGEtPm51bV9ncGlvcywKKwkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWdwaW9fZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEzMSw3ICsxMzIsNiBAQAogCQl0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoJmdwaW9fZGF0YVtpXS5kZXYpOwogCQlncGlvX2ZyZWUoZ3Bpb19kYXRhW2ldLmdwaW8pOwogCX0KLQlrZnJlZShncGlvX2RhdGEpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0Nyw4ICsxNDcsNiBAQAogCQlncGlvX2ZyZWUoZ3Bpb19kYXRhW2ldLmdwaW8pOwogCX0KIAotCWtmcmVlKGdwaW9fZGF0YSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaAppbmRleCA5MDVjN2NjLi4xM2QyY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaApAQCAtMjAsMTAgKzIwLDEwIEBACiAJY29uc3QgY2hhcgkqbmFtZTsKIAogCS8qIGVuYWJsZSB0aGUgb3V0cHV0IGFuZCBzZXQgdGhlIHRpbWVyICovCi0Jdm9pZAkoKmVuYWJsZSkoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnNkZXYsIGludCB0aW1lb3V0KTsKKwl2b2lkICgqZW5hYmxlKShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqc2RldiwgaW50IHRpbWVvdXQpOwogCiAJLyogcmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHJlbWFpbmluZyBvbiB0aGUgdGltZXIgKi8KLQlpbnQJCSgqZ2V0X3RpbWUpKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpzZGV2KTsKKwlpbnQgKCpnZXRfdGltZSkoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnNkZXYpOwogCiAJLyogcHJpdmF0ZSBkYXRhICovCiAJc3RydWN0IGRldmljZQkqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hbmRyb2lkX2FsYXJtLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2FuZHJvaWRfYWxhcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAxM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hbmRyb2lkX2FsYXJtLmgKQEAgLTAsMCArMSw2MiBAQAorLyogZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hbmRyb2lkX2FsYXJtLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX0FORFJPSURfQUxBUk1fSAorI2RlZmluZSBfVUFQSV9MSU5VWF9BTkRST0lEX0FMQVJNX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCitlbnVtIGFuZHJvaWRfYWxhcm1fdHlwZSB7CisJLyogcmV0dXJuIGNvZGUgYml0IG51bWJlcnMgb3Igc2V0IGFsYXJtIGFyZyAqLworCUFORFJPSURfQUxBUk1fUlRDX1dBS0VVUCwKKwlBTkRST0lEX0FMQVJNX1JUQywKKwlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAorCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRSwKKwlBTkRST0lEX0FMQVJNX1NZU1RFTVRJTUUsCisKKwlBTkRST0lEX0FMQVJNX1RZUEVfQ09VTlQsCisKKwkvKiByZXR1cm4gY29kZSBiaXQgbnVtYmVycyAqLworCS8qIEFORFJPSURfQUxBUk1fVElNRV9DSEFOR0UgPSAxNiAqLworfTsKKworZW51bSBhbmRyb2lkX2FsYXJtX3JldHVybl9mbGFncyB7CisJQU5EUk9JRF9BTEFSTV9SVENfV0FLRVVQX01BU0sgPSAxVSA8PCBBTkRST0lEX0FMQVJNX1JUQ19XQUtFVVAsCisJQU5EUk9JRF9BTEFSTV9SVENfTUFTSyA9IDFVIDw8IEFORFJPSURfQUxBUk1fUlRDLAorCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9XQUtFVVBfTUFTSyA9CisJCQkJMVUgPDwgQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwKKwlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfTUFTSyA9CisJCQkJMVUgPDwgQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FLAorCUFORFJPSURfQUxBUk1fU1lTVEVNVElNRV9NQVNLID0gMVUgPDwgQU5EUk9JRF9BTEFSTV9TWVNURU1USU1FLAorCUFORFJPSURfQUxBUk1fVElNRV9DSEFOR0VfTUFTSyA9IDFVIDw8IDE2Cit9OworCisvKiBEaXNhYmxlIGFsYXJtICovCisjZGVmaW5lIEFORFJPSURfQUxBUk1fQ0xFQVIodHlwZSkgICAgICAgICAgIF9JTygnYScsIDAgfCAoKHR5cGUpIDw8IDQpKQorCisvKiBBY2sgbGFzdCBhbGFybSBhbmQgd2FpdCBmb3IgbmV4dCAqLworI2RlZmluZSBBTkRST0lEX0FMQVJNX1dBSVQgICAgICAgICAgICAgICAgICBfSU8oJ2EnLCAxKQorCisjZGVmaW5lIEFMQVJNX0lPVyhjLCB0eXBlLCBzaXplKSAgICAgICAgICAgIF9JT1coJ2EnLCAoYykgfCAoKHR5cGUpIDw8IDQpLCBzaXplKQorLyogU2V0IGFsYXJtICovCisjZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUKHR5cGUpICAgICAgICAgICAgIEFMQVJNX0lPVygyLCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUX0FORF9XQUlUKHR5cGUpICAgIEFMQVJNX0lPVygzLCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fR0VUX1RJTUUodHlwZSkgICAgICAgIEFMQVJNX0lPVyg0LCB0eXBlLCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fU0VUX1JUQyAgICAgICAgICAgICAgIF9JT1coJ2EnLCA1LCBzdHJ1Y3QgdGltZXNwZWMpCisjZGVmaW5lIEFORFJPSURfQUxBUk1fQkFTRV9DTUQoY21kKSAgICAgICAgIChjbWQgJiB+KF9JT0MoMCwgMCwgMHhmMCwgMCkpKQorI2RlZmluZSBBTkRST0lEX0FMQVJNX0lPQ1RMX1RPX1RZUEUoY21kKSAgICAoX0lPQ19OUihjbWQpID4+IDQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9hc2htZW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYXNobWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0NzQzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYXNobWVtLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIGRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYXNobWVtLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorICogQXV0aG9yOiBSb2JlcnQgTG92ZQorICoKKyAqIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkLiAgSXQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSAyLjAgTGljZW5zZSBPUiB2ZXJzaW9uIDIgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX0FTSE1FTV9ICisjZGVmaW5lIF9VQVBJX0xJTlVYX0FTSE1FTV9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEFTSE1FTV9OQU1FX0xFTgkJMjU2CisKKyNkZWZpbmUgQVNITUVNX05BTUVfREVGCQkiZGV2L2FzaG1lbSIKKworLyogUmV0dXJuIHZhbHVlcyBmcm9tIEFTSE1FTV9QSU46IFdhcyB0aGUgbWFwcGluZyBwdXJnZWQgd2hpbGUgdW5waW5uZWQ/ICovCisjZGVmaW5lIEFTSE1FTV9OT1RfUFVSR0VECTAKKyNkZWZpbmUgQVNITUVNX1dBU19QVVJHRUQJMQorCisvKiBSZXR1cm4gdmFsdWVzIGZyb20gQVNITUVNX0dFVF9QSU5fU1RBVFVTOiBJcyB0aGUgbWFwcGluZyBwaW5uZWQ/ICovCisjZGVmaW5lIEFTSE1FTV9JU19VTlBJTk5FRAkwCisjZGVmaW5lIEFTSE1FTV9JU19QSU5ORUQJMQorCitzdHJ1Y3QgYXNobWVtX3BpbiB7CisJX191MzIgb2Zmc2V0OwkvKiBvZmZzZXQgaW50byByZWdpb24sIGluIGJ5dGVzLCBwYWdlLWFsaWduZWQgKi8KKwlfX3UzMiBsZW47CS8qIGxlbmd0aCBmb3J3YXJkIGZyb20gb2Zmc2V0LCBpbiBieXRlcywgcGFnZS1hbGlnbmVkICovCit9OworCisjZGVmaW5lIF9fQVNITUVNSU9DCQkweDc3CisKKyNkZWZpbmUgQVNITUVNX1NFVF9OQU1FCQlfSU9XKF9fQVNITUVNSU9DLCAxLCBjaGFyW0FTSE1FTV9OQU1FX0xFTl0pCisjZGVmaW5lIEFTSE1FTV9HRVRfTkFNRQkJX0lPUihfX0FTSE1FTUlPQywgMiwgY2hhcltBU0hNRU1fTkFNRV9MRU5dKQorI2RlZmluZSBBU0hNRU1fU0VUX1NJWkUJCV9JT1coX19BU0hNRU1JT0MsIDMsIHNpemVfdCkKKyNkZWZpbmUgQVNITUVNX0dFVF9TSVpFCQlfSU8oX19BU0hNRU1JT0MsIDQpCisjZGVmaW5lIEFTSE1FTV9TRVRfUFJPVF9NQVNLCV9JT1coX19BU0hNRU1JT0MsIDUsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIEFTSE1FTV9HRVRfUFJPVF9NQVNLCV9JTyhfX0FTSE1FTUlPQywgNikKKyNkZWZpbmUgQVNITUVNX1BJTgkJX0lPVyhfX0FTSE1FTUlPQywgNywgc3RydWN0IGFzaG1lbV9waW4pCisjZGVmaW5lIEFTSE1FTV9VTlBJTgkJX0lPVyhfX0FTSE1FTUlPQywgOCwgc3RydWN0IGFzaG1lbV9waW4pCisjZGVmaW5lIEFTSE1FTV9HRVRfUElOX1NUQVRVUwlfSU8oX19BU0hNRU1JT0MsIDkpCisjZGVmaW5lIEFTSE1FTV9QVVJHRV9BTExfQ0FDSEVTCV9JTyhfX0FTSE1FTUlPQywgMTApCisKKyNlbmRpZgkvKiBfVUFQSV9MSU5VWF9BU0hNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9iaW5kZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYmluZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0YWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvYmluZGVyLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKgorICogQmFzZWQgb24sIGJ1dCBubyBsb25nZXIgY29tcGF0aWJsZSB3aXRoLCB0aGUgb3JpZ2luYWwKKyAqIE9wZW5CaW5kZXIub3JnIGJpbmRlciBkcml2ZXIgaW50ZXJmYWNlLCB3aGljaCBpczoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgUGFsbXNvdXJjZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX1VBUElfTElOVVhfQklOREVSX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfQklOREVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgQl9QQUNLX0NIQVJTKGMxLCBjMiwgYzMsIGM0KSBcCisJKCgoKGMxKTw8MjQpKSB8ICgoKGMyKTw8MTYpKSB8ICgoKGMzKTw8OCkpIHwgKGM0KSkKKyNkZWZpbmUgQl9UWVBFX0xBUkdFIDB4ODUKKworZW51bSB7CisJQklOREVSX1RZUEVfQklOREVSCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfV0VBS19CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRQk9IEJfUEFDS19DSEFSUygndycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAorCUJJTkRFUl9UWVBFX0ZECQk9IEJfUEFDS19DSEFSUygnZicsICdkJywgJyonLCBCX1RZUEVfTEFSR0UpLAorfTsKKworZW51bSB7CisJRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLID0gMHhmZiwKKwlGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTID0gMHgxMDAsCit9OworCisjaWZkZWYgQklOREVSX0lQQ18zMkJJVAordHlwZWRlZiBfX3UzMiBiaW5kZXJfc2l6ZV90OwordHlwZWRlZiBfX3UzMiBiaW5kZXJfdWludHB0cl90OworI2Vsc2UKK3R5cGVkZWYgX191NjQgYmluZGVyX3NpemVfdDsKK3R5cGVkZWYgX191NjQgYmluZGVyX3VpbnRwdHJfdDsKKyNlbmRpZgorCisvKgorICogVGhpcyBpcyB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgQmluZGVyIG9iamVjdCBmb3IgdHJhbnNmZXIKKyAqIGJldHdlZW4gcHJvY2Vzc2VzLiAgVGhlICdvZmZzZXRzJyBzdXBwbGllZCBhcyBwYXJ0IG9mIGEgYmluZGVyIHRyYW5zYWN0aW9uCisgKiBjb250YWlucyBvZmZzZXRzIGludG8gdGhlIGRhdGEgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBvY2N1ci4gIFRoZSBCaW5kZXIKKyAqIGRyaXZlciB0YWtlcyBjYXJlIG9mIHJlLXdyaXRpbmcgdGhlIHN0cnVjdHVyZSB0eXBlIGFuZCBkYXRhIGFzIGl0IG1vdmVzCisgKiBiZXR3ZWVuIHByb2Nlc3Nlcy4KKyAqLworc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCB7CisJLyogOCBieXRlcyBmb3IgbGFyZ2VfZmxhdF9oZWFkZXIuICovCisJX191MzIJCXR5cGU7CisJX191MzIJCWZsYWdzOworCisJLyogOCBieXRlcyBvZiBkYXRhLiAqLworCXVuaW9uIHsKKwkJYmluZGVyX3VpbnRwdHJfdAliaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLworCQlfX3UzMgkJCWhhbmRsZTsJLyogcmVtb3RlIG9iamVjdCAqLworCX07CisKKwkvKiBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBsb2NhbCBvYmplY3QgKi8KKwliaW5kZXJfdWludHB0cl90CWNvb2tpZTsKK307CisKKy8qCisgKiBPbiA2NC1iaXQgcGxhdGZvcm1zIHdoZXJlIHVzZXIgY29kZSBtYXkgcnVuIGluIDMyLWJpdHMgdGhlIGRyaXZlciBtdXN0CisgKiB0cmFuc2xhdGUgdGhlIGJ1ZmZlciAoYW5kIGxvY2FsIGJpbmRlcikgYWRkcmVzc2VzIGFwcHJvcHJpYXRlbHkuCisgKi8KKworc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkIHsKKwliaW5kZXJfc2l6ZV90CQl3cml0ZV9zaXplOwkvKiBieXRlcyB0byB3cml0ZSAqLworCWJpbmRlcl9zaXplX3QJCXdyaXRlX2NvbnN1bWVkOwkvKiBieXRlcyBjb25zdW1lZCBieSBkcml2ZXIgKi8KKwliaW5kZXJfdWludHB0cl90CXdyaXRlX2J1ZmZlcjsKKwliaW5kZXJfc2l6ZV90CQlyZWFkX3NpemU7CS8qIGJ5dGVzIHRvIHJlYWQgKi8KKwliaW5kZXJfc2l6ZV90CQlyZWFkX2NvbnN1bWVkOwkvKiBieXRlcyBjb25zdW1lZCBieSBkcml2ZXIgKi8KKwliaW5kZXJfdWludHB0cl90CXJlYWRfYnVmZmVyOworfTsKKworLyogVXNlIHdpdGggQklOREVSX1ZFUlNJT04sIGRyaXZlciBmaWxscyBpbiBmaWVsZHMuICovCitzdHJ1Y3QgYmluZGVyX3ZlcnNpb24geworCS8qIGRyaXZlciBwcm90b2NvbCB2ZXJzaW9uIC0tIGluY3JlbWVudCB3aXRoIGluY29tcGF0aWJsZSBjaGFuZ2UgKi8KKwlfX3MzMiAgICAgICBwcm90b2NvbF92ZXJzaW9uOworfTsKKworLyogVGhpcyBpcyB0aGUgY3VycmVudCBwcm90b2NvbCB2ZXJzaW9uLiAqLworI2lmZGVmIEJJTkRFUl9JUENfMzJCSVQKKyNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3CisjZWxzZQorI2RlZmluZSBCSU5ERVJfQ1VSUkVOVF9QUk9UT0NPTF9WRVJTSU9OIDgKKyNlbmRpZgorCisjZGVmaW5lIEJJTkRFUl9XUklURV9SRUFECQlfSU9XUignYicsIDEsIHN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCkKKyNkZWZpbmUgQklOREVSX1NFVF9JRExFX1RJTUVPVVQJCV9JT1coJ2InLCAzLCBfX3M2NCkKKyNkZWZpbmUgQklOREVSX1NFVF9NQVhfVEhSRUFEUwkJX0lPVygnYicsIDUsIF9fdTMyKQorI2RlZmluZSBCSU5ERVJfU0VUX0lETEVfUFJJT1JJVFkJX0lPVygnYicsIDYsIF9fczMyKQorI2RlZmluZSBCSU5ERVJfU0VUX0NPTlRFWFRfTUdSCQlfSU9XKCdiJywgNywgX19zMzIpCisjZGVmaW5lIEJJTkRFUl9USFJFQURfRVhJVAkJX0lPVygnYicsIDgsIF9fczMyKQorI2RlZmluZSBCSU5ERVJfVkVSU0lPTgkJCV9JT1dSKCdiJywgOSwgc3RydWN0IGJpbmRlcl92ZXJzaW9uKQorCisvKgorICogTk9URTogVHdvIHNwZWNpYWwgZXJyb3IgY29kZXMgeW91IHNob3VsZCBjaGVjayBmb3Igd2hlbiBjYWxsaW5nCisgKiBpbiB0byB0aGUgZHJpdmVyIGFyZToKKyAqCisgKiBFSU5UUiAtLSBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGludGVydXB0ZWQuICBUaGlzIHNob3VsZCBiZQorICogaGFuZGxlZCBieSByZXRyeWluZyB0aGUgaW9jdGwoKSB1bnRpbCBhIGRpZmZlcmVudCBlcnJvciBjb2RlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBFQ09OTlJFRlVTRUQgLS0gVGhlIGRyaXZlciBpcyBubyBsb25nZXIgYWNjZXB0aW5nIG9wZXJhdGlvbnMKKyAqIGZyb20geW91ciBwcm9jZXNzLiAgVGhhdCBpcywgdGhlIHByb2Nlc3MgaXMgYmVpbmcgZGVzdHJveWVkLgorICogWW91IHNob3VsZCBoYW5kbGUgdGhpcyBieSBleGl0aW5nIGZyb20geW91ciBwcm9jZXNzLiAgTm90ZQorICogdGhhdCBvbmNlIHRoaXMgZXJyb3IgY29kZSBpcyByZXR1cm5lZCwgYWxsIGZ1cnRoZXIgY2FsbHMgdG8KKyAqIHRoZSBkcml2ZXIgZnJvbSBhbnkgdGhyZWFkIHdpbGwgcmV0dXJuIHRoaXMgc2FtZSBjb2RlLgorICovCisKK2VudW0gdHJhbnNhY3Rpb25fZmxhZ3MgeworCVRGX09ORV9XQVkJPSAweDAxLAkvKiB0aGlzIGlzIGEgb25lLXdheSBjYWxsOiBhc3luYywgbm8gcmV0dXJuICovCisJVEZfUk9PVF9PQkpFQ1QJPSAweDA0LAkvKiBjb250ZW50cyBhcmUgdGhlIGNvbXBvbmVudCdzIHJvb3Qgb2JqZWN0ICovCisJVEZfU1RBVFVTX0NPREUJPSAweDA4LAkvKiBjb250ZW50cyBhcmUgYSAzMi1iaXQgc3RhdHVzIGNvZGUgKi8KKwlURl9BQ0NFUFRfRkRTCT0gMHgxMCwJLyogYWxsb3cgcmVwbGllcyB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgKi8KK307CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB7CisJLyogVGhlIGZpcnN0IHR3byBhcmUgb25seSB1c2VkIGZvciBiY1RSQU5TQUNUSU9OIGFuZCBiclRSQU5TQUNUSU9OLAorCSAqIGlkZW50aWZ5aW5nIHRoZSB0YXJnZXQgYW5kIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl1bmlvbiB7CisJCS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIGNvbW1hbmQgdHJhbnNhY3Rpb24gKi8KKwkJX191MzIJaGFuZGxlOworCQkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiByZXR1cm4gdHJhbnNhY3Rpb24gKi8KKwkJYmluZGVyX3VpbnRwdHJfdCBwdHI7CisJfSB0YXJnZXQ7CisJYmluZGVyX3VpbnRwdHJfdAljb29raWU7CS8qIHRhcmdldCBvYmplY3QgY29va2llICovCisJX191MzIJCWNvZGU7CQkvKiB0cmFuc2FjdGlvbiBjb21tYW5kICovCisKKwkvKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2FjdGlvbi4gKi8KKwlfX3UzMgkgICAgICAgIGZsYWdzOworCXBpZF90CQlzZW5kZXJfcGlkOworCXVpZF90CQlzZW5kZXJfZXVpZDsKKwliaW5kZXJfc2l6ZV90CWRhdGFfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgKi8KKwliaW5kZXJfc2l6ZV90CW9mZnNldHNfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIG9mZnNldHMgKi8KKworCS8qIElmIHRoaXMgdHJhbnNhY3Rpb24gaXMgaW5saW5lLCB0aGUgZGF0YSBpbW1lZGlhdGVseQorCSAqIGZvbGxvd3MgaGVyZTsgb3RoZXJ3aXNlLCBpdCBlbmRzIHdpdGggYSBwb2ludGVyIHRvCisJICogdGhlIGRhdGEgYnVmZmVyLgorCSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIHRyYW5zYWN0aW9uIGRhdGEgKi8KKwkJCWJpbmRlcl91aW50cHRyX3QJYnVmZmVyOworCQkJLyogb2Zmc2V0cyBmcm9tIGJ1ZmZlciB0byBmbGF0X2JpbmRlcl9vYmplY3Qgc3RydWN0cyAqLworCQkJYmluZGVyX3VpbnRwdHJfdAlvZmZzZXRzOworCQl9IHB0cjsKKwkJX191OAlidWZbOF07CisJfSBkYXRhOworfTsKKworc3RydWN0IGJpbmRlcl9wdHJfY29va2llIHsKKwliaW5kZXJfdWludHB0cl90IHB0cjsKKwliaW5kZXJfdWludHB0cl90IGNvb2tpZTsKK307CisKK3N0cnVjdCBiaW5kZXJfaGFuZGxlX2Nvb2tpZSB7CisJX191MzIgaGFuZGxlOworCWJpbmRlcl91aW50cHRyX3QgY29va2llOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGJpbmRlcl9wcmlfZGVzYyB7CisJX19zMzIgcHJpb3JpdHk7CisJX191MzIgZGVzYzsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgeworCV9fczMyIHByaW9yaXR5OworCWJpbmRlcl91aW50cHRyX3QgcHRyOworCWJpbmRlcl91aW50cHRyX3QgY29va2llOworfTsKKworZW51bSBiaW5kZXJfZHJpdmVyX3JldHVybl9wcm90b2NvbCB7CisJQlJfRVJST1IgPSBfSU9SKCdyJywgMCwgX19zMzIpLAorCS8qCisJICogaW50OiBlcnJvciBjb2RlCisJICovCisKKwlCUl9PSyA9IF9JTygncicsIDEpLAorCS8qIE5vIHBhcmFtZXRlcnMhICovCisKKwlCUl9UUkFOU0FDVElPTiA9IF9JT1IoJ3InLCAyLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCUJSX1JFUExZID0gX0lPUigncicsIDMsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJLyoKKwkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHJlY2VpdmVkIGNvbW1hbmQuCisJICovCisKKwlCUl9BQ1FVSVJFX1JFU1VMVCA9IF9JT1IoJ3InLCA0LCBfX3MzMiksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogMCBpZiB0aGUgbGFzdCBiY0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB0aGUgcmVtb3RlIG9iamVjdCBoYXMgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZS4KKwkgKi8KKworCUJSX0RFQURfUkVQTFkgPSBfSU8oJ3InLCA1KSwKKwkvKgorCSAqIFRoZSB0YXJnZXQgb2YgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKKwkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBpcyBubyBsb25nZXIgd2l0aCB1cy4gIE5vIHBhcmFtZXRlcnMuCisJICovCisKKwlCUl9UUkFOU0FDVElPTl9DT01QTEVURSA9IF9JTygncicsIDYpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4uLiBhbHdheXMgcmVmZXJzIHRvIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHJlcXVlc3RlZAorCSAqIChpbmNsdWRpbmcgcmVwbGllcykuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIHNlbnQgZXZlbiBmb3IKKwkgKiBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zLgorCSAqLworCisJQlJfSU5DUkVGUyA9IF9JT1IoJ3InLCA3LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJSX0FDUVVJUkUgPSBfSU9SKCdyJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCUl9SRUxFQVNFID0gX0lPUigncicsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQlJfREVDUkVGUyA9IF9JT1IoJ3InLCAxMCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjoJcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJSX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1IoJ3InLCAxMSwgc3RydWN0IGJpbmRlcl9wcmlfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDoJcHJpb3JpdHkKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCUl9OT09QID0gX0lPKCdyJywgMTIpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4gIERvIG5vdGhpbmcgYW5kIGV4YW1pbmUgdGhlIG5leHQgY29tbWFuZC4gIEl0IGV4aXN0cworCSAqIHByaW1hcmlseSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIGl0IHdpdGggYSBCUl9TUEFXTl9MT09QRVIgY29tbWFuZC4KKwkgKi8KKworCUJSX1NQQVdOX0xPT1BFUiA9IF9JTygncicsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuICBUaGUgZHJpdmVyIGhhcyBkZXRlcm1pbmVkIHRoYXQgYSBwcm9jZXNzIGhhcyBubworCSAqIHRocmVhZHMgd2FpdGluZyB0byBzZXJ2aWNlIGluY29taW5nIHRyYW5zYWN0aW9ucy4gIFdoZW4gYSBwcm9jZXNzCisJICogcmVjZWl2ZXMgdGhpcyBjb21tYW5kLCBpdCBtdXN0IHNwYXduIGEgbmV3IHNlcnZpY2UgdGhyZWFkIGFuZAorCSAqIHJlZ2lzdGVyIGl0IHZpYSBiY0VOVEVSX0xPT1BFUi4KKwkgKi8KKworCUJSX0ZJTklTSEVEID0gX0lPKCdyJywgMTQpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBzdG9wIHRocmVhZHBvb2wgdGhyZWFkCisJICovCisKKwlCUl9ERUFEX0JJTkRFUiA9IF9JT1IoJ3InLCAxNSwgYmluZGVyX3VpbnRwdHJfdCksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCUJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FID0gX0lPUigncicsIDE2LCBiaW5kZXJfdWludHB0cl90KSwKKwkvKgorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCUl9GQUlMRURfUkVQTFkgPSBfSU8oJ3InLCAxNyksCisJLyoKKwkgKiBUaGUgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKKwkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBmYWlsZWQgKGUuZy4gb3V0IG9mIG1lbW9yeSkuICBObyBwYXJhbWV0ZXJzLgorCSAqLworfTsKKworZW51bSBiaW5kZXJfZHJpdmVyX2NvbW1hbmRfcHJvdG9jb2wgeworCUJDX1RSQU5TQUNUSU9OID0gX0lPVygnYycsIDAsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJQkNfUkVQTFkgPSBfSU9XKCdjJywgMSwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwkvKgorCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgc2VudCBjb21tYW5kLgorCSAqLworCisJQkNfQUNRVUlSRV9SRVNVTFQgPSBfSU9XKCdjJywgMiwgX19zMzIpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6ICAwIGlmIHRoZSBsYXN0IEJSX0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB5b3UgaGF2ZSBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QuCisJICovCisKKwlCQ19GUkVFX0JVRkZFUiA9IF9JT1coJ2MnLCAzLCBiaW5kZXJfdWludHB0cl90KSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIHRyYW5zYWN0aW9uIGRhdGEgcmVjZWl2ZWQgb24gYSByZWFkCisJICovCisKKwlCQ19JTkNSRUZTID0gX0lPVygnYycsIDQsIF9fdTMyKSwKKwlCQ19BQ1FVSVJFID0gX0lPVygnYycsIDUsIF9fdTMyKSwKKwlCQ19SRUxFQVNFID0gX0lPVygnYycsIDYsIF9fdTMyKSwKKwlCQ19ERUNSRUZTID0gX0lPVygnYycsIDcsIF9fdTMyKSwKKwkvKgorCSAqIGludDoJZGVzY3JpcHRvcgorCSAqLworCisJQkNfSU5DUkVGU19ET05FID0gX0lPVygnYycsIDgsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQkNfQUNRVUlSRV9ET05FID0gX0lPVygnYycsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCQ19BVFRFTVBUX0FDUVVJUkUgPSBfSU9XKCdjJywgMTAsIHN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6IHByaW9yaXR5CisJICogaW50OiBkZXNjcmlwdG9yCisJICovCisKKwlCQ19SRUdJU1RFUl9MT09QRVIgPSBfSU8oJ2MnLCAxMSksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLgorCSAqIFJlZ2lzdGVyIGEgc3Bhd25lZCBsb29wZXIgdGhyZWFkIHdpdGggdGhlIGRldmljZS4KKwkgKi8KKworCUJDX0VOVEVSX0xPT1BFUiA9IF9JTygnYycsIDEyKSwKKwlCQ19FWElUX0xPT1BFUiA9IF9JTygnYycsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuCisJICogVGhlc2UgdHdvIGNvbW1hbmRzIGFyZSBzZW50IGFzIGFuIGFwcGxpY2F0aW9uLWxldmVsIHRocmVhZAorCSAqIGVudGVycyBhbmQgZXhpdHMgdGhlIGJpbmRlciBsb29wLCByZXNwZWN0aXZlbHkuICBUaGV5IGFyZQorCSAqIHVzZWQgc28gdGhlIGJpbmRlciBjYW4gaGF2ZSBhbiBhY2N1cmF0ZSBjb3VudCBvZiB0aGUgbnVtYmVyCisJICogb2YgbG9vcGluZyB0aHJlYWRzIGl0IGhhcyBhdmFpbGFibGUuCisJICovCisKKwlCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNCwKKwkJCQkJCXN0cnVjdCBiaW5kZXJfaGFuZGxlX2Nvb2tpZSksCisJLyoKKwkgKiBpbnQ6IGhhbmRsZQorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04gPSBfSU9XKCdjJywgMTUsCisJCQkJCQlzdHJ1Y3QgYmluZGVyX2hhbmRsZV9jb29raWUpLAorCS8qCisJICogaW50OiBoYW5kbGUKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQkNfREVBRF9CSU5ERVJfRE9ORSA9IF9JT1coJ2MnLCAxNiwgYmluZGVyX3VpbnRwdHJfdCksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworfTsKKworI2VuZGlmIC8qIF9VQVBJX0xJTlVYX0JJTkRFUl9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvc3dfc3luYy5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9zd19zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ZDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvc3dfc3luYy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9TV19TWU5DX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfU1dfU1lOQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSB7CisJX191MzIJdmFsdWU7CisJY2hhcgluYW1lWzMyXTsKKwlfX3MzMglmZW5jZTsgLyogZmQgb2YgbmV3IGZlbmNlICovCit9OworCisjZGVmaW5lIFNXX1NZTkNfSU9DX01BR0lDCSdXJworCisjZGVmaW5lIFNXX1NZTkNfSU9DX0NSRUFURV9GRU5DRQlfSU9XUihTV19TWU5DX0lPQ19NQUdJQywgMCxcCisJCXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhKQorI2RlZmluZSBTV19TWU5DX0lPQ19JTkMJCQlfSU9XKFNXX1NZTkNfSU9DX01BR0lDLCAxLCBfX3UzMikKKworI2VuZGlmIC8qIF9VQVBJX0xJTlVYX1NXX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9zeW5jLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL3N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY0Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9zeW5jLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9VQVBJX0xJTlVYX1NZTkNfSAorI2RlZmluZSBfVUFQSV9MSU5VWF9TWU5DX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIC0gZGF0YSBwYXNzZWQgdG8gbWVyZ2UgaW9jdGwKKyAqIEBmZDI6CWZpbGUgZGVzY3JpcHRvciBvZiBzZWNvbmQgZmVuY2UKKyAqIEBuYW1lOgluYW1lIG9mIG5ldyBmZW5jZQorICogQGZlbmNlOglyZXR1cm5zIHRoZSBmZCBvZiB0aGUgbmV3IGZlbmNlIHRvIHVzZXJzcGFjZQorICovCitzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhIHsKKwlfX3MzMglmZDI7IC8qIGZkIG9mIHNlY29uZCBmZW5jZSAqLworCWNoYXIJbmFtZVszMl07IC8qIG5hbWUgb2YgbmV3IGZlbmNlICovCisJX19zMzIJZmVuY2U7IC8qIGZkIG9uIG5ld2x5IGNyZWF0ZWQgZmVuY2UgKi8KK307CisKKy8qKgorICogc3RydWN0IHN5bmNfcHRfaW5mbyAtIGRldGFpbGVkIHN5bmNfcHQgaW5mb3JtYXRpb24KKyAqIEBsZW46CQlsZW5ndGggb2Ygc3luY19wdF9pbmZvIGluY2x1ZGluZyBhbnkgZHJpdmVyX2RhdGEKKyAqIEBvYmpfbmFtZToJCW5hbWUgb2YgcGFyZW50IHN5bmNfdGltZWxpbmUKKyAqIEBkcml2ZXJfbmFtZToJbmFtZSBvZiBkcml2ZXIgaW1wbGVtZW50aW5nIHRoZSBwYXJlbnQKKyAqIEBzdGF0dXM6CQlzdGF0dXMgb2YgdGhlIHN5bmNfcHQgMDphY3RpdmUgMTpzaWduYWxlZCA8MDplcnJvcgorICogQHRpbWVzdGFtcF9uczoJdGltZXN0YW1wIG9mIHN0YXR1cyBjaGFuZ2UgaW4gbmFub3NlY29uZHMKKyAqIEBkcml2ZXJfZGF0YToJYW55IGRyaXZlciBkZXBlbmRlbnQgZGF0YQorICovCitzdHJ1Y3Qgc3luY19wdF9pbmZvIHsKKwlfX3UzMglsZW47CisJY2hhcglvYmpfbmFtZVszMl07CisJY2hhcglkcml2ZXJfbmFtZVszMl07CisJX19zMzIJc3RhdHVzOworCV9fdTY0CXRpbWVzdGFtcF9uczsKKworCV9fdTgJZHJpdmVyX2RhdGFbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSAtIGRhdGEgcmV0dXJuZWQgZnJvbSBmZW5jZSBpbmZvIGlvY3RsCisgKiBAbGVuOglpb2N0bCBjYWxsZXIgd3JpdGVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXRzIHBhc3NpbmcgaW4uCisgKgkJaW9jdGwgcmV0dXJucyBsZW5ndGggb2Ygc3luY19mZW5jZV9kYXRhIHJldHVybmVkIHRvIHVzZXJzcGFjZQorICoJCWluY2x1ZGluZyBwdF9pbmZvLgorICogQG5hbWU6CW5hbWUgb2YgZmVuY2UKKyAqIEBzdGF0dXM6CXN0YXR1cyBvZiBmZW5jZS4gMTogc2lnbmFsZWQgMDphY3RpdmUgPDA6ZXJyb3IKKyAqIEBwdF9pbmZvOglhIHN5bmNfcHRfaW5mbyBzdHJ1Y3QgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlCisgKi8KK3N0cnVjdCBzeW5jX2ZlbmNlX2luZm9fZGF0YSB7CisJX191MzIJbGVuOworCWNoYXIJbmFtZVszMl07CisJX19zMzIJc3RhdHVzOworCisJX191OAlwdF9pbmZvWzBdOworfTsKKworI2RlZmluZSBTWU5DX0lPQ19NQUdJQwkJJz4nCisKKy8qKgorICogRE9DOiBTWU5DX0lPQ19XQUlUIC0gd2FpdCBmb3IgYSBmZW5jZSB0byBzaWduYWwKKyAqCisgKiBwYXNzIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAgV2FpdHMgaW5kZWZpbml0ZWx5IHRpbWVvdXQgPCAwLgorICovCisjZGVmaW5lIFNZTkNfSU9DX1dBSVQJCV9JT1coU1lOQ19JT0NfTUFHSUMsIDAsIF9fczMyKQorCisvKioKKyAqIERPQzogU1lOQ19JT0NfTUVSR0UgLSBtZXJnZSB0d28gZmVuY2VzCisgKgorICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhLiAgQ3JlYXRlcyBhIG5ldyBmZW5jZSBjb250YWluaW5nIGNvcGllcyBvZgorICogdGhlIHN5bmNfcHRzIGluIGJvdGggdGhlIGNhbGxpbmcgZmQgYW5kIHN5bmNfbWVyZ2VfZGF0YS5mZDIuICBSZXR1cm5zIHRoZQorICogbmV3IGZlbmNlJ3MgZmQgaW4gc3luY19tZXJnZV9kYXRhLmZlbmNlCisgKi8KKyNkZWZpbmUgU1lOQ19JT0NfTUVSR0UJCV9JT1dSKFNZTkNfSU9DX01BR0lDLCAxLCBzdHJ1Y3Qgc3luY19tZXJnZV9kYXRhKQorCisvKioKKyAqIERPQzogU1lOQ19JT0NfRkVOQ0VfSU5GTyAtIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBhIGZlbmNlCisgKgorICogVGFrZXMgYSBzdHJ1Y3Qgc3luY19mZW5jZV9pbmZvX2RhdGEgd2l0aCBleHRyYSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHB0X2luZm8uCisgKiBDYWxsZXIgc2hvdWxkIHdyaXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW50byBsZW4uICBPbiByZXR1cm4sIGxlbiBpcworICogdXBkYXRlZCB0byByZWZsZWN0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzeW5jX2ZlbmNlX2luZm9fZGF0YSBpbmNsdWRpbmcKKyAqIHB0X2luZm8uCisgKgorICogcHRfaW5mbyBpcyBhIGJ1ZmZlciBjb250YWluaW5nIHN5bmNfcHRfaW5mb3MgZm9yIGV2ZXJ5IHN5bmNfcHQgaW4gdGhlIGZlbmNlLgorICogVG8gaXRlcmF0ZSBvdmVyIHRoZSBzeW5jX3B0X2luZm9zLCB1c2UgdGhlIHN5bmNfcHRfaW5mby5sZW4gZmllbGQuCisgKi8KKyNkZWZpbmUgU1lOQ19JT0NfRkVOQ0VfSU5GTwlfSU9XUihTWU5DX0lPQ19NQUdJQywgMixcCisJc3RydWN0IHN5bmNfZmVuY2VfaW5mb19kYXRhKQorCisjZW5kaWYgLyogX1VBUElfTElOVVhfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCmluZGV4IGYwZDZmMGMuLjFiMmQ5ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCkBAIC0zNyw4ICszNywxMCBAQAogCiB1bmlvbiB1X2lwX2FkZHJlc3MgewogCXN0cnVjdCB7Ci0JCVVMT05HIHVsSXB2NEFkZHJbTUFYX0lQX1JBTkdFX0xFTkdUSF07IC8qIFNvdXJjZSBJcCBBZGRyZXNzIFJhbmdlICovCi0JCVVMT05HIHVsSXB2NE1hc2tbTUFYX0lQX1JBTkdFX0xFTkdUSF07IC8qIFNvdXJjZSBJcCBNYXNrIEFkZHJlc3MgUmFuZ2UgKi8KKwkJLyogU291cmNlIElwIEFkZHJlc3MgUmFuZ2UgKi8KKwkJVUxPTkcgdWxJcHY0QWRkcltNQVhfSVBfUkFOR0VfTEVOR1RIXTsKKwkJIC8qIFNvdXJjZSBJcCBNYXNrIEFkZHJlc3MgUmFuZ2UgKi8KKwkJVUxPTkcgdWxJcHY0TWFza1tNQVhfSVBfUkFOR0VfTEVOR1RIXTsKIAl9OwogCXN0cnVjdCB7CiAJCVVMT05HIHVsSXB2NkFkZHJbTUFYX0lQX1JBTkdFX0xFTkdUSCAqIDRdOyAvKiBTb3VyY2UgSXAgQWRkcmVzcyBSYW5nZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYwppbmRleCBmMWI2ZGUwLi5hZTc0OTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYwpAQCAtMTUwLDE1ICsxNTAsMjE0NiBAQAogCXJldHVybiBQa3RMZW47CiB9CiAKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfcmVnX3JlYWRfcHJpdmF0ZSh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX3JkbV9idWZmZXIgc1JkbUJ1ZmZlciA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlQQ0hBUiB0ZW1wX2J1ZmY7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVVJTlQgQnVmZmxlbjsKKwl1MTYgdGVtcF92YWx1ZTsKKwlpbnQgYnl0ZXM7CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBVU0hSVF9NQVggfHwKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQnVmZmxlbiA9IElvQnVmZmVyLk91dHB1dExlbmd0aDsKKwl0ZW1wX3ZhbHVlID0gNCAtIChCdWZmbGVuICUgNCk7CisJQnVmZmxlbiArPSB0ZW1wX3ZhbHVlICUgNDsKKworCXRlbXBfYnVmZiA9IGttYWxsb2MoQnVmZmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZW1wX2J1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJYnl0ZXMgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpc1JkbUJ1ZmZlci5SZWdpc3RlciwKKwkJCShQVUlOVCl0ZW1wX2J1ZmYsIEJ1ZmZsZW4pOworCWlmIChieXRlcyA+IDApIHsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIGJ5dGVzKSkgeworCQkJa2ZyZWUodGVtcF9idWZmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJU3RhdHVzID0gYnl0ZXM7CisJfQorCisJa2ZyZWUodGVtcF9idWZmKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3JlZ193cml0ZV9wcml2YXRlKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fd3JtX2J1ZmZlciBzV3JtQnVmZmVyID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVJTlQgdWlUZW1wVmFyID0gMDsKKwlJTlQgU3RhdHVzOworCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJdWlUZW1wVmFyID0gc1dybUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKKwlpZiAoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgorCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJU3RhdHVzID0gd3JtYWx0KEFkYXB0ZXIsIChVSU5UKXNXcm1CdWZmZXIuUmVnaXN0ZXIsCisJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLCBzaXplb2YoVUxPTkcpKTsKKworCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsICJXUk0gRG9uZVxuIik7CisJfSBlbHNlIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsICJXUk0gRmFpbGVkXG4iKTsKKwkJU3RhdHVzID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9lZXByb21fcmVnX3JlYWQodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9yZG1fYnVmZmVyIHNSZG1CdWZmZXIgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJUENIQVIgdGVtcF9idWZmID0gTlVMTDsKKwlVSU5UIHVpVGVtcFZhciA9IDA7CisJSU5UIFN0YXR1czsKKwlpbnQgYnl0ZXM7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFJkbXNcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBVU0hSVF9NQVggfHwKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID09IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGVtcF9idWZmID0ga21hbGxvYyhJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghdGVtcF9idWZmKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlpZiAoKCgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8CisJCSgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJSRE0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKKwkJCQkoaW50KXNSZG1CdWZmZXIuUmVnaXN0ZXIpOworCisJCWtmcmVlKHRlbXBfYnVmZik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVpVGVtcFZhciA9IHNSZG1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7CisJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzUmRtQnVmZmVyLlJlZ2lzdGVyLAorCQkJICAgICAgIChQVUlOVCl0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7CisKKwlpZiAoYnl0ZXMgPiAwKSB7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBieXRlcykpIHsKKwkJCWtmcmVlKHRlbXBfYnVmZik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCVN0YXR1cyA9IGJ5dGVzOworCX0KKworCWtmcmVlKHRlbXBfYnVmZik7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9lZXByb21fcmVnX3dyaXRlKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBVSU5UIGNtZCkKK3sKKwlzdHJ1Y3QgYmNtX3dybV9idWZmZXIgc1dybUJ1ZmZlciA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHVpVGVtcFZhciA9IDA7CisJSU5UIFN0YXR1czsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiRGV2aWNlIGluIElkbGUgTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzV3JtQnVmZmVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKCgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8CisJCSgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKKwkJCQkoaW50KXNXcm1CdWZmZXIuUmVnaXN0ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1aVRlbXBWYXIgPSBzV3JtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCisJCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKKwkJCShjbWQgPT0gSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAorCQkJCShQVUlOVClzV3JtQnVmZmVyLkRhdGEsCisJCQkJc1dybUJ1ZmZlci5MZW5ndGgpOworCisJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwgIldSTSBEb25lXG4iKTsKKwl9IGVsc2UgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwgIldSTSBGYWlsZWRcbiIpOworCQlTdGF0dXMgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dwaW9fc2V0X3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9ncGlvX2luZm8gZ3Bpb19pbmZvID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKKwlVSU5UIHZhbHVlID0gMDsKKwlVSU5UIHVpQml0ID0gMDsKKwlVSU5UIHVpT3BlcmF0aW9uID0gMDsKKwlJTlQgU3RhdHVzOworCWludCBieXRlczsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQkJREJHX0xWTF9BTEwsCisJCQkJIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7CisJdWlPcGVyYXRpb24gPSBncGlvX2luZm8udWlHcGlvVmFsdWU7CisJdmFsdWUgPSAoMTw8dWlCaXQpOworCisJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwgdmFsdWUpID09IGZhbHNlKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTEVEICEhISIsCisJCQkJdmFsdWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZXQgLSBzZXR0aW5nIDEgKi8KKwlpZiAodWlPcGVyYXRpb24pIHsKKwkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCQlCQ01fR1BJT19PVVRQVVRfU0VUX1JFRywKKwkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOworCisJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIlNldCB0aGUgR1BJTyBiaXRcbiIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCQkiRmFpbGVkIHRvIHNldCB0aGUgJWR0aCBHUElPXG4iLAorCQkJCQl1aUJpdCk7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisJfSBlbHNlIHsKKwkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCQlCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRywKKwkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOworCisJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIlNldCB0aGUgR1BJTyBiaXRcbiIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCQkiRmFpbGVkIHRvIGNsZWFyIHRoZSAlZHRoIEdQSU9cbiIsCisJCQkJCXVpQml0KTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KKwl9CisKKwlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fTU9ERV9SRUdJU1RFUiwKKwkJCSAgICAgICAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOworCWlmIChieXRlcyA8IDApIHsKKwkJU3RhdHVzID0gYnl0ZXM7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiR1BJT19NT0RFX1JFR0lTVEVSIHJlYWQgZmFpbGVkIik7CisJCXJldHVybiBTdGF0dXM7CisJfSBlbHNlIHsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJLyogU2V0IHRoZSBncGlvIG1vZGUgcmVnaXN0ZXIgdG8gb3V0cHV0ICovCisJKihVSU5UICopdWNSZXNldFZhbHVlIHw9ICgxPDx1aUJpdCk7CisJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgR1BJT19NT0RFX1JFR0lTVEVSLAorCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7CisKKwlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJTZXQgdGhlIEdQSU8gdG8gb3V0cHV0IE1vZGVcbiIpOworCX0gZWxzZSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJGYWlsZWQgdG8gcHV0IEdQSU8gaW4gT3V0cHV0IE1vZGVcbiIpOworCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfbGVkX3RocmVhZF9zdGF0ZV9jaGFuZ2VfcmVxKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fdXNlcl90aHJlYWRfcmVxIHRocmVhZFJlcSA9IHswfTsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJVc2VyIG1hZGUgTEVEIHRocmVhZCBJbkFjdGl2ZSIpOworCisJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQlEQkdfTFZMX0FMTCwKKwkJCQkiR1BJTyBDYW4ndCBiZSBzZXQvY2xlYXIgaW4gTG93IHBvd2VyIE1vZGUiKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHRocmVhZFJlcSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogaWYgTEVEIHRocmVhZCBpcyBydW5uaW5nKEFjdGl2ZWx5IG9yIEluYWN0aXZlbHkpCisJICogc2V0IGl0IHN0YXRlIHRvIG1ha2UgaW5hY3RpdmUKKwkgKi8KKwlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcpIHsKKwkJaWYgKHRocmVhZFJlcS5UaHJlYWRTdGF0ZSA9PSBMRURfVEhSRUFEX0FDVElWQVRJT05fUkVRKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJBY3RpdmF0aW5nIHRocmVhZCByZXEiKTsKKwkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTEVEX1RIUkVBRF9BQ1RJVkU7CisJCX0gZWxzZSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJEZUFjdGl2YXRpbmcgVGhyZWFkIHJlcS4uLi4uIik7CisJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExFRF9USFJFQURfSU5BQ1RJVkU7CisJCX0KKworCQkvKiBzaWduYWwgdGhyZWFkLiAqLworCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ3Bpb19zdGF0dXNfcmVxdWVzdCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2dwaW9faW5mbyBncGlvX2luZm8gPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUxPTkcgdWlCaXQgPSAwOworCVVDSEFSIHVjUmVhZFs0XTsKKwlJTlQgU3RhdHVzOworCWludCBieXRlczsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVpQml0ID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKKworCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KKwlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLAorCQkJCShQVUlOVCl1Y1JlYWQsIHNpemVvZihVSU5UKSk7CisKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCVN0YXR1cyA9IGJ5dGVzOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJSRE0gRmFpbGVkXG4iKTsKKwkJcmV0dXJuIFN0YXR1czsKKwl9IGVsc2UgeworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9ncGlvX211bHRpX3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9ncGlvX211bHRpX2luZm8gZ3Bpb19tdWx0aV9pbmZvW01BWF9JRFhdOworCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICpwZ3Bpb19tdWx0aV9pbmZvID0KKwkJKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICopZ3Bpb19tdWx0aV9pbmZvOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJaW50IGJ5dGVzOworCisJbWVtc2V0KHBncGlvX211bHRpX2luZm8sIDAsIE1BWF9JRFggKiBzaXplb2Yoc3RydWN0IGJjbV9ncGlvX211bHRpX2luZm8pKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfaW5mbykpCisJCUlvQnVmZmVyLk91dHB1dExlbmd0aCA9IHNpemVvZihncGlvX211bHRpX2luZm8pOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwKKwkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spID09IGZhbHNlKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTlZNIExFRCBiaXQgbWFwPDB4JVg+ISEhIiwKKwkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaywKKwkJCQlBZGFwdGVyLT5ncGlvQml0TWFwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLworCWlmICgocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spICYKKwkJKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9Db21tYW5kKSkgeworCQkvKiBTZXQgMSdzIGluIEdQSU8gT1VUUFVUIFJFR0lTVEVSICovCisJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9ICBwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWU7CisKKwkJaWYgKCooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUpCisJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCUJDTV9HUElPX09VVFBVVF9TRVRfUkVHLAorCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVTE9ORykpOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIldSTSB0byBCQ01fR1BJT19PVVRQVVRfU0VUX1JFRyBGYWlsZWQuIik7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisKKwkJLyogQ2xlYXIgdG8gMCdzIGluIEdQSU8gT1VUUFVUIFJFR0lTVEVSICovCisJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9IChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCisJCQkofihwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUpKSk7CisKKwkJaWYgKCooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUpCisJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAorCQkJCUJDTV9HUElPX09VVFBVVF9DTFJfUkVHLCAoUFVJTlQpdWNSZXNldFZhbHVlLAorCQkJCXNpemVvZihVTE9ORykpOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJXUk0gdG8gQkNNX0dQSU9fT1VUUFVUX0NMUl9SRUcgRmFpbGVkLiIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCX0KKworCWlmIChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaykgeworCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLAorCQkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKKworCQlpZiAoYnl0ZXMgPCAwKSB7CisJCQlTdGF0dXMgPSBieXRlczsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJSRE0gdG8gR1BJT19QSU5fU1RBVEVfUkVHSVNURVIgRmFpbGVkLiIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfSBlbHNlIHsKKwkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQl9CisKKwkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlID0gKCooVUlOVCAqKXVjUmVzZXRWYWx1ZSAmCisJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayk7CisJfQorCisJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfaW5mbywKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmFpbGVkIHdoaWxlIGNvcHlpbmcgQ29udGVudCB0byBJT0J1ZmVyIGZvciB1c2VyIHNwYWNlIGVycjolZCIsCisJCQlTdGF0dXMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9ncGlvX21vZGVfcmVxdWVzdCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfbW9kZSBncGlvX211bHRpX21vZGVbTUFYX0lEWF07CisJc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKnBncGlvX211bHRpX21vZGUgPQorCQkoc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKilncGlvX211bHRpX21vZGU7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJVUNIQVIgdWNSZXNldFZhbHVlWzRdOworCUlOVCBTdGF0dXM7CisJaW50IGJ5dGVzOworCisJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19tdWx0aV9tb2RlKSkKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID0gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fTU9ERV9SRUdJU1RFUiwKKwkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKKworCWlmIChieXRlcyA8IDApIHsKKwkJU3RhdHVzID0gYnl0ZXM7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiUmVhZCBvZiBHUElPX01PREVfUkVHSVNURVIgZmFpbGVkIik7CisJCXJldHVybiBTdGF0dXM7CisJfSBlbHNlIHsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJLyogVmFsaWRhdGluZyB0aGUgcmVxdWVzdCAqLworCWlmIChJc1JlcUdwaW9Jc0xlZEluTlZNKEFkYXB0ZXIsCisJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKSA9PSBmYWxzZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLAorCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrLAorCQkJCUFkYXB0ZXItPmdwaW9CaXRNYXApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spIHsKKwkJLyogd3JpdGUgYWxsIE9VVCdzICgxJ3MpICovCisJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgfD0gKHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlICYKKwkJCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spOworCisJCS8qIHdyaXRlIGFsbCBJTidzICgwJ3MpICovCisJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgJj0gfigofnBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlKSAmCisJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKKworCQkvKiBDdXJyZW50bHkgaW1wbGVtZW50ZWQgcmV0dXJuIHRoZSBtb2RlcyBvZiBhbGwgR1BJTydzCisJCSAqIGVsc2UgbmVlZHMgdG8gYml0IEFORCB3aXRoICBtYXNrCisJCSAqLworCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTW9kZSA9ICooVUlOVCAqKXVjUmVzZXRWYWx1ZTsKKworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIsCisJCQkoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKKwkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsCisJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRG9uZSIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRmFpbGVkIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGlmIHVpR1BJT01hc2sgaXMgMCB0aGVuIHJldHVybiBtb2RlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gKi8KKwkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgPSAqKFVJTlQgKil1Y1Jlc2V0VmFsdWU7CisJfQorCisJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfbW9kZSwKKwkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmFpbGVkIHdoaWxlIGNvcHlpbmcgQ29udGVudCB0byBJT0J1ZmVyIGZvciB1c2VyIHNwYWNlIGVycjolZCIsCisJCQlTdGF0dXMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9taXNjX3JlcXVlc3Qodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJUFZPSUQgcHZCdWZmZXIgPSBOVUxMOworCUlOVCBTdGF0dXM7CisKKwkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9saW5rX3JlcXVlc3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IE1BWF9DTlRMX1BLVF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQkgICAgICAgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOworCWlmIChJU19FUlIocHZCdWZmZXIpKQorCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7CisKKwlkb3duKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKKwlTdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUsCisJCSFBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlLAorCQkoMSAqIEhaKSk7CisJaWYgKFN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCisJCWdvdG8gY250cmxFbmQ7CisKKwlpZiAoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIlByZXBhcmluZyBJZGxlIE1vZGUgaXMgc3RpbGwgVHJ1ZSAtIEhlbmNlIFJlamVjdGluZyBjb250cm9sIG1lc3NhZ2VcbiIpOworCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwkJZ290byBjbnRybEVuZDsKKwl9CisJU3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpcHZCdWZmZXIpOworCitjbnRybEVuZDoKKwl1cCgmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CisJa2ZyZWUocHZCdWZmZXIpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkX3N0YXJ0KAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCUlOVCBTdGF0dXM7CisKKwlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIklPQ1RMX0JDTV9DSElQX1JFU0VUIG5vdCBhbGxvd2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJIlN0YXJ0aW5nIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBQSUQgPTB4JXghISEhXG4iLCBjdXJyZW50LT5waWQpOworCisJaWYgKGRvd25fdHJ5bG9jaygmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlBZGFwdGVyLT5iQmluRG93bmxvYWRlZCA9IGZhbHNlOworCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkID0gY3VycmVudC0+cGlkOworCUFkYXB0ZXItPmJDZmdEb3dubG9hZGVkID0gZmFsc2U7CisJQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9IGZhbHNlOworCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOworCVN0YXR1cyA9IHJlc2V0X2NhcmRfcHJvYyhBZGFwdGVyKTsKKwlpZiAoU3RhdHVzKSB7CisJCXByX2VycihQRlggIiVzOiByZXNldF9jYXJkX3Byb2MgRmFpbGVkIVxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiBTdGF0dXM7CisJfQorCW1kZWxheSgxMCk7CisKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWQodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9maXJtd2FyZV9pbmZvICpwc0Z3SW5mbyA9IE5VTEw7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1czsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCSJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKKworCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJJbnZhbGlkIHdheSB0byBkb3dubG9hZCBidWZmZXIuIFVzZSBTdGFydCBhbmQgdGhlbiBjYWxsIHRoaXMhISFcbiIpOworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKSB7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJMZW5ndGggZm9yIEZXIERMRCBpcyA6ICVseFxuIiwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOworCisJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBiY21fZmlybXdhcmVfaW5mbykpIHsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwc0Z3SW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwc0Z3SW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcHNGd0luZm8pIHsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIocHNGd0luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpIHsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlrZnJlZShwc0Z3SW5mbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICghcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzIHx8CisJCShwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGggPT0gMCkpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJTb21ldGhpbmcgZWxzZSBpcyB3cm9uZyAlbHVcbiIsCisJCQkJcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoKTsKKwkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQlrZnJlZShwc0Z3SW5mbyk7CisJCVN0YXR1cyA9IC1FSU5WQUw7CisJCXJldHVybiBTdGF0dXM7CisJfQorCisJU3RhdHVzID0gYmNtX2lvY3RsX2Z3X2Rvd25sb2FkKEFkYXB0ZXIsIHBzRndJbmZvKTsKKworCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MgPT0gQ09ORklHX0JFR0lOX0FERFIpCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJJT0NUTDogQ29uZmlndXJhdGlvbiBGaWxlIFVwbG9hZCBGYWlsZWRcbiIpOworCQllbHNlCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJJT0NUTDogRmlybXdhcmUgRmlsZSBVcGxvYWQgRmFpbGVkXG4iKTsKKworCQkvKiB1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7ICovCisKKwkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYKKwkJCUJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKKwkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0lOSVQ7CisJCQlBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9IGZhbHNlOworCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKKwkJfQorCX0KKworCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIklPQ1RMOiBGaXJtd2FyZSBGaWxlIFVwbG9hZGVkXG4iKTsKKwlrZnJlZShwc0Z3SW5mbyk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWRfc3RvcCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlJTlQgU3RhdHVzOworCWludCB0aW1lb3V0ID0gMDsKKworCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgeworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkZXIGRvd25sb2FkIGJsb2NrZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOworCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCUFkYXB0ZXItPmJCaW5Eb3dubG9hZGVkID0gVFJVRTsKKwlBZGFwdGVyLT5iQ2ZnRG93bmxvYWRlZCA9IFRSVUU7CisJYXRvbWljX3NldCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MsIDApOworCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MgPSAwOworCUFkYXB0ZXItPmRvd25sb2FkRERSID0gMDsKKworCS8qIHNldHRpbmcgdGhlIE1pcHMgdG8gUnVuICovCisJU3RhdHVzID0gcnVuX2NhcmRfcHJvYyhBZGFwdGVyKTsKKworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGaXJtIERvd25sb2FkIEZhaWxlZFxuIik7CisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gU3RhdHVzOworCX0gZWxzZSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJCURCR19MVkxfQUxMLCAiRmlybSBEb3dubG9hZCBPdmVyLi4uXG4iKTsKKwl9CisKKwltZGVsYXkoMTApOworCisJLyogV2FpdCBmb3IgTWFpbEJveCBJbnRlcnJ1cHQgKi8KKwlpZiAoU3RhcnRJbnRlcnJ1cHRVcmIoKHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKilBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKQorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIlVuYWJsZSB0byBzZW5kIGludGVycnVwdC4uLlxuIik7CisKKwl0aW1lb3V0ID0gNSpIWjsKKwlBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUgPSBmYWxzZTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAorCQkJQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLCB0aW1lb3V0KTsKKwlBZGFwdGVyLT5md19kb3dubG9hZF9wcm9jZXNzX3BpZCA9IElOVkFMSURfUElEOworCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBUUlVFOworCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLCAwKTsKKwlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzID0gMDsKKwlBZGFwdGVyLT5QcmV2TnVtUmVjdkRlc2NzID0gMDsKKwlhdG9taWNfc2V0KCZBZGFwdGVyLT5jbnRybHBrdENudCwgMCk7CisJQWRhcHRlci0+TGlua1VwU3RhdHVzID0gMDsKKwlBZGFwdGVyLT5MaW5rU3RhdHVzID0gMDsKKworCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmCisJCUJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKKwkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBGV19ET1dOTE9BRF9ET05FOworCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOworCX0KKworCWlmICghdGltZW91dCkKKwkJU3RhdHVzID0gLUVOT0RFVjsKKworCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9jaGlwX3Jlc2V0KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCUlOVCBTdGF0dXM7CisJSU5UIE5WTUFjY2VzczsKKworCU5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJaWYgKE5WTUFjY2VzcykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIiBJT0NUTF9CQ01fQ0hJUF9SRVNFVCBub3QgYWxsb3dlZCBhcyBFRVBST00gUmVhZC9Xcml0ZSBpcyBpbiBwcm9ncmVzc1xuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWRvd24oJkFkYXB0ZXItPlJ4QXBwQ29udHJvbFF1ZXVlbG9jayk7CisJU3RhdHVzID0gcmVzZXRfY2FyZF9wcm9jKEFkYXB0ZXIpOworCWZsdXNoQWxsQXBwUSgpOworCXVwKCZBZGFwdGVyLT5SeEFwcENvbnRyb2xRdWV1ZWxvY2spOworCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwlSZXNldENvdW50ZXJzKEFkYXB0ZXIpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfcW9zX3RocmVzaG9sZChVTE9ORyBhcmcsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJVVNIT1JUIHVpTG9vcEluZGV4OworCisJZm9yICh1aUxvb3BJbmRleCA9IDA7IHVpTG9vcEluZGV4IDwgTk9fT0ZfUVVFVUVTOyB1aUxvb3BJbmRleCsrKSB7CisJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUaHJlc2hvbGQsCisJCQkJKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfc3dpdGNoX3RyYW5zZmVyX21vZGUodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJVUlOVCB1aURhdGEgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1aURhdGEsIGFyZ3AsIHNpemVvZihVSU5UKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHVpRGF0YSkgeworCQkvKiBBbGxvdyBBbGwgUGFja2V0cyAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOiBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFXG4iKTsKKwkJCUFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9IEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREU7CisJfSBlbHNlIHsKKwkJLyogQWxsb3cgSVAgb25seSBQYWNrZXRzICovCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IElQX1BBQ0tFVF9PTkxZX01PREVcbiIpOworCQlBZGFwdGVyLT5UcmFuc2Zlck1vZGUgPSBJUF9QQUNLRVRfT05MWV9NT0RFOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2RyaXZlcl92ZXJzaW9uKHZvaWQgX191c2VyICphcmdwKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCXVsb25nIGxlbjsKKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxlbiA9IG1pbl90KHVsb25nLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHN0cmxlbihEUlZfVkVSU0lPTikgKyAxKTsKKworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBEUlZfVkVSU0lPTiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2N1cnJlbnRfc3RhdHVzKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fbGlua19zdGF0ZSBsaW5rX3N0YXRlOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJjb3B5X2Zyb21fdXNlciBmYWlsZWQuLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKGxpbmtfc3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbGlua19zdGF0ZSwgMCwgc2l6ZW9mKGxpbmtfc3RhdGUpKTsKKwlsaW5rX3N0YXRlLmJJZGxlTW9kZSA9IEFkYXB0ZXItPklkbGVNb2RlOworCWxpbmtfc3RhdGUuYlNodXRkb3duTW9kZSA9IEFkYXB0ZXItPmJTaHV0U3RhdHVzOworCWxpbmtfc3RhdGUudWNMaW5rU3RhdHVzID0gQWRhcHRlci0+TGlua1N0YXR1czsKKworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmbGlua19zdGF0ZSwgbWluX3Qoc2l6ZV90LAorCQlzaXplb2YobGlua19zdGF0ZSksIElvQnVmZmVyLk91dHB1dExlbmd0aCkpKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weV90b191c2VyIEZhaWxlZC4uXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3NldF9tYWNfdHJhY2luZyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHRyYWNpbmdfZmxhZzsKKworCS8qIGNvcHkgaW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdHJhY2luZ19mbGFnLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVJTlQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodHJhY2luZ19mbGFnKQorCQlBZGFwdGVyLT5wVGFyYW5ncy0+TWFjVHJhY2luZ0VuYWJsZWQgPSBUUlVFOworCWVsc2UKKwkJQWRhcHRlci0+cFRhcmFuZ3MtPk1hY1RyYWNpbmdFbmFibGVkID0gZmFsc2U7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X2RzeF9pbmRpY2F0aW9uKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVVMT05HIHVsU0ZJZCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0KSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIk1pc21hdGNoIHJlcTogJWx4IG5lZWRlZCBpcyA9MHglenghISEiLAorCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmdWxTRklkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVsU0ZJZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIkdldCBEU1ggRGF0YSBTRiBJRCBpcyA9JWx4XG4iLCB1bFNGSWQpOworCWdldF9kc3hfc2ZfZGF0YV90b19hcHBsaWNhdGlvbihBZGFwdGVyLCB1bFNGSWQsIElvQnVmZmVyLk91dHB1dEJ1ZmZlcik7CisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2dldF9ob3N0X21pYnModm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHN0cnVjdCBiY21fdGFyYW5nX2RhdGEgKnBUYXJhbmcpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVBWT0lEIHRlbXBfYnVmZjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkxlbmd0aCBDaGVjayBmYWlsZWQgJWx1ICV6ZFxuIiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZJWE1FOiBIT1NUX1NUQVRTIGFyZSB0b28gYmlnIGZvciBrbWFsbG9jICgxMjIwNDgpISAqLworCXRlbXBfYnVmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZW1wX2J1ZmYpCisJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKworCVN0YXR1cyA9IFByb2Nlc3NHZXRIb3N0TWlicyhBZGFwdGVyLCB0ZW1wX2J1ZmYpOworCUdldERyb3BwZWRBcHBDbnRybFBrdE1pYnModGVtcF9idWZmLCBwVGFyYW5nKTsKKworCWlmIChTdGF0dXMgIT0gU1RBVFVTX0ZBSUxVUkUpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwKKwkJCXNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicykpKSB7CisJCQlrZnJlZSh0ZW1wX2J1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlrZnJlZSh0ZW1wX2J1ZmYpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfYnVsa193cm0odm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIFVJTlQgY21kKQoreworCXN0cnVjdCBiY21fYnVsa193cm1fYnVmZmVyICpwQnVsa0J1ZmZlcjsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHVpVGVtcFZhciA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVBDSEFSIHB2QnVmZmVyID0gTlVMTDsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRGV2aWNlIGluIElkbGUvU2h1dGRvd24gTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA8IHNpemVvZihVTE9ORykgKiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQkgICAgICAgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOworCWlmIChJU19FUlIocHZCdWZmZXIpKQorCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7CisKKwlwQnVsa0J1ZmZlciA9IChzdHJ1Y3QgYmNtX2J1bGtfd3JtX2J1ZmZlciAqKXB2QnVmZmVyOworCisJaWYgKCgoVUxPTkcpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCB8fAorCQkoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MykpIHsKKwkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsCisJCQkoaW50KXBCdWxrQnVmZmVyLT5SZWdpc3Rlcik7CisJCWtmcmVlKHB2QnVmZmVyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdWlUZW1wVmFyID0gcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpJlZTR19NT0RFKSAmJgorCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKKwkJKGNtZCA9PSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEUpKSB7CisKKwkJa2ZyZWUocHZCdWZmZXIpOworCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHBCdWxrQnVmZmVyLT5Td2FwRW5kaWFuID09IGZhbHNlKQorCQlTdGF0dXMgPSB3cm1XaXRoTG9jayhBZGFwdGVyLCAoVUlOVClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIsCisJCQkoUENIQVIpcEJ1bGtCdWZmZXItPlZhbHVlcywKKwkJCUlvQnVmZmVyLklucHV0TGVuZ3RoIC0gMipzaXplb2YoVUxPTkcpKTsKKwllbHNlCisJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXBCdWxrQnVmZmVyLT5SZWdpc3RlciwKKwkJCShQVUlOVClwQnVsa0J1ZmZlci0+VmFsdWVzLAorCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGggLSAyKnNpemVvZihVTE9ORykpOworCisJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIldSTSBGYWlsZWRcbiIpOworCisJa2ZyZWUocHZCdWZmZXIpOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZ2V0X252bV9zaXplKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9FRVBST00gfHwgQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlOVk1EU0RTaXplLAorCQkJc2l6ZW9mKFVJTlQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9jYWxfaW5pdCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlVSU5UIHVpU2VjdG9yU2l6ZSA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCisJaWYgKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpU2VjdG9yU2l6ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQlzaXplb2YoVUlOVCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKCh1aVNlY3RvclNpemUgPCBNSU5fU0VDVE9SX1NJWkUpIHx8CisJCQkodWlTZWN0b3JTaXplID4gTUFYX1NFQ1RPUl9TSVpFKSkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCQkJJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgc2l6ZW9mKFVJTlQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKKwkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKKwkJCQkJJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgc2l6ZW9mKFVJTlQpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9IGVsc2UgeworCQkJCWlmICgoVFJVRSA9PSBBZGFwdGVyLT5iU2h1dFN0YXR1cykgfHwKKwkJCQkJKFRSVUUgPT0gQWRhcHRlci0+SWRsZU1vZGUpKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLAorCQkJCQkJREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCQl9CisKKwkJCQlBZGFwdGVyLT51aVNlY3RvclNpemUgPSB1aVNlY3RvclNpemU7CisJCQkJQmNtVXBkYXRlU2VjdG9yU2l6ZShBZGFwdGVyLAorCQkJCQlBZGFwdGVyLT51aVNlY3RvclNpemUpOworCQkJfQorCQl9CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCX0KKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX3NldF9kZWJ1Zyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKyNpZmRlZiBERUJVRworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCXN0cnVjdCBiY21fdXNlcl9kZWJ1Z19zdGF0ZSBzVXNlckRlYnVnU3RhdGU7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJbiBTRVRfREVCVUcgaW9jdGxcbiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc1VzZXJEZWJ1Z1N0YXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fdXNlcl9kZWJ1Z19zdGF0ZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIklPQ1RMX0JDTV9TRVRfREVCVUc6IE9uT2ZmPSVkIFR5cGUgPSAweCV4ICIsCisJCQlzVXNlckRlYnVnU3RhdGUuT25PZmYsIHNVc2VyRGVidWdTdGF0ZS5UeXBlKTsKKwkvKiBzVXNlckRlYnVnU3RhdGUuU3VidHlwZSA8PD0gMTsgKi8KKwlzVXNlckRlYnVnU3RhdGUuU3VidHlwZSA9IDEgPDwgc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGU7CisJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCSJhY3R1YWwgU3VidHlwZT0weCV4XG4iLCBzVXNlckRlYnVnU3RhdGUuU3VidHlwZSk7CisKKwkvKiBVcGRhdGUgbmV3ICdEZWJ1Z1N0YXRlJyBpbiB0aGUgQWRhcHRlciAqLworCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS50eXBlIHw9IHNVc2VyRGVidWdTdGF0ZS5UeXBlOworCS8qIFN1YnR5cGU6IEEgYml0bWFwIG9mIDMyIGJpdHMgZm9yIFN1YnR5cGUgcGVyIFR5cGUuCisJICogVmFsaWQgaW5kZXhlcyBpbiAnc3VidHlwZScgYXJyYXk6IDEsMiw0LDgKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHZhbGlkIFR5cGUgdmFsdWVzLiBIZW5jZSB3ZSBjYW4gdXNlIHRoZSAnVHlwZScgZmllbGQKKwkgKiBhcyB0aGUgaW5kZXggdmFsdWUsIGlnbm9yaW5nIHRoZSBhcnJheSBlbnRyaWVzIDAsMyw1LDYsNyAhCisJICovCisJaWYgKHNVc2VyRGVidWdTdGF0ZS5Pbk9mZikKKwkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbc1VzZXJEZWJ1Z1N0YXRlLlR5cGVdIHw9CisJCQlzVXNlckRlYnVnU3RhdGUuU3VidHlwZTsKKwllbHNlCisJCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW3NVc2VyRGVidWdTdGF0ZS5UeXBlXSAmPQorCQkJfnNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOworCisJQkNNX1NIT1dfREVCVUdfQklUTUFQKEFkYXB0ZXIpOworI2VuZGlmCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX252bV9ydyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgVUlOVCBjbWQpCit7CisJc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlIHN0TlZNUmVhZFdyaXRlOworCXN0cnVjdCB0aW1ldmFsIHR2MCwgdHYxOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVBVQ0hBUiBwUmVhZERhdGEgPSBOVUxMOworCVVMT05HIHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgPSAwOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworCW1lbXNldCgmdHYwLCAwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwltZW1zZXQoJnR2MSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisJaWYgKChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpICYmCisJCShBZGFwdGVyLT51aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uID09IDApKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiVGhlIEZsYXNoIENvbnRyb2wgU2VjdGlvbiBpcyBDb3JydXB0ZWQuIEhlbmNlIFJlamVjdGlvbiBvbiBOVk0gUmVhZC9Xcml0ZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKKwkJaWYgKChBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDApICYmCisJCQkoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QxKSAmJgorCQkJKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMikpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiTm8gRFNEIGlzIGFjdGl2ZS4uaGVuY2UgTlZNIENvbW1hbmQgaXMgYmxvY2tlZCIpOworCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCQl9CisJfQorCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdE5WTVJlYWRXcml0ZSwKKwkJCQkoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkgPworCQkJCUlvQnVmZmVyLk91dHB1dEJ1ZmZlciA6IElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJCXNpemVvZihzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqIERlbnkgdGhlIGFjY2VzcyBpZiB0aGUgb2Zmc2V0IGNyb3NzZXMgdGhlIGNhbCBhcmVhIGxpbWl0LgorCSAqLworCWlmIChzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzID4gQWRhcHRlci0+dWlOVk1EU0RTaXplKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlpZiAoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgPgorCQlBZGFwdGVyLT51aU5WTURTRFNpemUgLSBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwlwUmVhZERhdGEgPSBtZW1kdXBfdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLAorCQkJCXN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpOworCWlmIChJU19FUlIocFJlYWREYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIocFJlYWREYXRhKTsKKworCWRvX2dldHRpbWVvZmRheSgmdHYwKTsKKwlpZiAoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkgeworCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLAorCQkJCURCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCisJCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkRGF0YSwKKwkJCXN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0LCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLCBwUmVhZERhdGEsCisJCQlzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkgeworCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQlEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwUmVhZERhdGEpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQlBZGFwdGVyLT5iSGVhZGVyQ2hhbmdlQWxsb3dlZCA9IFRSVUU7CisJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKKwkJCS8qCisJCQkgKiBOZXcgUmVxdWlyZW1lbnQ6LQorCQkJICogRFNEIHNlY3Rpb24gdXBkYXRpb24gd2lsbCBiZSBhbGxvd2VkIGluIHR3byBjYXNlOi0KKwkJCSAqIDEuICBpZiBEU0Qgc2lnIGlzIHByZXNlbnQgaW4gRFNEIGhlYWRlciBtZWFucyBkb25nbGUKKwkJCSAqIGlzIG9rIGFuZCB1cGRhdGlvbiBpcyBmcnVpdGZ1bGwKKwkJCSAqIDIuICBpZiBwb2ludCAxIGZhaWxlcyB0aGVuIHVzZXIgYnVmZiBzaG91bGQgaGF2ZQorCQkJICogRFNEIHNpZy4gdGhpcyBwb2ludCBlbnN1cmVzIHRoYXQgaWYgZG9uZ2xlIGlzCisJCQkgKiBjb3JydXB0ZWQgdGhlbiB1c2VyIHNwYWNlIHByb2dyYW0gZmlyc3QgbW9kaWZ5CisJCQkgKiB0aGUgRFNEIGhlYWRlciB3aXRoIHZhbGlkIERTRCBzaWcgc28gdGhhdCB0aGlzCisJCQkgKiBhcyB3ZWxsIGFzIGZ1cnRoZXIgd3JpdGUgbWF5IGJlIHdvcnRod2hpbGUuCisJCQkgKgorCQkJICogVGhpcyByZXN0cmljdGlvbiBoYXMgYmVlbiBwdXQgYXNzdW1pbmcgdGhhdAorCQkJICogaWYgRFNEIHNpZyBpcyBjb3JydXB0ZWQsIERTRCBkYXRhIHdvbid0IGJlCisJCQkgKiBjb25zaWRlcmVkIHZhbGlkLgorCQkJICovCisKKwkJCVN0YXR1cyA9IEJjbUZsYXNoMnhDb3JydXB0U2lnKEFkYXB0ZXIsCisJCQkJQWRhcHRlci0+ZUFjdGl2ZURTRCk7CisJCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKCgoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgKyBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSAhPQorCQkJCQlBZGFwdGVyLT51aU5WTURTRFNpemUpIHx8CisJCQkJCShzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzIDwgU0lHTkFUVVJFX1NJWkUpKSB7CisKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJEU0QgU2lnIGlzIHByZXNlbnQgbmVpdGhlciBpbiBGbGFzaCBub3IgVXNlciBwcm92aWRlZCBJbnB1dC4uIik7CisJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJcmV0dXJuIFN0YXR1czsKKwkJCQl9CisKKwkJCQl1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gbnRvaGwoKihQVUlOVCkocFJlYWREYXRhICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyAtIFNJR05BVFVSRV9TSVpFKSk7CisJCQkJaWYgKHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgIT0KKwkJCQkJRFNEX0lNQUdFX01BR0lDX05VTUJFUikgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCQkiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOworCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQkJCXJldHVybiBTdGF0dXM7CisJCQkJfQorCQkJfQorCQl9CisKKwkJU3RhdHVzID0gQmVjZWVtTlZNV3JpdGUoQWRhcHRlciwgKFBVSU5UKXBSZWFkRGF0YSwKKwkJCXN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0LCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzLAorCQkJc3ROVk1SZWFkV3JpdGUuYlZlcmlmeSk7CisJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpCisJCQlCY21GbGFzaDJ4V3JpdGVTaWcoQWRhcHRlciwgQWRhcHRlci0+ZUFjdGl2ZURTRCk7CisKKwkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBmYWxzZTsKKworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KKwl9CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2MSk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiIHRpbWV0YWtlbiBieSBXcml0ZS9yZWFkIDolbGQgbXNlY1xuIiwKKwkJKHR2MS50dl9zZWMgLSB0djAudHZfc2VjKSoxMDAwICsgKHR2MS50dl91c2VjIC0gdHYwLnR2X3VzZWMpLzEwMDApOworCisJa2ZyZWUocFJlYWREYXRhKTsKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX3JlYWQodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9mbGFzaDJ4X3JlYWR3cml0ZSBzRmxhc2gyeFJlYWQgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJUFVDSEFSIHBSZWFkQnVmZiA9IE5VTEw7CisJVUlOVCBOT0IgPSAwOworCVVJTlQgQnVmZlNpemUgPSAwOworCVVJTlQgUmVhZEJ5dGVzID0gMDsKKwlVSU5UIFJlYWRPZmZzZXQgPSAwOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKKworCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkJeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1JFQUQgQ2FsbGVkIik7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogUmVhZGluZyBGTEFTSCAyLnggUkVBRCBzdHJ1Y3R1cmUgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4UmVhZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCXNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfcmVhZHdyaXRlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQuU2VjdGlvbiA6JXgiLCBzRmxhc2gyeFJlYWQuU2VjdGlvbik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQub2Zmc2V0IDoleCIsIHNGbGFzaDJ4UmVhZC5vZmZzZXQpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4Iiwgc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIlxuc0ZsYXNoMnhSZWFkLmJWZXJpZnkgOiV4XG4iLCBzRmxhc2gyeFJlYWQuYlZlcmlmeSk7CisKKwkvKiBUaGlzIHdhcyBpbnRlcm5hbCB0byBkcml2ZXIgZm9yIHJhdyByZWFkLgorCSAqIG5vdyBpdCBoYXMgYmVuIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBhcHAuCisJICovCisJaWYgKHZhbGlkYXRlRmxhc2gyeFJlYWRXcml0ZShBZGFwdGVyLCAmc0ZsYXNoMnhSZWFkKSA9PSBmYWxzZSkKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJTk9CID0gc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXM7CisJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJZWxzZQorCQlCdWZmU2l6ZSA9IE5PQjsKKworCVJlYWRPZmZzZXQgPSBzRmxhc2gyeFJlYWQub2Zmc2V0OworCU91dFB1dEJ1ZmYgPSBJb0J1ZmZlci5PdXRwdXRCdWZmZXI7CisJcFJlYWRCdWZmID0gKFBDSEFSKWt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKKworCWlmIChwUmVhZEJ1ZmYgPT0gTlVMTCkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCisJCQlEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWtmcmVlKHBSZWFkQnVmZik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCXdoaWxlIChOT0IpIHsKKwkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJCVJlYWRCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKKwkJZWxzZQorCQkJUmVhZEJ5dGVzID0gTk9COworCisJCS8qIFJlYWRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KKwkJU3RhdHVzID0gQmNtRmxhc2gyeEJ1bGtSZWFkKEFkYXB0ZXIsIChQVUlOVClwUmVhZEJ1ZmYsCisJCQlzRmxhc2gyeFJlYWQuU2VjdGlvbiwgUmVhZE9mZnNldCwgUmVhZEJ5dGVzKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsCisJCQkJREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsCisJCQkJU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJREJHX0xWTF9BTEwsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKKworCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoT3V0UHV0QnVmZiwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOworCQlpZiAoU3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwKKwkJCQlEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwUmVhZEJ1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOworCQlpZiAoTk9CKSB7CisJCQlSZWFkT2Zmc2V0ID0gUmVhZE9mZnNldCArIFJlYWRCeXRlczsKKwkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzOworCQl9CisJfQorCisJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWtmcmVlKHBSZWFkQnVmZik7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9mbGFzaDJ4X3NlY3Rpb25fd3JpdGUodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9mbGFzaDJ4X3JlYWR3cml0ZSBzRmxhc2gyeFdyaXRlID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCVBVQ0hBUiBwV3JpdGVCdWZmOworCXZvaWQgX191c2VyICpJbnB1dEFkZHI7CisJVUlOVCBOT0IgPSAwOworCVVJTlQgQnVmZlNpemUgPSAwOworCVVJTlQgV3JpdGVPZmZzZXQgPSAwOworCVVJTlQgV3JpdGVCeXRlcyA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpcnN0IG1ha2UgdGhpcyBGYWxzZSBzbyB0aGF0IHdlIGNhbiBlbmFibGUgdGhlIFNlY3RvcgorCSAqIFBlcm1pc3Npb24gQ2hlY2sgaW4gQmVjZWVtRmxhc2hCdWxrV3JpdGUKKwkgKi8KKwlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IGZhbHNlOworCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURSBDYWxsZWQiKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFJlYWRpbmcgRkxBU0ggMi54IFJFQUQgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFdyaXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJcbnNGbGFzaDJ4UmVhZC5TZWN0aW9uIDoleCIsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQub2Zmc2V0IDolZCIsIHNGbGFzaDJ4V3JpdGUub2Zmc2V0KTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJcbnNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzIDoleCIsIHNGbGFzaDJ4V3JpdGUubnVtT2ZCeXRlcyk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG5zRmxhc2gyeFJlYWQuYlZlcmlmeSA6JXhcbiIsIHNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7CisKKwlpZiAoKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EwKSAmJiAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTEpCisJCSYmIChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMikpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIk9ubHkgVlNBIHdyaXRlIGlzIGFsbG93ZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhbGlkYXRlRmxhc2gyeFJlYWRXcml0ZShBZGFwdGVyLCAmc0ZsYXNoMnhXcml0ZSkgPT0gZmFsc2UpCisJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKworCUlucHV0QWRkciA9IHNGbGFzaDJ4V3JpdGUucERhdGFCdWZmOworCVdyaXRlT2Zmc2V0ID0gc0ZsYXNoMnhXcml0ZS5vZmZzZXQ7CisJTk9CID0gc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzOworCisJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJZWxzZQorCQlCdWZmU2l6ZSA9IE5PQjsKKworCXBXcml0ZUJ1ZmYgPSBrbWFsbG9jKEJ1ZmZTaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChwV3JpdGVCdWZmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZXh0cmFjdGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBnaXZlbiBvZmZzZXQuICovCisJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKKwlpZiAoV3JpdGVPZmZzZXQgJSBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemUgLSAoV3JpdGVPZmZzZXQgJSBBZGFwdGVyLT51aVNlY3RvclNpemUpOworCisJaWYgKE5PQiA8IFdyaXRlQnl0ZXMpCisJCVdyaXRlQnl0ZXMgPSBOT0I7CisKKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWtmcmVlKHBXcml0ZUJ1ZmYpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlCY21GbGFzaDJ4Q29ycnVwdFNpZyhBZGFwdGVyLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOworCWRvIHsKKwkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdyaXRlQnVmZiwgSW5wdXRBZGRyLCBXcml0ZUJ5dGVzKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ29weSB0byB1c2VyIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJa2ZyZWUocFdyaXRlQnVmZik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKKwkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwgcFdyaXRlQnVmZiwgV3JpdGVCeXRlcyk7CisKKwkJLyogV3JpdGluZyB0aGUgZGF0YSBmcm9tIEZsYXNoIDIueCAqLworCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1dyaXRlKEFkYXB0ZXIsIChQVUlOVClwV3JpdGVCdWZmLAorCQkJc0ZsYXNoMnhXcml0ZS5TZWN0aW9uLCBXcml0ZU9mZnNldCwgV3JpdGVCeXRlcywKKwkJCXNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7CisKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJTk9CID0gTk9CIC0gV3JpdGVCeXRlczsKKwkJaWYgKE5PQikgeworCQkJV3JpdGVPZmZzZXQgPSBXcml0ZU9mZnNldCArIFdyaXRlQnl0ZXM7CisJCQlJbnB1dEFkZHIgPSBJbnB1dEFkZHIgKyBXcml0ZUJ5dGVzOworCQkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJCQlXcml0ZUJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOworCQkJZWxzZQorCQkJCVdyaXRlQnl0ZXMgPSBOT0I7CisJCX0KKwl9IHdoaWxlIChOT0IgPiAwKTsKKworCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOworCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwlrZnJlZShwV3JpdGVCdWZmKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2ZsYXNoMnhfc2VjdGlvbl9iaXRtYXAodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCAqcHNGbGFzaDJ4Qml0TWFwOworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCSJJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVAgQ2FsbGVkIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwc0ZsYXNoMnhCaXRNYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBzRmxhc2gyeEJpdE1hcCA9PSBOVUxMKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiTWVtb3J5IGlzIG5vdCBhdmFpbGFibGUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUmVhZGluZyB0aGUgRmxhc2ggU2VjdGlvIEJpdCBtYXAgKi8KKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCUJjbUdldEZsYXNoMnhTZWN0aW9uYWxCaXRNYXAoQWRhcHRlciwgcHNGbGFzaDJ4Qml0TWFwKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHBzRmxhc2gyeEJpdE1hcCwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9iaXRtYXApKSkgeworCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOworCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfc2V0X2FjdGl2ZV9zZWN0aW9uKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCWVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZUZsYXNoMnhTZWN0aW9uVmFsID0gMDsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJT0NUTF9CQ01fU0VUX0FDVElWRV9TRUNUSU9OIENhbGxlZCIpOworCisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLAorCQlJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVCkpOworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCVN0YXR1cyA9IEJjbVNldEFjdGl2ZVNlY3Rpb24oQWRhcHRlciwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwlpZiAoU3RhdHVzKQorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkZhaWxlZCB0byBtYWtlIGl0J3MgcHJpb3JpdHkgSGlnaGVzdC4gU3RhdHVzICVkIiwKKwkJCVN0YXR1cyk7CisKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2NvcHlfc2VjdGlvbih2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2ZsYXNoMnhfY29weV9zZWN0aW9uIHNDb3B5U2VjdFN0cnV0ID0gezB9OworCXN0cnVjdCBiY21faW9jdGxfYnVmZmVyIElvQnVmZmVyOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJIklPQ1RMX0JDTV9DT1BZX1NFQ1RJT04gIENhbGxlZCIpOworCisJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBmYWxzZTsKKwlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIFN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsIElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9jb3B5X3NlY3Rpb24pKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBDb3B5X1NlY3Rpb25fU3RydWN0IGZhaWxlZCB3aXRoIFN0YXR1cyA6JWQiLAorCQkJU3RhdHVzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiU291cmNlIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiRGVzdGluYXRpb24gU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJvZmZzZXQgOiV4Iiwgc0NvcHlTZWN0U3RydXQub2Zmc2V0KTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJOT0IgOiV4Iiwgc0NvcHlTZWN0U3RydXQubnVtT2ZCeXRlcyk7CisKKwlpZiAoSXNTZWN0aW9uRXhpc3RJbkZsYXNoKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pID09IGZhbHNlKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiU291cmNlIFNlY3Rpb248JXg+IGRvZXMgbm90IGV4aXN0IGluIEZsYXNoICIsCisJCQlzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKElzU2VjdGlvbkV4aXN0SW5GbGFzaChBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKSA9PSBmYWxzZSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkRlc3RpbmF0aW8gU2VjdGlvbjwleD4gZG9lcyBub3QgZXhpc3QgaW4gRmxhc2ggIiwKKwkJCXNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJTb3VyY2UgYW5kIERlc3RpbmF0aW9uIHNlY3Rpb24gc2hvdWxkIGJlIGRpZmZlcmVudCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWlmIChzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uID09IElTT19JTUFHRTEgfHwKKwkJc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBJU09fSU1BR0UyKSB7CisJCWlmIChJc05vbkNETGVzc0RldmljZShBZGFwdGVyKSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiRGV2aWNlIGlzIE5vbi1DRExlc3MgaGVuY2Ugd29uJ3QgaGF2ZSBJU08gISEiKTsKKwkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoc0NvcHlTZWN0U3RydXQubnVtT2ZCeXRlcyA9PSAwKSB7CisJCQlTdGF0dXMgPSBCY21Db3B5SVNPKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0KTsKKwkJfSBlbHNlIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIlBhcnRpYWwgQ29weSBvZiBJU08gc2VjdGlvbiBpcyBub3QgQWxsb3dlZC4uIik7CisJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwkJfQorCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCXJldHVybiBTdGF0dXM7CisJfQorCisJU3RhdHVzID0gQmNtQ29weVNlY3Rpb24oQWRhcHRlciwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiwKKwkJCQlzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uLAorCQkJCXNDb3B5U2VjdFN0cnV0Lm9mZnNldCwKKwkJCQlzQ29weVNlY3RTdHJ1dC5udW1PZkJ5dGVzKTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9nZXRfZmxhc2hfY3NfaW5mbyh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSIgSU9DVExfQkNNX0dFVF9GTEFTSF9DU19JTkZPIENhbGxlZCIpOworCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJDb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IGhhdmUgZmxhc2giKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKElzRmxhc2gyeChBZGFwdGVyKSA9PSBUUlVFKSB7CisJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCQlBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sCisJCQlzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaF9jc19pbmZvKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLAorCQkJc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2hfY3NfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBTdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfc2VsZWN0X2RzZCh2b2lkIF9fdXNlciAqYXJncCwKKwlzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJVUlOVCBTZWN0T2ZzZXQgPSAwOworCWVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZUZsYXNoMnhTZWN0aW9uVmFsOworCisJZUZsYXNoMnhTZWN0aW9uVmFsID0gTk9fU0VDVElPTl9WQUw7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiSU9DVExfQkNNX1NFTEVDVF9EU0QgQ2FsbGVkIik7CisKKwlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJc2l6ZW9mKElOVCkpOworCWlmIChTdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJSZWFkIFNlY3Rpb24gOiVkIiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwlpZiAoKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QwKSAmJgorCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDEpICYmCisJCShlRmxhc2gyeFNlY3Rpb25WYWwgIT0gRFNEMikpIHsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIlBhc3NlZCBzZWN0aW9uPCV4PiBpcyBub3QgRFNEIHNlY3Rpb24iLAorCQkJZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCX0KKworCVNlY3RPZnNldCA9IEJjbUdldFNlY3Rpb25WYWxTdGFydE9mZnNldChBZGFwdGVyLCBlRmxhc2gyeFNlY3Rpb25WYWwpOworCWlmIChTZWN0T2ZzZXQgPT0gSU5WQUxJRF9PRkZTRVQpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJQcm92aWRlZCBTZWN0aW9uIHZhbCA8JWQ+IGRvZXMgbm90IGV4aXN0IGluIEZsYXNoIDIueCIsCisJCQllRmxhc2gyeFNlY3Rpb25WYWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IFRSVUU7CisJQWRhcHRlci0+dWxGbGFzaENhbFN0YXJ0ID0gU2VjdE9mc2V0OworCUFkYXB0ZXItPmVBY3RpdmVEU0QgPSBlRmxhc2gyeFNlY3Rpb25WYWw7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfbnZtX3Jhd19yZWFkKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fbnZtX3JlYWR3cml0ZSBzdE5WTVJlYWQ7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJdW5zaWduZWQgaW50IE5PQjsKKwlJTlQgQnVmZlNpemU7CisJSU5UIFJlYWRPZmZzZXQgPSAwOworCVVJTlQgUmVhZEJ5dGVzID0gMDsKKwlQVUNIQVIgcFJlYWRCdWZmOworCXZvaWQgX191c2VyICpPdXRQdXRCdWZmOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKworCWlmIChBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJOVk0gVFlQRSBpcyBub3QgRmxhc2giKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJjb3B5X2Zyb21fdXNlciAxIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCXNpemVvZihzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlOT0IgPSBzdE5WTVJlYWQudWlOdW1CeXRlczsKKwkvKiBJbiBSYXctUmVhZCBtYXggQnVmZiBzaXplIDogNjRNQiAqLworCisJaWYgKE5PQiA+IERFRkFVTFRfQlVGRl9TSVpFKQorCQlCdWZmU2l6ZSA9IERFRkFVTFRfQlVGRl9TSVpFOworCWVsc2UKKwkJQnVmZlNpemUgPSBOT0I7CisKKwlSZWFkT2Zmc2V0ID0gc3ROVk1SZWFkLnVpT2Zmc2V0OworCU91dFB1dEJ1ZmYgPSBzdE5WTVJlYWQucEJ1ZmZlcjsKKworCXBSZWFkQnVmZiA9IGt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKKwlpZiAocFJlYWRCdWZmID09IE5VTEwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIEZsYXNoIDIueCBSZWFkIFN0cnVjdHVyZSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQkJREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJa2ZyZWUocFJlYWRCdWZmKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlBZGFwdGVyLT5iRmxhc2hSYXdSZWFkID0gVFJVRTsKKworCXdoaWxlIChOT0IpIHsKKwkJaWYgKE5PQiA+IERFRkFVTFRfQlVGRl9TSVpFKQorCQkJUmVhZEJ5dGVzID0gREVGQVVMVF9CVUZGX1NJWkU7CisJCWVsc2UKKwkJCVJlYWRCeXRlcyA9IE5PQjsKKworCQkvKiBSZWFkaW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCisJCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkQnVmZiwKKwkJCVJlYWRPZmZzZXQsIFJlYWRCeXRlcyk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCisJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCURCR19MVkxfQUxMLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7CisKKwkJU3RhdHVzID0gY29weV90b191c2VyKE91dFB1dEJ1ZmYsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwUmVhZEJ1ZmYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOworCQlpZiAoTk9CKSB7CisJCQlSZWFkT2Zmc2V0ID0gUmVhZE9mZnNldCArIFJlYWRCeXRlczsKKwkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzOworCQl9CisJfQorCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBmYWxzZTsKKwl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJa2ZyZWUocFJlYWRCdWZmKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitzdGF0aWMgaW50IGJjbV9jaGFyX2lvY3RsX2NudHJsbXNnX21hc2sodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHN0cnVjdCBiY21fdGFyYW5nX2RhdGEgKnBUYXJhbmcpCit7CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCVVMT05HIFJ4Q250cmxNc2dCaXRNYXNrID0gMDsKKworCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7CisJaWYgKFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiY29weSBvZiBJb2N0bCBidWZmZXIgaXMgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSeENudHJsTXNnQml0TWFzaywKKwkJSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCSJjb3B5IG9mIGNvbnRyb2wgYml0IG1hc2sgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkiXG4gR290IHVzZXIgZGVmaW5lZCBjbnRybCBtc2cgYml0IG1hc2sgOiVseCIsCisJCVJ4Q250cmxNc2dCaXRNYXNrKTsKKwlwVGFyYW5nLT5SeENudHJsTXNnQml0TWFzayA9IFJ4Q250cmxNc2dCaXRNYXNrOworCisJcmV0dXJuIFN0YXR1czsKK30KKworc3RhdGljIGludCBiY21fY2hhcl9pb2N0bF9nZXRfZGV2aWNlX2RyaXZlcl9pbmZvKHZvaWQgX191c2VyICphcmdwLAorCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQoreworCXN0cnVjdCBiY21fZHJpdmVyX2luZm8gRGV2SW5mbzsKKwlzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlciBJb0J1ZmZlcjsKKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAorCQlEQkdfTFZMX0FMTCwgIkNhbGxlZCBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GT1xuIik7CisKKwltZW1zZXQoJkRldkluZm8sIDAsIHNpemVvZihEZXZJbmZvKSk7CisJRGV2SW5mby5NYXhSRE1CdWZmZXJTaXplID0gQlVGRkVSXzRLOworCURldkluZm8udTMyRFNEU3RhcnRPZmZzZXQgPSBFRVBST01fQ0FMUEFSQU1fU1RBUlQ7CisJRGV2SW5mby51MzJSeEFsaWdubWVudENvcnJlY3Rpb24gPSAwOworCURldkluZm8udTMyTlZNVHlwZSA9IEFkYXB0ZXItPmVOVk1UeXBlOworCURldkluZm8udTMySW50ZXJmYWNlVHlwZSA9IEJDTV9VU0I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKERldkluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmRGV2SW5mbywgc2l6ZW9mKERldkluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgYmNtX2NoYXJfaW9jdGxfdGltZV9zaW5jZV9uZXRfZW50cnkodm9pZCBfX3VzZXIgKmFyZ3AsCisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCit7CisJc3RydWN0IGJjbV90aW1lX2VsYXBzZWQgc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSB7MH07CisJc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCSJJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlkgY2FsbGVkIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeS51bDY0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0KKwkJZ2V0X3NlY29uZHMoKSAtIEFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5OworCisJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSwKKwkJc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisKIHN0YXRpYyBsb25nIGJjbV9jaGFyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCBVSU5UIGNtZCwgVUxPTkcgYXJnKQogewogCXN0cnVjdCBiY21fdGFyYW5nX2RhdGEgKnBUYXJhbmcgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIgPSBwVGFyYW5nLT5BZGFwdGVyOwogCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQlpbnQgdGltZW91dCA9IDA7Ci0Jc3RydWN0IGJjbV9pb2N0bF9idWZmZXIgSW9CdWZmZXI7Ci0JaW50IGJ5dGVzOwogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAogCQkJIlBhcmFtZXRlcnMgUGFzc2VkIHRvIGNvbnRyb2wgSU9DVEwgY21kPTB4JVggYXJnPTB4JWxYIiwKQEAgLTIwMSw3NzggKzIzMzIsNjUgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJLyogUmRtcyBmb3IgU3dpbiBJZGxlLi4uICovCi0JY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRF9QUklWQVRFOiB7Ci0JCXN0cnVjdCBiY21fcmRtX2J1ZmZlciBzUmRtQnVmZmVyID0gezB9OwotCQlQQ0hBUiB0ZW1wX2J1ZmY7Ci0JCVVJTlQgQnVmZmxlbjsKLQkJdTE2IHRlbXBfdmFsdWU7CisJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRF9QUklWQVRFOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9yZWdfcmVhZF9wcml2YXRlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzUmRtQnVmZmVyKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPiBVU0hSVF9NQVggfHwKLQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCUJ1ZmZsZW4gPSBJb0J1ZmZlci5PdXRwdXRMZW5ndGg7Ci0JCXRlbXBfdmFsdWUgPSA0IC0gKEJ1ZmZsZW4gJSA0KTsKLQkJQnVmZmxlbiArPSB0ZW1wX3ZhbHVlICUgNDsKLQotCQl0ZW1wX2J1ZmYgPSBrbWFsbG9jKEJ1ZmZsZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXRlbXBfYnVmZikKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWJ5dGVzID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCi0JCQkJKFBVSU5UKXRlbXBfYnVmZiwgQnVmZmxlbik7Ci0JCWlmIChieXRlcyA+IDApIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgYnl0ZXMpKSB7Ci0JCQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQl9Ci0KLQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEVfUFJJVkFURTogewotCQlzdHJ1Y3QgYmNtX3dybV9idWZmZXIgc1dybUJ1ZmZlciA9IHswfTsKLQkJVUlOVCB1aVRlbXBWYXIgPSAwOwotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzV3JtQnVmZmVyKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7Ci0JCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCi0JCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzMpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSB3cm1hbHQoQWRhcHRlciwgKFVJTlQpc1dybUJ1ZmZlci5SZWdpc3RlciwKLQkJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLCBzaXplb2YoVUxPTkcpKTsKLQotCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsICJXUk0gRG9uZVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKLQkJCQkJREJHX0xWTF9BTEwsICJXUk0gRmFpbGVkXG4iKTsKLQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFX1BSSVZBVEU6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3JlZ193cml0ZV9wcml2YXRlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRDoKLQljYXNlIElPQ1RMX0JDTV9FRVBST01fUkVHSVNURVJfUkVBRDogewotCQlzdHJ1Y3QgYmNtX3JkbV9idWZmZXIgc1JkbUJ1ZmZlciA9IHswfTsKLQkJUENIQVIgdGVtcF9idWZmID0gTlVMTDsKLQkJVUlOVCB1aVRlbXBWYXIgPSAwOwotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisJY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1JFQUQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2VlcHJvbV9yZWdfcmVhZChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFJkbXNcbiIpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gVVNIUlRfTUFYIHx8Ci0JCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQl0ZW1wX2J1ZmYgPSBrbWFsbG9jKElvQnVmZmVyLk91dHB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdGVtcF9idWZmKQotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0JCWlmICgoKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCkgfHwKLQkJCSgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIlJETSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLAotCQkJCQkoaW50KXNSZG1CdWZmZXIuUmVnaXN0ZXIpOwotCi0JCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQl1aVRlbXBWYXIgPSBzUmRtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwotCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCi0JCQkJICAgICAgIChQVUlOVCl0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7Ci0KLQkJaWYgKGJ5dGVzID4gMCkgewotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBieXRlcykpIHsKLQkJCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RhdHVzID0gYnl0ZXM7Ci0JCX0KLQotCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQlicmVhazsKLQl9CiAJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEU6Ci0JY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1dSSVRFOiB7Ci0JCXN0cnVjdCBiY21fd3JtX2J1ZmZlciBzV3JtQnVmZmVyID0gezB9OwotCQlVSU5UIHVpVGVtcFZhciA9IDA7CisJY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1dSSVRFOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9lZXByb21fcmVnX3dyaXRlKGFyZ3AsIEFkYXB0ZXIsIGNtZCk7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCWNhc2UgSU9DVExfQkNNX0dQSU9fU0VUX1JFUVVFU1Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dwaW9fc2V0X3JlcXVlc3QoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBXcm1zXG4iKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9CisJY2FzZSBCQ01fTEVEX1RIUkVBRF9TVEFURV9DSEFOR0VfUkVROgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9sZWRfdGhyZWFkX3N0YXRlX2NoYW5nZV9yZXEoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJY2FzZSBJT0NUTF9CQ01fR1BJT19TVEFUVVNfUkVRVUVTVDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ3Bpb19zdGF0dXNfcmVxdWVzdChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIElPQ1RMX0JDTV9HUElPX01VTFRJX1JFUVVFU1Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dwaW9fbXVsdGlfcmVxdWVzdChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoKCgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8Ci0JCQkoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCSJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKLQkJCQkJKGludClzV3JtQnVmZmVyLlJlZ2lzdGVyKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJdWlUZW1wVmFyID0gc1dybUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKLQkJaWYgKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkgJiBWU0dfTU9ERSkgJiYKLQkJCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzMpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKLQkJCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpIHsKLQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCQkiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAotCQkJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLAotCQkJCQlzV3JtQnVmZmVyLkxlbmd0aCk7Ci0KLQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLCAiV1JNIERvbmVcbiIpOwotCQl9IGVsc2UgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLCAiV1JNIEZhaWxlZFxuIik7Ci0JCQlTdGF0dXMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIElPQ1RMX0JDTV9HUElPX1NFVF9SRVFVRVNUOiB7Ci0JCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKLQkJVUlOVCB2YWx1ZSA9IDA7Ci0JCVVJTlQgdWlCaXQgPSAwOwotCQlVSU5UIHVpT3BlcmF0aW9uID0gMDsKLQkJc3RydWN0IGJjbV9ncGlvX2luZm8gZ3Bpb19pbmZvID0gezB9OwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLAotCQkJCQkiR1BJTyBDYW4ndCBiZSBzZXQvY2xlYXIgaW4gTG93IHBvd2VyIE1vZGUiKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19pbmZvKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJdWlCaXQgID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKLQkJdWlPcGVyYXRpb24gPSBncGlvX2luZm8udWlHcGlvVmFsdWU7Ci0JCXZhbHVlID0gKDE8PHVpQml0KTsKLQotCQlpZiAoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLCB2YWx1ZSkgPT0gZmFsc2UpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBMRUQgISEhIiwKLQkJCQkJdmFsdWUpOwotCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU2V0IC0gc2V0dGluZyAxICovCi0JCWlmICh1aU9wZXJhdGlvbikgewotCQkJLyogU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlciAqLwotCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwKLQkJCQkJCUJDTV9HUElPX09VVFBVVF9TRVRfUkVHLAotCQkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOwotCi0JCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKLQkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJTZXQgdGhlIEdQSU8gYml0XG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywKLQkJCQkJCU9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJCSJGYWlsZWQgdG8gc2V0IHRoZSAlZHRoIEdQSU9cbiIsCi0JCQkJCQl1aUJpdCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCi0JCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLAotCQkJCQkJQkNNX0dQSU9fT1VUUFVUX0NMUl9SRUcsCi0JCQkJCQkoUFVJTlQpKCZ2YWx1ZSksIHNpemVvZihVSU5UKSk7Ci0KLQkJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAotCQkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIlNldCB0aGUgR1BJTyBiaXRcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAotCQkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIkZhaWxlZCB0byBjbGVhciB0aGUgJWR0aCBHUElPXG4iLAotCQkJCQkJdWlCaXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYnl0ZXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX01PREVfUkVHSVNURVIsCi0JCQkJICAgICAgIChQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7Ci0JCWlmIChieXRlcyA8IDApIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkiR1BJT19NT0RFX1JFR0lTVEVSIHJlYWQgZmFpbGVkIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBncGlvIG1vZGUgcmVnaXN0ZXIgdG8gb3V0cHV0ICovCi0JCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSB8PSAoMTw8dWlCaXQpOwotCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIsCi0JCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7Ci0KLQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLAotCQkJCQkiU2V0IHRoZSBHUElPIHRvIG91dHB1dCBNb2RlXG4iKTsKLQkJfSBlbHNlIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIkZhaWxlZCB0byBwdXQgR1BJTyBpbiBPdXRwdXQgTW9kZVxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlicmVhazsKLQotCWNhc2UgQkNNX0xFRF9USFJFQURfU1RBVEVfQ0hBTkdFX1JFUTogewotCQlzdHJ1Y3QgYmNtX3VzZXJfdGhyZWFkX3JlcSB0aHJlYWRSZXEgPSB7MH07Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkiVXNlciBtYWRlIExFRCB0aHJlYWQgSW5BY3RpdmUiKTsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwKLQkJCQkJIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7Ci0JCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZih0aHJlYWRSZXEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkvKiBpZiBMRUQgdGhyZWFkIGlzIHJ1bm5pbmcoQWN0aXZlbHkgb3IgSW5hY3RpdmVseSkgc2V0IGl0IHN0YXRlIHRvIG1ha2UgaW5hY3RpdmUgKi8KLQkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nKSB7Ci0JCQlpZiAodGhyZWFkUmVxLlRocmVhZFN0YXRlID09IExFRF9USFJFQURfQUNUSVZBVElPTl9SRVEpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAotCQkJCQkJT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIkFjdGl2YXRpbmcgdGhyZWFkIHJlcSIpOwotCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTEVEX1RIUkVBRF9BQ1RJVkU7Ci0JCQl9IGVsc2UgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCi0JCQkJCQlPU0FMX0RCRywgREJHX0xWTF9BTEwsCi0JCQkJCQkiRGVBY3RpdmF0aW5nIFRocmVhZCByZXEuLi4uLiIpOwotCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTEVEX1RIUkVBRF9JTkFDVElWRTsKLQkJCX0KLQotCQkJLyogc2lnbmFsIHRocmVhZC4gKi8KLQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HUElPX1NUQVRVU19SRVFVRVNUOiB7Ci0JCVVMT05HIHVpQml0ID0gMDsKLQkJVUNIQVIgdWNSZWFkWzRdOwotCQlzdHJ1Y3QgYmNtX2dwaW9faW5mbyBncGlvX2luZm8gPSB7MH07Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKLQkJCXJldHVybiAtRUFDQ0VTOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXVpQml0ID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKLQotCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCi0JCWJ5dGVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpR1BJT19QSU5fU1RBVEVfUkVHSVNURVIsCi0JCQkJCShQVUlOVCl1Y1JlYWQsIHNpemVvZihVSU5UKSk7Ci0KLQkJaWYgKGJ5dGVzIDwgMCkgewotCQkJU3RhdHVzID0gYnl0ZXM7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkiUkRNIEZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gU3RhdHVzOwotCQl9IGVsc2UgewotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HUElPX01VTFRJX1JFUVVFU1Q6IHsKLQkJVUNIQVIgdWNSZXNldFZhbHVlWzRdOwotCQlzdHJ1Y3QgYmNtX2dwaW9fbXVsdGlfaW5mbyBncGlvX211bHRpX2luZm9bTUFYX0lEWF07Ci0JCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICpwZ3Bpb19tdWx0aV9pbmZvID0gKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvICopZ3Bpb19tdWx0aV9pbmZvOwotCi0JCW1lbXNldChwZ3Bpb19tdWx0aV9pbmZvLCAwLCBNQVhfSURYICogc2l6ZW9mKHN0cnVjdCBiY21fZ3Bpb19tdWx0aV9pbmZvKSk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfaW5mbykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfaW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJc1JlcUdwaW9Jc0xlZEluTlZNKEFkYXB0ZXIsIHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKSA9PSBmYWxzZSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsCi0JCQkJCURCR19MVkxfQUxMLAotCQkJCQkiU29ycnksIFJlcXVlc3RlZCBHUElPPDB4JVg+IGlzIG5vdCBjb3JyZXNwb25kIHRvIE5WTSBMRUQgYml0IG1hcDwweCVYPiEhISIsCi0JCQkJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrLAotCQkJCQlBZGFwdGVyLT5ncGlvQml0TWFwKTsKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KLQkJaWYgKChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaykgJgotCQkJKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9Db21tYW5kKSkgewotCQkJLyogU2V0IDEncyBpbiBHUElPIE9VVFBVVCBSRUdJU1RFUiAqLwotCQkJKihVSU5UICopdWNSZXNldFZhbHVlID0gIHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrICYKLQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCi0JCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlOwotCi0JCQlpZiAoKihVSU5UICopIHVjUmVzZXRWYWx1ZSkKLQkJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBCQ01fR1BJT19PVVRQVVRfU0VUX1JFRywKLQkJCQkJCQkoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKLQotCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCQkiV1JNIHRvIEJDTV9HUElPX09VVFBVVF9TRVRfUkVHIEZhaWxlZC4iKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCi0JCQkvKiBDbGVhciB0byAwJ3MgaW4gR1BJTyBPVVRQVVQgUkVHSVNURVIgKi8KLQkJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9IChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCi0JCQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCi0JCQkJCQkofihwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUpKSk7Ci0KLQkJCWlmICgqKFVJTlQgKikgdWNSZXNldFZhbHVlKQotCQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIEJDTV9HUElPX09VVFBVVF9DTFJfUkVHLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKLQotCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCi0JCQkJCQkiV1JNIHRvIEJDTV9HUElPX09VVFBVVF9DTFJfUkVHIEZhaWxlZC4iKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKSB7Ci0JCQlieXRlcyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOwotCi0JCQlpZiAoYnl0ZXMgPCAwKSB7Ci0JCQkJU3RhdHVzID0gYnl0ZXM7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJCSJSRE0gdG8gR1BJT19QSU5fU1RBVEVfUkVHSVNURVIgRmFpbGVkLiIpOwotCQkJCXJldHVybiBTdGF0dXM7Ci0JCQl9IGVsc2UgewotCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQkJfQotCi0JCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUgPSAoKihVSU5UICopdWNSZXNldFZhbHVlICYKLQkJCQkJCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfaW5mbywgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HUElPX01PREVfUkVRVUVTVDogewotCQlVQ0hBUiB1Y1Jlc2V0VmFsdWVbNF07Ci0JCXN0cnVjdCBiY21fZ3Bpb19tdWx0aV9tb2RlIGdwaW9fbXVsdGlfbW9kZVtNQVhfSURYXTsKLQkJc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKnBncGlvX211bHRpX21vZGUgPSAoc3RydWN0IGJjbV9ncGlvX211bHRpX21vZGUgKilncGlvX211bHRpX21vZGU7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWJ5dGVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpR1BJT19NT0RFX1JFR0lTVEVSLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOwotCi0JCWlmIChieXRlcyA8IDApIHsKLQkJCVN0YXR1cyA9IGJ5dGVzOwotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlYWQgb2YgR1BJT19NT0RFX1JFR0lTVEVSIGZhaWxlZCIpOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfSBlbHNlIHsKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQl9Ci0KLQkJLyogVmFsaWRhdGluZyB0aGUgcmVxdWVzdCAqLwotCQlpZiAoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLCBwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzaykgPT0gZmFsc2UpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKLQkJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLAotCQkJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzaywgQWRhcHRlci0+Z3Bpb0JpdE1hcCk7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spIHsKLQkJCS8qIHdyaXRlIGFsbCBPVVQncyAoMSdzKSAqLwotCQkJKihVSU5UICopIHVjUmVzZXRWYWx1ZSB8PSAocGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgJgotCQkJCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spOwotCi0JCQkvKiB3cml0ZSBhbGwgSU4ncyAoMCdzKSAqLwotCQkJKihVSU5UICopIHVjUmVzZXRWYWx1ZSAmPSB+KCh+cGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUpICYKLQkJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKLQotCQkJLyogQ3VycmVudGx5IGltcGxlbWVudGVkIHJldHVybiB0aGUgbW9kZXMgb2YgYWxsIEdQSU8ncwotCQkJICogZWxzZSBuZWVkcyB0byBiaXQgQU5EIHdpdGggIG1hc2sKLQkJCSAqLwotCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgPSAqKFVJTlQgKil1Y1Jlc2V0VmFsdWU7Ci0KLQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIEdQSU9fTU9ERV9SRUdJU1RFUiwgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVMT05HKSk7Ci0JCQlpZiAoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRG9uZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkJIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRmFpbGVkIik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLS8qIGlmIHVpR1BJT01hc2sgaXMgMCB0aGVuIHJldHVybiBtb2RlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gKi8KLQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlID0gKihVSU5UICopdWNSZXNldFZhbHVlOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JYnJlYWs7CisJY2FzZSBJT0NUTF9CQ01fR1BJT19NT0RFX1JFUVVFU1Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dwaW9fbW9kZV9yZXF1ZXN0KGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9NQUNfQUREUl9SRVE6CiAJY2FzZSBJT0NUTF9MSU5LX1JFUToKIAljYXNlIElPQ1RMX0NNX1JFUVVFU1Q6CiAJY2FzZSBJT0NUTF9TU19JTkZPX1JFUToKIAljYXNlIElPQ1RMX1NFTkRfQ09OVFJPTF9NRVNTQUdFOgotCWNhc2UgSU9DVExfSURMRV9SRVE6IHsKLQkJUFZPSUQgcHZCdWZmZXIgPSBOVUxMOwotCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmNtX2xpbmtfcmVxdWVzdCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBNQVhfQ05UTF9QS1RfU0laRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJICAgICAgIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJaWYgKElTX0VSUihwdkJ1ZmZlcikpCi0JCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7Ci0KLQkJZG93bigmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7Ci0JCVN0YXR1cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KEFkYXB0ZXItPmxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZSwKLQkJCQkJCQkhQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSwKLQkJCQkJCQkoMSAqIEhaKSk7Ci0JCWlmIChTdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQotCQkJZ290byBjbnRybEVuZDsKLQotCQlpZiAoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkiUHJlcGFyaW5nIElkbGUgTW9kZSBpcyBzdGlsbCBUcnVlIC0gSGVuY2UgUmVqZWN0aW5nIGNvbnRyb2wgbWVzc2FnZVxuIik7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQkJCWdvdG8gY250cmxFbmQ7Ci0JCX0KLQkJU3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpcHZCdWZmZXIpOwotCi1jbnRybEVuZDoKLQkJdXAoJkFkYXB0ZXItPkxvd1Bvd2VyTW9kZVN5bmMpOwotCQlrZnJlZShwdkJ1ZmZlcik7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVEFSVDogewotCQlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAotCQkJCQkiSU9DVExfQkNNX0NISVBfUkVTRVQgbm90IGFsbG93ZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCSJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKLQotCQlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJQWRhcHRlci0+YkJpbkRvd25sb2FkZWQgPSBmYWxzZTsKLQkJQWRhcHRlci0+ZndfZG93bmxvYWRfcHJvY2Vzc19waWQgPSBjdXJyZW50LT5waWQ7Ci0JCUFkYXB0ZXItPmJDZmdEb3dubG9hZGVkID0gZmFsc2U7Ci0JCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBmYWxzZTsKLQkJbmV0aWZfY2Fycmllcl9vZmYoQWRhcHRlci0+ZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOwotCQlTdGF0dXMgPSByZXNldF9jYXJkX3Byb2MoQWRhcHRlcik7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCXByX2VycihQRlggIiVzOiByZXNldF9jYXJkX3Byb2MgRmFpbGVkIVxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKLQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0KLQkJbWRlbGF5KDEwKTsKLQotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJY2FzZSBJT0NUTF9JRExFX1JFUToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfbWlzY19yZXF1ZXN0KGFyZ3AsIEFkYXB0ZXIpOwogCQlyZXR1cm4gU3RhdHVzOwotCX0KIAotCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRDogewotCQlzdHJ1Y3QgYmNtX2Zpcm13YXJlX2luZm8gKnBzRndJbmZvID0gTlVMTDsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlN0YXJ0aW5nIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBQSUQgPTB4JXghISEhXG4iLCBjdXJyZW50LT5waWQpOwotCi0JCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkludmFsaWQgd2F5IHRvIGRvd25sb2FkIGJ1ZmZlci4gVXNlIFN0YXJ0IGFuZCB0aGVuIGNhbGwgdGhpcyEhIVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfQotCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkgewotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCSJMZW5ndGggZm9yIEZXIERMRCBpcyA6ICVseFxuIiwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzdHJ1Y3QgYmNtX2Zpcm13YXJlX2luZm8pKSB7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXBzRndJbmZvID0ga21hbGxvYyhzaXplb2YoKnBzRndJbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHNGd0luZm8pIHsKLQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBzRndJbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKSB7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlrZnJlZShwc0Z3SW5mbyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWlmICghcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzIHx8Ci0JCQkocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoID09IDApKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTb21ldGhpbmcgZWxzZSBpcyB3cm9uZyAlbHVcbiIsCi0JCQkJCXBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCk7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlrZnJlZShwc0Z3SW5mbyk7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfQotCi0JCVN0YXR1cyA9IGJjbV9pb2N0bF9md19kb3dubG9hZChBZGFwdGVyLCBwc0Z3SW5mbyk7Ci0KLQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJaWYgKHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MgPT0gQ09ORklHX0JFR0lOX0FERFIpCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIklPQ1RMOiBDb25maWd1cmF0aW9uIEZpbGUgVXBsb2FkIEZhaWxlZFxuIik7Ci0JCQllbHNlCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwJIklPQ1RMOiBGaXJtd2FyZSBGaWxlIFVwbG9hZCBGYWlsZWRcbiIpOwotCi0JCQkvKiB1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7ICovCi0KLQkJCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKLQkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IERSSVZFUl9JTklUOwotCQkJCUFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID0gZmFsc2U7Ci0JCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVEw6IEZpcm13YXJlIEZpbGUgVXBsb2FkZWRcbiIpOwotCQlrZnJlZShwc0Z3SW5mbyk7CisJY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEX1NUQVJUOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWRfc3RhcnQoQWRhcHRlcik7CiAJCXJldHVybiBTdGF0dXM7Ci0JfQogCi0JY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEX1NUT1A6IHsKLQkJaWYgKCFkb3duX3RyeWxvY2soJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpKSB7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkiRlcgZG93bmxvYWQgYmxvY2tlZCBhcyBFRVBST00gUmVhZC9Xcml0ZSBpcyBpbiBwcm9ncmVzc1xuIik7Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCUFkYXB0ZXItPmJCaW5Eb3dubG9hZGVkID0gVFJVRTsKLQkJQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgPSBUUlVFOwotCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywgMCk7Ci0JCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MgPSAwOwotCQlBZGFwdGVyLT5kb3dubG9hZEREUiA9IDA7Ci0KLQkJLyogc2V0dGluZyB0aGUgTWlwcyB0byBSdW4gKi8KLQkJU3RhdHVzID0gcnVuX2NhcmRfcHJvYyhBZGFwdGVyKTsKLQotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmlybSBEb3dubG9hZCBGYWlsZWRcbiIpOwotCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJcmV0dXJuIFN0YXR1czsKLQkJfSBlbHNlIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLAotCQkJCQlEQkdfTFZMX0FMTCwgIkZpcm0gRG93bmxvYWQgT3Zlci4uLlxuIik7Ci0JCX0KLQotCQltZGVsYXkoMTApOwotCi0JCS8qIFdhaXQgZm9yIE1haWxCb3ggSW50ZXJydXB0ICovCi0JCWlmIChTdGFydEludGVycnVwdFVyYigoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqKUFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiVW5hYmxlIHRvIHNlbmQgaW50ZXJydXB0Li4uXG4iKTsKLQotCQl0aW1lb3V0ID0gNSpIWjsKLQkJQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lID0gZmFsc2U7Ci0JCXdhaXRfZXZlbnRfdGltZW91dChBZGFwdGVyLT5pb2N0bF9md19kbmxkX3dhaXRfcXVldWUsCi0JCQkJQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLCB0aW1lb3V0KTsKLQkJQWRhcHRlci0+ZndfZG93bmxvYWRfcHJvY2Vzc19waWQgPSBJTlZBTElEX1BJRDsKLQkJQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9IFRSVUU7Ci0JCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLCAwKTsKLQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyA9IDA7Ci0JCUFkYXB0ZXItPlByZXZOdW1SZWN2RGVzY3MgPSAwOwotCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5jbnRybHBrdENudCwgMCk7Ci0JCUFkYXB0ZXItPkxpbmtVcFN0YXR1cyA9IDA7Ci0JCUFkYXB0ZXItPkxpbmtTdGF0dXMgPSAwOwotCi0JCWlmIChBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKLQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRldfRE9XTkxPQURfRE9ORTsKLQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7Ci0JCX0KLQotCQlpZiAoIXRpbWVvdXQpCi0JCQlTdGF0dXMgPSAtRU5PREVWOwotCi0JCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfYnVmZmVyX2Rvd25sb2FkKGFyZ3AsIEFkYXB0ZXIpOwogCQlyZXR1cm4gU3RhdHVzOwotCX0KKworCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVE9QOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9idWZmZXJfZG93bmxvYWRfc3RvcChhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKKwogCiAJY2FzZSBJT0NUTF9CRV9CVUNLRVRfU0laRToKIAkJU3RhdHVzID0gMDsKQEAgLTk4NiwzNSArMjQwNCwxMyBAQAogCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAKLQljYXNlIElPQ1RMX0NISVBfUkVTRVQ6IHsKLQkJSU5UIE5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCWlmIChOVk1BY2Nlc3MpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICIgSU9DVExfQkNNX0NISVBfUkVTRVQgbm90IGFsbG93ZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KKwljYXNlIElPQ1RMX0NISVBfUkVTRVQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2NoaXBfcmVzZXQoQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJZG93bigmQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrKTsKLQkJU3RhdHVzID0gcmVzZXRfY2FyZF9wcm9jKEFkYXB0ZXIpOwotCQlmbHVzaEFsbEFwcFEoKTsKLQkJdXAoJkFkYXB0ZXItPlJ4QXBwQ29udHJvbFF1ZXVlbG9jayk7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJUmVzZXRDb3VudGVycyhBZGFwdGVyKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBJT0NUTF9RT1NfVEhSRVNIT0xEOiB7Ci0JCVVTSE9SVCB1aUxvb3BJbmRleDsKLQotCQlTdGF0dXMgPSAwOwotCQlmb3IgKHVpTG9vcEluZGV4ID0gMDsgdWlMb29wSW5kZXggPCBOT19PRl9RVUVVRVM7IHVpTG9vcEluZGV4KyspIHsKLQkJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUaHJlc2hvbGQsCi0JCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZykpIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KKwljYXNlIElPQ1RMX1FPU19USFJFU0hPTEQ6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3Fvc190aHJlc2hvbGQoYXJnLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfRFVNUF9QQUNLRVRfSU5GTzoKIAkJRHVtcFBhY2tJbmZvKEFkYXB0ZXIpOwpAQCAtMTAyMywxNDIgKzI0MTksMzkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIElPQ1RMX0dFVF9QQUNLX0lORk86Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJkFkYXB0ZXItPlBhY2tJbmZvLCBzaXplb2Yoc3RydWN0IGJjbV9wYWNrZXRfaW5mbykqTk9fT0ZfUVVFVUVTKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmQWRhcHRlci0+UGFja0luZm8sCisJCQlzaXplb2Yoc3RydWN0IGJjbV9wYWNrZXRfaW5mbykqTk9fT0ZfUVVFVUVTKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJYnJlYWs7CiAKLQljYXNlIElPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogewotCQlVSU5UIHVpRGF0YSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdWlEYXRhLCBhcmdwLCBzaXplb2YoVUlOVCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJY2FzZSBJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3N3aXRjaF90cmFuc2Zlcl9tb2RlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmICh1aURhdGEpIHsKLQkJCS8qIEFsbG93IEFsbCBQYWNrZXRzICovCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREVcbiIpOwotCQkJCUFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9IEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBBbGxvdyBJUCBvbmx5IFBhY2tldHMgKi8KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogSVBfUEFDS0VUX09OTFlfTU9ERVxuIik7Ci0JCQlBZGFwdGVyLT5UcmFuc2Zlck1vZGUgPSBJUF9QQUNLRVRfT05MWV9NT0RFOwotCQl9Ci0JCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQlicmVhazsKLQl9CisJY2FzZSBJT0NUTF9CQ01fR0VUX0RSSVZFUl9WRVJTSU9OOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9nZXRfZHJpdmVyX3ZlcnNpb24oYXJncCk7CisJCXJldHVybiBTdGF0dXM7CiAKLQljYXNlIElPQ1RMX0JDTV9HRVRfRFJJVkVSX1ZFUlNJT046IHsKLQkJdWxvbmcgbGVuOworCWNhc2UgSU9DVExfQkNNX0dFVF9DVVJSRU5UX1NUQVRVUzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X2N1cnJlbnRfc3RhdHVzKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX1NFVF9NQUNfVFJBQ0lORzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfc2V0X21hY190cmFjaW5nKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWxlbiA9IG1pbl90KHVsb25nLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHN0cmxlbihEUlZfVkVSU0lPTikgKyAxKTsKKwljYXNlIElPQ1RMX0JDTV9HRVRfRFNYX0lORElDQVRJT046CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9kc3hfaW5kaWNhdGlvbihhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgRFJWX1ZFUlNJT04sIGxlbikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX0dFVF9DVVJSRU5UX1NUQVRVUzogewotCQlzdHJ1Y3QgYmNtX2xpbmtfc3RhdGUgbGlua19zdGF0ZTsKLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciBmYWlsZWQuLlxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKGxpbmtfc3RhdGUpKSB7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQltZW1zZXQoJmxpbmtfc3RhdGUsIDAsIHNpemVvZihsaW5rX3N0YXRlKSk7Ci0JCWxpbmtfc3RhdGUuYklkbGVNb2RlID0gQWRhcHRlci0+SWRsZU1vZGU7Ci0JCWxpbmtfc3RhdGUuYlNodXRkb3duTW9kZSA9IEFkYXB0ZXItPmJTaHV0U3RhdHVzOwotCQlsaW5rX3N0YXRlLnVjTGlua1N0YXR1cyA9IEFkYXB0ZXItPkxpbmtTdGF0dXM7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZsaW5rX3N0YXRlLCBtaW5fdChzaXplX3QsIHNpemVvZihsaW5rX3N0YXRlKSwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5X3RvX3VzZXIgRmFpbGVkLi5cbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX1NFVF9NQUNfVFJBQ0lORzogewotCQlVSU5UICB0cmFjaW5nX2ZsYWc7Ci0KLQkJLyogY29weSBpb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0cmFjaW5nX2ZsYWcsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoVUlOVCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKHRyYWNpbmdfZmxhZykKLQkJCUFkYXB0ZXItPnBUYXJhbmdzLT5NYWNUcmFjaW5nRW5hYmxlZCA9IFRSVUU7Ci0JCWVsc2UKLQkJCUFkYXB0ZXItPnBUYXJhbmdzLT5NYWNUcmFjaW5nRW5hYmxlZCA9IGZhbHNlOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIElPQ1RMX0JDTV9HRVRfRFNYX0lORElDQVRJT046IHsKLQkJVUxPTkcgdWxTRklkID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fYWRkX2luZGljYXRpb25fYWx0KSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIk1pc21hdGNoIHJlcTogJWx4IG5lZWRlZCBpcyA9MHglenghISEiLAotCQkJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnVsU0ZJZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZih1bFNGSWQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkdldCBEU1ggRGF0YSBTRiBJRCBpcyA9JWx4XG4iLCB1bFNGSWQpOwotCQlnZXRfZHN4X3NmX2RhdGFfdG9fYXBwbGljYXRpb24oQWRhcHRlciwgdWxTRklkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIpOwotCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9HRVRfSE9TVF9NSUJTOiB7Ci0JCVBWT0lEIHRlbXBfYnVmZjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJIkxlbmd0aCBDaGVjayBmYWlsZWQgJWx1ICV6ZFxuIiwKLQkJCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2Yoc3RydWN0IGJjbV9ob3N0X3N0YXRzX21pYnMpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyogRklYTUU6IEhPU1RfU1RBVFMgYXJlIHRvbyBiaWcgZm9yIGttYWxsb2MgKDEyMjA0OCkhICovCi0JCXRlbXBfYnVmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY21faG9zdF9zdGF0c19taWJzKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdGVtcF9idWZmKQotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0JCVN0YXR1cyA9IFByb2Nlc3NHZXRIb3N0TWlicyhBZGFwdGVyLCB0ZW1wX2J1ZmYpOwotCQlHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKHRlbXBfYnVmZiwgcFRhcmFuZyk7Ci0KLQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfRkFJTFVSRSkKLQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIHNpemVvZihzdHJ1Y3QgYmNtX2hvc3Rfc3RhdHNfbWlicykpKSB7Ci0JCQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQotCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQlicmVhazsKLQl9CisJY2FzZSBJT0NUTF9CQ01fR0VUX0hPU1RfTUlCUzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X2hvc3RfbWlicyhhcmdwLCBBZGFwdGVyLCBwVGFyYW5nKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfQkNNX1dBS0VfVVBfREVWSUNFX0ZST01fSURMRToKLQkJaWYgKChmYWxzZSA9PSBBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUpICYmIChUUlVFID09IEFkYXB0ZXItPklkbGVNb2RlKSkgeworCQlpZiAoKGZhbHNlID09IEFkYXB0ZXItPmJUcmllZFRvV2FrZVVwRnJvbWxvd1Bvd2VyTW9kZSkgJiYKKwkJCShUUlVFID09IEFkYXB0ZXItPklkbGVNb2RlKSkgewogCQkJQWRhcHRlci0+dXNJZGxlTW9kZVBhdHRlcm4gPSBBQk9SVF9JRExFX01PREU7CiAJCQlBZGFwdGVyLT5iV2FrZVVwRGV2aWNlID0gVFJVRTsKIAkJCXdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcnhfY250cmxwa3QpOwpAQCAtMTE2Nyw4ODYgKzI0NjAsODIgQEAKIAkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NUTF9CQ01fQlVMS19XUk06IHsKLQkJc3RydWN0IGJjbV9idWxrX3dybV9idWZmZXIgKnBCdWxrQnVmZmVyOwotCQlVSU5UIHVpVGVtcFZhciA9IDA7Ci0JCVBDSEFSIHB2QnVmZmVyID0gTlVMTDsKLQotCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGV2aWNlIGluIElkbGUvU2h1dGRvd24gTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7Ci0JCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPCBzaXplb2YoVUxPTkcpICogMikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXB2QnVmZmVyID0gbWVtZHVwX3VzZXIoSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJICAgICAgIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJaWYgKElTX0VSUihwdkJ1ZmZlcikpCi0JCQlyZXR1cm4gUFRSX0VSUihwdkJ1ZmZlcik7Ci0KLQkJcEJ1bGtCdWZmZXIgPSAoc3RydWN0IGJjbV9idWxrX3dybV9idWZmZXIgKilwdkJ1ZmZlcjsKLQotCQlpZiAoKChVTE9ORylwQnVsa0J1ZmZlci0+UmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwIHx8Ci0JCQkoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MykpIHsKLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsIChpbnQpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyKTsKLQkJCWtmcmVlKHB2QnVmZmVyKTsKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCXVpVGVtcFZhciA9IHBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKLQkJaWYgKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkmVlNHX01PREUpICYmCi0JCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzMpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKLQkJCShjbWQgPT0gSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFKSkgewotCi0JCQlrZnJlZShwdkJ1ZmZlcik7Ci0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwotCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBCdWxrQnVmZmVyLT5Td2FwRW5kaWFuID09IGZhbHNlKQotCQkJU3RhdHVzID0gd3JtV2l0aExvY2soQWRhcHRlciwgKFVJTlQpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyLCAoUENIQVIpcEJ1bGtCdWZmZXItPlZhbHVlcywgSW9CdWZmZXIuSW5wdXRMZW5ndGggLSAyKnNpemVvZihVTE9ORykpOwotCQllbHNlCi0JCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIsIChQVUlOVClwQnVsa0J1ZmZlci0+VmFsdWVzLCBJb0J1ZmZlci5JbnB1dExlbmd0aCAtIDIqc2l6ZW9mKFVMT05HKSk7Ci0KLQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gRmFpbGVkXG4iKTsKLQotCQlrZnJlZShwdkJ1ZmZlcik7Ci0JCWJyZWFrOwotCX0KKwljYXNlIElPQ1RMX0JDTV9CVUxLX1dSTToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfYnVsa193cm0oYXJncCwgQWRhcHRlciwgY21kKTsKKwkJcmV0dXJuIFN0YXR1czsKIAogCWNhc2UgSU9DVExfQkNNX0dFVF9OVk1fU0laRToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X252bV9zaXplKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NIHx8IEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkgewotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZBZGFwdGVyLT51aU5WTURTRFNpemUsIHNpemVvZihVSU5UKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9DQUxfSU5JVDogewotCQlVSU5UIHVpU2VjdG9yU2l6ZSA9IDA7Ci0JCWlmIChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpU2VjdG9yU2l6ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVSU5UKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCWlmICgodWlTZWN0b3JTaXplIDwgTUlOX1NFQ1RPUl9TSVpFKSB8fCAodWlTZWN0b3JTaXplID4gTUFYX1NFQ1RPUl9TSVpFKSkgewotCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlTZWN0b3JTaXplLAotCQkJCQkJCXNpemVvZihVSU5UKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7Ci0JCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAkmQWRhcHRlci0+dWlTZWN0b3JTaXplLCBzaXplb2YoVUlOVCkpKQotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKChUUlVFID09IEFkYXB0ZXItPmJTaHV0U3RhdHVzKSB8fCAoVFJVRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkpIHsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJCQl9Ci0KLQkJCQkJQWRhcHRlci0+dWlTZWN0b3JTaXplID0gdWlTZWN0b3JTaXplOwotCQkJCQlCY21VcGRhdGVTZWN0b3JTaXplKEFkYXB0ZXIsIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSk7Ci0JCQkJfQotCQkJfQotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCX0gZWxzZSB7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQkJfQotCX0KLQlicmVhazsKKwljYXNlIElPQ1RMX0JDTV9DQUxfSU5JVDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfY2FsX2luaXQoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKIAljYXNlIElPQ1RMX0JDTV9TRVRfREVCVUc6Ci0jaWZkZWYgREVCVUcKLQl7Ci0JCXN0cnVjdCBiY21fdXNlcl9kZWJ1Z19zdGF0ZSBzVXNlckRlYnVnU3RhdGU7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSW4gU0VUX0RFQlVHIGlvY3RsXG4iKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNVc2VyRGVidWdTdGF0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihzdHJ1Y3QgYmNtX3VzZXJfZGVidWdfc3RhdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSU9DVExfQkNNX1NFVF9ERUJVRzogT25PZmY9JWQgVHlwZSA9IDB4JXggIiwKLQkJCQlzVXNlckRlYnVnU3RhdGUuT25PZmYsIHNVc2VyRGVidWdTdGF0ZS5UeXBlKTsKLQkJLyogc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUgPDw9IDE7ICovCi0JCXNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlID0gMSA8PCBzVXNlckRlYnVnU3RhdGUuU3VidHlwZTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJhY3R1YWwgU3VidHlwZT0weCV4XG4iLCBzVXNlckRlYnVnU3RhdGUuU3VidHlwZSk7Ci0KLQkJLyogVXBkYXRlIG5ldyAnRGVidWdTdGF0ZScgaW4gdGhlIEFkYXB0ZXIgKi8KLQkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUgfD0gc1VzZXJEZWJ1Z1N0YXRlLlR5cGU7Ci0JCS8qIFN1YnR5cGU6IEEgYml0bWFwIG9mIDMyIGJpdHMgZm9yIFN1YnR5cGUgcGVyIFR5cGUuCi0JCSAqIFZhbGlkIGluZGV4ZXMgaW4gJ3N1YnR5cGUnIGFycmF5OiAxLDIsNCw4Ci0JCSAqIGNvcnJlc3BvbmRpbmcgdG8gdmFsaWQgVHlwZSB2YWx1ZXMuIEhlbmNlIHdlIGNhbiB1c2UgdGhlICdUeXBlJyBmaWVsZAotCQkgKiBhcyB0aGUgaW5kZXggdmFsdWUsIGlnbm9yaW5nIHRoZSBhcnJheSBlbnRyaWVzIDAsMyw1LDYsNyAhCi0JCSAqLwotCQlpZiAoc1VzZXJEZWJ1Z1N0YXRlLk9uT2ZmKQotCQkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbc1VzZXJEZWJ1Z1N0YXRlLlR5cGVdIHw9IHNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOwotCQllbHNlCi0JCQlBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtzVXNlckRlYnVnU3RhdGUuVHlwZV0gJj0gfnNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOwotCi0JCUJDTV9TSE9XX0RFQlVHX0JJVE1BUChBZGFwdGVyKTsKLQl9Ci0jZW5kaWYKLQlicmVhazsKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfc2V0X2RlYnVnKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9CQ01fTlZNX1JFQUQ6Ci0JY2FzZSBJT0NUTF9CQ01fTlZNX1dSSVRFOiB7Ci0JCXN0cnVjdCBiY21fbnZtX3JlYWR3cml0ZSBzdE5WTVJlYWRXcml0ZTsKLQkJUFVDSEFSIHBSZWFkRGF0YSA9IE5VTEw7Ci0JCVVMT05HIHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgPSAwOwotCQlzdHJ1Y3QgdGltZXZhbCB0djAsIHR2MTsKLQkJbWVtc2V0KCZ0djAsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwotCQltZW1zZXQoJnR2MSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7Ci0JCWlmICgoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKSAmJiAoQWRhcHRlci0+dWlGbGFzaExheW91dE1ham9yVmVyc2lvbiA9PSAwKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlRoZSBGbGFzaCBDb250cm9sIFNlY3Rpb24gaXMgQ29ycnVwdGVkLiBIZW5jZSBSZWplY3Rpb24gb24gTlZNIFJlYWQvV3JpdGVcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwljYXNlIElPQ1RMX0JDTV9OVk1fV1JJVEU6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX252bV9ydyhhcmdwLCBBZGFwdGVyLCBjbWQpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKLQkJCWlmICgoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QwKSAmJgotCQkJCShBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDEpICYmCi0JCQkJKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMikpIHsKKwljYXNlIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fUkVBRDoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX3JlYWQoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTm8gRFNEIGlzIGFjdGl2ZS4uaGVuY2UgTlZNIENvbW1hbmQgaXMgYmxvY2tlZCIpOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLQkJfQorCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURToKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZmxhc2gyeF9zZWN0aW9uX3dyaXRlKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9mbGFzaDJ4X3NlY3Rpb25fYml0bWFwKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkV3JpdGUsCi0JCQkJCShJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKSA/IElvQnVmZmVyLk91dHB1dEJ1ZmZlciA6IElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCQlzaXplb2Yoc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwljYXNlIElPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT046CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3NldF9hY3RpdmVfc2VjdGlvbihhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQkvKgotCQkgKiBEZW55IHRoZSBhY2Nlc3MgaWYgdGhlIG9mZnNldCBjcm9zc2VzIHRoZSBjYWwgYXJlYSBsaW1pdC4KLQkJICovCi0JCWlmIChzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzID4gQWRhcHRlci0+dWlOVk1EU0RTaXplKQotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0JCWlmIChzdE5WTVJlYWRXcml0ZS51aU9mZnNldCA+IEFkYXB0ZXItPnVpTlZNRFNEU2l6ZSAtIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpIHsKLQkJCS8qIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ2FuJ3QgYWxsb3cgYWNjZXNzIGJleW9uZCBOVk0gU2l6ZTogMHgleCAweCV4XG4iLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7ICovCi0JCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQotCQlwUmVhZERhdGEgPSBtZW1kdXBfdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLAotCQkJCQlzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKTsKLQkJaWYgKElTX0VSUihwUmVhZERhdGEpKQotCQkJcmV0dXJuIFBUUl9FUlIocFJlYWREYXRhKTsKLQotCQlkb19nZXR0aW1lb2ZkYXkoJnR2MCk7Ci0JCWlmIChJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKSB7Ci0JCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KLQotCQkJU3RhdHVzID0gQmVjZWVtTlZNUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlrZnJlZShwUmVhZERhdGEpOwotCQkJCXJldHVybiBTdGF0dXM7Ci0JCQl9Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwgcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkgewotCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7Ci0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KLQotCQkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBUUlVFOwotCQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSkgewotCQkJCS8qCi0JCQkJICoJCQlOZXcgUmVxdWlyZW1lbnQ6LQotCQkJCSAqCQkJRFNEIHNlY3Rpb24gdXBkYXRpb24gd2lsbCBiZSBhbGxvd2VkIGluIHR3byBjYXNlOi0KLQkJCQkgKgkJCTEuICBpZiBEU0Qgc2lnIGlzIHByZXNlbnQgaW4gRFNEIGhlYWRlciBtZWFucyBkb25nbGUgaXMgb2sgYW5kIHVwZGF0aW9uIGlzIGZydWl0ZnVsbAotCQkJCSAqCQkJMi4gIGlmIHBvaW50IDEgZmFpbGVzIHRoZW4gdXNlciBidWZmIHNob3VsZCBoYXZlIERTRCBzaWcuIHRoaXMgcG9pbnQgZW5zdXJlcyB0aGF0IGlmIGRvbmdsZSBpcwotCQkJCSAqCQkJICAgICAgY29ycnVwdGVkIHRoZW4gdXNlciBzcGFjZSBwcm9ncmFtIGZpcnN0IG1vZGlmeSB0aGUgRFNEIGhlYWRlciB3aXRoIHZhbGlkIERTRCBzaWcgc28KLQkJCQkgKgkJCSAgICAgIHRoYXQgdGhpcyBhcyB3ZWxsIGFzIGZ1cnRoZXIgd3JpdGUgbWF5IGJlIHdvcnRod2hpbGUuCi0JCQkJICoKLQkJCQkgKgkJCSBUaGlzIHJlc3RyaWN0aW9uIGhhcyBiZWVuIHB1dCBhc3N1bWluZyB0aGF0IGlmIERTRCBzaWcgaXMgY29ycnVwdGVkLCBEU0QKLQkJCQkgKgkJCSBkYXRhIHdvbid0IGJlIGNvbnNpZGVyZWQgdmFsaWQuCi0JCQkJICovCi0KLQkJCQlTdGF0dXMgPSBCY21GbGFzaDJ4Q29ycnVwdFNpZyhBZGFwdGVyLCBBZGFwdGVyLT5lQWN0aXZlRFNEKTsKLQkJCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJCWlmICgoKHN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0ICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykgIT0gQWRhcHRlci0+dWlOVk1EU0RTaXplKSB8fAotCQkJCQkJKHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMgPCBTSUdOQVRVUkVfU0laRSkpIHsKLQotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOwotCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJCX0KLQotCQkJCQl1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gbnRvaGwoKihQVUlOVCkocFJlYWREYXRhICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyAtIFNJR05BVFVSRV9TSVpFKSk7Ci0JCQkJCWlmICh1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmICE9IERTRF9JTUFHRV9NQUdJQ19OVU1CRVIpIHsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRTRCBTaWcgaXMgcHJlc2VudCBuZWl0aGVyIGluIEZsYXNoIG5vciBVc2VyIHByb3ZpZGVkIElucHV0Li4iKTsKLQkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlTdGF0dXMgPSBCZWNlZW1OVk1Xcml0ZShBZGFwdGVyLCAoUFVJTlQpcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcywgc3ROVk1SZWFkV3JpdGUuYlZlcmlmeSk7Ci0JCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKQotCQkJCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLCBBZGFwdGVyLT5lQWN0aXZlRFNEKTsKLQotCQkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBmYWxzZTsKLQotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJZG9fZ2V0dGltZW9mZGF5KCZ0djEpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICIgdGltZXRha2VuIGJ5IFdyaXRlL3JlYWQgOiVsZCBtc2VjXG4iLCAodHYxLnR2X3NlYyAtIHR2MC50dl9zZWMpKjEwMDAgKyAodHYxLnR2X3VzZWMgLSB0djAudHZfdXNlYykvMTAwMCk7Ci0KLQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCX0KLQotCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEOiB7Ci0JCXN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUgc0ZsYXNoMnhSZWFkID0gezB9OwotCQlQVUNIQVIgcFJlYWRCdWZmID0gTlVMTDsKLQkJVUlOVCBOT0IgPSAwOwotCQlVSU5UIEJ1ZmZTaXplID0gMDsKLQkJVUlOVCBSZWFkQnl0ZXMgPSAwOwotCQlVSU5UIFJlYWRPZmZzZXQgPSAwOwotCQl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKLQotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEIENhbGxlZCIpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCS8qIFJlYWRpbmcgRkxBU0ggMi54IFJFQUQgc3RydWN0dXJlICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhSZWFkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4Iiwgc0ZsYXNoMnhSZWFkLlNlY3Rpb24pOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5vZmZzZXQgOiV4Iiwgc0ZsYXNoMnhSZWFkLm9mZnNldCk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4Iiwgc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5iVmVyaWZ5IDoleFxuIiwgc0ZsYXNoMnhSZWFkLmJWZXJpZnkpOwotCi0JCS8qIFRoaXMgd2FzIGludGVybmFsIHRvIGRyaXZlciBmb3IgcmF3IHJlYWQuIG5vdyBpdCBoYXMgYmVuIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBhcHAuICovCi0JCWlmICh2YWxpZGF0ZUZsYXNoMnhSZWFkV3JpdGUoQWRhcHRlciwgJnNGbGFzaDJ4UmVhZCkgPT0gZmFsc2UpCi0JCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0KLQkJTk9CID0gc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXM7Ci0JCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCi0JCQlCdWZmU2l6ZSA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJZWxzZQotCQkJQnVmZlNpemUgPSBOT0I7Ci0KLQkJUmVhZE9mZnNldCA9IHNGbGFzaDJ4UmVhZC5vZmZzZXQ7Ci0JCU91dFB1dEJ1ZmYgPSBJb0J1ZmZlci5PdXRwdXRCdWZmZXI7Ci0JCXBSZWFkQnVmZiA9IChQQ0hBUilremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHBSZWFkQnVmZiA9PSBOVUxMKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBGbGFzaCAyLnggUmVhZCBTdHJ1Y3R1cmUiKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlrZnJlZShwUmVhZEJ1ZmYpOwotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQotCQl3aGlsZSAoTk9CKSB7Ci0JCQlpZiAoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJCVJlYWRCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJCWVsc2UKLQkJCQlSZWFkQnl0ZXMgPSBOT0I7Ci0KLQkJCS8qIFJlYWRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KLQkJCVN0YXR1cyA9IEJjbUZsYXNoMnhCdWxrUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWRCdWZmLCBzRmxhc2gyeFJlYWQuU2VjdGlvbiwgUmVhZE9mZnNldCwgUmVhZEJ5dGVzKTsKLQkJCWlmIChTdGF0dXMpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJGbGFzaCAyeCByZWFkIGVyciB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7Ci0KLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihPdXRQdXRCdWZmLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7Ci0JCQlpZiAoU3RhdHVzKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBSZWFkQnVmZik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQlOT0IgPSBOT0IgLSBSZWFkQnl0ZXM7Ci0JCQlpZiAoTk9CKSB7Ci0JCQkJUmVhZE9mZnNldCA9IFJlYWRPZmZzZXQgKyBSZWFkQnl0ZXM7Ci0JCQkJT3V0UHV0QnVmZiA9IE91dFB1dEJ1ZmYgKyBSZWFkQnl0ZXM7Ci0JCQl9Ci0JCX0KLQotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCWtmcmVlKHBSZWFkQnVmZik7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1dSSVRFOiB7Ci0JCXN0cnVjdCBiY21fZmxhc2gyeF9yZWFkd3JpdGUgc0ZsYXNoMnhXcml0ZSA9IHswfTsKLQkJUFVDSEFSIHBXcml0ZUJ1ZmY7Ci0JCXZvaWQgX191c2VyICpJbnB1dEFkZHI7Ci0JCVVJTlQgTk9CID0gMDsKLQkJVUlOVCBCdWZmU2l6ZSA9IDA7Ci0JCVVJTlQgV3JpdGVPZmZzZXQgPSAwOwotCQlVSU5UIFdyaXRlQnl0ZXMgPSAwOwotCi0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBGaXJzdCBtYWtlIHRoaXMgRmFsc2Ugc28gdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBTZWN0b3IgUGVybWlzc2lvbiBDaGVjayBpbiBCZWNlZW1GbGFzaEJ1bGtXcml0ZSAqLwotCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IGZhbHNlOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEUgQ2FsbGVkIik7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkvKiBSZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4V3JpdGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X3JlYWR3cml0ZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG5zRmxhc2gyeFJlYWQuU2VjdGlvbiA6JXgiLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5vZmZzZXQgOiVkIiwgc0ZsYXNoMnhXcml0ZS5vZmZzZXQpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzIDoleCIsIHNGbGFzaDJ4V3JpdGUubnVtT2ZCeXRlcyk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLmJWZXJpZnkgOiV4XG4iLCBzRmxhc2gyeFdyaXRlLmJWZXJpZnkpOwotCi0JCWlmICgoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTApICYmIChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMSkgJiYgKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EyKSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiT25seSBWU0Egd3JpdGUgaXMgYWxsb3dlZCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAodmFsaWRhdGVGbGFzaDJ4UmVhZFdyaXRlKEFkYXB0ZXIsICZzRmxhc2gyeFdyaXRlKSA9PSBmYWxzZSkKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQotCQlJbnB1dEFkZHIgPSBzRmxhc2gyeFdyaXRlLnBEYXRhQnVmZjsKLQkJV3JpdGVPZmZzZXQgPSBzRmxhc2gyeFdyaXRlLm9mZnNldDsKLQkJTk9CID0gc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzOwotCi0JCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCi0JCQlCdWZmU2l6ZSA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJZWxzZQotCQkJQnVmZlNpemUgPSBOT0I7Ci0KLQkJcFdyaXRlQnVmZiA9IGttYWxsb2MoQnVmZlNpemUsIEdGUF9LRVJORUwpOwotCi0JCWlmIChwV3JpdGVCdWZmID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQkvKiBleHRyYWN0aW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGdpdmVuIG9mZnNldC4gKi8KLQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKLQkJaWYgKFdyaXRlT2Zmc2V0ICUgQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAtIChXcml0ZU9mZnNldCAlIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSk7Ci0KLQkJaWYgKE5PQiA8IFdyaXRlQnl0ZXMpCi0JCQlXcml0ZUJ5dGVzID0gTk9COwotCi0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlrZnJlZShwV3JpdGVCdWZmKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJQmNtRmxhc2gyeENvcnJ1cHRTaWcoQWRhcHRlciwgc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKLQkJZG8gewotCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdyaXRlQnVmZiwgSW5wdXRBZGRyLCBXcml0ZUJ5dGVzKTsKLQkJCWlmIChTdGF0dXMpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSB0byB1c2VyIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQlrZnJlZShwV3JpdGVCdWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIHBXcml0ZUJ1ZmYsIFdyaXRlQnl0ZXMpOwotCi0JCQkvKiBXcml0aW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCi0JCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1dyaXRlKEFkYXB0ZXIsIChQVUlOVClwV3JpdGVCdWZmLCBzRmxhc2gyeFdyaXRlLlNlY3Rpb24sIFdyaXRlT2Zmc2V0LCBXcml0ZUJ5dGVzLCBzRmxhc2gyeFdyaXRlLmJWZXJpZnkpOwotCi0JCQlpZiAoU3RhdHVzKSB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIDJ4IHJlYWQgZXJyIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCU5PQiA9IE5PQiAtIFdyaXRlQnl0ZXM7Ci0JCQlpZiAoTk9CKSB7Ci0JCQkJV3JpdGVPZmZzZXQgPSBXcml0ZU9mZnNldCArIFdyaXRlQnl0ZXM7Ci0JCQkJSW5wdXRBZGRyID0gSW5wdXRBZGRyICsgV3JpdGVCeXRlczsKLQkJCQlpZiAoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplKQotCQkJCQlXcml0ZUJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOwotCQkJCWVsc2UKLQkJCQkJV3JpdGVCeXRlcyA9IE5PQjsKLQkJCX0KLQkJfSB3aGlsZSAoTk9CID4gMCk7Ci0KLQkJQmNtRmxhc2gyeFdyaXRlU2lnKEFkYXB0ZXIsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJa2ZyZWUocFdyaXRlQnVmZik7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVA6IHsKLQkJc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCAqcHNGbGFzaDJ4Qml0TWFwOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVAgQ2FsbGVkIik7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoMnhfYml0bWFwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXBzRmxhc2gyeEJpdE1hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiY21fZmxhc2gyeF9iaXRtYXApLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHBzRmxhc2gyeEJpdE1hcCA9PSBOVUxMKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTWVtb3J5IGlzIG5vdCBhdmFpbGFibGUiKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJLyogUmVhZGluZyB0aGUgRmxhc2ggU2VjdGlvIEJpdCBtYXAgKi8KLQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCUJjbUdldEZsYXNoMnhTZWN0aW9uYWxCaXRNYXAoQWRhcHRlciwgcHNGbGFzaDJ4Qml0TWFwKTsKLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgcHNGbGFzaDJ4Qml0TWFwLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2JpdG1hcCkpKSB7Ci0JCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX1NFVF9BQ1RJVkVfU0VDVElPTjogewotCQllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbCA9IDA7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT04gQ2FsbGVkIik7Ci0KLQkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgZmxhc2ggc2VjdGlvbiB2YWwgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCVN0YXR1cyA9IEJjbVNldEFjdGl2ZVNlY3Rpb24oQWRhcHRlciwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJaWYgKFN0YXR1cykKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGYWlsZWQgdG8gbWFrZSBpdCdzIHByaW9yaXR5IEhpZ2hlc3QuIFN0YXR1cyAlZCIsIFN0YXR1cyk7Ci0KLQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OOiB7CisJY2FzZSBJT0NUTF9CQ01fSURFTlRJRllfQUNUSVZFX1NFQ1RJT046CiAJCS8qIFJpZ2h0IE5vdyB3ZSBhcmUgdGFraW5nIGNhcmUgb2Ygb25seSBEU0QgKi8KIAkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBmYWxzZTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OIGNhbGxlZCIpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkiSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OIGNhbGxlZCIpOwogCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9DT1BZX1NFQ1RJT046IHsKLQkJc3RydWN0IGJjbV9mbGFzaDJ4X2NvcHlfc2VjdGlvbiBzQ29weVNlY3RTdHJ1dCA9IHswfTsKLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9DT1BZX1NFQ1RJT04gIENhbGxlZCIpOwotCi0JCUFkYXB0ZXItPmJBbGxEU0RXcml0ZUFsbG93ID0gZmFsc2U7Ci0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NvcHlfc2VjdGlvbikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBDb3B5X1NlY3Rpb25fU3RydWN0IGZhaWxlZCB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJTb3VyY2UgU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGVzdGluYXRpb24gU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAib2Zmc2V0IDoleCIsIHNDb3B5U2VjdFN0cnV0Lm9mZnNldCk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIk5PQiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5udW1PZkJ5dGVzKTsKLQotCQlpZiAoSXNTZWN0aW9uRXhpc3RJbkZsYXNoKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pID09IGZhbHNlKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiU291cmNlIFNlY3Rpb248JXg+IGRvZXMgbm90IGV4aXN0IGluIEZsYXNoICIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoSXNTZWN0aW9uRXhpc3RJbkZsYXNoKEFkYXB0ZXIsIHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pID09IGZhbHNlKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGVzdGluYXRpbyBTZWN0aW9uPCV4PiBkb2VzIG5vdCBleGlzdCBpbiBGbGFzaCAiLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbikgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIGFuZCBEZXN0aW5hdGlvbiBzZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQiKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCXJldHVybiAtRUFDQ0VTOwotCQl9Ci0KLQkJaWYgKHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gSVNPX0lNQUdFMSB8fCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uID09IElTT19JTUFHRTIpIHsKLQkJCWlmIChJc05vbkNETGVzc0RldmljZShBZGFwdGVyKSkgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaXMgTm9uLUNETGVzcyBoZW5jZSB3b24ndCBoYXZlIElTTyAhISIpOwotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQl9IGVsc2UgaWYgKHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMgPT0gMCkgewotCQkJCVN0YXR1cyA9IEJjbUNvcHlJU08oQWRhcHRlciwgc0NvcHlTZWN0U3RydXQpOwotCQkJfSBlbHNlIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUGFydGlhbCBDb3B5IG9mIElTTyBzZWN0aW9uIGlzIG5vdCBBbGxvd2VkLi4iKTsKLQkJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCXJldHVybiBTdGF0dXM7Ci0JCX0KLQotCQlTdGF0dXMgPSBCY21Db3B5U2VjdGlvbihBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uLAotCQkJCQlzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uLCBzQ29weVNlY3RTdHJ1dC5vZmZzZXQsIHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMpOwotCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIX0NTX0lORk86IHsKLQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIiBJT0NUTF9CQ01fR0VUX0ZMQVNIX0NTX0lORk8gQ2FsbGVkIik7Ci0KLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKTsKLQkJaWYgKFN0YXR1cykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBoYXZlIGZsYXNoIik7Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpID09IFRSVUUpIHsKLQkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaDJ4X2NzX2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfSBlbHNlIHsKLQkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGJjbV9mbGFzaF9jc19pbmZvKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2hDU0luZm8sIHNpemVvZihzdHJ1Y3QgYmNtX2ZsYXNoX2NzX2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQlicmVhazsKLQotCWNhc2UgSU9DVExfQkNNX1NFTEVDVF9EU0Q6IHsKLQkJVUlOVCBTZWN0T2ZzZXQgPSAwOwotCQllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbDsKLQkJZUZsYXNoMnhTZWN0aW9uVmFsID0gTk9fU0VDVElPTl9WQUw7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TRUxFQ1RfRFNEIENhbGxlZCIpOwotCi0JCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgYmNtX2lvY3RsX2J1ZmZlcikpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVCkpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBmbGFzaCBzZWN0aW9uIHZhbCBmYWlsZWQiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUmVhZCBTZWN0aW9uIDolZCIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7Ci0JCWlmICgoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDApICYmCi0JCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDEpICYmCi0JCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDIpKSB7Ci0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJQYXNzZWQgc2VjdGlvbjwleD4gaXMgbm90IERTRCBzZWN0aW9uIiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJfQotCi0JCVNlY3RPZnNldCA9IEJjbUdldFNlY3Rpb25WYWxTdGFydE9mZnNldChBZGFwdGVyLCBlRmxhc2gyeFNlY3Rpb25WYWwpOwotCQlpZiAoU2VjdE9mc2V0ID09IElOVkFMSURfT0ZGU0VUKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUHJvdmlkZWQgU2VjdGlvbiB2YWwgPCVkPiBkb2VzIG5vdCBleGlzdCBpbiBGbGFzaCAyLngiLCBlRmxhc2gyeFNlY3Rpb25WYWwpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IFRSVUU7Ci0JCUFkYXB0ZXItPnVsRmxhc2hDYWxTdGFydCA9IFNlY3RPZnNldDsKLQkJQWRhcHRlci0+ZUFjdGl2ZURTRCA9IGVGbGFzaDJ4U2VjdGlvblZhbDsKLQl9Ci0JU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9OVk1fUkFXX1JFQUQ6IHsKLQkJc3RydWN0IGJjbV9udm1fcmVhZHdyaXRlIHN0TlZNUmVhZDsKLQkJSU5UIE5PQjsKLQkJSU5UIEJ1ZmZTaXplOwotCQlJTlQgUmVhZE9mZnNldCA9IDA7Ci0JCVVJTlQgUmVhZEJ5dGVzID0gMDsKLQkJUFVDSEFSIHBSZWFkQnVmZjsKLQkJdm9pZCBfX3VzZXIgKk91dFB1dEJ1ZmY7Ci0KLQkJaWYgKEFkYXB0ZXItPmVOVk1UeXBlICE9IE5WTV9GTEFTSCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk5WTSBUWVBFIGlzIG5vdCBGbGFzaCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciAxIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHNpemVvZihzdHJ1Y3QgYmNtX252bV9yZWFkd3JpdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCU5PQiA9IHN0TlZNUmVhZC51aU51bUJ5dGVzOwotCQkvKiBJbiBSYXctUmVhZCBtYXggQnVmZiBzaXplIDogNjRNQiAqLwotCi0JCWlmIChOT0IgPiBERUZBVUxUX0JVRkZfU0laRSkKLQkJCUJ1ZmZTaXplID0gREVGQVVMVF9CVUZGX1NJWkU7Ci0JCWVsc2UKLQkJCUJ1ZmZTaXplID0gTk9COwotCi0JCVJlYWRPZmZzZXQgPSBzdE5WTVJlYWQudWlPZmZzZXQ7Ci0JCU91dFB1dEJ1ZmYgPSBzdE5WTVJlYWQucEJ1ZmZlcjsKLQotCQlwUmVhZEJ1ZmYgPSBremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwUmVhZEJ1ZmYgPT0gTlVMTCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7Ci0JCQlTdGF0dXMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8Ci0JCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewotCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCWtmcmVlKHBSZWFkQnVmZik7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCi0JCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBUUlVFOwotCi0JCXdoaWxlIChOT0IpIHsKLQkJCWlmIChOT0IgPiBERUZBVUxUX0JVRkZfU0laRSkKLQkJCQlSZWFkQnl0ZXMgPSBERUZBVUxUX0JVRkZfU0laRTsKLQkJCWVsc2UKLQkJCQlSZWFkQnl0ZXMgPSBOT0I7Ci0KLQkJCS8qIFJlYWRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KLQkJCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkQnVmZiwgUmVhZE9mZnNldCwgUmVhZEJ5dGVzKTsKLQkJCWlmIChTdGF0dXMpIHsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOwotCi0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoT3V0UHV0QnVmZiwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOwotCQkJaWYgKFN0YXR1cykgewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IHRvIHVzZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJa2ZyZWUocFJlYWRCdWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCU5PQiA9IE5PQiAtIFJlYWRCeXRlczsKLQkJCWlmIChOT0IpIHsKLQkJCQlSZWFkT2Zmc2V0ID0gUmVhZE9mZnNldCArIFJlYWRCeXRlczsKLQkJCQlPdXRQdXRCdWZmID0gT3V0UHV0QnVmZiArIFJlYWRCeXRlczsKLQkJCX0KLQkJfQotCQlBZGFwdGVyLT5iRmxhc2hSYXdSZWFkID0gZmFsc2U7Ci0JCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJa2ZyZWUocFJlYWRCdWZmKTsKIAkJYnJlYWs7Ci0JfQogCi0JY2FzZSBJT0NUTF9CQ01fQ05UUkxNU0dfTUFTSzogewotCQlVTE9ORyBSeENudHJsTXNnQml0TWFzayA9IDA7CisJY2FzZSBJT0NUTF9CQ01fQ09QWV9TRUNUSU9OOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9jb3B5X3NlY3Rpb24oYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSk7Ci0JCWlmIChTdGF0dXMpIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgImNvcHkgb2YgSW9jdGwgYnVmZmVyIGlzIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIX0NTX0lORk86CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX2dldF9mbGFzaF9jc19pbmZvKGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpIHsKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQorCWNhc2UgSU9DVExfQkNNX1NFTEVDVF9EU0Q6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3NlbGVjdF9kc2QoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJ4Q250cmxNc2dCaXRNYXNrLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCQlpZiAoU3RhdHVzKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJjb3B5IG9mIGNvbnRyb2wgYml0IG1hc2sgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG4gR290IHVzZXIgZGVmaW5lZCBjbnRybCBtc2cgYml0IG1hc2sgOiVseCIsIFJ4Q250cmxNc2dCaXRNYXNrKTsKLQkJcFRhcmFuZy0+UnhDbnRybE1zZ0JpdE1hc2sgPSBSeENudHJsTXNnQml0TWFzazsKLQl9Ci0JYnJlYWs7CisJY2FzZSBJT0NUTF9CQ01fTlZNX1JBV19SRUFEOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9udm1fcmF3X3JlYWQoYXJncCwgQWRhcHRlcik7CisJCXJldHVybiBTdGF0dXM7CiAKLQljYXNlIElPQ1RMX0JDTV9HRVRfREVWSUNFX0RSSVZFUl9JTkZPOiB7Ci0JCXN0cnVjdCBiY21fZHJpdmVyX2luZm8gRGV2SW5mbzsKKwljYXNlIElPQ1RMX0JDTV9DTlRSTE1TR19NQVNLOgorCQlTdGF0dXMgPSBiY21fY2hhcl9pb2N0bF9jbnRybG1zZ19tYXNrKGFyZ3AsIEFkYXB0ZXIsIHBUYXJhbmcpOworCQlyZXR1cm4gU3RhdHVzOwogCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkNhbGxlZCBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GT1xuIik7CisJY2FzZSBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GTzoKKwkJU3RhdHVzID0gYmNtX2NoYXJfaW9jdGxfZ2V0X2RldmljZV9kcml2ZXJfaW5mbyhhcmdwLCBBZGFwdGVyKTsKKwkJcmV0dXJuIFN0YXR1czsKIAotCQltZW1zZXQoJkRldkluZm8sIDAsIHNpemVvZihEZXZJbmZvKSk7Ci0JCURldkluZm8uTWF4UkRNQnVmZmVyU2l6ZSA9IEJVRkZFUl80SzsKLQkJRGV2SW5mby51MzJEU0RTdGFydE9mZnNldCA9IEVFUFJPTV9DQUxQQVJBTV9TVEFSVDsKLQkJRGV2SW5mby51MzJSeEFsaWdubWVudENvcnJlY3Rpb24gPSAwOwotCQlEZXZJbmZvLnUzMk5WTVR5cGUgPSBBZGFwdGVyLT5lTlZNVHlwZTsKLQkJRGV2SW5mby51MzJJbnRlcmZhY2VUeXBlID0gQkNNX1VTQjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2Yoc3RydWN0IGJjbV9pb2N0bF9idWZmZXIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRGV2SW5mbykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkRldkluZm8sIHNpemVvZihEZXZJbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElPQ1RMX0JDTV9USU1FX1NJTkNFX05FVF9FTlRSWTogewotCQlzdHJ1Y3QgYmNtX3RpbWVfZWxhcHNlZCBzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IHswfTsKLQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlkgY2FsbGVkIik7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKHN0cnVjdCBiY21faW9jdGxfYnVmZmVyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LnVsNjRUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSBnZXRfc2Vjb25kcygpIC0gQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSwgc2l6ZW9mKHN0cnVjdCBiY21fdGltZV9lbGFwc2VkKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JYnJlYWs7CisJY2FzZSBJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlk6CisJCVN0YXR1cyA9IGJjbV9jaGFyX2lvY3RsX3RpbWVfc2luY2VfbmV0X2VudHJ5KGFyZ3AsIEFkYXB0ZXIpOworCQlyZXR1cm4gU3RhdHVzOwogCiAJY2FzZSBJT0NUTF9DTE9TRV9OT1RJRklDQVRJT046Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0NMT1NFX05PVElGSUNBVElPTiIpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCURCR19MVkxfQUxMLCAiSU9DVExfQ0xPU0VfTk9USUZJQ0FUSU9OIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jCmluZGV4IGNjOTFiNWUuLjYzMmY4MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuYwpAQCAtOTc1LDggKzk3NSw4IEBACiAJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OEV0aGVybmV0RGVzdE1hY0FkZHJlc3NMZW5ndGgpOwogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwKLQkJCQlEQkdfTFZMX0FMTCwgInU4RXRoZXJuZXRTb3VyY2VNQUNBZGRyZXNzWzZdOiAiCi0JCQkJIiVwTSIsIHBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUuCisJCQkJREJHX0xWTF9BTEwsICJ1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzc1s2XTogJXBNIiwKKwkJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgogCQkJCQkJdThFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3MpOwogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJ1OEV0aGVydHlwZUxlbmd0aDogMHglMDJYICIsCkBAIC0xMDkyLDE4ICsxMDkyLDE2IEBACiAJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sU291cmNlUG9ydFJhbmdlTGVuZ3RoKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsCi0JCQkJREJHX0xWTF9BTEwsICJ1OFByb3RvY29sU291cmNlUG9ydFJhbmdlWzRdOiAiCi0JCQkJIjB4JSpwaCAiLCA0LCBwc2ZDU1R5cGUtPgotCQkJCQkJY0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUuCisJCQkJREJHX0xWTF9BTEwsICJ1OFByb3RvY29sU291cmNlUG9ydFJhbmdlWzRdOiAweCUqcGggIiwKKwkJCQk0LCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgogCQkJCQkJdThQcm90b2NvbFNvdXJjZVBvcnRSYW5nZSk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInU4UHJvdG9jb2xEZXN0UG9ydFJhbmdlTGVuZ3RoOiAweCUwMlggIiwKIAkJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4UHJvdG9jb2xEZXN0UG9ydFJhbmdlTGVuZ3RoKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsCi0JCQkJREJHX0xWTF9BTEwsICJ1OFByb3RvY29sRGVzdFBvcnRSYW5nZVs0XTogIgotCQkJCSIweCUqcGggIiwgNCwgcHNmQ1NUeXBlLT4KLQkJCQkJCWNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgorCQkJCURCR19MVkxfQUxMLCAidThQcm90b2NvbERlc3RQb3J0UmFuZ2VbNF06IDB4JSpwaCAiLAorCQkJCTQsIHBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUuCiAJCQkJCQl1OFByb3RvY29sRGVzdFBvcnRSYW5nZSk7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInU4RXRoZXJuZXREZXN0TWFjQWRkcmVzc0xlbmd0aDogMHglMDJYICIsCkBAIC0xMTE4LDggKzExMTYsOCBAQAogCQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThFdGhlcm5ldERlc3RNYWNBZGRyZXNzTGVuZ3RoKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsCi0JCQkJREJHX0xWTF9BTEwsICJ1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzc1s2XTogIgotCQkJCSIlcE0iLCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLgorCQkJCURCR19MVkxfQUxMLCAidThFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3NbNl06ICVwTSIsCisJCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS4KIAkJCQkJCXU4RXRoZXJuZXRTb3VyY2VNQUNBZGRyZXNzKTsKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAidThFdGhlcnR5cGVMZW5ndGg6IDB4JTAyWCAiLCBwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4RXRoZXJ0eXBlTGVuZ3RoKTsKQEAgLTE2MzcsNiArMTYzNSw4IEBACiAJc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQgKnBzdEFkZEluZGljYXRpb24gPSBOVUxMOwogCXN0cnVjdCBiY21fY2hhbmdlX2luZGljYXRpb24gKnBzdENoYW5nZUluZGljYXRpb24gPSBOVUxMOwogCXN0cnVjdCBiY21fbGVhZGVyICpwTGVhZGVyID0gTlVMTDsKKwlJTlQgdWlTZWFyY2hSdWxlSW5kZXggPSAwOworCVVMT05HIHVsU0ZJRDsKIAogCS8qCiAJICogT3RoZXJ3aXNlIHRoZSBtZXNzYWdlIGNvbnRhaW5zIGEgdGFyZ2V0IGFkZHJlc3MgZnJvbSB3aGVyZSB3ZSBuZWVkIHRvCkBAIC0xNjYwLDcgKzE2NjAsNiBAQAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICIjIyMgVElEIFJFQ0VJVkVEICVkXG4iLCBwc3RBZGRJbmRpY2F0aW9uLT51MTZUSUQpOwogCXN3aXRjaCAocHN0QWRkSW5kaWNhdGlvbi0+dThUeXBlKSB7CiAJY2FzZSBEU0FfUkVROgotCXsKIAkJcExlYWRlci0+UExlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCk7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNlbmRpbmcgRFNBIFJlc3BvbnNlLi4uLlxuIik7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNFTkRJTkcgRFNBIFJFU1BPTlNFIFRPIE1BQyAlZCIsIHBMZWFkZXItPlBMZW5ndGgpOwpAQCAtMTY3MSwyMiArMTY3MCwxNiBAQAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICIgVkNJRCA9ICV4IiwgbnRvaHMocHN0QWRkSW5kaWNhdGlvbi0+dTE2VkNJRCkpOwogCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIChQVk9JRClBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwogCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKLQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgRFNBX1JTUDoKLQl7CiAJCXBMZWFkZXItPlBMZW5ndGggPSBzaXplb2Yoc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQpOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJTRU5ESU5HIERTQSBBQ0sgVE8gTUFDICVkIiwKIAkJCQlwTGVhZGVyLT5QTGVuZ3RoKTsKIAkJKigoc3RydWN0IGJjbV9hZGRfaW5kaWNhdGlvbl9hbHQgKikmKEFkYXB0ZXItPmNhRHN4UmVxUmVzcFtMRUFERVJfU0laRV0pKQogCQkJPSAqcHN0QWRkSW5kaWNhdGlvbjsKIAkJKChzdHJ1Y3QgYmNtX2FkZF9pbmRpY2F0aW9uX2FsdCAqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpLT51OFR5cGUgPSBEU0FfQUNLOwotCi0JfSAvKiBubyBicmVhayBoZXJlLi53ZSBzaG91bGQgZ28gZG93bi4gKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIERTQV9BQ0s6Ci0JewotCQlVSU5UIHVpU2VhcmNoUnVsZUluZGV4ID0gMDsKLQogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJWQ0lEOjB4JVgiLAogCQkJCW50b2hzKHBzdEFkZEluZGljYXRpb24tPnUxNlZDSUQpKTsKIAkJdWlTZWFyY2hSdWxlSW5kZXggPSBTZWFyY2hGcmVlU2ZpZChBZGFwdGVyKTsKQEAgLTE2OTQsNyArMTY4Nyw3IEBACiAJCQkJdWlTZWFyY2hSdWxlSW5kZXgpOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJEaXJlY3Rpb246MHglWCAiLAogCQkJCXBzdEFkZEluZGljYXRpb24tPnU4RGlyZWN0aW9uKTsKLQkJaWYgKCh1aVNlYXJjaFJ1bGVJbmRleCA8IE5PX09GX1FVRVVFUykpIHsKKwkJaWYgKHVpU2VhcmNoUnVsZUluZGV4IDwgTk9fT0ZfUVVFVUVTKSB7CiAJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0udWNEaXJlY3Rpb24gPQogCQkJCXBzdEFkZEluZGljYXRpb24tPnU4RGlyZWN0aW9uOwogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiYlZhbGlkOjB4JVggIiwKQEAgLTE3NjksMTAgKzE3NjIsOCBAQAogCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgRFNDX1JFUToKLQl7CiAJCXBMZWFkZXItPlBMZW5ndGggPSBzaXplb2Yoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbik7CiAJCXBzdENoYW5nZUluZGljYXRpb24gPSAoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbiAqKXBzdEFkZEluZGljYXRpb247CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlNFTkRJTkcgRFNDIFJFU1BPTlNFIFRPIE1BQyAlZCIsIHBMZWFkZXItPlBMZW5ndGgpOwpAQCAtMTc4MiwyNiArMTc3MywyMSBAQAogCiAJCUNvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgKFBWT0lEKUFkYXB0ZXItPmNhRHN4UmVxUmVzcCk7CiAJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwotCX0KLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBEU0NfUlNQOgotCXsKIAkJcExlYWRlci0+UExlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uKTsKIAkJcHN0Q2hhbmdlSW5kaWNhdGlvbiA9IChzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uICopcHN0QWRkSW5kaWNhdGlvbjsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiU0VORElORyBEU0MgQUNLIFRPIE1BQyAlZCIsIHBMZWFkZXItPlBMZW5ndGgpOwogCQkqKChzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uICopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSkgPSAqcHN0Q2hhbmdlSW5kaWNhdGlvbjsKIAkJKChzdHJ1Y3QgYmNtX2NoYW5nZV9pbmRpY2F0aW9uICopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSktPnU4VHlwZSA9IERTQ19BQ0s7Ci0JfQorCQkvKiBGQUxMVEhST1VHSCAqLwogCWNhc2UgRFNDX0FDSzoKLQl7Ci0JCVVJTlQgdWlTZWFyY2hSdWxlSW5kZXggPSAwOwotCiAJCXBzdENoYW5nZUluZGljYXRpb24gPSAoc3RydWN0IGJjbV9jaGFuZ2VfaW5kaWNhdGlvbiAqKXBzdEFkZEluZGljYXRpb247CiAJCXVpU2VhcmNoUnVsZUluZGV4ID0gU2VhcmNoU2ZpZChBZGFwdGVyLCBudG9obChwc3RDaGFuZ2VJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MzJTRklEKSk7CiAJCWlmICh1aVNlYXJjaFJ1bGVJbmRleCA+IE5PX09GX1FVRVVFUy0xKQogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlNGIGRvZXNuJ3QgZXhpc3QgZm9yIHdoaWNoIERTQ19BQ0sgaXMgcmVjZWl2ZWQiKTsKIAotCQlpZiAoKHVpU2VhcmNoUnVsZUluZGV4IDwgTk9fT0ZfUVVFVUVTKSkgeworCQlpZiAodWlTZWFyY2hSdWxlSW5kZXggPCBOT19PRl9RVUVVRVMpIHsKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS51Y0RpcmVjdGlvbiA9IHBzdENoYW5nZUluZGljYXRpb24tPnU4RGlyZWN0aW9uOwogCQkJaWYgKHBzdENoYW5nZUluZGljYXRpb24tPnNmQWN0aXZlU2V0LmJWYWxpZCA9PSBUUlVFKQogCQkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5iQWN0aXZlU2V0ID0gVFJVRTsKQEAgLTE4NDksMTMgKzE4MzUsOCBAQAogCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQl9Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgRFNEX1JFUToKLQl7Ci0JCVVJTlQgdWlTZWFyY2hSdWxlSW5kZXg7Ci0JCVVMT05HIHVsU0ZJRDsKLQogCQlwTGVhZGVyLT5QTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBiY21fZGVsX2luZGljYXRpb24pOwogCQkqKChzdHJ1Y3QgYmNtX2RlbF9pbmRpY2F0aW9uICopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSkgPSAqKChzdHJ1Y3QgYmNtX2RlbF9pbmRpY2F0aW9uICopcHN0QWRkSW5kaWNhdGlvbik7CiAKQEAgLTE4NzIsMTIgKzE4NTMsMTAgQEAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiU0VORElORyBEU0QgUkVTUE9OU0UgVE8gTUFDIik7CiAJCSgoc3RydWN0IGJjbV9kZWxfaW5kaWNhdGlvbiAqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpLT51OFR5cGUgPSBEU0RfUlNQOwogCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIChQVk9JRClBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwotCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIERTRF9SU1A6Ci0JewogCQkvKiBEbyBub3RoaW5nIGFzIFNGIGhhcyBhbHJlYWR5IGdvdCBEZWxldGVkICovCi0JfQotCWJyZWFrOworCQlicmVhazsKIAljYXNlIERTRF9BQ0s6CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIkRTRCBBQ0sgUmNkLCBsZXQgQXBwIGhhbmRsZSBpdFxuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0REUkluaXQuYwppbmRleCBlZDI4NWIyLi5mMWQ3Y2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0REUkluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0REUkluaXQuYwpAQCAtMyw3ICszLDcgQEAKIAogCiAjZGVmaW5lIEREUl9EVU1QX0lOVEVSTkFMX0RFVklDRV9NRU1PUlkgMHhCRkMwMkIwMAotI2RlZmluZSBNSVBTX0NMT0NLX1JFRyAJMHgwZjAwMDgyMAorI2RlZmluZSBNSVBTX0NMT0NLX1JFRyAweDBmMDAwODIwCiAKIC8qIEREUiBJTklULTEzM01oeiAqLwogI2RlZmluZSBUM19TS0lQX0NMT0NLX1BST0dSQU1fRFVNUF8xMzNNSFogMTIgIC8qIGluZGV4IGZvciAweDBGMDA3MDAwICovCkBAIC04MTgsMTMgKzgxOCwxMyBAQAogCWlmICgoQWRhcHRlci0+Y2hpcF9pZCAhPSAgQkNTMjIwXzIpICYmCiAJCShBZGFwdGVyLT5jaGlwX2lkICE9ICBCQ1MyMjBfMkJDKSAmJgogCQkoQWRhcHRlci0+Y2hpcF9pZCAhPSBCQ1MyMjBfMykpIHsKLQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMDgzMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMDgzMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJCXVpUmVzZXRWYWx1ZSB8PSAweDQ0OwotCQlyZXR2YWwgPSB3cm1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwODMwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCXJldHZhbCA9IHdybWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwODMwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCXJldHVybiByZXR2YWw7CkBAIC04NzEsNyArODcxLDcgQEAKIAljYXNlIDB4YmVjZTAxMjE6CiAJY2FzZSAweGJlY2UwMTMwOgogCWNhc2UgMHhiZWNlMDMwMDoKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkREUiBTZXR0aW5nOiAleFxuIiwgQWRhcHRlci0+RERSU2V0dGluZyk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiRERSIFNldHRpbmc6ICV4XG4iLCBBZGFwdGVyLT5ERFJTZXR0aW5nKTsKIAkJc3dpdGNoIChBZGFwdGVyLT5ERFJTZXR0aW5nKSB7CiAJCWNhc2UgRERSXzgwX01IWjoKIAkJCXBzRERSU2V0dGluZyA9IGFzVDNfRERSU2V0dGluZzgwTUh6OwpAQCAtOTMzLDcgKzkzMyw3IEBACiAJfQogCiAJdmFsdWUgPSAwOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiUmVnaXN0ZXIgQ291bnQgaXMgPSVsdVxuIiwgUmVnQ291bnQpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIENvdW50IGlzID0lbHVcbiIsIFJlZ0NvdW50KTsKIAl3aGlsZSAoUmVnQ291bnQgJiYgIXJldHZhbCkgewogCQlpZiAodWlDbG9ja1NldHRpbmcgJiYgcHNERFJTZXR0aW5nLT51bFJlZ0FkZHJlc3MgPT0gTUlQU19DTE9DS19SRUcpCiAJCQl2YWx1ZSA9IHVpQ2xvY2tTZXR0aW5nOwpAQCAtOTkwLDEyICs5OTAsMTIgQEAKIAkJICogd2Ugd2lsbCBjaGFuZ2UgdGhpcyB3aGVuIHdlIHdpbGwgaGF2ZSBpbnRlcm5hbCBQTVUuCiAJCSAqLwogCQlpZiAoQWRhcHRlci0+UG11TW9kZSA9PSBIWUJSSURfTU9ERV83QykgewotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CkBAIC0xMDA2LDEyICsxMDA2LDEyIEBACiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CiAJCQl9Ci0JCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwpAQCAtMTAyNCwxMiArMTAyNCwxMiBAQAogCQkJfQogCQl9IGVsc2UgaWYgKEFkYXB0ZXItPlBtdU1vZGUgPT0gSFlCUklEX01PREVfNikgewogCi0JCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CisJCQlyZXR2YWwgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfQotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKQEAgLTEwNDAsMTIgKzEwNDAsMTIgQEAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgQ01IT1NULCBSRE0sIERCR19MVkxfQUxMLCAiJXM6JWQgUkRNIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfQotCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsKFVJTlQpMHgwZjAwMGMwMCwgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOworCQkJcmV0dmFsID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIENNSE9TVCwgUkRNLCBEQkdfTFZMX0FMTCwgIiVzOiVkIFJETSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0dXJuIHJldHZhbDsKIAkJCX0KLQkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLChVSU5UKTB4MGYwMDBjMDAsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXJldHZhbCA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVCkweDBmMDAwYzAwLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBDTUhPU1QsIFJETSwgREJHX0xWTF9BTEwsICIlczolZCBSRE0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldHVybiByZXR2YWw7CkBAIC0xMDk0LDggKzEwOTQsOCBAQAogCQkJUmVnQ291bnQgLT0gVDNMUF9TS0lQX0NMT0NLX1BST0dSQU1fRFVNUF8xMzNNSFo7CiAJCQlwc0REUlNldHRpbmcgKz0gVDNMUF9TS0lQX0NMT0NLX1BST0dSQU1fRFVNUF8xMzNNSFo7CiAJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgcmV0dXJuIC1FSU5WQUw7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKIApAQCAtMTIxNSw3ICsxMjE1LDcgQEAKIAkJdWxfZGRyX3NldHRpbmdfbG9hZF9hZGRyICs9IHNpemVvZihVTE9ORyk7CiAJCWlmICghcmV0dmFsKSB7CiAJCQlpZiAoYk92ZXJyaWRlU2VsZlJlZnJlc2ggJiYgKHBzRERSU2V0dGluZy0+dWxSZWdBZGRyZXNzID09IDB4MEYwMDcwMTgpKSB7Ci0JCQkJdmFsdWUgPSAocHNERFJTZXR0aW5nLT51bFJlZ1ZhbHVlIHwoMTw8OCkpOworCQkJCXZhbHVlID0gKHBzRERSU2V0dGluZy0+dWxSZWdWYWx1ZSB8ICgxPDw4KSk7CiAJCQlpZiAoU1RBVFVTX1NVQ0NFU1MgIT0gd3JtYWx0KEFkYXB0ZXIsIHVsX2Rkcl9zZXR0aW5nX2xvYWRfYWRkciwKIAkJCQkmdmFsdWUsIHNpemVvZih2YWx1ZSkpKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYwppbmRleCA5NGYzMjcyLi43YzA0YzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYwpAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCi0KKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgSW50ZXJmYWNlVXNidGFibGVbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UMykgfSwKIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UM0IpIH0sCkBAIC0zMCwxOSArMzAsMjIgQEAKIAlpbnQgaSA9IDA7CiAKIAkvKiBXYWtlIHVwIHRoZSB3YWl0X3F1ZXVlLi4uICovCi0JaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CisJaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJgorCQkJQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgewogCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0hBTFQ7CiAJCXdha2VfdXAoJnBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAl9CiAJcmVzZXRfY2FyZF9wcm9jKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKIAkvKgotCSAqIHdvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyIGV2ZXJ5IDEwMCBtcwotCSAqIHRvIGFjY2VydGFpbiB0aGUgZGV2aWNlIGlzIG5vdCBiZWluZyBhY2Nlc3NlZC4gQWZ0ZXIgdGhpcyBObyBSRE0vV1JNIHNob3VsZCBiZSBtYWRlLgorCSAqIHdvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyCisJICogZXZlcnkgMTAwIG1zIHRvIGFjY2VydGFpbiB0aGUgZGV2aWNlIGlzIG5vdCBiZWluZyBhY2Nlc3NlZC4gQWZ0ZXIKKwkgKiB0aGlzIE5vIFJETS9XUk0gc2hvdWxkIGJlIG1hZGUuCiAJICovCiAJd2hpbGUgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+RGV2aWNlQWNjZXNzKSB7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJIkRldmljZSBpcyBiZWluZyBhY2Nlc3NlZC5cbiIpOworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwKKwkJCQlEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCSJEZXZpY2UgaXMgYmVpbmcgYWNjZXNzZWQuXG4iKTsKIAkJbXNsZWVwKDEwMCk7CiAJfQogCS8qIEZyZWUgaW50ZXJydXB0IFVSQiAqLwpAQCAtNzEsNiArNzQsNyBAQAogewogCXUzMiB1bFJlZzsKIAlpbnQgYnl0ZXM7CisJc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqaW50ZXJmYWNlQWRhcHRlcjsKIAogCS8qIFByb2dyYW0gRVAyIE1BWF9QS1RfU0laRSAqLwogCXVsUmVnID0gbnRvaGwoRVAyX01QU19SRUcpOwpAQCAtODAsNyArODQsOSBAQAogCiAJdWxSZWcgPSBudG9obChFUDJfQ0ZHX1JFRyk7CiAJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEzMiwgNCwgVFJVRSk7Ci0JaWYgKCgoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqKShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKS0+YkhpZ2hTcGVlZERldmljZSA9PSBUUlVFKSB7CisJaW50ZXJmYWNlQWRhcHRlciA9CisJCShzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICopKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcik7CisJaWYgKGludGVyZmFjZUFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UpIHsKIAkJdWxSZWcgPSBudG9obChFUDJfQ0ZHX0lOVCk7CiAJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMzYsIDQsIFRSVUUpOwogCX0gZWxzZSB7CkBAIC05OCw4ICsxMDQsOCBAQAogCS8qIFByb2dyYW0gVFggRVAgYXMgaW50ZXJydXB0KEFsdGVybmF0ZSBTZXR0aW5nKSAqLwogCWJ5dGVzID0gcmRtYWx0KEFkYXB0ZXIsIDB4MEYwMTEwRjgsICZ1bFJlZywgc2l6ZW9mKHUzMikpOwogCWlmIChieXRlcyA8IDApIHsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJInJlYWRpbmcgb2YgVHggRVAgZmFpbGVkXG4iKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJREJHX0xWTF9BTEwsICJyZWFkaW5nIG9mIFR4IEVQIGZhaWxlZFxuIik7CiAJCXJldHVybjsKIAl9CiAJdWxSZWcgfD0gMHg2OwpAQCAtMTUwLDcgKzE1Niw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAkvKiBSZXNlcnZlIG9uZSBleHRyYSBxdWV1ZSBmb3IgdGhlIGJpdC1idWNrZXQgKi8KLQluZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyKSwgTk9fT0ZfUVVFVUVTKzEpOworCW5kZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIpLAorCQkJTk9fT0ZfUVVFVUVTICsgMSk7CiAJaWYgKG5kZXYgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsIERSVl9OQU1FICI6IG5vIG1lbW9yeSBmb3IgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNjksMTMgKzE3NiwxNCBAQAogCiAJLyoKIAkgKiBUZWNobmljYWxseSwgb25lIGNhbiBzdGFydCB1c2luZyBCQ01fREVCVUdfUFJJTlQgYWZ0ZXIgdGhpcyBwb2ludC4KLQkgKiBIb3dldmVyLCByZWFsaXplIHRoYXQgYnkgZGVmYXVsdCB0aGUgVHlwZS9TdWJ0eXBlIGJpdG1hcHMgYXJlIGFsbCB6ZXJvIG5vdzsKLQkgKiBzbyBubyBwcmludHMgd2lsbCBhY3R1YWxseSBhcHBlYXIgdW50aWwgdGhlIFRlc3RBcHAgdHVybnMgb24gZGVidWcgcGF0aHMgdmlhCi0JICogdGhlIGlvY3RsKCk7IHNvIHByYWN0aWNhbGx5IHNwZWFraW5nLCBpbiBlYXJseSBpbml0LCBubyBsb2dnaW5nIGhhcHBlbnMuCisJICogSG93ZXZlciwgcmVhbGl6ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIFR5cGUvU3VidHlwZSBiaXRtYXBzIGFyZSBhbGwKKwkgKiB6ZXJvIG5vdzsgc28gbm8gcHJpbnRzIHdpbGwgYWN0dWFsbHkgYXBwZWFyIHVudGlsIHRoZSBUZXN0QXBwIHR1cm5zCisJICogb24gZGVidWcgcGF0aHMgdmlhIHRoZSBpb2N0bCgpOyBzbyBwcmFjdGljYWxseSBzcGVha2luZywgaW4gZWFybHkKKwkgKiBpbml0LCBubyBsb2dnaW5nIGhhcHBlbnMuCiAJICoKLQkgKiBBIHNvbHV0aW9uICh1c2VkIGJlbG93KTogd2UgZXhwbGljaXRseSBzZXQgdGhlIGJpdG1hcHMgdG8gMSBmb3IgVHlwZT1EQkdfVFlQRV9JTklURVhJVAotCSAqIGFuZCBBTEwgc3VidHlwZSdzIG9mIHRoZSBzYW1lLiBOb3cgYWxsIGJjbSBkZWJ1ZyBzdGF0ZW1lbnRzIGdldCBsb2dnZWQsIGVuYWJsaW5nIGRlYnVnCi0JICogZHVyaW5nIGVhcmx5IGluaXQuCisJICogQSBzb2x1dGlvbiAodXNlZCBiZWxvdyk6IHdlIGV4cGxpY2l0bHkgc2V0IHRoZSBiaXRtYXBzIHRvIDEgZm9yCisJICogVHlwZT1EQkdfVFlQRV9JTklURVhJVCBhbmQgQUxMIHN1YnR5cGUncyBvZiB0aGUgc2FtZS4gTm93IGFsbCBiY20KKwkgKiBkZWJ1ZyBzdGF0ZW1lbnRzIGdldCBsb2dnZWQsIGVuYWJsaW5nIGRlYnVnIGR1cmluZyBlYXJseSBpbml0LgogCSAqIEZ1cnRoZXIsIHdlIHR1cm4gdGhpcyBPRkYgb25jZSBpbml0X21vZHVsZSgpIGNvbXBsZXRlcy4KIAkgKi8KIApAQCAtMTkxLDcgKzE5OSw3IEBACiAKIAkvKiBBbGxvY2F0ZSBpbnRlcmZhY2UgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KIAlwc0ludGZBZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciksCi0JCQkJR0ZQX0tFUk5FTCk7CisJCQlHRlBfS0VSTkVMKTsKIAlpZiAocHNJbnRmQWRhcHRlciA9PSBOVUxMKSB7CiAJCUFkYXB0ZXJGcmVlKHBzQWRhcHRlcik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjA1LDcgKzIxMyw3IEBACiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwc0ludGZBZGFwdGVyKTsKIAogCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkicHNJbnRmQWRhcHRlciAweCVwXG4iLCBwc0ludGZBZGFwdGVyKTsKKwkJCSJwc0ludGZBZGFwdGVyIDB4JXBcbiIsIHBzSW50ZkFkYXB0ZXIpOwogCXJldHZhbCA9IEludGVyZmFjZUFkYXB0ZXJJbml0KHBzSW50ZkFkYXB0ZXIpOwogCWlmIChyZXR2YWwpIHsKIAkJLyogSWYgdGhlIEZpcm13YXJlL0NmZyBGaWxlIGlzIG5vdCBwcmVzZW50CkBAIC0yMTMsMTIgKzIyMSwxMyBAQAogCQkgKiBkb3dubG9hZCB0aGUgZmlsZXMuCiAJCSAqLwogCQlpZiAoLUVOT0VOVCA9PSByZXR2YWwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCSJGaWxlIE5vdCBGb3VuZC4gIFVzZSBhcHAgdG8gZG93bmxvYWQuXG4iKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiRmlsZSBOb3QgRm91bmQuICBVc2UgYXBwIHRvIGRvd25sb2FkLlxuIik7CiAJCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAJCX0KLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkiSW50ZXJmYWNlQWRhcHRlckluaXQgZmFpbGVkLlxuIik7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJREJHX0xWTF9BTEwsICJJbnRlcmZhY2VBZGFwdGVySW5pdCBmYWlsZWQuXG4iKTsKIAkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAkJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJCXVzYl9wdXRfZGV2KHVkZXYpOwpAQCAtMjI4LDcgKzIzNywxMCBAQAogCWlmIChwc0FkYXB0ZXItPmNoaXBfaWQgPiBUMykgewogCQl1aW50MzJfdCB1aU5hY2taZXJvTGVuZ3RoSW50ID0gNDsKIAotCQlyZXR2YWwgPSB3cm1hbHQocHNBZGFwdGVyLCBESVNBQkxFX1VTQl9aRVJPX0xFTl9JTlQsICZ1aU5hY2taZXJvTGVuZ3RoSW50LCBzaXplb2YodWlOYWNrWmVyb0xlbmd0aEludCkpOworCQlyZXR2YWwgPQorCQkJd3JtYWx0KHBzQWRhcHRlciwgRElTQUJMRV9VU0JfWkVST19MRU5fSU5ULAorCQkJCQkmdWlOYWNrWmVyb0xlbmd0aEludCwKKwkJCQkJc2l6ZW9mKHVpTmFja1plcm9MZW5ndGhJbnQpKTsKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAJfQpAQCAtMjQyLDkgKzI1NCwxMSBAQAogCQkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7CiAJCQl1c2JfZW5hYmxlX2F1dG9zdXNwZW5kKHVkZXYpOwogCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZpbnRmLT5kZXYsIDEpOwotCQkJSU5JVF9XT1JLKCZwc0ludGZBZGFwdGVyLT51c2JTdXNwZW5kV29yaywgcHV0VXNiU3VzcGVuZCk7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiRW5hYmxpbmcgVVNCIEF1dG8tU3VzcGVuZFxuIik7CisJCQlJTklUX1dPUksoJnBzSW50ZkFkYXB0ZXItPnVzYlN1c3BlbmRXb3JrLAorCQkJCQlwdXRVc2JTdXNwZW5kKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiRW5hYmxpbmcgVVNCIEF1dG8tU3VzcGVuZFxuIik7CiAjZW5kaWYKIAkJfSBlbHNlIHsKIAkJCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwpAQCAtMjcxLDcgKzI4NSw3IEBACiAJaWYgKHBzQWRhcHRlci0+YkRvU3VzcGVuZCkKIAkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CiAKLQlwc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRSA7CisJcHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9IFRSVUU7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlJbnRlcmZhY2VBZGFwdGVyRnJlZShwc0ludGZBZGFwdGVyKTsKIAl1c2JfcHV0X2Rldih1ZGV2KTsKQEAgLTI4NSw4ICsyOTksMTAgQEAKIAkJcHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAocHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiID09IE5VTEwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiQ2FuJ3QgYWxsb2NhdGUgVHggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJDYW4ndCBhbGxvY2F0ZSBUeCB1cmIgZm9yIGluZGV4ICVkXG4iLAorCQkJCQlpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQpAQCAtMjk1LDE5ICszMTEsMjUgQEAKIAkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiID09IE5VTEwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCB1cmIgZm9yIGluZGV4ICVkXG4iLAorCQkJCQlpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKE1BWF9EQVRBX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJa21hbGxvYyhNQVhfREFUQV9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggYnVmZmVyIGZvciBpbmRleCAlZFxuIiwgaSk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCBidWZmZXIgZm9yIGluZGV4ICVkXG4iLAorCQkJCQlpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IE1BWF9EQVRBX0JVRkZFUl9TSVpFOworCQlwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPQorCQkJTUFYX0RBVEFfQlVGRkVSX1NJWkU7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzIyLDI0ICszNDQsMjkgQEAKIAkJcHJfZXJyKERSVl9OQU1FICJJbml0Q2FyZEFuZERvd25sb2FkRmlybXdhcmUgZmFpbGVkLlxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCWlmIChUUlVFID09IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSkgeworCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpIHsKIAkJaWYgKFN0YXJ0SW50ZXJydXB0VXJiKHBzSW50ZkFkYXB0ZXIpKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCSJDYW5ub3Qgc2VuZCBpbnRlcnJ1cHQgaW4gVVJCXG4iKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCURCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCURCR19MVkxfQUxMLAorCQkJCQkiQ2Fubm90IHNlbmQgaW50ZXJydXB0IGluIFVSQlxuIik7CiAJCX0KIAogCQkvKgotCQkgKiBub3cgcmVnaXN0ZXIgdGhlIGNudHJsIGludGVyZmFjZS4KLQkJICogYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIGYvdyB3YWl0aW5nIGZvciA1IHNlYyB0byBnZXQgdGhlIG1haWxib3ggaW50ZXJydXB0LgorCQkgKiBub3cgcmVnaXN0ZXIgdGhlIGNudHJsIGludGVyZmFjZS4gIGFmdGVyIGRvd25sb2FkaW5nIHRoZSBmL3cKKwkJICogd2FpdGluZyBmb3IgNSBzZWMgdG8gZ2V0IHRoZSBtYWlsYm94IGludGVycnVwdC4KIAkJICovCiAJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lID0gZmFsc2U7Ci0JCXZhbHVlID0gd2FpdF9ldmVudF90aW1lb3V0KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAotCQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSwgNSpIWik7CisJCXZhbHVlID0gd2FpdF9ldmVudF90aW1lb3V0KAorCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAorCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLAorCQkJCTUgKiBIWik7CiAKIAkJaWYgKHZhbHVlID09IDApCiAJCQlwcl9lcnIoRFJWX05BTUUgIjogVGltZW91dCB3YWl0aW5nIGZvciBtYWlsYm94IGludGVycnVwdC5cbiIpOwogCi0JCWlmIChyZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKSA8IDApIHsKKwkJaWYgKHJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZSgKKwkJCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKSA8IDApIHsKIAkJCXByX2VycihEUlZfTkFNRSAiOiBSZWdpc3RlciBDb250cm9sIERldmljZSBmYWlsZWQuXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0zNDcsODEgKzM3NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9udW0oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuIGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF90eXBlKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2Rpcl9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfeGZlcl9idWxrKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09Ci0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF94ZmVyX2ludChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX2luKGVwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuIGJjbV91c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfaW4oZXBkKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfaXNvY19pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpOwotfQotCiBzdGF0aWMgaW50IEludGVyZmFjZUFkYXB0ZXJJbml0KHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKnBzSW50ZkFkYXB0ZXIpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKQEAgLTQyOSwyMyArMzgxLDI3IEBACiAJc2l6ZV90IGJ1ZmZlcl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJaW50IHJldHZhbCA9IDA7Ci0JaW50IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSAwIDsKKwlpbnQgdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IDA7CiAJYm9vbCBiQmNtMTYgPSBmYWxzZTsKIAlVSU5UIHVpRGF0YSA9IDA7CiAJaW50IGJ5dGVzOwogCiAJLyogU3RvcmUgdGhlIHVzYiBkZXYgaW50byBpbnRlcmZhY2UgYWRhcHRlciAqLwotCXBzSW50ZkFkYXB0ZXItPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSkpOworCXBzSW50ZkFkYXB0ZXItPnVkZXYgPQorCQl1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSkpOwogCi0JcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9IChwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CisJcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9CisJCShwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5pbnRlcmZhY2VfcmRtID0gQmNtUkRNOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3dybSA9IEJjbVdSTTsKIAogCWJ5dGVzID0gcmRtYWx0KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgQ0hJUF9JRF9SRUcsCi0JCQkodTMyICopJihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpLCBzaXplb2YodTMyKSk7CisJCQkodTMyICopICYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKSwKKwkJCXNpemVvZih1MzIpKTsKIAlpZiAoYnl0ZXMgPCAwKSB7CiAJCXJldHZhbCA9IGJ5dGVzOwotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDSElQIElEIFJlYWQgRmFpbGVkXG4iKTsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJDSElQIElEIFJlYWQgRmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTQ1Myw4MSArNDA5LDExOSBAQAogCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgJj0gfjB4RjA7CiAKIAlkZXZfaW5mbygmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LCAiUkRNIENoaXAgSUQgMHglbHhcbiIsCi0JCSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpOworCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKTsKIAogCWlmYWNlX2Rlc2MgPSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCiAJaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA9PSBUM0IpIHsKLQkJLyogVDNCIGRldmljZSB3aWxsIGhhdmUgRUVQUk9NLCBjaGVjayBpZiBFRVBST00gaXMgcHJvcGVyIGFuZCBCQ00xNiBjYW4gYmUgZG9uZSBvciBub3QuICovCisJCS8qIFQzQiBkZXZpY2Ugd2lsbCBoYXZlIEVFUFJPTSwgY2hlY2sgaWYgRUVQUk9NIGlzIHByb3BlciBhbmQKKwkJICogQkNNMTYgY2FuIGJlIGRvbmUgb3Igbm90LiAqLwogCQlCZWNlZW1FRVBST01CdWxrUmVhZChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsICZ1aURhdGEsIDB4MCwgNCk7CiAJCWlmICh1aURhdGEgPT0gQkVDTSkKIAkJCWJCY20xNiA9IFRSVUU7CiAKLQkJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwgIm51bWJlciBvZiBhbHRlcm5hdGUgc2V0dGluZyAlZFxuIiwKLQkJCSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nKTsKKwkJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwKKwkJCQkibnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5nICVkXG4iLAorCQkJCXBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcpOwogCiAJCWlmIChiQmNtMTYgPT0gVFJVRSkgewotCQkJLyogc2VsZWN0aW5nIGFsdGVybmF0ZSBzZXR0aW5nIG9uZSBhcyBhIGRlZmF1bHQgc2V0dGluZyBmb3IgSGlnaCBTcGVlZCAgbW9kZW0uICovCisJCQkvKiBzZWxlY3RpbmcgYWx0ZXJuYXRlIHNldHRpbmcgb25lIGFzIGEgZGVmYXVsdCBzZXR0aW5nCisJCQkgKiBmb3IgSGlnaCBTcGVlZCAgbW9kZW0uICovCiAJCQlpZiAocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSkKLQkJCQlyZXR2YWwgPSB1c2Jfc2V0X2ludGVyZmFjZShwc0ludGZBZGFwdGVyLT51ZGV2LCBERUZBVUxUX1NFVFRJTkdfMCwgQUxURVJOQVRFX1NFVFRJTkdfMSk7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiQkNNMTYgaXMgYXBwbGljYWJsZSBvbiB0aGlzIGRvbmdsZVxuIik7Ci0JCQlpZiAocmV0dmFsIHx8IChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IGZhbHNlKSkgewotCQkJCXVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSBFUDIgOworCQkJCXJldHZhbCA9IHVzYl9zZXRfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCQkJCQlERUZBVUxUX1NFVFRJTkdfMCwKKwkJCQkJCUFMVEVSTkFURV9TRVRUSU5HXzEpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwKKwkJCQkJREJHX0xWTF9BTEwsCisJCQkJCSJCQ00xNiBpcyBhcHBsaWNhYmxlIG9uIHRoaXMgZG9uZ2xlXG4iKTsKKwkJCWlmIChyZXR2YWwgfHwgIXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UpIHsKKwkJCQl1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gRVAyOwogCQkJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W0VQMl0uZGVzYzsKLQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkJICJJbnRlcmZhY2UgYWx0c2V0dGluZyBmYWlsZWQgb3IgbW9kZW0gaXMgY29uZmlndXJlZCB0byBGdWxsIFNwZWVkLCBoZW5jZSB3aWxsIHdvcmsgb24gZGVmYXVsdCBzZXR0aW5nIDBcbiIpOworCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQkJREJHX0xWTF9BTEwsCisJCQkJCQkiSW50ZXJmYWNlIGFsdHNldHRpbmcgZmFpbGVkIG9yIG1vZGVtIGlzIGNvbmZpZ3VyZWQgdG8gRnVsbCBTcGVlZCwgaGVuY2Ugd2lsbCB3b3JrIG9uIGRlZmF1bHQgc2V0dGluZyAwXG4iKTsKIAkJCQkvKgotCQkJCSAqIElmIE1vZGVtIGlzIGhpZ2ggc3BlZWQgZGV2aWNlIEVQMiBzaG91bGQgYmUgSU5UIE9VVCBFbmQgcG9pbnQKLQkJCQkgKiBJZiBNb2RlIGlzIEZTIHRoZW4gRVAyIHNob3VsZCBiZSBidWxrIGVuZCBwb2ludAorCQkJCSAqIElmIE1vZGVtIGlzIGhpZ2ggc3BlZWQgZGV2aWNlIEVQMiBzaG91bGQgYmUKKwkJCQkgKiBJTlQgT1VUIEVuZCBwb2ludAorCQkJCSAqCisJCQkJICogSWYgTW9kZSBpcyBGUyB0aGVuIEVQMiBzaG91bGQgYmUgYnVsayBlbmQKKwkJCQkgKiBwb2ludAogCQkJCSAqLwotCQkJCWlmICgoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gVFJVRSkgJiYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gZmFsc2UpKQotCQkJCQl8fCAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gZmFsc2UpICYmIChiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSA9PSBmYWxzZSkpKSB7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCQkJIkNvbmZpZ3VyaW5nIHRoZSBFRVBST01cbiIpOworCQkJCWlmICgocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSAmJgorCQkJCQkJCSF1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpIHx8CisJCQkJCQkoIXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgJiYKKwkJCQkJCSAhdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQlEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJCSJDb25maWd1cmluZyB0aGUgRUVQUk9NXG4iKTsKIAkJCQkJLyogY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludCAqLwotCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOworCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTSgKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCiAJCQkJCS8qCi0JCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkCi0JCQkJCSAqICBpbiBVU0IgZGVzY3JpcHRvciBpdCB3aWxsIHNob3cgZmFpbCBhbmQgcmUtZW51bWVyYXRlCi0JCQkJCSAqIHRoZSBkZXZpY2UKKwkJCQkJICogSXQgcmVzZXRzIHRoZSBkZXZpY2UgYW5kIGlmIGFueSB0aGluZworCQkJCQkgKiBnZXRzIGNoYW5nZWQgaW4gVVNCIGRlc2NyaXB0b3IgaXQKKwkJCQkJICogd2lsbCBzaG93IGZhaWwgYW5kIHJlLWVudW1lcmF0ZSB0aGUKKwkJCQkJICogZGV2aWNlCiAJCQkJCSAqLwotCQkJCQlyZXR2YWwgPSB1c2JfcmVzZXRfZGV2aWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYpOworCQkJCQlyZXR2YWwgPSB1c2JfcmVzZXRfZGV2aWNlKAorCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnVkZXYpOwogCQkJCQlpZiAocmV0dmFsKSB7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkJCQkicmVzZXQgZmFpbGVkLiAgUmUtZW51bWVyYXRpbmcgdGhlIGRldmljZS5cbiIpOwotCQkJCQkJcmV0dXJuIHJldHZhbCA7CisJCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQkJRFJWX0VOVFJZLAorCQkJCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKKwkJCQkJCXJldHVybiByZXR2YWw7CiAJCQkJCX0KIAogCQkJCX0KLQkJCQlpZiAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gZmFsc2UpICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7CisJCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlICYmCisJCQkJICAgIHVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKIAkJCQkJLyogT25jZSBCVUxLIGlzIHNlbGVjdGVkIGluIEZTIG1vZGUuIFJldmVydCBpdCBiYWNrIHRvIElOVC4gRWxzZSBVU0JfSUYgd2lsbCBmYWlsLiAqLwogCQkJCQlVSU5UIF91aURhdGEgPSBudG9obChFUDJfQ0ZHX0lOVCk7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAotCQkJCQkJIlJldmVydGluZyBCdWxrIHRvIElOVCBhcyBpdCBpcyBpbiBGdWxsIFNwZWVkIG1vZGUuXG4iKTsKLQkJCQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgKFBVQ0hBUikmX3VpRGF0YSwgMHgxMzYsIDQsIFRSVUUpOworCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQkJCURCR19UWVBFX0lOSVRFWElULAorCQkJCQkJCURSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkJIlJldmVydGluZyBCdWxrIHRvIElOVCBhcyBpdCBpcyBpbiBGdWxsIFNwZWVkIG1vZGUuXG4iKTsKKwkJCQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKAorCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQkoUFVDSEFSKSAmIF91aURhdGEsCisJCQkJCQkJMHgxMzYsIDQsIFRSVUUpOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQNCA7CisJCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQNDsKIAkJCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtFUDRdLmRlc2M7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCSJDaG9vc2luZyBBbHRTZXR0aW5nIGFzIGEgZGVmYXVsdCBzZXR0aW5nLlxuIik7Ci0JCQkJaWYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gZmFsc2UpIHsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCQkiRG9uZ2xlIGRvZXMgbm90IGhhdmUgQkNNMTYgRml4LlxuIik7CisJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCURCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksCisJCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJCSJDaG9vc2luZyBBbHRTZXR0aW5nIGFzIGEgZGVmYXVsdCBzZXR0aW5nLlxuIik7CisJCQkJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwKKwkJCQkJCQlEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJCSJEb25nbGUgZG9lcyBub3QgaGF2ZSBCQ00xNiBGaXguXG4iKTsKIAkJCQkJLyogY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludCBhbmQgdXNlIEVQNCBpbiBhbHRzZXR0aW5nICovCi0JCQkJCUNvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CisJCQkJCUNvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKAorCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKIAkJCQkJLyoKLQkJCQkJICogSXQgcmVzZXRzIHRoZSBkZXZpY2UgYW5kIGlmIGFueSB0aGluZyBnZXRzIGNoYW5nZWQgaW4KLQkJCQkJICogIFVTQiBkZXNjcmlwdG9yIGl0IHdpbGwgc2hvdyBmYWlsIGFuZCByZS1lbnVtZXJhdGUgdGhlCisJCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcKKwkJCQkJICogZ2V0cyBjaGFuZ2VkIGluIFVTQiBkZXNjcmlwdG9yIGl0CisJCQkJCSAqIHdpbGwgc2hvdyBmYWlsIGFuZCByZS1lbnVtZXJhdGUgdGhlCiAJCQkJCSAqIGRldmljZQogCQkJCQkgKi8KLQkJCQkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZShwc0ludGZBZGFwdGVyLT51ZGV2KTsKKwkJCQkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZSgKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT51ZGV2KTsKIAkJCQkJaWYgKHJldHZhbCkgewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCi0JCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKKwkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQkJCURCR19UWVBFX0lOSVRFWElULAorCQkJCQkJCQlEUlZfRU5UUlksCisJCQkJCQkJCURCR19MVkxfQUxMLAorCQkJCQkJCQkicmVzZXQgZmFpbGVkLiAgUmUtZW51bWVyYXRpbmcgdGhlIGRldmljZS5cbiIpOwogCQkJCQkJcmV0dXJuIHJldHZhbDsKIAkJCQkJfQogCkBAIC01NDEsNDkgKzUzNSw2OSBAQAogCWZvciAodmFsdWUgPSAwOyB2YWx1ZSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKyt2YWx1ZSkgewogCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFt2YWx1ZV0uZGVzYzsKIAotCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgeworCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgJiYKKwkJCQl1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKIAkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKIAkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fcGlwZSA9Ci0JCQkJCXVzYl9yY3ZidWxrcGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAotCQkJCQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgPQorCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUoCisJCQkJCXBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIpOwogCQl9CiAKLQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKLQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9Ci0JCQkJdXNiX3NuZGJ1bGtwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCWlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCisJCQkJdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgeworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyID0KKwkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3BpcGUgPSB1c2Jfc25kYnVsa3BpcGUoCisJCQkJCXBzSW50ZkFkYXB0ZXItPnVkZXYsCiAJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkcik7CiAJCX0KIAotCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpIHsKKwkJaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgJiYKKwkJCQl1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkgewogCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwogCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwotCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgPQorCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwgPQorCQkJCWVuZHBvaW50LT5iSW50ZXJ2YWw7CiAJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9idWZmZXIgPQotCQkJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2J1ZmZlcikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkgeworCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyICYmCisJCQkJdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpKSB7CiAJCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgotCQkJCShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSAmJiAodmFsdWUgPT0gdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlcikpIHsKKwkJCQkJKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA9PSBUM0IpICYmCisJCQkJCSh2YWx1ZSA9PSB1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyKSkgewogCQkJCS8qIHVzZSBmaXJzdCBpbnRvdXQgZW5kIHBvaW50IGFzIGEgYnVsayBvdXQgZW5kIHBvaW50ICovCi0JCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3NpemUgPSBidWZmZXJfc2l6ZTsKLQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0gdXNiX3NuZGludHBpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKLQkJCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkcik7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQkJYnVmZmVyX3NpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3NpemUgPQorCQkJCQlidWZmZXJfc2l6ZTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPQorCQkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0KKwkJCQkJdXNiX3NuZGludHBpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKKwkJCQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dAorCQkJCQkJCS5idWxrX291dF9lbmRwb2ludEFkZHIpOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmludF9vdXRfaW50ZXJ2YWwgPQorCQkJCQllbmRwb2ludC0+YkludGVydmFsOwogCQkJfSBlbHNlIGlmICh2YWx1ZSA9PSBFUDYpIHsKLQkJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKLQkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWJ1ZmZlcl9zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X3NpemUgPQorCQkJCQlidWZmZXJfc2l6ZTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2VuZHBvaW50QWRkciA9CisJCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfaW50ZXJ2YWwgPQorCQkJCQllbmRwb2ludC0+YkludGVydmFsOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfYnVmZmVyID0KKwkJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlcikKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC01OTQsMTQgKzYwOCwxNCBAQAogCiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iY21fZmlsZV9kb3dubG9hZCA9IEludGVyZmFjZUZpbGVEb3dubG9hZDsKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJjbV9maWxlX3JlYWRiYWNrX2Zyb21fY2hpcCA9Ci0JCQkJSW50ZXJmYWNlRmlsZVJlYWRiYWNrRnJvbUNoaXA7CisJCUludGVyZmFjZUZpbGVSZWFkYmFja0Zyb21DaGlwOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3RyYW5zbWl0ID0gSW50ZXJmYWNlVHJhbnNtaXRQYWNrZXQ7CiAKIAlyZXR2YWwgPSBDcmVhdGVJbnRlcnJ1cHRVcmIocHNJbnRmQWRhcHRlcik7CiAKIAlpZiAocmV0dmFsKSB7CiAJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCSJDYW5ub3QgY3JlYXRlIGludGVycnVwdCB1cmJcbiIpOworCQkJCSJDYW5ub3QgY3JlYXRlIGludGVycnVwdCB1cmJcbiIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIApAQCAtNjE4LDE3ICs2MzIsMjEgQEAKIAogCXBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPSBUUlVFOwogCi0JaWYgKFRSVUUgPT0gcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpIHsKKwlpZiAocHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpIHsKIAkJcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgPSBmYWxzZTsKIAogCQlpZiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5MaW5rU3RhdHVzID09IExJTktVUF9ET05FKSB7Ci0JCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPklkbGVNb2RlID0gVFJVRSA7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBJZGxlIE1vZGUuXG4iKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+SWRsZU1vZGUgPSBUUlVFOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwKKwkJCQkJREJHX0xWTF9BTEwsCisJCQkJCSJIb3N0IEVudGVyZWQgaW4gUE1VIElkbGUgTW9kZS5cbiIpOwogCQl9IGVsc2UgewogCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iU2h1dFN0YXR1cyA9IFRSVUU7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKLQkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBTaHV0ZG93biBNb2RlLlxuIik7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLAorCQkJCQlEQkdfTFZMX0FMTCwKKwkJCQkJIkhvc3QgRW50ZXJlZCBpbiBQTVUgU2h1dGRvd24gTW9kZS5cbiIpOwogCQl9CiAJfQogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSXNyLmMKaW5kZXggN2IzOWY0Zi4uYjlmOGE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jCkBAIC00LDEwOCArNCwxMjYgQEAKIHN0YXRpYyB2b2lkIHJlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYi8qLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyovKQogewogCWludAkJc3RhdHVzID0gdXJiLT5zdGF0dXM7Ci0Jc3RydWN0IGJjbV9pbnRlcmZhY2VfYWRhcHRlciAqcHNJbnRmQWRhcHRlciA9IChzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICopdXJiLT5jb250ZXh0OwotCXN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyIDsKKwlzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICpwc0ludGZBZGFwdGVyID0KKwkJKHN0cnVjdCBiY21faW50ZXJmYWNlX2FkYXB0ZXIgKil1cmItPmNvbnRleHQ7CisJc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7CiAKIAlpZiAobmV0aWZfbXNnX2ludHIoQWRhcHRlcikpCiAJCXByX2luZm8oUEZYICIlczogaW50ZXJydXB0IHN0YXR1cyAlZFxuIiwKLQkJCUFkYXB0ZXItPmRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQlBZGFwdGVyLT5kZXYtPm5hbWUsIHN0YXR1cyk7CiAKLQlpZihBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBUUlVFKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJEZXZpY2UgaGFzIEdvdCBSZW1vdmVkLiIpOwotCQlyZXR1cm4gOworCWlmIChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsICJEZXZpY2UgaGFzIEdvdCBSZW1vdmVkLiIpOworCQlyZXR1cm47CiAJfQogCi0JaWYoKChBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpICYmIChBZGFwdGVyLT5iRG9TdXNwZW5kID09IFRSVUUpKSB8fAotCQlwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkIHx8Ci0JCXBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKQotCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiSW50ZXJydXB0IGNhbGwgYmFjayBpcyBjYWxsZWQgd2hpbGUgc3VzcGVuZGluZyB0aGUgZGV2aWNlIik7Ci0JCQlyZXR1cm4gOworCWlmICgoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSAmJiBBZGFwdGVyLT5iRG9TdXNwZW5kKSB8fAorCQkJcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCB8fAorCQkJcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLAorCQkJCSJJbnRlcnJ1cHQgY2FsbCBiYWNrIGlzIGNhbGxlZCB3aGlsZSBzdXNwZW5kaW5nIHRoZSBkZXZpY2UiKTsKKwkJcmV0dXJuOwogCX0KIAotCS8vQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJpbnRlcnJ1cHQgdXJiIHN0YXR1cyAlZCIsIHN0YXR1cyk7CiAJc3dpdGNoIChzdGF0dXMpIHsKLQkgICAgLyogc3VjY2VzcyAqLwotCSAgICBjYXNlIFNUQVRVU19TVUNDRVNTOgotCQlpZiAoIHVyYi0+YWN0dWFsX2xlbmd0aCApCi0JCXsKKwkvKiBzdWNjZXNzICovCisJY2FzZSBTVEFUVVNfU1VDQ0VTUzoKKwkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCi0JCQlpZihwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gJiAweEZGKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwgIkdvdCBVU0lNIGludGVycnVwdCIpOworCQkJaWYgKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSAmIDB4RkYpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQkJSU5URl9JTklULCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJHb3QgVVNJTSBpbnRlcnJ1cHQiKTsKIAkJCX0KIAotCQkJaWYocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdICYgMHhGRjAwKQotCQkJeworCQkJaWYgKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YVsxXSAmIDB4RkYwMCkgewogCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLAotCQkJCQkocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdICYgMHhGRjAwKSA+PiA4KTsKLQkJCQlhdG9taWNfc2V0ICgmQWRhcHRlci0+dWlNQnVwZGF0ZSwgVFJVRSk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCAiVFggbWFpbGJveCBjb250YWlucyAlZCIsCisJCQkJCShwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gJgorCQkJCQkgMHhGRjAwKSA+PiA4KTsKKwkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT51aU1CdXBkYXRlLCBUUlVFKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQlJTlRGX0lOSVQsIERCR19MVkxfQUxMLAorCQkJCQkiVFggbWFpbGJveCBjb250YWlucyAlZCIsCiAJCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykpOwogCQkJfQotCQkJaWYocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdID4+IDE2KQotCQkJewotCQkJCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3M9CisJCQlpZiAocHNJbnRmQWRhcHRlci0+dWxJbnRlcnJ1cHREYXRhWzFdID4+IDE2KSB7CisJCQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyA9CiAJCQkJCShwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGFbMV0gID4+IDE2KTsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIlJYIG1haWxib3ggY29udGFpbnMgJWQiLAotCQkJCQlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLAorCQkJCQkJSU5URl9JTklULCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJSWCBtYWlsYm94IGNvbnRhaW5zICVkIiwKKwkJCQkJCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MpOwogCQkJCUludGVyZmFjZVJ4KHBzSW50ZkFkYXB0ZXIpOwogCQkJfQotCQkJaWYoQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSAmJgorCQkJaWYgKEFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgJiYKIAkJCQkhQWRhcHRlci0+ZG93bmxvYWRERFIgJiYKLQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKQotCQkJewotCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZG93bmxvYWRERFIgKz0xOworCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykpIHsKKworCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZG93bmxvYWRERFIgKz0gMTsKIAkJCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CiAJCQl9Ci0JCQlpZihmYWxzZSA9PSBBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUpCi0JCQl7CisJCQlpZiAoIUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSkgewogCQkJCUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSA9IFRSVUU7CiAJCQkJd2FrZV91cCgmQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlKTsKIAkJCX0KLQkJCWlmKCFhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkpCi0JCQl7CisJCQlpZiAoIWF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFBrdEF2YWlsKSkgewogCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDEpOwogCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKIAkJCX0KLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiRmlyaW5nIGludGVycnVwdCBpbiBVUkIiKTsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwKKwkJCQkJREJHX0xWTF9BTEwsICJGaXJpbmcgaW50ZXJydXB0IGluIFVSQiIpOwogCQl9CiAJCWJyZWFrOwotCQljYXNlIC1FTk9FTlQgOgotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIlVSQiBoYXMgZ290IGRpc2Nvbm5lY3RlZCAuLi4uIik7Ci0JCQlyZXR1cm4gOwotCQl9Ci0JCWNhc2UgLUVJTlBST0dSRVNTOgotCQl7Ci0JCQkvL1RoaXMgc2l0dWF0aW9uIG1heSBoYXBwZW5lZCB3aGVuIFVSQnVubGluayBpcyB1c2VkLiBmb3IgZGV0YWlsIGNoZWNrIHVzYl91bmxpbmtfdXJiIGRvY3VtZW50YXRpb24uCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkltcG9zc2liZSBjb25kaXRpb24gaGFzIG9jY3VycmVkLi4uIHNvbWV0aGluZyB2ZXJ5IGJhZCBpcyBnb2luZyBvbiIpOwotCQkJYnJlYWsgOwotCQkJLy9yZXR1cm47Ci0JCX0KLQkJY2FzZSAtRVBJUEU6Ci0JCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkludGVycnVwdCBJTiBlbmRQb2ludCAgaGFzIGdvdCBoYWx0ZWQvc3RhbGxlZC4uLm5lZWQgdG8gY2xlYXIgdGhpcyIpOwotCQkJCUFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCA9IFRSVUUgOwotCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKLQkJCQl1cmItPnN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKLQkJCQlyZXR1cm47Ci0JCX0KLQkgICAgLyogc29mdHdhcmUtZHJpdmVuIGludGVyZmFjZSBzaHV0ZG93biAqLwotCSAgICBjYXNlIC1FQ09OTlJFU0VUOiAvL1VSQiBnb3QgdW5saW5rZWQuCi0JICAgIGNhc2UgLUVTSFVURE9XTjoJCS8vIGhhcmR3YXJlIGdvbmUuIHRoaXMgaXMgdGhlIHNlcmlvdXMgcHJvYmxlbS4KLQkgICAgCQkJCQkJLy9PY2N1cnMgb25seSB3aGVuIHNvbWV0aGluZyBoYXBwZW5zIHdpdGggdGhlIGhvc3QgY29udHJvbGxlciBkZXZpY2UKLQkgICAgY2FzZSAtRU5PREVWIDogLy9EZXZpY2UgZ290IHJlbW92ZWQKLQkJY2FzZSAtRUlOVkFMIDogLy9Tb21lIHRoaW5nIHZlcnkgYmFkIGhhcHBlbmVkIHdpdGggdGhlIFVSQi4gTm8gZGVzY3JpcHRpb24gaXMgYXZhaWxhYmxlLgotCSAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJpbnRlcnJ1cHQgdXJiIGVycm9yICVkIiwgc3RhdHVzKTsKLQkJCXVyYi0+c3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOwotCQkJYnJlYWsgOwotCQkJLy9yZXR1cm47Ci0JICAgIGRlZmF1bHQ6Ci0JCQkvL1RoaXMgaXMgcmVxdWlyZWQgdG8gY2hlY2sgd2hhdCBpcyB0aGUgZGVmYXVsdHMgY29uZGl0aW9ucyB3aGVuIGl0IG9jY3Vycy4uCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwiR09UIERFRkFVTFQgSU5URVJSVVBUIFVSQiBTVEFUVVMgOiVkLi5QbGVhc2UgQW5hbHl6ZSBpdC4uLiIsIHN0YXR1cyk7CisJY2FzZSAtRU5PRU5UOgorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsICJVUkIgaGFzIGdvdCBkaXNjb25uZWN0ZWQuLi4uIik7CisJCXJldHVybjsKKwljYXNlIC1FSU5QUk9HUkVTUzoKKwkJLyoKKwkJICogVGhpcyBzaXR1YXRpb24gbWF5IGhhcHBlbmVkIHdoZW4gVVJCdW5saW5rIGlzIHVzZWQuICBmb3IKKwkJICogZGV0YWlsIGNoZWNrIHVzYl91bmxpbmtfdXJiIGRvY3VtZW50YXRpb24uCisJCSAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsCisJCQkJIkltcG9zc2liZSBjb25kaXRpb24gaGFzIG9jY3VycmVkLi4uIHNvbWV0aGluZyB2ZXJ5IGJhZCBpcyBnb2luZyBvbiIpOworCQlicmVhazsKKwkJLyogcmV0dXJuOyAqLworCWNhc2UgLUVQSVBFOgorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsCisJCQkJREJHX0xWTF9BTEwsCisJCQkJIkludGVycnVwdCBJTiBlbmRQb2ludCBoYXMgZ290IGhhbHRlZC9zdGFsbGVkLi4ubmVlZCB0byBjbGVhciB0aGlzIik7CisJCUFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCA9IFRSVUU7CisJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKKwkJdXJiLT5zdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJcmV0dXJuOworCS8qIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24gKi8KKwljYXNlIC1FQ09OTlJFU0VUOgkvKiBVUkIgZ290IHVubGlua2VkICovCisJY2FzZSAtRVNIVVRET1dOOgkvKiBoYXJkd2FyZSBnb25lLiB0aGlzIGlzIHRoZSBzZXJpb3VzIHByb2JsZW0gKi8KKwkJLyoKKwkJICogT2NjdXJzIG9ubHkgd2hlbiBzb21ldGhpbmcgaGFwcGVucyB3aXRoIHRoZQorCQkgKiBob3N0IGNvbnRyb2xsZXIgZGV2aWNlCisJCSAqLworCWNhc2UgLUVOT0RFVjogLyogRGV2aWNlIGdvdCByZW1vdmVkICovCisJY2FzZSAtRUlOVkFMOgorCQkvKgorCQkgKiBTb21lIHRoaW5nIHZlcnkgYmFkIGhhcHBlbmVkIHdpdGggdGhlIFVSQi4gTm8KKwkJICogZGVzY3JpcHRpb24gaXMgYXZhaWxhYmxlLgorCQkgKi8KKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJCURCR19MVkxfQUxMLCAiaW50ZXJydXB0IHVyYiBlcnJvciAlZCIsIHN0YXR1cyk7CisJCXVyYi0+c3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCQkvKiByZXR1cm47ICovCisJZGVmYXVsdDoKKwkJLyoKKwkJICogVGhpcyBpcyByZXF1aXJlZCB0byBjaGVjayB3aGF0IGlzIHRoZSBkZWZhdWx0cyBjb25kaXRpb25zCisJCSAqIHdoZW4gaXQgb2NjdXJzLi4KKwkJICovCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwKKwkJCQkiR09UIERFRkFVTFQgSU5URVJSVVBUIFVSQiBTVEFUVVMgOiVkLi5QbGVhc2UgQW5hbHl6ZSBpdC4uLiIsCisJCQkJc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMTcsMjggKzEzNSwzMCBAQAogaW50IENyZWF0ZUludGVycnVwdFVyYihzdHJ1Y3QgYmNtX2ludGVyZmFjZV9hZGFwdGVyICpwc0ludGZBZGFwdGVyKQogewogCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkNhbm5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHQgdXJiIik7CisJaWYgKCFwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYikgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsCisJCQkJSU5URl9JTklULCBEQkdfTFZMX0FMTCwKKwkJCQkiQ2Fubm90IGFsbG9jYXRlIGludGVycnVwdCB1cmIiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXIgPQotCQkJCQkJCQlwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGE7CisJCXBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YTsKIAlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9Ci0JCQkJCQkJc2l6ZW9mKHBzSW50ZkFkYXB0ZXItPnVsSW50ZXJydXB0RGF0YSk7CisJCXNpemVvZihwc0ludGZBZGFwdGVyLT51bEludGVycnVwdERhdGEpOwogCiAJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCi0JCQkJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIpOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyKTsKIAogCXVzYl9maWxsX2ludF91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIsIHBzSW50ZkFkYXB0ZXItPnVkZXYsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX3BpcGUsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJCQlyZWFkX2ludF9jYWxsYmFjaywgcHNJbnRmQWRhcHRlciwKLQkJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fcGlwZSwKKwkJCXBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQlwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCXJlYWRfaW50X2NhbGxiYWNrLCBwc0ludGZBZGFwdGVyLAorCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOwogCi0JQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkludGVycnVwdCBJbnRlcnZhbDogJWRcbiIsCi0JCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOworCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULAorCQkJREJHX0xWTF9BTEwsICJJbnRlcnJ1cHQgSW50ZXJ2YWw6ICVkXG4iLAorCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDcsMTkgKzE2NywyMCBAQAogewogCUlOVCBzdGF0dXMgPSAwOwogCi0JaWYoIGZhbHNlID09IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgJiYKLQkJZmFsc2UgPT0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgJiYKLQkJZmFsc2UgPT0gcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCAmJgotCQlmYWxzZSA9PSBwc0ludGZBZGFwdGVyLT5iUHJlcGFyaW5nRm9yQnVzU3VzcGVuZCAmJgotCQlmYWxzZSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uKQotCXsKLQkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIsIEdGUF9BVE9NSUMpOwotCQlpZiAoc3RhdHVzKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiQ2Fubm90IHNlbmQgaW50IHVyYiAlZFxuIiwgc3RhdHVzKTsKLQkJCWlmKHN0YXR1cyA9PSAtRVBJUEUpCi0JCQl7Ci0JCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgPSBUUlVFIDsKKwlpZiAoIShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkIHx8CisJCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgfHwKKwkJCQlwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkIHx8CisJCQkJcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgfHwKKwkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uKSkgeworCQlzdGF0dXMgPQorCQkJdXNiX3N1Ym1pdF91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQlEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsCisJCQkJCSJDYW5ub3Qgc2VuZCBpbnR1cmIgJWRcbiIsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzID09IC1FUElQRSkgeworCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YkVuZFBvaW50SGFsdGVkID0KKwkJCQkJVFJVRTsKIAkJCQl3YWtlX3VwKCZwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMKaW5kZXggMDcyNzU5OS4uNGYzMTU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Fvcy5jCkBAIC0yMjIsMTAgKzIyMiw3IEBACiAKIAkJLy9DaGVja2luZyBjbGFzc2lmaWVyIHZhbGlkaXR5CiAJCWlmICghcHN0Q2xhc3NpZmllclJ1bGUtPmJVc2VkIHx8IHBzdENsYXNzaWZpZXJSdWxlLT51Y0RpcmVjdGlvbiA9PSBET1dOTElOS19ESVIpCi0JCXsKLQkJCWJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBmYWxzZTsKIAkJCWJyZWFrOwotCQl9CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJpcyBJUHY2IGNoZWNrISIpOwogCQlpZiAocHN0Q2xhc3NpZmllclJ1bGUtPmJJcHY2UHJvdG9jb2wpCkBAIC0yMzMsNTEgKzIzMCw0NyBAQAogCiAJCS8vKioqKioqKioqKioqKipDaGVja2luZyBJUCBoZWFkZXIgcGFyYW1ldGVyKioqKioqKioqKioqKioqKioqKioqKioqKiovLwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlRyeWluZyB0byBtYXRjaCBTb3VyY2UgSVAgQWRkcmVzcyIpOwotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hTcmNJcEFkZHJlc3MocHN0Q2xhc3NpZmllclJ1bGUsIGlwaGQtPnNhZGRyKSkpCisJCWlmICghTWF0Y2hTcmNJcEFkZHJlc3MocHN0Q2xhc3NpZmllclJ1bGUsIGlwaGQtPnNhZGRyKSkKIAkJCWJyZWFrOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlNvdXJjZSBJUCBBZGRyZXNzIE1hdGNoZWQiKTsKIAotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hEZXN0SXBBZGRyZXNzKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT5kYWRkcikpKQorCQlpZiAoIU1hdGNoRGVzdElwQWRkcmVzcyhwc3RDbGFzc2lmaWVyUnVsZSwgaXBoZC0+ZGFkZHIpKQogCQkJYnJlYWs7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiRGVzdGluYXRpb24gSVAgQWRkcmVzcyBNYXRjaGVkIik7CiAKLQkJaWYgKGZhbHNlID09IChiQ2xhc3NpZmljYXRpb25TdWNjZWVkID0KLQkJCU1hdGNoVG9zKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT50b3MpKSkKLQkJeworCQlpZiAoIU1hdGNoVG9zKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT50b3MpKSB7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlRPUyBNYXRjaCBmYWlsZWRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJUT1MgTWF0Y2hlZCIpOwogCi0JCWlmIChmYWxzZSA9PSAoYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9Ci0JCQlNYXRjaFByb3RvY29sKHBzdENsYXNzaWZpZXJSdWxlLCBpcGhkLT5wcm90b2NvbCkpKQorCQlpZiAoIU1hdGNoUHJvdG9jb2wocHN0Q2xhc3NpZmllclJ1bGUsIGlwaGQtPnByb3RvY29sKSkKIAkJCWJyZWFrOwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlByb3RvY29sIE1hdGNoZWQiKTsKIAogCQkvL2lmIHByb3RvY29sIGlzIG5vdCBUQ1Agb3IgVURQIHRoZW4gbm8gbmVlZCBvZiBjb21wYXJpbmcgc291cmNlIHBvcnQgYW5kIGRlc3RpbmF0aW9uIHBvcnQKLQkJaWYgKGlwaGQtPnByb3RvY29sICE9IFRDUCAmJiBpcGhkLT5wcm90b2NvbCAhPSBVRFApCisJCWlmIChpcGhkLT5wcm90b2NvbCAhPSBUQ1AgJiYgaXBoZC0+cHJvdG9jb2wgIT0gVURQKSB7CisJCQliQ2xhc3NpZmljYXRpb25TdWNjZWVkID0gVFJVRTsKIAkJCWJyZWFrOworCQl9CiAJCS8vKioqKioqKioqKioqKioqKioqQ2hlY2tpbmcgVHJhbnNwb3J0IExheWVyIEhlYWRlciBmaWVsZCBpZiBwcmVzZW50ICoqKioqKioqKioqKioqKioqLy8KIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJTb3VyY2UgUG9ydCAlMDR4IiwKIAkJCShpcGhkLT5wcm90b2NvbCA9PSBVRFApID8geHBydF9oZHItPnVoZHIuc291cmNlIDogeHBydF9oZHItPnRoZHIuc291cmNlKTsKIAotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hTcmNQb3J0KHBzdENsYXNzaWZpZXJSdWxlLAotCQkJCW50b2hzKChpcGhkLT5wcm90b2NvbCA9PSBVRFApID8KLQkJCQl4cHJ0X2hkci0+dWhkci5zb3VyY2UgOiB4cHJ0X2hkci0+dGhkci5zb3VyY2UpKSkpCisJCWlmICghTWF0Y2hTcmNQb3J0KHBzdENsYXNzaWZpZXJSdWxlLAorCQkJCSAgbnRvaHMoKGlwaGQtPnByb3RvY29sID09IFVEUCkgPworCQkJCSAgeHBydF9oZHItPnVoZHIuc291cmNlIDogeHBydF9oZHItPnRoZHIuc291cmNlKSkpCiAJCQlicmVhazsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJTcmMgUG9ydCBNYXRjaGVkIik7CiAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBJUFY0X0RCRywgREJHX0xWTF9BTEwsICJEZXN0aW5hdGlvbiBQb3J0ICUwNHgiLAogCQkJKGlwaGQtPnByb3RvY29sID09IFVEUCkgPyB4cHJ0X2hkci0+dWhkci5kZXN0IDoKIAkJCXhwcnRfaGRyLT50aGRyLmRlc3QpOwotCQlpZiAoZmFsc2UgPT0gKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPQotCQkJTWF0Y2hEZXN0UG9ydChwc3RDbGFzc2lmaWVyUnVsZSwKLQkJCW50b2hzKChpcGhkLT5wcm90b2NvbCA9PSBVRFApID8KLQkJCXhwcnRfaGRyLT51aGRyLmRlc3QgOiB4cHJ0X2hkci0+dGhkci5kZXN0KSkpKQorCQlpZiAoIU1hdGNoRGVzdFBvcnQocHN0Q2xhc3NpZmllclJ1bGUsCisJCQkJICAgbnRvaHMoKGlwaGQtPnByb3RvY29sID09IFVEUCkgPworCQkJCSAgIHhwcnRfaGRyLT51aGRyLmRlc3QgOiB4cHJ0X2hkci0+dGhkci5kZXN0KSkpCiAJCQlicmVhazsKKwkJYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9IFRSVUU7CiAJfSB3aGlsZSAoMCk7CiAKIAlpZiAoVFJVRSA9PSBiQ2xhc3NpZmljYXRpb25TdWNjZWVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9UeXBlZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UeXBlZGVmcy5oCmluZGV4IDgzMmFkY2YuLjkwYjNiMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVHlwZWRlZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1R5cGVkZWZzLmgKQEAgLTI1LDE2ICsyNSwxNiBAQAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMT05HOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIERXT1JEOwogCi10eXBlZGVmIGNoYXIqIFBDSEFSOwotdHlwZWRlZiBzaG9ydCogUFNIT1JUOwotdHlwZWRlZiBpbnQqIFBJTlQ7Ci10eXBlZGVmIGxvbmcqIFBMT05HOwotdHlwZWRlZiB2b2lkKiBQVk9JRDsKK3R5cGVkZWYgY2hhciAqUENIQVI7Cit0eXBlZGVmIHNob3J0ICpQU0hPUlQ7Cit0eXBlZGVmIGludCAqUElOVDsKK3R5cGVkZWYgbG9uZyAqUExPTkc7Cit0eXBlZGVmIHZvaWQgKlBWT0lEOwogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIqIFBVQ0hBUjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQqIFBVU0hPUlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGludCogUFVJTlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcqIFBVTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqUFVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAqUFVTSE9SVDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICpQVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAqUFVMT05HOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUxPTkc2NDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIExBUkdFX0lOVEVHRVI7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzI7CkBAIC00Myw1ICs0Myw1IEBACiAjZW5kaWYKIAogCi0jZW5kaWYJLy9fX1RZUEVERUZTX0hfXworI2VuZGlmCS8qIF9fVFlQRURFRlNfSF9fICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmgKaW5kZXggN2ZkMjFjNi4uNmYzMjcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmgKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KIAogI2luY2x1ZGUgIlR5cGVkZWZzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMKaW5kZXggZjU1MzAwZC4uMzlhY2U1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaG9zdG1pYnMuYwpAQCAtMjcsOSArMjcsOSBAQAogCS8qIENvcHkgdGhlIGNsYXNzaWZpZXIgVGFibGUgKi8KIAlmb3IgKG5DbGFzc2lmaWVySW5kZXggPSAwOyBuQ2xhc3NpZmllckluZGV4IDwgTUFYX0NMQVNTSUZJRVJTOyBuQ2xhc3NpZmllckluZGV4KyspIHsKIAkJaWYgKEFkYXB0ZXItPmFzdENsYXNzaWZpZXJUYWJsZVtuQ2xhc3NpZmllckluZGV4XS5iVXNlZCA9PSBUUlVFKQotCQkJbWVtY3B5KChQVk9JRCkgJiBwc3RIb3N0TWlicy0+CisJCQltZW1jcHkoKFBWT0lEKSAmcHN0SG9zdE1pYnMtPgogCQkJICAgICAgIGFzdENsYXNzaWZpZXJUYWJsZVtuQ2xhc3NpZmllckluZGV4XSwKLQkJCSAgICAgICAoUFZPSUQpICYgQWRhcHRlci0+CisJCQkgICAgICAgKFBWT0lEKSAmQWRhcHRlci0+CiAJCQkgICAgICAgYXN0Q2xhc3NpZmllclRhYmxlW25DbGFzc2lmaWVySW5kZXhdLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmNtX21pYnNfY2xhc3NpZmllcl9ydWxlKSk7CiAJfQpAQCAtMzcsOCArMzcsOCBAQAogCS8qIENvcHkgdGhlIFNGIFRhYmxlICovCiAJZm9yIChuU2ZJbmRleCA9IDA7IG5TZkluZGV4IDwgTk9fT0ZfUVVFVUVTOyBuU2ZJbmRleCsrKSB7CiAJCWlmIChBZGFwdGVyLT5QYWNrSW5mb1tuU2ZJbmRleF0uYlZhbGlkKSB7Ci0JCQltZW1jcHkoKFBWT0lEKSAmIHBzdEhvc3RNaWJzLT5hc3RTRnRhYmxlW25TZkluZGV4XSwKLQkJCSAgICAgICAoUFZPSUQpICYgQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLAorCQkJbWVtY3B5KChQVk9JRCkgJnBzdEhvc3RNaWJzLT5hc3RTRnRhYmxlW25TZkluZGV4XSwKKwkJCSAgICAgICAoUFZPSUQpICZBZGFwdGVyLT5QYWNrSW5mb1tuU2ZJbmRleF0sCiAJCQkJc2l6ZW9mKHN0cnVjdCBiY21fbWlic190YWJsZSkpOwogCQl9IGVsc2UgewogCQkJLyogSWYgaW5kZXggaW4gbm90IHZhbGlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMKaW5kZXggZmNhMTY0Zi4uNjNiZTNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jCkBAIC0xMjIsNyArMTIyLDcgQEAKICAqCQlPU0FMX1NUQVRVU19DT0RFOgogICovCiAKLWludCBSZWFkQmVjZWVtRUVQUk9NQnVsayhzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwKK3N0YXRpYyBpbnQgUmVhZEJlY2VlbUVFUFJPTUJ1bGsoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsCiAJCQlEV09SRCBkd0FkZHJlc3MsCiAJCQlEV09SRCAqcGR3RGF0YSwKIAkJCURXT1JEIGR3TnVtV29yZHMpCkBAIC0yNjk4LDcgKzI2OTgsNyBAQAogICogT24gRmFpbHVyZSAtcmV0dXJucyBTVEFUVVNfRkFJTFVSRQogICovCiAKLWludCBCY21HZXRTZWN0aW9uVmFsRW5kT2Zmc2V0KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbCkKK3N0YXRpYyBpbnQgQmNtR2V0U2VjdGlvblZhbEVuZE9mZnNldChzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBlRmxhc2gyeFNlY3Rpb25WYWwpCiB7CiAJaW50IFNlY3RFbmRPZmZzZXQgPSAwOwogCkBAIC0yOTgwLDcgKzI5ODAsNyBAQAogICoKICAqLwogCi1CX1VJTlQ4IElzT2Zmc2V0V3JpdGFibGUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHVuc2lnbmVkIGludCB1aU9mZnNldCkKK3N0YXRpYyBCX1VJTlQ4IElzT2Zmc2V0V3JpdGFibGUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIHVuc2lnbmVkIGludCB1aU9mZnNldCkKIHsKIAl1bnNpZ25lZCBpbnQgdWlTZWN0b3JOdW0gPSAwOwogCXVuc2lnbmVkIGludCB1aVdvcmRPZlNlY3RvclBlcm1pc3Npb24gPSAwOwpAQCAtMzM3NCw3ICszMzc0LDcgQEAKIAljYXNlIERTRDI6CiAJCWlmIChSZWFkRFNEU2lnbmF0dXJlKEFkYXB0ZXIsIGVGbGFzaDJ4U2VjdFZhbCkgPT0gRFNEX0lNQUdFX01BR0lDX05VTUJFUikgewogCQkJSGlnaGVzdFByaURTRCA9IGdldEhpZ2hlc3RQcmlEU0QoQWRhcHRlcik7Ci0JCQlpZiAoKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSkgeworCQkJaWYgKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSB7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIkdpdmVuIERTRDwleD4gYWxyZWFkeSBoYXMgaGlnaGVzdCBwcmlvcml0eSIsIGVGbGFzaDJ4U2VjdFZhbCk7CiAJCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQkJYnJlYWs7CkBAIC0zNDAyLDcgKzM0MDIsNyBAQAogCiAJCQkJSGlnaGVzdFByaURTRCA9IGdldEhpZ2hlc3RQcmlEU0QoQWRhcHRlcik7CiAKLQkJCQlpZiAoKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSkgeworCQkJCWlmIChIaWdoZXN0UHJpRFNEID09IGVGbGFzaDJ4U2VjdFZhbCkgewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiTWFkZSB0aGUgRFNEOiAleCBoaWdoZXN0IGJ5IHJlZHVjaW5nIHByaW9yaXR5IG9mIG90aGVyXG4iLCBlRmxhc2gyeFNlY3RWYWwpOwogCQkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJCQkJYnJlYWs7CkBAIC0zNDIxLDcgKzM0MjEsNyBAQAogCQkJCX0KIAogCQkJCUhpZ2hlc3RQcmlEU0QgPSBnZXRIaWdoZXN0UHJpRFNEKEFkYXB0ZXIpOwotCQkJCWlmICgoSGlnaGVzdFByaURTRCA9PSBlRmxhc2gyeFNlY3RWYWwpKSB7CisJCQkJaWYgKEhpZ2hlc3RQcmlEU0QgPT0gZUZsYXNoMnhTZWN0VmFsKSB7CiAJCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC00MDc0LDcgKzQwNzQsNyBAQAogICoJRmFpbGx1cmUgOi0gUmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGUKICAqLwogCi1pbnQgU2F2ZUhlYWRlcklmUHJlc2VudChzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgUFVDSEFSIHBCdWZmLCB1bnNpZ25lZCBpbnQgdWlPZmZzZXQpCitzdGF0aWMgaW50IFNhdmVIZWFkZXJJZlByZXNlbnQoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIFBVQ0hBUiBwQnVmZiwgdW5zaWduZWQgaW50IHVpT2Zmc2V0KQogewogCXVuc2lnbmVkIGludCBvZmZzZXRUb1Byb3RlY3QgPSAwLCBIZWFkZXJTaXplVG9Qcm90ZWN0ID0gMDsKIAlib29sIGJIYXNIZWFkZXIgPSBmYWxzZTsKQEAgLTQyMTMsNyArNDIxMyw3IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi1pbnQgUmVhZERTRFNpZ25hdHVyZShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBkc2QpCitzdGF0aWMgaW50IFJlYWREU0RTaWduYXR1cmUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZHNkKQogewogCXVuc2lnbmVkIGludCB1aURTRHNpZyA9IDA7CiAJLyogdW5zaWduZWQgaW50IHNpZ29mZnNldEluTWFwID0gMDsKQEAgLTQyMzgsNyArNDIzOCw3IEBACiAJcmV0dXJuIHVpRFNEc2lnOwogfQogCi1pbnQgUmVhZERTRFByaW9yaXR5KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGRzZCkKK3N0YXRpYyBpbnQgUmVhZERTRFByaW9yaXR5KHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGRzZCkKIHsKIAkvKiB1bnNpZ25lZCBpbnQgcHJpT2Zmc2V0SW5NYXAgPSAwIDsgKi8KIAl1bnNpZ25lZCBpbnQgdWlEU0RQcmkgPSBTVEFUVVNfRkFJTFVSRTsKQEAgLTQyNjEsNyArNDI2MSw3IEBACiAJcmV0dXJuIHVpRFNEUHJpOwogfQogCi1lbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGdldEhpZ2hlc3RQcmlEU0Qoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCitzdGF0aWMgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBnZXRIaWdoZXN0UHJpRFNEKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyKQogewogCWludCBEU0RIaWdoZXN0UHJpID0gU1RBVFVTX0ZBSUxVUkU7CiAJaW50IERzZFByaSA9IDA7CkBAIC00MjkzLDcgKzQyOTMsNyBAQAogCXJldHVybiAgSGlnaGVzdFByaURTRDsKIH0KIAotaW50IFJlYWRJU09TaWduYXR1cmUoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgaXNvKQorc3RhdGljIGludCBSZWFkSVNPU2lnbmF0dXJlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGlzbykKIHsKIAl1bnNpZ25lZCBpbnQgdWlJU09zaWcgPSAwOwogCS8qIHVuc2lnbmVkIGludCBzaWdvZmZzZXRJbk1hcCA9IDA7CkBAIC00MzE2LDcgKzQzMTYsNyBAQAogCXJldHVybiB1aUlTT3NpZzsKIH0KIAotaW50IFJlYWRJU09Qcmlvcml0eShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBpc28pCitzdGF0aWMgaW50IFJlYWRJU09Qcmlvcml0eShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwgZW51bSBiY21fZmxhc2gyeF9zZWN0aW9uX3ZhbCBpc28pCiB7CiAJdW5zaWduZWQgaW50IElTT1ByaSA9IFNUQVRVU19GQUlMVVJFOwogCWlmIChJc1NlY3Rpb25Xcml0YWJsZShBZGFwdGVyLCBpc28pKSB7CkBAIC00MzM1LDcgKzQzMzUsNyBAQAogCXJldHVybiBJU09Qcmk7CiB9CiAKLWVudW0gYmNtX2ZsYXNoMnhfc2VjdGlvbl92YWwgZ2V0SGlnaGVzdFByaUlTTyhzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlcikKK3N0YXRpYyBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGdldEhpZ2hlc3RQcmlJU08oc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJaW50IElTT0hpZ2hlc3RQcmkgPSBTVEFUVVNfRkFJTFVSRTsKIAlpbnQgSVNPUHJpID0gMDsKQEAgLTQzNTksNyArNDM1OSw3IEBACiAJcmV0dXJuIEhpZ2hlc3RQcmlJU087CiB9CiAKLWludCBXcml0ZVRvRmxhc2hXaXRob3V0U2VjdG9yRXJhc2Uoc3RydWN0IGJjbV9taW5pX2FkYXB0ZXIgKkFkYXB0ZXIsCitzdGF0aWMgaW50IFdyaXRlVG9GbGFzaFdpdGhvdXRTZWN0b3JFcmFzZShzdHJ1Y3QgYmNtX21pbmlfYWRhcHRlciAqQWRhcHRlciwKIAkJCQlQVUlOVCBwQnVmZiwKIAkJCQllbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIGVGbGFzaDJ4U2VjdGlvblZhbCwKIAkJCQl1bnNpZ25lZCBpbnQgdWlPZmZzZXQsCkBAIC00NDcyLDcgKzQ0NzIsNyBAQAogCXJldHVybiBTZWN0aW9uUHJlc2VudDsKIH0KIAotaW50IElzU2VjdGlvbldyaXRhYmxlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIFNlY3Rpb24pCitzdGF0aWMgaW50IElzU2VjdGlvbldyaXRhYmxlKHN0cnVjdCBiY21fbWluaV9hZGFwdGVyICpBZGFwdGVyLCBlbnVtIGJjbV9mbGFzaDJ4X3NlY3Rpb25fdmFsIFNlY3Rpb24pCiB7CiAJaW50IG9mZnNldCA9IFNUQVRVU19GQUlMVVJFOwogCWludCBTdGF0dXMgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL2NlZF9pb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL2NlZF9pb2MuYwppbmRleCBiZjUzMmIxLi5lYmJjNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvYy5jCkBAIC0zOCw4ICszOCw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgRmx1c2hPdXRCdWZmKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY3VycmVudFN0YXRlPSVkIiwgX19mdW5jX18sCi0JCXBkeC0+c0N1cnJlbnRTdGF0ZSk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBjdXJyZW50U3RhdGU9JWRcbiIsCisJCV9fZnVuY19fLCBwZHgtPnNDdXJyZW50U3RhdGUpOwogCWlmIChwZHgtPnNDdXJyZW50U3RhdGUgPT0gVTE0RVJSX1RJTUUpCS8qIERvIG5vdGhpbmcgaWYgaGFyZHdhcmUgaW4gdHJvdWJsZSAqLwogCQlyZXR1cm47CiAJLyogS2lsbCBvZmYgYW55IHBlbmRpbmcgSS9PICovCkBAIC01OSw4ICs1OSw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgRmx1c2hJbkJ1ZmYoREVWSUNFX0VYVEVOU0lPTiAqcGR4KQogewotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBjdXJyZW50U3RhdGU9JWQiLCBfX2Z1bmNfXywKLQkJcGR4LT5zQ3VycmVudFN0YXRlKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGN1cnJlbnRTdGF0ZT0lZFxuIiwKKwkJX19mdW5jX18sIHBkeC0+c0N1cnJlbnRTdGF0ZSk7CiAJaWYgKHBkeC0+c0N1cnJlbnRTdGF0ZSA9PSBVMTRFUlJfVElNRSkJLyogRG8gbm90aGluZyBpZiBoYXJkd2FyZSBpbiB0cm91YmxlICovCiAJCXJldHVybjsKIAkvKiBLaWxsIG9mZiBhbnkgcGVuZGluZyBJL08gKi8KQEAgLTExOCw4ICsxMTgsOCBAQAogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CS8qICBQcm90ZWN0IGRpc2Nvbm5lY3QgZnJvbSBuZXcgaS9vICovCiAJaWYgKG4gPiAwKSB7CQkvKiAgZG8gbm90aGluZyBpZiBub3d0IHRvIGRvISAqLwotCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgbj0lZD4lczwiLCBfX2Z1bmNfXywgbiwKLQkJCWJ1ZmZlcik7CisJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogbj0lZD4lczxcbiIsCisJCQlfX2Z1bmNfXywgbiwgYnVmZmVyKTsKIAkJaVJldHVybiA9IFB1dENoYXJzKHBkeCwgYnVmZmVyLCBuKTsKIAl9CiAKQEAgLTEzOSw3ICsxMzksNyBAQAogCWludCBpUmV0dXJuOwogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwkvKiAgUHJvdGVjdCBkaXNjb25uZWN0IGZyb20gbmV3IGkvbyAqLwogCWlSZXR1cm4gPSBQdXRDaGFycyhwZHgsICZjLCAxKTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiU2VuZENoYXIgPiVjPCAoMHglMDJ4KSIsIGMsIGMpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJTZW5kQ2hhciA+JWM8ICgweCUwMngpXG4iLCBjLCBjKTsKIAlBbGxvd2kocGR4KTsJLyogIE1ha2Ugc3VyZSBjaGFyIHJlYWRzIGFyZSBydW5uaW5nICovCiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKIAlyZXR1cm4gaVJldHVybjsKQEAgLTE3NCw3ICsxNzQsNyBAQAogaW50IEdldDE0MDFTdGF0ZShERVZJQ0VfRVhURU5TSU9OICpwZHgsIF9fdTMyICpzdGF0ZSwgX191MzIgKmVycm9yKQogewogCWludCBuR290OwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJHZXQxNDAxU3RhdGUoKSBlbnRyeSIpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZW50cnlcbiIsIF9fZnVuY19fKTsKIAogCSpzdGF0ZSA9IDB4RkZGRkZGRkY7CS8qICBTdGFydCBvZmYgd2l0aCBpbnZhbGlkIHN0YXRlICovCiAJbkdvdCA9IHVzYl9jb250cm9sX21zZyhwZHgtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZShwZHgtPnVkZXYsIDApLApAQCAtMTgyLDE1ICsxODIsMTUgQEAKIAkJCSAgICAgICBwZHgtPnN0YXRCdWYsIHNpemVvZihwZHgtPnN0YXRCdWYpLCBIWik7CiAJaWYgKG5Hb3QgIT0gc2l6ZW9mKHBkeC0+c3RhdEJ1ZikpIHsKIAkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSJHZXQxNDAxU3RhdGUoKSBGQUlMRUQsIHJldHVybiBjb2RlICVkIiwgbkdvdCk7CisJCQkiJXM6IEZBSUxFRCwgcmV0dXJuIGNvZGUgJWRcbiIsIF9fZnVuY19fLCBuR290KTsKIAkJcGR4LT5zQ3VycmVudFN0YXRlID0gVTE0RVJSX1RJTUU7CS8qICBJbmRpY2F0ZSB0aGF0IHRoaW5ncyBhcmUgdmVyeSB3cm9uZyBpbmRlZWQgKi8KIAkJKnN0YXRlID0gMDsJLyogIEZvcmNlIHN0YXR1cyB2YWx1ZXMgdG8gYSBrbm93biBzdGF0ZSAqLwogCQkqZXJyb3IgPSAwOwogCX0gZWxzZSB7CiAJCWludCBuRGV2aWNlOwogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIkdldDE0MDFTdGF0ZSgpIFN1Y2Nlc3MsIHN0YXRlOiAweCV4LCAweCV4IiwKLQkJCXBkeC0+c3RhdEJ1ZlswXSwgcGR4LT5zdGF0QnVmWzFdKTsKKwkJCSIlczogU3VjY2Vzcywgc3RhdGU6IDB4JXgsIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcGR4LT5zdGF0QnVmWzBdLCBwZHgtPnN0YXRCdWZbMV0pOwogCiAJCSpzdGF0ZSA9IHBkeC0+c3RhdEJ1ZlswXTsJLyogIFJldHVybiB0aGUgc3RhdGUgdmFsdWVzIHRvIHRoZSBjYWxsaW5nIGNvZGUgKi8KIAkJKmVycm9yID0gcGR4LT5zdGF0QnVmWzFdOwpAQCAtMjIwLDggKzIyMCw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IFJlYWRXcml0ZV9DYW5jZWwoREVWSUNFX0VYVEVOU0lPTiAqcGR4KQogewotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJSZWFkV3JpdGVfQ2FuY2VsIGVudHJ5ICVkIiwKLQkJcGR4LT5iU3RhZ2VkVXJiUGVuZGluZyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBlbnRyeSAlZFxuIiwKKwkJX19mdW5jX18sIHBkeC0+YlN0YWdlZFVyYlBlbmRpbmcpOwogI2lmZGVmIE5PVF9XUklUVEVOX1lFVAogCWludCBudFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCWJvb2wgYlJlc3VsdCA9IGZhbHNlOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAKIAlpZiAocGR4LT5iU3RhZ2VkVXJiUGVuZGluZykgewkvKiAgYW55dGhpbmcgdG8gYmUgY2FuY2VsbGVkPyBNYXkgbmVlZCBtb3JlLi4uICovCiAJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZSAtIGRldiwKLQkJCSAiUmVhZFdyaXRlX0NhbmNlbCBhYm91dCB0byBjYW5jZWwgVXJiIik7CisJCQkgIlJlYWRXcml0ZV9DYW5jZWwgYWJvdXQgdG8gY2FuY2VsIFVyYlxuIik7CiAJCS8qIENsZWFyIHRoZSBzdGFnaW5nIGRvbmUgZmxhZyAqLwogCQkvKiBLZUNsZWFyRXZlbnQoJnBkeC0+U3RhZ2luZ0RvbmVFdmVudCk7ICovCiAJCVVTQl9BU1NFUlQocGR4LT5wU3RhZ2VkSXJwICE9IE5VTEwpOwpAQCAtMjQ0LDE0ICsyNDQsMTQgQEAKIAkJCUxBUkdFX0lOVEVHRVIgdGltZW91dDsKIAkJCXRpbWVvdXQuUXVhZFBhcnQgPSAtMTAwMDAwMDA7CS8qICBVc2UgYSB0aW1lb3V0IG9mIDEgc2Vjb25kICovCiAJCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UgLSBkZXYsCi0JCQkJICJSZWFkV3JpdGVfQ2FuY2VsIGFib3V0IHRvIHdhaXQgdGlsbCBkb25lIik7CisJCQkJICIlczogYWJvdXQgdG8gd2FpdCB0aWxsIGRvbmVcbiIsIF9fZnVuY19fKTsKIAkJCW50U3RhdHVzID0KIAkJCSAgICBLZVdhaXRGb3JTaW5nbGVPYmplY3QoJnBkeC0+U3RhZ2luZ0RvbmVFdmVudCwKIAkJCQkJCSAgRXhlY3V0aXZlLCBLZXJuZWxNb2RlLCBGQUxTRSwKIAkJCQkJCSAgJnRpbWVvdXQpOwogCQl9IGVsc2UgewogCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlIC0gZGV2LAotCQkJCSAiUmVhZFdyaXRlX0NhbmNlbCwgY2FuY2VsbGF0aW9uIGZhaWxlZCIpOworCQkJCSAiJXM6IGNhbmNlbGxhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCW50U3RhdHVzID0gVTE0RVJSX0ZBSUw7CiAJCX0KIAkJVVNCX0tkUHJpbnQoREJHTFZMX0RFRkFVTFQsCkBAIC0yNjAsNyArMjYwLDcgQEAKIAl9IGVsc2UKIAkJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPnN0YWdlZExvY2spOwogCi0JZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlIC0gZGV2LCAiUmVhZFdyaXRlX0NhbmNlbCAgZG9uZSIpOworCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZSAtIGRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIG50U3RhdHVzOwogI2Vsc2UKIAlyZXR1cm4gVTE0RVJSX05PRVJST1I7CkBAIC0zMDQsNyArMzA0LDcgQEAKIGJvb2wgSXMxNDAxKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKIAlpbnQgaVJldHVybjsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAljZWRfZHJhd19kb3duKHBkeCk7CS8qICB3YWl0IGZvciwgdGhlbiBraWxsIG91dHN0YW5kaW5nIFVyYnMgKi8KIAlGbHVzaEluQnVmZihwZHgpOwkvKiAgQ2xlYXIgb3V0IGlucHV0IGJ1ZmZlciAmIHBpcGUgKi8KQEAgLTM2OCw3ICszNjgsNyBAQAogCQkgICAgICAocGR4LT5zQ3VycmVudFN0YXRlID49IFUxNEVSUl9TVEQpKTsJLyogIE5vIDE0MDEgZXJyb3JzIHN0b3JlZCAqLwogCiAJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJIiVzIERNQUZsYWc6JWQsIHN0YXRlOiVkLCBmb3JjZTolZCwgdGVzdEJ1ZmY6JWQsIHNob3J0OiVkIiwKKwkJIiVzOiBETUFGbGFnOiVkLCBzdGF0ZTolZCwgZm9yY2U6JWQsIHRlc3RCdWZmOiVkLCBzaG9ydDolZFxuIiwKIAkJX19mdW5jX18sIHBkeC0+ZHdETUFGbGFnLCBwZHgtPnNDdXJyZW50U3RhdGUsIHBkeC0+YkZvcmNlUmVzZXQsCiAJCWJUZXN0QnVmZiwgYlNob3J0VGVzdCk7CiAKQEAgLTM3NiwxMyArMzc2LDEzIEBACiAJICAgIChwZHgtPmR3TnVtSW5wdXQgfHwgcGR4LT5kd051bU91dHB1dCkpIHsJLyogIC4uLmNoYXJhY3RlcnMgd2VyZSBpbiB0aGUgYnVmZmVyPyAqLwogCQliU2hvcnRUZXN0ID0gZmFsc2U7CS8qICBUaGVuIGRvIHRoZSBmdWxsIHRlc3QgKi8KIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyB3aWxsIHJlc2V0IGFzIGJ1ZmZlcnMgbm90IGVtcHR5IiwgX19mdW5jX18pOworCQkJIiVzOiB3aWxsIHJlc2V0IGFzIGJ1ZmZlcnMgbm90IGVtcHR5XG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJaWYgKGJTaG9ydFRlc3QgfHwgIWJDYW5SZXNldCkgewkvKiAgU3RpbGwgT0sgdG8gdHJ5IHRoZSBzaG9ydCB0ZXN0PyAqLwogCQkJCS8qICBBbHdheXMgdGVzdCBpZiBubyByZXNldCAtIHdlIHdhbnQgc3RhdGUgdXBkYXRlICovCiAJCXVuc2lnbmVkIGludCBzdGF0ZSwgZXJyb3I7Ci0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcy0+R2V0MTQwMVN0YXRlIiwgX19mdW5jX18pOworCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IEdldDE0MDFTdGF0ZVxuIiwgX19mdW5jX18pOwogCQlpZiAoR2V0MTQwMVN0YXRlKHBkeCwgJnN0YXRlLCAmZXJyb3IpID09IFUxNEVSUl9OT0VSUk9SKSB7CS8qICBDaGVjayBvbiB0aGUgMTQwMSBzdGF0ZSAqLwogCQkJaWYgKChzdGF0ZSAmIDB4RkYpID09IDApCS8qICBJZiBjYWxsIHdvcmtlZCwgY2hlY2sgdGhlIHN0YXR1cyB2YWx1ZSAqLwogCQkJCWJSZXQgPSB0cnVlOwkvKiAgSWYgdGhhdCB3YXMgemVybywgYWxsIGlzIE9LLCBubyByZXNldCBuZWVkZWQgKi8KQEAgLTM5MCw3ICszOTAsNyBAQAogCX0KIAogCWlmICghYlJldCAmJiBiQ2FuUmVzZXQpCXsgLyogIElmIGFsbCBub3QgT0ssIHRoZW4gKi8KLQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcy0+SXMxNDAxICVkICVkICVkICVkIiwKKwkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogSXMxNDAxICVkICVkICVkICVkXG4iLAogCQkJIF9fZnVuY19fLCBiU2hvcnRUZXN0LCBwZHgtPnNDdXJyZW50U3RhdGUsIGJUZXN0QnVmZiwKIAkJCSBwZHgtPmJGb3JjZVJlc2V0KTsKIAkJYlJldCA9IElzMTQwMShwZHgpOwkvKiAgIGRvIGZ1bGwgdGVzdCAqLwpAQCAtNDA3LDcgKzQwNyw4IEBACiBpbnQgUmVzZXQxNDAxKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiQUJvdXQgdG8gY2FsbCBRdWlja0NoZWNrIik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBBYm91dCB0byBjYWxsIFF1aWNrQ2hlY2tcbiIsCisJCV9fZnVuY19fKTsKIAlRdWlja0NoZWNrKHBkeCwgdHJ1ZSwgdHJ1ZSk7CS8qICBDaGVjayAxNDAxLCByZXNldCBpZiBub3QgT0sgKi8KIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwogCXJldHVybiBVMTRFUlJfTk9FUlJPUjsKQEAgLTQyMyw3ICs0MjQsNyBAQAogCWludCBpUmV0dXJuID0gVTE0RVJSX05PSU47CS8qICBhc3N1bWUgd2Ugd2lsbCBnZXQgIG5vdGhpbmcgKi8KIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KIAotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJHZXRDaGFyIik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlBbGxvd2kocGR4KTsJLyogIE1ha2Ugc3VyZSBjaGFyIHJlYWRzIGFyZSBydW5uaW5nICovCiAJU2VuZENoYXJzKHBkeCk7CS8qICBhbmQgc2VuZCBhbnkgYnVmZmVyZWQgY2hhcnMgKi8KQEAgLTQ5Nyw4ICs0OTgsOCBAQAogCQlwZHgtPmR3TnVtSW5wdXQgLT0gbkdvdDsKIAkJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPmNoYXJJbkxvY2spOwogCi0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiR2V0U3RyaW5nIHJlYWQgJWQgY2hhcmFjdGVycyA+JXM8IiwgbkdvdCwgYnVmZmVyKTsKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiByZWFkICVkIGNoYXJhY3RlcnMgPiVzPFxuIiwKKwkJCV9fZnVuY19fLCBuR290LCBidWZmZXIpOwogCQlpZiAoY29weV90b191c2VyKHBVc2VyLCBidWZmZXIsIG5Db3B5VG9Vc2VyKSkKIAkJCWlSZXR1cm4gPSAtRUZBVUxUOwogCQllbHNlCkBAIC01NTUsNyArNTU2LDcgQEAKIAl9CiAKIAlzcGluX3VubG9ja19pcnEoJnBkeC0+Y2hhckluTG9jayk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIkxpbmVDb3VudCByZXR1cm5lZCAlZCIsIGlSZXR1cm4pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwkvKiAgUHJvdGVjdCBkaXNjb25uZWN0IGZyb20gbmV3IGkvbyAqLwogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtNTcxLDcgKzU3Miw3IEBACiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CS8qICBQcm90ZWN0IGRpc2Nvbm5lY3QgZnJvbSBuZXcgaS9vICovCiAJU2VuZENoYXJzKHBkeCk7CQkvKiAgc2VuZCBhbnkgYnVmZmVyZWQgY2hhcnMgKi8KIAlpUmV0dXJuID0gKGludCkoT1VUQlVGX1NaIC0gcGR4LT5kd051bU91dHB1dCk7CS8qICBubyBsb2NrIG5lZWRlZCBmb3Igc2luZ2xlIHJlYWQgKi8KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiT3V0QnVmU3BhY2UgJWQiLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsJLyogIFByb3RlY3QgZGlzY29ubmVjdCBmcm9tIG5ldyBpL28gKi8KIAlyZXR1cm4gaVJldHVybjsKIH0KQEAgLTU4OSw3ICs1OTAsNyBAQAogCiAJaWYgKChuQXJlYSA8IDApIHx8IChuQXJlYSA+PSBNQVhfVFJBTlNBUkVBUykpIHsKIAkJaVJldHVybiA9IFUxNEVSUl9CQURBUkVBOwotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgQXR0ZW1wdCB0byBjbGVhciBhcmVhICVkIiwKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBBdHRlbXB0IHRvIGNsZWFyIGFyZWEgJWRcbiIsCiAJCQlfX2Z1bmNfXywgbkFyZWEpOwogCX0gZWxzZSB7CiAJCVRSQU5TQVJFQSAqcFRBID0gJnBkeC0+clRyYW5zRGVmW25BcmVhXTsJLyogIHRvIHNhdmUgdHlwaW5nICovCkBAIC02MDIsMTQgKzYwMywxNCBAQAogCQkJaW50IG5QYWdlcyA9IDA7CS8qICBhbmQgbnVtYmVyIG9mIHBhZ2VzICovCiAJCQlpbnQgbnA7CiAKLQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBhcmVhICVkIiwgX19mdW5jX18sCi0JCQkJbkFyZWEpOworCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBhcmVhICVkXG4iLAorCQkJCV9fZnVuY19fLCBuQXJlYSk7CiAJCQlzcGluX2xvY2tfaXJxKCZwZHgtPnN0YWdlZExvY2spOwogCQkJaWYgKChwZHgtPlN0YWdlZElkID09IG5BcmVhKQogCQkJICAgICYmIChwZHgtPmR3RE1BRmxhZyA+IE1PREVfQ0hBUikpIHsKIAkJCQlpUmV0dXJuID0gVTE0RVJSX1VOTE9DS0ZBSUw7CS8qICBjYW5ub3QgZGVsZXRlIGFzIGluIHVzZSAqLwogCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyBjYWxsIG9uIGFyZWEgJWQgd2hpbGUgYWN0aXZlIiwKKwkJCQkJIiVzOiBjYWxsIG9uIGFyZWEgJWQgd2hpbGUgYWN0aXZlXG4iLAogCQkJCQlfX2Z1bmNfXywgbkFyZWEpOwogCQkJfSBlbHNlIHsKIAkJCQlwUGFnZXMgPSBwVEEtPnBQYWdlczsJLyogIHNhdmUgcGFnZSBhZGRyZXNzIGxpc3QgKi8KQEAgLTYzMyw3ICs2MzQsNyBAQAogCQkJCS8qICBOb3cgd2UgbXVzdCB1bmRvIHRoZSBwaW5uaW5nIGRvd24gb2YgdGhlIHBhZ2VzLiBXZSB3aWxsIGFzc3VtZSB0aGUgd29yc3QgYW5kIG1hcmsgKi8KIAkJCQkvKiAgYWxsIHRoZSBwYWdlcyBhcyBkaXJ0eS4gRG9uJ3QgYmUgdGVtcHRlZCB0byBtb3ZlIHRoaXMgdXAgYWJvdmUgYXMgeW91IG11c3Qgbm90IGJlICovCiAJCQkJLyogIGhvbGRpbmcgYSBzcGluIGxvY2sgdG8gZG8gdGhpcyBzdHVmZiBhcyBpdCBpcyBub3QgYXRvbWljLiAqLwotCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBuUGFnZXM9JWQiLAorCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogblBhZ2VzPSVkXG4iLAogCQkJCQlfX2Z1bmNfXywgblBhZ2VzKTsKIAogCQkJCWZvciAobnAgPSAwOyBucCA8IG5QYWdlczsgKytucCkgewpAQCAtNjQ1LDcgKzY0Niw3IEBACiAKIAkJCQlrZnJlZShwUGFnZXMpOwogCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyBrZnJlZShwUGFnZXMpIGRvbmUiLCBfX2Z1bmNfXyk7CisJCQkJCSIlczoga2ZyZWUocFBhZ2VzKSBkb25lXG4iLCBfX2Z1bmNfXyk7CiAJCQl9CiAJCX0KIAl9CkBAIC02ODcsMTIgKzY4OCwxMiBAQAogCQlpUmV0dXJuID0gVTE0RVJSX05PTUVNT1JZOwogCQlnb3RvIGVycm9yOwogCX0KLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgJXAsIGxlbmd0aD0lMDZ4LCBjaXJjdWxhciAlZCIsCisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiAlcCwgbGVuZ3RoPSUwNngsIGNpcmN1bGFyICVkXG4iLAogCQlfX2Z1bmNfXywgcHVCdWYsIGR3TGVuZ3RoLCBiQ2lyY3VsYXIpOwogCiAJLyogIFRvIHBpbiBkb3duIHVzZXIgcGFnZXMgd2UgbXVzdCBmaXJzdCBhY3F1aXJlIHRoZSBtYXBwaW5nIHNlbWFwaG9yZS4gKi8KIAluUGFnZXMgPSBnZXRfdXNlcl9wYWdlc19mYXN0KHVsU3RhcnQsIGxlbiwgMSwgcFBhZ2VzKTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgblBhZ2VzID0gJWQiLCBfX2Z1bmNfXywgblBhZ2VzKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IG5QYWdlcyA9ICVkXG4iLCBfX2Z1bmNfXywgblBhZ2VzKTsKIAogCWlmIChuUGFnZXMgPiAwKSB7CQkvKiAgaWYgd2Ugc3VjY2VlZGVkICovCiAJCS8qICBJZiB5b3UgYXJlIHRlbXB0ZWQgdG8gdXNlIHBhZ2VfYWRkcmVzcyAoZm9ybSBMREQzKSwgZm9yZ2V0IGl0LiBZb3UgTVVTVCB1c2UgKi8KQEAgLTczNSwxNyArNzM2LDE3IEBACiAqKiB1bnNldCBpdC4gVW5zZXR0aW5nIHdpbGwgZmFpbCBpZiB0aGUgYXJlYSBpcyBib29rZWQsIGFuZCBhIHRyYW5zZmVyIHRvIHRoYXQKICoqIGFyZWEgaXMgaW4gcHJvZ3Jlc3MuIE90aGVyd2lzZSwgd2Ugd2lsbCByZWxlYXNlIHRoZSBhcmVhIGFuZCByZS1hc3NpZ24gaXQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFNldFRyYW5zZmVyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVFJBTlNGRVJERVNDIF9fdXNlciAqcFREKQoraW50IFNldFRyYW5zZmVyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyBfX3VzZXIgKnBURCkKIHsKIAlpbnQgaVJldHVybjsKLQlUUkFOU0ZFUkRFU0MgdGQ7CisJc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyB0ZDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdGQsIHBURCwgc2l6ZW9mKHRkKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGFyZWE6JWQsIHNpemU6JTA4eCIsIF9fZnVuY19fLAotCQl0ZC53QXJlYU51bSwgdGQuZHdMZW5ndGgpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYXJlYTolZCwgc2l6ZTolMDh4XG4iLAorCQlfX2Z1bmNfXywgdGQud0FyZWFOdW0sIHRkLmR3TGVuZ3RoKTsKIAkvKiAgVGhlIHN0cmFuZ2UgY2FzdCBpcyBkb25lIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHdhcm5pbmdzIGluIDMyLWJpdCBsaW51eCBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgKi8KIAkvKiAgcG9pbnRlci4gVGhlIHBvaW50ZXIgaXMgYWx3YXlzIHBhc3NlZCBhcyBhIDY0LWJpdCBvYmplY3Qgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHByb2JsZW1zIHVzaW5nICovCiAJLyogIGEgMzItYml0IHByb2dyYW0gb24gYSA2NC1iaXQgc3lzdGVtLiB1bnNpZ25lZCBsb25nIGlzIDY0LWJpdHMgb24gYSA2NC1iaXQgc3lzdGVtLiAqLwpAQCAtNzc4LDEwICs3NzksMTAgQEAKICoqIHByZXRlbmQgdGhhdCB3aGF0ZXZlciB0aGUgdXNlciBhc2tlZCBmb3Igd2FzIGFjaGlldmVkLCBzbyB3ZSByZXR1cm4gMSBpZgogKiogdHJ5IHRvIGNyZWF0ZSBvbmUsIGFuZCAwIGlmIHRoZXkgYXNrIHRvIHJlbW92ZSAoYXNzdW1pbmcgYWxsIGVsc2Ugd2FzIE9LKS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgU2V0RXZlbnQoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUUkFOU0ZFUkVWRU5UIF9fdXNlciAqcFRFKQoraW50IFNldEV2ZW50KERFVklDRV9FWFRFTlNJT04gKnBkeCwgc3RydWN0IHRyYW5zZmVyX2V2ZW50IF9fdXNlciAqcFRFKQogewogCWludCBpUmV0dXJuID0gVTE0RVJSX05PRVJST1I7Ci0JVFJBTlNGRVJFVkVOVCB0ZTsKKwlzdHJ1Y3QgdHJhbnNmZXJfZXZlbnQgdGU7CiAKIAkvKiAgZ2V0IGEgbG9jYWwgY29weSBvZiB0aGUgZGF0YSAqLwogCWlmIChjb3B5X2Zyb21fdXNlcigmdGUsIHBURSwgc2l6ZW9mKHRlKSkpCkBAIC05MjIsNyArOTIzLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgS2lsbElPMTQwMShERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwogCUZsdXNoT3V0QnVmZihwZHgpOwogCUZsdXNoSW5CdWZmKHBkeCk7CkBAIC05MzgsNyArOTM5LDcgQEAKIGludCBCbGtUcmFuc1N0YXRlKERFVklDRV9FWFRFTlNJT04gKnBkeCkKIHsKIAlpbnQgaVJldHVybiA9IHBkeC0+ZHdETUFGbGFnICE9IE1PREVfQ0hBUjsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgPSAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJcmV0dXJuIGlSZXR1cm47CiB9CiAKQEAgLTk1Niw3ICs5NTcsNyBAQAogCWlSZXR1cm4gPSBwZHgtPnNDdXJyZW50U3RhdGU7CiAKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyA9ICVkIiwgX19mdW5jX18sIGlSZXR1cm4pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtOTcxLDcgKzk3Miw3IEBACiB7CiAJaW50IG5Hb3Q7CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJY2VkX2RyYXdfZG93bihwZHgpOwkvKiAgd2FpdCBmb3IsIHRoZW4ga2lsbCBvdXRzdGFuZGluZyBVcmJzICovCiAJRmx1c2hJbkJ1ZmYocGR4KTsJLyogIENsZWFyIG91dCBpbnB1dCBidWZmZXIgJiBwaXBlICovCkBAIC05ODcsNyArOTg4LDcgQEAKIAogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CiAJaWYgKG5Hb3QgPCAwKQotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZXJyPSVkIiwgX19mdW5jX18sIG5Hb3QpOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGVycj0lZFxuIiwgX19mdW5jX18sIG5Hb3QpOwogCXJldHVybiBuR290IDwgMCA/IFUxNEVSUl9GQUlMIDogVTE0RVJSX05PRVJST1I7CiB9CiAKQEAgLTEwMDUsNyArMTAwNiw3IEBACiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKIAotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlpUmV0dXJuID0gR2V0MTQwMVN0YXRlKHBkeCwgJnN0YXRlLCAmZXJyb3IpOwogCWlmIChpUmV0dXJuID09IFUxNEVSUl9OT0VSUk9SKQkvKiAgT25seSBhY2NlcHQgemVybyBpZiBpdCBoYXBwZW5zIHR3aWNlICovCiAJCWlSZXR1cm4gPSBHZXQxNDAxU3RhdGUocGR4LCAmc3RhdGUsICZlcnJvcik7CkBAIC0xMDEzLDggKzEwMTQsOCBAQAogCWlmIChpUmV0dXJuICE9IFUxNEVSUl9OT0VSUk9SKSB7CS8qICBTZWxmLXRlc3QgY2FuIGNhdXNlIGNvbW1zIGVycm9ycyAqLwogCQkJCS8qICBzbyB3ZSBhc3N1bWUgc3RpbGwgdGVzdGluZyAqLwogCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzIEdldDE0MDFTdGF0ZT0lZCwgYXNzdW1pbmcgc3RpbGwgdGVzdGluZyIsIF9fZnVuY19fLAotCQkJaVJldHVybik7CisJCQkiJXM6IEdldDE0MDFTdGF0ZT0lZCwgYXNzdW1pbmcgc3RpbGwgdGVzdGluZ1xuIiwKKwkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAkJc3RhdGUgPSAweDgwOwkvKiAgRm9yY2Ugc3RpbGwtdGVzdGluZywgbm8gZXJyb3IgKi8KIAkJZXJyb3IgPSAwOwogCQlpUmV0dXJuID0gVTE0RVJSX05PRVJST1I7CkBAIC0xMDIyLDcgKzEwMjMsNyBAQAogCiAJaWYgKChzdGF0ZSA9PSAtMSkgJiYgKGVycm9yID09IC0xKSkgewkvKiAgSWYgR2V0MTQwMVN0YXRlIGhhZCBwcm9ibGVtcyAqLwogCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzIEdldDE0MDFTdGF0ZSBmYWlsZWQsIGFzc3VtaW5nIHN0aWxsIHRlc3RpbmciLAorCQkJIiVzOiBHZXQxNDAxU3RhdGUgZmFpbGVkLCBhc3N1bWluZyBzdGlsbCB0ZXN0aW5nXG4iLAogCQkJX19mdW5jX18pOwogCQlzdGF0ZSA9IDB4ODA7CS8qICBGb3JjZSBzdGlsbC10ZXN0aW5nLCBubyBlcnJvciAqLwogCQllcnJvciA9IDA7CkBAIC0xMDMzLDIxICsxMDM0LDIxIEBACiAJCQlnc3QuY29kZSA9IChzdGF0ZSAmIDB4MDBGRjAwMDApID4+IDE2OwkvKiAgcmVhZCB0aGUgZXJyb3IgY29kZSAqLwogCQkJZ3N0LnggPSBlcnJvciAmIDB4MDAwMEZGRkY7CS8qICBFcnJvciBkYXRhIFggKi8KIAkJCWdzdC55ID0gKGVycm9yICYgMHhGRkZGMDAwMCkgPj4gMTY7CS8qICBhbmQgZGF0YSBZICovCi0JCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiU2VsZi10ZXN0IGVycm9yIGNvZGUgJWQiLAotCQkJCWdzdC5jb2RlKTsKKwkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCisJCQkJIlNlbGYtdGVzdCBlcnJvciBjb2RlICVkXG4iLCBnc3QuY29kZSk7CiAJCX0gZWxzZSB7CQkvKiAgTm8gZXJyb3IsIGNoZWNrIGZvciB0aW1lb3V0ICovCiAJCQl1bnNpZ25lZCBsb25nIHVsTm93ID0gamlmZmllczsJLyogIGdldCBjdXJyZW50IHRpbWUgKi8KIAkJCWlmICh0aW1lX2FmdGVyKHVsTm93LCBwZHgtPnVsU2VsZlRlc3RUaW1lKSkgewogCQkJCWdzdC5jb2RlID0gLTI7CS8qICBGbGFnIHRoZSB0aW1lb3V0ICovCiAJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIlNlbGYtdGVzdCB0aW1lZC1vdXQiKTsKKwkJCQkJIlNlbGYtdGVzdCB0aW1lZC1vdXRcbiIpOwogCQkJfSBlbHNlCiAJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIlNlbGYtdGVzdCBvbi1nb2luZyIpOworCQkJCQkiU2VsZi10ZXN0IG9uLWdvaW5nXG4iKTsKIAkJfQogCX0gZWxzZSB7CiAJCWdzdC5jb2RlID0gLTE7CS8qICBGbGFnIHRoZSB0ZXN0IGlzIGRvbmUgKi8KLQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlNlbGYtdGVzdCBkb25lIik7CisJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJTZWxmLXRlc3QgZG9uZVxuIik7CiAJfQogCiAJaWYgKGdzdC5jb2RlIDwgMCkgewkvKiAgSWYgd2UgaGF2ZSBhIHByb2JsZW0gb3IgZmluaXNoZWQgKi8KQEAgLTEwNzQsNyArMTA3NSw3IEBACiB7CiAJaW50IGlSZXR1cm4gPSBUWVBFVU5LTk9XTjsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHBkeC0+czE0MDFUeXBlKSB7CiAJY2FzZSBUWVBFMTQwMToKQEAgLTEwOTIsNyArMTA5Myw3IEBACiAJCWVsc2UJCS8qICAgZm9yIHVwLWNvbWluZyAxNDAxIGRlc2lnbnMgKi8KIAkJCWlSZXR1cm4gPSBUWVBFVU5LTk9XTjsJLyogIERvbid0IGtub3cgb3Igbm90IHRoZXJlICovCiAJfQotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAltdXRleF91bmxvY2soJnBkeC0+aW9fbXV0ZXgpOwogCiAJcmV0dXJuIGlSZXR1cm47CkBAIC0xMTA3LDcgKzExMDgsNyBAQAogewogCWludCBpUmV0dXJuID0gVTE0VEZfTVVMVElBIHwgVTE0VEZfRElBRyB8CS8qICB3ZSBhbHdheXMgaGF2ZSBtdWx0aXBsZSBETUEgYXJlYSAqLwogCSAgICBVMTRURl9OT1RJRlkgfCBVMTRURl9DSVJDVEg7CS8qICBkaWFnbm9zdGljcywgbm90aWZ5IGFuZCBjaXJjdWxhciAqLwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKIAlpZiAocGR4LT5iSXNVU0IyKQkvKiAgU2V0IGZsYWcgZm9yIFVTQjIgaWYgYXBwcm9wcmlhdGUgKi8KIAkJaVJldHVybiB8PSBVMTRURl9VU0IyOwpAQCAtMTEyNSwxNSArMTEyNiwxNSBAQAogCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YSkKIHsKIAlpbnQgaVJldHVybjsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZW50cnkiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBlbnRyeVxuIiwgX19mdW5jX18pOwogCWlSZXR1cm4gPSB1c2JfY29udHJvbF9tc2cocGR4LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUocGR4LT51ZGV2LCAwKSwgY21kLAogCQkJCSAgKEhfVE9fRCB8IFZFTkRPUiB8IERFVlJFUSksCiAJCQkJICAodW5zaWduZWQgc2hvcnQpZGF0YSwKIAkJCQkgICh1bnNpZ25lZCBzaG9ydCkoZGF0YSA+PiAxNiksIE5VTEwsIDAsIEhaKTsKIAkJCQkJCS8qIGFsbG93IDEgc2Vjb25kIHRpbWVvdXQgKi8KIAlpZiAoaVJldHVybiA8IDApCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBmYWlsIGNvZGU9JWQiLCBfX2Z1bmNfXywKLQkJCWlSZXR1cm4pOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGZhaWwgY29kZT0lZFxuIiwKKwkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtMTE1Miw3ICsxMTUzLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgQCAlMDh4IiwgX19mdW5jX18sIGRiLmlBZGRyKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IEAgJTA4eFxuIiwgX19mdW5jX18sIGRiLmlBZGRyKTsKIAogCWlSZXR1cm4gPSBEYmdDbWQxNDAxKHBkeCwgREJfU0VUQURELCBkYi5pQWRkcik7CiAJaWYgKGlSZXR1cm4gPT0gVTE0RVJSX05PRVJST1IpCkBAIC0xMTgxLDcgKzExODIsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBAICUwOHgiLCBfX2Z1bmNfXywgZGIuaUFkZHIpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogQCAlMDh4XG4iLCBfX2Z1bmNfXywgZGIuaUFkZHIpOwogCiAJaVJldHVybiA9IERiZ0NtZDE0MDEocGR4LCBEQl9TRVRBREQsIGRiLmlBZGRyKTsKIAlpZiAoaVJldHVybiA9PSBVMTRFUlJfTk9FUlJPUikKQEAgLTEyMTAsNyArMTIxMSw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIEAgJTA4eCIsIF9fZnVuY19fLCBkYi5pQWRkcik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBAICUwOHhcbiIsIF9fZnVuY19fLCBkYi5pQWRkcik7CiAKIAlpUmV0dXJuID0gRGJnQ21kMTQwMShwZHgsIERCX1NFVEFERCwgZGIuaUFkZHIpOwogCWlmIChpUmV0dXJuID09IFUxNEVSUl9OT0VSUk9SKQpAQCAtMTI0Miw3ICsxMjQzLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpUmV0dXJuID0gRGJnQ21kMTQwMShwZHgsIERCX1NFVERFRiwgZGIuaURlZmF1bHQpOwogCWlmIChpUmV0dXJuID09IFUxNEVSUl9OT0VSUk9SKQpAQCAtMTI3MCw3ICsxMjcxLDcgQEAKIAltZW1zZXQoJmRiLCAwLCBzaXplb2YoZGIpKTsJLyogIGZpbGwgcmV0dXJuZWQgYmxvY2sgd2l0aCAwcyAqLwogCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogIFJlYWQgYmFjayB0aGUgbGFzdCBwZWVrZWQgdmFsdWUgZnJvbSB0aGUgMTQwMS4gKi8KIAlpUmV0dXJuID0gdXNiX2NvbnRyb2xfbXNnKHBkeC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKHBkeC0+dWRldiwgMCksCkBAIC0xMjgyLDggKzEyODMsOCBAQAogCQllbHNlCiAJCQlpUmV0dXJuID0gVTE0RVJSX05PRVJST1I7CiAJfSBlbHNlCi0JCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBmYWlsZWQsIGNvZGUgJWQiLCBfX2Z1bmNfXywKLQkJCWlSZXR1cm4pOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGZhaWxlZCwgY29kZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CiAKQEAgLTEzMDIsNyArMTMwMyw3IEBACiAJdW5zaWduZWQgaW50IHVTdGF0ZSwgdUVycjsKIAogCW11dGV4X2xvY2soJnBkeC0+aW9fbXV0ZXgpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlpUmV0dXJuID0gR2V0MTQwMVN0YXRlKHBkeCwgJnVTdGF0ZSwgJnVFcnIpOwogCW11dGV4X3VubG9jaygmcGR4LT5pb19tdXRleCk7CiAKQEAgLTEzMTcsMTggKzEzMTgsMTggQEAKICoqIGJvb2tlZCBhbmQgYSB0cmFuc2ZlciB0byB0aGF0IGFyZWEgaXMgaW4gcHJvZ3Jlc3MuIE90aGVyd2lzZSwgd2Ugd2lsbAogKiogcmVsZWFzZSB0aGUgYXJlYSBhbmQgcmUtYXNzaWduIGl0LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBTZXRDaXJjdWxhcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSREVTQyBfX3VzZXIgKnBURCkKK2ludCBTZXRDaXJjdWxhcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgX191c2VyICpwVEQpCiB7CiAJaW50IGlSZXR1cm47CiAJYm9vbCBiVG9Ib3N0OwotCVRSQU5TRkVSREVTQyB0ZDsKKwlzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIHRkOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ZCwgcFRELCBzaXplb2YodGQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgYXJlYTolZCwgc2l6ZTolMDh4IiwgX19mdW5jX18sCi0JCXRkLndBcmVhTnVtLCB0ZC5kd0xlbmd0aCk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBhcmVhOiVkLCBzaXplOiUwOHhcbiIsCisJCV9fZnVuY19fLCB0ZC53QXJlYU51bSwgdGQuZHdMZW5ndGgpOwogCWJUb0hvc3QgPSB0ZC5lU2l6ZSAhPSAwOwkvKiAgdGhpcyBpcyB1c2VkIGFzIHRoZSB0b2hvc3QgZmxhZyAqLwogCiAJLyogIFRoZSBzdHJhbmdlIGNhc3QgaXMgZG9uZSBzbyB0aGF0IHdlIGRvbid0IGdldCB3YXJuaW5ncyBpbiAzMi1iaXQgbGludXggYWJvdXQgdGhlIHNpemUgb2YgdGhlICovCkBAIC0xMzUzLDcgKzEzNTQsNyBAQAogCXVuc2lnbmVkIGludCBuQXJlYTsKIAlUQ0lSQ0JMT0NLIGNiOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjYiwgcENCLCBzaXplb2YoY2IpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMzc0LDcgKzEzNzUsNyBAQAogCQkJCWNiLmR3T2Zmc2V0ID0gcEFyZWEtPmFCbG9ja3NbMF0uZHdPZmZzZXQ7CiAJCQkJY2IuZHdTaXplID0gcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplOwogCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSIlcyByZXR1cm4gYmxvY2sgMDogJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkiJXM6IHJldHVybiBibG9jayAwOiAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJX19mdW5jX18sIGNiLmR3U2l6ZSwgY2IuZHdPZmZzZXQpOwogCQkJfQogCQl9IGVsc2UKQEAgLTE0MDIsNyArMTQwMyw3IEBACiAJdW5zaWduZWQgaW50IG5BcmVhLCB1U3RhcnQsIHVTaXplOwogCVRDSVJDQkxPQ0sgY2I7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNiLCBwQ0IsIHNpemVvZihjYikpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE0MzcsNyArMTQzOCw3IEBACiAJCQkJfQogCiAJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIiVzIGZyZWUgJWQgYnl0ZXMgYXQgJWQsIHJldHVybiAlZCBieXRlcyBhdCAlZCwgd2FpdD0lZCIsCisJCQkJCSIlczogZnJlZSAlZCBieXRlcyBhdCAlZCwgcmV0dXJuICVkIGJ5dGVzIGF0ICVkLCB3YWl0PSVkXG4iLAogCQkJCQlfX2Z1bmNfXywgdVNpemUsIHVTdGFydCwKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplLAogCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCwKQEAgLTE0NTMsMTMgKzE0NTQsMTMgQEAKIAkJCQliV2FpdGluZyA9IHBkeC0+YlhGZXJXYWl0aW5nOwogCQkJCWlmIChiV2FpdGluZyAmJiBwZHgtPmJTdGFnZWRVcmJQZW5kaW5nKSB7CiAJCQkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgRVJST1I6IHdhaXRpbmcgeGZlciBhbmQgc3RhZ2VkIFVyYiBwZW5kaW5nISIsCisJCQkJCQkiJXM6IEVSUk9SOiB3YWl0aW5nIHhmZXIgYW5kIHN0YWdlZCBVcmIgcGVuZGluZyFcbiIsCiAJCQkJCQlfX2Z1bmNfXyk7CiAJCQkJCWJXYWl0aW5nID0gZmFsc2U7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiJXMgRVJST1I6IGZyZWVpbmcgJWQgYnl0ZXMgYXQgJWQsIGJsb2NrIDAgaXMgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkiJXM6IEVSUk9SOiBmcmVlaW5nICVkIGJ5dGVzIGF0ICVkLCBibG9jayAwIGlzICVkIGJ5dGVzIGF0ICVkXG4iLAogCQkJCQlfX2Z1bmNfXywgdVNpemUsIHVTdGFydCwKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplLAogCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCk7CkBAIC0xNDc1LDcgKzE0NzYsNyBAQAogCQkJCQkJIHBkeC0+ckRNQUluZm8uZHdTaXplKTsKIAkJCQlpZiAoUldNU3RhdCAhPSBVMTRFUlJfTk9FUlJPUikKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBydyBzZXR1cCBmYWlsZWQgJWQiLAorCQkJCQkJIiVzOiBydyBzZXR1cCBmYWlsZWQgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgUldNU3RhdCk7CiAJCQl9CiAJCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvY2VkX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jdGwuaAppbmRleCBhYTY4ODc4Li40YjZjOWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS9jZWRfaW9jdGwuaApAQCAtMjYsMjQgKzI2LDIxIEBACiAqKiBUeXBlRGVmcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVEJMT0NLRU5UUlk7CS8qIGluZGV4IHRoZSBibGsgdHJhbnNmZXIgdGFibGUgMC03ICovCi0KLXR5cGVkZWYgc3RydWN0IFRyYW5zZmVyRGVzYyB7CitzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIHsKIAlsb25nIGxvbmcgbHB2QnVmZjsJLyogYWRkcmVzcyBvZiB0cmFuc2ZlciBhcmVhIChmb3IgNjQgb3IgMzIgYml0KSAqLwogCXVuc2lnbmVkIGludCBkd0xlbmd0aDsJLyogbGVuZ3RoIG9mIHRoZSBhcmVhICovCi0JVEJMT0NLRU5UUlkgd0FyZWFOdW07CS8qIG51bWJlciBvZiB0cmFuc2ZlciBhcmVhIHRvIHNldCB1cCAqLworCXVuc2lnbmVkIHNob3J0IHdBcmVhTnVtOwkvKiBudW1iZXIgb2YgdHJhbnNmZXIgYXJlYSB0byBzZXQgdXAgKi8KIAlzaG9ydCBlU2l6ZTsJCS8qIGVsZW1lbnQgc2l6ZSAtIGlzIHRvaG9zdCBmbGFnIGZvciBjaXJjdWxhciAqLwotfSBUUkFOU0ZFUkRFU0M7Cit9OwogCi10eXBlZGVmIFRSQU5TRkVSREVTQyAqTFBUUkFOU0ZFUkRFU0M7CiAKLXR5cGVkZWYgc3RydWN0IFRyYW5zZmVyRXZlbnQgeworc3RydWN0IHRyYW5zZmVyX2V2ZW50IHsKIAl1bnNpZ25lZCBpbnQgZHdTdGFydDsJCS8qIG9mZnNldCBpbnRvIHRoZSBhcmVhICovCiAJdW5zaWduZWQgaW50IGR3TGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHRoZSByZWdpb24gKi8KIAl1bnNpZ25lZCBzaG9ydCB3QXJlYU51bTsJLyogdGhlIGFyZWEgbnVtYmVyICovCiAJdW5zaWduZWQgc2hvcnQgd0ZsYWdzOwkJLyogYml0IDAgc2V0IGZvciB0b0hvc3QgKi8KIAlpbnQgaVNldEV2ZW50OwkJCS8qIGNvdWxkIGJlIGR1bW15IGluIExJTlVYICovCi19IFRSQU5TRkVSRVZFTlQ7Cit9OwogCiAjZGVmaW5lIE1BWF9UUkFOU0ZFUl9TSVpFCTB4NDAwMAkJLyogTWF4aW11bSBkYXRhIGJ5dGVzIHBlciBJUlAgKi8KICNkZWZpbmUgTUFYX0FSRUFfTEVOR1RICQkweDEwMDAwMAkvKiBNYXhpbXVtIHNpemUgb2YgdHJhbnNmZXIgYXJlYSAqLwpAQCAtODUsMTIgKzgyLDYgQEAKICAqLwogI2RlZmluZSBDRURfTUFHSUNfSU9DIDB4Y2UKIAotLyogTkJOQjogUkVBRCBhbmQgV1JJVEUgYXJlIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGRldmljZSwgbm90IHVzZXIuICovCi10eXBlZGVmIHN0cnVjdCBjZWRfaW9jX3N0cmluZyB7Ci0JaW50IG5DaGFyczsKLQljaGFyIGJ1ZmZlclsyNTZdOwotfSBDRURfSU9DX1NUUklORzsKLQogI2RlZmluZSBJT0NUTF9DRURfU0VORFNUUklORyhuKQkJX0lPQyhfSU9DX1dSSVRFLCBDRURfTUFHSUNfSU9DLCAyLCBuKQogCiAjZGVmaW5lIElPQ1RMX0NFRF9SRVNFVDE0MDEJCV9JTyhDRURfTUFHSUNfSU9DLCAzKQpAQCAtMTAwLDkgKzkxLDkgQEAKICNkZWZpbmUgSU9DVExfQ0VEX0xJTkVDT1VOVAkJX0lPKENFRF9NQUdJQ19JT0MsIDcpCiAjZGVmaW5lIElPQ1RMX0NFRF9HRVRTVFJJTkcobk1heCkJX0lPQyhfSU9DX1JFQUQsIENFRF9NQUdJQ19JT0MsIDgsIG5NYXgpCiAKLSNkZWZpbmUgSU9DVExfQ0VEX1NFVFRSQU5TRkVSCQlfSU9XKENFRF9NQUdJQ19JT0MsIDExLCBUUkFOU0ZFUkRFU0MpCisjZGVmaW5lIElPQ1RMX0NFRF9TRVRUUkFOU0ZFUgkJX0lPVyhDRURfTUFHSUNfSU9DLCAxMSwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYykKICNkZWZpbmUgSU9DVExfQ0VEX1VOU0VUVFJBTlNGRVIJCV9JTyhDRURfTUFHSUNfSU9DLCAxMikKLSNkZWZpbmUgSU9DVExfQ0VEX1NFVEVWRU5UCQlfSU9XKENFRF9NQUdJQ19JT0MsIDEzLCBUUkFOU0ZFUkVWRU5UKQorI2RlZmluZSBJT0NUTF9DRURfU0VURVZFTlQJCV9JT1coQ0VEX01BR0lDX0lPQywgMTMsIHN0cnVjdCB0cmFuc2Zlcl9ldmVudCkKICNkZWZpbmUgSU9DVExfQ0VEX0dFVE9VVEJVRlNQQUNFCV9JTyhDRURfTUFHSUNfSU9DLCAxNCkKICNkZWZpbmUgSU9DVExfQ0VEX0dFVEJBU0VBRERSRVNTCV9JTyhDRURfTUFHSUNfSU9DLCAxNSkKICNkZWZpbmUgSU9DVExfQ0VEX0dFVERSSVZFUlJFVklTSU9OCV9JTyhDRURfTUFHSUNfSU9DLCAxNikKQEAgLTEyNiw3ICsxMTcsNyBAQAogI2RlZmluZSBJT0NUTF9DRURfREJHR0VUREFUQQkJX0lPUihDRURfTUFHSUNfSU9DLCAzOSwgVERCR0JMT0NLKQogI2RlZmluZSBJT0NUTF9DRURfREJHU1RPUExPT1AJCV9JTyhDRURfTUFHSUNfSU9DLCA0MCkKICNkZWZpbmUgSU9DVExfQ0VEX0ZVTExSRVNFVAkJX0lPKENFRF9NQUdJQ19JT0MsIDQxKQotI2RlZmluZSBJT0NUTF9DRURfU0VUQ0lSQ1VMQVIJCV9JT1coQ0VEX01BR0lDX0lPQywgNDIsIFRSQU5TRkVSREVTQykKKyNkZWZpbmUgSU9DVExfQ0VEX1NFVENJUkNVTEFSCQlfSU9XKENFRF9NQUdJQ19JT0MsIDQyLCBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjKQogI2RlZmluZSBJT0NUTF9DRURfR0VUQ0lSQ0JMT0NLCQlfSU9XUihDRURfTUFHSUNfSU9DLCA0MywgVENJUkNCTE9DSykKICNkZWZpbmUgSU9DVExfQ0VEX0ZSRUVDSVJDQkxPQ0sJCV9JT1dSKENFRF9NQUdJQ19JT0MsIDQ0LCBUQ0lSQ0JMT0NLKQogI2RlZmluZSBJT0NUTF9DRURfV0FJVEVWRU5UCQlfSU8oQ0VEX01BR0lDX0lPQywgNDUpCkBAIC0xOTgsNyArMTg5LDcgQEAKIAlyZXR1cm4gaW9jdGwoZmgsIElPQ1RMX0NFRF9HRVREUklWRVJSRVZJU0lPTik7CiB9CiAKLWlubGluZSBpbnQgQ0VEX1NldFRyYW5zZmVyKGludCBmaCwgVFJBTlNGRVJERVNDICpwVEQpCitpbmxpbmUgaW50IENFRF9TZXRUcmFuc2ZlcihpbnQgZmgsIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgKnBURCkKIHsKIAlyZXR1cm4gaW9jdGwoZmgsIElPQ1RMX0NFRF9TRVRUUkFOU0ZFUiwgcFREKTsKIH0KQEAgLTIwOCw3ICsxOTksNyBAQAogCXJldHVybiBpb2N0bChmaCwgSU9DVExfQ0VEX1VOU0VUVFJBTlNGRVIsIG5BcmVhKTsKIH0KIAotaW5saW5lIGludCBDRURfU2V0RXZlbnQoaW50IGZoLCBUUkFOU0ZFUkVWRU5UICpwVEUpCitpbmxpbmUgaW50IENFRF9TZXRFdmVudChpbnQgZmgsIHN0cnVjdCB0cmFuc2Zlcl9ldmVudCAqcFRFKQogewogCXJldHVybiBpb2N0bChmaCwgSU9DVExfQ0VEX1NFVEVWRU5ULCBwVEUpOwogfQpAQCAtMjk5LDcgKzI5MCw3IEBACiAJcmV0dXJuIGlvY3RsKGZoLCBJT0NUTF9DRURfRlVMTFJFU0VUKTsKIH0KIAotaW5saW5lIGludCBDRURfU2V0Q2lyY3VsYXIoaW50IGZoLCBUUkFOU0ZFUkRFU0MgKnBURCkKK2lubGluZSBpbnQgQ0VEX1NldENpcmN1bGFyKGludCBmaCwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyAqcFREKQogewogCXJldHVybiBpb2N0bChmaCwgSU9DVExfQ0VEX1NFVENJUkNVTEFSLCBwVEQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5jCmluZGV4IGVmYzMxMGMuLjI4NGFiYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzYjE0MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICIlcyBnb3QgcGR4IiwgX19mdW5jX18pOworCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiJXM6IGdvdCBwZHhcbiIsIF9fZnVuY19fKTsKIAogCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KIAlrcmVmX2dldCgmcGR4LT5rcmVmKTsKQEAgLTE4NCw3ICsxODQsNyBAQAogCQkJZ290byBleGl0OwogCQl9CiAJfSBlbHNlIHsJCS8qIHVuY29tbWVudCB0aGlzIGJsb2NrIGlmIHlvdSB3YW50IGV4Y2x1c2l2ZSBvcGVuICovCi0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiJXMgZmFpbDogYWxyZWFkeSBvcGVuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBmYWlsOiBhbHJlYWR5IG9wZW5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dmFsID0gLUVCVVNZOwogCQlwZHgtPm9wZW5fY291bnQtLTsKIAkJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKQEAgLTIwNyw3ICsyMDcsNyBAQAogCWlmIChwZHggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2FsbGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7CiAJaWYgKCEtLXBkeC0+b3Blbl9jb3VudCAmJiBwZHgtPmludGVyZmFjZSkJLyogIEFsbG93IGF1dG9zdXNwZW5kICovCiAJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShwZHgtPmludGVyZmFjZSk7CkBAIC0yMjQsMTIgKzIyNCwxMiBAQAogCWlmIChwZHggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2hhciBpbiBwZW5kPSVkIiwgX19mdW5jX18sCi0JCXBkeC0+YlJlYWRDaGFyc1BlbmRpbmcpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2hhciBpbiBwZW5kPSVkXG4iLAorCQlfX2Z1bmNfXywgcGR4LT5iUmVhZENoYXJzUGVuZGluZyk7CiAKIAkvKiB3YWl0IGZvciBpbyB0byBzdG9wICovCiAJbXV0ZXhfbG9jaygmcGR4LT5pb19tdXRleCk7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGdvdCBpb19tdXRleCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGdvdCBpb19tdXRleFxuIiwgX19mdW5jX18pOwogCWNlZF9kcmF3X2Rvd24ocGR4KTsKIAogCS8qIHJlYWQgb3V0IGVycm9ycywgbGVhdmUgc3Vic2VxdWVudCBvcGVucyBhIGNsZWFuIHNsYXRlICovCkBAIC0yMzksNyArMjM5LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJnBkeC0+ZXJyX2xvY2spOwogCiAJbXV0ZXhfdW5sb2NrKCZwZHgtPmlvX211dGV4KTsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgZXhpdCByZWFjaGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZXhpdCByZWFjaGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCSAgICAocFVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgcFVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUCiAJCSAgICAgfHwgcFVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKSB7CiAJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCQkiJXM6IG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAogCQkJCV9fZnVuY19fLCBwVXJiLT5zdGF0dXMpOwogCQl9CiAKQEAgLTI4NywxMCArMjg3LDEwIEBACiAJCXBkeC0+YlNlbmRDaGFyc1BlbmRpbmcgPSBmYWxzZTsJLyogIEFsbG93IG90aGVyIHRocmVhZHMgYWdhaW4gKi8KIAkJc3Bpbl91bmxvY2soJnBkeC0+Y2hhck91dExvY2spOwkvKiAgYWxyZWFkeSBhdCBpcnEgbGV2ZWwgKi8KIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyAtIGNoYXIgb3V0IGRvbmUsIDAgY2hhcnMgc2VudCIsIF9fZnVuY19fKTsKKwkJCSIlczogY2hhciBvdXQgZG9uZSwgMCBjaGFycyBzZW50XG4iLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyAtIGNoYXIgb3V0IGRvbmUsICVkIGNoYXJzIHNlbnQiLCBfX2Z1bmNfXywgbkdvdCk7CisJCQkiJXM6IGNoYXIgb3V0IGRvbmUsICVkIGNoYXJzIHNlbnRcbiIsIF9fZnVuY19fLCBuR290KTsKIAkJc3Bpbl9sb2NrKCZwZHgtPmNoYXJPdXRMb2NrKTsJLyogIGFscmVhZHkgYXQgaXJxIGxldmVsICovCiAJCXBkeC0+ZHdOdW1PdXRwdXQgLT0gbkdvdDsJLyogIE5vdyBhZGp1c3QgdGhlIGNoYXIgc2VuZCBidWZmZXIgKi8KIAkJcGR4LT5kd091dEJ1ZmZHZXQgKz0gbkdvdDsJLyogIHRvIG1hdGNoIHdoYXQgd2UgZGlkICovCkBAIC0zMTUsMTUgKzMxNSwxNSBAQAogCQkJICAgIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCQkJdXNiX2FuY2hvcl91cmIocGR4LT5wVXJiQ2hhck91dCwgJnBkeC0+c3VibWl0dGVkKTsJLyogIGluIGNhc2Ugd2UgbmVlZCB0byBraWxsIGl0ICovCiAJCQlpUmV0dXJuID0gdXNiX3N1Ym1pdF91cmIocGR4LT5wVXJiQ2hhck91dCwgR0ZQX0FUT01JQyk7Ci0JCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgbj0lZD4lczwiLCBfX2Z1bmNfXywKLQkJCQlkd0NvdW50LCBwRGF0KTsKKwkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogbj0lZD4lczxcbiIsCisJCQkJX19mdW5jX18sIGR3Q291bnQsIHBEYXQpOwogCQkJc3Bpbl9sb2NrKCZwZHgtPmNoYXJPdXRMb2NrKTsJLyogIGdyYWIgbG9jayBmb3IgZXJyb3JzICovCiAJCQlpZiAoaVJldHVybikgewogCQkJCXBkeC0+YlBpcGVFcnJvcltuUGlwZV0gPSAxOwkvKiAgRmxhZyBhbiBlcnJvciB0byBiZSBoYW5kbGVkIGxhdGVyICovCiAJCQkJcGR4LT5iU2VuZENoYXJzUGVuZGluZyA9IGZhbHNlOwkvKiAgQWxsb3cgb3RoZXIgdGhyZWFkcyBhZ2FpbiAqLwogCQkJCXVzYl91bmFuY2hvcl91cmIocGR4LT5wVXJiQ2hhck91dCk7CiAJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIiVzIHVzYl9zdWJtaXRfdXJiKCkgcmV0dXJuZWQgJWQiLAorCQkJCQkiJXM6IHVzYl9zdWJtaXRfdXJiKCkgcmV0dXJuZWQgJWRcbiIsCiAJCQkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAkJCX0KIAkJfSBlbHNlCkBAIC0zNTAsOCArMzUwLDggQEAKIAkJcGR4LT5iU2VuZENoYXJzUGVuZGluZyA9IHRydWU7CS8qICBTZXQgZmxhZyB0byBsb2NrIG91dCBvdGhlciB0aHJlYWRzICovCiAKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSJTZW5kICVkIGNoYXJzIHRvIDE0MDEsIEVQMCBmbGFnICVkXG4iLCBkd0NvdW50LAotCQkJcGR4LT5uUGlwZXMgPT0gMyk7CisJCQkiU2VuZCAlZCBjaGFycyB0byAxNDAxLCBFUDAgZmxhZyAlZFxuIiwKKwkJCWR3Q291bnQsIHBkeC0+blBpcGVzID09IDMpOwogCQkvKiAgSWYgd2UgaGF2ZSBvbmx5IDMgZW5kIHBvaW50cyB3ZSBtdXN0IHNlbmQgdGhlIGNoYXJhY3RlcnMgdG8gdGhlIDE0MDEgdXNpbmcgRVAwLiAqLwogCQlpZiAocGR4LT5uUGlwZXMgPT0gMykgewogCQkJLyogIEZvciBFUDAgY2hhcmFjdGVyIHRyYW5zbWlzc2lvbnMgdG8gdGhlIDE0MDEsIHdlIGhhdmUgdG8gaGFuZyBhYm91dCB1bnRpbCB0aGV5ICovCkBAIC0zNzUsMTEgKzM3NSwxMSBAQAogCQkJCWlmIChuU2VudCA8PSAwKSB7CiAJCQkJCWlSZXR1cm4gPSBuU2VudCA/IG5TZW50IDogLUVUSU1FRE9VVDsJLyogIGlmIDAgY2hhcnMgc2F5cyB3ZSB0aW1lZCBvdXQgKi8KIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJTZW5kICVkIGNoYXJzIGJ5IEVQMCBmYWlsZWQ6ICVkIiwKKwkJCQkJCSJTZW5kICVkIGNoYXJzIGJ5IEVQMCBmYWlsZWQ6ICVkXG4iLAogCQkJCQkJbiwgaVJldHVybik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJTZW50ICVkIGNoYXJzIGJ5IEVQMCIsIG4pOworCQkJCQkJIlNlbnQgJWQgY2hhcnMgYnkgRVAwXG4iLCBuKTsKIAkJCQkJY291bnQgLT0gblNlbnQ7CiAJCQkJCWluZGV4ICs9IG5TZW50OwogCQkJCX0KQEAgLTQxNiw5ICs0MTYsOSBAQAogCQl9CiAJfSBlbHNlIGlmIChwZHgtPmJTZW5kQ2hhcnNQZW5kaW5nICYmIChwZHgtPmR3TnVtT3V0cHV0ID4gMCkpCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiU2VuZENoYXJzIGJTZW5kQ2hhcnNQZW5kaW5nOnRydWUiKTsKKwkJCSIlczogYlNlbmRDaGFyc1BlbmRpbmc6dHJ1ZVxuIiwgX19mdW5jX18pOwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlNlbmRDaGFycyBleGl0IGNvZGU6ICVkIiwgaVJldHVybik7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBleGl0IGNvZGU6ICVkXG4iLCBfX2Z1bmNfXywgaVJldHVybik7CiAJc3Bpbl91bmxvY2tfaXJxKCZwZHgtPmNoYXJPdXRMb2NrKTsJLyogIE5vdyBsZXQgZ28gb2YgdGhlIHNwaW5sb2NrICovCiAJcmV0dXJuIGlSZXR1cm47CiB9CkBAIC00NDYsNyArNDQ2LDcgQEAKIAkJICAgIHBkeC0+U3RhZ2VkRG9uZSArIHBkeC0+U3RhZ2VkT2Zmc2V0ICsgcEFyZWEtPmR3QmFzZU9mZnNldDsKIAkJY2hhciAqcENvaGVyQnVmID0gcGR4LT5wQ29oZXJTdGFnZWRJTzsJLyogIGNvaGVyZW50IGJ1ZmZlciAqLwogCQlpZiAoIXBBcmVhLT5iVXNlZCkgewotCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGFyZWEgJWQgdW51c2VkIiwKKwkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYXJlYSAlZCB1bnVzZWRcbiIsCiAJCQkJX19mdW5jX18sIG5BcmVhKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNDc0LDIxICs0NzQsMjEgQEAKIAkJCQkJbiAtPSB1aVhmZXI7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBkaWQgbm90IG1hcCBwYWdlICVkIiwKKwkJCQkJCSIlczogZGlkIG5vdCBtYXAgcGFnZSAlZFxuIiwKIAkJCQkJCV9fZnVuY19fLCBuUGFnZSk7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAKIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJIiVzIGV4Y2VlZGVkIHBhZ2VzICVkIiwgX19mdW5jX18sCi0JCQkJCW5QYWdlKTsKKwkJCQkJIiVzOiBleGNlZWRlZCBwYWdlcyAlZFxuIiwKKwkJCQkJX19mdW5jX18sIG5QYWdlKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KIAl9IGVsc2UKLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGJhZCBhcmVhICVkIiwgX19mdW5jX18sCi0JCQluQXJlYSk7CisJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogYmFkIGFyZWEgJWRcbiIsCisJCQlfX2Z1bmNfXywgbkFyZWEpOwogfQogCiAvKiAgRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHN0dWZmIHVzZWQgY2lyY3VsYXJseSAqLwpAQCAtNTEzLDExICs1MTMsMTEgQEAKIAkJICAgIChwVXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCBwVXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQKIAkJICAgICB8fCBwVXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKIAkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJCSIlczogbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCiAJCQkJX19mdW5jX18sIHBVcmItPnN0YXR1cyk7CiAJCX0gZWxzZQogCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJICIlcyAtIHN0YWdlZCB4ZmVyIGNhbmNlbGxlZCIsIF9fZnVuY19fKTsKKwkJCQkgIiVzOiBzdGFnZWQgeGZlciBjYW5jZWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCQlzcGluX2xvY2soJnBkeC0+ZXJyX2xvY2spOwogCQlwZHgtPmVycm9ycyA9IHBVcmItPnN0YXR1czsKQEAgLTUyNSwyNiArNTI1LDI2IEBACiAJCW5Hb3QgPSAwOwkvKiAgIGFuZCB0aWR5IHVwIGFnYWluIGlmIHNvICovCiAJCWJDYW5jZWwgPSB0cnVlOwogCX0gZWxzZSB7Ci0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyAlZCBjaGFycyB4ZmVycmVkIiwgX19mdW5jX18sCi0JCQluR290KTsKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiAlZCBjaGFycyB4ZmVycmVkXG4iLAorCQkJX19mdW5jX18sIG5Hb3QpOwogCQlpZiAocGR4LT5TdGFnZWRSZWFkKQkvKiAgaWYgcmVhZGluZywgc2F2ZSB0byB1c2VyIHNwYWNlICovCiAJCQlDb3B5VXNlclNwYWNlKHBkeCwgbkdvdCk7CS8qICBjb3B5IGZyb20gYnVmZmVyIHRvIHVzZXIgKi8KIAkJaWYgKG5Hb3QgPT0gMCkKLQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBaTFAiLCBfX2Z1bmNfXyk7CisJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IFpMUFxuIiwgX19mdW5jX18pOwogCX0KIAogCS8qICBVcGRhdGUgdGhlIHRyYW5zZmVyIGxlbmd0aCBiYXNlZCBvbiB0aGUgVHJhbnNmZXJCdWZmZXJMZW5ndGggdmFsdWUgaW4gdGhlIFVSQiAqLwogCXBkeC0+U3RhZ2VkRG9uZSArPSBuR290OwogCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzLCBkb25lICVkIGJ5dGVzIG9mICVkIiwgX19mdW5jX18sCi0JCXBkeC0+U3RhZ2VkRG9uZSwgcGR4LT5TdGFnZWRMZW5ndGgpOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogZG9uZSAlZCBieXRlcyBvZiAlZFxuIiwKKwkJX19mdW5jX18sIHBkeC0+U3RhZ2VkRG9uZSwgcGR4LT5TdGFnZWRMZW5ndGgpOwogCiAJaWYgKChwZHgtPlN0YWdlZERvbmUgPT0gcGR4LT5TdGFnZWRMZW5ndGgpIHx8CS8qICBJZiBubyBtb3JlIHRvIGRvICovCiAJICAgIChiQ2FuY2VsKSkgewkJLyogIG9yIHRoaXMgSVJQIHdhcyBjYW5jZWxsZWQgKi8KIAkJVFJBTlNBUkVBICpwQXJlYSA9ICZwZHgtPnJUcmFuc0RlZltwZHgtPlN0YWdlZElkXTsJLyogIFRyYW5zZmVyIGFyZWEgaW5mbyAqLwogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzIHRyYW5zZmVyIGRvbmUsIGJ5dGVzICVkLCBjYW5jZWwgJWQiLCBfX2Z1bmNfXywKLQkJCXBkeC0+U3RhZ2VkRG9uZSwgYkNhbmNlbCk7CisJCQkiJXM6IHRyYW5zZmVyIGRvbmUsIGJ5dGVzICVkLCBjYW5jZWwgJWRcbiIsCisJCQlfX2Z1bmNfXywgcGR4LT5TdGFnZWREb25lLCBiQ2FuY2VsKTsKIAogCQkvKiAgSGVyZSBpcyB3aGVyZSB3ZSBzb3J0IG91dCB3aGF0IHRvIGRvIHdpdGggdGhpcyB0cmFuc2ZlciBpZiB1c2luZyBhIGNpcmN1bGFyIGJ1ZmZlci4gV2UgaGF2ZSAqLwogCQkvKiAgIGEgY29tcGxldGVkIHRyYW5zZmVyIHRoYXQgY2FuIGJlIGFzc3VtZWQgdG8gZml0IGludG8gdGhlIHRyYW5zZmVyIGFyZWEuIFdlIHNob3VsZCBiZSBhYmxlIHRvICovCkBAIC01NTksNyArNTU5LDcgQEAKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMV0uZHdTaXplICs9CiAJCQkJCSAgICBwZHgtPlN0YWdlZExlbmd0aDsKIAkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMSBub3cgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAxIG5vdyAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSwKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3T2Zmc2V0KTsKIAkJCQl9IGVsc2UgewpAQCAtNTY5LDcgKzU2OSw3IEBACiAJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSA9CiAJCQkJCSAgICBwZHgtPlN0YWdlZExlbmd0aDsKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBFUlJPUiwgY2lyYyBibG9jayAxIHJlLXN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkJIiVzOiBFUlJPUiwgY2lyYyBibG9jayAxIHJlLXN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSwKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3T2Zmc2V0KTsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCQkJCQkgICAgIHBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSkpIHsKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzBdLmR3U2l6ZSArPSBwZHgtPlN0YWdlZExlbmd0aDsJLyogIEp1c3QgYWRkIHRoaXMgdHJhbnNmZXIgaW4gKi8KIAkJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIG5vdyAlZCBieXRlcyBhdCAlZCIsCisJCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIG5vdyAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS4KIAkJCQkJCQlkd1NpemUsCiAJCQkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uCkBAIC01OTMsNyArNTkzLDcgQEAKIAkJCQkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSA9CiAJCQkJCQkgICAgcGR4LT5TdGFnZWRMZW5ndGg7CiAJCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJCSJSV01fQ29tcGxldGUsIGNpcmMgYmxvY2sgMSBzdGFydGVkICVkIGJ5dGVzIGF0ICVkIiwKKwkJCQkJCQkiUldNX0NvbXBsZXRlLCBjaXJjIGJsb2NrIDEgc3RhcnRlZCAlZCBieXRlcyBhdCAlZFxuIiwKIAkJCQkJCQlwQXJlYS0+YUJsb2Nrc1sxXS4KIAkJCQkJCQlkd1NpemUsCiAJCQkJCQkJcEFyZWEtPmFCbG9ja3NbMV0uCkBAIC02MDUsNyArNjA1LDcgQEAKIAkJCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplID0KIAkJCQkJICAgIHBkeC0+U3RhZ2VkTGVuZ3RoOwogCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIHN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWQiLAorCQkJCQkJIlJXTV9Db21wbGV0ZSwgY2lyYyBibG9jayAwIHN0YXJ0ZWQgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd1NpemUsCiAJCQkJCQlwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCk7CiAJCQkJfQpAQCAtNjE0LDcgKzYxNCw3IEBACiAKIAkJaWYgKCFiQ2FuY2VsKSB7IC8qICBEb24ndCBnZW5lcmF0ZSBhbiBldmVudCBpZiBjYW5jZWxsZWQgKi8KIAkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIlJXTV9Db21wbGV0ZSwgIGJDaXJjdWxhciAlZCwgYlRvSG9zdCAlZCwgZVN0YXJ0ICVkLCBlU2l6ZSAlZCIsCisJCQkJIlJXTV9Db21wbGV0ZSwgIGJDaXJjdWxhciAlZCwgYlRvSG9zdCAlZCwgZVN0YXJ0ICVkLCBlU2l6ZSAlZFxuIiwKIAkJCQlwQXJlYS0+YkNpcmN1bGFyLCBwQXJlYS0+YkV2ZW50VG9Ib3N0LAogCQkJCXBBcmVhLT5kd0V2ZW50U3QsIHBBcmVhLT5kd0V2ZW50U3opOwogCQkJaWYgKChwQXJlYS0+ZHdFdmVudFN6KSAmJgkvKiAgU2V0IGEgdXNlci1tb2RlIGV2ZW50Li4uICovCkBAIC02NDEsNyArNjQxLDcgQEAKIAogCQkJCWlmIChpV2FrZVVwKSB7CiAJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiQWJvdXQgdG8gc2V0IGV2ZW50IHRvIG5vdGlmeSBhcHAiKTsKKwkJCQkJCSJBYm91dCB0byBzZXQgZXZlbnQgdG8gbm90aWZ5IGFwcFxuIik7CiAJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcEFyZWEtPndxRXZlbnQpOwkvKiAgd2FrZSB1cCB3YWl0aW5nIHByb2Nlc3NlcyAqLwogCQkJCQkrK3BBcmVhLT5pV2FrZVVwOwkvKiAgaW5jcmVtZW50IHdha2V1cCBjb3VudCAqLwogCQkJCX0KQEAgLTY1NSw3ICs2NTUsNyBAQAogCQkJaWYgKHBkeC0+YlhGZXJXYWl0aW5nKSB7CS8qICBHb3QgYSBibG9jayB4ZmVyIHdhaXRpbmc/ICovCiAJCQkJaW50IGlSZXR1cm47CiAJCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCSAiKioqIFJXTV9Db21wbGV0ZSAqKiogcGVuZGluZyB0cmFuc2ZlciB3aWxsIG5vdyBiZSBzZXQgdXAhISEiKTsKKwkJCQkJICIqKiogUldNX0NvbXBsZXRlICoqKiBwZW5kaW5nIHRyYW5zZmVyIHdpbGwgbm93IGJlIHNldCB1cCEhIVxuIik7CiAJCQkJaVJldHVybiA9CiAJCQkJICAgIFJlYWRXcml0ZU1lbShwZHgsICFwZHgtPnJETUFJbmZvLmJPdXRXYXJkLAogCQkJCQkJIHBkeC0+ckRNQUluZm8ud0lkZW50LApAQCAtNjY0LDcgKzY2NCw3IEBACiAKIAkJCQlpZiAoaVJldHVybikKIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSJSV01fQ29tcGxldGUgcncgc2V0dXAgZmFpbGVkICVkIiwKKwkJCQkJCSJSV01fQ29tcGxldGUgcncgc2V0dXAgZmFpbGVkICVkXG4iLAogCQkJCQkJaVJldHVybik7CiAJCQl9CiAJCX0KQEAgLTY4NSw3ICs2ODUsNyBAQAogCS8qICBub3QgYmUgdXBzZXQgYnkgY2hhciBpbnB1dCBkdXJpbmcgRE1BLi4uIHNpZ2guIE5lZWRzIHNvcnRpbmcgb3V0LiAqLwogCWlmIChiUmVzdGFydENoYXJJbnB1dCkJLyogIG1heSBiZSBvdXQgb2YgZGF0ZSwgYnV0Li4uICovCiAJCUFsbG93aShwZHgpOwkvKiAgLi4uQWxsb3dpIHRlc3RzIGEgbG9jayB0b28uICovCi0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGRvbmUiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03MDcsNyArNzA3LDcgQEAKIAkJcmV0dXJuIFUxNEVSUl9GQUlMOwogCiAJaWYgKCFDYW5BY2NlcHRJb1JlcXVlc3RzKHBkeCkpIHsJLyogIGdvdCBzdWRkZW4gcmVtb3ZlPyAqLwotCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHN1ZGRlbiByZW1vdmUsIGdpdmluZyB1cCIsCisJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHN1ZGRlbiByZW1vdmUsIGdpdmluZyB1cFxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiBVMTRFUlJfRkFJTDsJLyogIGNvdWxkIGRvIHdpdGggYSBiZXR0ZXIgZXJyb3IgKi8KIAl9CkBAIC03MzEsMTEgKzczMSwxMSBAQAogCWlmIChpUmV0dXJuKSB7CiAJCXVzYl91bmFuY2hvcl91cmIocGR4LT5wU3RhZ2VkVXJiKTsJLyogIGtpbGwgaXQgKi8KIAkJcGR4LT5iUGlwZUVycm9yW25QaXBlXSA9IDE7CS8qICBGbGFnIGFuIGVycm9yIHRvIGJlIGhhbmRsZWQgbGF0ZXIgKi8KLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHN1Ym1pdCB1cmIgZmFpbGVkLCBjb2RlICVkIiwKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBzdWJtaXQgdXJiIGZhaWxlZCwgY29kZSAlZFxuIiwKIAkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAl9IGVsc2UKIAkJcGR4LT5iU3RhZ2VkVXJiUGVuZGluZyA9IHRydWU7CS8qICBTZXQgdGhlIGZsYWcgZm9yIHN0YWdlZCBVUkIgcGVuZGluZyAqLwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyBkb25lIHNvIGZhcjolZCwgdGhpcyBzaXplOiVkIiwKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGRvbmUgc28gZmFyOiVkLCB0aGlzIHNpemU6JWRcbiIsCiAJCV9fZnVuY19fLCBwZHgtPlN0YWdlZERvbmUsIENodW5rU2l6ZSk7CiAKIAlyZXR1cm4gaVJldHVybjsKQEAgLTc2NCwyOCArNzY0LDI4IEBACiAJVFJBTlNBUkVBICpwQXJlYSA9ICZwZHgtPnJUcmFuc0RlZlt3SWRlbnRdOwkvKiAgVHJhbnNmZXIgYXJlYSBpbmZvICovCiAKIAlpZiAoIUNhbkFjY2VwdElvUmVxdWVzdHMocGR4KSkgewkvKiAgQXJlIHdlIGluIGEgc3RhdGUgdG8gYWNjZXB0IG5ldyByZXF1ZXN0cz8gKi8KLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNhbid0IGFjY2VwdCByZXF1ZXN0cyIsCisJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FuJ3QgYWNjZXB0IHJlcXVlc3RzXG4iLAogCQkJX19mdW5jX18pOwogCQlyZXR1cm4gVTE0RVJSX0ZBSUw7CiAJfQogCiAJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJIiVzIHhmZXIgJWQgYnl0ZXMgdG8gJXMsIG9mZnNldCAlZCwgYXJlYSAlZCIsIF9fZnVuY19fLCBkd0xlbiwKLQkJUmVhZCA/ICJob3N0IiA6ICIxNDAxIiwgZHdPZmZzLCB3SWRlbnQpOworCQkiJXM6IHhmZXIgJWQgYnl0ZXMgdG8gJXMsIG9mZnNldCAlZCwgYXJlYSAlZFxuIiwKKwkJX19mdW5jX18sIGR3TGVuLCBSZWFkID8gImhvc3QiIDogIjE0MDEiLCBkd09mZnMsIHdJZGVudCk7CiAKIAkvKiAgQW1hemluZ2x5LCB3ZSBjYW4gZ2V0IGFuIGVzY2FwZSBzZXF1ZW5jZSBiYWNrIGJlZm9yZSB0aGUgY3VycmVudCBzdGFnZWQgVXJiIGlzIGRvbmUsIHNvIHdlICovCiAJLyogICBoYXZlIHRvIGNoZWNrIGZvciB0aGlzIHNpdHVhdGlvbiBhbmQsIGlmIHNvLCB3YWl0IHVudGlsIGFsbCBpcyBPSy4gKi8KIAlpZiAocGR4LT5iU3RhZ2VkVXJiUGVuZGluZykgewogCQlwZHgtPmJYRmVyV2FpdGluZyA9IHRydWU7CS8qICBGbGFnIHdlIGFyZSB3YWl0aW5nICovCiAJCWRldl9pbmZvKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJICIlcyB4ZmVyIGlzIHdhaXRpbmcsIGFzIHByZXZpb3VzIHN0YWdlZCBwZW5kaW5nIiwKKwkJCSAiJXM6IHhmZXIgaXMgd2FpdGluZywgYXMgcHJldmlvdXMgc3RhZ2VkIHBlbmRpbmdcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gVTE0RVJSX05PRVJST1I7CiAJfQogCiAJaWYgKGR3TGVuID09IDApIHsJCS8qICBhbGxvdyAwLWxlbiByZWFkIG9yIHdyaXRlOyBqdXN0IHJldHVybiBzdWNjZXNzICovCiAJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiJXMgT0s7IHplcm8tbGVuIHJlYWQvd3JpdGUgcmVxdWVzdCIsIF9fZnVuY19fKTsKKwkJCSIlczogT0s7IHplcm8tbGVuIHJlYWQvd3JpdGUgcmVxdWVzdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gVTE0RVJSX05PRVJST1I7CiAJfQogCkBAIC03OTUsNyArNzk1LDcgQEAKIAkJYm9vbCBiV2FpdCA9IGZhbHNlOwkvKiAgRmxhZyBmb3IgdHJhbnNmZXIgaGF2aW5nIHRvIHdhaXQgKi8KIAogCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJIkNpcmN1bGFyIGJ1ZmZlcnMgYXJlICVkIGF0ICVkIGFuZCAlZCBhdCAlZCIsCisJCQkiQ2lyY3VsYXIgYnVmZmVycyBhcmUgJWQgYXQgJWQgYW5kICVkIGF0ICVkXG4iLAogCQkJcEFyZWEtPmFCbG9ja3NbMF0uZHdTaXplLCBwQXJlYS0+YUJsb2Nrc1swXS5kd09mZnNldCwKIAkJCXBBcmVhLT5hQmxvY2tzWzFdLmR3U2l6ZSwgcEFyZWEtPmFCbG9ja3NbMV0uZHdPZmZzZXQpOwogCQlpZiAocEFyZWEtPmFCbG9ja3NbMV0uZHdTaXplID4gMCkgewkvKiAgVXNpbmcgdGhlIHNlY29uZCBibG9jayBhbHJlYWR5PyAqLwpAQCAtODE5LDE0ICs4MTksMTQgQEAKIAkJaWYgKGJXYWl0KSB7CS8qICBUaGlzIHRyYW5zZmVyIHdpbGwgaGF2ZSB0byB3YWl0PyAqLwogCQkJcGR4LT5iWEZlcldhaXRpbmcgPSB0cnVlOwkvKiAgRmxhZyB3ZSBhcmUgd2FpdGluZyAqLwogCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgeGZlciB3YWl0aW5nIGZvciBjaXJjdWxhciBidWZmZXIgc3BhY2UiLAorCQkJCSIlczogeGZlciB3YWl0aW5nIGZvciBjaXJjdWxhciBidWZmZXIgc3BhY2VcbiIsCiAJCQkJX19mdW5jX18pOwogCQkJcmV0dXJuIFUxNEVSUl9OT0VSUk9SOwogCQl9CiAKIAkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCSIlcyBjaXJjdWxhciB4ZmVyLCAlZCBieXRlcyBzdGFydGluZyBhdCAlZCIsIF9fZnVuY19fLAotCQkJZHdMZW4sIGR3T2Zmcyk7CisJCQkiJXM6IGNpcmN1bGFyIHhmZXIsICVkIGJ5dGVzIHN0YXJ0aW5nIGF0ICVkXG4iLAorCQkJX19mdW5jX18sIGR3TGVuLCBkd09mZnMpOwogCX0KIAkvKiAgU2F2ZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlYWRcd3JpdGUgdHJhbnNmZXIgKi8KIAlwZHgtPlN0YWdlZFJlYWQgPSBSZWFkOwkvKiAgU2F2ZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyByZWFkICovCkBAIC05NDgsNyArOTQ4LDcgQEAKIAl1bnNpZ25lZCBjaGFyIHVjRGF0YTsKIAl1bnNpZ25lZCBpbnQgZERvbmUgPSAwOwkvKiAgV2UgaGF2ZW4ndCBwYXJzZWQgYW55dGhpbmcgc28gZmFyICovCiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoUmVhZENoYXIoJnVjRGF0YSwgcEJ1ZiwgJmREb25lLCBkd0NvdW50KSkgewogCQl1bnNpZ25lZCBjaGFyIHVjVHJhbnNDb2RlID0gKHVjRGF0YSAmIDB4MEYpOwkvKiAgZ2V0IGNvZGUgZm9yIHRyYW5zZmVyIHR5cGUgKi8KQEAgLTk2MCw4ICs5NjAsOCBAQAogCQlwRG1hRGVzYy0+ZHdTaXplID0gMDsJLyogIGluaXRpYWxpc2Ugb3RoZXIgYml0cyAqLwogCQlwRG1hRGVzYy0+ZHdPZmZzZXQgPSAwOwogCi0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyB0eXBlOiAlZCBpZGVudDogJWQiLCBfX2Z1bmNfXywKLQkJCXBEbWFEZXNjLT53VHJhbnNUeXBlLCBwRG1hRGVzYy0+d0lkZW50KTsKKwkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiB0eXBlOiAlZCBpZGVudDogJWRcbiIsCisJCQlfX2Z1bmNfXywgcERtYURlc2MtPndUcmFuc1R5cGUsIHBEbWFEZXNjLT53SWRlbnQpOwogCiAJCXBEbWFEZXNjLT5iT3V0V2FyZCA9ICh1Y1RyYW5zQ29kZSAhPSBUTV9FWFRUT0hPU1QpOwkvKiAgc2V0IHRyYW5zZmVyIGRpcmVjdGlvbiAqLwogCkBAIC05NzYsNyArOTc2LDcgQEAKIAkJCQkJCSZkRG9uZSwgZHdDb3VudCk7CiAJCQkJaWYgKGJSZXN1bHQpIHsKIAkJCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyB4ZmVyIG9mZnNldCAmIHNpemUgJWQgJWQiLAorCQkJCQkJIiVzOiB4ZmVyIG9mZnNldCAmIHNpemUgJWQgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgcERtYURlc2MtPmR3T2Zmc2V0LAogCQkJCQkJcERtYURlc2MtPmR3U2l6ZSk7CiAKQEAgLTk4OSw3ICs5ODksNyBAQAogCQkJCQkgICAgICBkd0xlbmd0aCkpKSB7CiAJCQkJCQliUmVzdWx0ID0gZmFsc2U7CS8qICBiYWQgcGFyYW1ldGVyKHMpICovCiAJCQkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJCSIlcyBiYWQgcGFyYW0gLSBpZCAlZCwgYlVzZWQgJWQsIG9mZnNldCAlZCwgc2l6ZSAlZCwgYXJlYSBsZW5ndGggJWQiLAorCQkJCQkJCSIlczogYmFkIHBhcmFtIC0gaWQgJWQsIGJVc2VkICVkLCBvZmZzZXQgJWQsIHNpemUgJWQsIGFyZWEgbGVuZ3RoICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCB3SWRlbnQsCiAJCQkJCQkJcGR4LT5yVHJhbnNEZWZbd0lkZW50XS4KIAkJCQkJCQliVXNlZCwKQEAgLTEwMDgsNyArMTAwOCw3IEBACiAJCWJSZXN1bHQgPSBmYWxzZTsKIAogCWlmICghYlJlc3VsdCkJCS8qICBub3cgY2hlY2sgcGFyYW1ldGVycyBmb3IgdmFsaWRpdHkgKi8KLQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGVycm9yIHJlYWRpbmcgRXNjIHNlcXVlbmNlIiwKKwkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzOiBlcnJvciByZWFkaW5nIEVzYyBzZXF1ZW5jZVxuIiwKIAkJCV9fZnVuY19fKTsKIAogCXJldHVybiBiUmVzdWx0OwpAQCAtMTA0NSwxNSArMTA0NSwxNSBAQAogCQkJdW5zaWduZWQgc2hvcnQgd1RyYW5zVHlwZSA9IHBkeC0+ckRNQUluZm8ud1RyYW5zVHlwZTsJLyogIGNoZWNrIHRyYW5zZmVyIHR5cGUgKi8KIAogCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgeGZlciB0byAlcywgb2Zmc2V0ICVkLCBsZW5ndGggJWQiLCBfX2Z1bmNfXywKKwkJCQkiJXM6IHhmZXIgdG8gJXMsIG9mZnNldCAlZCwgbGVuZ3RoICVkXG4iLAorCQkJCV9fZnVuY19fLAogCQkJCXBkeC0+ckRNQUluZm8uYk91dFdhcmQgPyAiMTQwMSIgOiAiaG9zdCIsCiAJCQkJcGR4LT5yRE1BSW5mby5kd09mZnNldCwgcGR4LT5yRE1BSW5mby5kd1NpemUpOwogCiAJCQlpZiAocGR4LT5iWEZlcldhaXRpbmcpIHsgLyogIENoZWNrIGhlcmUgZm9yIGJhZGx5IG91dCBvZiBraWx0ZXIuLi4gKi8KIAkJCQkvKiAgVGhpcyBjYW4gbmV2ZXIgaGFwcGVuLCByZWFsbHkgKi8KIAkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiRVJST1I6IERNQSBzZXR1cCB3aGlsZSB0cmFuc2ZlciBzdGlsbCB3YWl0aW5nIik7Ci0JCQkJc3Bpbl91bmxvY2soJnBkeC0+c3RhZ2VkTG9jayk7CisJCQkJCSJFUlJPUjogRE1BIHNldHVwIHdoaWxlIHRyYW5zZmVyIHN0aWxsIHdhaXRpbmdcbiIpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoKHdUcmFuc1R5cGUgPT0gVE1fRVhUVE9IT1NUKQogCQkJCSAgICB8fCAod1RyYW5zVHlwZSA9PSBUTV9FWFRUTzE0MDEpKSB7CkBAIC0xMDY2LDIxICsxMDY2LDIxIEBACiAJCQkJCQkJIHBkeC0+ckRNQUluZm8uZHdTaXplKTsKIAkJCQkJaWYgKGlSZXR1cm4gIT0gVTE0RVJSX05PRVJST1IpCiAJCQkJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkJCSIlcyBSZWFkV3JpdGVNZW0oKSBmYWlsZWQgJWQiLAorCQkJCQkJCSIlczogUmVhZFdyaXRlTWVtKCkgZmFpbGVkICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCBpUmV0dXJuKTsKIAkJCQl9IGVsc2UJLyogIFRoaXMgY292ZXJzIG5vbi1saW5lYXIgdHJhbnNmZXIgc2V0dXAgKi8KIAkJCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkJCSIlcyBVbmtub3duIGJsb2NrIHhmZXIgdHlwZSAlZCIsCisJCQkJCQkiJXM6IFVua25vd24gYmxvY2sgeGZlciB0eXBlICVkXG4iLAogCQkJCQkJX19mdW5jX18sIHdUcmFuc1R5cGUpOwogCQkJfQogCQl9IGVsc2UJCS8qICBGYWlsZWQgdG8gcmVhZCBwYXJhbWV0ZXJzICovCi0JCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgUmVhZERNQUluZm8oKSBmYWlsIiwKKwkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogUmVhZERNQUluZm8oKSBmYWlsXG4iLAogCQkJCV9fZnVuY19fKTsKIAogCQlzcGluX3VubG9jaygmcGR4LT5zdGFnZWRMb2NrKTsJLyogIE9LIGhlcmUgKi8KIAl9CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgcmV0dXJucyAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCBpUmV0dXJuKTsKIAogCXJldHVybiBpUmV0dXJuOwogfQpAQCAtMTEwMCwxMSArMTEwMCwxMSBAQAogCQkgICAgKHBVcmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHBVcmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVAogCQkgICAgIHx8IHBVcmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkgewogCQkJZGV2X2VycigmcGR4LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkJIiVzOiBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcFVyYi0+c3RhdHVzKTsKIAkJfSBlbHNlCiAJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LAotCQkJCSIlcyAtIDAgY2hhcnMgcFVyYi0+c3RhdHVzPSVkIChzaHV0ZG93bj8pIiwKKwkJCQkiJXM6IDAgY2hhcnMgcFVyYi0+c3RhdHVzPSVkIChzaHV0ZG93bj8pXG4iLAogCQkJCV9fZnVuY19fLCBwVXJiLT5zdGF0dXMpOwogCiAJCXNwaW5fbG9jaygmcGR4LT5lcnJfbG9jayk7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogCQkJCWlmIChuR290IDwgSU5CVUZfU1opIHsKIAkJCQkJcGR4LT5wQ29oZXJDaGFySW5bbkdvdF0gPSAwOwkvKiAgdGlkeSB0aGUgc3RyaW5nICovCiAJCQkJCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJCQkiJXMgZ290ICVkIGNoYXJzID4lczwiLAorCQkJCQkJIiVzOiBnb3QgJWQgY2hhcnMgPiVzPFxuIiwKIAkJCQkJCV9fZnVuY19fLCBuR290LAogCQkJCQkJcGR4LT5wQ29oZXJDaGFySW4pOwogCQkJCX0KQEAgLTExNDAsNyArMTE0MCw3IEBACiAJCQkJaWYgKChwZHgtPmR3TnVtSW5wdXQgKyBuR290KSA8PSBJTkJVRl9TWikKIAkJCQkJcGR4LT5kd051bUlucHV0ICs9IG5Hb3Q7CS8qICBBZGp1c3QgdGhlIGJ1ZmZlciBjb3VudCBhY2NvcmRpbmdseSAqLwogCQkJfSBlbHNlCi0JCQkJZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIHJlYWQgWkxQIiwKKwkJCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHJlYWQgWkxQXG4iLAogCQkJCQlfX2Z1bmNfXyk7CiAJCX0KIAl9CkBAIC0xMTc4LDcgKzExNzgsNyBAQAogCQl1bnNpZ25lZCBpbnQgbk1heCA9IElOQlVGX1NaIC0gcGR4LT5kd051bUlucHV0OwkvKiAgbWF4IHdlIGNvdWxkIHJlYWQgKi8KIAkJaW50IG5QaXBlID0gcGR4LT5uUGlwZXMgPT0gNCA/IDEgOiAwOwkvKiAgVGhlIHBpcGUgbnVtYmVyIHRvIHVzZSAqLwogCi0JCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyAlZCBjaGFycyBpbiBpbnB1dCBidWZmZXIiLAorCQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6ICVkIGNoYXJzIGluIGlucHV0IGJ1ZmZlclxuIiwKIAkJCV9fZnVuY19fLCBwZHgtPmR3TnVtSW5wdXQpOwogCiAJCXVzYl9maWxsX2ludF91cmIocGR4LT5wVXJiQ2hhckluLCBwZHgtPnVkZXYsCkBAIC0xMTkyLDcgKzExOTIsOCBAQAogCQkJdXNiX3VuYW5jaG9yX3VyYihwZHgtPnBVcmJDaGFySW4pOwkvKiAgcmVtb3ZlIGZyb20gbGlzdCBvZiBhY3RpdmUgVXJicyAqLwogCQkJcGR4LT5iUGlwZUVycm9yW25QaXBlXSA9IDE7CS8qICBGbGFnIGFuIGVycm9yIHRvIGJlIGhhbmRsZWQgbGF0ZXIgKi8KIAkJCWRldl9lcnIoJnBkeC0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzIHN1Ym1pdCB1cmIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBpUmV0dXJuKTsKKwkJCQkiJXM6IHN1Ym1pdCB1cmIgZmFpbGVkOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaVJldHVybik7CiAJCX0gZWxzZQogCQkJcGR4LT5iUmVhZENoYXJzUGVuZGluZyA9IHRydWU7CS8qICBGbGFnIHRoYXQgd2UgYXJlIGFjdGl2ZSBoZXJlICovCiAJfQpAQCAtMTI1MCwxMyArMTI1MSwxMyBAQAogCQlyZXR1cm4gR2V0U3RyaW5nKHBkeCwgKGNoYXIgX191c2VyICopdWxBcmcsIF9JT0NfU0laRShjbWQpKTsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfU0VUVFJBTlNGRVIpOgotCQlyZXR1cm4gU2V0VHJhbnNmZXIocGR4LCAoVFJBTlNGRVJERVNDIF9fdXNlciAqKSB1bEFyZyk7CisJCXJldHVybiBTZXRUcmFuc2ZlcihwZHgsIChzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIF9fdXNlciAqKSB1bEFyZyk7CiAKIAljYXNlIF9JT0NfTlIoSU9DVExfQ0VEX1VOU0VUVFJBTlNGRVIpOgogCQlyZXR1cm4gVW5zZXRUcmFuc2ZlcihwZHgsIChpbnQpdWxBcmcpOwogCiAJY2FzZSBfSU9DX05SKElPQ1RMX0NFRF9TRVRFVkVOVCk6Ci0JCXJldHVybiBTZXRFdmVudChwZHgsIChUUkFOU0ZFUkVWRU5UIF9fdXNlciAqKSB1bEFyZyk7CisJCXJldHVybiBTZXRFdmVudChwZHgsIChzdHJ1Y3QgdHJhbnNmZXJfZXZlbnQgX191c2VyICopIHVsQXJnKTsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfR0VUT1VUQlVGU1BBQ0UpOgogCQlyZXR1cm4gR2V0T3V0QnVmU3BhY2UocGR4KTsKQEAgLTEzMTUsNyArMTMxNiw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBfSU9DX05SKElPQ1RMX0NFRF9TRVRDSVJDVUxBUik6Ci0JCXJldHVybiBTZXRDaXJjdWxhcihwZHgsIChUUkFOU0ZFUkRFU0MgX191c2VyICopIHVsQXJnKTsKKwkJcmV0dXJuIFNldENpcmN1bGFyKHBkeCwgKHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgX191c2VyICopIHVsQXJnKTsKIAogCWNhc2UgX0lPQ19OUihJT0NUTF9DRURfR0VUQ0lSQ0JMT0NLKToKIAkJcmV0dXJuIEdldENpcmNCbG9jayhwZHgsIChUQ0lSQ0JMT0NLIF9fdXNlciAqKSB1bEFyZyk7CkBAIC0xMzk3LDcgKzEzOTgsNyBAQAogCWVsc2UgaWYgKChpID49IDEpICYmIChpIDw9IDIzKSkKIAkJcGR4LT5zMTQwMVR5cGUgPSBpICsgMjsKIAllbHNlIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyBVbmtub3duIGRldmljZS4gYmNkRGV2aWNlID0gJWQiLAorCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBVbmtub3duIGRldmljZS4gYmNkRGV2aWNlID0gJWRcbiIsCiAJCQlfX2Z1bmNfXywgYmNkRGV2aWNlKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNDA1LDcgKzE0MDYsNyBAQAogCS8qICB3ZSBrbm93IHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIDE0MDEgZGV2aWNlLiAqLwogCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCXBkeC0+blBpcGVzID0gaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOwotCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIjE0MDFUeXBlPSVkIHdpdGggJWQgRW5kIFBvaW50cyIsCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiMTQwMVR5cGU9JWQgd2l0aCAlZCBFbmQgUG9pbnRzXG4iLAogCQkgcGR4LT5zMTQwMVR5cGUsIHBkeC0+blBpcGVzKTsKIAlpZiAoKHBkeC0+blBpcGVzIDwgMykgfHwgKHBkeC0+blBpcGVzID4gNCkpCiAJCWdvdG8gZXJyb3I7CkBAIC0xNDE1LDcgKzE0MTYsNyBAQAogCXBkeC0+cFVyYkNoYXJJbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CS8qICBjaGFyYWN0ZXIgaW5wdXQgVVJCICovCiAJcGR4LT5wU3RhZ2VkVXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsJLyogIGJsb2NrIHRyYW5zZmVyIFVSQiAqLwogCWlmICghcGR4LT5wVXJiQ2hhck91dCB8fCAhcGR4LT5wVXJiQ2hhckluIHx8ICFwZHgtPnBTdGFnZWRVcmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyBVUkIgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBVUkIgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0xNDI5LDcgKzE0MzAsNyBAQAogCSAgICB1c2JfYWxsb2NfY29oZXJlbnQocGR4LT51ZGV2LCBJTkJVRl9TWiwgR0ZQX0tFUk5FTCwKIAkJCSAgICAgICAmcGR4LT5wVXJiQ2hhckluLT50cmFuc2Zlcl9kbWEpOwogCWlmICghcGR4LT5wQ29oZXJDaGFyT3V0IHx8ICFwZHgtPnBDb2hlckNoYXJJbiB8fCAhcGR4LT5wQ29oZXJTdGFnZWRJTykgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzIENvaGVyZW50IGJ1ZmZlciBhbGxvYyBmYWlsZWQiLAorCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIiVzOiBDb2hlcmVudCBidWZmZXIgYWxsb2MgZmFpbGVkXG4iLAogCQkJX19mdW5jX18pOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTE0MzcsMTkgKzE0MzgsMTkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcGR4LT5uUGlwZXM7ICsraSkgewogCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOwogCQlwZHgtPmVwQWRkcltpXSA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJQaXBlICVkLCBlcCBhZGRyZXNzICUwMngiLCBpLAotCQkJIHBkeC0+ZXBBZGRyW2ldKTsKKwkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiUGlwZSAlZCwgZXAgYWRkcmVzcyAlMDJ4XG4iLAorCQkJIGksIHBkeC0+ZXBBZGRyW2ldKTsKIAkJaWYgKCgocGR4LT5uUGlwZXMgPT0gMykgJiYgKGkgPT0gMCkpIHx8CS8qICBpZiBjaGFyIGlucHV0IGVuZCBwb2ludCAqLwogCQkgICAgKChwZHgtPm5QaXBlcyA9PSA0KSAmJiAoaSA9PSAxKSkpIHsKIAkJCXBkeC0+YkludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsJLyogIHNhdmUgdGhlIGVuZHBvaW50IGludGVycnVwdCBpbnRlcnZhbCAqLwotCQkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiUGlwZSAlZCwgYkludGVydmFsID0gJWQiLCBpLAotCQkJCSBwZHgtPmJJbnRlcnZhbCk7CisJCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJQaXBlICVkLCBiSW50ZXJ2YWwgPSAlZFxuIiwKKwkJCQkgaSwgcGR4LT5iSW50ZXJ2YWwpOwogCQl9CiAJCS8qICBEZXRlY3QgVVNCMiBieSBjaGVja2luZyBsYXN0IGVwIHNpemUgKDY0IGlmIFVTQjEpICovCiAJCWlmIChpID09IHBkeC0+blBpcGVzIC0gMSkgewkvKiAgaWYgdGhpcyBpcyB0aGUgbGFzdCBlcCAoYnVsaykgKi8KIAkJCXBkeC0+YklzVVNCMiA9CiAJCQkgICAgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA+IDY0OwotCQkJZGV2X2luZm8oJnBkeC0+aW50ZXJmYWNlLT5kZXYsICJVU0IlZCIsCisJCQlkZXZfaW5mbygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIlVTQiVkXG4iLAogCQkJCSBwZHgtPmJJc1VTQjIgKyAxKTsKIAkJfQogCX0KQEAgLTE0NjIsMTQgKzE0NjMsMTQgQEAKIAlpZiAocmV0dmFsKSB7CiAJCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLwogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCSJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuXG4iKTsKKwkJCSJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2VcbiIpOwogCQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLwogCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwKLQkJICJVU0IgQ0VEVVNCIGRldmljZSBub3cgYXR0YWNoZWQgdG8gY2VkdXNiICMlZCIsCisJCSAiVVNCIENFRFVTQiBkZXZpY2Ugbm93IGF0dGFjaGVkIHRvIGNlZHVzYiAjJWRcbiIsCiAJCSBpbnRlcmZhY2UtPm1pbm9yKTsKIAlyZXR1cm4gMDsKIApAQCAtMTQ5Myw3ICsxNDk0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1RSQU5TQVJFQVM7ICsraSkgewogCQlpbnQgaUVyciA9IENsZWFyQXJlYShwZHgsIGkpOwkvKiAgLi4ucmVsZWFzZSBhbnkgdXNlZCBtZW1vcnkgKi8KIAkJaWYgKGlFcnIgPT0gVTE0RVJSX1VOTE9DS0ZBSUwpCi0JCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgQXJlYSAlZCB3YXMgaW4gdXNlZCIsCisJCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IEFyZWEgJWQgd2FzIGluIHVzZWRcbiIsCiAJCQkJX19mdW5jX18sIGkpOwogCX0KIAlwZHgtPmludGVyZmFjZSA9IE5VTEw7CS8qICAuLi53ZSBraWxsIG9mZiBsaW5rIHRvIGludGVyZmFjZSAqLwpAQCAtMTUwMyw3ICsxNTA0LDcgQEAKIAogCWtyZWZfcHV0KCZwZHgtPmtyZWYsIGNlZF9kZWxldGUpOwkvKiAgZGVjcmVtZW50IG91ciB1c2FnZSBjb3VudCAqLwogCi0JZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCIGNlZHVzYiAjJWQgbm93IGRpc2Nvbm5lY3RlZCIsIG1pbm9yKTsKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgY2VkdXNiICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLCBtaW5vcik7CiB9CiAKIC8qICBXYWl0IGZvciBhbGwgdGhlIHVyYnMgd2Uga25vdyBvZiB0byBiZSBkb25lIHdpdGgsIHRoZW4ga2lsbCBvZmYgYW55IHRoYXQgKi8KQEAgLTE1MTMsMTMgKzE1MTQsMTMgQEAKIHZvaWQgY2VkX2RyYXdfZG93bihERVZJQ0VfRVhURU5TSU9OICpwZHgpCiB7CiAJaW50IHRpbWU7Ci0JZGV2X2RiZygmcGR4LT5pbnRlcmZhY2UtPmRldiwgIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJcGR4LT5iSW5EcmF3RG93biA9IHRydWU7CiAJdGltZSA9IHVzYl93YWl0X2FuY2hvcl9lbXB0eV90aW1lb3V0KCZwZHgtPnN1Ym1pdHRlZCwgMzAwMCk7CiAJaWYgKCF0aW1lKSB7CQkvKiAgaWYgd2UgdGltZWQgb3V0IHdlIGtpbGwgdGhlIHVyYnMgKi8KIAkJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmcGR4LT5zdWJtaXR0ZWQpOwotCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgdGltZWQgb3V0IiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHRpbWVkIG91dFxuIiwgX19mdW5jX18pOwogCX0KIAlwZHgtPmJJbkRyYXdEb3duID0gZmFsc2U7CiB9CkBAIC0xNTMxLDcgKzE1MzIsNyBAQAogCQlyZXR1cm4gMDsKIAljZWRfZHJhd19kb3duKHBkeCk7CiAKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2FsbGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NDAsMTQgKzE1NDEsMTQgQEAKIAlERVZJQ0VfRVhURU5TSU9OICpwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCWlmICghcGR4KQogCQlyZXR1cm4gMDsKLQlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXMgY2FsbGVkIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY2VkX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlERVZJQ0VfRVhURU5TSU9OICpwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZwZHgtPmlvX211dGV4KTsKIAljZWRfZHJhd19kb3duKHBkeCk7CiAJcmV0dXJuIDA7CkBAIC0xNTU2LDcgKzE1NTcsNyBAQAogc3RhdGljIGludCBjZWRfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlERVZJQ0VfRVhURU5TSU9OICpwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCWRldl9kYmcoJnBkeC0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwZHgtPmludGVyZmFjZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIHdlIGFyZSBzdXJlIG5vIFVSQnMgYXJlIGFjdGl2ZSAtIG5vIGxvY2tpbmcgbmVlZGVkICovCiAJcGR4LT5lcnJvcnMgPSAtRVBJUEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmggYi9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2IxNDAxLmgKaW5kZXggZjAzMWUzYS4uZWEwZmU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNiMTQwMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzYjE0MDEuaApAQCAtMjE4LDkgKzIxOCw5IEBACiBleHRlcm4gaW50IFJlc2V0MTQwMShERVZJQ0VfRVhURU5TSU9OICpwZHgpOwogZXh0ZXJuIGludCBHZXRDaGFyKERFVklDRV9FWFRFTlNJT04gKnBkeCk7CiBleHRlcm4gaW50IEdldFN0cmluZyhERVZJQ0VfRVhURU5TSU9OICpwZHgsIGNoYXIgX191c2VyICpwVXNlciwgaW50IG4pOwotZXh0ZXJuIGludCBTZXRUcmFuc2ZlcihERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSREVTQyBfX3VzZXIgKnBURCk7CitleHRlcm4gaW50IFNldFRyYW5zZmVyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyBfX3VzZXIgKnBURCk7CiBleHRlcm4gaW50IFVuc2V0VHJhbnNmZXIoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBpbnQgbkFyZWEpOwotZXh0ZXJuIGludCBTZXRFdmVudChERVZJQ0VfRVhURU5TSU9OICpwZHgsIFRSQU5TRkVSRVZFTlQgX191c2VyICpwVEUpOworZXh0ZXJuIGludCBTZXRFdmVudChERVZJQ0VfRVhURU5TSU9OICpwZHgsIHN0cnVjdCB0cmFuc2Zlcl9ldmVudCBfX3VzZXIgKnBURSk7CiBleHRlcm4gaW50IFN0YXQxNDAxKERFVklDRV9FWFRFTlNJT04gKnBkeCk7CiBleHRlcm4gaW50IExpbmVDb3VudChERVZJQ0VfRVhURU5TSU9OICpwZHgpOwogZXh0ZXJuIGludCBHZXRPdXRCdWZTcGFjZShERVZJQ0VfRVhURU5TSU9OICpwZHgpOwpAQCAtMjM4LDcgKzIzOCw3IEBACiBleHRlcm4gaW50IERiZ1JhbXBBZGRyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVERCR0JMT0NLIF9fdXNlciAqcERCKTsKIGV4dGVybiBpbnQgRGJnR2V0RGF0YShERVZJQ0VfRVhURU5TSU9OICpwZHgsIFREQkdCTE9DSyBfX3VzZXIgKnBEQik7CiBleHRlcm4gaW50IERiZ1N0b3BMb29wKERFVklDRV9FWFRFTlNJT04gKnBkeCk7Ci1leHRlcm4gaW50IFNldENpcmN1bGFyKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVFJBTlNGRVJERVNDIF9fdXNlciAqcFREKTsKK2V4dGVybiBpbnQgU2V0Q2lyY3VsYXIoREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIF9fdXNlciAqcFREKTsKIGV4dGVybiBpbnQgR2V0Q2lyY0Jsb2NrKERFVklDRV9FWFRFTlNJT04gKnBkeCwgVENJUkNCTE9DSyBfX3VzZXIgKnBDQik7CiBleHRlcm4gaW50IEZyZWVDaXJjQmxvY2soREVWSUNFX0VYVEVOU0lPTiAqcGR4LCBUQ0lSQ0JMT0NLIF9fdXNlciAqcENCKTsKIGV4dGVybiBpbnQgV2FpdEV2ZW50KERFVklDRV9FWFRFTlNJT04gKnBkeCwgaW50IG5BcmVhLCBpbnQgbXNUaW1lT3V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZTE0X2lvYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlMTRfaW9jLmgKaW5kZXggOTdkNzkxMy4uNDJkMmU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlMTRfaW9jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlMTRfaW9jLmgKQEAgLTI3NiwxNSArMjc2LDE0IEBACiAKIHR5cGVkZWYgUEFSQU1CTEsqICAgUFBBUkFNQkxLOwogCi10eXBlZGVmIHN0cnVjdCBUcmFuc2ZlckRlc2MgICAgICAgICAgLyogU3RydWN0dXJlIGFuZCB0eXBlIGZvciBTZXRUcmFuc0FyZWEgKi8KK3N0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgICAgICAgICAgLyogU3RydWN0dXJlIGFuZCB0eXBlIGZvciBTZXRUcmFuc0FyZWEgKi8KIHsKIAl1bnNpZ25lZCBzaG9ydCAgICAgICAgd0FyZWE7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIHRyYW5zZmVyIGFyZWEgdG8gc2V0IHVwICAgICAgICovCiAJdm9pZCBGQVIgKmxwdkJ1ZmY7ICAgICAgICAgIC8qIGFkZHJlc3Mgb2YgdHJhbnNmZXIgYXJlYSAgICAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGludCAgICAgICBkd0xlbmd0aDsgICAgICAgICAvKiBsZW5ndGggb2YgYXJlYSB0byBzZXQgdXAgICAgICAgICAgICAgICAgKi8KIAlzaG9ydCAgICAgICBlU2l6ZTsgICAgICAgICAgICAvKiBzaXplIHRvIG1vdmUgKGZvciBzd2FwcGluZyBvbiBNQUMpICAgICAgKi8KLX0gVFJBTlNGRVJERVNDOworfTsKIAotdHlwZWRlZiBUUkFOU0ZFUkRFU0MgRkFSICpMUFRSQU5TRkVSREVTQzsKIAogLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHVzZWQgdG8gc2V0IHVwIGEgdHJhbnNmZXIgYXJlYSAqLwogdHlwZWRlZiBzdHJ1Y3QgVlhUcmFuc2ZlckRlc2MgICAgLyogdXNlMTQwMS5jIGFuZCB1c2UxNDMyeC54IHVzZSBvbmx5ICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2Vyc3BhY2UvdXNlMTQwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NlZDE0MDEvdXNlcnNwYWNlL3VzZTE0MDEuYwppbmRleCBjOWJjMmViLi43YjhhMjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY2VkMTQwMS91c2Vyc3BhY2UvdXNlMTQwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jZWQxNDAxL3VzZXJzcGFjZS91c2UxNDAxLmMKQEAgLTIyMzEsNyArMjIzMSw3IEBACiBVMTRBUEkoc2hvcnQpIFUxNFNldFRyYW5zQXJlYShzaG9ydCBoYW5kLCB1bnNpZ25lZCBzaG9ydCB3QXJlYSwgdm9pZCAqcHZCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGR3TGVuZ3RoLCBzaG9ydCBlU3opCiB7Ci0gICAgVFJBTlNGRVJERVNDIHRkOworICAgIHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MgdGQ7CiAgICAgc2hvcnQgc0VyciA9IENoZWNrSGFuZGxlKGhhbmQpOwogICAgIGlmIChzRXJyICE9IFUxNEVSUl9OT0VSUk9SKQogICAgICAgICByZXR1cm4gc0VycjsKQEAgLTIyOTIsNyArMjI5Miw3IEBACiAgICAgICAgIHRkLmVTaXplID0gMDsgICAgICAgICAgICAgICAgLy8gRHVtbXkgZWxlbWVudCBzaXplCiAKICAgICAgICAgaWYgKERldmljZUlvQ29udHJvbChhSGFuZDE0MDFbaGFuZF0sKHVuc2lnbmVkIGludClVMTRfU0VUVFJBTlNGRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRkLHNpemVvZihUUkFOU0ZFUkRFU0MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZCxzaXplb2Yoc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJXb3JrLHNpemVvZihQQVJBTUJMSyksJmR3Qnl0ZXMsTlVMTCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChkd0J5dGVzID49IHNpemVvZihQQVJBTUJMSykpICAgIC8vIG1heWJlIGVycm9yIGZyb20gZHJpdmVyPwpAQCAtMjQ5NiwxNCArMjQ5NiwxNCBAQAogICAgIHsKICAgICAgICAgUEFSQU1CTEsgcldvcms7CiAgICAgICAgIHVuc2lnbmVkIGludCBkd0J5dGVzOwotICAgICAgICBUUkFOU0ZFUkRFU0MgdHhEZXNjOworICAgICAgICBzdHJ1Y3QgdHJhbnNmZXJfYXJlYV9kZXNjIHR4RGVzYzsKICAgICAgICAgdHhEZXNjLndBcmVhID0gd0FyZWE7ICAgICAgICAgICAgIC8qIFB1cmUgTlQgLSBwdXQgZGF0YSBpbnRvIHN0cnVjdCAqLwogICAgICAgICB0eERlc2MubHB2QnVmZiA9IHB2QnVmZjsKICAgICAgICAgdHhEZXNjLmR3TGVuZ3RoID0gZHdMZW5ndGg7CiAgICAgICAgIHR4RGVzYy5lU2l6ZSA9IChzaG9ydCliVG9Ib3N0OyAgICAgICAvKiBVc2UgdGhpcyBmb3IgZGlyZWN0aW9uIGZsYWcgKi8KICAgIAogICAgICAgICBpZiAoRGV2aWNlSW9Db250cm9sKGFIYW5kMTQwMVtoYW5kXSwodW5zaWduZWQgaW50KVUxNF9TRVRDSVJDVUxBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eERlc2MsIHNpemVvZihUUkFOU0ZFUkRFU0MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4RGVzYywgc2l6ZW9mKHN0cnVjdCB0cmFuc2Zlcl9hcmVhX2Rlc2MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJXb3JrLCBzaXplb2YoUEFSQU1CTEspLCZkd0J5dGVzLE5VTEwpKQogICAgICAgICB7CiAgICAgICAgICAgIGlmIChkd0J5dGVzID49IHNpemVvZihQQVJBTUJMSykpICAgICAgICAgIC8qIGVycm9yIGZyb20gZHJpdmVyPyAqLwpAQCAtMjUyOCw3ICsyNTI4LDcgQEAKICNpZmRlZiBMSU5VWAogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIFRSQU5TRkVSREVTQyB0ZDsKKyAgICAgICAgc3RydWN0IHRyYW5zZmVyX2FyZWFfZGVzYyB0ZDsKICAgICAgICAgdGQubHB2QnVmZiA9IChsb25nIGxvbmcpKCh1bnNpZ25lZCBsb25nKXB2QnVmZik7CiAgICAgICAgIHRkLndBcmVhTnVtID0gd0FyZWE7CiAgICAgICAgIHRkLmR3TGVuZ3RoID0gZHdMZW5ndGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKaW5kZXggODllMjViNC4uNzAzYzVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZwpAQCAtMTc3LDYgKzE3Nyw3IEBACiBjb25maWcgQ09NRURJX1BDTDgxMgogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTgxMi84MTMgYW5kIEFEbGluayBBQ0wtODExMi84MTEzLzgxMTMvODIxNiIKIAlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTICYmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV9GQwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxMi9QRywgUENMLTgxMy9CLCBBRExpbmsKIAkgIEFDTC04MTEyREcvSEcvUEcsIEFDTC04MTEzLCBBQ0wtODIxNiwgSUNQIERBUyBBLTgyMVBHSC9QR0wvUEdMLU5EQSwKQEAgLTE4OCw2ICsxODksNyBAQAogY29uZmlnIENPTUVESV9QQ0w4MTYKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC04MTQgYW5kIFBDTC04MTYgSVNBIGNhcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTICYmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV9GQwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxNCBhbmQgUENMLTgxNiBJU0EgY2FyZHMKIApAQCAtMTk3LDYgKzE5OSw3IEBACiBjb25maWcgQ09NRURJX1BDTDgxOAogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTcxOCBhbmQgUENMLTgxOCBJU0EgY2FyZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVklSVF9UT19CVVMgJiYgSVNBX0RNQV9BUEkKKwlzZWxlY3QgQ09NRURJX0ZDCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODE4IElTQSBjYXJkcwogCSAgUENMLTgxOEwsIFBDTC04MThILCBQQ0wtODE4SEQsIFBDTC04MThIRywgUENMLTgxOCBhbmQgUENMLTcxOApAQCAtMjU3LDYgKzI2MCwxNCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgcnRpODAyLgogCitjb25maWcgQ09NRURJX0RBQzAyCisJdHJpc3RhdGUgIktlaXRobGV5IE1ldHJhYnl0ZSBEQUMwMiBjb21wYXRpYmxlIElTQSBjYXJkIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEtlaXRobGV5IE1ldHJhYnl0ZSBEQUMwMiBjb21wYXRpYmxlIElTQSBjYXJkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZGFjMDIuCisKIGNvbmZpZyBDT01FRElfREFTMTZNMQogCXRyaXN0YXRlICJNZWFzdXJlbWVudENvbXB1dGluZyBDSU8tREFTMTYvTTFEQVMtMTYgSVNBIGNhcmQgc3VwcG9ydCIKIAlzZWxlY3QgQ09NRURJXzgyNTUKQEAgLTU1OSwxNSArNTcwLDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIG11bHRpcTMuCiAKLWNvbmZpZyBDT01FRElfUE9DCi0JdHJpc3RhdGUgIkdlbmVyaWMgZHJpdmVyIGZvciB2ZXJ5IHNpbXBsZSBkZXZpY2VzIgotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBnZW5lcmljIHN1cHBvcnQgZm9yIHZlcnkgc2ltcGxlIC8gUE9DIChQaWVjZSBvZiBDcmFwKSBib2FyZHMsCi0JICBLZWl0aGxleSBNZXRyYWJ5dGUgREFDLTAyIChkYWMwMikuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIHBvYy4KLQogY29uZmlnIENPTUVESV9TNTI2CiAJdHJpc3RhdGUgIlNlbnNvcmF5IHM1MjYgc3VwcG9ydCIKIAktLS1oZWxwLS0tCkBAIC03NTMsNiArNzU1LDcgQEAKIAogY29uZmlnIENPTUVESV9BRFZfUENJMTcxMAogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENJLTE3MXgsIFBDSS0xNzIwIGFuZCBQQ0ktMTczMSBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfRkMKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDSS0xNzEwLCBQQ0ktMTcxMEhHLCBQQ0ktMTcxMSwKIAkgIFBDSS0xNzEzLCBQQ0ktMTcyMCBhbmQgUENJLTE3MzEKQEAgLTg1Niw2ICs4NTksNyBAQAogCiBjb25maWcgQ09NRURJX0RUMzAwMAogCXRyaXN0YXRlICJEYXRhIFRyYW5zbGF0aW9uIERUMzAwMCBzZXJpZXMgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJX0ZDCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERhdGEgVHJhbnNsYXRpb24gRFQzMDAwIHNlcmllcwogCSAgRFQzMDAxLCBEVDMwMDEtUEdMLCBEVDMwMDIsIERUMzAwMywgRFQzMDAzLVBHTCwgRFQzMDA0LCBEVDMwMDUgYW5kCkBAIC0xMTAxLDYgKzExMDUsNyBAQAogCiBjb25maWcgQ09NRURJX01JVEUKIAlkZXBlbmRzIG9uIEhBU19ETUEKKwlzZWxlY3QgQ09NRURJX0ZDCiAJdHJpc3RhdGUKIAogY29uZmlnIENPTUVESV9OSV9USU9DTUQKQEAgLTExNzksNiArMTE4NCw3IEBACiAKIGNvbmZpZyBDT01FRElfUVVBVEVDSF9EQVFQX0NTCiAJdHJpc3RhdGUgIlF1YXRlY2ggREFRUCBQQ01DSUEgZGF0YSBjYXB0dXJlIGNhcmQgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJX0ZDCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBRdWF0ZWNoIERBUVAgUENNQ0lBIGRhdGEgY2FwdHVyZSBjYXJkcwogCSAgREFRUC0yMDggYW5kIERBUVAtMzA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKaW5kZXggYzIyYzYxNy4uZWE2ZGMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHNpemUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBzaXplKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbWF4X3JlYWRfYnVmZmVyX2tiX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNzZGV2LApAQCAtMzUzLDcgKzM1Myw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHNpemUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBzaXplKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcmVhZF9idWZmZXJfa2Jfc3RvcmUoc3RydWN0IGRldmljZSAqY3NkZXYsCkBAIC00MTAsNyArNDEwLDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCiAJY29tZWRpX2Rldl9wdXQoZGV2KTsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgc2l6ZSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHNpemUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBtYXhfd3JpdGVfYnVmZmVyX2tiX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNzZGV2LApAQCAtNDY2LDcgKzQ2Niw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHNpemUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBzaXplKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgd3JpdGVfYnVmZmVyX2tiX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmNzZGV2LApAQCAtMTE5NCw2ICsxMTk0LDExIEBACiAJCXN3aXRjaCAoaW5zbi0+aW5zbikgewogCQljYXNlIElOU05fUkVBRDoKIAkJCXJldCA9IHMtPmluc25fcmVhZChkZXYsIHMsIGluc24sIGRhdGEpOworCQkJaWYgKHJldCA9PSAtRVRJTUVET1VUKSB7CisJCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKKwkJCQkJInN1YmRldmljZSAlZCByZWFkIGluc3RydWN0aW9uIHRpbWVkIG91dFxuIiwKKwkJCQkJcy0+aW5kZXgpOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSU5TTl9XUklURToKIAkJCW1heGRhdGEgPSBzLT5tYXhkYXRhX2xpc3QKQEAgLTEyMDcsOCArMTIxMiwxNCBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAocmV0ID09IDApCisJCQlpZiAocmV0ID09IDApIHsKIAkJCQlyZXQgPSBzLT5pbnNuX3dyaXRlKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQkJaWYgKHJldCA9PSAtRVRJTUVET1VUKSB7CisJCQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCisJCQkJCQkic3ViZGV2aWNlICVkIHdyaXRlIGluc3RydWN0aW9uIHRpbWVkIG91dFxuIiwKKwkJCQkJCXMtPmluZGV4KTsKKwkJCQl9CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBJTlNOX0JJVFM6CiAJCQlpZiAoaW5zbi0+biAhPSAyKSB7CkBAIC0xNDA1LDQxICsxNDE2LDk0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBfX2NvbWVkaV9nZXRfdXNlcl9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9jbWQgX191c2VyICphcmcsCisJCQkJIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCit7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoY21kLCBhcmcsIHNpemVvZigqY21kKSkpIHsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjbWQtPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIGNtZC0+c3ViZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcyA9ICZkZXYtPnN1YmRldmljZXNbY21kLT5zdWJkZXZdOworCisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIlZCBub3QgdmFsaWQgc3ViZGV2aWNlXG4iLCBjbWQtPnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0IHx8ICFzLT5hc3luYykgeworCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAorCQkJInN1YmRldmljZSAlZCBkb2VzIG5vdCBzdXBwb3J0IGNvbW1hbmRzXG4iLCBjbWQtPnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gbG9uZyAqLworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgeworCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJWQgPiAlZFxuIiwKKwkJCWNtZC0+Y2hhbmxpc3RfbGVuLCBzLT5sZW5fY2hhbmxpc3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2NvbWVkaV9nZXRfdXNlcl9jaGFubGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBfX3VzZXIgKnVzZXJfY2hhbmxpc3QsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OworCWludCByZXQ7CisKKwkvKiB1c2VyX2NoYW5saXN0IGNvdWxkIGJlIE5VTEwgZm9yIGRvX2NtZHRlc3QgaW9jdGxzICovCisJaWYgKCF1c2VyX2NoYW5saXN0KQorCQlyZXR1cm4gMDsKKworCWNoYW5saXN0ID0gbWVtZHVwX3VzZXIodXNlcl9jaGFubGlzdCwKKwkJCSAgICAgICBjbWQtPmNoYW5saXN0X2xlbiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwlpZiAoSVNfRVJSKGNoYW5saXN0KSkKKwkJcmV0dXJuIFBUUl9FUlIoY2hhbmxpc3QpOworCisJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLworCXJldCA9IGNvbWVkaV9jaGVja19jaGFubGlzdChzLCBjbWQtPmNoYW5saXN0X2xlbiwgY2hhbmxpc3QpOworCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGNoYW5saXN0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbWQtPmNoYW5saXN0ID0gY2hhbmxpc3Q7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBkb19jbWRfaW9jdGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqYXJnLCB2b2lkICpmaWxlKQogewogCXN0cnVjdCBjb21lZGlfY21kIGNtZDsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYzsKLQlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgX191c2VyICp1c2VyX2NoYW5saXN0OworCWludCByZXQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYXJnLCBzaXplb2YoY21kKSkpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KKwkvKiBnZXQgdGhlIHVzZXIncyBjbWQgYW5kIGRvIHNvbWUgc2ltcGxlIHZhbGlkYXRpb24gKi8KKwlyZXQgPSBfX2NvbWVkaV9nZXRfdXNlcl9jbWQoZGV2LCBhcmcsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBzYXZlIHVzZXIncyBjaGFubGlzdCBwb2ludGVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciAqLwogCXVzZXJfY2hhbmxpc3QgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWNtZC5jaGFubGlzdDsKIAotCWlmIChjbWQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIlZCBubyBzdWNoIHN1YmRldmljZVxuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2NtZC5zdWJkZXZdOwogCWFzeW5jID0gcy0+YXN5bmM7CiAKLQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIiVkIG5vdCB2YWxpZCBzdWJkZXZpY2VcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCB8fCAhcy0+YXN5bmMpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCSJzdWJkZXZpY2UgJWkgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kc1xuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQogCS8qIGFyZSB3ZSBsb2NrZWQ/IChpb2N0bCBsb2NrKSAqLwogCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAic3ViZGV2aWNlIGxvY2tlZFxuIik7CkBAIC0xNDUyLDEzICsxNTE2LDYgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIGxvbmcgKi8KLQlpZiAoY21kLmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJXUgPiAlZFxuIiwKLQkJCWNtZC5jaGFubGlzdF9sZW4sIHMtPmxlbl9jaGFubGlzdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gc2hvcnQgKi8KIAlpZiAoY21kLmNoYW5saXN0X2xlbiA8IDEpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImNoYW5uZWwvZ2FpbiBsaXN0IHRvbyBzaG9ydCAldSA8IDFcbiIsCkBAIC0xNDY4LDI1ICsxNTI1LDExIEBACiAKIAlhc3luYy0+Y21kID0gY21kOwogCWFzeW5jLT5jbWQuZGF0YSA9IE5VTEw7Ci0JLyogbG9hZCBjaGFubmVsL2dhaW4gbGlzdCAqLwotCWFzeW5jLT5jbWQuY2hhbmxpc3QgPSBtZW1kdXBfdXNlcih1c2VyX2NoYW5saXN0LAotCQkJCQkgIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKGludCkpOwotCWlmIChJU19FUlIoYXN5bmMtPmNtZC5jaGFubGlzdCkpIHsKLQkJcmV0ID0gUFRSX0VSUihhc3luYy0+Y21kLmNoYW5saXN0KTsKLQkJYXN5bmMtPmNtZC5jaGFubGlzdCA9IE5VTEw7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJtZW1kdXBfdXNlciBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLAotCQkJcmV0KTsKLQkJZ290byBjbGVhbnVwOwotCX0KIAotCS8qIG1ha2Ugc3VyZSBlYWNoIGVsZW1lbnQgaW4gY2hhbm5lbC9nYWluIGxpc3QgaXMgdmFsaWQgKi8KLQlyZXQgPSBjb21lZGlfY2hlY2tfY2hhbmxpc3QocywKLQkJCQkgICAgYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4sCi0JCQkJICAgIGFzeW5jLT5jbWQuY2hhbmxpc3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJiYWQgY2hhbmxpc3RcbiIpOworCS8qIGxvYWQgY2hhbm5lbC9nYWluIGxpc3QgKi8KKwlyZXQgPSBfX2NvbWVkaV9nZXRfdXNlcl9jaGFubGlzdChkZXYsIHMsIHVzZXJfY2hhbmxpc3QsICZhc3luYy0+Y21kKTsKKwlpZiAocmV0KQogCQlnb3RvIGNsZWFudXA7Ci0JfQogCiAJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZhc3luYy0+Y21kKTsKIApAQCAtMTU1NCw2MyArMTU5NywyNCBAQAogewogCXN0cnVjdCBjb21lZGlfY21kIGNtZDsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKLQlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgKmNoYW5saXN0ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgX191c2VyICp1c2VyX2NoYW5saXN0OworCWludCByZXQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYXJnLCBzaXplb2YoY21kKSkpIHsKLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KKwkvKiBnZXQgdGhlIHVzZXIncyBjbWQgYW5kIGRvIHNvbWUgc2ltcGxlIHZhbGlkYXRpb24gKi8KKwlyZXQgPSBfX2NvbWVkaV9nZXRfdXNlcl9jbWQoZGV2LCBhcmcsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBzYXZlIHVzZXIncyBjaGFubGlzdCBwb2ludGVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciAqLwogCXVzZXJfY2hhbmxpc3QgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWNtZC5jaGFubGlzdDsKIAotCWlmIChjbWQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICIlZCBubyBzdWNoIHN1YmRldmljZVxuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2NtZC5zdWJkZXZdOwotCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiJWQgbm90IHZhbGlkIHN1YmRldmljZVxuIiwgY21kLnN1YmRldik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0KSB7Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkic3ViZGV2aWNlICVpIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZHNcbiIsIGNtZC5zdWJkZXYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIGxvbmcgKi8KLQlpZiAoY21kLmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJWQgPiAlZFxuIiwKLQkJCWNtZC5jaGFubGlzdF9sZW4sIHMtPmxlbl9jaGFubGlzdCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CiAKIAkvKiBsb2FkIGNoYW5uZWwvZ2FpbiBsaXN0ICovCi0JaWYgKGNtZC5jaGFubGlzdCkgewotCQljaGFubGlzdCA9IG1lbWR1cF91c2VyKHVzZXJfY2hhbmxpc3QsCi0JCQkJICAgICAgIGNtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSk7Ci0JCWlmIChJU19FUlIoY2hhbmxpc3QpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKGNoYW5saXN0KTsKLQkJCWNoYW5saXN0ID0gTlVMTDsKLQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkJIm1lbWR1cF91c2VyIGV4aXRlZCB3aXRoIGNvZGUgJWQiLCByZXQpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLwotCQlyZXQgPSBjb21lZGlfY2hlY2tfY2hhbmxpc3QocywgY21kLmNoYW5saXN0X2xlbiwgY2hhbmxpc3QpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjaGFubGlzdFxuIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQljbWQuY2hhbmxpc3QgPSBjaGFubGlzdDsKLQl9CisJcmV0ID0gX19jb21lZGlfZ2V0X3VzZXJfY2hhbmxpc3QoZGV2LCBzLCB1c2VyX2NoYW5saXN0LCAmY21kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZjbWQpOwogCkBAIC0xNjIwLDkgKzE2MjQsOCBAQAogCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY21kLCBzaXplb2YoY21kKSkpIHsKIAkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgImJhZCBjbWQgYWRkcmVzc1xuIik7CiAJCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gY2xlYW51cDsKIAl9Ci1jbGVhbnVwOgorCiAJa2ZyZWUoY2hhbmxpc3QpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCmluZGV4IGY4MmJkNDIuLmQ0NjEyM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApAQCAtNjEsMzEgKzYxLDMxIEBACiAKIAl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OwkvKiBkcml2ZXItb3duZWQgY2hhbmxpc3QgKG5vdCB1c2VkKSAqLwogCi0JaW50ICgqaW5zbl9yZWFkKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwlpbnQgKCppbnNuX3JlYWQpKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKKwlpbnQgKCppbnNuX3dyaXRlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAogCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwotCWludCAoKmluc25fd3JpdGUpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCWludCAoKmluc25fYml0cykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOworCWludCAoKmluc25fY29uZmlnKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAogCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQlpbnQgKCppbnNuX2JpdHMpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAotCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwotCWludCAoKmluc25fY29uZmlnKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwogCi0JaW50ICgqZG9fY21kKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7Ci0JaW50ICgqZG9fY21kdGVzdCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCi0JCQkgICBzdHJ1Y3QgY29tZWRpX2NtZCAqKTsKLQlpbnQgKCpwb2xsKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7Ci0JaW50ICgqY2FuY2VsKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7CisJaW50ICgqZG9fY21kKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpkb19jbWR0ZXN0KShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCQkJICBzdHJ1Y3QgY29tZWRpX2NtZCAqKTsKKwlpbnQgKCpwb2xsKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpjYW5jZWwpKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOwogCS8qIGludCAoKmRvX2xvY2spKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOyAqLwogCS8qIGludCAoKmRvX3VubG9jaykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgXAogCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKik7ICovCiAKIAkvKiBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGNoYW5nZXMgKi8KLQlpbnQgKCpidWZfY2hhbmdlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBsb25nIG5ld19zaXplKTsKKwlpbnQgKCpidWZfY2hhbmdlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CiAKLQl2b2lkICgqbXVuZ2UpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJICAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfY2hhbl9pbmRleCk7CisJdm9pZCAoKm11bmdlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcywKKwkJICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2NoYW5faW5kZXgpOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGFzeW5jX2RtYV9kaXI7CiAKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CkBAIC0xNDYsOCArMTQ2LDggQEAKIAogCXVuc2lnbmVkIGludCBjYl9tYXNrOwogCi0JaW50ICgqaW50dHJpZykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJdW5zaWduZWQgaW50IHgpOworCWludCAoKmludHRyaWcpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgICAgdW5zaWduZWQgaW50IHgpOwogfTsKIAogc3RydWN0IGNvbWVkaV9kcml2ZXIgewpAQCAtMTU1LDkgKzE1NSw5IEBACiAKIAljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7Ci0JaW50ICgqYXR0YWNoKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKik7Ci0Jdm9pZCAoKmRldGFjaCkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOwotCWludCAoKmF1dG9fYXR0YWNoKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7CisJaW50ICgqYXR0YWNoKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqKTsKKwl2b2lkICgqZGV0YWNoKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKKwlpbnQgKCphdXRvX2F0dGFjaCkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7CiAKIAkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYm9hcmRfbmFtZSBhbmQgYm9hcmRfaWQgYXJyYXlzICovCiAJdW5zaWduZWQgaW50IG51bV9uYW1lczsKQEAgLTIwMiw4ICsyMDIsOCBAQAogCiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmFzeW5jX3F1ZXVlOwogCi0JaW50ICgqb3BlbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpjbG9zZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOworCWludCAoKm9wZW4pKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOworCXZvaWQgKCpjbG9zZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiB9OwogCiBzdGF0aWMgaW5saW5lIGNvbnN0IHZvaWQgKmNvbWVkaV9ib2FyZChjb25zdCBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQpAQCAtMzUzLDYgKzM1MywxNCBAQAogCiAvKiBkcml2ZXJzLmMgLSBnZW5lcmFsIGNvbWVkaSBkcml2ZXIgZnVuY3Rpb25zICovCiAKKyNkZWZpbmUgQ09NRURJX1RJTUVPVVRfTVMJMTAwMAorCitpbnQgY29tZWRpX3RpbWVvdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJICAgc3RydWN0IGNvbWVkaV9pbnNuICosCisJCSAgIGludCAoKmNiKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgbG9uZyBjb250ZXh0KSwKKwkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KTsKKwogaW50IGNvbWVkaV9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKmRhdGEsCiAJCQkgICB1bnNpZ25lZCBpbnQgbWFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCmluZGV4IDViMTUwMzMuLmFiMGU4ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCkBAIC0xNTUsNiArMTU1LDM2IEBACiB9CiAKIC8qKgorICogY29tZWRpX3RpbWVvdXQoKSAtIGJ1c3ktd2FpdCBmb3IgYSBkcml2ZXIgY29uZGl0aW9uIHRvIG9jY3VyLgorICogQGRldjogY29tZWRpX2RldmljZSBzdHJ1Y3QKKyAqIEBzOiBjb21lZGlfc3ViZGV2aWNlIHN0cnVjdAorICogQGluc246IGNvbWVkaV9pbnNuIHN0cnVjdAorICogQGNiOiBjYWxsYmFjayB0byBjaGVjayBmb3IgdGhlIGNvbmRpdGlvbgorICogQGNvbnRleHQ6IHByaXZhdGUgY29udGV4dCBmcm9tIHRoZSBkcml2ZXIKKyAqLworaW50IGNvbWVkaV90aW1lb3V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgIGludCAoKmNiKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpLAorCQkgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQ09NRURJX1RJTUVPVVRfTVMpOworCWludCByZXQ7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmV0ID0gY2IoZGV2LCBzLCBpbnNuLCBjb250ZXh0KTsKKwkJaWYgKHJldCAhPSAtRUJVU1kpCisJCQlyZXR1cm4gcmV0OwkvKiBzdWNjZXNzICgwKSBvciBub24gRUJVU1kgZXJybm8gKi8KKwkJY3B1X3JlbGF4KCk7CisJfQorCXJldHVybiAtRVRJTUVET1VUOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX3RpbWVvdXQpOworCisvKioKICAqIGNvbWVkaV9kaW9faW5zbl9jb25maWcoKSAtIGJvaWxlcnBsYXRlICgqaW5zbl9jb25maWcpIGZvciBESU8gc3ViZGV2aWNlcy4KICAqIEBkZXY6IGNvbWVkaV9kZXZpY2Ugc3RydWN0CiAgKiBAczogY29tZWRpX3N1YmRldmljZSBzdHJ1Y3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKaW5kZXggOGE1N2MzYy4uNDZhMzg1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgIjgyNTUuaCIKKyNpbmNsdWRlICJtaXRlLmgiCiAKIGVudW0gcGNpXzgyNTVfYm9hcmRpZCB7CiAJQk9BUkRfQURMSU5LX1BDSTcyMjQsCkBAIC03OSw2ICs4MCw3IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgZGlvX2JhZHI7CiAJaW50IG5fODI1NTsKKwl1bnNpZ25lZCBpbnQgaGFzX21pdGU6MTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpXzgyNTVfYm9hcmRpbmZvIHBjaV84MjU1X2JvYXJkc1tdID0gewpAQCAtMTI2LDM2ICsxMjgsNDMgQEAKIAkJLm5hbWUJCT0gIm5pX3BjaS1kaW8tOTYiLAogCQkuZGlvX2JhZHIJPSAxLAogCQkubl84MjU1CQk9IDQsCisJCS5oYXNfbWl0ZQk9IDEsCiAJfSwKIAlbQk9BUkRfTklfUENJRElPOTZCXSA9IHsKIAkJLm5hbWUJCT0gIm5pX3BjaS1kaW8tOTZiIiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSA0LAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiAJW0JPQVJEX05JX1BYSTY1MDhdID0gewogCQkubmFtZQkJPSAibmlfcHhpLTY1MDgiLAogCQkuZGlvX2JhZHIJPSAxLAogCQkubl84MjU1CQk9IDQsCisJCS5oYXNfbWl0ZQk9IDEsCiAJfSwKIAlbQk9BUkRfTklfUENJNjUwM10gPSB7CiAJCS5uYW1lCQk9ICJuaV9wY2ktNjUwMyIsCiAJCS5kaW9fYmFkcgk9IDEsCiAJCS5uXzgyNTUJCT0gMSwKKwkJLmhhc19taXRlCT0gMSwKIAl9LAogCVtCT0FSRF9OSV9QQ0k2NTAzQl0gPSB7CiAJCS5uYW1lCQk9ICJuaV9wY2ktNjUwM2IiLAogCQkuZGlvX2JhZHIJPSAxLAogCQkubl84MjU1CQk9IDEsCisJCS5oYXNfbWl0ZQk9IDEsCiAJfSwKIAlbQk9BUkRfTklfUENJNjUwM1hdID0gewogCQkubmFtZQkJPSAibmlfcGNpLTY1MDN4IiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSAxLAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiAJW0JPQVJEX05JX1BYSV82NTAzXSA9IHsKIAkJLm5hbWUJCT0gIm5pX3B4aS02NTAzIiwKIAkJLmRpb19iYWRyCT0gMSwKIAkJLm5fODI1NQkJPSAxLAorCQkuaGFzX21pdGUJPSAxLAogCX0sCiB9OwogCkBAIC0xNjMsNiArMTcyLDI1IEBACiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiB9OwogCitzdGF0aWMgaW50IHBjaV84MjU1X21pdGVfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXZvaWQgX19pb21lbSAqbWl0ZV9iYXNlOworCXUzMiBtYWluX3BoeXNfYWRkcjsKKworCS8qIGlvcmVtYXAgdGhlIE1JVEUgcmVnaXN0ZXJzIChCQVIgMCkgdGVtcG9yYXJpbHkgKi8KKwltaXRlX2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGNpZGV2LCAwKTsKKwlpZiAoIW1pdGVfYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBzZXQgZGF0YSB3aW5kb3cgdG8gbWFpbiByZWdpc3RlcnMgKEJBUiAxKSAqLworCW1haW5fcGh5c19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7CisJd3JpdGVsKG1haW5fcGh5c19hZGRyIHwgV0VOQUIsIG1pdGVfYmFzZSArIE1JVEVfSU9EV0JTUik7CisKKwkvKiBmaW5pc2hlZCB3aXRoIE1JVEUgcmVnaXN0ZXJzICovCisJaW91bm1hcChtaXRlX2Jhc2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHBjaV84MjU1X21taW8oaW50IGRpciwgaW50IHBvcnQsIGludCBkYXRhLCB1bnNpZ25lZCBsb25nIGlvYmFzZSkKIHsKIAl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9ICh2b2lkIF9faW9tZW0gKilpb2Jhc2U7CkBAIC0yMDEsNiArMjI5LDEyIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWlmIChib2FyZC0+aGFzX21pdGUpIHsKKwkJcmV0ID0gcGNpXzgyNTVfbWl0ZV9pbml0KHBjaWRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCWlzX21taW8gPSAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgYm9hcmQtPmRpb19iYWRyKSAmCiAJCSAgIElPUkVTT1VSQ0VfTUVNKSAhPSAwOwogCWlmIChpc19tbWlvKSB7CkBAIC0yMzUsOSArMjY5LDYgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZCAoJWQgZGlnaXRhbCBpL28gY2hhbm5lbHMpXG4iLAotCQlkZXYtPmJvYXJkX25hbWUsIGJvYXJkLT5uXzgyNTUgKiAyNCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDI3MDZmNTguLjA3NTdhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAKIG9iai0kKENPTkZJR19DT01FRElfUENNMzcyNCkJCSs9IHBjbTM3MjQubwogb2JqLSQoQ09ORklHX0NPTUVESV9SVEk4MDApCQkrPSBydGk4MDAubwogb2JqLSQoQ09ORklHX0NPTUVESV9SVEk4MDIpCQkrPSBydGk4MDIubworb2JqLSQoQ09ORklHX0NPTUVESV9EQUMwMikJCSs9IGRhYzAyLm8KIG9iai0kKENPTkZJR19DT01FRElfREFTMTZNMSkJCSs9IGRhczE2bTEubwogb2JqLSQoQ09ORklHX0NPTUVESV9EQVMwOF9JU0EpCQkrPSBkYXMwOF9pc2Eubwogb2JqLSQoQ09ORklHX0NPTUVESV9EQVMxNikJCSs9IGRhczE2Lm8KQEAgLTUzLDcgKzU0LDYgQEAKIG9iai0kKENPTkZJR19DT01FRElfUENNTUlPKQkJKz0gcGNtbWlvLm8KIG9iai0kKENPTkZJR19DT01FRElfUENNVUlPKQkJKz0gcGNtdWlvLm8KIG9iai0kKENPTkZJR19DT01FRElfTVVMVElRMykJCSs9IG11bHRpcTMubwotb2JqLSQoQ09ORklHX0NPTUVESV9QT0MpCQkrPSBwb2Mubwogb2JqLSQoQ09ORklHX0NPTUVESV9TNTI2KQkJKz0gczUyNi5vCiAKICMgQ29tZWRpIFBDSSBkcml2ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kwMzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTAzNS5jCmluZGV4IDExMjhjMjIuLjI4NDUwZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTAzNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTAzNS5jCkBAIC0xLDQ2ICsxLDI0IEBACi0vKioKLUB2ZXJiYXRpbQotCi1Db3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgQURESS1EQVRBIEdtYkggZm9yIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIG1vZHVsZS4KLQotCUFEREktREFUQSBHbWJICi0JRGllc2Vsc3RyYXNzZSAzCi0JRC03NzgzMyBPdHRlcnN3ZWllcgotCVRlbDogKzE5KDApNzIyMy85NDkzLTAKLQlGYXg6ICs0OSgwKTcyMjMvOTQ5My05MgotCWh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbQotCWluZm9AYWRkaS1kYXRhLmNvbQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLUBlbmR2ZXJiYXRpbQotKi8KIC8qCi0KLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IChDKSBBRERJLURBVEEgR21iSCAgICAgICAgICBEaWVzZWxzdHJhw59lIDMgICAgICAgRC03NzgzMyBPdHRlcnN3ZWllciAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgVGVsIDogKzQ5ICgwKSA3MjIzLzk0OTMtMCAgICAgfCBlbWFpbCAgICA6IGluZm9AYWRkaS1kYXRhLmNvbSAgICAgICAgIHwKLSAgfCBGYXggOiArNDkgKDApIDcyMjMvOTQ5My05MiAgICB8IEludGVybmV0IDogaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCAgICAgOiBBUENJLTAzNSAgICAgICAgfCBDb21waWxlciAgIDogR0NDICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCBNb2R1bGUgbmFtZSA6IGh3ZHJ2X2FwY2kwMzUuYyB8IFZlcnNpb24gICAgOiAyLjk2ICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCBtYW5hZ2VyOiBFcmljIFN0b2x6ICAgfCBEYXRlICAgICAgIDogIDAyLzEyLzIwMDIgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IERlc2NyaXB0aW9uIDogICBIYXJkd2FyZSBMYXllciBBY2Nlc3MgRm9yIEFQQ0ktMDM1ICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICBEYXRlICAgfCAgIEF1dGhvciAgfCAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB1cGRhdGVzICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLworICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIEFEREktREFUQSBHbWJIIGZvciB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyBtb2R1bGUuCisgKgorICoJQURESS1EQVRBIEdtYkgKKyAqCURpZXNlbHN0cmFzc2UgMworICoJRC03NzgzMyBPdHRlcnN3ZWllcgorICoJVGVsOiArMTkoMCk3MjIzLzk0OTMtMAorICoJRmF4OiArNDkoMCk3MjIzLzk0OTMtOTIKKyAqCWh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbQorICoJaW5mb0BhZGRpLWRhdGEuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KIAogLyogQ2FyZCBTcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogI2RlZmluZSBBUENJMDM1X0FERFJFU1NfUkFOR0UJCTI1NQpAQCAtMTA2LDk5ICs4NCw2NiBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgaV9XYXRjaGRvZ05iciA9IDA7Ci1zdGF0aWMgaW50IGlfVGVtcCA9IDA7CitzdGF0aWMgaW50IGlfV2F0Y2hkb2dOYnI7CitzdGF0aWMgaW50IGlfVGVtcDsKIHN0YXRpYyBpbnQgaV9GbGFnID0gMTsKKwogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kwMzVfQ29uZmlnVGltZXJXYXRjaGRvZyAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyBUaGUgVGltZXIgLCBDb3VudGVyIG9yIFdhdGNoZG9nICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgIDogRGF0YSBQb2ludGVyIGNvbnRhaW5zICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMF0gICAgICAgICAgICA6IDAgQ29uZmlndXJlIEFzIFRpbWVyICAgICAgfAotfAkJCQkJCQkJCQkgICAxIENvbmZpZ3VyZSBBcyBXYXRjaGRvZyAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICA6IFdhdGNoZG9nIG51bWJlcgotfAkJCQkJICBkYXRhWzJdICAgICAgICAgICAgOiBUaW1lIGJhc2UgVW5pdCAgICAgICAgICAgIHwKLXwJCQkJCSAgZGF0YVszXQkJCSA6IFJlbG9hZCBWYWx1ZQkJCSAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XSAgICAgICAgICAgIDogRXh0ZXJuYWwgVHJpZ2dlciAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOkVuYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDpEaXNhYmxlCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs1XSAgICAgICAgICAgIDpFeHRlcm5hbCBUcmlnZ2VyIExldmVsCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMCBUcmlnZ2VyIERpc2FibGVkCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSBUcmlnZ2VyIEVuYWJsZWQgKExvdyBsZXZlbCkKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIFRyaWdnZXIgRW5hYmxlZCAoSGlnaCBMZXZlbCkKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExIFRyaWdnZXIgRW5hYmxlZCAoSGlnaC9Mb3cgbGV2ZWwpCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAgICAgICAgICAgIDogRXh0ZXJuYWwgR2F0ZSAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOkVuYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6RGlzYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbN10gICAgICAgICAgICA6IEV4dGVybmFsIEdhdGUgbGV2ZWwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwIEdhdGUgRGlzYWJsZWQKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIEdhdGUgRW5hYmxlZCAoTG93IGxldmVsKQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgR2F0ZSBFbmFibGVkIChIaWdoIExldmVsKQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbOF0gICAgICAgICAgICA6V2FybmluZyBSZWxheQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRU5BQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBESVNBQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs5XSAgICAgICAgICAgIDpXYXJuaW5nIERlbGF5IGF2YWlsYWJsZQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMTBdICAgICAgICAgICA6V2FybmluZyBSZWxheSBUaW1lIHVuaXQKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzExXSAgICAgICAgICAgOldhcm5pbmcgUmVsYXkgVGltZSBSZWxvYWQgdmFsdWUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzEyXSAgICAgICAgICAgOlJlc2V0IFJlbGF5Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDogRU5BQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogRElTQUJMRQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMTNdICAgICAgICAgICA6SW50ZXJydXB0Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDogRU5BQkxFCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogRElTQUJMRQotfAotfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X0NvbmZpZ1RpbWVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyBUaGUgVGltZXIgLCBDb3VudGVyIG9yIFdhdGNoZG9nCisgKgorICogZGF0YVswXSAwID0gQ29uZmlndXJlIEFzIFRpbWVyLCAxID0gQ29uZmlndXJlIEFzIFdhdGNoZG9nCisgKiBkYXRhWzFdIFdhdGNoZG9nIG51bWJlcgorICogZGF0YVsyXSBUaW1lIGJhc2UgVW5pdAorICogZGF0YVszXSBSZWxvYWQgVmFsdWUKKyAqIGRhdGFbNF0gRXh0ZXJuYWwgVHJpZ2dlciwgMSA9IEVuYWJsZSwgMCA9IERpc2FibGUKKyAqIGRhdGFbNV0gRXh0ZXJuYWwgVHJpZ2dlciBMZXZlbAorICoJMDAgPSBUcmlnZ2VyIERpc2FibGVkCisgKgkwMSA9IFRyaWdnZXIgRW5hYmxlZCAoTG93IGxldmVsKQorICoJMTAgPSBUcmlnZ2VyIEVuYWJsZWQgKEhpZ2ggTGV2ZWwpCisgKgkxMSA9IFRyaWdnZXIgRW5hYmxlZCAoSGlnaC9Mb3cgbGV2ZWwpCisgKiBkYXRhWzZdIEV4dGVybmFsIEdhdGUsIDEgPSBFbmFibGUsIDAgPSBEaXNhYmxlCisgKiBkYXRhWzddIEV4dGVybmFsIEdhdGUgbGV2ZWwKKyAqCTAwID0gR2F0ZSBEaXNhYmxlZAorICoJMDEgPSBHYXRlIEVuYWJsZWQgKExvdyBsZXZlbCkKKyAqCTEwID0gR2F0ZSBFbmFibGVkIChIaWdoIExldmVsKQorICogZGF0YVs4XSBXYXJuaW5nIFJlbGF5LCAxID0gRW5hYmxlLCAwID0gRGlzYWJsZQorICogZGF0YVs5XSBXYXJuaW5nIERlbGF5IGF2YWlsYWJsZQorICogZGF0YVsxMF0gV2FybmluZyBSZWxheSBUaW1lIHVuaXQKKyAqIGRhdGFbMTFdIFdhcm5pbmcgUmVsYXkgVGltZSBSZWxvYWQgdmFsdWUKKyAqIGRhdGFbMTJdIFJlc2V0IFJlbGF5LCAxID0gRW5hYmxlLCAwID0gRGlzYWJsZQorICogZGF0YVsxM10gSW50ZXJydXB0LCAxID0gRW5hYmxlLCAwID0gRGlzYWJsZQorICovCitzdGF0aWMgaW50IGFwY2kwMzVfdGltZXJfY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB1aV9TdGF0dXMgPSAwOwotCXVuc2lnbmVkIGludCB1aV9Db21tYW5kID0gMDsKLQl1bnNpZ25lZCBpbnQgdWlfTW9kZSA9IDA7CisJdW5zaWduZWQgaW50IHVpX1N0YXR1czsKKwl1bnNpZ25lZCBpbnQgdWlfQ29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgdWlfTW9kZTsKIAogCWlfVGVtcCA9IDA7CiAJZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwogCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gZGF0YVswXTsKIAlpX1dhdGNoZG9nTmJyID0gZGF0YVsxXTsKLQlpZiAoZGF0YVswXSA9PSAwKSB7CisJaWYgKGRhdGFbMF0gPT0gMCkKIAkJdWlfTW9kZSA9IDI7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXVpX01vZGUgPSAwOwotCX0KLS8qIHVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlKygoaV9XYXRjaGRvZ05ici0xKSozMikrMTIpOyAqLworCiAJdWlfQ29tbWFuZCA9IDA7Ci0vKiB1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY5RkVVTDsgKi8KIAlvdXRsKHVpX0NvbW1hbmQsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCXVpX0NvbW1hbmQgPSAwOworCiAJdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdGhlIHJlbG9hZCB2YWx1ZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIFNldCB0aGUgcmVsb2FkIHZhbHVlICovCiAJb3V0bChkYXRhWzNdLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDQpOwotLyoqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNldCB0aGUgdGltZSB1bml0ICovCi0vKioqKioqKioqKioqKioqKioqKioqLworCisJLyogU2V0IHRoZSB0aW1lIHVuaXQgKi8KIAlvdXRsKGRhdGFbMl0sIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgOCk7CiAJaWYgKGRhdGFbMF0gPT0gQURESURBVEFfVElNRVIpIHsKIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSBtb2RlIDogICAgICAgICAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBoYXJkd2FyZSAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBjb3VudGVyIG1vZGUgKi8KQEAgLTIwNiwxMDEgKzE1MSw4MiBAQAogCQkvKiAtIERpc2FibGUgdGhlIHJlc2V0ICAgICAgICAqLwogCQkvKiAtIEVuYWJsZSB0aGUgdGltZXIgbW9kZSAgICAqLwogCQkvKiAtIFNldCB0aGUgdGltZXIgbW9kZSAgICAgICAqLwotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQl1aV9Db21tYW5kID0KIAkJCSh1aV9Db21tYW5kICYgMHhGRkY3MTlFMlVMKSB8IHVpX01vZGUgPDwgMTNVTCB8IDB4MTBVTDsKIAotCX0JCQkvKiBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9USU1FUikgKi8KLQllbHNlIHsKLQkJaWYgKGRhdGFbMF0gPT0gQURESURBVEFfV0FUQ0hET0cpIHsKKwl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gQURESURBVEFfV0FUQ0hET0cpIHsKIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCS8qIFNldCB0aGUgbW9kZSA6ICAgICAgICAgICAgICovCi0JCQkvKiAtIERpc2FibGUgdGhlIGhhcmR3YXJlICAgICAqLwotCQkJLyogLSBEaXNhYmxlIHRoZSBjb3VudGVyIG1vZGUgKi8KLQkJCS8qIC0gRGlzYWJsZSB0aGUgd2FybmluZyAgICAgICovCi0JCQkvKiAtIERpc2FibGUgdGhlIHJlc2V0ICAgICAgICAqLwotCQkJLyogLSBEaXNhYmxlIHRoZSB0aW1lciBtb2RlICAgKi8KLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCS8qIFNldCB0aGUgbW9kZSA6ICAgICAgICAgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgaGFyZHdhcmUgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgY291bnRlciBtb2RlICovCisJCS8qIC0gRGlzYWJsZSB0aGUgd2FybmluZyAgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgcmVzZXQgICAgICAgICovCisJCS8qIC0gRGlzYWJsZSB0aGUgdGltZXIgbW9kZSAgICovCiAKLQkJCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkY4MTlFMlVMOworCQl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGODE5RTJVTDsKIAotCQl9IGVsc2UgewotCQkJcHJpbnRrKCJcbiBUaGUgcGFyYW1ldGVyIGZvciBUaW1lci93YXRjaGRvZyBzZWxlY3Rpb24gaXMgaW4gZXJyb3JcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiVGhlIHBhcmFtZXRlciBmb3IgVGltZXIvd2F0Y2hkb2cgc2VsZWN0aW9uIGlzIGluIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCiAJb3V0bCh1aV9Db21tYW5kLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQl1aV9Db21tYW5kID0gMDsKKwogCXVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEaXNhYmxlIHRoZSBoYXJkd2FyZSB0cmlnZ2VyICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBEaXNhYmxlIHRoZSBoYXJkd2FyZSB0cmlnZ2VyICovCiAJdWlfQ29tbWFuZCA9IHVpX0NvbW1hbmQgJiAweEZGRkZGODlGVUw7CiAJaWYgKGRhdGFbNF0gPT0gQURESURBVEFfRU5BQkxFKSB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIAkJLyogU2V0IHRoZSBoYXJkd2FyZSB0cmlnZ2VyIGxldmVsICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kIHwgKGRhdGFbNV0gPDwgNSk7CiAJfQogCW91dGwodWlfQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0JdWlfQ29tbWFuZCA9IDA7CisKIAl1aV9Db21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgZ2F0ZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgZ2F0ZSAqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjg3RlVMOwogCWlmIChkYXRhWzZdID09IEFERElEQVRBX0VOQUJMRSkgewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTZXQgdGhlIGhhcmR3YXJlIGdhdGUgbGV2ZWwgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJCS8qIFNldCB0aGUgaGFyZHdhcmUgZ2F0ZSBsZXZlbCAqLwogCQl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCB8IChkYXRhWzddIDw8IDcpOwogCX0KIAlvdXRsKHVpX0NvbW1hbmQsIGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCXVpX0NvbW1hbmQgPSAwOworCiAJdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgb3V0cHV0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIERpc2FibGUgdGhlIGhhcmR3YXJlIG91dHB1dCAqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjlGQlVMOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNldCB0aGUgaGFyZHdhcmUgb3V0cHV0IGxldmVsICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogU2V0IHRoZSBoYXJkd2FyZSBvdXRwdXQgbGV2ZWwgKi8KIAl1aV9Db21tYW5kID0gdWlfQ29tbWFuZCB8IChkYXRhWzhdIDw8IDIpOwogCW91dGwodWlfQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7CiAJaWYgKGRhdGFbOV0gPT0gQURESURBVEFfRU5BQkxFKSB7Ci0gICAvKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJCS8qIFNldCB0aGUgcmVsb2FkIHZhbHVlICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRsKGRhdGFbMTFdLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAyNCk7Ci0gICAvKioqKioqKioqKioqKioqKioqKioqKi8KKwogCQkvKiBTZXQgdGhlIHRpbWUgdW5pdGUgKi8KLSAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRsKGRhdGFbMTBdLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAyOCk7CiAJfQogCi0JdWlfQ29tbWFuZCA9IDA7CiAJdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCS8qIERpc2FibGUgdGhlIGhhcmR3YXJlIG91dHB1dCAqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjlGN1VMOwotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogCS8qIFNldCB0aGUgaGFyZHdhcmUgb3V0cHV0IGxldmVsICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCXVpX0NvbW1hbmQgPSB1aV9Db21tYW5kIHwgKGRhdGFbMTJdIDw8IDMpOwogCW91dGwodWlfQ29tbWFuZCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLyoqICBFbmFibGUgdGhlIHdhdGNoZG9nIGludGVycnVwdCAgKiovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdWlfQ29tbWFuZCA9IDA7CisKKwkvKiBFbmFibGUgdGhlIHdhdGNoZG9nIGludGVycnVwdCAqLwogCXVpX0NvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFNldCB0aGUgaW50ZXJydXB0IHNlbGVjdGlvbiAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBTZXQgdGhlIGludGVycnVwdCBzZWxlY3Rpb24gKi8KIAl1aV9TdGF0dXMgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxNik7CiAKIAl1aV9Db21tYW5kID0gKHVpX0NvbW1hbmQgJiAweEZGRkZGOUZEVUwpIHwgKGRhdGFbMTNdIDw8IDEpOwpAQCAtMzEwLDgyICsyMzYsNjMgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kwMzVfU3RhcnRTdG9wV3JpdGVUaW1lcldhdGNoZG9nICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogU3RhcnQgLyBTdG9wIFRoZSBTZWxlY3RlZCBUaW1lciAsIG9yIFdhdGNoZG9nICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMF0gOiAwIC0gU3RvcCBTZWxlY3RlZCBUaW1lci9XYXRjaGRvZyAgICAgfAotfAkJCQkJICAgICAgICAgICAgMSAtIFN0YXJ0IFNlbGVjdGVkIFRpbWVyL1dhdGNoZG9nICAgIHwKLXwJCQkJCSAgICAgICAgICAgIDIgLSBUcmlnZ2VyIFNlbGVjdGVkIFRpbWVyL1dhdGNoZG9nICB8Ci18CQkJCQkgICAgICAgICAgICAzIC0gU3RvcCBBbGwgVGltZXIvV2F0Y2hkb2cgICAgICAgICAgfAotfAkJCQkJICAgICAgICAgICAgNCAtIFN0YXJ0IEFsbCBUaW1lci9XYXRjaGRvZyAgICAgICAgIHwKLXwJCQkJCSAgICAgICAgICAgIDUgLSBUcmlnZ2VyIEFsbCBUaW1lci9XYXRjaGRvZyAgICAgICB8Ci18CQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IJCQkgfAotfAkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X1N0YXJ0U3RvcFdyaXRlVGltZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBTdGFydCAvIFN0b3AgVGhlIFNlbGVjdGVkIFRpbWVyICwgb3IgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdCisgKgkwIC0gU3RvcCBTZWxlY3RlZCBUaW1lci9XYXRjaGRvZworICoJMSAtIFN0YXJ0IFNlbGVjdGVkIFRpbWVyL1dhdGNoKmRvZworICoJMiAtIFRyaWdnZXIgU2VsZWN0ZWQgVGltZXIvV2F0Y2hkb2cKKyAqCTMgLSBTdG9wIEFsbCBUaW1lci9XYXRjaGRvZworICoJNCAtIFN0YXJ0IEFsbCBUaW1lci9XYXRjaGRvZworICoJNSAtIFRyaWdnZXIgQWxsIFRpbWVyL1dhdGNoZG9nCisgKi8KK3N0YXRpYyBpbnQgYXBjaTAzNV90aW1lcl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgdWlfQ29tbWFuZCA9IDA7Ci0JaW50IGlfQ291bnQgPSAwOworCXVuc2lnbmVkIGludCB1aV9Db21tYW5kOworCWludCBpX0NvdW50OwogCiAJaWYgKGRhdGFbMF0gPT0gMSkgewogCQl1aV9Db21tYW5kID0KIAkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKiovCisKIAkJLyogU3RhcnQgdGhlIGhhcmR3YXJlICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQl1aV9Db21tYW5kID0gKHVpX0NvbW1hbmQgJiAweEZGRkZGOUZGVUwpIHwgMHgxVUw7CiAJCW91dGwodWlfQ29tbWFuZCwKIAkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCX0JCQkvKiAgaWYgIChkYXRhWzBdPT0xKSAqLworCX0KIAlpZiAoZGF0YVswXSA9PSAyKSB7CiAJCXVpX0NvbW1hbmQgPQogCQkJaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMTIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJCS8qIFNldCB0aGUgdHJpZ2dlciBjb21tYW5kICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCXVpX0NvbW1hbmQgPSAodWlfQ29tbWFuZCAmIDB4RkZGRkY5RkZVTCkgfCAweDIwMFVMOwogCQlvdXRsKHVpX0NvbW1hbmQsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDEyKTsKIAl9CiAKLQlpZiAoZGF0YVswXSA9PSAwKQkvKiBTdG9wIFRoZSBXYXRjaGRvZyAqLwotCXsKKwlpZiAoZGF0YVswXSA9PSAwKSB7CiAJCS8qIFN0b3AgVGhlIFdhdGNoZG9nICovCiAJCXVpX0NvbW1hbmQgPSAwOwotLyoKLSogdWlfQ29tbWFuZCA9IGlubChkZXZwcml2LT5pb2Jhc2UrKChpX1dhdGNoZG9nTmJyLTEpKjMyKSsxMik7Ci0qIHVpX0NvbW1hbmQgPSB1aV9Db21tYW5kICYgMHhGRkZGRjlGRVVMOwotKi8KKwkJLyoKKwkJKiB1aV9Db21tYW5kID0gaW5sKGRldnByaXYtPmlvYmFzZSsoKGlfV2F0Y2hkb2dOYnItMSkqMzIpKzEyKTsKKwkJKiB1aV9Db21tYW5kID0gdWlfQ29tbWFuZCAmIDB4RkZGRkY5RkVVTDsKKwkJKi8KIAkJb3V0bCh1aV9Db21tYW5kLAogCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxMik7Ci0JfQkJCS8qICAgaWYgKGRhdGFbMV09PTApICovCi0JaWYgKGRhdGFbMF0gPT0gMykJLyogc3RvcCBhbGwgV2F0Y2hkb2dzICovCi0JeworCX0KKwlpZiAoZGF0YVswXSA9PSAzKSB7CisJCS8qIHN0b3AgYWxsIFdhdGNoZG9ncyAqLwogCQl1aV9Db21tYW5kID0gMDsKIAkJZm9yIChpX0NvdW50ID0gMTsgaV9Db3VudCA8PSA0OyBpX0NvdW50KyspIHsKLQkJCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykgeworCQkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1dBVENIRE9HKQogCQkJCXVpX0NvbW1hbmQgPSAweDJVTDsKLQkJCX0gZWxzZSB7CisJCQllbHNlCiAJCQkJdWlfQ29tbWFuZCA9IDB4MTBVTDsKLQkJCX0KKwogCQkJaV9XYXRjaGRvZ05iciA9IGlfQ291bnQ7CiAJCQlvdXRsKHVpX0NvbW1hbmQsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKwpAQCAtMzkzLDMwICszMDAsMjkgQEAKIAkJfQogCiAJfQotCWlmIChkYXRhWzBdID09IDQpCS8qIHN0YXJ0IGFsbCBXYXRjaGRvZ3MgKi8KLQl7CisJaWYgKGRhdGFbMF0gPT0gNCkgeworCQkvKiBzdGFydCBhbGwgV2F0Y2hkb2dzICovCiAJCXVpX0NvbW1hbmQgPSAwOwogCQlmb3IgKGlfQ291bnQgPSAxOyBpX0NvdW50IDw9IDQ7IGlfQ291bnQrKykgewotCQkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1dBVENIRE9HKSB7CisJCQlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpCiAJCQkJdWlfQ29tbWFuZCA9IDB4MVVMOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQl1aV9Db21tYW5kID0gMHg4VUw7Ci0JCQl9CisKIAkJCWlfV2F0Y2hkb2dOYnIgPSBpX0NvdW50OwogCQkJb3V0bCh1aV9Db21tYW5kLAogCQkJCWRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsKIAkJCQkwKTsKIAkJfQogCX0KLQlpZiAoZGF0YVswXSA9PSA1KQkvKiB0cmlnZ2VyIGFsbCBXYXRjaGRvZ3MgKi8KLQl7CisJaWYgKGRhdGFbMF0gPT0gNSkgeworCQkvKiB0cmlnZ2VyIGFsbCBXYXRjaGRvZ3MgKi8KIAkJdWlfQ29tbWFuZCA9IDA7CiAJCWZvciAoaV9Db3VudCA9IDE7IGlfQ291bnQgPD0gNDsgaV9Db3VudCsrKSB7Ci0JCQlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKKwkJCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykKIAkJCQl1aV9Db21tYW5kID0gMHg0VUw7Ci0JCQl9IGVsc2UgeworCQkJZWxzZQogCQkJCXVpX0NvbW1hbmQgPSAweDIwVUw7Ci0JCQl9CiAKIAkJCWlfV2F0Y2hkb2dOYnIgPSBpX0NvdW50OwogCQkJb3V0bCh1aV9Db21tYW5kLApAQCAtNDI5LDEwOSArMzM1LDYxIEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMDM1X1JlYWRUaW1lcldhdGNoZG9nICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFJlYWQgVGhlIFNlbGVjdGVkIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgCQkJCQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJZGF0YVswXSAgICAgICAgICAgIDogc29mdHdhcmUgdHJpZ2dlciBzdGF0dXMKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICA6IGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzCi18ICAgICAJICAJICAgICAgICBkYXRhWzJdICAgICAgICAgICAgOiBTb2Z0d2FyZSBjbGVhciBzdGF0dXMKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbM10gICAgICAgICAgICA6IE92ZXJmbG93IHN0YXR1cwotfCAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XSAgICAgICAgICAgIDogVGltZXIgYWN0dWFsIHZhbHVlCi18Ci0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X1JlYWRUaW1lcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWQgVGhlIFNlbGVjdGVkIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gc29mdHdhcmUgdHJpZ2dlciBzdGF0dXMKKyAqIGRhdGFbMV0gaGFyZHdhcmUgdHJpZ2dlciBzdGF0dXMKKyAqIGRhdGFbMl0gU29mdHdhcmUgY2xlYXIgc3RhdHVzCisgKiBkYXRhWzNdIE92ZXJmbG93IHN0YXR1cworICogZGF0YVs0XSBUaW1lciBhY3R1YWwgdmFsdWUKKyAqLworc3RhdGljIGludCBhcGNpMDM1X3RpbWVyX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHVpX1N0YXR1cyA9IDA7CS8qICBTdGF0dXMgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgdWlfU3RhdHVzOwkvKiAgU3RhdHVzIHJlZ2lzdGVyICovCiAKIAlpX1dhdGNoZG9nTmJyID0gaW5zbi0+dW51c2VkWzBdOwogCi0JLyoqKioqKioqKioqKioqKioqKi8KIAkvKiBHZXQgdGhlIHN0YXR1cyAqLwotCS8qKioqKioqKioqKioqKioqKiovCi0KIAl1aV9TdGF0dXMgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAxNik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogR2V0IHRoZSBzb2Z0d2FyZSB0cmlnZ2VyIHN0YXR1cyAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogCWRhdGFbMF0gPSAoKHVpX1N0YXR1cyA+PiAxKSAmIDEpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBHZXQgdGhlIGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRhdGFbMV0gPSAoKHVpX1N0YXR1cyA+PiAyKSAmIDEpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogR2V0IHRoZSBzb2Z0d2FyZSBjbGVhciBzdGF0dXMgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRhdGFbMl0gPSAoKHVpX1N0YXR1cyA+PiAzKSAmIDEpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogR2V0IHRoZSBvdmVyZmxvdyBzdGF0dXMgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWRhdGFbM10gPSAoKHVpX1N0YXR1cyA+PiAwKSAmIDEpOwotCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9USU1FUikgewotCQlkYXRhWzRdID0gaW5sKGRldnByaXYtPmlvYmFzZSArICgoaV9XYXRjaGRvZ05iciAtIDEpICogMzIpICsgMCk7CiAKLQl9CQkJLyogICBpZiAgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9USU1FUikgKi8KKwkvKiBHZXQgdGhlIGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzICovCisJZGF0YVsxXSA9ICgodWlfU3RhdHVzID4+IDIpICYgMSk7CisKKwkvKiBHZXQgdGhlIHNvZnR3YXJlIGNsZWFyIHN0YXR1cyAqLworCWRhdGFbMl0gPSAoKHVpX1N0YXR1cyA+PiAzKSAmIDEpOworCisJLyogR2V0IHRoZSBvdmVyZmxvdyBzdGF0dXMgKi8KKwlkYXRhWzNdID0gKCh1aV9TdGF0dXMgPj4gMCkgJiAxKTsKKwlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfVElNRVIpCisJCWRhdGFbNF0gPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAwKTsKIAogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTAzNV9Db25maWdBbmFsb2dJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIFRoZSBBbmFsb2cgSW5wdXQgU3ViZGV2aWNlICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgICAgIDogU3ViZGV2aWNlIFBvaW50ZXIgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuICAgICAgIDogSW5zbiBTdHJ1Y3R1cmUgUG9pbnRlciAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyIGNvbnRhaW5zICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICAgICAgICAgICAgICAgICAgOiBXYXJuaW5nIGRlbGF5IHZhbHVlCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTAzNV9Db25maWdBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIFRoZSBBbmFsb2cgSW5wdXQgU3ViZGV2aWNlCisgKgorICogZGF0YVswXSBXYXJuaW5nIGRlbGF5IHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgYXBjaTAzNV9haV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKIAlkZXZwcml2LT50c2tfQ3VycmVudCA9IGN1cnJlbnQ7CiAJb3V0bCgweDIwMCB8IDAsIGRldnByaXYtPmlvYmFzZSArIDEyOCArIDB4NCk7CiAJb3V0bCgwLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAwKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEluaXRpYWxpc2UgdGhlIHdhcm5pbmcgdmFsdWUgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIEluaXRpYWxpc2UgdGhlIHdhcm5pbmcgdmFsdWUgKi8KIAlvdXRsKDB4MzAwIHwgMCwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMHg0KTsKIAlvdXRsKChkYXRhWzBdIDw8IDgpLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAwKTsKIAlvdXRsKDB4MjAwMDAwVUwsIGRldnByaXYtPmlvYmFzZSArIDEyOCArIDEyKTsKQEAgLTU0MCwxNDUgKzM5OCw4OCBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTAzNV9SZWFkQW5hbG9nSW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZWFkICB2YWx1ZSAgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwJCQkgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ICAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWlfTm9PZkNoYW5uZWxzICAgIDogTm8gT2YgQ2hhbm5lbHMgVG8gcmVhZCAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLXwJCQkgICAgICAgICAgZGF0YVswXSAgOiBEaWdpdGFsIFZhbHVlIE9mIElucHV0ICAgICAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kwMzVfUmVhZEFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwKKyAqCisgKiBkYXRhWzBdIERpZ2l0YWwgVmFsdWUgT2YgSW5wdXQKKyAqLworc3RhdGljIGludCBhcGNpMDM1X2FpX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHVpX0NvbW1hbmRSZWdpc3RlciA9IDA7CisJdW5zaWduZWQgaW50IHVpX0NvbW1hbmRSZWdpc3RlcjsKIAotLyoqKioqKioqKioqKioqKioqKi8KLS8qICBTZXQgdGhlIHN0YXJ0ICovCi0vKioqKioqKioqKioqKioqKioqLworCS8qICBTZXQgdGhlIHN0YXJ0ICovCiAJdWlfQ29tbWFuZFJlZ2lzdGVyID0gMHg4MDAwMDsKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJLyogV3JpdGUgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGwodWlfQ29tbWFuZFJlZ2lzdGVyLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyA4KTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlYWQgdGhlIGRpZ2l0YWwgdmFsdWUgb2YgdGhlIGlucHV0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFJlYWQgdGhlIGRpZ2l0YWwgdmFsdWUgb2YgdGhlIGlucHV0ICovCiAJZGF0YVswXSA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAyOCk7CiAJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiAgaW50IGlfQVBDSTAzNV9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQkJCSAgICAgfAotfAkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDpSZXNldHMgdGhlIHJlZ2lzdGVycyBvZiB0aGUgY2FyZCAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMDM1X1Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kwMzVfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBpX0NvdW50ID0gMDsKKwlpbnQgaV9Db3VudDsKIAogCWZvciAoaV9Db3VudCA9IDE7IGlfQ291bnQgPD0gNDsgaV9Db3VudCsrKSB7CiAJCWlfV2F0Y2hkb2dOYnIgPSBpX0NvdW50OwotCQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgKChpX1dhdGNoZG9nTmJyIC0gMSkgKiAzMikgKyAwKTsJLyogc3RvcCBhbGwgdGltZXJzICovCisKKwkJLyogc3RvcCBhbGwgdGltZXJzICovCisJCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDApOwogCX0KIAlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTIpOwkvKiBEaXNhYmxlIHRoZSB3YXJuaW5nIGRlbGF5ICovCiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IHN0YXRpYyB2b2lkIHZfQVBDSTAzNV9JbnRlcnJ1cHQJCQkJCSAgICAgfAotfAkJCQkJICAoaW50IGlycSAsIHZvaWQgKmQpICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogSW50ZXJydXB0IHByb2Nlc3NpbmcgUm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IGludCBpcnEgICAgICAgICAgICAgICAgIDogaXJxIG51bWJlciAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZCAgICAgICAgICAgICAgICAgOiB2b2lkIHBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgdm9pZCB2X0FQQ0kwMzVfSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMDM1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQogewogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHVpX1N0YXR1c1JlZ2lzdGVyMSA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX1N0YXR1c1JlZ2lzdGVyMiA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX1JlYWRDb21tYW5kID0gMDsKLQl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbE51bWJlciA9IDA7Ci0JdW5zaWduZWQgaW50IHVpX0RpZ2l0YWxUZW1wZXJhdHVyZSA9IDA7CisJdW5zaWduZWQgaW50IHVpX1N0YXR1c1JlZ2lzdGVyMTsKKwl1bnNpZ25lZCBpbnQgdWlfU3RhdHVzUmVnaXN0ZXIyOworCXVuc2lnbmVkIGludCB1aV9SZWFkQ29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbE51bWJlcjsKKwl1bnNpZ25lZCBpbnQgdWlfRGlnaXRhbFRlbXBlcmF0dXJlOwogCiAJaWYgKGlfVGVtcCA9PSAxKSB7CiAJCWlfV2F0Y2hkb2dOYnIgPSBpX0ZsYWc7CiAJCWlfRmxhZyA9IGlfRmxhZyArIDE7CiAJfQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBvZiB0ZW1wZXJhdHVyZSBXYXJuaW5nICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl1aV9TdGF0dXNSZWdpc3RlcjEgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTYpOwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBmb3IgV2F0Y2hkb2cvdGltZXIgKi8KLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorCS8qIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGVtcGVyYXR1cmUgV2FybmluZyAqLworCXVpX1N0YXR1c1JlZ2lzdGVyMSA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAxNik7CisKKwkvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGZvciBXYXRjaGRvZy90aW1lciAqLwogCXVpX1N0YXR1c1JlZ2lzdGVyMiA9CiAJCWlubChkZXZwcml2LT5pb2Jhc2UgKyAoKGlfV2F0Y2hkb2dOYnIgLSAxKSAqIDMyKSArIDIwKTsKIAotCWlmICgoKCh1aV9TdGF0dXNSZWdpc3RlcjEpICYgMHg4KSA9PSAweDgpKQkvKiBUZXN0IGlmIHdhcm5pbmcgcmVsYXkgaW50ZXJydXB0ICovCi0JewotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFRlc3QgaWYgd2FybmluZyByZWxheSBpbnRlcnJ1cHQgKi8KKwlpZiAoKCgodWlfU3RhdHVzUmVnaXN0ZXIxKSAmIDB4OCkgPT0gMHg4KSkgeworCiAJCS8qIERpc2FibGUgdGhlIHRlbXBlcmF0dXJlIHdhcm5pbmcgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJdWlfUmVhZENvbW1hbmQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgMTIpOwogCQl1aV9SZWFkQ29tbWFuZCA9IHVpX1JlYWRDb21tYW5kICYgMHhGRkRGMDAwMFVMOwogCQlvdXRsKHVpX1JlYWRDb21tYW5kLCBkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyAxMik7Ci0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkvKiBSZWFkIHRoZSBjaGFubmVsIG51bWJlciAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJdWlfQ2hhbm5lbE51bWJlciA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyA2MCk7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkvKiBSZWFkIHRoZSBkaWdpdGFsIHRlbXBlcmF0dXJlIHZhbHVlICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQl1aV9EaWdpdGFsVGVtcGVyYXR1cmUgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgNjApOwotCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwkvKiAgc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLwotCX0JCQkvKiBpZiAoKCh1aV9TdGF0dXNSZWdpc3RlcjEgJiAweDgpID09IDB4OCkpICovCiAKLQllbHNlIHsKLQkJaWYgKCh1aV9TdGF0dXNSZWdpc3RlcjIgJiAweDEpID09IDB4MSkgewotCQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsJLyogIHNlbmQgc2lnbmFsIHRvIHRoZSBzYW1wbGUgKi8KLQkJfQotCX0JCQkvKiBlbHNlIGlmICgoKHVpX1N0YXR1c1JlZ2lzdGVyMSAmIDB4OCkgPT0gMHg4KSkgKi8KKwkJLyogUmVhZCB0aGUgY2hhbm5lbCBudW1iZXIgKi8KKwkJdWlfQ2hhbm5lbE51bWJlciA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyAxMjggKyA2MCk7CisKKwkJLyogUmVhZCB0aGUgZGlnaXRhbCB0ZW1wZXJhdHVyZSB2YWx1ZSAqLworCQl1aV9EaWdpdGFsVGVtcGVyYXR1cmUgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgMTI4ICsgNjApOworCisJCS8qICBzZW5kIHNpZ25hbCB0byB0aGUgc2FtcGxlICovCisJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CisKKwl9IGVsc2UgaWYgKCh1aV9TdGF0dXNSZWdpc3RlcjIgJiAweDEpID09IDB4MSkgeworCQkvKiAgc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLworCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOworCX0KIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwppbmRleCAwNTQ5MTA1Li5hNjMzOTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCkBAIC0xLDQ4ICsxLDI1IEBACi0vKioKLUB2ZXJiYXRpbQotCi1Db3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgQURESS1EQVRBIEdtYkggZm9yIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIG1vZHVsZS4KLQotCUFEREktREFUQSBHbWJICi0JRGllc2Vsc3RyYXNzZSAzCi0JRC03NzgzMyBPdHRlcnN3ZWllcgotCVRlbDogKzE5KDApNzIyMy85NDkzLTAKLQlGYXg6ICs0OSgwKTcyMjMvOTQ5My05MgotCWh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbQotCWluZm9AYWRkaS1kYXRhLmNvbQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLUBlbmR2ZXJiYXRpbQotKi8KIC8qCi0KLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IChDKSBBRERJLURBVEEgR21iSCAgICAgICAgICBEaWVzZWxzdHJhw59lIDMgICAgICAgRC03NzgzMyBPdHRlcnN3ZWllciAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgVGVsIDogKzQ5ICgwKSA3MjIzLzk0OTMtMCAgICAgfCBlbWFpbCAgICA6IGluZm9AYWRkaS1kYXRhLmNvbSAgICAgICAgIHwKLSAgfCBGYXggOiArNDkgKDApIDcyMjMvOTQ5My05MiAgICB8IEludGVybmV0IDogaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCAgICAgOiBBUENJLTE1MDAgICAgICAgfCBDb21waWxlciAgIDogR0NDICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCBNb2R1bGUgbmFtZSA6IGh3ZHJ2X2FwY2kxNTAwLmN8IFZlcnNpb24gICAgOiAyLjk2ICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUHJvamVjdCBtYW5hZ2VyOiBFcmljIFN0b2x6ICAgfCBEYXRlICAgICAgIDogIDAyLzEyLzIwMDIgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IERlc2NyaXB0aW9uIDogICBIYXJkd2FyZSBMYXllciBBY2Nlc3MgRm9yIEFQQ0ktMTUwMCAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICBEYXRlICAgfCAgIEF1dGhvciAgfCAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB1cGRhdGVzICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0vKioqKioqKioqICAgICAgRGVmaW5pdGlvbnMgZm9yIEFQQ0ktMTUwMCBjYXJkICAqKioqKi8KKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBBRERJLURBVEEgR21iSCBmb3IgdGhlIHNvdXJjZSBjb2RlIG9mIHRoaXMgbW9kdWxlLgorICoKKyAqCUFEREktREFUQSBHbWJICisgKglEaWVzZWxzdHJhc3NlIDMKKyAqCUQtNzc4MzMgT3R0ZXJzd2VpZXIKKyAqCVRlbDogKzE5KDApNzIyMy85NDkzLTAKKyAqCUZheDogKzQ5KDApNzIyMy85NDkzLTkyCisgKglodHRwOi8vd3d3LmFkZGktZGF0YS5jb20KKyAqCWluZm9AYWRkaS1kYXRhLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqLwogCiAvKiBDYXJkIFNwZWNpZmljIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIEFQQ0kxNTAwX0FERFJFU1NfUkFOR0UJCTQKQEAgLTE0MSw5OSArMTE4LDQ1IEBACiAJQVBDSTE1MDBfUldfUE9SVF9CX1BBVFRFUk5fTUFTSwogfTsKIAotc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjFJbml0ID0gMDsKLXN0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIySW5pdCA9IDA7Ci1zdGF0aWMgaW50IGlfV2F0Y2hkb2dDb3VudGVyM0luaXQgPSAwOwotc3RhdGljIGludCBpX0V2ZW50MVN0YXR1cyA9IDAsIGlfRXZlbnQyU3RhdHVzID0gMDsKLXN0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXJXYXRjaGRvZ0ludGVycnVwdCA9IDA7Ci1zdGF0aWMgaW50IGlfTG9naWMgPSAwLCBpX0NvdW50ZXJMb2dpYyA9IDA7Ci1zdGF0aWMgaW50IGlfSW50ZXJydXB0TWFzayA9IDA7Ci1zdGF0aWMgaW50IGlfSW5wdXRDaGFubmVsID0gMDsKLXN0YXRpYyBpbnQgaV9UaW1lckNvdW50ZXIxRW5hYmxlZCA9IDAsIGlfVGltZXJDb3VudGVyMkVuYWJsZWQgPSAwLAotCSAgIGlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAwOworc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjFJbml0Oworc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjJJbml0Oworc3RhdGljIGludCBpX1dhdGNoZG9nQ291bnRlcjNJbml0Oworc3RhdGljIGludCBpX0V2ZW50MVN0YXR1cywgaV9FdmVudDJTdGF0dXM7CitzdGF0aWMgaW50IGlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQ7CitzdGF0aWMgaW50IGlfTG9naWMsIGlfQ291bnRlckxvZ2ljOworc3RhdGljIGludCBpX0ludGVycnVwdE1hc2s7CitzdGF0aWMgaW50IGlfSW5wdXRDaGFubmVsOworc3RhdGljIGludCBpX1RpbWVyQ291bnRlcjFFbmFibGVkLCBpX1RpbWVyQ291bnRlcjJFbmFibGVkLAorCSAgIGlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQ7CiAKIC8qCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX0NvbmZpZ0RpZ2l0YWxJbnB1dEV2ZW50ICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQW4gZXZlbnQgY2FuIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBwb3J0LiAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgZXZlbnQgaXMgcmVsYXRlZCB0byB0aGUgZmlyc3QgOCBjaGFubmVscyAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIChwb3J0IDEpIGFuZCB0aGUgc2Vjb25kIHRvIHRoZSBmb2xsb3dpbmcgNiBjaGFubmVscyAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgKHBvcnQgMikuIEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBvbmUgb3IgYm90aCAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBldmVudHMgaGF2ZSBvY2N1cnJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgZGF0YVswXSAgICAgICAgICAgIDpOdW1iZXIgb2YgdGhlIGlucHV0IHBvcnQgb24gICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBldmVudCB3aWxsIHRha2UgcGxhY2UgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgb3IgMikKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgICAgICAgICAgIDogVGhlIGV2ZW50IGxvZ2ljIGZvciBwb3J0IDEgaGFzICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHBvc3NpYmlsaXRpZXMgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MCAgQVBDSTE1MDBfQU5EICAgICAgIDpUaGlzIGxvZ2ljICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0cyAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIEFORCB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljLiAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIEFQQ0kxNTAwX09SICAgICAgICA6VGhpcyBsb2dpYyAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rcyAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dHMgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBsb2dpYy4gICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICBBUENJMTUwMF9PUl9QUklPUklUWSAgICAgICAgfAotfAkJCQkJCQkJOlRoaXMgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3MgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXRzICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBsb2dpYy4gICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0IDEgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIHRoZSAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoZXN0ICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgYW5kICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCAgIDggICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzbWFsbGVzdHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgc2Vjb25kIHBvcnQgdGhlIHVzZXIgaGFzfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBwb3NzaWJpbGl0eTogICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUENJMTUwMF9PUiAgICAgICAgOlRoaXMgbG9naWMgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3MgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXRzICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBsb2dpYyAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSAgICAgICAgICAgICAgOiBUaGVzZSA4LWNoYXJhY3RlciB3b3JkIGZvciBwb3J0MXwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCA2LWNoYXJhY3RlciB3b3JkIGZvciBwb3J0IDIgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZSB0aGUgbWFzayBvZiB0aGUgZXZlbnQuICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYWNoIHBsYWNlIGdpdmVzIHRoZSBzdGF0ZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBpbnB1dCBjaGFubmVscyBhbmQgY2FuICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBvbmUgb2YgdGhlc2Ugc2l4IGNoYXJhY3RlcnN8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgOiBUaGlzIGlucHV0IG11c3QgYmUgb24gMCAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICA6IFRoaXMgaW5wdXQgbXVzdCBiZSBvbiAxICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIDogVGhpcyBpbnB1dCByZWFjdHMgdG8gICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGZhbGxpbmcgZWRnZSAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICA6IFRoaXMgaW5wdXQgcmVhY3RzIHRvIGEgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlzaW5nIGVkZ2UgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgOiBUaGlzIGlucHV0IHJlYWN0cyB0byBib3RoIGVkZ2VzIHwKLXwKLXwJCQkJCQkJCTUgIDogVGhpcyBpbnB1dCBpcyBub3QgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBldmVudCAgIAkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9Db25maWdEaWdpdGFsSW5wdXRFdmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBBbiBldmVudCBjYW4gYmUgZ2VuZXJhdGVkIGZvciBlYWNoIHBvcnQuIFRoZSBmaXJzdCBldmVudCBpcyByZWxhdGVkIHRvIHRoZQorICogZmlyc3QgOCBjaGFubmVscyAocG9ydCAxKSBhbmQgdGhlIHNlY29uZCB0byB0aGUgZm9sbG93aW5nIDYgY2hhbm5lbHMgKHBvcnQgMikKKyAqIEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBvbmUgb3IgYm90aCBldmVudHMgaGF2ZSBvY2N1cnJlZC4KKyAqCisgKiBkYXRhWzBdIE51bWJlciBvZiB0aGUgaW5wdXQgcG9ydCBvbiB3aGljaCB0aGUgZXZlbnQgd2lsbCB0YWtlIHBsYWNlICgxIG9yIDIpCisgKiBkYXRhWzFdIFRoZSBldmVudCBsb2dpYyBmb3IgcG9ydCAxIGhhcyB0aHJlZSBwb3NzaWJpbGl0aWVzOgorICoJQVBDSTE1MDBfQU5ECQlUaGlzIGxvZ2ljIGxpbmtzIHRoZSBpbnB1dHMgd2l0aCBhbiBBTkQgbG9naWMuCisgKglBUENJMTUwMF9PUgkJVGhpcyBsb2dpYyBsaW5rcyB0aGUgaW5wdXRzIHdpdGggYSBPUiBsb2dpYy4KKyAqCUFQQ0kxNTAwX09SX1BSSU9SSVRZCVRoaXMgbG9naWMgbGlua3MgdGhlIGlucHV0cyB3aXRoIGEgcHJpb3JpdHkgT1IKKyAqCQkJCWxvZ2ljLiBJbnB1dCAxIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBsZXZlbAorICoJCQkJYW5kIGlucHV0IDggdGhlCXNtYWxsZXN0LgorICoJRm9yIHRoZSBzZWNvbmQgcG9ydCB0aGUgdXNlciBoYXMgMSBwb3NzaWJpbGl0eToKKyAqCUFQQ0kxNTAwX09SCVRoaXMgbG9naWMgbGlua3MgdGhlIGlucHV0cyB3aXRoIGEgcG9sYXJpdHkgT1IgbG9naWMKKyAqIGRhdGFbMl0gVGhlc2UgOC1jaGFyYWN0ZXIgd29yZCBmb3IgcG9ydDEgYW5kIDYtY2hhcmFjdGVyIHdvcmQgZm9yIHBvcnQgMgorICoJICAgZ2l2ZSB0aGUgbWFzayBvZiB0aGUgZXZlbnQuIEVhY2ggcGxhY2UgZ2l2ZXMgdGhlIHN0YXRlIG9mIHRoZSBpbnB1dAorICoJICAgY2hhbm5lbHMgYW5kIGNhbiBoYXZlIG9uZSBvZiB0aGVzZSBzaXggY2hhcmFjdGVycworICoJMCBUaGlzIGlucHV0IG11c3QgYmUgb24gMAorICoJMSBUaGlzIGlucHV0IG11c3QgYmUgb24gMQorICoJMiBUaGlzIGlucHV0IHJlYWN0cyB0byBhIGZhbGxpbmcgZWRnZQorICoJMyBUaGlzIGlucHV0IHJlYWN0cyB0byBhIHJpc2luZyBlZGdlCisgKgk0IFRoaXMgaW5wdXQgcmVhY3RzIHRvIGJvdGggZWRnZXMKKyAqCTUgVGhpcyBpbnB1dCBpcyBub3QgdXNlZCBmb3IgZXZlbnQKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF9kaV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfUGF0dGVyblBvbGFyaXR5ID0gMCwgaV9QYXR0ZXJuVHJhbnNpdGlvbiA9IDAsIGlfUGF0dGVybk1hc2sgPSAwOwpAQCAtMjQxLDE0ICsxNjQsMTAgQEAKIAlpbnQgaV9QYXR0ZXJuVHJhbnNpdGlvbkNvdW50ID0gMCwgaV9SZWdWYWx1ZTsKIAlpbnQgaTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBEaXNhYmxlcyAgdGhlIG1haW4gaW50ZXJydXB0IG9uIHRoZSBib2FyZCAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweDAwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAogCWlmIChkYXRhWzBdID09IDEpIHsKQEAgLTI1OSw3ICsxNzgsOCBAQAogCQkJaV9NYXhDaGFubmVsID0gNjsKIAkJfQkJLyogIGlmKGRhdGFbMF09PTIpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgcG9ydCBldmVudCAgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBzcGVjaWZpZWQgcG9ydCBldmVudCBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZihkYXRhWzBdPT0yKSAqLwogCX0JCQkvKiBlbHNlICBpZiAoZGF0YVswXSA9PSAxKSAqLwpAQCAtMjc0LDcgKzE5NCw4IEBACiAJCWRhdGFbMV0gPSBBUENJMTUwMF9PUl9QUklPUklUWTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiVGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgbG9naWMgZG9lcyBub3QgZXhpc3RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CQkJLyogc3dpdGNoKGRhdGFbMV0pOyAqLwogCkBAIC0zMTgsMzcgKzIzOSwzMCBAQAogCQljYXNlIDU6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGUgb3B0aW9uIGluZGljYXRlZCBpbiB0aGUgZXZlbnQgbWFzayBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIG9wdGlvbiBpbmRpY2F0ZWQgaW4gdGhlIGV2ZW50IG1hc2sgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goaV9FdmVudE1hc2spICovCiAJfQkJCS8qIGZvciAoaV9Db3VudCA9IGlfTWF4Q2hhbm5lbDsgaV9Db3VudCA+MDtpX0NvdW50IC0tKSAqLwogCiAJaWYgKGRhdGFbMF0gPT0gMSkgewotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIGludGVycnVwdCBsb2dpYyAqLwotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfQU5EIHx8CiAJCQlkYXRhWzFdID09IEFQQ0kxNTAwX09SIHx8CiAJCQlkYXRhWzFdID09IEFQQ0kxNTAwX09SX1BSSU9SSVRZKSB7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBUZXN0cyBpZiBhIHRyYW5zaXRpb24gd2FzIGRlY2xhcmVkICovCiAJCQkvKiBmb3IgYSBPUiBQUklPUklUWSBsb2dpYyAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkYXRhWzFdID09IEFQQ0kxNTAwX09SX1BSSU9SSVRZCiAJCQkJJiYgaV9QYXR0ZXJuVHJhbnNpdGlvbiAhPSAwKSB7Ci0JCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkJLyogVHJhbnNpdGlvbiBlcnJvciBvbiBhbiBPUiBQUklPUklUWSBsb2dpYyAqLwotCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJCXByaW50aygiXG5UcmFuc2l0aW9uIGVycm9yIG9uIGFuIE9SIFBSSU9SSVRZIGxvZ2ljXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIlRyYW5zaXRpb24gZXJyb3Igb24gYW4gT1IgUFJJT1JJVFkgbG9naWNcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQkvKiAgaWYgKGRhdGFbMV09PSBBUENJMTUwMF9PUl9QUklPUklUWSAmJiBpX1BhdHRlcm5UcmFuc2l0aW9uICE9IDApICovCiAKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogVGVzdHMgaWYgbW9yZSB0aGFuIG9uZSB0cmFuc2l0aW9uICovCiAJCQkvKiB3YXMgZGVjbGFyZWQgZm9yIGFuIEFORCBsb2dpYyAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGF0YVsxXSA9PSBBUENJMTUwMF9BTkQpIHsKIAkJCQlmb3IgKGlfQ291bnQgPSAwOyBpX0NvdW50IDwgODsgaV9Db3VudCsrKSB7CkBAIC0zNjAsMjkgKzI3NCwyMSBAQAogCQkJCX0JLyogZm9yIChpX0NvdW50ID0gMDsgaV9Db3VudCA8IDg7IGlfQ291bnQrKykgKi8KIAogCQkJCWlmIChpX1BhdHRlcm5UcmFuc2l0aW9uQ291bnQgPiAxKSB7Ci0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCQkJLyogVHJhbnNpdGlvbiBlcnJvciBvbiBhbiBBTkQgbG9naWMgICAgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCQkJcHJpbnRrKCJcbiBUcmFuc2l0aW9uIGVycm9yIG9uIGFuIEFORCBsb2dpY1xuIik7CisJCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkJIlRyYW5zaXRpb24gZXJyb3Igb24gYW4gQU5EIGxvZ2ljXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQkvKiAgaWYgKGlfUGF0dGVyblRyYW5zaXRpb25Db3VudCA+IDEpICovCiAJCQl9CS8qICBpZiAoZGF0YVsxXT09IEFQQ0kxNTAwX0FORCkgKi8KIAotCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCS8qKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEaXNhYmxlIFBvcnQgQSAqLwotCQkJICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKDB4RjAsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCAxICAgICovCi0JCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9QQVRURVJOX1BPTEFSSVRZLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0zOTAsMjAgKzI5NiwxNiBAQAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIG1hc2sgcmVnaXN0ZXIgb2YgICAgICAqLwogCQkJLyogcG9ydCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfUEFUVEVSTl9NQVNLLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQlvdXRiKGlfUGF0dGVybk1hc2ssCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIHBhdHRlcm4gdHJhbnNpdGlvbiByZWdpc3RlciAgKi8KIAkJCS8qIG9mIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9QQVRURVJOX1RSQU5TSVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTQxMSwxMCArMzEzLDggQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gbWFzayAgICAqLwogCQkJLyogcmVnaXN0ZXIgb2YgcG9ydCAxICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTQyMiwxNyArMzIyLDEzIEBACiAJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAgICovCiAJCQkvKiByZWdpc3RlciBvZiBwb3J0IDEgICAgICAgICAgICAgICAgICAgICAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfU1BFQ0lGSUNBVElPTiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogUG9ydCBBIG5ldyBtb2RlICAgICovCi0JCQkgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweEY5KSB8IGRhdGFbMV0gfCAweDk7CiAJCQlvdXRiKGlfUmVnVmFsdWUsCkBAIC00NDEsNTMgKzMzNyw0MCBAQAogCiAJCQlpX0V2ZW50MVN0YXR1cyA9IDE7CiAKLQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkvKiBFbmFibGUgUG9ydCBBICovCi0JCQkgIC8qKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoMHhGNCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCiAJCX0JCS8qICBpZihkYXRhWzFdPT1BUENJMTUwMF9BTkR8fGRhdGFbMV09PUFQQ0kxNTAwX09SfHxkYXRhWzFdPT1BUENJMTUwMF9PUl9QUklPUklUWSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuVGhlIGNob2ljZSBmb3IgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGUgY2hvaWNlIGZvciBpbnRlcnJ1cHQgbG9naWMgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBlbHNlIH0vLyBpZihkYXRhWzFdPT1BUENJMTUwMF9BTkR8fGRhdGFbMV09PUFQQ0kxNTAwX09SfHxkYXRhWzFdPT1BUENJMTUwMF9PUl9QUklPUklUWSkgKi8KIAl9CQkJLyogICAgaWYgKGRhdGFbMF09PSAxKSAqLwogCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFRlc3QgaWYgZXZlbnQgc2V0dGluZyBmb3IgcG9ydCAyICovCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaWYgKGRhdGFbMF0gPT0gMikgewotCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdCB0aGUgZXZlbnQgbG9naWMgKi8KLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfT1IpIHsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERpc2FibGUgUG9ydCBCICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YigweDc0LAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAqLwogCQkJLyogcmVnaXN0ZXIgb2YgcG9ydCBCICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTQ5NSwxMCArMzc4LDggQEAKIAkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiBtYXNrICAgICovCiAJCQkvKiByZWdpc3RlciBvZiBwb3J0IEIgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1NQRUNJRklDQVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTUwNywzNyArMzg4LDI5IEBACiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIGVycm9yIGNoYW5uZWxzIDEgYW5kIDIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpX1BhdHRlcm5NYXNrID0gKGlfUGF0dGVybk1hc2sgfCAweEMwKTsKIAkJCWlfUGF0dGVyblBvbGFyaXR5ID0gKGlfUGF0dGVyblBvbGFyaXR5IHwgMHhDMCk7CiAJCQlpX1BhdHRlcm5UcmFuc2l0aW9uID0gKGlfUGF0dGVyblRyYW5zaXRpb24gfCAweEMwKTsKIAotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwb2xhcml0eSByZWdpc3RlciBvZiBwb3J0IDIgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfUEFUVEVSTl9QT0xBUklUWSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJb3V0YihpX1BhdHRlcm5Qb2xhcml0eSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIHRyYW5zaXRpb24gcmVnaXN0ZXIgICAgKi8KIAkJCS8qIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX1RSQU5TSVRJT04sCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCW91dGIoaV9QYXR0ZXJuVHJhbnNpdGlvbiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIE1hc2sgcmVnaXN0ZXIgICAgKi8KIAkJCS8qIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1BBVFRFUk5fTUFTSywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwpAQCAtNTQ2LDIwICs0MTksMTYgQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIG1hc2sgICAgKi8KIAkJCS8qIHJlZ2lzdGVyIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJaV9SZWdWYWx1ZSA9CiAJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIG1hc2sgICAgKi8KIAkJCS8qIHJlZ2lzdGVyIG9mIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtNTY5LDIzICs0MzgsMjAgQEAKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAogCQkJaV9FdmVudDJTdGF0dXMgPSAxOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCS8qIEVuYWJsZSBQb3J0IEIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAogCQkJb3V0YigweEY0LAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCX0JCS8qICAgaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfT1IpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBjaG9pY2UgZm9yIGludGVycnVwdCBsb2dpYyBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIGNob2ljZSBmb3IgaW50ZXJydXB0IGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlaWYgKGRhdGFbMV0gPT0gQVBDSTE1MDBfT1IpICovCiAJfQkJCS8qIGlmKGRhdGFbMF09PTIpICovCkBAIC01OTQsMzEgKzQ2MCwxNSBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfU3RhcnRTdG9wSW5wdXRFdmVudCAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiAgQWxsb3dzIG9yIGRpc2FsbG93cyBhIHBvcnQgZXZlbnQgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1aV9DaGFubmVsIDogQ2hhbm5lbCBudW1iZXIgdG8gcmVhZCAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyIHRvIHJlYWQgc3RhdHVzICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gICAgICAgICAgICAgICAgIDowIFN0YXJ0IGlucHV0IGV2ZW50Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIFN0b3AgaW5wdXQgZXZlbnQKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgICAgICAgICAgICAgICAgOk5vIG9mIHBvcnQgKDEgb3IgMikKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1MDBfU3RhcnRTdG9wSW5wdXRFdmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBBbGxvd3Mgb3IgZGlzYWxsb3dzIGEgcG9ydCBldmVudAorICoKKyAqIGRhdGFbMF0gMCA9IFN0YXJ0IGlucHV0IGV2ZW50LCAxID0gU3RvcCBpbnB1dCBldmVudAorICogZGF0YVsxXSBOdW1iZXIgb2YgcG9ydCAoMSBvciAyKQorICovCitzdGF0aWMgaW50IGFwY2kxNTAwX2RpX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBpX0V2ZW50MUludGVycnVwdFN0YXR1cyA9IDAsIGlfRXZlbnQySW50ZXJydXB0U3RhdHVzID0KQEAgLTYyNiw0OCArNDc2LDMwIEBACiAKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIFNUQVJUOgotCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBUZXN0cyB0aGUgcG9ydCBudW1iZXIgKi8KLQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoZGF0YVsxXSA9PSAxIHx8IGRhdGFbMV0gPT0gMikgewotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBUZXN0IGlmIHBvcnQgMSBzZWxlY3RlZCAqLwotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkYXRhWzFdID09IDEpIHsKLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUZXN0IGlmIGV2ZW50IGluaXRpYWxpc2VkICovCi0JCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJaWYgKGlfRXZlbnQxU3RhdHVzID09IDEpIHsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSBQb3J0IEEgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiAgICAgICovCiAJCQkJCS8qIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEFsbG93cyB0aGUgcGF0dGVybiBpbnRlcnJ1cHQgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhDMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBFbmFibGUgUG9ydCBBICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGNCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTY4MCwxODUgKzUxMiwxNDIgQEAKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCiAJCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBBdXRob3JpemVzIHRoZSBtYWluIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RDAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKIAkJCQl9CS8qICBpZihpX0V2ZW50MVN0YXR1cz09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbkV2ZW50IDEgbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiRXZlbnQgMSBub3QgaW5pdGlhbGlzZWRcbiIpOwogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CS8qIGVsc2UgaWYoaV9FdmVudDFTdGF0dXM9PTEpICovCiAJCQl9CS8qIGlmIChkYXRhWzFdPT0xKSAqLwogCQkJaWYgKGRhdGFbMV0gPT0gMikgewogCiAJCQkJaWYgKGlfRXZlbnQyU3RhdHVzID09IDEpIHsKLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBEaXNhYmxlIFBvcnQgQiAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweDc0LAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mICAgICAgKi8KIAkJCQkJLyogcG9ydCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogQWxsb3dzIHRoZSBwYXR0ZXJuIGludGVycnVwdCAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEMwLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEVuYWJsZSBQb3J0IEIgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEY0LAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCiAJCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBBdXRob3JpemVzIHRoZSBtYWluIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4RDAsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQkJCWlfRXZlbnQySW50ZXJydXB0U3RhdHVzID0gMTsKIAkJCQl9CS8qICBpZihpX0V2ZW50MlN0YXR1cz09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbkV2ZW50IDIgbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiRXZlbnQgMiBub3QgaW5pdGlhbGlzZWRcbiIpOwogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CS8qIGVsc2UgaWYoaV9FdmVudDJTdGF0dXM9PTEpICovCiAJCQl9CS8qICBpZihkYXRhWzFdPT0yKSAqLwogCQl9CQkvKiAgaWYgKGRhdGFbMV0gPT0gMSB8fCBkYXRhWzBdID09IDIpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBwb3J0IHBhcmFtZXRlciBpcyBpbiBlcnJvclxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHBvcnQgcGFyYW1ldGVyIGlzIGluIGVycm9yXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlIGlmIChkYXRhWzFdID09IDEgfHwgZGF0YVswXSA9PSAyKSAqLwogCiAJCWJyZWFrOwogCiAJY2FzZSBTVE9QOgotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBUZXN0cyB0aGUgcG9ydCBudW1iZXIgKi8KLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoZGF0YVsxXSA9PSAxIHx8IGRhdGFbMV0gPT0gMikgewotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBUZXN0IGlmIHBvcnQgMSBzZWxlY3RlZCAqLwotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkYXRhWzFdID09IDEpIHsKLQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUZXN0IGlmIGV2ZW50IGluaXRpYWxpc2VkICovCi0JCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJaWYgKGlfRXZlbnQxU3RhdHVzID09IDEpIHsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSBQb3J0IEEgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiAgICAgICovCiAJCQkJCS8qIHBvcnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEluaGliaXRzIHRoZSBwYXR0ZXJuIGludGVycnVwdCAgICAgICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEUwLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MIHJlZ2lzdGVyICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIEVuYWJsZSBQb3J0IEEgKi8KLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YigweEY0LAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJCQlpX0V2ZW50MUludGVycnVwdFN0YXR1cyA9IDA7CiAJCQkJfQkvKiAgaWYoaV9FdmVudDFTdGF0dXM9PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCXByaW50aygiXG5FdmVudCAxIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkJIkV2ZW50IDEgbm90IGluaXRpYWxpc2VkXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQkvKiBlbHNlIGlmKGlfRXZlbnQxU3RhdHVzPT0xKSAqLwogCQkJfQkvKiBpZiAoZGF0YVsxXT09MSkgKi8KIAkJCWlmIChkYXRhWzFdID09IDIpIHsKLQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVGVzdCBpZiBldmVudCBpbml0aWFsaXNlZCAqLwotCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlpZiAoaV9FdmVudDJTdGF0dXMgPT0gMSkgewotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBEaXNhYmxlIFBvcnQgQiAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4NzQsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiAgICAgICovCiAJCQkJCS8qIHBvcnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfQ09NTUFORF9BTkRfU1RBVFVTLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBJbmhpYml0cyB0aGUgcGF0dGVybiBpbnRlcnJ1cHQgICAgICAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhFMCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCByZWdpc3RlciAqLwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkgICAgICAgLyoqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBFbmFibGUgUG9ydCBCICovCi0JCSAgICAgICAvKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoMHhGNCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCQkJaV9FdmVudDJJbnRlcnJ1cHRTdGF0dXMgPSAwOwogCQkJCX0JLyogIGlmKGlfRXZlbnQyU3RhdHVzPT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQlwcmludGsoIlxuRXZlbnQgMiBub3QgaW5pdGlhbGlzZWRcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJFdmVudCAyIG5vdCBpbml0aWFsaXNlZFxuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0JLyogZWxzZSBpZihpX0V2ZW50MlN0YXR1cz09MSkgKi8KIAkJCX0JLyogaWYoZGF0YVsxXT09MikgKi8KIAogCQl9CQkvKiAgaWYgKGRhdGFbMV0gPT0gMSB8fCBkYXRhWzFdID09IDIpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBwb3J0IHBhcmFtZXRlciBpcyBpbiBlcnJvclxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHBvcnQgcGFyYW1ldGVyIGlzIGluIGVycm9yXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlIGlmIChkYXRhWzFdID09IDEgfHwgZGF0YVsxXSA9PSAyKSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIlxuVGhlIG9wdGlvbiBvZiBTVEFSVC9TVE9QIGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiVGhlIG9wdGlvbiBvZiBTVEFSVC9TVE9QIGxvZ2ljIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIHN3aXRjaChkYXRhWzBdKSAqLwogCkBAIC04NjYsMzUgKzY1NSwxNyBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfSW5pdGlhbGlzYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgZGlnaXRhbCBpbnB1dCAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1aV9DaGFubmVsIDogQ2hhbm5lbCBudW1iZXIgdG8gcmVhZCAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhICAgICAgICAgIDogRGF0YSBQb2ludGVyIHRvIHJlYWQgc3RhdHVzICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX0luaXRpYWxpc2F0aW9uKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBkaWdpdGFsIGlucHV0CisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfZGlfcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaV9EdW1teVJlYWQgPSAwOwogCi0gICAgLyoqKioqKioqKioqKioqKioqKi8KIAkvKiBTb2Z0d2FyZSByZXNldCAqLwotICAgIC8qKioqKioqKioqKioqKioqKiovCiAJaV9EdW1teVJlYWQgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlpX0R1bW15UmVhZCA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTkwMiwxNiArNjczLDEyIEBACiAJb3V0YigxLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBjb25maWd1cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKDB4RjQsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiByZWdpc3RlciBvZiBwb3J0IEEgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweDEwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTk0Myw5ICs3MTAsNyBAQAogCS8qIERlbGV0ZXMgdGhlIHJlZ2lzdGVyICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweDEwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTk3NSw5ICs3NDAsNyBAQAogCS8qIERlbGV0ZXMgdGhlIHJlZ2lzdGVyICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBkYXRhIHBhdGggcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCBDICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9DX0RBVEFfUENJVENIX1BPTEFSSVRZLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBIaWdoIGxldmVsIG9mIHBvcnQgQyBtZWFucyAxICovCkBAIC05OTIsOSArNzU1LDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBpdCAqLwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMSAqLwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIElQIGFuZCBJVVMgKi8KQEAgLTEwMDQsOSArNzY1LDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVhY3RpdmF0ZXMgdGhlIGludGVycnVwdCBtYW5hZ2VtZW50IG9mIHRpbWVyIDEgICAgICAgICAqLwogCW91dGIoMHhFMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMiAqLwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWxldGVzIElQIGFuZCBJVVMgKi8KQEAgLTEwMTYsOSArNzc1LDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVhY3RpdmF0ZXMgVGltZXIgMiBpbnRlcnJ1cHQgbWFuYWdlbWVudDogICAgICAgICAgICAgICAqLwogCW91dGIoMHhFMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAzICovCi0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0xMDI4LDkgKzc4NSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlYWN0aXZhdGVzIGludGVycnVwdCBtYW5hZ2VtZW50IG9mIHRpbWVyIDM6ICAgICAgICAgICAgKi8KIAlvdXRiKDB4RTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgYWxsIGludGVycnVwdHMgKi8KQEAgLTEwNTEsMzcgKzgwNiwxNSBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfQ29uZmlnRGlnaXRhbE91dHB1dEVycm9ySW50ZXJydXB0Ci18ICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzIHN0cnVjdCBjb21lZGlfaW5zbgotfCAgICAgICAgICAgICAgICAgICAgICAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIHRoZSBkaWdpdGFsIG91dHB1dCBtZW1vcnkgYW5kIHRoZSBkaWdpdGFsCi18ICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBlcnJvciBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICA6cG9pbnRlciB0byBzdWJkZXZpY2Ugc3RydWN0dXJlCi18ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMF0gIDoxOk1lbW9yeSBvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICAgICAgICAgICAgMDpNZW1vcnkgb2ZmICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdICA6MSBFbmFibGUgdGhlIHZvbHRhZ2UgZXJyb3IgaW50ZXJydXB0Ci18CQkJCQkJCSAgIDowIERpc2FibGUgdGhlIHZvbHRhZ2UgZXJyb3IgaW50ZXJydXB0IAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX0NvbmZpZ0RpZ2l0YWxPdXRwdXRFcnJvckludGVycnVwdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIHRoZSBkaWdpdGFsIG91dHB1dCBtZW1vcnkgYW5kIHRoZSBkaWdpdGFsIG91dHB1dCBlcnJvciBpbnRlcnJ1cHQKKyAqCisgKiBkYXRhWzFdIDEgPSBFbmFibGUgdGhlIHZvbHRhZ2UgZXJyb3IgaW50ZXJydXB0CisgKgkgICAyID0gRGlzYWJsZSB0aGUgdm9sdGFnZSBlcnJvciBpbnRlcnJ1cHQKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF9kb19jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKQEAgLTEwOTAsMzEgKzgyMywxNSBAQAogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfV3JpdGVEaWdpdGFsT3V0cHV0ICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBXcml0ZXMgcG9ydCB2YWx1ZSAgVG8gdGhlIHNlbGVjdGVkIHBvcnQgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHVpX05vT2ZDaGFubmVscyAgICA6IE5vIE9mIENoYW5uZWxzIFRvIFdyaXRlICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1MDBfV3JpdGVEaWdpdGFsT3V0cHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFdyaXRlcyBwb3J0IHZhbHVlIHRvIHRoZSBzZWxlY3RlZCBwb3J0CisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfZG9fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCB1aV9UZW1wID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHVpX1RlbXA7CiAJdW5zaWduZWQgaW50IHVpX1RlbXAxOwogCXVuc2lnbmVkIGludCB1aV9Ob09mQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwkvKiAgZ2V0IHRoZSBjaGFubmVsICovCiAKQEAgLTExNjUsNyArODgyLDkgQEAKIAkJCQkJQVBDSTE1MDBfRElHSVRBTF9PUCk7CiAJCQl9CS8qICBpZihkYXRhWzFdPT0xKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcblNwZWNpZmllZCBjaGFubmVsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiU3BlY2lmaWVkIGNoYW5uZWwgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CS8qIGVsc2UgaWYoZGF0YVsxXT09MSkgKi8KIAkJfQkJLyogZWxzZWlmKGRhdGFbMV09PTApICovCiAJfQkJCS8qIGlmKGRhdGFbM109PTApICovCkBAIC0xMjQyLDEyICs5NjEsMTUgQEAKIAkJCQkJCUFQQ0kxNTAwX0RJR0lUQUxfT1ApOwogCQkJCX0JLyogIGlmKGRhdGFbMV09PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCXByaW50aygiXG5TcGVjaWZpZWQgY2hhbm5lbCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCQkiU3BlY2lmaWVkIGNoYW5uZWwgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0JLyogZWxzZSBpZihkYXRhWzFdPT0xKSAqLwogCQkJfQkvKiBlbHNlaWYoZGF0YVsxXT09MCkgKi8KIAkJfQkJLyogaWYoZGF0YVszXT09MSk7ICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblNwZWNpZmllZCBmdW5jdGlvbmFsaXR5IGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJTcGVjaWZpZWQgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogaWYgZWxzZSBkYXRhWzNdPT0xKSAqLwogCX0JCQkvKiBpZiBlbHNlIGRhdGFbM109PTApICovCkBAIC0xMjU2LDU3ICs5NzgsMjMgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTAwX0NvbmZpZ0NvdW50ZXJUaW1lcldhdGNoZG9nKGNvbWVkaV9kZXZpY2UKLXwgICAgICAgICAgICAgICAgICAgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyxzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKXwKLXwJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIFRoZSBXYXRjaGRvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgIDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICAgICAgICAgICAgICAgIDogMiAgICAgQVBDSTE1MDBfMV84X0tIWgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICBBUENJMTUwMF8zXzZfS0haICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgIEFQQ0kxNTAwXzExNV9LSFoKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIxL1RpbWVyMQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgQ291bnRlcjIvVGltZXIyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICBDb3VudGVyMy9XYXRjaGRvZwotfCAgICAgICAgICAgICAgICAgICAgICBkYXRhWzJdICAgICAgICAgICAgICAgIDogMCAgICAgQ291bnRlcgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgVGltZXIvV2F0Y2hkb2cKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVszXSAgICAgICAgICAgICAgICA6ICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaGFzICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gbWVhbmluZ3MuICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIElmIHRoZSBjb3VudGVyL3RpbWVyICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCBhcyBhIGNvdW50ZXIgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGltaXQgdmFsdWUgb2YgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3VudGVyIGlzIGdpdmVuICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgY291bnRlci90aW1lciAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYXMgYSB0aW1lciwgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRpdmlkZXIgZmFjdG9yICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG91dHB1dCBpcyAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuLgotfCAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs0XSAgICAgICAgICAgICAgICAgOiAwICAgIEFQQ0kxNTAwX0NPTlRJTlVPVVMKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICBBUENJMTUwMF9TSU5HTEUKLXwgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNV0gICAgICAgICAgICAgICAgIDogMCAgICBTb2Z0d2FyZSBUcmlnZ2VyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgSGFyZHdhcmUgVHJpZ2dlcgotfAotfCAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAgICAgICAgICAgICAgICAgIDowICAgIFNvZnR3YXJlIGdhdGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICBIYXJkd2FyZSBnYXRlCi18ICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzddICAgICAgICAgICAgICAgICAgOjAgICAgSW50ZXJydXB0IERpc2FibGUKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICBJbnRlcnJ1cHQgRW5hYmxlCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX0NvbmZpZ0NvdW50ZXJUaW1lcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIENvbmZpZ3VyZXMgVGhlIFdhdGNoZG9nCisgKgorICogZGF0YVswXSAwID0gQVBDSTE1MDBfMTE1X0tIWiwgMSA9IEFQQ0kxNTAwXzNfNl9LSFosIDIgPSBBUENJMTUwMF8xXzhfS0haCisgKiBkYXRhWzFdIDAgPSBDb3VudGVyMS9UaW1lcjEsIDEgPSAgQ291bnRlcjIvVGltZXIyLCAyID0gQ291bnRlcjMvV2F0Y2hkb2cKKyAqIGRhdGFbMl0gMCA9IENvdW50ZXIsIDEgPSBUaW1lci9XYXRjaGRvZworICogZGF0YVszXSBUaGlzIHBhcmFtZXRlciBoYXMgdHdvIG1lYW5pbmdzLiBJZiB0aGUgY291bnRlci90aW1lciBpcyB1c2VkIGFzCisgKglhIGNvdW50ZXIgdGhlIGxpbWl0IHZhbHVlIG9mIHRoZSBjb3VudGVyIGlzIGdpdmVuLiBJZiB0aGUgY291bnRlci90aW1lcgorICoJaXMgdXNlZCBhcyBhIHRpbWVyLCB0aGUgZGl2aWRlciBmYWN0b3IgZm9yIHRoZSBvdXRwdXQgaXMgZ2l2ZW4uCisgKiBkYXRhWzRdIDAgPSBBUENJMTUwMF9DT05USU5VT1VTLCAxID0gQVBDSTE1MDBfU0lOR0xFCisgKiBkYXRhWzVdIDAgPSBTb2Z0d2FyZSBUcmlnZ2VyLCAxID0gSGFyZHdhcmUgVHJpZ2dlcgorICogZGF0YVs2XSAwID0gU29mdHdhcmUgZ2F0ZSwgMSA9IEhhcmR3YXJlIGdhdGUKKyAqIGRhdGFbN10gMCA9IEludGVycnVwdCBEaXNhYmxlLCAxID0gSW50ZXJydXB0IEVuYWJsZQorICovCitzdGF0aWMgaW50IGFwY2kxNTAwX3RpbWVyX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaV9UaW1lckNvdW50ZXJNb2RlLCBpX01hc3RlckNvbmZpZ3VyYXRpb247CkBAIC0xMzE5LDcgKzEwMDcsOCBAQAogCX0JCQkvKiAgaWYoZGF0YVswXT09MHx8ZGF0YVswXT09MXx8ZGF0YVswXT09MikgKi8KIAllbHNlIHsKIAkJaWYgKGRhdGFbMF0gIT0gMykgewotCQkJcHJpbnRrKCJcblRoZSBvcHRpb24gZm9yIGlucHV0IGNsb2NrIHNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIG9wdGlvbiBmb3IgaW5wdXQgY2xvY2sgc2VsZWN0aW9uIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgaWYoZGF0YVswXSE9MykgKi8KIAl9CQkJLyogZWxzZWlmKGRhdGFbMF09PTB8fGRhdGFbMF09PTF8fGRhdGFbMF09PTIpICovCkBAIC0xMzM1LDcgKzEwMjQsOCBAQAogCQkJZGF0YVsyXSA9IEFQQ0kxNTAwX1RJTUVSOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBjaG9pY2UgaXMgbm90IGEgdGltZXIgbm9yIGEgY291bnRlclxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBjaG9pY2UgaXMgbm90IGEgdGltZXIgbm9yIGEgY291bnRlclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogIHN3aXRjaChkYXRhWzJdKSAqLwogCkBAIC0xMzQ4LDEzOSArMTAzOCwxMTAgQEAKIAkJCWRhdGFbNF0gPSBBUENJMTUwMF9TSU5HTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIG9wdGlvbiBmb3Igc2luZ2xlL2NvbnRpbnVvdXMgbW9kZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs0XSkgKi8KIAogCQlpX1RpbWVyQ291bnRlck1vZGUgPSBkYXRhWzJdIHwgZGF0YVs0XSB8IDc7Ci0JCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIHJlbG9hZCB2YWx1ZSAqLwotCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCWlmICgoZGF0YVszXSA+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpIHsKIAkJCWlmIChkYXRhWzddID09IEFQQ0kxNTAwX0VOQUJMRQogCQkJCXx8IGRhdGFbN10gPT0gQVBDSTE1MDBfRElTQUJMRSkgewogCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9NT0RFX1NQRUNJRklDQVRJT04sCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBtb2RlICovCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9UaW1lckNvdW50ZXJNb2RlLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9USU1FX0NTVF9MT1csCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGxvdyB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9USU1FX0NTVF9ISUdILAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFdyaXRlcyB0aGUgaGlnaCB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWRhdGFbM10gPSBkYXRhWzNdID4+IDg7CiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFJlYWRzIHRoZSByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX01hc3RlckNvbmZpZ3VyYXRpb24gPQogCQkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIEVuYWJsZXMgdGltZXIvY291bnRlciAxIGFuZCB0cmlnZ2VycyB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uIHwgMHg0MDsKIAotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBjb25maWd1cmF0aW9uICovCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9NYXN0ZXJDb25maWd1cmF0aW9uLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIHJlZ2lzdGVyIG9mICAgICAqLwogCQkJCS8qIHRpbWVyL2NvdW50ZXIgMSAgICAgICAgICAgICAgICAgICAgICAqLwotCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogRGlzYWJsZSB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoMHgwLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyByZWdpc3RlciBvZiAgICAgKi8KIAkJCQkvKiB0aW1lci9jb3VudGVyIDEgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUcmlnZ2VyIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YigweDIsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJfQkvKiBpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJFcnJvciBpbiBzZWxlY3Rpb24gb2YgaW50ZXJydXB0IGVuYWJsZSBvciBkaXNhYmxlXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0JLyogZWxzZWlmKGRhdGFbN109PSBBUENJMTUwMF9FTkFCTEUgfHxkYXRhWzddPT0gQVBDSTE1MDBfRElTQUJMRSkgKi8KIAkJfQkJLyogIGlmICgoZGF0YVszXT49IDApICYmIChkYXRhWzNdIDw9IDY1NTM1KSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQgPSBkYXRhWzddOwpAQCAtMTQ5Niw3ICsxMTU3LDggQEAKIAkJCWRhdGFbMl0gPSBBUENJMTUwMF9USU1FUjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGlzIG5vdCBhIHRpbWVyIG5vciBhIGNvdW50ZXJcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGlzIG5vdCBhIHRpbWVyIG5vciBhIGNvdW50ZXJcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVsyXSkgKi8KIApAQCAtMTUwOSw3ICsxMTcxLDggQEAKIAkJCWRhdGFbNF0gPSBBUENJMTUwMF9TSU5HTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIG9wdGlvbiBmb3Igc2luZ2xlL2NvbnRpbnVvdXMgbW9kZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs0XSkgKi8KIApAQCAtMTUyMiw3ICsxMTg1LDggQEAKIAkJCWRhdGFbNV0gPSBBUENJMTUwMF9IQVJEV0FSRV9UUklHR0VSOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhpcyBjaG9pY2UgZm9yIHNvZnR3YXJlIG9yIGhhcmR3YXJlIHRyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGZvciBzb2Z0d2FyZSBvciBoYXJkd2FyZSB0cmlnZ2VyIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiAgc3dpdGNoKGRhdGFbNV0pICovCiAKQEAgLTE1MzUsMTQwICsxMTk5LDExMSBAQAogCQkJZGF0YVs2XSA9IEFQQ0kxNTAwX0hBUkRXQVJFX0dBVEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIGNob2ljZSBmb3Igc29mdHdhcmUgb3IgaGFyZHdhcmUgZ2F0ZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBjaG9pY2UgZm9yIHNvZnR3YXJlIG9yIGhhcmR3YXJlIGdhdGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs2XSkgKi8KIAogCQlpX1RpbWVyQ291bnRlck1vZGUgPSBkYXRhWzJdIHwgZGF0YVs0XSB8IGRhdGFbNV0gfCBkYXRhWzZdIHwgNzsKIAotCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdCB0aGUgcmVsb2FkIHZhbHVlICovCi0JCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCWlmICgoZGF0YVszXSA+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpIHsKIAkJCWlmIChkYXRhWzddID09IEFQQ0kxNTAwX0VOQUJMRQogCQkJCXx8IGRhdGFbN10gPT0gQVBDSTE1MDBfRElTQUJMRSkgewogCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtb2RlIHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9NT0RFX1NQRUNJRklDQVRJT04sCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBtb2RlICovCi0JCQkJLyoqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9UaW1lckNvdW50ZXJNb2RlLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9USU1FX0NTVF9MT1csCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGxvdyB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbnN0YW50IHJlZ2lzdGVyIG9mIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9USU1FX0NTVF9ISUdILAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFdyaXRlcyB0aGUgaGlnaCB2YWx1ZSAgKi8KLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWRhdGFbM10gPSBkYXRhWzNdID4+IDg7CiAJCQkJb3V0YihkYXRhWzNdLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFJlYWRzIHRoZSByZWdpc3RlciAqLwotCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX01hc3RlckNvbmZpZ3VyYXRpb24gPQogCQkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIEVuYWJsZXMgdGltZXIvY291bnRlciAyIGFuZCB0cmlnZ2VycyB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uIHwgMHgyMDsKIAotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIG1hc3RlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JCQkJICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19NQVNURVJfQ09ORklHVVJBVElPTl9DT05UUk9MLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIG5ldyBjb25maWd1cmF0aW9uICovCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoaV9NYXN0ZXJDb25maWd1cmF0aW9uLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIHJlZ2lzdGVyIG9mICAgICAqLwogCQkJCS8qIHRpbWVyL2NvdW50ZXIgMiAgICAgICAgICAgICAgICAgICAgICAqLwotCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogRGlzYWJsZSB0aW1lci9jb3VudGVyIDIgKi8KLQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoMHgwLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyByZWdpc3RlciBvZiAgICAgKi8KIAkJCQkvKiB0aW1lci9jb3VudGVyIDIgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBUcmlnZ2VyIHRpbWVyL2NvdW50ZXIgMSAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YigweDIsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJfQkvKiBpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJFcnJvciBpbiBzZWxlY3Rpb24gb2YgaW50ZXJydXB0IGVuYWJsZSBvciBkaXNhYmxlXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0JLyogZWxzZWlmKGRhdGFbN109PSBBUENJMTUwMF9FTkFCTEUgfHxkYXRhWzddPT0gQVBDSTE1MDBfRElTQUJMRSkgKi8KIAkJfQkJLyogIGlmICgoZGF0YVszXT49IDApICYmIChkYXRhWzNdIDw9IDY1NTM1KSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQgPSBkYXRhWzddOwpAQCAtMTY4NCw3ICsxMzE5LDggQEAKIAkJCWRhdGFbMl0gPSBBUENJMTUwMF9XQVRDSERPRzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGlzIG5vdCBhIHdhdGNoZG9nIG5vciBhIGNvdW50ZXJcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoaXMgY2hvaWNlIGlzIG5vdCBhIHdhdGNoZG9nIG5vciBhIGNvdW50ZXJcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVsyXSkgKi8KIApAQCAtMTY5Nyw3ICsxMzMzLDggQEAKIAkJCWRhdGFbNF0gPSBBUENJMTUwMF9TSU5HTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiXG5UaGlzIG9wdGlvbiBmb3Igc2luZ2xlL2NvbnRpbnVvdXMgbW9kZSBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhpcyBvcHRpb24gZm9yIHNpbmdsZS9jb250aW51b3VzIG1vZGUgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qICBzd2l0Y2goZGF0YVs0XSkgKi8KIApAQCAtMTcxMCwxNDYgKzEzNDcsMTA5IEBACiAJCQlkYXRhWzZdID0gQVBDSTE1MDBfSEFSRFdBUkVfR0FURTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoaXMgY2hvaWNlIGZvciBzb2Z0d2FyZSBvciBoYXJkd2FyZSBnYXRlIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGlzIGNob2ljZSBmb3Igc29mdHdhcmUgb3IgaGFyZHdhcmUgZ2F0ZSBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogIHN3aXRjaChkYXRhWzZdKSAqLwogCi0JCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogVGVzdCBpZiB1c2VkIGZvciB3YXRjaGRvZyAqLwotCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJaWYgKGRhdGFbMl0gPT0gQVBDSTE1MDBfV0FUQ0hET0cpIHsKLQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogLSBFbmFibGVzIHRoZSBvdXRwdXQgbGluZSAqLwogCQkJLyogLSBFbmFibGVzIHJldHJpZ2dlciAgICAgICAqLwogCQkJLyogLSBQdWxzZXMgb3V0cHV0ICAgICAgICAgICAqLwotCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpX1RpbWVyQ291bnRlck1vZGUgPSBkYXRhWzJdIHwgZGF0YVs0XSB8IDB4NTQ7CiAJCX0JCS8qIGlmIChkYXRhWzJdID09IEFQQ0kxNTAwX1dBVENIRE9HKSAqLwogCQllbHNlIHsKIAkJCWlfVGltZXJDb3VudGVyTW9kZSA9IGRhdGFbMl0gfCBkYXRhWzRdIHwgZGF0YVs2XSB8IDc7CiAJCX0JCS8qIGVsc2VpZiAoZGF0YVsyXSA9PSBBUENJMTUwMF9XQVRDSERPRykgKi8KLQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFRlc3QgdGhlIHJlbG9hZCB2YWx1ZSAqLwotCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQlpZiAoKGRhdGFbM10gPj0gMCkgJiYgKGRhdGFbM10gPD0gNjU1MzUpKSB7CiAJCQlpZiAoZGF0YVs3XSA9PSBBUENJMTUwMF9FTkFCTEUKIAkJCQl8fCBkYXRhWzddID09IEFQQ0kxNTAwX0RJU0FCTEUpIHsKIAotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbW9kZSByZWdpc3RlciBvZiB3YXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfTU9ERV9TUEVDSUZJQ0FUSU9OLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgbW9kZSAqLwotCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfVGltZXJDb3VudGVyTW9kZSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB3YXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfVElNRV9DU1RfTE9XLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBsb3cgdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb25zdGFudCByZWdpc3RlciBvZiB3YXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfVElNRV9DU1RfSElHSCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBXcml0ZXMgdGhlIGhpZ2ggdmFsdWUgICovCi0JCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlkYXRhWzNdID0gZGF0YVszXSA+PiA4OwogCQkJCW91dGIoZGF0YVszXSwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9DT05GSUdVUkFUSU9OX0NPTlRST0wsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBSZWFkcyB0aGUgcmVnaXN0ZXIgKi8KLQkJCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9NYXN0ZXJDb25maWd1cmF0aW9uID0KIAkJCQkJaW5iKGRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBFbmFibGVzIHdhdGNoZG9nL2NvdW50ZXIgMyBhbmQgdHJpZ2dlcnMgd2F0Y2hkb2cvY291bnRlciAzICovCi0JCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiA9CiAJCQkJCWlfTWFzdGVyQ29uZmlndXJhdGlvbiB8IDB4MTA7CiAKLQkJCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCQkJCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogV3JpdGVzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLwotCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKGlfTWFzdGVyQ29uZmlndXJhdGlvbiwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogVGVzdCBpZiBDT1VOVEVSICovCi0JCQkJCSAgLyoqKioqKioqKioqKioqKioqKioqLwogCQkJCWlmIChkYXRhWzJdID09IEFQQ0kxNTAwX0NPVU5URVIpIHsKIAotCQkJCQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgb2YgICAqLwogCQkJCQkvKiB3YXRjaGRvZy9jb3VudGVyIDMgICAgICAgICAgICAgICAgKi8KLQkJCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogRGlzYWJsZSB0aGUgIHdhdGNoZG9nL2NvdW50ZXIgMyBhbmQgc3RhcnRzIGl0ICovCi0JCQkJCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4MCwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCByZWdpc3RlciBvZiAgICovCiAJCQkJCS8qIHdhdGNoZG9nL2NvdW50ZXIgMyAgICAgICAgICAgICAgICAqLwotCQkJCQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCQkJCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFRyaWdnZXIgdGhlICB3YXRjaGRvZy9jb3VudGVyIDMgYW5kIHN0YXJ0cyBpdCAqLwotCQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQlvdXRiKDB4MiwKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTE4NTgsMTIgKzE0NTgsMTQgQEAKIAogCQkJfQkvKiBpZihkYXRhWzddPT0gQVBDSTE1MDBfRU5BQkxFIHx8ZGF0YVs3XT09IEFQQ0kxNTAwX0RJU0FCTEUpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIGludGVycnVwdCBlbmFibGUgb3IgZGlzYWJsZVxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJFcnJvciBpbiBzZWxlY3Rpb24gb2YgaW50ZXJydXB0IGVuYWJsZSBvciBkaXNhYmxlXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0JLyogZWxzZWlmKGRhdGFbN109PSBBUENJMTUwMF9FTkFCTEUgfHxkYXRhWzddPT0gQVBDSTE1MDBfRElTQUJMRSkgKi8KIAkJfQkJLyogIGlmICgoZGF0YVszXT49IDApICYmIChkYXRhWzNdIDw9IDY1NTM1KSkgKi8KIAkJZWxzZSB7Ci0JCQlwcmludGsoIlxuRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiRXJyb3IgaW4gc2VsZWN0aW9uIG9mIHJlbG9hZCB2YWx1ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZiAoKGRhdGFbM10+PSAwKSAmJiAoZGF0YVszXSA8PSA2NTUzNSkpICovCiAJCWlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQgPSBkYXRhWzddOwpAQCAtMTg3MSw0NCArMTQ3MywyNSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50aygiXG5UaGUgc3BlY2lmaWVkIGNvdW50ZXJcdGltZXIgb3B0aW9uIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkiVGhlIHNwZWNpZmllZCBjb3VudGVyL3RpbWVyIG9wdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBzd2l0Y2goZGF0YVsxXSkgKi8KIAlpX0NvdW50ZXJMb2dpYyA9IGRhdGFbMl07CiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTUwMF9TdGFydFN0b3BUcmlnZ2VyVGltZXJDb3VudGVyV2F0Y2hkb2cgICAgICB8Ci18CQkJCShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotfCAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKTsgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBTdGFydCAvIFN0b3Agb3IgdHJpZ2dlciB0aGUgdGltZXIgY291bnRlciBvciBXYXRjaGRvZyAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIxL1RpbWVyMQotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgQ291bnRlcjIvVGltZXIyCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICBDb3VudGVyMy9XYXRjaGRvZwotfCAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdICAgICAgICAgICAgICAgIDogMCAgICAgc3RhcnQKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIHN0b3AKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgIFRyaWdnZXIKLXwgICAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSAgICAgICAgICAgICAgICA6IDAgICAgIENvdW50ZXIKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgIFRpbWVyL1dhdGNoZG9nCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1N0YXJ0U3RvcFRyaWdnZXJUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBTdGFydCAvIFN0b3Agb3IgdHJpZ2dlciB0aGUgdGltZXIgY291bnRlciBvciBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gMCA9IENvdW50ZXIxL1RpbWVyMSwgMSA9ICBDb3VudGVyMi9UaW1lcjIsIDIgPSBDb3VudGVyMy9XYXRjaGRvZworICogZGF0YVsxXSAwID0gU3RhcnQsIDEgPSBTdG9wLCAyID0gVHJpZ2dlcgorICogZGF0YVsyXSAwID0gQ291bnRlciwgMSA9IFRpbWVyL1dhdGNoZG9nCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1MDBfdGltZXJfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlOwpAQCAtMTkyNCwxMyArMTUwNyw5IEBACiAJCQkJZWxzZSB7CiAJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHhFNDsJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCiAJCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXJXYXRjaGRvZ0ludGVycnVwdD09MSkgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFN0YXJ0cyB0aW1lci9jb3VudGVyIDEgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCWlfVGltZXJDb3VudGVyMUVuYWJsZWQgPSAxOwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMTkzOSwyMCArMTUxOCwxNyBAQAogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMUluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuQ291bnRlci9UaW1lcjEgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiQ291bnRlci9UaW1lcjEgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJYnJlYWs7CiAKIAkJY2FzZSBTVE9QOgogCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFN0b3AgdGltZXIvY291bnRlciAxICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0xOTY1LDIzICsxNTQxLDE3IEBACiAJCWNhc2UgVFJJR0dFUjoKIAkJCWlmIChpX1RpbWVyQ291bnRlcjFJbml0ID09IDEpIHsKIAkJCQlpZiAoaV9UaW1lckNvdW50ZXIxRW5hYmxlZCA9PSAxKSB7Ci0JCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2V0IFRyaWdnZXIgYW5kIGdhdGUgKi8KLQkJCQkJCSAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHg2OwogCQkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMUVuYWJsZWQ9PTEpICovCiAJCQkJZWxzZSB7Ci0JCQkJCQkgICAvKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZXQgVHJpZ2dlciAqLwotCQkJCQkJICAgLyoqKioqKioqKioqKioqKi8KIAogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4MjsKIAkJCQl9CS8qIGVsc2VpZihpX1RpbWVyQ291bnRlcjFFbmFibGVkPT0xKSAqLwogCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0xOTkwLDEzICsxNTYwLDE1IEBACiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJfQkvKiBpZiggaV9UaW1lckNvdW50ZXIxSW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkJCXByaW50aygiXG5Db3VudGVyL1RpbWVyMSBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJDb3VudGVyL1RpbWVyMSBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOworCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJIlRoZSBzcGVjaWZpZWQgb3B0aW9uIGZvciBzdGFydC9zdG9wL3RyaWdnZXIgZG9lcyBub3QgZXhpc3RcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIHN3aXRjaChkYXRhWzFdKSAqLwogCQlicmVhazsKQEAgLTIwMTEsMTMgKzE1ODMsOSBAQAogCQkJCWVsc2UgewogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4RTQ7CS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwogCQkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyV2F0Y2hkb2dJbnRlcnJ1cHQ9PTEpICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTdGFydHMgdGltZXIvY291bnRlciAyICovCi0JCQkJCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlpX1RpbWVyQ291bnRlcjJFbmFibGVkID0gMTsKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIwMjYsMjAgKzE1OTQsMTcgQEAKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjJJbml0PT0xKSAqLwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKCJcbkNvdW50ZXIvVGltZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIkNvdW50ZXIvVGltZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgU1RPUDoKIAotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTdG9wIHRpbWVyL2NvdW50ZXIgMiAqLwotCQkJCQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjA1MSwyMyArMTYxNiwxNyBAQAogCQljYXNlIFRSSUdHRVI6CiAJCQlpZiAoaV9UaW1lckNvdW50ZXIySW5pdCA9PSAxKSB7CiAJCQkJaWYgKGlfVGltZXJDb3VudGVyMkVuYWJsZWQgPT0gMSkgewotCQkJCQkJIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNldCBUcmlnZ2VyIGFuZCBnYXRlICovCi0JCQkJCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4NjsKIAkJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjJFbmFibGVkPT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQkJICAgLyoqKioqKioqKioqKioqKi8KIAkJCQkJLyogU2V0IFRyaWdnZXIgKi8KLQkJCQkJCSAgIC8qKioqKioqKioqKioqKiovCiAKIAkJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDI7CiAJCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXIyRW5hYmxlZD09MSkgKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjA3NiwxMiArMTYzNSwxNCBAQAogCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJCQlwcmludGsoIlxuQ291bnRlci9UaW1lcjIgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCQkiQ291bnRlci9UaW1lcjIgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogc3dpdGNoKGRhdGFbMV0pICovCiAJCWJyZWFrOwpAQCAtMjA5NiwxMyArMTY1Nyw5IEBACiAJCQkJZWxzZSB7CiAJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHhFNDsJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCiAJCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXJXYXRjaGRvZ0ludGVycnVwdD09MSkgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFN0YXJ0cyBXYXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCWlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAxOwotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjExMiwyMCArMTY2OSwxNyBAQAogCiAJCQl9CS8qICBpZiggaV9XYXRjaGRvZ0NvdW50ZXIzaW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkJCXByaW50aygiXG5XYXRjaGRvZy9Db3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CisJCQkJZGV2X3dhcm4oZGV2LT5od19kZXYsCisJCQkJCSJXYXRjaGRvZy9Db3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIFNUT1A6CiAKLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU3RvcCBXYXRjaGRvZy9jb3VudGVyIDMgKi8KLQkJCQkJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIxNDAsMjMgKzE2OTQsMTcgQEAKIAkJCWNhc2UgMDoJLyogdHJpZ2dlcmluZyBjb3VudGVyIDMgKi8KIAkJCQlpZiAoaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdCA9PSAxKSB7CiAJCQkJCWlmIChpX1dhdGNoZG9nQ291bnRlcjNFbmFibGVkID09IDEpIHsKLQkJCQkJCQkgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJCS8qIFNldCBUcmlnZ2VyIGFuZCBnYXRlICovCi0JCQkJCQkJICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHg2OwogCQkJCQl9CS8qIGlmKCBpX1dhdGNoZG9nQ291bnRlcjNFbmFibGVkPT0xKSAqLwogCQkJCQllbHNlIHsKLQkJCQkJCQkgICAvKioqKioqKioqKioqKioqLwogCQkJCQkJLyogU2V0IFRyaWdnZXIgKi8KLQkJCQkJCQkgICAvKioqKioqKioqKioqKioqLwogCiAJCQkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4MjsKIAkJCQkJfQkvKiBlbHNlaWYoaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZD09MSkgKi8KIAotCQkJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIxNjUsNyArMTcxMyw4IEBACiAJCQkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJCQl9CS8qIGlmKCBpX1dhdGNoZG9nQ291bnRlcjNJbml0PT0xKSAqLwogCQkJCWVsc2UgewotCQkJCQlwcmludGsoIlxuQ291bnRlcjMgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJDb3VudGVyMyBub3QgY29uZmlndXJlZFxuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTIxNzMsOSArMTcyMiw3IEBACiAJCQkJLyogdHJpZ2dlcmluZyBXYXRjaGRvZyAzICovCiAJCQkJaWYgKGlfV2F0Y2hkb2dDb3VudGVyM0luaXQgPT0gMSkgewogCi0JCQkJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjE4NCw1NSArMTczMSw0MCBAQAogCQkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCQkJfQkvKiBpZiggaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdD09MSkgKi8KIAkJCQllbHNlIHsKLQkJCQkJcHJpbnRrKCJcbldhdGNoZG9nIDMgbm90IGNvbmZpZ3VyZWRcbiIpOworCQkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJCSJXYXRjaGRvZyAzIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoIlxuV3JvbmcgY2hvaWNlIG9mIHdhdGNoZG9nL2NvdW50ZXIzXG4iKTsKKwkJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkJIldyb25nIGNob2ljZSBvZiB3YXRjaGRvZy9jb3VudGVyM1xuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CS8qIHN3aXRjaChkYXRhWzJdKSAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlxuVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGhlIHNwZWNpZmllZCBvcHRpb24gZm9yIHN0YXJ0L3N0b3AvdHJpZ2dlciBkb2VzIG5vdCBleGlzdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogc3dpdGNoKGRhdGFbMV0pICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiXG5UaGUgc3BlY2lmaWVkIGNob2ljZSBmb3IgY291bnRlci93YXRjaGRvZy90aW1lciBkb2VzIG5vdCBleGlzdFxuIik7CisJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJIlRoZSBzcGVjaWZpZWQgY2hvaWNlIGZvciBjb3VudGVyL3dhdGNoZG9nL3RpbWVyIGRvZXMgbm90IGV4aXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIHN3aXRjaChkYXRhWzBdKSAqLwogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1MDBfUmVhZENvdW50ZXJUaW1lcldhdGNoZG9nICAgICAgICAgICAgICAgIHwKLXwJCQkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyxzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi18ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpOyAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFJlYWQgVGhlIFdhdGNoZG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiAgIHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgICAgICA6IERyaXZlciBoYW5kbGUgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICA6cG9pbnRlciB0byBzdWJkZXZpY2Ugc3RydWN0dXJlCi18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiAgICAgIDpwb2ludGVyIHRvIGluc24gc3RydWN0dXJlICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgICA6IERhdGEgUG9pbnRlciB0byByZWFkIHN0YXR1cyAgfAotfCAgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICAgICAgICAgICAgICAgIDogMCAgICAgQ291bnRlcjEvVGltZXIxCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICBDb3VudGVyMi9UaW1lcjIKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgIENvdW50ZXIzL1dhdGNoZG9nCi18Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1JlYWRDb3VudGVyVGltZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkIFRoZSBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gMCA9IENvdW50ZXIxL1RpbWVyMSwgMSA9ICBDb3VudGVyMi9UaW1lcjIsIDIgPSBDb3VudGVyMy9XYXRjaGRvZworICovCitzdGF0aWMgaW50IGFwY2kxNTAwX3RpbWVyX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlOwpAQCAtMjI0MiwyMyArMTc3NCwxNyBAQAogCQkvKiBSZWFkIGNvdW50ZXIvdGltZXIxICovCiAJCWlmIChpX1RpbWVyQ291bnRlcjFJbml0ID09IDEpIHsKIAkJCWlmIChpX1RpbWVyQ291bnRlcjFFbmFibGVkID09IDEpIHsKLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNldCBSQ0MgYW5kIGdhdGUgKi8KLQkJICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweEM7CiAJCQl9CS8qIGlmKCBpX1RpbWVyQ291bnRlcjFJbml0PT0xKSAqLwogCQkJZWxzZSB7Ci0JCSAgICAvKioqKioqKioqKioqKioqLwogCQkJCS8qIFNldCBSQ0MgKi8KLQkJICAgIC8qKioqKioqKioqKioqKiovCiAKIAkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4ODsKIAkJCX0JLyogZWxzZWlmKGlfVGltZXJDb3VudGVyMUluaXQ9PTEpICovCiAKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZHMgYW5kIHN0YXR1cyByZWdpc3RlciAqLwotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIyNjYsOSArMTc5Miw3IEBACiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvdW50ZXIgcmVnaXN0ZXIgKGhpZ2gpICovCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SX0NQVF9UTVIxX1ZBTFVFX0hJR0gsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTIyODUsNyArMTgwOSw4IEBACiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCX0JCS8qIGlmKCBpX1RpbWVyQ291bnRlcjFJbml0PT0xKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5UaW1lci9Db3VudGVyMSBub3QgY29uZmlndXJlZFxuIik7CisJCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCQkiVGltZXIvQ291bnRlcjEgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGVsc2VpZiggaV9UaW1lckNvdW50ZXIxSW5pdD09MSkgKi8KIAkJYnJlYWs7CkBAIC0yMjkzLDIzICsxODE4LDE3IEBACiAJCS8qIFJlYWQgY291bnRlci90aW1lcjIgKi8KIAkJaWYgKGlfVGltZXJDb3VudGVyMkluaXQgPT0gMSkgewogCQkJaWYgKGlfVGltZXJDb3VudGVyMkVuYWJsZWQgPT0gMSkgewotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2V0IFJDQyBhbmQgZ2F0ZSAqLwotCQkgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQlpX0NvbW1hbmRBbmRTdGF0dXNWYWx1ZSA9IDB4QzsKIAkJCX0JLyogaWYoIGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAJCQllbHNlIHsKLQkJICAgIC8qKioqKioqKioqKioqKiovCiAJCQkJLyogU2V0IFJDQyAqLwotCQkgICAgLyoqKioqKioqKioqKioqKi8KIAogCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHg4OwogCQkJfQkvKiBlbHNlaWYoaV9UaW1lckNvdW50ZXIySW5pdD09MSkgKi8KIAotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kcyBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjJfQ01EX1NUQVRVUywKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjMxNyw5ICsxODM2LDcgQEAKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY291bnRlciByZWdpc3RlciAoaGlnaCkgKi8KLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JfQ1BUX1RNUjJfVkFMVUVfSElHSCwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjMzNiw3ICsxODUzLDggQEAKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJfQkJLyogaWYoIGlfVGltZXJDb3VudGVyMkluaXQ9PTEpICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRpbWVyL0NvdW50ZXIyIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaW1lci9Db3VudGVyMiBub3QgY29uZmlndXJlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZWlmKCBpX1RpbWVyQ291bnRlcjJJbml0PT0xKSAqLwogCQlicmVhazsKQEAgLTIzNDQsMjMgKzE4NjIsMTcgQEAKIAkJLyogUmVhZCBjb3VudGVyL3dhdGNoZG9nMiAqLwogCQlpZiAoaV9XYXRjaGRvZ0NvdW50ZXIzSW5pdCA9PSAxKSB7CiAJCQlpZiAoaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZCA9PSAxKSB7Ci0JCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZXQgUkNDIGFuZCBnYXRlICovCi0JCSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCWlfQ29tbWFuZEFuZFN0YXR1c1ZhbHVlID0gMHhDOwogCQkJfQkvKiBpZiggaV9UaW1lckNvdW50ZXIySW5pdD09MSkgKi8KIAkJCWVsc2UgewotCQkgICAgLyoqKioqKioqKioqKioqKi8KIAkJCQkvKiBTZXQgUkNDICovCi0JCSAgICAvKioqKioqKioqKioqKioqLwogCiAJCQkJaV9Db21tYW5kQW5kU3RhdHVzVmFsdWUgPSAweDg7CiAJCQl9CS8qIGVsc2VpZihpX1dhdGNoZG9nQ291bnRlcjNJbml0PT0xKSAqLwogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmRzIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SM19DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMzY4LDkgKzE4ODAsNyBAQAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb3VudGVyIHJlZ2lzdGVyIChoaWdoKSAqLwotCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCW91dGIoQVBDSTE1MDBfUl9DUFRfVE1SM19WQUxVRV9ISUdILAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yMzg3LDEyICsxODk3LDE0IEBACiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCX0JCS8qIGlmKCBpX1dhdGNoZG9nQ291bnRlcjNJbml0PT0xKSAqLwogCQllbHNlIHsKLQkJCXByaW50aygiXG5XYXRjaGRvZ0NvdW50ZXIzIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJXYXRjaGRvZ0NvdW50ZXIzIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CQkvKiBlbHNlaWYoIGlfV2F0Y2hkb2dDb3VudGVyM0luaXQ9PTEpICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiXG5UaGUgY2hvaWNlIG9mIHRpbWVyL2NvdW50ZXIvd2F0Y2hkb2cgZG9lcyBub3QgZXhpc3RcbiIpOworCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCSJUaGUgY2hvaWNlIG9mIHRpbWVyL2NvdW50ZXIvd2F0Y2hkb2cgZG9lcyBub3QgZXhpc3RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CQkJLyogc3dpdGNoKGRhdGFbMF0pICovCiAKQEAgLTI0MDAsMzEgKzE5MTIsMTUgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCAgaV9BUENJMTUwMF9SZWFkSW50ZXJydXB0TWFzayAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotfCAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBSZWFkIHRoZSBpbnRlcnJ1cHQgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogICBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ICAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgdG8gcmVhZCBzdGF0dXMgIHwKLQotCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQlkYXRhWzBdOlRoZSBpbnRlcnJ1cHQgbWFzayB2YWx1ZQkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV06Q2hhbm5lbCBubwotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTAwX1JlYWRJbnRlcnJ1cHRNYXNrKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWQgdGhlIGludGVycnVwdCBtYXNrCisgKgorICogZGF0YVswXSBUaGUgaW50ZXJydXB0IG1hc2sgdmFsdWUKKyAqIGRhdGFbMV0gQ2hhbm5lbCBOdW1iZXIKKyAqLworc3RhdGljIGludCBhcGNpMTUwMF90aW1lcl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlkYXRhWzBdID0gaV9JbnRlcnJ1cHRNYXNrOwogCWRhdGFbMV0gPSBpX0lucHV0Q2hhbm5lbDsKQEAgLTI0MzMsMzEgKzE5MjksMTIgQEAKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCAgaV9BUENJMTUwMF9Db25maWd1cmVJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotfCAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKTsgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgVGFzayAgICAgICAgICAgICAgOiBDb25maWd1cmVzIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IElucHV0IFBhcmFtZXRlcnMgIDogICBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ICAgICAgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgOnBvaW50ZXIgdG8gc3ViZGV2aWNlIHN0cnVjdHVyZQotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24gICAgICA6cG9pbnRlciB0byBpbnNuIHN0cnVjdHVyZSAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICAgOiBEYXRhIFBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLXwKLQotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0KLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9Db25maWd1cmVJbnRlcnJ1cHQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorICogQ29uZmlndXJlcyB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGFwY2kxNTAwX2RvX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVpX1N0YXR1czsKQEAgLTI0NzQsMTQwICsxOTUxLDEwMSBAQAogCQkJaV9Db25zdGFudCA9IDB4MDA7CiAJCX0JCS8qIGlme2RhdGFbMF09PTApICovCiAJCWVsc2UgewotCQkJcHJpbnRrKCJcblRoZSBwYXJhbWV0ZXIgcGFzc2VkIHRvIGRyaXZlciBpcyBpbiBlcnJvciBmb3IgZW5hYmxpbmcgdGhlIHZvbHRhZ2UgaW50ZXJydXB0XG4iKTsKKwkJCWRldl93YXJuKGRldi0+aHdfZGV2LAorCQkJCSJUaGUgcGFyYW1ldGVyIHBhc3NlZCB0byBkcml2ZXIgaXMgaW4gZXJyb3IgZm9yIGVuYWJsaW5nIHRoZSB2b2x0YWdlIGludGVycnVwdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQkJLyogZWxzZSBpZihkYXRhWzBdPT0wKSAqLwogCX0JCQkvKiBlbHNlaWYoZGF0YVswXT09MSkgKi8KIAotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJaV9SZWdWYWx1ZSA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9TUEVDSUZJQ0FUSU9OLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogV3JpdGVzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAoQVBDSTE1MDBfT1IpICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4RjkpIHwgQVBDSTE1MDBfT1I7CiAKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0gICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIEF1dGhvcmlzZXMgdGhlIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweEMwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIHBhdHRlcm4gcG9sYXJpdHkgcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX1BPTEFSSVRZLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKGlfQ29uc3RhbnQsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBwYXR0ZXJuIHRyYW5zaXRpb24gcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX1BBVFRFUk5fVFJBTlNJVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihpX0NvbnN0YW50LCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgcGF0dGVybiBtYXNrIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9QQVRURVJOX01BU0ssCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoaV9Db25zdGFudCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiBwb3J0IEEgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCW91dGIoaV9SZWdWYWx1ZSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0ICBCICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJaV9SZWdWYWx1ZSA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQl9DT01NQU5EX0FORF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogRGVsZXRlcyB0aGUgaW50ZXJydXB0IG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJb3V0YihpX1JlZ1ZhbHVlLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMSAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAxICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMiAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfUmVnVmFsdWUgPSBpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAyICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAlvdXRiKGlfUmVnVmFsdWUsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAzICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJaV9SZWdWYWx1ZSA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogRGVsZXRlcyB0aGUgaW50ZXJydXB0IG9mIHRpbWVyIDMgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCW91dGIoaV9SZWdWYWx1ZSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0JIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0lOVEVSUlVQVF9DT05UUk9MLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBBdXRob3JpemVzIHRoZSBtYWluIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKDB4RDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIEVuYWJsZXMgdGhlIFBDSSBpbnRlcnJ1cHQgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRsKDB4MzAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJdWlfU3RhdHVzID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIDB4MTApOwogCXVpX1N0YXR1cyA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyAweDM4KTsKQEAgLTI2MTYsMjQgKzIwNTQsNyBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi0vKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogc3RhdGljIHZvaWQgdl9BUENJMTUwMF9JbnRlcnJ1cHQJCQkJCSAgICAgfAotfAkJCQkJICAoaW50IGlycSAsIHZvaWQgKmQpICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogSW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IGludCBpcnEgICAgICAgICAgICAgICAgIDogaXJxIG51bWJlciAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZCAgICAgICAgICAgICAgICAgOiB2b2lkIHBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgdm9pZCB2X0FQQ0kxNTAwX0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgYXBjaTE1MDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCiB7CiAKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKQEAgLTI2NDIsNDQgKzIwNjMsMjggQEAKIAlpbnQgaV9SZWdWYWx1ZSA9IDA7CiAJaV9JbnRlcnJ1cHRNYXNrID0gMDsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBSZWFkIHRoZSBib2FyZCBpbnRlcnJ1cHQgc3RhdHVzICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCXVpX0ludGVycnVwdFN0YXR1cyA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyAweDM4KTsKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFRlc3QgaWYgYm9hcmQgZ2VuZXJhdGVkIGEgaW50ZXJydXB0ICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJaWYgKCh1aV9JbnRlcnJ1cHRTdGF0dXMgJiAweDgwMDAwMCkgPT0gMHg4MDAwMDApIHsKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIERpc2FibGUgYWxsIEludGVycnVwdCAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCxkZXZwcml2LT5pb2Jhc2UrQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7ICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIERpc2FibGVzICB0aGUgbWFpbiBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIG91dGIoMHgwMCxkZXZwcml2LT5pb2Jhc2UrQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7ICovCiAKLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQSAqLwotICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9DT01NQU5EX0FORF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiBwb3J0IEEgKi8KLQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCQkJb3V0YihpX1JlZ1ZhbHVlLAogCQkJCWRldnByaXYtPmlvYmFzZSArCkBAIC0yNjkzLDkgKzIwOTgsNyBAQAogCQkJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAKLQkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJCS8qIFNlbGVjdHMgdGhlIGludGVycnVwdCB2ZWN0b3IgcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0JICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRiKEFQQ0kxNTAwX1JXX1BPUlRfQV9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yNzExLDQ1ICsyMTE0LDMyIEBACiAJCQl9CS8qIGVsc2VpZihpX0xvZ2ljPT1BUENJMTUwMF9PUl9QUklPUklUWSkgKi8KIAkJfQkJLyogIGlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApICovCiAKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEIgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQlpX1JlZ1ZhbHVlID0KIAkJCWluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaWYgKChpX1JlZ1ZhbHVlICYgMHg2MCkgPT0gMHg2MCkgewotCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfQ09NTUFORF9BTkRfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBEZWxldGVzIHRoZSBpbnRlcnJ1cHQgb2YgcG9ydCBCICovCi0JICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpX1JlZ1ZhbHVlID0gKGlfUmVnVmFsdWUgJiAweDBGKSB8IDB4MjA7CiAJCQlvdXRiKGlfUmVnVmFsdWUsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJCXByaW50aygiXG5cblxuIik7Ci0JICAgICAvKioqKioqKioqKioqKioqKi8KIAkJCS8qIFJlYWRzIHBvcnQgQiAqLwotCSAgICAgLyoqKioqKioqKioqKioqKiovCiAJCQlpX1JlZ1ZhbHVlID0KIAkJCQlpbmIoKHVuc2lnbmVkIGludCkgZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9QT1JUX0IpOwogCiAJCQlpX1JlZ1ZhbHVlID0gaV9SZWdWYWx1ZSAmIDB4QzA7Ci0JICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogVGVzdHMgaWYgdGhpcyBpcyBhbiBleHRlcm5hbCBlcnJvciAqLwotCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaWYgKGlfUmVnVmFsdWUpIHsKIAkJCQkvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQkJICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCQkgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAKIAkJCQlpZiAoaV9SZWdWYWx1ZSAmIDB4ODApIHsKQEAgLTI3NjcsNDYgKzIxNTcsMzQgQEAKIAkJCX0JLyogIGlmIChpX1JlZ1ZhbHVlKSAqLwogCQl9CQkvKiBpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSAqLwogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIxX0NNRF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAxICovCi0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAkJCW91dGIoaV9SZWdWYWx1ZSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwogCQkJCUFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQkJaV9JbnRlcnJ1cHRNYXNrID0gaV9JbnRlcnJ1cHRNYXNrIHwgNDsKIAkJfQkJLyogIGlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApICovCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDIgKi8KLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaV9SZWdWYWx1ZSA9CiAJCQlpbmIoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJCWlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApIHsKLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDIgKi8KLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMl9DTURfU1RBVFVTLAogCQkJCWRldnByaXYtPmlvYmFzZSArCiAJCQkJQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCS8qIERlbGV0ZXMgdGhlIGludGVycnVwdCBvZiB0aW1lciAyICovCi0JCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJCWlfUmVnVmFsdWUgPSAoaV9SZWdWYWx1ZSAmIDB4MEYpIHwgMHgyMDsKIAkJCW91dGIoaV9SZWdWYWx1ZSwKIAkJCQlkZXZwcml2LT5pb2Jhc2UgKwpAQCAtMjgxNCwyMyArMjE5MiwxNyBAQAogCQkJaV9JbnRlcnJ1cHRNYXNrID0gaV9JbnRlcnJ1cHRNYXNrIHwgODsKIAkJfQkJLyogIGlmICgoaV9SZWdWYWx1ZSAmIDB4NjApID09IDB4NjApICovCiAKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMyAqLwotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCQlpX1JlZ1ZhbHVlID0KIAkJCWluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkJaWYgKChpX1JlZ1ZhbHVlICYgMHg2MCkgPT0gMHg2MCkgewotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMyAqLwotCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIzX0NNRF9TVEFUVVMsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsKIAkJCQlBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJLyogRGVsZXRlcyB0aGUgaW50ZXJydXB0IG9mIHRpbWVyIDMgKi8KLQkJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkJaV9SZWdWYWx1ZSA9IChpX1JlZ1ZhbHVlICYgMHgwRikgfCAweDIwOwogCQkJb3V0YihpX1JlZ1ZhbHVlLAogCQkJCWRldnByaXYtPmlvYmFzZSArCkBAIC0yODQ0LDQyICsyMjE2LDIzIEBACiAJCX0JCS8qICBpZiAoKGlfUmVnVmFsdWUgJiAweDYwKSA9PSAweDYwKSAqLwogCiAJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CS8qICBzZW5kIHNpZ25hbCB0byB0aGUgc2FtcGxlICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogRW5hYmxlIGFsbCBJbnRlcnJ1cHRzICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KIAotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2VsZWN0cyB0aGUgbWFzdGVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogQXV0aG9yaXplcyB0aGUgbWFpbiBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCi0JICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlvdXRiKDB4RDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCX0JCQkvKiAgIGlmICgodWlfSW50ZXJydXB0U3RhdHVzICYgMHg4MDAwMDApID09IDB4ODAwMDAwKSAqLwogCWVsc2UgewotCQlwcmludGsoIlxuSW50ZXJydXB0IGZyb20gdW5rbm93biBzb3VyY2VcbiIpOworCQlkZXZfd2FybihkZXYtPmh3X2RldiwKKwkJCSJJbnRlcnJ1cHQgZnJvbSB1bmtub3duIHNvdXJjZVxuIik7CiAKIAl9CQkJLyogZWxzZSBpZiAoKHVpX0ludGVycnVwdFN0YXR1cyAmIDB4ODAwMDAwKSA9PSAweDgwMDAwMCkgKi8KIAlyZXR1cm47CiB9CiAKLS8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTUwMF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDpyZXNldHMgYWxsIHRoZSByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTUwMF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMTUwMF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGlfRHVtbXlSZWFkID0gMDsKQEAgLTI4OTgsOSArMjI1MSw3IEBACiAJaV9UaW1lckNvdW50ZXIyRW5hYmxlZCA9IDA7CiAJaV9XYXRjaGRvZ0NvdW50ZXIzRW5hYmxlZCA9IDA7CiAKLSAgICAvKioqKioqKioqKioqKioqKioqLwogCS8qIFNvZnR3YXJlIHJlc2V0ICovCi0gICAgLyoqKioqKioqKioqKioqKioqKi8KIAlpX0R1bW15UmVhZCA9IGluYihkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCWlfRHVtbXlSZWFkID0gaW5iKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwpAQCAtMjkwOCwxNiArMjI1OSwxMiBAQAogCW91dGIoMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgY29uZmlndXJhdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfTUFTVEVSX0NPTkZJR1VSQVRJT05fQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweEY0LCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtb2RlIHNwZWNpZmljYXRpb24gcmVnaXN0ZXIgb2YgcG9ydCBBICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9BX1NQRUNJRklDQVRJT04sCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCW91dGIoMHgxMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CkBAIC0yOTQ5LDkgKzIyOTYsNyBAQAogCS8qIERlbGV0ZXMgdGhlIHJlZ2lzdGVyICovCiAJb3V0YigwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uIHJlZ2lzdGVyIG9mIHBvcnQgQiAqLwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0JfU1BFQ0lGSUNBVElPTiwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJb3V0YigweDEwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKQEAgLTI5ODEsOSArMjMyNiw3IEBACiAJLyogRGVsZXRlcyB0aGUgcmVnaXN0ZXIgKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGRhdGEgcGF0aCBwb2xhcml0eSByZWdpc3RlciBvZiBwb3J0IEMgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0NfREFUQV9QQ0lUQ0hfUE9MQVJJVFksCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIEhpZ2ggbGV2ZWwgb2YgcG9ydCBDIG1lYW5zIDEgKi8KQEAgLTI5OTgsOSArMjM0MSw3IEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgaXQgKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjFfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0zMDEwLDkgKzIzNTEsNyBAQAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKIAkvKiBEZWFjdGl2YXRlcyB0aGUgaW50ZXJydXB0IG1hbmFnZW1lbnQgb2YgdGltZXIgMSAgICAgICAgICovCiAJb3V0YigweEUwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAyICovCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgSVAgYW5kIElVUyAqLwpAQCAtMzAyMiw5ICsyMzYxLDcgQEAKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVhY3RpdmF0ZXMgVGltZXIgMiBpbnRlcnJ1cHQgbWFuYWdlbWVudDogICAgICAgICAgICAgICAqLwogCW91dGIoMHhFMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiB0aW1lciAzICovCi0JICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJLyogRGVsZXRlcyBJUCBhbmQgSVVTICovCkBAIC0zMDM0LDcxICsyMzcxLDQzIEBACiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlYWN0aXZhdGVzIGludGVycnVwdCBtYW5hZ2VtZW50IG9mIHRpbWVyIDM6ICAgICAgICAgICAgKi8KIAlvdXRiKDB4RTAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19NQVNURVJfSU5URVJSVVBUX0NPTlRST0wsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIERlbGV0ZXMgYWxsIGludGVycnVwdHMgKi8KIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwogCS8qIHJlc2V0IGFsbCB0aGUgZGlnaXRhbCBvdXRwdXRzICovCiAJb3V0dygweDAsIGRldnByaXYtPmlfSW9iYXNlQWRkb24gKyBBUENJMTUwMF9ESUdJVEFMX09QKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGlzYWJsZSB0aGUgYm9hcmQgaW50ZXJydXB0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX01BU1RFUl9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFNlbGVjdHMgdGhlIGNvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlciBvZiBwb3J0IEEgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19QT1JUX0FfQ09NTUFORF9BTkRfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVhY3RpdmF0ZXMgYWxsIGludGVycnVwdHMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweDAwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgcG9ydCBCICovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfUE9SVF9CX0NPTU1BTkRfQU5EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHgwMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDEgKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YihBUENJMTUwMF9SV19DUFRfVE1SMV9DTURfU1RBVFVTLAogCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGVhY3RpdmF0ZXMgYWxsIGludGVycnVwdHMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJb3V0YigweDAwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUwMF9aODUzNl9DT05UUk9MX1JFR0lTVEVSKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiBTZWxlY3RzIHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGltZXIgMiAqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKEFQQ0kxNTAwX1JXX0NQVF9UTVIyX0NNRF9TVEFUVVMsCiAJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWFjdGl2YXRlcyBhbGwgaW50ZXJydXB0cyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlvdXRiKDB4MDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTAwX1o4NTM2X0NPTlRST0xfUkVHSVNURVIpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU2VsZWN0cyB0aGUgY29tbWFuZCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRpbWVyIDMqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoQVBDSTE1MDBfUldfQ1BUX1RNUjNfQ01EX1NUQVRVUywKIAkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYWN0aXZhdGVzIGFsbCBpbnRlcnJ1cHRzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCW91dGIoMHgwMCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MDBfWjg1MzZfQ09OVFJPTF9SRUdJU1RFUik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMKaW5kZXggODQ2Njg1NC4uOWM4NmIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1NjQuYwpAQCAtMSw3NCArMSwzMiBAQAotLyoqCi1AdmVyYmF0aW0KLQotQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIEFEREktREFUQSBHbWJIIGZvciB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyBtb2R1bGUuCi0KLQlBRERJLURBVEEgR21iSAotCURpZXNlbHN0cmFzc2UgMwotCUQtNzc4MzMgT3R0ZXJzd2VpZXIKLQlUZWw6ICsxOSgwKTcyMjMvOTQ5My0wCi0JRmF4OiArNDkoMCk3MjIzLzk0OTMtOTIKLQlodHRwOi8vd3d3LmFkZGktZGF0YS5jb20KLQlpbmZvQGFkZGktZGF0YS5jb20KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1AZW5kdmVyYmF0aW0KLSovCiAvKgotCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAoQykgQURESS1EQVRBIEdtYkggICAgICAgICAgRGllc2Vsc3RyYcOfZSAzICAgICAgIEQtNzc4MzMgT3R0ZXJzd2VpZXIgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFRlbCA6ICs0OSAoMCkgNzIyMy85NDkzLTAgICAgIHwgZW1haWwgICAgOiBpbmZvQGFkZGktZGF0YS5jb20gICAgICAgICB8Ci0gIHwgRmF4IDogKzQ5ICgwKSA3MjIzLzk0OTMtOTIgICAgfCBJbnRlcm5ldCA6IGh0dHA6Ly93d3cuYWRkaS1kYXRhLmNvbSAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgICAgIDogQVBDSS0xNTY0ICAgICAgIHwgQ29tcGlsZXIgICA6IEdDQyAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgTW9kdWxlIG5hbWUgOiBod2Rydl9hcGNpMTU2NC5jfCBWZXJzaW9uICAgIDogMi45NiAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IFByb2plY3QgbWFuYWdlcjogRXJpYyBTdG9seiAgIHwgRGF0ZSAgICAgICA6ICAwMi8xMi8yMDAyICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBEZXNjcmlwdGlvbiA6ICAgSGFyZHdhcmUgTGF5ZXIgQWNjZXNzIEZvciBBUENJLTE1NjQgICAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8ICAgRGF0ZSAgIHwgICBBdXRob3IgIHwgICAgICAgICAgRGVzY3JpcHRpb24gb2YgdXBkYXRlcyAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotLyoqKioqKioqKiAgICAgIERlZmluaXRpb25zIGZvciBBUENJLTE1NjQgY2FyZCAgKioqKiovCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgQURESS1EQVRBIEdtYkggZm9yIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIG1vZHVsZS4KKyAqCisgKglBRERJLURBVEEgR21iSAorICoJRGllc2Vsc3RyYXNzZSAzCisgKglELTc3ODMzIE90dGVyc3dlaWVyCisgKglUZWw6ICsxOSgwKTcyMjMvOTQ5My0wCisgKglGYXg6ICs0OSgwKTcyMjMvOTQ5My05MgorICoJaHR0cDovL3d3dy5hZGRpLWRhdGEuY29tCisgKglpbmZvQGFkZGktZGF0YS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKi8KIAogI2RlZmluZSBBUENJMTU2NF9BRERSRVNTX1JBTkdFCQkJCTEyOAogCi0vKiBESUdJVEFMIElOUFVULU9VVFBVVCBERUZJTkUgKi8KLS8qIElucHV0IGRlZmluZXMgKi8KLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9JUAkJCQkweDA0Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUxCQk0Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUyCQk4Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRCQkJCTE2Ci0KLS8qIE91dHB1dCBkZWZpbmVzICovCi0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfT1AJCQkJMHgxOAotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QX1JXCQkJCTAKLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQJCQk0Ci0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfT1BfSVJRCQkJCTEyCi0KIC8qIERpZ2l0YWwgSW5wdXQgSVJRIEZ1bmN0aW9uIFNlbGVjdGlvbiAqLwogI2RlZmluZSBBRERJREFUQV9PUgkJCQkJMAogI2RlZmluZSBBRERJREFUQV9BTkQJCQkJCTEKIAotLyogRGlnaXRhbCBJbnB1dCBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX1NUQVRVUwkJMTIKLQotLyogRGlnaXRhbCBPdXRwdXQgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVF9TVEFUVVMJCTgKLQogLyogRGlnaXRhbCBJbnB1dCBJbnRlcnJ1cHQgRW5hYmxlIERpc2FibGUuICovCiAjZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX0VOQUJMRQkJMHg0CiAjZGVmaW5lIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX0RJU0FCTEUJCTB4ZmZmZmZmZmIKQEAgLTgwLDk4ICszOCw5MSBAQAogI2RlZmluZSBBUENJMTU2NF9ESUdJVEFMX09QX0NDX0lOVEVSUlVQVF9ESVNBQkxFCTB4ZmZmZmZmZmQKIAogLyogVElNRVIgQ09VTlRFUiBXQVRDSERPRyBERUZJTkVTICovCi0KICNkZWZpbmUgQURESURBVEFfVElNRVIJCQkJCTAKICNkZWZpbmUgQURESURBVEFfQ09VTlRFUgkJCQkxCiAjZGVmaW5lIEFERElEQVRBX1dBVENIRE9HCQkJCTIKLSNkZWZpbmUgQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRwkJCTB4MjgKLSNkZWZpbmUgQVBDSTE1NjRfVElNRVIJCQkJCTB4NDgKLSNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjEJCQkJMHgwCi0jZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIyCQkJCTB4MjAKLSNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjMJCQkJMHg0MAotI2RlZmluZSBBUENJMTU2NF9DT1VOVEVSNAkJCQkweDYwCi0jZGVmaW5lIEFQQ0kxNTY0X1RDV19TWU5DX0VOQUJMRURJU0FCTEUJCQkwCi0jZGVmaW5lIEFQQ0kxNTY0X1RDV19SRUxPQURfVkFMVUUJCQk0Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19USU1FQkFTRQkJCQk4Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19QUk9HCQkJCTEyCi0jZGVmaW5lIEFQQ0kxNTY0X1RDV19UUklHX1NUQVRVUwkJCTE2Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19JUlEJCQkJMjAKLSNkZWZpbmUgQVBDSTE1NjRfVENXX1dBUk5fVElNRVZBTAkJCTI0Ci0jZGVmaW5lIEFQQ0kxNTY0X1RDV19XQVJOX1RJTUVCQVNFCQkJMjgKKyNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjEJCQkJMAorI2RlZmluZSBBUENJMTU2NF9DT1VOVEVSMgkJCQkxCisjZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIzCQkJCTIKKyNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUjQJCQkJMworCisvKgorICogZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjIFJlZ2lzdGVyIE1hcAorICovCisjZGVmaW5lIEFQQ0kxNTY0X0RJX1JFRwkJCQkJMHgwNAorI2RlZmluZSBBUENJMTU2NF9ESV9JTlRfTU9ERTFfUkVHCQkJMHgwOAorI2RlZmluZSBBUENJMTU2NF9ESV9JTlRfTU9ERTJfUkVHCQkJMHgwYworI2RlZmluZSBBUENJMTU2NF9ESV9JTlRfU1RBVFVTX1JFRwkJCTB4MTAKKyNkZWZpbmUgQVBDSTE1NjRfRElfSVJRX1JFRwkJCQkweDE0CisjZGVmaW5lIEFQQ0kxNTY0X0RPX1JFRwkJCQkJMHgxOAorI2RlZmluZSBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcJCQkweDFjCisjZGVmaW5lIEFQQ0kxNTY0X0RPX0lOVF9TVEFUVVNfUkVHCQkJMHgyMAorI2RlZmluZSBBUENJMTU2NF9ET19JUlFfUkVHCQkJCTB4MjQKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19SRUcJCQkJMHgyOAorI2RlZmluZSBBUENJMTU2NF9XRE9HX1JFTE9BRF9SRUcJCQkweDJjCisjZGVmaW5lIEFQQ0kxNTY0X1dET0dfVElNRUJBU0VfUkVHCQkJMHgzMAorI2RlZmluZSBBUENJMTU2NF9XRE9HX0NUUkxfUkVHCQkJCTB4MzQKKyNkZWZpbmUgQVBDSTE1NjRfV0RPR19TVEFUVVNfUkVHCQkJMHgzOAorI2RlZmluZSBBUENJMTU2NF9XRE9HX0lSUV9SRUcJCQkJMHgzYworI2RlZmluZSBBUENJMTU2NF9XRE9HX1dBUk5fVElNRVZBTF9SRUcJCQkweDQwCisjZGVmaW5lIEFQQ0kxNTY0X1dET0dfV0FSTl9USU1FQkFTRV9SRUcJCQkweDQ0CisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1JFRwkJCQkweDQ4CisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1JFTE9BRF9SRUcJCQkweDRjCisjZGVmaW5lIEFQQ0kxNTY0X1RJTUVSX1RJTUVCQVNFX1JFRwkJCTB4NTAKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcJCQkJMHg1NAorI2RlZmluZSBBUENJMTU2NF9USU1FUl9TVEFUVVNfUkVHCQkJMHg1OAorI2RlZmluZSBBUENJMTU2NF9USU1FUl9JUlFfUkVHCQkJCTB4NWMKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfV0FSTl9USU1FVkFMX1JFRwkJCTB4NjAKKyNkZWZpbmUgQVBDSTE1NjRfVElNRVJfV0FSTl9USU1FQkFTRV9SRUcJCTB4NjQKKworLyoKKyAqIGRldnByaXYtPmlvYmFzZSBSZWdpc3RlciBNYXAKKyAqLworI2RlZmluZSBBUENJMTU2NF9UQ1dfUkVHKHgpCQkJCSgweDAwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfUkVMT0FEX1JFRyh4KQkJCSgweDA0ICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfVElNRUJBU0VfUkVHKHgpCQkJKDB4MDggKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyh4KQkJCSgweDBjICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfU1RBVFVTX1JFRyh4KQkJCSgweDEwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfSVJRX1JFRyh4KQkJCQkoMHgxNCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgQVBDSTE1NjRfVENXX1dBUk5fVElNRVZBTF9SRUcoeCkJCSgweDE4ICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBBUENJMTU2NF9UQ1dfV0FSTl9USU1FQkFTRV9SRUcoeCkJCSgweDFjICsgKCh4KSAqIDB4MjApKQogCiAvKiBHbG9iYWwgdmFyaWFibGVzICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHVpX0ludGVycnVwdFN0YXR1c18xNTY0ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdWlfSW50ZXJydXB0U3RhdHVzXzE1NjQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHVpX0ludGVycnVwdERhdGEsIHVpX1R5cGU7CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9Db25maWdEaWdpdGFsSW5wdXQgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IENvbmZpZ3VyZXMgdGhlIGRpZ2l0YWwgaW5wdXQgU3ViZGV2aWNlICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICBkYXRhWzBdICAgICAgICAgICAgOiAxIEVuYWJsZSAgRGlnaXRhbCBJbnB1dCBJbnRlcnJ1cHQgfAotfAkJCQkJCQkJICAgMCBEaXNhYmxlIERpZ2l0YWwgSW5wdXQgSW50ZXJydXB0IHwKLXwJCQkgIGRhdGFbMV0gICAgICAgICAgICA6IDAgQURESURBVEEgSW50ZXJydXB0IE9SIExPR0lDCSB8Ci18CQkJCQkJCQkgOiAxIEFERElEQVRBIEludGVycnVwdCBBTkQgTE9HSUMgICAgfAotfAkJCSAgZGF0YVsyXQkJCSA6IEludGVycnVwdCBtYXNrIGZvciB0aGUgbW9kZSAxCSB8Ci18CQkJICBkYXRhWzNdCQkJIDogSW50ZXJydXB0IG1hc2sgZm9yIHRoZSBtb2RlIDIJIHwKLXwJCQkJCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIHRoZSBkaWdpdGFsIGlucHV0IFN1YmRldmljZQorICoKKyAqIGRhdGFbMF0gMSA9IEVuYWJsZSBpbnRlcnJ1cHQsIDAgPSBEaXNhYmxlIGludGVycnVwdAorICogZGF0YVsxXSAwID0gQURESURBVEEgSW50ZXJydXB0IE9SIExPR0lDLCAxID0gQURESURBVEEgSW50ZXJydXB0IEFORCBMT0dJQworICogZGF0YVsyXSBJbnRlcnJ1cHQgbWFzayBmb3IgdGhlIG1vZGUgMQorICogZGF0YVszXSBJbnRlcnJ1cHQgbWFzayBmb3IgdGhlIG1vZGUgMgorICovCitzdGF0aWMgaW50IGFwY2kxNTY0X2RpX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAogCWRldnByaXYtPnRza19DdXJyZW50ID0gY3VycmVudDsKLSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJLyogU2V0IHRoZSBkaWdpdGFsIGlucHV0IGxvZ2ljICovCi0gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAlpZiAoZGF0YVswXSA9PSBBRERJREFUQV9FTkFCTEUpIHsKIAkJZGF0YVsyXSA9IGRhdGFbMl0gPDwgNDsKIAkJZGF0YVszXSA9IGRhdGFbM10gPDwgNDsKLQkJb3V0bChkYXRhWzJdLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMSk7Ci0JCW91dGwoZGF0YVszXSwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JTlRFUlJVUFRfTU9ERTIpOwotCQlpZiAoZGF0YVsxXSA9PSBBRERJREFUQV9PUikgewotCQkJb3V0bCgweDQsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOwotCQl9CQkvKiAgaWYgIChkYXRhWzFdID09IEFERElEQVRBX09SKSAqLwotCQllbHNlIHsKLQkJCW91dGwoMHg2LAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVAgKwotCQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsKLQkJfQkJLyogIGVsc2UgaWYgIChkYXRhWzFdID09IEFERElEQVRBX09SKSAqLwotCX0JCQkvKiAgaWYgIChkYXRhWzBdID09IEFERElEQVRBX0VOQUJMRSkgKi8KLQllbHNlIHsKLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUxKTsKLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUyKTsKLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdID09IEFERElEQVRBX0VOQUJMRSkgKi8KKwkJb3V0bChkYXRhWzJdLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTFfUkVHKTsKKwkJb3V0bChkYXRhWzNdLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTJfUkVHKTsKKwkJaWYgKGRhdGFbMV0gPT0gQURESURBVEFfT1IpCisJCQlvdXRsKDB4NCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CisJCWVsc2UKKwkJCW91dGwoMHg2LCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwl9IGVsc2UgeworCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUxX1JFRyk7CisJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTJfUkVHKTsKKwkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lSUV9SRUcpOworCX0KIAogCXJldHVybiBpbnNuLT5uOwogfQpAQCAtMTgzLDQwICsxMzQsMjEgQEAKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0JZGF0YVsxXSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQKTsKKwlkYXRhWzFdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX1JFRyk7CiAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6IGludCBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxPdXRwdXQgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogQ29uZmlndXJlcyBUaGUgRGlnaXRhbCBPdXRwdXQgU3ViZGV2aWNlLiAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgOiBEcml2ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSAgICAgICAgIDogRGF0YSBQb2ludGVyIGNvbnRhaW5zICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgYmVsb3cgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkJCQkgIGRhdGFbMV0gICAgICAgICAgICA6IDEgRW5hYmxlICBWQ0MgIEludGVycnVwdCAgfAotfAkJCQkJCQkJCQkgICAwIERpc2FibGUgVkNDICBJbnRlcnJ1cHQgIHwKLXwJCQkJCSAgZGF0YVsyXSAgICAgICAgICAgIDogMSBFbmFibGUgIENDICBJbnRlcnJ1cHQgICB8Ci18CQkJCQkJCQkJCSAgIDAgRGlzYWJsZSBDQyAgSW50ZXJydXB0ICAgfAotfAkJCQkJCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgaW50IGlfQVBDSTE1NjRfQ29uZmlnRGlnaXRhbE91dHB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIFRoZSBEaWdpdGFsIE91dHB1dCBTdWJkZXZpY2UuCisgKgorICogZGF0YVsxXSAwID0gRGlzYWJsZSBWQ0MgSW50ZXJydXB0LCAxID0gRW5hYmxlIFZDQyBJbnRlcnJ1cHQKKyAqIGRhdGFbMl0gMCA9IERpc2FibGUgQ0MgSW50ZXJydXB0LCAxID0gRW5hYmxlIENDIEludGVycnVwdAorICovCitzdGF0aWMgaW50IGFwY2kxNTY0X2RvX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZCA9IDA7CkBAIC0yMjUsMzEgKzE1NywyNSBAQAogCQljb21lZGlfZXJyb3IoZGV2LAogCQkJIk5vdCBhIHZhbGlkIERhdGEgISEhICxEYXRhIHNob3VsZCBiZSAxIG9yIDBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CQkJLyogIGlmICAoKGRhdGFbMF0hPTApICYmIChkYXRhWzBdIT0xKSkgKi8KLQlpZiAoZGF0YVswXSkgeworCX0KKworCWlmIChkYXRhWzBdKQogCQlkZXZwcml2LT5iX091dHB1dE1lbW9yeVN0YXR1cyA9IEFERElEQVRBX0VOQUJMRTsKLQl9CQkJLyogIGlmICAoZGF0YVswXSkgKi8KLQllbHNlIHsKKwllbHNlCiAJCWRldnByaXYtPmJfT3V0cHV0TWVtb3J5U3RhdHVzID0gQURESURBVEFfRElTQUJMRTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdKSAqLwotCWlmIChkYXRhWzFdID09IEFERElEQVRBX0VOQUJMRSkgeworCisJaWYgKGRhdGFbMV0gPT0gQURESURBVEFfRU5BQkxFKQogCQl1bF9Db21tYW5kID0gdWxfQ29tbWFuZCB8IDB4MTsKLQl9CQkJLyogIGlmICAoZGF0YVsxXSA9PSBBRERJREFUQV9FTkFCTEUpICovCi0JZWxzZSB7CisJZWxzZQogCQl1bF9Db21tYW5kID0gdWxfQ29tbWFuZCAmIDB4RkZGRkZGRkU7Ci0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVsxXSA9PSBBRERJREFUQV9FTkFCTEUpICovCi0JaWYgKGRhdGFbMl0gPT0gQURESURBVEFfRU5BQkxFKSB7CisKKwlpZiAoZGF0YVsyXSA9PSBBRERJREFUQV9FTkFCTEUpCiAJCXVsX0NvbW1hbmQgPSB1bF9Db21tYW5kIHwgMHgyOwotCX0JCQkvKiAgaWYgIChkYXRhWzJdID09IEFERElEQVRBX0VOQUJMRSkgKi8KLQllbHNlIHsKKwllbHNlCiAJCXVsX0NvbW1hbmQgPSB1bF9Db21tYW5kICYgMHhGRkZGRkZGRDsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzJdID09IEFERElEQVRBX0VOQUJMRSkgKi8KLQlvdXRsKHVsX0NvbW1hbmQsCi0JCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1AgKwotCQlBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVCk7Ci0JdWlfSW50ZXJydXB0RGF0YSA9Ci0JCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQpOworCisJb3V0bCh1bF9Db21tYW5kLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcpOworCXVpX0ludGVycnVwdERhdGEgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSU5UX0NUUkxfUkVHKTsKIAlkZXZwcml2LT50c2tfQ3VycmVudCA9IGN1cnJlbnQ7CiAJcmV0dXJuIGluc24tPm47CiB9CkBAIC0yNjEsMTIgKzE4NywxMCBAQAogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlzLT5zdGF0ZSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfT1BfUlcpOworCXMtPnN0YXRlID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX1JFRyk7CiAKIAlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpCi0JCW91dGwocy0+c3RhdGUsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfT1AgKwotCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9SVyk7CisJCW91dGwocy0+c3RhdGUsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RPX1JFRyk7CiAKIAlkYXRhWzFdID0gcy0+c3RhdGU7CiAKQEAgLTI3NCwzOSArMTk4LDIwIEBACiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9Db25maWdUaW1lckNvdW50ZXJXYXRjaGRvZyAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IENvbmZpZ3VyZXMgVGhlIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzBdICAgICAgICAgICAgOiAwIENvbmZpZ3VyZSBBcyBUaW1lciAgICAgIHwKLXwJCQkJCQkJCQkJICAgMSBDb25maWd1cmUgQXMgQ291bnRlciAgICB8Ci18CQkJCQkJCQkJCSAgIDIgQ29uZmlndXJlIEFzIFdhdGNoZG9nICAgfAotfAkJCQkJICBkYXRhWzFdICAgICAgICAgICAgOiAxIEVuYWJsZSAgSW50ZXJydXB0ICAgICAgIHwKLXwJCQkJCQkJCQkJICAgMCBEaXNhYmxlIEludGVycnVwdCAJICAgICB8Ci18CQkJCQkgIGRhdGFbMl0gICAgICAgICAgICA6IFRpbWUgVW5pdCAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzNdCQkJIDogUmVsb2FkIFZhbHVlCQkJICAgICB8Ci18CQkJCQkgIGRhdGFbNF0gICAgICAgICAgICA6IFRpbWVyIE1vZGUgICAgICAgICAgICAgCSB8Ci18CQkJCQkgIGRhdGFbNV0JCQkgOiBUaW1lciBDb3VudGVyIFdhdGNoZG9nIE51bWJlcnwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNl0gICAgICAgICAgICA6ICBDb3VudGVyIERpcmVjdGlvbgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9Db25maWdUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBDb25maWd1cmVzIFRoZSBUaW1lciwgQ291bnRlciBvciBXYXRjaGRvZworICoKKyAqIGRhdGFbMF0gQ29uZmlndXJlIGFzOiAwID0gVGltZXIsIDEgPSBDb3VudGVyLCAyID0gV2F0Y2hkb2cKKyAqIGRhdGFbMV0gMSA9IEVuYWJsZSBJbnRlcnJ1cHQsIDAgPSBEaXNhYmxlIEludGVycnVwdAorICogZGF0YVsyXSBUaW1lIFVuaXQKKyAqIGRhdGFbM10gUmVsb2FkIFZhbHVlCisgKiBkYXRhWzRdIFRpbWVyIE1vZGUKKyAqIGRhdGFbNV0gVGltZXIgQ291bnRlciBXYXRjaGRvZyBOdW1iZXIKKyAqIGRhdGFbNl0gQ291bnRlciBEaXJlY3Rpb24KKyAqLworc3RhdGljIGludCBhcGNpMTU2NF90aW1lcl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKQEAgLTMxNiw4OSArMjIxLDU5IEBACiAJCWRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID0gQURESURBVEFfV0FUQ0hET0c7CiAKIAkJLyogRGlzYWJsZSB0aGUgd2F0Y2hkb2cgKi8KLQkJb3V0bCgweDAsCi0JCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1dET0dfQ1RSTF9SRUcpOwogCQkvKiBMb2FkaW5nIHRoZSBSZWxvYWQgdmFsdWUgKi8KLQkJb3V0bChkYXRhWzNdLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCQlBUENJMTU2NF9UQ1dfUkVMT0FEX1ZBTFVFKTsKLQl9CQkJLyogIGlmICAoZGF0YVswXT09QURESURBVEFfV0FUQ0hET0cpICovCi0JZWxzZSBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9USU1FUikgeworCQlvdXRsKGRhdGFbM10sIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1dET0dfUkVMT0FEX1JFRyk7CisJfSBlbHNlIGlmIChkYXRhWzBdID09IEFERElEQVRBX1RJTUVSKSB7CiAJCS8qIEZpcnN0IFN0b3AgVGhlIFRpbWVyICovCi0JCXVsX0NvbW1hbmQxID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCXVsX0NvbW1hbmQxID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKIAkJdWxfQ29tbWFuZDEgPSB1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkVVTDsKLQkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CS8qIFN0b3AgVGhlIFRpbWVyICovCisJCS8qIFN0b3AgVGhlIFRpbWVyICovCisJCW91dGwodWxfQ29tbWFuZDEsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKIAogCQlkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9IEFERElEQVRBX1RJTUVSOwogCQlpZiAoZGF0YVsxXSA9PSAxKSB7Ci0JCQlvdXRsKDB4MDIsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBFbmFibGUgVElNRVIgaW50ICYgRElTQUJMRSBBTEwgVEhFIE9USEVSIGludCBTT1VSQ0VTICovCisJCQkvKiBFbmFibGUgVElNRVIgaW50ICYgRElTQUJMRSBBTEwgVEhFIE9USEVSIGludCBTT1VSQ0VTICovCisJCQlvdXRsKDB4MDIsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JUlFfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX0lSUV9SRUcpOwogCQkJb3V0bCgweDAsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOworCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19JUlFfUkVHKEFQQ0kxNTY0X0NPVU5URVIxKSk7CiAJCQlvdXRsKDB4MCwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QICsKLQkJCQlBUENJMTU2NF9ESUdJVEFMX09QX0lSUSk7CisJCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjIpKTsKIAkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArCi0JCQkJQVBDSTE1NjRfRElHSVRBTF9PUF9XQVRDSERPRyArCi0JCQkJQVBDSTE1NjRfVENXX0lSUSk7CisJCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjMpKTsKIAkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIxICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIyICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIzICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJCW91dGwoMHgwLAotCQkJCWRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVI0ICsKLQkJCQlBUENJMTU2NF9UQ1dfSVJRKTsKLQkJfQkJLyogIGlmICAoZGF0YVsxXT09MSkgKi8KLQkJZWxzZSB7Ci0JCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CS8qIGRpc2FibGUgVGltZXIgaW50ZXJydXB0ICovCi0JCX0JCS8qICBlbHNlIGlmICAoZGF0YVsxXT09MSkgKi8KKwkJCQlkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpOworCQl9IGVsc2UgeworCQkJLyogZGlzYWJsZSBUaW1lciBpbnRlcnJ1cHQgKi8KKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCX0KIAogCQkvKiAgTG9hZGluZyBUaW1lYmFzZSAqLwotCi0JCW91dGwoZGF0YVsyXSwKLQkJCWRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCUFQQ0kxNTY0X1RDV19USU1FQkFTRSk7CisJCW91dGwoZGF0YVsyXSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfVElNRUJBU0VfUkVHKTsKIAogCQkvKiBMb2FkaW5nIHRoZSBSZWxvYWQgdmFsdWUgKi8KLQkJb3V0bChkYXRhWzNdLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJQVBDSTE1NjRfVENXX1JFTE9BRF9WQUxVRSk7CisJCW91dGwoZGF0YVszXSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfUkVMT0FEX1JFRyk7CiAKLQkJdWxfQ29tbWFuZDEgPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKLQkJdWxfQ29tbWFuZDEgPQotCQkJKHVsX0NvbW1hbmQxICYgMHhGRkY3MTlFMlVMKSB8IDJVTCA8PCAxM1VMIHwgMHgxMFVMOwotCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArIEFQQ0kxNTY0X1RDV19QUk9HKTsJLyogbW9kZSAyICovCi0JfQkJCS8qICBlbHNlIGlmICAoZGF0YVswXT09QURESURBVEFfVElNRVIpICovCi0JZWxzZSBpZiAoZGF0YVswXSA9PSBBRERJREFUQV9DT1VOVEVSKSB7CisJCXVsX0NvbW1hbmQxID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKKwkJdWxfQ29tbWFuZDEgPSAodWxfQ29tbWFuZDEgJiAweEZGRjcxOUUyVUwpIHwgMlVMIDw8IDEzVUwgfCAweDEwVUw7CisJCS8qIG1vZGUgMiAqLworCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJfSBlbHNlIGlmIChkYXRhWzBdID09IEFERElEQVRBX0NPVU5URVIpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwogCQlkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciA9IGRhdGFbNV07CiAKIAkJLyogRmlyc3QgU3RvcCBUaGUgQ291bnRlciAqLwotCQl1bF9Db21tYW5kMSA9Ci0JCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChkYXRhWzVdIC0gMSkgKiAweDIwKSArCi0JCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCXVsX0NvbW1hbmQxID0gaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkYXRhWzVdIC0gMSkpOwogCQl1bF9Db21tYW5kMSA9IHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRVVMOwotCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBTdG9wIFRoZSBUaW1lciAqLworCQkvKiBTdG9wIFRoZSBUaW1lciAqLworCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoZGF0YVs1XSAtIDEpKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSByZWxvYWQgdmFsdWUgKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCi0JCW91dGwoZGF0YVszXSwKLQkJCWRldnByaXYtPmlvYmFzZSArICgoZGF0YVs1XSAtIDEpICogMHgyMCkgKwotCQkJQVBDSTE1NjRfVENXX1JFTE9BRF9WQUxVRSk7CisJCW91dGwoZGF0YVszXSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX1JFTE9BRF9SRUcoZGF0YVs1XSAtIDEpKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSBtb2RlIDogICAgICAgICAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBoYXJkd2FyZSAgICAgKi8KIAkJLyogLSBEaXNhYmxlIHRoZSBjb3VudGVyIG1vZGUgKi8KQEAgLTQwNiw2NSArMjgxLDM2IEBACiAJCS8qIC0gRGlzYWJsZSB0aGUgcmVzZXQgICAgICAgICovCiAJCS8qIC0gRGlzYWJsZSB0aGUgdGltZXIgbW9kZSAgICovCiAJCS8qIC0gRW5hYmxlIHRoZSBjb3VudGVyIG1vZGUgICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAJCXVsX0NvbW1hbmQxID0KIAkJCSh1bF9Db21tYW5kMSAmIDB4RkZGQzE5RTJVTCkgfCAweDgwMDAwVUwgfAogCQkJKHVuc2lnbmVkIGludCkgKCh1bnNpZ25lZCBpbnQpIGRhdGFbNF0gPDwgMTZVTCk7Ci0JCW91dGwodWxfQ29tbWFuZDEsCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRhdGFbNV0gLSAxKSk7CiAKIAkJLyogIEVuYWJsZSBvciBEaXNhYmxlIEludGVycnVwdCAqLwogCQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkQpIHwgKGRhdGFbMV0gPDwgMSk7Ci0JCW91dGwodWxfQ29tbWFuZDEsCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRhdGFbNV0gLSAxKSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogU2V0IHRoZSBVcC9Eb3duIHNlbGVjdGlvbiAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGQkY5RkZVTCkgfCAoZGF0YVs2XSA8PCAxOCk7Ci0JCW91dGwodWxfQ29tbWFuZDEsCi0JCQlkZXZwcml2LT5pb2Jhc2UgKyAoKGRhdGFbNV0gLSAxKSAqIDB4MjApICsKLQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdPT1BRERJREFUQV9DT1VOVEVSKSAqLwotCWVsc2UgewotCQlwcmludGsoIiBJbnZhbGlkIHN1YmRldmljZS4iKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkYXRhWzBdPT1BRERJREFUQV9XQVRDSERPRykgKi8KKwkJb3V0bCh1bF9Db21tYW5kMSwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRhdGFbNV0gLSAxKSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJfQogCiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFN0YXJ0IC8gU3RvcCBUaGUgU2VsZWN0ZWQgVGltZXIgLCBDb3VudGVyIG9yIFdhdGNoZG9nICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJICBkYXRhWzBdICAgICAgICAgICAgOiAwIFRpbWVyICAgICAgICAgICAgICAgICAgIHwKLXwJCQkJCQkJCQkJICAgMSBDb3VudGVyICAgICAgICAgICAgICAgICB8Ci18CQkJCQkJCQkJCSAgIDIgV2F0Y2hkb2cgICAgICAgIAkJIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwJCQkJCSAgICAgICAgIGRhdGFbMV0gICAgICAgICAgICA6IDEgU3RhcnQgICAgICAgICAgICAgICAgICAgfAotfAkJCQkJCQkJCQkgICAwIFN0b3AgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgVHJpZ2dlciAgICAgICAgICAgICAJIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXIgKE9ubHkgQ291bnRlcikgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IE91dHB1dCBQYXJhbWV0ZXJzIDoJLS0JCQkJCQkJCQkJCQkJIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBSZXR1cm4gVmFsdWUgICAgICA6IFRSVUUgIDogTm8gZXJyb3Igb2NjdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18CQkgICAgICAgICAgICA6IEZBTFNFIDogRXJyb3Igb2NjdXIuIFJldHVybiB0aGUgZXJyb3IgICAgICAgICAgfAotfAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFN0YXJ0IC8gU3RvcCBUaGUgU2VsZWN0ZWQgVGltZXIsIENvdW50ZXIgb3IgV2F0Y2hkb2cKKyAqCisgKiBkYXRhWzBdIENvbmZpZ3VyZSBhczogMCA9IFRpbWVyLCAxID0gQ291bnRlciwgMiA9IFdhdGNoZG9nCisgKiBkYXRhWzFdIDAgPSBTdG9wLCAxID0gU3RhcnQsIDIgPSBUcmlnZ2VyIENsZWFyIChPbmx5IENvdW50ZXIpCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1NjRfdGltZXJfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKQEAgLTQ3MiwyMDMgKzMxOCwxMjIgQEAKIAlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKIAkJc3dpdGNoIChkYXRhWzFdKSB7CiAJCWNhc2UgMDoJLyogc3RvcCB0aGUgd2F0Y2hkb2cgKi8KLQkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsgQVBDSTE1NjRfVENXX1BST0cpOwkvKiBkaXNhYmxlIHRoZSB3YXRjaGRvZyAqLworCQkJLyogZGlzYWJsZSB0aGUgd2F0Y2hkb2cgKi8KKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX0NUUkxfUkVHKTsKIAkJCWJyZWFrOwogCQljYXNlIDE6CS8qIHN0YXJ0IHRoZSB3YXRjaGRvZyAqLwotCQkJb3V0bCgweDAwMDEsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsKLQkJCQlBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQlvdXRsKDB4MDAwMSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19DVFJMX1JFRyk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgkvKiBTb2Z0d2FyZSB0cmlnZ2VyICovCi0JCQlvdXRsKDB4MDIwMSwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKwotCQkJCUFQQ0kxNTY0X0RJR0lUQUxfT1BfV0FUQ0hET0cgKwotCQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCW91dGwoMHgwMjAxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX0NUUkxfUkVHKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJcblNwZWNpZmllZCBmdW5jdGlvbmFsaXR5IGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJTcGVjaWZpZWQgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBleGlzdC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0JCS8qICBzd2l0Y2ggKGRhdGFbMV0pICovCi0JfQkJCS8qICBpZiAgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9XQVRDSERPRykgKi8KKwkJfQorCX0KIAlpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfVElNRVIpIHsKIAkJaWYgKGRhdGFbMV0gPT0gMSkgewotCQkJdWxfQ29tbWFuZDEgPQotCQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkJQVBDSTE1NjRfVENXX1BST0cpOworCQkJdWxfQ29tbWFuZDEgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfQ1RSTF9SRUcpOwogCQkJdWxfQ29tbWFuZDEgPSAodWxfQ29tbWFuZDEgJiAweEZGRkZGOUZGVUwpIHwgMHgxVUw7CiAKIAkJCS8qIEVuYWJsZSB0aGUgVGltZXIgKi8KLQkJCW91dGwodWxfQ29tbWFuZDEsCi0JCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJCUFQQ0kxNTY0X1RDV19QUk9HKTsKLQkJfQkJLyogIGlmICAoZGF0YVsxXT09MSkgKi8KLQkJZWxzZSBpZiAoZGF0YVsxXSA9PSAwKSB7CisJCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCX0gZWxzZSBpZiAoZGF0YVsxXSA9PSAwKSB7CiAJCQkvKiBTdG9wIFRoZSBUaW1lciAqLwogCi0JCQl1bF9Db21tYW5kMSA9Ci0JCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCQlBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQl1bF9Db21tYW5kMSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAJCQl1bF9Db21tYW5kMSA9IHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRVVMOwotCQkJb3V0bCh1bF9Db21tYW5kMSwKLQkJCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkJQVBDSTE1NjRfVENXX1BST0cpOwotCQl9CQkvKiAgZWxzZSBpZihkYXRhWzFdPT0wKSAqLwotCX0JCQkvKiAgaWYgIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZT09QURESURBVEFfVElNRVIpICovCisJCQlvdXRsKHVsX0NvbW1hbmQxLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CisJCX0KKwl9CiAJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX0NPVU5URVIpIHsKIAkJdWxfQ29tbWFuZDEgPQotCQkJaW5sKGRldnByaXYtPmlvYmFzZSArICgoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLQotCQkJCQkxKSAqIDB4MjApICsgQVBDSTE1NjRfVENXX1BST0cpOworCQkJaW5sKGRldnByaXYtPmlvYmFzZSArCisJCQkJQVBDSTE1NjRfVENXX0NUUkxfUkVHKGRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyIC0gMSkpOwogCQlpZiAoZGF0YVsxXSA9PSAxKSB7CiAJCQkvKiBTdGFydCB0aGUgQ291bnRlciBzdWJkZXZpY2UgKi8KIAkJCXVsX0NvbW1hbmQxID0gKHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRlVMKSB8IDB4MVVMOwotCQl9CQkvKiAgaWYgIChkYXRhWzFdID09IDEpICovCi0JCWVsc2UgaWYgKGRhdGFbMV0gPT0gMCkgeworCQl9IGVsc2UgaWYgKGRhdGFbMV0gPT0gMCkgewogCQkJLyogIFN0b3BzIHRoZSBDb3VudGVyIHN1YmRldmljZSAqLwogCQkJdWxfQ29tbWFuZDEgPSAwOwogCi0JCX0JCS8qICBlbHNlIGlmICAoZGF0YVsxXSA9PSAwKSAqLwotCQllbHNlIGlmIChkYXRhWzFdID09IDIpIHsKKwkJfSBlbHNlIGlmIChkYXRhWzFdID09IDIpIHsKIAkJCS8qICBDbGVhcnMgdGhlIENvdW50ZXIgc3ViZGV2aWNlICovCiAJCQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkZVTCkgfCAweDQwMDsKLQkJfQkJLyogIGVsc2UgaWYgIChkYXRhWzFdID09IDMpICovCisJCX0KIAkJb3V0bCh1bF9Db21tYW5kMSwKLQkJCWRldnByaXYtPmlvYmFzZSArICgoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLQotCQkJCQkxKSAqIDB4MjApICsgQVBDSTE1NjRfVENXX1BST0cpOwotCX0JCQkvKiAgaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlPT1BRERJREFUQV9DT1VOVEVSKSAqLworCQkJZGV2cHJpdi0+aW9iYXNlICsKKwkJCUFQQ0kxNTY0X1RDV19DVFJMX1JFRyhkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtIDEpKTsKKwl9CiAJcmV0dXJuIGluc24tPm47CiB9CiAKIC8qCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgRnVuY3Rpb24gICBOYW1lICAgOiBpbnQgaV9BUENJMTU2NF9SZWFkVGltZXJDb3VudGVyV2F0Y2hkb2cgICAgICAgICAgICAgICAgfAotfAkJCSAgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6IFJlYWQgVGhlIFNlbGVjdGVkIFRpbWVyICwgQ291bnRlciBvciBXYXRjaGRvZyAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2IDogRHJpdmVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEgICAgICAgICA6IERhdGEgUG9pbnRlciBjb250YWlucyAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCi0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogVFJVRSAgOiBObyBlcnJvciBvY2N1ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCSAgICAgICAgICAgIDogRkFMU0UgOiBFcnJvciBvY2N1ci4gUmV0dXJuIHRoZSBlcnJvciAgICAgICAgICB8Ci18CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotc3RhdGljIGludCBpX0FQQ0kxNTY0X1JlYWRUaW1lckNvdW50ZXJXYXRjaGRvZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCisgKiBSZWFkIFRoZSBTZWxlY3RlZCBUaW1lciwgQ291bnRlciBvciBXYXRjaGRvZworICovCitzdGF0aWMgaW50IGFwY2kxNTY0X3RpbWVyX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKIAogCWlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9XQVRDSERPRykgewogCQkvKiAgU3RvcmVzIHRoZSBzdGF0dXMgb2YgdGhlIFdhdGNoZG9nICovCi0JCWRhdGFbMF0gPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJCUFQQ0kxNTY0X1RDV19UUklHX1NUQVRVUykgJiAweDE7Ci0JCWRhdGFbMV0gPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HKTsKLQl9CQkJLyogIGlmICAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGU9PUFERElEQVRBX1dBVENIRE9HKSAqLwotCWVsc2UgaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlID09IEFERElEQVRBX1RJTUVSKSB7CisJCWRhdGFbMF0gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfV0RPR19TVEFUVVNfUkVHKSAmIDB4MTsKKwkJZGF0YVsxXSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX1JFRyk7CisJfSBlbHNlIGlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9USU1FUikgewogCQkvKiAgU3RvcmVzIHRoZSBzdGF0dXMgb2YgdGhlIFRpbWVyICovCi0JCWRhdGFbMF0gPQotCQkJaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSICsKLQkJCUFQQ0kxNTY0X1RDV19UUklHX1NUQVRVUykgJiAweDE7CisJCWRhdGFbMF0gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVJfU1RBVFVTX1JFRykgJiAweDE7CiAKIAkJLyogIFN0b3JlcyB0aGUgQWN0dWFsIHZhbHVlIG9mIHRoZSBUaW1lciAqLwotCQlkYXRhWzFdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSKTsKLQl9CQkJLyogIGVsc2UgaWYgIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZT09QURESURBVEFfVElNRVIpICovCi0JZWxzZSBpZiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPT0gQURESURBVEFfQ09VTlRFUikgeworCQlkYXRhWzFdID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX1JFRyk7CisJfSBlbHNlIGlmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9PSBBRERJREFUQV9DT1VOVEVSKSB7CiAJCS8qICBSZWFkIHRoZSBDb3VudGVyIEFjdHVhbCBWYWx1ZS4gKi8KIAkJZGF0YVswXSA9Ci0JCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtCi0JCQkJCTEpICogMHgyMCkgKwotCQkJQVBDSTE1NjRfVENXX1NZTkNfRU5BQkxFRElTQUJMRSk7CisJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsKKwkJCQlBUENJMTU2NF9UQ1dfUkVHKGRldnByaXYtPmJfTW9kZVNlbGVjdFJlZ2lzdGVyIC0gMSkpOwogCQl1bF9Db21tYW5kMSA9Ci0JCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgKChkZXZwcml2LT5iX01vZGVTZWxlY3RSZWdpc3RlciAtCi0JCQkJCTEpICogMHgyMCkgKyBBUENJMTU2NF9UQ1dfVFJJR19TVEFUVVMpOworCQkJaW5sKGRldnByaXYtPmlvYmFzZSArCisJCQkJQVBDSTE1NjRfVENXX1NUQVRVU19SRUcoZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgLSAxKSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJLyogR2V0IHRoZSBzb2Z0d2FyZSB0cmlnZ2VyIHN0YXR1cyAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlkYXRhWzFdID0gKHVuc2lnbmVkIGNoYXIpICgodWxfQ29tbWFuZDEgPj4gMSkgJiAxKTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBHZXQgdGhlIGhhcmR3YXJlIHRyaWdnZXIgc3RhdHVzICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCWRhdGFbMl0gPSAodW5zaWduZWQgY2hhcikgKCh1bF9Db21tYW5kMSA+PiAyKSAmIDEpOwogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBHZXQgdGhlIHNvZnR3YXJlIGNsZWFyIHN0YXR1cyAqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkJZGF0YVszXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHVsX0NvbW1hbmQxID4+IDMpICYgMSk7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qIEdldCB0aGUgb3ZlcmZsb3cgc3RhdHVzICovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQlkYXRhWzRdID0gKHVuc2lnbmVkIGNoYXIpICgodWxfQ29tbWFuZDEgPj4gMCkgJiAxKTsKLQl9CQkJLyogIGVsc2UgIGlmICAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGU9PUFERElEQVRBX0NPVU5URVIpICovCi0JZWxzZSBpZiAoKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlICE9IEFERElEQVRBX1RJTUVSKQorCX0gZWxzZSBpZiAoKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlICE9IEFERElEQVRBX1RJTUVSKQogCQkmJiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgIT0gQURESURBVEFfV0FUQ0hET0cpCiAJCSYmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSAhPSBBRERJREFUQV9DT1VOVEVSKSkgewotCQlwcmludGsoIlxuIEludmFsaWQgU3ViZGV2aWNlICEhIVxuIik7Ci0JfQkJCS8qICBlbHNlIGlmICgoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUhPUFERElEQVRBX1RJTUVSKSAmJiAoZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUhPUFERElEQVRBX1dBVENIRE9HKSYmIChkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSE9QURESURBVEFfQ09VTlRFUikpICovCisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIFN1YmRldmljZSFcbiIpOworCX0KIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAogLyoKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBGdW5jdGlvbiAgIE5hbWUgICA6ICBpbnQgaV9BUENJMTU2NF9SZWFkSW50ZXJydXB0U3RhdHVzICAgICAgICAgICAgICAgICAgICB8Ci18CQkJICAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDpSZWFkcyB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9SZWFkSW50ZXJydXB0U3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKKyAqIFJlYWRzIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbnQgYXBjaTE1NjRfZG9fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJKmRhdGEgPSB1aV9UeXBlOwogCXJldHVybiBpbnNuLT5uOwogfQogCiAvKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogc3RhdGljIHZvaWQgdl9BUENJMTU2NF9JbnRlcnJ1cHQJCQkJCSAgICAgfAotfAkJCQkJICAoaW50IGlycSAsIHZvaWQgKmQpICAgICAgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFRhc2sgICAgICAgICAgICAgIDogSW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBpbnRlcnJ1cHRpYmxlIGRpZ2l0YWwgaW5wdXRzIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBJbnB1dCBQYXJhbWV0ZXJzICA6IGludCBpcnEgICAgICAgICAgICAgICAgIDogaXJxIG51bWJlciAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZCAgICAgICAgICAgICAgICAgOiB2b2lkIHBvaW50ZXIgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBPdXRwdXQgUGFyYW1ldGVycyA6CS0tCQkJCQkJCQkJCQkJCSB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUmV0dXJuIFZhbHVlICAgICAgOiBUUlVFICA6IE5vIGVycm9yIG9jY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfAkJICAgICAgICAgICAgOiBGQUxTRSA6IEVycm9yIG9jY3VyLiBSZXR1cm4gdGhlIGVycm9yICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi1zdGF0aWMgdm9pZCB2X0FQQ0kxNTY0X0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBpbnRlcnJ1cHRpYmxlIGRpZ2l0YWwgaW5wdXRzCisgKi8KK3N0YXRpYyB2b2lkIGFwY2kxNTY0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQogewogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC02NzcsNzkgKzQ0Miw2MyBAQAogCXVuc2lnbmVkIGludCB1aV9DMSwgdWlfQzIsIHVpX0MzLCB1aV9DNDsKIAl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZDIgPSAwOwogCi0JdWlfREkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKSAmIDB4MDE7Ci0JdWlfRE8gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCUFQQ0kxNTY0X0RJR0lUQUxfT1BfSVJRKSAmIDB4MDE7Ci0JdWlfVGltZXIgPQotCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQlBUENJMTU2NF9UQ1dfSVJRKSAmIDB4MDE7Ci0JdWlfQzEgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjEgKwotCQlBUENJMTU2NF9UQ1dfSVJRKSAmIDB4MTsKLQl1aV9DMiA9IGlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMiArCi0JCUFQQ0kxNTY0X1RDV19JUlEpICYgMHgxOwotCXVpX0MzID0gaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIzICsKLQkJQVBDSTE1NjRfVENXX0lSUSkgJiAweDE7Ci0JdWlfQzQgPSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjQgKwotCQlBUENJMTU2NF9UQ1dfSVJRKSAmIDB4MTsKKwl1aV9ESSA9IGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKSAmIDB4MDE7CisJdWlfRE8gPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSVJRX1JFRykgJiAweDAxOworCXVpX1RpbWVyID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0lSUV9SRUcpICYgMHgwMTsKKwl1aV9DMSA9CisJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpICYgMHgxOworCXVpX0MyID0KKwkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19JUlFfUkVHKEFQQ0kxNTY0X0NPVU5URVIyKSkgJiAweDE7CisJdWlfQzMgPQorCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0lSUV9SRUcoQVBDSTE1NjRfQ09VTlRFUjMpKSAmIDB4MTsKKwl1aV9DNCA9CisJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfSVJRX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpICYgMHgxOwogCWlmICh1aV9ESSA9PSAwICYmIHVpX0RPID09IDAgJiYgdWlfVGltZXIgPT0gMCAmJiB1aV9DMSA9PSAwCiAJCSYmIHVpX0MyID09IDAgJiYgdWlfQzMgPT0gMCAmJiB1aV9DNCA9PSAwKSB7Ci0JCXByaW50aygiXG5JbnRlcnJ1cHQgZnJvbSB1bmtub3duIHNvdXJjZVxuIik7Ci0JfQkJCS8qICBpZih1aV9EST09MCAmJiB1aV9ETz09MCAmJiB1aV9UaW1lcj09MCAmJiB1aV9DMT09MCAmJiB1aV9DMj09MCAmJiB1aV9DMz09MCAmJiB1aV9DND09MCkgKi8KKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludGVycnVwdCBmcm9tIHVua25vd24gc291cmNlLlxuIik7CisJfQogCiAJaWYgKHVpX0RJID09IDEpIHsKLQkJdWlfREkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSk7Ci0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX0lQX0lSUSk7CisJCXVpX0RJID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJX0lSUV9SRUcpOworCQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSVJRX1JFRyk7CiAJCXVpX0ludGVycnVwdFN0YXR1c18xNTY0ID0KLQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQICsKLQkJCUFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX1NUQVRVUyk7CisJCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX1NUQVRVU19SRUcpOwogCQl1aV9JbnRlcnJ1cHRTdGF0dXNfMTU2NCA9IHVpX0ludGVycnVwdFN0YXR1c18xNTY0ICYgMFgwMDBGRkZGMDsKLQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsJLyogIHNlbmQgc2lnbmFsIHRvIHRoZSBzYW1wbGUgKi8KLQkJb3V0bCh1aV9ESSwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUCArIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSVJRKTsJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwkJLyogc2VuZCBzaWduYWwgdG8gdGhlIHNhbXBsZSAqLworCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOworCQkvKiBlbmFibGUgdGhlIGludGVycnVwdCAqLworCQlvdXRsKHVpX0RJLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh1aV9ETyA9PSAxKSB7Ci0JCS8qICBDaGVjayBmb3IgRGlnaXRhbCBPdXRwdXQgaW50ZXJydXB0IFR5cGUgLSAxOiBWY2MgaW50ZXJydXB0IDI6IENDIGludGVycnVwdC4gKi8KLQkJdWlfVHlwZSA9Ci0JCQlpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVF9TVEFUVVMpICYgMHgzOworCQkvKiBDaGVjayBmb3IgRGlnaXRhbCBPdXRwdXQgaW50ZXJydXB0IFR5cGUgKi8KKwkJLyogMTogVkNDIGludGVycnVwdAkJCSAgICovCisJCS8qIDI6IENDIGludGVycnVwdAkJCSAgICovCisJCXVpX1R5cGUgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fSU5UX1NUQVRVU19SRUcpICYgMHgzOwogCQkvKiBEaXNhYmxlIHRoZSAgSW50ZXJydXB0ICovCi0JCW91dGwoMHgwLAotCQkJZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUCArCi0JCQlBUENJMTU2NF9ESUdJVEFMX09QX0lOVEVSUlVQVCk7CisJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcpOwogCiAJCS8qIFNlbmRzIHNpZ25hbCB0byB1c2VyIHNwYWNlICovCiAJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7Ci0KLQl9CQkJLyogIGlmICAodWlfRE8pICovCisJfQogCiAJaWYgKHVpX1RpbWVyID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9USU1FUjsKIAkJaWYgKGRldnByaXYtPmJfVGltZXJTZWxlY3RNb2RlKSB7CiAKIAkJCS8qICBEaXNhYmxlIFRpbWVyIEludGVycnVwdCAqLwotCQkJdWxfQ29tbWFuZDIgPQotCQkJCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkJICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKLQkJCW91dGwoMHgwLAotCQkJICAgICBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUiArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCXVsX0NvbW1hbmQyID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSX0NUUkxfUkVHKTsKKwkJCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAKIAkJCS8qIFNlbmQgYSBzaWduYWwgdG8gZnJvbSBrZXJuZWwgdG8gdXNlciBzcGFjZSAqLwogCQkJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKIAogCQkJLyogIEVuYWJsZSBUaW1lciBJbnRlcnJ1cHQgKi8KIAotCQkJb3V0bCh1bF9Db21tYW5kMiwKLQkJCSAgICAgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQlvdXRsKHVsX0NvbW1hbmQyLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAJCX0KLQl9LyogaWYgICh1aV9UaW1lciA9PSAxKSAqLwotCisJfQogCiAJaWYgKHVpX0MxID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwpAQCAtNzU3LDIxICs1MDYsMTggQEAKIAogCQkJLyogIERpc2FibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjEgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpOwogCQkJb3V0bCgweDAsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIxICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjEpKTsKIAogCQkJLyogU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCiAJCQkvKiAgRW5hYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQlvdXRsKHVsX0NvbW1hbmQyLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMSArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIxKSk7CiAJCX0KLQl9IC8qIGlmICAodWlfQzEgPT0gMSkgKi8KKwl9CiAKIAlpZiAodWlfQzIgPT0gMSkgewogCQlkZXZwcml2LT5iX1RpbWVyU2VsZWN0TW9kZSA9IEFERElEQVRBX0NPVU5URVI7CkBAIC03NzksMjEgKzUyNSwxOCBAQAogCiAJCQkvKiAgRGlzYWJsZSBDb3VudGVyIEludGVycnVwdCAqLwogCQkJdWxfQ29tbWFuZDIgPQotCQkJCWlubChkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMiArCi0JCQkJICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIyKSk7CiAJCQlvdXRsKDB4MCwKLQkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjIgKwotCQkJICAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMikpOwogCiAJCQkvKiBTZW5kIGEgc2lnbmFsIHRvIGZyb20ga2VybmVsIHRvIHVzZXIgc3BhY2UgKi8KIAkJCXNlbmRfc2lnKFNJR0lPLCBkZXZwcml2LT50c2tfQ3VycmVudCwgMCk7CiAKIAkJCS8qICBFbmFibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCW91dGwodWxfQ29tbWFuZDIsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIyICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjIpKTsKIAkJfQotCX0gLyogIGlmICAoKHVpX0MyID09IDEpICovCisJfQogCiAJaWYgKHVpX0MzID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwpAQCAtODAxLDIxICs1NDQsMTggQEAKIAogCQkJLyogIERpc2FibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjMgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMykpOwogCQkJb3V0bCgweDAsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIzICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjMpKTsKIAogCQkJLyogU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCiAJCQkvKiAgRW5hYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQlvdXRsKHVsX0NvbW1hbmQyLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMyArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIzKSk7CiAJCX0KLQl9CS8qICBpZiAoKHVpX0MzID09IDEpICovCisJfQogCiAJaWYgKHVpX0M0ID09IDEpIHsKIAkJZGV2cHJpdi0+Yl9UaW1lclNlbGVjdE1vZGUgPSBBRERJREFUQV9DT1VOVEVSOwpAQCAtODIzLDYwICs1NjMsNDUgQEAKIAogCQkJLyogIERpc2FibGUgQ291bnRlciBJbnRlcnJ1cHQgKi8KIAkJCXVsX0NvbW1hbmQyID0KLQkJCQlpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjQgKwotCQkJCSAgICBBUENJMTU2NF9UQ1dfUFJPRyk7CisJCQkJaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpOwogCQkJb3V0bCgweDAsCi0JCQkgICAgIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVI0ICsKLQkJCSAgICAgQVBDSTE1NjRfVENXX1BST0cpOworCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjQpKTsKIAogCQkJLyogU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJCQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCiAJCQkvKiAgRW5hYmxlIENvdW50ZXIgSW50ZXJydXB0ICovCiAJCQlvdXRsKHVsX0NvbW1hbmQyLAotCQkJICAgICBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSNCArCi0JCQkgICAgIEFQQ0kxNTY0X1RDV19QUk9HKTsKKwkJCSAgICAgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVI0KSk7CiAJCX0KLQl9CS8qICBpZiAodWlfQzQgPT0gMSkgKi8KKwl9CiAJcmV0dXJuOwogfQogCi0vKgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IEZ1bmN0aW9uICAgTmFtZSAgIDogaW50IGlfQVBDSTE1NjRfUmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUYXNrICAgICAgICAgICAgICA6cmVzZXRzIGFsbCB0aGUgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgSW5wdXQgUGFyYW1ldGVycyAgOiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgT3V0cHV0IFBhcmFtZXRlcnMgOgktLQkJCQkJCQkJCQkJCQkgfAotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFJldHVybiBWYWx1ZSAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLXN0YXRpYyBpbnQgaV9BUENJMTU2NF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMTU2NF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9JUF9JUlEpOwkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzICovCi0JaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX1NUQVRVUyk7CS8qIFJlc2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCi0Jb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVBfSU5URVJSVVBUX01PREUxKTsJLyogRGlzYWJsZSB0aGUgYW5kL29yIGludGVycnVwdCAqLwotCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQX0lOVEVSUlVQVF9NT0RFMik7CisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JUlFfUkVHKTsKKwkvKiBSZXNldCB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworCWlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfU1RBVFVTX1JFRyk7CisJLyogRGlzYWJsZSB0aGUgYW5kL29yIGludGVycnVwdCAqLworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESV9JTlRfTU9ERTFfUkVHKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElfSU5UX01PREUyX1JFRyk7CiAJZGV2cHJpdi0+Yl9EaWdpdGFsT3V0cHV0UmVnaXN0ZXIgPSAwOwogCXVpX1R5cGUgPSAwOwotCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QKTsJLyogUmVzZXRzIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRElHSVRBTF9PUF9JTlRFUlJVUFQpOwkvKiBEaXNhYmxlcyB0aGUgaW50ZXJydXB0LiAqLwotCW91dGwoMHgwLAotCQlkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX09QX1dBVENIRE9HICsKLQkJQVBDSTE1NjRfVENXX1JFTE9BRF9WQUxVRSk7Ci0Jb3V0bCgweDAsIGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X1RJTUVSKTsKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfVElNRVIgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CisJLyogUmVzZXRzIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KKwlvdXRsKDB4MCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQVBDSTE1NjRfRE9fUkVHKTsKKwkvKiBEaXNhYmxlcyB0aGUgaW50ZXJydXB0LiAqLworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ET19JTlRfQ1RSTF9SRUcpOworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9XRE9HX1JFTE9BRF9SRUcpOworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9SRUcpOworCW91dGwoMHgwLCBkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9USU1FUl9DVFJMX1JFRyk7CiAKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjEgKyBBUENJMTU2NF9UQ1dfUFJPRyk7Ci0Jb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X0NPVU5URVIyICsgQVBDSTE1NjRfVENXX1BST0cpOwotCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9DT1VOVEVSMyArIEFQQ0kxNTY0X1RDV19QUk9HKTsKLQlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfQ09VTlRFUjQgKyBBUENJMTU2NF9UQ1dfUFJPRyk7CisJb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSMSkpOworCW91dGwoMHgwLCBkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTU2NF9UQ1dfQ1RSTF9SRUcoQVBDSTE1NjRfQ09VTlRFUjIpKTsKKwlvdXRsKDB4MCwgZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1NjRfVENXX0NUUkxfUkVHKEFQQ0kxNTY0X0NPVU5URVIzKSk7CisJb3V0bCgweDAsIGRldnByaXYtPmlvYmFzZSArIEFQQ0kxNTY0X1RDV19DVFJMX1JFRyhBUENJMTU2NF9DT1VOVEVSNCkpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jCmluZGV4IGJkMDU4NTcuLjcwZThmNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMKQEAgLTI0OCwxMCArMjQ4LDEwIEBACiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICovCiAKLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9JbnNuQ29uZmlnQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzEyMF9haV9pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJY29uc3Qgc3RydWN0IGFkZGlfYm9hcmQgKnRoaXNfYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtMzA0LDExICszMDQsMTEgQEAKICAqIElmIHRoZSBsYXN0IGFyZ3VtZW50IG9mIGZ1bmN0aW9uICJjaGVjayJpcyAxIHRoZW4gaXQgb25seSBjaGVja3MKICAqIHRoZSBjaGFubmVsIGxpc3QgaXMgb2sgb3Igbm90LgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfU2V0dXBDaGFubmVsTGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICAgaW50IG5fY2hhbiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKLQkJCQkgICAgICAgY2hhciBjaGVjaykKK3N0YXRpYyBpbnQgYXBjaTMxMjBfc2V0dXBfY2hhbl9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICBpbnQgbl9jaGFuLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LAorCQkJCSAgICBjaGFyIGNoZWNrKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IGk7CQkvKiAsIGRpZmZlcmVuY2lhbD0wLCBiaXBvbGFyPTA7ICovCkBAIC0zNTgsMTAgKzM1OCwxMCBAQAogICogYXMgcGVyIGNvbmZpZ3VyZWQgaWYgbm8gY29udmVyc2lvbiB0aW1lIGlzIHNldCB1c2VzIGRlZmF1bHQKICAqIGNvbnZlcnNpb24gdGltZSAxMCBtaWNyb3NlYy4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0luc25SZWFkQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzEyMF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBhZGRpX2JvYXJkICp0aGlzX2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTQxNywxMCArNDE3LDcgQEAKIAkJCWludyhkZXZwcml2LT5pb2Jhc2UgKyBBUENJMzEyMF9SRVNFVF9GSUZPKTsKIAogCQkJLyogIEluaXRpYWxpemUgdGhlIHNlcXVlbmNlIGFycmF5ICovCi0KLQkJCS8qIGlmICghaV9BUENJMzEyMF9TZXR1cENoYW5uZWxMaXN0KGRldixzLDEsY2hhbmxpc3QsMCkpICByZXR1cm4gLUVJTlZBTDsgKi8KLQotCQkJaWYgKCFpX0FQQ0kzMTIwX1NldHVwQ2hhbm5lbExpc3QoZGV2LCBzLCAxLAorCQkJaWYgKCFhcGNpMzEyMF9zZXR1cF9jaGFuX2xpc3QoZGV2LCBzLCAxLAogCQkJCQkmaW5zbi0+Y2hhbnNwZWMsIDApKQogCQkJCXJldHVybiAtRUlOVkFMOwogCkBAIC01MTIsNyArNTA5LDcgQEAKIAkJCW91dHcoZGV2cHJpdi0+dXNfT3V0cHV0UmVnaXN0ZXIsCiAJCQkJZGV2cHJpdi0+aW9iYXNlICsgQVBDSTMxMjBfV1JfQUREUkVTUyk7CiAKLQkJCWlmICghaV9BUENJMzEyMF9TZXR1cENoYW5uZWxMaXN0KGRldiwgcywKKwkJCWlmICghYXBjaTMxMjBfc2V0dXBfY2hhbl9saXN0KGRldiwgcywKIAkJCQkJZGV2cHJpdi0+dWlfQWlOYnJvZkNoYW5uZWxzLAogCQkJCQlkZXZwcml2LT51aV9BaUNoYW5uZWxMaXN0LCAwKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwNiw3ICs2MDMsNyBAQAogCiB9CiAKLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9SZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhcGNpMzEyMF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IGk7CkBAIC02NjMsNyArNjYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX0V4dHRyaWdFbmFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXBjaTMxMjBfZXh0dHJpZ19lbmFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCkBAIC02NzIsNyArNjY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX0V4dHRyaWdEaXNhYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kzMTIwX2V4dHRyaWdfZGlzYWJsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKQEAgLTY4MSw4ICs2NzgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgYXBjaTMxMjBfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCkBAIC03MDUsNyArNzAyLDcgQEAKIAkgKiBkZXZwcml2LT5pX0lvYmFzZUFtY2MrQU1DQ19PUF9SRUdfTUNTUik7ICBzdG9wIERNQSAqLwogCiAJLyogRGlzYWJsZSBleHQgdHJpZ2dlciAqLwotCWlfQVBDSTMxMjBfRXh0dHJpZ0Rpc2FibGUoZGV2KTsKKwlhcGNpMzEyMF9leHR0cmlnX2Rpc2FibGUoZGV2KTsKIAogCWRldnByaXYtPnVzX091dHB1dFJlZ2lzdGVyID0gMDsKIAkvKiBzdG9wICBjb3VudGVycyAqLwpAQCAtNzI5LDEzICs3MjYsMTMgQEAKIAlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCWRldnByaXYtPmJfSW50ZXJydXB0TW9kZSA9IEFQQ0kzMTIwX0VPQ19NT0RFOwogCWRldnByaXYtPmJfRW9jRW9zSW50ZXJydXB0ID0gQVBDSTMxMjBfRElTQUJMRTsKLQlpX0FQQ0kzMTIwX1Jlc2V0KGRldik7CisJYXBjaTMxMjBfcmVzZXQoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMTIwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQorc3RhdGljIGludCBhcGNpMzEyMF9haV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAljb25zdCBzdHJ1Y3QgYWRkaV9ib2FyZCAqdGhpc19ib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCWludCBlcnIgPSAwOwpAQCAtODE4LDkgKzgxNSw5IEBACiAgKiBJZiBETUEgaXMgY29uZmlndXJlZCBkb2VzIERNQSBpbml0aWFsaXphdGlvbiBvdGhlcndpc2UgZG9lcyB0aGUKICAqIGFjcXVpc2l0aW9uIHdpdGggRU9TIGludGVycnVwdC4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0N5Y2xpY0FuYWxvZ0lucHV0KGludCBtb2RlLAotCQkJCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgYXBjaTMxMjBfY3ljbGljX2FpKGludCBtb2RlLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCWNvbnN0IHN0cnVjdCBhZGRpX2JvYXJkICp0aGlzX2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTkwNCw3ICs5MDEsNyBAQAogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJLyogSW5pdGlhbGl6ZXMgdGhlIHNlcXVlbmNlIGFycmF5ICovCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlpZiAoIWlfQVBDSTMxMjBfU2V0dXBDaGFubmVsTGlzdChkZXYsIHMsIGRldnByaXYtPnVpX0FpTmJyb2ZDaGFubmVscywKKwlpZiAoIWFwY2kzMTIwX3NldHVwX2NoYW5fbGlzdChkZXYsIHMsIGRldnByaXYtPnVpX0FpTmJyb2ZDaGFubmVscywKIAkJCWRldnByaXYtPnB1aV9BaUNoYW5uZWxMaXN0LCAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTk1Nyw3ICs5NTQsNyBAQAogLyoqKiBFTDI0MTAwMyBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJaWYgKGRldnByaXYtPmJfRXh0dHJpZ0VuYWJsZSA9PSBBUENJMzEyMF9FTkFCTEUpCi0JCWlfQVBDSTMxMjBfRXh0dHJpZ0VuYWJsZShkZXYpOwkvKiAgYWN0aXZhdGUgRVhUIHRyaWdnZXIgKi8KKwkJYXBjaTMxMjBfZXh0dHJpZ19lbmFibGUoZGV2KTsJLyogIGFjdGl2YXRlIEVYVCB0cmlnZ2VyICovCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSAxOgogCQkvKiAgaW5pdCB0aW1lcjAgaW4gbW9kZSAyICovCkBAIC0xMzMzLDggKzEzMzAsOCBAQAogICogRG9lcyBhc3luY2hyb25vdXMgYWNxdWlzaXRpb24uCiAgKiBEZXRlcm1pbmVzIHRoZSBtb2RlIDEgb3IgMi4KICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0NvbW1hbmRBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgaW50IGFwY2kzMTIwX2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CkBAIC0xMzcxLDcgKzEzNjgsNyBAQAogCiAJCQlkZXZwcml2LT51aV9BaVRpbWVyMCA9IGNtZC0+Y29udmVydF9hcmc7CS8qICB0aW1lciBjb25zdGFudCBpbiBuYW5vIHNlY29uZHMgKi8KIAkJCS8qIHJldHVybiB0aGlzX2JvYXJkLT5haV9jbWQoMSxkZXYscyk7ICovCi0JCQlyZXR1cm4gaV9BUENJMzEyMF9DeWNsaWNBbmFsb2dJbnB1dCgxLCBkZXYsIHMpOworCQkJcmV0dXJuIGFwY2kzMTIwX2N5Y2xpY19haSgxLCBkZXYsIHMpOwogCQl9CiAKIAl9CkBAIC0xMzgxLDcgKzEzNzgsNyBAQAogCQlkZXZwcml2LT51aV9BaVRpbWVyMSA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCWRldnByaXYtPnVpX0FpVGltZXIwID0gY21kLT5jb252ZXJ0X2FyZzsJLyogIHZhcmlhYmxlIGNoYW5nZWQgdGltZXIyIHRvIHRpbWVyMCAqLwogCQkvKiByZXR1cm4gdGhpc19ib2FyZC0+YWlfY21kKDIsZGV2LHMpOyAqLwotCQlyZXR1cm4gaV9BUENJMzEyMF9DeWNsaWNBbmFsb2dJbnB1dCgyLCBkZXYsIHMpOworCQlyZXR1cm4gYXBjaTMxMjBfY3ljbGljX2FpKDIsIGRldiwgcyk7CiAJfQogCXJldHVybiAtMTsKIH0KQEAgLTE0MTAsNyArMTQwNyw3IEBACiAgKiBGb3IgY29udGludW91cyBETUEgaXQgcmVpbml0aWFsaXplcyB0aGUgRE1BIG9wZXJhdGlvbi4KICAqIEZvciBzaW5nbGUgbW9kZSBETUEgaXQgc3RvcCB0aGUgYWNxdWlzaXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkIHZfQVBDSTMxMjBfSW50ZXJydXB0RG1hKGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMzEyMF9pbnRlcnJ1cHRfZG1hKGludCBpcnEsIHZvaWQgKmQpCiB7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTE0MjksNyArMTQyNiw3IEBACiAJfQogCWlmIChzYW1wbGVzaW5idWYgJiAxKSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJPZGQgY291bnQgb2YgYnl0ZXMgaW4gRE1BIHJpbmchIik7Ci0JCWlfQVBDSTMxMjBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uKGRldiwgcyk7CisJCWFwY2kzMTIwX2NhbmNlbChkZXYsIHMpOwogCQlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCiAJCXJldHVybjsKQEAgLTE1MDAsNyArMTQ5Nyw3IEBACiAJaWYgKCFkZXZwcml2LT5iX0FpQ29udGludW91cykKIAkJaWYgKGRldnByaXYtPnVpX0FpQWN0dWFsU2NhbiA+PSBkZXZwcml2LT51aV9BaU5icm9mU2NhbnMpIHsKIAkJCS8qICBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQlpX0FQQ0kzMTIwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbihkZXYsIHMpOworCQkJYXBjaTMxMjBfY2FuY2VsKGRldiwgcyk7CiAJCQlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CkBAIC0xNTY1LDcgKzE1NjIsNyBAQAogICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEVPUyBpbnRlcnJ1cHQuCiAgKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgYWNxdWlyZWQgZGF0YShmcm9tIEZJRk8pIHRvIENvbWVkaSBidWZmZXIuCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzEyMF9JbnRlcnJ1cHRIYW5kbGVFb3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXBjaTMxMjBfaW50ZXJydXB0X2hhbmRsZV9lb3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKQEAgLTE1NzQsOCArMTU3MSw2IEBACiAKIAluX2NoYW4gPSBkZXZwcml2LT51aV9BaU5icm9mQ2hhbm5lbHM7CiAKLQlzLT5hc3luYy0+ZXZlbnRzID0gMDsKLQogCWZvciAoaSA9IDA7IGkgPCBuX2NoYW47IGkrKykKIAkJZXJyICY9IGNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBpbncoZGV2LT5pb2Jhc2UgKyAwKSk7CiAKQEAgLTE1ODksNyArMTU4NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZfQVBDSTMxMjBfSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMzEyMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtMTYxNSw3ICsxNjEwLDcgQEAKIAogCWlmIChkZXZwcml2LT5iX0V4dHRyaWdFbmFibGUgPT0gQVBDSTMxMjBfRU5BQkxFKSB7CiAJCS8qIERpc2FibGUgZXh0IHRyaWdnZXIgKi8KLQkJaV9BUENJMzEyMF9FeHR0cmlnRGlzYWJsZShkZXYpOworCQlhcGNpMzEyMF9leHR0cmlnX2Rpc2FibGUoZGV2KTsKIAkJZGV2cHJpdi0+Yl9FeHR0cmlnRW5hYmxlID0gQVBDSTMxMjBfRElTQUJMRTsKIAl9CiAJLyogY2xlYXIgdGhlIHRpbWVyIDIgaW50ZXJydXB0ICovCkBAIC0xNjU1LDcgKzE2NTAsNyBAQAogCiAJCQlpZiAoZGV2cHJpdi0+Yl9BaUN5Y2xpY0FjcXVpc2l0aW9uID09IEFQQ0kzMTIwX0VOQUJMRSkgewogCQkJCXVpX0NoZWNrID0gMDsKLQkJCQlpX0FQQ0kzMTIwX0ludGVycnVwdEhhbmRsZUVvcyhkZXYpOworCQkJCWFwY2kzMTIwX2ludGVycnVwdF9oYW5kbGVfZW9zKGRldik7CiAJCQkJZGV2cHJpdi0+dWlfQWlBY3R1YWxTY2FuKys7CiAJCQkJZGV2cHJpdi0+Yl9Nb2RlU2VsZWN0UmVnaXN0ZXIgPQogCQkJCQlkZXZwcml2LT4KQEAgLTE3MTEsNyArMTcwNiw3IEBACiAJCQkJZGV2LT5pb2Jhc2UgKyBBUENJMzEyMF9XUl9BRERSRVNTKTsKIAogCQkJLyogc3RvcCB0aW1lciAwIGFuZCB0aW1lciAxICovCi0JCQlpX0FQQ0kzMTIwX1N0b3BDeWNsaWNBY3F1aXNpdGlvbihkZXYsIHMpOworCQkJYXBjaTMxMjBfY2FuY2VsKGRldiwgcyk7CiAJCQlkZXZwcml2LT5iX0FpQ3ljbGljQWNxdWlzaXRpb24gPSBBUENJMzEyMF9ESVNBQkxFOwogCiAJCQkvKiBVUERBVEUtMC43LjU3LT4wLjcuNjhjb21lZGlfZG9uZShkZXYscyk7ICovCkBAIC0xNzY1LDcgKzE3NjAsOCBAQAogCQkJLyogQ2xlYXJzIHRoZSB0aW1lciBzdGF0dXMgcmVnaXN0ZXIgKi8KIAkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQlpbncoZGV2LT5pb2Jhc2UgKyBBUENJMzEyMF9USU1FUl9TVEFUVVNfUkVHSVNURVIpOwotCQkJdl9BUENJMzEyMF9JbnRlcnJ1cHREbWEoaXJxLCBkKTsJLyogIGRvIHNvbWUgZGF0YSB0cmFuc2ZlciAqLworCQkJLyogZG8gc29tZSBkYXRhIHRyYW5zZmVyICovCisJCQlhcGNpMzEyMF9pbnRlcnJ1cHRfZG1hKGlycSwgZCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBTdG9wcyB0aGUgVGltZXIgKi8KIAkJCW91dHcoZGV2cHJpdi0+CkBAIC0xNzg3LDcgKzE3ODMsNyBAQAogICogZGF0YVsxXSA9IFRpbWVyIGNvbnN0YW50CiAgKiBkYXRhWzJdID0gVGltZXIyIGludGVycnVwdCAoMSllbmFibGUgb3IoMCkgZGlzYWJsZQogICovCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW5zbkNvbmZpZ1RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGFwY2kzMTIwX2NvbmZpZ19pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKQEAgLTE5MzIsNyArMTkyOCw3IEBACiAgKgkJCSA9IDEgVGltZXIKICAqCQkJID0gMiBXYXRjaCBkb2cKICAqLwotc3RhdGljIGludCBpX0FQQ0kzMTIwX0luc25Xcml0ZVRpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGFwY2kzMTIwX3dyaXRlX2luc25fdGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMjEwNCw3ICsyMTAwLDcgQEAKICAqIGZvciB3YXRjaGRvZzogZGF0YVswXSA9IDAgKHN0aWxsIHJ1bm5pbmcpCiAgKgkJCSA9IDEgKHJ1biBkb3duKQogICovCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW5zblJlYWRUaW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorc3RhdGljIGludCBhcGNpMzEyMF9yZWFkX2luc25fdGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMjE4OSwxMCArMjE4NSwxMCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMxMjBfSW5zbldyaXRlQW5hbG9nT3V0cHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMxMjBfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWlfUmFuZ2UsIHVpX0NoYW5uZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKaW5kZXggOGM4NWEwOS4uMDUzNmQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYwpAQCAtMTI2OCw3ICsxMjY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpX0FQQ0kzMjAwX1Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFwY2kzMjAwX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaV9UZW1wOwpAQCAtMTMyMiwxMCArMTMyMiwxMCBAQAogICogZGF0YVs3XSA6IENoYW5uZWwgY3VycmVudCBzb3VyY2UgZnJvbSBlZXByb20KICAqIGRhdGFbOF0gOiBDaGFubmxlIGdhaW4gZmFjdG9yIGZyb20gZWVwcm9tCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzIwMF9SZWFkQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgdWlfRHVtbXlWYWx1ZSA9IDA7CiAJaW50IGlfQ29udmVydENKQ0NhbGlicmF0aW9uOwpAQCAtMTMzNiw3ICsxMzM2LDcgQEAKIAlpZiAoc19Cb2FyZEluZm9zW2Rldi0+bWlub3JdLmlfSW5pdGlhbGlzZWQgPT0gMCkKIAkJLyogRU5EIEpLIDA2LjA3LjA0OiBNYW5hZ2VtZW50IG9mIHNldnJhbHMgYm9hcmRzICovCiAJewotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBpZihpX0luaXRpYWxpc2VkPT0wKTsgKi8KIApAQCAtMTU4Niw3ICsxNTg2LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKCJcblRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBhcmUgaW4gZXJyb3JcbiIpOwotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0JCQkvKiBzd2l0Y2goaW5zbi0+dW51c2VkWzBdKSAqLwogCkBAIC0xNjI2LDEwICsxNjI2LDEwIEBACiAgKgkgICAgPSAyICBSVEQgMyB3aXJlIGNvbm5lY3Rpb24KICAqCSAgICA9IDMgIFJURCA0IHdpcmUgY29ubmVjdGlvbgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfQ29uZmlnQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbmZpZyA9IDAsIHVsX1RlbXAgPSAwOwpAQCAtMTk3MCw3ICsxOTcwLDcgQEAKIAkJfQkJLyogIHN3aXRjaChkYXRhWzExXSkgKi8KIAl9CQkJLyogIGVsc2VpZihkYXRhWzEyXT09MCB8fCBkYXRhWzEyXT09MSkgKi8KIAlpZiAoaV9lcnIpIHsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogaWYoaV9TY2FuVHlwZSE9MSkgKi8KQEAgLTIwNzksNyArMjA3OSw3IEBACiAJCS8qIEVORCBKSyAwNi4wNy4wNDogTWFuYWdlbWVudCBvZiBzZXZyYWxzIGJvYXJkcyAqLwogCiAJCWluc24tPnVudXNlZFswXSA9IDA7Ci0JCWlfQVBDSTMyMDBfUmVhZEFuYWxvZ0lucHV0KGRldiwgcywgaW5zbiwgJnVpX0R1bW15KTsKKwkJYXBjaTMyMDBfYWlfcmVhZChkZXYsIHMsIGluc24sICZ1aV9EdW1teSk7CiAJfQogCiAJcmV0dXJuIGluc24tPm47CkBAIC0yMDk1LDEwICsyMDk1LDEwIEBACiAgKiBkYXRhWzFdIDogY2FsaWJyYXRpb24gb2Zmc2V0CiAgKiBkYXRhWzJdIDogY2FsaWJyYXRpb24gZ2FpbgogICovCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfSW5zbkJpdHNfQW5hbG9nSW5wdXRfVGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGFwY2kzMjAwX2FpX2JpdHNfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWlfQ29uZmlndXJhdGlvbiA9IDA7CkBAIC0yMTA3LDEyICsyMTA3LDEyIEBACiAJLyogaWYoaV9Jbml0aWFsaXNlZD09MCkgKi8KIAogCWlmIChzX0JvYXJkSW5mb3NbZGV2LT5taW5vcl0uaV9Jbml0aWFsaXNlZCA9PSAwKSB7Ci0JCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIGlmKGlfSW5pdGlhbGlzZWQ9PTApOyAqLwogCWlmIChkYXRhWzBdICE9IDAgJiYgZGF0YVswXSAhPSAxKSB7CiAJCXByaW50aygiXG5FcnJvciBpbiBzZWxlY3Rpb24gb2YgZnVuY3Rpb25hbGl0eVxuIik7Ci0JCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQkJCS8qIGlmKGRhdGFbMF0hPTAgJiYgZGF0YVswXSE9MSkgKi8KIApAQCAtMjIwMiwxOCArMjIwMiwxOCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfSW5zbldyaXRlUmVsZWFzZUFuYWxvZ0lucHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTMyMDBfYWlfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWlfQVBDSTMyMDBfUmVzZXQoZGV2KTsKKwlhcGNpMzIwMF9yZXNldChkZXYpOwogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfQ29tbWFuZFRlc3RBbmFsb2dJbnB1dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCitzdGF0aWMgaW50IGFwY2kzMjAwX2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCiAJaW50IGVyciA9IDA7CkBAIC0yMjQxLDcgKzIyNDEsNyBAQAogCQllcnIgfD0gLUVJTlZBTDsKIAogCWlmIChlcnIpIHsKLQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQlhcGNpMzIwMF9yZXNldChkZXYpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTIyNjcsNyArMjI2Nyw3IEBACiAJfQogCiAJaWYgKGVycikgewotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiAyOwogCX0KIAkvKiBpX0ZpcnN0Q2hhbm5lbD1jbWQtPmNoYW5saXN0WzBdOyAqLwpAQCAtMjMwOCw3ICsyMzA4LDcgQEAKIAkJCXByaW50aygiXG5UaGUgRGVsYXkgdGltZSB2YWx1ZSBpcyBpbiBlcnJvclxuIik7CiAJCX0KIAkJaWYgKGVycikgewotCQkJaV9BUENJMzIwMF9SZXNldChkZXYpOworCQkJYXBjaTMyMDBfcmVzZXQoZGV2KTsKIAkJCXJldHVybiAzOwogCQl9CiAJCWZwdV9iZWdpbigpOwpAQCAtMjM2NiwxNSArMjM2NiwxNSBAQAogCX0JCQkvKiBlbHNlIGlmKGNtZC0+c2Nhbl9iZWdpbl9zcmM9PVRSSUdfRk9MTE9XKSAqLwogCiAJaWYgKGVycikgewotCQlpX0FQQ0kzMjAwX1Jlc2V0KGRldik7CisJCWFwY2kzMjAwX3Jlc2V0KGRldik7CiAJCXJldHVybiA0OwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlfQVBDSTMyMDBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBpbnQgYXBjaTMyMDBfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCB1aV9Db25maWd1cmF0aW9uID0gMDsKQEAgLTI0MTAsOCArMjQxMCw4IEBACiAgKiBEb2VzIGFzeW5jaHJvbm91cyBhY3F1aXNpdGlvbgogICogRGV0ZXJtaW5lcyB0aGUgbW9kZSAxIG9yIDIuCiAgKi8KLXN0YXRpYyBpbnQgaV9BUENJMzIwMF9Db21tYW5kQW5hbG9nSW5wdXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIGludCBhcGNpMzIwMF9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBhZGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwpAQCAtMjYxOSw3ICsyNjE5LDYgQEAKIAkJLyogQkVHSU4gSksgMTguMTAuMjAwNDogQVBDSS0zMjAwIERyaXZlciB1cGRhdGUgMC43LjU3IC0+IDAuNy42OCAqLwogCQkvKiBUaGlzIHZhbHVlIGlzIG5vdCB1c2VkICovCiAJCS8qIHVpX0NoYW5uZWxOdW1iZXIgPSBpbmwoZGV2cHJpdi0+aW9iYXNlK3NfQm9hcmRJbmZvcyBbZGV2LT5taW5vcl0uaV9PZmZzZXQgKyAyNCk7ICovCi0JCXMtPmFzeW5jLT5ldmVudHMgPSAwOwogCQkvKiBFTkQgSksgMTguMTAuMjAwNDogQVBDSS0zMjAwIERyaXZlciB1cGRhdGUgMC43LjU3IC0+IDAuNy42OCAqLwogCiAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI3MzAsNyArMjcyOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZfQVBDSTMyMDBfSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCBhcGNpMzIwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgYWRkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCmluZGV4IGViYzE1MzQuLjIwZTg5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKQEAgLTE2LDEwICsxNiwxMCBAQAogICoJZGF0YVsyXSA6IFRpbWUgVW5pdAogICoJZGF0YVszXSA6IFJlbG9hZCBWYWx1ZQogICovCi1zdGF0aWMgaW50IGlfQVBDSTM1MDFfQ29uZmlnVGltZXJDb3VudGVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzUwMV9jb25maWdfaW5zbl90aW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IHVsX0NvbW1hbmQxID0gMDsKQEAgLTg2LDEwICs4NiwxMCBAQAogICoJCSAgMCBTdG9wCiAgKgkJICAyIFRyaWdnZXIKICAqLwotc3RhdGljIGludCBpX0FQQ0kzNTAxX1N0YXJ0U3RvcFdyaXRlVGltZXJDb3VudGVyV2F0Y2hkb2coc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBhcGNpMzUwMV93cml0ZV9pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYXBjaTM1MDFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZDEgPSAwOwpAQCAtMTUzLDEwICsxNTMsMTAgQEAKICAqCQkgIDIgV2F0Y2hkb2cKICAqCWRhdGFbMV0gOiBUaW1lciBDb3VudGVyIFdhdGNoZG9nIE51bWJlcgogICovCi1zdGF0aWMgaW50IGlfQVBDSTM1MDFfUmVhZFRpbWVyQ291bnRlcldhdGNoZG9nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyBpbnQgYXBjaTM1MDFfcmVhZF9pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYXBjaTM1MDFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8wMzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMDM1LmMKaW5kZXggY2NkNDkyMS4uNGRhOWRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8wMzUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzAzNS5jCkBAIC0yNywxMyArMjcsMTMgQEAKIAkJLmlfVGltZXIJCT0gMSwKIAkJLnVpX01pbkFjcXVpc2l0aW9udGltZU5zID0gMTAwMDAsCiAJCS51aV9NaW5EZWxheXRpbWVOcwk9IDEwMDAwMCwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kwMzVfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTAzNV9SZXNldCwKLQkJLmFpX2NvbmZpZwkJPSBpX0FQQ0kwMzVfQ29uZmlnQW5hbG9nSW5wdXQsCi0JCS5haV9yZWFkCQk9IGlfQVBDSTAzNV9SZWFkQW5hbG9nSW5wdXQsCi0JCS50aW1lcl9jb25maWcJCT0gaV9BUENJMDM1X0NvbmZpZ1RpbWVyV2F0Y2hkb2csCi0JCS50aW1lcl93cml0ZQkJPSBpX0FQQ0kwMzVfU3RhcnRTdG9wV3JpdGVUaW1lcldhdGNoZG9nLAotCQkudGltZXJfcmVhZAkJPSBpX0FQQ0kwMzVfUmVhZFRpbWVyV2F0Y2hkb2csCisJCS5pbnRlcnJ1cHQJCT0gYXBjaTAzNV9pbnRlcnJ1cHQsCisJCS5yZXNldAkJCT0gYXBjaTAzNV9yZXNldCwKKwkJLmFpX2NvbmZpZwkJPSBhcGNpMDM1X2FpX2NvbmZpZywKKwkJLmFpX3JlYWQJCT0gYXBjaTAzNV9haV9yZWFkLAorCQkudGltZXJfY29uZmlnCQk9IGFwY2kwMzVfdGltZXJfY29uZmlnLAorCQkudGltZXJfd3JpdGUJCT0gYXBjaTAzNV90aW1lcl93cml0ZSwKKwkJLnRpbWVyX3JlYWQJCT0gYXBjaTAzNV90aW1lcl9yZWFkLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCmluZGV4IDc0ZjdhY2UuLmJkOGUwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCkBAIC0yMCwxOSArMjAsMTkgQEAKIAkJLmlfTmJyRG9DaGFubmVsCQk9IDE2LAogCQkuaV9Eb01heGRhdGEJCT0gMHhmZmZmLAogCQkuaV9UaW1lcgkJPSAxLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTE1MDBfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTE1MDBfUmVzZXQsCi0JCS5kaV9jb25maWcJCT0gaV9BUENJMTUwMF9Db25maWdEaWdpdGFsSW5wdXRFdmVudCwKLQkJLmRpX3JlYWQJCT0gaV9BUENJMTUwMF9Jbml0aWFsaXNhdGlvbiwKLQkJLmRpX3dyaXRlCQk9IGlfQVBDSTE1MDBfU3RhcnRTdG9wSW5wdXRFdmVudCwKKwkJLmludGVycnVwdAkJPSBhcGNpMTUwMF9pbnRlcnJ1cHQsCisJCS5yZXNldAkJCT0gYXBjaTE1MDBfcmVzZXQsCisJCS5kaV9jb25maWcJCT0gYXBjaTE1MDBfZGlfY29uZmlnLAorCQkuZGlfcmVhZAkJPSBhcGNpMTUwMF9kaV9yZWFkLAorCQkuZGlfd3JpdGUJCT0gYXBjaTE1MDBfZGlfd3JpdGUsCiAJCS5kaV9iaXRzCQk9IGFwY2kxNTAwX2RpX2luc25fYml0cywKLQkJLmRvX2NvbmZpZwkJPSBpX0FQQ0kxNTAwX0NvbmZpZ0RpZ2l0YWxPdXRwdXRFcnJvckludGVycnVwdCwKLQkJLmRvX3dyaXRlCQk9IGlfQVBDSTE1MDBfV3JpdGVEaWdpdGFsT3V0cHV0LAotCQkuZG9fYml0cwkJPSBpX0FQQ0kxNTAwX0NvbmZpZ3VyZUludGVycnVwdCwKLQkJLnRpbWVyX2NvbmZpZwkJPSBpX0FQQ0kxNTAwX0NvbmZpZ0NvdW50ZXJUaW1lcldhdGNoZG9nLAotCQkudGltZXJfd3JpdGUJCT0gaV9BUENJMTUwMF9TdGFydFN0b3BUcmlnZ2VyVGltZXJDb3VudGVyV2F0Y2hkb2csCi0JCS50aW1lcl9yZWFkCQk9IGlfQVBDSTE1MDBfUmVhZEludGVycnVwdE1hc2ssCi0JCS50aW1lcl9iaXRzCQk9IGlfQVBDSTE1MDBfUmVhZENvdW50ZXJUaW1lcldhdGNoZG9nLAorCQkuZG9fY29uZmlnCQk9IGFwY2kxNTAwX2RvX2NvbmZpZywKKwkJLmRvX3dyaXRlCQk9IGFwY2kxNTAwX2RvX3dyaXRlLAorCQkuZG9fYml0cwkJPSBhcGNpMTUwMF9kb19iaXRzLAorCQkudGltZXJfY29uZmlnCQk9IGFwY2kxNTAwX3RpbWVyX2NvbmZpZywKKwkJLnRpbWVyX3dyaXRlCQk9IGFwY2kxNTAwX3RpbWVyX3dyaXRlLAorCQkudGltZXJfcmVhZAkJPSBhcGNpMTUwMF90aW1lcl9yZWFkLAorCQkudGltZXJfYml0cwkJPSBhcGNpMTUwMF90aW1lcl9iaXRzLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCmluZGV4IDYyNDgyODQuLjI3YWE5YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCkBAIC0yMSwxNiArMjEsMTYgQEAKIAkJLmlfTmJyRG9DaGFubmVsCQk9IDMyLAogCQkuaV9Eb01heGRhdGEJCT0gMHhmZmZmZmZmZiwKIAkJLmlfVGltZXIJCT0gMSwKLQkJLmludGVycnVwdAkJPSB2X0FQQ0kxNTY0X0ludGVycnVwdCwKLQkJLnJlc2V0CQkJPSBpX0FQQ0kxNTY0X1Jlc2V0LAotCQkuZGlfY29uZmlnCQk9IGlfQVBDSTE1NjRfQ29uZmlnRGlnaXRhbElucHV0LAorCQkuaW50ZXJydXB0CQk9IGFwY2kxNTY0X2ludGVycnVwdCwKKwkJLnJlc2V0CQkJPSBhcGNpMTU2NF9yZXNldCwKKwkJLmRpX2NvbmZpZwkJPSBhcGNpMTU2NF9kaV9jb25maWcsCiAJCS5kaV9iaXRzCQk9IGFwY2kxNTY0X2RpX2luc25fYml0cywKLQkJLmRvX2NvbmZpZwkJPSBpX0FQQ0kxNTY0X0NvbmZpZ0RpZ2l0YWxPdXRwdXQsCisJCS5kb19jb25maWcJCT0gYXBjaTE1NjRfZG9fY29uZmlnLAogCQkuZG9fYml0cwkJPSBhcGNpMTU2NF9kb19pbnNuX2JpdHMsCi0JCS5kb19yZWFkCQk9IGlfQVBDSTE1NjRfUmVhZEludGVycnVwdFN0YXR1cywKLQkJLnRpbWVyX2NvbmZpZwkJPSBpX0FQQ0kxNTY0X0NvbmZpZ1RpbWVyQ291bnRlcldhdGNoZG9nLAotCQkudGltZXJfd3JpdGUJCT0gaV9BUENJMTU2NF9TdGFydFN0b3BXcml0ZVRpbWVyQ291bnRlcldhdGNoZG9nLAotCQkudGltZXJfcmVhZAkJPSBpX0FQQ0kxNTY0X1JlYWRUaW1lckNvdW50ZXJXYXRjaGRvZywKKwkJLmRvX3JlYWQJCT0gYXBjaTE1NjRfZG9fcmVhZCwKKwkJLnRpbWVyX2NvbmZpZwkJPSBhcGNpMTU2NF90aW1lcl9jb25maWcsCisJCS50aW1lcl93cml0ZQkJPSBhcGNpMTU2NF90aW1lcl93cml0ZSwKKwkJLnRpbWVyX3JlYWQJCT0gYXBjaTE1NjRfdGltZXJfcmVhZCwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYwppbmRleCAxZTZmYTU2Li41N2VlNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYwpAQCAtMjYsNyArMjYsNyBAQAogCQkuaV9OYnJEaUNoYW5uZWwJCT0gNCwKIAkJLmlfTmJyRG9DaGFubmVsCQk9IDQsCiAJCS5pX0RvTWF4ZGF0YQkJPSAweDBmLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTMxMjBfSW50ZXJydXB0LAorCQkuaW50ZXJydXB0CQk9IGFwY2kzMTIwX2ludGVycnVwdCwKIAl9LAogCVtCT0FSRF9BUENJMzAwMV0gPSB7CiAJCS5wY19Ecml2ZXJOYW1lCQk9ICJhcGNpMzAwMSIsCkBAIC0zNyw3ICszNyw3IEBACiAJCS5pX05ickRpQ2hhbm5lbAkJPSA0LAogCQkuaV9OYnJEb0NoYW5uZWwJCT0gNCwKIAkJLmlfRG9NYXhkYXRhCQk9IDB4MGYsCi0JCS5pbnRlcnJ1cHQJCT0gdl9BUENJMzEyMF9JbnRlcnJ1cHQsCisJCS5pbnRlcnJ1cHQJCT0gYXBjaTMxMjBfaW50ZXJydXB0LAogCX0sCiB9OwogCkBAIC0xMzYsMTEgKzEzNiwxMSBAQAogCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPmlfQWlDaGFubmVsTGlzdDsKIAlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hcGNpMzEyMF9haTsKIAotCXMtPmluc25fY29uZmlnID0gaV9BUENJMzEyMF9JbnNuQ29uZmlnQW5hbG9nSW5wdXQ7Ci0Jcy0+aW5zbl9yZWFkID0gaV9BUENJMzEyMF9JbnNuUmVhZEFuYWxvZ0lucHV0OwotCXMtPmRvX2NtZHRlc3QgPSBpX0FQQ0kzMTIwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQ7Ci0Jcy0+ZG9fY21kID0gaV9BUENJMzEyMF9Db21tYW5kQW5hbG9nSW5wdXQ7Ci0Jcy0+Y2FuY2VsID0gaV9BUENJMzEyMF9TdG9wQ3ljbGljQWNxdWlzaXRpb247CisJcy0+aW5zbl9jb25maWcgPSBhcGNpMzEyMF9haV9pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX3JlYWQgPSBhcGNpMzEyMF9haV9pbnNuX3JlYWQ7CisJcy0+ZG9fY21kdGVzdCA9IGFwY2kzMTIwX2FpX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gYXBjaTMxMjBfYWlfY21kOworCXMtPmNhbmNlbCA9IGFwY2kzMTIwX2NhbmNlbDsKIAogCS8qICBBbGxvY2F0ZSBhbmQgSW5pdGlhbGlzZSBBTyBTdWJkZXZpY2UgU3RydWN0dXJlcyAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJCXMtPm1heGRhdGEgPSB0aGlzX2JvYXJkLT5pX0FvTWF4ZGF0YTsKIAkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+aV9OYnJBb0NoYW5uZWw7CiAJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FwY2kzMTIwX2FvOwotCQlzLT5pbnNuX3dyaXRlID0gaV9BUENJMzEyMF9JbnNuV3JpdGVBbmFsb2dPdXRwdXQ7CisJCXMtPmluc25fd3JpdGUgPSBhcGNpMzEyMF9hb19pbnNuX3dyaXRlOwogCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQpAQCAtMTg2LDExICsxODYsMTEgQEAKIAlzLT5sZW5fY2hhbmxpc3QgPSAxOwogCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAKLQlzLT5pbnNuX3dyaXRlID0gaV9BUENJMzEyMF9JbnNuV3JpdGVUaW1lcjsKLQlzLT5pbnNuX3JlYWQgPSBpX0FQQ0kzMTIwX0luc25SZWFkVGltZXI7Ci0Jcy0+aW5zbl9jb25maWcgPSBpX0FQQ0kzMTIwX0luc25Db25maWdUaW1lcjsKKwlzLT5pbnNuX3dyaXRlID0gYXBjaTMxMjBfd3JpdGVfaW5zbl90aW1lcjsKKwlzLT5pbnNuX3JlYWQgPSBhcGNpMzEyMF9yZWFkX2luc25fdGltZXI7CisJcy0+aW5zbl9jb25maWcgPSBhcGNpMzEyMF9jb25maWdfaW5zbl90aW1lcjsKIAotCWlfQVBDSTMxMjBfUmVzZXQoZGV2KTsKKwlhcGNpMzEyMF9yZXNldChkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDAsNyArMjAwLDcgQEAKIAogCWlmIChkZXZwcml2KSB7CiAJCWlmIChkZXYtPmlvYmFzZSkKLQkJCWlfQVBDSTMxMjBfUmVzZXQoZGV2KTsKKwkJCWFwY2kzMTIwX3Jlc2V0KGRldik7CiAJCWlmIChkZXYtPmlycSkKIAkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCQlpZiAoZGV2cHJpdi0+dWxfRG1hQnVmZmVyVmlydHVhbFswXSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMyMDAuYwppbmRleCA5ODY4YTUzLi5mMGY4OTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMyMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMyMDAuYwpAQCAtNDMsMTUgKzQzLDE1IEBACiAJCS5pX05ickRvQ2hhbm5lbAkJPSA0LAogCQkudWlfTWluQWNxdWlzaXRpb250aW1lTnMgPSAxMDAwMCwKIAkJLnVpX01pbkRlbGF5dGltZU5zCT0gMTAwMDAwLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTMyMDBfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTMyMDBfUmVzZXQsCi0JCS5haV9jb25maWcJCT0gaV9BUENJMzIwMF9Db25maWdBbmFsb2dJbnB1dCwKLQkJLmFpX3JlYWQJCT0gaV9BUENJMzIwMF9SZWFkQW5hbG9nSW5wdXQsCi0JCS5haV93cml0ZQkJPSBpX0FQQ0kzMjAwX0luc25Xcml0ZVJlbGVhc2VBbmFsb2dJbnB1dCwKLQkJLmFpX2JpdHMJCT0gaV9BUENJMzIwMF9JbnNuQml0c19BbmFsb2dJbnB1dF9UZXN0LAotCQkuYWlfY21kdGVzdAkJPSBpX0FQQ0kzMjAwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQsCi0JCS5haV9jbWQJCQk9IGlfQVBDSTMyMDBfQ29tbWFuZEFuYWxvZ0lucHV0LAotCQkuYWlfY2FuY2VsCQk9IGlfQVBDSTMyMDBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uLAorCQkuaW50ZXJydXB0CQk9IGFwY2kzMjAwX2ludGVycnVwdCwKKwkJLnJlc2V0CQkJPSBhcGNpMzIwMF9yZXNldCwKKwkJLmFpX2NvbmZpZwkJPSBhcGNpMzIwMF9haV9jb25maWcsCisJCS5haV9yZWFkCQk9IGFwY2kzMjAwX2FpX3JlYWQsCisJCS5haV93cml0ZQkJPSBhcGNpMzIwMF9haV93cml0ZSwKKwkJLmFpX2JpdHMJCT0gYXBjaTMyMDBfYWlfYml0c190ZXN0LAorCQkuYWlfY21kdGVzdAkJPSBhcGNpMzIwMF9haV9jbWR0ZXN0LAorCQkuYWlfY21kCQkJPSBhcGNpMzIwMF9haV9jbWQsCisJCS5haV9jYW5jZWwJCT0gYXBjaTMyMDBfY2FuY2VsLAogCQkuZGlfYml0cwkJPSBhcGNpMzIwMF9kaV9pbnNuX2JpdHMsCiAJCS5kb19iaXRzCQk9IGFwY2kzMjAwX2RvX2luc25fYml0cywKIAl9LApAQCAtNjgsMTUgKzY4LDE1IEBACiAJCS5pX05ickRvQ2hhbm5lbAkJPSA0LAogCQkudWlfTWluQWNxdWlzaXRpb250aW1lTnMgPSAxMDAwMCwKIAkJLnVpX01pbkRlbGF5dGltZU5zCT0gMTAwMDAwLAotCQkuaW50ZXJydXB0CQk9IHZfQVBDSTMyMDBfSW50ZXJydXB0LAotCQkucmVzZXQJCQk9IGlfQVBDSTMyMDBfUmVzZXQsCi0JCS5haV9jb25maWcJCT0gaV9BUENJMzIwMF9Db25maWdBbmFsb2dJbnB1dCwKLQkJLmFpX3JlYWQJCT0gaV9BUENJMzIwMF9SZWFkQW5hbG9nSW5wdXQsCi0JCS5haV93cml0ZQkJPSBpX0FQQ0kzMjAwX0luc25Xcml0ZVJlbGVhc2VBbmFsb2dJbnB1dCwKLQkJLmFpX2JpdHMJCT0gaV9BUENJMzIwMF9JbnNuQml0c19BbmFsb2dJbnB1dF9UZXN0LAotCQkuYWlfY21kdGVzdAkJPSBpX0FQQ0kzMjAwX0NvbW1hbmRUZXN0QW5hbG9nSW5wdXQsCi0JCS5haV9jbWQJCQk9IGlfQVBDSTMyMDBfQ29tbWFuZEFuYWxvZ0lucHV0LAotCQkuYWlfY2FuY2VsCQk9IGlfQVBDSTMyMDBfU3RvcEN5Y2xpY0FjcXVpc2l0aW9uLAorCQkuaW50ZXJydXB0CQk9IGFwY2kzMjAwX2ludGVycnVwdCwKKwkJLnJlc2V0CQkJPSBhcGNpMzIwMF9yZXNldCwKKwkJLmFpX2NvbmZpZwkJPSBhcGNpMzIwMF9haV9jb25maWcsCisJCS5haV9yZWFkCQk9IGFwY2kzMjAwX2FpX3JlYWQsCisJCS5haV93cml0ZQkJPSBhcGNpMzIwMF9haV93cml0ZSwKKwkJLmFpX2JpdHMJCT0gYXBjaTMyMDBfYWlfYml0c190ZXN0LAorCQkuYWlfY21kdGVzdAkJPSBhcGNpMzIwMF9haV9jbWR0ZXN0LAorCQkuYWlfY21kCQkJPSBhcGNpMzIwMF9haV9jbWQsCisJCS5haV9jYW5jZWwJCT0gYXBjaTMyMDBfY2FuY2VsLAogCQkuZGlfYml0cwkJPSBhcGNpMzIwMF9kaV9pbnNuX2JpdHMsCiAJCS5kb19iaXRzCQk9IGFwY2kzMjAwX2RvX2luc25fYml0cywKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwppbmRleCA0Y2I2OWVjLi40OWJmMWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwpAQCAtMzkwLDkgKzM5MCw5IEBACiAJcy0+bWF4ZGF0YSA9IDA7CiAJcy0+bGVuX2NoYW5saXN0ID0gMTsKIAlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCXMtPmluc25fd3JpdGUgPSBpX0FQQ0kzNTAxX1N0YXJ0U3RvcFdyaXRlVGltZXJDb3VudGVyV2F0Y2hkb2c7Ci0Jcy0+aW5zbl9yZWFkID0gaV9BUENJMzUwMV9SZWFkVGltZXJDb3VudGVyV2F0Y2hkb2c7Ci0Jcy0+aW5zbl9jb25maWcgPSBpX0FQQ0kzNTAxX0NvbmZpZ1RpbWVyQ291bnRlcldhdGNoZG9nOworCXMtPmluc25fd3JpdGUgPSBhcGNpMzUwMV93cml0ZV9pbnNuX3RpbWVyOworCXMtPmluc25fcmVhZCA9IGFwY2kzNTAxX3JlYWRfaW5zbl90aW1lcjsKKwlzLT5pbnNuX2NvbmZpZyA9IGFwY2kzNTAxX2NvbmZpZ19pbnNuX3RpbWVyOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZWVwcm9tIHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYwppbmRleCBjZWFkZjhlLi42ZGMxMWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYwpAQCAtNDM0LDEzICs0MzQsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhcGNpM3h4eF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBhcGNpM3h4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgMjApOworCWlmIChzdGF0dXMgJiAweDEpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgYXBjaTN4eHhfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYXBjaTN4eHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgdmFsOwogCWludCByZXQ7CiAJaW50IGk7CiAKQEAgLTQ1MywxMCArNDY2LDkgQEAKIAkJd3JpdGVsKDB4ODAwMDAsIGRldnByaXYtPm1taW8gKyA4KTsKIAogCQkvKiBXYWl0IHRoZSBFT1MgKi8KLQkJZG8gewotCQkJdmFsID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDIwKTsKLQkJCXZhbCAmPSAweDE7Ci0JCX0gd2hpbGUgKCF2YWwpOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGFwY2kzeHh4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIFJlYWQgdGhlIGFuYWxvZyB2YWx1ZSAqLwogCQlkYXRhW2ldID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDI4KTsKQEAgLTYyMiw2ICs2MzQsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhcGNpM3h4eF9hb19lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBhcGNpM3h4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgOTYpOworCWlmIChzdGF0dXMgJiAweDEwMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBhcGNpM3h4eF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTYzMCw3ICs2NTYsNyBAQAogCXN0cnVjdCBhcGNpM3h4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IHJldDsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKQEAgLTY0MSw5ICs2NjcsOSBAQAogCQl3cml0ZWwoKGRhdGFbaV0gPDwgOCkgfCBjaGFuLCBkZXZwcml2LT5tbWlvICsgMTAwKTsKIAogCQkvKiBXYWl0IHRoZSBlbmQgb2YgdHJhbnNmZXIgKi8KLQkJZG8gewotCQkJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIDk2KTsKLQkJfSB3aGlsZSAoKHN0YXR1cyAmIDB4MTAwKSAhPSAweDEwMCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgYXBjaTN4eHhfYW9fZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIGluc24tPm47CkBAIC02ODAsNyArNzA2LDcgQEAKIAkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCWludCByZXQ7CiAKIAkvKgpAQCAtNjg4LDEyICs3MTQsMTMgQEAKIAkgKiBQb3J0IDEgKGNoYW5uZWxzIDgtMTUpIGFyZSBhbHdheXMgb3V0cHV0cwogCSAqIFBvcnQgMiAoY2hhbm5lbHMgMTYtMjMpIGFyZSBwcm9ncmFtbWFibGUgaS9vCiAJICovCi0JaWYgKGNoYW4gPCAxNikgewotCQlpZiAoZGF0YVswXSAhPSBJTlNOX0NPTkZJR19ESU9fUVVFUlkpCisJaWYgKGRhdGFbMF0gIT0gSU5TTl9DT05GSUdfRElPX1FVRVJZKSB7CisJCS8qIGlnbm9yZSBhbGwgb3RoZXIgaW5zdHJ1Y3Rpb25zIGZvciBwb3J0cyAwIGFuZCAxICovCisJCWlmIChjaGFuIDwgMTYpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQkvKiBjaGFuZ2luZyBhbnkgY2hhbm5lbCBpbiBwb3J0IDIgY2hhbmdlcyB0aGUgZW50aXJlIHBvcnQgKi8KLQkJbWFzayA9IDB4ZmYwMDAwOworCQllbHNlCisJCQkvKiBjaGFuZ2luZyBhbnkgY2hhbm5lbCBpbiBwb3J0IDIgY2hhbmdlcyB0aGUgZW50aXJlIHBvcnQgKi8KKwkJCW1hc2sgPSAweGZmMDAwMDsKIAl9CiAKIAlyZXQgPSBjb21lZGlfZGlvX2luc25fY29uZmlnKGRldiwgcywgaW5zbiwgZGF0YSwgbWFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCmluZGV4IDVjMTQxM2EuLjkyMWY2OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jCkBAIC03MywxOSArNzMsMTcgQEAKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbUENJNjIwOF9NQVhfQU9fQ0hBTk5FTFNdOwogfTsKIAotc3RhdGljIGludCBwY2k2MjA4X2FvX3dhaXRfZm9yX2RhdGFfc2VuZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgdW5zaWduZWQgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHBjaTYyMDhfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0k2MjA4X0FPX1NUQVRVUyk7Ci0JCWlmICgoc3RhdHVzICYgUENJNjIwOF9BT19TVEFUVVNfREFUQV9TRU5EKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gLUVUSU1FOworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFBDSTYyMDhfQU9fU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIFBDSTYyMDhfQU9fU1RBVFVTX0RBVEFfU0VORCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBwY2k2MjA4X2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTEwMiw4ICsxMDAsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJdmFsID0gZGF0YVtpXTsKIAotCQkvKiBEL0EgdHJhbnNmZXIgcmF0ZSBpcyAyLjJ1cywgd2FpdCB1cCB0byAxMHVzICovCi0JCXJldCA9IHBjaTYyMDhfYW9fd2FpdF9mb3JfZGF0YV9zZW5kKGRldiwgMTApOworCQkvKiBEL0EgdHJhbnNmZXIgcmF0ZSBpcyAyLjJ1cyAqLworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjaTYyMDhfYW9fZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3eDN4LmMKaW5kZXggNmY2MjJiNC4uNWUzY2M3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3eDN4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3eDN4LmMKQEAgLTIzOSw5ICsyMzksNiBAQAogCQl9CiAJfQogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZCAoJWQgaW5wdXRzLyVkIG91dHB1dHMpXG4iLAotCQlkZXYtPmJvYXJkX25hbWUsIGJvYXJkLT5kaV9uY2hhbiwgYm9hcmQtPmRvX25jaGFuKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCmluZGV4IDM2M2YyZTQuLmEyOWNlYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCkBAIC04NCw3ICs4NCw2IEBACiAKICNkZWZpbmUgUENJOTExMV9SQU5HRV9TRVRUSU5HX0RFTEFZCQkxMAogI2RlZmluZSBQQ0k5MTExX0FJX0lOU1RBTlRfUkVBRF9VREVMQVlfVVMJMgotI2RlZmluZSBQQ0k5MTExX0FJX0lOU1RBTlRfUkVBRF9USU1FT1VUCQkxMDAKIAogLyoKICAqIElPIGFkZHJlc3MgbWFwIGFuZCBiaXQgZGVmaW5lcwpAQCAtNDkwLDI5ICs0ODksMTggQEAKIAkJZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0FJX1JBTkdFX1NUQVRfUkVHKTsKIAogCS8qIFNldCBjb3VudGVyICovCi0KLQlzd2l0Y2ggKGFzeW5jX2NtZC0+c3RvcF9zcmMpIHsKLQljYXNlIFRSSUdfQ09VTlQ6CisJaWYgKGFzeW5jX2NtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewogCQlkZXZfcHJpdmF0ZS0+c3RvcF9jb3VudGVyID0KIAkJICAgIGFzeW5jX2NtZC0+c3RvcF9hcmcgKiBhc3luY19jbWQtPmNoYW5saXN0X2xlbjsKIAkJZGV2X3ByaXZhdGUtPnN0b3BfaXNfbm9uZSA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUklHX05PTkU6CisJfSBlbHNlIHsJLyogVFJJR19OT05FICovCiAJCWRldl9wcml2YXRlLT5zdG9wX2NvdW50ZXIgPSAwOwogCQlkZXZfcHJpdmF0ZS0+c3RvcF9pc19ub25lID0gMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQljb21lZGlfZXJyb3IoZGV2LCAiSW52YWxpZCBzdG9wIHRyaWdnZXIiKTsKLQkJcmV0dXJuIC0xOwogCX0KIAogCS8qICBTZXQgdGltZXIgcGFjZXIgKi8KLQogCWRldl9wcml2YXRlLT5zY2FuX2RlbGF5ID0gMDsKLQlzd2l0Y2ggKGFzeW5jX2NtZC0+Y29udmVydF9zcmMpIHsKLQljYXNlIFRSSUdfVElNRVI6CisJaWYgKGFzeW5jX2NtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlwY2k5MTExX3RyaWdnZXJfc291cmNlX3NldChkZXYsIHNvZnR3YXJlKTsKIAkJcGNpOTExMV90aW1lcl9zZXQoZGV2KTsKIAkJcGNpOTExMV9maWZvX3Jlc2V0KGRldik7CkBAIC01MjgsMTEgKzUxNiw3IEBACiAJCQkJIChhc3luY19jbWQtPmNvbnZlcnRfYXJnICoKIAkJCQkgIGFzeW5jX2NtZC0+Y2hhbmxpc3RfbGVuKSkgLSAxOwogCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFRSSUdfRVhUOgotCisJfSBlbHNlIHsJLyogVFJJR19FWFQgKi8KIAkJcGNpOTExMV90cmlnZ2VyX3NvdXJjZV9zZXQoZGV2LCBleHRlcm5hbCk7CiAJCXBjaTkxMTFfZmlmb19yZXNldChkZXYpOwogCQlwY2k5MTExX2ludGVycnVwdF9zb3VyY2Vfc2V0KGRldiwgaXJxX29uX2ZpZm9faGFsZl9mdWxsLApAQCAtNTQwLDExICs1MjQsNiBAQAogCQlwbHg5MDUwX2ludGVycnVwdF9jb250cm9sKGRldl9wcml2YXRlLT5sY3JfaW9fYmFzZSwgdHJ1ZSwgdHJ1ZSwKIAkJCQkJICBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CiAKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQljb21lZGlfZXJyb3IoZGV2LCAiSW52YWxpZCBjb252ZXJ0IHRyaWdnZXIiKTsKLQkJcmV0dXJuIC0xOwogCX0KIAogCWRldl9wcml2YXRlLT5zdG9wX2NvdW50ZXIgKj0gKDEgKyBkZXZfcHJpdmF0ZS0+c2Nhbl9kZWxheSk7CkBAIC02MTMsOSArNTkyLDggQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGlycV9mbGFncyk7CiAJCQljb21lZGlfZXJyb3IoZGV2LCBQQ0k5MTExX0RSSVZFUl9OQU1FICIgZmlmbyBvdmVyZmxvdyIpOwogCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfSU5UX0NMUl9SRUcpOwotCQkJcGNpOTExMV9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAogCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQl9CkBAIC02OTMsMjAgKzY3MSwzMSBAQAogCQl9CiAJfQogCi0JaWYgKChkZXZfcHJpdmF0ZS0+c3RvcF9jb3VudGVyID09IDApICYmICghZGV2X3ByaXZhdGUtPnN0b3BfaXNfbm9uZSkpIHsKKwlpZiAoZGV2X3ByaXZhdGUtPnN0b3BfY291bnRlciA9PSAwICYmICFkZXZfcHJpdmF0ZS0+c3RvcF9pc19ub25lKQogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCXBjaTkxMTFfYWlfY2FuY2VsKGRldiwgcyk7Ci0JfQogCiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfSU5UX0NMUl9SRUcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgaXJxX2ZsYWdzKTsKIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpbnQgcGNpOTExMV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0FJX1JBTkdFX1NUQVRfUkVHKTsKKwlpZiAoc3RhdHVzICYgUENJOTExMV9BSV9TVEFUX0ZGX0VGKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjaTkxMTFfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC03MTcsNyArNzA2LDcgQEAKIAl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gKG1heGRhdGEgKyAxKSA+PiAxOwogCXVuc2lnbmVkIGludCBzaGlmdCA9IChtYXhkYXRhID09IDB4ZmZmZikgPyAwIDogNDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCWludCB0aW1lb3V0OworCWludCByZXQ7CiAJaW50IGk7CiAKIAlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9DSEFOTkVMX1JFRyk7CkBAIC03MzQsMjIgKzcyMywxMiBAQAogCQkvKiBHZW5lcmF0ZSBhIHNvZnR3YXJlIHRyaWdnZXIgKi8KIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfU09GVF9UUklHX1JFRyk7CiAKLQkJdGltZW91dCA9IFBDSTkxMTFfQUlfSU5TVEFOVF9SRUFEX1RJTUVPVVQ7Ci0KLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7Ci0JCQkvKiAnMScgbWVhbnMgRklGTyBpcyBub3QgZW1wdHkgKi8KLQkJCWlmIChzdGF0dXMgJiBQQ0k5MTExX0FJX1NUQVRfRkZfRUYpCi0JCQkJZ290byBjb252ZXJzaW9uX2RvbmU7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNpOTExMV9haV9lb2MsIDApOworCQlpZiAocmV0KSB7CisJCQlwY2k5MTExX2ZpZm9fcmVzZXQoZGV2KTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIHJlYWQgdGltZW91dCIpOwotCQlkYXRhW2ldID0gMDsKLQkJcGNpOTExMV9maWZvX3Jlc2V0KGRldik7Ci0JCXJldHVybiAtRVRJTUU7Ci0KLWNvbnZlcnNpb25fZG9uZToKLQogCQlkYXRhW2ldID0gaW53KGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9GSUZPX1JFRyk7CiAJCWRhdGFbaV0gPSAoKGRhdGFbaV0gPj4gc2hpZnQpICYgbWF4ZGF0YSkgXiBpbnZlcnQ7CiAJfQpAQCAtOTA2LDggKzg4NSw2IEBACiAJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKIAlzLT5pbnNuX2JpdHMJPSBwY2k5MTExX2RvX2luc25fYml0czsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwppbmRleCA0YmRkOTcyLi4zY2ZhMTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYwpAQCAtNTcxLDEyICs1NzEsMjYgQEAKIAlyZXR1cm4gMTsJCS8qIHdlIGNhbiBzZXJ2ZSB0aGlzIHdpdGggc2NhbiBsb2dpYyAqLwogfQogCitzdGF0aWMgaW50IHBjaTkxMThfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5sKGRldi0+aW9iYXNlICsgUENJOTExOF9BRFNUQVQpOworCWlmIChzdGF0dXMgJiBBZFN0YXR1c19BRHJkeSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBwY2k5MTE4X2luc25fcmVhZF9haShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBwY2k5MTE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIHRpbWVvdXQ7CisJaW50IHJldDsKKwlpbnQgbjsKIAogCWRldnByaXYtPkFkQ29udHJvbFJlZyA9IEFkQ29udHJvbF9JbnQgJiAweGZmOwogCWRldnByaXYtPkFkRnVuY3Rpb25SZWcgPSBBZEZ1bmN0aW9uX1BEVHJnIHwgQWRGdW5jdGlvbl9QRVRyZzsKQEAgLTU5NywxOSArNjExLDEzIEBACiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgUENJOTExOF9TT0ZUVFJHKTsJLyogc3RhcnQgY29udmVyc2lvbiAqLwogCQl1ZGVsYXkoMik7Ci0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmIChpbmwoZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FEU1RBVCkgJiBBZFN0YXR1c19BRHJkeSkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQkJdWRlbGF5KDEpOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNpOTExOF9haV9lb2MsIDApOworCQlpZiAocmV0KSB7CisJCQlvdXRsKDAsIGRldi0+aW9iYXNlICsgUENJOTExOF9ERUxGSUZPKTsJLyogZmx1c2ggRklGTyAqLworCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgaW5zbiB0aW1lb3V0Iik7Ci0JCWRhdGFbbl0gPSAwOwotCQlvdXRsKDAsIGRldi0+aW9iYXNlICsgUENJOTExOF9ERUxGSUZPKTsJLyogZmx1c2ggRklGTyAqLwotCQlyZXR1cm4gLUVUSU1FOwotCi1jb252X2ZpbmlzaDoKIAkJaWYgKGRldnByaXYtPmFpMTZiaXRzKSB7CiAJCQlkYXRhW25dID0KIAkJCSAgICAoaW5sKGRldi0+aW9iYXNlICsKQEAgLTkxMSw4ICs5MTksNyBAQAogCX0KIAlpZiAobSAmIGRldnByaXYtPmFpX21hc2toYXJkZXJyKSB7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKLQkJcGNpOTExOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtOTQ4LDggKzk1NSw2IEBACiAJc3RydWN0IHBjaTkxMThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBzaG9ydCBzYW1wbDsKIAotCXMtPmFzeW5jLT5ldmVudHMgPSAwOwotCiAJaWYgKGludF9hZHN0YXQgJiBkZXZwcml2LT5haV9tYXNrZXJyKQogCQlpZiAocGNpOTExOF9kZWNvZGVfZXJyb3Jfc3RhdHVzKGRldiwgcywgaW50X2Fkc3RhdCkpCiAJCQlyZXR1cm47CkBAIC05NjUsOCArOTcwLDcgQEAKIAkJCQkgc2FtcGwgJiAweDAwMGYsCiAJCQkJIGRldnByaXYtPmNoYW5saXN0W3MtPmFzeW5jLT5jdXJfY2hhbl0pOwogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQkJcGNpOTExOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTk3NywxNiArOTgxLDE0IEBACiAJCQkJCQkJLyogb25lIHNjYW4gZG9uZSAqLwogCQlzLT5hc3luYy0+Y3VyX2NoYW4gJT0gZGV2cHJpdi0+YWlfbl9zY2FubGVuOwogCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwotCQlpZiAoIShkZXZwcml2LT5haV9uZXZlcmVuZGluZykpCi0JCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsKLQkJCQkJCQkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQkJcGNpOTExOF9haV9jYW5jZWwoZGV2LCBzKTsKKwkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykgeworCQkJLyogYWxsIGRhdGEgc2FtcGxlZD8gKi8KKwkJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQl9CisJCX0KIAl9CiAKLQlpZiAocy0+YXN5bmMtPmV2ZW50cykKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZXJydXB0X3BjaTkxMThfYWlfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xMDAxLDE2ICsxMDAzLDE0IEBACiAJaWYgKGludF9hbWNjICYgTUFTVEVSX0FCT1JUX0lOVCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiQU1DQyBJUlEgLSBNQVNURVIgRE1BIEFCT1JUISIpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGludF9hbWNjICYgVEFSR0VUX0FCT1JUX0lOVCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiQU1DQyBJUlEgLSBUQVJHRVQgRE1BIEFCT1JUISIpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCWlmIChpbnRfYWRzdGF0ICYgZGV2cHJpdi0+YWlfbWFza2VycikKQEAgLTEwNDgsMTIgKzEwNDgsMTEgQEAKIAkJbSA9IG0gLSBzYW1wbHM7CQkvKiBtPSBob3cgbWFueSBzYW1wbGVzIHdhcyB0cmFuc2ZlcnJlZCAqLwogCX0KIAotCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpCi0JCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgewotCQkJCQkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCXBjaTkxMThfYWlfY2FuY2VsKGRldiwgcyk7CisJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykgeworCQkvKiBhbGwgZGF0YSBzYW1wbGVkPyAqLworCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpCiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCX0KKwl9CiAKIAlpZiAoZGV2cHJpdi0+ZG1hX2RvdWJsZWJ1ZikgewkvKiBzd2l0Y2ggZG1hIGJ1ZmZlcnMgKi8KIAkJZGV2cHJpdi0+ZG1hX2FjdGJ1ZiA9IDEgLSBkZXZwcml2LT5kbWFfYWN0YnVmOwpAQCAtMTA2Niw3ICsxMDY1LDcgQEAKIAkJCWludGVycnVwdF9wY2k5MTE4X2FpX21vZGU0X3N3aXRjaChkZXYpOwogCX0KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNpOTExOChpbnQgaXJxLCB2b2lkICpkKQpAQCAtMTkzNiwyOCArMTkzNSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaTkxMThfcmVwb3J0X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2k5MTE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JY2hhciBpcnFidWZbMzBdOwotCWNoYXIgbXV4YnVmWzMwXTsKLQotCWlmIChpcnEpCi0JCXNucHJpbnRmKGlycWJ1Ziwgc2l6ZW9mKGlycWJ1ZiksICJpcnEgJXUlcyIsIGlycSwKLQkJCSAoZGV2LT5pcnEgPyAiIiA6ICIgVU5BVkFJTEFCTEUiKSk7Ci0JZWxzZQotCQlzbnByaW50ZihpcnFidWYsIHNpemVvZihpcnFidWYpLCAiaXJxIERJU0FCTEVEIik7Ci0JaWYgKGRldnByaXYtPnVzZW11eCkKLQkJc25wcmludGYobXV4YnVmLCBzaXplb2YobXV4YnVmKSwgImV4dCBtdXggJXUgY2hhbnMiLAotCQkJIGRldnByaXYtPnVzZW11eCk7Ci0JZWxzZQotCQlzbnByaW50ZihtdXhidWYsIHNpemVvZihtdXhidWYpLCAibm8gZXh0IG11eCIpOwotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgKHBjaSAlcywgJXMsICVzYnVzIG1hc3RlciwgJXMpIGF0dGFjaGVkXG4iLAotCQkgZGV2LT5ib2FyZF9uYW1lLCBwY2lfbmFtZShwY2lkZXYpLCBpcnFidWYsCi0JCSAoZGV2cHJpdi0+bWFzdGVyID8gIiIgOiAibm8gIiksIG11eGJ1Zik7Ci19Ci0KIHN0YXRpYyBpbnQgcGNpOTExOF9jb21tb25fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBkaXNhYmxlX2lycSwKIAkJCQkgaW50IG1hc3RlciwgaW50IGV4dF9tdXgsIGludCBzb2Z0c3NoZGVsYXksCiAJCQkJIGludCBod19lcnJfbWFzaykKQEAgLTIxMTMsNyArMjA5MCw2IEBACiAJCWJyZWFrOwogCX0KIAotCXBjaTkxMThfcmVwb3J0X2F0dGFjaChkZXYsIGRldi0+aXJxKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jCmluZGV4IDMxOTBlZjcuLmI0ZWEzNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRxMTJiLmMKQEAgLTk0LDggKzk0LDYgQEAKIC8qIG1hc2sgb2YgdGhlIGJpdCBhdCBTVElOUiB0byBjaGVjayBlbmQgb2YgY29udmVyc2lvbiAqLwogI2RlZmluZSBBRFExMkJfRU9DICAgICAweDIwCiAKLSNkZWZpbmUgVElNRU9VVCAgICAgICAgMjAKLQogLyogYXZhaWxhYmxlIHJhbmdlcyB0aHJvdWdoIHRoZSBQR0EgZ2FpbnMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9hZHExMmJfYWlfYmlwb2xhciA9IHsKIAk0LCB7CkBAIC0xMjIsMTkgKzEyMCwyOCBAQAogCWludCBsYXN0X3JhbmdlOwogfTsKIAotLyoKLSAqICJpbnN0cnVjdGlvbnMiIHJlYWQvd3JpdGUgZGF0YSBpbiAib25lLXNob3QiIG9yICJzb2Z0d2FyZS10cmlnZ2VyZWQiCi0gKiBtb2RlLgotICovCitzdGF0aWMgaW50IGFkcTEyYl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgQURRMTJCX1NUSU5SKTsKKwlpZiAoc3RhdHVzICYgQURRMTJCX0VPQykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KIAogc3RhdGljIGludCBhZHExMmJfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGFkcTEyYl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCBpOworCWludCBuOwogCWludCByYW5nZSwgY2hhbm5lbDsKIAl1bnNpZ25lZCBjaGFyIGhpLCBsbywgc3RhdHVzOworCWludCByZXQ7CiAKIAkvKiBjaGFuZ2UgY2hhbm5lbCBhbmQgcmFuZ2Ugb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJldmlvdXMgKi8KIAlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKQEAgLTE1MSwxMyArMTU4LDkgQEAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAKIAkJLyogd2FpdCBmb3IgZW5kIG9mIGNvbnZlcnNpb24gKi8KLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCS8qIHVkZWxheSgxKTsgKi8KLQkJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIEFEUTEyQl9TVElOUik7Ci0JCQlzdGF0dXMgPSBzdGF0dXMgJiBBRFExMkJfRU9DOwotCQl9IHdoaWxlIChzdGF0dXMgPT0gMCAmJiArK2kgPCBUSU1FT1VUKTsKLQkJLyogfSB3aGlsZSAoKytpIDwgMTApOyAqLworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGFkcTEyYl9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJaGkgPSBpbmIoZGV2LT5pb2Jhc2UgKyBBRFExMkJfQURISUcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwppbmRleCBkOWFkMmMwLi4yOGVjNDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwpAQCAtNDI5LDE1ICs0MjksMjYgQEAKIAlvdXR3KGRldnByaXYtPmFpX2V0X011eFZhbCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X01VWCk7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCitzdGF0aWMgaW50IHBjaTE3MXhfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgUENJMTcxeF9TVEFUVVMpOworCWlmICgoc3RhdHVzICYgU3RhdHVzX0ZFKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjaTE3MXhfaW5zbl9yZWFkX2FpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbiwgdGltZW91dDsKKwlpbnQgcmV0OworCWludCBuOwogI2lmZGVmIFBDSTE3MXhfUEFSQU5PSURDSEVDSwogCWNvbnN0IHN0cnVjdCBib2FyZHR5cGUgKnRoaXNfYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAl1bnNpZ25lZCBpbnQgaWRhdGE7CkBAIC00NTMsMTkgKzQ2NCwxNCBAQAogCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9TT0ZUVFJHKTsJLyogc3RhcnQgY29udmVyc2lvbiAqLwotCQkvKiB1ZGVsYXkoMSk7ICovCi0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfU1RBVFVTKSAmIFN0YXR1c19GRSkpCi0JCQkJZ290byBjb252X2ZpbmlzaDsKLQkJfQotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGluc24gdGltZW91dCIpOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJGSUZPKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSSU5UKTsKLQkJZGF0YVtuXSA9IDA7Ci0JCXJldHVybiAtRVRJTUU7CiAKLWNvbnZfZmluaXNoOgorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjaTE3MXhfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkgeworCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSRklGTyk7CisJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJJTlQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCiAjaWZkZWYgUENJMTcxeF9QQVJBTk9JRENIRUNLCiAJCWlkYXRhID0gaW53KGRldi0+aW9iYXNlICsgUENJMTcxeF9BRF9EQVRBKTsKIAkJaWYgKHRoaXNfYm9hcmQtPmNhcmR0eXBlICE9IFRZUEVfUENJMTcxMykKQEAgLTc1MywxNyArNzU5LDE1IEBACiAJbSA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfU1RBVFVTKTsKIAlpZiAobSAmIFN0YXR1c19GRSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiQS9EIEZJRk8gZW1wdHkgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCWlmIChtICYgU3RhdHVzX0ZGKSB7CiAJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCiAJCQkiQS9EIEZJRk8gRnVsbCBzdGF0dXMgKEZhdGFsIEVycm9yISkgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCkBAIC03ODIsMTAgKzc4Niw5IEBACiAJCQkJICAgICAgYWN0X2NoYW5saXN0W3MtPgogCQkJCQkJICAgYXN5bmMtPmN1cl9jaGFuXSAmIDB4ZjAwMCkgPj4KIAkJCQkgICAgIDEyKTsKLQkJCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0KIAkJCQkgICAgQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHNhbXBsICYgMHgwZmZmKTsKQEAgLTgwNCw5ICs4MDcsOCBAQAogCQkJaWYgKCghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpICYmCiAJCQkgICAgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSkgewogCQkJCS8qICBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KQEAgLTgxNCw3ICs4MTYsNyBAQAogCiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSSU5UKTsJLyogIGNsZWFyIG91ciBJTlQgcmVxdWVzdCAqLwogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogLyoKQEAgLTg0MiwxMCArODQ0LDkgQEAKIAkJCQkJKGRldnByaXYtPmFjdF9jaGFubGlzdFtqXSAmIDB4ZjAwMCkgPj4gMTIsCiAJCQkJCWksIGosIGRldnByaXYtPmFpX2FjdF9zY2FuLCBuLCB0dXJuLAogCQkJCQlzYW1wbCk7Ci0JCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9CiAJCQkJICAgIENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCQlyZXR1cm4gMTsKIAkJCX0KIAkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHNhbXBsICYgMHgwZmZmKTsKQEAgLTg3NywxNyArODc4LDE1IEBACiAJbSA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfU1RBVFVTKTsKIAlpZiAoIShtICYgU3RhdHVzX0ZIKSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiQS9EIEZJRk8gbm90IGhhbGYgZnVsbCEgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCWlmIChtICYgU3RhdHVzX0ZGKSB7CiAJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCiAJCQkiQS9EIEZJRk8gRnVsbCBzdGF0dXMgKEZhdGFsIEVycm9yISkgKCU0eClcbiIsIG0pOwotCQlwY2kxNzF4X2FpX2NhbmNlbChkZXYsIHMpOwogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm47CiAJfQogCkBAIC05MDcsMTQgKzkwNiwxMyBAQAogCWlmICghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpCiAJCWlmIChkZXZwcml2LT5haV9hY3Rfc2NhbiA+PSBkZXZwcml2LT5haV9zY2FucykgeyAvKiBhbGwgZGF0YQogCQkJCQkJCQkgICAgc2FtcGxlZCAqLwotCQkJcGNpMTcxeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJCXJldHVybjsKIAkJfQogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUklOVCk7CS8qICBjbGVhciBvdXIgSU5UIHJlcXVlc3QgKi8KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIC8qCkBAIC0xMzU0LDkgKzEzNTIsNiBAQAogCQlzdWJkZXYrKzsKIAl9CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkLCBpcnEgJXNhYmxlZFxuIiwKLQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYtPmlycSA/ICJlbiIgOiAiZGlzIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYwppbmRleCA3MjM5NDI2Li4wN2IxMDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYwpAQCAtMjgwLDggKzI4MCw2IEBACiAKIAlwY2kxNzIzX3Jlc2V0KGRldik7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKaW5kZXggZDRiZDYxZC4uMmQ5NjZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKQEAgLTExMzAsMTAgKzExMzAsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0RJT19TVUJERVZHOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCB0aGlzX2JvYXJkLT5zZGlvW2ldLnJlZ3M7IGorKykgewogCQkJcyA9ICZkZXYtPnN1YmRldmljZXNbc3ViZGV2XTsKLQkJCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLAotCQkJCQkgZGV2LT5pb2Jhc2UgKwotCQkJCQkgdGhpc19ib2FyZC0+c2Rpb1tpXS5hZGRyICsKLQkJCQkJIFNJWkVfODI1NSAqIGopOworCQkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsCisJCQkJCSAgICAgICBkZXYtPmlvYmFzZSArCisJCQkJCSAgICAgICB0aGlzX2JvYXJkLT5zZGlvW2ldLmFkZHIgKworCQkJCQkgICAgICAgU0laRV84MjU1ICogaik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CiAJCQlzdWJkZXYrKzsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2FpbzEyXzguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9fYWlvMTJfOC5jCmluZGV4IDY4YzNmYjMuLjMyNDc0NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9fYWlvMTJfOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9fYWlvMTJfOC5jCkBAIC0xMDEsMTQgKzEwMSwyNyBAQAogCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1s0XTsKIH07CiAKK3N0YXRpYyBpbnQgYWlvX2FpbzEyXzhfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgQUlPMTJfOF9TVEFUVVNfUkVHKTsKKwlpZiAoc3RhdHVzICYgQUlPMTJfOF9TVEFUVVNfQURDX0VPQykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBhaW9fYWlvMTJfOF9haV9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IHZhbDsKIAl1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisJaW50IHJldDsKIAlpbnQgbjsKIAogCS8qCkBAIC0xMjIsMjAgKzEzNSwxMyBAQAogCWluYihkZXYtPmlvYmFzZSArIEFJTzEyXzhfU1RBVFVTX1JFRyk7CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCWludCB0aW1lb3V0ID0gNTsKLQogCQkvKiAgU2V0dXAgYW5kIHN0YXJ0IGNvbnZlcnNpb24gKi8KIAkJb3V0Yihjb250cm9sLCBkZXYtPmlvYmFzZSArIEFJTzEyXzhfQURDX1JFRyk7CiAKIAkJLyogIFdhaXQgZm9yIGNvbnZlcnNpb24gdG8gY29tcGxldGUgKi8KLQkJZG8gewotCQkJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgQUlPMTJfOF9TVEFUVVNfUkVHKTsKLQkJCXRpbWVvdXQtLTsKLQkJCWlmICh0aW1lb3V0ID09IDApIHsKLQkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiQURDIHRpbWVvdXRcbiIpOwotCQkJCXJldHVybiAtRVRJTUVET1VUOwotCQkJfQotCQl9IHdoaWxlICghKHZhbCAmIEFJTzEyXzhfU1RBVFVTX0FEQ19FT0MpKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBhaW9fYWlvMTJfOF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlkYXRhW25dID0gaW53KGRldi0+aW9iYXNlICsgQUlPMTJfOF9BRENfUkVHKSAmIHMtPm1heGRhdGE7CiAJfQpAQCAtMjQ3LDkgKzI1Myw2IEBACiAJLyogODI1NCBjb3VudGVyL3RpbWVyIHN1YmRldmljZSAqLwogCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfVU5VU0VEOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMgYXR0YWNoZWRcbiIsCi0JCWRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgZGV2LT5ib2FyZF9uYW1lKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCmluZGV4IDIyYjNkZGEuLjc4MTEwNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCkBAIC05OCw3ICs5OCw3IEBACiAJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKIAlzLT5pbnNuX2JpdHMgPSBhaW9faWlyb18xNl9kaW9faW5zbl9iaXRzX3JlYWQ7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGFpb19paXJvXzE2X2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX2NvbW1vbi5jCmluZGV4IDljOTU1OWYuLjgxOGEwZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9jb21tb24uYwpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKIAkJCQkgIndhcm5pbmchIGlycSAldSB1bmF2YWlsYWJsZSFcbiIsIGlycSk7CiAJCX0KIAl9Ci0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJhdHRhY2hlZFxuIik7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFtcGxjX2RpbzIwMF9jb21tb25fYXR0YWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzIzNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2LmMKaW5kZXggMzE3MzRlMS4uYjIxZDdiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2LmMKQEAgLTM2OCwzMiArMzY4LDYgQEAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAotc3RhdGljIHZvaWQgcGMyMzZfcmVwb3J0X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxKQotewotCWNvbnN0IHN0cnVjdCBwYzIzNl9ib2FyZCAqdGhpc2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7Ci0JY2hhciB0bXBidWZbNjBdOwotCWludCB0bXBsZW47Ci0KLQlpZiAoaXNfaXNhX2JvYXJkKHRoaXNib2FyZCkpCi0JCXRtcGxlbiA9IHNjbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLAotCQkJCSAgICIoYmFzZSAlI2x4KSAiLCBkZXYtPmlvYmFzZSk7Ci0JZWxzZSBpZiAoaXNfcGNpX2JvYXJkKHRoaXNib2FyZCkpCi0JCXRtcGxlbiA9IHNjbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLAotCQkJCSAgICIocGNpICVzKSAiLCBwY2lfbmFtZShwY2lkZXYpKTsKLQllbHNlCi0JCXRtcGxlbiA9IDA7Ci0JaWYgKGlycSkKLQkJdG1wbGVuICs9IHNjbnByaW50ZigmdG1wYnVmW3RtcGxlbl0sIHNpemVvZih0bXBidWYpIC0gdG1wbGVuLAotCQkJCSAgICAiKGlycSAldSVzKSAiLCBpcnEsCi0JCQkJICAgIChkZXYtPmlycSA/ICIiIDogIiBVTkFWQUlMQUJMRSIpKTsKLQllbHNlCi0JCXRtcGxlbiArPSBzY25wcmludGYoJnRtcGJ1Zlt0bXBsZW5dLCBzaXplb2YodG1wYnVmKSAtIHRtcGxlbiwKLQkJCQkgICAgIihubyBpcnEpICIpOwotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgJXNhdHRhY2hlZFxuIiwKLQkJIGRldi0+Ym9hcmRfbmFtZSwgdG1wYnVmKTsKLX0KLQogc3RhdGljIGludCBwYzIzNl9jb21tb25fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgaW9iYXNlLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGxvbmcgcmVxX2lycV9mbGFncykKIHsKQEAgLTQxMSwxMCArMzg1LDkgQEAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKIAkvKiBkaWdpdGFsIGkvbyBzdWJkZXZpY2UgKDgyNTUpICovCiAJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIGlvYmFzZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImVycm9yISBvdXQgb2YgbWVtb3J5IVxuIik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9CisKIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKIAlkZXYtPnJlYWRfc3ViZGV2ID0gczsKIAlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwpAQCAtNDM0LDggKzQwNyw4IEBACiAJCQlzLT5jYW5jZWwgPSBwYzIzNl9pbnRyX2NhbmNlbDsKIAkJfQogCX0KLQlwYzIzNl9yZXBvcnRfYXR0YWNoKGRldiwgaXJxKTsKLQlyZXR1cm4gMTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBjMjM2X3BjaV9jb21tb25fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCmluZGV4IDViNGI1YWIuLjdjMTBkMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCkBAIC05NCw4ICs5NCw2IEBACiAJLyogcmVhZCBpbml0aWFsIHJlbGF5IHN0YXRlICovCiAJcy0+c3RhdGUgPSBpbmIoZGV2LT5pb2Jhc2UpIHwgKGluYihkZXYtPmlvYmFzZSArIDEpIDw8IDgpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyAoYmFzZSAlI2x4KSBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lLAotCQkgZGV2LT5pb2Jhc2UpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMKaW5kZXggYWU0MDQ4YS4uMjllMDFlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMjQuYwpAQCAtNTMzLDkgKzUzMyw4IEBACiAJc2V0X2JpdChBT19DTURfU1RBUlRFRCwgJmRldnByaXYtPnN0YXRlKTsKIAlpZiAoIWRldnByaXYtPmFvX3N0b3BfY29udGludW91cyAmJiBkZXZwcml2LT5hb19zdG9wX2NvdW50ID09IDApIHsKIAkJLyogQW4gZW1wdHkgYWNxdWlzaXRpb24hICovCi0JCXBjaTIyNF9hb19zdG9wKGRldiwgcyk7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJfSBlbHNlIHsKIAkJLyogRW5hYmxlIGludGVycnVwdHMuICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZwcml2LT5hb19zcGlubG9jaywgZmxhZ3MpOwpAQCAtNTg1LDkgKzU4NCw4IEBACiAJCXJvb20gPSBQQ0kyMjRfRklGT19ST09NX0VNUFRZOwogCQlpZiAoIWRldnByaXYtPmFvX3N0b3BfY29udGludW91cyAmJiBkZXZwcml2LT5hb19zdG9wX2NvdW50ID09IDApIHsKIAkJCS8qIEZJRk8gZW1wdHkgYXQgZW5kIG9mIGNvdW50ZWQgYWNxdWlzaXRpb24uICovCi0JCQlwY2kyMjRfYW9fc3RvcChkZXYsIHMpOwogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOwpAQCAtNjA1LDkgKzYwMyw4IEBACiAJCS8qIEZJRk8gaXMgbGVzcyB0aGFuIGhhbGYtZnVsbC4gKi8KIAkJaWYgKG51bV9zY2FucyA9PSAwKSB7CiAJCQkvKiBOb3RoaW5nIGxlZnQgdG8gcHV0IGluIHRoZSBGSUZPLiAqLwotCQkJcGNpMjI0X2FvX3N0b3AoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkFPIGJ1ZmZlciB1bmRlcnJ1blxuIik7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJfQogCX0KIAkvKiBEZXRlcm1pbmUgaG93IG1hbnkgbmV3IHNjYW5zIGNhbiBiZSBwdXQgaW4gdGhlIEZJRk8uICovCkBAIC02NzAsOSArNjY3LDggQEAKIAkJCQkJICBQQ0kyMjRfREFDQ09OX1RSSUdfTUFTSyk7CiAJCW91dHcoZGV2cHJpdi0+ZGFjY29uLCBkZXYtPmlvYmFzZSArIFBDSTIyNF9EQUNDT04pOwogCX0KLQlpZiAocy0+YXN5bmMtPmV2ZW50cykKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CiAKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiAvKgpAQCAtMTIzNywyMCArMTIzMyw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaTIyNF9yZXBvcnRfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7Ci0JY2hhciB0bXBidWZbMzBdOwotCi0JaWYgKGlycSkKLQkJc25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwgImlycSAldSVzIiwgaXJxLAotCQkJIChkZXYtPmlycSA/ICIiIDogIiBVTkFWQUlMQUJMRSIpKTsKLQllbHNlCi0JCXNucHJpbnRmKHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICJubyBpcnEiKTsKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIChwY2kgJXMpICglcykgYXR0YWNoZWRcbiIsCi0JCSBkZXYtPmJvYXJkX25hbWUsIHBjaV9uYW1lKHBjaWRldiksIHRtcGJ1Zik7Ci19Ci0KIC8qCiAgKiBDb21tb24gcGFydCBvZiBhdHRhY2ggYW5kIGF1dG9fYXR0YWNoLgogICovCkBAIC0xMzk5LDggKzEzODEsNyBAQAogCQl9CiAJfQogCi0JcGNpMjI0X3JlcG9ydF9hdHRhY2goZGV2LCBpcnEpOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBjaTIyNF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCmluZGV4IGMwOGRmYmIuLjk5ZTYwODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKQEAgLTc5OSwxOSArNzk5LDI5IEBACiAJLyogQ291bnRlciBjdCwgODI1NCBtb2RlIDEsIGluaXRpYWwgY291bnQgbm90IHdyaXR0ZW4uICovCiB9CiAKLS8qCi0gKiAgQ09NRURJX1NVQkRfQUkgaW5zdHJ1Y3Rpb247Ci0gKi8KK3N0YXRpYyBpbnQgcGNpMjMwX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFBDSTIzMF9BRENDT04pOworCWlmICgoc3RhdHVzICYgUENJMjMwX0FEQ19GSUZPX0VNUFRZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjaTIzMF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpMjMwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IG4sIGk7CisJdW5zaWduZWQgaW50IG47CiAJdW5zaWduZWQgaW50IGNoYW4sIHJhbmdlLCBhcmVmOwogCXVuc2lnbmVkIGludCBnYWluc2hpZnQ7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBzaG9ydCBhZGNjb24sIGFkY2VuOworCWludCByZXQ7CiAKIAkvKiBVbnBhY2sgY2hhbm5lbCBhbmQgcmFuZ2UuICovCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwpAQCAtODgzLDE4ICs4OTMsMTAgQEAKIAkJaTgyNTRfc2V0X21vZGUoZGV2cHJpdi0+aW9iYXNlMSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLCAyLAogCQkJICAgICAgIEk4MjU0X01PREUxKTsKIAotI2RlZmluZSBUSU1FT1VUIDEwMAogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgVElNRU9VVDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfQURDQ09OKTsKLQkJCWlmICghKHN0YXR1cyAmIFBDSTIzMF9BRENfRklGT19FTVBUWSkpCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2kyMzBfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWRhdGFbbl0gPSBwY2kyMzBfYWlfcmVhZChkZXYpOwpAQCAtMjc2MiwxNCArMjc2NCwxNCBAQAogCS8qIGRpZ2l0YWwgaS9vIHN1YmRldmljZSAqLwogCWlmICh0aGlzYm9hcmQtPmhhdmVfZGlvKSB7CiAJCXJjID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsCi0JCQkJICAgICAgKGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMzBfUFBJX1hfQkFTRSkpOwotCQlpZiAocmMgPCAwKQorCQkJCSAgICAgIGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMzBfUFBJX1hfQkFTRSk7CisJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgImF0dGFjaGVkXG4iKTsKLQlyZXR1cm4gMTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBjaTIzMF9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jCmluZGV4IGJlMjhlNmMuLjkzZWQwM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyNjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjYzLmMKQEAgLTg0LDggKzg0LDYgQEAKIAkvKiByZWFkIGluaXRpYWwgcmVsYXkgc3RhdGUgKi8KIAlzLT5zdGF0ZSA9IGluYihkZXYtPmlvYmFzZSkgfCAoaW5iKGRldi0+aW9iYXNlICsgMSkgPDwgOCk7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIChwY2kgJXMpIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUsCi0JCSBwY2lfbmFtZShwY2lfZGV2KSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jNnhkaWdpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2M2eGRpZ2lvLmMKaW5kZXggNTAzNGY2Ni4uZTAzZGQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2M2eGRpZ2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2M2eGRpZ2lvLmMKQEAgLTEsMzQgKzEsMzMgQEAKIC8qCi0gICBjb21lZGkvZHJpdmVycy9jNnhkaWdpby5jCi0KLSAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTWVjaGF0cm9uaWMgU3lzdGVtcyBJbmMuIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZC4KLSAgIChodHRwOi8vcm9ib3QwLmdlLnVpdWMuZWR1L35zcG9uZy9tZWNoYS8pCi0KLSAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgIENvcHlyaWdodCAoQykgMTk5OSBEYW4gQmxvY2sKLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIGM2eGRpZ2lvLmMKKyAqIEhhcmR3YXJlIGRyaXZlciBmb3IgTWVjaGF0cm9uaWMgU3lzdGVtcyBJbmMuIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZC4KKyAqIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLyUyQS9odHRwOi8vcm9ib3QwLmdlLnVpdWMuZWR1L35zcG9uZy9tZWNoYS8KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGFuIEJsb2NrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCisKIC8qCi1Ecml2ZXI6IGM2eGRpZ2lvCi1EZXNjcmlwdGlvbjogTWVjaGF0cm9uaWMgU3lzdGVtcyBJbmMuIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZAotQXV0aG9yOiBEYW4gQmxvY2sKLVN0YXR1czogdW5rbm93bgotRGV2aWNlczogW01lY2hhdHJvbmljIFN5c3RlbXMgSW5jLl0gQzZ4X0RJR0lPIERTUCBkYXVnaHRlciBjYXJkIChjNnhkaWdpbykKLVVwZGF0ZWQ6IFN1biBOb3YgMjAgMjA6MTg6MzQgRVNUIDIwMDUKLQotVGhpcyBkcml2ZXIgd2lsbCBub3Qgd29yayB3aXRoIGEgMi40IGtlcm5lbC4KLWh0dHA6Ly9yb2JvdDAuZ2UudWl1Yy5lZHUvfnNwb25nL21lY2hhLwotCi0qLworICogRHJpdmVyOiBjNnhkaWdpbworICogRGVzY3JpcHRpb246IE1lY2hhdHJvbmljIFN5c3RlbXMgSW5jLiBDNnhfRElHSU8gRFNQIGRhdWdodGVyIGNhcmQKKyAqIEF1dGhvcjogRGFuIEJsb2NrCisgKiBTdGF0dXM6IHVua25vd24KKyAqIERldmljZXM6IChNZWNoYXRyb25pYyBTeXN0ZW1zIEluYy4pIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZCBbYzZ4ZGlnaW9dCisgKiBVcGRhdGVkOiBTdW4gTm92IDIwIDIwOjE4OjM0IEVTVCAyMDA1CisgKgorICogQ29uZmlndXJhdGlvbiBPcHRpb25zOgorICoJWzBdIC0gYmFzZSBhZGRyZXNzCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDMsMzA5ICs0MiwxOTQgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi1zdGF0aWMgdTggUmVhZEJ5dGVGcm9tSHdQb3J0KHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl1OCByZXN1bHQgPSBpbmIoYWRkcik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgV3JpdGVCeXRlVG9Id1BvcnQodW5zaWduZWQgbG9uZyBhZGRyLCB1OCB2YWwpCi17Ci0Jb3V0Yl9wKHZhbCwgYWRkcik7Ci19Ci0KLSNkZWZpbmUgQzZYRElHSU9fU0laRSAzCi0KIC8qCi0gKiBwb3J0IG9mZnNldHMKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKICAqLwotI2RlZmluZSBDNlhESUdJT19QQVJBTExFTF9EQVRBIDAKLSNkZWZpbmUgQzZYRElHSU9fUEFSQUxMRUxfU1RBVFVTIDEKLSNkZWZpbmUgQzZYRElHSU9fUEFSQUxMRUxfQ09OVFJPTCAyCi1zdHJ1Y3QgcHdtYml0c3R5cGUgewotCXVuc2lnbmVkIHNiMDoyOwotCXVuc2lnbmVkIHNiMToyOwotCXVuc2lnbmVkIHNiMjoyOwotCXVuc2lnbmVkIHNiMzoyOwotCXVuc2lnbmVkIHNiNDoyOwotfTsKLXVuaW9uIHB3bWNtZHR5cGUgewotCXVuc2lnbmVkIGNtZDsJCS8qICBhc3N1bWluZyBoZXJlIHRoYXQgaW50IGlzIDMyYml0ICovCi0Jc3RydWN0IHB3bWJpdHN0eXBlIGJpdHM7Ci19Owotc3RydWN0IGVuY2JpdHN0eXBlIHsKLQl1bnNpZ25lZCBzYjA6MzsKLQl1bnNpZ25lZCBzYjE6MzsKLQl1bnNpZ25lZCBzYjI6MzsKLQl1bnNpZ25lZCBzYjM6MzsKLQl1bnNpZ25lZCBzYjQ6MzsKLQl1bnNpZ25lZCBzYjU6MzsKLQl1bnNpZ25lZCBzYjY6MzsKLQl1bnNpZ25lZCBzYjc6MzsKLX07Ci11bmlvbiBlbmN2YWx1ZXR5cGUgewotCXVuc2lnbmVkIHZhbHVlOwotCXN0cnVjdCBlbmNiaXRzdHlwZSBiaXRzOwotfTsKKyNkZWZpbmUgQzZYRElHSU9fREFUQV9SRUcJMHgwMAorI2RlZmluZSBDNlhESUdJT19EQVRBX0NIQU4oeCkJKCgoeCkgKyAxKSA8PCA0KQorI2RlZmluZSBDNlhESUdJT19EQVRBX1BXTQkoMSA8PCA1KQorI2RlZmluZSBDNlhESUdJT19EQVRBX0VOQ09ERVIJKDEgPDwgNikKKyNkZWZpbmUgQzZYRElHSU9fU1RBVFVTX1JFRwkweDAxCisjZGVmaW5lIEM2WERJR0lPX0NUUkxfUkVHCTB4MDIKIAogI2RlZmluZSBDNlhESUdJT19USU1FX09VVCAyMAogCi1zdGF0aWMgdm9pZCBDNlhfcHdtSW5pdCh1bnNpZ25lZCBsb25nIGJhc2VBZGRyKQorc3RhdGljIGludCBjNnhkaWdpb19jaGtfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCWludCB0aW1lb3V0ID0gMDsKIAotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDcwKTsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDApCi0JICAgICAgICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7CisJZG8geworCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBDNlhESUdJT19TVEFUVVNfUkVHKTsKKwkJaWYgKChzdGF0dXMgJiAweDgwKSAhPSBjb250ZXh0KQorCQkJcmV0dXJuIDA7CiAJCXRpbWVvdXQrKzsKLQl9CisJfSB3aGlsZSAgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCk7CiAKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHg3NCk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4NzApOwotCXRpbWVvdXQgPSAwOwotCXdoaWxlICgoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpICYgMHg4MCkgPT0gMHgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4MCk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCisJcmV0dXJuIC1FQlVTWTsKIH0KIAotc3RhdGljIHZvaWQgQzZYX3B3bU91dHB1dCh1bnNpZ25lZCBsb25nIGJhc2VBZGRyLCB1bnNpZ25lZCBjaGFubmVsLCBpbnQgdmFsdWUpCitzdGF0aWMgaW50IGM2eGRpZ2lvX3dyaXRlX2RhdGEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgc3RhdHVzKQogewotCXVuc2lnbmVkIHBwY21kOwotCXVuaW9uIHB3bWNtZHR5cGUgcHdtOwotCWludCB0aW1lb3V0ID0gMDsKLQl1bnNpZ25lZCB0bXA7Ci0KLQlwd20uY21kID0gdmFsdWU7Ci0JaWYgKHB3bS5jbWQgPiA0OTgpCi0JCXB3bS5jbWQgPSA0OTg7Ci0JaWYgKHB3bS5jbWQgPCAyKQotCQlwd20uY21kID0gMjsKLQotCWlmIChjaGFubmVsID09IDApIHsKLQkJcHBjbWQgPSAweDI4OwotCX0gZWxzZSB7CQkvKiAgaWYgY2hhbm5lbCA9PSAxICovCi0JCXBwY21kID0gMHgzMDsKLQl9CQkJLyogZW5kaWYgKi8KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIHB3bS5iaXRzLnNiMCk7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyBwd20uYml0cy5zYjEgKyAweDQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kICsgcHdtLmJpdHMuc2IyKTsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIHB3bS5iaXRzLnNiMyArIDB4NCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyBwd20uYml0cy5zYjQpOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4MCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KKwlvdXRiX3AodmFsLCBkZXYtPmlvYmFzZSArIEM2WERJR0lPX0RBVEFfUkVHKTsKKwlyZXR1cm4gYzZ4ZGlnaW9fY2hrX3N0YXR1cyhkZXYsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbnQgQzZYX2VuY0lucHV0KHVuc2lnbmVkIGxvbmcgYmFzZUFkZHIsIHVuc2lnbmVkIGNoYW5uZWwpCitzdGF0aWMgaW50IGM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqYml0cywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhdHVzKQogewotCXVuc2lnbmVkIHBwY21kOwotCXVuaW9uIGVuY3ZhbHVldHlwZSBlbmM7Ci0JaW50IHRpbWVvdXQgPSAwOwotCWludCB0bXA7CisJdW5zaWduZWQgaW50IHZhbDsKIAotCWVuYy52YWx1ZSA9IDA7Ci0JaWYgKGNoYW5uZWwgPT0gMCkKLQkJcHBjbWQgPSAweDQ4OwotCWVsc2UKLQkJcHBjbWQgPSAweDUwOworCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIEM2WERJR0lPX1NUQVRVU19SRUcpOworCXZhbCA+Pj0gMzsKKwl2YWwgJj0gMHgwNzsKIAotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCk7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9CisJKmJpdHMgPSB2YWw7CiAKLQllbmMuYml0cy5zYjAgPSAoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpID4+IDMpICYgMHg3KTsKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQgKyAweDQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDB4ODApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiMSA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JZW5jLmJpdHMuc2IyID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kICsgMHg0KTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDgwKSAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQkJdGltZW91dCsrOwotCX0KLQllbmMuYml0cy5zYjMgPSAoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpID4+IDMpICYgMHg3KTsKLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgcHBjbWQpOwotCXRpbWVvdXQgPSAwOwotCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCXdoaWxlICgoKHRtcCAmIDB4ODApID09IDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiNCA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIDB4NCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JZW5jLmJpdHMuc2I1ID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kKTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCWVuYy5iaXRzLnNiNiA9ICgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgPj4gMykgJiAweDcpOwotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCBwcGNtZCArIDB4NCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0JZW5jLmJpdHMuc2I3ID0gKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSA+PiAzKSAmIDB4Nyk7Ci0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIHBwY21kKTsKLQl0aW1lb3V0ID0gMDsKLQl0bXAgPSBSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKTsKLQl3aGlsZSAoKCh0bXAgJiAweDgwKSA9PSAweDApICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRtcCA9IFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpOwotCQl0aW1lb3V0Kys7Ci0JfQotCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4MCk7Ci0JdGltZW91dCA9IDA7Ci0JdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0Jd2hpbGUgKCgodG1wICYgMHg4MCkgPT0gMHg4MCkgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdG1wID0gUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSk7Ci0JCXRpbWVvdXQrKzsKLQl9Ci0KLQlyZXR1cm4gZW5jLnZhbHVlIF4gMHg4MDAwMDA7CisJcmV0dXJuIGM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIEM2WF9lbmNSZXNldEFsbCh1bnNpZ25lZCBsb25nIGJhc2VBZGRyKQorc3RhdGljIHZvaWQgYzZ4ZGlnaW9fcHdtX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCB2YWwpCiB7Ci0JdW5zaWduZWQgdGltZW91dCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IEM2WERJR0lPX0RBVEFfUFdNIHwgQzZYRElHSU9fREFUQV9DSEFOKGNoYW4pOworCXVuc2lnbmVkIGludCBiaXRzOwogCi0JV3JpdGVCeXRlVG9Id1BvcnQoYmFzZUFkZHIsIDB4NjgpOwotCXdoaWxlICgoKFJlYWRCeXRlRnJvbUh3UG9ydChiYXNlQWRkciArIDEpICYgMHg4MCkgPT0gMCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHg2Qyk7Ci0JdGltZW91dCA9IDA7Ci0Jd2hpbGUgKCgoUmVhZEJ5dGVGcm9tSHdQb3J0KGJhc2VBZGRyICsgMSkgJiAweDgwKSA9PSAweDgwKQotCSAgICAgICAmJiAodGltZW91dCA8IEM2WERJR0lPX1RJTUVfT1VUKSkgewotCQl0aW1lb3V0Kys7Ci0JfQotCVdyaXRlQnl0ZVRvSHdQb3J0KGJhc2VBZGRyLCAweDY4KTsKLQl0aW1lb3V0ID0gMDsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDB4MCkKLQkgICAgICAgJiYgKHRpbWVvdXQgPCBDNlhESUdJT19USU1FX09VVCkpIHsKLQkJdGltZW91dCsrOwotCX0KLQlXcml0ZUJ5dGVUb0h3UG9ydChiYXNlQWRkciwgMHgwKTsKLQl0aW1lb3V0ID0gMDsKLQl3aGlsZSAoKChSZWFkQnl0ZUZyb21Id1BvcnQoYmFzZUFkZHIgKyAxKSAmIDB4ODApID09IDB4ODApCi0JICAgICAgICYmICh0aW1lb3V0IDwgQzZYRElHSU9fVElNRV9PVVQpKSB7Ci0JCXRpbWVvdXQrKzsKLQl9CisJaWYgKHZhbCA+IDQ5OCkKKwkJdmFsID0gNDk4OworCWlmICh2YWwgPCAyKQorCQl2YWwgPSAyOworCisJYml0cyA9ICh2YWwgPj4gMCkgJiAweDAzOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQgfCBiaXRzIHwgKDAgPDwgMiksIDB4MDApOworCWJpdHMgPSAodmFsID4+IDIpICYgMHgwMzsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kIHwgYml0cyB8ICgxIDw8IDIpLCAweDgwKTsKKwliaXRzID0gKHZhbCA+PiA0KSAmIDB4MDM7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIGNtZCB8IGJpdHMgfCAoMCA8PCAyKSwgMHgwMCk7CisJYml0cyA9ICh2YWwgPj4gNikgJiAweDAzOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQgfCBiaXRzIHwgKDEgPDwgMiksIDB4ODApOworCWJpdHMgPSAodmFsID4+IDgpICYgMHgwMzsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgY21kIHwgYml0cyB8ICgwIDw8IDIpLCAweDAwKTsKKworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDAwLCAweDgwKTsKIH0KIAotc3RhdGljIGludCBjNnhkaWdpb19wd21vX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBjNnhkaWdpb19lbmNvZGVyX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgdW5zaWduZWQgaW50IGNoYW4pCiB7CisJdW5zaWduZWQgaW50IGNtZCA9IEM2WERJR0lPX0RBVEFfRU5DT0RFUiB8IEM2WERJR0lPX0RBVEFfQ0hBTihjaGFuKTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKwl1bnNpZ25lZCBpbnQgYml0czsKKworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCBjbWQsIDB4MDApOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMSA8PCAyKSwgMHg4MCk7CisJdmFsIHw9IChiaXRzIDw8IDApOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMCA8PCAyKSwgMHgwMCk7CisJdmFsIHw9IChiaXRzIDw8IDMpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMSA8PCAyKSwgMHg4MCk7CisJdmFsIHw9IChiaXRzIDw8IDYpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMCA8PCAyKSwgMHgwMCk7CisJdmFsIHw9IChiaXRzIDw8IDkpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMSA8PCAyKSwgMHg4MCk7CisJdmFsIHw9IChiaXRzIDw8IDEyKTsKKworCWM2eGRpZ2lvX2dldF9lbmNvZGVyX2JpdHMoZGV2LCAmYml0cywgY21kIHwgKDAgPDwgMiksIDB4MDApOworCXZhbCB8PSAoYml0cyA8PCAxNSk7CisKKwljNnhkaWdpb19nZXRfZW5jb2Rlcl9iaXRzKGRldiwgJmJpdHMsIGNtZCB8ICgxIDw8IDIpLCAweDgwKTsKKwl2YWwgfD0gKGJpdHMgPDwgMTgpOworCisJYzZ4ZGlnaW9fZ2V0X2VuY29kZXJfYml0cyhkZXYsICZiaXRzLCBjbWQgfCAoMCA8PCAyKSwgMHgwMCk7CisJdmFsIHw9IChiaXRzIDw8IDIxKTsKKworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDAwLCAweDgwKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgYzZ4ZGlnaW9fcHdtX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbCA9IChzLT5zdGF0ZSA+PiAoMTYgKiBjaGFuKSkgJiAweGZmZmY7CiAJaW50IGk7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKLQkJQzZYX3B3bU91dHB1dChkZXYtPmlvYmFzZSwgY2hhbiwgZGF0YVtpXSk7Ci0JCS8qICAgIGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsgKi8KKwkJdmFsID0gZGF0YVtpXTsKKwkJYzZ4ZGlnaW9fcHdtX3dyaXRlKGRldiwgY2hhbiwgdmFsKTsKIAl9Ci0JcmV0dXJuIGk7CisKKwkvKgorCSAqIFRoZXJlIGFyZSBvbmx5IDIgUFdNIGNoYW5uZWxzIGFuZCB0aGV5IGhhdmUgYSBtYXhkYXRhIG9mIDUwMC4KKwkgKiBJbnN0ZWFkIG9mIGFsbG9jYXRpbmcgcHJpdmF0ZSBkYXRhIHRvIHNhdmUgdGhlIHZhbHVlcyBpbiBmb3IKKwkgKiByZWFkYmFjayB0aGlzIGRyaXZlciBqdXN0IHBhY2tzIHRoZSB2YWx1ZXMgZm9yIHRoZSB0d28gY2hhbm5lbHMKKwkgKiBpbiB0aGUgcy0+c3RhdGUuCisJICovCisJcy0+c3RhdGUgJj0gKDB4ZmZmZiA8PCAoMTYgKiBjaGFuKSk7CisJcy0+c3RhdGUgfD0gKHZhbCA8PCAoMTYgKiBjaGFuKSk7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBjNnhkaWdpb19laV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBjNnhkaWdpb19wd21faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgbjsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKIAotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCi0JCWRhdGFbbl0gPSAoQzZYX2VuY0lucHV0KGRldi0+aW9iYXNlLCBjaGFuKSAmIDB4ZmZmZmZmKTsKKwl2YWwgPSAocy0+c3RhdGUgPj4gKDE2ICogY2hhbikpICYgMHhmZmZmOwogCi0JcmV0dXJuIG47CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IHZhbDsKKworCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgdm9pZCBib2FyZF9pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGM2eGRpZ2lvX2VuY29kZXJfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlDNlhfcHdtSW5pdChkZXYtPmlvYmFzZSk7Ci0JQzZYX2VuY1Jlc2V0QWxsKGRldi0+aW9iYXNlKTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCXZhbCA9IGM2eGRpZ2lvX2VuY29kZXJfcmVhZChkZXYsIGNoYW4pOworCisJCS8qIG11bmdlIHR3bydzIGNvbXBsZW1lbnQgdmFsdWUgdG8gb2Zmc2V0IGJpbmFyeSAqLworCQlkYXRhW2ldID0gY29tZWRpX29mZnNldF9tdW5nZShzLCB2YWwpOworCX0KKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBjNnhkaWdpb19pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgUFdNICovCisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4NzAsIDB4MDApOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDc0LCAweDgwKTsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHg3MCwgMHgwMCk7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4MDAsIDB4ODApOworCisJLyogUmVzZXQgdGhlIGVuY29kZXJzICovCisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4NjgsIDB4MDApOworCWM2eGRpZ2lvX3dyaXRlX2RhdGEoZGV2LCAweDZjLCAweDgwKTsKKwljNnhkaWdpb193cml0ZV9kYXRhKGRldiwgMHg2OCwgMHgwMCk7CisJYzZ4ZGlnaW9fd3JpdGVfZGF0YShkZXYsIDB4MDAsIDB4ODApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgYzZ4ZGlnaW9fcG5wX3RibFtdID0gewpAQCAtMzY3LDcgKzI1MSw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IHJldDsKIAotCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCBDNlhESUdJT19TSVpFKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgwMyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzgwLDI3ICsyNjQsMjYgQEAKIAogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwogCS8qIHB3bSBvdXRwdXQgc3ViZGV2aWNlICovCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOwkvKiAgTm90IHN1cmUgd2hhdCB0byBwdXQgaGVyZSAqLwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEU7Ci0Jcy0+bl9jaGFuID0gMjsKLQkvKiAgICAgIHMtPnRyaWdbMF0gPSBjNnhkaWdpb19wd21vOyAqLwotCXMtPmluc25fd3JpdGUgPSBjNnhkaWdpb19wd21vX2luc25fd3JpdGU7Ci0Jcy0+bWF4ZGF0YSA9IDUwMDsKLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7CS8qICBBIHN1aXRhYmxlIGxpZSAqLworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfUFdNOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklURUFCTEU7CisJcy0+bl9jaGFuCT0gMjsKKwlzLT5tYXhkYXRhCT0gNTAwOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3Vua25vd247CisJcy0+aW5zbl93cml0ZQk9IGM2eGRpZ2lvX3B3bV9pbnNuX3dyaXRlOworCXMtPmluc25fcmVhZAk9IGM2eGRpZ2lvX3B3bV9pbnNuX3JlYWQ7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKIAkvKiBlbmNvZGVyIChjb3VudGVyKSBzdWJkZXZpY2UgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfTFNBTVBMOwotCXMtPm5fY2hhbiA9IDI7Ci0JLyogcy0+dHJpZ1swXSA9IGM2eGRpZ2lvX2VpOyAqLwotCXMtPmluc25fcmVhZCA9IGM2eGRpZ2lvX2VpX2luc25fcmVhZDsKLQlzLT5tYXhkYXRhID0gMHhmZmZmZmY7Ci0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0xTQU1QTDsKKwlzLT5uX2NoYW4JPSAyOworCXMtPm1heGRhdGEJPSAweGZmZmZmZjsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmtub3duOworCXMtPmluc25fcmVhZAk9IGM2eGRpZ2lvX2VuY29kZXJfaW5zbl9yZWFkOwogCiAJLyogIEkgd2lsbCBjYWxsIHRoaXMgaW5pdCBhbnl3YXkgYnV0IG1vcmUgdGhhbiBsaWtlbHkgdGhlIERTUCBib2FyZCAqLwogCS8qICB3aWxsIG5vdCBiZSBjb25uZWN0ZWQgd2hlbiBkZXZpY2UgZHJpdmVyIGlzIGxvYWRlZC4gKi8KLQlib2FyZF9pbml0KGRldik7CisJYzZ4ZGlnaW9faW5pdChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MjAsNSArMzAzLDUgQEAKIG1vZHVsZV9jb21lZGlfZHJpdmVyKGM2eGRpZ2lvX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGRyaXZlciBmb3IgdGhlIEM2eF9ESUdJTyBEU1AgZGF1Z2h0ZXIgY2FyZCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwppbmRleCA2NGQ1ZjI5Li42NDVmY2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwpAQCAtOTUsMTAgKzk1LDE3IEBACiAJfQogfTsKIAotc3RhdGljIGlycXJldHVybl90IGRhczE2Y3NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgaW50IGRhczE2Y3NfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKLQkvKiBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsgKi8KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIERBUzE2Q1NfTUlTQzEpOworCWlmIChzdGF0dXMgJiAweDAwODApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgZGFzMTZjc19haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMTA5LDggKzExNiw4IEBACiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CiAJaW50IGFyZWYgPSBDUl9BUkVGKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmV0OwogCWludCBpOwotCWludCB0bzsKIAogCW91dHcoY2hhbiwgZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX0RJT19NVVgpOwogCkBAIC0xMzgsMTMyICsxNDUsMTYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX0FEQ19EQVRBKTsKIAotI2RlZmluZSBUSU1FT1VUIDEwMDAKLQkJZm9yICh0byA9IDA7IHRvIDwgVElNRU9VVDsgdG8rKykgewotCQkJaWYgKGludyhkZXYtPmlvYmFzZSArIERBUzE2Q1NfTUlTQzEpICYgMHgwMDgwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0byA9PSBUSU1FT1VUKSB7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiY2JfZGFzMTZfY3M6IGFpIHRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczE2Y3NfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJZGF0YVtpXSA9IGludyhkZXYtPmlvYmFzZSArIERBUzE2Q1NfQURDX0RBVEEpOwogCX0KIAogCXJldHVybiBpOwogfQogCi1zdGF0aWMgaW50IGRhczE2Y3NfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQotewotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGRhczE2Y3NfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQotewotCWludCBlcnIgPSAwOwotCWludCB0bXA7Ci0KLQkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCi0JCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKLQkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMTsKLQotCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KLQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwotCi0JLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCi0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMjsKLQotCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KLQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQotI2RlZmluZSBNQVhfU1BFRUQJMTAwMDAJLyogaW4gbmFub3NlY29uZHMgKi8KLSNkZWZpbmUgTUlOX1NQRUVECTEwMDAwMDAwMDAJLyogaW4gbmFub3NlY29uZHMgKi8KLQotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUFYX1NQRUVEKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUlOX1NQRUVEKTsKLQl9IGVsc2UgewotCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCi0JCS8qIHNob3VsZCBiZSBsZXZlbC9lZGdlLCBoaS9sbyBzcGVjaWZpY2F0aW9uIGhlcmUgKi8KLQkJLyogc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgZXh0ZXJuYWwgdHJpZ2dlcnMgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDkpOwotCX0KLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIE1BWF9TUEVFRCk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIE1JTl9TUEVFRCk7Ci0JfSBlbHNlIHsKLQkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLwotCQkvKiBzZWUgYWJvdmUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsIDkpOwotCX0KLQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0KLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgMHgwMGZmZmZmZik7Ci0JZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMzsKLQotCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KLQotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJdW5zaWduZWQgaW50IGRpdjEgPSAwLCBkaXYyID0gMDsKLQotCQl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAotCQkJCQkgICZkaXYxLCAmZGl2MiwKLQkJCQkJICAmY21kLT5zY2FuX2JlZ2luX2FyZywgY21kLT5mbGFncyk7Ci0JCWlmICh0bXAgIT0gY21kLT5zY2FuX2JlZ2luX2FyZykKLQkJCWVycisrOwotCX0KLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCXVuc2lnbmVkIGludCBkaXYxID0gMCwgZGl2MiA9IDA7Ci0KLQkJdG1wID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGl2MSwgJmRpdjIsCi0JCQkJCSAgJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGNtZC0+ZmxhZ3MpOwotCQlpZiAodG1wICE9IGNtZC0+Y29udmVydF9hcmcpCi0JCQllcnIrKzsKLQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgotCQkgICAgY21kLT5zY2FuX2JlZ2luX2FyZyA8Ci0JCSAgICBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmcpIHsKLQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPQotCQkJICAgIGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKLQkJCWVycisrOwotCQl9Ci0JfQotCi0JaWYgKGVycikKLQkJcmV0dXJuIDQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBkYXMxNmNzX2FvX3dpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC00MDEsMTAgKzI5Miw2IEBACiAJZGV2LT5pb2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7CiAKIAlsaW5rLT5wcml2ID0gZGV2OwotCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCBkYXMxNmNzX2ludGVycnVwdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlkZXYtPmlycSA9IGxpbmstPmlycTsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKQEAgLTQxNSw3ICszMDIsNiBAQAogCQlyZXR1cm4gcmV0OwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JZGV2LT5yZWFkX3N1YmRldiA9IHM7CiAJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLwogCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CiAJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9ESUZGIHwgU0RGX0NNRF9SRUFEOwpAQCAtNDI0LDggKzMxMCw2IEBACiAJcy0+cmFuZ2VfdGFibGUJPSAmZGFzMTZjc19haV9yYW5nZTsKIAlzLT5sZW5fY2hhbmxpc3QJPSAxNjsKIAlzLT5pbnNuX3JlYWQJPSBkYXMxNmNzX2FpX3JpbnNuOwotCXMtPmRvX2NtZAk9IGRhczE2Y3NfYWlfY21kOwotCXMtPmRvX2NtZHRlc3QJPSBkYXMxNmNzX2FpX2NtZHRlc3Q7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKIAkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLwpAQCAtNDUxLDEwICszMzUsNiBAQAogCXMtPmluc25fYml0cwk9IGRhczE2Y3NfZGlvX2luc25fYml0czsKIAlzLT5pbnNuX2NvbmZpZwk9IGRhczE2Y3NfZGlvX2luc25fY29uZmlnOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMsIEkvTyBiYXNlPTB4JTA0bHgsIGlycT0ldVxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUsCi0JCWRldi0+aW9iYXNlLCBkZXYtPmlycSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jCmluZGV4IDk4MTliZTAuLjgzYTI2NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzLmMKQEAgLTM3Niw2ICszNzYsMjAgQEAKIAlyZXR1cm4gQ0FMX0VOX0JJVCB8IENBTF9TUkNfQklUUyhkZXZwcml2LT5jYWxpYnJhdGlvbl9zb3VyY2UpOwogfQogCitzdGF0aWMgaW50IGNiX3BjaWRhc19haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBjYl9wY2lkYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldnByaXYtPmNvbnRyb2xfc3RhdHVzICsgQURDTVVYX0NPTlQpOworCWlmIChzdGF0dXMgJiBFT0MpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgY2JfcGNpZGFzX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtMzg1LDcgKzM5OSw4IEBACiAJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwogCXVuc2lnbmVkIGludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IGJpdHM7Ci0JaW50IG4sIGk7CisJaW50IHJldDsKKwlpbnQgbjsKIAogCS8qIGVuYWJsZSBjYWxpYnJhdGlvbiBpbnB1dCBpZiBhcHByb3ByaWF0ZSAqLwogCWlmIChpbnNuLT5jaGFuc3BlYyAmIENSX0FMVF9TT1VSQ0UpIHsKQEAgLTQxNSwxMyArNDMwLDkgQEAKIAkJb3V0dygwLCBkZXZwcml2LT5hZGNfZmlmbyArIEFEQ0RBVEEpOwogCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCS8qIHJldHVybiAtRVRJTUVET1VUIGlmIHRoZXJlIGlzIGEgdGltZW91dCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJaWYgKGludyhkZXZwcml2LT5jb250cm9sX3N0YXR1cyArIEFEQ01VWF9DT05UKSAmIEVPQykKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSAxMDAwMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGNiX3BjaWRhc19haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJZGF0YVtuXSA9IGludyhkZXZwcml2LT5hZGNfZmlmbyArIEFEQ0RBVEEpOwpAQCAtMTAwNiw5ICsxMDE3LDkgQEAKIAogCS8qICBzZXQgc3RhcnQgdHJpZ2dlciBhbmQgYnVyc3QgbW9kZSAqLwogCWJpdHMgPSAwOwotCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKIAkJYml0cyB8PSBTV19UUklHR0VSOwotCWVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSB7CisJfSBlbHNlIHsJLyogVFJJR19FWFQgKi8KIAkJYml0cyB8PSBFWFRfVFJJR0dFUiB8IFRHRU4gfCBYVFJDTDsKIAkJaWYgKHRoaXNib2FyZC0+aXNfMTYwMikgewogCQkJaWYgKGNtZC0+c3RhcnRfYXJnICYgQ1JfSU5WRVJUKQpAQCAtMTAxNiw5ICsxMDI3LDYgQEAKIAkJCWlmIChjbWQtPnN0YXJ0X2FyZyAmIENSX0VER0UpCiAJCQkJYml0cyB8PSBUR1NFTDsKIAkJfQotCX0gZWxzZSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJidWchIik7Ci0JCXJldHVybiAtMTsKIAl9CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19OT1cgJiYgY21kLT5jaGFubGlzdF9sZW4gPiAxKQogCQliaXRzIHw9IEJVUlNURTsKQEAgLTEyNjksOCArMTI3Nyw2IEBACiAJdW5zaWduZWQgaW50IG51bV9wb2ludHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWFzeW5jLT5ldmVudHMgPSAwOwotCiAJaWYgKHN0YXR1cyAmIERBRU1JKSB7CiAJCS8qICBjbGVhciBkYWMgZW1wdHkgaW50ZXJydXB0IGxhdGNoICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CkBAIC0xMjgyLDcgKzEyODgsNiBAQAogCQkJICAgIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQKIAkJCSAgICAgJiYgZGV2cHJpdi0+YW9fY291bnQpKSB7CiAJCQkJY29tZWRpX2Vycm9yKGRldiwgImRhYyBmaWZvIHVuZGVyZmxvdyIpOwotCQkJCWNiX3BjaWRhc19hb19jYW5jZWwoZGV2LCBzKTsKIAkJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJCX0KIAkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKQEAgLTEzMTIsNyArMTMxNyw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAl9CiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgY2JfcGNpZGFzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQpAQCAtMTMzMiw3ICsxMzM3LDYgQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJYXN5bmMgPSBzLT5hc3luYzsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAogCXM1OTMzX3N0YXR1cyA9IGlubChkZXZwcml2LT5zNTkzM19jb25maWcgKyBBTUNDX09QX1JFR19JTlRDU1IpOwogCkBAIC0xMzY0LDEwICsxMzY4LDggQEAKIAkJY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLCBkZXZwcml2LT5haV9idWZmZXIsCiAJCQkJCSAgbnVtX3NhbXBsZXMgKiBzaXplb2Yoc2hvcnQpKTsKIAkJZGV2cHJpdi0+Y291bnQgLT0gbnVtX3NhbXBsZXM7Ci0JCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYgZGV2cHJpdi0+Y291bnQgPT0gMCkgeworCQlpZiAoYXN5bmMtPmNtZC5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmIGRldnByaXYtPmNvdW50ID09IDApCiAJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQljYl9wY2lkYXNfY2FuY2VsKGRldiwgcyk7Ci0JCX0KIAkJLyogIGNsZWFyIGhhbGYtZnVsbCBpbnRlcnJ1cHQgbGF0Y2ggKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAkJb3V0dyhkZXZwcml2LT5hZGNfZmlmb19iaXRzIHwgSU5ULApAQCAtMTM4NCw3ICsxMzg2LDYgQEAKIAkJCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKIAkJCSAgICAtLWRldnByaXYtPmNvdW50ID09IDApIHsKIAkJCQkvKiBlbmQgb2YgYWNxdWlzaXRpb24gKi8KLQkJCQljYl9wY2lkYXNfY2FuY2VsKGRldiwgcyk7CiAJCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTQxMSwxMSArMTQxMiwxMCBAQAogCQlvdXR3KGRldnByaXYtPmFkY19maWZvX2JpdHMgfCBMQURGVUwsCiAJCSAgICAgZGV2cHJpdi0+Y29udHJvbF9zdGF0dXMgKyBJTlRfQURDRklGTyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJY2JfcGNpZGFzX2NhbmNlbChkZXYsIHMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CiAJfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTE1NzYsOSArMTU3Niw2IEBACiAJb3V0bChkZXZwcml2LT5zNTkzM19pbnRjc3JfYml0cyB8IElOVENTUl9JTkJPWF9JTlRSX1NUQVRVUywKIAkgICAgIGRldnByaXYtPnM1OTMzX2NvbmZpZyArIEFNQ0NfT1BfUkVHX0lOVENTUik7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKaW5kZXggNGZmZjE3My4uZjlhZmNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKQEAgLTE2NjQsMTUgKzE2NjQsMzYgQEAKIAlpMmNfc3RvcChkZXYpOwogfQogCitzdGF0aWMgaW50IGNiX3BjaWRhczY0X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJY29uc3Qgc3RydWN0IHBjaWRhczY0X2JvYXJkICp0aGlzYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKKwlzdHJ1Y3QgcGNpZGFzNjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZHcoZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBIV19TVEFUVVNfUkVHKTsKKwlpZiAodGhpc2JvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzQwMjApIHsKKwkJc3RhdHVzID0gcmVhZHcoZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfV1JJVEVfUE5UUl9SRUcpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKHBpcGVfZnVsbF9iaXRzKHN0YXR1cykpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBhaV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBwY2lkYXM2NF9ib2FyZCAqdGhpc2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGJpdHMgPSAwLCBuLCBpOworCXVuc2lnbmVkIGludCBiaXRzID0gMCwgbjsKIAl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgcmFuZ2UsIGFyZWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdGF0aWMgY29uc3QgaW50IHRpbWVvdXQgPSAxMDA7CisJaW50IHJldDsKIAogCWNoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlyYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKQEAgLTE3NzAsMjMgKzE3OTEsMTAgQEAKIAkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX0NPTlZFUlRfUkVHKTsKIAogCQkvKiAgd2FpdCBmb3IgZGF0YSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCQliaXRzID0gcmVhZHcoZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBIV19TVEFUVVNfUkVHKTsKLQkJCWlmICh0aGlzYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkgewotCQkJCWlmIChyZWFkdyhkZXZwcml2LT5tYWluX2lvYmFzZSArCi0JCQkJCSAgQURDX1dSSVRFX1BOVFJfUkVHKSkKLQkJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwaXBlX2Z1bGxfYml0cyhiaXRzKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJaWYgKGkgPT0gdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgIiBhbmFsb2cgaW5wdXQgcmVhZCBpbnNuIHRpbWVkIG91dCIpOwotCQkJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJzdGF0dXMgMHgleFxuIiwgYml0cyk7Ci0JCQlyZXR1cm4gLUVUSU1FOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgY2JfcGNpZGFzNjRfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKQogCQkJZGF0YVtuXSA9IHJlYWRsKGRldnByaXYtPmRpb19jb3VudGVyX2lvYmFzZSArCiAJCQkJCUFEQ19GSUZPX1JFRykgJiAweGZmZmY7CkBAIC0zODE2LDE2ICszODI0LDE5IEBACiAJaWYgKHRoaXNib2FyZC0+aGFzXzgyNTUpIHsKIAkJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKSB7CiAJCQlkaW9fODI1NV9pb2Jhc2UgPSBkZXZwcml2LT5tYWluX2lvYmFzZSArIEk4MjU1XzQwMjBfUkVHOwotCQkJc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIGRpb19jYWxsYmFja180MDIwLAotCQkJCQkgKHVuc2lnbmVkIGxvbmcpZGlvXzgyNTVfaW9iYXNlKTsKKwkJCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBkaW9fY2FsbGJhY2tfNDAyMCwKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWRpb184MjU1X2lvYmFzZSk7CiAJCX0gZWxzZSB7CiAJCQlkaW9fODI1NV9pb2Jhc2UgPQogCQkJCWRldnByaXYtPmRpb19jb3VudGVyX2lvYmFzZSArIERJT184MjU1X09GRlNFVDsKLQkJCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBkaW9fY2FsbGJhY2ssCi0JCQkJCSAodW5zaWduZWQgbG9uZylkaW9fODI1NV9pb2Jhc2UpOworCQkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIGRpb19jYWxsYmFjaywKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWRpb184MjU1X2lvYmFzZSk7CiAJCX0KLQl9IGVsc2UKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiAgOCBjaGFubmVsIGRpbyBmb3IgNjB4eCAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzVdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCmluZGV4IDhjY2EwNTEuLjkwMWRjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKQEAgLTM4OCw4ICszODgsNiBAQAogCWZvciAoaSA9IDA7IGkgPCB0aGlzYm9hcmQtPmFvX2NoYW5zOyBpKyspCiAJCWNiX3BjaWRkYV9jYWxpYnJhdGUoZGV2LCBpLCBkZXZwcml2LT5hb19yYW5nZVtpXSk7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRhcy5jCmluZGV4IDU3Mjk1ZDEuLmQzMTQxYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYwpAQCAtODUsMjEgKzg1LDMxIEBACiAJdW5zaWduZWQgaW50IGFvX3JlYWRiYWNrWzJdOwogfTsKIAotLyoKLSAqICJpbnN0cnVjdGlvbnMiIHJlYWQvd3JpdGUgZGF0YSBpbiAib25lLXNob3QiIG9yICJzb2Z0d2FyZS10cmlnZ2VyZWQiCi0gKiBtb2RlLgotICovCitzdGF0aWMgaW50IGNiX3BjaW1kYXNfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2cHJpdi0+QkFEUjMgKyAyKTsKKwlpZiAoKHN0YXR1cyAmIDB4ODApID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgY2JfcGNpbWRhc19haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIGk7CisJaW50IG47CiAJdW5zaWduZWQgaW50IGQ7Ci0JdW5zaWduZWQgaW50IGJ1c3k7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBzaG9ydCBjaGFubGltczsKIAlpbnQgbWF4Y2hhbnM7CisJaW50IHJldDsKIAogCS8qICBvbmx5IHN1cHBvcnQgc3cgaW5pdGlhdGVkIHJlYWRzIGZyb20gYSBzaW5nbGUgY2hhbm5lbCAqLwogCkBAIC0xMzMsMTcgKzE0MywxMCBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIDApOwogCi0jZGVmaW5lIFRJTUVPVVQgMTAwMAkJLyogdHlwaWNhbGx5IHRha2VzIDUgbG9vcHMgb24gYSBsaWdodGx5IGxvYWRlZCBQZW50aXVtIDEwME1IeiwgKi8KLQkJLyogdGhpcyBpcyBsaWtlbHkgdG8gYmUgMTAwIGxvb3BzIG9uIGEgMkdIeiBtYWNoaW5lLCBzbyBzZXQgMTAwMCBhcyB0aGUgbGltaXQuICovCi0KIAkJLyogd2FpdCBmb3IgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJYnVzeSA9IGluYihkZXZwcml2LT5CQURSMyArIDIpICYgMHg4MDsKLQkJCWlmICghYnVzeSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA9PSBUSU1FT1VUKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgY2JfcGNpbWRhc19haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJZGF0YVtuXSA9IGludyhkZXYtPmlvYmFzZSArIDApOwpAQCAtMjQ3LDkgKzI1MCw5IEBACiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKIAkvKiBkaWdpdGFsIGkvbyBzdWJkZXZpY2UgKi8KLQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgaW9iYXNlXzgyNTUpOwotCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKKwlyZXQgPSBzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgaW9iYXNlXzgyNTUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jCmluZGV4IDQzYTg2NjMuLjRhMmIyMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kZGEuYwpAQCAtMTg3LDkgKzE4Nyw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGNiX3BjaW1kZGFfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwppbmRleCA1MWE1OWU1Li44NDUwYzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCXNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIi9kZXYvY29tZWRpJXUiLCBtaW5vcik7CisJCXNucHJpbnRmKGZpbGUsIHNpemVvZihmaWxlKSwgIi9kZXYvY29tZWRpJWQiLCBtaW5vcik7CiAJCWZpbGVbc2l6ZW9mKGZpbGUpIC0gMV0gPSAwOwogCiAJCWQgPSBjb21lZGlfb3BlbihmaWxlKTsKQEAgLTI1NCw2ICsyNTQsNyBAQAogCQkJaWYgKCFkZXZzKSB7CiAJCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkuIE91dCBvZiBtZW1vcnk/XG4iKTsKKwkJCQlrZnJlZShiZGV2KTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWRldnByaXYtPmRldnMgPSBkZXZzOwpAQCAtMjYzLDcgKzI2NCw3IEBACiAJCQkJY2hhciBidWZbMjBdOwogCQkJCWludCBsZWZ0ID0KIAkJCQkgICAgTUFYX0JPQVJEX05BTUUgLSBzdHJsZW4oZGV2cHJpdi0+bmFtZSkgLSAxOwotCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZDolZCAiLAorCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldToldSAiLAogCQkJCQkgYmRldi0+bWlub3IsIGJkZXYtPnN1YmRldik7CiAJCQkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogCQkJCXN0cm5jYXQoZGV2cHJpdi0+bmFtZSwgYnVmLCBsZWZ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwppbmRleCAyNmQ5ZGJjLi45ZDliMTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCkBAIC0xLDM0ICsxLDUzIEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCi0KLSAgICBUaGlzIGlzIGEgcGxhY2UgZm9yIGNvZGUgZHJpdmVyIHdyaXRlcnMgd2lzaCB0byBzaGFyZSBiZXR3ZWVuCi0gICAgdHdvIG9yIG1vcmUgZHJpdmVycy4gIGZjIGlzIHNob3J0Ci0gICAgZm9yIGZyYW5rLWNvbW1vbi4KLQotICAgIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCisgKiBjb21lZGlfZmMuYworICogVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgorICogdHdvIG9yIG1vcmUgZHJpdmVycy4gIGZjIGlzIHNob3J0IGZvciBmcmFuay1jb21tb24uCisgKgorICogQXV0aG9yOiBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCi1zdGF0aWMgdm9pZCBpbmNyZW1lbnRfc2Nhbl9wcm9ncmVzcyhzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKLQkJCQkgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3Vuc2lnbmVkIGludCBjZmNfYnl0ZXNfcGVyX3NjYW4oc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0Jc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzdWJkLT5hc3luYzsKLQl1bnNpZ25lZCBpbnQgc2Nhbl9sZW5ndGggPSBjZmNfYnl0ZXNfcGVyX3NjYW4oc3ViZCk7CisJdW5zaWduZWQgaW50IGNoYW5saXN0X2xlbiA9IHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCXVuc2lnbmVkIGludCBudW1fc2FtcGxlczsKKwl1bnNpZ25lZCBpbnQgYml0c19wZXJfc2FtcGxlOworCisJc3dpdGNoIChzLT50eXBlKSB7CisJY2FzZSBDT01FRElfU1VCRF9ESToKKwljYXNlIENPTUVESV9TVUJEX0RPOgorCWNhc2UgQ09NRURJX1NVQkRfRElPOgorCQliaXRzX3Blcl9zYW1wbGUgPSA4ICogYnl0ZXNfcGVyX3NhbXBsZShzKTsKKwkJbnVtX3NhbXBsZXMgPSAoY2hhbmxpc3RfbGVuICsgYml0c19wZXJfc2FtcGxlIC0gMSkgLworCQkJCWJpdHNfcGVyX3NhbXBsZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnVtX3NhbXBsZXMgPSBjaGFubGlzdF9sZW47CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbnVtX3NhbXBsZXMgKiBieXRlc19wZXJfc2FtcGxlKHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2ZjX2J5dGVzX3Blcl9zY2FuKTsKKwordm9pZCBjZmNfaW5jX3NjYW5fcHJvZ3Jlc3Moc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9sZW5ndGggPSBjZmNfYnl0ZXNfcGVyX3NjYW4ocyk7CiAKIAlhc3luYy0+c2Nhbl9wcm9ncmVzcyArPSBudW1fYnl0ZXM7CiAJaWYgKGFzeW5jLT5zY2FuX3Byb2dyZXNzID49IHNjYW5fbGVuZ3RoKSB7CkBAIC0zNiwxMiArNTUsMTMgQEAKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNmY19pbmNfc2Nhbl9wcm9ncmVzcyk7CiAKIC8qIFdyaXRlcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50cyB0byBjb21lZGkncyBidWZmZXIgKi8KLXVuc2lnbmVkIGludCBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLAordW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCiB7Ci0Jc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzdWJkLT5hc3luYzsKKwlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwogCXVuc2lnbmVkIGludCByZXR2YWw7CiAKIAlpZiAobnVtX2J5dGVzID09IDApCkBAIC00OSwyNCArNjksMjQgQEAKIAogCXJldHZhbCA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CiAJaWYgKHJldHZhbCAhPSBudW1fYnl0ZXMpIHsKLQkJZGV2X3dhcm4oc3ViZC0+ZGV2aWNlLT5jbGFzc19kZXYsICJjb21lZGk6IGJ1ZmZlciBvdmVycnVuXG4iKTsKKwkJZGV2X3dhcm4ocy0+ZGV2aWNlLT5jbGFzc19kZXYsICJidWZmZXIgb3ZlcnJ1blxuIik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm4gMDsKIAl9CiAKIAljb21lZGlfYnVmX21lbWNweV90byhhc3luYywgMCwgZGF0YSwgbnVtX2J5dGVzKTsKIAljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7Ci0JaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwljZmNfaW5jX3NjYW5fcHJvZ3Jlc3MocywgbnVtX2J5dGVzKTsKIAlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAogCXJldHVybiBudW1fYnl0ZXM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKTsKIAotdW5zaWduZWQgaW50IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLAordW5zaWduZWQgaW50IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQogewotCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKIAogCWlmIChudW1fYnl0ZXMgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC03NCw3ICs5NCw3IEBACiAJbnVtX2J5dGVzID0gY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOwogCWNvbWVkaV9idWZfbWVtY3B5X2Zyb20oYXN5bmMsIDAsIGRhdGEsIG51bV9ieXRlcyk7CiAJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7Ci0JaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwljZmNfaW5jX3NjYW5fcHJvZ3Jlc3MocywgbnVtX2J5dGVzKTsKIAlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAogCXJldHVybiBudW1fYnl0ZXM7CkBAIC04MiwzNCArMTAyLDMzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcik7CiAKIHVuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKQorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXVuc2lnbmVkIGludCBldmVudHMgPSBzdWJkLT5hc3luYy0+ZXZlbnRzOworCXVuc2lnbmVkIGludCBldmVudHMgPSBzLT5hc3luYy0+ZXZlbnRzOwogCiAJaWYgKGV2ZW50cyA9PSAwKQogCQlyZXR1cm4gZXZlbnRzOwogCiAJaWYgKGV2ZW50cyAmIChDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX09WRVJGTE9XKSkKLQkJc3ViZC0+Y2FuY2VsKGRldiwgc3ViZCk7CisJCXMtPmNhbmNlbChkZXYsIHMpOwogCi0JY29tZWRpX2V2ZW50KGRldiwgc3ViZCk7CisJY29tZWRpX2V2ZW50KGRldiwgcyk7CiAKIAlyZXR1cm4gZXZlbnRzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2ZjX2hhbmRsZV9ldmVudHMpOwogCi1NT0RVTEVfQVVUSE9SKCJGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNoYXJlZCBmdW5jdGlvbnMgZm9yIENvbWVkaSBsb3ctbGV2ZWwgZHJpdmVycyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCiBzdGF0aWMgaW50IF9faW5pdCBjb21lZGlfZmNfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlyZXR1cm4gMDsKIH0KK21vZHVsZV9pbml0KGNvbWVkaV9mY19pbml0X21vZHVsZSk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjb21lZGlfZmNfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIH0KLQotbW9kdWxlX2luaXQoY29tZWRpX2ZjX2luaXRfbW9kdWxlKTsKIG1vZHVsZV9leGl0KGNvbWVkaV9mY19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2hhcmVkIGZ1bmN0aW9ucyBmb3IgQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmgKaW5kZXggODU1OGIwNy4uNTQxYjkzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuaApAQCAtMSw3MiArMSw1MiBAQAogLyoKLSAgICBjb21lZGlfZmMuaAotCi0gICAgVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgotICAgIHR3byBvciBtb3JlIGRyaXZlcnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbWVhbnQgdG8gYmUgdXNlZCBvbmx5Ci0gICAgYnkgZHJpdmVycywgdGhleSBhcmUgTk9UIHBhcnQgb2YgdGhlIGtjb21lZGlsaWIgQVBJIQotCi0gICAgQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICAgIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MKLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KKyAqIGNvbWVkaV9mYy5oCisgKiBUaGlzIGlzIGEgcGxhY2UgZm9yIGNvZGUgZHJpdmVyIHdyaXRlcnMgd2lzaCB0byBzaGFyZSBiZXR3ZWVuCisgKiB0d28gb3IgbW9yZSBkcml2ZXJzLiBUaGVzZSBmdW5jdGlvbnMgYXJlIG1lYW50IHRvIGJlIHVzZWQgb25seQorICogYnkgZHJpdmVycywgdGhleSBhcmUgTk9UIHBhcnQgb2YgdGhlIGtjb21lZGlsaWIgQVBJIQorICoKKyAqIEF1dGhvcjogRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAyIEZyYW5rIE1vcmkgSGVzcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCiAjaWZuZGVmIF9DT01FRElfRkNfSAogI2RlZmluZSBfQ09NRURJX0ZDX0gKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0vKiBXcml0ZXMgYW4gYXJyYXkgb2YgZGF0YSBwb2ludHMgdG8gY29tZWRpJ3MgYnVmZmVyICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCi0JCQkJCSAgICAgIHZvaWQgKmRhdGEsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOwordW5zaWduZWQgaW50IGNmY19ieXRlc19wZXJfc2NhbihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKK3ZvaWQgY2ZjX2luY19zY2FuX3Byb2dyZXNzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjZmNfd3JpdGVfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorLyogV3JpdGVzIGFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIHRvIGNvbWVkaSdzIGJ1ZmZlciAqLwordW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCQkgICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY193cml0ZV90b19idWZmZXIoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBkYXRhKQogewotCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN1YmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogfTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2xvbmdfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlCi0JCQkJCQkgICAgKnN1YmQsIHVuc2lnbmVkIGludCBkYXRhKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2xvbmdfdG9fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCBkYXRhKQogewotCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN1YmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogfTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKLQkJCQkJICAgICAgIHZvaWQgKmRhdGEsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKK3Vuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAorCQkJCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX2J5dGVzX3Blcl9zY2FuKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKQotewotCWludCBudW1fc2FtcGxlczsKLQlpbnQgYml0c19wZXJfc2FtcGxlOwotCi0Jc3dpdGNoIChzdWJkLT50eXBlKSB7Ci0JY2FzZSBDT01FRElfU1VCRF9ESToKLQljYXNlIENPTUVESV9TVUJEX0RPOgotCWNhc2UgQ09NRURJX1NVQkRfRElPOgotCQliaXRzX3Blcl9zYW1wbGUgPSA4ICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKLQkJbnVtX3NhbXBsZXMgPSAoc3ViZC0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKwotCQkJICAgICAgIGJpdHNfcGVyX3NhbXBsZSAtIDEpIC8gYml0c19wZXJfc2FtcGxlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQludW1fc2FtcGxlcyA9IHN1YmQtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIG51bV9zYW1wbGVzICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKLX0KK3Vuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOwogCiAvKioKICAqIGNmY19jaGVja190cmlnZ2VyX3NyYygpIC0gdHJpdmlhbGx5IHZhbGlkYXRlIGEgY29tZWRpX2NtZCB0cmlnZ2VyIHNvdXJjZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwppbmRleCBkNTM5ZWFmLi5jZDk1NjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwpAQCAtMTg1LDcgKzE4NSw2IEBACiAJICAgIChkZXZwcml2LT51c2VjX3JlbWFpbmRlciArIGVsYXBzZWRfdGltZSkgLyBkZXZwcml2LT5zY2FuX3BlcmlvZDsKIAlkZXZwcml2LT51c2VjX3JlbWFpbmRlciA9CiAJICAgIChkZXZwcml2LT51c2VjX3JlbWFpbmRlciArIGVsYXBzZWRfdGltZSkgJSBkZXZwcml2LT5zY2FuX3BlcmlvZDsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKIAkJdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IGNtZC0+c3RvcF9hcmcgLSBkZXZwcml2LT5haV9jb3VudDsKQEAgLTMxOCwxMiArMzE3LDggQEAKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XKQogCQlkZXZwcml2LT5jb252ZXJ0X3BlcmlvZCA9IDA7Ci0JZWxzZSBpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQorCWVsc2UJLyogVFJJR19USU1FUiAqLwogCQlkZXZwcml2LT5jb252ZXJ0X3BlcmlvZCA9IGNtZC0+Y29udmVydF9hcmcgLyBuYW5vX3Blcl9taWNybzsKLQllbHNlIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgImJ1ZyBzZXR0aW5nIGNvbnZlcnNpb24gcGVyaW9kIik7Ci0JCXJldHVybiAtMTsKLQl9CiAKIAlkb19nZXR0aW1lb2ZkYXkoJmRldnByaXYtPmxhc3QpOwogCWRldnByaXYtPnVzZWNfY3VycmVudCA9IGRldnByaXYtPmxhc3QudHZfdXNlYyAlIGRldnByaXYtPnVzZWNfcGVyaW9kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwppbmRleCAzMjNhN2YzLi4wYTljMzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwpAQCAtOTIsOCArOTIsNiBAQAogCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+aW5zbl9iaXRzCT0gY29udGVjX2RvX2luc25fYml0czsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhYzAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFjMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ2ZTBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhYzAyLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBkYWMwMi5jCisgKiBDb21lZGkgZHJpdmVyIGZvciBEQUMwMiBjb21wYXRpYmxlIGJvYXJkcworICogQ29weXJpZ2h0IChDKSAyMDE0IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSBwb2MgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIERyaXZlcjogZGFjMDIKKyAqIERlc2NyaXB0aW9uOiBDb21lZGkgZHJpdmVyIGZvciBEQUMwMiBjb21wYXRpYmxlIGJvYXJkcworICogRGV2aWNlczogKEtlaXRobGV5IE1ldHJhYnl0ZSkgREFDLTAyIFtkYWMwMl0KKyAqIEF1dGhvcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKiBVcGRhdGVkOiBUdWUsIDExIE1hciAyMDE0IDExOjI3OjE5IC0wNzAwCisgKiBTdGF0dXM6IHVua25vd24KKyAqCisgKiBDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgKglbMF0gLSBJL08gcG9ydCBiYXNlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKy8qCisgKiBUaGUgb3V0cHV0IHJhbmdlIGlzIHNlbGVjdGVkIGJ5IGp1bXBlcmluZyBwaW5zIG9uIHRoZSBJL08gY29ubmVjdG9yLgorICoKKyAqCSAgICBSYW5nZSAgICAgIENoYW4gIyAgIEp1bXBlciBwaW5zICAgICAgICBPdXRwdXQKKyAqCS0tLS0tLS0tLS0tLS0gIC0tLS0tLSAgLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgIDAgdG8gNVYgICAgICAgMCAgICAgICAgMjEgdG8gMjIgICAgICAyNAorICoJICAgICAgICAgICAgICAgICAxICAgICAgICAxNSB0byAxNiAgICAgIDE4CisgKgkgICAwIHRvIDEwViAgICAgIDAgICAgICAgIDIwIHRvIDIyICAgICAgMjQKKyAqCSAgICAgICAgICAgICAgICAgMSAgICAgICAgMTQgdG8gMTYgICAgICAxOAorICoJICAgICsvLTVWICAgICAgICAwICAgICAgICAyMSB0byAyMiAgICAgIDIzCisgKgkgICAgICAgICAgICAgICAgIDEgICAgICAgIDE1IHRvIDE2ICAgICAgMTcKKyAqCSAgICArLy0xMFYgICAgICAgMCAgICAgICAgMjAgdG8gMjIgICAgICAyMworICoJICAgICAgICAgICAgICAgICAxICAgICAgICAxNCB0byAxNiAgICAgIDE3CisgKgkgIDQgdG8gMjBtQSAgICAgIDAgICAgICAgIDIxIHRvIDIyICAgICAgMjUKKyAqCSAgICAgICAgICAgICAgICAgMSAgICAgICAgMTUgdG8gMTYgICAgICAxOQorICoJQUMgcmVmZXJlbmNlICAgICAwICAgICAgSW4gb24gcGluIDIyICAgIDI0ICgyLXF1YWRyYW50KQorICoJICAgICAgICAgICAgICAgICAgICAgICAgSW4gb24gcGluIDIyICAgIDIzICg0LXF1YWRyYW50KQorICoJICAgICAgICAgICAgICAgICAxICAgICAgSW4gb24gcGluIDE2ICAgIDE4ICgyLXF1YWRyYW50KQorICoJICAgICAgICAgICAgICAgICAgICAgICAgSW4gb24gcGluIDE2ICAgIDE3ICg0LXF1YWRyYW50KQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgZGFzMDJfYW9fcmFuZ2VzID0geworCTYsIHsKKwkJVU5JX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMTApLAorCQlCSVBfUkFOR0UoNSksCisJCUJJUF9SQU5HRSgxMCksCisJCVJBTkdFX21BKDQsIDIwKSwKKwkJUkFOR0VfZXh0KDAsIDEpCisJfQorfTsKKworc3RydWN0IGRhYzAyX3ByaXZhdGUgeworCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKK307CisKKy8qCisgKiBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgREFDMDJfQU9fTFNCKHgpCQkoMHgwMCArICgoeCkgKiAyKSkKKyNkZWZpbmUgREFDMDJfQU9fTVNCKHgpCQkoMHgwMSArICgoeCkgKiAyKSkKKworc3RhdGljIGludCBkYWMwMl9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGFjMDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBkYXRhW2ldOworCisJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gdmFsOworCisJCS8qCisJCSAqIFVuaXBvbGFyIG91dHB1dHMgYXJlIHRydWUgYmluYXJ5IGVuY29kaW5nLgorCQkgKiBCaXBvbGFyIG91dHB1dHMgYXJlIGNvbXBsZW1lbnRhcnkgb2Zmc2V0IGJpbmFyeQorCQkgKiAodGhhdCBpcywgMCA9ICtmdWxsIHNjYWxlLCBtYXhkYXRhID0gLWZ1bGwgc2NhbGUpLgorCQkgKi8KKwkJaWYgKGNvbWVkaV9yYW5nZV9pc19iaXBvbGFyKHMsIHJhbmdlKSkKKwkJCXZhbCA9IHMtPm1heGRhdGEgLSB2YWw7CisKKwkJLyoKKwkJICogREFDcyBhcmUgZG91YmxlLWJ1ZmZlcmVkLgorCQkgKiBXcml0ZSBMU0IgdGhlbiBNU0IgdG8gbGF0Y2ggb3V0cHV0LgorCQkgKi8KKwkJb3V0YigodmFsIDw8IDQpICYgMHhmMCwgZGV2LT5pb2Jhc2UgKyBEQUMwMl9BT19MU0IoY2hhbikpOworCQlvdXRiKCh2YWwgPj4gNCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIERBQzAyX0FPX01TQihjaGFuKSk7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFjMDJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGFjMDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFjMDJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlzdHJ1Y3QgZGFjMDJfcHJpdmF0ZSAqZGV2cHJpdjsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0OworCisJZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7CisJaWYgKCFkZXZwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCAweDA4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQW5hbG9nIE91dHB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4JPSAyOworCXMtPm1heGRhdGEJPSAweDBmZmY7CisJcy0+cmFuZ2VfdGFibGUJPSAmZGFzMDJfYW9fcmFuZ2VzOworCXMtPmluc25fd3JpdGUJPSBkYWMwMl9hb19pbnNuX3dyaXRlOworCXMtPmluc25fcmVhZAk9IGRhYzAyX2FvX2luc25fcmVhZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgZGFjMDJfZHJpdmVyID0geworCS5kcml2ZXJfbmFtZQk9ICJkYWMwMiIsCisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuYXR0YWNoCQk9IGRhYzAyX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGNvbWVkaV9sZWdhY3lfZGV0YWNoLAorfTsKK21vZHVsZV9jb21lZGlfZHJpdmVyKGRhYzAyX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgZHJpdmVyIGZvciBEQUMwMiBjb21wYXRpYmxlIGJvYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCmluZGV4IGNlMTUzZmMuLmE4ZjYwMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKQEAgLTMzMywxNCArMzMzLDI4IEBACiAJd3JpdGVBY3FTY2FuTGlzdEVudHJ5KGRldiwgd29yZDMpOwogfQogCitzdGF0aWMgaW50IGRhcWJvYXJkMjAwMF9haV9zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBkYXFib2FyZDIwMDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZHcoZGV2cHJpdi0+ZGFxICsgYWNxQ29udHJvbCk7CisJaWYgKHN0YXR1cyAmIGNvbnRleHQpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZGFxYm9hcmQyMDAwX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGRhcWJvYXJkMjAwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB2YWw7Ci0JaW50IGdhaW4sIGNoYW4sIHRpbWVvdXQ7CisJaW50IGdhaW4sIGNoYW47CisJaW50IHJldDsKIAlpbnQgaTsKIAogCXdyaXRldyhEQVFCT0FSRDIwMDBfQWNxUmVzZXRTY2FuTGlzdEZpZm8gfApAQCAtMzY3LDI1ICszODEsMjQgQEAKIAkJLyogRW5hYmxlIHJlYWRpbmcgZnJvbSB0aGUgc2Nhbmxpc3QgRklGTyAqLwogCQl3cml0ZXcoREFRQk9BUkQyMDAwX1NlcVN0YXJ0U2Nhbkxpc3QsCiAJCSAgICAgICBkZXZwcml2LT5kYXEgKyBhY3FDb250cm9sKTsKLQkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDIwOyB0aW1lb3V0KyspIHsKLQkJCXZhbCA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwotCQkJaWYgKHZhbCAmIERBUUJPQVJEMjAwMF9BY3FDb25maWdQaXBlRnVsbCkKLQkJCQlicmVhazsKLQkJCS8qIHVkZWxheSgyKTsgKi8KLQkJfQorCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZGFxYm9hcmQyMDAwX2FpX3N0YXR1cywKKwkJCQkgICAgIERBUUJPQVJEMjAwMF9BY3FDb25maWdQaXBlRnVsbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCXdyaXRldyhEQVFCT0FSRDIwMDBfQWRjUGFjZXJFbmFibGUsIGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwotCQlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMjA7IHRpbWVvdXQrKykgewotCQkJdmFsID0gcmVhZHcoZGV2cHJpdi0+ZGFxICsgYWNxQ29udHJvbCk7Ci0JCQlpZiAodmFsICYgREFRQk9BUkQyMDAwX0FjcUxvZ2ljU2Nhbm5pbmcpCi0JCQkJYnJlYWs7Ci0JCQkvKiB1ZGVsYXkoMik7ICovCi0JCX0KLQkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDIwOyB0aW1lb3V0KyspIHsKLQkJCXZhbCA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwotCQkJaWYgKHZhbCAmIERBUUJPQVJEMjAwMF9BY3FSZXN1bHRzRklGT0hhc1ZhbGlkRGF0YSkKLQkJCQlicmVhazsKLQkJCS8qIHVkZWxheSgyKTsgKi8KLQkJfQorCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZGFxYm9hcmQyMDAwX2FpX3N0YXR1cywKKwkJCQkgICAgIERBUUJPQVJEMjAwMF9BY3FMb2dpY1NjYW5uaW5nKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXFib2FyZDIwMDBfYWlfc3RhdHVzLAorCQkJCSAgICAgREFRQk9BUkQyMDAwX0FjcVJlc3VsdHNGSUZPSGFzVmFsaWREYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJZGF0YVtpXSA9IHJlYWR3KGRldnByaXYtPmRhcSArIGFjcVJlc3VsdHNGSUZPKTsKIAkJd3JpdGV3KERBUUJPQVJEMjAwMF9BZGNQYWNlckRpc2FibGUsIGRldnByaXYtPmRhcSArIGFjcUNvbnRyb2wpOwogCQl3cml0ZXcoREFRQk9BUkQyMDAwX1NlcVN0b3BTY2FuTGlzdCwgZGV2cHJpdi0+ZGFxICsgYWNxQ29udHJvbCk7CkBAIC00MDksNiArNDIyLDIxIEBACiAJcmV0dXJuIGk7CiB9CiAKK3N0YXRpYyBpbnQgZGFxYm9hcmQyMDAwX2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGRhcWJvYXJkMjAwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPmRhcSArIGRhY0NvbnRyb2wpOworCWlmICgoc3RhdHVzICYgKChjaGFuICsgMSkgKiAweDAwMTApKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGRhcWJvYXJkMjAwMF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtNDE2LDggKzQ0NCw3IEBACiB7CiAJc3RydWN0IGRhcWJvYXJkMjAwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgdGltZW91dDsKKwlpbnQgcmV0OwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewpAQCAtNDMxLDEyICs0NTgsMTEgQEAKIAkJdWRlbGF5KDEwMDApOwogI2VuZGlmCiAJCXdyaXRldyhkYXRhW2ldLCBkZXZwcml2LT5kYXEgKyBkYWNTZXR0aW5nKGNoYW4pKTsKLQkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDIwOyB0aW1lb3V0KyspIHsKLQkJCXZhbCA9IHJlYWR3KGRldnByaXYtPmRhcSArIGRhY0NvbnRyb2wpOwotCQkJaWYgKCh2YWwgJiAoKGNoYW4gKyAxKSAqIDB4MDAxMCkpID09IDApCi0JCQkJYnJlYWs7Ci0JCQkvKiB1ZGVsYXkoMik7ICovCi0JCX0KKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhcWJvYXJkMjAwMF9hb19lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CiAjaWYgMAogCQkvKgpAQCAtNzM3LDkgKzc2Myw2IEBACiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6ICVzIGF0dGFjaGVkXG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYwppbmRleCBlNWMwZWU5Li5jNWUzNTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYwpAQCAtMjAxLDE3ICsyMDEsMjkgQEAKIAlkYXMwOF9wZ21fZ2Fpbmxpc3QsCiB9OwogCi0jZGVmaW5lIFRJTUVPVVQgMTAwMDAwCitzdGF0aWMgaW50IGRhczA4X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERBUzA4X1NUQVRVUyk7CisJaWYgKChzdGF0dXMgJiBEQVMwOF9FT0MpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CiAKIHN0YXRpYyBpbnQgZGFzMDhfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBkYXMwOF9ib2FyZF9zdHJ1Y3QgKnRoaXNib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBkYXMwOF9wcml2YXRlX3N0cnVjdCAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaSwgbjsKKwlpbnQgbjsKIAlpbnQgY2hhbjsKIAlpbnQgcmFuZ2U7CiAJaW50IGxzYiwgbXNiOworCWludCByZXQ7CiAKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CkBAIC0yNDQsMTQgKzI1NiwxMCBAQAogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KIAkJb3V0Yl9wKDAsIGRldi0+aW9iYXNlICsgREFTMDhfVFJJR18xMkJJVCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgREFTMDhfU1RBVFVTKSAmIERBUzA4X0VPQykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczA4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCW1zYiA9IGluYihkZXYtPmlvYmFzZSArIERBUzA4X01TQik7CiAJCWxzYiA9IGluYihkZXYtPmlvYmFzZSArIERBUzA4X0xTQik7CiAJCWlmICh0aGlzYm9hcmQtPmFpX2VuY29kaW5nID09IGRhczA4X2VuY29kZTEyKSB7CkBAIC01MjksOSArNTM3LDEwIEBACiAJcyA9ICZkZXYtPnN1YmRldmljZXNbNF07CiAJLyogODI1NSAqLwogCWlmICh0aGlzYm9hcmQtPmk4MjU1X29mZnNldCAhPSAwKSB7Ci0JCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCAodW5zaWduZWQgbG9uZykoZGV2LT5pb2Jhc2UgKwotCQkJCQkJCSAgICAgICB0aGlzYm9hcmQtPgotCQkJCQkJCSAgICAgICBpODI1NV9vZmZzZXQpKTsKKwkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsCisJCQkJICAgICAgIGRldi0+aW9iYXNlICsgdGhpc2JvYXJkLT5pODI1NV9vZmZzZXQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKaW5kZXggYTg0NDZjYS4uNmE3ZDY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKQEAgLTg1NiwxOCArODU2LDE3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGRhczE2X2FpX3dhaXRfZm9yX2NvbnYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBkYXMxNl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBzdGF0dXM7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERBUzE2X1NUQVRVU19SRUcpOwotCQlpZiAoIShzdGF0dXMgJiBEQVMxNl9TVEFUVVNfQlVTWSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxNl9TVEFUVVNfUkVHKTsKKwlpZiAoKHN0YXR1cyAmIERBUzE2X1NUQVRVU19CVVNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGRhczE2X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtODk3LDcgKzg5Niw3IEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlvdXRiX3AoMCwgZGV2LT5pb2Jhc2UgKyBEQVMxNl9UUklHX1JFRyk7CiAKLQkJcmV0ID0gZGFzMTZfYWlfd2FpdF9mb3JfY29udihkZXYsIDEwMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczE2X2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2bTEuYwppbmRleCBmZWU1ZmFjLi43NzkyMjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNm0xLmMKQEAgLTMzMSwxNCArMzMxLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGFzMTZtMV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxNk0xX0NTKTsKKwlpZiAoc3RhdHVzICYgSVJRREFUQSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBkYXMxNm0xX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGRhczE2bTFfcHJpdmF0ZV9zdHJ1Y3QgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGksIG47CisJaW50IHJldDsKKwlpbnQgbjsKIAlpbnQgYnl0ZTsKLQljb25zdCBpbnQgdGltZW91dCA9IDEwMDA7CiAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgYW5kIGludGVybmFsIHBhY2VyICovCiAJZGV2cHJpdi0+Y29udHJvbF9zdGF0ZSAmPSB+SU5URSAmIH5QQUNFUl9NQVNLOwpAQCAtMzU2LDE0ICszNjksMTAgQEAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UpOwogCi0JCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKLQkJCWlmIChpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxNk0xX0NTKSAmIElSUURBVEEpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgInRpbWVvdXQiKTsKLQkJCXJldHVybiAtRVRJTUU7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXMxNm0xX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWRhdGFbbl0gPSBtdW5nZV9zYW1wbGUoaW53KGRldi0+aW9iYXNlKSk7CiAJfQogCkBAIC00MDcsNyArNDE2LDYgQEAKIAogCXMgPSBkZXYtPnJlYWRfc3ViZGV2OwogCWFzeW5jID0gcy0+YXN5bmM7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CiAJY21kID0gJmFzeW5jLT5jbWQ7CiAKIAkvKiAgZmlndXJlIG91dCBob3cgbWFueSBzYW1wbGVzIGFyZSBpbiBmaWZvICovCkBAIC00NDAsOCArNDQ4LDggQEAKIAlkZXZwcml2LT5hZGNfY291bnQgKz0gbnVtX3NhbXBsZXM7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCWlmIChkZXZwcml2LT5hZGNfY291bnQgPj0gY21kLT5zdG9wX2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIGVuZCBvZiBhY3F1aXNpdGlvbiAqLwotCQkJZGFzMTZtMV9jYW5jZWwoZGV2LCBzKTsKKwkJaWYgKGRldnByaXYtPmFkY19jb3VudCA+PSBjbWQtPnN0b3BfYXJnICogY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJCS8qIGVuZCBvZiBhY3F1aXNpdGlvbiAqLwogCQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQl9CiAJfQpAQCAtNDQ5LDEzICs0NTcsMTEgQEAKIAkvKiB0aGlzIHByb2JhYmx5IHdvbid0IGNhdGNoIG92ZXJydW5zIHNpbmNlIHRoZSBjYXJkIGRvZXNuJ3QgZ2VuZXJhdGUKIAkgKiBvdmVycnVuIGludGVycnVwdHMsIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIHRyeSAqLwogCWlmIChzdGF0dXMgJiBPVlJVTikgewotCQlkYXMxNm0xX2NhbmNlbChkZXYsIHMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJmaWZvIG92ZXJmbG93Iik7CiAJfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0KKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogfQogCiBzdGF0aWMgaW50IGRhczE2bTFfcG9sbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jCmluZGV4IDMyMGQ5NWEuLjhlOTc1ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE4MDAuYwpAQCAtNjQ2LDcgKzY0Niw2IEBACiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZhc3luYy0+Y21kOwogCXVuc2lnbmVkIGludCBzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxODAwX1NUQVRVUyk7CiAKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAkvKiAgc2VsZWN0IGFkYyBmb3IgYmFzZSBhZGRyZXNzICsgMCAqLwogCW91dGIoQURDLCBkZXYtPmlvYmFzZSArIERBUzE4MDBfU0VMRUNUKTsKIAkvKiAgZG1hIGJ1ZmZlciBmdWxsICovCkBAIC02NjUsOSArNjY0LDggQEAKIAkJLyogIGNsZWFyIE9WRiBpbnRlcnJ1cHQgYml0ICovCiAJCW91dGIoQ0xFQVJfSU5UUl9NQVNLICYgfk9WRiwgZGV2LT5pb2Jhc2UgKyBEQVMxODAwX1NUQVRVUyk7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJEQVMxODAwIEZJRk8gb3ZlcmZsb3ciKTsKLQkJZGFzMTgwMF9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJcmV0dXJuOwogCX0KIAkvKiAgc3RvcCB0YWtpbmcgZGF0YSBpZiBhcHByb3ByaWF0ZSAqLwpAQCAtNjgwLDE2ICs2NzgsMTIgQEAKIAkJCWRhczE4MDBfZmx1c2hfZG1hKGRldiwgcyk7CiAJCWVsc2UKIAkJCWRhczE4MDBfaGFuZGxlX2ZpZm9fbm90X2VtcHR5KGRldiwgcyk7Ci0JCWRhczE4MDBfY2FuY2VsKGRldiwgcyk7CS8qIGRpc2FibGUgaGFyZHdhcmUgY29udmVyc2lvbnMgKi8KIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmIGRldnByaXYtPmNvdW50ID09IDApIHsJLyogIHN0b3Bfc3JjIFRSSUdfQ09VTlQgKi8KLQkJZGFzMTgwMF9jYW5jZWwoZGV2LCBzKTsJLyogZGlzYWJsZSBoYXJkd2FyZSBjb252ZXJzaW9ucyAqLwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJfQogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0KLQlyZXR1cm47CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIGludCBkYXMxODAwX2FpX3BvbGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCmluZGV4IDQzMDI3ZWUuLmUwY2ZiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczY0MDIuYwpAQCAtMSwzMDkgKzEsNTMyIEBACiAvKgotICAgU29tZSBjb21tZW50cyBvbiB0aGUgY29kZS4uCi0KLSAgIC0gaXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB0byB1c2Ugb3V0Yl9wKCkuCi0KLSAgIC0gaWdub3JlaXJxIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbi4gIEl0IG5lZWRzIHRvIGJlIGZpeGVkLgotCisgKiBkYXM2NDAyLmMKKyAqIENvbWVkaSBkcml2ZXIgZm9yIERBUzY0MDIgY29tcGF0aWJsZSBib2FyZHMKKyAqIENvcHlyaWdodChjKSAyMDE0IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgorICoKKyAqIFJld3JpdGUgb2YgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBieToKKyAqIENvcHlyaWdodCAoQykgMTk5OSBPeXN0ZWluIFN2ZW5kc2VuIDxzdmVuZHNlbkBwdnYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCiAvKgotICAgY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCi0gICBBbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciBDb21wdXRlcmJvYXJkcycgREFTNjQwMiBJL08gY2FyZAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgT3lzdGVpbiBTdmVuZHNlbiA8c3ZlbmRzZW5AcHZ2Lm9yZz4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIERyaXZlcjogZGFzNjQwMgorICogRGVzY3JpcHRpb246IEtlaXRobGV5IE1ldHJhYnl0ZSBEQVM2NDAyICgmIGNvbXBhdGlibGVzKQorICogRGV2aWNlczogKEtlaXRobGV5IE1ldHJhYnl0ZSkgREFTNjQwMi0xMiAoZGFzNjQwMi0xMikKKyAqCSAgICAoS2VpdGhsZXkgTWV0cmFieXRlKSBEQVM2NDAyLTE2IChkYXM2NDAyLTE2KQorICogQXV0aG9yOiBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqIFVwZGF0ZWQ6IEZyaSwgMTQgTWFyIDIwMTQgMTA6MTg6NDMgLTA3MDAKKyAqIFN0YXR1czogdW5rbm93bgorICoKKyAqIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKKyAqICAgWzBdIC0gSS9PIGJhc2UgYWRkcmVzcworICogICBbMV0gLSBJUlEgKG9wdGlvbmFsLCBuZWVkZWQgZm9yIGFzeW5jIGNvbW1hbmQgc3VwcG9ydCkKICAqLwotLyoKLURyaXZlcjogZGFzNjQwMgotRGVzY3JpcHRpb246IEtlaXRobGV5IE1ldHJhYnl0ZSBEQVM2NDAyICgmIGNvbXBhdGlibGVzKQotQXV0aG9yOiBPeXN0ZWluIFN2ZW5kc2VuIDxzdmVuZHNlbkBwdnYub3JnPgotU3RhdHVzOiBiaXRyb3R0ZW4KLURldmljZXM6IFtLZWl0aGxleSBNZXRyYWJ5dGVdIERBUzY0MDIgKGRhczY0MDIpCi0KLVRoaXMgZHJpdmVyIGhhcyBzdWZmZXJlZCBiaXRyb3QuCi0qLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICI4MjUzLmgiCiAKLSNkZWZpbmUgREFTNjQwMl9TSVpFIDE2CisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIERBUzY0MDJfQUlfREFUQV9SRUcJCTB4MDAKKyNkZWZpbmUgREFTNjQwMl9BSV9NVVhfUkVHCQkweDAyCisjZGVmaW5lIERBUzY0MDJfQUlfTVVYX0xPKHgpCQkoKCh4KSAmIDB4M2YpIDw8IDApCisjZGVmaW5lIERBUzY0MDJfQUlfTVVYX0hJKHgpCQkoKCh4KSAmIDB4M2YpIDw8IDgpCisjZGVmaW5lIERBUzY0MDJfRElfRE9fUkVHCQkweDAzCisjZGVmaW5lIERBUzY0MDJfQU9fREFUQV9SRUcoeCkJCSgweDA0ICsgKCh4KSAqIDIpKQorI2RlZmluZSBEQVM2NDAyX0FPX0xTQl9SRUcoeCkJCSgweDA0ICsgKCh4KSAqIDIpKQorI2RlZmluZSBEQVM2NDAyX0FPX01TQl9SRUcoeCkJCSgweDA1ICsgKCh4KSAqIDIpKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19SRUcJCTB4MDgKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfRkZORQkJKDEgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfRkhBTEYJCSgxIDw8IDEpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX0ZGVUxMCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19YSU5UCQkoMSA8PCAzKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19JTlQJCSgxIDw8IDQpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1hUUklHCQkoMSA8PCA1KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19JTkRHVAkJKDEgPDwgNikKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfMTBNSFoJCSgxIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1dfQ0xSSU5UCQkoMSA8PCAwKQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX0NMUlhUUgkJKDEgPDwgMSkKKyNkZWZpbmUgREFTNjQwMl9TVEFUVVNfV19DTFJYSU4JCSgxIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1dfRVhURU5ECQkoMSA8PCA0KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX0FSTUVECQkoMSA8PCA1KQorI2RlZmluZSBEQVM2NDAyX1NUQVRVU19XX1BPU1RNT0RFCSgxIDw8IDYpCisjZGVmaW5lIERBUzY0MDJfU1RBVFVTX1dfMTBNSFoJCSgxIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9SRUcJCTB4MDkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX1NPRlRfVFJJRwkJKDAgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX0VYVF9GQUxMX1RSSUcJKDEgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX0VYVF9SSVNFX1RSSUcJKDIgPDwgMCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX1BBQ0VSX1RSSUcJCSgzIDw8IDApCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9CVVJTVEVOCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX0NUUkxfWElOVEUJCSgxIDw8IDMpCisjZGVmaW5lIERBUzY0MDJfQ1RSTF9JUlEoeCkJCSgoeCkgPDwgNCkKKyNkZWZpbmUgREFTNjQwMl9DVFJMX0lOVEUJCSgxIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfVFJJR19SRUcJCTB4MGEKKyNkZWZpbmUgREFTNjQwMl9UUklHX1RHRU4JCSgxIDw8IDApCisjZGVmaW5lIERBUzY0MDJfVFJJR19UR1NFTAkJKDEgPDwgMSkKKyNkZWZpbmUgREFTNjQwMl9UUklHX1RHUE9MCQkoMSA8PCAyKQorI2RlZmluZSBEQVM2NDAyX1RSSUdfUFJFVFJJRwkJKDEgPDwgMykKKyNkZWZpbmUgREFTNjQwMl9BT19SQU5HRShfY2hhbiwgX3JhbmdlKQkoKF9yYW5nZSkgPDwgKChfY2hhbikgPyA2IDogNCkpCisjZGVmaW5lIERBUzY0MDJfQU9fUkFOR0VfTUFTSyhfY2hhbikJKDMgPDwgKChfY2hhbikgPyA2IDogNCkpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9SRUcJCTB4MGIKKyNkZWZpbmUgREFTNjQwMl9NT0RFX1JBTkdFKHgpCQkoKHgpIDw8IDApCisjZGVmaW5lIERBUzY0MDJfTU9ERV9QT0xMRUQJCSgwIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9GSUZPTkVQVFkJCSgxIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9GSUZPSEZVTEwJCSgyIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9FT0IJCSgzIDw8IDIpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9FTkhBTkNFRAkJKDEgPDwgNCkKKyNkZWZpbmUgREFTNjQwMl9NT0RFX1NFCQkJKDEgPDwgNSkKKyNkZWZpbmUgREFTNjQwMl9NT0RFX1VOSQkJKDEgPDwgNikKKyNkZWZpbmUgREFTNjQwMl9NT0RFX0RNQTEJCSgwIDw8IDcpCisjZGVmaW5lIERBUzY0MDJfTU9ERV9ETUEzCQkoMSA8PCA3KQorI2RlZmluZSBEQVM2NDAyX1RJTUVSX0JBU0UJCTB4MGMKIAotI2RlZmluZSBOX1dPUkRTICgzMDAwKjY0KQotCi0jZGVmaW5lIFNUT1AgICAgMAotI2RlZmluZSBTVEFSVCAgIDEKLQotI2RlZmluZSBTQ0FOTCAweDNmMDAKLSNkZWZpbmUgQllURSB1bnNpZ25lZCBjaGFyCi0jZGVmaW5lIFdPUkQgdW5zaWduZWQgc2hvcnQKLQotLyotLS0tLSByZWdpc3RlciA4IC0tLS0qLwotI2RlZmluZSBDTFJJTlQgMHgwMQotI2RlZmluZSBDTFJYVFIgMHgwMgotI2RlZmluZSBDTFJYSU4gMHgwNAotI2RlZmluZSBFWFRFTkQgMHgxMAotI2RlZmluZSBBUk1FRCAweDIwCQkvKiBlbmFibGUgY29udGluZyBvZiBwb3N0IHNhbXBsZSBjb252ICovCi0jZGVmaW5lIFBPU1RNT0RFIDB4NDAKLSNkZWZpbmUgTUhaIDB4ODAJCS8qIDEwIE1IeiBjbG9jayAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tIHJlZ2lzdGVyIDkgLS0tLSovCi0jZGVmaW5lIElSUSAoMHgwNCA8PCA0KQkJLyogdGhlc2UgdHdvIGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJUlFWIDEwCQkJLyogICAgICAgICAgICAgICBkZXBlbmRlbnQgb24gZWFjaCBvdGhlciAqLwotCi0jZGVmaW5lIENPTlZTUkMgMHgwMwkJLyogdHJpZyBzcmMgaXMgSW50YXJuYWwgcGFjZXIgKi8KLSNkZWZpbmUgQlVSU1RFTiAweDA0CQkvKiBlbmFibGUgYnVyc3QgKi8KLSNkZWZpbmUgWElOVEUgMHgwOAkJLyogdXNlIGV4dGVybmFsIGludC4gdHJpZyAqLwotI2RlZmluZSBJTlRFIDB4ODAJCS8qIGVuYWJsZSBhbmFsb2cgaW50ZXJydXB0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tIHJlZ2lzdGVyIDEwIC0tLSovCi0jZGVmaW5lIFRHRU4gMHgwMQkJLyogVXNlIHBpbiBESTEgZm9yIGV4dGVybmwgdHJpZ2dpbmc/ICovCi0jZGVmaW5lIFRHU0VMIDB4MDIJCS8qIFVzZSBlZGdlIHRyaWdnZXJpbmcgKi8KLSNkZWZpbmUgVEdQT0wgMHgwNAkJLyogYWN0aXZlIGVkZ2UgaXMgZmFsbGluZyAqLwotI2RlZmluZSBQUkVUUklHIDB4MDgJCS8qIHByZXRyaWcgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLSByZWdpc3RlciAxMSAtLS0qLwotI2RlZmluZSBFT0IgMHgwYwotI2RlZmluZSBGSUZPSEZVTEwgMHgwOAotI2RlZmluZSBHQUlOIDB4MDEKLSNkZWZpbmUgRklGT05FUFRZIDB4MDQKLSNkZWZpbmUgTU9ERSAweDEwCi0jZGVmaW5lIFNFTSAweDIwCi0jZGVmaW5lIEJJUCAweDQwCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTTAgMHgwMAotI2RlZmluZSBNMiAweDA0Ci0KLSNkZWZpbmUJQzAgMHgwMAotI2RlZmluZQlDMSAweDQwCi0jZGVmaW5lCUMyIDB4ODAKLSNkZWZpbmUJUldMSCAweDMwCi0KLXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgewotCWludCBhaV9ieXRlc190b19yZWFkOwotCi0JaW50IGRhczY0MDJfaWdub3JlaXJxOworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIGRhczY0MDJfYWlfcmFuZ2VzID0geworCTgsIHsKKwkJQklQX1JBTkdFKDEwKSwKKwkJQklQX1JBTkdFKDUpLAorCQlCSVBfUkFOR0UoMi41KSwKKwkJQklQX1JBTkdFKDEuMjUpLAorCQlVTklfUkFOR0UoMTApLAorCQlVTklfUkFOR0UoNSksCisJCVVOSV9SQU5HRSgyLjUpLAorCQlVTklfUkFOR0UoMS4yNSkKKwl9CiB9OwogCi1zdGF0aWMgdm9pZCBkYXM2NDAyX2FpX2ZpZm9fZHJlZ3Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorLyoKKyAqIEFuYWxvZyBvdXRwdXQgcmFuZ2VzIGFyZSBwcm9ncmFtbWFibGUgb24gdGhlIERBUzY0MDIvMTIuCisgKiBGb3IgdGhlIERBUzY0MDIvMTYgdGhlIHJhbmdlIGJpdHMgaGF2ZSBubyBmdW5jdGlvbiwgdGhlCisgKiBEQUMgcmFuZ2VzIGFyZSBzZWxlY3RlZCBieSBzd2l0Y2hlcyBvbiB0aGUgYm9hcmQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSBkYXM2NDAyX2FvX3JhbmdlcyA9IHsKKwk0LCB7CisJCUJJUF9SQU5HRSg1KSwKKwkJQklQX1JBTkdFKDEwKSwKKwkJVU5JX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMTApCisJfQorfTsKKworc3RydWN0IGRhczY0MDJfYm9hcmRpbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBtYXhkYXRhOworfTsKKworc3RydWN0IGRhczY0MDJfYm9hcmRpbmZvIGRhczY0MDJfYm9hcmRzW10gPSB7CisJeworCQkubmFtZQkJPSAiZGFzNjQwMi0xMiIsCisJCS5tYXhkYXRhCT0gMHgwZmZmLAorCX0sIHsKKwkJLm5hbWUJCT0gImRhczY0MDItMTYiLAorCQkubWF4ZGF0YQk9IDB4ZmZmZiwKKwl9LAorfTsKKworc3RydWN0IGRhczY0MDJfcHJpdmF0ZSB7CisJdW5zaWduZWQgaW50IGlycTsKKworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgZGl2aWRlcjE7CisJdW5zaWduZWQgaW50IGRpdmlkZXIyOworCisJdW5zaWduZWQgaW50IGFvX3JhbmdlOworCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKK307CisKK3N0YXRpYyB2b2lkIGRhczY0MDJfc2V0X21vZGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgdW5zaWduZWQgaW50IG1vZGUpCiB7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgOCkgJiAweDAxKSkKLQkJCXJldHVybjsKLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIGludyhkZXYtPmlvYmFzZSkpOworCW91dGIoREFTNjQwMl9NT0RFX0VOSEFOQ0VEIHwgbW9kZSwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX01PREVfUkVHKTsKK30KKworc3RhdGljIHZvaWQgZGFzNjQwMl9zZXRfZXh0ZW5kZWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlvdXRiKERBUzY0MDJfU1RBVFVTX1dfRVhURU5ELCBkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7CisJb3V0YihEQVM2NDAyX1NUQVRVU19XX0VYVEVORCB8IHZhbCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworCW91dGIodmFsLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGRhczY0MDJfY2xlYXJfYWxsX2ludGVycnVwdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlvdXRiKERBUzY0MDJfU1RBVFVTX1dfQ0xSSU5UIHwKKwkgICAgIERBUzY0MDJfU1RBVFVTX1dfQ0xSWFRSIHwKKwkgICAgIERBUzY0MDJfU1RBVFVTX1dfQ0xSWElOLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGRhczY0MDJfYWlfY2xlYXJfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJb3V0YihEQVM2NDAyX1NUQVRVU19XX0NMUklOVCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX2VuYWJsZV9jb3VudGVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZCkKK3sKKwlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgdGltZXJfaW9iYXNlID0gZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1RJTUVSX0JBU0U7CisKKwlpZiAobG9hZCkgeworCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCisJCWk4MjU0X3dyaXRlKHRpbWVyX2lvYmFzZSwgMCwgMCwgZGV2cHJpdi0+Y291bnQpOworCQlpODI1NF93cml0ZSh0aW1lcl9pb2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlkZXIxKTsKKwkJaTgyNTRfd3JpdGUodGltZXJfaW9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpZGVyMik7CisKKwl9IGVsc2UgeworCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgZGFzNjQwMl9zZXRjb3VudGVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0JQllURSBwOwotCXVuc2lnbmVkIHNob3J0IGN0cmx3cmQ7Ci0KLQkvKiBzZXQgdXAgY291bnRlcjAgZmlyc3QsIG1vZGUgMCAqLwotCXAgPSBNMCB8IEMwIHwgUldMSDsKLQlvdXRiX3AocCwgZGV2LT5pb2Jhc2UgKyAxNSk7Ci0JY3RybHdyZCA9IDIwMDA7Ci0JcCA9IChCWVRFKSAoMHhmZiAmIGN0cmx3cmQpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEyKTsKLQlwID0gKEJZVEUpICgweGZmICYgKGN0cmx3cmQgPj4gOCkpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEyKTsKLQotCS8qIHNldCB1cCBjb3VudGVyMSwgbW9kZSAyICovCi0JcCA9IE0yIHwgQzEgfCBSV0xIOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDE1KTsKLQljdHJsd3JkID0gMTA7Ci0JcCA9IChCWVRFKSAoMHhmZiAmIGN0cmx3cmQpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEzKTsKLQlwID0gKEJZVEUpICgweGZmICYgKGN0cmx3cmQgPj4gOCkpOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDEzKTsKLQotCS8qIHNldCB1cCBjb3VudGVyMSwgbW9kZSAyICovCi0JcCA9IE0yIHwgQzIgfCBSV0xIOwotCW91dGJfcChwLCBkZXYtPmlvYmFzZSArIDE1KTsKLQljdHJsd3JkID0gMTAwMDsKLQlwID0gKEJZVEUpICgweGZmICYgY3RybHdyZCk7Ci0Jb3V0Yl9wKHAsIGRldi0+aW9iYXNlICsgMTQpOwotCXAgPSAoQllURSkgKDB4ZmYgJiAoY3RybHdyZCA+PiA4KSk7Ci0Jb3V0Yl9wKHAsIGRldi0+aW9iYXNlICsgMTQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgaXJxcmV0dXJuX3QgZGFzNjQwMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKIAotCWlmICghZGV2LT5hdHRhY2hlZCB8fCBkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSkgewotCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwgIkJVRzogc3B1cmlvdXMgaW50ZXJydXB0XG4iKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KKwlkYXM2NDAyX2NsZWFyX2FsbF9pbnRlcnJ1cHRzKGRldik7CiAKLQlkYXM2NDAyX2FpX2ZpZm9fZHJlZ3MoZGV2LCBzKTsKLQotCWlmIChzLT5hc3luYy0+YnVmX3dyaXRlX2NvdW50ID49IGRldnByaXYtPmFpX2J5dGVzX3RvX3JlYWQpIHsKLQkJb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOwkvKiBjbGVhcnMgdGhlIGZpZm8gKi8KLQkJb3V0YigweDA3LCBkZXYtPmlvYmFzZSArIDgpOwkvKiBjbGVhcnMgYWxsIGZsaXAtZmxvcHMgKi8KLQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQl9Ci0KLQlvdXRiKDB4MDEsIGRldi0+aW9iYXNlICsgOCk7CS8qIGNsZWFyIG9ubHkgdGhlIGludGVycnVwdCBmbGlwLWZsb3AgKi8KLQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmIDAKLXN0YXRpYyB2b2lkIGRhczY0MDJfYWlfZmlmb19yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHNob3J0ICpkYXRhLCBpbnQgbikKK3N0YXRpYyBpbnQgZGFzNjQwMl9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQlkYXRhW2ldID0gaW53KGRldi0+aW9iYXNlKTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KLSNlbmRpZgorCitzdGF0aWMgaW50IGRhczY0MDJfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQoreworCXJldHVybiAtRUlOVkFMOworfQogCiBzdGF0aWMgaW50IGRhczY0MDJfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogeworCW91dGIoREFTNjQwMl9DVFJMX1NPRlRfVFJJRywgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0NUUkxfUkVHKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX2FpX3NvZnRfdHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FJX0RBVEFfUkVHKTsKK30KKworc3RhdGljIGludCBkYXM2NDAyX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERBUzY0MDJfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIERBUzY0MDJfU1RBVFVTX0ZGTkUpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgZGFzNjQwMl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCWludCBpOworCisJdmFsID0gREFTNjQwMl9NT0RFX1JBTkdFKHJhbmdlKSB8IERBUzY0MDJfTU9ERV9QT0xMRUQ7CisJaWYgKGFyZWYgPT0gQVJFRl9ESUZGKSB7CisJCWlmIChjaGFuID4gcy0+bl9jaGFuIC8gMikKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXZhbCB8PSBEQVM2NDAyX01PREVfU0U7CisJfQorCWlmIChjb21lZGlfcmFuZ2VfaXNfdW5pcG9sYXIocywgcmFuZ2UpKQorCQl2YWwgfD0gREFTNjQwMl9NT0RFX1VOSTsKKworCS8qIGVuYWJsZSBzb2Z0d2FyZSBjb252ZXJzaW9uIHRyaWdnZXIgKi8KKwlvdXRiKERBUzY0MDJfQ1RSTF9TT0ZUX1RSSUcsIGRldi0+aW9iYXNlICsgREFTNjQwMl9DVFJMX1JFRyk7CisKKwlkYXM2NDAyX3NldF9tb2RlKGRldiwgdmFsKTsKKworCS8qIGxvYWQgdGhlIG11eCBmb3Igc2luZ2xlIGNoYW5uZWwgY29udmVyc2lvbiAqLworCW91dHcoREFTNjQwMl9BSV9NVVhfSEkoY2hhbikgfCBEQVM2NDAyX0FJX01VWF9MTyhjaGFuKSwKKwkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BSV9NVVhfUkVHKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGFzNjQwMl9haV9jbGVhcl9lb2MoZGV2KTsKKwkJZGFzNjQwMl9haV9zb2Z0X3RyaWcoZGV2KTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczY0MDJfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXZhbCA9IGludyhkZXYtPmlvYmFzZSArIERBUzY0MDJfQUlfREFUQV9SRUcpOworCisJCWlmIChzLT5tYXhkYXRhID09IDB4MGZmZikKKwkJCXZhbCA+Pj0gNDsKKworCQlkYXRhW2ldID0gdmFsOworCX0KKworCWRhczY0MDJfYWlfY2xlYXJfZW9jKGRldik7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBkYXM2NDAyX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgdW5zaWduZWQgaW50ICpkYXRhKQorewogCXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKKworCS8qIHNldCB0aGUgcmFuZ2UgZm9yIHRoaXMgY2hhbm5lbCAqLworCXZhbCA9IGRldnByaXYtPmFvX3JhbmdlOworCXZhbCAmPSB+REFTNjQwMl9BT19SQU5HRV9NQVNLKGNoYW4pOworCXZhbCB8PSBEQVM2NDAyX0FPX1JBTkdFKGNoYW4sIHJhbmdlKTsKKwlpZiAodmFsICE9IGRldnByaXYtPmFvX3JhbmdlKSB7CisJCWRldnByaXYtPmFvX3JhbmdlID0gdmFsOworCQlvdXRiKHZhbCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1RSSUdfUkVHKTsKKwl9CiAKIAkvKgotCSAqICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXNldCB0aGUgYm9hcmQgZnJvbSB3aGF0ZXZlciBjb25kaXRpb24gaXQKLQkgKiAgaXMgaW4gKGkuZS4sIGFjcXVpcmluZyBkYXRhKSwgdG8gYSBub24tYWN0aXZlIHN0YXRlLgorCSAqIFRoZSBEQVM2NDAyLzE2IGhhcyBhIGp1bXBlciB0byBzZWxlY3QgZWl0aGVyIGluZGl2aWR1YWwKKwkgKiB1cGRhdGUgKFVQREFURSkgb3Igc2ltdWx0YW5lb3VzIHVwZGF0aW5nIChYRkVSKSBvZiBib3RoCisJICogREFDJ3MuIEluIFVQREFURSBtb2RlLCB3aGVuIHRoZSBNU0IgaXMgd3JpdHRlbiwgdGhhdCBEQUMKKwkgKiBpcyB1cGRhdGVkLiBJbiBYRkVSIG1vZGUsIGFmdGVyIGJvdGggREFDJ3MgYXJlIGxvYWRlZCwKKwkgKiBhIHJlYWQgY3ljbGUgb2YgYW55IERBQyByZWdpc3RlciB3aWxsIHVwZGF0ZSBib3RoIERBQydzCisJICogc2ltdWx0YW5lb3VzbHkuCisJICoKKwkgKiBJZiB5b3UgaGF2ZSBYRkVSIG1vZGUgZW5hYmxlZCBhICgqaW5zbl9yZWFkKSB3aWxsIG5lZWQKKwkgKiB0byBiZSBwZXJmb3JtZWQgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBEQUMncyB3aXRoIHRoZQorCSAqIGxhc3QgdmFsdWUgd3JpdHRlbi4KIAkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCXZhbCA9IGRhdGFbaV07CiAKLQlkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSA9IDE7Ci0JZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIlN0b3BwaW5nIGFjcXVpc2l0aW9uXG4iKTsKLQlkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSA9IDE7Ci0Jb3V0Yl9wKDB4MDIsIGRldi0+aW9iYXNlICsgMTApOwkvKiBkaXNhYmxlIGV4dGVybmFsIHRyaWdnaW5nICovCi0Jb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOwkvKiByZXNldHMgdGhlIGNhcmQgZmlmbyAqLwotCW91dGJfcCgwLCBkZXYtPmlvYmFzZSArIDkpOwkvKiBkaXNhYmxlcyBpbnRlcnJ1cHRzICovCisJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gdmFsOwogCi0Jb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOworCQlpZiAocy0+bWF4ZGF0YSA9PSAweDBmZmYpIHsKKwkJCS8qCisJCQkgKiBEQVM2NDAyLzEyIGhhcyB0aGUgdHdvIDgtYml0IERBQyByZWdpc3RlcnMsIGxlZnQKKwkJCSAqIGp1c3RpZmllZCAodGhlIDQgTFNCIGJpdHMgYXJlIGRvbid0IGNhcmUpLiBEYXRhCisJCQkgKiBjYW4gYmUgd3JpdHRlbiBhcyBvbmUgd29yZC4KKwkJCSAqLworCQkJdmFsIDw8PSA0OworCQkJb3V0dyh2YWwsIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19EQVRBX1JFRyhjaGFuKSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogREFTNjQwMi8xNiB1c2VzIGJvdGggOC1iaXQgREFDIHJlZ2lzdGVycyBhbmQgbmVlZHMKKwkJCSAqIHRvIGJlIHdyaXR0ZW4gTFNCIHRoZW4gTVNCLgorCQkJICovCisJCQlvdXRiKHZhbCAmIDB4ZmYsCisJCQkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19MU0JfUkVHKGNoYW4pKTsKKwkJCW91dGIoKHZhbCA+PiA4KSAmIDB4ZmYsCisJCQkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19MU0JfUkVHKGNoYW4pKTsKKwkJfQorCX0KIAotCXJldHVybiAwOworCXJldHVybiBpbnNuLT5uOwogfQogCi0jaWZkZWYgdW51c2VkCi1zdGF0aWMgaW50IGRhczY0MDJfYWlfbW9kZTIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgY29tZWRpX3RyaWcgKml0KQorc3RhdGljIGludCBkYXM2NDAyX2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJLyoKKwkgKiBJZiBYRkVSIG1vZGUgaXMgZW5hYmxlZCwgcmVhZGluZyBhbnkgREFDIHJlZ2lzdGVyCisJICogd2lsbCB1cGRhdGUgYm90aCBEQUMncyBzaW11bHRhbmVvdXNseS4KKwkgKi8KKwlpbncoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FPX0xTQl9SRUcoY2hhbikpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgZGFzNjQwMl9kaV9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0RJX0RPX1JFRyk7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBkYXM2NDAyX2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKQorCQlvdXRiKHMtPnN0YXRlLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfRElfRE9fUkVHKTsKKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBkYXM2NDAyX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCWRldnByaXYtPmRhczY0MDJfaWdub3JlaXJxID0gMTsKLQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiU3RhcnRpbmcgYWNxdWlzaXRpb25cbiIpOwotCW91dGJfcCgweDAzLCBkZXYtPmlvYmFzZSArIDEwKTsJLyogZW5hYmxlIGV4dGVybmFsIHRyaWdnaW5nICovCi0Jb3V0d19wKFNDQU5MLCBkZXYtPmlvYmFzZSArIDIpOwkvKiByZXNldHMgdGhlIGNhcmQgZmlmbyAqLwotCW91dGJfcChJUlEgfCBDT05WU1JDIHwgQlVSU1RFTiB8IElOVEUsIGRldi0+aW9iYXNlICsgOSk7CisJLyogZW5hYmxlICJFbmhhbmNlZCIgbW9kZSAqLworCW91dGIoREFTNjQwMl9NT0RFX0VOSEFOQ0VELCBkZXYtPmlvYmFzZSArIERBUzY0MDJfTU9ERV9SRUcpOwogCi0JZGV2cHJpdi0+YWlfYnl0ZXNfdG9fcmVhZCA9IGl0LT5uICogc2l6ZW9mKHNob3J0KTsKKwkvKiBlbmFibGUgMTBNSHogcGFjZXIgY2xvY2sgKi8KKwlkYXM2NDAyX3NldF9leHRlbmRlZChkZXYsIERBUzY0MDJfU1RBVFVTX1dfMTBNSFopOwogCi0JLyogdW0uLi4gaWdub3JlaXJxIGlzIGEgbmFzdHkgcmFjZSBjb25kaXRpb24gKi8KLQlkZXZwcml2LT5kYXM2NDAyX2lnbm9yZWlycSA9IDA7CisJLyogZW5hYmxlIHNvZnR3YXJlIGNvbnZlcnNpb24gdHJpZ2dlciAqLworCW91dGIoREFTNjQwMl9DVFJMX1NPRlRfVFJJRywgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0NUUkxfUkVHKTsKIAotCW91dHdfcChTQ0FOTCwgZGV2LT5pb2Jhc2UgKyAyKTsKKwkvKiBkZWZhdWx0IEFEQyB0byBzaW5nbGUtZW5kZWQgdW5pcG9sYXIgMTBWIGlucHV0cyAqLworCWRhczY0MDJfc2V0X21vZGUoZGV2LCBEQVM2NDAyX01PREVfUkFOR0UoMCkgfAorCQkJICAgICAgREFTNjQwMl9NT0RFX1BPTExFRCB8CisJCQkgICAgICBEQVM2NDAyX01PREVfU0UgfAorCQkJICAgICAgREFTNjQwMl9NT0RFX1VOSSk7CiAKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgorCS8qIGRlZmF1bHQgbXV4IGZvciBzaW5nbGUgY2hhbm5lbCBjb252ZXJzaW9uIChjaGFubmVsIDApICovCisJb3V0dyhEQVM2NDAyX0FJX01VWF9ISSgwKSB8IERBUzY0MDJfQUlfTVVYX0xPKDApLAorCSAgICAgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FJX01VWF9SRUcpOwogCi1zdGF0aWMgaW50IGJvYXJkX2luaXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCUJZVEUgYjsKKwkvKiBzZXQgYm90aCBEQUMncyBmb3IgdW5pcG9sYXIgNVYgb3V0cHV0IHJhbmdlICovCisJZGV2cHJpdi0+YW9fcmFuZ2UgPSBEQVM2NDAyX0FPX1JBTkdFKDAsIDIpIHwgREFTNjQwMl9BT19SQU5HRSgxLCAyKTsKKwlvdXRiKGRldnByaXYtPmFvX3JhbmdlLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfVFJJR19SRUcpOwogCi0JZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEgPSAxOworCS8qIHNldCBib3RoIERBQydzIHRvIDBWICovCisJb3V0dygwLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfQU9fREFUQV9SRUcoMCkpOworCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FPX0RBVEFfUkVHKDApKTsKKwlpbncoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FPX0xTQl9SRUcoMCkpOwogCi0Jb3V0YigweDA3LCBkZXYtPmlvYmFzZSArIDgpOworCWRhczY0MDJfZW5hYmxlX2NvdW50ZXIoZGV2LCBmYWxzZSk7CiAKLQkvKiByZWdpc3RlciAxMSAgKi8KLQlvdXRiX3AoTU9ERSwgZGV2LT5pb2Jhc2UgKyAxMSk7Ci0JYiA9IEJJUCB8IFNFTSB8IE1PREUgfCBHQUlOIHwgRklGT0hGVUxMOwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDExKTsKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgREFTNjQwMl9ESV9ET19SRUcpOwogCi0JLyogcmVnaXN0ZXIgOCAgICovCi0Jb3V0Yl9wKEVYVEVORCwgZGV2LT5pb2Jhc2UgKyA4KTsKLQliID0gRVhURU5EIHwgTUhaOwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDgpOwotCWIgPSBNSFogfCBDTFJJTlQgfCBDTFJYVFIgfCBDTFJYSU47Ci0Jb3V0Yl9wKGIsIGRldi0+aW9iYXNlICsgOCk7Ci0KLQkvKiByZWdpc3RlciA5ICAgICovCi0JYiA9IElSUSB8IENPTlZTUkMgfCBCVVJTVEVOIHwgSU5URTsKLQlvdXRiX3AoYiwgZGV2LT5pb2Jhc2UgKyA5KTsKLQotCS8qIHJlZ2lzdGVyIDEwICAgKi8KLQliID0gVEdTRUwgfCBUR0VOOwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDEwKTsKLQotCWIgPSAweDA3OwotCW91dGJfcChiLCBkZXYtPmlvYmFzZSArIDgpOwotCi0JZGFzNjQwMl9zZXRjb3VudGVyKGRldik7Ci0KLQlvdXR3X3AoU0NBTkwsIGRldi0+aW9iYXNlICsgMik7CS8qIHJlc2V0IGNhcmQgZmlmbyAqLwotCi0JZGV2cHJpdi0+ZGFzNjQwMl9pZ25vcmVpcnEgPSAwOwotCi0JcmV0dXJuIDA7CisJZGFzNjQwMl9jbGVhcl9hbGxfaW50ZXJydXB0cyhkZXYpOwogfQogCiBzdGF0aWMgaW50IGRhczY0MDJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKKwljb25zdCBzdHJ1Y3QgZGFzNjQwMl9ib2FyZGluZm8gKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdjsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCWludCByZXQ7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0KLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgREFTNjQwMl9TSVpFKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaXJxID0gaXQtPm9wdGlvbnNbMF07Ci0JZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIiggaXJxID0gJXUgKVxuIiwgaXJxKTsKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGludHJfaGFuZGxlciwgMCwgImRhczY0MDIiLCBkZXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2LT5pcnEgPSBpcnE7CisJaW50IHJldDsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpOworCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCAweDEwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogYWkgc3ViZGV2aWNlICovCi0JcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQ7Ci0Jcy0+bl9jaGFuID0gODsKLQkvKiBzLT50cmlnWzJdPWRhczY0MDJfYWlfbW9kZTI7ICovCi0Jcy0+Y2FuY2VsID0gZGFzNjQwMl9haV9jYW5jZWw7Ci0Jcy0+bWF4ZGF0YSA9ICgxIDw8IDEyKSAtIDE7Ci0Jcy0+bGVuX2NoYW5saXN0ID0gMTY7CS8qID8gKi8KLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOworCWRhczY0MDJfcmVzZXQoZGV2KTsKIAotCWJvYXJkX2luaXQoZGV2KTsKKwkvKiBJUlFzIDIsMyw1LDYsNywgMTAsMTEsMTUgYXJlIHZhbGlkIGZvciAiZW5oYW5jZWQiIG1vZGUgKi8KKwlpZiAoKDEgPDwgaXQtPm9wdGlvbnNbMV0pICYgMHg4Y2VjKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5vcHRpb25zWzFdLCBkYXM2NDAyX2ludGVycnVwdCwgMCwKKwkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlkZXYtPmlycSA9IGl0LT5vcHRpb25zWzFdOworCisJCQlzd2l0Y2ggKGRldi0+aXJxKSB7CisJCQljYXNlIDEwOgorCQkJCWRldnByaXYtPmlycSA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDExOgorCQkJCWRldnByaXYtPmlycSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDE1OgorCQkJCWRldnByaXYtPmlycSA9IDY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWRldnByaXYtPmlycSA9IGRldi0+aXJxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQW5hbG9nIElucHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9ESUZGOworCXMtPm5fY2hhbgk9IDY0OworCXMtPm1heGRhdGEJPSBib2FyZC0+bWF4ZGF0YTsKKwlzLT5yYW5nZV90YWJsZQk9ICZkYXM2NDAyX2FpX3JhbmdlczsKKwlzLT5pbnNuX3JlYWQJPSBkYXM2NDAyX2FpX2luc25fcmVhZDsKKwlpZiAoZGV2LT5pcnEpIHsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnN1YmRldl9mbGFncwl8PSBTREZfQ01EX1JFQUQ7CisJCXMtPmxlbl9jaGFubGlzdAk9IHMtPm5fY2hhbjsKKwkJcy0+ZG9fY21kdGVzdAk9IGRhczY0MDJfYWlfY21kdGVzdDsKKwkJcy0+ZG9fY21kCT0gZGFzNjQwMl9haV9jbWQ7CisJCXMtPmNhbmNlbAk9IGRhczY0MDJfYWlfY2FuY2VsOworCX0KKworCS8qIEFuYWxvZyBPdXRwdXQgc3ViZGV2aWNlICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbgk9IDI7CisJcy0+bWF4ZGF0YQk9IGJvYXJkLT5tYXhkYXRhOworCXMtPnJhbmdlX3RhYmxlCT0gJmRhczY0MDJfYW9fcmFuZ2VzOworCXMtPmluc25fd3JpdGUJPSBkYXM2NDAyX2FvX2luc25fd3JpdGU7CisJcy0+aW5zbl9yZWFkCT0gZGFzNjQwMl9hb19pbnNuX3JlYWQ7CisKKwkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzJdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbgk9IDg7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMJPSBkYXM2NDAyX2RpX2luc25fYml0czsKKworCS8qIERpZ2l0YWwgSW5wdXQgc3ViZGV2aWNlICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbM107CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbgk9IDg7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMJPSBkYXM2NDAyX2RvX2luc25fYml0czsKIAogCXJldHVybiAwOwogfQpAQCAtMzEzLDkgKzUzNiwxMiBAQAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJLmF0dGFjaAkJPSBkYXM2NDAyX2F0dGFjaCwKIAkuZGV0YWNoCQk9IGNvbWVkaV9sZWdhY3lfZGV0YWNoLAorCS5ib2FyZF9uYW1lCT0gJmRhczY0MDJfYm9hcmRzWzBdLm5hbWUsCisJLm51bV9uYW1lcwk9IEFSUkFZX1NJWkUoZGFzNjQwMl9ib2FyZHMpLAorCS5vZmZzZXQJCT0gc2l6ZW9mKHN0cnVjdCBkYXM2NDAyX2JvYXJkaW5mbyksCiB9OwogbW9kdWxlX2NvbWVkaV9kcml2ZXIoZGFzNjQwMl9kcml2ZXIpCiAKLU1PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgZHJpdmVyIGZvciBEQVM2NDAyIGNvbXBhdGlibGUgYm9hcmRzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMKaW5kZXggNWFmMGE1Ny4uM2U0MDgzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM4MDAuYwpAQCAtNDIwLDE3ICs0MjAsMTIgQEAKIAlnYWluICY9IDB4ZjsKIAlvdXRiKGdhaW4sIGRldi0+aW9iYXNlICsgREFTODAwX0dBSU4pOwogCi0Jc3dpdGNoIChhc3luYy0+Y21kLnN0b3Bfc3JjKSB7Ci0JY2FzZSBUUklHX0NPVU5UOgorCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKIAkJZGV2cHJpdi0+Y291bnQgPSBhc3luYy0+Y21kLnN0b3BfYXJnICogYXN5bmMtPmNtZC5jaGFubGlzdF9sZW47CiAJCWRldnByaXYtPmZvcmV2ZXIgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JY2FzZSBUUklHX05PTkU6CisJfSBlbHNlIHsJLyogVFJJR19OT05FICovCiAJCWRldnByaXYtPmZvcmV2ZXIgPSB0cnVlOwogCQlkZXZwcml2LT5jb3VudCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwogCX0KIAogCS8qIGVuYWJsZSBhdXRvIGNoYW5uZWwgc2Nhbiwgc2VuZCBpbnRlcnJ1cHRzIG9uIGVuZCBvZiBjb252ZXJzaW9uCkBAIC00NDAsMjYgKzQzNSwxOSBAQAogCWNvbnZfYml0cyB8PSBFQUNTIHwgSUVPQzsKIAlpZiAoYXN5bmMtPmNtZC5zdGFydF9zcmMgPT0gVFJJR19FWFQpCiAJCWNvbnZfYml0cyB8PSBEVEVOOwotCXN3aXRjaCAoYXN5bmMtPmNtZC5jb252ZXJ0X3NyYykgewotCWNhc2UgVFJJR19USU1FUjoKKwlpZiAoYXN5bmMtPmNtZC5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWNvbnZfYml0cyB8PSBDQVNDIHwgSVRFOwogCQkvKiBzZXQgY29udmVyc2lvbiBmcmVxdWVuY3kgKi8KIAkJaWYgKGRhczgwMF9zZXRfZnJlcXVlbmN5KGRldikgPCAwKSB7CiAJCQljb21lZGlfZXJyb3IoZGV2LCAiRXJyb3Igc2V0dGluZyB1cCBjb3VudGVycyIpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFJJR19FWFQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOwogCWRhczgwMF9pbmRfd3JpdGUoZGV2LCBjb252X2JpdHMsIENPTlZfQ09OVFJPTCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgaXJxX2ZsYWdzKTsKIAotCWFzeW5jLT5ldmVudHMgPSAwOwogCWRhczgwMF9lbmFibGUoZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUzMiwxMCArNTIwLDggQEAKIAogCWlmIChmaWZvX292ZXJmbG93KSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGlycV9mbGFncyk7Ci0JCWRhczgwMF9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJYXN5bmMtPmV2ZW50cyA9IDA7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKQEAgLTU1MSwyMCArNTM3LDIxIEBACiAJCWRhczgwMF9kaXNhYmxlKGRldik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAl9Ci0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JYXN5bmMtPmV2ZW50cyA9IDA7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgZGFzODAwX3dhaXRfZm9yX2NvbnYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IGRhczgwMF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCWlmICghKGluYihkZXYtPmlvYmFzZSArIERBUzgwMF9TVEFUVVMpICYgQlVTWSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVM4MDBfU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIEJVU1kpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgZGFzODAwX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNTk5LDcgKzU4Niw3IEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlvdXRiX3AoMCwgZGV2LT5pb2Jhc2UgKyBEQVM4MDBfTVNCKTsKIAotCQlyZXQgPSBkYXM4MDBfd2FpdF9mb3JfY29udihkZXYsIDEwMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRhczgwMF9haV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKaW5kZXggNzhhMTk2Mi4uYzhhMzZlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCkBAIC0xNjQsMTYgKzE2NCwyOSBAQAogCiB9OwogCitzdGF0aWMgaW50IGRtbTMyYXRfYWlfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIGNvbnRleHQpOworCWlmICgoc3RhdHVzICYgRE1NMzJBVF9TVEFUVVMpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZG1tMzJhdF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWludCBuLCBpOworCWludCBuOwogCXVuc2lnbmVkIGludCBkOwotCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIHNob3J0IG1zYiwgbHNiOwogCXVuc2lnbmVkIGNoYXIgY2hhbjsKIAlpbnQgcmFuZ2U7CisJaW50IHJldDsKIAogCS8qIGdldCB0aGUgY2hhbm5lbCBhbmQgcmFuZ2UgbnVtYmVyICovCiAKQEAgLTE5MCwyNiArMjAzLDIwIEBACiAJb3V0YihkbW0zMmF0X3JhbmdlYml0c1tyYW5nZV0sIGRldi0+aW9iYXNlICsgRE1NMzJBVF9BSUNPTkYpOwogCiAJLyogd2FpdCBmb3IgY2lyY3VpdCB0byBzZXR0bGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDAwMDA7IGkrKykgewotCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJUkJBQ0spOwotCQlpZiAoKHN0YXR1cyAmIERNTTMyQVRfU1RBVFVTKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IDQwMDAwKQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGRtbTMyYXRfYWlfc3RhdHVzLCBETU0zMkFUX0FJUkJBQ0spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKiBjb252ZXJ0IG4gc2FtcGxlcyAqLwogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCW91dGIoMHhmZiwgZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0NPTlYpOworCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCWZvciAoaSA9IDA7IGkgPCA0MDAwMDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJU1RBVCk7Ci0JCQlpZiAoKHN0YXR1cyAmIERNTTMyQVRfU1RBVFVTKSA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IDQwMDAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZG1tMzJhdF9haV9zdGF0dXMsCisJCQkJICAgICBETU0zMkFUX0FJU1RBVCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIHJlYWQgZGF0YSAqLwogCQlsc2IgPSBpbmIoZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJTFNCKTsKQEAgLTQwMyw4ICs0MTAsOSBAQAogewogCXN0cnVjdCBkbW0zMmF0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwotCWludCBpLCByYW5nZTsKLQl1bnNpZ25lZCBjaGFyIGNoYW5sbywgY2hhbmhpLCBzdGF0dXM7CisJaW50IHJhbmdlOworCXVuc2lnbmVkIGNoYXIgY2hhbmxvLCBjaGFuaGk7CisJaW50IHJldDsKIAogCWlmICghY21kLT5jaGFubGlzdCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MzksMTQgKzQ0NywxMyBAQAogCQkJCQkJICAgICAgKiBpc3IgKi8KIAl9CiAKLQkvKiB3YWl0IGZvciBjaXJjdWl0IHRvIHNldHRsZSAqLwotCWZvciAoaSA9IDA7IGkgPCA0MDAwMDsgaSsrKSB7Ci0JCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERNTTMyQVRfQUlSQkFDSyk7Ci0JCWlmICgoc3RhdHVzICYgRE1NMzJBVF9TVEFUVVMpID09IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gNDAwMDApCi0JCXJldHVybiAtRVRJTUVET1VUOworCS8qCisJICogd2FpdCBmb3IgY2lyY3VpdCB0byBzZXR0bGUKKwkgKiB3ZSBkb24ndCBoYXZlIHRoZSAnaW5zbicgaGVyZSBidXQgaXQncyBub3QgbmVlZGVkCisJICovCisJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBOVUxMLCBkbW0zMmF0X2FpX3N0YXR1cywgRE1NMzJBVF9BSVJCQUNLKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKGRldnByaXYtPmFpX3NjYW5zX2xlZnQgPiAxKSB7CiAJCS8qIHN0YXJ0IHRoZSBjbG9jayBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCkBAIC01MjUsNiArNTMyLDE5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaW50IGRtbTMyYXRfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERNTTMyQVRfREFDU1RBVCk7CisJaWYgKChzdGF0dXMgJiBETU0zMkFUX0RBQ0JVU1kpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgZG1tMzJhdF9hb193aW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQpAQCAtNTMzLDYgKzU1Myw3IEBACiAJaW50IGk7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBjaGFyIGhpLCBsbywgc3RhdHVzOworCWludCByZXQ7CiAKIAkvKiBXcml0aW5nIGEgbGlzdCBvZiB2YWx1ZXMgdG8gYW4gQU8gY2hhbm5lbCBpcyBwcm9iYWJseSBub3QKIAkgKiB2ZXJ5IHVzZWZ1bCwgYnV0IHRoYXQncyBob3cgdGhlIGludGVyZmFjZSBpcyBkZWZpbmVkLiAqLwpAQCAtNTQ5LDEzICs1NzAsOSBAQAogCQlvdXRiKGhpLCBkZXYtPmlvYmFzZSArIERNTTMyQVRfREFDTVNCKTsKIAogCQkvKiB3YWl0IGZvciBjaXJjdWl0IHRvIHNldHRsZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDAwMDA7IGkrKykgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRE1NMzJBVF9EQUNTVEFUKTsKLQkJCWlmICgoc3RhdHVzICYgRE1NMzJBVF9EQUNCVVNZKSA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IDQwMDAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZG1tMzJhdF9hb19lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiBkdW1teSByZWFkIHRvIHVwZGF0ZSB0cmlnZ2VyIHRoZSBvdXRwdXQgKi8KIAkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRE1NMzJBVF9EQUNNU0IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCmluZGV4IDQyNzE5MDMuLmJhN2MyYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMKQEAgLTIyNCwyMyArMjI0LDMyIEBACiAJJnJhbmdlX3VuaXBvbGFyNQogfTsKIAotI2RlZmluZSBEVDI4MTFfVElNRU9VVCA1CitzdGF0aWMgaW50IGR0MjgxMV9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQURDU1IpOworCWlmICgoc3RhdHVzICYgRFQyODExX0FEQlVTWSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KIAogc3RhdGljIGludCBkdDI4MTFfYWlfaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpbnQgdGltZW91dCA9IERUMjgxMV9USU1FT1VUOworCWludCByZXQ7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCW91dGIoY2hhbiwgZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQURHQ1IpOwogCi0JCXdoaWxlICh0aW1lb3V0Ci0JCSAgICAgICAmJiBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQURDU1IpICYgRFQyODExX0FEQlVTWSkKLQkJCXRpbWVvdXQtLTsKLQkJaWYgKCF0aW1lb3V0KQotCQkJcmV0dXJuIC1FVElNRTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkdDI4MTFfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJZGF0YVtpXSA9IGluYihkZXYtPmlvYmFzZSArIERUMjgxMV9BRERBVExPKTsKIAkJZGF0YVtpXSB8PSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTFfQUREQVRISSkgPDwgODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYwppbmRleCBhYmFkNmU0Li4zNzk0YjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCkBAIC02NiwyNiArNjYsMzUgQEAKICNkZWZpbmUgRFQyODE0X1RJTUVPVVQgMTAKICNkZWZpbmUgRFQyODE0X01BWF9TUEVFRCAxMDAwMDAJLyogQXJiaXRyYXJ5IDEwIGtoeiBsaW1pdCAqLwogCitzdGF0aWMgaW50IGR0MjgxNF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTRfQ1NSKTsKKwlpZiAoc3RhdHVzICYgRFQyODE0X0ZJTklTSCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBkdDI4MTRfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IG4sIGksIGhpLCBsbzsKKwlpbnQgbiwgaGksIGxvOwogCWludCBjaGFuOwotCWludCBzdGF0dXMgPSAwOworCWludCByZXQ7CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CiAJCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAogCQlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgRFQyODE0X0NTUik7Ci0JCWZvciAoaSA9IDA7IGkgPCBEVDI4MTRfVElNRU9VVDsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBEVDI4MTRfQ1NSKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlpZiAoc3RhdHVzICYgRFQyODE0X0ZJTklTSCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA+PSBEVDI4MTRfVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHQyODE0X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWhpID0gaW5iKGRldi0+aW9iYXNlICsgRFQyODE0X0RBVEEpOwogCQlsbyA9IGluYihkZXYtPmlvYmFzZSArIERUMjgxNF9EQVRBKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYwppbmRleCBlZTI0NzE3Li5iOWFjNGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNS5jCkBAIC02NywxNSArNjcsMTcgQEAKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbOF07CiB9OwogCi1zdGF0aWMgaW50IGR0MjgxNV93YWl0X2Zvcl9zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3N0YXRpYyBpbnQgZHQyODE1X2FvX3N0YXR1cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlpZiAoaW5iKGRldi0+aW9iYXNlICsgRFQyODE1X1NUQVRVUykgPT0gc3RhdHVzKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgRFQyODE1X1NUQVRVUyk7CisJaWYgKHN0YXR1cyA9PSBjb250ZXh0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGR0MjgxNV9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTk4LDMwICsxMDAsMjMgQEAKIAlzdHJ1Y3QgZHQyODE1X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGk7CiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBsbywgaGk7CisJaW50IHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJbG8gPSAoKGRhdGFbaV0gJiAweDBmKSA8PCA0KSB8IChjaGFuIDw8IDEpIHwgMHgwMTsKIAkJaGkgPSAoZGF0YVtpXSAmIDB4ZmYwKSA+PiA0OwogCi0JCXN0YXR1cyA9IGR0MjgxNV93YWl0X2Zvcl9zdGF0dXMoZGV2LCAweDAwKTsKLQkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJmYWlsZWQgdG8gd3JpdGUgbG93IGJ5dGUgb24gJWQgcmVhc29uICV4XG4iLAotCQkJCWNoYW4sIHN0YXR1cyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHQyODE1X2FvX3N0YXR1cywgMHgwMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCW91dGIobG8sIGRldi0+aW9iYXNlICsgRFQyODE1X0RBVEEpOwogCi0JCXN0YXR1cyA9IGR0MjgxNV93YWl0X2Zvcl9zdGF0dXMoZGV2LCAweDEwKTsKLQkJaWYgKHN0YXR1cyAhPSAweDEwKSB7Ci0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJmYWlsZWQgdG8gd3JpdGUgaGlnaCBieXRlIG9uICVkIHJlYXNvbiAleFxuIiwKLQkJCQljaGFuLCBzdGF0dXMpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR0MjgxNV9hb19zdGF0dXMsIDB4MTApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CiAJfQogCXJldHVybiBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCmluZGV4IDg5NWY3M2EuLjE2Y2MxMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKQEAgLTYzLDcgKzYzLDYgQEAKIAogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCi0jZGVmaW5lIERUMjgyMV9USU1FT1VUCQkxMDAJLyogNTAwIHVzICovCiAjZGVmaW5lIERUMjgyMV9TSVpFIDB4MTAKIAogLyoKQEAgLTI0OCwyNyArMjQ3LDYgQEAKICAqICAgIFNvbWUgdXNlbGVzcyBhYnN0cmFjdGlvbnMKICAqLwogI2RlZmluZSBjaGFuX3RvX0RBQyhhKQkoKGEpJjEpCi0jZGVmaW5lIG11eF9idXN5KCkgKGludyhkZXYtPmlvYmFzZStEVDI4MjFfQURDU1IpJkRUMjgyMV9NVVhCVVNZKQotI2RlZmluZSBhZF9kb25lKCkgKGludyhkZXYtPmlvYmFzZStEVDI4MjFfQURDU1IpJkRUMjgyMV9BRERPTkUpCi0KLS8qCi0gKiAgICBkYW5nZXIhIG1hY3JvIGFidXNlLi4uIGEgaXMgdGhlIGV4cHJlc3Npb24gdG8gd2FpdCBvbiwgYW5kIGIgaXMKLSAqICAgICAgdGhlIHN0YXRlbWVudChzKSB0byBleGVjdXRlIGlmIGl0IGRvZXNuJ3QgaGFwcGVuLgotICovCi0jZGVmaW5lIHdhaXRfZm9yKGEsIGIpCQkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQlpbnQgX2k7CQkJCQkJXAotCQlmb3IgKF9pID0gMDsgX2kgPCBEVDI4MjFfVElNRU9VVDsgX2krKykgewlcCi0JCQlpZiAoYSkgewkJCQlcCi0JCQkJX2kgPSAwOwkJCQlcCi0JCQkJYnJlYWs7CQkJCVwKLQkJCX0JCQkJCVwKLQkJCXVkZWxheSg1KTsJCQkJXAotCQl9CQkJCQkJXAotCQlpZiAoX2kpIHsJCQkJCVwKLQkJCWIJCQkJCVwKLQkJfQkJCQkJCVwKLQl9IHdoaWxlICgwKQogCiBzdGF0aWMgaW50IHByZXBfYWlfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBjaGFuLCBpbnQgc2l6ZSk7CiBzdGF0aWMgaW50IHByZXBfYW9fZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBjaGFuLCBpbnQgc2l6ZSk7CkBAIC0zMjgsNyArMzA2LDYgQEAKIAlzaXplID0gY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIocywgcHRyLCBkZXZwcml2LT5kbWFfbWF4c2l6ZSk7CiAJaWYgKHNpemUgPT0gMCkgewogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiQU8gdW5kZXJydW5cbiIpOwotCQlkdDI4MnhfYW9fY2FuY2VsKGRldiwgcyk7CiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm47CiAJfQpAQCAtMzYzLDcgKzM0MCw3IEBACiAJZHQyODJ4X211bmdlKGRldiwgcHRyLCBzaXplKTsKIAlyZXQgPSBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsIHB0ciwgc2l6ZSk7CiAJaWYgKHJldCAhPSBzaXplKSB7Ci0JCWR0MjgyeF9haV9jYW5jZWwoZGV2LCBzKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCXJldHVybjsKIAl9CiAJZGV2cHJpdi0+bnJlYWQgLT0gc2l6ZSAvIDI7CkBAIC0zNzMsNyArMzUwLDYgQEAKIAkJZGV2cHJpdi0+bnJlYWQgPSAwOwogCX0KIAlpZiAoIWRldnByaXYtPm5yZWFkKSB7Ci0JCWR0MjgyeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwogCQlyZXR1cm47CiAJfQpAQCAtNDcxLDE1ICs0NDcsMTMgQEAKIAlpZiAoYWRjc3IgJiBEVDI4MjFfQURFUlIpIHsKIAkJaWYgKGRldnByaXYtPm5yZWFkICE9IDApIHsKIAkJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgZXJyb3IiKTsKLQkJCWR0MjgyeF9haV9jYW5jZWwoZGV2LCBzKTsKIAkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOwogCQl9CiAJCWhhbmRsZWQgPSAxOwogCX0KIAlpZiAoZGFjc3IgJiBEVDI4MjFfREFFUlIpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwgIkQvQSBlcnJvciIpOwotCQlkdDI4MnhfYW9fY2FuY2VsKGRldiwgc19hbyk7Ci0JCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQlzX2FvLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJaGFuZGxlZCA9IDE7CiAJfQogI2lmIDAKQEAgLTUwOCw3ICs0ODIsOCBAQAogCQloYW5kbGVkID0gMTsKIAl9CiAjZW5kaWYKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgc19hbyk7CiAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KQEAgLTUzMCw2ICs1MDUsMjkgQEAKIAlvdXR3KG4gLSAxLCBkZXYtPmlvYmFzZSArIERUMjgyMV9DSEFOQ1NSKTsKIH0KIAorc3RhdGljIGludCBkdDI4MnhfYWlfdGltZW91dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIERUMjgyMV9BRENTUik7CisJc3dpdGNoIChjb250ZXh0KSB7CisJY2FzZSBEVDI4MjFfTVVYQlVTWToKKwkJaWYgKChzdGF0dXMgJiBEVDI4MjFfTVVYQlVTWSkgPT0gMCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIERUMjgyMV9BRERPTkU6CisJCWlmIChzdGF0dXMgJiBEVDI4MjFfQURET05FKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCiAvKgogICogICAgUGVyZm9ybXMgYSBzaW5nbGUgQS9EIGNvbnZlcnNpb24uCiAgKiAgICAgIC0gUHV0IGNoYW5uZWwvZ2FpbiBpbnRvIGNoYW5uZWwtZ2FpbiBsaXN0CkBAIC01NDIsNiArNTQwLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgZHQyODJ4X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBkdDI4MnhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmV0OwogCWludCBpOwogCiAJLyogWFhYIHNob3VsZCB3ZSByZWFsbHkgYmUgZW5hYmxpbmcgdGhlIGFkIGNsb2NrIGhlcmU/ICovCkBAIC01NTEsMTMgKzU1MCwxOCBAQAogCWR0MjgyeF9sb2FkX2NoYW5nYWluKGRldiwgMSwgJmluc24tPmNoYW5zcGVjKTsKIAogCW91dHcoZGV2cHJpdi0+c3VwY3NyIHwgRFQyODIxX1BSTEQsIGRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUik7Ci0Jd2FpdF9mb3IoIW11eF9idXN5KCksIGNvbWVkaV9lcnJvcihkZXYsICJ0aW1lb3V0XG4iKTsgcmV0dXJuIC1FVElNRTspOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHQyODJ4X2FpX3RpbWVvdXQsIERUMjgyMV9NVVhCVVNZKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXR3KGRldnByaXYtPnN1cGNzciB8IERUMjgyMV9TVFJJRywKIAkJCWRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUik7Ci0JCXdhaXRfZm9yKGFkX2RvbmUoKSwgY29tZWRpX2Vycm9yKGRldiwgInRpbWVvdXRcbiIpOwotCQkJIHJldHVybiAtRVRJTUU7KTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGR0MjgyeF9haV90aW1lb3V0LAorCQkJCSAgICAgRFQyODIxX0FERE9ORSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWRhdGFbaV0gPQogCQkgICAgaW53KGRldi0+aW9iYXNlICsKQEAgLTY0Niw2ICs2NTAsNyBAQAogCXN0cnVjdCBkdDI4MnhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CiAJaW50IHRpbWVyOworCWludCByZXQ7CiAKIAlpZiAoZGV2cHJpdi0+dXNlZG1hID09IDApIHsKIAkJY29tZWRpX2Vycm9yKGRldiwKQEAgLTY5MSw3ICs2OTYsOSBAQAogCW91dHcoZGV2cHJpdi0+YWRjc3IsIGRldi0+aW9iYXNlICsgRFQyODIxX0FEQ1NSKTsKIAogCW91dHcoZGV2cHJpdi0+c3VwY3NyIHwgRFQyODIxX1BSTEQsIGRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUik7Ci0Jd2FpdF9mb3IoIW11eF9idXN5KCksIGNvbWVkaV9lcnJvcihkZXYsICJ0aW1lb3V0XG4iKTsgcmV0dXJuIC1FVElNRTspOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgTlVMTCwgZHQyODJ4X2FpX3RpbWVvdXQsIERUMjgyMV9NVVhCVVNZKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpIHsKIAkJb3V0dyhkZXZwcml2LT5zdXBjc3IgfCBEVDI4MjFfU1RSSUcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMKaW5kZXggZjUyYTQ0Ny4uNDM2ZTQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDMwMDAuYwpAQCAtMzY5LDEyICszNjksMTAgQEAKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwogCiAJZGVidWdfbl9pbnRzKys7Ci0JaWYgKGRlYnVnX25faW50cyA+PSAxMCkgewotCQlkdDNrX2FpX2NhbmNlbChkZXYsIHMpOworCWlmIChkZWJ1Z19uX2ludHMgPj0gMTApCiAJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQl9CiAKLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNzY3LDggKzc2NSw2IEBACiAJcy0+dHlwZSA9IENPTUVESV9TVUJEX1BST0M7CiAjZW5kaWYKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jCmluZGV4IGYyMjQ4MjUuLmU1NTkzZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9keW5hX3BjaTEweHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHluYV9wY2kxMHh4LmMKQEAgLTU3LDE4ICs1NywyNyBAQAogCXVuc2lnbmVkIGxvbmcgQkFEUjM7CiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFJFQUQgV1JJVEUgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGR5bmFfcGNpMTB4eF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLS8qIGFuYWxvZyBpbnB1dCBjYWxsYmFjayAqLworCXN0YXR1cyA9IGlud19wKGRldi0+aW9iYXNlKTsKKwlpZiAoc3RhdHVzICYgKDEgPDwgMTUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGR5bmFfcGNpMTB4eF9pbnNuX3JlYWRfYWkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGR5bmFfcGNpMTB4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCBjb3VudGVyOworCWludCBuOwogCXUxNiBkID0gMDsKKwlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgY2hhbiwgcmFuZ2U7CiAKIAkvKiBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGFuZCByYW5nZSAqLwpAQCAtODIsMTggKzkxLDEzIEBACiAJCXNtcF9tYigpOwogCQlvdXR3X3AoMHgwMDAwICsgcmFuZ2UgKyBjaGFuLCBkZXYtPmlvYmFzZSArIDIpOwogCQl1ZGVsYXkoMTApOwotCQkvKiByZWFkIGRhdGEgKi8KLQkJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IFJFQURfVElNRU9VVDsgY291bnRlcisrKSB7Ci0JCQlkID0gaW53X3AoZGV2LT5pb2Jhc2UpOwogCi0JCQkvKiBjaGVjayBpZiByZWFkIGlzIHN1Y2Nlc3NmdWwgaWYgdGhlIEVPQyBiaXQgaXMgc2V0ICovCi0JCQlpZiAoZCAmICgxIDw8IDE1KSkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQl9Ci0JCWRhdGFbbl0gPSAwOwotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAidGltZW91dCByZWFkaW5nIGFuYWxvZyBpbnB1dFxuIik7Ci0JCWNvbnRpbnVlOwotY29udl9maW5pc2g6CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgZHluYV9wY2kxMHh4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQkvKiByZWFkIGRhdGEgKi8KKwkJZCA9IGlud19wKGRldi0+aW9iYXNlKTsKIAkJLyogbWFzayB0aGUgZmlyc3QgNCBiaXRzIC0gRU9DIGJpdHMgKi8KIAkJZCAmPSAweDBGRkY7CiAJCWRhdGFbbl0gPSBkOwpAQCAtMTAxLDcgKzEwNSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZXZwcml2LT5tdXRleCk7CiAKIAkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQvd3JpdHRlbiAqLwotCXJldHVybiBuOworCXJldHVybiByZXQgPyByZXQgOiBuOwogfQogCiAvKiBhbmFsb2cgb3V0cHV0IGNhbGxiYWNrICovCkBAIC0yMzIsOCArMjM2LDYgQEAKIAlzLT5zdGF0ZSA9IDA7CiAJcy0+aW5zbl9iaXRzID0gZHluYV9wY2kxMHh4X2RvX2luc25fYml0czsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ZsNTEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZmw1MTIuYwppbmRleCBhOTlkZGYwLi40ZTQxMGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZmw1MTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZmw1MTIuYwpAQCAtMSwyNyArMSw0OSBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9mbDUxMi5jCi0gICAgQW5kZXJzIEduaXN0cnVwIDxleDE4QGthbG1hbi5pYXUuZHR1LmRrPgotKi8KKyAqIGZsNTEyLmMKKyAqIEFuZGVycyBHbmlzdHJ1cCA8ZXgxOEBrYWxtYW4uaWF1LmR0dS5kaz4KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKIC8qCi1Ecml2ZXI6IGZsNTEyCi1EZXNjcmlwdGlvbjogdW5rbm93bgotQXV0aG9yOiBBbmRlcnMgR25pc3RydXAgPGV4MThAa2FsbWFuLmlhdS5kdHUuZGs+Ci1EZXZpY2VzOiBbdW5rbm93bl0gRkw1MTIgKGZsNTEyKQotU3RhdHVzOiB1bmtub3duCi0KLURpZ2l0YWwgSS9PIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUNvbmZpZ3VyYXRpb24gb3B0aW9uczoKLSAgWzBdIC0gSS9PIHBvcnQgYmFzZSBhZGRyZXNzCi0qLworICogRHJpdmVyOiBmbDUxMgorICogRGVzY3JpcHRpb246IHVua25vd24KKyAqIEF1dGhvcjogQW5kZXJzIEduaXN0cnVwIDxleDE4QGthbG1hbi5pYXUuZHR1LmRrPgorICogRGV2aWNlczogW3Vua25vd25dIEZMNTEyIChmbDUxMikKKyAqIFN0YXR1czogdW5rbm93bgorICoKKyAqIERpZ2l0YWwgSS9PIGlzIG5vdCBzdXBwb3J0ZWQuCisgKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICogICBbMF0gLSBJL08gcG9ydCBiYXNlIGFkZHJlc3MKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jZGVmaW5lIEZMNTEyX1NJWkUgMTYJCS8qIHRoZSBzaXplIG9mIHRoZSB1c2VkIG1lbW9yeSAqLworLyoKKyAqIFJlZ2lzdGVyIEkvTyBtYXAKKyAqLworI2RlZmluZSBGTDUxMl9BSV9MU0JfUkVHCQkweDAyCisjZGVmaW5lIEZMNTEyX0FJX01TQl9SRUcJCTB4MDMKKyNkZWZpbmUgRkw1MTJfQUlfTVVYX1JFRwkJMHgwMgorI2RlZmluZSBGTDUxMl9BSV9TVEFSVF9DT05WX1JFRwkJMHgwMworI2RlZmluZSBGTDUxMl9BT19EQVRBX1JFRyh4KQkJKDB4MDQgKyAoKHgpICogMikpCisjZGVmaW5lIEZMNTEyX0FPX1RSSUdfUkVHKHgpCQkoMHgwNCArICgoeCkgKiAyKSkKKwogc3RydWN0IGZsNTEyX3ByaXZhdGUgewogCXVuc2lnbmVkIHNob3J0IGFvX3JlYWRiYWNrWzJdOwogfTsKQEAgLTM4LDcyICs2MCw2OSBAQAogCX0KIH07CiAKLS8qCi0gKiBmbDUxMl9haV9pbnNuIDogdGhpcyBpcyB0aGUgYW5hbG9nIGlucHV0IGZ1bmN0aW9uCi0gKi8KLXN0YXRpYyBpbnQgZmw1MTJfYWlfaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBmbDUxMl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCWludCBuOwotCXVuc2lnbmVkIGludCBsb19ieXRlLCBoaV9ieXRlOwotCWNoYXIgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2LT5pb2Jhc2U7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOwogCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewkvKiBzYW1wbGUgbiB0aW1lcyBvbiBzZWxlY3RlZCBjaGFubmVsICovCi0JCS8qIFhYWCBwcm9iYWJseSBjYW4gbW92ZSBuZXh0IHN0ZXAgb3V0IG9mIGZvcigpIGxvb3AgLS0gd2lsbAotCQkgKiBtYWtlIEFJIGEgbGl0dGxlIGJpdCBmYXN0ZXIuICovCi0JCW91dGIoY2hhbiwgaW9iYXNlICsgMik7CS8qIHNlbGVjdCBjaGFuICovCi0JCW91dGIoMCwgaW9iYXNlICsgMyk7CS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KKwlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgRkw1MTJfQUlfTVVYX1JFRyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBGTDUxMl9BSV9TVEFSVF9DT05WX1JFRyk7CisKIAkJLyogWFhYIHNob3VsZCB0ZXN0ICJkb25lIiBmbGFnIGluc3RlYWQgb2YgZGVsYXkgKi8KLQkJdWRlbGF5KDMwKTsJLyogc2xlZXAgMzAgdXNlYyAqLwotCQlsb19ieXRlID0gaW5iKGlvYmFzZSArIDIpOwkvKiBsb3cgOCBieXRlICovCi0JCWhpX2J5dGUgPSBpbmIoaW9iYXNlICsgMykgJiAweGY7IC8qIGhpZ2ggNCBiaXQgYW5kIG1hc2sgKi8KLQkJZGF0YVtuXSA9IGxvX2J5dGUgKyAoaGlfYnl0ZSA8PCA4KTsKKwkJdWRlbGF5KDMwKTsKKworCQl2YWwgPSBpbmIoZGV2LT5pb2Jhc2UgKyBGTDUxMl9BSV9MU0JfUkVHKTsKKwkJdmFsIHw9IChpbmIoZGV2LT5pb2Jhc2UgKyBGTDUxMl9BSV9NU0JfUkVHKSA8PCA4KTsKKwkJdmFsICY9IHMtPm1heGRhdGE7CisKKwkJZGF0YVtpXSA9IHZhbDsKIAl9Ci0JcmV0dXJuIG47CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyoKLSAqIGZsNTEyX2FvX2luc24gOiB1c2VkIHRvIHdyaXRlIHRvIGEgREEgcG9ydCBuIHRpbWVzCi0gKi8KLXN0YXRpYyBpbnQgZmw1MTJfYW9faW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBmbDUxMl9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZmw1MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbjsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwkvKiBnZXQgY2hhbiB0byB3cml0ZSAqLwotCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2LT5pb2Jhc2U7CS8qIGdldCBiYXNlIGFkZHJlc3MgICovCisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CisJaW50IGk7CiAKLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CS8qIHdyaXRlIG4gZGF0YSBzZXQgKi8KLQkJLyogd3JpdGUgbG93IGJ5dGUgICAqLwotCQlvdXRiKGRhdGFbbl0gJiAweDBmZiwgaW9iYXNlICsgNCArIDIgKiBjaGFuKTsKLQkJLyogd3JpdGUgaGlnaCBieXRlICAqLwotCQlvdXRiKChkYXRhW25dICYgMHhmMDApID4+IDgsIGlvYmFzZSArIDQgKyAyICogY2hhbik7Ci0JCWluYihpb2Jhc2UgKyA0ICsgMiAqIGNoYW4pOwkvKiB0cmlnICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBkYXRhW2ldOwogCi0JCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtuXTsKKwkJLyogd3JpdGUgTFNCLCBNU0IgdGhlbiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KKwkJb3V0Yih2YWwgJiAweDBmZiwgZGV2LT5pb2Jhc2UgKyBGTDUxMl9BT19EQVRBX1JFRyhjaGFuKSk7CisJCW91dGIoKHZhbCA+PiA4KSAmIDB4ZiwgZGV2LT5pb2Jhc2UgKyBGTDUxMl9BT19EQVRBX1JFRyhjaGFuKSk7CisJCWluYihkZXYtPmlvYmFzZSArIEZMNTEyX0FPX1RSSUdfUkVHKGNoYW4pKTsKIAl9Ci0JcmV0dXJuIG47CisJZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSB2YWw7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyoKLSAqIGZsNTEyX2FvX2luc25fcmVhZGJhY2sgOiB1c2VkIHRvIHJlYWQgcHJldmlvdXMgdmFsdWVzIHdyaXR0ZW4gdG8KLSAqIERBIHBvcnQKLSAqLwotc3RhdGljIGludCBmbDUxMl9hb19pbnNuX3JlYWRiYWNrKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBmbDUxMl9hb19pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBmbDUxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKIAotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCi0JCWRhdGFbbl0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CiAKLQlyZXR1cm4gbjsKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAogc3RhdGljIGludCBmbDUxMl9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQpAQCAtMTEyLDcgKzEzMSw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IHJldDsKIAotCXJldCA9IGNvbWVkaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGl0LT5vcHRpb25zWzBdLCBGTDUxMl9TSVpFKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTI0LDQyICsxNDMsMjYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyoKLQkgKiB0aGlzIGlmIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgc3VwZGV2aWNlcywgMiBoYXZlIGJlZW4gZGVmaW5lZAotCSAqLwotCS8qIEFuYWxvZyBpbmRwdXQgKi8KKwkvKiBBbmFsb2cgSW5wdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JLyogZGVmaW5lIHN1YmRldmljZSBhcyBBbmFsb2cgSW4gKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0JLyogeW91IGNhbiByZWFkIGl0IGZyb20gdXNlcnNwYWNlICovCi0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKLQkvKiBOdW1iZXIgb2YgQW5hbG9nIGlucHV0IGNoYW5uZWxzICovCi0Jcy0+bl9jaGFuID0gMTY7Ci0JLyogYWNjZXB0IG9ubHkgMTIgYml0cyBvZiBkYXRhICovCi0Jcy0+bWF4ZGF0YSA9IDB4MGZmZjsKLQkvKiBkZXZpY2UgdXNlIG9uZSBvZiB0aGUgcmFuZ2VzICovCi0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZmw1MTI7Ci0JLyogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHJlYWQgQUQgKi8KLQlzLT5pbnNuX3JlYWQgPSBmbDUxMl9haV9pbnNuOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMHgwZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2ZsNTEyOworCXMtPmluc25fcmVhZAk9IGZsNTEyX2FpX2luc25fcmVhZDsKIAotCS8qIEFuYWxvZyBvdXRwdXQgKi8KKwkvKiBBbmFsb2cgT3V0cHV0IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzFdOwotCS8qIGRlZmluZSBzdWJkZXZpY2UgYXMgQW5hbG9nIE9VVCAqLwotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKLQkvKiB5b3UgY2FuIHdyaXRlIGl0IGZyb20gdXNlcnNwYWNlICovCi0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCS8qIE51bWJlciBvZiBBbmFsb2cgb3V0cHV0IGNoYW5uZWxzICovCi0Jcy0+bl9jaGFuID0gMjsKLQkvKiBhY2NlcHQgb25seSAxMiBiaXRzIG9mIGRhdGEgKi8KLQlzLT5tYXhkYXRhID0gMHgwZmZmOwotCS8qIGRldmljZSB1c2Ugb25lIG9mIHRoZSByYW5nZXMgKi8KLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9mbDUxMjsKLQkvKiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gd3JpdGUgREEgKi8KLQlzLT5pbnNuX3dyaXRlID0gZmw1MTJfYW9faW5zbjsKLQkvKiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gcmVhZGluZyBEQSAqLwotCXMtPmluc25fcmVhZCA9IGZsNTEyX2FvX2luc25fcmVhZGJhY2s7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gMjsKKwlzLT5tYXhkYXRhCT0gMHgwZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2ZsNTEyOworCXMtPmluc25fd3JpdGUJPSBmbDUxMl9hb19pbnNuX3dyaXRlOworCXMtPmluc25fcmVhZAk9IGZsNTEyX2FvX2luc25fcmVhZDsKIAotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgZmw1MTJfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwppbmRleCBkZTYwYTI4Li4wOGQ3NjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwpAQCAtMSwyNCArMSwyNCBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCi0gICAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEdlbmVyYWwgU3RhbmRhcmRzIENvcnBvcmF0aW9uIEhpZ2gKLSAgICBTcGVlZCBQYXJhbGxlbCBEaWdpdGFsIEludGVyZmFjZSByczQ4NSBib2FyZHMuCi0KLSAgICBBdXRob3I6ICBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gICAgQ29weXJpZ2h0IChDKSAyMDAzIENvaGVyZW50IEltYWdpbmcgU3lzdGVtcwotCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMTk5Ny04IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLworICogZ3NjX2hwZGkuYworICogQ29tZWRpIGRyaXZlciB0aGUgR2VuZXJhbCBTdGFuZGFyZHMgQ29ycG9yYXRpb24KKyAqIEhpZ2ggU3BlZWQgUGFyYWxsZWwgRGlnaXRhbCBJbnRlcmZhY2UgcnM0ODUgYm9hcmRzLgorICoKKyAqIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2hlcmVudCBJbWFnaW5nIFN5c3RlbXMKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAogLyoKICAqIERyaXZlcjogZ3NjX2hwZGkKQEAgLTQwLDggKzQwLDYgQEAKICAqIHN1cHBvcnQgY291bGQgYmUgYWRkZWQgdG8gdGhpcyBkcml2ZXIuCiAgKi8KIAotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTUyLDE0OSArNTAsMTA1IEBACiAjaW5jbHVkZSAicGx4OTA4MC5oIgogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCi1zdGF0aWMgdm9pZCBhYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpOwotc3RhdGljIGludCBocGRpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci1zdGF0aWMgaW50IGhwZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCk7Ci1zdGF0aWMgaW50IGhwZGlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpOwotc3RhdGljIGludCBkaW9fY29uZmlnX2Jsb2NrX3NpemUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpkYXRhKTsKKy8qCisgKiBQQ0kgQkFSMiBSZWdpc3RlciBtYXAgKGRldnByaXYtPm1taW8pCisgKi8KKyNkZWZpbmUgRklSTVdBUkVfUkVWX1JFRwkJCTB4MDAKKyNkZWZpbmUgRkVBVFVSRVNfUkVHX1BSRVNFTlRfQklUCQkoMSA8PCAxNSkKKyNkZWZpbmUgQk9BUkRfQ09OVFJPTF9SRUcJCQkweDA0CisjZGVmaW5lIEJPQVJEX1JFU0VUX0JJVAkJCQkoMSA8PCAwKQorI2RlZmluZSBUWF9GSUZPX1JFU0VUX0JJVAkJCSgxIDw8IDEpCisjZGVmaW5lIFJYX0ZJRk9fUkVTRVRfQklUCQkJKDEgPDwgMikKKyNkZWZpbmUgVFhfRU5BQkxFX0JJVAkJCQkoMSA8PCA0KQorI2RlZmluZSBSWF9FTkFCTEVfQklUCQkJCSgxIDw8IDUpCisjZGVmaW5lIERFTUFORF9ETUFfRElSRUNUSU9OX1RYX0JJVAkJKDEgPDwgNikgIC8qIGNoIDAgb25seSAqLworI2RlZmluZSBMSU5FX1ZBTElEX09OX1NUQVRVU19WQUxJRF9CSVQJCSgxIDw8IDcpCisjZGVmaW5lIFNUQVJUX1RYX0JJVAkJCQkoMSA8PCA4KQorI2RlZmluZSBDQUJMRV9USFJPVFRMRV9FTkFCTEVfQklUCQkoMSA8PCA5KQorI2RlZmluZSBURVNUX01PREVfRU5BQkxFX0JJVAkJCSgxIDw8IDMxKQorI2RlZmluZSBCT0FSRF9TVEFUVVNfUkVHCQkJMHgwOAorI2RlZmluZSBDT01NQU5EX0xJTkVfU1RBVFVTX01BU0sJCSgweDdmIDw8IDApCisjZGVmaW5lIFRYX0lOX1BST0dSRVNTX0JJVAkJCSgxIDw8IDcpCisjZGVmaW5lIFRYX05PVF9FTVBUWV9CSVQJCQkoMSA8PCA4KQorI2RlZmluZSBUWF9OT1RfQUxNT1NUX0VNUFRZX0JJVAkJCSgxIDw8IDkpCisjZGVmaW5lIFRYX05PVF9BTE1PU1RfRlVMTF9CSVQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFhfTk9UX0ZVTExfQklUCQkJCSgxIDw8IDExKQorI2RlZmluZSBSWF9OT1RfRU1QVFlfQklUCQkJKDEgPDwgMTIpCisjZGVmaW5lIFJYX05PVF9BTE1PU1RfRU1QVFlfQklUCQkJKDEgPDwgMTMpCisjZGVmaW5lIFJYX05PVF9BTE1PU1RfRlVMTF9CSVQJCQkoMSA8PCAxNCkKKyNkZWZpbmUgUlhfTk9UX0ZVTExfQklUCQkJCSgxIDw8IDE1KQorI2RlZmluZSBCT0FSRF9KVU1QRVIwX0lOU1RBTExFRF9CSVQJCSgxIDw8IDE2KQorI2RlZmluZSBCT0FSRF9KVU1QRVIxX0lOU1RBTExFRF9CSVQJCSgxIDw8IDE3KQorI2RlZmluZSBUWF9PVkVSUlVOX0JJVAkJCQkoMSA8PCAyMSkKKyNkZWZpbmUgUlhfVU5ERVJSVU5fQklUCQkJCSgxIDw8IDIyKQorI2RlZmluZSBSWF9PVkVSUlVOX0JJVAkJCQkoMSA8PCAyMykKKyNkZWZpbmUgVFhfUFJPR19BTE1PU1RfUkVHCQkJMHgwYworI2RlZmluZSBSWF9QUk9HX0FMTU9TVF9SRUcJCQkweDEwCisjZGVmaW5lIEFMTU9TVF9FTVBUWV9CSVRTKHgpCQkJKCgoeCkgJiAweGZmZmYpIDw8IDApCisjZGVmaW5lIEFMTU9TVF9GVUxMX0JJVFMoeCkJCQkoKCh4KSAmIDB4ZmYpIDw8IDE2KQorI2RlZmluZSBGRUFUVVJFU19SRUcJCQkJMHgxNAorI2RlZmluZSBGSUZPX1NJWkVfUFJFU0VOVF9CSVQJCQkoMSA8PCAwKQorI2RlZmluZSBGSUZPX1dPUkRTX1BSRVNFTlRfQklUCQkJKDEgPDwgMSkKKyNkZWZpbmUgTEVWRUxfRURHRV9JTlRFUlJVUFRTX1BSRVNFTlRfQklUCSgxIDw8IDIpCisjZGVmaW5lIEdQSU9fU1VQUE9SVEVEX0JJVAkJCSgxIDw8IDMpCisjZGVmaW5lIFBMWF9ETUFfQ0gxX1NVUFBPUlRFRF9CSVQJCSgxIDw8IDQpCisjZGVmaW5lIE9WRVJSVU5fVU5ERVJSVU5fU1VQUE9SVEVEX0JJVAkJKDEgPDwgNSkKKyNkZWZpbmUgRklGT19SRUcJCQkJMHgxOAorI2RlZmluZSBUWF9TVEFUVVNfQ09VTlRfUkVHCQkJMHgxYworI2RlZmluZSBUWF9MSU5FX1ZBTElEX0NPVU5UX1JFRwkJCTB4MjAsCisjZGVmaW5lIFRYX0xJTkVfSU5WQUxJRF9DT1VOVF9SRUcJCTB4MjQKKyNkZWZpbmUgUlhfU1RBVFVTX0NPVU5UX1JFRwkJCTB4MjgKKyNkZWZpbmUgUlhfTElORV9DT1VOVF9SRUcJCQkweDJjCisjZGVmaW5lIElOVEVSUlVQVF9DT05UUk9MX1JFRwkJCTB4MzAKKyNkZWZpbmUgRlJBTUVfVkFMSURfU1RBUlRfSU5UUgkJCSgxIDw8IDApCisjZGVmaW5lIEZSQU1FX1ZBTElEX0VORF9JTlRSCQkJKDEgPDwgMSkKKyNkZWZpbmUgVFhfRklGT19FTVBUWV9JTlRSCQkJKDEgPDwgOCkKKyNkZWZpbmUgVFhfRklGT19BTE1PU1RfRU1QVFlfSU5UUgkJKDEgPDwgOSkKKyNkZWZpbmUgVFhfRklGT19BTE1PU1RfRlVMTF9JTlRSCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFhfRklGT19GVUxMX0lOVFIJCQkoMSA8PCAxMSkKKyNkZWZpbmUgUlhfRU1QVFlfSU5UUgkJCQkoMSA8PCAxMikKKyNkZWZpbmUgUlhfQUxNT1NUX0VNUFRZX0lOVFIJCQkoMSA8PCAxMykKKyNkZWZpbmUgUlhfQUxNT1NUX0ZVTExfSU5UUgkJCSgxIDw8IDE0KQorI2RlZmluZSBSWF9GVUxMX0lOVFIJCQkJKDEgPDwgMTUpCisjZGVmaW5lIElOVEVSUlVQVF9TVEFUVVNfUkVHCQkJMHgzNAorI2RlZmluZSBUWF9DTE9DS19ESVZJREVSX1JFRwkJCTB4MzgKKyNkZWZpbmUgVFhfRklGT19TSVpFX1JFRwkJCTB4NDAKKyNkZWZpbmUgUlhfRklGT19TSVpFX1JFRwkJCTB4NDQKKyNkZWZpbmUgRklGT19TSVpFX01BU0sJCQkJKDB4ZmZmZmYgPDwgMCkKKyNkZWZpbmUgVFhfRklGT19XT1JEU19SRUcJCQkweDQ4CisjZGVmaW5lIFJYX0ZJRk9fV09SRFNfUkVHCQkJMHg0YworI2RlZmluZSBJTlRFUlJVUFRfRURHRV9MRVZFTF9SRUcJCTB4NTAKKyNkZWZpbmUgSU5URVJSVVBUX1BPTEFSSVRZX1JFRwkJCTB4NTQKIAotI2RlZmluZSBUSU1FUl9CQVNFIDUwCQkvKiAgMjBNSHogbWFzdGVyIGNsb2NrICovCi0jZGVmaW5lIERNQV9CVUZGRVJfU0laRSAweDEwMDAwCi0jZGVmaW5lIE5VTV9ETUFfQlVGRkVSUyA0Ci0jZGVmaW5lIE5VTV9ETUFfREVTQ1JJUFRPUlMgMjU2Ci0KLWVudW0gaHBkaV9yZWdpc3RlcnMgewotCUZJUk1XQVJFX1JFVl9SRUcgPSAweDAsCi0JQk9BUkRfQ09OVFJPTF9SRUcgPSAweDQsCi0JQk9BUkRfU1RBVFVTX1JFRyA9IDB4OCwKLQlUWF9QUk9HX0FMTU9TVF9SRUcgPSAweGMsCi0JUlhfUFJPR19BTE1PU1RfUkVHID0gMHgxMCwKLQlGRUFUVVJFU19SRUcgPSAweDE0LAotCUZJRk9fUkVHID0gMHgxOCwKLQlUWF9TVEFUVVNfQ09VTlRfUkVHID0gMHgxYywKLQlUWF9MSU5FX1ZBTElEX0NPVU5UX1JFRyA9IDB4MjAsCi0JVFhfTElORV9JTlZBTElEX0NPVU5UX1JFRyA9IDB4MjQsCi0JUlhfU1RBVFVTX0NPVU5UX1JFRyA9IDB4MjgsCi0JUlhfTElORV9DT1VOVF9SRUcgPSAweDJjLAotCUlOVEVSUlVQVF9DT05UUk9MX1JFRyA9IDB4MzAsCi0JSU5URVJSVVBUX1NUQVRVU19SRUcgPSAweDM0LAotCVRYX0NMT0NLX0RJVklERVJfUkVHID0gMHgzOCwKLQlUWF9GSUZPX1NJWkVfUkVHID0gMHg0MCwKLQlSWF9GSUZPX1NJWkVfUkVHID0gMHg0NCwKLQlUWF9GSUZPX1dPUkRTX1JFRyA9IDB4NDgsCi0JUlhfRklGT19XT1JEU19SRUcgPSAweDRjLAotCUlOVEVSUlVQVF9FREdFX0xFVkVMX1JFRyA9IDB4NTAsCi0JSU5URVJSVVBUX1BPTEFSSVRZX1JFRyA9IDB4NTQsCi19OwotCi0vKiBiaXQgZGVmaW5pdGlvbnMgKi8KLQotZW51bSBmaXJtd2FyZV9yZXZpc2lvbl9iaXRzIHsKLQlGRUFUVVJFU19SRUdfUFJFU0VOVF9CSVQgPSAweDgwMDAsCi19OwotCi1lbnVtIGJvYXJkX2NvbnRyb2xfYml0cyB7Ci0JQk9BUkRfUkVTRVRfQklUID0gMHgxLAkvKiB3YWl0IDEwdXNlYyBiZWZvcmUgYWNjZXNzaW5nIGZpZm9zICovCi0JVFhfRklGT19SRVNFVF9CSVQgPSAweDIsCi0JUlhfRklGT19SRVNFVF9CSVQgPSAweDQsCi0JVFhfRU5BQkxFX0JJVCA9IDB4MTAsCi0JUlhfRU5BQkxFX0JJVCA9IDB4MjAsCi0JREVNQU5EX0RNQV9ESVJFQ1RJT05fVFhfQklUID0gMHg0MCwKLQkJLyogZm9yIGNoIDAsIGNoIDEgY2FuIG9ubHkgdHJhbnNtaXQgKHdoZW4gcHJlc2VudCkgKi8KLQlMSU5FX1ZBTElEX09OX1NUQVRVU19WQUxJRF9CSVQgPSAweDgwLAotCVNUQVJUX1RYX0JJVCA9IDB4MTAsCi0JQ0FCTEVfVEhST1RUTEVfRU5BQkxFX0JJVCA9IDB4MjAsCi0JVEVTVF9NT0RFX0VOQUJMRV9CSVQgPSAweDgwMDAwMDAwLAotfTsKLQotZW51bSBib2FyZF9zdGF0dXNfYml0cyB7Ci0JQ09NTUFORF9MSU5FX1NUQVRVU19NQVNLID0gMHg3ZiwKLQlUWF9JTl9QUk9HUkVTU19CSVQgPSAweDgwLAotCVRYX05PVF9FTVBUWV9CSVQgPSAweDEwMCwKLQlUWF9OT1RfQUxNT1NUX0VNUFRZX0JJVCA9IDB4MjAwLAotCVRYX05PVF9BTE1PU1RfRlVMTF9CSVQgPSAweDQwMCwKLQlUWF9OT1RfRlVMTF9CSVQgPSAweDgwMCwKLQlSWF9OT1RfRU1QVFlfQklUID0gMHgxMDAwLAotCVJYX05PVF9BTE1PU1RfRU1QVFlfQklUID0gMHgyMDAwLAotCVJYX05PVF9BTE1PU1RfRlVMTF9CSVQgPSAweDQwMDAsCi0JUlhfTk9UX0ZVTExfQklUID0gMHg4MDAwLAotCUJPQVJEX0pVTVBFUjBfSU5TVEFMTEVEX0JJVCA9IDB4MTAwMDAsCi0JQk9BUkRfSlVNUEVSMV9JTlNUQUxMRURfQklUID0gMHgyMDAwMCwKLQlUWF9PVkVSUlVOX0JJVCA9IDB4MjAwMDAwLAotCVJYX1VOREVSUlVOX0JJVCA9IDB4NDAwMDAwLAotCVJYX09WRVJSVU5fQklUID0gMHg4MDAwMDAsCi19OwotCi1zdGF0aWMgdWludDMyX3QgYWxtb3N0X2Z1bGxfYml0cyh1bnNpZ25lZCBpbnQgbnVtX3dvcmRzKQotewotCS8qIFhYWCBuZWVkIHRvIGFkZCBvciBzdWJ0cmFjdCBvbmU/ICovCi0JcmV0dXJuIChudW1fd29yZHMgPDwgMTYpICYgMHhmZjAwMDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBhbG1vc3RfZW1wdHlfYml0cyh1bnNpZ25lZCBpbnQgbnVtX3dvcmRzKQotewotCXJldHVybiBudW1fd29yZHMgJiAweGZmZmY7Ci19Ci0KLWVudW0gZmVhdHVyZXNfYml0cyB7Ci0JRklGT19TSVpFX1BSRVNFTlRfQklUID0gMHgxLAotCUZJRk9fV09SRFNfUFJFU0VOVF9CSVQgPSAweDIsCi0JTEVWRUxfRURHRV9JTlRFUlJVUFRTX1BSRVNFTlRfQklUID0gMHg0LAotCUdQSU9fU1VQUE9SVEVEX0JJVCA9IDB4OCwKLQlQTFhfRE1BX0NIMV9TVVBQT1JURURfQklUID0gMHgxMCwKLQlPVkVSUlVOX1VOREVSUlVOX1NVUFBPUlRFRF9CSVQgPSAweDIwLAotfTsKLQotZW51bSBpbnRlcnJ1cHRfc291cmNlcyB7Ci0JRlJBTUVfVkFMSURfU1RBUlRfSU5UUiA9IDAsCi0JRlJBTUVfVkFMSURfRU5EX0lOVFIgPSAxLAotCVRYX0ZJRk9fRU1QVFlfSU5UUiA9IDgsCi0JVFhfRklGT19BTE1PU1RfRU1QVFlfSU5UUiA9IDksCi0JVFhfRklGT19BTE1PU1RfRlVMTF9JTlRSID0gMTAsCi0JVFhfRklGT19GVUxMX0lOVFIgPSAxMSwKLQlSWF9FTVBUWV9JTlRSID0gMTIsCi0JUlhfQUxNT1NUX0VNUFRZX0lOVFIgPSAxMywKLQlSWF9BTE1PU1RfRlVMTF9JTlRSID0gMTQsCi0JUlhfRlVMTF9JTlRSID0gMTUsCi19OwotCi1zdGF0aWMgdWludDMyX3QgaW50cl9iaXQoaW50IGludGVycnVwdF9zb3VyY2UpCi17Ci0JcmV0dXJuIDB4MSA8PCBpbnRlcnJ1cHRfc291cmNlOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGZpZm9fc2l6ZSh1aW50MzJfdCBmaWZvX3NpemVfYml0cykKLXsKLQlyZXR1cm4gZmlmb19zaXplX2JpdHMgJiAweGZmZmZmOwotfQorI2RlZmluZSBUSU1FUl9CQVNFCQkJCTUwCS8qIDIwTUh6IG1hc3RlciBjbG9jayAqLworI2RlZmluZSBETUFfQlVGRkVSX1NJWkUJCQkJMHgxMDAwMAorI2RlZmluZSBOVU1fRE1BX0JVRkZFUlMJCQkJNAorI2RlZmluZSBOVU1fRE1BX0RFU0NSSVBUT1JTCQkJMjU2CiAKIHN0cnVjdCBocGRpX2JvYXJkIHsKLQljb25zdCBjaGFyICpuYW1lOwkvKiAgYm9hcmQgbmFtZSAqLwotCWludCBkZXZpY2VfaWQ7CQkvKiAgcGNpIGRldmljZSBpZCAqLwotCWludCBzdWJkZXZpY2VfaWQ7CS8qICBwY2kgc3ViZGV2aWNlIGlkICovCisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgZGV2aWNlX2lkOworCWludCBzdWJkZXZpY2VfaWQ7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhwZGlfYm9hcmQgaHBkaV9ib2FyZHNbXSA9IHsKIAl7Ci0JIC5uYW1lID0gInBjaS1ocGRpMzIiLAotCSAuZGV2aWNlX2lkID0gUENJX0RFVklDRV9JRF9QTFhfOTA4MCwKLQkgLnN1YmRldmljZV9pZCA9IDB4MjQwMCwKKwkJLm5hbWUJCT0gInBjaS1ocGRpMzIiLAorCQkuZGV2aWNlX2lkCT0gUENJX0RFVklDRV9JRF9QTFhfOTA4MCwKKwkJLnN1YmRldmljZV9pZAk9IDB4MjQwMCwKIAkgfSwKICNpZiAwCiAJewotCSAubmFtZSA9ICJweGktaHBkaTMyIiwKLQkgLmRldmljZV9pZCA9IDB4OTY1NiwKLQkgLnN1YmRldmljZV9pZCA9IDB4MjcwNSwKKwkJLm5hbWUJCT0gInB4aS1ocGRpMzIiLAorCQkuZGV2aWNlX2lkCT0gMHg5NjU2LAorCQkuc3ViZGV2aWNlX2lkCT0gMHgyNzA1LAogCSB9LAogI2VuZGlmCiB9OwogCiBzdHJ1Y3QgaHBkaV9wcml2YXRlIHsKLQkvKiAgYmFzZSBhZGRyZXNzZXMgKGlvcmVtYXBwZWQpICovCi0Jdm9pZCBfX2lvbWVtICpwbHg5MDgwX2lvYmFzZTsKLQl2b2lkIF9faW9tZW0gKmhwZGlfaW9iYXNlOworCXZvaWQgX19pb21lbSAqcGx4OTA4MF9tbWlvOworCXZvaWQgX19pb21lbSAqbW1pbzsKIAl1aW50MzJfdCAqZGlvX2J1ZmZlcltOVU1fRE1BX0JVRkZFUlNdOwkvKiAgZG1hIGJ1ZmZlcnMgKi8KIAkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgZG1hIGJ1ZmZlcnMgKi8KIAlkbWFfYWRkcl90IGRpb19idWZmZXJfcGh5c19hZGRyW05VTV9ETUFfQlVGRkVSU107CkBAIC0yMDcsMjYgKzE2MSwzMzQgQEAKIAkvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIGJ1ZmZlcnMgaW5kZXhlZCBieSBkZXNjcmlwdG9yICovCiAJdWludDMyX3QgKmRlc2NfZGlvX2J1ZmZlcltOVU1fRE1BX0RFU0NSSVBUT1JTXTsKIAkvKiBpbmRleCBvZiB0aGUgZG1hIGRlc2NyaXB0b3IgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBkbWFfZGVzY19pbmRleDsKKwl1bnNpZ25lZCBpbnQgZG1hX2Rlc2NfaW5kZXg7CiAJdW5zaWduZWQgaW50IHR4X2ZpZm9fc2l6ZTsKIAl1bnNpZ25lZCBpbnQgcnhfZmlmb19zaXplOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGlvX2NvdW50OwotCS8qIHNvZnR3YXJlIGNvcGllcyBvZiB2YWx1ZXMgd3JpdHRlbiB0byBocGRpIHJlZ2lzdGVycyAqLwotCXZvbGF0aWxlIHVpbnQzMl90IGJpdHNbMjRdOworCXVuc2lnbmVkIGxvbmcgZGlvX2NvdW50OwogCS8qIG51bWJlciBvZiBieXRlcyBhdCB3aGljaCB0byBnZW5lcmF0ZSBDT01FRElfQ0JfQkxPQ0sgZXZlbnRzICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CisJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CiB9OwogCi1zdGF0aWMgaW50IGRpb19jb25maWdfaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBnc2NfaHBkaV9kcmFpbl9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBpZHg7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBkZXNjOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBuZXh0OworCisJaWYgKGNoYW5uZWwpCisJCW5leHQgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMV9QQ0lfQUREUkVTU19SRUcpOworCWVsc2UKKwkJbmV4dCA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX1BDSV9BRERSRVNTX1JFRyk7CisKKwlpZHggPSBkZXZwcml2LT5kbWFfZGVzY19pbmRleDsKKwlzdGFydCA9IGxlMzJfdG9fY3B1KGRldnByaXYtPmRtYV9kZXNjW2lkeF0ucGNpX3N0YXJ0X2FkZHIpOworCS8qIGxvb3AgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCB0aGUgZnVsbCBidWZmZXJzICovCisJZm9yIChkZXNjID0gMDsgKG5leHQgPCBzdGFydCB8fCBuZXh0ID49IHN0YXJ0ICsgZGV2cHJpdi0+YmxvY2tfc2l6ZSkgJiYKKwkgICAgIGRlc2MgPCBkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzOyBkZXNjKyspIHsKKwkJLyogdHJhbnNmZXIgZGF0YSBmcm9tIGRtYSBidWZmZXIgdG8gY29tZWRpIGJ1ZmZlciAqLworCQlzaXplID0gZGV2cHJpdi0+YmxvY2tfc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7CisJCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJCWlmIChzaXplID4gZGV2cHJpdi0+ZGlvX2NvdW50KQorCQkJCXNpemUgPSBkZXZwcml2LT5kaW9fY291bnQ7CisJCQlkZXZwcml2LT5kaW9fY291bnQgLT0gc2l6ZTsKKwkJfQorCQljZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsIGRldnByaXYtPmRlc2NfZGlvX2J1ZmZlcltpZHhdLAorCQkJCQkgIHNpemUgKiBzaXplb2YodWludDMyX3QpKTsKKwkJaWR4Kys7CisJCWlkeCAlPSBkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzOworCQlzdGFydCA9IGxlMzJfdG9fY3B1KGRldnByaXYtPmRtYV9kZXNjW2lkeF0ucGNpX3N0YXJ0X2FkZHIpOworCisJCWRldnByaXYtPmRtYV9kZXNjX2luZGV4ID0gaWR4OworCX0KKwkvKiAgWFhYIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1biBzb21laG93ICovCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBnc2NfaHBkaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKK3sKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKKwlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCXVpbnQzMl90IGhwZGlfaW50cl9zdGF0dXMsIGhwZGlfYm9hcmRfc3RhdHVzOworCXVpbnQzMl90IHBseF9zdGF0dXM7CisJdWludDMyX3QgcGx4X2JpdHM7CisJdWludDhfdCBkbWEwX3N0YXR1cywgZG1hMV9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJcGx4X3N0YXR1cyA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9JTlRSQ1NfUkVHKTsKKwlpZiAoKHBseF9zdGF0dXMgJiAoSUNTX0RNQTBfQSB8IElDU19ETUExX0EgfCBJQ1NfTElBKSkgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaHBkaV9pbnRyX3N0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBJTlRFUlJVUFRfU1RBVFVTX1JFRyk7CisJaHBkaV9ib2FyZF9zdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgQk9BUkRfU1RBVFVTX1JFRyk7CisKKwlpZiAoaHBkaV9pbnRyX3N0YXR1cykKKwkJd3JpdGVsKGhwZGlfaW50cl9zdGF0dXMsIGRldnByaXYtPm1taW8gKyBJTlRFUlJVUFRfU1RBVFVTX1JFRyk7CisKKwkvKiAgc3BpbiBsb2NrIG1ha2VzIHN1cmUgbm8gb25lIGVsc2UgY2hhbmdlcyBwbHggZG1hIGNvbnRyb2wgcmVnICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlkbWEwX3N0YXR1cyA9IHJlYWRiKGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0NTX1JFRyk7CisJaWYgKHBseF9zdGF0dXMgJiBJQ1NfRE1BMF9BKSB7CS8qICBkbWEgY2hhbiAwIGludGVycnVwdCAqLworCQl3cml0ZWIoKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKKwkJICAgICAgIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0NTX1JFRyk7CisKKwkJaWYgKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpCisJCQlnc2NfaHBkaV9kcmFpbl9kbWEoZGV2LCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogIHNwaW4gbG9jayBtYWtlcyBzdXJlIG5vIG9uZSBlbHNlIGNoYW5nZXMgcGx4IGRtYSBjb250cm9sIHJlZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisJZG1hMV9zdGF0dXMgPSByZWFkYihkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMV9DU19SRUcpOworCWlmIChwbHhfc3RhdHVzICYgSUNTX0RNQTFfQSkgewkvKiAgWFhYICovLyogIGRtYSBjaGFuIDEgaW50ZXJydXB0ICovCisJCXdyaXRlYigoZG1hMV9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkgfCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklULAorCQkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RNQTFfQ1NfUkVHKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogIGNsZWFyIHBvc3NpYmxlIHBseDkwODAgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlpZiAocGx4X3N0YXR1cyAmIElDU19MRElBKSB7CS8qICBjbGVhciBsb2NhbCBkb29yYmVsbCBpbnRlcnJ1cHQgKi8KKwkJcGx4X2JpdHMgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfREJSX09VVF9SRUcpOworCQl3cml0ZWwocGx4X2JpdHMsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9EQlJfT1VUX1JFRyk7CisJfQorCisJaWYgKGhwZGlfYm9hcmRfc3RhdHVzICYgUlhfT1ZFUlJVTl9CSVQpIHsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInJ4IGZpZm8gb3ZlcnJ1blxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwl9CisKKwlpZiAoaHBkaV9ib2FyZF9zdGF0dXMgJiBSWF9VTkRFUlJVTl9CSVQpIHsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInJ4IGZpZm8gdW5kZXJydW5cbiIpOworCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7CisJfQorCisJaWYgKGRldnByaXYtPmRpb19jb3VudCA9PSAwKQorCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBnc2NfaHBkaV9hYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlwbHg5MDgwX2Fib3J0X2RtYShkZXZwcml2LT5wbHg5MDgwX21taW8sIGNoYW5uZWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGdzY19ocGRpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKworCXdyaXRlbCgwLCBkZXZwcml2LT5tbWlvICsgQk9BUkRfQ09OVFJPTF9SRUcpOworCXdyaXRlbCgwLCBkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKKworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NjX2hwZGlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZhc3luYy0+Y21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgYml0czsKKworCWlmIChzLT5pb19iaXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlbChSWF9GSUZPX1JFU0VUX0JJVCwgZGV2cHJpdi0+bW1pbyArIEJPQVJEX0NPTlRST0xfUkVHKTsKKworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDApOworCisJZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXggPSAwOworCisJLyoKKwkgKiBUaGVzZSByZWdpc3RlciBhcmUgc3VwcG9zZWRseSB1bnVzZWQgZHVyaW5nIGNoYWluZWQgZG1hLAorCSAqIGJ1dCBJIGhhdmUgZm91bmQgdGhhdCBsZWZ0IG92ZXIgdmFsdWVzIGZyb20gbGFzdCBvcGVyYXRpb24KKwkgKiBvY2Nhc2lvbmFsbHkgY2F1c2UgcHJvYmxlbXMgd2l0aCB0cmFuc2ZlciBvZiBmaXJzdCBkbWEKKwkgKiBibG9jay4gIEluaXRpYWxpemluZyB0aGVtIHRvIHplcm8gc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtLgorCSAqLworCXdyaXRlbCgwLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfRE1BMF9UUkFOU0ZFUl9TSVpFX1JFRyk7CisJd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX1BDSV9BRERSRVNTX1JFRyk7CisJd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0xPQ0FMX0FERFJFU1NfUkVHKTsKKworCS8qIGdpdmUgbG9jYXRpb24gb2YgZmlyc3QgZG1hIGRlc2NyaXB0b3IgKi8KKwliaXRzID0gZGV2cHJpdi0+ZG1hX2Rlc2NfcGh5c19hZGRyIHwgUExYX0RFU0NfSU5fUENJX0JJVCB8CisJICAgICAgIFBMWF9JTlRSX1RFUk1fQ09VTlQgfCBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7CisJd3JpdGVsKGJpdHMsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHKTsKKworCS8qIGVuYWJsZSBkbWEgdHJhbnNmZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCXdyaXRlYihQTFhfRE1BX0VOX0JJVCB8IFBMWF9ETUFfU1RBUlRfQklUIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKKwkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0RNQTBfQ1NfUkVHKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQorCQlkZXZwcml2LT5kaW9fY291bnQgPSBjbWQtPnN0b3BfYXJnOworCWVsc2UKKwkJZGV2cHJpdi0+ZGlvX2NvdW50ID0gMTsKKworCS8qIGNsZWFyIG92ZXIvdW5kZXIgcnVuIHN0YXR1cyBmbGFncyAqLworCXdyaXRlbChSWF9VTkRFUlJVTl9CSVQgfCBSWF9PVkVSUlVOX0JJVCwKKwkgICAgICAgZGV2cHJpdi0+bW1pbyArIEJPQVJEX1NUQVRVU19SRUcpOworCisJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoUlhfRlVMTF9JTlRSLCBkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKKworCXdyaXRlbChSWF9FTkFCTEVfQklULCBkZXZwcml2LT5tbWlvICsgQk9BUkRfQ09OVFJPTF9SRUcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NjX2hwZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCit7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlpZiAocy0+aW9fYml0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCisKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCisKKwllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCisJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCWlmICghY21kLT5jaGFubGlzdF9sZW4gfHwgIWNtZC0+Y2hhbmxpc3QpIHsKKwkJY21kLT5jaGFubGlzdF9sZW4gPSAzMjsKKwkJZXJyIHw9IC1FSU5WQUw7CisJfQorCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQorCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJZWxzZQkvKiBUUklHX05PTkUgKi8KKwkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCWlmIChlcnIpCisJCXJldHVybiA0OworCisJLyogc3RlcCA1OiBjb21wbGFpbiBhYm91dCBzcGVjaWFsIGNoYW5saXN0IGNvbnNpZGVyYXRpb25zICovCisKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSAhPSBpKSB7CisJCQkvKiAgWFhYIGNvdWxkIHN1cHBvcnQgOCBvciAxNiBjaGFubmVscyAqLworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKKwkJCQkiY2hhbmxpc3QgbXVzdCBiZSBjaCAwIHRvIDMxIGluIG9yZGVyIik7CisJCQllcnIgfD0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDU7CisKKwlyZXR1cm4gMDsKKworfQorCisvKiBzZXR1cCBkbWEgZGVzY3JpcHRvcnMgc28gYSBsaW5rIGNvbXBsZXRlcyBldmVyeSAnbGVuJyBieXRlcyAqLworc3RhdGljIGludCBnc2NfaHBkaV9zZXR1cF9kbWFfZGVzY3JpcHRvcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHIgPSBkZXZwcml2LT5kbWFfZGVzY19waHlzX2FkZHI7CisJdWludDMyX3QgbmV4dF9iaXRzID0gUExYX0RFU0NfSU5fUENJX0JJVCB8IFBMWF9JTlRSX1RFUk1fQ09VTlQgfAorCQkJICAgICBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJdW5zaWduZWQgaW50IGlkeCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAobGVuID4gRE1BX0JVRkZFUl9TSVpFKQorCQlsZW4gPSBETUFfQlVGRkVSX1NJWkU7CisJbGVuIC09IGxlbiAlIHNpemVvZih1aW50MzJfdCk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BX0RFU0NSSVBUT1JTICYmIGlkeCA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7CisJCWRldnByaXYtPmRtYV9kZXNjW2ldLnBjaV9zdGFydF9hZGRyID0KKwkJICAgIGNwdV90b19sZTMyKGRldnByaXYtPmRpb19idWZmZXJfcGh5c19hZGRyW2lkeF0gKyBvZmZzZXQpOworCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5sb2NhbF9zdGFydF9hZGRyID0gY3B1X3RvX2xlMzIoRklGT19SRUcpOworCQlkZXZwcml2LT5kbWFfZGVzY1tpXS50cmFuc2Zlcl9zaXplID0gY3B1X3RvX2xlMzIobGVuKTsKKwkJZGV2cHJpdi0+ZG1hX2Rlc2NbaV0ubmV4dCA9IGNwdV90b19sZTMyKChwaHlzX2FkZHIgKworCQkJKGkgKyAxKSAqIHNpemVvZihkZXZwcml2LT5kbWFfZGVzY1swXSkpIHwgbmV4dF9iaXRzKTsKKworCQlkZXZwcml2LT5kZXNjX2Rpb19idWZmZXJbaV0gPSBkZXZwcml2LT5kaW9fYnVmZmVyW2lkeF0gKworCQkJCQkgICAgICAob2Zmc2V0IC8gc2l6ZW9mKHVpbnQzMl90KSk7CisKKwkJb2Zmc2V0ICs9IGxlbjsKKwkJaWYgKGxlbiArIG9mZnNldCA+IERNQV9CVUZGRVJfU0laRSkgeworCQkJb2Zmc2V0ID0gMDsKKwkJCWlkeCsrOworCQl9CisJfQorCWRldnByaXYtPm51bV9kbWFfZGVzY3JpcHRvcnMgPSBpOworCS8qIGZpeCBsYXN0IGRlc2NyaXB0b3IgdG8gcG9pbnQgYmFjayB0byBmaXJzdCAqLworCWRldnByaXYtPmRtYV9kZXNjW2kgLSAxXS5uZXh0ID0gY3B1X3RvX2xlMzIocGh5c19hZGRyIHwgbmV4dF9iaXRzKTsKKworCWRldnByaXYtPmJsb2NrX3NpemUgPSBsZW47CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGdzY19ocGRpX2Rpb19pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJaW50IHJldDsKIAogCXN3aXRjaCAoZGF0YVswXSkgewogCWNhc2UgSU5TTl9DT05GSUdfQkxPQ0tfU0laRToKLQkJcmV0dXJuIGRpb19jb25maWdfYmxvY2tfc2l6ZShkZXYsIGRhdGEpOworCQlyZXQgPSBnc2NfaHBkaV9zZXR1cF9kbWFfZGVzY3JpcHRvcnMoZGV2LCBkYXRhWzFdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZGF0YVsxXSA9IHJldDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gY29tZWRpX2Rpb19pbnNuX2NvbmZpZyhkZXYsIHMsIGluc24sIGRhdGEsIDB4ZmZmZmZmZmYpOwogCQlpZiAocmV0KQpAQCAtMjM3LDMxICs0OTksNTMgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIHZvaWQgZGlzYWJsZV9wbHhfaW50ZXJydXB0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBnc2NfaHBkaV9pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1aW50MzJfdCBwbHhfaW50Y3NyX2JpdHM7CiAKLQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfSU5UUkNTX1JFRyk7CisJLyogd2FpdCAxMHVzZWMgYWZ0ZXIgcmVzZXQgYmVmb3JlIGFjY2Vzc2luZyBmaWZvcyAqLworCXdyaXRlbChCT0FSRF9SRVNFVF9CSVQsIGRldnByaXYtPm1taW8gKyBCT0FSRF9DT05UUk9MX1JFRyk7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlbChBTE1PU1RfRU1QVFlfQklUUygzMikgfCBBTE1PU1RfRlVMTF9CSVRTKDMyKSwKKwkgICAgICAgZGV2cHJpdi0+bW1pbyArIFJYX1BST0dfQUxNT1NUX1JFRyk7CisJd3JpdGVsKEFMTU9TVF9FTVBUWV9CSVRTKDMyKSB8IEFMTU9TVF9GVUxMX0JJVFMoMzIpLAorCSAgICAgICBkZXZwcml2LT5tbWlvICsgVFhfUFJPR19BTE1PU1RfUkVHKTsKKworCWRldnByaXYtPnR4X2ZpZm9fc2l6ZSA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBUWF9GSUZPX1NJWkVfUkVHKSAmCisJCQkJRklGT19TSVpFX01BU0s7CisJZGV2cHJpdi0+cnhfZmlmb19zaXplID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIFJYX0ZJRk9fU0laRV9SRUcpICYKKwkJCQlGSUZPX1NJWkVfTUFTSzsKKworCXdyaXRlbCgwLCBkZXZwcml2LT5tbWlvICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKKworCS8qICBlbmFibGUgaW50ZXJydXB0cyAqLworCXBseF9pbnRjc3JfYml0cyA9CisJICAgIElDU19BRVJSIHwgSUNTX1BFUlIgfCBJQ1NfUElFIHwgSUNTX1BMSUUgfCBJQ1NfUEFJRSB8IElDU19MSUUgfAorCSAgICBJQ1NfRE1BMF9FOworCXdyaXRlbChwbHhfaW50Y3NyX2JpdHMsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9JTlRSQ1NfUkVHKTsKKworCXJldHVybiAwOwogfQogCi0vKiBpbml0aWFsaXplIHBseDkwODAgY2hpcCAqLwotc3RhdGljIHZvaWQgaW5pdF9wbHg5MDgwKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBnc2NfaHBkaV9pbml0X3BseDkwODAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVpbnQzMl90IGJpdHM7Ci0Jdm9pZCBfX2lvbWVtICpwbHhfaW9iYXNlID0gZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwbHhfaW9iYXNlID0gZGV2cHJpdi0+cGx4OTA4MF9tbWlvOwogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAJYml0cyA9IEJJR0VORF9ETUEwIHwgQklHRU5EX0RNQTE7CiAjZWxzZQogCWJpdHMgPSAwOwogI2VuZGlmCi0Jd3JpdGVsKGJpdHMsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0JJR0VORF9SRUcpOworCXdyaXRlbChiaXRzLCBkZXZwcml2LT5wbHg5MDgwX21taW8gKyBQTFhfQklHRU5EX1JFRyk7CiAKLQlkaXNhYmxlX3BseF9pbnRlcnJ1cHRzKGRldik7CisJd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfbW1pbyArIFBMWF9JTlRSQ1NfUkVHKTsKIAotCWFib3J0X2RtYShkZXYsIDApOwotCWFib3J0X2RtYShkZXYsIDEpOworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDApOworCWdzY19ocGRpX2Fib3J0X2RtYShkZXYsIDEpOwogCiAJLyogIGNvbmZpZ3VyZSBkbWEwIG1vZGUgKi8KIAliaXRzID0gMDsKQEAgLTI4NSwxMTcgKzU2OSw3IEBACiAJd3JpdGVsKGJpdHMsIHBseF9pb2Jhc2UgKyBQTFhfRE1BMF9NT0RFX1JFRyk7CiB9CiAKLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlcy4KLSAqLwotc3RhdGljIGludCBzZXR1cF9zdWJkZXZpY2VzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0JaW50IHJldDsKLQotCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCS8qIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KLQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKLS8qCWRldi0+d3JpdGVfc3ViZGV2ID0gczsgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOwotCXMtPnN1YmRldl9mbGFncyA9Ci0JICAgIFNERl9SRUFEQUJMRSB8IFNERl9XUklURUFCTEUgfCBTREZfTFNBTVBMIHwgU0RGX0NNRF9SRUFEOwotCXMtPm5fY2hhbiA9IDMyOwotCXMtPmxlbl9jaGFubGlzdCA9IDMyOwotCXMtPm1heGRhdGEgPSAxOwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7Ci0Jcy0+aW5zbl9jb25maWcgPSBkaW9fY29uZmlnX2luc247Ci0Jcy0+ZG9fY21kID0gaHBkaV9jbWQ7Ci0Jcy0+ZG9fY21kdGVzdCA9IGhwZGlfY21kX3Rlc3Q7Ci0Jcy0+Y2FuY2VsID0gaHBkaV9jYW5jZWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbml0X2hwZGkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVpbnQzMl90IHBseF9pbnRjc3JfYml0czsKLQotCXdyaXRlbChCT0FSRF9SRVNFVF9CSVQsIGRldnByaXYtPmhwZGlfaW9iYXNlICsgQk9BUkRfQ09OVFJPTF9SRUcpOwotCXVkZWxheSgxMCk7Ci0KLQl3cml0ZWwoYWxtb3N0X2VtcHR5X2JpdHMoMzIpIHwgYWxtb3N0X2Z1bGxfYml0cygzMiksCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgUlhfUFJPR19BTE1PU1RfUkVHKTsKLQl3cml0ZWwoYWxtb3N0X2VtcHR5X2JpdHMoMzIpIHwgYWxtb3N0X2Z1bGxfYml0cygzMiksCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgVFhfUFJPR19BTE1PU1RfUkVHKTsKLQotCWRldnByaXYtPnR4X2ZpZm9fc2l6ZSA9IGZpZm9fc2l6ZShyZWFkbChkZXZwcml2LT5ocGRpX2lvYmFzZSArCi0JCQkJCQkgIFRYX0ZJRk9fU0laRV9SRUcpKTsKLQlkZXZwcml2LT5yeF9maWZvX3NpemUgPSBmaWZvX3NpemUocmVhZGwoZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKwotCQkJCQkJICBSWF9GSUZPX1NJWkVfUkVHKSk7Ci0KLQl3cml0ZWwoMCwgZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBJTlRFUlJVUFRfQ09OVFJPTF9SRUcpOwotCi0JLyogIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JcGx4X2ludGNzcl9iaXRzID0KLQkgICAgSUNTX0FFUlIgfCBJQ1NfUEVSUiB8IElDU19QSUUgfCBJQ1NfUExJRSB8IElDU19QQUlFIHwgSUNTX0xJRSB8Ci0JICAgIElDU19ETUEwX0U7Ci0Jd3JpdGVsKHBseF9pbnRjc3JfYml0cywgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfSU5UUkNTX1JFRyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogc2V0dXAgZG1hIGRlc2NyaXB0b3JzIHNvIGEgbGluayBjb21wbGV0ZXMgZXZlcnkgJ3RyYW5zZmVyX3NpemUnIGJ5dGVzICovCi1zdGF0aWMgaW50IHNldHVwX2RtYV9kZXNjcmlwdG9ycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfc2l6ZSkKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBidWZmZXJfaW5kZXgsIGJ1ZmZlcl9vZmZzZXQ7Ci0JdWludDMyX3QgbmV4dF9iaXRzID0gUExYX0RFU0NfSU5fUENJX0JJVCB8IFBMWF9JTlRSX1RFUk1fQ09VTlQgfAotCSAgICBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAodHJhbnNmZXJfc2l6ZSA+IERNQV9CVUZGRVJfU0laRSkKLQkJdHJhbnNmZXJfc2l6ZSA9IERNQV9CVUZGRVJfU0laRTsKLQl0cmFuc2Zlcl9zaXplIC09IHRyYW5zZmVyX3NpemUgJSBzaXplb2YodWludDMyX3QpOwotCWlmICh0cmFuc2Zlcl9zaXplID09IDApCi0JCXJldHVybiAtMTsKLQotCWJ1ZmZlcl9vZmZzZXQgPSAwOwotCWJ1ZmZlcl9pbmRleCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9ETUFfREVTQ1JJUFRPUlMgJiYKLQkgICAgIGJ1ZmZlcl9pbmRleCA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7Ci0JCWRldnByaXYtPmRtYV9kZXNjW2ldLnBjaV9zdGFydF9hZGRyID0KLQkJICAgIGNwdV90b19sZTMyKGRldnByaXYtPmRpb19idWZmZXJfcGh5c19hZGRyW2J1ZmZlcl9pbmRleF0gKwotCQkJCWJ1ZmZlcl9vZmZzZXQpOwotCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5sb2NhbF9zdGFydF9hZGRyID0gY3B1X3RvX2xlMzIoRklGT19SRUcpOwotCQlkZXZwcml2LT5kbWFfZGVzY1tpXS50cmFuc2Zlcl9zaXplID0KLQkJICAgIGNwdV90b19sZTMyKHRyYW5zZmVyX3NpemUpOwotCQlkZXZwcml2LT5kbWFfZGVzY1tpXS5uZXh0ID0KLQkJICAgIGNwdV90b19sZTMyKChkZXZwcml2LT5kbWFfZGVzY19waHlzX2FkZHIgKyAoaSArCi0JCQkJCQkJCSAgMSkgKgotCQkJCSBzaXplb2YoZGV2cHJpdi0+ZG1hX2Rlc2NbMF0pKSB8IG5leHRfYml0cyk7Ci0KLQkJZGV2cHJpdi0+ZGVzY19kaW9fYnVmZmVyW2ldID0KLQkJICAgIGRldnByaXYtPmRpb19idWZmZXJbYnVmZmVyX2luZGV4XSArCi0JCSAgICAoYnVmZmVyX29mZnNldCAvIHNpemVvZih1aW50MzJfdCkpOwotCi0JCWJ1ZmZlcl9vZmZzZXQgKz0gdHJhbnNmZXJfc2l6ZTsKLQkJaWYgKHRyYW5zZmVyX3NpemUgKyBidWZmZXJfb2Zmc2V0ID4gRE1BX0JVRkZFUl9TSVpFKSB7Ci0JCQlidWZmZXJfb2Zmc2V0ID0gMDsKLQkJCWJ1ZmZlcl9pbmRleCsrOwotCQl9Ci0JfQotCWRldnByaXYtPm51bV9kbWFfZGVzY3JpcHRvcnMgPSBpOwotCS8qICBmaXggbGFzdCBkZXNjcmlwdG9yIHRvIHBvaW50IGJhY2sgdG8gZmlyc3QgKi8KLQlkZXZwcml2LT5kbWFfZGVzY1tpIC0gMV0ubmV4dCA9Ci0JICAgIGNwdV90b19sZTMyKGRldnByaXYtPmRtYV9kZXNjX3BoeXNfYWRkciB8IG5leHRfYml0cyk7Ci0KLQlkZXZwcml2LT5ibG9ja19zaXplID0gdHJhbnNmZXJfc2l6ZTsKLQotCXJldHVybiB0cmFuc2Zlcl9zaXplOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhwZGlfYm9hcmQgKmhwZGlfZmluZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQorc3RhdGljIGNvbnN0IHN0cnVjdCBocGRpX2JvYXJkICpnc2NfaHBkaV9maW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTQwNiwxNiArNTgwLDE3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgaHBkaV9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCitzdGF0aWMgaW50IGdzY19ocGRpX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAljb25zdCBzdHJ1Y3QgaHBkaV9ib2FyZCAqdGhpc2JvYXJkOwogCXN0cnVjdCBocGRpX3ByaXZhdGUgKmRldnByaXY7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGk7CiAJaW50IHJldHZhbDsKIAotCXRoaXNib2FyZCA9IGhwZGlfZmluZF9ib2FyZChwY2lkZXYpOworCXRoaXNib2FyZCA9IGdzY19ocGRpX2ZpbmRfYm9hcmQocGNpZGV2KTsKIAlpZiAoIXRoaXNib2FyZCkgewogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiZ3NjX2hwZGk6IHBjaSAlcyBub3Qgc3VwcG9ydGVkXG4iLAogCQkJcGNpX25hbWUocGNpZGV2KSk7CkBAIC00MzMsMTcgKzYwOCwxNyBAQAogCQlyZXR1cm4gcmV0dmFsOwogCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CiAKLQlkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwY2lkZXYsIDApOwotCWRldnByaXYtPmhwZGlfaW9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMik7Ci0JaWYgKCFkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSB8fCAhZGV2cHJpdi0+aHBkaV9pb2Jhc2UpIHsKKwlkZXZwcml2LT5wbHg5MDgwX21taW8gPSBwY2lfaW9yZW1hcF9iYXIocGNpZGV2LCAwKTsKKwlkZXZwcml2LT5tbWlvID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMik7CisJaWYgKCFkZXZwcml2LT5wbHg5MDgwX21taW8gfHwgIWRldnByaXYtPm1taW8pIHsKIAkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsICJmYWlsZWQgdG8gcmVtYXAgaW8gbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaW5pdF9wbHg5MDgwKGRldik7CisJZ3NjX2hwZGlfaW5pdF9wbHg5MDgwKGRldik7CiAKIAkvKiAgZ2V0IGlycSAqLwotCWlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgaGFuZGxlX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJaWYgKHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBnc2NfaHBkaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYpKSB7CiAJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAogCQkJICJ1bmFibGUgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBwY2lkZXYtPmlycSk7CkBAIC00NzAsMTggKzY0NSwzMyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlyZXR2YWwgPSBzZXR1cF9kbWFfZGVzY3JpcHRvcnMoZGV2LCAweDEwMDApOworCXJldHZhbCA9IGdzY19ocGRpX3NldHVwX2RtYV9kZXNjcmlwdG9ycyhkZXYsIDB4MTAwMCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CiAKLQlyZXR2YWwgPSBzZXR1cF9zdWJkZXZpY2VzKGRldik7Ci0JaWYgKHJldHZhbCA8IDApCisJcmV0dmFsID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKKwlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcmV0dXJuIGluaXRfaHBkaShkZXYpOworCS8qIERpZ2l0YWwgSS9PIHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRSB8IFNERl9XUklURUFCTEUgfCBTREZfTFNBTVBMIHwKKwkJCSAgU0RGX0NNRF9SRUFEOworCXMtPm5fY2hhbgk9IDMyOworCXMtPmxlbl9jaGFubGlzdAk9IDMyOworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9jb25maWcJPSBnc2NfaHBkaV9kaW9faW5zbl9jb25maWc7CisJcy0+ZG9fY21kCT0gZ3NjX2hwZGlfY21kOworCXMtPmRvX2NtZHRlc3QJPSBnc2NfaHBkaV9jbWRfdGVzdDsKKwlzLT5jYW5jZWwJPSBnc2NfaHBkaV9jYW5jZWw7CisKKwlyZXR1cm4gZ3NjX2hwZGlfaW5pdChkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBocGRpX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZ3NjX2hwZGlfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTQ5MCwxMiArNjgwLDEyIEBACiAJaWYgKGRldi0+aXJxKQogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAlpZiAoZGV2cHJpdikgewotCQlpZiAoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UpIHsKLQkJCWRpc2FibGVfcGx4X2ludGVycnVwdHMoZGV2KTsKLQkJCWlvdW5tYXAoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UpOworCQlpZiAoZGV2cHJpdi0+cGx4OTA4MF9tbWlvKSB7CisJCQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9tbWlvICsgUExYX0lOVFJDU19SRUcpOworCQkJaW91bm1hcChkZXZwcml2LT5wbHg5MDgwX21taW8pOwogCQl9Ci0JCWlmIChkZXZwcml2LT5ocGRpX2lvYmFzZSkKLQkJCWlvdW5tYXAoZGV2cHJpdi0+aHBkaV9pb2Jhc2UpOworCQlpZiAoZGV2cHJpdi0+bW1pbykKKwkJCWlvdW5tYXAoZGV2cHJpdi0+bW1pbyk7CiAJCS8qICBmcmVlIHBjaSBkbWEgYnVmZmVycyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0RNQV9CVUZGRVJTOyBpKyspIHsKIAkJCWlmIChkZXZwcml2LT5kaW9fYnVmZmVyW2ldKQpAQCAtNTE2LDMxOCArNzA2LDExIEBACiAJY29tZWRpX3BjaV9kaXNhYmxlKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgZGlvX2NvbmZpZ19ibG9ja19zaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVxdWVzdGVkX2Jsb2NrX3NpemU7Ci0JaW50IHJldHZhbDsKLQotCXJlcXVlc3RlZF9ibG9ja19zaXplID0gZGF0YVsxXTsKLQotCXJldHZhbCA9IHNldHVwX2RtYV9kZXNjcmlwdG9ycyhkZXYsIHJlcXVlc3RlZF9ibG9ja19zaXplKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCWRhdGFbMV0gPSByZXR2YWw7Ci0KLQlyZXR1cm4gMjsKLX0KLQotc3RhdGljIGludCBkaV9jbWRfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJICAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCi17Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7Ci0KLQkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwotCi0JaWYgKGVycikKLQkJcmV0dXJuIDE7Ci0KLQkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCi0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwotCi0JLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCi0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMjsKLQotCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KLQotCWlmICghY21kLT5jaGFubGlzdF9sZW4pIHsKLQkJY21kLT5jaGFubGlzdF9sZW4gPSAzMjsKLQkJZXJyIHw9IC1FSU5WQUw7Ci0JfQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0KLQlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKLQljYXNlIFRSSUdfQ09VTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBUUklHX05PTkU6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gMzsKLQotCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KLQotCWlmIChlcnIpCi0JCXJldHVybiA0OwotCi0JaWYgKCFjbWQtPmNoYW5saXN0KQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDE7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7Ci0JCWlmIChDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pICE9IGkpIHsKLQkJCS8qICBYWFggY291bGQgc3VwcG9ydCA4IG9yIDE2IGNoYW5uZWxzICovCi0JCQljb21lZGlfZXJyb3IoZGV2LAotCQkJCSAgICAgImNoYW5saXN0IG11c3QgYmUgY2ggMCB0byAzMSBpbiBvcmRlciIpOwotCQkJZXJyKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChlcnIpCi0JCXJldHVybiA1OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHBkaV9jbWRfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQotewotCWlmIChzLT5pb19iaXRzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllbHNlCi0JCXJldHVybiBkaV9jbWRfdGVzdChkZXYsIHMsIGNtZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBocGRpX3dyaXRlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50MzJfdCBiaXRzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQotCXdyaXRlbChiaXRzIHwgZGV2cHJpdi0+Yml0c1tvZmZzZXQgLyBzaXplb2YodWludDMyX3QpXSwKLQkgICAgICAgZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IGRpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVpbnQzMl90IGJpdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwotCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKLQotCWhwZGlfd3JpdGVsKGRldiwgUlhfRklGT19SRVNFVF9CSVQsIEJPQVJEX0NPTlRST0xfUkVHKTsKLQotCWFib3J0X2RtYShkZXYsIDApOwotCi0JZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXggPSAwOwotCi0JLyogVGhlc2UgcmVnaXN0ZXIgYXJlIHN1cHBvc2VkbHkgdW51c2VkIGR1cmluZyBjaGFpbmVkIGRtYSwKLQkgKiBidXQgSSBoYXZlIGZvdW5kIHRoYXQgbGVmdCBvdmVyIHZhbHVlcyBmcm9tIGxhc3Qgb3BlcmF0aW9uCi0JICogb2NjYXNpb25hbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggdHJhbnNmZXIgb2YgZmlyc3QgZG1hCi0JICogYmxvY2suICBJbml0aWFsaXppbmcgdGhlbSB0byB6ZXJvIHNlZW1zIHRvIGZpeCB0aGUgcHJvYmxlbS4gKi8KLQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMF9UUkFOU0ZFUl9TSVpFX1JFRyk7Ci0Jd3JpdGVsKDAsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfUENJX0FERFJFU1NfUkVHKTsKLQl3cml0ZWwoMCwgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMF9MT0NBTF9BRERSRVNTX1JFRyk7Ci0JLyogIGdpdmUgbG9jYXRpb24gb2YgZmlyc3QgZG1hIGRlc2NyaXB0b3IgKi8KLQliaXRzID0KLQkgICAgZGV2cHJpdi0+ZG1hX2Rlc2NfcGh5c19hZGRyIHwgUExYX0RFU0NfSU5fUENJX0JJVCB8Ci0JICAgIFBMWF9JTlRSX1RFUk1fQ09VTlQgfCBQTFhfWEZFUl9MT0NBTF9UT19QQ0k7Ci0Jd3JpdGVsKGJpdHMsIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfREVTQ1JJUFRPUl9SRUcpOwotCi0JLyogIHNwaW5sb2NrIGZvciBwbHggZG1hIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0JLyogIGVuYWJsZSBkbWEgdHJhbnNmZXIgKi8KLQl3cml0ZWIoUExYX0RNQV9FTl9CSVQgfCBQTFhfRE1BX1NUQVJUX0JJVCB8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQsCi0JICAgICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfQ1NfUkVHKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQlkZXZwcml2LT5kaW9fY291bnQgPSBjbWQtPnN0b3BfYXJnOwotCWVsc2UKLQkJZGV2cHJpdi0+ZGlvX2NvdW50ID0gMTsKLQotCS8qICBjbGVhciBvdmVyL3VuZGVyIHJ1biBzdGF0dXMgZmxhZ3MgKi8KLQl3cml0ZWwoUlhfVU5ERVJSVU5fQklUIHwgUlhfT1ZFUlJVTl9CSVQsCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgQk9BUkRfU1RBVFVTX1JFRyk7Ci0JLyogIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0Jd3JpdGVsKGludHJfYml0KFJYX0ZVTExfSU5UUiksCi0JICAgICAgIGRldnByaXYtPmhwZGlfaW9iYXNlICsgSU5URVJSVVBUX0NPTlRST0xfUkVHKTsKLQotCWhwZGlfd3JpdGVsKGRldiwgUlhfRU5BQkxFX0JJVCwgQk9BUkRfQ09OVFJPTF9SRUcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHBkaV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCi17Ci0JaWYgKHMtPmlvX2JpdHMpCi0JCXJldHVybiAtRUlOVkFMOwotCWVsc2UKLQkJcmV0dXJuIGRpX2NtZChkZXYsIHMpOwotfQotCi1zdGF0aWMgdm9pZCBkcmFpbl9kbWFfYnVmZmVycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gZGV2LT5yZWFkX3N1YmRldi0+YXN5bmM7Ci0JdWludDMyX3QgbmV4dF90cmFuc2Zlcl9hZGRyOwotCWludCBqOwotCWludCBudW1fc2FtcGxlcyA9IDA7Ci0Jdm9pZCBfX2lvbWVtICpwY2lfYWRkcl9yZWc7Ci0KLQlpZiAoY2hhbm5lbCkKLQkJcGNpX2FkZHJfcmVnID0KLQkJICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTFfUENJX0FERFJFU1NfUkVHOwotCWVsc2UKLQkJcGNpX2FkZHJfcmVnID0KLQkJICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfUENJX0FERFJFU1NfUkVHOwotCi0JLyogIGxvb3AgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCB0aGUgZnVsbCBidWZmZXJzICovCi0JaiA9IDA7Ci0JZm9yIChuZXh0X3RyYW5zZmVyX2FkZHIgPSByZWFkbChwY2lfYWRkcl9yZWcpOwotCSAgICAgKG5leHRfdHJhbnNmZXJfYWRkciA8Ci0JICAgICAgbGUzMl90b19jcHUoZGV2cHJpdi0+ZG1hX2Rlc2NbZGV2cHJpdi0+ZG1hX2Rlc2NfaW5kZXhdLgotCQkJICBwY2lfc3RhcnRfYWRkcikKLQkgICAgICB8fCBuZXh0X3RyYW5zZmVyX2FkZHIgPj0KLQkgICAgICBsZTMyX3RvX2NwdShkZXZwcml2LT5kbWFfZGVzY1tkZXZwcml2LT5kbWFfZGVzY19pbmRleF0uCi0JCQkgIHBjaV9zdGFydF9hZGRyKSArIGRldnByaXYtPmJsb2NrX3NpemUpCi0JICAgICAmJiBqIDwgZGV2cHJpdi0+bnVtX2RtYV9kZXNjcmlwdG9yczsgaisrKSB7Ci0JCS8qICB0cmFuc2ZlciBkYXRhIGZyb20gZG1hIGJ1ZmZlciB0byBjb21lZGkgYnVmZmVyICovCi0JCW51bV9zYW1wbGVzID0gZGV2cHJpdi0+YmxvY2tfc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7Ci0JCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKLQkJCWlmIChudW1fc2FtcGxlcyA+IGRldnByaXYtPmRpb19jb3VudCkKLQkJCQludW1fc2FtcGxlcyA9IGRldnByaXYtPmRpb19jb3VudDsKLQkJCWRldnByaXYtPmRpb19jb3VudCAtPSBudW1fc2FtcGxlczsKLQkJfQotCQljZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKGRldi0+cmVhZF9zdWJkZXYsCi0JCQkJCSAgZGV2cHJpdi0+ZGVzY19kaW9fYnVmZmVyW2RldnByaXYtPgotCQkJCQkJCQkgICAgIGRtYV9kZXNjX2luZGV4XSwKLQkJCQkJICBudW1fc2FtcGxlcyAqIHNpemVvZih1aW50MzJfdCkpOwotCQlkZXZwcml2LT5kbWFfZGVzY19pbmRleCsrOwotCQlkZXZwcml2LT5kbWFfZGVzY19pbmRleCAlPSBkZXZwcml2LT5udW1fZG1hX2Rlc2NyaXB0b3JzOwotCX0KLQkvKiAgWFhYIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1biBzb21laG93ICovCi19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IGhwZGlfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0Jc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKLQl1aW50MzJfdCBocGRpX2ludHJfc3RhdHVzLCBocGRpX2JvYXJkX3N0YXR1czsKLQl1aW50MzJfdCBwbHhfc3RhdHVzOwotCXVpbnQzMl90IHBseF9iaXRzOwotCXVpbnQ4X3QgZG1hMF9zdGF0dXMsIGRtYTFfc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWRldi0+YXR0YWNoZWQpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXBseF9zdGF0dXMgPSByZWFkbChkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9JTlRSQ1NfUkVHKTsKLQlpZiAoKHBseF9zdGF0dXMgJiAoSUNTX0RNQTBfQSB8IElDU19ETUExX0EgfCBJQ1NfTElBKSkgPT0gMCkKLQkJcmV0dXJuIElSUV9OT05FOwotCi0JaHBkaV9pbnRyX3N0YXR1cyA9IHJlYWRsKGRldnByaXYtPmhwZGlfaW9iYXNlICsgSU5URVJSVVBUX1NUQVRVU19SRUcpOwotCWhwZGlfYm9hcmRfc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBCT0FSRF9TVEFUVVNfUkVHKTsKLQotCWFzeW5jLT5ldmVudHMgPSAwOwotCi0JaWYgKGhwZGlfaW50cl9zdGF0dXMpIHsKLQkJd3JpdGVsKGhwZGlfaW50cl9zdGF0dXMsCi0JCSAgICAgICBkZXZwcml2LT5ocGRpX2lvYmFzZSArIElOVEVSUlVQVF9TVEFUVVNfUkVHKTsKLQl9Ci0JLyogIHNwaW4gbG9jayBtYWtlcyBzdXJlIG5vIG9uZSBlbHNlIGNoYW5nZXMgcGx4IGRtYSBjb250cm9sIHJlZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0JZG1hMF9zdGF0dXMgPSByZWFkYihkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9ETUEwX0NTX1JFRyk7Ci0JaWYgKHBseF9zdGF0dXMgJiBJQ1NfRE1BMF9BKSB7CS8qICBkbWEgY2hhbiAwIGludGVycnVwdCAqLwotCQl3cml0ZWIoKGRtYTBfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpIHwgUExYX0NMRUFSX0RNQV9JTlRSX0JJVCwKLQkJICAgICAgIGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfQ1NfUkVHKTsKLQotCQlpZiAoZG1hMF9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkKLQkJCWRyYWluX2RtYV9idWZmZXJzKGRldiwgMCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCS8qICBzcGluIGxvY2sgbWFrZXMgc3VyZSBubyBvbmUgZWxzZSBjaGFuZ2VzIHBseCBkbWEgY29udHJvbCByZWcgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwotCWRtYTFfc3RhdHVzID0gcmVhZGIoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMV9DU19SRUcpOwotCWlmIChwbHhfc3RhdHVzICYgSUNTX0RNQTFfQSkgewkvKiAgWFhYICovLyogIGRtYSBjaGFuIDEgaW50ZXJydXB0ICovCi0JCXdyaXRlYigoZG1hMV9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkgfCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklULAotCQkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMV9DU19SRUcpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQkvKiAgY2xlYXIgcG9zc2libGUgcGx4OTA4MCBpbnRlcnJ1cHQgc291cmNlcyAqLwotCWlmIChwbHhfc3RhdHVzICYgSUNTX0xESUEpIHsJLyogIGNsZWFyIGxvY2FsIGRvb3JiZWxsIGludGVycnVwdCAqLwotCQlwbHhfYml0cyA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX0RCUl9PVVRfUkVHKTsKLQkJd3JpdGVsKHBseF9iaXRzLCBkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9EQlJfT1VUX1JFRyk7Ci0JfQotCi0JaWYgKGhwZGlfYm9hcmRfc3RhdHVzICYgUlhfT1ZFUlJVTl9CSVQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgInJ4IGZpZm8gb3ZlcnJ1biIpOwotCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JfQotCi0JaWYgKGhwZGlfYm9hcmRfc3RhdHVzICYgUlhfVU5ERVJSVU5fQklUKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJyeCBmaWZvIHVuZGVycnVuIik7Ci0JCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQl9Ci0KLQlpZiAoZGV2cHJpdi0+ZGlvX2NvdW50ID09IDApCi0JCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQotCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFib3J0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiAgc3BpbmxvY2sgZm9yIHBseCBkbWEgY29udHJvbC9zdGF0dXMgcmVnICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXBseDkwODBfYWJvcnRfZG1hKGRldnByaXYtPnBseDkwODBfaW9iYXNlLCBjaGFubmVsKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBocGRpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlzdHJ1Y3QgaHBkaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCi0JaHBkaV93cml0ZWwoZGV2LCAwLCBCT0FSRF9DT05UUk9MX1JFRyk7Ci0KLQl3cml0ZWwoMCwgZGV2cHJpdi0+aHBkaV9pb2Jhc2UgKyBJTlRFUlJVUFRfQ09OVFJPTF9SRUcpOwotCi0JYWJvcnRfZG1hKGRldiwgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGdzY19ocGRpX2RyaXZlciA9IHsKIAkuZHJpdmVyX25hbWUJPSAiZ3NjX2hwZGkiLAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCi0JLmF1dG9fYXR0YWNoCT0gaHBkaV9hdXRvX2F0dGFjaCwKLQkuZGV0YWNoCQk9IGhwZGlfZGV0YWNoLAorCS5hdXRvX2F0dGFjaAk9IGdzY19ocGRpX2F1dG9fYXR0YWNoLAorCS5kZXRhY2gJCT0gZ3NjX2hwZGlfZGV0YWNoLAogfTsKIAogc3RhdGljIGludCBnc2NfaHBkaV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwppbmRleCA4MDUzOWIyLi4wYjhiMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCkBAIC0xNzEsMTIgKzE3MSwyNyBAQAogCX0KIH0KIAorc3RhdGljIGludCBpY3BfbXVsdGlfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CisJaWYgKChzdGF0dXMgJiBBRENfQlNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGljcF9tdWx0aV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuLCB0aW1lb3V0OworCWludCByZXQgPSAwOworCWludCBuOwogCiAJLyogIERpc2FibGUgQS9EIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCiAJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CkBAIC0xOTksMzMgKzIxNCwxMCBAQAogCQl1ZGVsYXkoMSk7CiAKIAkJLyogIFdhaXQgZm9yIGNvbnZlcnNpb24gdG8gY29tcGxldGUsIG9yIGdldCBmZWQgdXAgd2FpdGluZyAqLwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKLQkJCQkgICAgSUNQX01VTFRJX0FEQ19DU1IpICYgQURDX0JTWSkpCi0JCQkJZ290byBjb252X2ZpbmlzaDsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBpY3BfbXVsdGlfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOwogCi0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQotCQkvKiAgSWYgd2UgcmVhY2ggaGVyZSwgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCAqLwotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIGluc24gdGltZW91dCIpOwotCi0JCS8qICBEaXNhYmxlIGludGVycnVwdCAqLwotCQlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkFEQ19SRUFEWTsKLQkJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOwotCi0JCS8qICBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7Ci0JCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsCi0JCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKLQotCQkvKiAgQ2xlYXIgZGF0YSByZWNlaXZlZCAqLwotCQlkYXRhW25dID0gMDsKLQotCQlyZXR1cm4gLUVUSU1FOwotCi1jb252X2ZpbmlzaDoKIAkJZGF0YVtuXSA9CiAJCSAgICAocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BSSkgPj4gNCkgJiAweDBmZmY7CiAJfQpAQCAtMjM4LDcgKzIzMCwyMSBAQAogCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CiAJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CiAKLQlyZXR1cm4gbjsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKK30KKworc3RhdGljIGludCBpY3BfbXVsdGlfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREFDX0NTUik7CisJaWYgKChzdGF0dXMgJiBEQUNfQlNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0yNDYsNyArMjUyLDggQEAKIAkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG4sIGNoYW4sIHJhbmdlLCB0aW1lb3V0OworCWludCBuLCBjaGFuLCByYW5nZTsKKwlpbnQgcmV0OwogCiAJLyogIERpc2FibGUgRC9BIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCiAJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CkBAIC0yNzQsMzMgKzI4MSwyNCBAQAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJLyogIFdhaXQgZm9yIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyIHRvIGJlCiAJCSAqICByZWFkeSBmb3IgbmV3IGRhdGEsIG9yIGdldCBmZWQgdXAgd2FpdGluZyAqLwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKLQkJCQkgICAgSUNQX01VTFRJX0RBQ19DU1IpICYgREFDX0JTWSkpCi0JCQkJZ290byBkYWNfcmVhZHk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgaWNwX211bHRpX2FvX2VvYywgMCk7CisJCWlmIChyZXQpIHsKKwkJCS8qICBEaXNhYmxlIGludGVycnVwdCAqLworCQkJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CisJCQl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLAorCQkJICAgICAgIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKIAotCQkJdWRlbGF5KDEpOworCQkJLyogIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwkJCWRldnByaXYtPkludFN0YXR1cyB8PSBEQUNfUkVBRFk7CisJCQl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLAorCQkJICAgICAgIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOworCisJCQkvKiAgQ2xlYXIgZGF0YSByZWNlaXZlZCAqLworCQkJZGV2cHJpdi0+YW9fZGF0YVtjaGFuXSA9IDA7CisKKwkJCXJldHVybiByZXQ7CiAJCX0KIAotCQkvKiAgSWYgd2UgcmVhY2ggaGVyZSwgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCAqLwotCQljb21lZGlfZXJyb3IoZGV2LCAiRC9BIGluc24gdGltZW91dCIpOwotCi0JCS8qICBEaXNhYmxlIGludGVycnVwdCAqLwotCQlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkRBQ19SRUFEWTsKLQkJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOwotCi0JCS8qICBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JCWRldnByaXYtPkludFN0YXR1cyB8PSBEQUNfUkVBRFk7Ci0JCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsCi0JCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKLQotCQkvKiAgQ2xlYXIgZGF0YSByZWNlaXZlZCAqLwotCQlkZXZwcml2LT5hb19kYXRhW2NoYW5dID0gMDsKLQotCQlyZXR1cm4gLUVUSU1FOwotCi1kYWNfcmVhZHk6CiAJCS8qICBXcml0ZSBkYXRhIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyICovCiAJCXdyaXRldyhkYXRhW25dLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FPKTsKIApAQCAtNTY1LDkgKzU2Myw2IEBACiAKIAlkZXZwcml2LT52YWxpZCA9IDE7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzIGF0dGFjaGVkLCBpcnEgJXNhYmxlZFxuIiwKLQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYtPmlycSA/ICJlbiIgOiAiZGlzIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKaW5kZXggODU3Nzc3OC4uMzU1OGFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCkBAIC0xOTAsMjAgKzE5MCwxOCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaW50IGlpMjBrX2FpX3dhaXRfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgaWkyMGtfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl2b2lkIF9faW9tZW0gKmlvYmFzZSA9IGlpMjBrX21vZHVsZV9pb2Jhc2UoZGV2LCBzKTsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAotCWRvIHsKLQkJc3RhdHVzID0gcmVhZGIoaW9iYXNlICsgSUkyMEtfQUlfU1RBVFVTX1JFRyk7Ci0JCWlmICgoc3RhdHVzICYgSUkyMEtfQUlfU1RBVFVTX0lOVCkgPT0gMCkKLQkJCXJldHVybiAwOwotCX0gd2hpbGUgKHRpbWVvdXQtLSk7Ci0KLQlyZXR1cm4gLUVUSU1FOworCXN0YXR1cyA9IHJlYWRiKGlvYmFzZSArIElJMjBLX0FJX1NUQVRVU19SRUcpOworCWlmICgoc3RhdHVzICYgSUkyMEtfQUlfU1RBVFVTX0lOVCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIHZvaWQgaWkyMGtfYWlfc2V0dXAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTI2Myw3ICsyNjEsNyBAQAogCQkvKiBnZW5lcmF0ZSBhIHNvZnR3YXJlIHN0YXJ0IGNvbnZlcnQgc2lnbmFsICovCiAJCXJlYWRiKGlvYmFzZSArIElJMjBLX0FJX1BBQ0VSX1JFU0VUX1JFRyk7CiAKLQkJcmV0ID0gaWkyMGtfYWlfd2FpdF9lb2MoZGV2LCBzLCAxMDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGlpMjBrX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwppbmRleCA2MTAwYzEyLi5hOGRiOWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKQEAgLTUxLDIzICs1MSw1NSBAQAogI2luY2x1ZGUgImpyM19wY2kuaCIKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0pSMyAweDE3NjIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfMV9DSEFOTkVMIDB4MzExMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXIDB4MTExMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18yX0NIQU5ORUwgMHgzMTEyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzNfQ0hBTk5FTCAweDMxMTMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfNF9DSEFOTkVMIDB4MzExNAorCitlbnVtIGpyM19wY2lfYm9hcmRpZCB7CisJQk9BUkRfSlIzXzEsCisJQk9BUkRfSlIzXzIsCisJQk9BUkRfSlIzXzMsCisJQk9BUkRfSlIzXzQsCit9OworCitzdHJ1Y3QganIzX3BjaV9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbl9zdWJkZXZzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBqcjNfcGNpX2JvYXJkIGpyM19wY2lfYm9hcmRzW10gPSB7CisJW0JPQVJEX0pSM18xXSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfMSIsCisJCS5uX3N1YmRldnMJPSAxLAorCX0sCisJW0JPQVJEX0pSM18yXSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfMiIsCisJCS5uX3N1YmRldnMJPSAyLAorCX0sCisJW0JPQVJEX0pSM18zXSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfMyIsCisJCS5uX3N1YmRldnMJPSAzLAorCX0sCisJW0JPQVJEX0pSM180XSA9IHsKKwkJLm5hbWUJCT0gImpyM19wY2lfNCIsCisJCS5uX3N1YmRldnMJPSA0LAorCX0sCit9OworCitzdHJ1Y3QganIzX3BjaV90cmFuc2Zvcm0geworCXN0cnVjdCB7CisJCXUxNiBsaW5rX3R5cGU7CisJCXMxNiBsaW5rX2Ftb3VudDsKKwl9IGxpbmtbOF07Cit9OworCitzdHJ1Y3QganIzX3BjaV9wb2xsX2RlbGF5IHsKKwlpbnQgbWluOworCWludCBtYXg7Cit9OwogCiBzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSB7CiAJc3RydWN0IGpyM190IF9faW9tZW0gKmlvYmFzZTsKLQlpbnQgbl9jaGFubmVsczsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIH07CiAKLXN0cnVjdCBwb2xsX2RlbGF5X3QgewotCWludCBtaW47Ci0JaW50IG1heDsKLX07Ci0KIHN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlIHsKIAlzdHJ1Y3QganIzX2NoYW5uZWwgX19pb21lbSAqY2hhbm5lbDsKIAl1bnNpZ25lZCBsb25nIG5leHRfdGltZV9taW47CkBAIC03OSw3ICsxMTEsNiBAQAogCQlzdGF0ZV9qcjNfaW5pdF91c2Vfb2Zmc2V0X2NvbXBsZXRlLAogCQlzdGF0ZV9qcjNfZG9uZQogCX0gc3RhdGU7Ci0JaW50IGNoYW5uZWxfbm87CiAJaW50IHNlcmlhbF9ubzsKIAlpbnQgbW9kZWxfbm87CiAJc3RydWN0IHsKQEAgLTkyLDkgKzEyMyw5IEBACiAJaW50IHJldHJpZXM7CiB9OwogCi1zdGF0aWMgc3RydWN0IHBvbGxfZGVsYXlfdCBwb2xsX2RlbGF5X21pbl9tYXgoaW50IG1pbiwgaW50IG1heCkKK3N0YXRpYyBzdHJ1Y3QganIzX3BjaV9wb2xsX2RlbGF5IHBvbGxfZGVsYXlfbWluX21heChpbnQgbWluLCBpbnQgbWF4KQogewotCXN0cnVjdCBwb2xsX2RlbGF5X3QgcmVzdWx0OworCXN0cnVjdCBqcjNfcGNpX3BvbGxfZGVsYXkgcmVzdWx0OwogCiAJcmVzdWx0Lm1pbiA9IG1pbjsKIAlyZXN1bHQubWF4ID0gbWF4OwpAQCAtMTA2LDE1ICsxMzcsOCBAQAogCXJldHVybiBnZXRfczE2KCZjaGFubmVsLT5jb21tYW5kX3dvcmQwKSA9PSAwOwogfQogCi1zdHJ1Y3QgdHJhbnNmb3JtX3QgewotCXN0cnVjdCB7Ci0JCXUxNiBsaW5rX3R5cGU7Ci0JCXMxNiBsaW5rX2Ftb3VudDsKLQl9IGxpbmtbOF07Ci19OwotCiBzdGF0aWMgdm9pZCBzZXRfdHJhbnNmb3JtcyhzdHJ1Y3QganIzX2NoYW5uZWwgX19pb21lbSAqY2hhbm5lbCwKLQkJCSAgIHN0cnVjdCB0cmFuc2Zvcm1fdCB0cmFuc2YsIHNob3J0IG51bSkKKwkJCSAgIHN0cnVjdCBqcjNfcGNpX3RyYW5zZm9ybSB0cmFuc2YsIHNob3J0IG51bSkKIHsKIAlpbnQgaTsKIApAQCAtMTk0LDExMCArMjE4LDk5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBqcjNfcGNpX2FpX3JlYWRfY2hhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJCSB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXYgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKHNwcml2LT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2hhbiA8IDU2KSB7CisJCXVuc2lnbmVkIGludCBheGlzID0gY2hhbiAlIDg7CisJCXVuc2lnbmVkIGZpbHRlciA9IGNoYW4gLyA4OworCisJCXN3aXRjaCAoYXhpcykgeworCQljYXNlIDA6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0uZngpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS5meSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdmFsID0gZ2V0X3MxNigmc3ByaXYtPmNoYW5uZWwtPmZpbHRlcltmaWx0ZXJdLmZ6KTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0ubXgpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS5teSk7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJdmFsID0gZ2V0X3MxNigmc3ByaXYtPmNoYW5uZWwtPmZpbHRlcltmaWx0ZXJdLm16KTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQl2YWwgPSBnZXRfczE2KCZzcHJpdi0+Y2hhbm5lbC0+ZmlsdGVyW2ZpbHRlcl0udjEpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXZhbCA9IGdldF9zMTYoJnNwcml2LT5jaGFubmVsLT5maWx0ZXJbZmlsdGVyXS52Mik7CisJCQlicmVhazsKKwkJfQorCQl2YWwgKz0gMHg0MDAwOworCX0gZWxzZSBpZiAoY2hhbiA9PSA1NikgeworCQl2YWwgPSBnZXRfdTE2KCZzcHJpdi0+Y2hhbm5lbC0+bW9kZWxfbm8pOworCX0gZWxzZSBpZiAoY2hhbiA9PSA1NykgeworCQl2YWwgPSBnZXRfdTE2KCZzcHJpdi0+Y2hhbm5lbC0+c2VyaWFsX25vKTsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCiBzdGF0aWMgaW50IGpyM19wY2lfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpwOwotCWludCBjaGFubmVsOworCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcHJpdiA9IHMtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1MTYgZXJyb3JzOworCWludCBpOwogCi0JcCA9IHMtPnByaXZhdGU7Ci0JY2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmIChwID09IE5VTEwgfHwgY2hhbm5lbCA+IDU3KSB7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJaW50IGk7CisJaWYgKCFzcHJpdikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmVzdWx0ID0gaW5zbi0+bjsKLQkJaWYgKHAtPnN0YXRlICE9IHN0YXRlX2pyM19kb25lIHx8Ci0JCSAgICAoZ2V0X3UxNigmcC0+Y2hhbm5lbC0+ZXJyb3JzKSAmICh3YXRjaF9kb2cgfCB3YXRjaF9kb2cyIHwKLQkJCQkJCSAgICAgc2Vuc29yX2NoYW5nZSkpKSB7Ci0JCQkvKiBObyBzZW5zb3Igb3Igc2Vuc29yIGNoYW5nZWQgKi8KLQkJCWlmIChwLT5zdGF0ZSA9PSBzdGF0ZV9qcjNfZG9uZSkgewotCQkJCS8qIFJlc3RhcnQgcG9sbGluZyAqLwotCQkJCXAtPnN0YXRlID0gc3RhdGVfanIzX3BvbGw7Ci0JCQl9Ci0JCQlyZXN1bHQgPSAtRUFHQUlOOworCWVycm9ycyA9IGdldF91MTYoJnNwcml2LT5jaGFubmVsLT5lcnJvcnMpOworCWlmIChzcHJpdi0+c3RhdGUgIT0gc3RhdGVfanIzX2RvbmUgfHwKKwkgICAgKGVycm9ycyAmICh3YXRjaF9kb2cgfCB3YXRjaF9kb2cyIHwgc2Vuc29yX2NoYW5nZSkpKSB7CisJCS8qIE5vIHNlbnNvciBvciBzZW5zb3IgY2hhbmdlZCAqLworCQlpZiAoc3ByaXYtPnN0YXRlID09IHN0YXRlX2pyM19kb25lKSB7CisJCQkvKiBSZXN0YXJ0IHBvbGxpbmcgKi8KKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19wb2xsOwogCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKLQkJCWlmIChjaGFubmVsIDwgNTYpIHsKLQkJCQlpbnQgYXhpcywgZmlsdGVyOwotCi0JCQkJYXhpcyA9IGNoYW5uZWwgJSA4OwotCQkJCWZpbHRlciA9IGNoYW5uZWwgLyA4OwotCQkJCWlmIChwLT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSkgewotCQkJCQlkYXRhW2ldID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgRiA9IDA7Ci0JCQkJCXN3aXRjaCAoYXhpcykgewotCQkJCQljYXNlIDA6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLmZ4KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLmZ5KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLmZ6KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDM6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLm14KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLm15KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLm16KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDY6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLnYxKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDc6Ci0JCQkJCQlGID0gZ2V0X3MxNigmcC0+Y2hhbm5lbC0+Ci0JCQkJCQkJICAgIGZpbHRlcltmaWx0ZXJdLnYyKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWRhdGFbaV0gPSBGICsgMHg0MDAwOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSA1NikgewotCQkJCWlmIChwLT5zdGF0ZSAhPSBzdGF0ZV9qcjNfZG9uZSkKLQkJCQkJZGF0YVtpXSA9IDA7Ci0JCQkJZWxzZQotCQkJCQlkYXRhW2ldID0KLQkJCQkJZ2V0X3UxNigmcC0+Y2hhbm5lbC0+bW9kZWxfbm8pOwotCQkJfSBlbHNlIGlmIChjaGFubmVsID09IDU3KSB7Ci0JCQkJaWYgKHAtPnN0YXRlICE9IHN0YXRlX2pyM19kb25lKQotCQkJCQlkYXRhW2ldID0gMDsKLQkJCQllbHNlCi0JCQkJCWRhdGFbaV0gPQotCQkJCQlnZXRfdTE2KCZwLT5jaGFubmVsLT5zZXJpYWxfbm8pOwotCQkJfQotCQl9CisJCXJldHVybiAtRUFHQUlOOwogCX0KLQlyZXR1cm4gcmVzdWx0OworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGpyM19wY2lfYWlfcmVhZF9jaGFuKGRldiwgcywgY2hhbik7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAogc3RhdGljIGludCBqcjNfcGNpX29wZW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXY7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IGk7Ci0Jc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKIAlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAianIzX3BjaV9vcGVuXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2cHJpdi0+bl9jaGFubmVsczsgaSsrKSB7Ci0JCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpwOwotCi0JCXAgPSBkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZTsKLQkJaWYgKHApIHsKLQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJzZXJpYWw6ICVwICVkICglZClcbiIsIHAsCi0JCQkJcC0+c2VyaWFsX25vLCBwLT5jaGFubmVsX25vKTsKLQkJfQorCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOworCQlzcHJpdiA9IHMtPnByaXZhdGU7CisJCWlmIChzcHJpdikKKwkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJzZXJpYWw6ICVwICVkICglZClcbiIsCisJCQkJc3ByaXYsIHNwcml2LT5zZXJpYWxfbm8sIHMtPmluZGV4KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjYsMjcxICszMzksMjYyIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBqcjNfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgY29uc3QgdTggKmRhdGEsIHNpemVfdCBzaXplLAotCQkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCitzdGF0aWMgaW50IGpyM19jaGVja19maXJtd2FyZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBzaXplKQogeworCWludCBtb3JlID0gMTsKKwlpbnQgcG9zID0gMDsKKwogCS8qCiAJICogSURNIGZpbGUgZm9ybWF0IGlzOgogCSAqICAgeyBjb3VudCwgYWRkcmVzcywgZGF0YSA8Y291bnQ+IH0gKgogCSAqICAgZmZmZgogCSAqLwotCWludCByZXN1bHQsIG1vcmUsIHBvcywgT0s7Ci0KLQlyZXN1bHQgPSAwOwotCW1vcmUgPSAxOwotCXBvcyA9IDA7Ci0JT0sgPSAwOwogCXdoaWxlIChtb3JlKSB7Ci0JCXVuc2lnbmVkIGludCBjb3VudCwgYWRkcjsKKwkJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwkJdW5zaWduZWQgaW50IGFkZHIgPSAwOwogCiAJCW1vcmUgPSBtb3JlICYmIHJlYWRfaWRtX3dvcmQoZGF0YSwgc2l6ZSwgJnBvcywgJmNvdW50KTsKLQkJaWYgKG1vcmUgJiYgY291bnQgPT0gMHhmZmZmKSB7Ci0JCQlPSyA9IDE7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAobW9yZSAmJiBjb3VudCA9PSAweGZmZmYpCisJCQlyZXR1cm4gMDsKKwogCQltb3JlID0gbW9yZSAmJiByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZhZGRyKTsKIAkJd2hpbGUgKG1vcmUgJiYgY291bnQgPiAwKSB7Ci0JCQl1bnNpZ25lZCBpbnQgZHVtbXk7CisJCQl1bnNpZ25lZCBpbnQgZHVtbXkgPSAwOworCiAJCQltb3JlID0gbW9yZSAmJiByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZkdW1teSk7CiAJCQljb3VudC0tOwogCQl9CiAJfQogCi0JaWYgKCFPSykgewotCQlyZXN1bHQgPSAtRU5PREFUQTsKLQl9IGVsc2UgewotCQlpbnQgaTsKLQkJc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKnAgPSBkZXYtPnByaXZhdGU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHAtPm5fY2hhbm5lbHM7IGkrKykgewotCQkJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwOwotCi0JCQlzcCA9IGRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlOwotCQkJbW9yZSA9IDE7Ci0JCQlwb3MgPSAwOwotCQkJd2hpbGUgKG1vcmUpIHsKLQkJCQl1bnNpZ25lZCBpbnQgY291bnQsIGFkZHI7Ci0JCQkJbW9yZSA9IG1vcmUgJiYKLQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmY291bnQpOwotCQkJCWlmIChtb3JlICYmIGNvdW50ID09IDB4ZmZmZikKLQkJCQkJYnJlYWs7Ci0JCQkJbW9yZSA9IG1vcmUgJiYKLQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmYWRkcik7Ci0JCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkJIkxvYWRpbmcjJWQgJTQuNHggYnl0ZXMgYXQgJTQuNHhcbiIsCi0JCQkJCWksIGNvdW50LCBhZGRyKTsKLQkJCQl3aGlsZSAobW9yZSAmJiBjb3VudCA+IDApIHsKLQkJCQkJaWYgKGFkZHIgJiAweDQwMDApIHsKLQkJCQkJCS8qICAxNiBiaXQgZGF0YSwgbmV2ZXIgc2VlbgotCQkJCQkJICogIGluIHJlYWwgbGlmZSEhICovCi0JCQkJCQl1bnNpZ25lZCBpbnQgZGF0YTE7Ci0KLQkJCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLAotCQkJCQkJCQkgICAgIHNpemUsICZwb3MsCi0JCQkJCQkJCSAgICAgJmRhdGExKTsKLQkJCQkJCWNvdW50LS07Ci0JCQkJCQkvKiBqcjNbYWRkciArIDB4MjAwMDAgKiBwbnVtXSA9Ci0JCQkJCQkgICBkYXRhMTsgKi8KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qICAgRG93bmxvYWQgMjQgYml0IHByb2dyYW0gKi8KLQkJCQkJCXVuc2lnbmVkIGludCBkYXRhMSwgZGF0YTI7Ci0KLQkJCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLAotCQkJCQkJCQkgICAgIHNpemUsICZwb3MsCi0JCQkJCQkJCSAgICAgJmRhdGExKTsKLQkJCQkJCW1vcmUgPSBtb3JlICYmCi0JCQkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLAotCQkJCQkJCQkgICAgICZwb3MsCi0JCQkJCQkJCSAgICAgJmRhdGEyKTsKLQkJCQkJCWNvdW50IC09IDI7Ci0JCQkJCQlpZiAobW9yZSkgewotCQkJCQkJCXNldF91MTYoJnAtPgotCQkJCQkJCQlpb2Jhc2UtPmNoYW5uZWwKLQkJCQkJCQkJW2ldLnByb2dyYW1fbG93Ci0JCQkJCQkJCVthZGRyXSwgZGF0YTEpOwotCQkJCQkJCXVkZWxheSgxKTsKLQkJCQkJCQlzZXRfdTE2KCZwLT4KLQkJCQkJCQkJaW9iYXNlLT5jaGFubmVsCi0JCQkJCQkJCVtpXS5wcm9ncmFtX2hpZ2gKLQkJCQkJCQkJW2FkZHJdLCBkYXRhMik7Ci0JCQkJCQkJdWRlbGF5KDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWFkZHIrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gLUVOT0RBVEE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcG9sbF9kZWxheV90IGpyM19wY2lfcG9sbF9zdWJkZXZpY2Uoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgdm9pZCBqcjNfd3JpdGVfZmlybXdhcmUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBpbnQgc3ViZGV2LCBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IHBvbGxfZGVsYXlfdCByZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMCwgMjAwMCk7Ci0Jc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnAgPSBzLT5wcml2YXRlOwotCWludCBpOworCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBqcjNfdCBfX2lvbWVtICppb2Jhc2UgPSBkZXZwcml2LT5pb2Jhc2U7CisJdTMyIF9faW9tZW0gKmxvOworCXUzMiBfX2lvbWVtICpoaTsKKwlpbnQgbW9yZSA9IDE7CisJaW50IHBvcyA9IDA7CiAKLQlpZiAocCkgewotCQlzdHJ1Y3QganIzX2NoYW5uZWwgX19pb21lbSAqY2hhbm5lbCA9IHAtPmNoYW5uZWw7Ci0JCWludCBlcnJvcnMgPSBnZXRfdTE2KCZjaGFubmVsLT5lcnJvcnMpOworCXdoaWxlIChtb3JlKSB7CisJCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJCXVuc2lnbmVkIGludCBhZGRyID0gMDsKIAotCQlpZiAoZXJyb3JzICE9IHAtPmVycm9ycykKLQkJCXAtPmVycm9ycyA9IGVycm9yczsKKwkJbW9yZSA9IG1vcmUgJiYgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmY291bnQpOworCQlpZiAobW9yZSAmJiBjb3VudCA9PSAweGZmZmYpCisJCQlyZXR1cm47CiAKLQkJaWYgKGVycm9ycyAmICh3YXRjaF9kb2cgfCB3YXRjaF9kb2cyIHwgc2Vuc29yX2NoYW5nZSkpCi0JCQkvKiAgU2Vuc29yIGNvbW11bmljYXRpb24gbG9zdCwgZm9yY2UgcG9sbCBtb2RlICovCi0JCQlwLT5zdGF0ZSA9IHN0YXRlX2pyM19wb2xsOworCQltb3JlID0gbW9yZSAmJiByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZhZGRyKTsKIAotCQlzd2l0Y2ggKHAtPnN0YXRlKSB7Ci0JCWNhc2Ugc3RhdGVfanIzX3BvbGw6IHsKLQkJCQl1MTYgbW9kZWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5tb2RlbF9ubyk7Ci0JCQkJdTE2IHNlcmlhbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPnNlcmlhbF9ubyk7Ci0JCQkJaWYgKChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMikpIHx8Ci0JCQkJICAgIG1vZGVsX25vID09IDAgfHwgc2VyaWFsX25vID09IDApIHsKLQkJCQkJLyoKLQkJCQkJICogU3RpbGwgbm8gc2Vuc29yLCBrZWVwIG9uIHBvbGxpbmcuCi0JCQkJCSAqIFNpbmNlIGl0IHRha2VzIHVwIHRvIDEwIHNlY29uZHMKLQkJCQkJICogZm9yIG9mZnNldHMgdG8gc3RhYmlsaXplLCBwb2xsaW5nCi0JCQkJCSAqIGVhY2ggc2Vjb25kIHNob3VsZCBzdWZmaWNlLgotCQkJCQkgKi8KLQkJCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDEwMDAsIDIwMDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXAtPnJldHJpZXMgPSAwOwotCQkJCQlwLT5zdGF0ZSA9Ci0JCQkJCQlzdGF0ZV9qcjNfaW5pdF93YWl0X2Zvcl9vZmZzZXQ7Ci0JCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwLCAyMDAwKTsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkxvYWRpbmcjJWQgJTQuNHggYnl0ZXMgYXQgJTQuNHhcbiIsCisJCQlzdWJkZXYsIGNvdW50LCBhZGRyKTsKKworCQl3aGlsZSAobW9yZSAmJiBjb3VudCA+IDApIHsKKwkJCWlmIChhZGRyICYgMHg0MDAwKSB7CisJCQkJLyogMTYgYml0IGRhdGEsIG5ldmVyIHNlZW4gaW4gcmVhbCBsaWZlISEgKi8KKwkJCQl1bnNpZ25lZCBpbnQgZGF0YTEgPSAwOworCisJCQkJbW9yZSA9IG1vcmUgJiYKKwkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmZGF0YTEpOworCQkJCWNvdW50LS07CisJCQkJLyoganIzW2FkZHIgKyAweDIwMDAwICogcG51bV0gPSBkYXRhMTsgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogRG93bmxvYWQgMjQgYml0IHByb2dyYW0gKi8KKwkJCQl1bnNpZ25lZCBpbnQgZGF0YTEgPSAwOworCQkJCXVuc2lnbmVkIGludCBkYXRhMiA9IDA7CisKKwkJCQlsbyA9ICZpb2Jhc2UtPmNoYW5uZWxbc3ViZGV2XS5wcm9ncmFtX2xvW2FkZHJdOworCQkJCWhpID0gJmlvYmFzZS0+Y2hhbm5lbFtzdWJkZXZdLnByb2dyYW1faGlbYWRkcl07CisKKwkJCQltb3JlID0gbW9yZSAmJgorCQkJCSAgICAgICByZWFkX2lkbV93b3JkKGRhdGEsIHNpemUsICZwb3MsICZkYXRhMSk7CisJCQkJbW9yZSA9IG1vcmUgJiYKKwkJCQkgICAgICAgcmVhZF9pZG1fd29yZChkYXRhLCBzaXplLCAmcG9zLCAmZGF0YTIpOworCQkJCWNvdW50IC09IDI7CisJCQkJaWYgKG1vcmUpIHsKKwkJCQkJc2V0X3UxNihsbywgZGF0YTEpOworCQkJCQl1ZGVsYXkoMSk7CisJCQkJCXNldF91MTYoaGksIGRhdGEyKTsKKwkJCQkJdWRlbGF5KDEpOwogCQkJCX0KIAkJCX0KLQkJCWJyZWFrOwotCQljYXNlIHN0YXRlX2pyM19pbml0X3dhaXRfZm9yX29mZnNldDoKLQkJCXAtPnJldHJpZXMrKzsKLQkJCWlmIChwLT5yZXRyaWVzIDwgMTApIHsKLQkJCQkvKiAgV2FpdCBmb3Igb2ZmZXNldCB0byBzdGFiaWxpemUKLQkJCQkgKiAgKDwgMTAgcyBhY2NvcmRpbmcgdG8gbWFudWFsKSAqLwotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwLCAyMDAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IHRyYW5zZm9ybV90IHRyYW5zZjsKLQotCQkJCXAtPm1vZGVsX25vID0gZ2V0X3UxNigmY2hhbm5lbC0+bW9kZWxfbm8pOwotCQkJCXAtPnNlcmlhbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPnNlcmlhbF9ubyk7Ci0KLQkJCQkvKiAgVHJhbnNmb3JtYXRpb24gYWxsIHplcm9zICovCi0JCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHJhbnNmLmxpbmspOyBpKyspIHsKLQkJCQkJdHJhbnNmLmxpbmtbaV0ubGlua190eXBlID0KLQkJCQkJCShlbnVtIGxpbmtfdHlwZXMpMDsKLQkJCQkJdHJhbnNmLmxpbmtbaV0ubGlua19hbW91bnQgPSAwOwotCQkJCX0KLQotCQkJCXNldF90cmFuc2Zvcm1zKGNoYW5uZWwsIHRyYW5zZiwgMCk7Ci0JCQkJdXNlX3RyYW5zZm9ybShjaGFubmVsLCAwKTsKLQkJCQlwLT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3RyYW5zZm9ybV9jb21wbGV0ZTsKLQkJCQkvKiAgQWxsb3cgMjAgbXMgZm9yIGNvbXBsZXRpb24gKi8KLQkJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBzdGF0ZV9qcjNfaW5pdF90cmFuc2Zvcm1fY29tcGxldGU6Ci0JCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7Ci0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgU2V0IGZ1bGwgc2NhbGUgKi8KLQkJCQlzdHJ1Y3Qgc2l4X2F4aXNfdCBtaW5fZnVsbF9zY2FsZTsKLQkJCQlzdHJ1Y3Qgc2l4X2F4aXNfdCBtYXhfZnVsbF9zY2FsZTsKLQotCQkJCW1pbl9mdWxsX3NjYWxlID0gZ2V0X21pbl9mdWxsX3NjYWxlcyhjaGFubmVsKTsKLQkJCQltYXhfZnVsbF9zY2FsZSA9IGdldF9tYXhfZnVsbF9zY2FsZXMoY2hhbm5lbCk7Ci0JCQkJc2V0X2Z1bGxfc2NhbGVzKGNoYW5uZWwsIG1heF9mdWxsX3NjYWxlKTsKLQotCQkJCXAtPnN0YXRlID0KLQkJCQkJc3RhdGVfanIzX2luaXRfc2V0X2Z1bGxfc2NhbGVfY29tcGxldGU7Ci0JCQkJLyogIEFsbG93IDIwIG1zIGZvciBjb21wbGV0aW9uICovCi0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2Ugc3RhdGVfanIzX2luaXRfc2V0X2Z1bGxfc2NhbGVfY29tcGxldGU6Ci0JCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7Ci0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfSBlbHNlIHsKLQkJCQlzdHJ1Y3QgZm9yY2VfYXJyYXkgX19pb21lbSAqZnVsbF9zY2FsZTsKLQotCQkJCS8qICBVc2UgcmFuZ2VzIGluIGtOIG9yIHdlIHdpbGwKLQkJCQkgKiAgb3ZlcmZsb3cgYXJvdW5kIDIwMDBOISAqLwotCQkJCWZ1bGxfc2NhbGUgPSAmY2hhbm5lbC0+ZnVsbF9zY2FsZTsKLQkJCQlwLT5yYW5nZVswXS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+ZngpICogMTAwMDsKLQkJCQlwLT5yYW5nZVswXS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT5meCkgKiAxMDAwOwotCQkJCXAtPnJhbmdlWzFdLnJhbmdlLm1pbiA9Ci0JCQkJCS1nZXRfczE2KCZmdWxsX3NjYWxlLT5meSkgKiAxMDAwOwotCQkJCXAtPnJhbmdlWzFdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPmZ5KSAqIDEwMDA7Ci0JCQkJcC0+cmFuZ2VbMl0ucmFuZ2UubWluID0KLQkJCQkJLWdldF9zMTYoJmZ1bGxfc2NhbGUtPmZ6KSAqIDEwMDA7Ci0JCQkJcC0+cmFuZ2VbMl0ucmFuZ2UubWF4ID0KLQkJCQkJZ2V0X3MxNigmZnVsbF9zY2FsZS0+ZnopICogMTAwMDsKLQkJCQlwLT5yYW5nZVszXS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+bXgpICogMTAwOwotCQkJCXAtPnJhbmdlWzNdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPm14KSAqIDEwMDsKLQkJCQlwLT5yYW5nZVs0XS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+bXkpICogMTAwOwotCQkJCXAtPnJhbmdlWzRdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPm15KSAqIDEwMDsKLQkJCQlwLT5yYW5nZVs1XS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+bXopICogMTAwOwotCQkJCXAtPnJhbmdlWzVdLnJhbmdlLm1heCA9Ci0JCQkJCWdldF9zMTYoJmZ1bGxfc2NhbGUtPm16KSAqIDEwMDsJLyogPz8gKi8KLQkJCQlwLT5yYW5nZVs2XS5yYW5nZS5taW4gPQotCQkJCQktZ2V0X3MxNigmZnVsbF9zY2FsZS0+djEpICogMTAwOy8qID8/ICovCi0JCQkJcC0+cmFuZ2VbNl0ucmFuZ2UubWF4ID0KLQkJCQkJZ2V0X3MxNigmZnVsbF9zY2FsZS0+djEpICogMTAwOwkvKiA/PyAqLwotCQkJCXAtPnJhbmdlWzddLnJhbmdlLm1pbiA9Ci0JCQkJCS1nZXRfczE2KCZmdWxsX3NjYWxlLT52MikgKiAxMDA7LyogPz8gKi8KLQkJCQlwLT5yYW5nZVs3XS5yYW5nZS5tYXggPQotCQkJCQlnZXRfczE2KCZmdWxsX3NjYWxlLT52MikgKiAxMDA7CS8qID8/ICovCi0JCQkJcC0+cmFuZ2VbOF0ucmFuZ2UubWluID0gMDsKLQkJCQlwLT5yYW5nZVs4XS5yYW5nZS5tYXggPSA2NTUzNTsKLQotCQkJCXVzZV9vZmZzZXQoY2hhbm5lbCwgMCk7Ci0JCQkJcC0+c3RhdGUgPSBzdGF0ZV9qcjNfaW5pdF91c2Vfb2Zmc2V0X2NvbXBsZXRlOwotCQkJCS8qICBBbGxvdyA0MCBtcyBmb3IgY29tcGxldGlvbiAqLwotCQkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCg0MCwgMTAwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIHN0YXRlX2pyM19pbml0X3VzZV9vZmZzZXRfY29tcGxldGU6Ci0JCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7Ci0JCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ4LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ5LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ6LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm14LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm15LCAwKTsKLQkJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm16LCAwKTsKLQotCQkJCXNldF9vZmZzZXQoY2hhbm5lbCk7Ci0KLQkJCQlwLT5zdGF0ZSA9IHN0YXRlX2pyM19kb25lOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2Ugc3RhdGVfanIzX2RvbmU6Ci0JCQlwb2xsX2RlbGF5X21pbl9tYXgoMTAwMDAsIDIwMDAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcG9sbF9kZWxheV9taW5fbWF4KDEwMDAsIDIwMDApOwotCQkJYnJlYWs7CisJCQlhZGRyKys7CiAJCX0KIAl9Cit9CisKK3N0YXRpYyBpbnQganIzX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSwKKwkJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCWludCBzdWJkZXY7CisJaW50IHJldDsKKworCS8qIHZlcmlmeSBJRE0gZmlsZSBmb3JtYXQgKi8KKwlyZXQgPSBqcjNfY2hlY2tfZmlybXdhcmUoZGV2LCBkYXRhLCBzaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogd3JpdGUgZmlybXdhcmUgdG8gZWFjaCBzdWJkZXZpY2UgKi8KKwlmb3IgKHN1YmRldiA9IDA7IHN1YmRldiA8IGRldi0+bl9zdWJkZXZpY2VzOyBzdWJkZXYrKykKKwkJanIzX3dyaXRlX2Zpcm13YXJlKGRldiwgc3ViZGV2LCBkYXRhLCBzaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSBqcjNfcGNpX3BvbGxfc3ViZGV2aWNlKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcHJpdiA9IHMtPnByaXZhdGU7CisJc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSByZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMCwgMjAwMCk7CisJc3RydWN0IGpyM19jaGFubmVsIF9faW9tZW0gKmNoYW5uZWw7CisJdTE2IG1vZGVsX25vOworCXUxNiBzZXJpYWxfbm87CisJaW50IGVycm9yczsKKwlpbnQgaTsKKworCWlmICghc3ByaXYpCisJCXJldHVybiByZXN1bHQ7CisKKwljaGFubmVsID0gc3ByaXYtPmNoYW5uZWw7CisJZXJyb3JzID0gZ2V0X3UxNigmY2hhbm5lbC0+ZXJyb3JzKTsKKworCWlmIChlcnJvcnMgIT0gc3ByaXYtPmVycm9ycykKKwkJc3ByaXYtPmVycm9ycyA9IGVycm9yczsKKworCS8qIFNlbnNvciBjb21tdW5pY2F0aW9uIGxvc3Q/IGZvcmNlIHBvbGwgbW9kZSAqLworCWlmIChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMiB8IHNlbnNvcl9jaGFuZ2UpKQorCQlzcHJpdi0+c3RhdGUgPSBzdGF0ZV9qcjNfcG9sbDsKKworCXN3aXRjaCAoc3ByaXYtPnN0YXRlKSB7CisJY2FzZSBzdGF0ZV9qcjNfcG9sbDoKKwkJbW9kZWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5tb2RlbF9ubyk7CisJCXNlcmlhbF9ubyA9IGdldF91MTYoJmNoYW5uZWwtPnNlcmlhbF9ubyk7CisKKwkJaWYgKChlcnJvcnMgJiAod2F0Y2hfZG9nIHwgd2F0Y2hfZG9nMikpIHx8CisJCSAgICBtb2RlbF9ubyA9PSAwIHx8IHNlcmlhbF9ubyA9PSAwKSB7CisJCQkvKgorCQkJICogU3RpbGwgbm8gc2Vuc29yLCBrZWVwIG9uIHBvbGxpbmcuCisJCQkgKiBTaW5jZSBpdCB0YWtlcyB1cCB0byAxMCBzZWNvbmRzIGZvciBvZmZzZXRzIHRvCisJCQkgKiBzdGFiaWxpemUsIHBvbGxpbmcgZWFjaCBzZWNvbmQgc2hvdWxkIHN1ZmZpY2UuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCXNwcml2LT5yZXRyaWVzID0gMDsKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3dhaXRfZm9yX29mZnNldDsKKwkJfQorCQlicmVhazsKKwljYXNlIHN0YXRlX2pyM19pbml0X3dhaXRfZm9yX29mZnNldDoKKwkJc3ByaXYtPnJldHJpZXMrKzsKKwkJaWYgKHNwcml2LT5yZXRyaWVzIDwgMTApIHsKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBvZmZlc2V0IHRvIHN0YWJpbGl6ZQorCQkJICogKDwgMTAgcyBhY2NvcmRpbmcgdG8gbWFudWFsKQorCQkJICovCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QganIzX3BjaV90cmFuc2Zvcm0gdHJhbnNmOworCisJCQlzcHJpdi0+bW9kZWxfbm8gPSBnZXRfdTE2KCZjaGFubmVsLT5tb2RlbF9ubyk7CisJCQlzcHJpdi0+c2VyaWFsX25vID0gZ2V0X3UxNigmY2hhbm5lbC0+c2VyaWFsX25vKTsKKworCQkJLyogVHJhbnNmb3JtYXRpb24gYWxsIHplcm9zICovCisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cmFuc2YubGluayk7IGkrKykgeworCQkJCXRyYW5zZi5saW5rW2ldLmxpbmtfdHlwZSA9IChlbnVtIGxpbmtfdHlwZXMpMDsKKwkJCQl0cmFuc2YubGlua1tpXS5saW5rX2Ftb3VudCA9IDA7CisJCQl9CisKKwkJCXNldF90cmFuc2Zvcm1zKGNoYW5uZWwsIHRyYW5zZiwgMCk7CisJCQl1c2VfdHJhbnNmb3JtKGNoYW5uZWwsIDApOworCQkJc3ByaXYtPnN0YXRlID0gc3RhdGVfanIzX2luaXRfdHJhbnNmb3JtX2NvbXBsZXRlOworCQkJLyogQWxsb3cgMjAgbXMgZm9yIGNvbXBsZXRpb24gKi8KKwkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIHN0YXRlX2pyM19pbml0X3RyYW5zZm9ybV9jb21wbGV0ZToKKwkJaWYgKCFpc19jb21wbGV0ZShjaGFubmVsKSkgeworCQkJcmVzdWx0ID0gcG9sbF9kZWxheV9taW5fbWF4KDIwLCAxMDApOworCQl9IGVsc2UgeworCQkJLyogU2V0IGZ1bGwgc2NhbGUgKi8KKwkJCXN0cnVjdCBzaXhfYXhpc190IG1pbl9mdWxsX3NjYWxlOworCQkJc3RydWN0IHNpeF9heGlzX3QgbWF4X2Z1bGxfc2NhbGU7CisKKwkJCW1pbl9mdWxsX3NjYWxlID0gZ2V0X21pbl9mdWxsX3NjYWxlcyhjaGFubmVsKTsKKwkJCW1heF9mdWxsX3NjYWxlID0gZ2V0X21heF9mdWxsX3NjYWxlcyhjaGFubmVsKTsKKwkJCXNldF9mdWxsX3NjYWxlcyhjaGFubmVsLCBtYXhfZnVsbF9zY2FsZSk7CisKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19pbml0X3NldF9mdWxsX3NjYWxlX2NvbXBsZXRlOworCQkJLyogQWxsb3cgMjAgbXMgZm9yIGNvbXBsZXRpb24gKi8KKwkJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgyMCwgMTAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIHN0YXRlX2pyM19pbml0X3NldF9mdWxsX3NjYWxlX2NvbXBsZXRlOgorCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7CisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZm9yY2VfYXJyYXkgX19pb21lbSAqZnMgPSAmY2hhbm5lbC0+ZnVsbF9zY2FsZTsKKworCQkJLyogVXNlIHJhbmdlcyBpbiBrTiBvciB3ZSB3aWxsIG92ZXJmbG93IGFyb3VuZCAyMDAwTiEgKi8KKwkJCXNwcml2LT5yYW5nZVswXS5yYW5nZS5taW4gPSAtZ2V0X3MxNigmZnMtPmZ4KSAqIDEwMDA7CisJCQlzcHJpdi0+cmFuZ2VbMF0ucmFuZ2UubWF4ID0gZ2V0X3MxNigmZnMtPmZ4KSAqIDEwMDA7CisJCQlzcHJpdi0+cmFuZ2VbMV0ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT5meSkgKiAxMDAwOworCQkJc3ByaXYtPnJhbmdlWzFdLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT5meSkgKiAxMDAwOworCQkJc3ByaXYtPnJhbmdlWzJdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+ZnopICogMTAwMDsKKwkJCXNwcml2LT5yYW5nZVsyXS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+ZnopICogMTAwMDsKKwkJCXNwcml2LT5yYW5nZVszXS5yYW5nZS5taW4gPSAtZ2V0X3MxNigmZnMtPm14KSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVszXS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+bXgpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzRdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+bXkpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzRdLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT5teSkgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbNV0ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT5teikgKiAxMDA7CisJCQkvKiB0aGUgbmV4dCBmaXZlIGFyZSBxdWVzdGlvbmFibGUgKi8KKwkJCXNwcml2LT5yYW5nZVs1XS5yYW5nZS5tYXggPSBnZXRfczE2KCZmcy0+bXopICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzZdLnJhbmdlLm1pbiA9IC1nZXRfczE2KCZmcy0+djEpICogMTAwOworCQkJc3ByaXYtPnJhbmdlWzZdLnJhbmdlLm1heCA9IGdldF9zMTYoJmZzLT52MSkgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbN10ucmFuZ2UubWluID0gLWdldF9zMTYoJmZzLT52MikgKiAxMDA7CisJCQlzcHJpdi0+cmFuZ2VbN10ucmFuZ2UubWF4ID0gZ2V0X3MxNigmZnMtPnYyKSAqIDEwMDsKKwkJCXNwcml2LT5yYW5nZVs4XS5yYW5nZS5taW4gPSAwOworCQkJc3ByaXYtPnJhbmdlWzhdLnJhbmdlLm1heCA9IDY1NTM1OworCisJCQl1c2Vfb2Zmc2V0KGNoYW5uZWwsIDApOworCQkJc3ByaXYtPnN0YXRlID0gc3RhdGVfanIzX2luaXRfdXNlX29mZnNldF9jb21wbGV0ZTsKKwkJCS8qIEFsbG93IDQwIG1zIGZvciBjb21wbGV0aW9uICovCisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoNDAsIDEwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBzdGF0ZV9qcjNfaW5pdF91c2Vfb2Zmc2V0X2NvbXBsZXRlOgorCQlpZiAoIWlzX2NvbXBsZXRlKGNoYW5uZWwpKSB7CisJCQlyZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMjAsIDEwMCk7CisJCX0gZWxzZSB7CisJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLmZ4LCAwKTsKKwkJCXNldF9zMTYoJmNoYW5uZWwtPm9mZnNldHMuZnksIDApOworCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5meiwgMCk7CisJCQlzZXRfczE2KCZjaGFubmVsLT5vZmZzZXRzLm14LCAwKTsKKwkJCXNldF9zMTYoJmNoYW5uZWwtPm9mZnNldHMubXksIDApOworCQkJc2V0X3MxNigmY2hhbm5lbC0+b2Zmc2V0cy5teiwgMCk7CisKKwkJCXNldF9vZmZzZXQoY2hhbm5lbCk7CisKKwkJCXNwcml2LT5zdGF0ZSA9IHN0YXRlX2pyM19kb25lOworCQl9CisJCWJyZWFrOworCWNhc2Ugc3RhdGVfanIzX2RvbmU6CisJCXJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwMCwgMjAwMDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBqcjNfcGNpX3BvbGxfZGV2KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKilkYXRhOwogCXN0cnVjdCBqcjNfcGNpX2Rldl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpzcHJpdjsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgbm93OwogCWludCBkZWxheTsKIAlpbnQgaTsKQEAgLTU5OCwxOCArNjAyLDIyIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAlkZWxheSA9IDEwMDA7CiAJbm93ID0gamlmZmllczsKLQkvKiAgUG9sbCBhbGwgY2hhbm5lbHMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgcG9sbGVkICovCi0JZm9yIChpID0gMDsgaSA8IGRldnByaXYtPm5fY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ViZGV2cHJpdiA9Ci0JCQlkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZTsKLQkJaWYgKG5vdyA+IHN1YmRldnByaXYtPm5leHRfdGltZV9taW4pIHsKLQkJCXN0cnVjdCBwb2xsX2RlbGF5X3Qgc3ViX2RlbGF5OwogCi0JCQlzdWJfZGVsYXkgPSBqcjNfcGNpX3BvbGxfc3ViZGV2aWNlKCZkZXYtPnN1YmRldmljZXNbaV0pOwotCQkJc3ViZGV2cHJpdi0+bmV4dF90aW1lX21pbiA9Ci0JCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoc3ViX2RlbGF5Lm1pbik7Ci0JCQlzdWJkZXZwcml2LT5uZXh0X3RpbWVfbWF4ID0KLQkJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhzdWJfZGVsYXkubWF4KTsKKwkvKiBQb2xsIGFsbCBjaGFubmVscyB0aGF0IGFyZSByZWFkeSB0byBiZSBwb2xsZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gJmRldi0+c3ViZGV2aWNlc1tpXTsKKwkJc3ByaXYgPSBzLT5wcml2YXRlOworCisJCWlmIChub3cgPiBzcHJpdi0+bmV4dF90aW1lX21pbikgeworCQkJc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSBzdWJfZGVsYXk7CisKKwkJCXN1Yl9kZWxheSA9IGpyM19wY2lfcG9sbF9zdWJkZXZpY2Uocyk7CisKKwkJCXNwcml2LT5uZXh0X3RpbWVfbWluID0gamlmZmllcyArCisJCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHN1Yl9kZWxheS5taW4pOworCQkJc3ByaXYtPm5leHRfdGltZV9tYXggPSBqaWZmaWVzICsKKwkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc3ViX2RlbGF5Lm1heCk7CisKIAkJCWlmIChzdWJfZGVsYXkubWF4ICYmIHN1Yl9kZWxheS5tYXggPCBkZWxheSkKIAkJCQkvKgogCQkJCSAqIFdha2UgdXAgYXMgbGF0ZSBhcyBwb3NzaWJsZSAtPgpAQCAtNjI0LDEzICs2MzIsNTggQEAKIAlhZGRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKIH0KIAotc3RhdGljIGludCBqcjNfcGNpX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorc3RhdGljIHN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICoKK2pyM19wY2lfYWxsb2Nfc3ByaXYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JaW50IHJlc3VsdDsKKwlzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqc3ByaXY7CisJaW50IGo7CisJaW50IGs7CisKKwlzcHJpdiA9IGNvbWVkaV9hbGxvY19zcHJpdihzLCBzaXplb2YoKnNwcml2KSk7CisJaWYgKCFzcHJpdikKKwkJcmV0dXJuIE5VTEw7CisKKwlzcHJpdi0+Y2hhbm5lbCA9ICZkZXZwcml2LT5pb2Jhc2UtPmNoYW5uZWxbcy0+aW5kZXhdLmRhdGE7CisKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCXNwcml2LT5yYW5nZVtqXS5sZW5ndGggPSAxOworCQlzcHJpdi0+cmFuZ2Vbal0ucmFuZ2UubWluID0gLTEwMDAwMDA7CisJCXNwcml2LT5yYW5nZVtqXS5yYW5nZS5tYXggPSAxMDAwMDAwOworCisJCWZvciAoayA9IDA7IGsgPCA3OyBrKyspIHsKKwkJCXNwcml2LT5yYW5nZV90YWJsZV9saXN0W2ogKyBrICogOF0gPQorCQkJCShzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZzcHJpdi0+cmFuZ2Vbal07CisJCQlzcHJpdi0+bWF4ZGF0YV9saXN0W2ogKyBrICogOF0gPSAweDdmZmY7CisJCX0KKwl9CisJc3ByaXYtPnJhbmdlWzhdLmxlbmd0aCA9IDE7CisJc3ByaXYtPnJhbmdlWzhdLnJhbmdlLm1pbiA9IDA7CisJc3ByaXYtPnJhbmdlWzhdLnJhbmdlLm1heCA9IDY1NTM2OworCisJc3ByaXYtPnJhbmdlX3RhYmxlX2xpc3RbNTZdID0gKHN0cnVjdCBjb21lZGlfbHJhbmdlICopJnNwcml2LT5yYW5nZVs4XTsKKwlzcHJpdi0+cmFuZ2VfdGFibGVfbGlzdFs1N10gPSAoc3RydWN0IGNvbWVkaV9scmFuZ2UgKikmc3ByaXYtPnJhbmdlWzhdOworCXNwcml2LT5tYXhkYXRhX2xpc3RbNTZdID0gMHhmZmZmOworCXNwcml2LT5tYXhkYXRhX2xpc3RbNTddID0gMHhmZmZmOworCisJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgInAtPmNoYW5uZWwgJXAgJXAgKCV0eClcbiIsCisJCXNwcml2LT5jaGFubmVsLCBkZXZwcml2LT5pb2Jhc2UsCisJCSgoY2hhciBfX2lvbWVtICopc3ByaXYtPmNoYW5uZWwgLQorCQkgKGNoYXIgX19pb21lbSAqKWRldnByaXYtPmlvYmFzZSkpOworCisJcmV0dXJuIHNwcml2OworfQorCitzdGF0aWMgaW50IGpyM19wY2lfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7Ci0JaW50IGk7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBqcjNfcGNpX2JvYXJkICpib2FyZCA9IE5VTEw7CiAJc3RydWN0IGpyM19wY2lfZGV2X3ByaXZhdGUgKmRldnByaXY7CisJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwcml2OworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQ7CisJaW50IGk7CiAKIAlpZiAoc2l6ZW9mKHN0cnVjdCBqcjNfY2hhbm5lbCkgIT0gMHhjMDApIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKQEAgLTYzOSwxMDYgKzY5Miw1NiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoY29udGV4dCA8IEFSUkFZX1NJWkUoanIzX3BjaV9ib2FyZHMpKQorCQlib2FyZCA9ICZqcjNfcGNpX2JvYXJkc1tjb250ZXh0XTsKKwlpZiAoIWJvYXJkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYtPmJvYXJkX3B0ciA9IGJvYXJkOworCWRldi0+Ym9hcmRfbmFtZSA9IGJvYXJkLT5uYW1lOworCiAJZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7CiAJaWYgKCFkZXZwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWluaXRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKLQlzd2l0Y2ggKHBjaWRldi0+ZGV2aWNlKSB7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUw6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXOgotCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0pSM18yX0NIQU5ORUw6Ci0JCWRldnByaXYtPm5fY2hhbm5lbHMgPSAyOwotCQlicmVhazsKLQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzNfQ0hBTk5FTDoKLQkJZGV2cHJpdi0+bl9jaGFubmVscyA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0RFVklDRV9JRF9KUjNfNF9DSEFOTkVMOgotCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImpyM19wY2k6IHBjaSAlcyBub3Qgc3VwcG9ydGVkXG4iLAotCQkJcGNpX25hbWUocGNpZGV2KSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQl9CiAKLQlyZXN1bHQgPSBjb21lZGlfcGNpX2VuYWJsZShkZXYpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7CisJcmV0ID0gY29tZWRpX3BjaV9lbmFibGUoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJZGV2cHJpdi0+aW9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBjaWRldiwgMCk7CiAJaWYgKCFkZXZwcml2LT5pb2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmVzdWx0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCBkZXZwcml2LT5uX2NoYW5uZWxzKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OworCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgYm9hcmQtPm5fc3ViZGV2cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWRldi0+b3BlbiA9IGpyM19wY2lfb3BlbjsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2cHJpdi0+bl9jaGFubmVsczsgaSsrKSB7Ci0JCWRldi0+c3ViZGV2aWNlc1tpXS50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0JCWRldi0+c3ViZGV2aWNlc1tpXS5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOwotCQlkZXYtPnN1YmRldmljZXNbaV0ubl9jaGFuID0gOCAqIDcgKyAyOwotCQlkZXYtPnN1YmRldmljZXNbaV0uaW5zbl9yZWFkID0ganIzX3BjaV9haV9pbnNuX3JlYWQ7Ci0JCWRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlID0KLQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKGRldi0+c3ViZGV2aWNlc1tpXS5wcml2YXRlKSB7Ci0JCQlzdHJ1Y3QganIzX3BjaV9zdWJkZXZfcHJpdmF0ZSAqcDsKLQkJCWludCBqOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOworCQlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FJOworCQlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOworCQlzLT5uX2NoYW4JPSA4ICogNyArIDI7CisJCXMtPmluc25fcmVhZAk9IGpyM19wY2lfYWlfaW5zbl9yZWFkOwogCi0JCQlwID0gZGV2LT5zdWJkZXZpY2VzW2ldLnByaXZhdGU7Ci0JCQlwLT5jaGFubmVsID0gJmRldnByaXYtPmlvYmFzZS0+Y2hhbm5lbFtpXS5kYXRhOwotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgInAtPmNoYW5uZWwgJXAgJXAgKCV0eClcbiIsCi0JCQkJcC0+Y2hhbm5lbCwgZGV2cHJpdi0+aW9iYXNlLAotCQkJCSgoY2hhciBfX2lvbWVtICopcC0+Y2hhbm5lbCAtCi0JCQkJIChjaGFyIF9faW9tZW0gKilkZXZwcml2LT5pb2Jhc2UpKTsKLQkJCXAtPmNoYW5uZWxfbm8gPSBpOwotCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCQkJCWludCBrOwotCi0JCQkJcC0+cmFuZ2Vbal0ubGVuZ3RoID0gMTsKLQkJCQlwLT5yYW5nZVtqXS5yYW5nZS5taW4gPSAtMTAwMDAwMDsKLQkJCQlwLT5yYW5nZVtqXS5yYW5nZS5tYXggPSAxMDAwMDAwOwotCQkJCWZvciAoayA9IDA7IGsgPCA3OyBrKyspIHsKLQkJCQkJcC0+cmFuZ2VfdGFibGVfbGlzdFtqICsgayAqIDhdID0KLQkJCQkJICAgIChzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZwLT4KLQkJCQkJICAgIHJhbmdlW2pdOwotCQkJCQlwLT5tYXhkYXRhX2xpc3RbaiArIGsgKiA4XSA9IDB4N2ZmZjsKLQkJCQl9Ci0JCQl9Ci0JCQlwLT5yYW5nZVs4XS5sZW5ndGggPSAxOwotCQkJcC0+cmFuZ2VbOF0ucmFuZ2UubWluID0gMDsKLQkJCXAtPnJhbmdlWzhdLnJhbmdlLm1heCA9IDY1NTM2OwotCi0JCQlwLT5yYW5nZV90YWJsZV9saXN0WzU2XSA9Ci0JCQkJKHN0cnVjdCBjb21lZGlfbHJhbmdlICopJnAtPnJhbmdlWzhdOwotCQkJcC0+cmFuZ2VfdGFibGVfbGlzdFs1N10gPQotCQkJCShzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqKSZwLT5yYW5nZVs4XTsKLQkJCXAtPm1heGRhdGFfbGlzdFs1Nl0gPSAweGZmZmY7Ci0JCQlwLT5tYXhkYXRhX2xpc3RbNTddID0gMHhmZmZmOwotCQkJLyogIENoYW5uZWwgc3BlY2lmaWMgcmFuZ2UgYW5kIG1heGRhdGEgKi8KLQkJCWRldi0+c3ViZGV2aWNlc1tpXS5yYW5nZV90YWJsZSA9IE5VTEw7Ci0JCQlkZXYtPnN1YmRldmljZXNbaV0ucmFuZ2VfdGFibGVfbGlzdCA9Ci0JCQkJcC0+cmFuZ2VfdGFibGVfbGlzdDsKLQkJCWRldi0+c3ViZGV2aWNlc1tpXS5tYXhkYXRhID0gMDsKLQkJCWRldi0+c3ViZGV2aWNlc1tpXS5tYXhkYXRhX2xpc3QgPSBwLT5tYXhkYXRhX2xpc3Q7CisJCXNwcml2ID0ganIzX3BjaV9hbGxvY19zcHJpdihkZXYsIHMpOworCQlpZiAoc3ByaXYpIHsKKwkJCS8qIENoYW5uZWwgc3BlY2lmaWMgcmFuZ2UgYW5kIG1heGRhdGEgKi8KKwkJCXMtPnJhbmdlX3RhYmxlX2xpc3QJPSBzcHJpdi0+cmFuZ2VfdGFibGVfbGlzdDsKKwkJCXMtPm1heGRhdGFfbGlzdAkJPSBzcHJpdi0+bWF4ZGF0YV9saXN0OwogCQl9CiAJfQogCiAJLyogIFJlc2V0IERTUCBjYXJkICovCiAJd3JpdGVsKDAsICZkZXZwcml2LT5pb2Jhc2UtPmNoYW5uZWxbMF0ucmVzZXQpOwogCi0JcmVzdWx0ID0gY29tZWRpX2xvYWRfZmlybXdhcmUoZGV2LCAmY29tZWRpX3RvX3BjaV9kZXYoZGV2KS0+ZGV2LAotCQkJCSAgICAgICJjb21lZGkvanIzcGNpLmlkbSIsCi0JCQkJICAgICAganIzX2Rvd25sb2FkX2Zpcm13YXJlLCAwKTsKLQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiRmlybWFyZSBsb2FkICVkXG4iLCByZXN1bHQpOwotCi0JaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiByZXN1bHQ7CisJcmV0ID0gY29tZWRpX2xvYWRfZmlybXdhcmUoZGV2LCAmY29tZWRpX3RvX3BjaV9kZXYoZGV2KS0+ZGV2LAorCQkJCSAgICJjb21lZGkvanIzcGNpLmlkbSIsCisJCQkJICAganIzX2Rvd25sb2FkX2Zpcm13YXJlLCAwKTsKKwlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiRmlybWFyZSBsb2FkICVkXG4iLCByZXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCS8qCiAJICogVE9ETzogdXNlIGZpcm13YXJlIHRvIGxvYWQgcHJlZmVycmVkIG9mZnNldCB0YWJsZXMuIFN1Z2dlc3RlZAogCSAqIGZvcm1hdDoKQEAgLTc2MSwxMSArNzY0LDEyIEBACiAJfQogCiAJLyogIFN0YXJ0IGNhcmQgdGltZXIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGV2cHJpdi0+bl9jaGFubmVsczsgaSsrKSB7Ci0JCXN0cnVjdCBqcjNfcGNpX3N1YmRldl9wcml2YXRlICpwID0gZGV2LT5zdWJkZXZpY2VzW2ldLnByaXZhdGU7CisJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbaV07CisJCXNwcml2ID0gcy0+cHJpdmF0ZTsKIAotCQlwLT5uZXh0X3RpbWVfbWluID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKLQkJcC0+bmV4dF90aW1lX21heCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCQlzcHJpdi0+bmV4dF90aW1lX21pbiA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7CisJCXNwcml2LT5uZXh0X3RpbWVfbWF4ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CiAJfQogCiAJZGV2cHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKQEAgLTc3MywyMSArNzc3LDE2IEBACiAJZGV2cHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOwogCWFkZF90aW1lcigmZGV2cHJpdi0+dGltZXIpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQganIzX3BjaV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QganIzX3BjaV9kZXZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAogCWlmIChkZXZwcml2KSB7CiAJCWRlbF90aW1lcl9zeW5jKCZkZXZwcml2LT50aW1lcik7CiAKLQkJaWYgKGRldi0+c3ViZGV2aWNlcykgewotCQkJZm9yIChpID0gMDsgaSA8IGRldnByaXYtPm5fY2hhbm5lbHM7IGkrKykKLQkJCQlrZnJlZShkZXYtPnN1YmRldmljZXNbaV0ucHJpdmF0ZSk7Ci0JCX0KIAkJaWYgKGRldnByaXYtPmlvYmFzZSkKIAkJCWlvdW5tYXAoZGV2cHJpdi0+aW9iYXNlKTsKIAl9CkBAIC04MDgsMTEgKzgwNywxMSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQganIzX3BjaV9wY2lfdGFibGVbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9KUjMsIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTCkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9KUjMsIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVcpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18yX0NIQU5ORUwpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18zX0NIQU5ORUwpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM180X0NIQU5ORUwpIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MTExMSksIEJPQVJEX0pSM18xIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExMSksIEJPQVJEX0pSM18xIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExMiksIEJPQVJEX0pSM18yIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExMyksIEJPQVJEX0pSM18zIH0sCisJeyBQQ0lfVkRFVklDRShKUjMsIDB4MzExNCksIEJPQVJEX0pSM180IH0sCiAJeyAwIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwganIzX3BjaV9wY2lfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmgKaW5kZXggMzMxN2Y3YS4uMjA0NzhhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5oCkBAIC02NzEsMTEgKzY3MSwxMSBAQAogCiBzdHJ1Y3QganIzX3QgewogCXN0cnVjdCB7Ci0JCXUzMiBwcm9ncmFtX2xvd1sweDQwMDBdOwkvKiAgMHgwMDAwMCAtIDB4MTAwMDAgKi8KKwkJdTMyIHByb2dyYW1fbG9bMHg0MDAwXTsJCS8qICAweDAwMDAwIC0gMHgxMDAwMCAqLwogCQlzdHJ1Y3QganIzX2NoYW5uZWwgZGF0YTsJLyogIDB4MTAwMDAgLSAweDEwYzAwICovCiAJCWNoYXIgcGFkMlsweDMwMDAwIC0gMHgwMGMwMF07CS8qICAweDEwYzAwIC0gMHg0MDAwMCAqLwotCQl1MzIgcHJvZ3JhbV9oaWdoWzB4ODAwMF07CS8qICAweDQwMDAwIC0gMHg2MDAwMCAqLwotCQl1MzIgcmVzZXQ7CS8qICAweDYwMDAwIC0gMHg2MDAwNCAqLworCQl1MzIgcHJvZ3JhbV9oaVsweDgwMDBdOwkJLyogIDB4NDAwMDAgLSAweDYwMDAwICovCisJCXUzMiByZXNldDsJCQkvKiAgMHg2MDAwMCAtIDB4NjAwMDQgKi8KIAkJY2hhciBwYWQzWzB4MjAwMDAgLSAweDAwMDA0XTsJLyogIDB4NjAwMDQgLSAweDgwMDAwICovCiAJfSBjaGFubmVsWzRdOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCmluZGV4IDZiOTg0NmYuLmVjNDNjMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYwpAQCAtMSw5MiArMSwxMTMgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCi0gICAgQ29tZWRpIGRyaXZlciBmb3IgS29sdGVyLUVsZWN0cm9uaWMgUENJIENvdW50ZXIgMSBDYXJkCisgKiBrZV9jb3VudGVyLmMKKyAqIENvbWVkaSBkcml2ZXIgZm9yIEtvbHRlci1FbGVjdHJvbmljIFBDSSBDb3VudGVyIDEgQ2FyZAorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCiAvKgotRHJpdmVyOiBrZV9jb3VudGVyCi1EZXNjcmlwdGlvbjogRHJpdmVyIGZvciBLb2x0ZXIgRWxlY3Ryb25pYyBDb3VudGVyIENhcmQKLURldmljZXM6IFtLb2x0ZXIgRWxlY3Ryb25pY10gUENJIENvdW50ZXIgQ2FyZCAoa2VfY291bnRlcikKLUF1dGhvcjogTWljaGFlbCBIaWxsbWFubgotVXBkYXRlZDogTW9uLCAxNCBBcHIgMjAwOCAxNTo0Mjo0MiArMDEwMAotU3RhdHVzOiB0ZXN0ZWQKLQotQ29uZmlndXJhdGlvbiBPcHRpb25zOiBub3QgYXBwbGljYWJsZSwgdXNlcyBQQ0kgYXV0byBjb25maWcKLQotVGhpcyBkcml2ZXIgaXMgYSBzaW1wbGUgZHJpdmVyIHRvIHJlYWQgdGhlIGNvdW50ZXIgdmFsdWVzIGZyb20KLUtvbHRlciBFbGVjdHJvbmljIFBDSSBDb3VudGVyIENhcmQuCi0qLworICogRHJpdmVyOiBrZV9jb3VudGVyCisgKiBEZXNjcmlwdGlvbjogRHJpdmVyIGZvciBLb2x0ZXIgRWxlY3Ryb25pYyBDb3VudGVyIENhcmQKKyAqIERldmljZXM6IChLb2x0ZXIgRWxlY3Ryb25pYykgUENJIENvdW50ZXIgQ2FyZCBba2VfY291bnRlcl0KKyAqIEF1dGhvcjogTWljaGFlbCBIaWxsbWFubgorICogVXBkYXRlZDogTW9uLCAxNCBBcHIgMjAwOCAxNTo0Mjo0MiArMDEwMAorICogU3RhdHVzOiB0ZXN0ZWQKKyAqCisgKiBDb25maWd1cmF0aW9uIE9wdGlvbnM6IG5vdCBhcHBsaWNhYmxlLCB1c2VzIFBDSSBhdXRvIGNvbmZpZworICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jZGVmaW5lIENOVF9DQVJEX0RFVklDRV9JRCAgICAgIDB4MDAxNAorLyoKKyAqIFBDSSBCQVIgMCBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgS0VfUkVTRVRfUkVHKHgpCQkJKDB4MDAgKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEtFX0xBVENIX1JFRyh4KQkJCSgweDAwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9MU0JfUkVHKHgpCQkJKDB4MDQgKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIEtFX01JRF9SRUcoeCkJCQkoMHgwOCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgS0VfTVNCX1JFRyh4KQkJCSgweDBjICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9TSUdOX1JFRyh4KQkJCSgweDEwICsgKCh4KSAqIDB4MjApKQorI2RlZmluZSBLRV9PU0NfU0VMX1JFRwkJCTB4ZjgKKyNkZWZpbmUgS0VfT1NDX1NFTF9FWFQJCQkoMSA8PCAwKQorI2RlZmluZSBLRV9PU0NfU0VMXzRNSFoJCQkoMiA8PCAwKQorI2RlZmluZSBLRV9PU0NfU0VMXzIwTUhaCQkoMyA8PCAwKQorI2RlZmluZSBLRV9ET19SRUcJCQkweGZjCiAKLS8qLS0gY291bnRlciB3cml0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciByZXNldHRpbmcgdGhlIGNvdW50ZXJzOyBtYXliZSBpdCBpcyBiZXR0ZXIKLSAgIHRvIG1ha2UgYSBzcGVjaWFsIGNvbW1hbmQgJ3Jlc2V0Jy4gKi8KLXN0YXRpYyBpbnQgY250X3dpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGtlX2NvdW50ZXJfaW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CiAKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKSgoZGF0YVswXSA+PiAyNCkgJiAweGZmKSwKLQkgICAgIGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDEwKTsKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKSgoZGF0YVswXSA+PiAxNikgJiAweGZmKSwKLQkgICAgIGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDBjKTsKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKSgoZGF0YVswXSA+PiA4KSAmIDB4ZmYpLAotCSAgICAgZGV2LT5pb2Jhc2UgKyBjaGFuICogMHgyMCArIDB4MDgpOwotCW91dGIoKHVuc2lnbmVkIGNoYXIpKChkYXRhWzBdID4+IDApICYgMHhmZiksCi0JICAgICBkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgwNCk7CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQl2YWwgPSBkYXRhWzBdOwogCi0JLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB3cml0dGVuICovCi0JcmV0dXJuIDE7CisJCS8qIE9yZGVyIG1hdHRlcnMgKi8KKwkJb3V0YigodmFsID4+IDI0KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgS0VfU0lHTl9SRUcoY2hhbikpOworCQlvdXRiKCh2YWwgPj4gMTYpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBLRV9NU0JfUkVHKGNoYW4pKTsKKwkJb3V0YigodmFsID4+IDgpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBLRV9NSURfUkVHKGNoYW4pKTsKKwkJb3V0YigodmFsID4+IDApICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBLRV9MU0JfUkVHKGNoYW4pKTsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotLyotLSBjb3VudGVyIHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IGNudF9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBrZV9jb3VudGVyX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JdW5zaWduZWQgY2hhciBhMCwgYTEsIGEyLCBhMywgYTQ7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKIAotCWEwID0gaW5iKGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjApOwotCWExID0gaW5iKGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDA0KTsKLQlhMiA9IGluYihkZXYtPmlvYmFzZSArIGNoYW4gKiAweDIwICsgMHgwOCk7Ci0JYTMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBjaGFuICogMHgyMCArIDB4MGMpOwotCWE0ID0gaW5iKGRldi0+aW9iYXNlICsgY2hhbiAqIDB4MjAgKyAweDEwKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCS8qIE9yZGVyIG1hdHRlcnMgKi8KKwkJaW5iKGRldi0+aW9iYXNlICsgS0VfTEFUQ0hfUkVHKGNoYW4pKTsKIAotCXJlc3VsdCA9IChhMSArIChhMiAqIDI1NikgKyAoYTMgKiA2NTUzNikpOwotCWlmIChhNCA+IDApCi0JCXJlc3VsdCA9IHJlc3VsdCAtIHMtPm1heGRhdGE7CisJCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIEtFX0xTQl9SRUcoY2hhbikpOworCQl2YWwgfD0gKGluYihkZXYtPmlvYmFzZSArIEtFX01JRF9SRUcoY2hhbikpIDw8IDgpOworCQl2YWwgfD0gKGluYihkZXYtPmlvYmFzZSArIEtFX01TQl9SRUcoY2hhbikpIDw8IDE2KTsKKwkJdmFsIHw9IChpbmIoZGV2LT5pb2Jhc2UgKyBLRV9TSUdOX1JFRyhjaGFuKSkgPDwgMjQpOwogCi0JKmRhdGEgPSAodW5zaWduZWQgaW50KXJlc3VsdDsKKwkJZGF0YVtpXSA9IHZhbDsKKwl9CiAKLQkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQgKi8KLQlyZXR1cm4gMTsKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBjbnRfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCitzdGF0aWMgaW50IGtlX2NvdW50ZXJfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpCisJCW91dGIocy0+c3RhdGUsIGRldi0+aW9iYXNlICsgS0VfRE9fUkVHKTsKKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGtlX2NvdW50ZXJfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CkBAIC05NywzMCArMTE4LDMyIEBACiAJCXJldHVybiByZXQ7CiAJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKIAotCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7CisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAyKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMF07Ci0JZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9DT1VOVEVSOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4JPSAzOworCXMtPm1heGRhdGEJPSAweDAxZmZmZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3Vua25vd247CisJcy0+aW5zbl9yZWFkCT0ga2VfY291bnRlcl9pbnNuX3JlYWQ7CisJcy0+aW5zbl93cml0ZQk9IGtlX2NvdW50ZXJfaW5zbl93cml0ZTsKIAotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSAvKiB8IFNERl9DT01NT04gKi8gOwotCXMtPm5fY2hhbiA9IDM7Ci0Jcy0+bWF4ZGF0YSA9IDB4MDBmZmZmZmY7Ci0Jcy0+aW5zbl9yZWFkID0gY250X3JpbnNuOwotCXMtPmluc25fd3JpdGUgPSBjbnRfd2luc247CisJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gMzsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IGtlX2NvdW50ZXJfZG9faW5zbl9iaXRzOwogCi0JLyogIHNlbGVjdCAyME1IeiBjbG9jayAqLwotCW91dGIoMywgZGV2LT5pb2Jhc2UgKyAyNDgpOworCW91dGIoS0VfT1NDX1NFTF8yME1IWiwgZGV2LT5pb2Jhc2UgKyBLRV9PU0NfU0VMX1JFRyk7CiAKLQkvKiAgcmVzZXQgYWxsIGNvdW50ZXJzICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIDB4MjApOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyAweDQwKTsKLQotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6ICVzIGF0dGFjaGVkXG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsIGRldi0+Ym9hcmRfbmFtZSk7CisJb3V0YigwLCBkZXYtPmlvYmFzZSArIEtFX1JFU0VUX1JFRygwKSk7CisJb3V0YigwLCBkZXYtPmlvYmFzZSArIEtFX1JFU0VUX1JFRygxKSk7CisJb3V0YigwLCBkZXYtPmlvYmFzZSArIEtFX1JFU0VUX1JFRygyKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyOCw3ICsxNTEsNyBAQAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGtlX2NvdW50ZXJfZHJpdmVyID0gewogCS5kcml2ZXJfbmFtZQk9ICJrZV9jb3VudGVyIiwKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAotCS5hdXRvX2F0dGFjaAk9IGNudF9hdXRvX2F0dGFjaCwKKwkuYXV0b19hdHRhY2gJPSBrZV9jb3VudGVyX2F1dG9fYXR0YWNoLAogCS5kZXRhY2gJCT0gY29tZWRpX3BjaV9kaXNhYmxlLAogfTsKIApAQCAtMTQwLDcgKzE2Myw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBrZV9jb3VudGVyX3BjaV90YWJsZVtdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0tPTFRFUiwgQ05UX0NBUkRfREVWSUNFX0lEKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0tPTFRFUiwgMHgwMDE0KSB9LAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGtlX2NvdW50ZXJfcGNpX3RhYmxlKTsKQEAgLTE1NCw1ICsxNzcsNSBAQAogbW9kdWxlX2NvbWVkaV9wY2lfZHJpdmVyKGtlX2NvdW50ZXJfZHJpdmVyLCBrZV9jb3VudGVyX3BjaV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBkcml2ZXIgZm9yIEtvbHRlciBFbGVjdHJvbmljIENvdW50ZXIgQ2FyZCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCmluZGV4IGU3MzliY2QuLmYwMmIzMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKQEAgLTExMTIsOSArMTExMiw2IEBACiAJaWYgKCFkZXYtPmF0dGFjaGVkKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQkvKiBSZXNldCBhbGwgZXZlbnRzICovCi0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7Ci0KIAlpZiAoaW5sKGRldi0+aW9iYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHKSAmCiAJICAgIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRikgewogCQkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBmaW5kIG91dCB3aGF0IGhhcHBlbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKaW5kZXggN2Y2Njg3OC4uMGZmMTI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYwpAQCAtMjQ4LDYgKzI0OCwyMCBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCitzdGF0aWMgaW50IG1lX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IG1lX3ByaXZhdGVfZGF0YSAqZGV2X3ByaXZhdGUgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfU1RBVFVTKTsKKwlpZiAoKHN0YXR1cyAmIDB4MDAwNCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBtZV9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtMjU4LDcgKzI3Miw3IEBACiAJdW5zaWduZWQgaW50IHJhbmcgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IGFyZWYgPSBDUl9BUkVGKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7Ci0JaW50IGk7CisJaW50IHJldDsKIAogCS8qIHN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLwogCWRldl9wcml2YXRlLT5jb250cm9sXzEgJj0gMHhGRkZDOwpAQCAtMjkwLDE5ICszMDQsMTQgQEAKIAlyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0FEQ19TVEFSVCk7CiAKIAkvKiB3YWl0IGZvciBBREMgZmlmbyBub3QgZW1wdHkgZmxhZyAqLwotCWZvciAoaSA9IDEwMDAwMDsgaSA+IDA7IGktLSkKLQkJaWYgKCEocmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9TVEFUVVMpICYgMHgwMDA0KSkKLQkJCWJyZWFrOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbWVfYWlfZW9jLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogZ2V0IHZhbHVlIGZyb20gQURDIGZpZm8gKi8KLQlpZiAoaSkgewotCQl2YWwgPSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1JFQURfQURfRklGTyk7Ci0JCXZhbCA9ICh2YWwgXiAweDgwMCkgJiAweDBmZmY7Ci0JCWRhdGFbMF0gPSB2YWw7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkNhbm5vdCBnZXQgc2luZ2xlIHZhbHVlXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCXZhbCA9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfUkVBRF9BRF9GSUZPKTsKKwl2YWwgPSAodmFsIF4gMHg4MDApICYgMHgwZmZmOworCWRhdGFbMF0gPSB2YWw7CiAKIAkvKiBzdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KIAlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xICY9IDB4RkZGQzsKQEAgLTU0Miw5ICs1NTEsNiBAQAogCXMtPmluc25fYml0cwk9IG1lX2Rpb19pbnNuX2JpdHM7CiAJcy0+aW5zbl9jb25maWcJPSBtZV9kaW9faW5zbl9jb25maWc7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKaW5kZXggODFiNzhlMC4uYTRmN2Q2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKQEAgLTEzMywyMSArMTMzLDE4IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyBpbnQgbWY2eDRfYWlfd2FpdF9mb3JfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBtZjZ4NF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXN0cnVjdCBtZjZ4NF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBlb2xjOworCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCWVvbGMgPSBpb3JlYWQzMihkZXZwcml2LT5ncGlvY19SKSAmIE1GNlg0X0dQSU9DX0VPTEM7Ci0JCWlmIChlb2xjKQotCQkJcmV0dXJuIDA7Ci0KLQkJdWRlbGF5KDEpOwotCX0KLQotCXJldHVybiAtRVRJTUU7CisJc3RhdHVzID0gaW9yZWFkMzIoZGV2cHJpdi0+Z3Bpb2NfUik7CisJaWYgKHN0YXR1cyAmIE1GNlg0X0dQSU9DX0VPTEMpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgbWY2eDRfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0xNjgsNyArMTY1LDcgQEAKIAkJLyogVHJpZ2dlciBBREMgY29udmVyc2lvbiBieSByZWFkaW5nIEFEU1RBUlQgKi8KIAkJaW9yZWFkMTYoZGV2cHJpdi0+YmFyMV9tZW0gKyBNRjZYNF9BRFNUQVJUX1IpOwogCi0JCXJldCA9IG1mNng0X2FpX3dhaXRfZm9yX2VvYyhkZXYsIDEwMCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbWY2eDRfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCmluZGV4IDljOWEwZWUuLjFhNTcyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpAQCAtNTI3LDkgKzUyNyw5IEBACiBpbnQgbWl0ZV9zeW5jX2lucHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCiAJCQlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYykKIHsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGFzeW5jLT5zdWJkZXZpY2U7CiAJaW50IGNvdW50OwogCXVuc2lnbmVkIGludCBuYnl0ZXMsIG9sZF9hbGxvY19jb3VudDsKLQljb25zdCB1bnNpZ25lZCBieXRlc19wZXJfc2NhbiA9IGNmY19ieXRlc19wZXJfc2Nhbihhc3luYy0+c3ViZGV2aWNlKTsKIAogCW9sZF9hbGxvY19jb3VudCA9IGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQ7CiAJLyogd3JpdGUgYWxsb2MgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KQEAgLTUzOCw3ICs1MzgsNyBAQAogCW5ieXRlcyA9IG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIobWl0ZV9jaGFuKTsKIAlpZiAoKGludCkobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihtaXRlX2NoYW4pIC0KIAkJICBvbGRfYWxsb2NfY291bnQpID4gMCkgewotCQlkZXZfd2Fybihhc3luYy0+c3ViZGV2aWNlLT5kZXZpY2UtPmNsYXNzX2RldiwKKwkJZGV2X3dhcm4ocy0+ZGV2aWNlLT5jbGFzc19kZXYsCiAJCQkgIm1pdGU6IERNQSBvdmVyd3JpdGUgb2YgZnJlZSBhcmVhXG4iKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCXJldHVybiAtMTsKQEAgLTU1MSwxMiArNTUxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGNvdW50KTsKLQotCWFzeW5jLT5zY2FuX3Byb2dyZXNzICs9IGNvdW50OwotCWlmIChhc3luYy0+c2Nhbl9wcm9ncmVzcyA+PSBieXRlc19wZXJfc2NhbikgewotCQlhc3luYy0+c2Nhbl9wcm9ncmVzcyAlPSBieXRlc19wZXJfc2NhbjsKLQkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOwotCX0KKwljZmNfaW5jX3NjYW5fcHJvZ3Jlc3MocywgY291bnQpOwogCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKaW5kZXggYmNmMmY5Ny4uNzhmMjM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCkBAIC0yOSw5ICsyOSw5IEBACiAjZGVmaW5lIE1BWF9NSVRFX0RNQV9DSEFOTkVMUyA4CiAKIHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yIHsKLQl1MzIgY291bnQ7Ci0JdTMyIGFkZHI7Ci0JdTMyIG5leHQ7CisJX19sZTMyIGNvdW50OworCV9fbGUzMiBhZGRyOworCV9fbGUzMiBuZXh0OwogCXUzMiBkYXI7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMKaW5kZXggZmU0NjIxZS4uZjc3MDQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM2MjQuYwpAQCAtMTQyLDggKzE0MiwxOCBAQAogCSB9CiB9OwogCi0vKiBUaW1lb3V0IDIwMG1zICovCi0jZGVmaW5lIFRJTUVPVVQgMjAwCitzdGF0aWMgaW50IG1wYzYyNF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgTVBDNjI0X0FEQyk7CisJaWYgKChzdGF0dXMgJiBNUEM2MjRfQURCVVNZKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQogCiBzdGF0aWMgaW50IG1wYzYyNF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTE1Miw3ICsxNjIsNyBAQAogCXN0cnVjdCBtcGM2MjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgbiwgaTsKIAl1bnNpZ25lZCBsb25nIGludCBkYXRhX2luLCBkYXRhX291dDsKLQl1bnNpZ25lZCBjaGFyIHVjUG9ydDsKKwlpbnQgcmV0OwogCiAJLyoKIAkgKiAgV0FSTklORzoKQEAgLTE3MCwxNSArMTgwLDkgQEAKIAkJdWRlbGF5KDEpOwogCiAJCS8qICBXYWl0IGZvciB0aGUgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJdWNQb3J0ID0gaW5iKGRldi0+aW9iYXNlICsgTVBDNjI0X0FEQyk7Ci0JCQlpZiAodWNQb3J0ICYgTVBDNjI0X0FEQlVTWSkKLQkJCQl1ZGVsYXkoMTAwMCk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPT0gVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIG1wYzYyNF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiAgU3RhcnQgcmVhZGluZyBkYXRhICovCiAJCWRhdGFfaW4gPSAwOwpAQCAtMzQxLDcgKzM0NSw3IEBACiAJcy0+bGVuX2NoYW5saXN0ID0gMTsKIAlzLT5pbnNuX3JlYWQgPSBtcGM2MjRfYWlfcmluc247CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIG1wYzYyNF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYwppbmRleCAzY2E3NTVlLi5iNzRiOWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMKQEAgLTgxLDM0ICs4MSw0NCBAQAogCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKIH07CiAKK3N0YXRpYyBpbnQgbXVsdGlxM19haV9zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBNVUxUSVEzX1NUQVRVUyk7CisJaWYgKHN0YXR1cyAmIGNvbnRleHQpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgbXVsdGlxM19haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgaSwgbjsKKwlpbnQgbjsKIAlpbnQgY2hhbjsKIAl1bnNpZ25lZCBpbnQgaGksIGxvOworCWludCByZXQ7CiAKIAljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJb3V0dyhNVUxUSVEzX0NPTlRST0xfTVVTVCB8IE1VTFRJUTNfQURfTVVYX0VOIHwgKGNoYW4gPDwgMyksCiAJICAgICBkZXYtPmlvYmFzZSArIE1VTFRJUTNfQ09OVFJPTCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTVVMVElRM19USU1FT1VUOyBpKyspIHsKLQkJaWYgKGludyhkZXYtPmlvYmFzZSArIE1VTFRJUTNfU1RBVFVTKSAmIE1VTFRJUTNfU1RBVFVTX0VPQykKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA9PSBNVUxUSVEzX1RJTUVPVVQpCi0JCXJldHVybiAtRVRJTUVET1VUOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbXVsdGlxM19haV9zdGF0dXMsCisJCQkgICAgIE1VTFRJUTNfU1RBVFVTX0VPQyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIE1VTFRJUTNfQURfQ1MpOwotCQlmb3IgKGkgPSAwOyBpIDwgTVVMVElRM19USU1FT1VUOyBpKyspIHsKLQkJCWlmIChpbncoZGV2LT5pb2Jhc2UgKwotCQkJCU1VTFRJUTNfU1RBVFVTKSAmIE1VTFRJUTNfU1RBVFVTX0VPQ19JKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IE1VTFRJUTNfVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbXVsdGlxM19haV9zdGF0dXMsCisJCQkJICAgICBNVUxUSVEzX1NUQVRVU19FT0NfSSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWhpID0gaW5iKGRldi0+aW9iYXNlICsgTVVMVElRM19BRF9DUyk7CiAJCWxvID0gaW5iKGRldi0+aW9iYXNlICsgTVVMVElRM19BRF9DUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYwppbmRleCBkZjQyZTM5Li4wZDRiOTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NjB4LmMKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAibWl0ZS5oIgogI2luY2x1ZGUgIm5pX3Rpby5oIgogCkBAIC03ODksMTMgKzc5MCw3IEBACiAJc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIgPSBzLT5wcml2YXRlOwogCiAJbmlfdGlvX2hhbmRsZV9pbnRlcnJ1cHQoY291bnRlciwgcyk7Ci0JaWYgKHMtPmFzeW5jLT5ldmVudHMpIHsKLQkJaWYgKHMtPmFzeW5jLT5ldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8Ci0JCQkJCUNPTUVESV9DQl9PVkVSRkxPVykpIHsKLQkJCW5pXzY2MHhfY2FuY2VsKGRldiwgcyk7Ci0JCX0KLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JfQorCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBuaV82NjB4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQpAQCAtMTE4Nyw3ICsxMTgyLDcgQEAKIAkJZ2xvYmFsX2ludGVycnVwdF9jb25maWdfYml0cyB8PSBDYXNjYWRlX0ludF9FbmFibGVfQml0OwogCW5pXzY2MHhfd3JpdGVfcmVnaXN0ZXIoZGV2LCAwLCBnbG9iYWxfaW50ZXJydXB0X2NvbmZpZ19iaXRzLAogCQkJICAgICAgIE5JNjYwWF9HTE9CQUxfSU5UX0NGRyk7Ci0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJuaV82NjB4OiAlcyBhdHRhY2hlZFxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYwppbmRleCA4NTUwZmRjLi4xMDAyY2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKQEAgLTI0Niw5ICsyNDYsNiBAQAogCS8qIENvbmZpZyBvZiBhbyByZWdpc3RlcnMgKi8KIAl3cml0ZWwoMHgwMCwgZGV2cHJpdi0+bWl0ZS0+ZGFxX2lvX2FkZHIgKyBBT19DT05UUk9MX09GRlNFVCk7CiAKLQlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgIiVzOiAlcyBhdHRhY2hlZFxuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKaW5kZXggZjgzZWI5ZS4uNGUzOWIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKQEAgLTE4NCw3ICsxODQsNiBAQAogCX0KIAkvKiAgaW5pdGlhbGl6ZSBhc3luYyBoZXJlIHRvIG1ha2Ugc3VyZSBzIGlzIG5vdCBOVUxMICovCiAJYXN5bmMgPSBzLT5hc3luYzsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAljbWQgPSAmYXN5bmMtPmNtZDsKIAogCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpOwpAQCAtMTk2LDE1ICsxOTUsMTQgQEAKIAogCWlmIChzdGF0dXMgJiBPVkZMX0JJVCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiZmlmbyBvdmVyZmxvdyIpOwotCQlhMjE1MF9jYW5jZWwoZGV2LCBzKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCX0KIAogCWlmICgoc3RhdHVzICYgRE1BX1RDX0JJVCkgPT0gMCkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiY2F1Z2h0IG5vbi1kbWEgaW50ZXJydXB0PyAgQWJvcnRpbmcuIik7Ci0JCWEyMTUwX2NhbmNlbChkZXYsIHMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCkBAIC0yNDksNyArMjQ3LDYgQEAKIAkJY2ZjX3dyaXRlX3RvX2J1ZmZlcihzLCBkcG50KTsKIAkJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewogCQkJaWYgKC0tZGV2cHJpdi0+Y291bnQgPT0gMCkgewkvKiBlbmQgb2YgYWNxdWlzaXRpb24gKi8KLQkJCQlhMjE1MF9jYW5jZWwoZGV2LCBzKTsKIAkJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yNjUsNyArMjYyLDcgQEAKIAogCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOwogCi0JY29tZWRpX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAogCS8qIGNsZWFyIGludGVycnVwdCAqLwogCW91dHcoMHgwMCwgZGV2LT5pb2Jhc2UgKyBETUFfVENfQ0xFQVJfUkVHKTsKQEAgLTQ4OCwxMyArNDg1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYTIxNTBfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCXVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIEZORV9CSVQpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgYTIxNTBfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBhMjE1MF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBpLCBuOwotCXN0YXRpYyBjb25zdCBpbnQgdGltZW91dCA9IDEwMDAwMDsKLQlzdGF0aWMgY29uc3QgaW50IGZpbHRlcl9kZWxheSA9IDM2OworCXVuc2lnbmVkIGludCBuOworCWludCByZXQ7CiAKIAkvKiAgY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19SRVNFVF9SRUcpOwpAQCAtNTI0LDMwICs1MzMsMjAgQEAKIAkgKiB0aGVyZSBpcyBhIDM1LjYgc2FtcGxlIGRlbGF5IGZvciBkYXRhIHRvIGdldCB0aHJvdWdoIHRoZQogCSAqIGFudGlhbGlhcyBmaWx0ZXIKIAkgKi8KLQlmb3IgKG4gPSAwOyBuIDwgZmlsdGVyX2RlbGF5OyBuKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQkJaWYgKGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpICYgRk5FX0JJVCkKLQkJCQlicmVhazsKLQkJCXVkZWxheSgxKTsKLQkJfQotCQlpZiAoaSA9PSB0aW1lb3V0KSB7Ci0JCQljb21lZGlfZXJyb3IoZGV2LCAidGltZW91dCIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCWZvciAobiA9IDA7IG4gPCAzNjsgbisrKSB7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgYTIxNTBfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJaW53KGRldi0+aW9iYXNlICsgRklGT19EQVRBX1JFRyk7CiAJfQogCiAJLyogIHJlYWQgZGF0YSAqLwogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQkJaWYgKGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpICYgRk5FX0JJVCkKLQkJCQlicmVhazsKLQkJCXVkZWxheSgxKTsKLQkJfQotCQlpZiAoaSA9PSB0aW1lb3V0KSB7Ci0JCQljb21lZGlfZXJyb3IoZGV2LCAidGltZW91dCIpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGEyMTUwX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCWRhdGFbbl0gPSBpbncoZGV2LT5pb2Jhc2UgKyBGSUZPX0RBVEFfUkVHKTsKIAkJZGF0YVtuXSBePSAweDgwMDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwppbmRleCBlOGNkNWRkLi40MjYyMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwpAQCAtOTYsNyArOTYsNiBAQAogI2RlZmluZSBDTE9DS18xMDBfSFoJMHg4RjI1CiAvKiBPdGhlciBtaXNjZWxsYW5lb3VzIGRlZmluZXMgKi8KICNkZWZpbmUgQVRNSU8xNkRfU0laRQkzMgkvKiBidXMgYWRkcmVzcyByYW5nZSAqLwotI2RlZmluZSBBVE1JTzE2RF9USU1FT1VUIDEwCiAKIHN0cnVjdCBhdG1pbzE2X2JvYXJkX3QgewogCkBAIC00NDgsMTYgKzQ0NywzMiBAQAogCXJldHVybiAwOwogfQogCi0vKiBNb2RlIDAgaXMgdXNlZCB0byBnZXQgYSBzaW5nbGUgY29udmVyc2lvbiBvbiBkZW1hbmQgKi8KK3N0YXRpYyBpbnQgYXRtaW8xNmRfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW53KGRldi0+aW9iYXNlICsgU1RBVF9SRUcpOworCWlmIChzdGF0dXMgJiBTVEFUX0FEX0NPTlZBVkFJTCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0YXR1cyAmIFNUQVRfQURfT1ZFUkZMT1cpIHsKKwkJb3V0dygwLCBkZXYtPmlvYmFzZSArIEFEX0NMRUFSX1JFRyk7CisJCXJldHVybiAtRU9WRVJGTE9XOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGF0bWlvMTZkX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGF0bWlvMTZkX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGksIHQ7CisJaW50IGk7CiAJaW50IGNoYW47CiAJaW50IGdhaW47Ci0JaW50IHN0YXR1czsKKwlpbnQgcmV0OwogCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWdhaW4gPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CkBAIC00NzMsMjYgKzQ4OCwxNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKIAkJLyogc3RhcnQgdGhlIGNvbnZlcnNpb24gKi8KIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIFNUQVJUX0NPTlZFUlRfUkVHKTsKKwogCQkvKiB3YWl0IGZvciBpdCB0byBmaW5pc2ggKi8KLQkJZm9yICh0ID0gMDsgdCA8IEFUTUlPMTZEX1RJTUVPVVQ7IHQrKykgewotCQkJLyogY2hlY2sgY29udmVyc2lvbiBzdGF0dXMgKi8KLQkJCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFNUQVRfUkVHKTsKLQkJCWlmIChzdGF0dXMgJiBTVEFUX0FEX0NPTlZBVkFJTCkgewotCQkJCS8qIHJlYWQgdGhlIGRhdGEgbm93ICovCi0JCQkJZGF0YVtpXSA9IGludyhkZXYtPmlvYmFzZSArIEFEX0ZJRk9fUkVHKTsKLQkJCQkvKiBjaGFuZ2UgdG8gdHdvJ3MgY29tcGxlbWVudCBpZiBuZWVkIGJlICovCi0JCQkJaWYgKGRldnByaXYtPmFkY19jb2RpbmcgPT0gYWRjXzJjb21wKQotCQkJCQlkYXRhW2ldIF49IDB4ODAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0YXR1cyAmIFNUQVRfQURfT1ZFUkZMT1cpIHsKLQkJCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgQURfQ0xFQVJfUkVHKTsKLQkJCQlyZXR1cm4gLUVUSU1FOwotCQkJfQotCQl9Ci0JCS8qIGVuZCB3YWl0aW5nLCBub3cgY2hlY2sgaWYgaXQgdGltZWQgb3V0ICovCi0JCWlmICh0ID09IEFUTUlPMTZEX1RJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGF0bWlvMTZkX2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIHJlYWQgdGhlIGRhdGEgbm93ICovCisJCWRhdGFbaV0gPSBpbncoZGV2LT5pb2Jhc2UgKyBBRF9GSUZPX1JFRyk7CisJCS8qIGNoYW5nZSB0byB0d28ncyBjb21wbGVtZW50IGlmIG5lZWQgYmUgKi8KKwkJaWYgKGRldnByaXYtPmFkY19jb2RpbmcgPT0gYWRjXzJjb21wKQorCQkJZGF0YVtpXSBePSAweDgwMDsKIAl9CiAKIAlyZXR1cm4gaTsKQEAgLTcyMywxMCArNzI5LDEzIEBACiAKIAkvKiA4MjU1IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOwotCWlmIChib2FyZC0+aGFzXzgyNTUpCi0JCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCBkZXYtPmlvYmFzZSk7Ci0JZWxzZQorCWlmIChib2FyZC0+aGFzXzgyNTUpIHsKKwkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIGRldi0+aW9iYXNlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIC8qIGRvbid0IHlldCBrbm93IGhvdyB0byBkZWFsIHdpdGggY291bnRlci90aW1lcnMgKi8KICNpZiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV83MDAuYwppbmRleCBlNGNkY2EzLi4xNzFhNzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfNzAwLmMKQEAgLTEwOSwxNCArMTA5LDMxIEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKK3N0YXRpYyBpbnQgZGFxNzAwX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFNUQV9SMik7CisJaWYgKChzdGF0dXMgJiAweDAzKSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgU1RBX1IxKTsKKwlpZiAoKHN0YXR1cyAmIDB4MDIpKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJaWYgKChzdGF0dXMgJiAweDExKSA9PSAweDAxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IGRhcTcwMF9haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlpbnQgbiwgaSwgY2hhbjsKKwlpbnQgbiwgY2hhbjsKIAlpbnQgZDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCWVudW0geyBUSU1FT1VUID0gMTAwIH07CisJaW50IHJldDsKIAogCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAkvKiB3cml0ZSBjaGFubmVsIHRvIG11bHRpcGxleGVyICovCkBAIC0xMzAsMzAgKzE0NywxMiBAQAogCQlvdXRiKDB4MzAsIGRldi0+aW9iYXNlICsgQ01PX1IpOyAvKiBtb2RlIDAgb3V0MCBMLCBmcm9tIEggKi8KIAkJLyogbW9kZSAxIG91dDAgSCwgTCB0byBILCBzdGFydCBjb252ZXJzaW9uICovCiAJCW91dGIoMHgzMiwgZGV2LT5pb2Jhc2UgKyBDTU9fUik7CisKIAkJLyogd2FpdCBmb3IgY29udmVyc2lvbiB0byBlbmQgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRJTUVPVVQ7IGkrKykgewotCQkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgU1RBX1IyKTsKLQkJCWlmICgoc3RhdHVzICYgMHgwMykgIT0gMCkgewotCQkJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LAotCQkJCQkgIk92ZXJmbG93L3J1biBFcnJvclxuIik7Ci0JCQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JCQl9Ci0JCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBTVEFfUjEpOwotCQkJaWYgKChzdGF0dXMgJiAweDAyKSAhPSAwKSB7Ci0JCQkJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJEYXRhIEVycm9yXG4iKTsKLQkJCQlyZXR1cm4gLUVOT0RBVEE7Ci0JCQl9Ci0JCQlpZiAoKHN0YXR1cyAmIDB4MTEpID09IDB4MDEpIHsKLQkJCQkvKiBBREMgY29udmVyc2lvbiBjb21wbGV0ZSAqLwotCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEpOwotCQl9Ci0JCWlmIChpID09IFRJTUVPVVQpIHsKLQkJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LAotCQkJCSAidGltZW91dCBkdXJpbmcgQURDIGNvbnZlcnNpb25cbiIpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBkYXE3MDBfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJLyogcmVhZCBkYXRhICovCiAJCWQgPSBpbncoZGV2LT5pb2Jhc2UgKyBBREZJRk9fUik7CiAJCS8qIG1hbmdsZSB0aGUgZGF0YSBhcyBuZWNlc3NhcnkgKi8KQEAgLTIyOSwxMSArMjI4LDYgQEAKIAlzLT5pbnNuX3JlYWQgPSBkYXE3MDBfYWlfcmluc247CiAJZGFxNzAwX2FpX2NvbmZpZyhkZXYsIHMpOwogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICIlczogJXMsIGlvIDB4JWx4XG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsCi0JCWRldi0+Ym9hcmRfbmFtZSwKLQkJZGV2LT5pb2Jhc2UpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYwppbmRleCAzMzVlYTM0Li45MjVlODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jCkBAIC0zLDggKzMsOCBAQAogICAgIERyaXZlciBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENNQ0lBIERBUS1DYXJkIERJTy0yNAogICAgIENvcHlyaWdodCAoQykgMjAwMiBEYW5pZWwgVmVjaW5vIENhc3RlbCA8ZHZlY2lub0BhYmxlLmVzPgogCi0gICAgUENNQ0lBIGNyYXAgYXQgZW5kIG9mIGZpbGUgaXMgYWRhcHRlZCBmcm9tIGR1bW15X2NzLmMgMS4zMSAyMDAxLzA4LzI0IDEyOjEzOjEzCi0gICAgZnJvbSB0aGUgcGNtY2lhIHBhY2thZ2UuCisgICAgUENNQ0lBIGNyYXAgYXQgZW5kIG9mIGZpbGUgaXMgYWRhcHRlZCBmcm9tIGR1bW15X2NzLmMgMS4zMQorICAgIDIwMDEvMDgvMjQgMTI6MTM6MTMgZnJvbSB0aGUgcGNtY2lhIHBhY2thZ2UuCiAgICAgVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBwY21jaWEgZHVtbXlfY3MuYyBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCiAgICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKICAgICBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMKaW5kZXggMDUxMjQ0NS4uZjQyMTZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMKQEAgLTczLDcgKzczLDYgQEAKICNpbmNsdWRlICJuaV9sYWJwY19pc2FkbWEuaCIKIAogI2RlZmluZSBMQUJQQ19TSVpFCQkweDIwCS8qIHNpemUgb2YgSVNBIGlvIHJlZ2lvbiAqLwotI2RlZmluZSBMQUJQQ19BRENfVElNRU9VVAkxMDAwCiAKIGVudW0gc2Nhbl9tb2RlIHsKIAlNT0RFX1NJTkdMRV9DSEFOLApAQCAtMzA4LDE5ICszMDcsMTcgQEAKIAlsYWJwY19yZWFkX2FkY19maWZvKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgbGFicGNfYWlfd2FpdF9mb3JfZGF0YShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IGxhYnBjX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJc3RydWN0IGxhYnBjX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7Ci0JCWRldnByaXYtPnN0YXQxID0gZGV2cHJpdi0+cmVhZF9ieXRlKGRldi0+aW9iYXNlICsgU1RBVDFfUkVHKTsKLQkJaWYgKGRldnByaXYtPnN0YXQxICYgU1RBVDFfREFWQUlMKQotCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxKTsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlkZXZwcml2LT5zdGF0MSA9IGRldnByaXYtPnJlYWRfYnl0ZShkZXYtPmlvYmFzZSArIFNUQVQxX1JFRyk7CisJaWYgKGRldnByaXYtPnN0YXQxICYgU1RBVDFfREFWQUlMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IGxhYnBjX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMzYzLDcgKzM2MCw3IEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlkZXZwcml2LT53cml0ZV9ieXRlKDB4MSwgZGV2LT5pb2Jhc2UgKyBBRENfU1RBUlRfQ09OVkVSVF9SRUcpOwogCi0JCXJldCA9IGxhYnBjX2FpX3dhaXRfZm9yX2RhdGEoZGV2LCBMQUJQQ19BRENfVElNRU9VVCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgbGFicGNfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTk1MCw3ICs5NDcsNiBAQAogCiAJYXN5bmMgPSBzLT5hc3luYzsKIAljbWQgPSAmYXN5bmMtPmNtZDsKLQlhc3luYy0+ZXZlbnRzID0gMDsKIAogCS8qIHJlYWQgYm9hcmQgc3RhdHVzICovCiAJZGV2cHJpdi0+c3RhdDEgPSBkZXZwcml2LT5yZWFkX2J5dGUoZGV2LT5pb2Jhc2UgKyBTVEFUMV9SRUcpOwpAQCAtOTY4LDcgKzk2NCw3IEBACiAJCS8qIGNsZWFyIGVycm9yIGludGVycnVwdCAqLwogCQlkZXZwcml2LT53cml0ZV9ieXRlKDB4MSwgZGV2LT5pb2Jhc2UgKyBBRENfRklGT19DTEVBUl9SRUcpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQljb21lZGlfZXJyb3IoZGV2LCAib3ZlcnJ1biIpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpAQCAtOTg4LDcgKzk4NCw3IEBACiAJCS8qICBjbGVhciBlcnJvciBpbnRlcnJ1cHQgKi8KIAkJZGV2cHJpdi0+d3JpdGVfYnl0ZSgweDEsIGRldi0+aW9iYXNlICsgQURDX0ZJRk9fQ0xFQVJfUkVHKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfRU9BOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwkJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAkJY29tZWRpX2Vycm9yKGRldiwgIm92ZXJmbG93Iik7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CkBAIC05OTYsMjAgKzk5MiwxNyBAQAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfRVhUKSB7CiAJCWlmIChkZXZwcml2LT5zdGF0MiAmIFNUQVQyX09VVEExKSB7CiAJCQlsYWJwY19kcmFpbl9kcmVncyhkZXYpOwotCQkJbGFicGNfY2FuY2VsKGRldiwgcyk7CiAJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiAJCX0KIAl9CiAKIAkvKiBUUklHX0NPVU5UIGVuZCBvZiBhY3F1aXNpdGlvbiAqLwogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKLQkJaWYgKGRldnByaXYtPmNvdW50ID09IDApIHsKLQkJCWxhYnBjX2NhbmNlbChkZXYsIHMpOworCQlpZiAoZGV2cHJpdi0+Y291bnQgPT0gMCkKIAkJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJfQogCX0KIAotCWNvbWVkaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwppbmRleCA0NTdiODg0Li44YTBlM2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKQEAgLTI1Niw3ICsyNTYsNiBAQAogc3RhdGljIHZvaWQgY2FsZGFjX3NldHVwKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKIHN0YXRpYyBpbnQgbmlfcmVhZF9lZXByb20oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IGFkZHIpOwogCi1zdGF0aWMgaW50IG5pX2FpX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKICNpZm5kZWYgUENJRE1BCiBzdGF0aWMgdm9pZCBuaV9oYW5kbGVfZmlmb19oYWxmX2Z1bGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IG5pX2FvX2ZpZm9faGFsZl9lbXB0eShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjcyLDE1ICsyNzEsMTIgQEAKIHN0YXRpYyBpbnQgbmlfYW9faW50dHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSB1bnNpZ25lZCBpbnQgdHJpZ251bSk7CiAKLXN0YXRpYyBpbnQgbmlfYW9fcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotCiBzdGF0aWMgaW50IG5pXzgyNTVfY2FsbGJhY2soaW50IGRpciwgaW50IHBvcnQsIGludCBkYXRhLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKICNpZmRlZiBQQ0lETUEKIHN0YXRpYyBpbnQgbmlfZ3BjdF9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCBuaV9ncGN0X2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7CiAjZW5kaWYKLXN0YXRpYyBpbnQgbmlfZ3BjdF9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwogc3RhdGljIHZvaWQgaGFuZGxlX2dwY3RfaW50ZXJydXB0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICB1bnNpZ25lZCBzaG9ydCBjb3VudGVyX2luZGV4KTsKIApAQCAtNjg3LDEyICs2ODMsMjIgQEAKIHsKIAljb25zdCBzdHJ1Y3QgbmlfYm9hcmRfc3RydWN0ICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBuaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0YXRpYyBjb25zdCBpbnQgdGltZW91dCA9IDEwMDAwOworCWludCBpOwogCiAJaWYgKGJvYXJkLT5yZWdfdHlwZSA9PSBuaV9yZWdfNjE0MykgewogCQkvKiAgRmx1c2ggdGhlIDYxNDMgZGF0YSBGSUZPICovCiAJCW5pX3dyaXRlbCgweDEwLCBBSUZJRk9fQ29udHJvbF82MTQzKTsJLyogIEZsdXNoIGZpZm8gKi8KIAkJbmlfd3JpdGVsKDB4MDAsIEFJRklGT19Db250cm9sXzYxNDMpOwkvKiAgRmx1c2ggZmlmbyAqLwotCQl3aGlsZSAobmlfcmVhZGwoQUlGSUZPX1N0YXR1c182MTQzKSAmIDB4MTApIDsJLyogIFdhaXQgZm9yIGNvbXBsZXRlICovCisJCS8qICBXYWl0IGZvciBjb21wbGV0ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCQlpZiAoIShuaV9yZWFkbChBSUZJRk9fU3RhdHVzXzYxNDMpICYgMHgxMCkpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwkJaWYgKGkgPT0gdGltZW91dCkgeworCQkJY29tZWRpX2Vycm9yKGRldiwgIkZJRk8gZmx1c2ggdGltZW91dC4iKTsKKwkJfQogCX0gZWxzZSB7CiAJCWRldnByaXYtPnN0Y193cml0ZXcoZGV2LCAxLCBBRENfRklGT19DbGVhcik7CiAJCWlmIChib2FyZC0+cmVnX3R5cGUgPT0gbmlfcmVnXzYyNXgpIHsKQEAgLTkzNywzMiArOTQzLDYgQEAKIAlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CiB9CiAKLXN0YXRpYyB2b2lkIG5pX2V2ZW50KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQotewotCWlmIChzLT4KLQkgICAgYXN5bmMtPmV2ZW50cyAmIChDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfT1ZFUkZMT1cgfAotCQkJICAgICBDT01FRElfQ0JfRU9BKSkgewotCQlzd2l0Y2ggKHMtPmluZGV4KSB7Ci0JCWNhc2UgTklfQUlfU1VCREVWOgotCQkJbmlfYWlfcmVzZXQoZGV2LCBzKTsKLQkJCWJyZWFrOwotCQljYXNlIE5JX0FPX1NVQkRFVjoKLQkJCW5pX2FvX3Jlc2V0KGRldiwgcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBOSV9HUENUMF9TVUJERVY6Ci0JCWNhc2UgTklfR1BDVDFfU1VCREVWOgotCQkJbmlfZ3BjdF9jYW5jZWwoZGV2LCBzKTsKLQkJCWJyZWFrOwotCQljYXNlIE5JX0RJT19TVUJERVY6Ci0JCQluaV9jZGlvX2NhbmNlbChkZXYsIHMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLX0KLQogc3RhdGljIHZvaWQgaGFuZGxlX2dwY3RfaW50ZXJydXB0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICB1bnNpZ25lZCBzaG9ydCBjb3VudGVyX2luZGV4KQogewpAQCAtOTc0LDggKzk1NCw3IEBACiAKIAluaV90aW9faGFuZGxlX2ludGVycnVwdCgmZGV2cHJpdi0+Y291bnRlcl9kZXYtPmNvdW50ZXJzW2NvdW50ZXJfaW5kZXhdLAogCQkJCXMpOwotCWlmIChzLT5hc3luYy0+ZXZlbnRzKQotCQluaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAjZW5kaWYKIH0KIApAQCAtMTAzMyw3ICsxMDEyLDcgQEAKIAkJCWlmIChjb21lZGlfaXNfc3ViZGV2aWNlX3J1bm5pbmcocykpIHsKIAkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9CiAJCQkJICAgIENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9FT0E7Ci0JCQkJbmlfZXZlbnQoZGV2LCBzKTsKKwkJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJfQogCQkJcmV0dXJuOwogCQl9CkBAIC0xMDQ4LDggKzEwMjcsNyBAQAogCQkJaWYgKHN0YXR1cyAmIChBSV9PdmVycnVuX1N0IHwgQUlfT3ZlcmZsb3dfU3QpKQogCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCi0JCQluaV9ldmVudChkZXYsIHMpOwotCisJCQljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChzdGF0dXMgJiBBSV9TQ19UQ19TdCkgewpAQCAtMTA3Niw3ICsxMDU0LDcgQEAKIAlpZiAoKHN0YXR1cyAmIEFJX1NUT1BfU3QpKQogCQluaV9oYW5kbGVfZW9zKGRldiwgcyk7CiAKLQluaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFja19iX2ludGVycnVwdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBiX3N0YXR1cykKQEAgLTExNTEsNyArMTEyOSw3IEBACiAJfQogI2VuZGlmCiAKLQluaV9ldmVudChkZXYsIHMpOworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiB9CiAKICNpZm5kZWYgUENJRE1BCkBAIC0zNjYyLDcgKzM2NDAsNyBAQAogCQkJICBNX09mZnNldF9DRElPX0NvbW1hbmQpOwogCQkvKiBzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7ICovCiAJfQotCW5pX2V2ZW50KGRldiwgcyk7CisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIH0KIAogc3RhdGljIGludCBuaV9zZXJpYWxfaW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTQyODIsMTAgKzQyNjAsMTQgQEAKIAogCS8qIDgyNTUgZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbTklfODI1NV9ESU9fU1VCREVWXTsKLQlpZiAoYm9hcmQtPmhhc184MjU1KQotCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgbmlfODI1NV9jYWxsYmFjaywgKHVuc2lnbmVkIGxvbmcpZGV2KTsKLQllbHNlCisJaWYgKGJvYXJkLT5oYXNfODI1NSkgeworCQlyZXQgPSBzdWJkZXZfODI1NV9pbml0KGRldiwgcywgbmlfODI1NV9jYWxsYmFjaywKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiBmb3JtZXJseSBnZW5lcmFsIHB1cnBvc2UgY291bnRlci90aW1lciBkZXZpY2UsIGJ1dCBubyBsb25nZXIgdXNlZCAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW05JX1VOVVNFRF9TVUJERVZdOwpAQCAtNDM5Myw2ICs0Mzc1LDkgQEAKIAkJCQkJCQkmbmlfZ3BjdF9yZWFkX3JlZ2lzdGVyLAogCQkJCQkJCWNvdW50ZXJfdmFyaWFudCwKIAkJCQkJCQlOVU1fR1BDVCk7CisJaWYgKCFkZXZwcml2LT5jb3VudGVyX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKiBHZW5lcmFsIHB1cnBvc2UgY291bnRlcnMgKi8KIAlmb3IgKGogPSAwOyBqIDwgTlVNX0dQQ1Q7ICsraikgewogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tOSV9HUENUX1NVQkRFVihqKV07CkBAIC00NDgzLDcgKzQ0NjgsNiBAQAogCQluaV93cml0ZWIoMHgwLCBNX09mZnNldF9BT19DYWxpYnJhdGlvbik7CiAJfQogCi0JcHJpbnRrKCJcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC00OTkyLDkgKzQ5NzYsOSBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBQQ0lETUEKIHN0YXRpYyBpbnQgbmlfZ3BjdF9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0jaWZkZWYgUENJRE1BCiAJc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIgPSBzLT5wcml2YXRlOwogCWludCByZXR2YWw7CiAKQEAgLTUwMDIsMTAgKzQ5ODYsOCBAQAogCW5pX2Vfc2VyaWVzX2VuYWJsZV9zZWNvbmRfaXJxKGRldiwgY291bnRlci0+Y291bnRlcl9pbmRleCwgMCk7CiAJbmlfcmVsZWFzZV9ncGN0X21pdGVfY2hhbm5lbChkZXYsIGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpOwogCXJldHVybiByZXR2YWw7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCiB9CisjZW5kaWYKIAogLyoKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKaW5kZXggMzBjNDZhMy4uODVhYzJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwpAQCAtMjYzLDkgKzI2Myw2IEBACiAjZGVmaW5lIEludEVuIChUcmFuc2ZlclJlYWR5fENvdW50RXhwaXJlZHxXYWl0ZWR8UHJpbWFyeVRDfFNlY29uZGFyeVRDKQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgbmlfcGNpZGlvX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKLQogZW51bSBuaWRpb19ib2FyZGlkIHsKIAlCT0FSRF9QQ0lESU9fMzJIUywKIAlCT0FSRF9QWEk2NTMzLApAQCAtMzUzLDE3ICszNTAsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5pX3BjaWRpb19ldmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQotewotCWlmIChzLT4KLQkgICAgYXN5bmMtPmV2ZW50cyAmIChDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SIHwKLQkJCSAgICAgQ09NRURJX0NCX09WRVJGTE9XKSkgewotCQluaV9wY2lkaW9fY2FuY2VsKGRldiwgcyk7Ci0JfQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotfQotCiBzdGF0aWMgaW50IG5pX3BjaWRpb19wb2xsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBuaWRpbzk2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC01MDEsNyArNDg3LDcgQEAKIAl9CiAKIG91dDoKLQluaV9wY2lkaW9fZXZlbnQoZGV2LCBzKTsKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOwogI2lmIDAKIAlpZiAoIXRhZykgewogCQl3cml0ZWIoMHgwMywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYwppbmRleCAwZWQ5ODA0Li5kNDBkZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCkBAIC0xNTUxLDcgKzE1NTEsNyBAQAogCWRldi0+c3ViZGV2aWNlc1tOSV9HUENUX1NVQkRFVigxKV0uYnVmX2NoYW5nZSA9ICZwY2ltaW9fZ3BjdDFfY2hhbmdlOwogCWRldi0+c3ViZGV2aWNlc1tOSV9ESU9fU1VCREVWXS5idWZfY2hhbmdlID0gJnBjaW1pb19kaW9fY2hhbmdlOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwY2ltaW9fYWlfY2hhbmdlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvLmgKaW5kZXggNjgzNzhkYS4uMTA1NmJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW8uaApAQCAtMTE1LDEwICsxMTUsMTAgQEAKIAogc3RydWN0IG5pX2dwY3RfZGV2aWNlIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OwotCXZvaWQgKCp3cml0ZV9yZWdpc3RlcikgKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLCB1bnNpZ25lZCBiaXRzLAotCQkJCWVudW0gbmlfZ3BjdF9yZWdpc3RlciByZWcpOwotCXVuc2lnbmVkICgqcmVhZF9yZWdpc3RlcikgKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAotCQkJCSAgIGVudW0gbmlfZ3BjdF9yZWdpc3RlciByZWcpOworCXZvaWQgKCp3cml0ZV9yZWdpc3Rlcikoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHVuc2lnbmVkIGJpdHMsCisJCQkgICAgICAgZW51bSBuaV9ncGN0X3JlZ2lzdGVyIHJlZyk7CisJdW5zaWduZWQgKCpyZWFkX3JlZ2lzdGVyKShzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlciwKKwkJCQkgIGVudW0gbmlfZ3BjdF9yZWdpc3RlciByZWcpOwogCWVudW0gbmlfZ3BjdF92YXJpYW50IHZhcmlhbnQ7CiAJc3RydWN0IG5pX2dwY3QgKmNvdW50ZXJzOwogCXVuc2lnbmVkIG51bV9jb3VudGVyczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYwppbmRleCBmMGZjMTIzLi43YzAzYTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCkBAIC0yNTMsMTggKzI1MywxNyBAQAogCW91dGIobXV4IHwgUENMNzExX01VWF9DSEFOKGNoYW4pLCBkZXYtPmlvYmFzZSArIFBDTDcxMV9NVVhfUkVHKTsKIH0KIAotc3RhdGljIGludCBwY2w3MTFfYWlfd2FpdF9mb3JfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgcGNsNzExX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7Ci0JdW5zaWduZWQgaW50IG1zYjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQltc2IgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfQUlfTVNCX1JFRyk7Ci0JCWlmICgobXNiICYgUENMNzExX0FJX01TQl9EUkRZKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxKTsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfQUlfTVNCX1JFRyk7CisJaWYgKChzdGF0dXMgJiBQQ0w3MTFfQUlfTVNCX0RSRFkpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcGNsNzExX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjgyLDcgKzI4MSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXRiKFBDTDcxMV9TT0ZUVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfU09GVFRSSUdfUkVHKTsKIAotCQlyZXQgPSBwY2w3MTFfYWlfd2FpdF9mb3JfZW9jKGRldiwgMTAwKTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2w3MTFfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTMzNiwxMSArMzM1LDggQEAKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwogCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FKSB7CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FKQogCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKLQl9IGVsc2UgewotCQkvKiBpZ25vcmUgKi8KLQl9CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYwppbmRleCA1MzYxM2IzLi4xNjBlYWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCkBAIC0xMzEsMzQgKzEzMSwzMiBAQAogI2RlZmluZSBib2FyZEFDTDgyMTYJICAgICAgOAkvKiBhbmQgSUNQIERBUyBBLTgyNlBHICovCiAjZGVmaW5lIGJvYXJkQTgyMQkgICAgICA5CS8qIFBHSCwgUEdMLCBQR0wvTkRBIHZlcnNpb25zICovCiAKLSNkZWZpbmUgUENMeDF4X0lPUkFOR0UJICAgICAxNgotCi0jZGVmaW5lIFBDTDgxMl9DVFIwCSAgICAgIDAKLSNkZWZpbmUgUENMODEyX0NUUjEJICAgICAgMQotI2RlZmluZSBQQ0w4MTJfQ1RSMgkgICAgICAyCi0jZGVmaW5lIFBDTDgxMl9DVFJDVEwJICAgICAgMwotI2RlZmluZSBQQ0w4MTJfQURfTE8JICAgICAgNAotI2RlZmluZSBQQ0w4MTJfREExX0xPCSAgICAgIDQKLSNkZWZpbmUgUENMODEyX0FEX0hJCSAgICAgIDUKLSNkZWZpbmUgUENMODEyX0RBMV9ISQkgICAgICA1Ci0jZGVmaW5lIFBDTDgxMl9EQTJfTE8JICAgICAgNgotI2RlZmluZSBQQ0w4MTJfRElfTE8JICAgICAgNgotI2RlZmluZSBQQ0w4MTJfREEyX0hJCSAgICAgIDcKLSNkZWZpbmUgUENMODEyX0RJX0hJCSAgICAgIDcKLSNkZWZpbmUgUENMODEyX0NMUklOVAkgICAgICA4Ci0jZGVmaW5lIFBDTDgxMl9HQUlOCSAgICAgIDkKLSNkZWZpbmUgUENMODEyX01VWAkgICAgIDEwCi0jZGVmaW5lIFBDTDgxMl9NT0RFCSAgICAgMTEKLSNkZWZpbmUgUENMODEyX0NOVEVOQUJMRSAgICAgMTAKLSNkZWZpbmUgUENMODEyX1NPRlRUUklHCSAgICAgMTIKLSNkZWZpbmUgUENMODEyX0RPX0xPCSAgICAgMTMKLSNkZWZpbmUgUENMODEyX0RPX0hJCSAgICAgMTQKLQotI2RlZmluZSBQQ0w4MTJfRFJEWQkgICAweDEwCS8qID0wIGRhdGEgcmVhZHkgKi8KLQotI2RlZmluZSBBQ0w4MjE2X1NUQVRVUwkgICAgICA4CS8qIDUuIGJpdCBzaWduYWxpemUgZGF0YSByZWFkeSAqLwotCi0jZGVmaW5lIEFDTDgyMTZfRFJEWQkgICAweDIwCS8qID0wIGRhdGEgcmVhZHkgKi8KKy8qCisgKiBSZWdpc3RlciBJL08gbWFwCisgKi8KKyNkZWZpbmUgUENMODEyX1RJTUVSX0JBU0UJCQkweDAwCisjZGVmaW5lIFBDTDgxMl9BSV9MU0JfUkVHCQkJMHgwNAorI2RlZmluZSBQQ0w4MTJfQUlfTVNCX1JFRwkJCTB4MDUKKyNkZWZpbmUgUENMODEyX0FJX01TQl9EUkRZCQkJKDEgPDwgNCkKKyNkZWZpbmUgUENMODEyX0FPX0xTQl9SRUcoeCkJCQkoMHgwNCArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODEyX0FPX01TQl9SRUcoeCkJCQkoMHgwNSArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODEyX0RJX0xTQl9SRUcJCQkweDA2CisjZGVmaW5lIFBDTDgxMl9ESV9NU0JfUkVHCQkJMHgwNworI2RlZmluZSBQQ0w4MTJfU1RBVFVTX1JFRwkJCTB4MDgKKyNkZWZpbmUgUENMODEyX1NUQVRVU19EUkRZCQkJKDEgPDwgNSkKKyNkZWZpbmUgUENMODEyX1JBTkdFX1JFRwkJCTB4MDkKKyNkZWZpbmUgUENMODEyX01VWF9SRUcJCQkJMHgwYQorI2RlZmluZSBQQ0w4MTJfTVVYX0NIQU4oeCkJCQkoKHgpIDw8IDApCisjZGVmaW5lIFBDTDgxMl9NVVhfQ1MwCQkJCSgxIDw8IDQpCisjZGVmaW5lIFBDTDgxMl9NVVhfQ1MxCQkJCSgxIDw8IDUpCisjZGVmaW5lIFBDTDgxMl9DVFJMX1JFRwkJCQkweDBiCisjZGVmaW5lIFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRwkJKDAgPDwgMCkKKyNkZWZpbmUgUENMODEyX0NUUkxfU09GVF9UUklHCQkJKDEgPDwgMCkKKyNkZWZpbmUgUENMODEyX0NUUkxfUEFDRVJfRE1BX1RSSUcJCSgyIDw8IDApCisjZGVmaW5lIFBDTDgxMl9DVFJMX1BBQ0VSX0VPQ19UUklHCQkoNiA8PCAwKQorI2RlZmluZSBQQ0w4MTJfU09GVFRSSUdfUkVHCQkJMHgwYworI2RlZmluZSBQQ0w4MTJfRE9fTFNCX1JFRwkJCTB4MGQKKyNkZWZpbmUgUENMODEyX0RPX01TQl9SRUcJCQkweDBlCiAKICNkZWZpbmUgTUFYX0NIQU5MSVNUX0xFTiAgICAyNTYJLyogbGVuZ3RoIG9mIHNjYW4gbGlzdCAqLwogCkBAIC0zMzEsMjEzICszMjksMzkxIEBACiB9OwogCiBzdHJ1Y3QgcGNsODEyX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBib2FyZF90eXBlOworCWludCBuX2FpY2hhbjsKKwlpbnQgbl9hb2NoYW47CisJdW5zaWduZWQgaW50IGFpX25zX21pbjsKKwljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FpOworCXVuc2lnbmVkIGludCBJUlFiaXRzOworCXVuc2lnbmVkIGludCBoYXNfZG1hOjE7CisJdW5zaWduZWQgaW50IGhhc18xNmJpdF9haToxOworCXVuc2lnbmVkIGludCBoYXNfbXBjNTA4X211eDoxOworCXVuc2lnbmVkIGludCBoYXNfZGlvOjE7Cit9OwogCi0JY29uc3QgY2hhciAqbmFtZTsJLyogIGJvYXJkIG5hbWUgKi8KLQlpbnQgYm9hcmRfdHlwZTsJCS8qICB0eXBlIG9mIHRoaXMgYm9hcmQgKi8KLQlpbnQgbl9haWNoYW47CQkvKiAgbnVtIG9mIEFJIGNoYW5zIGluIFMuRS4gKi8KLQlpbnQgbl9haWNoYW5fZGlmZjsJLyogIERJRkYgbnVtIG9mIGNoYW5zICovCi0JaW50IG5fYW9jaGFuOwkJLyogIG51bSBvZiBEQSBjaGFucyAqLwotCWludCBuX2RpY2hhbjsJCS8qICBESSBhbmQgRE8gY2hhbnMgKi8KLQlpbnQgbl9kb2NoYW47Ci0JaW50IGFpX21heGRhdGE7CQkvKiAgQUkgcmVzb2x1dGlvbiAqLwotCXVuc2lnbmVkIGludCBhaV9uc19taW47CS8qICBtYXggc2FtcGxlIHNwZWVkIG9mIGNhcmQgdiBucyAqLwotCXVuc2lnbmVkIGludCBpODI1NF9vc2NfYmFzZTsJLyogIGNsb2NrIGJhc2UgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FpOwkvKiAgcmFuZ2VsaXN0IGZvciBBL0QgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FvOwkvKiAgcmFuZ2VsaXN0IGZvciBEL0EgKi8KLQl1bnNpZ25lZCBpbnQgSVJRYml0czsJLyogIGFsbG93ZWQgSVJRICovCi0JdW5zaWduZWQgY2hhciBETUFiaXRzOwkvKiAgYWxsb3dlZCBETUEgY2hhbnMgKi8KLQl1bnNpZ25lZCBjaGFyIGlvX3JhbmdlOwkvKiAgaW9yYW5nZSBmb3IgdGhpcyBib2FyZCAqLwotCXVuc2lnbmVkIGNoYXIgaGF2ZU1QQzUwODsJLyogIDE9Ym9hcmQgdXNlIE1QQzUwOEEgbXVsdGlwbGV4b3IgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJwY2w4MTIiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkUENMODEyLAorCQkubl9haWNoYW4JPSAxNiwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDMzMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX2JpcG9sYXIxMCwKKwkJLklSUWJpdHMJPSAweGRjZmMsCisJCS5oYXNfZG1hCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gInBjbDgxMnBnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxMlBHLAorCQkubl9haWNoYW4JPSAxNiwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDMzMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxMnBnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMnBnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxMlBHLAorCQkubl9haWNoYW4JPSAxNiwKKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxMnBnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMmRnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEFDTDgxMTIsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmRnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX21wYzUwOF9tdXgJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMmhnIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEFDTDgxMTIsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmhnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX21wYzUwOF9tdXgJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyMXBnbCIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBODIxLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMSwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2JfYWksCisJCS5JUlFiaXRzCT0gMHgwMDBjLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyMXBnbG5kYSIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBODIxLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2JfYWksCisJCS5JUlFiaXRzCT0gMHgwMDBjLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjFwZ2giLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQTgyMSwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDEsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9hODIxcGdoX2FpLAorCQkuSVJRYml0cwk9IDB4MDAwYywKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjJwZ2wiLAorCQkuYm9hcmRfdHlwZQk9IGJvYXJkQUNMODExMiwKKwkJLm5fYWljaGFuCT0gMTYsCS8qIDggZGlmZmVyZW50aWFsICovCisJCS5uX2FvY2hhbgk9IDIsCisJCS5haV9uc19taW4JPSAxMDAwMCwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9hY2w4MTEyZGdfYWksCisJCS5JUlFiaXRzCT0gMHhkY2ZjLAorCQkuaGFzX2RtYQk9IDEsCisJCS5oYXNfZGlvCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJhODIycGdoIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZEFDTDgxMTIsCisJCS5uX2FpY2hhbgk9IDE2LAkvKiA4IGRpZmZlcmVudGlhbCAqLworCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfbnNfbWluCT0gMTAwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmhnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyM3BnbCIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEyLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDgwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmRnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAiYTgyM3BnaCIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEyLAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDgwMDAsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfYWNsODExMmhnX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzX2Rpbwk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsODEzIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxMywKKwkJLm5fYWljaGFuCT0gMzIsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfcGNsODEzYl9haSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MTNiIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZFBDTDgxM0IsCisJCS5uX2FpY2hhbgk9IDMyLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2JfYWksCisJfSwgeworCQkubmFtZQkJPSAiYWNsODExMyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MTEzLAorCQkubl9haWNoYW4JPSAzMiwKKwkJLnJhbmdlbGlzdF9haQk9ICZyYW5nZV9hY2w4MTEzXzFfYWksCisJfSwgeworCQkubmFtZQkJPSAiaXNvODEzIiwKKwkJLmJvYXJkX3R5cGUJPSBib2FyZElTTzgxMywKKwkJLm5fYWljaGFuCT0gMzIsCisJCS5yYW5nZWxpc3RfYWkJPSAmcmFuZ2VfaXNvODEzXzFfYWksCisJfSwgeworCQkubmFtZQkJPSAiYWNsODIxNiIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MjE2LAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2IyX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzXzE2Yml0X2FpCT0gMSwKKwkJLmhhc19tcGM1MDhfbXV4CT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gImE4MjZwZyIsCisJCS5ib2FyZF90eXBlCT0gYm9hcmRBQ0w4MjE2LAorCQkubl9haWNoYW4JPSAxNiwJLyogOCBkaWZmZXJlbnRpYWwgKi8KKwkJLm5fYW9jaGFuCT0gMiwKKwkJLmFpX25zX21pbgk9IDEwMDAwLAorCQkucmFuZ2VsaXN0X2FpCT0gJnJhbmdlX3BjbDgxM2IyX2FpLAorCQkuSVJRYml0cwk9IDB4ZGNmYywKKwkJLmhhc19kbWEJPSAxLAorCQkuaGFzXzE2Yml0X2FpCT0gMSwKKwkJLmhhc19kaW8JPSAxLAorCX0sCiB9OwogCiBzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgewotCi0JdW5zaWduZWQgY2hhciB2YWxpZDsJLyogID0xIGRldmljZSBpcyBPSyAqLwogCXVuc2lnbmVkIGNoYXIgZG1hOwkvKiAgPjAgdXNlIGRtYSAoIHVzZWRETUEgY2hhbm5lbCkgKi8KLQl1bnNpZ25lZCBjaGFyIHVzZV9kaWZmOwkvKiAgPTEgZGlmZiBpbnB1dHMgKi8KLQl1bnNpZ25lZCBjaGFyIHVzZV9NUEM7CS8qICAxPWJvYXJkIHVzZXMgTVBDNTA4QSBtdWx0aXBsZXhvciAqLwotCXVuc2lnbmVkIGNoYXIgdXNlX2V4dF90cmc7CS8qICAxPWJvYXJkIHVzZXMgZXh0ZXJuYWwgdHJpZ2dlciAqLwogCXVuc2lnbmVkIGNoYXIgcmFuZ2VfY29ycmVjdGlvbjsJLyogID0xIHdlIG11c3QgYWRkIDEgdG8gcmFuZ2UgbnVtYmVyICovCi0JdW5zaWduZWQgY2hhciBvbGRfY2hhbl9yZWc7CS8qICBsYXN0bHkgdXNlZCBjaGFuL2dhaW4gcGFpciAqLwotCXVuc2lnbmVkIGNoYXIgb2xkX2dhaW5fcmVnOworCXVuc2lnbmVkIGludCBsYXN0X2FpX2NoYW5zcGVjOwogCXVuc2lnbmVkIGNoYXIgbW9kZV9yZWdfaW50OwkvKiAgdGhlcmUgaXMgc3RvcmVkIElOVCBudW1iZXIgZm9yIHNvbWUgY2FyZCAqLwotCXVuc2lnbmVkIGNoYXIgYWlfbmV2ZXJlbmRpbmc7CS8qICA9MSB3ZSBkbyB1bmxpbWl0ZWQgQUkgKi8KLQl1bnNpZ25lZCBjaGFyIGFpX2VvczsJLyogIDE9RU9TIHdha2UgdXAgKi8KLQl1bnNpZ25lZCBjaGFyIGFpX2RtYTsJLyogID0xIHdlIHVzZSBETUEgKi8KIAl1bnNpZ25lZCBpbnQgYWlfcG9sbF9wdHI7CS8qICBob3cgbWFueSBzYW1wZXMgdHJhbnNmZXIgcG9sbCAqLwotCXVuc2lnbmVkIGludCBhaV9zY2FuczsJLyogIGxlbiBvZiBzY2FubGlzdCAqLwogCXVuc2lnbmVkIGludCBhaV9hY3Rfc2NhbjsJLyogIGhvdyBtYW55IHNjYW5zIHdlIGZpbmlzaGVkICovCi0JdW5zaWduZWQgaW50IGFpX2NoYW5saXN0W01BWF9DSEFOTElTVF9MRU5dOwkvKiAgb3VyIGNvcHkgb2YgY2hhbm5lbC9yYW5nZSBsaXN0ICovCi0JdW5zaWduZWQgaW50IGFpX25fY2hhbjsJLyogIGhvdyBtYW55IGNoYW5uZWxzIGlzIG1lYXN1cmVkICovCi0JdW5zaWduZWQgaW50IGFpX2ZsYWdzOwkvKiAgZmxhZ2xpc3QgKi8KLQl1bnNpZ25lZCBpbnQgYWlfZGF0YV9sZW47CS8qICBsZW4gb2YgZGF0YSBidWZmZXIgKi8KLQl1bnNpZ25lZCBpbnQgYWlfaXMxNmI7CS8qICA9MSB3ZSBoYXZlIDE2IGJpdCBjYXJkICovCisJdW5zaWduZWQgaW50IGRtYXBhZ2VzOworCXVuc2lnbmVkIGludCBod2RtYXNpemU7CiAJdW5zaWduZWQgbG9uZyBkbWFidWZbMl07CS8qICBQVFIgdG8gRE1BIGJ1ZiAqLwotCXVuc2lnbmVkIGludCBkbWFwYWdlc1syXTsJLyogIGhvdyBtYW55IHBhZ2VzIHdlIGhhdmUgYWxsb2NhdGVkICovCiAJdW5zaWduZWQgaW50IGh3ZG1hcHRyWzJdOwkvKiAgSFcgUFRSIHRvIERNQSBidWYgKi8KLQl1bnNpZ25lZCBpbnQgaHdkbWFzaXplWzJdOwkvKiAgRE1BIGJ1ZiBzaXplIGluIGJ5dGVzICovCiAJdW5zaWduZWQgaW50IGRtYWJ5dGVzdG9tb3ZlWzJdOwkvKiAgaG93IG1hbnkgYnl0ZXMgRE1BIHRyYW5zZmVyICovCiAJaW50IG5leHRfZG1hX2J1ZjsJLyogIHdoaWNoIGJ1ZmZlciBpcyBuZXh0IHRvIHVzZSAqLwogCXVuc2lnbmVkIGludCBkbWFfcnVuc190b19lbmQ7CS8qICBob3cgbWFueSB0aW1lcyB3ZSBtdXN0IHN3aXRjaCBETUEgYnVmZmVycyAqLwogCXVuc2lnbmVkIGludCBsYXN0X2RtYV9ydW47CS8qICBob3cgbWFueSBieXRlcyB0byB0cmFuc2ZlciBvbiBsYXN0IERNQSBidWZmZXIgKi8KIAl1bnNpZ25lZCBpbnQgbWF4XzgxMl9haV9tb2RlMF9yYW5nZXdhaXQ7CS8qICBzZXRsaW5nIHRpbWUgZm9yIGdhaW4gKi8KIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07CS8qICBkYXRhIGZvciBBTyByZWFkYmFjayAqLworCXVuc2lnbmVkIGludCBkaXZpc29yMTsKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CisJdW5zaWduZWQgaW50IHVzZV9kaWZmOjE7CisJdW5zaWduZWQgaW50IHVzZV9tcGM1MDg6MTsKKwl1bnNpZ25lZCBpbnQgdXNlX2V4dF90cmc6MTsKKwl1bnNpZ25lZCBpbnQgYWlfZG1hOjE7CisJdW5zaWduZWQgaW50IGFpX2VvczoxOwogfTsKIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyB2b2lkIHN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLAotCQkJdW5zaWduZWQgaW50IGRpdmlzb3IxLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpOwotc3RhdGljIHZvaWQgc2V0dXBfcmFuZ2VfY2hhbm5lbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXVuc2lnbmVkIGludCByYW5nZWNoYW4sIGNoYXIgd2FpdCk7Ci1zdGF0aWMgaW50IHBjbDgxMl9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2w4MTJfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY2w4MTJfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgYm9vbCBsb2FkX3RpbWVycykKIHsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG47Ci0JaW50IHRpbWVvdXQsIGhpOworCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODEyX1RJTUVSX0JBU0U7CiAKLQkvKiBzZWxlY3Qgc29mdHdhcmUgdHJpZ2dlciAqLwotCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0JLyogIHNlbGVjdCBjaGFubmVsIGFuZCByZW5nZSAqLwotCXNldHVwX3JhbmdlX2NoYW5uZWwoZGV2LCBzLCBpbnNuLT5jaGFuc3BlYywgMSk7Ci0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCQkvKiBzdGFydCBjb252ZXJzaW9uICovCi0JCW91dGIoMjU1LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TT0ZUVFJJRyk7Ci0JCXVkZWxheSg1KTsKLQkJdGltZW91dCA9IDUwOwkvKiB3YWl0IG1heCA1MHVzLCBpdCBtdXN0IGZpbmlzaCB1bmRlciAzM3VzICovCi0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWhpID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0hJKTsKLQkJCWlmICghKGhpICYgUENMODEyX0RSRFkpKQotCQkJCWdvdG8gY29udl9maW5pc2g7Ci0JCQl1ZGVsYXkoMSk7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwl1ZGVsYXkoMSk7CisKKwlpZiAobG9hZF90aW1lcnMpIHsKKwkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOworCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwY2w4MTJfYWlfc2V0dXBfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgZG1hX2ZsYWdzOworCXVuc2lnbmVkIGludCBieXRlczsKKworCS8qICB3ZSB1c2UgRU9TLCBzbyBhZGFwdCBETUEgYnVmZmVyIHRvIG9uZSBzY2FuICovCisJaWYgKGRldnByaXYtPmFpX2VvcykgeworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9CisJCQljbWQtPmNoYW5saXN0X2xlbiAqIHNpemVvZihzaG9ydCk7CisJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0KKwkJCWNtZC0+Y2hhbmxpc3RfbGVuICogc2l6ZW9mKHNob3J0KTsKKwkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID0gMTsKKwl9IGVsc2UgeworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9IGRldnByaXYtPmh3ZG1hc2l6ZTsKKwkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPSBkZXZwcml2LT5od2RtYXNpemU7CisJCWlmIChzLT5hc3luYy0+cHJlYWxsb2NfYnVmc3ogPCBkZXZwcml2LT5od2RtYXNpemUpIHsKKwkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KKwkJCQlzLT5hc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9CisJCQkJcy0+YXN5bmMtPnByZWFsbG9jX2J1ZnN6OwogCQl9Ci0JCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsICJBL0QgaW5zbiByZWFkIHRpbWVvdXRcbiIpOwotCQlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCQlyZXR1cm4gLUVUSU1FOworCQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUpIHsKKwkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiAgaG93IG1hbnkgc2FtcGxlcyB3ZSBtdXN0IHRyYW5zZmVyPyAqLworCQkJYnl0ZXMgPSBjbWQtPmNoYW5saXN0X2xlbiAqCisJCQkJY21kLT5zdG9wX2FyZyAqIHNpemVvZihzaG9ydCk7CiAKLWNvbnZfZmluaXNoOgotCQlkYXRhW25dID0gKChoaSAmIDB4ZikgPDwgOCkgfCBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQURfTE8pOwotCX0KLQlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCXJldHVybiBuOwotfQorCQkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KKwkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9CisJCQkJYnl0ZXMgLyBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXTsKIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgYWNsODIxNl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlpbnQgbjsKLQlpbnQgdGltZW91dDsKLQotCS8qIHNlbGVjdCBzb2Z0d2FyZSB0cmlnZ2VyICovCi0Jb3V0YigxLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQkvKiAgc2VsZWN0IGNoYW5uZWwgYW5kIHJlbmdlICovCi0Jc2V0dXBfcmFuZ2VfY2hhbm5lbChkZXYsIHMsIGluc24tPmNoYW5zcGVjLCAxKTsKLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KLQkJb3V0YigyNTUsIGRldi0+aW9iYXNlICsgUENMODEyX1NPRlRUUklHKTsKLQkJdWRlbGF5KDUpOwotCQl0aW1lb3V0ID0gNTA7CS8qIHdhaXQgbWF4IDUwdXMsIGl0IG11c3QgZmluaXNoIHVuZGVyIDMzdXMgKi8KLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgQUNMODIxNl9TVEFUVVMpICYgQUNMODIxNl9EUkRZKSkKLQkJCQlnb3RvIGNvbnZfZmluaXNoOwotCQkJdWRlbGF5KDEpOworCQkJLyogb24gbGFzdCBkbWEgdHJhbnNmZXIgbXVzdCBiZSBtb3ZlZCAqLworCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuID0KKwkJCQlieXRlcyAlIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdOworCQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9PSAwKQorCQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KKwkJCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuOworCQkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07CiAJCX0KLQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkEvRCBpbnNuIHJlYWQgdGltZW91dFxuIik7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0JCXJldHVybiAtRVRJTUU7Ci0KLWNvbnZfZmluaXNoOgotCQlkYXRhW25dID0KLQkJICAgIChpbmIoZGV2LT5pb2Jhc2UgKwotCQkJIFBDTDgxMl9BRF9ISSkgPDwgOCkgfCBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQURfTE8pOwogCX0KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX01PREUpOwotCXJldHVybiBuOworCWlmIChkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA+IGRldnByaXYtPmh3ZG1hc2l6ZSkgeworCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9IGRldnByaXYtPmh3ZG1hc2l6ZTsKKwkJZGV2cHJpdi0+YWlfZW9zID0gMDsKKwl9CisJaWYgKGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID4gZGV2cHJpdi0+aHdkbWFzaXplKSB7CisJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0gZGV2cHJpdi0+aHdkbWFzaXplOworCQlkZXZwcml2LT5haV9lb3MgPSAwOworCX0KKwlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAwOworCXNldF9kbWFfbW9kZShkZXZwcml2LT5kbWEsIERNQV9NT0RFX1JFQUQpOworCWRtYV9mbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGRldnByaXYtPmRtYSk7CisJc2V0X2RtYV9hZGRyKGRldnByaXYtPmRtYSwgZGV2cHJpdi0+aHdkbWFwdHJbMF0pOworCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSk7CisJcmVsZWFzZV9kbWFfbG9jayhkbWFfZmxhZ3MpOworCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgcGNsODEyX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKK3N0YXRpYyB2b2lkIHBjbDgxMl9haV9zZXR1cF9uZXh0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBkbWFfZmxhZ3M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7Ci0JCW91dGIoKGRhdGFbaV0gJiAweGZmKSwKLQkJICAgICBkZXYtPmlvYmFzZSArIChjaGFuID8gUENMODEyX0RBMl9MTyA6IFBDTDgxMl9EQTFfTE8pKTsKLQkJb3V0YigoZGF0YVtpXSA+PiA4KSAmIDB4MGYsCi0JCSAgICAgZGV2LT5pb2Jhc2UgKyAoY2hhbiA/IFBDTDgxMl9EQTJfSEkgOiBQQ0w4MTJfREExX0hJKSk7Ci0JCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKKwlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmOworCWRpc2FibGVfZG1hKGRldnByaXYtPmRtYSk7CisJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7CisJZG1hX2ZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKKwlpZiAoZGV2cHJpdi0+YWlfZW9zKSB7CisJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLAorCQkJICAgICAgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXSk7CisJfSBlbHNlIHsKKwkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCkgeworCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCisJCQkJICAgICAgZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbZGV2cHJpdi0+CisJCQkJCQkJICAgICAgbmV4dF9kbWFfYnVmXSk7CisJCX0gZWxzZSB7CisJCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+bGFzdF9kbWFfcnVuKTsKKwkJfQorCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKIAl9Ci0KLQlyZXR1cm4gaTsKKwlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7CisJZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2w4MTJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2Uoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuc3BlYywgY2hhciB3YWl0KQogewogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWludCBpOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihjaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoY2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBtdXggPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKLQkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCWlmIChjaGFuc3BlYyA9PSBkZXZwcml2LT5sYXN0X2FpX2NoYW5zcGVjKQorCQlyZXR1cm47CiAKLQlyZXR1cm4gaTsKLX0KKwlkZXZwcml2LT5sYXN0X2FpX2NoYW5zcGVjID0gY2hhbnNwZWM7CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IHBjbDgxMl9kaV9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlkYXRhWzFdID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0RJX0xPKTsKLQlkYXRhWzFdIHw9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9ESV9ISSkgPDwgODsKLQotCXJldHVybiBpbnNuLT5uOwotfQotCi1zdGF0aWMgaW50IHBjbDgxMl9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkgewotCQlvdXRiKHMtPnN0YXRlICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTE8pOwotCQlvdXRiKChzLT5zdGF0ZSA+PiA4KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fSEkpOworCWlmIChkZXZwcml2LT51c2VfbXBjNTA4KSB7CisJCWlmIChkZXZwcml2LT51c2VfZGlmZikgeworCQkJbXV4IHw9IFBDTDgxMl9NVVhfQ1MwIHwgUENMODEyX01VWF9DUzE7CisJCX0gZWxzZSB7CisJCQlpZiAoY2hhbiA8IDgpCisJCQkJbXV4IHw9IFBDTDgxMl9NVVhfQ1MwOworCQkJZWxzZQorCQkJCW11eCB8PSBQQ0w4MTJfTVVYX0NTMTsKKwkJfQogCX0KIAotCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKwlvdXRiKG11eCB8IFBDTDgxMl9NVVhfQ0hBTihjaGFuKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTVVYX1JFRyk7CisJb3V0YihyYW5nZSArIGRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24sIGRldi0+aW9iYXNlICsgUENMODEyX1JBTkdFX1JFRyk7CiAKLQlyZXR1cm4gaW5zbi0+bjsKKwlpZiAod2FpdCkKKwkJLyoKKwkJICogWFhYIHRoaXMgZGVwZW5kcyBvbiBzZWxlY3RlZCByYW5nZSBhbmQgY2FuIGJlIHZlcnkgbG9uZyBmb3IKKwkJICogc29tZSBoaWdoIGdhaW4gcmFuZ2VzIQorCQkgKi8KKwkJdWRlbGF5KGRldnByaXYtPm1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0KTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KK3N0YXRpYyB2b2lkIHBjbDgxMl9haV9jbGVhcl9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiB3cml0aW5nIGFueSB2YWx1ZSBjbGVhcnMgdGhlIGludGVycnVwdCByZXF1ZXN0ICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TVEFUVVNfUkVHKTsKK30KKworc3RhdGljIHZvaWQgcGNsODEyX2FpX3NvZnRfdHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIHdyaXRpbmcgYW55IHZhbHVlIHRyaWdnZXJzIGEgc29mdHdhcmUgY29udmVyc2lvbiAqLworCW91dGIoMjU1LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9TT0ZUVFJJR19SRUcpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBjbDgxMl9haV9nZXRfc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FJX01TQl9SRUcpIDw8IDg7CisJdmFsIHw9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BSV9MU0JfUkVHKTsKKworCXJldHVybiB2YWwgJiBzLT5tYXhkYXRhOworfQorCitzdGF0aWMgaW50IHBjbDgxMl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlpZiAocy0+bWF4ZGF0YSA+IDB4MGZmZikgeworCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfU1RBVFVTX1JFRyk7CisJCWlmICgoc3RhdHVzICYgUENMODEyX1NUQVRVU19EUkRZKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FJX01TQl9SRUcpOworCQlpZiAoKHN0YXR1cyAmIFBDTDgxMl9BSV9NU0JfRFJEWSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHBjbDgxMl9haV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewpAQCAtNTQ1LDcgKzcyMSw3IEBACiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBmbGFnczsKLQlpbnQgdG1wLCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IHRtcDsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIApAQCAtNjAwLDggKzc3Niw5IEBACiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoYm9hcmQtPmk4MjU0X29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAorCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzJNSFosCisJCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKIAkJCQkJICAmY21kLT5jb252ZXJ0X2FyZywgY21kLT5mbGFncyk7CiAJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgYm9hcmQtPmFpX25zX21pbikKIAkJCWNtZC0+Y29udmVydF9hcmcgPSBib2FyZC0+YWlfbnNfbWluOwpAQCAtNjE1LDU0ICs3OTIsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNsODEyX2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQljb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDAsIGksIGRtYV9mbGFncywgYnl0ZXM7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjdHJsID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChkZXZwcml2LT51c2VfZXh0X3RyZykgewotCQlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX0VYVCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfVElNRVIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGNtZC0+c2Nhbl9lbmRfc3JjICE9IFRSSUdfQ09VTlQpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gTUFYX0NIQU5MSVNUX0xFTikKLQkJcmV0dXJuIC1FSU5WQUw7CisJcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IGJvYXJkLT5haV9uc19taW4pCi0JCQljbWQtPmNvbnZlcnRfYXJnID0gYm9hcmQtPmFpX25zX21pbjsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihib2FyZC0+aTgyNTRfb3NjX2Jhc2UsCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCi0JCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwotCX0KLQotCXN0YXJ0X3BhY2VyKGRldiwgLTEsIDAsIDApOwkvKiAgc3RvcCBwYWNlciAqLwotCi0JZGV2cHJpdi0+YWlfbl9jaGFuID0gY21kLT5jaGFubGlzdF9sZW47Ci0JbWVtY3B5KGRldnByaXYtPmFpX2NoYW5saXN0LCBjbWQtPmNoYW5saXN0LAotCSAgICAgICBzaXplb2YodW5zaWduZWQgaW50KSAqIGNtZC0+c2Nhbl9lbmRfYXJnKTsKLQkvKiAgc2VsZWN0IGZpcnN0IGNoYW5uZWwgYW5kIHJhbmdlICovCi0Jc2V0dXBfcmFuZ2VfY2hhbm5lbChkZXYsIHMsIGRldnByaXYtPmFpX2NoYW5saXN0WzBdLCAxKTsKKwlwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBjbWQtPmNoYW5saXN0WzBdLCAxKTsKIAogCWlmIChkZXZwcml2LT5kbWEpIHsJLyogIGNoZWNrIGlmIHdlIGNhbiB1c2UgRE1BIHRyYW5zZmVyICovCiAJCWRldnByaXYtPmFpX2RtYSA9IDE7Ci0JCWZvciAoaSA9IDE7IGkgPCBkZXZwcml2LT5haV9uX2NoYW47IGkrKykKLQkJCWlmIChkZXZwcml2LT5haV9jaGFubGlzdFswXSAhPSBkZXZwcml2LT5haV9jaGFubGlzdFtpXSkgeworCQlmb3IgKGkgPSAxOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykKKwkJCWlmIChjbWQtPmNoYW5saXN0WzBdICE9IGNtZC0+Y2hhbmxpc3RbaV0pIHsKIAkJCQkvKiAgd2UgY2Fubid0IHVzZSBETUEgOi0oICovCiAJCQkJZGV2cHJpdi0+YWlfZG1hID0gMDsKIAkJCQlicmVhazsKQEAgLTY3MCwyMTIgKzgxNCwxMDUgQEAKIAl9IGVsc2UKIAkJZGV2cHJpdi0+YWlfZG1hID0gMDsKIAotCWRldnByaXYtPmFpX2ZsYWdzID0gY21kLT5mbGFnczsKLQlkZXZwcml2LT5haV9kYXRhX2xlbiA9IHMtPmFzeW5jLT5wcmVhbGxvY19idWZzejsKLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gY21kLT5zdG9wX2FyZzsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAwOwotCX0gZWxzZSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gMDsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAxOwotCX0KLQogCWRldnByaXYtPmFpX2FjdF9zY2FuID0gMDsKIAlkZXZwcml2LT5haV9wb2xsX3B0ciA9IDA7CiAJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKIAogCS8qICBkb24ndCB3ZSB3YW50IHdha2UgdXAgZXZlcnkgc2Nhbj8gKi8KLQlpZiAoKGRldnByaXYtPmFpX2ZsYWdzICYgVFJJR19XQUtFX0VPUykpIHsKKwlpZiAoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpIHsKIAkJZGV2cHJpdi0+YWlfZW9zID0gMTsKIAogCQkvKiAgRE1BIGlzIHVzZWxlc3MgZm9yIHRoaXMgc2l0dWF0aW9uICovCi0JCWlmIChkZXZwcml2LT5haV9uX2NoYW4gPT0gMSkKKwkJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID09IDEpCiAJCQlkZXZwcml2LT5haV9kbWEgPSAwOwogCX0KIAotCWlmIChkZXZwcml2LT5haV9kbWEpIHsKLQkJLyogIHdlIHVzZSBFT1MsIHNvIGFkYXB0IERNQSBidWZmZXIgdG8gb25lIHNjYW4gKi8KLQkJaWYgKGRldnByaXYtPmFpX2VvcykgewotCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPQotCQkJICAgIGRldnByaXYtPmFpX25fY2hhbiAqIHNpemVvZihzaG9ydCk7Ci0JCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVsxXSA9Ci0JCQkgICAgZGV2cHJpdi0+YWlfbl9jaGFuICogc2l6ZW9mKHNob3J0KTsKLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXSA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0gZGV2cHJpdi0+aHdkbWFzaXplWzFdOwotCQkJaWYgKGRldnByaXYtPmFpX2RhdGFfbGVuIDwgZGV2cHJpdi0+aHdkbWFzaXplWzBdKQotCQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KLQkJCQkgICAgZGV2cHJpdi0+YWlfZGF0YV9sZW47Ci0JCQlpZiAoZGV2cHJpdi0+YWlfZGF0YV9sZW4gPCBkZXZwcml2LT5od2RtYXNpemVbMV0pCi0JCQkJZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPQotCQkJCSAgICBkZXZwcml2LT5haV9kYXRhX2xlbjsKLQkJCWlmIChkZXZwcml2LT5haV9uZXZlcmVuZGluZykgewotCQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCS8qICBob3cgbWFueSBzYW1wbGVzIHdlIG11c3QgdHJhbnNmZXI/ICovCi0JCQkJYnl0ZXMgPSBkZXZwcml2LT5haV9uX2NoYW4gKgotCQkJCQlkZXZwcml2LT5haV9zY2FucyAqIHNpemVvZihzaG9ydCk7Ci0KLQkJCQkvKiAgaG93IG1hbnkgRE1BIHBhZ2VzIHdlIG11c3QgZmlsbCAqLwotCQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9Ci0JCQkJCWJ5dGVzIC8gZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF07Ci0KLQkJCQkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCi0JCQkJZGV2cHJpdi0+bGFzdF9kbWFfcnVuID0KLQkJCQkJYnl0ZXMgJSBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVswXTsKLQkJCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID09IDApCi0JCQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0KLQkJCQkJICAgIGRldnByaXYtPmxhc3RfZG1hX3J1bjsKLQkJCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKLQkJCX0KLQkJfQotCQlpZiAoZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMF0gPiBkZXZwcml2LT5od2RtYXNpemVbMF0pIHsKLQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOwotCQkJZGV2cHJpdi0+YWlfZW9zID0gMDsKLQkJfQotCQlpZiAoZGV2cHJpdi0+ZG1hYnl0ZXN0b21vdmVbMV0gPiBkZXZwcml2LT5od2RtYXNpemVbMV0pIHsKLQkJCWRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzFdID0gZGV2cHJpdi0+aHdkbWFzaXplWzFdOwotCQkJZGV2cHJpdi0+YWlfZW9zID0gMDsKLQkJfQotCQlkZXZwcml2LT5uZXh0X2RtYV9idWYgPSAwOwotCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKLQkJZG1hX2ZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQkJY2xlYXJfZG1hX2ZmKGRldnByaXYtPmRtYSk7Ci0JCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyWzBdKTsKLQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlWzBdKTsKLQkJcmVsZWFzZV9kbWFfbG9jayhkbWFfZmxhZ3MpOwotCQllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JfQorCWlmIChkZXZwcml2LT5haV9kbWEpCisJCXBjbDgxMl9haV9zZXR1cF9kbWEoZGV2LCBzKTsKIAogCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgewogCWNhc2UgVFJJR19USU1FUjoKLQkJc3RhcnRfcGFjZXIoZGV2LCAxLCBkaXZpc29yMSwgZGl2aXNvcjIpOworCQlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCB0cnVlKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGRldnByaXYtPmFpX2RtYSkJCQkJCS8qICBsZXQncyBnbyEgKi8KLQkJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAyLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQllbHNlCQkJCQkJCS8qICBsZXQncyBnbyEgKi8KLQkJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCA2LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKKwlpZiAoZGV2cHJpdi0+YWlfZG1hKQorCQljdHJsIHw9IFBDTDgxMl9DVFJMX1BBQ0VSX0RNQV9UUklHOworCWVsc2UKKwkJY3RybCB8PSBQQ0w4MTJfQ1RSTF9QQUNFUl9FT0NfVFJJRzsKKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IGN0cmwsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKIAogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTJfYWlfaW50KGludCBpcnEsIHZvaWQgKmQpCitzdGF0aWMgYm9vbCBwY2w4MTJfYWlfbmV4dF9jaGFuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7Ci0JY2hhciBlcnIgPSAxOwotCXVuc2lnbmVkIGludCBtYXNrLCB0aW1lb3V0OwotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisKKwlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKKwlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisJCWRldnByaXYtPmFpX2FjdF9zY2FuKys7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJICAgIGRldnByaXYtPmFpX2FjdF9zY2FuID49IGNtZC0+c3RvcF9hcmcpIHsKKwkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcGNsODEyX2hhbmRsZV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAl1bnNpZ25lZCBpbnQgbmV4dF9jaGFuOwogCi0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7Ci0KLQl0aW1lb3V0ID0gNTA7CQkvKiB3YWl0IG1heCA1MHVzLCBpdCBtdXN0IGZpbmlzaCB1bmRlciAzM3VzICovCi0JaWYgKGRldnByaXYtPmFpX2lzMTZiKSB7Ci0JCW1hc2sgPSAweGZmZmY7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGluYihkZXYtPmlvYmFzZSArIEFDTDgyMTZfU1RBVFVTKSAmIEFDTDgyMTZfRFJEWSkpIHsKLQkJCQllcnIgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWFzayA9IDB4MGZmZjsKLQkJd2hpbGUgKHRpbWVvdXQtLSkgewotCQkJaWYgKCEoaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0hJKSAmIFBDTDgxMl9EUkRZKSkgewotCQkJCWVyciA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQl9Ci0KLQlpZiAoZXJyKSB7CisJaWYgKHBjbDgxMl9haV9lb2MoZGV2LCBzLCBOVUxMLCAwKSkgewogCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiQS9EIGNtZCBJUlEgd2l0aG91dCBEUkRZIVxuIik7Ci0JCXBjbDgxMl9haV9jYW5jZWwoZGV2LCBzKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQlyZXR1cm47CiAJfQogCi0JY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsCi0JCSAgICAgICAoKGluYihkZXYtPmlvYmFzZSArIFBDTDgxMl9BRF9ISSkgPDwgOCkgfAotCQkJaW5iKGRldi0+aW9iYXNlICsgUENMODEyX0FEX0xPKSkgJiBtYXNrKTsKKwljb21lZGlfYnVmX3B1dChzLT5hc3luYywgcGNsODEyX2FpX2dldF9zYW1wbGUoZGV2LCBzKSk7CiAKIAkvKiBTZXQgdXAgbmV4dCBjaGFubmVsLiBBZGRlZCBieSBhYmJvdHRpIDIwMTAtMDEtMjAsIGJ1dCB1bnRlc3RlZC4gKi8KIAluZXh0X2NoYW4gPSBzLT5hc3luYy0+Y3VyX2NoYW4gKyAxOwotCWlmIChuZXh0X2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKQorCWlmIChuZXh0X2NoYW4gPj0gY21kLT5jaGFubGlzdF9sZW4pCiAJCW5leHRfY2hhbiA9IDA7Ci0JaWYgKGRldnByaXYtPmFpX2NoYW5saXN0W3MtPmFzeW5jLT5jdXJfY2hhbl0gIT0KLQkJCWRldnByaXYtPmFpX2NoYW5saXN0W25leHRfY2hhbl0pCi0JCXNldHVwX3JhbmdlX2NoYW5uZWwoZGV2LCBzLCBkZXZwcml2LT5haV9jaGFubGlzdFtuZXh0X2NoYW5dLCAwKTsKKwlpZiAoY21kLT5jaGFubGlzdFtzLT5hc3luYy0+Y3VyX2NoYW5dICE9IGNtZC0+Y2hhbmxpc3RbbmV4dF9jaGFuXSkKKwkJcGNsODEyX2FpX3NldF9jaGFuX3JhbmdlKGRldiwgY21kLT5jaGFubGlzdFtuZXh0X2NoYW5dLCAwKTsKIAotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQotCXMtPmFzeW5jLT5jdXJfY2hhbiA9IG5leHRfY2hhbjsKLQlpZiAobmV4dF9jaGFuID09IDApIHsJLyogb25lIHNjYW4gZG9uZSAqLwotCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwotCQlpZiAoIShkZXZwcml2LT5haV9uZXZlcmVuZGluZykpCi0JCQkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkJcGNsODEyX2FpX2NhbmNlbChkZXYsIHMpOwotCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCX0KLQl9Ci0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcGNsODEyX2FpX25leHRfY2hhbihkZXYsIHMpOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIHZvaWQgdHJhbnNmZXJfZnJvbV9kbWFfYnVmKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgIHVuc2lnbmVkIHNob3J0ICpwdHIsCiAJCQkJICB1bnNpZ25lZCBpbnQgYnVmcHRyLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCXMtPmFzeW5jLT5ldmVudHMgPSAwOwogCWZvciAoaSA9IGxlbjsgaTsgaS0tKSB7Ci0JCQkJCQkJLyogIGdldCBvbmUgc2FtcGxlICovCiAJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdKTsKIAotCQlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKLQkJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBkZXZwcml2LT5haV9uX2NoYW4pIHsKLQkJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCQlkZXZwcml2LT5haV9hY3Rfc2NhbisrOwotCQkJaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykKLQkJCQkJCQkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkJCXBjbDgxMl9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KKwkJaWYgKCFwY2w4MTJfYWlfbmV4dF9jaGFuKGRldiwgcykpCisJCQlicmVhazsKIAl9Ci0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODEyX2FpX2RtYShpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgcGNsODEyX2hhbmRsZV9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JdW5zaWduZWQgbG9uZyBkbWFfZmxhZ3M7CiAJaW50IGxlbiwgYnVmcHRyOwogCXVuc2lnbmVkIHNob3J0ICpwdHI7CiAKQEAgLTg4Myw1OCArOTIwLDM2IEBACiAJbGVuID0gKGRldnByaXYtPmRtYWJ5dGVzdG9tb3ZlW2RldnByaXYtPm5leHRfZG1hX2J1Zl0gPj4gMSkgLQogCSAgICBkZXZwcml2LT5haV9wb2xsX3B0cjsKIAotCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWY7Ci0JZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKLQlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyW2RldnByaXYtPm5leHRfZG1hX2J1Zl0pOwotCWlmIChkZXZwcml2LT5haV9lb3MpIHsKLQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCi0JCQkgICAgICBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVtkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKLQl9IGVsc2UgewotCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kKSB7Ci0JCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwKLQkJCQkgICAgICBkZXZwcml2LT5kbWFieXRlc3RvbW92ZVtkZXZwcml2LT4KLQkJCQkJCQkgICAgICBuZXh0X2RtYV9idWZdKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5sYXN0X2RtYV9ydW4pOwotCQl9Ci0JCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwotCX0KLQlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7Ci0JZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLworCXBjbDgxMl9haV9zZXR1cF9uZXh0X2RtYShkZXYsIHMpOwogCiAJYnVmcHRyID0gZGV2cHJpdi0+YWlfcG9sbF9wdHI7CiAJZGV2cHJpdi0+YWlfcG9sbF9wdHIgPSAwOwogCiAJdHJhbnNmZXJfZnJvbV9kbWFfYnVmKGRldiwgcywgcHRyLCBidWZwdHIsIGxlbik7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxMihpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIGlycXJldHVybl90IHBjbDgxMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCiAJaWYgKCFkZXYtPmF0dGFjaGVkKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJzcHVyaW91cyBpbnRlcnJ1cHQiKTsKKwkJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQorCiAJaWYgKGRldnByaXYtPmFpX2RtYSkKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MTJfYWlfZG1hKGlycSwgZCk7CisJCXBjbDgxMl9oYW5kbGVfZG1hKGRldiwgcyk7CiAJZWxzZQotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxMl9haV9pbnQoaXJxLCBkKTsKKwkJcGNsODEyX2hhbmRsZV9lb2MoZGV2LCBzKTsKKworCXBjbDgxMl9haV9jbGVhcl9lb2MoZGV2KTsKKworCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIGludCBwY2w4MTJfYWlfcG9sbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC05NzksNzIgKzk5NCw2IEBACiAJcmV0dXJuIHMtPmFzeW5jLT5idWZfd3JpdGVfY291bnQgLSBzLT5hc3luYy0+YnVmX3JlYWRfY291bnQ7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgdm9pZCBzZXR1cF9yYW5nZV9jaGFubmVsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJdW5zaWduZWQgaW50IHJhbmdlY2hhbiwgY2hhciB3YWl0KQotewotCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBjaGFyIGNoYW5fcmVnID0gQ1JfQ0hBTihyYW5nZWNoYW4pOwkvKiAgbm9ybWFsIGJvYXJkICovCi0JCQkJCQkJLyogIGdhaW4gaW5kZXggKi8KLQl1bnNpZ25lZCBjaGFyIGdhaW5fcmVnID0gQ1JfUkFOR0UocmFuZ2VjaGFuKSArCi0JCQkJIGRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb247Ci0KLQlpZiAoKGNoYW5fcmVnID09IGRldnByaXYtPm9sZF9jaGFuX3JlZykKLQkgICAgJiYgKGdhaW5fcmVnID09IGRldnByaXYtPm9sZF9nYWluX3JlZykpCi0JCXJldHVybjsJCS8qICB3ZSBjYW4gcmV0dXJuLCBubyBjaGFuZ2UgKi8KLQotCWRldnByaXYtPm9sZF9jaGFuX3JlZyA9IGNoYW5fcmVnOwotCWRldnByaXYtPm9sZF9nYWluX3JlZyA9IGdhaW5fcmVnOwotCi0JaWYgKGRldnByaXYtPnVzZV9NUEMpIHsKLQkJaWYgKGRldnByaXYtPnVzZV9kaWZmKSB7Ci0JCQljaGFuX3JlZyA9IGNoYW5fcmVnIHwgMHgzMDsJLyogIERJRkYgaW5wdXRzICovCi0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hhbl9yZWcgJiAweDgwKQotCQkJCQkJCS8qICBTRSBpbnB1dHMgOC0xNSAqLwotCQkJCWNoYW5fcmVnID0gY2hhbl9yZWcgfCAweDIwOwotCQkJZWxzZQotCQkJCQkJCS8qICBTRSBpbnB1dHMgMC03ICovCi0JCQkJY2hhbl9yZWcgPSBjaGFuX3JlZyB8IDB4MTA7Ci0JCX0KLQl9Ci0KLQlvdXRiKGNoYW5fcmVnLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NVVgpOwkvKiBzZWxlY3QgY2hhbm5lbCAqLwotCW91dGIoZ2Fpbl9yZWcsIGRldi0+aW9iYXNlICsgUENMODEyX0dBSU4pOwkvKiBzZWxlY3QgZ2FpbiAqLwotCi0KLQlpZiAod2FpdCkKLQkJLyoKLQkJICogWFhYIHRoaXMgZGVwZW5kcyBvbiBzZWxlY3RlZCByYW5nZSBhbmQgY2FuIGJlIHZlcnkgbG9uZyBmb3IKLQkJICogc29tZSBoaWdoIGdhaW4gcmFuZ2VzIQotCQkgKi8KLQkJdWRlbGF5KGRldnByaXYtPm1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0KTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyB2b2lkIHN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLAotCQkJdW5zaWduZWQgaW50IGRpdmlzb3IxLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjIpCi17Ci0Jb3V0YigweGI0LCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJDVEwpOwotCW91dGIoMHg3NCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ1RSQ1RMKTsKLQl1ZGVsYXkoMSk7Ci0KLQlpZiAobW9kZSA9PSAxKSB7Ci0JCW91dGIoZGl2aXNvcjIgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFIyKTsKLQkJb3V0YigoZGl2aXNvcjIgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFIyKTsKLQkJb3V0YihkaXZpc29yMSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUjEpOwotCQlvdXRiKChkaXZpc29yMSA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0NUUjEpOwotCX0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNsODEyX2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewpAQCAtMTA1MiwxMzEgKzEwMDEsMzAxIEBACiAKIAlpZiAoZGV2cHJpdi0+YWlfZG1hKQogCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQkJCQkJCQkvKiBTdG9wIEEvRCAqLwotCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfTU9ERSk7Ci0Jc3RhcnRfcGFjZXIoZGV2LCAtMSwgMCwgMCk7CS8qICBzdG9wIDgyNTQgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCisKKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKwlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOwogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLworc3RhdGljIGludCBwY2w4MTJfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX1NPRlRfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKworCXBjbDgxMl9haV9zZXRfY2hhbl9yYW5nZShkZXYsIGluc24tPmNoYW5zcGVjLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOworCQlwY2w4MTJfYWlfc29mdF90cmlnKGRldik7CisKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBwY2w4MTJfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWRhdGFbaV0gPSBwY2w4MTJfYWlfZ2V0X3NhbXBsZShkZXYsIHMpOworCX0KKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKwlwY2w4MTJfYWlfY2xlYXJfZW9jKGRldik7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTJfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCW91dGIoKGRhdGFbaV0gJiAweGZmKSwKKwkJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9BT19MU0JfUkVHKGNoYW4pKTsKKwkJb3V0YigoZGF0YVtpXSA+PiA4KSAmIDB4MGYsCisJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQU9fTVNCX1JFRyhjaGFuKSk7CisJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxMl9kaV9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRElfTFNCX1JFRykgfAorCQkgIChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRElfTVNCX1JFRykgPDwgOCk7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MTJfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpIHsKKwkJb3V0YihzLT5zdGF0ZSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0xTQl9SRUcpOworCQlvdXRiKChzLT5zdGF0ZSA+PiA4KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTVNCX1JFRyk7CisJfQorCisJZGF0YVsxXSA9IHMtPnN0YXRlOworCisJcmV0dXJuIGluc24tPm47Cit9CisKIHN0YXRpYyB2b2lkIHBjbDgxMl9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBwY2w4MTJfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuOwogCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NVVgpOwotCW91dGIoMCArIGRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24sIGRldi0+aW9iYXNlICsgUENMODEyX0dBSU4pOwotCWRldnByaXYtPm9sZF9jaGFuX3JlZyA9IC0xOwkvKiAgaW52YWxpZGF0ZSBjaGFpbi9nYWluIG1lbW9yeSAqLwotCWRldnByaXYtPm9sZF9nYWluX3JlZyA9IC0xOworCS8qIGRpc2FibGUgYW5hbG9nIGlucHV0IHRyaWdnZXIgKi8KKwlvdXRiKGRldnByaXYtPm1vZGVfcmVnX2ludCB8IFBDTDgxMl9DVFJMX0RJU0FCTEVfVFJJRywKKwkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKKwlwY2w4MTJfYWlfY2xlYXJfZW9jKGRldik7CiAKKwkvKiBzdG9wIHBhY2VyICovCisJaWYgKGJvYXJkLT5JUlFiaXRzKQorCQlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisKKwkvKgorCSAqIEludmFsaWRhdGUgbGFzdF9haV9jaGFuc3BlYyB0aGVuIHNldCBhbmFsb2cgaW5wdXQgdG8KKwkgKiBrbm93biBjaGFubmVsL3JhbmdlLgorCSAqLworCWRldnByaXYtPmxhc3RfYWlfY2hhbnNwZWMgPSBDUl9QQUNLKDE2LCAwLCAwKTsKKwlwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBDUl9QQUNLKDAsIDAsIDApLCAwKTsKKworCS8qIHNldCBhbmFsb2cgb3V0cHV0IGNoYW5uZWxzIHRvIDBWICovCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IGJvYXJkLT5uX2FvY2hhbjsgY2hhbisrKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQU9fTFNCX1JFRyhjaGFuKSk7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQU9fTVNCX1JFRyhjaGFuKSk7CisJfQorCisJLyogc2V0IGFsbCBkaWdpdGFsIG91dHB1dHMgbG93ICovCisJaWYgKGJvYXJkLT5oYXNfZGlvKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTVNCX1JFRyk7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fTFNCX1JFRyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwY2w4MTJfc2V0X2FpX3JhbmdlX3RhYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICAgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWNvbnN0IHN0cnVjdCBwY2w4MTJfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CisJc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCisJLyogZGVmYXVsdCB0byB0aGUgcmFuZ2UgdGFibGUgZnJvbSB0aGUgYm9hcmRpbmZvICovCisJcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+cmFuZ2VsaXN0X2FpOworCisJLyogbm93IGNoZWNrIHRoZSB1c2VyIGNvbmZpZyBvcHRpb24gYmFzZWQgb24gdGhlIGJvYXJkdHlwZSAqLwogCXN3aXRjaCAoYm9hcmQtPmJvYXJkX3R5cGUpIHsKIAljYXNlIGJvYXJkUENMODEyUEc6CisJCWlmIChpdC0+b3B0aW9uc1s0XSA9PSAxKQorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODEycGcyX2FpOworCQlicmVhazsKIAljYXNlIGJvYXJkUENMODEyOgotCWNhc2UgYm9hcmRBQ0w4MTEyOgotCWNhc2UgYm9hcmRBQ0w4MjE2OgotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RBMl9MTyk7Ci0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfREEyX0hJKTsKLQljYXNlIGJvYXJkQTgyMToKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9EQTFfTE8pOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RBMV9ISSk7Ci0JCXN0YXJ0X3BhY2VyKGRldiwgLTEsIDAsIDApOwkvKiAgc3RvcCA4MjU0ICovCi0JCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfRE9fSEkpOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODEyX0RPX0xPKTsKLQkJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCAwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9NT0RFKTsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxMl9DTFJJTlQpOworCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzRdKSB7CisJCWNhc2UgMDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyNTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMl81OworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIxXzI1OworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIwXzYyNTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTgxMl9iaXBvbGFyMF8zMTI1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIGJvYXJkUENMODEzQjoKLQljYXNlIGJvYXJkUENMODEzOgorCQlpZiAoaXQtPm9wdGlvbnNbMV0gPT0gMSkKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3BjbDgxM2IyX2FpOworCQlicmVhazsKIAljYXNlIGJvYXJkSVNPODEzOgorCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzFdKSB7CisJCWNhc2UgMDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xX2FpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xXzJfYWk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfaXNvODEzXzJfYWk7CisJCQlkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMl8yX2FpOworCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xX2FpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBib2FyZEFDTDgxMTM6Ci0JCXVkZWxheSg1KTsKKwkJc3dpdGNoIChpdC0+b3B0aW9uc1sxXSkgeworCQljYXNlIDA6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzFfYWk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18xXzJfYWk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18yX2FpOworCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18yXzJfYWk7CisJCQlkZXZwcml2LT5yYW5nZV9jb3JyZWN0aW9uID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18xX2FpOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJfQotCXVkZWxheSg1KTsKIH0KIAogc3RhdGljIGludCBwY2w4MTJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKIHsKIAljb25zdCBzdHJ1Y3QgcGNsODEyX2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdjsKLQlpbnQgcmV0LCBzdWJkZXY7Ci0JdW5zaWduZWQgaW50IGRtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCBuX3N1YmRldmljZXM7Ci0KLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgYm9hcmQtPmlvX3JhbmdlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWludCBzdWJkZXY7CisJaW50IHJldDsKKwlpbnQgaTsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmICgoMSA8PCBpdC0+b3B0aW9uc1sxXSkgJiBib2FyZC0+SVJRYml0cykgewotCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgaW50ZXJydXB0X3BjbDgxMiwgMCwKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIHBjbDgxMl9pbnRlcnJ1cHQsIDAsCiAJCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7CiAJCWlmIChyZXQgPT0gMCkKIAkJCWRldi0+aXJxID0gaXQtPm9wdGlvbnNbMV07CiAJfQogCi0JZG1hID0gMDsKLQlkZXZwcml2LT5kbWEgPSBkbWE7Ci0JaWYgKCFkZXYtPmlycSkKLQkJZ290byBub19kbWE7CS8qIGlmIHdlIGhhdmVuJ3QgSVJRLCB3ZSBjYW4ndCB1c2UgRE1BICovCi0JaWYgKGJvYXJkLT5ETUFiaXRzICE9IDApIHsJLyogYm9hcmQgc3VwcG9ydCBETUEgKi8KLQkJZG1hID0gaXQtPm9wdGlvbnNbMl07Ci0JCWlmICgoKDEgPDwgZG1hKSAmIGJvYXJkLT5ETUFiaXRzKSA9PSAwKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJETUEgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIEZBSUwhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwkvKiBCYWQgRE1BICovCi0JCX0KLQkJcmV0ID0gcmVxdWVzdF9kbWEoZG1hLCBkZXYtPmJvYXJkX25hbWUpOworCS8qIHdlIG5lZWQgYW4gSVJRIHRvIGRvIERNQSBvbiBjaGFubmVsIDMgb3IgMSAqLworCWlmIChkZXYtPmlycSAmJiBib2FyZC0+aGFzX2RtYSAmJgorCSAgICAoaXQtPm9wdGlvbnNbMl0gPT0gMyB8fCBpdC0+b3B0aW9uc1syXSA9PSAxKSkgeworCQlyZXQgPSByZXF1ZXN0X2RtYShpdC0+b3B0aW9uc1syXSwgZGV2LT5ib2FyZF9uYW1lKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSAldSwgRkFJTCFcbiIsIGRtYSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwkvKiBETUEgaXNuJ3QgZnJlZSAqLwotCQl9Ci0JCWRldnByaXYtPmRtYSA9IGRtYTsKLQkJcGFnZXMgPSAxOwkvKiB3ZSB3YW50IDhLQiAqLwotCQlkZXZwcml2LT5kbWFidWZbMF0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlswXSkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKLQkJCS8qCi0JCQkgKiBtYXliZSBleHBlcmltZW50IHdpdGggdHJ5X3RvX2ZyZWVfcGFnZXMoKQotCQkJICogd2lsbCBoZWxwIC4uLi4KLQkJCSAqLwotCQkJcmV0dXJuIC1FQlVTWTsJLyogbm8gYnVmZmVyIDotKCAqLwotCQl9Ci0JCWRldnByaXYtPmRtYXBhZ2VzWzBdID0gcGFnZXM7Ci0JCWRldnByaXYtPmh3ZG1hcHRyWzBdID0gdmlydF90b19idXMoKHZvaWQgKilkZXZwcml2LT5kbWFidWZbMF0pOwotCQlkZXZwcml2LT5od2RtYXNpemVbMF0gPSBQQUdFX1NJWkUgKiAoMSA8PCBwYWdlcyk7Ci0JCWRldnByaXYtPmRtYWJ1ZlsxXSA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlcyk7Ci0JCWlmICghZGV2cHJpdi0+ZG1hYnVmWzFdKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciwgRkFJTCFcbiIpOworCQkJCSJ1bmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCAlZFxuIiwKKwkJCQlpdC0+b3B0aW9uc1syXSk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9Ci0JCWRldnByaXYtPmRtYXBhZ2VzWzFdID0gcGFnZXM7Ci0JCWRldnByaXYtPmh3ZG1hcHRyWzFdID0gdmlydF90b19idXMoKHZvaWQgKilkZXZwcml2LT5kbWFidWZbMV0pOwotCQlkZXZwcml2LT5od2RtYXNpemVbMV0gPSBQQUdFX1NJWkUgKiAoMSA8PCBwYWdlcyk7Ci0JfQotbm9fZG1hOgorCQlkZXZwcml2LT5kbWEgPSBpdC0+b3B0aW9uc1syXTsKIAotCW5fc3ViZGV2aWNlcyA9IDA7Ci0JaWYgKGJvYXJkLT5uX2FpY2hhbiA+IDApCi0JCW5fc3ViZGV2aWNlcysrOworCQlkZXZwcml2LT5kbWFwYWdlcyA9IDE7CS8qIHdlIHdhbnQgOEtCICovCisJCWRldnByaXYtPmh3ZG1hc2l6ZSA9ICgxIDw8IGRldnByaXYtPmRtYXBhZ2VzKSAqIFBBR0VfU0laRTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQl1bnNpZ25lZCBsb25nIGRtYWJ1ZjsKKworCQkJZG1hYnVmID0gIF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBkZXZwcml2LT5kbWFwYWdlcyk7CisJCQlpZiAoIWRtYWJ1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJZGV2cHJpdi0+ZG1hYnVmW2ldID0gZG1hYnVmOworCQkJZGV2cHJpdi0+aHdkbWFwdHJbaV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRtYWJ1Zik7CisJCX0KKwl9CisKKwkvKiBkaWZmZXJlbnRpYWwgYW5hbG9nIGlucHV0cz8gKi8KKwlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7CisJY2FzZSBib2FyZEE4MjE6CisJCWlmIChpdC0+b3B0aW9uc1syXSA9PSAxKQorCQkJZGV2cHJpdi0+dXNlX2RpZmYgPSAxOworCQlicmVhazsKKwljYXNlIGJvYXJkQUNMODExMjoKKwljYXNlIGJvYXJkQUNMODIxNjoKKwkJaWYgKGl0LT5vcHRpb25zWzRdID09IDEpCisJCQlkZXZwcml2LT51c2VfZGlmZiA9IDE7CisJCWJyZWFrOworCX0KKworCW5fc3ViZGV2aWNlcyA9IDE7CQkvKiBhbGwgYm9hcmR0eXBlcyBoYXZlIGFuYWxvZyBpbnB1dHMgKi8KIAlpZiAoYm9hcmQtPm5fYW9jaGFuID4gMCkKIAkJbl9zdWJkZXZpY2VzKys7Ci0JaWYgKGJvYXJkLT5uX2RpY2hhbiA+IDApCi0JCW5fc3ViZGV2aWNlcysrOwotCWlmIChib2FyZC0+bl9kb2NoYW4gPiAwKQotCQluX3N1YmRldmljZXMrKzsKKwlpZiAoYm9hcmQtPmhhc19kaW8pCisJCW5fc3ViZGV2aWNlcyArPSAyOwogCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCBuX3N1YmRldmljZXMpOwogCWlmIChyZXQpCkBAIC0xMTg0LDE0NiArMTMwMyw0NyBAQAogCiAJc3ViZGV2ID0gMDsKIAotCS8qIGFuYWxvZyBpbnB1dCAqLwotCWlmIChib2FyZC0+bl9haWNoYW4gPiAwKSB7Ci0JCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOwotCQlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7Ci0JCWNhc2UgYm9hcmRBODIxOgotCQkJaWYgKGl0LT5vcHRpb25zWzJdID09IDEpIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fZGlmZjsKLQkJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0RJRkY7Ci0JCQkJZGV2cHJpdi0+dXNlX2RpZmYgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW47Ci0JCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9HUk9VTkQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBib2FyZEFDTDgxMTI6Ci0JCWNhc2UgYm9hcmRBQ0w4MjE2OgotCQkJaWYgKGl0LT5vcHRpb25zWzRdID09IDEpIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fZGlmZjsKLQkJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0RJRkY7Ci0JCQkJZGV2cHJpdi0+dXNlX2RpZmYgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW47Ci0JCQkJcy0+c3ViZGV2X2ZsYWdzIHw9IFNERl9HUk9VTkQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FpY2hhbjsKLQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfR1JPVU5EOwotCQkJYnJlYWs7Ci0JCX0KLQkJcy0+bWF4ZGF0YSA9IGJvYXJkLT5haV9tYXhkYXRhOwotCQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5yYW5nZWxpc3RfYWk7Ci0JCWlmIChib2FyZC0+Ym9hcmRfdHlwZSA9PSBib2FyZEFDTDgyMTYpCi0JCQlzLT5pbnNuX3JlYWQgPSBhY2w4MjE2X2FpX2luc25fcmVhZDsKLQkJZWxzZQotCQkJcy0+aW5zbl9yZWFkID0gcGNsODEyX2FpX2luc25fcmVhZDsKLQotCQlkZXZwcml2LT51c2VfTVBDID0gYm9hcmQtPmhhdmVNUEM1MDg7Ci0JCWlmIChkZXYtPmlycSkgewotCQkJZGV2LT5yZWFkX3N1YmRldiA9IHM7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOwotCQkJcy0+bGVuX2NoYW5saXN0ID0gTUFYX0NIQU5MSVNUX0xFTjsKLQkJCXMtPmRvX2NtZHRlc3QgPSBwY2w4MTJfYWlfY21kdGVzdDsKLQkJCXMtPmRvX2NtZCA9IHBjbDgxMl9haV9jbWQ7Ci0JCQlzLT5wb2xsID0gcGNsODEyX2FpX3BvbGw7Ci0JCQlzLT5jYW5jZWwgPSBwY2w4MTJfYWlfY2FuY2VsOwotCQl9Ci0JCXN3aXRjaCAoYm9hcmQtPmJvYXJkX3R5cGUpIHsKLQkJY2FzZSBib2FyZFBDTDgxMlBHOgotCQkJaWYgKGl0LT5vcHRpb25zWzRdID09IDEpCi0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODEycGcyX2FpOwotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRQQ0w4MTI6Ci0JCQlzd2l0Y2ggKGl0LT5vcHRpb25zWzRdKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIyXzU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U4MTJfYmlwb2xhcjFfMjU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U4MTJfYmlwb2xhcjBfNjI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSA1OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlODEyX2JpcG9sYXIwXzMxMjU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRQQ0w4MTNCOgotCQkJaWYgKGl0LT5vcHRpb25zWzFdID09IDEpCi0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODEzYjJfYWk7Ci0JCQlicmVhazsKLQkJY2FzZSBib2FyZElTTzgxMzoKLQkJCXN3aXRjaCAoaXQtPm9wdGlvbnNbMV0pIHsKLQkJCWNhc2UgMDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV9haTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9pc284MTNfMV8yX2FpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18yX2FpOwotCQkJCWRldnByaXYtPnJhbmdlX2NvcnJlY3Rpb24gPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18yXzJfYWk7Ci0JCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2lzbzgxM18xX2FpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgYm9hcmRBQ0w4MTEzOgotCQkJc3dpdGNoIChpdC0+b3B0aW9uc1sxXSkgewotCQkJY2FzZSAwOgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMV9haTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzFfMl9haTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9hY2w4MTEzXzJfYWk7Ci0JCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYWNsODExM18yXzJfYWk7Ci0JCQkJZGV2cHJpdi0+cmFuZ2VfY29ycmVjdGlvbiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2FjbDgxMTNfMV9haTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXN1YmRldisrOworCS8qIEFuYWxvZyBJbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCWlmIChkZXZwcml2LT51c2VfZGlmZikgeworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0RJRkY7CisJCXMtPm5fY2hhbgk9IGJvYXJkLT5uX2FpY2hhbiAvIDI7CisJfSBlbHNlIHsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9HUk9VTkQ7CisJCXMtPm5fY2hhbgk9IGJvYXJkLT5uX2FpY2hhbjsKIAl9CisJcy0+bWF4ZGF0YQk9IGJvYXJkLT5oYXNfMTZiaXRfYWkgPyAweGZmZmYgOiAweDBmZmY7CisKKwlwY2w4MTJfc2V0X2FpX3JhbmdlX3RhYmxlKGRldiwgcywgaXQpOworCisJcy0+aW5zbl9yZWFkCT0gcGNsODEyX2FpX2luc25fcmVhZDsKKworCWlmIChkZXYtPmlycSkgeworCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9DTURfUkVBRDsKKwkJcy0+bGVuX2NoYW5saXN0CT0gTUFYX0NIQU5MSVNUX0xFTjsKKwkJcy0+ZG9fY21kdGVzdAk9IHBjbDgxMl9haV9jbWR0ZXN0OworCQlzLT5kb19jbWQJPSBwY2w4MTJfYWlfY21kOworCQlzLT5wb2xsCQk9IHBjbDgxMl9haV9wb2xsOworCQlzLT5jYW5jZWwJPSBwY2w4MTJfYWlfY2FuY2VsOworCX0KKworCWRldnByaXYtPnVzZV9tcGM1MDggPSBib2FyZC0+aGFzX21wYzUwOF9tdXg7CisKKwlzdWJkZXYrKzsKIAogCS8qIGFuYWxvZyBvdXRwdXQgKi8KIAlpZiAoYm9hcmQtPm5fYW9jaGFuID4gMCkgewogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOwotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7Ci0JCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FvY2hhbjsKLQkJcy0+bWF4ZGF0YSA9IDB4ZmZmOwotCQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5yYW5nZWxpc3RfYW87Ci0JCXMtPmluc25fcmVhZCA9IHBjbDgxMl9hb19pbnNuX3JlYWQ7Ci0JCXMtPmluc25fd3JpdGUgPSBwY2w4MTJfYW9faW5zbl93cml0ZTsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKKwkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFIHwgU0RGX0dST1VORDsKKwkJcy0+bl9jaGFuCT0gYm9hcmQtPm5fYW9jaGFuOworCQlzLT5tYXhkYXRhCT0gMHhmZmY7CisJCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3VuaXBvbGFyNTsKKwkJcy0+aW5zbl9yZWFkCT0gcGNsODEyX2FvX2luc25fcmVhZDsKKwkJcy0+aW5zbl93cml0ZQk9IHBjbDgxMl9hb19pbnNuX3dyaXRlOwogCQlzd2l0Y2ggKGJvYXJkLT5ib2FyZF90eXBlKSB7CiAJCWNhc2UgYm9hcmRBODIxOgogCQkJaWYgKGl0LT5vcHRpb25zWzNdID09IDEpCkBAIC0xMzQyLDMzICsxMzYyLDMwIEBACiAJCXN1YmRldisrOwogCX0KIAotCS8qIGRpZ2l0YWwgaW5wdXQgKi8KLQlpZiAoYm9hcmQtPm5fZGljaGFuID4gMCkgeworCWlmIChib2FyZC0+aGFzX2RpbykgeworCQkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAqLwogCQlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOwotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKLQkJcy0+bl9jaGFuID0gYm9hcmQtPm5fZGljaGFuOwotCQlzLT5tYXhkYXRhID0gMTsKLQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKLQkJcy0+aW5zbl9iaXRzID0gcGNsODEyX2RpX2luc25fYml0czsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ESTsKKwkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCQlzLT5uX2NoYW4JPSAxNjsKKwkJcy0+bWF4ZGF0YQk9IDE7CisJCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmluc25fYml0cwk9IHBjbDgxMl9kaV9pbnNuX2JpdHM7CiAJCXN1YmRldisrOwotCX0KIAotCS8qIGRpZ2l0YWwgb3V0cHV0ICovCi0JaWYgKGJvYXJkLT5uX2RvY2hhbiA+IDApIHsKKwkJLyogRGlnaXRhbCBPdXRwdXQgc3ViZGV2aWNlICovCiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kb2NoYW47Ci0JCXMtPm1heGRhdGEgPSAxOwotCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCQlzLT5pbnNuX2JpdHMgPSBwY2w4MTJfZG9faW5zbl9iaXRzOworCQlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RPOworCQlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJCXMtPm5fY2hhbgk9IDE2OworCQlzLT5tYXhkYXRhCT0gMTsKKwkJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwkJcy0+aW5zbl9iaXRzCT0gcGNsODEyX2RvX2luc25fYml0czsKIAkJc3ViZGV2Kys7CiAJfQogCiAJc3dpdGNoIChib2FyZC0+Ym9hcmRfdHlwZSkgewogCWNhc2UgYm9hcmRBQ0w4MjE2OgotCQlkZXZwcml2LT5haV9pczE2YiA9IDE7CiAJY2FzZSBib2FyZFBDTDgxMlBHOgogCWNhc2UgYm9hcmRQQ0w4MTI6CiAJY2FzZSBib2FyZEFDTDgxMTI6CkBAIC0xMzkwLDggKzE0MDcsNiBAQAogCQlicmVhazsKIAl9CiAKLQlkZXZwcml2LT52YWxpZCA9IDE7Ci0KIAlwY2w4MTJfcmVzZXQoZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTQwMyw3MiArMTQxOCwxNSBAQAogCiAJaWYgKGRldnByaXYpIHsKIAkJaWYgKGRldnByaXYtPmRtYWJ1ZlswXSkKLQkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzBdLCBkZXZwcml2LT5kbWFwYWdlc1swXSk7CisJCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlswXSwgZGV2cHJpdi0+ZG1hcGFnZXMpOwogCQlpZiAoZGV2cHJpdi0+ZG1hYnVmWzFdKQotCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMV0sIGRldnByaXYtPmRtYXBhZ2VzWzFdKTsKKwkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzFdLCBkZXZwcml2LT5kbWFwYWdlcyk7CiAJCWlmIChkZXZwcml2LT5kbWEpCiAJCQlmcmVlX2RtYShkZXZwcml2LT5kbWEpOwogCX0KIAljb21lZGlfbGVnYWN5X2RldGFjaChkZXYpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjbDgxMl9ib2FyZCBib2FyZHR5cGVzW10gPSB7Ci0JeyJwY2w4MTIiLCBib2FyZFBDTDgxMiwgMTYsIDAsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAzMzAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2JpcG9sYXIxMCwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJwY2w4MTJwZyIsIGJvYXJkUENMODEyUEcsIDE2LCAwLCAyLCAxNiwgMTYsIDB4MGZmZiwKLQkgMzMwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9wY2w4MTJwZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhY2w4MTEycGciLCBib2FyZFBDTDgxMlBHLCAxNiwgMCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEycGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYWNsODExMmRnIiwgYm9hcmRBQ0w4MTEyLCAxNiwgOCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfYWNsODExMmRnX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAxfSwKLQl7ImFjbDgxMTJoZyIsIGJvYXJkQUNMODExMiwgMTYsIDgsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJoZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMX0sCi0JeyJhODIxcGdsIiwgYm9hcmRBODIxLCAxNiwgOCwgMSwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEzYl9haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHgwMDBjLCAweDAwLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhODIxcGdsbmRhIiwgYm9hcmRBODIxLCAxNiwgOCwgMCwgMCwgMCwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX3BjbDgxM2JfYWksIE5VTEwsCi0JIDB4MDAwYywgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYTgyMXBnaCIsIGJvYXJkQTgyMSwgMTYsIDgsIDEsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2E4MjFwZ2hfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4MDAwYywgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiYTgyMnBnbCIsIGJvYXJkQUNMODExMiwgMTYsIDgsIDIsIDE2LCAxNiwgMHgwZmZmLAotCSAxMDAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJkZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhODIycGdoIiwgYm9hcmRBQ0w4MTEyLCAxNiwgOCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfYWNsODExMmhnX2FpLCAmcmFuZ2VfdW5pcG9sYXI1LAotCSAweGRjZmMsIDB4MGEsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImE4MjNwZ2wiLCBib2FyZEFDTDgxMTIsIDE2LCA4LCAyLCAxNiwgMTYsIDB4MGZmZiwKLQkgODAwMCwgSTgyNTRfT1NDX0JBU0VfMk1IWiwgJnJhbmdlX2FjbDgxMTJkZ19haSwgJnJhbmdlX3VuaXBvbGFyNSwKLQkgMHhkY2ZjLCAweDBhLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhODIzcGdoIiwgYm9hcmRBQ0w4MTEyLCAxNiwgOCwgMiwgMTYsIDE2LCAweDBmZmYsCi0JIDgwMDAsIEk4MjU0X09TQ19CQVNFXzJNSFosICZyYW5nZV9hY2w4MTEyaGdfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsicGNsODEzIiwgYm9hcmRQQ0w4MTMsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9wY2w4MTNiX2FpLCBOVUxMLAotCSAweDAwMDAsIDB4MDAsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7InBjbDgxM2IiLCBib2FyZFBDTDgxM0IsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9wY2w4MTNiX2FpLCBOVUxMLAotCSAweDAwMDAsIDB4MDAsIFBDTHgxeF9JT1JBTkdFLCAwfSwKLQl7ImFjbDgxMTMiLCBib2FyZEFDTDgxMTMsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9hY2w4MTEzXzFfYWksIE5VTEwsCi0JIDB4MDAwMCwgMHgwMCwgUENMeDF4X0lPUkFOR0UsIDB9LAotCXsiaXNvODEzIiwgYm9hcmRJU084MTMsIDMyLCAwLCAwLCAwLCAwLCAweDBmZmYsCi0JIDAsIDAsICZyYW5nZV9pc284MTNfMV9haSwgTlVMTCwKLQkgMHgwMDAwLCAweDAwLCBQQ0x4MXhfSU9SQU5HRSwgMH0sCi0JeyJhY2w4MjE2IiwgYm9hcmRBQ0w4MjE2LCAxNiwgOCwgMiwgMTYsIDE2LCAweGZmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEzYjJfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDF9LAotCXsiYTgyNnBnIiwgYm9hcmRBQ0w4MjE2LCAxNiwgOCwgMiwgMTYsIDE2LCAweGZmZmYsCi0JIDEwMDAwLCBJODI1NF9PU0NfQkFTRV8yTUhaLCAmcmFuZ2VfcGNsODEzYjJfYWksICZyYW5nZV91bmlwb2xhcjUsCi0JIDB4ZGNmYywgMHgwYSwgUENMeDF4X0lPUkFOR0UsIDB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIHBjbDgxMl9kcml2ZXIgPSB7CiAJLmRyaXZlcl9uYW1lCT0gInBjbDgxMiIsCiAJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwppbmRleCBlOWQ0NzA0Li42ZjI3NmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCkBAIC00NCw0MCArNDQsMzggQEAKICNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICI4MjUzLmgiCiAKLS8qIGJvYXJkcyBjb25zdGFudHMgKi8KLS8qIElPIHNwYWNlIGxlbiAqLwotI2RlZmluZSBQQ0x4MXhfUkFOR0UgMTYKLQotLyogSU5URUwgODI1NCBjb3VudGVycyAqLwotI2RlZmluZSBQQ0w4MTZfQ1RSMCA0Ci0jZGVmaW5lIFBDTDgxNl9DVFIxIDUKLSNkZWZpbmUgUENMODE2X0NUUjIgNgotLyogUjogY291bnRlciByZWFkLWJhY2sgcmVnaXN0ZXIgVzogY291bnRlciBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxNl9DVFJDVEwgNwotCi0vKiBSOiBBL0QgaGlnaCBieXRlIFc6IEEvRCByYW5nZSBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxNl9SQU5HRSA5Ci0vKiBXOiBjbGVhciBJTlQgcmVxdWVzdCAqLwotI2RlZmluZSBQQ0w4MTZfQ0xSSU5UIDEwCi0vKiBSOiBuZXh0IG11eCBzY2FuIGNoYW5uZWwgVzogbXV4IHNjYW4gY2hhbm5lbCAmIHJhbmdlIGNvbnRyb2wgcG9pbnRlciAqLwotI2RlZmluZSBQQ0w4MTZfTVVYIDExCi0vKiBSL1c6IG9wZXJhdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBDTDgxNl9DT05UUk9MIDEyCi0KLS8qIFI6IHJldHVybiBzdGF0dXMgYnl0ZSAgVzogc2V0IERNQS9JUlEgKi8KLSNkZWZpbmUgUENMODE2X1NUQVRVUyAxMwotI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0RSRFlfTUFTSyAweDgwCi0KLS8qIFI6IGxvdyBieXRlIG9mIEEvRCBXOiBzb2Z0IEEvRCB0cmlnZ2VyICovCi0jZGVmaW5lIFBDTDgxNl9BRF9MTyA4Ci0vKiBSOiBoaWdoIGJ5dGUgb2YgQS9EIFc6IEEvRCByYW5nZSBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxNl9BRF9ISSA5Ci0KLS8qIHR5cGUgb2YgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSNkZWZpbmUgSU5UX1RZUEVfQUkxX0lOVCAxCi0jZGVmaW5lIElOVF9UWVBFX0FJMV9ETUEgMgotI2RlZmluZSBJTlRfVFlQRV9BSTNfSU5UIDQKLSNkZWZpbmUgSU5UX1RZUEVfQUkzX0RNQSA1CisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIFBDTDgxNl9ET19ESV9MU0JfUkVHCQkJMHgwMAorI2RlZmluZSBQQ0w4MTZfRE9fRElfTVNCX1JFRwkJCTB4MDEKKyNkZWZpbmUgUENMODE2X1RJTUVSX0JBU0UJCQkweDA0CisjZGVmaW5lIFBDTDgxNl9BSV9MU0JfUkVHCQkJMHgwOAorI2RlZmluZSBQQ0w4MTZfQUlfTVNCX1JFRwkJCTB4MDkKKyNkZWZpbmUgUENMODE2X1JBTkdFX1JFRwkJCTB4MDkKKyNkZWZpbmUgUENMODE2X0NMUklOVF9SRUcJCQkweDBhCisjZGVmaW5lIFBDTDgxNl9NVVhfUkVHCQkJCTB4MGIKKyNkZWZpbmUgUENMODE2X01VWF9TQ0FOKF9maXJzdCwgX2xhc3QpCQkoKChfbGFzdCkgPDwgNCkgfCAoX2ZpcnN0KSkKKyNkZWZpbmUgUENMODE2X0NUUkxfUkVHCQkJCTB4MGMKKyNkZWZpbmUgUENMODE2X0NUUkxfRElTQUJMRV9UUklHCQkoMCA8PCAwKQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9TT0ZUX1RSSUcJCQkoMSA8PCAwKQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9QQUNFUl9UUklHCQkJKDEgPDwgMSkKKyNkZWZpbmUgUENMODE2X0NUUkxfRVhUX1RSSUcJCQkoMSA8PCAyKQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9QT0UJCQkJKDEgPDwgMykKKyNkZWZpbmUgUENMODE2X0NUUkxfRE1BRU4JCQkoMSA8PCA0KQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9JTlRFTgkJCSgxIDw8IDUpCisjZGVmaW5lIFBDTDgxNl9DVFJMX0RNQVNSQ19TTE9UMAkJKDAgPDwgNikKKyNkZWZpbmUgUENMODE2X0NUUkxfRE1BU1JDX1NMT1QxCQkoMSA8PCA2KQorI2RlZmluZSBQQ0w4MTZfQ1RSTF9ETUFTUkNfU0xPVDIJCSgyIDw8IDYpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfUkVHCQkJMHgwZAorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX05FWFRfQ0hBTl9NQVNLCQkoMHhmIDw8IDApCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UU1JDX01BU0sJCSgzIDw8IDQpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UU1JDX1NMT1QwCQkoMCA8PCA0KQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0lOVFNSQ19TTE9UMQkJKDEgPDwgNCkKKyNkZWZpbmUgUENMODE2X1NUQVRVU19JTlRTUkNfU0xPVDIJCSgyIDw8IDQpCisjZGVmaW5lIFBDTDgxNl9TVEFUVVNfSU5UU1JDX0RNQQkJKDMgPDwgNCkKKyNkZWZpbmUgUENMODE2X1NUQVRVU19JTlRBQ1QJCQkoMSA8PCA2KQorI2RlZmluZSBQQ0w4MTZfU1RBVFVTX0RSRFkJCQkoMSA8PCA3KQogCiAjZGVmaW5lIE1BR0lDX0RNQV9XT1JEIDB4NWE1YQogCkBAIC05NSwzMTQgKzkzLDI4NCBAQAogfTsKIAogc3RydWN0IHBjbDgxNl9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgYWlfbWF4ZGF0YTsKKwlpbnQgYW9fbWF4ZGF0YTsKKwlpbnQgYWlfY2hhbmxpc3Q7Cit9OwogCi0JY29uc3QgY2hhciAqbmFtZTsJLyogIGJvYXJkIG5hbWUgKi8KLQlpbnQgbl9yYW5nZXM7CQkvKiAgbGVuIG9mIHJhbmdlIGxpc3QgKi8KLQlpbnQgbl9haWNoYW47CQkvKiAgbnVtIG9mIEEvRCBjaGFucyBpbiBkaWZlcmVuY2lhbCBtb2RlICovCi0JdW5zaWduZWQgaW50IGFpX25zX21pbjsJLyogIG1pbmltYWwgYWxsb3dlZCBkZWxheSBiZXR3ZWVuIHNhbXBsZXMgKGluIG5zKSAqLwotCWludCBuX2FvY2hhbjsJCS8qICBudW0gb2YgRC9BIGNoYW5zICovCi0JaW50IG5fZGljaGFuOwkJLyogIG51bSBvZiBESSBjaGFucyAqLwotCWludCBuX2RvY2hhbjsJCS8qICBudW0gb2YgRE8gY2hhbnMgKi8KLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdHlwZTsJLyogIGRlZmF1bHQgQS9EIHJhbmdlbGlzdCAqLwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV90eXBlOwkvKiAgZGVmYXVsdCBEL0EgcmFuZ2VsaXN0ICovCi0JdW5zaWduZWQgaW50IGlvX3JhbmdlOwkvKiAgbGVuIG9mIElPIHNwYWNlICovCi0JdW5zaWduZWQgaW50IElSUWJpdHM7CS8qICBhbGxvd2VkIGludGVycnVwdHMgKi8KLQl1bnNpZ25lZCBpbnQgRE1BYml0czsJLyogIGFsbG93ZWQgRE1BIGNoYW5zICovCi0JaW50IGFpX21heGRhdGE7CQkvKiAgbWF4ZGF0YSBmb3IgQS9EICovCi0JaW50IGFvX21heGRhdGE7CQkvKiAgbWF4ZGF0YSBmb3IgRC9BICovCi0JaW50IGFpX2NoYW5saXN0OwkvKiAgYWxsb3dlZCBsZW4gb2YgY2hhbm5lbCBsaXN0IEEvRCAqLwotCWludCBhb19jaGFubGlzdDsJLyogIGFsbG93ZWQgbGVuIG9mIGNoYW5uZWwgbGlzdCBEL0EgKi8KLQlpbnQgaTgyNTRfb3NjX2Jhc2U7CS8qICAxL2ZyZXF1ZW5jeSBvZiBvbiBib2FyZCBvc2NpbGF0b3IgaW4gbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsODE2X2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJwY2w4MTYiLAorCQkuYWlfbWF4ZGF0YQk9IDB4ZmZmZiwKKwkJLmFvX21heGRhdGEJPSAweGZmZmYsCisJCS5haV9jaGFubGlzdAk9IDEwMjQsCisJfSwgeworCQkubmFtZQkJPSAicGNsODE0YiIsCisJCS5haV9tYXhkYXRhCT0gMHgzZmZmLAorCQkuYW9fbWF4ZGF0YQk9IDB4M2ZmZiwKKwkJLmFpX2NoYW5saXN0CT0gMTAyNCwKKwl9LAogfTsKIAogc3RydWN0IHBjbDgxNl9wcml2YXRlIHsKLQogCXVuc2lnbmVkIGludCBkbWE7CS8qICB1c2VkIERNQSwgMD1kb24ndCB1c2UgRE1BICovCisJdW5zaWduZWQgaW50IGRtYXBhZ2VzOworCXVuc2lnbmVkIGludCBod2RtYXNpemU7CiAJdW5zaWduZWQgbG9uZyBkbWFidWZbMl07CS8qICBwb2ludGVycyB0byBiZWdpbiBvZiBETUEgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBkbWFwYWdlc1syXTsJLyogIGxlbiBvZiBETUEgYnVmZmVycyBpbiBQQUdFX1NJWkVzICovCiAJdW5zaWduZWQgaW50IGh3ZG1hcHRyWzJdOwkvKiAgaGFyZHdhcmUgYWRkcmVzcyBvZiBETUEgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBod2RtYXNpemVbMl07CS8qICBsZW4gb2YgRE1BIGJ1ZmZlcnMgaW4gQnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQgZG1hc2FtcGxzaXplOwkvKiAgc2l6ZSBpbiBzYW1wbGVzIGh3ZG1hc2l6ZVswXS8yICovCiAJaW50IG5leHRfZG1hX2J1ZjsJLyogIHdoaWNoIERNQSBidWZmZXIgd2lsbCBiZSB1c2VkIG5leHQgcm91bmQgKi8KIAlsb25nIGRtYV9ydW5zX3RvX2VuZDsJLyogIGhvdyBtYW55IHdlIG11c3QgcGVybW9ybSBETUEgdHJhbnNmZXIgdG8gZW5kIG9mIHJlY29yZCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF9kbWFfcnVuOwkvKiAgaG93IG1hbnkgYnl0ZXMgd2UgbXVzdCB0cmFuc2ZlciBvbiBsYXN0IERNQSBwYWdlICovCi0KLQl1bnNpZ25lZCBpbnQgYWlfc2NhbnM7CS8qICBsZW4gb2Ygc2Nhbmxpc3QgKi8KLQl1bnNpZ25lZCBjaGFyIGFpX25ldmVyZW5kaW5nOwkvKiAgaWY9MSwgdGhlbiB3ZSBkbyBuZXZlcmVuZGluZyByZWNvcmQgKHlvdSBtdXN0IHVzZSBjYW5jZWwoKSkgKi8KLQlpbnQgaXJxX2Jsb2NrZWQ7CS8qICAxPUlSUSBub3cgdXNlcyBhbnkgc3ViZGV2ICovCi0JaW50IGlycV93YXNfbm93X2Nsb3NlZDsJLyogIHdoZW4gSVJRIGZpbmlzaCwgdGhlcmUncyBzdG9yZWQgaW50ODE2X21vZGUgZm9yIGxhc3QgaW50ZXJydXB0ICovCi0JaW50IGludDgxNl9tb2RlOwkvKiAgd2hvIG5vdyB1c2VzIElSUSAtIDE9QUkxIGludCwgMj1BSTEgZG1hLCAzPUFJMyBpbnQsIDRBSTMgZG1hICovCi0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKmxhc3RfaW50X3N1YjsJLyogIHB0ciB0byBzdWJkZXZpY2Ugd2hpY2ggbm93IGZpbmlzaCAqLwogCWludCBhaV9hY3Rfc2NhbjsJLyogIGhvdyBtYW55IHNjYW5zIHdlIGZpbmlzaGVkICovCi0JdW5zaWduZWQgaW50IGFpX2FjdF9jaGFubGlzdFsxNl07CS8qICBNVVggc2V0dGluZyBmb3IgYWN0dWFsIEFJIG9wZXJhdGlvbnMgKi8KLQl1bnNpZ25lZCBpbnQgYWlfYWN0X2NoYW5saXN0X2xlbjsJLyogIGhvdyBsb25nIGlzIGFjdHVhbCBNVVggbGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9hY3RfY2hhbmxpc3RfcG9zOwkvKiAgYWN0dWFsIHBvc2l0aW9uIGluIE1VWCBsaXN0ICovCi0JdW5zaWduZWQgaW50IGFpX25fY2hhbjsJCS8qICBob3cgbWFueSBjaGFubmVscyBwZXIgc2NhbiAqLwogCXVuc2lnbmVkIGludCBhaV9wb2xsX3B0cjsJLyogIGhvdyBtYW55IHNhbXBlcyB0cmFuc2ZlciBwb2xsICovCisJdW5zaWduZWQgaW50IGRpdmlzb3IxOworCXVuc2lnbmVkIGludCBkaXZpc29yMjsKKwl1bnNpZ25lZCBpbnQgYWlfY21kX3J1bm5pbmc6MTsKKwl1bnNpZ25lZCBpbnQgYWlfY21kX2NhbmNlbGVkOjE7CiB9OwogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IGNoYW5sZW4pOwotc3RhdGljIHZvaWQgc2V0dXBfY2hhbm5lbF9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IHNlZ2xlbik7Ci1zdGF0aWMgaW50IHBjbDgxNl9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyk7Ci1zdGF0aWMgdm9pZCBzdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgbW9kZSwKLQkJCXVuc2lnbmVkIGludCBkaXZpc29yMSwgdW5zaWduZWQgaW50IGRpdmlzb3IyKTsKIAotc3RhdGljIGludCBwY2w4MTZfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCk7Ci1zdGF0aWMgaW50IHBjbDgxNl9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBBTkFMT0cgSU5QVVQgTU9ERTAsIDgxNiBjYXJkcywgc2xvdyB2ZXJzaW9uCi0qLwotc3RhdGljIGludCBwY2w4MTZfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JaW50IG47Ci0JaW50IHRpbWVvdXQ7Ci0KLQkvKiAgc29mdHdhcmUgdHJpZ2dlciwgRE1BIGFuZCBJTlQgb2ZmICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsKLQkvKiAgY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsKLQotCS8qICBTZXQgdGhlIGlucHV0IGNoYW5uZWwgKi8KLQlvdXRiKENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpICYgMHhmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCS8qIHNlbGVjdCBnYWluICovCi0Jb3V0YihDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyksIGRldi0+aW9iYXNlICsgUENMODE2X1JBTkdFKTsKLQotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKTsJLyogc3RhcnQgY29udmVyc2lvbiAqLwotCi0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJCWlmICghKGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9TVEFUVVMpICYKLQkJCSAgICAgIFBDTDgxNl9TVEFUVVNfRFJEWV9NQVNLKSkgewotCQkJCS8qICByZXR1cm4gcmVhZCB2YWx1ZSAqLwotCQkJCWRhdGFbbl0gPQotCQkJCSAgICAoKGluYihkZXYtPmlvYmFzZSArCi0JCQkJCSAgUENMODE2X0FEX0hJKSA8PCA4KSB8Ci0JCQkJICAgICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKSkpOwotCQkJCS8qIGNsZWFyIElOVCAoY29udmVyc2lvbiBlbmQpIGZsYWcgKi8KLQkJCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJLyogIFJldHVybiB0aW1lb3V0IGVycm9yICovCi0JCWlmICghdGltZW91dCkgewotCQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBpbnNuIHRpbWVvdXRcbiIpOwotCQkJZGF0YVswXSA9IDA7Ci0JCQkvKiBjbGVhciBJTlQgKGNvbnZlcnNpb24gZW5kKSBmbGFnICovCi0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCi0JfQotCXJldHVybiBuOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBhbmFsb2cgaW5wdXQgaW50ZXJydXB0IG1vZGUgMSAmIDMsIDgxOCBjYXJkcwotICAgb25lIHNhbXBsZSBwZXIgaW50ZXJydXB0IHZlcnNpb24KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxNl9haV9tb2RlMTNfaW50KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKLQl1bnNpZ25lZCBjaGFyIGxvdywgaGk7Ci0JaW50IHRpbWVvdXQgPSA1MDsJLyogd2FpdCBtYXggNTB1cyAqLwotCi0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQlpZiAoIShpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfU1RBVFVTKSAmCi0JCSAgICAgIFBDTDgxNl9TVEFUVVNfRFJEWV9NQVNLKSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMSk7Ci0JfQotCWlmICghdGltZW91dCkgewkJLyogIHRpbWVvdXQsIGJhaWwgZXJyb3IgKi8KLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIG1vZGUxLzMgSVJRIHdpdGhvdXQgRFJEWSEiKTsKLQkJcGNsODE2X2FpX2NhbmNlbChkZXYsIHMpOwotCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQl9Ci0KLQkvKiAgZ2V0IHRoZSBzYW1wbGUgKi8KLQlsb3cgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQURfTE8pOwotCWhpID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FEX0hJKTsKLQotCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCAoaGkgPDwgOCkgfCBsb3cpOwotCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCi0JaWYgKCsrZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0X3BvcyA+PSBkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfbGVuKQotCQlkZXZwcml2LT5haV9hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQotCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKSB7Ci0JCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCWRldnByaXYtPmFpX2FjdF9zY2FuKys7Ci0JfQotCi0JaWYgKCFkZXZwcml2LT5haV9uZXZlcmVuZGluZykKLQkJCQkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPj0gZGV2cHJpdi0+YWlfc2NhbnMpIHsKLQkJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KLQkJCXBjbDgxNl9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJfQotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgYW5hbG9nIGlucHV0IGRtYSBtb2RlIDEgJiAzLCA4MTYgY2FyZHMKLSovCi1zdGF0aWMgdm9pZCB0cmFuc2Zlcl9mcm9tX2RtYV9idWYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgdW5zaWduZWQgc2hvcnQgKnB0ciwKLQkJCQkgIHVuc2lnbmVkIGludCBidWZwdHIsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgdm9pZCBwY2w4MTZfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgYm9vbCBsb2FkX2NvdW50ZXJzKQogewogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFOwogCi0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTEgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDAsIDB4MDBmZik7CisJdWRlbGF5KDEpOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwl1ZGVsYXkoMSk7CiAKLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHB0cltidWZwdHIrK10pOwotCi0JCWlmICgrK2RldnByaXYtPmFpX2FjdF9jaGFubGlzdF9wb3MgPj0KLQkJICAgIGRldnByaXYtPmFpX2FjdF9jaGFubGlzdF9sZW4pIHsKLQkJCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdF9wb3MgPSAwOwotCQl9Ci0KLQkJcy0+YXN5bmMtPmN1cl9jaGFuKys7Ci0JCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKSB7Ci0JCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOwotCQkJZGV2cHJpdi0+YWlfYWN0X3NjYW4rKzsKLQkJfQotCi0JCWlmICghZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpCi0JCQkJCQkvKiAgYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID49IGRldnByaXYtPmFpX3NjYW5zKSB7Ci0JCQkJcGNsODE2X2FpX2NhbmNlbChkZXYsIHMpOwotCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKLQkJCQlicmVhazsKLQkJCX0KKwlpZiAobG9hZF9jb3VudGVycykgeworCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7CisJCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKIAl9Ci0KLQljb21lZGlfZXZlbnQoZGV2LCBzKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTZfYWlfbW9kZTEzX2RtYShpbnQgaXJxLCB2b2lkICpkKQorc3RhdGljIHZvaWQgcGNsODE2X2FpX3NldHVwX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JaW50IGxlbiwgYnVmcHRyLCB0aGlzX2RtYV9idWY7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBkbWFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGJ5dGVzOworCisJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiAgaG93IG1hbnkgKi8KKwkJYnl0ZXMgPSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbiAqCisJCXMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICoKKwkJc2l6ZW9mKHNob3J0KTsKKworCQkvKiAgaG93IG1hbnkgRE1BIHBhZ2VzIHdlIG11c3QgZmlsbCAqLworCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSBieXRlcyAvIGRldnByaXYtPmh3ZG1hc2l6ZTsKKworCQkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCisJCWRldnByaXYtPmxhc3RfZG1hX3J1biA9IGJ5dGVzICUgZGV2cHJpdi0+aHdkbWFzaXplOworCQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQtLTsKKwkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA+PSAwKQorCQkJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CisJfSBlbHNlCisJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IC0xOworCisJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMDsKKwlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKKwlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWNsZWFyX2RtYV9mZihkZXZwcml2LT5kbWEpOworCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hcHRyWzBdKTsKKwlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgYnl0ZXMpOworCXJlbGVhc2VfZG1hX2xvY2soZG1hX2ZsYWdzKTsKKwllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zZXR1cF9uZXh0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAl1bnNpZ25lZCBsb25nIGRtYV9mbGFnczsKLQl1bnNpZ25lZCBzaG9ydCAqcHRyOwogCiAJZGlzYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQl0aGlzX2RtYV9idWYgPSBkZXZwcml2LT5uZXh0X2RtYV9idWY7Ci0KLQkvKiAgc3dpdGNoIGRtYSBidWZzICovCi0JaWYgKChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPiAtMSkgfHwgZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcpIHsKLQorCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPiAtMSB8fCBjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkgeworCQkvKiBzd2l0Y2ggZG1hIGJ1ZnMgKi8KIAkJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMSAtIGRldnByaXYtPm5leHRfZG1hX2J1ZjsKIAkJc2V0X2RtYV9tb2RlKGRldnByaXYtPmRtYSwgRE1BX01PREVfUkVBRCk7CiAJCWRtYV9mbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7Ci0vKiBjbGVhcl9kbWFfZmYgKGRldnByaXYtPmRtYSk7ICovCiAJCXNldF9kbWFfYWRkcihkZXZwcml2LT5kbWEsCiAJCQkgICAgIGRldnByaXYtPmh3ZG1hcHRyW2RldnByaXYtPm5leHRfZG1hX2J1Zl0pOwotCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kKSB7Ci0JCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwKLQkJCQkgICAgICBkZXZwcml2LT5od2RtYXNpemVbZGV2cHJpdi0+Ci0JCQkJCQkJIG5leHRfZG1hX2J1Zl0pOwotCQl9IGVsc2UgeworCQlpZiAoZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kKQorCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsIGRldnByaXYtPmh3ZG1hc2l6ZSk7CisJCWVsc2UKIAkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5sYXN0X2RtYV9ydW4pOwotCQl9CiAJCXJlbGVhc2VfZG1hX2xvY2soZG1hX2ZsYWdzKTsKIAkJZW5hYmxlX2RtYShkZXZwcml2LT5kbWEpOwogCX0KIAogCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KK30KIAotCXB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKWRldnByaXYtPmRtYWJ1Zlt0aGlzX2RtYV9idWZdOworc3RhdGljIHZvaWQgcGNsODE2X2FpX3NldF9jaGFuX3JhbmdlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByYW5nZSkKK3sKKwlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENMODE2X01VWF9SRUcpOworCW91dGIocmFuZ2UsIGRldi0+aW9iYXNlICsgUENMODE2X1JBTkdFX1JFRyk7Cit9CiAKLQlsZW4gPSAoZGV2cHJpdi0+aHdkbWFzaXplWzBdID4+IDEpIC0gZGV2cHJpdi0+YWlfcG9sbF9wdHI7CitzdGF0aWMgdm9pZCBwY2w4MTZfYWlfc2V0X2NoYW5fc2NhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZmlyc3RfY2hhbiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGxhc3RfY2hhbikKK3sKKwlvdXRiKFBDTDgxNl9NVVhfU0NBTihmaXJzdF9jaGFuLCBsYXN0X2NoYW4pLAorCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfTVVYX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zZXR1cF9jaGFubGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBzZWdsZW4pCit7CisJdW5zaWduZWQgaW50IGZpcnN0X2NoYW4gPSBDUl9DSEFOKGNoYW5saXN0WzBdKTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jaGFuOworCXVuc2lnbmVkIGludCByYW5nZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIHN0b3JlIHJhbmdlIGxpc3QgdG8gY2FyZCAqLworCWZvciAoaSA9IDA7IGkgPCBzZWdsZW47IGkrKykgeworCQlsYXN0X2NoYW4gPSBDUl9DSEFOKGNoYW5saXN0W2ldKTsKKwkJcmFuZ2UgPSBDUl9SQU5HRShjaGFubGlzdFtpXSk7CisKKwkJcGNsODE2X2FpX3NldF9jaGFuX3JhbmdlKGRldiwgbGFzdF9jaGFuLCByYW5nZSk7CisJfQorCisJdWRlbGF5KDEpOworCisJcGNsODE2X2FpX3NldF9jaGFuX3NjYW4oZGV2LCBmaXJzdF9jaGFuLCBsYXN0X2NoYW4pOworfQorCitzdGF0aWMgdm9pZCBwY2w4MTZfYWlfY2xlYXJfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogd3JpdGluZyBhbnkgdmFsdWUgY2xlYXJzIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdCAqLworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxNl9haV9zb2Z0X3RyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiB3cml0aW5nIGFueSB2YWx1ZSB0cmlnZ2VycyBhIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0FJX0xTQl9SRUcpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBjbDgxNl9haV9nZXRfc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FJX01TQl9SRUcpIDw8IDg7CisJdmFsIHw9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BSV9MU0JfUkVHKTsKKworCXJldHVybiB2YWwgJiBzLT5tYXhkYXRhOworfQorCitzdGF0aWMgaW50IHBjbDgxNl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfU1RBVFVTX1JFRyk7CisJaWYgKChzdGF0dXMgJiBQQ0w4MTZfU1RBVFVTX0RSRFkpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBib29sIHBjbDgxNl9haV9uZXh0X2NoYW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisKKwlzLT5hc3luYy0+Y3VyX2NoYW4rKzsKKwlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisJCWRldnByaXYtPmFpX2FjdF9zY2FuKys7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UICYmCisJICAgIGRldnByaXYtPmFpX2FjdF9zY2FuID49IGNtZC0+c3RvcF9hcmcpIHsKKwkJLyogYWxsIGRhdGEgc2FtcGxlZCAqLworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmZXJfZnJvbV9kbWFfYnVmKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIHVuc2lnbmVkIHNob3J0ICpwdHIsCisJCQkJICB1bnNpZ25lZCBpbnQgYnVmcHRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBwdHJbYnVmcHRyKytdKTsKKworCQlpZiAoIXBjbDgxNl9haV9uZXh0X2NoYW4oZGV2LCBzKSkKKwkJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2w4MTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCit7CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCAqcHRyOworCXVuc2lnbmVkIGludCBidWZwdHI7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmICghZGV2LT5hdHRhY2hlZCB8fCAhZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCkgeworCQlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAwOworCQlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlwdHIgPSAodW5zaWduZWQgc2hvcnQgKilkZXZwcml2LT5kbWFidWZbZGV2cHJpdi0+bmV4dF9kbWFfYnVmXTsKKworCXBjbDgxNl9haV9zZXR1cF9uZXh0X2RtYShkZXYsIHMpOworCisJbGVuID0gKGRldnByaXYtPmh3ZG1hc2l6ZSA+PiAxKSAtIGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWJ1ZnB0ciA9IGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWRldnByaXYtPmFpX3BvbGxfcHRyID0gMDsKIAogCXRyYW5zZmVyX2Zyb21fZG1hX2J1ZihkZXYsIHMsIHB0ciwgYnVmcHRyLCBsZW4pOworCisJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBJTlQgcHJvY2VkdXJlCi0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTYoaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0KLQlpZiAoIWRldi0+YXR0YWNoZWQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgInByZW1hdHVyZSBpbnRlcnJ1cHQiKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXN3aXRjaCAoZGV2cHJpdi0+aW50ODE2X21vZGUpIHsKLQljYXNlIElOVF9UWVBFX0FJMV9ETUE6Ci0JY2FzZSBJTlRfVFlQRV9BSTNfRE1BOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxNl9haV9tb2RlMTNfZG1hKGlycSwgZCk7Ci0JY2FzZSBJTlRfVFlQRV9BSTFfSU5UOgotCWNhc2UgSU5UX1RZUEVfQUkzX0lOVDoKLQkJcmV0dXJuIGludGVycnVwdF9wY2w4MTZfYWlfbW9kZTEzX2ludChpcnEsIGQpOwotCX0KLQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQlpZiAoIWRldi0+aXJxIHx8ICFkZXZwcml2LT5pcnFfYmxvY2tlZCB8fCAhZGV2cHJpdi0+aW50ODE2X21vZGUpIHsKLQkJaWYgKGRldnByaXYtPmlycV93YXNfbm93X2Nsb3NlZCkgewotCQkJZGV2cHJpdi0+aXJxX3dhc19ub3dfY2xvc2VkID0gMDsKLQkJCS8qICBjb21lZGlfZXJyb3IoZGV2LCJsYXN0IElSUS4uIik7ICovCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0KLQkJY29tZWRpX2Vycm9yKGRldiwgImJhZCBJUlEhIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0JY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlISIpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNsODE2X2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0JY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKKwlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JaW50IHRtcCwgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CisJaW50IHRtcDsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIApAQCAtNDMyLDggKzQwMCw3IEBACiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBib2FyZC0+YWlfbnNfbWluKTsKKwkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKIAllbHNlCS8qIFRSSUdfRVhUICovCiAJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwogCkBAIC00NTEsMTEgKzQxOCwxMiBAQAogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoYm9hcmQtPmk4MjU0X29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAorCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKKwkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCiAJCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwotCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IGJvYXJkLT5haV9uc19taW4pCi0JCQljbWQtPmNvbnZlcnRfYXJnID0gYm9hcmQtPmFpX25zX21pbjsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCAxMDAwMCkKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAxMDAwMDsKIAkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKQogCQkJZXJyKys7CiAJfQpAQCAtNDc3LDEyMCArNDQ1LDQwIEBACiAKIHN0YXRpYyBpbnQgcGNsODE2X2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQljb25zdCBzdHJ1Y3QgcGNsODE2X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDAsIGRtYV9mbGFncywgYnl0ZXMsIGRtYWlycTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGN0cmw7CiAJdW5zaWduZWQgaW50IHNlZ2xlbjsKIAotCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjbWQtPnNjYW5fZW5kX3NyYyAhPSBUUklHX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pCi0JCXJldHVybiAtRUlOVkFMOwotLyogaWYoY21kLT5jaGFubGlzdF9sZW4+TUFYX0NIQU5MSVNUX0xFTikgcmV0dXJuIC1FSU5WQUw7ICovCi0JaWYgKGRldnByaXYtPmlycV9ibG9ja2VkKQorCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZykKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBib2FyZC0+YWlfbnNfbWluKQotCQkJY21kLT5jb252ZXJ0X2FyZyA9IGJvYXJkLT5haV9uc19taW47Ci0KLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihib2FyZC0+aTgyNTRfb3NjX2Jhc2UsCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCi0JCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwotCi0JCS8qICBQQ0w4MTYgY3Jhc2ggaWYgYW55IGRpdmlzb3IgaXMgc2V0IHRvIDEgKi8KLQkJaWYgKGRpdmlzb3IxID09IDEpIHsKLQkJCWRpdmlzb3IxID0gMjsKLQkJCWRpdmlzb3IyIC89IDI7Ci0JCX0KLQkJaWYgKGRpdmlzb3IyID09IDEpIHsKLQkJCWRpdmlzb3IyID0gMjsKLQkJCWRpdmlzb3IxIC89IDI7Ci0JCX0KLQl9Ci0KLQlzdGFydF9wYWNlcihkZXYsIC0xLCAwLCAwKTsJLyogIHN0b3AgcGFjZXIgKi8KKwlwY2w4MTZfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CiAKIAlzZWdsZW4gPSBjaGVja19jaGFubmVsX2xpc3QoZGV2LCBzLCBjbWQtPmNoYW5saXN0LCBjbWQtPmNoYW5saXN0X2xlbik7CiAJaWYgKHNlZ2xlbiA8IDEpCiAJCXJldHVybiAtRUlOVkFMOwotCXNldHVwX2NoYW5uZWxfbGlzdChkZXYsIHMsIGNtZC0+Y2hhbmxpc3QsIHNlZ2xlbik7CisJcGNsODE2X2FpX3NldHVwX2NoYW5saXN0KGRldiwgY21kLT5jaGFubGlzdCwgc2VnbGVuKTsKIAl1ZGVsYXkoMSk7CiAKLQlkZXZwcml2LT5haV9uX2NoYW4gPSBjbWQtPmNoYW5saXN0X2xlbjsKIAlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IDA7CiAJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKLQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDE7CisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAxOwogCWRldnByaXYtPmFpX3BvbGxfcHRyID0gMDsKLQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSAwOworCWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCA9IDA7CiAKLQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gY21kLT5zdG9wX2FyZzsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAwOwotCX0gZWxzZSB7Ci0JCWRldnByaXYtPmFpX3NjYW5zID0gMDsKLQkJZGV2cHJpdi0+YWlfbmV2ZXJlbmRpbmcgPSAxOwotCX0KKwlwY2w4MTZfYWlfc2V0dXBfZG1hKGRldiwgcyk7CiAKLQlpZiAoZGV2cHJpdi0+ZG1hKSB7Ci0JCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOwotCQlpZiAoIWRldnByaXYtPmFpX25ldmVyZW5kaW5nKSB7Ci0JCQkvKiAgaG93IG1hbnkgKi8KLQkJCWJ5dGVzID0gcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKgotCQkJcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKgotCQkJc2l6ZW9mKHNob3J0KTsKKwlwY2w4MTZfc3RhcnRfcGFjZXIoZGV2LCB0cnVlKTsKIAotCQkJLyogIGhvdyBtYW55IERNQSBwYWdlcyB3ZSBtdXN0IGZpbGwgKi8KLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IGJ5dGVzIC8KLQkJCWRldnByaXYtPmh3ZG1hc2l6ZVswXTsKKwljdHJsID0gUENMODE2X0NUUkxfSU5URU4gfCBQQ0w4MTZfQ1RSTF9ETUFFTiB8IFBDTDgxNl9DVFJMX0RNQVNSQ19TTE9UMDsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQorCQljdHJsIHw9IFBDTDgxNl9DVFJMX1BBQ0VSX1RSSUc7CisJZWxzZQkvKiBUUklHX0VYVCAqLworCQljdHJsIHw9IFBDTDgxNl9DVFJMX0VYVF9UUklHOwogCi0JCQkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCi0JCQlkZXZwcml2LT5sYXN0X2RtYV9ydW4gPSBieXRlcyAlIGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwotCQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA+PSAwKQotCQkJCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOwotCQl9IGVsc2UKLQkJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IC0xOwotCi0JCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDA7Ci0JCXNldF9kbWFfbW9kZShkZXZwcml2LT5kbWEsIERNQV9NT0RFX1JFQUQpOwotCQlkbWFfZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCQljbGVhcl9kbWFfZmYoZGV2cHJpdi0+ZG1hKTsKLQkJc2V0X2RtYV9hZGRyKGRldnByaXYtPmRtYSwgZGV2cHJpdi0+aHdkbWFwdHJbMF0pOwotCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgYnl0ZXMpOwotCQlyZWxlYXNlX2RtYV9sb2NrKGRtYV9mbGFncyk7Ci0JCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQl9Ci0KLQlzdGFydF9wYWNlcihkZXYsIDEsIGRpdmlzb3IxLCBkaXZpc29yMik7Ci0JZG1haXJxID0gKChkZXZwcml2LT5kbWEgJiAweDMpIDw8IDQpIHwgKGRldi0+aXJxICYgMHg3KTsKLQotCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgewotCWNhc2UgVFJJR19USU1FUjoKLQkJZGV2cHJpdi0+aW50ODE2X21vZGUgPSBJTlRfVFlQRV9BSTFfRE1BOwotCi0JCS8qICBQYWNlcitJUlErRE1BICovCi0JCW91dGIoMHgzMiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0KLQkJLyogIHdyaXRlIGlycSBhbmQgRE1BIHRvIGNhcmQgKi8KLQkJb3V0YihkbWFpcnEsIGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVUyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2cHJpdi0+aW50ODE2X21vZGUgPSBJTlRfVFlQRV9BSTNfRE1BOwotCi0JCS8qICBFeHQgdHJpZytJUlErRE1BICovCi0JCW91dGIoMHgzNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0KLQkJLyogIHdyaXRlIGlycSB0byBjYXJkICovCi0JCW91dGIoZG1haXJxLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9TVEFUVVMpOwotCQlicmVhazsKLQl9CisJb3V0YihjdHJsLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CisJb3V0YigoZGV2cHJpdi0+ZG1hIDw8IDQpIHwgZGV2LT5pcnEsIGRldi0+aW9iYXNlICsgUENMODE2X1NUQVRVU19SRUcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MDEsOSArNDg5LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCB0b3AxLCB0b3AyLCBpOwogCi0JaWYgKCFkZXZwcml2LT5kbWEpCi0JCXJldHVybiAwOwkvKiAgcG9sbCBpcyB2YWxpZCBvbmx5IGZvciBETUEgdHJhbnNmZXIgKi8KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgewpAQCAtNjE4LDcgKzUwMyw3IEBACiAJfQogCiAJLyogIHdoZXJlIGlzIG5vdyBETUEgaW4gYnVmZmVyICovCi0JdG9wMSA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXSAtIHRvcDE7CisJdG9wMSA9IGRldnByaXYtPmh3ZG1hc2l6ZSAtIHRvcDE7CiAJdG9wMSA+Pj0gMTsJCS8qICBzYW1wbGUgcG9zaXRpb24gKi8KIAl0b3AyID0gdG9wMSAtIGRldnByaXYtPmFpX3BvbGxfcHRyOwogCWlmICh0b3AyIDwgMSkgewkJLyogIG5vIG5ldyBzYW1wbGVzICovCkBAIC02MzQsMTM0ICs1MTksMzQgQEAKIAlkZXZwcml2LT5haV9wb2xsX3B0ciA9IHRvcDE7CS8qICBuZXcgYnVmZmVyIHBvc2l0aW9uICovCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCisJY2ZjX2hhbmRsZV9ldmVudHMoZGV2LCBzKTsKKwogCXJldHVybiBzLT5hc3luYy0+YnVmX3dyaXRlX2NvdW50IC0gcy0+YXN5bmMtPmJ1Zl9yZWFkX2NvdW50OwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gY2FuY2VsIGFueSBtb2RlIDEtNCBBSQotKi8KIHN0YXRpYyBpbnQgcGNsODE2X2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCWlmIChkZXZwcml2LT5pcnFfYmxvY2tlZCA+IDApIHsKLQkJc3dpdGNoIChkZXZwcml2LT5pbnQ4MTZfbW9kZSkgewotCQljYXNlIElOVF9UWVBFX0FJMV9ETUE6Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0RNQToKLQkJCWRpc2FibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JCWNhc2UgSU5UX1RZUEVfQUkxX0lOVDoKLQkJY2FzZSBJTlRfVFlQRV9BSTNfSU5UOgotCQkJb3V0YihpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCkgJiAweDczLAotCQkJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsJLyogU3RvcCBBL0QgKi8KLQkJCXVkZWxheSgxKTsKLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7CS8qIFN0b3AgQS9EICovCisJaWYgKCFkZXZwcml2LT5haV9jbWRfcnVubmluZykKKwkJcmV0dXJuIDA7CiAKLQkJCS8qIFN0b3AgcGFjZXIgKi8KLQkJCW91dGIoMHhiMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKLQkJCW91dGIoMHg3MCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQURfTE8pOwotCQkJaW5iKGRldi0+aW9iYXNlICsgUENMODE2X0FEX0xPKTsKLQkJCWluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9BRF9ISSk7CisJb3V0YihQQ0w4MTZfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKKwlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CiAKLQkJCS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7CisJLyogU3RvcCBwYWNlciAqLworCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENMODE2X1RJTUVSX0JBU0UsIDAsCisJCQkyLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfVElNRVJfQkFTRSwgMCwKKwkJCTEsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAotCQkJLyogU3RvcCBBL0QgKi8KLQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0JCQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7Ci0JCQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSBkZXZwcml2LT5pbnQ4MTZfbW9kZTsKLQkJCWRldnByaXYtPmludDgxNl9tb2RlID0gMDsKLQkJCWRldnByaXYtPmxhc3RfaW50X3N1YiA9IHM7Ci0vKiBzLT5idXN5ID0gMDsgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQorCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKwlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAxOworCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBjaGVjaCBmb3IgUENMODE2Ci0qLwotc3RhdGljIGludCBwY2w4MTZfY2hlY2sodW5zaWduZWQgbG9uZyBpb2Jhc2UpCi17Ci0Jb3V0YigweDAwLCBpb2Jhc2UgKyBQQ0w4MTZfTVVYKTsKLQl1ZGVsYXkoMSk7Ci0JaWYgKGluYihpb2Jhc2UgKyBQQ0w4MTZfTVVYKSAhPSAweDAwKQotCQlyZXR1cm4gMTsJLyogdGhlcmUgaXNuJ3QgY2FyZCAqLwotCW91dGIoMHg1NSwgaW9iYXNlICsgUENMODE2X01VWCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE2X01VWCkgIT0gMHg1NSkKLQkJcmV0dXJuIDE7CS8qIHRoZXJlIGlzbid0IGNhcmQgKi8KLQlvdXRiKDB4MDAsIGlvYmFzZSArIFBDTDgxNl9NVVgpOwotCXVkZWxheSgxKTsKLQlvdXRiKDB4MTgsIGlvYmFzZSArIFBDTDgxNl9DT05UUk9MKTsKLQl1ZGVsYXkoMSk7Ci0JaWYgKGluYihpb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCkgIT0gMHgxOCkKLQkJcmV0dXJuIDE7CS8qIHRoZXJlIGlzbid0IGNhcmQgKi8KLQlyZXR1cm4gMDsJCS8qICBvaywgY2FyZCBleGlzdCAqLwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gcmVzZXQgd2hvbGUgUENMLTgxNiBjYXJkcwotKi8KLXN0YXRpYyB2b2lkIHBjbDgxNl9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotLyogb3V0YiAoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfREFfTE8pOyAgICAgICAgIERBQz0wViAqLwotLyogb3V0YiAoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfREFfSEkpOyAqLwotLyogdWRlbGF5ICgxKTsgKi8KLS8qIG91dGIgKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0hJKTsgICAgICAgIERPPSQwMDAwICovCi0vKiBvdXRiICgwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19MTyk7ICovCi0vKiB1ZGVsYXkgKDEpOyAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ09OVFJPTCk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ0xSSU5UKTsKLQlvdXRiKDB4YjAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7CS8qIFN0b3AgcGFjZXIgKi8KLQlvdXRiKDB4NzAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0Jb3V0YigweDMwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJDVEwpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfUkFOR0UpOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gU3RhcnQvc3RvcCBwYWNlciBvbmJvYXJkIHBhY2VyCi0qLwotc3RhdGljIHZvaWQKLXN0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBtb2RlLCB1bnNpZ25lZCBpbnQgZGl2aXNvcjEsCi0JICAgIHVuc2lnbmVkIGludCBkaXZpc29yMikKLXsKLQlvdXRiKDB4MzIsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0Jb3V0YigweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFIwKTsKLQlvdXRiKDB4MDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjApOwotCXVkZWxheSgxKTsKLQotCS8qICBzZXQgY291bnRlciAyIGFzIG1vZGUgMyAqLwotCW91dGIoMHhiNCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSQ1RMKTsKLQkvKiAgc2V0IGNvdW50ZXIgMSBhcyBtb2RlIDMgKi8KLQlvdXRiKDB4NzQsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkNUTCk7Ci0JdWRlbGF5KDEpOwotCi0JaWYgKG1vZGUgPT0gMSkgewotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAibW9kZSAlZCwgZGl2aXNvcjEgJWQsIGRpdmlzb3IyICVkXG4iLAotCQkJbW9kZSwgZGl2aXNvcjEsIGRpdmlzb3IyKTsKLQkJb3V0YihkaXZpc29yMiAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjIpOwotCQlvdXRiKChkaXZpc29yMiA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUjIpOwotCQlvdXRiKGRpdmlzb3IxICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSMSk7Ci0JCW91dGIoKGRpdmlzb3IxID4+IDgpICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSMSk7Ci0JfQotCi0JLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzIChqdXN0IGluIGNhc2UpICovCi0vKiBvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0NMUklOVCk7ICovCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSBDaGVjayBpZiBjaGFubmVsIGxpc3QgZnJvbSB1c2VyIGlzIGJ1aWx0IGNvcnJlY3RseQotIElmIGl0J3Mgb2ssIHRoZW4gcmV0dXJuIG5vbi16ZXJvIGxlbmd0aCBvZiByZXBlYXRlZCBzZWdtZW50IG9mIGNoYW5uZWwgbGlzdAotKi8KIHN0YXRpYyBpbnQKIGNoZWNrX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgaW50ICpjaGFubGlzdCwKQEAgLTgxOCwxODAgKzYwMywxODEgQEAKIAlyZXR1cm4gc2VnbGVuOwkvKiAgd2UgY2FuIHNlcnZlIHRoaXMgd2l0aCBNVVggbG9naWMgKi8KIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIFByb2dyYW0gc2Nhbi9nYWluIGxvZ2ljIHdpdGggY2hhbm5lbCBsaXN0LgotKi8KLXN0YXRpYyB2b2lkCi1zZXR1cF9jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsCi0JCSAgIHVuc2lnbmVkIGludCBzZWdsZW4pCitzdGF0aWMgaW50IHBjbDgxNl9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKIAotCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdF9sZW4gPSBzZWdsZW47Ci0JZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0X3BvcyA9IDA7CisJb3V0YihQQ0w4MTZfQ1RSTF9TT0ZUX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKIAotCWZvciAoaSA9IDA7IGkgPCBzZWdsZW47IGkrKykgewkvKiAgc3RvcmUgcmFuZ2UgbGlzdCB0byBjYXJkICovCi0JCWRldnByaXYtPmFpX2FjdF9jaGFubGlzdFtpXSA9IENSX0NIQU4oY2hhbmxpc3RbaV0pOwotCQlvdXRiKENSX0NIQU4oY2hhbmxpc3RbMF0pICYgMHhmLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOwotCQkvKiBzZWxlY3QgZ2FpbiAqLwotCQlvdXRiKENSX1JBTkdFKGNoYW5saXN0WzBdKSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfUkFOR0UpOworCXBjbDgxNl9haV9zZXRfY2hhbl9yYW5nZShkZXYsIGNoYW4sIHJhbmdlKTsKKwlwY2w4MTZfYWlfc2V0X2NoYW5fc2NhbihkZXYsIGNoYW4sIGNoYW4pOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CisJCXBjbDgxNl9haV9zb2Z0X3RyaWcoZGV2KTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbDgxNl9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJZGF0YVtpXSA9IHBjbDgxNl9haV9nZXRfc2FtcGxlKGRldiwgcyk7CisJfQorCW91dGIoUENMODE2X0NUUkxfRElTQUJMRV9UUklHLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CisJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE2X2RpX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9MU0JfUkVHKSB8CisJCSAgKGluYihkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9NU0JfUkVHKSA8PCA4KTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHBjbDgxNl9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkgeworCQlvdXRiKHMtPnN0YXRlICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTFNCX1JFRyk7CisJCW91dGIoKHMtPnN0YXRlID4+IDgpLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9NU0JfUkVHKTsKIAl9CiAKLQl1ZGVsYXkoMSk7Ci0JLyogc2VsZWN0IGNoYW5uZWwgaW50ZXJ2YWwgdG8gc2NhbiAqLwotCW91dGIoZGV2cHJpdi0+YWlfYWN0X2NoYW5saXN0WzBdIHwKLQkgICAgIChkZXZwcml2LT5haV9hY3RfY2hhbmxpc3Rbc2VnbGVuIC0gMV0gPDwgNCksCi0JICAgICBkZXYtPmlvYmFzZSArIFBDTDgxNl9NVVgpOworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBwY2w4MTZfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFOworCisJb3V0YihQQ0w4MTZfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKKwlwY2w4MTZfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCAwLCAwKTsKKwlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CisKKwkvKiBTdG9wIHBhY2VyICovCisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0RPX0RJX0xTQl9SRUcpOworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTVNCX1JFRyk7CiB9CiAKIHN0YXRpYyBpbnQgcGNsODE2X2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7CiAJY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXY7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgZG1hOwotCXVuc2lnbmVkIGxvbmcgcGFnZXM7Ci0JLyogaW50IGk7ICovCiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7Ci0KLQlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgYm9hcmQtPmlvX3JhbmdlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHBjbDgxNl9jaGVjayhkZXYtPmlvYmFzZSkpIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkkgY2FuJ3QgZGV0ZWN0IGJvYXJkLiBGQUlMIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KKwlpbnQgcmV0OworCWludCBpOwogCiAJZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7CiAJaWYgKCFkZXZwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICgoMSA8PCBpdC0+b3B0aW9uc1sxXSkgJiBib2FyZC0+SVJRYml0cykgewotCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgaW50ZXJydXB0X3BjbDgxNiwgMCwKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHdlIGNhbiB1c2UgSVJRIDItNyBmb3IgYXN5bmMgY29tbWFuZCBzdXBwb3J0ICovCisJaWYgKGl0LT5vcHRpb25zWzFdID49IDIgJiYgaXQtPm9wdGlvbnNbMV0gPD0gNykgeworCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgcGNsODE2X2ludGVycnVwdCwgMCwKIAkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKIAkJaWYgKHJldCA9PSAwKQogCQkJZGV2LT5pcnEgPSBpdC0+b3B0aW9uc1sxXTsKIAl9CiAKLQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7CS8qIG51bWJlciBvZiBzdWJkZXZpY2Ugd2hpY2ggdXNlIElSUSAqLwotCWRldnByaXYtPmludDgxNl9tb2RlID0gMDsJLyogbW9kZSBvZiBpcnEgKi8KLQotCS8qIGdyYWIgb3VyIERNQSAqLwotCWRtYSA9IDA7Ci0JZGV2cHJpdi0+ZG1hID0gZG1hOwotCWlmICghZGV2LT5pcnEpCi0JCWdvdG8gbm9fZG1hOwkvKiBpZiB3ZSBoYXZlbid0IElSUSwgd2UgY2FuJ3QgdXNlIERNQSAqLwotCi0JaWYgKGJvYXJkLT5ETUFiaXRzICE9IDApIHsJLyogYm9hcmQgc3VwcG9ydCBETUEgKi8KLQkJZG1hID0gaXQtPm9wdGlvbnNbMl07Ci0JCWlmIChkbWEgPCAxKQotCQkJZ290byBub19kbWE7CS8qIERNQSBkaXNhYmxlZCAqLwotCi0JCWlmICgoKDEgPDwgZG1hKSAmIGJvYXJkLT5ETUFiaXRzKSA9PSAwKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJETUEgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIEZBSUwhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwkvKiBCYWQgRE1BICovCi0JCX0KLQkJcmV0ID0gcmVxdWVzdF9kbWEoZG1hLCBkZXYtPmJvYXJkX25hbWUpOworCS8qIHdlIG5lZWQgYW4gSVJRIHRvIGRvIERNQSBvbiBjaGFubmVsIDMgb3IgMSAqLworCWlmIChkZXYtPmlycSAmJiAoaXQtPm9wdGlvbnNbMl0gPT0gMyB8fCBpdC0+b3B0aW9uc1syXSA9PSAxKSkgeworCQlyZXQgPSByZXF1ZXN0X2RtYShpdC0+b3B0aW9uc1syXSwgZGV2LT5ib2FyZF9uYW1lKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSAldSwgRkFJTCFcbiIsIGRtYSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwkvKiBETUEgaXNuJ3QgZnJlZSAqLwotCQl9Ci0KLQkJZGV2cHJpdi0+ZG1hID0gZG1hOwotCQlwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLwotCQlkZXZwcml2LT5kbWFidWZbMF0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCi0JCWlmICghZGV2cHJpdi0+ZG1hYnVmWzBdKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciwgRkFJTCFcbiIpOwotCQkJLyoKLQkJCSAqIG1heWJlIGV4cGVyaW1lbnQgd2l0aCB0cnlfdG9fZnJlZV9wYWdlcygpCi0JCQkgKiB3aWxsIGhlbHAgLi4uLgotCQkJICovCi0JCQlyZXR1cm4gLUVCVVNZOwkvKiBubyBidWZmZXIgOi0oICovCi0JCX0KLQkJZGV2cHJpdi0+ZG1hcGFnZXNbMF0gPSBwYWdlczsKLQkJZGV2cHJpdi0+aHdkbWFwdHJbMF0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRldnByaXYtPmRtYWJ1ZlswXSk7Ci0JCWRldnByaXYtPmh3ZG1hc2l6ZVswXSA9ICgxIDw8IHBhZ2VzKSAqIFBBR0VfU0laRTsKLQotCQlkZXZwcml2LT5kbWFidWZbMV0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlsxXSkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXIsIEZBSUwhXG4iKTsKKwkJCQkidW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgJWRcbiIsCisJCQkJaXQtPm9wdGlvbnNbMl0pOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQotCQlkZXZwcml2LT5kbWFwYWdlc1sxXSA9IHBhZ2VzOwotCQlkZXZwcml2LT5od2RtYXB0clsxXSA9IHZpcnRfdG9fYnVzKCh2b2lkICopZGV2cHJpdi0+ZG1hYnVmWzFdKTsKLQkJZGV2cHJpdi0+aHdkbWFzaXplWzFdID0gKDEgPDwgcGFnZXMpICogUEFHRV9TSVpFOworCQlkZXZwcml2LT5kbWEgPSBpdC0+b3B0aW9uc1syXTsKKworCQlkZXZwcml2LT5kbWFwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLworCQlkZXZwcml2LT5od2RtYXNpemUgPSAoMSA8PCBkZXZwcml2LT5kbWFwYWdlcykgKiBQQUdFX1NJWkU7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBkbWFidWY7CisKKwkJCWRtYWJ1ZiA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBkZXZwcml2LT5kbWFwYWdlcyk7CisJCQlpZiAoIWRtYWJ1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJZGV2cHJpdi0+ZG1hYnVmW2ldID0gZG1hYnVmOworCQkJZGV2cHJpdi0+aHdkbWFwdHJbaV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRtYWJ1Zik7CisJCX0KIAl9CiAKLW5vX2RtYToKLQotLyogIGlmIChib2FyZC0+bl9hb2NoYW4gPiAwKQotICAgIHN1YmRldnNbMV0gPSBDT01FRElfU1VCRF9BTzsKLSAgaWYgKGJvYXJkLT5uX2RpY2hhbiA+IDApCi0gICAgc3ViZGV2c1syXSA9IENPTUVESV9TVUJEX0RJOwotICBpZiAoYm9hcmQtPm5fZG9jaGFuID4gMCkKLSAgICBzdWJkZXZzWzNdID0gQ09NRURJX1NVQkRfRE87Ci0qLwotCi0JcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKKwlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQlpZiAoYm9hcmQtPm5fYWljaGFuID4gMCkgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9DTURfUkVBRCB8IFNERl9ESUZGOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW47Ci0JCXMtPm1heGRhdGEgPSBib2FyZC0+YWlfbWF4ZGF0YTsKLQkJcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YWlfcmFuZ2VfdHlwZTsKLQkJcy0+aW5zbl9yZWFkID0gcGNsODE2X2FpX2luc25fcmVhZDsKLQkJaWYgKGRldi0+aXJxKSB7Ci0JCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKLQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfQ01EX1JFQUQ7Ci0JCQlzLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+YWlfY2hhbmxpc3Q7Ci0JCQlzLT5kb19jbWR0ZXN0ID0gcGNsODE2X2FpX2NtZHRlc3Q7Ci0JCQlzLT5kb19jbWQgPSBwY2w4MTZfYWlfY21kOwotCQkJcy0+cG9sbCA9IHBjbDgxNl9haV9wb2xsOwotCQkJcy0+Y2FuY2VsID0gcGNsODE2X2FpX2NhbmNlbDsKLQkJfQotCX0gZWxzZSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfQ01EX1JFQUQgfCBTREZfRElGRjsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gYm9hcmQtPmFpX21heGRhdGE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfcGNsODE2OworCXMtPmluc25fcmVhZAk9IHBjbDgxNl9haV9pbnNuX3JlYWQ7CisJaWYgKGRldnByaXYtPmRtYSkgeworCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9DTURfUkVBRDsKKwkJcy0+bGVuX2NoYW5saXN0CT0gYm9hcmQtPmFpX2NoYW5saXN0OworCQlzLT5kb19jbWR0ZXN0CT0gcGNsODE2X2FpX2NtZHRlc3Q7CisJCXMtPmRvX2NtZAk9IHBjbDgxNl9haV9jbWQ7CisJCXMtPnBvbGwJCT0gcGNsODE2X2FpX3BvbGw7CisJCXMtPmNhbmNlbAk9IHBjbDgxNl9haV9jYW5jZWw7CiAJfQogCisJLyogQW5hbG9nIE9VdHB1dCBzdWJkZXZpY2UgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX1VOVVNFRDsKICNpZiAwCi1jYXNlIENPTUVESV9TVUJEX0FPOgorCXN1YmRldnNbMV0gPSBDT01FRElfU1VCRF9BTzsKIAlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EOwotCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FvY2hhbjsKKwlzLT5uX2NoYW4gPSAxOwogCXMtPm1heGRhdGEgPSBib2FyZC0+YW9fbWF4ZGF0YTsKLQlzLT5sZW5fY2hhbmxpc3QgPSBib2FyZC0+YW9fY2hhbmxpc3Q7Ci0Jcy0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YW9fcmFuZ2VfdHlwZTsKLQlicmVhazsKLQotY2FzZSBDT01FRElfU1VCRF9ESToKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7Ci0Jcy0+bl9jaGFuID0gYm9hcmQtPm5fZGljaGFuOwotCXMtPm1heGRhdGEgPSAxOwotCXMtPmxlbl9jaGFubGlzdCA9IGJvYXJkLT5uX2RpY2hhbjsKLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCWJyZWFrOwotCi1jYXNlIENPTUVESV9TVUJEX0RPOgotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kb2NoYW47Ci0Jcy0+bWF4ZGF0YSA9IDE7Ci0Jcy0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPm5fZG9jaGFuOwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7Ci0JYnJlYWs7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODE2OwogI2VuZGlmCiAKKwkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzJdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbgk9IDE2OworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzCT0gcGNsODE2X2RpX2luc25fYml0czsKKworCS8qIERpZ2l0YWwgT3V0cHV0IHN1YmRldmljZSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfRE87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbgk9IDE2OworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzCT0gcGNsODE2X2RvX2luc25fYml0czsKKwogCXBjbDgxNl9yZXNldChkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDA3LDM0ICs3OTMsMTMgQEAKIAkJaWYgKGRldnByaXYtPmRtYSkKIAkJCWZyZWVfZG1hKGRldnByaXYtPmRtYSk7CiAJCWlmIChkZXZwcml2LT5kbWFidWZbMF0pCi0JCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlswXSwgZGV2cHJpdi0+ZG1hcGFnZXNbMF0pOworCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMF0sIGRldnByaXYtPmRtYXBhZ2VzKTsKIAkJaWYgKGRldnByaXYtPmRtYWJ1ZlsxXSkKLQkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzFdLCBkZXZwcml2LT5kbWFwYWdlc1sxXSk7CisJCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlsxXSwgZGV2cHJpdi0+ZG1hcGFnZXMpOwogCX0KIAljb21lZGlfbGVnYWN5X2RldGFjaChkZXYpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjbDgxNl9ib2FyZCBib2FyZHR5cGVzW10gPSB7Ci0JeyJwY2w4MTYiLCA4LCAxNiwgMTAwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxNiwKLQkgJnJhbmdlX3BjbDgxNiwgUENMeDF4X1JBTkdFLAotCSAweDAwZmMsCQkvKiAgSVJRIG1hc2sgKi8KLQkgMHgwYSwJCQkvKiAgRE1BIG1hc2sgKi8KLQkgMHhmZmZmLAkJLyogIDE2LWJpdCBjYXJkICovCi0JIDB4ZmZmZiwJCS8qICBEL0EgbWF4ZGF0YSAqLwotCSAxMDI0LAotCSAxLAkJCS8qICBhbyBjaGFuIGxpc3QgKi8KLQkgSTgyNTRfT1NDX0JBU0VfMTBNSFp9LAotCXsicGNsODE0YiIsIDgsIDE2LCAxMDAwMCwgMSwgMTYsIDE2LCAmcmFuZ2VfcGNsODE2LAotCSAmcmFuZ2VfcGNsODE2LCBQQ0x4MXhfUkFOR0UsCi0JIDB4MDBmYywKLQkgMHgwYSwKLQkgMHgzZmZmLAkJLyogMTQgYml0IGNhcmQgKi8KLQkgMHgzZmZmLAotCSAxMDI0LAotCSAxLAotCSBJODI1NF9PU0NfQkFTRV8xME1IWn0sCi19OwotCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgcGNsODE2X2RyaXZlciA9IHsKIAkuZHJpdmVyX25hbWUJPSAicGNsODE2IiwKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCmluZGV4IGZhMTc1OGEuLjY0NjM0NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKQEAgLTExMCw4ICsxMTAsNiBAQAogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIjgyNTMuaCIKIAotLyogI2RlZmluZSBQQ0w4MThfTU9ERTEzX0FPIDEgKi8KLQogLyogYm9hcmRzIGNvbnN0YW50cyAqLwogCiAjZGVmaW5lIGJvYXJkUENMODE4TCAwCkBAIC0xMjEsNDYgKzExOSwzOCBAQAogI2RlZmluZSBib2FyZFBDTDgxOCA0CiAjZGVmaW5lIGJvYXJkUENMNzE4IDUKIAotLyogSU8gc3BhY2UgbGVuICovCi0jZGVmaW5lIFBDTHgxeF9SQU5HRSAxNgotLyogSU8gc3BhY2UgbGVuIGlmIHdlIHVzZSBGSUZPICovCi0jZGVmaW5lIFBDTHgxeEZJRk9fUkFOR0UgMzIKLQotLyogVzogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLSNkZWZpbmUgUENMODE4X0NMUklOVCA4Ci0vKiBSOiByZXR1cm4gc3RhdHVzIGJ5dGUgKi8KLSNkZWZpbmUgUENMODE4X1NUQVRVUyA4Ci0vKiBSOiBBL0QgaGlnaCBieXRlIFc6IEEvRCByYW5nZSBjb250cm9sICovCi0jZGVmaW5lIFBDTDgxOF9SQU5HRSAxCi0vKiBSOiBuZXh0IG11eCBzY2FuIGNoYW5uZWwgVzogbXV4IHNjYW4gY2hhbm5lbCAmIHJhbmdlIGNvbnRyb2wgcG9pbnRlciAqLwotI2RlZmluZSBQQ0w4MThfTVVYIDIKLS8qIFIvVzogb3BlcmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUENMODE4X0NPTlRST0wgOQotLyogVzogY291bnRlciBlbmFibGUgKi8KLSNkZWZpbmUgUENMODE4X0NOVEVOQUJMRSAxMAotCi0vKiBSOiBsb3cgYnl0ZSBvZiBBL0QgVzogc29mdCBBL0QgdHJpZ2dlciAqLwotI2RlZmluZSBQQ0w4MThfQURfTE8gMAotLyogUjogaGlnaCBieXRlIG9mIEEvRCBXOiBBL0QgcmFuZ2UgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MThfQURfSEkgMQotLyogVzogRC9BIGxvdyZoaWdoIGJ5dGUgKi8KLSNkZWZpbmUgUENMODE4X0RBX0xPIDQKLSNkZWZpbmUgUENMODE4X0RBX0hJIDUKLS8qIFI6IGxvdyZoaWdoIGJ5dGUgb2YgREkgKi8KLSNkZWZpbmUgUENMODE4X0RJX0xPIDMKLSNkZWZpbmUgUENMODE4X0RJX0hJIDExCi0vKiBXOiBsb3cmaGlnaCBieXRlIG9mIERPICovCi0jZGVmaW5lIFBDTDgxOF9ET19MTyAzCi0jZGVmaW5lIFBDTDgxOF9ET19ISSAxMQotLyogVzogUENMNzE4IHNlY29uZCBEL0EgKi8KLSNkZWZpbmUgUENMNzE4X0RBMl9MTyA2Ci0jZGVmaW5lIFBDTDcxOF9EQTJfSEkgNwotLyogY291bnRlcnMgKi8KLSNkZWZpbmUgUENMODE4X0NUUjAgMTIKLSNkZWZpbmUgUENMODE4X0NUUjEgMTMKLSNkZWZpbmUgUENMODE4X0NUUjIgMTQKLS8qIFc6IGNvdW50ZXIgY29udHJvbCAqLwotI2RlZmluZSBQQ0w4MThfQ1RSQ1RMIDE1CisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIFBDTDgxOF9BSV9MU0JfUkVHCQkJMHgwMAorI2RlZmluZSBQQ0w4MThfQUlfTVNCX1JFRwkJCTB4MDEKKyNkZWZpbmUgUENMODE4X1JBTkdFX1JFRwkJCTB4MDEKKyNkZWZpbmUgUENMODE4X01VWF9SRUcJCQkJMHgwMgorI2RlZmluZSBQQ0w4MThfTVVYX1NDQU4oX2ZpcnN0LCBfbGFzdCkJCSgoKF9sYXN0KSA8PCA0KSB8IChfZmlyc3QpKQorI2RlZmluZSBQQ0w4MThfRE9fRElfTFNCX1JFRwkJCTB4MDMKKyNkZWZpbmUgUENMODE4X0FPX0xTQl9SRUcoeCkJCQkoMHgwNCArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODE4X0FPX01TQl9SRUcoeCkJCQkoMHgwNSArICgoeCkgKiAyKSkKKyNkZWZpbmUgUENMODE4X1NUQVRVU19SRUcJCQkweDA4CisjZGVmaW5lIFBDTDgxOF9TVEFUVVNfTkVYVF9DSEFOX01BU0sJCSgweGYgPDwgMCkKKyNkZWZpbmUgUENMODE4X1NUQVRVU19JTlQJCQkoMSA8PCA0KQorI2RlZmluZSBQQ0w4MThfU1RBVFVTX01VWAkJCSgxIDw8IDUpCisjZGVmaW5lIFBDTDgxOF9TVEFUVVNfVU5JCQkJKDEgPDwgNikKKyNkZWZpbmUgUENMODE4X1NUQVRVU19FT0MJCQkoMSA8PCA3KQorI2RlZmluZSBQQ0w4MThfQ1RSTF9SRUcJCQkJMHgwOQorI2RlZmluZSBQQ0w4MThfQ1RSTF9ESVNBQkxFX1RSSUcJCSgwIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DVFJMX1NPRlRfVFJJRwkJCSgxIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DVFJMX0VYVF9UUklHCQkJKDIgPDwgMCkKKyNkZWZpbmUgUENMODE4X0NUUkxfUEFDRVJfVFJJRwkJCSgzIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DVFJMX0RNQUUJCQkoMSA8PCAyKQorI2RlZmluZSBQQ0w4MThfQ1RSTF9JUlEoeCkJCQkoKHgpIDw8IDQpCisjZGVmaW5lIFBDTDgxOF9DVFJMX0lOVEUJCQkoMSA8PCA3KQorI2RlZmluZSBQQ0w4MThfQ05URU5BQkxFX1JFRwkJCTB4MGEKKyNkZWZpbmUgUENMODE4X0NOVEVOQUJMRV9QQUNFUl9FTkEJCSgwIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DTlRFTkFCTEVfUEFDRVJfVFJJRzAJCSgxIDw8IDApCisjZGVmaW5lIFBDTDgxOF9DTlRFTkFCTEVfQ05UMF9FWFRfQ0xLCQkoMCA8PCAxKQorI2RlZmluZSBQQ0w4MThfQ05URU5BQkxFX0NOVDBfSU5UX0NMSwkJKDEgPDwgMSkKKyNkZWZpbmUgUENMODE4X0RPX0RJX01TQl9SRUcJCQkweDBiCisjZGVmaW5lIFBDTDgxOF9USU1FUl9CQVNFCQkJMHgwYwogCiAvKiBXOiBmaWZvIGVuYWJsZS9kaXNhYmxlICovCiAjZGVmaW5lIFBDTDgxOF9GSV9FTkFCTEUgNgpAQCAtMTcyLDE5ICsxNjIsNyBAQAogI2RlZmluZSBQQ0w4MThfRklfU1RBVFVTIDI1CiAvKiBSOiBvbmUgcmVjb3JkIGZyb20gRklGTyAqLwogI2RlZmluZSBQQ0w4MThfRklfREFUQUxPIDIzCi0jZGVmaW5lIFBDTDgxOF9GSV9EQVRBSEkgMjMKLQotLyogdHlwZSBvZiBpbnRlcnJ1cHQgaGFuZGxlciAqLwotI2RlZmluZSBJTlRfVFlQRV9BSTFfSU5UIDEKLSNkZWZpbmUgSU5UX1RZUEVfQUkxX0RNQSAyCi0jZGVmaW5lIElOVF9UWVBFX0FJMV9GSUZPIDMKLSNkZWZpbmUgSU5UX1RZUEVfQUkzX0lOVCA0Ci0jZGVmaW5lIElOVF9UWVBFX0FJM19ETUEgNQotI2RlZmluZSBJTlRfVFlQRV9BSTNfRklGTyA2Ci0jaWZkZWYgUENMODE4X01PREUxM19BTwotI2RlZmluZSBJTlRfVFlQRV9BTzFfSU5UIDcKLSNkZWZpbmUgSU5UX1RZUEVfQU8zX0lOVCA4Ci0jZW5kaWYKKyNkZWZpbmUgUENMODE4X0ZJX0RBVEFISSAyNAogCiAjZGVmaW5lIE1BR0lDX0RNQV9XT1JEIDB4NWE1YQogCkBAIC0yNjIsNDkzICsyNDAsMTI1IEBACiB9OwogCiBzdHJ1Y3QgcGNsODE4X2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBuc19taW47CisJaW50IG5fYW9jaGFuOworCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV90eXBlOworCXVuc2lnbmVkIGludCBoYXNfZG1hOjE7CisJdW5zaWduZWQgaW50IGhhc19maWZvOjE7CisJdW5zaWduZWQgaW50IGlzXzgxODoxOworfTsKIAotCWNvbnN0IGNoYXIgKm5hbWU7CS8qICBkcml2ZXIgbmFtZSAqLwotCWludCBuX3JhbmdlczsJCS8qICBsZW4gb2YgcmFuZ2UgbGlzdCAqLwotCWludCBuX2FpY2hhbl9zZTsJLyogIG51bSBvZiBBL0QgY2hhbnMgaW4gc2luZ2xlIGVuZGVkICBtb2RlICovCi0JaW50IG5fYWljaGFuX2RpZmY7CS8qICBudW0gb2YgQS9EIGNoYW5zIGluIGRpZmVyZW5jaWFsIG1vZGUgKi8KLQl1bnNpZ25lZCBpbnQgbnNfbWluOwkvKiAgbWluaW1hbCBhbGxvd2VkIGRlbGF5IGJldHdlZW4gc2FtcGxlcyAoaW4gbnMpICovCi0JaW50IG5fYW9jaGFuOwkJLyogIG51bSBvZiBEL0EgY2hhbnMgKi8KLQlpbnQgbl9kaWNoYW47CQkvKiAgbnVtIG9mIERJIGNoYW5zICovCi0JaW50IG5fZG9jaGFuOwkJLyogIG51bSBvZiBETyBjaGFucyAqLwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV90eXBlOwkvKiAgZGVmYXVsdCBBL0QgcmFuZ2VsaXN0ICovCi0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX3R5cGU7CS8qICBkZWZhdWx0IEQvQSByYW5nZWxpc3QgKi8KLQl1bnNpZ25lZCBpbnQgaW9fcmFuZ2U7CS8qICBsZW4gb2YgSU8gc3BhY2UgKi8KLQl1bnNpZ25lZCBpbnQgSVJRYml0czsJLyogIGFsbG93ZWQgaW50ZXJydXB0cyAqLwotCXVuc2lnbmVkIGludCBETUFiaXRzOwkvKiAgYWxsb3dlZCBETUEgY2hhbnMgKi8KLQlpbnQgYWlfbWF4ZGF0YTsJCS8qICBtYXhkYXRhIGZvciBBL0QgKi8KLQlpbnQgYW9fbWF4ZGF0YTsJCS8qICBtYXhkYXRhIGZvciBEL0EgKi8KLQl1bnNpZ25lZCBjaGFyIGZpZm87CS8qICAxPWJvYXJkIGhhcyBGSUZPICovCi0JaW50IGlzXzgxODsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkIGJvYXJkdHlwZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJwY2w4MThsIiwKKwkJLm5zX21pbgkJPSAyNTAwMCwKKwkJLm5fYW9jaGFuCT0gMSwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4bF9sX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MThoIiwKKwkJLm5zX21pbgkJPSAxMDAwMCwKKwkJLm5fYW9jaGFuCT0gMSwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4aF9haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwgeworCQkubmFtZQkJPSAicGNsODE4aGQiLAorCQkubnNfbWluCQk9IDEwMDAwLAorCQkubl9hb2NoYW4JPSAxLAorCQkuYWlfcmFuZ2VfdHlwZQk9ICZyYW5nZV9wY2w4MThoX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5oYXNfZmlmbwk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MThoZyIsCisJCS5uc19taW4JCT0gMTAwMDAsCisJCS5uX2FvY2hhbgk9IDEsCisJCS5haV9yYW5nZV90eXBlCT0gJnJhbmdlX3BjbDgxOGhnX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5oYXNfZmlmbwk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w4MTgiLAorCQkubnNfbWluCQk9IDEwMDAwLAorCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfcmFuZ2VfdHlwZQk9ICZyYW5nZV9wY2w4MThoX2FpLAorCQkuaGFzX2RtYQk9IDEsCisJCS5pc184MTgJCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY2w3MTgiLAorCQkubnNfbWluCQk9IDE2MDAwLAorCQkubl9hb2NoYW4JPSAyLAorCQkuYWlfcmFuZ2VfdHlwZQk9ICZyYW5nZV91bmlwb2xhcjUsCisJCS5oYXNfZG1hCT0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJwY20zNzE4IiwKKwkJLm5zX21pbgkJPSAxMDAwMCwKKwkJLmFpX3JhbmdlX3R5cGUJPSAmcmFuZ2VfcGNsODE4aF9haSwKKwkJLmhhc19kbWEJPSAxLAorCQkuaXNfODE4CQk9IDEsCisJfSwKIH07CiAKIHN0cnVjdCBwY2w4MThfcHJpdmF0ZSB7Ci0KIAl1bnNpZ25lZCBpbnQgZG1hOwkvKiAgdXNlZCBETUEsIDA9ZG9uJ3QgdXNlIERNQSAqLwotCXVuc2lnbmVkIGludCBpb19yYW5nZTsKKwl1bnNpZ25lZCBpbnQgZG1hcGFnZXM7CisJdW5zaWduZWQgaW50IGh3ZG1hc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGRtYWJ1ZlsyXTsJLyogIHBvaW50ZXJzIHRvIGJlZ2luIG9mIERNQSBidWZmZXJzICovCi0JdW5zaWduZWQgaW50IGRtYXBhZ2VzWzJdOwkvKiAgbGVuIG9mIERNQSBidWZmZXJzIGluIFBBR0VfU0laRXMgKi8KIAl1bnNpZ25lZCBpbnQgaHdkbWFwdHJbMl07CS8qICBoYXJkd2FyZSBhZGRyZXNzIG9mIERNQSBidWZmZXJzICovCi0JdW5zaWduZWQgaW50IGh3ZG1hc2l6ZVsyXTsJLyogIGxlbiBvZiBETUEgYnVmZmVycyBpbiBCeXRlcyAqLwogCWludCBuZXh0X2RtYV9idWY7CS8qICB3aGljaCBETUEgYnVmZmVyIHdpbGwgYmUgdXNlZCBuZXh0IHJvdW5kICovCiAJbG9uZyBkbWFfcnVuc190b19lbmQ7CS8qICBob3cgbWFueSB3ZSBtdXN0IHBlcm1vcm0gRE1BIHRyYW5zZmVyIHRvIGVuZCBvZiByZWNvcmQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfZG1hX3J1bjsJLyogIGhvdyBtYW55IGJ5dGVzIHdlIG11c3QgdHJhbnNmZXIgb24gbGFzdCBETUEgcGFnZSAqLwotCXVuc2lnbmVkIGNoYXIgbmV2ZXJlbmRpbmdfYWk7CS8qICBpZj0xLCB0aGVuIHdlIGRvIG5ldmVyZW5kaW5nIHJlY29yZCAoeW91IG11c3QgdXNlIGNhbmNlbCgpKSAqLwogCXVuc2lnbmVkIGludCBuc19taW47CS8qICBtYW5pbWFsIGFsbG93ZWQgZGVsYXkgYmV0d2VlbiBzYW1wbGVzIChpbiB1cykgZm9yIGFjdHVhbCBjYXJkICovCiAJaW50IGk4MjUzX29zY19iYXNlOwkvKiAgMS9mcmVxdWVuY3kgb2Ygb24gYm9hcmQgb3NjaWxhdG9yIGluIG5zICovCi0JaW50IGlycV9ibG9ja2VkOwkvKiAgMT1JUlEgbm93IHVzZXMgYW55IHN1YmRldiAqLwotCWludCBpcnFfd2FzX25vd19jbG9zZWQ7CS8qICB3aGVuIElSUSBmaW5pc2gsIHRoZXJlJ3Mgc3RvcmVkIGludDgxOF9tb2RlIGZvciBsYXN0IGludGVycnVwdCAqLwotCWludCBhaV9tb2RlOwkJLyogIHdobyBub3cgdXNlcyBJUlEgLSAxPUFJMSBpbnQsIDI9QUkxIGRtYSwgMz1BSTMgaW50LCA0QUkzIGRtYSAqLwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpsYXN0X2ludF9zdWI7CS8qICBwdHIgdG8gc3ViZGV2aWNlIHdoaWNoIG5vdyBmaW5pc2ggKi8KIAlpbnQgYWlfYWN0X3NjYW47CS8qICBob3cgbWFueSBzY2FucyB3ZSBmaW5pc2hlZCAqLwogCWludCBhaV9hY3RfY2hhbjsJLyogIGFjdHVhbCBwb3NpdGlvbiBpbiBhY3R1YWwgc2NhbiAqLwogCXVuc2lnbmVkIGludCBhY3RfY2hhbmxpc3RbMTZdOwkvKiAgTVVYIHNldHRpbmcgZm9yIGFjdHVhbCBBSSBvcGVyYXRpb25zICovCiAJdW5zaWduZWQgaW50IGFjdF9jaGFubGlzdF9sZW47CS8qICBob3cgbG9uZyBpcyBhY3R1YWwgTVVYIGxpc3QgKi8KIAl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0X3BvczsJLyogIGFjdHVhbCBwb3NpdGlvbiBpbiBNVVggbGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9zY2FuczsJLyogIGxlbiBvZiBzY2FubGlzdCAqLwotCXVuc2lnbmVkIGludCBhaV9uX2NoYW47CS8qICBob3cgbWFueSBjaGFubmVscyBpcyBtZWFzdXJlZCAqLwotCXVuc2lnbmVkIGludCAqYWlfY2hhbmxpc3Q7CS8qICBhY3RhdWwgY2hhbmxpc3QgKi8KLQl1bnNpZ25lZCBpbnQgYWlfZmxhZ3M7CS8qICBmbGFnbGlzdCAqLwogCXVuc2lnbmVkIGludCBhaV9kYXRhX2xlbjsJLyogIGxlbiBvZiBkYXRhIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGludCBhaV90aW1lcjE7CS8qICB0aW1lcnMgKi8KLQl1bnNpZ25lZCBpbnQgYWlfdGltZXIyOwotCXVuc2lnbmVkIGNoYXIgdXNlZmlmbzsJLyogIDE9dXNlIGZpZm8gKi8KIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07CisJdW5zaWduZWQgaW50IGRpdmlzb3IxOworCXVuc2lnbmVkIGludCBkaXZpc29yMjsKKwl1bnNpZ25lZCBpbnQgdXNlZmlmbzoxOworCXVuc2lnbmVkIGludCBhaV9jbWRfcnVubmluZzoxOworCXVuc2lnbmVkIGludCBhaV9jbWRfY2FuY2VsZWQ6MTsKIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXV4b25lY2hhbltdID0geyAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LAkvKiAgdXNlZCBmb3IgZ2FpbiBsaXN0IHByb2dyYW1taW5nICovCi0JMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZgotfTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyB2b2lkIHNldHVwX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4sCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHNlZ2xlbik7Ci1zdGF0aWMgaW50IGNoZWNrX2NoYW5uZWxfbGlzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuKTsKLQotc3RhdGljIGludCBwY2w4MThfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwotc3RhdGljIHZvaWQgc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IG1vZGUsCi0JCQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEsIHVuc2lnbmVkIGludCBkaXZpc29yMik7Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEFOQUxPRyBJTlBVVCBNT0RFMCwgODE4IGNhcmRzLCBzbG93IHZlcnNpb24KLSovCi1zdGF0aWMgaW50IHBjbDgxOF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlpbnQgbjsKLQlpbnQgdGltZW91dDsKLQotCS8qIHNvZnR3YXJlIHRyaWdnZXIsIERNQSBhbmQgSU5UIG9mZiAqLwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0KLQkvKiBzZWxlY3QgY2hhbm5lbCAqLwotCW91dGIobXV4b25lY2hhbltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV0sIGRldi0+aW9iYXNlICsgUENMODE4X01VWCk7Ci0KLQkvKiBzZWxlY3QgZ2FpbiAqLwotCW91dGIoQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9SQU5HRSk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0KLQkJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7Ci0KLQkJLyogc3RhcnQgY29udmVyc2lvbiAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKTsKLQotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCQlpZiAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X1NUQVRVUykgJiAweDEwKQotCQkJCWdvdG8gY29udl9maW5pc2g7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBpbnNuIHRpbWVvdXQiKTsKLQkJLyogY2xlYXIgSU5UIChjb252ZXJzaW9uIGVuZCkgZmxhZyAqLwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7Ci0JCXJldHVybiAtRUlPOwotCi1jb252X2ZpbmlzaDoKLQkJZGF0YVtuXSA9ICgoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0hJKSA8PCA0KSB8Ci0JCQkgICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKSA+PiA0KSk7Ci0JfQotCi0JcmV0dXJuIG47Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEFOQUxPRyBPVVRQVVQgTU9ERTAsIDgxOCBjYXJkcwotICAgb25seSBvbmUgc2FtcGxlIHBlciBjYWxsIGlzIHN1cHBvcnRlZAotKi8KLXN0YXRpYyBpbnQgcGNsODE4X2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIHZvaWQgcGNsODE4X3N0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZF9jb3VudGVycykKIHsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IG47Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxOF9USU1FUl9CQVNFOwogCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKLQkJZGF0YVtuXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJdWRlbGF5KDEpOwogCi0JcmV0dXJuIG47CisJaWYgKGxvYWRfY291bnRlcnMpIHsKKwkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOworCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7CisJfQogfQogCi1zdGF0aWMgaW50IHBjbDgxOF9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY2w4MThfYWlfc2V0dXBfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBuOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtuXTsKLQkJb3V0YigoZGF0YVtuXSAmIDB4MDAwZikgPDwgNCwgZGV2LT5pb2Jhc2UgKwotCQkgICAgIChjaGFuID8gUENMNzE4X0RBMl9MTyA6IFBDTDgxOF9EQV9MTykpOwotCQlvdXRiKChkYXRhW25dICYgMHgwZmYwKSA+PiA0LCBkZXYtPmlvYmFzZSArCi0JCSAgICAgKGNoYW4gPyBQQ0w3MThfREEyX0hJIDogUENMODE4X0RBX0hJKSk7Ci0JfQotCi0JcmV0dXJuIG47Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIERJR0lUQUwgSU5QVVQgTU9ERTAsIDgxOCBjYXJkcwotCi0gICBvbmx5IG9uZSBzYW1wbGUgcGVyIGNhbGwgaXMgc3VwcG9ydGVkCi0qLwotc3RhdGljIGludCBwY2w4MThfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9ESV9MTykgfAotCSAgICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0RJX0hJKSA8PCA4KTsKLQotCXJldHVybiBpbnNuLT5uOwotfQotCi1zdGF0aWMgaW50IHBjbDgxOF9kb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWlmIChjb21lZGlfZGlvX3VwZGF0ZV9zdGF0ZShzLCBkYXRhKSkgewotCQlvdXRiKHMtPnN0YXRlICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fTE8pOwotCQlvdXRiKChzLT5zdGF0ZSA+PiA4KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fSEkpOwotCX0KLQotCWRhdGFbMV0gPSBzLT5zdGF0ZTsKLQotCXJldHVybiBpbnNuLT5uOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBhbmFsb2cgaW5wdXQgaW50ZXJydXB0IG1vZGUgMSAmIDMsIDgxOCBjYXJkcwotICAgb25lIHNhbXBsZSBwZXIgaW50ZXJydXB0IHZlcnNpb24KLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfaW50KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5yZWFkX3N1YmRldjsKLQl1bnNpZ25lZCBjaGFyIGxvdzsKLQlpbnQgdGltZW91dCA9IDUwOwkvKiB3YWl0IG1heCA1MHVzICovCi0KLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCWlmIChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfU1RBVFVTKSAmIDB4MTApCi0JCQlnb3RvIGNvbnZfZmluaXNoOwotCQl1ZGVsYXkoMSk7Ci0JfQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfU1RBVFVTKTsJLyogY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIG1vZGUxLzMgSVJRIHdpdGhvdXQgRFJEWSEiKTsKLQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0Jcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCXJldHVybiBJUlFfSEFORExFRDsKLQotY29udl9maW5pc2g6Ci0JbG93ID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKTsKLQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgKChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQURfSEkpIDw8IDQpIHwgKGxvdyA+PiA0KSkpOwkvKiAgZ2V0IG9uZSBzYW1wbGUgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0KLQlpZiAoKGxvdyAmIDB4ZikgIT0gZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKSB7CS8qICBkcm9wb3V0ISAqLwotCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJIkEvRCBtb2RlMS8zIElSUSAtIGNoYW5uZWwgZHJvcG91dCAleCE9JXggIVxuIiwKLQkJCShsb3cgJiAweGYpLAotCQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKTsKLQkJcGNsODE4X2FpX2NhbmNlbChkZXYsIHMpOwotCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MrKzsKLQlpZiAoZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA+PSBkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuKQotCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQotCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCWlmIChzLT5hc3luYy0+Y3VyX2NoYW4gPj0gZGV2cHJpdi0+YWlfbl9jaGFuKSB7Ci0JCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7Ci0JCWRldnByaXYtPmFpX2FjdF9zY2FuLS07Ci0JfQotCi0JaWYgKCFkZXZwcml2LT5uZXZlcmVuZGluZ19haSkgewotCQlpZiAoZGV2cHJpdi0+YWlfYWN0X3NjYW4gPT0gMCkgewkvKiBhbGwgZGF0YSBzYW1wbGVkICovCi0JCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgcyk7Ci0JCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCX0KLQl9Ci0JY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBhbmFsb2cgaW5wdXQgZG1hIG1vZGUgMSAmIDMsIDgxOCBjYXJkcwotKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfcGNsODE4X2FpX21vZGUxM19kbWEoaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OwotCWludCBpLCBsZW4sIGJ1ZnB0cjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHNob3J0ICpwdHI7Ci0KLQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWY7Ci0JaWYgKChkZXZwcml2LT5kbWFfcnVuc190b19lbmQpID4gLTEgfHwgZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkpIHsJLyogIHN3aXRjaCBkbWEgYnVmcyAqLwotCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKLQkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCQlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLAotCQkJICAgICBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKLQkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCB8fCBkZXZwcml2LT5uZXZlcmVuZGluZ19haSkgewotCQkJc2V0X2RtYV9jb3VudChkZXZwcml2LT5kbWEsCi0JCQkJICAgICAgZGV2cHJpdi0+aHdkbWFzaXplW2RldnByaXYtPgotCQkJCQkJCSBuZXh0X2RtYV9idWZdKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5sYXN0X2RtYV9ydW4pOwotCQl9Ci0JCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwotCQllbmFibGVfZG1hKGRldnByaXYtPmRtYSk7Ci0JfQotCi0JZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCXB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKWRldnByaXYtPmRtYWJ1ZlsxIC0gZGV2cHJpdi0+bmV4dF9kbWFfYnVmXTsKLQotCWxlbiA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXSA+PiAxOwotCWJ1ZnB0ciA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKChwdHJbYnVmcHRyXSAmIDB4ZikgIT0gZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKSB7CS8qICBkcm9wb3V0ISAqLwotCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkiQS9EIG1vZGUxLzMgRE1BIC0gY2hhbm5lbCBkcm9wb3V0ICVkKGNhcmQpIT0lZChjaGFubGlzdCkgYXQgJWQgIVxuIiwKLQkJCQkocHRyW2J1ZnB0cl0gJiAweGYpLAotCQkJCWRldnByaXYtPmFjdF9jaGFubGlzdFtkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zXSwKLQkJCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zKTsKLQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0KLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHB0cltidWZwdHIrK10gPj4gNCk7CS8qICBnZXQgb25lIHNhbXBsZSAqLwotCi0JCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MrKzsKLQkJaWYgKGRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPj0gZGV2cHJpdi0+YWN0X2NoYW5saXN0X2xlbikKLQkJCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOwotCi0JCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCQlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikgewotCQkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKLQkJCWRldnByaXYtPmFpX2FjdF9zY2FuLS07Ci0JCX0KLQotCQlpZiAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKQotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID09IDApIHsJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQkJfQotCX0KLQotCWlmIChsZW4gPiAwKQotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGFuYWxvZyBpbnB1dCBpbnRlcnJ1cHQgbW9kZSAxICYgMywgODE4SEQvSEcgY2FyZHMKLSovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfZmlmbyhpbnQgaXJxLCB2b2lkICpkKQotewotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+cmVhZF9zdWJkZXY7Ci0JaW50IGksIGxlbjsKLQl1bnNpZ25lZCBjaGFyIGxvOwotCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9JTlRDTFIpOwkvKiAgY2xlYXIgZmlmbyBpbnQgcmVxdWVzdCAqLwotCi0JbG8gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfU1RBVFVTKTsKLQotCWlmIChsbyAmIDQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIEZJRk8gb3ZlcmZsb3chIik7Ci0JCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChsbyAmIDEpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIEZJRk8gaW50ZXJydXB0IHdpdGhvdXQgZGF0YSEiKTsKLQkJcGNsODE4X2FpX2NhbmNlbChkZXYsIHMpOwotCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1I7Ci0JCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGxvICYgMikKLQkJbGVuID0gNTEyOwotCWVsc2UKLQkJbGVuID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlsbyA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9EQVRBTE8pOwotCQlpZiAoKGxvICYgMHhmKSAhPSBkZXZwcml2LT5hY3RfY2hhbmxpc3RbZGV2cHJpdi0+YWN0X2NoYW5saXN0X3Bvc10pIHsJLyogIGRyb3BvdXQhICovCi0JCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJBL0QgbW9kZTEvMyBGSUZPIC0gY2hhbm5lbCBkcm9wb3V0ICVkIT0lZCAhXG4iLAotCQkJCShsbyAmIDB4ZiksCi0JCQkJZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdKTsKLQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKLQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0KLQkJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIChsbyA+PiA0KSB8IChpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfREFUQUhJKSA8PCA0KSk7CS8qICBnZXQgb25lIHNhbXBsZSAqLwotCi0JCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MrKzsKLQkJaWYgKGRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPj0gZGV2cHJpdi0+YWN0X2NoYW5saXN0X2xlbikKLQkJCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOwotCi0JCXMtPmFzeW5jLT5jdXJfY2hhbisrOwotCQlpZiAocy0+YXN5bmMtPmN1cl9jaGFuID49IGRldnByaXYtPmFpX25fY2hhbikgewotCQkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKLQkJCWRldnByaXYtPmFpX2FjdF9zY2FuLS07Ci0JCX0KLQotCQlpZiAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKQotCQkJaWYgKGRldnByaXYtPmFpX2FjdF9zY2FuID09IDApIHsJLyogYWxsIGRhdGEgc2FtcGxlZCAqLwotCQkJCXBjbDgxOF9haV9jYW5jZWwoZGV2LCBzKTsKLQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7Ci0JCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQkJfQotCX0KLQotCWlmIChsZW4gPiAwKQotCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBJTlQgcHJvY2VkdXJlCi0qLwotc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9wY2w4MTgoaW50IGlycSwgdm9pZCAqZCkKLXsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0KLQlpZiAoIWRldi0+YXR0YWNoZWQpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgInByZW1hdHVyZSBpbnRlcnJ1cHQiKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChkZXZwcml2LT5pcnFfYmxvY2tlZCAmJiBkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQpIHsKLQkJaWYgKChkZXZwcml2LT5uZXZlcmVuZGluZ19haSB8fCAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpICYmCi0JCQkJCQkgZGV2cHJpdi0+YWlfYWN0X3NjYW4gPiAwKSkgJiYKLQkJICAgIChkZXZwcml2LT5haV9tb2RlID09IElOVF9UWVBFX0FJMV9ETUEgfHwKLQkJICAgICBkZXZwcml2LT5haV9tb2RlID09IElOVF9UWVBFX0FJM19ETUEpKSB7Ci0JCQkvKiBUaGUgY2xlYW51cCBmcm9tIGFpX2NhbmNlbCgpIGhhcyBiZWVuIGRlbGF5ZWQKLQkJCSAgIHVudGlsIG5vdyBiZWNhdXNlIHRoZSBjYXJkIGRvZXNuJ3Qgc2VlbSB0byBsaWtlCi0JCQkgICBiZWluZyByZXByb2dyYW1tZWQgd2hpbGUgYSBETUEgdHJhbnNmZXIgaXMgaW4KLQkJCSAgIHByb2dyZXNzLgotCQkJICovCi0JCQlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IDA7Ci0JCQlkZXZwcml2LT5uZXZlcmVuZGluZ19haSA9IDA7Ci0JCQlwY2w4MThfYWlfY2FuY2VsKGRldiwgZGV2LT5yZWFkX3N1YmRldik7Ci0JCX0KLQotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0KLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXN3aXRjaCAoZGV2cHJpdi0+YWlfbW9kZSkgewotCWNhc2UgSU5UX1RZUEVfQUkxX0RNQToKLQljYXNlIElOVF9UWVBFX0FJM19ETUE6Ci0JCXJldHVybiBpbnRlcnJ1cHRfcGNsODE4X2FpX21vZGUxM19kbWEoaXJxLCBkKTsKLQljYXNlIElOVF9UWVBFX0FJMV9JTlQ6Ci0JY2FzZSBJTlRfVFlQRV9BSTNfSU5UOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfaW50KGlycSwgZCk7Ci0JY2FzZSBJTlRfVFlQRV9BSTFfRklGTzoKLQljYXNlIElOVF9UWVBFX0FJM19GSUZPOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxOF9haV9tb2RlMTNfZmlmbyhpcnEsIGQpOwotI2lmZGVmIFBDTDgxOF9NT0RFMTNfQU8KLQljYXNlIElOVF9UWVBFX0FPMV9JTlQ6Ci0JY2FzZSBJTlRfVFlQRV9BTzNfSU5UOgotCQlyZXR1cm4gaW50ZXJydXB0X3BjbDgxOF9hb19tb2RlMTNfaW50KGlycSwgZCk7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NMUklOVCk7CS8qIGNsZWFyIElOVCByZXF1ZXN0ICovCi0KLQlpZiAoIWRldnByaXYtPmlycV9ibG9ja2VkIHx8ICFkZXZwcml2LT5haV9tb2RlKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJiYWQgSVJRISIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlISIpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgQU5BTE9HIElOUFVUIE1PREUgMSBvciAzIERNQSAsIDgxOCBjYXJkcwotKi8KLXN0YXRpYyB2b2lkIHBjbDgxOF9haV9tb2RlMTNkbWFfaW50KGludCBtb2RlLCBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKLXsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwogCXVuc2lnbmVkIGludCBmbGFnczsKIAl1bnNpZ25lZCBpbnQgYnl0ZXM7CiAKIAlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwkvKiAgZGlzYWJsZSBkbWEgKi8KLQlieXRlcyA9IGRldnByaXYtPmh3ZG1hc2l6ZVswXTsKLQlpZiAoIWRldnByaXYtPm5ldmVyZW5kaW5nX2FpKSB7Ci0JCWJ5dGVzID0gZGV2cHJpdi0+YWlfbl9jaGFuICogZGV2cHJpdi0+YWlfc2NhbnMgKiBzaXplb2Yoc2hvcnQpOwkvKiAgaG93IG1hbnkgKi8KLQkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kID0gYnl0ZXMgLyBkZXZwcml2LT5od2RtYXNpemVbMF07CS8qICBob3cgbWFueSBETUEgcGFnZXMgd2UgbXVzdCBmaWlsICovCi0JCWRldnByaXYtPmxhc3RfZG1hX3J1biA9IGJ5dGVzICUgZGV2cHJpdi0+aHdkbWFzaXplWzBdOwkvKiBvbiBsYXN0IGRtYSB0cmFuc2ZlciBtdXN0IGJlIG1vdmVkICovCisJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlieXRlcyA9IGNtZC0+Y2hhbmxpc3RfbGVuICogY21kLT5zdG9wX2FyZyAqIHNpemVvZihzaG9ydCk7CisJCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA9IGJ5dGVzIC8gZGV2cHJpdi0+aHdkbWFzaXplOworCQlkZXZwcml2LT5sYXN0X2RtYV9ydW4gPSBieXRlcyAlIGRldnByaXYtPmh3ZG1hc2l6ZTsKIAkJZGV2cHJpdi0+ZG1hX3J1bnNfdG9fZW5kLS07CiAJCWlmIChkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPj0gMCkKLQkJCWJ5dGVzID0gZGV2cHJpdi0+aHdkbWFzaXplWzBdOworCQkJYnl0ZXMgPSBkZXZwcml2LT5od2RtYXNpemU7CiAJfQogCiAJZGV2cHJpdi0+bmV4dF9kbWFfYnVmID0gMDsKQEAgLTc1OSwxMzMgKzM2OSwzMTAgQEAKIAlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgYnl0ZXMpOwogCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKLQotCWlmIChtb2RlID09IDEpIHsKLQkJZGV2cHJpdi0+YWlfbW9kZSA9IElOVF9UWVBFX0FJMV9ETUE7Ci0JCW91dGIoMHg4NyB8IChkZXYtPmlycSA8PCA0KSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7CS8qIFBhY2VyK0lSUStETUEgKi8KLQl9IGVsc2UgewotCQlkZXZwcml2LT5haV9tb2RlID0gSU5UX1RZUEVfQUkzX0RNQTsKLQkJb3V0YigweDg2IHwgKGRldi0+aXJxIDw8IDQpLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsJLyogRXh0IHRyaWcrSVJRK0RNQSAqLwotCX0KIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgQU5BTE9HIElOUFVUIE1PREUgMSBvciAzLCA4MTggY2FyZHMKLSovCi1zdGF0aWMgaW50IHBjbDgxOF9haV9jbWRfbW9kZShpbnQgbW9kZSwgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIHZvaWQgcGNsODE4X2FpX3NldHVwX25leHRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwotCWludCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKLQl1bnNpZ25lZCBpbnQgc2VnbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoZGV2cHJpdi0+aXJxX2Jsb2NrZWQpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlzdGFydF9wYWNlcihkZXYsIC0xLCAwLCAwKTsJLyogIHN0b3AgcGFjZXIgKi8KLQotCXNlZ2xlbiA9IGNoZWNrX2NoYW5uZWxfbGlzdChkZXYsIHMsIGRldnByaXYtPmFpX2NoYW5saXN0LAotCQkJCSAgICBkZXZwcml2LT5haV9uX2NoYW4pOwotCWlmIChzZWdsZW4gPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlzZXR1cF9jaGFubmVsX2xpc3QoZGV2LCBzLCBkZXZwcml2LT5haV9jaGFubGlzdCwKLQkJCSAgIGRldnByaXYtPmFpX25fY2hhbiwgc2VnbGVuKTsKLQotCXVkZWxheSgxKTsKLQotCWRldnByaXYtPmFpX2FjdF9zY2FuID0gZGV2cHJpdi0+YWlfc2NhbnM7Ci0JZGV2cHJpdi0+YWlfYWN0X2NoYW4gPSAwOwotCWRldnByaXYtPmlycV9ibG9ja2VkID0gMTsKLQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSAwOwotCWRldnByaXYtPm5ldmVyZW5kaW5nX2FpID0gMDsKLQlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKLQlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAwOwotCi0JaWYgKChkZXZwcml2LT5haV9zY2FucyA9PSAwKSB8fCAoZGV2cHJpdi0+YWlfc2NhbnMgPT0gLTEpKQotCQlkZXZwcml2LT5uZXZlcmVuZGluZ19haSA9IDE7CS8qIHdlbGwsIHVzZXIgd2FudCBuZXZlcmVuZGluZyAqLwotCi0JaWYgKG1vZGUgPT0gMSkgewotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmk4MjUzX29zY19iYXNlLAotCQkJCQkgICZkaXZpc29yMSwgJmRpdmlzb3IyLAotCQkJCQkgICZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkgIFRSSUdfUk9VTkRfTkVBUkVTVCk7Ci0JCWlmIChkaXZpc29yMSA9PSAxKSB7CS8qIFBDTDcxOC84MTggY3Jhc2ggaWYgYW55IGRpdmlzb3IgaXMgc2V0IHRvIDEgKi8KLQkJCWRpdmlzb3IxID0gMjsKLQkJCWRpdmlzb3IyIC89IDI7Ci0JCX0KLQkJaWYgKGRpdmlzb3IyID09IDEpIHsKLQkJCWRpdmlzb3IyID0gMjsKLQkJCWRpdmlzb3IxIC89IDI7Ci0JCX0KKwlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOworCWRldnByaXYtPm5leHRfZG1hX2J1ZiA9IDEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWY7CisJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCA+IC0xIHx8IGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FKSB7CisJCS8qIHN3aXRjaCBkbWEgYnVmcyAqLworCQlzZXRfZG1hX21vZGUoZGV2cHJpdi0+ZG1hLCBETUFfTU9ERV9SRUFEKTsKKwkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQlzZXRfZG1hX2FkZHIoZGV2cHJpdi0+ZG1hLAorCQkJICAgICBkZXZwcml2LT5od2RtYXB0cltkZXZwcml2LT5uZXh0X2RtYV9idWZdKTsKKwkJaWYgKGRldnByaXYtPmRtYV9ydW5zX3RvX2VuZCB8fCBjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSkKKwkJCXNldF9kbWFfY291bnQoZGV2cHJpdi0+ZG1hLCBkZXZwcml2LT5od2RtYXNpemUpOworCQllbHNlCisJCQlzZXRfZG1hX2NvdW50KGRldnByaXYtPmRtYSwgZGV2cHJpdi0+bGFzdF9kbWFfcnVuKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCWVuYWJsZV9kbWEoZGV2cHJpdi0+ZG1hKTsKIAl9CiAKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRSk7CS8qIGVuYWJsZSBwYWNlciAqLwotCi0Jc3dpdGNoIChkZXZwcml2LT5kbWEpIHsKLQljYXNlIDE6CQkvKiAgRE1BICovCi0JY2FzZSAzOgotCQlwY2w4MThfYWlfbW9kZTEzZG1hX2ludChtb2RlLCBkZXYsIHMpOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCWlmICghZGV2cHJpdi0+dXNlZmlmbykgewotCQkJLyogSVJRICovCi0JCQlpZiAobW9kZSA9PSAxKSB7Ci0JCQkJZGV2cHJpdi0+YWlfbW9kZSA9IElOVF9UWVBFX0FJMV9JTlQ7Ci0JCQkJLyogUGFjZXIrSVJRICovCi0JCQkJb3V0YigweDgzIHwgKGRldi0+aXJxIDw8IDQpLAotCQkJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0JCQl9IGVsc2UgewotCQkJCWRldnByaXYtPmFpX21vZGUgPSBJTlRfVFlQRV9BSTNfSU5UOwotCQkJCS8qIEV4dCB0cmlnK0lSUSAqLwotCQkJCW91dGIoMHg4MiB8IChkZXYtPmlycSA8PCA0KSwKLQkJCQkgICAgIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogRklGTyAqLwotCQkJLyogZW5hYmxlIEZJRk8gKi8KLQkJCW91dGIoMSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRU5BQkxFKTsKLQkJCWlmIChtb2RlID09IDEpIHsKLQkJCQlkZXZwcml2LT5haV9tb2RlID0gSU5UX1RZUEVfQUkxX0ZJRk87Ci0JCQkJLyogUGFjZXIgKi8KLQkJCQlvdXRiKDB4MDMsIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXZwcml2LT5haV9tb2RlID0gSU5UX1RZUEVfQUkzX0ZJRk87Ci0JCQkJb3V0YigweDAyLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXJ0X3BhY2VyKGRldiwgbW9kZSwgZGl2aXNvcjEsIGRpdmlzb3IyKTsKLQotCXJldHVybiAwOworCWRldnByaXYtPmRtYV9ydW5zX3RvX2VuZC0tOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gU3RhcnQvc3RvcCBwYWNlciBvbmJvYXJkIHBhY2VyCi0qLwotc3RhdGljIHZvaWQgc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IG1vZGUsCi0JCQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEsIHVuc2lnbmVkIGludCBkaXZpc29yMikKK3N0YXRpYyB2b2lkIHBjbDgxOF9haV9zZXRfY2hhbl9yYW5nZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UpCiB7Ci0Jb3V0YigweGI0LCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJDVEwpOwotCW91dGIoMHg3NCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSQ1RMKTsKKwlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENMODE4X01VWF9SRUcpOworCW91dGIocmFuZ2UsIGRldi0+aW9iYXNlICsgUENMODE4X1JBTkdFX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9haV9zZXRfY2hhbl9zY2FuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgIHVuc2lnbmVkIGludCBmaXJzdF9jaGFuLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbGFzdF9jaGFuKQoreworCW91dGIoUENMODE4X01VWF9TQ0FOKGZpcnN0X2NoYW4sIGxhc3RfY2hhbiksCisJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxOF9NVVhfUkVHKTsKK30KKworc3RhdGljIHZvaWQgcGNsODE4X2FpX3NldHVwX2NoYW5saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNoYW5saXN0LAorCQkJCSAgICAgdW5zaWduZWQgaW50IHNlZ2xlbikKK3sKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGZpcnN0X2NoYW4gPSBDUl9DSEFOKGNoYW5saXN0WzBdKTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9jaGFuOworCXVuc2lnbmVkIGludCByYW5nZTsKKwlpbnQgaTsKKworCWRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4gPSBzZWdsZW47CisJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7CisKKwkvKiBzdG9yZSByYW5nZSBsaXN0IHRvIGNhcmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VnbGVuOyBpKyspIHsKKwkJbGFzdF9jaGFuID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7CisJCXJhbmdlID0gQ1JfUkFOR0UoY2hhbmxpc3RbaV0pOworCisJCWRldnByaXYtPmFjdF9jaGFubGlzdFtpXSA9IGxhc3RfY2hhbjsKKworCQlwY2w4MThfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBsYXN0X2NoYW4sIHJhbmdlKTsKKwl9CisKIAl1ZGVsYXkoMSk7CiAKLQlpZiAobW9kZSA9PSAxKSB7Ci0JCW91dGIoZGl2aXNvcjIgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFIyKTsKLQkJb3V0YigoZGl2aXNvcjIgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFIyKTsKLQkJb3V0YihkaXZpc29yMSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUjEpOwotCQlvdXRiKChkaXZpc29yMSA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUjEpOworCXBjbDgxOF9haV9zZXRfY2hhbl9zY2FuKGRldiwgZmlyc3RfY2hhbiwgbGFzdF9jaGFuKTsKK30KKworc3RhdGljIHZvaWQgcGNsODE4X2FpX2NsZWFyX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCS8qIHdyaXRpbmcgYW55IHZhbHVlIGNsZWFycyB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X1NUQVRVU19SRUcpOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfYWlfc29mdF90cmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJLyogd3JpdGluZyBhbnkgdmFsdWUgdHJpZ2dlcnMgYSBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BSV9MU0JfUkVHKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwY2w4MThfYWlfZ2V0X2ZpZm9fc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmNoYW4pCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9EQVRBTE8pOworCXZhbCB8PSAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0RBVEFISSkgPDwgOCk7CisKKwlpZiAoY2hhbikKKwkJKmNoYW4gPSB2YWwgJiAweGY7CisKKwlyZXR1cm4gKHZhbCA+PiA0KSAmIHMtPm1heGRhdGE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNsODE4X2FpX2dldF9zYW1wbGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgdW5zaWduZWQgaW50ICpjaGFuKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQUlfTVNCX1JFRykgPDwgODsKKwl2YWwgfD0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0FJX0xTQl9SRUcpOworCisJaWYgKGNoYW4pCisJCSpjaGFuID0gdmFsICYgMHhmOworCisJcmV0dXJuICh2YWwgPj4gNCkgJiBzLT5tYXhkYXRhOworfQorCitzdGF0aWMgaW50IHBjbDgxOF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIFBDTDgxOF9TVEFUVVNfSU5UKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgYm9vbCBwY2w4MThfYWlfZHJvcG91dChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGV4cGVjdGVkX2NoYW47CisKKwlleHBlY3RlZF9jaGFuID0gZGV2cHJpdi0+YWN0X2NoYW5saXN0W2RldnByaXYtPmFjdF9jaGFubGlzdF9wb3NdOworCWlmIChjaGFuICE9IGV4cGVjdGVkX2NoYW4pIHsKKwkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKKwkJCSJBL0QgbW9kZTEvMyAlcyAtIGNoYW5uZWwgZHJvcG91dCAlZCE9JWQgIVxuIiwKKwkJCShkZXZwcml2LT5kbWEpID8gIkRNQSIgOgorCQkJKGRldnByaXYtPnVzZWZpZm8pID8gIkZJRk8iIDogIklSUSIsCisJCQljaGFuLCBleHBlY3RlZF9jaGFuKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwY2w4MThfYWlfbmV4dF9jaGFuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcysrOworCWlmIChkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID49IGRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4pCisJCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOworCisJcy0+YXN5bmMtPmN1cl9jaGFuKys7CisJaWYgKHMtPmFzeW5jLT5jdXJfY2hhbiA+PSBjbWQtPmNoYW5saXN0X2xlbikgeworCQlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCQlkZXZwcml2LT5haV9hY3Rfc2Nhbi0tOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT1M7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJiBkZXZwcml2LT5haV9hY3Rfc2NhbiA9PSAwKSB7CisJCS8qIGFsbCBkYXRhIHNhbXBsZWQgKi8KKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9oYW5kbGVfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKHBjbDgxOF9haV9lb2MoZGV2LCBzLCBOVUxMLCAwKSkgeworCQljb21lZGlfZXJyb3IoZGV2LCAiQS9EIG1vZGUxLzMgSVJRIHdpdGhvdXQgRFJEWSEiKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOworCQlyZXR1cm47CisJfQorCisJdmFsID0gcGNsODE4X2FpX2dldF9zYW1wbGUoZGV2LCBzLCAmY2hhbik7CisKKwlpZiAocGNsODE4X2FpX2Ryb3BvdXQoZGV2LCBzLCBjaGFuKSkKKwkJcmV0dXJuOworCisJY29tZWRpX2J1Zl9wdXQocy0+YXN5bmMsIHZhbCk7CisKKwlwY2w4MThfYWlfbmV4dF9jaGFuKGRldiwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9oYW5kbGVfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgc2hvcnQgKnB0cjsKKwl1bnNpZ25lZCBpbnQgY2hhbjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpLCBsZW4sIGJ1ZnB0cjsKKworCXBjbDgxOF9haV9zZXR1cF9uZXh0X2RtYShkZXYsIHMpOworCisJcHRyID0gKHVuc2lnbmVkIHNob3J0ICopZGV2cHJpdi0+ZG1hYnVmWzEgLSBkZXZwcml2LT5uZXh0X2RtYV9idWZdOworCisJbGVuID0gZGV2cHJpdi0+aHdkbWFzaXplID4+IDE7CisJYnVmcHRyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl2YWwgPSBwdHJbYnVmcHRyKytdOworCQljaGFuID0gdmFsICYgMHhmOworCQl2YWwgPSAodmFsID4+IDQpICYgcy0+bWF4ZGF0YTsKKworCQlpZiAocGNsODE4X2FpX2Ryb3BvdXQoZGV2LCBzLCBjaGFuKSkKKwkJCWJyZWFrOworCisJCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCB2YWwpOworCisJCWlmICghcGNsODE4X2FpX25leHRfY2hhbihkZXYsIHMpKQorCQkJYnJlYWs7CiAJfQogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gQ2hlY2sgaWYgY2hhbm5lbCBsaXN0IGZyb20gdXNlciBpcyBidWlsZGVkIGNvcnJlY3RseQotIElmIGl0J3Mgb2ssIHRoZW4gcHJvZ3JhbSBzY2FuL2dhaW4gbG9naWMKLSovCitzdGF0aWMgdm9pZCBwY2w4MThfaGFuZGxlX2ZpZm8oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBjaGFuOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGksIGxlbjsKKworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIDQpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgIkEvRCBtb2RlMS8zIEZJRk8gb3ZlcmZsb3chIik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0dXMgJiAxKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgbW9kZTEvMyBGSUZPIGludGVycnVwdCB3aXRob3V0IGRhdGEhIik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0dXMgJiAyKQorCQlsZW4gPSA1MTI7CisJZWxzZQorCQlsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXZhbCA9IHBjbDgxOF9haV9nZXRfZmlmb19zYW1wbGUoZGV2LCBzLCAmY2hhbik7CisKKwkJaWYgKHBjbDgxOF9haV9kcm9wb3V0KGRldiwgcywgY2hhbikpCisJCQlicmVhazsKKworCQljb21lZGlfYnVmX3B1dChzLT5hc3luYywgdmFsKTsKKworCQlpZiAoIXBjbDgxOF9haV9uZXh0X2NoYW4oZGV2LCBzKSkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHBjbDgxOF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKK3sKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKKwlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCisJaWYgKCFkZXYtPmF0dGFjaGVkIHx8ICFkZXZwcml2LT5haV9jbWRfcnVubmluZykgeworCQlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkKSB7CisJCS8qCisJCSAqIFRoZSBjbGVhbnVwIGZyb20gYWlfY2FuY2VsKCkgaGFzIGJlZW4gZGVsYXllZAorCQkgKiB1bnRpbCBub3cgYmVjYXVzZSB0aGUgY2FyZCBkb2Vzbid0IHNlZW0gdG8gbGlrZQorCQkgKiBiZWluZyByZXByb2dyYW1tZWQgd2hpbGUgYSBETUEgdHJhbnNmZXIgaXMgaW4KKwkJICogcHJvZ3Jlc3MuCisJCSAqLworCQlkZXZwcml2LT5haV9hY3Rfc2NhbiA9IDA7CisJCXMtPmNhbmNlbChkZXYsIHMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRldnByaXYtPmRtYSkKKwkJcGNsODE4X2hhbmRsZV9kbWEoZGV2LCBzKTsKKwllbHNlIGlmIChkZXZwcml2LT51c2VmaWZvKQorCQlwY2w4MThfaGFuZGxlX2ZpZm8oZGV2LCBzKTsKKwllbHNlCisJCXBjbDgxOF9oYW5kbGVfZW9jKGRldiwgcyk7CisKKwlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CisKKwljZmNfaGFuZGxlX2V2ZW50cyhkZXYsIHMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbikKQEAgLTk0MSw1MiArNzI4LDIwIEBACiAJcmV0dXJuIHNlZ2xlbjsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfY2hhbm5lbF9saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2VnbGVuKQotewotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgaTsKLQotCWRldnByaXYtPmFjdF9jaGFubGlzdF9sZW4gPSBzZWdsZW47Ci0JZGV2cHJpdi0+YWN0X2NoYW5saXN0X3BvcyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2VnbGVuOyBpKyspIHsJLyogIHN0b3JlIHJhbmdlIGxpc3QgdG8gY2FyZCAqLwotCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RbaV0gPSBDUl9DSEFOKGNoYW5saXN0W2ldKTsKLQkJb3V0YihtdXhvbmVjaGFuW0NSX0NIQU4oY2hhbmxpc3RbaV0pXSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfTVVYKTsJLyogc2VsZWN0IGNoYW5uZWwgKi8KLQkJb3V0YihDUl9SQU5HRShjaGFubGlzdFtpXSksIGRldi0+aW9iYXNlICsgUENMODE4X1JBTkdFKTsJLyogc2VsZWN0IGdhaW4gKi8KLQl9Ci0KLQl1ZGVsYXkoMSk7Ci0KLQkvKiBzZWxlY3QgY2hhbm5lbCBpbnRlcnZhbCB0byBzY2FuICovCi0Jb3V0YihkZXZwcml2LT5hY3RfY2hhbmxpc3RbMF0gfCAoZGV2cHJpdi0+YWN0X2NoYW5saXN0W3NlZ2xlbiAtCi0JCQkJCQkJICAgICAgIDFdIDw8IDQpLAotCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfTVVYKTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIENoZWNrIGlmIGJvYXJkIGlzIHN3aXRjaGVkIHRvIFNFICgxKSBvciBESUZGKDApIG1vZGUKLSovCiBzdGF0aWMgaW50IGNoZWNrX3NpbmdsZV9lbmRlZCh1bnNpZ25lZCBpbnQgcG9ydCkKIHsKLQlpZiAoaW5iKHBvcnQgKyBQQ0w4MThfU1RBVFVTKSAmIDB4MjApCisJaWYgKGluYihwb3J0ICsgUENMODE4X1NUQVRVU19SRUcpICYgUENMODE4X1NUQVRVU19NVVgpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwogc3RhdGljIGludCBhaV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgKmJvYXJkID0gY29tZWRpX2JvYXJkKGRldik7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCWludCB0bXAsIGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOworCWludCB0bXA7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKQEAgLTEwMzUsNyArNzkwLDggQEAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7CiAJCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2cHJpdi0+aTgyNTNfb3NjX2Jhc2UsCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCisJCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAorCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKIAkJCQkJICAmY21kLT5jb252ZXJ0X2FyZywgY21kLT5mbGFncyk7CiAJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgYm9hcmQtPm5zX21pbikKIAkJCWNtZC0+Y29udmVydF9hcmcgPSBib2FyZC0+bnNfbWluOwpAQCAtMTA1NywxNTIgKzgxMywyNzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIGludCBwY2w4MThfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKLQlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGludCBjdHJsID0gMDsKKwl1bnNpZ25lZCBpbnQgc2VnbGVuOwogCi0JZGV2cHJpdi0+YWlfbl9jaGFuID0gY21kLT5jaGFubGlzdF9sZW47Ci0JZGV2cHJpdi0+YWlfY2hhbmxpc3QgPSBjbWQtPmNoYW5saXN0OwotCWRldnByaXYtPmFpX2ZsYWdzID0gY21kLT5mbGFnczsKKwlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlwY2w4MThfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisKKwlzZWdsZW4gPSBjaGVja19jaGFubmVsX2xpc3QoZGV2LCBzLCBjbWQtPmNoYW5saXN0LCBjbWQtPmNoYW5saXN0X2xlbik7CisJaWYgKHNlZ2xlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCXBjbDgxOF9haV9zZXR1cF9jaGFubGlzdChkZXYsIGNtZC0+Y2hhbmxpc3QsIHNlZ2xlbik7CisKIAlkZXZwcml2LT5haV9kYXRhX2xlbiA9IHMtPmFzeW5jLT5wcmVhbGxvY19idWZzejsKLQlkZXZwcml2LT5haV90aW1lcjEgPSAwOwotCWRldnByaXYtPmFpX3RpbWVyMiA9IDA7CisJZGV2cHJpdi0+YWlfYWN0X3NjYW4gPSBjbWQtPnN0b3BfYXJnOworCWRldnByaXYtPmFpX2FjdF9jaGFuID0gMDsKKwlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDE7CisJZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkID0gMDsKKwlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKKwlkZXZwcml2LT5kbWFfcnVuc190b19lbmQgPSAwOwogCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZGV2cHJpdi0+YWlfc2NhbnMgPSBjbWQtPnN0b3BfYXJnOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCisJCWN0cmwgfD0gUENMODE4X0NUUkxfUEFDRVJfVFJJRzsKIAllbHNlCi0JCWRldnByaXYtPmFpX3NjYW5zID0gMDsKKwkJY3RybCB8PSBQQ0w4MThfQ1RSTF9FWFRfVFJJRzsKIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKSB7CS8qICBtb2RlIDEsIDMgKi8KLQkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewkvKiAgbW9kZSAxICovCi0JCQlkZXZwcml2LT5haV90aW1lcjEgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQkJcmV0dmFsID0gcGNsODE4X2FpX2NtZF9tb2RlKDEsIGRldiwgcyk7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CS8qICBtb2RlIDMgKi8KLQkJCXJldHVybiBwY2w4MThfYWlfY21kX21vZGUoMywgZGV2LCBzKTsKLQkJfQorCW91dGIoUENMODE4X0NOVEVOQUJMRV9QQUNFUl9FTkEsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRV9SRUcpOworCisJaWYgKGRldnByaXYtPmRtYSkgeworCQlwY2w4MThfYWlfc2V0dXBfZG1hKGRldiwgcyk7CisKKwkJY3RybCB8PSBQQ0w4MThfQ1RSTF9JTlRFIHwgUENMODE4X0NUUkxfSVJRKGRldi0+aXJxKSB8CisJCQlQQ0w4MThfQ1RSTF9ETUFFOworCX0gZWxzZSBpZiAoZGV2cHJpdi0+dXNlZmlmbykgeworCQkvKiBlbmFibGUgRklGTyAqLworCQlvdXRiKDEsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0VOQUJMRSk7CisJfSBlbHNlIHsKKwkJY3RybCB8PSBQQ0w4MThfQ1RSTF9JTlRFIHwgUENMODE4X0NUUkxfSVJRKGRldi0+aXJxKTsKIAl9CisJb3V0YihjdHJsLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJMX1JFRyk7CiAKLQlyZXR1cm4gLTE7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKKwkJcGNsODE4X3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKIH0KIAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIGNhbmNlbCBhbnkgbW9kZSAxLTQgQUkKLSovCiBzdGF0aWMgaW50IHBjbDgxOF9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwogCi0JaWYgKGRldnByaXYtPmlycV9ibG9ja2VkID4gMCkgewotCQlkZXZwcml2LT5pcnFfd2FzX25vd19jbG9zZWQgPSAxOworCWlmICghZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpCisJCXJldHVybiAwOwogCi0JCXN3aXRjaCAoZGV2cHJpdi0+YWlfbW9kZSkgewotCQljYXNlIElOVF9UWVBFX0FJMV9ETUE6Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0RNQToKLQkJCWlmIChkZXZwcml2LT5uZXZlcmVuZGluZ19haSB8fAotCQkJICAgICghZGV2cHJpdi0+bmV2ZXJlbmRpbmdfYWkgJiYKLQkJCSAgICAgZGV2cHJpdi0+YWlfYWN0X3NjYW4gPiAwKSkgewotCQkJCS8qIHdhaXQgZm9yIHJ1bm5pbmcgZG1hIHRyYW5zZmVyIHRvIGVuZCwgZG8gY2xlYW51cCBpbiBpbnRlcnJ1cHQgKi8KLQkJCQlnb3RvIGVuZDsKKwlpZiAoZGV2cHJpdi0+ZG1hKSB7CisJCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSB8fAorCQkgICAgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJiBkZXZwcml2LT5haV9hY3Rfc2NhbiA+IDApKSB7CisJCQlpZiAoIWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCkgeworCQkJCS8qCisJCQkJKiBXYWl0IGZvciBydW5uaW5nIGRtYSB0cmFuc2ZlciB0byBlbmQsCisJCQkJKiBkbyBjbGVhbnVwIGluIGludGVycnVwdC4KKwkJCQkqLworCQkJCWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCA9IDE7CisJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwotCQljYXNlIElOVF9UWVBFX0FJMV9JTlQ6Ci0JCWNhc2UgSU5UX1RZUEVfQUkzX0lOVDoKLQkJY2FzZSBJTlRfVFlQRV9BSTFfRklGTzoKLQkJY2FzZSBJTlRfVFlQRV9BSTNfRklGTzoKLSNpZmRlZiBQQ0w4MThfTU9ERTEzX0FPCi0JCWNhc2UgSU5UX1RZUEVfQU8xX0lOVDoKLQkJY2FzZSBJTlRfVFlQRV9BTzNfSU5UOgotI2VuZGlmCi0JCQlvdXRiKGluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKSAmIDB4NzMsIGRldi0+aW9iYXNlICsgUENMODE4X0NPTlRST0wpOwkvKiBTdG9wIEEvRCAqLwotCQkJdWRlbGF5KDEpOwotCQkJc3RhcnRfcGFjZXIoZGV2LCAtMSwgMCwgMCk7Ci0JCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0FEX0xPKTsKLQkJCWluYihkZXYtPmlvYmFzZSArIFBDTDgxOF9BRF9MTyk7Ci0JCQlpbmIoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQURfSEkpOwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DTFJJTlQpOwkvKiBjbGVhciBJTlQgcmVxdWVzdCAqLwotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsJLyogU3RvcCBBL0QgKi8KLQkJCWlmIChkZXZwcml2LT51c2VmaWZvKSB7CS8qICBGSUZPIHNodXRkb3duICovCi0JCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9JTlRDTFIpOwotCQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRkxVU0gpOwotCQkJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRU5BQkxFKTsKLQkJCX0KLQkJCWRldnByaXYtPmlycV9ibG9ja2VkID0gMDsKLQkJCWRldnByaXYtPmxhc3RfaW50X3N1YiA9IHM7Ci0JCQlkZXZwcml2LT5uZXZlcmVuZGluZ19haSA9IDA7Ci0JCQlkZXZwcml2LT5haV9tb2RlID0gMDsKLQkJCWRldnByaXYtPmlycV93YXNfbm93X2Nsb3NlZCA9IDA7Ci0JCQlicmVhazsKIAkJfQorCQlkaXNhYmxlX2RtYShkZXZwcml2LT5kbWEpOwogCX0KIAotZW5kOgotCXJldHVybiAwOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gY2hlY2ggZm9yIFBDTDgxOAotKi8KLXN0YXRpYyBpbnQgcGNsODE4X2NoZWNrKHVuc2lnbmVkIGxvbmcgaW9iYXNlKQotewotCW91dGIoMHgwMCwgaW9iYXNlICsgUENMODE4X01VWCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE4X01VWCkgIT0gMHgwMCkKLQkJcmV0dXJuIDE7CS8qIHRoZXJlIGlzbid0IGNhcmQgKi8KLQlvdXRiKDB4NTUsIGlvYmFzZSArIFBDTDgxOF9NVVgpOwotCXVkZWxheSgxKTsKLQlpZiAoaW5iKGlvYmFzZSArIFBDTDgxOF9NVVgpICE9IDB4NTUpCi0JCXJldHVybiAxOwkvKiB0aGVyZSBpc24ndCBjYXJkICovCi0Jb3V0YigweDAwLCBpb2Jhc2UgKyBQQ0w4MThfTVVYKTsKLQl1ZGVsYXkoMSk7Ci0Jb3V0YigweDE4LCBpb2Jhc2UgKyBQQ0w4MThfQ09OVFJPTCk7Ci0JdWRlbGF5KDEpOwotCWlmIChpbmIoaW9iYXNlICsgUENMODE4X0NPTlRST0wpICE9IDB4MTgpCi0JCXJldHVybiAxOwkvKiB0aGVyZSBpc24ndCBjYXJkICovCi0JcmV0dXJuIDA7CQkvKiAgb2ssIGNhcmQgZXhpc3QgKi8KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIHJlc2V0IHdob2xlIFBDTC04MTggY2FyZHMKLSovCi1zdGF0aWMgdm9pZCBwY2w4MThfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlvdXRiKFBDTDgxOF9DVFJMX0RJU0FCTEVfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOworCXBjbDgxOF9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKKwlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CiAKIAlpZiAoZGV2cHJpdi0+dXNlZmlmbykgewkvKiAgRklGTyBzaHV0ZG93biAqLwogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0lOVENMUik7CiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRklfRkxVU0gpOwogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0VOQUJMRSk7CiAJfQotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfREFfTE8pOwkvKiAgREFDPTBWICovCi0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9EQV9ISSk7Ci0JdWRlbGF5KDEpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fSEkpOwkvKiAgRE89JDAwMDAgKi8KLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0xPKTsKLQl1ZGVsYXkoMSk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DT05UUk9MKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRSk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9NVVgpOwotCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ0xSSU5UKTsKLQlvdXRiKDB4YjAsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkNUTCk7CS8qIFN0b3AgcGFjZXIgKi8KLQlvdXRiKDB4NzAsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkNUTCk7Ci0Jb3V0YigweDMwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJDVEwpOworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKwlkZXZwcml2LT5haV9jbWRfY2FuY2VsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlvdXRiKFBDTDgxOF9DVFJMX1NPRlRfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOworCisJcGNsODE4X2FpX3NldF9jaGFuX3JhbmdlKGRldiwgY2hhbiwgcmFuZ2UpOworCXBjbDgxOF9haV9zZXRfY2hhbl9zY2FuKGRldiwgY2hhbiwgY2hhbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCXBjbDgxOF9haV9jbGVhcl9lb2MoZGV2KTsKKwkJcGNsODE4X2FpX3NvZnRfdHJpZyhkZXYpOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNsODE4X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlkYXRhW2ldID0gcGNsODE4X2FpX2dldF9zYW1wbGUoZGV2LCBzLCBOVUxMKTsKKwl9CisJcGNsODE4X2FpX2NsZWFyX2VvYyhkZXYpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CisJCW91dGIoKGRhdGFbaV0gJiAweDAwMGYpIDw8IDQsCisJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQU9fTFNCX1JFRyhjaGFuKSk7CisJCW91dGIoKGRhdGFbaV0gJiAweDBmZjApID4+IDQsCisJCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQU9fTVNCX1JFRyhjaGFuKSk7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2FvX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBwY2w4MThfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlkYXRhWzFdID0gaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX0xTQl9SRUcpIHwKKwkJICAoaW5iKGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX01TQl9SRUcpIDw8IDgpOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgcGNsODE4X2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKSB7CisJCW91dGIocy0+c3RhdGUgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9ET19ESV9MU0JfUkVHKTsKKwkJb3V0Yigocy0+c3RhdGUgPj4gOCksIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX01TQl9SRUcpOworCX0KKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgdm9pZCBwY2w4MThfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOworCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODE4X1RJTUVSX0JBU0U7CisJdW5zaWduZWQgaW50IGNoYW47CisKKwkvKiBmbHVzaCBhbmQgZGlzYWJsZSB0aGUgRklGTyAqLworCWlmIChib2FyZC0+aGFzX2ZpZm8pIHsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9JTlRDTFIpOworCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0ZJX0ZMVVNIKTsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9GSV9FTkFCTEUpOworCX0KKworCS8qIGRpc2FibGUgYW5hbG9nIGlucHV0IHRyaWdnZXIgKi8KKwlvdXRiKFBDTDgxOF9DVFJMX0RJU0FCTEVfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOworCXBjbDgxOF9haV9jbGVhcl9lb2MoZGV2KTsKKworCXBjbDgxOF9haV9zZXRfY2hhbl9yYW5nZShkZXYsIDAsIDApOworCisJLyogc3RvcCBwYWNlciAqLworCW91dGIoUENMODE4X0NOVEVOQUJMRV9QQUNFUl9FTkEsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRV9SRUcpOworCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCisJLyogc2V0IGFuYWxvZyBvdXRwdXQgY2hhbm5lbHMgdG8gMFYgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgYm9hcmQtPm5fYW9jaGFuOyBjaGFuKyspIHsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BT19MU0JfUkVHKGNoYW4pKTsKKwkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9BT19NU0JfUkVHKGNoYW4pKTsKKwl9CisKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KKwlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE4X0RPX0RJX01TQl9SRUcpOworCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfRE9fRElfTFNCX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbDgxOF9zZXRfYWlfcmFuZ2VfdGFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKKworCS8qIGRlZmF1bHQgdG8gdGhlIHJhbmdlIHRhYmxlIGZyb20gdGhlIGJvYXJkaW5mbyAqLworCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFpX3JhbmdlX3R5cGU7CisKKwkvKiBub3cgY2hlY2sgdGhlIHVzZXIgY29uZmlnIG9wdGlvbiBiYXNlZCBvbiB0aGUgYm9hcmR0eXBlICovCiAJaWYgKGJvYXJkLT5pc184MTgpIHsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9SQU5HRSk7CisJCWlmIChpdC0+b3B0aW9uc1s0XSA9PSAxIHx8IGl0LT5vcHRpb25zWzRdID09IDEwKSB7CisJCQkvKiBzZWNvbmRhcnkgcmFuZ2UgbGlzdCBqdW1wZXIgc2VsZWN0YWJsZSAqLworCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODE4bF9oX2FpOworCQl9CiAJfSBlbHNlIHsKLQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDcxOF9EQTJfTE8pOwotCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMNzE4X0RBMl9ISSk7CisJCXN3aXRjaCAoaXQtPm9wdGlvbnNbNF0pIHsKKwkJY2FzZSAwOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjEwOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXI1OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIyXzU7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfYmlwb2xhcjE7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfYmlwb2xhcjBfNTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmlwb2xhcjEwOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VuaXBvbGFyNTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF91bmlwb2xhcjI7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2U3MThfdW5pcG9sYXIxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOworCQkJYnJlYWs7CisJCX0KIAl9CiB9CiAKQEAgLTEyMTAsMTU0ICsxMDg2LDk2IEBACiB7CiAJY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBjb21lZGlfYm9hcmQoZGV2KTsKIAlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXY7Ci0JaW50IHJldDsKLQlpbnQgZG1hOwotCXVuc2lnbmVkIGxvbmcgcGFnZXM7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldDsKKwlpbnQgaTsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkZXZwcml2LT5pb19yYW5nZSA9IGJvYXJkLT5pb19yYW5nZTsKLQlpZiAoKGJvYXJkLT5maWZvKSAmJiAoaXQtPm9wdGlvbnNbMl0gPT0gLTEpKSB7Ci0JCS8qICB3ZSd2ZSBib2FyZCB3aXRoIEZJRk8gYW5kIHdlIHdhbnQgdG8gdXNlIEZJRk8gKi8KLQkJZGV2cHJpdi0+aW9fcmFuZ2UgPSBQQ0x4MXhGSUZPX1JBTkdFOwotCQlkZXZwcml2LT51c2VmaWZvID0gMTsKLQl9Ci0JcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIGRldnByaXYtPmlvX3JhbmdlKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwKKwkJCQkgICAgYm9hcmQtPmhhc19maWZvID8gMHgyMCA6IDB4MTApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocGNsODE4X2NoZWNrKGRldi0+aW9iYXNlKSkgewotCQljb21lZGlfZXJyb3IoZGV2LCAiSSBjYW4ndCBkZXRlY3QgYm9hcmQuIEZBSUwhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCgxIDw8IGl0LT5vcHRpb25zWzFdKSAmIGJvYXJkLT5JUlFiaXRzKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5vcHRpb25zWzFdLCBpbnRlcnJ1cHRfcGNsODE4LCAwLAorCS8qIHdlIGNhbiB1c2UgSVJRIDItNyBmb3IgYXN5bmMgY29tbWFuZCBzdXBwb3J0ICovCisJaWYgKGl0LT5vcHRpb25zWzFdID49IDIgJiYgaXQtPm9wdGlvbnNbMV0gPD0gNykgeworCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1sxXSwgcGNsODE4X2ludGVycnVwdCwgMCwKIAkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKIAkJaWYgKHJldCA9PSAwKQogCQkJZGV2LT5pcnEgPSBpdC0+b3B0aW9uc1sxXTsKIAl9CiAKLQlkZXZwcml2LT5pcnFfYmxvY2tlZCA9IDA7CS8qIG51bWJlciBvZiBzdWJkZXZpY2Ugd2hpY2ggdXNlIElSUSAqLwotCWRldnByaXYtPmFpX21vZGUgPSAwOwkvKiBtb2RlIG9mIGlycSAqLworCS8qIHNob3VsZCB3ZSB1c2UgdGhlIEZJRk8/ICovCisJaWYgKGRldi0+aXJxICYmIGJvYXJkLT5oYXNfZmlmbyAmJiBpdC0+b3B0aW9uc1syXSA9PSAtMSkKKwkJZGV2cHJpdi0+dXNlZmlmbyA9IDE7CiAKLQkvKiBncmFiIG91ciBETUEgKi8KLQlkbWEgPSAwOwotCWRldnByaXYtPmRtYSA9IGRtYTsKLQlpZiAoIWRldi0+aXJxKQotCQlnb3RvIG5vX2RtYTsJLyogaWYgd2UgaGF2ZW4ndCBJUlEsIHdlIGNhbid0IHVzZSBETUEgKi8KLQlpZiAoYm9hcmQtPkRNQWJpdHMgIT0gMCkgewkvKiBib2FyZCBzdXBwb3J0IERNQSAqLwotCQlkbWEgPSBpdC0+b3B0aW9uc1syXTsKLQkJaWYgKGRtYSA8IDEpCi0JCQlnb3RvIG5vX2RtYTsJLyogRE1BIGRpc2FibGVkICovCi0JCWlmICgoKDEgPDwgZG1hKSAmIGJvYXJkLT5ETUFiaXRzKSA9PSAwKSB7CisJLyogd2UgbmVlZCBhbiBJUlEgdG8gZG8gRE1BIG9uIGNoYW5uZWwgMyBvciAxICovCisJaWYgKGRldi0+aXJxICYmIGJvYXJkLT5oYXNfZG1hICYmCisJICAgIChpdC0+b3B0aW9uc1syXSA9PSAzIHx8IGl0LT5vcHRpb25zWzJdID09IDEpKSB7CisJCXJldCA9IHJlcXVlc3RfZG1hKGl0LT5vcHRpb25zWzJdLCBkZXYtPmJvYXJkX25hbWUpOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSJETUEgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIEZBSUwhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwkvKiBCYWQgRE1BICovCi0JCX0KLQkJcmV0ID0gcmVxdWVzdF9kbWEoZG1hLCBkZXYtPmJvYXJkX25hbWUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIC1FQlVTWTsJLyogRE1BIGlzbid0IGZyZWUgKi8KLQkJZGV2cHJpdi0+ZG1hID0gZG1hOwotCQlwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLwotCQlkZXZwcml2LT5kbWFidWZbMF0gPSBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZXMpOwotCQlpZiAoIWRldnByaXYtPmRtYWJ1ZlswXSkKLQkJCS8qIG1heWJlIGV4cGVyaW1lbnQgd2l0aCB0cnlfdG9fZnJlZV9wYWdlcygpIHdpbGwgaGVscCAuLi4uICovCi0JCQlyZXR1cm4gLUVCVVNZOwkvKiBubyBidWZmZXIgOi0oICovCi0JCWRldnByaXYtPmRtYXBhZ2VzWzBdID0gcGFnZXM7Ci0JCWRldnByaXYtPmh3ZG1hcHRyWzBdID0gdmlydF90b19idXMoKHZvaWQgKilkZXZwcml2LT5kbWFidWZbMF0pOwotCQlkZXZwcml2LT5od2RtYXNpemVbMF0gPSAoMSA8PCBwYWdlcykgKiBQQUdFX1NJWkU7Ci0JCWRldnByaXYtPmRtYWJ1ZlsxXSA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlcyk7Ci0JCWlmICghZGV2cHJpdi0+ZG1hYnVmWzFdKQorCQkJCSJ1bmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCAlZFxuIiwKKwkJCQlpdC0+b3B0aW9uc1syXSk7CiAJCQlyZXR1cm4gLUVCVVNZOwotCQlkZXZwcml2LT5kbWFwYWdlc1sxXSA9IHBhZ2VzOwotCQlkZXZwcml2LT5od2RtYXB0clsxXSA9IHZpcnRfdG9fYnVzKCh2b2lkICopZGV2cHJpdi0+ZG1hYnVmWzFdKTsKLQkJZGV2cHJpdi0+aHdkbWFzaXplWzFdID0gKDEgPDwgcGFnZXMpICogUEFHRV9TSVpFOwotCX0KKwkJfQorCQlkZXZwcml2LT5kbWEgPSBpdC0+b3B0aW9uc1syXTsKIAotbm9fZG1hOgorCQlkZXZwcml2LT5kbWFwYWdlcyA9IDI7CS8qIHdlIG5lZWQgMTZLQiAqLworCQlkZXZwcml2LT5od2RtYXNpemUgPSAoMSA8PCBkZXZwcml2LT5kbWFwYWdlcykgKiBQQUdFX1NJWkU7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBkbWFidWY7CisKKwkJCWRtYWJ1ZiA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBkZXZwcml2LT5kbWFwYWdlcyk7CisJCQlpZiAoIWRtYWJ1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJZGV2cHJpdi0+ZG1hYnVmW2ldID0gZG1hYnVmOworCQkJZGV2cHJpdi0+aHdkbWFwdHJbaV0gPSB2aXJ0X3RvX2J1cygodm9pZCAqKWRtYWJ1Zik7CisJCX0KKwl9CiAKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQlpZiAoIWJvYXJkLT5uX2FpY2hhbl9zZSkgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCWlmIChjaGVja19zaW5nbGVfZW5kZWQoZGV2LT5pb2Jhc2UpKSB7CisJCXMtPm5fY2hhbgk9IDE2OworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQ7CiAJfSBlbHNlIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEU7Ci0JCWlmIChjaGVja19zaW5nbGVfZW5kZWQoZGV2LT5pb2Jhc2UpKSB7Ci0JCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fc2U7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQ7Ci0JCX0gZWxzZSB7Ci0JCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9haWNoYW5fZGlmZjsKLQkJCXMtPnN1YmRldl9mbGFncyB8PSBTREZfRElGRjsKLQkJfQotCQlzLT5tYXhkYXRhID0gYm9hcmQtPmFpX21heGRhdGE7Ci0JCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPmFpX3JhbmdlX3R5cGU7Ci0JCXMtPmluc25fcmVhZCA9IHBjbDgxOF9haV9pbnNuX3JlYWQ7Ci0JCWlmIChkZXYtPmlycSkgewotCQkJZGV2LT5yZWFkX3N1YmRldiA9IHM7Ci0JCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOwotCQkJcy0+bGVuX2NoYW5saXN0ID0gcy0+bl9jaGFuOwotCQkJcy0+ZG9fY21kdGVzdCA9IGFpX2NtZHRlc3Q7Ci0JCQlzLT5kb19jbWQgPSBhaV9jbWQ7Ci0JCQlzLT5jYW5jZWwgPSBwY2w4MThfYWlfY2FuY2VsOwotCQl9Ci0JCWlmIChib2FyZC0+aXNfODE4KSB7Ci0JCQlpZiAoKGl0LT5vcHRpb25zWzRdID09IDEpIHx8IChpdC0+b3B0aW9uc1s0XSA9PSAxMCkpCi0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfcGNsODE4bF9oX2FpOwkvKiAgc2Vjb25kYXJ5IHJhbmdlIGxpc3QganVtcGVyIHNlbGVjdGFibGUgKi8KLQkJfSBlbHNlIHsKLQkJCXN3aXRjaCAoaXQtPm9wdGlvbnNbNF0pIHsKLQkJCWNhc2UgMDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9iaXBvbGFyMTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfYmlwb2xhcjJfNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF9iaXBvbGFyMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF9iaXBvbGFyMF81OwotCQkJCWJyZWFrOwotCQkJY2FzZSA2OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VuaXBvbGFyMTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5pcG9sYXI1OwotCQkJCWJyZWFrOwotCQkJY2FzZSA4OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlNzE4X3VuaXBvbGFyMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgOToKLQkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZTcxOF91bmlwb2xhcjE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwkJcy0+bl9jaGFuCT0gODsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9ESUZGOworCX0KKwlzLT5tYXhkYXRhCT0gMHgwZmZmOworCisJcGNsODE4X3NldF9haV9yYW5nZV90YWJsZShkZXYsIHMsIGl0KTsKKworCXMtPmluc25fcmVhZAk9IHBjbDgxOF9haV9pbnNuX3JlYWQ7CisJaWYgKGRldi0+aXJxKSB7CisJCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0NNRF9SRUFEOworCQlzLT5sZW5fY2hhbmxpc3QJPSBzLT5uX2NoYW47CisJCXMtPmRvX2NtZHRlc3QJPSBhaV9jbWR0ZXN0OworCQlzLT5kb19jbWQJPSBwY2w4MThfYWlfY21kOworCQlzLT5jYW5jZWwJPSBwY2w4MThfYWlfY2FuY2VsOwogCX0KIAorCS8qIEFuYWxvZyBPdXRwdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07Ci0JaWYgKCFib2FyZC0+bl9hb2NoYW4pIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKLQl9IGVsc2UgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7Ci0JCXMtPm5fY2hhbiA9IGJvYXJkLT5uX2FvY2hhbjsKLQkJcy0+bWF4ZGF0YSA9IGJvYXJkLT5hb19tYXhkYXRhOwotCQlzLT5yYW5nZV90YWJsZSA9IGJvYXJkLT5hb19yYW5nZV90eXBlOwotCQlzLT5pbnNuX3JlYWQgPSBwY2w4MThfYW9faW5zbl9yZWFkOwotCQlzLT5pbnNuX3dyaXRlID0gcGNsODE4X2FvX2luc25fd3JpdGU7CisJaWYgKGJvYXJkLT5uX2FvY2hhbikgeworCQlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FPOworCQlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EOworCQlzLT5uX2NoYW4JPSBib2FyZC0+bl9hb2NoYW47CisJCXMtPm1heGRhdGEJPSAweDBmZmY7CisJCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3VuaXBvbGFyNTsKKwkJcy0+aW5zbl9yZWFkCT0gcGNsODE4X2FvX2luc25fcmVhZDsKKwkJcy0+aW5zbl93cml0ZQk9IHBjbDgxOF9hb19pbnNuX3dyaXRlOwogCQlpZiAoYm9hcmQtPmlzXzgxOCkgewogCQkJaWYgKChpdC0+b3B0aW9uc1s0XSA9PSAxKSB8fCAoaXQtPm9wdGlvbnNbNF0gPT0gMTApKQogCQkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3VuaXBvbGFyMTA7CkBAIC0xMzY5LDMxICsxMTg3LDI3IEBACiAJCQlpZiAoaXQtPm9wdGlvbnNbNV0gPT0gMikKIAkJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOwogCQl9CisJfSBlbHNlIHsKKwkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCisJLyogRGlnaXRhbCBJbnB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKLQlpZiAoIWJvYXJkLT5uX2RpY2hhbikgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwotCX0gZWxzZSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kaWNoYW47Ci0JCXMtPm1heGRhdGEgPSAxOwotCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCQlzLT5pbnNuX2JpdHMgPSBwY2w4MThfZGlfaW5zbl9iaXRzOwotCX0KKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RJOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IHBjbDgxOF9kaV9pbnNuX2JpdHM7CiAKKwkvKiBEaWdpdGFsIE91dHB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1szXTsKLQlpZiAoIWJvYXJkLT5uX2RvY2hhbikgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwotCX0gZWxzZSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCQlzLT5uX2NoYW4gPSBib2FyZC0+bl9kb2NoYW47Ci0JCXMtPm1heGRhdGEgPSAxOwotCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwotCQlzLT5pbnNuX2JpdHMgPSBwY2w4MThfZG9faW5zbl9iaXRzOwotCX0KKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4JPSAxNjsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cwk9IHBjbDgxOF9kb19pbnNuX2JpdHM7CiAKIAkvKiBzZWxlY3QgMS8xME1IeiBvc2NpbGF0b3IgKi8KIAlpZiAoKGl0LT5vcHRpb25zWzNdID09IDApIHx8IChpdC0+b3B0aW9uc1szXSA9PSAxMCkpCkBAIC0xNDI0LDM4ICsxMjM4LDEzIEBACiAJCWlmIChkZXZwcml2LT5kbWEpCiAJCQlmcmVlX2RtYShkZXZwcml2LT5kbWEpOwogCQlpZiAoZGV2cHJpdi0+ZG1hYnVmWzBdKQotCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMF0sIGRldnByaXYtPmRtYXBhZ2VzWzBdKTsKKwkJCWZyZWVfcGFnZXMoZGV2cHJpdi0+ZG1hYnVmWzBdLCBkZXZwcml2LT5kbWFwYWdlcyk7CiAJCWlmIChkZXZwcml2LT5kbWFidWZbMV0pCi0JCQlmcmVlX3BhZ2VzKGRldnByaXYtPmRtYWJ1ZlsxXSwgZGV2cHJpdi0+ZG1hcGFnZXNbMV0pOworCQkJZnJlZV9wYWdlcyhkZXZwcml2LT5kbWFidWZbMV0sIGRldnByaXYtPmRtYXBhZ2VzKTsKIAl9CiAJY29tZWRpX2xlZ2FjeV9kZXRhY2goZGV2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgYm9hcmR0eXBlc1tdID0gewotCXsicGNsODE4bCIsIDQsIDE2LCA4LCAyNTAwMCwgMSwgMTYsIDE2LCAmcmFuZ2VfcGNsODE4bF9sX2FpLAotCSAmcmFuZ2VfdW5pcG9sYXI1LCBQQ0x4MXhfUkFOR0UsIDB4MDBmYywKLQkgMHgwYSwgMHhmZmYsIDB4ZmZmLCAwLCAxfSwKLQl7InBjbDgxOGgiLCA5LCAxNiwgOCwgMTAwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDF9LAotCXsicGNsODE4aGQiLCA5LCAxNiwgOCwgMTAwMDAsIDEsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDEsIDF9LAotCXsicGNsODE4aGciLCAxMiwgMTYsIDgsIDEwMDAwLCAxLCAxNiwgMTYsICZyYW5nZV9wY2w4MThoZ19haSwKLQkgJnJhbmdlX3VuaXBvbGFyNSwgUENMeDF4X1JBTkdFLCAweDAwZmMsCi0JIDB4MGEsIDB4ZmZmLCAweGZmZiwgMSwgMX0sCi0JeyJwY2w4MTgiLCA5LCAxNiwgOCwgMTAwMDAsIDIsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDF9LAotCXsicGNsNzE4IiwgMSwgMTYsIDgsIDE2MDAwLCAyLCAxNiwgMTYsICZyYW5nZV91bmlwb2xhcjUsCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDB9LAotCS8qIHBjbTM3MTggKi8KLQl7InBjbTM3MTgiLCA5LCAxNiwgOCwgMTAwMDAsIDAsIDE2LCAxNiwgJnJhbmdlX3BjbDgxOGhfYWksCi0JICZyYW5nZV91bmlwb2xhcjUsIFBDTHgxeF9SQU5HRSwgMHgwMGZjLAotCSAweDBhLCAweGZmZiwgMHhmZmYsIDAsIDEgLyogWFhYID8gKi8gfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBwY2w4MThfZHJpdmVyID0gewogCS5kcml2ZXJfbmFtZQk9ICJwY2w4MTgiLAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzcyNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbTM3MjQuYwppbmRleCBmNGE0OWJkLi41M2U3MzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtMzcyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY20zNzI0LmMKQEAgLTIyNSw4ICsyMjUsMTAgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOwotCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgc3ViZGV2XzgyNTVfY2IsCi0JCQkJICh1bnNpZ25lZCBsb25nKShkZXYtPmlvYmFzZSArIFNJWkVfODI1NSAqIGkpKTsKKwkJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIHN1YmRldl84MjU1X2NiLAorCQkJCSAgICAgICBkZXYtPmlvYmFzZSArIFNJWkVfODI1NSAqIGkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAkJcy0+aW5zbl9jb25maWcgPSBzdWJkZXZfMzcyNF9pbnNuX2NvbmZpZzsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21hZC5jCmluZGV4IGZlNDgyZmQuLjg3YzYxZDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtYWQuYwpAQCAtNjEsMTggKzYxLDE3IEBACiAJfSwKIH07CiAKLSNkZWZpbmUgVElNRU9VVAkxMDAKLQotc3RhdGljIGludCBwY21hZF9haV93YWl0X2Zvcl9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHBjbWFkX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKLQkJaWYgKChpbmIoZGV2LT5pb2Jhc2UgKyBQQ01BRF9TVEFUVVMpICYgMHgzKSA9PSAweDMpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ01BRF9TVEFUVVMpOworCWlmICgoc3RhdHVzICYgMHgzKSA9PSAweDMpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgcGNtYWRfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC04OSw3ICs4OCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUENNQURfQ09OVkVSVCk7CiAKLQkJcmV0ID0gcGNtYWRfYWlfd2FpdF9mb3JfZW9jKGRldiwgVElNRU9VVCk7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNtYWRfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwppbmRleCBjMzg4ZjdmLi5lODliY2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCkBAIC01ODksMTYgKzU4OSwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBjbW1pb19haV93YWl0X2Zvcl9lb2ModW5zaWduZWQgbG9uZyBpb2Jhc2UsIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludCBwY21taW9fYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAotCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJc3RhdHVzID0gaW5iKGlvYmFzZSArIFBDTU1JT19BSV9TVEFUVVNfUkVHKTsKLQkJaWYgKHN0YXR1cyAmIFBDTU1JT19BSV9TVEFUVVNfREFUQV9SRUFEWSkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVUSU1FOworCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFBDTU1JT19BSV9TVEFUVVNfUkVHKTsKKwlpZiAoc3RhdHVzICYgUENNTUlPX0FJX1NUQVRVU19EQVRBX1JFQURZKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IHBjbW1pb19haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTY0Myw3ICs2NDQsOCBAQAogCWNtZCB8PSBQQ01NSU9fQUlfQ01EX1JBTkdFKHJhbmdlKTsKIAogCW91dGIoY21kLCBpb2Jhc2UgKyBQQ01NSU9fQUlfQ01EX1JFRyk7Ci0JcmV0ID0gcGNtbWlvX2FpX3dhaXRfZm9yX2VvYyhpb2Jhc2UsIDEwMDAwMCk7CisKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbW1pb19haV9lb2MsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTY1Miw3ICs2NTQsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXRiKGNtZCwgaW9iYXNlICsgUENNTUlPX0FJX0NNRF9SRUcpOwotCQlyZXQgPSBwY21taW9fYWlfd2FpdF9mb3JfZW9jKGlvYmFzZSwgMTAwMDAwKTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbW1pb19haV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNjg0LDE2ICs2ODcsMTcgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIGludCBwY21taW9fYW9fd2FpdF9mb3JfZW9jKHVuc2lnbmVkIGxvbmcgaW9iYXNlLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgcGNtbWlvX2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAKLQl3aGlsZSAodGltZW91dC0tKSB7Ci0JCXN0YXR1cyA9IGluYihpb2Jhc2UgKyBQQ01NSU9fQU9fU1RBVFVTX1JFRyk7Ci0JCWlmIChzdGF0dXMgJiBQQ01NSU9fQU9fU1RBVFVTX0RBVEFfUkVBRFkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FVElNRTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQ01NSU9fQU9fU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIFBDTU1JT19BT19TVEFUVVNfREFUQV9SRUFEWSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogc3RhdGljIGludCBwY21taW9fYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNzI2LDcgKzczMCw4IEBACiAJb3V0YihQQ01NSU9fQU9fTFNCX1NQQU4ocmFuZ2UpLCBpb2Jhc2UgKyBQQ01NSU9fQU9fTFNCX1JFRyk7CiAJb3V0YigwLCBpb2Jhc2UgKyBQQ01NSU9fQU9fTVNCX1JFRyk7CiAJb3V0YihjbWQgfCBQQ01NSU9fQU9fQ01EX1dSX1NQQU5fVVBEQVRFLCBpb2Jhc2UgKyBQQ01NSU9fQU9fQ01EX1JFRyk7Ci0JcmV0ID0gcGNtbWlvX2FvX3dhaXRfZm9yX2VvYyhpb2Jhc2UsIDEwMDAwMCk7CisKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjbW1pb19hb19lb2MsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTczOCw3ICs3NDMsOCBAQAogCQlvdXRiKCh2YWwgPj4gOCkgJiAweGZmLCBpb2Jhc2UgKyBQQ01NSU9fQU9fTVNCX1JFRyk7CiAJCW91dGIoY21kIHwgUENNTUlPX0FPX0NNRF9XUl9DT0RFX1VQREFURSwKIAkJICAgICBpb2Jhc2UgKyBQQ01NSU9fQU9fQ01EX1JFRyk7Ci0JCXJldCA9IHBjbW1pb19hb193YWl0X2Zvcl9lb2MoaW9iYXNlLCAxMDAwMDApOworCisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNtbWlvX2FvX2VvYywgMCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaAppbmRleCA1NWUzYzJlLi4yNTcwNjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmgKQEAgLTI5LDEzICsyOSwxMyBAQAogCiAvKiAgZGVzY3JpcHRvciBibG9jayB1c2VkIGZvciBjaGFpbmVkIGRtYSB0cmFuc2ZlcnMgKi8KIHN0cnVjdCBwbHhfZG1hX2Rlc2MgewotCXZvbGF0aWxlIHVpbnQzMl90IHBjaV9zdGFydF9hZGRyOwotCXZvbGF0aWxlIHVpbnQzMl90IGxvY2FsX3N0YXJ0X2FkZHI7CisJX19sZTMyIHBjaV9zdGFydF9hZGRyOworCV9fbGUzMiBsb2NhbF9zdGFydF9hZGRyOwogCS8qIHRyYW5zZmVyX3NpemUgaXMgaW4gYnl0ZXMsIG9ubHkgZmlyc3QgMjMgYml0cyBvZiByZWdpc3RlciBhcmUgdXNlZCAqLwotCXZvbGF0aWxlIHVpbnQzMl90IHRyYW5zZmVyX3NpemU7CisJX19sZTMyIHRyYW5zZmVyX3NpemU7CiAJLyogYWRkcmVzcyBvZiBuZXh0IGRlc2NyaXB0b3IgKHF1YWQgd29yZCBhbGlnbmVkKSwgcGx1cyBzb21lCiAJICogYWRkaXRpb25hbCBiaXRzIChzZWUgUExYX0RNQTBfREVTQ1JJUFRPUl9SRUcpICovCi0Jdm9sYXRpbGUgdWludDMyX3QgbmV4dDsKKwlfX2xlMzIgbmV4dDsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcG9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTRlZTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gICAgY29tZWRpL2RyaXZlcnMvcG9jLmMKLSAgICBNaW5pLWRyaXZlcnMgZm9yIFBPQyAoUGllY2Ugb2YgQ3JhcCkgYm9hcmRzCi0gICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCi0vKgotRHJpdmVyOiBwb2MKLURlc2NyaXB0aW9uOiBHZW5lcmljIGRyaXZlciBmb3IgdmVyeSBzaW1wbGUgZGV2aWNlcwotQXV0aG9yOiBkcwotRGV2aWNlczogW0tlaXRobGV5IE1ldHJhYnl0ZV0gREFDLTAyIChkYWMwMikKLVVwZGF0ZWQ6IFNhdCwgMTYgTWFyIDIwMDIgMTc6MzQ6NDggLTA4MDAKLVN0YXR1czogdW5rbm93bgotCi1UaGlzIGRyaXZlciBpcyBpbmRlbmRlZCB0byBzdXBwb3J0IHZlcnkgc2ltcGxlIElTQS1iYXNlZCBkZXZpY2VzLAotaW5jbHVkaW5nOgotICBkYWMwMiAtIEtlaXRobGV5IERBQy0wMiBhbmFsb2cgb3V0cHV0IGJvYXJkCi0KLUNvbmZpZ3VyYXRpb24gb3B0aW9uczoKLSAgWzBdIC0gSS9PIHBvcnQgYmFzZQotKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotCi1zdHJ1Y3QgYm9hcmRkZWZfc3RydWN0IHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGludCBpb3NpemU7Ci0JaW50ICgqc2V0dXApIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKLQlpbnQgdHlwZTsKLQlpbnQgbl9jaGFuOwotCWludCBuX2JpdHM7Ci0JaW50ICgqd2luc24pIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqLAotCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICopOwotCWludCAoKnJpbnNuKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKLQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQlpbnQgKCppbnNuYml0cykgKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCi0JCQkgc3RydWN0IGNvbWVkaV9pbnNuICosIHVuc2lnbmVkIGludCAqKTsKLQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2U7Ci19OwotCi1zdHJ1Y3QgcG9jX3ByaXZhdGUgewotCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1szMl07Ci19OwotCi1zdGF0aWMgaW50IHJlYWRiYWNrX2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IHBvY19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCWludCBjaGFuOwotCi0JY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWRhdGFbMF0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKLQotCXJldHVybiAxOwotfQotCi0vKiBEQUMtMDIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIERBQzAyX0xTQihhKQkoMiAqIGEpCi0jZGVmaW5lIERBQzAyX01TQihhKQkoMiAqIGEgKyAxKQotCi1zdGF0aWMgaW50IGRhYzAyX2FvX3dpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcG9jX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IHRlbXA7Ci0JaW50IGNoYW47Ci0JaW50IG91dHB1dDsKLQotCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbMF07Ci0Jb3V0cHV0ID0gZGF0YVswXTsKLSNpZmRlZiB3cm9uZwotCS8qICBjb252ZXJ0IHRvIGNvbXBsZW1lbnRhcnkgYmluYXJ5IGlmIHJhbmdlIGlzIGJpcG9sYXIgKi8KLQlpZiAoKENSX1JBTkdFKGluc24tPmNoYW5zcGVjKSAmIDB4MikgPT0gMCkKLQkJb3V0cHV0ID0gfm91dHB1dDsKLSNlbmRpZgotCXRlbXAgPSAob3V0cHV0IDw8IDQpICYgMHhmMDsKLQlvdXRiKHRlbXAsIGRldi0+aW9iYXNlICsgREFDMDJfTFNCKGNoYW4pKTsKLQl0ZW1wID0gKG91dHB1dCA+PiA0KSAmIDB4ZmY7Ci0Jb3V0Yih0ZW1wLCBkZXYtPmlvYmFzZSArIERBQzAyX01TQihjaGFuKSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBwb2NfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKLXsKLQljb25zdCBzdHJ1Y3QgYm9hcmRkZWZfc3RydWN0ICpib2FyZCA9IGNvbWVkaV9ib2FyZChkZXYpOwotCXN0cnVjdCBwb2NfcHJpdmF0ZSAqZGV2cHJpdjsKLQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIGJvYXJkLT5pb3NpemUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlkZXZwcml2ID0gY29tZWRpX2FsbG9jX2RldnByaXYoZGV2LCBzaXplb2YoKmRldnByaXYpKTsKLQlpZiAoIWRldnByaXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKi8KLQlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQlzLT50eXBlID0gYm9hcmQtPnR5cGU7Ci0Jcy0+bl9jaGFuID0gYm9hcmQtPm5fY2hhbjsKLQlzLT5tYXhkYXRhID0gKDEgPDwgYm9hcmQtPm5fYml0cykgLSAxOwotCXMtPnJhbmdlX3RhYmxlID0gYm9hcmQtPnJhbmdlOwotCXMtPmluc25fd3JpdGUgPSBib2FyZC0+d2luc247Ci0Jcy0+aW5zbl9yZWFkID0gYm9hcmQtPnJpbnNuOwotCXMtPmluc25fYml0cyA9IGJvYXJkLT5pbnNuYml0czsKLQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9BTyB8fCBzLT50eXBlID09IENPTUVESV9TVUJEX0RPKQotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBib2FyZGRlZl9zdHJ1Y3QgYm9hcmRzW10gPSB7Ci0JewotCQkubmFtZQkJPSAiZGFjMDIiLAotCQkuaW9zaXplCQk9IDgsCi0JCS8qIC5zZXR1cAk9IGRhYzAyX3NldHVwLCAqLwotCQkudHlwZQkJPSBDT01FRElfU1VCRF9BTywKLQkJLm5fY2hhbgkJPSAyLAotCQkubl9iaXRzCQk9IDEyLAotCQkud2luc24JCT0gZGFjMDJfYW9fd2luc24sCi0JCS5yaW5zbgkJPSByZWFkYmFja19pbnNuLAotCQkucmFuZ2UJCT0gJnJhbmdlX3Vua25vd24sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBwb2NfZHJpdmVyID0gewotCS5kcml2ZXJfbmFtZQk9ICJwb2MiLAotCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCi0JLmF0dGFjaAkJPSBwb2NfYXR0YWNoLAotCS5kZXRhY2gJCT0gY29tZWRpX2xlZ2FjeV9kZXRhY2gsCi0JLmJvYXJkX25hbWUJPSAmYm9hcmRzWzBdLm5hbWUsCi0JLm51bV9uYW1lcwk9IEFSUkFZX1NJWkUoYm9hcmRzKSwKLQkub2Zmc2V0CQk9IHNpemVvZihib2FyZHNbMF0pLAotfTsKLW1vZHVsZV9jb21lZGlfZHJpdmVyKHBvY19kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBsb3ctbGV2ZWwgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKaW5kZXggOTZhNDY5NS4uMjk4ZGJhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYwpAQCAtMjE0LDcgKzIxNCw2IEBACiAJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PQogCQkJCSAgICBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX09WRVJGTE9XOwogCQkJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LCAiZGF0YSBsb3N0XG4iKTsKLQkJCQlkYXFwX2FpX2NhbmNlbChkZXYsIHMpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC0yMzEsNyArMjMwLDYgQEAKIAkJCWlmIChkZXZwcml2LT5jb3VudCA+IDApIHsKIAkJCQlkZXZwcml2LT5jb3VudC0tOwogCQkJCWlmIChkZXZwcml2LT5jb3VudCA9PSAwKSB7Ci0JCQkJCWRhcXBfYWlfY2FuY2VsKGRldiwgcyk7CiAJCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMjQ0LDEzICsyNDIsMTIgQEAKIAkJaWYgKGxvb3BfbGltaXQgPD0gMCkgewogCQkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsCiAJCQkJICJsb29wX2xpbWl0IHJlYWNoZWQgaW4gZGFxcF9pbnRlcnJ1cHQoKVxuIik7Ci0JCQlkYXFwX2FpX2NhbmNlbChkZXYsIHMpOwogCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0VSUk9SOwogCQl9CiAKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CiAKLQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCWNmY19oYW5kbGVfZXZlbnRzKGRldiwgcyk7CiAJfQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwppbmRleCAwZjAyNmFmLi5jZDNmZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCkBAIC0yMzcsMjAgKzIzNyw2IEBACiAvKiBUaGUgYm9hcmQgc3VwcG9ydCBhIGNoYW5uZWwgbGlzdCB1cCB0byB0aGUgRklGTyBsZW5ndGggKDFLIG9yIDhLKSAqLwogI2RlZmluZSBSVERfTUFYX0NIQU5MSVNUCTEyOAkvKiBtYXggY2hhbm5lbCBsaXN0IHRoYXQgd2UgYWxsb3cgKi8KIAotLyogdHVuaW5nIGZvciBhaS9hbyBpbnN0cnVjdGlvbiBkb25lIHBvbGxpbmcgKi8KLSNpZmRlZiBGQVNUX1NQSU4KLSNkZWZpbmUgV0FJVF9RVUlFVExZCQkvKiBhcyBub3RoaW5nLCBzcGluIG9uIGRvbmUgYml0ICovCi0jZGVmaW5lIFJURF9BRENfVElNRU9VVAk2NjAwMAkvKiAyIG1zZWMgYXQgMzNtaHogYnVzIHJhdGUgKi8KLSNkZWZpbmUgUlREX0RBQ19USU1FT1VUCTY2MDAwCi0jZGVmaW5lIFJURF9ETUFfVElNRU9VVAkzMzAwMAkvKiAxIG1zZWMgKi8KLSNlbHNlCi0vKiBieSBkZWxheWluZywgcG93ZXIgYW5kIGVsZWN0cmljYWwgbm9pc2UgYXJlIHJlZHVjZWQgc29tZXdoYXQgKi8KLSNkZWZpbmUgV0FJVF9RVUlFVExZCXVkZWxheSgxKQotI2RlZmluZSBSVERfQURDX1RJTUVPVVQJMjAwMAkvKiBpbiB1c2VjICovCi0jZGVmaW5lIFJURF9EQUNfVElNRU9VVAkyMDAwCS8qIGluIHVzZWMgKi8KLSNkZWZpbmUgUlREX0RNQV9USU1FT1VUCTEwMDAJLyogaW4gdXNlYyAqLwotI2VuZGlmCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBCb2FyZCBzcGVjaWZpYyBzdHVmZgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC01NjIsMjEgKzU0OCwyNyBAQAogCXJldHVybiBmaWZvX3NpemU7CiB9CiAKLS8qCi0gICJpbnN0cnVjdGlvbnMiIHJlYWQvd3JpdGUgZGF0YSBpbiAib25lLXNob3QiIG9yICJzb2Z0d2FyZS10cmlnZ2VyZWQiCi0gIG1vZGUgKHNpbXBsZXN0IGNhc2UpLgotICBUaGlzIGRvZXNuJ3QgdXNlIGludGVycnVwdHMuCitzdGF0aWMgaW50IHJ0ZF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBydGRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0gIE5vdGUsIHdlIGRvbid0IGRvIGFueSBzZXR0bGluZyBkZWxheXMuICBVc2UgYSBpbnN0cnVjdGlvbiBsaXN0IHRvCi0gIHNlbGVjdCwgZGVsYXksIHRoZW4gcmVhZC4KLSAqLworCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPmxhczAgKyBMQVMwX0FEQyk7CisJaWYgKHN0YXR1cyAmIEZTX0FEQ19OT1RfRU1QVFkpCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKIHN0YXRpYyBpbnQgcnRkX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBydGRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQlpbnQgbiwgaWk7Ci0JaW50IHN0YXQ7CisJaW50IHJldDsKKwlpbnQgbjsKIAogCS8qIGNsZWFyIGFueSBvbGQgZmlmbyBkYXRhICovCiAJd3JpdGVsKDAsIGRldnByaXYtPmxhczAgKyBMQVMwX0FEQ19GSUZPX0NMRUFSKTsKQEAgLTU5MywxNCArNTg1LDkgQEAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCiAJCXdyaXRldygwLCBkZXZwcml2LT5sYXMwICsgTEFTMF9BREMpOwogCi0JCWZvciAoaWkgPSAwOyBpaSA8IFJURF9BRENfVElNRU9VVDsgKytpaSkgewotCQkJc3RhdCA9IHJlYWRsKGRldnByaXYtPmxhczAgKyBMQVMwX0FEQyk7Ci0JCQlpZiAoc3RhdCAmIEZTX0FEQ19OT1RfRU1QVFkpCS8qIDEgLT4gbm90IGVtcHR5ICovCi0JCQkJYnJlYWs7Ci0JCQlXQUlUX1FVSUVUTFk7Ci0JCX0KLQkJaWYgKGlpID49IFJURF9BRENfVElNRU9VVCkKLQkJCXJldHVybiAtRVRJTUVET1VUOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHJ0ZF9haV9lb2MsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJZCA9IHJlYWR3KGRldnByaXYtPmxhczEgKyBMQVMxX0FEQ19GSUZPKTsKQEAgLTExMTYsOSArMTEwMywyMiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICBPdXRwdXQgb25lIChvciBtb3JlKSBhbmFsb2cgdmFsdWVzIHRvIGEgc2luZ2xlIHBvcnQgYXMgZmFzdCBhcyBwb3NzaWJsZS4KLSovCitzdGF0aWMgaW50IHJ0ZF9hb19lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBydGRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBiaXQgPSAoY2hhbiA9PSAwKSA/IEZTX0RBQzFfTk9UX0VNUFRZIDogRlNfREFDMl9OT1RfRU1QVFk7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPmxhczAgKyBMQVMwX0FEQyk7CisJaWYgKHN0YXR1cyAmIGJpdCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBydGRfYW9fd2luc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC0xMTI3LDYgKzExMjcsNyBAQAogCWludCBpOwogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCWludCByZXQ7CiAKIAkvKiBDb25maWd1cmUgdGhlIG91dHB1dCByYW5nZSAodGFibGUgaW5kZXggbWF0Y2hlcyB0aGUgcmFuZ2UgdmFsdWVzKSAqLwogCXdyaXRldyhyYW5nZSAmIDcsIGRldnByaXYtPmxhczAgKwpAQCAtMTEzNiw4ICsxMTM3LDYgQEAKIAkgKiB2ZXJ5IHVzZWZ1bCwgYnV0IHRoYXQncyBob3cgdGhlIGludGVyZmFjZSBpcyBkZWZpbmVkLiAqLwogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyArK2kpIHsKIAkJaW50IHZhbCA9IGRhdGFbaV0gPDwgMzsKLQkJaW50IHN0YXQgPSAwOwkvKiBpbml0aWFsaXplIHRvIGF2b2lkIGJvZ3VzIHdhcm5pbmcgKi8KLQkJaW50IGlpOwogCiAJCS8qIFZFUklGWTogY29tZWRpIHJhbmdlIGFuZCBvZmZzZXQgY29udmVyc2lvbnMgKi8KIApAQCAtMTE1NywxNiArMTE1Niw5IEBACiAKIAkJZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSBkYXRhW2ldOwogCi0JCWZvciAoaWkgPSAwOyBpaSA8IFJURF9EQUNfVElNRU9VVDsgKytpaSkgewotCQkJc3RhdCA9IHJlYWRsKGRldnByaXYtPmxhczAgKyBMQVMwX0FEQyk7Ci0JCQkvKiAxIC0+IG5vdCBlbXB0eSAqLwotCQkJaWYgKHN0YXQgJiAoKDAgPT0gY2hhbikgPyBGU19EQUMxX05PVF9FTVBUWSA6Ci0JCQkJICAgIEZTX0RBQzJfTk9UX0VNUFRZKSkKLQkJCQlicmVhazsKLQkJCVdBSVRfUVVJRVRMWTsKLQkJfQotCQlpZiAoaWkgPj0gUlREX0RBQ19USU1FT1VUKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcnRkX2FvX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCkBAIC0xMzgyLDggKzEzNzQsNiBAQAogCWlmIChkZXYtPmlycSkKIAkJd3JpdGVsKElDU19QSUUgfCBJQ1NfUExJRSwgZGV2cHJpdi0+bGNmZyArIFBMWF9JTlRSQ1NfUkVHKTsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMC5jCmluZGV4IGUxZjM2NzEuLmJkNDQ3YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAwLmMKQEAgLTgzLDggKzgzLDYgQEAKIAogI2RlZmluZSBSVEk4MDBfSU9TSVpFCQkweDEwCiAKLSNkZWZpbmUgUlRJODAwX0FJX1RJTUVPVVQJMTAwCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9ydGk4MDBfYWlfMTBfYmlwb2xhciA9IHsKIAk0LCB7CiAJCUJJUF9SQU5HRSgxMCksCkBAIC0xNDUsMjMgKzE0MywyMSBAQAogCXVuc2lnbmVkIGNoYXIgbXV4Z2Fpbl9iaXRzOwogfTsKIAotc3RhdGljIGludCBydGk4MDBfYWlfd2FpdF9mb3JfY29udmVyc2lvbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHJ0aTgwMF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgewotCQlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBSVEk4MDBfQ1NSKTsKLQkJaWYgKHN0YXR1cyAmIFJUSTgwMF9DU1JfT1ZFUlJVTikgewotCQkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFJUSTgwMF9DTFJGTEFHUyk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQlpZiAoc3RhdHVzICYgUlRJODAwX0NTUl9ET05FKQotCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxKTsKKwlzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBSVEk4MDBfQ1NSKTsKKwlpZiAoc3RhdHVzICYgUlRJODAwX0NTUl9PVkVSUlVOKSB7CisJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBSVEk4MDBfQ0xSRkxBR1MpOworCQlyZXR1cm4gLUVPVkVSRkxPVzsKIAl9Ci0JcmV0dXJuIC1FVElNRTsKKwlpZiAoc3RhdHVzICYgUlRJODAwX0NTUl9ET05FKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOwogfQogCiBzdGF0aWMgaW50IHJ0aTgwMF9haV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTE5OCw3ICsxOTQsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUlRJODAwX0NPTlZFUlQpOwotCQlyZXQgPSBydGk4MDBfYWlfd2FpdF9mb3JfY29udmVyc2lvbihkZXYsIFJUSTgwMF9BSV9USU1FT1VUKTsKKworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHJ0aTgwMF9haV9lb2MsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0aTgwMi5jCmluZGV4IGEzZmEyYTQuLjYwNWEzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGk4MDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRpODAyLmMKQEAgLTEsNDUgKzEsNDQgQEAKIC8qCi0gICBjb21lZGkvZHJpdmVycy9ydGk4MDIuYwotICAgSGFyZHdhcmUgZHJpdmVyIGZvciBBbmFsb2cgRGV2aWNlcyBSVEktODAyIGJvYXJkCi0KLSAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgIENvcHlyaWdodCAoQykgMTk5OSBBbmRlcnMgQmxvbWRlbGwgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIHJ0aTgwMi5jCisgKiBDb21lZGkgZHJpdmVyIGZvciBBbmFsb2cgRGV2aWNlcyBSVEktODAyIGJvYXJkCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk5IEFuZGVycyBCbG9tZGVsbCA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwotLyoKLURyaXZlcjogcnRpODAyCi1EZXNjcmlwdGlvbjogQW5hbG9nIERldmljZXMgUlRJLTgwMgotQXV0aG9yOiBBbmRlcnMgQmxvbWRlbGwgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4KLURldmljZXM6IFtBbmFsb2cgRGV2aWNlc10gUlRJLTgwMiAocnRpODAyKQotU3RhdHVzOiB3b3JrcwogCi1Db25maWd1cmF0aW9uIE9wdGlvbnM6Ci0gICAgWzBdIC0gaS9vIGJhc2UKLSAgICBbMV0gLSB1bnVzZWQKLSAgICBbMl0gLSBkYWMjMCAgMD10d28ncyBjb21wLCAxPXN0cmFpZ2h0Ci0gICAgWzNdIC0gZGFjIzAgIDA9Ymlwb2xhciwgMT11bmlwb2xhcgotICAgIFs0XSAtIGRhYyMxIC4uLgotICAgIC4uLgotICAgIFsxN10gLSBkYWMjNyAuLi4KLSovCisvKgorICogRHJpdmVyOiBydGk4MDIKKyAqIERlc2NyaXB0aW9uOiBBbmFsb2cgRGV2aWNlcyBSVEktODAyCisgKiBBdXRob3I6IEFuZGVycyBCbG9tZGVsbCA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPgorICogRGV2aWNlczogKEFuYWxvZyBEZXZpY2VzKSBSVEktODAyIFtydGk4MDJdCisgKiBTdGF0dXM6IHdvcmtzCisgKgorICogQ29uZmlndXJhdGlvbiBPcHRpb25zOgorICogICBbMF0gLSBpL28gYmFzZQorICogICBbMV0gLSB1bnVzZWQKKyAqICAgWzIsNCw2LDgsMTAsMTIsMTQsMTZdIC0gZGFjI1swLTddICAwPXR3bydzIGNvbXAsIDE9c3RyYWlnaHQKKyAqICAgWzMsNSw3LDksMTEsMTMsMTUsMTddIC0gZGFjI1swLTddICAwPWJpcG9sYXIsIDE9dW5pcG9sYXIKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKLSNkZWZpbmUgUlRJODAyX1NJWkUgNAotCi0jZGVmaW5lIFJUSTgwMl9TRUxFQ1QgMAotI2RlZmluZSBSVEk4MDJfREFUQUxPVyAxCi0jZGVmaW5lIFJUSTgwMl9EQVRBSElHSCAyCisvKgorICogUmVnaXN0ZXIgSS9PIG1hcAorICovCisjZGVmaW5lIFJUSTgwMl9TRUxFQ1QJCTB4MDAKKyNkZWZpbmUgUlRJODAyX0RBVEFMT1cJCTB4MDEKKyNkZWZpbmUgUlRJODAyX0RBVEFISUdICQkweDAyCiAKIHN0cnVjdCBydGk4MDJfcHJpdmF0ZSB7CiAJZW51bSB7CkBAIC01MSwzNCArNTAsNDUgQEAKIAogc3RhdGljIGludCBydGk4MDJfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcnRpODAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCi0JCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CisJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKIAotCXJldHVybiBpOworCXJldHVybiBpbnNuLT5uOwogfQogCiBzdGF0aWMgaW50IHJ0aTgwMl9hb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCisJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCXVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcnRpODAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JaW50IGksIGQ7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CisKKwlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUlRJODAyX1NFTEVDVCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7Ci0JCWQgPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXSA9IGRhdGFbaV07CisJCXZhbCA9IGRhdGFbaV07CisKKwkJZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl0gPSB2YWw7CisKKwkJLyogbXVuZ2Ugb2Zmc2V0IGJpbmFyeSB0byB0d28ncyBjb21wbGVtZW50IGlmIG5lZWRlZCAqLwogCQlpZiAoZGV2cHJpdi0+ZGFjX2NvZGluZ1tjaGFuXSA9PSBkYWNfMmNvbXApCi0JCQlkIF49IDB4ODAwOwotCQlvdXRiKGNoYW4sIGRldi0+aW9iYXNlICsgUlRJODAyX1NFTEVDVCk7Ci0JCW91dGIoZCAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUlRJODAyX0RBVEFMT1cpOwotCQlvdXRiKGQgPj4gOCwgZGV2LT5pb2Jhc2UgKyBSVEk4MDJfREFUQUhJR0gpOworCQkJdmFsID0gY29tZWRpX29mZnNldF9tdW5nZShzLCB2YWwpOworCisJCW91dGIodmFsICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBSVEk4MDJfREFUQUxPVyk7CisJCW91dGIoKHZhbCA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUlRJODAyX0RBVEFISUdIKTsKIAl9Ci0JcmV0dXJuIGk7CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAogc3RhdGljIGludCBydGk4MDJfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKQEAgLTg4LDcgKzk4LDcgQEAKIAlpbnQgaTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIFJUSTgwMl9TSVpFKTsKKwlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgwNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTAwLDIyICsxMTAsMjEgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJLyogQW5hbG9nIE91dHB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQkvKiBhbyBzdWJkZXZpY2UgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87Ci0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCXMtPm1heGRhdGEgPSAweGZmZjsKLQlzLT5uX2NoYW4gPSA4OwotCXMtPmluc25fcmVhZCA9IHJ0aTgwMl9hb19pbnNuX3JlYWQ7Ci0Jcy0+aW5zbl93cml0ZSA9IHJ0aTgwMl9hb19pbnNuX3dyaXRlOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOworCXMtPm1heGRhdGEJPSAweGZmZjsKKwlzLT5uX2NoYW4JPSA4OworCXMtPmluc25fcmVhZAk9IHJ0aTgwMl9hb19pbnNuX3JlYWQ7CisJcy0+aW5zbl93cml0ZQk9IHJ0aTgwMl9hb19pbnNuX3dyaXRlOwogCXMtPnJhbmdlX3RhYmxlX2xpc3QgPSBkZXZwcml2LT5yYW5nZV90eXBlX2xpc3Q7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWRldnByaXYtPmRhY19jb2RpbmdbaV0gPSAoaXQtPm9wdGlvbnNbMyArIDIgKiBpXSkKLQkJICAgID8gKGRhY19zdHJhaWdodCkKLQkJICAgIDogKGRhY18yY29tcCk7CisJCQk/IChkYWNfc3RyYWlnaHQpIDogKGRhY18yY29tcCk7CiAJCWRldnByaXYtPnJhbmdlX3R5cGVfbGlzdFtpXSA9IChpdC0+b3B0aW9uc1syICsgMiAqIGldKQotCQkgICAgPyAmcmFuZ2VfdW5pcG9sYXIxMCA6ICZyYW5nZV9iaXBvbGFyMTA7CisJCQk/ICZyYW5nZV91bmlwb2xhcjEwIDogJnJhbmdlX2JpcG9sYXIxMDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEzMCw1ICsxMzksNSBAQAogbW9kdWxlX2NvbWVkaV9kcml2ZXIocnRpODAyX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkNvbWVkaSBodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgUlRJLTgwMiBib2FyZCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKaW5kZXggOTk1MGY1OS4uODVkMmI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCkBAIC00MjAsMTUgKzQyMCwyOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgczUyNl9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBSRUdfSVNSKTsKKwlpZiAoc3RhdHVzICYgSVNSX0FEQ19ET05FKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVCVVNZOworfQorCiBzdGF0aWMgaW50IHM1MjZfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IHM1MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWludCBuLCBpOworCWludCBuOwogCXVuc2lnbmVkIHNob3J0IHZhbHVlOwogCXVuc2lnbmVkIGludCBkOwotCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IHJldDsKIAogCS8qIFNldCBjb25maWd1cmVkIGRlbGF5LCBlbmFibGUgY2hhbm5lbCBmb3IgdGhpcyBjaGFubmVsIG9ubHksCiAJICogc2VsZWN0ICJBREMgcmVhZCIgY2hhbm5lbCwgc2V0ICJBREMgc3RhcnQiIGJpdC4gKi8KQEAgLTQ0MCwxNyArNDUzLDEyIEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQlvdXR3KHZhbHVlLCBkZXYtPmlvYmFzZSArIFJFR19BREMpOwogCi0jZGVmaW5lIFRJTUVPVVQgMTAwCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCWZvciAoaSA9IDA7IGkgPCBUSU1FT1VUOyBpKyspIHsKLQkJCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFJFR19JU1IpOwotCQkJaWYgKHN0YXR1cyAmIElTUl9BRENfRE9ORSkgewotCQkJCW91dHcoSVNSX0FEQ19ET05FLCBkZXYtPmlvYmFzZSArIFJFR19JU1IpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpID09IFRJTUVPVVQpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBzNTI2X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCW91dHcoSVNSX0FEQ19ET05FLCBkZXYtPmlvYmFzZSArIFJFR19JU1IpOwogCiAJCS8qIHJlYWQgZGF0YSAqLwogCQlkID0gaW53KGRldi0+aW9iYXNlICsgUkVHX0FERCk7CkBAIC02MDQsNyArNjEyLDcgQEAKIAlzLT5pbnNuX2JpdHMgPSBzNTI2X2Rpb19pbnNuX2JpdHM7CiAJcy0+aW5zbl9jb25maWcgPSBzNTI2X2Rpb19pbnNuX2NvbmZpZzsKIAotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgczUyNl9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwppbmRleCAxOWRhMWRiLi45NWZhZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKQEAgLTEwNiwxNiArMTA2LDE2IEBACiBzdHJ1Y3QgczYyNl9lbmNfaW5mbyB7CiAJLyogUG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgZGlmZmVyIGZvciBBIGFuZCBCIGNvdW50ZXJzOiAqLwogCS8qIFJldHVybiBjbG9jayBlbmFibGUuICovCi0JdWludDE2X3QoKmdldF9lbmFibGUpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJdWludDE2X3QgKCpnZXRfZW5hYmxlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgY29uc3Qgc3RydWN0IHM2MjZfZW5jX2luZm8gKmspOwogCS8qIFJldHVybiBpbnRlcnJ1cHQgc291cmNlLiAqLwotCXVpbnQxNl90KCpnZXRfaW50X3NyYykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwl1aW50MTZfdCAoKmdldF9pbnRfc3JjKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzNjI2X2VuY19pbmZvICprKTsKIAkvKiBSZXR1cm4gcHJlbG9hZCB0cmlnZ2VyIHNvdXJjZS4gKi8KLQl1aW50MTZfdCgqZ2V0X2xvYWRfdHJpZykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwl1aW50MTZfdCAoKmdldF9sb2FkX3RyaWcpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJIGNvbnN0IHN0cnVjdCBzNjI2X2VuY19pbmZvICprKTsKIAkvKiBSZXR1cm4gc3RhbmRhcmRpemVkIG9wZXJhdGluZyBtb2RlLiAqLwotCXVpbnQxNl90KCpnZXRfbW9kZSkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwl1aW50MTZfdCAoKmdldF9tb2RlKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIGNvbnN0IHN0cnVjdCBzNjI2X2VuY19pbmZvICprKTsKIAkvKiBHZW5lcmF0ZSBzb2Z0IGluZGV4IHN0cm9iZS4gKi8KIAl2b2lkICgqcHVsc2VfaW5kZXgpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC0yMDksNiArMjA5LDggQEAKIHN0YXRpYyB2b2lkIHM2MjZfZGViaV90cmFuc2ZlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJc3RhdGljIGNvbnN0IGludCB0aW1lb3V0ID0gMTAwMDA7CisJaW50IGk7CiAKIAkvKiBJbml0aWF0ZSB1cGxvYWQgb2Ygc2hhZG93IFJBTSB0byBERUJJIGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAlzNjI2X21jX2VuYWJsZShkZXYsIFM2MjZfTUMyX1VQTERfREVCSSwgUzYyNl9QX01DMik7CkBAIC0yMTcsMTIgKzIxOSwyMyBAQAogCSAqIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgdXBsb2FkIGZyb20gc2hhZG93IFJBTSB0bwogCSAqIERFQkkgY29udHJvbCByZWdpc3Rlci4KIAkgKi8KLQl3aGlsZSAoIXM2MjZfbWNfdGVzdChkZXYsIFM2MjZfTUMyX1VQTERfREVCSSwgUzYyNl9QX01DMikpCi0JCTsKKwlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCWlmIChzNjI2X21jX3Rlc3QoZGV2LCBTNjI2X01DMl9VUExEX0RFQkksIFM2MjZfUF9NQzIpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKGkgPT0gdGltZW91dCkKKwkJY29tZWRpX2Vycm9yKGRldiwKKwkJCSJUaW1lb3V0IHdoaWxlIHVwbG9hZGluZyB0byBERUJJIGNvbnRyb2wgcmVnaXN0ZXIuIik7CiAKIAkvKiBXYWl0IHVudGlsIERFQkkgdHJhbnNmZXIgaXMgZG9uZSAqLwotCXdoaWxlIChyZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX1BTUikgJiBTNjI2X1BTUl9ERUJJX1MpCi0JCTsKKwlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCWlmICghKHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfUFNSKSAmIFM2MjZfUFNSX0RFQklfUykpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KQorCQljb21lZGlfZXJyb3IoZGV2LCAiREVCSSB0cmFuc2ZlciB0aW1lb3V0LiIpOwogfQogCiAvKgpAQCAtMzUxLDE0ICszNjQsNTcgQEAKIAkweDQwLCAweDQxLCAweDQyLCAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDYwLCAweDYxLCAweDYyLCAweDYzCiB9OwogCitlbnVtIHsKKwlzNjI2X3NlbmRfZGFjX3dhaXRfbm90X21jMV9hMm91dCwKKwlzNjI2X3NlbmRfZGFjX3dhaXRfc3NyX2FmMl9vdXQsCisJczYyNl9zZW5kX2RhY193YWl0X2ZiX2J1ZmZlcjJfbXNiXzAwLAorCXM2MjZfc2VuZF9kYWNfd2FpdF9mYl9idWZmZXIyX21zYl9mZgorfTsKKworc3RhdGljIGludCBzNjI2X3NlbmRfZGFjX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3dpdGNoIChjb250ZXh0KSB7CisJY2FzZSBzNjI2X3NlbmRfZGFjX3dhaXRfbm90X21jMV9hMm91dDoKKwkJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9NQzEpOworCQlpZiAoIShzdGF0dXMgJiBTNjI2X01DMV9BMk9VVCkpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBzNjI2X3NlbmRfZGFjX3dhaXRfc3NyX2FmMl9vdXQ6CisJCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfU1NSKTsKKwkJaWYgKHN0YXR1cyAmIFM2MjZfU1NSX0FGMl9PVVQpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBzNjI2X3NlbmRfZGFjX3dhaXRfZmJfYnVmZmVyMl9tc2JfMDA6CisJCXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfRkJfQlVGRkVSMik7CisJCWlmICghKHN0YXR1cyAmIDB4ZmYwMDAwMDApKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgczYyNl9zZW5kX2RhY193YWl0X2ZiX2J1ZmZlcjJfbXNiX2ZmOgorCQlzdGF0dXMgPSByZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX0ZCX0JVRkZFUjIpOworCQlpZiAoc3RhdHVzICYgMHhmZjAwMDAwMCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKwogLyoKICAqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uOiBUcmFuc21pdCBzZXJpYWwgZGF0YSB0byBEQUMgdmlhIEF1ZGlvCiAgKiBjaGFubmVsIDIuICBBc3N1bWVzOiAoMSkgVFNMMiBzbG90IHJlY29yZHMgaW5pdGlhbGl6ZWQsIGFuZCAoMikKICAqIGRhY3BvbCBjb250YWlucyB2YWxpZCB0YXJnZXQgaW1hZ2UuCiAgKi8KLXN0YXRpYyB2b2lkIHM2MjZfc2VuZF9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDMyX3QgdmFsKQorc3RhdGljIGludCBzNjI2X3NlbmRfZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVpbnQzMl90IHZhbCkKIHsKIAlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCWludCByZXQ7CiAKIAkvKiBTVEFSVCBUSEUgU0VSSUFMIENMT0NLIFJVTk5JTkcgLS0tLS0tLS0tLS0tLSAqLwogCkBAIC00MDQsOCArNDYwLDEyIEBACiAJICogRG9uZSBieSBwb2xsaW5nIHRoZSBETUFDIGVuYWJsZSBmbGFnOyB0aGlzIGZsYWcgaXMgYXV0b21hdGljYWxseQogCSAqIGNsZWFyZWQgd2hlbiB0aGUgdHJhbnNmZXIgaGFzIGZpbmlzaGVkLgogCSAqLwotCXdoaWxlIChyZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX01DMSkgJiBTNjI2X01DMV9BMk9VVCkKLQkJOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgTlVMTCwgTlVMTCwgczYyNl9zZW5kX2RhY19lb2MsCisJCQkgICAgIHM2MjZfc2VuZF9kYWNfd2FpdF9ub3RfbWMxX2Eyb3V0KTsKKwlpZiAocmV0KSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJETUEgdHJhbnNmZXIgdGltZW91dC4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiBTVEFSVCBUSEUgT1VUUFVUIFNUUkVBTSBUTyBUSEUgVEFSR0VUIERBQyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC00MjUsOCArNDg1LDEyIEBACiAJICogZmluaXNoZWQgdHJhbnNmZXJyaW5nIHRoZSBEQUMncyBkYXRhIERXT1JEIGZyb20gdGhlIG91dHB1dCBGSUZPCiAJICogdG8gdGhlIG91dHB1dCBidWZmZXIgcmVnaXN0ZXIuCiAJICovCi0Jd2hpbGUgKCEocmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9TU1IpICYgUzYyNl9TU1JfQUYyX09VVCkpCi0JCTsKKwlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIE5VTEwsIE5VTEwsIHM2MjZfc2VuZF9kYWNfZW9jLAorCQkJICAgICBzNjI2X3NlbmRfZGFjX3dhaXRfc3NyX2FmMl9vdXQpOworCWlmIChyZXQpIHsKKwkJY29tZWRpX2Vycm9yKGRldiwgIlRTTCB0aW1lb3V0IHdhaXRpbmcgZm9yIHNsb3QgMSB0byBleGVjdXRlLiIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCS8qCiAJICogU2V0IHVwIHRvIHRyYXAgZXhlY3V0aW9uIGF0IHNsb3QgMCB3aGVuIHRoZSBUU0wgc2VxdWVuY2VyIGN5Y2xlcwpAQCAtNDY2LDggKzUzMCwxMyBAQAogCQkgKiBmcm9tIDB4RkYgdG8gMHgwMCwgd2hpY2ggc2xvdCAwIGNhdXNlcyB0byBoYXBwZW4gYnkgc2hpZnRpbmcKIAkJICogb3V0L2luIG9uIFNEMiB0aGUgMHgwMCB0aGF0IGlzIGFsd2F5cyByZWZlcmVuY2VkIGJ5IHNsb3QgNS4KIAkJICovCi0JCXdoaWxlIChyZWFkbChkZXZwcml2LT5tbWlvICsgUzYyNl9QX0ZCX0JVRkZFUjIpICYgMHhmZjAwMDAwMCkKLQkJCTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBOVUxMLCBOVUxMLCBzNjI2X3NlbmRfZGFjX2VvYywKKwkJCQkgICAgIHM2MjZfc2VuZF9kYWNfd2FpdF9mYl9idWZmZXIyX21zYl8wMCk7CisJCWlmIChyZXQpIHsKKwkJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkJIlRTTCB0aW1lb3V0IHdhaXRpbmcgZm9yIHNsb3QgMCB0byBleGVjdXRlLiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAkvKgogCSAqIEVpdGhlciAoMSkgd2Ugd2VyZSB0b28gbGF0ZSBzZXR0aW5nIHRoZSBzbG90IDAgdHJhcDsgdGhlIFRTTApAQCAtNDg2LDE0ICs1NTUsMTkgQEAKIAkgKiB0aGUgbmV4dCBEQUMgd3JpdGUuICBUaGlzIGlzIGRldGVjdGVkIHdoZW4gRkJfQlVGRkVSMiBNU0IgY2hhbmdlcwogCSAqIGZyb20gMHgwMCB0byAweEZGLgogCSAqLwotCXdoaWxlICghKHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfRkJfQlVGRkVSMikgJiAweGZmMDAwMDAwKSkKLQkJOworCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgTlVMTCwgTlVMTCwgczYyNl9zZW5kX2RhY19lb2MsCisJCQkgICAgIHM2MjZfc2VuZF9kYWNfd2FpdF9mYl9idWZmZXIyX21zYl9mZik7CisJaWYgKHJldCkgeworCQljb21lZGlfZXJyb3IoZGV2LCAiVFNMIHRpbWVvdXQgd2FpdGluZyBmb3Igc2xvdCAwIHRvIGV4ZWN1dGUuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOwogfQogCiAvKgogICogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb246IFdyaXRlIHNldHBvaW50IHRvIGFuIGFwcGxpY2F0aW9uIERBQyBjaGFubmVsLgogICovCi1zdGF0aWMgdm9pZCBzNjI2X3NldF9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDE2X3QgY2hhbiwKK3N0YXRpYyBpbnQgczYyNl9zZXRfZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVpbnQxNl90IGNoYW4sCiAJCQkgaW50MTZfdCBkYWNkYXRhKQogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC01NTYsMTAgKzYzMCwxMCBAQAogCXZhbCB8PSAoKHVpbnQzMl90KShjaGFuICYgMSkgPDwgMTUpOwkvKiBBZGRyZXNzIHRoZSBEQUMgY2hhbm5lbAogCQkJCQkJICogd2l0aGluIHRoZSBkZXZpY2UuICovCiAJdmFsIHw9ICh1aW50MzJfdClkYWNkYXRhOwkvKiBJbmNsdWRlIERBQyBzZXRwb2ludCBkYXRhLiAqLwotCXM2MjZfc2VuZF9kYWMoZGV2LCB2YWwpOworCXJldHVybiBzNjI2X3NlbmRfZGFjKGRldiwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgczYyNl93cml0ZV90cmltX2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50OF90IGxvZ2ljYWxfY2hhbiwKK3N0YXRpYyBpbnQgczYyNl93cml0ZV90cmltX2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50OF90IGxvZ2ljYWxfY2hhbiwKIAkJCQl1aW50OF90IGRhY19kYXRhKQogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC02MDYsMTcgKzY4MCwyMiBAQAogCSAqIEFkZHJlc3MgdGhlIERBQyBjaGFubmVsIHdpdGhpbiB0aGUgdHJpbWRhYyBkZXZpY2UuCiAJICogSW5jbHVkZSBEQUMgc2V0cG9pbnQgZGF0YS4KIAkgKi8KLQlzNjI2X3NlbmRfZGFjKGRldiwgKGNoYW4gPDwgOCkgfCBkYWNfZGF0YSk7CisJcmV0dXJuIHM2MjZfc2VuZF9kYWMoZGV2LCAoY2hhbiA8PCA4KSB8IGRhY19kYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgczYyNl9sb2FkX3RyaW1fZGFjcyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzNjI2X2xvYWRfdHJpbV9kYWNzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJdWludDhfdCBpOworCWludCByZXQ7CiAKIAkvKiBDb3B5IFRyaW1EYWMgc2V0cG9pbnQgdmFsdWVzIGZyb20gRUVQUk9NIHRvIFRyaW1EYWNzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHM2MjZfdHJpbWNoYW4pOyBpKyspCi0JCXM2MjZfd3JpdGVfdHJpbV9kYWMoZGV2LCBpLAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHM2MjZfdHJpbWNoYW4pOyBpKyspIHsKKwkJcmV0ID0gczYyNl93cml0ZV90cmltX2RhYyhkZXYsIGksCiAJCQkJICAgIHM2MjZfaTJjX3JlYWQoZGV2LCBzNjI2X3RyaW1hZHJzW2ldKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyogKioqKioqICBDT1VOVEVSIEZVTkNUSU9OUyAgKioqKioqKiAqLwpAQCAtMTg0Niw2ICsxOTI1LDIwIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGludCBzNjI2X2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZGwoZGV2cHJpdi0+bW1pbyArIFM2MjZfUF9QU1IpOworCWlmIChzdGF0dXMgJiBTNjI2X1BTUl9HUElPMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKwogc3RhdGljIGludCBzNjI2X2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCkBAIC0xODU2LDYgKzE5NDksNyBAQAogCXVpbnQxNl90IGFkY19zcGVjID0gMDsKIAl1aW50MzJfdCBncGlvX2ltYWdlOwogCXVpbnQzMl90IHRtcDsKKwlpbnQgcmV0OwogCWludCBuOwogCiAJLyoKQEAgLTE4OTcsOCArMTk5MSw5IEBACiAJCSAqLwogCiAJCS8qIFdhaXQgZm9yIEFEQyBkb25lICovCi0JCXdoaWxlICghKHJlYWRsKGRldnByaXYtPm1taW8gKyBTNjI2X1BfUFNSKSAmIFM2MjZfUFNSX0dQSU8yKSkKLQkJCTsKKwkJcmV0ID0gY29tZWRpX3RpbWVvdXQoZGV2LCBzLCBpbnNuLCBzNjI2X2FpX2VvYywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIEZldGNoIEFEQyBkYXRhICovCiAJCWlmIChuICE9IDApIHsKQEAgLTIyOTksNiArMjM5NCw3IEBACiB7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaTsKKwlpbnQgcmV0OwogCXVpbnQxNl90IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQxNl90IGRhY2RhdGE7CiAKQEAgLTIzMDcsNyArMjQwMyw5IEBACiAJCWRldnByaXYtPmFvX3JlYWRiYWNrW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXSA9IGRhdGFbaV07CiAJCWRhY2RhdGEgLT0gKDB4MWZmZik7CiAKLQkJczYyNl9zZXRfZGFjKGRldiwgY2hhbiwgZGFjZGF0YSk7CisJCXJldCA9IHM2MjZfc2V0X2RhYyhkZXYsIGNoYW4sIGRhY2RhdGEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gaTsKQEAgLTI1NDMsMTIgKzI2NDEsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgczYyNl9pbml0aWFsaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHM2MjZfaW5pdGlhbGl6ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJZG1hX2FkZHJfdCBwaHlzX2J1ZjsKIAl1aW50MTZfdCBjaGFuOwogCWludCBpOworCWludCByZXQ7CiAKIAkvKiBFbmFibGUgREVCSSBhbmQgYXVkaW8gcGlucywgZW5hYmxlIEkyQyBpbnRlcmZhY2UgKi8KIAlzNjI2X21jX2VuYWJsZShkZXYsIFM2MjZfTUMxX0RFQkkgfCBTNjI2X01DMV9BVURJTyB8IFM2MjZfTUMxX0kyQywKQEAgLTI3NDksNyArMjg0OCw5IEBACiAJICogc29tZXRpbWVzIGNhdXNlcyB0aGUgZmlyc3QgZmV3IFRyaW1EQUMgd3JpdGVzIHRvIG1hbGZ1bmN0aW9uLgogCSAqLwogCXM2MjZfbG9hZF90cmltX2RhY3MoZGV2KTsKLQlzNjI2X2xvYWRfdHJpbV9kYWNzKGRldik7CisJcmV0ID0gczYyNl9sb2FkX3RyaW1fZGFjcyhkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKgogCSAqIE1hbnVhbGx5IGluaXQgYWxsIGdhdGUgYXJyYXkgaGFyZHdhcmUgaW4gY2FzZSB0aGlzIGlzIGEgc29mdApAQCAtMjc2Myw4ICsyODY0LDExIEBACiAJICogSW5pdCBhbGwgREFDIG91dHB1dHMgdG8gMFYgYW5kIGluaXQgYWxsIERBQyBzZXRwb2ludCBhbmQKIAkgKiBwb2xhcml0eSBpbWFnZXMuCiAJICovCi0JZm9yIChjaGFuID0gMDsgY2hhbiA8IFM2MjZfREFDX0NIQU5ORUxTOyBjaGFuKyspCi0JCXM2MjZfc2V0X2RhYyhkZXYsIGNoYW4sIDApOworCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBTNjI2X0RBQ19DSEFOTkVMUzsgY2hhbisrKSB7CisJCXJldCA9IHM2MjZfc2V0X2RhYyhkZXYsIGNoYW4sIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiBJbml0IGNvdW50ZXJzICovCiAJczYyNl9jb3VudGVyc19pbml0KGRldik7CkBAIC0yNzgwLDYgKzI4ODQsOCBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZGlnaXRhbCBJL08gc3Vic3lzdGVtICovCiAJczYyNl9kaW9faW5pdChkZXYpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgczYyNl9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMjkwMCw5ICszMDA2LDkgQEAKIAlzLT5pbnNuX3JlYWQJPSBzNjI2X2VuY19pbnNuX3JlYWQ7CiAJcy0+aW5zbl93cml0ZQk9IHM2MjZfZW5jX2luc25fd3JpdGU7CiAKLQlzNjI2X2luaXRpYWxpemUoZGV2KTsKLQotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXMgYXR0YWNoZWRcbiIsIGRldi0+Ym9hcmRfbmFtZSk7CisJcmV0ID0gczYyNl9pbml0aWFsaXplKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMKaW5kZXggNzdlMjA1OS4uMzkwMDhjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jCkBAIC0xNDIsNiArMTQyLDI5IEBACiB9CiAKIC8qCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhIHBhcnRpY3VsYXIgZm9ybSwgdGhpcyBpcyBqdXN0CisgKiB3aGF0IGhhcHBlbnMgdG8gYmUgdXNlZCBpbiBzb21lIG9mIHRoZSBkcml2ZXJzLiBUaGUgY29tZWRpX3RpbWVvdXQoKQorICogaGVscGVyIHVzZXMgdGhpcyBjYWxsYmFjayB0byBjaGVjayBmb3IgdGhlIGVuZC1vZi1jb252ZXJzaW9uIHdoaWxlCisgKiB3YWl0aW5nIGZvciB1cCB0byAxIHNlY29uZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDAgd2hlbiB0aGUKKyAqIGNvbnZlcnNpb24gaXMgZmluaXNoZWQgYW5kIC1FQlVTWSB0byBrZWVwIHdhaXRpbmcuIEFueSBvdGhlciBlcnJubworICogd2lsbCB0ZXJtaW5hdGUgY29tZWRpX3RpbWVvdXQoKSBhbmQgcmV0dXJuIHRoYXQgZXJybm8gdG8gdGhlIGNhbGxlci4KKyAqIElmIHRoZSB0aW1lb3V0IG9jY3VycywgY29tZWRpX3RpbWVvdXQoKSB3aWxsIHJldHVybiAtRVRJTUVET1VULgorICovCitzdGF0aWMgaW50IHNrZWxfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJLyogc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgU0tFTF9TVEFUVVMpOyAqLworCXN0YXR1cyA9IDE7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKworLyoKICAqICJpbnN0cnVjdGlvbnMiIHJlYWQvd3JpdGUgZGF0YSBpbiAib25lLXNob3QiIG9yICJzb2Z0d2FyZS10cmlnZ2VyZWQiCiAgKiBtb2RlLgogICovCkBAIC0xNDksOSArMTcyLDkgQEAKIAkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAljb25zdCBzdHJ1Y3Qgc2tlbF9ib2FyZCAqdGhpc2JvYXJkID0gY29tZWRpX2JvYXJkKGRldik7Ci0JaW50IG4sIGk7CisJaW50IG47CiAJdW5zaWduZWQgaW50IGQ7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKKwlpbnQgcmV0OwogCiAJLyogYSB0eXBpY2FsIHByb2dyYW1taW5nIHNlcXVlbmNlICovCiAKQEAgLTE2NSwxOCArMTg4LDEwIEBACiAJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLwogCQkvKiBvdXR3KDAsZGV2LT5pb2Jhc2UgKyBTS0VMX0NPTlZFUlQpOyAqLwogCi0jZGVmaW5lIFRJTUVPVVQgMTAwCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCi0JCWZvciAoaSA9IDA7IGkgPCBUSU1FT1VUOyBpKyspIHsKLQkJCXN0YXR1cyA9IDE7Ci0JCQkvKiBzdGF0dXMgPSBpbmIoZGV2LT5pb2Jhc2UgKyBTS0VMX1NUQVRVUyk7ICovCi0JCQlpZiAoc3RhdHVzKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IFRJTUVPVVQpIHsKLQkJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LCAiYWkgdGltZW91dFxuIik7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQorCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHNrZWxfYWlfZW9jLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJLyogcmVhZCBkYXRhICovCiAJCS8qIGQgPSBpbncoZGV2LT5pb2Jhc2UgKyBTS0VMX0FJX0RBVEEpOyAqLwpAQCAtNDU2LDggKzQ3MSw2IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCi0JZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJza2VsOiBhdHRhY2hlZFxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3Nzdl9kbnAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMKaW5kZXggZGYyMmE3OC4uODQ4YzMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3Nzdl9kbnAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jCkBAIC0xNjEsOCArMTYxLDcgQEAKIAlvdXRiKFBDTVIsIENTQ0lSKTsKIAlvdXRiKChpbmIoQ1NDRFIpICYgMHhBQSksIENTQ0RSKTsKIAotCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiJXM6IGF0dGFjaGVkXG4iLCBkZXYtPmJvYXJkX25hbWUpOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkbnBfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwppbmRleCA1Zjg1YzU1Li5kNmZhZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKQEAgLTM3Miw3ICszNzIsNyBAQAogCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAogCQkJCQlUUklHX05PVyB8IFRSSUdfRVhUIHwgVFJJR19JTlQpOwogCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCi0JCQkJCVRSSUdfVElNRVIgfCBUUklHX0ZPTExPVyB8IFRSSUdfRVhUKTsKKwkJCQkJVFJJR19GT0xMT1cgfCBUUklHX0VYVCk7CiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKIAllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CiAJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CkBAIC00MjQsOSArNDI0LDYgQEAKIAkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgdG1wKTsKIAl9CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gLUVJTlZBTDsKLQogCS8qIHN0b3Agc291cmNlICovCiAJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CiAJY2FzZSBUUklHX0NPVU5UOgpAQCAtNTE0LDM2ICs1MTEsMjggQEAKIAkgKi8KIAlkZXZwcml2LT5pZ25vcmUgPSBQQUNLRVRTX1RPX0lHTk9SRTsKIAotCWlmIChjbWQtPmNoYW5saXN0X2xlbiA+IDApIHsKLQkJZ2FpbiA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pOwotCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47ICsraSkgewotCQkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7Ci0JCQlpZiAoY2hhbiAhPSBpKSB7Ci0JCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkJImNoYW5uZWxzIGFyZSBub3QgY29uc2VjdXRpdmVcbiIpOwotCQkJCXVwKCZkZXZwcml2LT5zZW0pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaWYgKChnYWluICE9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pKQotCQkJICAgICYmIChjbWQtPmNoYW5saXN0X2xlbiA+IDMpKSB7Ci0JCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkJImdhaW4gbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsIGNoYW5uZWxzXG4iKTsKLQkJCQl1cCgmZGV2cHJpdi0+c2VtKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWlmIChpID49IE5VTUNIQU5ORUxTKSB7Ci0JCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImNoYW5saXN0IHRvbyBsb25nXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KKwlnYWluID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSk7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCWlmIChjaGFuICE9IGkpIHsKKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCisJCQkJImNoYW5uZWxzIGFyZSBub3QgY29uc2VjdXRpdmVcbiIpOworCQkJdXAoJmRldnByaXYtPnNlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKGdhaW4gIT0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSkpCisJCQkmJiAoY21kLT5jaGFubGlzdF9sZW4gPiAzKSkgeworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKKwkJCQkiZ2FpbiBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgY2hhbm5lbHNcbiIpOworCQkJdXAoJmRldnByaXYtPnNlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoaSA+PSBOVU1DSEFOTkVMUykgeworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImNoYW5saXN0IHRvbyBsb25nXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCXN0ZXBzID0gMDsKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkic2Nhbl9iZWdpbl9zcmM9PVRSSUdfVElNRVIgbm90IHZhbGlkXG4iKTsKLQkJdXAoJmRldnByaXYtPnNlbSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQogCQlzdGVwcyA9IChjbWQtPmNvbnZlcnRfYXJnICogMzApIC8gMTAwMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCmluZGV4IDdkYzVhMTguLjg3NzdmOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKQEAgLTQxLDcgKzQxLDggQEAKIAlpZiAoc3RybmNtcChmaWxlbmFtZSwgIi9kZXYvY29tZWRpIiwgMTEpICE9IDApCiAJCXJldHVybiBOVUxMOwogCi0JbWlub3IgPSBzaW1wbGVfc3RydG91bChmaWxlbmFtZSArIDExLCBOVUxMLCAwKTsKKwlpZiAoa3N0cnRvdWludChmaWxlbmFtZSArIDExLCAwLCAmbWlub3IpKQorCQlyZXR1cm4gTlVMTDsKIAogCWlmIChtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUykKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jCmluZGV4IGRhNmJjNTguLjkxZGVhMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jCkBAIC0xLDI3ICsxLDI2IEBACiAvKgotICAgIG1vZHVsZS9wcm9jLmMKLSAgICAvcHJvYyBpbnRlcmZhY2UgZm9yIGNvbWVkaQotCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KKyAqIC9wcm9jIGludGVyZmFjZSBmb3IgY29tZWRpCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk4IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCiAvKgotCVRoaXMgaXMgc29tZSBzZXJpb3VzIGJsb2F0d2FyZS4KLQotCVRha2VuIGZyb20gRGF2ZSBBLidzIFBDTC03MTEgZHJpdmVyLCAnY3V6IEkgdGhvdWdodCBpdAotCXdhcyBjb29sLgotKi8KKyAqIFRoaXMgaXMgc29tZSBzZXJpb3VzIGJsb2F0d2FyZS4KKyAqCisgKiBUYWtlbiBmcm9tIERhdmUgQS4ncyBQQ0wtNzExIGRyaXZlciwgJ2N1eiBJIHRob3VnaHQgaXQKKyAqIHdhcyBjb29sLgorICovCiAKICNpbmNsdWRlICJjb21lZGlkZXYuaCIKICNpbmNsdWRlICJjb21lZGlfaW50ZXJuYWwuaCIKQEAgLTM0LDExICszMyw4IEBACiAJaW50IGRldmljZXNfcSA9IDA7CiAJc3RydWN0IGNvbWVkaV9kcml2ZXIgKmRyaXY7CiAKLQlzZXFfcHJpbnRmKG0sCi0JCSAgICAgImNvbWVkaSB2ZXJzaW9uICIgQ09NRURJX1JFTEVBU0UgIlxuIgotCQkgICAgICJmb3JtYXQgc3RyaW5nOiAlc1xuIiwKLQkJICAgICAiXCIlMmQ6ICUtMjBzICUtMjBzICU0ZFwiLCBpLCAiCi0JCSAgICAgImRyaXZlcl9uYW1lLCBib2FyZF9uYW1lLCBuX3N1YmRldmljZXMiKTsKKwlzZXFfcHJpbnRmKG0sICJjb21lZGkgdmVyc2lvbiAiIENPTUVESV9SRUxFQVNFICJcbmZvcm1hdCBzdHJpbmc6ICVzXG4iLAorCQkgICAiXCIlMmQ6ICUtMjBzICUtMjBzICU0ZFwiLCBpLCBkcml2ZXJfbmFtZSwgYm9hcmRfbmFtZSwgbl9zdWJkZXZpY2VzIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7IGkrKykgewogCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gY29tZWRpX2Rldl9nZXRfZnJvbV9taW5vcihpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYwppbmRleCA0NmIzZGE2Li5iNjg0OTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9yYW5nZS5jCkBAIC0xNDMsMjggKzE0MywyMyBAQAogCXVuc2lnbmVkIGludCBjaGFuc3BlYzsKIAlpbnQgY2hhbiwgcmFuZ2VfbGVuLCBpOwogCi0JaWYgKHMtPnJhbmdlX3RhYmxlIHx8IHMtPnJhbmdlX3RhYmxlX2xpc3QpIHsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJY2hhbnNwZWMgPSBjaGFubGlzdFtpXTsKLQkJCWNoYW4gPSBDUl9DSEFOKGNoYW5zcGVjKTsKLQkJCWlmIChzLT5yYW5nZV90YWJsZSkKLQkJCQlyYW5nZV9sZW4gPSBzLT5yYW5nZV90YWJsZS0+bGVuZ3RoOwotCQkJZWxzZSBpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCAmJiBjaGFuIDwgcy0+bl9jaGFuKQotCQkJCXJhbmdlX2xlbiA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl0tPmxlbmd0aDsKLQkJCWVsc2UKLQkJCQlyYW5nZV9sZW4gPSAwOwotCQkJaWYgKGNoYW4gPj0gcy0+bl9jaGFuIHx8Ci0JCQkgICAgQ1JfUkFOR0UoY2hhbnNwZWMpID49IHJhbmdlX2xlbiB8fAotCQkJICAgIGFyZWZfaW52YWxpZChzLCBjaGFuc3BlYykpIHsKLQkJCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwKLQkJCQkJICJiYWQgY2hhbmxpc3RbJWRdPTB4JTA4eCBjaGFuPSVkIHJhbmdlIGxlbmd0aD0lZFxuIiwKLQkJCQkJIGksIGNoYW5zcGVjLCBjaGFuLCByYW5nZV9sZW4pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQorCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJY2hhbnNwZWMgPSBjaGFubGlzdFtpXTsKKwkJY2hhbiA9IENSX0NIQU4oY2hhbnNwZWMpOworCQlpZiAocy0+cmFuZ2VfdGFibGUpCisJCQlyYW5nZV9sZW4gPSBzLT5yYW5nZV90YWJsZS0+bGVuZ3RoOworCQllbHNlIGlmIChzLT5yYW5nZV90YWJsZV9saXN0ICYmIGNoYW4gPCBzLT5uX2NoYW4pCisJCQlyYW5nZV9sZW4gPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dLT5sZW5ndGg7CisJCWVsc2UKKwkJCXJhbmdlX2xlbiA9IDA7CisJCWlmIChjaGFuID49IHMtPm5fY2hhbiB8fAorCQkgICAgQ1JfUkFOR0UoY2hhbnNwZWMpID49IHJhbmdlX2xlbiB8fAorCQkgICAgYXJlZl9pbnZhbGlkKHMsIGNoYW5zcGVjKSkgeworCQkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsCisJCQkJICJiYWQgY2hhbmxpc3RbJWRdPTB4JTA4eCBjaGFuPSVkIHJhbmdlIGxlbmd0aD0lZFxuIiwKKwkJCQkgaSwgY2hhbnNwZWMsIGNoYW4sIHJhbmdlX2xlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIoYnVnKSBubyByYW5nZSB0eXBlIGxpc3QhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY21fNzAwMTJfcmVncy5oIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY21fNzAwMTJfcmVncy5oCmluZGV4IGYzYWIzMTQuLmRhMTk5YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNtXzcwMDEyX3JlZ3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjbV83MDAxMl9yZWdzLmgKQEAgLTMxLDcgKzMxLDggQEAKICNkZWZpbmUgQlJDTV9TSElGVChjLCByLCBmKSAgIGMjI18jI3IjI18jI2YjI19TSElGVAogCiAjZGVmaW5lIEdFVF9GSUVMRChtLCBjLCByLCBmKSBcCi0JKCgoKG0pICYgQlJDTV9NQVNLKGMsIHIsIGYpKSA+PiBCUkNNX1NISUZUKGMsIHIsIGYpKSA8PCBCUkNNX0FMSUdOKGMsIHIsIGYpKQorCSgoKChtKSAmIEJSQ01fTUFTSyhjLCByLCBmKSkgPj4gQlJDTV9TSElGVChjLCByLCBmKSkgPDwgXAorCSBCUkNNX0FMSUdOKGMsIHIsIGYpKQogCiAjZGVmaW5lIFNFVF9GSUVMRChtLCBjLCByLCBmLCBkKSBcCiAJKChtKSA9ICgoKG0pICYgfkJSQ01fTUFTSyhjLCByLCBmKSkgfCAoKCgoZCkgPj4gQlJDTV9BTElHTihjLCByLCBmKSkgPDwgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2h3LmMKaW5kZXggOGQwNjgwZC4uNDc2NWQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9ody5jCkBAIC00MzMsMTAgKzQzMywxMiBAQAogfQogCiAjZGVmaW5lIGNyeXN0YWxoZF9od19kZWxldGVfaW9xKGFkcCwgcSkJCVwKK2RvIHsJCQkJCQlcCiAJaWYgKHEpIHsJCQkJXAogCQljcnlzdGFsaGRfZGVsZXRlX2Rpb3EoYWRwLCBxKTsJXAogCQlxID0gTlVMTDsJCQlcCi0JfQorCX0JCQkJCVwKK30gd2hpbGUgKDApCiAKIHN0YXRpYyB2b2lkIGNyeXN0YWxoZF9od19kZWxldGVfaW9xcyhzdHJ1Y3QgY3J5c3RhbGhkX2h3ICpodykKIHsKQEAgLTE0MzcsNyArMTQzOSw3IEBACiAJCWNyeXN0YWxoZF9yZWdfd3IoaHctPmFkcCwgTUlTQzFfVVZfUlhfRVJST1JfU1RBVFVTLCB0bXApOwogCX0KIAotCXJldHVybiAodG1wX2xzdHMgIT0gaHctPnJ4X2xpc3Rfc3RzWzBdKTsKKwlyZXR1cm4gdG1wX2xzdHMgIT0gaHctPnJ4X2xpc3Rfc3RzWzBdOwogfQogCiBzdGF0aWMgYm9vbCBjcnlzdGFsaGRfcnhfbGlzdDFfaGFuZGxlcihzdHJ1Y3QgY3J5c3RhbGhkX2h3ICpodywKQEAgLTE1MDcsNyArMTUwOSw3IEBACiAJCWNyeXN0YWxoZF9yZWdfd3IoaHctPmFkcCwgTUlTQzFfVVZfUlhfRVJST1JfU1RBVFVTLCB0bXApOwogCX0KIAotCXJldHVybiAodG1wX2xzdHMgIT0gaHctPnJ4X2xpc3Rfc3RzWzFdKTsKKwlyZXR1cm4gdG1wX2xzdHMgIT0gaHctPnJ4X2xpc3Rfc3RzWzFdOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKaW5kZXggOTllZWZkMC4uMjBiZTk1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkcC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjcnlzdGFsaGRfdXNlcl9kYXRhKHVuc2lnbmVkIGxvbmcgdWQsIHZvaWQgKmRyLAorc3RhdGljIGlubGluZSBpbnQgY3J5c3RhbGhkX3VzZXJfZGF0YSh2b2lkIF9fdXNlciAqdWQsIHZvaWQgKmRyLAogCQkJIGludCBzaXplLCBpbnQgc2V0KQogewogCWludCByYzsKQEAgLTEyMiw5ICsxMjIsOSBAQAogCX0KIAogCWlmIChzZXQpCi0JCXJjID0gY29weV90b191c2VyKCh2b2lkICopdWQsIGRyLCBzaXplKTsKKwkJcmMgPSBjb3B5X3RvX3VzZXIodWQsIGRyLCBzaXplKTsKIAllbHNlCi0JCXJjID0gY29weV9mcm9tX3VzZXIoZHIsICh2b2lkICopdWQsIHNpemUpOworCQlyYyA9IGNvcHlfZnJvbV91c2VyKGRyLCB1ZCwgc2l6ZSk7CiAKIAlpZiAocmMpIHsKIAkJQkNNTE9HX0VSUigiSW52YWxpZCBhcmdzIGZvciBjb21tYW5kXG4iKTsKQEAgLTE1Myw3ICsxNTMsOCBAQAogCiAJaW8tPmFkZF9jZGF0YV9zeiA9IG1fc3o7CiAJdWFfb2ZmID0gdWEgKyBzaXplb2YoaW8tPnVkYXRhKTsKLQlyYyA9IGNyeXN0YWxoZF91c2VyX2RhdGEodWFfb2ZmLCBpby0+YWRkX2NkYXRhLCBpby0+YWRkX2NkYXRhX3N6LCAwKTsKKwlyYyA9IGNyeXN0YWxoZF91c2VyX2RhdGEoKHZvaWQgX191c2VyICopdWFfb2ZmLCBpby0+YWRkX2NkYXRhLAorCQkJaW8tPmFkZF9jZGF0YV9zeiwgMCk7CiAJaWYgKHJjKSB7CiAJCUJDTUxPR19FUlIoImZhaWxlZCB0byBwdWxsIGFkZF9jZGF0YSBzejoleCB1YV9vZmY6JXhcbiIsCiAJCQkgICBpby0+YWRkX2NkYXRhX3N6LCAodW5zaWduZWQgaW50KXVhX29mZik7CkBAIC0xNzgsNyArMTc5LDcgQEAKIAogCWlmIChpby0+Y21kICE9IEJDTV9JT0NfRldfRE9XTkxPQUQpIHsKIAkJdWFfb2ZmID0gdWEgKyBzaXplb2YoaW8tPnVkYXRhKTsKLQkJcmMgPSBjcnlzdGFsaGRfdXNlcl9kYXRhKHVhX29mZiwgaW8tPmFkZF9jZGF0YSwKKwkJcmMgPSBjcnlzdGFsaGRfdXNlcl9kYXRhKCh2b2lkIF9fdXNlciAqKXVhX29mZiwgaW8tPmFkZF9jZGF0YSwKIAkJCQkJaW8tPmFkZF9jZGF0YV9zeiwgMSk7CiAJCWlmIChyYykgewogCQkJQkNNTE9HX0VSUigKQEAgLTIwOCw3ICsyMDksOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyYyA9IGNyeXN0YWxoZF91c2VyX2RhdGEodWEsICZpby0+dWRhdGEsIHNpemVvZihpby0+dWRhdGEpLCBzZXQpOworCXJjID0gY3J5c3RhbGhkX3VzZXJfZGF0YSgodm9pZCBfX3VzZXIgKil1YSwgJmlvLT51ZGF0YSwKKwkJCXNpemVvZihpby0+dWRhdGEpLCBzZXQpOwogCWlmIChyYykgewogCQlCQ01MT0dfRVJSKCJmYWlsZWQgdG8gJXMgaW9kYXRhXG4iLCAoc2V0ID8gInNldCIgOiAiZ2V0IikpOwogCQlyZXR1cm4gcmM7CkBAIC01NDYsOSArNTQ4LDEwIEBACiAJaW50IHJjOwogCWVudW0gQkNfU1RBVFVTIHN0cyA9IEJDX1NUU19TVUNDRVNTOwogCi0JQkNNTE9HKEJDTUxPR19EQkcsICJQQ0lfSU5GTzogVmVuZG9yOjB4JTA0eCBEZXZpY2U6MHglMDR4IHNfdmVuZG9yOjB4JTA0eCBzX2RldmljZTogMHglMDR4XG4iLAotCSAgICAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGRldi0+c3Vic3lzdGVtX3ZlbmRvciwKLQkgICAgICAgcGRldi0+c3Vic3lzdGVtX2RldmljZSk7CisJQkNNTE9HKEJDTUxPR19EQkcsCisJCSJQQ0lfSU5GTzogVmVuZG9yOjB4JTA0eCBEZXZpY2U6MHglMDR4IHNfdmVuZG9yOjB4JTA0eCBzX2RldmljZTogMHglMDR4XG4iLAorCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGRldi0+c3Vic3lzdGVtX3ZlbmRvciwKKwkJcGRldi0+c3Vic3lzdGVtX2RldmljZSk7CiAKIAlwaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcnlzdGFsaGRfYWRwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaW5mbykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmggYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguaAppbmRleCA4MTZlMWNkLi40OWUxZWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9sbnguaApAQCAtNTgsMTEgKzU4LDExIEBACiAKIAl1bnNpZ25lZCBsb25nCQlwY2lfbWVtX3N0YXJ0OwogCXVpbnQzMl90CQlwY2lfbWVtX2xlbjsKLQl2b2lkCQkJKmFkZHI7CisJdm9pZCBfX2lvbWVtCQkqYWRkcjsKIAogCXVuc2lnbmVkIGxvbmcJCXBjaV9pMm9fc3RhcnQ7CiAJdWludDMyX3QJCXBjaV9pMm9fbGVuOwotCXZvaWQJCQkqaTJvX2FkZHI7CisJdm9pZCBfX2lvbWVtCQkqaTJvX2FkZHI7CiAKIAl1bnNpZ25lZCBpbnQJCWRydl9kYXRhOwogCXVuc2lnbmVkIGludAkJZG1hYml0czsJLyogMzIgfCA2NCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5jCmluZGV4IGMzZDAyNDQuLjNhYWJmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmMKQEAgLTc0MCw3ICs3NDAsNyBAQAogCWRpby0+ZmJfc2l6ZSA9IHVidWZmX3N6ICYgMHgwMzsKIAlpZiAoZGlvLT5mYl9zaXplKSB7CiAJCXJlcyA9IGNvcHlfZnJvbV91c2VyKGRpby0+ZmJfdmEsCi0JCQkJICAgICAodm9pZCAqKSh1YWRkciArIGNvdW50IC0gZGlvLT5mYl9zaXplKSwKKwkJCQkgICAgICh2b2lkIF9fdXNlciAqKSh1YWRkciArIGNvdW50IC0gZGlvLT5mYl9zaXplKSwKIAkJCQkgICAgIGRpby0+ZmJfc2l6ZSk7CiAJCWlmIChyZXMpIHsKIAkJCUJDTUxPR19FUlIoImZhaWxlZCAlZCB0byBjb3B5ICV1IGZpbGwgYnl0ZXMgZnJvbSAlcFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuaAppbmRleCA3N2FiNzJhLi4wZjYzODI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5oCkBAIC0yMjUsNyArMjI1LDcgQEAKICNkZWZpbmUgQkNNTE9HX0VSUihmbXQsIGFyZ3MuLi4pCQkJCVwKIGRvIHsJCQkJCQkJCVwKIAlpZiAoZ19saW5rbG9nX2xldmVsICYgQkNNTE9HX0VSUk9SKQkJCVwKLQkJcHJpbnRrKEtFUk5fRVJSICIqRVJSKjolczolZDogImZtdCwJCVwKKwkJcHJfZXJyKCIqRVJSKjolczolZDogImZtdCwJCQlcCiAJCQkJX19GSUxFX18sIF9fTElORV9fLCAjI2FyZ3MpOwlcCiB9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9NYWtlZmlsZQppbmRleCAyZjIxN2U5Li5iODc5ZTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvTWFrZWZpbGUKQEAgLTQsNyArNCw2IEBACiBjY2ZsYWdzLXkgKz0gLURTQkVfSVNSX1RBU0tMRVQKIAogY3h0MWUxLXkgOj0gCVwKLSAgb3NzaVJlbGVhc2UubyAJXAogICBtdXN5Y2MubyAJCVwKICAgcG1jYzRfZHJ2Lm8gCQlcCiAgIGNvbWV0Lm8gCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0LmMKaW5kZXggYzRjOGMwZi4uNzAwNWFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXQuYwpAQCAtMjIsMTggKzIyLDIwIEBACiAjaW5jbHVkZSAiY29tZXQuaCIKICNpbmNsdWRlICJjb21ldF90YWJsZXMuaCIKIAotZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIAogI2RlZmluZSBDT01FVF9OVU1fU0FNUExFUyAgIDI0ICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgd2F2ZWZvcm0gdGFibGUgKi8KICNkZWZpbmUgQ09NRVRfTlVNX1VOSVRTICAgICA1ICAgLyogTnVtYmVyIG9mIHBvaW50cyBwZXIgZW50cnkgaW4gdGFibGUgKi8KIAogLyogZm9yd2FyZCByZWZlcmVuY2VzICovCiBzdGF0aWMgdm9pZCBTZXRQd3JMZXZlbChzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0KTsKLXN0YXRpYyB2b2lkIFdydFJjdkVxdWFsaXplclRibChjaV90ICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwgdV9pbnQzMl90ICp0YWJsZSk7Ci1zdGF0aWMgdm9pZCBXcnRYbXRXYXZlZm9ybVRibChjaV90ICpjaSwgc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCwgdV9pbnQ4X3QgdGFibGVbQ09NRVRfTlVNX1NBTVBMRVNdW0NPTUVUX05VTV9VTklUU10pOworc3RhdGljIHZvaWQgV3J0UmN2RXF1YWxpemVyVGJsKGNpX3QgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LAorCQkJCXVfaW50MzJfdCAqdGFibGUpOworc3RhdGljIHZvaWQgV3J0WG10V2F2ZWZvcm1UYmwoY2lfdCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsCisJCQkJdV9pbnQ4X3QgdGFibGVbQ09NRVRfTlVNX1NBTVBMRVNdCisJCQkJW0NPTUVUX05VTV9VTklUU10pOwogCiAKLXZvaWQgICAgICAgKlRXVl90YWJsZVsxMl0gPSB7CitzdGF0aWMgdm9pZCAqVFdWX3RhYmxlWzEyXSA9IHsKIAlUV1ZMb25nSGF1bDBEQiwgVFdWTG9uZ0hhdWw3XzVEQiwgVFdWTG9uZ0hhdWwxNURCLCBUV1ZMb25nSGF1bDIyXzVEQiwKIAlUV1ZTaG9ydEhhdWwwLCBUV1ZTaG9ydEhhdWwxLCBUV1ZTaG9ydEhhdWwyLCBUV1ZTaG9ydEhhdWwzLAogCVRXVlNob3J0SGF1bDQsIFRXVlNob3J0SGF1bDUsCkBAIC01MCw2ICs1Miw3IEBACiAJCWlmICh0MSkKIAkJCS8qIGRlZmF1bHQgVDEgd2F2ZWZvcm0gdGFibGUgKi8KIAkJCWxibyA9IENGR19MQk9fTEgwOworCiAJCWVsc2UKIAkJCS8qIGRlZmF1bHQgRTEgd2F2ZWZvcm0gdGFibGUgKi8KIAkJCWxibyA9IENGR19MQk9fRTEyMDsKQEAgLTU4LDggKzYxLDggQEAKIAlyZXR1cm4gbGJvIC0gMTsKIH0KIAotdm9pZCBpbml0X2NvbWV0KHZvaWQgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LCB1X2ludDMyX3QgcG9ydF9tb2RlLCBpbnQgY2xvY2ttYXN0ZXIsCi0JCXVfaW50OF90IG1vcmVQYXJhbXMpCit2b2lkIGluaXRfY29tZXQodm9pZCAqY2ksIHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQsIHVfaW50MzJfdCBwb3J0X21vZGUsCisJCWludCBjbG9ja21hc3RlciwgdV9pbnQ4X3QgbW9yZVBhcmFtcykKIHsKIAl1X2ludDhfdCBpc1QxbW9kZTsKIAkvKiBUMSBkZWZhdWx0ICovCkBAIC0xNDYsNyArMTQ5LDkgQEAKIAkgLyogdDFSQk9DIGVuYWJsZShCT0M6Qml0T3JpZW50ZWQgQ29kZSkgKi8KIAlwY2lfd3JpdGVfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPnQxX3Jib2NfZW5hLCAweDAwKTsKIAlpZiAoaXNUMW1vZGUpIHsKLQkJLyogSUJDRCBjZmc6IGFrYSBJbmJhbmQgQ29kZSBEZXRlY3Rpb24gKiogbG9vcGJhY2sgY29kZSBsZW5ndGggc2V0IHRvICovCisJCS8qIElCQ0QgY2ZnOiBha2EgSW5iYW5kIENvZGUgRGV0ZWN0aW9uICoqIGxvb3BiYWNrIGNvZGUgbGVuZ3RoCisJCSAqIHNldCB0bworCQkgKi8KIAkJLyogNiBiaXQgZG93biwgNSBiaXQgdXAgKGFzc2VydCkgKi8KIAkJcGNpX3dyaXRlXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5pYmNkX2NmZywgMHgwNCk7CiAJCS8qIGxpbmUgbG9vcGJhY2sgYWN0aXZhdGUgcGF0dGVybiAqLwpAQCAtMjg2LDcgKzI5MSw5IEBACiAgICAgLyogMHgzMDogIkJSSUYgY2ZnIjsgMHgyMCBpcyAnQ01PREUnLCAweDAzIGlzIChiaXQpIHJhdGUgKi8KICAgICAvKiBub3RlICJyYXRlIGJpdHMgY2FuIG9ubHkgYmUgc2V0IG9uY2UgYWZ0ZXIgcmVzZXQiICovCiAJaWYgKGNsb2NrbWFzdGVyKSB7Ci0JCS8qIENNT0RFID09IGNsb2NrTW9kZSwgMD1jbG9jayBtYXN0ZXIgKHNvIGFsbCAzIG90aGVycyBzaG91bGQgYmUgc2xhdmUpICovCisJCS8qIENNT0RFID09IGNsb2NrTW9kZSwgMD1jbG9jayBtYXN0ZXIKKwkJICogKHNvIGFsbCAzIG90aGVycyBzaG91bGQgYmUgc2xhdmUpCisJCSAqLwogCQkvKiByYXRlID0gMS41NDQgTWIvcyAqLwogCQlpZiAoaXNUMW1vZGUpCiAJCQkvKiBDb21ldCAwIE1hc3RlciBNb2RlKENNT0RFPTApICovCkBAIC0zOTgsNyArNDA1LDggQEAKICoqIFJldHVybnM6ICAgICBOb3RoaW5nCiAqLwogc3RhdGljIHZvaWQKLVdydFhtdFdhdmVmb3JtKGNpX3QgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LCB1X2ludDMyX3Qgc2FtcGxlLCB1X2ludDMyX3QgdW5pdCwgdV9pbnQ4X3QgZGF0YSkKK1dydFhtdFdhdmVmb3JtKGNpX3QgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LCB1X2ludDMyX3Qgc2FtcGxlLAorCQl1X2ludDMyX3QgdW5pdCwgdV9pbnQ4X3QgZGF0YSkKIHsKIAl1X2ludDhfdCAgICBXYXZlZm9ybUFkZHI7CiAKQEAgLTQ0Nyw3ICs0NTUsNyBAQAogV3J0UmN2RXF1YWxpemVyVGJsKGNpX3QgKmNpLCBzdHJ1Y3Qgc19jb21ldF9yZWcgKmNvbWV0LCB1X2ludDMyX3QgKnRhYmxlKQogewogCXVfaW50MzJfdCAgIHJhbWFkZHI7Ci0Jdm9sYXRpbGUgdV9pbnQzMl90IHZhbHVlOworCXVfaW50MzJfdCB2YWx1ZTsKIAogCWZvciAocmFtYWRkciA9IDA7IHJhbWFkZHIgPCAyNTY7IHJhbWFkZHIrKykgewogCQkvKioqIHRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIHBlciBFcnJhdGEgNywgMi41ICoqKi8KQEAgLTUxNSw3ICs1MjMsNyBAQAogc3RhdGljIHZvaWQKIFNldFB3ckxldmVsKHN0cnVjdCBzX2NvbWV0X3JlZyAqY29tZXQpCiB7Ci0Jdm9sYXRpbGUgdV9pbnQzMl90IHRlbXA7CisJdV9pbnQzMl90IHRlbXA7CiAKIC8qCiAqKiAgICBBbGdvcml0aG0gdG8gQmFsYW5jZSB0aGUgUG93ZXIgRGlzdHJpYnV0aW9uIG9mIFR0aXAgVHJpbmcKQEAgLTU1NywxNyArNTY1LDIxIEBACiBzdGF0aWMgdm9pZAogU2V0Q29tZXRPcHMoc3RydWN0IHNfY29tZXRfcmVnICpjb21ldCkKIHsKLQl2b2xhdGlsZSB1X2ludDhfdCByZF92YWx1ZTsKKwl1X2ludDhfdCByZF92YWx1ZTsKIAogCWlmIChjb21ldCA9PSBtQ29uZmlnLkM0RnVuYzFCYXNlICsgKENPTUVUMF9PRkZTRVQgPj4gMikpIHsKIAkJLyogcmVhZCB0aGUgQlJJRiBDb25maWd1cmF0aW9uICovCi0JCXJkX3ZhbHVlID0gKHVfaW50OF90KSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9jZmcpOworCQlyZF92YWx1ZSA9ICh1X2ludDhfdCkgcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKQorCQkJCSZjb21ldC0+YnJpZl9jZmcpOwogCQlyZF92YWx1ZSAmPSB+MHgyMDsKLQkJcGNpX3dyaXRlXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5icmlmX2NmZywgKHVfaW50MzJfdCkgcmRfdmFsdWUpOworCQlwY2lfd3JpdGVfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPmJyaWZfY2ZnLAorCQkJCSh1X2ludDMyX3QpIHJkX3ZhbHVlKTsKIAkJLyogcmVhZCB0aGUgQlJJRiBGcmFtZSBQdWxzZSBDb25maWd1cmF0aW9uICovCi0JCXJkX3ZhbHVlID0gKHVfaW50OF90KSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9mcGNmZyk7CisJCXJkX3ZhbHVlID0gKHVfaW50OF90KSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopCisJCQkJJmNvbWV0LT5icmlmX2ZwY2ZnKTsKIAkJcmRfdmFsdWUgJj0gfjB4MjA7Ci0JCXBjaV93cml0ZV8zMigodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9mcGNmZywgKHVfaW50OF90KSByZF92YWx1ZSk7CisJCXBjaV93cml0ZV8zMigodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9mcGNmZywKKwkJCQkodV9pbnQ4X3QpIHJkX3ZhbHVlKTsKIAl9IGVsc2UgewogCS8qIHJlYWQgdGhlIEJSSUYgQ29uZmlndXJhdGlvbiAqLwogCXJkX3ZhbHVlID0gKHVfaW50OF90KSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9jZmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldF90YWJsZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXRfdGFibGVzLmMKaW5kZXggODQ5MzExMS4uZTk2NjY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldF90YWJsZXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0X3RhYmxlcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiY29tZXRfdGFibGVzLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvZnVuY3Rpb25zLmMKaW5kZXggOTUyMThlMi4uZWU5ZDM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCkBAIC0yNSw3ICsyNSw4IEBACiAjaW5jbHVkZSAicG1jYzQuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX1NCRV9IRExDX1Y3KSB8fCBkZWZpbmVkKENPTkZJR19TQkVfV0FOMjU2VDNfSERMQ19WNykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NCRV9IRExDX1Y3X01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfU0JFX1dBTjI1NlQzX0hETENfVjdfTU9EVUxFKQorZGVmaW5lZChDT05GSUdfU0JFX0hETENfVjdfTU9EVUxFKSB8fCBcCitkZWZpbmVkKENPTkZJR19TQkVfV0FOMjU2VDNfSERMQ19WN19NT0RVTEUpCiAjZGVmaW5lIF92N19oZGxjXyAgMQogI2Vsc2UKICNkZWZpbmUgX3Y3X2hkbGNfICAwCkBAIC0zMyw5ICszNCw5IEBACiAKICNpZiBfdjdfaGRsY18KICNkZWZpbmUgVjcoeCkgKHggIyMgX3Y3KQotZXh0ZXJuIGludCAgaGRsY19uZXRpZl9yeF92NyAoaGRsY19kZXZpY2UgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci1leHRlcm4gaW50ICByZWdpc3Rlcl9oZGxjX2RldmljZV92NyAoaGRsY19kZXZpY2UgKik7Ci1leHRlcm4gaW50ICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3IChoZGxjX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIGhkbGNfbmV0aWZfcnhfdjcoaGRsY19kZXZpY2UgKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gaW50ICByZWdpc3Rlcl9oZGxjX2RldmljZV92NyhoZGxjX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2VfdjcoaGRsY19kZXZpY2UgKik7CiAKICNlbHNlCiAjZGVmaW5lIFY3KHgpIHgKQEAgLTQ3LDU1ICs0OCw1NCBAQAogCiAjZW5kaWYKIAotZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7CiAKIAogI2lmIDEKIHVfaW50MzJfdAotcGNpX3JlYWRfMzIgKHVfaW50MzJfdCAqcCkKK3BjaV9yZWFkXzMyKHVfaW50MzJfdCAqcCkKIHsKICNpZmRlZiBGTE9XX0RFQlVHCi0gICAgdV9pbnQzMl90ICAgdjsKKwl1X2ludDMyX3QgICB2OwogCi0gICAgRkxVU0hfUENJX1JFQUQgKCk7Ci0gICAgdiA9IGxlMzJfdG9fY3B1ICgqcCk7Ci0gICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQotICAgICAgICBwcl9pbmZvKCJwY2lfcmVhZCA6ICV4ID0gJXhcbiIsICh1X2ludDMyX3QpIHAsIHYpOwotICAgIHJldHVybiB2OworCUZMVVNIX1BDSV9SRUFEKCk7CisJdiA9IGxlMzJfdG9fY3B1KCpwKTsKKwlpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisJCXByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CisJcmV0dXJuIHY7CiAjZWxzZQotICAgIEZMVVNIX1BDSV9SRUFEICgpOyAgICAgICAgICAgICAgLyogKi8KLSAgICByZXR1cm4gbGUzMl90b19jcHUgKCpwKTsKKwlGTFVTSF9QQ0lfUkVBRCgpOyAgICAgICAgICAgICAgLyogKi8KKwlyZXR1cm4gbGUzMl90b19jcHUoKnApOwogI2VuZGlmCiB9CiAKIHZvaWQKLXBjaV93cml0ZV8zMiAodV9pbnQzMl90ICpwLCB1X2ludDMyX3QgdikKK3BjaV93cml0ZV8zMih1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCi0gICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CisJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorCQlwcl9pbmZvKCJwY2lfd3JpdGU6ICV4ID0gJXhcbiIsICh1X2ludDMyX3QpIHAsIHYpOwogI2VuZGlmCi0gICAgKnAgPSBjcHVfdG9fbGUzMiAodik7Ci0gICAgRkxVU0hfUENJX1dSSVRFICgpOyAgICAgICAgICAgICAvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gcm91dGluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIGRvIG11bHRpcGxlIHJlZ2lzdGVyIHdyaXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggdGhlbXNlbHZlcyBuZWVkIGZsdXNoaW5nIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdyaXRlcyBpbiBvcmRlciB0byBndWFyYW50ZWUgd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yZGVyaW5nLiAgSXQgaXMgbGVzcyBjb2RlLWN1bWJlcnNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGZsdXNoIGhlcmUtaW4gdGhlbiB0byBpbnZlc3RpZ2F0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGNvZGUgdGhlIG1hbnkgb3RoZXIgcmVnaXN0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdyaXRpbmcgcm91dGluZXMuICovCisJKnAgPSBjcHVfdG9fbGUzMiAodik7CisJRkxVU0hfUENJX1dSSVRFKCk7ICAgICAgICAgICAgIC8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSByb3V0aW5lcworCQkJCQkqIHdoaWNoIGRvIG11bHRpcGxlIHJlZ2lzdGVyIHdyaXRlcworCQkJCQkqIHdoaWNoIHRoZW1zZWx2ZXMgbmVlZCBmbHVzaGluZyBiZXR3ZWVuCisJCQkJCSogd3JpdGVzIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB3cml0ZQorCQkJCQkqIG9yZGVyaW5nLiAgSXQgaXMgbGVzcyBjb2RlLWN1bWJlcnNvbWUKKwkJCQkJKiB0byBmbHVzaCBoZXJlLWluIHRoZW4gdG8gaW52ZXN0aWdhdGUKKwkJCQkJKiBhbmQgY29kZSB0aGUgbWFueSBvdGhlciByZWdpc3RlcgorCQkJCQkqIHdyaXRpbmcgcm91dGluZXMuICovCiB9CiAjZW5kaWYKIAogCiB2b2lkCi1wY2lfZmx1c2hfd3JpdGUgKGNpX3QgKmNpKQorcGNpX2ZsdXNoX3dyaXRlKGNpX3QgKmNpKQogewotICAgIHZvbGF0aWxlIHVfaW50MzJfdCB2OworCXZvbGF0aWxlIHVfaW50MzJfdCB2OwogCiAgICAgLyogaXNzdWUgYSBQQ0kgcmVhZCB0byBmbHVzaCBQQ0kgd3JpdGUgdGhydSBicmlkZ2UgKi8KLSAgICB2ID0gKih1X2ludDMyX3QgKikgJmNpLT5yZWctPmdsY2Q7ICAvKiBhbnkgYWRkcmVzcyB3b3VsZCBkbyAqLworCXYgPSAqKHVfaW50MzJfdCAqKSAmY2ktPnJlZy0+Z2xjZDsgIC8qIGFueSBhZGRyZXNzIHdvdWxkIGRvICovCiAKICAgICAvKgogICAgICAqIHJldHVybiBub3RoaW5nLCB0aGlzIGp1c3QgcmVhZHMgUENJIGJyaWRnZSBpbnRlcmZhY2UgdG8gZmx1c2gKQEAgLTEwNSw1NSArMTA1LDUzIEBACiAKIAogc3RhdGljIHZvaWQKLXdhdGNoZG9nX2Z1bmMgKHVuc2lnbmVkIGxvbmcgYXJnKQord2F0Y2hkb2dfZnVuYyh1bnNpZ25lZCBsb25nIGFyZykKIHsKLSAgICBzdHJ1Y3Qgd2F0Y2hkb2cgKndkID0gKHZvaWQgKikgYXJnOworCXN0cnVjdCB3YXRjaGRvZyAqd2QgPSAodm9pZCAqKSBhcmc7CiAKLSAgICBpZiAoZHJ2cl9zdGF0ZSAhPSBTQkVfRFJWUl9BVkFJTEFCTEUpCi0gICAgewotICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBkcnZyIG5vdCBhdmFpbGFibGUgKCV4KVxuIiwgX19mdW5jX18sIGRydnJfc3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNjaGVkdWxlX3dvcmsgKCZ3ZC0+d29yayk7Ci0gICAgbW9kX3RpbWVyICgmd2QtPmgsIGppZmZpZXMgKyB3ZC0+dGlja3MpOworCWlmIChkcnZyX3N0YXRlICE9IFNCRV9EUlZSX0FWQUlMQUJMRSkgeworCQlpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKwkJCXByX3dhcm5pbmcoIiVzOiBkcnZyIG5vdCBhdmFpbGFibGUgKCV4KVxuIiwKKwkJCQkgICBfX2Z1bmNfXywgZHJ2cl9zdGF0ZSk7CisJCXJldHVybjsKKwl9CisJc2NoZWR1bGVfd29yaygmd2QtPndvcmspOworCW1vZF90aW1lcigmd2QtPmgsIGppZmZpZXMgKyB3ZC0+dGlja3MpOwogfQogCi1pbnQgT1NfaW5pdF93YXRjaGRvZyhzdHJ1Y3Qgd2F0Y2hkb2cgKndkcCwgdm9pZCAoKmYpICh2b2lkICopLCB2b2lkICpjLCBpbnQgdXNlYykKK2ludCBPU19pbml0X3dhdGNoZG9nKHN0cnVjdCB3YXRjaGRvZyAqd2RwLCB2b2lkICgqZikgKHZvaWQgKiksCisJCSAgICAgdm9pZCAqYywgaW50IHVzZWMpCiB7Ci0gICAgd2RwLT5mdW5jID0gZjsKLSAgICB3ZHAtPnNvZnRjID0gYzsKLSAgICB3ZHAtPnRpY2tzID0gKEhaKSAqICh1c2VjIC8gMTAwMCkgLyAxMDAwOwotICAgIElOSVRfV09SSygmd2RwLT53b3JrLCAodm9pZCAqKWYpOwotICAgIGluaXRfdGltZXIgKCZ3ZHAtPmgpOwotICAgIHsKLSAgICAgICAgY2lfdCAgICAgICAqY2kgPSAoY2lfdCAqKSBjOworCXdkcC0+ZnVuYyA9IGY7CisJd2RwLT5zb2Z0YyA9IGM7CisJd2RwLT50aWNrcyA9IChIWikgKiAodXNlYyAvIDEwMDApIC8gMTAwMDsKKwlJTklUX1dPUksoJndkcC0+d29yaywgKHZvaWQgKilmKTsKKwlpbml0X3RpbWVyKCZ3ZHAtPmgpOworCXsKKwkJY2lfdCAgICAgICAqY2kgPSAoY2lfdCAqKSBjOwogCi0gICAgICAgIHdkcC0+aC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZjaS0+d2Q7Ci0gICAgfQotICAgIHdkcC0+aC5mdW5jdGlvbiA9IHdhdGNoZG9nX2Z1bmM7Ci0gICAgcmV0dXJuIDA7CisJCXdkcC0+aC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZjaS0+d2Q7CisJfQorCXdkcC0+aC5mdW5jdGlvbiA9IHdhdGNoZG9nX2Z1bmM7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQKLU9TX3V3YWl0IChpbnQgdXNlYywgY2hhciAqZGVzY3JpcHRpb24pCitPU191d2FpdChpbnQgdXNlYywgY2hhciAqZGVzY3JpcHRpb24pCiB7Ci0gICAgaW50ICAgICAgICAgdG1wOworCWludCAgICAgICAgIHRtcDsKIAotICAgIGlmICh1c2VjID49IDEwMDApCi0gICAgewotICAgICAgICBtZGVsYXkgKHVzZWMgLyAxMDAwKTsKLSAgICAgICAgLyogbm93IGRlbGF5IHJlc2lkdWFsICovCi0gICAgICAgIHRtcCA9ICh1c2VjIC8gMTAwMCkgKiAxMDAwOyAvKiByb3VuZCAqLwotICAgICAgICB0bXAgPSB1c2VjIC0gdG1wOyAgICAgICAgICAgLyogcmVzaWR1YWwgKi8KLSAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdhaXQgb24gcmVzaWR1YWwgKi8KLSAgICAgICAgICAgIHVkZWxheSAodG1wKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgdWRlbGF5ICh1c2VjKTsKLSAgICB9CisJaWYgKHVzZWMgPj0gMTAwMCkgeworCQltZGVsYXkodXNlYyAvIDEwMDApOworCQkvKiBub3cgZGVsYXkgcmVzaWR1YWwgKi8KKwkJdG1wID0gKHVzZWMgLyAxMDAwKSAqIDEwMDA7IC8qIHJvdW5kICovCisJCXRtcCA9IHVzZWMgLSB0bXA7ICAgICAgICAgICAvKiByZXNpZHVhbCAqLworCQlpZiAodG1wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2FpdCBvbiByZXNpZHVhbCAqLworCQkJdWRlbGF5KHRtcCk7CisJCX0KKwl9IGVsc2UgeworCQl1ZGVsYXkodXNlYyk7CisJfQogfQogCiAvKiBkdW1teSBzaG9ydCBkZWxheSByb3V0aW5lIGNhbGxlZCBhcyBhIHN1YnJvdXRpbmUgc28gdGhhdCBjb21waWxlcgpAQCAtMTYxLDk2ICsxNTksOTUgQEAKICAqLwogCiB2b2lkCi1PU191d2FpdF9kdW1teSAodm9pZCkKK09TX3V3YWl0X2R1bW15KHZvaWQpCiB7CiAjaWZuZGVmIFVTRV9NQVhfSU5UX0RFTEFZCi0gICAgZHVtbXkrKzsKKwlkdW1teSsrOwogI2Vsc2UKLSAgICB1ZGVsYXkgKDEpOworCXVkZWxheSgxKTsKICNlbmRpZgogfQogCiAKIHZvaWQKLU9TX3NlbV9pbml0ICh2b2lkICpzZW0sIGludCBzdGF0ZSkKK09TX3NlbV9pbml0KHZvaWQgKnNlbSwgaW50IHN0YXRlKQogewotICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgewotICAgICAgICBjYXNlIFNFTV9UQUtFTjoKLQkJc2VtYV9pbml0KChzdHJ1Y3Qgc2VtYXBob3JlICopIHNlbSwgMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0VNX0FWQUlMQUJMRToKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTRU1fVEFLRU46CisJICAgIHNlbWFfaW5pdCgoc3RydWN0IHNlbWFwaG9yZSAqKSBzZW0sIDApOworCSAgICBicmVhazsKKwljYXNlIFNFTV9BVkFJTEFCTEU6CiAJICAgIHNlbWFfaW5pdCgoc3RydWN0IHNlbWFwaG9yZSAqKSBzZW0sIDEpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgc2V0IHNlbS5jb3VudCB0byBzdGF0ZSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZSAqLwotICAgICAgICBzZW1hX2luaXQgKHNlbSwgc3RhdGUpOwotICAgICAgICBicmVhazsKLSAgICB9CisJICAgIGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBzZXQgc2VtLmNvdW50IHRvIHN0YXRlJ3MKKwkJCQkJKiB2YWx1ZSAqLworCSAgICBzZW1hX2luaXQoc2VtLCBzdGF0ZSk7CisJICAgIGJyZWFrOworCX0KIH0KIAogCiBpbnQKLXNkX2xpbmVfaXNfb2sgKHZvaWQgKnVzZXIpCitzZF9saW5lX2lzX29rKHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOwogCi0gICAgcmV0dXJuIG5ldGlmX2NhcnJpZXJfb2sgKG5kZXYpOworCXJldHVybiBuZXRpZl9jYXJyaWVyX29rKG5kZXYpOwogfQogCiB2b2lkCi1zZF9saW5lX2lzX3VwICh2b2lkICp1c2VyKQorc2RfbGluZV9pc191cCh2b2lkICp1c2VyKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKIAotICAgIG5ldGlmX2NhcnJpZXJfb24gKG5kZXYpOwotICAgIHJldHVybjsKKwluZXRpZl9jYXJyaWVyX29uKG5kZXYpOworCXJldHVybjsKIH0KIAogdm9pZAotc2RfbGluZV9pc19kb3duICh2b2lkICp1c2VyKQorc2RfbGluZV9pc19kb3duKHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOwogCi0gICAgbmV0aWZfY2Fycmllcl9vZmYgKG5kZXYpOwotICAgIHJldHVybjsKKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKwlyZXR1cm47CiB9CiAKIHZvaWQKLXNkX2Rpc2FibGVfeG1pdCAodm9pZCAqdXNlcikKK3NkX2Rpc2FibGVfeG1pdCh2b2lkICp1c2VyKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CiAKLSAgICBuZXRpZl9zdG9wX3F1ZXVlIChkZXYpOwotICAgIHJldHVybjsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuOwogfQogCiB2b2lkCi1zZF9lbmFibGVfeG1pdCAodm9pZCAqdXNlcikKK3NkX2VuYWJsZV94bWl0KHZvaWQgKnVzZXIpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgdXNlcjsKIAotICAgIG5ldGlmX3dha2VfcXVldWUgKGRldik7Ci0gICAgcmV0dXJuOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47CiB9CiAKIGludAotc2RfcXVldWVfc3RvcHBlZCAodm9pZCAqdXNlcikKK3NkX3F1ZXVlX3N0b3BwZWQodm9pZCAqdXNlcikKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSB1c2VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHVzZXI7CiAKLSAgICByZXR1cm4gbmV0aWZfcXVldWVfc3RvcHBlZCAobmRldik7CisJcmV0dXJuIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmRldik7CiB9CiAKIHZvaWQgc2RfcmVjdl9jb25zdW1lKHZvaWQgKnRva2VuLCBzaXplX3QgbGVuLCB2b2lkICp1c2VyKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gdXNlcjsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdG9rZW47CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB1c2VyOworCXN0cnVjdCBza19idWZmICpza2IgPSB0b2tlbjsKIAotICAgIHNrYi0+ZGV2ID0gbmRldjsKLSAgICBza2JfcHV0IChza2IsIGxlbik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIG5kZXYpOwotICAgIG5ldGlmX3J4KHNrYik7CisJc2tiLT5kZXYgPSBuZGV2OworCXNrYl9wdXQoc2tiLCBsZW4pOworCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBuZGV2KTsKKwluZXRpZl9yeChza2IpOwogfQogCiAKQEAgLTI2Myw4NiArMjYwLDc2IEBACiAKIGV4dGVybiBjaV90ICpDSTsgICAgICAgICAgICAgICAgLyogZHVtbXkgcG9pbnRlciB0byBib2FyZCBaRVJPJ3MgZGF0YSAqLwogdm9pZAotVk1FVFJPX1RSQUNFICh2b2lkICp4KQorVk1FVFJPX1RSSUdHRVIoY2lfdCAqY2ksIGludCB4KQogewotICAgIHVfaW50MzJfdCAgIHkgPSAodV9pbnQzMl90KSB4OworCXN0cnVjdCBzX2NvbWV0X3JlZyAgICAqY29tZXQ7CisJdm9sYXRpbGUgdV9pbnQzMl90IGRhdGE7CiAKLSAgICBwY2lfd3JpdGVfMzIgKCh1X2ludDMyX3QgKikgJkNJLT5jcGxkYmFzZS0+bGVkcywgeSk7Ci19CisJY29tZXQgPSBjaS0+cG9ydFswXS5jb21ldGJhc2U7ICAvKiBkZWZhdWx0IHRvIENPTUVUICMgMCAqLwogCi0KLXZvaWQKLVZNRVRST19UUklHR0VSIChjaV90ICpjaSwgaW50IHgpCi17Ci0gICAgc3RydWN0IHNfY29tZXRfcmVnICAgICpjb21ldDsKLSAgICB2b2xhdGlsZSB1X2ludDMyX3QgZGF0YTsKLQotICAgIGNvbWV0ID0gY2ktPnBvcnRbMF0uY29tZXRiYXNlOyAgLyogZGVmYXVsdCB0byBDT01FVCAjIDAgKi8KLQotICAgIHN3aXRjaCAoeCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjQpOyAgICAgLyogMHg5MCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjUpOyAgICAgLyogMHg5NCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjYpOyAgICAgLyogMHg5OCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjcpOyAgICAgLyogMHg5QyAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzODgpOyAgICAgLyogMHgyMjAgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczg5KTsgICAgIC8qIDB4MjI0ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM4QSk7ICAgICAvKiAweDIyOCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzOEIpOyAgICAgLyogMHgyMkMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0EwKTsgICAgIC8qIDB4MjgwICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgOToKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBMSk7ICAgICAvKiAweDI4NCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDEwOgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0EyKTsgICAgIC8qIDB4Mjg4ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTE6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTMpOyAgICAgLyogMHgyOEMgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNCk7ICAgICAvKiAweDI5MCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDEzOgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0E1KTsgICAgIC8qIDB4Mjk0ICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTQ6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTYpOyAgICAgLyogMHgyOTggKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNToKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNyk7ICAgICAvKiAweDI5QyAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc0KTsgICAgIC8qIDB4MUQwICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc6Ci0gICAgICAgIGRhdGEgPSBwY2lfcmVhZF8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzUpOyAgICAgLyogMHgxRDQgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODoKLSAgICAgICAgZGF0YSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM3Nik7ICAgICAvKiAweDFEOCAqLwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE5OgotICAgICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc3KTsgICAgIC8qIDB4MURDICovCi0gICAgICAgIGJyZWFrOwotICAgIH0KKwlzd2l0Y2ggKHgpIHsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3JlczI0KTsgICAgIC8qIDB4OTAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzMjUpOyAgICAgLyogMHg5NCAqLworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXMyNik7ICAgICAvKiAweDk4ICovCisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3JlczI3KTsgICAgIC8qIDB4OUMgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzODgpOyAgICAgLyogMHgyMjAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzODkpOyAgICAgLyogMHgyMjQgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzOEEpOyAgICAgLyogMHgyMjggKi8KKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzOEIpOyAgICAgLyogMHgyMkMgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA4OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTApOyAgICAgLyogMHgyODAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSA5OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTEpOyAgICAgLyogMHgyODQgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxMDoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0EyKTsgICAgIC8qIDB4Mjg4ICovCisJICAgIGJyZWFrOworCWNhc2UgMTE6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBMyk7ICAgICAvKiAweDI4QyAqLworCSAgICBicmVhazsKKwljYXNlIDEyOgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTQpOyAgICAgLyogMHgyOTAgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxMzoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlc0E1KTsgICAgIC8qIDB4Mjk0ICovCisJICAgIGJyZWFrOworCWNhc2UgMTQ6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXNBNik7ICAgICAvKiAweDI5OCAqLworCSAgICBicmVhazsKKwljYXNlIDE1OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzQTcpOyAgICAgLyogMHgyOUMgKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxNjoKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc0KTsgICAgIC8qIDB4MUQwICovCisJICAgIGJyZWFrOworCWNhc2UgMTc6CisJICAgIGRhdGEgPSBwY2lfcmVhZF8zMigodV9pbnQzMl90ICopICZjb21ldC0+X19yZXM3NSk7ICAgICAvKiAweDFENCAqLworCSAgICBicmVhazsKKwljYXNlIDE4OgorCSAgICBkYXRhID0gcGNpX3JlYWRfMzIoKHVfaW50MzJfdCAqKSAmY29tZXQtPl9fcmVzNzYpOyAgICAgLyogMHgxRDggKi8KKwkgICAgYnJlYWs7CisJY2FzZSAxOToKKwkgICAgZGF0YSA9IHBjaV9yZWFkXzMyKCh1X2ludDMyX3QgKikgJmNvbWV0LT5fX3Jlczc3KTsgICAgIC8qIDB4MURDICovCisJICAgIGJyZWFrOworCX0KIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2h3cHJvYmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jCmluZGV4IDAyYjRmOGYuLjliNDE5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jCkBAIC0zMSwzNjAgKzMxLDM1MiBAQAogI2luY2x1ZGUgInNiZXByb2MuaCIKICNlbmRpZgogCi1leHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZXJyb3JfZmxhZzsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7CiAKIC8qIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotdm9pZCAgICAgICAgYzRfc3RvcHdkIChjaV90ICopOwotc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYzRfYWRkX2RldiAoaGR3X2luZm9fdCAqLCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCwgaW50KTsKK3ZvaWQgICAgICAgIGM0X3N0b3B3ZChjaV90ICopOworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYzRfYWRkX2RldihoZHdfaW5mb190ICosIGludCwgdW5zaWduZWQgbG9uZywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nLCBpbnQsIGludCk7CiAKIAogc3RydWN0IHNfaGR3X2luZm8gaGR3X2luZm9bTUFYX0JPQVJEU107CiAKIAotdm9pZCAgICAgICAgX19pbml0Ci1zaG93X3R3byAoaGR3X2luZm9fdCAqaGksIGludCBicmRubykKK3ZvaWQgX19pbml0CitzaG93X3R3byhoZHdfaW5mb190ICpoaSwgaW50IGJyZG5vKQogewotICAgIGNpX3QgICAgICAgKmNpOwotICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2OwotICAgIGNoYXIgICAgICAgKmJpZDsKLSAgICBjaGFyICAgICAgICpicCwgYmFubmVyWzgwXTsKLSAgICBjaGFyICAgICAgICBzbls2XTsKKwljaV90ICAgICAgICpjaTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwljaGFyICAgICAgICpiaWQ7CisJY2hhciAgICAgICBiYW5uZXJbODBdOworCWNoYXIJc25bNl0gPSB7MCx9OwogCi0gICAgYnAgPSBiYW5uZXI7Ci0gICAgbWVtc2V0IChiYW5uZXIsIDAsIDgwKTsgICAgICAgICAvKiBjbGVhciBwcmludCBidWZmZXIgKi8KKwljaSA9IChjaV90ICopKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7CisJYmlkID0gc2JlaWRfZ2V0X2JkbmFtZShjaSk7CisJc3dpdGNoIChoaS0+cHJvbWZtdCkgeworCWNhc2UgUFJPTV9GT1JNQVRfVFlQRTE6CisJCW1lbWNweShzbiwgaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsLCA2KTsKKwkJYnJlYWs7CisJY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKKwkJbWVtY3B5KHNuLCBoaS0+bWZnX2luZm8ucGZ0Mi5TZXJpYWwsIDYpOworCQlicmVhazsKKwl9CiAKLSAgICBjaSA9IChjaV90ICopKG5ldGRldl9wcml2KGhpLT5uZGV2KSk7Ci0gICAgYmlkID0gc2JlaWRfZ2V0X2JkbmFtZSAoY2kpOwotICAgIHN3aXRjaCAoaGktPnByb21mbXQpCi0gICAgewotICAgIGNhc2UgUFJPTV9GT1JNQVRfVFlQRTE6Ci0gICAgICAgIG1lbWNweSAoc24sIChGTERfVFlQRTEgKikgKGhpLT5tZmdfaW5mby5wZnQxLlNlcmlhbCksIDYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBST01fRk9STUFUX1RZUEUyOgotICAgICAgICBtZW1jcHkgKHNuLCAoRkxEX1RZUEUyICopIChoaS0+bWZnX2luZm8ucGZ0Mi5TZXJpYWwpLCA2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbWVtc2V0IChzbiwgMCwgNik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwlzcHJpbnRmKGJhbm5lciwgIiVzOiAlcyAgUy9OICUwNlgsIE1VU1lDQyBSZXYgJTAyWCIsCisJCWhpLT5kZXZuYW1lLCBiaWQsCisJCSgoc25bM10gPDwgMTYpICYgMHhmZjAwMDApIHwKKwkJKChzbls0XSA8PCA4KSAmIDB4MDBmZjAwKSB8CisJCShzbls1XSAmIDB4MDAwMGZmKSwKKwkJKHVfaW50OF90KSBoaS0+cmV2aWRbMF0pOwogCi0gICAgc3ByaW50ZiAoYmFubmVyLCAiJXM6ICVzICBTL04gJTA2WCwgTVVTWUNDIFJldiAlMDJYIiwKLSAgICAgICAgICAgICBoaS0+ZGV2bmFtZSwgYmlkLAotICAgICAgICAgICAgICgoc25bM10gPDwgMTYpICYgMHhmZjAwMDApIHwKLSAgICAgICAgICAgICAgKChzbls0XSA8PCA4KSAmIDB4MDBmZjAwKSB8Ci0gICAgICAgICAgICAgIChzbls1XSAmIDB4MDAwMGZmKSwKLSAgICAgICAgICAgICAodV9pbnQ4X3QpIGhpLT5yZXZpZFswXSk7CisJcHJfaW5mbygiJXNcbiIsIGJhbm5lcik7CiAKLSAgICBwcl9pbmZvKCIlc1xuIiwgYmFubmVyKTsKKwlwZGV2ID0gaGktPnBkZXZbMF07CisJcHJfaW5mbygiJXM6ICVzIGF0IHYvcD0lbHgvJWx4ICglMDJ4OiUwMnguJXgpIGlycSAlZFxuIiwKKwkJaGktPmRldm5hbWUsICJNVVNZQ0MiLAorCQkodW5zaWduZWQgbG9uZykgaGktPmFkZHJfbWFwcGVkWzBdLCBoaS0+YWRkclswXSwKKwkJaGktPnBjaV9idXNubywgKHVfaW50OF90KSBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCisJCSh1X2ludDhfdCkgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOwogCi0gICAgcGRldiA9IGhpLT5wZGV2WzBdOwotICAgIHByX2luZm8oIiVzOiAlcyBhdCB2L3A9JWx4LyVseCAoJTAyeDolMDJ4LiV4KSBpcnEgJWRcbiIsCi0gICAgICAgICAgICBoaS0+ZGV2bmFtZSwgIk1VU1lDQyIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZykgaGktPmFkZHJfbWFwcGVkWzBdLCBoaS0+YWRkclswXSwKLSAgICAgICAgICAgIGhpLT5wY2lfYnVzbm8sICh1X2ludDhfdCkgUENJX1NMT1QgKHBkZXYtPmRldmZuKSwKLSAgICAgICAgICAgICh1X2ludDhfdCkgUENJX0ZVTkMgKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKTsKLQotICAgIHBkZXYgPSBoaS0+cGRldlsxXTsKLSAgICBwcl9pbmZvKCIlczogJXMgYXQgdi9wPSVseC8lbHggKCUwMng6JTAyeC4leCkgaXJxICVkXG4iLAotICAgICAgICAgICAgaGktPmRldm5hbWUsICJFQlVTICAiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSwgaGktPmFkZHJbMV0sCi0gICAgICAgICAgICBoaS0+cGNpX2J1c25vLCAodV9pbnQ4X3QpIFBDSV9TTE9UIChwZGV2LT5kZXZmbiksCi0gICAgICAgICAgICAodV9pbnQ4X3QpIFBDSV9GVU5DIChwZGV2LT5kZXZmbiksIHBkZXYtPmlycSk7CisJcGRldiA9IGhpLT5wZGV2WzFdOworCXByX2luZm8oIiVzOiAlcyBhdCB2L3A9JWx4LyVseCAoJTAyeDolMDJ4LiV4KSBpcnEgJWRcbiIsCisJCWhpLT5kZXZuYW1lLCAiRUJVUyAgIiwKKwkJKHVuc2lnbmVkIGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSwgaGktPmFkZHJbMV0sCisJCWhpLT5wY2lfYnVzbm8sICh1X2ludDhfdCkgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAorCQkodV9pbnQ4X3QpIFBDSV9GVU5DKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKTsKIH0KIAogCi12b2lkICAgICAgICBfX2luaXQKLWhkd19zbl9nZXQgKGhkd19pbmZvX3QgKmhpLCBpbnQgYnJkbm8pCit2b2lkIF9faW5pdAoraGR3X3NuX2dldChoZHdfaW5mb190ICpoaSwgaW50IGJyZG5vKQogewotICAgIC8qIG9idGFpbiBoYXJkd2FyZSBFRVBST00gaW5mb3JtYXRpb24gKi8KLSAgICBsb25nICAgICAgICBhZGRyOworCS8qIG9idGFpbiBoYXJkd2FyZSBFRVBST00gaW5mb3JtYXRpb24gKi8KKwlsb25nICAgICAgICBhZGRyOwogCi0gICAgYWRkciA9IChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMV0gKyBFRVBST01fT0ZGU0VUOworCWFkZHIgPSAobG9uZykgaGktPmFkZHJfbWFwcGVkWzFdICsgRUVQUk9NX09GRlNFVDsKIAotICAgIC8qIHJlYWQgRUVQUk9NIHdpdGggbGFyZ2VzdCBrbm93biBmb3JtYXQgc2l6ZS4uLiAqLwotICAgIHBtY19lZXByb21fcmVhZF9idWZmZXIgKGFkZHIsIDAsIChjaGFyICopIGhpLT5tZmdfaW5mby5kYXRhLCBzaXplb2YgKEZMRF9UWVBFMikpOworCS8qIHJlYWQgRUVQUk9NIHdpdGggbGFyZ2VzdCBrbm93biBmb3JtYXQgc2l6ZS4uLiAqLworCXBtY19lZXByb21fcmVhZF9idWZmZXIoYWRkciwgMCwgKGNoYXIgKiloaS0+bWZnX2luZm8uZGF0YSwKKwkJCSAgICAgICBzaXplb2YoRkxEX1RZUEUyKSk7CiAKICNpZiAwCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyICp1Y3AgPSAodW5zaWduZWQgY2hhciAqKSAmaGktPm1mZ19pbmZvLmRhdGE7CisJeworCQl1bnNpZ25lZCBjaGFyICp1Y3AgPSAodW5zaWduZWQgY2hhciAqKSAmaGktPm1mZ19pbmZvLmRhdGE7CiAKLSAgICAgICAgcHJfaW5mbygiZWVwcm9tWzAwXTogICUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0gICAgICAgICAgICAgICAgKih1Y3AgKyAwKSwgKih1Y3AgKyAxKSwgKih1Y3AgKyAyKSwgKih1Y3AgKyAzKSwgKih1Y3AgKyA0KSwgKih1Y3AgKyA1KSwgKih1Y3AgKyA2KSwgKih1Y3AgKyA3KSk7Ci0gICAgICAgIHByX2luZm8oImVlcHJvbVswOF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotICAgICAgICAgICAgICAgICoodWNwICsgOCksICoodWNwICsgOSksICoodWNwICsgMTApLCAqKHVjcCArIDExKSwgKih1Y3AgKyAxMiksICoodWNwICsgMTMpLCAqKHVjcCArIDE0KSwgKih1Y3AgKyAxNSkpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bMTZdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDE2KSwgKih1Y3AgKyAxNyksICoodWNwICsgMTgpLCAqKHVjcCArIDE5KSwgKih1Y3AgKyAyMCksICoodWNwICsgMjEpLCAqKHVjcCArIDIyKSwgKih1Y3AgKyAyMykpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bMjRdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDI0KSwgKih1Y3AgKyAyNSksICoodWNwICsgMjYpLCAqKHVjcCArIDI3KSwgKih1Y3AgKyAyOCksICoodWNwICsgMjkpLCAqKHVjcCArIDMwKSwgKih1Y3AgKyAzMSkpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bMzJdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDMyKSwgKih1Y3AgKyAzMyksICoodWNwICsgMzQpLCAqKHVjcCArIDM1KSwgKih1Y3AgKyAzNiksICoodWNwICsgMzcpLCAqKHVjcCArIDM4KSwgKih1Y3AgKyAzOSkpOwotICAgICAgICBwcl9pbmZvKCJlZXByb21bNDBdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLSAgICAgICAgICAgICAgICAqKHVjcCArIDQwKSwgKih1Y3AgKyA0MSksICoodWNwICsgNDIpLCAqKHVjcCArIDQzKSwgKih1Y3AgKyA0NCksICoodWNwICsgNDUpLCAqKHVjcCArIDQ2KSwgKih1Y3AgKyA0NykpOwotICAgIH0KKwkJcHJfaW5mbygiZWVwcm9tWzAwXTogICUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkqKHVjcCArIDApLCAqKHVjcCArIDEpLCAqKHVjcCArIDIpLCAqKHVjcCArIDMpLAorCQkJKih1Y3AgKyA0KSwgKih1Y3AgKyA1KSwgKih1Y3AgKyA2KSwgKih1Y3AgKyA3KSk7CisJCXByX2luZm8oImVlcHJvbVswOF06ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJKih1Y3AgKyA4KSwgKih1Y3AgKyA5KSwgKih1Y3AgKyAxMCksICoodWNwICsgMTEpLAorCQkJKih1Y3AgKyAxMiksICoodWNwICsgMTMpLCAqKHVjcCArIDE0KSwgKih1Y3AgKyAxNSkpOworCQlwcl9pbmZvKCJlZXByb21bMTZdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgMTYpLCAqKHVjcCArIDE3KSwgKih1Y3AgKyAxOCksICoodWNwICsgMTkpLAorCQkJKih1Y3AgKyAyMCksICoodWNwICsgMjEpLCAqKHVjcCArIDIyKSwgKih1Y3AgKyAyMykpOworCQlwcl9pbmZvKCJlZXByb21bMjRdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgMjQpLCAqKHVjcCArIDI1KSwgKih1Y3AgKyAyNiksICoodWNwICsgMjcpLAorCQkJKih1Y3AgKyAyOCksICoodWNwICsgMjkpLCAqKHVjcCArIDMwKSwgKih1Y3AgKyAzMSkpOworCQlwcl9pbmZvKCJlZXByb21bMzJdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgMzIpLCAqKHVjcCArIDMzKSwgKih1Y3AgKyAzNCksICoodWNwICsgMzUpLAorCQkJKih1Y3AgKyAzNiksICoodWNwICsgMzcpLCAqKHVjcCArIDM4KSwgKih1Y3AgKyAzOSkpOworCQlwcl9pbmZvKCJlZXByb21bNDBdOiAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSoodWNwICsgNDApLCAqKHVjcCArIDQxKSwgKih1Y3AgKyA0MiksICoodWNwICsgNDMpLAorCQkJKih1Y3AgKyA0NCksICoodWNwICsgNDUpLCAqKHVjcCArIDQ2KSwgKih1Y3AgKyA0NykpOworCX0KICNlbmRpZgogI2lmIDAKLSAgICBwcl9pbmZvKCJzbjogJXggJXggJXggJXggJXggJXhcbiIsCi0gICAgICAgICAgICBoaS0+bWZnX2luZm8uU2VyaWFsWzBdLAotICAgICAgICAgICAgaGktPm1mZ19pbmZvLlNlcmlhbFsxXSwKLSAgICAgICAgICAgIGhpLT5tZmdfaW5mby5TZXJpYWxbMl0sCi0gICAgICAgICAgICBoaS0+bWZnX2luZm8uU2VyaWFsWzNdLAotICAgICAgICAgICAgaGktPm1mZ19pbmZvLlNlcmlhbFs0XSwKLSAgICAgICAgICAgIGhpLT5tZmdfaW5mby5TZXJpYWxbNV0pOworCXByX2luZm8oInNuOiAleCAleCAleCAleCAleCAleFxuIiwKKwkJCWhpLT5tZmdfaW5mby5TZXJpYWxbMF0sCisJCQloaS0+bWZnX2luZm8uU2VyaWFsWzFdLAorCQkJaGktPm1mZ19pbmZvLlNlcmlhbFsyXSwKKwkJCWhpLT5tZmdfaW5mby5TZXJpYWxbM10sCisJCQloaS0+bWZnX2luZm8uU2VyaWFsWzRdLAorCQkJaGktPm1mZ19pbmZvLlNlcmlhbFs1XSk7CiAjZW5kaWYKIAotICAgIGlmICgoaGktPnByb21mbXQgPSBwbWNfdmVyaWZ5X2Nrc3VtICgmaGktPm1mZ19pbmZvLmRhdGEpKSA9PSBQUk9NX0ZPUk1BVF9VbmspCi0gICAgewotICAgICAgICAvKiBiYWQgY3JjLCBkYXRhIGlzIHN1c3BlY3QgKi8KLSAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCi0gICAgICAgICAgICBwcl9pbmZvKCIlczogRUVQUk9NIGNrc3VtIGVycm9yXG4iLCBoaS0+ZGV2bmFtZSk7Ci0gICAgICAgIGhpLT5tZmdfaW5mb19zdHMgPSBFRVBST01fQ1JDRVJSOwotICAgIH0gZWxzZQotICAgICAgICBoaS0+bWZnX2luZm9fc3RzID0gRUVQUk9NX09LOworCWhpLT5wcm9tZm10ID0gcG1jX3ZlcmlmeV9ja3N1bSgmaGktPm1mZ19pbmZvLmRhdGEpOworCWlmIChoaS0+cHJvbWZtdCA9PSBQUk9NX0ZPUk1BVF9VbmspIHsKKwkJLyogYmFkIGNyYywgZGF0YSBpcyBzdXNwZWN0ICovCisJCWlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQorCQkJcHJfaW5mbygiJXM6IEVFUFJPTSBja3N1bSBlcnJvclxuIiwgaGktPmRldm5hbWUpOworCQloaS0+bWZnX2luZm9fc3RzID0gRUVQUk9NX0NSQ0VSUjsKKwl9IGVsc2UKKwkJaGktPm1mZ19pbmZvX3N0cyA9IEVFUFJPTV9PSzsKIH0KIAogCi12b2lkICAgICAgICBfX2luaXQKLXByZXBfaGR3X2luZm8gKHZvaWQpCisJdm9pZCBfX2luaXQKK3ByZXBfaGR3X2luZm8odm9pZCkKIHsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBpbnQgICAgICAgICBpOworCWhkd19pbmZvX3QgKmhpOworCWludCAgICAgICAgIGk7CiAKLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaGktPnBjaV9idXNubyA9IDB4ZmY7Ci0gICAgICAgIGhpLT5wY2lfc2xvdCA9IDB4ZmY7Ci0gICAgICAgIGhpLT5wY2lfcGluWzBdID0gMDsKLSAgICAgICAgaGktPnBjaV9waW5bMV0gPSAwOwotICAgICAgICBoaS0+bmRldiA9IE5VTEw7Ci0gICAgICAgIGhpLT5hZGRyWzBdID0gMEw7Ci0gICAgICAgIGhpLT5hZGRyWzFdID0gMEw7Ci0gICAgICAgIGhpLT5hZGRyX21hcHBlZFswXSA9IDBMOwotICAgICAgICBoaS0+YWRkcl9tYXBwZWRbMV0gPSAwTDsKLSAgICB9CisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQloaS0+cGNpX2J1c25vID0gMHhmZjsKKwkJaGktPnBjaV9zbG90ID0gMHhmZjsKKwkJaGktPnBjaV9waW5bMF0gPSAwOworCQloaS0+cGNpX3BpblsxXSA9IDA7CisJCWhpLT5uZGV2ID0gTlVMTDsKKwkJaGktPmFkZHJbMF0gPSAwTDsKKwkJaGktPmFkZHJbMV0gPSAwTDsKKwkJaGktPmFkZHJfbWFwcGVkWzBdID0gMEw7CisJCWhpLT5hZGRyX21hcHBlZFsxXSA9IDBMOworCX0KIH0KIAogdm9pZAotY2xlYW51cF9pb3JlbWFwICh2b2lkKQorY2xlYW51cF9pb3JlbWFwKHZvaWQpCiB7Ci0gICAgaGR3X2luZm9fdCAqaGk7Ci0gICAgaW50ICAgICAgICAgaTsKKwloZHdfaW5mb190ICpoaTsKKwlpbnQgICAgICAgICBpOwogCi0gICAgZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChoaS0+cGNpX3Nsb3QgPT0gMHhmZikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoaGktPmFkZHJfbWFwcGVkWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICBpb3VubWFwICgodm9pZCAqKSAoaGktPmFkZHJfbWFwcGVkWzBdKSk7Ci0gICAgICAgICAgICByZWxlYXNlX21lbV9yZWdpb24gKChsb25nKSBoaS0+YWRkclswXSwgaGktPmxlblswXSk7Ci0gICAgICAgICAgICBoaS0+YWRkcl9tYXBwZWRbMF0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoaS0+YWRkcl9tYXBwZWRbMV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlvdW5tYXAgKCh2b2lkICopIChoaS0+YWRkcl9tYXBwZWRbMV0pKTsKLSAgICAgICAgICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoKGxvbmcpIGhpLT5hZGRyWzFdLCBoaS0+bGVuWzFdKTsKLSAgICAgICAgICAgIGhpLT5hZGRyX21hcHBlZFsxXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9CisJZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykgeworCQlpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYpCisJCQlicmVhazsKKwkJaWYgKGhpLT5hZGRyX21hcHBlZFswXSkgeworCQkJaW91bm1hcCgodm9pZCAqKShoaS0+YWRkcl9tYXBwZWRbMF0pKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbigobG9uZykgaGktPmFkZHJbMF0sIGhpLT5sZW5bMF0pOworCQkJaGktPmFkZHJfbWFwcGVkWzBdID0gMDsKKwkJfQorCQlpZiAoaGktPmFkZHJfbWFwcGVkWzFdKSB7CisJCQlpb3VubWFwKCh2b2lkICopKGhpLT5hZGRyX21hcHBlZFsxXSkpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKChsb25nKSBoaS0+YWRkclsxXSwgaGktPmxlblsxXSk7CisJCQloaS0+YWRkcl9tYXBwZWRbMV0gPSAwOworCQl9CisJfQogfQogCiAKIHZvaWQKLWNsZWFudXBfZGV2cyAodm9pZCkKK2NsZWFudXBfZGV2cyh2b2lkKQogewotICAgIGhkd19pbmZvX3QgKmhpOwotICAgIGludCAgICAgICAgIGk7CisJaGR3X2luZm9fdCAqaGk7CisJaW50ICAgICAgICAgaTsKIAotICAgIGZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspCi0gICAgewotICAgICAgICBpZiAoaGktPnBjaV9zbG90ID09IDB4ZmYgfHwgIWhpLT5uZGV2KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGM0X3N0b3B3ZChuZXRkZXZfcHJpdihoaS0+bmRldikpOworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmIHx8ICFoaS0+bmRldikKKwkJCWJyZWFrOworCQljNF9zdG9wd2QobmV0ZGV2X3ByaXYoaGktPm5kZXYpKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgICAgICBzYmVjb21fcHJvY19icmRfY2xlYW51cChuZXRkZXZfcHJpdihoaS0+bmRldikpOworCQlzYmVjb21fcHJvY19icmRfY2xlYW51cChuZXRkZXZfcHJpdihoaS0+bmRldikpOwogI2VuZGlmCi0gICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2IChoaS0+bmRldik7Ci0gICAgICAgIGZyZWVfaXJxIChoaS0+cGRldlswXS0+aXJxLCBoaS0+bmRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGhpLT5uZGV2KTsKKwkJZnJlZV9pcnEoaGktPnBkZXZbMF0tPmlycSwgaGktPm5kZXYpOwogI2lmZGVmIENPTkZJR19TQkVfUE1DQzRfTkNPTU0KLSAgICAgICAgZnJlZV9pcnEgKGhpLT5wZGV2WzFdLT5pcnEsIGhpLT5uZGV2KTsKKwkJZnJlZV9pcnEoaGktPnBkZXZbMV0tPmlycSwgaGktPm5kZXYpOwogI2VuZGlmCi0gICAgICAgIE9TX2tmcmVlIChoaS0+bmRldik7Ci0gICAgfQorCQlPU19rZnJlZShoaS0+bmRldik7CisJfQogfQogCiAKIHN0YXRpYyBpbnQgIF9faW5pdAotYzRfaGR3X2luaXQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZm91bmQpCitjNF9oZHdfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGZvdW5kKQogewotICAgIGhkd19pbmZvX3QgKmhpOwotICAgIGludCAgICAgICAgIGk7Ci0gICAgaW50ICAgICAgICAgZnVuLCBzbG90OwotICAgIHVuc2lnbmVkIGNoYXIgYnVzbm8gPSAweGZmOworCWhkd19pbmZvX3QgKmhpOworCWludCAgICAgICAgIGk7CisJaW50ICAgICAgICAgZnVuLCBzbG90OworCXVuc2lnbmVkIGNoYXIgYnVzbm8gPSAweGZmOwogCi0gICAgLyogb3VyIE1VU1lDQyBjaGlwIHN1cHBvcnRzIHR3byBmdW5jdGlvbnMsIDAgJiAxICovCi0gICAgaWYgKChmdW4gPSBQQ0lfRlVOQyAocGRldi0+ZGV2Zm4pKSA+IDEpCi0gICAgewotICAgICAgICBwcl93YXJuaW5nKCJ1bmV4cGVjdGVkIGRldmZ1bjogMHgleFxuIiwgcGRldi0+ZGV2Zm4pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBkZXYtPmJ1cykgICAgICAgICAgICAgICAgICAvKiBvYnRhaW4gYnVzIG51bWJlciAqLwotICAgICAgICBidXNubyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwotICAgIGVsc2UKLSAgICAgICAgYnVzbm8gPSAwOyAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgZm9yIHN5c3RlbSBQQ0kgaW5jb25zaXN0ZW5jeSAqLwotICAgIHNsb3QgPSBwZGV2LT5kZXZmbiAmIH4weDA3OworCS8qIG91ciBNVVNZQ0MgY2hpcCBzdXBwb3J0cyB0d28gZnVuY3Rpb25zLCAwICYgMSAqLworCWZ1biA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKwlpZiAoZnVuID4gMSkgeworCQlwcl93YXJuaW5nKCJ1bmV4cGVjdGVkIGRldmZ1bjogMHgleFxuIiwgcGRldi0+ZGV2Zm4pOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAvKgotICAgICAqIEZ1bmN0aW9ucyAwICYgMSBmb3IgYSBnaXZlbiBib2FyZCAoaWRlbnRpZmllZCBieSBzYW1lIGJ1cyhidXNubykgYW5kCi0gICAgICogc2xvdChzbG90KSkgYXJlIHBsYWNlZCBpbnRvIHRoZSBzYW1lICdoYXJkd2FyZScgc3RydWN0dXJlLiAgVGhlIGZpcnN0Ci0gICAgICogcGFydCBvZiB0aGUgYm9hcmQncyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgcGxhY2VkIGludG8gYW4gdW5wb3B1bGF0ZWQKLSAgICAgKiBlbGVtZW50LCBpZGVudGlmaWVkIGJ5ICJzbG90PT0oMHhmZikiLiAgVGhlIHNlY29uZCBwYXJ0IG9mIGEgYm9hcmQncwotICAgICAqIGZ1bmN0aW9uYWxpdHkgd2lsbCBtYXRjaCB0aGUgcHJldmlvdXNseSBsb2FkZWQgc2xvdC9idXNuby4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogbWF0Y2ggd2l0aCBib2FyZCdzIGZpcnN0IGZvdW5kIGludGVyZmFjZSwgb3RoZXJ3aXNlIHRoaXMgaXMgZmlyc3QKLSAgICAgICAgICogZm91bmQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgoaGktPnBjaV9zbG90ID09IDB4ZmYpIHx8ICAgLyogbmV3IGJvYXJkICovCi0gICAgICAgICAgICAoKGhpLT5wY2lfc2xvdCA9PSBzbG90KSAmJiAoaGktPmJ1cyA9PSBwZGV2LT5idXMpKSkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIGZvci1sb29wIGV4aXQgKi8KLSAgICB9Ci0gICAgaWYgKGkgPT0gTUFYX0JPQVJEUykgICAgICAgICAgICAvKiBubyBtYXRjaCBpbiBhYm92ZSBsb29wIG1lYW5zIE1BWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZXhjZWVkZWQgKi8KLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoImV4Y2VlZGVkIG51bWJlciBvZiBhbGxvd2VkIGRldmljZXMgKD4lZCk/XG4iLCBNQVhfQk9BUkRTKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChwZGV2LT5idXMpCi0gICAgICAgIGhpLT5wY2lfYnVzbm8gPSBwZGV2LT5idXMtPm51bWJlcjsKLSAgICBlbHNlCi0gICAgICAgIGhpLT5wY2lfYnVzbm8gPSAwOyAgICAgICAgICAvKiBkZWZhdWx0IGZvciBzeXN0ZW0gUENJIGluY29uc2lzdGVuY3kgKi8KLSAgICBoaS0+cGNpX3Nsb3QgPSBzbG90OwotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlIChwZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJmhpLT5wY2lfcGluW2Z1bl0pOwotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlIChwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZoaS0+cmV2aWRbZnVuXSk7Ci0gICAgaGktPmJ1cyA9IHBkZXYtPmJ1czsKLSAgICBoaS0+YWRkcltmdW5dID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKLSAgICBoaS0+bGVuW2Z1bl0gPSBwY2lfcmVzb3VyY2VfZW5kIChwZGV2LCAwKSAtIGhpLT5hZGRyW2Z1bl0gKyAxOwotICAgIGhpLT5wZGV2W2Z1bl0gPSBwZGV2OworCS8qIG9idGFpbiBidXMgbnVtYmVyICovCisJaWYgKHBkZXYtPmJ1cykKKwkJYnVzbm8gPSBwZGV2LT5idXMtPm51bWJlcjsKKwllbHNlCisJCWJ1c25vID0gMDsgLyogZGVmYXVsdCBmb3Igc3lzdGVtIFBDSSBpbmNvbnNpc3RlbmN5ICovCisJc2xvdCA9IHBkZXYtPmRldmZuICYgfjB4MDc7CiAKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIGNyZWF0ZSBkZXZpY2UgbmFtZSBmcm9tIG1vZHVsZSBuYW1lLCBwbHVzIGFkZCB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICogYm9hcmQgbnVtYmVyCi0gICAgICAgICAqLwotICAgICAgICBjaGFyICAgICAgICpjcCA9IGhpLT5kZXZuYW1lOworCS8qCisJICogRnVuY3Rpb25zIDAgJiAxIGZvciBhIGdpdmVuIGJvYXJkIChpZGVudGlmaWVkIGJ5IHNhbWUgYnVzKGJ1c25vKSBhbmQKKwkgKiBzbG90KHNsb3QpKSBhcmUgcGxhY2VkIGludG8gdGhlIHNhbWUgJ2hhcmR3YXJlJyBzdHJ1Y3R1cmUuICBUaGUgZmlyc3QKKwkgKiBwYXJ0IG9mIHRoZSBib2FyZCdzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBwbGFjZWQgaW50byBhbiB1bnBvcHVsYXRlZAorCSAqIGVsZW1lbnQsIGlkZW50aWZpZWQgYnkgInNsb3Q9PSgweGZmKSIuICBUaGUgc2Vjb25kIHBhcnQgb2YgYSBib2FyZCdzCisJICogZnVuY3Rpb25hbGl0eSB3aWxsIG1hdGNoIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBzbG90L2J1c25vLgorCSAqLworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJLyoKKwkJICogbWF0Y2ggd2l0aCBib2FyZCdzIGZpcnN0IGZvdW5kIGludGVyZmFjZSwgb3RoZXJ3aXNlIHRoaXMgaXMKKwkJICogZmlzcnQgZm91bmQKKwkJICovCisJCWlmICgoaGktPnBjaV9zbG90ID09IDB4ZmYpIHx8ICAgLyogbmV3IGJvYXJkICovCisJCSAgICAoKGhpLT5wY2lfc2xvdCA9PSBzbG90KSAmJiAoaGktPmJ1cyA9PSBwZGV2LT5idXMpKSkKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIGZvci1sb29wIGV4aXQgKi8KKwl9CiAKLSAgICAgICAgc3RyY3B5IChjcCwgS0JVSUxEX01PRE5BTUUpOwotICAgICAgICBjcCArPSBzdHJsZW4gKGNwKTsgICAgICAgICAgLyogcmVwb3NpdGlvbiAqLwotICAgICAgICAqY3ArKyA9ICctJzsKLSAgICAgICAgKmNwKysgPSAnMCcgKyAoZm91bmQgLyAyKTsgIC8qIHRoZXJlIGFyZSB0d28gZm91bmQgaW50ZXJmYWNlcyBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkICovCi0gICAgICAgICpjcCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGlvbiAqLwotICAgIH0KKwkvKiBubyBtYXRjaCBpbiBhYm92ZSBsb29wIG1lYW5zIE1BWCBleGNlZWRlZCAqLworCWlmIChpID09IE1BWF9CT0FSRFMpIHsKKwkJcHJfd2FybmluZygiZXhjZWVkZWQgbnVtYmVyIG9mIGFsbG93ZWQgZGV2aWNlcyAoPiVkKT9cbiIsCisJCQkgICBNQVhfQk9BUkRTKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgcmV0dXJuIDE7CisJaWYgKHBkZXYtPmJ1cykKKwkJaGktPnBjaV9idXNubyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCWVsc2UKKwkJaGktPnBjaV9idXNubyA9IDA7IC8qIGRlZmF1bHQgZm9yIHN5c3RlbSBQQ0kgaW5jb25zaXN0ZW5jeSAqLworCisJaGktPnBjaV9zbG90ID0gc2xvdDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJmhpLT5wY2lfcGluW2Z1bl0pOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmhpLT5yZXZpZFtmdW5dKTsKKwloaS0+YnVzID0gcGRldi0+YnVzOworCWhpLT5hZGRyW2Z1bl0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaGktPmxlbltmdW5dID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCAwKSAtIGhpLT5hZGRyW2Z1bl0gKyAxOworCWhpLT5wZGV2W2Z1bl0gPSBwZGV2OworCisJeworCQkvKgorCQkgKiBjcmVhdGUgZGV2aWNlIG5hbWUgZnJvbSBtb2R1bGUgbmFtZSwgcGx1cyBhZGQgdGhlIGFwcHJvcHJpYXRlCisJCSAqIGJvYXJkIG51bWJlcgorCQkgKi8KKwkJY2hhciAgICAgICAqY3AgPSBoaS0+ZGV2bmFtZTsKKworCQlzdHJjcHkoY3AsIEtCVUlMRF9NT0ROQU1FKTsKKwkJY3AgKz0gc3RybGVuKGNwKTsgICAgICAgICAgLyogcmVwb3NpdGlvbiAqLworCQkqY3ArKyA9ICctJzsKKwkJKmNwKysgPSAnMCcgKyAoZm91bmQgLyAyKTsgIC8qIHRoZXJlIGFyZSB0d28gZm91bmQgaW50ZXJmYWNlcyBwZXIKKwkJKiBib2FyZCAqLworCQkqY3AgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRpb24gKi8KKwl9CisKKwlyZXR1cm4gMTsKIH0KIAotCi1zdGF0dXNfdCAgICBfX2luaXQKLWM0aHdfYXR0YWNoX2FsbCAodm9pZCkKK3N0YXR1c190IF9faW5pdAorYzRod19hdHRhY2hfYWxsKHZvaWQpCiB7Ci0gICAgaGR3X2luZm9fdCAqaGk7Ci0gICAgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotICAgIGludCAgICAgICAgIGZvdW5kID0gMCwgaSwgajsKKwloZHdfaW5mb190ICpoaTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50ICAgICAgICAgZm91bmQgPSAwLCBpLCBqOwogCi0gICAgZXJyb3JfZmxhZyA9IDA7Ci0gICAgcHJlcF9oZHdfaW5mbyAoKTsKLSAgICAvKioqIHNjYW4gUENJIGJ1cyBmb3IgYWxsIHBvc3NpYmxlIGJvYXJkcyAqLwotICAgIHdoaWxlICgocGRldiA9IHBjaV9nZXRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX0NPTkVYQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9DTjg0NzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGV2KSkpCi0gICAgewotICAgICAgICBpZiAoYzRfaGR3X2luaXQgKHBkZXYsIGZvdW5kKSkKLSAgICAgICAgICAgIGZvdW5kKys7Ci0gICAgfQotICAgIGlmICghZm91bmQpCi0gICAgewotICAgICAgICBwcl93YXJuaW5nKCJObyBib2FyZHMgZm91bmRcbiIpOwotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgLyogc2FuaXR5IGNoZWNrIGZvciBjb25zaXN0ZW50IGhhcmR3YXJlIGZvdW5kICovCi0gICAgZm9yIChpID0gMCwgaGkgPSBoZHdfaW5mbzsgaSA8IE1BWF9CT0FSRFM7IGkrKywgaGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChoaS0+cGNpX3Nsb3QgIT0gMHhmZiAmJiAoIWhpLT5hZGRyWzBdIHx8ICFoaS0+YWRkclsxXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBzb21ldGhpbmcgdmVyeSB3cm9uZyB3aXRoIHBjaV9nZXRfZGV2aWNlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBoaS0+ZGV2bmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBicmluZyBib2FyZCdzIG1lbW9yeSByZWdpb25zIG9uL2xpbmUgKi8KLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgIHsKLQkgICAgaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdLCBoaS0+ZGV2bmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IG1lbW9yeSBpbiB1c2UsIGFkZHI9MHglbHgsIGxlbj0weCVseCA/XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGktPmRldm5hbWUsIGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdKTsKLSAgICAgICAgICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoaS0+YWRkcl9tYXBwZWRbal0gPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcCAoaGktPmFkZHJbal0sIGhpLT5sZW5bal0pOwotICAgICAgICAgICAgaWYgKCFoaS0+YWRkcl9tYXBwZWRbal0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IGlvcmVtYXAgZmFpbHMsIGFkZHI9MHglbHgsIGxlbj0weCVseCA/XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGktPmRldm5hbWUsIGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdKTsKLSAgICAgICAgICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICB9CisJZXJyb3JfZmxhZyA9IDA7CisJcHJlcF9oZHdfaW5mbygpOworCS8qKiogc2NhbiBQQ0kgYnVzIGZvciBhbGwgcG9zc2libGUgYm9hcmRzICovCisJd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9DT05FWEFOVCwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX0NOODQ3NCwKKwkJCQkgICAgICBwZGV2KSkpIHsKKwkJaWYgKGM0X2hkd19pbml0KHBkZXYsIGZvdW5kKSkKKwkJCWZvdW5kKys7CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlwcl93YXJuaW5nKCJObyBib2FyZHMgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgZm9yIGNvbnNpc3RlbnQgaGFyZHdhcmUgZm91bmQgKi8KKwlmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKSB7CisJCWlmIChoaS0+cGNpX3Nsb3QgIT0gMHhmZiAmJiAoIWhpLT5hZGRyWzBdIHx8ICFoaS0+YWRkclsxXSkpIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBzb21ldGhpbmcgdmVyeSB3cm9uZyB3aXRoIHBjaV9nZXRfZGV2aWNlXG4iLAorCQkJCSAgIGhpLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCS8qIGJyaW5nIGJvYXJkJ3MgbWVtb3J5IHJlZ2lvbnMgb24vbGluZSAqLworCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQorCQkJYnJlYWs7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGhpLT5hZGRyW2pdLCBoaS0+bGVuW2pdLCBoaS0+ZGV2bmFtZSkpIHsKKwkJCQlwcl93YXJuaW5nKCIlczogbWVtb3J5IGluIHVzZSwgYWRkcj0weCVseCwgbGVuPTB4JWx4ID9cbiIsCisJCQkJCSAgIGhpLT5kZXZuYW1lLCBoaS0+YWRkcltqXSwgaGktPmxlbltqXSk7CisJCQkJY2xlYW51cF9pb3JlbWFwKCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisKKwkJCWhpLT5hZGRyX21hcHBlZFtqXSA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoaGktPmFkZHJbal0sIGhpLT5sZW5bal0pOworCQkJaWYgKCFoaS0+YWRkcl9tYXBwZWRbal0pIHsKKwkJCQlwcl93YXJuaW5nKCIlczogaW9yZW1hcCBmYWlscywgYWRkcj0weCVseCwgbGVuPTB4JWx4ID9cbiIsCisJCQkJCSAgIGhpLT5kZXZuYW1lLCBoaS0+YWRkcltqXSwgaGktPmxlbltqXSk7CisJCQkJY2xlYW51cF9pb3JlbWFwKCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CiAjaWZkZWYgU0JFX01BUF9ERUJVRwotICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IGlvIHJlbWFwcGVkIGZyb20gcGh5cyAleCB0byB2aXJ0ICV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICBoaS0+ZGV2bmFtZSwgKHVfaW50MzJfdCkgaGktPmFkZHJbal0sICh1X2ludDMyX3QpIGhpLT5hZGRyX21hcHBlZFtqXSk7CisJCQlwcl93YXJuaW5nKCIlczogaW8gcmVtYXBwZWQgZnJvbSBwaHlzICV4IHRvIHZpcnQgJXhcbiIsCisJCQkJICAgaGktPmRldm5hbWUsICh1X2ludDMyX3QpIGhpLT5hZGRyW2pdLAorCQkJCSAgICh1X2ludDMyX3QpIGhpLT5hZGRyX21hcHBlZFtqXSk7CiAjZW5kaWYKLSAgICAgICAgfQotICAgIH0KKwkJfQorCX0KIAotICAgIGRydnJfc3RhdGUgPSBTQkVfRFJWUl9BVkFJTEFCTEU7CisJZHJ2cl9zdGF0ZSA9IFNCRV9EUlZSX0FWQUlMQUJMRTsKIAotICAgIC8qIEhhdmUgbm93IG1lbW9yeSBtYXBwZWQgYWxsIGJvYXJkcy4gIE5vdyBhbGxvdyBib2FyZCdzIGFjY2VzcyB0byBzeXN0ZW0gKi8KLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5wY2lfc2xvdCA9PSAweGZmKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZSAoaGktPnBkZXZbMF0pIHx8Ci0gICAgICAgICAgICBwY2lfZW5hYmxlX2RldmljZSAoaGktPnBkZXZbMV0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBkcnZyX3N0YXRlID0gU0JFX0RSVlJfRE9XTjsKLSAgICAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGNhcmQgJWQgc2xvdCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaGktPmRldm5hbWUsIGksIGhpLT5wY2lfc2xvdCk7Ci0gICAgICAgICAgICBjbGVhbnVwX2RldnMgKCk7Ci0gICAgICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKCk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgfQotICAgICAgICBwY2lfc2V0X21hc3RlciAoaGktPnBkZXZbMF0pOwotICAgICAgICBwY2lfc2V0X21hc3RlciAoaGktPnBkZXZbMV0pOwotICAgICAgICBpZiAoIShoaS0+bmRldiA9IGM0X2FkZF9kZXYgKGhpLCBpLCAobG9uZykgaGktPmFkZHJfbWFwcGVkWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGktPnBkZXZbMF0tPmlycSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaS0+cGRldlsxXS0+aXJxKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRydnJfc3RhdGUgPSBTQkVfRFJWUl9ET1dOOwotICAgICAgICAgICAgY2xlYW51cF9pb3JlbWFwICgpOwotICAgICAgICAgICAgLyogTk9URTogYzRfYWRkX2RldigpIGRvZXMgaXRzIG93biBkZXZpY2UgY2xlYW51cCAqLworCS8qIEhhdmUgbm93IG1lbW9yeSBtYXBwZWQgYWxsIGJvYXJkcy4gIE5vdyBhbGxvdyBib2FyZCdzIGFjY2VzcyB0byBzeXN0ZW0gKi8KKwlmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKSB7CisJCWlmIChoaS0+cGNpX3Nsb3QgPT0gMHhmZikKKwkJCWJyZWFrOworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoaGktPnBkZXZbMF0pIHx8CisJCSAgICBwY2lfZW5hYmxlX2RldmljZShoaS0+cGRldlsxXSkpIHsKKwkJCWRydnJfc3RhdGUgPSBTQkVfRFJWUl9ET1dOOworCQkJcHJfd2FybmluZygiJXM6IGZhaWxlZCB0byBlbmFibGUgY2FyZCAlZCBzbG90ICVkXG4iLAorCQkJCSAgIGhpLT5kZXZuYW1lLCBpLCBoaS0+cGNpX3Nsb3QpOworCQkJY2xlYW51cF9kZXZzKCk7CisJCQljbGVhbnVwX2lvcmVtYXAoKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXBjaV9zZXRfbWFzdGVyKGhpLT5wZGV2WzBdKTsKKwkJcGNpX3NldF9tYXN0ZXIoaGktPnBkZXZbMV0pOworCQloaS0+bmRldiA9IGM0X2FkZF9kZXYoaGksIGksIChsb25nKSBoaS0+YWRkcl9tYXBwZWRbMF0sCisJCQkJICAgICAgKGxvbmcpIGhpLT5hZGRyX21hcHBlZFsxXSwKKwkJCQkgICAgICBoaS0+cGRldlswXS0+aXJxLAorCQkJCSAgICAgIGhpLT5wZGV2WzFdLT5pcnEpOworCQlpZiAoIWhpLT5uZGV2KSB7CisJCQlkcnZyX3N0YXRlID0gU0JFX0RSVlJfRE9XTjsKKwkJCWNsZWFudXBfaW9yZW1hcCgpOworCQkJLyogTk9URTogYzRfYWRkX2RldigpIGRvZXMgaXRzIG93biBkZXZpY2UgY2xlYW51cCAqLwogI2lmIDAKLSAgICAgICAgICAgIGNsZWFudXBfZGV2cyAoKTsKKwkJCWNsZWFudXBfZGV2cygpOwogI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gZXJyb3JfZmxhZzsgICAgICAvKiBlcnJvcl9mbGFnIHNldCB3L2luIGFkZF9kZXYoKSAqLwotICAgICAgICB9Ci0gICAgICAgIHNob3dfdHdvIChoaSwgaSk7ICAgICAgICAgICAvKiBkaXNwbGF5cyBmb3VuZCBpbmZvcm1hdGlvbiAqLwotICAgIH0KLSAgICByZXR1cm4gMDsKKwkJCXJldHVybiBlcnJvcl9mbGFnOyAvKiBlcnJvcl9mbGFnIHNldCB3L2luIGFkZF9kZXYoKSAqLworCQl9CisJCXNob3dfdHdvKGhpLCBpKTsgLyogZGlzcGxheXMgZm91bmQgaW5mb3JtYXRpb24gKi8KKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qKiogIEVuZC1vZi1GaWxlICAqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpYnNiZXcuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGlic2Jldy5oCmluZGV4IDQyNTRjMDQuLmJkMmJmYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGlic2Jldy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGlic2Jldy5oCkBAIC01MTQsMzYgKzUxNCwzNiBAQAogICAgIH07CiAgICAgdHlwZWRlZiBzdHJ1Y3Qgd2FuY2ZnIHdjZmdfdDsKIAotICAgIGV4dGVybiB3Y2ZnX3QgKndhbmNmZ19pbml0IChjaGFyICosIGNoYXIgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2NhcmRfYmxpbmsgKHdjZmdfdCAqLCBpbnQpOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19jdGwgKHdjZmdfdCAqLCBpbnQsIHZvaWQgKiwgaW50LCB2b2lkICosIGludCk7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2RlbF9jYXJkX3N0YXRzICh3Y2ZnX3QgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2RlbF9jaGFuX3N0YXRzICh3Y2ZnX3QgKiwgaW50KTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZW5hYmxlX3BvcnRzICh3Y2ZnX3QgKiwgaW50KTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZnJlZSAod2NmZ190ICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19nZXRfYnJkYWRkciAod2NmZ190ICosIHN0cnVjdCBzYmVfYnJkX2FkZHIgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9icmRpbmZvICh3Y2ZnX3QgKiwgc3RydWN0IHNiZV9icmRfaW5mbyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2NhcmQgKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlY29tX2NhcmRfcGFyYW0gKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jYXJkX2NoYW5fc3RhdHMgKHdjZmdfdCAqLCBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jYXJkX3NuICh3Y2ZnX3QgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jYXJkX3N0YXRzICh3Y2ZnX3QgKiwgc3RydWN0IHRlbXV4X2NhcmRfc3RhdHMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jaGFuICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9jaGFuX3N0YXRzICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF9kcnZpbmZvICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlX2Rydl9pbmZvICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19nZXRfZnJhbWVyICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2ZyYW1lcl9wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X2lpZCAod2NmZ190ICosIGludCwgc3RydWN0IHNiZV9paWRfaW5mbyAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfZ2V0X3NuICh3Y2ZnX3QgKiwgdW5zaWduZWQgaW50ICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19yZWFkICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX3dydF92ZWMgKik7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3Jlc2V0X2RldmljZSAod2NmZ190ICosIGludCk7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3NldF9jYXJkICh3Y2ZnX3QgKiwgc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfY2hhbiAod2NmZ190ICosIGludCwgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtICopOwotICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfZnJhbWVyICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2ZyYW1lcl9wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfc2V0X2xvZ2xldmVsICh3Y2ZnX3QgKiwgdWludCk7Ci0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX3dyaXRlICh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX3dydF92ZWMgKik7CisgICAgZXh0ZXJuIHdjZmdfdCAqd2FuY2ZnX2luaXQoY2hhciAqLCBjaGFyICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2NhcmRfYmxpbmsod2NmZ190ICosIGludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfY3RsKHdjZmdfdCAqLCBpbnQsIHZvaWQgKiwgaW50LCB2b2lkICosIGludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZGVsX2NhcmRfc3RhdHMod2NmZ190ICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2RlbF9jaGFuX3N0YXRzKHdjZmdfdCAqLCBpbnQpOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2VuYWJsZV9wb3J0cyh3Y2ZnX3QgKiwgaW50KTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19mcmVlKHdjZmdfdCAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfYnJkYWRkcih3Y2ZnX3QgKiwgc3RydWN0IHNiZV9icmRfYWRkciAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfYnJkaW5mbyh3Y2ZnX3QgKiwgc3RydWN0IHNiZV9icmRfaW5mbyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfY2FyZCh3Y2ZnX3QgKiwgc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9jYXJkX2NoYW5fc3RhdHMod2NmZ190ICosIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfY2FyZF9zbih3Y2ZnX3QgKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZ2V0X2NhcmRfc3RhdHMod2NmZ190ICosIHN0cnVjdCB0ZW11eF9jYXJkX3N0YXRzICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9jaGFuKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfY2hhbl9zdGF0cyh3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfZ2V0X2RydmluZm8od2NmZ190ICosIGludCwgc3RydWN0IHNiZV9kcnZfaW5mbyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfZnJhbWVyKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fZnJhbWVyX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX2dldF9paWQod2NmZ190ICosIGludCwgc3RydWN0IHNiZV9paWRfaW5mbyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19nZXRfc24od2NmZ190ICosIHVuc2lnbmVkIGludCAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19yZWFkKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fd3J0X3ZlYyAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19yZXNldF9kZXZpY2Uod2NmZ190ICosIGludCk7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfc2V0X2NhcmQod2NmZ190ICosIHN0cnVjdCBzYmVjb21fY2FyZF9wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19zZXRfY2hhbih3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gKik7CisgICAgZXh0ZXJuIGludCB3YW5jZmdfc2V0X2ZyYW1lcih3Y2ZnX3QgKiwgaW50LCBzdHJ1Y3Qgc2JlY29tX2ZyYW1lcl9wYXJhbSAqKTsKKyAgICBleHRlcm4gaW50IHdhbmNmZ19zZXRfbG9nbGV2ZWwod2NmZ190ICosIHVpbnQpOworICAgIGV4dGVybiBpbnQgd2FuY2ZnX3dyaXRlKHdjZmdfdCAqLCBpbnQsIHN0cnVjdCBzYmVjb21fd3J0X3ZlYyAqKTsKIAogI2lmZGVmIE5PVF9ZRVRfQ09NTU9OCi0gICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF90c2lvYyAod2NmZ190ICosIHN0cnVjdCB3YW5jMXQzX3RzX2hkciAqLCBzdHJ1Y3Qgd2FuYzF0M190c19wYXJhbSAqKTsKLSAgICBleHRlcm4gaW50ICB3YW5jZmdfc2V0X3RzaW9jICh3Y2ZnX3QgKiwgc3RydWN0IHdhbmMxdDNfdHNfcGFyYW0gKik7CisgICAgZXh0ZXJuIGludCAgd2FuY2ZnX2dldF90c2lvYyh3Y2ZnX3QgKiwgc3RydWN0IHdhbmMxdDNfdHNfaGRyICosIHN0cnVjdCB3YW5jMXQzX3RzX3BhcmFtICopOworICAgIGV4dGVybiBpbnQgIHdhbmNmZ19zZXRfdHNpb2Mod2NmZ190ICosIHN0cnVjdCB3YW5jMXQzX3RzX3BhcmFtICopOwogI2VuZGlmCiAKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKiBfSU5DX0xJQlNCRVdfSF8gKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCmluZGV4IDc5MjA2Y2IuLmIwMmY1YWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSAicG1jYzRfcHJpdmF0ZS5oIgogI2luY2x1ZGUgInNiZXByb2MuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXJyb3Igb3V0IGVhcmx5IGlmIHdlIGhhdmUgY29tcGlsZXIgdHJvdWJsZS4KICAqCiAgKiAgIChUaGlzIHNlY3Rpb24gaXMgaW5jbHVkZWQgZnJvbSB0aGUga2VybmVsJ3MgaW5pdC9tYWluLmMgYXMgYSBmcmllbmRseQpAQCAtNTAsNDMgKzUwLDQyIEBACiAjd2FybmluZyBnY2MtNC4xLjAgaXMga25vd24gdG8gbWlzY29tcGlsZSB0aGUga2VybmVsLiAgQSBkaWZmZXJlbnQgY29tcGlsZXIgdmVyc2lvbiBpcyByZWNvbW1lbmRlZC4KICNlbmRpZgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBDSEFOTkFNRSAiaGRsYyIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KLXN0YXR1c190ICAgIGM0X2NoYW5fd29ya19pbml0IChtcGlfdCAqLCBtY2hfdCAqKTsKLXZvaWQgICAgICAgIG11c3ljY193cV9jaGFuX3Jlc3RhcnQgKHZvaWQgKik7Ci1zdGF0dXNfdCBfX2luaXQgYzRfaW5pdCAoY2lfdCAqLCB1X2NoYXIgKiwgdV9jaGFyICopOwotc3RhdHVzX3QgX19pbml0IGM0X2luaXQyIChjaV90ICopOwotY2lfdCAgICAgICAqX19pbml0IGM0X25ldyAodm9pZCAqKTsKLWludCBfX2luaXQgIGM0aHdfYXR0YWNoX2FsbCAodm9pZCk7Ci12b2lkIF9faW5pdCBoZHdfc25fZ2V0IChoZHdfaW5mb190ICosIGludCk7CitzdGF0dXNfdCAgICBjNF9jaGFuX3dvcmtfaW5pdChtcGlfdCAqLCBtY2hfdCAqKTsKK3ZvaWQgICAgICAgIG11c3ljY193cV9jaGFuX3Jlc3RhcnQodm9pZCAqKTsKK3N0YXR1c190IF9faW5pdCBjNF9pbml0KGNpX3QgKiwgdV9jaGFyICosIHVfY2hhciAqKTsKK3N0YXR1c190IF9faW5pdCBjNF9pbml0MihjaV90ICopOworY2lfdCAgICAgICAqX19pbml0IGM0X25ldyh2b2lkICopOworaW50IF9faW5pdCAgYzRod19hdHRhY2hfYWxsKHZvaWQpOwordm9pZCBfX2luaXQgaGR3X3NuX2dldChoZHdfaW5mb190ICosIGludCk7CiAKICNpZmRlZiBDT05GSUdfU0JFX1BNQ0M0X05DT01NCi1pcnFyZXR1cm5fdCBjNF9lYnVzX2ludHJfdGhfaGFuZGxlciAodm9pZCAqKTsKK2lycXJldHVybl90IGM0X2VidXNfaW50cl90aF9oYW5kbGVyKHZvaWQgKik7CiAKICNlbmRpZgotaW50ICAgICAgICAgYzRfZnJhbWVfcncgKGNpX3QgKiwgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtICopOwotc3RhdHVzX3QgICAgYzRfZ2V0X3BvcnQgKGNpX3QgKiwgaW50KTsKLWludCAgICAgICAgIGM0X2xvb3BfcG9ydCAoY2lfdCAqLCBpbnQsIHVfaW50OF90KTsKLWludCAgICAgICAgIGM0X211c3ljY19ydyAoY2lfdCAqLCBzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtICopOwotaW50ICAgICAgICAgYzRfbmV3X2NoYW4gKGNpX3QgKiwgaW50LCBpbnQsIHZvaWQgKik7Ci1zdGF0dXNfdCAgICBjNF9zZXRfcG9ydCAoY2lfdCAqLCBpbnQpOwotaW50ICAgICAgICAgYzRfcGxkX3J3IChjaV90ICosIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSAqKTsKLXZvaWQgICAgICAgIGNsZWFudXBfZGV2cyAodm9pZCk7Ci12b2lkICAgICAgICBjbGVhbnVwX2lvcmVtYXAgKHZvaWQpOwotc3RhdHVzX3QgICAgbXVzeWNjX2NoYW5fZG93biAoY2lfdCAqLCBpbnQpOwotaXJxcmV0dXJuX3QgbXVzeWNjX2ludHJfdGhfaGFuZGxlciAodm9pZCAqKTsKLWludCAgICAgICAgIG11c3ljY19zdGFydF94bWl0IChjaV90ICosIGludCwgdm9pZCAqKTsKK2ludCAgICAgICAgIGM0X2ZyYW1lX3J3KGNpX3QgKiwgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtICopOworc3RhdHVzX3QgICAgYzRfZ2V0X3BvcnQoY2lfdCAqLCBpbnQpOworaW50ICAgICAgICAgYzRfbG9vcF9wb3J0KGNpX3QgKiwgaW50LCB1X2ludDhfdCk7CitpbnQgICAgICAgICBjNF9tdXN5Y2NfcncoY2lfdCAqLCBzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtICopOworaW50ICAgICAgICAgYzRfbmV3X2NoYW4oY2lfdCAqLCBpbnQsIGludCwgdm9pZCAqKTsKK3N0YXR1c190ICAgIGM0X3NldF9wb3J0KGNpX3QgKiwgaW50KTsKK2ludCAgICAgICAgIGM0X3BsZF9ydyhjaV90ICosIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSAqKTsKK3ZvaWQgICAgICAgIGNsZWFudXBfZGV2cyh2b2lkKTsKK3ZvaWQgICAgICAgIGNsZWFudXBfaW9yZW1hcCh2b2lkKTsKK3N0YXR1c190ICAgIG11c3ljY19jaGFuX2Rvd24oY2lfdCAqLCBpbnQpOworaXJxcmV0dXJuX3QgbXVzeWNjX2ludHJfdGhfaGFuZGxlcih2b2lkICopOworaW50ICAgICAgICAgbXVzeWNjX3N0YXJ0X3htaXQoY2lfdCAqLCBpbnQsIHZvaWQgKik7CiAKLWV4dGVybiBjaGFyIHBtY2M0X09TU0lfcmVsZWFzZVtdOwogZXh0ZXJuIGNpX3QgKkNJOwogZXh0ZXJuIHN0cnVjdCBzX2hkd19pbmZvIGhkd19pbmZvW107CiAKICNpZiBkZWZpbmVkKENPTkZJR19TQkVfSERMQ19WNykgfHwgZGVmaW5lZChDT05GSUdfU0JFX1dBTjI1NlQzX0hETENfVjcpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19TQkVfSERMQ19WN19NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX1NCRV9XQU4yNTZUM19IRExDX1Y3X01PRFVMRSkKKwlkZWZpbmVkKENPTkZJR19TQkVfSERMQ19WN19NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX1NCRV9XQU4yNTZUM19IRExDX1Y3X01PRFVMRSkKICNkZWZpbmUgX3Y3X2hkbGNfICAxCiAjZWxzZQogI2RlZmluZSBfdjdfaGRsY18gIDAKQEAgLTk0LDkgKzkzLDkgQEAKIAogI2lmIF92N19oZGxjXwogI2RlZmluZSBWNyh4KSAoeCAjIyBfdjcpCi1leHRlcm4gaW50ICBoZGxjX25ldGlmX3J4X3Y3IChoZGxjX2RldmljZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWV4dGVybiBpbnQgIHJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3IChoZGxjX2RldmljZSAqKTsKLWV4dGVybiBpbnQgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2VfdjcgKGhkbGNfZGV2aWNlICopOworZXh0ZXJuIGludCAgaGRsY19uZXRpZl9yeF92NyhoZGxjX2RldmljZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiBpbnQgIHJlZ2lzdGVyX2hkbGNfZGV2aWNlX3Y3KGhkbGNfZGV2aWNlICopOworZXh0ZXJuIGludCAgdW5yZWdpc3Rlcl9oZGxjX2RldmljZV92NyhoZGxjX2RldmljZSAqKTsKIAogI2Vsc2UKICNkZWZpbmUgVjcoeCkgeApAQCAtMTA0LDExICsxMDMsMTEgQEAKIAogaW50ICAgICAgICAgZXJyb3JfZmxhZzsgICAgICAgICAvKiBtb2R1bGUgbG9hZCBlcnJvciByZXBvcnRpbmcgKi8KIGludCAgICAgICAgIGN4dDFlMV9sb2dfbGV2ZWwgPSBMT0dfRVJST1I7Ci1pbnQgICAgICAgICBsb2dfbGV2ZWxfZGVmYXVsdCA9IExPR19FUlJPUjsKK3N0YXRpYyBpbnQgIGxvZ19sZXZlbF9kZWZhdWx0ID0gTE9HX0VSUk9SOwogbW9kdWxlX3BhcmFtKGN4dDFlMV9sb2dfbGV2ZWwsIGludCwgMDQ0NCk7CiAKIGludCAgICAgICAgIGN4dDFlMV9tYXhfbXJ1ID0gTVVTWUNDX01SVTsKLWludCAgICAgICAgIG1heF9tcnVfZGVmYXVsdCA9IE1VU1lDQ19NUlU7CitzdGF0aWMgaW50ICBtYXhfbXJ1X2RlZmF1bHQgPSBNVVNZQ0NfTVJVOwogbW9kdWxlX3BhcmFtKGN4dDFlMV9tYXhfbXJ1LCBpbnQsIDA0NDQpOwogCiBpbnQgICAgICAgICBjeHQxZTFfbWF4X210dSA9IE1VU1lDQ19NVFU7CkBAIC0xMjcsMzMgKzEyNiwyMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICAgICAqCi1nZXR1c2VyYnljaGFuIChpbnQgY2hhbm51bSkKK3ZvaWQgKgorZ2V0dXNlcmJ5Y2hhbihpbnQgY2hhbm51bSkKIHsKLSAgICBtY2hfdCAgICAgICpjaDsKKwltY2hfdCAgICAgICpjaDsKIAotICAgIGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKTsKLSAgICByZXR1cm4gY2ggPyBjaC0+dXNlciA6IE5VTEw7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJcmV0dXJuIGNoID8gY2gtPnVzZXIgOiBOVUxMOwogfQogCiAKLWNoYXIgICAgICAgKgotZ2V0X2hkbGNfbmFtZSAoaGRsY19kZXZpY2UgKmhkbGMpCitjaGFyICoKK2dldF9oZGxjX25hbWUoaGRsY19kZXZpY2UgKmhkbGMpCiB7Ci0gICAgc3RydWN0IGM0X3ByaXYgKnByaXYgPSBoZGxjLT5wcml2OwotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBnZXR1c2VyYnljaGFuIChwcml2LT5jaGFubnVtKTsKKwlzdHJ1Y3QgYzRfcHJpdiAqcHJpdiA9IGhkbGMtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdldHVzZXJieWNoYW4ocHJpdi0+Y2hhbm51bSk7CiAKLSAgICByZXR1cm4gZGV2LT5uYW1lOwotfQotCi0KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1ta3JldCAoaW50IGJzZCkKLXsKLSAgICBpZiAoYnNkID4gMCkKLSAgICAgICAgcmV0dXJuIC1ic2Q7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYnNkOworCXJldHVybiBkZXYtPm5hbWU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNzksOTU4ICsxNjgsOTQ2IEBACiAgKiB3aXRoaW4gYSBwb3J0J3MgZ3JvdXAuCiAgKi8KIHZvaWQKLWM0X3drX2NoYW5fcmVzdGFydCAobWNoX3QgKmNoKQorYzRfd2tfY2hhbl9yZXN0YXJ0KG1jaF90ICpjaCkKIHsKLSAgICBtcGlfdCAgICAgICpwaSA9IGNoLT51cDsKKwltcGlfdCAgICAgICpwaSA9IGNoLT51cDsKIAogI2lmZGVmIFJMRF9SRVNUQVJUX0RFQlVHCi0gICAgcHJfaW5mbygiPj4gJXM6IHF1ZXVlaW5nIFBvcnQgJWQgQ2hhbiAlZCwgbWNoX3QgQCAlcFxuIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBwaS0+cG9ydG51bSwgY2gtPmNoYW5udW0sIGNoKTsKKwlwcl9pbmZvKCI+PiAlczogcXVldWVpbmcgUG9ydCAlZCBDaGFuICVkLCBtY2hfdCBAICVwXG4iLAorCQlfX2Z1bmNfXywgcGktPnBvcnRudW0sIGNoLT5jaGFubnVtLCBjaCk7CiAjZW5kaWYKIAotICAgIC8qIGNyZWF0ZSBuZXcgZW50cnkgdy9pbiB3b3JrcXVldWUgZm9yIHRoaXMgY2hhbm5lbCBhbmQgbGV0J2VyIHJpcCAqLworCS8qIGNyZWF0ZSBuZXcgZW50cnkgdy9pbiB3b3JrcXVldWUgZm9yIHRoaXMgY2hhbm5lbCBhbmQgbGV0J2VyIHJpcCAqLwogCi0gICAgLyoqIHF1ZXVlX3dvcmsgKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpxdWV1ZSwKLSAgICAgKiogICAgICAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLSAgICAgKiovCi0gICAgcXVldWVfd29yayAocGktPndxX3BvcnQsICZjaC0+Y2hfd29yayk7CisJLyoqIHF1ZXVlX3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnF1ZXVlLAorCSAqKiAgICAgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisJICoqLworCXF1ZXVlX3dvcmsocGktPndxX3BvcnQsICZjaC0+Y2hfd29yayk7CiB9CiAKIHN0YXR1c190Ci1jNF93a19jaGFuX2luaXQgKG1waV90ICpwaSwgbWNoX3QgKmNoKQorYzRfd2tfY2hhbl9pbml0KG1waV90ICpwaSwgbWNoX3QgKmNoKQogewotICAgIC8qCi0gICAgICogdGhpcyB3aWxsIGJlIHVzZWQgdG8gcmVzdGFydCBhIHN0b3BwZWQgY2hhbm5lbAotICAgICAqLworCS8qCisJICogdGhpcyB3aWxsIGJlIHVzZWQgdG8gcmVzdGFydCBhIHN0b3BwZWQgY2hhbm5lbAorCSAqLwogCi0gICAgLyoqIElOSVRfV09SSyAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLAotICAgICAqKiAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikodm9pZCAqKSwKLSAgICAgKiogICAgICAgICAgICB2b2lkICpkYXRhKTsKLSAgICAgKiovCi0gICAgSU5JVF9XT1JLKCZjaC0+Y2hfd29yaywgKHZvaWQgKiltdXN5Y2Nfd3FfY2hhbl9yZXN0YXJ0KTsKLSAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1Y2Nlc3MgKi8KKwkvKiogSU5JVF9XT1JLKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywKKwkgKiogICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikodm9pZCAqKSwKKwkgKiogICAgICAgICAgIHZvaWQgKmRhdGEpOworCSAqKi8KKwlJTklUX1dPUksoJmNoLT5jaF93b3JrLCAodm9pZCAqKW11c3ljY193cV9jaGFuX3Jlc3RhcnQpOworCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLwogfQogCiBzdGF0dXNfdAotYzRfd3FfcG9ydF9pbml0IChtcGlfdCAqcGkpCitjNF93cV9wb3J0X2luaXQobXBpX3QgKnBpKQogewogCi0gICAgY2hhciAgICAgICAgbmFtZVsxNl0sICpucDsgIC8qIE5PVEU6IG5hbWUgb2YgdGhlIHF1ZXVlIGxpbWl0ZWQgYnkgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIDEwIGNoYXJhY3RlcnMgKi8KKwljaGFyICAgICAgICBuYW1lWzE2XTsgIC8qIE5PVEU6IG5hbWUgb2YgdGhlIHF1ZXVlIGxpbWl0ZWQgYnkgc3lzdGVtCisJCQkJICAgICAqIHRvIDEwIGNoYXJhY3RlcnMgKi8KKwlpZiAocGktPndxX3BvcnQpCisJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCiAKLSAgICBpZiAocGktPndxX3BvcnQpCi0gICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCi0KLSAgICBucCA9IG5hbWU7Ci0gICAgbWVtc2V0IChuYW1lLCAwLCAxNik7Ci0gICAgc3ByaW50ZiAobnAsICIlcyVkIiwgcGktPnVwLT5kZXZuYW1lLCBwaS0+cG9ydG51bSk7IC8qIElFIHBtY2M0LTAxKSAqLworCS8qIElFIHBtY2M0LTAxICovCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMlZCIsIHBpLT51cC0+ZGV2bmFtZSwgcGktPnBvcnRudW0pOwogCiAjaWZkZWYgUkxEX1JFU1RBUlRfREVCVUcKLSAgICBwcl9pbmZvKCI+PiAlczogY3JlYXRpbmcgd29ya3F1ZXVlIDwlcz4gZm9yIFBvcnQgJWQuXG4iLAotICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsIHBpLT5wb3J0bnVtKTsgLyogUkxEIERFQlVHICovCisJcHJfaW5mbygiPj4gJXM6IGNyZWF0aW5nIHdvcmtxdWV1ZSA8JXM+IGZvciBQb3J0ICVkLlxuIiwKKwkJX19mdW5jX18sIG5hbWUsIHBpLT5wb3J0bnVtKTsgLyogUkxEIERFQlVHICovCiAjZW5kaWYKLSAgICBpZiAoIShwaS0+d3FfcG9ydCA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlIChuYW1lKSkpCi0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworCXBpLT53cV9wb3J0ID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobmFtZSk7CisJaWYgKCFwaS0+d3FfcG9ydCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCiB9CiAKIHZvaWQKLWM0X3dxX3BvcnRfY2xlYW51cCAobXBpX3QgKnBpKQorYzRfd3FfcG9ydF9jbGVhbnVwKG1waV90ICpwaSkKIHsKLSAgICAvKgotICAgICAqIFBPUlQgUE9JTlQ6IGNhbm5vdCBjYWxsIHRoaXMgaWYgV1EgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdy9pbgotICAgICAqIHN0cnVjdHVyZSBzaW5jZSBpdCBjYWxscyBrZnJlZSh3cSk7Ci0gICAgICovCi0gICAgaWYgKHBpLT53cV9wb3J0KQotICAgIHsKLSAgICAgICAgZGVzdHJveV93b3JrcXVldWUgKHBpLT53cV9wb3J0KTsgICAgICAgIC8qIHRoaXMgYWxzbyBjYWxscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmx1c2hfd29ya3F1ZXVlKCkgKi8KLSAgICAgICAgcGktPndxX3BvcnQgPSBOVUxMOwotICAgIH0KKwkvKgorCSAqIFBPUlQgUE9JTlQ6IGNhbm5vdCBjYWxsIHRoaXMgaWYgV1EgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdy9pbgorCSAqIHN0cnVjdHVyZSBzaW5jZSBpdCBjYWxscyBrZnJlZSh3cSk7CisJICovCisJaWYgKHBpLT53cV9wb3J0KSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHBpLT53cV9wb3J0KTsgICAgICAgIC8qIHRoaXMgYWxzbyBjYWxscworCQkJCQkJCSogZmx1c2hfd29ya3F1ZXVlKCkgKi8KKwkJcGktPndxX3BvcnQgPSBOVUxMOworCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaXJxcmV0dXJuX3QKLWM0X2xpbnV4X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQorc3RhdGljIGlycXJldHVybl90CitjNF9saW51eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2luc3RhbmNlOwogCi0gICAgcmV0dXJuIG11c3ljY19pbnRyX3RoX2hhbmRsZXIobmV0ZGV2X3ByaXYobmRldikpOworCXJldHVybiBtdXN5Y2NfaW50cl90aF9oYW5kbGVyKG5ldGRldl9wcml2KG5kZXYpKTsKIH0KIAogCiAjaWZkZWYgQ09ORklHX1NCRV9QTUNDNF9OQ09NTQotaXJxcmV0dXJuX3QKLWM0X2VidXNfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCitzdGF0aWMgaXJxcmV0dXJuX3QKK2M0X2VidXNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9pbnN0YW5jZTsKIAotICAgIHJldHVybiBjNF9lYnVzX2ludHJfdGhfaGFuZGxlcihuZXRkZXZfcHJpdihuZGV2KSk7CisJcmV0dXJuIGM0X2VidXNfaW50cl90aF9oYW5kbGVyKG5ldGRldl9wcml2KG5kZXYpKTsKIH0KICNlbmRpZgogCiAKIHN0YXRpYyBpbnQKLXZvaWRfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit2b2lkX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0gICAgcHJfaW5mbygiJXM6IHRyeWluZyB0byBvcGVuIG1hc3RlciBkZXZpY2UgIVxuIiwgbmRldi0+bmFtZSk7Ci0gICAgcmV0dXJuIC0xOworCXByX2luZm8oIiVzOiB0cnlpbmcgdG8gb3BlbiBtYXN0ZXIgZGV2aWNlICFcbiIsIG5kZXYtPm5hbWUpOworCXJldHVybiAtMTsKIH0KIAogCiBzdGF0aWMgaW50Ci1jaGFuX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQorY2hhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOwotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKLSAgICBpbnQgICAgICAgICByZXQ7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhuZGV2KTsKKwljb25zdCBzdHJ1Y3QgYzRfcHJpdiAqcHJpdiA9IGhkbGMtPnByaXY7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKChyZXQgPSBoZGxjX29wZW4gKG5kZXYpKSkKLSAgICB7Ci0gICAgICAgIHByX2luZm8oImhkbGNfb3BlbiBmYWlsdXJlLCBlcnIgJWQuXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAoKHJldCA9IGM0X2NoYW5fdXAgKHByaXYtPmNpLCBwcml2LT5jaGFubnVtKSkpCi0gICAgICAgIHJldHVybiAtcmV0OwotICAgIHRyeV9tb2R1bGVfZ2V0IChUSElTX01PRFVMRSk7Ci0gICAgbmV0aWZfc3RhcnRfcXVldWUgKG5kZXYpOwotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgPSBzdWNjZXNzICovCisJcmV0ID0gaGRsY19vcGVuKG5kZXYpOworCWlmIChyZXQpIHsKKwkJcHJfaW5mbygiaGRsY19vcGVuIGZhaWx1cmUsIGVyciAlZC5cbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYzRfY2hhbl91cChwcml2LT5jaSwgcHJpdi0+Y2hhbm51bSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgPSBzdWNjZXNzICovCiB9CiAKIAogc3RhdGljIGludAotY2hhbl9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitjaGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOwotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKG5kZXYpOworCWNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2ID0gaGRsYy0+cHJpdjsKIAotICAgIG5ldGlmX3N0b3BfcXVldWUgKG5kZXYpOwotICAgIG11c3ljY19jaGFuX2Rvd24gKChjaV90ICopIDAsIHByaXYtPmNoYW5udW0pOwotICAgIGhkbGNfY2xvc2UgKG5kZXYpOwotICAgIG1vZHVsZV9wdXQgKFRISVNfTU9EVUxFKTsKLSAgICByZXR1cm4gMDsKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCW11c3ljY19jaGFuX2Rvd24oKGNpX3QgKikgMCwgcHJpdi0+Y2hhbm51bSk7CisJaGRsY19jbG9zZShuZGV2KTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50Ci1jaGFuX2Rldl9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCitjaGFuX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLSAgICByZXR1cm4gaGRsY19pb2N0bCAoZGV2LCBpZnIsIGNtZCk7CisJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CiB9CiAKIAogc3RhdGljIGludAotY2hhbl9hdHRhY2hfbm9vcCAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHVuc2lnbmVkIHNob3J0IGZvb18xLCB1bnNpZ25lZCBzaG9ydCBmb29fMikKK2NoYW5fYXR0YWNoX25vb3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHVuc2lnbmVkIHNob3J0IGZvb18xLAorCQkgdW5zaWduZWQgc2hvcnQgZm9vXzIpCiB7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIG91ciBkcml2ZXIgaGFzIG5vdGhpbmcgdG8gZG8gaGVyZSwgc2hvdydzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG92ZXIsIGdvIGhvbWUgKi8KKwkvKiBvdXIgZHJpdmVyIGhhcyBub3RoaW5nIHRvIGRvIGhlcmUsIHNob3cncworCSAqIG92ZXIsIGdvIGhvbWUKKwkgKi8KKwlyZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgotY2hhbl9nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQorY2hhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0gICAgbWNoX3QgICAgICAqY2g7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0czsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKnN0YXRzOwotICAgIGludCAgICAgICAgIGNoYW5udW07CisJbWNoX3QgICAgICAqY2g7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0czsKKwlzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgKnN0YXRzOworCWludCAgICAgICAgIGNoYW5udW07CiAKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBjNF9wcml2ICpwcml2OworCXsKKwkJc3RydWN0IGM0X3ByaXYgKnByaXY7CiAKLSAgICAgICAgcHJpdiA9IChzdHJ1Y3QgYzRfcHJpdiAqKSBkZXZfdG9faGRsYyAobmRldiktPnByaXY7Ci0gICAgICAgIGNoYW5udW0gPSBwcml2LT5jaGFubnVtOwotICAgIH0KKwkJcHJpdiA9IChzdHJ1Y3QgYzRfcHJpdiAqKWRldl90b19oZGxjKG5kZXYpLT5wcml2OworCQljaGFubnVtID0gcHJpdi0+Y2hhbm51bTsKKwl9CiAKLSAgICBjaCA9IGM0X2ZpbmRfY2hhbiAoY2hhbm51bSk7Ci0gICAgaWYgKGNoID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCWlmIChjaCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKIAotICAgIG5zdGF0cyA9ICZuZGV2LT5zdGF0czsKLSAgICBzdGF0cyA9ICZjaC0+czsKKwluc3RhdHMgPSAmbmRldi0+c3RhdHM7CisJc3RhdHMgPSAmY2gtPnM7CiAKLSAgICBtZW1zZXQgKG5zdGF0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOwotICAgIG5zdGF0cy0+cnhfcGFja2V0cyA9IHN0YXRzLT5yeF9wYWNrZXRzOwotICAgIG5zdGF0cy0+dHhfcGFja2V0cyA9IHN0YXRzLT50eF9wYWNrZXRzOwotICAgIG5zdGF0cy0+cnhfYnl0ZXMgPSBzdGF0cy0+cnhfYnl0ZXM7Ci0gICAgbnN0YXRzLT50eF9ieXRlcyA9IHN0YXRzLT50eF9ieXRlczsKLSAgICBuc3RhdHMtPnJ4X2Vycm9ycyA9IHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X2NyY19lcnJvcnMgKwotICAgICAgICBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICsKLSAgICAgICAgc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7Ci0gICAgbnN0YXRzLT50eF9lcnJvcnMgPSBzdGF0cy0+dHhfZHJvcHBlZCArCi0gICAgICAgIHN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArCi0gICAgICAgIHN0YXRzLT50eF9maWZvX2Vycm9yczsKLSAgICBuc3RhdHMtPnJ4X2Ryb3BwZWQgPSBzdGF0cy0+cnhfZHJvcHBlZDsKLSAgICBuc3RhdHMtPnR4X2Ryb3BwZWQgPSBzdGF0cy0+dHhfZHJvcHBlZDsKKwltZW1zZXQobnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwluc3RhdHMtPnJ4X3BhY2tldHMgPSBzdGF0cy0+cnhfcGFja2V0czsKKwluc3RhdHMtPnR4X3BhY2tldHMgPSBzdGF0cy0+dHhfcGFja2V0czsKKwluc3RhdHMtPnJ4X2J5dGVzID0gc3RhdHMtPnJ4X2J5dGVzOworCW5zdGF0cy0+dHhfYnl0ZXMgPSBzdGF0cy0+dHhfYnl0ZXM7CisJbnN0YXRzLT5yeF9lcnJvcnMgPSBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArCisJCXN0YXRzLT5yeF9vdmVyX2Vycm9ycyArCisJCXN0YXRzLT5yeF9jcmNfZXJyb3JzICsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArCisJCXN0YXRzLT5yeF9maWZvX2Vycm9ycyArCisJCXN0YXRzLT5yeF9taXNzZWRfZXJyb3JzOworCW5zdGF0cy0+dHhfZXJyb3JzID0gc3RhdHMtPnR4X2Ryb3BwZWQgKworCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKworCQlzdGF0cy0+dHhfZmlmb19lcnJvcnM7CisJbnN0YXRzLT5yeF9kcm9wcGVkID0gc3RhdHMtPnJ4X2Ryb3BwZWQ7CisJbnN0YXRzLT50eF9kcm9wcGVkID0gc3RhdHMtPnR4X2Ryb3BwZWQ7CiAKLSAgICBuc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9yczsKLSAgICBuc3RhdHMtPnJ4X292ZXJfZXJyb3JzID0gc3RhdHMtPnJ4X292ZXJfZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfY3JjX2Vycm9ycyA9IHN0YXRzLT5yeF9jcmNfZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gc3RhdHMtPnJ4X2ZyYW1lX2Vycm9yczsKLSAgICBuc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzID0gc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzOwotICAgIG5zdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyA9IHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzOworCW5zdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzOworCW5zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7CisJbnN0YXRzLT5yeF9jcmNfZXJyb3JzID0gc3RhdHMtPnJ4X2NyY19lcnJvcnM7CisJbnN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPSBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOworCW5zdGF0cy0+cnhfZmlmb19lcnJvcnMgPSBzdGF0cy0+cnhfZmlmb19lcnJvcnM7CisJbnN0YXRzLT5yeF9taXNzZWRfZXJyb3JzID0gc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7CiAKLSAgICBuc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzID0gc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzOwotICAgIG5zdGF0cy0+dHhfZmlmb19lcnJvcnMgPSBzdGF0cy0+dHhfZmlmb19lcnJvcnM7CisJbnN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyA9IHN0YXRzLT50eF9hYm9ydGVkX2Vycm9yczsKKwluc3RhdHMtPnR4X2ZpZm9fZXJyb3JzID0gc3RhdHMtPnR4X2ZpZm9fZXJyb3JzOwogCi0gICAgcmV0dXJuIG5zdGF0czsKKwlyZXR1cm4gbnN0YXRzOwogfQogCiAKIHN0YXRpYyBjaV90ICoKLWdldF9jaV9ieV9kZXYgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQorZ2V0X2NpX2J5X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLSAgICByZXR1cm4gKGNpX3QgKikobmV0ZGV2X3ByaXYobmRldikpOworCXJldHVybiAoY2lfdCAqKShuZXRkZXZfcHJpdihuZGV2KSk7CiB9CiAKIAogc3RhdGljIGludAotYzRfbGludXhfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitjNF9saW51eF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2OwotICAgIGludCAgICAgICAgIHJ2YWw7CisJY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJaW50ICAgICAgICAgcnZhbDsKIAotICAgIGhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMgKG5kZXYpOworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMobmRldik7CiAKLSAgICBwcml2ID0gaGRsYy0+cHJpdjsKKwlwcml2ID0gaGRsYy0+cHJpdjsKIAotICAgIHJ2YWwgPSBtdXN5Y2Nfc3RhcnRfeG1pdCAocHJpdi0+Y2ksIHByaXYtPmNoYW5udW0sIHNrYik7Ci0gICAgcmV0dXJuIHJ2YWw7CisJcnZhbCA9IG11c3ljY19zdGFydF94bWl0KHByaXYtPmNpLCBwcml2LT5jaGFubnVtLCBza2IpOworCXJldHVybiBydmFsOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGNoYW5fb3BzID0gewotICAgICAgIC5uZG9fb3BlbiAgICAgICA9IGNoYW5fb3BlbiwKLSAgICAgICAubmRvX3N0b3AgICAgICAgPSBjaGFuX2Nsb3NlLAotICAgICAgIC5uZG9fc3RhcnRfeG1pdCA9IGM0X2xpbnV4X3htaXQsCi0gICAgICAgLm5kb19kb19pb2N0bCAgID0gY2hhbl9kZXZfaW9jdGwsCi0gICAgICAgLm5kb19nZXRfc3RhdHMgID0gY2hhbl9nZXRfc3RhdHMsCisJLm5kb19vcGVuICAgICAgID0gY2hhbl9vcGVuLAorCS5uZG9fc3RvcCAgICAgICA9IGNoYW5fY2xvc2UsCisJLm5kb19zdGFydF94bWl0ID0gYzRfbGludXhfeG1pdCwKKwkubmRvX2RvX2lvY3RsICAgPSBjaGFuX2Rldl9pb2N0bCwKKwkubmRvX2dldF9zdGF0cyAgPSBjaGFuX2dldF9zdGF0cywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqCi1jcmVhdGVfY2hhbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNpX3QgKmNpLAotICAgICAgICAgICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqY3ApCitjcmVhdGVfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY2lfdCAqY2ksCisJICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSAqY3ApCiB7Ci0gICAgaGRsY19kZXZpY2UgKmhkbGM7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBpbnQgICAgICAgICByZXQ7CisJaGRsY19kZXZpY2UgKmhkbGM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwloZHdfaW5mb190ICpoaTsKKwlpbnQgICAgICAgICByZXQ7CiAKLSAgICBpZiAoYzRfZmluZF9jaGFuIChjcC0+Y2hhbm51bSkpCi0gICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGFscmVhZHkgZXhpc3RzICovCisJaWYgKGM0X2ZpbmRfY2hhbihjcC0+Y2hhbm51bSkpCisJCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGFscmVhZHkgZXhpc3RzICovCiAKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBjNF9wcml2ICpwcml2OworCXsKKwkJc3RydWN0IGM0X3ByaXYgKnByaXY7CiAKLSAgICAgICAgLyogYWxsb2NhdGUgdGhlbiBmaWxsIGluIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgcHJpdiA9IE9TX2ttYWxsb2MgKHNpemVvZiAoc3RydWN0IGM0X3ByaXYpKTsKLSAgICAgICAgaWYgKCFwcml2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwcl93YXJuaW5nKCIlczogbm8gbWVtb3J5IGZvciBuZXRfZGV2aWNlICFcbiIsIGNpLT5kZXZuYW1lKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZGV2ID0gYWxsb2NfaGRsY2RldiAocHJpdik7Ci0gICAgICAgIGlmICghZGV2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwcl93YXJuaW5nKCIlczogbm8gbWVtb3J5IGZvciBoZGxjX2RldmljZSAhXG4iLCBjaS0+ZGV2bmFtZSk7Ci0gICAgICAgICAgICBPU19rZnJlZSAocHJpdik7Ci0JICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHByaXYtPmNpID0gY2k7Ci0gICAgICAgIHByaXYtPmNoYW5udW0gPSBjcC0+Y2hhbm51bTsKLSAgICB9CisJCS8qIGFsbG9jYXRlIHRoZW4gZmlsbCBpbiBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCisJCXByaXYgPSBPU19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgYzRfcHJpdikpOworCQlpZiAoIXByaXYpIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBubyBtZW1vcnkgZm9yIG5ldF9kZXZpY2UgIVxuIiwKKwkJCQkgICBjaS0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlkZXYgPSBhbGxvY19oZGxjZGV2KHByaXYpOworCQlpZiAoIWRldikgeworCQkJcHJfd2FybmluZygiJXM6IG5vIG1lbW9yeSBmb3IgaGRsY19kZXZpY2UgIVxuIiwKKwkJCQkgICBjaS0+ZGV2bmFtZSk7CisJCQlPU19rZnJlZShwcml2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXByaXYtPmNpID0gY2k7CisJCXByaXYtPmNoYW5udW0gPSBjcC0+Y2hhbm51bTsKKwl9CiAKLSAgICBoZGxjID0gZGV2X3RvX2hkbGMgKGRldik7CisJaGRsYyA9IGRldl90b19oZGxjKGRldik7CiAKLSAgICBkZXYtPmJhc2VfYWRkciA9IDA7ICAgICAgICAgICAgIC8qIG5vdCBJL08gbWFwcGVkICovCi0gICAgZGV2LT5pcnEgPSBuZGV2LT5pcnE7Ci0gICAgZGV2LT50eXBlID0gQVJQSFJEX1JBV0hETEM7Ci0gICAgKmRldi0+bmFtZSA9IDA7ICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IGlmY29uZmlnIG5hbWUgPSAiaGRsYyIgKi8KKwlkZXYtPmJhc2VfYWRkciA9IDA7ICAgICAgICAgICAgIC8qIG5vdCBJL08gbWFwcGVkICovCisJZGV2LT5pcnEgPSBuZGV2LT5pcnE7CisJZGV2LT50eXBlID0gQVJQSFJEX1JBV0hETEM7CisJKmRldi0+bmFtZSA9IDA7ICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IGlmY29uZmlnIG5hbWUgPSAiaGRsYyIgKi8KIAotICAgIGhpID0gKGhkd19pbmZvX3QgKikgY2ktPmhkd19pbmZvOwotICAgIGlmIChoaS0+bWZnX2luZm9fc3RzID09IEVFUFJPTV9PSykKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoaGktPnByb21mbXQpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMToKLSAgICAgICAgICAgIG1lbWNweSAoZGV2LT5kZXZfYWRkciwgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKLSAgICAgICAgICAgIG1lbWNweSAoZGV2LT5kZXZfYWRkciwgKEZMRF9UWVBFMiAqKSAoaGktPm1mZ19pbmZvLnBmdDIuU2VyaWFsKSwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1lbXNldCAoZGV2LT5kZXZfYWRkciwgMCwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgbWVtc2V0IChkZXYtPmRldl9hZGRyLCAwLCA2KTsKLSAgICB9CisJaGkgPSAoaGR3X2luZm9fdCAqKWNpLT5oZHdfaW5mbzsKKwlpZiAoaGktPm1mZ19pbmZvX3N0cyA9PSBFRVBST01fT0spIHsKKwkJc3dpdGNoIChoaS0+cHJvbWZtdCkgeworCQljYXNlIFBST01fRk9STUFUX1RZUEUxOgorCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7CisJCQlicmVhazsKKwkJY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLAorCQkJICAgICAgIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCksIDYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltZW1zZXQoZGV2LT5kZXZfYWRkciwgMCwgNik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZQorCQltZW1zZXQoZGV2LT5kZXZfYWRkciwgMCwgNik7CiAKLSAgICBoZGxjLT54bWl0ID0gYzRfbGludXhfeG1pdDsKKwloZGxjLT54bWl0ID0gYzRfbGludXhfeG1pdDsKIAotICAgIGRldi0+bmV0ZGV2X29wcyA9ICZjaGFuX29wczsKLSAgICAvKgotICAgICAqIFRoZSBuYXRpdmUgaGRsYyBzdGFjayBjYWxscyB0aGlzICdhdHRhY2gnIHJvdXRpbmUgZHVyaW5nCi0gICAgICogaGRsY19yYXdfaW9jdGwoKSwgcGFzc2luZyBwYXJhbWV0ZXJzIGZvciBsaW5lIGVuY29kaW5nIGFuZCBwYXJpdHkuCi0gICAgICogU2luY2UgaGRsY19yYXdfaW9jdGwoKSBzdGFjayBkb2VzIG5vdCBpbnRlcnJvZ2F0ZSB3aGV0aGVyIGFuICdhdHRhY2gnCi0gICAgICogcm91dGluZSBpcyBhY3R1YWxseSByZWdpc3RlcmVkIG9yIG5vdCwgd2Ugc3VwcGx5IGEgZHVtbXkgcm91dGluZSB3aGljaAotICAgICAqIGRvZXMgbm90aGluZyAoc2luY2UgZW5jb2RpbmcgYW5kIHBhcml0eSBhcmUgc2V0dXAgZm9yIG91ciBkcml2ZXIgdmlhIGEKLSAgICAgKiBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gYXBwbGljYXRpb24pLgotICAgICAqLworCWRldi0+bmV0ZGV2X29wcyA9ICZjaGFuX29wczsKKwkvKgorCSAqIFRoZSBuYXRpdmUgaGRsYyBzdGFjayBjYWxscyB0aGlzICdhdHRhY2gnIHJvdXRpbmUgZHVyaW5nCisJICogaGRsY19yYXdfaW9jdGwoKSwgcGFzc2luZyBwYXJhbWV0ZXJzIGZvciBsaW5lIGVuY29kaW5nIGFuZCBwYXJpdHkuCisJICogU2luY2UgaGRsY19yYXdfaW9jdGwoKSBzdGFjayBkb2VzIG5vdCBpbnRlcnJvZ2F0ZSB3aGV0aGVyIGFuICdhdHRhY2gnCisJICogcm91dGluZSBpcyBhY3R1YWxseSByZWdpc3RlcmVkIG9yIG5vdCwgd2Ugc3VwcGx5IGEgZHVtbXkgcm91dGluZSB3aGljaAorCSAqIGRvZXMgbm90aGluZyAoc2luY2UgZW5jb2RpbmcgYW5kIHBhcml0eSBhcmUgc2V0dXAgZm9yIG91ciBkcml2ZXIgdmlhIGEKKwkgKiBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gYXBwbGljYXRpb24pLgorCSAqLwogCi0gICAgaGRsYy0+YXR0YWNoID0gY2hhbl9hdHRhY2hfbm9vcDsKKwloZGxjLT5hdHRhY2ggPSBjaGFuX2F0dGFjaF9ub29wOwogCi0gICAgcnRubF91bmxvY2sgKCk7ICAgICAgICAgICAgICAgICAvKiBuZWVkZWQgZHVlIHRvIElvY3RsIGNhbGxpbmcgc2VxdWVuY2UgKi8KLSAgICByZXQgPSByZWdpc3Rlcl9oZGxjX2RldmljZSAoZGV2KTsKLSAgICAvKiBOT1RFOiA8c3RhdHM+IHNldHRpbmcgbXVzdCBvY2N1ciBBRlRFUiByZWdpc3RyYXRpb24gaW4gb3JkZXIgdG8gInRha2UiICovCi0gICAgZGV2LT50eF9xdWV1ZV9sZW4gPSBNQVhfREVGQVVMVF9JRlFMRU47CisJLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCisJcnRubF91bmxvY2soKTsKKwlyZXQgPSByZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpOworCS8qIE5PVEU6IDxzdGF0cz4gc2V0dGluZyBtdXN0IG9jY3VyIEFGVEVSIHJlZ2lzdHJhdGlvbiBpbiBvcmRlciB0byAidGFrZSIgKi8KKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IE1BWF9ERUZBVUxUX0lGUUxFTjsKIAotICAgIHJ0bmxfbG9jayAoKTsgICAgICAgICAgICAgICAgICAgLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQotICAgICAgICAgICAgcHJfaW5mbygiJXM6IGNyZWF0ZV9jaGFuWyVkXSByZWdpc3RyYXRpb24gZXJyb3IgPSAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjcC0+Y2hhbm51bSwgcmV0KTsKLSAgICAgICAgZnJlZV9uZXRkZXYgKGRldik7ICAgICAgICAgIC8qIGNsZWFudXAgKi8KLQlyZXR1cm4gTlVMTDsJCS8qIGZhaWxlZCB0byByZWdpc3RlciAqLwotICAgIH0KLSAgICByZXR1cm4gZGV2OworCS8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCXJ0bmxfbG9jaygpOworCWlmIChyZXQpIHsKKwkJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCisJCQlwcl9pbmZvKCIlczogY3JlYXRlX2NoYW5bJWRdIHJlZ2lzdHJhdGlvbiBlcnJvciA9ICVkLlxuIiwKKwkJCQljaS0+ZGV2bmFtZSwgY3AtPmNoYW5udW0sIHJldCk7CisJCS8qIGNsZWFudXAgKi8KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJLyogZmFpbGVkIHRvIHJlZ2lzdGVyICovCisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZGV2OwogfQogCiAKIC8qIHRoZSBpZGVhIGhlcmUgaXMgdG8gZ2V0IHBvcnQgaW5mb3JtYXRpb24gYW5kIHBhc3MgaXQgYmFjayAodXNpbmcgcG9pbnRlcikgKi8KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19nZXRfcG9ydCAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX2dldF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIGludCAgICAgICAgIHJldDsKLSAgICBjaV90ICAgICAgICpjaTsgICAgICAgICAgICAgLyogY2kgc3RhbmRzIGZvciBjYXJkIGluZm9ybWF0aW9uICovCi0gICAgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOy8qIGNvcHkgZGF0YSB0byBrZXJuZWwgbGFuZCAqLworCWludCAgICAgICAgIHJldDsKKwljaV90ICAgICAgICpjaTsgICAgICAgICAgICAgLyogY2kgc3RhbmRzIGZvciBjYXJkIGluZm9ybWF0aW9uICovCisJc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOy8qIGNvcHkgZGF0YSB0byBrZXJuZWwgbGFuZCAqLwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmcHAsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgIC8qIGdldCBjYXJkIGluZm8gKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgLyogZ2V0IGNhcmQgaW5mbyAqLwogCi0gICAgcmV0ID0gbWtyZXQgKGM0X2dldF9wb3J0IChjaSwgcHAucG9ydG51bSkpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgaWYgKGNvcHlfdG9fdXNlciAoZGF0YSwgJmNpLT5wb3J0W3BwLnBvcnRudW1dLnAsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgcmV0dXJuIDA7CisJcmV0ID0gYzRfZ2V0X3BvcnQoY2ksIHBwLnBvcnRudW0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJmNpLT5wb3J0W3BwLnBvcnRudW1dLnAsCisJCQkgc2l6ZW9mKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKIH0KIAogLyogdGhpcyBmdW5jdGlvbiBjb3B5cyB0aGUgdXNlciBkYXRhIGFuZCB0aGVuIGNhbGxzIHRoZSByZWFsIGFjdGlvbiBmdW5jdGlvbiAqLwotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX3NldF9wb3J0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fc2V0X3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgY2lfdCAgICAgICAqY2k7ICAgICAgICAgICAgIC8qIGNpIHN0YW5kcyBmb3IgY2FyZCBpbmZvcm1hdGlvbiAqLwotICAgIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsvKiBjb3B5IGRhdGEgdG8ga2VybmVsIGxhbmQgKi8KKwljaV90ICAgICAgICpjaTsgICAgICAgICAgICAgLyogY2kgc3RhbmRzIGZvciBjYXJkIGluZm9ybWF0aW9uICovCisJc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOy8qIGNvcHkgZGF0YSB0byBrZXJuZWwgbGFuZCAqLwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmcHAsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgIC8qIGdldCBjYXJkIGluZm8gKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwcC5wb3J0bnVtID49IE1VU1lDQ19OUE9SVFMpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgLyogZ2V0IGNhcmQgaW5mbyAqLwogCi0gICAgaWYgKHBwLnBvcnRudW0gPj0gY2ktPm1heF9wb3J0KSAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIC1FTlhJTzsKKwlpZiAocHAucG9ydG51bSA+PSBjaS0+bWF4X3BvcnQpIC8qIHNhbml0eSBjaGVjayAqLworCQlyZXR1cm4gLUVOWElPOwogCi0gICAgbWVtY3B5ICgmY2ktPnBvcnRbcHAucG9ydG51bV0ucCwgJnBwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpOwotICAgIHJldHVybiBta3JldCAoYzRfc2V0X3BvcnQgKGNpLCBwcC5wb3J0bnVtKSk7CisJbWVtY3B5KCZjaS0+cG9ydFtwcC5wb3J0bnVtXS5wLCAmcHAsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKTsKKwlyZXR1cm4gYzRfc2V0X3BvcnQoY2ksIHBwLnBvcnRudW0pOwogfQogCiAvKiB3b3JrIHRoZSBwb3J0IGxvb3BiYWNrIG1vZGUgYXMgcGVyIGRpcmVjdGVkICovCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fcG9ydF9sb29wIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fcG9ydF9sb29wKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsKLSAgICBjaV90ICAgICAgICpjaTsKKwlzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7CisJY2lfdCAgICAgICAqY2k7CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZwcCwgZGF0YSwgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KTsKLSAgICBpZiAoIWNpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICByZXR1cm4gbWtyZXQgKGM0X2xvb3BfcG9ydCAoY2ksIHBwLnBvcnRudW0sIHBwLnBvcnRfbW9kZSkpOworCWlmIChjb3B5X2Zyb21fdXNlcigmcHAsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjNF9sb29wX3BvcnQoY2ksIHBwLnBvcnRudW0sIHBwLnBvcnRfbW9kZSk7CiB9CiAKIC8qIHNldCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHdpdGggdGhlIGdpdmVuIHZhbHVlIC8gb3IganVzdCByZWFkIGl0ICovCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fZnJhbWVyX3J3IChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZnJhbWVyX3J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSBwcDsKLSAgICBjaV90ICAgICAgICpjaTsKLSAgICBpbnQgICAgICAgICByZXQ7CisJc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOworCWNpX3QgICAgICAgKmNpOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJnBwLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHJldCA9IG1rcmV0IChjNF9mcmFtZV9ydyAoY2ksICZwcCkpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgaWYgKGNvcHlfdG9fdXNlciAoZGF0YSwgJnBwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBjNF9mcmFtZV9ydyhjaSwgJnBwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoY29weV90b191c2VyKGRhdGEsICZwcCwgc2l6ZW9mKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKIH0KIAogLyogc2V0IHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgLyBvciBqdXN0IHJlYWQgaXQgKi8KLXN0YXRpYyAgICAgIHN0YXR1c190Ci1kb19wbGRfcncgKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19wbGRfcncoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtIHBwOwotICAgIGNpX3QgICAgICAgKmNpOwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgc2JlY29tX3BvcnRfcGFyYW0gcHA7CisJY2lfdCAgICAgICAqY2k7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmcHAsIGRhdGEsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGNpID0gZ2V0X2NpX2J5X2RldiAobmRldik7Ci0gICAgaWYgKCFjaSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgcmV0ID0gbWtyZXQgKGM0X3BsZF9ydyAoY2ksICZwcCkpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgaWYgKGNvcHlfdG9fdXNlciAoZGF0YSwgJnBwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fcG9ydF9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGM0X3BsZF9ydyhjaSwgJnBwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnBwLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9wb3J0X3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQogCiAvKiBzZXQgdGhlIHNwZWNpZmllZCByZWdpc3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZSAvIG9yIGp1c3QgcmVhZCBpdCAqLwotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX211c3ljY19ydyAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX211c3ljY19ydyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtIG1wOwotICAgIGNpX3QgICAgICAgKmNpOwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3QgYzRfbXVzeWNjX3BhcmFtIG1wOworCWNpX3QgICAgICAgKmNpOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJm1wLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBjNF9tdXN5Y2NfcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KTsKLSAgICBpZiAoIWNpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICByZXQgPSBta3JldCAoYzRfbXVzeWNjX3J3IChjaSwgJm1wKSk7Ci0gICAgaWYgKHJldCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmbXAsIHNpemVvZiAoc3RydWN0IGM0X211c3ljY19wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJm1wLCBkYXRhLCBzaXplb2Yoc3RydWN0IGM0X211c3ljY19wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwljaSA9IGdldF9jaV9ieV9kZXYobmRldik7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gYzRfbXVzeWNjX3J3KGNpLCAmbXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJm1wLCBzaXplb2Yoc3RydWN0IGM0X211c3ljY19wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX2dldF9jaGFuIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZ2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7CisJaW50ICAgICAgICAgcmV0OwogCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3AsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNwLCBkYXRhLAorCQkJCXNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKLSAgICBpZiAoKHJldCA9IG1rcmV0IChjNF9nZXRfY2hhbiAoY3AuY2hhbm51bSwgJmNwKSkpKQotICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IGM0X2dldF9jaGFuKGNwLmNoYW5udW0sICZjcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmY3AsIHNpemVvZiAoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJmNwLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fc2V0X2NoYW4gKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHN0YXR1c190Citkb19zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7Ci0gICAgaW50ICAgICAgICAgcmV0OwotICAgIGNpX3QgICAgICAgKmNpOworCXN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKKwljaV90ICAgICAgICpjaTsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHN3aXRjaCAocmV0ID0gbWtyZXQgKGM0X3NldF9jaGFuIChjcC5jaGFubnVtLCAmY3ApKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICByZXR1cm4gMDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KKwlpZiAoY29weV9mcm9tX3VzZXIoJmNwLCBkYXRhLCBzaXplb2Yoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCWNpID0gZ2V0X2NpX2J5X2RldihuZGV2KTsKKwlpZiAoIWNpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYzRfc2V0X2NoYW4oY3AuY2hhbm51bSwgJmNwKTsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX2NyZWF0ZV9jaGFuIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fY3JlYXRlX2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgY2lfdCAgICAgICAqY2k7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSAgICBzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7Ci0gICAgaW50ICAgICAgICAgcmV0OworCWNpX3QgICAgICAgKmNpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBjaSA9IGdldF9jaV9ieV9kZXYgKG5kZXYpOwotICAgIGlmICghY2kpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIGRldiA9IGNyZWF0ZV9jaGFuIChuZGV2LCBjaSwgJmNwKTsKLSAgICBpZiAoIWRldikKLSAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICByZXQgPSBta3JldCAoYzRfbmV3X2NoYW4gKGNpLCBjcC5wb3J0LCBjcC5jaGFubnVtLCBkZXYpKTsKLSAgICBpZiAocmV0KQotICAgIHsKLSAgICAgICAgcnRubF91bmxvY2sgKCk7ICAgICAgICAgICAgIC8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwotICAgICAgICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlIChkZXYpOwotICAgICAgICBydG5sX2xvY2sgKCk7ICAgICAgICAgICAgICAgLyogbmVlZGVkIGR1ZSB0byBJb2N0bCBjYWxsaW5nIHNlcXVlbmNlICovCi0gICAgICAgIGZyZWVfbmV0ZGV2IChkZXYpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OworCWlmIChjb3B5X2Zyb21fdXNlcigmY3AsIGRhdGEsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2kgPSBnZXRfY2lfYnlfZGV2KG5kZXYpOworCWlmICghY2kpCisJCXJldHVybiAtRUlOVkFMOworCWRldiA9IGNyZWF0ZV9jaGFuKG5kZXYsIGNpLCAmY3ApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVCVVNZOworCXJldCA9IGM0X25ld19jaGFuKGNpLCBjcC5wb3J0LCBjcC5jaGFubnVtLCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCS8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCQlydG5sX3VubG9jaygpOworCQl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJCS8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCQlydG5sX2xvY2soKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX2dldF9jaGFuX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdGF0dXNfdAorZG9fZ2V0X2NoYW5fc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IGM0X2NoYW5fc3RhdHNfd3JhcCBjY3M7Ci0gICAgaW50ICAgICAgICAgcmV0OworCXN0cnVjdCBjNF9jaGFuX3N0YXRzX3dyYXAgY2NzOworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNjcywgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGM0X2NoYW5fc3RhdHNfd3JhcCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICBzd2l0Y2ggKHJldCA9IG1rcmV0IChjNF9nZXRfY2hhbl9zdGF0cyAoY2NzLmNoYW5udW0sICZjY3Muc3RhdHMpKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAoY29weV90b191c2VyIChkYXRhLCAmY2NzLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGM0X2NoYW5fc3RhdHNfd3JhcCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICByZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNjcywgZGF0YSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgYzRfY2hhbl9zdGF0c193cmFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gYzRfZ2V0X2NoYW5fc3RhdHMoY2NzLmNoYW5udW0sICZjY3Muc3RhdHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmY2NzLAorCQkJIHNpemVvZihzdHJ1Y3QgYzRfY2hhbl9zdGF0c193cmFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOwogfQotc3RhdGljICAgICAgc3RhdHVzX3QKLWRvX3NldF9sb2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RhdHVzX3QKK2RvX3NldF9sb2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSkKIHsKLSAgICB1bnNpZ25lZCBpbnQgY3h0MWUxX2xvZ19sZXZlbDsKKwl1bnNpZ25lZCBpbnQgY3h0MWUxX2xvZ19sZXZlbDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmN4dDFlMV9sb2dfbGV2ZWwsIGRhdGEsIHNpemVvZiAoaW50KSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIHNiZWNvbV9zZXRfbG9nbGV2ZWwgKGN4dDFlMV9sb2dfbGV2ZWwpOwotICAgIHJldHVybiAwOworCWlmIChjb3B5X2Zyb21fdXNlcigmY3h0MWUxX2xvZ19sZXZlbCwgZGF0YSwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzYmVjb21fc2V0X2xvZ2xldmVsKGN4dDFlMV9sb2dfbGV2ZWwpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgICAgICBzdGF0dXNfdAotZG9fZGVsdXNlciAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBsb2NraXQpCitzdGF0aWMgc3RhdHVzX3QKK2RvX2RlbHVzZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBsb2NraXQpCiB7Ci0gICAgaWYgKG5kZXYtPmZsYWdzICYgSUZGX1VQKQotICAgICAgICByZXR1cm4gLUVCVVNZOworCWlmIChuZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJcmV0dXJuIC1FQlVTWTsKIAotICAgIHsKLSAgICAgICAgY2lfdCAgICAgICAqY2k7Ci0gICAgICAgIG1jaF90ICAgICAgKmNoOwotICAgICAgICBjb25zdCBzdHJ1Y3QgYzRfcHJpdiAqcHJpdjsKLSAgICAgICAgaW50ICAgICAgICAgY2hhbm51bTsKKwl7CisJCWNpX3QgICAgICAgKmNpOworCQltY2hfdCAgICAgICpjaDsKKwkJY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJCWludCAgICAgICAgIGNoYW5udW07CiAKLSAgICAgICAgcHJpdiA9IChzdHJ1Y3QgYzRfcHJpdiAqKSBkZXZfdG9faGRsYyAobmRldiktPnByaXY7Ci0gICAgICAgIGNpID0gcHJpdi0+Y2k7Ci0gICAgICAgIGNoYW5udW0gPSBwcml2LT5jaGFubnVtOworCQlwcml2ID0gKHN0cnVjdCBjNF9wcml2ICopZGV2X3RvX2hkbGMobmRldiktPnByaXY7CisJCWNpID0gcHJpdi0+Y2k7CisJCWNoYW5udW0gPSBwcml2LT5jaGFubnVtOwogCi0gICAgICAgIGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKTsKLSAgICAgICAgaWYgKGNoID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKLQljaC0+dXNlciA9IE5VTEw7CS8qIHdpbGwgYmUgZnJlZWQsIGJlbG93ICovCi0gICAgfQorCQljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwkJaWYgKGNoID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJY2gtPnVzZXIgPSBOVUxMOwkvKiB3aWxsIGJlIGZyZWVkLCBiZWxvdyAqLworCX0KIAotICAgIGlmIChsb2NraXQpCi0gICAgICAgIHJ0bmxfdW5sb2NrICgpOyAgICAgICAgICAgICAvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwotICAgIHVucmVnaXN0ZXJfaGRsY19kZXZpY2UgKG5kZXYpOwotICAgIGlmIChsb2NraXQpCi0gICAgICAgIHJ0bmxfbG9jayAoKTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwotICAgIGZyZWVfbmV0ZGV2IChuZGV2KTsKLSAgICByZXR1cm4gMDsKKwkvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCWlmIChsb2NraXQpCisJCXJ0bmxfdW5sb2NrKCk7CisJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShuZGV2KTsKKwkvKiBuZWVkZWQgaWYgSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLworCWlmIChsb2NraXQpCisJCXJ0bmxfbG9jaygpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXJldHVybiAwOwogfQogCiBpbnQKLWRvX2RlbF9jaGFuIChzdHJ1Y3QgbmV0X2RldmljZSAqbXVzeWNjX2Rldiwgdm9pZCAqZGF0YSkKK2RvX2RlbF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICptdXN5Y2NfZGV2LCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKLSAgICBjaGFyICAgICAgICBidWZbc2l6ZW9mIChDSEFOTkFNRSkgKyAzXTsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotICAgIGludCAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gY3A7CisJY2hhciAgICAgICAgYnVmW3NpemVvZihDSEFOTkFNRSkgKyAzXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCAgICAgICAgIHJldDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgaWYgKGNwLmNoYW5udW0gPiA5OTkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIHNucHJpbnRmIChidWYsIHNpemVvZihidWYpLCBDSEFOTkFNRSAiJWQiLCBjcC5jaGFubnVtKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNwLCBkYXRhLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY3AuY2hhbm51bSA+IDk5OSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgQ0hBTk5BTUUgIiVkIiwgY3AuY2hhbm51bSk7CiAJZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBidWYpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKLSAgICByZXQgPSBkb19kZWx1c2VyIChkZXYsIDEpOwotICAgIGlmIChyZXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0dXJuIGM0X2RlbF9jaGFuIChjcC5jaGFubnVtKTsKKwlyZXQgPSBkb19kZWx1c2VyKGRldiwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYzRfZGVsX2NoYW4oY3AuY2hhbm51bSk7CiB9Ci1pbnQgICAgICAgICBjNF9yZXNldF9ib2FyZCAodm9pZCAqKTsKK2ludCBjNF9yZXNldF9ib2FyZCh2b2lkICopOwogCiBpbnQKLWRvX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqbXVzeWNjX2Rldiwgdm9pZCAqZGF0YSkKK2RvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICptdXN5Y2NfZGV2LCB2b2lkICpkYXRhKQogewotICAgIGNvbnN0IHN0cnVjdCBjNF9wcml2ICpwcml2OwotICAgIGludCAgICAgICAgIGk7CisJY29uc3Qgc3RydWN0IGM0X3ByaXYgKnByaXY7CisJaW50ICAgICAgICAgaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwotICAgICAgICBjaGFyICAgICAgICBidWZbc2l6ZW9mIChDSEFOTkFNRSkgKyAzXTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJCWNoYXIgICAgICAgIGJ1ZltzaXplb2YoQ0hBTk5BTUUpICsgM107CiAKLSAgICAgICAgc3ByaW50ZiAoYnVmLCBDSEFOTkFNRSAiJWQiLCBpKTsKLQluZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBidWYpOwotCWlmICghbmRldikKLQkJY29udGludWU7Ci0gICAgICAgIHByaXYgPSBkZXZfdG9faGRsYyAobmRldiktPnByaXY7CisJCXNwcmludGYoYnVmLCBDSEFOTkFNRSAiJWQiLCBpKTsKKwkJbmRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgYnVmKTsKKwkJaWYgKCFuZGV2KQorCQkJY29udGludWU7CisJCXByaXYgPSBkZXZfdG9faGRsYyhuZGV2KS0+cHJpdjsKIAotICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIChwcml2LT5jaSkgPT0KLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAobmV0ZGV2X3ByaXYobXVzeWNjX2RldikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZGV2LT5mbGFncyAmPSB+SUZGX1VQOwotICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSAobmRldik7Ci0gICAgICAgICAgICBkb19kZWx1c2VyIChuZGV2LCAxKTsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSAocHJpdi0+Y2kpID09CisJCQkodW5zaWduZWQgbG9uZykgKG5ldGRldl9wcml2KG11c3ljY19kZXYpKSkgeworCQkJbmRldi0+ZmxhZ3MgJj0gfklGRl9VUDsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCQlkb19kZWx1c2VyKG5kZXYsIDEpOworCQl9CiAJfQotICAgIH0KLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogaW50Ci1kb19yZXNldF9jaGFuX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqbXVzeWNjX2Rldiwgdm9pZCAqZGF0YSkKK2RvX3Jlc2V0X2NoYW5fc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm11c3ljY19kZXYsIHZvaWQgKmRhdGEpCiB7Ci0gICAgc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtIGNwOworCXN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBjcDsKIAotICAgIGlmIChjb3B5X2Zyb21fdXNlciAoJmNwLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0pKSkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgcmV0dXJuIG1rcmV0IChjNF9kZWxfY2hhbl9zdGF0cyAoY3AuY2hhbm51bSkpOworCWlmIChjb3B5X2Zyb21fdXNlcigmY3AsIGRhdGEsCisJCQkgICBzaXplb2Yoc3RydWN0IHNiZWNvbV9jaGFuX3BhcmFtKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBjNF9kZWxfY2hhbl9zdGF0cyhjcC5jaGFubnVtKTsKIH0KIAotc3RhdGljICAgICAgc3RhdHVzX3QKLWM0X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCitzdGF0aWMgc3RhdHVzX3QKK2M0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLSAgICBjaV90ICAgICAgICpjaTsKLSAgICB2b2lkICAgICAgICpkYXRhOwotICAgIGludCAgICAgICAgIGlvY21kLCBpb2xlbjsKLSAgICBzdGF0dXNfdCAgICByZXQ7Ci0gICAgc3RhdGljIHN0cnVjdCBkYXRhCi0gICAgewotICAgICAgICB1bmlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB1X2ludDhfdCBjOwotICAgICAgICAgICAgdV9pbnQzMl90IGk7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2JlX2JyZF9pbmZvIGJpcDsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVfZHJ2X2luZm8gZGlwOwotICAgICAgICAgICAgc3RydWN0IHNiZV9paWRfaW5mbyBpaXA7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc2JlX2JyZF9hZGRyIGJhcDsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cyBzdGF0czsKLSAgICAgICAgICAgIHN0cnVjdCBzYmVjb21fY2hhbl9wYXJhbSBwYXJhbTsKLSAgICAgICAgICAgIHN0cnVjdCB0ZW11eF9jYXJkX3N0YXRzIGNhcmRzOwotICAgICAgICAgICAgc3RydWN0IHNiZWNvbV9jYXJkX3BhcmFtIGNhcmRwOwotICAgICAgICAgICAgc3RydWN0IHNiZWNvbV9mcmFtZXJfcGFyYW0gZnJwOwotICAgICAgICB9ICAgICAgICAgICB1OwotICAgIH0gICAgICAgICAgIGFyZzsKKwljaV90ICAgICAgICpjaTsKKwl2b2lkICAgICAgICpkYXRhOworCWludCAgICAgICAgIGlvY21kLCBpb2xlbjsKKwlzdGF0dXNfdCAgICByZXQ7CisJc3RhdGljIHN0cnVjdCBkYXRhIHsKKwkJdW5pb24geworCQkJdV9pbnQ4X3QgYzsKKwkJCXVfaW50MzJfdCBpOworCQkJc3RydWN0IHNiZV9icmRfaW5mbyBiaXA7CisJCQlzdHJ1Y3Qgc2JlX2Rydl9pbmZvIGRpcDsKKwkJCXN0cnVjdCBzYmVfaWlkX2luZm8gaWlwOworCQkJc3RydWN0IHNiZV9icmRfYWRkciBiYXA7CisJCQlzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMgc3RhdHM7CisJCQlzdHJ1Y3Qgc2JlY29tX2NoYW5fcGFyYW0gcGFyYW07CisJCQlzdHJ1Y3QgdGVtdXhfY2FyZF9zdGF0cyBjYXJkczsKKwkJCXN0cnVjdCBzYmVjb21fY2FyZF9wYXJhbSBjYXJkcDsKKwkJCXN0cnVjdCBzYmVjb21fZnJhbWVyX3BhcmFtIGZycDsKKwkJfSB1OworCX0gYXJnOwogCiAKLSAgICBpZiAoIWNhcGFibGUgKENBUF9TWVNfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotICAgIGlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUgKyAxNSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKCEoY2kgPSBnZXRfY2lfYnlfZGV2IChuZGV2KSkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChjaS0+c3RhdGUgIT0gQ19SVU5OSU5HKQotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZpb2NtZCwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mIChpb2NtZCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSArIDE1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwljaSA9IGdldF9jaV9ieV9kZXYobmRldik7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNpLT5zdGF0ZSAhPSBDX1JVTk5JTkcpCisJCXJldHVybiAtRU5PREVWOworCWlmIChjb3B5X2Zyb21fdXNlcigmaW9jbWQsIGlmci0+aWZyX2RhdGEsIHNpemVvZihpb2NtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKICNpZiAwCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmbGVuLCBpZnItPmlmcl9kYXRhICsgc2l6ZW9mIChpb2NtZCksIHNpemVvZiAobGVuKSkpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmbGVuLCBpZnItPmlmcl9kYXRhICsgc2l6ZW9mKGlvY21kKSwgc2l6ZW9mKGxlbikpKQorCQlyZXR1cm4gLUVGQVVMVDsKICNlbmRpZgogCiAjaWYgMAotICAgIHByX2luZm8oImM0X2lvY3RsOiBpb2NtZCAleCwgZGlyICV4IHR5cGUgJXggbnIgJXggaW9sZW4gJWQuXG4iLCBpb2NtZCwKLSAgICAgICAgICAgIF9JT0NfRElSIChpb2NtZCksIF9JT0NfVFlQRSAoaW9jbWQpLCBfSU9DX05SIChpb2NtZCksCi0gICAgICAgICAgICBfSU9DX1NJWkUgKGlvY21kKSk7CisJcHJfaW5mbygiYzRfaW9jdGw6IGlvY21kICV4LCBkaXIgJXggdHlwZSAleCBuciAleCBpb2xlbiAlZC5cbiIsIGlvY21kLAorCQlfSU9DX0RJUihpb2NtZCksIF9JT0NfVFlQRShpb2NtZCksIF9JT0NfTlIoaW9jbWQpLAorCQlfSU9DX1NJWkUoaW9jbWQpKTsKICNlbmRpZgotICAgIGlvbGVuID0gX0lPQ19TSVpFIChpb2NtZCk7Ci0gICAgaWYgKGlvbGVuID4gc2l6ZW9mKGFyZykpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIGRhdGEgPSBpZnItPmlmcl9kYXRhICsgc2l6ZW9mIChpb2NtZCk7Ci0gICAgaWYgKGNvcHlfZnJvbV91c2VyICgmYXJnLCBkYXRhLCBpb2xlbikpCi0gICAgICAgIHJldHVybiAtRUZBVUxUOworCWlvbGVuID0gX0lPQ19TSVpFKGlvY21kKTsKKwlpZiAoaW9sZW4gPiBzaXplb2YoYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YSA9IGlmci0+aWZyX2RhdGEgKyBzaXplb2YoaW9jbWQpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYXJnLCBkYXRhLCBpb2xlbikpCisJCXJldHVybiAtRUZBVUxUOwogCi0gICAgcmV0ID0gMDsKLSAgICBzd2l0Y2ggKGlvY21kKQotICAgIHsKLSAgICBjYXNlIFNCRV9JT0NfUE9SVF9HRVQ6Ci0gICAgICAgIC8vcHJfaW5mbygiPj4gU0JFX0lPQ19QT1JUX0dFVCBJb2N0bC4uLlxuIik7Ci0gICAgICAgIHJldCA9IGRvX2dldF9wb3J0IChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX1BPUlRfU0VUOgotICAgICAgICAvL3ByX2luZm8oIj4+IFNCRV9JT0NfUE9SVF9TRVQgSW9jdGwuLi5cbiIpOwotICAgICAgICByZXQgPSBkb19zZXRfcG9ydCAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19DSEFOX0dFVDoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBTQkVfSU9DX0NIQU5fR0VUIElvY3RsLi4uXG4iKTsKLSAgICAgICAgcmV0ID0gZG9fZ2V0X2NoYW4gKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNCRV9JT0NfQ0hBTl9TRVQ6Ci0gICAgICAgIC8vcHJfaW5mbygiPj4gU0JFX0lPQ19DSEFOX1NFVCBJb2N0bC4uLlxuIik7Ci0gICAgICAgIHJldCA9IGRvX3NldF9jaGFuIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDNF9ERUxfQ0hBTjoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBDNF9ERUxfQ0hBTiBJb2N0bC4uLlxuIik7Ci0gICAgICAgIHJldCA9IGRvX2RlbF9jaGFuIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX0NIQU5fTkVXOgotICAgICAgICByZXQgPSBkb19jcmVhdGVfY2hhbiAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19DSEFOX0dFVF9TVEFUOgotICAgICAgICByZXQgPSBkb19nZXRfY2hhbl9zdGF0cyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19MT0dMRVZFTDoKLSAgICAgICAgcmV0ID0gZG9fc2V0X2xvZ2xldmVsIChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQkVfSU9DX1JFU0VUX0RFVjoKLSAgICAgICAgcmV0ID0gZG9fcmVzZXQgKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNCRV9JT0NfQ0hBTl9ERUxfU1RBVDoKLSAgICAgICAgcmV0ID0gZG9fcmVzZXRfY2hhbl9zdGF0cyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQzRfTE9PUF9QT1JUOgotICAgICAgICByZXQgPSBkb19wb3J0X2xvb3AgKG5kZXYsIGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEM0X1JXX0ZSTVI6Ci0gICAgICAgIHJldCA9IGRvX2ZyYW1lcl9ydyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQzRfUldfTVNZQzoKLSAgICAgICAgcmV0ID0gZG9fbXVzeWNjX3J3IChuZGV2LCBkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDNF9SV19QTEQ6Ci0gICAgICAgIHJldCA9IGRvX3BsZF9ydyAobmRldiwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JFX0lPQ19JSURfR0VUOgotICAgICAgICByZXQgPSAoaW9sZW4gPT0gc2l6ZW9mIChzdHJ1Y3Qgc2JlX2lpZF9pbmZvKSkgPyBjNF9nZXRfaWlkaW5mbyAoY2ksICZhcmcudS5paXApIDogLUVGQVVMVDsKLSAgICAgICAgaWYgKHJldCA9PSAwKSAgICAgICAgICAgICAgIC8qIG5vIGVycm9yLCBjb3B5IGRhdGEgKi8KLSAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIgKGRhdGEsICZhcmcsIGlvbGVuKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy9wcl9pbmZvKCI+PiBjNF9pb2N0bDogRUlOVkFMIC0gdW5rbm93biBpb2NtZCA8JXg+XG4iLCBpb2NtZCk7Ci0gICAgICAgIHJldCA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbWtyZXQgKHJldCk7CisJcmV0ID0gMDsKKwlzd2l0Y2ggKGlvY21kKSB7CisJY2FzZSBTQkVfSU9DX1BPUlRfR0VUOgorCQlyZXQgPSBkb19nZXRfcG9ydChuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX1BPUlRfU0VUOgorCQlyZXQgPSBkb19zZXRfcG9ydChuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0NIQU5fR0VUOgorCQlyZXQgPSBkb19nZXRfY2hhbihuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0NIQU5fU0VUOgorCQlyZXQgPSBkb19zZXRfY2hhbihuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDNF9ERUxfQ0hBTjoKKwkJcmV0ID0gZG9fZGVsX2NoYW4obmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19DSEFOX05FVzoKKwkJcmV0ID0gZG9fY3JlYXRlX2NoYW4obmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19DSEFOX0dFVF9TVEFUOgorCQlyZXQgPSBkb19nZXRfY2hhbl9zdGF0cyhuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTQkVfSU9DX0xPR0xFVkVMOgorCQlyZXQgPSBkb19zZXRfbG9nbGV2ZWwobmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU0JFX0lPQ19SRVNFVF9ERVY6CisJCXJldCA9IGRvX3Jlc2V0KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfQ0hBTl9ERUxfU1RBVDoKKwkJcmV0ID0gZG9fcmVzZXRfY2hhbl9zdGF0cyhuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDNF9MT09QX1BPUlQ6CisJCXJldCA9IGRvX3BvcnRfbG9vcChuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDNF9SV19GUk1SOgorCQlyZXQgPSBkb19mcmFtZXJfcncobmRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgQzRfUldfTVNZQzoKKwkJcmV0ID0gZG9fbXVzeWNjX3J3KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIEM0X1JXX1BMRDoKKwkJcmV0ID0gZG9fcGxkX3J3KG5kZXYsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNCRV9JT0NfSUlEX0dFVDoKKwkJcmV0ID0gKGlvbGVuID09IHNpemVvZihzdHJ1Y3Qgc2JlX2lpZF9pbmZvKSkgPworCQkgICAgICAgYzRfZ2V0X2lpZGluZm8oY2ksICZhcmcudS5paXApIDogLUVGQVVMVDsKKwkJaWYgKHJldCA9PSAwKSAgICAgICAgICAgICAgIC8qIG5vIGVycm9yLCBjb3B5IGRhdGEgKi8KKwkJCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJmFyZywgaW9sZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjNF9vcHMgPSB7Ci0gICAgICAgLm5kb19vcGVuICAgICAgID0gdm9pZF9vcGVuLAotICAgICAgIC5uZG9fc3RhcnRfeG1pdCA9IGM0X2xpbnV4X3htaXQsCi0gICAgICAgLm5kb19kb19pb2N0bCAgID0gYzRfaW9jdGwsCisJLm5kb19vcGVuICAgICAgID0gdm9pZF9vcGVuLAorCS5uZG9fc3RhcnRfeG1pdCA9IGM0X2xpbnV4X3htaXQsCisJLm5kb19kb19pb2N0bCAgID0gYzRfaW9jdGwsCiB9OwogCiBzdGF0aWMgdm9pZCBjNF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgICAgIGRldi0+dHlwZSA9IEFSUEhSRF9WT0lEOwotICAgICAgIGRldi0+bmV0ZGV2X29wcyA9ICZjNF9vcHM7CisJZGV2LT50eXBlID0gQVJQSFJEX1ZPSUQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmM0X29wczsKIH0KIAogc3RydWN0IG5ldF9kZXZpY2UgKl9faW5pdAotYzRfYWRkX2RldiAoaGR3X2luZm9fdCAqaGksIGludCBicmRubywgdW5zaWduZWQgbG9uZyBmMCwgdW5zaWduZWQgbG9uZyBmMSwKLSAgICAgICAgICAgIGludCBpcnEwLCBpbnQgaXJxMSkKK2M0X2FkZF9kZXYoaGR3X2luZm9fdCAqaGksIGludCBicmRubywgdW5zaWduZWQgbG9uZyBmMCwgdW5zaWduZWQgbG9uZyBmMSwKKwkgICBpbnQgaXJxMCwgaW50IGlycTEpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7Ci0gICAgY2lfdCAgICAgICAqY2k7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJY2lfdCAgICAgICAqY2k7CiAKLSAgICBuZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihjaV90KSwgU0JFX0lGQUNFVE1QTCwgYzRfc2V0dXApOwotICAgIGlmICghbmRldikKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoIiVzOiBubyBtZW1vcnkgZm9yIHN0cnVjdCBuZXRfZGV2aWNlICFcbiIsIGhpLT5kZXZuYW1lKTsKLSAgICAgICAgZXJyb3JfZmxhZyA9IEVOT01FTTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY2kgPSAoY2lfdCAqKShuZXRkZXZfcHJpdihuZGV2KSk7Ci0gICAgbmRldi0+aXJxID0gaXJxMDsKKwluZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihjaV90KSwgU0JFX0lGQUNFVE1QTCwgYzRfc2V0dXApOworCWlmICghbmRldikgeworCQlwcl93YXJuaW5nKCIlczogbm8gbWVtb3J5IGZvciBzdHJ1Y3QgbmV0X2RldmljZSAhXG4iLAorCQkJICAgaGktPmRldm5hbWUpOworCQllcnJvcl9mbGFnID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNpID0gKGNpX3QgKikobmV0ZGV2X3ByaXYobmRldikpOworCW5kZXYtPmlycSA9IGlycTA7CiAKLSAgICBjaS0+aGR3X2luZm8gPSBoaTsKLSAgICBjaS0+c3RhdGUgPSBDX0lOSVQ7ICAgICAgICAgLyogbWFyayBhcyBoYXJkd2FyZSBub3QgYXZhaWxhYmxlICovCi0gICAgY2ktPm5leHQgPSBjNF9saXN0OwotICAgIGM0X2xpc3QgPSBjaTsKLSAgICBjaS0+YnJkbm8gPSBjaS0+bmV4dCA/IGNpLT5uZXh0LT5icmRubyArIDEgOiAwOworCWNpLT5oZHdfaW5mbyA9IGhpOworCWNpLT5zdGF0ZSA9IENfSU5JVDsgICAgICAgICAvKiBtYXJrIGFzIGhhcmR3YXJlIG5vdCBhdmFpbGFibGUgKi8KKwljaS0+bmV4dCA9IGM0X2xpc3Q7CisJYzRfbGlzdCA9IGNpOworCWNpLT5icmRubyA9IGNpLT5uZXh0ID8gY2ktPm5leHQtPmJyZG5vICsgMSA6IDA7CiAKLSAgICBpZiAoIUNJKQotICAgICAgICBDSSA9IGNpOyAgICAgICAgICAgICAgICAgICAgLyogREVCVUcsIG9ubHkgYm9hcmQgMCB1c2FnZSAqLworCWlmICghQ0kpCisJCUNJID0gY2k7ICAgICAgICAgICAgICAgICAgICAvKiBERUJVRywgb25seSBib2FyZCAwIHVzYWdlICovCiAKLSAgICBzdHJjcHkgKGNpLT5kZXZuYW1lLCBoaS0+ZGV2bmFtZSk7Ci0gICAgY2ktPnJlbGVhc2UgPSAmcG1jYzRfT1NTSV9yZWxlYXNlWzBdOworCXN0cmNweShjaS0+ZGV2bmFtZSwgaGktPmRldm5hbWUpOwogCi0gICAgLyogdGFza2xldCAqLworCS8qIHRhc2tsZXQgKi8KICNpZiBkZWZpbmVkKFNCRV9JU1JfVEFTS0xFVCkKLSAgICB0YXNrbGV0X2luaXQgKCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0LAotICAgICAgICAgICAgICAgICAgKHZvaWQgKCopICh1bnNpZ25lZCBsb25nKSkgbXVzeWNjX2ludHJfYmhfdGFza2xldCwKLSAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjaSk7CisJdGFza2xldF9pbml0KCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0LAorCQkgICAgICh2b2lkICgqKSAodW5zaWduZWQgbG9uZykpIG11c3ljY19pbnRyX2JoX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGNpKTsKIAotICAgIGlmIChhdG9taWNfcmVhZCAoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQuY291bnQpID09IDApCi0gICAgICAgIHRhc2tsZXRfZGlzYWJsZV9ub3N5bmMgKCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0KTsKKwlpZiAoYXRvbWljX3JlYWQoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQuY291bnQpID09IDApCisJCXRhc2tsZXRfZGlzYWJsZV9ub3N5bmMoJmNpLT5jaV9tdXN5Y2NfaXNyX3Rhc2tsZXQpOwogI2VsaWYgZGVmaW5lZChTQkVfSVNSX0lNTUVESUFURSkKLSAgICBjaS0+Y2lfbXVzeWNjX2lzcl90cS5yb3V0aW5lID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpIG11c3ljY19pbnRyX2JoX3Rhc2tsZXQ7Ci0gICAgY2ktPmNpX211c3ljY19pc3JfdHEuZGF0YSA9IGNpOworCWNpLT5jaV9tdXN5Y2NfaXNyX3RxLnJvdXRpbmUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKW11c3ljY19pbnRyX2JoX3Rhc2tsZXQ7CisJY2ktPmNpX211c3ljY19pc3JfdHEuZGF0YSA9IGNpOwogI2VuZGlmCiAKIAotICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYgKG5kZXYpIHx8Ci0gICAgICAgIChjNF9pbml0IChjaSwgKHVfY2hhciAqKSBmMCwgKHVfY2hhciAqKSBmMSkgIT0gU0JFX0RSVlJfU1VDQ0VTUykpCi0gICAgewotICAgICAgICBPU19rZnJlZSAobmV0ZGV2X3ByaXYobmRldikpOwotICAgICAgICBPU19rZnJlZSAobmRldik7Ci0gICAgICAgIGVycm9yX2ZsYWcgPSBFTk9ERVY7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogIGludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotICAgICAqICAgICAgICAgICAgICAgICAgdm9pZCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLSAgICAgKiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkZXZfaWQpOwotICAgICAqICB3aGVyZWluOgotICAgICAqICBpcnEgICAgICAtPiBUaGUgaW50ZXJydXB0IG51bWJlciB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC4KLSAgICAgKiAgaGFuZGxlciAgLT4gUG9pbnRlciB0byBoYW5kbGluZyBmdW5jdGlvbiBiZWluZyBpbnN0YWxsZWQuCi0gICAgICogIGZsYWdzICAgIC0+IEEgYml0IG1hc2sgb2Ygb3B0aW9ucyByZWxhdGVkIHRvIGludGVycnVwdCBtYW5hZ2VtZW50LgotICAgICAqICBkZXZfbmFtZSAtPiBTdHJpbmcgdXNlZCBpbiAvcHJvYy9pbnRlcnJ1cHRzIHRvIHNob3cgb3duZXIgb2YgaW50ZXJydXB0LgotICAgICAqICBkZXZfaWQgICAtPiBQb2ludGVyIChmb3Igc2hhcmVkIGludGVycnVwdCBsaW5lcykgdG8gcG9pbnQgdG8gaXRzIG93bgotICAgICAqICAgICAgICAgICAgICBwcml2YXRlIGRhdGEgYXJlYSAodG8gaWRlbnRpZnkgd2hpY2ggZGV2aWNlIGlzIGludGVycnVwdGluZykuCi0gICAgICoKLSAgICAgKiAgZXh0ZXJuIHZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJaWYgKHJlZ2lzdGVyX25ldGRldihuZGV2KSB8fAorCQkoYzRfaW5pdChjaSwgKHVfY2hhciAqKSBmMCwgKHVfY2hhciAqKSBmMSkgIT0gU0JFX0RSVlJfU1VDQ0VTUykpIHsKKwkJT1Nfa2ZyZWUobmV0ZGV2X3ByaXYobmRldikpOworCQlPU19rZnJlZShuZGV2KTsKKwkJZXJyb3JfZmxhZyA9IC1FTk9ERVY7CisJCXJldHVybiBOVUxMOworCX0KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqICBpbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKKwkgKiAgICAgICAgICAgICAgICAgIHZvaWQgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCisJICogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGV2X2lkKTsKKwkgKiAgd2hlcmVpbjoKKwkgKiAgaXJxICAgICAgLT4gVGhlIGludGVycnVwdCBudW1iZXIgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuCisJICogIGhhbmRsZXIgIC0+IFBvaW50ZXIgdG8gaGFuZGxpbmcgZnVuY3Rpb24gYmVpbmcgaW5zdGFsbGVkLgorCSAqICBmbGFncyAgICAtPiBBIGJpdCBtYXNrIG9mIG9wdGlvbnMgcmVsYXRlZCB0byBpbnRlcnJ1cHQgbWFuYWdlbWVudC4KKwkgKiAgZGV2X25hbWUgLT4gU3RyaW5nIHVzZWQgaW4gL3Byb2MvaW50ZXJydXB0cyB0byBzaG93IG93bmVyIG9mIGludGVycnVwdC4KKwkgKiAgZGV2X2lkICAgLT4gUG9pbnRlciAoZm9yIHNoYXJlZCBpbnRlcnJ1cHQgbGluZXMpIHRvIHBvaW50IHRvIGl0cyBvd24KKwkgKiAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhIGFyZWEgKHRvIGlkZW50aWZ5IHdoaWNoIGRldmljZSBpcyBpbnRlcnJ1cHRpbmcpLgorCSAqCisJICogIGV4dGVybiB2b2lkIGZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKHJlcXVlc3RfaXJxIChpcnEwLCAmYzRfbGludXhfaW50ZXJydXB0LAotICAgICAgICAgICAgICAgICAgICAgSVJRRl9TSEFSRUQsCi0gICAgICAgICAgICAgICAgICAgICBuZGV2LT5uYW1lLCBuZGV2KSkKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoIiVzOiBNVVNZQ0MgY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCBuZGV2LT5uYW1lLCBpcnEwKTsKLSAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXYgKG5kZXYpOwotICAgICAgICBPU19rZnJlZSAobmV0ZGV2X3ByaXYobmRldikpOwotICAgICAgICBPU19rZnJlZSAobmRldik7Ci0gICAgICAgIGVycm9yX2ZsYWcgPSBFSU87Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQorCWlmIChyZXF1ZXN0X2lycShpcnEwLCAmYzRfbGludXhfaW50ZXJydXB0LAorCQkJSVJRRl9TSEFSRUQsCisJCQluZGV2LT5uYW1lLCBuZGV2KSkgeworCQlwcl93YXJuaW5nKCIlczogTVVTWUNDIGNvdWxkIG5vdCBnZXQgaXJxOiAlZFxuIiwKKwkJCSAgIG5kZXYtPm5hbWUsIGlycTApOworCQl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwkJT1Nfa2ZyZWUobmV0ZGV2X3ByaXYobmRldikpOworCQlPU19rZnJlZShuZGV2KTsKKwkJZXJyb3JfZmxhZyA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KICNpZmRlZiBDT05GSUdfU0JFX1BNQ0M0X05DT01NCi0gICAgaWYgKHJlcXVlc3RfaXJxIChpcnExLCAmYzRfZWJ1c19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBuZGV2LT5uYW1lLCBuZGV2KSkKLSAgICB7Ci0gICAgICAgIHByX3dhcm5pbmcoIiVzOiBFQlVTIGNvdWxkIG5vdCBnZXQgaXJxOiAlZFxuIiwgaGktPmRldm5hbWUsIGlycTEpOwotICAgICAgICB1bnJlZ2lzdGVyX25ldGRldiAobmRldik7Ci0gICAgICAgIGZyZWVfaXJxIChpcnEwLCBuZGV2KTsKLSAgICAgICAgT1Nfa2ZyZWUgKG5ldGRldl9wcml2KG5kZXYpKTsKLSAgICAgICAgT1Nfa2ZyZWUgKG5kZXYpOwotICAgICAgICBlcnJvcl9mbGFnID0gRUlPOwotCXJldHVybiBOVUxMOwotICAgIH0KKwlpZiAocmVxdWVzdF9pcnEoaXJxMSwgJmM0X2VidXNfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgbmRldi0+bmFtZSwgbmRldikpIHsKKwkJcHJfd2FybmluZygiJXM6IEVCVVMgY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCBoaS0+ZGV2bmFtZSwgaXJxMSk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCQlmcmVlX2lycShpcnEwLCBuZGV2KTsKKwkJT1Nfa2ZyZWUobmV0ZGV2X3ByaXYobmRldikpOworCQlPU19rZnJlZShuZGV2KTsKKwkJZXJyb3JfZmxhZyA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KICNlbmRpZgogCi0gICAgLyogc2V0dXAgYm9hcmQgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gKi8KKwkvKiBzZXR1cCBib2FyZCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiAqLwogCi0gICAgewotICAgICAgICB1X2ludDMyX3QgICB0bXA7CisJeworCQl1X2ludDMyX3QgICB0bXA7CiAKLSAgICAgICAgaGR3X3NuX2dldCAoaGksIGJyZG5vKTsgICAgIC8qIGFsc28gc2V0cyBQUk9NIGZvcm1hdCB0eXBlIChwcm9tZm10KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIGxhdGVyIHVzYWdlICovCisJCS8qIGFsc28gc2V0cyBQUk9NIGZvcm1hdCB0eXBlIChwcm9tZm10KSBmb3IgbGF0ZXIgdXNhZ2UgKi8KKwkJaGR3X3NuX2dldChoaSwgYnJkbm8pOwogCi0gICAgICAgIHN3aXRjaCAoaGktPnByb21mbXQpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMToKLSAgICAgICAgICAgIG1lbWNweSAobmRldi0+ZGV2X2FkZHIsIChGTERfVFlQRTEgKikgKGhpLT5tZmdfaW5mby5wZnQxLlNlcmlhbCksIDYpOwotICAgICAgICAgICAgbWVtY3B5ICgmdG1wLCAoRkxEX1RZUEUxICopIChoaS0+bWZnX2luZm8ucGZ0MS5JZCksIDQpOyAgICAgLyogdW5hbGlnbmVkIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFjcXVpc2l0aW9uICovCi0gICAgICAgICAgICBjaS0+YnJkX2lkID0gY3B1X3RvX2JlMzIgKHRtcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUk9NX0ZPUk1BVF9UWVBFMjoKLSAgICAgICAgICAgIG1lbWNweSAobmRldi0+ZGV2X2FkZHIsIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCksIDYpOwotICAgICAgICAgICAgbWVtY3B5ICgmdG1wLCAoRkxEX1RZUEUyICopIChoaS0+bWZnX2luZm8ucGZ0Mi5JZCksIDQpOyAgICAgLyogdW5hbGlnbmVkIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFjcXVpc2l0aW9uICovCi0gICAgICAgICAgICBjaS0+YnJkX2lkID0gY3B1X3RvX2JlMzIgKHRtcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNpLT5icmRfaWQgPSAwOwotICAgICAgICAgICAgbWVtc2V0IChuZGV2LT5kZXZfYWRkciwgMCwgNik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCQlzd2l0Y2ggKGhpLT5wcm9tZm10KSB7CisJCWNhc2UgUFJPTV9GT1JNQVRfVFlQRTE6CisJCQltZW1jcHkobmRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgKEZMRF9UWVBFMSAqKSAoaGktPm1mZ19pbmZvLnBmdDEuU2VyaWFsKSwgNik7CisJCQkvKiB1bmFsaWduZWQgZGF0YSBhY3F1aXNpdGlvbiAqLworCQkJbWVtY3B5KCZ0bXAsIChGTERfVFlQRTEgKikgKGhpLT5tZmdfaW5mby5wZnQxLklkKSwgNCk7CisJCQljaS0+YnJkX2lkID0gY3B1X3RvX2JlMzIodG1wKTsKKwkJCWJyZWFrOworCQljYXNlIFBST01fRk9STUFUX1RZUEUyOgorCQkJbWVtY3B5KG5kZXYtPmRldl9hZGRyLAorCQkJICAgICAgIChGTERfVFlQRTIgKikgKGhpLT5tZmdfaW5mby5wZnQyLlNlcmlhbCksIDYpOworCQkJLyogdW5hbGlnbmVkIGRhdGEgYWNxdWlzaXRpb24gKi8KKwkJCW1lbWNweSgmdG1wLCAoRkxEX1RZUEUyICopIChoaS0+bWZnX2luZm8ucGZ0Mi5JZCksIDQpOworCQkJY2ktPmJyZF9pZCA9IGNwdV90b19iZTMyKHRtcCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNpLT5icmRfaWQgPSAwOworCQkJbWVtc2V0KG5kZXYtPmRldl9hZGRyLCAwLCA2KTsKKwkJCWJyZWFrOworCQl9CiAKICNpZiAxCi0gICAgICAgIHNiZWlkX3NldF9oZHdiaWQgKGNpKTsgICAgICAvKiByZXF1aXJlcyBiaWQgdG8gYmUgcHJlc2V0ICovCisJCS8qIHJlcXVpcmVzIGJpZCB0byBiZSBwcmVzZXQgKi8KKwkJc2JlaWRfc2V0X2hkd2JpZChjaSk7CiAjZWxzZQotICAgICAgICBzYmVpZF9zZXRfYmR0eXBlIChjaSk7ICAgICAgLyogcmVxdWlyZXMgaGR3X2JpZCB0byBiZSBwcmVzZXQgKi8KKwkJLyogcmVxdWlyZXMgaGR3X2JpZCB0byBiZSBwcmVzZXQgKi8KKwkJc2JlaWRfc2V0X2JkdHlwZShjaSk7CiAjZW5kaWYKLQotICAgIH0KKwl9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgIHNiZWNvbV9wcm9jX2JyZF9pbml0IChjaSk7CisJc2JlY29tX3Byb2NfYnJkX2luaXQoY2kpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChTQkVfSVNSX1RBU0tMRVQpCi0gICAgdGFza2xldF9lbmFibGUgKCZjaS0+Y2lfbXVzeWNjX2lzcl90YXNrbGV0KTsKKwl0YXNrbGV0X2VuYWJsZSgmY2ktPmNpX211c3ljY19pc3JfdGFza2xldCk7CiAjZW5kaWYKIAotCi0gICAgaWYgKChlcnJvcl9mbGFnID0gYzRfaW5pdDIgKGNpKSkgIT0gU0JFX0RSVlJfU1VDQ0VTUykKLSAgICB7CisJZXJyb3JfZmxhZyA9IGM0X2luaXQyKGNpKTsKKwlpZiAoZXJyb3JfZmxhZyAhPSBTQkVfRFJWUl9TVUNDRVNTKSB7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLSAgICAgICAgc2JlY29tX3Byb2NfYnJkX2NsZWFudXAgKGNpKTsKKwkJc2JlY29tX3Byb2NfYnJkX2NsZWFudXAoY2kpOwogI2VuZGlmCi0gICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2IChuZGV2KTsKLSAgICAgICAgZnJlZV9pcnEgKGlycTEsIG5kZXYpOwotICAgICAgICBmcmVlX2lycSAoaXJxMCwgbmRldik7Ci0gICAgICAgIE9TX2tmcmVlIChuZXRkZXZfcHJpdihuZGV2KSk7Ci0gICAgICAgIE9TX2tmcmVlIChuZGV2KTsKLQlyZXR1cm4gTlVMTDsJCS8qIGZhaWx1cmUsIGVycm9yX2ZsYWcgaXMgc2V0ICovCi0gICAgfQotICAgIHJldHVybiBuZGV2OworCQl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwkJZnJlZV9pcnEoaXJxMSwgbmRldik7CisJCWZyZWVfaXJxKGlycTAsIG5kZXYpOworCQlPU19rZnJlZShuZXRkZXZfcHJpdihuZGV2KSk7CisJCU9TX2tmcmVlKG5kZXYpOworCQkvKiBmYWlsdXJlLCBlcnJvcl9mbGFnIGlzIHNldCAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG5kZXY7CiB9CiAKIHN0YXRpYyBpbnQgIF9faW5pdAotYzRfbW9kX2luaXQgKHZvaWQpCitjNF9tb2RfaW5pdCh2b2lkKQogewotICAgIGludCAgICAgICAgIHJ0bjsKKwlpbnQgICAgICAgICBydG47CiAKLSAgICBwcl93YXJuaW5nKCIlc1xuIiwgcG1jYzRfT1NTSV9yZWxlYXNlKTsKLSAgICBpZiAoKHJ0biA9IGM0aHdfYXR0YWNoX2FsbCAoKSkpCi0gICAgICAgIHJldHVybiAtcnRuOyAgICAgICAgICAgICAgICAvKiBpbnN0YWxsYXRpb24gZmFpbHVyZSAtIHNlZSBzeXN0ZW0gbG9nICovCisJcnRuID0gYzRod19hdHRhY2hfYWxsKCk7CisJaWYgKHJ0bikKKwkJcmV0dXJuIC1ydG47IC8qIGluc3RhbGxhdGlvbiBmYWlsdXJlIC0gc2VlIHN5c3RlbSBsb2cgKi8KIAotICAgIC8qIGhvdXNla2VlcGluZyBub3RpZmljYXRpb25zICovCi0gICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgIT0gbG9nX2xldmVsX2RlZmF1bHQpCi0gICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9sb2dfbGV2ZWw+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKLSAgICAgICAgICAgICAgICBsb2dfbGV2ZWxfZGVmYXVsdCwgY3h0MWUxX2xvZ19sZXZlbCk7Ci0gICAgICAgaWYgKGN4dDFlMV9tYXhfbXJ1ICE9IG1heF9tcnVfZGVmYXVsdCkKLSAgICAgICAgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXJ1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X21ydV9kZWZhdWx0LCBjeHQxZTFfbWF4X21ydSk7Ci0gICAgICAgaWYgKGN4dDFlMV9tYXhfbXR1ICE9IG1heF9tdHVfZGVmYXVsdCkKLSAgICAgICAgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXR1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X210dV9kZWZhdWx0LCBjeHQxZTFfbWF4X210dSk7Ci0gICAgaWYgKG1heF9yeGRlc2NfdXNlZCAhPSBtYXhfcnhkZXNjX2RlZmF1bHQpCi0gICAgewotICAgICAgICBpZiAobWF4X3J4ZGVzY191c2VkID4gMjAwMCkKLSAgICAgICAgICAgIG1heF9yeGRlc2NfdXNlZCA9IDIwMDA7IC8qIG91dC1vZi1ib3VuZHMgcmVzZXQgKi8KLSAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8bWF4X3J4ZGVzY191c2VkPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgbWF4X3J4ZGVzY19kZWZhdWx0LCBtYXhfcnhkZXNjX3VzZWQpOwotICAgIH0KLSAgICBpZiAobWF4X3R4ZGVzY191c2VkICE9IG1heF90eGRlc2NfZGVmYXVsdCkKLSAgICB7Ci0gICAgICAgIGlmIChtYXhfdHhkZXNjX3VzZWQgPiAxMDAwKQotICAgICAgICAgICAgbWF4X3R4ZGVzY191c2VkID0gMTAwMDsgLyogb3V0LW9mLWJvdW5kcyByZXNldCAqLwotICAgICAgICBwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxtYXhfdHhkZXNjX3VzZWQ+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKLSAgICAgICAgICAgICAgICBtYXhfdHhkZXNjX2RlZmF1bHQsIG1heF90eGRlc2NfdXNlZCk7Ci0gICAgfQotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5zdGFsbGF0aW9uIHN1Y2Nlc3MgKi8KKwkvKiBob3VzZWtlZXBpbmcgbm90aWZpY2F0aW9ucyAqLworCWlmIChjeHQxZTFfbG9nX2xldmVsICE9IGxvZ19sZXZlbF9kZWZhdWx0KQorCQlwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxjeHQxZTFfbG9nX2xldmVsPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCisJCQlsb2dfbGV2ZWxfZGVmYXVsdCwgY3h0MWUxX2xvZ19sZXZlbCk7CisJaWYgKGN4dDFlMV9tYXhfbXJ1ICE9IG1heF9tcnVfZGVmYXVsdCkKKwkJcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8Y3h0MWUxX21heF9tcnU+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKwkJCW1heF9tcnVfZGVmYXVsdCwgY3h0MWUxX21heF9tcnUpOworCWlmIChjeHQxZTFfbWF4X210dSAhPSBtYXhfbXR1X2RlZmF1bHQpCisJCXByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXR1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCisJCQltYXhfbXR1X2RlZmF1bHQsIGN4dDFlMV9tYXhfbXR1KTsKKwlpZiAobWF4X3J4ZGVzY191c2VkICE9IG1heF9yeGRlc2NfZGVmYXVsdCkgeworCQlpZiAobWF4X3J4ZGVzY191c2VkID4gMjAwMCkKKwkJCW1heF9yeGRlc2NfdXNlZCA9IDIwMDA7IC8qIG91dC1vZi1ib3VuZHMgcmVzZXQgKi8KKwkJcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8bWF4X3J4ZGVzY191c2VkPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCisJCQltYXhfcnhkZXNjX2RlZmF1bHQsIG1heF9yeGRlc2NfdXNlZCk7CisJfQorCWlmIChtYXhfdHhkZXNjX3VzZWQgIT0gbWF4X3R4ZGVzY19kZWZhdWx0KSB7CisJCWlmIChtYXhfdHhkZXNjX3VzZWQgPiAxMDAwKQorCQkJbWF4X3R4ZGVzY191c2VkID0gMTAwMDsgLyogb3V0LW9mLWJvdW5kcyByZXNldCAqLworCQlwcl9pbmZvKCJOT1RFOiBkcml2ZXIgcGFyYW1ldGVyIDxtYXhfdHhkZXNjX3VzZWQ+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKwkJCW1heF90eGRlc2NfZGVmYXVsdCwgbWF4X3R4ZGVzY191c2VkKTsKKwl9CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnN0YWxsYXRpb24gc3VjY2VzcyAqLwogfQogCiAKQEAgLTExNDAsMzEgKzExMTcsMjkgQEAKICAgKi8KIAogc3RhdGljIHZvaWQgX19leGl0Ci1jbGVhbnVwX2hkbGMgKHZvaWQpCitjbGVhbnVwX2hkbGModm9pZCkKIHsKLSAgICBoZHdfaW5mb190ICpoaTsKLSAgICBjaV90ICAgICAgICpjaTsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLSAgICBpbnQgICAgICAgICBpLCBqLCBrOworCWhkd19pbmZvX3QgKmhpOworCWNpX3QgICAgICAgKmNpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCWludCAgICAgICAgIGksIGosIGs7CiAKLSAgICBmb3IgKGkgPSAwLCBoaSA9IGhkd19pbmZvOyBpIDwgTUFYX0JPQVJEUzsgaSsrLCBoaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGhpLT5uZGV2KSAgICAgICAgICAgICAgIC8qIGEgYm9hcmQgaGFzIGJlZW4gYXR0YWNoZWQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgY2kgPSAoY2lfdCAqKShuZXRkZXZfcHJpdihoaS0+bmRldikpOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNpLT5tYXhfcG9ydDsgaisrKQotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBNVVNZQ0NfTkNIQU5TOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmRldiA9IGNpLT5wb3J0W2pdLmNoYW5ba10tPnVzZXIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb19kZWx1c2VyIChuZGV2LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCWZvciAoaSA9IDAsIGhpID0gaGR3X2luZm87IGkgPCBNQVhfQk9BUkRTOyBpKyssIGhpKyspIHsKKwkJaWYgKGhpLT5uZGV2KSB7ICAgICAgICAgIC8qIGEgYm9hcmQgaGFzIGJlZW4gYXR0YWNoZWQgKi8KKwkJCWNpID0gKGNpX3QgKikobmV0ZGV2X3ByaXYoaGktPm5kZXYpKTsKKwkJCWZvciAoaiA9IDA7IGogPCBjaS0+bWF4X3BvcnQ7IGorKykKKwkJCQlmb3IgKGsgPSAwOyBrIDwgTVVTWUNDX05DSEFOUzsgaysrKSB7CisJCQkJCW5kZXYgPSBjaS0+cG9ydFtqXS5jaGFuW2tdLT51c2VyOworCQkJCQlpZiAobmRldikKKwkJCQkJCWRvX2RlbHVzZXIobmRldiwgMCk7CisJCQkJfQorCQl9CisJfQogfQogCiAKIHN0YXRpYyB2b2lkIF9fZXhpdAotYzRfbW9kX3JlbW92ZSAodm9pZCkKK2M0X21vZF9yZW1vdmUodm9pZCkKIHsKIAljbGVhbnVwX2hkbGMoKTsgICAgICAgICAgICAvKiBkZWxldGUgYW55IG1pc3NlZCBjaGFubmVscyAqLwogCWNsZWFudXBfZGV2cygpOwpAQCAtMTE3MywxMyArMTE0OCwxMyBAQAogCXByX2luZm8oIlNCRSAtIGRyaXZlciByZW1vdmVkLlxuIik7CiB9CiAKLW1vZHVsZV9pbml0IChjNF9tb2RfaW5pdCk7Ci1tb2R1bGVfZXhpdCAoYzRfbW9kX3JlbW92ZSk7Cittb2R1bGVfaW5pdChjNF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChjNF9tb2RfcmVtb3ZlKTsKIAotTU9EVUxFX0FVVEhPUiAoIlNCRSBUZWNobmljYWwgU2VydmljZXMgPHN1cHBvcnRAc2JlaS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04gKCJ3YW5QQ0ktQ3hUMUUxIEdlbmVyaWMgSERMQyBXQU4gRHJpdmVyIG1vZHVsZSIpOworTU9EVUxFX0FVVEhPUigiU0JFIFRlY2huaWNhbCBTZXJ2aWNlcyA8c3VwcG9ydEBzYmVpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigid2FuUENJLUN4VDFFMSBHZW5lcmljIEhETEMgV0FOIERyaXZlciBtb2R1bGUiKTsKICNpZmRlZiBNT0RVTEVfTElDRU5TRQotTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKICNlbmRpZgogCiAvKioqICBFbmQtb2YtRmlsZSAgKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMKaW5kZXggN2EzYTMwYy4uN2I0ZjZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jCkBAIC00Miw3ICs0Miw2IEBACiAvKiBnbG9iYWwgZHJpdmVyIHZhcmlhYmxlcyAqLwogZXh0ZXJuIGNpX3QgKmM0X2xpc3Q7CiBleHRlcm4gaW50ICBkcnZyX3N0YXRlOwotZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIAogZXh0ZXJuIGludCAgY3h0MWUxX21heF9tcnU7CiBleHRlcm4gaW50ICBjeHQxZTFfbWF4X210dTsKQEAgLTIxNyw3ICsyMTYsOCBAQAogCW1heF9pbnRjbnQgPSAwOyAgICAgICAgICAgICAvKiByZXNldCBjb3VudGVyICovCiAgICAgfQogCi0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oZHVtbXksIGNoYW4pKSkgeworICAgIGNoID0gc2RfZmluZF9jaGFuKGR1bW15LCBjaGFuKTsKKyAgICBpZiAoIWNoKSB7CiAJcHJfaW5mbygiPj4gbXVzeWNjX2R1bXBfcmluZzogY2hhbm5lbCAlZCBub3QgdXAuXG4iLCBjaGFuKTsKIAlyZXR1cm4gRU5PRU5UOwogICAgIH0KQEAgLTEwNDQsMTcgKzEwNDQsMTkgQEAKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiogQ09ORklHX1NCRV9XQU4yNTZUM19OQ09NTSAqKiovCiAKIAkgICAgewotCQlpZiAoKG0yID0gT1NfbWVtX3Rva2VuX2FsbG9jKGN4dDFlMV9tYXhfbXJ1KSkpIHsKLQkJICAgIC8qIHN1YnN0aXR1dGUgdGhlIG1idWYrY2x1c3RlciAqLwotCQkgICAgbWQtPm1lbV90b2tlbiA9IG0yOwotCQkgICAgbWQtPmRhdGEgPSBjcHVfdG9fbGUzMihPU192dG9waHlzKE9TX21lbV90b2tlbl9kYXRhKG0yKSkpOworCQltMiA9IE9TX21lbV90b2tlbl9hbGxvYyhjeHQxZTFfbWF4X21ydSk7CisJCWlmIChtMikgeworCQkJLyogc3Vic3RpdHV0ZSB0aGUgbWJ1ZitjbHVzdGVyICovCisJCQltZC0+bWVtX3Rva2VuID0gbTI7CisJCQltZC0+ZGF0YSA9IGNwdV90b19sZTMyKE9TX3Z0b3BoeXMoCisJCQkJT1NfbWVtX3Rva2VuX2RhdGEobTIpKSk7CiAKLQkJICAgIC8qIHBhc3MgdGhlIHJlY2VpdmVkIG1idWYgdXB3YXJkICovCi0JCSAgICBzZF9yZWN2X2NvbnN1bWUobSwgc3RhdHVzICYgTEVOR1RIX01BU0ssIGNoLT51c2VyKTsKLQkJICAgIGNoLT5zLnJ4X3BhY2tldHMrKzsKLQkJICAgIGNoLT5zLnJ4X2J5dGVzICs9IHN0YXR1cyAmIExFTkdUSF9NQVNLOworCQkJLyogcGFzcyB0aGUgcmVjZWl2ZWQgbWJ1ZiB1cHdhcmQgKi8KKwkJCXNkX3JlY3ZfY29uc3VtZShtLCBzdGF0dXMgJiBMRU5HVEhfTUFTSywgY2gtPnVzZXIpOworCQkJY2gtPnMucnhfcGFja2V0cysrOworCQkJY2gtPnMucnhfYnl0ZXMgKz0gc3RhdHVzICYgTEVOR1RIX01BU0s7CiAJCX0gZWxzZQotCQkgICAgY2gtPnMucnhfZHJvcHBlZCsrOworCQkJY2gtPnMucnhfZHJvcHBlZCsrOwogCSAgICB9CiAJfSBlbHNlIGlmIChlcnJvciA9PSBFUlJfRkNTKQogCSAgICBjaC0+cy5yeF9jcmNfZXJyb3JzKys7CkBAIC0xNTQ1LDggKzE1NDcsOSBAQAogICAgIG1jaF90ICAgICAgKmNoOwogICAgIGludCAgICAgICAgIGksIGdjaGFuOwogCi0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oZHVtbXksIGNoYW5udW0pKSkKLQlyZXR1cm4gRUlOVkFMOworICAgIGNoID0gc2RfZmluZF9jaGFuKGR1bW15LCBjaGFubnVtKTsKKyAgICBpZiAoIWNoKQorCXJldHVybiAtRUlOVkFMOwogICAgIHBpID0gY2gtPnVwOwogICAgIGdjaGFuID0gY2gtPmdjaGFuOwogCkBAIC0xNTg5LDYgKzE1OTIsOCBAQAogI2VuZGlmCiAKIAorI2lmIDAKKy8qIFRPRE86IGRldGVybWluZSBpZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCBub3QgYmUgbmVlZGVkIGFuZCBjYW4gYmUgcmVtb3ZlZCAqLwogaW50CiBtdXN5Y2NfZGVsX2NoYW4oY2lfdCAqY2ksIGludCBjaGFubnVtKQogewpAQCAtMTU5Niw3ICsxNjAxLDggQEAKIAogICAgIGlmICgoY2hhbm51bSA8IDApIHx8IChjaGFubnVtID49IChNVVNZQ0NfTlBPUlRTICogTVVTWUNDX05DSEFOUykpKSAgLyogc2FuaXR5IGNoayBwYXJhbSAqLwogCXJldHVybiBFQ0hSTkc7Ci0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oY2ksIGNoYW5udW0pKSkKKyAgICBjaCA9IHNkX2ZpbmRfY2hhbihjaSwgY2hhbm51bSk7CisgICAgaWYgKCFjaCkKIAlyZXR1cm4gRU5PRU5UOwogICAgIGlmIChjaC0+c3RhdGUgPT0gVVApCiAJbXVzeWNjX2NoYW5fZG93bihjaSwgY2hhbm51bSk7CkBAIC0xNjEyLDEyICsxNjE4LDE0IEBACiAKICAgICBpZiAoY2hhbm51bSA8IDAgfHwgY2hhbm51bSA+PSAoTVVTWUNDX05QT1JUUyAqIE1VU1lDQ19OQ0hBTlMpKSAgICAgIC8qIHNhbml0eSBjaGsgcGFyYW0gKi8KIAlyZXR1cm4gRUNIUk5HOwotICAgIGlmICghKGNoID0gc2RfZmluZF9jaGFuKGNpLCBjaGFubnVtKSkpCisgICAgY2ggPSBzZF9maW5kX2NoYW4oY2ksIGNoYW5udW0pOworICAgIGlmICghY2gpCiAJcmV0dXJuIEVOT0VOVDsKIAogICAgIG1lbXNldCgmY2gtPnMsIDAsIHNpemVvZihzdHJ1Y3Qgc2JlY29tX2NoYW5fc3RhdHMpKTsKICAgICByZXR1cm4gMDsKIH0KKyNlbmRpZgogCiAKIGludApAQCAtMTYzMiw3ICsxNjQwLDggQEAKICAgICBpbnQgICAgICAgICB0eGRfbmVlZF9jbnQ7CiAgICAgdV9pbnQzMl90ICAgbGVuOwogCi0gICAgaWYgKCEoY2ggPSBzZF9maW5kX2NoYW4oY2ksIGNoYW5udW0pKSkKKyAgICBjaCA9IHNkX2ZpbmRfY2hhbihjaSwgY2hhbm51bSk7CisgICAgaWYgKCFjaCkKIAlyZXR1cm4gLUVOT0VOVDsKIAogICAgIGlmIChjaS0+c3RhdGUgIT0gQ19SVU5OSU5HKSAgICAgLyogZnVsbCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBhdmFpbGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvb3NzaVJlbGVhc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvb3NzaVJlbGVhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YTkwMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL29zc2lSZWxlYXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBvc3NpUmVsZWFzZS5jIC0KLSAqCi0gKiBUaGlzIHN0cmluZyB3aWxsIGJlIGVtYmVkZGVkIGludG8gdGhlIGV4ZWN1dGFibGUgYW5kIHdpbGwgdHJhY2sgdGhlCi0gKiByZWxlYXNlLiAgVGhlIGVtYmVkZGVkIHN0cmluZyBtYXkgYmUgZGlzcGxheWVkIHVzaW5nIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogICAgICBzdHJpbmdzIDxmaWxlbmFtZT4gfCBncmVwIFwkUmVsCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDggIE9uZSBTdG9wIFN5c3RlbXMsIEluYy4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBjb250YWN0IHZpYSBlbWFpbDogc3VwcG9ydEBvbmVzdG9wc3lzdGVtcy5jb20KLSAqIE9uZSBTdG9wIFN5c3RlbXMsIEluYy4gIEVzY29uZGlkbywgQ2FsaWZvcm5pYSAgVS5TLkEuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLWNoYXIgcG1jYzRfT1NTSV9yZWxlYXNlW10gPSAiJFJlbGVhc2U6IFBNQ0M0XzNfMUIsICBDb3B5cmlnaHQgKGMpIDIwMDggT25lIFN0b3AgU3lzdGVtcyQiOwotCi0vKioqICBFbmQtb2YtRmlsZSAgKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWM5M3g2X2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWM5M3g2X2VlcHJvbS5jCmluZGV4IDEzN2I2M2MuLjc4Y2MxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jOTN4Nl9lZXByb20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtYzkzeDZfZWVwcm9tLmMKQEAgLTkwLDcgKzkwLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAotc2hvcnQgICAgICAgbWZnX3RlbXBsYXRlW3NpemVvZiAoRkxEX1RZUEUyKV0gPQorc3RhdGljIHU4IG1mZ190ZW1wbGF0ZVtzaXplb2YoRkxEX1RZUEUyKV0gPQogewogICAgIFBST01fRk9STUFUX1RZUEUyLCAgICAgICAgICAvKiB0eXBlOyAqLwogICAgIDB4MDAsIDB4MUEsICAgICAgICAgICAgICAgICAvKiBsZW5ndGhbMl07ICovCkBAIC00OTEsMTMgKzQ5MSwxMSBAQAogICAgIFBST01GT1JNQVQgIGJ1ZmZlcjsgICAgICAgICAvKiBNZW1vcnkgaW1hZ2Ugb2Ygc3RydWN0dXJlICovCiAgICAgdV9pbnQzMl90ICAgY3JjOyAgICAgICAgICAgIC8qIENSQyBvZiBzdHJ1Y3R1cmUgKi8KICAgICB0aW1lX3QgICAgICBjcmVhdGVUaW1lOwotICAgIGludCAgICAgICAgIGk7CiAKICAgICBjcmVhdGVUaW1lID0gZ2V0X3NlY29uZHMgKCk7CiAKICAgICAvKiB1c2UgdGVtcGxhdGUgZGF0YSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKEZMRF9UWVBFMik7ICsraSkKLSAgICAgICAgYnVmZmVyLmJ5dGVzW2ldID0gbWZnX3RlbXBsYXRlW2ldOworICAgIG1lbWNweSgmYnVmZmVyLmZsZFR5cGUyLCBtZmdfdGVtcGxhdGUsIHNpemVvZihidWZmZXIuZmxkVHlwZTIpKTsKIAogICAgIC8qIFVwZGF0ZSBzZXJpYWwgbnVtYmVyIGZpZWxkIGluIGJ1ZmZlciAqLwogICAgIHBtY1NldEJ1ZmZWYWx1ZSAoJmJ1ZmZlci5mbGRUeXBlMi5TZXJpYWxbM10sIHNlcmlhbE51bSwgMyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0LmggYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0LmgKaW5kZXggMDAzZWI4Ni4uYjRiNWU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzQuaApAQCAtOTYsNyArOTYsNiBAQAogdm9pZCAgICAgICAgc2JlaWRfc2V0X2hkd2JpZCAoY2lfdCAqY2kpOwogdV9pbnQzMl90ICAgc2JlQ3JjICh1X2ludDhfdCAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90ICopOwogCi12b2lkICAgICAgICBWTUVUUk9fVFJBQ0UgKHZvaWQgKik7ICAgICAgIC8qIHB1dCBkYXRhIGludG8gOCBMRURzICovCiB2b2lkICAgICAgICBWTUVUUk9fVFJJR0dFUiAoY2lfdCAqLCBpbnQpOyAgICAgICAvKiBOb3RlOiBpbnQgPSAwKGRlZmF1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aHJ1IDE1ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jCmluZGV4IGE5ZDk1NzUuLjYyMWE3MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYwpAQCAtMTEyLDEyICsxMTIsMTIgQEAKICAgICAgICAgZm9yIChwb3J0bnVtID0gMDsgcG9ydG51bSA8IGNpLT5tYXhfcG9ydDsgcG9ydG51bSsrKQogICAgICAgICAgICAgZm9yIChnY2hhbiA9IDA7IGdjaGFuIDwgTVVTWUNDX05DSEFOUzsgZ2NoYW4rKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoID0gY2ktPnBvcnRbcG9ydG51bV0uY2hhbltnY2hhbl0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjaC0+c3RhdGUgIT0gVU5BU1NJR05FRCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChjaC0+Y2hhbm51bSA9PSBjaGFubnVtKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgICAgICAgICB9CisJCWNoID0gY2ktPnBvcnRbcG9ydG51bV0uY2hhbltnY2hhbl07CisJCWlmIChjaCkgeworCQkJaWYgKChjaC0+c3RhdGUgIT0gVU5BU1NJR05FRCkgJiYKKwkJCSAgIChjaC0+Y2hhbm51bSA9PSBjaGFubnVtKSkKKwkJCQlyZXR1cm4gY2g7CisJCX0KICAgICAgICAgICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTY2OCw4ICs2NjgsOSBAQAogICAgIHN0YXR1c190ICAgIHJldDsKIAogICAgIC8qIFBPUlQgUE9JTlQ6IHRoaXMgcm91dGluZSBnZW5lcmF0ZXMgZmlyc3QgaW50ZXJydXB0ICovCi0gICAgaWYgKChyZXQgPSBtdXN5Y2NfaW5pdCAoY2kpKSAhPSBTQkVfRFJWUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IG11c3ljY19pbml0KGNpKTsKKwlpZiAocmV0ICE9IFNCRV9EUlZSX1NVQ0NFU1MpCisJCXJldHVybiByZXQ7CiAKICNpZiAwCiAgICAgY2ktPnAuZnJhbWluZ190eXBlID0gRlJBTUlOR19DQlA7CkBAIC03NTYsNyArNzU3LDcgQEAKICAgICB2b2xhdGlsZSB1X2ludDMyX3QgZGF0YTsKIAogICAgIGlmIChwcC0+cG9ydG51bSA+PSBjaS0+bWF4X3BvcnQpLyogc2FuaXR5IGNoZWNrICovCi0gICAgICAgIHJldHVybiBFTlhJTzsKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsKIAogICAgIGNvbWV0ID0gY2ktPnBvcnRbcHAtPnBvcnRudW1dLmNvbWV0YmFzZTsKICAgICBkYXRhID0gcGNpX3JlYWRfMzIgKCh1X2ludDMyX3QgKikgY29tZXQgKyBwcC0+cG9ydF9tb2RlKSAmIDB4ZmY7CkBAIC04NDUsNyArODQ2LDcgQEAKICAgICAgKi8KICAgICBwb3J0bnVtID0gKG1jcC0+b2Zmc2V0ICUgMHg2MDAwKSAvIDB4ODAwOwogICAgIGlmIChwb3J0bnVtID49IGNpLT5tYXhfcG9ydCkKLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogICAgIHBpID0gJmNpLT5wb3J0W3BvcnRudW1dOwogICAgIGlmIChtY3AtPm9mZnNldCA+PSAweDYwMDApCiAgICAgICAgIG9mZnNldCArPSAweDYwMDA7ICAgICAgICAgICAvKiBwdXQgYmFjayBpbiBNc2dDZmdEZXNjIGFkZHJlc3Mgb2Zmc2V0ICovCkBAIC04OTQsNyArODk1LDcgQEAKIGM0X2dldF9wb3J0IChjaV90ICpjaSwgaW50IHBvcnRudW0pCiB7CiAgICAgaWYgKHBvcnRudW0gPj0gY2ktPm1heF9wb3J0KSAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogCiAgICAgU0RfU0VNX1RBS0UgKCZjaS0+c2VtX3dkYnVzeSwgIl93ZF8iKTsgICAgICAvKiBvbmx5IDEgdGhydSBoZXJlLCBwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkICovCkBAIC05MTUsNyArOTE2LDcgQEAKICAgICBpbnQgICAgICAgICBpOwogCiAgICAgaWYgKHBvcnRudW0gPj0gY2ktPm1heF9wb3J0KSAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgcmV0dXJuIEVOWElPOworICAgICAgICByZXR1cm4gLUVOWElPOwogCiAgICAgcGkgPSAmY2ktPnBvcnRbcG9ydG51bV07CiAgICAgcHAgPSAmY2ktPnBvcnRbcG9ydG51bV0ucDsKQEAgLTkyNywxNSArOTI4LDE1IEBACiAgICAgICAgICAgICAgICAgcG9ydG51bSwgZTFtb2RlLCBwaS0+b3BlbmNoYW5zKTsKICAgICB9CiAgICAgaWYgKHBpLT5vcGVuY2hhbnMpCi0gICAgICAgIHJldHVybiBFQlVTWTsgICAgICAgICAgICAgICAvKiBncm91cCBuZWVkcyBpbml0aWFsaXphdGlvbiBvbmx5IGZvcgorICAgICAgICByZXR1cm4gLUVCVVNZOyAgICAgICAgICAgICAgIC8qIGdyb3VwIG5lZWRzIGluaXRpYWxpemF0aW9uIG9ubHkgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBjaGFubmVsIG9mIGEgZ3JvdXAgKi8KIAogICAgIHsKICAgICAgICAgc3RhdHVzX3QgICAgcmV0OwogCi0gICAgICAgIGlmICgocmV0ID0gYzRfd3FfcG9ydF9pbml0IChwaSkpKSAgICAgICAvKiBjcmVhdGUvaW5pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd29ya3F1ZXVlX3N0cnVjdCAqLwotICAgICAgICAgICAgcmV0dXJuIHJldDsKKwlyZXQgPSBjNF93cV9wb3J0X2luaXQocGkpOworCWlmIChyZXQpICAgICAgIC8qIGNyZWF0ZS9pbml0IHdvcmtxdWV1ZV9zdHJ1Y3QgKi8KKwkJcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBpbml0X2NvbWV0IChjaSwgcGktPmNvbWV0YmFzZSwgcHAtPnBvcnRfbW9kZSwgMSAvKiBjbG9ja21hc3RlciA9PSB0cnVlICovICwgcHAtPnBvcnRQKTsKQEAgLTEwMTgsMTAgKzEwMTksMTAgQEAKICAgICBpbnQgICAgICAgICBnY2hhbjsKIAogICAgIGlmIChjNF9maW5kX2NoYW4gKGNoYW5udW0pKSAgICAgLyogYSBuZXcgY2hhbm5lbCBzaG91bGRuJ3QgYWxyZWFkeSBleGlzdCAqLwotICAgICAgICByZXR1cm4gRUVYSVNUOworICAgICAgICByZXR1cm4gLUVFWElTVDsKIAogICAgIGlmIChwb3J0bnVtID49IGNpLT5tYXhfcG9ydCkgICAgLyogc2FuaXR5IGNoZWNrICovCi0gICAgICAgIHJldHVybiBFTlhJTzsKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsKIAogICAgIHBpID0gJihjaS0+cG9ydFtwb3J0bnVtXSk7CiAgICAgLyogZmluZCBhbnkgYXZhaWxhYmxlIGNoYW5uZWwgd2l0aGluIHRoaXMgcG9ydCAqLwpAQCAtMTAzMiw3ICsxMDMzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoZ2NoYW4gPT0gTVVTWUNDX05DSEFOUykgICAgIC8qIGV4aGF1c3RlZCB0YWJsZSwgYWxsIHdlcmUgYXNzaWduZWQgKi8KLSAgICAgICAgcmV0dXJuIEVORklMRTsKKyAgICAgICAgcmV0dXJuIC1FTkZJTEU7CiAKICAgICBjaC0+dXAgPSBwaTsKIApAQCAtMTA1NSw4ICsxMDU2LDkgQEAKICAgICB7CiAgICAgICAgIHN0YXR1c190ICAgIHJldDsKIAotICAgICAgICBpZiAoKHJldCA9IGM0X3drX2NoYW5faW5pdCAocGksIGNoKSkpCi0gICAgICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IGM0X3drX2NoYW5faW5pdChwaSwgY2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLyogc2F2ZSBvZmYgaW50ZXJmYWNlIGFzc2lnbm1lbnRzIHdoaWNoIGJvdW5kIGEgYm9hcmQgKi8KQEAgLTEwNzksOCArMTA4MSwxMCBAQAogewogICAgIG1jaF90ICAgICAgKmNoOwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogICAgIGlmIChjaC0+c3RhdGUgPT0gVVApCiAgICAgICAgIG11c3ljY19jaGFuX2Rvd24gKChjaV90ICopIDAsIGNoYW5udW0pOwogICAgIGNoLT5zdGF0ZSA9IFVOQVNTSUdORUQ7CkBAIC0xMDk1LDggKzEwOTksOSBAQAogewogICAgIG1jaF90ICAgICAgKmNoOwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogICAgIG1lbXNldCAoJmNoLT5zLCAwLCBzaXplb2YgKHN0cnVjdCBzYmVjb21fY2hhbl9zdGF0cykpOwogICAgIHJldHVybiAwOwpAQCAtMTEwOSwxOSArMTExNCwyMCBAQAogICAgIG1jaF90ICAgICAgKmNoOwogICAgIGludCAgICAgICAgIGksIHggPSAwOwogCi0gICAgaWYgKCEoY2ggPSBjNF9maW5kX2NoYW4gKGNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwljaCA9IGM0X2ZpbmRfY2hhbihjaGFubnVtKTsKKwlpZiAoIWNoKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogI2lmIDEKICAgICBpZiAoY2gtPnAuY2FyZCAhPSBwLT5jYXJkIHx8CiAgICAgICAgIGNoLT5wLnBvcnQgIT0gcC0+cG9ydCB8fAogICAgICAgICBjaC0+cC5jaGFubnVtICE9IHAtPmNoYW5udW0pCi0gICAgICAgIHJldHVybiBFSU5WQUw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogI2VuZGlmCiAKICAgICBpZiAoIShjaC0+dXAtPmdyb3VwX2lzX3NldCkpCiAgICAgewotICAgICAgICByZXR1cm4gRUlPOyAgICAgICAgICAgICAgICAgLyogb3V0IG9mIG9yZGVyLCBTRVRfUE9SVCBjb21tYW5kCisgICAgICAgIHJldHVybiAtRUlPOyAgICAgICAgICAgICAgICAgLyogb3V0IG9mIG9yZGVyLCBTRVRfUE9SVCBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXF1aXJlZCBwcmlvciB0byBmaXJzdCBncm91cCdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTRVRfQ0hBTiBjb21tYW5kICovCiAgICAgfQpAQCAtMTE0MywxMCArMTE0OSwxMiBAQAogICAgIHsKICAgICAgICAgc3RhdHVzX3QgICAgcmV0OwogCi0gICAgICAgIGlmICgocmV0ID0gbXVzeWNjX2NoYW5fZG93biAoKGNpX3QgKikgMCwgY2hhbm51bSkpKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgaWYgKChyZXQgPSBjNF9jaGFuX3VwIChjaC0+dXAtPnVwLCBjaGFubnVtKSkpCi0gICAgICAgICAgICByZXR1cm4gcmV0OworCXJldCA9IG11c3ljY19jaGFuX2Rvd24oKGNpX3QgKikwLCBjaGFubnVtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGM0X2NoYW5fdXAoY2gtPnVwLT51cCwgY2hhbm51bSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKICAgICAgICAgc2RfZW5hYmxlX3htaXQgKGNoLT51c2VyKTsgIC8qIHJlLWVuYWJsZSB0byBjYXRjaCBmbG93IGNvbnRyb2xsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWwgKi8KICAgICB9CkBAIC0xMTU5LDggKzExNjcsMTAgQEAKIHsKICAgICBtY2hfdCAgICAgICpjaDsKIAotICAgIGlmICghKGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKSkpCi0gICAgICAgIHJldHVybiBFTk9FTlQ7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJaWYgKCFjaCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKICAgICAqcCA9IGNoLT5wOwogICAgIHJldHVybiAwOwogfQpAQCAtMTE3MCw4ICsxMTgwLDEwIEBACiB7CiAgICAgbWNoX3QgICAgICAqY2g7CiAKLSAgICBpZiAoIShjaCA9IGM0X2ZpbmRfY2hhbiAoY2hhbm51bSkpKQotICAgICAgICByZXR1cm4gRU5PRU5UOworCWNoID0gYzRfZmluZF9jaGFuKGNoYW5udW0pOworCWlmICghY2gpCisJCXJldHVybiAtRU5PRU5UOworCiAgICAgKnAgPSBjaC0+czsKICAgICBwLT50eF9wZW5kaW5nID0gYXRvbWljX3JlYWQgKCZjaC0+dHhfcGVuZGluZyk7CiAgICAgcmV0dXJuIDA7CkBAIC0xMjQwLDggKzEyNTIsMTAgQEAKICAgICB1X2ludDMyX3QgICB0bXA7ICAgICAgICAgICAgLyogZm9yIG9wdGltaXppbmcgY29udmVyc2lvbiBhY3Jvc3MgQkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGxhdGZvcm0gKi8KIAotICAgIGlmICghKGNoID0gYzRfZmluZF9jaGFuIChjaGFubnVtKSkpCi0gICAgICAgIHJldHVybiBFTk9FTlQ7CisJY2ggPSBjNF9maW5kX2NoYW4oY2hhbm51bSk7CisJaWYgKCFjaCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKICAgICBpZiAoY2gtPnN0YXRlID09IFVQKQogICAgIHsKICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCkBAIC0xMjY0LDcgKzEyNzgsNyBAQAogICAgICAgICAgICAgICAgIHByX2luZm8oIisgYXNrNCAleCwgY3VycmVudGx5ICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2gtPnAuYml0bWFza1tpXSwgcGktPnRzbVtpXSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKICAgICAgICAgICAgIGlmIChjaC0+cC5iaXRtYXNrW2ldICYgKDEgPDwgaikpCkBAIC0xMjc3LDcgKzEyOTEsNyBAQAogICAgICAgICAvKiBpZiggY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikgICovCiAgICAgICAgIHByX2luZm8oIiVzOiBjNF9jaGFuX3VwWyVkXSBFTk9CVUZTIChubyBUaW1lU2xvdHMgYXNzaWduZWQpXG4iLAogICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtKTsKLSAgICAgICAgcmV0dXJuIEVOT0JVRlM7ICAgICAgICAgICAgIC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKyAgICAgICAgcmV0dXJuIC1FTk9CVUZTOyAgICAgICAgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCiAgICAgfQogICAgIGFkZHIgPSBjNF9maWZvX2FsbG9jIChwaSwgZ2NoYW4sICZuYnVmKTsKICAgICBjaC0+c3RhdGUgPSBVUDsKQEAgLTEzNzIsMTIgKzEzODYsMTMgQEAKICAgICAgICAgfQogICAgICAgICBtZC0+bmV4dCA9IGNwdV90b19sZTMyIChPU192dG9waHlzIChtZC0+c25leHQpKTsKIAotICAgICAgICAgICAgICAgaWYgKCEobSA9IE9TX21lbV90b2tlbl9hbGxvYyAoY3h0MWUxX21heF9tcnUpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCi0gICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IGM0X2NoYW5fdXBbJWRdIC0gdG9rZW4gYWxsb2MgZmFpbHVyZSwgc2l6ZSA9ICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNoYW5udW0sIGN4dDFlMV9tYXhfbXJ1KTsKLSAgICAgICAgICAgIGdvdG8gZXJyZnJlZTsKKwltID0gT1NfbWVtX3Rva2VuX2FsbG9jKGN4dDFlMV9tYXhfbXJ1KTsKKwlpZiAoIW0pIHsKKwkJaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisJCQlwcl9pbmZvKAorCQkJIiVzOiBjNF9jaGFuX3VwWyVkXSAtIHRva2VuIGFsbG9jIGZhaWx1cmUsIHNpemUgPSAlZC5cbiIsCisJCQljaS0+ZGV2bmFtZSwgY2hhbm51bSwgY3h0MWUxX21heF9tcnUpOworCQlnb3RvIGVycmZyZWU7CiAgICAgICAgIH0KICAgICAgICAgbWQtPm1lbV90b2tlbiA9IG07CiAgICAgICAgIG1kLT5kYXRhID0gY3B1X3RvX2xlMzIgKE9TX3Z0b3BoeXMgKE9TX21lbV90b2tlbl9kYXRhIChtKSkpOwpAQCAtMTQ1NCw3ICsxNDY5LDcgQEAKICAgICBjaC0+bWRyID0gTlVMTDsKICAgICBjaC0+cnhkX251bSA9IDA7CiAgICAgY2gtPnN0YXRlID0gRE9XTjsKLSAgICByZXR1cm4gRU5PQlVGUzsKKyAgICByZXR1cm4gLUVOT0JVRlM7CiB9CiAKIC8qIHN0b3AgdGhlIGhhcmR3YXJlIGZyb20gc2VydmljaW5nICYgaW50ZXJydXB0aW5nICovCkBAIC0xNTMzLDggKzE1NDgsOSBAQAogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICAgY2hhciAgICAgICAqbnA7CiAKLSAgICBpZiAoIShkZXYgPSBnZXR1c2VyYnljaGFuIChpaXAtPmNoYW5udW0pKSkKLSAgICAgICAgcmV0dXJuIEVOT0VOVDsKKwlkZXYgPSBnZXR1c2VyYnljaGFuKGlpcC0+Y2hhbm51bSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PRU5UOwogCiAgICAgbnAgPSBkZXYtPm5hbWU7CiAgICAgc3RybmNweSAoaWlwLT5pbmFtZSwgbnAsIENITk1fU1RSTEVOIC0gMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfcHJpdmF0ZS5oCmluZGV4IDdlZGJkNGUuLmViMjhmMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfcHJpdmF0ZS5oCkBAIC0yMTMsNyArMjEzLDYgQEAKICAgICBzdHJ1Y3Qgc2JlX2NhcmRfaW5mbyAqbmV4dDsKICAgICB1X2ludDMyX3QgICplZXByb21iYXNlOyAgICAgLyogbWFwcGVkIGFkZHJlc3Mgb2YgYm9hcmQncyBFRVBST00gKi8KICAgICBjNGNwbGRfdCAgICpjcGxkYmFzZTsgICAgICAgLyogbWFwcGVkIGFkZHJlc3Mgb2YgYm9hcmQncyBDUExEIGhhcmR3YXJlICovCi0gICAgY2hhciAgICAgICAqcmVsZWFzZTsgICAgICAgIC8qIFNCRSBJRCBzdHJpbmcgdy9pbiBzYmVSZWxlYXNlLmMgKi8KICAgICB2b2lkICAgICAgICpoZHdfaW5mbzsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfc3lzZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X3N5c2RlcC5oCmluZGV4IDY5N2YxOTQuLjI5MTZjMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfc3lzZGVwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9zeXNkZXAuaApAQCAtNjAsMyArNjAsNCBAQAogaW50ICAgICAgICAgc2RfcXVldWVfc3RvcHBlZCAodm9pZCAqdXNlcik7CiAKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKiBfSU5DX1BNQ0M0X1NZU0RFUF9IXyAqKiovCitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9zYmVwcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZXByb2MuYwppbmRleCAzNTNjMDAxLi44NDBjNjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZXByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZXByb2MuYwpAQCAtNzIsNyArNzIsOCBAQAogCWNoYXIgICAgICAgKnNwZDsKIAlzdHJ1Y3Qgc2JlX2JyZF9pbmZvICpiaXA7CiAKLQlpZiAoIShiaXAgPSBPU19rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JlX2JyZF9pbmZvKSkpKQorCWJpcCA9IE9TX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYmVfYnJkX2luZm8pKTsKKwlpZiAoIWJpcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwcl9kZXZlbCgiPj4gc2JlY29tX3Byb2NfZ2V0X3NiZV9pbmZvOiBlbnRlcmVkXG4iKTsKQEAgLTE1MCw3ICsxNTEsNiBAQAogCQlicmVhazsKIAl9CiAJc2VxX3ByaW50ZihtLCAiUENJIEJ1cyBTcGVlZDogJXNcbiIsIHNwZCk7Ci0Jc2VxX3ByaW50ZihtLCAiUmVsZWFzZTogICAgICAgJXNcbiIsIGNpLT5yZWxlYXNlKTsKIAogI2lmZGVmIFNCRV9QTUNDNF9FTkFCTEUKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL01ha2VmaWxlCmluZGV4IDNhYmU4ZDIuLjAwNjNkMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL01ha2VmaWxlCkBAIC0xLDcgKzEgQEAKIG9iai0kKENPTkZJR19ER0FQKSArPSBkZ2FwLm8KLQotCi1kZ2FwLW9ianMgOj0JZGdhcF9kcml2ZXIubyAgIGRnYXBfZmVwNS5vIFwKLQkJZGdhcF9wYXJzZS5vCWRnYXBfdHJhY2UubyBcCi0JCWRnYXBfdHR5Lm8JZGdhcF9zeXNmcy5vCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZjM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jCkBAIC0wLDAgKzEsNzY3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQorICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQorICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQorICoKKyAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQorICoJTGludXggS2VybmVsIHNvdXJjZXMuCisgKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcworICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCisgKgorICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgorICoJVGhhbmsgeW91LgorICoKKyAqLworCisvKgorICogICAgICBJbiB0aGUgb3JpZ2luYWwgb3V0IG9mIGtlcm5lbCBEaWdpIGRnYXAgZHJpdmVyLCBmaXJtd2FyZQorICogICAgICBsb2FkaW5nIHdhcyBkb25lIHZpYSB1c2VyIGxhbmQgdG8gZHJpdmVyIGhhbmRzaGFraW5nLgorICoKKyAqICAgICAgRm9yIGNhcmRzIHRoYXQgc3VwcG9ydCBhIGNvbmNlbnRyYXRvciAocG9ydCBleHBhbmRlciksCisgKiAgICAgIEkgYmVsaWV2ZSB0aGUgY29uY2VudHJhdG9yIGl0cyBzZWxmIHRvbGQgdGhlIGNhcmQgd2hpY2gKKyAqICAgICAgY29uY2VudHJhdG9yIGlzIGFjdHVhbGx5IGF0dGFjaGVkIGFuZCB0aGVuIHRoYXQgaW5mbworICogICAgICB3YXMgdXNlZCB0byB0ZWxsIHVzZXIgbGFuZCB3aGljaCBjb25jZW50cmF0b3IgZmlybXdhcmUKKyAqICAgICAgaW1hZ2Ugd2FzIHRvIGJlIGRvd25sb2FkZWQuIEkgdGhpbmsgZXZlbiB0aGUgQklPUyBvcgorICogICAgICBGRVAgaW1hZ2VzIHJlcXVpcmVkIGNvdWxkIGNoYW5nZSB3aXRoIHRoZSBjb25uZWN0aW9uCisgKiAgICAgIG9mIGEgcGFydGljdWxhciBjb25jZW50cmF0b3IuCisgKgorICogICAgICBTaW5jZSBJIGhhdmUgbm8gYWNjZXNzIHRvIGFueSBvZiB0aGVzZSBjYXJkcyBvcgorICogICAgICBjb25jZW50cmF0b3JzLCBJIGNhbm5vdCBwdXQgdGhlIGNvcnJlY3QgY29uY2VudHJhdG9yCisgKiAgICAgIGZpcm13YXJlIGZpbGUgbmFtZXMgaW50byB0aGUgZmlybXdhcmVfaW5mbyBzdHJ1Y3R1cmUKKyAqICAgICAgYXMgaXMgbm93IGRvbmUgZm9yIHRoZSBCSU9TIGFuZCBGRVAgaW1hZ2VzLgorICoKKyAqICAgICAgSSB0aGluaywgYnV0IGFtIG5vdCBjZXJ0YWluLCB0aGF0IHRoZSBjYXJkcyBzdXBwb3J0aW5nCisgKiAgICAgIGNvbmNlbnRyYXRvcnMgd2lsbCBmdW5jdGlvbiB3aXRob3V0IHRoZW0uIFNvIHN1cHBvcnQKKyAqICAgICAgb2YgdGhlc2UgY2FyZHMgaGFzIGJlZW4gbGVmdCBpbiB0aGlzIGRyaXZlci4KKyAqCisgKiAgICAgIEluIG9yZGVyIHRvIGZ1bGx5IHN1cHBvcnQgdGhvc2UgY2FyZHMsIHRoZXkgd291bGQKKyAqICAgICAgZWl0aGVyIGhhdmUgdG8gYmUgYWNxdWlyZWQgZm9yIGRpc3NlY3Rpb24gb3IgbWF5YmUKKyAqICAgICAgRGlnaSBJbnRlcm5hdGlvbmFsIGNvdWxkIHByb3ZpZGUgc29tZSBhc3Npc3RhbmNlLgorICovCisjdW5kZWYgRElHSV9DT05DRU5UUkFUT1JTX1NVUFBPUlRFRAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFza2xldCBhbmQgaW50ZXJydXB0IHN0cnVjdHMvZGVmaW5lcyAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIEZvciByZWFkW2J3bF0vd3JpdGVbYndsXSAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImRnYXAuaCIKKworI2RlZmluZSBpbml0X01VVEVYKHNlbSkgICAgICAgICBzZW1hX2luaXQoc2VtLCAxKQorI2RlZmluZSBERUNMQVJFX01VVEVYKG5hbWUpICAgICBcCisJc3RydWN0IHNlbWFwaG9yZSBuYW1lID0gX19TRU1BUEhPUkVfSU5JVElBTElaRVIobmFtZSwgMSkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGlnaSBJbnRlcm5hdGlvbmFsLCBodHRwOi8vd3d3LmRpZ2kuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIERpZ2kgSW50ZXJuYXRpb25hbCBFUENBIFBDSSBiYXNlZCBwcm9kdWN0IGxpbmUiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJkZ2FwIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHByb3RvcyBmb3IgdGhpcyBmaWxlCisgKgorICovCisKK3N0YXRpYyBpbnQgZGdhcF9zdGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIGRnYXBfaW5pdF9nbG9iYWxzKHZvaWQpOworc3RhdGljIGludCBkZ2FwX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpOworc3RhdGljIHZvaWQgZGdhcF9jbGVhbnVwX2JvYXJkKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIHZvaWQgZGdhcF9wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpOworc3RhdGljIGludCBkZ2FwX2luaXRfcGNpKHZvaWQpOworc3RhdGljIGludCBkZ2FwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgZGdhcF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpOworc3RhdGljIGludCBkZ2FwX2RvX3JlbWFwKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGlycXJldHVybl90IGRnYXBfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKTsKKworLyogT3VyIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGRnYXBfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXN0cnVjdCBjaGFubmVsX3QgKmNoKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGRpZ2lfdCBfX3VzZXIgKnJldGluZm8pOworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCXN0cnVjdCBkaWdpX3QgX191c2VyICpuZXdfaW5mbyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRlZGVsYXkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqcmV0aW5mbyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRlZGVsYXkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqbmV3X2luZm8pOworc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgZGdhcF93YWl0X2Zvcl9kcmFpbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgZGdhcF9zZXRfbW9kZW1faW5mbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKwkJCQl1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSk7CitzdGF0aWMgaW50IGRnYXBfZ2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsCisJCQkJdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpOworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCWludCBfX3VzZXIgKm5ld19pbmZvKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGN1c3RvbWJhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlpbnQgX191c2VyICpyZXRpbmZvKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBzZXQsCisJCQkJdW5zaWduZWQgaW50IGNsZWFyKTsKK3N0YXRpYyBpbnQgZGdhcF90dHlfc2VuZF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbXNlYyk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgaW50IGRnYXBfdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgYyk7CitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOworCitzdGF0aWMgaW50IGRnYXBfdHR5X3JlZ2lzdGVyKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGludCBkZ2FwX3R0eV9pbml0KHN0cnVjdCBib2FyZF90ICopOworc3RhdGljIHZvaWQgZGdhcF90dHlfdW5pbml0KHN0cnVjdCBib2FyZF90ICopOworc3RhdGljIHZvaWQgZGdhcF9jYXJyaWVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKK3N0YXRpYyB2b2lkIGRnYXBfaW5wdXQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOworCisvKgorICogT3VyIGZ1bmN0aW9uIHByb3RvdHlwZXMgZnJvbSBkZ2FwX2ZlcDUKKyAqLworc3RhdGljIHZvaWQgZGdhcF9jbWR3X2V4dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdTE2IGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpOworc3RhdGljIGludCBkZ2FwX2V2ZW50KHN0cnVjdCBib2FyZF90ICpiZCk7CisKK3N0YXRpYyB2b2lkIGRnYXBfcG9sbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBkZ2FwX2NtZGIoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdWNoYXIgYnl0ZTEsCisJCQl1Y2hhciBieXRlMiwgdWludCBuY21kcyk7CitzdGF0aWMgdm9pZCBkZ2FwX2NtZHcoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpOworc3RhdGljIHZvaWQgZGdhcF93bW92ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgY2hhciAqYnVmLCB1aW50IGNudCk7CitzdGF0aWMgaW50IGRnYXBfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBkZ2FwX3Bhcml0eV9zY2FuKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyICpjYnVmLAorCQkJCXVuc2lnbmVkIGNoYXIgKmZidWYsIGludCAqbGVuKTsKK3N0YXRpYyB1aW50IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKK3N0YXRpYyB2b2lkIGRnYXBfZmlybXdhcmVfcmVzZXRfcG9ydChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gZGdhcF9wYXJzZS5jLgorICovCitzdGF0aWMgaW50IGRnYXBfZ2V0dG9rKGNoYXIgKippbiwgc3RydWN0IGNub2RlICpwKTsKK3N0YXRpYyBjaGFyICpkZ2FwX2dldHdvcmQoY2hhciAqKmluKTsKK3N0YXRpYyBjaGFyICpkZ2FwX3NhdmVzdHJpbmcoY2hhciAqcyk7CitzdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX25ld25vZGUoaW50IHQpOworc3RhdGljIGludCBkZ2FwX2NoZWNrbm9kZShzdHJ1Y3QgY25vZGUgKnApOworc3RhdGljIHZvaWQgZGdhcF9lcnIoY2hhciAqcyk7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gZGdhcF9zeXNmcy5oCisgKi8KK3N0cnVjdCBib2FyZF90Oworc3RydWN0IGNoYW5uZWxfdDsKK3N0cnVjdCB1bl90Oworc3RydWN0IHBjaV9kcml2ZXI7CitzdHJ1Y3QgY2xhc3NfZGV2aWNlOworCitzdGF0aWMgdm9pZCBkZ2FwX2NyZWF0ZV9wb3J0c19zeXNmaWxlcyhzdHJ1Y3QgYm9hcmRfdCAqYmQpOworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKTsKKworc3RhdGljIGludCBkZ2FwX2NyZWF0ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKik7CitzdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKik7CisKK3N0YXRpYyB2b2lkIGRnYXBfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpOworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfdHR5X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmMpOworCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmcm9tIGRnYXBfcGFyc2UuaAorICovCitzdGF0aWMgaW50IGRnYXBfcGFyc2VmaWxlKGNoYXIgKippbiwgaW50IFJlbW92ZSk7CitzdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX2ZpbmRfY29uZmlnKGludCB0eXBlLCBpbnQgYnVzLCBpbnQgc2xvdCk7CitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfbnVtX3BydHMoc3RydWN0IGJvYXJkX3QgKmJkKTsKK3N0YXRpYyBjaGFyICpkZ2FwX2NyZWF0ZV9jb25maWdfc3RyaW5nKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKTsKK3N0YXRpYyB1aW50IGRnYXBfY29uZmlnX2dldF91c2VpbnRyKHN0cnVjdCBib2FyZF90ICpiZCk7CitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKHN0cnVjdCBib2FyZF90ICpiZCk7CisKK3N0YXRpYyBpbnQgZGdhcF9tc19zbGVlcCh1bG9uZyBtcyk7CitzdGF0aWMgdm9pZCBkZ2FwX2RvX2Jpb3NfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCB1Y2hhciAqdWJpb3MsIGludCBsZW4pOworc3RhdGljIHZvaWQgZGdhcF9kb19mZXBfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCB1Y2hhciAqdWZlcCwgaW50IGxlbik7CisjaWZkZWYgRElHSV9DT05DRU5UUkFUT1JTX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgZGdhcF9kb19jb25jX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgKnVhZGRyLCBpbnQgbGVuKTsKKyNlbmRpZgorc3RhdGljIGludCBkZ2FwX2FmdGVyX2NvbmZpZ19sb2FkZWQoaW50IGJvYXJkKTsKK3N0YXRpYyBpbnQgZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpOworCitzdGF0aWMgdm9pZCBkZ2FwX2dldF92cGQoc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgdm9pZCBkZ2FwX2RvX3Jlc2V0X2JvYXJkKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGludCBkZ2FwX2RvX3dhaXRfZm9yX2Jpb3Moc3RydWN0IGJvYXJkX3QgKmJyZCk7CitzdGF0aWMgaW50IGRnYXBfZG9fd2FpdF9mb3JfZmVwKHN0cnVjdCBib2FyZF90ICpicmQpOworc3RhdGljIGludCBkZ2FwX3R0eV9yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKK3N0YXRpYyBpbnQgZGdhcF9maXJtd2FyZV9sb2FkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKTsKKworLyogRHJpdmVyIHVubG9hZCBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQgZGdhcF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKKworbW9kdWxlX2V4aXQoZGdhcF9jbGVhbnVwX21vZHVsZSk7CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIENvbnRyb2wvTWFuYWdlbWVudCBtYWpvci4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgRGdhcEJvYXJkRm9wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKK307CisKKy8qCisgKiBHbG9iYWxzCisgKi8KK3N0YXRpYyB1aW50IGRnYXBfTnVtQm9hcmRzOworc3RhdGljIHN0cnVjdCBib2FyZF90ICpkZ2FwX0JvYXJkW01BWEJPQVJEU107CitzdGF0aWMgdWxvbmcgZGdhcF9wb2xsX2NvdW50ZXI7CitzdGF0aWMgY2hhciAqZGdhcF9jb25maWdfYnVmOworc3RhdGljIGludCBkZ2FwX2RyaXZlcl9zdGF0ZSA9IERSSVZFUl9JTklUSUFMSVpFRDsKK0RFRklORV9TUElOTE9DSyhkZ2FwX2RsX2xvY2spOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGRnYXBfZGxfd2FpdDsKK3N0YXRpYyBpbnQgZGdhcF9kbF9hY3Rpb247CitzdGF0aWMgaW50IGRnYXBfcG9sbF90aWNrID0gMjA7CS8qIFBvbGwgaW50ZXJ2YWwgLSAyMCBtcyAqLworCisvKgorICogU3RhdGljIHZhcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmRnYXBfY2xhc3M7CisKK3N0YXRpYyBzdHJ1Y3QgYm9hcmRfdCAqZGdhcF9Cb2FyZHNCeU1ham9yWzI1Nl07CitzdGF0aWMgdWludCBkZ2FwX2NvdW50ID0gNTAwOworCisvKgorICogUG9sbGVyIHN0dWZmCisgKi8KK0RFRklORV9TUElOTE9DSyhkZ2FwX3BvbGxfbG9jayk7CS8qIFBvbGwgc2NoZWR1bGluZyBsb2NrICovCitzdGF0aWMgdWxvbmcgZGdhcF9wb2xsX3RpbWU7CQkvKiBUaW1lIG9mIG5leHQgcG9sbCAqLworc3RhdGljIHVpbnQgZGdhcF9wb2xsX3N0b3A7CQkvKiBVc2VkIHRvIHRlbGwgcG9sbGVyIHRvIHN0b3AgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZ2FwX3BvbGxfdGltZXI7CisKKy8qCisgICAgIFNVUFBPUlRFRCBQUk9EVUNUUworCisgICAgIENhcmQgTW9kZWwgICAgICAgICAgICAgICBOdW1iZXIgb2YgUG9ydHMgICAgICBJbnRlcmZhY2UKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBBY2NlbGVwb3J0IFhlbSAgICAgICAgICAgNCAtIDY0ICAgICAgICAgICAgICAoRUlBMjMyICYgRUlBNDIyKQorICAgICBBY2NlbGVwb3J0IFhyICAgICAgICAgICAgNCAmIDggICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IFhyIDkyMCAgICAgICAgNCAmIDggICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IEMvWCAgICAgICAgICAgOCAtIDEyOCAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IEVQQy9YICAgICAgICAgOCAtIDIyNCAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IFhyLzQyMiAgICAgICAgNCAmIDggICAgICAgICAgICAgICAoRUlBNDIyKQorICAgICBBY2NlbGVwb3J0IDJyLzkyMCAgICAgICAgMiAgICAgICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IDRyLzkyMCAgICAgICAgNCAgICAgICAgICAgICAgICAgICAoRUlBMjMyKQorICAgICBBY2NlbGVwb3J0IDhyLzkyMCAgICAgICAgOCAgICAgICAgICAgICAgICAgICAoRUlBMjMyKQorCisgICAgIElCTSA4LVBvcnQgQXN5bmNocm9ub3VzIFBDSSBBZGFwdGVyICAgICAgICAgIChFSUEyMzIpCisgICAgIElCTSAxMjgtUG9ydCBBc3luY2hyb25vdXMgUENJIEFkYXB0ZXIgICAgICAgIChFSUEyMzIgJiBFSUE0MjIpCisqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGdhcF9wY2lfdGJsW10gPSB7CisJeyBESUdJX1ZJRCwgUENJX0RFVl9YRU1fRElELCAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAwIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9DWF9ESUQsICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAxIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9DWF9JQk1fRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAyIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9FUENKX0RJRCwgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICAzIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfMl9ESUQsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA0IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfNF9ESUQsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA1IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfOF9ESUQsICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA2IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9ESUQsICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA3IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUkpfRElELCAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA4IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl80MjJfRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICA5IH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9JQk1fRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEwIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9TQUlQX0RJRCwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDExIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YUl9CVUxMX0RJRCwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEyIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl85MjBfOF9IUF9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEzIH0sCisJeyBESUdJX1ZJRCwgUENJX0RFVl9YRU1fSFBfRElELCAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE0IH0sCisJezAsfQkJCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRnYXBfcGNpX3RibCk7CisKKy8qCisgKiBBIGdlbmVyaWMgbGlzdCBvZiBQcm9kdWN0IG5hbWVzLCBQQ0kgVmVuZG9yIElELCBhbmQgUENJIERldmljZSBJRC4KKyAqLworc3RydWN0IGJvYXJkX2lkIHsKKwl1aW50IGNvbmZpZ190eXBlOworCXVjaGFyICpuYW1lOworCXVpbnQgbWF4cG9ydHM7CisJdWludCBkcGF0eXBlOworfTsKKworc3RhdGljIHN0cnVjdCBib2FyZF9pZCBkZ2FwX0lkc1tdID0geworCXsgUFBDTSwgICAgICAgIFBDSV9ERVZfWEVNX05BTUUsICAgICA2NCwgKFRfUENYTXxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBDWCwgICAgICAgICBQQ0lfREVWX0NYX05BTUUsICAgICAxMjgsIChUX0NYfFRfUENJQlVTKSAgICAgICAgICAgIH0sCisJeyBQQ1gsICAgICAgICAgUENJX0RFVl9DWF9JQk1fTkFNRSwgMTI4LCAoVF9DWHxUX1BDSUJVUykgICAgICAgICAgICB9LAorCXsgUEVQQywgICAgICAgIFBDSV9ERVZfRVBDSl9OQU1FLCAgIDIyNCwgKFRfRVBDfFRfUENJQlVTKSAgICAgICAgICAgfSwKKwl7IEFQT1JUMl85MjBQLCBQQ0lfREVWXzkyMF8yX05BTUUsICAgIDIsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBBUE9SVDRfOTIwUCwgUENJX0RFVl85MjBfNF9OQU1FLCAgICA0LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgQVBPUlQ4XzkyMFAsIFBDSV9ERVZfOTIwXzhfTkFNRSwgICAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBBUE9SVDgsICAgICBQQ0lfREVWX1hSX05BTUUsICAgICAgIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQQVBPUlQ4LCAgICAgUENJX0RFVl9YUkpfTkFNRSwgICAgICA4LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgUEFQT1JUOCwgICAgIFBDSV9ERVZfWFJfNDIyX05BTUUsICAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IFBBUE9SVDgsICAgICBQQ0lfREVWX1hSX0lCTV9OQU1FLCAgIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQQVBPUlQ4LCAgICAgUENJX0RFVl9YUl9TQUlQX05BTUUsICA4LCAoVF9QQ1hSfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXsgUEFQT1JUOCwgICAgIFBDSV9ERVZfWFJfQlVMTF9OQU1FLCAgOCwgKFRfUENYUnxUX1BDTElURXxUX1BDSUJVUykgfSwKKwl7IEFQT1JUOF85MjBQLCBQQ0lfREVWXzkyMF84X0hQX05BTUUsIDgsIChUX1BDWFJ8VF9QQ0xJVEV8VF9QQ0lCVVMpIH0sCisJeyBQUENNLCAgICAgICAgUENJX0RFVl9YRU1fSFBfTkFNRSwgIDY0LCAoVF9QQ1hNfFRfUENMSVRFfFRfUENJQlVTKSB9LAorCXswLH0JCQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZ2FwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZGdhcCIsCisJLnByb2JlCQk9IGRnYXBfaW5pdF9vbmUsCisJLmlkX3RhYmxlCT0gZGdhcF9wY2lfdGJsLAorCS5yZW1vdmUJCT0gZGdhcF9yZW1vdmVfb25lLAorfTsKKworc3RydWN0IGZpcm13YXJlX2luZm8geworCXVjaGFyICpjb25mX25hbWU7ICAgICAgIC8qIGRnYXAuY29uZiAqLworCXVjaGFyICpiaW9zX25hbWU7CS8qIEJJT1MgZmlsZW5hbWUgKi8KKwl1Y2hhciAqZmVwX25hbWU7CS8qIEZFUCAgZmlsZW5hbWUgKi8KKwl1Y2hhciAqY29uX25hbWU7CS8qIENvbmNlbnRyYXRvciBmaWxlbmFtZSAgRklYTUUqLworCWludCBudW07ICAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciAqLworfTsKKworLyoKKyAqIEZpcm13YXJlIC0gQklPUywgRkVQLCBhbmQgQ09OQyBmaWxlbmFtZXMKKyAqLworc3RhdGljIHN0cnVjdCBmaXJtd2FyZV9pbmZvIGZ3X2luZm9bXSA9IHsKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3N4Ymlvcy5iaW4iLCAgImRnYXAvc3hmZXAuYmluIiwgIDAsIDAgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL2N4cGJpb3MuYmluIiwgImRnYXAvY3hwZmVwLmJpbiIsIDAsIDEgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL2N4cGJpb3MuYmluIiwgImRnYXAvY3hwZmVwLmJpbiIsIDAsIDIgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3BjaWJpb3MuYmluIiwgImRnYXAvcGNpZmVwLmJpbiIsIDAsIDMgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDQgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDUgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDYgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDcgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDggfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDkgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDEwIH0sCisJeyAiZGdhcC9kZ2FwLmNvbmYiLCAiZGdhcC94cmJpb3MuYmluIiwgICJkZ2FwL3hyZmVwLmJpbiIsICAwLCAxMSB9LAorCXsgImRnYXAvZGdhcC5jb25mIiwgImRnYXAveHJiaW9zLmJpbiIsICAiZGdhcC94cmZlcC5iaW4iLCAgMCwgMTIgfSwKKwl7ICJkZ2FwL2RnYXAuY29uZiIsICJkZ2FwL3hyYmlvcy5iaW4iLCAgImRnYXAveHJmZXAuYmluIiwgIDAsIDEzIH0sCisJeyAiZGdhcC9kZ2FwLmNvbmYiLCAiZGdhcC9zeGJpb3MuYmluIiwgICJkZ2FwL3N4ZmVwLmJpbiIsICAwLCAxNCB9LAorCXswLH0KK307CisKKy8qCisgKiBEZWZhdWx0IHRyYW5zcGFyZW50IHByaW50IGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGRpZ2lfdCBkZ2FwX2RpZ2lfaW5pdCA9IHsKKwkuZGlnaV9mbGFncyA9CURJR0lfQ09PSywJLyogRmxhZ3MJCQkqLworCS5kaWdpX21heGNwcyA9CTEwMCwJCS8qIE1heCBDUFMJCQkqLworCS5kaWdpX21heGNoYXIgPQk1MCwJCS8qIE1heCBjaGFycyBpbiBwcmludCBxdWV1ZQkqLworCS5kaWdpX2J1ZnNpemUgPQkxMDAsCQkvKiBQcmludGVyIGJ1ZmZlciBzaXplCQkqLworCS5kaWdpX29ubGVuID0JNCwJCS8qIHNpemUgb2YgcHJpbnRlciBvbiBzdHJpbmcJKi8KKwkuZGlnaV9vZmZsZW4gPQk0LAkJLyogc2l6ZSBvZiBwcmludGVyIG9mZiBzdHJpbmcJKi8KKwkuZGlnaV9vbnN0ciA9CSJcMDMzWzVpIiwJLyogQU5TSSBwcmludGVyIG9uIHN0cmluZyBdCSovCisJLmRpZ2lfb2Zmc3RyID0JIlwwMzNbNGkiLAkvKiBBTlNJIHByaW50ZXIgb2ZmIHN0cmluZyBdCSovCisJLmRpZ2lfdGVybSA9CSJhbnNpIgkJLyogZGVmYXVsdCB0ZXJtaW5hbCB0eXBlCSovCit9OworCisvKgorICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAorICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LgorICoKKyAqIFRoaXMgZGVmaW5lcyBhIHJhdyBwb3J0IGF0IDk2MDAgYmF1ZCwgOCBkYXRhIGJpdHMsIG5vIHBhcml0eSwKKyAqIDEgc3RvcCBiaXQuCisgKi8KKworc3RhdGljIHN0cnVjdCBrdGVybWlvcyBEZ2FwRGVmYXVsdFRlcm1pb3MgPSB7CisJLmNfaWZsYWcgPQkoREVGQVVMVF9JRkxBR1MpLAkvKiBpZmxhZ3MgKi8KKwkuY19vZmxhZyA9CShERUZBVUxUX09GTEFHUyksCS8qIG9mbGFncyAqLworCS5jX2NmbGFnID0JKERFRkFVTFRfQ0ZMQUdTKSwJLyogY2ZsYWdzICovCisJLmNfbGZsYWcgPQkoREVGQVVMVF9MRkxBR1MpLAkvKiBsZmxhZ3MgKi8KKwkuY19jYyA9CQlJTklUX0NfQ0MsCisJLmNfbGluZSA9CTAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIGRnYXBfdHR5X29wcyA9IHsKKwkub3BlbiA9IGRnYXBfdHR5X29wZW4sCisJLmNsb3NlID0gZGdhcF90dHlfY2xvc2UsCisJLndyaXRlID0gZGdhcF90dHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBkZ2FwX3R0eV93cml0ZV9yb29tLAorCS5mbHVzaF9idWZmZXIgPSBkZ2FwX3R0eV9mbHVzaF9idWZmZXIsCisJLmNoYXJzX2luX2J1ZmZlciA9IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfY2hhcnMgPSBkZ2FwX3R0eV9mbHVzaF9jaGFycywKKwkuaW9jdGwgPSBkZ2FwX3R0eV9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MgPSBkZ2FwX3R0eV9zZXRfdGVybWlvcywKKwkuc3RvcCA9IGRnYXBfdHR5X3N0b3AsCisJLnN0YXJ0ID0gZGdhcF90dHlfc3RhcnQsCisJLnRocm90dGxlID0gZGdhcF90dHlfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSBkZ2FwX3R0eV91bnRocm90dGxlLAorCS5oYW5ndXAgPSBkZ2FwX3R0eV9oYW5ndXAsCisJLnB1dF9jaGFyID0gZGdhcF90dHlfcHV0X2NoYXIsCisJLnRpb2NtZ2V0ID0gZGdhcF90dHlfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gZGdhcF90dHlfdGlvY21zZXQsCisJLmJyZWFrX2N0bCA9IGRnYXBfdHR5X3NlbmRfYnJlYWssCisJLndhaXRfdW50aWxfc2VudCA9IGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudCwKKwkuc2VuZF94Y2hhciA9IGRnYXBfdHR5X3NlbmRfeGNoYXIKK307CisKKy8qCisgKiBPdXIgbmVlZGVkIGludGVybmFsIHN0YXRpYyB2YXJpYWJsZXMgZnJvbSBkZ2FwX3BhcnNlLmMKKyAqLworc3RhdGljIHN0cnVjdCBjbm9kZSBkZ2FwX2hlYWQ7CisjZGVmaW5lIE1BWENXT1JEIDIwMAorc3RhdGljIGNoYXIgZGdhcF9jd29yZFtNQVhDV09SRF07CisKK3N0cnVjdCB0b2tsaXN0IHsKKwlpbnQJdG9rZW47CisJY2hhcgkqc3RyaW5nOworfTsKKworc3RhdGljIHN0cnVjdCB0b2tsaXN0IGRnYXBfdGxpc3RbXSA9IHsKKwl7IEJFR0lOLAkiY29uZmlnX2JlZ2luIiB9LAorCXsgRU5ELAkJImNvbmZpZ19lbmQiIH0sCisJeyBCT0FSRCwJImJvYXJkIgl9LAorCXsgUENYLAkJIkRpZ2lfQWNjZWxlUG9ydF9DL1hfUENJIiB9LAorCXsgUEVQQywJCSJEaWdpX0FjY2VsZVBvcnRfRVBDL1hfUENJIiB9LAorCXsgUFBDTSwJCSJEaWdpX0FjY2VsZVBvcnRfWGVtX1BDSSIgfSwKKwl7IEFQT1JUMl85MjBQLAkiRGlnaV9BY2NlbGVQb3J0XzJyXzkyMF9QQ0kiIH0sCisJeyBBUE9SVDRfOTIwUCwJIkRpZ2lfQWNjZWxlUG9ydF80cl85MjBfUENJIiB9LAorCXsgQVBPUlQ4XzkyMFAsCSJEaWdpX0FjY2VsZVBvcnRfOHJfOTIwX1BDSSIgfSwKKwl7IFBBUE9SVDQsCSJEaWdpX0FjY2VsZVBvcnRfNHJfUENJKEVJQS0yMzIvUlMtNDIyKSIgfSwKKwl7IFBBUE9SVDgsCSJEaWdpX0FjY2VsZVBvcnRfOHJfUENJKEVJQS0yMzIvUlMtNDIyKSIgfSwKKwl7IElPLAkJImlvIiB9LAorCXsgUENJSU5GTywJInBjaWluZm8iIH0sCisJeyBMSU5FLAkJImxpbmUiIH0sCisJeyBDT05DLAkJImNvbmMiIH0sCisJeyBDT05DLAkJImNvbmNlbnRyYXRvciIgfSwKKwl7IENYLAkJImN4IiB9LAorCXsgQ1gsCQkiY2NvbiIgfSwKKwl7IEVQQywJCSJlcGNjb24iIH0sCisJeyBFUEMsCQkiZXBjIiB9LAorCXsgTU9ELAkJIm1vZHVsZSIgfSwKKwl7IElELAkJImlkIiB9LAorCXsgU1RBUlRPLAkic3RhcnQiIH0sCisJeyBTUEVFRCwJInNwZWVkIgl9LAorCXsgQ0FCTEUsCSJjYWJsZSIJfSwKKwl7IENPTk5FQ1QsCSJjb25uZWN0IiB9LAorCXsgTUVUSE9ELAkibWV0aG9kIiB9LAorCXsgU1RBVFVTLAkic3RhdHVzIiB9LAorCXsgQ1VTVE9NLAkiQ3VzdG9tIiB9LAorCXsgQkFTSUMsCSJCYXNpYyIJfSwKKwl7IE1FTSwJCSJtZW0iIH0sCisJeyBNRU0sCQkibWVtb3J5IiB9LAorCXsgUE9SVFMsCSJwb3J0cyIJfSwKKwl7IE1PREVNLAkibW9kZW0iCX0sCisJeyBOUE9SVFMsCSJucG9ydHMiIH0sCisJeyBUVFlOLAkJInR0eW5hbWUiIH0sCisJeyBDVSwJCSJjdW5hbWUiIH0sCisJeyBQUklOVCwJInBybmFtZSIgfSwKKwl7IENNQUpPUiwJIm1ham9yIgkgfSwKKwl7IEFMVFBJTiwJImFsdHBpbiIgfSwKKwl7IFVTRUlOVFIsCSJ1c2VpbnRyIiB9LAorCXsgVFRTSVosCSJ0dHlzaXplIiB9LAorCXsgQ0hTSVosCSJjaHNpemUiIH0sCisJeyBCU1NJWiwJImJvYXJkc2l6ZSIgfSwKKwl7IFVOVFNJWiwJInNjaGVkc2l6ZSIgfSwKKwl7IEYyU0laLAkiZjIyMDBzaXplIiB9LAorCXsgVlBTSVosCSJ2cGl4c2l6ZSIgfSwKKwl7IDAsCQlOVUxMIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEcml2ZXIgbG9hZC91bmxvYWQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGluaXRfbW9kdWxlKCkKKyAqCisgKiBNb2R1bGUgbG9hZC4gIFRoaXMgaXMgd2hlcmUgaXQgYWxsIHN0YXJ0cy4KKyAqLworc3RhdGljIGludCBkZ2FwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCXByX2luZm8oIiVzLCBEaWdpIEludGVybmF0aW9uYWwgUGFydCBOdW1iZXIgJXNcbiIsIERHX05BTUUsIERHX1BBUlQpOworCisJcmMgPSBkZ2FwX3N0YXJ0KCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGRnYXBfaW5pdF9wY2koKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2NsZWFudXA7CisKKwlyYyA9IGRnYXBfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcygmZGdhcF9kcml2ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfY2xlYW51cDsKKworCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX1JFQURZOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGVhbnVwOgorCisJZGdhcF9jbGVhbnVwX21vZHVsZSgpOworCisJcmV0dXJuIHJjOworfQorbW9kdWxlX2luaXQoZGdhcF9pbml0X21vZHVsZSk7CisKKy8qCisgKiBTdGFydCBvZiBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9zdGFydCh2b2lkKQoreworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CisKKwkvKgorCSAqIG1ha2Ugc3VyZSB0aGF0IHRoZSBnbG9iYWxzIGFyZQorCSAqIGluaXQnZCBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZQorCSAqLworCWRnYXBfaW5pdF9nbG9iYWxzKCk7CisKKwlkZ2FwX051bUJvYXJkcyA9IDA7CisKKwlwcl9pbmZvKCJGb3IgdGhlIHRvb2xzIHBhY2thZ2UgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cuZGlnaS5jb21cbiIpOworCisJLyoKKwkgKiBSZWdpc3RlciBvdXIgYmFzZSBjaGFyYWN0ZXIgZGV2aWNlIGludG8gdGhlIGtlcm5lbC4KKwkgKi8KKworCS8qCisJICogUmVnaXN0ZXIgbWFuYWdlbWVudC9kcGEgZGV2aWNlcworCSAqLworCXJjID0gcmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiLCAmRGdhcEJvYXJkRm9wcyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJZGdhcF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImRnYXBfbWdtdCIpOworCWlmIChJU19FUlIoZGdhcF9jbGFzcykpIHsKKwkJcmMgPSBQVFJfRVJSKGRnYXBfY2xhc3MpOworCQlnb3RvIGZhaWxlZF9jbGFzczsKKwl9CisKKwlkZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGRnYXBfY2xhc3MsIE5VTEwsCisJCU1LREVWKERJR0lfREdBUF9NQUpPUiwgMCksCisJCU5VTEwsICJkZ2FwX21nbXQiKTsKKwlpZiAoSVNfRVJSKGRldmljZSkpIHsKKwkJcmMgPSBQVFJfRVJSKGRldmljZSk7CisJCWdvdG8gZmFpbGVkX2RldmljZTsKKwl9CisKKwkvKiBTdGFydCB0aGUgcG9sbGVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRnYXBfcG9sbF9sb2NrLCBmbGFncyk7CisJaW5pdF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKKwlkZ2FwX3BvbGxfdGltZXIuZnVuY3Rpb24gPSBkZ2FwX3BvbGxfaGFuZGxlcjsKKwlkZ2FwX3BvbGxfdGltZXIuZGF0YSA9IDA7CisJZGdhcF9wb2xsX3RpbWUgPSBqaWZmaWVzICsgZGdhcF9qaWZmaWVzX2Zyb21fbXMoZGdhcF9wb2xsX3RpY2spOworCWRnYXBfcG9sbF90aW1lci5leHBpcmVzID0gZGdhcF9wb2xsX3RpbWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGdhcF9wb2xsX2xvY2ssIGZsYWdzKTsKKworCWFkZF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKKworCXJldHVybiByYzsKKworZmFpbGVkX2RldmljZToKKwljbGFzc19kZXN0cm95KGRnYXBfY2xhc3MpOworZmFpbGVkX2NsYXNzOgorCXVucmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBSZWdpc3RlciBwY2kgZHJpdmVyLCBhbmQgcmV0dXJuIGhvdyBtYW55IGJvYXJkcyB3ZSBoYXZlLgorICovCitzdGF0aWMgaW50IGRnYXBfaW5pdF9wY2kodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZGdhcF9kcml2ZXIpOworfQorCisvKiByZXR1cm5zIGNvdW50ICg+PSAwKSwgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgZGdhcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgcmM7CisKKwkvKiB3YWtlIHVwIGFuZCBlbmFibGUgZGV2aWNlICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmIChyYyA8IDApIHsKKwkJcmMgPSAtRUlPOworCX0gZWxzZSB7CisJCXJjID0gZGdhcF9wcm9iZTEocGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlkZ2FwX051bUJvYXJkcysrOworCQkJcmMgPSBkZ2FwX2Zpcm13YXJlX2xvYWQocGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGRnYXBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKQoreworCXJldHVybiBkZ2FwX2ZvdW5kX2JvYXJkKHBkZXYsIGNhcmRfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIERvIE5vdGhpbmcgKi8KK30KKworLyoKKyAqIGRnYXBfY2xlYW51cF9tb2R1bGUoKQorICoKKyAqIE1vZHVsZSB1bmxvYWQuICBUaGlzIGlzIHdoZXJlIGl0IGFsbCBlbmRzLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJdWxvbmcgbG9ja19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZ2FwX3BvbGxfbG9jaywgbG9ja19mbGFncyk7CisJZGdhcF9wb2xsX3N0b3AgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIHBvbGxlciByaWdodCBhd2F5LiAqLworCWRlbF90aW1lcl9zeW5jKCZkZ2FwX3BvbGxfdGltZXIpOworCisJZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKCZkZ2FwX2RyaXZlcik7CisKKwlkZXZpY2VfZGVzdHJveShkZ2FwX2NsYXNzLCBNS0RFVihESUdJX0RHQVBfTUFKT1IsIDApKTsKKwljbGFzc19kZXN0cm95KGRnYXBfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiKTsKKworCWtmcmVlKGRnYXBfY29uZmlnX2J1Zik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGdhcF9OdW1Cb2FyZHM7ICsraSkgeworCQlkZ2FwX3JlbW92ZV9wb3J0c19zeXNmaWxlcyhkZ2FwX0JvYXJkW2ldKTsKKwkJZGdhcF90dHlfdW5pbml0KGRnYXBfQm9hcmRbaV0pOworCQlkZ2FwX2NsZWFudXBfYm9hcmQoZGdhcF9Cb2FyZFtpXSk7CisJfQorCisJaWYgKGRnYXBfTnVtQm9hcmRzKQorCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRnYXBfZHJpdmVyKTsKK30KKworLyoKKyAqIGRnYXBfY2xlYW51cF9ib2FyZCgpCisgKgorICogRnJlZSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBib2FyZAorICovCitzdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCWlmIChicmQtPmludHJfdXNlZCAmJiBicmQtPmlycSkKKwkJZnJlZV9pcnEoYnJkLT5pcnEsIGJyZCk7CisKKwl0YXNrbGV0X2tpbGwoJmJyZC0+aGVscGVyX3Rhc2tsZXQpOworCisJaWYgKGJyZC0+cmVfbWFwX3BvcnQpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIDB4MjAwMDAwLCAweDIwMDAwMCk7CisJCWlvdW5tYXAoYnJkLT5yZV9tYXBfcG9ydCk7CisJCWJyZC0+cmVfbWFwX3BvcnQgPSBOVUxMOworCX0KKworCWlmIChicmQtPnJlX21hcF9tZW1iYXNlKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKKwkJaW91bm1hcChicmQtPnJlX21hcF9tZW1iYXNlKTsKKwkJYnJkLT5yZV9tYXBfbWVtYmFzZSA9IE5VTEw7CisJfQorCisJLyogRnJlZSBhbGwgYWxsb2NhdGVkIGNoYW5uZWxzIHN0cnVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFMgOyBpKyspCisJCWtmcmVlKGJyZC0+Y2hhbm5lbHNbaV0pOworCisJa2ZyZWUoYnJkLT5mbGlwYnVmKTsKKwlrZnJlZShicmQtPmZsaXBmbGFnYnVmKTsKKworCWRnYXBfQm9hcmRbYnJkLT5ib2FyZG51bV0gPSBOVUxMOworCisJa2ZyZWUoYnJkKTsKK30KKworLyoKKyAqIGRnYXBfZm91bmRfYm9hcmQoKQorICoKKyAqIEEgYm9hcmQgaGFzIGJlZW4gZm91bmQsIGluaXQgaXQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9mb3VuZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlkKQoreworCXN0cnVjdCBib2FyZF90ICpicmQ7CisJdW5zaWduZWQgaW50IHBjaV9pcnE7CisJaW50IGkgPSAwOworCisJLyogZ2V0IHRoZSBib2FyZCBzdHJ1Y3R1cmUgYW5kIHByZXAgaXQgKi8KKwlicmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm9hcmRfdCksIEdGUF9LRVJORUwpOworCWlmICghYnJkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRnYXBfQm9hcmRbZGdhcF9OdW1Cb2FyZHNdID0gYnJkOworCisJLyogc3RvcmUgdGhlIGluZm8gZm9yIHRoZSBib2FyZCB3ZSd2ZSBmb3VuZCAqLworCWJyZC0+bWFnaWMgPSBER0FQX0JPQVJEX01BR0lDOworCWJyZC0+Ym9hcmRudW0gPSBkZ2FwX051bUJvYXJkczsKKwlicmQtPmZpcnN0bWlub3IgPSAwOworCWJyZC0+dmVuZG9yID0gZGdhcF9wY2lfdGJsW2lkXS52ZW5kb3I7CisJYnJkLT5kZXZpY2UgPSBkZ2FwX3BjaV90YmxbaWRdLmRldmljZTsKKwlicmQtPnBkZXYgPSBwZGV2OworCWJyZC0+cGNpX2J1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCWJyZC0+cGNpX3Nsb3QgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJYnJkLT5uYW1lID0gZGdhcF9JZHNbaWRdLm5hbWU7CisJYnJkLT5tYXhwb3J0cyA9IGRnYXBfSWRzW2lkXS5tYXhwb3J0czsKKwlicmQtPnR5cGUgPSBkZ2FwX0lkc1tpZF0uY29uZmlnX3R5cGU7CisJYnJkLT5kcGF0eXBlID0gZGdhcF9JZHNbaWRdLmRwYXR5cGU7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZicmQtPnN0YXRlX3dhaXQpOworCisJc3Bpbl9sb2NrX2luaXQoJmJyZC0+YmRfbG9jayk7CisKKwlicmQtPnJ1bndhaXQJCT0gMDsKKwlicmQtPmluaGliaXRfcG9sbGVyCT0gRkFMU0U7CisJYnJkLT53YWl0X2Zvcl9iaW9zCT0gMDsKKwlicmQtPndhaXRfZm9yX2ZlcAk9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFM7IGkrKykKKwkJYnJkLT5jaGFubmVsc1tpXSA9IE5VTEw7CisKKwkvKiBzdG9yZSB3aGljaCBjYXJkICYgcmV2aXNpb24gd2UgaGF2ZSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmYnJkLT5zdWJ2ZW5kb3IpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZicmQtPnN1YmRldmljZSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmYnJkLT5yZXYpOworCisJcGNpX2lycSA9IHBkZXYtPmlycTsKKwlicmQtPmlycSA9IHBjaV9pcnE7CisKKwkvKiBnZXQgdGhlIFBDSSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXJzICovCisKKwkvKiBYciBKdXBpdGVyIGFuZCBFUEMgdXNlIEJBUiAyICovCisJaWYgKGJyZC0+ZGV2aWNlID09IFBDSV9ERVZfWFJKX0RJRCB8fCBicmQtPmRldmljZSA9PSBQQ0lfREVWX0VQQ0pfRElEKSB7CisJCWJyZC0+bWVtYmFzZSAgICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJCWJyZC0+bWVtYmFzZV9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDIpOworCX0KKwkvKiBFdmVyeW9uZSBlbHNlIHVzZXMgQkFSIDAgKi8KKwllbHNlIHsKKwkJYnJkLT5tZW1iYXNlICAgICA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwkJYnJkLT5tZW1iYXNlX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCk7CisJfQorCisJaWYgKCFicmQtPm1lbWJhc2UpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGJyZC0+bWVtYmFzZSAmIDEpCisJCWJyZC0+bWVtYmFzZSAmPSB+MzsKKwllbHNlCisJCWJyZC0+bWVtYmFzZSAmPSB+MTU7CisKKwkvKgorCSAqIE9uIHRoZSBQQ0kgYm9hcmRzLCB0aGVyZSBpcyBubyBJTyBzcGFjZSBhbGxvY2F0ZWQKKwkgKiBUaGUgSS9PIHJlZ2lzdGVycyB3aWxsIGJlIGluIHRoZSBmaXJzdCAzIGJ5dGVzIG9mIHRoZQorCSAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkKKwkgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlCisJICovCisJYnJkLT5wb3J0ID0gYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVDsKKwlicmQtPnBvcnRfZW5kID0gYnJkLT5wb3J0ICsgUENJX0lPX1NJWkU7CisKKwkvKgorCSAqIFNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZm9yIG5vbi1QTFggYm9hcmRzCisJICovCisJaWYgKGJyZC0+ZGV2aWNlICE9IFBDSV9ERVZfWFJKX0RJRCAmJiBicmQtPmRldmljZSAhPSBQQ0lfREVWX0VQQ0pfRElEKSB7CisJCXVuc2lnbmVkIHNob3J0IGNtZDsKKworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MCwgMCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQ2LCAwKTsKKworCQkvKiBMaW1pdCBidXJzdCBsZW5ndGggdG8gMiBkb3VibGV3b3JkIHRyYW5zYWN0aW9ucyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MiwgMSk7CisKKwkJLyoKKwkJICogRW5hYmxlIElPIGFuZCBtZW0gaWYgbm90IGFscmVhZHkgZG9uZS4KKwkJICogVGhpcyB3YXMgbmVlZGVkIGZvciBzdXBwb3J0IG9uIEl0YW5pdW0uCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJCWNtZCB8PSAoUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlkpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQorCisJLyogaW5pdCBvdXIgcG9sbCBoZWxwZXIgdGFza2xldCAqLworCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwgZGdhcF9wb2xsX3Rhc2tsZXQsCisJCQkodW5zaWduZWQgbG9uZykgYnJkKTsKKworCWkgPSBkZ2FwX2RvX3JlbWFwKGJyZCk7CisJaWYgKGkpCisJCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisKKwlwcl9pbmZvKCJkZ2FwOiBib2FyZCAlZDogJXMgKHJldiAlZCksIGlycSAlbGQsICVzXG4iLAorCQlkZ2FwX051bUJvYXJkcywgYnJkLT5uYW1lLCBicmQtPnJldiwgYnJkLT5pcnEsCisJCWJyZC0+c3RhdGUgPyAiTk9UIFJFQURZXDAiIDogIlJFQURZXDAiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJaW50IHJjOworCisJaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJyZC0+dXNlX2ludGVycnVwdHMgPSBkZ2FwX2NvbmZpZ19nZXRfdXNlaW50cihicmQpOworCisJLyoKKwkgKiBTZXQgdXAgb3VyIGludGVycnVwdCBoYW5kbGVyIGlmIHdlIGFyZSBzZXQgdG8gZG8gaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAoYnJkLT51c2VfaW50ZXJydXB0cyAmJiBicmQtPmlycSkgeworCisJCXJjID0gcmVxdWVzdF9pcnEoYnJkLT5pcnEsIGRnYXBfaW50ciwgSVJRRl9TSEFSRUQsICJER0FQIiwgYnJkKTsKKworCQlpZiAocmMpCisJCQlicmQtPmludHJfdXNlZCA9IDA7CisJCWVsc2UKKwkJCWJyZC0+aW50cl91c2VkID0gMTsKKwl9IGVsc2UgeworCQlicmQtPmludHJfdXNlZCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGdhcF9maXJtd2FyZV9sb2FkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKQoreworCXN0cnVjdCBib2FyZF90ICpicmQgPSBkZ2FwX0JvYXJkW2RnYXBfTnVtQm9hcmRzIC0gMV07CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlpbnQgcmV0OworCisJZGdhcF9nZXRfdnBkKGJyZCk7CisJZGdhcF9kb19yZXNldF9ib2FyZChicmQpOworCisJaWYgKGZ3X2luZm9bY2FyZF90eXBlXS5jb25mX25hbWUpIHsKKwkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X2luZm9bY2FyZF90eXBlXS5jb25mX25hbWUsCisJCQkJCSAmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJkZ2FwOiBjb25maWcgZmlsZSAlcyBub3QgZm91bmRcbiIsCisJCQkJZndfaW5mb1tjYXJkX3R5cGVdLmNvbmZfbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmICghZGdhcF9jb25maWdfYnVmKSB7CisJCQlkZ2FwX2NvbmZpZ19idWYgPSBrbWFsbG9jKGZ3LT5zaXplICsgMSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWRnYXBfY29uZmlnX2J1ZikgeworCQkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisKKwkJbWVtY3B5KGRnYXBfY29uZmlnX2J1ZiwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCWRnYXBfY29uZmlnX2J1Zltmdy0+c2l6ZSArIDFdID0gJ1wwJzsKKworCQlpZiAoZGdhcF9wYXJzZWZpbGUoJmRnYXBfY29uZmlnX2J1ZiwgVFJVRSkgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGRnYXBfYWZ0ZXJfY29uZmlnX2xvYWRlZChicmQtPmJvYXJkbnVtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qCisJICogTWF0Y2ggdGhpcyBib2FyZCB0byBhIGNvbmZpZyB0aGUgdXNlciBjcmVhdGVkIGZvciB1cy4KKwkgKi8KKwlicmQtPmJkX2NvbmZpZyA9CisJCWRnYXBfZmluZF9jb25maWcoYnJkLT50eXBlLCBicmQtPnBjaV9idXMsIGJyZC0+cGNpX3Nsb3QpOworCisJLyoKKwkgKiBCZWNhdXNlIHRoZSA0IHBvcnQgWHIgcHJvZHVjdHMgc2hhcmUgdGhlIHNhbWUgUENJIElECisJICogYXMgdGhlIDggcG9ydCBYciBwcm9kdWN0cywgaWYgd2UgcmVjZWl2ZSBhIE5VTEwgY29uZmlnCisJICogYmFjaywgYW5kIHRoaXMgaXMgYSBQQVBPUlQ4IGJvYXJkLCByZXRyeSB3aXRoIGEKKwkgKiBQQVBPUlQ0IGF0dGVtcHQgYXMgd2VsbC4KKwkgKi8KKwlpZiAoYnJkLT50eXBlID09IFBBUE9SVDggJiYgIWJyZC0+YmRfY29uZmlnKQorCQlicmQtPmJkX2NvbmZpZyA9CisJCQlkZ2FwX2ZpbmRfY29uZmlnKFBBUE9SVDQsIGJyZC0+cGNpX2J1cywgYnJkLT5wY2lfc2xvdCk7CisKKwlpZiAoIWJyZC0+YmRfY29uZmlnKSB7CisJCXByX2VycigiZGdhcDogTm8gdmFsaWQgY29uZmlndXJhdGlvbiBmb3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRnYXBfdHR5X3JlZ2lzdGVyKGJyZCk7CisJZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KGJyZCk7CisKKwlpZiAoZndfaW5mb1tjYXJkX3R5cGVdLmJpb3NfbmFtZSkgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfaW5mb1tjYXJkX3R5cGVdLmJpb3NfbmFtZSwKKwkJCQkJJnBkZXYtPmRldik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiZGdhcDogYmlvcyBmaWxlICVzIG5vdCBmb3VuZFxuIiwKKwkJCQlmd19pbmZvW2NhcmRfdHlwZV0uYmlvc19uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGdhcF9kb19iaW9zX2xvYWQoYnJkLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCQkvKiBXYWl0IGZvciBCSU9TIHRvIHRlc3QgYm9hcmQuLi4gKi8KKwkJaWYgKCFkZ2FwX2RvX3dhaXRfZm9yX2Jpb3MoYnJkKSkKKwkJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKGZ3X2luZm9bY2FyZF90eXBlXS5mZXBfbmFtZSkgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfaW5mb1tjYXJkX3R5cGVdLmZlcF9uYW1lLAorCQkJCQkmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJkZ2FwOiBmZXAgZmlsZSAlcyBub3QgZm91bmRcbiIsCisJCQkJZndfaW5mb1tjYXJkX3R5cGVdLmZlcF9uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGdhcF9kb19mZXBfbG9hZChicmQsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJCS8qIFdhaXQgZm9yIEZFUCB0byBsb2FkIG9uIGJvYXJkLi4uICovCisJCWlmICghZGdhcF9kb193YWl0X2Zvcl9mZXAoYnJkKSkKKwkJCXJldHVybiAtRU5YSU87CisJfQorCisjaWZkZWYgRElHSV9DT05DRU5UUkFUT1JTX1NVUFBPUlRFRAorCS8qCisJICogSWYgdGhpcyBpcyBhIENYIG9yIEVQQ1gsIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBmaXJtd2FyZQorCSAqIGlzIHJlcXVlc3RpbmcgYSBjb25jZW50cmF0b3IgaW1hZ2UgZnJvbSB1cy4KKwkgKi8KKwlpZiAoKGJkLT50eXBlID09IFBDWCkgfHwgKGJkLT50eXBlID09IFBFUEMpKSB7CisJCWNoa19hZGRyID0gKHUxNiAqKSAodmFkZHIgKyBET1dOUkVRKTsKKwkJLyogTm9uemVybyBpZiBGRVAgaXMgcmVxdWVzdGluZyBjb25jZW50cmF0b3IgaW1hZ2UuICovCisJCWNoZWNrID0gcmVhZHcoY2hrX2FkZHIpOworCQl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisJfQorCisJaWYgKGZ3X2luZm9bY2FyZF90eXBlXS5jb25fbmFtZSAmJiBjaGVjayAmJiB2YWRkcikgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfaW5mb1tjYXJkX3R5cGVdLmNvbl9uYW1lLAorCQkJCQkmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJkZ2FwOiBjb25jIGZpbGUgJXMgbm90IGZvdW5kXG4iLAorCQkJCWZ3X2luZm9bY2FyZF90eXBlXS5jb25fbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCS8qIFB1dCBjb25jZW50cmF0b3IgZmlybXdhcmUgbG9hZGluZyBjb2RlIGhlcmUgKi8KKwkJb2Zmc2V0ID0gcmVhZHcoKHUxNiAqKSAodmFkZHIgKyBET1dOUkVRKSk7CisJCW1lbWNweV90b2lvKG9mZnNldCwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKworCQlkZ2FwX2RvX2NvbmNfbG9hZChicmQsIChjaGFyICopZnctPmRhdGEsIGZ3LT5zaXplKQorCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIERvIHR0eSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCisJICovCisJcmV0ID0gZGdhcF90dHlfaW5pdChicmQpOworCWlmIChyZXQgPCAwKSB7CisJCWRnYXBfdHR5X3VuaW5pdChicmQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRnYXBfdHR5X3JlZ2lzdGVyX3BvcnRzKGJyZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWJyZC0+c3RhdGUgPSBCT0FSRF9SRUFEWTsKKwlicmQtPmRwYXN0YXR1cyA9IEJEX1JVTk5JTkc7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbWFwIFBDSSBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9kb19yZW1hcChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDAsICJkZ2FwIikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDAsCisJCQkJCSJkZ2FwIikpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlicmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKKwlpZiAoIWJyZC0+cmVfbWFwX21lbWJhc2UpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlicmQtPnJlX21hcF9wb3J0ID0gaW9yZW1hcCgoYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCksIDB4MjAwMDAwKTsKKwlpZiAoIWJyZC0+cmVfbWFwX3BvcnQpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOworCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCwgMHgyMDAwMDApOworCQlpb3VubWFwKGJyZC0+cmVfbWFwX21lbWJhc2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uOgorKgorKiAgICBkZ2FwX3BvbGxfaGFuZGxlcgorKgorKiBBdXRob3I6CisqCisqICAgIFNjb3R0IEggS2lsYXUKKyoKKyogUGFyYW1ldGVyczoKKyoKKyogICAgZHVtbXkgLS0gaWdub3JlZAorKgorKiBSZXR1cm4gVmFsdWVzOgorKgorKiAgICBub25lCisqCisqIERlc2NyaXB0aW9uOgorKgorKiAgICBBcyBlYWNoIHRpbWVyIGV4cGlyZXMsIGl0IGRldGVybWluZXMgKGEpIHdoZXRoZXIgdGhlICJ0cmFuc21pdCIKKyogICAgd2FpdGVyIG5lZWRzIHRvIGJlIHdva2VuIHVwLCBhbmQgKGIpIHdoZXRoZXIgdGhlIHBvbGxlciBuZWVkcyB0bworKiAgICBiZSByZXNjaGVkdWxlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZGdhcF9wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpCit7CisJaW50IGk7CisJc3RydWN0IGJvYXJkX3QgKmJyZDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJdWxvbmcgbmV3X3RpbWU7CisKKwlkZ2FwX3BvbGxfY291bnRlcisrOworCisJLyoKKwkgKiBEbyBub3Qgc3RhcnQgdGhlIGJvYXJkIHN0YXRlIG1hY2hpbmUgdW50aWwKKwkgKiBkcml2ZXIgdGVsbHMgdXMgaXRzIHVwIGFuZCBydW5uaW5nLCBhbmQgaGFzCisJICogZXZlcnl0aGluZyBpdCBuZWVkcy4KKwkgKi8KKwlpZiAoZGdhcF9kcml2ZXJfc3RhdGUgIT0gRFJJVkVSX1JFQURZKQorCQlnb3RvIHNjaGVkdWxlX3BvbGxlcjsKKworCS8qCisJICogSWYgd2UgaGF2ZSBqdXN0IDEgYm9hcmQsIG9yIHRoZSBzeXN0ZW0gaXMgbm90IFNNUCwKKwkgKiB0aGVuIHVzZSB0aGUgdHlwaWNhbCBvbGQgc3R5bGUgcG9sbGVyLgorCSAqIE90aGVyd2lzZSwgdXNlIG91ciBuZXcgdGFza2xldCBiYXNlZCBwb2xsZXIsIHdoaWNoIHNob3VsZAorCSAqIHNwZWVkIHRoaW5ncyB1cCBmb3IgbXVsdGlwbGUgYm9hcmRzLgorCSAqLworCWlmICgoZGdhcF9OdW1Cb2FyZHMgPT0gMSkgfHwgKG51bV9vbmxpbmVfY3B1cygpIDw9IDEpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZ2FwX051bUJvYXJkczsgaSsrKSB7CisKKwkJCWJyZCA9IGRnYXBfQm9hcmRbaV07CisKKwkJCWlmIChicmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghYnJkLT5pbnRyX3J1bm5pbmcpCisJCQkJLyogQ2FsbCB0aGUgcmVhbCBib2FyZCBwb2xsZXIgZGlyZWN0bHkgKi8KKwkJCQlkZ2FwX3BvbGxfdGFza2xldCgodW5zaWduZWQgbG9uZykgYnJkKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEdvIHRocnUgZWFjaCBib2FyZCwga2lja2luZyBvZmYgYQorCQkgKiB0YXNrbGV0IGZvciBlYWNoIGlmIG5lZWRlZAorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyBpKyspIHsKKwkJCWJyZCA9IGRnYXBfQm9hcmRbaV07CisKKwkJCS8qCisJCQkgKiBBdHRlbXB0IHRvIGdyYWIgdGhlIGJvYXJkIGxvY2suCisJCQkgKgorCQkJICogSWYgd2UgY2FuJ3QgZ2V0IGl0LCBubyBiaWcgZGVhbCwgdGhlIG5leHQgcG9sbAorCQkJICogd2lsbCBnZXQgaXQuIEJhc2ljYWxseSwgSSBqdXN0IHJlYWxseSBkb24ndCB3YW50CisJCQkgKiB0byBzcGluIGluIGhlcmUsIGJlY2F1c2UgSSB3YW50IHRvIGtpY2sgb2ZmIG15CisJCQkgKiB0YXNrbGV0cyBhcyBmYXN0IGFzIEkgY2FuLCBhbmQgdGhlbiBnZXQgb3V0IHRoZQorCQkJICogcG9sbGVyLgorCQkJICovCisJCQlpZiAoIXNwaW5fdHJ5bG9jaygmYnJkLT5iZF9sb2NrKSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIElmIGJvYXJkIGlzIGluIGEgZmFpbGVkIHN0YXRlLCBkb24ndCBib3RoZXIKKwkJCSAqICBzY2hlZHVsaW5nIGEgdGFza2xldAorCQkJICovCisJCQlpZiAoYnJkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKKwkJCQlzcGluX3VubG9jaygmYnJkLT5iZF9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogU2NoZWR1bGUgYSBwb2xsIGhlbHBlciB0YXNrICovCisJCQlpZiAoIWJyZC0+aW50cl9ydW5uaW5nKQorCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmJyZC0+aGVscGVyX3Rhc2tsZXQpOworCisJCQkvKgorCQkJICogQ2FuJ3QgZG8gREdBUF9VTkxPQ0sgaGVyZSwgYXMgd2UgZG9uJ3QgaGF2ZQorCQkJICogbG9ja19mbGFncyBiZWNhdXNlIHdlIGRpZCBhIHRyeWxvY2sgYWJvdmUuCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrKCZicmQtPmJkX2xvY2spOworCQl9CisJfQorCitzY2hlZHVsZV9wb2xsZXI6CisKKwkvKgorCSAqIFNjaGVkdWxlIG91cnNlbGYgYmFjayBhdCB0aGUgbm9taW5hbCB3YWtldXAgaW50ZXJ2YWwuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlkZ2FwX3BvbGxfdGltZSArPSAgZGdhcF9qaWZmaWVzX2Zyb21fbXMoZGdhcF9wb2xsX3RpY2spOworCisJbmV3X3RpbWUgPSBkZ2FwX3BvbGxfdGltZSAtIGppZmZpZXM7CisKKwlpZiAoKHVsb25nKSBuZXdfdGltZSA+PSAyICogZGdhcF9wb2xsX3RpY2spIHsKKwkJZGdhcF9wb2xsX3RpbWUgPQorCQkJamlmZmllcyArICBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7CisJfQorCisJZGdhcF9wb2xsX3RpbWVyLmZ1bmN0aW9uID0gZGdhcF9wb2xsX2hhbmRsZXI7CisJZGdhcF9wb2xsX3RpbWVyLmRhdGEgPSAwOworCWRnYXBfcG9sbF90aW1lci5leHBpcmVzID0gZGdhcF9wb2xsX3RpbWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKCFkZ2FwX3BvbGxfc3RvcCkKKwkJYWRkX3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOworfQorCisvKgorICogZGdhcF9pbnRyKCkKKyAqCisgKiBEcml2ZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBkZ2FwX2ludHIoaW50IGlycSwgdm9pZCAqdm9pZGJyZCkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYnJkID0gKHN0cnVjdCBib2FyZF90ICopIHZvaWRicmQ7CisKKwlpZiAoIWJyZCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyoKKwkgKiBDaGVjayB0byBtYWtlIHN1cmUgaXRzIGZvciB1cy4KKwkgKi8KKwlpZiAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlicmQtPmludHJfY291bnQrKzsKKworCS8qCisJICogU2NoZWR1bGUgdGFza2xldCB0byBydW4gYXQgYSBiZXR0ZXIgdGltZS4KKwkgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZicmQtPmhlbHBlcl90YXNrbGV0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBkZ2FwX2luaXRfZ2xvYmFscygpCisgKgorICogVGhpcyBpcyB3aGVyZSB3ZSBpbml0aWFsaXplIHRoZSBnbG9iYWxzIGZyb20gdGhlIHN0YXRpYyBpbnNtb2QKKyAqIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLiAgVGhlc2UgYXJlIGRlY2xhcmVkIG5lYXIgdGhlIGhlYWQgb2YKKyAqIHRoaXMgZmlsZS4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9pbml0X2dsb2JhbHModm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQk9BUkRTOyBpKyspCisJCWRnYXBfQm9hcmRbaV0gPSBOVUxMOworCisJaW5pdF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRnYXBfZGxfd2FpdCk7CisJZGdhcF9kbF9hY3Rpb24gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogZGdhcF9tc19zbGVlcCgpCisgKgorICogUHV0IHRoZSBkcml2ZXIgdG8gc2xlZXAgZm9yIHggbXMncworICoKKyAqIFJldHVybnMgMCBpZiB0aW1lZCBvdXQsICEwIChzaG93aW5nIHNpZ25hbCkgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9tc19zbGVlcCh1bG9uZyBtcykKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KChtcyAqIEhaKSAvIDEwMDApOworCXJldHVybiBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRUWSBJbml0aWFsaXphdGlvbi9DbGVhbnVwIEZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBkZ2FwX3R0eV9yZWdpc3RlcigpCisgKgorICogSW5pdCB0aGUgdHR5IHN1YnN5c3RlbSBmb3IgdGhpcyBib2FyZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9yZWdpc3RlcihzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCWludCByYyA9IDA7CisKKwlicmQtPlNlcmlhbERyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYUE9SVFMpOworCisJc25wcmludGYoYnJkLT5TZXJpYWxOYW1lLCBNQVhUVFlOQU1FTEVOLCAidHR5X2RnYXBfJWRfIiwgYnJkLT5ib2FyZG51bSk7CisJYnJkLT5TZXJpYWxEcml2ZXItPm5hbWUgPSBicmQtPlNlcmlhbE5hbWU7CisJYnJkLT5TZXJpYWxEcml2ZXItPm5hbWVfYmFzZSA9IDA7CisJYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yID0gMDsKKwlicmQtPlNlcmlhbERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCWJyZC0+U2VyaWFsRHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlicmQtPlNlcmlhbERyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlicmQtPlNlcmlhbERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOworCWJyZC0+U2VyaWFsRHJpdmVyLT5kcml2ZXJfbmFtZSA9IERSVlNUUjsKKwlicmQtPlNlcmlhbERyaXZlci0+ZmxhZ3MgPSAoVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCQkJICAgIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfAorCQkJCSAgICBUVFlfRFJJVkVSX0hBUkRXQVJFX0JSRUFLKTsKKworCS8qIFRoZSBrZXJuZWwgd2FudHMgc3BhY2UgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdHR5X3N0cnVjdHMgKi8KKwlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9CisJCWt6YWxsb2MoTUFYUE9SVFMgKiBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QgKiksIEdGUF9LRVJORUwpOworCWlmICghYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBFbnRyeSBwb2ludHMgZm9yIGRyaXZlci4gIENhbGxlZCBieSB0aGUga2VybmVsIGZyb20KKwkgKiB0dHlfaW8uYyBhbmQgbl90dHkuYy4KKwkgKi8KKwl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5TZXJpYWxEcml2ZXIsICZkZ2FwX3R0eV9vcHMpOworCisJLyoKKwkgKiBJZiB3ZSdyZSBkb2luZyB0cmFuc3BhcmVudCBwcmludCwgd2UgaGF2ZSB0byBkbyBhbGwgb2YgdGhlIGFib3ZlCisJICogYWdhaW4sIHNlcGFyYXRlbHkgc28gd2UgZG9uJ3QgZ2V0IHRoZSBMRCBjb25mdXNlZCBhYm91dCB3aGF0IG1ham9yCisJICogd2UgYXJlIHdoZW4gd2UgZ2V0IGludG8gdGhlIGRnYXBfdHR5X29wZW4oKSByb3V0aW5lLgorCSAqLworCWJyZC0+UHJpbnREcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWFBPUlRTKTsKKworCXNucHJpbnRmKGJyZC0+UHJpbnROYW1lLCBNQVhUVFlOQU1FTEVOLCAicHJfZGdhcF8lZF8iLCBicmQtPmJvYXJkbnVtKTsKKwlicmQtPlByaW50RHJpdmVyLT5uYW1lID0gYnJkLT5QcmludE5hbWU7CisJYnJkLT5QcmludERyaXZlci0+bmFtZV9iYXNlID0gMDsKKwlicmQtPlByaW50RHJpdmVyLT5tYWpvciA9IDA7CisJYnJkLT5QcmludERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCWJyZC0+UHJpbnREcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWJyZC0+UHJpbnREcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJYnJkLT5QcmludERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOworCWJyZC0+UHJpbnREcml2ZXItPmRyaXZlcl9uYW1lID0gRFJWU1RSOworCWJyZC0+UHJpbnREcml2ZXItPmZsYWdzID0gKFRUWV9EUklWRVJfUkVBTF9SQVcgfAorCQkJCSAgIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfAorCQkJCSAgIFRUWV9EUklWRVJfSEFSRFdBUkVfQlJFQUspOworCisJLyogVGhlIGtlcm5lbCB3YW50cyBzcGFjZSB0byBzdG9yZSBwb2ludGVycyB0byB0dHlfc3RydWN0cyAqLworCWJyZC0+UHJpbnREcml2ZXItPnR0eXMgPQorCQlremFsbG9jKE1BWFBPUlRTICogc2l6ZW9mKHN0cnVjdCB0dHlfc3RydWN0ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJyZC0+UHJpbnREcml2ZXItPnR0eXMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBFbnRyeSBwb2ludHMgZm9yIGRyaXZlci4gIENhbGxlZCBieSB0aGUga2VybmVsIGZyb20KKwkgKiB0dHlfaW8uYyBhbmQgbl90dHkuYy4KKwkgKi8KKwl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5QcmludERyaXZlciwgJmRnYXBfdHR5X29wcyk7CisKKwlpZiAoIWJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCkgeworCQkvKiBSZWdpc3RlciB0dHkgZGV2aWNlcyAqLworCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5TZXJpYWxEcml2ZXIpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQgPSBUUlVFOworCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yXSA9IGJyZDsKKwkJYnJkLT5kZ2FwX1NlcmlhbF9NYWpvciA9IGJyZC0+U2VyaWFsRHJpdmVyLT5tYWpvcjsKKwl9CisKKwlpZiAoIWJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQpIHsKKwkJLyogUmVnaXN0ZXIgVHJhbnNwYXJlbnQgUHJpbnQgZGV2aWNlcyAqLworCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYnJkLT5QcmludERyaXZlcik7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQgPSBUUlVFOworCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5QcmludERyaXZlci0+bWFqb3JdID0gYnJkOworCQlicmQtPmRnYXBfVHJhbnNwYXJlbnRQcmludF9NYWpvciA9IGJyZC0+UHJpbnREcml2ZXItPm1ham9yOworCX0KKworCXJldHVybiByYzsKK30KKworLyoKKyAqIGRnYXBfdHR5X2luaXQoKQorICoKKyAqIEluaXQgdGhlIHR0eSBzdWJzeXN0ZW0uICBDYWxsZWQgb25jZSBwZXIgYm9hcmQgYWZ0ZXIgYm9hcmQgaGFzIGJlZW4KKyAqIGRvd25sb2FkZWQgYW5kIGluaXQnZWQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfaW5pdChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCWludCBpOworCWludCB0bHc7CisJdWludCB0cnVlX2NvdW50ID0gMDsKKwl1Y2hhciAqdmFkZHI7CisJdWNoYXIgbW9kZW0gPSAwOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCBic190ICpiczsKKwlzdHJ1Y3QgY21fdCAqY207CisKKwlpZiAoIWJyZCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qCisJICogSW5pdGlhbGl6ZSBib2FyZCBzdHJ1Y3R1cmUgZWxlbWVudHMuCisJICovCisKKwl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisJdHJ1ZV9jb3VudCA9IHJlYWR3KCh2YWRkciArIE5DSEFOKSk7CisKKwlicmQtPm5hc3luYyA9IGRnYXBfY29uZmlnX2dldF9udW1fcHJ0cyhicmQpOworCisJaWYgKCFicmQtPm5hc3luYykKKwkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOworCisJaWYgKGJyZC0+bmFzeW5jID4gYnJkLT5tYXhwb3J0cykKKwkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOworCisJaWYgKHRydWVfY291bnQgIT0gYnJkLT5uYXN5bmMpIHsKKwkJaWYgKChicmQtPnR5cGUgPT0gUFBDTSkgJiYgKHRydWVfY291bnQgPT0gNjQpKSB7CisJCQlwcl93YXJuKCJkZ2FwOiAlcyBjb25maWd1cmVkIGZvciAlZCBwb3J0cywgaGFzICVkIHBvcnRzLlxuIiwKKwkJCQlicmQtPm5hbWUsIGJyZC0+bmFzeW5jLCB0cnVlX2NvdW50KTsKKwkJCXByX3dhcm4oImRnYXA6IFBsZWFzZSBtYWtlIFNVUkUgdGhlIEVCSSBjYWJsZSBydW5uaW5nIGZyb20gdGhlIGNhcmRcbiIpOworCQkJcHJfd2FybigiZGdhcDogdG8gZWFjaCBFTSBtb2R1bGUgaXMgcGx1Z2dlZCBpbnRvIEVCSSBJTiFcbiIpOworCQl9IGVsc2UgaWYgKChicmQtPnR5cGUgPT0gUFBDTSkgJiYgKHRydWVfY291bnQgPT0gMCkpIHsKKwkJCXByX3dhcm4oImRnYXA6ICVzIGNvbmZpZ3VyZWQgZm9yICVkIHBvcnRzLCBoYXMgJWQgcG9ydHMuXG4iLAorCQkJCWJyZC0+bmFtZSwgYnJkLT5uYXN5bmMsIHRydWVfY291bnQpOworCQkJcHJfd2FybigiZGdhcDogUGxlYXNlIG1ha2UgU1VSRSB0aGUgRUJJIGNhYmxlIHJ1bm5pbmcgZnJvbSB0aGUgY2FyZFxuIik7CisJCQlwcl93YXJuKCJkZ2FwOiB0byBlYWNoIEVNIG1vZHVsZSBpcyBwbHVnZ2VkIGludG8gRUJJIElOIVxuIik7CisJCX0gZWxzZQorCQkJcHJfd2FybigiZGdhcDogJXMgY29uZmlndXJlZCBmb3IgJWQgcG9ydHMsIGhhcyAlZCBwb3J0cy5cbiIsCisJCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCk7CisKKwkJYnJkLT5uYXN5bmMgPSB0cnVlX2NvdW50OworCisJCS8qIElmIG5vIHBvcnRzLCBkb24ndCBib3RoZXIgZ29pbmcgYW55IGZ1cnRoZXIgKi8KKwkJaWYgKCFicmQtPm5hc3luYykgeworCQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBjaGFubmVsIG1lbW9yeSB0aGF0IG1pZ2h0IG5vdCBoYXZlIGJlZW4gYWxsb2NhdGVkCisJICogd2hlbiB0aGUgZHJpdmVyIHdhcyBmaXJzdCBsb2FkZWQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKKwkJaWYgKCFicmQtPmNoYW5uZWxzW2ldKSB7CisJCQlicmQtPmNoYW5uZWxzW2ldID0KKwkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF90KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWJyZC0+Y2hhbm5lbHNbaV0pCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwljaCA9IGJyZC0+Y2hhbm5lbHNbMF07CisJdmFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCisJYnMgPSAoc3RydWN0IGJzX3QgKikgKCh1bG9uZykgdmFkZHIgKyBDSEFOQlVGKTsKKwljbSA9IChzdHJ1Y3QgY21fdCAqKSAoKHVsb25nKSB2YWRkciArIENNREJVRik7CisKKwlicmQtPmJkX2JzID0gYnM7CisKKwkvKiBTZXQgdXAgY2hhbm5lbCB2YXJpYWJsZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKywgY2ggPSBicmQtPmNoYW5uZWxzW2ldLCBicysrKSB7CisKKwkJaWYgKCFicmQtPmNoYW5uZWxzW2ldKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2luaXQoJmNoLT5jaF9sb2NrKTsKKworCQkvKiBTdG9yZSBhbGwgb3VyIG1hZ2ljIG51bWJlcnMgKi8KKwkJY2gtPm1hZ2ljID0gREdBUF9DSEFOTkVMX01BR0lDOworCQljaC0+Y2hfdHVuLm1hZ2ljID0gREdBUF9VTklUX01BR0lDOworCQljaC0+Y2hfdHVuLnVuX3R5cGUgPSBER0FQX1NFUklBTDsKKwkJY2gtPmNoX3R1bi51bl9jaCA9IGNoOworCQljaC0+Y2hfdHVuLnVuX2RldiA9IGk7CisKKwkJY2gtPmNoX3B1bi5tYWdpYyA9IERHQVBfVU5JVF9NQUdJQzsKKwkJY2gtPmNoX3B1bi51bl90eXBlID0gREdBUF9QUklOVDsKKwkJY2gtPmNoX3B1bi51bl9jaCA9IGNoOworCQljaC0+Y2hfcHVuLnVuX2RldiA9IGk7CisKKwkJY2gtPmNoX3ZhZGRyID0gdmFkZHI7CisJCWNoLT5jaF9icyA9IGJzOworCQljaC0+Y2hfY20gPSBjbTsKKwkJY2gtPmNoX2JkID0gYnJkOworCQljaC0+Y2hfcG9ydG51bSA9IGk7CisJCWNoLT5jaF9kaWdpID0gZGdhcF9kaWdpX2luaXQ7CisKKwkJLyoKKwkJICogU2V0IHVwIGRpZ2kgZHNyIGFuZCBkY2QgYml0cyBiYXNlZCBvbiBhbHRwaW4gZmxhZy4KKwkJICovCisJCWlmIChkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKGJyZCkpIHsKKwkJCWNoLT5jaF9kc3IJPSBETV9DRDsKKwkJCWNoLT5jaF9jZAk9IERNX0RTUjsKKwkJCWNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgfD0gRElHSV9BTFRQSU47CisJCX0gZWxzZSB7CisJCQljaC0+Y2hfY2QJPSBETV9DRDsKKwkJCWNoLT5jaF9kc3IJPSBETV9EU1I7CisJCX0KKworCQljaC0+Y2hfdGFkZHIgPSB2YWRkciArICgoY2gtPmNoX2JzLT50eF9zZWcpIDw8IDQpOworCQljaC0+Y2hfcmFkZHIgPSB2YWRkciArICgoY2gtPmNoX2JzLT5yeF9zZWcpIDw8IDQpOworCQljaC0+Y2hfdHhfd2luID0gMDsKKwkJY2gtPmNoX3J4X3dpbiA9IDA7CisJCWNoLT5jaF90c2l6ZSA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9tYXgpKSArIDE7CisJCWNoLT5jaF9yc2l6ZSA9IHJlYWR3KCYoY2gtPmNoX2JzLT5yeF9tYXgpKSArIDE7CisJCWNoLT5jaF90c3RhcnQgPSAwOworCQljaC0+Y2hfcnN0YXJ0ID0gMDsKKworCQkvKiAuMjUgc2Vjb25kIGRlbGF5ICovCisJCWNoLT5jaF9jbG9zZV9kZWxheSA9IDI1MDsKKworCQkvKgorCQkgKiBTZXQgcXVldWUgd2F0ZXIgbWFya3MsIGludGVycnVwdCBtYXNrLAorCQkgKiBhbmQgZ2VuZXJhbCB0dHkgcGFyYW1ldGVycy4KKwkJICovCisJCXRsdyA9IGNoLT5jaF90c2l6ZSA+PSAyMDAwID8gKChjaC0+Y2hfdHNpemUgKiA1KSAvIDgpIDoKKwkJCQkJCWNoLT5jaF90c2l6ZSAvIDI7CisJCWNoLT5jaF90bHcgPSB0bHc7CisKKwkJZGdhcF9jbWR3KGNoLCBTVExPVywgdGx3LCAwKTsKKworCQlkZ2FwX2NtZHcoY2gsIFNSTE9XLCBjaC0+Y2hfcnNpemUgLyAyLCAwKTsKKworCQlkZ2FwX2NtZHcoY2gsIFNSSElHSCwgNyAqIGNoLT5jaF9yc2l6ZSAvIDgsIDApOworCisJCWNoLT5jaF9taXN0YXQgPSByZWFkYigmKGNoLT5jaF9icy0+bV9zdGF0KSk7CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX2ZsYWdzX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+Y2hfc25pZmZfd2FpdCk7CisKKwkJLyogVHVybiBvbiBhbGwgbW9kZW0gaW50ZXJydXB0cyBmb3Igbm93ICovCisJCW1vZGVtID0gKERNX0NEIHwgRE1fRFNSIHwgRE1fQ1RTIHwgRE1fUkkpOworCQl3cml0ZWIobW9kZW0sICYoY2gtPmNoX2JzLT5tX2ludCkpOworCisJCS8qCisJCSAqIFNldCBlZGVsYXkgdG8gMCBpZiBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb24sCisJCSAqIG90aGVyd2lzZSBzZXQgZWRlbGF5IHRvIHRoZSB1c3VhbCAxMDAuCisJCSAqLworCQlpZiAoYnJkLT5pbnRyX3VzZWQpCisJCQl3cml0ZXcoMCwgJihjaC0+Y2hfYnMtPmVkZWxheSkpOworCQllbHNlCisJCQl3cml0ZXcoMTAwLCAmKGNoLT5jaF9icy0+ZWRlbGF5KSk7CisKKwkJd3JpdGViKDEsICYoY2gtPmNoX2JzLT5pZGF0YSkpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfdW5pbml0KCkKKyAqCisgKiBVbmluaXRpYWxpemUgdGhlIFRUWSBwb3J0aW9uIG9mIHRoaXMgZHJpdmVyLiAgRnJlZSBhbGwgbWVtb3J5IGFuZAorICogcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX3R0eV91bmluaXQoc3RydWN0IGJvYXJkX3QgKmJyZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGkgPSAwOworCisJaWYgKGJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCkgeworCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yXSA9IE5VTEw7CisJCWJyZC0+ZGdhcF9TZXJpYWxfTWFqb3IgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKykgeworCQkJdHR5X3BvcnRfZGVzdHJveSgmYnJkLT5TZXJpYWxQb3J0c1tpXSk7CisJCQlkZXYgPSBicmQtPmNoYW5uZWxzW2ldLT5jaF90dW4udW5fc3lzZnM7CisJCQlkZ2FwX3JlbW92ZV90dHlfc3lzZnMoZGV2KTsKKwkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPlNlcmlhbERyaXZlciwgaSk7CisJCX0KKwkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKKwkJa2ZyZWUoYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpOworCQlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9IE5VTEw7CisJCXB1dF90dHlfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKKwkJa2ZyZWUoYnJkLT5TZXJpYWxQb3J0cyk7CisJCWJyZC0+ZGdhcF9NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KKworCWlmIChicmQtPmRnYXBfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkKSB7CisJCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlByaW50RHJpdmVyLT5tYWpvcl0gPSBOVUxMOworCQlicmQtPmRnYXBfVHJhbnNwYXJlbnRQcmludF9NYWpvciA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7CisJCQl0dHlfcG9ydF9kZXN0cm95KCZicmQtPlByaW50ZXJQb3J0c1tpXSk7CisJCQlkZXYgPSBicmQtPmNoYW5uZWxzW2ldLT5jaF9wdW4udW5fc3lzZnM7CisJCQlkZ2FwX3JlbW92ZV90dHlfc3lzZnMoZGV2KTsKKwkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPlByaW50RHJpdmVyLCBpKTsKKwkJfQorCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5QcmludERyaXZlcik7CisJCWtmcmVlKGJyZC0+UHJpbnREcml2ZXItPnR0eXMpOworCQlicmQtPlByaW50RHJpdmVyLT50dHlzID0gTlVMTDsKKwkJcHV0X3R0eV9kcml2ZXIoYnJkLT5QcmludERyaXZlcik7CisJCWtmcmVlKGJyZC0+UHJpbnRlclBvcnRzKTsKKwkJYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KK30KKworI2RlZmluZSBUTVBCVUZMRU4gKDEwMjQpCisvKgorICogZGdhcF9zbmlmZiAtIER1bXAgZGF0YSBvdXQgdG8gdGhlICJzbmlmZiIgYnVmZmVyIGlmIHRoZQorICogcHJvYyBzbmlmZiBmaWxlIGlzIG9wZW5lZC4uLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyICp0ZXh0LAorCQkJCSAgICAgdWNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgbjsKKwlpbnQgcjsKKwlpbnQgbmJ1ZjsKKwlpbnQgaTsKKwlpbnQgdG1wYnVmbGVuOworCWNoYXIgdG1wYnVmW1RNUEJVRkxFTl07CisJY2hhciAqcCA9IHRtcGJ1ZjsKKwlpbnQgdG9vX211Y2hfZGF0YTsKKworCS8qIExlYXZlIGlmIHNuaWZmIG5vdCBvcGVuICovCisJaWYgKCEoY2gtPmNoX3NuaWZmX2ZsYWdzICYgU05JRkZfT1BFTikpCisJCXJldHVybjsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCisJLyogQ3JlYXRlIG91ciBoZWFkZXIgZm9yIGRhdGEgZHVtcCAqLworCXAgKz0gc3ByaW50ZihwLCAiPCVsZCAlbGQ+PCVzPjwiLCB0di50dl9zZWMsIHR2LnR2X3VzZWMsIHRleHQpOworCXRtcGJ1ZmxlbiA9IHAgLSB0bXBidWY7CisKKwlkbyB7CisJCXRvb19tdWNoX2RhdGEgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgdG1wYnVmbGVuIDwgKFRNUEJVRkxFTiAtIDQpOyBpKyspIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCAiLCAqYnVmKTsKKwkJCWJ1ZisrOworCQkJdG1wYnVmbGVuID0gcCAtIHRtcGJ1ZjsKKwkJfQorCisJCWlmICh0bXBidWZsZW4gPCAoVE1QQlVGTEVOIC0gNCkpIHsKKwkJCWlmIChpID4gMCkKKwkJCQlwICs9IHNwcmludGYocCAtIDEsICIlc1xuIiwgIj4iKTsKKwkJCWVsc2UKKwkJCQlwICs9IHNwcmludGYocCwgIiVzXG4iLCAiPiIpOworCQl9IGVsc2UgeworCQkJdG9vX211Y2hfZGF0YSA9IDE7CisJCQlsZW4gLT0gaTsKKwkJfQorCisJCW5idWYgPSBzdHJsZW4odG1wYnVmKTsKKwkJcCA9IHRtcGJ1ZjsKKworCQkvKgorCQkgKiAgTG9vcCB3aGlsZSBkYXRhIHJlbWFpbnMuCisJCSAqLworCQl3aGlsZSAobmJ1ZiA+IDAgJiYgY2gtPmNoX3NuaWZmX2J1ZikgeworCQkJLyoKKwkJCSAqICBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgc3BhY2UgbGVmdCBpbiB0aGUKKwkJCSAqICBidWZmZXIuICBJZiB0aGVyZSdzIG5vbmUsIHdhaXQgdW50aWwgc29tZSBhcHBlYXJzLgorCQkJICovCisJCQluID0gKGNoLT5jaF9zbmlmZl9vdXQgLSBjaC0+Y2hfc25pZmZfaW4gLSAxKSAmCisJCQkgICAgIFNOSUZGX01BU0s7CisKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IHRvIHdyaXRlIHRvIGluIG91ciBzbmlmZgorCQkJICogYnVmZmVyLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gZHJvcCB0aGUgZGF0YS4KKwkJCSAqIFdlICpjYW5ub3QqIHNsZWVwIGhlcmUgd2FpdGluZyBmb3Igc3BhY2UsIGJlY2F1c2UKKwkJCSAqIHRoaXMgZnVuY3Rpb24gd2FzIHByb2JhYmx5IGNhbGxlZCBieSB0aGUKKwkJCSAqIGludGVycnVwdC90aW1lciByb3V0aW5lcyEKKwkJCSAqLworCQkJaWYgKG4gPT0gMCkKKwkJCQlyZXR1cm47CisKKwkJCS8qCisJCQkgKiBDb3B5IGFzIG11Y2ggZGF0YSBhcyB3aWxsIGZpdC4KKwkJCSAqLworCisJCQlpZiAobiA+IG5idWYpCisJCQkJbiA9IG5idWY7CisKKwkJCXIgPSBTTklGRl9NQVggLSBjaC0+Y2hfc25pZmZfaW47CisKKwkJCWlmIChyIDw9IG4pIHsKKwkJCQltZW1jcHkoY2gtPmNoX3NuaWZmX2J1ZiArCisJCQkJICAgICAgIGNoLT5jaF9zbmlmZl9pbiwgcCwgcik7CisKKwkJCQluIC09IHI7CisJCQkJY2gtPmNoX3NuaWZmX2luID0gMDsKKwkJCQlwICs9IHI7CisJCQkJbmJ1ZiAtPSByOworCQkJfQorCisJCQltZW1jcHkoY2gtPmNoX3NuaWZmX2J1ZiArIGNoLT5jaF9zbmlmZl9pbiwgcCwgbik7CisKKwkJCWNoLT5jaF9zbmlmZl9pbiArPSBuOworCQkJcCArPSBuOworCQkJbmJ1ZiAtPSBuOworCisJCQkvKgorCQkJICogIFdha2V1cCBhbnkgdGhyZWFkIHdhaXRpbmcgZm9yIGRhdGEKKwkJCSAqLworCQkJaWYgKGNoLT5jaF9zbmlmZl9mbGFncyAmIFNOSUZGX1dBSVRfREFUQSkgeworCQkJCWNoLT5jaF9zbmlmZl9mbGFncyAmPSB+U05JRkZfV0FJVF9EQVRBOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3NuaWZmX3dhaXQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIHVzZXIgc2VudCB1cyB0b28gbXVjaCBkYXRhIHRvIHB1c2ggaW50byBvdXIgdG1wYnVmLAorCQkgKiB3ZSBuZWVkIHRvIGtlZXAgbG9vcGluZyBhcm91bmQgb24gYWxsIHRoZSBkYXRhLgorCQkgKi8KKwkJaWYgKHRvb19tdWNoX2RhdGEpIHsKKwkJCXAgPSB0bXBidWY7CisJCQl0bXBidWZsZW4gPSAwOworCQl9CisKKwl9IHdoaWxlICh0b29fbXVjaF9kYXRhKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9pbnB1dCAtIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YS4KKyAqCisgKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGRnYXBfaW5wdXQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBic190CSpiczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHA7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJdWludAlybWFzazsKKwl1aW50CWhlYWQ7CisJdWludAl0YWlsOworCWludAlkYXRhX2xlbjsKKwl1bG9uZwlsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisJaW50IGZsaXBfbGVuOworCWludCBsZW4gPSAwOworCWludCBuID0gMDsKKwl1Y2hhciAqYnVmOworCXVjaGFyIHRtcGNoYXI7CisJaW50IHMgPSAwOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwl0cCA9IGNoLT5jaF90dW4udW5fdHR5OworCisJYnMgID0gY2gtPmNoX2JzOworCWlmICghYnMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkvKgorCSAqICAgICAgRmlndXJlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLgorCSAqICAgICAgRXhpdCBpbW1lZGlhdGVseSBpZiBub25lLgorCSAqLworCisJcm1hc2sgPSBjaC0+Y2hfcnNpemUgLSAxOworCisJaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKKwloZWFkICY9IHJtYXNrOworCXRhaWwgPSByZWFkdygmKGJzLT5yeF90YWlsKSk7CisJdGFpbCAmPSBybWFzazsKKworCWRhdGFfbGVuID0gKGhlYWQgLSB0YWlsKSAmIHJtYXNrOworCisJaWYgKGRhdGFfbGVuID09IDApIHsKKwkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBub3Qgb3Blbiwgb3IgQ1JFQUQgaXMgb2ZmLCBmbHVzaAorCSAqIGlucHV0IGRhdGEgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKwkgKi8KKwlpZiAoKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkgfHwgIXRwICB8fAorCSAgICAodHAtPm1hZ2ljICE9IFRUWV9NQUdJQykgfHwKKwkgICAgIShjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSB8fAorCSAgICAhKHRwLT50ZXJtaW9zLmNfY2ZsYWcgJiBDUkVBRCkgfHwKKwkgICAgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9DTE9TSU5HKSkgeworCisJCXdyaXRldyhoZWFkLCAmKGJzLT5yeF90YWlsKSk7CisJCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHdlIGFyZSB0aHJvdHRsZWQsIHNpbXBseSBkb24ndCByZWFkIGFueSBkYXRhLgorCSAqLworCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9SWEJMT0NLKSB7CisJCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqICAgICAgSWdub3JlIG9ydW5zLgorCSAqLworCXRtcGNoYXIgPSByZWFkYigmKGJzLT5vcnVuKSk7CisJaWYgKHRtcGNoYXIpIHsKKwkJY2gtPmNoX2Vycl9vdmVycnVuKys7CisJCXdyaXRlYigwLCAmKGJzLT5vcnVuKSk7CisJfQorCisJLyogRGVjaWRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHNlbmQgaW50byB0aGUgdHR5IGxheWVyICovCisJZmxpcF9sZW4gPSBUVFlfRkxJUEJVRl9TSVpFOworCisJLyogQ2hvcCBkb3duIHRoZSBsZW5ndGgsIGlmIG5lZWRlZCAqLworCWxlbiA9IG1pbihkYXRhX2xlbiwgZmxpcF9sZW4pOworCWxlbiA9IG1pbihsZW4sIChOX1RUWV9CVUZfU0laRSAtIDEpKTsKKworCWxkID0gdHR5X2xkaXNjX3JlZih0cCk7CisKKyNpZmRlZiBUVFlfRE9OVF9GTElQCisJLyoKKwkgKiBJZiB0aGUgRE9OVF9GTElQIGZsYWcgaXMgb24sIGRvbid0IGZsdXNoIG91ciBidWZmZXIsIGFuZCBhY3QKKwkgKiBsaWtlIHRoZSBsZCBkb2Vzbid0IGhhdmUgYW55IHNwYWNlIHRvIHB1dCB0aGUgZGF0YSByaWdodCBub3cuCisJICovCisJaWYgKHRlc3RfYml0KFRUWV9ET05UX0ZMSVAsICZ0cC0+ZmxhZ3MpKQorCQlsZW4gPSAwOworI2VuZGlmCisKKwkvKgorCSAqIElmIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgbGQsCisJICogZG9uJ3QgZmx1c2ggb3VyIGJ1ZmZlciwgYW5kIGFjdCBsaWtlIHRoZSBsZCBkb2Vzbid0CisJICogaGF2ZSBhbnkgc3BhY2UgdG8gcHV0IHRoZSBkYXRhIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAoIWxkKSB7CisJCWxlbiA9IDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgbGQgZG9lc24ndCBoYXZlIGEgcG9pbnRlciB0byBhIHJlY2VpdmVfYnVmIGZ1bmN0aW9uLAorCQkgKiBmbHVzaCB0aGUgZGF0YSwgdGhlbiBhY3QgbGlrZSB0aGUgbGQgZG9lc24ndCBoYXZlIGFueQorCQkgKiBzcGFjZSB0byBwdXQgdGhlIGRhdGEgcmlnaHQgbm93LgorCQkgKi8KKwkJaWYgKCFsZC0+b3BzLT5yZWNlaXZlX2J1ZikgeworCQkJd3JpdGV3KGhlYWQsICYoYnMtPnJ4X3RhaWwpKTsKKwkJCWxlbiA9IDA7CisJCX0KKwl9CisKKwlpZiAobGVuIDw9IDApIHsKKwkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJaWYgKGxkKQorCQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IGNoLT5jaF9iZC0+ZmxpcGJ1ZjsKKwluID0gbGVuOworCisJLyoKKwkgKiBuIG5vdyBjb250YWlucyB0aGUgbW9zdCBhbW91bnQgb2YgZGF0YSB3ZSBjYW4gY29weSwKKwkgKiBib3VuZGVkIGVpdGhlciBieSBvdXIgYnVmZmVyIHNpemUgb3IgdGhlIGFtb3VudAorCSAqIG9mIGRhdGEgdGhlIGNhcmQgYWN0dWFsbHkgaGFzIHBlbmRpbmcuLi4KKwkgKi8KKwl3aGlsZSAobikgeworCisJCXMgPSAoKGhlYWQgPj0gdGFpbCkgPyBoZWFkIDogY2gtPmNoX3JzaXplKSAtIHRhaWw7CisJCXMgPSBtaW4ocywgbik7CisKKwkJaWYgKHMgPD0gMCkKKwkJCWJyZWFrOworCisJCW1lbWNweV9mcm9taW8oYnVmLCAoY2hhciAqKSBjaC0+Y2hfcmFkZHIgKyB0YWlsLCBzKTsKKwkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBSRUFEIiwgYnVmLCBzKTsKKworCQl0YWlsICs9IHM7CisJCWJ1ZiArPSBzOworCisJCW4gLT0gczsKKwkJLyogRmxpcCBxdWV1ZSBpZiBuZWVkZWQgKi8KKwkJdGFpbCAmPSBybWFzazsKKwl9CisKKwl3cml0ZXcodGFpbCwgJihicy0+cnhfdGFpbCkpOworCXdyaXRlYigxLCAmKGJzLT5pZGF0YSkpOworCWNoLT5jaF9yeGNvdW50ICs9IGxlbjsKKworCS8qCisJICogSWYgd2UgYXJlIGNvbXBsZXRlbHkgcmF3LCB3ZSBkb24ndCBuZWVkIHRvIGdvIHRocm91Z2ggYSBsb3QKKwkgKiBvZiB0aGUgdHR5IGxheWVycyB0aGF0IGV4aXN0LgorCSAqIEluIHRoaXMgY2FzZSwgd2UgdGFrZSB0aGUgc2hvcnRlc3QgYW5kIGZhc3Rlc3Qgcm91dGUgd2UKKwkgKiBjYW4gdG8gcmVsYXkgdGhlIGRhdGEgdG8gdGhlIHVzZXIuCisJICoKKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgYXJlIG5vdCByYXcsIHdlIG5lZWQgdG8gZ28gdGhyb3VnaAorCSAqIHRoZSB0dHkgbGF5ZXIsIHdoaWNoIGhhcyBpdHMgQVBJIG1vcmUgd2VsbCBkZWZpbmVkLgorCSAqLworCWlmIChJX1BBUk1SSyh0cCkgfHwgSV9CUktJTlQodHApIHx8IElfSU5QQ0sodHApKSB7CisJCWRnYXBfcGFyaXR5X3NjYW4oY2gsIGNoLT5jaF9iZC0+ZmxpcGJ1ZiwKKwkJCQkgY2gtPmNoX2JkLT5mbGlwZmxhZ2J1ZiwgJmxlbik7CisKKwkJbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHAtPnBvcnQsIGxlbik7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmdfZmxhZ3ModHAtPnBvcnQsIGNoLT5jaF9iZC0+ZmxpcGJ1ZiwKKwkJCWNoLT5jaF9iZC0+ZmxpcGZsYWdidWYsIGxlbik7CisJfSBlbHNlIHsKKwkJbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHAtPnBvcnQsIGxlbik7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHAtPnBvcnQsIGNoLT5jaF9iZC0+ZmxpcGJ1ZiwgbGVuKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCS8qIFRlbGwgdGhlIHR0eSBsYXllciBpdHMgb2theSB0byAiZWF0IiB0aGUgZGF0YSBub3cgKi8KKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0cC0+cG9ydCk7CisKKwlpZiAobGQpCisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV0ZXJtaW5lcyB3aGVuIENBUlJJRVIgY2hhbmdlcyBzdGF0ZSBhbmQgdGFrZXMgYXBwcm9wcmlhdGUKKyAqIGFjdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkZ2FwX2NhcnJpZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCisJaW50IHZpcnRfY2FycmllciA9IDA7CisJaW50IHBoeXNfY2FycmllciA9IDA7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJLyogTWFrZSBzdXJlIGFsdHBpbiBpcyBhbHdheXMgc2V0IGNvcnJlY3RseSAqLworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pIHsKKwkJY2gtPmNoX2RzciAgICAgID0gRE1fQ0Q7CisJCWNoLT5jaF9jZCAgICAgICA9IERNX0RTUjsKKwl9IGVsc2UgeworCQljaC0+Y2hfZHNyICAgICAgPSBETV9EU1I7CisJCWNoLT5jaF9jZCAgICAgICA9IERNX0NEOworCX0KKworCWlmIChjaC0+Y2hfbWlzdGF0ICYgRF9DRChjaCkpCisJCXBoeXNfY2FycmllciA9IDE7CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRk9SQ0VEQ0QpCisJCXZpcnRfY2FycmllciA9IDE7CisKKwlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDTE9DQUwpCisJCXZpcnRfY2FycmllciA9IDE7CisKKwkvKgorCSAqIFRlc3QgZm9yIGEgVklSVFVBTCBjYXJyaWVyIHRyYW5zaXRpb24gdG8gSElHSC4KKwkgKi8KKwlpZiAoKChjaC0+Y2hfZmxhZ3MgJiBDSF9GQ0FSKSA9PSAwKSAmJiAodmlydF9jYXJyaWVyID09IDEpKSB7CisKKwkJLyoKKwkJICogV2hlbiBjYXJyaWVyIHJpc2VzLCB3YWtlIGFueSB0aHJlYWRzIHdhaXRpbmcKKwkJICogZm9yIGNhcnJpZXIgaW4gdGhlIG9wZW4gcm91dGluZS4KKwkJICovCisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJfQorCisJLyoKKwkgKiBUZXN0IGZvciBhIFBIWVNJQ0FMIGNhcnJpZXIgdHJhbnNpdGlvbiB0byBISUdILgorCSAqLworCWlmICgoKGNoLT5jaF9mbGFncyAmIENIX0NEKSA9PSAwKSAmJiAocGh5c19jYXJyaWVyID09IDEpKSB7CisKKwkJLyoKKwkJICogV2hlbiBjYXJyaWVyIHJpc2VzLCB3YWtlIGFueSB0aHJlYWRzIHdhaXRpbmcKKwkJICogZm9yIGNhcnJpZXIgaW4gdGhlIG9wZW4gcm91dGluZS4KKwkJICovCisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJfQorCisJLyoKKwkgKiAgVGVzdCBmb3IgYSBQSFlTSUNBTCB0cmFuc2l0aW9uIHRvIGxvdywgc28gbG9uZyBhcyB3ZSBhcmVuJ3QKKwkgKiAgY3VycmVudGx5IGlnbm9yaW5nIHBoeXNpY2FsIHRyYW5zaXRpb25zICh3aGljaCBpcyB3aGF0ICJ2aXJ0dWFsCisJICogIGNhcnJpZXIiIGluZGljYXRlcykuCisJICoKKwkgKiAgVGhlIHRyYW5zaXRpb24gb2YgdGhlIHZpcnR1YWwgY2FycmllciB0byBsb3cgcmVhbGx5IGRvZXNuJ3QKKwkgKiAgbWF0dGVyLi4uIGl0IHJlYWxseSBvbmx5IG1lYW5zICJpZ25vcmUgY2FycmllciBzdGF0ZSIsIG5vdAorCSAqICAibWFrZSBwcmV0ZW5kIHRoYXQgY2FycmllciBpcyB0aGVyZSIuCisJICovCisJaWYgKCh2aXJ0X2NhcnJpZXIgPT0gMCkgJiYKKwkgICAgKChjaC0+Y2hfZmxhZ3MgJiBDSF9DRCkgIT0gMCkgJiYKKwkgICAgKHBoeXNfY2FycmllciA9PSAwKSkgeworCisJCS8qCisJCSAqICAgV2hlbiBjYXJyaWVyIGRyb3BzOgorCQkgKgorCQkgKiAgIERyb3AgY2FycmllciBvbiBhbGwgb3BlbiB1bml0cy4KKwkJICoKKwkJICogICBGbHVzaCBxdWV1ZXMsIHdha2luZyB1cCBhbnkgdGFzayB3YWl0aW5nIGluIHRoZQorCQkgKiAgIGxpbmUgZGlzY2lwbGluZS4KKwkJICoKKwkJICogICBTZW5kIGEgaGFuZ3VwIHRvIHRoZSBjb250cm9sIHRlcm1pbmFsLgorCQkgKgorCQkgKiAgIEVuYWJsZSBhbGwgc2VsZWN0IGNhbGxzLgorCQkgKi8KKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisKKwkJaWYgKGNoLT5jaF90dW4udW5fb3Blbl9jb3VudCA+IDApCisJCQl0dHlfaGFuZ3VwKGNoLT5jaF90dW4udW5fdHR5KTsKKworCQlpZiAoY2gtPmNoX3B1bi51bl9vcGVuX2NvdW50ID4gMCkKKwkJCXR0eV9oYW5ndXAoY2gtPmNoX3B1bi51bl90dHkpOworCX0KKworCS8qCisJICogIE1ha2Ugc3VyZSB0aGF0IG91ciBjYWNoZWQgdmFsdWVzIHJlZmxlY3QgdGhlIGN1cnJlbnQgcmVhbGl0eS4KKwkgKi8KKwlpZiAodmlydF9jYXJyaWVyID09IDEpCisJCWNoLT5jaF9mbGFncyB8PSBDSF9GQ0FSOworCWVsc2UKKwkJY2gtPmNoX2ZsYWdzICY9IH5DSF9GQ0FSOworCisJaWYgKHBoeXNfY2FycmllciA9PSAxKQorCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfQ0Q7CisJZWxzZQorCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX0NEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVFRZIEVudHJ5IHBvaW50cyBhbmQgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBkZ2FwX3R0eV9vcGVuKCkKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdAkqYnJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90CSp1bjsKKwlzdHJ1Y3QgYnNfdAkqYnM7CisJdWludAkJbWFqb3IgPSAwOworCXVpbnQJCW1pbm9yID0gMDsKKwlpbnQJCXJjID0gMDsKKwl1bG9uZwkJbG9ja19mbGFnczsKKwl1bG9uZwkJbG9ja19mbGFnczI7CisJdTE2CQloZWFkOworCisJcmMgPSAwOworCisJbWFqb3IgPSBNQUpPUih0dHlfZGV2bnVtKHR0eSkpOworCW1pbm9yID0gTUlOT1IodHR5X2Rldm51bSh0dHkpKTsKKworCWlmIChtYWpvciA+IDI1NSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIEdldCBib2FyZCBwb2ludGVyIGZyb20gb3VyIGFycmF5IG9mIG1ham9ycyB3ZSBoYXZlIGFsbG9jYXRlZCAqLworCWJyZCA9IGRnYXBfQm9hcmRzQnlNYWpvclttYWpvcl07CisJaWYgKCFicmQpCisJCXJldHVybiAtRU5YSU87CisKKwkvKgorCSAqIElmIGJvYXJkIGlzIG5vdCB5ZXQgdXAgdG8gYSBzdGF0ZSBvZiBSRUFEWSwgZ28gdG8KKwkgKiBzbGVlcCB3YWl0aW5nIGZvciBpdCB0byBoYXBwZW4gb3IgdGhleSBjYW5jZWwgdGhlIG9wZW4uCisJICovCisJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYnJkLT5zdGF0ZV93YWl0LAorCQkoYnJkLT5zdGF0ZSAmIEJPQVJEX1JFQURZKSk7CisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogVGhlIHdhaXQgYWJvdmUgc2hvdWxkIGd1YXJhbnRlZSB0aGlzIGNhbm5vdCBoYXBwZW4gKi8KKwlpZiAoYnJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIElmIG9wZW5lZCBkZXZpY2UgaXMgZ3JlYXRlciB0aGFuIG91ciBudW1iZXIgb2YgcG9ydHMsIGJhaWwuICovCisJaWYgKE1JTk9SKHR0eV9kZXZudW0odHR5KSkgPiBicmQtPm5hc3luYykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWNoID0gYnJkLT5jaGFubmVsc1ttaW5vcl07CisJaWYgKCFjaCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIEdyYWIgY2hhbm5lbCBsb2NrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkvKiBGaWd1cmUgb3V0IG91ciB0eXBlICovCisJaWYgKG1ham9yID09IGJyZC0+ZGdhcF9TZXJpYWxfTWFqb3IpIHsKKwkJdW4gPSAmYnJkLT5jaGFubmVsc1ttaW5vcl0tPmNoX3R1bjsKKwkJdW4tPnVuX3R5cGUgPSBER0FQX1NFUklBTDsKKwl9IGVsc2UgaWYgKG1ham9yID09IGJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yKSB7CisJCXVuID0gJmJyZC0+Y2hhbm5lbHNbbWlub3JdLT5jaF9wdW47CisJCXVuLT51bl90eXBlID0gREdBUF9QUklOVDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIFN0b3JlIG91ciB1bml0IGludG8gZHJpdmVyX2RhdGEsIHNvIHdlIGFsd2F5cyBoYXZlIGl0IGF2YWlsYWJsZS4gKi8KKwl0dHktPmRyaXZlcl9kYXRhID0gdW47CisKKwkvKgorCSAqIEVycm9yIGlmIGNoYW5uZWwgaW5mbyBwb2ludGVyIGlzIE5VTEwuCisJICovCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0dHkncworCSAqLworCWlmICghKHVuLT51bl9mbGFncyAmIFVOX0lTT1BFTikpIHsKKwkJLyogU3RvcmUgaW1wb3J0YW50IHZhcmlhYmxlcy4gKi8KKwkJdW4tPnVuX3R0eSAgICAgPSB0dHk7CisKKwkJLyogTWF5YmUgZG8gc29tZXRoaW5nIGhlcmUgdG8gdGhlIFRUWSBzdHJ1Y3QgYXMgd2VsbD8gKi8KKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgaWYgbmVpdGhlciB0ZXJtaW5hbCBvciBwcmludGVyIGlzIG9wZW4uCisJICovCisJaWYgKCEoKGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSAmIFVOX0lTT1BFTikpIHsKKworCQljaC0+Y2hfbWZvcmNlID0gMDsKKwkJY2gtPmNoX212YWwgPSAwOworCisJCS8qCisJCSAqIEZsdXNoIGlucHV0IHF1ZXVlLgorCQkgKi8KKwkJaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKKwkJd3JpdGV3KGhlYWQsICYoYnMtPnJ4X3RhaWwpKTsKKworCQljaC0+Y2hfZmxhZ3MgPSAwOworCQljaC0+cHNjYW5fc3RhdGUgPSAwOworCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSAwOworCisJCWNoLT5jaF9jX2NmbGFnICAgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKKwkJY2gtPmNoX2NfaWZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2lmbGFnOworCQljaC0+Y2hfY19vZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfb2ZsYWc7CisJCWNoLT5jaF9jX2xmbGFnICAgPSB0dHktPnRlcm1pb3MuY19sZmxhZzsKKwkJY2gtPmNoX3N0YXJ0YyA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVEFSVF07CisJCWNoLT5jaF9zdG9wYyAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RPUF07CisKKwkJLyogVE9ETzogZmx1c2ggb3VyIFRUWSBzdHJ1Y3QgaGVyZT8gKi8KKwl9CisKKwlkZ2FwX2NhcnJpZXIoY2gpOworCS8qCisJICogUnVuIHBhcmFtIGluIGNhc2Ugd2UgY2hhbmdlZCBhbnl0aGluZworCSAqLworCWRnYXBfcGFyYW0odHR5KTsKKworCS8qCisJICogZm9sbG93IHByb3RvY29sIGZvciBvcGVuaW5nIHBvcnQKKwkgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJjID0gZGdhcF9ibG9ja190aWxfcmVhZHkodHR5LCBmaWxlLCBjaCk7CisKKwlpZiAoIXVuLT51bl90dHkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogTm8gZ29pbmcgYmFjayBub3csIGluY3JlbWVudCBvdXIgdW5pdCBhbmQgY2hhbm5lbCBjb3VudGVycyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJY2gtPmNoX29wZW5fY291bnQrKzsKKwl1bi0+dW5fb3Blbl9jb3VudCsrOworCXVuLT51bl9mbGFncyB8PSAoVU5fSVNPUEVOKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBkZ2FwX2Jsb2NrX3RpbF9yZWFkeSgpCisgKgorICogV2FpdCBmb3IgRENELCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWludAlvbGRfZmxhZ3MgPSAwOworCWludCBzbGVlcF9vbl91bl9mbGFncyA9IDA7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQyB8fCAhZmlsZSB8fCAhY2ggfHwKKwkJY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAtRU5YSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJY2gtPmNoX3dvcGVuKys7CisKKwkvKiBMb29wIGZvcmV2ZXIgKi8KKwl3aGlsZSAoMSkgeworCisJCXNsZWVwX29uX3VuX2ZsYWdzID0gMDsKKworCQkvKgorCQkgKiBJZiBib2FyZCBoYXMgZmFpbGVkIHNvbWVob3cgZHVyaW5nIG91ciBzbGVlcCwKKwkJICogYmFpbCB3aXRoIGVycm9yLgorCQkgKi8KKwkJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7CisJCQlyZXR2YWwgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCisJCS8qIElmIHR0eSB3YXMgaHVuZyB1cCwgYnJlYWsgb3V0IG9mIGxvb3AgYW5kIHNldCBlcnJvci4gKi8KKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlsZSkpIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIElmIGVpdGhlciB1bml0IGlzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZyYWdpbGUgcGFydCBvZiBjbG9zZSwKKwkJICogd2UganVzdCBjYW5ub3QgdG91Y2ggdGhlIGNoYW5uZWwgc2FmZWx5LgorCQkgKiBHbyBiYWNrIHRvIHNsZWVwLCBrbm93aW5nIHRoYXQgd2hlbiB0aGUgY2hhbm5lbCBjYW4gYmUKKwkJICogdG91Y2hlZCBzYWZlbHksIHRoZSBjbG9zZSByb3V0aW5lIHdpbGwgc2lnbmFsIHRoZQorCQkgKiBjaF93YWl0X2ZsYWdzIHRvIHdha2UgdXMgYmFjayB1cC4KKwkJICovCisJCWlmICghKChjaC0+Y2hfdHVuLnVuX2ZsYWdzIHwgY2gtPmNoX3B1bi51bl9mbGFncykgJgorCQkgICAgICBVTl9DTE9TSU5HKSkgeworCisJCQkvKgorCQkJICogT3VyIGNvbmRpdGlvbnMgdG8gbGVhdmUgY2xlYW5seSBhbmQgaGFwcGlseToKKwkJCSAqIDEpIE5PTkJMT0NLSU5HIG9uIHRoZSB0dHkgaXMgc2V0LgorCQkJICogMikgQ0xPQ0FMIGlzIHNldC4KKwkJCSAqIDMpIERDRCAoZmFrZSBvciByZWFsKSBpcyBhY3RpdmUuCisJCQkgKi8KKworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCWJyZWFrOworCisJCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCQkJYnJlYWs7CisKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9DRCkKKwkJCQlicmVhazsKKworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0ZDQVIpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlzbGVlcF9vbl91bl9mbGFncyA9IDE7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhIHNpZ25hbCBwZW5kaW5nLCB0aGUgdXNlciBwcm9iYWJseQorCQkgKiBpbnRlcnJ1cHRlZCAoY3RybC1jKSB1cy4KKwkJICogTGVhdmUgbG9vcCB3aXRoIGVycm9yIHNldC4KKwkJICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBTdG9yZSB0aGUgZmxhZ3MgYmVmb3JlIHdlIGxldCBnbyBvZiBjaGFubmVsIGxvY2sKKwkJICovCisJCWlmIChzbGVlcF9vbl91bl9mbGFncykKKwkJCW9sZF9mbGFncyA9IGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzOworCQllbHNlCisJCQlvbGRfZmxhZ3MgPSBjaC0+Y2hfZmxhZ3M7CisKKwkJLyoKKwkJICogTGV0IGdvIG9mIGNoYW5uZWwgbG9jayBiZWZvcmUgY2FsbGluZyBzY2hlZHVsZS4KKwkJICogT3VyIHBvbGxlciB3aWxsIGdldCBhbnkgRkVQIGV2ZW50cyBhbmQgd2FrZSB1cyB1cCB3aGVuIERDRAorCQkgKiBldmVudHVhbGx5IGdvZXMgYWN0aXZlLgorCQkgKi8KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwkJLyoKKwkJICogV2FpdCBmb3Igc29tZXRoaW5nIGluIHRoZSBmbGFncyB0byBjaGFuZ2UKKwkJICogZnJvbSB0aGUgY3VycmVudCB2YWx1ZS4KKwkJICovCisJCWlmIChzbGVlcF9vbl91bl9mbGFncykgeworCQkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHVuLT51bl9mbGFnc193YWl0LAorCQkJCShvbGRfZmxhZ3MgIT0gKGNoLT5jaF90dW4udW5fZmxhZ3MgfAorCQkJCQkgICAgICAgY2gtPmNoX3B1bi51bl9mbGFncykpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjaC0+Y2hfZmxhZ3Nfd2FpdCwKKwkJCQkob2xkX2ZsYWdzICE9IGNoLT5jaF9mbGFncykpOworCQl9CisKKwkJLyoKKwkJICogV2UgZ290IHdva2VuIHVwIGZvciBzb21lIHJlYXNvbi4KKwkJICogQmVmb3JlIGxvb3BpbmcgYXJvdW5kLCBncmFiIG91ciBjaGFubmVsIGxvY2suCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCX0KKworCWNoLT5jaF93b3Blbi0tOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfaGFuZ3VwKCkKKyAqCisgKiBIYW5ndXAgdGhlIHBvcnQuICBMaWtlIGEgY2xvc2UsIGJ1dCBkb24ndCB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90CSpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdAkqdW47CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwkvKiBmbHVzaCB0aGUgdHJhbnNtaXQgcXVldWVzICovCisJZGdhcF90dHlfZmx1c2hfYnVmZmVyKHR0eSk7CisKK30KKworLyoKKyAqIGRnYXBfdHR5X2Nsb3NlKCkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBrdGVybWlvcyAqdHM7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCWludCByYyA9IDA7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwl0cyA9ICZ0dHktPnRlcm1pb3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBjbG9zZSBvciBub3QgLSBhbmQgaWYgd2UgYWdyZWUgYWJvdXQKKwkgKiB3aGljaCB0eXBlIG9mIGNsb3NlIGl0IGlzIHdpdGggdGhlIExpbmUgRGlzY2lwbGluZQorCSAqLworCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAodW4tPnVuX29wZW5fY291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICB1bl9vcGVuX2NvdW50IHNob3VsZCBhbHdheXMKKwkJICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKwkJICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCisJCSAqLworCQl1bi0+dW5fb3Blbl9jb3VudCA9IDE7CisJfQorCisJaWYgKC0tdW4tPnVuX29wZW5fY291bnQgPCAwKQorCQl1bi0+dW5fb3Blbl9jb3VudCA9IDA7CisKKwljaC0+Y2hfb3Blbl9jb3VudC0tOworCisJaWYgKGNoLT5jaF9vcGVuX2NvdW50ICYmIHVuLT51bl9vcGVuX2NvdW50KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9LLCBpdHMgdGhlIGxhc3QgY2xvc2Ugb24gdGhlIHVuaXQgKi8KKworCXVuLT51bl9mbGFncyB8PSBVTl9DTE9TSU5HOworCisJdHR5LT5jbG9zaW5nID0gMTsKKworCS8qCisJICogT25seSBvZmZpY2lhbGx5IGNsb3NlIGNoYW5uZWwgaWYgY291bnQgaXMgMCBhbmQKKwkgKiBESUdJX1BSSU5URVIgYml0IGlzIG5vdCBzZXQuCisJICovCisJaWYgKChjaC0+Y2hfb3Blbl9jb3VudCA9PSAwKSAmJgorCSAgICAhKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX1BSSU5URVIpKSB7CisKKwkJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfUlhCTE9DSyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCS8qIHdhaXQgZm9yIG91dHB1dCB0byBkcmFpbiAqLworCQkvKiBUaGlzIHdpbGwgYWxzbyByZXR1cm4gaWYgd2UgdGFrZSBhbiBpbnRlcnJ1cHQgKi8KKworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKworCQlkZ2FwX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQl0dHktPmNsb3NpbmcgPSAwOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgSFVQQ0wgc2V0LCBsb3dlciBEVFIgYW5kIFJUUworCQkgKi8KKwkJaWYgKGNoLT5jaF9jX2NmbGFnICYgSFVQQ0wpIHsKKwkJCWNoLT5jaF9tb3N0YXQgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKKwkJCWRnYXBfY21kYihjaCwgU01PREVNLCAwLCBEX0RUUihjaCl8RF9SVFMoY2gpLCAwKTsKKworCQkJLyoKKwkJCSAqIEdvIHRvIHNsZWVwIHRvIGVuc3VyZSBSVFMvRFRSCisJCQkgKiBoYXZlIGJlZW4gZHJvcHBlZCBmb3IgbW9kZW1zIHRvIHNlZSBpdC4KKwkJCSAqLworCQkJaWYgKGNoLT5jaF9jbG9zZV9kZWxheSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLAorCQkJCQkJICAgICAgIGxvY2tfZmxhZ3MpOworCQkJCWRnYXBfbXNfc2xlZXAoY2gtPmNoX2Nsb3NlX2RlbGF5KTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJfQorCQl9CisKKwkJY2gtPnBzY2FuX3N0YXRlID0gMDsKKwkJY2gtPnBzY2FuX3NhdmVjaGFyID0gMDsKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IDA7CisKKwl9CisKKwkvKgorCSAqIHR1cm4gb2ZmIHByaW50IGRldmljZSB3aGVuIGNsb3NpbmcgcHJpbnQgZGV2aWNlLgorCSAqLworCWlmICgodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgICYmIChjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkgeworCQlkZ2FwX3dtb3ZlKGNoLCBjaC0+Y2hfZGlnaS5kaWdpX29mZnN0ciwKKwkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKKwkJY2gtPmNoX2ZsYWdzICY9IH5DSF9QUk9OOworCX0KKworCXVuLT51bl90dHkgPSBOVUxMOworCXVuLT51bl9mbGFncyAmPSB+KFVOX0lTT1BFTiB8IFVOX0NMT1NJTkcpOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1bi0+dW5fZmxhZ3Nfd2FpdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIoKQorICoKKyAqIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGhhdmUgbm90IGJlZW4gdHJhbnNtaXR0ZWQgeWV0LgorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlCisgKiBpcyBkYXRhIHdhaXRpbmcgdG8gYmUgdHJhbnNtaXR0ZWQvZHJhaW5lZC9mbHVzaGVkIG9yIG5vdC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQgPSBOVUxMOworCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKKwlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOworCXN0cnVjdCBic190ICpicyA9IE5VTEw7CisJdWNoYXIgdGJ1c3k7CisJdWludCBjaGFycyA9IDA7CisJdTE2IHRoZWFkLCB0dGFpbCwgdG1hc2ssIGNoZWFkLCBjdGFpbDsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOworCXVsb25nICAgbG9ja19mbGFnczIgPSAwOworCisJaWYgKHR0eSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJdG1hc2sgPSAoY2gtPmNoX3RzaXplIC0gMSk7CisKKwkvKiBHZXQgVHJhbnNtaXQgcXVldWUgcG9pbnRlcnMgKi8KKwl0aGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOworCXR0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7CisKKwkvKiBHZXQgdGJ1c3kgZmxhZyAqLworCXRidXN5ID0gcmVhZGIoJihicy0+dGJ1c3kpKTsKKworCS8qIEdldCBDb21tYW5kIHF1ZXVlIHBvaW50ZXJzICovCisJY2hlYWQgPSByZWFkdygmKGNoLT5jaF9jbS0+Y21faGVhZCkpOworCWN0YWlsID0gcmVhZHcoJihjaC0+Y2hfY20tPmNtX3RhaWwpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyoKKwkgKiBUaGUgb25seSB3YXkgd2Uga25vdyBmb3Igc3VyZSBpZiB0aGVyZSBpcyBubyBwZW5kaW5nCisJICogZGF0YSBsZWZ0IHRvIGJlIHRyYW5zZmVycmVkLCBpcyBpZjoKKwkgKiAxKSBUcmFuc21pdCBoZWFkIGFuZCB0YWlsIGFyZSBlcXVhbCAoZW1wdHkpLgorCSAqIDIpIENvbW1hbmQgcXVldWUgaGVhZCBhbmQgdGFpbCBhcmUgZXF1YWwgKGVtcHR5KS4KKwkgKiAzKSBUaGUgIlRCVVNZIiBmbGFnIGlzIDAuIChUcmFuc21pdHRlciBub3QgYnVzeSkuCisJICovCisKKwlpZiAoKHR0YWlsID09IHRoZWFkKSAmJiAodGJ1c3kgPT0gMCkgJiYgKGNoZWFkID09IGN0YWlsKSkgeworCQljaGFycyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRoZWFkID49IHR0YWlsKQorCQkJY2hhcnMgPSB0aGVhZCAtIHR0YWlsOworCQllbHNlCisJCQljaGFycyA9IHRoZWFkIC0gdHRhaWwgKyBjaC0+Y2hfdHNpemU7CisJCS8qCisJCSAqIEZ1ZGdlIGZhY3RvciBoZXJlLgorCQkgKiBJZiBjaGFycyBpcyB6ZXJvLCB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgcXVldWUgaGFkCisJCSAqIHNvbWV0aGluZyBpbiBpdCBvciB0YnVzeSB3YXMgc2V0LiAgQmVjYXVzZSB3ZSBjYW5ub3QKKwkJICogYmUgc3VyZSBpZiB0aGVyZSBpcyBzdGlsbCBzb21lIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQsCisJCSAqIGxldHMgbGllLCBhbmQgdGVsbCBsZCB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LgorCQkgKi8KKwkJaWYgKGNoYXJzID09IDApIHsKKwkJCS8qCisJCQkgKiBJZiBUQlVTWSBpcyBzdGlsbCBzZXQsIGFuZCBvdXIgdHggYnVmZmVycyBhcmUgZW1wdHksCisJCQkgKiBmb3JjZSB0aGUgZmlybXdhcmUgdG8gc2VuZCBtZSBhbm90aGVyIHdha2V1cCBhZnRlcgorCQkJICogVEJVU1kgaGFzIGJlZW4gY2xlYXJlZC4KKwkJCSAqLworCQkJaWYgKHRidXN5ICE9IDApIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKKwkJCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssCisJCQkJCQkgICAgICAgbG9ja19mbGFncyk7CisJCQl9CisJCQljaGFycyA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gY2hhcnM7Cit9CisKK3N0YXRpYyBpbnQgZGdhcF93YWl0X2Zvcl9kcmFpbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlzdHJ1Y3QgYnNfdCAqYnM7CisJaW50IHJldCA9IC1FSU87CisJdWludCBjb3VudCA9IDE7CisJdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWJzID0gY2gtPmNoX2JzOworCWlmICghYnMpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSAwOworCisJLyogTG9vcCB1bnRpbCBkYXRhIGlzIGRyYWluZWQgKi8KKwl3aGlsZSAoY291bnQgIT0gMCkgeworCisJCWNvdW50ID0gZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSk7CisKKwkJaWYgKGNvdW50ID09IDApCisJCQlicmVhazsKKworCQkvKiBTZXQgZmxhZyB3YWl0aW5nIGZvciBkcmFpbiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQl1bi0+dW5fZmxhZ3MgfD0gVU5fRU1QVFk7CisJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCS8qIEdvIHRvIHNsZWVwIHRpbGwgd2UgZ2V0IHdva2VuIHVwICovCisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1bi0+dW5fZmxhZ3Nfd2FpdCwKKwkJCQkJKCh1bi0+dW5fZmxhZ3MgJiBVTl9FTVBUWSkgPT0gMCkpOworCQkvKiBJZiByZXQgaXMgbm9uLXplcm8sIHVzZXIgY3RybC1jJ2VkIHVzICovCisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCXVuLT51bl9mbGFncyAmPSB+KFVOX0VNUFRZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGdhcF9tYXhjcHNfcm9vbQorICoKKyAqIFJlZHVjZXMgYnl0ZXNfYXZhaWxhYmxlIHRvIHRoZSBtYXggbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAqIHRoYXQgY2FuIGJlIHNlbnQgY3VycmVudGx5IGdpdmVuIHRoZSBtYXhjcHMgdmFsdWUsIGFuZAorICogcmV0dXJucyB0aGUgbmV3IGJ5dGVzX2F2YWlsYWJsZS4gIFRoaXMgb25seSBhZmZlY3RzIHByaW50ZXIKKyAqIG91dHB1dC4KKyAqLworc3RhdGljIGludCBkZ2FwX21heGNwc19yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBieXRlc19hdmFpbGFibGUpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOworCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7CisKKwlpZiAodHR5ID09IE5VTEwpCisJCXJldHVybiBieXRlc19hdmFpbGFibGU7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOworCisJLyoKKwkgKiBJZiBpdHMgbm90IHRoZSBUcmFuc3BhcmVudCBwcmludCBkZXZpY2UsIHJldHVybgorCSAqIHRoZSBmdWxsIGRhdGEgYW1vdW50LgorCSAqLworCWlmICh1bi0+dW5fdHlwZSAhPSBER0FQX1BSSU5UKQorCQlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCAmJiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPiAwKSB7CisJCWludCBjcHNfbGltaXQgPSAwOworCQl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSA9IGppZmZpZXM7CisJCXVuc2lnbmVkIGxvbmcgYnVmZmVyX3RpbWUgPSBjdXJyZW50X3RpbWUgKworCQkJKEhaICogY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplKSAvCisJCQljaC0+Y2hfZGlnaS5kaWdpX21heGNwczsKKworCQlpZiAoY2gtPmNoX2Nwc3RpbWUgPCBjdXJyZW50X3RpbWUpIHsKKwkJCS8qIGJ1ZmZlciBpcyBlbXB0eSAqLworCQkJY2gtPmNoX2Nwc3RpbWUgPSBjdXJyZW50X3RpbWU7ICAgLyogcmVzZXQgY2hfY3BzdGltZSAqLworCQkJY3BzX2xpbWl0ID0gY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplOworCQl9IGVsc2UgaWYgKGNoLT5jaF9jcHN0aW1lIDwgYnVmZmVyX3RpbWUpIHsKKwkJCS8qIHN0aWxsIHJvb20gaW4gdGhlIGJ1ZmZlciAqLworCQkJY3BzX2xpbWl0ID0gKChidWZmZXJfdGltZSAtIGNoLT5jaF9jcHN0aW1lKSAqCisJCQkJICAgICBjaC0+Y2hfZGlnaS5kaWdpX21heGNwcykgLyBIWjsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vIHJvb20gaW4gdGhlIGJ1ZmZlciAqLworCQkJY3BzX2xpbWl0ID0gMDsKKwkJfQorCisJCWJ5dGVzX2F2YWlsYWJsZSA9IG1pbihjcHNfbGltaXQsIGJ5dGVzX2F2YWlsYWJsZSk7CisJfQorCisJcmV0dXJuIGJ5dGVzX2F2YWlsYWJsZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRnYXBfc2V0X2Zpcm13YXJlX2V2ZW50KHN0cnVjdCB1bl90ICp1biwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gTlVMTDsKKwlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOworCisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuOworCisJaWYgKChldmVudCAmIFVOX0xPVykgIT0gMCkgeworCQlpZiAoKHVuLT51bl9mbGFncyAmIFVOX0xPVykgPT0gMCkgeworCQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0xPVzsKKwkJCXdyaXRlYigxLCAmKGJzLT5pbG93KSk7CisJCX0KKwl9CisJaWYgKChldmVudCAmIFVOX0xPVykgIT0gMCkgeworCQlpZiAoKHVuLT51bl9mbGFncyAmIFVOX0VNUFRZKSA9PSAwKSB7CisJCQl1bi0+dW5fZmxhZ3MgfD0gVU5fRU1QVFk7CisJCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBkZ2FwX3R0eV93cml0ZV9yb29tKCkKKyAqCisgKiBSZXR1cm4gc3BhY2UgYXZhaWxhYmxlIGluIFR4IGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7CisJc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKKwlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOworCXUxNiBoZWFkLCB0YWlsLCB0bWFzazsKKwlpbnQgcmV0ID0gMDsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOworCisJaWYgKCF0dHkpCisJCXJldHVybiAwOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCisJYnMgPSBjaC0+Y2hfYnM7CisJaWYgKCFicykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJdG1hc2sgPSBjaC0+Y2hfdHNpemUgLSAxOworCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwl0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7CisKKwlyZXQgPSB0YWlsIC0gaGVhZCAtIDE7CisJaWYgKHJldCA8IDApCisJCXJldCArPSBjaC0+Y2hfdHNpemU7CisKKwkvKiBMaW1pdCBwcmludGVyIHRvIG1heGNwcyAqLworCXJldCA9IGRnYXBfbWF4Y3BzX3Jvb20odHR5LCByZXQpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgcHJpbnRlciBkZXZpY2UsIGxlYXZlIHNwYWNlIGZvcgorCSAqIHBvc3NpYmx5IGJvdGggdGhlIG9uIGFuZCBvZmYgc3RyaW5ncy4KKwkgKi8KKwlpZiAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgeworCQlpZiAoIShjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkKKwkJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29ubGVuOworCQlyZXQgLT0gY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW47CisJfSBlbHNlIHsKKwkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pCisJCQlyZXQgLT0gY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW47CisJfQorCisJaWYgKHJldCA8IDApCisJCXJldCA9IDA7CisKKwkvKgorCSAqIFNjaGVkdWxlIEZFUCB0byB3YWtlIHVzIHVwIGlmIG5lZWRlZC4KKwkgKgorCSAqIFRPRE86ICBUaGlzIG1pZ2h0IGJlIG92ZXJraWxsLi4uCisJICogRG8gd2UgcmVhbGx5IG5lZWQgdG8gc2NoZWR1bGUgY2FsbGJhY2tzIGZyb20gdGhlIEZFUAorCSAqIGluIGV2ZXJ5IGNhc2U/ICBDYW4gd2UgZ2V0IHNtYXJ0ZXIgYmFzZWQgb24gcmV0PworCSAqLworCWRnYXBfc2V0X2Zpcm13YXJlX2V2ZW50KHVuLCBVTl9MT1cgfCBVTl9FTVBUWSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGRnYXBfdHR5X3B1dF9jaGFyKCkKKyAqCisgKiBQdXQgYSBjaGFyYWN0ZXIgaW50byBjaC0+Y2hfYnVmCisgKgorICogICAgICAtIHVzZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgT1BPU1QgcHJvY2Vzc2luZworICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgYykKK3sKKwkvKgorCSAqIFNpbXBseSBjYWxsIHR0eV93cml0ZS4KKwkgKi8KKwlkZ2FwX3R0eV93cml0ZSh0dHksICZjLCAxKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGRnYXBfdHR5X3dyaXRlKCkKKyAqCisgKiBUYWtlIGRhdGEgZnJvbSB0aGUgdXNlciBvciBrZXJuZWwgYW5kIHNlbmQgaXQgb3V0IHRvIHRoZSBGRVAuCisgKiBJbiBoZXJlIGV4aXN0cyBhbGwgdGhlIFRyYW5zcGFyZW50IFByaW50IG1hZ2ljIGFzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCWludCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7CisJc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKKwlzdHJ1Y3QgYnNfdCAqYnMgPSBOVUxMOworCWNoYXIgKnZhZGRyID0gTlVMTDsKKwl1MTYgaGVhZCwgdGFpbCwgdG1hc2ssIHJlbWFpbjsKKwlpbnQgYnVmY291bnQgPSAwLCBuID0gMDsKKwlpbnQgb3JpZ19jb3VudCA9IDA7CisJdWxvbmcgbG9ja19mbGFnczsKKworCWlmICghdHR5KQorCQlyZXR1cm4gMDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWJzID0gY2gtPmNoX2JzOworCWlmICghYnMpCisJCXJldHVybiAwOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFN0b3JlIG9yaWdpbmFsIGFtb3VudCBvZiBjaGFyYWN0ZXJzIHBhc3NlZCBpbi4KKwkgKiBUaGlzIGhlbHBzIHRvIGZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGFzayB0aGUgRkVQCisJICogdG8gc2VuZCB1cyBhbiBldmVudCB3aGVuIGl0IGhhcyBtb3JlIHNwYWNlIGF2YWlsYWJsZS4KKwkgKi8KKwlvcmlnX2NvdW50ID0gY291bnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogR2V0IG91ciBzcGFjZSBhdmFpbGFibGUgZm9yIHRoZSBjaGFubmVsIGZyb20gdGhlIGJvYXJkICovCisJdG1hc2sgPSBjaC0+Y2hfdHNpemUgLSAxOworCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwl0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7CisKKwlidWZjb3VudCA9IHRhaWwgLSBoZWFkIC0gMTsKKwlpZiAoYnVmY291bnQgPCAwKQorCQlidWZjb3VudCArPSBjaC0+Y2hfdHNpemU7CisKKwkvKgorCSAqIExpbWl0IHByaW50ZXIgb3V0cHV0IHRvIG1heGNwcyBvdmVyYWxsLCB3aXRoIGJ1cnN0cyBhbGxvd2VkCisJICogdXAgdG8gYnVmc2l6ZSBjaGFyYWN0ZXJzLgorCSAqLworCWJ1ZmNvdW50ID0gZGdhcF9tYXhjcHNfcm9vbSh0dHksIGJ1ZmNvdW50KTsKKworCS8qCisJICogVGFrZSBtaW5pbXVtIG9mIHdoYXQgdGhlIHVzZXIgd2FudHMgdG8gc2VuZCwgYW5kIHRoZQorCSAqIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgRkVQIGJ1ZmZlci4KKwkgKi8KKwljb3VudCA9IG1pbihjb3VudCwgYnVmY291bnQpOworCisJLyoKKwkgKiBCYWlsIGlmIG5vIHNwYWNlIGxlZnQuCisJICovCisJaWYgKGNvdW50IDw9IDApIHsKKwkJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE91dHB1dCB0aGUgcHJpbnRlciBPTiBzdHJpbmcsIGlmIHdlIGFyZSBpbiB0ZXJtaW5hbCBtb2RlLCBidXQKKwkgKiBuZWVkIHRvIGJlIGluIHByaW50ZXIgbW9kZS4KKwkgKi8KKwlpZiAoKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpICYmICEoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKKwkJZGdhcF93bW92ZShjaCwgY2gtPmNoX2RpZ2kuZGlnaV9vbnN0ciwKKwkJICAgIChpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb25sZW4pOworCQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7CisJCWNoLT5jaF9mbGFncyB8PSBDSF9QUk9OOworCX0KKworCS8qCisJICogT24gdGhlIG90aGVyIGhhbmQsIG91dHB1dCB0aGUgcHJpbnRlciBPRkYgc3RyaW5nLCBpZiB3ZSBhcmUKKwkgKiBjdXJyZW50bHkgaW4gcHJpbnRlciBtb2RlLCBidXQgbmVlZCB0byBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsLgorCSAqLworCWlmICgodW4tPnVuX3R5cGUgIT0gREdBUF9QUklOVCkgJiYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pKSB7CisJCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAorCQkJKGludCkgY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4pOworCQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7CisJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUFJPTjsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBjb3B5LCBvcgorCSAqIEkgY2FuJ3QgaGFuZGxlIGFueSBtb3JlIGRhdGEsIGxlYXZlLgorCSAqLworCWlmIChjb3VudCA8PSAwKSB7CisJCWRnYXBfc2V0X2Zpcm13YXJlX2V2ZW50KHVuLCBVTl9MT1cgfCBVTl9FTVBUWSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbiA9IGNvdW50OworCisJLyoKKwkgKiBJZiB0aGUgd3JpdGUgd3JhcHMgb3ZlciB0aGUgdG9wIG9mIHRoZSBjaXJjdWxhciBidWZmZXIsCisJICogbW92ZSB0aGUgcG9ydGlvbiB1cCB0byB0aGUgd3JhcCBwb2ludCwgYW5kIHJlc2V0IHRoZQorCSAqIHBvaW50ZXJzIHRvIHRoZSBib3R0b20uCisJICovCisJcmVtYWluID0gY2gtPmNoX3RzdGFydCArIGNoLT5jaF90c2l6ZSAtIGhlYWQ7CisKKwlpZiAobiA+PSByZW1haW4pIHsKKwkJbiAtPSByZW1haW47CisJCXZhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKKworCQltZW1jcHlfdG9pbyh2YWRkciwgKHVjaGFyICopIGJ1ZiwgcmVtYWluKTsKKwkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBXUklURSIsICh1Y2hhciAqKSBidWYsCisJCQkJCXJlbWFpbik7CisKKwkJaGVhZCA9IGNoLT5jaF90c3RhcnQ7CisJCWJ1ZiArPSByZW1haW47CisJfQorCisJaWYgKG4gPiAwKSB7CisKKwkJLyoKKwkJICogTW92ZSByZXN0IG9mIGRhdGEuCisJCSAqLworCQl2YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7CisJCXJlbWFpbiA9IG47CisKKwkJbWVtY3B5X3RvaW8odmFkZHIsICh1Y2hhciAqKSBidWYsIHJlbWFpbik7CisJCWRnYXBfc25pZmZfbm93YWl0X25vbG9jayhjaCwgIlVTRVIgV1JJVEUiLCAodWNoYXIgKilidWYsCisJCQkJCXJlbWFpbik7CisKKwkJaGVhZCArPSByZW1haW47CisKKwl9CisKKwlpZiAoY291bnQpIHsKKwkJY2gtPmNoX3R4Y291bnQgKz0gY291bnQ7CisJCWhlYWQgJj0gdG1hc2s7CisJCXdyaXRldyhoZWFkLCAmKGJzLT50eF9oZWFkKSk7CisJfQorCisJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgcHJpbnQgZGV2aWNlLCBhbmQgdGhlCisJICogcHJpbnRlciBpcyBzdGlsbCBvbiwgd2UgbmVlZCB0byB0dXJuIGl0CisJICogb2ZmIGJlZm9yZSBnb2luZyBpZGxlLiAgSWYgdGhlIGJ1ZmZlciBpcworCSAqIG5vbi1lbXB0eSwgd2FpdCB1bnRpbCBpdCBnb2VzIGVtcHR5LgorCSAqIE90aGVyd2lzZSB0dXJuIGl0IG9mZiByaWdodCBub3cuCisJICovCisJaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKKwkJdGFpbCA9IHJlYWR3KCYoYnMtPnR4X3RhaWwpKSAmIHRtYXNrOworCisJCWlmICh0YWlsICE9IGhlYWQpIHsKKwkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKKwkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKKwkJfSBlbHNlIHsKKwkJCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAorCQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKKwkJCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKKwkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUFJPTjsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSBwcmludGVyIGJ1ZmZlciBlbXB0eSB0aW1lLiAqLworCWlmICgodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCkKKwkgICAgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA+IDApKSB7CisJCWNoLT5jaF9jcHN0aW1lICs9IChIWiAqIGNvdW50KSAvIGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFJldHVybiBtb2RlbSBzaWduYWxzIHRvIGxkLgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCByZXN1bHQgPSAtRUlPOworCXVjaGFyIG1zdGF0ID0gMDsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiByZXN1bHQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gcmVzdWx0OworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gcmVzdWx0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCW1zdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOworCS8qIEFwcGVuZCBhbnkgb3V0Ym91bmQgc2lnbmFscyB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuLi4gKi8KKwltc3RhdCB8PSBjaC0+Y2hfbW9zdGF0OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmVzdWx0ID0gMDsKKworCWlmIChtc3RhdCAmIERfRFRSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKKwlpZiAobXN0YXQgJiBEX1JUUyhjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9SVFM7CisJaWYgKG1zdGF0ICYgRF9DVFMoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ1RTOworCWlmIChtc3RhdCAmIERfRFNSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKKwlpZiAobXN0YXQgJiBEX1JJKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX1JJOworCWlmIChtc3RhdCAmIERfQ0QoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogZGdhcF90dHlfdGlvY21zZXQoKQorICoKKyAqIFNldCBtb2RlbSBzaWduYWxzLCBjYWxsZWQgYnkgbGQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHJldCA9IC1FSU87CisJdWxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykgeworCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKKwkJY2gtPmNoX212YWwgICB8PSBEX1JUUyhjaCk7CisJfQorCisJaWYgKHNldCAmIFRJT0NNX0RUUikgeworCQljaC0+Y2hfbWZvcmNlIHw9IERfRFRSKGNoKTsKKwkJY2gtPmNoX212YWwgICB8PSBEX0RUUihjaCk7CisJfQorCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7CisJCWNoLT5jaF9tZm9yY2UgfD0gRF9SVFMoY2gpOworCQljaC0+Y2hfbXZhbCAgICY9IH4oRF9SVFMoY2gpKTsKKwl9CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpIHsKKwkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7CisJCWNoLT5jaF9tdmFsICAgJj0gfihEX0RUUihjaCkpOworCX0KKworCWRnYXBfcGFyYW0odHR5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9zZW5kX2JyZWFrKCkKKyAqCisgKiBTZW5kIGEgQnJlYWssIGNhbGxlZCBieSBsZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9zZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBtc2VjKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHJldCA9IC1FSU87CisJdWxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKG1zZWMpIHsKKwljYXNlIC0xOgorCQltc2VjID0gMHhGRkZGOworCQlicmVhazsKKwljYXNlIDA6CisJCW1zZWMgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc2VjIC89IDEwOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworI2lmIDAKKwlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOworI2VuZGlmCisJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIG1zZWMsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudCgpCisgKgorICogd2FpdCB1bnRpbCBkYXRhIGhhcyBiZWVuIHRyYW5zbWl0dGVkLCBjYWxsZWQgYnkgbGQuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Cit9CisKKy8qCisgKiBkZ2FwX3NlbmRfeGNoYXIoKQorICoKKyAqIHNlbmQgYSBoaWdoIHByaW9yaXR5IGNoYXJhY3RlciwgY2FsbGVkIGJ5IGxkLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgYykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nIGxvY2tfZmxhZ3M7CisJdWxvbmcgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJLyoKKwkgKiBUaGlzIGlzIHRlY2huaWNhbGx5IHdoYXQgd2Ugc2hvdWxkIGRvLgorCSAqIEhvd2V2ZXIsIHRoZSBOSVNUIHRlc3RzIHNwZWNpZmljYWxseSB3YW50CisJICogdG8gc2VlIGVhY2ggWE9OIG9yIFhPRkYgY2hhcmFjdGVyIHRoYXQgaXQKKwkgKiBzZW5kcywgc28gbGV0cyBqdXN0IHNlbmQgZWFjaCBjaGFyYWN0ZXIKKwkgKiBieSBoYW5kLi4uCisJICovCisjaWYgMAorCWlmIChjID09IFNUT1BfQ0hBUih0dHkpKQorCQlkZ2FwX2NtZHcoY2gsIFJQQVVTRSwgMCwgMCk7CisJZWxzZSBpZiAoYyA9PSBTVEFSVF9DSEFSKHR0eSkpCisJCWRnYXBfY21kdyhjaCwgUlJFU1VNRSwgMCwgMCk7CisJZWxzZQorCQlkZ2FwX3dtb3ZlKGNoLCAmYywgMSk7CisjZWxzZQorCWRnYXBfd21vdmUoY2gsICZjLCAxKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBSZXR1cm4gbW9kZW0gc2lnbmFscyB0byBsZC4KKyAqLworc3RhdGljIGludCBkZ2FwX2dldF9tb2RlbV9pbmZvKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1Y2hhciBtc3RhdCA9IDA7CisJdWxvbmcgbG9ja19mbGFnczsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVOWElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCW1zdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOworCS8qIEFwcGVuZCBhbnkgb3V0Ym91bmQgc2lnbmFscyB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuLi4gKi8KKwltc3RhdCB8PSBjaC0+Y2hfbW9zdGF0OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmVzdWx0ID0gMDsKKworCWlmIChtc3RhdCAmIERfRFRSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKKwlpZiAobXN0YXQgJiBEX1JUUyhjaCkpCisJCXJlc3VsdCB8PSBUSU9DTV9SVFM7CisJaWYgKG1zdGF0ICYgRF9DVFMoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ1RTOworCWlmIChtc3RhdCAmIERfRFNSKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKKwlpZiAobXN0YXQgJiBEX1JJKGNoKSkKKwkJcmVzdWx0IHw9IFRJT0NNX1JJOworCWlmIChtc3RhdCAmIERfQ0QoY2gpKQorCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CisKKwlyYyA9IHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogZGdhcF9zZXRfbW9kZW1faW5mbygpCisgKgorICogU2V0IG1vZGVtIHNpZ25hbHMsIGNhbGxlZCBieSBsZC4KKyAqLworc3RhdGljIGludCBkZ2FwX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjb21tYW5kLAorCQkJCXVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50IHJldCA9IC1FTlhJTzsKKwl1bnNpZ25lZCBpbnQgYXJnID0gMDsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCXVsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiByZXQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gcmV0OworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdldF91c2VyKGFyZywgdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFRJT0NNQklTOgorCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7CisJCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKKwkJCWNoLT5jaF9tdmFsICAgfD0gRF9SVFMoY2gpOworCQl9CisKKwkJaWYgKGFyZyAmIFRJT0NNX0RUUikgeworCQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7CisJCQljaC0+Y2hfbXZhbCAgIHw9IERfRFRSKGNoKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBUSU9DTUJJQzoKKwkJaWYgKGFyZyAmIFRJT0NNX1JUUykgeworCQkJY2gtPmNoX21mb3JjZSB8PSBEX1JUUyhjaCk7CisJCQljaC0+Y2hfbXZhbCAgICY9IH4oRF9SVFMoY2gpKTsKKwkJfQorCisJCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKKwkJCWNoLT5jaF9tZm9yY2UgfD0gRF9EVFIoY2gpOworCQkJY2gtPmNoX212YWwgICAmPSB+KERfRFRSKGNoKSk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgVElPQ01TRVQ6CisJCWNoLT5jaF9tZm9yY2UgPSBEX0RUUihjaCl8RF9SVFMoY2gpOworCisJCWlmIChhcmcgJiBUSU9DTV9SVFMpCisJCQljaC0+Y2hfbXZhbCB8PSBEX1JUUyhjaCk7CisJCWVsc2UKKwkJCWNoLT5jaF9tdmFsICY9IH4oRF9SVFMoY2gpKTsKKworCQlpZiAoYXJnICYgVElPQ01fRFRSKQorCQkJY2gtPmNoX212YWwgfD0gKERfRFRSKGNoKSk7CisJCWVsc2UKKwkJCWNoLT5jaF9tdmFsICY9IH4oRF9EVFIoY2gpKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwlkZ2FwX3BhcmFtKHR0eSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF90dHlfZGlnaWdldGEoKQorICoKKyAqIElvY3RsIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZm9yIGRpdHR5LgorICoKKyAqCisgKgorICovCitzdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGRpZ2lfdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXN0cnVjdCBkaWdpX3QgdG1wOworCXVsb25nIGxvY2tfZmxhZ3M7CisKKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJbWVtY3B5KCZ0bXAsICZjaC0+Y2hfZGlnaSwgc2l6ZW9mKHRtcCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9kaWdpc2V0YSgpCisgKgorICogSW9jdGwgdG8gc2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgZGl0dHkuCisgKgorICoKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlzdHJ1Y3QgZGlnaV90IF9fdXNlciAqbmV3X2luZm8pCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlzdHJ1Y3QgZGlnaV90IG5ld19kaWdpOworCXVsb25nICAgbG9ja19mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfZGlnaSwgbmV3X2luZm8sIHNpemVvZihzdHJ1Y3QgZGlnaV90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCW1lbWNweSgmY2gtPmNoX2RpZ2ksICZuZXdfZGlnaSwgc2l6ZW9mKHN0cnVjdCBkaWdpX3QpKTsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA8IDEpCisJCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID0gMTsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA+IDEwMDAwKQorCQljaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA9IDEwMDAwOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA8IDEwKQorCQljaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPSAxMDsKKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPCAxKQorCQljaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPSAxOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y2hhciA+IGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSkKKwkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyID0gY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplOworCisJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfb25sZW4gPiBESUdJX1BMRU4pCisJCWNoLT5jaF9kaWdpLmRpZ2lfb25sZW4gPSBESUdJX1BMRU47CisKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW4gPiBESUdJX1BMRU4pCisJCWNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuID0gRElHSV9QTEVOOworCisJZGdhcF9wYXJhbSh0dHkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X2RpZ2lnZXRlZGVsYXkoKQorICoKKyAqIElvY3RsIHRvIGdldCB0aGUgY3VycmVudCBlZGVsYXkgc2V0dGluZy4KKyAqCisgKgorICoKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCB0bXA7CisJdWxvbmcgbG9ja19mbGFnczsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwl0bXAgPSByZWFkdygmKGNoLT5jaF9icy0+ZWRlbGF5KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfdHR5X2RpZ2lzZXRlZGVsYXkoKQorICoKKyAqIElvY3RsIHRvIHNldCB0aGUgRURFTEFZIHNldHRpbmcKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCWludCBuZXdfZGlnaTsKKwl1bG9uZyBsb2NrX2ZsYWdzOworCXVsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19kaWdpLCBuZXdfaW5mbywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwl3cml0ZXcoKHUxNikgbmV3X2RpZ2ksICYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKKworCWRnYXBfcGFyYW0odHR5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZCgpCisgKgorICogSW9jdGwgdG8gZ2V0IHRoZSBjdXJyZW50IGN1c3RvbSBiYXVkIHJhdGUgc2V0dGluZy4KKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCQlpbnQgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQgdG1wOworCXVsb25nIGxvY2tfZmxhZ3M7CisKKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7CisJdG1wID0gZGdhcF9nZXRfY3VzdG9tX2JhdWQoY2gpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZCgpCisgKgorICogSW9jdGwgdG8gc2V0IHRoZSBjdXN0b20gYmF1ZCByYXRlIHNldHRpbmcKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCQlpbnQgX191c2VyICpuZXdfaW5mbykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVpbnQgbmV3X3JhdGU7CisJdWxvbmcgbG9ja19mbGFnczsKKwl1bG9uZyBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAtRUZBVUxUOworCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19yYXRlLCBuZXdfaW5mbywgc2l6ZW9mKHVuc2lnbmVkIGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChiZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykgeworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJCWNoLT5jaF9jdXN0b21fc3BlZWQgPSBuZXdfcmF0ZTsKKworCQlkZ2FwX3BhcmFtKHR0eSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZGdhcF9zZXRfdGVybWlvcygpCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWNoLT5jaF9jX2NmbGFnICAgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKKwljaC0+Y2hfY19pZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfaWZsYWc7CisJY2gtPmNoX2Nfb2ZsYWcgICA9IHR0eS0+dGVybWlvcy5jX29mbGFnOworCWNoLT5jaF9jX2xmbGFnICAgPSB0dHktPnRlcm1pb3MuY19sZmxhZzsKKwljaC0+Y2hfc3RhcnRjICAgID0gdHR5LT50ZXJtaW9zLmNfY2NbVlNUQVJUXTsKKwljaC0+Y2hfc3RvcGMgICAgID0gdHR5LT50ZXJtaW9zLmNfY2NbVlNUT1BdOworCisJZGdhcF9jYXJyaWVyKGNoKTsKKwlkZ2FwX3BhcmFtKHR0eSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZGdhcF90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nICAgbG9ja19mbGFnczsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWNoLT5jaF9mbGFncyB8PSAoQ0hfUlhCTE9DSyk7CisjaWYgMQorCWRnYXBfY21kdyhjaCwgUlBBVVNFLCAwLCAwKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKK30KKworc3RhdGljIHZvaWQgZGdhcF90dHlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWxvbmcgICBsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisKKwlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKKwkJcmV0dXJuOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuOworCisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfUlhCTE9DSyk7CisKKyNpZiAxCisJZGdhcF9jbWR3KGNoLCBSUkVTVU1FLCAwLCAwKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWxvbmcgICBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwlkZ2FwX2NtZHcoY2gsIFJFU1VNRVRYLCAwLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGRnYXBfdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCXVsb25nICAgbG9ja19mbGFnczsKKwl1bG9uZyAgIGxvY2tfZmxhZ3MyOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWRnYXBfY21kdyhjaCwgUEFVU0VUWCwgMCwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworfQorCisvKgorICogZGdhcF90dHlfZmx1c2hfY2hhcnMoKQorICoKKyAqIEZsdXNoIHRoZSBjb29rIGJ1ZmZlcgorICoKKyAqIE5vdGUgdG8gc2VsZiwgYW5kIGFueSBvdGhlciBwb29yIHNvdWxzIHdobyB2ZW50dXJlIGhlcmU6CisgKgorICogZmx1c2ggaW4gdGhpcyBjYXNlIERPRVMgTk9UIG1lYW4gZGlzcG9zZSBvZiB0aGUgZGF0YS4KKyAqIGluc3RlYWQsIGl0IG1lYW5zICJzdG9wIGJ1ZmZlcmluZyBhbmQgc2VuZCBpdCBpZiB5b3UKKyAqIGhhdmVuJ3QgYWxyZWFkeS4iICBKdXN0IGd1ZXNzIGhvdyBJIGZpZ3VyZWQgdGhhdCBvdXQuLi4gICBTUlcgMi1KdW4tOTgKKyAqCisgKiBJdCBpcyBhbHNvIGFsd2F5cyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQgLSBKQVIgOC1TZXB0LTk5CisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwl1bG9uZyAgIGxvY2tfZmxhZ3M7CisJdWxvbmcgICBsb2NrX2ZsYWdzMjsKKworCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm47CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkvKiBUT0RPOiBEbyBzb21ldGhpbmcgaGVyZSAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Cit9CisKKy8qCisgKiBkZ2FwX3R0eV9mbHVzaF9idWZmZXIoKQorICoKKyAqIEZsdXNoIFR4IGJ1ZmZlciAobWFrZSBpbiA9PSBvdXQpCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJdWxvbmcgICBsb2NrX2ZsYWdzOworCXVsb25nICAgbG9ja19mbGFnczI7CisJdTE2CWhlYWQgPSAwOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybjsKKworCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybjsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKKwloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKKwlkZ2FwX2NtZHcoY2gsIEZMVVNIVFgsICh1MTYpIGhlYWQsIDApOworCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOworCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKKwkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+KFVOX0xPV3xVTl9FTVBUWSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKKwl9CisJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgeworCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPndyaXRlX3dhaXQpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgSU9DVEwgZnVuY3Rpb24gYW5kIGFsbCBvZiBpdHMgaGVscGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGRnYXBfdHR5X2lvY3RsKCkKKyAqCisgKiBUaGUgdXN1YWwgYXNzb3J0bWVudCBvZiBpb2N0bCdzCisgKi8KK3N0YXRpYyBpbnQgZGdhcF90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKwlpbnQgcmM7CisJdTE2CWhlYWQgPSAwOworCXVsb25nICAgbG9ja19mbGFncyA9IDA7CisJdWxvbmcgICBsb2NrX2ZsYWdzMiA9IDA7CisJdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRU5PREVWOworCisJdW4gPSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAtRU5PREVWOworCisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJaWYgKHVuLT51bl9vcGVuX2NvdW50IDw9IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCisJLyogSGVyZSBhcmUgYWxsIHRoZSBzdGFuZGFyZCBpb2N0bCdzIHRoYXQgd2UgTVVTVCBpbXBsZW1lbnQgKi8KKworCWNhc2UgVENTQlJLOgorCQkvKgorCQkgKiBUQ1NCUksgaXMgU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrCisJCSAqIHRoaXMgYmVoYXZpb3VyIGlzIGV4cGxvaXRlZCBieSB0Y2RyYWluKCkuCisJCSAqCisJCSAqIEFjY29yZGluZyB0byBQT1NJWC4xIHNwZWMgKDcuMi4yLjEuMikgYnJlYWtzIHNob3VsZCBiZQorCQkgKiBiZXR3ZWVuIDAuMjUgYW5kIDAuNSBzZWNvbmRzIHNvIHdlJ2xsIGFzayBmb3Igc29tZXRoaW5nCisJCSAqIGluIHRoZSBtaWRkbGU6IDAuMzc1IHNlY29uZHMuCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisKKwkJaWYgKHJjKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCQlpZiAoKChjbWQgPT0gVENTQlJLKSAmJiAoIWFyZykpIHx8IChjbWQgPT0gVENTQlJLUCkpCisJCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyZXR1cm4gMDsKKworCWNhc2UgVENTQlJLUDoKKwkJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKQorCisJCSAqIEFjY29yZGluZyB0byBQT1NJWC4xIHNwZWMgKDcuMi4yLjEuMikgYnJlYWtzIHNob3VsZCBiZQorCQkgKiBiZXR3ZWVuIDAuMjUgYW5kIDAuNSBzZWNvbmRzIHNvIHdlJ2xsIGFzayBmb3Igc29tZXRoaW5nCisJCSAqIGluIHRoZSBtaWRkbGU6IDAuMzc1IHNlY29uZHMuCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCWlmIChyYykKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NTQlJLOgorCQkvKgorCQkgKiBGRVA1IGRvZXNuJ3Qgc3VwcG9ydCB0dXJuaW5nIG9uIGEgYnJlYWsgdW5jb25kaXRpb25hbGx5LgorCQkgKiBUaGUgRkVQNSBkZXZpY2Ugd2lsbCBzdG9wIHNlbmRpbmcgYSBicmVhayBhdXRvbWF0aWNhbGx5CisJCSAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZSB2YWx1ZSB0aGF0IHdhcyBzZW50IHdoZW4gdHVybmluZyBvbgorCQkgKiB0aGUgYnJlYWsuCisJCSAqLworCQlyYyA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCWlmIChyYykKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKKwkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NDQlJLOgorCQkvKgorCQkgKiBGRVA1IGRvZXNuJ3Qgc3VwcG9ydCB0dXJuaW5nIG9mZiBhIGJyZWFrIHVuY29uZGl0aW9uYWxseS4KKwkJICogVGhlIEZFUDUgZGV2aWNlIHdpbGwgc3RvcCBzZW5kaW5nIGEgYnJlYWsgYXV0b21hdGljYWxseQorCQkgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUgdmFsdWUgdGhhdCB3YXMgc2VudCB3aGVuIHR1cm5pbmcgb24KKwkJICogdGhlIGJyZWFrLgorCQkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWNhc2UgVElPQ0dTT0ZUQ0FSOgorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyYyA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwKKwkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKTsKKwkJcmV0dXJuIHJjOworCisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlyYyA9IGdldF91c2VyKGFyZywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJdHR5LT50ZXJtaW9zLmNfY2ZsYWcgPSAoKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJCQkJKGFyZyA/IENMT0NBTCA6IDApKTsKKwkJZGdhcF9wYXJhbSh0dHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NNR0VUOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX2dldF9tb2RlbV9pbmZvKGNoLCB1YXJnKTsKKworCWNhc2UgVElPQ01CSVM6CisJY2FzZSBUSU9DTUJJQzoKKwljYXNlIFRJT0NNU0VUOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3NldF9tb2RlbV9pbmZvKHR0eSwgY21kLCB1YXJnKTsKKworCQkvKgorCQkgKiBIZXJlIGFyZSBhbnkgYWRkaXRpb25hbCBpb2N0bCdzIHRoYXQgd2Ugd2FudCB0byBpbXBsZW1lbnQKKwkJICovCisKKwljYXNlIFRDRkxTSDoKKwkJLyoKKwkJICogVGhlIGxpbnV4IHR0eSBkcml2ZXIgZG9lc24ndCBoYXZlIGEgZmx1c2gKKwkJICogaW5wdXQgcm91dGluZSBmb3IgdGhlIGRyaXZlciwgYXNzdW1pbmcgYWxsIGJhY2tlZAorCQkgKiB1cCBkYXRhIGlzIGluIHRoZSBsaW5lIGRpc2MuIGJ1ZmZlcnMuICBIb3dldmVyLAorCQkgKiB3ZSBhbGwga25vdyB0aGF0J3Mgbm90IHRoZSBjYXNlLiAgSGVyZSwgd2UKKwkJICogYWN0IG9uIHRoZSBpb2N0bCwgYnV0IHRoZW4gbGllIGFuZCBzYXkgd2UgZGlkbid0CisJCSAqIHNvIHRoZSBsaW5lIGRpc2NpcGxpbmUgd2lsbCBwcm9jZXNzIHRoZSBmbHVzaAorCQkgKiBhbHNvLgorCQkgKi8KKwkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyYykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWlmICgoYXJnID09IFRDSUZMVVNIKSB8fCAoYXJnID09IFRDSU9GTFVTSCkpIHsKKwkJCWlmICghKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpKSB7CisJCQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT5yeF9oZWFkKSk7CisJCQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7CisJCQkJd3JpdGViKDAsICYoY2gtPmNoX2JzLT5vcnVuKSk7CisJCQl9CisJCX0KKworCQlpZiAoKGFyZyAhPSBUQ09GTFVTSCkgJiYgKGFyZyAhPSBUQ0lPRkxVU0gpKSB7CisJCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyBJT0NUTCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJfQorCisJCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKKwkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7CisJCWRnYXBfY21kdyhjaCwgRkxVU0hUWCwgKHUxNikgaGVhZCwgMCk7CisJCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOworCQlpZiAoY2gtPmNoX3R1bi51bl9mbGFncyAmIChVTl9MT1d8VU5fRU1QVFkpKSB7CisJCQljaC0+Y2hfdHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKKwkJfQorCQlpZiAoY2gtPmNoX3B1bi51bl9mbGFncyAmIChVTl9MT1d8VU5fRU1QVFkpKSB7CisJCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKKwkJfQorCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT53cml0ZV93YWl0KSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKworCQkvKiBDYW4ndCBob2xkIGFueSBsb2NrcyB3aGVuIGNhbGxpbmcgdHR5X3dha2V1cCEgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQl0dHlfd2FrZXVwKHR0eSk7CisKKwkJLyogcHJldGVuZCB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoaXMgSU9DVEwgKi8KKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgVENTRVRTRjoKKwljYXNlIFRDU0VUU1c6CisJCS8qCisJCSAqIFRoZSBsaW51eCB0dHkgZHJpdmVyIGRvZXNuJ3QgaGF2ZSBhIGZsdXNoCisJCSAqIGlucHV0IHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIsIGFzc3VtaW5nIGFsbCBiYWNrZWQKKwkJICogdXAgZGF0YSBpcyBpbiB0aGUgbGluZSBkaXNjLiBidWZmZXJzLiAgSG93ZXZlciwKKwkJICogd2UgYWxsIGtub3cgdGhhdCdzIG5vdCB0aGUgY2FzZS4gIEhlcmUsIHdlCisJCSAqIGFjdCBvbiB0aGUgaW9jdGwsIGJ1dCB0aGVuIGxpZSBhbmQgc2F5IHdlIGRpZG4ndAorCQkgKiBzbyB0aGUgbGluZSBkaXNjaXBsaW5lIHdpbGwgcHJvY2VzcyB0aGUgZmx1c2gKKwkJICogYWxzby4KKwkJICovCisJCWlmIChjbWQgPT0gVENTRVRTRikgeworCQkJLyogZmx1c2ggcnggKi8KKwkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKKwkJCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfaGVhZCkpOworCQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7CisJCX0KKworCQkvKiBub3cgd2FpdCBmb3IgYWxsIHRoZSBvdXRwdXQgdG8gZHJhaW4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyAqLworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUQ1NFVEFXOgorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCWlmIChyYykKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJLyogcHJldGVuZCB3ZSBkaWRuJ3QgcmVjb2duaXplIHRoaXMgKi8KKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgVENYT05DOgorCQkvKgorCQkgKiBUaGUgTGludXggTGluZSBEaXNjaXBsaW5lIChMRCkgd291bGQgZG8gdGhpcyBmb3IgdXMgaWYgd2UKKwkJICogbGV0IGl0LCBidXQgd2UgaGF2ZSB0aGUgc3BlY2lhbCBmaXJtd2FyZSBvcHRpb25zIHRvIGRvIHRoaXMKKwkJICogdGhlICJyaWdodCB3YXkiIHJlZ2FyZGxlc3Mgb2YgaGFyZHdhcmUgb3Igc29mdHdhcmUgZmxvdworCQkgKiBjb250cm9sIHNvIHdlJ2xsIGRvIGl0IG91dHNlbHZlcyBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIExECisJCSAqIGRvIGl0LgorCQkgKi8KKwkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyYykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXN3aXRjaCAoYXJnKSB7CisKKwkJY2FzZSBUQ09PTjoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlkZ2FwX3R0eV9zdGFydCh0dHkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVENPT0ZGOgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWRnYXBfdHR5X3N0b3AodHR5KTsKKwkJCXJldHVybiAwOworCQljYXNlIFRDSU9OOgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCS8qIE1ha2UgdGhlIGxkIGRvIGl0ICovCisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQljYXNlIFRDSU9GRjoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQkvKiBNYWtlIHRoZSBsZCBkbyBpdCAqLworCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJZGVmYXVsdDoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJY2FzZSBESUdJX0dFVEE6CisJCS8qIGdldCBpbmZvcm1hdGlvbiBmb3IgZGl0dHkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaWdldGEodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9TRVRBVzoKKwljYXNlIERJR0lfU0VUQUY6CisKKwkJLyogc2V0IGluZm9ybWF0aW9uIGZvciBkaXR0eSAqLworCQlpZiAoY21kID09IChESUdJX1NFVEFXKSkgeworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJfSBlbHNlCisJCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwkJLyogZmFsbCB0aHJ1ICovCisKKwljYXNlIERJR0lfU0VUQToKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaXNldGEodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9HRURFTEFZOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KHR0eSwgdWFyZyk7CisKKwljYXNlIERJR0lfU0VERUxBWToKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaXNldGVkZWxheSh0dHksIHVhcmcpOworCisJY2FzZSBESUdJX0dFVENVU1RPTUJBVUQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKHR0eSwgdWFyZyk7CisKKwljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gZGdhcF90dHlfZGlnaXNldGN1c3RvbWJhdWQodHR5LCB1YXJnKTsKKworCWNhc2UgRElHSV9SRVNFVF9QT1JUOgorCQlkZ2FwX2Zpcm13YXJlX3Jlc2V0X3BvcnQoY2gpOworCQlkZ2FwX3BhcmFtKHR0eSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGdhcF9hZnRlcl9jb25maWdfbG9hZGVkKGludCBib2FyZCkKK3sKKwkvKgorCSAqIEluaXRpYWxpemUgS01FIHdhaXRxdWV1ZXMuLi4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCYoZGdhcF9Cb2FyZFtib2FyZF0tPmttZV93YWl0KSk7CisKKwkvKgorCSAqIGFsbG9jYXRlIGZsaXAgYnVmZmVyIGZvciBib2FyZC4KKwkgKi8KKwlkZ2FwX0JvYXJkW2JvYXJkXS0+ZmxpcGJ1ZiA9IGttYWxsb2MoTVlGTElQTEVOLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwZmxhZ2J1ZiA9IGttYWxsb2MoTVlGTElQTEVOLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRnYXBfQm9hcmRbYm9hcmRdLT5mbGlwZmxhZ2J1ZikgeworCQlrZnJlZShkZ2FwX0JvYXJkW2JvYXJkXS0+ZmxpcGJ1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIHByIGFuZCB0dHkgZGV2aWNlIGVudHJpZXMKKyAqLworc3RhdGljIGludCBkZ2FwX3R0eV9yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCWludCBpOworCisJYnJkLT5TZXJpYWxQb3J0cyA9IGtjYWxsb2MoYnJkLT5uYXN5bmMsIHNpemVvZigqYnJkLT5TZXJpYWxQb3J0cyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChicmQtPlNlcmlhbFBvcnRzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKQorCQl0dHlfcG9ydF9pbml0KCZicmQtPlNlcmlhbFBvcnRzW2ldKTsKKworCWJyZC0+UHJpbnRlclBvcnRzID0ga2NhbGxvYyhicmQtPm5hc3luYywgc2l6ZW9mKCpicmQtPlByaW50ZXJQb3J0cyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChicmQtPlByaW50ZXJQb3J0cyA9PSBOVUxMKSB7CisJCWtmcmVlKGJyZC0+U2VyaWFsUG9ydHMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspCisJCXR0eV9wb3J0X2luaXQoJmJyZC0+UHJpbnRlclBvcnRzW2ldKTsKKworCWNoID0gYnJkLT5jaGFubmVsc1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5uYXN5bmM7IGkrKywgY2ggPSBicmQtPmNoYW5uZWxzW2ldKSB7CisKKwkJc3RydWN0IGRldmljZSAqY2xhc3NwOworCisJCWNsYXNzcCA9IHR0eV9wb3J0X3JlZ2lzdGVyX2RldmljZSgmYnJkLT5TZXJpYWxQb3J0c1tpXSwKKwkJCQkJYnJkLT5TZXJpYWxEcml2ZXIsCisJCQkJCWJyZC0+Zmlyc3RtaW5vciArIGksIE5VTEwpOworCisJCWRnYXBfY3JlYXRlX3R0eV9zeXNmcygmY2gtPmNoX3R1biwgY2xhc3NwKTsKKwkJY2gtPmNoX3R1bi51bl9zeXNmcyA9IGNsYXNzcDsKKworCQljbGFzc3AgPSB0dHlfcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJmJyZC0+UHJpbnRlclBvcnRzW2ldLAorCQkJCQlicmQtPlByaW50RHJpdmVyLAorCQkJCQlicmQtPmZpcnN0bWlub3IgKyBpLCBOVUxMKTsKKworCQlkZ2FwX2NyZWF0ZV90dHlfc3lzZnMoJmNoLT5jaF9wdW4sIGNsYXNzcCk7CisJCWNoLT5jaF9wdW4udW5fc3lzZnMgPSBjbGFzc3A7CisJfQorCWRnYXBfY3JlYXRlX3BvcnRzX3N5c2ZpbGVzKGJyZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcGllcyB0aGUgQklPUyBjb2RlIGZyb20gdGhlIHVzZXIgdG8gdGhlIGJvYXJkLAorICogYW5kIHN0YXJ0cyB0aGUgQklPUyBydW5uaW5nLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2RvX2Jpb3NfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCB1Y2hhciAqdWJpb3MsIGludCBsZW4pCit7CisJdWNoYXIgKmFkZHI7CisJdWludCBvZmZzZXQ7CisJaW50IGk7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuOworCisJYWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKgorCSAqIGNsZWFyIFBPU1QgYXJlYQorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl3cml0ZWIoMCwgYWRkciArIFBPU1RBUkVBICsgaSk7CisKKwkvKgorCSAqIERvd25sb2FkIGJpb3MKKwkgKi8KKwlvZmZzZXQgPSAweDEwMDA7CisJbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgdWJpb3MsIGxlbik7CisKKwl3cml0ZWwoMHgwYmYwMDQwMSwgYWRkcik7CisJd3JpdGVsKDAsIChhZGRyICsgNCkpOworCisJLyogQ2xlYXIgdGhlIHJlc2V0LCBhbmQgY2hhbmdlIHN0YXRlcy4gKi8KKwl3cml0ZWIoRkVQQ0xSLCBicmQtPnJlX21hcF9wb3J0KTsKK30KKworLyoKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIEJJT1MgY29tcGxldGVkIHJ1bm5pbmcgb24gdGhlIGNhcmQuCisgKi8KK3N0YXRpYyBpbnQgZGdhcF9kb193YWl0X2Zvcl9iaW9zKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJdWNoYXIgKmFkZHI7CisJdTE2IHdvcmQ7CisJdTE2IGVycjE7CisJdTE2IGVycjI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuIHJldDsKKworCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCXdvcmQgPSByZWFkdyhhZGRyICsgUE9TVEFSRUEpOworCisJLyoKKwkgKiBJdCBjYW4gdGFrZSA1LTYgc2Vjb25kcyBmb3IgYSBib2FyZCB0bworCSAqIHBhc3MgdGhlIGJpb3Mgc2VsZiB0ZXN0IGFuZCBwb3N0IHJlc3VsdHMuCisJICogR2l2ZSBpdCAxMCBzZWNvbmRzLgorCSAqLworCWJyZC0+d2FpdF9mb3JfYmlvcyA9IDA7CisJd2hpbGUgKGJyZC0+d2FpdF9mb3JfYmlvcyA8IDEwMDApIHsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIEJJT1MgdGhpbmtzIGJvYXJkIGlzIGdvb2QuIChHRCkuICovCisJCWlmICh3b3JkID09ICoodTE2ICopICJHRCIpCisJCQlyZXR1cm4gMTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQlicmQtPndhaXRfZm9yX2Jpb3MrKzsKKwkJd29yZCA9IHJlYWR3KGFkZHIgKyBQT1NUQVJFQSk7CisJfQorCisJLyogR2F2ZSB1cCBvbiBib2FyZCBhZnRlciB0b28gbG9uZyBvZiB0aW1lIHRha2VuICovCisJZXJyMSA9IHJlYWR3KGFkZHIgKyBTRVFVRU5DRSk7CisJZXJyMiA9IHJlYWR3KGFkZHIgKyBFUlJPUik7CisJcHJfd2FybigiZGdhcDogJXMgZmFpbGVkIGRpYWdub3N0aWNzLiAgRXJyb3IgIygleCwleCkuXG4iLAorCQlicmQtPm5hbWUsIGVycjEsIGVycjIpOworCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0JJT1M7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29waWVzIHRoZSBGRVAgY29kZSBmcm9tIHRoZSB1c2VyIHRvIHRoZSBib2FyZCwKKyAqIGFuZCBzdGFydHMgdGhlIEZFUCBydW5uaW5nLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2RvX2ZlcF9sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIGNvbnN0IHVjaGFyICp1ZmVwLCBpbnQgbGVuKQoreworCXVjaGFyICphZGRyOworCXVpbnQgb2Zmc2V0OworCisJaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCisJCXJldHVybjsKKworCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCisJLyoKKwkgKiBEb3dubG9hZCBGRVAKKwkgKi8KKwlvZmZzZXQgPSAweDEwMDA7CisJbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgdWZlcCwgbGVuKTsKKworCS8qCisJICogSWYgYm9hcmQgaXMgYSBjb25jZW50cmF0b3IgcHJvZHVjdCwgd2UgbmVlZCB0byBnaXZlCisJICogaXQgaXRzIGNvbmZpZyBzdHJpbmcgZGVzY3JpYmluZyBob3cgdGhlIGNvbmNlbnRyYXRvcnMgbG9vay4KKwkgKi8KKwlpZiAoKGJyZC0+dHlwZSA9PSBQQ1gpIHx8IChicmQtPnR5cGUgPT0gUEVQQykpIHsKKwkJdWNoYXIgc3RyaW5nWzEwMF07CisJCXVjaGFyICpjb25maWcsICp4Y29uZmlnOworCQlpbnQgaSA9IDA7CisKKwkJeGNvbmZpZyA9IGRnYXBfY3JlYXRlX2NvbmZpZ19zdHJpbmcoYnJkLCBzdHJpbmcpOworCisJCS8qIFdyaXRlIHN0cmluZyB0byBib2FyZCBtZW1vcnkgKi8KKwkJY29uZmlnID0gYWRkciArIENPTkZJRzsKKwkJZm9yICg7IGkgPCBDT05GSUdTSVpFOyBpKyssIGNvbmZpZysrLCB4Y29uZmlnKyspIHsKKwkJCXdyaXRlYigqeGNvbmZpZywgY29uZmlnKTsKKwkJCWlmICgoKnhjb25maWcgJiAweGZmKSA9PSAweGZmKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJd3JpdGVsKDB4YmZjMDEwMDQsIChhZGRyICsgMHhjMzQpKTsKKwl3cml0ZWwoMHgzLCAoYWRkciArIDB4YzMwKSk7CisKK30KKworLyoKKyAqIFdhaXRzIGZvciB0aGUgRkVQIHRvIHJlcG9ydCB0aGF0cyBpdHMgcmVhZHkgZm9yIHVzIHRvIHVzZS4KKyAqLworc3RhdGljIGludCBkZ2FwX2RvX3dhaXRfZm9yX2ZlcChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCXVjaGFyICphZGRyOworCXUxNiB3b3JkOworCXUxNiBlcnIxOworCXUxNiBlcnIyOworCWludCByZXQgPSAwOworCisJaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCisJCXJldHVybiByZXQ7CisKKwlhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKKwl3b3JkID0gcmVhZHcoYWRkciArIEZFUFNUQVQpOworCisJLyoKKwkgKiBJdCBjYW4gdGFrZSAyLTMgc2Vjb25kcyBmb3IgdGhlIEZFUCB0bworCSAqIGJlIHVwIGFuZCBydW5uaW5nLiBHaXZlIGl0IDUgc2Vjcy4KKwkgKi8KKwlicmQtPndhaXRfZm9yX2ZlcCA9IDA7CisJd2hpbGUgKGJyZC0+d2FpdF9mb3JfZmVwIDwgNTAwKSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiBGRVAgaXMgdXAgYW5kIHJ1bm5pbmcgbm93LiAqLworCQlpZiAod29yZCA9PSAqKHUxNiAqKSAiT1MiKSB7CisJCQkvKgorCQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBjYW4gc3VwcG9ydCBGRVA1KyBjb21tYW5kcy4KKwkJCSovCisJCQl3b3JkID0gcmVhZHcoYWRkciArIEZFUDVfUExVUyk7CisJCQlpZiAod29yZCA9PSAqKHUxNiAqKSAiNUEiKQorCQkJCWJyZC0+YmRfZmxhZ3MgfD0gQkRfRkVQNVBMVVM7CisKKwkJCXJldHVybiAxOworCQl9CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwKTsKKwkJYnJkLT53YWl0X2Zvcl9mZXArKzsKKwkJd29yZCA9IHJlYWR3KGFkZHIgKyBGRVBTVEFUKTsKKwl9CisKKwkvKiBHYXZlIHVwIG9uIGJvYXJkIGFmdGVyIHRvbyBsb25nIG9mIHRpbWUgdGFrZW4gKi8KKwllcnIxID0gcmVhZHcoYWRkciArIFNFUVVFTkNFKTsKKwllcnIyID0gcmVhZHcoYWRkciArIEVSUk9SKTsKKwlwcl93YXJuKCJkZ2FwOiBGRVBPUyBmb3IgJXMgbm90IGZ1bmN0aW9uaW5nLiAgRXJyb3IgIygleCwleCkuXG4iLAorCQlicmQtPm5hbWUsIGVycjEsIGVycjIpOworCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQaHlzaWNhbGx5IGZvcmNlcyB0aGUgRkVQNSBjYXJkIHRvIHJlc2V0IGl0c2VsZi4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9kb19yZXNldF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQoreworCXVjaGFyIGNoZWNrOworCXUzMiBjaGVjazE7CisJdTMyIGNoZWNrMjsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fAorCSAgICAhYnJkLT5yZV9tYXBfbWVtYmFzZSB8fCAhYnJkLT5yZV9tYXBfcG9ydCkKKwkJcmV0dXJuOworCisJLyogRkVQUlNUIGRvZXMgbm90IHZhcnkgYW1vbmcgc3VwcG9ydGVkIGJvYXJkcyAqLworCXdyaXRlYihGRVBSU1QsIGJyZC0+cmVfbWFwX3BvcnQpOworCisJZm9yIChpID0gMDsgaSA8PSAxMDAwOyBpKyspIHsKKwkJY2hlY2sgPSByZWFkYihicmQtPnJlX21hcF9wb3J0KSAmIDB4ZTsKKwkJaWYgKGNoZWNrID09IEZFUFJTVCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCisJfQorCWlmIChpID4gMTAwMCkgeworCQlwcl93YXJuKCJkZ2FwOiBCb2FyZCBub3QgcmVzZXR0aW5nLi4uICBGYWlsaW5nIGJvYXJkLlxuIik7CisJCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSByZWFsbHkgaXMgbWVtb3J5IG91dCB0aGVyZS4KKwkgKi8KKwl3cml0ZWwoMHhhNTVhM2NjMywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBMT1dNRU0pKTsKKwl3cml0ZWwoMHg1YWE1YzMzYywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBISUdITUVNKSk7CisJY2hlY2sxID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIExPV01FTSk7CisJY2hlY2syID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIEhJR0hNRU0pOworCisJaWYgKChjaGVjazEgIT0gMHhhNTVhM2NjMykgfHwgKGNoZWNrMiAhPSAweDVhYTVjMzNjKSkgeworCQlwcl93YXJuKCJkZ2FwOiBObyBtZW1vcnkgYXQgJXAgZm9yIGJvYXJkLlxuIiwKKwkJCWJyZC0+cmVfbWFwX21lbWJhc2UpOworCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOworCQlyZXR1cm47CisJfQorCit9CisKKyNpZmRlZiBESUdJX0NPTkNFTlRSQVRPUlNfU1VQUE9SVEVECisvKgorICogU2VuZHMgYSBjb25jZW50cmF0b3IgaW1hZ2UgaW50byB0aGUgRkVQNSBib2FyZC4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9kb19jb25jX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgKnVhZGRyLCBpbnQgbGVuKQoreworCWNoYXIgKnZhZGRyOworCXUxNiBvZmZzZXQgPSAwOworCXN0cnVjdCBkb3dubGRfdCAqdG9fZHA7CisKKwlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmV0dXJuOworCisJdmFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOworCisJb2Zmc2V0ID0gcmVhZHcoKHUxNiAqKSAodmFkZHIgKyBET1dOUkVRKSk7CisJdG9fZHAgPSAoc3RydWN0IGRvd25sZF90ICopICh2YWRkciArIChpbnQpIG9mZnNldCk7CisJbWVtY3B5X3RvaW8odG9fZHAsIHVhZGRyLCBsZW4pOworCisJLyogVGVsbCBjYXJkIHdlIGhhdmUgZGF0YSBmb3IgaXQgKi8KKwl3cml0ZXcoMCwgdmFkZHIgKyAoRE9XTlJFUSkpOworCisJYnJkLT5jb25jX2RsX3N0YXR1cyA9IE5PX1BFTkRJTkdfQ09OQ0VOVFJBVE9SX1JFUVVFU1RTOworfQorI2VuZGlmCisKKyNkZWZpbmUgRVhQQU5TSU9OX1JPTV9TSVpFCSg2NCAqIDEwMjQpCisjZGVmaW5lIEZFUDVfUk9NX01BR0lDCQkoMHhGRUZGRkZGRikKKworc3RhdGljIHZvaWQgZGdhcF9nZXRfdnBkKHN0cnVjdCBib2FyZF90ICpicmQpCit7CisJdTMyIG1hZ2ljOworCXUzMiBiYXNlX29mZnNldDsKKwl1MTYgcm9tX29mZnNldDsKKwl1MTYgdnBkX29mZnNldDsKKwl1MTYgaW1hZ2VfbGVuZ3RoOworCXUxNiBpOworCXVjaGFyIGJ5dGUxOworCXVjaGFyIGJ5dGUyOworCisJLyoKKwkgKiBQb2tlIHRoZSBtYWdpYyBudW1iZXIgYXQgdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KKwkgKiBJZiBWUEQgaXMgc3VwcG9ydGVkLCB0aGUgdmFsdWUgcmVhZCBmcm9tIHRoYXQgYWRkcmVzcworCSAqIHdpbGwgYmUgbm9uLXplcm8uCisJICovCisJbWFnaWMgPSBGRVA1X1JPTV9NQUdJQzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCAmbWFnaWMpOworCisJLyogVlBEIG5vdCBzdXBwb3J0ZWQsIGJhaWwgKi8KKwlpZiAoIW1hZ2ljKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRvIGdldCB0byB0aGUgT1RQUk9NIG1lbW9yeSwgd2UgaGF2ZSB0byBzZW5kIHRoZSBib2FyZHMgYmFzZQorCSAqIGFkZHJlc3Mgb3InZWQgd2l0aCAxIGludG8gdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KKwkgKi8KKwltYWdpYyA9IGJyZC0+bWVtYmFzZSB8IDB4MDE7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgJm1hZ2ljKTsKKworCWJ5dGUxID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSk7CisJYnl0ZTIgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgMSk7CisKKwkvKgorCSAqIElmIHRoZSBib2FyZCBjb3JyZWN0bHkgc3dhcHBlZCB0byB0aGUgT1RQUk9NIG1lbW9yeSwKKwkgKiB0aGUgZmlyc3QgMiBieXRlcyAoaGVhZGVyKSBzaG91bGQgYmUgMHg1NSwgMHhBQQorCSAqLworCWlmIChieXRlMSA9PSAweDU1ICYmIGJ5dGUyID09IDB4QUEpIHsKKworCQliYXNlX29mZnNldCA9IDA7CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBydW4gdGhyb3VnaCBhbGwgdGhlIE9UUFJPTSBtZW1vcnkgbG9va2luZworCQkgKiBmb3IgdGhlIFZQRCBvZmZzZXQuCisJCSAqLworCQl3aGlsZSAoYmFzZV9vZmZzZXQgPD0gRVhQQU5TSU9OX1JPTV9TSVpFKSB7CisKKwkJCS8qCisJCQkgKiBMb3RzIG9mIG1hZ2ljIG51bWJlcnMgaGVyZS4KKwkJCSAqCisJCQkgKiBUaGUgVlBEIG9mZnNldCBpcyBsb2NhdGVkIGluc2lkZSB0aGUgUk9NIERhdGEKKwkJCSAqIFN0cnVjdHVyZS4KKwkJCSAqCisJCQkgKiBXZSBhbHNvIGhhdmUgdG8gcmVtZW1iZXIgdGhlIGxlbmd0aCBvZiBlYWNoCisJCQkgKiBST00gRGF0YSBTdHJ1Y3R1cmUsIHNvIHdlIGNhbiAiaG9wIiB0byB0aGUgbmV4dAorCQkJICogZW50cnkgaWYgdGhlIFZQRCBpc24ndCBpbiB0aGUgY3VycmVudAorCQkJICogUk9NIERhdGEgU3RydWN0dXJlLgorCQkJICovCisJCQlyb21fb2Zmc2V0ID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQliYXNlX29mZnNldCArIDB4MTgpOworCQkJaW1hZ2VfbGVuZ3RoID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQlyb21fb2Zmc2V0ICsgMHgxMCkgKiA1MTI7CisJCQl2cGRfb2Zmc2V0ID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQlyb21fb2Zmc2V0ICsgMHgwOCk7CisKKwkJCS8qIEZvdW5kIHRoZSBWUEQgZW50cnkgKi8KKwkJCWlmICh2cGRfb2Zmc2V0KQorCQkJCWJyZWFrOworCisJCQkvKiBXZSBkaWRuJ3QgZmluZCBhIFZQRCBlbnRyeSwgZ28gdG8gbmV4dCBST00gZW50cnkuICovCisJCQliYXNlX29mZnNldCArPSBpbWFnZV9sZW5ndGg7CisKKwkJCWJ5dGUxID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIGJhc2Vfb2Zmc2V0KTsKKwkJCWJ5dGUyID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIGJhc2Vfb2Zmc2V0ICsgMSk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgbmV3IFJPTSBvZmZzZXQgZG9lc24ndCBoYXZlIDB4NTUsIDB4QUEKKwkJCSAqIGFzIGl0cyBoZWFkZXIsIHdlIGhhdmUgcnVuIG91dCBvZiBST00uCisJCQkgKi8KKwkJCWlmIChieXRlMSAhPSAweDU1IHx8IGJ5dGUyICE9IDB4QUEpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgVlBEIG9mZnNldCwgdGhlbiBtYXJrIHRoZSBib2FyZAorCQkgKiBhcyBoYXZpbmcgYSB2YWxpZCBWUEQsIGFuZCBjb3B5IFZQRFNJWkUgKDUxMikgYnl0ZXMgb2YKKwkJICogdGhhdCBWUEQgdG8gdGhlIGJ1ZmZlciB3ZSBoYXZlIGluIG91ciBib2FyZCBzdHJ1Y3R1cmUuCisJCSAqLworCQlpZiAodnBkX29mZnNldCkgeworCQkJYnJkLT5iZF9mbGFncyB8PSBCRF9IQVNfVlBEOworCQkJZm9yIChpID0gMDsgaSA8IFZQRFNJWkU7IGkrKykgeworCQkJCWJyZC0+dnBkW2ldID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArCisJCQkJCQkJdnBkX29mZnNldCArIGkpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBXZSBNVVNUIHBva2UgdGhlIG1hZ2ljIG51bWJlciBhdCB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uIGFnYWluLgorCSAqIFRoaXMgbWFrZXMgdGhlIGNhcmQgcmVwb3J0IHRoZSByZWd1bGFyIGJvYXJkIG1lbW9yeSBiYWNrIHRvIHVzLAorCSAqIHJhdGhlciB0aGFuIHRoZSBPVFBST00gbWVtb3J5LgorCSAqLworCW1hZ2ljID0gRkVQNV9ST01fTUFHSUM7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOworfQorCisvKgorICogT3VyIGJvYXJkIHBvbGxlciBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9wb2xsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBib2FyZF90ICpiZCA9IChzdHJ1Y3QgYm9hcmRfdCAqKSBkYXRhOworCXVsb25nICBsb2NrX2ZsYWdzOworCWNoYXIgKnZhZGRyOworCXUxNiBoZWFkLCB0YWlsOworCisJaWYgKCFiZCB8fCAoYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpKQorCQlyZXR1cm47CisKKwlpZiAoYmQtPmluaGliaXRfcG9sbGVyKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJdmFkZHIgPSBiZC0+cmVfbWFwX21lbWJhc2U7CisKKwkvKgorCSAqIElmIGJvYXJkIGlzIHJlYWR5LCBwYXJzZSBkZWVwZXIgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGRvLgorCSAqLworCWlmIChiZC0+c3RhdGUgPT0gQk9BUkRfUkVBRFkpIHsKKworCQlzdHJ1Y3QgZXZfdCAqZWFkZHIgPSBOVUxMOworCisJCWlmICghYmQtPnJlX21hcF9tZW1iYXNlKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFiZC0+cmVfbWFwX3BvcnQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICghYmQtPm5hc3luYykKKwkJCWdvdG8gb3V0OworCisJCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKKworCQkvKiBHZXQgb3VyIGhlYWQgYW5kIHRhaWwgKi8KKwkJaGVhZCA9IHJlYWR3KCYoZWFkZHItPmV2X2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhbiBldmVudCBwZW5kaW5nLiBHbyBzZXJ2aWNlIGl0LgorCQkgKi8KKwkJaWYgKGhlYWQgIT0gdGFpbCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJZGdhcF9ldmVudChiZCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQl9CisKK291dDoKKwkJLyoKKwkJICogSWYgYm9hcmQgaXMgZG9pbmcgaW50ZXJydXB0cywgQUNLIHRoZSBpbnRlcnJ1cHQuCisJCSAqLworCQlpZiAoYmQgJiYgYmQtPmludHJfcnVubmluZykKKwkJCXJlYWRiKGJkLT5yZV9tYXBfcG9ydCArIDIpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9jbWRiIC0gU2VuZHMgYSAyIGJ5dGUgY29tbWFuZCB0byB0aGUgRkVQLgorICoKKyAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICBjbWQgICAgIC0gQ29tbWFuZCB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIGJ5dGUxICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgZmlyc3QgYnl0ZSB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIGJ5dGUyICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgc2Vjb25kIGJ5dGUgdG8gYmUgc2VudC4KKyAqICAgICAgICAgICAgICBuY21kcyAgIC0gV2FpdCB1bnRpbCBuY21kcyBvciBmZXdlciBjbWRzIGFyZSBsZWZ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjbWQgYnVmZmVyIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBkZ2FwX2NtZGIoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdWNoYXIgYnl0ZTEsCisJCQl1Y2hhciBieXRlMiwgdWludCBuY21kcykKK3sKKwljaGFyCQkqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBjbV90CSpjbV9hZGRyID0gTlVMTDsKKwl1aW50CQljb3VudDsKKwl1aW50CQluOworCXUxNgkJaGVhZDsKKwl1MTYJCXRhaWw7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogQ2hlY2sgaWYgYm9hcmQgaXMgc3RpbGwgYWxpdmUuCisJICovCisJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgcG9pbnRlcnMgYXJlIGluIHJhbmdlIGJlZm9yZQorCSAqIHdyaXRpbmcgdG8gdGhlIEZFUCBtZW1vcnkuCisJICovCisJdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOworCisJaWYgKCF2YWRkcikKKwkJcmV0dXJuOworCisJY21fYWRkciA9IChzdHJ1Y3QgY21fdCAqKSAodmFkZHIgKyBDTURCVUYpOworCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKworCS8qCisJICogRm9yZ2V0IGl0IGlmIHBvaW50ZXJzIG91dCBvZiByYW5nZS4KKwkgKi8KKwlpZiAoaGVhZCA+PSAoQ01ETUFYIC0gQ01EU1RBUlQpIHx8IChoZWFkICYgMDMpKSB7CisJCWNoLT5jaF9iZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFB1dCB0aGUgZGF0YSBpbiB0aGUgY2lyY3VsYXIgY29tbWFuZCBidWZmZXIuCisJICovCisJd3JpdGViKGNtZCwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMCkpOworCXdyaXRlYigodWNoYXIpIGNoLT5jaF9wb3J0bnVtLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAxKSk7CisJd3JpdGViKGJ5dGUxLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAyKSk7CisJd3JpdGViKGJ5dGUyLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAzKSk7CisKKwloZWFkID0gKGhlYWQgKyA0KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOworCisJd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKKwkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKKwkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKKwkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KKwkgKi8KKwlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgeworCisJCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOworCisJCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9jbWR3IC0gU2VuZHMgYSAxIHdvcmQgY29tbWFuZCB0byB0aGUgRkVQLgorICoKKyAqICAgICAgICAgICAgICBjaCAgICAgIC0gUG9pbnRlciB0byBjaGFubmVsIHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICBjbWQgICAgIC0gQ29tbWFuZCB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIHdvcmQgICAgLSBJbnRlZ2VyIGNvbnRhaW5pbmcgd29yZCB0byBiZSBzZW50LgorICogICAgICAgICAgICAgIG5jbWRzICAgLSBXYWl0IHVudGlsIG5jbWRzIG9yIGZld2VyIGNtZHMgYXJlIGxlZnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGNtZCBidWZmZXIgYmVmb3JlIHJldHVybmluZy4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGRnYXBfY21kdyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1MTYgd29yZCwgdWludCBuY21kcykKK3sKKwljaGFyCQkqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBjbV90CSpjbV9hZGRyID0gTlVMTDsKKwl1aW50CQljb3VudDsKKwl1aW50CQluOworCXUxNgkJaGVhZDsKKwl1MTYJCXRhaWw7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogQ2hlY2sgaWYgYm9hcmQgaXMgc3RpbGwgYWxpdmUuCisJICovCisJaWYgKGNoLT5jaF9iZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgcG9pbnRlcnMgYXJlIGluIHJhbmdlIGJlZm9yZQorCSAqIHdyaXRpbmcgdG8gdGhlIEZFUCBtZW1vcnkuCisJICovCisJdmFkZHIgPSBjaC0+Y2hfYmQtPnJlX21hcF9tZW1iYXNlOworCWlmICghdmFkZHIpCisJCXJldHVybjsKKworCWNtX2FkZHIgPSAoc3RydWN0IGNtX3QgKikgKHZhZGRyICsgQ01EQlVGKTsKKwloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7CisKKwkvKgorCSAqIEZvcmdldCBpdCBpZiBwb2ludGVycyBvdXQgb2YgcmFuZ2UuCisJICovCisJaWYgKGhlYWQgPj0gKENNRE1BWCAtIENNRFNUQVJUKSB8fCAoaGVhZCAmIDAzKSkgeworCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBQdXQgdGhlIGRhdGEgaW4gdGhlIGNpcmN1bGFyIGNvbW1hbmQgYnVmZmVyLgorCSAqLworCXdyaXRlYihjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKKwl3cml0ZWIoKHVjaGFyKSBjaC0+Y2hfcG9ydG51bSwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOworCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAyKSk7CisKKwloZWFkID0gKGhlYWQgKyA0KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOworCisJd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKKwkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKKwkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKKwkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KKwkgKi8KKwlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgeworCisJCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOworCisJCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9jbWR3X2V4dCAtIFNlbmRzIGEgZXh0ZW5kZWQgd29yZCBjb21tYW5kIHRvIHRoZSBGRVAuCisgKgorICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgorICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgd29yZCAgICAtIEludGVnZXIgY29udGFpbmluZyB3b3JkIHRvIGJlIHNlbnQuCisgKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAorICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgZGdhcF9jbWR3X2V4dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdTE2IGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpCit7CisJY2hhcgkJKnZhZGRyID0gTlVMTDsKKwlzdHJ1Y3QgY21fdAkqY21fYWRkciA9IE5VTEw7CisJdWludAkJY291bnQ7CisJdWludAkJbjsKKwl1MTYJCWhlYWQ7CisJdTE2CQl0YWlsOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwkvKgorCSAqIENoZWNrIGlmIGJvYXJkIGlzIHN0aWxsIGFsaXZlLgorCSAqLworCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBpbiByYW5nZSBiZWZvcmUKKwkgKiB3cml0aW5nIHRvIHRoZSBGRVAgbWVtb3J5LgorCSAqLworCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKKwlpZiAoIXZhZGRyKQorCQlyZXR1cm47CisKKwljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7CisJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgorCSAqLworCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKKwkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KKwkgKi8KKworCS8qIFdyaXRlIGFuIEZGIHRvIHRlbGwgdGhlIEZFUCB0aGF0IHdlIHdhbnQgYW4gZXh0ZW5kZWQgY29tbWFuZCAqLworCXdyaXRlYigodWNoYXIpIDB4ZmYsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKKworCXdyaXRlYigodWNoYXIpIGNoLT5jaF9wb3J0bnVtLCAodWNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOworCXdyaXRldygodTE2KSBjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKKworCS8qCisJICogSWYgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb21tYW5kIHdvbid0IGZpdCwKKwkgKiBwdXQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLgorCSAqLworCWlmICgoKGhlYWQgKyA0KSA+PSAoKENNRE1BWCAtIENNRFNUQVJUKSkgfHwgKGhlYWQgJiAwMykpKQorCQl3cml0ZXcoKHUxNikgd29yZCwgKGNoYXIgKikgKHZhZGRyICsgQ01EU1RBUlQpKTsKKwllbHNlCisJCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyA0KSk7CisKKwloZWFkID0gKGhlYWQgKyA4KSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOworCisJd3JpdGV3KGhlYWQsICYoY21fYWRkci0+Y21faGVhZCkpOworCisJLyoKKwkgKiBXYWl0IGlmIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRpbmcgdGhlIGhlYWQKKwkgKiBwb2ludGVyIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKKwkgKiBjb21tYW5kcyB0byB0aGUgRkVQLiAgIElmIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcKKwkgKiBpcyBvdXRsYW5kaXNoLCBkZWNsYXJlIHRoZSBGRVAgZGVhZC4KKwkgKi8KKwlmb3IgKGNvdW50ID0gZGdhcF9jb3VudCA7OykgeworCisJCWhlYWQgPSByZWFkdygmKGNtX2FkZHItPmNtX2hlYWQpKTsKKwkJdGFpbCA9IHJlYWR3KCYoY21fYWRkci0+Y21fdGFpbCkpOworCisJCW4gPSAoaGVhZCAtIHRhaWwpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7CisKKwkJaWYgKG4gPD0gbmNtZHMgKiBzaXplb2Yoc3RydWN0IGNtX3QpKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKKwkJCXJldHVybjsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF93bW92ZSAtIFdyaXRlIGRhdGEgdG8gRkVQIGJ1ZmZlci4KKyAqCisgKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCisgKiAgICAgICAgICAgICAgYnVmICAgICAtIFBvaXRlciB0byBjaGFyYWN0ZXJzIHRvIGJlIG1vdmVkLgorICogICAgICAgICAgICAgIGNudCAgICAgLSBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBtb3ZlLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgZGdhcF93bW92ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgY2hhciAqYnVmLCB1aW50IGNudCkKK3sKKwlpbnQgICAgbjsKKwljaGFyICAgKnRhZGRyOworCXN0cnVjdCBic190ICAgICpiczsKKwl1MTYgICAgaGVhZDsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayBwYXJhbWV0ZXJzLgorCSAqLworCWJzICAgPSBjaC0+Y2hfYnM7CisJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKTsKKworCS8qCisJICogSWYgcG9pbnRlcnMgYXJlIG91dCBvZiByYW5nZSwganVzdCByZXR1cm4uCisJICovCisJaWYgKChjbnQgPiBjaC0+Y2hfdHNpemUpIHx8CisJICAgICh1bnNpZ25lZCkoaGVhZCAtIGNoLT5jaF90c3RhcnQpID49IGNoLT5jaF90c2l6ZSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGUgd3JpdGUgd3JhcHMgb3ZlciB0aGUgdG9wIG9mIHRoZSBjaXJjdWxhciBidWZmZXIsCisJICogbW92ZSB0aGUgcG9ydGlvbiB1cCB0byB0aGUgd3JhcCBwb2ludCwgYW5kIHJlc2V0IHRoZQorCSAqIHBvaW50ZXJzIHRvIHRoZSBib3R0b20uCisJICovCisJbiA9IGNoLT5jaF90c3RhcnQgKyBjaC0+Y2hfdHNpemUgLSBoZWFkOworCisJaWYgKGNudCA+PSBuKSB7CisJCWNudCAtPSBuOworCQl0YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7CisJCW1lbWNweV90b2lvKHRhZGRyLCBidWYsIG4pOworCQloZWFkID0gY2gtPmNoX3RzdGFydDsKKwkJYnVmICs9IG47CisJfQorCisJLyoKKwkgKiBNb3ZlIHJlc3Qgb2YgZGF0YS4KKwkgKi8KKwl0YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7CisJbiA9IGNudDsKKwltZW1jcHlfdG9pbyh0YWRkciwgYnVmLCBuKTsKKwloZWFkICs9IGNudDsKKworCXdyaXRldyhoZWFkLCAmKGJzLT50eF9oZWFkKSk7Cit9CisKKy8qCisgKiBSZXRyaXZlcyB0aGUgY3VycmVudCBjdXN0b20gYmF1ZCByYXRlIGZyb20gRkVQIG1lbW9yeSwKKyAqIGFuZCByZXR1cm5zIGl0IGJhY2sgdG8gdGhlIHVzZXIuCisgKiBSZXR1cm5zIDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyB1aW50IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCXVjaGFyICp2YWRkcjsKKwl1bG9uZyBvZmZzZXQgPSAwOworCXVpbnQgdmFsdWUgPSAwOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWlmICghY2gtPmNoX2JkIHx8IGNoLT5jaF9iZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShjaC0+Y2hfYmQtPmJkX2ZsYWdzICYgQkRfRkVQNVBMVVMpKQorCQlyZXR1cm4gMDsKKworCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKKworCWlmICghdmFkZHIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBHbyBnZXQgZnJvbSBmZXAgbWVtLCB3aGF0IHRoZSBmZXAKKwkgKiBiZWxpZXZlcyB0aGUgY3VzdG9tIGJhdWQgcmF0ZSBpcy4KKwkgKi8KKwlvZmZzZXQgPSAoKCgoKih1bnNpZ25lZCBzaG9ydCAqKSh2YWRkciArIEVDU19TRUcpKSA8PCA0KSArCisJCShjaC0+Y2hfcG9ydG51bSAqIDB4MjgpICsgTElORV9TUEVFRCkpOworCisJdmFsdWUgPSByZWFkdyh2YWRkciArIG9mZnNldCk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKgorICogQ2FsbHMgdGhlIGZpcm13YXJlIHRvIHJlc2V0IHRoaXMgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgZGdhcF9maXJtd2FyZV9yZXNldF9wb3J0KHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCWRnYXBfY21kYihjaCwgQ0hSRVNFVCwgMCwgMCwgMCk7CisKKwkvKgorCSAqIE5vdyB0aGF0IHRoZSBjaGFubmVsIGlzIHJlc2V0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorCSAqIGFsbCB0aGUgY3VycmVudCBzZXR0aW5ncyBnZXQgcmVhcHBsaWVkIHRvIHRoZSBwb3J0CisJICogaW4gdGhlIGZpcm13YXJlLgorCSAqCisJICogU28gd2Ugd2lsbCBzZXQgdGhlIGRyaXZlcidzIGNhY2hlIG9mIGZpcm13YXJlCisJICogc2V0dGluZ3MgYWxsIHRvIDAsIGFuZCB0aGVuIGNhbGwgcGFyYW0uCisJICovCisJY2gtPmNoX2ZlcGlmbGFnID0gMDsKKwljaC0+Y2hfZmVwY2ZsYWcgPSAwOworCWNoLT5jaF9mZXBvZmxhZyA9IDA7CisJY2gtPmNoX2ZlcHN0YXJ0YyA9IDA7CisJY2gtPmNoX2ZlcHN0b3BjID0gMDsKKwljaC0+Y2hfZmVwYXN0YXJ0YyA9IDA7CisJY2gtPmNoX2ZlcGFzdG9wYyA9IDA7CisJY2gtPmNoX21vc3RhdCA9IDA7CisJY2gtPmNoX2hmbG93ID0gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgICAgZGdhcF9wYXJhbSAtIFNldCBEaWdpIHBhcmFtZXRlcnMuCisgKgorICogICAgICAgICAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICogICAgIC0gVFRZIGZvciBwb3J0LgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBkZ2FwX3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGt0ZXJtaW9zICp0czsKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IGJzX3QgICAqYnM7CisJc3RydWN0IHVuX3QgICAqdW47CisJdTE2CWhlYWQ7CisJdTE2CWNmbGFnOworCXUxNglpZmxhZzsKKwl1Y2hhcgltdmFsOworCXVjaGFyCWhmbG93OworCisJaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCisJCXJldHVybiAtRU5YSU87CisKKwl1biA9IChzdHJ1Y3QgdW5fdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAtRU5YSU87CisKKwlicyA9IGNoLT5jaF9iczsKKwlpZiAoIWJzKQorCQlyZXR1cm4gLUVOWElPOworCisJdHMgPSAmdHR5LT50ZXJtaW9zOworCisJLyoKKwkgKiBJZiBiYXVkIHJhdGUgaXMgemVybywgZmx1c2ggcXVldWVzLCBhbmQgc2V0IG12YWwgdG8gZHJvcCBEVFIuCisJICovCisJaWYgKChjaC0+Y2hfY19jZmxhZyAmIChDQkFVRCkpID09IDApIHsKKworCQkvKiBmbHVzaCByeCAqLworCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X2hlYWQpKTsKKwkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7CisKKwkJLyogZmx1c2ggdHggKi8KKwkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7CisJCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+dHhfdGFpbCkpOworCisJCWNoLT5jaF9mbGFncyB8PSAoQ0hfQkFVRDApOworCisJCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KKwkJY2gtPmNoX212YWwgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKKwkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IDA7CisKKwl9IGVsc2UgaWYgKGNoLT5jaF9jdXN0b21fc3BlZWQgJiYgKGJkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSkgeworCQkvKgorCQkgKiBUZWxsIHRoZSBmZXAgdG8gZG8gdGhlIGNvbW1hbmQKKwkJICovCisKKwkJZGdhcF9jbWR3X2V4dChjaCwgMHhmZjAxLCBjaC0+Y2hfY3VzdG9tX3NwZWVkLCAwKTsKKworCQkvKgorCQkgKiBOb3cgZ28gZ2V0IGZyb20gZmVwIG1lbSwgd2hhdCB0aGUgZmVwCisJCSAqIGJlbGlldmVzIHRoZSBjdXN0b20gYmF1ZCByYXRlIGlzLgorCQkgKi8KKwkJY2gtPmNoX2N1c3RvbV9zcGVlZCA9IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKGNoKTsKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IGNoLT5jaF9jdXN0b21fc3BlZWQ7CisKKwkJLyogSGFuZGxlIHRyYW5zaXRpb24gZnJvbSBCMCAqLworCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfQkFVRDApIHsKKwkJCWNoLT5jaF9mbGFncyAmPSB+KENIX0JBVUQwKTsKKwkJCWNoLT5jaF9tdmFsIHw9IChEX1JUUyhjaCl8RF9EVFIoY2gpKTsKKwkJfQorCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOworCisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2V0IGJhdWQgcmF0ZSwgY2hhcmFjdGVyIHNpemUsIGFuZCBwYXJpdHkuCisJCSAqLworCisKKwkJaW50IGlpbmRleCA9IDA7CisJCWludCBqaW5kZXggPSAwOworCQlpbnQgYmF1ZCA9IDA7CisKKwkJdWxvbmcgYmF1ZHNbNF1bMTZdID0geworCQkJeyAvKiBzbG93YmF1ZCAqLworCQkJCTAsCTUwLAk3NSwJMTEwLAorCQkJCTEzNCwJMTUwLAkyMDAsCTMwMCwKKwkJCQk2MDAsCTEyMDAsCTE4MDAsCTI0MDAsCisJCQkJNDgwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCisJCQl7IC8qIHNsb3diYXVkICYgQ0JBVURFWCAqLworCQkJCTAsCTU3NjAwLAkxMTUyMDAsCTIzMDQwMCwKKwkJCQk0NjA4MDAsCTE1MCwJMjAwLAk5MjE2MDAsCisJCQkJNjAwLAkxMjAwLAkxODAwLAkyNDAwLAorCQkJCTQ4MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAorCQkJeyAvKiBmYXN0YmF1ZCAqLworCQkJCTAsCTU3NjAwLAk3NjgwMCwJMTE1MjAwLAorCQkJCTE0NDAwLAk1NzYwMCwJMjMwNDAwLAk3NjgwMCwKKwkJCQkxMTUyMDAsCTIzMDQwMCwJMjg4MDAsCTQ2MDgwMCwKKwkJCQk5MjE2MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAorCQkJeyAvKiBmYXN0YmF1ZCAmIENCQVVERVggKi8KKwkJCQkwLAk1NzYwMCwJMTE1MjAwLAkyMzA0MDAsCisJCQkJNDYwODAwLAkxNTAsCTIwMCwJOTIxNjAwLAorCQkJCTYwMCwJMTIwMCwJMTgwMCwJMjQwMCwKKwkJCQk0ODAwLAk5NjAwLAkxOTIwMCwJMzg0MDAgfQorCQl9OworCisJCS8qCisJCSAqIE9ubHkgdXNlIHRoZSBUWFByaW50IGJhdWQgcmF0ZSBpZiB0aGUKKwkJICogdGVybWluYWwgdW5pdCBpcyBOT1Qgb3BlbgorCQkgKi8KKwkJaWYgKCEoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0lTT1BFTikgJiYKKwkJICAgICAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkpCisJCQliYXVkID0gQ19CQVVEKGNoLT5jaF9wdW4udW5fdHR5KSAmIDB4ZmY7CisJCWVsc2UKKwkJCWJhdWQgPSBDX0JBVUQoY2gtPmNoX3R1bi51bl90dHkpICYgMHhmZjsKKworCQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKQorCQkJaWluZGV4ID0gMTsKKworCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkKKwkJCWlpbmRleCArPSAyOworCisJCWppbmRleCA9IGJhdWQ7CisKKwkJaWYgKChpaW5kZXggPj0gMCkgJiYgKGlpbmRleCA8IDQpICYmCisJCSAgICAoamluZGV4ID49IDApICYmIChqaW5kZXggPCAxNikpCisJCQliYXVkID0gYmF1ZHNbaWluZGV4XVtqaW5kZXhdOworCQllbHNlCisJCQliYXVkID0gMDsKKworCQlpZiAoYmF1ZCA9PSAwKQorCQkJYmF1ZCA9IDk2MDA7CisKKwkJY2gtPmNoX2JhdWRfaW5mbyA9IGJhdWQ7CisKKwkJLyoKKwkJICogQ0JBVUQgaGFzIGJpdCBwb3NpdGlvbiAweDEwMDAgc2V0IHRoZXNlIGRheXMgdG8KKwkJICogaW5kaWNhdGUgTGludXggYmF1ZCByYXRlIHJlbWFwLgorCQkgKiBXZSB1c2UgYSBkaWZmZXJlbnQgYml0IGFzc2lnbm1lbnQgZm9yIGhpZ2ggc3BlZWQuCisJCSAqIENsZWFyIHRoaXMgYml0IG91dCB3aGlsZSBncmFiYmluZyB0aGUgcGFydHMgb2YKKwkJICogImNmbGFnIiB3ZSB3YW50LgorCQkgKi8KKwkJY2ZsYWcgPSBjaC0+Y2hfY19jZmxhZyAmICgoQ0JBVUQgXiBDQkFVREVYKSB8IFBBUk9ERCB8IFBBUkVOQiB8CisJCQkJCQkgICBDU1RPUEIgfCBDU0laRSk7CisKKwkJLyoKKwkJICogSFVQQ0wgYml0IGlzIHVzZWQgYnkgRkVQIHRvIGluZGljYXRlIGZhc3QgYmF1ZAorCQkgKiB0YWJsZSBpcyB0byBiZSB1c2VkLgorCQkgKi8KKwkJaWYgKChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKSB8fAorCQkgICAgKGNoLT5jaF9jX2NmbGFnICYgQ0JBVURFWCkpCisJCQljZmxhZyB8PSBIVVBDTDsKKworCQlpZiAoKGNoLT5jaF9jX2NmbGFnICYgQ0JBVURFWCkgJiYKKwkJICAgICEoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkpIHsKKwkJCS8qCisJCQkgKiBUaGUgYmVsb3cgY29kZSBpcyB0cnlpbmcgdG8gZ3VhcmFudGVlIHRoYXQgb25seQorCQkJICogYmF1ZCByYXRlcyAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAgYXJlCisJCQkgKiByZW1hcHBlZC4gV2UgdXNlIGV4Y2x1c2l2ZSBvciAgYmVjYXVzZSB0aGUgdmFyaW91cworCQkJICogYmF1ZCByYXRlcyBzaGFyZSBjb21tb24gYml0IHBvc2l0aW9ucyBhbmQgdGhlcmVmb3JlCisJCQkgKiBjYW4ndCBiZSB0ZXN0ZWQgZm9yIGVhc2lseS4KKwkJCSAqLworCQkJdGNmbGFnX3QgdGNmbGFnID0gKGNoLT5jaF9jX2NmbGFnICYgQ0JBVUQpIHwgQ0JBVURFWDsKKwkJCWludCBiYXVkcGFydCA9IDA7CisKKwkJCS8qCisJCQkgKiBNYXAgaGlnaCBzcGVlZCByZXF1ZXN0cyB0byBpbmRleAorCQkJICogaW50byBGRVAncyBiYXVkIHRhYmxlCisJCQkgKi8KKwkJCXN3aXRjaCAodGNmbGFnKSB7CisJCQljYXNlIEI1NzYwMDoKKwkJCQliYXVkcGFydCA9IDE7CisJCQkJYnJlYWs7CisjaWZkZWYgQjc2ODAwCisJCQljYXNlIEI3NjgwMDoKKwkJCQliYXVkcGFydCA9IDI7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWNhc2UgQjExNTIwMDoKKwkJCQliYXVkcGFydCA9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIEIyMzA0MDA6CisJCQkJYmF1ZHBhcnQgPSA5OworCQkJCWJyZWFrOworCQkJY2FzZSBCNDYwODAwOgorCQkJCWJhdWRwYXJ0ID0gMTE7CisJCQkJYnJlYWs7CisjaWZkZWYgQjkyMTYwMAorCQkJY2FzZSBCOTIxNjAwOgorCQkJCWJhdWRwYXJ0ID0gMTI7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJYmF1ZHBhcnQgPSAwOworCQkJfQorCisJCQlpZiAoYmF1ZHBhcnQpCisJCQkJY2ZsYWcgPSAoY2ZsYWcgJiB+KENCQVVEIHwgQ0JBVURFWCkpIHwgYmF1ZHBhcnQ7CisJCX0KKworCQljZmxhZyAmPSAweGZmZmY7CisKKwkJaWYgKGNmbGFnICE9IGNoLT5jaF9mZXBjZmxhZykgeworCQkJY2gtPmNoX2ZlcGNmbGFnID0gKHUxNikgKGNmbGFnICYgMHhmZmZmKTsKKworCQkJLyoKKwkJCSAqIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZAorCQkJICogbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMKKwkJCSAqLworCQkJZGdhcF9jbWR3KGNoLCBTQ0ZMQUcsICh1MTYpIGNmbGFnLCAwKTsKKwkJfQorCisJCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGZyb20gQjAgKi8KKwkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0JBVUQwKSB7CisJCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9CQVVEMCk7CisJCQljaC0+Y2hfbXZhbCB8PSAoRF9SVFMoY2gpfERfRFRSKGNoKSk7CisJCX0KKwkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKKwl9CisKKwkvKgorCSAqIEdldCBpbnB1dCBmbGFncy4KKwkgKi8KKwlpZmxhZyA9IGNoLT5jaF9jX2lmbGFnICYgKElHTkJSSyB8IEJSS0lOVCB8IElHTlBBUiB8IFBBUk1SSyB8CisJCQkJICBJTlBDSyB8IElTVFJJUCB8IElYT04gfCBJWEFOWSB8IElYT0ZGKTsKKworCWlmICgoY2gtPmNoX3N0YXJ0YyA9PSBfUE9TSVhfVkRJU0FCTEUpIHx8CisJICAgIChjaC0+Y2hfc3RvcGMgPT0gX1BPU0lYX1ZESVNBQkxFKSkgeworCQlpZmxhZyAmPSB+KElYT04gfCBJWE9GRik7CisJCWNoLT5jaF9jX2lmbGFnICY9IH4oSVhPTiB8IElYT0ZGKTsKKwl9CisKKwkvKgorCSAqIE9ubHkgdGhlIElCTSBYciBjYXJkIGNhbiBzd2l0Y2ggYmV0d2VlbgorCSAqIDIzMiBhbmQgNDIyIG1vZGVzIG9uIHRoZSBmbHkKKwkgKi8KKwlpZiAoYmQtPmRldmljZSA9PSBQQ0lfREVWX1hSX0lCTV9ESUQpIHsKKwkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJXzQyMikKKwkJCWRnYXBfY21kYihjaCwgU0NPTU1PREUsIE1PREVfNDIyLCAwLCAwKTsKKwkJZWxzZQorCQkJZGdhcF9jbWRiKGNoLCBTQ09NTU9ERSwgTU9ERV8yMzIsIDAsIDApOworCX0KKworCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pCisJCWlmbGFnIHw9IElBTFRQSU47CisKKwlpZiAoaWZsYWcgIT0gY2gtPmNoX2ZlcGlmbGFnKSB7CisJCWNoLT5jaF9mZXBpZmxhZyA9IGlmbGFnOworCisJCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLworCQlkZ2FwX2NtZHcoY2gsIFNJRkxBRywgKHUxNikgY2gtPmNoX2ZlcGlmbGFnLCAwKTsKKwl9CisKKwkvKgorCSAqIFNlbGVjdCBoYXJkd2FyZSBoYW5kc2hha2luZy4KKwkgKi8KKwloZmxvdyA9IDA7CisKKwlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKQorCQloZmxvdyB8PSAoRF9SVFMoY2gpIHwgRF9DVFMoY2gpKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIFJUU1BBQ0UpCisJCWhmbG93IHw9IERfUlRTKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERUUlBBQ0UpCisJCWhmbG93IHw9IERfRFRSKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UpCisJCWhmbG93IHw9IERfQ1RTKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERTUlBBQ0UpCisJCWhmbG93IHw9IERfRFNSKGNoKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERDRFBBQ0UpCisJCWhmbG93IHw9IERfQ0QoY2gpOworCisJaWYgKGhmbG93ICE9IGNoLT5jaF9oZmxvdykgeworCQljaC0+Y2hfaGZsb3cgPSBoZmxvdzsKKworCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KKwkJZGdhcF9jbWRiKGNoLCBTSEZMT1csICh1Y2hhcikgaGZsb3csIDB4ZmYsIDApOworCX0KKworCisJLyoKKwkgKiBTZXQgUlRTIGFuZC9vciBEVFIgVG9nZ2xlIGlmIG5lZWRlZCwKKwkgKiBidXQgb25seSBpZiBwcm9kdWN0IGlzIEZFUDUrIGJhc2VkLgorCSAqLworCWlmIChiZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykgeworCQl1MTYgaGZsb3cyID0gMDsKKwkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX1JUU19UT0dHTEUpCisJCQloZmxvdzIgfD0gKERfUlRTKGNoKSk7CisJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9EVFJfVE9HR0xFKQorCQkJaGZsb3cyIHw9IChEX0RUUihjaCkpOworCisJCWRnYXBfY21kd19leHQoY2gsIDB4ZmYwMywgaGZsb3cyLCAwKTsKKwl9CisKKwkvKgorCSAqIFNldCBtb2RlbSBjb250cm9sIGxpbmVzLgorCSAqLworCisJbXZhbCBePSBjaC0+Y2hfbWZvcmNlICYgKG12YWwgXiBjaC0+Y2hfbXZhbCk7CisKKwlpZiAoY2gtPmNoX21vc3RhdCBeIG12YWwpIHsKKwkJY2gtPmNoX21vc3RhdCA9IG12YWw7CisKKwkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCisJCWRnYXBfY21kYihjaCwgU01PREVNLCAodWNoYXIpIG12YWwsIERfUlRTKGNoKXxEX0RUUihjaCksIDApOworCX0KKworCS8qCisJICogUmVhZCBtb2RlbSBzaWduYWxzLCBhbmQgdGhlbiBjYWxsIGNhcnJpZXIgZnVuY3Rpb24uCisJICovCisJY2gtPmNoX21pc3RhdCA9IHJlYWRiKCYoYnMtPm1fc3RhdCkpOworCWRnYXBfY2FycmllcihjaCk7CisKKwkvKgorCSAqIFNldCB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KKwkgKi8KKwlpZiAoY2gtPmNoX3N0YXJ0YyAhPSBjaC0+Y2hfZmVwc3RhcnRjIHx8CisJICAgIGNoLT5jaF9zdG9wYyAhPSBjaC0+Y2hfZmVwc3RvcGMpIHsKKwkJY2gtPmNoX2ZlcHN0YXJ0YyA9IGNoLT5jaF9zdGFydGM7CisJCWNoLT5jaF9mZXBzdG9wYyA9ICBjaC0+Y2hfc3RvcGM7CisKKwkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCisJCWRnYXBfY21kYihjaCwgU0ZMT1dDLCBjaC0+Y2hfZmVwc3RhcnRjLCBjaC0+Y2hfZmVwc3RvcGMsIDApOworCX0KKworCS8qCisJICogU2V0IHRoZSBBdXhpbGlhcnkgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KKwkgKi8KKwlpZiAoY2gtPmNoX2FzdGFydGMgIT0gY2gtPmNoX2ZlcGFzdGFydGMgfHwKKwkgICAgY2gtPmNoX2FzdG9wYyAhPSBjaC0+Y2hfZmVwYXN0b3BjKSB7CisJCWNoLT5jaF9mZXBhc3RhcnRjID0gY2gtPmNoX2FzdGFydGM7CisJCWNoLT5jaF9mZXBhc3RvcGMgPSBjaC0+Y2hfYXN0b3BjOworCisJCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLworCQlkZ2FwX2NtZGIoY2gsIFNBRkxPV0MsIGNoLT5jaF9mZXBhc3RhcnRjLCBjaC0+Y2hfZmVwYXN0b3BjLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRnYXBfcGFyaXR5X3NjYW4oKQorICoKKyAqIENvbnZlcnQgdGhlIEZFUDUgd2F5IG9mIHJlcG9ydGluZyBwYXJpdHkgZXJyb3JzIGFuZCBicmVha3MgaW50bworICogdGhlIExpbnV4IGxpbmUgZGlzY2lwbGluZSB3YXkuCisgKi8KK3N0YXRpYyB2b2lkIGRnYXBfcGFyaXR5X3NjYW4oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGNoYXIgKmNidWYsCisJCQkJdW5zaWduZWQgY2hhciAqZmJ1ZiwgaW50ICpsZW4pCit7CisJaW50IGwgPSAqbGVuOworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgY2hhciAqaW4sICpjb3V0LCAqZm91dDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlpbiA9IGNidWY7CisJY291dCA9IGNidWY7CisJZm91dCA9IGZidWY7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCXdoaWxlIChsLS0pIHsKKwkJYyA9ICppbisrOworCQlzd2l0Y2ggKGNoLT5wc2Nhbl9zdGF0ZSkgeworCQlkZWZhdWx0OgorCQkJLyogcmVzZXQgdG8gc2FuaXR5IGFuZCBmYWxsIHRocm91Z2ggKi8KKwkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7CisKKwkJY2FzZSAwOgorCQkJLyogTm8gRkYgc2VlbiB5ZXQgKi8KKwkJCWlmIChjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpCisJCQkJLyogZGVsZXRlIHRoaXMgY2hhcmFjdGVyIGZyb20gc3RyZWFtICovCisJCQkJY2gtPnBzY2FuX3N0YXRlID0gMTsKKwkJCWVsc2UgeworCQkJCSpjb3V0KysgPSBjOworCQkJCSpmb3V0KysgPSBUVFlfTk9STUFMOworCQkJCWNvdW50ICs9IDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQkvKiBmaXJzdCBGRiBzZWVuICovCisJCQlpZiAoYyA9PSAodW5zaWduZWQgY2hhcikgJ1wzNzcnKSB7CisJCQkJLyogZG91YmxlZCBmZiwgdHJhbnNmb3JtIHRvIHNpbmdsZSBmZiAqLworCQkJCSpjb3V0KysgPSBjOworCQkJCSpmb3V0KysgPSBUVFlfTk9STUFMOworCQkJCWNvdW50ICs9IDE7CisJCQkJY2gtPnBzY2FuX3N0YXRlID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2F2ZSB2YWx1ZSBleGFtaW5hdGlvbiBpbiBuZXh0IHN0YXRlICovCisJCQkJY2gtPnBzY2FuX3NhdmVjaGFyID0gYzsKKwkJCQljaC0+cHNjYW5fc3RhdGUgPSAyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJLyogdGhpcmQgY2hhcmFjdGVyIG9mIGZmIHNlcXVlbmNlICovCisKKwkJCSpjb3V0KysgPSBjOworCisJCQlpZiAoY2gtPnBzY2FuX3NhdmVjaGFyID09IDB4MCkgeworCisJCQkJaWYgKGMgPT0gMHgwKSB7CisJCQkJCWNoLT5jaF9lcnJfYnJlYWsrKzsKKwkJCQkJKmZvdXQrKyA9IFRUWV9CUkVBSzsKKwkJCQl9IGVsc2UgeworCQkJCQljaC0+Y2hfZXJyX3Bhcml0eSsrOworCQkJCQkqZm91dCsrID0gVFRZX1BBUklUWTsKKwkJCQl9CisJCQl9CisKKwkJCWNvdW50ICs9IDE7CisJCQljaC0+cHNjYW5fc3RhdGUgPSAwOworCQl9CisJfQorCSpsZW4gPSBjb3VudDsKK30KKworc3RhdGljIHZvaWQgZGdhcF93cml0ZV93YWtldXAoc3RydWN0IGJvYXJkX3QgKmJkLCBzdHJ1Y3QgY2hhbm5lbF90ICpjaCwKKwkJCSAgICAgIHN0cnVjdCB1bl90ICp1biwgdTMyIG1hc2ssCisJCQkgICAgICB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MxLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzMikKK3sKKwlpZiAoISh1bi0+dW5fZmxhZ3MgJiBtYXNrKSkKKwkJcmV0dXJuOworCisJdW4tPnVuX2ZsYWdzICY9IH5tYXNrOworCisJaWYgKCEodW4tPnVuX2ZsYWdzICYgVU5fSVNPUEVOKSkKKwkJcmV0dXJuOworCisJaWYgKCh1bi0+dW5fdHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgorCSAgICB1bi0+dW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssICppcnFfZmxhZ3MyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssICppcnFfZmxhZ3MxKTsKKworCQkodW4tPnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKSh1bi0+dW5fdHR5KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmJkX2xvY2ssICppcnFfZmxhZ3MxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCAqaXJxX2ZsYWdzMik7CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdW4tPnVuX3R0eS0+d3JpdGVfd2FpdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1bi0+dW5fZmxhZ3Nfd2FpdCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgICAgIGRnYXBfZXZlbnQgLSBGRVAgdG8gaG9zdCBldmVudCBwcm9jZXNzaW5nIHJvdXRpbmUuCisgKgorICogICAgICAgICAgICAgIGJkICAgICAtIEJvYXJkIG9mIGN1cnJlbnQgZXZlbnQuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IGRnYXBfZXZlbnQoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXVsb25nCQlsb2NrX2ZsYWdzOworCXVsb25nCQlsb2NrX2ZsYWdzMjsKKwlzdHJ1Y3QgYnNfdAkqYnM7CisJdWNoYXIJCSpldmVudDsKKwl1Y2hhcgkJKnZhZGRyID0gTlVMTDsKKwlzdHJ1Y3QgZXZfdAkqZWFkZHIgPSBOVUxMOworCXVpbnQJCWhlYWQ7CisJdWludAkJdGFpbDsKKwlpbnQJCXBvcnQ7CisJaW50CQlyZWFzb247CisJaW50CQltb2RlbTsKKwlpbnQJCWIxOworCisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIC1FTlhJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisKKwl2YWRkciA9IGJkLT5yZV9tYXBfbWVtYmFzZTsKKworCWlmICghdmFkZHIpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKKworCS8qIEdldCBvdXIgaGVhZCBhbmQgdGFpbCAqLworCWhlYWQgPSByZWFkdygmKGVhZGRyLT5ldl9oZWFkKSk7CisJdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKKworCS8qCisJICogRm9yZ2V0IGl0IGlmIHBvaW50ZXJzIG91dCBvZiByYW5nZS4KKwkgKi8KKworCWlmIChoZWFkID49IEVWTUFYIC0gRVZTVEFSVCB8fCB0YWlsID49IEVWTUFYIC0gRVZTVEFSVCB8fAorCSAgICAoaGVhZCB8IHRhaWwpICYgMDMpIHsKKwkJLyogTGV0IGdvIG9mIGJvYXJkIGxvY2sgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJICogTG9vcCB0byBwcm9jZXNzIGFsbCB0aGUgZXZlbnRzIGluIHRoZSBidWZmZXIuCisJICovCisJd2hpbGUgKHRhaWwgIT0gaGVhZCkgeworCisJCS8qCisJCSAqIEdldCBpbnRlcnJ1cHQgaW5mb3JtYXRpb24uCisJCSAqLworCisJCWV2ZW50ID0gYmQtPnJlX21hcF9tZW1iYXNlICsgdGFpbCArIEVWU1RBUlQ7CisKKwkJcG9ydCAgID0gZXZlbnRbMF07CisJCXJlYXNvbiA9IGV2ZW50WzFdOworCQltb2RlbSAgPSBldmVudFsyXTsKKwkJYjEgICAgID0gZXZlbnRbM107CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBpbnRlcnJ1cHQgaXMgdmFsaWQuCisJCSAqLworCQlpZiAocG9ydCA+PSBiZC0+bmFzeW5jKQorCQkJZ290byBuZXh0OworCisJCWlmICghKHJlYXNvbiAmIChJRk1PREVNIHwgSUZCUkVBSyB8IElGVExXIHwgSUZURU0gfCBJRkRBVEEpKSkKKwkJCWdvdG8gbmV4dDsKKworCQljaCA9IGJkLT5jaGFubmVsc1twb3J0XTsKKworCQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCQlnb3RvIG5leHQ7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBtYWRlIGl0IGhlcmUsIHRoZSBldmVudCB3YXMgdmFsaWQuCisJCSAqIExvY2sgZG93biB0aGUgY2hhbm5lbC4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOworCisJCWJzID0gY2gtPmNoX2JzOworCisJCWlmICghYnMpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQkvKgorCQkgKiBQcm9jZXNzIHJlY2VpdmVkIGRhdGEuCisJCSAqLworCQlpZiAocmVhc29uICYgSUZEQVRBKSB7CisKKwkJCS8qCisJCQkgKiBBTEwgTE9DS1MgKk1VU1QqIEJFIERST1BQRUQgQkVGT1JFIENBTExJTkcgSU5QVVQhCisJCQkgKiBpbnB1dCBjb3VsZCBzZW5kIHNvbWUgZGF0YSB0byBsZCwgd2hpY2ggaW4gdHVybgorCQkJICogY291bGQgZG8gYSBjYWxsYmFjayB0byBvbmUgb2Ygb3VyIG90aGVyIGZ1bmN0aW9ucy4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQkJZGdhcF9pbnB1dChjaCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKKworCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1JBQ1RJVkUpCisJCQkJY2gtPmNoX2ZsYWdzIHw9IENIX1JFTkFCTEU7CisJCQllbHNlCisJCQkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7CisKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9SV0FJVCkgeworCQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUldBSVQ7CisKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUKKwkJCQkJKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBNb2RlbSBjaGFuZ2Ugc2lnbmFscy4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRk1PREVNKSB7CisJCQljaC0+Y2hfbWlzdGF0ID0gbW9kZW07CisJCQlkZ2FwX2NhcnJpZXIoY2gpOworCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBicmVhay4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRkJSRUFLKSB7CisKKwkJCWlmIChjaC0+Y2hfdHVuLnVuX3R0eSkgeworCQkJCS8qIEEgYnJlYWsgaGFzIGJlZW4gaW5kaWNhdGVkICovCisJCQkJY2gtPmNoX2Vycl9icmVhaysrOworCQkJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tCisJCQkJCShjaC0+Y2hfdHVuLnVuX3R0eS0+cG9ydCwgMSk7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoY2gtPmNoX3R1bi51bl90dHktPnBvcnQsCisJCQkJCQkgICAgIDAsIFRUWV9CUkVBSyk7CisJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goY2gtPmNoX3R1bi51bl90dHktPnBvcnQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBUcmFuc21pdCBsb3cuCisJCSAqLworCQlpZiAocmVhc29uICYgSUZUTFcpIHsKKwkJCWRnYXBfd3JpdGVfd2FrZXVwKGJkLCBjaCwgJmNoLT5jaF90dW4sIFVOX0xPVywKKwkJCQkJICAmbG9ja19mbGFncywgJmxvY2tfZmxhZ3MyKTsKKwkJCWRnYXBfd3JpdGVfd2FrZXVwKGJkLCBjaCwgJmNoLT5jaF9wdW4sIFVOX0xPVywKKwkJCQkJICAmbG9ja19mbGFncywgJmxvY2tfZmxhZ3MyKTsKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9XTE9XKSB7CisJCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9XTE9XOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUHJvY2VzcyBUcmFuc21pdCBlbXB0eS4KKwkJICovCisJCWlmIChyZWFzb24gJiBJRlRFTSkgeworCQkJZGdhcF93cml0ZV93YWtldXAoYmQsIGNoLCAmY2gtPmNoX3R1biwgVU5fRU1QVFksCisJCQkJCSAgJmxvY2tfZmxhZ3MsICZsb2NrX2ZsYWdzMik7CisJCQlkZ2FwX3dyaXRlX3dha2V1cChiZCwgY2gsICZjaC0+Y2hfcHVuLCBVTl9FTVBUWSwKKwkJCQkJICAmbG9ja19mbGFncywgJmxvY2tfZmxhZ3MyKTsKKwkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9XRU1QVFkpIHsKKwkJCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1dFTVBUWTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7CisKK25leHQ6CisJCXRhaWwgPSAodGFpbCArIDQpICYgKEVWTUFYIC0gRVZTVEFSVCAtIDQpOworCX0KKworCXdyaXRldyh0YWlsLCAmKGVhZGRyLT5ldl90YWlsKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIERHX1BBUlQpOworfQorc3RhdGljIERSSVZFUl9BVFRSKHZlcnNpb24sIFNfSVJVU1IsIGRnYXBfZHJpdmVyX3ZlcnNpb25fc2hvdywgTlVMTCk7CisKKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfYm9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBkZ2FwX051bUJvYXJkcyk7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIoYm9hcmRzLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl9ib2FyZHNfc2hvdywgTlVMTCk7CisKKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfbWF4Ym9hcmRzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBNQVhCT0FSRFMpOworfQorc3RhdGljIERSSVZFUl9BVFRSKG1heGJvYXJkcywgU19JUlVTUiwgZGdhcF9kcml2ZXJfbWF4Ym9hcmRzX3Nob3csIE5VTEwpOworCisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3BvbGxjb3VudGVyX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwKKwkJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGRnYXBfcG9sbF9jb3VudGVyKTsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihwb2xsY291bnRlciwgU19JUlVTUiwgZGdhcF9kcml2ZXJfcG9sbGNvdW50ZXJfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3BvbGxyYXRlX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkbXNcbiIsIGRnYXBfcG9sbF90aWNrKTsKK30KKworc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwKKwkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkXG4iLCAmZGdhcF9wb2xsX3RpY2spICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihwb2xscmF0ZSwgKFNfSVJVU1IgfCBTX0lXVVNSKSwgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc2hvdywKKwkJICAgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUpOworCitzdGF0aWMgaW50IGRnYXBfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcyhzdHJ1Y3QgcGNpX2RyaXZlciAqZGdhcF9kcml2ZXIpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmZGdhcF9kcml2ZXItPmRyaXZlcjsKKworCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOworCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2JvYXJkcyk7CisJcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4Ym9hcmRzKTsKKwlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7CisJcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbGNvdW50ZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKmRnYXBfZHJpdmVyKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZkZ2FwX2RyaXZlci0+ZHJpdmVyOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2JvYXJkcyk7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4Ym9hcmRzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbGNvdW50ZXIpOworfQorCitzdGF0aWMgc3RydWN0IGJvYXJkX3QgKmRnYXBfdmVyaWZ5X2JvYXJkKHN0cnVjdCBkZXZpY2UgKnApCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKworCWJkID0gZGV2X2dldF9kcnZkYXRhKHApOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMgfHwgYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBiZDsKK30KKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgeworCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkiJWQgJXNcbiIsIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwKKwkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfb3Blbl9jb3VudCA/ICJPcGVuIiA6ICJDbG9zZWQiKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX3N0YXRlLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3N0YXRlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7CisJCWNvdW50ICs9ICBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlZFxuIiwKKwkJCQkgICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICAgYmQtPmNoYW5uZWxzW2ldLT5jaF9iYXVkX2luZm8pOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfYmF1ZCwgU19JUlVTUiwgZGdhcF9wb3J0c19iYXVkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX21zaWduYWxzX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgeworCQlpZiAoYmQtPmNoYW5uZWxzW2ldLT5jaF9vcGVuX2NvdW50KQorCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCSIlZCAlcyAlcyAlcyAlcyAlcyAlc1xuIiwKKwkJCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbW9zdGF0ICYKKwkJCQkgVUFSVF9NQ1JfUlRTKSA/ICJSVFMiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfQ1RTKSA/ICJDVFMiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbW9zdGF0ICYKKwkJCQkgVUFSVF9NQ1JfRFRSKSA/ICJEVFIiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfRFNSKSA/ICJEU1IiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfRENEKSA/ICJEQ0QiIDogIiIsCisJCQkJKGJkLT5jaGFubmVsc1tpXS0+Y2hfbWlzdGF0ICYKKwkJCQkgVUFSVF9NU1JfUkkpICA/ICJSSSIgIDogIiIpOworCQllbHNlCisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJIiVkXG4iLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0pOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfbXNpZ25hbHMsIFNfSVJVU1IsIGRnYXBfcG9ydHNfbXNpZ25hbHNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2lmbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfaWZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfaWZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2NmbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfY2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfY2ZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX29mbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfb2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfb2ZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCWludCBjb3VudCA9IDA7CisJaW50IGkgPSAwOworCisJYmQgPSBkZ2FwX3ZlcmlmeV9ib2FyZChwKTsKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX2xmbGFnKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfbGZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfbGZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKQorCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKKwkJCQkgIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwKKwkJCQkgIGJkLT5jaGFubmVsc1tpXS0+Y2hfZGlnaS5kaWdpX2ZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfZGlnaV9mbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2RpZ2lfZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisKKwliZCA9IGRnYXBfdmVyaWZ5X2JvYXJkKHApOworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJWxkXG4iLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAorCQkJCSAgYmQtPmNoYW5uZWxzW2ldLT5jaF9yeGNvdW50KTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfcnhjb3VudCwgU19JUlVTUiwgZGdhcF9wb3J0c19yeGNvdW50X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3R4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlpbnQgY291bnQgPSAwOworCWludCBpID0gMDsKKworCWJkID0gZGdhcF92ZXJpZnlfYm9hcmQocCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKQorCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlbGRcbiIsCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sCisJCQkJICBiZC0+Y2hhbm5lbHNbaV0tPmNoX3R4Y291bnQpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0c190eGNvdW50LCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3R4Y291bnRfc2hvdywgTlVMTCk7CisKKy8qIHRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgc3lzIGZpbGVzIHRoYXQgd2lsbCBleHBvcnQgZWFjaCBzaWduYWwgc3RhdHVzCisgKiB0byBzeXNmcyBlYWNoIHZhbHVlIHdpbGwgYmUgcHV0IGluIGEgc2VwYXJhdGUgZmlsZW5hbWUKKyAqLworc3RhdGljIHZvaWQgZGdhcF9jcmVhdGVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmYmQtPnBkZXYtPmRldiwgYmQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfc3RhdGUpOworCWRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfYmF1ZCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19tc2lnbmFscyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19pZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19jZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19vZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19sZmxhZyk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19kaWdpX2ZsYWcpOworCWRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfcnhjb3VudCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c190eGNvdW50KTsKK30KKworLyogcmVtb3ZlcyBhbGwgdGhlIHN5cyBmaWxlcyBjcmVhdGVkIGZvciB0aGF0IHBvcnQgKi8KK3N0YXRpYyB2b2lkIGRnYXBfcmVtb3ZlX3BvcnRzX3N5c2ZpbGVzKHN0cnVjdCBib2FyZF90ICpiZCkKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3N0YXRlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2JhdWQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfbXNpZ25hbHMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfaWZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfY2ZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfb2ZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfbGZsYWcpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfZGlnaV9mbGFnKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3J4Y291bnQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfdHhjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMiLCB1bi0+dW5fb3Blbl9jb3VudCA/CisJCQkiT3BlbiIgOiAiQ2xvc2VkIik7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVU1IsIGRnYXBfdHR5X3N0YXRlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9iYXVkX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjaC0+Y2hfYmF1ZF9pbmZvKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihiYXVkLCBTX0lSVVNSLCBkZ2FwX3R0eV9iYXVkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisKKwlpZiAoIWQpCisJCXJldHVybiAwOworCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJY2ggPSB1bi0+dW5fY2g7CisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQorCQlyZXR1cm4gMDsKKwliZCA9IGNoLT5jaF9iZDsKKwlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQorCQlyZXR1cm4gMDsKKwlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQorCQlyZXR1cm4gMDsKKworCWlmIChjaC0+Y2hfb3Blbl9jb3VudCkgeworCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyAlcyAlcyAlcyAlcyAlc1xuIiwKKwkJCShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfUlRTKSA/ICJSVFMiIDogIiIsCisJCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0NUUykgPyAiQ1RTIiA6ICIiLAorCQkJKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9EVFIpID8gIkRUUiIgOiAiIiwKKwkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRFNSKSA/ICJEU1IiIDogIiIsCisJCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RDRCkgPyAiRENEIiA6ICIiLAorCQkJKGNoLT5jaF9taXN0YXQgJiBVQVJUX01TUl9SSSkgID8gIlJJIiAgOiAiIik7CisJfQorCXJldHVybiAwOworfQorc3RhdGljIERFVklDRV9BVFRSKG1zaWduYWxzLCBTX0lSVVNSLCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfaWZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKGlmbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9pZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfY2ZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNmbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9jZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2Nfb2ZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKG9mbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9vZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2NfbGZsYWcpOworfQorc3RhdGljIERFVklDRV9BVFRSKGxmbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9sZmxhZ19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZGlnaV9mbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9kaWdpX2ZsYWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGJvYXJkX3QgKmJkOworCXN0cnVjdCBjaGFubmVsX3QgKmNoOworCXN0cnVjdCB1bl90ICp1bjsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBjaC0+Y2hfcnhjb3VudCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocnhjb3VudCwgU19JUlVTUiwgZGdhcF90dHlfcnhjb3VudF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGdhcF90dHlfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9hcmRfdCAqYmQ7CisJc3RydWN0IGNoYW5uZWxfdCAqY2g7CisJc3RydWN0IHVuX3QgKnVuOworCisJaWYgKCFkKQorCQlyZXR1cm4gMDsKKwl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCisJCXJldHVybiAwOworCWNoID0gdW4tPnVuX2NoOworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuIDA7CisJYmQgPSBjaC0+Y2hfYmQ7CisJaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKKwkJcmV0dXJuIDA7CisJaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGNoLT5jaF90eGNvdW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih0eGNvdW50LCBTX0lSVVNSLCBkZ2FwX3R0eV90eGNvdW50X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBib2FyZF90ICpiZDsKKwlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKKwlzdHJ1Y3QgdW5fdCAqdW47CisJaW50CWNuOworCWludAlibjsKKwlzdHJ1Y3QgY25vZGUgKmNwdHIgPSBOVUxMOworCWludCBmb3VuZCA9IEZBTFNFOworCWludCBuY291bnQgPSAwOworCWludCBzdGFydG8gPSAwOworCWludCBpID0gMDsKKworCWlmICghZCkKKwkJcmV0dXJuIDA7CisJdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQorCQlyZXR1cm4gMDsKKwljaCA9IHVuLT51bl9jaDsKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybiAwOworCWJkID0gY2gtPmNoX2JkOworCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCisJCXJldHVybiAwOworCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCisJCXJldHVybiAwOworCisJYm4gPSBiZC0+Ym9hcmRudW07CisJY24gPSBjaC0+Y2hfcG9ydG51bTsKKworCWZvciAoY3B0ciA9IGJkLT5iZF9jb25maWc7IGNwdHI7IGNwdHIgPSBjcHRyLT5uZXh0KSB7CisKKwkJaWYgKChjcHRyLT50eXBlID09IEJOT0RFKSAmJgorCQkgICAgKChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQyXzkyMFApIHx8CisJCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDRfOTIwUCkgfHwKKwkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUOF85MjBQKSB8fAorCQkgICAgIChjcHRyLT51LmJvYXJkLnR5cGUgPT0gUEFQT1JUNCkgfHwKKwkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IFBBUE9SVDgpKSkgeworCisJCQlmb3VuZCA9IFRSVUU7CisJCQlpZiAoY3B0ci0+dS5ib2FyZC52X3N0YXJ0KQorCQkJCXN0YXJ0byA9IGNwdHItPnUuYm9hcmQuc3RhcnQ7CisJCQllbHNlCisJCQkJc3RhcnRvID0gMTsKKwkJfQorCisJCWlmIChjcHRyLT50eXBlID09IFROT0RFICYmIGZvdW5kID09IFRSVUUpIHsKKwkJCWNoYXIgKnB0cjE7CisJCQlpZiAoc3Ryc3RyKGNwdHItPnUudHR5bmFtZSwgInR0eSIpKSB7CisJCQkJcHRyMSA9IGNwdHItPnUudHR5bmFtZTsKKwkJCQlwdHIxICs9IDM7CisJCQl9IGVsc2UKKwkJCQlwdHIxID0gY3B0ci0+dS50dHluYW1lOworCisJCQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9jb25maWdfZ2V0X251bV9wcnRzKGJkKTsgaSsrKSB7CisJCQkJaWYgKGNuICE9IGkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMlcyUwMmRcbiIsCisJCQkJCQkodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgPworCQkJCQkJICJwciIgOiAidHR5IiwKKwkJCQkJCXB0cjEsIGkgKyBzdGFydG8pOworCQkJfQorCQl9CisKKwkJaWYgKGNwdHItPnR5cGUgPT0gQ05PREUpIHsKKworCQkJZm9yIChpID0gMDsgaSA8IGNwdHItPnUuY29uYy5ucG9ydDsgaSsrKSB7CisJCQkJaWYgKGNuICE9IChpICsgbmNvdW50KSkKKwkJCQkJY29udGludWU7CisKKwkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAybGRcbiIsCisJCQkJCQkodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgPworCQkJCQkJICJwciIgOiAidHR5IiwKKwkJCQkJCWNwdHItPnUuY29uYy5pZCwKKwkJCQkJCWkgKyAoY3B0ci0+dS5jb25jLnZfc3RhcnQgPworCQkJCQkJICAgICBjcHRyLT51LmNvbmMuc3RhcnQgOiAxKSk7CisJCQl9CisKKwkJCW5jb3VudCArPSBjcHRyLT51LmNvbmMubnBvcnQ7CisJCX0KKworCQlpZiAoY3B0ci0+dHlwZSA9PSBNTk9ERSkgeworCisJCQlmb3IgKGkgPSAwOyBpIDwgY3B0ci0+dS5tb2R1bGUubnBvcnQ7IGkrKykgeworCQkJCWlmIChjbiAhPSAoaSArIG5jb3VudCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMlcyUwMmxkXG4iLAorCQkJCQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8KKwkJCQkJCSAicHIiIDogInR0eSIsCisJCQkJCQljcHRyLT51Lm1vZHVsZS5pZCwKKwkJCQkJCWkgKyAoY3B0ci0+dS5tb2R1bGUudl9zdGFydCA/CisJCQkJCQkgICAgIGNwdHItPnUubW9kdWxlLnN0YXJ0IDogMSkpOworCQkJfQorCisJCQluY291bnQgKz0gY3B0ci0+dS5tb2R1bGUubnBvcnQ7CisKKwkJfQorCX0KKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzX2RnYXBfJWRfJWRcbiIsCisJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/ICJwciIgOiAidHR5IiwgYm4sIGNuKTsKKworfQorc3RhdGljIERFVklDRV9BVFRSKGN1c3RvbV9uYW1lLCBTX0lSVVNSLCBkZ2FwX3R0eV9uYW1lX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGdhcF9zeXNmc190dHlfZW50cmllc1tdID0geworCSZkZXZfYXR0cl9zdGF0ZS5hdHRyLAorCSZkZXZfYXR0cl9iYXVkLmF0dHIsCisJJmRldl9hdHRyX21zaWduYWxzLmF0dHIsCisJJmRldl9hdHRyX2lmbGFnLmF0dHIsCisJJmRldl9hdHRyX2NmbGFnLmF0dHIsCisJJmRldl9hdHRyX29mbGFnLmF0dHIsCisJJmRldl9hdHRyX2xmbGFnLmF0dHIsCisJJmRldl9hdHRyX2RpZ2lfZmxhZy5hdHRyLAorCSZkZXZfYXR0cl9yeGNvdW50LmF0dHIsCisJJmRldl9hdHRyX3R4Y291bnQuYXR0ciwKKwkmZGV2X2F0dHJfY3VzdG9tX25hbWUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBOVUxMLAorCS5hdHRycyA9IGRnYXBfc3lzZnNfdHR5X2VudHJpZXMsCit9OworCitzdGF0aWMgdm9pZCBkZ2FwX2NyZWF0ZV90dHlfc3lzZnMoc3RydWN0IHVuX3QgKnVuLCBzdHJ1Y3QgZGV2aWNlICpjKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmMtPmtvYmosICZkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChyZXQpCisJCXJldHVybjsKKworCWRldl9zZXRfZHJ2ZGF0YShjLCB1bik7CisKK30KKworc3RhdGljIHZvaWQgZGdhcF9yZW1vdmVfdHR5X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmMpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjLT5rb2JqLCAmZGdhcF90dHlfYXR0cmlidXRlX2dyb3VwKTsKK30KKworLyoKKyAqIFBhcnNlIGEgY29uZmlndXJhdGlvbiBmaWxlIHJlYWQgaW50byBtZW1vcnkgYXMgYSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbnQJZGdhcF9wYXJzZWZpbGUoY2hhciAqKmluLCBpbnQgUmVtb3ZlKQoreworCXN0cnVjdCBjbm9kZSAqcCwgKmJyZCwgKmxpbmUsICpjb25jOworCWludAlyYzsKKwljaGFyCSpzID0gTlVMTDsKKwlpbnQJbGluZWNudCA9IDA7CisKKwlwID0gJmRnYXBfaGVhZDsKKwlicmQgPSBsaW5lID0gY29uYyA9IE5VTEw7CisKKwkvKiBwZXJoYXBzIHdlIGFyZSBhZGRpbmcgdG8gYW4gZXhpc3RpbmcgbGlzdD8gKi8KKwl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKQorCQlwID0gcC0+bmV4dDsKKworCS8qIGZpbGUgbXVzdCBzdGFydCB3aXRoIGEgQkVHSU4gKi8KKwl3aGlsZSAoKHJjID0gZGdhcF9nZXR0b2soaW4sIHApKSAhPSBCRUdJTikgeworCQlpZiAocmMgPT0gMCkgeworCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRU9GIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlmb3IgKDsgOykgeworCQlyYyA9IGRnYXBfZ2V0dG9rKGluLCBwKTsKKwkJaWYgKHJjID09IDApIHsKKwkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIEVPRiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJc3dpdGNoIChyYykgeworCQljYXNlIDA6CisJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJcmV0dXJuIC0xOworCisJCWNhc2UgQkVHSU46CS8qIHNob3VsZCBvbmx5IGJlIDEgYmVnaW4gKi8KKwkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGNvbmZpZ19iZWdpblxuIik7CisJCQlyZXR1cm4gLTE7CisKKwkJY2FzZSBFTkQ6CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEJPQVJEOgkvKiBib2FyZCBpbmZvICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShCTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCisJCQlwLT51LmJvYXJkLnN0YXR1cyA9IGRnYXBfc2F2ZXN0cmluZygiTm8iKTsKKwkJCWxpbmUgPSBjb25jID0gTlVMTDsKKwkJCWJyZCA9IHA7CisJCQlsaW5lY250ID0gLTE7CisJCQlicmVhazsKKworCQljYXNlIEFQT1JUMl85MjBQOgkvKiBBY2NlbGVQb3J0XzQgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV8ycl85MjAgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQyXzkyMFA7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIEFQT1JUNF85MjBQOgkvKiBBY2NlbGVQb3J0XzQgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV80cl85MjAgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQ0XzkyMFA7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIEFQT1JUOF85MjBQOgkvKiBBY2NlbGVQb3J0XzggKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV84cl85MjAgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQ4XzkyMFA7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBBUE9SVDQ6CS8qIEFjY2VsZVBvcnRfNCBQQ0kgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV80cihQQ0kpIHN0cmluZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudHlwZSA9IFBBUE9SVDQ7CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBBUE9SVDg6CS8qIEFjY2VsZVBvcnRfOCBQQ0kgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV84ciBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnR5cGUgPSBQQVBPUlQ4OworCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQ1g6CS8qIFBDSSBDL1ggKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV9DL1hfKFBDSSkgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gUENYOworCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOworCQkJcC0+dS5ib2FyZC5jb25jMSA9IDA7CisJCQlwLT51LmJvYXJkLmNvbmMyID0gMDsKKwkJCXAtPnUuYm9hcmQubW9kdWxlMSA9IDA7CisJCQlwLT51LmJvYXJkLm1vZHVsZTIgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBQRVBDOgkvKiBQQ0kgRVBDL1ggKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgXCJEaWdpX0VQQy9YXyhQQ0kpXCIgc3RyaW5nIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC50eXBlID0gUEVQQzsKKwkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKKwkJCXAtPnUuYm9hcmQuY29uYzEgPSAwOworCQkJcC0+dS5ib2FyZC5jb25jMiA9IDA7CisJCQlwLT51LmJvYXJkLm1vZHVsZTEgPSAwOworCQkJcC0+dS5ib2FyZC5tb2R1bGUyID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBDTToJLyogUENJL1hlbSAqLworCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBQQ0kvWGVtIHN0cmluZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudHlwZSA9IFBQQ007CisJCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7CisJCQlwLT51LmJvYXJkLmNvbmMxID0gMDsKKwkJCXAtPnUuYm9hcmQuY29uYzIgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTzoJLyogaS9vIHBvcnQgKi8KKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoIklPIHBvcnQgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnBvcnRzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5ib2FyZC5wb3J0KSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBJTyBwb3J0Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC52X3BvcnQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRU06CS8qIG1lbW9yeSBhZGRyZXNzICovCisJCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgeworCQkJCWRnYXBfZXJyKCJtZW1vcnkgYWRkcmVzcyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQuYWRkcnN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCWlmIChrc3RydG91bChzLCAwLCAmcC0+dS5ib2FyZC5hZGRyKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBtZW1vcnkgYWRkcmVzcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudl9hZGRyID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUENJSU5GTzoJLyogcGNpIGluZm9ybWF0aW9uICovCisJCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgeworCQkJCWRnYXBfZXJyKCJtZW1vcnkgYWRkcmVzcyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQucGNpYnVzc3RyID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKGtzdHJ0b3VsKHMsIDAsICZwLT51LmJvYXJkLnBjaWJ1cykpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgcGNpIGJ1cyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQudl9wY2lidXMgPSAxOworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnBjaXNsb3RzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlpZiAoa3N0cnRvdWwocywgMCwgJnAtPnUuYm9hcmQucGNpc2xvdCkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgcGNpIHNsb3QiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmJvYXJkLnZfcGNpc2xvdCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE1FVEhPRDoKKwkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7CisJCQkJZGdhcF9lcnIoImluc3RhbGwgbWV0aG9kIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS5ib2FyZC5tZXRob2QgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQlwLT51LmJvYXJkLnZfbWV0aG9kID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBVFVTOgorCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKKwkJCQlkZ2FwX2VycigiY29uZmlnIHN0YXR1cyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuYm9hcmQuc3RhdHVzID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBOUE9SVFM6CS8qIG51bWJlciBvZiBwb3J0cyAqLworCQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuYm9hcmQubnBvcnQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBudW1iZXIgb2YgcG9ydHMiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51LmJvYXJkLnZfbnBvcnQgPSAxOworCQkJfSBlbHNlIGlmIChwLT50eXBlID09IENOT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmNvbmMubnBvcnQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBudW1iZXIgb2YgcG9ydHMiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51LmNvbmMudl9ucG9ydCA9IDE7CisJCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gTU5PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUubW9kdWxlLm5wb3J0KSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbnVtYmVyIG9mIHBvcnRzIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5tb2R1bGUudl9ucG9ydCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWRnYXBfZXJyKCJucG9ydHMgb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyBvciBtb2R1bGVzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRDoJLyogbGV0dGVyIElEIHVzZWQgaW4gdHR5IG5hbWUgKi8KKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlwLT51LmJvYXJkLnN0YXR1cyA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKworCQkJaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKKwkJCQlwLT51LmNvbmMuaWQgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQkJcC0+dS5jb25jLnZfaWQgPSAxOworCQkJfSBlbHNlIGlmIChwLT50eXBlID09IE1OT0RFKSB7CisJCQkJcC0+dS5tb2R1bGUuaWQgPSBkZ2FwX3NhdmVzdHJpbmcocyk7CisJCQkJcC0+dS5tb2R1bGUudl9pZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWRnYXBfZXJyKCJpZCBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIG9yIG1vZHVsZXMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUQVJUTzoJLyogc3RhcnQgb2Zmc2V0IG9mIElEICovCisJCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5ib2FyZC5zdGFydCkpIHsKKwkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHN0YXJ0IG9mIHR0eSBjb3VudCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuYm9hcmQudl9zdGFydCA9IDE7CisJCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuY29uYy5zdGFydCkpIHsKKwkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHN0YXJ0IG9mIHR0eSBjb3VudCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuY29uYy52X3N0YXJ0ID0gMTsKKwkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBNTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5tb2R1bGUuc3RhcnQpKSB7CisJCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzdGFydCBvZiB0dHkgY291bnQiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51Lm1vZHVsZS52X3N0YXJ0ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZGdhcF9lcnIoInN0YXJ0IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFRZTjoJLyogdHR5IG5hbWUgcHJlZml4ICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShUTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAoIXMpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcC0+dS50dHluYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKCFwLT51LnR0eW5hbWUpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQ1U6CS8qIGN1IG5hbWUgcHJlZml4ICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJcC0+bmV4dCA9IGRnYXBfbmV3bm9kZShDVU5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKCFzKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuY3VuYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKCFwLT51LmN1bmFtZSkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBMSU5FOgkvKiBsaW5lIGluZm9ybWF0aW9uICovCisJCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKGJyZCA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBib2FyZCBiZWZvcmUgbGluZSBpbmZvIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3dpdGNoIChicmQtPnUuYm9hcmQudHlwZSkgeworCQkJY2FzZSBQUENNOgorCQkJCWRnYXBfZXJyKCJsaW5lIG5vdCB2YWlsZCBmb3IgUEMvZW0iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKExOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQljb25jID0gTlVMTDsKKwkJCWxpbmUgPSBwOworCQkJbGluZWNudCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBDT05DOgkvKiBjb25jZW50cmF0b3IgaW5mb3JtYXRpb24gKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAobGluZSA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBsaW5lIGluZm8gYmVmb3JlIGNvbmNlbnRyYXRvciIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoQ05PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCWNvbmMgPSBwOworCQkJaWYgKGxpbmVjbnQpCisJCQkJYnJkLT51LmJvYXJkLmNvbmMyKys7CisJCQllbHNlCisJCQkJYnJkLT51LmJvYXJkLmNvbmMxKys7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ1g6CS8qIGMveCB0eXBlIGNvbmNlbnRyYXRvciAqLworCQkJaWYgKHAtPnR5cGUgIT0gQ05PREUpIHsKKwkJCQlkZ2FwX2VycigiY3ggb25seSB2YWxpZCBmb3IgY29uY2VudHJhdG9ycyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUuY29uYy50eXBlID0gQ1g7CisJCQlwLT51LmNvbmMudl90eXBlID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVBDOgkvKiBlcGMgdHlwZSBjb25jZW50cmF0b3IgKi8KKwkJCWlmIChwLT50eXBlICE9IENOT0RFKSB7CisJCQkJZGdhcF9lcnIoImN4IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51LmNvbmMudHlwZSA9IEVQQzsKKwkJCXAtPnUuY29uYy52X3R5cGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0Q6CS8qIEVCSSBtb2R1bGUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoYnJkID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGJvYXJkIGluZm8gYmVmb3JlIEVCSSBtb2R1bGVzIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3dpdGNoIChicmQtPnUuYm9hcmQudHlwZSkgeworCQkJY2FzZSBQUENNOgorCQkJCWxpbmVjbnQgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoY29uYyA9PSBOVUxMKSB7CisJCQkJCWRnYXBfZXJyKCJtdXN0IHNwZWNpZnkgY29uY2VudHJhdG9yIGluZm8gYmVmb3JlIEVCSSBtb2R1bGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoTU5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCWlmIChsaW5lY250KQorCQkJCWJyZC0+dS5ib2FyZC5tb2R1bGUyKys7CisJCQllbHNlCisJCQkJYnJkLT51LmJvYXJkLm1vZHVsZTErKzsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUUzoJLyogcG9ydHMgdHlwZSBFQkkgbW9kdWxlICovCisJCQlpZiAocC0+dHlwZSAhPSBNTk9ERSkgeworCQkJCWRnYXBfZXJyKCJwb3J0cyBvbmx5IHZhbGlkIGZvciBFQkkgbW9kdWxlcyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUubW9kdWxlLnR5cGUgPSBQT1JUUzsKKwkJCXAtPnUubW9kdWxlLnZfdHlwZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIE1PREVNOgkvKiBwb3J0cyB0eXBlIEVCSSBtb2R1bGUgKi8KKwkJCWlmIChwLT50eXBlICE9IE1OT0RFKSB7CisJCQkJZGdhcF9lcnIoIm1vZGVtIG9ubHkgdmFsaWQgZm9yIG1vZGVtIG1vZHVsZXMiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwLT51Lm1vZHVsZS50eXBlID0gTU9ERU07CisJCQlwLT51Lm1vZHVsZS52X3R5cGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBDQUJMRToKKwkJCWlmIChwLT50eXBlID09IExOT0RFKSB7CisJCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQkJaWYgKCFzKSB7CisJCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcC0+dS5saW5lLmNhYmxlID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJCXAtPnUubGluZS52X2NhYmxlID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRUQ6CS8qIHN5bmMgbGluZSBzcGVlZCBpbmRpY2F0aW9uICovCisJCQlpZiAocC0+dHlwZSA9PSBMTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5saW5lLnNwZWVkKSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUubGluZS52X3NwZWVkID0gMTsKKwkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBDTk9ERSkgeworCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJCWlmIChzID09IE5VTEwpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5jb25jLnNwZWVkKSkgeworCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXAtPnUuY29uYy52X3NwZWVkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZGdhcF9lcnIoInNwZWVkIHZhbGlkIG9ubHkgZm9yIGxpbmVzIG9yIGNvbmNlbnRyYXRvcnMuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDT05ORUNUOgorCQkJaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKKwkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCQlpZiAoIXMpIHsKKwkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwLT51LmNvbmMuY29ubmVjdCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKKwkJCQlwLT51LmNvbmMudl9jb25uZWN0ID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBSSU5UOgkvKiB0cmFuc3BhcmVudCBwcmludCBuYW1lIHByZWZpeCAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoUE5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKCFzKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAtPnUucHJpbnRuYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpOworCQkJaWYgKCFwLT51LnByaW50bmFtZSkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDTUFKT1I6CS8qIG1ham9yIG51bWJlciAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoSk5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUubWFqb3JudW1iZXIpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG1ham9yIG51bWJlciIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUxUUElOOgkvKiBhbHRwaW4gc2V0dGluZyAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoQU5PREUpOworCQkJaWYgKCFwLT5uZXh0KSB7CisJCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwID0gcC0+bmV4dDsKKwkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOworCQkJaWYgKHMgPT0gTlVMTCkgeworCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtzdHJ0b2wocywgMCwgJnAtPnUuYWx0cGluKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBhbHRwaW4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFVTRUlOVFI6CQkvKiBlbmFibGUgaW50ZXJydXB0IHNldHRpbmcgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKElOVFJOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LnVzZWludHIpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHVzZWludHIiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRUU0laOgkvKiBzaXplIG9mIHR0eSBzdHJ1Y3R1cmUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKFRTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS50dHlzaXplKSkgeworCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciB0dHlzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDSFNJWjoJLyogY2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoQ1NOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LmNoc2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgY2hzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBCU1NJWjoJLyogYm9hcmQgc3RydWN0dXJlIHNpemUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEJTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5ic3NpemUpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGJzc2l6ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVU5UU0laOgkvKiBzY2hlZCBzdHJ1Y3R1cmUgc2l6ZSAqLworCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQorCQkJCXJldHVybiAtMTsKKwkJCXAtPm5leHQgPSBkZ2FwX25ld25vZGUoVVNOT0RFKTsKKwkJCWlmICghcC0+bmV4dCkgeworCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcCA9IHAtPm5leHQ7CisJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKKwkJCWlmIChzID09IE5VTEwpIHsKKwkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChrc3RydG9sKHMsIDAsICZwLT51LnVuc2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3Igc2NoZWRzaXplIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBGMlNJWjoJLyogZjIyMDAgc3RydWN0dXJlIHNpemUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEZTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS5mMnNpemUpKSB7CisJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGYyMjAwc2l6ZSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVlBTSVo6CS8qIHZwaXggc3RydWN0dXJlIHNpemUgKi8KKwkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwLT5uZXh0ID0gZGdhcF9uZXdub2RlKFZTTk9ERSk7CisJCQlpZiAoIXAtPm5leHQpIHsKKwkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXAgPSBwLT5uZXh0OworCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7CisJCQlpZiAocyA9PSBOVUxMKSB7CisJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoa3N0cnRvbChzLCAwLCAmcC0+dS52cGl4c2l6ZSkpIHsKKwkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgdnBpeHNpemUiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIGRnYXBfc2luZGV4OiBtdWNoIGxpa2UgaW5kZXgoKSwgYnV0IGl0IGxvb2tzIGZvciBhIG1hdGNoIG9mIGFueSBjaGFyYWN0ZXIgaW4KKyAqIHRoZSBncm91cCwgYW5kIHJldHVybnMgdGhhdCBwb3NpdGlvbi4gIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBeLCB0aGVuCisgKiB0aGlzIHdpbGwgbWF0Y2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugbm90IGluIHRoYXQgZ3JvdXAuCisgKi8KK3N0YXRpYyBjaGFyICpkZ2FwX3NpbmRleChjaGFyICpzdHJpbmcsIGNoYXIgKmdyb3VwKQoreworCWNoYXIgICAgKnB0cjsKKworCWlmICghc3RyaW5nIHx8ICFncm91cCkKKwkJcmV0dXJuIChjaGFyICopIE5VTEw7CisKKwlpZiAoKmdyb3VwID09ICdeJykgeworCQlncm91cCsrOworCQlmb3IgKDsgKnN0cmluZzsgc3RyaW5nKyspIHsKKwkJCWZvciAocHRyID0gZ3JvdXA7ICpwdHI7IHB0cisrKSB7CisJCQkJaWYgKCpwdHIgPT0gKnN0cmluZykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKnB0ciA9PSAnXDAnKQorCQkJCXJldHVybiBzdHJpbmc7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKDsgKnN0cmluZzsgc3RyaW5nKyspIHsKKwkJCWZvciAocHRyID0gZ3JvdXA7ICpwdHI7IHB0cisrKSB7CisJCQkJaWYgKCpwdHIgPT0gKnN0cmluZykKKwkJCQkJcmV0dXJuIHN0cmluZzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoY2hhciAqKSBOVUxMOworfQorCisvKgorICogR2V0IGEgdG9rZW4gZnJvbSB0aGUgaW5wdXQgZmlsZTsgcmV0dXJuIDAgaWYgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAorICovCitzdGF0aWMgaW50IGRnYXBfZ2V0dG9rKGNoYXIgKippbiwgc3RydWN0IGNub2RlICpwKQoreworCWNoYXIJKnc7CisJc3RydWN0IHRva2xpc3QgKnQ7CisKKwlpZiAoc3Ryc3RyKGRnYXBfY3dvcmQsICJib2FyIikpIHsKKwkJdyA9IGRnYXBfZ2V0d29yZChpbik7CisJCXNucHJpbnRmKGRnYXBfY3dvcmQsIE1BWENXT1JELCAiJXMiLCB3KTsKKwkJZm9yICh0ID0gZGdhcF90bGlzdDsgdC0+dG9rZW4gIT0gMDsgdCsrKSB7CisJCQlpZiAoIXN0cmNtcCh3LCB0LT5zdHJpbmcpKQorCQkJCXJldHVybiB0LT50b2tlbjsKKwkJfQorCQlkZ2FwX2VycigiYm9hcmQgISF0eXBlIG5vdCBzcGVjaWZpZWQiKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJd2hpbGUgKCh3ID0gZGdhcF9nZXR3b3JkKGluKSkpIHsKKwkJCXNucHJpbnRmKGRnYXBfY3dvcmQsIE1BWENXT1JELCAiJXMiLCB3KTsKKwkJCWZvciAodCA9IGRnYXBfdGxpc3Q7IHQtPnRva2VuICE9IDA7IHQrKykgeworCQkJCWlmICghc3RyY21wKHcsIHQtPnN0cmluZykpCisJCQkJCXJldHVybiB0LT50b2tlbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBnZXQgYSB3b3JkIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgYWxzbyBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiB3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCisgKi8KK3N0YXRpYyBjaGFyICpkZ2FwX2dldHdvcmQoY2hhciAqKmluKQoreworCWNoYXIgKnJldF9wdHIgPSAqaW47CisKKwljaGFyICpwdHIgPSBkZ2FwX3NpbmRleCgqaW4sICIgXHRcbiIpOworCisJLyogSWYgbm8gd29yZCBmb3VuZCwgcmV0dXJuIG51bGwgKi8KKwlpZiAoIXB0cikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBNYXJrIG5ldyBsb2NhdGlvbiBmb3Igb3VyIGJ1ZmZlciAqLworCSpwdHIgPSAnXDAnOworCSppbiA9IHB0ciArIDE7CisKKwkvKiBFYXQgYW55IGV4dHJhIHNwYWNlcy90YWJzL25ld2xpbmVzIHRoYXQgbWlnaHQgYmUgcHJlc2VudCAqLworCXdoaWxlICgqaW4gJiYgKippbiAmJiAoKCoqaW4gPT0gJyAnKSB8fAorCQkJICAgICAgICgqKmluID09ICdcdCcpIHx8CisJCQkgICAgICAgKCoqaW4gPT0gJ1xuJykpKSB7CisJCSoqaW4gPSAnXDAnOworCQkqaW4gPSAqaW4gKyAxOworCX0KKworCXJldHVybiByZXRfcHRyOworfQorCisvKgorICogcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSwgZ2l2aW5nIHRoZSBsaW5lIG51bWJlciBpbiB0aGUgZmlsZSB3aGVyZQorICogdGhlIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgdm9pZCBkZ2FwX2VycihjaGFyICpzKQoreworCXByX2VycigiZGdhcDogcGFyc2U6ICVzXG4iLCBzKTsKK30KKworLyoKKyAqIGFsbG9jYXRlIGEgbmV3IGNvbmZpZ3VyYXRpb24gbm9kZSBvZiB0eXBlIHQKKyAqLworc3RhdGljIHN0cnVjdCBjbm9kZSAqZGdhcF9uZXdub2RlKGludCB0KQoreworCXN0cnVjdCBjbm9kZSAqbjsKKworCW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY25vZGUpLCBHRlBfQVRPTUlDKTsKKwlpZiAobiAhPSBOVUxMKSB7CisJCW1lbXNldCgoY2hhciAqKW4sIDAsIHNpemVvZihzdHJ1Y3QgY25vZGUpKTsKKwkJbi0+dHlwZSA9IHQ7CisJfQorCXJldHVybiBuOworfQorCisvKgorICogZGdhcF9jaGVja25vZGU6IHNlZSBpZiBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvIGhhcyBiZWVuIHN1cHBsaWVkIGZvciBhIG5vZGUKKyAqIGJlZm9yZSBjcmVhdGluZyB0aGUgbmV4dCBub2RlLgorICovCitzdGF0aWMgaW50IGRnYXBfY2hlY2tub2RlKHN0cnVjdCBjbm9kZSAqcCkKK3sKKwlzd2l0Y2ggKHAtPnR5cGUpIHsKKwljYXNlIEJOT0RFOgorCQlpZiAocC0+dS5ib2FyZC52X3R5cGUgPT0gMCkgeworCQkJZGdhcF9lcnIoImJvYXJkIHR5cGUgIW5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIExOT0RFOgorCQlpZiAocC0+dS5saW5lLnZfc3BlZWQgPT0gMCkgeworCQkJZGdhcF9lcnIoImxpbmUgc3BlZWQgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIENOT0RFOgorCQlpZiAocC0+dS5jb25jLnZfdHlwZSA9PSAwKSB7CisJCQlkZ2FwX2VycigiY29uY2VudHJhdG9yIHR5cGUgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHAtPnUuY29uYy52X3NwZWVkID09IDApIHsKKwkJCWRnYXBfZXJyKCJjb25jZW50cmF0b3IgbGluZSBzcGVlZCBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAocC0+dS5jb25jLnZfbnBvcnQgPT0gMCkgeworCQkJZGdhcF9lcnIoIm51bWJlciBvZiBwb3J0cyBvbiBjb25jZW50cmF0b3Igbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHAtPnUuY29uYy52X2lkID09IDApIHsKKwkJCWRnYXBfZXJyKCJjb25jZW50cmF0b3IgaWQgbGV0dGVyIG5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBNTk9ERToKKwkJaWYgKHAtPnUubW9kdWxlLnZfdHlwZSA9PSAwKSB7CisJCQlkZ2FwX2VycigiRUJJIG1vZHVsZSB0eXBlIG5vdCBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChwLT51Lm1vZHVsZS52X25wb3J0ID09IDApIHsKKwkJCWRnYXBfZXJyKCJudW1iZXIgb2YgcG9ydHMgb24gRUJJIG1vZHVsZSBub3Qgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAocC0+dS5tb2R1bGUudl9pZCA9PSAwKSB7CisJCQlkZ2FwX2VycigiRUJJIG1vZHVsZSBpZCBsZXR0ZXIgbm90IHNwZWNpZmllZCIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogc2F2ZSBhIHN0cmluZyBzb21ld2hlcmUKKyAqLworc3RhdGljIGNoYXIJKmRnYXBfc2F2ZXN0cmluZyhjaGFyICpzKQoreworCWNoYXIJKnA7CisKKwlwID0ga21hbGxvYyhzdHJsZW4ocykgKyAxLCBHRlBfQVRPTUlDKTsKKwlpZiAocCkKKwkJc3RyY3B5KHAsIHMpOworCXJldHVybiBwOworfQorCisvKgorICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCByZXR1cm5zIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBpbnRlcnJ1cHRzIG9yIG5vdC4KKyAqLworc3RhdGljIHVpbnQgZGdhcF9jb25maWdfZ2V0X3VzZWludHIoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7CisKKwlpZiAoIWJkKQorCQlyZXR1cm4gMDsKKworCWZvciAocCA9IGJkLT5iZF9jb25maWc7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN3aXRjaCAocC0+dHlwZSkgeworCQljYXNlIElOVFJOT0RFOgorCQkJLyoKKwkJCSAqIGNoZWNrIGZvciBwY3hyIHR5cGVzLgorCQkJICovCisJCQlyZXR1cm4gcC0+dS51c2VpbnRyOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiBub3QgZm91bmQsIHRoZW4gZG9uJ3QgdHVybiBvbiBpbnRlcnJ1cHRzLiAqLworCXJldHVybiAwOworfQorCisvKgorICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCByZXR1cm5zIHdoZXRoZXIgd2UgdHVybiBvbiBhbHRwaW4gb3Igbm90LgorICovCitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKHN0cnVjdCBib2FyZF90ICpiZCkKK3sKKwlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOworCisJaWYgKCFiZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgeworCQlzd2l0Y2ggKHAtPnR5cGUpIHsKKwkJY2FzZSBBTk9ERToKKwkJCS8qCisJCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KKwkJCSAqLworCQkJcmV0dXJuIHAtPnUuYWx0cGluOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiBub3QgZm91bmQsIHRoZW4gZG9uJ3QgdHVybiBvbiBpbnRlcnJ1cHRzLiAqLworCXJldHVybiAwOworfQorCisvKgorICogR2l2ZW4gYSBzcGVjaWZpYyB0eXBlIG9mIGJvYXJkLCBpZiBmb3VuZCwgZGV0YWNoZWQgbGluayBhbmQKKyAqIHJldHVybnMgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY25vZGUgKmRnYXBfZmluZF9jb25maWcoaW50IHR5cGUsIGludCBidXMsIGludCBzbG90KQoreworCXN0cnVjdCBjbm9kZSAqcCwgKnByZXYgPSBOVUxMLCAqcHJldjIgPSBOVUxMLCAqZm91bmQgPSBOVUxMOworCisJcCA9ICZkZ2FwX2hlYWQ7CisKKwl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKSB7CisJCXByZXYgPSBwOworCQlwID0gcC0+bmV4dDsKKworCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgeworCisJCQlpZiAocC0+dS5ib2FyZC50eXBlID09IHR5cGUpIHsKKworCQkJCWlmIChwLT51LmJvYXJkLnZfcGNpYnVzICYmCisJCQkJICAgIHAtPnUuYm9hcmQucGNpYnVzICE9IGJ1cykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHAtPnUuYm9hcmQudl9wY2lzbG90ICYmCisJCQkJICAgIHAtPnUuYm9hcmQucGNpc2xvdCAhPSBzbG90KQorCQkJCQljb250aW51ZTsKKworCQkJCWZvdW5kID0gcDsKKwkJCQkvKgorCQkJCSAqIEtlZXAgd2Fsa2luZyB0aHJ1IHRoZSBsaXN0IHRpbGwgd2UKKwkJCQkgKiBmaW5kIHRoZSBuZXh0IGJvYXJkLgorCQkJCSAqLworCQkJCXdoaWxlIChwLT5uZXh0ICE9IE5VTEwpIHsKKwkJCQkJcHJldjIgPSBwOworCQkJCQlwID0gcC0+bmV4dDsKKwkJCQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKKworCQkJCQkJLyoKKwkJCQkJCSAqIE1hcmsgdGhlIGVuZCBvZiBvdXIgMSBib2FyZAorCQkJCQkJICogY2hhaW4gb2YgY29uZmlncy4KKwkJCQkJCSAqLworCQkJCQkJcHJldjItPm5leHQgPSBOVUxMOworCisJCQkJCQkvKgorCQkJCQkJICogTGluayB0aGUgIm5leHQiIGJvYXJkIHRvIHRoZQorCQkJCQkJICogcHJldmlvdXMgYm9hcmQsIGVmZmVjdGl2ZWx5CisJCQkJCQkgKiAidW5saW5raW5nIiBvdXIgYm9hcmQgZnJvbQorCQkJCQkJICogdGhlIG1haW4gY29uZmlnLgorCQkJCQkJICovCisJCQkJCQlwcmV2LT5uZXh0ID0gcDsKKworCQkJCQkJcmV0dXJuIGZvdW5kOworCQkJCQl9CisJCQkJfQorCQkJCS8qCisJCQkJICogSXQgbXVzdCBiZSB0aGUgbGFzdCBib2FyZCBpbiB0aGUgbGlzdC4KKwkJCQkgKi8KKwkJCQlwcmV2LT5uZXh0ID0gTlVMTDsKKwkJCQlyZXR1cm4gZm91bmQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBHaXZlbiBhIGJvYXJkIHBvaW50ZXIsIHdhbGtzIHRoZSBjb25maWcgbGluaywgY291bnRpbmcgdXAKKyAqIGFsbCBwb3J0cyB1c2VyIHNwZWNpZmllZCBzaG91bGQgYmUgb24gdGhlIGJvYXJkLgorICogKFRoaXMgZG9lcyBOT1QgbWVhbiB0aGV5IGFyZSBhbGwgYWN0dWFsbHkgcHJlc2VudCByaWdodCBub3cgdGhvKQorICovCitzdGF0aWMgdWludCBkZ2FwX2NvbmZpZ19nZXRfbnVtX3BydHMoc3RydWN0IGJvYXJkX3QgKmJkKQoreworCWludCBjb3VudCA9IDA7CisJc3RydWN0IGNub2RlICpwID0gTlVMTDsKKworCWlmICghYmQpCisJCXJldHVybiAwOworCisJZm9yIChwID0gYmQtPmJkX2NvbmZpZzsgcDsgcCA9IHAtPm5leHQpIHsKKworCQlzd2l0Y2ggKHAtPnR5cGUpIHsKKwkJY2FzZSBCTk9ERToKKwkJCS8qCisJCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KKwkJCSAqLworCQkJaWYgKHAtPnUuYm9hcmQudHlwZSA+IEVQQ0ZFKQorCQkJCWNvdW50ICs9IHAtPnUuYm9hcmQubnBvcnQ7CisJCQlicmVhazsKKwkJY2FzZSBDTk9ERToKKwkJCWNvdW50ICs9IHAtPnUuY29uYy5ucG9ydDsKKwkJCWJyZWFrOworCQljYXNlIE1OT0RFOgorCQkJY291bnQgKz0gcC0+dS5tb2R1bGUubnBvcnQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjaGFyICpkZ2FwX2NyZWF0ZV9jb25maWdfc3RyaW5nKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKQoreworCWNoYXIgKnB0ciA9IHN0cmluZzsKKwlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOworCXN0cnVjdCBjbm9kZSAqcSA9IE5VTEw7CisJaW50IHNwZWVkOworCisJaWYgKCFiZCkgeworCQkqcHRyID0gMHhmZjsKKwkJcmV0dXJuIHN0cmluZzsKKwl9CisKKwlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgeworCisJCXN3aXRjaCAocC0+dHlwZSkgeworCQljYXNlIExOT0RFOgorCQkJKnB0ciA9ICdcMCc7CisJCQlwdHIrKzsKKwkJCSpwdHIgPSBwLT51LmxpbmUuc3BlZWQ7CisJCQlwdHIrKzsKKwkJCWJyZWFrOworCQljYXNlIENOT0RFOgorCQkJLyoKKwkJCSAqIEJlY2F1c2UgdGhlIEVQQy9jb24gY29uY2VudHJhdG9ycyBjYW4gaGF2ZSBFTSBtb2R1bGVzCisJCQkgKiBoYW5naW5nIG9mZiBvZiB0aGVtLCB3ZSBoYXZlIHRvIHdhbGsgYWhlYWQgaW4gdGhlCisJCQkgKiBsaXN0IGFuZCBrZWVwIGFkZGluZyB0aGUgbnVtYmVyIG9mIHBvcnRzIG9uIGVhY2ggRU0KKwkJCSAqIHRvIHRoZSBjb25maWcuIFVHSCEKKwkJCSAqLworCQkJc3BlZWQgPSBwLT51LmNvbmMuc3BlZWQ7CisJCQlxID0gcC0+bmV4dDsKKwkJCWlmICgocSAhPSBOVUxMKSAmJiAocS0+dHlwZSA9PSBNTk9ERSkpIHsKKwkJCQkqcHRyID0gKHAtPnUuY29uYy5ucG9ydCArIDB4ODApOworCQkJCXB0cisrOworCQkJCXAgPSBxOworCQkJCXdoaWxlICgocS0+bmV4dCAhPSBOVUxMKSAmJgorCQkJCSAgICAgICAocS0+bmV4dC0+dHlwZSkgPT0gTU5PREUpIHsKKworCQkJCQkqcHRyID0gKHEtPnUubW9kdWxlLm5wb3J0ICsgMHg4MCk7CisJCQkJCXB0cisrOworCQkJCQlwID0gcTsKKwkJCQkJcSA9IHEtPm5leHQ7CisJCQkJfQorCQkJCSpwdHIgPSBxLT51Lm1vZHVsZS5ucG9ydDsKKwkJCQlwdHIrKzsKKwkJCX0gZWxzZSB7CisJCQkJKnB0ciA9IHAtPnUuY29uYy5ucG9ydDsKKwkJCQlwdHIrKzsKKwkJCX0KKworCQkJKnB0ciA9IHNwZWVkOworCQkJcHRyKys7CisJCQlicmVhazsKKwkJfQorCX0KKworCSpwdHIgPSAweGZmOworCXJldHVybiBzdHJpbmc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4ZjVmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuaApAQCAtMCwwICsxLDEzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKKyAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQorICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEcml2ZXIgaW5jbHVkZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0RHQVBfRFJJVkVSX0gKKyNkZWZpbmUgX19ER0FQX0RSSVZFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAgICAgICAgLyogVG8gcGljayB1cCB0aGUgdmFyaW9ucyBMaW51eCB0eXBlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPiAgICAgICAgICAvKiBUbyBwaWNrIHVwIHRoZSB2YXJpb3VzIHR0eSBzdHJ1Y3RzL2RlZmluZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gICAgLyogRm9yIGlycXJldHVybl90IHR5cGUgKi8KKworI2lmbmRlZiBUUlVFCisjIGRlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKworLyogUmVxdWlyZWQgZm9yIG91ciBzaGFyZWQgaGVhZGVycyEgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWNoYXI7CisKKyNpZiAhZGVmaW5lZChUVFlfRkxJUEJVRl9TSVpFKQorIyBkZWZpbmUgVFRZX0ZMSVBCVUZfU0laRSA1MTIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERyaXZlciBkZWZpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBEcml2ZXIgaWRlbnRpZmljYXRpb24KKyAqLworI2RlZmluZQlER19OQU1FCQkiZGdhcC0xLjMtMTYiCisjZGVmaW5lCURHX1BBUlQJCSI0MDAwMjM0N19DIgorI2RlZmluZQlEUlZTVFIJCSJkZ2FwIgorCisvKgorICogZGVmaW5lcyBmcm9tIGRnYXBfcGNpLmgKKyAqLyAKKyNkZWZpbmUgUENJTUFYIDMyCQkJLyogbWF4aW11bSBudW1iZXIgb2YgUENJIGJvYXJkcyAqLworCisjZGVmaW5lIERJR0lfVklECQkweDExNEYKKworI2RlZmluZSBQQ0lfREVWX0VQQ19ESUQJCTB4MDAwMgorI2RlZmluZSBQQ0lfREVWX1hFTV9ESUQJCTB4MDAwNAorI2RlZmluZSBQQ0lfREVWX1hSX0RJRAkJMHgwMDA1CisjZGVmaW5lIFBDSV9ERVZfQ1hfRElECQkweDAwMDYKKyNkZWZpbmUgUENJX0RFVl9YUkpfRElECQkweDAwMDkJLyogUExYLWJhc2VkIFhyIGFkYXB0ZXIgKi8KKyNkZWZpbmUgUENJX0RFVl9YUl9JQk1fRElECTB4MDAxMQkvKiBJQk0gOC1wb3J0IEFzeW5jIEFkYXB0ZXIgKi8KKyNkZWZpbmUgUENJX0RFVl9YUl9CVUxMX0RJRAkweDAwMTMJLyogQlVMTCA4LXBvcnQgQXN5bmMgQWRhcHRlciAqLworI2RlZmluZSBQQ0lfREVWX1hSX1NBSVBfRElECTB4MDAxYwkvKiBTQUlQIGNhcmQgLSBYciBhZGFwdGVyICovCisjZGVmaW5lIFBDSV9ERVZfWFJfNDIyX0RJRAkweDAwMTIJLyogWHItNDIyICovCisjZGVmaW5lIFBDSV9ERVZfOTIwXzJfRElECTB4MDAzNAkvKiBYUi1QbHVzIDkyMCBLLCAyIHBvcnQgKi8KKyNkZWZpbmUgUENJX0RFVl85MjBfNF9ESUQJMHgwMDI2CS8qIFhSLVBsdXMgOTIwIEssIDQgcG9ydCAqLworI2RlZmluZSBQQ0lfREVWXzkyMF84X0RJRAkweDAwMjcJLyogWFItUGx1cyA5MjAgSywgOCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZfRVBDSl9ESUQJMHgwMDBhCS8qIFBMWCA5MDYwIGNoaXAgZm9yIFBDSSAgKi8KKyNkZWZpbmUgUENJX0RFVl9DWF9JQk1fRElECTB4MDAxYgkvKiBJQk0gMTI4LXBvcnQgQXN5bmMgQWRhcHRlciAqLworI2RlZmluZSBQQ0lfREVWXzkyMF84X0hQX0RJRAkweDAwNTgJLyogSFAgWFItUGx1cyA5MjAgSywgOCBwb3J0ICovCisjZGVmaW5lIFBDSV9ERVZfWEVNX0hQX0RJRAkweDAwNTkgIC8qIEhQIFhlbSBQQ0kgKi8KKworI2RlZmluZSBQQ0lfREVWX1hFTV9OQU1FCSJBY2NlbGVQb3J0IFhFTSIKKyNkZWZpbmUgUENJX0RFVl9DWF9OQU1FCQkiQWNjZWxlUG9ydCBDWCIKKyNkZWZpbmUgUENJX0RFVl9YUl9OQU1FCQkiQWNjZWxlUG9ydCBYciIKKyNkZWZpbmUgUENJX0RFVl9YUkpfTkFNRQkiQWNjZWxlUG9ydCBYciAoUExYKSIKKyNkZWZpbmUgUENJX0RFVl9YUl9TQUlQX05BTUUJIkFjY2VsZVBvcnQgWHIgKFNBSVApIgorI2RlZmluZSBQQ0lfREVWXzkyMF8yX05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgMiBwb3J0IgorI2RlZmluZSBQQ0lfREVWXzkyMF80X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgNCBwb3J0IgorI2RlZmluZSBQQ0lfREVWXzkyMF84X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgOCBwb3J0IgorI2RlZmluZSBQQ0lfREVWX1hSXzQyMl9OQU1FCSJBY2NlbGVQb3J0IFhyIDQyMiIKKyNkZWZpbmUgUENJX0RFVl9FUENKX05BTUUJIkFjY2VsZVBvcnQgRVBDIChQTFgpIgorI2RlZmluZSBQQ0lfREVWX1hSX0JVTExfTkFNRQkiQWNjZWxlUG9ydCBYciAoQlVMTCkiCisjZGVmaW5lIFBDSV9ERVZfWFJfSUJNX05BTUUJIkFjY2VsZVBvcnQgWHIgKElCTSkiCisjZGVmaW5lIFBDSV9ERVZfQ1hfSUJNX05BTUUJIkFjY2VsZVBvcnQgQ1ggKElCTSkiCisjZGVmaW5lIFBDSV9ERVZfOTIwXzhfSFBfTkFNRQkiQWNjZWxlUG9ydCBYcjkyMCA4IHBvcnQgKEhQKSIKKyNkZWZpbmUgUENJX0RFVl9YRU1fSFBfTkFNRQkiQWNjZWxlUG9ydCBYRU0gKEhQKSIKKworLyoKKyAqIE9uIHRoZSBQQ0kgYm9hcmRzLCB0aGVyZSBpcyBubyBJTyBzcGFjZSBhbGxvY2F0ZWQKKyAqIFRoZSBJL08gcmVnaXN0ZXJzIHdpbGwgYmUgaW4gdGhlIGZpcnN0IDMgYnl0ZXMgb2YgdGhlCisgKiB1cHBlciAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UuICBUaGUgYm9hcmQgbWVtb3J5CisgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlCisgKi8KKworLyogUG90ZW50aWFsIGxvY2F0aW9uIG9mIFBDSSBCaW9zIGZyb20gRTAwMDAgdG8gRkZGRkYqLworI2RlZmluZSBQQ0lfQklPU19TSVpFCQkweDAwMDIwMDAwCisKKy8qIFNpemUgb2YgTWVtb3J5IGFuZCBJL08gZm9yIFBDSSAoNE1CKSAqLworI2RlZmluZSBQQ0lfUkFNX1NJWkUJCTB4MDA0MDAwMDAKKworLyogU2l6ZSBvZiBNZW1vcnkgKDJNQikgKi8KKyNkZWZpbmUgUENJX01FTV9TSVpFCQkweDAwMjAwMDAwCisKKy8qIE1heCBQQ0kgV2luZG93IFNpemUgKDJNQikgKi8KKyNkZWZpbmUgUENJX1dJTl9TSVpFCQkweDAwMjAwMDAwCisKKyNkZWZpbmUgUENJX1dJTl9TSElGVAkJMjEgLyogMjEgYml0cyBtYXggKi8KKworLyogT2Zmc2V0IG9mIEkvMCBpbiBNZW1vcnkgKDJNQikgKi8KKyNkZWZpbmUgUENJX0lPX09GRlNFVAkJMHgwMDIwMDAwMAorCisvKiBTaXplIG9mIElPICgyTUIpICovCisjZGVmaW5lIFBDSV9JT19TSVpFCQkweDAwMjAwMDAwCisKKy8qIE51bWJlciBvZiBib2FyZHMgd2Ugc3VwcG9ydCBhdCBvbmNlLiAqLworI2RlZmluZQlNQVhCT0FSRFMJMzIKKyNkZWZpbmUJTUFYUE9SVFMJMjI0CisjZGVmaW5lIE1BWFRUWU5BTUVMRU4JMjAwCisKKy8qIE91ciAzIG1hZ2ljIG51bWJlcnMgZm9yIG91ciBib2FyZCwgY2hhbm5lbCBhbmQgdW5pdCBzdHJ1Y3RzICovCisjZGVmaW5lIERHQVBfQk9BUkRfTUFHSUMJMHg1YzZkZjEwNAorI2RlZmluZSBER0FQX0NIQU5ORUxfTUFHSUMJMHg2YzZkZjEwNAorI2RlZmluZSBER0FQX1VOSVRfTUFHSUMJCTB4N2M2ZGYxMDQKKworLyogU2VyaWFsIHBvcnQgdHlwZXMgKi8KKyNkZWZpbmUgREdBUF9TRVJJQUwJCTAKKyNkZWZpbmUgREdBUF9QUklOVAkJMQorCisjZGVmaW5lCVNFUklBTF9UWVBFX05PUk1BTAkxCisKKy8qIDQgZXh0cmEgZm9yIGFsaWdubWVudCBwbGF5IHNwYWNlICovCisjZGVmaW5lIFdSSVRFQlVGTEVOCQkoKDQwOTYpICsgNCkKKyNkZWZpbmUgTVlGTElQTEVOCQlOX1RUWV9CVUZfU0laRQorCisjZGVmaW5lIFNCUkVBS19USU1FIDB4MjUKKyNkZWZpbmUgVTJCU0laRSAweDQwMAorCisjZGVmaW5lIGRnYXBfamlmZmllc19mcm9tX21zKGEpICgoKGEpICogSFopIC8gMTAwMCkKKworLyoKKyAqIE91ciBtYWpvciBmb3IgdGhlIG1nbXQgZGV2aWNlcy4KKyAqCisgKiBXZSBjYW4gdXNlIDIyLCBiZWNhdXNlIERpZ2kgd2FzIGFsbG9jYXRlZCAyMiBhbmQgMjMgZm9yIHRoZSBlcGNhIGRyaXZlci4KKyAqIDIyIGhhcyBub3cgYmVjb21lIG9ic29sZXRlIG5vdyB0aGF0IHRoZSAiY3UiIGRldmljZXMgaGF2ZQorICogYmVlbiByZW1vdmVkIGZyb20gMi42LgorICogQWxzbywgdGhpcyAqSVMqIHRoZSBlcGNhIGRyaXZlciwganVzdCBQQ0kgb25seSBub3cuCisgKi8KKyNpZm5kZWYgRElHSV9ER0FQX01BSk9SCisjIGRlZmluZSBESUdJX0RHQVBfTUFKT1IgICAgICAgICAyMgorI2VuZGlmCisKKy8qCisgKiBUaGUgcGFyYW1ldGVycyB3ZSB1c2UgdG8gZGVmaW5lIHRoZSBwZXJpb2RzIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZXMuCisgKi8KKyNkZWZpbmUJCU1BX1BFUklPRAkoSFogLyAxMCkKKyNkZWZpbmUJCVNNQV9EVVIJCSgxICogSFopCisjZGVmaW5lCQlFTUFfRFVSCQkoMSAqIEhaKQorI2RlZmluZQkJU01BX05QRVJJT0RTCShTTUFfRFVSIC8gTUFfUEVSSU9EKQorI2RlZmluZQkJRU1BX05QRVJJT0RTCShFTUFfRFVSIC8gTUFfUEVSSU9EKQorCisvKgorICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAorICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LiAgVGhpcyBpcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgdGhhdCBpcyBkZWZpbmVkCisgKiBhcyB0aGUgZGVmYXVsdCBpbiB0dHlfaW8uYyB3aXRoIHRoZSBzYW1lIHNldHRpbmdzIG92ZXJyaWRlbiBhcyBpbiBzZXJpYWwuYworICoKKyAqIEluIHNob3J0LCB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJuYWwgc2VyaWFsIHBvcnRzJyBkZWZhdWx0cy4KKyAqLworI2RlZmluZQlERUZBVUxUX0lGTEFHUwkoSUNSTkwgfCBJWE9OKQorI2RlZmluZQlERUZBVUxUX09GTEFHUwkoT1BPU1QgfCBPTkxDUikKKyNkZWZpbmUJREVGQVVMVF9DRkxBR1MJKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCkKKyNkZWZpbmUJREVGQVVMVF9MRkxBR1MJKElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8IFwKKwkJCUVDSE9DVEwgfCBFQ0hPS0UgfCBJRVhURU4pCisKKyNpZm5kZWYgX1BPU0lYX1ZESVNBQkxFCisjZGVmaW5lICAgX1BPU0lYX1ZESVNBQkxFICdcMCcKKyNlbmRpZgorCisjZGVmaW5lIFNOSUZGX01BWAk2NTUzNgkJLyogU25pZmYgYnVmZmVyIHNpemUgKDJebikgKi8KKyNkZWZpbmUgU05JRkZfTUFTSwkoU05JRkZfTUFYIC0gMSkJLyogU25pZmYgd3JhcCBtYXNrICovCisKKyNkZWZpbmUgVlBEU0laRSAoNTEyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIEZFUCBtZW1vcnkgb2Zmc2V0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1RBUlQgICAgICAgICAgIDB4MDAwNEwgICAgICAgICAvKiBFeGVjdXRpb24gc3RhcnQgYWRkcmVzcyAgICAgICovCisKKyNkZWZpbmUgQ01EQlVGICAgICAgICAgIDB4MGQxMEwgICAgICAgICAvKiBDb21tYW5kIChjbV90KSBzdHJ1Y3R1cmUgb2Zmc2V0ICovCisjZGVmaW5lIENNRFNUQVJUICAgICAgICAweDA0MDBMICAgICAgICAgLyogU3RhcnQgb2YgY29tbWFuZCBidWZmZXIgICAgICAqLworI2RlZmluZSBDTURNQVggICAgICAgICAgMHgwODAwTCAgICAgICAgIC8qIEVuZCBvZiBjb21tYW5kIGJ1ZmZlciAgICAgICAgKi8KKworI2RlZmluZSBFVkJVRiAgICAgICAgICAgMHgwZDE4TCAgICAgICAgIC8qIEV2ZW50IChldl90KSBzdHJ1Y3R1cmUgICAgICAgKi8KKyNkZWZpbmUgRVZTVEFSVCAgICAgICAgIDB4MDgwMEwgICAgICAgICAvKiBTdGFydCBvZiBldmVudCBidWZmZXIgICAgICAgICovCisjZGVmaW5lIEVWTUFYICAgICAgICAgICAweDBjMDBMICAgICAgICAgLyogRW5kIG9mIGV2ZW50IGJ1ZmZlciAgICAgICAgICAqLworI2RlZmluZSBGRVA1X1BMVVMgICAgICAgMHgwRTQwICAgICAgICAgIC8qIEFTQ0lJICc1JyBhbmQgQVNDSUkgJ0EnIGlzIGhlcmUgICovCisjZGVmaW5lIEVDU19TRUcgICAgICAgICAweDBFNDQgICAgICAgICAgLyogU2VnbWVudCBvZiB0aGUgZXh0ZW5kZWQgY2hhbm5lbCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTElORV9TUEVFRCAgICAgIDB4MTAgICAgICAgICAgICAvKiBPZmZzZXQgaW50byBFQ1NfU0VHIGZvciBsaW5lIHNwZWVkICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZmVwIGhhcyBleHRlbmRlZCBjYXBhYmlsaXRpZXMgKi8KKworLyogQklPUyBNQUdJQyBTUE9UUyAqLworI2RlZmluZSBFUlJPUiAgICAgICAgICAgMHgwQzE0TAkJLyogQklPUyBlcnJvciBjb2RlICAgICAgICAgICAgICAqLworI2RlZmluZSBTRVFVRU5DRQkweDBDMTJMCQkvKiBCSU9TIHNlcXVlbmNlIGluZGljYXRvciAgICAgICovCisjZGVmaW5lIFBPU1RBUkVBCTB4MEMwMEwJCS8qIFBPU1QgY29tcGxldGUgbWVzc2FnZSBhcmVhICAgKi8KKworLyogRkVQIE1BR0lDIFNQT1RTICovCisjZGVmaW5lIEZFUFNUQVQgICAgICAgICBQT1NUQVJFQSAgICAgICAgLyogT1MgaGVyZSB3aGVuIEZFUCBjb21lcyB1cCAgICAqLworI2RlZmluZSBOQ0hBTiAgICAgICAgICAgMHgwQzAyTCAgICAgICAgIC8qIG51bWJlciBvZiBwb3J0cyBGRVAgc2VlcyAgICAgKi8KKyNkZWZpbmUgUEFOSUMgICAgICAgICAgIDB4MEMxMEwgICAgICAgICAvKiBQQU5JQyBhcmVhIGZvciBGRVAgICAgICAgICAgICovCisjZGVmaW5lIEtNRU1FTSAgICAgICAgICAweDBDMzBMICAgICAgICAgLyogTWVtb3J5IGZvciBLTUUgdXNlICAgICAgICAgICAqLworI2RlZmluZSBDT05GSUcgICAgICAgICAgMHgwQ0QwTCAgICAgICAgIC8qIENvbmNlbnRyYXRvciBjb25maWd1cmF0aW9uIGluZm8gKi8KKyNkZWZpbmUgQ09ORklHU0laRSAgICAgIDB4MDAzMCAgICAgICAgICAvKiBjb25maWd1cmF0aW9uIGluZm8gc2l6ZSAgICAgICovCisjZGVmaW5lIERPV05SRVEgICAgICAgICAweDBEMDAgICAgICAgICAgLyogRG93bmxvYWQgcmVxdWVzdCBidWZmZXIgcG9pbnRlciAqLworCisjZGVmaW5lIENIQU5CVUYgICAgICAgICAweDEwMDBMICAgICAgICAgLyogQXN5bmMgY2hhbm5lbCAoYnNfdCkgc3RydWN0cyAqLworI2RlZmluZSBGRVBPU1NJWkUgICAgICAgMHgxRkZGICAgICAgICAgIC8qIDhLIEZFUE9TICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBYRU1QT1JUUyAgICAweEMwMgkvKgorCQkJCSAqIE9mZnNldCBpbiBib2FyZCBtZW1vcnkgd2hlcmUgRkVQNSBzdG9yZXMKKwkJCQkgKiBob3cgbWFueSBwb3J0cyBpdCBoYXMgZGV0ZWN0ZWQuCisJCQkJICogTk9URTogRkVQNSByZXBvcnRzIDY0IHBvcnRzIHdoZW4gdGhlIHVzZXIKKwkJCQkgKiBoYXMgdGhlIGNhYmxlIGluIEVCSSBPVVQgaW5zdGVhZCBvZiBFQkkgSU4uCisJCQkJICovCisKKyNkZWZpbmUgRkVQQ0xSICAgICAgMHgwMAorI2RlZmluZSBGRVBNRU0gICAgICAweDAyCisjZGVmaW5lIEZFUFJTVCAgICAgIDB4MDQKKyNkZWZpbmUgRkVQSU5UICAgICAgMHgwOAorI2RlZmluZSBGRVBNQVNLICAgICAweDBlCisjZGVmaW5lIEZFUFdJTiAgICAgIDB4ODAKKworI2RlZmluZSBMT1dNRU0gICAgICAweDAxMDAKKyNkZWZpbmUgSElHSE1FTSAgICAgMHg3ZjAwCisKKyNkZWZpbmUgRkVQVElNRU9VVCAyMDAwMDAKKworI2RlZmluZSBFTkFCTEVfSU5UUgkJMHgwZTA0CQkvKiBFbmFibGUgaW50ZXJydXB0cyBmbGFnICovCisjZGVmaW5lIEZFUFBPTExfTUlOCQkxCQkvKiBtaW5pbXVtIG9mIDEgbWlsbGlzZWNvbmQgKi8KKyNkZWZpbmUgRkVQUE9MTF9NQVgJCTIwCQkvKiBtYXhpbXVtIG9mIDIwIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBGRVBQT0xMCQkJMHgwYzI2CQkvKiBGZXAgZXZlbnQgcG9sbCBpbnRlcnZhbCAqLworCisjZGVmaW5lCUlBTFRQSU4JCQkweDAwODAJCS8qIElucHV0IGZsYWcgdG8gc3dhcCBEU1IgPC0+IERDRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGRVAgc3VwcG9ydGVkIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1JMT1cJCTB4ZTAJCS8qIFNldCByZWNlaXZlIGxvdyB3YXRlcgkqLworI2RlZmluZSBTUkhJR0gJCTB4ZTEJCS8qIFNldCByZWNlaXZlIGhpZ2ggd2F0ZXIJKi8KKyNkZWZpbmUgRkxVU0hUWAkJMHhlMgkJLyogRmx1c2ggdHJhbnNtaXQgYnVmZmVyCSovCisjZGVmaW5lIFBBVVNFVFgJCTB4ZTMJCS8qIFBhdXNlIGRhdGEgdHJhbnNtaXNzaW9uCSovCisjZGVmaW5lIFJFU1VNRVRYCTB4ZTQJCS8qIFJlc3VtZSBkYXRhIHRyYW5zbWlzc2lvbgkqLworI2RlZmluZSBTTUlOVAkJMHhlNQkJLyogU2V0IE1vZGVtIEludGVycnVwdAkJKi8KKyNkZWZpbmUgU0FGTE9XQwkJMHhlNgkJLyogU2V0IEF1eC4gZmxvdyBjb250cm9sIGNoYXJzCSovCisjZGVmaW5lIFNCUkVBSwkJMHhlOAkJLyogU2VuZCBicmVhawkJCSovCisjZGVmaW5lIFNNT0RFTQkJMHhlOQkJLyogU2V0IDg1MzAgbW9kZW0gY29udHJvbCBsaW5lcwkqLworI2RlZmluZSBTSUZMQUcJCTB4ZWEJCS8qIFNldCBVTklYIGlmbGFncwkJKi8KKyNkZWZpbmUgU0ZMT1dDCQkweGViCQkvKiBTZXQgZmxvdyBjb250cm9sIGNoYXJhY3RlcnMJKi8KKyNkZWZpbmUgU1RMT1cJCTB4ZWMJCS8qIFNldCB0cmFuc21pdCBsb3cgd2F0ZXIgbWFyawkqLworI2RlZmluZSBSUEFVU0UJCTB4ZWUJCS8qIFBhdXNlIHJlY2VpdmUJCSovCisjZGVmaW5lIFJSRVNVTUUJCTB4ZWYJCS8qIFJlc3VtZSByZWNlaXZlCQkqLworI2RlZmluZSBDSFJFU0VUCQkweGYwCQkvKiBSZXNldCBDaGFubmVsCQkqLworI2RlZmluZSBCVUZTRVRBTEwJMHhmMgkJLyogU2V0IFR4ICYgUnggYnVmZmVyIHNpemUgYXZhaWwqLworI2RlZmluZSBTT0ZMQUcJCTB4ZjMJCS8qIFNldCBVTklYIG9mbGFncwkJKi8KKyNkZWZpbmUgU0hGTE9XCQkweGY0CQkvKiBTZXQgaGFyZHdhcmUgaGFuZHNoYWtlCSovCisjZGVmaW5lIFNDRkxBRwkJMHhmNQkJLyogU2V0IFVOSVggY2ZsYWdzCQkqLworI2RlZmluZSBTVk5FWFQJCTB4ZjYJCS8qIFNldCBWTkVYVCBjaGFyYWN0ZXIJCSovCisjZGVmaW5lIFNQSU5URkMJCTB4ZmMJCS8qIFJlc2VydmVkCQkJKi8KKyNkZWZpbmUgU0NPTU1PREUJMHhmZAkJLyogU2V0IFJTMjMyLzQyMiBtb2RlCQkqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU1vZGVzIGZvciBTQ09NTU9ERQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTU9ERV8yMzIJMHgwMAorI2RlZmluZSBNT0RFXzQyMgkweDAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBFdmVudCBmbGFncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElGQlJFQUsgICAgICAgICAweDAxICAgICAgICAgICAgLyogQnJlYWsgcmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBJRlRMVyAgICAgICAgICAgMHgwMiAgICAgICAgICAgIC8qIFRyYW5zbWl0IGxvdyB3YXRlciAgICAgICAgICAgKi8KKyNkZWZpbmUgSUZURU0gICAgICAgICAgIDB4MDQgICAgICAgICAgICAvKiBUcmFuc21pdHRlciBlbXB0eSAgICAgICAgICAgICovCisjZGVmaW5lIElGREFUQSAgICAgICAgICAweDA4ICAgICAgICAgICAgLyogUmVjZWl2ZSBkYXRhIHByZXNlbnQgICAgICAgICAqLworI2RlZmluZSBJRk1PREVNICAgICAgICAgMHgyMCAgICAgICAgICAgIC8qIE1vZGVtIHN0YXR1cyBjaGFuZ2UgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBNb2RlbSBmbGFncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyMgICAgICAgZGVmaW5lICBETV9SVFMgICAgICAgICAgMHgwMiAgICAvKiBSZXF1ZXN0IHRvIHNlbmQgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSAgRE1fQ0QgICAgICAgICAgIDB4ODAgICAgLyogQ2FycmllciBkZXRlY3QgICAgICAgICAgICAgICAqLworIyAgICAgICBkZWZpbmUgIERNX0RTUiAgICAgICAgICAweDIwICAgIC8qIERhdGEgc2V0IHJlYWR5ICAgICAgICAgICAgICAgKi8KKyMgICAgICAgZGVmaW5lICBETV9DVFMgICAgICAgICAgMHgxMCAgICAvKiBDbGVhciB0byBzZW5kICAgICAgICAgICAgICAgICovCisjICAgICAgIGRlZmluZSAgRE1fUkkgICAgICAgICAgIDB4NDAgICAgLyogUmluZyBpbmRpY2F0b3IgICAgICAgICAgICAgICAqLworIyAgICAgICBkZWZpbmUgIERNX0RUUiAgICAgICAgICAweDAxICAgIC8qIERhdGEgdGVybWluYWwgcmVhZHkgICAgICAgICAgKi8KKworLyoKKyAqIGRlZmluZXMgZnJvbSBkZ2FwX2NvbmYuaAorICovCisjZGVmaW5lIE5VTExOT0RFIDAJCS8qIGhlYWRlciBub2RlLCBub3QgdXNlZCAqLworI2RlZmluZSBCTk9ERSAxCQkJLyogQm9hcmQgbm9kZSAqLworI2RlZmluZSBMTk9ERSAyCQkJLyogTGluZSBub2RlICovCisjZGVmaW5lIENOT0RFIDMJCQkvKiBDb25jZW50cmF0b3Igbm9kZSAqLworI2RlZmluZSBNTk9ERSA0CQkJLyogRUJJIE1vZHVsZSBub2RlICovCisjZGVmaW5lIFROT0RFIDUJCQkvKiB0dHkgbmFtZSBwcmVmaXggbm9kZSAqLworI2RlZmluZQlDVU5PREUgNgkJLyogY3UgbmFtZSBwcmVmaXggKG5vbi1TQ08pICovCisjZGVmaW5lIFBOT0RFIDcJCQkvKiB0cmFucy4gcHJpbnQgcHJlZml4IG5vZGUgKi8KKyNkZWZpbmUgSk5PREUgOAkJCS8qIG1hSm9yIG51bWJlciBub2RlICovCisjZGVmaW5lIEFOT0RFIDkJCQkvKiBhbHRwaW4gKi8KKyNkZWZpbmUJVFNOT0RFIDEwCQkvKiB0dHkgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgQ1NOT0RFIDExCQkvKiBjaGFubmVsIHN0cnVjdHVyZSBzaXplICovCisjZGVmaW5lIEJTTk9ERSAxMgkJLyogYm9hcmQgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgVVNOT0RFIDEzCQkvKiB1bml0IHNjaGVkdWxlIHN0cnVjdHVyZSBzaXplICovCisjZGVmaW5lIEZTTk9ERSAxNAkJLyogZjIyMDAgc3RydWN0dXJlIHNpemUgKi8KKyNkZWZpbmUgVlNOT0RFIDE1CQkvKiBzaXplIG9mIFZQSVggc3RydWN0dXJlcyAqLworI2RlZmluZSBJTlRSTk9ERSAxNgkJLyogZW5hYmxlIGludGVycnVwdCAqLworCisvKiBFbnVtZXJhdGlvbiBvZiB0b2tlbnMgKi8KKyNkZWZpbmUJQkVHSU4JMQorI2RlZmluZQlFTkQJMgorI2RlZmluZQlCT0FSRAkxMAorCisjZGVmaW5lIEVQQ0ZTCTExIC8qIHN0YXJ0IG9mIEVQQyBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJSUNYCQkxMQorI2RlZmluZQlNQ1gJCTEzCisjZGVmaW5lIFBDWAkxNAorI2RlZmluZQlJRVBDCTE1CisjZGVmaW5lCUVFUEMJMTYKKyNkZWZpbmUJTUVQQwkxNworI2RlZmluZQlJUENNCTE4CisjZGVmaW5lCUVQQ00JMTkKKyNkZWZpbmUJTVBDTQkyMAorI2RlZmluZSBQRVBDCTIxCisjZGVmaW5lIFBQQ00JMjIKKyNpZmRlZiBDUAorI2RlZmluZSBJQ1AgICAgIDIzCisjZGVmaW5lIEVDUCAgICAgMjQKKyNkZWZpbmUgTUNQICAgICAyNQorI2VuZGlmCisjZGVmaW5lIEVQQ0ZFCTI1IC8qIGVuZCBvZiBFUEMgZmFtaWx5IGRlZmluaXRpb25zICovCisjZGVmaW5lCVBDMkUJMjYKKyNkZWZpbmUJUEM0RQkyNworI2RlZmluZQlQQzRFOEsJMjgKKyNkZWZpbmUJUEM4RQkyOQorI2RlZmluZQlQQzhFOEsJMzAKKyNkZWZpbmUJUEMxNkUJMzEKKyNkZWZpbmUgTUMyRThLICAzNAorI2RlZmluZSBNQzRFOEsgIDM1CisjZGVmaW5lIE1DOEU4SyAgMzYKKworI2RlZmluZSBBVkFORlMJNDIJLyogc3RhcnQgb2YgQXZhbnN0YXIgZmFtaWx5IGRlZmluaXRpb25zICovCisjZGVmaW5lIEE4UCAJNDIKKyNkZWZpbmUgQTE2UAk0MworI2RlZmluZSBBVkFORkUJNDMJLyogZW5kIG9mIEF2YW5zdGFyIGZhbWlseSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIERBMjAwMEZTCTQ0CS8qIHN0YXJ0IG9mIEFjY2VsZVBvcnQgMjAwMCBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgREEyMiAJCTQ0IC8qIEFjY2VsZVBvcnQgMjAwMiAqLworI2RlZmluZSBEQTI0IAkJNDUgLyogQWNjZWxlUG9ydCAyMDA0ICovCisjZGVmaW5lIERBMjgJCTQ2IC8qIEFjY2VsZVBvcnQgMjAwOCAqLworI2RlZmluZSBEQTIxNgkJNDcgLyogQWNjZWxlUG9ydCAyMDE2ICovCisjZGVmaW5lIERBUjQJCTQ4IC8qIEFjY2VsZVBvcnQgUkFTIDQgcG9ydCAqLworI2RlZmluZSBEQVI4CQk0OSAvKiBBY2NlbGVQb3J0IFJBUyA4IHBvcnQgKi8KKyNkZWZpbmUgRERSMjQJCTUwIC8qIERhdGFGaXJlIFJBUyAyNCBwb3J0ICovCisjZGVmaW5lIEREUjMwCQk1MSAvKiBEYXRhRmlyZSBSQVMgMzAgcG9ydCAqLworI2RlZmluZSBERFI0OAkJNTIgLyogRGF0YUZpcmUgUkFTIDQ4IHBvcnQgKi8KKyNkZWZpbmUgRERSNjAJCTUzIC8qIERhdGFGaXJlIFJBUyA2MCBwb3J0ICovCisjZGVmaW5lIERBMjAwMEZFCTUzIC8qIGVuZCBvZiBBY2NlbGVQb3J0IDIwMDAvUkFTIGZhbWlseSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFBDWFJGUwkxMDYJLyogc3RhcnQgb2YgUENYUiBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJQVBPUlQ0CTEwNgorI2RlZmluZQlBUE9SVDgJMTA3CisjZGVmaW5lIFBBUE9SVDQgMTA4CisjZGVmaW5lIFBBUE9SVDggMTA5CisjZGVmaW5lIEFQT1JUNF85MjBJCTExMAorI2RlZmluZSBBUE9SVDhfOTIwSQkxMTEKKyNkZWZpbmUgQVBPUlQ0XzkyMFAJMTEyCisjZGVmaW5lIEFQT1JUOF85MjBQCTExMworI2RlZmluZSBBUE9SVDJfOTIwUCAxMTQKKyNkZWZpbmUgUENYUkZFCTExNwkvKiBlbmQgb2YgUENYUiBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZQlMSU5FCTgyCisjaWZkZWYgVDEKKyNkZWZpbmUgVDFNCTgzCisjZGVmaW5lIEUxTQk4NAorI2VuZGlmCisjZGVmaW5lCUNPTkMJNjQKKyNkZWZpbmUJQ1gJNjUKKyNkZWZpbmUJRVBDCTY2CisjZGVmaW5lCU1PRAk2NworI2RlZmluZQlQT1JUUwk2OAorI2RlZmluZSBNRVRIT0QJNjkKKyNkZWZpbmUgQ1VTVE9NCTcwCisjZGVmaW5lIEJBU0lDCTcxCisjZGVmaW5lIFNUQVRVUwk3MgorI2RlZmluZSBNT0RFTQk3MworLyogVGhlIGZvbGxvd2luZyB0b2tlbnMgY2FuIGFwcGVhciBpbiBtdWx0aXBsZSBwbGFjZXMgKi8KKyNkZWZpbmUJU1BFRUQJNzQKKyNkZWZpbmUJTlBPUlRTCTc1CisjZGVmaW5lCUlECTc2CisjZGVmaW5lIENBQkxFCTc3CisjZGVmaW5lIENPTk5FQ1QJNzgKKyNkZWZpbmUJSU8JNzkKKyNkZWZpbmUJTUVNCTgwCisjZGVmaW5lIERQU1oJODEKKworI2RlZmluZQlUVFlOCTkwCisjZGVmaW5lCUNVCTkxCisjZGVmaW5lCVBSSU5UCTkyCisjZGVmaW5lCVhQUklOVAk5MworI2RlZmluZSBDTUFKT1IgICA5NAorI2RlZmluZSBBTFRQSU4gIDk1CisjZGVmaW5lIFNUQVJUTyA5NgorI2RlZmluZSBVU0VJTlRSICA5NworI2RlZmluZSBQQ0lJTkZPICA5OAorCisjZGVmaW5lCVRUU0laCTEwMAorI2RlZmluZQlDSFNJWgkxMDEKKyNkZWZpbmUgQlNTSVoJMTAyCisjZGVmaW5lCVVOVFNJWgkxMDMKKyNkZWZpbmUJRjJTSVoJMTA0CisjZGVmaW5lCVZQU0laCTEwNQorCisjZGVmaW5lCVRPVEFMX0JPQVJECTIKKyNkZWZpbmUJQ1VSUkVOVF9CUkQJNAorI2RlZmluZQlCT0FSRF9UWVBFCTYKKyNkZWZpbmUJSU9fQUREUkVTUwk4CisjZGVmaW5lCU1FTV9BRERSRVNTCTEwCisKKyNkZWZpbmUJRklFTERTX1BFUl9QQUdFCTE4CisKKyNkZWZpbmUgVEJfRklFTEQJMQorI2RlZmluZSBDQl9GSUVMRAkzCisjZGVmaW5lIEJUX0ZJRUxECTUKKyNkZWZpbmUgSU9fRklFTEQJNworI2RlZmluZSBJRF9GSUVMRAk4CisjZGVmaW5lIE1FX0ZJRUxECTkKKyNkZWZpbmUgVFRZX0ZJRUxECTExCisjZGVmaW5lIENVX0ZJRUxECTEzCisjZGVmaW5lIFBSX0ZJRUxECTE1CisjZGVmaW5lIE1QUl9GSUVMRAkxNworCisjZGVmaW5lCU1BWF9GSUVMRAk1MTIKKworI2RlZmluZQlJTklUCQkwCisjZGVmaW5lCU5JVEVNUwkJMTI4CisjZGVmaW5lIE1BWF9JVEVNCTUxMgorCisjZGVmaW5lCURTQ1JJTlNUCTEKKyNkZWZpbmUJRFNDUk5VTQkJMworI2RlZmluZQlBTFRQSU5RCQk1CisjZGVmaW5lCVNTQVZFCQk3CisKKyNkZWZpbmUJRFNDUgkJIjMyIgorI2RlZmluZQlPTkVUT05JTkUJIjEyMzQ1Njc4OSIKKyNkZWZpbmUJQUxMCQkiMTIzNDU2Nzg5MCIKKworLyoKKyAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoZSBkcml2ZXIgY2FuIGJlIHdoaWxlIGJlaW5nIGxvYWRlZC4KKyAqLworZW51bSB7CisJRFJJVkVSX0lOSVRJQUxJWkVEID0gMCwKKwlEUklWRVJfUkVBRFkKK307CisKKy8qCisgKiBBbGwgdGhlIHBvc3NpYmxlIHN0YXRlcyB0aGUgYm9hcmQgY2FuIGJlIHdoaWxlIGJvb3RpbmcgdXAuCisgKi8KK2VudW0geworCUJPQVJEX0ZBSUxFRCA9IDAsCisJQk9BUkRfUkVBRFkKK307CisKKy8qCisgKiBBbGwgdGhlIHBvc3NpYmxlIHN0YXRlcyB0aGF0IGEgcmVxdWVzdGVkIGNvbmNlbnRyYXRvciBpbWFnZSBjYW4gYmUgaW4uCisgKi8KK2VudW0geworCU5PX1BFTkRJTkdfQ09OQ0VOVFJBVE9SX1JFUVVFU1RTID0gMCwKKwlORUVEX0NPTkNFTlRSQVRPUiwKKwlSRVFVRVNURURfQ09OQ0VOVFJBVE9SCit9OworCisKKworLyoKKyAqIE1vZGVtIGxpbmUgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGFzIG1hY3JvcyBiZWNhdXNlIERTUiBhbmQKKyAqIERDRCBhcmUgc3dhcGFibGUgdXNpbmcgdGhlIGRpdHR5IGFsdHBpbiBvcHRpb24uCisgKi8KKyNkZWZpbmUgRF9DRChjaCkgICAgICAgIGNoLT5jaF9jZCAgICAgICAvKiBDYXJyaWVyIGRldGVjdCAgICAgICAqLworI2RlZmluZSBEX0RTUihjaCkgICAgICAgY2gtPmNoX2RzciAgICAgIC8qIERhdGEgc2V0IHJlYWR5ICAgICAgICovCisjZGVmaW5lIERfUlRTKGNoKSAgICAgICBETV9SVFMgICAgICAgICAgLyogUmVxdWVzdCB0byBzZW5kICAgICAgKi8KKyNkZWZpbmUgRF9DVFMoY2gpICAgICAgIERNX0NUUyAgICAgICAgICAvKiBDbGVhciB0byBzZW5kICAgICAgICAqLworI2RlZmluZSBEX1JJKGNoKSAgICAgICAgRE1fUkkgICAgICAgICAgIC8qIFJpbmcgaW5kaWNhdG9yICAgICAgICovCisjZGVmaW5lIERfRFRSKGNoKSAgICAgICBETV9EVFIgICAgICAgICAgLyogRGF0YSB0ZXJtaW5hbCByZWFkeSAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0cnVjdHVyZXMgYW5kIGNsb3NlbHkgcmVsYXRlZCBkZWZpbmVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBBIHN0cnVjdHVyZSB0byBob2xkIGEgc3RhdGlzdGljcyBjb3VudGVyLiAgV2UgYWxzbworICogY29tcHV0ZSBtb3ZpbmcgYXZlcmFnZXMgZm9yIHRoaXMgY291bnRlci4KKyAqLworc3RydWN0IG1hY291bnRlciB7CisJdTMyCQljbnQ7CS8qIFRvdGFsIGNvdW50ICovCisJdWxvbmcJCWFjY3VtOwkvKiBBY3V1bXVsYXRvciBwZXIgcGVyaW9kICovCisJdWxvbmcJCXNtYTsJLyogU2ltcGxlIG1vdmluZyBhdmVyYWdlICovCisJdWxvbmcJCWVtYTsJLyogRXhwb25lbnRpYWwgbW92aW5nIGF2ZXJhZ2UgKi8KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV2aWNlIGZsYWcgZGVmaW5pdGlvbnMgZm9yIGJkX2ZsYWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQkRfRkVQNVBMVVMJMHgwMDAxICAgICAgICAgIC8qIFN1cHBvcnRzIEZFUDUgUGx1cyBjb21tYW5kcyAqLworI2RlZmluZSBCRF9IQVNfVlBECTB4MDAwMgkJLyogQm9hcmQgaGFzIFZQRCBpbmZvIGF2YWlsYWJsZSAqLworCisvKgorICoJUGVyLWJvYXJkIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBib2FyZF90IHsKKwlpbnQJCW1hZ2ljOwkJLyogQm9hcmQgTWFnaWMgbnVtYmVyLiAgKi8KKwlpbnQJCWJvYXJkbnVtOwkvKiBCb2FyZCBudW1iZXI6IDAtMyAqLworCWludAkJZmlyc3RtaW5vcjsJLyogRmlyc3QgbWlub3IsIGUuZy4gMCwgMzAsIDYwICovCisKKwlpbnQJCXR5cGU7CQkvKiBUeXBlIG9mIGJvYXJkICovCisJY2hhcgkJKm5hbWU7CQkvKiBQcm9kdWN0IE5hbWUgKi8KKwlzdHJ1Y3QgcGNpX2RldgkqcGRldjsJCS8qIFBvaW50ZXIgdG8gdGhlIHBjaV9kZXYgc3RydWN0ICovCisJdTE2CQl2ZW5kb3I7CQkvKiBQQ0kgdmVuZG9yIElEICovCisJdTE2CQlkZXZpY2U7CQkvKiBQQ0kgZGV2aWNlIElEICovCisJdTE2CQlzdWJ2ZW5kb3I7CS8qIFBDSSBzdWJzeXN0ZW0gdmVuZG9yIElEICovCisJdTE2CQlzdWJkZXZpY2U7CS8qIFBDSSBzdWJzeXN0ZW0gZGV2aWNlIElEICovCisJdWNoYXIJCXJldjsJCS8qIFBDSSByZXZpc2lvbiBJRCAqLworCXVpbnQJCXBjaV9idXM7CS8qIFBDSSBidXMgdmFsdWUgKi8KKwl1aW50CQlwY2lfc2xvdDsJLyogUENJIHNsb3QgdmFsdWUgKi8KKwl1MTYJCW1heHBvcnRzOwkvKiBNQVggcG9ydHMgdGhpcyBib2FyZCBjYW4gaGFuZGxlICovCisJdWNoYXIJCXZwZFtWUERTSVpFXTsJLyogVlBEIG9mIGJvYXJkLCBpZiBmb3VuZCAqLworCXUzMgkJYmRfZmxhZ3M7CS8qIEJvYXJkIGZsYWdzICovCisKKwlzcGlubG9ja190CWJkX2xvY2s7CS8qIFVzZWQgdG8gcHJvdGVjdCBib2FyZCAqLworCisJdTMyCQlzdGF0ZTsJCS8qIFN0YXRlIG9mIGNhcmQuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3RhdGVfd2FpdDsJLyogUGxhY2UgdG8gc2xlZXAgb24gZm9yIHN0YXRlIGNoYW5nZSAqLworCisJc3RydWN0CQl0YXNrbGV0X3N0cnVjdCBoZWxwZXJfdGFza2xldDsgLyogUG9sbCBoZWxwZXIgdGFza2xldCAqLworCisJdTMyCQl3YWl0X2Zvcl9iaW9zOworCXUzMgkJd2FpdF9mb3JfZmVwOworCisJc3RydWN0IGNub2RlICAgICpiZF9jb25maWc7CS8qIENvbmZpZyBvZiBib2FyZCAqLworCisJdTE2CQluYXN5bmM7CQkvKiBOdW1iZXIgb2YgcG9ydHMgb24gY2FyZCAqLworCisJdTMyCQl1c2VfaW50ZXJydXB0czsJLyogU2hvdWxkIHdlIGJlIGludGVycnVwdCBkcml2ZW4/ICovCisJdWxvbmcJCWlycTsJCS8qIEludGVycnVwdCByZXF1ZXN0IG51bWJlciAqLworCXVsb25nCQlpbnRyX2NvdW50OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCisJdTMyCQlpbnRyX3VzZWQ7CS8qIE5vbi16ZXJvIGlmIHVzaW5nIGludGVycnVwdHMgKi8KKwl1MzIJCWludHJfcnVubmluZzsJLyogTm9uLXplcm8gaWYgRkVQIGtub3dzIGl0cyBkb2luZyBpbnRlcnJ1cHRzICovCisKKwl1bG9uZwkJcG9ydDsJCS8qIFN0YXJ0IG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLworCXVsb25nCQlwb3J0X2VuZDsJLyogRW5kIG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLworCXVsb25nCQltZW1iYXNlOwkvKiBTdGFydCBvZiBiYXNlIG1lbW9yeSBvZiB0aGUgY2FyZCAqLworCXVsb25nCQltZW1iYXNlX2VuZDsJLyogRW5kIG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCisKKwl1Y2hhciAJCSpyZV9tYXBfcG9ydDsJLyogUmVtYXBwZWQgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLworCXVjaGFyCQkqcmVfbWFwX21lbWJhc2U7LyogUmVtYXBwZWQgbWVtb3J5IG9mIHRoZSBjYXJkICovCisKKwl1Y2hhcgkJcnVud2FpdDsJLyogIyBQcm9jZXNzZXMgd2FpdGluZyBmb3IgRkVQICAqLworCXVjaGFyCQlpbmhpYml0X3BvbGxlcjsgLyogVGVsbHMgIHRoZSBwb2xsZXIgdG8gbGVhdmUgdXMgYWxvbmUgKi8KKworCXN0cnVjdCBjaGFubmVsX3QgKmNoYW5uZWxzW01BWFBPUlRTXTsgLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gb3VyIGNoYW5uZWxzLiAqLworCisJc3RydWN0IHR0eV9kcml2ZXIJKlNlcmlhbERyaXZlcjsKKwlzdHJ1Y3QgdHR5X3BvcnQgKlNlcmlhbFBvcnRzOworCWNoYXIJCVNlcmlhbE5hbWVbMjAwXTsKKwlzdHJ1Y3QgdHR5X2RyaXZlcgkqUHJpbnREcml2ZXI7CisJc3RydWN0IHR0eV9wb3J0ICpQcmludGVyUG9ydHM7CisJY2hhcgkJUHJpbnROYW1lWzIwMF07CisKKwl1MzIJCWRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQ7CisJdTMyCQlkZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZDsKKworCXUzMgkJZGdhcF9TZXJpYWxfTWFqb3I7CisJdTMyCQlkZ2FwX1RyYW5zcGFyZW50UHJpbnRfTWFqb3I7CisKKwlzdHJ1Y3QgYnNfdAkqYmRfYnM7CQkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLworCisJY2hhcgkqZmxpcGJ1ZjsJCS8qIE91ciBmbGlwIGJ1ZmZlciwgYWxsb2NlZCBpZiBib2FyZCBpcyBmb3VuZCAqLworCWNoYXIJKmZsaXBmbGFnYnVmOwkJLyogT3VyIGZsaXAgZmxhZyBidWZmZXIsIGFsbG9jZWQgaWYgYm9hcmQgaXMgZm91bmQgKi8KKworCXUxNgkJZHBhdHlwZTsJLyogVGhlIGJvYXJkICJ0eXBlIiwgYXMgZGVmaW5lZCBieSBEUEEgKi8KKwl1MTYJCWRwYXN0YXR1czsJLyogVGhlIGJvYXJkICJzdGF0dXMiLCBhcyBkZWZpbmVkIGJ5IERQQSAqLworCXdhaXRfcXVldWVfaGVhZF90IGttZV93YWl0OwkvKiBOZWVkZWQgZm9yIERQQSBzdXBwb3J0ICovCisKKwl1MzIJCWNvbmNfZGxfc3RhdHVzOwkvKiBTdGF0dXMgb2YgYW55IHBlbmRpbmcgY29uYyBkb3dubG9hZCAqLworfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVuaXQgZmxhZyBkZWZpbml0aW9ucyBmb3IgdW5fZmxhZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVTl9JU09QRU4JMHgwMDAxCQkvKiBEZXZpY2UgaXMgb3BlbgkJKi8KKyNkZWZpbmUgVU5fQ0xPU0lORwkweDAwMDIJCS8qIExpbmUgaXMgYmVpbmcgY2xvc2VkCQkqLworI2RlZmluZSBVTl9JTU0JCTB4MDAwNAkJLyogU2VydmljZSBpbW1lZGlhdGVseQkJKi8KKyNkZWZpbmUgVU5fQlVTWQkJMHgwMDA4CQkvKiBTb21lIHdvcmsgdGhpcyBjaGFubmVsCSovCisjZGVmaW5lIFVOX0JSRUFLSQkweDAwMTAJCS8qIElucHV0IGJyZWFrIHJlY2VpdmVkCQkqLworI2RlZmluZSBVTl9QV0FJVAkweDAwMjAJCS8qIFByaW50ZXIgd2FpdGluZyBmb3IgdGVybWluYWwJKi8KKyNkZWZpbmUgVU5fVElNRQkJMHgwMDQwCQkvKiBXYWl0aW5nIG9uIHRpbWUJCSovCisjZGVmaW5lIFVOX0VNUFRZCTB4MDA4MAkJLyogV2FpdGluZyBvdXRwdXQgcXVldWUgZW1wdHkJKi8KKyNkZWZpbmUgVU5fTE9XCQkweDAxMDAJCS8qIFdhaXRpbmcgb3V0cHV0IGxvdyB3YXRlciBtYXJrKi8KKyNkZWZpbmUgVU5fRVhDTF9PUEVOCTB4MDIwMAkJLyogT3BlbiBmb3IgZXhjbHVzaXZlIHVzZQkqLworI2RlZmluZSBVTl9XT1BFTgkweDA0MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCisjZGVmaW5lIFVOX1dJT0NUTAkweDA4MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCisjZGVmaW5lIFVOX0hBTkdVUAkweDgwMDAJCS8qIENhcnJpZXIgbG9zdAkJCSovCisKK3N0cnVjdCBkZXZpY2U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0cnVjdHVyZSBmb3IgdGVybWluYWwgb3IgcHJpbnRlciB1bml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCB1bl90IHsKKwlpbnQJbWFnaWM7CQkvKiBVbml0IE1hZ2ljIE51bWJlci4JCQkqLworCXN0cnVjdAljaGFubmVsX3QgKnVuX2NoOworCXUzMgl1bl90aW1lOworCXUzMgl1bl90eXBlOworCXUzMgl1bl9vcGVuX2NvdW50OwkvKiBDb3VudGVyIG9mIG9wZW5zIHRvIHBvcnQJCSovCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnVuX3R0eTsvKiBQb2ludGVyIHRvIHVuaXQgdHR5IHN0cnVjdHVyZQkqLworCXUzMgl1bl9mbGFnczsJLyogVW5pdCBmbGFncwkJCQkqLworCXdhaXRfcXVldWVfaGVhZF90IHVuX2ZsYWdzX3dhaXQ7IC8qIFBsYWNlIHRvIHNsZWVwIHRvIHdhaXQgb24gdW5pdCAqLworCXUzMgl1bl9kZXY7CQkvKiBNaW5vciBkZXZpY2UgbnVtYmVyCQkJKi8KKwl0Y2ZsYWdfdCB1bl9vZmxhZzsJLyogb2ZsYWdzIGJlaW5nIGRvbmUgb24gYm9hcmQJCSovCisJdGNmbGFnX3QgdW5fbGZsYWc7CS8qIGxmbGFncyBiZWluZyBkb25lIG9uIGJvYXJkCQkqLworCXN0cnVjdCBkZXZpY2UgKnVuX3N5c2ZzOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgZmxhZyBkZWZpbml0aW9ucyBmb3IgY2hfZmxhZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDSF9QUk9OICAgICAgICAgMHgwMDAxICAgICAgICAgIC8qIFByaW50ZXIgb24gc3RyaW5nICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENIX09VVCAgICAgICAgICAweDAwMDIgICAgICAgICAgLyogRGlhbC1vdXQgZGV2aWNlIG9wZW4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfU1RPUCAgICAgICAgIDB4MDAwNCAgICAgICAgICAvKiBPdXRwdXQgaXMgc3RvcHBlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDSF9TVE9QSSAgICAgICAgMHgwMDA4ICAgICAgICAgIC8qIElucHV0IGlzIHN0b3BwZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENIX0NEICAgICAgICAgICAweDAwMTAgICAgICAgICAgLyogQ2FycmllciBpcyBwcmVzZW50ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfRkNBUiAgICAgICAgIDB4MDAyMCAgICAgICAgICAvKiBDYXJyaWVyIGZvcmNlZCBvbiAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENIX1JYQkxPQ0sgICAgICAweDAwODAgICAgICAgICAgLyogRW5hYmxlIHJ4IGJsb2NrZWQgZmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0hfV0xPVyAgICAgICAgIDB4MDEwMCAgICAgICAgICAvKiBUZXJtIHdhaXRpbmcgbG93IGV2ZW50ICAgICAgICAgICAqLworI2RlZmluZSBDSF9XRU1QVFkgICAgICAgMHgwMjAwICAgICAgICAgIC8qIFRlcm0gd2FpdGluZyBlbXB0eSBldmVudCAgICAgICAgICovCisjZGVmaW5lIENIX1JFTkFCTEUgICAgICAweDA0MDAgICAgICAgICAgLyogQnVmZmVyIGp1c3QgZW1wdGllZCAgICAgICAgICAqLworI2RlZmluZSBDSF9SQUNUSVZFICAgICAgMHgwODAwICAgICAgICAgIC8qIFByb2Nlc3MgYWN0aXZlIGluIHh4cmVhZCgpICAgKi8KKyNkZWZpbmUgQ0hfUldBSVQgICAgICAgIDB4MTAwMCAgICAgICAgICAvKiBQcm9jZXNzIHdhaXRpbmcgaW4geHhyZWFkKCkgICovCisjZGVmaW5lIENIX0JBVUQwCTB4MjAwMAkJLyogVXNlZCBmb3IgY2hlY2tpbmcgQjAgdHJhbnNpdGlvbnMgKi8KKyNkZWZpbmUgQ0hfSEFOR1VQICAgICAgIDB4ODAwMAkJLyogSGFuZ3VwIHJlY2VpdmVkICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBjaF9zbmlmZl9mbGFncworICovCisjZGVmaW5lIFNOSUZGX09QRU4JMHgxCisjZGVmaW5lIFNOSUZGX1dBSVRfREFUQQkweDIKKyNkZWZpbmUgU05JRkZfV0FJVF9TUEFDRSAweDQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqCURlZmluaXRpb25zIGZvciBEaWdpIGRpdHR5KDEpIGNvbW1hbmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhcHBsaWNhdGlvbiBhY2Nlc3MgdG8gc3BlY2lhbCBEaWdpCisgKiBzZXJpYWwgbGluZSBlbmhhbmNlbWVudHMgd2hpY2ggYXJlIG5vdCBzdGFuZGFyZCBVTklYKHRtKSBmZWF0dXJlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChUSU9DTU9ERykKKworI2RlZmluZQlUSU9DTU9ERwkoKCdkJzw8OCkgfCAyNTApCQkvKiBnZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTU9EUwkoKCdkJzw8OCkgfCAyNTEpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworCisjaWZuZGVmIFRJT0NNX0xFCisjZGVmaW5lCQlUSU9DTV9MRQkweDAxCQkvKiBsaW5lIGVuYWJsZQkJKi8KKyNkZWZpbmUJCVRJT0NNX0RUUgkweDAyCQkvKiBkYXRhIHRlcm1pbmFsIHJlYWR5CSovCisjZGVmaW5lCQlUSU9DTV9SVFMJMHgwNAkJLyogcmVxdWVzdCB0byBzZW5kCSovCisjZGVmaW5lCQlUSU9DTV9TVAkweDA4CQkvKiBzZWNvbmRhcnkgdHJhbnNtaXQJKi8KKyNkZWZpbmUJCVRJT0NNX1NSCTB4MTAJCS8qIHNlY29uZGFyeSByZWNlaXZlCSovCisjZGVmaW5lCQlUSU9DTV9DVFMJMHgyMAkJLyogY2xlYXIgdG8gc2VuZAkqLworI2RlZmluZQkJVElPQ01fQ0FSCTB4NDAJCS8qIGNhcnJpZXIgZGV0ZWN0CSovCisjZGVmaW5lCQlUSU9DTV9STkcJMHg4MAkJLyogcmluZwlpbmRpY2F0b3IJKi8KKyNkZWZpbmUJCVRJT0NNX0RTUgkweDEwMAkJLyogZGF0YSBzZXQgcmVhZHkJKi8KKyNkZWZpbmUJCVRJT0NNX1JJCVRJT0NNX1JORwkvKiByaW5nIChhbHRlcm5hdGUpCSovCisjZGVmaW5lCQlUSU9DTV9DRAlUSU9DTV9DQVIJLyogY2FycmllciBkZXRlY3QgKGFsdCkJKi8KKyNlbmRpZgorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFRJT0NNU0VUKQorI2RlZmluZQlUSU9DTVNFVAkoKCdkJzw8OCkgfCAyNTIpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2RlZmluZQlUSU9DTUdFVAkoKCdkJzw8OCkgfCAyNTMpCQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChUSU9DTUJJQykKKyNkZWZpbmUJVElPQ01CSUMJKCgnZCc8PDgpIHwgMjU0KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNkZWZpbmUJVElPQ01CSVMJKCgnZCc8PDgpIHwgMjU1KQkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChUSU9DU0RUUikKKyNkZWZpbmUJVElPQ1NEVFIJKCgnZSc8PDgpIHwgMCkJCS8qIHNldCBEVFIJCSovCisjZGVmaW5lCVRJT0NDRFRSCSgoJ2UnPDw4KSB8IDEpCQkvKiBjbGVhciBEVFIJCSovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW9jdGwgY29tbWFuZCBhcmd1bWVudHMgZm9yIERJR0kgcGFyYW1ldGVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJR0lfR0VUQQkoKCdlJzw8OCkgfCA5NCkJCS8qIFJlYWQgcGFyYW1zCQkqLworCisjZGVmaW5lIERJR0lfU0VUQQkoKCdlJzw8OCkgfCA5NSkJCS8qIFNldCBwYXJhbXMJCSovCisjZGVmaW5lIERJR0lfU0VUQVcJKCgnZSc8PDgpIHwgOTYpCQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KKyNkZWZpbmUgRElHSV9TRVRBRgkoKCdlJzw8OCkgfCA5NykJCS8qIERyYWluLCBmbHVzaCAmIHNldCBwYXJhbXMgKi8KKworI2RlZmluZSBESUdJX0tNRQkoKCdlJzw8OCkgfCA5OCkJCS8qIFJlYWQvV3JpdGUgSG9zdAkqLworCQkJCQkJLyogQWRhcHRlciBNZW1vcnkJKi8KKworI2RlZmluZQlESUdJX0dFVEZMT1cJKCgnZSc8PDgpIHwgOTkpCQkvKiBHZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKwkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAJICovCisjZGVmaW5lCURJR0lfU0VURkxPVwkoKCdlJzw8OCkgfCAxMDApCQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KKwkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycwkgKi8KKyNkZWZpbmUJRElHSV9HRVRBRkxPVwkoKCdlJzw8OCkgfCAxMDEpCQkvKiBHZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KKwkJCQkJCS8qIGZsb3cgY29udHJvbCBjaGFycyAJICovCisjZGVmaW5lCURJR0lfU0VUQUZMT1cJKCgnZSc8PDgpIHwgMTAyKQkJLyogU2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCisJCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMJICovCisKKyNkZWZpbmUgRElHSV9HRURFTEFZCSgoJ2QnPDw4KSB8IDI0NikJCS8qIEdldCBlZGVsYXkgKi8KKyNkZWZpbmUgRElHSV9TRURFTEFZCSgoJ2QnPDw4KSB8IDI0NykJCS8qIFNldCBlZGVsYXkgKi8KKworc3RydWN0CWRpZ2lmbG93X3QgeworCXVuc2lnbmVkIGNoYXIJc3RhcnRjOwkJCQkvKiBmbG93IGNudGwgc3RhcnQgY2hhcgkqLworCXVuc2lnbmVkIGNoYXIJc3RvcGM7CQkJCS8qIGZsb3cgY250bCBzdG9wIGNoYXIJKi8KK307CisKKworI2lmZGVmCUZMT1dfMjIwMAorI2RlZmluZQlGMjIwMF9HRVRBCSgoJ2UnPDw4KSB8IDEwNCkJCS8qIEdldCAyeDM2IGZsb3cgY250bCBmbGFncyAqLworI2RlZmluZQlGMjIwMF9TRVRBVwkoKCdlJzw8OCkgfCAxMDUpCQkvKiBTZXQgMngzNiBmbG93IGNudGwgZmxhZ3MgKi8KKyNkZWZpbmUJCUYyMjAwX01BU0sJMHgwMwkJLyogMjIwMCBmbG93IGNudGwgYml0IG1hc2sgICovCisjZGVmaW5lCQlGQ05UTF8yMjAwCTB4MDEJCS8qIDJ4MzYgdGVybWluYWwgZmxvdyBjbnRsICAqLworI2RlZmluZQkJUENOVExfMjIwMAkweDAyCQkvKiAyeDM2IHByaW50ZXIgZmxvdyBjbnRsICAgKi8KKyNkZWZpbmUJRjIyMDBfWE9OCTB4ZjgKKyNkZWZpbmUJUDIyMDBfWE9OCTB4ZjkKKyNkZWZpbmUJRjIyMDBfWE9GRgkweGZhCisjZGVmaW5lCVAyMjAwX1hPRkYJMHhmYgorCisjZGVmaW5lCUZYT0ZGX01BU0sJMHgwMwkJCS8qIDIyMDAgZmxvdyBzdGF0dXMgbWFzayAgICAqLworI2RlZmluZQlSQ1ZEX0ZYT0ZGCTB4MDEJCQkvKiAyeDM2IFRlcm1pbmFsIFhPRkYgcmN2ZCAgKi8KKyNkZWZpbmUJUkNWRF9QWE9GRgkweDAyCQkJLyogMngzNiBQcmludGVyIFhPRkYgcmN2ZCAgICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFsdWVzIGZvciBkaWdpX2ZsYWdzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBESUdJX0lYT04JMHgwMDAxCQkvKiBIYW5kbGUgSVhPTiBpbiB0aGUgRkVQCSovCisjZGVmaW5lIERJR0lfRkFTVAkweDAwMDIJCS8qIEZhc3QgYmF1ZCByYXRlcwkJKi8KKyNkZWZpbmUgUlRTUEFDRQkJMHgwMDA0CQkvKiBSVFMgaW5wdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIENUU1BBQ0UJCTB4MDAwOAkJLyogQ1RTIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KKyNkZWZpbmUgRFNSUEFDRQkJMHgwMDEwCQkvKiBEU1Igb3V0cHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBEQ0RQQUNFCQkweDAwMjAJCS8qIERDRCBvdXRwdXQgZmxvdyBjb250cm9sCSovCisjZGVmaW5lIERUUlBBQ0UJCTB4MDA0MAkJLyogRFRSIGlucHV0IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBESUdJX0NPT0sJMHgwMDgwCQkvKiBDb29rZWQgcHJvY2Vzc2luZyBkb25lIGluIEZFUCAqLworI2RlZmluZSBESUdJX0ZPUkNFRENECTB4MDEwMAkJLyogRm9yY2UgY2FycmllcgkJKi8KKyNkZWZpbmUJRElHSV9BTFRQSU4JMHgwMjAwCQkvKiBBbHRlcm5hdGUgUkotNDUgcGluIGNvbmZpZwkqLworI2RlZmluZQlESUdJX0FJWE9OCTB4MDQwMAkJLyogQXV4IGZsb3cgY29udHJvbCBpbiBmZXAJKi8KKyNkZWZpbmUJRElHSV9QUklOVEVSCTB4MDgwMAkJLyogSG9sZCBwb3J0IG9wZW4gZm9yIGZsb3cgY250cmwqLworI2RlZmluZSBESUdJX1BQX0lOUFVUCTB4MTAwMAkJLyogQ2hhbmdlIHBhcmFsbGVsIHBvcnQgdG8gaW5wdXQqLworI2RlZmluZSBESUdJX0RUUl9UT0dHTEUgMHgyMDAwCQkvKiBTdXBwb3J0IERUUiBUb2dnbGUJCSovCisjZGVmaW5lCURJR0lfNDIyCTB4NDAwMAkJLyogZm9yIDQyMi8yMzIgc2VsZWN0YWJsZSBwYW5lbCAqLworI2RlZmluZSBESUdJX1JUU19UT0dHTEUJMHg4MDAwCQkvKiBTdXBwb3J0IFJUUyBUb2dnbGUJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZXNlIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGNvbXhpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJRElHSV9DT01YSQkoRElHSV9GQVNUfERJR0lfQ09PS3xEU1JQQUNFfERDRFBBQ0V8RFRSUEFDRSkKKworI2RlZmluZSBESUdJX1BMRU4JMjgJCS8qIFN0cmluZyBsZW5ndGgJCSovCisjZGVmaW5lCURJR0lfVFNJWgkxMAkJLyogVGVybWluYWwgc3RyaW5nIGxlbgkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlIHVzZWQgd2l0aCBpb2N0bCBjb21tYW5kcyBmb3IgRElHSSBwYXJhbWV0ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkaWdpX3QgeworCXVuc2lnbmVkIHNob3J0CWRpZ2lfZmxhZ3M7CQkvKiBGbGFncyAoc2VlIGFib3ZlKQkqLworCXVuc2lnbmVkIHNob3J0CWRpZ2lfbWF4Y3BzOwkJLyogTWF4IHByaW50ZXIgQ1BTCSovCisJdW5zaWduZWQgc2hvcnQJZGlnaV9tYXhjaGFyOwkJLyogTWF4IGNoYXJzIGluIHByaW50IHF1ZXVlICovCisJdW5zaWduZWQgc2hvcnQJZGlnaV9idWZzaXplOwkJLyogQnVmZmVyIHNpemUJCSovCisJdW5zaWduZWQgY2hhcglkaWdpX29ubGVuOwkJLyogTGVuZ3RoIG9mIE9OIHN0cmluZwkqLworCXVuc2lnbmVkIGNoYXIJZGlnaV9vZmZsZW47CQkvKiBMZW5ndGggb2YgT0ZGIHN0cmluZwkqLworCWNoYXIJCWRpZ2lfb25zdHJbRElHSV9QTEVOXTsJLyogUHJpbnRlciBvbiBzdHJpbmcJKi8KKwljaGFyCQlkaWdpX29mZnN0cltESUdJX1BMRU5dOwkvKiBQcmludGVyIG9mZiBzdHJpbmcJKi8KKwljaGFyCQlkaWdpX3Rlcm1bRElHSV9UU0laXTsJLyogdGVybWluYWwgc3RyaW5nCSovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBLTUUgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlSV19JRExFCQkwCS8qIE9wZXJhdGlvbiBjb21wbGV0ZQkJCSovCisjZGVmaW5lCVJXX1JFQUQJCTEJLyogUmVhZCBDb25jZW50cmF0b3IgTWVtb3J5CQkqLworI2RlZmluZQlSV19XUklURQkyCS8qIFdyaXRlIENvbmNlbnRyYXRvciBNZW1vcnkJCSovCisKK3N0cnVjdCByd190IHsKKwl1bnNpZ25lZCBjaGFyCXJ3X3JlcTsJCS8qIFJlcXVlc3QgdHlwZQkJCSovCisJdW5zaWduZWQgY2hhcglyd19ib2FyZDsJLyogSG9zdCBBZGFwdGVyIGJvYXJkIG51bWJlcgkqLworCXVuc2lnbmVkIGNoYXIJcndfY29uYzsJLyogQ29uY2VudHJhdG9yIG51bWJlcgkJKi8KKwl1bnNpZ25lZCBjaGFyCXJ3X3Jlc2VydmVkOwkvKiBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uCSovCisJdW5zaWduZWQgbG9uZwlyd19hZGRyOwkvKiBBZGRyZXNzIGluIGNvbmNlbnRyYXRvcgkqLworCXVuc2lnbmVkIHNob3J0CXJ3X3NpemU7CS8qIFJlYWQvd3JpdGUgcmVxdWVzdCBsZW5ndGgJKi8KKwl1bnNpZ25lZCBjaGFyCXJ3X2RhdGFbMTI4XTsJLyogRGF0YSB0byByZWFkL3dyaXRlCQkqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaHJpbmsgQnVmZmVyIGFuZCBCb2FyZCBJbmZvcm1hdGlvbiBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJCS8qIEJvYXJkIHR5cGUgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lCVBDWElfVFlQRSAxICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YaSAqLworI2RlZmluZSBQQ1hNX1RZUEUgMiAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWG0gKi8KKyNkZWZpbmUJUENYRV9UWVBFIDMgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1hlICovCisjZGVmaW5lCU1DWElfVFlQRSA0ICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBNQy9YaSAqLworI2RlZmluZSBDT01YSV9UWVBFIDUgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIENPTS9YaSAqLworCisJCQkgLyogTm9uLVplcm8gUmVzdWx0IGNvZGVzLiAqLworI2RlZmluZSBSRVNVTFRfTk9CREZORCAxIC8qIEEgRGlnaSBwcm9kdWN0IGF0IHRoYXQgcG9ydCBpcyBub3QgY29uZmlnIGluc3RhbGxlZCAqLworI2RlZmluZSBSRVNVTFRfTk9ERVNDVCAyIC8qIEEgbWVtb3J5IGRlc2NyaXB0b3Igd2FzIG5vdCBvYnRhaW5hYmxlICovCisjZGVmaW5lIFJFU1VMVF9OT09TU0lHIDMgLyogRkVQL09TIHNpZ25hdHVyZSB3YXMgbm90IGRldGVjdGVkIG9uIHRoZSBib2FyZCAqLworI2RlZmluZSBSRVNVTFRfVE9PU01MICA0IC8qIFRvbyBzbWFsbCBhbiBhcmVhIHRvIHNocmluay4gICovCisjZGVmaW5lIFJFU1VMVF9OT0NIQU4gIDUgLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgZm9yIHRoZSBib2FyZCB3YXMgbm90IGZvdW5kICovCisKK3N0cnVjdCBzaHJpbmtfYnVmX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3ZhZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYm9hcmQgKi8KKwl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcGh5czsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBib2FyZCAqLworCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9ic2VnOwkvKiBBbW91bnQgb2YgYm9hcmQgbWVtb3J5ICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2hzZWc7CS8qICcxODYgQmVnaW5uaW5nIG9mIER1YWwtUG9ydCAqLworCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2xzZWc7CS8qICcxODYgQmVnaW5uaW5nIG9mIGZyZWVkIG1lbW9yeQkJCQkJCSovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX21zZWc7CS8qIExpbmVhciBhZGRyZXNzIGZyb20gc3RhcnQgb2YKKwkJCQkJCSAgIGR1YWwtcG9ydCB3ZXJlIGZyZWVkIG1lbW9yeQorCQkJCQkJICAgYmVnaW5zLCBob3N0IHZpZXdwb2ludC4gKi8KKworCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9iZHBhcmFtOwkvKiBQYXJhbWV0ZXIgZm9yIHh4bWVtb24gYW5kCisJCQkJCQkgICB4eG1lbW9mZiAqLworCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmE7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmI7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmM7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3Jlc2VydmQ7CS8qIFJlc2VydmVkICovCisKKwl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfcmVzdWx0OwkvKiBSZWFzb24gZm9yIGNhbGwgZmFpbGluZworCQkJCQkJICAgWmVybyBpcyBHb29kIHJldHVybiAqLworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9pbml0OwkvKiBOb24tWmVybyBpZiBpdCBjYXVzZWQgYW4KKwkJCQkJCSAgIHh4aW5pdCBjYWxsLiAqLworCisJdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2FucG9ydHM7CS8qIE51bWJlciBvZiBhc3luYyBwb3J0cyAgKi8KKwl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfc25wb3J0czsgCS8qIE51bWJlciBvZiBzeW5jICBwb3J0cyAqLworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl90eXBlOwkvKiBCb2FyZCB0eXBlIDEgPSBQQy9YaSwKKwkJCQkJCQkgICAgICAyID0gUEMvWG0sCisJCQkJCQkJICAgICAgMyA9IFBDL1hlCisJCQkJCQkJICAgICAgNCA9IE1DL1hpCisJCQkJCQkJICAgICAgNSA9IENPTVgvaSAqLworCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9jYXJkOwkvKiBDYXJkIG51bWJlciAqLworCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgdG8gZ2V0IGRyaXZlciBzdGF0dXMgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZGlnaV9kaW5mbyB7CisJdW5zaWduZWQgbG9uZwlkaW5mb19uYm9hcmRzOwkJLyogIyBib2FyZHMgY29uZmlndXJlZAkqLworCWNoYXIJCWRpbmZvX3Jlc2VydmVkWzEyXTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwljaGFyCQlkaW5mb192ZXJzaW9uWzE2XTsJLyogZHJpdmVyIHZlcnNpb24gICAgICAgKi8KK307CisKKyNkZWZpbmUJRElHSV9HRVRERAkoKCdkJzw8OCkgfCAyNDgpCQkvKiBnZXQgZHJpdmVyIGluZm8gICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBwZXItYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBwaHlzc2l6ZSBhbmQgbWVtc2l6ZSBkaWZmZXIgd2hlbiBib2FyZCBoYXMgIndpbmRvd2VkIiBtZW1vcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZGlnaV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nCWluZm9fYmRudW07CQkvKiBCb2FyZCBudW1iZXIgKDAgYmFzZWQpICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19pb3BvcnQ7CQkvKiBpbyBwb3J0IGFkZHJlc3MgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19waHlzYWRkcjsJCS8qIG1lbW9yeSBhZGRyZXNzICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3BoeXNzaXplOwkJLyogU2l6ZSBvZiBob3N0IG1lbSB3aW5kb3cgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fbWVtc2l6ZTsJCS8qIEFtb3VudCBvZiBkdWFsLXBvcnQgbWVtICovCisJCQkJCQkvKiBvbiBib2FyZCAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0CWluZm9fYmR0eXBlOwkJLyogQm9hcmQgdHlwZSAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydAlpbmZvX25wb3J0czsJCS8qIG51bWJlciBvZiBwb3J0cyAgICAgICAgICovCisJY2hhcgkJaW5mb19iZHN0YXRlOwkJLyogYm9hcmQgc3RhdGUgICAgICAgICAgICAgKi8KKwljaGFyCQlpbmZvX3Jlc2VydmVkWzddOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAgICAqLworfTsKKworI2RlZmluZQlESUdJX0dFVEJECSgoJ2QnPDw4KSB8IDI0OSkJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCisKK3N0cnVjdCBkaWdpX3N0YXQgeworCXVuc2lnbmVkIGludAlpbmZvX2NoYW47CQkvKiBDaGFubmVsIG51bWJlciAoMCBiYXNlZCkgICovCisJdW5zaWduZWQgaW50CWluZm9fYnJkOwkJLyogQm9hcmQgbnVtYmVyICgwIGJhc2VkKSAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2ZsYWc7CQkvKiBjZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19pZmxhZzsJCS8qIGlmbGFnIGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX29mbGFnOwkJLyogb2ZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fbXN0YXQ7CQkvKiBtc3RhdCBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb190eF9kYXRhOwkJLyogdHhfZGF0YSBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19yeF9kYXRhOwkJLyogcnhfZGF0YSBmb3IgY2hhbm5lbCAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19oZmxvdzsJCS8qIGhmbG93IGZvciBjaGFubmVsICAgICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3Jlc2VydmVkWzhdOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAgICAqLworfTsKKworI2RlZmluZQlESUdJX0dFVFNUQVQJKCgnZCc8PDgpIHwgMjQ0KQkJLyogZ2V0IGJvYXJkIGluZm8gICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBwZXItY2hhbm5lbCBpbmZvcm1hdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZGlnaV9jaCB7CisJdW5zaWduZWQgbG9uZwlpbmZvX2JkbnVtOwkJLyogQm9hcmQgbnVtYmVyICgwIGJhc2VkKSAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2hhbm5lbDsJCS8qIENoYW5uZWwgaW5kZXggbnVtYmVyICAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2NoX2NmbGFnOwkJLyogQ2hhbm5lbCBjZmxhZyAgIAkgICAqLworCXVuc2lnbmVkIGxvbmcJaW5mb19jaF9pZmxhZzsJCS8qIENoYW5uZWwgaWZsYWcgICAJICAgKi8KKwl1bnNpZ25lZCBsb25nCWluZm9fY2hfb2ZsYWc7CQkvKiBDaGFubmVsIG9mbGFnICAgCSAgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX2Noc2l6ZTsJCS8qIENoYW5uZWwgc3RydWN0dXJlIHNpemUgICovCisJdW5zaWduZWQgbG9uZwlpbmZvX3NsZWVwX3N0YXQ7CS8qIHNsZWVwIHN0YXR1cwkJICAgKi8KKwlkZXZfdAkJaW5mb19kZXY7CQkvKiBkZXZpY2UgbnVtYmVyCSAgICovCisJdW5zaWduZWQgY2hhcglpbmZvX2luaXRzdGF0ZTsJCS8qIENoYW5uZWwgaW5pdCBzdGF0ZQkgICAqLworCXVuc2lnbmVkIGNoYXIJaW5mb19ydW5uaW5nOwkJLyogQ2hhbm5lbCBydW5uaW5nIHN0YXRlICAgKi8KKwlsb25nCQlyZXNlcnZlZFs4XTsJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9OworCisvKgorKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdpdGggdGhlIERJR0lfRkVQQ01EIGlvY3RsIHRvCisqIHRlbGwgdGhlIGRyaXZlciB3aGljaCBwb3J0IHRvIHNlbmQgdGhlIGNvbW1hbmQgZm9yLgorKi8KK3N0cnVjdCBkaWdpX2NtZCB7CisJaW50CWNtZDsKKwlpbnQJd29yZDsKKwlpbnQJbmNtZHM7CisJaW50CWNoYW47IC8qIGNoYW5uZWwgaW5kZXggKHplcm8gYmFzZWQpICovCisJaW50CWJkaWQ7IC8qIGJvYXJkIGluZGV4ICh6ZXJvIGJhc2VkKSAqLworfTsKKworLyoKKyogIGluZm9fc2xlZXBfc3RhdCBkZWZpbmVzCisqLworI2RlZmluZSBJTkZPX1JVTldBSVQJMHgwMDAxCisjZGVmaW5lIElORk9fV09QRU4JMHgwMDAyCisjZGVmaW5lIElORk9fVFRJT1cJMHgwMDA0CisjZGVmaW5lIElORk9fQ0hfUldBSVQJMHgwMDA4CisjZGVmaW5lIElORk9fQ0hfV0VNUFRZCTB4MDAxMAorI2RlZmluZSBJTkZPX0NIX1dMT1cJMHgwMDIwCisjZGVmaW5lIElORk9fWFhCVUZfQlVTWSAweDAwNDAKKworI2RlZmluZQlESUdJX0dFVENICSgoJ2QnPDw4KSB8IDI0NSkJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCisKKy8qIEJvYXJkIHR5cGUgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZQlTVUJUWVBFCQkwMDA3CisjZGVmaW5lCVRfUENYSQkJMDAwMAorI2RlZmluZSBUX1BDWE0JCTAwMDEKKyNkZWZpbmUgVF9QQ1hFCQkwMDAyCisjZGVmaW5lIFRfUENYUgkJMDAwMworI2RlZmluZSBUX1NQCQkwMDA0CisjZGVmaW5lIFRfU1BfUExVUwkwMDA1CisjCWRlZmluZSBUX0hFUkMJMDAwMAorIwlkZWZpbmUgVF9IT1UJMDAwMQorIwlkZWZpbmUgVF9MT04JMDAwMgorIwlkZWZpbmUgVF9DSEEJMDAwMworI2RlZmluZSBGQU1JTFkJCTAwNzAKKyNkZWZpbmUgVF9DT01YSQkJMDAwMAorI2RlZmluZSBUX1BDWFgJCTAwMTAKKyNkZWZpbmUgVF9DWAkJMDAyMAorI2RlZmluZSBUX0VQQwkJMDAzMAorI2RlZmluZQlUX1BDTElURQkwMDQwCisjZGVmaW5lCVRfU1BYWAkJMDA1MAorI2RlZmluZQlUX0FWWFgJCTAwNjAKKyNkZWZpbmUgVF9EWEIJCTAwNzAKKyNkZWZpbmUgVF9BMktfNF84CTAwNzAKKyNkZWZpbmUgQlVTVFlQRQkJMDcwMAorI2RlZmluZSBUX0lTQUJVUwkwMDAwCisjZGVmaW5lIFRfTUNCVVMJCTAxMDAKKyNkZWZpbmUJVF9FSVNBQlVTCTAyMDAKKyNkZWZpbmUJVF9QQ0lCVVMJMDQwMAorCisvKiBCb2FyZCBTdGF0ZSBEZWZpbml0aW9ucyAqLworCisjZGVmaW5lCUJEX1JVTk5JTkcJMHgwCisjZGVmaW5lCUJEX1JFQVNPTgkweDdmCisjZGVmaW5lCUJEX05PVEZPVU5ECTB4MQorI2RlZmluZQlCRF9OT0lPUE9SVAkweDIKKyNkZWZpbmUJQkRfTk9NRU0JMHgzCisjZGVmaW5lCUJEX05PQklPUwkweDQKKyNkZWZpbmUJQkRfTk9GRVAJMHg1CisjZGVmaW5lCUJEX0ZBSUxFRAkweDYKKyNkZWZpbmUgQkRfQUxMT0NBVEVECTB4NworI2RlZmluZSBCRF9UUklCT09UCTB4OAorI2RlZmluZQlCRF9CQURLTUUJMHg4MAorCisjZGVmaW5lIERJR0lfTE9PUEJBQ0sJICAgICAgKCgnZCc8PDgpIHwgMjUyKQkJLyogRW5hYmxlL2Rpc2FibGUgVUFSVCBpbnRlcm5hbCBsb29wYmFjayAqLworI2RlZmluZSBESUdJX1NQT0xMICAgICAgICAgICAgKCgnZCc8PDgpIHwgMjU0KQkJLyogY2hhbmdlIHBvbGxlciByYXRlICAgKi8KKworI2RlZmluZSBESUdJX1NFVENVU1RPTUJBVUQJX0lPVygnZScsIDEwNiwgaW50KQkvKiBTZXQgaW50ZWdlciBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgRElHSV9HRVRDVVNUT01CQVVECV9JT1IoJ2UnLCAxMDcsIGludCkJLyogR2V0IGludGVnZXIgYmF1ZCByYXRlICovCisjZGVmaW5lIERJR0lfUkVTRVRfUE9SVAkJKCgnZSc8PDgpIHwgOTMpCQkvKiBSZXNldCBwb3J0CQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGFubmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgY2hhbm5lbF90IHsKKwlpbnQgbWFnaWM7CQkJLyogQ2hhbm5lbCBNYWdpYyBOdW1iZXIJCSovCisJc3RydWN0IGJzX3QJKmNoX2JzOwkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLworCXN0cnVjdCBjbV90CSpjaF9jbTsJCS8qIENvbW1hbmQgcXVldWUgcG9pbnRlciAgICAgICAgKi8KKwlzdHJ1Y3QgYm9hcmRfdCAqY2hfYmQ7CQkvKiBCb2FyZCBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICovCisJdW5zaWduZWQgY2hhciAqY2hfdmFkZHI7CS8qIEZFUCBtZW1vcnkgb3JpZ2luICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICpjaF90YWRkcjsJLyogV3JpdGUgYnVmZmVyIG9yaWdpbiAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgKmNoX3JhZGRyOwkvKiBSZWFkIGJ1ZmZlciBvcmlnaW4gICAgICAgICAgICovCisJc3RydWN0IGRpZ2lfdCAgY2hfZGlnaTsJCS8qIFRyYW5zcGFyZW50IFByaW50IHN0cnVjdHVyZSAgKi8KKwlzdHJ1Y3QgdW5fdCBjaF90dW47CQkvKiBUZXJtaW5hbCB1bml0IGluZm8gICAgICAgICAgICovCisJc3RydWN0IHVuX3QgY2hfcHVuOwkJLyogUHJpbnRlciB1bml0IGluZm8gICAgICAgICAgICAqLworCisJc3BpbmxvY2tfdAljaF9sb2NrOwkvKiBwcm92aWRlIGZvciBzZXJpYWxpemF0aW9uICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgY2hfZmxhZ3Nfd2FpdDsKKworCXUzMglwc2Nhbl9zdGF0ZTsKKwl1Y2hhcglwc2Nhbl9zYXZlY2hhcjsKKworCXUzMiBjaF9wb3J0bnVtOwkJCS8qIFBvcnQgbnVtYmVyLCAwIG9mZnNldC4JKi8KKwl1MzIgY2hfb3Blbl9jb3VudDsJCS8qIG9wZW4gY291bnQJCQkqLworCXUzMgljaF9mbGFnczsJCS8qIENoYW5uZWwgZmxhZ3MgICAgICAgICAgICAgICAgKi8KKworCisJdTMyCWNoX2Nsb3NlX2RlbGF5OwkJLyogSG93IGxvbmcgd2Ugc2hvdWxkIGRyb3AgUlRTL0RUUiBmb3IgKi8KKworCXUzMgljaF9jcHN0aW1lOwkJLyogVGltZSBmb3IgQ1BTIGNhbGN1bGF0aW9ucyAgICAqLworCisJdGNmbGFnX3QgY2hfY19pZmxhZzsJCS8qIGNoYW5uZWwgaWZsYWdzICAgICAgICAgICAgICAgKi8KKwl0Y2ZsYWdfdCBjaF9jX2NmbGFnOwkJLyogY2hhbm5lbCBjZmxhZ3MgICAgICAgICAgICAgICAqLworCXRjZmxhZ190IGNoX2Nfb2ZsYWc7CQkvKiBjaGFubmVsIG9mbGFncyAgICAgICAgICAgICAgICovCisJdGNmbGFnX3QgY2hfY19sZmxhZzsJCS8qIGNoYW5uZWwgbGZsYWdzICAgICAgICAgICAgICAgKi8KKworCXUxNiAgY2hfZmVwaWZsYWc7ICAgICAgICAgICAgLyogRkVQIHR0eSBpZmxhZ3MgICAgICAgICAgICAgICAqLworCXUxNiAgY2hfZmVwY2ZsYWc7CQkvKiBGRVAgdHR5IGNmbGFncyAgICAgICAgICAgICAgICovCisJdTE2ICBjaF9mZXBvZmxhZzsJCS8qIEZFUCB0dHkgb2ZsYWdzICAgICAgICAgICAgICAgKi8KKwl1MTYgIGNoX3dvcGVuOwkJCS8qIFdhaXRpbmcgZm9yIG9wZW4gcHJvY2VzcyBjbnQgKi8KKwl1MTYgIGNoX3RzdGFydDsJCQkvKiBUcmFuc21pdCBidWZmZXIgc3RhcnQgICAgICAgICovCisJdTE2ICBjaF90c2l6ZTsJCQkvKiBUcmFuc21pdCBidWZmZXIgc2l6ZSAgICAgICAgICovCisJdTE2ICBjaF9yc3RhcnQ7CQkJLyogUmVjZWl2ZSBidWZmZXIgc3RhcnQgICAgICAgICAqLworCXUxNiAgY2hfcnNpemU7CQkJLyogUmVjZWl2ZSBidWZmZXIgc2l6ZSAgICAgICAgICAqLworCXUxNiAgY2hfcmRlbGF5OwkJCS8qIFJlY2VpdmUgZGVsYXkgdGltZSAgICAgICAgICAgKi8KKworCXUxNgljaF90bHc7CQkJLyogT3VyIGN1cnJlbnRseSBzZXQgbG93IHdhdGVyIG1hcmsgKi8KKworCXUxNiAgY2hfY29vazsJCQkvKiBPdXRwdXQgY2hhcmFjdGVyIG1hc2sgICAgICAgICovCisKKwl1Y2hhciAgIGNoX2NhcmQ7CQkvKiBDYXJkIGNoYW5uZWwgaXMgb24gICAgICAgICAgICovCisJdWNoYXIgICBjaF9zdG9wYzsJCS8qIFN0b3AgY2hhcmFjdGVyICAgICAgICAgICAgICAgKi8KKwl1Y2hhciAgIGNoX3N0YXJ0YzsJCS8qIFN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAgICAgKi8KKworCXVjaGFyICAgY2hfbW9zdGF0OwkJLyogRkVQIG91dHB1dCBtb2RlbSBzdGF0dXMgICAgICAqLworCXVjaGFyICAgY2hfbWlzdGF0OwkJLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cyAgICAgICAqLworCXVjaGFyICAgY2hfbWZvcmNlOwkJLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICAqLworCXVjaGFyICAgY2hfbXZhbDsJCS8qIEZvcmNlIHZhbHVlcyAgICAgICAgICAgICAgICAgKi8KKwl1Y2hhciAgIGNoX2ZlcHN0b3BjOwkJLyogRkVQIHN0b3AgY2hhcmFjdGVyICAgICAgICAgICAqLworCXVjaGFyICAgY2hfZmVwc3RhcnRjOwkJLyogRkVQIHN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAqLworCisJdWNoYXIgICBjaF9hc3RvcGM7CQkvKiBBdXhpbGlhcnkgU3RvcCBjaGFyYWN0ZXIgICAgICovCisJdWNoYXIgICBjaF9hc3RhcnRjOwkJLyogQXV4aWxpYXJ5IFN0YXJ0IGNoYXJhY3RlciAgICAqLworCXVjaGFyICAgY2hfZmVwYXN0b3BjOwkJLyogQXV4aWxpYXJ5IEZFUCBzdG9wIGNoYXIgICAgICAqLworCXVjaGFyICAgY2hfZmVwYXN0YXJ0YzsJCS8qIEF1eGlsaWFyeSBGRVAgc3RhcnQgY2hhciAgICAgKi8KKworCXVjaGFyICAgY2hfaGZsb3c7CQkvKiBGRVAgaGFyZHdhcmUgaGFuZHNoYWtlICAgICAgICovCisJdWNoYXIgICBjaF9kc3I7CQkJLyogc3RvcmVzIHJlYWwgZHNyIHZhbHVlICAgICAgICAqLworCXVjaGFyICAgY2hfY2Q7CQkJLyogc3RvcmVzIHJlYWwgY2QgdmFsdWUgICAgICAgICAqLworCXVjaGFyICAgY2hfdHhfd2luOwkJLyogY2hhbm5lbCB0eCBidWZmZXIgd2luZG93ICAgICAqLworCXVjaGFyICAgY2hfcnhfd2luOwkJLyogY2hhbm5lbCByeCBidWZmZXIgd2luZG93ICAgICAqLworCXVpbnQJY2hfY3VzdG9tX3NwZWVkOwkvKiBDdXN0b20gYmF1ZCwgaWYgc2V0CQkqLworCXVpbnQJY2hfYmF1ZF9pbmZvOwkJLyogQ3VycmVudCBiYXVkIGluZm8gZm9yIC9wcm9jIG91dHB1dAkqLworCXVsb25nCWNoX3J4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHJlY2VpdmVkIHNvIGZhcgkqLworCXVsb25nCWNoX3R4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHRyYW5zbWl0dGVkIHNvIGZhcgkqLworCXVsb25nCWNoX2Vycl9wYXJpdHk7CQkvKiBDb3VudCBvZiBwYXJpdHkgZXJyb3JzIG9uIGNoYW5uZWwJKi8KKwl1bG9uZwljaF9lcnJfZnJhbWU7CQkvKiBDb3VudCBvZiBmcmFtaW5nIGVycm9ycyBvbiBjaGFubmVsCSovCisJdWxvbmcJY2hfZXJyX2JyZWFrOwkJLyogQ291bnQgb2YgYnJlYWtzIG9uIGNoYW5uZWwJKi8KKwl1bG9uZwljaF9lcnJfb3ZlcnJ1bjsJCS8qIENvdW50IG9mIG92ZXJydW5zIG9uIGNoYW5uZWwJKi8KKworCXVpbnQgY2hfc25pZmZfaW47CisJdWludCBjaF9zbmlmZl9vdXQ7CisJY2hhciAqY2hfc25pZmZfYnVmOwkJLyogU25pZmYgYnVmZmVyIGZvciBwcm9jICovCisJdWxvbmcgY2hfc25pZmZfZmxhZ3M7CQkvKiBDaGFubmVsIGZsYWdzICAgICAgICAgICAgICAgICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgY2hfc25pZmZfd2FpdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbW1hbmQgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGNtX3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX2hlYWQ7CS8qIENvbW1hbmQgYnVmZmVyIGhlYWQgb2Zmc2V0CSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21fdGFpbDsJLyogQ29tbWFuZCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBjbV9zdGFydDsJLyogc3RhcnQgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX21heDsJCS8qIGxhc3Qgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXZlbnQgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGV2X3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X2hlYWQ7CS8qIENvbW1hbmQgYnVmZmVyIGhlYWQgb2Zmc2V0CSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfdGFpbDsJLyogQ29tbWFuZCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBldl9zdGFydDsJLyogc3RhcnQgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X21heDsJCS8qIGxhc3Qgb2Zmc2V0IG9mIGJ1ZmZlcgkqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRG93bmxvYWQgYnVmZmVyIHN0cnVjdHVyZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZG93bmxkX3QgeworCXVjaGFyCWRsX3R5cGU7CQkvKiBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICovCisJdWNoYXIJZGxfc2VxOwkJCS8qIERvd25sb2FkIHNlcXVlbmNlICAgICAgICAgICAgKi8KKwl1c2hvcnQJZGxfc3JldjsJCS8qIFNvZnR3YXJlIHJldmlzaW9uIG51bWJlciAgICAgKi8KKwl1c2hvcnQJZGxfbHJldjsJCS8qIExvdyByZXZpc2lvbiBudW1iZXIgICAgICAgICAgKi8KKwl1c2hvcnQJZGxfaHJldjsJCS8qIEhpZ2ggcmV2aXNpb24gbnVtYmVyICAgICAgICAgKi8KKwl1c2hvcnQJZGxfc2VnOwkJCS8qIFN0YXJ0IHNlZ21lbnQgYWRkcmVzcyAgICAgICAgKi8KKwl1c2hvcnQJZGxfc2l6ZTsJCS8qIE51bWJlciBvZiBieXRlcyB0byBkb3dubG9hZCAgKi8KKwl1Y2hhcglkbF9kYXRhWzEwMjRdOwkJLyogRG93bmxvYWQgZGF0YSAgICAgICAgICAgICAgICAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyIGNoYW5uZWwgYnVmZmVyIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEJhc2UgU3RydWN0dXJlIEVudHJpZXMgVXNhZ2UgTWVhbmluZ3MgdG8gSG9zdCAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgIFcgPSByZWFkIHdyaXRlICAgICAgICBSID0gcmVhZCBvbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgIEMgPSBjaGFuZ2VkIGJ5IGNvbW1hbmRzIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgIFUgPSB1bmtub3duIChtYXkgYmUgY2hhbmdlZCB3L28gbm90aWNlKSAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBic190IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHBfam1wOwkvKiBUcmFuc21pdCBwb2xsIGp1bXAJCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0Y19qbXA7CS8qIENvb2tlZCBwcm9jZWR1cmUganVtcAkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcmlfam1wOwkvKiBOb3QgY3VycmVudGx5IHVzZWQJCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBycF9qbXA7CS8qIFJlY2VpdmUgcG9sbCBqdW1wCQkgKi8KKworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF9zZWc7CS8qIFcgIFR4IHNlZ21lbnQJICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X2hlYWQ7CS8qIFcgIFR4IGJ1ZmZlciBoZWFkIG9mZnNldAkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF90YWlsOwkvKiBSICBUeCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfbWF4OwkvKiBXICBUeCBidWZmZXIgc2l6ZSAtIDEJICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfc2VnOwkvKiBXICBSeCBzZWdtZW50CQkqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9oZWFkOwkvKiBXICBSeCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfdGFpbDsJLyogUiAgUnggYnVmZmVyIHRhaWwgb2Zmc2V0CSovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X21heDsJLyogVyAgUnggYnVmZmVyIHNpemUgLSAxCSAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X2x3OwkJLyogVyAgVHggYnVmZmVyIGxvdyB3YXRlciBtYXJrICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9sdzsJCS8qIFcgIFJ4IGJ1ZmZlciBsb3cgd2F0ZXIgbWFyayAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfaHc7CQkvKiBXICBSeCBidWZmZXIgaGlnaCB3YXRlciBtYXJrICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGluY3I7CQkvKiBXICBJbmNyZW1lbnQgdG8gbmV4dCBjaGFubmVsICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgZmVwZGV2OwkvKiBVICBTQ0MgZGV2aWNlIGJhc2UgYWRkcmVzcyAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBlZGVsYXk7CS8qIFcgIEV4Y2VwdGlvbiBkZWxheSAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGJsZW47CQkvKiBXICBCcmVhayBsZW5ndGggICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGJ0aW1lOwkJLyogVSAgQnJlYWsgY29tcGxldGUgdGltZSAgICAgICAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGlmbGFnOwkJLyogQyAgVU5JWCBpbnB1dCBmbGFncyAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBvZmxhZzsJCS8qIEMgIFVOSVggb3V0cHV0IGZsYWdzICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgY2ZsYWc7CQkvKiBDICBVTklYIGNvbnRyb2wgZmxhZ3MgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHdmaWxsWzEzXTsJLyogVSAgUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiAgICAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG51bTsJCS8qIFUgIENoYW5uZWwgbnVtYmVyICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgcmFjdDsJCS8qIFUgIFJlY2VpdmVyIGFjdGl2ZSBjb3VudGVyICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYnN0YXQ7CQkvKiBVICBCcmVhayBzdGF0dXMgYml0cyAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHRidXN5OwkJLyogVyAgVHJhbnNtaXQgYnVzeSAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBpZW1wdHk7CS8qIFcgIFRyYW5zbWl0IGVtcHR5IGV2ZW50IGVuYWJsZSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBpbG93OwkJLyogVyAgVHJhbnNtaXQgbG93LXdhdGVyIGV2ZW50IGVuYWJsZSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBpZGF0YTsJCS8qIFcgIFJlY2VpdmUgZGF0YSBpbnRlcnJ1cHQgZW5hYmxlICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGVmbGFnOwkJLyogVSAgSG9zdCBldmVudCBmbGFncyAgICAgICAgICAqLworCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHRmbGFnOwkJLyogVSAgVHJhbnNtaXQgZmxhZ3MgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICByZmxhZzsJCS8qIFUgIFJlY2VpdmUgZmxhZ3MgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgeG1hc2s7CQkvKiBVICBUcmFuc21pdCByZWFkeSBmbGFncyAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHh2YWw7CQkvKiBVICBUcmFuc21pdCByZWFkeSB2YWx1ZSAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG1fc3RhdDsJLyogUkMgTW9kZW0gc3RhdHVzIGJpdHMgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9jaGFuZ2U7CS8qIFUgIE1vZGVtIGJpdHMgd2hpY2ggY2hhbmdlZCAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9pbnQ7CQkvKiBXICBNb2RlbSBpbnRlcnJ1cHQgZW5hYmxlIGJpdHMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9sYXN0OwkvKiBVICBMYXN0IG1vZGVtIHN0YXR1cyAgICAgICAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbXRyYW47CQkvKiBDICAgVW5yZXBvcnRlZCBtb2RlbSB0cmFucyAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIG9ydW47CQkvKiBDICAgQnVmZmVyIG92ZXJydW4gb2NjdXJyZWQgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFzdGFydGM7CS8qIFcgICBBdXhpbGlhcnkgWG9uIGNoYXIgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYXN0b3BjOwkvKiBXICAgQXV4aWxpYXJ5IFhvZmYgY2hhciAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHN0YXJ0YzsJLyogVyAgIFhvbiBjaGFyYWN0ZXIgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgc3RvcGM7CQkvKiBXICAgWG9mZiBjaGFyYWN0ZXIgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHZuZXh0YzsJLyogVyAgIFZuZXh0IGNoYXJhY3RlciAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgaGZsb3c7CQkvKiBDICAgU29mdHdhcmUgZmxvdyBjb250cm9sICAgICovCisJCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGZpbGxjOwkJLyogVSAgIERlbGF5IEZpbGwgY2hhcmFjdGVyICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBvY2hhcjsJCS8qIFUgICBTYXZlZCBvdXRwdXQgY2hhcmFjdGVyICAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgb21hc2s7CQkvKiBVICAgT3V0cHV0IGNoYXJhY3RlciBtYXNrICAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYmZpbGxbMTNdOwkvKiBVICAgUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiAgICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgc2NjWzE2XTsJLyogVSAgIFNDQyByZWdpc3RlcnMgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGNub2RlIHsKKwlzdHJ1Y3QgY25vZGUgKm5leHQ7CisJaW50IHR5cGU7CisJaW50IG51bWJyZDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWNoYXIgIHR5cGU7CS8qIEJvYXJkIFR5cGUgCQkqLworCQkJbG9uZyAgcG9ydDsJLyogSS9PIEFkZHJlc3MJCSovCisJCQljaGFyICAqcG9ydHN0cjsgLyogSS9PIEFkZHJlc3MgaW4gc3RyaW5nICovCisJCQlsb25nICBhZGRyOwkvKiBNZW1vcnkgQWRkcmVzcwkqLworCQkJY2hhciAgKmFkZHJzdHI7IC8qIE1lbW9yeSBBZGRyZXNzIGluIHN0cmluZyAqLworCQkJbG9uZyAgcGNpYnVzOwkvKiBQQ0kgQlVTCQkqLworCQkJY2hhciAgKnBjaWJ1c3N0cjsgLyogUENJIEJVUyBpbiBzdHJpbmcgKi8KKwkJCWxvbmcgIHBjaXNsb3Q7CS8qIFBDSSBTTE9UCQkqLworCQkJY2hhciAgKnBjaXNsb3RzdHI7IC8qIFBDSSBTTE9UIGluIHN0cmluZyAqLworCQkJbG9uZyAgbnBvcnQ7CS8qIE51bWJlciBvZiBQb3J0cwkqLworCQkJY2hhciAgKmlkOwkvKiB0dHkgaWQJCSovCisJCQlsb25nICBzdGFydDsJLyogc3RhcnQgb2YgdHR5IGNvdW50aW5nICovCisJCQljaGFyICAqbWV0aG9kOyAgLyogSW5zdGFsbCBtZXRob2QgICAgICAgKi8KKwkJCWNoYXIgIHZfdHlwZTsKKwkJCWNoYXIgIHZfcG9ydDsKKwkJCWNoYXIgIHZfYWRkcjsKKwkJCWNoYXIgIHZfcGNpYnVzOworCQkJY2hhciAgdl9wY2lzbG90OworCQkJY2hhciAgdl9ucG9ydDsKKwkJCWNoYXIgIHZfaWQ7CisJCQljaGFyICB2X3N0YXJ0OworCQkJY2hhciAgdl9tZXRob2Q7CisJCQljaGFyICBsaW5lMTsKKwkJCWNoYXIgIGxpbmUyOworCQkJY2hhciAgY29uYzE7ICAgLyogdG90YWwgY29uY3MgaW4gbGluZTEgKi8KKwkJCWNoYXIgIGNvbmMyOyAgIC8qIHRvdGFsIGNvbmNzIGluIGxpbmUyICovCisJCQljaGFyICBtb2R1bGUxOyAvKiB0b3RhbCBtb2R1bGVzIGZvciBsaW5lMSAqLworCQkJY2hhciAgbW9kdWxlMjsgLyogdG90YWwgbW9kdWxlcyBmb3IgbGluZTIgKi8KKwkJCWNoYXIgICpzdGF0dXM7IC8qIGNvbmZpZyBzdGF0dXMgKi8KKwkJCWNoYXIgICpkaW1zdGF0dXM7CSAvKiBZL04gKi8KKwkJCWludCAgIHN0YXR1c19pbmRleDsgLyogZmllbGQgcG9pbnRlciAqLworCQl9IGJvYXJkOworCisJCXN0cnVjdCB7CisJCQljaGFyICAqY2FibGU7CisJCQljaGFyICB2X2NhYmxlOworCQkJbG9uZyAgc3BlZWQ7CisJCQljaGFyICB2X3NwZWVkOworCQl9IGxpbmU7CisKKwkJc3RydWN0IHsKKwkJCWNoYXIgIHR5cGU7CisJCQljaGFyICAqY29ubmVjdDsKKwkJCWxvbmcgIHNwZWVkOworCQkJbG9uZyAgbnBvcnQ7CisJCQljaGFyICAqaWQ7CisJCQljaGFyICAqaWRzdHI7CisJCQlsb25nICBzdGFydDsKKwkJCWNoYXIgIHZfdHlwZTsKKwkJCWNoYXIgIHZfY29ubmVjdDsKKwkJCWNoYXIgIHZfc3BlZWQ7CisJCQljaGFyICB2X25wb3J0OworCQkJY2hhciAgdl9pZDsKKwkJCWNoYXIgIHZfc3RhcnQ7CisJCX0gY29uYzsKKworCQlzdHJ1Y3QgeworCQkJY2hhciB0eXBlOworCQkJbG9uZyBucG9ydDsKKwkJCWNoYXIgKmlkOworCQkJY2hhciAqaWRzdHI7CisJCQlsb25nIHN0YXJ0OworCQkJY2hhciB2X3R5cGU7CisJCQljaGFyIHZfbnBvcnQ7CisJCQljaGFyIHZfaWQ7CisJCQljaGFyIHZfc3RhcnQ7CisJCX0gbW9kdWxlOworCisJCWNoYXIgKnR0eW5hbWU7CisKKwkJY2hhciAqY3VuYW1lOworCisJCWNoYXIgKnByaW50bmFtZTsKKworCQlsb25nIG1ham9ybnVtYmVyOworCisJCWxvbmcgYWx0cGluOworCisJCWxvbmcgdHR5c2l6ZTsKKworCQlsb25nIGNoc2l6ZTsKKworCQlsb25nIGJzc2l6ZTsKKworCQlsb25nIHVuc2l6ZTsKKworCQlsb25nIGYyc2l6ZTsKKworCQlsb25nIHZwaXhzaXplOworCisJCWxvbmcgdXNlaW50cjsKKwl9IHU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfY29uZi5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGVkNzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoJZGdhcF9jb25mLmggLSBIZWFkZXIgZmlsZSBmb3IgaW5zdGFsbGF0aW9ucyBhbmQgcGFyc2UgZmlsZXMuCi0gKgotICoJJElkOiBkZ2FwX2NvbmYuaCx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfREdBUF9DT05GX0gKLSNkZWZpbmUgX0RHQVBfQ09ORl9ICi0KLSNkZWZpbmUgTlVMTE5PREUgMAkJLyogaGVhZGVyIG5vZGUsIG5vdCB1c2VkICovCi0jZGVmaW5lIEJOT0RFIDEJCQkvKiBCb2FyZCBub2RlICovCi0jZGVmaW5lIExOT0RFIDIJCQkvKiBMaW5lIG5vZGUgKi8KLSNkZWZpbmUgQ05PREUgMwkJCS8qIENvbmNlbnRyYXRvciBub2RlICovCi0jZGVmaW5lIE1OT0RFIDQJCQkvKiBFQkkgTW9kdWxlIG5vZGUgKi8KLSNkZWZpbmUgVE5PREUgNQkJCS8qIHR0eSBuYW1lIHByZWZpeCBub2RlICovCi0jZGVmaW5lCUNVTk9ERSA2CQkvKiBjdSBuYW1lIHByZWZpeCAobm9uLVNDTykgKi8KLSNkZWZpbmUgUE5PREUgNwkJCS8qIHRyYW5zLiBwcmludCBwcmVmaXggbm9kZSAqLwotI2RlZmluZSBKTk9ERSA4CQkJLyogbWFKb3IgbnVtYmVyIG5vZGUgKi8KLSNkZWZpbmUgQU5PREUgOQkJCS8qIGFsdHBpbiAqLwotI2RlZmluZQlUU05PREUgMTAJCS8qIHR0eSBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBDU05PREUgMTEJCS8qIGNoYW5uZWwgc3RydWN0dXJlIHNpemUgKi8KLSNkZWZpbmUgQlNOT0RFIDEyCQkvKiBib2FyZCBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBVU05PREUgMTMJCS8qIHVuaXQgc2NoZWR1bGUgc3RydWN0dXJlIHNpemUgKi8KLSNkZWZpbmUgRlNOT0RFIDE0CQkvKiBmMjIwMCBzdHJ1Y3R1cmUgc2l6ZSAqLwotI2RlZmluZSBWU05PREUgMTUJCS8qIHNpemUgb2YgVlBJWCBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIElOVFJOT0RFIDE2CQkvKiBlbmFibGUgaW50ZXJydXB0ICovCi0KLS8qIEVudW1lcmF0aW9uIG9mIHRva2VucyAqLwotI2RlZmluZQlCRUdJTgkxCi0jZGVmaW5lCUVORAkyCi0jZGVmaW5lCUJPQVJECTEwCi0KLSNkZWZpbmUgRVBDRlMJMTEgLyogc3RhcnQgb2YgRVBDIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZQlJQ1gJCTExCi0jZGVmaW5lCU1DWAkJMTMKLSNkZWZpbmUgUENYCTE0Ci0jZGVmaW5lCUlFUEMJMTUKLSNkZWZpbmUJRUVQQwkxNgotI2RlZmluZQlNRVBDCTE3Ci0jZGVmaW5lCUlQQ00JMTgKLSNkZWZpbmUJRVBDTQkxOQotI2RlZmluZQlNUENNCTIwCi0jZGVmaW5lIFBFUEMJMjEKLSNkZWZpbmUgUFBDTQkyMgotI2lmZGVmIENQCi0jZGVmaW5lIElDUCAgICAgMjMKLSNkZWZpbmUgRUNQICAgICAyNAotI2RlZmluZSBNQ1AgICAgIDI1Ci0jZW5kaWYKLSNkZWZpbmUgRVBDRkUJMjUgLyogZW5kIG9mIEVQQyBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUJUEMyRQkyNgotI2RlZmluZQlQQzRFCTI3Ci0jZGVmaW5lCVBDNEU4SwkyOAotI2RlZmluZQlQQzhFCTI5Ci0jZGVmaW5lCVBDOEU4SwkzMAotI2RlZmluZQlQQzE2RQkzMQotI2RlZmluZSBNQzJFOEsgIDM0Ci0jZGVmaW5lIE1DNEU4SyAgMzUKLSNkZWZpbmUgTUM4RThLICAzNgotCi0jZGVmaW5lIEFWQU5GUwk0MgkvKiBzdGFydCBvZiBBdmFuc3RhciBmYW1pbHkgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgQThQIAk0MgotI2RlZmluZSBBMTZQCTQzCi0jZGVmaW5lIEFWQU5GRQk0MwkvKiBlbmQgb2YgQXZhbnN0YXIgZmFtaWx5IGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgREEyMDAwRlMJNDQJLyogc3RhcnQgb2YgQWNjZWxlUG9ydCAyMDAwIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBEQTIyIAkJNDQgLyogQWNjZWxlUG9ydCAyMDAyICovCi0jZGVmaW5lIERBMjQgCQk0NSAvKiBBY2NlbGVQb3J0IDIwMDQgKi8KLSNkZWZpbmUgREEyOAkJNDYgLyogQWNjZWxlUG9ydCAyMDA4ICovCi0jZGVmaW5lIERBMjE2CQk0NyAvKiBBY2NlbGVQb3J0IDIwMTYgKi8KLSNkZWZpbmUgREFSNAkJNDggLyogQWNjZWxlUG9ydCBSQVMgNCBwb3J0ICovCi0jZGVmaW5lIERBUjgJCTQ5IC8qIEFjY2VsZVBvcnQgUkFTIDggcG9ydCAqLwotI2RlZmluZSBERFIyNAkJNTAgLyogRGF0YUZpcmUgUkFTIDI0IHBvcnQgKi8KLSNkZWZpbmUgRERSMzAJCTUxIC8qIERhdGFGaXJlIFJBUyAzMCBwb3J0ICovCi0jZGVmaW5lIEREUjQ4CQk1MiAvKiBEYXRhRmlyZSBSQVMgNDggcG9ydCAqLwotI2RlZmluZSBERFI2MAkJNTMgLyogRGF0YUZpcmUgUkFTIDYwIHBvcnQgKi8KLSNkZWZpbmUgREEyMDAwRkUJNTMgLyogZW5kIG9mIEFjY2VsZVBvcnQgMjAwMC9SQVMgZmFtaWx5IGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUgUENYUkZTCTEwNgkvKiBzdGFydCBvZiBQQ1hSIGZhbWlseSBkZWZpbml0aW9ucyAqLwotI2RlZmluZQlBUE9SVDQJMTA2Ci0jZGVmaW5lCUFQT1JUOAkxMDcKLSNkZWZpbmUgUEFQT1JUNCAxMDgKLSNkZWZpbmUgUEFQT1JUOCAxMDkKLSNkZWZpbmUgQVBPUlQ0XzkyMEkJMTEwCi0jZGVmaW5lIEFQT1JUOF85MjBJCTExMQotI2RlZmluZSBBUE9SVDRfOTIwUAkxMTIKLSNkZWZpbmUgQVBPUlQ4XzkyMFAJMTEzCi0jZGVmaW5lIEFQT1JUMl85MjBQIDExNAotI2RlZmluZSBQQ1hSRkUJMTE3CS8qIGVuZCBvZiBQQ1hSIGZhbWlseSBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lCUxJTkUJODIKLSNpZmRlZiBUMQotI2RlZmluZSBUMU0JODMKLSNkZWZpbmUgRTFNCTg0Ci0jZW5kaWYKLSNkZWZpbmUJQ09OQwk2NAotI2RlZmluZQlDWAk2NQotI2RlZmluZQlFUEMJNjYKLSNkZWZpbmUJTU9ECTY3Ci0jZGVmaW5lCVBPUlRTCTY4Ci0jZGVmaW5lIE1FVEhPRAk2OQotI2RlZmluZSBDVVNUT00JNzAKLSNkZWZpbmUgQkFTSUMJNzEKLSNkZWZpbmUgU1RBVFVTCTcyCi0jZGVmaW5lIE1PREVNCTczCi0vKiBUaGUgZm9sbG93aW5nIHRva2VucyBjYW4gYXBwZWFyIGluIG11bHRpcGxlIHBsYWNlcyAqLwotI2RlZmluZQlTUEVFRAk3NAotI2RlZmluZQlOUE9SVFMJNzUKLSNkZWZpbmUJSUQJNzYKLSNkZWZpbmUgQ0FCTEUJNzcKLSNkZWZpbmUgQ09OTkVDVAk3OAotI2RlZmluZQlJTwk3OQotI2RlZmluZQlNRU0JODAKLSNkZWZpbmUgRFBTWgk4MQotCi0jZGVmaW5lCVRUWU4JOTAKLSNkZWZpbmUJQ1UJOTEKLSNkZWZpbmUJUFJJTlQJOTIKLSNkZWZpbmUJWFBSSU5UCTkzCi0jZGVmaW5lIENNQUpPUiAgIDk0Ci0jZGVmaW5lIEFMVFBJTiAgOTUKLSNkZWZpbmUgU1RBUlRPIDk2Ci0jZGVmaW5lIFVTRUlOVFIgIDk3Ci0jZGVmaW5lIFBDSUlORk8gIDk4Ci0KLSNkZWZpbmUJVFRTSVoJMTAwCi0jZGVmaW5lCUNIU0laCTEwMQotI2RlZmluZSBCU1NJWgkxMDIKLSNkZWZpbmUJVU5UU0laCTEwMwotI2RlZmluZQlGMlNJWgkxMDQKLSNkZWZpbmUJVlBTSVoJMTA1Ci0KLSNkZWZpbmUJVE9UQUxfQk9BUkQJMgotI2RlZmluZQlDVVJSRU5UX0JSRAk0Ci0jZGVmaW5lCUJPQVJEX1RZUEUJNgotI2RlZmluZQlJT19BRERSRVNTCTgKLSNkZWZpbmUJTUVNX0FERFJFU1MJMTAKLQotI2RlZmluZQlGSUVMRFNfUEVSX1BBR0UJMTgKLQotI2RlZmluZSBUQl9GSUVMRAkxCi0jZGVmaW5lIENCX0ZJRUxECTMKLSNkZWZpbmUgQlRfRklFTEQJNQotI2RlZmluZSBJT19GSUVMRAk3Ci0jZGVmaW5lIElEX0ZJRUxECTgKLSNkZWZpbmUgTUVfRklFTEQJOQotI2RlZmluZSBUVFlfRklFTEQJMTEKLSNkZWZpbmUgQ1VfRklFTEQJMTMKLSNkZWZpbmUgUFJfRklFTEQJMTUKLSNkZWZpbmUgTVBSX0ZJRUxECTE3Ci0KLSNkZWZpbmUJTUFYX0ZJRUxECTUxMgotCi0jZGVmaW5lCUlOSVQJCTAKLSNkZWZpbmUJTklURU1TCQkxMjgKLSNkZWZpbmUgTUFYX0lURU0JNTEyCi0KLSNkZWZpbmUJRFNDUklOU1QJMQotI2RlZmluZQlEU0NSTlVNCQkzCi0jZGVmaW5lCUFMVFBJTlEJCTUKLSNkZWZpbmUJU1NBVkUJCTcKLQotI2RlZmluZQlEU0NSCQkiMzIiCi0jZGVmaW5lCU9ORVRPTklORQkiMTIzNDU2Nzg5IgotI2RlZmluZQlBTEwJCSIxMjM0NTY3ODkwIgotCi0KLXN0cnVjdCBjbm9kZSB7Ci0Jc3RydWN0IGNub2RlICpuZXh0OwotCWludCB0eXBlOwotCWludCBudW1icmQ7Ci0KLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQljaGFyICB0eXBlOwkvKiBCb2FyZCBUeXBlIAkJKi8KLQkJCXNob3J0IHBvcnQ7CS8qIEkvTyBBZGRyZXNzCQkqLwotCQkJY2hhciAgKnBvcnRzdHI7IC8qIEkvTyBBZGRyZXNzIGluIHN0cmluZyAqLwotCQkJbG9uZyAgYWRkcjsJLyogTWVtb3J5IEFkZHJlc3MJKi8KLQkJCWNoYXIgICphZGRyc3RyOyAvKiBNZW1vcnkgQWRkcmVzcyBpbiBzdHJpbmcgKi8KLQkJCWxvbmcgIHBjaWJ1czsJLyogUENJIEJVUwkJKi8KLQkJCWNoYXIgICpwY2lidXNzdHI7IC8qIFBDSSBCVVMgaW4gc3RyaW5nICovCi0JCQlsb25nICBwY2lzbG90OwkvKiBQQ0kgU0xPVAkJKi8KLQkJCWNoYXIgICpwY2lzbG90c3RyOyAvKiBQQ0kgU0xPVCBpbiBzdHJpbmcgKi8KLQkJCWNoYXIgIG5wb3J0OwkvKiBOdW1iZXIgb2YgUG9ydHMJKi8KLQkJCWNoYXIgICppZDsJLyogdHR5IGlkCQkqLwotCQkJaW50ICAgc3RhcnQ7CS8qIHN0YXJ0IG9mIHR0eSBjb3VudGluZyAqLwotCQkJY2hhciAgKm1ldGhvZDsgIC8qIEluc3RhbGwgbWV0aG9kICAgICAgICovCi0JCQljaGFyICB2X3R5cGU7Ci0JCQljaGFyICB2X3BvcnQ7Ci0JCQljaGFyICB2X2FkZHI7Ci0JCQljaGFyICB2X3BjaWJ1czsKLQkJCWNoYXIgIHZfcGNpc2xvdDsKLQkJCWNoYXIgIHZfbnBvcnQ7Ci0JCQljaGFyICB2X2lkOwotCQkJY2hhciAgdl9zdGFydDsKLQkJCWNoYXIgIHZfbWV0aG9kOwotCQkJY2hhciAgbGluZTE7Ci0JCQljaGFyICBsaW5lMjsKLQkJCWNoYXIgIGNvbmMxOyAgIC8qIHRvdGFsIGNvbmNzIGluIGxpbmUxICovCi0JCQljaGFyICBjb25jMjsgICAvKiB0b3RhbCBjb25jcyBpbiBsaW5lMiAqLwotCQkJY2hhciAgbW9kdWxlMTsgLyogdG90YWwgbW9kdWxlcyBmb3IgbGluZTEgKi8KLQkJCWNoYXIgIG1vZHVsZTI7IC8qIHRvdGFsIG1vZHVsZXMgZm9yIGxpbmUyICovCi0JCQljaGFyICAqc3RhdHVzOyAvKiBjb25maWcgc3RhdHVzICovCi0JCQljaGFyICAqZGltc3RhdHVzOwkgLyogWS9OICovCi0JCQlpbnQgICBzdGF0dXNfaW5kZXg7IC8qIGZpZWxkIHBvaW50ZXIgKi8KLQkJfSBib2FyZDsKLQotCQlzdHJ1Y3QgewotCQkJY2hhciAgKmNhYmxlOwotCQkJY2hhciAgdl9jYWJsZTsKLQkJCWNoYXIgIHNwZWVkOwotCQkJY2hhciAgdl9zcGVlZDsKLQkJfSBsaW5lOwotCi0JCXN0cnVjdCB7Ci0JCQljaGFyICB0eXBlOwotCQkJY2hhciAgKmNvbm5lY3Q7Ci0JCQljaGFyICBzcGVlZDsKLQkJCWNoYXIgIG5wb3J0OwotCQkJY2hhciAgKmlkOwotCQkJY2hhciAgKmlkc3RyOwotCQkJaW50ICAgc3RhcnQ7Ci0JCQljaGFyICB2X3R5cGU7Ci0JCQljaGFyICB2X2Nvbm5lY3Q7Ci0JCQljaGFyICB2X3NwZWVkOwotCQkJY2hhciAgdl9ucG9ydDsKLQkJCWNoYXIgIHZfaWQ7Ci0JCQljaGFyICB2X3N0YXJ0OwotCQl9IGNvbmM7Ci0KLQkJc3RydWN0IHsKLQkJCWNoYXIgdHlwZTsKLQkJCWNoYXIgbnBvcnQ7Ci0JCQljaGFyICppZDsKLQkJCWNoYXIgKmlkc3RyOwotCQkJaW50ICBzdGFydDsKLQkJCWNoYXIgdl90eXBlOwotCQkJY2hhciB2X25wb3J0OwotCQkJY2hhciB2X2lkOwotCQkJY2hhciB2X3N0YXJ0OwotCQl9IG1vZHVsZTsKLQotCQljaGFyICp0dHluYW1lOwotCi0JCWNoYXIgKmN1bmFtZTsKLQotCQljaGFyICpwcmludG5hbWU7Ci0KLQkJaW50ICBtYWpvcm51bWJlcjsKLQotCQlpbnQgIGFsdHBpbjsKLQotCQlpbnQgIHR0eXNpemU7Ci0KLQkJaW50ICBjaHNpemU7Ci0KLQkJaW50ICBic3NpemU7Ci0KLQkJaW50ICB1bnNpemU7Ci0KLQkJaW50ICBmMnNpemU7Ci0KLQkJaW50ICB2cGl4c2l6ZTsKLQotCQlpbnQgIHVzZWludHI7Ci0JfSB1OwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2Rvd25sZC5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kb3dubGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxYWMxOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2Rvd25sZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICogICAgICBTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAkSWQ6IGRnYXBfZG93bmxkLmgsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJAotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKLSAqLwotCi0vKgotKiogZG93bmxkLmggCi0qKiAgLSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSB1c2VyIGxldmVsIGRvd25sb2FkIHByb2Nlc3MKLSoqICAgIGFuZCB0aGUgY29uY2VudHJhdG9yIGRvd25sb2FkIGRyaXZlci4KLSovCi0KLSNpZm5kZWYgX0RHQVBfRE9XTkxEX0hfCi0jZGVmaW5lIF9ER0FQX0RPV05MRF9IXwotCi0KLXN0cnVjdCBmZXBpbWcgewotICAgIGludCB0eXBlOwkJCQkvKiBib2FyZCB0eXBlICovCi0gICAgaW50CWxlbjsJCQkJLyogbGVuZ3RoIG9mIGltYWdlICovCi0gICAgY2hhciBmZXBpbWFnZVsxXTsJCQkvKiBiZWdpbm5pbmcgb2YgaW1hZ2UgKi8KLX07Ci0KLXN0cnVjdCBkb3dubGRpbyB7Ci0gICAgdW5zaWduZWQgaW50IHJlcV90eXBlOwkJLyogRkVQIG9yIGNvbmNlbnRyYXRvciAqLwotICAgIHVuc2lnbmVkIGludCBiZGlkOwkJCS8qIG9wYXF1ZSBib2FyZCBpZGVudGlmaWVyICovCi0gICAgdW5pb24gewotCXN0cnVjdCBkb3dubGRfdCBkbDsJCS8qIGRvd25sb2FkIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBmZXBpbWcgICBmaTsJCS8qIGZlcC9iaW9zIGltYWdlIHN0cnVjdHVyZSAqLwotICAgIH0gaW1hZ2U7Ci19OwotCi0jZGVmaW5lIERJR0lfRExSRVFfR0VUCSgoJ2QnPDw4KSB8IDIyMCkKLSNkZWZpbmUgRElHSV9ETFJFUV9TRVQJKCgnZCc8PDgpIHwgMjIxKQotCi0jZGVmaW5lIERJR0lfRExfTlVLRSAgICAoKCdkJzw8OCkgfCAyMjIpIC8qIE5vdCByZWFsbHkgYSBkbCByZXF1ZXN0LCBidXQKLQkJCQkJICBkYW5nZXJvdXMgZW51ZmYgdG8gbm90IHB1dCBpbgotCQkJCQkgIGRpZ2kuaCAqLwotLyogUGFja2VkIGJpdHMgb2YgaW50YXJnIGZvciBESUdJX0RMX05VS0UgKi8KLSNkZWZpbmUgRElHSV9OVUtFX1JFU0VUX0FMTAkgKDEgPDwgMzEpCi0jZGVmaW5lIERJR0lfTlVLRV9JTkhJQklUX1BPTExFUiAoMSA8PCAzMCkKLSNkZWZpbmUgRElHSV9OVUtFX0JSRF9OVU1CICAgICAgICAweDBmCi0JCi0KLQotI2RlZmluZQlETFJFUV9CSU9TCTAKLSNkZWZpbmUJRExSRVFfRkVQCTEKLSNkZWZpbmUJRExSRVFfQ09OQwkyCi0jZGVmaW5lCURMUkVRX0NPTkZJRwkzCi0jZGVmaW5lIERMUkVRX0RFVkNSRUFURSA0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZHJpdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OWQwMTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9kcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUgCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCi0gKiAkSWQ6IGRnYXBfZHJpdmVyLmMsdiAxLjMgMjAxMS8wNi8yMSAxMDozNToxNiBtYXJraCBFeHAgJAotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEZvciB1ZGVsYXkgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogRm9yIGNvcHlfZnJvbV91c2VyL2NvcHlfdG9fdXNlciAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KLSNpbmNsdWRlICJkZ2FwX2RyaXZlci5oIgotI2luY2x1ZGUgImRnYXBfcGNpLmgiCi0jaW5jbHVkZSAiZGdhcF9mZXA1LmgiCi0jaW5jbHVkZSAiZGdhcF90dHkuaCIKLSNpbmNsdWRlICJkZ2FwX2NvbmYuaCIKLSNpbmNsdWRlICJkZ2FwX3BhcnNlLmgiCi0jaW5jbHVkZSAiZGdhcF90cmFjZS5oIgotI2luY2x1ZGUgImRnYXBfc3lzZnMuaCIKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiRGlnaSBJbnRlcm5hdGlvbmFsLCBodHRwOi8vd3d3LmRpZ2kuY29tIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIERpZ2kgSW50ZXJuYXRpb25hbCBFUENBIFBDSSBiYXNlZCBwcm9kdWN0IGxpbmUiKTsKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJkZ2FwIik7Ci0KLS8qCi0gKiBpbnNtb2QgY29tbWFuZCBsaW5lIG92ZXJyaWRlYWJsZSBwYXJhbWV0ZXJzCi0gKgotICogTk9URTogd2UgdXNlIGEgc2V0IG9mIG1hY3JvcyB0byBjcmVhdGUgdGhlIHZhcmlhYmxlcywgd2hpY2ggYWxsb3dzCi0gKiB1cyB0byBzcGVjaWZ5IHRoZSB2YXJpYWJsZSB0eXBlLCBuYW1lLCBpbml0aWFsIHZhbHVlLCBhbmQgZGVzY3JpcHRpb24uCi0gKi8KLVBBUk1fSU5UKGRlYnVnLAkJMHgwMCwJCTA2NDQsCSJEcml2ZXIgZGVidWdnaW5nIGxldmVsIik7Ci1QQVJNX0lOVChyYXdyZWFkb2ssCTEsCQkwNjQ0LAkiQnlwYXNzIGZsaXAgYnVmZmVycyBvbiBpbnB1dCIpOwotUEFSTV9JTlQodHJjYnVmX3NpemUsCTB4MTAwMDAwLAkwNjQ0LAkiRGVidWdnaW5nIHRyYWNlIGJ1ZmZlciBzaXplLiIpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHByb3RvcyBmb3IgdGhpcyBmaWxlCi0gKgotICovCi0KLXN0YXRpYyBpbnQJCWRnYXBfc3RhcnQodm9pZCk7Ci1zdGF0aWMgdm9pZAkJZGdhcF9pbml0X2dsb2JhbHModm9pZCk7Ci1zdGF0aWMgaW50CQlkZ2FwX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpOwotc3RhdGljIHZvaWQJCWRnYXBfY2xlYW51cF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKLXN0YXRpYyB2b2lkCQlkZ2FwX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSk7Ci1zdGF0aWMgaW50CQlkZ2FwX2luaXRfcGNpKHZvaWQpOwotc3RhdGljIGludAkJZGdhcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgdm9pZAkJZGdhcF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotc3RhdGljIGludAkJZGdhcF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjYXJkX3R5cGUpOwotc3RhdGljIHZvaWQJCWRnYXBfbWJ1ZihzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1zdGF0aWMgaW50CQlkZ2FwX2RvX3JlbWFwKHN0cnVjdCBib2FyZF90ICpicmQpOwotc3RhdGljIGlycXJldHVybl90CWRnYXBfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKTsKLQotLyogRHJpdmVyIGxvYWQvdW5sb2FkIGZ1bmN0aW9ucyAqLwotaW50CQkJZGdhcF9pbml0X21vZHVsZSh2b2lkKTsKLXZvaWQJCQlkZ2FwX2NsZWFudXBfbW9kdWxlKHZvaWQpOwotCi1tb2R1bGVfaW5pdChkZ2FwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGRnYXBfY2xlYW51cF9tb2R1bGUpOwotCi0KLS8qCi0gKiBGaWxlIG9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIENvbnRyb2wvTWFuYWdlbWVudCBtYWpvci4KLSAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgRGdhcEJvYXJkRm9wcyA9Ci17Ci0JLm93bmVyCQk9CVRISVNfTU9EVUxFLAotfTsKLQotCi0vKgotICogR2xvYmFscwotICovCi11aW50CQkJZGdhcF9OdW1Cb2FyZHM7Ci1zdHJ1Y3QgYm9hcmRfdAkJKmRnYXBfQm9hcmRbTUFYQk9BUkRTXTsKLURFRklORV9TUElOTE9DSyhkZ2FwX2dsb2JhbF9sb2NrKTsKLXVsb25nCQkJZGdhcF9wb2xsX2NvdW50ZXI7Ci1jaGFyCQkJKmRnYXBfY29uZmlnX2J1ZjsKLWludAkJCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX0lOSVRJQUxJWkVEOwotREVGSU5FX1NQSU5MT0NLKGRnYXBfZGxfbG9jayk7Ci13YWl0X3F1ZXVlX2hlYWRfdAlkZ2FwX2RsX3dhaXQ7Ci1pbnQJCQlkZ2FwX2RsX2FjdGlvbjsKLWludAkJCWRnYXBfcG9sbF90aWNrID0gMjA7CS8qIFBvbGwgaW50ZXJ2YWwgLSAyMCBtcyAqLwotCi0vKgotICogU3RhdGljIHZhcnMuCi0gKi8KLXN0YXRpYyBpbnQJCWRnYXBfTWFqb3JfQ29udHJvbF9SZWdpc3RlcmVkID0gRkFMU0U7Ci1zdGF0aWMgdWludAkJZGdhcF9kcml2ZXJfc3RhcnQgPSBGQUxTRTsKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqCWRnYXBfY2xhc3M7Ci0KLS8qCi0gKiBQb2xsZXIgc3R1ZmYKLSAqLwotc3RhdGljIAkJCURFRklORV9TUElOTE9DSyhkZ2FwX3BvbGxfbG9jayk7CS8qIFBvbGwgc2NoZWR1bGluZyBsb2NrICovCi1zdGF0aWMgdWxvbmcJCWRnYXBfcG9sbF90aW1lOwkJCQkvKiBUaW1lIG9mIG5leHQgcG9sbCAqLwotc3RhdGljIHVpbnQJCWRnYXBfcG9sbF9zdG9wOwkJCQkvKiBVc2VkIHRvIHRlbGwgcG9sbGVyIHRvIHN0b3AgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkZ2FwX3BvbGxfdGltZXI7Ci0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRnYXBfcGNpX3RibFtdID0gewotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWEVNX0RJRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMCB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfQ1hfRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAgIDEgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX0NYX0lCTV9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTIgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX0VQQ0pfRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAkzIH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV85MjBfMl9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTQgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFXzkyMF80X0RJRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJNSB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfOTIwXzhfRElELAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAk2IH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV9YUl9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTcgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSSl9ESUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTggfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSXzQyMl9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTkgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSX0lCTV9ESUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCTEwIH0sCi0JeyAgICAgICBESUdJX1ZJRCwgUENJX0RFVklDRV9YUl9TQUlQX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMTEgfSwKLQl7ICAgICAgIERJR0lfVklELCBQQ0lfREVWSUNFX1hSX0JVTExfRElELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAkxMiB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfOTIwXzhfSFBfRElELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMyB9LAotCXsgICAgICAgRElHSV9WSUQsIFBDSV9ERVZJQ0VfWEVNX0hQX0RJRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwJMTQgfSwKLQl7MCx9CQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGdhcF9wY2lfdGJsKTsKLQotCi0vKgotICogQSBnZW5lcmljIGxpc3Qgb2YgUHJvZHVjdCBuYW1lcywgUENJIFZlbmRvciBJRCwgYW5kIFBDSSBEZXZpY2UgSUQuCi0gKi8KLXN0cnVjdCBib2FyZF9pZCB7Ci0JdWludCBjb25maWdfdHlwZTsKLQl1Y2hhciAqbmFtZTsKLQl1aW50IG1heHBvcnRzOwotCXVpbnQgZHBhdHlwZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYm9hcmRfaWQgZGdhcF9JZHNbXSA9Ci17Ci0JewlQUENNLAkJUENJX0RFVklDRV9YRU1fTkFNRSwJNjQsCShUX1BDWE0gfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUENYLAkJUENJX0RFVklDRV9DWF9OQU1FLAkxMjgsCShUX0NYIHwgVF9QQ0lCVVMpCQl9LAotCXsJUENYLAkJUENJX0RFVklDRV9DWF9JQk1fTkFNRSwJMTI4LAkoVF9DWCB8IFRfUENJQlVTKQkJfSwKLQl7CVBFUEMsCQlQQ0lfREVWSUNFX0VQQ0pfTkFNRSwJMjI0LAkoVF9FUEMgIHwgVF9QQ0lCVVMpCQl9LAotCXsJQVBPUlQyXzkyMFAsCVBDSV9ERVZJQ0VfOTIwXzJfTkFNRSwJMiwJKFRfUENYUiB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlBUE9SVDRfOTIwUCwJUENJX0RFVklDRV85MjBfNF9OQU1FLAk0LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CUFQT1JUOF85MjBQLAlQQ0lfREVWSUNFXzkyMF84X05BTUUsCTgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUEFQT1JUOCwJUENJX0RFVklDRV9YUl9OQU1FLAk4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CVBBUE9SVDgsCVBDSV9ERVZJQ0VfWFJKX05BTUUsCTgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUEFQT1JUOCwJUENJX0RFVklDRV9YUl80MjJfTkFNRSwJOCwJKFRfUENYUiB8IFRfUENMSVRFIHwgVF9QQ0lCVVMpCX0sCi0JewlQQVBPUlQ4LAlQQ0lfREVWSUNFX1hSX0lCTV9OQU1FLAk4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CVBBUE9SVDgsCVBDSV9ERVZJQ0VfWFJfU0FJUF9OQU1FLCA4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CVBBUE9SVDgsCVBDSV9ERVZJQ0VfWFJfQlVMTF9OQU1FLCA4LAkoVF9QQ1hSIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7CUFQT1JUOF85MjBQLAlQQ0lfREVWSUNFXzkyMF84X0hQX05BTUUsIDgsCShUX1BDWFIgfCBUX1BDTElURSB8IFRfUENJQlVTKQl9LAotCXsJUFBDTSwJCVBDSV9ERVZJQ0VfWEVNX0hQX05BTUUsCTY0LAkoVF9QQ1hNIHwgVF9QQ0xJVEUgfCBUX1BDSUJVUykJfSwKLQl7MCx9CQkJCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGdhcF9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gImRnYXAiLAotCS5wcm9iZQkJPSBkZ2FwX2luaXRfb25lLAotCS5pZF90YWJsZQk9IGRnYXBfcGNpX3RibCwKLQkucmVtb3ZlCQk9IGRnYXBfcmVtb3ZlX29uZSwKLX07Ci0KLQotY2hhciAqZGdhcF9zdGF0ZV90ZXh0W10gPSB7Ci0JIkJvYXJkIEZhaWxlZCIsCi0JIkNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkIG5vdCBmb3VuZC5cblx0XHRcdFJ1biBtcGkgdG8gY29uZmlndXJlIGJvYXJkLiIsCi0JIkJvYXJkIEZvdW5kIiwKLQkiTmVlZCBSZXNldCIsCi0JIkZpbmlzaGVkIFJlc2V0IiwKLQkiTmVlZCBDb25maWciLAotCSJGaW5pc2hlZCBDb25maWciLAotCSJOZWVkIERldmljZSBDcmVhdGlvbiIsCi0JIlJlcXVlc3RlZCBEZXZpY2UgQ3JlYXRpb24iLAotCSJGaW5pc2hlZCBEZXZpY2UgQ3JlYXRpb24iLAotCSJOZWVkIEJJT1MgTG9hZCIsIAotCSJSZXF1ZXN0ZWQgQklPUyIsIAotCSJEb2luZyBCSU9TIExvYWQiLAotCSJGaW5pc2hlZCBCSU9TIExvYWQiLAotCSJOZWVkIEZFUCBMb2FkIiwgCi0JIlJlcXVlc3RlZCBGRVAiLAotCSJEb2luZyBGRVAgTG9hZCIsCi0JIkZpbmlzaGVkIEZFUCBMb2FkIiwKLQkiUmVxdWVzdGVkIFBST0MgY3JlYXRpb24iLAotCSJGaW5pc2hlZCBQUk9DIGNyZWF0aW9uIiwKLQkiQm9hcmQgUkVBRFkiLAotfTsKLQotY2hhciAqZGdhcF9kcml2ZXJfc3RhdGVfdGV4dFtdID0gewotCSJEcml2ZXIgSW5pdGlhbGl6ZWQiLAotCSJEcml2ZXIgbmVlZHMgY29uZmlndXJhdGlvbiBsb2FkLiIsCi0JIkRyaXZlciByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiBmcm9tIGRvd25sb2FkIGRhZW1vbi4iLAotCSJEcml2ZXIgUmVhZHkuIgotfTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEcml2ZXIgbG9hZC91bmxvYWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIGluaXRfbW9kdWxlKCkKLSAqCi0gKiBNb2R1bGUgbG9hZC4gIFRoaXMgaXMgd2hlcmUgaXQgYWxsIHN0YXJ0cy4KLSAqLwotaW50IGRnYXBfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JQVBSKCgiJXMsIERpZ2kgSW50ZXJuYXRpb25hbCBQYXJ0IE51bWJlciAlc1xuIiwgREdfTkFNRSwgREdfUEFSVCkpOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZgotCSAqLwotCXJjID0gZGdhcF9zdGFydCgpOwotCi0JaWYgKHJjIDwgMCkgewotCQlyZXR1cm4ocmMpOwotCX0KLQotCS8qCi0JICogRmluZCBhbmQgY29uZmlndXJlIGFsbCB0aGUgY2FyZHMKLQkgKi8KLQlyYyA9IGRnYXBfaW5pdF9wY2koKTsKLQotCS8qCi0JICogSWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlIHNjYW4sIGJhaWwgb3V0IG9mIGRyaXZlci4KLQkgKi8KLQlpZiAocmMgPCAwKSB7Ci0JCS8qIE9ubHkgdW5yZWdpc3RlciB0aGUgcGNpIGRyaXZlciBpZiBpdCB3YXMgYWN0dWFsbHkgcmVnaXN0ZXJlZC4gKi8KLQkJaWYgKGRnYXBfTnVtQm9hcmRzKQotCQkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZ2FwX2RyaXZlcik7Ci0JCWVsc2UKLQkJCXByaW50aygiV0FSTklORzogZGdhcCBkcml2ZXIgbG9hZCBmYWlsZWQuICBObyBER0FQIGJvYXJkcyBmb3VuZC5cbiIpOwotCi0JCWRnYXBfY2xlYW51cF9tb2R1bGUoKTsKLQl9Ci0JZWxzZSB7Ci0JCWRnYXBfY3JlYXRlX2RyaXZlcl9zeXNmaWxlcygmZGdhcF9kcml2ZXIpOwotCX0KLSAgCi0JRFBSX0lOSVQoKCJGaW5pc2hlZCBpbml0X21vZHVsZS4gUmV0dXJuaW5nICVkXG4iLCByYykpOwotCXJldHVybiAocmMpOwotfQotCi0KLS8qCi0gKiBTdGFydCBvZiBkcml2ZXIuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9zdGFydCh2b2lkKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChkZ2FwX2RyaXZlcl9zdGFydCA9PSBGQUxTRSkgewotCi0JCWRnYXBfZHJpdmVyX3N0YXJ0ID0gVFJVRTsKLQotCSAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIGdsb2JhbHMgYXJlIGluaXQnZCBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZSAqLwotCSAgICAgICAgZGdhcF9pbml0X2dsb2JhbHMoKTsKLQotCQlkZ2FwX051bUJvYXJkcyA9IDA7Ci0KLQkJQVBSKCgiRm9yIHRoZSB0b29scyBwYWNrYWdlIG9yIHVwZGF0ZWQgZHJpdmVycyBwbGVhc2UgdmlzaXQgaHR0cDovL3d3dy5kaWdpLmNvbVxuIikpOwotCi0JCS8qCi0JCSAqIFJlZ2lzdGVyIG91ciBiYXNlIGNoYXJhY3RlciBkZXZpY2UgaW50byB0aGUga2VybmVsLgotCQkgKiBUaGlzIGFsbG93cyB0aGUgZG93bmxvYWQgZGFlbW9uIHRvIGNvbm5lY3QgdG8gdGhlIGRvd25sZCBkZXZpY2UKLQkJICogYmVmb3JlIGFueSBvZiB0aGUgYm9hcmRzIGFyZSBpbml0J2VkLgotCQkgKi8KLQkJaWYgKCFkZ2FwX01ham9yX0NvbnRyb2xfUmVnaXN0ZXJlZCkgewotCQkJLyoKLQkJCSAqIFJlZ2lzdGVyIG1hbmFnZW1lbnQvZHBhIGRldmljZXMKLQkJCSAqLwotCQkJcmMgPSByZWdpc3Rlcl9jaHJkZXYoRElHSV9ER0FQX01BSk9SLCAiZGdhcCIsICZEZ2FwQm9hcmRGb3BzKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlBUFIoKCJDYW4ndCByZWdpc3RlciBkZ2FwIGRyaXZlciBkZXZpY2UgKCVkKVxuIiwgcmMpKTsKLQkJCQlyZXR1cm4gKHJjKTsKLQkJCX0KLQotCQkJZGdhcF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImRnYXBfbWdtdCIpOwotCQkJZGV2aWNlX2NyZWF0ZShkZ2FwX2NsYXNzLCBOVUxMLAotCQkJCU1LREVWKERJR0lfREdBUF9NQUpPUiwgMCksCi0JCQkJTlVMTCwgImRnYXBfbWdtdCIpOwotCQkJZGV2aWNlX2NyZWF0ZShkZ2FwX2NsYXNzLCBOVUxMLAotCQkJCU1LREVWKERJR0lfREdBUF9NQUpPUiwgMSksCi0JCQkJTlVMTCwgImRnYXBfZG93bmxkIik7Ci0JCQlkZ2FwX01ham9yX0NvbnRyb2xfUmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCX0KLQotCQkvKgotCQkgKiBJbml0IGFueSBnbG9iYWwgdHR5IHN0dWZmLgotCQkgKi8KLQkJcmMgPSBkZ2FwX3R0eV9wcmVpbml0KCk7Ci0KLQkJaWYgKHJjIDwgMCkgewotCQkJQVBSKCgidHR5IHByZWluaXQgLSBub3QgZW5vdWdoIG1lbW9yeSAoJWQpXG4iLCByYykpOwotCQkJcmV0dXJuKHJjKTsgCi0JCX0KLQotCQkvKiBTdGFydCB0aGUgcG9sbGVyICovCi0JCURHQVBfTE9DSyhkZ2FwX3BvbGxfbG9jaywgZmxhZ3MpOwotCQlpbml0X3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOwotCQlkZ2FwX3BvbGxfdGltZXIuZnVuY3Rpb24gPSBkZ2FwX3BvbGxfaGFuZGxlcjsKLQkJZGdhcF9wb2xsX3RpbWVyLmRhdGEgPSAwOwotCQlkZ2FwX3BvbGxfdGltZSA9IGppZmZpZXMgKyBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7Ci0JCWRnYXBfcG9sbF90aW1lci5leHBpcmVzID0gZGdhcF9wb2xsX3RpbWU7Ci0JCURHQVBfVU5MT0NLKGRnYXBfcG9sbF9sb2NrLCBmbGFncyk7Ci0KLQkJYWRkX3RpbWVyKCZkZ2FwX3BvbGxfdGltZXIpOwotCi0JCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX05FRURfQ09ORklHX0xPQUQ7Ci0JfQotCi0JcmV0dXJuIChyYyk7Ci19Ci0KLQotLyoKLSAqIFJlZ2lzdGVyIHBjaSBkcml2ZXIsIGFuZCByZXR1cm4gaG93IG1hbnkgYm9hcmRzIHdlIGhhdmUuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9pbml0X3BjaSh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkZ2FwX2RyaXZlcik7Ci19Ci0KLQotLyogcmV0dXJucyBjb3VudCAoPj0gMCksIG9yIG5lZ2F0aXZlIG9uIGVycm9yICovCi1zdGF0aWMgaW50IGRnYXBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IHJjOwotCi0JLyogd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZSAqLwotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXJjID0gLUVJTzsKLQl9IGVsc2UgeyAgCi0JCXJjID0gZGdhcF9wcm9iZTEocGRldiwgZW50LT5kcml2ZXJfZGF0YSk7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlkZ2FwX051bUJvYXJkcysrOwotCQkJRFBSX0lOSVQoKCJJbmNyZW1lbnRpbmcgbnVtYm9hcmRzIHRvICVkXG4iLCBkZ2FwX051bUJvYXJkcykpOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0gICAgICAgICAgICAgICAKLQotCi1zdGF0aWMgaW50IGRnYXBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgY2FyZF90eXBlKQotewotCXJldHVybiBkZ2FwX2ZvdW5kX2JvYXJkKHBkZXYsIGNhcmRfdHlwZSk7Ci19Ci0gICAgICAgICAKLSAgICAgICAgCi1zdGF0aWMgdm9pZCBkZ2FwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQkvKiBEbyBOb3RoaW5nICovCi19Ci0KLQotLyoKLSAqIGRnYXBfY2xlYW51cF9tb2R1bGUoKQotICoKLSAqIE1vZHVsZSB1bmxvYWQuICBUaGlzIGlzIHdoZXJlIGl0IGFsbCBlbmRzLgotICovCi12b2lkIGRnYXBfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgaTsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCi0JREdBUF9MT0NLKGRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlkZ2FwX3BvbGxfc3RvcCA9IDE7Ci0JREdBUF9VTkxPQ0soZGdhcF9wb2xsX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgcG9sbGVyIHJpZ2h0IGF3YXkuICovCi0JZGVsX3RpbWVyX3N5bmMoICZkZ2FwX3BvbGxfdGltZXIpOwotCi0JZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKCZkZ2FwX2RyaXZlcik7Ci0KLQotCWlmIChkZ2FwX01ham9yX0NvbnRyb2xfUmVnaXN0ZXJlZCkgewotCQlkZXZpY2VfZGVzdHJveShkZ2FwX2NsYXNzLCBNS0RFVihESUdJX0RHQVBfTUFKT1IsIDApKTsKLQkJZGV2aWNlX2Rlc3Ryb3koZGdhcF9jbGFzcywgTUtERVYoRElHSV9ER0FQX01BSk9SLCAxKSk7Ci0JCWNsYXNzX2Rlc3Ryb3koZGdhcF9jbGFzcyk7Ci0JCXVucmVnaXN0ZXJfY2hyZGV2KERJR0lfREdBUF9NQUpPUiwgImRnYXAiKTsKLQl9Ci0KLQlrZnJlZShkZ2FwX2NvbmZpZ19idWYpOwotCi0JZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyArK2kpIHsKLQkJZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoZGdhcF9Cb2FyZFtpXSk7Ci0JCWRnYXBfdHR5X3VuaW5pdChkZ2FwX0JvYXJkW2ldKTsKLQkJZGdhcF9jbGVhbnVwX2JvYXJkKGRnYXBfQm9hcmRbaV0pOwotCX0KLQotCWRnYXBfdHR5X3Bvc3RfdW5pbml0KCk7Ci0KLSNpZiBkZWZpbmVkKERHQVBfVFJBQ0VSKQotCS8qIGxhc3QgdGhpbmcsIG1ha2Ugc3VyZSB3ZSByZWxlYXNlIHRoZSB0cmFjZWJ1ZmZlciAqLwotCWRnYXBfdHJhY2VyX2ZyZWUoKTsKLSNlbmRpZgotCWlmIChkZ2FwX051bUJvYXJkcykKLQkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZ2FwX2RyaXZlcik7Ci19Ci0KLQotLyoKLSAqIGRnYXBfY2xlYW51cF9ib2FyZCgpCi0gKgotICogRnJlZSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBib2FyZAotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2NsZWFudXBfYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQlpbnQgaSA9IDA7Ci0KLSAgICAgICAgaWYoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JaWYgKGJyZC0+aW50cl91c2VkICYmIGJyZC0+aXJxKQotCQlmcmVlX2lycShicmQtPmlycSwgYnJkKTsKLQotCXRhc2tsZXRfa2lsbCgmYnJkLT5oZWxwZXJfdGFza2xldCk7Ci0KLQlpZiAoYnJkLT5yZV9tYXBfcG9ydCkgewotCQlyZWxlYXNlX21lbV9yZWdpb24oYnJkLT5tZW1iYXNlICsgMHgyMDAwMDAsIDB4MjAwMDAwKTsKLQkJaW91bm1hcChicmQtPnJlX21hcF9wb3J0KTsKLQkJYnJkLT5yZV9tYXBfcG9ydCA9IE5VTEw7Ci0JfQotCi0JaWYgKGJyZC0+cmVfbWFwX21lbWJhc2UpIHsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOwotCQlpb3VubWFwKGJyZC0+cmVfbWFwX21lbWJhc2UpOwotCQlicmQtPnJlX21hcF9tZW1iYXNlID0gTlVMTDsKLQl9Ci0KLSAgICAgICAgaWYgKGJyZC0+bXNnYnVmX2hlYWQpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgICAgICAgICAgICAgREdBUF9MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBicmQtPm1zZ2J1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCIlcyIsIGJyZC0+bXNnYnVmX2hlYWQpOwotICAgICAgICAgICAgICAgIGtmcmVlKGJyZC0+bXNnYnVmX2hlYWQpOwotICAgICAgICAgICAgICAgIGJyZC0+bXNnYnVmX2hlYWQgPSBOVUxMOwotICAgICAgICAgICAgICAgIERHQVBfVU5MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgfQotCi0JLyogRnJlZSBhbGwgYWxsb2NhdGVkIGNoYW5uZWxzIHN0cnVjdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFMgOyBpKyspIHsKLQkJaWYgKGJyZC0+Y2hhbm5lbHNbaV0pIHsKLQkJCWtmcmVlKGJyZC0+Y2hhbm5lbHNbaV0pOwotCQkJYnJkLT5jaGFubmVsc1tpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlrZnJlZShicmQtPmZsaXBidWYpOwotCWtmcmVlKGJyZC0+ZmxpcGZsYWdidWYpOwotCi0JZGdhcF9Cb2FyZFticmQtPmJvYXJkbnVtXSA9IE5VTEw7Ci0KLSAgICAgICAga2ZyZWUoYnJkKTsKLX0KLQotCi0vKgotICogZGdhcF9mb3VuZF9ib2FyZCgpCi0gKgotICogQSBib2FyZCBoYXMgYmVlbiBmb3VuZCwgaW5pdCBpdC4KLSAqLwotc3RhdGljIGludCBkZ2FwX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJyZDsKLQl1bnNpZ25lZCBpbnQgcGNpX2lycTsKLQlpbnQgaSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGdldCB0aGUgYm9hcmQgc3RydWN0dXJlIGFuZCBwcmVwIGl0ICovCi0JYnJkID0gZGdhcF9Cb2FyZFtkZ2FwX051bUJvYXJkc10gPQotCShzdHJ1Y3QgYm9hcmRfdCAqKSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm9hcmRfdCksIEdGUF9LRVJORUwpOwotCWlmICghYnJkKSB7Ci0JCUFQUigoIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBib2FyZCBzdHJ1Y3R1cmUgZmFpbGVkXG4iKSk7Ci0JCXJldHVybigtRU5PTUVNKTsKLQl9Ci0KLQkvKiBtYWtlIGEgdGVtcG9yYXJ5IG1lc3NhZ2UgYnVmZmVyIGZvciB0aGUgYm9vdCBtZXNzYWdlcyAqLwotCWJyZC0+bXNnYnVmID0gYnJkLT5tc2didWZfaGVhZCA9Ci0JCShjaGFyICopIGt6YWxsb2Moc2l6ZW9mKGNoYXIpICogODE5MiwgR0ZQX0tFUk5FTCk7Ci0JaWYoIWJyZC0+bXNnYnVmKSB7Ci0JCWtmcmVlKGJyZCk7Ci0JCUFQUigoIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBib2FyZCBtc2didWYgZmFpbGVkXG4iKSk7Ci0JCXJldHVybigtRU5PTUVNKTsKLQl9Ci0KLQkvKiBzdG9yZSB0aGUgaW5mbyBmb3IgdGhlIGJvYXJkIHdlJ3ZlIGZvdW5kICovCi0JYnJkLT5tYWdpYyA9IERHQVBfQk9BUkRfTUFHSUM7Ci0JYnJkLT5ib2FyZG51bSA9IGRnYXBfTnVtQm9hcmRzOwotCWJyZC0+Zmlyc3RtaW5vciA9IDA7Ci0JYnJkLT52ZW5kb3IgPSBkZ2FwX3BjaV90YmxbaWRdLnZlbmRvcjsKLQlicmQtPmRldmljZSA9IGRnYXBfcGNpX3RibFtpZF0uZGV2aWNlOwotCWJyZC0+cGRldiA9IHBkZXY7Ci0JYnJkLT5wY2lfYnVzID0gcGRldi0+YnVzLT5udW1iZXI7Ci0JYnJkLT5wY2lfc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKLQlicmQtPm5hbWUgPSBkZ2FwX0lkc1tpZF0ubmFtZTsKLQlicmQtPm1heHBvcnRzID0gZGdhcF9JZHNbaWRdLm1heHBvcnRzOwotCWJyZC0+dHlwZSA9IGRnYXBfSWRzW2lkXS5jb25maWdfdHlwZTsKLQlicmQtPmRwYXR5cGUgPSBkZ2FwX0lkc1tpZF0uZHBhdHlwZTsKLQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJyZC0+c3RhdGVfd2FpdCk7Ci0KLQlER0FQX1NQSU5MT0NLX0lOSVQoYnJkLT5iZF9sb2NrKTsKLQotCWJyZC0+c3RhdGUJCT0gQk9BUkRfRk9VTkQ7Ci0JYnJkLT5ydW53YWl0CQk9IDA7Ci0JYnJkLT5pbmhpYml0X3BvbGxlcgk9IEZBTFNFOwotCWJyZC0+d2FpdF9mb3JfYmlvcwk9IDA7Ci0JYnJkLT53YWl0X2Zvcl9mZXAJPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWFBPUlRTOyBpKyspIHsKLQkJYnJkLT5jaGFubmVsc1tpXSA9IE5VTEw7Ci0JfQotCi0JLyogc3RvcmUgd2hpY2ggY2FyZCAmIHJldmlzaW9uIHdlIGhhdmUgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmJyZC0+c3VidmVuZG9yKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmYnJkLT5zdWJkZXZpY2UpOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmJyZC0+cmV2KTsKLQotCXBjaV9pcnEgPSBwZGV2LT5pcnE7Ci0JYnJkLT5pcnEgPSBwY2lfaXJxOwotCi0JLyogZ2V0IHRoZSBQQ0kgQmFzZSBBZGRyZXNzIFJlZ2lzdGVycyAqLwotCi0JLyogWHIgSnVwaXRlciBhbmQgRVBDIHVzZSBCQVIgMiAqLwotCWlmIChicmQtPmRldmljZSA9PSBQQ0lfREVWSUNFX1hSSl9ESUQgfHwgYnJkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9FUENKX0RJRCkgewotCQlicmQtPm1lbWJhc2UgICAgID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOwotCQlicmQtPm1lbWJhc2VfZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCAyKTsKLQl9Ci0JLyogRXZlcnlvbmUgZWxzZSB1c2VzIEJBUiAwICovCi0JZWxzZSB7Ci0JCWJyZC0+bWVtYmFzZSAgICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JCWJyZC0+bWVtYmFzZV9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApOwotCX0KLQotCWlmICghYnJkLT5tZW1iYXNlKSB7Ci0JCUFQUigoImNhcmQgaGFzIG5vIFBDSSBJTyByZXNvdXJjZXMsIGZhaWxpbmcgYm9hcmQuXG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChicmQtPm1lbWJhc2UgJiAxKQotCQlicmQtPm1lbWJhc2UgJj0gfjM7Ci0JZWxzZQotCQlicmQtPm1lbWJhc2UgJj0gfjE1OwotCi0JLyoKLQkgKiBPbiB0aGUgUENJIGJvYXJkcywgdGhlcmUgaXMgbm8gSU8gc3BhY2UgYWxsb2NhdGVkCi0JICogVGhlIEkvTyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUKLQkgKiB1cHBlciAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UuICBUaGUgYm9hcmQgbWVtb3J5Ci0JICogd2lsbCBiZSBtYXBwZWQgaW50byB0aGUgbG93IDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZQotCSAqLwotCWJyZC0+cG9ydCA9IGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQ7Ci0JYnJkLT5wb3J0X2VuZCA9IGJyZC0+cG9ydCArIFBDSV9JT19TSVpFOwotCi0KLQkvKgotCSAqIFNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZm9yIG5vbi1QTFggYm9hcmRzCi0JICovCi0JaWYgKGJyZC0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfWFJKX0RJRCAmJiBicmQtPmRldmljZSAhPSBQQ0lfREVWSUNFX0VQQ0pfRElEKSB7Ci0JCXVuc2lnbmVkIHNob3J0IGNtZDsKLQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MCwgMCk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQ2LCAwKTsKLQotCQkvKiBMaW1pdCBidXJzdCBsZW5ndGggdG8gMiBkb3VibGV3b3JkIHRyYW5zYWN0aW9ucyAqLyAKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDIsIDEpOwotCi0JCS8qCi0JCSAqIEVuYWJsZSBJTyBhbmQgbWVtIGlmIG5vdCBhbHJlYWR5IGRvbmUuCi0JCSAqIFRoaXMgd2FzIG5lZWRlZCBmb3Igc3VwcG9ydCBvbiBJdGFuaXVtLgotCQkgKi8KLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgfD0gKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQotCS8qIGluaXQgb3VyIHBvbGwgaGVscGVyIHRhc2tsZXQgKi8KLQl0YXNrbGV0X2luaXQoJmJyZC0+aGVscGVyX3Rhc2tsZXQsIGRnYXBfcG9sbF90YXNrbGV0LCAodW5zaWduZWQgbG9uZykgYnJkKTsKLQotCSAvKiBMb2cgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBib2FyZCAqLwotCWRnYXBfbWJ1ZihicmQsIERSVlNUUiI6IGJvYXJkICVkOiAlcyAocmV2ICVkKSwgaXJxICVkXG4iLAotCQlkZ2FwX051bUJvYXJkcywgYnJkLT5uYW1lLCBicmQtPnJldiwgYnJkLT5pcnEpOwotCi0JRFBSX0lOSVQoKCJkZ2FwX3NjYW4oJWQpIC0gcHJpbnRpbmcgb3V0IHRoZSBtc2didWZcbiIsIGkpKTsKLQlER0FQX0xPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCWJyZC0+bXNnYnVmID0gTlVMTDsKLQlwcmludGsoIiVzIiwgYnJkLT5tc2didWZfaGVhZCk7Ci0Ja2ZyZWUoYnJkLT5tc2didWZfaGVhZCk7Ci0JYnJkLT5tc2didWZfaGVhZCA9IE5VTEw7Ci0JREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCi0JaSA9IGRnYXBfZG9fcmVtYXAoYnJkKTsKLQlpZiAoaSkKLQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQllbHNlCi0JCWJyZC0+c3RhdGUgPSBORUVEX1JFU0VUOwotCi0gICAgICAgIHJldHVybigwKTsKLX0KLQotCi1pbnQgZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpIHsKLQotICAgICAgICBpbnQgcmM7Ci0KLSAgICAgICAgRFBSX0lOSVQoKCJkZ2FwX2ZpbmFsaXplX2JvYXJkX2luaXQoKSAtIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0gICAgICAgICAgICAgICAgcmV0dXJuKC1FTk9ERVYpOwotCi0gICAgICAgIERQUl9JTklUKCgiZGdhcF9maW5hbGl6ZV9ib2FyZF9pbml0KCkgLSBzdGFydCAjMlxuIikpOwotCi0JYnJkLT51c2VfaW50ZXJydXB0cyA9IGRnYXBfY29uZmlnX2dldF91c2VpbnRyKGJyZCk7Ci0KLQkvKgotCSAqIFNldCB1cCBvdXIgaW50ZXJydXB0IGhhbmRsZXIgaWYgd2UgYXJlIHNldCB0byBkbyBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChicmQtPnVzZV9pbnRlcnJ1cHRzICYmIGJyZC0+aXJxKSB7Ci0KLQkJcmMgPSByZXF1ZXN0X2lycShicmQtPmlycSwgZGdhcF9pbnRyLCBJUlFGX1NIQVJFRCwgIkRHQVAiLCBicmQpOwotCi0JCWlmIChyYykgewotCQkJZGdhcF9tYnVmKGJyZCwgRFJWU1RSIjogRmFpbGVkIHRvIGhvb2sgSVJRICVkLiBCb2FyZCB3aWxsIHdvcmsgaW4gcG9sbCBtb2RlLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmQtPmlycSk7Ci0JCQlicmQtPmludHJfdXNlZCA9IDA7Ci0JCX0KLQkJZWxzZQotCQkJYnJkLT5pbnRyX3VzZWQgPSAxOwotCX0gZWxzZSB7Ci0JCWJyZC0+aW50cl91c2VkID0gMDsKLQl9Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIFJlbWFwIFBDSSBtZW1vcnkuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF9kb19yZW1hcChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDAsICJkZ2FwIikpIHsKLQkJQVBSKCgiZGdhcDogbWVtX3JlZ2lvbiAlbHggYWxyZWFkeSBpbiB1c2UuXG4iLCBicmQtPm1lbWJhc2UpKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQsIDB4MjAwMDAwLCAiZGdhcCIpKSB7Ci0JCUFQUigoImRnYXA6IG1lbV9yZWdpb24gSU8gJWx4IGFscmVhZHkgaW4gdXNlLlxuIiwKLQkJCWJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQpKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSwgMHgyMDAwMDApOwotCQlyZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQotCi0JYnJkLT5yZV9tYXBfbWVtYmFzZSA9IGlvcmVtYXAoYnJkLT5tZW1iYXNlLCAweDIwMDAwMCk7Ci0JaWYgKCFicmQtPnJlX21hcF9tZW1iYXNlKSB7Ci0JCUFQUigoImRnYXA6IGlvcmVtYXAgbWVtICVseCBjYW5ub3QgYmUgbWFwcGVkLlxuIiwgYnJkLT5tZW1iYXNlKSk7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQsIDB4MjAwMDAwKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYnJkLT5yZV9tYXBfcG9ydCA9IGlvcmVtYXAoKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQpLCAweDIwMDAwMCk7Ci0JaWYgKCFicmQtPnJlX21hcF9wb3J0KSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihicmQtPm1lbWJhc2UsIDB4MjAwMDAwKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJyZC0+bWVtYmFzZSArIFBDSV9JT19PRkZTRVQsIDB4MjAwMDAwKTsKLQkJaW91bm1hcChicmQtPnJlX21hcF9tZW1iYXNlKTsKLQkJQVBSKCgiZGdhcDogaW9yZW1hcCBJTyBtZW0gJWx4IGNhbm5vdCBiZSBtYXBwZWQuXG4iLAotCQkJYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVCkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlEUFJfSU5JVCgoInJlbWFwcGVkIGlvOiAweCVwICByZW1hcHBlZCBtZW06IDB4JXBcbiIsCi0JCWJyZC0+cmVfbWFwX3BvcnQsIGJyZC0+cmVfbWFwX21lbWJhc2UpKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246Ci0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qICAgIGRnYXBfcG9sbF9oYW5kbGVyCi0qCi0qIEF1dGhvcjoKLSoKLSogICAgU2NvdHQgSCBLaWxhdQotKiAgICAgICAKLSogUGFyYW1ldGVyczoKLSoKLSogICAgZHVtbXkgLS0gaWdub3JlZCAgICAgICAgICAgICAgICAgICAgCi0qCi0qIFJldHVybiBWYWx1ZXM6Ci0qCi0qICAgIG5vbmUKLSoKLSogRGVzY3JpcHRpb246ICAgCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qICAgIEFzIGVhY2ggdGltZXIgZXhwaXJlcywgaXQgZGV0ZXJtaW5lcyAoYSkgd2hldGhlciB0aGUgInRyYW5zbWl0IgotKiAgICB3YWl0ZXIgbmVlZHMgdG8gYmUgd29rZW4gdXAsIGFuZCAoYikgd2hldGhlciB0aGUgcG9sbGVyIG5lZWRzIHRvCi0qICAgIGJlIHJlc2NoZWR1bGVkLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBkZ2FwX3BvbGxfaGFuZGxlcih1bG9uZyBkdW1teSkKLXsKLQlpbnQgaTsKLSAgICAgICAgc3RydWN0IGJvYXJkX3QgKmJyZDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotICAgICAgICB1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MyOwotCXVsb25nIG5ld190aW1lOwotCi0JZGdhcF9wb2xsX2NvdW50ZXIrKzsKLQotCi0JLyoKLQkgKiBJZiBkcml2ZXIgbmVlZHMgdGhlIGNvbmZpZyBmaWxlIHN0aWxsLAotCSAqIGtlZXAgdHJ5aW5nIHRvIHdha2UgdXAgdGhlIGRvd25sb2FkZXIgdG8KLQkgKiBzZW5kIHVzIHRoZSBmaWxlLgotCSAqLwotICAgICAgICBpZiAoZGdhcF9kcml2ZXJfc3RhdGUgPT0gRFJJVkVSX05FRURfQ09ORklHX0xPQUQpIHsKLQkJLyoKLQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkgKi8KLQkJREdBUF9MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJZGdhcF9kbF9hY3Rpb24gPSAxOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZ2FwX2RsX3dhaXQpOwotCQl9Ci0JCURHQVBfVU5MT0NLKGRnYXBfZGxfbG9jaywgbG9ja19mbGFnczIpOwotCQlnb3RvIHNjaGVkdWxlX3BvbGxlcjsKLSAgICAgICAgfQotCS8qCi0JICogRG8gbm90IHN0YXJ0IHRoZSBib2FyZCBzdGF0ZSBtYWNoaW5lIHVudGlsCi0JICogZHJpdmVyIHRlbGxzIHVzIGl0cyB1cCBhbmQgcnVubmluZywgYW5kIGhhcwotCSAqIGV2ZXJ5dGhpbmcgaXQgbmVlZHMuCi0JICovCi0JZWxzZSBpZiAoZGdhcF9kcml2ZXJfc3RhdGUgIT0gRFJJVkVSX1JFQURZKSB7Ci0JCWdvdG8gc2NoZWR1bGVfcG9sbGVyOwotCX0KLQotCS8qCi0JICogSWYgd2UgaGF2ZSBqdXN0IDEgYm9hcmQsIG9yIHRoZSBzeXN0ZW0gaXMgbm90IFNNUCwKLQkgKiB0aGVuIHVzZSB0aGUgdHlwaWNhbCBvbGQgc3R5bGUgcG9sbGVyLgotCSAqIE90aGVyd2lzZSwgdXNlIG91ciBuZXcgdGFza2xldCBiYXNlZCBwb2xsZXIsIHdoaWNoIHNob3VsZAotCSAqIHNwZWVkIHRoaW5ncyB1cCBmb3IgbXVsdGlwbGUgYm9hcmRzLgotCSAqLwotCWlmICggKGRnYXBfTnVtQm9hcmRzID09IDEpIHx8IChudW1fb25saW5lX2NwdXMoKSA8PSAxKSApIHsKLQkJZm9yIChpID0gMDsgaSA8IGRnYXBfTnVtQm9hcmRzOyBpKyspIHsKLQotCQkJYnJkID0gZGdhcF9Cb2FyZFtpXTsKLQotCQkJaWYgKGJyZC0+c3RhdGUgPT0gQk9BUkRfRkFJTEVEKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIWJyZC0+aW50cl9ydW5uaW5nKSB7Ci0JCQkJLyogQ2FsbCB0aGUgcmVhbCBib2FyZCBwb2xsZXIgZGlyZWN0bHkgKi8KLQkJCQlkZ2FwX3BvbGxfdGFza2xldCgodW5zaWduZWQgbG9uZykgYnJkKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlIHsKLQkJLyogR28gdGhydSBlYWNoIGJvYXJkLCBraWNraW5nIG9mZiBhIHRhc2tsZXQgZm9yIGVhY2ggaWYgbmVlZGVkICovCi0JCWZvciAoaSA9IDA7IGkgPCBkZ2FwX051bUJvYXJkczsgaSsrKSB7Ci0JCQlicmQgPSBkZ2FwX0JvYXJkW2ldOwotCi0JCQkvKgotCQkJICogQXR0ZW1wdCB0byBncmFiIHRoZSBib2FyZCBsb2NrLgotCQkJICoKLQkJCSAqIElmIHdlIGNhbid0IGdldCBpdCwgbm8gYmlnIGRlYWwsIHRoZSBuZXh0IHBvbGwgd2lsbCBnZXQgaXQuCi0JCQkgKiBCYXNpY2FsbHksIEkganVzdCByZWFsbHkgZG9uJ3Qgd2FudCB0byBzcGluIGluIGhlcmUsIGJlY2F1c2UgSSB3YW50Ci0JCQkgKiB0byBraWNrIG9mZiBteSB0YXNrbGV0cyBhcyBmYXN0IGFzIEkgY2FuLCBhbmQgdGhlbiBnZXQgb3V0IHRoZSBwb2xsZXIuCi0JCQkgKi8KLQkJCWlmICghc3Bpbl90cnlsb2NrKCZicmQtPmJkX2xvY2spKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIElmIGJvYXJkIGlzIGluIGEgZmFpbGVkIHN0YXRlLCBkb24ndCBib3RoZXIgc2NoZWR1bGluZyBhIHRhc2tsZXQgKi8KLQkJCWlmIChicmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQkJCXNwaW5fdW5sb2NrKCZicmQtPmJkX2xvY2spOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBTY2hlZHVsZSBhIHBvbGwgaGVscGVyIHRhc2sgKi8KLQkJCWlmICghYnJkLT5pbnRyX3J1bm5pbmcpIHsKLQkJCQl0YXNrbGV0X3NjaGVkdWxlKCZicmQtPmhlbHBlcl90YXNrbGV0KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIENhbid0IGRvIERHQVBfVU5MT0NLIGhlcmUsIGFzIHdlIGRvbid0IGhhdmUKLQkJCSAqIGxvY2tfZmxhZ3MgYmVjYXVzZSB3ZSBkaWQgYSB0cnlsb2NrIGFib3ZlLgotCQkJICovCi0JCQlzcGluX3VubG9jaygmYnJkLT5iZF9sb2NrKTsKLQkJfQotCX0KLQotc2NoZWR1bGVfcG9sbGVyOgotCi0JLyoKLQkgKiBTY2hlZHVsZSBvdXJzZWxmIGJhY2sgYXQgdGhlIG5vbWluYWwgd2FrZXVwIGludGVydmFsLgotCSAqLwotCURHQVBfTE9DSyhkZ2FwX3BvbGxfbG9jaywgbG9ja19mbGFncyApOwotCWRnYXBfcG9sbF90aW1lICs9ICBkZ2FwX2ppZmZpZXNfZnJvbV9tcyhkZ2FwX3BvbGxfdGljayk7Ci0KLQluZXdfdGltZSA9IGRnYXBfcG9sbF90aW1lIC0gamlmZmllczsKLQotCWlmICgodWxvbmcpIG5ld190aW1lID49IDIgKiBkZ2FwX3BvbGxfdGljaykgewotCQlkZ2FwX3BvbGxfdGltZSA9IGppZmZpZXMgKyAgZGdhcF9qaWZmaWVzX2Zyb21fbXMoZGdhcF9wb2xsX3RpY2spOwotCX0KLQotCWRnYXBfcG9sbF90aW1lci5mdW5jdGlvbiA9IGRnYXBfcG9sbF9oYW5kbGVyOwotCWRnYXBfcG9sbF90aW1lci5kYXRhID0gMDsKLQlkZ2FwX3BvbGxfdGltZXIuZXhwaXJlcyA9IGRnYXBfcG9sbF90aW1lOwotCURHQVBfVU5MT0NLKGRnYXBfcG9sbF9sb2NrLCBsb2NrX2ZsYWdzICk7Ci0KLQlpZiAoIWRnYXBfcG9sbF9zdG9wKQotCQlhZGRfdGltZXIoJmRnYXBfcG9sbF90aW1lcik7Ci19Ci0KLQotCi0KLS8qCi0gKiBkZ2FwX2ludHIoKQotICoKLSAqIERyaXZlciBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqLwotc3RhdGljIGlycXJldHVybl90IGRnYXBfaW50cihpbnQgaXJxLCB2b2lkICp2b2lkYnJkKQotewotCXN0cnVjdCBib2FyZF90ICpicmQgPSAoc3RydWN0IGJvYXJkX3QgKikgdm9pZGJyZDsKLQotCWlmICghYnJkKSB7Ci0JCUFQUigoIlJlY2VpdmVkIGludGVycnVwdCAoJWQpIHdpdGggbnVsbCBib2FyZCBhc3NvY2lhdGVkXG4iLCBpcnEpKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdG8gbWFrZSBzdXJlIGl0cyBmb3IgdXMuCi0JICovCi0JaWYgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgewotCQlBUFIoKCJSZWNlaXZlZCBpbnRlcnJ1cHQgKCVkKSB3aXRoIGEgYm9hcmQgcG9pbnRlciB0aGF0IHdhc24ndCBvdXJzIVxuIiwgaXJxKSk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlicmQtPmludHJfY291bnQrKzsKLQotCS8qCi0JICogU2NoZWR1bGUgdGFza2xldCB0byBydW4gYXQgYSBiZXR0ZXIgdGltZS4KLQkgKi8KLQl0YXNrbGV0X3NjaGVkdWxlKCZicmQtPmhlbHBlcl90YXNrbGV0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotLyoKLSAqIGRnYXBfaW5pdF9nbG9iYWxzKCkKLSAqCi0gKiBUaGlzIGlzIHdoZXJlIHdlIGluaXRpYWxpemUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgc3RhdGljIGluc21vZAotICogY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuICBUaGVzZSBhcmUgZGVjbGFyZWQgbmVhciB0aGUgaGVhZCBvZgotICogdGhpcyBmaWxlLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2luaXRfZ2xvYmFscyh2b2lkKQotewotCWludCBpID0gMDsKLQotCWRnYXBfcmF3cmVhZG9rCQk9IHJhd3JlYWRvazsKLSAgICAgICAgZGdhcF90cmNidWZfc2l6ZQk9IHRyY2J1Zl9zaXplOwotCWRnYXBfZGVidWcJCT0gZGVidWc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYQk9BUkRTOyBpKyspIHsKLQkJZGdhcF9Cb2FyZFtpXSA9IE5VTEw7Ci0JfQotCi0JaW5pdF90aW1lciggJmRnYXBfcG9sbF90aW1lciApOyAKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRnYXBfZGxfd2FpdCk7Ci0JZGdhcF9kbF9hY3Rpb24gPSAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBVdGlsaXR5IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIGRnYXBfbWJ1ZigpCi0gKgotICogVXNlZCB0byBwcmludCB0byB0aGUgbWVzc2FnZSBidWZmZXIgZHVyaW5nIGJvYXJkIGluaXQuCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfbWJ1ZihzdHJ1Y3QgYm9hcmRfdCAqYnJkLCBjb25zdCBjaGFyICpmbXQsIC4uLikgewotCXZhX2xpc3QJCWFwOwotCWNoYXIJCWJ1ZlsxMDI0XTsKLQlpbnQJCWk7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQlzaXplX3QJCWxlbmd0aDsKLQotCURHQVBfTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBGb3JtYXQgYnVmIHVzaW5nIGZtdCBhbmQgYXJndW1lbnRzIGNvbnRhaW5lZCBpbiBhcC4gKi8KLQl2YV9zdGFydChhcCwgZm10KTsKLQlpID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgIGFwKTsKLQl2YV9lbmQoYXApOwotCi0JRFBSKChidWYpKTsKLQotCWlmICghYnJkIHx8ICFicmQtPm1zZ2J1ZikgewotCQlwcmludGsoIiVzIiwgYnVmKTsKLQkJREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JbGVuZ3RoID0gc3RybGVuKGJ1ZikgKyAxOwotCWlmIChicmQtPm1zZ2J1ZiAtIGJyZC0+bXNnYnVmX2hlYWQgPCBsZW5ndGgpCi0JCWxlbmd0aCA9IGJyZC0+bXNnYnVmIC0gYnJkLT5tc2didWZfaGVhZDsKLQltZW1jcHkoYnJkLT5tc2didWYsIGJ1ZiwgbGVuZ3RoKTsKLQlicmQtPm1zZ2J1ZiArPSBsZW5ndGg7Ci0KLQlER0FQX1VOTE9DSyhkZ2FwX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfbXNfc2xlZXAoKQotICoKLSAqIFB1dCB0aGUgZHJpdmVyIHRvIHNsZWVwIGZvciB4IG1zJ3MKLSAqCi0gKiBSZXR1cm5zIDAgaWYgdGltZWQgb3V0LCAhMCAoc2hvd2luZyBzaWduYWwpIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgotICovCi1pbnQgZGdhcF9tc19zbGVlcCh1bG9uZyBtcykKLXsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KChtcyAqIEhaKSAvIDEwMDApOwotCXJldHVybiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOwotfQotCi0KLQotLyoKLSAqICAgICAgZGdhcF9pb2N0bF9uYW1lKCkgOiBSZXR1cm5zIGEgdGV4dCB2ZXJzaW9uIG9mIGVhY2ggaW9jdGwgdmFsdWUuCi0gKi8KLWNoYXIgKmRnYXBfaW9jdGxfbmFtZShpbnQgY21kKQotewotCXN3aXRjaChjbWQpIHsKLQotCWNhc2UgVENHRVRBOgkJcmV0dXJuKCJUQ0dFVEEiKTsKLQljYXNlIFRDR0VUUzoJCXJldHVybigiVENHRVRTIik7Ci0JY2FzZSBUQ1NFVEE6CQlyZXR1cm4oIlRDU0VUQSIpOwotCWNhc2UgVENTRVRTOgkJcmV0dXJuKCJUQ1NFVFMiKTsKLQljYXNlIFRDU0VUQVc6CQlyZXR1cm4oIlRDU0VUQVciKTsKLQljYXNlIFRDU0VUU1c6CQlyZXR1cm4oIlRDU0VUU1ciKTsKLQljYXNlIFRDU0VUQUY6CQlyZXR1cm4oIlRDU0VUQUYiKTsKLQljYXNlIFRDU0VUU0Y6CQlyZXR1cm4oIlRDU0VUU0YiKTsKLQljYXNlIFRDU0JSSzoJCXJldHVybigiVENTQlJLIik7Ci0JY2FzZSBUQ1hPTkM6CQlyZXR1cm4oIlRDWE9OQyIpOwotCWNhc2UgVENGTFNIOgkJcmV0dXJuKCJUQ0ZMU0giKTsKLQljYXNlIFRJT0NHU0lEOgkJcmV0dXJuKCJUSU9DR1NJRCIpOwotCi0JY2FzZSBUSU9DR0VURDoJCXJldHVybigiVElPQ0dFVEQiKTsKLQljYXNlIFRJT0NTRVREOgkJcmV0dXJuKCJUSU9DU0VURCIpOwotCWNhc2UgVElPQ0dXSU5TWjoJcmV0dXJuKCJUSU9DR1dJTlNaIik7Ci0JY2FzZSBUSU9DU1dJTlNaOglyZXR1cm4oIlRJT0NTV0lOU1oiKTsKLQotCWNhc2UgVElPQ01HRVQ6CQlyZXR1cm4oIlRJT0NNR0VUIik7Ci0JY2FzZSBUSU9DTVNFVDoJCXJldHVybigiVElPQ01TRVQiKTsKLQljYXNlIFRJT0NNQklTOgkJcmV0dXJuKCJUSU9DTUJJUyIpOwotCWNhc2UgVElPQ01CSUM6CQlyZXR1cm4oIlRJT0NNQklDIik7Ci0KLQkvKiBmcm9tIGRpZ2kuaCAqLwotCWNhc2UgRElHSV9TRVRBOgkJcmV0dXJuKCJESUdJX1NFVEEiKTsKLQljYXNlIERJR0lfU0VUQVc6CXJldHVybigiRElHSV9TRVRBVyIpOwotCWNhc2UgRElHSV9TRVRBRjoJcmV0dXJuKCJESUdJX1NFVEFGIik7Ci0JY2FzZSBESUdJX1NFVEZMT1c6CXJldHVybigiRElHSV9TRVRGTE9XIik7Ci0JY2FzZSBESUdJX1NFVEFGTE9XOglyZXR1cm4oIkRJR0lfU0VUQUZMT1ciKTsKLQljYXNlIERJR0lfR0VURkxPVzoJcmV0dXJuKCJESUdJX0dFVEZMT1ciKTsKLQljYXNlIERJR0lfR0VUQUZMT1c6CXJldHVybigiRElHSV9HRVRBRkxPVyIpOwotCWNhc2UgRElHSV9HRVRBOgkJcmV0dXJuKCJESUdJX0dFVEEiKTsKLQljYXNlIERJR0lfR0VERUxBWToJcmV0dXJuKCJESUdJX0dFREVMQVkiKTsKLQljYXNlIERJR0lfU0VERUxBWToJcmV0dXJuKCJESUdJX1NFREVMQVkiKTsKLQljYXNlIERJR0lfR0VUQ1VTVE9NQkFVRDogcmV0dXJuKCJESUdJX0dFVENVU1RPTUJBVUQiKTsKLQljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDogcmV0dXJuKCJESUdJX1NFVENVU1RPTUJBVUQiKTsKLQljYXNlIFRJT0NNT0RHOgkJcmV0dXJuKCJUSU9DTU9ERyIpOwotCWNhc2UgVElPQ01PRFM6CQlyZXR1cm4oIlRJT0NNT0RTIik7Ci0JY2FzZSBUSU9DU0RUUjoJCXJldHVybigiVElPQ1NEVFIiKTsKLQljYXNlIFRJT0NDRFRSOgkJcmV0dXJuKCJUSU9DQ0RUUiIpOwotCi0JZGVmYXVsdDoJCXJldHVybigidW5rbm93biIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2RyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdhNTVhNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2RyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEcml2ZXIgaW5jbHVkZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0RHQVBfRFJJVkVSX0gKLSNkZWZpbmUgX19ER0FQX0RSSVZFUl9ICi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CS8qIFRvIGdldCB0aGUgY3VycmVudCBMaW51eCB2ZXJzaW9uICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gICAgICAgIC8qIFRvIHBpY2sgdXAgdGhlIHZhcmlvbnMgTGludXggdHlwZXMgKi8KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4gICAgICAgICAgLyogVG8gcGljayB1cCB0aGUgdmFyaW91cyB0dHkgc3RydWN0cy9kZWZpbmVzICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+ICAgIC8qIEZvciBpcnFyZXR1cm5fdCB0eXBlICovCi0KLSNpbmNsdWRlICJkZ2FwX3R5cGVzLmgiICAgICAgICAgLyogQWRkaXRpb25hbCB0eXBlcyBuZWVkZWQgYnkgdGhlIERpZ2kgaGVhZGVyIGZpbGVzICovCi0jaW5jbHVkZSAiZGlnaS5oIiAgICAgICAgICAgICAgIC8qIERpZ2kgc3BlY2lmaWMgaW9jdGwgaGVhZGVyICovCi0jaW5jbHVkZSAiZGdhcF9rY29tcGF0LmgiICAgICAgIC8qIEtlcm5lbCAyLjQvMi42IGNvbXBhdCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgImRnYXBfc3lzZnMuaCIJCS8qIFN1cHBvcnQgZm9yIFNZU0ZTICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRHJpdmVyIGRlZmluZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIERyaXZlciBpZGVudGlmaWNhdGlvbiwgZXJyb3IgYW5kIGRlYnVnZ2luZyBzdGF0bWVudHMKLSAqCi0gKiBJbiB0aGVvcnksIHlvdSBjYW4gY2hhbmdlIGFsbCBvY2N1cnJlbmNlcyBvZiAiZGlnaSIgaW4gdGhlIG5leHQKLSAqIHRocmVlIGxpbmVzLCBhbmQgdGhlIGRyaXZlciBwcmludGsncyB3aWxsIGFsbCBhdXRvbWFnaWNhbGx5IGNoYW5nZS4KLSAqCi0gKiBBUFIoKGZtdCwgYXJncywgLi4uKSk7CUFsd2F5cyBwcmludHMgbWVzc2FnZQotICogRFBSKChmbXQsIGFyZ3MsIC4uLikpOwlPbmx5IHByaW50cyBpZiBER0FQX1RSQUNFUiBpcyBkZWZpbmVkIGF0Ci0gKgkJCQkgIGNvbXBpbGUgdGltZSBhbmQgZGdhcF9kZWJ1ZyE9MAotICovCi0jZGVmaW5lCURHX05BTUUJCSJkZ2FwLTEuMy0xNiIKLSNkZWZpbmUJREdfUEFSVAkJIjQwMDAyMzQ3X0MiCi0KLSNkZWZpbmUJUFJPQ1NUUgkJImRnYXAiCQkJLyogL3Byb2MgZW50cmllcwkgKi8KLSNkZWZpbmUJREVWU1RSCQkiL2Rldi9kZy9kZ2FwIgkJLyogL2RldiBlbnRyaWVzCQkgKi8KLSNkZWZpbmUJRFJWU1RSCQkiZGdhcCIJCQkvKiBEcml2ZXIgbmFtZSBzdHJpbmcgCi0JCQkJCQkgKiBkaXNwbGF5ZWQgYnkgQVBSCSAqLwotI2RlZmluZQlBUFIoYXJncykJZG8geyBQUklOVEZfVE9fS01FTShhcmdzKTsgcHJpbnRrKERSVlNUUiI6ICIpOyBwcmludGsgYXJnczsgXAotCQkJICAgfSB3aGlsZSAoMCkKLSNkZWZpbmUJUkFQUihhcmdzKQlkbyB7IFBSSU5URl9UT19LTUVNKGFyZ3MpOyBwcmludGsgYXJnczsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUUkNfVE9fQ09OU09MRSAxCi0KLS8qCi0gKiBEZWJ1Z2dpbmcgbGV2ZWxzIGNhbiBiZSBzZXQgdXNpbmcgZGVidWcgaW5zbW9kIHZhcmlhYmxlCi0gKiBUaGV5IGNhbiBhbHNvIGJlIGNvbXBpbGVkIG91dCBjb21wbGV0ZWx5LgotICovCi0KLSNkZWZpbmUJREJHX0lOSVQJCShkZ2FwX2RlYnVnICYgMHgwMSkKLSNkZWZpbmUJREJHX0JBU0lDCQkoZGdhcF9kZWJ1ZyAmIDB4MDIpCi0jZGVmaW5lCURCR19DT1JFCQkoZGdhcF9kZWJ1ZyAmIDB4MDQpCi0KLSNkZWZpbmUJREJHX09QRU4JCShkZ2FwX2RlYnVnICYgMHgwOCkKLSNkZWZpbmUJREJHX0NMT1NFCQkoZGdhcF9kZWJ1ZyAmIDB4MTApCi0jZGVmaW5lCURCR19SRUFECQkoZGdhcF9kZWJ1ZyAmIDB4MjApCi0jZGVmaW5lCURCR19XUklURQkJKGRnYXBfZGVidWcgJiAweDQwKQotCi0jZGVmaW5lCURCR19JT0NUTAkJKGRnYXBfZGVidWcgJiAweDgwKQotCi0jZGVmaW5lCURCR19QUk9DCQkoZGdhcF9kZWJ1ZyAmIDB4MTAwKQotI2RlZmluZQlEQkdfUEFSQU0JCShkZ2FwX2RlYnVnICYgMHgyMDApCi0jZGVmaW5lCURCR19QU0NBTgkJKGRnYXBfZGVidWcgJiAweDQwMCkKLSNkZWZpbmUJREJHX0VWRU5UCQkoZGdhcF9kZWJ1ZyAmIDB4ODAwKQotCi0jZGVmaW5lCURCR19EUkFJTgkJKGRnYXBfZGVidWcgJiAweDEwMDApCi0jZGVmaW5lCURCR19DQVJSCQkoZGdhcF9kZWJ1ZyAmIDB4MjAwMCkKLQotI2RlZmluZQlEQkdfTUdNVAkJKGRnYXBfZGVidWcgJiAweDQwMDApCi0KLQotI2lmIGRlZmluZWQoREdBUF9UUkFDRVIpCi0KLSMgaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLS8qIENob29zZSBvbmU6ICovCi0jICBkZWZpbmUgVFJDX09OX09WRVJGTE9XX1dSQVBfQVJPVU5ECi0jICB1bmRlZiAgVFJDX09OX09WRVJGTE9XX1NISUZUX0JVRkZFUgotIyBlbmRpZiAvL1RSQ19UT19LTUVNCi0KLSMgZGVmaW5lIFRSQ19NQVhNU0cJCTEwMjQKLSMgZGVmaW5lIFRSQ19PVkVSRkxPVwkJIihPVkVSRkxPVykiCi0jIGRlZmluZSBUUkNfRFRSQwkJIi91c3IvYmluL2R0cmMiCi0KLSNpZiBkZWZpbmVkIFRSQ19UT19DT05TT0xFCi0jZGVmaW5lIFBSSU5URl9UT19DT05TT0xFKGFyZ3MpIHsgcHJpbnRrKERSVlNUUiI6ICIpOyBwcmludGsgYXJnczsgfQotI2Vsc2UgLy8hZGVmaW5lZCBUUkFDRV9UT19DT05TT0xFCi0jZGVmaW5lIFBSSU5URl9UT19DT05TT0xFKGFyZ3MpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgVFJDX1RPX0tNRU0KLSNkZWZpbmUgUFJJTlRGX1RPX0tNRU0oYXJncykgZGdhcF90cmFjZWYgYXJncyAKLSNlbHNlIC8vIWRlZmluZWQgVFJDX1RPX0tNRU0KLSNkZWZpbmUgUFJJTlRGX1RPX0tNRU0oYXJncykKLSNlbmRpZgotCi0jZGVmaW5lCVRSQyhhcmdzKQl7IFBSSU5URl9UT19LTUVNKGFyZ3MpOyBQUklOVEZfVE9fQ09OU09MRShhcmdzKSB9Ci0KLSMgZGVmaW5lIERQUl9JTklUKEFSR1MpCQlpZiAoREJHX0lOSVQpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0JBU0lDKEFSR1MpCWlmIChEQkdfQkFTSUMpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0NPUkUoQVJHUykJCWlmIChEQkdfQ09SRSkgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfT1BFTihBUkdTKQkJaWYgKERCR19PUEVOKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfQ0xPU0UoQVJHUykJaWYgKERCR19DTE9TRSkgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1JFQUQoQVJHUykJCWlmIChEQkdfUkVBRCkgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1dSSVRFKEFSR1MpCWlmIChEQkdfV1JJVEUpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0lPQ1RMKEFSR1MpCWlmIChEQkdfSU9DVEwpIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1BST0MoQVJHUykJCWlmIChEQkdfUFJPQykgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX1BBUkFNKEFSR1MpCWlmIChEQkdfUEFSQU0pICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9QU0NBTihBUkdTKQlpZiAoREJHX1BTQ0FOKSAgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfRVZFTlQoQVJHUykJaWYgKERCR19FVkVOVCkgIFRSQyhBUkdTKQotIyBkZWZpbmUgRFBSX0RSQUlOKEFSR1MpCWlmIChEQkdfRFJBSU4pICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9DQVJSKEFSR1MpCQlpZiAoREJHX0NBUlIpICBUUkMoQVJHUykKLSMgZGVmaW5lIERQUl9NR01UKEFSR1MpCQlpZiAoREJHX01HTVQpICBUUkMoQVJHUykKLQotIyBkZWZpbmUgRFBSKEFSR1MpCQlpZiAoZGdhcF9kZWJ1ZykgVFJDKEFSR1MpCi0jIGRlZmluZSBQKFgpCQkJZGdhcF90cmFjZWYoI1ggIj0lcFxuIiwgWCkKLSMgZGVmaW5lIFgoWCkJCQlkZ2FwX3RyYWNlZigjWCAiPSV4XG4iLCBYKQotCi0jZWxzZS8vIWRlZmluZWQgREdBUF9UUkFDRVIKLQotI2RlZmluZSBQUklOVEZfVE9fS01FTShhcmdzKQotIyBkZWZpbmUgVFJDKEFSR1MpCi0jIGRlZmluZSBEUFJfSU5JVChBUkdTKQotIyBkZWZpbmUgRFBSX0JBU0lDKEFSR1MpCi0jIGRlZmluZSBEUFJfQ09SRShBUkdTKQotIyBkZWZpbmUgRFBSX09QRU4oQVJHUykKLSMgZGVmaW5lIERQUl9DTE9TRShBUkdTKQotIyBkZWZpbmUgRFBSX1JFQUQoQVJHUykKLSMgZGVmaW5lIERQUl9XUklURShBUkdTKQotIyBkZWZpbmUgRFBSX0lPQ1RMKEFSR1MpCi0jIGRlZmluZSBEUFJfUFJPQyhBUkdTKQotIyBkZWZpbmUgRFBSX1BBUkFNKEFSR1MpCi0jIGRlZmluZSBEUFJfUFNDQU4oQVJHUykKLSMgZGVmaW5lIERQUl9FVkVOVChBUkdTKQotIyBkZWZpbmUgRFBSX0RSQUlOKEFSR1MpCi0jIGRlZmluZSBEUFJfQ0FSUihBUkdTKQotIyBkZWZpbmUgRFBSX01HTVQoQVJHUykKLQotIyBkZWZpbmUgRFBSKGFyZ3MpCi0KLSNlbmRpZi8vREdBUF9UUkFDRVIKLQotLyogTnVtYmVyIG9mIGJvYXJkcyB3ZSBzdXBwb3J0IGF0IG9uY2UuICovCi0jZGVmaW5lCU1BWEJPQVJEUwkzMgotI2RlZmluZQlNQVhQT1JUUwkyMjQKLSNkZWZpbmUgTUFYVFRZTkFNRUxFTgkyMDAKLQotLyogT3VyIDMgbWFnaWMgbnVtYmVycyBmb3Igb3VyIGJvYXJkLCBjaGFubmVsIGFuZCB1bml0IHN0cnVjdHMgKi8KLSNkZWZpbmUgREdBUF9CT0FSRF9NQUdJQwkweDVjNmRmMTA0Ci0jZGVmaW5lIERHQVBfQ0hBTk5FTF9NQUdJQwkweDZjNmRmMTA0Ci0jZGVmaW5lIERHQVBfVU5JVF9NQUdJQwkJMHg3YzZkZjEwNAotCi0vKiBTZXJpYWwgcG9ydCB0eXBlcyAqLwotI2RlZmluZSBER0FQX1NFUklBTAkJMAotI2RlZmluZSBER0FQX1BSSU5UCQkxCi0KLSNkZWZpbmUJU0VSSUFMX1RZUEVfTk9STUFMCTEKLQotLyogNCBleHRyYSBmb3IgYWxpZ25tZW50IHBsYXkgc3BhY2UgKi8KLSNkZWZpbmUgV1JJVEVCVUZMRU4JCSgoNDA5NikgKyA0KQotI2RlZmluZSBNWUZMSVBMRU4JCU5fVFRZX0JVRl9TSVpFCi0KLSNkZWZpbmUgU0JSRUFLX1RJTUUgMHgyNQotI2RlZmluZSBVMkJTSVpFIDB4NDAwCi0KLSNkZWZpbmUgZGdhcF9qaWZmaWVzX2Zyb21fbXMoYSkgKCgoYSkgKiBIWikgLyAxMDAwKQotCi0vKgotICogT3VyIG1ham9yIGZvciB0aGUgbWdtdCBkZXZpY2VzLgotICoKLSAqIFdlIGNhbiB1c2UgMjIsIGJlY2F1c2UgRGlnaSB3YXMgYWxsb2NhdGVkIDIyIGFuZCAyMyBmb3IgdGhlIGVwY2EgZHJpdmVyLgotICogMjIgaGFzIG5vdyBiZWNvbWUgb2Jzb2xldGUgbm93IHRoYXQgdGhlICJjdSIgZGV2aWNlcyBoYXZlIAotICogYmVlbiByZW1vdmVkIGZyb20gMi42LgotICogQWxzbywgdGhpcyAqSVMqIHRoZSBlcGNhIGRyaXZlciwganVzdCBQQ0kgb25seSBub3cuCi0gKi8KLSNpZm5kZWYgRElHSV9ER0FQX01BSk9SCi0jIGRlZmluZSBESUdJX0RHQVBfTUFKT1IgICAgICAgICAyMgotI2VuZGlmCi0KLS8qCi0gKiBUaGUgcGFyYW1ldGVycyB3ZSB1c2UgdG8gZGVmaW5lIHRoZSBwZXJpb2RzIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZXMuCi0gKi8KLSNkZWZpbmUJCU1BX1BFUklPRAkoSFogLyAxMCkKLSNkZWZpbmUJCVNNQV9EVVIJCSgxICogSFopCi0jZGVmaW5lCQlFTUFfRFVSCQkoMSAqIEhaKQotI2RlZmluZQkJU01BX05QRVJJT0RTCShTTUFfRFVSIC8gTUFfUEVSSU9EKQotI2RlZmluZQkJRU1BX05QRVJJT0RTCShFTUFfRFVSIC8gTUFfUEVSSU9EKQotCi0vKgotICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAotICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LiAgVGhpcyBpcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgdGhhdCBpcyBkZWZpbmVkCi0gKiBhcyB0aGUgZGVmYXVsdCBpbiB0dHlfaW8uYyB3aXRoIHRoZSBzYW1lIHNldHRpbmdzIG92ZXJyaWRlbiBhcyBpbiBzZXJpYWwuYwotICoKLSAqIEluIHNob3J0LCB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJuYWwgc2VyaWFsIHBvcnRzJyBkZWZhdWx0cy4KLSAqLwotI2RlZmluZQlERUZBVUxUX0lGTEFHUwkoSUNSTkwgfCBJWE9OKQotI2RlZmluZQlERUZBVUxUX09GTEFHUwkoT1BPU1QgfCBPTkxDUikKLSNkZWZpbmUJREVGQVVMVF9DRkxBR1MJKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCkKLSNkZWZpbmUJREVGQVVMVF9MRkxBR1MJKElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8IFwKLQkJCUVDSE9DVEwgfCBFQ0hPS0UgfCBJRVhURU4pCi0KLSNpZm5kZWYgX1BPU0lYX1ZESVNBQkxFCi0jZGVmaW5lICAgX1BPU0lYX1ZESVNBQkxFICdcMCcKLSNlbmRpZgotCi0jZGVmaW5lIFNOSUZGX01BWAk2NTUzNgkJLyogU25pZmYgYnVmZmVyIHNpemUgKDJebikgKi8KLSNkZWZpbmUgU05JRkZfTUFTSwkoU05JRkZfTUFYIC0gMSkJLyogU25pZmYgd3JhcCBtYXNrICovCi0KLSNkZWZpbmUgVlBEU0laRSAoNTEyKQotCi0vKgotICogTG9jayBmdW5jdGlvbi9kZWZpbmVzLgotICogTWFrZXMgc3BvdHRpbmcgbG9jay91bmxvY2sgbG9jYXRpb25zIGVhc2llci4KLSAqLwotIyBkZWZpbmUgREdBUF9TUElOTE9DS19JTklUKHgpCQlzcGluX2xvY2tfaW5pdCgmKHgpKQotIyBkZWZpbmUgREdBUF9MT0NLKHgseSkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmKHgpLCB5KQotIyBkZWZpbmUgREdBUF9VTkxPQ0soeCx5KQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHgpLCB5KQotIyBkZWZpbmUgREdBUF9UUllMT0NLKHgseSkJCXNwaW5fdHJ5bG9jaygmKHgpKQotCi0vKgotICogQWxsIHRoZSBwb3NzaWJsZSBzdGF0ZXMgdGhlIGRyaXZlciBjYW4gYmUgd2hpbGUgYmVpbmcgbG9hZGVkLgotICovCi1lbnVtIHsKLQlEUklWRVJfSU5JVElBTElaRUQgPSAwLAotCURSSVZFUl9ORUVEX0NPTkZJR19MT0FELAotCURSSVZFUl9SRVFVRVNURURfQ09ORklHLAotCURSSVZFUl9SRUFEWQotfTsKLQotLyoKLSAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoZSBib2FyZCBjYW4gYmUgd2hpbGUgYm9vdGluZyB1cC4KLSAqLwotZW51bSB7Ci0JQk9BUkRfRkFJTEVEID0gMCwKLQlDT05GSUdfTk9UX0ZPVU5ELAotCUJPQVJEX0ZPVU5ELAotCU5FRURfUkVTRVQsCi0JRklOSVNIRURfUkVTRVQsCi0JTkVFRF9DT05GSUcsCi0JRklOSVNIRURfQ09ORklHLAotCU5FRURfREVWSUNFX0NSRUFUSU9OLAotCVJFUVVFU1RFRF9ERVZJQ0VfQ1JFQVRJT04sCi0JRklOSVNIRURfREVWSUNFX0NSRUFUSU9OLAotCU5FRURfQklPU19MT0FELAotCVJFUVVFU1RFRF9CSU9TLAotCVdBSVRfQklPU19MT0FELAotCUZJTklTSEVEX0JJT1NfTE9BRCwKLQlORUVEX0ZFUF9MT0FELAotCVJFUVVFU1RFRF9GRVAsCi0JV0FJVF9GRVBfTE9BRCwKLQlGSU5JU0hFRF9GRVBfTE9BRCwKLQlORUVEX1BST0NfQ1JFQVRJT04sCi0JRklOSVNIRURfUFJPQ19DUkVBVElPTiwKLQlCT0FSRF9SRUFEWQotfTsKLQotLyoKLSAqIEFsbCB0aGUgcG9zc2libGUgc3RhdGVzIHRoYXQgYSByZXF1ZXN0ZWQgY29uY2VudHJhdG9yIGltYWdlIGNhbiBiZSBpbi4KLSAqLwotZW51bSB7Ci0JTk9fUEVORElOR19DT05DRU5UUkFUT1JfUkVRVUVTVFMgPSAwLAotCU5FRURfQ09OQ0VOVFJBVE9SLAotCVJFUVVFU1RFRF9DT05DRU5UUkFUT1IKLX07Ci0KLWV4dGVybiBjaGFyICpkZ2FwX3N0YXRlX3RleHRbXTsKLWV4dGVybiBjaGFyICpkZ2FwX2RyaXZlcl9zdGF0ZV90ZXh0W107Ci0KLQotLyogCi0gKiBNb2RlbSBsaW5lIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBhcyBtYWNyb3MgYmVjYXVzZSBEU1IgYW5kCi0gKiBEQ0QgYXJlIHN3YXBhYmxlIHVzaW5nIHRoZSBkaXR0eSBhbHRwaW4gb3B0aW9uLgotICovCi0jZGVmaW5lIERfQ0QoY2gpICAgICAgICBjaC0+Y2hfY2QgICAgICAgLyogQ2FycmllciBkZXRlY3QgICAgICAgKi8KLSNkZWZpbmUgRF9EU1IoY2gpICAgICAgIGNoLT5jaF9kc3IgICAgICAvKiBEYXRhIHNldCByZWFkeSAgICAgICAqLwotI2RlZmluZSBEX1JUUyhjaCkgICAgICAgRE1fUlRTICAgICAgICAgIC8qIFJlcXVlc3QgdG8gc2VuZCAgICAgICovCi0jZGVmaW5lIERfQ1RTKGNoKSAgICAgICBETV9DVFMgICAgICAgICAgLyogQ2xlYXIgdG8gc2VuZCAgICAgICAgKi8KLSNkZWZpbmUgRF9SSShjaCkgICAgICAgIERNX1JJICAgICAgICAgICAvKiBSaW5nIGluZGljYXRvciAgICAgICAqLwotI2RlZmluZSBEX0RUUihjaCkgICAgICAgRE1fRFRSICAgICAgICAgIC8qIERhdGEgdGVybWluYWwgcmVhZHkgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBTdHJ1Y3R1cmVzIGFuZCBjbG9zZWx5IHJlbGF0ZWQgZGVmaW5lcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKgotICogQSBzdHJ1Y3R1cmUgdG8gaG9sZCBhIHN0YXRpc3RpY3MgY291bnRlci4gIFdlIGFsc28KLSAqIGNvbXB1dGUgbW92aW5nIGF2ZXJhZ2VzIGZvciB0aGlzIGNvdW50ZXIuCi0gKi8KLXN0cnVjdCBtYWNvdW50ZXIKLXsKLQl1MzIJCWNudDsJLyogVG90YWwgY291bnQgKi8KLQl1bG9uZwkJYWNjdW07CS8qIEFjdXVtdWxhdG9yIHBlciBwZXJpb2QgKi8KLQl1bG9uZwkJc21hOwkvKiBTaW1wbGUgbW92aW5nIGF2ZXJhZ2UgKi8KLQl1bG9uZwkJZW1hOwkvKiBFeHBvbmVudGlhbCBtb3ZpbmcgYXZlcmFnZSAqLwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogRGV2aWNlIGZsYWcgZGVmaW5pdGlvbnMgZm9yIGJkX2ZsYWdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUJQkRfRkVQNVBMVVMJMHgwMDAxICAgICAgICAgIC8qIFN1cHBvcnRzIEZFUDUgUGx1cyBjb21tYW5kcyAqLwotI2RlZmluZSBCRF9IQVNfVlBECTB4MDAwMgkJLyogQm9hcmQgaGFzIFZQRCBpbmZvIGF2YWlsYWJsZSAqLwotCi0KLS8qCi0gKglQZXItYm9hcmQgaW5mb3JtYXRpb24KLSAqLwotc3RydWN0IGJvYXJkX3QKLXsKLQlpbnQJCW1hZ2ljOwkJLyogQm9hcmQgTWFnaWMgbnVtYmVyLiAgKi8KLQlpbnQJCWJvYXJkbnVtOwkvKiBCb2FyZCBudW1iZXI6IDAtMyAqLwotCWludAkJZmlyc3RtaW5vcjsJLyogRmlyc3QgbWlub3IsIGUuZy4gMCwgMzAsIDYwICovCi0KLQlpbnQJCXR5cGU7CQkvKiBUeXBlIG9mIGJvYXJkICovCi0JY2hhcgkJKm5hbWU7CQkvKiBQcm9kdWN0IE5hbWUgKi8KLQlzdHJ1Y3QgcGNpX2RldgkqcGRldjsJCS8qIFBvaW50ZXIgdG8gdGhlIHBjaV9kZXYgc3RydWN0ICovIAotCXUxNgkJdmVuZG9yOwkJLyogUENJIHZlbmRvciBJRCAqLwotCXUxNgkJZGV2aWNlOwkJLyogUENJIGRldmljZSBJRCAqLwotCXUxNgkJc3VidmVuZG9yOwkvKiBQQ0kgc3Vic3lzdGVtIHZlbmRvciBJRCAqLwotCXUxNgkJc3ViZGV2aWNlOwkvKiBQQ0kgc3Vic3lzdGVtIGRldmljZSBJRCAqLwotCXVjaGFyCQlyZXY7CQkvKiBQQ0kgcmV2aXNpb24gSUQgKi8KLQl1aW50CQlwY2lfYnVzOwkvKiBQQ0kgYnVzIHZhbHVlICovCi0JdWludAkJcGNpX3Nsb3Q7CS8qIFBDSSBzbG90IHZhbHVlICovCi0JdTE2CQltYXhwb3J0czsJLyogTUFYIHBvcnRzIHRoaXMgYm9hcmQgY2FuIGhhbmRsZSAqLwotCXVjaGFyCQl2cGRbVlBEU0laRV07CS8qIFZQRCBvZiBib2FyZCwgaWYgZm91bmQgKi8KLQl1MzIJCWJkX2ZsYWdzOwkvKiBCb2FyZCBmbGFncyAqLwotCi0Jc3BpbmxvY2tfdAliZF9sb2NrOwkvKiBVc2VkIHRvIHByb3RlY3QgYm9hcmQgKi8KLQotCXUzMgkJc3RhdGU7CQkvKiBTdGF0ZSBvZiBjYXJkLiAqLwotCXdhaXRfcXVldWVfaGVhZF90IHN0YXRlX3dhaXQ7CS8qIFBsYWNlIHRvIHNsZWVwIG9uIGZvciBzdGF0ZSBjaGFuZ2UgKi8KLQotCXN0cnVjdAkJdGFza2xldF9zdHJ1Y3QgaGVscGVyX3Rhc2tsZXQ7IC8qIFBvbGwgaGVscGVyIHRhc2tsZXQgKi8KLQotCXUzMgkJd2FpdF9mb3JfYmlvczsKLQl1MzIJCXdhaXRfZm9yX2ZlcDsKLQotCXN0cnVjdCBjbm9kZSAqICBiZF9jb25maWc7CS8qIENvbmZpZyBvZiBib2FyZCAqLwotCi0JdTE2CQluYXN5bmM7CQkvKiBOdW1iZXIgb2YgcG9ydHMgb24gY2FyZCAqLwotCi0JdTMyCQl1c2VfaW50ZXJydXB0czsJLyogU2hvdWxkIHdlIGJlIGludGVycnVwdCBkcml2ZW4/ICovCi0JdWxvbmcJCWlycTsJCS8qIEludGVycnVwdCByZXF1ZXN0IG51bWJlciAqLwotCXVsb25nCQlpbnRyX2NvdW50OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCi0JdTMyCQlpbnRyX3VzZWQ7CS8qIE5vbi16ZXJvIGlmIHVzaW5nIGludGVycnVwdHMgKi8KLQl1MzIJCWludHJfcnVubmluZzsJLyogTm9uLXplcm8gaWYgRkVQIGtub3dzIGl0cyBkb2luZyBpbnRlcnJ1cHRzICovCi0KLQl1bG9uZwkJcG9ydDsJCS8qIFN0YXJ0IG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLwotCXVsb25nCQlwb3J0X2VuZDsJLyogRW5kIG9mIGJhc2UgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLwotCXVsb25nCQltZW1iYXNlOwkvKiBTdGFydCBvZiBiYXNlIG1lbW9yeSBvZiB0aGUgY2FyZCAqLwotCXVsb25nCQltZW1iYXNlX2VuZDsJLyogRW5kIG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCi0KLQl1Y2hhciAJCSpyZV9tYXBfcG9ydDsJLyogUmVtYXBwZWQgaW8gcG9ydCBvZiB0aGUgY2FyZCAqLwotCXVjaGFyCQkqcmVfbWFwX21lbWJhc2U7LyogUmVtYXBwZWQgbWVtb3J5IG9mIHRoZSBjYXJkICovCi0KLQl1Y2hhcgkJcnVud2FpdDsJLyogIyBQcm9jZXNzZXMgd2FpdGluZyBmb3IgRkVQICAqLwotCXVjaGFyCQlpbmhpYml0X3BvbGxlcjsgLyogVGVsbHMgIHRoZSBwb2xsZXIgdG8gbGVhdmUgdXMgYWxvbmUgKi8KLQotCXN0cnVjdCBjaGFubmVsX3QgKmNoYW5uZWxzW01BWFBPUlRTXTsgLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gb3VyIGNoYW5uZWxzLiAqLwotCi0Jc3RydWN0IHR0eV9kcml2ZXIJKlNlcmlhbERyaXZlcjsKLQljaGFyCQlTZXJpYWxOYW1lWzIwMF07Ci0Jc3RydWN0IHR0eV9kcml2ZXIJKlByaW50RHJpdmVyOwotCWNoYXIJCVByaW50TmFtZVsyMDBdOwotCi0JdTMyCQlkZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkOwotCXUzMgkJZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQ7Ci0KLQl1MzIJCWRnYXBfU2VyaWFsX01ham9yOwotCXUzMgkJZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQotCXUzMgkJVHR5UmVmQ250OwotI2VuZGlmCi0KLQlzdHJ1Y3QgYnNfdAkqYmRfYnM7CQkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLwotCi0JY2hhcgkqZmxpcGJ1ZjsJCS8qIE91ciBmbGlwIGJ1ZmZlciwgYWxsb2NlZCBpZiBib2FyZCBpcyBmb3VuZCAqLwotCWNoYXIJKmZsaXBmbGFnYnVmOwkJLyogT3VyIGZsaXAgZmxhZyBidWZmZXIsIGFsbG9jZWQgaWYgYm9hcmQgaXMgZm91bmQgKi8KLQotCXUxNgkJZHBhdHlwZTsJLyogVGhlIGJvYXJkICJ0eXBlIiwgYXMgZGVmaW5lZCBieSBEUEEgKi8KLQl1MTYJCWRwYXN0YXR1czsJLyogVGhlIGJvYXJkICJzdGF0dXMiLCBhcyBkZWZpbmVkIGJ5IERQQSAqLwotCXdhaXRfcXVldWVfaGVhZF90IGttZV93YWl0OwkvKiBOZWVkZWQgZm9yIERQQSBzdXBwb3J0ICovCi0KLQl1MzIJCWNvbmNfZGxfc3RhdHVzOwkvKiBTdGF0dXMgb2YgYW55IHBlbmRpbmcgY29uYyBkb3dubG9hZCAqLwotCS8qCi0JICoJTWdtdCBkYXRhLgotCSAqLwotICAgICAgICBjaGFyCQkqbXNnYnVmX2hlYWQ7Ci0gICAgICAgIGNoYXIJCSptc2didWY7Ci19OwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIFVuaXQgZmxhZyBkZWZpbml0aW9ucyBmb3IgdW5fZmxhZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTl9JU09QRU4JMHgwMDAxCQkvKiBEZXZpY2UgaXMgb3BlbgkJKi8KLSNkZWZpbmUgVU5fQ0xPU0lORwkweDAwMDIJCS8qIExpbmUgaXMgYmVpbmcgY2xvc2VkCQkqLwotI2RlZmluZSBVTl9JTU0JCTB4MDAwNAkJLyogU2VydmljZSBpbW1lZGlhdGVseQkJKi8KLSNkZWZpbmUgVU5fQlVTWQkJMHgwMDA4CQkvKiBTb21lIHdvcmsgdGhpcyBjaGFubmVsCSovCi0jZGVmaW5lIFVOX0JSRUFLSQkweDAwMTAJCS8qIElucHV0IGJyZWFrIHJlY2VpdmVkCQkqLwotI2RlZmluZSBVTl9QV0FJVAkweDAwMjAJCS8qIFByaW50ZXIgd2FpdGluZyBmb3IgdGVybWluYWwJKi8KLSNkZWZpbmUgVU5fVElNRQkJMHgwMDQwCQkvKiBXYWl0aW5nIG9uIHRpbWUJCSovCi0jZGVmaW5lIFVOX0VNUFRZCTB4MDA4MAkJLyogV2FpdGluZyBvdXRwdXQgcXVldWUgZW1wdHkJKi8KLSNkZWZpbmUgVU5fTE9XCQkweDAxMDAJCS8qIFdhaXRpbmcgb3V0cHV0IGxvdyB3YXRlciBtYXJrKi8KLSNkZWZpbmUgVU5fRVhDTF9PUEVOCTB4MDIwMAkJLyogT3BlbiBmb3IgZXhjbHVzaXZlIHVzZQkqLwotI2RlZmluZSBVTl9XT1BFTgkweDA0MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCi0jZGVmaW5lIFVOX1dJT0NUTAkweDA4MDAJCS8qIERldmljZSB3YWl0aW5nIGZvciBvcGVuCSovCi0jZGVmaW5lIFVOX0hBTkdVUAkweDgwMDAJCS8qIENhcnJpZXIgbG9zdAkJCSovCi0KLXN0cnVjdCBkZXZpY2U7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSBmb3IgdGVybWluYWwgb3IgcHJpbnRlciB1bml0LiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgdW5fdCB7Ci0JaW50CW1hZ2ljOwkJLyogVW5pdCBNYWdpYyBOdW1iZXIuCQkJKi8KLQlzdHJ1Y3QJY2hhbm5lbF90ICp1bl9jaDsKLQl1MzIJdW5fdGltZTsKLQl1MzIJdW5fdHlwZTsKLQl1MzIJdW5fb3Blbl9jb3VudDsJLyogQ291bnRlciBvZiBvcGVucyB0byBwb3J0CQkqLwotCXN0cnVjdCB0dHlfc3RydWN0ICp1bl90dHk7LyogUG9pbnRlciB0byB1bml0IHR0eSBzdHJ1Y3R1cmUJKi8KLQl1MzIJdW5fZmxhZ3M7CS8qIFVuaXQgZmxhZ3MJCQkJKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCB1bl9mbGFnc193YWl0OyAvKiBQbGFjZSB0byBzbGVlcCB0byB3YWl0IG9uIHVuaXQgKi8KLQl1MzIJdW5fZGV2OwkJLyogTWlub3IgZGV2aWNlIG51bWJlcgkJCSovCi0JdGNmbGFnX3QgdW5fb2ZsYWc7CS8qIG9mbGFncyBiZWluZyBkb25lIG9uIGJvYXJkCQkqLwotCXRjZmxhZ190IHVuX2xmbGFnOwkvKiBsZmxhZ3MgYmVpbmcgZG9uZSBvbiBib2FyZAkJKi8KLQlzdHJ1Y3QgZGV2aWNlICp1bl9zeXNmczsKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIERldmljZSBmbGFnIGRlZmluaXRpb25zIGZvciBjaF9mbGFncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENIX1BST04gICAgICAgICAweDAwMDEgICAgICAgICAgLyogUHJpbnRlciBvbiBzdHJpbmcgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfT1VUICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvKiBEaWFsLW91dCBkZXZpY2Ugb3BlbiAgICAgICAgICAgICAqLwotI2RlZmluZSBDSF9TVE9QICAgICAgICAgMHgwMDA0ICAgICAgICAgIC8qIE91dHB1dCBpcyBzdG9wcGVkICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENIX1NUT1BJICAgICAgICAweDAwMDggICAgICAgICAgLyogSW5wdXQgaXMgc3RvcHBlZCAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfQ0QgICAgICAgICAgIDB4MDAxMCAgICAgICAgICAvKiBDYXJyaWVyIGlzIHByZXNlbnQgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDSF9GQ0FSICAgICAgICAgMHgwMDIwICAgICAgICAgIC8qIENhcnJpZXIgZm9yY2VkIG9uICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgQ0hfUlhCTE9DSyAgICAgIDB4MDA4MCAgICAgICAgICAvKiBFbmFibGUgcnggYmxvY2tlZCBmbGFnICAgICAgICAgICAqLwotI2RlZmluZSBDSF9XTE9XICAgICAgICAgMHgwMTAwICAgICAgICAgIC8qIFRlcm0gd2FpdGluZyBsb3cgZXZlbnQgICAgICAgICAgICovCi0jZGVmaW5lIENIX1dFTVBUWSAgICAgICAweDAyMDAgICAgICAgICAgLyogVGVybSB3YWl0aW5nIGVtcHR5IGV2ZW50ICAgICAgICAgKi8KLSNkZWZpbmUgQ0hfUkVOQUJMRSAgICAgIDB4MDQwMCAgICAgICAgICAvKiBCdWZmZXIganVzdCBlbXB0aWVkICAgICAgICAgICovCi0jZGVmaW5lIENIX1JBQ1RJVkUgICAgICAweDA4MDAgICAgICAgICAgLyogUHJvY2VzcyBhY3RpdmUgaW4geHhyZWFkKCkgICAqLwotI2RlZmluZSBDSF9SV0FJVCAgICAgICAgMHgxMDAwICAgICAgICAgIC8qIFByb2Nlc3Mgd2FpdGluZyBpbiB4eHJlYWQoKSAgKi8KLSNkZWZpbmUgQ0hfQkFVRDAJMHgyMDAwCQkvKiBVc2VkIGZvciBjaGVja2luZyBCMCB0cmFuc2l0aW9ucyAqLwotI2RlZmluZSBDSF9IQU5HVVAgICAgICAgMHg4MDAwCQkvKiBIYW5ndXAgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICAqLwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIGNoX3NuaWZmX2ZsYWdzCi0gKi8KLSNkZWZpbmUgU05JRkZfT1BFTgkweDEKLSNkZWZpbmUgU05JRkZfV0FJVF9EQVRBCTB4MgotI2RlZmluZSBTTklGRl9XQUlUX1NQQUNFIDB4NAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBDaGFubmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgY2hhbm5lbF90IHsKLQlpbnQgbWFnaWM7CQkJLyogQ2hhbm5lbCBNYWdpYyBOdW1iZXIJCSovCi0Jc3RydWN0IGJzX3QJKmNoX2JzOwkJLyogQmFzZSBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICAqLwotCXN0cnVjdCBjbV90CSpjaF9jbTsJCS8qIENvbW1hbmQgcXVldWUgcG9pbnRlciAgICAgICAgKi8KLQlzdHJ1Y3QgYm9hcmRfdCAqY2hfYmQ7CQkvKiBCb2FyZCBzdHJ1Y3R1cmUgcG9pbnRlciAgICAgICovCi0JdW5zaWduZWQgY2hhciAqY2hfdmFkZHI7CS8qIEZFUCBtZW1vcnkgb3JpZ2luICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyICpjaF90YWRkcjsJLyogV3JpdGUgYnVmZmVyIG9yaWdpbiAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIgKmNoX3JhZGRyOwkvKiBSZWFkIGJ1ZmZlciBvcmlnaW4gICAgICAgICAgICovCi0Jc3RydWN0IGRpZ2lfdCAgY2hfZGlnaTsJCS8qIFRyYW5zcGFyZW50IFByaW50IHN0cnVjdHVyZSAgKi8KLQlzdHJ1Y3QgdW5fdCBjaF90dW47CQkvKiBUZXJtaW5hbCB1bml0IGluZm8gICAgICAgICAgICovCi0Jc3RydWN0IHVuX3QgY2hfcHVuOwkJLyogUHJpbnRlciB1bml0IGluZm8gICAgICAgICAgICAqLwotCi0Jc3BpbmxvY2tfdAljaF9sb2NrOwkvKiBwcm92aWRlIGZvciBzZXJpYWxpemF0aW9uICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgY2hfZmxhZ3Nfd2FpdDsKLQotCXUzMglwc2Nhbl9zdGF0ZTsKLQl1Y2hhcglwc2Nhbl9zYXZlY2hhcjsKLQotCXUzMiBjaF9wb3J0bnVtOwkJCS8qIFBvcnQgbnVtYmVyLCAwIG9mZnNldC4JKi8KLQl1MzIgY2hfb3Blbl9jb3VudDsJCS8qIG9wZW4gY291bnQJCQkqLwotCXUzMgljaF9mbGFnczsJCS8qIENoYW5uZWwgZmxhZ3MgICAgICAgICAgICAgICAgKi8KLQotCi0JdTMyCWNoX2Nsb3NlX2RlbGF5OwkJLyogSG93IGxvbmcgd2Ugc2hvdWxkIGRyb3AgUlRTL0RUUiBmb3IgKi8KLQotCXUzMgljaF9jcHN0aW1lOwkJLyogVGltZSBmb3IgQ1BTIGNhbGN1bGF0aW9ucyAgICAqLwotCi0JdGNmbGFnX3QgY2hfY19pZmxhZzsJCS8qIGNoYW5uZWwgaWZsYWdzICAgICAgICAgICAgICAgKi8KLQl0Y2ZsYWdfdCBjaF9jX2NmbGFnOwkJLyogY2hhbm5lbCBjZmxhZ3MgICAgICAgICAgICAgICAqLwotCXRjZmxhZ190IGNoX2Nfb2ZsYWc7CQkvKiBjaGFubmVsIG9mbGFncyAgICAgICAgICAgICAgICovCi0JdGNmbGFnX3QgY2hfY19sZmxhZzsJCS8qIGNoYW5uZWwgbGZsYWdzICAgICAgICAgICAgICAgKi8KLQotCXUxNiAgY2hfZmVwaWZsYWc7ICAgICAgICAgICAgLyogRkVQIHR0eSBpZmxhZ3MgICAgICAgICAgICAgICAqLwotCXUxNiAgY2hfZmVwY2ZsYWc7CQkvKiBGRVAgdHR5IGNmbGFncyAgICAgICAgICAgICAgICovCi0JdTE2ICBjaF9mZXBvZmxhZzsJCS8qIEZFUCB0dHkgb2ZsYWdzICAgICAgICAgICAgICAgKi8KLQl1MTYgIGNoX3dvcGVuOwkJCS8qIFdhaXRpbmcgZm9yIG9wZW4gcHJvY2VzcyBjbnQgKi8KLQl1MTYgIGNoX3RzdGFydDsJCQkvKiBUcmFuc21pdCBidWZmZXIgc3RhcnQgICAgICAgICovCi0JdTE2ICBjaF90c2l6ZTsJCQkvKiBUcmFuc21pdCBidWZmZXIgc2l6ZSAgICAgICAgICovCi0JdTE2ICBjaF9yc3RhcnQ7CQkJLyogUmVjZWl2ZSBidWZmZXIgc3RhcnQgICAgICAgICAqLwotCXUxNiAgY2hfcnNpemU7CQkJLyogUmVjZWl2ZSBidWZmZXIgc2l6ZSAgICAgICAgICAqLwotCXUxNiAgY2hfcmRlbGF5OwkJCS8qIFJlY2VpdmUgZGVsYXkgdGltZSAgICAgICAgICAgKi8KLQotCXUxNgljaF90bHc7CQkJLyogT3VyIGN1cnJlbnRseSBzZXQgbG93IHdhdGVyIG1hcmsgKi8KLQotCXUxNiAgY2hfY29vazsJCQkvKiBPdXRwdXQgY2hhcmFjdGVyIG1hc2sgICAgICAgICovCi0KLQl1Y2hhciAgIGNoX2NhcmQ7CQkvKiBDYXJkIGNoYW5uZWwgaXMgb24gICAgICAgICAgICovCi0JdWNoYXIgICBjaF9zdG9wYzsJCS8qIFN0b3AgY2hhcmFjdGVyICAgICAgICAgICAgICAgKi8KLQl1Y2hhciAgIGNoX3N0YXJ0YzsJCS8qIFN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAgICAgKi8KLQotCXVjaGFyICAgY2hfbW9zdGF0OwkJLyogRkVQIG91dHB1dCBtb2RlbSBzdGF0dXMgICAgICAqLwotCXVjaGFyICAgY2hfbWlzdGF0OwkJLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cyAgICAgICAqLwotCXVjaGFyICAgY2hfbWZvcmNlOwkJLyogTW9kZW0gdmFsdWVzIHRvIGJlIGZvcmNlZCAgICAqLwotCXVjaGFyICAgY2hfbXZhbDsJCS8qIEZvcmNlIHZhbHVlcyAgICAgICAgICAgICAgICAgKi8KLQl1Y2hhciAgIGNoX2ZlcHN0b3BjOwkJLyogRkVQIHN0b3AgY2hhcmFjdGVyICAgICAgICAgICAqLwotCXVjaGFyICAgY2hfZmVwc3RhcnRjOwkJLyogRkVQIHN0YXJ0IGNoYXJhY3RlciAgICAgICAgICAqLwotCi0JdWNoYXIgICBjaF9hc3RvcGM7CQkvKiBBdXhpbGlhcnkgU3RvcCBjaGFyYWN0ZXIgICAgICovCi0JdWNoYXIgICBjaF9hc3RhcnRjOwkJLyogQXV4aWxpYXJ5IFN0YXJ0IGNoYXJhY3RlciAgICAqLwotCXVjaGFyICAgY2hfZmVwYXN0b3BjOwkJLyogQXV4aWxpYXJ5IEZFUCBzdG9wIGNoYXIgICAgICAqLwotCXVjaGFyICAgY2hfZmVwYXN0YXJ0YzsJCS8qIEF1eGlsaWFyeSBGRVAgc3RhcnQgY2hhciAgICAgKi8KLQotCXVjaGFyICAgY2hfaGZsb3c7CQkvKiBGRVAgaGFyZHdhcmUgaGFuZHNoYWtlICAgICAgICovCi0JdWNoYXIgICBjaF9kc3I7CQkJLyogc3RvcmVzIHJlYWwgZHNyIHZhbHVlICAgICAgICAqLwotCXVjaGFyICAgY2hfY2Q7CQkJLyogc3RvcmVzIHJlYWwgY2QgdmFsdWUgICAgICAgICAqLwotCXVjaGFyICAgY2hfdHhfd2luOwkJLyogY2hhbm5lbCB0eCBidWZmZXIgd2luZG93ICAgICAqLwotCXVjaGFyICAgY2hfcnhfd2luOwkJLyogY2hhbm5lbCByeCBidWZmZXIgd2luZG93ICAgICAqLwotCXVpbnQJY2hfY3VzdG9tX3NwZWVkOwkvKiBDdXN0b20gYmF1ZCwgaWYgc2V0CQkqLwotCXVpbnQJY2hfYmF1ZF9pbmZvOwkJLyogQ3VycmVudCBiYXVkIGluZm8gZm9yIC9wcm9jIG91dHB1dAkqLwotCXVsb25nCWNoX3J4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHJlY2VpdmVkIHNvIGZhcgkqLwotCXVsb25nCWNoX3R4Y291bnQ7CQkvKiB0b3RhbCBvZiBkYXRhIHRyYW5zbWl0dGVkIHNvIGZhcgkqLwotCXVsb25nCWNoX2Vycl9wYXJpdHk7CQkvKiBDb3VudCBvZiBwYXJpdHkgZXJyb3JzIG9uIGNoYW5uZWwJKi8KLQl1bG9uZwljaF9lcnJfZnJhbWU7CQkvKiBDb3VudCBvZiBmcmFtaW5nIGVycm9ycyBvbiBjaGFubmVsCSovCi0JdWxvbmcJY2hfZXJyX2JyZWFrOwkJLyogQ291bnQgb2YgYnJlYWtzIG9uIGNoYW5uZWwJKi8KLQl1bG9uZwljaF9lcnJfb3ZlcnJ1bjsJCS8qIENvdW50IG9mIG92ZXJydW5zIG9uIGNoYW5uZWwJKi8KLQotCXVpbnQgY2hfc25pZmZfaW47Ci0JdWludCBjaF9zbmlmZl9vdXQ7Ci0JY2hhciAqY2hfc25pZmZfYnVmOwkJLyogU25pZmYgYnVmZmVyIGZvciBwcm9jICovCi0JdWxvbmcgY2hfc25pZmZfZmxhZ3M7CQkvKiBDaGFubmVsIGZsYWdzICAgICAgICAgICAgICAgICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgY2hfc25pZmZfd2FpdDsKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQcm90b3R5cGVzIGZvciBub24tc3RhdGljIGZ1bmN0aW9ucyB1c2VkIGluIG1vcmUgdGhhbiBvbmUgbW9kdWxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWV4dGVybiBpbnQJCWRnYXBfbXNfc2xlZXAodWxvbmcgbXMpOwotZXh0ZXJuIGNoYXIJCSpkZ2FwX2lvY3RsX25hbWUoaW50IGNtZCk7Ci1leHRlcm4gdm9pZAkJZGdhcF9kb19iaW9zX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgX191c2VyICp1YmlvcywgaW50IGxlbik7Ci1leHRlcm4gdm9pZAkJZGdhcF9kb19mZXBfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciBfX3VzZXIgKnVmZXAsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQJCWRnYXBfZG9fY29uY19sb2FkKHN0cnVjdCBib2FyZF90ICpicmQsIHVjaGFyICp1YWRkciwgaW50IGxlbik7Ci1leHRlcm4gdm9pZAkJZGdhcF9kb19jb25maWdfbG9hZCh1Y2hhciBfX3VzZXIgKnVhZGRyLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQJCWRnYXBfYWZ0ZXJfY29uZmlnX2xvYWRlZCh2b2lkKTsKLWV4dGVybiBpbnQJCWRnYXBfZmluYWxpemVfYm9hcmRfaW5pdChzdHJ1Y3QgYm9hcmRfdCAqYnJkKTsKLQotLyoKLSAqIE91ciBHbG9iYWwgVmFyaWFibGVzLgotICovCi1leHRlcm4gaW50CQlkZ2FwX2RyaXZlcl9zdGF0ZTsJLyogVGhlIHN0YXRlIG9mIHRoZSBkcml2ZXIJKi8KLWV4dGVybiBpbnQJCWRnYXBfZGVidWc7CQkvKiBEZWJ1ZyB2YXJpYWJsZQkJKi8KLWV4dGVybiBpbnQJCWRnYXBfcmF3cmVhZG9rOwkJLyogU2V0IGlmIHVzZXIgd2FudHMgcmF3cmVhZHMJKi8KLWV4dGVybiBpbnQJCWRnYXBfcG9sbF90aWNrOwkJLyogUG9sbCBpbnRlcnZhbCAtIDIwIG1zCSovCi1leHRlcm4gc3BpbmxvY2tfdAlkZ2FwX2dsb2JhbF9sb2NrOwkvKiBEcml2ZXIgZ2xvYmFsIHNwaW5sb2NrCSovCi1leHRlcm4gdWludAkJZGdhcF9OdW1Cb2FyZHM7CQkvKiBUb3RhbCBudW1iZXIgb2YgYm9hcmRzCSovCi1leHRlcm4gc3RydWN0IGJvYXJkX3QJKmRnYXBfQm9hcmRbTUFYQk9BUkRTXTsJLyogQXJyYXkgb2YgYm9hcmQgc3RydWN0cwkqLwotZXh0ZXJuIHVsb25nCQlkZ2FwX3BvbGxfY291bnRlcjsJLyogVGltZXMgdGhlIHBvbGxlciBoYXMgcnVuCSovCi1leHRlcm4gY2hhcgkJKmRnYXBfY29uZmlnX2J1ZjsJLyogVGhlIGNvbmZpZyBmaWxlIGJ1ZmZlcgkqLwotZXh0ZXJuIHNwaW5sb2NrX3QJZGdhcF9kbF9sb2NrOwkJLyogRG93bmxvYWRlciBzcGlubG9jawkJKi8KLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBkZ2FwX2RsX3dhaXQ7CQkvKiBXYWl0IHF1ZXVlIGZvciBkb3dubG9hZGVyCSovCi1leHRlcm4gaW50CQlkZ2FwX2RsX2FjdGlvbjsJCS8qIEFjdGlvbiBmbGFnIGZvciBkb3dubG9hZGVyCSovCi1leHRlcm4gaW50CQlkZ2FwX3JlZ2lzdGVydHR5c3dpdGhzeXNmczsgLyogU2hvdWxkIHdlIHJlZ2lzdGVyIHRoZQkqLwotCQkJCQkJICAgIC8qIHR0eXMgd2l0aCBzeXNmcyBvciBub3QJKi8KLQotLyoKLSAqIEdsb2JhbCBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gZGdhcF9mZXA1LmMsIGJ1dCBtdXN0IGJlIGhpZGRlbiBmcm9tCi0gKiB1c2VyIHNwYWNlIHByb2dyYW1zLgotICovCi1leHRlcm4gdm9pZAlkZ2FwX3BvbGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOyAKLWV4dGVybiB2b2lkCWRnYXBfY21kYihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdWNoYXIgY21kLCB1Y2hhciBieXRlMSwgdWNoYXIgYnl0ZTIsIHVpbnQgbmNtZHMpOwotZXh0ZXJuIHZvaWQJZGdhcF9jbWR3KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1Y2hhciBjbWQsIHUxNiB3b3JkLCB1aW50IG5jbWRzKTsKLWV4dGVybiB2b2lkCWRnYXBfd21vdmUoc3RydWN0IGNoYW5uZWxfdCAqY2gsIGNoYXIgKmJ1ZiwgdWludCBjbnQpOwotZXh0ZXJuIGludAlkZ2FwX3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotZXh0ZXJuIHZvaWQJZGdhcF9wYXJpdHlfc2NhbihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgY2hhciAqY2J1ZiwgdW5zaWduZWQgY2hhciAqZmJ1ZiwgaW50ICpsZW4pOwotZXh0ZXJuIHVpbnQJZGdhcF9nZXRfY3VzdG9tX2JhdWQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotZXh0ZXJuIHZvaWQJZGdhcF9maXJtd2FyZV9yZXNldF9wb3J0KHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2ZlcDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZmVwNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzU4MzFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZmVwNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCi0gKiAkSWQ6IGRnYXBfZmVwNS5jLHYgMS4yIDIwMTEvMDYvMjEgMTA6MzU6NDAgbWFya2ggRXhwICQKLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSAqLwotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIEZvciBjb3B5X2Zyb21fdXNlci9jb3B5X3RvX3VzZXIgKi8KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgkvKiBGb3IgdHR5X3NjaGVkdWxlX2ZsaXAgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF9wY2kuaCIKLSNpbmNsdWRlICJkZ2FwX2ZlcDUuaCIKLSNpbmNsdWRlICJkZ2FwX3R0eS5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotI2luY2x1ZGUgImRnYXBfcGFyc2UuaCIKLSNpbmNsdWRlICJkZ2FwX3RyYWNlLmgiCi0KLS8qCi0gKiBPdXIgZnVuY3Rpb24gcHJvdG90eXBlcwotICovCi1zdGF0aWMgdm9pZCBkZ2FwX2NtZHdfZXh0KHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1MTYgY21kLCB1MTYgd29yZCwgdWludCBuY21kcyk7Ci1zdGF0aWMgaW50IGRnYXBfZXZlbnQoc3RydWN0IGJvYXJkX3QgKmJkKTsKLQotLyoKLSAqIGludGVybmFsIHZhcmlhYmxlcwotICovCi1zdGF0aWMgdWludCBkZ2FwX2NvdW50ID0gNTAwOwotCi0KLS8qCi0gKiBMb2FkcyB0aGUgZGdhcC5jb25mIGNvbmZpZyBmaWxlIGZyb20gdGhlIHVzZXIuCi0gKi8KLXZvaWQgZGdhcF9kb19jb25maWdfbG9hZCh1Y2hhciBfX3VzZXIgKnVhZGRyLCBpbnQgbGVuKQotewotCWludCBvcmlnX2xlbiA9IGxlbjsKLQljaGFyICp0b19hZGRyOwotCXVjaGFyIF9fdXNlciAqZnJvbV9hZGRyID0gdWFkZHI7Ci0JY2hhciBidWZbVTJCU0laRV07Ci0JaW50IG47Ci0KLQl0b19hZGRyID0gZGdhcF9jb25maWdfYnVmID0ga3phbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWRnYXBfY29uZmlnX2J1ZikgewotCQlEUFJfSU5JVCgoImRnYXBfZG9fY29uZmlnX2xvYWQgLSB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmaWxlXG4iKSk7Ci0JCWRnYXBfZHJpdmVyX3N0YXRlID0gRFJJVkVSX05FRURfQ09ORklHX0xPQUQ7Ci0JCXJldHVybjsKLQl9Ci0KLQluID0gVTJCU0laRTsKLQl3aGlsZSAobGVuKSB7Ci0KLQkJaWYgKG4gPiBsZW4pCi0JCQluID0gbGVuOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKSAmYnVmLCBmcm9tX2FkZHIsIG4pID09IC0xICkKLQkJCXJldHVybjsKLQotCQkvKiBDb3B5IGRhdGEgZnJvbSBidWZmZXIgdG8ga2VybmVsIG1lbW9yeSAqLwotCQltZW1jcHkodG9fYWRkciwgYnVmLCBuKTsKLQotCQkvKiBpbmNyZW1lbnQgY291bnRzICovCi0JCWxlbiAtPSBuOwotCQl0b19hZGRyICs9IG47Ci0JCWZyb21fYWRkciArPSBuOwotCQluID0gVTJCU0laRTsKLQl9Ci0KLQlkZ2FwX2NvbmZpZ19idWZbb3JpZ19sZW5dID0gJ1wwJzsKLQotCXRvX2FkZHIgPSBkZ2FwX2NvbmZpZ19idWY7Ci0JZGdhcF9wYXJzZWZpbGUoJnRvX2FkZHIsIFRSVUUpOwotCi0JRFBSX0lOSVQoKCJkZ2FwX2NvbmZpZ19sb2FkKCkgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotaW50IGRnYXBfYWZ0ZXJfY29uZmlnX2xvYWRlZCh2b2lkKQotewotCWludCBpID0gMDsKLQlpbnQgcmMgPSAwOwotCi0JLyoKLQkgKiBSZWdpc3RlciBvdXIgdHR5cywgbm93IHRoYXQgd2UgaGF2ZSB0aGUgY29uZmlnIGxvYWRlZC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGdhcF9OdW1Cb2FyZHM7ICsraSkgewotCi0JCS8qCi0JCSAqIEluaXRpYWxpemUgS01FIHdhaXRxdWV1ZXMuLi4KLQkJICovCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihkZ2FwX0JvYXJkW2ldLT5rbWVfd2FpdCkpOwotCi0JCS8qCi0JCSAqIGFsbG9jYXRlIGZsaXAgYnVmZmVyIGZvciBib2FyZC4KLQkJICovCi0JCWRnYXBfQm9hcmRbaV0tPmZsaXBidWYgPSBremFsbG9jKE1ZRkxJUExFTiwgR0ZQX0FUT01JQyk7Ci0JCWRnYXBfQm9hcmRbaV0tPmZsaXBmbGFnYnVmID0ga3phbGxvYyhNWUZMSVBMRU4sIEdGUF9BVE9NSUMpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIHVzZXJ0b2JvYXJkIC0gY29weSBmcm9tIHVzZXIgc3BhY2UgdG8gYm9hcmQgc3BhY2UuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGRnYXBfdXNlcnRvYm9hcmQoc3RydWN0IGJvYXJkX3QgKmJyZCwgY2hhciAqdG9fYWRkciwgY2hhciBfX3VzZXIgKmZyb21fYWRkciwgaW50IGxlbikKLXsKLQljaGFyIGJ1ZltVMkJTSVpFXTsKLQlpbnQgbiA9IFUyQlNJWkU7Ci0KLQlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jd2hpbGUgKGxlbikgewotCQlpZiAobiA+IGxlbikKLQkJCW4gPSBsZW47Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopICZidWYsIGZyb21fYWRkciwgbikgPT0gLTEgKSB7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCS8qIENvcHkgZGF0YSBmcm9tIGJ1ZmZlciB0byBjYXJkIG1lbW9yeSAqLwotCQltZW1jcHlfdG9pbyh0b19hZGRyLCBidWYsIG4pOwotCi0JCS8qIGluY3JlbWVudCBjb3VudHMgKi8KLQkJbGVuIC09IG47Ci0JCXRvX2FkZHIgKz0gbjsKLQkJZnJvbV9hZGRyICs9IG47Ci0JCW4gPSBVMkJTSVpFOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogQ29waWVzIHRoZSBCSU9TIGNvZGUgZnJvbSB0aGUgdXNlciB0byB0aGUgYm9hcmQsCi0gKiBhbmQgc3RhcnRzIHRoZSBCSU9TIHJ1bm5pbmcuCi0gKi8KLXZvaWQgZGdhcF9kb19iaW9zX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgX191c2VyICp1YmlvcywgaW50IGxlbikKLXsKLQl1Y2hhciAqYWRkcjsKLQl1aW50IG9mZnNldDsKLQlpbnQgaTsKLQotCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQotCQlyZXR1cm47Ci0KLQlEUFJfSU5JVCgoImRnYXBfZG9fYmlvc19sb2FkKCkgc3RhcnRcbiIpKTsKLQotCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCi0JLyoKLQkgKiBjbGVhciBQT1NUIGFyZWEKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJd3JpdGViKDAsIGFkZHIgKyBQT1NUQVJFQSArIGkpOwotCi0JLyoKLQkgKiBEb3dubG9hZCBiaW9zCi0JICovCi0Jb2Zmc2V0ID0gMHgxMDAwOwotCWlmIChkZ2FwX3VzZXJ0b2JvYXJkKGJyZCwgYWRkciArIG9mZnNldCwgdWJpb3MsIGxlbikgPT0gLTEgKSB7Ci0JCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7Ci0JCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JCXJldHVybjsKLQl9Ci0KLQl3cml0ZWwoMHgwYmYwMDQwMSwgYWRkcik7Ci0Jd3JpdGVsKDAsIChhZGRyICsgNCkpOwotCi0JLyogQ2xlYXIgdGhlIHJlc2V0LCBhbmQgY2hhbmdlIHN0YXRlcy4gKi8KLQl3cml0ZWIoRkVQQ0xSLCBicmQtPnJlX21hcF9wb3J0KTsKLQlicmQtPnN0YXRlID0gV0FJVF9CSU9TX0xPQUQ7Ci19Ci0KLQotLyoKLSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIEJJT1MgY29tcGxldGVkIHJ1bm5pbmcgb24gdGhlIGNhcmQuCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfZG9fd2FpdF9mb3JfYmlvcyhzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCXVjaGFyICphZGRyOwotCXUxNiB3b3JkOwotCi0JaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCi0JCXJldHVybjsKLQotCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCXdvcmQgPSByZWFkdyhhZGRyICsgUE9TVEFSRUEpOwotCi0JLyogQ2hlY2sgdG8gc2VlIGlmIEJJT1MgdGhpbmtzIGJvYXJkIGlzIGdvb2QuIChHRCkuICovCi0JaWYgKHdvcmQgPT0gKih1MTYgKikgIkdEIikgewotCQlEUFJfSU5JVCgoIkdPVCBHRCBpbiBtZW1vcnksIG1vdmluZyBzdGF0ZXMuXG4iKSk7Ci0JCWJyZC0+c3RhdGUgPSBGSU5JU0hFRF9CSU9TX0xPQUQ7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBHaXZlIHVwIG9uIGJvYXJkIGFmdGVyIHRvbyBsb25nIG9mIHRpbWUgdGFrZW4gKi8KLQlpZiAoYnJkLT53YWl0X2Zvcl9iaW9zKysgPiA1MDAwKSB7Ci0JCXUxNiBlcnIxID0gcmVhZHcoYWRkciArIFNFUVVFTkNFKTsKLQkJdTE2IGVycjIgPSByZWFkdyhhZGRyICsgRVJST1IpOwotCQlBUFIoKCIqKipXQVJOSU5HKioqICVzIGZhaWxlZCBkaWFnbm9zdGljcy4gIEVycm9yICMoJXgsJXgpLlxuIiwKLQkJCWJyZC0+bmFtZSwgZXJyMSwgZXJyMikpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCX0KLX0KLQotCi0vKgotICogQ29waWVzIHRoZSBGRVAgY29kZSBmcm9tIHRoZSB1c2VyIHRvIHRoZSBib2FyZCwKLSAqIGFuZCBzdGFydHMgdGhlIEZFUCBydW5uaW5nLgotICovCi12b2lkIGRnYXBfZG9fZmVwX2xvYWQoc3RydWN0IGJvYXJkX3QgKmJyZCwgdWNoYXIgX191c2VyICp1ZmVwLCBpbnQgbGVuKQotewotCXVjaGFyICphZGRyOwotCXVpbnQgb2Zmc2V0OwotCi0JaWYgKCFicmQgfHwgKGJyZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykgfHwgIWJyZC0+cmVfbWFwX21lbWJhc2UpCi0JCXJldHVybjsKLQotCWFkZHIgPSBicmQtPnJlX21hcF9tZW1iYXNlOwotCi0JRFBSX0lOSVQoKCJkZ2FwX2RvX2ZlcF9sb2FkKCkgZm9yIGJvYXJkICVzIDogc3RhcnRcbiIsIGJyZC0+bmFtZSkpOwotCi0JLyoKLQkgKiBEb3dubG9hZCBGRVAKLQkgKi8KLQlvZmZzZXQgPSAweDEwMDA7Ci0JaWYgKGRnYXBfdXNlcnRvYm9hcmQoYnJkLCBhZGRyICsgb2Zmc2V0LCB1ZmVwLCBsZW4pID09IC0xICkgewotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBJZiBib2FyZCBpcyBhIGNvbmNlbnRyYXRvciBwcm9kdWN0LCB3ZSBuZWVkIHRvIGdpdmUKLQkgKiBpdCBpdHMgY29uZmlnIHN0cmluZyBkZXNjcmliaW5nIGhvdyB0aGUgY29uY2VudHJhdG9ycyBsb29rLgotCSAqLwotCWlmICgoYnJkLT50eXBlID09IFBDWCkgfHwgKGJyZC0+dHlwZSA9PSBQRVBDKSkgewotCQl1Y2hhciBzdHJpbmdbMTAwXTsKLQkJdWNoYXIgKmNvbmZpZywgKnhjb25maWc7Ci0JCWludCBpID0gMDsKLQotCQl4Y29uZmlnID0gZGdhcF9jcmVhdGVfY29uZmlnX3N0cmluZyhicmQsIHN0cmluZyk7Ci0KLQkJLyogV3JpdGUgc3RyaW5nIHRvIGJvYXJkIG1lbW9yeSAqLwotCQljb25maWcgPSBhZGRyICsgQ09ORklHOwotCQlmb3IgKDsgaSA8IENPTkZJR1NJWkU7IGkrKywgY29uZmlnKyssIHhjb25maWcrKykgewotCQkJd3JpdGViKCp4Y29uZmlnLCBjb25maWcpOwotCQkJaWYgKCgqeGNvbmZpZyAmIDB4ZmYpID09IDB4ZmYpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl3cml0ZWwoMHhiZmMwMTAwNCwgKGFkZHIgKyAweGMzNCkpOwotCXdyaXRlbCgweDMsIChhZGRyICsgMHhjMzApKTsKLQotCS8qIGNoYW5nZSBzdGF0ZXMuICovCi0JYnJkLT5zdGF0ZSA9IFdBSVRfRkVQX0xPQUQ7Ci0KLQlEUFJfSU5JVCgoImRnYXBfZG9fZmVwX2xvYWQoKSBmb3IgYm9hcmQgJXMgOiBmaW5pc2hcbiIsIGJyZC0+bmFtZSkpOwotCi19Ci0KLQotLyoKLSAqIFdhaXRzIGZvciB0aGUgRkVQIHRvIHJlcG9ydCB0aGF0cyBpdHMgcmVhZHkgZm9yIHVzIHRvIHVzZS4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9kb193YWl0X2Zvcl9mZXAoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQl1Y2hhciAqYWRkcjsKLQl1MTYgd29yZDsKLQotCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQotCQlyZXR1cm47Ci0KLQlhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCURQUl9JTklUKCgiZGdhcF9kb193YWl0X2Zvcl9mZXAoKSBmb3IgYm9hcmQgJXMgOiBzdGFydC4gYWRkcjogJXBcbiIsIGJyZC0+bmFtZSwgYWRkcikpOwotCi0Jd29yZCA9IHJlYWR3KGFkZHIgKyBGRVBTVEFUKTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiBGRVAgaXMgdXAgYW5kIHJ1bm5pbmcgbm93LiAqLwotCWlmICh3b3JkID09ICoodTE2ICopICJPUyIpIHsKLQkJRFBSX0lOSVQoKCJHT1QgT1MgaW4gbWVtb3J5IGZvciBib2FyZCAlcywgbW92aW5nIHN0YXRlcy5cbiIsIGJyZC0+bmFtZSkpOwotCQlicmQtPnN0YXRlID0gRklOSVNIRURfRkVQX0xPQUQ7Ci0KLQkJLyoKLQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBjYW4gc3VwcG9ydCBGRVA1KyBjb21tYW5kcy4KLQkJICovCi0JCXdvcmQgPSByZWFkdyhhZGRyICsgRkVQNV9QTFVTKTsKLQkJaWYgKHdvcmQgPT0gKih1MTYgKikgIjVBIikgewotCQkJRFBSX0lOSVQoKCJHT1QgNUEgaW4gbWVtb3J5IGZvciBib2FyZCAlcywgYm9hcmQgc3VwcG9ydHMgZXh0ZW5kZWQgRkVQNSBjb21tYW5kcy5cbiIsIGJyZC0+bmFtZSkpOwotCQkJYnJkLT5iZF9mbGFncyB8PSBCRF9GRVA1UExVUzsKLQkJfQotCi0JCXJldHVybjsKLQl9Ci0KLQkvKiBHaXZlIHVwIG9uIGJvYXJkIGFmdGVyIHRvbyBsb25nIG9mIHRpbWUgdGFrZW4gKi8KLQlpZiAoYnJkLT53YWl0X2Zvcl9mZXArKyA+IDUwMDApIHsKLQkJdTE2IGVycjEgPSByZWFkdyhhZGRyICsgU0VRVUVOQ0UpOwotCQl1MTYgZXJyMiA9IHJlYWR3KGFkZHIgKyBFUlJPUik7Ci0JCUFQUigoIioqKldBUk5JTkcqKiogRkVQT1MgZm9yICVzIG5vdCBmdW5jdGlvbmluZy4gIEVycm9yICMoJXgsJXgpLlxuIiwKLQkJCWJyZC0+bmFtZSwgZXJyMSwgZXJyMikpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCX0KLQotCURQUl9JTklUKCgiZGdhcF9kb193YWl0X2Zvcl9mZXAoKSBmb3IgYm9hcmQgJXMgOiBmaW5pc2hcbiIsIGJyZC0+bmFtZSkpOwotfQotCi0KLS8qCi0gKiBQaHlzaWNhbGx5IGZvcmNlcyB0aGUgRkVQNSBjYXJkIHRvIHJlc2V0IGl0c2VsZi4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9kb19yZXNldF9ib2FyZChzdHJ1Y3QgYm9hcmRfdCAqYnJkKQotewotCXVjaGFyIGNoZWNrOwotCXUzMiBjaGVjazE7Ci0JdTMyIGNoZWNrMjsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoIWJyZCB8fCAoYnJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKSB8fCAhYnJkLT5yZV9tYXBfbWVtYmFzZSB8fCAhYnJkLT5yZV9tYXBfcG9ydCkgewotCQlEUFJfSU5JVCgoImRnYXBfZG9fcmVzZXRfYm9hcmQoKSBzdGFydC4gYmFkIHZhbHVlcy4gYnJkOiAlcCBtZW06ICVwIGlvOiAlcFxuIiwKLQkJCWJyZCwgYnJkID8gYnJkLT5yZV9tYXBfbWVtYmFzZSA6IDAsIGJyZCA/IGJyZC0+cmVfbWFwX3BvcnQgOiAwKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlEUFJfSU5JVCgoImRnYXBfZG9fcmVzZXRfYm9hcmQoKSBzdGFydC4gaW86ICVwXG4iLCBicmQtPnJlX21hcF9wb3J0KSk7Ci0KLQkvKiBGRVBSU1QgZG9lcyBub3QgdmFyeSBhbW9uZyBzdXBwb3J0ZWQgYm9hcmRzICovCi0Jd3JpdGViKEZFUFJTVCwgYnJkLT5yZV9tYXBfcG9ydCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IDEwMDA7IGkrKykgewotCQljaGVjayA9IHJlYWRiKGJyZC0+cmVfbWFwX3BvcnQpICYgMHhlOwotCQlpZiAoY2hlY2sgPT0gRkVQUlNUKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7Ci0KLQl9Ci0JaWYgKGkgPiAxMDAwKSB7Ci0JCUFQUigoIioqKiBXQVJOSU5HICoqKiBCb2FyZCBub3QgcmVzZXR0aW5nLi4uICBGYWlsaW5nIGJvYXJkLlxuIikpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGVyZSByZWFsbHkgaXMgbWVtb3J5IG91dCB0aGVyZS4KLQkgKi8KLQl3cml0ZWwoMHhhNTVhM2NjMywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBMT1dNRU0pKTsKLQl3cml0ZWwoMHg1YWE1YzMzYywgKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBISUdITUVNKSk7Ci0JY2hlY2sxID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIExPV01FTSk7Ci0JY2hlY2syID0gcmVhZGwoYnJkLT5yZV9tYXBfbWVtYmFzZSArIEhJR0hNRU0pOwotCi0JaWYgKChjaGVjazEgIT0gMHhhNTVhM2NjMykgfHwgKGNoZWNrMiAhPSAweDVhYTVjMzNjKSkgewotCQlBUFIoKCIqKiogV2FybmluZyAqKiogTm8gbWVtb3J5IGF0ICVwIGZvciBib2FyZC5cbiIsIGJyZC0+cmVfbWFwX21lbWJhc2UpKTsKLQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JaWYgKGJyZC0+c3RhdGUgIT0gQk9BUkRfRkFJTEVEKQotCQlicmQtPnN0YXRlID0gRklOSVNIRURfUkVTRVQ7Ci0KLWZhaWxlZDoKLQlEUFJfSU5JVCgoImRnYXBfZG9fcmVzZXRfYm9hcmQoKSBmaW5pc2hcbiIpKTsKLX0KLQotCi0vKgotICogU2VuZHMgYSBjb25jZW50cmF0b3IgaW1hZ2UgaW50byB0aGUgRkVQNSBib2FyZC4KLSAqLwotdm9pZCBkZ2FwX2RvX2NvbmNfbG9hZChzdHJ1Y3QgYm9hcmRfdCAqYnJkLCB1Y2hhciAqdWFkZHIsIGludCBsZW4pCi17Ci0JY2hhciAqdmFkZHI7Ci0JdTE2IG9mZnNldCA9IDA7Ci0Jc3RydWN0IGRvd25sZF90ICp0b19kcDsKLQotCWlmICghYnJkIHx8IChicmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHx8ICFicmQtPnJlX21hcF9tZW1iYXNlKQotCQlyZXR1cm47Ci0KLQl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQlvZmZzZXQgPSByZWFkdygodTE2ICopICh2YWRkciArIERPV05SRVEpKTsKLQl0b19kcCA9IChzdHJ1Y3QgZG93bmxkX3QgKikgKHZhZGRyICsgKGludCkgb2Zmc2V0KTsKLQotCS8qCi0JICogVGhlIGltYWdlIHdhcyBhbHJlYWR5IHJlYWQgaW50byBrZXJuZWwgc3BhY2UsCi0JICogd2UgZG8gTk9UIG5lZWQgYSB1c2VyIHNwYWNlIHJlYWQgaGVyZQotCSAqLwotCW1lbWNweV90b2lvKChjaGFyICopIHRvX2RwLCB1YWRkciwgc2l6ZW9mKHN0cnVjdCBkb3dubGRfdCkpOwotCi0JLyogVGVsbCBjYXJkIHdlIGhhdmUgZGF0YSBmb3IgaXQgKi8KLQl3cml0ZXcoMCwgdmFkZHIgKyAoRE9XTlJFUSkpOwotCi0JYnJkLT5jb25jX2RsX3N0YXR1cyA9IE5PX1BFTkRJTkdfQ09OQ0VOVFJBVE9SX1JFUVVFU1RTOwotfQotCi0KLSNkZWZpbmUgRVhQQU5TSU9OX1JPTV9TSVpFCSg2NCAqIDEwMjQpCi0jZGVmaW5lIEZFUDVfUk9NX01BR0lDCQkoMHhGRUZGRkZGRikKLQotc3RhdGljIHZvaWQgZGdhcF9nZXRfdnBkKHN0cnVjdCBib2FyZF90ICpicmQpCi17Ci0JdTMyIG1hZ2ljOwotCXUzMiBiYXNlX29mZnNldDsKLQl1MTYgcm9tX29mZnNldDsKLQl1MTYgdnBkX29mZnNldDsKLQl1MTYgaW1hZ2VfbGVuZ3RoOwotCXUxNiBpOwotCXVjaGFyIGJ5dGUxOwotCXVjaGFyIGJ5dGUyOwotCi0JLyoKLQkgKiBQb2tlIHRoZSBtYWdpYyBudW1iZXIgYXQgdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KLQkgKiBJZiBWUEQgaXMgc3VwcG9ydGVkLCB0aGUgdmFsdWUgcmVhZCBmcm9tIHRoYXQgYWRkcmVzcwotCSAqIHdpbGwgYmUgbm9uLXplcm8uCi0JICovCi0JbWFnaWMgPSBGRVA1X1JPTV9NQUdJQzsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCBtYWdpYyk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyZC0+cGRldiwgUENJX1JPTV9BRERSRVNTLCAmbWFnaWMpOwotCi0JLyogVlBEIG5vdCBzdXBwb3J0ZWQsIGJhaWwgKi8KLQlpZiAoIW1hZ2ljKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFRvIGdldCB0byB0aGUgT1RQUk9NIG1lbW9yeSwgd2UgaGF2ZSB0byBzZW5kIHRoZSBib2FyZHMgYmFzZQotCSAqIGFkZHJlc3Mgb3InZWQgd2l0aCAxIGludG8gdGhlIFBDSSBSb20gQWRkcmVzcyBsb2NhdGlvbi4KLQkgKi8KLQltYWdpYyA9IGJyZC0+bWVtYmFzZSB8IDB4MDE7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgJm1hZ2ljKTsKLQotCWJ5dGUxID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSk7Ci0JYnl0ZTIgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgMSk7Ci0KLQkvKgotCSAqIElmIHRoZSBib2FyZCBjb3JyZWN0bHkgc3dhcHBlZCB0byB0aGUgT1RQUk9NIG1lbW9yeSwKLQkgKiB0aGUgZmlyc3QgMiBieXRlcyAoaGVhZGVyKSBzaG91bGQgYmUgMHg1NSwgMHhBQQotCSAqLwotCWlmIChieXRlMSA9PSAweDU1ICYmIGJ5dGUyID09IDB4QUEpIHsKLQotCQliYXNlX29mZnNldCA9IDA7Ci0KLQkJLyoKLQkJICogV2UgaGF2ZSB0byBydW4gdGhyb3VnaCBhbGwgdGhlIE9UUFJPTSBtZW1vcnkgbG9va2luZwotCQkgKiBmb3IgdGhlIFZQRCBvZmZzZXQuCi0JCSAqLwotCQl3aGlsZSAoYmFzZV9vZmZzZXQgPD0gRVhQQU5TSU9OX1JPTV9TSVpFKSB7Ci0KLQkJCS8qCi0JCQkgKiBMb3RzIG9mIG1hZ2ljIG51bWJlcnMgaGVyZS4KLQkJCSAqCi0JCQkgKiBUaGUgVlBEIG9mZnNldCBpcyBsb2NhdGVkIGluc2lkZSB0aGUgUk9NIERhdGEgU3RydWN0dXJlLgotCQkJICogV2UgYWxzbyBoYXZlIHRvIHJlbWVtYmVyIHRoZSBsZW5ndGggb2YgZWFjaAotCQkJICogUk9NIERhdGEgU3RydWN0dXJlLCBzbyB3ZSBjYW4gImhvcCIgdG8gdGhlIG5leHQKLQkJCSAqIGVudHJ5IGlmIHRoZSBWUEQgaXNuJ3QgaW4gdGhlIGN1cnJlbnQKLQkJCSAqIFJPTSBEYXRhIFN0cnVjdHVyZS4KLQkJCSAqLwotCQkJcm9tX29mZnNldCA9IHJlYWR3KGJyZC0+cmVfbWFwX21lbWJhc2UgKyBiYXNlX29mZnNldCArIDB4MTgpOwotCQkJaW1hZ2VfbGVuZ3RoID0gcmVhZHcoYnJkLT5yZV9tYXBfbWVtYmFzZSArIHJvbV9vZmZzZXQgKyAweDEwKSAqIDUxMjsKLQkJCXZwZF9vZmZzZXQgPSByZWFkdyhicmQtPnJlX21hcF9tZW1iYXNlICsgcm9tX29mZnNldCArIDB4MDgpOwotCi0JCQkvKiBGb3VuZCB0aGUgVlBEIGVudHJ5ICovCi0JCQlpZiAodnBkX29mZnNldCkKLQkJCQlicmVhazsKLQotCQkJLyogV2UgZGlkbid0IGZpbmQgYSBWUEQgZW50cnksIGdvIHRvIG5leHQgUk9NIGVudHJ5LiAqLwotCQkJYmFzZV9vZmZzZXQgKz0gaW1hZ2VfbGVuZ3RoOwotCi0JCQlieXRlMSA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBiYXNlX29mZnNldCk7Ci0JCQlieXRlMiA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyBiYXNlX29mZnNldCArIDEpOwotCi0JCQkvKgotCQkJICogSWYgdGhlIG5ldyBST00gb2Zmc2V0IGRvZXNuJ3QgaGF2ZSAweDU1LCAweEFBCi0JCQkgKiBhcyBpdHMgaGVhZGVyLCB3ZSBoYXZlIHJ1biBvdXQgb2YgUk9NLgotCQkJICovCi0JCQlpZiAoYnl0ZTEgIT0gMHg1NSB8fCBieXRlMiAhPSAweEFBKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSBhIFZQRCBvZmZzZXQsIHRoZW4gbWFyayB0aGUgYm9hcmQKLQkJICogYXMgaGF2aW5nIGEgdmFsaWQgVlBELCBhbmQgY29weSBWUERTSVpFICg1MTIpIGJ5dGVzIG9mCi0JCSAqIHRoYXQgVlBEIHRvIHRoZSBidWZmZXIgd2UgaGF2ZSBpbiBvdXIgYm9hcmQgc3RydWN0dXJlLgotCQkgKi8KLQkJaWYgKHZwZF9vZmZzZXQpIHsKLQkJCWJyZC0+YmRfZmxhZ3MgfD0gQkRfSEFTX1ZQRDsKLQkJCWZvciAoaSA9IDA7IGkgPCBWUERTSVpFOyBpKyspCi0JCQkJYnJkLT52cGRbaV0gPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgdnBkX29mZnNldCArIGkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBXZSBNVVNUIHBva2UgdGhlIG1hZ2ljIG51bWJlciBhdCB0aGUgUENJIFJvbSBBZGRyZXNzIGxvY2F0aW9uIGFnYWluLgotCSAqIFRoaXMgbWFrZXMgdGhlIGNhcmQgcmVwb3J0IHRoZSByZWd1bGFyIGJvYXJkIG1lbW9yeSBiYWNrIHRvIHVzLAotCSAqIHJhdGhlciB0aGFuIHRoZSBPVFBST00gbWVtb3J5LgotCSAqLwotCW1hZ2ljID0gRkVQNV9ST01fTUFHSUM7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmQtPnBkZXYsIFBDSV9ST01fQUREUkVTUywgbWFnaWMpOwotfQotCi0KLS8qCi0gKiBPdXIgYm9hcmQgcG9sbGVyIGZ1bmN0aW9uLgotICovCi12b2lkIGRnYXBfcG9sbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQgPSAoc3RydWN0IGJvYXJkX3QgKikgZGF0YTsKLQl1bG9uZyAgbG9ja19mbGFnczsKLQl1bG9uZyAgbG9ja19mbGFnczI7Ci0JY2hhciAqdmFkZHI7Ci0JdTE2IGhlYWQsIHRhaWw7Ci0JdTE2ICpjaGtfYWRkcjsKLQl1MTYgY2hlY2sgPSAwOwotCi0JaWYgKCFiZCB8fCAoYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpKSB7Ci0JCUFQUigoImRnYXBfcG9sbF90YXNrbGV0KCkgLSBOVUxMIG9yIGJhZCBiZC5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChiZC0+aW5oaWJpdF9wb2xsZXIpCi0JCXJldHVybjsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQl2YWRkciA9IGJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCS8qCi0JICogSWYgYm9hcmQgaXMgcmVhZHksIHBhcnNlIGRlZXBlciB0byBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZG8uCi0JICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBCT0FSRF9SRUFEWSkgewotCi0JCXN0cnVjdCBldl90ICplYWRkciA9IE5VTEw7Ci0KLQkJaWYgKCFiZC0+cmVfbWFwX21lbWJhc2UpIHsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIWJkLT5yZV9tYXBfcG9ydCkgewotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFiZC0+bmFzeW5jKSB7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoaXMgaXMgYSBDWCBvciBFUENYLCB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgZmlybXdhcmUKLQkJICogaXMgcmVxdWVzdGluZyBhIGNvbmNlbnRyYXRvciBpbWFnZSBmcm9tIHVzLgotCQkgKi8KLQkJaWYgKChiZC0+dHlwZSA9PSBQQ1gpIHx8IChiZC0+dHlwZSA9PSBQRVBDKSkgewotCQkJY2hrX2FkZHIgPSAodTE2ICopICh2YWRkciArIERPV05SRVEpOwotCQkJY2hlY2sgPSByZWFkdyhjaGtfYWRkcik7Ci0JCQkvKiBOb256ZXJvIGlmIEZFUCBpcyByZXF1ZXN0aW5nIGNvbmNlbnRyYXRvciBpbWFnZS4gKi8KLQkJCWlmIChjaGVjaykgewotCQkJCWlmIChiZC0+Y29uY19kbF9zdGF0dXMgPT0gTk9fUEVORElOR19DT05DRU5UUkFUT1JfUkVRVUVTVFMpCi0JCQkJCWJkLT5jb25jX2RsX3N0YXR1cyA9IE5FRURfQ09OQ0VOVFJBVE9SOwotCQkJCS8qCi0JCQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkJCSAqLwotCQkJCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJCQlkZ2FwX2RsX2FjdGlvbiA9IDE7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJCQl9Ci0JCQkJREdBUF9VTkxPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkJCX0KLQkJfQotCi0JCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKLQotCQkvKiBHZXQgb3VyIGhlYWQgYW5kIHRhaWwgKi8KLQkJaGVhZCA9IHJlYWR3KCYoZWFkZHItPmV2X2hlYWQpKTsKLQkJdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKLQotCQkvKgotCQkgKiBJZiB0aGVyZSBpcyBhbiBldmVudCBwZW5kaW5nLiBHbyBzZXJ2aWNlIGl0LgotCQkgKi8KLQkJaWYgKGhlYWQgIT0gdGFpbCkgewotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJZGdhcF9ldmVudChiZCk7Ci0JCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQl9Ci0KLW91dDoKLQkJLyoKLQkJICogSWYgYm9hcmQgaXMgZG9pbmcgaW50ZXJydXB0cywgQUNLIHRoZSBpbnRlcnJ1cHQuCi0JCSAqLwotCQlpZiAoYmQgJiYgYmQtPmludHJfcnVubmluZykgewotCQkJcmVhZGIoYmQtPnJlX21hcF9wb3J0ICsgMik7Ci0JCX0KLQotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBPdXIgc3RhdGUgbWFjaGluZSB0byBnZXQgdGhlIGJvYXJkIHVwIGFuZCBydW5uaW5nICovCi0KLQkvKiBSZXNldCBib2FyZCAqLwotCWlmIChiZC0+c3RhdGUgPT0gTkVFRF9SRVNFVCkgewotCi0JCS8qIEdldCBWUEQgaW5mbyAqLwotCQlkZ2FwX2dldF92cGQoYmQpOwotCi0JCWRnYXBfZG9fcmVzZXRfYm9hcmQoYmQpOwotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gRklOSVNIRURfUkVTRVQpIHsKLQkJYmQtPnN0YXRlID0gTkVFRF9DT05GSUc7Ci0JfQotCi0JaWYgKGJkLT5zdGF0ZSA9PSBORUVEX0NPTkZJRykgewotCQkvKgotCQkgKiBNYXRjaCB0aGlzIGJvYXJkIHRvIGEgY29uZmlnIHRoZSB1c2VyIGNyZWF0ZWQgZm9yIHVzLgotCQkgKi8KLQkJYmQtPmJkX2NvbmZpZyA9IGRnYXBfZmluZF9jb25maWcoYmQtPnR5cGUsIGJkLT5wY2lfYnVzLCBiZC0+cGNpX3Nsb3QpOwotCi0JCS8qCi0JCSAqIEJlY2F1c2UgdGhlIDQgcG9ydCBYciBwcm9kdWN0cyBzaGFyZSB0aGUgc2FtZSBQQ0kgSUQKLQkJICogYXMgdGhlIDggcG9ydCBYciBwcm9kdWN0cywgaWYgd2UgcmVjZWl2ZSBhIE5VTEwgY29uZmlnCi0JCSAqIGJhY2ssIGFuZCB0aGlzIGlzIGEgUEFQT1JUOCBib2FyZCwgcmV0cnkgd2l0aCBhCi0JCSAqIFBBUE9SVDQgYXR0ZW1wdCBhcyB3ZWxsLgotCQkgKi8KLQkJaWYgKGJkLT50eXBlID09IFBBUE9SVDggJiYgIWJkLT5iZF9jb25maWcpIHsKLQkJCWJkLT5iZF9jb25maWcgPSBkZ2FwX2ZpbmRfY29uZmlnKFBBUE9SVDQsIGJkLT5wY2lfYnVzLCBiZC0+cGNpX3Nsb3QpOwotCQl9Ci0KLQkJLyoKLQkJICogUmVnaXN0ZXIgdGhlIHR0eXMgKGlmIGFueSkgaW50byB0aGUga2VybmVsLgotCQkgKi8KLQkJaWYgKGJkLT5iZF9jb25maWcpIHsKLQkJCWJkLT5zdGF0ZSA9IEZJTklTSEVEX0NPTkZJRzsKLQkJfQotCQllbHNlIHsKLQkJCWJkLT5zdGF0ZSA9IENPTkZJR19OT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IEZJTklTSEVEX0NPTkZJRykgewotCQliZC0+c3RhdGUgPSBORUVEX0RFVklDRV9DUkVBVElPTjsKLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IE5FRURfREVWSUNFX0NSRUFUSU9OKSB7Ci0JCS8qCi0JCSAqIFNpZ25hbCBkb3dubG9hZGVyLCBpdHMgZ290IHNvbWUgd29yayB0byBkby4KLQkJICovCi0JCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJaWYgKGRnYXBfZGxfYWN0aW9uICE9IDEpIHsKLQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJfQotCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IEZJTklTSEVEX0RFVklDRV9DUkVBVElPTikgewotCQliZC0+c3RhdGUgPSBORUVEX0JJT1NfTE9BRDsKLQl9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KLQlpZiAoYmQtPnN0YXRlID09IE5FRURfQklPU19MT0FEKSB7Ci0JCS8qCi0JCSAqIFNpZ25hbCBkb3dubG9hZGVyLCBpdHMgZ290IHNvbWUgd29yayB0byBkby4KLQkJICovCi0JCURHQVBfTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJaWYgKGRnYXBfZGxfYWN0aW9uICE9IDEpIHsKLQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGdhcF9kbF93YWl0KTsKLQkJfQotCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciBCSU9TIHRvIHRlc3QgYm9hcmQuLi4gKi8KLQlpZiAoYmQtPnN0YXRlID09IFdBSVRfQklPU19MT0FEKSB7Ci0JCWRnYXBfZG9fd2FpdF9mb3JfYmlvcyhiZCk7Ci0JfQotCi0JLyogTW92ZSB0byBuZXh0IHN0YXRlICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBGSU5JU0hFRF9CSU9TX0xPQUQpIHsKLQkJYmQtPnN0YXRlID0gTkVFRF9GRVBfTE9BRDsKLQotCQkvKgotCQkgKiBTaWduYWwgZG93bmxvYWRlciwgaXRzIGdvdCBzb21lIHdvcmsgdG8gZG8uCi0JCSAqLwotCQlER0FQX0xPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCWlmIChkZ2FwX2RsX2FjdGlvbiAhPSAxKSB7Ci0JCQlkZ2FwX2RsX2FjdGlvbiA9IDE7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRnYXBfZGxfd2FpdCk7Ci0JCX0KLQkJREdBUF9VTkxPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JfQotCi0JLyogV2FpdCBmb3IgRkVQIHRvIGxvYWQgb24gYm9hcmQuLi4gKi8KLQlpZiAoYmQtPnN0YXRlID09IFdBSVRfRkVQX0xPQUQpIHsKLQkJZGdhcF9kb193YWl0X2Zvcl9mZXAoYmQpOwotCX0KLQotCi0JLyogTW92ZSB0byBuZXh0IHN0YXRlICovCi0JaWYgKGJkLT5zdGF0ZSA9PSBGSU5JU0hFRF9GRVBfTE9BRCkgewotCi0JCS8qCi0JCSAqIERvIHR0eSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCi0JCSAqLwotCQlpbnQgcmMgPSBkZ2FwX3R0eV9pbml0KGJkKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZ2FwX3R0eV91bmluaXQoYmQpOwotCQkJQVBSKCgiQ2FuJ3QgaW5pdCB0dHkgZGV2aWNlcyAoJWQpXG4iLCByYykpOwotCQkJYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJYmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCQl9Ci0JCWVsc2UgewotCQkJYmQtPnN0YXRlID0gTkVFRF9QUk9DX0NSRUFUSU9OOwotCi0JCQkvKgotCQkJICogU2lnbmFsIGRvd25sb2FkZXIsIGl0cyBnb3Qgc29tZSB3b3JrIHRvIGRvLgotCQkJICovCi0JCQlER0FQX0xPQ0soZGdhcF9kbF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQlpZiAoZGdhcF9kbF9hY3Rpb24gIT0gMSkgewotCQkJCWRnYXBfZGxfYWN0aW9uID0gMTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRnYXBfZGxfd2FpdCk7Ci0JCQl9Ci0JCQlER0FQX1VOTE9DSyhkZ2FwX2RsX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJfQotCX0KLQotCS8qIE1vdmUgdG8gbmV4dCBzdGF0ZSAqLwotCWlmIChiZC0+c3RhdGUgPT0gRklOSVNIRURfUFJPQ19DUkVBVElPTikgewotCi0JCWJkLT5zdGF0ZSA9IEJPQVJEX1JFQURZOwotCQliZC0+ZHBhc3RhdHVzID0gQkRfUlVOTklORzsKLQotCQkvKgotCQkgKiBJZiB1c2VyIHJlcXVlc3RlZCB0aGUgYm9hcmQgdG8gcnVuIGluIGludGVycnVwdCBtb2RlLAotCQkgKiBnbyBhbmQgc2V0IGl0IHVwIG9uIHRoZSBib2FyZC4KLQkJICovCi0JCWlmIChiZC0+aW50cl91c2VkKSB7Ci0JCQl3cml0ZXcoMSwgKGJkLT5yZV9tYXBfbWVtYmFzZSArIEVOQUJMRV9JTlRSKSk7Ci0JCQkvKgotCQkJICogVGVsbCB0aGUgYm9hcmQgdG8gcG9sbCB0aGUgVUFSVFMgYXMgZmFzdCBhcyBwb3NzaWJsZS4KLQkJCSAqLwotCQkJd3JpdGV3KEZFUFBPTExfTUlOLCAoYmQtPnJlX21hcF9tZW1iYXNlICsgRkVQUE9MTCkpOwotCQkJYmQtPmludHJfcnVubmluZyA9IDE7Ci0JCX0KLQotCQkvKiBXYWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciBib2FyZCBzdGF0ZSB0byBjaGFuZ2UgdG8gcmVhZHkgKi8KLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZiZC0+c3RhdGVfd2FpdCk7Ci0JfQotCi0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfY21kYiAtIFNlbmRzIGEgMiBieXRlIGNvbW1hbmQgdG8gdGhlIEZFUC4KLSAqCi0gKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKiAgICAgICAgICAgICAgY21kICAgICAtIENvbW1hbmQgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICBieXRlMSAgIC0gSW50ZWdlciBjb250YWluaW5nIGZpcnN0IGJ5dGUgdG8gYmUgc2VudC4KLSAqICAgICAgICAgICAgICBieXRlMiAgIC0gSW50ZWdlciBjb250YWluaW5nIHNlY29uZCBieXRlIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAotICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBkZ2FwX2NtZGIoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdWNoYXIgYnl0ZTEsIHVjaGFyIGJ5dGUyLCB1aW50IG5jbWRzKQotewotCWNoYXIJCSp2YWRkciA9IE5VTEw7Ci0Jc3RydWN0IGNtX3QJKmNtX2FkZHIgPSBOVUxMOwotCXVpbnQJCWNvdW50OwotCXVpbnQJCW47Ci0JdTE2CQloZWFkOwotCXUxNgkJdGFpbDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBDaGVjayBpZiBib2FyZCBpcyBzdGlsbCBhbGl2ZS4KLQkgKi8KLQlpZiAoY2gtPmNoX2JkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBib2FyZCBpcyBpbiBmYWlsZWQgc3RhdGUuXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIHRoZSBwb2ludGVycyBhcmUgaW4gcmFuZ2UgYmVmb3JlCi0JICogd3JpdGluZyB0byB0aGUgRkVQIG1lbW9yeS4KLQkgKi8KLQl2YWRkciA9IGNoLT5jaF9iZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQlpZiAoIXZhZGRyKQotCQlyZXR1cm47Ci0KLQljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7Ci0JaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgotCSAqLwotCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBwb2ludGVycyBvdXQgb2YgcmFuZ2UsIGZhaWxpbmcgYm9hcmQhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KLQkgKi8KLQl3cml0ZWIoY21kLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAwKSk7Ci0Jd3JpdGViKCh1Y2hhcikgY2gtPmNoX3BvcnRudW0sIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDEpKTsKLQl3cml0ZWIoYnl0ZTEsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKLQl3cml0ZWIoYnl0ZTIsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDMpKTsKLQotCWhlYWQgPSAoaGVhZCArIDQpICYgKENNRE1BWCAtIENNRFNUQVJUIC0gNCk7Ci0KLQl3cml0ZXcoaGVhZCwgJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0KLQkvKgotCSAqIFdhaXQgaWYgbmVjZXNzYXJ5IGJlZm9yZSB1cGRhdGluZyB0aGUgaGVhZAotCSAqIHBvaW50ZXIgdG8gbGltaXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZwotCSAqIGNvbW1hbmRzIHRvIHRoZSBGRVAuICAgSWYgdGhlIHRpbWUgc3BlbnQgd2FpdGluZwotCSAqIGlzIG91dGxhbmRpc2gsIGRlY2xhcmUgdGhlIEZFUCBkZWFkLgotCSAqLwotCWZvciAoY291bnQgPSBkZ2FwX2NvdW50IDs7KSB7Ci0KLQkJaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCQl0YWlsID0gcmVhZHcoJihjbV9hZGRyLT5jbV90YWlsKSk7Ci0KLQkJbiA9IChoZWFkIC0gdGFpbCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKLQotCQlpZiAobiA8PSBuY21kcyAqIHNpemVvZihzdHJ1Y3QgY21fdCkpCi0JCQlicmVhazsKLQotCQlpZiAoLS1jb3VudCA9PSAwKSB7Ci0JCQlEUFJfQ09SRSgoIiVzOiVkIGZhaWxpbmcgYm9hcmQuXG4iLF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJCXJldHVybjsKLQkJfQotCQl1ZGVsYXkoMTApOwotCX0KLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICBkZ2FwX2NtZHcgLSBTZW5kcyBhIDEgd29yZCBjb21tYW5kIHRvIHRoZSBGRVAuCi0gKgotICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgotICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgd29yZCAgICAtIEludGVnZXIgY29udGFpbmluZyB3b3JkIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAotICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBkZ2FwX2NtZHcoc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVjaGFyIGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpCi17Ci0JY2hhcgkJKnZhZGRyID0gTlVMTDsKLQlzdHJ1Y3QgY21fdAkqY21fYWRkciA9IE5VTEw7Ci0JdWludAkJY291bnQ7Ci0JdWludAkJbjsKLQl1MTYJCWhlYWQ7Ci0JdTE2CQl0YWlsOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIENoZWNrIGlmIGJvYXJkIGlzIHN0aWxsIGFsaXZlLgotCSAqLwotCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQlEUFJfQ09SRSgoIiVzOiVkIGJvYXJkIGlzIGZhaWxlZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBpbiByYW5nZSBiZWZvcmUKLQkgKiB3cml0aW5nIHRvIHRoZSBGRVAgbWVtb3J5LgotCSAqLwotCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKLQlpZiAoIXZhZGRyKQotCQlyZXR1cm47Ci0KLQljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7Ci0JaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgotCSAqLwotCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBQb2ludGVycyBvdXQgb2YgcmFuZ2UuICBGYWlsaW5nIGJvYXJkLlxuIixfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KLQkgKi8KLQl3cml0ZWIoY21kLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyAwKSk7Ci0Jd3JpdGViKCh1Y2hhcikgY2gtPmNoX3BvcnRudW0sIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDEpKTsKLQl3cml0ZXcoKHUxNikgd29yZCwgKGNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMikpOwotCi0JaGVhZCA9IChoZWFkICsgNCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKLQotCXdyaXRldyhoZWFkLCAmKGNtX2FkZHItPmNtX2hlYWQpKTsKLQotCS8qCi0JICogV2FpdCBpZiBuZWNlc3NhcnkgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkCi0JICogcG9pbnRlciB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nCi0JICogY29tbWFuZHMgdG8gdGhlIEZFUC4gICBJZiB0aGUgdGltZSBzcGVudCB3YWl0aW5nCi0JICogaXMgb3V0bGFuZGlzaCwgZGVjbGFyZSB0aGUgRkVQIGRlYWQuCi0JICovCi0JZm9yIChjb3VudCA9IGRnYXBfY291bnQgOzspIHsKLQotCQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0JCXRhaWwgPSByZWFkdygmKGNtX2FkZHItPmNtX3RhaWwpKTsKLQotCQluID0gKGhlYWQgLSB0YWlsKSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOwotCi0JCWlmIChuIDw9IG5jbWRzICogc2l6ZW9mKHN0cnVjdCBjbV90KSkKLQkJCWJyZWFrOwotCi0JCWlmICgtLWNvdW50ID09IDApIHsKLQkJCURQUl9DT1JFKCgiJXM6JWQgRmFpbGluZyBib2FyZC5cbiIsX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotfQotCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF9jbWR3X2V4dCAtIFNlbmRzIGEgZXh0ZW5kZWQgd29yZCBjb21tYW5kIHRvIHRoZSBGRVAuCi0gKgotICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgotICogICAgICAgICAgICAgIGNtZCAgICAgLSBDb21tYW5kIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgd29yZCAgICAtIEludGVnZXIgY29udGFpbmluZyB3b3JkIHRvIGJlIHNlbnQuCi0gKiAgICAgICAgICAgICAgbmNtZHMgICAtIFdhaXQgdW50aWwgbmNtZHMgb3IgZmV3ZXIgY21kcyBhcmUgbGVmdAotICogICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY21kIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgZGdhcF9jbWR3X2V4dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdTE2IGNtZCwgdTE2IHdvcmQsIHVpbnQgbmNtZHMpCi17Ci0JY2hhcgkJKnZhZGRyID0gTlVMTDsKLQlzdHJ1Y3QgY21fdAkqY21fYWRkciA9IE5VTEw7Ci0JdWludAkJY291bnQ7Ci0JdWludAkJbjsKLQl1MTYJCWhlYWQ7Ci0JdTE2CQl0YWlsOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIENoZWNrIGlmIGJvYXJkIGlzIHN0aWxsIGFsaXZlLgotCSAqLwotCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQlEUFJfQ09SRSgoIiVzOiVkIGJvYXJkIGlzIGZhaWxlZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBpbiByYW5nZSBiZWZvcmUKLQkgKiB3cml0aW5nIHRvIHRoZSBGRVAgbWVtb3J5LgotCSAqLwotCXZhZGRyID0gY2gtPmNoX2JkLT5yZV9tYXBfbWVtYmFzZTsKLQlpZiAoIXZhZGRyKQotCQlyZXR1cm47Ci0KLQljbV9hZGRyID0gKHN0cnVjdCBjbV90ICopICh2YWRkciArIENNREJVRik7Ci0JaGVhZCA9IHJlYWR3KCYoY21fYWRkci0+Y21faGVhZCkpOwotCi0JLyoKLQkgKiBGb3JnZXQgaXQgaWYgcG9pbnRlcnMgb3V0IG9mIHJhbmdlLgotCSAqLwotCWlmIChoZWFkID49IChDTURNQVggLSBDTURTVEFSVCkgfHwgKGhlYWQgJiAwMykpIHsKLQkJRFBSX0NPUkUoKCIlczolZCBQb2ludGVycyBvdXQgb2YgcmFuZ2UuICBGYWlsaW5nIGJvYXJkLlxuIixfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJY2gtPmNoX2JkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUHV0IHRoZSBkYXRhIGluIHRoZSBjaXJjdWxhciBjb21tYW5kIGJ1ZmZlci4KLQkgKi8KLQotCS8qIFdyaXRlIGFuIEZGIHRvIHRlbGwgdGhlIEZFUCB0aGF0IHdlIHdhbnQgYW4gZXh0ZW5kZWQgY29tbWFuZCAqLwotCXdyaXRlYigodWNoYXIpIDB4ZmYsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDApKTsKLQotCXdyaXRlYigodWNoYXIpIGNoLT5jaF9wb3J0bnVtLCAodWNoYXIgKikgKHZhZGRyICsgaGVhZCArIENNRFNUQVJUICsgMSkpOwotCXdyaXRldygodTE2KSBjbWQsIChjaGFyICopICh2YWRkciArIGhlYWQgKyBDTURTVEFSVCArIDIpKTsKLQotCS8qCi0JICogSWYgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjb21tYW5kIHdvbid0IGZpdCwKLQkgKiBwdXQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLgotCSAqLwotCWlmICgoKGhlYWQgKyA0KSA+PSAoKENNRE1BWCAtIENNRFNUQVJUKSkgfHwgKGhlYWQgJiAwMykpKSB7Ci0JCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBDTURTVEFSVCkpOwotCX0gZWxzZSB7Ci0JCXdyaXRldygodTE2KSB3b3JkLCAoY2hhciAqKSAodmFkZHIgKyBoZWFkICsgQ01EU1RBUlQgKyA0KSk7Ci0JfQotCi0JaGVhZCA9IChoZWFkICsgOCkgJiAoQ01ETUFYIC0gQ01EU1RBUlQgLSA0KTsKLQotCXdyaXRldyhoZWFkLCAmKGNtX2FkZHItPmNtX2hlYWQpKTsKLQotCS8qCi0JICogV2FpdCBpZiBuZWNlc3NhcnkgYmVmb3JlIHVwZGF0aW5nIHRoZSBoZWFkCi0JICogcG9pbnRlciB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nCi0JICogY29tbWFuZHMgdG8gdGhlIEZFUC4gICBJZiB0aGUgdGltZSBzcGVudCB3YWl0aW5nCi0JICogaXMgb3V0bGFuZGlzaCwgZGVjbGFyZSB0aGUgRkVQIGRlYWQuCi0JICovCi0JZm9yIChjb3VudCA9IGRnYXBfY291bnQgOzspIHsKLQotCQloZWFkID0gcmVhZHcoJihjbV9hZGRyLT5jbV9oZWFkKSk7Ci0JCXRhaWwgPSByZWFkdygmKGNtX2FkZHItPmNtX3RhaWwpKTsKLQotCQluID0gKGhlYWQgLSB0YWlsKSAmIChDTURNQVggLSBDTURTVEFSVCAtIDQpOwotCi0JCWlmIChuIDw9IG5jbWRzICogc2l6ZW9mKHN0cnVjdCBjbV90KSkKLQkJCWJyZWFrOwotCi0JCWlmICgtLWNvdW50ID09IDApIHsKLQkJCURQUl9DT1JFKCgiJXM6JWQgRmFpbGluZyBib2FyZC5cbiIsX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCQljaC0+Y2hfYmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfd21vdmUgLSBXcml0ZSBkYXRhIHRvIEZFUCBidWZmZXIuCi0gKgotICogICAgICAgICAgICAgIGNoICAgICAgLSBQb2ludGVyIHRvIGNoYW5uZWwgc3RydWN0dXJlLgotICogICAgICAgICAgICAgIGJ1ZiAgICAgLSBQb2l0ZXIgdG8gY2hhcmFjdGVycyB0byBiZSBtb3ZlZC4KLSAqICAgICAgICAgICAgICBjbnQgICAgIC0gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gbW92ZS4KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgZGdhcF93bW92ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgY2hhciAqYnVmLCB1aW50IGNudCkKLXsKLQlpbnQgICAgbjsKLQljaGFyICAgKnRhZGRyOwotCXN0cnVjdCBic190ICAgICpiczsKLQl1MTYgICAgaGVhZDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBDaGVjayBwYXJhbWV0ZXJzLgotCSAqLwotCWJzICAgPSBjaC0+Y2hfYnM7Ci0JaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKTsKLQotCS8qCi0JICogSWYgcG9pbnRlcnMgYXJlIG91dCBvZiByYW5nZSwganVzdCByZXR1cm4uCi0JICovCi0JaWYgKChjbnQgPiBjaC0+Y2hfdHNpemUpIHx8ICh1bnNpZ25lZCkoaGVhZCAtIGNoLT5jaF90c3RhcnQpID49IGNoLT5jaF90c2l6ZSkgewotCQlEUFJfQ09SRSgoIiVzOiVkIHBvaW50ZXIgb3V0IG9mIHJhbmdlIiwgX19GSUxFX18sIF9fTElORV9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZSB3cml0ZSB3cmFwcyBvdmVyIHRoZSB0b3Agb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciwKLQkgKiBtb3ZlIHRoZSBwb3J0aW9uIHVwIHRvIHRoZSB3cmFwIHBvaW50LCBhbmQgcmVzZXQgdGhlCi0JICogcG9pbnRlcnMgdG8gdGhlIGJvdHRvbS4KLQkgKi8KLQluID0gY2gtPmNoX3RzdGFydCArIGNoLT5jaF90c2l6ZSAtIGhlYWQ7Ci0KLQlpZiAoY250ID49IG4pIHsKLQkJY250IC09IG47Ci0JCXRhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKLQkJbWVtY3B5X3RvaW8odGFkZHIsIGJ1Ziwgbik7Ci0JCWhlYWQgPSBjaC0+Y2hfdHN0YXJ0OwotCQlidWYgKz0gbjsKLQl9Ci0KLQkvKgotCSAqIE1vdmUgcmVzdCBvZiBkYXRhLgotCSAqLwotCXRhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKLQluID0gY250OwotCW1lbWNweV90b2lvKHRhZGRyLCBidWYsIG4pOwotCWhlYWQgKz0gY250OwotCi0Jd3JpdGV3KGhlYWQsICYoYnMtPnR4X2hlYWQpKTsKLX0KLQotLyoKLSAqIFJldHJpdmVzIHRoZSBjdXJyZW50IGN1c3RvbSBiYXVkIHJhdGUgZnJvbSBGRVAgbWVtb3J5LAotICogYW5kIHJldHVybnMgaXQgYmFjayB0byB0aGUgdXNlci4KLSAqIFJldHVybnMgMCBvbiBlcnJvci4KLSAqLwotdWludCBkZ2FwX2dldF9jdXN0b21fYmF1ZChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQl1Y2hhciAqdmFkZHI7Ci0JdWxvbmcgb2Zmc2V0ID0gMDsKLQl1aW50IHZhbHVlID0gMDsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIWNoLT5jaF9iZCB8fCBjaC0+Y2hfYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCEoY2gtPmNoX2JkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSkKLQkJcmV0dXJuIDA7Ci0KLQl2YWRkciA9IGNoLT5jaF9iZC0+cmVfbWFwX21lbWJhc2U7Ci0KLQlpZiAoIXZhZGRyKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogR28gZ2V0IGZyb20gZmVwIG1lbSwgd2hhdCB0aGUgZmVwCi0JICogYmVsaWV2ZXMgdGhlIGN1c3RvbSBiYXVkIHJhdGUgaXMuCi0JICovCi0Jb2Zmc2V0ID0gKCgoKCoodW5zaWduZWQgc2hvcnQgKikodmFkZHIgKyBFQ1NfU0VHKSkgPDwgNCkgKwotCQkoY2gtPmNoX3BvcnRudW0gKiAweDI4KSArIExJTkVfU1BFRUQpKTsKLQotCXZhbHVlID0gcmVhZHcodmFkZHIgKyBvZmZzZXQpOwotCXJldHVybiB2YWx1ZTsKLX0KLQotCi0vKgotICogQ2FsbHMgdGhlIGZpcm13YXJlIHRvIHJlc2V0IHRoaXMgY2hhbm5lbC4KLSAqLwotdm9pZCBkZ2FwX2Zpcm13YXJlX3Jlc2V0X3BvcnQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCi17Ci0JZGdhcF9jbWRiKGNoLCBDSFJFU0VULCAwLCAwLCAwKTsKLQotCS8qCi0JICogTm93IHRoYXQgdGhlIGNoYW5uZWwgaXMgcmVzZXQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0JICogYWxsIHRoZSBjdXJyZW50IHNldHRpbmdzIGdldCByZWFwcGxpZWQgdG8gdGhlIHBvcnQKLQkgKiBpbiB0aGUgZmlybXdhcmUuCi0JICoKLQkgKiBTbyB3ZSB3aWxsIHNldCB0aGUgZHJpdmVyJ3MgY2FjaGUgb2YgZmlybXdhcmUKLQkgKiBzZXR0aW5ncyBhbGwgdG8gMCwgYW5kIHRoZW4gY2FsbCBwYXJhbS4KLQkgKi8KLQljaC0+Y2hfZmVwaWZsYWcgPSAwOwotCWNoLT5jaF9mZXBjZmxhZyA9IDA7Ci0JY2gtPmNoX2ZlcG9mbGFnID0gMDsKLQljaC0+Y2hfZmVwc3RhcnRjID0gMDsKLQljaC0+Y2hfZmVwc3RvcGMgPSAwOwotCWNoLT5jaF9mZXBhc3RhcnRjID0gMDsKLQljaC0+Y2hfZmVwYXN0b3BjID0gMDsKLQljaC0+Y2hfbW9zdGF0ID0gMDsKLQljaC0+Y2hfaGZsb3cgPSAwOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfcGFyYW0gLSBTZXQgRGlnaSBwYXJhbWV0ZXJzLgotICoKLSAqICAgICAgICAgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqICAgICAtIFRUWSBmb3IgcG9ydC4KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBkZ2FwX3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGt0ZXJtaW9zICp0czsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IGJzX3QgICAqYnM7Ci0Jc3RydWN0IHVuX3QgICAqdW47Ci0JdTE2CWhlYWQ7Ci0JdTE2CWNmbGFnOwotCXUxNglpZmxhZzsKLQl1Y2hhcgltdmFsOwotCXVjaGFyCWhmbG93OwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiAtRU5YSU87Ci0KLQl1biA9IChzdHJ1Y3QgdW5fdCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm4gLUVOWElPOwotCi0JRFBSX1BBUkFNKCgicGFyYW0gc3RhcnQ6IHRkZXY6ICV4IGNmbGFnczogJXggb2ZsYWdzOiAleCBpZmxhZ3M6ICV4XG4iLAotCQljaC0+Y2hfdHVuLnVuX2RldiwgY2gtPmNoX2NfY2ZsYWcsIGNoLT5jaF9jX29mbGFnLCBjaC0+Y2hfY19pZmxhZykpOwotCi0JdHMgPSAmdHR5LT50ZXJtaW9zOwotCi0JLyoKLQkgKiBJZiBiYXVkIHJhdGUgaXMgemVybywgZmx1c2ggcXVldWVzLCBhbmQgc2V0IG12YWwgdG8gZHJvcCBEVFIuCi0JICovCi0JaWYgKChjaC0+Y2hfY19jZmxhZyAmIChDQkFVRCkpID09IDApIHsKLQotCQkvKiBmbHVzaCByeCAqLwotCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X2hlYWQpKTsKLQkJd3JpdGV3KGhlYWQsICYoY2gtPmNoX2JzLT5yeF90YWlsKSk7Ci0KLQkJLyogZmx1c2ggdHggKi8KLQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7Ci0JCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+dHhfdGFpbCkpOwotCi0JCWNoLT5jaF9mbGFncyB8PSAoQ0hfQkFVRDApOwotCi0JCS8qIERyb3AgUlRTIGFuZCBEVFIgKi8KLQkJY2gtPmNoX212YWwgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKLQkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKLQkJY2gtPmNoX2JhdWRfaW5mbyA9IDA7Ci0KLQl9IGVsc2UgaWYgKGNoLT5jaF9jdXN0b21fc3BlZWQgJiYgKGJkLT5iZF9mbGFncyAmIEJEX0ZFUDVQTFVTKSkgewotCQkvKgotCQkgKiBUZWxsIHRoZSBmZXAgdG8gZG8gdGhlIGNvbW1hbmQKLQkJICovCi0KLQkJRFBSX1BBUkFNKCgicGFyYW06IFdhbnQgJWQgc3BlZWRcbiIsIGNoLT5jaF9jdXN0b21fc3BlZWQpKTsKLQotCQlkZ2FwX2NtZHdfZXh0KGNoLCAweGZmMDEsIGNoLT5jaF9jdXN0b21fc3BlZWQsIDApOwotCi0JCS8qCi0JCSAqIE5vdyBnbyBnZXQgZnJvbSBmZXAgbWVtLCB3aGF0IHRoZSBmZXAKLQkJICogYmVsaWV2ZXMgdGhlIGN1c3RvbSBiYXVkIHJhdGUgaXMuCi0JCSAqLwotCQljaC0+Y2hfYmF1ZF9pbmZvID0gY2gtPmNoX2N1c3RvbV9zcGVlZCA9IGRnYXBfZ2V0X2N1c3RvbV9iYXVkKGNoKTsKLQotCQlEUFJfUEFSQU0oKCJwYXJhbTogR290ICVkIHNwZWVkXG4iLCBjaC0+Y2hfY3VzdG9tX3NwZWVkKSk7Ci0KLQkJLyogSGFuZGxlIHRyYW5zaXRpb24gZnJvbSBCMCAqLwotCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfQkFVRDApIHsKLQkJCWNoLT5jaF9mbGFncyAmPSB+KENIX0JBVUQwKTsKLQkJCWNoLT5jaF9tdmFsIHw9IChEX1JUUyhjaCl8RF9EVFIoY2gpKTsKLQkJfQotCQltdmFsID0gRF9EVFIoY2gpIHwgRF9SVFMoY2gpOwotCi0JfSBlbHNlIHsKLQkJLyoKLQkJICogU2V0IGJhdWQgcmF0ZSwgY2hhcmFjdGVyIHNpemUsIGFuZCBwYXJpdHkuCi0JCSAqLwotCi0KLQkJaW50IGlpbmRleCA9IDA7Ci0JCWludCBqaW5kZXggPSAwOwotCQlpbnQgYmF1ZCA9IDA7Ci0KLQkJdWxvbmcgYmF1ZHNbNF1bMTZdID0gewotCQkJeyAvKiBzbG93YmF1ZCAqLwotCQkJCTAsCTUwLAk3NSwJMTEwLAotCQkJCTEzNCwJMTUwLAkyMDAsCTMwMCwKLQkJCQk2MDAsCTEyMDAsCTE4MDAsCTI0MDAsCi0JCQkJNDgwMCwJOTYwMCwJMTkyMDAsCTM4NDAwIH0sCi0JCQl7IC8qIHNsb3diYXVkICYgQ0JBVURFWCAqLwotCQkJCTAsCTU3NjAwLAkxMTUyMDAsCTIzMDQwMCwKLQkJCQk0NjA4MDAsCTE1MCwJMjAwLAk5MjE2MDAsCi0JCQkJNjAwLAkxMjAwLAkxODAwLAkyNDAwLAotCQkJCTQ4MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAotCQkJeyAvKiBmYXN0YmF1ZCAqLwotCQkJCTAsCTU3NjAwLAk3NjgwMCwJMTE1MjAwLAotCQkJCTE0NDAwLAk1NzYwMCwJMjMwNDAwLAk3NjgwMCwKLQkJCQkxMTUyMDAsCTIzMDQwMCwJMjg4MDAsCTQ2MDgwMCwKLQkJCQk5MjE2MDAsCTk2MDAsCTE5MjAwLAkzODQwMCB9LAotCQkJeyAvKiBmYXN0YmF1ZCAmIENCQVVERVggKi8KLQkJCQkwLAk1NzYwMCwJMTE1MjAwLAkyMzA0MDAsCi0JCQkJNDYwODAwLAkxNTAsCTIwMCwJOTIxNjAwLAotCQkJCTYwMCwJMTIwMCwJMTgwMCwJMjQwMCwKLQkJCQk0ODAwLAk5NjAwLAkxOTIwMCwJMzg0MDAgfQotCQl9OwotCi0JCS8qIE9ubHkgdXNlIHRoZSBUWFByaW50IGJhdWQgcmF0ZSBpZiB0aGUgdGVybWluYWwgdW5pdCBpcyBOT1Qgb3BlbiAqLwotCQlpZiAoIShjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSAmJiAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkpCi0JCQliYXVkID0gQ19CQVVEKGNoLT5jaF9wdW4udW5fdHR5KSAmIDB4ZmY7Ci0JCWVsc2UKLQkJCWJhdWQgPSBDX0JBVUQoY2gtPmNoX3R1bi51bl90dHkpICYgMHhmZjsKLQotCQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKQotCQkJaWluZGV4ID0gMTsKLQotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkKLQkJCWlpbmRleCArPSAyOwotCi0JCWppbmRleCA9IGJhdWQ7Ci0KLQkJaWYgKChpaW5kZXggPj0gMCkgJiYgKGlpbmRleCA8IDQpICYmIChqaW5kZXggPj0gMCkgJiYgKGppbmRleCA8IDE2KSkgewotCQkJYmF1ZCA9IGJhdWRzW2lpbmRleF1bamluZGV4XTsKLQkJfSBlbHNlIHsKLQkJCURQUl9JT0NUTCgoImJhdWQgaW5kaWNlcyB3ZXJlIG91dCBvZiByYW5nZSAoJWQpKCVkKSIsCi0JCQkJaWluZGV4LCBqaW5kZXgpKTsKLQkJCWJhdWQgPSAwOwotCQl9Ci0KLQkJaWYgKGJhdWQgPT0gMCkKLQkJCWJhdWQgPSA5NjAwOwotCi0JCWNoLT5jaF9iYXVkX2luZm8gPSBiYXVkOwotCi0KLQkJLyoKLQkJICogQ0JBVUQgaGFzIGJpdCBwb3NpdGlvbiAweDEwMDAgc2V0IHRoZXNlIGRheXMgdG8gaW5kaWNhdGUgTGludXgKLQkJICogYmF1ZCByYXRlIHJlbWFwLgotCQkgKiBXZSB1c2UgYSBkaWZmZXJlbnQgYml0IGFzc2lnbm1lbnQgZm9yIGhpZ2ggc3BlZWQuICBDbGVhciB0aGlzCi0JCSAqIGJpdCBvdXQgd2hpbGUgZ3JhYmJpbmcgdGhlIHBhcnRzIG9mICJjZmxhZyIgd2Ugd2FudC4KLQkJICovCi0JCWNmbGFnID0gY2gtPmNoX2NfY2ZsYWcgJiAoKENCQVVEIF4gQ0JBVURFWCkgfCBQQVJPREQgfCBQQVJFTkIgfCBDU1RPUEIgfCBDU0laRSk7Ci0KLQkJLyoKLQkJICogSFVQQ0wgYml0IGlzIHVzZWQgYnkgRkVQIHRvIGluZGljYXRlIGZhc3QgYmF1ZAotCQkgKiB0YWJsZSBpcyB0byBiZSB1c2VkLgotCQkgKi8KLQkJaWYgKChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GQVNUKSB8fCAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVREVYKSkKLQkJCWNmbGFnIHw9IEhVUENMOwotCi0KLQkJaWYgKChjaC0+Y2hfY19jZmxhZyAmIENCQVVERVgpICYmICEoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRkFTVCkpIHsKLQkJLyoKLQkJICogVGhlIGJlbG93IGNvZGUgaXMgdHJ5aW5nIHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYmF1ZCByYXRlcwotCQkgKiAxMTUyMDAsIDIzMDQwMCwgNDYwODAwLCA5MjE2MDAgYXJlIHJlbWFwcGVkLiAgV2UgdXNlIGV4Y2x1c2l2ZSBvcgotCQkgKiBiZWNhdXNlIHRoZSB2YXJpb3VzIGJhdWQgcmF0ZXMgc2hhcmUgY29tbW9uIGJpdCBwb3NpdGlvbnMKLQkJICogYW5kIHRoZXJlZm9yZSBjYW4ndCBiZSB0ZXN0ZWQgZm9yIGVhc2lseS4KLQkJICovCi0JCQl0Y2ZsYWdfdCB0Y2ZsYWcgPSAoY2gtPmNoX2NfY2ZsYWcgJiBDQkFVRCkgfCBDQkFVREVYOwotCQkJaW50IGJhdWRwYXJ0ID0gMDsKLQotCQkJLyogTWFwIGhpZ2ggc3BlZWQgcmVxdWVzdHMgdG8gaW5kZXggaW50byBGRVAncyBiYXVkIHRhYmxlICovCi0JCQlzd2l0Y2ggKHRjZmxhZykgewotCQkJY2FzZSBCNTc2MDAgOgotCQkJCWJhdWRwYXJ0ID0gMTsKLQkJCQlicmVhazsKLSNpZmRlZiBCNzY4MDAKLQkJCWNhc2UgQjc2ODAwIDoKLQkJCQliYXVkcGFydCA9IDI7Ci0JCQkJYnJlYWs7Ci0jZW5kaWYKLQkJCWNhc2UgQjExNTIwMCA6Ci0JCQkJYmF1ZHBhcnQgPSAzOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCMjMwNDAwIDoKLQkJCQliYXVkcGFydCA9IDk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEI0NjA4MDAgOgotCQkJCWJhdWRwYXJ0ID0gMTE7Ci0JCQkJYnJlYWs7Ci0jaWZkZWYgQjkyMTYwMAotCQkJY2FzZSBCOTIxNjAwIDoKLQkJCQliYXVkcGFydCA9IDEyOwotCQkJCWJyZWFrOwotI2VuZGlmCi0JCQlkZWZhdWx0OgotCQkJCWJhdWRwYXJ0ID0gMDsKLQkJCX0KLQotCQkJaWYgKGJhdWRwYXJ0KQotCQkJCWNmbGFnID0gKGNmbGFnICYgfihDQkFVRCB8IENCQVVERVgpKSB8IGJhdWRwYXJ0OwotCQl9Ci0KLQkJY2ZsYWcgJj0gMHhmZmZmOwotCi0JCWlmIChjZmxhZyAhPSBjaC0+Y2hfZmVwY2ZsYWcpIHsKLQkJCWNoLT5jaF9mZXBjZmxhZyA9ICh1MTYpIChjZmxhZyAmIDB4ZmZmZik7Ci0KLQkJCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLwotCQkJZGdhcF9jbWR3KGNoLCBTQ0ZMQUcsICh1MTYpIGNmbGFnLCAwKTsKLQkJfQotCi0JCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGZyb20gQjAgKi8KLQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0JBVUQwKSB7Ci0JCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9CQVVEMCk7Ci0JCQljaC0+Y2hfbXZhbCB8PSAoRF9SVFMoY2gpfERfRFRSKGNoKSk7Ci0JCX0KLQkJbXZhbCA9IERfRFRSKGNoKSB8IERfUlRTKGNoKTsKLQl9Ci0KLQkvKgotCSAqIEdldCBpbnB1dCBmbGFncy4KLQkgKi8KLQlpZmxhZyA9IGNoLT5jaF9jX2lmbGFnICYgKElHTkJSSyB8IEJSS0lOVCB8IElHTlBBUiB8IFBBUk1SSyB8IElOUENLIHwgSVNUUklQIHwgSVhPTiB8IElYQU5ZIHwgSVhPRkYpOwotCi0JaWYgKChjaC0+Y2hfc3RhcnRjID09IF9QT1NJWF9WRElTQUJMRSkgfHwgKGNoLT5jaF9zdG9wYyA9PSBfUE9TSVhfVkRJU0FCTEUpKSB7Ci0JCWlmbGFnICY9IH4oSVhPTiB8IElYT0ZGKTsKLQkJY2gtPmNoX2NfaWZsYWcgJj0gfihJWE9OIHwgSVhPRkYpOwotCX0KLQotCS8qCi0JICogT25seSB0aGUgSUJNIFhyIGNhcmQgY2FuIHN3aXRjaCBiZXR3ZWVuCi0JICogMjMyIGFuZCA0MjIgbW9kZXMgb24gdGhlIGZseQotCSAqLwotCWlmIChiZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfWFJfSUJNX0RJRCkgewotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfNDIyKQotCQkJZGdhcF9jbWRiKGNoLCBTQ09NTU9ERSwgTU9ERV80MjIsIDAsIDApOwotCQllbHNlCi0JCQlkZ2FwX2NtZGIoY2gsIFNDT01NT0RFLCBNT0RFXzIzMiwgMCwgMCk7Ci0JfQotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0FMVFBJTikKLQkJaWZsYWcgfD0gSUFMVFBJTiA7Ci0KLQlpZiAoaWZsYWcgIT0gY2gtPmNoX2ZlcGlmbGFnKSB7Ci0JCWNoLT5jaF9mZXBpZmxhZyA9IGlmbGFnOwotCi0JCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLwotCQlkZ2FwX2NtZHcoY2gsIFNJRkxBRywgKHUxNikgY2gtPmNoX2ZlcGlmbGFnLCAwKTsKLQl9Ci0KLQkvKgotCSAqIFNlbGVjdCBoYXJkd2FyZSBoYW5kc2hha2luZy4KLQkgKi8KLQloZmxvdyA9IDA7Ci0KLQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCWhmbG93IHw9IChEX1JUUyhjaCkgfCBEX0NUUyhjaCkpOwotCX0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIFJUU1BBQ0UpCi0JCWhmbG93IHw9IERfUlRTKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERUUlBBQ0UpCi0JCWhmbG93IHw9IERfRFRSKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UpCi0JCWhmbG93IHw9IERfQ1RTKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERTUlBBQ0UpCi0JCWhmbG93IHw9IERfRFNSKGNoKTsKLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERDRFBBQ0UpCi0JCWhmbG93IHw9IERfQ0QoY2gpOwotCi0JaWYgKGhmbG93ICE9IGNoLT5jaF9oZmxvdykgewotCQljaC0+Y2hfaGZsb3cgPSBoZmxvdzsKLQotCQkvKiBPa2F5IHRvIGhhdmUgY2hhbm5lbCBhbmQgYm9hcmQgbG9ja3MgaGVsZCBjYWxsaW5nIHRoaXMgKi8KLQkJZGdhcF9jbWRiKGNoLCBTSEZMT1csICh1Y2hhcikgaGZsb3csIDB4ZmYsIDApOwotCX0KLQotCi0JLyoKLQkgKiBTZXQgUlRTIGFuZC9vciBEVFIgVG9nZ2xlIGlmIG5lZWRlZCwgYnV0IG9ubHkgaWYgcHJvZHVjdCBpcyBGRVA1KyBiYXNlZC4KLQkgKi8KLQlpZiAoYmQtPmJkX2ZsYWdzICYgQkRfRkVQNVBMVVMpIHsKLQkJdTE2IGhmbG93MiA9IDA7Ci0JCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9SVFNfVE9HR0xFKSB7Ci0JCQloZmxvdzIgfD0gKERfUlRTKGNoKSk7Ci0JCX0KLQkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX0RUUl9UT0dHTEUpIHsKLQkJCWhmbG93MiB8PSAoRF9EVFIoY2gpKTsKLQkJfQotCi0JCWRnYXBfY21kd19leHQoY2gsIDB4ZmYwMywgaGZsb3cyLCAwKTsKLQl9Ci0KLQkvKgotCSAqIFNldCBtb2RlbSBjb250cm9sIGxpbmVzLgotCSAqLwotCi0JbXZhbCBePSBjaC0+Y2hfbWZvcmNlICYgKG12YWwgXiBjaC0+Y2hfbXZhbCk7Ci0KLQlEUFJfUEFSQU0oKCJkZ2FwX3BhcmFtOiBtdmFsOiAleCBjaF9tZm9yY2U6ICV4IGNoX212YWw6ICV4IGNoX21vc3RhdDogJXhcbiIsCi0JCW12YWwsIGNoLT5jaF9tZm9yY2UsIGNoLT5jaF9tdmFsLCBjaC0+Y2hfbW9zdGF0KSk7Ci0KLQlpZiAoY2gtPmNoX21vc3RhdCBeIG12YWwpIHsKLQkJY2gtPmNoX21vc3RhdCA9IG12YWw7Ci0KLQkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCi0JCURQUl9QQVJBTSgoImRnYXBfcGFyYW06IFNlbmRpbmcgU01PREVNIG12YWw6ICV4XG4iLCBtdmFsKSk7Ci0JCWRnYXBfY21kYihjaCwgU01PREVNLCAodWNoYXIpIG12YWwsIERfUlRTKGNoKXxEX0RUUihjaCksIDApOwotCX0KLQotCS8qCi0JICogUmVhZCBtb2RlbSBzaWduYWxzLCBhbmQgdGhlbiBjYWxsIGNhcnJpZXIgZnVuY3Rpb24uCi0JICovCi0JY2gtPmNoX21pc3RhdCA9IHJlYWRiKCYoYnMtPm1fc3RhdCkpOwotCWRnYXBfY2FycmllcihjaCk7Ci0KLQkvKgotCSAqIFNldCB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KLQkgKi8KLQlpZiAoY2gtPmNoX3N0YXJ0YyAhPSBjaC0+Y2hfZmVwc3RhcnRjIHx8IGNoLT5jaF9zdG9wYyAhPSBjaC0+Y2hfZmVwc3RvcGMpIHsKLQkJY2gtPmNoX2ZlcHN0YXJ0YyA9IGNoLT5jaF9zdGFydGM7Ci0JCWNoLT5jaF9mZXBzdG9wYyA9ICBjaC0+Y2hfc3RvcGM7Ci0KLQkJLyogT2theSB0byBoYXZlIGNoYW5uZWwgYW5kIGJvYXJkIGxvY2tzIGhlbGQgY2FsbGluZyB0aGlzICovCi0JCWRnYXBfY21kYihjaCwgU0ZMT1dDLCBjaC0+Y2hfZmVwc3RhcnRjLCBjaC0+Y2hfZmVwc3RvcGMsIDApOwotCX0KLQotCS8qCi0JICogU2V0IHRoZSBBdXhpbGlhcnkgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4KLQkgKi8KLQlpZiAoY2gtPmNoX2FzdGFydGMgIT0gY2gtPmNoX2ZlcGFzdGFydGMgfHwgY2gtPmNoX2FzdG9wYyAhPSBjaC0+Y2hfZmVwYXN0b3BjKSB7Ci0JCWNoLT5jaF9mZXBhc3RhcnRjID0gY2gtPmNoX2FzdGFydGM7Ci0JCWNoLT5jaF9mZXBhc3RvcGMgPSBjaC0+Y2hfYXN0b3BjOwotCi0JCS8qIE9rYXkgdG8gaGF2ZSBjaGFubmVsIGFuZCBib2FyZCBsb2NrcyBoZWxkIGNhbGxpbmcgdGhpcyAqLwotCQlkZ2FwX2NtZGIoY2gsIFNBRkxPV0MsIGNoLT5jaF9mZXBhc3RhcnRjLCBjaC0+Y2hfZmVwYXN0b3BjLCAwKTsKLQl9Ci0KLQlEUFJfUEFSQU0oKCJwYXJhbSBmaW5pc2hcbiIpKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBkZ2FwX3Bhcml0eV9zY2FuKCkKLSAqCi0gKiBDb252ZXJ0IHRoZSBGRVA1IHdheSBvZiByZXBvcnRpbmcgcGFyaXR5IGVycm9ycyBhbmQgYnJlYWtzIGludG8KLSAqIHRoZSBMaW51eCBsaW5lIGRpc2NpcGxpbmUgd2F5LgotICovCi12b2lkIGRnYXBfcGFyaXR5X3NjYW4oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGNoYXIgKmNidWYsIHVuc2lnbmVkIGNoYXIgKmZidWYsIGludCAqbGVuKQotewotCWludCBsID0gKmxlbjsKLQlpbnQgY291bnQgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmluLCAqY291dCwgKmZvdXQ7Ci0JdW5zaWduZWQgY2hhciBjOwotCi0JaW4gPSBjYnVmOwotCWNvdXQgPSBjYnVmOwotCWZvdXQgPSBmYnVmOwotCi0JRFBSX1BTQ0FOKCgiZGdhcF9wYXJpdHlfc2NhbiBzdGFydFxuIikpOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAobC0tKSB7Ci0JCWMgPSAqaW4rKzsKLQkJc3dpdGNoIChjaC0+cHNjYW5fc3RhdGUpIHsKLQkJZGVmYXVsdDoKLQkJCS8qIHJlc2V0IHRvIHNhbml0eSBhbmQgZmFsbCB0aHJvdWdoICovCi0JCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCi0JCWNhc2UgMDoKLQkJCS8qIE5vIEZGIHNlZW4geWV0ICovCi0JCQlpZiAoYyA9PSAodW5zaWduZWQgY2hhcikgJ1wzNzcnKSB7Ci0JCQkJLyogZGVsZXRlIHRoaXMgY2hhcmFjdGVyIGZyb20gc3RyZWFtICovCi0JCQkJY2gtPnBzY2FuX3N0YXRlID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJKmNvdXQrKyA9IGM7Ci0JCQkJKmZvdXQrKyA9IFRUWV9OT1JNQUw7Ci0JCQkJY291bnQgKz0gMTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgMToKLQkJCS8qIGZpcnN0IEZGIHNlZW4gKi8KLQkJCWlmIChjID09ICh1bnNpZ25lZCBjaGFyKSAnXDM3NycpIHsKLQkJCQkvKiBkb3VibGVkIGZmLCB0cmFuc2Zvcm0gdG8gc2luZ2xlIGZmICovCi0JCQkJKmNvdXQrKyA9IGM7Ci0JCQkJKmZvdXQrKyA9IFRUWV9OT1JNQUw7Ci0JCQkJY291bnQgKz0gMTsKLQkJCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBzYXZlIHZhbHVlIGV4YW1pbmF0aW9uIGluIG5leHQgc3RhdGUgKi8KLQkJCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSBjOwotCQkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDI7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIDI6Ci0JCQkvKiB0aGlyZCBjaGFyYWN0ZXIgb2YgZmYgc2VxdWVuY2UgKi8KLQotCQkJKmNvdXQrKyA9IGM7Ci0KLQkJCWlmIChjaC0+cHNjYW5fc2F2ZWNoYXIgPT0gMHgwKSB7Ci0KLQkJCQlpZiAoYyA9PSAweDApIHsKLQkJCQkJRFBSX1BTQ0FOKCgiZGdhcF9wYXJpdHlfc2NhbiBpbiAzcmQgY2hhciBvZiBmZiBzZXEuIGM6ICV4IHNldHRpbmcgYnJlYWsuXG4iLCBjKSk7Ci0JCQkJCWNoLT5jaF9lcnJfYnJlYWsrKzsKLQkJCQkJKmZvdXQrKyA9IFRUWV9CUkVBSzsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCURQUl9QU0NBTigoImRnYXBfcGFyaXR5X3NjYW4gaW4gM3JkIGNoYXIgb2YgZmYgc2VxLiBjOiAleCBzZXR0aW5nIHBhcml0eS5cbiIsIGMpKTsKLQkJCQkJY2gtPmNoX2Vycl9wYXJpdHkrKzsKLQkJCQkJKmZvdXQrKyA9IFRUWV9QQVJJVFk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRFBSX1BTQ0FOKCgiJXM6JWQgTG9naWMgRXJyb3IuXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pKTsKLQkJCX0KLQotCQkJY291bnQgKz0gMTsKLQkJCWNoLT5wc2Nhbl9zdGF0ZSA9IDA7Ci0JCX0KLQl9Ci0JKmxlbiA9IGNvdW50OwotCURQUl9QU0NBTigoImRnYXBfcGFyaXR5X3NjYW4gZmluaXNoXG4iKSk7Ci19Ci0KLQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgIGRnYXBfZXZlbnQgLSBGRVAgdG8gaG9zdCBldmVudCBwcm9jZXNzaW5nIHJvdXRpbmUuCi0gKgotICogICAgICAgICAgICAgIGJkICAgICAtIEJvYXJkIG9mIGN1cnJlbnQgZXZlbnQuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGRnYXBfZXZlbnQoc3RydWN0IGJvYXJkX3QgKmJkKQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXVsb25nCQlsb2NrX2ZsYWdzOwotCXVsb25nCQlsb2NrX2ZsYWdzMjsKLQlzdHJ1Y3QgYnNfdAkqYnM7Ci0JdWNoYXIJCSpldmVudDsKLQl1Y2hhcgkJKnZhZGRyID0gTlVMTDsKLQlzdHJ1Y3QgZXZfdAkqZWFkZHIgPSBOVUxMOwotCXVpbnQJCWhlYWQ7Ci0JdWludAkJdGFpbDsKLQlpbnQJCXBvcnQ7Ci0JaW50CQlyZWFzb247Ci0JaW50CQltb2RlbTsKLQlpbnQJCWIxOwotCi0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQl2YWRkciA9IGJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCWlmICghdmFkZHIpIHsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWVhZGRyID0gKHN0cnVjdCBldl90ICopICh2YWRkciArIEVWQlVGKTsKLQotCS8qIEdldCBvdXIgaGVhZCBhbmQgdGFpbCAqLwotCWhlYWQgPSByZWFkdygmKGVhZGRyLT5ldl9oZWFkKSk7Ci0JdGFpbCA9IHJlYWR3KCYoZWFkZHItPmV2X3RhaWwpKTsKLQotCS8qCi0JICogRm9yZ2V0IGl0IGlmIHBvaW50ZXJzIG91dCBvZiByYW5nZS4KLQkgKi8KLQotCWlmIChoZWFkID49IEVWTUFYIC0gRVZTVEFSVCB8fCB0YWlsID49IEVWTUFYIC0gRVZTVEFSVCB8fAotCSAgICAoaGVhZCB8IHRhaWwpICYgMDMpIHsKLQkJRFBSX0VWRU5UKCgic2hvdWxkIGJlIGNhbGxpbmcgeHhmYWlsICVkXG4iLCBfX0xJTkVfXykpOwotCQkvKiBMZXQgZ28gb2YgYm9hcmQgbG9jayAqLwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyoKLQkgKiBMb29wIHRvIHByb2Nlc3MgYWxsIHRoZSBldmVudHMgaW4gdGhlIGJ1ZmZlci4KLQkgKi8KLQl3aGlsZSAodGFpbCAhPSBoZWFkKSB7Ci0KLQkJLyoKLQkJICogR2V0IGludGVycnVwdCBpbmZvcm1hdGlvbi4KLQkJICovCi0KLQkJZXZlbnQgPSBiZC0+cmVfbWFwX21lbWJhc2UgKyB0YWlsICsgRVZTVEFSVDsKLQotCQlwb3J0ICAgPSBldmVudFswXTsKLQkJcmVhc29uID0gZXZlbnRbMV07Ci0JCW1vZGVtICA9IGV2ZW50WzJdOwotCQliMSAgICAgPSBldmVudFszXTsKLQotCQlEUFJfRVZFTlQoKCJldmVudDogamlmZmllczogJWxkIHBvcnQ6ICVkIHJlYXNvbjogJXggbW9kZW06ICV4XG4iLAotCQkJamlmZmllcywgcG9ydCwgcmVhc29uLCBtb2RlbSkpOwotCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGlzIHZhbGlkLgotCQkgKi8KLQkJaWYgKHBvcnQgPj0gYmQtPm5hc3luYykKLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAoIShyZWFzb24gJiAoSUZNT0RFTSB8IElGQlJFQUsgfCBJRlRMVyB8IElGVEVNIHwgSUZEQVRBKSkpIHsKLQkJCWdvdG8gbmV4dDsKLQkJfQotCi0JCWNoID0gYmQtPmNoYW5uZWxzW3BvcnRdOwotCi0JCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykgewotCQkJZ290byBuZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSBtYWRlIGl0IGhlcmUsIHRoZSBldmVudCB3YXMgdmFsaWQuCi0JCSAqIExvY2sgZG93biB0aGUgY2hhbm5lbC4KLQkJICovCi0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JCWJzID0gY2gtPmNoX2JzOwotCi0JCWlmICghYnMpIHsKLQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQlnb3RvIG5leHQ7Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIHJlY2VpdmVkIGRhdGEuCi0JCSAqLwotCQlpZiAocmVhc29uICYgSUZEQVRBKSB7Ci0KLQkJCS8qCi0JCQkgKiBBTEwgTE9DS1MgKk1VU1QqIEJFIERST1BQRUQgQkVGT1JFIENBTExJTkcgSU5QVVQhCi0JCQkgKiBpbnB1dCBjb3VsZCBzZW5kIHNvbWUgZGF0YSB0byBsZCwgd2hpY2ggaW4gdHVybgotCQkJICogY291bGQgZG8gYSBjYWxsYmFjayB0byBvbmUgb2Ygb3VyIG90aGVyIGZ1bmN0aW9ucy4KLQkJCSAqLwotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQkJZGdhcF9pbnB1dChjaCk7Ci0KLQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1JBQ1RJVkUpCi0JCQkJY2gtPmNoX2ZsYWdzIHw9IENIX1JFTkFCTEU7Ci0JCQllbHNlCi0JCQkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7Ci0KLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9SV0FJVCkgewotCQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUldBSVQ7Ci0KLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fZmxhZ3Nfd2FpdCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIE1vZGVtIGNoYW5nZSBzaWduYWxzLgotCQkgKi8KLQkJaWYgKHJlYXNvbiAmIElGTU9ERU0pIHsKLQkJCWNoLT5jaF9taXN0YXQgPSBtb2RlbTsKLQkJCWRnYXBfY2FycmllcihjaCk7Ci0JCX0KLQotCQkvKgotCQkgKiBQcm9jZXNzIGJyZWFrLgotCQkgKi8KLQkJaWYgKHJlYXNvbiAmIElGQlJFQUspIHsKLQotCQkJRFBSX0VWRU5UKCgiZ290IElGQlJFQUtcbiIpKTsKLQotCQkJaWYgKGNoLT5jaF90dW4udW5fdHR5KSB7Ci0JCQkJLyogQSBicmVhayBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KLQkJCQljaC0+Y2hfZXJyX2JyZWFrKys7Ci0JCQkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20oY2gtPmNoX3R1bi51bl90dHktPnBvcnQsIDEpOwotCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKGNoLT5jaF90dW4udW5fdHR5LT5wb3J0LCAwLCBUVFlfQlJFQUspOwotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKGNoLT5jaF90dW4udW5fdHR5LT5wb3J0KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFByb2Nlc3MgVHJhbnNtaXQgbG93LgotCQkgKi8KLQkJaWYgKHJlYXNvbiAmIElGVExXKSB7Ci0KLQkJCURQUl9FVkVOVCgoImV2ZW50OiBnb3QgbG93IGV2ZW50XG4iKSk7Ci0KLQkJCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgVU5fTE9XKSB7Ci0JCQkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+VU5fTE9XOwotCi0JCQkJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHsKLQkJCQkJaWYgKChjaC0+Y2hfdHVuLnVuX3R0eS0+ZmxhZ3MgJgotCQkJCQkgICAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkKLSNlbHNlCi0JCQkJCQljaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApCi0jZW5kaWYKLQkJCQkJewotCQkJCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJKGNoLT5jaF90dW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApKGNoLT5jaF90dW4udW5fdHR5KTsKLSNlbHNlCi0JCQkJCQkoY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfdHVuLnVuX3R0eSk7Ci0jZW5kaWYKLQkJCQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJfQotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fdHR5LT53cml0ZV93YWl0KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOwotCi0JCQkJCURQUl9FVkVOVCgoImV2ZW50OiBHb3QgbG93IGV2ZW50LiBqaWZmaWVzOiAlbHVcbiIsIGppZmZpZXMpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgVU5fTE9XKSB7Ci0JCQkJY2gtPmNoX3B1bi51bl9mbGFncyAmPSB+VU5fTE9XOwotCQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSB7Ci0JCQkJCWlmICgoY2gtPmNoX3B1bi51bl90dHktPmZsYWdzICYKLQkJCQkJICAgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCWNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApCi0jZWxzZQotCQkJCQkJY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKQotI2VuZGlmCi0JCQkJCXsKLQkJCQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCShjaC0+Y2hfcHVuLnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfcHVuLnVuX3R0eSk7Ci0jZWxzZQotCQkJCQkJKGNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy5vcHMtPndyaXRlX3dha2V1cCkoY2gtPmNoX3B1bi51bl90dHkpOwotI2VuZGlmCi0JCQkJCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJCQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCX0KLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX3R0eS0+d3JpdGVfd2FpdCk7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9XTE9XKSB7Ci0JCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9XTE9XOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogUHJvY2VzcyBUcmFuc21pdCBlbXB0eS4KLQkJICovCi0JCWlmIChyZWFzb24gJiBJRlRFTSkgewotCQkJRFBSX0VWRU5UKCgiZXZlbnQ6IGdvdCBlbXB0eSBldmVudFxuIikpOwotCi0JCQlpZiAoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0VNUFRZKSB7Ci0JCQkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+VU5fRU1QVFk7Ci0JCQkJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHsKLQkJCQkJaWYgKChjaC0+Y2hfdHVuLnVuX3R0eS0+ZmxhZ3MgJgotCQkJCQkgICAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKSkgJiYKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLT5vcHMtPndyaXRlX3dha2V1cCkKLSNlbHNlCi0JCQkJCQljaC0+Y2hfdHVuLnVuX3R0eS0+bGRpc2Mub3BzLT53cml0ZV93YWtldXApCi0jZW5kaWYKLQkJCQkJewotCQkJCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMxKQotCQkJCQkJKGNoLT5jaF90dW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApKGNoLT5jaF90dW4udW5fdHR5KTsKLSNlbHNlCi0JCQkJCQkoY2gtPmNoX3R1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfdHVuLnVuX3R0eSk7Ci0jZW5kaWYKLQkJCQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCQkJfQotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF90dW4udW5fdHR5LT53cml0ZV93YWl0KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfdHVuLnVuX2ZsYWdzX3dhaXQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiBVTl9FTVBUWSkgewotCQkJCWNoLT5jaF9wdW4udW5fZmxhZ3MgJj0gflVOX0VNUFRZOwotCQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgVU5fSVNPUEVOKSB7Ci0JCQkJCWlmICgoY2gtPmNoX3B1bi51bl90dHktPmZsYWdzICYKLQkJCQkJICAgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCWNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy0+b3BzLT53cml0ZV93YWtldXApCi0jZWxzZQotCQkJCQkJY2gtPmNoX3B1bi51bl90dHktPmxkaXNjLm9wcy0+d3JpdGVfd2FrZXVwKQotI2VuZGlmCi0JCQkJCXsKLQkJCQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMSkKLQkJCQkJCShjaC0+Y2hfcHVuLnVuX3R0eS0+bGRpc2MtPm9wcy0+d3JpdGVfd2FrZXVwKShjaC0+Y2hfcHVuLnVuX3R0eSk7Ci0jZWxzZQotCQkJCQkJKGNoLT5jaF9wdW4udW5fdHR5LT5sZGlzYy5vcHMtPndyaXRlX3dha2V1cCkoY2gtPmNoX3B1bi51bl90dHkpOwotI2VuZGlmCi0JCQkJCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJCQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCQkJCX0KLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX3R0eS0+d3JpdGVfd2FpdCk7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKLQkJCQl9Ci0JCQl9Ci0KLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX1dFTVBUWSkgewotCQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfV0VNUFRZOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX2ZsYWdzX3dhaXQpOwotCQkJfQotCQl9Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotbmV4dDoKLQkJdGFpbCA9ICh0YWlsICsgNCkgJiAoRVZNQVggLSBFVlNUQVJUIC0gNCk7Ci0JfQotCi0Jd3JpdGV3KHRhaWwsICYoZWFkZHItPmV2X3RhaWwpKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfZmVwNS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9mZXA1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YWJjNDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9mZXA1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqKioJRkVQIFZlcnNpb24gNSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19ER0FQX0ZFUDVfSAotI2RlZmluZSBfX0RHQVBfRkVQNV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgRkVQIG1lbW9yeSBvZmZzZXRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTVEFSVCAgICAgICAgICAgMHgwMDA0TCAgICAgICAgIC8qIEV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzICAgICAgKi8KLQotI2RlZmluZSBDTURCVUYgICAgICAgICAgMHgwZDEwTCAgICAgICAgIC8qIENvbW1hbmQgKGNtX3QpIHN0cnVjdHVyZSBvZmZzZXQgKi8KLSNkZWZpbmUgQ01EU1RBUlQgICAgICAgIDB4MDQwMEwgICAgICAgICAvKiBTdGFydCBvZiBjb21tYW5kIGJ1ZmZlciAgICAgICovICAgCi0jZGVmaW5lIENNRE1BWCAgICAgICAgICAweDA4MDBMICAgICAgICAgLyogRW5kIG9mIGNvbW1hbmQgYnVmZmVyICAgICAgICAqLwotCi0jZGVmaW5lIEVWQlVGICAgICAgICAgICAweDBkMThMICAgICAgICAgLyogRXZlbnQgKGV2X3QpIHN0cnVjdHVyZSAgICAgICAqLwotI2RlZmluZSBFVlNUQVJUICAgICAgICAgMHgwODAwTCAgICAgICAgIC8qIFN0YXJ0IG9mIGV2ZW50IGJ1ZmZlciAgICAgICAgKi8KLSNkZWZpbmUgRVZNQVggICAgICAgICAgIDB4MGMwMEwgICAgICAgICAvKiBFbmQgb2YgZXZlbnQgYnVmZmVyICAgICAgICAgICovCi0jZGVmaW5lIEZFUDVfUExVUyAgICAgICAweDBFNDAgICAgICAgICAgLyogQVNDSUkgJzUnIGFuZCBBU0NJSSAnQScgaXMgaGVyZSAgKi8KLSNkZWZpbmUgRUNTX1NFRyAgICAgICAgIDB4MEU0NCAgICAgICAgICAvKiBTZWdtZW50IG9mIHRoZSBleHRlbmRlZCBjaGFubmVsIHN0cnVjdHVyZSAqLwotI2RlZmluZSBMSU5FX1NQRUVEICAgICAgMHgxMCAgICAgICAgICAgIC8qIE9mZnNldCBpbnRvIEVDU19TRUcgZm9yIGxpbmUgc3BlZWQgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBmZXAgaGFzIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLwotCi0vKiBCSU9TIE1BR0lDIFNQT1RTICovCi0jZGVmaW5lIEVSUk9SICAgICAgICAgICAweDBDMTRMCQkvKiBCSU9TIGVycm9yIGNvZGUgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNFUVVFTkNFCTB4MEMxMkwJCS8qIEJJT1Mgc2VxdWVuY2UgaW5kaWNhdG9yICAgICAgKi8KLSNkZWZpbmUgUE9TVEFSRUEJMHgwQzAwTAkJLyogUE9TVCBjb21wbGV0ZSBtZXNzYWdlIGFyZWEgICAqLwotCi0vKiBGRVAgTUFHSUMgU1BPVFMgKi8KLSNkZWZpbmUgRkVQU1RBVCAgICAgICAgIFBPU1RBUkVBICAgICAgICAvKiBPUyBoZXJlIHdoZW4gRkVQIGNvbWVzIHVwICAgICovCi0jZGVmaW5lIE5DSEFOICAgICAgICAgICAweDBDMDJMICAgICAgICAgLyogbnVtYmVyIG9mIHBvcnRzIEZFUCBzZWVzICAgICAqLwotI2RlZmluZSBQQU5JQyAgICAgICAgICAgMHgwQzEwTCAgICAgICAgIC8qIFBBTklDIGFyZWEgZm9yIEZFUCAgICAgICAgICAgKi8KLSNkZWZpbmUgS01FTUVNICAgICAgICAgIDB4MEMzMEwgICAgICAgICAvKiBNZW1vcnkgZm9yIEtNRSB1c2UgICAgICAgICAgICovICAgCi0jZGVmaW5lIENPTkZJRyAgICAgICAgICAweDBDRDBMICAgICAgICAgLyogQ29uY2VudHJhdG9yIGNvbmZpZ3VyYXRpb24gaW5mbyAqLwotI2RlZmluZSBDT05GSUdTSVpFICAgICAgMHgwMDMwICAgICAgICAgIC8qIGNvbmZpZ3VyYXRpb24gaW5mbyBzaXplICAgICAgKi8KLSNkZWZpbmUgRE9XTlJFUSAgICAgICAgIDB4MEQwMCAgICAgICAgICAvKiBEb3dubG9hZCByZXF1ZXN0IGJ1ZmZlciBwb2ludGVyICovCi0KLSNkZWZpbmUgQ0hBTkJVRiAgICAgICAgIDB4MTAwMEwgICAgICAgICAvKiBBc3luYyBjaGFubmVsIChic190KSBzdHJ1Y3RzICovCi0jZGVmaW5lIEZFUE9TU0laRSAgICAgICAweDFGRkYgICAgICAgICAgLyogOEsgRkVQT1MgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFhFTVBPUlRTICAgIDB4QzAyCS8qCi0JCQkJICogT2Zmc2V0IGluIGJvYXJkIG1lbW9yeSB3aGVyZSBGRVA1IHN0b3JlcwotCQkJCSAqIGhvdyBtYW55IHBvcnRzIGl0IGhhcyBkZXRlY3RlZC4KLQkJCQkgKiBOT1RFOiBGRVA1IHJlcG9ydHMgNjQgcG9ydHMgd2hlbiB0aGUgdXNlcgotCQkJCSAqIGhhcyB0aGUgY2FibGUgaW4gRUJJIE9VVCBpbnN0ZWFkIG9mIEVCSSBJTi4KLQkJCQkgKi8KLQotI2RlZmluZSBGRVBDTFIgICAgICAweDAwCi0jZGVmaW5lIEZFUE1FTSAgICAgIDB4MDIgCi0jZGVmaW5lIEZFUFJTVCAgICAgIDB4MDQgCi0jZGVmaW5lIEZFUElOVCAgICAgIDB4MDgKLSNkZWZpbmUgRkVQTUFTSyAgICAgMHgwZQotI2RlZmluZSBGRVBXSU4gICAgICAweDgwCi0KLSNkZWZpbmUgTE9XTUVNICAgICAgMHgwMTAwCi0jZGVmaW5lIEhJR0hNRU0gICAgIDB4N2YwMAotCi0jZGVmaW5lIEZFUFRJTUVPVVQgMjAwMDAwCi0KLSNkZWZpbmUgRU5BQkxFX0lOVFIJCTB4MGUwNAkJLyogRW5hYmxlIGludGVycnVwdHMgZmxhZyAqLwotI2RlZmluZSBGRVBQT0xMX01JTgkJMQkJLyogbWluaW11bSBvZiAxIG1pbGxpc2Vjb25kICovICAKLSNkZWZpbmUgRkVQUE9MTF9NQVgJCTIwCQkvKiBtYXhpbXVtIG9mIDIwIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBGRVBQT0xMCQkJMHgwYzI2CQkvKiBGZXAgZXZlbnQgcG9sbCBpbnRlcnZhbCAqLyAgIAotCi0jZGVmaW5lCUlBTFRQSU4JCQkweDAwODAJCS8qIElucHV0IGZsYWcgdG8gc3dhcCBEU1IgPC0+IERDRCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogQ29tbWFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgY21fdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21faGVhZDsJLyogQ29tbWFuZCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBjbV90YWlsOwkvKiBDb21tYW5kIGJ1ZmZlciB0YWlsIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGNtX3N0YXJ0OwkvKiBzdGFydCBvZmZzZXQgb2YgYnVmZmVyCSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgY21fbWF4OwkJLyogbGFzdCBvZmZzZXQgb2YgYnVmZmVyCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFdmVudCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgZXZfdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfaGVhZDsJLyogQ29tbWFuZCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBldl90YWlsOwkvKiBDb21tYW5kIGJ1ZmZlciB0YWlsIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGV2X3N0YXJ0OwkvKiBzdGFydCBvZmZzZXQgb2YgYnVmZmVyCSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZXZfbWF4OwkJLyogbGFzdCBvZmZzZXQgb2YgYnVmZmVyCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEb3dubG9hZCBidWZmZXIgc3RydWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkb3dubGRfdCB7Ci0JdWNoYXIJZGxfdHlwZTsJCS8qIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1Y2hhcglkbF9zZXE7CQkJLyogRG93bmxvYWQgc2VxdWVuY2UgICAgICAgICAgICAqLwotCXVzaG9ydAlkbF9zcmV2OwkJLyogU29mdHdhcmUgcmV2aXNpb24gbnVtYmVyICAgICAqLwotCXVzaG9ydAlkbF9scmV2OwkJLyogTG93IHJldmlzaW9uIG51bWJlciAgICAgICAgICAqLwotCXVzaG9ydAlkbF9ocmV2OwkJLyogSGlnaCByZXZpc2lvbiBudW1iZXIgICAgICAgICAqLwotCXVzaG9ydAlkbF9zZWc7CQkJLyogU3RhcnQgc2VnbWVudCBhZGRyZXNzICAgICAgICAqLwotCXVzaG9ydAlkbF9zaXplOwkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGRvd25sb2FkICAqLwotCXVjaGFyCWRsX2RhdGFbMTAyNF07CQkvKiBEb3dubG9hZCBkYXRhICAgICAgICAgICAgICAgICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogUGVyIGNoYW5uZWwgYnVmZmVyIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIEJhc2UgU3RydWN0dXJlIEVudHJpZXMgVXNhZ2UgTWVhbmluZ3MgdG8gSG9zdCAgICAgICAgICAgKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gKiAgICAgICAgVyA9IHJlYWQgd3JpdGUgICAgICAgIFIgPSByZWFkIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICogICAgICAgIEMgPSBjaGFuZ2VkIGJ5IGNvbW1hbmRzIG9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAqICAgICAgICBVID0gdW5rbm93biAobWF5IGJlIGNoYW5nZWQgdy9vIG5vdGljZSkgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgYnNfdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHRwX2ptcDsJLyogVHJhbnNtaXQgcG9sbCBqdW1wCQkgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdGNfam1wOwkvKiBDb29rZWQgcHJvY2VkdXJlIGp1bXAJICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJpX2ptcDsJLyogTm90IGN1cnJlbnRseSB1c2VkCQkgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnBfam1wOwkvKiBSZWNlaXZlIHBvbGwganVtcAkJICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfc2VnOwkvKiBXICBUeCBzZWdtZW50CSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0eF9oZWFkOwkvKiBXICBUeCBidWZmZXIgaGVhZCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfdGFpbDsJLyogUiAgVHggYnVmZmVyIHRhaWwgb2Zmc2V0CSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHR4X21heDsJLyogVyAgVHggYnVmZmVyIHNpemUgLSAxCSAqLwotIAotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9zZWc7CS8qIFcgIFJ4IHNlZ21lbnQJCSovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X2hlYWQ7CS8qIFcgIFJ4IGJ1ZmZlciBoZWFkIG9mZnNldAkqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF90YWlsOwkvKiBSICBSeCBidWZmZXIgdGFpbCBvZmZzZXQJKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgcnhfbWF4OwkvKiBXICBSeCBidWZmZXIgc2l6ZSAtIDEJICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgdHhfbHc7CQkvKiBXICBUeCBidWZmZXIgbG93IHdhdGVyIG1hcmsgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIHJ4X2x3OwkJLyogVyAgUnggYnVmZmVyIGxvdyB3YXRlciBtYXJrICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICByeF9odzsJCS8qIFcgIFJ4IGJ1ZmZlciBoaWdoIHdhdGVyIG1hcmsgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgaW5jcjsJCS8qIFcgIEluY3JlbWVudCB0byBuZXh0IGNoYW5uZWwgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBmZXBkZXY7CS8qIFUgIFNDQyBkZXZpY2UgYmFzZSBhZGRyZXNzICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIGVkZWxheTsJLyogVyAgRXhjZXB0aW9uIGRlbGF5ICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgYmxlbjsJCS8qIFcgIEJyZWFrIGxlbmd0aCAgICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgYnRpbWU7CQkvKiBVICBCcmVhayBjb21wbGV0ZSB0aW1lICAgICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgaWZsYWc7CQkvKiBDICBVTklYIGlucHV0IGZsYWdzICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgIG9mbGFnOwkJLyogQyAgVU5JWCBvdXRwdXQgZmxhZ3MgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICBjZmxhZzsJCS8qIEMgIFVOSVggY29udHJvbCBmbGFncyAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgd2ZpbGxbMTNdOwkvKiBVICBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbnVtOwkJLyogVSAgQ2hhbm5lbCBudW1iZXIgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICByYWN0OwkJLyogVSAgUmVjZWl2ZXIgYWN0aXZlIGNvdW50ZXIgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBic3RhdDsJCS8qIFUgIEJyZWFrIHN0YXR1cyBiaXRzICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgdGJ1c3k7CQkvKiBXICBUcmFuc21pdCBidXN5ICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGllbXB0eTsJLyogVyAgVHJhbnNtaXQgZW1wdHkgZXZlbnQgZW5hYmxlICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGlsb3c7CQkvKiBXICBUcmFuc21pdCBsb3ctd2F0ZXIgZXZlbnQgZW5hYmxlICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGlkYXRhOwkJLyogVyAgUmVjZWl2ZSBkYXRhIGludGVycnVwdCBlbmFibGUgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgZWZsYWc7CQkvKiBVICBIb3N0IGV2ZW50IGZsYWdzICAgICAgICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgdGZsYWc7CQkvKiBVICBUcmFuc21pdCBmbGFncyAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHJmbGFnOwkJLyogVSAgUmVjZWl2ZSBmbGFncyAgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB4bWFzazsJCS8qIFUgIFRyYW5zbWl0IHJlYWR5IGZsYWdzICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgeHZhbDsJCS8qIFUgIFRyYW5zbWl0IHJlYWR5IHZhbHVlICAgICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgbV9zdGF0OwkvKiBSQyBNb2RlbSBzdGF0dXMgYml0cyAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2NoYW5nZTsJLyogVSAgTW9kZW0gYml0cyB3aGljaCBjaGFuZ2VkICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2ludDsJCS8qIFcgIE1vZGVtIGludGVycnVwdCBlbmFibGUgYml0cyAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtX2xhc3Q7CS8qIFUgIExhc3QgbW9kZW0gc3RhdHVzICAgICAgICAgKi8KLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtdHJhbjsJCS8qIEMgICBVbnJlcG9ydGVkIG1vZGVtIHRyYW5zICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgb3J1bjsJCS8qIEMgICBCdWZmZXIgb3ZlcnJ1biBvY2N1cnJlZCAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYXN0YXJ0YzsJLyogVyAgIEF1eGlsaWFyeSBYb24gY2hhciAgICAgICAqLyAgCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFzdG9wYzsJLyogVyAgIEF1eGlsaWFyeSBYb2ZmIGNoYXIgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBzdGFydGM7CS8qIFcgICBYb24gY2hhcmFjdGVyICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHN0b3BjOwkJLyogVyAgIFhvZmYgY2hhcmFjdGVyICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICB2bmV4dGM7CS8qIFcgICBWbmV4dCBjaGFyYWN0ZXIgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGhmbG93OwkJLyogQyAgIFNvZnR3YXJlIGZsb3cgY29udHJvbCAgICAqLwotCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGZpbGxjOwkJLyogVSAgIERlbGF5IEZpbGwgY2hhcmFjdGVyICAgICAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBvY2hhcjsJCS8qIFUgICBTYXZlZCBvdXRwdXQgY2hhcmFjdGVyICAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgb21hc2s7CQkvKiBVICAgT3V0cHV0IGNoYXJhY3RlciBtYXNrICAgICovCi0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgYmZpbGxbMTNdOwkvKiBVICAgUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiAgICovICAKLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBzY2NbMTZdOwkvKiBVICAgU0NDIHJlZ2lzdGVycyAgICAgICAgICAgICovCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAKLSAqIEZFUCBzdXBwb3J0ZWQgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTUkxPVwkJMHhlMAkJLyogU2V0IHJlY2VpdmUgbG93IHdhdGVyCSovCi0jZGVmaW5lIFNSSElHSAkJMHhlMQkJLyogU2V0IHJlY2VpdmUgaGlnaCB3YXRlcgkqLwotI2RlZmluZSBGTFVTSFRYCQkweGUyCQkvKiBGbHVzaCB0cmFuc21pdCBidWZmZXIJKi8KLSNkZWZpbmUgUEFVU0VUWAkJMHhlMwkJLyogUGF1c2UgZGF0YSB0cmFuc21pc3Npb24JKi8KLSNkZWZpbmUgUkVTVU1FVFgJMHhlNAkJLyogUmVzdW1lIGRhdGEgdHJhbnNtaXNzaW9uCSovCi0jZGVmaW5lIFNNSU5UCQkweGU1CQkvKiBTZXQgTW9kZW0gSW50ZXJydXB0CQkqLwotI2RlZmluZSBTQUZMT1dDCQkweGU2CQkvKiBTZXQgQXV4LiBmbG93IGNvbnRyb2wgY2hhcnMJKi8KLSNkZWZpbmUgU0JSRUFLCQkweGU4CQkvKiBTZW5kIGJyZWFrCQkJKi8KLSNkZWZpbmUgU01PREVNCQkweGU5CQkvKiBTZXQgODUzMCBtb2RlbSBjb250cm9sIGxpbmVzCSovICAKLSNkZWZpbmUgU0lGTEFHCQkweGVhCQkvKiBTZXQgVU5JWCBpZmxhZ3MJCSovCi0jZGVmaW5lIFNGTE9XQwkJMHhlYgkJLyogU2V0IGZsb3cgY29udHJvbCBjaGFyYWN0ZXJzCSovCi0jZGVmaW5lIFNUTE9XCQkweGVjCQkvKiBTZXQgdHJhbnNtaXQgbG93IHdhdGVyIG1hcmsJKi8KLSNkZWZpbmUgUlBBVVNFCQkweGVlCQkvKiBQYXVzZSByZWNlaXZlCQkqLwotI2RlZmluZSBSUkVTVU1FCQkweGVmCQkvKiBSZXN1bWUgcmVjZWl2ZQkJKi8gIAotI2RlZmluZSBDSFJFU0VUCQkweGYwCQkvKiBSZXNldCBDaGFubmVsCQkqLwotI2RlZmluZSBCVUZTRVRBTEwJMHhmMgkJLyogU2V0IFR4ICYgUnggYnVmZmVyIHNpemUgYXZhaWwqLwotI2RlZmluZSBTT0ZMQUcJCTB4ZjMJCS8qIFNldCBVTklYIG9mbGFncwkJKi8KLSNkZWZpbmUgU0hGTE9XCQkweGY0CQkvKiBTZXQgaGFyZHdhcmUgaGFuZHNoYWtlCSovCi0jZGVmaW5lIFNDRkxBRwkJMHhmNQkJLyogU2V0IFVOSVggY2ZsYWdzCQkqLwotI2RlZmluZSBTVk5FWFQJCTB4ZjYJCS8qIFNldCBWTkVYVCBjaGFyYWN0ZXIJCSovCi0jZGVmaW5lIFNQSU5URkMJCTB4ZmMJCS8qIFJlc2VydmVkCQkJKi8KLSNkZWZpbmUgU0NPTU1PREUJMHhmZAkJLyogU2V0IFJTMjMyLzQyMiBtb2RlCQkqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKglNb2RlcyBmb3IgU0NPTU1PREUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1PREVfMjMyCTB4MDAKLSNkZWZpbmUgTU9ERV80MjIJMHgwMQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAgICAgIEV2ZW50IGZsYWdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgSUZCUkVBSyAgICAgICAgIDB4MDEgICAgICAgICAgICAvKiBCcmVhayByZWNlaXZlZCAgICAgICAgICAgICAgICovICAKLSNkZWZpbmUgSUZUTFcgICAgICAgICAgIDB4MDIgICAgICAgICAgICAvKiBUcmFuc21pdCBsb3cgd2F0ZXIgICAgICAgICAgICovCi0jZGVmaW5lIElGVEVNICAgICAgICAgICAweDA0ICAgICAgICAgICAgLyogVHJhbnNtaXR0ZXIgZW1wdHkgICAgICAgICAgICAqLwotI2RlZmluZSBJRkRBVEEgICAgICAgICAgMHgwOCAgICAgICAgICAgIC8qIFJlY2VpdmUgZGF0YSBwcmVzZW50ICAgICAgICAgKi8KLSNkZWZpbmUgSUZNT0RFTSAgICAgICAgIDB4MjAgICAgICAgICAgICAvKiBNb2RlbSBzdGF0dXMgY2hhbmdlICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAKLSAqICAgICAgTW9kZW0gZmxhZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jICAgICAgIGRlZmluZSAgRE1fUlRTICAgICAgICAgIDB4MDIgICAgLyogUmVxdWVzdCB0byBzZW5kICAgICAgICAgICAgICAqLwotIyAgICAgICBkZWZpbmUgIERNX0NEICAgICAgICAgICAweDgwICAgIC8qIENhcnJpZXIgZGV0ZWN0ICAgICAgICAgICAgICAgKi8KLSMgICAgICAgZGVmaW5lICBETV9EU1IgICAgICAgICAgMHgyMCAgICAvKiBEYXRhIHNldCByZWFkeSAgICAgICAgICAgICAgICovCi0jICAgICAgIGRlZmluZSAgRE1fQ1RTICAgICAgICAgIDB4MTAgICAgLyogQ2xlYXIgdG8gc2VuZCAgICAgICAgICAgICAgICAqLwotIyAgICAgICBkZWZpbmUgIERNX1JJICAgICAgICAgICAweDQwICAgIC8qIFJpbmcgaW5kaWNhdG9yICAgICAgICAgICAgICAgKi8KLSMgICAgICAgZGVmaW5lICBETV9EVFIgICAgICAgICAgMHgwMSAgICAvKiBEYXRhIHRlcm1pbmFsIHJlYWR5ICAgICAgICAgICovCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX2tjb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfa2NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMyNDA0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfa2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0IERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICogICAgICBTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBjb250YWluIGFsbCB0aGUga2VybmVsICJkaWZmZXJlbmNlcyIgYmV0d2VlbiB0aGUKLSAqIHZhcmlvdXMga2VybmVscyB0aGF0IHdlIHN1cHBvcnQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19ER0FQX0tDT01QQVRfSAotI2RlZmluZSBfX0RHQVBfS0NPTVBBVF9ICi0KLSNpZiAhZGVmaW5lZChUVFlfRkxJUEJVRl9TSVpFKQotIyBkZWZpbmUgVFRZX0ZMSVBCVUZfU0laRSA1MTIKLSNlbmRpZgotCi0KLS8qIFNwYXJzZSBzdHVmZiAqLwotIyBpZm5kZWYgX191c2VyCi0jICBkZWZpbmUgX191c2VyCi0jICBkZWZpbmUgX19rZXJuZWwKLSMgIGRlZmluZSBfX3NhZmUKLSMgIGRlZmluZSBfX2ZvcmNlCi0jICBkZWZpbmUgX19jaGtfdXNlcl9wdHIoeCkgKHZvaWQpMAotIyBlbmRpZgotCi0KLSMgIGRlZmluZSBQQVJNX1NUUihWQVIsIElOSVQsIFBFUk0sIERFU0MpIFwKLQkJc3RhdGljIGNoYXIgKlZBUiA9IElOSVQ7IFwKLQkJY2hhciAqZGdhcF8jI1ZBUjsgXAotCQltb2R1bGVfcGFyYW0oVkFSLCBjaGFycCwgUEVSTSk7IFwKLQkJTU9EVUxFX1BBUk1fREVTQyhWQVIsIERFU0MpOwotCi0jICBkZWZpbmUgUEFSTV9JTlQoVkFSLCBJTklULCBQRVJNLCBERVNDKSBcCi0JCXN0YXRpYyBpbnQgVkFSID0gSU5JVDsgXAotCQlpbnQgZGdhcF8jI1ZBUjsgXAotCQltb2R1bGVfcGFyYW0oVkFSLCBpbnQsIFBFUk0pOyBcCi0JCU1PRFVMRV9QQVJNX0RFU0MoVkFSLCBERVNDKTsKLQotIyAgZGVmaW5lIFBBUk1fVUxPTkcoVkFSLCBJTklULCBQRVJNLCBERVNDKSBcCi0JCXN0YXRpYyB1bG9uZyBWQVIgPSBJTklUOyBcCi0JCXVsb25nIGRnYXBfIyNWQVI7IFwKLQkJbW9kdWxlX3BhcmFtKFZBUiwgbG9uZywgUEVSTSk7IFwKLQkJTU9EVUxFX1BBUk1fREVTQyhWQVIsIERFU0MpOwotCi0jZW5kaWYgLyogISBfX0RHQVBfS0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BhcnNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZmQ5M2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhIAotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLiAKLSAqCVRoYW5rIHlvdS4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZGdhcF9wYXJzZS5jIC0gUGFyc2VzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGlucHV0IGZpbGUuCi0gKgotICogJElkOiBkZ2FwX3BhcnNlLmMsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJAotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSAiZGdhcF90eXBlcy5oIgotI2luY2x1ZGUgImRnYXBfZmVwNS5oIgotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF9wYXJzZS5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotCi0KLS8qCi0gKiBGdW5jdGlvbiBwcm90b3R5cGVzLgotICovCi1zdGF0aWMgaW50IGRnYXBfZ2V0dG9rKGNoYXIgKippbiwgc3RydWN0IGNub2RlICpwKTsKLXN0YXRpYyBjaGFyICpkZ2FwX2dldHdvcmQoY2hhciAqKmluKTsKLXN0YXRpYyBjaGFyICpkZ2FwX3NhdmVzdHJpbmcoY2hhciAqcyk7Ci1zdGF0aWMgc3RydWN0IGNub2RlICpkZ2FwX25ld25vZGUoaW50IHQpOwotc3RhdGljIGludCBkZ2FwX2NoZWNrbm9kZShzdHJ1Y3QgY25vZGUgKnApOwotc3RhdGljIHZvaWQgZGdhcF9lcnIoY2hhciAqcyk7Ci0KLS8qCi0gKiBPdXIgbmVlZGVkIGludGVybmFsIHN0YXRpYyB2YXJpYWJsZXMuLi4KLSAqLwotc3RhdGljIHN0cnVjdCBjbm9kZSBkZ2FwX2hlYWQ7Ci0jZGVmaW5lIE1BWENXT1JEIDIwMAotc3RhdGljIGNoYXIgZGdhcF9jd29yZFtNQVhDV09SRF07Ci0KLXN0cnVjdCB0b2tsaXN0IHsKLQlpbnQJdG9rZW47Ci0JY2hhcgkqc3RyaW5nOwotfTsKLQotc3RhdGljIHN0cnVjdCB0b2tsaXN0IGRnYXBfdGxpc3RbXSA9IHsKLQl7CUJFR0lOLAkJImNvbmZpZ19iZWdpbiIJCQl9LAotCXsJRU5ELAkJImNvbmZpZ19lbmQiCQkJfSwKLQl7CUJPQVJELAkJImJvYXJkIgkJCQl9LAotCXsJUENYLAkJIkRpZ2lfQWNjZWxlUG9ydF9DL1hfUENJIgl9LAkvKiBDL1hfUENJICovCi0JewlQRVBDLAkJIkRpZ2lfQWNjZWxlUG9ydF9FUEMvWF9QQ0kiCX0sCS8qIEVQQy9YX1BDSSAqLwotCXsJUFBDTSwJCSJEaWdpX0FjY2VsZVBvcnRfWGVtX1BDSSIJfSwJLyogUENJL1hlbSAqLwotCXsJQVBPUlQyXzkyMFAsCSJEaWdpX0FjY2VsZVBvcnRfMnJfOTIwX1BDSSIJfSwKLQl7CUFQT1JUNF85MjBQLAkiRGlnaV9BY2NlbGVQb3J0XzRyXzkyMF9QQ0kiCX0sCi0JewlBUE9SVDhfOTIwUCwJIkRpZ2lfQWNjZWxlUG9ydF84cl85MjBfUENJIgl9LAotCXsJUEFQT1JUNCwJIkRpZ2lfQWNjZWxlUG9ydF80cl9QQ0koRUlBLTIzMi9SUy00MjIpIiB9LAotCXsJUEFQT1JUOCwJIkRpZ2lfQWNjZWxlUG9ydF84cl9QQ0koRUlBLTIzMi9SUy00MjIpIiB9LAotCXsJSU8sCQkiaW8iCQkJCX0sCi0JewlQQ0lJTkZPLAkicGNpaW5mbyIJCQl9LAotCXsJTElORSwJCSJsaW5lIgkJCQl9LAotCXsJQ09OQywJCSJjb25jIgkJCQl9LAotCXsJQ09OQywJCSJjb25jZW50cmF0b3IiCQkJfSwKLQl7CUNYLAkJImN4IgkJCQl9LAotCXsJQ1gsCQkiY2NvbiIJCQkJfSwKLQl7CUVQQywJCSJlcGNjb24iCQkJfSwKLQl7CUVQQywJCSJlcGMiCQkJCX0sCi0JewlNT0QsCQkibW9kdWxlIgkJCX0sCi0JewlJRCwJCSJpZCIJCQkJfSwKLQl7CVNUQVJUTywJCSJzdGFydCIJCQkJfSwKLQl7CVNQRUVELAkJInNwZWVkIgkJCQl9LAotCXsJQ0FCTEUsCQkiY2FibGUiCQkJCX0sCi0JewlDT05ORUNULAkiY29ubmVjdCIJCQl9LAotCXsJTUVUSE9ELAkJIm1ldGhvZCIJCQl9LAotCXsJU1RBVFVTLAkJInN0YXR1cyIJCQl9LAotCXsJQ1VTVE9NLAkJIkN1c3RvbSIJCQl9LAotCXsJQkFTSUMsCQkiQmFzaWMiCQkJCX0sCi0JewlNRU0sCQkibWVtIgkJCQl9LAotCXsJTUVNLAkJIm1lbW9yeSIJCQl9LAotCXsJUE9SVFMsCQkicG9ydHMiCQkJCX0sCi0JewlNT0RFTSwJCSJtb2RlbSIJCQkJfSwKLQl7CU5QT1JUUywJCSJucG9ydHMiCQkJfSwKLQl7CVRUWU4sCQkidHR5bmFtZSIJCQl9LAotCXsJQ1UsCQkiY3VuYW1lIgkJCX0sCi0JewlQUklOVCwJCSJwcm5hbWUiCQkJfSwKLQl7CUNNQUpPUiwJCSJtYWpvciIJCQkJfSwKLQl7CUFMVFBJTiwJCSJhbHRwaW4iCQkJfSwKLQl7CVVTRUlOVFIsCSJ1c2VpbnRyIgkJCX0sCi0JewlUVFNJWiwJCSJ0dHlzaXplIgkJCX0sCi0JewlDSFNJWiwJCSJjaHNpemUiCQkJfSwKLQl7CUJTU0laLAkJImJvYXJkc2l6ZSIJCQl9LAotCXsJVU5UU0laLAkJInNjaGVkc2l6ZSIJCQl9LAotCXsJRjJTSVosCQkiZjIyMDBzaXplIgkJCX0sCi0JewlWUFNJWiwJCSJ2cGl4c2l6ZSIJCQl9LAotCXsJMCwJCU5VTEwJCQkJfQotfTsKLQotCi0vKgotICogUGFyc2UgYSBjb25maWd1cmF0aW9uIGZpbGUgcmVhZCBpbnRvIG1lbW9yeSBhcyBhIHN0cmluZy4KLSAqLwotaW50CWRnYXBfcGFyc2VmaWxlKGNoYXIgKippbiwgaW50IFJlbW92ZSkKLXsKLQlzdHJ1Y3QgY25vZGUgKnAsICpicmQsICpsaW5lLCAqY29uYzsKLQlpbnQJcmM7Ci0JY2hhcgkqcyA9IE5VTEwsICpzMiA9IE5VTEw7Ci0JaW50CWxpbmVjbnQgPSAwOwotCi0JcCA9ICZkZ2FwX2hlYWQ7Ci0JYnJkID0gbGluZSA9IGNvbmMgPSBOVUxMOwotCi0JLyogcGVyaGFwcyB3ZSBhcmUgYWRkaW5nIHRvIGFuIGV4aXN0aW5nIGxpc3Q/ICovCi0Jd2hpbGUgKHAtPm5leHQgIT0gTlVMTCkgewotCQlwID0gcC0+bmV4dDsKLQl9Ci0KLQkvKiBmaWxlIG11c3Qgc3RhcnQgd2l0aCBhIEJFR0lOICovCi0Jd2hpbGUgKCAocmMgPSBkZ2FwX2dldHRvayhpbixwKSkgIT0gQkVHSU4gKSB7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlkZ2FwX2VycigidW5leHBlY3RlZCBFT0YiKTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0KLQlmb3IgKDsgOyApIHsKLQkJcmMgPSBkZ2FwX2dldHRvayhpbixwKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIEVPRiIpOwotCQkJcmV0dXJuKC0xKTsKLQkJfQotCi0JCXN3aXRjaCAocmMpIHsKLQkJY2FzZSAwOgotCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCXJldHVybigtMSk7Ci0KLQkJY2FzZSBCRUdJTjoJLyogc2hvdWxkIG9ubHkgYmUgMSBiZWdpbiAqLwotCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgY29uZmlnX2JlZ2luXG4iKTsKLQkJCXJldHVybigtMSk7Ci0KLQkJY2FzZSBFTkQ6Ci0JCQlyZXR1cm4oMCk7Ci0KLQkJY2FzZSBCT0FSRDoJLyogYm9hcmQgaW5mbyAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEJOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQotCQkJcC0+dS5ib2FyZC5zdGF0dXMgPSBkZ2FwX3NhdmVzdHJpbmcoIk5vIik7Ci0JCQlsaW5lID0gY29uYyA9IE5VTEw7Ci0JCQlicmQgPSBwOwotCQkJbGluZWNudCA9IC0xOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBUE9SVDJfOTIwUDoJLyogQWNjZWxlUG9ydF80ICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfMnJfOTIwIHN0cmluZyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnR5cGUgPSBBUE9SVDJfOTIwUDsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIERpZ2lfMnJfOTIwIFBDSSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVBPUlQ0XzkyMFA6CS8qIEFjY2VsZVBvcnRfNCAqLwotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBEaWdpXzRyXzkyMCBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gQVBPUlQ0XzkyMFA7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBEaWdpXzRyXzkyMCBQQ0kgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFQT1JUOF85MjBQOgkvKiBBY2NlbGVQb3J0XzggKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgRGlnaV84cl85MjAgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IEFQT1JUOF85MjBQOwotCQkJcC0+dS5ib2FyZC52X3R5cGUgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgRGlnaV84cl85MjAgUENJIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQVBPUlQ0OgkvKiBBY2NlbGVQb3J0XzQgUENJICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfNHIoUENJKSBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gUEFQT1JUNDsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIERpZ2lfNHIgUENJIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQQVBPUlQ4OgkvKiBBY2NlbGVQb3J0XzggUENJICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfOHIgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IFBBUE9SVDg7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBEaWdpXzhyIFBDSSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUENYOgkvKiBQQ0kgQy9YICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIERpZ2lfQy9YXyhQQ0kpIHN0cmluZyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnR5cGUgPSBQQ1g7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlwLT51LmJvYXJkLmNvbmMxID0gMDsKLQkJCXAtPnUuYm9hcmQuY29uYzIgPSAwOwotCQkJcC0+dS5ib2FyZC5tb2R1bGUxID0gMDsKLQkJCXAtPnUuYm9hcmQubW9kdWxlMiA9IDA7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQQ0kgQy9YIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQRVBDOgkvKiBQQ0kgRVBDL1ggKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgXCJEaWdpX0VQQy9YXyhQQ0kpXCIgc3RyaW5nIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudHlwZSA9IFBFUEM7Ci0JCQlwLT51LmJvYXJkLnZfdHlwZSA9IDE7Ci0JCQlwLT51LmJvYXJkLmNvbmMxID0gMDsKLQkJCXAtPnUuYm9hcmQuY29uYzIgPSAwOwotCQkJcC0+dS5ib2FyZC5tb2R1bGUxID0gMDsKLQkJCXAtPnUuYm9hcmQubW9kdWxlMiA9IDA7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQQ0kgRVBDL1ggdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBQQ006CS8qIFBDSS9YZW0gKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgUENJL1hlbSBzdHJpbmciKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC50eXBlID0gUFBDTTsKLQkJCXAtPnUuYm9hcmQudl90eXBlID0gMTsKLQkJCXAtPnUuYm9hcmQuY29uYzEgPSAwOwotCQkJcC0+dS5ib2FyZC5jb25jMiA9IDA7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQQ0kgWEVNIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJTzoJLyogaS9vIHBvcnQgKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoIklPIHBvcnQgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQucG9ydHN0ciA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCXAtPnUuYm9hcmQucG9ydCA9IChzaG9ydClzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKHNob3J0KXN0cmxlbihzKSA+IChzaG9ydCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBJTyBwb3J0Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQudl9wb3J0ID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIElPICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1FTToJLyogbWVtb3J5IGFkZHJlc3MgKi8KLQkJCWlmIChwLT50eXBlICE9IEJOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoIm1lbW9yeSBhZGRyZXNzIG9ubHkgdmFpbGQgZm9yIGJvYXJkcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLmFkZHJzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlwLT51LmJvYXJkLmFkZHIgPSBzaW1wbGVfc3RydG91bChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBtZW1vcnkgYWRkcmVzcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnZfYWRkciA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBNRU0gKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUENJSU5GTzoJLyogcGNpIGluZm9ybWF0aW9uICovCi0JCQlpZiAocC0+dHlwZSAhPSBCTk9ERSkgewotCQkJCWRnYXBfZXJyKCJtZW1vcnkgYWRkcmVzcyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC5wY2lidXNzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlwLT51LmJvYXJkLnBjaWJ1cyA9IHNpbXBsZV9zdHJ0b3VsKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHBjaSBidXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC52X3BjaWJ1cyA9IDE7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnBjaXNsb3RzdHIgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlwLT51LmJvYXJkLnBjaXNsb3QgPSBzaW1wbGVfc3RydG91bChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBwY2kgc2xvdCIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmJvYXJkLnZfcGNpc2xvdCA9IDE7Ci0KLQkJCURQUl9JTklUKCgiQWRkaW5nIFBDSUlORk8gKCVzICVzKSB0byBjb25maWcuLi5cbiIsIHAtPnUuYm9hcmQucGNpYnVzc3RyLCAKLQkJCQlwLT51LmJvYXJkLnBjaXNsb3RzdHIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUVUSE9EOgotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigiaW5zdGFsbCBtZXRob2Qgb25seSB2YWlsZCBmb3IgYm9hcmRzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYm9hcmQubWV0aG9kID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJcC0+dS5ib2FyZC52X21ldGhvZCA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBNRVRIT0QgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1RBVFVTOgotCQkJaWYgKHAtPnR5cGUgIT0gQk5PREUpIHsKLQkJCQlkZ2FwX2VycigiY29uZmlnIHN0YXR1cyBvbmx5IHZhaWxkIGZvciBib2FyZHMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ib2FyZC5zdGF0dXMgPSBkZ2FwX3NhdmVzdHJpbmcocyk7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBTVEFUVVMgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTlBPUlRTOgkvKiBudW1iZXIgb2YgcG9ydHMgKi8KLQkJCWlmIChwLT50eXBlID09IEJOT0RFKSB7Ci0JCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmJvYXJkLm5wb3J0ID0gKGNoYXIpc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG51bWJlciBvZiBwb3J0cyIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmJvYXJkLnZfbnBvcnQgPSAxOwotCQkJfSBlbHNlIGlmIChwLT50eXBlID09IENOT0RFKSB7Ci0JCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmNvbmMubnBvcnQgPSAoY2hhcilzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbnVtYmVyIG9mIHBvcnRzIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy52X25wb3J0ID0gMTsKLQkJCX0gZWxzZSBpZiAocC0+dHlwZSA9PSBNTk9ERSkgewotCQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5tb2R1bGUubnBvcnQgPSAoY2hhcilzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbnVtYmVyIG9mIHBvcnRzIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUubW9kdWxlLnZfbnBvcnQgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlkZ2FwX2VycigibnBvcnRzIG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBOUE9SVFMgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSUQ6CS8qIGxldHRlciBJRCB1c2VkIGluIHR0eSBuYW1lICovCi0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0KLQkJCXAtPnUuYm9hcmQuc3RhdHVzID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCi0JCQlpZiAocC0+dHlwZSA9PSBDTk9ERSkgewotCQkJCXAtPnUuY29uYy5pZCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCQlwLT51LmNvbmMudl9pZCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gTU5PREUpIHsKLQkJCQlwLT51Lm1vZHVsZS5pZCA9IGRnYXBfc2F2ZXN0cmluZyhzKTsKLQkJCQlwLT51Lm1vZHVsZS52X2lkID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGdhcF9lcnIoImlkIG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMgb3IgbW9kdWxlcyIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBJRCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVEFSVE86CS8qIHN0YXJ0IG9mZnNldCBvZiBJRCAqLwotCQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuYm9hcmQuc3RhcnQgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3Igc3RhcnQgb2YgdHR5IGNvdW50Iik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuYm9hcmQudl9zdGFydCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy5zdGFydCA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzdGFydCBvZiB0dHkgY291bnQiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5jb25jLnZfc3RhcnQgPSAxOwotCQkJfSBlbHNlIGlmIChwLT50eXBlID09IE1OT0RFKSB7Ci0JCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51Lm1vZHVsZS5zdGFydCA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzdGFydCBvZiB0dHkgY291bnQiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5tb2R1bGUudl9zdGFydCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWRnYXBfZXJyKCJzdGFydCBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIG9yIG1vZHVsZXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgU1RBUlQgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVFRZTjoJLyogdHR5IG5hbWUgcHJlZml4ICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVE5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJaWYgKCAocyA9IGRnYXBfZ2V0d29yZChpbikpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlpZiAoIChwLT51LnR0eW5hbWUgPSBkZ2FwX3NhdmVzdHJpbmcocykpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgVFRZICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENVOgkvKiBjdSBuYW1lIHByZWZpeCAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKENVTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlpZiAoIChzID0gZGdhcF9nZXR3b3JkKGluKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY2VkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWlmICggKHAtPnUuY3VuYW1lID0gZGdhcF9zYXZlc3RyaW5nKHMpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENVICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIExJTkU6CS8qIGxpbmUgaW5mb3JtYXRpb24gKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKGJyZCA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBib2FyZCBiZWZvcmUgbGluZSBpbmZvIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXN3aXRjaCAoYnJkLT51LmJvYXJkLnR5cGUpIHsKLQkJCWNhc2UgUFBDTToKLQkJCQlkZ2FwX2VycigibGluZSBub3QgdmFpbGQgZm9yIFBDL2VtIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoTE5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJY29uYyA9IE5VTEw7Ci0JCQlsaW5lID0gcDsKLQkJCWxpbmVjbnQrKzsKLQkJCURQUl9JTklUKCgiQWRkaW5nIExJTkUgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENPTkM6CS8qIGNvbmNlbnRyYXRvciBpbmZvcm1hdGlvbiAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoIm11c3Qgc3BlY2lmeSBsaW5lIGluZm8gYmVmb3JlIGNvbmNlbnRyYXRvciIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKENOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCWNvbmMgPSBwOwotCQkJaWYgKGxpbmVjbnQpCi0JCQkJYnJkLT51LmJvYXJkLmNvbmMyKys7Ci0JCQllbHNlCi0JCQkJYnJkLT51LmJvYXJkLmNvbmMxKys7Ci0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENPTkMgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENYOgkvKiBjL3ggdHlwZSBjb25jZW50cmF0b3IgKi8KLQkJCWlmIChwLT50eXBlICE9IENOT0RFKSB7Ci0JCQkJZGdhcF9lcnIoImN4IG9ubHkgdmFsaWQgZm9yIGNvbmNlbnRyYXRvcnMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5jb25jLnR5cGUgPSBDWDsKLQkJCXAtPnUuY29uYy52X3R5cGUgPSAxOwotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ1ggdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEVQQzoJLyogZXBjIHR5cGUgY29uY2VudHJhdG9yICovCi0JCQlpZiAocC0+dHlwZSAhPSBDTk9ERSkgewotCQkJCWRnYXBfZXJyKCJjeCBvbmx5IHZhbGlkIGZvciBjb25jZW50cmF0b3JzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuY29uYy50eXBlID0gRVBDOwotCQkJcC0+dS5jb25jLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBFUEMgdG8gY29uZmlnLi4uXG4iKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1PRDoJLyogRUJJIG1vZHVsZSAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoYnJkID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGJvYXJkIGluZm8gYmVmb3JlIEVCSSBtb2R1bGVzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXN3aXRjaCAoYnJkLT51LmJvYXJkLnR5cGUpIHsKLQkJCWNhc2UgUFBDTToKLQkJCQlsaW5lY250ID0gMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGNvbmMgPT0gTlVMTCkgewotCQkJCQlkZ2FwX2VycigibXVzdCBzcGVjaWZ5IGNvbmNlbnRyYXRvciBpbmZvIGJlZm9yZSBFQkkgbW9kdWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShNTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlpZiAobGluZWNudCkKLQkJCQlicmQtPnUuYm9hcmQubW9kdWxlMisrOwotCQkJZWxzZQotCQkJCWJyZC0+dS5ib2FyZC5tb2R1bGUxKys7Ci0KLQkJCURQUl9JTklUKCgiQWRkaW5nIE1PRCB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9SVFM6CS8qIHBvcnRzIHR5cGUgRUJJIG1vZHVsZSAqLwotCQkJaWYgKHAtPnR5cGUgIT0gTU5PREUpIHsKLQkJCQlkZ2FwX2VycigicG9ydHMgb25seSB2YWxpZCBmb3IgRUJJIG1vZHVsZXMiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5tb2R1bGUudHlwZSA9IFBPUlRTOwotCQkJcC0+dS5tb2R1bGUudl90eXBlID0gMTsKLQkJCURQUl9JTklUKCgiQWRkaW5nIFBPUlRTIHRvIGNvbmZpZy4uLlxuIikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNT0RFTToJLyogcG9ydHMgdHlwZSBFQkkgbW9kdWxlICovCi0JCQlpZiAocC0+dHlwZSAhPSBNTk9ERSkgewotCQkJCWRnYXBfZXJyKCJtb2RlbSBvbmx5IHZhbGlkIGZvciBtb2RlbSBtb2R1bGVzIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUubW9kdWxlLnR5cGUgPSBNT0RFTTsKLQkJCXAtPnUubW9kdWxlLnZfdHlwZSA9IDE7Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBNT0RFTSB0byBjb25maWcuLi5cbiIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FCTEU6Ci0JCQlpZiAocC0+dHlwZSA9PSBMTk9ERSkgewotCQkJCWlmICgocyA9IGRnYXBfZ2V0d29yZChpbikpID09IE5VTEwpIHsKLQkJCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQkJcmV0dXJuKC0xKTsKLQkJCQl9Ci0JCQkJcC0+dS5saW5lLmNhYmxlID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJCXAtPnUubGluZS52X2NhYmxlID0gMTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENBQkxFICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUVEOgkvKiBzeW5jIGxpbmUgc3BlZWQgaW5kaWNhdGlvbiAqLwotCQkJaWYgKHAtPnR5cGUgPT0gTE5PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUubGluZS5zcGVlZCA9IChjaGFyKXNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKHNob3J0KXN0cmxlbihzKSA+IChzaG9ydCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmxpbmUudl9zcGVlZCA9IDE7Ci0JCQl9IGVsc2UgaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKLQkJCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy5zcGVlZCA9IChjaGFyKXNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCQlpZiAoKHNob3J0KXN0cmxlbihzKSA+IChzaG9ydCkoczIgLSBzKSkgewotCQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgbGluZSBzcGVlZCIpOwotCQkJCQlyZXR1cm4oLTEpOwotCQkJCX0KLQkJCQlwLT51LmNvbmMudl9zcGVlZCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWRnYXBfZXJyKCJzcGVlZCB2YWxpZCBvbmx5IGZvciBsaW5lcyBvciBjb25jZW50cmF0b3JzLiIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBTUEVFRCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDT05ORUNUOgotCQkJaWYgKHAtPnR5cGUgPT0gQ05PREUpIHsKLQkJCQlpZiAoKHMgPSBkZ2FwX2dldHdvcmQoaW4pKSA9PSBOVUxMKSB7Ci0JCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJCXJldHVybigtMSk7Ci0JCQkJfQotCQkJCXAtPnUuY29uYy5jb25uZWN0ID0gZGdhcF9zYXZlc3RyaW5nKHMpOwotCQkJCXAtPnUuY29uYy52X2Nvbm5lY3QgPSAxOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQ09OTkVDVCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFJJTlQ6CS8qIHRyYW5zcGFyZW50IHByaW50IG5hbWUgcHJlZml4ICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoUE5PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJaWYgKCAocyA9IGRnYXBfZ2V0d29yZChpbikpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWNlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlpZiAoIChwLT51LnByaW50bmFtZSA9IGRnYXBfc2F2ZXN0cmluZyhzKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBQUklOVCAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTUFKT1I6CS8qIG1ham9yIG51bWJlciAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEpOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUubWFqb3JudW1iZXIgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIG1ham9yIG51bWJlciIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBDTUFKT1IgKCVzKSB0byBjb25maWcuLi5cbiIsIHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUxUUElOOgkvKiBhbHRwaW4gc2V0dGluZyAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEFOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUuYWx0cGluID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBhbHRwaW4iKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgQUxUUElOICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVTRUlOVFI6CQkvKiBlbmFibGUgaW50ZXJydXB0IHNldHRpbmcgKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShJTlRSTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LnVzZWludHIgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHVzZWludHIiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgVVNFSU5UUiAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUVFNJWjoJLyogc2l6ZSBvZiB0dHkgc3RydWN0dXJlICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVFNOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUudHR5c2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgdHR5c2l6ZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBUVFNJWiAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDSFNJWjoJLyogY2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKENTTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmNoc2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgY2hzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIENIU0laRSAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCU1NJWjoJLyogYm9hcmQgc3RydWN0dXJlIHNpemUgKi8KLQkJCWlmIChkZ2FwX2NoZWNrbm9kZShwKSkKLQkJCQlyZXR1cm4oLTEpOwotCQkJaWYgKCAocC0+bmV4dCA9IGRnYXBfbmV3bm9kZShCU05PREUpKSA9PSBOVUxMICkgewotCQkJCWRnYXBfZXJyKCJvdXQgb2YgbWVtb3J5Iik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAgPSBwLT5uZXh0OwotCQkJcyA9IGRnYXBfZ2V0d29yZChpbik7Ci0JCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQkJZGdhcF9lcnIoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcC0+dS5ic3NpemUgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIGJzc2l6ZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlEUFJfSU5JVCgoIkFkZGluZyBCU1NJWiAoJXMpIHRvIGNvbmZpZy4uLlxuIiwgcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVTlRTSVo6CS8qIHNjaGVkIHN0cnVjdHVyZSBzaXplICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVVNOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUudW5zaXplID0gc2ltcGxlX3N0cnRvbChzLCAmczIsIDApOwotCQkJaWYgKChpbnQpc3RybGVuKHMpID4gKGludCkoczIgLSBzKSkgewotCQkJCWRnYXBfZXJyKCJiYWQgbnVtYmVyIGZvciBzY2hlZHNpemUiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJRFBSX0lOSVQoKCJBZGRpbmcgVU5UU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEYyU0laOgkvKiBmMjIwMCBzdHJ1Y3R1cmUgc2l6ZSAqLwotCQkJaWYgKGRnYXBfY2hlY2tub2RlKHApKQotCQkJCXJldHVybigtMSk7Ci0JCQlpZiAoIChwLT5uZXh0ID0gZGdhcF9uZXdub2RlKEZTTk9ERSkpID09IE5VTEwgKSB7Ci0JCQkJZGdhcF9lcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJCQlyZXR1cm4oLTEpOwotCQkJfQotCQkJcCA9IHAtPm5leHQ7Ci0JCQlzID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJCWlmIChzID09IE5VTEwpIHsKLQkJCQlkZ2FwX2VycigidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwLT51LmYyc2l6ZSA9IHNpbXBsZV9zdHJ0b2wocywgJnMyLCAwKTsKLQkJCWlmICgoaW50KXN0cmxlbihzKSA+IChpbnQpKHMyIC0gcykpIHsKLQkJCQlkZ2FwX2VycigiYmFkIG51bWJlciBmb3IgZjIyMDBzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIEYyU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFZQU0laOgkvKiB2cGl4IHN0cnVjdHVyZSBzaXplICovCi0JCQlpZiAoZGdhcF9jaGVja25vZGUocCkpCi0JCQkJcmV0dXJuKC0xKTsKLQkJCWlmICggKHAtPm5leHQgPSBkZ2FwX25ld25vZGUoVlNOT0RFKSkgPT0gTlVMTCApIHsKLQkJCQlkZ2FwX2Vycigib3V0IG9mIG1lbW9yeSIpOwotCQkJCXJldHVybigtMSk7Ci0JCQl9Ci0JCQlwID0gcC0+bmV4dDsKLQkJCXMgPSBkZ2FwX2dldHdvcmQoaW4pOwotCQkJaWYgKHMgPT0gTlVMTCkgewotCQkJCWRnYXBfZXJyKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCXAtPnUudnBpeHNpemUgPSBzaW1wbGVfc3RydG9sKHMsICZzMiwgMCk7Ci0JCQlpZiAoKGludClzdHJsZW4ocykgPiAoaW50KShzMiAtIHMpKSB7Ci0JCQkJZGdhcF9lcnIoImJhZCBudW1iZXIgZm9yIHZwaXhzaXplIik7Ci0JCQkJcmV0dXJuKC0xKTsKLQkJCX0KLQkJCURQUl9JTklUKCgiQWRkaW5nIFZQU0laICglcykgdG8gY29uZmlnLi4uXG4iLCBzKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi0vKgotICogZGdhcF9zaW5kZXg6IG11Y2ggbGlrZSBpbmRleCgpLCBidXQgaXQgbG9va3MgZm9yIGEgbWF0Y2ggb2YgYW55IGNoYXJhY3RlciBpbgotICogdGhlIGdyb3VwLCBhbmQgcmV0dXJucyB0aGF0IHBvc2l0aW9uLiAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIF4sIHRoZW4KLSAqIHRoaXMgd2lsbCBtYXRjaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBub3QgaW4gdGhhdCBncm91cC4KLSAqLwotc3RhdGljIGNoYXIgKmRnYXBfc2luZGV4IChjaGFyICpzdHJpbmcsIGNoYXIgKmdyb3VwKQotewotCWNoYXIgICAgKnB0cjsKLQotCWlmICghc3RyaW5nIHx8ICFncm91cCkKLQkJcmV0dXJuIChjaGFyICopIE5VTEw7Ci0KLQlpZiAoKmdyb3VwID09ICdeJykgeyAgIAotCQlncm91cCsrOwotCQlmb3IgKDsgKnN0cmluZzsgc3RyaW5nKyspIHsKLQkJCWZvciAocHRyID0gZ3JvdXA7ICpwdHI7IHB0cisrKSB7Ci0JCQkJaWYgKCpwdHIgPT0gKnN0cmluZykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKnB0ciA9PSAnXDAnKQotCQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQl9ICAgCi0JZWxzZSB7Ci0JCWZvciAoOyAqc3RyaW5nOyBzdHJpbmcrKykgewotCQkJZm9yIChwdHIgPSBncm91cDsgKnB0cjsgcHRyKyspIHsKLQkJCQlpZiAoKnB0ciA9PSAqc3RyaW5nKQotCQkJCQlyZXR1cm4gc3RyaW5nOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIChjaGFyICopIE5VTEw7Ci19Ci0KLQotLyoKLSAqIEdldCBhIHRva2VuIGZyb20gdGhlIGlucHV0IGZpbGU7IHJldHVybiAwIGlmIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAqLwotc3RhdGljIGludCBkZ2FwX2dldHRvayhjaGFyICoqaW4sIHN0cnVjdCBjbm9kZSAqcCkKLXsKLQljaGFyCSp3OwotCXN0cnVjdCB0b2tsaXN0ICp0OwotCQotCWlmIChzdHJzdHIoZGdhcF9jd29yZCwgImJvYXIiKSkgewotCQl3ID0gZGdhcF9nZXR3b3JkKGluKTsKLQkJc25wcmludGYoZGdhcF9jd29yZCwgTUFYQ1dPUkQsICIlcyIsIHcpOwotCQlmb3IgKHQgPSBkZ2FwX3RsaXN0OyB0LT50b2tlbiAhPSAwOyB0KyspIHsKLQkJCWlmICggIXN0cmNtcCh3LCB0LT5zdHJpbmcpKSB7Ci0JCQkJcmV0dXJuKHQtPnRva2VuKTsKLQkJCX0gCi0JCX0KLQkJZGdhcF9lcnIoImJvYXJkICEhdHlwZSBub3Qgc3BlY2lmaWVkIik7Ci0JCXJldHVybigxKTsKLQl9Ci0JZWxzZSB7Ci0JCXdoaWxlICggKHcgPSBkZ2FwX2dldHdvcmQoaW4pKSAhPSBOVUxMICkgewotCQkJc25wcmludGYoZGdhcF9jd29yZCwgTUFYQ1dPUkQsICIlcyIsIHcpOwotCQkJZm9yICh0ID0gZGdhcF90bGlzdDsgdC0+dG9rZW4gIT0gMDsgdCsrKSB7Ci0JCQkJaWYgKCAhc3RyY21wKHcsIHQtPnN0cmluZykgKQotCQkJCQlyZXR1cm4odC0+dG9rZW4pOwotCQkJfQotCQl9Ci0JCXJldHVybigwKTsKLQl9Ci19Ci0KLQotLyoKLSAqIGdldCBhIHdvcmQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBhbHNvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBsaW5lIG51bWJlci4KLSAqIHdvcmRzIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KLSAqLwotc3RhdGljIGNoYXIgKmRnYXBfZ2V0d29yZChjaGFyICoqaW4pCi17Ci0JY2hhciAqcmV0X3B0ciA9ICppbjsKLQotICAgICAgICBjaGFyICpwdHIgPSBkZ2FwX3NpbmRleCgqaW4sICIgXHRcbiIpOwotCi0JLyogSWYgbm8gd29yZCBmb3VuZCwgcmV0dXJuIG51bGwgKi8KLQlpZiAoIXB0cikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBNYXJrIG5ldyBsb2NhdGlvbiBmb3Igb3VyIGJ1ZmZlciAqLwotCSpwdHIgPSAnXDAnOwotCSppbiA9IHB0ciArIDE7Ci0KLQkvKiBFYXQgYW55IGV4dHJhIHNwYWNlcy90YWJzL25ld2xpbmVzIHRoYXQgbWlnaHQgYmUgcHJlc2VudCAqLwotCXdoaWxlICgqaW4gJiYgKippbiAmJiAoKCoqaW4gPT0gJyAnKSB8fCAoKippbiA9PSAnXHQnKSB8fCAoKippbiA9PSAnXG4nKSkpIHsKLQkJKippbiA9ICdcMCc7Ci0JCSppbiA9ICppbiArIDE7Ci0JfQotCi0JcmV0dXJuIHJldF9wdHI7Ci19Ci0KLQotLyoKLSAqIHByaW50IGFuIGVycm9yIG1lc3NhZ2UsIGdpdmluZyB0aGUgbGluZSBudW1iZXIgaW4gdGhlIGZpbGUgd2hlcmUKLSAqIHRoZSBlcnJvciBvY2N1cnJlZC4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9lcnIoY2hhciAqcykKLXsKLQlwcmludGsoIkRHQVA6IHBhcnNlOiAlc1xuIiwgcyk7Ci19Ci0KLQotLyoKLSAqIGFsbG9jYXRlIGEgbmV3IGNvbmZpZ3VyYXRpb24gbm9kZSBvZiB0eXBlIHQKLSAqLwotc3RhdGljIHN0cnVjdCBjbm9kZSAqZGdhcF9uZXdub2RlKGludCB0KQotewotCXN0cnVjdCBjbm9kZSAqbjsKLQotCW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY25vZGUpLCBHRlBfQVRPTUlDKTsKLQlpZiAobiAhPSBOVUxMKSB7Ci0JCW1lbXNldCgoY2hhciAqKW4sIDAsIHNpemVvZihzdHJ1Y3QgY25vZGUpKTsKLQkJbi0+dHlwZSA9IHQ7Ci0JfQotCXJldHVybihuKTsKLX0KLQotCi0vKgotICogZGdhcF9jaGVja25vZGU6IHNlZSBpZiBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvIGhhcyBiZWVuIHN1cHBsaWVkIGZvciBhIG5vZGUKLSAqIGJlZm9yZSBjcmVhdGluZyB0aGUgbmV4dCBub2RlLgotICovCi1zdGF0aWMgaW50IGRnYXBfY2hlY2tub2RlKHN0cnVjdCBjbm9kZSAqcCkKLXsKLQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQljYXNlIEJOT0RFOgotCQlpZiAocC0+dS5ib2FyZC52X3R5cGUgPT0gMCkgewotCQkJZGdhcF9lcnIoImJvYXJkIHR5cGUgIW5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCi0JCXJldHVybigwKTsKLQotCWNhc2UgTE5PREU6Ci0JCWlmIChwLT51LmxpbmUudl9zcGVlZCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigibGluZSBzcGVlZCBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0JY2FzZSBDTk9ERToKLQkJaWYgKHAtPnUuY29uYy52X3R5cGUgPT0gMCkgewotCQkJZGdhcF9lcnIoImNvbmNlbnRyYXRvciB0eXBlIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlpZiAocC0+dS5jb25jLnZfc3BlZWQgPT0gMCkgewotCQkJZGdhcF9lcnIoImNvbmNlbnRyYXRvciBsaW5lIHNwZWVkIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlpZiAocC0+dS5jb25jLnZfbnBvcnQgPT0gMCkgewotCQkJZGdhcF9lcnIoIm51bWJlciBvZiBwb3J0cyBvbiBjb25jZW50cmF0b3Igbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmIChwLT51LmNvbmMudl9pZCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigiY29uY2VudHJhdG9yIGlkIGxldHRlciBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCi0JY2FzZSBNTk9ERToKLQkJaWYgKHAtPnUubW9kdWxlLnZfdHlwZSA9PSAwKSB7Ci0JCQlkZ2FwX2VycigiRUJJIG1vZHVsZSB0eXBlIG5vdCBzcGVjaWZpZWQiKTsKLQkJCXJldHVybigxKTsKLQkJfQotCQlpZiAocC0+dS5tb2R1bGUudl9ucG9ydCA9PSAwKSB7Ci0JCQlkZ2FwX2VycigibnVtYmVyIG9mIHBvcnRzIG9uIEVCSSBtb2R1bGUgbm90IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmIChwLT51Lm1vZHVsZS52X2lkID09IDApIHsKLQkJCWRnYXBfZXJyKCJFQkkgbW9kdWxlIGlkIGxldHRlciBub3Qgc3BlY2lmaWVkIik7Ci0JCQlyZXR1cm4oMSk7Ci0JCX0KLQkJcmV0dXJuKDApOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLS8qCi0gKiBzYXZlIGEgc3RyaW5nIHNvbWV3aGVyZQotICovCi1zdGF0aWMgY2hhcgkqZGdhcF9zYXZlc3RyaW5nKGNoYXIgKnMpCi17Ci0JY2hhcgkqcDsKLQlpZiAoIChwID0ga21hbGxvYyhzdHJsZW4ocykgKyAxLCBHRlBfQVRPTUlDKSApICE9IE5VTEwpIHsKLQkJc3RyY3B5KHAsIHMpOwotCX0KLQlyZXR1cm4ocCk7Ci19Ci0KLQotLyoKLSAqIEdpdmVuIGEgYm9hcmQgcG9pbnRlciwgcmV0dXJucyB3aGV0aGVyIHdlIHNob3VsZCB1c2UgaW50ZXJydXB0cyBvciBub3QuCi0gKi8KLXVpbnQgZGdhcF9jb25maWdfZ2V0X3VzZWludHIoc3RydWN0IGJvYXJkX3QgKmJkKQotewotCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7Ci0KLQlpZiAoIWJkKQotCQlyZXR1cm4oMCk7Ci0KLQlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgewotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBJTlRSTk9ERToKLQkJCS8qCi0JCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KLQkJCSAqLwotCQkJcmV0dXJuIHAtPnUudXNlaW50cjsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogSWYgbm90IGZvdW5kLCB0aGVuIGRvbid0IHR1cm4gb24gaW50ZXJydXB0cy4gKi8KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogR2l2ZW4gYSBib2FyZCBwb2ludGVyLCByZXR1cm5zIHdoZXRoZXIgd2UgdHVybiBvbiBhbHRwaW4gb3Igbm90LgotICovCi11aW50IGRnYXBfY29uZmlnX2dldF9hbHRwaW4oc3RydWN0IGJvYXJkX3QgKmJkKQotewotCXN0cnVjdCBjbm9kZSAqcCA9IE5VTEw7Ci0KLQlpZiAoIWJkKQotCQlyZXR1cm4oMCk7Ci0KLQlmb3IgKHAgPSBiZC0+YmRfY29uZmlnOyBwOyBwID0gcC0+bmV4dCkgewotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBBTk9ERToKLQkJCS8qCi0JCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KLQkJCSAqLwotCQkJcmV0dXJuIHAtPnUuYWx0cGluOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBJZiBub3QgZm91bmQsIHRoZW4gZG9uJ3QgdHVybiBvbiBpbnRlcnJ1cHRzLiAqLwotCXJldHVybiAwOwotfQotCi0KLQotLyoKLSAqIEdpdmVuIGEgc3BlY2lmaWMgdHlwZSBvZiBib2FyZCwgaWYgZm91bmQsIGRldGFjaGVkIGxpbmsgYW5kIAotICogcmV0dXJucyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiB0aGUgbGlzdC4KLSAqLwotc3RydWN0IGNub2RlICpkZ2FwX2ZpbmRfY29uZmlnKGludCB0eXBlLCBpbnQgYnVzLCBpbnQgc2xvdCkKLXsKLQlzdHJ1Y3QgY25vZGUgKnAsICpwcmV2ID0gTlVMTCwgKnByZXYyID0gTlVMTCwgKmZvdW5kID0gTlVMTDsKLQotCXAgPSAmZGdhcF9oZWFkOwotCi0Jd2hpbGUgKHAtPm5leHQgIT0gTlVMTCkgewotCQlwcmV2ID0gcDsKLQkJcCA9IHAtPm5leHQ7Ci0KLQkJaWYgKHAtPnR5cGUgPT0gQk5PREUpIHsKLQotCQkJaWYgKHAtPnUuYm9hcmQudHlwZSA9PSB0eXBlKSB7Ci0KLQkJCQlpZiAocC0+dS5ib2FyZC52X3BjaWJ1cyAmJiBwLT51LmJvYXJkLnBjaWJ1cyAhPSBidXMpIHsKLQkJCQkJRFBSKCgiRm91bmQgbWF0Y2hpbmcgYm9hcmQsIGJ1dCB3cm9uZyBidXMgcG9zaXRpb24uIFN5c3RlbSBzYXlzIGJ1cyAlZCwgd2Ugd2FudCBidXMgJWxkXG4iLAotCQkJCQkJYnVzLCBwLT51LmJvYXJkLnBjaWJ1cykpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHAtPnUuYm9hcmQudl9wY2lzbG90ICYmIHAtPnUuYm9hcmQucGNpc2xvdCAhPSBzbG90KSB7Ci0JCQkJCURQUl9JTklUKCgiRm91bmQgbWF0Y2hpbmcgYm9hcmQsIGJ1dCB3cm9uZyBzbG90IHBvc2l0aW9uLiBTeXN0ZW0gc2F5cyBzbG90ICVkLCB3ZSB3YW50IHNsb3QgJWxkXG4iLAotCQkJCQkJc2xvdCwgcC0+dS5ib2FyZC5wY2lzbG90KSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCURQUl9JTklUKCgiTWF0Y2hlZCB0eXBlIGluIGNvbmZpZyBmaWxlXG4iKSk7Ci0KLQkJCQlmb3VuZCA9IHA7Ci0JCQkJLyoKLQkJCQkgKiBLZWVwIHdhbGtpbmcgdGhydSB0aGUgbGlzdCB0aWxsIHdlIGZpbmQgdGhlIG5leHQgYm9hcmQuCi0JCQkJICovCi0JCQkJd2hpbGUgKHAtPm5leHQgIT0gTlVMTCkgewotCQkJCQlwcmV2MiA9IHA7Ci0JCQkJCXAgPSBwLT5uZXh0OwotCQkJCQlpZiAocC0+dHlwZSA9PSBCTk9ERSkgewotCi0JCQkJCQkvKgotCQkJCQkJICogTWFyayB0aGUgZW5kIG9mIG91ciAxIGJvYXJkIGNoYWluIG9mIGNvbmZpZ3MuCi0JCQkJCQkgKi8KLQkJCQkJCXByZXYyLT5uZXh0ID0gTlVMTDsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIExpbmsgdGhlICJuZXh0IiBib2FyZCB0byB0aGUgcHJldmlvdXMgYm9hcmQsCi0JCQkJCQkgKiBlZmZlY3RpdmVseSAidW5saW5raW5nIiBvdXIgYm9hcmQgZnJvbSB0aGUgbWFpbiBjb25maWcuCi0JCQkJCQkgKi8KLQkJCQkJCXByZXYtPm5leHQgPSBwOwotCi0JCQkJCQlyZXR1cm4gZm91bmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBJdCBtdXN0IGJlIHRoZSBsYXN0IGJvYXJkIGluIHRoZSBsaXN0LgotCQkJCSAqLwotCQkJCXByZXYtPm5leHQgPSBOVUxMOwotCQkJCXJldHVybiBmb3VuZDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEdpdmVuIGEgYm9hcmQgcG9pbnRlciwgd2Fsa3MgdGhlIGNvbmZpZyBsaW5rLCBjb3VudGluZyB1cAotICogYWxsIHBvcnRzIHVzZXIgc3BlY2lmaWVkIHNob3VsZCBiZSBvbiB0aGUgYm9hcmQuCi0gKiAoVGhpcyBkb2VzIE5PVCBtZWFuIHRoZXkgYXJlIGFsbCBhY3R1YWxseSBwcmVzZW50IHJpZ2h0IG5vdyB0aG8pCi0gKi8KLXVpbnQgZGdhcF9jb25maWdfZ2V0X251bWJlcl9vZl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYmQpCi17Ci0JaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgY25vZGUgKnAgPSBOVUxMOwotCi0JaWYgKCFiZCkKLQkJcmV0dXJuKDApOwotCi0JZm9yIChwID0gYmQtPmJkX2NvbmZpZzsgcDsgcCA9IHAtPm5leHQpIHsKLQotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBCTk9ERToKLQkJCS8qCi0JCQkgKiBjaGVjayBmb3IgcGN4ciB0eXBlcy4KLQkJCSAqLwotCQkJaWYgKHAtPnUuYm9hcmQudHlwZSA+IEVQQ0ZFKQotCQkJCWNvdW50ICs9IHAtPnUuYm9hcmQubnBvcnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBDTk9ERToKLQkJCWNvdW50ICs9IHAtPnUuY29uYy5ucG9ydDsKLQkJCWJyZWFrOwotCQljYXNlIE1OT0RFOgotCQkJY291bnQgKz0gcC0+dS5tb2R1bGUubnBvcnQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gKGNvdW50KTsKLX0KLQotY2hhciAqZGdhcF9jcmVhdGVfY29uZmlnX3N0cmluZyhzdHJ1Y3QgYm9hcmRfdCAqYmQsIGNoYXIgKnN0cmluZykKLXsKLQljaGFyICpwdHIgPSBzdHJpbmc7Ci0Jc3RydWN0IGNub2RlICpwID0gTlVMTDsKLQlzdHJ1Y3QgY25vZGUgKnEgPSBOVUxMOwotCWludCBzcGVlZDsKLQotCWlmICghYmQpIHsKLQkJKnB0ciA9IDB4ZmY7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JZm9yIChwID0gYmQtPmJkX2NvbmZpZzsgcDsgcCA9IHAtPm5leHQpIHsKLQotCQlzd2l0Y2ggKHAtPnR5cGUpIHsKLQkJY2FzZSBMTk9ERToKLQkJCSpwdHIgPSAnXDAnOwotCQkJcHRyKys7Ci0JCQkqcHRyID0gcC0+dS5saW5lLnNwZWVkOwotCQkJcHRyKys7Ci0JCQlicmVhazsKLQkJY2FzZSBDTk9ERToKLQkJCS8qCi0JCQkgKiBCZWNhdXNlIHRoZSBFUEMvY29uIGNvbmNlbnRyYXRvcnMgY2FuIGhhdmUgRU0gbW9kdWxlcwotCQkJICogaGFuZ2luZyBvZmYgb2YgdGhlbSwgd2UgaGF2ZSB0byB3YWxrIGFoZWFkIGluIHRoZSBsaXN0Ci0JCQkgKiBhbmQga2VlcCBhZGRpbmcgdGhlIG51bWJlciBvZiBwb3J0cyBvbiBlYWNoIEVNIHRvIHRoZSBjb25maWcuCi0JCQkgKiBVR0ghCi0JCQkgKi8KLQkJCXNwZWVkID0gcC0+dS5jb25jLnNwZWVkOwotCQkJcSA9IHAtPm5leHQ7Ci0JCQlpZiAoKHEgIT0gTlVMTCkgJiYgKHEtPnR5cGUgPT0gTU5PREUpICkgewotCQkJCSpwdHIgPSAocC0+dS5jb25jLm5wb3J0ICsgMHg4MCk7Ci0JCQkJcHRyKys7Ci0JCQkJcCA9IHE7Ci0JCQkJd2hpbGUgKChxLT5uZXh0ICE9IE5VTEwpICYmIChxLT5uZXh0LT50eXBlKSA9PSBNTk9ERSkgewotCQkJCQkqcHRyID0gKHEtPnUubW9kdWxlLm5wb3J0ICsgMHg4MCk7Ci0JCQkJCXB0cisrOwotCQkJCQlwID0gcTsKLQkJCQkJcSA9IHEtPm5leHQ7Ci0JCQkJfQotCQkJCSpwdHIgPSBxLT51Lm1vZHVsZS5ucG9ydDsKLQkJCQlwdHIrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJKnB0ciA9IHAtPnUuY29uYy5ucG9ydDsKLQkJCQlwdHIrKzsKLQkJCX0KLQotCQkJKnB0ciA9IHNwZWVkOwotCQkJcHRyKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCSpwdHIgPSAweGZmOwotCXJldHVybiBzdHJpbmc7Ci19Ci0KLQotCi1jaGFyICpkZ2FwX2dldF9jb25maWdfbGV0dGVycyhzdHJ1Y3QgYm9hcmRfdCAqYmQsIGNoYXIgKnN0cmluZykKLXsKLQlpbnQgZm91bmQgPSBGQUxTRTsKLQljaGFyICpwdHIgPSBzdHJpbmc7Ci0Jc3RydWN0IGNub2RlICpjcHRyID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKLQlpbnQgbGVmdCA9IE1BWFRUWU5BTUVMRU47Ci0KLQlpZiAoIWJkKSB7Ci0JCXJldHVybiAiPE5VTEw+IjsKLQl9Ci0KLQlmb3IgKGNwdHIgPSBiZC0+YmRfY29uZmlnOyBjcHRyOyBjcHRyID0gY3B0ci0+bmV4dCkgewotCi0JCWlmICgoY3B0ci0+dHlwZSA9PSBCTk9ERSkgJiYKLQkJICAgICAoKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDJfOTIwUCkgfHwgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDRfOTIwUCkgfHwKLQkJICAgICAoY3B0ci0+dS5ib2FyZC50eXBlID09IEFQT1JUOF85MjBQKSB8fCAoY3B0ci0+dS5ib2FyZC50eXBlID09IFBBUE9SVDQpIHx8Ci0JCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBQQVBPUlQ4KSkpIHsKLQotCQkJZm91bmQgPSBUUlVFOwotCQl9Ci0KLQkJaWYgKGNwdHItPnR5cGUgPT0gVE5PREUgJiYgZm91bmQgPT0gVFJVRSkgewotCQkJY2hhciAqcHRyMTsKLQkJCWlmIChzdHJzdHIoY3B0ci0+dS50dHluYW1lLCAidHR5IikpIHsKLQkJCQlwdHIxID0gY3B0ci0+dS50dHluYW1lOwotCQkJCXB0cjEgKz0gMzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXB0cjEgPSBjcHRyLT51LnR0eW5hbWU7Ci0JCQl9Ci0JCQlpZiAocHRyMSkgewotCQkJCWxlbiA9IHNucHJpbnRmKHB0ciwgbGVmdCwgIiVzIiwgcHRyMSk7Ci0JCQkJbGVmdCAtPSBsZW47Ci0JCQkJcHRyICArPSBsZW47Ci0JCQkJaWYgKGxlZnQgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3B0ci0+dHlwZSA9PSBDTk9ERSkgewotCQkJaWYgKGNwdHItPnUuY29uYy5pZCkgewotCQkJCWxlbiA9IHNucHJpbnRmKHB0ciwgbGVmdCwgIiVzIiwgY3B0ci0+dS5jb25jLmlkKTsKLQkJCQlsZWZ0IC09IGxlbjsKLQkJCQlwdHIgICs9IGxlbjsKLQkJCQlpZiAobGVmdCA8PSAwKQotCQkJCQlicmVhazsKLQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0KLQkJaWYgKGNwdHItPnR5cGUgPT0gTU5PREUpIHsKLQkJCWlmIChjcHRyLT51Lm1vZHVsZS5pZCkgewotCQkJCWxlbiA9IHNucHJpbnRmKHB0ciwgbGVmdCwgIiVzIiwgY3B0ci0+dS5tb2R1bGUuaWQpOwotCQkJCWxlZnQgLT0gbGVuOwotCQkJCXB0ciAgKz0gbGVuOwotCQkJCWlmIChsZWZ0IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHN0cmluZzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGFyc2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyOGM0Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3BhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9ER0FQX1BBUlNFX0gKLSNkZWZpbmUgX0RHQVBfUEFSU0VfSAotCi0jaW5jbHVkZSAiZGdhcF9kcml2ZXIuaCIKLQotZXh0ZXJuIGludCBkZ2FwX3BhcnNlZmlsZShjaGFyICoqaW4sIGludCBSZW1vdmUpOwotZXh0ZXJuIHN0cnVjdCBjbm9kZSAqZGdhcF9maW5kX2NvbmZpZyhpbnQgdHlwZSwgaW50IGJ1cywgaW50IHNsb3QpOwotZXh0ZXJuIHVpbnQgZGdhcF9jb25maWdfZ2V0X251bWJlcl9vZl9wb3J0cyhzdHJ1Y3QgYm9hcmRfdCAqYmQpOwotZXh0ZXJuIGNoYXIgKmRnYXBfY3JlYXRlX2NvbmZpZ19zdHJpbmcoc3RydWN0IGJvYXJkX3QgKmJkLCBjaGFyICpzdHJpbmcpOwotZXh0ZXJuIGNoYXIgKmRnYXBfZ2V0X2NvbmZpZ19sZXR0ZXJzKHN0cnVjdCBib2FyZF90ICpiZCwgY2hhciAqc3RyaW5nKTsKLWV4dGVybiB1aW50IGRnYXBfY29uZmlnX2dldF91c2VpbnRyKHN0cnVjdCBib2FyZF90ICpiZCk7Ci1leHRlcm4gdWludCBkZ2FwX2NvbmZpZ19nZXRfYWx0cGluKHN0cnVjdCBib2FyZF90ICpiZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWQzNzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9wY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICovCi0KLS8qICRJZDogZGdhcF9wY2kuaCx2IDEuMSAyMDA5LzEwLzIzIDE0OjAxOjU3IG1hcmtoIEV4cCAkICovCi0KLSNpZm5kZWYgX19ER0FQX1BDSV9ICi0jZGVmaW5lIF9fREdBUF9QQ0lfSAotCi0jZGVmaW5lIFBDSU1BWCAzMgkJCS8qIG1heGltdW0gbnVtYmVyIG9mIFBDSSBib2FyZHMgKi8KLQotI2RlZmluZSBESUdJX1ZJRAkJMHgxMTRGCi0KLSNkZWZpbmUgUENJX0RFVklDRV9FUENfRElECTB4MDAwMgotI2RlZmluZSBQQ0lfREVWSUNFX1hFTV9ESUQJMHgwMDA0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfRElECTB4MDAwNQotI2RlZmluZSBQQ0lfREVWSUNFX0NYX0RJRAkweDAwMDYKLSNkZWZpbmUgUENJX0RFVklDRV9YUkpfRElECTB4MDAwOQkvKiBQTFgtYmFzZWQgWHIgYWRhcHRlciAqLwotI2RlZmluZSBQQ0lfREVWSUNFX1hSX0lCTV9ESUQJMHgwMDExCS8qIElCTSA4LXBvcnQgQXN5bmMgQWRhcHRlciAqLwotI2RlZmluZSBQQ0lfREVWSUNFX1hSX0JVTExfRElECTB4MDAxMwkvKiBCVUxMIDgtcG9ydCBBc3luYyBBZGFwdGVyICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfU0FJUF9ESUQJMHgwMDFjCS8qIFNBSVAgY2FyZCAtIFhyIGFkYXB0ZXIgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9YUl80MjJfRElECTB4MDAxMgkvKiBYci00MjIgKi8KLSNkZWZpbmUgUENJX0RFVklDRV85MjBfMl9ESUQJMHgwMDM0CS8qIFhSLVBsdXMgOTIwIEssIDIgcG9ydCAqLwotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF80X0RJRAkweDAwMjYJLyogWFItUGx1cyA5MjAgSywgNCBwb3J0ICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzhfRElECTB4MDAyNwkvKiBYUi1QbHVzIDkyMCBLLCA4IHBvcnQgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9FUENKX0RJRAkweDAwMGEJLyogUExYIDkwNjAgY2hpcCBmb3IgUENJICAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0NYX0lCTV9ESUQJMHgwMDFiCS8qIElCTSAxMjgtcG9ydCBBc3luYyBBZGFwdGVyICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzhfSFBfRElECTB4MDA1OAkvKiBIUCBYUi1QbHVzIDkyMCBLLCA4IHBvcnQgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9YRU1fSFBfRElECTB4MDA1OSAgLyogSFAgWGVtIFBDSSAqLwotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWEVNX05BTUUJIkFjY2VsZVBvcnQgWEVNIgotI2RlZmluZSBQQ0lfREVWSUNFX0NYX05BTUUJIkFjY2VsZVBvcnQgQ1giCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfTkFNRQkiQWNjZWxlUG9ydCBYciIKLSNkZWZpbmUgUENJX0RFVklDRV9YUkpfTkFNRQkiQWNjZWxlUG9ydCBYciAoUExYKSIKLSNkZWZpbmUgUENJX0RFVklDRV9YUl9TQUlQX05BTUUJIkFjY2VsZVBvcnQgWHIgKFNBSVApIgotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF8yX05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgMiBwb3J0IgotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF80X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgNCBwb3J0IgotI2RlZmluZSBQQ0lfREVWSUNFXzkyMF84X05BTUUJIkFjY2VsZVBvcnQgWHI5MjAgOCBwb3J0IgotI2RlZmluZSBQQ0lfREVWSUNFX1hSXzQyMl9OQU1FCSJBY2NlbGVQb3J0IFhyIDQyMiIKLSNkZWZpbmUgUENJX0RFVklDRV9FUENKX05BTUUJIkFjY2VsZVBvcnQgRVBDIChQTFgpIgotI2RlZmluZSBQQ0lfREVWSUNFX1hSX0JVTExfTkFNRQkiQWNjZWxlUG9ydCBYciAoQlVMTCkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfWFJfSUJNX05BTUUJIkFjY2VsZVBvcnQgWHIgKElCTSkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfQ1hfSUJNX05BTUUJIkFjY2VsZVBvcnQgQ1ggKElCTSkiCi0jZGVmaW5lIFBDSV9ERVZJQ0VfOTIwXzhfSFBfTkFNRSAiQWNjZWxlUG9ydCBYcjkyMCA4IHBvcnQgKEhQKSIKLSNkZWZpbmUgUENJX0RFVklDRV9YRU1fSFBfTkFNRQkiQWNjZWxlUG9ydCBYRU0gKEhQKSIKLQotCi0vKgotICogT24gdGhlIFBDSSBib2FyZHMsIHRoZXJlIGlzIG5vIElPIHNwYWNlIGFsbG9jYXRlZAotICogVGhlIEkvTyByZWdpc3RlcnMgd2lsbCBiZSBpbiB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUKLSAqIHVwcGVyIDJNQiBvZiB0aGUgNE1CIG1lbW9yeSBzcGFjZS4gIFRoZSBib2FyZCBtZW1vcnkKLSAqIHdpbGwgYmUgbWFwcGVkIGludG8gdGhlIGxvdyAyTUIgb2YgdGhlIDRNQiBtZW1vcnkgc3BhY2UKLSAqLwotCi0vKiBQb3RlbnRpYWwgbG9jYXRpb24gb2YgUENJIEJpb3MgZnJvbSBFMDAwMCB0byBGRkZGRiovCi0jZGVmaW5lIFBDSV9CSU9TX1NJWkUJCTB4MDAwMjAwMDAKLQotLyogU2l6ZSBvZiBNZW1vcnkgYW5kIEkvTyBmb3IgUENJICg0TUIpICovCi0jZGVmaW5lIFBDSV9SQU1fU0laRQkJMHgwMDQwMDAwMAotCi0vKiBTaXplIG9mIE1lbW9yeSAoMk1CKSAqLwotI2RlZmluZSBQQ0lfTUVNX1NJWkUJCTB4MDAyMDAwMDAKLQotLyogTWF4IFBDSSBXaW5kb3cgU2l6ZSAoMk1CKSAqLwotI2RlZmluZSBQQ0lfV0lOX1NJWkUJCTB4MDAyMDAwMDAKLQotI2RlZmluZSBQQ0lfV0lOX1NISUZUCQkyMSAvKiAyMSBiaXRzIG1heCAqLwotCi0vKiBPZmZzZXQgb2YgSS8wIGluIE1lbW9yeSAoMk1CKSAqLwotI2RlZmluZSBQQ0lfSU9fT0ZGU0VUCQkweDAwMjAwMDAwCi0KLS8qIFNpemUgb2YgSU8gKDJNQikgKi8KLSNkZWZpbmUgUENJX0lPX1NJWkUJCTB4MDAyMDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3N5c2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNGVjOWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9zeXNmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICogCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAKLSAqICAgICAgTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICogICAgICBUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqICAgICAgTGludXggS2VybmVsIHNvdXJjZXMuCi0gKiAgICAgIENoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKiAgICAgIG91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqICAgICAgU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICogICAgICBUaGFuayB5b3UuCi0gKgotICoKLSAqIAotICogJElkOiBkZ2FwX3N5c2ZzLmMsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJCAgIAotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotICAKLSNpbmNsdWRlICJkZ2FwX2RyaXZlci5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotI2luY2x1ZGUgImRnYXBfcGFyc2UuaCIKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBER19QQVJUKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUih2ZXJzaW9uLCBTX0lSVVNSLCBkZ2FwX2RyaXZlcl92ZXJzaW9uX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX2JvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZGdhcF9OdW1Cb2FyZHMpOwotfQotc3RhdGljIERSSVZFUl9BVFRSKGJvYXJkcywgU19JUlVTUiwgZGdhcF9kcml2ZXJfYm9hcmRzX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX21heGJvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgTUFYQk9BUkRTKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihtYXhib2FyZHMsIFNfSVJVU1IsIGRnYXBfZHJpdmVyX21heGJvYXJkc19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX2RyaXZlcl9wb2xsY291bnRlcl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGRnYXBfcG9sbF9jb3VudGVyKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihwb2xsY291bnRlciwgU19JUlVTUiwgZGdhcF9kcml2ZXJfcG9sbGNvdW50ZXJfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRnYXBfZHJpdmVyX3N0YXRlX3RleHRbZGdhcF9kcml2ZXJfc3RhdGVdKTsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihzdGF0ZSwgU19JUlVTUiwgZGdhcF9kcml2ZXJfc3RhdGVfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfZGVidWdfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHgleFxuIiwgZGdhcF9kZWJ1Zyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX2RlYnVnX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXNzY2FuZihidWYsICIweCV4XG4iLCAmZGdhcF9kZWJ1Zyk7Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERSSVZFUl9BVFRSKGRlYnVnLCAoU19JUlVTUiB8IFNfSVdVU1IpLCBkZ2FwX2RyaXZlcl9kZWJ1Z19zaG93LCBkZ2FwX2RyaXZlcl9kZWJ1Z19zdG9yZSk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcmF3cmVhZG9rX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JXhcbiIsIGRnYXBfcmF3cmVhZG9rKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcmF3cmVhZG9rX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXNzY2FuZihidWYsICIweCV4XG4iLCAmZGdhcF9yYXdyZWFkb2spOwotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihyYXdyZWFkb2ssIChTX0lSVVNSIHwgU19JV1VTUiksIGRnYXBfZHJpdmVyX3Jhd3JlYWRva19zaG93LCBkZ2FwX2RyaXZlcl9yYXdyZWFkb2tfc3RvcmUpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfZHJpdmVyX3BvbGxyYXRlX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkbXNcbiIsIGRnYXBfcG9sbF90aWNrKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3NjYW5mKGJ1ZiwgIiVkXG4iLCAmZGdhcF9wb2xsX3RpY2spOwotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihwb2xscmF0ZSwgKFNfSVJVU1IgfCBTX0lXVVNSKSwgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc2hvdywgZGdhcF9kcml2ZXJfcG9sbHJhdGVfc3RvcmUpOwotCi0KLXZvaWQgZGdhcF9jcmVhdGVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICpkZ2FwX2RyaXZlcikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZkZ2FwX2RyaXZlci0+ZHJpdmVyOwotCi0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7Ci0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfYm9hcmRzKTsKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9tYXhib2FyZHMpOwotCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2RlYnVnKTsKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9yYXdyZWFkb2spOyAKLQlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7Ci0JcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbGNvdW50ZXIpOwotCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3N0YXRlKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJER0FQOiBzeXNmcyBkcml2ZXJfY3JlYXRlX2ZpbGUgZmFpbGVkIVxuIik7Ci0JfQotfQotCi0KLXZvaWQgZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICpkZ2FwX2RyaXZlcikKLXsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmZGdhcF9kcml2ZXItPmRyaXZlcjsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9ib2FyZHMpOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX21heGJvYXJkcyk7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfZGVidWcpOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3Jhd3JlYWRvayk7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcG9sbHJhdGUpOwotCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3BvbGxjb3VudGVyKTsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9zdGF0ZSk7Ci19Ci0KLQotI2RlZmluZSBER0FQX1ZFUklGWV9CT0FSRChwLCBiZCkJCQlcCi0JaWYgKCFwKQkJCQkJCVwKLQkJcmV0dXJuICgwKTsJCQkJXAotCQkJCQkJCVwKLQliZCA9IGRldl9nZXRfZHJ2ZGF0YShwKTsJCQlcCi0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykJXAotCQlyZXR1cm4gKDApOwkJCQlcCi0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkJCQlcCi0JCXJldHVybiAoMCk7CQkJCVwKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKLQkJCSIlZCAlc1xuIiwgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9vcGVuX2NvdW50ID8gIk9wZW4iIDogIkNsb3NlZCIpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfc3RhdGUsIFNfSVJVU1IsIGRnYXBfcG9ydHNfc3RhdGVfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19iYXVkX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9ICBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCi0JCQkiJWQgJWRcbiIsIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9iYXVkX2luZm8pOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfYmF1ZCwgU19JUlVTUiwgZGdhcF9wb3J0c19iYXVkX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfbXNpZ25hbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJaWYgKGJkLT5jaGFubmVsc1tpXS0+Y2hfb3Blbl9jb3VudCkgewotCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAotCQkJCSIlZCAlcyAlcyAlcyAlcyAlcyAlc1xuIiwgYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21vc3RhdCAmIFVBUlRfTUNSX1JUUykgPyAiUlRTIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX0NUUykgPyAiQ1RTIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21vc3RhdCAmIFVBUlRfTUNSX0RUUikgPyAiRFRSIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RTUikgPyAiRFNSIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RDRCkgPyAiRENEIiA6ICIiLAotCQkJCShiZC0+Y2hhbm5lbHNbaV0tPmNoX21pc3RhdCAmIFVBUlRfTVNSX1JJKSAgPyAiUkkiICA6ICIiKTsKLQkJfSBlbHNlIHsKLQkJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKLQkJCQkiJWRcbiIsIGJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX21zaWduYWxzLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX21zaWduYWxzX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfY19pZmxhZyk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19pZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19pZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX2NmbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlER0FQX1ZFUklGWV9CT0FSRChwLCBiZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmQtPm5hc3luYzsgaSsrKSB7Ci0JCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiVkICV4XG4iLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX2NfY2ZsYWcpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfY2ZsYWcsIFNfSVJVU1IsIGRnYXBfcG9ydHNfY2ZsYWdfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF9wb3J0c19vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKLQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9jX29mbGFnKTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX29mbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX29mbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJXhcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfY19sZmxhZyk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19sZmxhZywgU19JUlVTUiwgZGdhcF9wb3J0c19sZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX2RpZ2lfZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAleFxuIiwKLQkJCWJkLT5jaGFubmVsc1tpXS0+Y2hfcG9ydG51bSwgYmQtPmNoYW5uZWxzW2ldLT5jaF9kaWdpLmRpZ2lfZmxhZ3MpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfZGlnaV9mbGFnLCBTX0lSVVNSLCBkZ2FwX3BvcnRzX2RpZ2lfZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3BvcnRzX3J4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlpbnQgY291bnQgPSAwOwotCWludCBpID0gMDsKLQotCURHQVBfVkVSSUZZX0JPQVJEKHAsIGJkKTsKLQotCWZvciAoaSA9IDA7IGkgPCBiZC0+bmFzeW5jOyBpKyspIHsKLQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJWQgJWxkXG4iLAotCQkJYmQtPmNoYW5uZWxzW2ldLT5jaF9wb3J0bnVtLCBiZC0+Y2hhbm5lbHNbaV0tPmNoX3J4Y291bnQpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfcnhjb3VudCwgU19JUlVTUiwgZGdhcF9wb3J0c19yeGNvdW50X3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfcG9ydHNfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCWludCBjb3VudCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JREdBUF9WRVJJRllfQk9BUkQocCwgYmQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJkLT5uYXN5bmM7IGkrKykgewotCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlZCAlbGRcbiIsCi0JCQliZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0sIGJkLT5jaGFubmVsc1tpXS0+Y2hfdHhjb3VudCk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c190eGNvdW50LCBTX0lSVVNSLCBkZ2FwX3BvcnRzX3R4Y291bnRfc2hvdywgTlVMTCk7Ci0KLQotLyogdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBzeXMgZmlsZXMgdGhhdCB3aWxsIGV4cG9ydCBlYWNoIHNpZ25hbCBzdGF0dXMKLSAqIHRvIHN5c2ZzIGVhY2ggdmFsdWUgd2lsbCBiZSBwdXQgaW4gYSBzZXBhcmF0ZSBmaWxlbmFtZQotICovCi12b2lkIGRnYXBfY3JlYXRlX3BvcnRzX3N5c2ZpbGVzKHN0cnVjdCBib2FyZF90ICpiZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JZGV2X3NldF9kcnZkYXRhKCZiZC0+cGRldi0+ZGV2LCBiZCk7Ci0JcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19zdGF0ZSk7Ci0JcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19iYXVkKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX21zaWduYWxzKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2lmbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2NmbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX29mbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2xmbGFnKTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX2RpZ2lfZmxhZyk7Ci0JcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19yeGNvdW50KTsKLQlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3BvcnRzX3R4Y291bnQpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkRHQVA6IHN5c2ZzIGRldmljZV9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKLQl9Ci19Ci0KLQotLyogcmVtb3ZlcyBhbGwgdGhlIHN5cyBmaWxlcyBjcmVhdGVkIGZvciB0aGF0IHBvcnQgKi8KLXZvaWQgZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKQotewotCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfc3RhdGUpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfYmF1ZCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19tc2lnbmFscyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19pZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19jZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19vZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19sZmxhZyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c19kaWdpX2ZsYWcpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfcG9ydHNfcnhjb3VudCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9wb3J0c190eGNvdW50KTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzIiwgdW4tPnVuX29wZW5fY291bnQgPyAiT3BlbiIgOiAiQ2xvc2VkIik7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVU1IsIGRnYXBfdHR5X3N0YXRlX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2gtPmNoX2JhdWRfaW5mbyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmF1ZCwgU19JUlVTUiwgZGdhcF90dHlfYmF1ZF9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCWlmIChjaC0+Y2hfb3Blbl9jb3VudCkgewotCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyAlcyAlcyAlcyAlcyAlc1xuIiwKLQkJCShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfUlRTKSA/ICJSVFMiIDogIiIsCi0JCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0NUUykgPyAiQ1RTIiA6ICIiLAotCQkJKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9EVFIpID8gIkRUUiIgOiAiIiwKLQkJCShjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRFNSKSA/ICJEU1IiIDogIiIsCi0JCQkoY2gtPmNoX21pc3RhdCAmIFVBUlRfTVNSX0RDRCkgPyAiRENEIiA6ICIiLAotCQkJKGNoLT5jaF9taXN0YXQgJiBVQVJUX01TUl9SSSkgID8gIlJJIiAgOiAiIik7Ci0JfQotCXJldHVybiAwOwotfQotc3RhdGljIERFVklDRV9BVFRSKG1zaWduYWxzLCBTX0lSVVNSLCBkZ2FwX3R0eV9tc2lnbmFsc19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19pZmxhZyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoaWZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2lmbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2NmbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX2NmbGFnKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihjZmxhZywgU19JUlVTUiwgZGdhcF90dHlfY2ZsYWdfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3QgZGdhcF90dHlfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIleFxuIiwgY2gtPmNoX2Nfb2ZsYWcpOwotfQotc3RhdGljIERFVklDRV9BVFRSKG9mbGFnLCBTX0lSVVNSLCBkZ2FwX3R0eV9vZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfY19sZmxhZyk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIobGZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2xmbGFnX3Nob3csIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGRnYXBfdHR5X2RpZ2lfZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQotCWlmICghZCkKLQkJcmV0dXJuICgwKTsKLQl1biA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGJkLT5zdGF0ZSAhPSBCT0FSRF9SRUFEWSkKLQkJcmV0dXJuICgwKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihkaWdpX2ZsYWcsIFNfSVJVU1IsIGRnYXBfdHR5X2RpZ2lfZmxhZ19zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBjaC0+Y2hfcnhjb3VudCk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocnhjb3VudCwgU19JUlVTUiwgZGdhcF90dHlfcnhjb3VudF9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV90eGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCi0JaWYgKCFkKQotCQlyZXR1cm4gKDApOwotCXVuID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQlpZiAoYmQtPnN0YXRlICE9IEJPQVJEX1JFQURZKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBjaC0+Y2hfdHhjb3VudCk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIodHhjb3VudCwgU19JUlVTUiwgZGdhcF90dHlfdHhjb3VudF9zaG93LCBOVUxMKTsKLQotCi1zdGF0aWMgc3NpemVfdCBkZ2FwX3R0eV9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludAljbjsKLQlpbnQJYm47Ci0Jc3RydWN0IGNub2RlICpjcHRyID0gTlVMTDsKLQlpbnQgZm91bmQgPSBGQUxTRTsKLQlpbnQgbmNvdW50ID0gMDsKLQlpbnQgc3RhcnRvID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoIWQpCi0JCXJldHVybiAoMCk7Ci0JdW4gPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgwKTsKLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCWlmIChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpCi0JCXJldHVybiAoMCk7Ci0KLSAgICAgICAgYm4gPSBiZC0+Ym9hcmRudW07Ci0JY24gPSBjaC0+Y2hfcG9ydG51bTsKLQotCWZvciAoY3B0ciA9IGJkLT5iZF9jb25maWc7IGNwdHI7IGNwdHIgPSBjcHRyLT5uZXh0KSB7Ci0KLQkJaWYgKChjcHRyLT50eXBlID09IEJOT0RFKSAmJgotCQkgICAgKChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQyXzkyMFApIHx8IChjcHRyLT51LmJvYXJkLnR5cGUgPT0gQVBPUlQ0XzkyMFApIHx8Ci0JCSAgICAgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBBUE9SVDhfOTIwUCkgfHwgKGNwdHItPnUuYm9hcmQudHlwZSA9PSBQQVBPUlQ0KSB8fAotCQkgICAgIChjcHRyLT51LmJvYXJkLnR5cGUgPT0gUEFQT1JUOCkpKSB7Ci0KLQkJCQlmb3VuZCA9IFRSVUU7Ci0JCQkJaWYgKGNwdHItPnUuYm9hcmQudl9zdGFydCkKLQkJCQkJc3RhcnRvID0gY3B0ci0+dS5ib2FyZC5zdGFydDsKLQkJCQllbHNlCi0JCQkJCXN0YXJ0byA9IDE7Ci0JCX0KLQotCQlpZiAoY3B0ci0+dHlwZSA9PSBUTk9ERSAmJiBmb3VuZCA9PSBUUlVFKSB7Ci0JCQljaGFyICpwdHIxOwotCQkJaWYgKHN0cnN0cihjcHRyLT51LnR0eW5hbWUsICJ0dHkiKSkgewotCQkJCXB0cjEgPSBjcHRyLT51LnR0eW5hbWU7Ci0JCQkJcHRyMSArPSAzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHRyMSA9IGNwdHItPnUudHR5bmFtZTsKLQkJCX0KLQotCQkJZm9yIChpID0gMDsgaSA8IGRnYXBfY29uZmlnX2dldF9udW1iZXJfb2ZfcG9ydHMoYmQpOyBpKyspIHsKLQkJCQlpZiAoY24gPT0gaSkgewotCQkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAyZFxuIiwKLQkJCQkJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/ICJwciIgOiAidHR5IiwKLQkJCQkJCXB0cjEsIGkgKyBzdGFydG8pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjcHRyLT50eXBlID09IENOT0RFKSB7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBjcHRyLT51LmNvbmMubnBvcnQ7IGkrKykgewotCQkJCWlmIChjbiA9PSAoaSArIG5jb3VudCkpIHsKLQotCQkJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyVzJTAyZFxuIiwKLQkJCQkJCSh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSA/ICJwciIgOiAidHR5IiwKLQkJCQkJCWNwdHItPnUuY29uYy5pZCwKLQkJCQkJCWkgKyAoY3B0ci0+dS5jb25jLnZfc3RhcnQgPyBjcHRyLT51LmNvbmMuc3RhcnQgOiAxKSk7Ci0JCQkJfQotCQkJfQotCi0JCQluY291bnQgKz0gY3B0ci0+dS5jb25jLm5wb3J0OwotCQl9Ci0KLQkJaWYgKGNwdHItPnR5cGUgPT0gTU5PREUpIHsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNwdHItPnUubW9kdWxlLm5wb3J0OyBpKyspIHsKLQkJCQlpZiAoY24gPT0gKGkgKyBuY291bnQpKSB7Ci0JCQkJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzJXMlMDJkXG4iLAotCQkJCQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8gInByIiA6ICJ0dHkiLAotCQkJCQkJY3B0ci0+dS5tb2R1bGUuaWQsCi0JCQkJCQlpICsgKGNwdHItPnUubW9kdWxlLnZfc3RhcnQgPyBjcHRyLT51Lm1vZHVsZS5zdGFydCA6IDEpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW5jb3VudCArPSBjcHRyLT51Lm1vZHVsZS5ucG9ydDsKLQotCQl9Ci0JfQotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNfZGdhcF8lZF8lZFxuIiwKLQkJKHVuLT51bl90eXBlID09IERHQVBfUFJJTlQpID8gInByIiA6ICJ0dHkiLCBibiwgY24pOwotCi19Ci1zdGF0aWMgREVWSUNFX0FUVFIoY3VzdG9tX25hbWUsIFNfSVJVU1IsIGRnYXBfdHR5X25hbWVfc2hvdywgTlVMTCk7Ci0KLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRnYXBfc3lzZnNfdHR5X2VudHJpZXNbXSA9IHsKLQkmZGV2X2F0dHJfc3RhdGUuYXR0ciwKLQkmZGV2X2F0dHJfYmF1ZC5hdHRyLAotCSZkZXZfYXR0cl9tc2lnbmFscy5hdHRyLAotCSZkZXZfYXR0cl9pZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9jZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9vZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9sZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9kaWdpX2ZsYWcuYXR0ciwKLQkmZGV2X2F0dHJfcnhjb3VudC5hdHRyLAotCSZkZXZfYXR0cl90eGNvdW50LmF0dHIsCi0JJmRldl9hdHRyX2N1c3RvbV9uYW1lLmF0dHIsCi0JTlVMTAotfTsKLQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLm5hbWUgPSBOVUxMLAotCS5hdHRycyA9IGRnYXBfc3lzZnNfdHR5X2VudHJpZXMsCi19OwotCi0KLQotCi12b2lkIGRnYXBfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYy0+a29iaiwgJmRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImRnYXA6IGZhaWxlZCB0byBjcmVhdGUgc3lzZnMgdHR5IGRldmljZSBhdHRyaWJ1dGVzLlxuIik7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmYy0+a29iaiwgJmRnYXBfdHR5X2F0dHJpYnV0ZV9ncm91cCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoYywgdW4pOwotCi19Ci0KLQotdm9pZCBkZ2FwX3JlbW92ZV90dHlfc3lzZnMoc3RydWN0IGRldmljZSAqYykKLXsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmMtPmtvYmosICZkZ2FwX3R0eV9hdHRyaWJ1dGVfZ3JvdXApOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF9zeXNmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU2OTBlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfc3lzZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICovCi0KLSNpZm5kZWYgX19ER0FQX1NZU0ZTX0gKLSNkZWZpbmUgX19ER0FQX1NZU0ZTX0gKLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotc3RydWN0IGJvYXJkX3Q7Ci1zdHJ1Y3QgY2hhbm5lbF90Owotc3RydWN0IHVuX3Q7Ci1zdHJ1Y3QgcGNpX2RyaXZlcjsKLXN0cnVjdCBjbGFzc19kZXZpY2U7Ci0KLWV4dGVybiB2b2lkIGRnYXBfY3JlYXRlX3BvcnRzX3N5c2ZpbGVzKHN0cnVjdCBib2FyZF90ICpiZCk7IAotZXh0ZXJuIHZvaWQgZGdhcF9yZW1vdmVfcG9ydHNfc3lzZmlsZXMoc3RydWN0IGJvYXJkX3QgKmJkKTsKLQotZXh0ZXJuIHZvaWQgZGdhcF9jcmVhdGVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICopOwotZXh0ZXJuIHZvaWQgZGdhcF9yZW1vdmVfZHJpdmVyX3N5c2ZpbGVzKHN0cnVjdCBwY2lfZHJpdmVyICopOwotCi1leHRlcm4gaW50IGRnYXBfdHR5X2NsYXNzX2luaXQodm9pZCk7Ci1leHRlcm4gaW50IGRnYXBfdHR5X2NsYXNzX2Rlc3Ryb3kodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGRnYXBfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpOwotZXh0ZXJuIHZvaWQgZGdhcF9yZW1vdmVfdHR5X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmMpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90cmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90cmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNkYjllLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKglUaGFuayB5b3UuCi0gKgotICovCi0KLS8qICRJZDogZGdhcF90cmFjZS5jLHYgMS4xIDIwMDkvMTAvMjMgMTQ6MDE6NTcgbWFya2ggRXhwICQgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIEZvciBqaWZmaWVzLCB0YXNrIHN0YXRlcyAqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFza2xldCBhbmQgaW50ZXJydXB0IHN0cnVjdHMvZGVmaW5lcyAqLwotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF90cmFjZS5oIgotCi0jZGVmaW5lIFRSQ19UT19DT05TT0xFIDEKLQotLyogZmlsZSBsZXZlbCBnbG9iYWxzICovCi1zdGF0aWMgY2hhciAqZGdhcF90cmNidWY7CQkvKiB0aGUgcmluZ2J1ZmZlciAqLwotCi0jaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLXN0YXRpYyBpbnQgZGdhcF90cmNidWZpID0gMDsJCS8qIGluZGV4IG9mIHRoZSB0aWxkZSBhdCB0aGUgZW5kIG9mICovCi0jZW5kaWYKLQotZXh0ZXJuIGludCBkZ2FwX3RyY2J1Zl9zaXplOwkJLyogc2l6ZSBvZiB0aGUgcmluZ2J1ZmZlciAqLwotCi0jaWYgZGVmaW5lZChUUkNfVE9fS01FTSkKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGdhcF90cmFjZWZfbG9jayk7Ci0jZW5kaWYKLQotI2lmIDAKLQotI2lmICFkZWZpbmVkKFRSQ19UT19LTUVNKSAmJiAhZGVmaW5lZChUUkNfVE9fQ09OU09MRSkKLXZvaWQgZGdhcF90cmFjZWYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JcmV0dXJuOwotfQotCi0jZWxzZSAvKiAhZGVmaW5lZChUUkNfVE9fS01FTSkgJiYgIWRlZmluZWQoVFJDX1RPX0NPTlNPTEUpICovCi0KLXZvaWQgZGdhcF90cmFjZWYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdAkgICAgICAgICBhcDsKLQljaGFyICAJICAgICAgICAgYnVmW1RSQ19NQVhNU0crMV07Ci0Jc2l6ZV90CQkgbGVuYnVmOwotCWludAkJIGk7Ci0Jc3RhdGljIGludAkgZmFpbGVkID0gRkFMU0U7Ci0jIGlmIGRlZmluZWQoVFJDX1RPX0tNRU0pCi0JdW5zaWduZWQgbG9uZwkgZmxhZ3M7Ci0jZW5kaWYKLQotCWlmKGZhaWxlZCkKLQkJcmV0dXJuOwotIyBpZiBkZWZpbmVkKFRSQ19UT19LTUVNKQotCURHQVBfTE9DSyhkZ2FwX3RyYWNlZl9sb2NrLCBmbGFncyk7Ci0jZW5kaWYKLQotCS8qIEZvcm1hdCBidWYgdXNpbmcgZm10IGFuZCBhcmd1bWVudHMgY29udGFpbmVkIGluIGFwLiAqLwotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCWkgPSB2c3ByaW50ZihidWYsIGZtdCwgIGFwKTsKLQl2YV9lbmQoYXApOwotCWxlbmJ1ZiA9IHN0cmxlbihidWYpOwotCi0jIGlmIGRlZmluZWQoVFJDX1RPX0tNRU0pCi0JewotCQlzdGF0aWMgaW50CSBpbml0ZD0wOwotCi0JCS8qCi0JCSAqIE5vdywgaW4gYWRkaXRpb24gdG8gKG9yIGluc3RlYWQgb2YpIHByaW50aW5nIHRoaXMgc3R1ZmYgb3V0Ci0JCSAqICh3aGljaCBpcyBhIGJ1ZmZlcmVkIG9wZXJhdGlvbiksIGFsc28gdHVjayBpdCBhd2F5IGludG8gYQotCQkgKiBjb3JuZXIgb2YgbWVtb3J5IHdoaWNoIGNhbiBiZSBleGFtaW5lZCBwb3N0LWNyYXNoIGluIGtkYi4KLQkJICovCi0JCWlmICghaW5pdGQpIHsKLQkJCWRnYXBfdHJjYnVmID0gKGNoYXIgKikgdm1hbGxvYyhkZ2FwX3RyY2J1Zl9zaXplKTsKLQkJCWlmKCFkZ2FwX3RyY2J1ZikgewotCQkJCWZhaWxlZCA9IFRSVUU7Ci0JCQkJcHJpbnRrKCJkZ2FwOiB0cmFjaW5nIGluaXQgZmFpbGVkIVxuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQltZW1zZXQoZGdhcF90cmNidWYsICdcMCcsICBkZ2FwX3RyY2J1Zl9zaXplKTsKLQkJCWRnYXBfdHJjYnVmaSA9IDA7Ci0JCQlpbml0ZCsrOwotCi0JCQlwcmludGsoImRnYXA6IHRyYWNpbmcgZW5hYmxlZCAtICIgVFJDX0RUUkMKLQkJCQkiIDB4JWx4IDB4JXhcbiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpZGdhcF90cmNidWYsCi0JCQkJZGdhcF90cmNidWZfc2l6ZSk7Ci0JCX0KLQotIyAgaWYgZGVmaW5lZChUUkNfT05fT1ZFUkZMT1dfV1JBUF9BUk9VTkQpCi0JCS8qCi0JCSAqIFRoaXMgaXMgdGhlIGxlc3MgQ1BVLWludGVuc2l2ZSB3YXkgdG8gZG8gdGhpbmdzLiAgV2Ugc2ltcGx5Ci0JCSAqIHdyYXAgYXJvdW5kIGJlZm9yZSB3ZSBmYWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICBBCi0JCSAqIHRpbGRlICh+KSBkZW1hcmNhdGVzIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgdHJhY2UuCi0JCSAqCi0JCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0IHJhY2UKLQkJICogY29uZGl0aW9ucyBhcyBpdCBpcyBsZXNzIGxpa2VseSB0byBhZmZlY3QgdGhlIHRpbWluZyBvZgotCQkgKiB0aGluZ3MuCi0JCSAqLwotCi0JCWlmIChkZ2FwX3RyY2J1ZmkgKyBsZW5idWYgPj0gZGdhcF90cmNidWZfc2l6ZSkgewotCQkJLyogV2UgYXJlIHdyYXBwaW5nLCBzbyB3aXBlIG91dCB0aGUgbGFzdCB0aWxkZS4gKi8KLQkJCWRnYXBfdHJjYnVmW2RnYXBfdHJjYnVmaV0gPSAnXDAnOwotCQkJLyogcHV0IHRoZSBuZXcgc3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLwotCQkJZGdhcF90cmNidWZpID0gMDsKLQkJfQotCi0JCXN0cmNweSgmZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSwgYnVmKTsKLQkJZGdhcF90cmNidWZpICs9IGxlbmJ1ZjsKLQkJZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSA9ICd+JzsKLQotIyAgZWxpZiBkZWZpbmVkKFRSQ19PTl9PVkVSRkxPV19TSElGVF9CVUZGRVIpCi0JCS8qCi0JCSAqIFRoaXMgaXMgdGhlIG1vcmUgQ1BVLWludGVuc2l2ZSB3YXkgdG8gZG8gdGhpbmdzLiAgSWYgd2UKLQkJICogdmVudHVyZSBpbnRvIHRoZSBsYXN0IDEvOCBvZiB0aGUgYnVmZmVyLCB3ZSBzaGlmdCB0aGUKLQkJICogbGFzdCA3Lzggb2YgdGhlIGJ1ZmZlciBmb3J3YXJkLCB3aXBpbmcgb3V0IHRoZSBmaXJzdCAxLzguCi0JCSAqIEFkdmFudGFnZTogTm8gd3JhcC1hcm91bmQsIG9ubHkgdHJ1bmNhdGlvbiBmcm9tIHRoZQotCQkgKiBiZWdpbm5pbmcuCi0JCSAqCi0JCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBpZiB5b3UgYXJlIGNvbmNlcm5lZCBhYm91dAotCQkgKiB0aW1pbmcgY2hhbmdlcyBhZmZlY3RpbmcgdGhlIGJlaGF2aW91ciBvZiB0aGUgZHJpdmVyIChpZSwKLQkJICogcmFjZSBjb25kaXRpb25zKS4KLQkJICovCi0JCXN0cmNweSgmZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSwgYnVmKTsKLQkJZGdhcF90cmNidWZpICs9IGxlbmJ1ZjsKLQkJZGdhcF90cmNidWZbZGdhcF90cmNidWZpXSA9ICd+JzsKLQkJZGdhcF90cmNidWZbZGdhcF90cmNidWZpKzFdID0gJ1wwJzsKLQotCQkvKiBJZiB3ZSdyZSBuZWFyIHRoZSBlbmQgb2YgdGhlIHRyYWNlIGJ1ZmZlci4uLiAqLwotCQlpZiAoZGdhcF90cmNidWZpID4gKGRnYXBfdHJjYnVmX3NpemUvOCkqNykgewotCQkJLyogV2lwZSBvdXQgdGhlIGZpcnN0IGVpZ2h0aCB0byBtYWtlIHNvbWUgbW9yZSByb29tLiAqLwotCQkJc3RyY3B5KGRnYXBfdHJjYnVmLCAmZGdhcF90cmNidWZbZGdhcF90cmNidWZfc2l6ZS84XSk7Ci0JCQlkZ2FwX3RyY2J1ZmkgPSBzdHJsZW4oZGdhcF90cmNidWYpLTE7Ci0JCQkvKiBQbG9wIG92ZXJmbG93IG1lc3NhZ2UgYXQgdGhlIHRvcCBvZiB0aGUgYnVmZmVyLiAqLwotCQkJYmNvcHkoVFJDX09WRVJGTE9XLCBkZ2FwX3RyY2J1Ziwgc3RybGVuKFRSQ19PVkVSRkxPVykpOwotCQl9Ci0jICBlbHNlCi0jICAgZXJyb3IgIlRSQ19PTl9PVkVSRkxPV19XUkFQX0FST1VORCBvciBUUkNfT05fT1ZFUkZMT1dfU0hJRlRfQlVGRkVSPyIKLSMgIGVuZGlmCi0JfQotCURHQVBfVU5MT0NLKGRnYXBfdHJhY2VmX2xvY2ssIGZsYWdzKTsKLQotIyBlbmRpZiAvKiBkZWZpbmVkKFRSQ19UT19LTUVNKSAqLwotfQotCi0jZW5kaWYgLyogIWRlZmluZWQoVFJDX1RPX0tNRU0pICYmICFkZWZpbmVkKFRSQ19UT19DT05TT0xFKSAqLwotCi0jZW5kaWYKLQotLyoKLSAqIGRnYXBfdHJhY2VyX2ZyZWUoKQotICoKLSAqCi0gKi8KLXZvaWQgZGdhcF90cmFjZXJfZnJlZSh2b2lkKQotewotCWlmKGRnYXBfdHJjYnVmKQotCQl2ZnJlZShkZ2FwX3RyY2J1Zik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3RyYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3RyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWY0NjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBIZWFkZXIgZmlsZSBmb3IgZGdhcF90cmFjZS5jCi0gKgotICogJElkOiBkZ2FwX3RyYWNlLmgsdiAxLjEgMjAwOS8xMC8yMyAxNDowMTo1NyBtYXJraCBFeHAgJAotICovCi0KLSNpZm5kZWYgX19ER0FQX1RSQUNFX0gKLSNkZWZpbmUgX19ER0FQX1RSQUNFX0gKLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0KLXZvaWQgZGdhcF90cmFjZWYoY29uc3QgY2hhciAqZm10LCAuLi4pOwotdm9pZCBkZ2FwX3RyYWNlcl9mcmVlKHZvaWQpOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90dHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXBfdHR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmI0ZGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90dHkuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoKLSAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICoJVGhhbmsgeW91LgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdHR5IGRyaXZlciBmdW5jdGlvbmFsaXR5IGZvciB0aGUKLSAqIEZFUDUgYmFzZWQgcHJvZHVjdCBsaW5lcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogJElkOiBkZ2FwX3R0eS5jLHYgMS4zIDIwMTEvMDYvMjMgMTI6MTE6MzEgbWFya2ggRXhwICQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIEZvciBqaWZmaWVzLCB0YXNrIHN0YXRlcyAqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBGb3IgdGFza2xldCBhbmQgaW50ZXJydXB0IHN0cnVjdHMvZGVmaW5lcyAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEZvciB1ZGVsYXkgKi8KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBGb3IgY29weV9mcm9tX3VzZXIvY29weV90b191c2VyICovCi0jaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBGb3IgcmVhZFtid2xdL3dyaXRlW2J3bF0gKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgImRnYXBfZHJpdmVyLmgiCi0jaW5jbHVkZSAiZGdhcF90dHkuaCIKLSNpbmNsdWRlICJkZ2FwX3R5cGVzLmgiCi0jaW5jbHVkZSAiZGdhcF9mZXA1LmgiCi0jaW5jbHVkZSAiZGdhcF9wYXJzZS5oIgotI2luY2x1ZGUgImRnYXBfY29uZi5oIgotI2luY2x1ZGUgImRnYXBfc3lzZnMuaCIKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzcpCi0jZGVmaW5lIGluaXRfTVVURVgoc2VtKSAgICAgICAgIHNlbWFfaW5pdChzZW0sIDEpCi0jZGVmaW5lIERFQ0xBUkVfTVVURVgobmFtZSkgICAgIFwKLSAgICAgICAgc3RydWN0IHNlbWFwaG9yZSBuYW1lID0gX19TRU1BUEhPUkVfSU5JVElBTElaRVIobmFtZSwgMSkKLSNlbmRpZgotCi0vKgotICogaW50ZXJuYWwgdmFyaWFibGVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYm9hcmRfdAkqZGdhcF9Cb2FyZHNCeU1ham9yWzI1Nl07Ci1zdGF0aWMgdWNoYXIJCSpkZ2FwX1RtcFdyaXRlQnVmID0gTlVMTDsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGRnYXBfVG1wV3JpdGVTZW0pOwotCi0vKgotICogRGVmYXVsdCB0cmFuc3BhcmVudCBwcmludCBpbmZvcm1hdGlvbi4KLSAqLwotc3RhdGljIHN0cnVjdCBkaWdpX3QgZGdhcF9kaWdpX2luaXQgPSB7Ci0JLmRpZ2lfZmxhZ3MgPQlESUdJX0NPT0ssCS8qIEZsYWdzCQkJKi8KLQkuZGlnaV9tYXhjcHMgPQkxMDAsCQkvKiBNYXggQ1BTCQkJKi8KLQkuZGlnaV9tYXhjaGFyID0JNTAsCQkvKiBNYXggY2hhcnMgaW4gcHJpbnQgcXVldWUJKi8KLQkuZGlnaV9idWZzaXplID0JMTAwLAkJLyogUHJpbnRlciBidWZmZXIgc2l6ZQkJKi8KLQkuZGlnaV9vbmxlbiA9CTQsCQkvKiBzaXplIG9mIHByaW50ZXIgb24gc3RyaW5nCSovCi0JLmRpZ2lfb2ZmbGVuID0JNCwJCS8qIHNpemUgb2YgcHJpbnRlciBvZmYgc3RyaW5nCSovCi0JLmRpZ2lfb25zdHIgPQkiXDAzM1s1aSIsCS8qIEFOU0kgcHJpbnRlciBvbiBzdHJpbmcgXQkqLwotCS5kaWdpX29mZnN0ciA9CSJcMDMzWzRpIiwJLyogQU5TSSBwcmludGVyIG9mZiBzdHJpbmcgXQkqLwotCS5kaWdpX3Rlcm0gPQkiYW5zaSIJCS8qIGRlZmF1bHQgdGVybWluYWwgdHlwZQkqLwotfTsKLQotCi0vKgotICogRGVmaW5lIGEgbG9jYWwgZGVmYXVsdCB0ZXJtaW9zIHN0cnVjdC4gQWxsIHBvcnRzIHdpbGwgYmUgY3JlYXRlZAotICogd2l0aCB0aGlzIHRlcm1pb3MgaW5pdGlhbGx5LgotICoKLSAqIFRoaXMgZGVmaW5lcyBhIHJhdyBwb3J0IGF0IDk2MDAgYmF1ZCwgOCBkYXRhIGJpdHMsIG5vIHBhcml0eSwKLSAqIDEgc3RvcCBiaXQuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBrdGVybWlvcyBEZ2FwRGVmYXVsdFRlcm1pb3MgPQotewotCS5jX2lmbGFnID0JKERFRkFVTFRfSUZMQUdTKSwJLyogaWZsYWdzICovCi0JLmNfb2ZsYWcgPQkoREVGQVVMVF9PRkxBR1MpLAkvKiBvZmxhZ3MgKi8KLQkuY19jZmxhZyA9CShERUZBVUxUX0NGTEFHUyksCS8qIGNmbGFncyAqLwotCS5jX2xmbGFnID0JKERFRkFVTFRfTEZMQUdTKSwJLyogbGZsYWdzICovCi0JLmNfY2MgPQkJSU5JVF9DX0NDLAotCS5jX2xpbmUgPSAJMCwKLX07Ci0KLS8qIE91ciBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBkZ2FwX2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIGludCBkZ2FwX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lnZXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBkaWdpX3QgX191c2VyICpyZXRpbmZvKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGRpZ2lfdCBfX3VzZXIgKm5ld19pbmZvKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbyk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QqIHR0eSk7Ci1zdGF0aWMgaW50IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCogdHR5KTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgZGdhcF90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBkZ2FwX3dhaXRfZm9yX2RyYWluKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBkZ2FwX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSk7Ci1zdGF0aWMgaW50IGRnYXBfZ2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGN1c3RvbWJhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IF9fdXNlciAqbmV3X2luZm8pOwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDM5KQotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLSNlbHNlCi1zdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgZGdhcF90dHlfc2VuZF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbXNlYyk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwotc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7Ci1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKTsKLXN0YXRpYyBpbnQgZGdhcF90dHlfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjKTsKLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgZGdhcF90dHlfb3BzID0gewotCS5vcGVuID0gZGdhcF90dHlfb3BlbiwKLQkuY2xvc2UgPSBkZ2FwX3R0eV9jbG9zZSwKLQkud3JpdGUgPSBkZ2FwX3R0eV93cml0ZSwKLQkud3JpdGVfcm9vbSA9IGRnYXBfdHR5X3dyaXRlX3Jvb20sCi0JLmZsdXNoX2J1ZmZlciA9IGRnYXBfdHR5X2ZsdXNoX2J1ZmZlciwKLQkuY2hhcnNfaW5fYnVmZmVyID0gZGdhcF90dHlfY2hhcnNfaW5fYnVmZmVyLAotCS5mbHVzaF9jaGFycyA9IGRnYXBfdHR5X2ZsdXNoX2NoYXJzLAotCS5pb2N0bCA9IGRnYXBfdHR5X2lvY3RsLAotCS5zZXRfdGVybWlvcyA9IGRnYXBfdHR5X3NldF90ZXJtaW9zLAotCS5zdG9wID0gZGdhcF90dHlfc3RvcCwKLQkuc3RhcnQgPSBkZ2FwX3R0eV9zdGFydCwKLQkudGhyb3R0bGUgPSBkZ2FwX3R0eV90aHJvdHRsZSwKLQkudW50aHJvdHRsZSA9IGRnYXBfdHR5X3VudGhyb3R0bGUsCi0JLmhhbmd1cCA9IGRnYXBfdHR5X2hhbmd1cCwKLQkucHV0X2NoYXIgPSBkZ2FwX3R0eV9wdXRfY2hhciwKLQkudGlvY21nZXQgPSBkZ2FwX3R0eV90aW9jbWdldCwKLQkudGlvY21zZXQgPSBkZ2FwX3R0eV90aW9jbXNldCwKLQkuYnJlYWtfY3RsID0gZGdhcF90dHlfc2VuZF9icmVhaywKLQkud2FpdF91bnRpbF9zZW50ID0gZGdhcF90dHlfd2FpdF91bnRpbF9zZW50LAotCS5zZW5kX3hjaGFyID0gZGdhcF90dHlfc2VuZF94Y2hhcgotfTsKLQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVFRZIEluaXRpYWxpemF0aW9uL0NsZWFudXAgRnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIGRnYXBfdHR5X3ByZWluaXQoKQotICoKLSAqIEluaXRpYWxpemUgYW55IGdsb2JhbCB0dHkgcmVsYXRlZCBkYXRhIGJlZm9yZSB3ZSBkb3dubG9hZCBhbnkgYm9hcmRzLgotICovCi1pbnQgZGdhcF90dHlfcHJlaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlER0FQX0xPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgZG9pbmcgdGhlIGNvcHkgZnJvbSB1c2VyIHNwYWNlIHRvCi0JICoga2VybmVsIHNwYWNlIGluIGRnYXBfaW5wdXQoKS4gIFdlIG9ubHkgdXNlIG9uZSBidWZmZXIgYW5kCi0JICogY29udHJvbCBhY2Nlc3MgdG8gaXQgd2l0aCBhIHNlbWFwaG9yZS4gIElmIHdlIGFyZSBwYWdpbmcsIHdlCi0JICogYXJlIGFscmVhZHkgaW4gdHJvdWJsZSBzbyBvbmUgYnVmZmVyIHdvbid0IGh1cnQgbXVjaCBhbnl3YXkuCi0JICovCi0JZGdhcF9UbXBXcml0ZUJ1ZiA9IGttYWxsb2MoV1JJVEVCVUZMRU4sIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFkZ2FwX1RtcFdyaXRlQnVmKSB7Ci0JCURHQVBfVU5MT0NLKGRnYXBfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLQkJRFBSX0lOSVQoKCJ1bmFibGUgdG8gYWxsb2NhdGUgdG1wIHdyaXRlIGJ1ZiIpKTsKLQkJcmV0dXJuICgtRU5PTUVNKTsKLQl9Ci0KLSAgICAgICAgREdBUF9VTkxPQ0soZGdhcF9nbG9iYWxfbG9jaywgZmxhZ3MpOwotICAgICAgICByZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3JlZ2lzdGVyKCkKLSAqCi0gKiBJbml0IHRoZSB0dHkgc3Vic3lzdGVtIGZvciB0aGlzIGJvYXJkLgotICovCi1pbnQgZGdhcF90dHlfcmVnaXN0ZXIoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JRFBSX0lOSVQoKCJ0dHlfcmVnaXN0ZXIgc3RhcnQiKSk7Ci0KLQlicmQtPlNlcmlhbERyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYUE9SVFMpOwotCi0Jc25wcmludGYoYnJkLT5TZXJpYWxOYW1lLCBNQVhUVFlOQU1FTEVOLCAidHR5X2RnYXBfJWRfIiwgYnJkLT5ib2FyZG51bSk7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPm5hbWUgPSBicmQtPlNlcmlhbE5hbWU7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPm5hbWVfYmFzZSA9IDA7Ci0JYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yID0gMDsKLQlicmQtPlNlcmlhbERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOwotCWJyZC0+U2VyaWFsRHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKLQlicmQtPlNlcmlhbERyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlicmQtPlNlcmlhbERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOwotCWJyZC0+U2VyaWFsRHJpdmVyLT5kcml2ZXJfbmFtZSA9IERSVlNUUjsKLQlicmQtPlNlcmlhbERyaXZlci0+ZmxhZ3MgPSAoVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfCBUVFlfRFJJVkVSX0hBUkRXQVJFX0JSRUFLKTsKLQotCS8qIFRoZSBrZXJuZWwgd2FudHMgc3BhY2UgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdHR5X3N0cnVjdHMgKi8KLQlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9IGt6YWxsb2MoTUFYUE9SVFMgKiBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QgKiksIEdGUF9LRVJORUwpOwotCWlmICghYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpCi0JCXJldHVybigtRU5PTUVNKTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyOCkKLQlicmQtPlNlcmlhbERyaXZlci0+cmVmY291bnQgPSBicmQtPlR0eVJlZkNudDsKLSNlbmRpZgotCi0JLyoKLQkgKiBFbnRyeSBwb2ludHMgZm9yIGRyaXZlci4gIENhbGxlZCBieSB0aGUga2VybmVsIGZyb20KLQkgKiB0dHlfaW8uYyBhbmQgbl90dHkuYy4KLQkgKi8KLQl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5TZXJpYWxEcml2ZXIsICZkZ2FwX3R0eV9vcHMpOwotCi0JLyoKLQkgKiBJZiB3ZSdyZSBkb2luZyB0cmFuc3BhcmVudCBwcmludCwgd2UgaGF2ZSB0byBkbyBhbGwgb2YgdGhlIGFib3ZlCi0JICogYWdhaW4sIHNlcGFyYXRlbHkgc28gd2UgZG9uJ3QgZ2V0IHRoZSBMRCBjb25mdXNlZCBhYm91dCB3aGF0IG1ham9yCi0JICogd2UgYXJlIHdoZW4gd2UgZ2V0IGludG8gdGhlIGRnYXBfdHR5X29wZW4oKSByb3V0aW5lLgotCSAqLwotCWJyZC0+UHJpbnREcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWFBPUlRTKTsKLQotCXNucHJpbnRmKGJyZC0+UHJpbnROYW1lLCBNQVhUVFlOQU1FTEVOLCAicHJfZGdhcF8lZF8iLCBicmQtPmJvYXJkbnVtKTsKLQlicmQtPlByaW50RHJpdmVyLT5uYW1lID0gYnJkLT5QcmludE5hbWU7Ci0JYnJkLT5QcmludERyaXZlci0+bmFtZV9iYXNlID0gMDsKLQlicmQtPlByaW50RHJpdmVyLT5tYWpvciA9IDA7Ci0JYnJkLT5QcmludERyaXZlci0+bWlub3Jfc3RhcnQgPSAwOwotCWJyZC0+UHJpbnREcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCWJyZC0+UHJpbnREcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0JYnJkLT5QcmludERyaXZlci0+aW5pdF90ZXJtaW9zID0gRGdhcERlZmF1bHRUZXJtaW9zOwotCWJyZC0+UHJpbnREcml2ZXItPmRyaXZlcl9uYW1lID0gRFJWU1RSOwotCWJyZC0+UHJpbnREcml2ZXItPmZsYWdzID0gKFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX0RZTkFNSUNfREVWIHwgVFRZX0RSSVZFUl9IQVJEV0FSRV9CUkVBSyk7Ci0KLQkvKiBUaGUga2VybmVsIHdhbnRzIHNwYWNlIHRvIHN0b3JlIHBvaW50ZXJzIHRvIHR0eV9zdHJ1Y3RzICovCi0JYnJkLT5QcmludERyaXZlci0+dHR5cyA9IGt6YWxsb2MoTUFYUE9SVFMgKiBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QgKiksIEdGUF9LRVJORUwpOwotCWlmICghYnJkLT5QcmludERyaXZlci0+dHR5cykKLQkJcmV0dXJuKC1FTk9NRU0pOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQotCWJyZC0+UHJpbnREcml2ZXItPnJlZmNvdW50ID0gYnJkLT5UdHlSZWZDbnQ7Ci0jZW5kaWYKLQotCS8qCi0JICogRW50cnkgcG9pbnRzIGZvciBkcml2ZXIuICBDYWxsZWQgYnkgdGhlIGtlcm5lbCBmcm9tCi0JICogdHR5X2lvLmMgYW5kIG5fdHR5LmMuCi0JICovCi0JdHR5X3NldF9vcGVyYXRpb25zKGJyZC0+UHJpbnREcml2ZXIsICZkZ2FwX3R0eV9vcHMpOwotCi0JaWYgKCFicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQpIHsKLQkJLyogUmVnaXN0ZXIgdHR5IGRldmljZXMgKi8KLQkJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJQVBSKCgiQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZSAoJWQpXG4iLCByYykpOwotCQkJcmV0dXJuKHJjKTsKLQkJfQotCQlicmQtPmRnYXBfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQgPSBUUlVFOwotCQlkZ2FwX0JvYXJkc0J5TWFqb3JbYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yXSA9IGJyZDsKLQkJYnJkLT5kZ2FwX1NlcmlhbF9NYWpvciA9IGJyZC0+U2VyaWFsRHJpdmVyLT5tYWpvcjsKLQl9Ci0KLQlpZiAoIWJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQpIHsKLQkJLyogUmVnaXN0ZXIgVHJhbnNwYXJlbnQgUHJpbnQgZGV2aWNlcyAqLwotIAkJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+UHJpbnREcml2ZXIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlBUFIoKCJDYW4ndCByZWdpc3RlciBUcmFuc3BhcmVudCBQcmludCBkZXZpY2UgKCVkKVxuIiwgcmMpKTsKLQkJCXJldHVybihyYyk7Ci0JCX0KLQkJYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlByaW50RHJpdmVyLT5tYWpvcl0gPSBicmQ7Ci0JCWJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yID0gYnJkLT5QcmludERyaXZlci0+bWFqb3I7Ci0JfQotCi0JRFBSX0lOSVQoKCJER0FQIFJFR0lTVEVSIFRUWTogTUFKT1JTOiAlZCAlZFxuIiwgYnJkLT5TZXJpYWxEcml2ZXItPm1ham9yLAotCQlicmQtPlByaW50RHJpdmVyLT5tYWpvcikpOwotCi0JcmV0dXJuIChyYyk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2luaXQoKQotICoKLSAqIEluaXQgdGhlIHR0eSBzdWJzeXN0ZW0uICBDYWxsZWQgb25jZSBwZXIgYm9hcmQgYWZ0ZXIgYm9hcmQgaGFzIGJlZW4KLSAqIGRvd25sb2FkZWQgYW5kIGluaXQnZWQuCi0gKi8KLWludCBkZ2FwX3R0eV9pbml0KHN0cnVjdCBib2FyZF90ICpicmQpCi17Ci0JaW50IGk7Ci0JaW50IHRsdzsKLQl1aW50IHRydWVfY291bnQgPSAwOwotCXVjaGFyICp2YWRkcjsKLQl1Y2hhciBtb2RlbSA9IDA7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IGJzX3QgKmJzOwotCXN0cnVjdCBjbV90ICpjbTsKLQotCWlmICghYnJkKQotCQlyZXR1cm4gKC1FTlhJTyk7Ci0KLQlEUFJfSU5JVCgoImRnYXBfdHR5X2luaXQgc3RhcnRcbiIpKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSBib2FyZCBzdHJ1Y3R1cmUgZWxlbWVudHMuCi0JICovCi0KLQl2YWRkciA9IGJyZC0+cmVfbWFwX21lbWJhc2U7Ci0JdHJ1ZV9jb3VudCA9IHJlYWR3KCh2YWRkciArIE5DSEFOKSk7Ci0KLQlicmQtPm5hc3luYyA9IGRnYXBfY29uZmlnX2dldF9udW1iZXJfb2ZfcG9ydHMoYnJkKTsKLQotCWlmICghYnJkLT5uYXN5bmMpIHsKLQkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOwotCX0KLQotCWlmIChicmQtPm5hc3luYyA+IGJyZC0+bWF4cG9ydHMpIHsKLQkJYnJkLT5uYXN5bmMgPSBicmQtPm1heHBvcnRzOwotCX0KLQotCWlmICh0cnVlX2NvdW50ICE9IGJyZC0+bmFzeW5jKSB7Ci0JCWlmICgoYnJkLT50eXBlID09IFBQQ00pICYmICh0cnVlX2NvdW50ID09IDY0KSkgewotCQkJQVBSKCgiKioqV0FSTklORyoqKiogJXMgY29uZmlndXJlZCBmb3IgJWQgcG9ydHMsIGhhcyAlZCBwb3J0cy5cblBsZWFzZSBtYWtlIFNVUkUgdGhlIEVCSSBjYWJsZSBydW5uaW5nIGZyb20gdGhlIGNhcmRcbnRvIGVhY2ggRU0gbW9kdWxlIGlzIHBsdWdnZWQgaW50byBFQkkgSU4hXG4iLAotCQkJCWJyZC0+bmFtZSwgYnJkLT5uYXN5bmMsIHRydWVfY291bnQpKTsKLQkJfQotCQllbHNlIGlmICgoYnJkLT50eXBlID09IFBQQ00pICYmICh0cnVlX2NvdW50ID09IDApKSB7Ci0JCQlBUFIoKCIqKipXQVJOSU5HKioqKiAlcyBjb25maWd1cmVkIGZvciAlZCBwb3J0cywgaGFzICVkIHBvcnRzLlxuUGxlYXNlIG1ha2UgU1VSRSB0aGUgRUJJIGNhYmxlIHJ1bm5pbmcgZnJvbSB0aGUgY2FyZFxudG8gZWFjaCBFTSBtb2R1bGUgaXMgcGx1Z2dlZCBpbnRvIEVCSSBJTiFcbiIsCi0JCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCkpOwotCQl9Ci0JCWVsc2UgewotCQkJQVBSKCgiKioqV0FSTklORyoqKiogJXMgY29uZmlndXJlZCBmb3IgJWQgcG9ydHMsIGhhcyAlZCBwb3J0cy5cbiIsCi0JCQkJYnJkLT5uYW1lLCBicmQtPm5hc3luYywgdHJ1ZV9jb3VudCkpOwotCQl9Ci0KLQkJYnJkLT5uYXN5bmMgPSB0cnVlX2NvdW50OwotCi0JCS8qIElmIG5vIHBvcnRzLCBkb24ndCBib3RoZXIgZ29pbmcgYW55IGZ1cnRoZXIgKi8KLQkJaWYgKCFicmQtPm5hc3luYykgewotCQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7Ci0JCQlyZXR1cm4oLUVOWElPKTsKLQkJfQotCX0KLQotCS8qCi0JICogQWxsb2NhdGUgY2hhbm5lbCBtZW1vcnkgdGhhdCBtaWdodCBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotCSAqIHdoZW4gdGhlIGRyaXZlciB3YXMgZmlyc3QgbG9hZGVkLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7Ci0JCWlmICghYnJkLT5jaGFubmVsc1tpXSkgewotCQkJYnJkLT5jaGFubmVsc1tpXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFubmVsX3QpLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghYnJkLT5jaGFubmVsc1tpXSkgewotCQkJCURQUl9DT1JFKCgiJXM6JWQgVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2hhbm5lbCBzdHJ1Y3RcbiIsCi0JCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXykpOwotCQkJfQotCQl9Ci0JfQotCi0JY2ggPSBicmQtPmNoYW5uZWxzWzBdOwotCXZhZGRyID0gYnJkLT5yZV9tYXBfbWVtYmFzZTsKLQotCWJzID0gKHN0cnVjdCBic190ICopICgodWxvbmcpIHZhZGRyICsgQ0hBTkJVRik7Ci0JY20gPSAoc3RydWN0IGNtX3QgKikgKCh1bG9uZykgdmFkZHIgKyBDTURCVUYpOwotCi0JYnJkLT5iZF9icyA9IGJzOwotCi0JLyogU2V0IHVwIGNoYW5uZWwgdmFyaWFibGVzICovCi0JZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyssIGNoID0gYnJkLT5jaGFubmVsc1tpXSwgYnMrKykgewotCi0JCWlmICghYnJkLT5jaGFubmVsc1tpXSkKLQkJCWNvbnRpbnVlOwotCi0JCURHQVBfU1BJTkxPQ0tfSU5JVChjaC0+Y2hfbG9jayk7Ci0KLQkJLyogU3RvcmUgYWxsIG91ciBtYWdpYyBudW1iZXJzICovCi0JCWNoLT5tYWdpYyA9IERHQVBfQ0hBTk5FTF9NQUdJQzsKLQkJY2gtPmNoX3R1bi5tYWdpYyA9IERHQVBfVU5JVF9NQUdJQzsKLQkJY2gtPmNoX3R1bi51bl90eXBlID0gREdBUF9TRVJJQUw7Ci0JCWNoLT5jaF90dW4udW5fY2ggPSBjaDsKLQkJY2gtPmNoX3R1bi51bl9kZXYgPSBpOwotCi0JCWNoLT5jaF9wdW4ubWFnaWMgPSBER0FQX1VOSVRfTUFHSUM7Ci0JCWNoLT5jaF9wdW4udW5fdHlwZSA9IERHQVBfUFJJTlQ7Ci0JCWNoLT5jaF9wdW4udW5fY2ggPSBjaDsKLQkJY2gtPmNoX3B1bi51bl9kZXYgPSBpOwotCi0JCWNoLT5jaF92YWRkciA9IHZhZGRyOwotCQljaC0+Y2hfYnMgPSBiczsKLQkJY2gtPmNoX2NtID0gY207Ci0JCWNoLT5jaF9iZCA9IGJyZDsKLQkJY2gtPmNoX3BvcnRudW0gPSBpOwotCQljaC0+Y2hfZGlnaSA9IGRnYXBfZGlnaV9pbml0OwotCi0JCS8qCi0JCSAqIFNldCB1cCBkaWdpIGRzciBhbmQgZGNkIGJpdHMgYmFzZWQgb24gYWx0cGluIGZsYWcuCi0JCSAqLwotCQlpZiAoZGdhcF9jb25maWdfZ2V0X2FsdHBpbihicmQpKSB7Ci0JCQljaC0+Y2hfZHNyCT0gRE1fQ0Q7Ci0JCQljaC0+Y2hfY2QJPSBETV9EU1I7Ci0JCQljaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzIHw9IERJR0lfQUxUUElOOwotCQl9Ci0JCWVsc2UgewotCQkJY2gtPmNoX2NkCT0gRE1fQ0Q7Ci0JCQljaC0+Y2hfZHNyCT0gRE1fRFNSOwotCQl9Ci0KLQkJY2gtPmNoX3RhZGRyID0gdmFkZHIgKyAoKGNoLT5jaF9icy0+dHhfc2VnKSA8PCA0KTsKLQkJY2gtPmNoX3JhZGRyID0gdmFkZHIgKyAoKGNoLT5jaF9icy0+cnhfc2VnKSA8PCA0KTsKLQkJY2gtPmNoX3R4X3dpbiA9IDA7Ci0JCWNoLT5jaF9yeF93aW4gPSAwOwotCQljaC0+Y2hfdHNpemUgPSByZWFkdygmKGNoLT5jaF9icy0+dHhfbWF4KSkgKyAxOwotCQljaC0+Y2hfcnNpemUgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfbWF4KSkgKyAxOwotCQljaC0+Y2hfdHN0YXJ0ID0gMDsKLQkJY2gtPmNoX3JzdGFydCA9IDA7Ci0KLQkJLyogLjI1IHNlY29uZCBkZWxheSAqLwotCQljaC0+Y2hfY2xvc2VfZGVsYXkgPSAyNTA7Ci0KLQkJLyoKLQkJICogU2V0IHF1ZXVlIHdhdGVyIG1hcmtzLCBpbnRlcnJ1cHQgbWFzaywKLQkJICogYW5kIGdlbmVyYWwgdHR5IHBhcmFtZXRlcnMuCi0JCSAqLwotCQljaC0+Y2hfdGx3ID0gdGx3ID0gY2gtPmNoX3RzaXplID49IDIwMDAgPyAoKGNoLT5jaF90c2l6ZSAqIDUpIC8gOCkgOiBjaC0+Y2hfdHNpemUgLyAyOwotCi0JCWRnYXBfY21kdyhjaCwgU1RMT1csIHRsdywgMCk7Ci0KLQkJZGdhcF9jbWR3KGNoLCBTUkxPVywgY2gtPmNoX3JzaXplIC8gMiwgMCk7Ci0KLQkJZGdhcF9jbWR3KGNoLCBTUkhJR0gsIDcgKiBjaC0+Y2hfcnNpemUgLyA4LCAwKTsKLQotCQljaC0+Y2hfbWlzdGF0ID0gcmVhZGIoJihjaC0+Y2hfYnMtPm1fc3RhdCkpOwotCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5jaF9mbGFnc193YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX3B1bi51bl9mbGFnc193YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmNoX3NuaWZmX3dhaXQpOwotCi0JCS8qIFR1cm4gb24gYWxsIG1vZGVtIGludGVycnVwdHMgZm9yIG5vdyAqLwotCQltb2RlbSA9IChETV9DRCB8IERNX0RTUiB8IERNX0NUUyB8IERNX1JJKTsKLQkJd3JpdGViKG1vZGVtLCAmKGNoLT5jaF9icy0+bV9pbnQpKTsKLQotCQkvKgotCQkgKiBTZXQgZWRlbGF5IHRvIDAgaWYgaW50ZXJydXB0cyBhcmUgdHVybmVkIG9uLAotCQkgKiBvdGhlcndpc2Ugc2V0IGVkZWxheSB0byB0aGUgdXN1YWwgMTAwLgotCQkgKi8KLQkJaWYgKGJyZC0+aW50cl91c2VkKQotCQkJd3JpdGV3KDAsICYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKLQkJZWxzZQotCQkJd3JpdGV3KDEwMCwgJihjaC0+Y2hfYnMtPmVkZWxheSkpOwotCi0JCXdyaXRlYigxLCAmKGNoLT5jaF9icy0+aWRhdGEpKTsKLQl9Ci0KLQotCURQUl9JTklUKCgiZGdhcF90dHlfaW5pdCBmaW5pc2hcbiIpKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3Bvc3RfdW5pbml0KCkKLSAqCi0gKiBVbkluaXRpYWxpemUgYW55IGdsb2JhbCB0dHkgcmVsYXRlZCBkYXRhLgotICovCi12b2lkIGRnYXBfdHR5X3Bvc3RfdW5pbml0KHZvaWQpCi17Ci0Ja2ZyZWUoZGdhcF9UbXBXcml0ZUJ1Zik7Ci0JZGdhcF9UbXBXcml0ZUJ1ZiA9IE5VTEw7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3VuaW5pdCgpCi0gKgotICogVW5pbml0aWFsaXplIHRoZSBUVFkgcG9ydGlvbiBvZiB0aGlzIGRyaXZlci4gIEZyZWUgYWxsIG1lbW9yeSBhbmQKLSAqIHJlc291cmNlcy4KLSAqLwotdm9pZCBkZ2FwX3R0eV91bmluaXQoc3RydWN0IGJvYXJkX3QgKmJyZCkKLXsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAoYnJkLT5kZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkKSB7Ci0JCWRnYXBfQm9hcmRzQnlNYWpvclticmQtPlNlcmlhbERyaXZlci0+bWFqb3JdID0gTlVMTDsKLQkJYnJkLT5kZ2FwX1NlcmlhbF9NYWpvciA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7Ci0JCQlkZ2FwX3JlbW92ZV90dHlfc3lzZnMoYnJkLT5jaGFubmVsc1tpXS0+Y2hfdHVuLnVuX3N5c2ZzKTsKLQkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPlNlcmlhbERyaXZlciwgaSk7Ci0JCX0KLQkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKLQkJa2ZyZWUoYnJkLT5TZXJpYWxEcml2ZXItPnR0eXMpOwotCQlicmQtPlNlcmlhbERyaXZlci0+dHR5cyA9IE5VTEw7Ci0JCXB1dF90dHlfZHJpdmVyKGJyZC0+U2VyaWFsRHJpdmVyKTsKLQkJYnJkLT5kZ2FwX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkID0gRkFMU0U7Ci0JfQotCi0JaWYgKGJyZC0+ZGdhcF9NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQpIHsKLQkJZGdhcF9Cb2FyZHNCeU1ham9yW2JyZC0+UHJpbnREcml2ZXItPm1ham9yXSA9IE5VTEw7Ci0JCWJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKLQkJCWRnYXBfcmVtb3ZlX3R0eV9zeXNmcyhicmQtPmNoYW5uZWxzW2ldLT5jaF9wdW4udW5fc3lzZnMpOwotCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGJyZC0+UHJpbnREcml2ZXIsIGkpOwotCQl9Ci0JCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihicmQtPlByaW50RHJpdmVyKTsKLQkJa2ZyZWUoYnJkLT5QcmludERyaXZlci0+dHR5cyk7Ci0JCWJyZC0+UHJpbnREcml2ZXItPnR0eXMgPSBOVUxMOwotCQlwdXRfdHR5X2RyaXZlcihicmQtPlByaW50RHJpdmVyKTsKLQkJYnJkLT5kZ2FwX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IEZBTFNFOwotCX0KLX0KLQotCi0jZGVmaW5lIFRNUEJVRkxFTiAoMTAyNCkKLQotLyoKLSAqIGRnYXBfc25pZmYgLSBEdW1wIGRhdGEgb3V0IHRvIHRoZSAic25pZmYiIGJ1ZmZlciBpZiB0aGUKLSAqIHByb2Mgc25pZmYgZmlsZSBpcyBvcGVuZWQuLi4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1Y2hhciAqdGV4dCwgdWNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlpbnQgbjsKLQlpbnQgcjsKLQlpbnQgbmJ1ZjsKLQlpbnQgaTsKLQlpbnQgdG1wYnVmbGVuOwotCWNoYXIgdG1wYnVmW1RNUEJVRkxFTl07Ci0JY2hhciAqcCA9IHRtcGJ1ZjsKLQlpbnQgdG9vX211Y2hfZGF0YTsKLQotCS8qIExlYXZlIGlmIHNuaWZmIG5vdCBvcGVuICovCi0JaWYgKCEoY2gtPmNoX3NuaWZmX2ZsYWdzICYgU05JRkZfT1BFTikpCi0JCXJldHVybjsKLQotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCi0JLyogQ3JlYXRlIG91ciBoZWFkZXIgZm9yIGRhdGEgZHVtcCAqLwotCXAgKz0gc3ByaW50ZihwLCAiPCVsZCAlbGQ+PCVzPjwiLCB0di50dl9zZWMsIHR2LnR2X3VzZWMsIHRleHQpOwotCXRtcGJ1ZmxlbiA9IHAgLSB0bXBidWY7Ci0KLQlkbyB7Ci0JCXRvb19tdWNoX2RhdGEgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgdG1wYnVmbGVuIDwgKFRNUEJVRkxFTiAtIDQpOyBpKyspIHsKLQkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCAiLCAqYnVmKTsKLQkJCWJ1ZisrOwotCQkJdG1wYnVmbGVuID0gcCAtIHRtcGJ1ZjsKLQkJfQotCi0JCWlmICh0bXBidWZsZW4gPCAoVE1QQlVGTEVOIC0gNCkpIHsKLQkJCWlmIChpID4gMCkKLQkJCQlwICs9IHNwcmludGYocCAtIDEsICIlc1xuIiwgIj4iKTsKLQkJCWVsc2UKLQkJCQlwICs9IHNwcmludGYocCwgIiVzXG4iLCAiPiIpOwotCQl9IGVsc2UgewotCQkJdG9vX211Y2hfZGF0YSA9IDE7Ci0JCQlsZW4gLT0gaTsKLQkJfQotCi0JCW5idWYgPSBzdHJsZW4odG1wYnVmKTsKLQkJcCA9IHRtcGJ1ZjsKLQotCQkvKgotCQkgKiAgTG9vcCB3aGlsZSBkYXRhIHJlbWFpbnMuCi0JCSAqLwotCQl3aGlsZSAobmJ1ZiA+IDAgJiYgY2gtPmNoX3NuaWZmX2J1ZikgewotCQkJLyoKLQkJCSAqICBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgc3BhY2UgbGVmdCBpbiB0aGUKLQkJCSAqICBidWZmZXIuICBJZiB0aGVyZSdzIG5vbmUsIHdhaXQgdW50aWwgc29tZSBhcHBlYXJzLgotCQkJICovCi0JCQluID0gKGNoLT5jaF9zbmlmZl9vdXQgLSBjaC0+Y2hfc25pZmZfaW4gLSAxKSAmIFNOSUZGX01BU0s7Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IHRvIHdyaXRlIHRvIGluIG91ciBzbmlmZiBidWZmZXIsCi0JCQkgKiB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gZHJvcCB0aGUgZGF0YS4KLQkJCSAqIFdlICpjYW5ub3QqIHNsZWVwIGhlcmUgd2FpdGluZyBmb3Igc3BhY2UsIGJlY2F1c2UgdGhpcwotCQkJICogZnVuY3Rpb24gd2FzIHByb2JhYmx5IGNhbGxlZCBieSB0aGUgaW50ZXJydXB0L3RpbWVyIHJvdXRpbmVzIQotCQkJICovCi0JCQlpZiAobiA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvKgotCQkJICogQ29weSBhcyBtdWNoIGRhdGEgYXMgd2lsbCBmaXQuCi0JCQkgKi8KLQotCQkJaWYgKG4gPiBuYnVmKQotCQkJCW4gPSBuYnVmOwotCi0JCQlyID0gU05JRkZfTUFYIC0gY2gtPmNoX3NuaWZmX2luOwotCi0JCQlpZiAociA8PSBuKSB7Ci0JCQkJbWVtY3B5KGNoLT5jaF9zbmlmZl9idWYgKyBjaC0+Y2hfc25pZmZfaW4sIHAsIHIpOwotCi0JCQkJbiAtPSByOwotCQkJCWNoLT5jaF9zbmlmZl9pbiA9IDA7Ci0JCQkJcCArPSByOwotCQkJCW5idWYgLT0gcjsKLQkJCX0KLQotCQkJbWVtY3B5KGNoLT5jaF9zbmlmZl9idWYgKyBjaC0+Y2hfc25pZmZfaW4sIHAsIG4pOwotCi0JCQljaC0+Y2hfc25pZmZfaW4gKz0gbjsKLQkJCXAgKz0gbjsKLQkJCW5idWYgLT0gbjsKLQotCQkJLyoKLQkJCSAqICBXYWtldXAgYW55IHRocmVhZCB3YWl0aW5nIGZvciBkYXRhCi0JCQkgKi8KLQkJCWlmIChjaC0+Y2hfc25pZmZfZmxhZ3MgJiBTTklGRl9XQUlUX0RBVEEpIHsKLQkJCQljaC0+Y2hfc25pZmZfZmxhZ3MgJj0gflNOSUZGX1dBSVRfREFUQTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9zbmlmZl93YWl0KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZSB1c2VyIHNlbnQgdXMgdG9vIG11Y2ggZGF0YSB0byBwdXNoIGludG8gb3VyIHRtcGJ1ZiwKLQkJICogd2UgbmVlZCB0byBrZWVwIGxvb3BpbmcgYXJvdW5kIG9uIGFsbCB0aGUgZGF0YS4KLQkJICovCi0JCWlmICh0b29fbXVjaF9kYXRhKSB7Ci0JCQlwID0gdG1wYnVmOwotCQkJdG1wYnVmbGVuID0gMDsKLQkJfQotCi0JfSB3aGlsZSAodG9vX211Y2hfZGF0YSk7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgZGdhcF9pbnB1dCAtIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YS4KLSAqCi0gKiAgICAgICAgICAgICAgY2ggICAgICAtIFBvaW50ZXIgdG8gY2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXZvaWQgZGdhcF9pbnB1dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGJzX3QJKmJzOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQl1aW50CXJtYXNrOwotCXVpbnQJaGVhZDsKLQl1aW50CXRhaWw7Ci0JaW50CWRhdGFfbGVuOwotCXVsb25nCWxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQlpbnQgZmxpcF9sZW47Ci0JaW50IGxlbiA9IDA7Ci0JaW50IG4gPSAwOwotCXVjaGFyICpidWY7Ci0JdWNoYXIgdG1wY2hhcjsKLQlpbnQgcyA9IDA7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCXRwID0gY2gtPmNoX3R1bi51bl90dHk7Ci0KLQlicyAgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykgewotCQlyZXR1cm47Ci0JfQotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfUkVBRCgoImRnYXBfaW5wdXQgc3RhcnRcbiIpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkvKgotCSAqICAgICAgRmlndXJlIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLgotCSAqICAgICAgRXhpdCBpbW1lZGlhdGVseSBpZiBub25lLgotCSAqLwotCi0Jcm1hc2sgPSBjaC0+Y2hfcnNpemUgLSAxOwotCi0JaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKLQloZWFkICY9IHJtYXNrOwotCXRhaWwgPSByZWFkdygmKGJzLT5yeF90YWlsKSk7Ci0JdGFpbCAmPSBybWFzazsKLQotCWRhdGFfbGVuID0gKGhlYWQgLSB0YWlsKSAmIHJtYXNrOwotCi0JaWYgKGRhdGFfbGVuID09IDApIHsKLQkJd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJRFBSX1JFQUQoKCJObyBkYXRhIG9uIHBvcnQgJWRcbiIsIGNoLT5jaF9wb3J0bnVtKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZSBkZXZpY2UgaXMgbm90IG9wZW4sIG9yIENSRUFEIGlzIG9mZiwgZmx1c2gKLQkgKiBpbnB1dCBkYXRhIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKChiZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpIHx8ICF0cCAgfHwgKHRwLT5tYWdpYyAhPSBUVFlfTUFHSUMpIHx8Ci0gICAgICAgICAgICAhKGNoLT5jaF90dW4udW5fZmxhZ3MgJiBVTl9JU09QRU4pIHx8ICEodHAtPnRlcm1pb3MuY19jZmxhZyAmIENSRUFEKSB8fAotCSAgICAoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0NMT1NJTkcpKSB7Ci0KLQkJRFBSX1JFQUQoKCJpbnB1dC4gZHJvcHBpbmcgJWQgYnl0ZXMgb24gcG9ydCAlZC4uLlxuIiwgZGF0YV9sZW4sIGNoLT5jaF9wb3J0bnVtKSk7Ci0JCURQUl9SRUFEKCgiaW5wdXQuIHRwOiAlcCB0cC0+bWFnaWM6ICV4IE1BR0lDOiV4IGNoIGZsYWdzOiAleFxuIiwKLQkJCXRwLCB0cCA/IHRwLT5tYWdpYyA6IDAsIFRUWV9NQUdJQywgY2gtPmNoX3R1bi51bl9mbGFncykpOwotCQl3cml0ZXcoaGVhZCwgJihicy0+cnhfdGFpbCkpOwotCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgdGhyb3R0bGVkLCBzaW1wbHkgZG9uJ3QgcmVhZCBhbnkgZGF0YS4KLQkgKi8KLQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfUlhCTE9DSykgewotCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlEUFJfUkVBRCgoIlBvcnQgJWQgdGhyb3R0bGVkLCBub3QgcmVhZGluZyBhbnkgZGF0YS4gaGVhZDogJXggdGFpbDogJXhcbiIsCi0JCQljaC0+Y2hfcG9ydG51bSwgaGVhZCwgdGFpbCkpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiAgICAgIElnbm9yZSBvcnVucy4KLQkgKi8KLQl0bXBjaGFyID0gcmVhZGIoJihicy0+b3J1bikpOwotCWlmICh0bXBjaGFyKSB7Ci0JCWNoLT5jaF9lcnJfb3ZlcnJ1bisrOwotCQl3cml0ZWIoMCwgJihicy0+b3J1bikpOwotCX0KLQotCURQUl9SRUFEKCgiZGdhcF9pbnB1dCBzdGFydCAyXG4iKSk7Ci0KLQkvKiBEZWNpZGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gc2VuZCBpbnRvIHRoZSB0dHkgbGF5ZXIgKi8KLQlmbGlwX2xlbiA9IFRUWV9GTElQQlVGX1NJWkU7Ci0KLQkvKiBDaG9wIGRvd24gdGhlIGxlbmd0aCwgaWYgbmVlZGVkICovCi0JbGVuID0gbWluKGRhdGFfbGVuLCBmbGlwX2xlbik7Ci0JbGVuID0gbWluKGxlbiwgKE5fVFRZX0JVRl9TSVpFIC0gMSkpOwotCi0JbGQgPSB0dHlfbGRpc2NfcmVmKHRwKTsKLQotI2lmZGVmIFRUWV9ET05UX0ZMSVAKLQkvKgotCSAqIElmIHRoZSBET05UX0ZMSVAgZmxhZyBpcyBvbiwgZG9uJ3QgZmx1c2ggb3VyIGJ1ZmZlciwgYW5kIGFjdAotCSAqIGxpa2UgdGhlIGxkIGRvZXNuJ3QgaGF2ZSBhbnkgc3BhY2UgdG8gcHV0IHRoZSBkYXRhIHJpZ2h0IG5vdy4KLQkgKi8KLQlpZiAodGVzdF9iaXQoVFRZX0RPTlRfRkxJUCwgJnRwLT5mbGFncykpCi0JCWxlbiA9IDA7Ci0jZW5kaWYKLQotCS8qCi0JICogSWYgd2Ugd2VyZSB1bmFibGUgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBsZCwKLQkgKiBkb24ndCBmbHVzaCBvdXIgYnVmZmVyLCBhbmQgYWN0IGxpa2UgdGhlIGxkIGRvZXNuJ3QKLQkgKiBoYXZlIGFueSBzcGFjZSB0byBwdXQgdGhlIGRhdGEgcmlnaHQgbm93LgotCSAqLwotCWlmICghbGQpIHsKLQkJbGVuID0gMDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJZiBsZCBkb2Vzbid0IGhhdmUgYSBwb2ludGVyIHRvIGEgcmVjZWl2ZV9idWYgZnVuY3Rpb24sCi0JCSAqIGZsdXNoIHRoZSBkYXRhLCB0aGVuIGFjdCBsaWtlIHRoZSBsZCBkb2Vzbid0IGhhdmUgYW55Ci0JCSAqIHNwYWNlIHRvIHB1dCB0aGUgZGF0YSByaWdodCBub3cuCi0JCSAqLwotCQlpZiAoIWxkLT5vcHMtPnJlY2VpdmVfYnVmKSB7Ci0JCQl3cml0ZXcoaGVhZCwgJihicy0+cnhfdGFpbCkpOwotCQkJbGVuID0gMDsKLQkJfQotCX0KLQotCWlmIChsZW4gPD0gMCkgewotCQl3cml0ZWIoMSwgJihicy0+aWRhdGEpKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlEUFJfUkVBRCgoImRnYXBfaW5wdXQgMSAtIGZpbmlzaFxuIikpOwotCQlpZiAobGQpCi0JCQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCQlyZXR1cm47Ci0JfQotCi0JYnVmID0gY2gtPmNoX2JkLT5mbGlwYnVmOwotCW4gPSBsZW47Ci0KLQkvKgotCSAqIG4gbm93IGNvbnRhaW5zIHRoZSBtb3N0IGFtb3VudCBvZiBkYXRhIHdlIGNhbiBjb3B5LAotCSAqIGJvdW5kZWQgZWl0aGVyIGJ5IG91ciBidWZmZXIgc2l6ZSBvciB0aGUgYW1vdW50Ci0JICogb2YgZGF0YSB0aGUgY2FyZCBhY3R1YWxseSBoYXMgcGVuZGluZy4uLgotCSAqLwotCXdoaWxlIChuKSB7Ci0KLQkJcyA9ICgoaGVhZCA+PSB0YWlsKSA/IGhlYWQgOiBjaC0+Y2hfcnNpemUpIC0gdGFpbDsKLQkJcyA9IG1pbihzLCBuKTsKLQotCQlpZiAocyA8PSAwKQotCQkJYnJlYWs7Ci0KLQkJbWVtY3B5X2Zyb21pbyhidWYsIChjaGFyICopIGNoLT5jaF9yYWRkciArIHRhaWwsIHMpOwotCQlkZ2FwX3NuaWZmX25vd2FpdF9ub2xvY2soY2gsICJVU0VSIFJFQUQiLCBidWYsIHMpOwotCi0JCXRhaWwgKz0gczsKLQkJYnVmICs9IHM7Ci0KLQkJbiAtPSBzOwotCQkvKiBGbGlwIHF1ZXVlIGlmIG5lZWRlZCAqLwotCQl0YWlsICY9IHJtYXNrOwotCX0KLQotCXdyaXRldyh0YWlsLCAmKGJzLT5yeF90YWlsKSk7Ci0Jd3JpdGViKDEsICYoYnMtPmlkYXRhKSk7Ci0JY2gtPmNoX3J4Y291bnQgKz0gbGVuOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgY29tcGxldGVseSByYXcsIHdlIGRvbid0IG5lZWQgdG8gZ28gdGhyb3VnaCBhIGxvdAotCSAqIG9mIHRoZSB0dHkgbGF5ZXJzIHRoYXQgZXhpc3QuCi0JICogSW4gdGhpcyBjYXNlLCB3ZSB0YWtlIHRoZSBzaG9ydGVzdCBhbmQgZmFzdGVzdCByb3V0ZSB3ZQotCSAqIGNhbiB0byByZWxheSB0aGUgZGF0YSB0byB0aGUgdXNlci4KLQkgKgotCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBhcmUgbm90IHJhdywgd2UgbmVlZCB0byBnbyB0aHJvdWdoCi0JICogdGhlIHR0eSBsYXllciwgd2hpY2ggaGFzIGl0cyBBUEkgbW9yZSB3ZWxsIGRlZmluZWQuCi0JICovCi0JaWYgKElfUEFSTVJLKHRwKSB8fCBJX0JSS0lOVCh0cCkgfHwgSV9JTlBDSyh0cCkpIHsKLQkJZGdhcF9wYXJpdHlfc2NhbihjaCwgY2gtPmNoX2JkLT5mbGlwYnVmLCBjaC0+Y2hfYmQtPmZsaXBmbGFnYnVmLCAmbGVuKTsKLQotCQlsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0cC0+cG9ydCwgbGVuKTsKLQkJdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyh0cC0+cG9ydCwgY2gtPmNoX2JkLT5mbGlwYnVmLAotCQkJY2gtPmNoX2JkLT5mbGlwZmxhZ2J1ZiwgbGVuKTsKLQl9Ci0JZWxzZSB7Ci0JCWxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHRwLT5wb3J0LCBsZW4pOwotCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHRwLT5wb3J0LCBjaC0+Y2hfYmQtPmZsaXBidWYsIGxlbik7Ci0JfQotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkvKiBUZWxsIHRoZSB0dHkgbGF5ZXIgaXRzIG9rYXkgdG8gImVhdCIgdGhlIGRhdGEgbm93ICovCi0JdHR5X2ZsaXBfYnVmZmVyX3B1c2godHAtPnBvcnQpOwotCi0JaWYgKGxkKQotCQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCi0JRFBSX1JFQUQoKCJkZ2FwX2lucHV0IC0gZmluaXNoXG4iKSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGV0ZXJtaW5lcyB3aGVuIENBUlJJRVIgY2hhbmdlcyBzdGF0ZSBhbmQgdGFrZXMgYXBwcm9wcmlhdGUKLSAqIGFjdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGRnYXBfY2FycmllcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0KLSAgICAgICAgaW50IHZpcnRfY2FycmllciA9IDA7Ci0gICAgICAgIGludCBwaHlzX2NhcnJpZXIgPSAwOwotCi0JRFBSX0NBUlIoKCJkZ2FwX2NhcnJpZXIgY2FsbGVkLi4uXG4iKSk7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCWJkID0gY2gtPmNoX2JkOwotCi0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyogTWFrZSBzdXJlIGFsdHBpbiBpcyBhbHdheXMgc2V0IGNvcnJlY3RseSAqLwotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pIHsKLQkJY2gtPmNoX2RzciAgICAgID0gRE1fQ0Q7Ci0JCWNoLT5jaF9jZCAgICAgICA9IERNX0RTUjsKLQl9Ci0JZWxzZSB7Ci0JCWNoLT5jaF9kc3IgICAgICA9IERNX0RTUjsKLQkJY2gtPmNoX2NkICAgICAgID0gRE1fQ0Q7Ci0JfQotCi0JaWYgKGNoLT5jaF9taXN0YXQgJiBEX0NEKGNoKSkgewotCQlEUFJfQ0FSUigoIm1pc3RhdDogJXggIERfQ0Q6ICV4XG4iLCBjaC0+Y2hfbWlzdGF0LCBEX0NEKGNoKSkpOwotCQlwaHlzX2NhcnJpZXIgPSAxOwotCX0KLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9GT1JDRURDRCkgewotCQl2aXJ0X2NhcnJpZXIgPSAxOwotCX0KLQotCWlmIChjaC0+Y2hfY19jZmxhZyAmIENMT0NBTCkgewotCQl2aXJ0X2NhcnJpZXIgPSAxOwotCX0KLQotCi0JRFBSX0NBUlIoKCJEQ0Q6IHBoeXNpY2FsOiAlZCB2aXJ0OiAlZFxuIiwgcGh5c19jYXJyaWVyLCB2aXJ0X2NhcnJpZXIpKTsKLQotCS8qCi0JICogVGVzdCBmb3IgYSBWSVJUVUFMIGNhcnJpZXIgdHJhbnNpdGlvbiB0byBISUdILgotCSAqLwotCWlmICgoKGNoLT5jaF9mbGFncyAmIENIX0ZDQVIpID09IDApICYmICh2aXJ0X2NhcnJpZXIgPT0gMSkpIHsKLQotCQkvKgotCQkgKiBXaGVuIGNhcnJpZXIgcmlzZXMsIHdha2UgYW55IHRocmVhZHMgd2FpdGluZwotCQkgKiBmb3IgY2FycmllciBpbiB0aGUgb3BlbiByb3V0aW5lLgotCQkgKi8KLQotCQlEUFJfQ0FSUigoImNhcnJpZXI6IHZpcnQgRENEIHJvc2VcbiIpKTsKLQotCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKLQl9Ci0KLQkvKgotCSAqIFRlc3QgZm9yIGEgUEhZU0lDQUwgY2FycmllciB0cmFuc2l0aW9uIHRvIEhJR0guCi0JICovCi0JaWYgKCgoY2gtPmNoX2ZsYWdzICYgQ0hfQ0QpID09IDApICYmIChwaHlzX2NhcnJpZXIgPT0gMSkpIHsKLQotCQkvKgotCQkgKiBXaGVuIGNhcnJpZXIgcmlzZXMsIHdha2UgYW55IHRocmVhZHMgd2FpdGluZwotCQkgKiBmb3IgY2FycmllciBpbiB0aGUgb3BlbiByb3V0aW5lLgotCQkgKi8KLQotCQlEUFJfQ0FSUigoImNhcnJpZXI6IHBoeXNpY2FsIERDRCByb3NlXG4iKSk7Ci0KLQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJihjaC0+Y2hfZmxhZ3Nfd2FpdCkpKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfZmxhZ3Nfd2FpdCk7Ci0JfQotCi0JLyoKLQkgKiAgVGVzdCBmb3IgYSBQSFlTSUNBTCB0cmFuc2l0aW9uIHRvIGxvdywgc28gbG9uZyBhcyB3ZSBhcmVuJ3QKLQkgKiAgY3VycmVudGx5IGlnbm9yaW5nIHBoeXNpY2FsIHRyYW5zaXRpb25zICh3aGljaCBpcyB3aGF0ICJ2aXJ0dWFsCi0JICogIGNhcnJpZXIiIGluZGljYXRlcykuCi0JICoKLQkgKiAgVGhlIHRyYW5zaXRpb24gb2YgdGhlIHZpcnR1YWwgY2FycmllciB0byBsb3cgcmVhbGx5IGRvZXNuJ3QKLQkgKiAgbWF0dGVyLi4uIGl0IHJlYWxseSBvbmx5IG1lYW5zICJpZ25vcmUgY2FycmllciBzdGF0ZSIsIG5vdAotCSAqICAibWFrZSBwcmV0ZW5kIHRoYXQgY2FycmllciBpcyB0aGVyZSIuCi0JICovCi0JaWYgKCh2aXJ0X2NhcnJpZXIgPT0gMCkgJiYgKChjaC0+Y2hfZmxhZ3MgJiBDSF9DRCkgIT0gMCkgJiYKLQkgICAgKHBoeXNfY2FycmllciA9PSAwKSkKLQl7Ci0KLQkJLyoKLQkJICogICBXaGVuIGNhcnJpZXIgZHJvcHM6Ci0JCSAqCi0JCSAqICAgRHJvcCBjYXJyaWVyIG9uIGFsbCBvcGVuIHVuaXRzLgotCQkgKgotCQkgKiAgIEZsdXNoIHF1ZXVlcywgd2FraW5nIHVwIGFueSB0YXNrIHdhaXRpbmcgaW4gdGhlCi0JCSAqICAgbGluZSBkaXNjaXBsaW5lLgotCQkgKgotCQkgKiAgIFNlbmQgYSBoYW5ndXAgdG8gdGhlIGNvbnRyb2wgdGVybWluYWwuCi0JCSAqCi0JCSAqICAgRW5hYmxlIGFsbCBzZWxlY3QgY2FsbHMuCi0JCSAqLwotCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKGNoLT5jaF9mbGFnc193YWl0KSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKLQotCQlpZiAoY2gtPmNoX3R1bi51bl9vcGVuX2NvdW50ID4gMCkgewotCQkJRFBSX0NBUlIoKCJTZW5kaW5nIHR0eSBoYW5ndXBcbiIpKTsKLQkJCXR0eV9oYW5ndXAoY2gtPmNoX3R1bi51bl90dHkpOwotCQl9Ci0KLQkJaWYgKGNoLT5jaF9wdW4udW5fb3Blbl9jb3VudCA+IDApIHsKLQkJCURQUl9DQVJSKCgiU2VuZGluZyBwciBoYW5ndXBcbiIpKTsKLQkJCXR0eV9oYW5ndXAoY2gtPmNoX3B1bi51bl90dHkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAgTWFrZSBzdXJlIHRoYXQgb3VyIGNhY2hlZCB2YWx1ZXMgcmVmbGVjdCB0aGUgY3VycmVudCByZWFsaXR5LgotCSAqLwotCWlmICh2aXJ0X2NhcnJpZXIgPT0gMSkKLQkJY2gtPmNoX2ZsYWdzIHw9IENIX0ZDQVI7Ci0JZWxzZQotCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX0ZDQVI7Ci0KLQlpZiAocGh5c19jYXJyaWVyID09IDEpCi0JCWNoLT5jaF9mbGFncyB8PSBDSF9DRDsKLQllbHNlCi0JCWNoLT5jaF9mbGFncyAmPSB+Q0hfQ0Q7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRUWSBFbnRyeSBwb2ludHMgYW5kIGhlbHBlciBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogZGdhcF90dHlfb3BlbigpCi0gKgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGJvYXJkX3QJKmJyZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdAkqdW47Ci0Jc3RydWN0IGJzX3QJKmJzOwotCXVpbnQJCW1ham9yID0gMDsKLQl1aW50CQltaW5vciA9IDA7Ci0JaW50CQlyYyA9IDA7Ci0JdWxvbmcJCWxvY2tfZmxhZ3M7Ci0JdWxvbmcJCWxvY2tfZmxhZ3MyOwotCXUxNgkJaGVhZDsKLQotCXJjID0gMDsKLQotCW1ham9yID0gTUFKT1IodHR5X2Rldm51bSh0dHkpKTsKLQltaW5vciA9IE1JTk9SKHR0eV9kZXZudW0odHR5KSk7Ci0KLQlpZiAobWFqb3IgPiAyNTUpIHsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBHZXQgYm9hcmQgcG9pbnRlciBmcm9tIG91ciBhcnJheSBvZiBtYWpvcnMgd2UgaGF2ZSBhbGxvY2F0ZWQgKi8KLQlicmQgPSBkZ2FwX0JvYXJkc0J5TWFqb3JbbWFqb3JdOwotCWlmICghYnJkKSB7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyoKLQkgKiBJZiBib2FyZCBpcyBub3QgeWV0IHVwIHRvIGEgc3RhdGUgb2YgUkVBRFksIGdvIHRvCi0JICogc2xlZXAgd2FpdGluZyBmb3IgaXQgdG8gaGFwcGVuIG9yIHRoZXkgY2FuY2VsIHRoZSBvcGVuLgotCSAqLwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJyZC0+c3RhdGVfd2FpdCwKLQkJKGJyZC0+c3RhdGUgJiBCT0FSRF9SRUFEWSkpOwotCi0JaWYgKHJjKSB7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlER0FQX0xPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCS8qIFRoZSB3YWl0IGFib3ZlIHNob3VsZCBndWFyYW50ZWUgdGhpcyBjYW5ub3QgaGFwcGVuICovCi0JaWYgKGJyZC0+c3RhdGUgIT0gQk9BUkRfUkVBRFkpIHsKLQkJREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBJZiBvcGVuZWQgZGV2aWNlIGlzIGdyZWF0ZXIgdGhhbiBvdXIgbnVtYmVyIG9mIHBvcnRzLCBiYWlsLiAqLwotCWlmIChNSU5PUih0dHlfZGV2bnVtKHR0eSkpID4gYnJkLT5uYXN5bmMpIHsKLQkJREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQljaCA9IGJyZC0+Y2hhbm5lbHNbbWlub3JdOwotCWlmICghY2gpIHsKLQkJREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBHcmFiIGNoYW5uZWwgbG9jayAqLwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JLyogRmlndXJlIG91dCBvdXIgdHlwZSAqLwotCWlmIChtYWpvciA9PSBicmQtPmRnYXBfU2VyaWFsX01ham9yKSB7Ci0JCXVuID0gJmJyZC0+Y2hhbm5lbHNbbWlub3JdLT5jaF90dW47Ci0JCXVuLT51bl90eXBlID0gREdBUF9TRVJJQUw7Ci0JfQotCWVsc2UgaWYgKG1ham9yID09IGJyZC0+ZGdhcF9UcmFuc3BhcmVudFByaW50X01ham9yKSB7Ci0JCXVuID0gJmJyZC0+Y2hhbm5lbHNbbWlub3JdLT5jaF9wdW47Ci0JCXVuLT51bl90eXBlID0gREdBUF9QUklOVDsKLQl9Ci0JZWxzZSB7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJyZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURQUl9PUEVOKCgiJWQgVW5rbm93biBUWVBFIVxuIiwgX19MSU5FX18pKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQkvKiBTdG9yZSBvdXIgdW5pdCBpbnRvIGRyaXZlcl9kYXRhLCBzbyB3ZSBhbHdheXMgaGF2ZSBpdCBhdmFpbGFibGUuICovCi0JdHR5LT5kcml2ZXJfZGF0YSA9IHVuOwotCi0JRFBSX09QRU4oKCJPcGVuIGNhbGxlZC4gTUFKT1I6ICVkIE1JTk9SOiVkIHVuaXQ6ICVwIE5BTUU6ICVzXG4iLAotCQlNQUpPUih0dHlfZGV2bnVtKHR0eSkpLCBNSU5PUih0dHlfZGV2bnVtKHR0eSkpLCB1biwgYnJkLT5uYW1lKSk7Ci0KLQkvKgotCSAqIEVycm9yIGlmIGNoYW5uZWwgaW5mbyBwb2ludGVyIGlzIE5VTEwuCi0JICovCi0JYnMgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykgewotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhicmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlEUFJfT1BFTigoIiVkIEJTIGlzIDAhXG4iLCBfX0xJTkVfXykpOwotCQlyZXR1cm4gLUVOWElPOwotICAgICAgICB9Ci0KLQlEUFJfT1BFTigoIiVkOiB0ZmxhZz0leCAgcGZsYWc9JXhcbiIsIF9fTElORV9fLCBjaC0+Y2hfdHVuLnVuX2ZsYWdzLCBjaC0+Y2hfcHVuLnVuX2ZsYWdzKSk7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdHR5J3MKLQkgKi8KLQlpZiAoISh1bi0+dW5fZmxhZ3MgJiBVTl9JU09QRU4pKSB7Ci0JCS8qIFN0b3JlIGltcG9ydGFudCB2YXJpYWJsZXMuICovCi0JCXVuLT51bl90dHkgICAgID0gdHR5OwotCi0JCS8qIE1heWJlIGRvIHNvbWV0aGluZyBoZXJlIHRvIHRoZSBUVFkgc3RydWN0IGFzIHdlbGw/ICovCi0JfQotCi0JLyoKLQkgKiBJbml0aWFsaXplIGlmIG5laXRoZXIgdGVybWluYWwgb3IgcHJpbnRlciBpcyBvcGVuLgotCSAqLwotCWlmICghKChjaC0+Y2hfdHVuLnVuX2ZsYWdzIHwgY2gtPmNoX3B1bi51bl9mbGFncykgJiBVTl9JU09QRU4pKSB7Ci0KLQkJRFBSX09QRU4oKCJkZ2FwX29wZW46IGluaXRpYWxpemluZyBjaGFubmVsIGluIG9wZW4uLi5cbiIpKTsKLQotCQljaC0+Y2hfbWZvcmNlID0gMDsKLQkJY2gtPmNoX212YWwgPSAwOwotCi0JCS8qCi0JCSAqIEZsdXNoIGlucHV0IHF1ZXVlLgotCQkgKi8KLQkJaGVhZCA9IHJlYWR3KCYoYnMtPnJ4X2hlYWQpKTsKLQkJd3JpdGV3KGhlYWQsICYoYnMtPnJ4X3RhaWwpKTsKLQotCQljaC0+Y2hfZmxhZ3MgPSAwOwotCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSAwOwotCi0JCWNoLT5jaF9jX2NmbGFnICAgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKLQkJY2gtPmNoX2NfaWZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2lmbGFnOwotCQljaC0+Y2hfY19vZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfb2ZsYWc7Ci0JCWNoLT5jaF9jX2xmbGFnICAgPSB0dHktPnRlcm1pb3MuY19sZmxhZzsKLQkJY2gtPmNoX3N0YXJ0YyA9IHR0eS0+dGVybWlvcy5jX2NjW1ZTVEFSVF07Ci0JCWNoLT5jaF9zdG9wYyAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RPUF07Ci0KLQkJLyogVE9ETzogZmx1c2ggb3VyIFRUWSBzdHJ1Y3QgaGVyZT8gKi8KLQl9Ci0KLQlkZ2FwX2NhcnJpZXIoY2gpOwotCS8qCi0JICogUnVuIHBhcmFtIGluIGNhc2Ugd2UgY2hhbmdlZCBhbnl0aGluZwotCSAqLwotCWRnYXBfcGFyYW0odHR5KTsKLQotCS8qCi0JICogZm9sbG93IHByb3RvY29sIGZvciBvcGVuaW5nIHBvcnQKLQkgKi8KLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYnJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXJjID0gZGdhcF9ibG9ja190aWxfcmVhZHkodHR5LCBmaWxlLCBjaCk7Ci0KLQlpZiAoIXVuLT51bl90dHkpIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKHJjKSB7Ci0JCURQUl9PUEVOKCgiZGdhcF90dHlfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgZGdhcF9ibG9ja190aWxfcmVhZHkgIgotCQkJIndpdGggJWRcbiIsIHJjKSk7Ci0JfQotCi0JLyogTm8gZ29pbmcgYmFjayBub3csIGluY3JlbWVudCBvdXIgdW5pdCBhbmQgY2hhbm5lbCBjb3VudGVycyAqLwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JY2gtPmNoX29wZW5fY291bnQrKzsKLQl1bi0+dW5fb3Blbl9jb3VudCsrOwotCXVuLT51bl9mbGFncyB8PSAoVU5fSVNPUEVOKTsKLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfT1BFTigoImRnYXBfdHR5X29wZW4gZmluaXNoZWRcbiIpKTsKLQlyZXR1cm4gKHJjKTsKLX0KLQotCi0vKgotICogZGdhcF9ibG9ja190aWxfcmVhZHkoKQotICoKLSAqIFdhaXQgZm9yIERDRCwgaWYgbmVlZGVkLgotICovCi1zdGF0aWMgaW50IGRnYXBfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOwotCXVsb25nICAgbG9ja19mbGFnczsKLQl1aW50CW9sZF9mbGFncyA9IDA7Ci0JaW50IHNsZWVwX29uX3VuX2ZsYWdzID0gMDsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDIHx8ICFmaWxlIHx8ICFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKSB7Ci0JCXJldHVybiAoLUVOWElPKTsKLQl9Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKSB7Ci0JCXJldHVybiAoLUVOWElPKTsKLQl9Ci0KLQlEUFJfT1BFTigoImRnYXBfYmxvY2tfdGlsX3JlYWR5IC0gYmVmb3JlIGJsb2NrLlxuIikpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCWNoLT5jaF93b3BlbisrOwotCi0JLyogTG9vcCBmb3JldmVyICovCi0Jd2hpbGUgKDEpIHsKLQotCQlzbGVlcF9vbl91bl9mbGFncyA9IDA7Ci0KLQkJLyoKLQkJICogSWYgYm9hcmQgaGFzIGZhaWxlZCBzb21laG93IGR1cmluZyBvdXIgc2xlZXAsIGJhaWwgd2l0aCBlcnJvci4KLQkJICovCi0JCWlmIChjaC0+Y2hfYmQtPnN0YXRlID09IEJPQVJEX0ZBSUxFRCkgewotCQkJcmV0dmFsID0gLUVOWElPOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBJZiB0dHkgd2FzIGh1bmcgdXAsIGJyZWFrIG91dCBvZiBsb29wIGFuZCBzZXQgZXJyb3IuICovCi0JCWlmICh0dHlfaHVuZ191cF9wKGZpbGUpKSB7Ci0JCQlyZXR2YWwgPSAtRUFHQUlOOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiBlaXRoZXIgdW5pdCBpcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBmcmFnaWxlIHBhcnQgb2YgY2xvc2UsCi0JCSAqIHdlIGp1c3QgY2Fubm90IHRvdWNoIHRoZSBjaGFubmVsIHNhZmVseS4KLQkJICogR28gYmFjayB0byBzbGVlcCwga25vd2luZyB0aGF0IHdoZW4gdGhlIGNoYW5uZWwgY2FuIGJlCi0JCSAqIHRvdWNoZWQgc2FmZWx5LCB0aGUgY2xvc2Ugcm91dGluZSB3aWxsIHNpZ25hbCB0aGUKLQkJICogY2hfd2FpdF9mbGFncyB0byB3YWtlIHVzIGJhY2sgdXAuCi0JCSAqLwotCQlpZiAoISgoY2gtPmNoX3R1bi51bl9mbGFncyB8IGNoLT5jaF9wdW4udW5fZmxhZ3MpICYgVU5fQ0xPU0lORykpIHsKLQotCQkJLyoKLQkJCSAqIE91ciBjb25kaXRpb25zIHRvIGxlYXZlIGNsZWFubHkgYW5kIGhhcHBpbHk6Ci0JCQkgKiAxKSBOT05CTE9DS0lORyBvbiB0aGUgdHR5IGlzIHNldC4KLQkJCSAqIDIpIENMT0NBTCBpcyBzZXQuCi0JCQkgKiAzKSBEQ0QgKGZha2Ugb3IgcmVhbCkgaXMgYWN0aXZlLgotCQkJICovCi0KLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNoLT5jaF9mbGFncyAmIENIX0NEKSB7Ci0JCQkJRFBSX09QRU4oKCIlZDogY2hfZmxhZ3M6ICV4XG4iLCBfX0xJTkVfXywgY2gtPmNoX2ZsYWdzKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9GQ0FSKSB7Ci0JCQkJRFBSX09QRU4oKCIlZDogY2hfZmxhZ3M6ICV4XG4iLCBfX0xJTkVfXywgY2gtPmNoX2ZsYWdzKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzbGVlcF9vbl91bl9mbGFncyA9IDE7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNpZ25hbCBwZW5kaW5nLCB0aGUgdXNlciBwcm9iYWJseQotCQkgKiBpbnRlcnJ1cHRlZCAoY3RybC1jKSB1cy4KLQkJICogTGVhdmUgbG9vcCB3aXRoIGVycm9yIHNldC4KLQkJICovCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJRFBSX09QRU4oKCIlZDogc2lnbmFsIHBlbmRpbmcuLi5cbiIsIF9fTElORV9fKSk7Ci0JCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBibG9ja2luZy5cbiIpKTsKLQotCQkvKgotCQkgKiBTdG9yZSB0aGUgZmxhZ3MgYmVmb3JlIHdlIGxldCBnbyBvZiBjaGFubmVsIGxvY2sKLQkJICovCi0JCWlmIChzbGVlcF9vbl91bl9mbGFncykKLQkJCW9sZF9mbGFncyA9IGNoLT5jaF90dW4udW5fZmxhZ3MgfCBjaC0+Y2hfcHVuLnVuX2ZsYWdzOwotCQllbHNlCi0JCQlvbGRfZmxhZ3MgPSBjaC0+Y2hfZmxhZ3M7Ci0KLQkJLyoKLQkJICogTGV0IGdvIG9mIGNoYW5uZWwgbG9jayBiZWZvcmUgY2FsbGluZyBzY2hlZHVsZS4KLQkJICogT3VyIHBvbGxlciB3aWxsIGdldCBhbnkgRkVQIGV2ZW50cyBhbmQgd2FrZSB1cyB1cCB3aGVuIERDRAotCQkgKiBldmVudHVhbGx5IGdvZXMgYWN0aXZlLgotCQkgKi8KLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJRFBSX09QRU4oKCJHb2luZyB0byBzbGVlcCBvbiAlcyBmbGFncy4uLlxuIiwKLQkJCShzbGVlcF9vbl91bl9mbGFncyA/ICJ1biIgOiAiY2giKSkpOwotCi0JCS8qCi0JCSAqIFdhaXQgZm9yIHNvbWV0aGluZyBpbiB0aGUgZmxhZ3MgdG8gY2hhbmdlIGZyb20gdGhlIGN1cnJlbnQgdmFsdWUuCi0JCSAqLwotCQlpZiAoc2xlZXBfb25fdW5fZmxhZ3MpIHsKLQkJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1bi0+dW5fZmxhZ3Nfd2FpdCwKLQkJCQkob2xkX2ZsYWdzICE9IChjaC0+Y2hfdHVuLnVuX2ZsYWdzIHwgY2gtPmNoX3B1bi51bl9mbGFncykpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjaC0+Y2hfZmxhZ3Nfd2FpdCwKLQkJCQkob2xkX2ZsYWdzICE9IGNoLT5jaF9mbGFncykpOwotCQl9Ci0KLQkJRFBSX09QRU4oKCJBZnRlciBzbGVlcC4uLiByZXR2YWw6ICV4XG4iLCByZXR2YWwpKTsKLQotCQkvKgotCQkgKiBXZSBnb3Qgd29rZW4gdXAgZm9yIHNvbWUgcmVhc29uLgotCQkgKiBCZWZvcmUgbG9vcGluZyBhcm91bmQsIGdyYWIgb3VyIGNoYW5uZWwgbG9jay4KLQkJICovCi0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JfQotCi0JY2gtPmNoX3dvcGVuLS07Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfT1BFTigoImRnYXBfYmxvY2tfdGlsX3JlYWR5IC0gYWZ0ZXIgYmxvY2tpbmcuXG4iKSk7Ci0KLQlpZiAocmV0dmFsKSB7Ci0JCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBkb25lLiBlcnJvci4gcmV0dmFsOiAleFxuIiwgcmV0dmFsKSk7Ci0JCXJldHVybihyZXR2YWwpOwotCX0KLQotCURQUl9PUEVOKCgiZGdhcF9ibG9ja190aWxfcmVhZHkgLSBkb25lIG5vIGVycm9yLiBqaWZmaWVzOiAlbHVcbiIsIGppZmZpZXMpKTsKLQotCXJldHVybigwKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfaGFuZ3VwKCkKLSAqCi0gKiBIYW5ndXAgdGhlIHBvcnQuICBMaWtlIGEgY2xvc2UsIGJ1dCBkb24ndCB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4uCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBib2FyZF90CSpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdAkqdW47Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfQ0xPU0UoKCJkZ2FwX2hhbmd1cCBjYWxsZWQuIGNoLT5jaF9vcGVuX2NvdW50OiAlZCB1bi0+dW5fb3Blbl9jb3VudDogJWRcbiIsCi0JCWNoLT5jaF9vcGVuX2NvdW50LCB1bi0+dW5fb3Blbl9jb3VudCkpOwotCi0JLyogZmx1c2ggdGhlIHRyYW5zbWl0IHF1ZXVlcyAqLwotCWRnYXBfdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOwotCi0JRFBSX0NMT1NFKCgiZGdhcF9oYW5ndXAgZmluaXNoZWQuIGNoLT5jaF9vcGVuX2NvdW50OiAlZCB1bi0+dW5fb3Blbl9jb3VudDogJWRcbiIsCi0JCWNoLT5jaF9vcGVuX2NvdW50LCB1bi0+dW5fb3Blbl9jb3VudCkpOwotfQotCi0KLQotLyoKLSAqIGRnYXBfdHR5X2Nsb3NlKCkKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBrdGVybWlvcyAqdHM7Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQl0cyA9ICZ0dHktPnRlcm1pb3M7Ci0KLQlEUFJfQ0xPU0UoKCJDbG9zZSBjYWxsZWRcbiIpKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkvKgotCSAqIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlIG9yIG5vdCAtIGFuZCBpZiB3ZSBhZ3JlZSBhYm91dAotCSAqIHdoaWNoIHR5cGUgb2YgY2xvc2UgaXQgaXMgd2l0aCB0aGUgTGluZSBEaXNjaXBsaW5lCi0JICovCi0JaWYgKCh0dHktPmNvdW50ID09IDEpICYmICh1bi0+dW5fb3Blbl9jb3VudCAhPSAxKSkgewotCQkvKgotCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQotCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIHVuX29wZW5fY291bnQgc2hvdWxkIGFsd2F5cwotCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCi0JCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQotCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KLQkJICovCi0JCUFQUigoInR0eS0+Y291bnQgaXMgMSwgdW4gb3BlbiBjb3VudCBpcyAlZFxuIiwgdW4tPnVuX29wZW5fY291bnQpKTsKLQkJdW4tPnVuX29wZW5fY291bnQgPSAxOwotCX0KLQotCWlmICgtLXVuLT51bl9vcGVuX2NvdW50IDwgMCkgewotCQlBUFIoKCJiYWQgc2VyaWFsIHBvcnQgb3BlbiBjb3VudCBvZiAlZFxuIiwgdW4tPnVuX29wZW5fY291bnQpKTsKLQkJdW4tPnVuX29wZW5fY291bnQgPSAwOwotCX0KLQotCWNoLT5jaF9vcGVuX2NvdW50LS07Ci0KLQlpZiAoY2gtPmNoX29wZW5fY291bnQgJiYgdW4tPnVuX29wZW5fY291bnQpIHsKLQkJRFBSX0NMT1NFKCgiZGdhcF90dHlfY2xvc2U6IG5vdCBsYXN0IGNsb3NlIGNoOiAlZCB1bjolZFxuIiwKLQkJCWNoLT5jaF9vcGVuX2NvdW50LCB1bi0+dW5fb3Blbl9jb3VudCkpOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCS8qIE9LLCBpdHMgdGhlIGxhc3QgY2xvc2Ugb24gdGhlIHVuaXQgKi8KLQlEUFJfQ0xPU0UoKCJkZ2FwX3R0eV9jbG9zZSAtIGxhc3QgY2xvc2Ugb24gdW5pdCBwcm9jZWR1cmVzXG4iKSk7Ci0KLQl1bi0+dW5fZmxhZ3MgfD0gVU5fQ0xPU0lORzsKLQotCXR0eS0+Y2xvc2luZyA9IDE7Ci0KLQkvKgotCSAqIE9ubHkgb2ZmaWNpYWxseSBjbG9zZSBjaGFubmVsIGlmIGNvdW50IGlzIDAgYW5kCi0gICAgICAgICAqIERJR0lfUFJJTlRFUiBiaXQgaXMgbm90IHNldC4KLQkgKi8KLQlpZiAoKGNoLT5jaF9vcGVuX2NvdW50ID09IDApICYmICEoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUFJJTlRFUikpIHsKLQotCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9SWEJMT0NLKTsKLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJLyogd2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluICovCi0JCS8qIFRoaXMgd2lsbCBhbHNvIHJldHVybiBpZiB3ZSB0YWtlIGFuIGludGVycnVwdCAqLwotCi0JCURQUl9DTE9TRSgoIkNhbGxpbmcgd2FpdF9mb3JfZHJhaW5cbiIpKTsKLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCURQUl9DTE9TRSgoIkFmdGVyIGNhbGxpbmcgd2FpdF9mb3JfZHJhaW5cbiIpKTsKLQotCQlpZiAocmMpIHsKLQkJCURQUl9CQVNJQygoImRnYXBfdHR5X2Nsb3NlIC0gYmFkIHJldHVybjogJWQgIiwgcmMpKTsKLQkJfQotCi0JCWRnYXBfdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOwotCQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCXR0eS0+Y2xvc2luZyA9IDA7Ci0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSBIVVBDTCBzZXQsIGxvd2VyIERUUiBhbmQgUlRTCi0JCSAqLwotCQlpZiAoY2gtPmNoX2NfY2ZsYWcgJiBIVVBDTCApIHsKLQkJCURQUl9DTE9TRSgoIkNsb3NlLiBIVVBDTCBzZXQsIGRyb3BwaW5nIERUUi9SVFNcbiIpKTsKLQkJCWNoLT5jaF9tb3N0YXQgJj0gfihEX1JUUyhjaCl8RF9EVFIoY2gpKTsKLQkJCWRnYXBfY21kYiggY2gsIFNNT0RFTSwgMCwgRF9EVFIoY2gpfERfUlRTKGNoKSwgMCApOwotCi0JCQkvKgotCQkJICogR28gdG8gc2xlZXAgdG8gZW5zdXJlIFJUUy9EVFIKLQkJCSAqIGhhdmUgYmVlbiBkcm9wcGVkIGZvciBtb2RlbXMgdG8gc2VlIGl0LgotCQkJICovCi0JCQlpZiAoY2gtPmNoX2Nsb3NlX2RlbGF5KSB7Ci0JCQkJRFBSX0NMT1NFKCgiQ2xvc2UuIFNsZWVwaW5nIGZvciBSVFMvRFRSIGRyb3BcbiIpKTsKLQotCQkJCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCQlkZ2FwX21zX3NsZWVwKGNoLT5jaF9jbG9zZV9kZWxheSk7Ci0JCQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQkJCURQUl9DTE9TRSgoIkNsb3NlLiBBZnRlciBzbGVlcGluZyBmb3IgUlRTL0RUUiBkcm9wXG4iKSk7Ci0JCQl9Ci0JCX0KLQotCQljaC0+cHNjYW5fc3RhdGUgPSAwOwotCQljaC0+cHNjYW5fc2F2ZWNoYXIgPSAwOwotCQljaC0+Y2hfYmF1ZF9pbmZvID0gMDsKLQotCX0KLQotCS8qCi0JICogdHVybiBvZmYgcHJpbnQgZGV2aWNlIHdoZW4gY2xvc2luZyBwcmludCBkZXZpY2UuCi0JICovCi0JaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAgJiYgKGNoLT5jaF9mbGFncyAmIENIX1BST04pICkgewotCQlkZ2FwX3dtb3ZlKGNoLCBjaC0+Y2hfZGlnaS5kaWdpX29mZnN0ciwKLQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKLQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9QUk9OOwotCX0KLQotCXVuLT51bl90dHkgPSBOVUxMOwotCXVuLT51bl9mbGFncyAmPSB+KFVOX0lTT1BFTiB8IFVOX0NMT1NJTkcpOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCi0JRFBSX0NMT1NFKCgiQ2xvc2UuIERvaW5nIHdha2V1cHNcbiIpKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9mbGFnc193YWl0KTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVuLT51bl9mbGFnc193YWl0KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotICAgICAgICBEUFJfQkFTSUMoKCJkZ2FwX3R0eV9jbG9zZSAtIGNvbXBsZXRlXG4iKSk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcigpCi0gKgotICogUmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBub3QgYmVlbiB0cmFuc21pdHRlZCB5ZXQuCi0gKgotICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUKLSAqIGlzIGRhdGEgd2FpdGluZyB0byBiZSB0cmFuc21pdHRlZC9kcmFpbmVkL2ZsdXNoZWQgb3Igbm90LgotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBib2FyZF90ICpiZCA9IE5VTEw7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQl1Y2hhciB0YnVzeTsKLQl1aW50IGNoYXJzID0gMDsKLQl1MTYgdGhlYWQsIHR0YWlsLCB0bWFzaywgY2hlYWQsIGN0YWlsOwotCXVsb25nICAgbG9ja19mbGFncyA9IDA7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMiA9IDA7Ci0KLQlpZiAodHR5ID09IE5VTEwpCi0JCXJldHVybigwKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKDApOwotCi0gICAgICAgIGJzID0gY2gtPmNoX2JzOwotCWlmICghYnMpCi0JCXJldHVybiAoMCk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JdG1hc2sgPSAoY2gtPmNoX3RzaXplIC0gMSk7Ci0KLQkvKiBHZXQgVHJhbnNtaXQgcXVldWUgcG9pbnRlcnMgKi8KLQl0aGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCXR0YWlsID0gcmVhZHcoJihicy0+dHhfdGFpbCkpICYgdG1hc2s7Ci0KLQkvKiBHZXQgdGJ1c3kgZmxhZyAqLwotCXRidXN5ID0gcmVhZGIoJihicy0+dGJ1c3kpKTsKLQotCS8qIEdldCBDb21tYW5kIHF1ZXVlIHBvaW50ZXJzICovCi0JY2hlYWQgPSByZWFkdygmKGNoLT5jaF9jbS0+Y21faGVhZCkpOwotCWN0YWlsID0gcmVhZHcoJihjaC0+Y2hfY20tPmNtX3RhaWwpKTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JLyoKLQkgKiBUaGUgb25seSB3YXkgd2Uga25vdyBmb3Igc3VyZSBpZiB0aGVyZSBpcyBubyBwZW5kaW5nCi0JICogZGF0YSBsZWZ0IHRvIGJlIHRyYW5zZmVycmVkLCBpcyBpZjoKLQkgKiAxKSBUcmFuc21pdCBoZWFkIGFuZCB0YWlsIGFyZSBlcXVhbCAoZW1wdHkpLgotCSAqIDIpIENvbW1hbmQgcXVldWUgaGVhZCBhbmQgdGFpbCBhcmUgZXF1YWwgKGVtcHR5KS4KLQkgKiAzKSBUaGUgIlRCVVNZIiBmbGFnIGlzIDAuIChUcmFuc21pdHRlciBub3QgYnVzeSkuCi0gCSAqLwotCi0JaWYgKCh0dGFpbCA9PSB0aGVhZCkgJiYgKHRidXN5ID09IDApICYmIChjaGVhZCA9PSBjdGFpbCkpIHsKLQkJY2hhcnMgPSAwOwotCX0KLQllbHNlIHsKLQkJaWYgKHRoZWFkID49IHR0YWlsKQotCQkJY2hhcnMgPSB0aGVhZCAtIHR0YWlsOwotCQllbHNlCi0JCQljaGFycyA9IHRoZWFkIC0gdHRhaWwgKyBjaC0+Y2hfdHNpemU7Ci0JCS8qCi0JCSAqIEZ1ZGdlIGZhY3RvciBoZXJlLgotCQkgKiBJZiBjaGFycyBpcyB6ZXJvLCB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgcXVldWUgaGFkCi0JCSAqIHNvbWV0aGluZyBpbiBpdCBvciB0YnVzeSB3YXMgc2V0LiAgQmVjYXVzZSB3ZSBjYW5ub3QKLQkJICogYmUgc3VyZSBpZiB0aGVyZSBpcyBzdGlsbCBzb21lIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQsCi0JCSAqIGxldHMgbGllLCBhbmQgdGVsbCBsZCB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LgotCQkgKi8KLQkJaWYgKGNoYXJzID09IDApIHsKLQkJCS8qCi0JCQkgKiBJZiBUQlVTWSBpcyBzdGlsbCBzZXQsIGFuZCBvdXIgdHggYnVmZmVycyBhcmUgZW1wdHksCi0JCQkgKiBmb3JjZSB0aGUgZmlybXdhcmUgdG8gc2VuZCBtZSBhbm90aGVyIHdha2V1cCBhZnRlcgotCQkJICogVEJVU1kgaGFzIGJlZW4gY2xlYXJlZC4KLQkJCSAqLwotCQkJaWYgKHRidXN5ICE9IDApIHsKLQkJCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKLQkJCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7Ci0JCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJfQotCQkJY2hhcnMgPSAxOwotCQl9Ci0JfQotCi0gCURQUl9XUklURSgoImRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlci4gUG9ydDogJXggLSAlZCAoaGVhZDogJWQgdGFpbDogJWQgdHNpemU6ICVkKVxuIiwKLQkJY2gtPmNoX3BvcnRudW0sIGNoYXJzLCB0aGVhZCwgdHRhaWwsIGNoLT5jaF90c2l6ZSkpOwotICAgICAgICByZXR1cm4oY2hhcnMpOwotfQotCi0KLXN0YXRpYyBpbnQgZGdhcF93YWl0X2Zvcl9kcmFpbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlzdHJ1Y3QgYnNfdCAqYnM7Ci0JaW50IHJldCA9IC1FSU87Ci0JdWludCBjb3VudCA9IDE7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotICAgICAgICBicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gMDsKLQotCURQUl9EUkFJTigoImRnYXBfd2FpdF9mb3JfZHJhaW4gc3RhcnRcbiIpKTsKLQotCS8qIExvb3AgdW50aWwgZGF0YSBpcyBkcmFpbmVkICovCi0Jd2hpbGUgKGNvdW50ICE9IDApIHsKLQotCQljb3VudCA9IGRnYXBfdHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpOwotCi0JCWlmIChjb3VudCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJLyogU2V0IGZsYWcgd2FpdGluZyBmb3IgZHJhaW4gKi8KLQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJdW4tPnVuX2ZsYWdzIHw9IFVOX0VNUFRZOwotCQl3cml0ZWIoMSwgJihicy0+aWVtcHR5KSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQkvKiBHbyB0byBzbGVlcCB0aWxsIHdlIGdldCB3b2tlbiB1cCAqLwotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodW4tPnVuX2ZsYWdzX3dhaXQsICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApKTsKLQkJLyogSWYgcmV0IGlzIG5vbi16ZXJvLCB1c2VyIGN0cmwtYydlZCB1cyAqLwotCQlpZiAocmV0KSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JdW4tPnVuX2ZsYWdzICY9IH4oVU5fRU1QVFkpOwotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9EUkFJTigoImRnYXBfd2FpdF9mb3JfZHJhaW4gZmluaXNoXG4iKSk7Ci0JcmV0dXJuIChyZXQpOwotfQotCi0KLS8qCi0gKiBkZ2FwX21heGNwc19yb29tCi0gKgotICogUmVkdWNlcyBieXRlc19hdmFpbGFibGUgdG8gdGhlIG1heCBudW1iZXIgb2YgY2hhcmFjdGVycwotICogdGhhdCBjYW4gYmUgc2VudCBjdXJyZW50bHkgZ2l2ZW4gdGhlIG1heGNwcyB2YWx1ZSwgYW5kCi0gKiByZXR1cm5zIHRoZSBuZXcgYnl0ZXNfYXZhaWxhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgcHJpbnRlcgotICogb3V0cHV0LgotICovCi1zdGF0aWMgaW50IGRnYXBfbWF4Y3BzX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJ5dGVzX2F2YWlsYWJsZSkKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7Ci0Jc3RydWN0IHVuX3QgKnVuID0gTlVMTDsKLQotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuIChieXRlc19hdmFpbGFibGUpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIChieXRlc19hdmFpbGFibGUpOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKGJ5dGVzX2F2YWlsYWJsZSk7Ci0KLQkvKgotCSAqIElmIGl0cyBub3QgdGhlIFRyYW5zcGFyZW50IHByaW50IGRldmljZSwgcmV0dXJuCi0JICogdGhlIGZ1bGwgZGF0YSBhbW91bnQuCi0JICovCi0JaWYgKHVuLT51bl90eXBlICE9IERHQVBfUFJJTlQpCi0JCXJldHVybiAoYnl0ZXNfYXZhaWxhYmxlKTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA+IDAgJiYgY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplID4gMCApIHsKLQkJaW50IGNwc19saW1pdCA9IDA7Ci0JCXVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lID0gamlmZmllczsKLQkJdW5zaWduZWQgbG9uZyBidWZmZXJfdGltZSA9IGN1cnJlbnRfdGltZSArCi0JCQkoSFogKiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUpIC8gY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHM7Ci0KLQkJaWYgKGNoLT5jaF9jcHN0aW1lIDwgY3VycmVudF90aW1lKSB7Ci0JCQkvKiBidWZmZXIgaXMgZW1wdHkgKi8KLQkJCWNoLT5jaF9jcHN0aW1lID0gY3VycmVudF90aW1lOyAgICAgICAgICAgIC8qIHJlc2V0IGNoX2Nwc3RpbWUgKi8KLQkJCWNwc19saW1pdCA9IGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZTsKLQkJfQotCQllbHNlIGlmIChjaC0+Y2hfY3BzdGltZSA8IGJ1ZmZlcl90aW1lKSB7Ci0JCQkvKiBzdGlsbCByb29tIGluIHRoZSBidWZmZXIgKi8KLQkJCWNwc19saW1pdCA9ICgoYnVmZmVyX3RpbWUgLSBjaC0+Y2hfY3BzdGltZSkgKiBjaC0+Y2hfZGlnaS5kaWdpX21heGNwcykgLyBIWjsKLQkJfQotCQllbHNlIHsKLQkJCS8qIG5vIHJvb20gaW4gdGhlIGJ1ZmZlciAqLwotCQkJY3BzX2xpbWl0ID0gMDsKLQkJfQotCi0JCWJ5dGVzX2F2YWlsYWJsZSA9IG1pbihjcHNfbGltaXQsIGJ5dGVzX2F2YWlsYWJsZSk7Ci0JfQotCi0JcmV0dXJuIChieXRlc19hdmFpbGFibGUpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZ2FwX3NldF9maXJtd2FyZV9ldmVudChzdHJ1Y3QgdW5fdCAqdW4sIHVuc2lnbmVkIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotICAgICAgICBicyA9IGNoLT5jaF9iczsKLQlpZiAoIWJzKQotCQlyZXR1cm47Ci0KLQlpZiAoKGV2ZW50ICYgVU5fTE9XKSAhPSAwKSB7Ci0JCWlmICgodW4tPnVuX2ZsYWdzICYgVU5fTE9XKSA9PSAwKSB7Ci0JCQl1bi0+dW5fZmxhZ3MgfD0gVU5fTE9XOwotCQkJd3JpdGViKDEsICYoYnMtPmlsb3cpKTsKLQkJfQotCX0KLQlpZiAoKGV2ZW50ICYgVU5fTE9XKSAhPSAwKSB7Ci0JCWlmICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApIHsKLQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKLQkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogZGdhcF90dHlfd3JpdGVfcm9vbSgpCi0gKgotICogUmV0dXJuIHNwYWNlIGF2YWlsYWJsZSBpbiBUeCBidWZmZXIKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQl1MTYgaGVhZCwgdGFpbCwgdG1hc2s7Ci0JaW50IHJldCA9IDA7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzID0gMDsKLQotCWlmICh0dHkgPT0gTlVMTCB8fCBkZ2FwX1RtcFdyaXRlQnVmID09IE5VTEwpCi0JCXJldHVybigwKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoMCk7Ci0KLSAgICAgICAgYnMgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykKLQkJcmV0dXJuICgwKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQl0bWFzayA9IGNoLT5jaF90c2l6ZSAtIDE7Ci0JaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCXRhaWwgPSByZWFkdygmKGJzLT50eF90YWlsKSkgJiB0bWFzazsKLQotICAgICAgICBpZiAoKHJldCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQotICAgICAgICAgICAgICAgIHJldCArPSBjaC0+Y2hfdHNpemU7Ci0KLQkvKiBMaW1pdCBwcmludGVyIHRvIG1heGNwcyAqLwotCXJldCA9IGRnYXBfbWF4Y3BzX3Jvb20odHR5LCByZXQpOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgcHJpbnRlciBkZXZpY2UsIGxlYXZlIHNwYWNlIGZvcgotCSAqIHBvc3NpYmx5IGJvdGggdGhlIG9uIGFuZCBvZmYgc3RyaW5ncy4KLQkgKi8KLQlpZiAodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgewotCQlpZiAoIShjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkKLQkJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29ubGVuOwotCQlyZXQgLT0gY2gtPmNoX2RpZ2kuZGlnaV9vZmZsZW47Ci0JfQotCWVsc2UgewotCQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikKLQkJCXJldCAtPSBjaC0+Y2hfZGlnaS5kaWdpX29mZmxlbjsKLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0ID0gMDsKLQotCS8qCi0JICogU2NoZWR1bGUgRkVQIHRvIHdha2UgdXMgdXAgaWYgbmVlZGVkLgotCSAqCi0JICogVE9ETzogIFRoaXMgbWlnaHQgYmUgb3ZlcmtpbGwuLi4KLQkgKiBEbyB3ZSByZWFsbHkgbmVlZCB0byBzY2hlZHVsZSBjYWxsYmFja3MgZnJvbSB0aGUgRkVQCi0JICogaW4gZXZlcnkgY2FzZT8gIENhbiB3ZSBnZXQgc21hcnRlciBiYXNlZCBvbiByZXQ/Ci0JICovCi0JZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfV1JJVEUoKCJkZ2FwX3R0eV93cml0ZV9yb29tIC0gJWQgdGFpbDogJWQgaGVhZDogJWRcbiIsIHJldCwgdGFpbCwgaGVhZCkpOwotCi0gICAgICAgIHJldHVybihyZXQpOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9wdXRfY2hhcigpCi0gKgotICogUHV0IGEgY2hhcmFjdGVyIGludG8gY2gtPmNoX2J1ZgotICoKLSAqICAgICAgLSB1c2VkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgZm9yIE9QT1NUIHByb2Nlc3NpbmcKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGMpCi17Ci0JLyoKLQkgKiBTaW1wbHkgY2FsbCB0dHlfd3JpdGUuCi0JICovCi0JRFBSX1dSSVRFKCgiZGdhcF90dHlfcHV0X2NoYXIgY2FsbGVkXG4iKSk7Ci0JZGdhcF90dHlfd3JpdGUodHR5LCAmYywgMSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3dyaXRlKCkKLSAqCi0gKiBUYWtlIGRhdGEgZnJvbSB0aGUgdXNlciBvciBrZXJuZWwgYW5kIHNlbmQgaXQgb3V0IHRvIHRoZSBGRVAuCi0gKiBJbiBoZXJlIGV4aXN0cyBhbGwgdGhlIFRyYW5zcGFyZW50IFByaW50IG1hZ2ljIGFzIHdlbGwuCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2ggPSBOVUxMOwotCXN0cnVjdCB1bl90ICp1biA9IE5VTEw7Ci0Jc3RydWN0IGJzX3QgKmJzID0gTlVMTDsKLQljaGFyICp2YWRkciA9IE5VTEw7Ci0JdTE2IGhlYWQsIHRhaWwsIHRtYXNrLCByZW1haW47Ci0JaW50IGJ1ZmNvdW50ID0gMCwgbiA9IDA7Ci0JaW50IG9yaWdfY291bnQgPSAwOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JaW50IGZyb21fdXNlciA9IDA7Ci0KLQlpZiAodHR5ID09IE5VTEwgfHwgZGdhcF9UbXBXcml0ZUJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4oMCk7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKDApOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4oMCk7Ci0KLSAgICAgICAgYnMgPSBjaC0+Y2hfYnM7Ci0JaWYgKCFicykKLQkJcmV0dXJuKDApOwotCi0JaWYgKCFjb3VudCkKLQkJcmV0dXJuKDApOwotCi0JRFBSX1dSSVRFKCgiZGdhcF90dHlfd3JpdGU6IFBvcnQ6ICV4IHR0eT0lcCB1c2VyPSVkIGxlbj0lZFxuIiwKLQkJY2gtPmNoX3BvcnRudW0sIHR0eSwgZnJvbV91c2VyLCBjb3VudCkpOwotCi0JLyoKLQkgKiBTdG9yZSBvcmlnaW5hbCBhbW91bnQgb2YgY2hhcmFjdGVycyBwYXNzZWQgaW4uCi0JICogVGhpcyBoZWxwcyB0byBmaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBhc2sgdGhlIEZFUAotCSAqIHRvIHNlbmQgdXMgYW4gZXZlbnQgd2hlbiBpdCBoYXMgbW9yZSBzcGFjZSBhdmFpbGFibGUuCi0JICovCi0Jb3JpZ19jb3VudCA9IGNvdW50OwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCS8qIEdldCBvdXIgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGUgY2hhbm5lbCBmcm9tIHRoZSBib2FyZCAqLwotCXRtYXNrID0gY2gtPmNoX3RzaXplIC0gMTsKLQloZWFkID0gcmVhZHcoJihicy0+dHhfaGVhZCkpICYgdG1hc2s7Ci0JdGFpbCA9IHJlYWR3KCYoYnMtPnR4X3RhaWwpKSAmIHRtYXNrOwotCi0JaWYgKChidWZjb3VudCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQotCQlidWZjb3VudCArPSBjaC0+Y2hfdHNpemU7Ci0KLQlEUFJfV1JJVEUoKCIlZDogYnVmY291bnQ6ICV4IGNvdW50OiAleCB0YWlsOiAleCBoZWFkOiAleCB0bWFzazogJXhcbiIsCi0JCV9fTElORV9fLCBidWZjb3VudCwgY291bnQsIHRhaWwsIGhlYWQsIHRtYXNrKSk7Ci0KLQkvKgotCSAqIExpbWl0IHByaW50ZXIgb3V0cHV0IHRvIG1heGNwcyBvdmVyYWxsLCB3aXRoIGJ1cnN0cyBhbGxvd2VkCi0JICogdXAgdG8gYnVmc2l6ZSBjaGFyYWN0ZXJzLgotCSAqLwotCWJ1ZmNvdW50ID0gZGdhcF9tYXhjcHNfcm9vbSh0dHksIGJ1ZmNvdW50KTsKLQotCS8qCi0JICogVGFrZSBtaW5pbXVtIG9mIHdoYXQgdGhlIHVzZXIgd2FudHMgdG8gc2VuZCwgYW5kIHRoZQotCSAqIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgRkVQIGJ1ZmZlci4KLQkgKi8KLQljb3VudCA9IG1pbihjb3VudCwgYnVmY291bnQpOwotCi0JLyoKLQkgKiBCYWlsIGlmIG5vIHNwYWNlIGxlZnQuCi0JICovCi0JaWYgKGNvdW50IDw9IDApIHsKLQkJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JLyoKLQkgKiBPdXRwdXQgdGhlIHByaW50ZXIgT04gc3RyaW5nLCBpZiB3ZSBhcmUgaW4gdGVybWluYWwgbW9kZSwgYnV0Ci0JICogbmVlZCB0byBiZSBpbiBwcmludGVyIG1vZGUuCi0JICovCi0JaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAhKGNoLT5jaF9mbGFncyAmIENIX1BST04pKSB7Ci0JCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb25zdHIsCi0JCSAgICAoaW50KSBjaC0+Y2hfZGlnaS5kaWdpX29ubGVuKTsKLQkJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCQljaC0+Y2hfZmxhZ3MgfD0gQ0hfUFJPTjsKLQl9Ci0KLQkvKgotCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBvdXRwdXQgdGhlIHByaW50ZXIgT0ZGIHN0cmluZywgaWYgd2UgYXJlCi0JICogY3VycmVudGx5IGluIHByaW50ZXIgbW9kZSwgYnV0IG5lZWQgdG8gb3V0cHV0IHRvIHRoZSB0ZXJtaW5hbC4KLQkgKi8KLQlpZiAoKHVuLT51bl90eXBlICE9IERHQVBfUFJJTlQpICYmIChjaC0+Y2hfZmxhZ3MgJiBDSF9QUk9OKSkgewotCQlkZ2FwX3dtb3ZlKGNoLCBjaC0+Y2hfZGlnaS5kaWdpX29mZnN0ciwKLQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKLQkJaGVhZCA9IHJlYWR3KCYoYnMtPnR4X2hlYWQpKSAmIHRtYXNrOwotCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1BST047Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gY29weSwgb3IgSSBjYW4ndCBoYW5kbGUgYW55IG1vcmUgZGF0YSwgbGVhdmUuCi0JICovCi0JaWYgKGNvdW50IDw9IDApIHsKLQkJZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JaWYgKGZyb21fdXNlcikgewotCi0JCWNvdW50ID0gbWluKGNvdW50LCBXUklURUJVRkxFTik7Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCS8qCi0JCSAqIElmIGRhdGEgaXMgY29taW5nIGZyb20gdXNlciBzcGFjZSwgY29weSBpdCBpbnRvIGEgdGVtcG9yYXJ5Ci0JCSAqIGJ1ZmZlciBzbyB3ZSBkb24ndCBnZXQgc3dhcHBlZCBvdXQgd2hpbGUgZG9pbmcgdGhlIGNvcHkgdG8KLQkJICogdGhlIGJvYXJkLgotCQkgKi8KLQkJLyogd2UncmUgYWxsb3dlZCB0byBibG9jayBpZiBpdCdzIGZyb21fdXNlciAqLwotCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZ2FwX1RtcFdyaXRlU2VtKSkgewotCQkJcmV0dXJuICgtRUlOVFIpOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGRnYXBfVG1wV3JpdGVCdWYsIChjb25zdCB1Y2hhciBfX3VzZXIgKikgYnVmLCBjb3VudCkpIHsKLQkJCXVwKCZkZ2FwX1RtcFdyaXRlU2VtKTsKLQkJCXByaW50aygiV3JpdGU6IENvcHkgZnJvbSB1c2VyIGZhaWxlZCFcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCWJ1ZiA9IGRnYXBfVG1wV3JpdGVCdWY7Ci0JfQotCi0JbiA9IGNvdW50OwotCi0JLyoKLQkgKiBJZiB0aGUgd3JpdGUgd3JhcHMgb3ZlciB0aGUgdG9wIG9mIHRoZSBjaXJjdWxhciBidWZmZXIsCi0JICogbW92ZSB0aGUgcG9ydGlvbiB1cCB0byB0aGUgd3JhcCBwb2ludCwgYW5kIHJlc2V0IHRoZQotCSAqIHBvaW50ZXJzIHRvIHRoZSBib3R0b20uCi0JICovCi0JcmVtYWluID0gY2gtPmNoX3RzdGFydCArIGNoLT5jaF90c2l6ZSAtIGhlYWQ7Ci0KLQlpZiAobiA+PSByZW1haW4pIHsKLQkJbiAtPSByZW1haW47Ci0JCXZhZGRyID0gY2gtPmNoX3RhZGRyICsgaGVhZDsKLQotCQltZW1jcHlfdG9pbyh2YWRkciwgKHVjaGFyICopIGJ1ZiwgcmVtYWluKTsKLQkJZGdhcF9zbmlmZl9ub3dhaXRfbm9sb2NrKGNoLCAiVVNFUiBXUklURSIsICh1Y2hhciAqKSBidWYsIHJlbWFpbik7Ci0KLQkJaGVhZCA9IGNoLT5jaF90c3RhcnQ7Ci0JCWJ1ZiArPSByZW1haW47Ci0JfQotCi0JaWYgKG4gPiAwKSB7Ci0KLQkJLyoKLQkJICogTW92ZSByZXN0IG9mIGRhdGEuCi0JCSAqLwotCQl2YWRkciA9IGNoLT5jaF90YWRkciArIGhlYWQ7Ci0JCXJlbWFpbiA9IG47Ci0KLQkJbWVtY3B5X3RvaW8odmFkZHIsICh1Y2hhciAqKSBidWYsIHJlbWFpbik7Ci0JCWRnYXBfc25pZmZfbm93YWl0X25vbG9jayhjaCwgIlVTRVIgV1JJVEUiLCAodWNoYXIgKikgYnVmLCByZW1haW4pOwotCi0JCWhlYWQgKz0gcmVtYWluOwotCi0JfQotCi0JaWYgKGNvdW50KSB7Ci0JCWNoLT5jaF90eGNvdW50ICs9IGNvdW50OwotCQloZWFkICY9IHRtYXNrOwotCQl3cml0ZXcoaGVhZCwgJihicy0+dHhfaGVhZCkpOwotCX0KLQotCi0JZGdhcF9zZXRfZmlybXdhcmVfZXZlbnQodW4sIFVOX0xPVyB8IFVOX0VNUFRZKTsKLQotCS8qCi0JICogSWYgdGhpcyBpcyB0aGUgcHJpbnQgZGV2aWNlLCBhbmQgdGhlCi0JICogcHJpbnRlciBpcyBzdGlsbCBvbiwgd2UgbmVlZCB0byB0dXJuIGl0Ci0JICogb2ZmIGJlZm9yZSBnb2luZyBpZGxlLiAgSWYgdGhlIGJ1ZmZlciBpcwotCSAqIG5vbi1lbXB0eSwgd2FpdCB1bnRpbCBpdCBnb2VzIGVtcHR5LgotCSAqIE90aGVyd2lzZSB0dXJuIGl0IG9mZiByaWdodCBub3cuCi0JICovCi0JaWYgKCh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSAmJiAoY2gtPmNoX2ZsYWdzICYgQ0hfUFJPTikpIHsKLQkJdGFpbCA9IHJlYWR3KCYoYnMtPnR4X3RhaWwpKSAmIHRtYXNrOwotCi0JCWlmICh0YWlsICE9IGhlYWQpIHsKLQkJCXVuLT51bl9mbGFncyB8PSBVTl9FTVBUWTsKLQkJCXdyaXRlYigxLCAmKGJzLT5pZW1wdHkpKTsKLQkJfQotCQllbHNlIHsKLQkJCWRnYXBfd21vdmUoY2gsIGNoLT5jaF9kaWdpLmRpZ2lfb2Zmc3RyLAotCQkJCShpbnQpIGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuKTsKLQkJCWhlYWQgPSByZWFkdygmKGJzLT50eF9oZWFkKSkgJiB0bWFzazsKLQkJCWNoLT5jaF9mbGFncyAmPSB+Q0hfUFJPTjsKLQkJfQotCX0KLQotCS8qIFVwZGF0ZSBwcmludGVyIGJ1ZmZlciBlbXB0eSB0aW1lLiAqLwotCWlmICgodW4tPnVuX3R5cGUgPT0gREdBUF9QUklOVCkgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCkKLQkgICAgJiYgKGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgY2gtPmNoX2Nwc3RpbWUgKz0gKEhaICogY291bnQpIC8gY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHM7Ci0JfQotCi0JaWYgKGZyb21fdXNlcikgewotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0JCXVwKCZkZ2FwX1RtcFdyaXRlU2VtKTsKLQl9Ci0JZWxzZSB7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl9Ci0KLQlEUFJfV1JJVEUoKCJXcml0ZSBmaW5pc2hlZCAtIFdyaXRlICVkIGJ5dGVzIG9mICVkLlxuIiwgY291bnQsIG9yaWdfY291bnQpKTsKLQotCXJldHVybiAoY291bnQpOwotfQotCi0KLQotLyoKLSAqIFJldHVybiBtb2RlbSBzaWduYWxzIHRvIGxkLgotICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOSkKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLSNlbHNlCi1zdGF0aWMgaW50IGRnYXBfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQotI2VuZGlmCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCByZXN1bHQgPSAtRUlPOwotCXVjaGFyIG1zdGF0ID0gMDsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfdGlvY21nZXQgc3RhcnRcbiIpKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQltc3RhdCA9IHJlYWRiKCYoY2gtPmNoX2JzLT5tX3N0YXQpKTsKLSAgICAgICAgLyogQXBwZW5kIGFueSBvdXRib3VuZCBzaWduYWxzIHRoYXQgbWlnaHQgYmUgcGVuZGluZy4uLiAqLwotICAgICAgICBtc3RhdCB8PSBjaC0+Y2hfbW9zdGF0OwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JcmVzdWx0ID0gMDsKLQotCWlmIChtc3RhdCAmIERfRFRSKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0RUUjsKLQlpZiAobXN0YXQgJiBEX1JUUyhjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9SVFM7Ci0JaWYgKG1zdGF0ICYgRF9DVFMoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fQ1RTOwotCWlmIChtc3RhdCAmIERfRFNSKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKLQlpZiAobXN0YXQgJiBEX1JJKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX1JJOwotCWlmIChtc3RhdCAmIERfQ0QoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fQ0Q7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV90aW9jbWdldCBmaW5pc2hcbiIpKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X3Rpb2Ntc2V0KCkKLSAqCi0gKiBTZXQgbW9kZW0gc2lnbmFscywgY2FsbGVkIGJ5IGxkLgotICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzOSkKLXN0YXRpYyBpbnQgZGdhcF90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi0jZWxzZQotc3RhdGljIGludCBkZ2FwX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQotI2VuZGlmCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgcmV0ID0gLUVJTzsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3Rpb2Ntc2V0IHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JaWYgKHNldCAmIFRJT0NNX1JUUykgewotCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKLQkJY2gtPmNoX212YWwgICB8PSBEX1JUUyhjaCk7Ci0gICAgICAgIH0KLQotCWlmIChzZXQgJiBUSU9DTV9EVFIpIHsKLQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7Ci0JCWNoLT5jaF9tdmFsICAgfD0gRF9EVFIoY2gpOwotICAgICAgICB9Ci0KLQlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKLQkJY2gtPmNoX21mb3JjZSB8PSBEX1JUUyhjaCk7Ci0JCWNoLT5jaF9tdmFsICAgJj0gfihEX1JUUyhjaCkpOwotICAgICAgICB9Ci0KLQlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpIHsKLQkJY2gtPmNoX21mb3JjZSB8PSBEX0RUUihjaCk7Ci0JCWNoLT5jaF9tdmFsICAgJj0gfihEX0RUUihjaCkpOwotICAgICAgICB9Ci0KLQlkZ2FwX3BhcmFtKHR0eSk7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3Rpb2Ntc2V0IGZpbmlzaFxuIikpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9zZW5kX2JyZWFrKCkKLSAqCi0gKiBTZW5kIGEgQnJlYWssIGNhbGxlZCBieSBsZC4KLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9zZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBtc2VjKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50IHJldCA9IC1FSU87Ci0JdWxvbmcgbG9ja19mbGFnczsKLQl1bG9uZyBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQlzd2l0Y2ggKG1zZWMpIHsKLQljYXNlIC0xOgotCQltc2VjID0gMHhGRkZGOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCW1zZWMgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltc2VjIC89IDEwOwotCQlicmVhazsKLQl9Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zZW5kX2JyZWFrIHN0YXJ0IDEuICAlbHhcbiIsIGppZmZpZXMpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0jaWYgMAotCWRnYXBfY21kdyhjaCwgU0JSRUFLLCAodTE2KSBTQlJFQUtfVElNRSwgMCk7Ci0jZW5kaWYKLQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgbXNlYywgMCk7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3NlbmRfYnJlYWsgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0KLQotCi0vKgotICogZGdhcF90dHlfd2FpdF91bnRpbF9zZW50KCkKLSAqCi0gKiB3YWl0IHVudGlsIGRhdGEgaGFzIGJlZW4gdHJhbnNtaXR0ZWQsIGNhbGxlZCBieSBsZC4KLSAqLwotc3RhdGljIHZvaWQgZGdhcF90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQotewotCWludCByYzsKLQlyYyA9IGRnYXBfd2FpdF9mb3JfZHJhaW4odHR5KTsKLQlpZiAocmMpIHsKLQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQlyZXR1cm47Ci0JfQotCXJldHVybjsKLX0KLQotCi0KLS8qCi0gKiBkZ2FwX3NlbmRfeGNoYXIoKQotICoKLSAqIHNlbmQgYSBoaWdoIHByaW9yaXR5IGNoYXJhY3RlciwgY2FsbGVkIGJ5IGxkLgotICovCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgYykKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgbG9ja19mbGFnczI7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zZW5kX3hjaGFyIHN0YXJ0IDEuICAlbHhcbiIsIGppZmZpZXMpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkvKgotCSAqIFRoaXMgaXMgdGVjaG5pY2FsbHkgd2hhdCB3ZSBzaG91bGQgZG8uCi0JICogSG93ZXZlciwgdGhlIE5JU1QgdGVzdHMgc3BlY2lmaWNhbGx5IHdhbnQKLQkgKiB0byBzZWUgZWFjaCBYT04gb3IgWE9GRiBjaGFyYWN0ZXIgdGhhdCBpdAotCSAqIHNlbmRzLCBzbyBsZXRzIGp1c3Qgc2VuZCBlYWNoIGNoYXJhY3RlcgotCSAqIGJ5IGhhbmQuLi4KLQkgKi8KLSNpZiAwCi0JaWYgKGMgPT0gU1RPUF9DSEFSKHR0eSkpIHsKLQkJZGdhcF9jbWR3KGNoLCBSUEFVU0UsIDAsIDApOwotCX0KLQllbHNlIGlmIChjID09IFNUQVJUX0NIQVIodHR5KSkgewotCQlkZ2FwX2NtZHcoY2gsIFJSRVNVTUUsIDAsIDApOwotCX0KLQllbHNlIHsKLQkJZGdhcF93bW92ZShjaCwgJmMsIDEpOwotCX0KLSNlbHNlCi0JZGdhcF93bW92ZShjaCwgJmMsIDEpOwotI2VuZGlmCi0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X3NlbmRfeGNoYXIgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotCi0KLS8qCi0gKiBSZXR1cm4gbW9kZW0gc2lnbmFscyB0byBsZC4KLSAqLwotc3RhdGljIGludCBkZ2FwX2dldF9tb2RlbV9pbmZvKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1Y2hhciBtc3RhdCA9IDA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQlpbnQgcmMgPSAwOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF9nZXRfbW9kZW1faW5mbyBzdGFydFxuIikpOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4oLUVOWElPKTsKLQotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFncyk7Ci0KLQltc3RhdCA9IHJlYWRiKCYoY2gtPmNoX2JzLT5tX3N0YXQpKTsKLQkvKiBBcHBlbmQgYW55IG91dGJvdW5kIHNpZ25hbHMgdGhhdCBtaWdodCBiZSBwZW5kaW5nLi4uICovCi0JbXN0YXQgfD0gY2gtPmNoX21vc3RhdDsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCXJlc3VsdCA9IDA7Ci0KLQlpZiAobXN0YXQgJiBEX0RUUihjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9EVFI7Ci0JaWYgKG1zdGF0ICYgRF9SVFMoY2gpKQotCQlyZXN1bHQgfD0gVElPQ01fUlRTOwotCWlmIChtc3RhdCAmIERfQ1RTKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0NUUzsKLQlpZiAobXN0YXQgJiBEX0RTUihjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9EU1I7Ci0JaWYgKG1zdGF0ICYgRF9SSShjaCkpCi0JCXJlc3VsdCB8PSBUSU9DTV9SSTsKLQlpZiAobXN0YXQgJiBEX0NEKGNoKSkKLQkJcmVzdWx0IHw9IFRJT0NNX0NEOwotCi0JcmMgPSBwdXRfdXNlcihyZXN1bHQsIHZhbHVlKTsKLQotCURQUl9JT0NUTCgoImRnYXBfZ2V0X21vZGVtX2luZm8gZmluaXNoXG4iKSk7Ci0JcmV0dXJuKHJjKTsKLX0KLQotCi0vKgotICogZGdhcF9zZXRfbW9kZW1faW5mbygpCi0gKgotICogU2V0IG1vZGVtIHNpZ25hbHMsIGNhbGxlZCBieSBsZC4KLSAqLwotc3RhdGljIGludCBkZ2FwX3NldF9tb2RlbV9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCByZXQgPSAtRU5YSU87Ci0JdW5zaWduZWQgaW50IGFyZyA9IDA7Ci0JdWxvbmcgbG9ja19mbGFnczsKLQl1bG9uZyBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3NldF9tb2RlbV9pbmZvKCkgc3RhcnRcbiIpKTsKLQotCXJldCA9IGdldF91c2VyKGFyZywgdmFsdWUpOwotCWlmIChyZXQpIHsKLQkJRFBSX0lPQ1RMKCgiZGdhcF9zZXRfbW9kZW1faW5mbyAlZCByZXQ6ICV4LiBmaW5pc2hlZC5cbiIsIF9fTElORV9fLCByZXQpKTsKLQkJcmV0dXJuKHJldCk7Ci0JfQotCi0JRFBSX0lPQ1RMKCgiZGdhcF9zZXRfbW9kZW1faW5mbzogY29tbWFuZDogJXggYXJnOiAleFxuIiwgY29tbWFuZCwgYXJnKSk7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFRJT0NNQklTOgotCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7Ci0JCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKLQkJCWNoLT5jaF9tdmFsICAgfD0gRF9SVFMoY2gpOwotICAgICAgICAJfQotCi0JCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKLQkJCWNoLT5jaF9tZm9yY2UgfD0gRF9EVFIoY2gpOwotCQkJY2gtPmNoX212YWwgICB8PSBEX0RUUihjaCk7Ci0gICAgICAgIAl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFRJT0NNQklDOgotCQlpZiAoYXJnICYgVElPQ01fUlRTKSB7Ci0JCQljaC0+Y2hfbWZvcmNlIHw9IERfUlRTKGNoKTsKLQkJCWNoLT5jaF9tdmFsICAgJj0gfihEX1JUUyhjaCkpOwotICAgICAgICAJfQotCi0JCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKLQkJCWNoLT5jaF9tZm9yY2UgfD0gRF9EVFIoY2gpOwotCQkJY2gtPmNoX212YWwgICAmPSB+KERfRFRSKGNoKSk7Ci0gICAgICAgIAl9Ci0KLQkJYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUSU9DTVNFVDoKLQkJY2gtPmNoX21mb3JjZSA9IERfRFRSKGNoKXxEX1JUUyhjaCk7Ci0KLQkJaWYgKGFyZyAmIFRJT0NNX1JUUykgewotCQkJY2gtPmNoX212YWwgfD0gRF9SVFMoY2gpOwotICAgICAgICAJfQotCQllbHNlIHsKLQkJCWNoLT5jaF9tdmFsICY9IH4oRF9SVFMoY2gpKTsKLQkJfQotCi0JCWlmIChhcmcgJiBUSU9DTV9EVFIpIHsKLQkJCWNoLT5jaF9tdmFsIHw9IChEX0RUUihjaCkpOwotICAgICAgICAJfQotCQllbHNlIHsKLQkJCWNoLT5jaF9tdmFsICY9IH4oRF9EVFIoY2gpKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuKC1FSU5WQUwpOwotCX0KLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQlkZ2FwX3BhcmFtKHR0eSk7Ci0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfc2V0X21vZGVtX2luZm8gZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9kaWdpZ2V0YSgpCi0gKgotICogSW9jdGwgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgZGl0dHkuCi0gKgotICoKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGRpZ2lfdCBfX3VzZXIgKnJldGluZm8pCi17Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCXN0cnVjdCBkaWdpX3QgdG1wOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQltZW1jcHkoJnRtcCwgJmNoLT5jaF9kaWdpLCBzaXplb2YodG1wKSk7Ci0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lzZXRhKCkKLSAqCi0gKiBJb2N0bCB0byBzZXQgdGhlIGluZm9ybWF0aW9uIGZvciBkaXR0eS4KLSAqCi0gKgotICoKLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpc2V0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZGlnaV90IF9fdXNlciAqbmV3X2luZm8pCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlzdHJ1Y3QgZGlnaV90IG5ld19kaWdpOwotCXVsb25nICAgbG9ja19mbGFncyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzMjsKLQotCURQUl9JT0NUTCgoIkRJR0lfU0VUQSBzdGFydFxuIikpOwotCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJm5ld19kaWdpLCBuZXdfaW5mbywgc2l6ZW9mKHN0cnVjdCBkaWdpX3QpKSkgewotCQlEUFJfSU9DVEwoKCJESUdJX1NFVEEgZmFpbGVkIGNvcHlfZnJvbV91c2VyXG4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKC1FRkFVTFQpOwotCX0KLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQltZW1jcHkoJmNoLT5jaF9kaWdpLCAmbmV3X2RpZ2ksIHNpemVvZihzdHJ1Y3QgZGlnaV90KSk7Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPCAxKQotCQljaC0+Y2hfZGlnaS5kaWdpX21heGNwcyA9IDE7Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPiAxMDAwMCkKLQkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjcHMgPSAxMDAwMDsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPCAxMCkKLQkJY2gtPmNoX2RpZ2kuZGlnaV9idWZzaXplID0gMTA7Ci0KLQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyIDwgMSkKLQkJY2gtPmNoX2RpZ2kuZGlnaV9tYXhjaGFyID0gMTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX21heGNoYXIgPiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUpCi0JCWNoLT5jaF9kaWdpLmRpZ2lfbWF4Y2hhciA9IGNoLT5jaF9kaWdpLmRpZ2lfYnVmc2l6ZTsKLQotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX29ubGVuID4gRElHSV9QTEVOKQotCQljaC0+Y2hfZGlnaS5kaWdpX29ubGVuID0gRElHSV9QTEVOOwotCi0JaWYgKGNoLT5jaF9kaWdpLmRpZ2lfb2ZmbGVuID4gRElHSV9QTEVOKQotCQljaC0+Y2hfZGlnaS5kaWdpX29mZmxlbiA9IERJR0lfUExFTjsKLQotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRBIGZpbmlzaFxuIikpOwotCi0JcmV0dXJuKDApOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9kaWdpZ2V0ZWRlbGF5KCkKLSAqCi0gKiBJb2N0bCB0byBnZXQgdGhlIGN1cnJlbnQgZWRlbGF5IHNldHRpbmcuCi0gKgotICoKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaWdldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgdG1wOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl0bXAgPSByZWFkdygmKGNoLT5jaF9icy0+ZWRlbGF5KSk7Ci0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lzZXRlZGVsYXkoKQotICoKLSAqIElvY3RsIHRvIHNldCB0aGUgRURFTEFZIHNldHRpbmcKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZGdhcF90dHlfZGlnaXNldGVkZWxheShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpuZXdfaW5mbykKLXsKLQlzdHJ1Y3QgYm9hcmRfdCAqYmQ7Ci0Jc3RydWN0IGNoYW5uZWxfdCAqY2g7Ci0Jc3RydWN0IHVuX3QgKnVuOwotCWludCBuZXdfZGlnaTsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRBIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2RpZ2ksIG5ld19pbmZvLCBzaXplb2YoaW50KSkpIHsKLQkJRFBSX0lPQ1RMKCgiRElHSV9TRVRFREVMQVkgZmFpbGVkIGNvcHlfZnJvbV91c2VyXG4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKC1FRkFVTFQpOwotCX0KLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQl3cml0ZXcoKHUxNikgbmV3X2RpZ2ksICYoY2gtPmNoX2JzLT5lZGVsYXkpKTsKLQotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRBIGZpbmlzaFxuIikpOwotCi0JcmV0dXJuKDApOwotfQotCi0KLS8qCi0gKiBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZCgpCi0gKgotICogSW9jdGwgdG8gZ2V0IHRoZSBjdXJyZW50IGN1c3RvbSBiYXVkIHJhdGUgc2V0dGluZy4KLSAqLwotc3RhdGljIGludCBkZ2FwX3R0eV9kaWdpZ2V0Y3VzdG9tYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpyZXRpbmZvKQotewotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQlpbnQgdG1wOwotCXVsb25nIGxvY2tfZmxhZ3M7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCi0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl0bXAgPSBkZ2FwX2dldF9jdXN0b21fYmF1ZChjaCk7Ci0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9HRVRDVVNUT01CQVVELiBSZXR1cm5pbmcgJWRcbiIsIHRtcCkpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKCkKLSAqCi0gKiBJb2N0bCB0byBzZXQgdGhlIGN1c3RvbSBiYXVkIHJhdGUgc2V0dGluZwotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKm5ld19pbmZvKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JdWludCBuZXdfcmF0ZTsKLQl1bG9uZyBsb2NrX2ZsYWdzOwotCXVsb25nIGxvY2tfZmxhZ3MyOwotCi0JRFBSX0lPQ1RMKCgiRElHSV9TRVRDVVNUT01CQVVEIHN0YXJ0XG4iKSk7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQotCXVuID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXVuIHx8IHVuLT5tYWdpYyAhPSBER0FQX1VOSVRfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQljaCA9IHVuLT51bl9jaDsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybiAoLUVGQVVMVCk7Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19yYXRlLCBuZXdfaW5mbywgc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB7Ci0JCURQUl9JT0NUTCgoIkRJR0lfU0VUQ1VTVE9NQkFVRCBmYWlsZWQgY29weV9mcm9tX3VzZXJcbiIpKTsKLQkJcmV0dXJuKC1FRkFVTFQpOwotCX0KLQotCWlmIChiZC0+YmRfZmxhZ3MgJiBCRF9GRVA1UExVUykgewotCi0JCURQUl9JT0NUTCgoIkRJR0lfU0VUQ1VTVE9NQkFVRC4gU2V0dGluZyAlZFxuIiwgbmV3X3JhdGUpKTsKLQotCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQljaC0+Y2hfY3VzdG9tX3NwZWVkID0gbmV3X3JhdGU7Ci0KLQkJZGdhcF9wYXJhbSh0dHkpOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQl9Ci0KLQlEUFJfSU9DVEwoKCJESUdJX1NFVENVU1RPTUJBVUQgZmluaXNoXG4iKSk7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLQotLyoKLSAqIGRnYXBfc2V0X3Rlcm1pb3MoKQotICovCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczI7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdBUF9DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JY2gtPmNoX2NfY2ZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2NmbGFnOwotCWNoLT5jaF9jX2lmbGFnICAgPSB0dHktPnRlcm1pb3MuY19pZmxhZzsKLQljaC0+Y2hfY19vZmxhZyAgID0gdHR5LT50ZXJtaW9zLmNfb2ZsYWc7Ci0JY2gtPmNoX2NfbGZsYWcgICA9IHR0eS0+dGVybWlvcy5jX2xmbGFnOwotCWNoLT5jaF9zdGFydGMgICAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RBUlRdOwotCWNoLT5jaF9zdG9wYyAgICAgPSB0dHktPnRlcm1pb3MuY19jY1tWU1RPUF07Ci0KLQlkZ2FwX2NhcnJpZXIoY2gpOwotCWRnYXBfcGFyYW0odHR5KTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV90aHJvdHRsZSBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWNoLT5jaF9mbGFncyB8PSAoQ0hfUlhCTE9DSyk7Ci0jaWYgMQotCWRnYXBfY21kdyhjaCwgUlBBVVNFLCAwLCAwKTsKLSNlbmRpZgotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV90aHJvdHRsZSBmaW5pc2hcbiIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV91bnRocm90dGxlIHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JY2gtPmNoX2ZsYWdzICY9IH4oQ0hfUlhCTE9DSyk7Ci0KLSNpZiAxCi0JZGdhcF9jbWR3KGNoLCBSUkVTVU1FLCAwLCAwKTsKLSNlbmRpZgotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV91bnRocm90dGxlIGZpbmlzaFxuIikpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zdGFydCBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOwotCi0JREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zdGFydCBmaW5pc2hcbiIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkZ2FwX3R0eV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9zdG9wIHN0YXJ0XG4iKSk7Ci0KLQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCi0JZGdhcF9jbWR3KGNoLCBQQVVTRVRYLCAwLCAwKTsKLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfc3RvcCBmaW5pc2hcbiIpKTsKLX0KLQotCi0vKgotICogZGdhcF90dHlfZmx1c2hfY2hhcnMoKQotICoKLSAqIEZsdXNoIHRoZSBjb29rIGJ1ZmZlcgotICoKLSAqIE5vdGUgdG8gc2VsZiwgYW5kIGFueSBvdGhlciBwb29yIHNvdWxzIHdobyB2ZW50dXJlIGhlcmU6Ci0gKgotICogZmx1c2ggaW4gdGhpcyBjYXNlIERPRVMgTk9UIG1lYW4gZGlzcG9zZSBvZiB0aGUgZGF0YS4KLSAqIGluc3RlYWQsIGl0IG1lYW5zICJzdG9wIGJ1ZmZlcmluZyBhbmQgc2VuZCBpdCBpZiB5b3UKLSAqIGhhdmVuJ3QgYWxyZWFkeS4iICBKdXN0IGd1ZXNzIGhvdyBJIGZpZ3VyZWQgdGhhdCBvdXQuLi4gICBTUlcgMi1KdW4tOTgKLSAqCi0gKiBJdCBpcyBhbHNvIGFsd2F5cyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQgLSBKQVIgOC1TZXB0LTk5Ci0gKi8KLXN0YXRpYyB2b2lkIGRnYXBfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm47Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdBUF9VTklUX01BR0lDKQotCQlyZXR1cm47Ci0KLSAgICAgICAgY2ggPSB1bi0+dW5fY2g7Ci0gICAgICAgIGlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQliZCA9IGNoLT5jaF9iZDsKLQlpZiAoIWJkIHx8IGJkLT5tYWdpYyAhPSBER0FQX0JPQVJEX01BR0lDKQotCQlyZXR1cm47Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9mbHVzaF9jaGFycyBzdGFydFxuIikpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCS8qIFRPRE86IERvIHNvbWV0aGluZyBoZXJlICovCi0KLQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCURQUl9JT0NUTCgoImRnYXBfdHR5X2ZsdXNoX2NoYXJzIGZpbmlzaFxuIikpOwotfQotCi0KLQotLyoKLSAqIGRnYXBfdHR5X2ZsdXNoX2J1ZmZlcigpCi0gKgotICogRmx1c2ggVHggYnVmZmVyIChtYWtlIGluID09IG91dCkKLSAqLwotc3RhdGljIHZvaWQgZGdhcF90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGJvYXJkX3QgKmJkOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoOwotCXN0cnVjdCB1bl90ICp1bjsKLQl1bG9uZyAgIGxvY2tfZmxhZ3M7Ci0JdWxvbmcgICBsb2NrX2ZsYWdzMjsKLQl1MTYJaGVhZCA9IDA7Ci0KLQlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKLQkJcmV0dXJuOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCi0gICAgICAgIGNoID0gdW4tPnVuX2NoOwotICAgICAgICBpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdBUF9CT0FSRF9NQUdJQykKLQkJcmV0dXJuOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfZmx1c2hfYnVmZmVyIG9uIHBvcnQ6ICVkIHN0YXJ0XG4iLCBjaC0+Y2hfcG9ydG51bSkpOwotCi0JREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCWNoLT5jaF9mbGFncyAmPSB+Q0hfU1RPUDsKLQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnR4X2hlYWQpKTsKLQlkZ2FwX2NtZHcoY2gsIEZMVVNIVFgsICh1MTYpIGhlYWQsIDApOwotCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOwotCWlmIChjaC0+Y2hfdHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKLQkJY2gtPmNoX3R1bi51bl9mbGFncyAmPSB+KFVOX0xPV3xVTl9FTVBUWSk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKLQl9Ci0JaWYgKGNoLT5jaF9wdW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgewotCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+Y2hfcHVuLnVuX2ZsYWdzX3dhaXQpOwotCX0KLQotCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPndyaXRlX3dhaXQpKQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Ci0JdHR5X3dha2V1cCh0dHkpOwotCi0JRFBSX0lPQ1RMKCgiZGdhcF90dHlfZmx1c2hfYnVmZmVyIGZpbmlzaFxuIikpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIElPQ1RMIGZ1bmN0aW9uIGFuZCBhbGwgb2YgaXRzIGhlbHBlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBkZ2FwX3R0eV9pb2N0bCgpCi0gKgotICogVGhlIHVzdWFsIGFzc29ydG1lbnQgb2YgaW9jdGwncwotICovCi1zdGF0aWMgaW50IGRnYXBfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBib2FyZF90ICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47Ci0JaW50IHJjOwotCXUxNgloZWFkID0gMDsKLQl1bG9uZyAgIGxvY2tfZmxhZ3MgPSAwOwotCXVsb25nICAgbG9ja19mbGFnczIgPSAwOwotCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKLQotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDKQotCQlyZXR1cm4gKC1FTk9ERVYpOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHQVBfVU5JVF9NQUdJQykKLQkJcmV0dXJuICgtRU5PREVWKTsKLQotCWNoID0gdW4tPnVuX2NoOwotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHQVBfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuICgtRU5PREVWKTsKLQotCWJkID0gY2gtPmNoX2JkOwotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHQVBfQk9BUkRfTUFHSUMpCi0JCXJldHVybiAoLUVOT0RFVik7Ci0KLQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBzdGFydCBvbiBwb3J0ICVkIC0gY21kICVzICgleCksIGFyZyAlbHhcbiIsCi0JCWNoLT5jaF9wb3J0bnVtLCBkZ2FwX2lvY3RsX25hbWUoY21kKSwgY21kLCBhcmcpKTsKLQotCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQlpZiAodW4tPnVuX29wZW5fY291bnQgPD0gMCkgewotCQlEUFJfQkFTSUMoKCJkZ2FwX3R0eV9pb2N0bCAtIHVuaXQgbm90IG9wZW4uXG4iKSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKC1FSU8pOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0KLQkvKiBIZXJlIGFyZSBhbGwgdGhlIHN0YW5kYXJkIGlvY3RsJ3MgdGhhdCB3ZSBNVVNUIGltcGxlbWVudCAqLwotCi0JY2FzZSBUQ1NCUks6Ci0JCS8qCi0JCSAqIFRDU0JSSyBpcyBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsKLQkJICogdGhpcyBiZWhhdmlvdXIgaXMgZXhwbG9pdGVkIGJ5IHRjZHJhaW4oKS4KLQkJICoKLQkJICogQWNjb3JkaW5nIHRvIFBPU0lYLjEgc3BlYyAoNy4yLjIuMS4yKSBicmVha3Mgc2hvdWxkIGJlCi0JCSAqIGJldHdlZW4gMC4yNSBhbmQgMC41IHNlY29uZHMgc28gd2UnbGwgYXNrIGZvciBzb21ldGhpbmcKLQkJICogaW4gdGhlIG1pZGRsZTogMC4zNzUgc2Vjb25kcy4KLQkJICovCi0JCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCWlmIChyYykgewotCQkJcmV0dXJuKHJjKTsKLQkJfQotCi0JCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOwotCi0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQlpZigoKGNtZCA9PSBUQ1NCUkspICYmICghYXJnKSkgfHwgKGNtZCA9PSBUQ1NCUktQKSkgewotCQkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKLQkJfQotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotCi0KLQljYXNlIFRDU0JSS1A6Ci0gCQkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpCi0KLQkJICogQWNjb3JkaW5nIHRvIFBPU0lYLjEgc3BlYyAoNy4yLjIuMS4yKSBicmVha3Mgc2hvdWxkIGJlCi0JCSAqIGJldHdlZW4gMC4yNSBhbmQgMC41IHNlY29uZHMgc28gd2UnbGwgYXNrIGZvciBzb21ldGhpbmcKLQkJICogaW4gdGhlIG1pZGRsZTogMC4zNzUgc2Vjb25kcy4KLQkJICovCi0JCXJjID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCWlmIChyYykgewotCQkJcmV0dXJuKHJjKTsKLQkJfQotCi0JCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOwotCQlpZiAocmMpIHsKLQkJCURQUl9JT0NUTCgoImRnYXBfdHR5X2lvY3RsIC0gYmFkIHJldHVybjogJWQgIiwgcmMpKTsKLQkJCXJldHVybigtRUlOVFIpOwotCQl9Ci0KLQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJREdBUF9MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0KLQkJZGdhcF9jbWR3KGNoLCBTQlJFQUssICh1MTYpIFNCUkVBS19USU1FLCAwKTsKLQotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgZmluaXNoIG9uIHBvcnQgJWQgLSBjbWQgJXMgKCV4KSwgYXJnICVseFxuIiwKLQkJCWNoLT5jaF9wb3J0bnVtLCBkZ2FwX2lvY3RsX25hbWUoY21kKSwgY21kLCBhcmcpKTsKLQotCQlyZXR1cm4oMCk7Ci0KLSAgICAgICAgY2FzZSBUSU9DU0JSSzoKLQkJLyoKLQkJICogRkVQNSBkb2Vzbid0IHN1cHBvcnQgdHVybmluZyBvbiBhIGJyZWFrIHVuY29uZGl0aW9uYWxseS4KLQkJICogVGhlIEZFUDUgZGV2aWNlIHdpbGwgc3RvcCBzZW5kaW5nIGEgYnJlYWsgYXV0b21hdGljYWxseQotCQkgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUgdmFsdWUgdGhhdCB3YXMgc2VudCB3aGVuIHR1cm5pbmcgb24KLQkJICogdGhlIGJyZWFrLgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJaWYgKHJjKSB7Ci0JCQlyZXR1cm4ocmMpOwotCQl9Ci0KLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQlER0FQX0xPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQotCQlkZ2FwX2NtZHcoY2gsIFNCUkVBSywgKHUxNikgU0JSRUFLX1RJTUUsIDApOwotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0JCXJldHVybiAwOwotCi0gICAgICAgIGNhc2UgVElPQ0NCUks6Ci0JCS8qCi0JCSAqIEZFUDUgZG9lc24ndCBzdXBwb3J0IHR1cm5pbmcgb2ZmIGEgYnJlYWsgdW5jb25kaXRpb25hbGx5LgotCQkgKiBUaGUgRkVQNSBkZXZpY2Ugd2lsbCBzdG9wIHNlbmRpbmcgYSBicmVhayBhdXRvbWF0aWNhbGx5Ci0JCSAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZSB2YWx1ZSB0aGF0IHdhcyBzZW50IHdoZW4gdHVybmluZyBvbgotCQkgKiB0aGUgYnJlYWsuCi0JCSAqLwotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBUSU9DR1NPRlRDQVI6Ci0KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCXJjID0gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKTsKLQkJcmV0dXJuKHJjKTsKLQotCWNhc2UgVElPQ1NTT0ZUQ0FSOgotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0KLQkJcmMgPSBnZXRfdXNlcihhcmcsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4ocmMpOwotCi0JCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQl0dHktPnRlcm1pb3MuY19jZmxhZyA9ICgodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8IChhcmcgPyBDTE9DQUwgOiAwKSk7Ci0JCWRnYXBfcGFyYW0odHR5KTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JCXJldHVybigwKTsKLQotCWNhc2UgVElPQ01HRVQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oZGdhcF9nZXRfbW9kZW1faW5mbyhjaCwgdWFyZykpOwotCi0JY2FzZSBUSU9DTUJJUzoKLQljYXNlIFRJT0NNQklDOgotCWNhc2UgVElPQ01TRVQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKGRnYXBfc2V0X21vZGVtX2luZm8odHR5LCBjbWQsIHVhcmcpKTsKLQotCQkvKgotCQkgKiBIZXJlIGFyZSBhbnkgYWRkaXRpb25hbCBpb2N0bCdzIHRoYXQgd2Ugd2FudCB0byBpbXBsZW1lbnQKLQkJICovCi0KLQljYXNlIFRDRkxTSDoKLQkJLyoKLQkJICogVGhlIGxpbnV4IHR0eSBkcml2ZXIgZG9lc24ndCBoYXZlIGEgZmx1c2gKLQkJICogaW5wdXQgcm91dGluZSBmb3IgdGhlIGRyaXZlciwgYXNzdW1pbmcgYWxsIGJhY2tlZAotCQkgKiB1cCBkYXRhIGlzIGluIHRoZSBsaW5lIGRpc2MuIGJ1ZmZlcnMuICBIb3dldmVyLAotCQkgKiB3ZSBhbGwga25vdyB0aGF0J3Mgbm90IHRoZSBjYXNlLiAgSGVyZSwgd2UKLQkJICogYWN0IG9uIHRoZSBpb2N0bCwgYnV0IHRoZW4gbGllIGFuZCBzYXkgd2UgZGlkbid0Ci0JCSAqIHNvIHRoZSBsaW5lIGRpc2NpcGxpbmUgd2lsbCBwcm9jZXNzIHRoZSBmbHVzaAotCQkgKiBhbHNvLgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCWlmIChyYykgewotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybihyYyk7Ci0JCX0KLQotCQlpZiAoKGFyZyA9PSBUQ0lGTFVTSCkgfHwgKGFyZyA9PSBUQ0lPRkxVU0gpKSB7Ci0JCQlpZiAoISh1bi0+dW5fdHlwZSA9PSBER0FQX1BSSU5UKSkgewotCQkJCWhlYWQgPSByZWFkdygmKGNoLT5jaF9icy0+cnhfaGVhZCkpOwotCQkJCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+cnhfdGFpbCkpOwotCQkJCXdyaXRlYigwLCAmKGNoLT5jaF9icy0+b3J1bikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKChhcmcgPT0gVENPRkxVU0gpIHx8IChhcmcgPT0gVENJT0ZMVVNIKSkgewotCQkJY2gtPmNoX2ZsYWdzICY9IH5DSF9TVE9QOwotCQkJaGVhZCA9IHJlYWR3KCYoY2gtPmNoX2JzLT50eF9oZWFkKSk7Ci0JCQlkZ2FwX2NtZHcoY2gsIEZMVVNIVFgsICh1MTYpIGhlYWQsIDAgKTsKLQkJCWRnYXBfY21kdyhjaCwgUkVTVU1FVFgsIDAsIDApOwotCQkJaWYgKGNoLT5jaF90dW4udW5fZmxhZ3MgJiAoVU5fTE9XfFVOX0VNUFRZKSkgewotCQkJCWNoLT5jaF90dW4udW5fZmxhZ3MgJj0gfihVTl9MT1d8VU5fRU1QVFkpOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPmNoX3R1bi51bl9mbGFnc193YWl0KTsKLQkJCX0KLQkJCWlmIChjaC0+Y2hfcHVuLnVuX2ZsYWdzICYgKFVOX0xPV3xVTl9FTVBUWSkpIHsKLQkJCQljaC0+Y2hfcHVuLnVuX2ZsYWdzICY9IH4oVU5fTE9XfFVOX0VNUFRZKTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5jaF9wdW4udW5fZmxhZ3Nfd2FpdCk7Ci0JCQl9Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT53cml0ZV93YWl0KSkKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Ci0KLQkJCS8qIENhbid0IGhvbGQgYW55IGxvY2tzIHdoZW4gY2FsbGluZyB0dHlfd2FrZXVwISAqLwotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXR0eV93YWtldXAodHR5KTsKLQkJCURHQVBfTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCQlER0FQX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJfQotCi0JCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzIElPQ1RMICovCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAoTElORTolZCkgZmluaXNoIG9uIHBvcnQgJWQgLSBjbWQgJXMgKCV4KSwgYXJnICVseFxuIiwKLQkJCV9fTElORV9fLCBjaC0+Y2hfcG9ydG51bSwgZGdhcF9pb2N0bF9uYW1lKGNtZCksIGNtZCwgYXJnKSk7Ci0KLQkJcmV0dXJuKC1FTk9JT0NUTENNRCk7Ci0KLQljYXNlIFRDU0VUU0Y6Ci0JY2FzZSBUQ1NFVFNXOgotCQkvKgotCQkgKiBUaGUgbGludXggdHR5IGRyaXZlciBkb2Vzbid0IGhhdmUgYSBmbHVzaAotCQkgKiBpbnB1dCByb3V0aW5lIGZvciB0aGUgZHJpdmVyLCBhc3N1bWluZyBhbGwgYmFja2VkCi0JCSAqIHVwIGRhdGEgaXMgaW4gdGhlIGxpbmUgZGlzYy4gYnVmZmVycy4gIEhvd2V2ZXIsCi0JCSAqIHdlIGFsbCBrbm93IHRoYXQncyBub3QgdGhlIGNhc2UuICBIZXJlLCB3ZQotCQkgKiBhY3Qgb24gdGhlIGlvY3RsLCBidXQgdGhlbiBsaWUgYW5kIHNheSB3ZSBkaWRuJ3QKLQkJICogc28gdGhlIGxpbmUgZGlzY2lwbGluZSB3aWxsIHByb2Nlc3MgdGhlIGZsdXNoCi0JCSAqIGFsc28uCi0JCSAqLwotCQlpZiAoY21kID09IFRDU0VUU0YpIHsKLQkJCS8qIGZsdXNoIHJ4ICovCi0JCQljaC0+Y2hfZmxhZ3MgJj0gfkNIX1NUT1A7Ci0JCQloZWFkID0gcmVhZHcoJihjaC0+Y2hfYnMtPnJ4X2hlYWQpKTsKLQkJCXdyaXRldyhoZWFkLCAmKGNoLT5jaF9icy0+cnhfdGFpbCkpOwotCQl9Ci0KLQkJLyogbm93IHdhaXQgZm9yIGFsbCB0aGUgb3V0cHV0IHRvIGRyYWluICovCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCBmaW5pc2ggb24gcG9ydCAlZCAtIGNtZCAlcyAoJXgpLCBhcmcgJWx4XG4iLAotCQkJY2gtPmNoX3BvcnRudW0sIGRnYXBfaW9jdGxfbmFtZShjbWQpLCBjbWQsIGFyZykpOwotCi0JCS8qIHByZXRlbmQgd2UgZGlkbid0IHJlY29nbml6ZSB0aGlzICovCi0JCXJldHVybigtRU5PSU9DVExDTUQpOwotCi0JY2FzZSBUQ1NFVEFXOgotCi0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmMgPSBkZ2FwX3dhaXRfZm9yX2RyYWluKHR0eSk7Ci0JCWlmIChyYykgewotCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJcmV0dXJuKC1FSU5UUik7Ci0JCX0KLQotCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyAqLwotCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKLQotCWNhc2UgVENYT05DOgotCQkvKgotCQkgKiBUaGUgTGludXggTGluZSBEaXNjaXBsaW5lIChMRCkgd291bGQgZG8gdGhpcyBmb3IgdXMgaWYgd2UKLQkJICogbGV0IGl0LCBidXQgd2UgaGF2ZSB0aGUgc3BlY2lhbCBmaXJtd2FyZSBvcHRpb25zIHRvIGRvIHRoaXMKLQkJICogdGhlICJyaWdodCB3YXkiIHJlZ2FyZGxlc3Mgb2YgaGFyZHdhcmUgb3Igc29mdHdhcmUgZmxvdwotCQkgKiBjb250cm9sIHNvIHdlJ2xsIGRvIGl0IG91dHNlbHZlcyBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIExECi0JCSAqIGRvIGl0LgotCQkgKi8KLQkJcmMgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCWlmIChyYykgewotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybihyYyk7Ci0JCX0KLQotCQlEUFJfSU9DVEwoKCJkZ2FwX2lvY3RsIC0gaW4gVENYT05DIC0gJWRcbiIsIGNtZCkpOwotCQlzd2l0Y2ggKGFyZykgewotCi0JCWNhc2UgVENPT046Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJZGdhcF90dHlfc3RhcnQodHR5KTsKLQkJCXJldHVybigwKTsKLQkJY2FzZSBUQ09PRkY6Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJZGdhcF90dHlfc3RvcCh0dHkpOwotCQkJcmV0dXJuKDApOwotCQljYXNlIFRDSU9OOgotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCS8qIE1ha2UgdGhlIGxkIGRvIGl0ICovCi0JCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKLQkJY2FzZSBUQ0lPRkY6Ci0JCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQkJLyogTWFrZSB0aGUgbGQgZG8gaXQgKi8KLQkJCXJldHVybigtRU5PSU9DVExDTUQpOwotCQlkZWZhdWx0OgotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJldHVybigtRUlOVkFMKTsKLQkJfQotCi0JY2FzZSBESUdJX0dFVEE6Ci0JCS8qIGdldCBpbmZvcm1hdGlvbiBmb3IgZGl0dHkgKi8KLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaWdldGEodHR5LCB1YXJnKSk7Ci0KLQljYXNlIERJR0lfU0VUQVc6Ci0JY2FzZSBESUdJX1NFVEFGOgotCi0JCS8qIHNldCBpbmZvcm1hdGlvbiBmb3IgZGl0dHkgKi8KLQkJaWYgKGNtZCA9PSAoRElHSV9TRVRBVykpIHsKLQotCQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCXJjID0gZGdhcF93YWl0X2Zvcl9kcmFpbih0dHkpOwotCQkJaWYgKHJjKSB7Ci0JCQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgLSBiYWQgcmV0dXJuOiAlZCAiLCByYykpOwotCQkJCXJldHVybigtRUlOVFIpOwotCQkJfQotCQkJREdBUF9MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJCURHQVBfTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQl9Ci0JCWVsc2UgewotCQkJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7Ci0JCX0KLQkJLyogZmFsbCB0aHJ1ICovCi0KLQljYXNlIERJR0lfU0VUQToKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaXNldGEodHR5LCB1YXJnKSk7Ci0KLQljYXNlIERJR0lfR0VERUxBWToKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4oZGdhcF90dHlfZGlnaWdldGVkZWxheSh0dHksIHVhcmcpKTsKLQotCWNhc2UgRElHSV9TRURFTEFZOgotCQlER0FQX1VOTE9DSyhjaC0+Y2hfbG9jaywgbG9ja19mbGFnczIpOwotCQlER0FQX1VOTE9DSyhiZC0+YmRfbG9jaywgbG9ja19mbGFncyk7Ci0JCXJldHVybihkZ2FwX3R0eV9kaWdpc2V0ZWRlbGF5KHR0eSwgdWFyZykpOwotCi0JY2FzZSBESUdJX0dFVENVU1RPTUJBVUQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKGRnYXBfdHR5X2RpZ2lnZXRjdXN0b21iYXVkKHR0eSwgdWFyZykpOwotCi0JY2FzZSBESUdJX1NFVENVU1RPTUJBVUQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmV0dXJuKGRnYXBfdHR5X2RpZ2lzZXRjdXN0b21iYXVkKHR0eSwgdWFyZykpOwotCi0JY2FzZSBESUdJX1JFU0VUX1BPUlQ6Ci0JCWRnYXBfZmlybXdhcmVfcmVzZXRfcG9ydChjaCk7Ci0JCWRnYXBfcGFyYW0odHR5KTsKLQkJREdBUF9VTkxPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MyKTsKLQkJREdBUF9VTkxPQ0soYmQtPmJkX2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCURHQVBfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzMik7Ci0JCURHQVBfVU5MT0NLKGJkLT5iZF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQotCQlEUFJfSU9DVEwoKCJkZ2FwX3R0eV9pb2N0bCAtIGluIGRlZmF1bHRcbiIpKTsKLQkJRFBSX0lPQ1RMKCgiZGdhcF90dHlfaW9jdGwgZW5kIC0gY21kICVzICgleCksIGFyZyAlbHhcbiIsCi0JCQlkZ2FwX2lvY3RsX25hbWUoY21kKSwgY21kLCBhcmcpKTsKLQotCQlyZXR1cm4oLUVOT0lPQ1RMQ01EKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R0eS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90dHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0YTQ2MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfX0RHQVBfVFRZX0gKLSNkZWZpbmUgX19ER0FQX1RUWV9ICi0KLSNpbmNsdWRlICJkZ2FwX2RyaXZlci5oIgotCi1pbnQJZGdhcF90dHlfcmVnaXN0ZXIoc3RydWN0IGJvYXJkX3QgKmJyZCk7Ci0KLWludAlkZ2FwX3R0eV9wcmVpbml0KHZvaWQpOwotaW50ICAgICBkZ2FwX3R0eV9pbml0KHN0cnVjdCBib2FyZF90ICopOwotCi12b2lkCWRnYXBfdHR5X3Bvc3RfdW5pbml0KHZvaWQpOwotdm9pZAlkZ2FwX3R0eV91bmluaXQoc3RydWN0IGJvYXJkX3QgKik7Ci0KLXZvaWQJZGdhcF9jYXJyaWVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXZvaWQJZGdhcF9pbnB1dChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTM4YzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfX0RHQVBfVFlQRVNfSAotI2RlZmluZSBfX0RHQVBfVFlQRVNfSAotCi0jaWZuZGVmIFRSVUUKLSMgZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSMgZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotCi0vKiBSZXF1aXJlZCBmb3Igb3VyIHNoYXJlZCBoZWFkZXJzISAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1Y2hhcjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kaWdpLmggYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kaWdpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWE0ZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGlnaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqCVNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqICRJZDogZGlnaS5oLHYgMS4xIDIwMDkvMTAvMjMgMTQ6MDE6NTcgbWFya2ggRXhwICQKLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9fRElHSV9ICi0jZGVmaW5lIF9fRElHSV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioJRGVmaW5pdGlvbnMgZm9yIERpZ2kgZGl0dHkoMSkgY29tbWFuZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OC05NiBEaWdpIEludGVybmF0aW9uYWwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhcHBsaWNhdGlvbiBhY2Nlc3MgdG8gc3BlY2lhbCBEaWdpCi0gKiBzZXJpYWwgbGluZSBlbmhhbmNlbWVudHMgd2hpY2ggYXJlIG5vdCBzdGFuZGFyZCBVTklYKHRtKSBmZWF0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAhZGVmaW5lZChUSU9DTU9ERykKLQotI2RlZmluZQlUSU9DTU9ERwkoJ2QnPDw4KSB8IDI1MAkJLyogZ2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLSNkZWZpbmUJVElPQ01PRFMJKCdkJzw8OCkgfCAyNTEJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0KLSNpZm5kZWYgVElPQ01fTEUgCi0jZGVmaW5lCQlUSU9DTV9MRQkweDAxCQkvKiBsaW5lIGVuYWJsZQkJKi8KLSNkZWZpbmUJCVRJT0NNX0RUUgkweDAyCQkvKiBkYXRhIHRlcm1pbmFsIHJlYWR5CSovCi0jZGVmaW5lCQlUSU9DTV9SVFMJMHgwNAkJLyogcmVxdWVzdCB0byBzZW5kCSovCi0jZGVmaW5lCQlUSU9DTV9TVAkweDA4CQkvKiBzZWNvbmRhcnkgdHJhbnNtaXQJKi8KLSNkZWZpbmUJCVRJT0NNX1NSCTB4MTAJCS8qIHNlY29uZGFyeSByZWNlaXZlCSovCi0jZGVmaW5lCQlUSU9DTV9DVFMJMHgyMAkJLyogY2xlYXIgdG8gc2VuZAkqLwotI2RlZmluZQkJVElPQ01fQ0FSCTB4NDAJCS8qIGNhcnJpZXIgZGV0ZWN0CSovCi0jZGVmaW5lCQlUSU9DTV9STkcJMHg4MAkJLyogcmluZwlpbmRpY2F0b3IJKi8KLSNkZWZpbmUJCVRJT0NNX0RTUgkweDEwMAkJLyogZGF0YSBzZXQgcmVhZHkJKi8KLSNkZWZpbmUJCVRJT0NNX1JJCVRJT0NNX1JORwkvKiByaW5nIChhbHRlcm5hdGUpCSovCi0jZGVmaW5lCQlUSU9DTV9DRAlUSU9DTV9DQVIJLyogY2FycmllciBkZXRlY3QgKGFsdCkJKi8KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFRJT0NNU0VUKQotI2RlZmluZQlUSU9DTVNFVAkoJ2QnPDw4KSB8IDI1MgkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLSNkZWZpbmUJVElPQ01HRVQJKCdkJzw8OCkgfCAyNTMJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFRJT0NNQklDKQotI2RlZmluZQlUSU9DTUJJQwkoJ2QnPDw4KSB8IDI1NAkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KLSNkZWZpbmUJVElPQ01CSVMJKCdkJzw8OCkgfCAyNTUJCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlICovCi0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoVElPQ1NEVFIpCi0jZGVmaW5lCVRJT0NTRFRSCSgnZSc8PDgpIHwgMAkJLyogc2V0IERUUgkJKi8KLSNkZWZpbmUJVElPQ0NEVFIJKCdlJzw8OCkgfCAxCQkvKiBjbGVhciBEVFIJCSovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW9jdGwgY29tbWFuZCBhcmd1bWVudHMgZm9yIERJR0kgcGFyYW1ldGVycy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERJR0lfR0VUQQkoJ2UnPDw4KSB8IDk0CQkvKiBSZWFkIHBhcmFtcwkJKi8KLQotI2RlZmluZSBESUdJX1NFVEEJKCdlJzw8OCkgfCA5NQkJLyogU2V0IHBhcmFtcwkJKi8KLSNkZWZpbmUgRElHSV9TRVRBVwkoJ2UnPDw4KSB8IDk2CQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KLSNkZWZpbmUgRElHSV9TRVRBRgkoJ2UnPDw4KSB8IDk3CQkvKiBEcmFpbiwgZmx1c2ggJiBzZXQgcGFyYW1zICovCi0KLSNkZWZpbmUgRElHSV9LTUUJKCdlJzw8OCkgfCA5OAkJLyogUmVhZC9Xcml0ZSBIb3N0CSovCi0JCQkJCQkvKiBBZGFwdGVyIE1lbW9yeQkqLwotCi0jZGVmaW5lCURJR0lfR0VURkxPVwkoJ2UnPDw4KSB8IDk5CQkvKiBHZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KLQkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAJICovCi0jZGVmaW5lCURJR0lfU0VURkxPVwkoJ2UnPDw4KSB8IDEwMAkJLyogU2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCi0JCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMJICovCi0jZGVmaW5lCURJR0lfR0VUQUZMT1cJKCdlJzw8OCkgfCAxMDEJCS8qIEdldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLwotCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzIAkgKi8KLSNkZWZpbmUJRElHSV9TRVRBRkxPVwkoJ2UnPDw4KSB8IDEwMgkJLyogU2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCi0JCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMJICovCi0KLSNkZWZpbmUgRElHSV9HRURFTEFZCSgnZCc8PDgpIHwgMjQ2CQkvKiBHZXQgZWRlbGF5ICovCi0jZGVmaW5lIERJR0lfU0VERUxBWQkoJ2QnPDw4KSB8IDI0NwkJLyogU2V0IGVkZWxheSAqLwotCi1zdHJ1Y3QJZGlnaWZsb3dfdCB7Ci0JdW5zaWduZWQgY2hhcglzdGFydGM7CQkJCS8qIGZsb3cgY250bCBzdGFydCBjaGFyCSovCi0JdW5zaWduZWQgY2hhcglzdG9wYzsJCQkJLyogZmxvdyBjbnRsIHN0b3AgY2hhcgkqLwotfTsKLQotCi0jaWZkZWYJRkxPV18yMjAwCi0jZGVmaW5lCUYyMjAwX0dFVEEJKCdlJzw8OCkgfCAxMDQJCS8qIEdldCAyeDM2IGZsb3cgY250bCBmbGFncyAqLwotI2RlZmluZQlGMjIwMF9TRVRBVwkoJ2UnPDw4KSB8IDEwNQkJLyogU2V0IDJ4MzYgZmxvdyBjbnRsIGZsYWdzICovCi0jZGVmaW5lCQlGMjIwMF9NQVNLCTB4MDMJCS8qIDIyMDAgZmxvdyBjbnRsIGJpdCBtYXNrICAqLwotI2RlZmluZQkJRkNOVExfMjIwMAkweDAxCQkvKiAyeDM2IHRlcm1pbmFsIGZsb3cgY250bCAgKi8KLSNkZWZpbmUJCVBDTlRMXzIyMDAJMHgwMgkJLyogMngzNiBwcmludGVyIGZsb3cgY250bCAgICovCi0jZGVmaW5lCUYyMjAwX1hPTgkweGY4Ci0jZGVmaW5lCVAyMjAwX1hPTgkweGY5Ci0jZGVmaW5lCUYyMjAwX1hPRkYJMHhmYQotI2RlZmluZQlQMjIwMF9YT0ZGCTB4ZmIKLQotI2RlZmluZQlGWE9GRl9NQVNLCTB4MDMJCQkvKiAyMjAwIGZsb3cgc3RhdHVzIG1hc2sgICAgKi8KLSNkZWZpbmUJUkNWRF9GWE9GRgkweDAxCQkJLyogMngzNiBUZXJtaW5hbCBYT0ZGIHJjdmQgICovCi0jZGVmaW5lCVJDVkRfUFhPRkYJMHgwMgkJCS8qIDJ4MzYgUHJpbnRlciBYT0ZGIHJjdmQgICAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhbHVlcyBmb3IgZGlnaV9mbGFncyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERJR0lfSVhPTgkweDAwMDEJCS8qIEhhbmRsZSBJWE9OIGluIHRoZSBGRVAJKi8KLSNkZWZpbmUgRElHSV9GQVNUCTB4MDAwMgkJLyogRmFzdCBiYXVkIHJhdGVzCQkqLwotI2RlZmluZSBSVFNQQUNFCQkweDAwMDQJCS8qIFJUUyBpbnB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgQ1RTUEFDRQkJMHgwMDA4CQkvKiBDVFMgb3V0cHV0IGZsb3cgY29udHJvbAkqLwotI2RlZmluZSBEU1JQQUNFCQkweDAwMTAJCS8qIERTUiBvdXRwdXQgZmxvdyBjb250cm9sCSovCi0jZGVmaW5lIERDRFBBQ0UJCTB4MDAyMAkJLyogRENEIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgRFRSUEFDRQkJMHgwMDQwCQkvKiBEVFIgaW5wdXQgZmxvdyBjb250cm9sCSovCi0jZGVmaW5lIERJR0lfQ09PSwkweDAwODAJCS8qIENvb2tlZCBwcm9jZXNzaW5nIGRvbmUgaW4gRkVQICovCi0jZGVmaW5lIERJR0lfRk9SQ0VEQ0QJMHgwMTAwCQkvKiBGb3JjZSBjYXJyaWVyCQkqLwotI2RlZmluZQlESUdJX0FMVFBJTgkweDAyMDAJCS8qIEFsdGVybmF0ZSBSSi00NSBwaW4gY29uZmlnCSovCi0jZGVmaW5lCURJR0lfQUlYT04JMHgwNDAwCQkvKiBBdXggZmxvdyBjb250cm9sIGluIGZlcAkqLwotI2RlZmluZQlESUdJX1BSSU5URVIJMHgwODAwCQkvKiBIb2xkIHBvcnQgb3BlbiBmb3IgZmxvdyBjbnRybCovCi0jZGVmaW5lIERJR0lfUFBfSU5QVVQJMHgxMDAwCQkvKiBDaGFuZ2UgcGFyYWxsZWwgcG9ydCB0byBpbnB1dCovCi0jZGVmaW5lIERJR0lfRFRSX1RPR0dMRSAweDIwMDAJCS8qIFN1cHBvcnQgRFRSIFRvZ2dsZQkJKi8KLSNkZWZpbmUJRElHSV80MjIJMHg0MDAwCQkvKiBmb3IgNDIyLzIzMiBzZWxlY3RhYmxlIHBhbmVsICovCi0jZGVmaW5lIERJR0lfUlRTX1RPR0dMRQkweDgwMDAJCS8qIFN1cHBvcnQgUlRTIFRvZ2dsZQkJKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhlc2Ugb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGUgY29teGkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZQlESUdJX0NPTVhJCShESUdJX0ZBU1R8RElHSV9DT09LfERTUlBBQ0V8RENEUEFDRXxEVFJQQUNFKQotCi0jZGVmaW5lIERJR0lfUExFTgkyOAkJLyogU3RyaW5nIGxlbmd0aAkJKi8KLSNkZWZpbmUJRElHSV9UU0laCTEwCQkvKiBUZXJtaW5hbCBzdHJpbmcgbGVuCQkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdHJ1Y3R1cmUgdXNlZCB3aXRoIGlvY3RsIGNvbW1hbmRzIGZvciBESUdJIHBhcmFtZXRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGRpZ2lfdCB7Ci0JdW5zaWduZWQgc2hvcnQJZGlnaV9mbGFnczsJCS8qIEZsYWdzIChzZWUgYWJvdmUpCSovCi0JdW5zaWduZWQgc2hvcnQJZGlnaV9tYXhjcHM7CQkvKiBNYXggcHJpbnRlciBDUFMJKi8KLQl1bnNpZ25lZCBzaG9ydAlkaWdpX21heGNoYXI7CQkvKiBNYXggY2hhcnMgaW4gcHJpbnQgcXVldWUgKi8KLQl1bnNpZ25lZCBzaG9ydAlkaWdpX2J1ZnNpemU7CQkvKiBCdWZmZXIgc2l6ZQkJKi8KLQl1bnNpZ25lZCBjaGFyCWRpZ2lfb25sZW47CQkvKiBMZW5ndGggb2YgT04gc3RyaW5nCSovCi0JdW5zaWduZWQgY2hhcglkaWdpX29mZmxlbjsJCS8qIExlbmd0aCBvZiBPRkYgc3RyaW5nCSovCi0JY2hhcgkJZGlnaV9vbnN0cltESUdJX1BMRU5dOwkvKiBQcmludGVyIG9uIHN0cmluZwkqLwotCWNoYXIJCWRpZ2lfb2Zmc3RyW0RJR0lfUExFTl07CS8qIFByaW50ZXIgb2ZmIHN0cmluZwkqLwotCWNoYXIJCWRpZ2lfdGVybVtESUdJX1RTSVpdOwkvKiB0ZXJtaW5hbCBzdHJpbmcJKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEtNRSBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lCVJXX0lETEUJCTAJLyogT3BlcmF0aW9uIGNvbXBsZXRlCQkJKi8KLSNkZWZpbmUJUldfUkVBRAkJMQkvKiBSZWFkIENvbmNlbnRyYXRvciBNZW1vcnkJCSovCi0jZGVmaW5lCVJXX1dSSVRFCTIJLyogV3JpdGUgQ29uY2VudHJhdG9yIE1lbW9yeQkJKi8KLQotc3RydWN0IHJ3X3QgewotCXVuc2lnbmVkIGNoYXIJcndfcmVxOwkJLyogUmVxdWVzdCB0eXBlCQkJKi8KLQl1bnNpZ25lZCBjaGFyCXJ3X2JvYXJkOwkvKiBIb3N0IEFkYXB0ZXIgYm9hcmQgbnVtYmVyCSovCi0JdW5zaWduZWQgY2hhcglyd19jb25jOwkvKiBDb25jZW50cmF0b3IgbnVtYmVyCQkqLwotCXVuc2lnbmVkIGNoYXIJcndfcmVzZXJ2ZWQ7CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24JKi8KLQl1bnNpZ25lZCBsb25nCXJ3X2FkZHI7CS8qIEFkZHJlc3MgaW4gY29uY2VudHJhdG9yCSovCi0JdW5zaWduZWQgc2hvcnQJcndfc2l6ZTsJLyogUmVhZC93cml0ZSByZXF1ZXN0IGxlbmd0aAkqLwotCXVuc2lnbmVkIGNoYXIJcndfZGF0YVsxMjhdOwkvKiBEYXRhIHRvIHJlYWQvd3JpdGUJCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNocmluayBCdWZmZXIgYW5kIEJvYXJkIEluZm9ybWF0aW9uIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzLgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJLyogQm9hcmQgdHlwZSByZXR1cm4gY29kZXMgKi8KLSNkZWZpbmUJUENYSV9UWVBFIDEgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1hpICovCi0jZGVmaW5lIFBDWE1fVFlQRSAyICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YbSAqLwotI2RlZmluZQlQQ1hFX1RZUEUgMyAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWGUgKi8KLSNkZWZpbmUJTUNYSV9UWVBFIDQgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIE1DL1hpICovCi0jZGVmaW5lIENPTVhJX1RZUEUgNSAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgQ09NL1hpICovCi0KLQkJCSAvKiBOb24tWmVybyBSZXN1bHQgY29kZXMuICovCi0jZGVmaW5lIFJFU1VMVF9OT0JERk5EIDEgLyogQSBEaWdpIHByb2R1Y3QgYXQgdGhhdCBwb3J0IGlzIG5vdCBjb25maWcgaW5zdGFsbGVkICovIAotI2RlZmluZSBSRVNVTFRfTk9ERVNDVCAyIC8qIEEgbWVtb3J5IGRlc2NyaXB0b3Igd2FzIG5vdCBvYnRhaW5hYmxlICovIAotI2RlZmluZSBSRVNVTFRfTk9PU1NJRyAzIC8qIEZFUC9PUyBzaWduYXR1cmUgd2FzIG5vdCBkZXRlY3RlZCBvbiB0aGUgYm9hcmQgKi8KLSNkZWZpbmUgUkVTVUxUX1RPT1NNTCAgNCAvKiBUb28gc21hbGwgYW4gYXJlYSB0byBzaHJpbmsuICAqLwotI2RlZmluZSBSRVNVTFRfTk9DSEFOICA1IC8qIENoYW5uZWwgc3RydWN0dXJlIGZvciB0aGUgYm9hcmQgd2FzIG5vdCBmb3VuZCAqLwotCi1zdHJ1Y3Qgc2hyaW5rX2J1Zl9zdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl92YWRkcjsJLyogVmlydHVhbCBhZGRyZXNzIG9mIGJvYXJkICovCi0JdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX3BoeXM7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgYm9hcmQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfYnNlZzsJLyogQW1vdW50IG9mIGJvYXJkIG1lbW9yeSAqLwotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9oc2VnOwkvKiAnMTg2IEJlZ2lubmluZyBvZiBEdWFsLVBvcnQgKi8KLQotCXVuc2lnbmVkIGxvbmcJc2hyaW5rX2J1Zl9sc2VnOwkvKiAnMTg2IEJlZ2lubmluZyBvZiBmcmVlZCBtZW1vcnkJCQkJCQkqLyAKLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfbXNlZzsJLyogTGluZWFyIGFkZHJlc3MgZnJvbSBzdGFydCBvZgotCQkJCQkJICAgZHVhbC1wb3J0IHdlcmUgZnJlZWQgbWVtb3J5Ci0JCQkJCQkgICBiZWdpbnMsIGhvc3Qgdmlld3BvaW50LiAqLwotCi0JdW5zaWduZWQgbG9uZwlzaHJpbmtfYnVmX2JkcGFyYW07CS8qIFBhcmFtZXRlciBmb3IgeHhtZW1vbiBhbmQKLQkJCQkJCSAgIHh4bWVtb2ZmICovCi0KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YTsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YjsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2YzsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBsb25nCXNocmlua19idWZfcmVzZXJ2ZDsJLyogUmVzZXJ2ZWQgKi8KLQotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9yZXN1bHQ7CS8qIFJlYXNvbiBmb3IgY2FsbCBmYWlsaW5nCi0JCQkJCQkgICBaZXJvIGlzIEdvb2QgcmV0dXJuICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2luaXQ7CS8qIE5vbi1aZXJvIGlmIGl0IGNhdXNlZCBhbiAgICAgCi0JCQkJCQkgICB4eGluaXQgY2FsbC4gKi8KLQotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9hbnBvcnRzOwkvKiBOdW1iZXIgb2YgYXN5bmMgcG9ydHMgICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX3NucG9ydHM7IAkvKiBOdW1iZXIgb2Ygc3luYyAgcG9ydHMgKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfdHlwZTsJLyogQm9hcmQgdHlwZSAxID0gUEMvWGksCi0JCQkJCQkJICAgICAgMiA9IFBDL1htLAotCQkJCQkJCSAgICAgIDMgPSBQQy9YZSAgCi0JCQkJCQkJICAgICAgNCA9IE1DL1hpICAKLQkJCQkJCQkgICAgICA1ID0gQ09NWC9pICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2NhcmQ7CS8qIENhcmQgbnVtYmVyICovCi0JCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdHJ1Y3R1cmUgdG8gZ2V0IGRyaXZlciBzdGF0dXMgaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgZGlnaV9kaW5mbyB7Ci0JdW5zaWduZWQgbG9uZwlkaW5mb19uYm9hcmRzOwkJLyogIyBib2FyZHMgY29uZmlndXJlZAkqLwotCWNoYXIJCWRpbmZvX3Jlc2VydmVkWzEyXTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KLQljaGFyCQlkaW5mb192ZXJzaW9uWzE2XTsJLyogZHJpdmVyIHZlcnNpb24gICAgICAgKi8KLX07Ci0KLSNkZWZpbmUJRElHSV9HRVRERAkoJ2QnPDw4KSB8IDI0OAkJLyogZ2V0IGRyaXZlciBpbmZvICAgICAgKi8KLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIHBlci1ib2FyZCBpbmZvcm1hdGlvbgotICoKLSAqIHBoeXNzaXplIGFuZCBtZW1zaXplIGRpZmZlciB3aGVuIGJvYXJkIGhhcyAid2luZG93ZWQiIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkaWdpX2luZm8gewotCXVuc2lnbmVkIGxvbmcJaW5mb19iZG51bTsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2lvcG9ydDsJCS8qIGlvIHBvcnQgYWRkcmVzcyAgICAgICAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX3BoeXNhZGRyOwkJLyogbWVtb3J5IGFkZHJlc3MgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fcGh5c3NpemU7CQkvKiBTaXplIG9mIGhvc3QgbWVtIHdpbmRvdyAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19tZW1zaXplOwkJLyogQW1vdW50IG9mIGR1YWwtcG9ydCBtZW0gKi8KLQkJCQkJCS8qIG9uIGJvYXJkICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgc2hvcnQJaW5mb19iZHR5cGU7CQkvKiBCb2FyZCB0eXBlICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIHNob3J0CWluZm9fbnBvcnRzOwkJLyogbnVtYmVyIG9mIHBvcnRzICAgICAgICAgKi8KLQljaGFyCQlpbmZvX2Jkc3RhdGU7CQkvKiBib2FyZCBzdGF0ZSAgICAgICAgICAgICAqLwotCWNoYXIJCWluZm9fcmVzZXJ2ZWRbN107CS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICAgICovCi19OwotCi0jZGVmaW5lCURJR0lfR0VUQkQJKCdkJzw8OCkgfCAyNDkJCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCi0gCi1zdHJ1Y3QgZGlnaV9zdGF0IHsKLQl1bnNpZ25lZCBpbnQJaW5mb19jaGFuOwkJLyogQ2hhbm5lbCBudW1iZXIgKDAgYmFzZWQpICAqLwotCXVuc2lnbmVkIGludAlpbmZvX2JyZDsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2NmbGFnOwkJLyogY2ZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9faWZsYWc7CQkvKiBpZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19vZmxhZzsJCS8qIG9mbGFnIGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX21zdGF0OwkJLyogbXN0YXQgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fdHhfZGF0YTsJCS8qIHR4X2RhdGEgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fcnhfZGF0YTsJCS8qIHJ4X2RhdGEgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9faGZsb3c7CQkvKiBoZmxvdyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19yZXNlcnZlZFs4XTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gICAgKi8KLX07Ci0KLSNkZWZpbmUJRElHSV9HRVRTVEFUCSgnZCc8PDgpIHwgMjQ0CQkvKiBnZXQgYm9hcmQgaW5mbyAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIHBlci1jaGFubmVsIGluZm9ybWF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkaWdpX2NoIHsKLQl1bnNpZ25lZCBsb25nCWluZm9fYmRudW07CQkvKiBCb2FyZCBudW1iZXIgKDAgYmFzZWQpICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19jaGFubmVsOwkJLyogQ2hhbm5lbCBpbmRleCBudW1iZXIgICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fY2hfY2ZsYWc7CQkvKiBDaGFubmVsIGNmbGFnICAgCSAgICovCi0JdW5zaWduZWQgbG9uZwlpbmZvX2NoX2lmbGFnOwkJLyogQ2hhbm5lbCBpZmxhZyAgIAkgICAqLwotCXVuc2lnbmVkIGxvbmcJaW5mb19jaF9vZmxhZzsJCS8qIENoYW5uZWwgb2ZsYWcgICAJICAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fY2hzaXplOwkJLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAgKi8KLQl1bnNpZ25lZCBsb25nCWluZm9fc2xlZXBfc3RhdDsJLyogc2xlZXAgc3RhdHVzCQkgICAqLwotCWRldl90CQlpbmZvX2RldjsJCS8qIGRldmljZSBudW1iZXIJICAgKi8KLQl1bnNpZ25lZCBjaGFyCWluZm9faW5pdHN0YXRlOwkJLyogQ2hhbm5lbCBpbml0IHN0YXRlCSAgICovCi0JdW5zaWduZWQgY2hhcglpbmZvX3J1bm5pbmc7CQkvKiBDaGFubmVsIHJ1bm5pbmcgc3RhdGUgICAqLwotCWxvbmcJCXJlc2VydmVkWzhdOwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLX07Ci0KLS8qCi0qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2l0aCB0aGUgRElHSV9GRVBDTUQgaW9jdGwgdG8gCi0qIHRlbGwgdGhlIGRyaXZlciB3aGljaCBwb3J0IHRvIHNlbmQgdGhlIGNvbW1hbmQgZm9yLgotKi8KLXN0cnVjdCBkaWdpX2NtZCB7Ci0JaW50CWNtZDsKLQlpbnQJd29yZDsKLQlpbnQJbmNtZHM7Ci0JaW50CWNoYW47IC8qIGNoYW5uZWwgaW5kZXggKHplcm8gYmFzZWQpICovCi0JaW50CWJkaWQ7IC8qIGJvYXJkIGluZGV4ICh6ZXJvIGJhc2VkKSAqLwotfTsKLQotLyoKLSogIGluZm9fc2xlZXBfc3RhdCBkZWZpbmVzCi0qLwotI2RlZmluZSBJTkZPX1JVTldBSVQJMHgwMDAxCi0jZGVmaW5lIElORk9fV09QRU4JMHgwMDAyCi0jZGVmaW5lIElORk9fVFRJT1cJMHgwMDA0Ci0jZGVmaW5lIElORk9fQ0hfUldBSVQJMHgwMDA4Ci0jZGVmaW5lIElORk9fQ0hfV0VNUFRZCTB4MDAxMAotI2RlZmluZSBJTkZPX0NIX1dMT1cJMHgwMDIwCi0jZGVmaW5lIElORk9fWFhCVUZfQlVTWSAweDAwNDAKLQotI2RlZmluZQlESUdJX0dFVENICSgnZCc8PDgpIHwgMjQ1CQkvKiBnZXQgYm9hcmQgaW5mbyAgICAgICAgICAqLwotCi0vKiBCb2FyZCB0eXBlIGRlZmluaXRpb25zICovCi0KLSNkZWZpbmUJU1VCVFlQRQkJMDAwNwotI2RlZmluZQlUX1BDWEkJCTAwMDAKLSNkZWZpbmUgVF9QQ1hNCQkwMDAxCi0jZGVmaW5lIFRfUENYRQkJMDAwMgotI2RlZmluZSBUX1BDWFIJCTAwMDMKLSNkZWZpbmUgVF9TUAkJMDAwNAotI2RlZmluZSBUX1NQX1BMVVMJMDAwNQotIwlkZWZpbmUgVF9IRVJDCTAwMDAKLSMJZGVmaW5lIFRfSE9VCTAwMDEKLSMJZGVmaW5lIFRfTE9OCTAwMDIKLSMJZGVmaW5lIFRfQ0hBCTAwMDMKLSNkZWZpbmUgRkFNSUxZCQkwMDcwCi0jZGVmaW5lIFRfQ09NWEkJCTAwMDAKLSNkZWZpbmUgVF9QQ1hYCQkwMDEwCi0jZGVmaW5lIFRfQ1gJCTAwMjAKLSNkZWZpbmUgVF9FUEMJCTAwMzAKLSNkZWZpbmUJVF9QQ0xJVEUJMDA0MAotI2RlZmluZQlUX1NQWFgJCTAwNTAKLSNkZWZpbmUJVF9BVlhYCQkwMDYwCi0jZGVmaW5lIFRfRFhCCQkwMDcwCi0jZGVmaW5lIFRfQTJLXzRfOAkwMDcwCi0jZGVmaW5lIEJVU1RZUEUJCTA3MDAKLSNkZWZpbmUgVF9JU0FCVVMJMDAwMAotI2RlZmluZSBUX01DQlVTCQkwMTAwCi0jZGVmaW5lCVRfRUlTQUJVUwkwMjAwCi0jZGVmaW5lCVRfUENJQlVTCTA0MDAKLQotLyogQm9hcmQgU3RhdGUgRGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZQlCRF9SVU5OSU5HCTB4MAotI2RlZmluZQlCRF9SRUFTT04JMHg3ZgotI2RlZmluZQlCRF9OT1RGT1VORAkweDEKLSNkZWZpbmUJQkRfTk9JT1BPUlQJMHgyCi0jZGVmaW5lCUJEX05PTUVNCTB4MwotI2RlZmluZQlCRF9OT0JJT1MJMHg0Ci0jZGVmaW5lCUJEX05PRkVQCTB4NQotI2RlZmluZQlCRF9GQUlMRUQJMHg2Ci0jZGVmaW5lIEJEX0FMTE9DQVRFRAkweDcKLSNkZWZpbmUgQkRfVFJJQk9PVAkweDgKLSNkZWZpbmUJQkRfQkFES01FCTB4ODAKLQotI2RlZmluZSBESUdJX0xPT1BCQUNLCSAgICAgICgnZCc8PDgpIHwgMjUyCQkvKiBFbmFibGUvZGlzYWJsZSBVQVJUIGludGVybmFsIGxvb3BiYWNrICovCi0jZGVmaW5lIERJR0lfU1BPTEwgICAgICAgICAgICAoJ2QnPDw4KSB8IDI1NAkJLyogY2hhbmdlIHBvbGxlciByYXRlICAgKi8KLQotI2RlZmluZSBESUdJX1NFVENVU1RPTUJBVUQJX0lPVygnZScsIDEwNiwgaW50KQkvKiBTZXQgaW50ZWdlciBiYXVkIHJhdGUgKi8KLSNkZWZpbmUgRElHSV9HRVRDVVNUT01CQVVECV9JT1IoJ2UnLCAxMDcsIGludCkJLyogR2V0IGludGVnZXIgYmF1ZCByYXRlICovCi0jZGVmaW5lIERJR0lfUkVTRVRfUE9SVAkJKCdlJzw8OCkgfCA5MwkJLyogUmVzZXQgcG9ydAkJKi8KLQotI2VuZGlmIC8qIERJR0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZG93bmxkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kb3dubGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0YWEyZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kb3dubGQuYworKysgL2Rldi9udWxsCkBAIC0xLDc5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAkSWQ6IGRvd25sZC5jLHYgMS42IDIwMDkvMDEvMTQgMTQ6MTA6NTQgbWFya2ggRXhwICQKLSAqLwotCi0vKgotKiogZG93bmxkLmMKLSoqCi0qKiAgVGhpcyBpcyB0aGUgZGFlbW9uIHRoYXQgc2VuZHMgdGhlIGZlcCwgYmlvcywgYW5kIGNvbmNlbnRyYXRvciBpbWFnZXMKLSoqICBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIGRyaXZlci4KLSoqIEJVR1M6Ci0qKiAgSWYgdGhlIGZpbGUgY2hhbmdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBkb3dubG9hZCwgeW91IHByb2JhYmx5Ci0qKiAgICAgd2lsbCBnZXQgd2hhdCB5b3UgZGVzZXJ2ZS4KLSoqCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL2Vycm5vLmg+Ci0KLSNpbmNsdWRlICJkZ2FwX3R5cGVzLmgiCi0jaW5jbHVkZSAiZGlnaS5oIgotI2luY2x1ZGUgImRnYXBfZmVwNS5oIgotCi0jaW5jbHVkZSAiZGdhcF9kb3dubGQuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1jaGFyCQkqcGdtOwotdm9pZAkJbXlwZXJyb3IoKTsKLQotLyoKLSoqICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGRpZmZlcmVudCBpbWFnZXMgYXZhaWxhYmxlCi0qKiAgdG8gZ2l2ZSB0byB0aGUgZHJpdmVyLiAgSXQgaXMgYXJyYW5nZWQgc28gdGhhdCB0aGUgdGhpbmdzIHRoYXQgYXJlCi0qKiAgY29uc3RhbnRzIG9yIHRoYXQgaGF2ZSBkZWZhdWx0cyBhcmUgZmlyc3QgaW50aGUgc3RydWN1dHJlIHRvIHNpbXBsaWZ5Ci0qKiAgdGhlIHRhYmxlIG9mIGluaXRpYWxpemVycy4KLSovCi1zdHJ1Y3QgaW1hZ2VfaW5mbyB7Ci0Jc2hvcnQJdHlwZTsJCS8qIGJpb3MsIGZlcCwgY29uYyAqLwotCXNob3J0CWZhbWlseTsJCS8qIGJvYXJkcyB0aGlzIGFwcGxpZXMgdG8gKi8KLQlzaG9ydAlzdWJ0eXBlOwkvKiBzdWJ0eXBlICovCi0JaW50CWxlbjsJCS8qIHNpemUgb2YgaW1hZ2UgKi8KLQljaGFyCSppbWFnZTsJCS8qIGlvY3RsIHN0cnVjdCArIGltYWdlICovCi0JY2hhcgkqbmFtZTsKLQljaGFyCSpmbmFtZTsJCS8qIGZpbGVuYW1lIG9mIGJpbmFyeSAoaS5lLiAiYXNmZXAuYmluIikgKi8KLQljaGFyCSpwYXRobmFtZTsJLyogcGF0aG5hbWUgdG8gdGhpcyBiaW5hcnkgKCIvZXRjL2RnYXAveHJmZXAuYmluIik7ICovCi0JdGltZV90CW10aW1lOwkJLyogTGFzdCBtb2RpZmljYXRpb24gdGltZSAqLwotfTsKLQotI2RlZmluZSBJQklPUwkwCi0jZGVmaW5lCUlGRVAJMQotI2RlZmluZQlJQ09OQwkyCi0jZGVmaW5lIElDT05GSUcJMwotI2RlZmluZQlJQkFECTQKLQotI2RlZmluZSBERUZBVUxUX0xPQyAiL2xpYi9maXJtd2FyZS9kZ2FwLyIKLQotc3RydWN0IGltYWdlX2luZm8JKmltYWdlX2xpc3Q7Ci1pbnQJCQluaW1hZ2VzLCBjb3VudDsKLQotc3RydWN0IGltYWdlX2luZm8gaW1hZ2VzW10gPSB7Ci17SUJJT1MsIFRfRVBDLCAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJFUEMvWCIsCSJmeGJpb3MuYmluIiwgREVGQVVMVF9MT0MgImZ4Ymlvcy5iaW4iLCAwIH0sCi17SUZFUCwgIFRfRVBDLCAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJFUEMvWCIsCSJmeGZlcC5iaW4iLCBERUZBVUxUX0xPQyAiZnhmZXAuYmluIiwgMCB9LAote0lDT05DLCBUX0VQQywgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiRVBDL1giLAkiZnhjb24uYmluIiwgREVGQVVMVF9MT0MgImZ4Y29uLmJpbiIsIDAgfSwKLQote0lCSU9TLCBUX0NYLCAgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiQy9YIiwJImN4Ymlvcy5iaW4iLCBERUZBVUxUX0xPQyAiY3hiaW9zLmJpbiIsIDAgfSwKLXtJRkVQLCAgVF9DWCwgICAgICAgU1VCVFlQRSwgMCwgTlVMTCwgIkMvWCIsCSJjeGhvc3QuYmluIiwgREVGQVVMVF9MT0MgImN4aG9zdC5iaW4iLCAwIH0sCi0KLXtJQklPUywgVF9DWCwgICAgICAgVF9QQ0lCVVMsIDAsIE5VTEwsICJDL1ggUENJIiwgImN4cGJpb3MuYmluIiwgREVGQVVMVF9MT0MgImN4cGJpb3MuYmluIiwgMCB9LAote0lGRVAsICBUX0NYLCAgICAgICBUX1BDSUJVUywgMCwgTlVMTCwgIkMvWCBQQ0kiLCAiY3hwZmVwLmJpbiIsIERFRkFVTFRfTE9DICJjeHBmZXAuYmluIiwgMCB9LAotCi17SUNPTkMsIFRfQ1gsICAgICAgIFNVQlRZUEUsIDAsIE5VTEwsICJDL1giLAkiY3hjb24uYmluIiwgREVGQVVMVF9MT0MgImN4Y29uLmJpbiIsIDAgfSwKLXtJQ09OQywgVF9DWCwgICAgICAgU1VCVFlQRSwgMCwgTlVMTCwgIkMvWCIsCSJpYm1jeGNvbi5iaW4iLCBERUZBVUxUX0xPQyAiaWJtY3hjb24uYmluIiwgMCB9LAote0lDT05DLCBUX0NYLCAgICAgICBTVUJUWVBFLCAwLCBOVUxMLCAiQy9YIiwJImlibWVuY29uLmJpbiIsIERFRkFVTFRfTE9DICJpYm1lbmNvbi5iaW4iLCAwIH0sCi0KLXtJQklPUywgRkFNSUxZLCAgIFRfUENYUiwgMCwgTlVMTCwgIlBDWFIiLAkieHJiaW9zLmJpbiIsIERFRkFVTFRfTE9DICJ4cmJpb3MuYmluIiwgMCB9LAote0lGRVAsICBGQU1JTFksICAgVF9QQ1hSLCAwLCAgTlVMTCwgICJQQ1hSIiwJInhyZmVwLmJpbiIsIERFRkFVTFRfTE9DICJ4cmZlcC5iaW4iLCAwICB9LAotCi17SUJJT1MsIFRfUENMSVRFLCAgIFNVQlRZUEUsIDAsIE5VTEwsICJYL2VtIiwJInN4Ymlvcy5iaW4iLCBERUZBVUxUX0xPQyAic3hiaW9zLmJpbiIsIDAgfSwKLXtJRkVQLCAgVF9QQ0xJVEUsICAgU1VCVFlQRSwgMCwgIE5VTEwsICAiWC9lbSIsCSJzeGZlcC5iaW4iLCBERUZBVUxUX0xPQyAic3hmZXAuYmluIiwgMCAgfSwKLQote0lCSU9TLCBUX0VQQywgICAgICBUX1BDSUJVUywgMCwgTlVMTCwgIlBDSSIsCSJwY2liaW9zLmJpbiIsIERFRkFVTFRfTE9DICJwY2liaW9zLmJpbiIsIDAgfSwKLXtJRkVQLCAgVF9FUEMsICAgICAgVF9QQ0lCVVMsIDAsIE5VTEwsICJQQ0kiLAkicGNpZmVwLmJpbiIsIERFRkFVTFRfTE9DICJwY2lmZXAuYmluIiwgMCB9LAote0lDT05GSUcsIDAsCSAgICAwLCAwLCBOVUxMLCAgICAgICAgIE5VTEwsCSJkZ2FwLmNvbmYiLAkiL2V0Yy9kZ2FwLmNvbmYiLCAwIH0sCi0KLS8qIElCQUQvTlVMTCBlbnRyeSBpbmRpY2F0aW5nIGVuZC1vZi10YWJsZSAqLwotCi17SUJBRCwgIDAsICAgICAwLCAwLCAgTlVMTCwgIE5VTEwsIE5VTEwsIE5VTEwsIDAgfQotCi19IDsKLQotaW50IAllcnJvcnByaW50ID0gMTsKLWludCAJbm9kbGRwcmludCA9IDE7Ci1pbnQJZGVidWdmbGFnOwotaW50IAlmZDsKLQotc3RydWN0IGRvd25sZF90ICppcDsJLyogSW1hZ2UgcG9pbnRlciBpbiBjdXJyZW50IGltYWdlICAqLwotc3RydWN0IGRvd25sZF90ICpkcDsgCS8qIGNvbmMuIGRvd25sb2FkICovCi0KLQotLyoKLSAqIFRoZSBzYW1lIGZvciBlaXRoZXIgdGhlIEZFUCBvciB0aGUgQklPUy4KLSAqICBBcHBlbmQgdGhlIGRvd25sZGlvIGhlYWRlciwgaXNzdWUgdGhlIGlvY3RsLCB0aGVuIGZyZWUKLSAqICB0aGUgYnVmZmVyLiAgTm90IGhvcnJpYmx5IENQVSBlZmZpY2llbnQsIGJ1dCBxdWl0ZSBSQU0gZWZmaWNpZW50LgotICovCi0KLXZvaWQgc3F1aXJ0KGludCByZXFfdHlwZSwgaW50IGJkaWQsIHN0cnVjdCBpbWFnZV9pbmZvICppaSkKLXsKLQlzdHJ1Y3QgZG93bmxkaW8JKmRsaW9wOwotCWludCBzaXplX2J1ZjsKLQlpbnQgc2ZkOwotCXN0cnVjdCBzdGF0IHNiOwotCi0JLyoKLQkgKiBJZiB0aGlzIGJpbmFyeSBjb21lcyBmcm9tIGEgZmlsZSwgc3RhdCBpdCB0byBzZWUgaG93Ci0JICogbGFyZ2UgaXQgaXMuIFllcywgd2UgaW50ZW50aW9uYWxseSBkbyB0aGlzIGVhY2gKLQkgKiB0aW1lIGZvciB0aGUgYmluYXJ5IG1heSBjaGFuZ2UgYmV0d2VlbiBsb2Fkcy4KLQkgKi8KLQotCWlmIChpaS0+cGF0aG5hbWUpIHsKLQkJc2ZkID0gb3BlbihpaS0+cGF0aG5hbWUsIE9fUkRPTkxZKTsKLQotCQlpZiAoc2ZkIDwgMCApIHsKLQkJCW15cGVycm9yKGlpLT5wYXRobmFtZSk7Ci0JCQlnb3RvIHNxdWlydF9lbmQ7Ci0JCX0KLQotCQlpZiAoZnN0YXQoc2ZkLCAmc2IpID09IC0xICkgewotCQkJbXlwZXJyb3IoaWktPnBhdGhuYW1lKTsKLQkJCWdvdG8gc3F1aXJ0X2VuZDsKLQkJfQotCi0JCWlpLT5sZW4gPSBzYi5zdF9zaXplOwotCX0KLQotCXNpemVfYnVmID0gaWktPmxlbiArIHNpemVvZihzdHJ1Y3QgZG93bmxkaW8pOwotCi0JLyoKLQkgKiBUaGlzIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbi4gIEl0IGlzCi0JICogbm90IHJlc2lsaWVudCBhbmQgc2hvdWxkIGJlIGFyb3VuZCBvbmx5IGxvbmcgZW5vdWdoIGZvciB0aGUgZC9sCi0JICogdG8gaGFwcGVuLgotCSAqLwotCWRsaW9wID0gKHN0cnVjdCBkb3dubGRpbyAqKSBtYWxsb2Moc2l6ZV9idWYpOwotCi0JaWYgKGRsaW9wID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsIiVzOiBjYW4ndCBnZXQgJWQgYnl0ZXMgb2YgbWVtb3J5OyBhYm9ydGluZ1xuIiwKLQkJCXBnbSwgc2l6ZV9idWYpOwotCQlleGl0ICgxKTsKLQl9Ci0KLQkvKiBOb3csIHN0aWNrIHRoZSBpbWFnZSBpbiBmZXBpbWFnZS4gIFRoaXMgY2FuIGNvbWUgZnJvbSBlaXRoZXIKLQkgKiAgdGhlIGNvbXBpbGVkLWluIGltYWdlIG9yIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0JICovCi0JaWYgKGlpLT5wYXRobmFtZSkKLQkJcmVhZChzZmQsIGRsaW9wLT5pbWFnZS5maS5mZXBpbWFnZSwgaWktPmxlbik7Ci0JZWxzZQotCQltZW1jcHkoZGxpb3AgLT5pbWFnZS5maS5mZXBpbWFnZSwgaWktPmltYWdlLCBpaS0+bGVuKTsKLQotCWRsaW9wLT5yZXFfdHlwZSA9IHJlcV90eXBlOwotCWRsaW9wLT5iZGlkID0gYmRpZDsKLQotCWRsaW9wLT5pbWFnZS5maS5sZW4gPSBpaS0+bGVuOwotCi0JaWYgKGRlYnVnZmxhZykKLQkJcHJpbnRmKCJzZW5kaW5nICVkIGJ5dGVzIG9mICVzICVzIGZyb20gJXNcbiIsCi0JCQlpaS0+bGVuLAotCQkJKGlpLT50eXBlID09IElGRVApID8gIkZFUCIgOiAoaWktPnR5cGUgPT0gSUJJT1MpID8gIkJJT1MiIDogIkNPTkZJRyIsCi0JCQlpaS0+bmFtZSA/IGlpLT5uYW1lIDogIiIsCi0JCQkoaWktPnBhdGhuYW1lKSA/IGlpLT5wYXRobmFtZSA6ICJpbnRlcm5hbCBpbWFnZSIgKTsKLQotCWlmIChpb2N0bChmZCwgRElHSV9ETFJFUV9TRVQsIChjaGFyICopIGRsaW9wKSA9PSAtMSkgewotCQlpZihlcnJvcnByaW50KSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkiJXM6IHdhcm5pbmcgLSBkb3dubG9hZCBpb2N0bCBmYWlsZWRcbiIscGdtKTsKLQkJCWVycm9ycHJpbnQgPSAwOwotCQl9Ci0JCXNsZWVwKDIpOwotCX0KLQotc3F1aXJ0X2VuZDoKLQotCWlmIChpaS0+cGF0aG5hbWUpIHsKLQkJY2xvc2Uoc2ZkKTsKLQl9Ci0JZnJlZShkbGlvcCk7Ci19Ci0KLQotLyoKLSAqICBTZWUgaWYgd2UgbmVlZCB0byByZWxvYWQgdGhlIGRvd25sb2FkIGltYWdlIGluIGNvcmUKLSAqCi0gKi8KLXZvaWQgY29uc2lkZXJfZmlsZV9yZXNjYW4oc3RydWN0IGltYWdlX2luZm8gKmlpKQotewotCWludCBzZmQ7Ci0JaW50IGxlbjsKLQlzdHJ1Y3Qgc3RhdCAJc2I7Ci0KLQkvKiBUaGlzIG9wZXJhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gd2UncmUgd29ya2luZyBmcm9tIGEgZmlsZSAqLwotCi0JaWYgKGlpLT5wYXRobmFtZSkgewotCi0JCXNmZCA9IG9wZW4gKGlpLT5wYXRobmFtZSwgT19SRE9OTFkpIDsKLQkJaWYgKHNmZCA8IDAgKSB7Ci0JCQlteXBlcnJvcihpaS0+cGF0aG5hbWUpOwotCQkJZXhpdCgxKSA7Ci0JCX0KLQotCQlpZiggZnN0YXQoc2ZkLCZzYikgPT0gLTEgKSB7Ci0JCQlteXBlcnJvcihpaS0+cGF0aG5hbWUpOwotCQkJZXhpdCgxKTsKLQkJfQotCi0JCS8qIElmIHRoZSBmaWxlIGhhc24ndCBjaGFuZ2VkIHNpbmNlIHdlIGxhc3QgZGlkIHRoaXMsCi0JCSAqIGFuZCB3ZSBoYXZlIG5vdCBkb25lIGEgZnJlZSgpIG9uIHRoZSBpbWFnZSwgYmFpbAotCQkgKi8KLQkJaWYgKGlpLT5pbWFnZSAmJiAoc2Iuc3RfbXRpbWUgPT0gaWktPm10aW1lKSkKLQkJCWdvdG8gZW5kX3Jlc2NhbjsKLQotCQlpaS0+bGVuID0gbGVuID0gc2Iuc3Rfc2l6ZTsKLQotCQkvKiBSZWNvcmQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZmlsZSAqLwotCQlpaS0+bXRpbWUgPSBzYi5zdF9tdGltZTsKLQotCQkvKiBpbWFnZSBzaG91bGQgYmUgTlVMTCB1bmxlc3MgdGhlcmUgaXMgYW4gaW1hZ2UgbWFsbG9jZWQKLQkJICogaW4gYWxyZWFkeS4gIEJlZm9yZSB3ZSBtYWxsb2MgYWdhaW4sIG1ha2Ugc3VyZSB3ZSBkb24ndAotCQkgKiBoYXZlIGEgbWVtb3J5IGxlYWsuCi0JCSAqLwotCQlpZiAoIGlpLT5pbWFnZSApIHsKLQkJCWZyZWUoIGlpLT5pbWFnZSApOwotCQkJLyogaWktPmltYWdlID0gTlVMTDsgKi8gLyogbm90IG5lY2Vzc2FyeSAqLwotCQl9Ci0KLQkJLyogVGhpcyBpbWFnZSB3aWxsIGJlIGtlcHQgb25seSBsb25nIGVub3VnaCBmb3IgdGhlCi0JCSAqIGRvd25sb2FkIHRvIGhhcHBlbi4gIEFmdGVyIHNlbmRpbmcgdGhlIGxhc3QgYmxvY2ssCi0JCSAqIGl0IHdpbGwgYmUgZnJlZWQKLQkJICovCi0JCWlpLT5pbWFnZSA9IG1hbGxvYyhsZW4pIDsKLQotCQlpZiAoaWktPmltYWdlID09IE5VTEwpIHsKLQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSIlczogY2FuJ3QgZ2V0ICVkIGJ5dGVzIG9mIG1lbW9yeTsgYWJvcnRpbmdcbiIsCi0JCQkJIHBnbSwgbGVuKTsKLQkJCWV4aXQgKDEpOwotCQl9Ci0KLQkJaWYgKHJlYWQoc2ZkLCBpaS0+aW1hZ2UsIGxlbikgPCBsZW4pIHsKLQkJCWZwcmludGYoc3RkZXJyLCIlczogcmVhZCBlcnJvciBvbiAlczsgYWJvcnRpbmdcbiIsCi0JCQkJcGdtLCBpaS0+cGF0aG5hbWUpOwotCQkJZXhpdCAoMSk7Ci0JCX0KLQotZW5kX3Jlc2NhbjoKLQkJY2xvc2Uoc2ZkKTsKLQotCX0KLX0KLQotLyoKLSAqIFNjYW4gZm9yIGltYWdlcyB0byBtYXRjaCB0aGUgZHJpdmVyIHJlcXVlc3RzCi0gKi8KLQotc3RydWN0IGltYWdlX2luZm8gKiBmaW5kX2NvbmNfaW1hZ2UoKQotewotCWludCB4OwotCXN0cnVjdCBpbWFnZV9pbmZvICppID0gTlVMTDsKLQotCWZvciAoIHggPSAwOyB4IDwgbmltYWdlczsgeCsrICkgewotCQlpPSZpbWFnZV9saXN0W3hdOwotCi0JCWlmKGktPnR5cGUgIT0gSUNPTkMpCi0JCQljb250aW51ZTsKLQotCQljb25zaWRlcl9maWxlX3Jlc2NhbihpKSA7Ci0KLQkJaXAgPSAoc3RydWN0IGRvd25sZF90ICopIGltYWdlX2xpc3RbeF0uaW1hZ2U7Ci0JCWlmIChpcCA9PSBOVUxMKSBjb250aW51ZTsKLQotCQkvKgotCQkgKiBXaGVuIEkgcmVtb3ZlZCBDbHVzdGVycG9ydCwgSSBrZXB0IG9ubHkgdGhlIGNvZGUgdGhhdCBJCi0JCSAqIHdhcyBTVVJFIHdhc24ndCBDbHVzdGVyUG9ydC4gIFdlIG1heSBub3QgbmVlZCB0aGUgbmV4dCB0d28KLQkJICogbGluZXMgb2YgY29kZS4KLQkJICovCi0JCWlmICgoZHAtPmRsX3R5cGUgIT0gJ1AnICkgJiYgKCBpcC0+ZGxfc3JldiA9PSBkcC0+ZGxfc3JldiApKQotCQkJcmV0dXJuIGk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlzdHJ1Y3QgZG93bmxkaW8JZGxpbzsKLQlpbnQgCQlvZmZzZXQsIGJzaXplOwotCWludCAJCXg7Ci0JY2hhciAJCSpkb3duLCAqaW1hZ2UsICpmbmFtZTsKLQlzdHJ1Y3QgaW1hZ2VfaW5mbyAqaWk7Ci0KLQlwZ20gPSBhcmd2WzBdOwotCWRwID0gJmRsaW8uaW1hZ2UuZGw7CQkvKiBjb25jLiBkb3dubG9hZCAqLwotCi0Jd2hpbGUoKGFyZ2MgPiAyKSAmJiAhc3RyY21wKGFyZ3ZbMV0sIi1kIikpIHsKLQkJZGVidWdmbGFnKysgOwotCQlhcmdjLS0gOwotCQlhcmd2KysgOwotCX0KLQotCWlmKGFyZ2MgPCAyKSB7Ci0JCWZwcmludGYoc3RkZXJyLAotCQkJInVzYWdlOiAlcyBkb3dubG9hZC1kZXZpY2UgW2ltYWdlLWZpbGVdIC4uLlxuIiwKLQkJCXBnbSk7Ci0JCWV4aXQoMSk7Ci0JfQotCi0KLQotCS8qCi0JICogRGFlbW9uaXplLCB1bmxlc3MgZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4KLQkgKi8KLQlpZiAoZGVidWdmbGFnID09IDApIHsKLQkJc3dpdGNoIChmb3JrKCkpCi0JCXsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSAtMToKLQkJCXJldHVybiAxOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXNldHNpZCgpOwotCi0JCS8qCi0JCSAqIFRoZSBjaGlsZCBubyBsb25nZXIgbmVlZHMgInN0ZGluIiwgInN0ZG91dCIsIG9yICJzdGRlcnIiLAotCQkgKiBhbmQgc2hvdWxkIG5vdCBibG9jayBwcm9jZXNzZXMgd2FpdGluZyBmb3IgdGhlbSB0byBjbG9zZS4KLQkJICovCi0JCWZjbG9zZShzdGRpbik7Ci0JCWZjbG9zZShzdGRvdXQpOwotCQlmY2xvc2Uoc3RkZXJyKTsKLQotCX0KLQotCXdoaWxlICgxKSB7Ci0JCWlmKCAoZmQgPSBvcGVuKGFyZ3ZbMV0sIE9fUkRXUikpID09IC0xICkgewotCQkJc2xlZXAoMSk7Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkqKiBjcmVhdGUgYSBsaXN0IG9mIGltYWdlcyB0byBzZWFyY2ggdGhyb3VnaCB3aGVuIHRyeWluZyB0byBtYXRjaAotCSoqIHJlcXVlc3RzIGZyb20gdGhlIGRyaXZlci4gIFB1dCBpbWFnZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluCi0JKiogdGhlIGxpc3QgYmVmb3JlIGJ1aWx0IGluIGltYWdlcyBzbyB0aGF0IHRoZSBjb21tYW5kIGxpbmUgaW1hZ2VzCi0JKiogY2FuIG92ZXJyaWRlIHRoZSBidWlsdCBpbiBvbmVzLgotCSovCi0KLQkvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpc3QgKi8KLQotCW5pbWFnZXMgPSBhcmdjIC0gMjsKLQotCS8qIGNvdW50IHRoZSBudW1iZXIgb2YgZGVmYXVsdCBsaXN0IGVudHJpZXMgKi8KLQotCWZvciAoY291bnQgPSAwOyBpbWFnZXNbY291bnRdLnR5cGUgIT0gSUJBRDsgKytjb3VudCkgOwotCi0JbmltYWdlcyArPSBjb3VudDsKLQotCS8qIFJlYWxseSBzaG91bGQganVzdCByZW1vdmUgdGhlIHZhcmlhYmxlICJpbWFnZV9saXN0Ii4uLi4gcm9iZXJ0bCAqLwotCWltYWdlX2xpc3QgPSBpbWFnZXM7Ci0KLQkvKiBnZXQgdGhlIGltYWdlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLQlmb3IoeCA9IDI7IHggPCBhcmdjOyB4KyspIHsKLQkJaW50IHh4OwotCi0JCS8qCi0JCSAqIHN0cmlwIG9mZiBhbnkgbGVhZGluZyBwYXRoIGluZm9ybWF0aW9uIGZvcgotCQkgKiBkZXRlcm1pbmluZyBmaWxlIHR5cGUKLQkJICovCi0JCWlmKCAoZm5hbWUgPSBzdHJyY2hyKGFyZ3ZbeF0sJy8nKSkgPT0gTlVMTCkKLQkJCWZuYW1lID0gYXJndlt4XTsKLQkJZWxzZQotCQkJZm5hbWUrKzsJLyogc2tpcCB0aGUgc2xhc2ggKi8KLQotCQlmb3IgKHh4ID0gMDsgeHggPCBjb3VudDsgeHgrKykgewotCQkJaWYgKHN0cmNtcChmbmFtZSwgaW1hZ2VzW3h4XS5mbmFtZSkgPT0gMCApIHsKLQkJCQlpbWFnZXNbeHhdLnBhdGhuYW1lID0gYXJndlt4XTsKLQotCQkJCS8qIGltYWdlIHNob3VsZCBiZSBOVUxMIHVudGlsICovCi0JCQkJLyogc3BhY2UgaXMgbWFsbG9jZWQgKi8KLQkJCQlpbWFnZXNbeHhdLmltYWdlID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQotICAgICAgICBzbGVlcCgzKTsKLQotCS8qCi0JKiogRW5kbGVzcyBsb29wOiBnZXQgYSByZXF1ZXN0IGZyb20gdGhlIGZlcCwgYW5kIHNlcnZpY2UgdGhhdCByZXF1ZXN0LgotCSovCi0JZm9yKDs7KSB7Ci0JCS8qIGdldCB0aGUgcmVxdWVzdCAqLwotCQlpZiAoZGVidWdmbGFnKQotCQkJcHJpbnRmKCJiNCBnZXQgaW9jdGwuLi4iKTsKLQotCQlpZiAoaW9jdGwoZmQsRElHSV9ETFJFUV9HRVQsICZkbGlvKSA9PSAtMSApIHsKLQkJCWlmIChlcnJvcnByaW50KSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCSIlczogd2FybmluZyAtIGRvd25sb2FkIGlvY3RsIGZhaWxlZFxuIiwKLQkJCQkJcGdtKTsKLQkJCQllcnJvcnByaW50ID0gMDsKLQkJCX0KLQkJCXNsZWVwKDIpOwotCQl9IGVsc2UgewotCQkJaWYgKGRlYnVnZmxhZykKLQkJCQlwcmludGYoImRsaW8ucmVxX3R5cGUgaXMgJWQgYmQgJWRcbiIsCi0JCQkJCWRsaW8ucmVxX3R5cGUsZGxpby5iZGlkKTsKLQotCQkJc3dpdGNoKGRsaW8ucmVxX3R5cGUpIHsKLQkJCWNhc2UgRExSRVFfQklPUzoKLQkJCQkvKgotCQkJCSoqIGZpbmQgdGhlIGJpb3MgaW1hZ2UgZm9yIHRoaXMgdHlwZQotCQkJCSovCi0JCQkJZm9yICggeCA9IDA7IHggPCBuaW1hZ2VzOyB4KysgKSB7Ci0JCQkJCWlmKGltYWdlX2xpc3RbeF0udHlwZSAhPSBJQklPUykKLQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCWlmICgoZGxpby5pbWFnZS5maS50eXBlICYgRkFNSUxZKSA9PQotCQkJCQkJaW1hZ2VfbGlzdFt4XS5mYW1pbHkpIHsKLQotCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLmZhbWlseSA9PSBUX0NYICAgKSB7Ci0JCQkJCQkJaWYgKChkbGlvLmltYWdlLmZpLnR5cGUgJiBCVVNUWVBFKQotCQkJCQkJCQk9PSBUX1BDSUJVUyApIHsKLQkJCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLnN1YnR5cGUKLQkJCQkJCQkJCT09IFRfUENJQlVTICkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIGltYWdlX2xpc3RbeF0uZmFtaWx5ID09IFRfRVBDICkgewotCQkJCQkJLyogSWYgc3VidHlwZSBvZiBpbWFnZSBpcyBUX1BDSUJVUywgaXQgaXMgKi8KLQkJCQkJCS8qIGEgUENJIEVQQyBpbWFnZSwgc28gdGhlIGJvYXJkIG11c3QgKi8KLQkJCQkJCS8qIGhhdmUgYnVzIHR5cGUgVF9QQ0lCVVMgdG8gbWF0Y2ggKi8KLQkJCQkJCQlpZiAoKGRsaW8uaW1hZ2UuZmkudHlwZSAmIEJVU1RZUEUpCi0JCQkJCQkJCT09IFRfUENJQlVTICkgewotCQkJCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZQotCQkJCQkJCQkJPT0gVF9QQ0lCVVMgKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCS8qIE5PTiBQQ0kgRVBDIGRvZXNuJ3QgdXNlIFBDSSBpbWFnZSAqLwotCQkJCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZQotCQkJCQkJCQkJIT0gVF9QQ0lCVVMgKQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChkbGlvLmltYWdlLmZpLnR5cGUgJiBTVUJUWVBFKSA9PSBpbWFnZV9saXN0W3hdLnN1YnR5cGUpIHsKLQkJCQkJCS8qIFBDWFIgYm9hcmQgd2lsbCBicmVhayBvdXQgb2YgdGhlIGxvb3AgaGVyZSAqLwotCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLnN1YnR5cGUgPT0gVF9QQ1hSICAgKSB7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICggeCA+PSBuaW1hZ2VzKSB7Ci0JCQkJCS8qCi0JCQkJCSoqIG5vIHZhbGlkIGltYWdlcyBleGlzdAotCQkJCQkqLwotCQkJCQlpZihub2RsZHByaW50KSB7Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJCSIlczogY2Fubm90IGZpbmQgY29ycmVjdCBCSU9TIGltYWdlXG4iLAotCQkJCQkJCXBnbSk7Ci0JCQkJCQlub2RsZHByaW50ID0gMDsKLQkJCQkJfQotCQkJCQlkbGlvLmltYWdlLmZpLnR5cGUgPSAtMTsKLQkJCQkJaWYgKGlvY3RsKGZkLCBESUdJX0RMUkVRX1NFVCwgJmRsaW8pID09IC0xKSB7Ci0JCQkJCQlpZiAoZXJyb3JwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJCSIlczogd2FybmluZyAtIGRvd25sb2FkIGlvY3RsIGZhaWxlZFxuIiwKLQkJCQkJCQlwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQgPSAwOwotCQkJCQkJfQotCQkJCQkJc2xlZXAoMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXNxdWlydChkbGlvLnJlcV90eXBlLCBkbGlvLmJkaWQsICZpbWFnZV9saXN0W3hdKTsKLQkJCQlicmVhayA7Ci0KLQkJCWNhc2UgRExSRVFfRkVQOgotCQkJCS8qCi0JCQkJKiogZmluZCB0aGUgZmVwIGltYWdlIGZvciB0aGlzIHR5cGUKLQkJCQkqLwotCQkJCWZvciAoIHggPSAwOyB4IDwgbmltYWdlczsgeCsrICkgewotCQkJCQlpZihpbWFnZV9saXN0W3hdLnR5cGUgIT0gSUZFUCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiggKGRsaW8uaW1hZ2UuZmkudHlwZSAmIEZBTUlMWSkgPT0KLQkJCQkJCWltYWdlX2xpc3RbeF0uZmFtaWx5ICkgewotCQkJCQkJaWYgKCBpbWFnZV9saXN0W3hdLmZhbWlseSA9PSBUX0NYICAgKSB7Ci0JCQkJCQkJLyogQy9YIFBDSSBib2FyZCAqLwotCQkJCQkJCWlmICgoZGxpby5pbWFnZS5maS50eXBlICYgQlVTVFlQRSkKLQkJCQkJCQkJPT0gVF9QQ0lCVVMgKSB7Ci0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQk9PSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLyogUmVndWxhciBDWCAqLwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICggaW1hZ2VfbGlzdFt4XS5mYW1pbHkgPT0gVF9FUEMgICApICB7Ci0JCQkJCQkvKiBJZiBzdWJ0eXBlIG9mIGltYWdlIGlzIFRfUENJQlVTLCBpdCBpcyAqLwotCQkJCQkJLyogYSBQQ0kgRVBDIGltYWdlLCBzbyB0aGUgYm9hcmQgbXVzdCAqLwotCQkJCQkJLyogaGF2ZSBidXMgdHlwZSBUX1BDSUJVUyB0byBtYXRjaCAqLwotCQkJCQkJCWlmICgoZGxpby5pbWFnZS5maS50eXBlICYgQlVTVFlQRSkKLQkJCQkJCQkJPT0gVF9QQ0lCVVMgKSB7Ci0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQk9PSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLyogTk9OIFBDSSBFUEMgZG9lc24ndCB1c2UgUENJIGltYWdlICovCi0JCQkJCQkJCWlmICggaW1hZ2VfbGlzdFt4XS5zdWJ0eXBlCi0JCQkJCQkJCQkhPSBUX1BDSUJVUyApCi0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKGRsaW8uaW1hZ2UuZmkudHlwZSAmIFNVQlRZUEUpID09IGltYWdlX2xpc3RbeF0uc3VidHlwZSkgewotCQkJCQkJLyogUENYUiBib2FyZCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBoZXJlICovCi0JCQkJCQlpZiAoIGltYWdlX2xpc3RbeF0uc3VidHlwZSA9PSBUX1BDWFIgICApIHsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCB4ID49IG5pbWFnZXMpIHsKLQkJCQkJLyoKLQkJCQkJKiogbm8gdmFsaWQgaW1hZ2VzIGV4aXN0Ci0JCQkJCSovCi0JCQkJCWlmKG5vZGxkcHJpbnQpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiBjYW5ub3QgZmluZCBjb3JyZWN0IEZFUCBpbWFnZVxuIiwKLQkJCQkJCQlwZ20pOwotCQkJCQkJbm9kbGRwcmludCA9IDA7Ci0JCQkJCX0KLQkJCQkJZGxpby5pbWFnZS5maS50eXBlPS0xOwotCQkJCQlpZiggaW9jdGwoZmQsRElHSV9ETFJFUV9TRVQsJmRsaW8pID09IC0xICkgewotCQkJCQkJaWYoZXJyb3JwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQkJCQlwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQ9MDsKLQkJCQkJCX0KLQkJCQkJCXNsZWVwKDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzcXVpcnQoZGxpby5yZXFfdHlwZSwgZGxpby5iZGlkLCAmaW1hZ2VfbGlzdFt4XSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgRExSRVFfREVWQ1JFQVRFOgotCQkJCXsKLQkJCQkJY2hhciBzdHJpbmdbMTAyNF07Ci0jaWYgMAotCQkJCQlzcHJpbnRmKHN0cmluZywgIiVzIC9wcm9jL2RnYXAvJWQvbWtub2QiLCBERUZTSEVMTCwgZGxpby5iZGlkKTsKLSNlbmRpZgotCQkJCQlzcHJpbnRmKHN0cmluZywgIiVzIC91c3Ivc2Jpbi9kZ2FwX3VwZGF0ZWRldnMgJWQiLCBERUZTSEVMTCwgZGxpby5iZGlkKTsKLQkJCQkJc3lzdGVtKHN0cmluZyk7Ci0KLQkJCQkJaWYgKGRlYnVnZmxhZykKLQkJCQkJCXByaW50ZigiQ3JlYXRlZCBEZXZpY2VzLlxuIik7Ci0JCQkJCWlmIChpb2N0bChmZCwgRElHSV9ETFJFUV9TRVQsICZkbGlvKSA9PSAtMSApIHsKLQkJCQkJCWlmKGVycm9ycHJpbnQpIHsKLQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nIC0gREVWQ1JFQVRFIGlvY3RsIGZhaWxlZFxuIixwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQgPSAwOwotCQkJCQkJfQotCQkJCQkJc2xlZXAoMik7Ci0JCQkJCX0KLQkJCQkJaWYgKGRlYnVnZmxhZykKLQkJCQkJCXByaW50ZigiQWZ0ZXIgaW9jdGwgc2V0IC0gQ3JlYXRlZCBEZXZpY2UuXG4iKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBETFJFUV9DT05GSUc6Ci0JCQkJZm9yICggeCA9IDA7IHggPCBuaW1hZ2VzOyB4KysgKSB7Ci0JCQkJCWlmKGltYWdlX2xpc3RbeF0udHlwZSAhPSBJQ09ORklHKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmICggeCA+PSBuaW1hZ2VzKSB7Ci0JCQkJCS8qCi0JCQkJCSoqIG5vIHZhbGlkIGltYWdlcyBleGlzdAotCQkJCQkqLwotCQkJCQlpZihub2RsZHByaW50KSB7Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJCSIlczogY2Fubm90IGZpbmQgY29ycmVjdCBDT05GSUcgaW1hZ2VcbiIsCi0JCQkJCQkJcGdtKTsKLQkJCQkJCW5vZGxkcHJpbnQgPSAwOwotCQkJCQl9Ci0JCQkJCWRsaW8uaW1hZ2UuZmkudHlwZT0tMTsKLQkJCQkJaWYgKGlvY3RsKGZkLCBESUdJX0RMUkVRX1NFVCwgJmRsaW8pID09IC0xICkgewotCQkJCQkJaWYoZXJyb3JwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQkJCQlwZ20pOwotCQkJCQkJCWVycm9ycHJpbnQ9MDsKLQkJCQkJCX0KLQkJCQkJCXNsZWVwKDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXNxdWlydChkbGlvLnJlcV90eXBlLCBkbGlvLmJkaWQsICZpbWFnZV9saXN0W3hdKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBETFJFUV9DT05DOgotCQkJCS8qCi0JCQkJKiogZmluZCB0aGUgaW1hZ2UgbmVlZGVkIGZvciB0aGlzIGRvd25sb2FkCi0JCQkJKi8KLQkJCQlpZiAoIGRwLT5kbF9zZXEgPT0gMCApIHsKLQkJCQkJLyoKLQkJCQkJKiogZmluZCBpbWFnZSBmb3IgaGFyZHdhcmUgcmV2IHJhbmdlCi0JCQkJCSovCi0JCQkJCWZvciAoIHggPSAwOyB4IDwgbmltYWdlczsgeCsrICkgewotCQkJCQkJaWk9JmltYWdlX2xpc3RbeF07Ci0KLQkJCQkJCWlmKGltYWdlX2xpc3RbeF0udHlwZSAhPSBJQ09OQykKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJY29uc2lkZXJfZmlsZV9yZXNjYW4oaWkpIDsKLQotCQkJCQkJaXAgPSAoc3RydWN0IGRvd25sZF90ICopIGltYWdlX2xpc3RbeF0uaW1hZ2U7Ci0JCQkJCQlpZiAoaXAgPT0gTlVMTCkgY29udGludWU7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBXaGVuIEkgcmVtb3ZlZCBDbHVzdGVycG9ydCwgSSBrZXB0IG9ubHkgdGhlCi0JCQkJCQkgKiBjb2RlIHRoYXQgSSB3YXMgU1VSRSB3YXNuJ3QgQ2x1c3RlclBvcnQuCi0JCQkJCQkgKiBXZSBtYXkgbm90IG5lZWQgdGhlIG5leHQgZm91ciBsaW5lcyBvZiBjb2RlLgotCQkJCQkJICovCi0KLQkJCQkJCWlmICgoZHAtPmRsX3R5cGUgIT0gJ1AnICkgJiYKLQkJCQkJCSAoaXAtPmRsX2xyZXYgPD0gZHAtPmRsX2xyZXYgKSAmJgotCQkJCQkJICggZHAtPmRsX2xyZXYgPD0gaXAtPmRsX2hyZXYpKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCB4ID49IG5pbWFnZXMgKSB7Ci0JCQkJCQkvKgotCQkJCQkJKiogTm8gdmFsaWQgaW1hZ2VzIGV4aXN0Ci0JCQkJCQkqLwotCQkJCQkJaWYobm9kbGRwcmludCkgewotCQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiBjYW5ub3QgZmluZCBjb3JyZWN0IGRvd25sb2FkIGltYWdlICVkXG4iLAotCQkJCQkJCQlwZ20sIGRwLT5kbF9scmV2KTsKLQkJCQkJCQlub2RsZHByaW50PTA7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJKiogZmluZCBpbWFnZSB2ZXJzaW9uIHJlcXVpcmVkCi0JCQkJCSovCi0JCQkJCWlmICgoaWkgPSBmaW5kX2NvbmNfaW1hZ2UoKSkgPT0gTlVMTCApIHsKLQkJCQkJCS8qCi0JCQkJCQkqKiBObyB2YWxpZCBpbWFnZXMgZXhpc3QKLQkJCQkJCSovCi0JCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJCSIlczogY2FuJ3QgZmluZCByZXN0IG9mIGRvd25sb2FkIGltYWdlPz9cbiIsCi0JCQkJCQkJcGdtKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkqKiBkb3dubG9hZCBibG9jayBvZiBpbWFnZQotCQkJCSovCi0KLQkJCQlvZmZzZXQgPSAxMDI0ICogZHAtPmRsX3NlcTsKLQotCQkJCS8qCi0JCQkJKiogdGVzdCBpZiBibG9jayByZXF1ZXN0ZWQgd2l0aGluIGltYWdlCi0JCQkJKi8KLQkJCQlpZiAoIG9mZnNldCA8IGlpLT5sZW4gKSB7Ci0KLQkJCQkJLyoKLQkJCQkJKiogaWYgaXQgaXMsIGRldGVybWluZSBibG9jayBzaXplLCBzZXQgc2VnbWVudCwKLQkJCQkJKiogc2V0IHNpemUsIHNldCBwb2ludGVycywgYW5kIGNvcHkgYmxvY2sKLQkJCQkJKi8KLQkJCQkJaWYgKCggYnNpemUgPSBpaS0+bGVuIC0gb2Zmc2V0ICkgPiAxMDI0ICkKLQkJCQkJCWJzaXplID0gMTAyNDsKLQotCQkJCQkvKgotCQkJCQkqKiBjb3B5IGltYWdlIHZlcnNpb24gaW5mbyB0byBkb3dubG9hZCBhcmVhCi0JCQkJCSovCi0JCQkJCWRwLT5kbF9zcmV2ID0gaXAtPmRsX3NyZXY7Ci0JCQkJCWRwLT5kbF9scmV2ID0gaXAtPmRsX2xyZXY7Ci0JCQkJCWRwLT5kbF9ocmV2ID0gaXAtPmRsX2hyZXY7Ci0KLQkJCQkJZHAtPmRsX3NlZyA9ICg2NCAqIGRwLT5kbF9zZXEpICsgaXAtPmRsX3NlZzsKLQkJCQkJZHAtPmRsX3NpemUgPSBic2l6ZTsKLQotCQkJCQlkb3duID0gKGNoYXIgKikmZHAtPmRsX2RhdGFbMF07Ci0JCQkJCWltYWdlID0gKGNoYXIgKikoKGNoYXIgKilpcCArIG9mZnNldCk7Ci0KLQkJCQkJbWVtY3B5KGRvd24sIGltYWdlLCBic2l6ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkqKiBJbWFnZSBoYXMgYmVlbiBkb3dubG9hZGVkLCBzZXQgc2VnbWVudCBhbmQKLQkJCQkJKiogc2l6ZSB0byBpbmRpY2F0ZSBubyBtb3JlIGJsb2NrcwotCQkJCQkqLwotCQkJCQlkcC0+ZGxfc2VnID0gaXAtPmRsX3NlZzsKLQkJCQkJZHAtPmRsX3NpemUgPSAwOwotCi0JCQkJCS8qIE5vdywgd2UgY2FuIHJlbGVhc2UgdGhlIGNvbmNlbnRyYXRvciAqLwotCQkJCQkvKiBpbWFnZSBmcm9tIG1lbW9yeSBpZiB3ZSdyZSBydW5uaW5nICAqLwotCQkJCQkvKiBmcm9tIGZpbGVzeXN0ZW0gaW1hZ2VzICovCi0KLQkJCQkJaWYgKGlpLT5wYXRobmFtZSkKLQkJCQkJCWlmIChpaS0+aW1hZ2UpIHsKLQkJCQkJCQlmcmVlKGlpLT5pbWFnZSk7Ci0JCQkJCQkJaWktPmltYWdlID0gTlVMTDsKLQkJCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZGVidWdmbGFnKQotCQkJCQkJcHJpbnRmKAotCQkJCQkJInNlbmRpbmcgY29uYyBkbCBzZWN0aW9uICVkIHRvICVzIGZyb20gJXNcbiIsCi0JCQkJCQkJZHAtPmRsX3NlcSwgaWktPm5hbWUsCi0JCQkJCQlpaS0+cGF0aG5hbWUgPyBpaS0+cGF0aG5hbWUgOiAiSW50ZXJuYWwgSW1hZ2UiKTsKLQotCQkJCWlmIChpb2N0bChmZCwgRElHSV9ETFJFUV9TRVQsICZkbGlvKSA9PSAtMSApIHsKLQkJCQkJaWYgKGVycm9ycHJpbnQpIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVzOiB3YXJuaW5nIC0gZG93bmxvYWQgaW9jdGwgZmFpbGVkXG4iLAotCQkJCQkJCXBnbSk7Ci0JCQkJCQllcnJvcnByaW50PTA7Ci0JCQkJCX0KLQkJCQkJc2xlZXAoMik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfSAvKiBzd2l0Y2ggKi8KLQkJfQotCQlpZiAoZGVidWdmbGFnID4gMSkgewotCQkJcHJpbnRmKCJwYXVzaW5nOiAiKTsgZmZsdXNoKHN0ZG91dCk7Ci0JCQlmZmx1c2goc3RkaW4pOwotCQkJd2hpbGUoZ2V0Y2hhcigpICE9ICdcbicpOwotCQkJCXByaW50ZigiY29udGludWluZ1xuIik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0qKiBteXBlcnJvcigpCi0qKgotKiogIFNhbWUgYXMgbm9ybWFsIHBlcnJvcigpLCBidXQgcGxhY2VzIHRoZSBwcm9ncmFtIG5hbWUgYXQgdGhlIGJlZ2lubmluZwotKiogIG9mIHRoZSBtZXNzYWdlLgotKi8KLXZvaWQgbXlwZXJyb3IoY2hhciAqcykKLXsKLQlmcHJpbnRmKHN0ZGVyciwiJXM6ICVzOiAlcy5cbiIscGdtLCBzLCBzdHJlcnJvcihlcnJubykpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMKaW5kZXggNzA4YWRiYi4uNjBkOWI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jCkBAIC04MjcsOSArODI3LDggQEAKIAkgKiBDaGVjayB0byBtYWtlIHN1cmUgaXRzIGZvciB1cy4KIAkgKi8KIAlpZiAoYnJkLT5tYWdpYyAhPSBER05DX0JPQVJEX01BR0lDKSB7Ci0JCUFQUigoCi0JCSAgICAiUmVjZWl2ZWQgaW50ZXJydXB0ICglZCkgd2l0aCBhIGJvYXJkIHBvaW50ZXIgIgotCQkJCQkJInRoYXQgd2Fzbid0IG91cnMhXG4iLCBpcnEpKTsKKwkJQVBSKCgiUmVjZWl2ZWQgaW50ZXJydXB0ICglZCkgd2l0aCBhIGJvYXJkIHBvaW50ZXIgdGhhdCB3YXNuJ3Qgb3VycyFcbiIsCisJCQkgIGlycSkpOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCkBAIC04NDYsOCArODQ1LDcgQEAKIAkvKiBJZiAwLCBubyBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KIAlpZiAoIXBvbGxfcmVnKSB7CiAJCURQUl9JTlRSKCgKLQkJCSAiS2VybmVsIGludGVycnVwdGVkIHRvIG1lLCBidXQgbm8gcGVuZGluZyAiCi0JCQkJCQkJImludGVycnVwdHMuLi5cbiIpKTsKKwkJCSAiS2VybmVsIGludGVycnVwdGVkIHRvIG1lLCBidXQgbm8gcGVuZGluZyBpbnRlcnJ1cHRzLi4uXG4iKSk7CiAJCURHTkNfVU5MT0NLKGJyZC0+YmRfaW50cl9sb2NrLCBsb2NrX2ZsYWdzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KQEAgLTEzODgsOCArMTM4Niw3IEBACiAJCXdyaXRlYigodGVtcCB8IFVBUlRfTENSX1NCQyksICZjaC0+Y2hfY2xzX3VhcnQtPmxjcik7CiAJCWNoLT5jaF9mbGFncyB8PSAoQ0hfQlJFQUtfU0VORElORyk7CiAJCURQUl9JT0NUTCgoCi0JCQkiUG9ydCAlZC4gU3RhcnRpbmcgVUFSVF9MQ1JfU0JDISBzdGFydDogJWx4ICIKLQkJCSJzaG91bGQgZW5kOiAlbHhcbiIsCisJCQkiUG9ydCAlZC4gU3RhcnRpbmcgVUFSVF9MQ1JfU0JDISBzdGFydDogJWx4IHNob3VsZCBlbmQ6ICVseFxuIiwKIAkJCWNoLT5jaF9wb3J0bnVtLCBqaWZmaWVzLCBjaC0+Y2hfc3RvcF9zZW5kaW5nX2JyZWFrKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmMKaW5kZXggYzIwNDI2Ni4uYjFhMzliMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jCkBAIC04OCw3ICs4OCw3IEBACiAvKgogICogRmlsZSBvcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBDb250cm9sL01hbmFnZW1lbnQgbWFqb3IuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRnbmNfQm9hcmRGb3BzID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRnbmNfQm9hcmRGb3BzID0KIHsKIAkub3duZXIJCT0JVEhJU19NT0RVTEUsCiAJLnVubG9ja2VkX2lvY3RsID0gIAlkZ25jX21nbXRfaW9jdGwsCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkJaWYgKGRnbmNfTnVtQm9hcmRzKQogCQkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZ25jX2RyaXZlcik7CiAJCWVsc2UKLQkJCXByaW50aygiV0FSTklORzogZGduYyBkcml2ZXIgbG9hZCBmYWlsZWQuICBObyBEaWdpIE5lbyBvciBDbGFzc2ljIGJvYXJkcyBmb3VuZC5cbiIpOworCQkJcHJfd2FybigiV0FSTklORzogZGduYyBkcml2ZXIgbG9hZCBmYWlsZWQuICBObyBEaWdpIE5lbyBvciBDbGFzc2ljIGJvYXJkcyBmb3VuZC5cbiIpOwogCiAJCWRnbmNfY2xlYW51cF9tb2R1bGUoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX21nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCmluZGV4IDFjNWFiM2QuLmM1YjQyNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciB0YXNrbGV0IGFuZCBpbnRlcnJ1cHQgc3RydWN0cy9kZWZpbmVzICovCiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBGb3IgY29weV9mcm9tX3VzZXIvY29weV90b191c2VyICovCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgkvKiBGb3IgY29weV9mcm9tX3VzZXIvY29weV90b191c2VyICovCiAKICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogI2luY2x1ZGUgImRnbmNfcGNpLmgiCkBAIC03Nyw4ICs3Nyw3IEBACiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCWRnbmNfbWdtdF9pbl91c2VbbWlub3JdKys7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCURHTkNfVU5MT0NLKGRnbmNfZ2xvYmFsX2xvY2ssIGxvY2tfZmxhZ3MpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTEwNyw5ICsxMDYsOCBAQAogCiAJLyogbWdtdCBkZXZpY2UgKi8KIAlpZiAobWlub3IgPCBNQVhNR01UREVWSUNFUykgewotCQlpZiAoZGduY19tZ210X2luX3VzZVttaW5vcl0pIHsKKwkJaWYgKGRnbmNfbWdtdF9pbl91c2VbbWlub3JdKQogCQkJZGduY19tZ210X2luX3VzZVttaW5vcl0gPSAwOwotCQl9CiAJfQogCURHTkNfVU5MT0NLKGRnbmNfZ2xvYmFsX2xvY2ssIGxvY2tfZmxhZ3MpOwogCkBAIC0xNTMsNyArMTUxLDcgQEAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEREIHJldHVybmluZyBudW1ib2FyZHM6ICVkIHZlcnNpb246ICVzXG4iLAogCQkJZGRpLmRpbmZvX25ib2FyZHMsIGRkaS5kaW5mb192ZXJzaW9uKSk7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcih1YXJnLCAmZGRpLCBzaXplb2YgKGRkaSkpKQorCQlpZiAoY29weV90b191c2VyKHVhcmcsICZkZGksIHNpemVvZihkZGkpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWJyZWFrOwpAQCAtMTY1LDEzICsxNjMsMTMgQEAKIAogCQlzdHJ1Y3QgZGlnaV9pbmZvIGRpOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmYnJkLCB1YXJnLCBzaXplb2YoaW50KSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZicmQsIHVhcmcsIHNpemVvZihpbnQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CiAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEJEIGFza2luZyBhYm91dCBib2FyZDogJWRcbiIsIGJyZCkpOwogCi0JCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+IGRnbmNfTnVtQm9hcmRzKSB8fCAoZGduY19OdW1Cb2FyZHMgPT0gMCkpCisJCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+IGRnbmNfTnVtQm9hcmRzKSB8fAorCQkgICAgKGRnbmNfTnVtQm9hcmRzID09IDApKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJbWVtc2V0KCZkaSwgMCwgc2l6ZW9mKGRpKSk7CkBAIC0xOTUsNyArMTkzLDcgQEAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEJEIHJldHVybmluZyB0eXBlOiAleCBzdGF0ZTogJXggcG9ydHM6ICV4IHNpemU6ICV4XG4iLAogCQkJZGkuaW5mb19iZHR5cGUsIGRpLmluZm9fYmRzdGF0ZSwgZGkuaW5mb19ucG9ydHMsIGRpLmluZm9fcGh5c3NpemUpKTsKIAotCQlpZiAoY29weV90b191c2VyKHVhcmcsICZkaSwgc2l6ZW9mIChkaSkpKQorCQlpZiAoY29weV90b191c2VyKHVhcmcsICZkaSwgc2l6ZW9mKGRpKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlicmVhazsKQEAgLTIwOSw5ICsyMDcsOCBAQAogCQl1aW50IGJvYXJkID0gMDsKIAkJdWludCBjaGFubmVsID0gMDsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJm5pLCB1YXJnLCBzaXplb2YobmkpKSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5pLCB1YXJnLCBzaXplb2YobmkpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQl9CiAKIAkJRFBSX01HTVQoKCJESUdJX0dFVEJEIGFza2luZyBhYm91dCBib2FyZDogJWQgY2hhbm5lbDogJWRcbiIsCiAJCQluaS5ib2FyZCwgbmkuY2hhbm5lbCkpOwpAQCAtMjY4LDEyICsyNjUsMTQgQEAKIAkJbmkuY2ZsYWcgPSBjaC0+Y2hfY19jZmxhZzsKIAkJbmkubGZsYWcgPSBjaC0+Y2hfY19sZmxhZzsKIAotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UgfHwgY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKQorCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIENUU1BBQ0UgfHwKKwkJICAgIGNoLT5jaF9jX2NmbGFnICYgQ1JUU0NUUykKIAkJCW5pLmhmbG93ID0gMTsKIAkJZWxzZQogCQkJbmkuaGZsb3cgPSAwOwogCi0JCWlmICgoY2gtPmNoX2ZsYWdzICYgQ0hfU1RPUEkpIHx8IChjaC0+Y2hfZmxhZ3MgJiBDSF9GT1JDRURfU1RPUEkpKQorCQlpZiAoKGNoLT5jaF9mbGFncyAmIENIX1NUT1BJKSB8fAorCQkgICAgKGNoLT5jaF9mbGFncyAmIENIX0ZPUkNFRF9TVE9QSSkpCiAJCQluaS5yZWN2X3N0b3BwZWQgPSAxOwogCQllbHNlCiAJCQluaS5yZWN2X3N0b3BwZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMKaW5kZXggZGM1YTEzOC4uY2YyMmM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jCkBAIC0xMjAxLDcgKzEyMDEsOCBAQAogCWNoLT5jaF9jYWNoZWRfbHNyID0gMDsKIAogCS8qIFN0b3JlIGhvdyBtdWNoIHNwYWNlIHdlIGhhdmUgbGVmdCBpbiB0aGUgcXVldWUgKi8KLQlpZiAoKHFsZWZ0ID0gdGFpbCAtIGhlYWQgLSAxKSA8IDApCisJcWxlZnQgPSB0YWlsIC0gaGVhZCAtIDE7CisJaWYgKHFsZWZ0IDwgMCkKIAkJcWxlZnQgKz0gUlFVRVVFTUFTSyArIDE7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMKaW5kZXggYTZjNmFiYS4uZjBiMTdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jCkBAIC05NjQsOCArOTY0LDEwIEBACiAJaW50IGRlbHRhaGlnaDsKIAlpbnQgZGVsdGFsb3c7CiAKLQlpZiAobmV3cmF0ZSA8IDApCi0JCW5ld3JhdGUgPSAwOworCWlmIChuZXdyYXRlIDw9IDApIHsKKwkJY2gtPmNoX2N1c3RvbV9zcGVlZCA9IDA7CisJCXJldHVybjsKKwl9CiAKIAkvKgogCSAqICBTaW5jZSB0aGUgZGl2aXNvciBpcyBzdG9yZWQgaW4gYSAxNi1iaXQgaW50ZWdlciwgd2UgbWFrZSBzdXJlCkBAIC05NzgsNyArOTgwLDcgQEAKIAlpZiAobmV3cmF0ZSAmJiBuZXdyYXRlID4gY2gtPmNoX2JkLT5iZF9kaXZpZGVuZCkKIAkJbmV3cmF0ZSA9IGNoLT5jaF9iZC0+YmRfZGl2aWRlbmQ7CiAKLQl3aGlsZSAobmV3cmF0ZSA+IDApIHsKKwlpZiAobmV3cmF0ZSA+IDApIHsKIAkJdGVzdGRpdiA9IGNoLT5jaF9iZC0+YmRfZGl2aWRlbmQgLyBuZXdyYXRlOwogCiAJCS8qCkBAIC05OTUsMjggKzk5NywyMyBAQAogCQkgKiAgSWYgdGhlIHJhdGUgZm9yIHRoZSByZXF1ZXN0ZWQgZGl2aXNvciBpcyBjb3JyZWN0LCBqdXN0CiAJCSAqICB1c2UgaXQgYW5kIGJlIGRvbmUuCiAJCSAqLwotCQlpZiAodGVzdHJhdGVfaGlnaCA9PSBuZXdyYXRlICkKLQkJCWJyZWFrOworCQlpZiAodGVzdHJhdGVfaGlnaCAhPSBuZXdyYXRlKSB7CisJCQkvKgorCQkJICogIE90aGVyd2lzZSwgcGljayB0aGUgcmF0ZSB0aGF0IGlzIGNsb3NlciAoaS5lLiB3aGljaGV2ZXIgcmF0ZQorCQkJICogIGhhcyBhIHNtYWxsZXIgZGVsdGEpLgorCQkJICovCisJCQlkZWx0YWhpZ2ggPSB0ZXN0cmF0ZV9oaWdoIC0gbmV3cmF0ZTsKKwkJCWRlbHRhbG93ID0gbmV3cmF0ZSAtIHRlc3RyYXRlX2xvdzsKIAotCQkvKgotCQkgKiAgT3RoZXJ3aXNlLCBwaWNrIHRoZSByYXRlIHRoYXQgaXMgY2xvc2VyIChpLmUuIHdoaWNoZXZlciByYXRlCi0JCSAqICBoYXMgYSBzbWFsbGVyIGRlbHRhKS4KLQkJICovCi0JCWRlbHRhaGlnaCA9IHRlc3RyYXRlX2hpZ2ggLSBuZXdyYXRlOwotCQlkZWx0YWxvdyA9IG5ld3JhdGUgLSB0ZXN0cmF0ZV9sb3c7Ci0KLQkJaWYgKGRlbHRhaGlnaCA8IGRlbHRhbG93KSB7Ci0JCQluZXdyYXRlID0gdGVzdHJhdGVfaGlnaDsKLQkJfSBlbHNlIHsKLQkJCW5ld3JhdGUgPSB0ZXN0cmF0ZV9sb3c7CisJCQlpZiAoZGVsdGFoaWdoIDwgZGVsdGFsb3cpIHsKKwkJCQluZXdyYXRlID0gdGVzdHJhdGVfaGlnaDsKKwkJCX0gZWxzZSB7CisJCQkJbmV3cmF0ZSA9IHRlc3RyYXRlX2xvdzsKKwkJCX0KIAkJfQotCi0JCWJyZWFrOwogCX0KIAogCWNoLT5jaF9jdXN0b21fc3BlZWQgPSBuZXdyYXRlOwotCi0JcmV0dXJuOwogfQogCiAKQEAgLTEwMjUsNyArMTAyMiw4IEBACiAJaW50IHFsZWZ0ID0gMDsKIAogCS8qIFN0b3JlIGhvdyBtdWNoIHNwYWNlIHdlIGhhdmUgbGVmdCBpbiB0aGUgcXVldWUgKi8KLQlpZiAoKHFsZWZ0ID0gY2gtPmNoX3JfdGFpbCAtIGNoLT5jaF9yX2hlYWQgLSAxKSA8IDApCisJcWxlZnQgPSBjaC0+Y2hfcl90YWlsIC0gY2gtPmNoX3JfaGVhZCAtIDE7CisJaWYgKHFsZWZ0IDwgMCkKIAkJcWxlZnQgKz0gUlFVRVVFTUFTSyArIDE7CiAKIAkvKgpAQCAtMTExOSw3ICsxMTE3LDggQEAKIAkvKgogCSAqIElmIGNoYW5uZWwgbm93IGhhcyBzcGFjZSwgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uLgogCSAqLwotCWlmICgocWxlbiA9IGNoLT5jaF93X2hlYWQgLSBjaC0+Y2hfd190YWlsKSA8IDApCisJcWxlbiA9IGNoLT5jaF93X2hlYWQgLSBjaC0+Y2hfd190YWlsOworCWlmIChxbGVuIDwgMCkKIAkJcWxlbiArPSBXUVVFVUVTSVpFOwogCiAJaWYgKHFsZW4gPj0gKFdRVUVVRVNJWkUgLSAyNTYpKSB7CkBAIC0xOTE3LDcgKzE5MTYsOCBAQAogCWhlYWQgPSAoY2gtPmNoX3dfaGVhZCkgJiB0bWFzazsKIAl0YWlsID0gKGNoLT5jaF93X3RhaWwpICYgdG1hc2s7CiAKLQlpZiAoKHJldCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQorCXJldCA9IHRhaWwgLSBoZWFkIC0gMTsKKwlpZiAocmV0IDwgMCkKIAkJcmV0ICs9IFdRVUVVRVNJWkU7CiAKIAkvKiBMaW1pdCBwcmludGVyIHRvIG1heGNwcyAqLwpAQCAtMjAxNyw3ICsyMDE3LDggQEAKIAloZWFkID0gKGNoLT5jaF93X2hlYWQpICYgdG1hc2s7CiAJdGFpbCA9IChjaC0+Y2hfd190YWlsKSAmIHRtYXNrOwogCi0JaWYgKChidWZjb3VudCA9IHRhaWwgLSBoZWFkIC0gMSkgPCAwKQorCWJ1ZmNvdW50ID0gdGFpbCAtIGhlYWQgLSAxOworCWlmIChidWZjb3VudCA8IDApCiAJCWJ1ZmNvdW50ICs9IFdRVUVVRVNJWkU7CiAKIAlEUFJfV1JJVEUoKCIlZDogYnVmY291bnQ6ICV4IGNvdW50OiAleCB0YWlsOiAleCBoZWFkOiAleCB0bWFzazogJXhcbiIsCkBAIC0zMzE2LDEwICszMzE3LDEwIEBACiAKIAljYXNlIERJR0lfU0VUQ1VTVE9NQkFVRDoKIAl7Ci0JCXVpbnQgbmV3X3JhdGU7CisJCWludCBuZXdfcmF0ZTsKIAkJLyogTGV0IGdvIG9mIGxvY2tzIHdoZW4gYWNjZXNzaW5nIHVzZXIgc3BhY2UsIGNvdWxkIHNsZWVwICovCiAJCURHTkNfVU5MT0NLKGNoLT5jaF9sb2NrLCBsb2NrX2ZsYWdzKTsKLQkJcmMgPSBnZXRfdXNlcihuZXdfcmF0ZSwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKTsKKwkJcmMgPSBnZXRfdXNlcihuZXdfcmF0ZSwgKGludCBfX3VzZXIgKikgYXJnKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCQlER05DX0xPQ0soY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF9zeXNmcy5jCmluZGV4IDlhMThhMmMuLjJmOTM0NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ3JwL2RncnBfc3lzZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3N5c2ZzLmMKQEAgLTY1LDcgKzY1LDkgQEAKIAkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3NjYW5mKGJ1ZiwgIjB4JXhcbiIsICZkZ3JwX3BvbGxfdGljayk7CisJaWYgKHNzY2FuZihidWYsICIweCV4XG4iLCAmZGdycF9wb2xsX3RpY2spICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0dXJuIGNvdW50OwogfQogc3RhdGljIERFVklDRV9BVFRSKHBvbGxyYXRlLCAwNjAwLCBkZ3JwX2NsYXNzX3BvbGxyYXRlX3Nob3csCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3R0eS5jIGIvZHJpdmVycy9zdGFnaW5nL2RncnAvZGdycF90dHkuYwppbmRleCA3YTk2OTRjLi4zMGQyNjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGdycC9kZ3JwX3R0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ3JwL2RncnBfdHR5LmMKQEAgLTEzMTksNyArMTMxOSw4IEBACiAKIAlpZiAoY2gtPmNoX3R1bi51bl9vcGVuX2NvdW50ICE9IDAgJiYKIAkgICAgY2gtPmNoX3R1bi51bl90dHktPm9wcy0+Y2hhcnNfaW5fYnVmZmVyICYmCi0JICAgICgoY2gtPmNoX3R1bi51bl90dHktPm9wcy0+Y2hhcnNfaW5fYnVmZmVyKShjaC0+Y2hfdHVuLnVuX3R0eSkgIT0gMCkpIHsKKwkgICAgKChjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIpCisJICAgICAoY2gtPmNoX3R1bi51bl90dHkpICE9IDApKSB7CiAJCSp1bl9mbGFnID0gVU5fUFdBSVQ7CiAJCXJldHVybiAwOwogCX0KQEAgLTE1MDEsNyArMTUwMiw4IEBACiAJCSAqLwogCiAJCWlmIChjaC0+Y2hfdHVuLnVuX29wZW5fY291bnQgIT0gMCAmJgotCQkgICAgKChjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIpKGNoLT5jaF90dW4udW5fdHR5KSAhPSAwKSkgeworCQkgICAgKChjaC0+Y2hfdHVuLnVuX3R0eS0+b3BzLT5jaGFyc19pbl9idWZmZXIpCisJCSAgICAgKGNoLT5jaF90dW4udW5fdHR5KSAhPSAwKSkgewogCQkJdW4tPnVuX2ZsYWcgfD0gVU5fUFdBSVQ7CiAJCQljb3VudCA9IDA7CiAJCQlnb3RvIG91dDsKQEAgLTE2NjYsNyArMTY2OCw4IEBACiAKIAkJaWYgKG4gPj0gdCkgewogCQkJbWVtY3B5KGNoLT5jaF90YnVmICsgY2gtPmNoX3RpbiwgYnVmLCB0KTsKLQkJCWlmIChuZC0+bmRfZHBhX2RlYnVnICYmIG5kLT5uZF9kcGFfcG9ydCA9PSBQT1JUX05VTShNSU5PUih0dHlfZGV2bnVtKHVuLT51bl90dHkpKSkpCisJCQlpZiAobmQtPm5kX2RwYV9kZWJ1ZyAmJiBuZC0+bmRfZHBhX3BvcnQgPT0KKwkJCQlQT1JUX05VTShNSU5PUih0dHlfZGV2bnVtKHVuLT51bl90dHkpKSkpCiAJCQkJZGdycF9kcGFfZGF0YShuZCwgMCwgKGNoYXIgKikgYnVmLCB0KTsKIAkJCWJ1ZiArPSB0OwogCQkJbiAtPSB0OwpAQCAtMTY3NSw3ICsxNjc4LDggQEAKIAkJfQogCiAJCW1lbWNweShjaC0+Y2hfdGJ1ZiArIGNoLT5jaF90aW4sIGJ1Ziwgbik7Ci0JCWlmIChuZC0+bmRfZHBhX2RlYnVnICYmIG5kLT5uZF9kcGFfcG9ydCA9PSBQT1JUX05VTShNSU5PUih0dHlfZGV2bnVtKHVuLT51bl90dHkpKSkpCisJCWlmIChuZC0+bmRfZHBhX2RlYnVnICYmIG5kLT5uZF9kcGFfcG9ydCA9PQorCQkJUE9SVF9OVU0oTUlOT1IodHR5X2Rldm51bSh1bi0+dW5fdHR5KSkpKQogCQkJZGdycF9kcGFfZGF0YShuZCwgMCwgKGNoYXIgKikgYnVmLCBuKTsKIAkJYnVmICs9IG47CiAJCWNoLT5jaF90aW4gKz0gbjsKQEAgLTI2NTYsNyArMjY2MCw4IEBACiAJCQkJY2gtPmNoX3NlbmQgfD0gUlJfUlhfRkxVU0g7CiAJCQkJKGNoLT5jaF9uZCktPm5kX3R4X3dvcmsgPSAxOwogCQkJCShjaC0+Y2hfbmQpLT5uZF90eF9yZWFkeSA9IDE7Ci0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYoY2gtPmNoX25kKS0+bmRfdHhfd2FpdHEpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgKKwkJCQkJJihjaC0+Y2hfbmQpLT5uZF90eF93YWl0cSk7CiAJCQl9CiAJCQlpZiAoYXJnID09IFRDSUZMVVNIKQogCQkJCWJyZWFrOwpAQCAtMjY4Miw3ICsyNjg3LDggQEAKIAlMaW51eAkJSFBVWAkJRnVuY3Rpb24KIAlUQ1NFVEEJCVRDU0VUQQkJLSBzZXQgdGhlIHRlcm1pb3MKIAlUQ1NFVEFGCQlUQ1NFVEFGCQktIHdhaXQgZm9yIGRyYWluIGZpcnN0LCB0aGVuIHNldCB0ZXJtaW9zCi0JVENTRVRBVwkJVENTRVRBVwkJLSB3YWl0IGZvciBkcmFpbiwgZmx1c2ggdGhlIGlucHV0IHF1ZXVlLCB0aGVuIHNldCB0ZXJtaW9zCisJVENTRVRBVwkJVENTRVRBVwkJLSB3YWl0IGZvciBkcmFpbiwKKwkJCQkJZmx1c2ggdGhlIGlucHV0IHF1ZXVlLCB0aGVuIHNldCB0ZXJtaW9zCiAJLSBsb29raW5nIGF0IHRoZSB0dHlfaW9jdGwgY29kZSwgdGhlc2UgY29tbWFuZCBhbGwgY2FsbCBvdXIKIAl0dHlfc2V0X3Rlcm1pb3MgYXQgdGhlIGRyaXZlcidzIGVuZCwgd2hlbiBhIFRDU0VUQSogaXMgc2VudCwKIAlpdCBpcyBleHBlY3RpbmcgdGhlIHR0eSB0byBoYXZlIGEgdGVybWlvIHN0cnVjdHVyZSwKQEAgLTI3OTgsNiArMjgwNCw3IEBACiAJCX0KIAogCQkvKiBwcmV0ZW5kIHdlIGRpZG4ndCByZWNvZ25pemUgdGhpcyAqLworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAogCWNhc2UgRElHSV9TRVRBOgogCQlyZXR1cm4gZGdycF90dHlfZGlnaXNldGEodHR5LCAoc3RydWN0IGRpZ2lfc3RydWN0ICopIGFyZyk7CkBAIC0zMjA3LDcgKzMyMTQsOCBAQAogCQkJCWludCBtYXhfbWFqb3JzID0gMVUgPDwgKDMyIC0gTUlOT1JCSVRTKTsKIAkJCQlmb3IgKGkgPSAyNTY7IGkgPCBtYXhfbWFqb3JzOyBpKyspIHsKIAkJCQkJbmQtPm5kX3NlcmlhbF90dGRyaXZlci0+bWFqb3IgPSBpOwotCQkJCQlyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIobmQtPm5kX3NlcmlhbF90dGRyaXZlcik7CisJCQkJCXJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcgorCQkJCQkJKG5kLT5uZF9zZXJpYWxfdHRkcml2ZXIpOwogCQkJCQlpZiAocmMgPj0gMCkKIAkJCQkJCWJyZWFrOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmEzMTFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVRPRE86Ci0JLSBzZW5kIHRvIGxrbWwgZm9yIHJldmlldwotCi1QbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzogU3RldmUKLVVuZGVyd29vZCA8c3RldmV1QGNvcHBpY2Uub3JnPiBhbmQgRGF2aWQgUm93ZSA8ZGF2aWRAcm93ZXRlbC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXguYwppbmRleCBlNTE2YmI2Li5kMzI5Y2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmMKQEAgLTQ4NSw4ICs0ODUsNiBAQAogCXU4IGVlcHJvbV9kYXRhWzJdOwogCiAJLyogU3BpbmxvY2tzICovCi0Jc3BpbmxvY2tfdCBsb2NrOwotCiAJc3BpbmxvY2tfdCB0Y2Jfc2VuZF9xbG9jazsKIAlzcGlubG9ja190IHRjYl9yZWFkeV9xbG9jazsKIAlzcGlubG9ja190IHNlbmRfaHdfbG9jazsKQEAgLTEzODgsNiArMTM4Niw3IEBACiAJCQkgICAgbWlpX2luZGljYXRvcik7CiAKIAkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogSWYgd2UgaGl0IGhlcmUgd2Ugd2VyZSBhYmxlIHRvIHJlYWQgdGhlIHJlZ2lzdGVyIGFuZCB3ZSBuZWVkIHRvCkBAIC0xMzk1LDYgKzEzOTQsNyBAQAogCSAqLwogCSp2YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X3N0YXQpICYgRVRfTUFDX01JSU1HTVRfU1RBVF9QSFlDUlRMX01BU0s7CiAKK291dDoKIAkvKiBTdG9wIHRoZSByZWFkIG9wZXJhdGlvbiAqLwogCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQpOwogCkBAIC0yMTI0LDcgKzIxMjQsMTEgQEAKIAogCS8qIEFsbG9jIG1lbW9yeSBmb3IgdGhlIGxvb2t1cCB0YWJsZSAqLwogCXJ4X3JpbmctPmZiclswXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmYnJfbG9va3VwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJ4X3JpbmctPmZiclswXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAlyeF9yaW5nLT5mYnJbMV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmJyX2xvb2t1cCksIEdGUF9LRVJORUwpOworCWlmIChyeF9yaW5nLT5mYnJbMV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBUaGUgZmlyc3QgdGhpbmcgd2Ugd2lsbCBkbyBpcyBjb25maWd1cmUgdGhlIHNpemVzIG9mIHRoZSBidWZmZXIKIAkgKiByaW5ncy4gVGhlc2Ugd2lsbCBjaGFuZ2UgYmFzZWQgb24ganVtYm8gcGFja2V0IHN1cHBvcnQuICBMYXJnZXIKQEAgLTIyODksNyArMjI5Myw3IEBACiAJZm9yIChpZCA9IDA7IGlkIDwgTlVNX0ZCUlM7IGlkKyspIHsKIAkJZmJyID0gcnhfcmluZy0+ZmJyW2lkXTsKIAotCQlpZiAoIWZici0+cmluZ192aXJ0YWRkcikKKwkJaWYgKCFmYnIgfHwgIWZici0+cmluZ192aXJ0YWRkcikKIAkJCWNvbnRpbnVlOwogCiAJCS8qIEZpcnN0IHRoZSBwYWNrZXQgbWVtb3J5ICovCkBAIC0zNTIzLDcgKzM1MjcsNyBAQAogCQkJZ290byBlcnJfb3V0OwogCQl9CiAJfQotCW1lbWNweShhZGFwdGVyLT5hZGRyLCBhZGFwdGVyLT5yb21fYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5hZGRyLCBhZGFwdGVyLT5yb21fYWRkcik7CiBvdXQ6CiAJcmV0dXJuIHJjOwogZXJyX291dDoKQEAgLTM1OTEsNiArMzU5NSw3IEBACiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkgICJldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOworCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAkvKiBSZWNlaXZlIGJ1ZmZlciBtZW1vcnkgYWxsb2NhdGlvbiAqLwpAQCAtMzU5OCw3ICszNjAzLDcgQEAKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSAgImV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7Ci0JCWV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJCWV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIApAQCAtMzc2MCw3ICszNzY1LDYgQEAKIAlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CiAKIAkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBoZXJlICovCi0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnRjYl9yZWFkeV9xbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnNlbmRfaHdfbG9jayk7CkBAIC0zNzcwLDcgKzM3NzQsNyBAQAogCWFkYXB0ZXItPnJlZ2lzdHJ5X2p1bWJvX3BhY2tldCA9IDE1MTQ7CS8qIDE1MTQtOTIxNiAqLwogCiAJLyogU2V0IHRoZSBNQUMgYWRkcmVzcyB0byBhIGRlZmF1bHQgKi8KLQltZW1jcHkoYWRhcHRlci0+YWRkciwgZGVmYXVsdF9tYWMsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+YWRkciwgZGVmYXVsdF9tYWMpOwogCiAJcmV0dXJuIGFkYXB0ZXI7CiB9CkBAIC00MjkyLDEyICs0Mjk2LDkgQEAKIHsKIAlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBwYWNrZXRfZmlsdGVyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci0KIAkvKiBCZWZvcmUgd2UgbW9kaWZ5IHRoZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBmaWx0ZXIgZmxhZ3MsIHN0b3JlIHRoZW0KIAkgKiBsb2NhbGx5LiBUaGlzIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcncyBjaGFuZ2VkIGFuZCBpZgogCSAqIHdlIGV2ZW4gbmVlZCB0byBib3RoZXIgdGhlIGhhcmR3YXJlCkBAIC00MzQ5LDggKzQzNTAsNiBAQAogCSAqLwogCWlmIChwYWNrZXRfZmlsdGVyICE9IGFkYXB0ZXItPnBhY2tldF9maWx0ZXIpCiAJCWV0MTMxeF9zZXRfcGFja2V0X2ZpbHRlcihhZGFwdGVyKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKIH0KIAogLyogZXQxMzF4X3R4IC0gVGhlIGhhbmRsZXIgdG8gdHggYSBwYWNrZXQgb24gdGhlIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKaW5kZXggZWRkNWNlZi4uMjI2YjIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCkBAIC0yMDgsNyArMjA4LDkgQEAKIAlrZnJlZShkZXYtPnJpbmdfYnVmZmVyKTsKIAlrZnJlZShkZXYtPmludGVycnVwdF9pbl9idWZmZXIpOwogCWtmcmVlKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOwotCWtmcmVlKGRldik7CQkvKiBmaXhtZSBvbGRpX2J1ZmZlciAqLworCWtmcmVlKGRldi0+b2xkaV9idWZmZXIpOworCWtmcmVlKGRldi0+d3JpdGVfYnVmZmVyKTsKKwlrZnJlZShkZXYpOwogfQogCiAvKiogdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X2luX2NhbGxiYWNrICovCkBAIC0yMzMsOCArMjM1LDggQEAKIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gSU5QVVRfQ01EX1NJWkUpIHsKIAkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAotCQkJICJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIgotCQkJICJEbyBzb21ldGhpbmcgaW50ZWxsaWdlbnRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQkgIlVyYiBsZW5ndGggd2FzICVkIGJ5dGVzISEgRG8gc29tZXRoaW5nIGludGVsbGlnZW50XG4iLAorCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJfSBlbHNlIHsKIAkJYWxwaGF0cmFja19vY21kX2luZm8oJmRldi0+aW50Zi0+ZGV2LAogCQkJCSAgICAgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZCwKQEAgLTY4OCw4ICs2OTAsNyBAQAogCX0KIAlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpCiAJCWRldl93YXJuKCZpbnRmLT5kZXYsCi0JCQkgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kIgotCQkJICIodXNpbmcgY29udHJvbCBlbmRwb2ludCBpbnN0ZWFkKVxuIik7CisJCQkgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKIAogCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgPQogCSAgICBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jCmluZGV4IDBlNDk5Y2UuLjA1NzE5ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMKQEAgLTI1Nyw4ICsyNTcsNyBAQAogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA4KSB7CiAJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwKLQkJCSJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIgotCQkJIkRvIHNvbWV0aGluZyBpbnRlbGxpZ2VudFxuIiwKKwkJCSJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudFxuIiwKIAkJCSB1cmItPmFjdHVhbF9sZW5ndGgpOwogCX0gZWxzZSB7CiAJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKQEAgLTU0Miw4ICs1NDEsNyBAQAogCX0KIAogCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKLQkJIiVzOiBjb3B5aW5nIHRvIHVzZXJzcGFjZTogIgotCQkiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCSIlczogY29weWluZyB0byB1c2Vyc3BhY2U6ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAogCQkgX19mdW5jX18sCiAJCSAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sCiAJCSAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sCkBAIC01NzAsOCArNTY4LDcgQEAKIAkJCSAqIGFuZCB3ZSBhcmUgdGhlIHNhbWUgc2lnbiwgd2UgY2FuIGNvbXByZXNzICstIDdGCiAJCQkgKi8KIAkJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKLQkJCQkiJXM6IHRyeWluZyB0byBjb21wcmVzczogIgotCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCQkiJXM6IHRyeWluZyB0byBjb21wcmVzczogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCiAJCQkJX19mdW5jX18sCiAJCQkJKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzBdLAogCQkJCSgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsxXSwKQEAgLTgzMCw4ICs4MjcsNyBAQAogCX0KIAlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpCiAJCWRldl93YXJuKCZpbnRmLT5kZXYsCi0JCQkiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQiCi0JCQkiKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOworCQkJIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKIAogCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgPQogCSAgICBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCmluZGV4IGE0MzNlMzMuLmI2YTc3MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKQEAgLTExNDUsNyArMTE0NSw3IEBACiAKIAljaGFyICpjbWRidWZmZXIgPSBrbWFsbG9jKDE2MDAsIEdGUF9LRVJORUwpOwogCWlmICghY21kYnVmZmVyKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCiAJc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0zMihkZXYsIDB4MjAwLCBjbWRidWZmZXIsIHNpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2lvY3RsLmgKaW5kZXggMjRiOGQ3Ny4uNDE5ZTUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaW9jdGwuaApAQCAtMzAsNyArMzAsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfSU9DVExfR0VUX1ZFUiB7CiAgICAgdW5zaWduZWQgbG9uZyBkcnZfdmVyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgSU9DVExfR0VUX1ZFUiwgKlBJT0NUTF9HRVRfVkVSOworfSBfX3BhY2tlZCBJT0NUTF9HRVRfVkVSLCAqUElPQ1RMX0dFVF9WRVI7CiAKIC8qIERhdGEgc3RydWN0dXJlIGZvciBEc3Agc3RhdGlzdGljcyAqLwogdHlwZWRlZiBzdHJ1Y3QgX0lPQ1RMX0dFVF9EU1BfU1RBVCB7CkBAIC02NywxOSArNjcsMTkgQEAKICAgICB1bnNpZ25lZCBsb25nIENvblRtOyAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc2Vzc2lvbiBjb25uZWN0aW9uIHRpbWUgaW4gc2Vjb25kcyAqLwogICAgIHVuc2lnbmVkIGNoYXIgQ2FsVmVyW0NBTFZFUlNaXTsgICAgICAgLyogUHJvcHJpZXRhcnkgQ2FsaWJyYXRpb24gVmVyc2lvbiAqLwogICAgIHVuc2lnbmVkIGNoYXIgQ2FsRGF0ZVtDQUxEQVRFU1pdOyAgICAgLyogUHJvcHJpZXRhcnkgQ2FsaWJyYXRpb24gRGF0ZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgSU9DVExfR0VUX0RTUF9TVEFULCAqUElPQ1RMX0dFVF9EU1BfU1RBVDsKK30gX19wYWNrZWQgSU9DVExfR0VUX0RTUF9TVEFULCAqUElPQ1RMX0dFVF9EU1BfU1RBVDsKIAogLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIER1YWwgUG9ydGVkIFJBTSBtZXNzYWdpbmcgYmV0d2VlbiBIb3N0IGFuZCBEc3AgKi8KIHR5cGVkZWYgc3RydWN0IF9JT0NUTF9EUFJBTV9CTEsgewogICAgIHVuc2lnbmVkIHNob3J0IHRvdGFsX2xlbjsKIAlzdHJ1Y3QgcHNldWRvX2hkciBwc2V1ZG9oZHI7CiAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTc4MF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBJT0NUTF9EUFJBTV9CTEssICpQSU9DVExfRFBSQU1fQkxLOworfSBfX3BhY2tlZCBJT0NUTF9EUFJBTV9CTEssICpQSU9DVExfRFBSQU1fQkxLOwogCiB0eXBlZGVmIHN0cnVjdCBfSU9DVExfRFBSQU1fQ09NTUFORCB7CiAgICAgdW5zaWduZWQgc2hvcnQgZXh0cmE7CiAgICAgSU9DVExfRFBSQU1fQkxLIGRwcmFtX2JsazsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIElPQ1RMX0RQUkFNX0NPTU1BTkQsICpQSU9DVExfRFBSQU1fQ09NTUFORDsKK30gX19wYWNrZWQgSU9DVExfRFBSQU1fQ09NTUFORCwgKlBJT0NUTF9EUFJBTV9DT01NQU5EOwogCiAvKgogKiBDdXN0b20gSU9DVEwgY29tbWFuZCBjb2RlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLmgKaW5kZXggMTc1YWJmYS4uY2NiODIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC5oCkBAIC0yMSwzNCArMjEsNjQgQEAKICNkZWZpbmUJRlQxMDAwX1JFR19TVVBfQ1RSTAkweDAwMjAJLyogSENUUiAtIEhvc3QgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZQlGVDEwMDBfUkVHX1NVUF9TVEFUCTB4MDAyMgkvKiBIU1RBVCAtIEhvc3QgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lCUZUMTAwMF9SRUdfUkVTRVQJMHgwMDI0CS8qIEhDVFIgLSBIb3N0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRlQxMDAwX1JFR19TVVBfSVNSCTB4MDAyNgkvKiBISVNSIC0gSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUZUMTAwMF9SRUdfU1VQX0lTUgkweDAwMjYJLyogSElTUiAtIEhvc3QgSW50ZXJydXB0IFN0YXR1cworCQkJCQkgKiBSZWdpc3RlcgorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19TVVBfSU1BU0sJMHgwMDI4CS8qIEhJTUFTSyAtIEhvc3QgSW50ZXJydXB0IE1hc2sgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19ET09SQkVMTAkweDAwMmEJLyogREJFTEwgLSBEb29yIEJlbGwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19BU0lDX0lECTB4MDAyZQkvKiBBU0lDSUQgLSBBU0lDIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworI2RlZmluZSBGVDEwMDBfUkVHX0FTSUNfSUQJMHgwMDJlCS8qIEFTSUNJRCAtIEFTSUMgSWRlbnRpZmljYXRpb24KKwkJCQkJICogTnVtYmVyCisJCQkJCSAqLwogCiAvKiBNRU1PUlkgTUFQIEZPUiBFTEVDVFJBQlVaWiBBU0lDICovCiAjZGVmaW5lIEZUMTAwMF9SRUdfVUZJRk9fU1RBVAkweDAwMDAJLyogVUZTUiAtIFVwbGluayBGSUZPIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBGVDEwMDBfUkVHX1VGSUZPX0JFRwkweDAwMDIJLyogVUZCUgktIFVwbGluayBGSUZPIGJlZ2lubmluZyByZWdpc3RlciAqLworI2RlZmluZSBGVDEwMDBfUkVHX1VGSUZPX0JFRwkweDAwMDIJLyogVUZCUgktIFVwbGluayBGSUZPIGJlZ2lubmluZworCQkJCQkgKiByZWdpc3RlcgorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19VRklGT19NSUQJMHgwMDA0CS8qIFVGTVIJLSBVcGxpbmsgRklGTyBtaWRkbGUgcmVnaXN0ZXIgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19VRklGT19FTkQJMHgwMDA2CS8qIFVGRVIJLSBVcGxpbmsgRklGTyBlbmQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJRlQxMDAwX1JFR19ERklGT19TVEFUCTB4MDAwOAkvKiBERlNSIC0gRG93bmxpbmsgRklGTyBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRlQxMDAwX1JFR19ERklGT19TVEFUCTB4MDAwOAkvKiBERlNSIC0gRG93bmxpbmsgRklGTyBzdGF0dXMKKwkJCQkJICogcmVnaXN0ZXIKKwkJCQkJICovCiAjZGVmaW5lCUZUMTAwMF9SRUdfREZJRk8JMHgwMDBBCS8qIERGUiAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRlQxMDAwX1JFR19EUFJBTV9EQVRBCTB4MDAwQwkvKiBEUFJBTSAtIER1YWwgUG9ydCBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCUZUMTAwMF9SRUdfRFBSQU1fREFUQQkweDAwMEMJLyogRFBSQU0gLSBEdWFsIFBvcnQgSW5kaXJlY3QKKwkJCQkJICogRGF0YSBSZWdpc3RlcgorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19XQVRFUk1BUksJMHgwMDEwCS8qIFdNQVJLIC0gV2F0ZXJtYXJrIFJlZ2lzdGVyICovCiAKIC8qIE1FTU9SWSBNQVAgRk9SIE1BR05FTUlURSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRkRSCTB4MDAwMAkvKiBVRkRSIC0gVXBsaW5rIEZJRk8gRGF0YSBSZWdpc3RlciAoMzItYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUkwJMHgwMDAwCS8qIFVGRFJMIC0gVXBsaW5rIEZJRk8gRGF0YSBSZWdpc3RlciBsb3ctd29yZCAoMTYtYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUkgJMHgwMDAyCS8qIFVGRFJIIC0gVXBsaW5rIEZJRk8gRGF0YSBSZWdpc3RlciBoaWdoLXdvcmQgKDE2LWJpdHMpICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX1VGRFIJMHgwMDAwCS8qIFVGRFIgLSBVcGxpbmsgRklGTyBEYXRhCisJCQkJCSAqIFJlZ2lzdGVyICgzMi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZEUkwJMHgwMDAwCS8qIFVGRFJMIC0gVXBsaW5rIEZJRk8gRGF0YQorCQkJCQkgKiBSZWdpc3RlciBsb3ctd29yZCAoMTYtYml0cykKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX1VGRFJICTB4MDAwMgkvKiBVRkRSSCAtIFVwbGluayBGSUZPIERhdGEgUmVnaXN0ZXIKKwkJCQkJICogaGlnaC13b3JkICgxNi1iaXRzKQorCQkJCQkgKi8KICNkZWZpbmUgRlQxMDAwX1JFR19NQUdfVUZFUgkweDAwMDQJLyogVUZFUiAtIFVwbGluayBGSUZPIEVuZCBSZWdpc3RlciAqLwogI2RlZmluZSBGVDEwMDBfUkVHX01BR19VRlNSCTB4MDAwNgkvKiBVRlNSIC0gVXBsaW5rIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RGUgkweDAwMDgJLyogREZSIC0gRG93bmxpbmsgRklGTyBSZWdpc3RlciAoMzItYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSTAkweDAwMDgJLyogREZSTCAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIgbG93LXdvcmQgKDE2LWJpdHMpICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RGUkgJMHgwMDBhCS8qIERGUkggLSBEb3dubGluayBGSUZPIFJlZ2lzdGVyIGhpZ2gtd29yZCAoMTYtYml0cykgKi8KLSNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZTUgkweDAwMGMJLyogREZTUiAtIERvd25saW5rIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQQkweDAwMTAJLyogRFBEQVRBIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyICgzMi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19EUERBVEFMCTB4MDAxMAkvKiBEUERBVEFMIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyIGxvdy13b3JkICgxNi1iaXRzKSAqLwotI2RlZmluZSBGVDEwMDBfUkVHX01BR19EUERBVEFICTB4MDAxMgkvKiBEUERBVEFIIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyIGhpZ2gtd29yZCAoMTYtYml0cykgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSCTB4MDAwOAkvKiBERlIgLSBEb3dubGluayBGSUZPIFJlZ2lzdGVyCisJCQkJCSAqICgzMi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfREZSTAkweDAwMDgJLyogREZSTCAtIERvd25saW5rIEZJRk8gUmVnaXN0ZXIKKwkJCQkJICogbG93LXdvcmQgKDE2LWJpdHMpCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlJICTB4MDAwYQkvKiBERlJIIC0gRG93bmxpbmsgRklGTyBSZWdpc3RlcgorCQkJCQkgKiBoaWdoLXdvcmQgKDE2LWJpdHMpCisJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfUkVHX01BR19ERlNSCTB4MDAwYwkvKiBERlNSIC0gRG93bmxpbmsgRklGTyBTdGF0dXMKKwkJCQkJICogUmVnaXN0ZXIKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQQkweDAwMTAJLyogRFBEQVRBIC0gRHVhbCBQb3J0IFJBTSBJbmRpcmVjdAorCQkJCQkgKiBEYXRhIFJlZ2lzdGVyICgzMi1iaXRzKQorCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX1JFR19NQUdfRFBEQVRBTAkweDAwMTAJLyogRFBEQVRBTCAtIER1YWwgUG9ydCBSQU0gSW5kaXJlY3QKKwkJCQkJICogRGF0YSBSZWdpc3RlciBsb3ctd29yZCAoMTYtYml0cykKKwkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9SRUdfTUFHX0RQREFUQUgJMHgwMDEyCS8qIERQREFUQUggLSBEdWFsIFBvcnQgUkFNIEluZGlyZWN0IERhdGEKKwkJCQkJICogUmVnaXN0ZXIgaGlnaC13b3JkICgxNi1iaXRzKQorCQkJCQkgKi8KICNkZWZpbmUJRlQxMDAwX1JFR19NQUdfV0FURVJNQVJLIDB4MDAyYwkvKiBXTUFSSyAtIFdhdGVybWFyayBSZWdpc3RlciAqLwogI2RlZmluZSBGVDEwMDBfUkVHX01BR19WRVJTSU9OCTB4MDAzMAkvKiBMTEMgVmVyc2lvbiAqLwogCkBAIC01Nyw3ICs4Nyw5IEBACiAjZGVmaW5lIEZUMTAwMF9EUFJBTV9SWF9CQVNFCTB4MDgwMAkvKiBQQyBDYXJkIHRvIEhvc3QgTWVzc2FnaW5nIEFyZWEgKi8KICNkZWZpbmUgRlQxMDAwX0ZJRk9fTEVOCQkweDA3RkMJLyogdG90YWwgbGVuZ3RoIGZvciBEU1AgRklGTyB0cmFja2luZyAqLwogI2RlZmluZSBGVDEwMDBfSElfSE8JCTB4MDdGRQkvKiBoZWFydGJlYXQgd2l0aCBISS9ITyAqLwotI2RlZmluZSBGVDEwMDBfRFNQX1NUQVRVUwkweDBGRkUJLyogZHNwIHN0YXR1cyAtIG5vbi16ZXJvIGlzIGEgcmVxdWVzdCB0byByZXNldCBkc3AgKi8KKyNkZWZpbmUgRlQxMDAwX0RTUF9TVEFUVVMJMHgwRkZFCS8qIGRzcCBzdGF0dXMgLSBub24temVybyBpcyBhIHJlcXVlc3QKKwkJCQkJICogdG8gcmVzZXQgZHNwCisJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfRFNQX0xFRAkJMHgwRkZBCS8qIGRzcCBsZWQgc3RhdHVzIGZvciBQQUQgZGV2aWNlICovCiAjZGVmaW5lIEZUMTAwMF9EU1BfQ09OX1NUQVRFCTB4MEZGOAkvKiBEU1AgQ29ubmVjdGlvbiBTdGF0dXMgSW5mbyAqLwogI2RlZmluZSBGVDEwMDBfRFBSQU1fRkVGRQkweDAwMDIJLyogbG9jYXRpb24gZm9yIGRzcCByZWFkeSBpbmRpY2F0b3IgKi8KQEAgLTY3LDI2ICs5OSw0OCBAQAogI2RlZmluZSBGVDEwMDBfRFNQX1RJTUVSMwkweDFGRjYJLyogVGltZXIgRmllbGQgZnJvbSBCYXNlc3RhdGlvbiAqLwogCiAvKiBSZXNlcnZlZCBEdWFsIFBvcnQgUkFNIG9mZnNldHMgZm9yIE1hZ25lbWl0ZSAqLwotI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1RYX0JBU0UJMHgwMDAwCS8qIEhvc3QgdG8gUEMgQ2FyZCBNZXNzYWdpbmcgQXJlYSAqLwotI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1JYX0JBU0UJMHgwMjAwCS8qIFBDIENhcmQgdG8gSG9zdCBNZXNzYWdpbmcgQXJlYSAqLworI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1RYX0JBU0UJMHgwMDAwCS8qIEhvc3QgdG8gUEMgQ2FyZAorCQkJCQkJICogTWVzc2FnaW5nIEFyZWEKKwkJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfRFBSQU1fTUFHX1JYX0JBU0UJMHgwMjAwCS8qIFBDIENhcmQgdG8gSG9zdAorCQkJCQkJICogTWVzc2FnaW5nIEFyZWEKKwkJCQkJCSAqLwogCi0jZGVmaW5lIEZUMTAwMF9NQUdfRklGT19MRU4JCTB4MUZGCS8qIHRvdGFsIGxlbmd0aCBmb3IgRFNQIEZJRk8gdHJhY2tpbmcgKi8KKyNkZWZpbmUgRlQxMDAwX01BR19GSUZPX0xFTgkJMHgxRkYJLyogdG90YWwgbGVuZ3RoIGZvciBEU1AKKwkJCQkJCSAqIEZJRk8gdHJhY2tpbmcKKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0ZJRk9fTEVOX0lORFgJMHgxCS8qIGxvdy13b3JkIGluZGV4ICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfSElfSE8JCTB4MUZGCS8qIGhlYXJ0YmVhdCB3aXRoIEhJL0hPICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfSElfSE9fSU5EWAkJMHgwCS8qIGhpZ2gtd29yZCBpbmRleCAqLwotI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9MRUQJCTB4M0ZFCS8qIGRzcCBsZWQgc3RhdHVzIGZvciBQQUQgZGV2aWNlICovCi0jZGVmaW5lIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYCQkweDAJLyogZHNwIGxlZCBzdGF0dXMgZm9yIFBBRCBkZXZpY2UgKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EU1BfTEVECQkweDNGRQkvKiBkc3AgbGVkIHN0YXR1cyBmb3IKKwkJCQkJCSAqIFBBRCBkZXZpY2UKKwkJCQkJCSAqLworI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9MRURfSU5EWAkJMHgwCS8qIGRzcCBsZWQgc3RhdHVzIGZvcgorCQkJCQkJICogUEFEIGRldmljZQorCQkJCQkJICovCiAjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURQkweDNGRQkvKiBEU1AgQ29ubmVjdGlvbiBTdGF0dXMgSW5mbyAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9DT05fU1RBVEVfSU5EWAkweDEJLyogRFNQIENvbm5lY3Rpb24gU3RhdHVzIEluZm8gKi8KLSNkZWZpbmUgRlQxMDAwX01BR19EUFJBTV9GRUZFCQkweDAwMAkvKiBsb2NhdGlvbiBmb3IgZHNwIHJlYWR5IGluZGljYXRvciAqLwotI2RlZmluZSBGVDEwMDBfTUFHX0RQUkFNX0ZFRkVfSU5EWAkweDAJLyogbG9jYXRpb24gZm9yIGRzcCByZWFkeSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIwCQkweDNGQwkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFBSQU1fRkVGRQkJMHgwMDAJLyogbG9jYXRpb24gZm9yIGRzcCByZWFkeQorCQkJCQkJICogaW5kaWNhdG9yCisJCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX01BR19EUFJBTV9GRUZFX0lORFgJMHgwCS8qIGxvY2F0aW9uIGZvciBkc3AgcmVhZHkKKwkJCQkJCSAqIGluZGljYXRvcgorCQkJCQkJICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMAkJMHgzRkMJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWAkweDEKLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIxCQkweDNGQwkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMQkJMHgzRkMJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWAkweDAKLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIyCQkweDNGRAkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMgkJMHgzRkQJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWAkweDEKLSNkZWZpbmUgRlQxMDAwX01BR19EU1BfVElNRVIzCQkweDNGRAkvKiBUaW1lciBGaWVsZCBmcm9tIEJhc2VzdGF0aW9uICovCisjZGVmaW5lIEZUMTAwMF9NQUdfRFNQX1RJTUVSMwkJMHgzRkQJLyogVGltZXIgRmllbGQgZnJvbQorCQkJCQkJICogQmFzZXN0YXRpb24KKwkJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWAkweDAKICNkZWZpbmUgRlQxMDAwX01BR19UT1RBTF9MRU4JCTB4MjAwCiAjZGVmaW5lIEZUMTAwMF9NQUdfVE9UQUxfTEVOX0lORFgJMHgxCkBAIC05OSwyNCArMTUzLDM4IEBACiAjZGVmaW5lIEhPU1RfSU5URl9CRQkweDEJLyogSG9zdCBpbnRlcmZhY2UgYmlnIGVuZGlhbiBtb2RlICovCiAKIC8qIEZUMTAwMCB0byBIb3N0IERvb3JiZWxsIGFzc2lnbm1lbnRzICovCi0jZGVmaW5lIEZUMTAwMF9EQl9EUFJBTV9SWAkweDAwMDEJLyogdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBEU1AgaGFzIGRhdGEgZm9yIGhvc3QgaW4gRFBSQU0gKi8KKyNkZWZpbmUgRlQxMDAwX0RCX0RQUkFNX1JYCTB4MDAwMQkvKiB0aGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IERTUAorCQkJCQkgKiBoYXMgZGF0YSBmb3IgaG9zdCBpbiBEUFJBTQorCQkJCQkgKi8KICNkZWZpbmUgRlQxMDAwX0RCX0ROTERfUlgJMHgwMDAyCS8qIERvd25sb2FkZXIgaGFuZHNoYWtlIGRvb3JiZWxsICovCi0jZGVmaW5lIEZUMTAwMF9BU0lDX1JFU0VUX1JFUQkweDAwMDQJLyogRFNQIHJlcXVlc3RpbmcgaG9zdCB0byByZXNldCB0aGUgQVNJQyAqLwotI2RlZmluZSBGVDEwMDBfRFNQX0FTSUNfUkVTRVQJMHgwMDA4CS8qIERTUCBpbmRpY2F0aW5nIGhvc3QgdGhhdCBpdCB3aWxsIHJlc2V0IHRoZSBBU0lDICovCisjZGVmaW5lIEZUMTAwMF9BU0lDX1JFU0VUX1JFUQkweDAwMDQJLyogRFNQIHJlcXVlc3RpbmcgaG9zdCB0bworCQkJCQkgKiByZXNldCB0aGUgQVNJQworCQkJCQkgKi8KKyNkZWZpbmUgRlQxMDAwX0RTUF9BU0lDX1JFU0VUCTB4MDAwOAkvKiBEU1AgaW5kaWNhdGluZyBob3N0IHRoYXQKKwkJCQkJICogaXQgd2lsbCByZXNldCB0aGUgQVNJQworCQkJCQkgKi8KICNkZWZpbmUgRlQxMDAwX0RCX0NPTkRfUkVTRVQJMHgwMDEwCS8qIERTUCByZXF1ZXN0IGZvciBhIGNhcmQgcmVzZXQuICovCiAKIC8qIEhvc3QgdG8gRlQxMDAwIERvb3JiZWxsIGFzc2lnbm1lbnRzICovCi0jZGVmaW5lIEZUMTAwMF9EQl9EUFJBTV9UWAkweDAxMDAJLyogdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBob3N0IGhhcyBkYXRhIGZvciBEU1AgaW4gRFBSQU0uICovCisjZGVmaW5lIEZUMTAwMF9EQl9EUFJBTV9UWAkweDAxMDAJLyogdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBob3N0CisJCQkJCSAqIGhhcyBkYXRhIGZvciBEU1AgaW4gRFBSQU0uCisJCQkJCSAqLwogI2RlZmluZSBGVDEwMDBfREJfRE5MRF9UWAkweDAyMDAJLyogRG93bmxvYWRlciBoYW5kc2hha2UgZG9vcmJlbGwgKi8KICNkZWZpbmUgRlQxMDAwX0FTSUNfUkVTRVRfRFNQCTB4MDQwMAkvKiBSZXNwb25kcyB0byBGVDEwMDBfQVNJQ19SRVNFVF9SRVEgKi8KLSNkZWZpbmUgRlQxMDAwX0RCX0hCCQkweDEwMDAJLyogSW5kaWNhdGVzIHRoYXQgc3VwZXJ2aXNvciBoYXMgYSBoZWFydGJlYXQgbWVzc2FnZSBmb3IgRFNQLiAqLworI2RlZmluZSBGVDEwMDBfREJfSEIJCTB4MTAwMAkvKiBJbmRpY2F0ZXMgdGhhdCBzdXBlcnZpc29yIGhhcyBhCisJCQkJCSAqIGhlYXJ0YmVhdCBtZXNzYWdlIGZvciBEU1AuCisJCQkJCSAqLwogCiAjZGVmaW5lIGhpCQkJMHg2ODY5CS8qIFBDIENhcmQgaGVhcnRiZWF0IHZhbHVlcyAqLwogI2RlZmluZSBobwkJCTB4Njg2ZgkvKiBQQyBDYXJkIGhlYXJ0YmVhdCB2YWx1ZXMgKi8KIAogLyogTWFnbmVtaXRlIHNwZWNpZmljIGRlZmluZXMgKi8KLSNkZWZpbmUgaGlfbWFnCQkJMHg2OTY4CS8qIEJ5dGUgc3dhcCBoaSB0byBhdm9pZCBhZGRpdGlvbmFsIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIGhvX21hZwkJCTB4NmY2OAkvKiBCeXRlIHN3YXAgaG8gdG8gYXZvaWQgYWRkaXRpb25hbCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZSBoaV9tYWcJCQkweDY5NjgJLyogQnl0ZSBzd2FwIGhpIHRvIGF2b2lkCisJCQkJCSAqIGFkZGl0aW9uYWwgc3lzdGVtIGNhbGwKKwkJCQkJICovCisjZGVmaW5lIGhvX21hZwkJCTB4NmY2OAkvKiBCeXRlIHN3YXAgaG8gdG8gYXZvaWQKKwkJCQkJICogYWRkaXRpb25hbCBzeXN0ZW0gY2FsbAorCQkJCQkgKi8KIAogLyogQml0IGZpZWxkIGRlZmluaXRpb25zIGZvciBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KIC8qIEluZGljYXRlIHRoZSBjYXVzZSBvZiBhbiBpbnRlcnJ1cHQuICovCkBAIC0xMzMsMTMgKzIwMSwxOSBAQAogI2RlZmluZSBJU1JfTUFTS19SQ1YJCTB4MDAwNAkvKiBEb3dubGluayBQYWNrZXQgYXZhaWxhYmxlIG1hc2sgKi8KICNkZWZpbmUgSVNSX01BU0tfV0FURVJNQVJLCTB4MDAwOAkvKiBXYXRlcm1hcmsgaW50ZXJydXB0IG1hc2sgKi8KICNkZWZpbmUgSVNSX01BU0tfQUxMCQkweGZmZmYJLyogTWFzayBhbGwgaW50ZXJydXB0cyAqLwotLyogRGVmYXVsdCBpbnRlcnJ1cHQgbWFzayAoRW5hYmxlIERvb3JiZWxsIHBlbmRpbmcgYW5kIFBhY2tldCBhdmFpbGFibGUgaW50ZXJydXB0cykgKi8KKy8qIERlZmF1bHQgaW50ZXJydXB0IG1hc2sKKyAqIChFbmFibGUgRG9vcmJlbGwgcGVuZGluZyBhbmQgUGFja2V0IGF2YWlsYWJsZSBpbnRlcnJ1cHRzKQorICovCiAjZGVmaW5lIElTUl9ERUZBVUxUX01BU0sJMHg3ZmY5CiAKIC8qIEJpdCBmaWVsZCBkZWZpbml0aW9uIGZvciBIb3N0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRFNQX1JFU0VUX0JJVAkJMHgwMDAxCS8qIEJpdCBmaWVsZCB0byBjb250cm9sIGRzcCByZXNldCBzdGF0ZSAqLworI2RlZmluZSBEU1BfUkVTRVRfQklUCQkweDAwMDEJLyogQml0IGZpZWxkIHRvIGNvbnRyb2wKKwkJCQkJICogZHNwIHJlc2V0IHN0YXRlCisJCQkJCSAqLwogCQkJCQkvKiAoMCA9IG91dCBvZiByZXNldCAxID0gcmVzZXQpICovCi0jZGVmaW5lIEFTSUNfUkVTRVRfQklUCQkweDAwMDIJLyogQml0IGZpZWxkIHRvIGNvbnRyb2wgQVNJQyByZXNldCBzdGF0ZSAqLworI2RlZmluZSBBU0lDX1JFU0VUX0JJVAkJMHgwMDAyCS8qIEJpdCBmaWVsZCB0byBjb250cm9sCisJCQkJCSAqIEFTSUMgcmVzZXQgc3RhdGUKKwkJCQkJICovCiAJCQkJCS8qICgwID0gb3V0IG9mIHJlc2V0IDEgPSByZXNldCkgKi8KICNkZWZpbmUgRFNQX1VORU5DUllQVEVECQkweDAwMDQKICNkZWZpbmUgRFNQX0VOQ1JZUFRFRAkJMHgwMDA4CkBAIC0xOTUsNyArMjY5LDkgQEAKIAl1bnNpZ25lZCBjaGFyCXNvdXJjZTsJCS8qIGhhcmR3YXJlIHNvdXJjZSBpZCAqLwogCQkJCQkvKiAgICBIb3N0ID0gMHgxMCAqLwogCQkJCQkvKiAgICBEc3AgID0gMHgyMCAqLwotCXVuc2lnbmVkIGNoYXIJZGVzdGluYXRpb247CS8qIGhhcmR3YXJlIGRlc3RpbmF0aW9uIGlkIChyZWZlciB0byBzb3VyY2UpICovCisJdW5zaWduZWQgY2hhcglkZXN0aW5hdGlvbjsJLyogaGFyZHdhcmUgZGVzdGluYXRpb24gaWQKKwkJCQkJICogKHJlZmVyIHRvIHNvdXJjZSkKKwkJCQkJICovCiAJdW5zaWduZWQgY2hhcglwb3J0ZGVzdDsJLyogc29mdHdhcmUgZGVzdGluYXRpb24gcG9ydCBpZCAqLwogCQkJCQkvKiAgICBIb3N0ID0gMHgwMCAqLwogCQkJCQkvKiAgICBBcHBsaWNhdG9uIEJyb2FkY2FzdCA9IDB4MTAgKi8KQEAgLTIwNCw3ICsyODAsOSBAQAogCQkJCQkvKiAgICBEc3AgQWlybGluayA9IDB4OTAgKi8KIAkJCQkJLyogICAgRHNwIExvYWRlciA9IDB4YTAgKi8KIAkJCQkJLyogICAgRHNwIE1JUCA9IDB4YjAgKi8KLQl1bnNpZ25lZCBjaGFyCXBvcnRzcmM7CS8qIHNvZnR3YXJlIHNvdXJjZSBwb3J0IGlkIChyZWZlciB0byBwb3J0ZGVzdCkgKi8KKwl1bnNpZ25lZCBjaGFyCXBvcnRzcmM7CS8qIHNvZnR3YXJlIHNvdXJjZSBwb3J0IGlkCisJCQkJCSAqIChyZWZlciB0byBwb3J0ZGVzdCkKKwkJCQkJICovCiAJdW5zaWduZWQgc2hvcnQJc2hfc3RyX2lkOwkvKiBub3QgdXNlZCAqLwogCXVuc2lnbmVkIGNoYXIJY29udHJvbDsJLyogbm90IHVzZWQgKi8KIAl1bnNpZ25lZCBjaGFyCXJzdmQxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL2Z3c2VyaWFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYwppbmRleCA4YWYxMzZlLi5iMjIxNDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYwpAQCAtMjAzNiw2ICsyMDM2LDEzIEBACiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGVlci0+Y29ubmVjdCwgQ09OTkVDVF9SRVRSWV9ERUxBWSk7CiB9CiAKK3N0YXRpYyB2b2lkIGZ3c2VyaWFsX3BlZXJfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZnd0dHlfcGVlciAqcGVlciA9IHRvX3BlZXIod29yaywgd29yayk7CisKKwlwZWVyLT53b3JrZm4od29yayk7Cit9CisKIC8qKgogICogZndzZXJpYWxfYWRkX3BlZXIgLSBhZGQgYSBuZXdseSBwcm9iZWQgJ3NlcmlhbCcgdW5pdCBkZXZpY2UgYXMgYSAncGVlcicKICAqIEBzZXJpYWw6IGFnZ3JlZ2F0ZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmljIGZ3X2NhcmQgdG8gYWRkIHRoZSBwZWVyIHRvCkBAIC0yMTAwLDcgKzIxMDcsNyBAQAogCXBlZXItPnBvcnQgPSBOVUxMOwogCiAJaW5pdF90aW1lcigmcGVlci0+dGltZXIpOwotCUlOSVRfV09SSygmcGVlci0+d29yaywgTlVMTCk7CisJSU5JVF9XT1JLKCZwZWVyLT53b3JrLCBmd3NlcmlhbF9wZWVyX3dvcmtmbik7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnBlZXItPmNvbm5lY3QsIGZ3c2VyaWFsX2F1dG9fY29ubmVjdCk7CiAKIAkvKiBhc3NvY2lhdGUgcGVlciB3aXRoIHNwZWNpZmljIGZ3X2NhcmQgKi8KQEAgLTI3MDIsNyArMjcwOSw3IEBACiAKIAkJfSBlbHNlIHsKIAkJCXBlZXItPndvcmtfcGFyYW1zLnBsdWdfcmVxID0gcGt0LT5wbHVnX3JlcTsKLQkJCVBSRVBBUkVfV09SSygmcGVlci0+d29yaywgZndzZXJpYWxfaGFuZGxlX3BsdWdfcmVxKTsKKwkJCXBlZXItPndvcmtmbiA9IGZ3c2VyaWFsX2hhbmRsZV9wbHVnX3JlcTsKIAkJCXF1ZXVlX3dvcmsoc3lzdGVtX3VuYm91bmRfd3EsICZwZWVyLT53b3JrKTsKIAkJfQogCQlicmVhazsKQEAgLTI3MzEsNyArMjczOCw3IEBACiAJCQlmd3R0eV9lcnIoJnBlZXItPnVuaXQsICJ1bnBsdWcgcmVxOiBidXN5XG4iKTsKIAkJCXJjb2RlID0gUkNPREVfQ09ORkxJQ1RfRVJST1I7CiAJCX0gZWxzZSB7Ci0JCQlQUkVQQVJFX1dPUksoJnBlZXItPndvcmssIGZ3c2VyaWFsX2hhbmRsZV91bnBsdWdfcmVxKTsKKwkJCXBlZXItPndvcmtmbiA9IGZ3c2VyaWFsX2hhbmRsZV91bnBsdWdfcmVxOwogCQkJcXVldWVfd29yayhzeXN0ZW1fdW5ib3VuZF93cSwgJnBlZXItPndvcmspOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL2Z3c2VyaWFsLmggYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuaAppbmRleCA1NGY3ZjliLi45OGI4NTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuaApAQCAtOTEsNiArOTEsNyBAQAogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogCiAJc3BpbmxvY2tfdAkJbG9jazsKKwl3b3JrX2Z1bmNfdAkJd29ya2ZuOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCXN0cnVjdCBwZWVyX3dvcmtfcGFyYW1zIHdvcmtfcGFyYW1zOwogCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jCmluZGV4IDc0YTAzNjAuLjY0YzU1YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMKQEAgLTEzMSw3ICsxMzEsOCBAQAogCiAJLyogR2V0IHRoZSBwb2ludGVyIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0ICovCiAJYXJwX2luID0gKHN0cnVjdCBhcnBoZHIgKikoc2tiX2luLT5kYXRhICsgbWFjX2hlYWRlcl9sZW4pOwotCWFycF9kYXRhX2luID0gKHN0cnVjdCBhcnBkYXRhICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpKTsKKwlhcnBfZGF0YV9pbiA9IChzdHJ1Y3QgYXJwZGF0YSAqKShza2JfaW4tPmRhdGEgKyBtYWNfaGVhZGVyX2xlbiArCisJCQkJCXNpemVvZihzdHJ1Y3QgYXJwaGRyKSk7CiAKIAkvKiBHZXQgdGhlIHBvaW50ZXIgb2YgdGhlIG91dGdvaW5nIHJlc3BvbnNlICovCiAJYXJwX291dCA9IChzdHJ1Y3QgYXJwaGRyICopYXJwX3RlbXA7CkBAIC0xNjAsOSArMTYxLDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCXNrYl9yZXNlcnZlKHNrYl9vdXQsIE5FVF9JUF9BTElHTik7CiAKLQltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBtYWNfaGVhZGVyX2xlbiksIG1hY19oZWFkZXJfZGF0YSwgbWFjX2hlYWRlcl9sZW4pOwotCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSksIGFycF9vdXQsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSk7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBhcnBkYXRhKSksIGFycF9kYXRhX291dCwgc2l6ZW9mKHN0cnVjdCBhcnBkYXRhKSk7CisJbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgbWFjX2hlYWRlcl9sZW4pLCBtYWNfaGVhZGVyX2RhdGEsCisJCW1hY19oZWFkZXJfbGVuKTsKKwltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBzaXplb2Yoc3RydWN0IGFycGhkcikpLCBhcnBfb3V0LAorCQlzaXplb2Yoc3RydWN0IGFycGhkcikpOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgYXJwZGF0YSkpLCBhcnBfZGF0YV9vdXQsCisJCXNpemVvZihzdHJ1Y3QgYXJwZGF0YSkpOwogCiAJc2tiX291dC0+cHJvdG9jb2wgPSAoKHN0cnVjdCBldGhoZHIgKiltYWNfaGVhZGVyX2RhdGEpLT5oX3Byb3RvOwogCXNrYl9vdXQtPmRldiA9IHNrYl9pbi0+ZGV2OwpAQCAtMTk4LDcgKzIwMiw3IEBACiAJcHNldWRvX2hlYWRlci5waC5waF9ueHQgPSBpcHY2LT5uZXh0aGRyOwogCiAJdyA9ICh1MTYgKikmcHNldWRvX2hlYWRlcjsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBzZXVkb19oZWFkZXIucGEpIC8gc2l6ZW9mKHBzZXVkb19oZWFkZXIucGFbMF0pOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHNldWRvX2hlYWRlci5wYSk7IGkrKykKIAkJc3VtICs9IHBzZXVkb19oZWFkZXIucGFbaV07CiAKIAl3ID0gcHRyOwpAQCAtMjYwLDExICsyNjQsMTQgQEAKIAkJcmV0dXJuIC0xOwogCiAJLyogQ2hlY2sgaWYgdGhpcyBpcyBORFAgcGFja2V0ICovCi0JaWNtcDZfaW4gPSAoc3RydWN0IGljbXA2aGRyICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJaWNtcDZfaW4gPSAoc3RydWN0IGljbXA2aGRyICopKHNrYl9pbi0+ZGF0YSArIG1hY19oZWFkZXJfbGVuICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJaWYgKGljbXA2X2luLT5pY21wNl90eXBlID09IE5ESVNDX1JPVVRFUl9TT0xJQ0lUQVRJT04pIHsgLyogQ2hlY2sgUlMgKi8KIAkJcmV0dXJuIC0xOwotCX0gZWxzZSBpZiAoaWNtcDZfaW4tPmljbXA2X3R5cGUgPT0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTikgeyAvKiBDaGVjayBOUyAqLwotCQl1OCBpY21wX25hW3NpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCldOworCX0gZWxzZSBpZiAoaWNtcDZfaW4tPmljbXA2X3R5cGUgPT0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTikgeworCQkvKiBDaGVjayBOUyAqLworCQl1OCBpY21wX25hW3NpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsKKwkJCXNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpXTsKIAkJdTggemVyb19hZGRyOFsxNl0gPSB7MCx9OwogCiAJCWlmIChtZW1jbXAoaXB2Nl9pbi0+c2FkZHIuaW42X3UudTZfYWRkcjgsIHplcm9fYWRkcjgsIDE2KSA9PSAwKQpAQCAtMjc2LDcgKzI4Myw5IEBACiAJCWljbXA2X291dC5pY21wNl9ja3N1bSA9IDA7CiAJCWljbXA2X291dC5pY21wNl9kYXRhdW4udW5fZGF0YTMyWzBdID0gaHRvbmwoMHg2MDAwMDAwMCk7IC8qIFI9MCwgUz0xLCBPPTEgKi8KIAotCQlucyA9IChzdHJ1Y3QgbmVpZ2hib3VyX3NvbGljaXRhdGlvbiAqKShza2JfaW4tPmRhdGEgKyBtYWNfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisJCW5zID0gKHN0cnVjdCBuZWlnaGJvdXJfc29saWNpdGF0aW9uICopCisJCQkoc2tiX2luLT5kYXRhICsgbWFjX2hlYWRlcl9sZW4gKworCQkJIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CiAJCW1lbWNweSgmbmEudGFyZ2V0X2FkZHJlc3MsIG5zLT50YXJnZXRfYWRkcmVzcywgMTYpOwogCQluYS50eXBlID0gMHgwMjsKIAkJbmEubGVuZ3RoID0gMTsKQEAgLTI4OSwxMyArMjk4LDE3IEBACiAKIAkJbWVtY3B5KCZpcHY2X291dCwgaXB2Nl9pbiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJCW1lbWNweShpcHY2X291dC5zYWRkci5pbjZfdS51Nl9hZGRyOCwgJm5hLnRhcmdldF9hZGRyZXNzLCAxNik7Ci0JCW1lbWNweShpcHY2X291dC5kYWRkci5pbjZfdS51Nl9hZGRyOCwgaXB2Nl9pbi0+c2FkZHIuaW42X3UudTZfYWRkcjgsIDE2KTsKLQkJaXB2Nl9vdXQucGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArIHNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKTsKKwkJbWVtY3B5KGlwdjZfb3V0LmRhZGRyLmluNl91LnU2X2FkZHI4LAorCQkJaXB2Nl9pbi0+c2FkZHIuaW42X3UudTZfYWRkcjgsIDE2KTsKKwkJaXB2Nl9vdXQucGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpOwogCiAJCW1lbWNweShpY21wX25hLCAmaWNtcDZfb3V0LCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7Ci0JCW1lbWNweShpY21wX25hICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksICZuYSwgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpOworCQltZW1jcHkoaWNtcF9uYSArIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLCAmbmEsCisJCQlzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KSk7CiAKLQkJaWNtcDZfb3V0LmljbXA2X2Nrc3VtID0gaWNtcDZfY2hlY2tzdW0oJmlwdjZfb3V0LCAodTE2ICopaWNtcF9uYSwgc2l6ZW9mKGljbXBfbmEpKTsKKwkJaWNtcDZfb3V0LmljbXA2X2Nrc3VtID0gaWNtcDZfY2hlY2tzdW0oJmlwdjZfb3V0LAorCQkJCQkodTE2ICopaWNtcF9uYSwgc2l6ZW9mKGljbXBfbmEpKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzExLDEwICszMjQsMTQgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJc2tiX3Jlc2VydmUoc2tiX291dCwgTkVUX0lQX0FMSUdOKTsKIAotCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIG1hY19oZWFkZXJfbGVuKSwgbWFjX2hlYWRlcl9kYXRhLCBtYWNfaGVhZGVyX2xlbik7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSksICZpcHY2X291dCwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpLCAmaWNtcDZfb3V0LCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7Ci0JbWVtY3B5KHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfYWR2ZXJ0aXNlbWVudCkpLCAmbmEsIHNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKTsKKwltZW1jcHkoc2tiX3B1dChza2Jfb3V0LCBtYWNfaGVhZGVyX2xlbiksIG1hY19oZWFkZXJfZGF0YSwKKwkJbWFjX2hlYWRlcl9sZW4pOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpLCAmaXB2Nl9vdXQsCisJCXNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKSwgJmljbXA2X291dCwKKwkJc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpOworCW1lbWNweShza2JfcHV0KHNrYl9vdXQsIHNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyX2FkdmVydGlzZW1lbnQpKSwgJm5hLAorCQlzaXplb2Yoc3RydWN0IG5laWdoYm91cl9hZHZlcnRpc2VtZW50KSk7CiAKIAlza2Jfb3V0LT5wcm90b2NvbCA9ICgoc3RydWN0IGV0aGhkciAqKW1hY19oZWFkZXJfZGF0YSktPmhfcHJvdG87CiAJc2tiX291dC0+ZGV2ID0gc2tiX2luLT5kZXY7CkBAIC0zNjMsNyArMzgwLDggQEAKIAogCQkvKiBDaGVjayBESENQdjQgKi8KIAkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewotCQkJc3RydWN0IHVkcGhkciAqdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikobmV0d29ya19kYXRhICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCQkJc3RydWN0IHVkcGhkciAqdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikKKwkJCQkJKG5ldHdvcmtfZGF0YSArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKIAkJCWlmIChudG9ocyh1ZHAtPmRlc3QpID09IDY3IHx8IG50b2hzKHVkcC0+ZGVzdCkgPT0gNjgpCiAJCQkJbmljX3R5cGUgfD0gTklDX1RZUEVfRl9ESENQOwogCQl9CkBAIC0zNzMsMTIgKzM5MSwxMyBAQAogCQlpcHY2ID0gKHN0cnVjdCBpcHY2aGRyICopbmV0d29ya19kYXRhOwogCiAJCWlmIChpcHY2LT5uZXh0aGRyID09IElQUFJPVE9fSUNNUFY2KSAvKiBDaGVjayBORFAgcmVxdWVzdCAqLyB7Ci0JCQlzdHJ1Y3QgaWNtcDZoZHIgKmljbXA2ID0gKHN0cnVjdCBpY21wNmhkciAqKShuZXR3b3JrX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQkJCWlmICgvKmljbXA2LT5pY21wNl90eXBlID09IE5ESVNDX1JPVVRFUl9TT0xJQ0lUQVRJT04gfHwgKi8KLQkJCQlpY21wNi0+aWNtcDZfdHlwZSA9PSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OKQorCQkJc3RydWN0IGljbXA2aGRyICppY21wNiA9IChzdHJ1Y3QgaWNtcDZoZHIgKikKKwkJCQkJKG5ldHdvcmtfZGF0YSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQkJaWYgKGljbXA2LT5pY21wNl90eXBlID09IE5ESVNDX05FSUdIQk9VUl9TT0xJQ0lUQVRJT04pCiAJCQkJbmljX3R5cGUgfD0gTklDX1RZUEVfSUNNUFY2OwogCQl9IGVsc2UgaWYgKGlwdjYtPm5leHRoZHIgPT0gSVBQUk9UT19VRFApIC8qIENoZWNrIERIQ1B2NiAqLyB7Ci0JCQlzdHJ1Y3QgdWRwaGRyICp1ZHAgPSAoc3RydWN0IHVkcGhkciAqKShuZXR3b3JrX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IChzdHJ1Y3QgdWRwaGRyICopCisJCQkJCShuZXR3b3JrX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAkJCWlmIChudG9ocyh1ZHAtPmRlc3QpID09IDU0NiB8fCBudG9ocyh1ZHAtPmRlc3QpID09IDU0NykKIAkJCQluaWNfdHlwZSB8PSBOSUNfVFlQRV9GX0RIQ1A7CiAJCX0KQEAgLTQyMCwxMSArNDM5LDEyIEBACiAJfQogCiAJLyoKLQlOZWVkIGJ5dGUgc2hpZnQgKHRoYXQgaXMsIHJlbW92ZSBWTEFOIHRhZykgaWYgdGhlcmUgaXMgb25lCi0JRm9yIHRoZSBjYXNlIG9mIEFSUCwgdGhpcyBicmVha3MgdGhlIG9mZnNldCBhcyB2bGFuX2V0aGhkcis0IGlzIHRyZWF0ZWQgYXMgZXRoaGRyCi0JSG93ZXZlciwgaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBhcyB0aGUgcmVzcG9uc2Ugc3RhcnRzIGZyb20gYXJwX2hkciBhbmQgZXRoaGRyCi0JaXMgY3JlYXRlZCBieSB0aGlzIGRyaXZlciBiYXNlZCBvbiB0aGUgTklDIG1hYwotCSovCisJICogTmVlZCBieXRlIHNoaWZ0ICh0aGF0IGlzLCByZW1vdmUgVkxBTiB0YWcpIGlmIHRoZXJlIGlzIG9uZQorCSAqIEZvciB0aGUgY2FzZSBvZiBBUlAsIHRoaXMgYnJlYWtzIHRoZSBvZmZzZXQgYXMgdmxhbl9ldGhoZHIrNAorCSAqIGlzIHRyZWF0ZWQgYXMgZXRoaGRyCUhvd2V2ZXIsIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0gYXMKKwkgKiB0aGUgcmVzcG9uc2Ugc3RhcnRzIGZyb20gYXJwX2hkciBhbmQgZXRoaGRyIGlzIGNyZWF0ZWQgYnkgdGhpcworCSAqIGRyaXZlciBiYXNlZCBvbiB0aGUgTklDIG1hYworCSAqLwogCWlmIChuaWNfdHlwZSAmIE5JQ19UWVBFX0ZfVkxBTikgewogCQlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZsYW5fZXRoID0gKHN0cnVjdCB2bGFuX2V0aGhkciAqKXNrYi0+ZGF0YTsKIAkJbmljLT52bGFuX2lkID0gbnRvaHModmxhbl9ldGgtPmhfdmxhbl9UQ0kpICYgVkxBTl9WSURfTUFTSzsKQEAgLTQzNiwxNSArNDU2LDIzIEBACiAJCWRhdGFfbGVuID0gc2tiLT5sZW47CiAJfQogCi0JLyogSWYgaXQgaXMgYSBJQ01QVjYgcGFja2V0LCBjbGVhciBhbGwgdGhlIG90aGVyIGJpdHMgOiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmaXJtd2FyZSAqLworCS8qIElmIGl0IGlzIGEgSUNNUFY2IHBhY2tldCwgY2xlYXIgYWxsIHRoZSBvdGhlciBiaXRzIDoKKwkgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmaXJtd2FyZQorCSAqLwogCWlmIChuaWNfdHlwZSAmIE5JQ19UWVBFX0lDTVBWNikKIAkJbmljX3R5cGUgPSBOSUNfVFlQRV9JQ01QVjY7CiAKLQkvKiBJZiBpdCBpcyBub3QgYSBkaGNwIHBhY2tldCwgY2xlYXIgYWxsIHRoZSBmbGFnIGJpdHMgOiBvcmlnaW5hbCBOSUMsIG90aGVyd2lzZSB0aGUgc3BlY2lhbCBmbGFnIChJUFZYIHwgREhDUCkgKi8KKwkvKiBJZiBpdCBpcyBub3QgYSBkaGNwIHBhY2tldCwgY2xlYXIgYWxsIHRoZSBmbGFnIGJpdHMgOgorCSAqIG9yaWdpbmFsIE5JQywgb3RoZXJ3aXNlIHRoZSBzcGVjaWFsIGZsYWcgKElQVlggfCBESENQKQorCSAqLwogCWlmICghKG5pY190eXBlICYgTklDX1RZUEVfRl9ESENQKSkKIAkJbmljX3R5cGUgJj0gTklDX1RZUEVfTUFTSzsKIAotCXNzY2FuZihkZXYtPm5hbWUsICJsdGUlZCIsICZpZHgpOworCXJldCA9IHNzY2FuZihkZXYtPm5hbWUsICJsdGUlZCIsICZpZHgpOworCWlmIChyZXQgIT0gMSkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IG5pYy0+cGh5X2Rldi0+c2VuZF9zZHVfZnVuYyhuaWMtPnBoeV9kZXYtPnByaXZfZGV2LAogCQkJCQkgIGRhdGFfYnVmLCBkYXRhX2xlbiwKQEAgLTQ4NSw4ICs1MTMsMTEgQEAKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBoY2lfcGFja2V0ICpoY2kgPSAoc3RydWN0IGhjaV9wYWNrZXQgKilidWY7CiAJaW50IGlkeDsKKwlpbnQgcmV0OwogCi0Jc3NjYW5mKGRldi0+bmFtZSwgImx0ZSVkIiwgJmlkeCk7CisJcmV0ID0gc3NjYW5mKGRldi0+bmFtZSwgImx0ZSVkIiwgJmlkeCk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBuZXRsaW5rX3NlbmQobHRlX2V2ZW50LnNvY2ssIGlkeCwgMCwgYnVmLAogCQkJICAgIGdkbV9kZXYxNl90b19jcHUoCkBAIC00OTUsNyArNTI2LDggQEAKIAkJCSAgICArIEhDSV9IRUFERVJfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIGdkbV9sdGVfZXZlbnRfcmN2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eXBlLCB2b2lkICptc2csIGludCBsZW4pCitzdGF0aWMgdm9pZCBnZG1fbHRlX2V2ZW50X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgdHlwZSwKKwkJCQl2b2lkICptc2csIGludCBsZW4pCiB7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNTM2LDcgKzU2OCw4IEBACiAJcmV0dXJuIGluZGV4OwogfQogCi1zdGF0aWMgdm9pZCBnZG1fbHRlX25ldGlmX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdnZWRfbmljX3R5cGUpCitzdGF0aWMgdm9pZCBnZG1fbHRlX25ldGlmX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKKwkJCWludCBsZW4sIGludCBmbGFnZ2VkX25pY190eXBlKQogewogCXUzMiBuaWNfdHlwZTsKIAlzdHJ1Y3QgbmljICpuaWM7CkBAIC01NTEsMjggKzU4NCw0NiBAQAogCW5pYyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoZmxhZ2dlZF9uaWNfdHlwZSAmIE5JQ19UWVBFX0ZfREhDUCkgewotCQkvKiBDaGFuZ2UgdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIHdpdGggdGhlIG9uZSByZXF1ZXN0ZWQgdGhlIElQICovCisJCS8qIENoYW5nZSB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3MKKwkJICogd2l0aCB0aGUgb25lIHJlcXVlc3RlZCB0aGUgSVAKKwkJICovCiAJCWlmIChmbGFnZ2VkX25pY190eXBlICYgTklDX1RZUEVfRl9JUFY0KSB7CiAJCQlzdHJ1Y3QgZGhjcF9wYWNrZXQgewogCQkJCXU4IG9wOyAgICAgIC8qIEJPT1RSRVFVRVNUIG9yIEJPT1RSRVBMWSAqLwotCQkJCXU4IGh0eXBlOyAgIC8qIGhhcmR3YXJlIGFkZHJlc3MgdHlwZS4gMSA9IDEwbWIgZXRoZXJuZXQgKi8KKwkJCQl1OCBodHlwZTsgICAvKiBoYXJkd2FyZSBhZGRyZXNzIHR5cGUuCisJCQkJCSAgICAgKiAxID0gMTBtYiBldGhlcm5ldAorCQkJCQkgICAgICovCiAJCQkJdTggaGxlbjsgICAgLyogaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KIAkJCQl1OCBob3BzOyAgICAvKiB1c2VkIGJ5IHJlbGF5IGFnZW50cyBvbmx5ICovCiAJCQkJdTMyIHhpZDsgICAgLyogdW5pcXVlIGlkICovCi0JCQkJdTE2IHNlY3M7ICAgLyogZWxhcHNlZCBzaW5jZSBjbGllbnQgYmVnYW4gYWNxdWlzaXRpb24vcmVuZXdhbCAqLworCQkJCXUxNiBzZWNzOyAgIC8qIGVsYXBzZWQgc2luY2UgY2xpZW50IGJlZ2FuCisJCQkJCSAgICAgKiBhY3F1aXNpdGlvbi9yZW5ld2FsCisJCQkJCSAgICAgKi8KIAkJCQl1MTYgZmxhZ3M7ICAvKiBvbmx5IG9uZSBmbGFnIHNvIGZhcjogKi8KLQkJCQkjZGVmaW5lIEJST0FEQ0FTVF9GTEFHIDB4ODAwMCAvKiAiSSBuZWVkIGJyb2FkY2FzdCByZXBsaWVzIiAqLwotCQkJCXUzMiBjaWFkZHI7IC8qIGNsaWVudCBJUCAoaWYgY2xpZW50IGlzIGluIEJPVU5ELCBSRU5FVyBvciBSRUJJTkRJTkcgc3RhdGUpICovCisJCQkJI2RlZmluZSBCUk9BRENBU1RfRkxBRyAweDgwMDAKKwkJCQkvKiAiSSBuZWVkIGJyb2FkY2FzdCByZXBsaWVzIiAqLworCQkJCXUzMiBjaWFkZHI7IC8qIGNsaWVudCBJUCAoaWYgY2xpZW50IGlzIGluCisJCQkJCSAgICAgKiBCT1VORCwgUkVORVcgb3IgUkVCSU5ESU5HIHN0YXRlKQorCQkJCQkgICAgICovCiAJCQkJdTMyIHlpYWRkcjsgLyogJ3lvdXInIChjbGllbnQpIElQIGFkZHJlc3MgKi8KLQkJCQkvKiBJUCBhZGRyZXNzIG9mIG5leHQgc2VydmVyIHRvIHVzZSBpbiBib290c3RyYXAsIHJldHVybmVkIGluIERIQ1BPRkZFUiwgREhDUEFDSyBieSBzZXJ2ZXIgKi8KKwkJCQkvKiBJUCBhZGRyZXNzIG9mIG5leHQgc2VydmVyIHRvIHVzZSBpbgorCQkJCSAqIGJvb3RzdHJhcCwgcmV0dXJuZWQgaW4gREhDUE9GRkVSLAorCQkJCSAqIERIQ1BBQ0sgYnkgc2VydmVyCisJCQkJICovCiAJCQkJdTMyIHNpYWRkcl9uaXA7CiAJCQkJdTMyIGdhdGV3YXlfbmlwOyAvKiByZWxheSBhZ2VudCBJUCBhZGRyZXNzICovCi0JCQkJdTggY2hhZGRyWzE2XTsgICAvKiBsaW5rLWxheWVyIGNsaWVudCBoYXJkd2FyZSBhZGRyZXNzIChNQUMpICovCisJCQkJdTggY2hhZGRyWzE2XTsgICAvKiBsaW5rLWxheWVyIGNsaWVudCBoYXJkd2FyZQorCQkJCQkJICAqIGFkZHJlc3MgKE1BQykKKwkJCQkJCSAgKi8KIAkJCQl1OCBzbmFtZVs2NF07ICAgIC8qIHNlcnZlciBob3N0IG5hbWUgKEFTQ0laKSAqLwogCQkJCXU4IGZpbGVbMTI4XTsgICAgLyogYm9vdCBmaWxlIG5hbWUgKEFTQ0laKSAqLwotCQkJCXUzMiBjb29raWU7ICAgICAgLyogZml4ZWQgZmlyc3QgZm91ciBvcHRpb24gYnl0ZXMgKDk5LDEzMCw4Myw5OSBkZWMpICovCisJCQkJdTMyIGNvb2tpZTsgICAgICAvKiBmaXhlZCBmaXJzdCBmb3VyIG9wdGlvbgorCQkJCQkJICAqIGJ5dGVzICg5OSwxMzAsODMsOTkgZGVjKQorCQkJCQkJICAqLwogCQkJfSBfX3BhY2tlZDsKLQkJCXZvaWQgKmFkZHIgPSBidWYgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIG9mZnNldG9mKHN0cnVjdCBkaGNwX3BhY2tldCwgY2hhZGRyKTsKKwkJCXZvaWQgKmFkZHIgPSBidWYgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3QgZGhjcF9wYWNrZXQsIGNoYWRkcik7CiAJCQltZW1jcHkobmljLT5kZXN0X21hY19hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAJCX0KIAl9CkBAIC01OTMsNyArNjQ0LDkgQEAKIAl2bGFuX2V0aC5oX3ZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CiAKIAlpZiAobmljX3R5cGUgPT0gTklDX1RZUEVfQVJQKSB7Ci0JCS8qIFNob3VsZCBiZSByZXNwb25zZTogT25seSBoYXBwZW5zIGJlY2F1c2UgdGhlcmUgd2FzIGEgcmVxdWVzdCBmcm9tIHRoZSBob3N0ICovCisJCS8qIFNob3VsZCBiZSByZXNwb25zZTogT25seSBoYXBwZW5zIGJlY2F1c2UKKwkJICogdGhlcmUgd2FzIGEgcmVxdWVzdCBmcm9tIHRoZSBob3N0CisJCSAqLwogCQlldGguaF9wcm90byA9IGh0b25zKEVUSF9QX0FSUCk7CiAJCXZsYW5fZXRoLmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBodG9ucyhFVEhfUF9BUlApOwogCX0gZWxzZSB7CkBAIC02NDAsMTUgKzY5MywyMCBAQAogCXUzMiBuaWNfdHlwZTsKIAl1OCBpbmRleDsKIAotCWhjaV9sZW4gPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBtdWx0aV9zZHUtPmxlbik7Ci0JbnVtX3BhY2tldCA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIG11bHRpX3NkdS0+bnVtX3BhY2tldCk7CisJaGNpX2xlbiA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksCisJCQkJbXVsdGlfc2R1LT5sZW4pOworCW51bV9wYWNrZXQgPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLAorCQkJCW11bHRpX3NkdS0+bnVtX3BhY2tldCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2tldDsgaSsrKSB7CiAJCXNkdSA9IChzdHJ1Y3Qgc2R1ICopZGF0YTsKIAotCQljbWRfZXZ0ID0gZ2RtX2RldjE2X3RvX2NwdShwaHlfZGV2LT5nZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgc2R1LT5jbWRfZXZ0KTsKLQkJaGNpX2xlbiA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+Z2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+bGVuKTsKLQkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPm5pY190eXBlKTsKKwkJY21kX2V2dCA9IGdkbV9kZXYxNl90b19jcHUocGh5X2Rldi0+CisJCQkJZ2V0X2VuZGlhbihwaHlfZGV2LT5wcml2X2RldiksIHNkdS0+Y21kX2V2dCk7CisJCWhjaV9sZW4gPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPgorCQkJCWdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPmxlbik7CisJCW5pY190eXBlID0gZ2RtX2RldjMyX3RvX2NwdShwaHlfZGV2LT4KKwkJCQlnZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgc2R1LT5uaWNfdHlwZSk7CiAKIAkJaWYgKGNtZF9ldnQgIT0gTFRFX1JYX1NEVSkgewogCQkJcHJfZXJyKCJyeCBzZHUgd3JvbmcgaGNpICUwNHhcbiIsIGNtZF9ldnQpOwpAQCAtNjYyLDcgKzcyMCw4IEBACiAJCWluZGV4ID0gZmluZF9kZXZfaW5kZXgobmljX3R5cGUpOwogCQlpZiAoaW5kZXggPCBNQVhfTklDX1RZUEUpIHsKIAkJCWRldiA9IHBoeV9kZXYtPmRldltpbmRleF07Ci0JCQlnZG1fbHRlX25ldGlmX3J4KGRldiwgKGNoYXIgKilzZHUtPmRhdGEsIChpbnQpKGhjaV9sZW4tMTIpLCBuaWNfdHlwZSk7CisJCQlnZG1fbHRlX25ldGlmX3J4KGRldiwgKGNoYXIgKilzZHUtPmRhdGEsCisJCQkJCShpbnQpKGhjaV9sZW4tMTIpLCBuaWNfdHlwZSk7CiAJCX0gZWxzZSB7CiAJCQlwcl9lcnIoInJ4IHNkdSBpbnZhbGlkIG5pY190eXBlIDoleFxuIiwgbmljX3R5cGUpOwogCQl9CkBAIC03MDksNyArNzY4LDggQEAKIAlpZiAoIWxlbikKIAkJcmV0dXJuIHJldDsKIAotCWNtZF9ldnQgPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBoY2ktPmNtZF9ldnQpOworCWNtZF9ldnQgPSBnZG1fZGV2MTZfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLAorCQkJCWhjaS0+Y21kX2V2dCk7CiAKIAlkZXYgPSBwaHlfZGV2LT5kZXZbMF07CiAJaWYgKGRldiA9PSBOVUxMKQpAQCAtNzE4LDcgKzc3OCw4IEBACiAJc3dpdGNoIChjbWRfZXZ0KSB7CiAJY2FzZSBMVEVfUlhfU0RVOgogCQlzZHUgPSAoc3RydWN0IHNkdSAqKWhjaS0+ZGF0YTsKLQkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPmdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPm5pY190eXBlKTsKKwkJbmljX3R5cGUgPSBnZG1fZGV2MzJfdG9fY3B1KHBoeV9kZXYtPgorCQkJCWdldF9lbmRpYW4ocGh5X2Rldi0+cHJpdl9kZXYpLCBzZHUtPm5pY190eXBlKTsKIAkJaW5kZXggPSBmaW5kX2Rldl9pbmRleChuaWNfdHlwZSk7CiAJCWRldiA9IHBoeV9kZXYtPmRldltpbmRleF07CiAJCWdkbV9sdGVfbmV0aWZfcngoZGV2LCBoY2ktPmRhdGEsIGxlbiwgbmljX3R5cGUpOwpAQCAtNzMzLDcgKzc5NCw5IEBACiAJCWJyZWFrOwogCWNhc2UgTFRFX1BETl9UQUJMRV9JTkQ6CiAJCXBkbl90YWJsZSA9IChzdHJ1Y3QgaGNpX3Bkbl90YWJsZV9pbmQgKilidWY7Ci0JCW5pY190eXBlID0gZ2RtX2RldjMyX3RvX2NwdShwaHlfZGV2LT5nZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwgcGRuX3RhYmxlLT5uaWNfdHlwZSk7CisJCW5pY190eXBlID0gZ2RtX2RldjMyX3RvX2NwdShwaHlfZGV2LT4KKwkJCQlnZXRfZW5kaWFuKHBoeV9kZXYtPnByaXZfZGV2KSwKKwkJCQlwZG5fdGFibGUtPm5pY190eXBlKTsKIAkJaW5kZXggPSBmaW5kX2Rldl9pbmRleChuaWNfdHlwZSk7CiAJCWRldiA9IHBoeV9kZXYtPmRldltpbmRleF07CiAJCWdkbV9sdGVfcGRuX3RhYmxlKGRldiwgYnVmLCBsZW4pOwpAQCAtNzU4LDcgKzgyMSw4IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1JYX1NVQk1JVF9DT1VOVDsgaSsrKQotCQlwaHlfZGV2LT5yY3ZfZnVuYyhwaHlfZGV2LT5wcml2X2RldiwgcnhfY29tcGxldGUsIHBoeV9kZXYsIFVTQl9DT01QTEVURSk7CisJCXBoeV9kZXYtPnJjdl9mdW5jKHBoeV9kZXYtPnByaXZfZGV2LAorCQkJCXJ4X2NvbXBsZXRlLCBwaHlfZGV2LCBVU0JfQ09NUExFVEUpOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGdkbV9uZXRkZXZfb3BzID0gewpAQCAtNzcxLDcgKzgzNSw4IEBACiAKIHN0YXRpYyB1OCBnZG1fbHRlX21hY2FkZHJbRVRIX0FMRU5dID0gezB4MDAsIDB4MGEsIDB4M2IsIDB4MDAsIDB4MDAsIDB4MDB9OwogCi1zdGF0aWMgdm9pZCBmb3JtX21hY19hZGRyZXNzKHU4ICpkZXZfYWRkciwgdTggKm5pY19zcmMsIHU4ICpuaWNfZGVzdCwgdTggKm1hY19hZGRyZXNzLCB1OCBpbmRleCkKK3N0YXRpYyB2b2lkIGZvcm1fbWFjX2FkZHJlc3ModTggKmRldl9hZGRyLCB1OCAqbmljX3NyYywgdTggKm5pY19kZXN0LAorCQkJdTggKm1hY19hZGRyZXNzLCB1OCBpbmRleCkKIHsKIAkvKiBGb3JtIHRoZSBkZXZfYWRkciAqLwogCWlmICghbWFjX2FkZHJlc3MpCkBAIC03NzksMTAgKzg0NCwxNCBAQAogCWVsc2UKIAkJbWVtY3B5KGRldl9hZGRyLCBtYWNfYWRkcmVzcywgRVRIX0FMRU4pOwogCi0JLyogVGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWFjIGFkZHJlc3Mgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAweEZDICovCisJLyogVGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWFjIGFkZHJlc3MKKwkgKiBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDB4RkMKKwkgKi8KIAlkZXZfYWRkcltFVEhfQUxFTi0xXSArPSBpbmRleDsKIAotCS8qIENyZWF0ZSByYW5kb20gbmljIHNyYyBhbmQgY29weSB0aGUgZmlyc3QgMyBieXRlcyB0byBiZSB0aGUgc2FtZSBhcyBkZXZfYWRkciAqLworCS8qIENyZWF0ZSByYW5kb20gbmljIHNyYyBhbmQgY29weSB0aGUgZmlyc3QKKwkgKiAzIGJ5dGVzIHRvIGJlIHRoZSBzYW1lIGFzIGRldl9hZGRyCisJICovCiAJcmFuZG9tX2V0aGVyX2FkZHIobmljX3NyYyk7CiAJbWVtY3B5KG5pY19zcmMsIGRldl9hZGRyLCAzKTsKIApAQCAtNzk5LDcgKzg2OCw4IEBACiAJfQogfQogCi1pbnQgcmVnaXN0ZXJfbHRlX2RldmljZShzdHJ1Y3QgcGh5X2RldiAqcGh5X2Rldiwgc3RydWN0IGRldmljZSAqZGV2LCB1OCAqbWFjX2FkZHJlc3MpCitpbnQgcmVnaXN0ZXJfbHRlX2RldmljZShzdHJ1Y3QgcGh5X2RldiAqcGh5X2RldiwKKwkJCXN0cnVjdCBkZXZpY2UgKmRldiwgdTggKm1hY19hZGRyZXNzKQogewogCXN0cnVjdCBuaWMgKm5pYzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwpAQCAtODE0LDcgKzg4NCw4IEBACiAJCXNwcmludGYocGRuX2Rldl9uYW1lLCAibHRlJSVkcGRuJWQiLCBpbmRleCk7CiAKIAkJLyogQWxsb2NhdGUgbmV0ZGV2ICovCi0JCW5ldCA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5pYyksIHBkbl9kZXZfbmFtZSwgZXRoZXJfc2V0dXApOworCQluZXQgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuaWMpLCBwZG5fZGV2X25hbWUsCisJCQkJZXRoZXJfc2V0dXApOwogCQlpZiAobmV0ID09IE5VTEwpIHsKIAkJCXByX2VycigiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7CiAJCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5oCmluZGV4IDkyODdkMzEuLjg4NDE0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmgKQEAgLTU2LDcgKzU2LDcgQEAKIAkJCWludCAoKmNiKSh2b2lkICpjYl9kYXRhLCB2b2lkICpkYXRhLCBpbnQgbGVuLAogCQkJCSAgaW50IGNvbnRleHQpLAogCQkJdm9pZCAqY2JfZGF0YSwgaW50IGNvbnRleHQpOwotCXN0cnVjdCBnZG1fZW5kaWFuICooKmdldF9lbmRpYW4pKHZvaWQgKnByaXZfZGV2KTsKKwlzdHJ1Y3QgZ2RtX2VuZGlhbiAqICgqZ2V0X2VuZGlhbikodm9pZCAqcHJpdl9kZXYpOwogfTsKIAogc3RydWN0IG5pYyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMKaW5kZXggMmZhM2E1YS4uMTBjZTJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguYwpAQCAtMTY1LDcgKzE2NSw4IEBACiAJaW50IGxlbiA9IHItPmxlbjsKIAogCXdoaWxlICgxKSB7Ci0JCW11eF9oZWFkZXIgPSAoc3RydWN0IG11eF9wa3RfaGVhZGVyICopKHItPmJ1ZiArIHBhY2tldF9zaXplX3N1bSk7CisJCW11eF9oZWFkZXIgPSAoc3RydWN0IG11eF9wa3RfaGVhZGVyICopKHItPmJ1ZiArCisJCQkJCQkgICAgICAgcGFja2V0X3NpemVfc3VtKTsKIAkJc3RhcnRfZmxhZyA9IF9fbGUzMl90b19jcHUobXV4X2hlYWRlci0+c3RhcnRfZmxhZyk7CiAJCXBheWxvYWRfc2l6ZSA9IF9fbGUzMl90b19jcHUobXV4X2hlYWRlci0+cGF5bG9hZF9zaXplKTsKIAkJcGFja2V0X3R5cGUgPSBfX2xlMTZfdG9fY3B1KG11eF9oZWFkZXItPnBhY2tldF90eXBlKTsKQEAgLTIzMSw3ICsyMzIsOCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KLQkJciA9IGxpc3RfZW50cnkocngtPnRvX2hvc3RfbGlzdC5uZXh0LCBzdHJ1Y3QgbXV4X3J4LCB0b19ob3N0X2xpc3QpOworCQlyID0gbGlzdF9lbnRyeShyeC0+dG9faG9zdF9saXN0Lm5leHQsIHN0cnVjdCBtdXhfcngsCisJCQkgICAgICAgdG9faG9zdF9saXN0KTsKIAkJbGlzdF9kZWwoJnItPnRvX2hvc3RfbGlzdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4LT50b19ob3N0X2xvY2ssIGZsYWdzKTsKIApAQCAtMjQ5LDcgKzI1MSw4IEBACiAJc3RydWN0IG11eF9yeAkqcl9yZW1vdmUsICpyX3JlbW92ZV9uZXh0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfcmVtb3ZlLCByX3JlbW92ZV9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyX3JlbW92ZSwgcl9yZW1vdmVfbmV4dCwgJnJ4LT5yeF9zdWJtaXRfbGlzdCwKKwkJCQkgcnhfc3VibWl0X2xpc3QpIHsKIAkJaWYgKHIgPT0gcl9yZW1vdmUpCiAJCQlsaXN0X2RlbCgmci0+cnhfc3VibWl0X2xpc3QpOwogCX0KQEAgLTI3OSw5ICsyODIsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBnZG1fbXV4X3JlY3Yodm9pZCAqcHJpdl9kZXYsCi0JCQlpbnQgKCpjYikodm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IHR0eV9pbmRleCwgc3RydWN0IHR0eV9kZXYgKnR0eV9kZXYsIGludCBjb21wbGV0ZSkKLQkJCSkKK3N0YXRpYyBpbnQgZ2RtX211eF9yZWN2KHZvaWQgKnByaXZfZGV2LCBpbnQgKCpjYikodm9pZCAqZGF0YSwgaW50IGxlbiwKKwkJCWludCB0dHlfaW5kZXgsIHN0cnVjdCB0dHlfZGV2ICp0dHlfZGV2LCBpbnQgY29tcGxldGUpKQogewogCXN0cnVjdCBtdXhfZGV2ICptdXhfZGV2ID0gcHJpdl9kZXY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IG11eF9kZXYtPnVzYmRldjsKQEAgLTQxNiw3ICs0MTgsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZ2RtX211eF9zZW5kX2NvbnRyb2wodm9pZCAqcHJpdl9kZXYsIGludCByZXF1ZXN0LCBpbnQgdmFsdWUsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3N0YXRpYyBpbnQgZ2RtX211eF9zZW5kX2NvbnRyb2wodm9pZCAqcHJpdl9kZXYsIGludCByZXF1ZXN0LCBpbnQgdmFsdWUsCisJCQkJdm9pZCAqYnVmLCBpbnQgbGVuKQogewogCXN0cnVjdCBtdXhfZGV2ICptdXhfZGV2ID0gcHJpdl9kZXY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IG11eF9kZXYtPnVzYmRldjsKQEAgLTQ0OCw3ICs0NTEsOCBAQAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJm11eF9kZXYtPndvcmtfcngpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIHJfbmV4dCwgJnJ4LT5yeF9zdWJtaXRfbGlzdCwgcnhfc3VibWl0X2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcl9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LAorCQkJCSByeF9zdWJtaXRfbGlzdCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeC0+c3VibWl0X2xpc3RfbG9jaywgZmxhZ3MpOwogCQl1c2Jfa2lsbF91cmIoci0+dXJiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7CkBAIC01MDMsNyArNTA3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGdkbV9tdXhfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgZ2RtX211eF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IG11eF9kZXYgKm11eF9kZXY7CiAJc3RydWN0IHR0eV9kZXYgKnR0eV9kZXY7CkBAIC02MTAsNyArNjE1LDggQEAKIAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIHJfbmV4dCwgJnJ4LT5yeF9zdWJtaXRfbGlzdCwgcnhfc3VibWl0X2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgcl9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LAorCQkJCSByeF9zdWJtaXRfbGlzdCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeC0+c3VibWl0X2xpc3RfbG9jaywgZmxhZ3MpOwogCQl1c2Jfa2lsbF91cmIoci0+dXJiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4LT5zdWJtaXRfbGlzdF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMKaW5kZXggMzM0NThhNS4uZWU2ZTQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYwpAQCAtMzAsMTQgKzMwLDE3IEBACiAjaW5jbHVkZSAiZ2RtX2VuZGlhbi5oIgogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfQ0RDX0RBVEEodmlkLCBwaWQpIFwKLQkubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfU1VCQ0xBU1MsXAorCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwgXAorCQlVU0JfREVWSUNFX0lEX01BVENIX0lOVF9DTEFTUyB8IFwKKwkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfU1VCQ0xBU1MsXAogCS5pZFZlbmRvciA9IHZpZCxcCiAJLmlkUHJvZHVjdCA9IHBpZCxcCiAJLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19DT01NLFwKIAkuYkludGVyZmFjZVN1YkNsYXNzID0gVVNCX0NEQ19TVUJDTEFTU19FVEhFUk5FVAogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfTUFTU19EQVRBKHZpZCwgcGlkKSBcCi0JLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UgfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLFwKKwkubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8IFwKKwkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTyxcCiAJLmlkVmVuZG9yID0gdmlkLFwKIAkuaWRQcm9kdWN0ID0gcGlkLFwKIAkuYkludGVyZmFjZVN1YkNsYXNzID0gVVNCX1NDX1NDU0ksIFwKQEAgLTU5LDcgKzYyLDggQEAKIHN0YXRpYyB2b2lkIGRvX3J4KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIHN0YXRpYyBpbnQgZ2RtX3VzYl9yZWN2KHZvaWQgKnByaXZfZGV2LAotCQkJaW50ICgqY2IpKHZvaWQgKmNiX2RhdGEsIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKKwkJCWludCAoKmNiKSh2b2lkICpjYl9kYXRhLAorCQkJCXZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKIAkJCXZvaWQgKmNiX2RhdGEsCiAJCQlpbnQgY29udGV4dCk7CiAKQEAgLTExOSwyOCArMTIzLDE1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3R4X3NkdSAqYWxsb2NfdHhfc2R1X3N0cnVjdCh2b2lkKQogewotCXN0cnVjdCB1c2JfdHhfc2R1ICp0X3NkdSA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0KKwlzdHJ1Y3QgdXNiX3R4X3NkdSAqdF9zZHU7CiAKIAl0X3NkdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfdHhfc2R1KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0X3NkdSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCF0X3NkdSkKKwkJcmV0dXJuIE5VTEw7CiAKIAl0X3NkdS0+YnVmID0ga21hbGxvYyhTRFVfQlVGX1NJWkUsIEdGUF9BVE9NSUMpOwogCWlmICghdF9zZHUtPmJ1ZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci1vdXQ6Ci0KLQlpZiAocmV0IDwgMCkgewotCQlpZiAodF9zZHUpIHsKLQkJCWtmcmVlKHRfc2R1LT5idWYpOwotCQkJa2ZyZWUodF9zZHUpOwotCQl9CisJCWtmcmVlKHRfc2R1KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0zODgsNyArMzc5LDggQEAKIAlpZiAodGx2LT50eXBlID09IE1BQ19BRERSRVNTICYmIHVkZXYtPnJlcXVlc3RfbWFjX2FkZHIpIHsKIAkJbWVtY3B5KG1hY19hZGRyZXNzLCB0bHYtPmRhdGEsIHRsdi0+bGVuKTsKIAotCQlpZiAocmVnaXN0ZXJfbHRlX2RldmljZShwaHlfZGV2LCAmdWRldi0+aW50Zi0+ZGV2LCBtYWNfYWRkcmVzcykgPCAwKQorCQlpZiAocmVnaXN0ZXJfbHRlX2RldmljZShwaHlfZGV2LAorCQkJCSZ1ZGV2LT5pbnRmLT5kZXYsIG1hY19hZGRyZXNzKSA8IDApCiAJCQlwcl9lcnIoInJlZ2lzdGVyIGx0ZSBkZXZpY2UgZmFpbGVkXG4iKTsKIAogCQl1ZGV2LT5yZXF1ZXN0X21hY19hZGRyID0gMDsKQEAgLTQwMSw3ICszOTMsOCBAQAogCiBzdGF0aWMgdm9pZCBkb19yeChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGx0ZV91ZGV2ICp1ZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsdGVfdWRldiwgd29ya19yeC53b3JrKTsKKwlzdHJ1Y3QgbHRlX3VkZXYgKnVkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGx0ZV91ZGV2LCB3b3JrX3J4LndvcmspOwogCXN0cnVjdCByeF9jeHQgKnJ4ID0gJnVkZXYtPnJ4OwogCXN0cnVjdCB1c2JfcnggKnI7CiAJc3RydWN0IGhjaV9wYWNrZXQgKmhjaTsKQEAgLTQxNiw3ICs0MDksOCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KLQkJciA9IGxpc3RfZW50cnkocngtPnRvX2hvc3RfbGlzdC5uZXh0LCBzdHJ1Y3QgdXNiX3J4LCB0b19ob3N0X2xpc3QpOworCQlyID0gbGlzdF9lbnRyeShyeC0+dG9faG9zdF9saXN0Lm5leHQsCisJCQlzdHJ1Y3QgdXNiX3J4LCB0b19ob3N0X2xpc3QpOwogCQlsaXN0X2RlbCgmci0+dG9faG9zdF9saXN0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCkBAIC00NjMsNyArNDU3LDggQEAKIAlzdHJ1Y3QgdXNiX3J4CSpyX3JlbW92ZSwgKnJfcmVtb3ZlX25leHQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPnN1Ym1pdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfcmVtb3ZlLCByX3JlbW92ZV9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9yZW1vdmUsCisJCQlyX3JlbW92ZV9uZXh0LCAmcngtPnJ4X3N1Ym1pdF9saXN0LCByeF9zdWJtaXRfbGlzdCkKIAl7CiAJCWlmIChyID09IHJfcmVtb3ZlKSB7CiAJCQlsaXN0X2RlbCgmci0+cnhfc3VibWl0X2xpc3QpOwpAQCAtNTAwLDcgKzQ5NSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2RtX3VzYl9yZWN2KHZvaWQgKnByaXZfZGV2LAotCQkJaW50ICgqY2IpKHZvaWQgKmNiX2RhdGEsIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKKwkJCWludCAoKmNiKSh2b2lkICpjYl9kYXRhLAorCQkJCXZvaWQgKmRhdGEsIGludCBsZW4sIGludCBjb250ZXh0KSwKIAkJCXZvaWQgKmNiX2RhdGEsCiAJCQlpbnQgY29udGV4dCkKIHsKQEAgLTY1NCw3ICs2NTAsOCBAQAogCiBzdGF0aWMgdm9pZCBkb190eChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGx0ZV91ZGV2ICp1ZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsdGVfdWRldiwgd29ya190eC53b3JrKTsKKwlzdHJ1Y3QgbHRlX3VkZXYgKnVkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGx0ZV91ZGV2LCB3b3JrX3R4LndvcmspOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSB1ZGV2LT51c2JkZXY7CiAJc3RydWN0IHR4X2N4dCAqdHggPSAmdWRldi0+dHg7CiAJc3RydWN0IHVzYl90eCAqdCA9IE5VTEw7CkBAIC04MTMsNyArODEwLDggQEAKIAlyZXR1cm4gJnVkZXYtPmdkbV9lZDsKIH0KIAotc3RhdGljIGludCBnZG1fdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IGdkbV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBwaHlfZGV2ICpwaHlfZGV2ID0gTlVMTDsKQEAgLTg2MSw3ICs4NTksOSBAQAogCXVzYl9lbmFibGVfYXV0b3N1c3BlbmQodXNiZGV2KTsKIAlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheSgmdXNiZGV2LT5kZXYsIEFVVE9fU1VTUEVORF9USU1FUik7CiAKLQkvKiBMaXN0IHVwIGhvc3RzIHdpdGggYmlnIGVuZGlhbnMsIG90aGVyd2lzZSwgZGVmYXVsdHMgdG8gbGl0dGxlIGVuZGlhbiAqLworCS8qIExpc3QgdXAgaG9zdHMgd2l0aCBiaWcgZW5kaWFucywgb3RoZXJ3aXNlLAorCSAqIGRlZmF1bHRzIHRvIGxpdHRsZSBlbmRpYW4KKwkgKi8KIAlpZiAoaWRQcm9kdWN0ID09IFBJRF9HRE03MjQzKQogCQlnZG1fc2V0X2VuZGlhbigmdWRldi0+Z2RtX2VkLCBFTkRJQU5ORVNTX0JJRyk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvbmV0bGlua19rLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYwppbmRleCA3N2ZjNjRlLi41ZGRkMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYwpAQCAtMzIsNyArMzIsOCBAQAogI2RlZmluZSBORF9NQVhfR1JPVVAJCTMwCiAjZGVmaW5lIE5EX0lGSU5ERVhfTEVOCQlzaXplb2YoaW50KQogI2RlZmluZSBORF9OTE1TR19TUEFDRShsZW4pCShOTE1TR19TUEFDRShsZW4pICsgTkRfSUZJTkRFWF9MRU4pCi0jZGVmaW5lIE5EX05MTVNHX0RBVEEobmxoKQkoKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKG5saCkgKyBORF9JRklOREVYX0xFTikpCisjZGVmaW5lIE5EX05MTVNHX0RBVEEobmxoKQkoKHZvaWQgKikoKGNoYXIgKilOTE1TR19EQVRBKG5saCkgKyBcCisJCQkJCQkgIE5EX0lGSU5ERVhfTEVOKSkKICNkZWZpbmUgTkRfTkxNU0dfU19MRU4obGVuKQkobGVuK05EX0lGSU5ERVhfTEVOKQogI2RlZmluZSBORF9OTE1TR19SX0xFTihubGgpCShubGgtPm5sbXNnX2xlbi1ORF9JRklOREVYX0xFTikKICNkZWZpbmUgTkRfTkxNU0dfSUZJRFgobmxoKQlOTE1TR19EQVRBKG5saCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9UT0RPCmluZGV4IDMwYWMwMWEuLjVhYjI3ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvVE9ETwpAQCAtMSw1ICsxLDMgQEAKIFRPRE86CiAtIFJlcGxhY2Uga2VybmVsX3RocmVhZCB3aXRoIGt0aHJlYWQgaW4gZ2RtX3VzYi5jCi0tIFJlcGxhY2UgaGFyZC1jb2RlZCBmaXJtd2FyZSBwYXRocyB3aXRoIHJlcXVlc3RfZmlybXdhcmUgaW4KLSAgc2Rpb19ib290LmMgYW5kIHVzYl9ib290LmMKIC0gQ2xlYW4gdXAgY29kaW5nIHN0eWxlIHRvIG1lZXQga2VybmVsIHN0YW5kYXJkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9zZGlvLmMKaW5kZXggMDQ3YTRkNy4uYzI0NjUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fc2Rpby5jCkBAIC0zOCwyNiArMzgsOSBAQAogI2RlZmluZSBUWF9IWgkyMDAwCiAjZGVmaW5lIFRYX0lOVEVSVkFMCSgxMDAwMDAwL1RYX0haKQogCi0vKiNkZWZpbmUgREVCVUcqLwotCiBzdGF0aWMgaW50IGluaXRfc2RpbyhzdHJ1Y3Qgc2Rpb3dtX2RldiAqc2Rldik7CiBzdGF0aWMgdm9pZCByZWxlYXNlX3NkaW8oc3RydWN0IHNkaW93bV9kZXYgKnNkZXYpOwogCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIGhleGR1bXAoY2hhciAqdGl0bGUsIHU4ICpkYXRhLCBpbnQgbGVuKQotewotCWludCBpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsZW5ndGggPSAlZFxuIiwgdGl0bGUsIGxlbik7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsIGRhdGFbaV0pOwotCQlpZiAoKGkgJiAweGYpID09IDB4ZikKLQkJCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHNkaW9fdHggKmFsbG9jX3R4X3N0cnVjdChzdHJ1Y3QgdHhfY3h0ICp0eCkKIHsKIAlzdHJ1Y3Qgc2Rpb190eCAqdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0FUT01JQyk7CkBAIC0yOTcsMTAgKzI4MCw5IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eC0+bG9jaywgZmxhZ3MpOwogCi0jaWZkZWYgREVCVUcKLQloZXhkdW1wKCJzZGlvX3NlbmQiLCB0eC0+c2R1X2J1ZiArIFRZUEVfQV9IRUFERVJfU0laRSwKLQkJYWdncl9sZW4gLSBUWVBFX0FfSEVBREVSX1NJWkUpOwotI2VuZGlmCisJcHJpbnRfaGV4X2R1bXBfZGVidWcoInNkaW9fc2VuZDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkgICAgIHR4LT5zZHVfYnVmICsgVFlQRV9BX0hFQURFUl9TSVpFLAorCQkJICAgICBhZ2dyX2xlbiAtIFRZUEVfQV9IRUFERVJfU0laRSwgZmFsc2UpOwogCiAJZm9yIChwb3MgPSBUWVBFX0FfSEVBREVSX1NJWkU7IHBvcyA8IGFnZ3JfbGVuOyBwb3MgKz0gVFhfQ0hVTktfU0laRSkgewogCQlsZW4gPSBhZ2dyX2xlbiAtIHBvczsKQEAgLTMzNSwxMCArMzE3LDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQloZXhkdW1wKCJzZGlvX3NlbmQiLCB0LT5idWYgKyBUWVBFX0FfSEVBREVSX1NJWkUsCi0JCXQtPmxlbiAtIFRZUEVfQV9IRUFERVJfU0laRSk7Ci0jZW5kaWYKKwlwcmludF9oZXhfZHVtcF9kZWJ1Zygic2Rpb19zZW5kOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJCSAgICAgdC0+YnVmICsgVFlQRV9BX0hFQURFUl9TSVpFLAorCQkJICAgICB0LT5sZW4gLSBUWVBFX0FfSEVBREVSX1NJWkUsIGZhbHNlKTsKIAlzZW5kX3NkaW9fcGt0KGZ1bmMsIHQtPmJ1ZiwgdC0+bGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0eC0+bG9jaywgZmxhZ3MpOwpAQCAtNDc0LDE0ICs0NTUsMTAgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoaGNpX2RhdGFbNF0gPT0gMCkgewotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJXSU1BWCA9PT4gU1RPUCBTRFUgVFhcbiIpOwotI2VuZGlmCisJCWRldl9kYmcoJnNkZXYtPmZ1bmMtPmRldiwgIldJTUFYID09PiBTVE9QIFNEVSBUWFxuIik7CiAJCXR4LT5zdG9wX3NkdV90eCA9IDE7CiAJfSBlbHNlIGlmIChoY2lfZGF0YVs0XSA9PSAxKSB7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIldJTUFYID09PiBTVEFSVCBTRFUgVFhcbiIpOwotI2VuZGlmCisJCWRldl9kYmcoJnNkZXYtPmZ1bmMtPmRldiwgIldJTUFYID09PiBTVEFSVCBTRFUgVFhcbiIpOwogCQl0eC0+c3RvcF9zZHVfdHggPSAwOwogCQlpZiAodHgtPmNhbl9zZW5kKQogCQkJc2NoZWR1bGVfd29yaygmc2Rldi0+d3MpOwpAQCAtNTMyLDE4ICs1MDksMTQgQEAKIAl9CiAKIAlpZiAoaGRyWzNdID09IDEpIHsJLyogQWNrICovCi0jaWZkZWYgREVCVUcKIAkJdTMyICphY2tfc2VxID0gKHUzMiAqKSZoZHJbNF07Ci0jZW5kaWYKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnR4LT5sb2NrLCBmbGFncyk7CiAJCXR4LT5jYW5fc2VuZCA9IDE7CiAKIAkJaWYgKCFsaXN0X2VtcHR5KCZ0eC0+c2R1X2xpc3QpIHx8ICFsaXN0X2VtcHR5KCZ0eC0+aGNpX2xpc3QpKQogCQkJc2NoZWR1bGVfd29yaygmc2Rldi0+d3MpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eC0+bG9jaywgZmxhZ3MpOwotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJBY2suLi4gJTB4XG4iLCBudG9obCgqYWNrX3NlcSkpOwotI2VuZGlmCisJCWRldl9kYmcoJmZ1bmMtPmRldiwgIkFjay4uLiAlMHhcbiIsIG50b2hsKCphY2tfc2VxKSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTU3OSw5ICs1NTIsOCBAQAogCX0KIAogZW5kX2lvOgotI2lmZGVmIERFQlVHCi0JaGV4ZHVtcCgic2Rpb19yZWNlaXZlIiwgcngtPnJ4X2J1ZiwgbGVuKTsKLSNlbmRpZgorCXByaW50X2hleF9kdW1wX2RlYnVnKCJzZGlvX3JlY2VpdmU6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkJICAgICByeC0+cnhfYnVmLCBsZW4sIGZhbHNlKTsKIAlsZW4gPSBjb250cm9sX3NkdV90eF9mbG93KHNkZXYsIHJ4LT5yeF9idWYsIGxlbik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcngtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV91c2IuYwppbmRleCBjZGVmZmU3Li4yMDUzOWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3VzYi5jCkBAIC01NSwyMiArNTUsNiBAQAogc3RhdGljIGludCBpbml0X3VzYihzdHJ1Y3QgdXNid21fZGV2ICp1ZGV2KTsKIHN0YXRpYyB2b2lkIHJlbGVhc2VfdXNiKHN0cnVjdCB1c2J3bV9kZXYgKnVkZXYpOwogCi0vKiNkZWZpbmUgREVCVUcgKi8KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgaGV4ZHVtcChjaGFyICp0aXRsZSwgdTggKmRhdGEsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxlbmd0aCA9ICVkXG4iLCB0aXRsZSwgbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggIiwgZGF0YVtpXSk7Ci0JCWlmICgoaSAmIDB4ZikgPT0gMHhmKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgdXNiX3R4ICphbGxvY190eF9zdHJ1Y3Qoc3RydWN0IHR4X2N4dCAqdHgpCiB7CiAJc3RydWN0IHVzYl90eCAqdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0FUT01JQyk7CkBAIC0zNjgsOSArMzUyLDggQEAKIAkJCWdkbV91c2Jfc2VuZF9jb21wbGV0ZSwKIAkJCXQpOwogCi0jaWZkZWYgREVCVUcKLQloZXhkdW1wKCJ1c2Jfc2VuZCIsIHQtPmJ1ZiwgbGVuICsgcGFkZGluZyk7Ci0jZW5kaWYKKwlwcmludF9oZXhfZHVtcF9kZWJ1ZygidXNiX3NlbmQ6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkJICAgICB0LT5idWYsIGxlbiArIHBhZGRpbmcsIGZhbHNlKTsKICNpZmRlZiBDT05GSUdfV0lNQVhfR0RNNzJYWF9VU0JfUE0KIAlpZiAodXNiZGV2LT5zdGF0ZSAmIFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKIAkJbGlzdF9hZGRfdGFpbCgmdC0+cF9saXN0LCAmdHgtPnBlbmRpbmdfbGlzdCk7CkBAIC00MzgsMTAgKzQyMSw3IEBACiAJc3RydWN0IHVzYl90eCAqdDsKIAl1MTYgY21kX2V2dDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczI7Ci0KLSNpZmRlZiBDT05GSUdfV0lNQVhfR0RNNzJYWF9VU0JfUE0KIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gdXJiLT5kZXY7Ci0jZW5kaWYKIAogCS8qIENvbXBsZXRpb24gYnkgdXNiX3VubGlua191cmIgKi8KIAlpZiAodXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpCkBAIC00NTEsMjAgKzQzMSwxNSBAQAogCiAJaWYgKCF1cmItPnN0YXR1cykgewogCQljbWRfZXZ0ID0gKHItPmJ1ZlswXSA8PCA4KSB8IChyLT5idWZbMV0pOwotI2lmZGVmIERFQlVHCi0JCWhleGR1bXAoInVzYl9yZWNlaXZlIiwgci0+YnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotI2VuZGlmCisJCXByaW50X2hleF9kdW1wX2RlYnVnKCJ1c2JfcmVjZWl2ZTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkJICAgICByLT5idWYsIHVyYi0+YWN0dWFsX2xlbmd0aCwgZmFsc2UpOwogCQlpZiAoY21kX2V2dCA9PSBXSU1BWF9TRFVfVFhfRkxPVykgewogCQkJaWYgKHItPmJ1Zls0XSA9PSAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiV0lNQVggPT0+IFNUT1AgU0RVIFRYXG4iKTsKLSNlbmRpZgorCQkJCWRldl9kYmcoJmRldi0+ZGV2LCAiV0lNQVggPT0+IFNUT1AgU0RVIFRYXG4iKTsKIAkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ0eC0+c2R1X2xpc3QsIGxpc3QpCiAJCQkJCXVzYl91bmxpbmtfdXJiKHQtPnVyYik7CiAJCQl9IGVsc2UgaWYgKHItPmJ1Zls0XSA9PSAxKSB7Ci0jaWZkZWYgREVCVUcKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiV0lNQVggPT0+IFNUQVJUIFNEVSBUWFxuIik7Ci0jZW5kaWYKKwkJCQlkZXZfZGJnKCZkZXYtPmRldiwgIldJTUFYID09PiBTVEFSVCBTRFUgVFhcbiIpOwogCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnR4LT5zZHVfbGlzdCwgbGlzdCkgewogCQkJCQl1c2Jfc3VibWl0X3VyYih0LT51cmIsIEdGUF9BVE9NSUMpOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKaW5kZXggZGQ4NTQ5Ny4uMDVjZTJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKQEAgLTYyLDIxICs2Miw2IEBACiBzdGF0aWMgdm9pZCBnZG1fd2ltYXhfaW5kX2ZzbV91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZzbV9zICpmc20pOwogc3RhdGljIHZvaWQgZ2RtX3dpbWF4X2luZF9pZl91cGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlmX3VwKTsKIAotI2lmIGRlZmluZWQoREVCVUdfU0RVKQotc3RhdGljIHZvaWQgcHJpbnRrX2hleCh1OCAqYnVmLCB1MzIgc2l6ZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJaWYgKGkgJiYgaSAlIDE2ID09IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiXG4lMDJ4ICIsICpidWYrKyk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsICpidWYrKyk7Ci0JfQotCi0JcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci19Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfcHJvdG9jb2xfbmFtZSh1MTYgcHJvdG9jb2wpCiB7CiAJc3RhdGljIGNoYXIgYnVmWzMyXTsKQEAgLTE0MCw3ICsxMjUsOCBAQAogCXJldHVybiBidWY7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBfZXRoX3BhY2tldChjb25zdCBjaGFyICp0aXRsZSwgdTggKmRhdGEsIGludCBsZW4pCitzdGF0aWMgdm9pZCBkdW1wX2V0aF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdGl0bGUsCisJCQkgICAgdTggKmRhdGEsIGludCBsZW4pCiB7CiAJc3RydWN0IGlwaGRyICppaCA9IE5VTEw7CiAJc3RydWN0IHVkcGhkciAqdWggPSBOVUxMOwpAQCAtMTYyLDQ4ICsxNDgsMjEgQEAKIAkJcG9ydCA9IG50b2hzKHVoLT5kZXN0KTsKIAl9CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiWyVzXSBsZW49JWQsICVzLCAlcywgJXNcbiIsCisJbmV0ZGV2X2RiZyhkZXYsICJbJXNdIGxlbj0lZCwgJXMsICVzLCAlc1xuIiwKIAkJdGl0bGUsIGxlbiwKIAkJZ2V0X3Byb3RvY29sX25hbWUocHJvdG9jb2wpLAogCQlnZXRfaXBfcHJvdG9jb2xfbmFtZShpcF9wcm90b2NvbCksCiAJCWdldF9wb3J0X25hbWUocG9ydCkpOwogCiAJaWYgKCEoZGF0YVswXSA9PSAweGZmICYmIGRhdGFbMV0gPT0gMHhmZikpIHsKLQkJaWYgKHByb3RvY29sID09IEVUSF9QX0lQKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICBzcmM9JXBJNFxuIiwgJmloLT5zYWRkcik7Ci0JCX0gZWxzZSBpZiAocHJvdG9jb2wgPT0gRVRIX1BfSVBWNikgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgc3JjPSVwSTZcbiIsICZpaC0+c2FkZHIpOwotCQl9CisJCWlmIChwcm90b2NvbCA9PSBFVEhfUF9JUCkKKwkJCW5ldGRldl9kYmcoZGV2LCAiICAgICBzcmM9JXBJNFxuIiwgJmloLT5zYWRkcik7CisJCWVsc2UgaWYgKHByb3RvY29sID09IEVUSF9QX0lQVjYpCisJCQluZXRkZXZfZGJnKGRldiwgIiAgICAgc3JjPSVwSTZcbiIsICZpaC0+c2FkZHIpOwogCX0KIAotCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9BTEwpCi0JcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCSNlbHNlCi0JCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9BUlApCi0JCWlmIChwcm90b2NvbCA9PSBFVEhfUF9BUlApCi0JCQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JCSNlbmRpZgotCQkjaWYgKERVTVBfUEFDS0VUICYgRFVNUF9TRFVfSVApCi0JCWlmIChwcm90b2NvbCA9PSBFVEhfUF9JUCB8fCBwcm90b2NvbCA9PSBFVEhfUF9JUFY2KQotCQkJcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCQkjZWxzZQotCQkJI2lmIChEVU1QX1BBQ0tFVCAmIERVTVBfU0RVX0lQX1RDUCkKLQkJCWlmIChpcF9wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKLQkJCQlwcmludGtfaGV4KGRhdGEsIGxlbik7Ci0JCQkjZW5kaWYKLQkJCSNpZiAoRFVNUF9QQUNLRVQgJiBEVU1QX1NEVV9JUF9VRFApCi0JCQlpZiAoaXBfcHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCi0JCQkJcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCQkJI2VuZGlmCi0JCQkjaWYgKERVTVBfUEFDS0VUICYgRFVNUF9TRFVfSVBfSUNNUCkKLQkJCWlmIChpcF9wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApCi0JCQkJcHJpbnRrX2hleChkYXRhLCBsZW4pOwotCQkJI2VuZGlmCi0JCSNlbmRpZgotCSNlbmRpZgorCXByaW50X2hleF9kdW1wX2RlYnVnKCIiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZGF0YSwgbGVuLCBmYWxzZSk7CiB9Ci0jZW5kaWYKLQogCiBzdGF0aWMgaW5saW5lIGludCBnZG1fd2ltYXhfaGVhZGVyKHN0cnVjdCBza19idWZmICoqcHNrYikKIHsKQEAgLTIzNywxMiArMTk2LDEwIEBACiB7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCSNpZiBkZWZpbmVkKERFQlVHX0hDSSkKIAl1OCAqYnVmID0gKHU4ICopIG1zZzsKIAl1MTYgaGNpX2NtZCA9ICAoYnVmWzBdPDw4KSB8IGJ1ZlsxXTsKIAl1MTYgaGNpX2xlbiA9IChidWZbMl08PDgpIHwgYnVmWzNdOwotCXByaW50ayhLRVJOX0RFQlVHICJIPT5EOiAweCUwNHgoJWQpXG4iLCBoY2lfY21kLCBoY2lfbGVuKTsKLQkjZW5kaWYKKwluZXRkZXZfZGJnKGRldiwgIkg9PkQ6IDB4JTA0eCglZClcbiIsIGhjaV9jbWQsIGhjaV9sZW4pOwogCiAJZ2RtX3dpbWF4X3NlbmQobmljLCBtc2csIGxlbik7CiB9CkBAIC0zNTEsMTEgKzMwOCw5IEBACiAJc3RydWN0IGV2dF9lbnRyeSAqZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JI2lmIGRlZmluZWQoREVCVUdfSENJKQogCXUxNiBoY2lfY21kID0gICgodTgpYnVmWzBdPDw4KSB8ICh1OClidWZbMV07CiAJdTE2IGhjaV9sZW4gPSAoKHU4KWJ1ZlsyXTw8OCkgfCAodTgpYnVmWzNdOwotCXByaW50ayhLRVJOX0RFQlVHICJEPT5IOiAweCUwNHgoJWQpXG4iLCBoY2lfY21kLCBoY2lfbGVuKTsKLQkjZW5kaWYKKwluZXRkZXZfZGJnKGRldiwgIkQ9Pkg6IDB4JTA0eCglZClcbiIsIGhjaV9jbWQsIGhjaV9sZW4pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndtX2V2ZW50LmV2dF9sb2NrLCBmbGFncyk7CiAKQEAgLTQxNSw5ICszNzAsNyBAQAogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGZzbV9zICpmc20gPSAoc3RydWN0IGZzbV9zICopIG5pYy0+c2RrX2RhdGFbU0lPQ19EQVRBX0ZTTV0uYnVmOwogCi0JI2lmIGRlZmluZWQoREVCVUdfU0RVKQotCWR1bXBfZXRoX3BhY2tldCgiVFgiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkjZW5kaWYKKwlkdW1wX2V0aF9wYWNrZXQoZGV2LCAiVFgiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAogCXJldCA9IGdkbV93aW1heF9oZWFkZXIoJnNrYik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTU0MCw3ICs0OTMsNyBAQAogCWlmIChzcmMtPnNpemUpIHsKIAkJaWYgKCFkc3QtPmJ1ZikKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoY29weV90b191c2VyKGRzdC0+YnVmLCBzcmMtPmJ1Ziwgc2l6ZSkpCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopZHN0LT5idWYsIHNyYy0+YnVmLCBzaXplKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAlyZXR1cm4gMDsKQEAgLTU2Myw3ICs1MTYsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKGNvcHlfZnJvbV91c2VyKGRzdC0+YnVmLCBzcmMtPmJ1Ziwgc3JjLT5zaXplKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcihkc3QtPmJ1ZiwgKHZvaWQgX191c2VyICopc3JjLT5idWYsIHNyYy0+c2l6ZSkpIHsKIAkJa2RlbGV0ZSgmZHN0LT5idWYpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC03NTYsOSArNzA5LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByZXQ7CiAKLQkjaWYgZGVmaW5lZChERUJVR19TRFUpCi0JZHVtcF9ldGhfcGFja2V0KCJSWCIsIGJ1ZiwgbGVuKTsKLQkjZW5kaWYKKwlkdW1wX2V0aF9wYWNrZXQoZGV2LCAiUlgiLCBidWYsIGxlbik7CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOwogCWlmICghc2tiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguaCBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5oCmluZGV4IDZlYzBhYjQuLjFmY2ZjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5oCkBAIC02MiwyNiArNjIsNiBAQAogCiB9OwogCi0KLSNpZiAwCi0jZGVmaW5lIGRwcmludGsoZm10LCBhcmdzIC4uLikJcHJpbnRrKEtFUk5fREVCVUcgIiBbR0RNXSAiIGZtdCwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIGRwcmludGsoLi4uKQotI2VuZGlmCi0KLS8qI2RlZmluZSBERUJVR19TRFUgKi8KLSNpZiBkZWZpbmVkKERFQlVHX1NEVSkKLSNkZWZpbmUgRFVNUF9TRFVfQUxMCQkoMTw8MCkKLSNkZWZpbmUgRFVNUF9TRFVfQVJQCQkoMTw8MSkKLSNkZWZpbmUgRFVNUF9TRFVfSVAJCQkoMTw8MikKLSNkZWZpbmUgRFVNUF9TRFVfSVBfVENQCQkoMTw8OCkKLSNkZWZpbmUgRFVNUF9TRFVfSVBfVURQCQkoMTw8OSkKLSNkZWZpbmUgRFVNUF9TRFVfSVBfSUNNUAkoMTw8MTApCi0jZGVmaW5lIERVTVBfUEFDS0VUCQkJKERVTVBfU0RVX0FMTCkKLSNlbmRpZgotCi0vKiNkZWZpbmUgREVCVUdfSENJICovCi0KIC8qI2RlZmluZSBMT09QQkFDS19URVNUICovCiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfd2ltYXhfZGV2aWNlKHN0cnVjdCBwaHlfZGV2ICpwaHlfZGV2LCBzdHJ1Y3QgZGV2aWNlICpwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwNjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9LY29uZmlnCkBAIC0wLDAgKzEsOCBAQAorIworIyAieGlsaW54IEZQR0EgZmlybXdhcmUgZG93bmxvYWQsIGZwZ2Fib290IgorIworY29uZmlnIEdTX0ZQR0FCT09UCisJdHJpc3RhdGUgIlhpbGlueCBGUEdBIGZpcm13YXJlIGRvd25sb2FkIG1vZHVsZSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBYaWxpbnggRlBHQSBmaXJtd2FyZSBkb3dubG9hZCBtb2R1bGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNiNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorZ3NfZnBnYS15CSs9IGdzX2ZwZ2Fib290Lm8gaW8ubworb2JqLSQoQ09ORklHX0dTX0ZQR0FCT09UKQkrPSBnc19mcGdhLm8KKworY2NmbGFncy0kKENPTkZJR19HU19GUEdBX0RFQlVHKQk6PSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE4NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1JFQURNRQpAQCAtMCwwICsxLDcxIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xpbnV4IERyaXZlciBTb3VyY2UgZm9yIFhpbGlueCBGUEdBIGZpcm13YXJlIGRvd25sb2FkCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitUQUJMRSBPRiBDT05URU5UUy4KKworMS4gIFNVTU1BUlkKKzIuICBCQUNLR1JPVU5ECiszLiAgREVTSUdOCis0LiAgSE9XIFRPIFVTRQorNS4gIFJFRkVSRU5DRQorCisxLiBTVU1NQVJZCisKKwktIERvd25sb2FkIFhpbGlueCBGUEdBIGZpcm13YXJlCisJLSBUaGlzIG1vZHVsZSBkb3dubG9hZHMgWGlsaW54IEZQR0EgZmlybXdhcmUgdXNpbmcgZ3BpbyBwaW5zLgorCisyLiBCQUNLR1JPVU5ECisKKwlBbiBGUEdBIChGaWVsZCBQcm9ncmFtbWFibGUgR2F0ZSBBcnJheSkgaXMgYSBwcm9ncmFtbWFibGUgaGFyZHdhcmUgdGhhdCBpcworCXVzZWQgaW4gdmFyaW91cyBhcHBsaWNhdGlvbnMuIEhhcmR3YXJlIGRlc2lnbiBuZWVkcyB0byBwcm9ncmFtbWVkIHRocm91Z2gKKwlhIGRlZGljYXRlZCBkZXZpY2Ugb3IgQ1BVIGFzc2lzdGVkIHdheSAoc2VyaWFsIG9yIHBhcmFsbGVsKS4KKwlUaGlzIGRyaXZlciBwcm92aWRlcyBhIHdheSB0byBkb3dubG9hZCBGUEdBIGZpcm13YXJlLgorCiszLiBERVNJR04KKworCS0gbG9hZCBYaWxpbnggRlBHQSBiaXRzdHJlYW0gZm9ybWF0WzFdIGZpcm13YXJlIGltYWdlIGZpbGUgdXNpbmcgCisJICBrZXJuZWwgZmlybXdhcmUgZnJhbWV3b3JrLCByZXF1ZXN0X2Zpcm13YXJlKCkKKwktIHByb2dyYW0gdGhlIFhpbGlueCBGUEdBIHVzaW5nIFNlbGVjdE1BUCAocGFyYWxsZWwpIG1vZGUgWzJdCisJLSBGUEdBIHByZ3JhbSBpcyBkb25lIGJ5IGdwaW8gYmFzZWQgYml0LWJhbmdpbmcsIGFzIGFuIGV4YW1wbGUKKwktIHBsYXRmb3JtIGluZGVwZW5kZW50IGZpbGU6IGdzX2ZwZ2Fib290LmMKKwktIHBsYXRmb3JtIGRlcGVuZGVudCBmaWxlOiBpby5jCisJCisKKzQuIEhPVyBUTyBVU0UKKworCSQgaW5zbW9kIGdzX2ZwZ2Eua28gZmlsZT0ieGxpbnhfZnBnYV90b3BfYml0c3RyZWFtLmJpdCIKKwkkIHJtbW9kIGdzX2ZwZ2EKKworNS4gVVNFIENBU0UgKGZyb20gYSBtYWlsaW5nIGxpc3QgZGlzY3Vzc2lvbiB3aXRoIEdyZWcpCisKKwlhLiBBcyBhIEZQR0EgZGV2ZWxvcG1lbnQgc3VwcG9ydCB0b29sLAorCUR1cmluZyBGUEdBIGZpcm13YXJlIGRldmVsb3BtZW50LCB5b3UgbmVlZCB0byBkb3dubG9hZCBhIG5ldyBGUEdBCisJaW1hZ2UgZnJlcXVlbnRseS4KKwlZb3Ugd291bGQgZG8gdGhhdCB3aXRoIGEgZGVkaWNhdGVkIEpUQUcsIHdoaWNoIHVzdWFsbHkgYSBsaW1pdGVkCisJcmVzb3VyY2UgaW4gdGhlIGxhYi4KKwlIb3dldmVyLCBpZiB5b3UgdXNlIG15IGRyaXZlciwgeW91IGRvbid0IGhhdmUgdG8gaGF2ZSBhIGRlZGljYXRlZCBKVEFHLgorCVRoaXMgaXMgYSByZWFsIGdhaW4gOikKKworCWIuIEZvciB0aGUgRlBHQSB0aGF0IHJ1bnMgd2l0aG91dCBjb25maWcgYWZ0ZXIgdGhlIGRvd25sb2FkLCB3aGljaAorCWRvZXNuJ3QgdGFsayB0byBhbnkgb2YgTGludXggaW50ZXJmYWNlcyAoc3VjaCBhcyBQQ0lFKS4KKworCVdlIGRvd25sb2FkIEZQR0EgZmlybXdhcmUgZnJvbSB1c2VyIHRyaWdnZXJlZCBvciBzb21lIG90aGVyIHdheSwgYW5kIHRoYXQncyBpdC4KKwlTaW5jZSB0aGF0IEZQR0EgcnVucyBvbiBpdHMgb3duLCBpdCBkb2Vzbid0IHJlcXVpcmUgYSBsaW51eCBkcml2ZXIKKwlhZnRlciB0aGUgZG93bmxvYWQuCisKKwljLiBGb3IgdGhlIEZQR0EgdGhhdCByZXF1aXJlcyBjb25maWcgYWZ0ZXIgdGhlIGRvd25sb2FkLCB3aGljaCB0YWxrIHRvCisJYW55IG9mIGxpbnV4IGludGVyZmFjZXMgKHN1Y2ggYXMgUENJRSkKKworCVRoZW4sIHRoaXMgdHlwZSBvZiBGUEdBIGNvbmZpZyBjYW4gYmUgcHV0IGludG8gZGV2aWNlIHRyZWUgYW5kIGhhdmUgYQorCXNlcGFyYXRlIGRyaXZlciAocGNpZSBvciBvdGhlcnMpLCB0aGVuIFRIQVQgZHJpdmVyIGNhbGxzIG15IGRyaXZlciB0bworCWRvd25sb2FkIEZQR0EgZmlybXdhcmUgZHVyaW5nIHRoZSBMaW51eCBib290LCB0aGUgdGFrZSBvdmVyIHRoZSBkZXZpY2UKKwl0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCisKKzYuIFJFRkVSRU5DRQorCisJMS4gWGlsaW54IEFQUCBOT1RFIFhBUFA1ODM6CisJICBodHRwOi8vd3d3LnhpbGlueC5jb20vc3VwcG9ydC9kb2N1bWVudGF0aW9uL2FwcGxpY2F0aW9uX25vdGVzL3hhcHA1ODMtZnBnYS1jb25maWd1cmF0aW9uLnBkZgorCTIuIGJpdHN0cmVhbSBmaWxlIGluZm86CisJICBodHRwOi8vaG9tZS5lYXJ0aGxpbmsubmV0L35kYXZlc3VsbGlucy9zb2Z0d2FyZS9iaXRpbmZvLmh0bWwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5ZmIxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9UT0RPCkBAIC0wLDAgKzEsNyBAQAorVE9ETzoKKwktIGdldCBidXMgd2lkdGggaW5wdXQgaW5zdGVhZCBvZiBoYXJkY29kZWQgYnVzIHdpZHRoCisJLSBnZXQgaXQgcmV2aWV3ZWQKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgZm9yIHRoaXMgZHJpdmVyIHRvIEluc29wIFNvbmc8aW5zb3Auc29uZ0BnYWluc3BlZWQuY29tPgorYW5kIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+LgorQW5kIHBsZWFzZSBDQyB0byAiU3RhZ2luZyBzdWJzeXN0ZW0iIG1haWwgbGlzdCA8ZGV2ZWxAZHJpdmVyZGV2Lm9zdW9zbC5vcmc+IHRvby4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYzg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jCkBAIC0wLDAgKzEsNDIyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImdzX2ZwZ2Fib290LmgiCisjaW5jbHVkZSAiaW8uaCIKKworI2RlZmluZSBERVZJQ0VfTkFNRSAiZGV2aWNlIgorI2RlZmluZSBDTEFTU19OQU1FICAiZnBnYWJvb3QiCisKK3N0YXRpYyB1aW50OF90IGJpdHNfbWFnaWNbXSA9IHsKKwkweDAsIDB4OSwgMHhmLCAweGYwLCAweGYsIDB4ZjAsCisJMHhmLCAweGYwLCAweGYsIDB4ZjAsIDB4MCwgMHgwLCAweDF9OworCisvKiBmYWtlIGRldmljZSBmb3IgcmVxdWVzdF9maXJtd2FyZSAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKmZpcm13YXJlX3BkZXY7CisKK3N0YXRpYyBjaGFyCSpmaWxlID0gInhsaW54X2ZwZ2FfZmlybXdhcmUuYml0IjsKK21vZHVsZV9wYXJhbShmaWxlLCBjaGFycCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGZpbGUsICJYaWxpbnggRlBHQSBmaXJtd2FyZSBmaWxlLiIpOworCisjaWZkZWYgREVCVUdfRlBHQQorc3RhdGljIHZvaWQgZGF0YWR1bXAoY2hhciAqbXNnLCB2b2lkICptLCBpbnQgbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpjOworCisJcHJfaW5mbygiPT09ICVzID09PVxuIiwgbXNnKTsKKworCWMgPSBtOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAoKGkmMHhmKSA9PSAwKQorCQkJcHJfaW5mbyhLRVJOX0lORk8gIlxuICAweCU0eDogIiwgaSk7CisKKwkJcHJfaW5mbygiJTAyWCAiLCBjW2ldKTsKKwl9CisKKwlwcl9pbmZvKCJcbiIpOworfQorI2VuZGlmIC8qIERFQlVHX0ZQR0EgKi8KKworc3RhdGljIHZvaWQgcmVhZF9iaXRzdHJlYW0oY2hhciAqYml0ZGF0YSwgY2hhciAqYnVmLCBpbnQgKm9mZnNldCwgaW50IHJkc2l6ZSkKK3sKKwltZW1jcHkoYnVmLCBiaXRkYXRhICsgKm9mZnNldCwgcmRzaXplKTsKKwkqb2Zmc2V0ICs9IHJkc2l6ZTsKK30KKworc3RhdGljIHZvaWQgcmVhZGluZm9fYml0c3RyZWFtKGNoYXIgKmJpdGRhdGEsIGNoYXIgKmJ1ZiwgaW50ICpvZmZzZXQpCit7CisJY2hhciB0YnVmWzY0XTsKKwlpbnQzMl90IGxlbjsKKworCS8qIHJlYWQgc2VjdGlvbiBjaGFyICovCisJcmVhZF9iaXRzdHJlYW0oYml0ZGF0YSwgdGJ1Ziwgb2Zmc2V0LCAxKTsKKworCS8qIHJlYWQgbGVuZ3RoICovCisJcmVhZF9iaXRzdHJlYW0oYml0ZGF0YSwgdGJ1Ziwgb2Zmc2V0LCAyKTsKKworCWxlbiA9IHRidWZbMF0gPDwgOCB8IHRidWZbMV07CisKKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCBidWYsIG9mZnNldCwgbGVuKTsKKwlidWZbbGVuXSA9ICdcMCc7Cit9CisKKy8qCisgKiByZWFkIGJpdGRhdGEgbGVuZ3RoCisgKi8KK3N0YXRpYyBpbnQgcmVhZGxlbmd0aF9iaXRzdHJlYW0oY2hhciAqYml0ZGF0YSwgaW50ICpsZW5kYXRhLCBpbnQgKm9mZnNldCkKK3sKKwljaGFyIHRidWZbNjRdOworCisJLyogcmVhZCBzZWN0aW9uIGNoYXIgKi8KKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCB0YnVmLCBvZmZzZXQsIDEpOworCisJLyogbWFrZSBzdXJlIGl0IGlzIHNlY3Rpb24gJ2UnICovCisJaWYgKHRidWZbMF0gIT0gJ2UnKSB7CisJCXByX2VycigiZXJyb3I6IGxlbmd0aCBzZWN0aW9uIGlzIG5vdCAnZScsIGJ1dCAlY1xuIiwgdGJ1ZlswXSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiByZWFkIDRieXRlcyBsZW5ndGggKi8KKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCB0YnVmLCBvZmZzZXQsIDQpOworCisJKmxlbmRhdGEgPSB0YnVmWzBdIDw8IDI0IHwgdGJ1ZlsxXSA8PCAxNiB8CisJCXRidWZbMl0gPDwgOCB8IHRidWZbM107CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcmVhZCBmaXJzdCAxMyBieXRlcyB0byBjaGVjayBiaXRzdHJlYW0gbWFnaWMgbnVtYmVyCisgKi8KK3N0YXRpYyBpbnQgcmVhZG1hZ2ljX2JpdHN0cmVhbShjaGFyICpiaXRkYXRhLCBpbnQgKm9mZnNldCkKK3sKKwljaGFyIGJ1ZlsxM107CisJaW50IHI7CisKKwlyZWFkX2JpdHN0cmVhbShiaXRkYXRhLCBidWYsIG9mZnNldCwgMTMpOworCXIgPSBtZW1jbXAoYnVmLCBiaXRzX21hZ2ljLCAxMyk7CisJaWYgKHIpIHsKKwkJcHJfZXJyKCJlcnJvcjogY29ycnVwdGVkIGhlYWRlciIpOworCQlyZXR1cm4gLTE7CisJfQorCXByX2luZm8oImJpdHN0cmVhbSBmaWxlIG1hZ2ljIG51bWJlciBPa1xuIik7CisKKwkqb2Zmc2V0ID0gMTM7CS8qIG1hZ2ljIGxlbmd0aCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOT1RFOiBzdXBwb3J0cyBvbmx5IGJpdHN0cmVhbSBmb3JtYXQKKyAqLworc3RhdGljIGVudW0gZm10X2ltYWdlIGdldF9pbWFnZWZvcm1hdChzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UpCit7CisJcmV0dXJuIGZfYml0OworfQorCitzdGF0aWMgdm9pZCBnc19wcmludF9oZWFkZXIoc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlKQoreworCXByX2luZm8oImZpbGU6ICVzXG4iLCBmaW1hZ2UtPmZpbGVuYW1lKTsKKwlwcl9pbmZvKCJwYXJ0OiAlc1xuIiwgZmltYWdlLT5wYXJ0KTsKKwlwcl9pbmZvKCJkYXRlOiAlc1xuIiwgZmltYWdlLT5kYXRlKTsKKwlwcl9pbmZvKCJ0aW1lOiAlc1xuIiwgZmltYWdlLT50aW1lKTsKKwlwcl9pbmZvKCJsZW5kYXRhOiAlZFxuIiwgZmltYWdlLT5sZW5kYXRhKTsKK30KKworc3RhdGljIHZvaWQgZ3NfcmVhZF9iaXRzdHJlYW0oc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlKQoreworCWNoYXIgKmJpdGRhdGE7CisJaW50IHNpemU7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IDA7CisJYml0ZGF0YSA9IChjaGFyICopZmltYWdlLT5md19lbnRyeS0+ZGF0YTsKKwlzaXplID0gZmltYWdlLT5md19lbnRyeS0+c2l6ZTsKKworCXJlYWRtYWdpY19iaXRzdHJlYW0oYml0ZGF0YSwgJm9mZnNldCk7CisJcmVhZGluZm9fYml0c3RyZWFtKGJpdGRhdGEsIGZpbWFnZS0+ZmlsZW5hbWUsICZvZmZzZXQpOworCXJlYWRpbmZvX2JpdHN0cmVhbShiaXRkYXRhLCBmaW1hZ2UtPnBhcnQsICZvZmZzZXQpOworCXJlYWRpbmZvX2JpdHN0cmVhbShiaXRkYXRhLCBmaW1hZ2UtPmRhdGUsICZvZmZzZXQpOworCXJlYWRpbmZvX2JpdHN0cmVhbShiaXRkYXRhLCBmaW1hZ2UtPnRpbWUsICZvZmZzZXQpOworCXJlYWRsZW5ndGhfYml0c3RyZWFtKGJpdGRhdGEsICZmaW1hZ2UtPmxlbmRhdGEsICZvZmZzZXQpOworCisJZmltYWdlLT5mcGdhZGF0YSA9IGJpdGRhdGEgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3NfcmVhZF9pbWFnZShzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UpCit7CisJaW50IGltZ19mbXQ7CisKKwlpbWdfZm10ID0gZ2V0X2ltYWdlZm9ybWF0KGZpbWFnZSk7CisKKwlzd2l0Y2ggKGltZ19mbXQpIHsKKwljYXNlIGZfYml0OgorCQlwcl9pbmZvKCJpbWFnZSBpcyBiaXRzdHJlYW0gZm9ybWF0XG4iKTsKKwkJZ3NfcmVhZF9iaXRzdHJlYW0oZmltYWdlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBmcGdhIGltYWdlIGZvcm1hdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlnc19wcmludF9oZWFkZXIoZmltYWdlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzX2xvYWRfaW1hZ2Uoc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlLCBjaGFyICpmaWxlKQoreworCWludCBlcnI7CisKKwlwcl9pbmZvKCJsb2FkIGZwZ2FpbWFnZSAlc1xuIiwgZmlsZSk7CisKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmaW1hZ2UtPmZ3X2VudHJ5LCBmaWxlLCAmZmlybXdhcmVfcGRldi0+ZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJfZXJyKCJmaXJtd2FyZSAlcyBpcyBtaXNzaW5nLCBjYW5ub3QgY29udGludWUuXG4iLCBmaWxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc19kb3dubG9hZF9pbWFnZShzdHJ1Y3QgZnBnYWltYWdlICpmaW1hZ2UsIGVudW0gd2J1cyBidXNfYnl0ZXMpCit7CisJY2hhciAqYml0ZGF0YTsKKwlpbnQgc2l6ZSwgaSwgY250OworCWNudCA9IDA7CisKKwliaXRkYXRhID0gKGNoYXIgKilmaW1hZ2UtPmZwZ2FkYXRhOworCXNpemUgPSBmaW1hZ2UtPmxlbmRhdGE7CisKKyNpZmRlZiBERUJVR19GUEdBCisJZGF0YWR1bXAoImJpdGZpbGUgc2FtcGxlIiwgYml0ZGF0YSwgMHgxMDApOworI2VuZGlmIC8qIERFQlVHX0ZQR0EgKi8KKworCWlmICgheGxfc3VwcG9ydGVkX3Byb2dfYnVzX3dpZHRoKGJ1c19ieXRlcykpIHsKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBwcm9ncmFtIGJ1cyB3aWR0aCAlZFxuIiwKKwkJCQlidXNfYnl0ZXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQnJpbmcgY3NpX2IsIHJkd3JfYiBMb3cgYW5kIHByb2dyYW1fYiBIaWdoICovCisJeGxfcHJvZ3JhbV9iKDEpOworCXhsX3Jkd3JfYigwKTsKKwl4bF9jc2lfYigwKTsKKworCS8qIENvbmZpZ3VyYXRpb24gcmVzZXQgKi8KKwl4bF9wcm9ncmFtX2IoMCk7CisJbXNsZWVwKDIwKTsKKwl4bF9wcm9ncmFtX2IoMSk7CisKKwkvKiBXYWl0IGZvciBEZXZpY2UgSW5pdGlhbGl6YXRpb24gKi8KKwl3aGlsZSAoeGxfZ2V0X2luaXRfYigpID09IDApCisJCTsKKworCXByX2luZm8oImRldmljZSBpbml0IGRvbmVcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gYnVzX2J5dGVzKQorCQl4bF9zaGlmdF9ieXRlc19vdXQoYnVzX2J5dGVzLCBiaXRkYXRhK2kpOworCisJcHJfaW5mbygicHJvZ3JhbSBkb25lXG4iKTsKKworCS8qIENoZWNrIElOSVRfQiAqLworCWlmICh4bF9nZXRfaW5pdF9iKCkgPT0gMCkgeworCQlwcl9lcnIoImluaXRfYiAwXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlICh4bF9nZXRfZG9uZV9iKCkgPT0gMCkgeworCQlpZiAoY250KysgPiBNQVhfV0FJVF9ET05FKSB7CisJCQlwcl9lcnIoImluaXRfQiAlZFxuIiwgeGxfZ2V0X2luaXRfYigpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGNudCA+IE1BWF9XQUlUX0RPTkUpIHsKKwkJcHJfZXJyKCJmcGdhIGRvd25sb2FkIGZhaWxcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJfaW5mbygiZG93bmxvYWQgZnBnYWltYWdlXG4iKTsKKworCS8qIENvbXBlbnNhdGUgZm9yIFNwZWNpYWwgU3RhcnR1cCBDb25kaXRpb25zICovCisJeGxfc2hpZnRfY2Nsayg4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzX3JlbGVhc2VfaW1hZ2Uoc3RydWN0IGZwZ2FpbWFnZSAqZmltYWdlKQoreworCXJlbGVhc2VfZmlybXdhcmUoZmltYWdlLT5md19lbnRyeSk7CisJcHJfaW5mbygicmVsZWFzZSBmcGdhaW1hZ2VcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOT1RFOiBzdXBwb3J0cyBzeXN0ZW1tYXAgcGFyYWxsZWwgcHJvZ3JhbW1pbmcKKyAqLworc3RhdGljIGludCBnc19zZXRfZG93bmxvYWRfbWV0aG9kKHN0cnVjdCBmcGdhaW1hZ2UgKmZpbWFnZSkKK3sKKwlwcl9pbmZvKCJzZXQgcHJvZ3JhbSBtZXRob2RcbiIpOworCisJZmltYWdlLT5kbWV0aG9kID0gbV9zeXN0ZW1tYXA7CisKKwlwcl9pbmZvKCJzeXN0ZW1tYXAgcHJvZ3JhbSBtZXRob2RcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlmaXJtd2FyZV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnBnYWJvb3QiLCAtMSwKKwkJCQkJCQkgTlVMTCwgMCk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhmaXJtd2FyZV9wZGV2KTsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX2RyaXZlcih2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGZpcm13YXJlX3BkZXYpOworfQorCitzdGF0aWMgaW50IGdzX2ZwZ2Fib290KHZvaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnBnYWltYWdlCSpmaW1hZ2U7CisKKwlmaW1hZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBnYWltYWdlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZpbWFnZSA9PSBOVUxMKSB7CisJCXByX2VycigiTm8gbWVtb3J5IGlzIGF2YWlsYWJsZVxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwllcnIgPSBnc19sb2FkX2ltYWdlKGZpbWFnZSwgZmlsZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImdzX2xvYWRfaW1hZ2UgZXJyb3JcbiIpOworCQlnb3RvIGVycl9vdXQxOworCX0KKworCWVyciA9IGdzX3JlYWRfaW1hZ2UoZmltYWdlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiZ3NfcmVhZF9pbWFnZSBlcnJvclxuIik7CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJZXJyID0gZ3Nfc2V0X2Rvd25sb2FkX21ldGhvZChmaW1hZ2UpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJnc19zZXRfZG93bmxvYWRfbWV0aG9kIGVycm9yXG4iKTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisKKwllcnIgPSBnc19kb3dubG9hZF9pbWFnZShmaW1hZ2UsIGJ1c18yYnl0ZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImdzX2Rvd25sb2FkX2ltYWdlIGVycm9yXG4iKTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisKKwllcnIgPSBnc19yZWxlYXNlX2ltYWdlKGZpbWFnZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImdzX3JlbGVhc2VfaW1hZ2UgZXJyb3JcbiIpOworCQlnb3RvIGVycl9vdXQxOworCX0KKworCWtmcmVlKGZpbWFnZSk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQyOgorCWVyciA9IGdzX3JlbGVhc2VfaW1hZ2UoZmltYWdlKTsKKwlpZiAoZXJyKQorCQlwcl9lcnIoImdzX3JlbGVhc2VfaW1hZ2UgZXJyb3JcbiIpOworZXJyX291dDE6CisJa2ZyZWUoZmltYWdlKTsKKworZXJyX291dDoKKwlyZXR1cm4gLTE7CisKK30KKworc3RhdGljIGludCBfX2luaXQgZ3NfZnBnYWJvb3RfaW5pdCh2b2lkKQoreworCWludCBlcnIsIHI7CisKKwlyID0gLTE7CisKKwlwcl9pbmZvKCJGUEdBIERPV05MT0FEIC0tLT5cbiIpOworCXByX2luZm8oImJ1aWx0IGF0ICVzIFVUQ1xuIiwgX19USU1FU1RBTVBfXyk7CisKKwlwcl9pbmZvKCJGUEdBIGltYWdlIGZpbGUgbmFtZTogJXNcbiIsIGZpbGUpOworCisJZXJyID0gaW5pdF9kcml2ZXIoKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJfZXJyKCJGUEdBIERSSVZFUiBJTklUIEZBSUwhIVxuIik7CisJCXJldHVybiByOworCX0KKworCWVyciA9IHhsX2luaXRfaW8oKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiR1BJTyBJTklUIEZBSUwhIVxuIik7CisJCXIgPSAtMTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJZXJyID0gZ3NfZnBnYWJvb3QoKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRlBHQSBET1dOTE9BRCBGQUlMISFcbiIpOworCQlyID0gLTE7CisJCWdvdG8gZXJyb3V0OworCX0KKworCXByX2luZm8oIkZQR0EgRE9XTkxPQUQgRE9ORSA8LS0tXG4iKTsKKworCXIgPSAwOworCXJldHVybiByOworCitlcnJvdXQ6CisJZmluaXNoX2RyaXZlcigpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnc19mcGdhYm9vdF9leGl0KHZvaWQpCit7CisJZmluaXNoX2RyaXZlcigpOworCXByX2luZm8oIkZQR0EgaW1hZ2UgZG93bmxvYWQgbW9kdWxlIHJlbW92ZWRcbiIpOworfQorCittb2R1bGVfaW5pdChnc19mcGdhYm9vdF9pbml0KTsKK21vZHVsZV9leGl0KGdzX2ZwZ2Fib290X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJJbnNvcCBTb25nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhsaW5peCBGUEdBIGZpcm13YXJlIGRvd25sb2FkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWY0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjZGVmaW5lCU1BWF9TVFIJMjU2CisKK2VudW0gZm10X2ltYWdlIHsKKwlmX2JpdCwJLyogb25seSBiaXRzdHJlYW0gaXMgc3VwcG9ydGVkICovCisJZl9yYnQsCisJZl9iaW4sCisJZl9tY3MsCisJZl9oZXgsCit9OworCitlbnVtIG1kb3dubG9hZCB7CisJbV9zeXN0ZW1tYXAsCS8qIG9ubHkgc3lzdGVtIG1hcCBpcyBzdXBwb3J0ZWQgKi8KKwltX3NlcmlhbCwKKwltX2p0YWcsCit9OworCisvKgorICogeGlsaW54IGZwZ2FpbWFnZSBpbmZvcm1hdGlvbgorICogTk9URTogdXNlIE1BWF9TVFIgaW5zdGVhZCBvZiBkeW5hbWljIGFsbG9jIGZvciBzaW1wbGljaXR5CisgKi8KK3N0cnVjdCBmcGdhaW1hZ2UgeworCWVudW0gZm10X2ltYWdlCWZtdF9pbWc7CisJZW51bSBtZG93bmxvYWQJZG1ldGhvZDsKKworCWNvbnN0IHN0cnVjdAlmaXJtd2FyZQkqZndfZW50cnk7CisKKwkvKgorCSAqIHRoZSBmb2xsb3dpbmdzIGNhbiBiZSByZWFkIGZyb20gYml0c3RyZWFtLAorCSAqIGJ1dCBvdGhlciBpbWFnZSBmb3JtYXQgc2hvdWxkIGhhdmUgYXMgd2VsbAorCSAqLworCWNoYXIJZmlsZW5hbWVbTUFYX1NUUl07CisJY2hhcglwYXJ0W01BWF9TVFJdOworCWNoYXIJZGF0ZVtNQVhfU1RSXTsKKwljaGFyCXRpbWVbTUFYX1NUUl07CisJaW50MzJfdAlsZW5kYXRhOworCWNoYXIJKmZwZ2FkYXRhOworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiZThlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJpby5oIgorCisjaWZkZWYgQ09ORklHX0I0ODYwRzEwMAorc3RhdGljIHN0cnVjdCBncGlvYnVzIGdidXM7CisjZW5kaWYgLyogQ09ORklHX0I0ODYwRzEwMCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTBfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSk7CitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTFfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSk7CitzdGF0aWMgaW5saW5lIHZvaWQgeGxfY2Nsa19iKGludDMyX3QgaSk7CisKKworLyogQXNzZXJ0IGFuZCBEZWFzc2VydCBDQ0xLICovCit2b2lkIHhsX3NoaWZ0X2NjbGsoaW50IGNvdW50KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXhsX2NjbGtfYigxKTsKKwkJeGxfY2Nsa19iKDApOworCX0KK30KKworaW50IHhsX3N1cHBvcnRlZF9wcm9nX2J1c193aWR0aChlbnVtIHdidXMgYnVzX2J5dGVzKQoreworCXN3aXRjaCAoYnVzX2J5dGVzKSB7CisJY2FzZSBidXNfMWJ5dGU6CisJCWJyZWFrOworCWNhc2UgYnVzXzJieXRlOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVuc3VwcG9ydGVkIHByb2dyYW0gYnVzIHdpZHRoICVkXG4iLAorCQkJCWJ1c19ieXRlcyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBTZXJpYWxpemUgYnl0ZSBhbmQgY2xvY2sgZWFjaCBiaXQgb24gdGFyZ2V0J3MgRElOIGFuZCBDQ0xLIHBpbnMgKi8KK3ZvaWQgeGxfc2hpZnRfYnl0ZXNfb3V0KGVudW0gd2J1cyBidXNfYnl0ZSwgdW5zaWduZWQgY2hhciAqcGRhdGEpCit7CisJLyoKKwkgKiBzdXBwb3J0cyAxIGFuZCAyIGJ5dGVzIHByb2dyYW1taW5nIG1vZGUKKwkgKi8KKwlpZiAobGlrZWx5KGJ1c19ieXRlID09IGJ1c18yYnl0ZSkpCisJCWJ5dGUwX291dChwZGF0YVswXSk7CisKKwlieXRlMV9vdXQocGRhdGFbMV0pOworCXhsX3NoaWZ0X2NjbGsoMSk7Cit9CisKKy8qCisgKiBnZW5lcmljIGJpdCBzd2FwIGZvciB4aWxpbnggU1lTVEVNTUFQIEZQR0EgcHJvZ3JhbW1pbmcKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGJpdHN3YXAodW5zaWduZWQgY2hhciBzKQoreworCXVuc2lnbmVkIGNoYXIgZDsKKwlkID0gKCgocyYweDgwKT4+NykgfCAoKHMmMHg0MCk+PjUpIHwgKChzJjB4MjApPj4zKSB8ICgocyYweDEwKT4+MSkgfAorCQkoKHMmMHgwOCk8PDEpIHwgKChzJjB4MDQpPDwzKSB8ICgocyYweDAyKTw8NSkgfCAoKHMmMHgwMSk8PDcpKTsKKwlyZXR1cm4gZDsKK30KKworI2lmZGVmIENPTkZJR19CNDg2MEcxMDAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBib2FyZCBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1wYzg1eHhfZ3Bpb19zZXRfZGlyKAorCQkJaW50MzJfdCBwb3J0LAorCQkJdWludDMyX3QgbWFzaywKKwkJCXVpbnQzMl90IGRpcikKK3sKKwlkaXIgfD0gKGluX2JlMzIoZ2J1cy5yW3BvcnRdK0dQRElSKSAmIH5tYXNrKTsKKwlvdXRfYmUzMihnYnVzLnJbcG9ydF0rR1BESVIsIGRpcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM4NXh4X2dwaW9fc2V0KGludDMyX3QgcG9ydCwgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKQoreworCS8qIEZpcnN0IG1hc2sgb2ZmIHRoZSB1bndhbnRlZCBwYXJ0cyBvZiAiZGlyIiBhbmQgInZhbCIgKi8KKwl2YWwgJj0gbWFzazsKKworCS8qIE5vdyByZWFkIGluIHRoZSB2YWx1ZXMgd2UncmUgc3VwcG9zZWQgdG8gcHJlc2VydmUgKi8KKwl2YWwgfD0gKGluX2JlMzIoZ2J1cy5yW3BvcnRdK0dQREFUKSAmIH5tYXNrKTsKKworCW91dF9iZTMyKGdidXMucltwb3J0XStHUERBVCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBtcGM4NXh4X2dwaW9fZ2V0KGludDMyX3QgcG9ydCwgdWludDMyX3QgbWFzaykKK3sKKwkvKiBSZWFkIHRoZSByZXF1ZXN0ZWQgdmFsdWVzICovCisJcmV0dXJuIGluX2JlMzIoZ2J1cy5yW3BvcnRdK0dQREFUKSAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM4NXh4X2dwaW9fc2V0X2xvdyhpbnQzMl90IHBvcnQsIHVpbnQzMl90IGdwaW9zKQoreworCW1wYzg1eHhfZ3Bpb19zZXQocG9ydCwgZ3Bpb3MsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXBjODV4eF9ncGlvX3NldF9oaWdoKGludDMyX3QgcG9ydCwgdWludDMyX3QgZ3Bpb3MpCit7CisJbXBjODV4eF9ncGlvX3NldChwb3J0LCBncGlvcywgMHhGRkZGRkZGRik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZShpbnQzMl90IHBvcnQsIHVpbnQzMl90IGdwaW8sIHVpbnQzMl90IHZhbHVlKQoreworCWludDMyX3QgZzsKKwlnID0gMzEgLSBncGlvOworCWlmICh2YWx1ZSkKKwkJbXBjODV4eF9ncGlvX3NldF9oaWdoKHBvcnQsIDFVIDw8IGcpOworCWVsc2UKKwkJbXBjODV4eF9ncGlvX3NldF9sb3cocG9ydCwgMVUgPDwgZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKGludDMyX3QgcG9ydCwgdWludDMyX3QgZ3BpbykKK3sKKwlpbnQzMl90IGc7CisJZyA9IDMxIC0gZ3BpbzsKKwlyZXR1cm4gISFtcGM4NXh4X2dwaW9fZ2V0KHBvcnQsIDFVIDw8IGcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGxfY2Nsa19iKGludDMyX3QgaSkKK3sKKwlncGlvX3NldF92YWx1ZShYTF9DQ0xLX1BPUlQsIFhMX0NDTEtfUElOLCBpKTsKK30KKwordm9pZCB4bF9wcm9ncmFtX2IoaW50MzJfdCBpKQoreworCWdwaW9fc2V0X3ZhbHVlKFhMX1BST0dOX1BPUlQsIFhMX1BST0dOX1BJTiwgaSk7Cit9CisKK3ZvaWQgeGxfcmR3cl9iKGludDMyX3QgaSkKK3sKKwlncGlvX3NldF92YWx1ZShYTF9SRFdSTl9QT1JULCBYTF9SRFdSTl9QSU4sIGkpOworfQorCit2b2lkIHhsX2NzaV9iKGludDMyX3QgaSkKK3sKKwlncGlvX3NldF92YWx1ZShYTF9DU0lOX1BPUlQsIFhMX0NTSU5fUElOLCBpKTsKK30KKworaW50IHhsX2dldF9pbml0X2Iodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoWExfSU5JVE5fUE9SVCwgWExfSU5JVE5fUElOKTsKK30KKworaW50IHhsX2dldF9kb25lX2Iodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoWExfRE9ORV9QT1JULCBYTF9ET05FX1BJTik7Cit9CisKKworLyogRzEwMCBzcGVjaWZpYyBiaXQgc3dhcCBhbmQgcmVtbWFwICh0byBncGlvIHBpbnMpIGZvciBieXRlIDAgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgYml0X3JlbWFwX2J5dGUwKHVpbnQzMl90IHMpCit7CisJdWludDMyX3QgZDsKKwlkID0gKCgocyYweDgwKT4+NykgfCAoKHMmMHg0MCk+PjUpIHwgKChzJjB4MjApPj4zKSB8ICgocyYweDEwKT4+MSkgfAorCQkoKHMmMHgwOCk8PDEpIHwgKChzJjB4MDQpPDwzKSB8ICgocyYweDAyKTw8NikgfCAoKHMmMHgwMSk8PDkpKTsKKwlyZXR1cm4gZDsKK30KKworLyoKKyAqIEcxMDAgc3BlY2lmaWMgTVNCLCBpbiB0aGlzIG9yZGVyIFtieXRlMCB8IGJ5dGUxXSwgb3V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBieXRlMF9vdXQodW5zaWduZWQgY2hhciBkYXRhKQoreworCXVpbnQzMl90IHN3YXAzMjsKKwlzd2FwMzIgPSAgYml0X3JlbWFwX2J5dGUwKCh1aW50MzJfdCkgZGF0YSkgPDwgODsKKworCW1wYzg1eHhfZ3Bpb19zZXQoMCwgMHgwMDAyQkYwMCwgKHVpbnQzMl90KSBzd2FwMzIpOworfQorCisvKgorICogRzEwMCBzcGVjaWZpYyBMU0IsIGluIHRoaXMgb3JkZXIgW2J5dGUwIHwgYnl0ZTFdLCBvdXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJ5dGUxX291dCh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJbXBjODV4eF9ncGlvX3NldCgwLCAweDAwMDAwMEZGLCAodWludDMyX3QpIGJpdHN3YXAoZGF0YSkpOworfQorCisvKgorICogY29uZmlndXJhYmxlIHBlciBkZXZpY2UgdHlwZSBmb3IgZGlmZmVyZW50IEkvTyBjb25maWcKKyAqLworaW50IHhsX2luaXRfaW8odm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNvbnN0IHUzMiAqcF9yZWc7CisJaW50IHJlZywgY250OworCisJY250ID0gMDsKKwltZW1zZXQoJmdidXMsIDAsIHNpemVvZihzdHJ1Y3QgZ3Bpb2J1cykpOworCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxxb3JpcS1ncGlvIikgeworCQlwX3JlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlpZiAocF9yZWcgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlyZWcgPSAoaW50KSAqcF9yZWc7CisJCWdidXMucltjbnRdID0gb2ZfaW9tYXAobnAsIDApOworCisJCWlmICghZ2J1cy5yW2NudF0pIHsKKwkJCXByX2Vycigibm90IGZpbmRkaW5nIGdwaW8gY2VsbC1pbmRleCAlZFxuIiwgY250KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWNudCsrOworCX0KKwltcGM4NXh4X2dwaW9fc2V0X2RpcigwLCAweDAwMDJCRkZGLCAweDAwMDJCRkZGKTsKKwltcGM4NXh4X2dwaW9fc2V0X2RpcigxLCAweDAwMjQwMDYwLCAweDAwMjQwMDYwKTsKKworCWdidXMubmdwaW8gPSBjbnQ7CisKKwlyZXR1cm4gMDsKK30KKworCisjZWxzZQkvKiBwbGFjZWhvbGRlciBmb3IgYm9hcmRzIHdpdGggZGlmZmVyZW50IGNvbmZpZyAqLworCit2b2lkIHhsX3Byb2dyYW1fYihpbnQzMl90IGkpCit7CisJcmV0dXJuOworfQorCit2b2lkIHhsX3Jkd3JfYihpbnQzMl90IGkpCit7CisJcmV0dXJuOworfQorCit2b2lkIHhsX2NzaV9iKGludDMyX3QgaSkKK3sKKwlyZXR1cm47Cit9CisKK2ludCB4bF9nZXRfaW5pdF9iKHZvaWQpCit7CisJcmV0dXJuIC0xOworfQorCitpbnQgeGxfZ2V0X2RvbmVfYih2b2lkKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ5dGUwX291dCh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnl0ZTFfb3V0KHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bF9jY2xrX2IoaW50MzJfdCBpKQoreworCXJldHVybjsKK30KKworLyoKKyAqIGNvbmZpZ3VyYWJsZSBwZXIgZGV2aWNlIHR5cGUgZm9yIGRpZmZlcmVudCBJL08gY29uZmlnCisgKi8KK2ludCB4bF9pbml0X2lvKHZvaWQpCit7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogQ09ORklHX0I0ODYwRzEwMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ2YWMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2lvLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjZGVmaW5lIEdQRElSCTAKKyNkZWZpbmUgR1BDRkcJNAkvKiBvcGVuIGRyYWluIG9yIG5vdCAqLworI2RlZmluZSBHUERBVAk4CisKKy8qCisgKiBncGlvIHBvcnQgYW5kIHBpbiBkZWZpbml0aW9ucworICogTk9URTogcG9ydCBudW1iZXIgc3RhcnRzIGZyb20gMAorICovCisjZGVmaW5lCVhMX0lOSVROX1BPUlQJMQorI2RlZmluZQlYTF9JTklUTl9QSU4JMTQKKyNkZWZpbmUJWExfUkRXUk5fUE9SVAkxCisjZGVmaW5lCVhMX1JEV1JOX1BJTgkxMworI2RlZmluZQlYTF9DQ0xLX1BPUlQJMQorI2RlZmluZQlYTF9DQ0xLX1BJTgkxMAorI2RlZmluZQlYTF9QUk9HTl9QT1JUCTEKKyNkZWZpbmUJWExfUFJPR05fUElOCTI1CisjZGVmaW5lCVhMX0NTSU5fUE9SVAkxCisjZGVmaW5lCVhMX0NTSU5fUElOCTI2CisjZGVmaW5lCVhMX0RPTkVfUE9SVAkxCisjZGVmaW5lCVhMX0RPTkVfUElOCTI3CisKKy8qCisgKiBncGlvIG1hcHBpbmcKKyAqCisJWExfY29uZmlnX0QwIOKAkyBncGlvMV8zMQorCVhsX2NvbmZpZ19kMSDigJMgZ3BpbzFfMzAKKwlYbF9jb25maWdfZDIg4oCTIGdwaW8xXzI5CisJWGxfY29uZmlnX2QzIOKAkyBncGlvMV8yOAorCVhsX2NvbmZpZ19kNCDigJMgZ3BpbzFfMjcKKwlYbF9jb25maWdfZDUg4oCTIGdwaW8xXzI2CisJWGxfY29uZmlnX2Q2IOKAkyBncGlvMV8yNQorCVhsX2NvbmZpZ19kNyDigJMgZ3BpbzFfMjQKKwlYbF9jb25maWdfZDgg4oCTIGdwaW8xXzIzCisJWGxfY29uZmlnX2Q5IOKAkyBncGlvMV8yMgorCVhsX2NvbmZpZ19kMTAg4oCTIGdwaW8xXzIxCisJWGxfY29uZmlnX2QxMSDigJMgZ3BpbzFfMjAKKwlYbF9jb25maWdfZDEyIOKAkyBncGlvMV8xOQorCVhsX2NvbmZpZ19kMTMg4oCTIGdwaW8xXzE4CisJWGxfY29uZmlnX2QxNCDigJMgZ3BpbzFfMTYKKwlYbF9jb25maWdfZDE1IOKAkyBncGlvMV8xNAorKgorKi8KKworLyoKKyAqIHByb2dyYW0gYnVzIHdpZHRoIGluIGJ5dGVzCisgKi8KK2VudW0gd2J1cyB7CisJYnVzXzFieXRlCT0gMSwKKwlidXNfMmJ5dGUJPSAyLAorfTsKKworCisjZGVmaW5lIE1BWF9XQUlUX0RPTkUJMTAwMDAKKworCitzdHJ1Y3QgZ3Bpb2J1cyB7CisJaW50CW5ncGlvOworCXZvaWQgX19pb21lbSAqcls0XTsKK307CisKK2ludCB4bF9zdXBwb3J0ZWRfcHJvZ19idXNfd2lkdGgoZW51bSB3YnVzIGJ1c19ieXRlcyk7CisKK3ZvaWQgeGxfcHJvZ3JhbV9iKGludDMyX3QgaSk7Cit2b2lkIHhsX3Jkd3JfYihpbnQzMl90IGkpOwordm9pZCB4bF9jc2lfYihpbnQzMl90IGkpOworCitpbnQgeGxfZ2V0X2luaXRfYih2b2lkKTsKK2ludCB4bF9nZXRfZG9uZV9iKHZvaWQpOworCit2b2lkIHhsX3NoaWZ0X2NjbGsoaW50IGNvdW50KTsKK3ZvaWQgeGxfc2hpZnRfYnl0ZXNfb3V0KGVudW0gd2J1cyBidXNfYnl0ZSwgdW5zaWduZWQgY2hhciAqcGRhdGEpOworCitpbnQgeGxfaW5pdF9pbyh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fdXRpbHMuaAppbmRleCBjOWZlZGI3Li4yMDY0ODM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb191dGlscy5oCkBAIC02NTIsMyArNjUyLDI1IEBACiAJZnJlZSh0ZW1wKTsKIAlyZXR1cm4gcmV0OwogfQorCityZWFkX3N5c2ZzX3N0cmluZyhjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYmFzZWRpciwgY2hhciAqc3RyKQoreworCWZsb2F0IHJldCA9IDA7CisJRklMRSAgKnN5c2ZzZnA7CisJY2hhciAqdGVtcCA9IG1hbGxvYyhzdHJsZW4oYmFzZWRpcikgKyBzdHJsZW4oZmlsZW5hbWUpICsgMik7CisJaWYgKHRlbXAgPT0gTlVMTCkgeworCQlwcmludGYoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7CisJc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJyIik7CisJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgeworCQlyZXQgPSAtZXJybm87CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisJZnNjYW5mKHN5c2ZzZnAsICIlc1xuIiwgc3RyKTsKKwlmY2xvc2Uoc3lzZnNmcCk7CitlcnJvcl9mcmVlOgorCWZyZWUodGVtcCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9sc2lpby5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2xzaWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhZTk2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9sc2lpby5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogSW5kdXN0cmlhbCBJL08gdXRpbGl0aWVzIC0gbHNpaW8uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNYW51ZWwgU3RhaGwgPG1hbnVlbC5zdGFobEBpaXMuZnJhdW5ob2Zlci5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSAiaWlvX3V0aWxzLmgiCisKKworc3RhdGljIGVudW0gdmVyYm9zaXR5IHsKKwlWRVJCTEVWRUxfREVGQVVMVCwJLyogMCBnaXZlcyBsc3BjaSBiZWhhdmlvdXIgKi8KKwlWRVJCTEVWRUxfU0VOU09SUywJLyogMSBsaXN0cyBzZW5zb3JzICovCit9IHZlcmJsZXZlbCA9IFZFUkJMRVZFTF9ERUZBVUxUOworCitjb25zdCBjaGFyICp0eXBlX2RldmljZSA9ICJpaW86ZGV2aWNlIjsKK2NvbnN0IGNoYXIgKnR5cGVfdHJpZ2dlciA9ICJ0cmlnZ2VyIjsKKworCitzdGF0aWMgaW5saW5lIGludCBjaGVja19wcmVmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcmV0dXJuIHN0cmxlbihzdHIpID4gc3RybGVuKHByZWZpeCkgJiYKKwkJc3RybmNtcChzdHIsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3Bvc3RmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwb3N0Zml4KQoreworCXJldHVybiBzdHJsZW4oc3RyKSA+IHN0cmxlbihwb3N0Zml4KSAmJgorCQlzdHJjbXAoc3RyICsgc3RybGVuKHN0cikgLSBzdHJsZW4ocG9zdGZpeCksIHBvc3RmaXgpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9jaGFubmVscyhjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCit7CisJRElSICpkcDsKKwljb25zdCBzdHJ1Y3QgZGlyZW50ICplbnQ7CisJZHAgPSBvcGVuZGlyKGRldl9kaXJfbmFtZSk7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybiAtZXJybm87CisJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkKKwkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgImluXyIpICYmCisJCSAgICBjaGVja19wb3N0Zml4KGVudC0+ZF9uYW1lLCAiX3JhdyIpKSB7CisJCQlwcmludGYoIiAgICUtMTBzXG4iLCBlbnQtPmRfbmFtZSk7CisJCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfb25lX2RldmljZShjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCit7CisJY2hhciBuYW1lW0lJT19NQVhfTkFNRV9MRU5HVEhdOworCWludCBkZXZfaWR4OworCisJc3NjYW5mKGRldl9kaXJfbmFtZSArIHN0cmxlbihpaW9fZGlyKSArIHN0cmxlbih0eXBlX2RldmljZSksCisJCQkiJWkiLCAmZGV2X2lkeCk7CisJcmVhZF9zeXNmc19zdHJpbmcoIm5hbWUiLCBkZXZfZGlyX25hbWUsIG5hbWUpOworCXByaW50ZigiRGV2aWNlICUwM2Q6ICVzXG4iLCBkZXZfaWR4LCBuYW1lKTsKKworCWlmICh2ZXJibGV2ZWwgPj0gVkVSQkxFVkVMX1NFTlNPUlMpIHsKKwkJaW50IHJldCA9IGR1bXBfY2hhbm5lbHMoZGV2X2Rpcl9uYW1lKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfb25lX3RyaWdnZXIoY29uc3QgY2hhciAqZGV2X2Rpcl9uYW1lKQoreworCWNoYXIgbmFtZVtJSU9fTUFYX05BTUVfTEVOR1RIXTsKKwlpbnQgZGV2X2lkeDsKKworCXNzY2FuZihkZXZfZGlyX25hbWUgKyBzdHJsZW4oaWlvX2RpcikgKyBzdHJsZW4odHlwZV90cmlnZ2VyKSwKKwkJCSIlaSIsICZkZXZfaWR4KTsKKwlyZWFkX3N5c2ZzX3N0cmluZygibmFtZSIsIGRldl9kaXJfbmFtZSwgbmFtZSk7CisJcHJpbnRmKCJUcmlnZ2VyICUwM2Q6ICVzXG4iLCBkZXZfaWR4LCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9kZXZpY2VzKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OworCWludCBudW1iZXIsIG51bXN0cmxlbjsKKworCUZJTEUgKm5hbWVGaWxlOworCURJUiAqZHA7CisJY2hhciB0aGlzbmFtZVtJSU9fTUFYX05BTUVfTEVOR1RIXTsKKwljaGFyICpmaWxlbmFtZTsKKworCWRwID0gb3BlbmRpcihpaW9fZGlyKTsKKwlpZiAoZHAgPT0gTlVMTCkgeworCQlwcmludGYoIk5vIGluZHVzdHJpYWwgSS9PIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpIHsKKwkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgdHlwZV9kZXZpY2UpKSB7CisJCQljaGFyICpkZXZfZGlyX25hbWU7CisJCQlhc3ByaW50ZigmZGV2X2Rpcl9uYW1lLCAiJXMlcyIsIGlpb19kaXIsIGVudC0+ZF9uYW1lKTsKKwkJCWR1bXBfb25lX2RldmljZShkZXZfZGlyX25hbWUpOworCQkJZnJlZShkZXZfZGlyX25hbWUpOworCQkJaWYgKHZlcmJsZXZlbCA+PSBWRVJCTEVWRUxfU0VOU09SUykKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKwl9CisJcmV3aW5kZGlyKGRwKTsKKwl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKSB7CisJCWlmIChjaGVja19wcmVmaXgoZW50LT5kX25hbWUsIHR5cGVfdHJpZ2dlcikpIHsKKwkJCWNoYXIgKmRldl9kaXJfbmFtZTsKKwkJCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlcyVzIiwgaWlvX2RpciwgZW50LT5kX25hbWUpOworCQkJZHVtcF9vbmVfdHJpZ2dlcihkZXZfZGlyX25hbWUpOworCQkJZnJlZShkZXZfZGlyX25hbWUpOworCQl9CisJfQorCWNsb3NlZGlyKGRwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjLCBlcnIgPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkOkQ6diIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ3YnOgorCQkJdmVyYmxldmVsKys7CisJCQlicmVhazsKKworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCWVycisrOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGVyciB8fCBhcmdjID4gb3B0aW5kKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGxzaWlvIFtvcHRpb25zXS4uLlxuIgorCQkJIkxpc3QgaW5kdXN0cmlhbCBJL08gZGV2aWNlc1xuIgorCQkJIiAgLXYsIC0tdmVyYm9zZVxuIgorCQkJIiAgICAgIEluY3JlYXNlIHZlcmJvc2l0eSAobWF5IGJlIGdpdmVuIG11bHRpcGxlIHRpbWVzKVxuIgorCQkJKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkdW1wX2RldmljZXMoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAppbmRleCBjMTAxNmM1Li5iMjg0ZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaApAQCAtNjUsNyArNjUsOCBAQAogCiAjZGVmaW5lIFNDQTMwMDBfUklOR19CVUZfRU5BQkxFCQkJMHg4MAogI2RlZmluZSBTQ0EzMDAwX1JJTkdfQlVGXzhCSVQJCQkweDQwCi0vKiBGcmVlIGZhbGwgZGV0ZWN0aW9uIHRyaWdnZXJzIGFuIGludGVycnVwdCBpZiB0aGUgYWNjZWxlcmF0aW9uCisvKgorICogRnJlZSBmYWxsIGRldGVjdGlvbiB0cmlnZ2VycyBhbiBpbnRlcnJ1cHQgaWYgdGhlIGFjY2VsZXJhdGlvbgogICogaXMgYmVsb3cgYSB0aHJlc2hvbGQgZm9yIGVxdWl2YWxlbnQgb2YgMjVjbSBkcm9wCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9GUkVFX0ZBTExfREVURUNUCQkweDEwCkBAIC03Myw4ICs3NCw5IEBACiAjZGVmaW5lIFNDQTMwMDBfTUVBU19NT0RFX09QXzEJCQkweDAxCiAjZGVmaW5lIFNDQTMwMDBfTUVBU19NT0RFX09QXzIJCQkweDAyCiAKLS8qIEluIG1vdGlvbiBkZXRlY3Rpb24gbW9kZSB0aGUgYWNjZWxlcmF0aW9ucyBhcmUgYmFuZCBwYXNzIGZpbHRlcmVkCi0gKiAoYXByb3ggMSAtIDI1SHopIGFuZCB0aGVuIGEgcHJvZ3JhbW1hYmxlIHRocmVzaG9sZCB1c2VkIHRvIHRyaWdnZXIKKy8qCisgKiBJbiBtb3Rpb24gZGV0ZWN0aW9uIG1vZGUgdGhlIGFjY2VsZXJhdGlvbnMgYXJlIGJhbmQgcGFzcyBmaWx0ZXJlZAorICogKGFwcHJveCAxIC0gMjVIeikgYW5kIHRoZW4gYSBwcm9ncmFtbWFibGUgdGhyZXNob2xkIHVzZWQgdG8gdHJpZ2dlcgogICogYW5kIGludGVycnVwdC4KICAqLwogI2RlZmluZSBTQ0EzMDAwX01FQVNfTU9ERV9NT1RfREVUCQkweDAzCkBAIC05OSw4ICsxMDEsMTAgQEAKICNkZWZpbmUgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfTURfWV9USAkJMHgwMwogI2RlZmluZSBTQ0EzMDAwX1JFR19DVFJMX1NFTF9NRF9YX1RICQkweDA0CiAjZGVmaW5lIFNDQTMwMDBfUkVHX0NUUkxfU0VMX01EX1pfVEgJCTB4MDUKLS8qIEJFIFZFUlkgQ0FSRUZVTCBXSVRIIFRISVMsIElGIDMgQklUUyBBUkUgTk9UIFNFVCB0aGUgZGV2aWNlCi0gICB3aWxsIG5vdCBmdW5jdGlvbiAqLworLyoKKyAqIEJFIFZFUlkgQ0FSRUZVTCBXSVRIIFRISVMsIElGIDMgQklUUyBBUkUgTk9UIFNFVCB0aGUgZGV2aWNlCisgKiB3aWxsIG5vdCBmdW5jdGlvbgorICovCiAjZGVmaW5lIFNDQTMwMDBfUkVHX0NUUkxfU0VMX09VVF9DVFJMCQkweDBCCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfUFJPVF9NQVNLCQkweEUwCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX1hfRU4JCTB4MTAKQEAgLTEwOSw4ICsxMTMsOSBAQAogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfNAkJMHgwMgogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfMgkJMHgwMQogCi0vKiBDb250cm9sIHdoaWNoIG1vdGlvbiBkZXRlY3RvciBpbnRlcnJ1cHRzIGFyZSBvbi4KLSAqIEZvciBub3cgb25seSBPUiBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZC54CisvKgorICogQ29udHJvbCB3aGljaCBtb3Rpb24gZGV0ZWN0b3IgaW50ZXJydXB0cyBhcmUgb24uCisgKiBGb3Igbm93IG9ubHkgT1IgY29tYmluYXRpb25zIGFyZSBzdXBwb3J0ZWQuCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9NRF9DVFJMX1BST1RfTUFTSwkJMHhDMAogI2RlZmluZSBTQ0EzMDAwX01EX0NUUkxfT1JfWQkJCTB4MDEKQEAgLTEyMSw3ICsxMjYsOCBAQAogI2RlZmluZSBTQ0EzMDAwX01EX0NUUkxfQU5EX1gJCQkweDEwCiAjZGVmaW5lIFNBQzMwMDBfTURfQ1RSTF9BTkRfWgkJCTB4MjAKIAotLyogU29tZSBjb250cm9sIHJlZ2lzdGVycyBvZiBjb21wbGV4IGFjY2VzcyBtZXRob2RzIHJlcXVpcmluZyB0aGlzIHJlZ2lzdGVyIHRvCisvKgorICogU29tZSBjb250cm9sIHJlZ2lzdGVycyBvZiBjb21wbGV4IGFjY2VzcyBtZXRob2RzIHJlcXVpcmluZyB0aGlzIHJlZ2lzdGVyIHRvCiAgKiBiZSB1c2VkIHRvIHJlbW92ZSBhIGxvY2suCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9SRUdfQUREUl9VTkxPQ0sJCQkweDFlCkBAIC0xMzksNyArMTQ1LDggQEAKIC8qIFZhbHVlcyBvZiBtdWx0aXBsZXhlZCByZWdpc3RlcnMgKHdyaXRlIHRvIGN0cmxfZGF0YSBhZnRlciBzZWxlY3QpICovCiAjZGVmaW5lIFNDQTMwMDBfUkVHX0FERFJfQ1RSTF9EQVRBCQkweDIyCiAKLS8qIE1lYXN1cmVtZW50IG1vZGVzIGF2YWlsYWJsZSBvbiBzb21lIHNjYTMwMDAgc2VyaWVzIGNoaXBzLiBDb2RlIGFzc3VtZXMgb3RoZXJzCisvKgorICogTWVhc3VyZW1lbnQgbW9kZXMgYXZhaWxhYmxlIG9uIHNvbWUgc2NhMzAwMCBzZXJpZXMgY2hpcHMuIENvZGUgYXNzdW1lcyBvdGhlcnMKICAqIG1heSBiZWNvbWUgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmUuCiAgKgogICogQnlwYXNzIC0gQnlwYXNzIHRoZSBsb3ctcGFzcyBmaWx0ZXIgaW4gdGhlIHNpZ25hbCBjaGFubmVsIHNvIGFzIHRvIGluY3JlYXNlCkBAIC0xNjAsNyArMTY3LDYgQEAKICAqIHN0cnVjdCBzY2EzMDAwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHN0YXRlIGluZm9ybWF0aW9uCiAgKiBAdXM6CQkJdGhlIGFzc29jaWF0ZWQgc3BpIGRldmljZQogICogQGluZm86CQkJY2hpcCB2YXJpYW50IGluZm9ybWF0aW9uCi0gKiBAaW5kaW9fZGV2OgkJCWRldmljZSBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBJSU8gY29yZQogICogQGludGVycnVwdF9oYW5kbGVyX3dzOglldmVudCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgYWxsIGV2ZW50cwogICogQGxhc3RfdGltZXN0YW1wOgkJdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBldmVudAogICogQG1vX2RldF91c2VfY291bnQ6CQlyZWZlcmVuY2UgY291bnRlciBmb3IgdGhlIG1vdGlvbiBkZXRlY3Rpb24gdW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKaW5kZXggN2Y2Y2NkZi4uZWQzMGUzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCkBAIC0zMiw3ICszMiw4IEBACiAJZTA1LAogfTsKIAotLyogTm90ZSB3aGVyZSBvcHRpb24gbW9kZXMgYXJlIG5vdCBkZWZpbmVkLCB0aGUgY2hpcCBzaW1wbHkgZG9lcyBub3QKKy8qCisgKiBOb3RlIHdoZXJlIG9wdGlvbiBtb2RlcyBhcmUgbm90IGRlZmluZWQsIHRoZSBjaGlwIHNpbXBseSBkb2VzIG5vdAogICogc3VwcG9ydCBhbnkuCiAgKiBPdGhlciBjaGlwcyBpbiB0aGUgc2NhMzAwMCBzZXJpZXMgdXNlIGkyYyBhbmQgYXJlIG5vdCBpbmNsdWRlZCBoZXJlLgogICoKQEAgLTE5MSw3ICsxOTIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIENydWNpYWwgdGhhdCBsb2NrIGlzIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB0aGlzICovCiAvKioKICAqIHNjYTMwMDBfcmVhZF9jdHJsX3JlZygpIHJlYWQgZnJvbSBsb2NrIHByb3RlY3RlZCBjb250cm9sIHJlZ2lzdGVyLgogICoKQEAgLTI1MCw5ICsyNTAsOCBAQAogfQogI2VuZGlmIC8qIFNDQTMwMDBfREVCVUcgKi8KIAotCiAvKioKLSAqIHNjYTMwMDBfc2hvd19yZWcoKSAtIHN5c2ZzIGludGVyZmFjZSB0byByZWFkIHRoZSBjaGlwIHJldmlzaW9uIG51bWJlcgorICogc2NhMzAwMF9zaG93X3JldigpIC0gc3lzZnMgaW50ZXJmYWNlIHRvIHJlYWQgdGhlIGNoaXAgcmV2aXNpb24gbnVtYmVyCiAgKiovCiBzdGF0aWMgc3NpemVfdCBzY2EzMDAwX3Nob3dfcmV2KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTMxMiw3ICszMTEsNyBAQAogfQogCiAvKioKLSAqIHNjYTMwMDBfc2hvd19tZWFzdXJtZW5ldF9tb2RlKCkgc3lzZnMgcmVhZCBvZiBjdXJyZW50IG1vZGUKKyAqIHNjYTMwMDBfc2hvd19tZWFzdXJlbWVudF9tb2RlKCkgc3lzZnMgcmVhZCBvZiBjdXJyZW50IG1vZGUKICAqKi8KIHN0YXRpYyBzc2l6ZV90CiBzY2EzMDAwX3Nob3dfbWVhc3VyZW1lbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC00MDMsNyArNDAyLDggQEAKIH0KIAogCi0vKiBOb3QgZXZlbiB2YWd1ZWx5IHN0YW5kYXJkIGF0dHJpYnV0ZXMgc28gZGVmaW5lZCBoZXJlIHJhdGhlciB0aGFuCisvKgorICogTm90IGV2ZW4gdmFndWVseSBzdGFuZGFyZCBhdHRyaWJ1dGVzIHNvIGRlZmluZWQgaGVyZSByYXRoZXIgdGhhbgogICogaW4gdGhlIHJlbGV2YW50IElJTyBjb3JlIGhlYWRlcnMKICAqLwogc3RhdGljIElJT19ERVZJQ0VfQVRUUihtZWFzdXJlbWVudF9tb2RlX2F2YWlsYWJsZSwgU19JUlVHTywKQEAgLTQ1MCw2ICs0NTAsMTggQEAKIAlTQ0EzMDAwX0NIQU4oMiwgSUlPX01PRF9aKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzY2EzMDAwX2NoYW5uZWxzX3dpdGhfdGVtcFtdID0geworCVNDQTMwMDBfQ0hBTigwLCBJSU9fTU9EX1gpLAorCVNDQTMwMDBfQ0hBTigxLCBJSU9fTU9EX1kpLAorCVNDQTMwMDBfQ0hBTigyLCBJSU9fTU9EX1opLAorCXsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAorCQkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwKKwl9LAorfTsKKwogc3RhdGljIHU4IHNjYTMwMDBfYWRkcmVzc2VzWzNdWzNdID0gewogCVswXSA9IHtTQ0EzMDAwX1JFR19BRERSX1hfTVNCLCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9NRF9YX1RILAogCSAgICAgICBTQ0EzMDAwX01EX0NUUkxfT1JfWH0sCkBAIC00NzIsMTkgKzQ4NCwzMCBAQAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CiAJCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQkJaWYgKHN0LT5tb19kZXRfdXNlX2NvdW50KSB7Ci0JCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKLQkJCXJldHVybiAtRUJVU1k7CisJCWlmIChjaGFuLT50eXBlID09IElJT19BQ0NFTCkgeworCQkJaWYgKHN0LT5tb19kZXRfdXNlX2NvdW50KSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWFkZHJlc3MgPSBzY2EzMDAwX2FkZHJlc3Nlc1tjaGFuLT5hZGRyZXNzXVswXTsKKwkJCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBhZGRyZXNzLCAyKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCSp2YWwgPSAoYmUxNl90b19jcHVwKChfX2JlMTYgKilzdC0+cngpID4+IDMpICYgMHgxRkZGOworCQkJKnZhbCA9ICgoKnZhbCkgPDwgKHNpemVvZigqdmFsKSo4IC0gMTMpKSA+PgorCQkJCShzaXplb2YoKnZhbCkqOCAtIDEzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGdldCB0aGUgdGVtcGVyYXR1cmUgd2hlbiBhdmFpbGFibGUgKi8KKwkJCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LAorCQkJCVNDQTMwMDBfUkVHX0FERFJfVEVNUF9NU0IsIDIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJKnZhbCA9ICgoc3QtPnJ4WzBdICYgMHgzRikgPDwgMykgfCAoKHN0LT5yeFsxXSAmIDB4RTApID4+IDUpOwogCQl9Ci0JCWFkZHJlc3MgPSBzY2EzMDAwX2FkZHJlc3Nlc1tjaGFuLT5hZGRyZXNzXVswXTsKLQkJcmV0ID0gc2NhMzAwMF9yZWFkX2RhdGFfc2hvcnQoc3QsIGFkZHJlc3MsIDIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCSp2YWwgPSAoYmUxNl90b19jcHVwKChfX2JlMTYgKilzdC0+cngpID4+IDMpICYgMHgxRkZGOwotCQkqdmFsID0gKCgqdmFsKSA8PCAoc2l6ZW9mKCp2YWwpKjggLSAxMykpID4+Ci0JCQkoc2l6ZW9mKCp2YWwpKjggLSAxMyk7CiAJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwogCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgpAQCAtNDk0LDYgKzUxNywxMCBAQAogCQllbHNlIC8qIHRlbXBlcmF0dXJlICovCiAJCQkqdmFsMiA9IDU1NTU1NjsKIAkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJKnZhbCA9IC0yMTQ7CisJCSp2YWwyID0gNjAwMDAwOworCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC01NDcsNyArNTc0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogLyoqCi0gKiBfX3NjYTMwMDBfZ2V0X2Jhc2VfZnJlcXVlbmN5KCkgb2J0YWluIG1vZGUgc3BlY2lmaWMgYmFzZSBmcmVxdWVuY3kKKyAqIF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKCkgb2J0YWluIG1vZGUgc3BlY2lmaWMgYmFzZSBmcmVxdWVuY3kKICAqCiAgKiBsb2NrIG11c3QgYmUgaGVsZAogICoqLwpAQCAtNjYzLDcgKzY5MCw4IEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKIH0KIAotLyogU2hvdWxkIG9ubHkgcmVhbGx5IGJlIHJlZ2lzdGVyZWQgaWYgcmluZyBidWZmZXIgc3VwcG9ydCBpcyBjb21waWxlZCBpbi4KKy8qCisgKiBTaG91bGQgb25seSByZWFsbHkgYmUgcmVnaXN0ZXJlZCBpZiByaW5nIGJ1ZmZlciBzdXBwb3J0IGlzIGNvbXBpbGVkIGluLgogICogRG9lcyBubyBoYXJtIGhvd2V2ZXIgYW5kIGRvaW5nIGl0IHJpZ2h0IHdvdWxkIGFkZCBhIGZhaXIgYml0IG9mIGNvbXBsZXhpdHkKICAqLwogc3RhdGljIElJT19ERVZfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoc2NhMzAwMF9yZWFkX2F2X2ZyZXEpOwpAQCAtNjcyLDM3ICs3MDAsNiBAQAogCQkJICAgICAgc2NhMzAwMF9yZWFkX2ZyZXF1ZW5jeSwKIAkJCSAgICAgIHNjYTMwMDBfc2V0X2ZyZXF1ZW5jeSk7CiAKLQotLyoqCi0gKiBzY2EzMDAwX3JlYWRfdGVtcCgpIHN5c2ZzIGludGVyZmFjZSB0byBnZXQgdGhlIHRlbXBlcmF0dXJlIHdoZW4gYXZhaWxhYmxlCi0gKgotKiBUaGUgYWxpZ25tZW50IG9mIGRhdGEgaW4gaGVyZSBpcyBkb3ducmlnaHQgb2RkLiBTZWUgZGF0YSBzaGVldC4KLSogQ29udmVydGluZyB0aGlzIGludG8gYSBtZWFuaW5nZnVsIHZhbHVlIGlzIGxlZnQgdG8gaW5saW5lIGZ1bmN0aW9ucyBpbgotKiB1c2Vyc3BhY2UgcGFydCBvZiBoZWFkZXIuCi0qKi8KLXN0YXRpYyBzc2l6ZV90IHNjYTMwMDBfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKLQlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCByZXQ7Ci0JaW50IHZhbDsKLQlyZXQgPSBzY2EzMDAwX3JlYWRfZGF0YV9zaG9ydChzdCwgU0NBMzAwMF9SRUdfQUREUl9URU1QX01TQiwgMik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0OwotCXZhbCA9ICgoc3QtPnJ4WzBdICYgMHgzRikgPDwgMykgfCAoKHN0LT5yeFsxXSAmIDB4RTApID4+IDUpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Ci0KLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotfQotc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhzY2EzMDAwX3JlYWRfdGVtcCk7Ci0KLXN0YXRpYyBJSU9fQ09OU1RfQVRUUl9URU1QX1NDQUxFKCIwLjU1NTU1NiIpOwotc3RhdGljIElJT19DT05TVF9BVFRSX1RFTVBfT0ZGU0VUKCItMjE0LjYiKTsKLQogLyoqCiAgKiBzY2EzMDAwX3JlYWRfdGhyZXNoKCkgLSBxdWVyeSBvZiBhIHRocmVzaG9sZAogICoqLwpAQCAtNzgyLDMzICs3NzksMTYgQEAKIAlOVUxMLAogfTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNjYTMwMDBfYXR0cmlidXRlc193aXRoX3RlbXBbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX3JldmlzaW9uLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9tZWFzdXJlbWVudF9tb2RlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfbWVhc3VyZW1lbnRfbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCi0JLyogT25seSBwcmVzZW50IGlmIHRlbXAgc2Vuc29yIGlzICovCi0JJmlpb19kZXZfYXR0cl9pbl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjYTMwMDBfYXR0cmlidXRlX2dyb3VwID0gewogCS5hdHRycyA9IHNjYTMwMDBfYXR0cmlidXRlcywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjYTMwMDBfYXR0cmlidXRlX2dyb3VwX3dpdGhfdGVtcCA9IHsKLQkuYXR0cnMgPSBzY2EzMDAwX2F0dHJpYnV0ZXNfd2l0aF90ZW1wLAotfTsKLQotLyogUklORyBSRUxBVEVEIGludGVycnVwdCBoYW5kbGVyICovCi0vKiBkZXBlbmRpbmcgb24gZXZlbnQsIHB1c2ggdG8gdGhlIHJpbmcgYnVmZmVyIGV2ZW50IGNocmRldiBvciB0aGUgZXZlbnQgb25lICovCi0KIC8qKgogICogc2NhMzAwMF9ldmVudF9oYW5kbGVyKCkgLSBoYW5kbGluZyByaW5nIGFuZCBub24gcmluZyBldmVudHMKICAqCisgKiBSaW5nIHJlbGF0ZWQgaW50ZXJydXB0IGhhbmRsZXIuIERlcGVuZGluZyBvbiBldmVudCwgcHVzaCB0bworICogdGhlIHJpbmcgYnVmZmVyIGV2ZW50IGNocmRldiBvciB0aGUgZXZlbnQgb25lLgorICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgZGV2aWNlcyBjYW4gc2lnbmlmeSByaW5nCiAgKiBhbmQgbm9uIHJpbmcgZXZlbnRzIHZpYSB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZSBhbmQgdGhleSBjYW4gb25seQogICogYmUgZGlzdGluZ3Vpc2hlZCB2aWEgYSByZWFkIG9mIHRoZSByZWxldmFudCBzdGF0dXMgcmVnaXN0ZXIuCkBAIC04MjAsNyArODAwLDggQEAKIAlpbnQgcmV0LCB2YWw7CiAJczY0IGxhc3RfdGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKCk7CiAKLQkvKiBDb3VsZCBsZWFkIGlmIGJhZGx5IHRpbWVkIHRvIGFuIGV4dHJhIHJlYWQgb2Ygc3RhdHVzIHJlZywKKwkvKgorCSAqIENvdWxkIGxlYWQgaWYgYmFkbHkgdGltZWQgdG8gYW4gZXh0cmEgcmVhZCBvZiBzdGF0dXMgcmVnLAogCSAqIGJ1dCBlbnN1cmVzIG5vIGludGVycnVwdCBpcyBtaXNzZWQuCiAJICovCiAJbXV0ZXhfbG9jaygmc3QtPmxvY2spOwpAQCAtOTM1LDcgKzkxNiw2IEBACiAgKiB0aGUgZGV2aWNlIGZhbGxzIG1vcmUgdGhhbiAyNWNtLiAgVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIGR1ZQogICogdG8gZnJhZ2lsZSB3aXJpbmcuCiAgKiovCi0KIHN0YXRpYyBzc2l6ZV90IHNjYTMwMDBfc2V0X2ZyZWVfZmFsbF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICBjb25zdCBjaGFyICpidWYsCkBAIC05NTcsNyArOTM3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKIAotCS8qaWYgb2ZmIGFuZCBzaG91bGQgYmUgb24qLworCS8qIGlmIG9mZiBhbmQgc2hvdWxkIGJlIG9uICovCiAJaWYgKHZhbCAmJiAhKHN0LT5yeFswXSAmIHByb3RlY3RfbWFzaykpCiAJCXJldCA9IHNjYTMwMDBfd3JpdGVfcmVnKHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsCiAJCQkJCShzdC0+cnhbMF0gfCBTQ0EzMDAwX0ZSRUVfRkFMTF9ERVRFQ1QpKTsKQEAgLTk3Miw3ICs5NTIsNyBAQAogfQogCiAvKioKLSAqIHNjYTMwMDBfc2V0X21vX2RldCgpIHNpbXBsZSBvbiBvZmYgY29udHJvbCBmb3IgbW90aW9uIGRldGVjdG9yCisgKiBzY2EzMDAwX3dyaXRlX2V2ZW50X2NvbmZpZygpIHNpbXBsZSBvbiBvZmYgY29udHJvbCBmb3IgbW90aW9uIGRldGVjdG9yCiAgKgogICogVGhpcyBpcyBhIHBlciBheGlzIGNvbnRyb2wsIGJ1dCBlbmFibGluZyBhbnkgd2lsbCByZXN1bHQgaW4gdGhlCiAgKiBtb3Rpb24gZGV0ZWN0b3IgdW5pdCBiZWluZyBlbmFibGVkLgpAQCAtOTkyLDEzICs5NzIsMTUgQEAKIAlpbnQgbnVtID0gY2hhbi0+Y2hhbm5lbDI7CiAKIAltdXRleF9sb2NrKCZzdC0+bG9jayk7Ci0JLyogRmlyc3QgcmVhZCB0aGUgbW90aW9uIGRldGVjdG9yIGNvbmZpZyB0byBmaW5kIG91dCBpZgotCSAqIHRoaXMgYXhpcyBpcyBvbiovCisJLyoKKwkgKiBGaXJzdCByZWFkIHRoZSBtb3Rpb24gZGV0ZWN0b3IgY29uZmlnIHRvIGZpbmQgb3V0IGlmCisJICogdGhpcyBheGlzIGlzIG9uCisJICovCiAJcmV0ID0gc2NhMzAwMF9yZWFkX2N0cmxfcmVnKHN0LCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9NRF9DVFJMKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0X3BvaW50OwogCWN0cmx2YWwgPSByZXQ7Ci0JLyogT2ZmIGFuZCBzaG91bGQgYmUgb24gKi8KKwkvKiBpZiBvZmYgYW5kIHNob3VsZCBiZSBvbiAqLwogCWlmIChzdGF0ZSAmJiAhKGN0cmx2YWwgJiBzY2EzMDAwX2FkZHJlc3Nlc1tudW1dWzJdKSkgewogCQlyZXQgPSBzY2EzMDAwX3dyaXRlX2N0cmxfcmVnKHN0LAogCQkJCQkgICAgIFNDQTMwMDBfUkVHX0NUUkxfU0VMX01EX0NUUkwsCkBAIC0xMDIxLDcgKzEwMDMsNyBAQAogCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdF9wb2ludDsKLQkvKmlmIG9mZiBhbmQgc2hvdWxkIGJlIG9uKi8KKwkvKiBpZiBvZmYgYW5kIHNob3VsZCBiZSBvbiAqLwogCWlmICgoc3QtPm1vX2RldF91c2VfY291bnQpCiAJICAgICYmICgoc3QtPnJ4WzBdICYgcHJvdGVjdF9tYXNrKSAhPSBTQ0EzMDAwX01FQVNfTU9ERV9NT1RfREVUKSkKIAkJcmV0ID0gc2NhMzAwMF93cml0ZV9yZWcoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwKQEAgLTEwNjcsNyArMTA0OSw3IEBACiAgKiBEZXZpY2VzIHVzZSBmbGFzaCBtZW1vcnkgdG8gc3RvcmUgbWFueSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzCiAgKiBhbmQgaGVuY2UgY2FuIGNvbWUgdXAgaW4gc29tZXdoYXQgdW5wcmVkaWN0YWJsZSBzdGF0ZXMuCiAgKiBIZW5jZSByZXNldCBldmVyeXRoaW5nIG9uIGRyaXZlciBsb2FkLgotICAqKi8KKyAqKi8KIHN0YXRpYyBpbnQgc2NhMzAwMF9jbGVhbl9zZXR1cChzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QpCiB7CiAJaW50IHJldDsKQEAgLTExMDcsOSArMTA4OSwxMSBAQAogCQkJCXwgU0NBMzAwMF9JTlRfTUFTS19BQ1RJVkVfTE9XKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKLQkvKiBTZWxlY3Qgbm9ybWFsIG1lYXN1cmVtZW50IG1vZGUsIGZyZWUgZmFsbCBvZmYsIHJpbmcgb2ZmICovCi0JLyogUmluZyBpbiAxMiBiaXQgbW9kZSAtIGl0IGlzIGZpbmUgdG8gb3ZlcndyaXRlIHJlc2VydmVkIGJpdHMgMyw1Ci0JICogYXMgdGhhdCBvY2N1cnMgaW4gb25lIG9mIHRoZSBleGFtcGxlIG9uIHRoZSBkYXRhc2hlZXQgKi8KKwkvKgorCSAqIFNlbGVjdCBub3JtYWwgbWVhc3VyZW1lbnQgbW9kZSwgZnJlZSBmYWxsIG9mZiwgcmluZyBvZmYKKwkgKiBSaW5nIGluIDEyIGJpdCBtb2RlIC0gaXQgaXMgZmluZSB0byBvdmVyd3JpdGUgcmVzZXJ2ZWQgYml0cyAzLDUKKwkgKiBhcyB0aGF0IG9jY3VycyBpbiBvbmUgb2YgdGhlIGV4YW1wbGUgb24gdGhlIGRhdGFzaGVldAorCSAqLwogCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmV0OwpAQCAtMTEzMywxNiArMTExNyw2IEBACiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc2NhMzAwMF9pbmZvX3dpdGhfdGVtcCA9IHsKLQkuYXR0cnMgPSAmc2NhMzAwMF9hdHRyaWJ1dGVfZ3JvdXBfd2l0aF90ZW1wLAotCS5yZWFkX3JhdyA9ICZzY2EzMDAwX3JlYWRfcmF3LAotCS5yZWFkX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfcmVhZF90aHJlc2gsCi0JLndyaXRlX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfd3JpdGVfdGhyZXNoLAotCS5yZWFkX2V2ZW50X2NvbmZpZyA9ICZzY2EzMDAwX3JlYWRfZXZlbnRfY29uZmlnLAotCS53cml0ZV9ldmVudF9jb25maWcgPSAmc2NhMzAwMF93cml0ZV9ldmVudF9jb25maWcsCi0JLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKLX07Ci0KIHN0YXRpYyBpbnQgc2NhMzAwMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCWludCByZXQ7CkBAIC0xMTYyLDEwICsxMTM2LDEyIEBACiAKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJaW5kaW9fZGV2LT5uYW1lID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKLQlpZiAoc3QtPmluZm8tPnRlbXBfb3V0cHV0KQotCQlpbmRpb19kZXYtPmluZm8gPSAmc2NhMzAwMF9pbmZvX3dpdGhfdGVtcDsKLQllbHNlIHsKLQkJaW5kaW9fZGV2LT5pbmZvID0gJnNjYTMwMDBfaW5mbzsKKwlpbmRpb19kZXYtPmluZm8gPSAmc2NhMzAwMF9pbmZvOworCWlmIChzdC0+aW5mby0+dGVtcF9vdXRwdXQpIHsKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHNjYTMwMDBfY2hhbm5lbHNfd2l0aF90ZW1wOworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9CisJCQlBUlJBWV9TSVpFKHNjYTMwMDBfY2hhbm5lbHNfd2l0aF90ZW1wKTsKKwl9IGVsc2UgewogCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gc2NhMzAwMF9jaGFubmVsczsKIAkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHNjYTMwMDBfY2hhbm5lbHMpOwogCX0KQEAgLTEyMzYsNyArMTIxMiw3IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwogCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLQkvKiBNdXN0IGVuc3VyZSBubyBpbnRlcnJ1cHRzIGNhbiBiZSBnZW5lcmF0ZWQgYWZ0ZXIgdGhpcyEqLworCS8qIE11c3QgZW5zdXJlIG5vIGludGVycnVwdHMgY2FuIGJlIGdlbmVyYXRlZCBhZnRlciB0aGlzISAqLwogCXNjYTMwMDBfc3RvcF9hbGxfaW50ZXJydXB0cyhzdCk7CiAJaWYgKHNwaS0+aXJxKQogCQlmcmVlX2lycShzcGktPmlycSwgaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfcmluZy5jCmluZGV4IGVhMGFmNmQuLjE5ODcxMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAJaWYgKHN0YXRlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInN1cHBvc2VkbHkgZW5hYmxpbmcgcmluZyBidWZmZXJcbiIpOworCQlkZXZfaW5mbygmaW5kaW9fZGV2LT5kZXYsICJzdXBwb3NlZGx5IGVuYWJsaW5nIHJpbmcgYnVmZmVyXG4iKTsKIAkJcmV0ID0gc2NhMzAwMF93cml0ZV9yZWcoc3QsCiAJCQkJCVNDQTMwMDBfUkVHX0FERFJfTU9ERSwKIAkJCQkJKHN0LT5yeFswXSB8IFNDQTMwMDBfUklOR19CVUZfRU5BQkxFKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXguaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eC5oCmluZGV4IGE1OTFhYTYuLmZjOGM4NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eC5oCkBAIC05NSw3ICs5NSw3IEBACiAJc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7CiAJY29uc3Qgc3RydWN0IGFkNzk5eF9jaGlwX2luZm8JKmNoaXBfaW5mbzsKIAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOwotCXUxNgkJCQlpbnRfdnJlZl9tdjsKKwlzdHJ1Y3QgcmVndWxhdG9yCQkqdnJlZjsKIAl1bnNpZ25lZAkJCWlkOwogCXUxNgkJCQljb25maWc7CiAKQEAgLTEwMywxNCArMTAzLDYgQEAKIAl1bnNpZ25lZCBpbnQJCQl0cmFuc2Zlcl9zaXplOwogfTsKIAotLyoKLSAqIFRPRE86IHN0cnVjdCBhZDc5OXhfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCi0gKi8KLQotc3RydWN0IGFkNzk5eF9wbGF0Zm9ybV9kYXRhIHsKLQl1MTYJCQkJdnJlZl9tdjsKLX07Ci0KICNpZmRlZiBDT05GSUdfQUQ3OTlYX1JJTkdfQlVGRkVSCiBpbnQgYWQ3OTl4X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIGFkNzk5eF9yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4X2NvcmUuYwppbmRleCA1NzA4ZmZjLi45NzllYzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eF9jb3JlLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogaWlvL2FkYy9hZDc5OXguYwotICogQ29weXJpZ2h0IChDKSAyMDEwLTEwMTEgTWljaGFlbCBIZW5uZXJpY2gsIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIE1pY2hhZWwgSGVubmVyaWNoLCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogYmFzZWQgb24gaWlvL2FkYy9tYXgxMzYzCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBKb25hdGhhbiBDYW1lcm9uCkBAIC0xNzksNyArMTc5LDEwIEBACiAJCQlSRVNfTUFTSyhjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpOwogCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgotCQkqdmFsID0gc3QtPmludF92cmVmX212OworCQlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnZyZWYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSByZXQgLyAxMDAwOwogCQkqdmFsMiA9IGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0czsKIAkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOwogCX0KQEAgLTUzMyw3ICs1MzYsNiBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhZDc5OXhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTU1MSwxNyArNTUzLDIxIEBACiAKIAkvKiBUT0RPOiBBZGQgcGRhdGEgb3B0aW9ucyBmb3IgZmlsdGVyaW5nIGFuZCBiaXQgZGVsYXkgKi8KIAotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3QtPmludF92cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7Ci0KIAlzdC0+cmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZjbGllbnQtPmRldiwgInZjYyIpOwotCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCWlmIChJU19FUlIoc3QtPnJlZykpCisJCXJldHVybiBQVFJfRVJSKHN0LT5yZWcpOworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzdC0+dnJlZiA9IGRldm1fcmVndWxhdG9yX2dldCgmY2xpZW50LT5kZXYsICJ2cmVmIik7CisJaWYgKElTX0VSUihzdC0+dnJlZikpIHsKKwkJcmV0ID0gUFRSX0VSUihzdC0+dnJlZik7CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CiAJfQorCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnZyZWYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisKIAlzdC0+Y2xpZW50ID0gY2xpZW50OwogCiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwpAQCAtNTc3LDI4ICs1ODMsMjggQEAKIAkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAogCWlmIChjbGllbnQtPmlycSA+IDApIHsKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsCi0JCQkJCSAgIE5VTEwsCi0JCQkJCSAgIGFkNzk5eF9ldmVudF9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1RSSUdHRVJfRkFMTElORyB8Ci0JCQkJCSAgIElSUUZfT05FU0hPVCwKLQkJCQkJICAgY2xpZW50LT5uYW1lLAotCQkJCQkgICBpbmRpb19kZXYpOworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZjbGllbnQtPmRldiwKKwkJCQkJCWNsaWVudC0+aXJxLAorCQkJCQkJTlVMTCwKKwkJCQkJCWFkNzk5eF9ldmVudF9oYW5kbGVyLAorCQkJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfAorCQkJCQkJSVJRRl9PTkVTSE9ULAorCQkJCQkJY2xpZW50LT5uYW1lLAorCQkJCQkJaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3JfY2xlYW51cF9yaW5nOwogCX0KIAlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2lycTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jpbmc7CiAKIAlyZXR1cm4gMDsKIAotZXJyb3JfZnJlZV9pcnE6Ci0JaWYgKGNsaWVudC0+aXJxID4gMCkKLQkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7CiBlcnJvcl9jbGVhbnVwX3Jpbmc6CiAJYWQ3OTl4X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOwogZXJyb3JfZGlzYWJsZV9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnZyZWYpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+dnJlZik7CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCkBAIC02MTEsMTAgKzYxNywxMCBAQAogCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChjbGllbnQtPmlycSA+IDApCi0JCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOwogCiAJYWQ3OTl4X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOworCWlmICghSVNfRVJSKHN0LT52cmVmKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnZyZWYpOwogCWlmICghSVNfRVJSKHN0LT5yZWcpKQogCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKIAlrZnJlZShzdC0+cnhfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL214cy1scmFkYy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMKaW5kZXggNTE0ODQ0ZS4uMTFmYjk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMKQEAgLTg0Nyw3ICs4NDcsOCBAQAogCW14c19scmFkY19yZWdfY2xlYXIobHJhZGMsIDB4ZmYsIExSQURDX0NUUkwwKTsKIAogCS8qIENsZWFuIHRoZSBzbG90J3MgcHJldmlvdXMgY29udGVudCwgdGhlbiBzZXQgbmV3IG9uZS4gKi8KLQlteHNfbHJhZGNfcmVnX2NsZWFyKGxyYWRjLCBMUkFEQ19DVFJMNF9MUkFEQ1NFTEVDVF9NQVNLKDApLCBMUkFEQ19DVFJMNCk7CisJbXhzX2xyYWRjX3JlZ19jbGVhcihscmFkYywgTFJBRENfQ1RSTDRfTFJBRENTRUxFQ1RfTUFTSygwKSwKKwkJCUxSQURDX0NUUkw0KTsKIAlteHNfbHJhZGNfcmVnX3NldChscmFkYywgY2hhbiwgTFJBRENfQ1RSTDQpOwogCiAJbXhzX2xyYWRjX3JlZ193cnQobHJhZGMsIDAsIExSQURDX0NIKDApKTsKQEAgLTg5OCwxMCArODk5LDYgQEAKIHsKIAlzdHJ1Y3QgbXhzX2xyYWRjICpscmFkYyA9IGlpb19wcml2KGlpb19kZXYpOwogCi0JLyogQ2hlY2sgZm9yIGludmFsaWQgY2hhbm5lbCAqLwotCWlmIChjaGFuLT5jaGFubmVsID4gTFJBRENfTUFYX1RPVEFMX0NIQU5TKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXN3aXRjaCAobSkgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CiAJCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKQpAQCAtMTE3Myw3ICsxMTcwLDggQEAKIAllbHNlIGlmIChyZWcgJiBMUkFEQ19DVFJMMV9MUkFEQ19JUlEoMCkpCiAJCWNvbXBsZXRlKCZscmFkYy0+Y29tcGxldGlvbik7CiAKLQlteHNfbHJhZGNfcmVnX2NsZWFyKGxyYWRjLCByZWcgJiBteHNfbHJhZGNfaXJxX21hc2sobHJhZGMpLCBMUkFEQ19DVFJMMSk7CisJbXhzX2xyYWRjX3JlZ19jbGVhcihscmFkYywgcmVnICYgbXhzX2xyYWRjX2lycV9tYXNrKGxyYWRjKSwKKwkJCUxSQURDX0NUUkwxKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTEyNjQsNyArMTI2Miw4IEBACiAJdWludDMyX3QgY3RybDFfaXJxID0gMDsKIAljb25zdCB1aW50MzJfdCBjaGFuX3ZhbHVlID0gTFJBRENfQ0hfQUNDVU1VTEFURSB8CiAJCSgoTFJBRENfREVMQVlfVElNRVJfTE9PUCAtIDEpIDw8IExSQURDX0NIX05VTV9TQU1QTEVTX09GRlNFVCk7Ci0JY29uc3QgaW50IGxlbiA9IGJpdG1hcF93ZWlnaHQoaWlvLT5hY3RpdmVfc2Nhbl9tYXNrLCBMUkFEQ19NQVhfVE9UQUxfQ0hBTlMpOworCWNvbnN0IGludCBsZW4gPSBiaXRtYXBfd2VpZ2h0KGlpby0+YWN0aXZlX3NjYW5fbWFzaywKKwkJCUxSQURDX01BWF9UT1RBTF9DSEFOUyk7CiAKIAlpZiAoIWxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTYzLDcgKzE1NjIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBvZl9jZmctPmlycV9jb3VudDsgaSsrKSB7CiAJCWxyYWRjLT5pcnFbaV0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwogCQlpZiAobHJhZGMtPmlycVtpXSA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBscmFkYy0+aXJxW2ldOwogCiAJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBscmFkYy0+aXJxW2ldLAogCQkJCQlteHNfbHJhZGNfaGFuZGxlX2lycSwgMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMKaW5kZXggMTZhODIwMS4uOWYwZWJiMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCkBAIC04NTksMTEgKzg1OSwxNCBAQAogCWVsc2UgewogCQlzd2l0Y2ggKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykgewogCQljYXNlIEFEVDczMTZfREFfRU5fTU9ERV9TSU5HTEU6Ci0JCQlyZXR1cm4gc3ByaW50ZihidWYsICIwIC0gYXV0byBhdCBhbnkgTVNCIERBQyB3cml0aW5nXG4iKTsKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJCQkiMCAtIGF1dG8gYXQgYW55IE1TQiBEQUMgd3JpdGluZ1xuIik7CiAJCWNhc2UgQURUNzMxNl9EQV9FTl9NT0RFX0FCX0NEOgotCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAtIGF1dG8gYXQgTVNCIERBQyBBQiBhbmQgQ0Qgd3JpdGluZ1xuIik7CisJCQlyZXR1cm4gc3ByaW50ZihidWYsCisJCQkJIjEgLSBhdXRvIGF0IE1TQiBEQUMgQUIgYW5kIENEIHdyaXRpbmdcbiIpOwogCQljYXNlIEFEVDczMTZfREFfRU5fTU9ERV9BQkNEOgotCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMiAtIGF1dG8gYXQgTVNCIERBQyBBQkNEIHdyaXRpbmdcbiIpOworCQkJcmV0dXJuIHNwcmludGYoYnVmLAorCQkJCSIyIC0gYXV0byBhdCBNU0IgREFDIEFCQ0Qgd3JpdGluZ1xuIik7CiAJCWRlZmF1bHQ6IC8qIEFEVDczMTZfREFfRU5fTU9ERV9MREFDICovCiAJCQlyZXR1cm4gc3ByaW50ZihidWYsICIzIC0gbWFudWFsXG4iKTsKIAkJfQpAQCAtMTEwMiw3ICsxMTA1LDggQEAKIAkJCWxkYWNfY29uZmlnID0gY2hpcC0+bGRhY19jb25maWcgfCBBRFQ3MzE2X0RBQ19JTl9WUkVGOwogCX0KIAotCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0xEQUNfQ09ORklHLCBsZGFjX2NvbmZpZyk7CisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfTERBQ19DT05GSUcsCisJCQlsZGFjX2NvbmZpZyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTEyMjQsNyArMTIyOCw4IEBACiAJcmV0dXJuIGFkdDczMTZfc2hvd19hZChjaGlwLCBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9FWCwgYnVmKTsKIH0KIAotc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX0FJTjEsIFNfSVJVR08sIGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX0FJTjEsIFNfSVJVR08sIGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEsCisJCU5VTEwsIDApOwogc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfZXhfdGVtcF9BSU4xLCBOVUxMLCAwKTsKIAogc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0FJTjIoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTMxOSw3ICsxMzI0LDggQEAKIAlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKIAotCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfSU5fVEVNUF9PRkZTRVQsIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChjaGlwLCBBRFQ3MzE2X0lOX1RFTVBfT0ZGU0VULCBidWYsCisJCQlsZW4pOwogfQogCiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3RlbXBfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKQEAgLTEzNDQsNyArMTM1MCw4IEBACiAJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7CiAKLQlyZXR1cm4gYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChjaGlwLCBBRFQ3MzE2X0VYX1RFTVBfT0ZGU0VULCBidWYsIGxlbik7CisJcmV0dXJuIGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoY2hpcCwgQURUNzMxNl9FWF9URU1QX09GRlNFVCwgYnVmLAorCQkJbGVuKTsKIH0KIAogc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCmluZGV4IDJkYmZiNDkuLmVjNTBiZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCkBAIC0xOCwxMCArMTgsMTAgQEAKIAl2b2lkICpjbGllbnQ7CiAJaW50IGlycTsKIAlpbnQgaXJxX2ZsYWdzOwotCWludCAoKnJlYWQpICh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggKmRhdGEpOwotCWludCAoKndyaXRlKSAodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCk7Ci0JaW50ICgqbXVsdGlfcmVhZCkgKHZvaWQgKmNsaWVudCwgdTggZmlyc3RfcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpOwotCWludCAoKm11bHRpX3dyaXRlKSAodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7CisJaW50ICgqcmVhZCkodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4ICpkYXRhKTsKKwlpbnQgKCp3cml0ZSkodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCk7CisJaW50ICgqbXVsdGlfcmVhZCkodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7CisJaW50ICgqbXVsdGlfd3JpdGUpKHZvaWQgKmNsaWVudCwgdTggZmlyc3RfcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpOwogfTsKIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwppbmRleCBmOGM2NTk1Li4wYTYwZGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJCQkJCVRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwsIHV0bXApOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAidGFvc19jaGlwX29uIGZhaWxlZCBvbiBDTlRSTCByZWcuXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIFVzZSB0aGUgZm9sbG93aW5nIHNoYWRvdyBjb3B5IGZvciBvdXIgZGVsYXkgYmVmb3JlIGVuYWJsaW5nIEFEQy4KQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCiAJCQkJInRhb3NfY2hpcF9vbiBmYWlsZWQgb24gcmVnICVkLlxuIiwgaSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCkBAIC00NTgsNyArNDU4LDcgQEAKIAkJCQkJdXRtcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2NoaXBfb24gZmFpbGVkIG9uIDJuZCBDVFJMIHJlZy5cbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiByZXQ7CiAJfQogCWNoaXAtPnRhb3NfY2hpcF9zdGF0dXMgPSBUU0wyNThYX0NISVBfV09SS0lORzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyeDd4X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMng3eF9jb3JlLmMKaW5kZXggMWU1MzgwOC4uOWUwZjJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyeDd4X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDJ4N3hfY29yZS5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAkJLyogZGV2aWNlIGlzIG5vdCBlbmFibGVkICovCiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiJXM6IGRldmljZSBpcyBub3QgZW5hYmxlZFxuIiwKIAkJCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FQlVTWSA7CisJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIApAQCAtMTUwNywxNiArMTUwNywxNiBAQAogCWNhc2UgdHNsMjU3MToKIAljYXNlIHRzbDI2NzE6CiAJY2FzZSB0c2wyNzcxOgotCQlyZXR1cm4gKCgqaWQgJiAweGYwKSA9PSBUUklUT05fSUQpOworCQlyZXR1cm4gKCppZCAmIDB4ZjApID09IFRSSVRPTl9JRDsKIAljYXNlIHRtZDI2NzE6CiAJY2FzZSB0bWQyNzcxOgotCQlyZXR1cm4gKCgqaWQgJiAweGYwKSA9PSBIQUxJQlVUX0lEKTsKKwkJcmV0dXJuICgqaWQgJiAweGYwKSA9PSBIQUxJQlVUX0lEOwogCWNhc2UgdHNsMjU3MjoKIAljYXNlIHRzbDI2NzI6CiAJY2FzZSB0bWQyNjcyOgogCWNhc2UgdHNsMjc3MjoKIAljYXNlIHRtZDI3NzI6Ci0JCXJldHVybiAoKCppZCAmIDB4ZjApID09IFNXT1JERklTSF9JRCk7CisJCXJldHVybiAoKmlkICYgMHhmMCkgPT0gU1dPUkRGSVNIX0lEOwogCX0KIAogCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCmluZGV4IDY5NjZkNWYuLjdmYmFiYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCWlmIChzdC0+cGRhdGEtPmdwaW9pbikgewogCQlkYXRhID0gYWQyczEyMTBfcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CiAJCWlmIChkYXRhICE9IHN0LT5yZXNvbHV0aW9uKQotCQkJcHJfd2FybmluZygiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKKwkJCXByX3dhcm4oImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CiAJfSBlbHNlCiAJCWFkMnMxMjEwX3NldF9yZXNvbHV0aW9uX3BpbihzdCk7CiAKQEAgLTM3Miw3ICszNzIsNyBAQAogCWlmIChzdC0+cGRhdGEtPmdwaW9pbikgewogCQlkYXRhID0gYWQyczEyMTBfcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CiAJCWlmIChkYXRhICE9IHN0LT5yZXNvbHV0aW9uKQotCQkJcHJfd2FybmluZygiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKKwkJCXByX3dhcm4oImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CiAJfSBlbHNlCiAJCWFkMnMxMjEwX3NldF9yZXNvbHV0aW9uX3BpbihzdCk7CiAJcmV0ID0gbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL0tjb25maWcKaW5kZXggNzgzMTlhZC4uYzZlOGJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9LY29uZmlnCkBAIC0yMCw2ICsyMCw3IEBACiAKIGNvbmZpZyBEUk1fSU1YX1BBUkFMTEVMX0RJU1BMQVkKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgcGFyYWxsZWwgZGlzcGxheXMiCisJc2VsZWN0IERSTV9QQU5FTAogCWRlcGVuZHMgb24gRFJNX0lNWAogCXNlbGVjdCBWSURFT01PREVfSEVMUEVSUwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCmluZGV4IDQ2Nzc1ODUuLjEyOWUzYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL01ha2VmaWxlCkBAIC0xLDEyICsxLDExIEBACiAKLWlteGRybS1vYmpzIDo9IGlteC1kcm0tY29yZS5vIGlteC1mYi5vCitpbXhkcm0tb2JqcyA6PSBpbXgtZHJtLWNvcmUubwogCiBvYmotJChDT05GSUdfRFJNX0lNWCkgKz0gaW14ZHJtLm8KIAogb2JqLSQoQ09ORklHX0RSTV9JTVhfUEFSQUxMRUxfRElTUExBWSkgKz0gcGFyYWxsZWwtZGlzcGxheS5vCiBvYmotJChDT05GSUdfRFJNX0lNWF9UVkUpICs9IGlteC10dmUubwogb2JqLSQoQ09ORklHX0RSTV9JTVhfTERCKSArPSBpbXgtbGRiLm8KLW9iai0kKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikgKz0gaW14LWZiZGV2Lm8KIG9iai0kKENPTkZJR19EUk1fSU1YX0lQVVYzX0NPUkUpICs9IGlwdS12My8KIAogaW14LWlwdXYzLWNydGMtb2JqcyAgOj0gaXB1djMtY3J0Yy5vIGlwdXYzLXBsYW5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9UT0RPCmluZGV4IDZhOWRhOTQuLjI5NjM2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vVE9ETwpAQCAtMSwxNSArMSwxMCBAQAogVE9ETzoKIC0gZ2V0IERSTSBNYWludGFpbmVyIHJldmlldyBmb3IgdGhpcyBjb2RlCi0tIFdhaXQgZm9yIGNvbW1vbiBkaXNwbGF5IGZyYW1ld29yayB0byBoaXQgbWFpbmxpbmUgYW5kIHVwZGF0ZSB0aGUgSVBVCi0gIGRyaXZlciB0byB1c2UgaXQuIFRoaXMgd2lsbCBtb3N0IHByb2JhYmx5IG1ha2UgY2hhbmdlcyB0byB0aGUgZGV2aWNldHJlZQotICBiaW5kaW5ncyBuZWNlc3NhcnkuCi0tIEZhY3RvciBvdXQgbW9yZSBjb2RlIHRvIGNvbW1vbiBoZWxwZXIgZnVuY3Rpb25zCiAtIGRlY2lkZSB3aGVyZSB0byBwdXQgdGhlIGJhc2UgZHJpdmVyLiBJdCBpcyBub3Qgc3BlY2lmaWMgdG8gYSBzdWJzeXN0ZW0KICAgYW5kIHdvdWxkIGJlIHVzZWQgYnkgRFJNL0tNUyBhbmQgbWVkaWEvVjRMMgogCiBNaXNzaW5nIGZlYXR1cmVzIChub3QgbmVjZXNzYXJpbHkgZm9yIG1vdmluZyBvdXQgb2Ygc3RhZ2luZyk6CiAKLS0gQWRkIGkuTVg2IEhETUkgc3VwcG9ydAogLSBBZGQgc3VwcG9ydCBmb3IgSUMgKEltYWdlIGNvbnZlcnRlcikKIC0gQWRkIHN1cHBvcnQgZm9yIENTSSAoQ01PUyBTZW5zb3IgaW50ZXJmYWNlKQogLSBBZGQgc3VwcG9ydCBmb3IgVkRJQyAoVmlkZW8gRGVpbnRlcmxhY2VyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWRybS1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYwppbmRleCAyMzZlZDY2Li40MTQ0YTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLWNvcmUuYwpAQCAtMTMsMTQgKzEzLDE1IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqLwotCisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2dlbV9jbWFfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9jbWFfaGVscGVyLmg+CiAKQEAgLTI4LDQ1ICsyOSwyOSBAQAogCiAjZGVmaW5lIE1BWF9DUlRDCTQKIAotc3RydWN0IGNydGNfY29va2llIHsKLQl2b2lkICpjb29raWU7Ci0JaW50IGlkOworc3RydWN0IGlteF9kcm1fY3J0YzsKKworc3RydWN0IGlteF9kcm1fY29tcG9uZW50IHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAogc3RydWN0IGlteF9kcm1fZGV2aWNlIHsKIAlzdHJ1Y3QgZHJtX2RldmljZQkJCSpkcm07Ci0Jc3RydWN0IGRldmljZQkJCQkqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQJCQljcnRjX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJCWVuY29kZXJfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJY29ubmVjdG9yX2xpc3Q7Ci0Jc3RydWN0IG11dGV4CQkJCW11dGV4OworCXN0cnVjdCBpbXhfZHJtX2NydGMJCQkqY3J0Y1tNQVhfQ1JUQ107CiAJaW50CQkJCQlwaXBlczsKIAlzdHJ1Y3QgZHJtX2ZiZGV2X2NtYQkJCSpmYmhlbHBlcjsKIH07CiAKIHN0cnVjdCBpbXhfZHJtX2NydGMgewogCXN0cnVjdCBkcm1fY3J0YwkJCQkqY3J0YzsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJbGlzdDsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UJCQkqaW14ZHJtOwogCWludAkJCQkJcGlwZTsKIAlzdHJ1Y3QgaW14X2RybV9jcnRjX2hlbHBlcl9mdW5jcwlpbXhfZHJtX2hlbHBlcl9mdW5jczsKLQlzdHJ1Y3QgbW9kdWxlCQkJCSpvd25lcjsKLQlzdHJ1Y3QgY3J0Y19jb29raWUJCQljb29raWU7CisJc3RydWN0IGRldmljZV9ub2RlCQkJKnBvcnQ7CiB9OwogCi1zdHJ1Y3QgaW14X2RybV9lbmNvZGVyIHsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIJCQkqZW5jb2RlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJbGlzdDsKLQlzdHJ1Y3QgbW9kdWxlCQkJCSpvd25lcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJcG9zc2libGVfY3J0Y3M7Ci19OwotCi1zdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgewotCXN0cnVjdCBkcm1fY29ubmVjdG9yCQkJKmNvbm5lY3RvcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkJbGlzdDsKLQlzdHJ1Y3QgbW9kdWxlCQkJCSpvd25lcjsKLX07CitzdGF0aWMgaW50IGxlZ2FjeWZiX2RlcHRoID0gMTY7Cittb2R1bGVfcGFyYW0obGVnYWN5ZmJfZGVwdGgsIGludCwgMDQ0NCk7CiAKIGludCBpbXhfZHJtX2NydGNfaWQoc3RydWN0IGlteF9kcm1fY3J0YyAqY3J0YykKIHsKQEAgLTc2LDY5ICs2MSw3MSBAQAogCiBzdGF0aWMgdm9pZCBpbXhfZHJtX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKIHsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikKIAlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7CiAKIAlpZiAoaW14ZHJtLT5mYmhlbHBlcikKIAkJZHJtX2ZiZGV2X2NtYV9yZXN0b3JlX21vZGUoaW14ZHJtLT5mYmhlbHBlcik7CisjZW5kaWYKIH0KIAogc3RhdGljIGludCBpbXhfZHJtX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKIHsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSU1YX0ZCX0hFTFBFUikKIAlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7CisjZW5kaWYKIAotCWlteF9kcm1fZGV2aWNlX3B1dCgpOworCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkcm0pOworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0lNWF9GQl9IRUxQRVIpCisJaWYgKGlteGRybS0+ZmJoZWxwZXIpCisJCWRybV9mYmRldl9jbWFfZmluaShpbXhkcm0tPmZiaGVscGVyKTsKKyNlbmRpZgorCisJY29tcG9uZW50X3VuYmluZF9hbGwoZHJtLT5kZXYsIGRybSk7CiAKIAlkcm1fdmJsYW5rX2NsZWFudXAoZHJtKTsKLQlkcm1fa21zX2hlbHBlcl9wb2xsX2ZpbmkoZHJtKTsKIAlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkcm0pOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBXZSBkb24ndCBjYXJlIGF0IGFsbCBmb3IgY3J0YyBudW1iZXJzLCBidXQgdGhlIGNvcmUgZXhwZWN0cyB0aGUKLSAqIGNydGNzIHRvIGJlIG51bWJlcmVkCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGNfYnlfbnVtKHN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtLAotCQlpbnQgbnVtKQorc3RhdGljIHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fZmluZF9jcnRjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKLQlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGM7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlteF9kcm1fY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KQotCQlpZiAoaW14X2RybV9jcnRjLT5waXBlID09IG51bSkKLQkJCXJldHVybiBpbXhfZHJtX2NydGM7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DUlRDOyBpKyspCisJCWlmIChpbXhkcm0tPmNydGNbaV0gJiYgaW14ZHJtLT5jcnRjW2ldLT5jcnRjID09IGNydGMpCisJCQlyZXR1cm4gaW14ZHJtLT5jcnRjW2ldOworCiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0X3BpbnMoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MzIgZW5jb2Rlcl90eXBlLAoraW50IGlteF9kcm1fcGFuZWxfZm9ybWF0X3BpbnMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQl1MzIgaW50ZXJmYWNlX3BpeF9mbXQsIGludCBoc3luY19waW4sIGludCB2c3luY19waW4pCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9jcnRjOwogCXN0cnVjdCBpbXhfZHJtX2NydGNfaGVscGVyX2Z1bmNzICpoZWxwZXI7CisJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2NydGM7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlteF9jcnRjLCAmaW14ZHJtLT5jcnRjX2xpc3QsIGxpc3QpCi0JCWlmIChpbXhfY3J0Yy0+Y3J0YyA9PSBjcnRjKQotCQkJZ290byBmb3VuZDsKKwlpbXhfY3J0YyA9IGlteF9kcm1fZmluZF9jcnRjKGVuY29kZXItPmNydGMpOworCWlmICghaW14X2NydGMpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIC1FSU5WQUw7Ci1mb3VuZDoKIAloZWxwZXIgPSAmaW14X2NydGMtPmlteF9kcm1faGVscGVyX2Z1bmNzOwogCWlmIChoZWxwZXItPnNldF9pbnRlcmZhY2VfcGl4X2ZtdCkKLQkJcmV0dXJuIGhlbHBlci0+c2V0X2ludGVyZmFjZV9waXhfZm10KGNydGMsCi0JCQkJZW5jb2Rlcl90eXBlLCBpbnRlcmZhY2VfcGl4X2ZtdCwKKwkJcmV0dXJuIGhlbHBlci0+c2V0X2ludGVyZmFjZV9waXhfZm10KGVuY29kZXItPmNydGMsCisJCQkJZW5jb2Rlci0+ZW5jb2Rlcl90eXBlLCBpbnRlcmZhY2VfcGl4X2ZtdCwKIAkJCQloc3luY19waW4sIHZzeW5jX3Bpbik7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0X3BpbnMpOworRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9wYW5lbF9mb3JtYXRfcGlucyk7CiAKLWludCBpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTMyIGVuY29kZXJfdHlwZSwKLQkJdTMyIGludGVyZmFjZV9waXhfZm10KQoraW50IGlteF9kcm1fcGFuZWxfZm9ybWF0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdTMyIGludGVyZmFjZV9waXhfZm10KQogewotCXJldHVybiBpbXhfZHJtX2NydGNfcGFuZWxfZm9ybWF0X3BpbnMoY3J0YywgZW5jb2Rlcl90eXBlLAotCQkJCQkgICAgICBpbnRlcmZhY2VfcGl4X2ZtdCwgMiwgMyk7CisJcmV0dXJuIGlteF9kcm1fcGFuZWxfZm9ybWF0X3BpbnMoZW5jb2RlciwgaW50ZXJmYWNlX3BpeF9mbXQsIDIsIDMpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdCk7CitFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX3BhbmVsX2Zvcm1hdCk7CiAKIGludCBpbXhfZHJtX2NydGNfdmJsYW5rX2dldChzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGMpCiB7CkBAIC0xNjEsMTAgKzE0OCw5IEBACiBzdGF0aWMgaW50IGlteF9kcm1fZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBpbnQgY3J0YykKIHsKIAlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGRybS0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjOworCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YyA9IGlteGRybS0+Y3J0Y1tjcnRjXTsKIAlpbnQgcmV0OwogCi0JaW14X2RybV9jcnRjID0gaW14X2RybV9jcnRjX2J5X251bShpbXhkcm0sIGNydGMpOwogCWlmICghaW14X2RybV9jcnRjKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTgwLDkgKzE2Niw4IEBACiBzdGF0aWMgdm9pZCBpbXhfZHJtX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIGludCBjcnRjKQogewogCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gZHJtLT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfZHJtX2NydGM7CisJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjID0gaW14ZHJtLT5jcnRjW2NydGNdOwogCi0JaW14X2RybV9jcnRjID0gaW14X2RybV9jcnRjX2J5X251bShpbXhkcm0sIGNydGMpOwogCWlmICghaW14X2RybV9jcnRjKQogCQlyZXR1cm47CiAKQEAgLTIxNSwxNzIgKzIwMCw1NCBAQAogCS5sbHNlZWsgPSBub29wX2xsc2VlaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteF9kcm1fZGV2aWNlOwotCi1zdGF0aWMgc3RydWN0IGlteF9kcm1fZGV2aWNlICpfX2lteF9kcm1fZGV2aWNlKHZvaWQpCitpbnQgaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewotCXJldHVybiBpbXhfZHJtX2RldmljZTsKKwlyZXR1cm4gTU9ERV9PSzsKK30KK0VYUE9SVF9TWU1CT0woaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCk7CisKK3ZvaWQgaW14X2RybV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95KTsKKwordm9pZCBpbXhfZHJtX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZW5jb2Rlcl9kZXN0cm95KTsKKworc3RhdGljIHZvaWQgaW14X2RybV9vdXRwdXRfcG9sbF9jaGFuZ2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pCit7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0lNWF9GQl9IRUxQRVIpCisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBkcm0tPmRldl9wcml2YXRlOworCisJZHJtX2ZiZGV2X2NtYV9ob3RwbHVnX2V2ZW50KGlteGRybS0+ZmJoZWxwZXIpOworI2VuZGlmCiB9CiAKLXN0cnVjdCBkcm1fZGV2aWNlICppbXhfZHJtX2RldmljZV9nZXQodm9pZCkKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICplbmM7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICpjb247Ci0Jc3RydWN0IGlteF9kcm1fY3J0YyAqY3J0YzsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jLCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCF0cnlfbW9kdWxlX2dldChlbmMtPm93bmVyKSkgewotCQkJZGV2X2VycihpbXhkcm0tPmRldiwgImNvdWxkIG5vdCBnZXQgbW9kdWxlICVzXG4iLAotCQkJCQltb2R1bGVfbmFtZShlbmMtPm93bmVyKSk7Ci0JCQlnb3RvIHVud2luZF9lbmM7Ci0JCX0KLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbiwgJmlteGRybS0+Y29ubmVjdG9yX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCF0cnlfbW9kdWxlX2dldChjb24tPm93bmVyKSkgewotCQkJZGV2X2VycihpbXhkcm0tPmRldiwgImNvdWxkIG5vdCBnZXQgbW9kdWxlICVzXG4iLAotCQkJCQltb2R1bGVfbmFtZShjb24tPm93bmVyKSk7Ci0JCQlnb3RvIHVud2luZF9jb247Ci0JCX0KLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZpbXhkcm0tPmNydGNfbGlzdCwgbGlzdCkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNydGMtPm93bmVyKSkgewotCQkJZGV2X2VycihpbXhkcm0tPmRldiwgImNvdWxkIG5vdCBnZXQgbW9kdWxlICVzXG4iLAotCQkJCQltb2R1bGVfbmFtZShjcnRjLT5vd25lcikpOwotCQkJZ290byB1bndpbmRfY3J0YzsKLQkJfQotCX0KLQotCXJldHVybiBpbXhkcm0tPmRybTsKLQotdW53aW5kX2NydGM6Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yZXZlcnNlKGNydGMsICZpbXhkcm0tPmNydGNfbGlzdCwgbGlzdCkKLQkJbW9kdWxlX3B1dChjcnRjLT5vd25lcik7Ci11bndpbmRfY29uOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShjb24sICZpbXhkcm0tPmNvbm5lY3Rvcl9saXN0LCBsaXN0KQotCQltb2R1bGVfcHV0KGNvbi0+b3duZXIpOwotdW53aW5kX2VuYzoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UoZW5jLCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QsIGxpc3QpCi0JCW1vZHVsZV9wdXQoZW5jLT5vd25lcik7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCi0JcmV0dXJuIE5VTEw7Ci0KLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZGV2aWNlX2dldCk7Ci0KLXZvaWQgaW14X2RybV9kZXZpY2VfcHV0KHZvaWQpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGlteF9kcm1fZW5jb2RlciAqZW5jOwotCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqY29uOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmNydGM7Ci0KLQltdXRleF9sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KQotCQltb2R1bGVfcHV0KGNydGMtPm93bmVyKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29uLCAmaW14ZHJtLT5jb25uZWN0b3JfbGlzdCwgbGlzdCkKLQkJbW9kdWxlX3B1dChjb24tPm93bmVyKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jLCAmaW14ZHJtLT5lbmNvZGVyX2xpc3QsIGxpc3QpCi0JCW1vZHVsZV9wdXQoZW5jLT5vd25lcik7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9kZXZpY2VfcHV0KTsKLQotc3RhdGljIGludCBkcm1fbW9kZV9ncm91cF9yZWluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX21vZGVfZ3JvdXAgKmdyb3VwID0gJmRldi0+cHJpbWFyeS0+bW9kZV9ncm91cDsKLQl1aW50MzJfdCAqaWRfbGlzdCA9IGdyb3VwLT5pZF9saXN0OwotCWludCByZXQ7Ci0KLQlyZXQgPSBkcm1fbW9kZV9ncm91cF9pbml0X2xlZ2FjeV9ncm91cChkZXYsIGdyb3VwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWtmcmVlKGlkX2xpc3QpOwotCXJldHVybiAwOwotfQorc3RhdGljIHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKKwkuZmJfY3JlYXRlID0gZHJtX2ZiX2NtYV9jcmVhdGUsCisJLm91dHB1dF9wb2xsX2NoYW5nZWQgPSBpbXhfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQsCit9OwogCiAvKgotICogcmVnaXN0ZXIgYW4gZW5jb2RlciB0byB0aGUgZHJtIGNvcmUKLSAqLwotc3RhdGljIGludCBpbXhfZHJtX2VuY29kZXJfcmVnaXN0ZXIoc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmlteF9kcm1fZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MpOwotCi0JZHJtX2VuY29kZXJfaW5pdChpbXhkcm0tPmRybSwgaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyLAotCQkJaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyLT5mdW5jcywKLQkJCWlteF9kcm1fZW5jb2Rlci0+ZW5jb2Rlci0+ZW5jb2Rlcl90eXBlKTsKLQotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHVucmVnaXN0ZXIgYW4gZW5jb2RlciBmcm9tIHRoZSBkcm0gY29yZQotICovCi1zdGF0aWMgdm9pZCBpbXhfZHJtX2VuY29kZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaW14X2RybV9lbmNvZGVyCi0JCSppbXhfZHJtX2VuY29kZXIpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0KLQlkcm1fZW5jb2Rlcl9jbGVhbnVwKGlteF9kcm1fZW5jb2Rlci0+ZW5jb2Rlcik7Ci0KLQlkcm1fbW9kZV9ncm91cF9yZWluaXQoaW14ZHJtLT5kcm0pOwotfQotCi0vKgotICogcmVnaXN0ZXIgYSBjb25uZWN0b3IgdG8gdGhlIGRybSBjb3JlCi0gKi8KLXN0YXRpYyBpbnQgaW14X2RybV9jb25uZWN0b3JfcmVnaXN0ZXIoCi0JCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqaW14X2RybV9jb25uZWN0b3IpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0KLQlkcm1fY29ubmVjdG9yX2luaXQoaW14ZHJtLT5kcm0sIGlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IsCi0JCQlpbXhfZHJtX2Nvbm5lY3Rvci0+Y29ubmVjdG9yLT5mdW5jcywKLQkJCWlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKTsKLQlkcm1fbW9kZV9ncm91cF9yZWluaXQoaW14ZHJtLT5kcm0pOwotCi0JcmV0dXJuIGRybV9zeXNmc19jb25uZWN0b3JfYWRkKGlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IpOwotfQotCi0vKgotICogdW5yZWdpc3RlciBhIGNvbm5lY3RvciBmcm9tIHRoZSBkcm0gY29yZQotICovCi1zdGF0aWMgdm9pZCBpbXhfZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKAotCQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCi0JZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoaW14X2RybV9jb25uZWN0b3ItPmNvbm5lY3Rvcik7Ci0JZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IpOwotCi0JZHJtX21vZGVfZ3JvdXBfcmVpbml0KGlteGRybS0+ZHJtKTsKLX0KLQotLyoKLSAqIENhbGxlZCBieSB0aGUgQ1JUQyBkcml2ZXIgd2hlbiBhbGwgQ1JUQ3MgYXJlIHJlZ2lzdGVyZWQuIFRoaXMKLSAqIHB1dHMgYWxsIHRoZSBwaWVjZXMgdG9nZXRoZXIgYW5kIGluaXRpYWxpemVzIHRoZSBkcml2ZXIuCi0gKiBPbmNlIHRoaXMgaXMgY2FsbGVkIG5vIG1vcmUgQ1JUQ3MgY2FuIGJlIHJlZ2lzdGVyZWQgc2luY2UKLSAqIHRoZSBkcm0gY29yZSBoYXMgaGFyZGNvZGVkIHRoZSBudW1iZXIgb2YgY3J0Y3MgaW4gc2V2ZXJhbAotICogcGxhY2VzLgorICogTWFpbiBEUk0gaW5pdGlhbGlzYXRpb24uIFRoaXMgYmluZHMsIGluaXRpYWxpc2VzIGFuZCByZWdpc3RlcnMKKyAqIHdpdGggRFJNIHRoZSBzdWJjb21wb25lbnRzIG9mIHRoZSBkcml2ZXIuCiAgKi8KIHN0YXRpYyBpbnQgaW14X2RybV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOworCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJaW50IHJldDsKIAorCWlteGRybSA9IGRldm1fa3phbGxvYyhkcm0tPmRldiwgc2l6ZW9mKCppbXhkcm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlteGRybSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpbXhkcm0tPmRybSA9IGRybTsKIAogCWRybS0+ZGV2X3ByaXZhdGUgPSBpbXhkcm07CkBAIC0zOTYsMTIwICsyNjMsMTE4IEBACiAJICovCiAJZHJtLT5pcnFfZW5hYmxlZCA9IHRydWU7CiAKKwkvKgorCSAqIHNldCBtYXggd2lkdGggYW5kIGhlaWdodCBhcyBkZWZhdWx0IHZhbHVlKDQwOTZ4NDA5NikuCisJICogdGhpcyB2YWx1ZSB3b3VsZCBiZSB1c2VkIHRvIGNoZWNrIGZyYW1lYnVmZmVyIHNpemUgbGltaXRhdGlvbgorCSAqIGF0IGRybV9tb2RlX2FkZGZiKCkuCisJICovCisJZHJtLT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSA2NDsKKwlkcm0tPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSA2NDsKKwlkcm0tPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDQwOTY7CisJZHJtLT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gNDA5NjsKKwlkcm0tPm1vZGVfY29uZmlnLmZ1bmNzID0gJmlteF9kcm1fbW9kZV9jb25maWdfZnVuY3M7CisKIAlkcm1fbW9kZV9jb25maWdfaW5pdChkcm0pOwotCWlteF9kcm1fbW9kZV9jb25maWdfaW5pdChkcm0pOwotCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlkcm1fa21zX2hlbHBlcl9wb2xsX2luaXQoZHJtKTsKLQotCS8qIHNldHVwIHRoZSBncm91cGluZyBmb3IgdGhlIGxlZ2FjeSBvdXRwdXQgKi8KLQlyZXQgPSBkcm1fbW9kZV9ncm91cF9pbml0X2xlZ2FjeV9ncm91cChkcm0sCi0JCQkmZHJtLT5wcmltYXJ5LT5tb2RlX2dyb3VwKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9rbXM7CiAKIAlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZHJtLCBNQVhfQ1JUQyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfa21zOwogCiAJLyoKLQkgKiB3aXRoIHZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlLCB2YmxhbmsgaW50ZXJydXB0IHdpbGwgYmUgZGlzYWJsZWQKLQkgKiBieSBkcm0gdGltZXIgb25jZSBhIGN1cnJlbnQgcHJvY2VzcyBnaXZlcyB1cCBvd25lcnNoaXAgb2YKLQkgKiB2YmxhbmsgZXZlbnQuKGFmdGVyIGRybV92YmxhbmtfcHV0IGZ1bmN0aW9uIGlzIGNhbGxlZCkKKwkgKiB3aXRoIHZibGFua19kaXNhYmxlX2FsbG93ZWQgPSB0cnVlLCB2YmxhbmsgaW50ZXJydXB0IHdpbGwgYmUKKwkgKiBkaXNhYmxlZCBieSBkcm0gdGltZXIgb25jZSBhIGN1cnJlbnQgcHJvY2VzcyBnaXZlcyB1cCBvd25lcnNoaXAKKwkgKiBvZiB2YmxhbmsgZXZlbnQuIChhZnRlciBkcm1fdmJsYW5rX3B1dCBmdW5jdGlvbiBpcyBjYWxsZWQpCiAJICovCiAJZHJtLT52YmxhbmtfZGlzYWJsZV9hbGxvd2VkID0gdHJ1ZTsKIAotCWlmICghaW14X2RybV9kZXZpY2VfZ2V0KCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkcm0tPnBsYXRmb3JtZGV2LCBkcm0pOworCisJLyogTm93IHRyeSBhbmQgYmluZCBhbGwgb3VyIHN1Yi1jb21wb25lbnRzICovCisJcmV0ID0gY29tcG9uZW50X2JpbmRfYWxsKGRybS0+ZGV2LCBkcm0pOworCWlmIChyZXQpCiAJCWdvdG8gZXJyX3ZibGFuazsKKworCS8qCisJICogQWxsIGNvbXBvbmVudHMgYXJlIG5vdyBhZGRlZCwgd2UgY2FuIHB1Ymxpc2ggdGhlIGNvbm5lY3RvciBzeXNmcworCSAqIGVudHJpZXMgdG8gdXNlcnNwYWNlLiAgVGhpcyB3aWxsIGdlbmVyYXRlIGhvdHBsdWcgZXZlbnRzIGFuZCBzbworCSAqIHVzZXJzcGFjZSB3aWxsIGV4cGVjdCB0byBiZSBhYmxlIHRvIGFjY2VzcyBEUk0gYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRybS0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJcmV0ID0gZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihkcm0tPmRldiwKKwkJCQkiW0NPTk5FQ1RPUjolZDolc10gZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQgZmFpbGVkOiAlZFxuIiwKKwkJCQljb25uZWN0b3ItPmJhc2UuaWQsCisJCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLCByZXQpOworCQkJZ290byBlcnJfdW5iaW5kOworCQl9CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZHJtLT5wbGF0Zm9ybWRldiwgZHJtKTsKLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOworCS8qCisJICogQWxsIGNvbXBvbmVudHMgYXJlIG5vdyBpbml0aWFsaXNlZCwgc28gc2V0dXAgdGhlIGZiIGhlbHBlci4KKwkgKiBUaGUgZmIgaGVscGVyIHRha2VzIGNvcGllcyBvZiBrZXkgaGFyZHdhcmUgaW5mb3JtYXRpb24sIHNvIHRoZQorCSAqIGNydGNzL2Nvbm5lY3RvcnMvZW5jb2RlcnMgbXVzdCBub3QgY2hhbmdlIGFmdGVyIHRoaXMgcG9pbnQuCisJICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0lNWF9GQl9IRUxQRVIpCisJaWYgKGxlZ2FjeWZiX2RlcHRoICE9IDE2ICYmIGxlZ2FjeWZiX2RlcHRoICE9IDMyKSB7CisJCWRldl93YXJuKGRybS0+ZGV2LCAiSW52YWxpZCBsZWdhY3lmYl9kZXB0aC4gIERlZmF1bHRpbmcgdG8gMTZicHBcbiIpOworCQlsZWdhY3lmYl9kZXB0aCA9IDE2OworCX0KKwlpbXhkcm0tPmZiaGVscGVyID0gZHJtX2ZiZGV2X2NtYV9pbml0KGRybSwgbGVnYWN5ZmJfZGVwdGgsCisJCQkJZHJtLT5tb2RlX2NvbmZpZy5udW1fY3J0YywgTUFYX0NSVEMpOworCWlmIChJU19FUlIoaW14ZHJtLT5mYmhlbHBlcikpIHsKKwkJcmV0ID0gUFRSX0VSUihpbXhkcm0tPmZiaGVscGVyKTsKKwkJaW14ZHJtLT5mYmhlbHBlciA9IE5VTEw7CisJCWdvdG8gZXJyX3VuYmluZDsKKwl9CisjZW5kaWYKKworCWRybV9rbXNfaGVscGVyX3BvbGxfaW5pdChkcm0pOworCiAJcmV0dXJuIDA7CiAKK2Vycl91bmJpbmQ6CisJY29tcG9uZW50X3VuYmluZF9hbGwoZHJtLT5kZXYsIGRybSk7CiBlcnJfdmJsYW5rOgogCWRybV92YmxhbmtfY2xlYW51cChkcm0pOwogZXJyX2ttczoKLQlkcm1fa21zX2hlbHBlcl9wb2xsX2ZpbmkoZHJtKTsKIAlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkcm0pOwotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpbXhfZHJtX3VwZGF0ZV9wb3NzaWJsZV9jcnRjcyh2b2lkKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YzsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICplbmM7Ci0Jc3RydWN0IGNydGNfY29va2llICpjb29raWU7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuYywgJmlteGRybS0+ZW5jb2Rlcl9saXN0LCBsaXN0KSB7Ci0JCXUzMiBwb3NzaWJsZV9jcnRjcyA9IDA7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb29raWUsICZlbmMtPnBvc3NpYmxlX2NydGNzLCBsaXN0KSB7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlteF9kcm1fY3J0YywgJmlteGRybS0+Y3J0Y19saXN0LCBsaXN0KSB7Ci0JCQkJaWYgKGlteF9kcm1fY3J0Yy0+Y29va2llLmNvb2tpZSA9PSBjb29raWUtPmNvb2tpZSAmJgotCQkJCQkJaW14X2RybV9jcnRjLT5jb29raWUuaWQgPT0gY29va2llLT5pZCkgewotCQkJCQlwb3NzaWJsZV9jcnRjcyB8PSAxIDw8IGlteF9kcm1fY3J0Yy0+cGlwZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZW5jLT5lbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IHBvc3NpYmxlX2NydGNzOwotCQllbmMtPmVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IHBvc3NpYmxlX2NydGNzOwotCX0KLX0KLQogLyoKICAqIGlteF9kcm1fYWRkX2NydGMgLSBhZGQgYSBuZXcgY3J0YwotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaWYgIU5VTEwgaXMgYSBjb29raWUgZm9yIHRoZSBjYWxsZXIgdG8gcGFzcyB0bwotICogaW14X2RybV9yZW1vdmVfY3J0YyBsYXRlci4KICAqLwotaW50IGlteF9kcm1fYWRkX2NydGMoc3RydWN0IGRybV9jcnRjICpjcnRjLAoraW50IGlteF9kcm1fYWRkX2NydGMoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQlzdHJ1Y3QgaW14X2RybV9jcnRjICoqbmV3X2NydGMsCiAJCWNvbnN0IHN0cnVjdCBpbXhfZHJtX2NydGNfaGVscGVyX2Z1bmNzICppbXhfZHJtX2hlbHBlcl9mdW5jcywKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIsIHZvaWQgKmNvb2tpZSwgaW50IGlkKQorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBkcm0tPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YzsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KIAkvKgogCSAqIFRoZSB2YmxhbmsgYXJyYXlzIGFyZSBkaW1lbnNpb25lZCBieSBNQVhfQ1JUQyAtIHdlIGNhbid0CiAJICogcGFzcyBJRHMgZ3JlYXRlciB0aGFuIHRoaXMgdG8gdGhvc2UgZnVuY3Rpb25zLgogCSAqLwotCWlmIChpbXhkcm0tPnBpcGVzID49IE1BWF9DUlRDKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2J1c3k7Ci0JfQorCWlmIChpbXhkcm0tPnBpcGVzID49IE1BWF9DUlRDKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChpbXhkcm0tPmRybS0+b3Blbl9jb3VudCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX2J1c3k7Ci0JfQorCWlmIChpbXhkcm0tPmRybS0+b3Blbl9jb3VudCkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWlteF9kcm1fY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKCppbXhfZHJtX2NydGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteF9kcm1fY3J0YykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9hbGxvYzsKLQl9CisJaWYgKCFpbXhfZHJtX2NydGMpCisJCXJldHVybiAtRU5PTUVNOwogCiAJaW14X2RybV9jcnRjLT5pbXhfZHJtX2hlbHBlcl9mdW5jcyA9ICppbXhfZHJtX2hlbHBlcl9mdW5jczsKIAlpbXhfZHJtX2NydGMtPnBpcGUgPSBpbXhkcm0tPnBpcGVzKys7Ci0JaW14X2RybV9jcnRjLT5jb29raWUuY29va2llID0gY29va2llOwotCWlteF9kcm1fY3J0Yy0+Y29va2llLmlkID0gaWQ7Ci0KKwlpbXhfZHJtX2NydGMtPnBvcnQgPSBwb3J0OwogCWlteF9kcm1fY3J0Yy0+Y3J0YyA9IGNydGM7Ci0JaW14X2RybV9jcnRjLT5pbXhkcm0gPSBpbXhkcm07CiAKLQlpbXhfZHJtX2NydGMtPm93bmVyID0gb3duZXI7Ci0KLQlsaXN0X2FkZF90YWlsKCZpbXhfZHJtX2NydGMtPmxpc3QsICZpbXhkcm0tPmNydGNfbGlzdCk7CisJaW14ZHJtLT5jcnRjW2lteF9kcm1fY3J0Yy0+cGlwZV0gPSBpbXhfZHJtX2NydGM7CiAKIAkqbmV3X2NydGMgPSBpbXhfZHJtX2NydGM7CiAKQEAgLTUyMCwyMyArMzg1LDE0IEBACiAJZHJtX2NydGNfaGVscGVyX2FkZChjcnRjLAogCQkJaW14X2RybV9jcnRjLT5pbXhfZHJtX2hlbHBlcl9mdW5jcy5jcnRjX2hlbHBlcl9mdW5jcyk7CiAKLQlkcm1fY3J0Y19pbml0KGlteGRybS0+ZHJtLCBjcnRjLAorCWRybV9jcnRjX2luaXQoZHJtLCBjcnRjLAogCQkJaW14X2RybV9jcnRjLT5pbXhfZHJtX2hlbHBlcl9mdW5jcy5jcnRjX2Z1bmNzKTsKIAotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci0KLQlpbXhfZHJtX3VwZGF0ZV9wb3NzaWJsZV9jcnRjcygpOwotCi0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQogCXJldHVybiAwOwogCiBlcnJfcmVnaXN0ZXI6Ci0JbGlzdF9kZWwoJmlteF9kcm1fY3J0Yy0+bGlzdCk7CisJaW14ZHJtLT5jcnRjW2lteF9kcm1fY3J0Yy0+cGlwZV0gPSBOVUxMOwogCWtmcmVlKGlteF9kcm1fY3J0Yyk7Ci1lcnJfYWxsb2M6Ci1lcnJfYnVzeToKLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2FkZF9jcnRjKTsKQEAgLTU0NiwxNyArNDAyLDExIEBACiAgKi8KIGludCBpbXhfZHJtX3JlbW92ZV9jcnRjKHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0YykKIHsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IGlteF9kcm1fY3J0Yy0+aW14ZHJtOwotCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7CisJc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBpbXhfZHJtX2NydGMtPmNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CiAKIAlkcm1fY3J0Y19jbGVhbnVwKGlteF9kcm1fY3J0Yy0+Y3J0Yyk7CiAKLQlsaXN0X2RlbCgmaW14X2RybV9jcnRjLT5saXN0KTsKLQotCWRybV9tb2RlX2dyb3VwX3JlaW5pdChpbXhkcm0tPmRybSk7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOworCWlteGRybS0+Y3J0Y1tpbXhfZHJtX2NydGMtPnBpcGVdID0gTlVMTDsKIAogCWtmcmVlKGlteF9kcm1fY3J0Yyk7CiAKQEAgLTU2NSwyMjAgKzQxNSwxMTUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fcmVtb3ZlX2NydGMpOwogCiAvKgotICogaW14X2RybV9hZGRfZW5jb2RlciAtIGFkZCBhIG5ldyBlbmNvZGVyCisgKiBGaW5kIHRoZSBEUk0gQ1JUQyBwb3NzaWJsZSBtYXNrIGZvciB0aGUgY29ubmVjdGVkIGVuZHBvaW50LgorICoKKyAqIFRoZSBlbmNvZGVyIHBvc3NpYmxlIG1hc2tzIGFyZSBkZWZpbmVkIGJ5IHRoZWlyIHBvc2l0aW9uIGluIHRoZQorICogbW9kZV9jb25maWcgY3J0Y19saXN0LiAgVGhpcyBtZWFucyB0aGF0IENSVENzIG11c3Qgbm90IGJlIGFkZGVkCisgKiBvciByZW1vdmVkIG9uY2UgdGhlIERSTSBkZXZpY2UgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGlzZWQuCiAgKi8KLWludCBpbXhfZHJtX2FkZF9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJc3RydWN0IGlteF9kcm1fZW5jb2RlciAqKm5ld2VuYywgc3RydWN0IG1vZHVsZSAqb3duZXIpCitzdGF0aWMgdWludDMyX3QgaW14X2RybV9maW5kX2NydGNfbWFzayhzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVuZHBvaW50KQogewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKLQlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydDsKKwl1bnNpZ25lZCBpOwogCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7CisJcG9ydCA9IG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydChlbmRwb2ludCk7CisJaWYgKCFwb3J0KQorCQlyZXR1cm4gMDsKKwlvZl9ub2RlX3B1dChwb3J0KTsKIAotCWlmIChpbXhkcm0tPmRybS0+b3Blbl9jb3VudCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX2J1c3k7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DUlRDOyBpKyspIHsKKwkJc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjID0gaW14ZHJtLT5jcnRjW2ldOworCQlpZiAoaW14X2RybV9jcnRjICYmIGlteF9kcm1fY3J0Yy0+cG9ydCA9PSBwb3J0KQorCQkJcmV0dXJuIGRybV9jcnRjX21hc2soaW14X2RybV9jcnRjLT5jcnRjKTsKIAl9CiAKLQlpbXhfZHJtX2VuY29kZXIgPSBremFsbG9jKHNpemVvZigqaW14X2RybV9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbXhfZHJtX2VuY29kZXIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2M7Ci0JfQotCi0JaW14X2RybV9lbmNvZGVyLT5lbmNvZGVyID0gZW5jb2RlcjsKLQlpbXhfZHJtX2VuY29kZXItPm93bmVyID0gb3duZXI7Ci0KLQlyZXQgPSBpbXhfZHJtX2VuY29kZXJfcmVnaXN0ZXIoaW14X2RybV9lbmNvZGVyKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3JlZ2lzdGVyOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJmlteF9kcm1fZW5jb2Rlci0+bGlzdCwgJmlteGRybS0+ZW5jb2Rlcl9saXN0KTsKLQotCSpuZXdlbmMgPSBpbXhfZHJtX2VuY29kZXI7Ci0KLQltdXRleF91bmxvY2soJmlteGRybS0+bXV0ZXgpOwotCiAJcmV0dXJuIDA7Ci0KLWVycl9yZWdpc3RlcjoKLQlrZnJlZShpbXhfZHJtX2VuY29kZXIpOwotZXJyX2FsbG9jOgotZXJyX2J1c3k6Ci0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2FkZF9lbmNvZGVyKTsKIAotaW50IGlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3MoCi0JCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlteF9kcm1fb2ZfZ2V0X25leHRfZW5kcG9pbnQoCisJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IG9mX3BoYW5kbGVfYXJncyBhcmdzOwotCXN0cnVjdCBjcnRjX2Nvb2tpZSAqYzsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChwYXJlbnQsIHByZXYpOworCW9mX25vZGVfcHV0KHByZXYpOworCXJldHVybiBub2RlOworfQorCitpbnQgaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gZHJtLT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVwID0gTlVMTDsKKwl1aW50MzJfdCBjcnRjX21hc2sgPSAwOwogCWludCBpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZpbXhfZHJtX2VuY29kZXItPnBvc3NpYmxlX2NydGNzKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQl1MzIgbWFzazsKIAotCWZvciAoaSA9IDA7ICFyZXQ7IGkrKykgewotCQlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgImNydGNzIiwKLQkJCQkiI2NydGMtY2VsbHMiLCBpLCAmYXJncyk7Ci0JCWlmIChyZXQgPCAwKQorCQllcCA9IGlteF9kcm1fb2ZfZ2V0X25leHRfZW5kcG9pbnQobnAsIGVwKTsKKwkJaWYgKCFlcCkKIAkJCWJyZWFrOwogCi0JCWMgPSBremFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWMpIHsKLQkJCW9mX25vZGVfcHV0KGFyZ3MubnApOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KKwkJbWFzayA9IGlteF9kcm1fZmluZF9jcnRjX21hc2soaW14ZHJtLCBlcCk7CiAKLQkJYy0+Y29va2llID0gYXJncy5ucDsKLQkJYy0+aWQgPSBhcmdzLmFyZ3NfY291bnQgPiAwID8gYXJncy5hcmdzWzBdIDogMDsKKwkJLyoKKwkJICogSWYgd2UgZmFpbGVkIHRvIGZpbmQgdGhlIENSVEMocykgd2hpY2ggdGhpcyBlbmNvZGVyIGlzCisJCSAqIHN1cHBvc2VkIHRvIGJlIGNvbm5lY3RlZCB0bywgaXQncyBiZWNhdXNlIHRoZSBDUlRDIGhhcworCQkgKiBub3QgYmVlbiByZWdpc3RlcmVkIHlldC4gIERlZmVyIHByb2JpbmcsIGFuZCBob3BlIHRoYXQKKwkJICogdGhlIHJlcXVpcmVkIENSVEMgaXMgYWRkZWQgbGF0ZXIuCisJCSAqLworCQlpZiAobWFzayA9PSAwKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAKLQkJb2Zfbm9kZV9wdXQoYXJncy5ucCk7Ci0KLQkJbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmYy0+bGlzdCwgJmlteF9kcm1fZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MpOwotCi0JCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7CisJCWNydGNfbWFzayB8PSBtYXNrOwogCX0KIAotCWlteF9kcm1fdXBkYXRlX3Bvc3NpYmxlX2NydGNzKCk7CisJaWYgKGVwKQorCQlvZl9ub2RlX3B1dChlcCk7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGNydGNfbWFzazsKKworCS8qIEZJWE1FOiB0aGlzIGlzIHRoZSBtYXNrIG9mIG91dHB1dHMgd2hpY2ggY2FuIGNsb25lIHRoaXMgb3V0cHV0LiAqLworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IH4wOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKTsKLQotaW50IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRybV9jcnRjICpjcnRjKQotewotCXN0cnVjdCBpbXhfZHJtX2RldmljZSAqaW14ZHJtID0gX19pbXhfZHJtX2RldmljZSgpOwotCXN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9jcnRjOwotCWludCBpID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW14X2NydGMsICZpbXhkcm0tPmNydGNfbGlzdCwgbGlzdCkgewotCQlpZiAoaW14X2NydGMtPmNydGMgPT0gY3J0YykKLQkJCWdvdG8gZm91bmQ7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLWZvdW5kOgotCXJldHVybiBpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQpOworRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKTsKIAogLyoKLSAqIGlteF9kcm1fcmVtb3ZlX2VuY29kZXIgLSByZW1vdmUgYW4gZW5jb2RlcgorICogQG5vZGU6IGRldmljZSB0cmVlIG5vZGUgY29udGFpbmluZyBlbmNvZGVyIGlucHV0IHBvcnRzCisgKiBAZW5jb2RlcjogZHJtX2VuY29kZXIKICAqLwotaW50IGlteF9kcm1fcmVtb3ZlX2VuY29kZXIoc3RydWN0IGlteF9kcm1fZW5jb2RlciAqaW14X2RybV9lbmNvZGVyKQoraW50IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGNydGNfY29va2llICpjLCAqdG1wOwotCi0JbXV0ZXhfbG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlpbXhfZHJtX2VuY29kZXJfdW5yZWdpc3RlcihpbXhfZHJtX2VuY29kZXIpOwotCi0JbGlzdF9kZWwoJmlteF9kcm1fZW5jb2Rlci0+bGlzdCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmaW14X2RybV9lbmNvZGVyLT5wb3NzaWJsZV9jcnRjcywKLQkJCWxpc3QpCi0JCWtmcmVlKGMpOwotCi0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWtmcmVlKGlteF9kcm1fZW5jb2Rlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fcmVtb3ZlX2VuY29kZXIpOwotCi0vKgotICogaW14X2RybV9hZGRfY29ubmVjdG9yIC0gYWRkIGEgY29ubmVjdG9yCi0gKi8KLWludCBpbXhfZHJtX2FkZF9jb25uZWN0b3Ioc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICoqbmV3X2NvbiwKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIpCi17Ci0Jc3RydWN0IGlteF9kcm1fZGV2aWNlICppbXhkcm0gPSBfX2lteF9kcm1fZGV2aWNlKCk7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcjsKKwlzdHJ1Y3QgaW14X2RybV9jcnRjICppbXhfY3J0YyA9IGlteF9kcm1fZmluZF9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXAgPSBOVUxMOworCXN0cnVjdCBvZl9lbmRwb2ludCBlbmRwb2ludDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBvcnQ7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJmlteGRybS0+bXV0ZXgpOworCWlmICghbm9kZSB8fCAhaW14X2NydGMpCisJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlteGRybS0+ZHJtLT5vcGVuX2NvdW50KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfYnVzeTsKLQl9CisJZG8geworCQllcCA9IGlteF9kcm1fb2ZfZ2V0X25leHRfZW5kcG9pbnQobm9kZSwgZXApOworCQlpZiAoIWVwKQorCQkJYnJlYWs7CiAKLQlpbXhfZHJtX2Nvbm5lY3RvciA9IGt6YWxsb2Moc2l6ZW9mKCppbXhfZHJtX2Nvbm5lY3RvciksIEdGUF9LRVJORUwpOwotCWlmICghaW14X2RybV9jb25uZWN0b3IpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2M7Ci0JfQorCQlwb3J0ID0gb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KGVwKTsKKwkJb2Zfbm9kZV9wdXQocG9ydCk7CisJCWlmIChwb3J0ID09IGlteF9jcnRjLT5wb3J0KSB7CisJCQlyZXQgPSBvZl9ncmFwaF9wYXJzZV9lbmRwb2ludChlcCwgJmVuZHBvaW50KTsKKwkJCXJldHVybiByZXQgPyByZXQgOiBlbmRwb2ludC5pZDsKKwkJfQorCX0gd2hpbGUgKGVwKTsKIAotCWlteF9kcm1fY29ubmVjdG9yLT5jb25uZWN0b3IgPSBjb25uZWN0b3I7Ci0JaW14X2RybV9jb25uZWN0b3ItPm93bmVyID0gb3duZXI7Ci0KLQlyZXQgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9yZWdpc3RlcihpbXhfZHJtX2Nvbm5lY3Rvcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0KLQlsaXN0X2FkZF90YWlsKCZpbXhfZHJtX2Nvbm5lY3Rvci0+bGlzdCwgJmlteGRybS0+Y29ubmVjdG9yX2xpc3QpOwotCi0JKm5ld19jb24gPSBpbXhfZHJtX2Nvbm5lY3RvcjsKLQotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3JlZ2lzdGVyOgotCWtmcmVlKGlteF9kcm1fY29ubmVjdG9yKTsKLWVycl9hbGxvYzoKLWVycl9idXN5OgotCW11dGV4X3VubG9jaygmaW14ZHJtLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9hZGRfY29ubmVjdG9yKTsKLQotdm9pZCBpbXhfZHJtX2ZiX2hlbHBlcl9zZXQoc3RydWN0IGRybV9mYmRldl9jbWEgKmZiZGV2X2hlbHBlcikKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQotCWlteGRybS0+ZmJoZWxwZXIgPSBmYmRldl9oZWxwZXI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpbXhfZHJtX2ZiX2hlbHBlcl9zZXQpOwotCi0vKgotICogaW14X2RybV9yZW1vdmVfY29ubmVjdG9yIC0gcmVtb3ZlIGEgY29ubmVjdG9yCi0gKi8KLWludCBpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3Ioc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcikKLXsKLQlzdHJ1Y3QgaW14X2RybV9kZXZpY2UgKmlteGRybSA9IF9faW14X2RybV9kZXZpY2UoKTsKLQotCW11dGV4X2xvY2soJmlteGRybS0+bXV0ZXgpOwotCi0JaW14X2RybV9jb25uZWN0b3JfdW5yZWdpc3RlcihpbXhfZHJtX2Nvbm5lY3Rvcik7Ci0KLQlsaXN0X2RlbCgmaW14X2RybV9jb25uZWN0b3ItPmxpc3QpOwotCi0JbXV0ZXhfdW5sb2NrKCZpbXhkcm0tPm11dGV4KTsKLQotCWtmcmVlKGlteF9kcm1fY29ubmVjdG9yKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW14X2RybV9yZW1vdmVfY29ubmVjdG9yKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faW9jdGxfZGVzYyBpbXhfZHJtX2lvY3Rsc1tdID0gewogCS8qIG5vbmUgc28gZmFyICovCkBAIC04MTksODAgKzU2NCwxNTYgQEAKIAkucGF0Y2hsZXZlbAkJPSAwLAogfTsKIAorc3RhdGljIGludCBjb21wYXJlX29mKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGF0YTsKKworCS8qIFNwZWNpYWwgY2FzZSBmb3IgTERCLCBvbmUgZGV2aWNlIGZvciB0d28gY2hhbm5lbHMgKi8KKwlpZiAob2Zfbm9kZV9jbXAobnAtPm5hbWUsICJsdmRzLWNoYW5uZWwiKSA9PSAwKSB7CisJCW5wID0gb2ZfZ2V0X3BhcmVudChucCk7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CisKKwlyZXR1cm4gZGV2LT5vZl9ub2RlID09IG5wOworfQorCitzdGF0aWMgTElTVF9IRUFEKGlteF9kcm1fY29tcG9uZW50cyk7CisKK3N0YXRpYyBpbnQgaW14X2RybV9hZGRfY29tcG9uZW50cyhzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHN0cnVjdCBtYXN0ZXIgKm0pCit7CisJc3RydWN0IGlteF9kcm1fY29tcG9uZW50ICpjb21wb25lbnQ7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmaW14X2RybV9jb21wb25lbnRzLCBsaXN0KSB7CisJCXJldCA9IGNvbXBvbmVudF9tYXN0ZXJfYWRkX2NoaWxkKG0sIGNvbXBhcmVfb2YsCisJCQkJCQkgY29tcG9uZW50LT5vZl9ub2RlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlteF9kcm1fYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRybV9wbGF0Zm9ybV9pbml0KCZpbXhfZHJtX2RyaXZlciwgdG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgdm9pZCBpbXhfZHJtX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZHJtX3B1dF9kZXYoZGV2X2dldF9kcnZkYXRhKGRldikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9tYXN0ZXJfb3BzIGlteF9kcm1fb3BzID0geworCS5hZGRfY29tcG9uZW50cyA9IGlteF9kcm1fYWRkX2NvbXBvbmVudHMsCisJLmJpbmQgPSBpbXhfZHJtX2JpbmQsCisJLnVuYmluZCA9IGlteF9kcm1fdW5iaW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhfZHJtX2NvbXBvbmVudCAqaW14X2RybV9maW5kX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaW14X2RybV9jb21wb25lbnQgKmNvbXBvbmVudDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmaW14X2RybV9jb21wb25lbnRzLCBsaXN0KQorCQlpZiAoY29tcG9uZW50LT5vZl9ub2RlID09IG5vZGUpCisJCQlyZXR1cm4gY29tcG9uZW50OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaW14X2RybV9hZGRfY29tcG9uZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBpbXhfZHJtX2NvbXBvbmVudCAqY29tcG9uZW50OworCisJaWYgKGlteF9kcm1fZmluZF9jb21wb25lbnQoZGV2LCBub2RlKSkKKwkJcmV0dXJuIDA7CisKKwljb21wb25lbnQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNvbXBvbmVudCksIEdGUF9LRVJORUwpOworCWlmICghY29tcG9uZW50KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbXBvbmVudC0+b2Zfbm9kZSA9IG5vZGU7CisJbGlzdF9hZGRfdGFpbCgmY29tcG9uZW50LT5saXN0LCAmaW14X2RybV9jb21wb25lbnRzKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGlteF9kcm1fcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmVwLCAqcG9ydCwgKnJlbW90ZTsKIAlpbnQgcmV0OworCWludCBpOworCisJLyoKKwkgKiBCaW5kIHRoZSBJUFUgZGlzcGxheSBpbnRlcmZhY2UgcG9ydHMgZmlyc3QsIHNvIHRoYXQKKwkgKiBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2YgY2FsbGVkIGZyb20gZW5jb2RlciAuYmluZCBjYWxsYmFja3MKKwkgKiB3b3JrcyBhcyBleHBlY3RlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlwb3J0ID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgInBvcnRzIiwgaSk7CisJCWlmICghcG9ydCkKKwkJCWJyZWFrOworCisJCXJldCA9IGlteF9kcm1fYWRkX2NvbXBvbmVudCgmcGRldi0+ZGV2LCBwb3J0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChpID09IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyAncG9ydHMnIHByb3BlcnR5XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogVGhlbiBiaW5kIGFsbCBlbmNvZGVycyAqLworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXBvcnQgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAicG9ydHMiLCBpKTsKKwkJaWYgKCFwb3J0KQorCQkJYnJlYWs7CisKKwkJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShwb3J0LCBlcCkgeworCQkJcmVtb3RlID0gb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudChlcCk7CisJCQlpZiAoIXJlbW90ZSB8fCAhb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShyZW1vdGUpKSB7CisJCQkJb2Zfbm9kZV9wdXQocmVtb3RlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcmV0ID0gaW14X2RybV9hZGRfY29tcG9uZW50KCZwZGV2LT5kZXYsIHJlbW90ZSk7CisJCQlvZl9ub2RlX3B1dChyZW1vdGUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlvZl9ub2RlX3B1dChwb3J0KTsKKwl9CiAKIAlyZXQgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlteF9kcm1fZGV2aWNlLT5kZXYgPSAmcGRldi0+ZGV2OwotCi0JcmV0dXJuIGRybV9wbGF0Zm9ybV9pbml0KCZpbXhfZHJtX2RyaXZlciwgcGRldik7CisJcmV0dXJuIGNvbXBvbmVudF9tYXN0ZXJfYWRkKCZwZGV2LT5kZXYsICZpbXhfZHJtX29wcyk7CiB9CiAKIHN0YXRpYyBpbnQgaW14X2RybV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlkcm1fcHV0X2RldihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7Ci0KKwljb21wb25lbnRfbWFzdGVyX2RlbCgmcGRldi0+ZGV2LCAmaW14X2RybV9vcHMpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXhfZHJtX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteC1kaXNwbGF5LXN1YnN5c3RlbSIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9kcm1fZHRfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW14X2RybV9wZHJ2ID0gewogCS5wcm9iZQkJPSBpbXhfZHJtX3BsYXRmb3JtX3Byb2JlLAogCS5yZW1vdmUJCT0gaW14X2RybV9wbGF0Zm9ybV9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkubmFtZQk9ICJpbXgtZHJtIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X2RybV9kdF9pZHMsCiAJfSwKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfZHJtX3BkZXY7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlteF9kcm1faW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpbXhfZHJtX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCppbXhfZHJtX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghaW14X2RybV9kZXZpY2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXV0ZXhfaW5pdCgmaW14X2RybV9kZXZpY2UtPm11dGV4KTsKLQlJTklUX0xJU1RfSEVBRCgmaW14X2RybV9kZXZpY2UtPmNydGNfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmlteF9kcm1fZGV2aWNlLT5jb25uZWN0b3JfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmlteF9kcm1fZGV2aWNlLT5lbmNvZGVyX2xpc3QpOwotCi0JaW14X2RybV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiaW14LWRybSIsIC0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKGlteF9kcm1fcGRldikpIHsKLQkJcmV0ID0gUFRSX0VSUihpbXhfZHJtX3BkZXYpOwotCQlnb3RvIGVycl9wZGV2OwotCX0KLQotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaW14X2RybV9wZHJ2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9wZHJ2OwotCi0JcmV0dXJuIDA7Ci0KLWVycl9wZHJ2OgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGlteF9kcm1fcGRldik7Ci1lcnJfcGRldjoKLQlrZnJlZShpbXhfZHJtX2RldmljZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaW14X2RybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaW14X2RybV9wZGV2KTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW14X2RybV9wZHJ2KTsKLQotCWtmcmVlKGlteF9kcm1fZGV2aWNlKTsKLX0KLQotbW9kdWxlX2luaXQoaW14X2RybV9pbml0KTsKLW1vZHVsZV9leGl0KGlteF9kcm1fZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGlteF9kcm1fcGRydik7CiAKIE1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWCBkcm0gZHJpdmVyIGNvcmUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0uaCBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1kcm0uaAppbmRleCBhZTkwYzljLi5hMzIyYmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZHJtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWRybS5oCkBAIC0xLDE3ICsxLDE1IEBACiAjaWZuZGVmIF9JTVhfRFJNX0hfCiAjZGVmaW5lIF9JTVhfRFJNX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLQotI2RlZmluZSBJUFVfUElYX0ZNVF9HQlIyNAl2NGwyX2ZvdXJjYygnRycsICdCJywgJ1InLCAnMycpCi0KK3N0cnVjdCBkZXZpY2Vfbm9kZTsKIHN0cnVjdCBkcm1fY3J0YzsKIHN0cnVjdCBkcm1fY29ubmVjdG9yOwogc3RydWN0IGRybV9kZXZpY2U7CitzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZTsKIHN0cnVjdCBkcm1fZW5jb2RlcjsKLXN0cnVjdCBpbXhfZHJtX2NydGM7CiBzdHJ1Y3QgZHJtX2ZiZGV2X2NtYTsKIHN0cnVjdCBkcm1fZnJhbWVidWZmZXI7CitzdHJ1Y3QgaW14X2RybV9jcnRjOwogc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIAogaW50IGlteF9kcm1fY3J0Y19pZChzdHJ1Y3QgaW14X2RybV9jcnRjICpjcnRjKTsKQEAgLTI1LDEwICsyMywxMCBAQAogCWNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyAqY3J0Y19mdW5jczsKIH07CiAKLWludCBpbXhfZHJtX2FkZF9jcnRjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKK2ludCBpbXhfZHJtX2FkZF9jcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJc3RydWN0IGlteF9kcm1fY3J0YyAqKm5ld19jcnRjLAogCQljb25zdCBzdHJ1Y3QgaW14X2RybV9jcnRjX2hlbHBlcl9mdW5jcyAqaW14X2hlbHBlcl9mdW5jcywKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIsIHZvaWQgKmNvb2tpZSwgaW50IGlkKTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpwb3J0KTsKIGludCBpbXhfZHJtX3JlbW92ZV9jcnRjKHN0cnVjdCBpbXhfZHJtX2NydGMgKik7CiBpbnQgaW14X2RybV9pbml0X2RybShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQlpbnQgcHJlZmVycmVkX2JwcCk7CkBAIC0zOCwzNSArMzYsMjMgQEAKIHZvaWQgaW14X2RybV9jcnRjX3ZibGFua19wdXQoc3RydWN0IGlteF9kcm1fY3J0YyAqaW14X2RybV9jcnRjKTsKIHZvaWQgaW14X2RybV9oYW5kbGVfdmJsYW5rKHN0cnVjdCBpbXhfZHJtX2NydGMgKmlteF9kcm1fY3J0Yyk7CiAKLXN0cnVjdCBpbXhfZHJtX2VuY29kZXI7Ci1pbnQgaW14X2RybV9hZGRfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKipuZXdfZW5jLAotCQlzdHJ1Y3QgbW9kdWxlICpvd25lcik7Ci1pbnQgaW14X2RybV9yZW1vdmVfZW5jb2RlcihzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICopOwotCi1zdHJ1Y3QgaW14X2RybV9jb25uZWN0b3I7Ci1pbnQgaW14X2RybV9hZGRfY29ubmVjdG9yKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCXN0cnVjdCBpbXhfZHJtX2Nvbm5lY3RvciAqKm5ld19jb24sCi0JCXN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLWludCBpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3Ioc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICopOwotCiB2b2lkIGlteF9kcm1fbW9kZV9jb25maWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKTsKIAogc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAqaW14X2RybV9mYl9nZXRfb2JqKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKTsKIAotc3RydWN0IGRybV9kZXZpY2UgKmlteF9kcm1fZGV2aWNlX2dldCh2b2lkKTsKLXZvaWQgaW14X2RybV9kZXZpY2VfcHV0KHZvaWQpOwotaW50IGlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXRfcGlucyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUzMiBlbmNvZGVyX3R5cGUsCitpbnQgaW14X2RybV9wYW5lbF9mb3JtYXRfcGlucyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCXUzMiBpbnRlcmZhY2VfcGl4X2ZtdCwgaW50IGhzeW5jX3BpbiwgaW50IHZzeW5jX3Bpbik7Ci1pbnQgaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUzMiBlbmNvZGVyX3R5cGUsCitpbnQgaW14X2RybV9wYW5lbF9mb3JtYXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQl1MzIgaW50ZXJmYWNlX3BpeF9mbXQpOwotdm9pZCBpbXhfZHJtX2ZiX2hlbHBlcl9zZXQoc3RydWN0IGRybV9mYmRldl9jbWEgKmZiZGV2X2hlbHBlcik7CiAKLXN0cnVjdCBkZXZpY2Vfbm9kZTsKK2ludCBpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitpbnQgaW14X2RybV9lbmNvZGVyX3BhcnNlX29mKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAotaW50IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRybV9jcnRjICpjcnRjKTsKLWludCBpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKHN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlciwKLQkJc3RydWN0IGRldmljZV9ub2RlICpucCk7CitpbnQgaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK3ZvaWQgaW14X2RybV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK3ZvaWQgaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIAogI2VuZGlmIC8qIF9JTVhfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2E3YjRlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIGkuTVggZHJtIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Ci0gKgotICogQmFzZWQgb24gU2Ftc3VuZyBFeHlub3MgY29kZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgotI2luY2x1ZGUgPGRybS9kcm1fZ2VtX2NtYV9oZWxwZXIuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2ZiX2NtYV9oZWxwZXIuaD4KLQotI2luY2x1ZGUgImlteC1kcm0uaCIKLQotc3RhdGljIHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKLQkuZmJfY3JlYXRlID0gZHJtX2ZiX2NtYV9jcmVhdGUsCi19OwotCi12b2lkIGlteF9kcm1fbW9kZV9jb25maWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gNjQ7Ci0JZGV2LT5tb2RlX2NvbmZpZy5taW5faGVpZ2h0ID0gNjQ7Ci0KLQkvKgotCSAqIHNldCBtYXggd2lkdGggYW5kIGhlaWdodCBhcyBkZWZhdWx0IHZhbHVlKDQwOTZ4NDA5NikuCi0JICogdGhpcyB2YWx1ZSB3b3VsZCBiZSB1c2VkIHRvIGNoZWNrIGZyYW1lYnVmZmVyIHNpemUgbGltaXRhdGlvbgotCSAqIGF0IGRybV9tb2RlX2FkZGZiKCkuCi0JICovCi0JZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA0MDk2OwotCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDQwOTY7Ci0KLQlkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gJmlteF9kcm1fbW9kZV9jb25maWdfZnVuY3M7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtZmJkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYmRldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzMxNzM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1mYmRldi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIGkuTVggZHJtIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Ci0gKgotICogQmFzZWQgb24gU2Ftc3VuZyBFeHlub3MgY29kZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+Ci0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgotI2luY2x1ZGUgPGRybS9kcm1fZmJfY21hX2hlbHBlci5oPgotCi0jaW5jbHVkZSAiaW14LWRybS5oIgotCi0jZGVmaW5lIE1BWF9DT05ORUNUT1IJCTQKLSNkZWZpbmUgUFJFRkVSUkVEX0JQUAkJMTYKLQotc3RhdGljIHN0cnVjdCBkcm1fZmJkZXZfY21hICpmYmRldl9jbWE7Ci0KLXN0YXRpYyBpbnQgbGVnYWN5ZmJfZGVwdGggPSAxNjsKLQotbW9kdWxlX3BhcmFtKGxlZ2FjeWZiX2RlcHRoLCBpbnQsIDA0NDQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBpbXhfZmJfaGVscGVyX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gaW14X2RybV9kZXZpY2VfZ2V0KCk7Ci0KLQlpZiAoIWRybSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobGVnYWN5ZmJfZGVwdGggIT0gMTYgJiYgbGVnYWN5ZmJfZGVwdGggIT0gMzIpIHsKLQkJcHJfd2FybigiaS5NWCBsZWdhY3lmYjogaW52YWxpZCBsZWdhY3lmYl9kZXB0aCBzZXR0aW5nLiBkZWZhdWx0aW5nIHRvIDE2YnBwXG4iKTsKLQkJbGVnYWN5ZmJfZGVwdGggPSAxNjsKLQl9Ci0KLQlmYmRldl9jbWEgPSBkcm1fZmJkZXZfY21hX2luaXQoZHJtLCBsZWdhY3lmYl9kZXB0aCwKLQkJCWRybS0+bW9kZV9jb25maWcubnVtX2NydGMsIE1BWF9DT05ORUNUT1IpOwotCi0JaWYgKElTX0VSUihmYmRldl9jbWEpKSB7Ci0JCWlteF9kcm1fZGV2aWNlX3B1dCgpOwotCQlyZXR1cm4gUFRSX0VSUihmYmRldl9jbWEpOwotCX0KLQotCWlteF9kcm1fZmJfaGVscGVyX3NldChmYmRldl9jbWEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpbXhfZmJfaGVscGVyX2V4aXQodm9pZCkKLXsKLQlpbXhfZHJtX2ZiX2hlbHBlcl9zZXQoTlVMTCk7Ci0JZHJtX2ZiZGV2X2NtYV9maW5pKGZiZGV2X2NtYSk7Ci0JaW14X2RybV9kZXZpY2VfcHV0KCk7Ci19Ci0KLWxhdGVfaW5pdGNhbGwoaW14X2ZiX2hlbHBlcl9pbml0KTsKLW1vZHVsZV9leGl0KGlteF9mYl9oZWxwZXJfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIGkuTVggbGVnYWN5IGZiIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWhkbWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1oZG1pLmMKaW5kZXggNjJjZTBlOC4uZDQ3ZGVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWhkbWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtaGRtaS5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMTEyLDE1ICsxMTMsMTUgQEAKIAogc3RydWN0IGlteF9oZG1pIHsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICppbXhfZHJtX2VuY29kZXI7CiAKIAllbnVtIGlteF9oZG1pX2RldnR5cGUgZGV2X3R5cGU7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBjbGsgKmlzZnJfY2xrOwogCXN0cnVjdCBjbGsgKmlhaGJfY2xrOwogCisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBjb25uZWN0b3Jfc3RhdHVzOworCiAJc3RydWN0IGhkbWlfZGF0YV9pbmZvIGhkbWlfZGF0YTsKIAlpbnQgdmljOwogCkBAIC0xMzQsNyArMTM1LDYgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmRkYzsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAKLQl1bnNpZ25lZCBsb25nIHBpeGVsX2Nsa19yYXRlOwogCXVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZTsKIAlpbnQgcmF0aW87CiB9OwpAQCAtMTU2LDM3ICsxNTYsMzQgQEAKIAlyZXR1cm4gcmVhZGIoaGRtaS0+cmVncyArIG9mZnNldCk7CiB9CiAKK3N0YXRpYyB2b2lkIGhkbWlfbW9kYihzdHJ1Y3QgaW14X2hkbWkgKmhkbWksIHU4IGRhdGEsIHU4IG1hc2ssIHVuc2lnbmVkIHJlZykKK3sKKwl1OCB2YWwgPSBoZG1pX3JlYWRiKGhkbWksIHJlZykgJiB+bWFzazsKKwl2YWwgfD0gZGF0YSAmIG1hc2s7CisJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCByZWcpOworfQorCiBzdGF0aWMgdm9pZCBoZG1pX21hc2tfd3JpdGViKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwgdTggZGF0YSwgdW5zaWduZWQgaW50IHJlZywKIAkJICAgICAgdTggc2hpZnQsIHU4IG1hc2spCiB7Ci0JdTggdmFsdWUgPSBoZG1pX3JlYWRiKGhkbWksIHJlZykgJiB+bWFzazsKLQl2YWx1ZSB8PSAoZGF0YSA8PCBzaGlmdCkgJiBtYXNrOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbHVlLCByZWcpOworCWhkbWlfbW9kYihoZG1pLCBkYXRhIDw8IHNoaWZ0LCBtYXNrLCByZWcpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX3NldF9jbG9ja19yZWdlbmVyYXRvcl9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwKIAkJCQkJIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQl1OCB2YWw7Ci0KIAloZG1pX3dyaXRlYihoZG1pLCB2YWx1ZSAmIDB4ZmYsIEhETUlfQVVEX04xKTsKIAloZG1pX3dyaXRlYihoZG1pLCAodmFsdWUgPj4gOCkgJiAweGZmLCBIRE1JX0FVRF9OMik7CiAJaGRtaV93cml0ZWIoaGRtaSwgKHZhbHVlID4+IDE2KSAmIDB4MGYsIEhETUlfQVVEX04zKTsKIAogCS8qIG5zaGlmdCBmYWN0b3IgPSAwICovCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0FVRF9DVFMzKTsKLQl2YWwgJj0gfkhETUlfQVVEX0NUUzNfTl9TSElGVF9NQVNLOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9BVURfQ1RTMyk7CisJaGRtaV9tb2RiKGhkbWksIDAsIEhETUlfQVVEX0NUUzNfTl9TSElGVF9NQVNLLCBIRE1JX0FVRF9DVFMzKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9yZWdlbmVyYXRlX2N0cyhzdHJ1Y3QgaW14X2hkbWkgKmhkbWksIHVuc2lnbmVkIGludCBjdHMpCiB7Ci0JdTggdmFsOwotCiAJLyogTXVzdCBiZSBzZXQvY2xlYXJlZCBmaXJzdCAqLwotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9BVURfQ1RTMyk7Ci0JdmFsICY9IH5IRE1JX0FVRF9DVFMzX0NUU19NQU5VQUw7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0FVRF9DVFMzKTsKKwloZG1pX21vZGIoaGRtaSwgMCwgSERNSV9BVURfQ1RTM19DVFNfTUFOVUFMLCBIRE1JX0FVRF9DVFMzKTsKIAogCWhkbWlfd3JpdGViKGhkbWksIGN0cyAmIDB4ZmYsIEhETUlfQVVEX0NUUzEpOwogCWhkbWlfd3JpdGViKGhkbWksIChjdHMgPj4gOCkgJiAweGZmLCBIRE1JX0FVRF9DVFMyKTsKQEAgLTMzMSwzNCArMzI4LDI1IEBACiAJCXJldHVybiAoY3RzICogcmF0aW8pIC8gMTAwOwogfQogCi1zdGF0aWMgdm9pZCBoZG1pX2dldF9waXhlbF9jbGsoc3RydWN0IGlteF9oZG1pICpoZG1pKQotewotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQotCXJhdGUgPSA2NTAwMDAwMDsgLyogRklYTUUgKi8KLQotCWlmIChyYXRlKQotCQloZG1pLT5waXhlbF9jbGtfcmF0ZSA9IHJhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCitzdGF0aWMgdm9pZCBoZG1pX3NldF9jbGtfcmVnZW5lcmF0b3Ioc3RydWN0IGlteF9oZG1pICpoZG1pLAorCXVuc2lnbmVkIGxvbmcgcGl4ZWxfY2xrKQogewogCXVuc2lnbmVkIGludCBjbGtfbiwgY2xrX2N0czsKIAotCWNsa19uID0gaGRtaV9jb21wdXRlX24oaGRtaS0+c2FtcGxlX3JhdGUsIGhkbWktPnBpeGVsX2Nsa19yYXRlLAorCWNsa19uID0gaGRtaV9jb21wdXRlX24oaGRtaS0+c2FtcGxlX3JhdGUsIHBpeGVsX2NsaywKIAkJCSAgICAgICBoZG1pLT5yYXRpbyk7Ci0JY2xrX2N0cyA9IGhkbWlfY29tcHV0ZV9jdHMoaGRtaS0+c2FtcGxlX3JhdGUsIGhkbWktPnBpeGVsX2Nsa19yYXRlLAorCWNsa19jdHMgPSBoZG1pX2NvbXB1dGVfY3RzKGhkbWktPnNhbXBsZV9yYXRlLCBwaXhlbF9jbGssCiAJCQkJICAgaGRtaS0+cmF0aW8pOwogCiAJaWYgKCFjbGtfY3RzKSB7CiAJCWRldl9kYmcoaGRtaS0+ZGV2LCAiJXM6IHBpeGVsIGNsb2NrIG5vdCBzdXBwb3J0ZWQ6ICVsdVxuIiwKLQkJCSBfX2Z1bmNfXywgaGRtaS0+cGl4ZWxfY2xrX3JhdGUpOworCQkJIF9fZnVuY19fLCBwaXhlbF9jbGspOwogCQlyZXR1cm47CiAJfQogCiAJZGV2X2RiZyhoZG1pLT5kZXYsICIlczogc2FtcGxlcmF0ZT0lZCAgcmF0aW89JWQgIHBpeGVsY2xrPSVsdSAgTj0lZCBjdHM9JWRcbiIsCiAJCV9fZnVuY19fLCBoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cmF0aW8sCi0JCWhkbWktPnBpeGVsX2Nsa19yYXRlLCBjbGtfbiwgY2xrX2N0cyk7CisJCXBpeGVsX2NsaywgY2xrX24sIGNsa19jdHMpOwogCiAJaGRtaV9zZXRfY2xvY2tfcmVnZW5lcmF0b3JfbihoZG1pLCBjbGtfbik7CiAJaGRtaV9yZWdlbmVyYXRlX2N0cyhoZG1pLCBjbGtfY3RzKTsKQEAgLTM2NiwzMiArMzU0LDEyIEBACiAKIHN0YXRpYyB2b2lkIGhkbWlfaW5pdF9jbGtfcmVnZW5lcmF0b3Ioc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXVuc2lnbmVkIGludCBjbGtfbiwgY2xrX2N0czsKLQotCWNsa19uID0gaGRtaV9jb21wdXRlX24oaGRtaS0+c2FtcGxlX3JhdGUsIGhkbWktPnBpeGVsX2Nsa19yYXRlLAotCQkJICAgICAgIGhkbWktPnJhdGlvKTsKLQljbGtfY3RzID0gaGRtaV9jb21wdXRlX2N0cyhoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cGl4ZWxfY2xrX3JhdGUsCi0JCQkJICAgaGRtaS0+cmF0aW8pOwotCi0JaWYgKCFjbGtfY3RzKSB7Ci0JCWRldl9kYmcoaGRtaS0+ZGV2LCAiJXM6IHBpeGVsIGNsb2NrIG5vdCBzdXBwb3J0ZWQ6ICVsdVxuIiwKLQkJCSBfX2Z1bmNfXywgaGRtaS0+cGl4ZWxfY2xrX3JhdGUpOwotCQlyZXR1cm47Ci0JfQotCi0JZGV2X2RiZyhoZG1pLT5kZXYsICIlczogc2FtcGxlcmF0ZT0lZCAgcmF0aW89JWQgIHBpeGVsY2xrPSVsdSAgTj0lZCBjdHM9JWRcbiIsCi0JCV9fZnVuY19fLCBoZG1pLT5zYW1wbGVfcmF0ZSwgaGRtaS0+cmF0aW8sCi0JCWhkbWktPnBpeGVsX2Nsa19yYXRlLCBjbGtfbiwgY2xrX2N0cyk7Ci0KLQloZG1pX3NldF9jbG9ja19yZWdlbmVyYXRvcl9uKGhkbWksIGNsa19uKTsKLQloZG1pX3JlZ2VuZXJhdGVfY3RzKGhkbWksIGNsa19jdHMpOworCWhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihoZG1pLCA3NDI1MDAwMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhkbWlfY2xrX3JlZ2VuZXJhdG9yX3VwZGF0ZV9waXhlbF9jbG9jayhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7Ci0JLyogR2V0IHBpeGVsIGNsb2NrIGZyb20gaXB1ICovCi0JaGRtaV9nZXRfcGl4ZWxfY2xrKGhkbWkpOwotCWhkbWlfc2V0X2Nsa19yZWdlbmVyYXRvcihoZG1pKTsKKwloZG1pX3NldF9jbGtfcmVnZW5lcmF0b3IoaGRtaSwgaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2spOwogfQogCiAvKgpAQCAtNDU5LDM4ICs0MjcsNDUgQEAKIAogc3RhdGljIGludCBpc19jb2xvcl9zcGFjZV9jb252ZXJzaW9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQlyZXR1cm4gKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ICE9Ci0JCWhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdCk7CisJcmV0dXJuIGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ICE9IGhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdDsKIH0KIAogc3RhdGljIGludCBpc19jb2xvcl9zcGFjZV9kZWNpbWF0aW9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQlyZXR1cm4gKChoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gWUNCQ1I0MjJfOEJJVFMpICYmCi0JCShoZG1pLT5oZG1pX2RhdGEuZW5jX2luX2Zvcm1hdCA9PSBSR0IgfHwKLQkJaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgPT0gWUNCQ1I0NDQpKTsKKwlpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0ICE9IFlDQkNSNDIyXzhCSVRTKQorCQlyZXR1cm4gMDsKKwlpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19pbl9mb3JtYXQgPT0gUkdCIHx8CisJICAgIGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ID09IFlDQkNSNDQ0KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpc19jb2xvcl9zcGFjZV9pbnRlcnBvbGF0aW9uKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQlyZXR1cm4gKChoZG1pLT5oZG1pX2RhdGEuZW5jX2luX2Zvcm1hdCA9PSBZQ0JDUjQyMl84QklUUykgJiYKLQkJKGhkbWktPmhkbWlfZGF0YS5lbmNfb3V0X2Zvcm1hdCA9PSBSR0IgfHwKLQkJaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0ID09IFlDQkNSNDQ0KSk7CisJaWYgKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ICE9IFlDQkNSNDIyXzhCSVRTKQorCQlyZXR1cm4gMDsKKwlpZiAoaGRtaS0+aGRtaV9kYXRhLmVuY19vdXRfZm9ybWF0ID09IFJHQiB8fAorCSAgICBoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gWUNCQ1I0NDQpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpbXhfaGRtaV91cGRhdGVfY3NjX2NvZWZmcyhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7CiAJY29uc3QgdTE2ICgqY3NjX2NvZWZmKVszXVs0XSA9ICZjc2NfY29lZmZfZGVmYXVsdDsKKwl1bnNpZ25lZCBpOwogCXUzMiBjc2Nfc2NhbGUgPSAxOwotCXU4IHZhbDsKIAogCWlmIChpc19jb2xvcl9zcGFjZV9jb252ZXJzaW9uKGhkbWkpKSB7CiAJCWlmIChoZG1pLT5oZG1pX2RhdGEuZW5jX291dF9mb3JtYXQgPT0gUkdCKSB7Ci0JCQlpZiAoaGRtaS0+aGRtaV9kYXRhLmNvbG9yaW1ldHJ5ID09IEhETUlfQ09MT1JJTUVUUllfSVRVXzYwMSkKKwkJCWlmIChoZG1pLT5oZG1pX2RhdGEuY29sb3JpbWV0cnkgPT0KKwkJCQkJSERNSV9DT0xPUklNRVRSWV9JVFVfNjAxKQogCQkJCWNzY19jb2VmZiA9ICZjc2NfY29lZmZfcmdiX291dF9laXR1NjAxOwogCQkJZWxzZQogCQkJCWNzY19jb2VmZiA9ICZjc2NfY29lZmZfcmdiX291dF9laXR1NzA5OwogCQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS5lbmNfaW5fZm9ybWF0ID09IFJHQikgewotCQkJaWYgKGhkbWktPmhkbWlfZGF0YS5jb2xvcmltZXRyeSA9PSBIRE1JX0NPTE9SSU1FVFJZX0lUVV82MDEpCisJCQlpZiAoaGRtaS0+aGRtaV9kYXRhLmNvbG9yaW1ldHJ5ID09CisJCQkJCUhETUlfQ09MT1JJTUVUUllfSVRVXzYwMSkKIAkJCQljc2NfY29lZmYgPSAmY3NjX2NvZWZmX3JnYl9pbl9laXR1NjAxOwogCQkJZWxzZQogCQkJCWNzY19jb2VmZiA9ICZjc2NfY29lZmZfcmdiX2luX2VpdHU3MDk7CkBAIC00OTgsMzcgKzQ3MywyNCBAQAogCQl9CiAJfQogCi0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVswXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0ExX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVswXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9BMV9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMF1bMV0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9BMl9MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMF1bMV0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQTJfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzJdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQTNfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzBdWzJdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0EzX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVszXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0E0X0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVswXVszXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9BNF9NU0IpOworCS8qIFRoZSBDU0MgcmVnaXN0ZXJzIGFyZSBzZXF1ZW50aWFsLCBhbHRlcm5hdGluZyBNU0IgdGhlbiBMU0IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjc2NfY29lZmZfZGVmYXVsdFswXSk7IGkrKykgeworCQl1MTYgY29lZmZfYSA9ICgqY3NjX2NvZWZmKVswXVtpXTsKKwkJdTE2IGNvZWZmX2IgPSAoKmNzY19jb2VmZilbMV1baV07CisJCXUxNiBjb2VmZl9jID0gKCpjc2NfY29lZmYpWzJdW2ldOwogCi0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVswXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0IxX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVswXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9CMV9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMV1bMV0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9CMl9MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMV1bMV0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQjJfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzJdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQjNfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzFdWzJdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0IzX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVszXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0I0X0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsxXVszXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9CNF9NU0IpOworCQloZG1pX3dyaXRlYihoZG1pLCBjb2VmZl9hICYgMHhmZiwKKwkJCUhETUlfQ1NDX0NPRUZfQTFfTFNCICsgaSAqIDIpOworCQloZG1pX3dyaXRlYihoZG1pLCBjb2VmZl9hID4+IDgsIEhETUlfQ1NDX0NPRUZfQTFfTVNCICsgaSAqIDIpOworCQloZG1pX3dyaXRlYihoZG1pLCBjb2VmZl9iICYgMHhmZiwgSERNSV9DU0NfQ09FRl9CMV9MU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2IgPj4gOCwgSERNSV9DU0NfQ09FRl9CMV9NU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2MgJiAweGZmLAorCQkJSERNSV9DU0NfQ09FRl9DMV9MU0IgKyBpICogMik7CisJCWhkbWlfd3JpdGViKGhkbWksIGNvZWZmX2MgPj4gOCwgSERNSV9DU0NfQ09FRl9DMV9NU0IgKyBpICogMik7CisJfQogCi0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVswXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0MxX0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVswXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9DMV9NU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMl1bMV0gJiAweGZmKSwgSERNSV9DU0NfQ09FRl9DMl9MU0IpOwotCWhkbWlfd3JpdGViKGhkbWksICgoKmNzY19jb2VmZilbMl1bMV0gPj4gOCksIEhETUlfQ1NDX0NPRUZfQzJfTVNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzJdICYgMHhmZiksIEhETUlfQ1NDX0NPRUZfQzNfTFNCKTsKLQloZG1pX3dyaXRlYihoZG1pLCAoKCpjc2NfY29lZmYpWzJdWzJdID4+IDgpLCBIRE1JX0NTQ19DT0VGX0MzX01TQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVszXSAmIDB4ZmYpLCBIRE1JX0NTQ19DT0VGX0M0X0xTQik7Ci0JaGRtaV93cml0ZWIoaGRtaSwgKCgqY3NjX2NvZWZmKVsyXVszXSA+PiA4KSwgSERNSV9DU0NfQ09FRl9DNF9NU0IpOwotCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0NTQ19TQ0FMRSk7Ci0JdmFsICY9IH5IRE1JX0NTQ19TQ0FMRV9DU0NTQ0FMRV9NQVNLOwotCXZhbCB8PSBjc2Nfc2NhbGUgJiBIRE1JX0NTQ19TQ0FMRV9DU0NTQ0FMRV9NQVNLOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9DU0NfU0NBTEUpOworCWhkbWlfbW9kYihoZG1pLCBjc2Nfc2NhbGUsIEhETUlfQ1NDX1NDQUxFX0NTQ1NDQUxFX01BU0ssCisJCSAgSERNSV9DU0NfU0NBTEUpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX3ZpZGVvX2NzYyhzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCkBAIC01MzYsNyArNDk4LDYgQEAKIAlpbnQgY29sb3JfZGVwdGggPSAwOwogCWludCBpbnRlcnBvbGF0aW9uID0gSERNSV9DU0NfQ0ZHX0lOVE1PREVfRElTQUJMRTsKIAlpbnQgZGVjaW1hdGlvbiA9IDA7Ci0JdTggdmFsOwogCiAJLyogWUNDNDIyIGludGVycG9sYXRpb24gdG8gNDQ0IG1vZGUgKi8KIAlpZiAoaXNfY29sb3Jfc3BhY2VfaW50ZXJwb2xhdGlvbihoZG1pKSkKQEAgLTU1NywxMCArNTE4LDggQEAKIAogCS8qIENvbmZpZ3VyZSB0aGUgQ1NDIHJlZ2lzdGVycyAqLwogCWhkbWlfd3JpdGViKGhkbWksIGludGVycG9sYXRpb24gfCBkZWNpbWF0aW9uLCBIRE1JX0NTQ19DRkcpOwotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9DU0NfU0NBTEUpOwotCXZhbCAmPSB+SERNSV9DU0NfU0NBTEVfQ1NDX0NPTE9SREVfUFRIX01BU0s7Ci0JdmFsIHw9IGNvbG9yX2RlcHRoOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9DU0NfU0NBTEUpOworCWhkbWlfbW9kYihoZG1pLCBjb2xvcl9kZXB0aCwgSERNSV9DU0NfU0NBTEVfQ1NDX0NPTE9SREVfUFRIX01BU0ssCisJCSAgSERNSV9DU0NfU0NBTEUpOwogCiAJaW14X2hkbWlfdXBkYXRlX2NzY19jb2VmZnMoaGRtaSk7CiB9CkBAIC01NzYsNyArNTM1LDcgQEAKIAl1bnNpZ25lZCBpbnQgcmVtYXBfc2l6ZSA9IEhETUlfVlBfUkVNQVBfWUNDNDIyXzE2Yml0OwogCXVuc2lnbmVkIGludCBvdXRwdXRfc2VsZWN0ID0gSERNSV9WUF9DT05GX09VVFBVVF9TRUxFQ1RPUl9QUDsKIAlzdHJ1Y3QgaGRtaV9kYXRhX2luZm8gKmhkbWlfZGF0YSA9ICZoZG1pLT5oZG1pX2RhdGE7Ci0JdTggdmFsOworCXU4IHZhbCwgdnBfY29uZjsKIAogCWlmIChoZG1pX2RhdGEtPmVuY19vdXRfZm9ybWF0ID09IFJHQgogCQl8fCBoZG1pX2RhdGEtPmVuY19vdXRfZm9ybWF0ID09IFlDQkNSNDQ0KSB7CkBAIC02MTUsMTA3ICs1NzQsNzUgQEAKIAkJSERNSV9WUF9QUl9DRF9ERVNJUkVEX1BSX0ZBQ1RPUl9NQVNLKTsKIAloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfUFJfQ0QpOwogCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX1NUVUZGKTsKLQl2YWwgJj0gfkhETUlfVlBfU1RVRkZfUFJfU1RVRkZJTkdfTUFTSzsKLQl2YWwgfD0gSERNSV9WUF9TVFVGRl9QUl9TVFVGRklOR19TVFVGRklOR19NT0RFOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9TVFVGRik7CisJaGRtaV9tb2RiKGhkbWksIEhETUlfVlBfU1RVRkZfUFJfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERSwKKwkJICBIRE1JX1ZQX1NUVUZGX1BSX1NUVUZGSU5HX01BU0ssIEhETUlfVlBfU1RVRkYpOwogCiAJLyogRGF0YSBmcm9tIHBpeGVsIHJlcGVhdGVyIGJsb2NrICovCiAJaWYgKGhkbWlfZGF0YS0+cGl4X3JlcGV0X2ZhY3RvciA+IDEpIHsKLQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX0NPTkYpOwotCQl2YWwgJj0gfihIRE1JX1ZQX0NPTkZfUFJfRU5fTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9NQVNLKTsKLQkJdmFsIHw9IEhETUlfVlBfQ09ORl9QUl9FTl9FTkFCTEUgfAotCQkJSERNSV9WUF9DT05GX0JZUEFTU19TRUxFQ1RfUElYX1JFUEVBVEVSOwotCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfQ09ORik7CisJCXZwX2NvbmYgPSBIRE1JX1ZQX0NPTkZfUFJfRU5fRU5BQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX0JZUEFTU19TRUxFQ1RfUElYX1JFUEVBVEVSOwogCX0gZWxzZSB7IC8qIGRhdGEgZnJvbSBwYWNrZXRpemVyIGJsb2NrICovCi0JCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9DT05GKTsKLQkJdmFsICY9IH4oSERNSV9WUF9DT05GX1BSX0VOX01BU0sgfAotCQkJSERNSV9WUF9DT05GX0JZUEFTU19TRUxFQ1RfTUFTSyk7Ci0JCXZhbCB8PSBIRE1JX1ZQX0NPTkZfUFJfRU5fRElTQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9WSURfUEFDS0VUSVpFUjsKLQkJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX0NPTkYpOworCQl2cF9jb25mID0gSERNSV9WUF9DT05GX1BSX0VOX0RJU0FCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfQllQQVNTX1NFTEVDVF9WSURfUEFDS0VUSVpFUjsKIAl9CiAKLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfU1RVRkYpOwotCXZhbCAmPSB+SERNSV9WUF9TVFVGRl9JREVGQVVMVF9QSEFTRV9NQVNLOwotCXZhbCB8PSAxIDw8IEhETUlfVlBfU1RVRkZfSURFRkFVTFRfUEhBU0VfT0ZGU0VUOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9TVFVGRik7CisJaGRtaV9tb2RiKGhkbWksIHZwX2NvbmYsCisJCSAgSERNSV9WUF9DT05GX1BSX0VOX01BU0sgfAorCQkgIEhETUlfVlBfQ09ORl9CWVBBU1NfU0VMRUNUX01BU0ssIEhETUlfVlBfQ09ORik7CisKKwloZG1pX21vZGIoaGRtaSwgMSA8PCBIRE1JX1ZQX1NUVUZGX0lERUZBVUxUX1BIQVNFX09GRlNFVCwKKwkJICBIRE1JX1ZQX1NUVUZGX0lERUZBVUxUX1BIQVNFX01BU0ssIEhETUlfVlBfU1RVRkYpOwogCiAJaGRtaV93cml0ZWIoaGRtaSwgcmVtYXBfc2l6ZSwgSERNSV9WUF9SRU1BUCk7CiAKIAlpZiAob3V0cHV0X3NlbGVjdCA9PSBIRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX1BQKSB7Ci0JCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9DT05GKTsKLQkJdmFsICY9IH4oSERNSV9WUF9DT05GX0JZUEFTU19FTl9NQVNLIHwKLQkJCUhETUlfVlBfQ09ORl9QUF9FTl9FTk1BU0sgfAotCQkJSERNSV9WUF9DT05GX1lDQzQyMl9FTl9NQVNLKTsKLQkJdmFsIHw9IEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fRElTQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfUFBfRU5fRU5BQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRElTQUJMRTsKLQkJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX0NPTkYpOworCQl2cF9jb25mID0gSERNSV9WUF9DT05GX0JZUEFTU19FTl9ESVNBQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX1BQX0VOX0VOQUJMRSB8CisJCQkgIEhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRElTQUJMRTsKIAl9IGVsc2UgaWYgKG91dHB1dF9zZWxlY3QgPT0gSERNSV9WUF9DT05GX09VVFBVVF9TRUxFQ1RPUl9ZQ0M0MjIpIHsKLQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1ZQX0NPTkYpOwotCQl2YWwgJj0gfihIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX01BU0sgfAotCQkJSERNSV9WUF9DT05GX1BQX0VOX0VOTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX01BU0spOwotCQl2YWwgfD0gSERNSV9WUF9DT05GX0JZUEFTU19FTl9ESVNBQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9QUF9FTl9ESVNBQkxFIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRU5BQkxFOwotCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfVlBfQ09ORik7CisJCXZwX2NvbmYgPSBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX0RJU0FCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfUFBfRU5fRElTQUJMRSB8CisJCQkgIEhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fRU5BQkxFOwogCX0gZWxzZSBpZiAob3V0cHV0X3NlbGVjdCA9PSBIRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX0JZUEFTUykgewotCQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfQ09ORik7Ci0JCXZhbCAmPSB+KEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fTUFTSyB8Ci0JCQlIRE1JX1ZQX0NPTkZfUFBfRU5fRU5NQVNLIHwKLQkJCUhETUlfVlBfQ09ORl9ZQ0M0MjJfRU5fTUFTSyk7Ci0JCXZhbCB8PSBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX0VOQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfUFBfRU5fRElTQUJMRSB8Ci0JCQlIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX0RJU0FCTEU7Ci0JCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9WUF9DT05GKTsKKwkJdnBfY29uZiA9IEhETUlfVlBfQ09ORl9CWVBBU1NfRU5fRU5BQkxFIHwKKwkJCSAgSERNSV9WUF9DT05GX1BQX0VOX0RJU0FCTEUgfAorCQkJICBIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX0RJU0FCTEU7CiAJfSBlbHNlIHsKIAkJcmV0dXJuOwogCX0KIAotCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9WUF9TVFVGRik7Ci0JdmFsICY9IH4oSERNSV9WUF9TVFVGRl9QUF9TVFVGRklOR19NQVNLIHwKLQkJSERNSV9WUF9TVFVGRl9ZQ0M0MjJfU1RVRkZJTkdfTUFTSyk7Ci0JdmFsIHw9IEhETUlfVlBfU1RVRkZfUFBfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERSB8Ci0JCUhETUlfVlBfU1RVRkZfWUNDNDIyX1NUVUZGSU5HX1NUVUZGSU5HX01PREU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX1NUVUZGKTsKKwloZG1pX21vZGIoaGRtaSwgdnBfY29uZiwKKwkJICBIRE1JX1ZQX0NPTkZfQllQQVNTX0VOX01BU0sgfCBIRE1JX1ZQX0NPTkZfUFBfRU5fRU5NQVNLIHwKKwkJICBIRE1JX1ZQX0NPTkZfWUNDNDIyX0VOX01BU0ssIEhETUlfVlBfQ09ORik7CiAKLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfVlBfQ09ORik7Ci0JdmFsICY9IH5IRE1JX1ZQX0NPTkZfT1VUUFVUX1NFTEVDVE9SX01BU0s7Ci0JdmFsIHw9IG91dHB1dF9zZWxlY3Q7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1ZQX0NPTkYpOworCWhkbWlfbW9kYihoZG1pLCBIRE1JX1ZQX1NUVUZGX1BQX1NUVUZGSU5HX1NUVUZGSU5HX01PREUgfAorCQkJSERNSV9WUF9TVFVGRl9ZQ0M0MjJfU1RVRkZJTkdfU1RVRkZJTkdfTU9ERSwKKwkJICBIRE1JX1ZQX1NUVUZGX1BQX1NUVUZGSU5HX01BU0sgfAorCQkgIEhETUlfVlBfU1RVRkZfWUNDNDIyX1NUVUZGSU5HX01BU0ssIEhETUlfVlBfU1RVRkYpOworCisJaGRtaV9tb2RiKGhkbWksIG91dHB1dF9zZWxlY3QsIEhETUlfVlBfQ09ORl9PVVRQVVRfU0VMRUNUT1JfTUFTSywKKwkJICBIRE1JX1ZQX0NPTkYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV9waHlfdGVzdF9jbGVhcihzdHJ1Y3QgaW14X2hkbWkgKmhkbWksCiAJCQkJCQl1bnNpZ25lZCBjaGFyIGJpdCkKIHsKLQl1OCB2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfUEhZX1RTVDApOwotCXZhbCAmPSB+SERNSV9QSFlfVFNUMF9UU1RDTFJfTUFTSzsKLQl2YWwgfD0gKGJpdCA8PCBIRE1JX1BIWV9UU1QwX1RTVENMUl9PRkZTRVQpICYKLQkJSERNSV9QSFlfVFNUMF9UU1RDTFJfTUFTSzsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfUEhZX1RTVDApOworCWhkbWlfbW9kYihoZG1pLCBiaXQgPDwgSERNSV9QSFlfVFNUMF9UU1RDTFJfT0ZGU0VULAorCQkgIEhETUlfUEhZX1RTVDBfVFNUQ0xSX01BU0ssIEhETUlfUEhZX1RTVDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV9waHlfdGVzdF9lbmFibGUoc3RydWN0IGlteF9oZG1pICpoZG1pLAogCQkJCQkJdW5zaWduZWQgY2hhciBiaXQpCiB7Ci0JdTggdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1BIWV9UU1QwKTsKLQl2YWwgJj0gfkhETUlfUEhZX1RTVDBfVFNURU5fTUFTSzsKLQl2YWwgfD0gKGJpdCA8PCBIRE1JX1BIWV9UU1QwX1RTVEVOX09GRlNFVCkgJgotCQlIRE1JX1BIWV9UU1QwX1RTVEVOX01BU0s7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1BIWV9UU1QwKTsKKwloZG1pX21vZGIoaGRtaSwgYml0IDw8IEhETUlfUEhZX1RTVDBfVFNURU5fT0ZGU0VULAorCQkgIEhETUlfUEhZX1RTVDBfVFNURU5fTUFTSywgSERNSV9QSFlfVFNUMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3BoeV90ZXN0X2Nsb2NrKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSwKIAkJCQkJCXVuc2lnbmVkIGNoYXIgYml0KQogewotCXU4IHZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9QSFlfVFNUMCk7Ci0JdmFsICY9IH5IRE1JX1BIWV9UU1QwX1RTVENMS19NQVNLOwotCXZhbCB8PSAoYml0IDw8IEhETUlfUEhZX1RTVDBfVFNUQ0xLX09GRlNFVCkgJgotCQlIRE1JX1BIWV9UU1QwX1RTVENMS19NQVNLOwotCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9QSFlfVFNUMCk7CisJaGRtaV9tb2RiKGhkbWksIGJpdCA8PCBIRE1JX1BIWV9UU1QwX1RTVENMS19PRkZTRVQsCisJCSAgSERNSV9QSFlfVFNUMF9UU1RDTEtfTUFTSywgSERNSV9QSFlfVFNUMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3BoeV90ZXN0X2RpbihzdHJ1Y3QgaW14X2hkbWkgKmhkbWksCkBAIC04MDYsMTkgKzczMyw5NCBAQAogCQkJIEhETUlfUEhZX0NPTkYwX1NFTERJUElGX01BU0spOwogfQogCitlbnVtIHsKKwlSRVNfOCwKKwlSRVNfMTAsCisJUkVTXzEyLAorCVJFU19NQVgsCit9OworCitzdHJ1Y3QgbXBsbF9jb25maWcgeworCXVuc2lnbmVkIGxvbmcgbXBpeGVsY2xvY2s7CisJc3RydWN0IHsKKwkJdTE2IGNwY2U7CisJCXUxNiBnbXA7CisJfSByZXNbUkVTX01BWF07Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1wbGxfY29uZmlnIG1wbGxfY29uZmlnW10gPSB7CisJeworCQk0NTI1MDAwMCwgeworCQkJeyAweDAxZTAsIDB4MDAwMCB9LAorCQkJeyAweDIxZTEsIDB4MDAwMCB9LAorCQkJeyAweDQxZTIsIDB4MDAwMCB9CisJCX0sCisJfSwgeworCQk5MjUwMDAwMCwgeworCQkJeyAweDAxNDAsIDB4MDAwNSB9LAorCQkJeyAweDIxNDEsIDB4MDAwNSB9LAorCQkJeyAweDQxNDIsIDB4MDAwNSB9LAorCQl9LAorCX0sIHsKKwkJMTQ4NTAwMDAwLCB7CisJCQl7IDB4MDBhMCwgMHgwMDBhIH0sCisJCQl7IDB4MjBhMSwgMHgwMDBhIH0sCisJCQl7IDB4NDBhMiwgMHgwMDBhIH0sCisJCX0sCisJfSwgeworCQl+MFVMLCB7CisJCQl7IDB4MDBhMCwgMHgwMDBhIH0sCisJCQl7IDB4MjAwMSwgMHgwMDBmIH0sCisJCQl7IDB4NDAwMiwgMHgwMDBmIH0sCisJCX0sCisJfQorfTsKKworc3RydWN0IGN1cnJfY3RybCB7CisJdW5zaWduZWQgbG9uZyBtcGl4ZWxjbG9jazsKKwl1MTYgY3VycltSRVNfTUFYXTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3Vycl9jdHJsIGN1cnJfY3RybFtdID0geworCS8qCXBpeGVsY2xrICAgICBicHA4ICAgIGJwcDEwICAgYnBwMTIgKi8KKwl7CisJCSA1NDAwMDAwMCwgeyAweDA5MWMsIDB4MDkxYywgMHgwNmRjIH0sCisJfSwgeworCQkgNTg0MDAwMDAsIHsgMHgwOTFjLCAweDA2ZGMsIDB4MDZkYyB9LAorCX0sIHsKKwkJIDcyMDAwMDAwLCB7IDB4MDZkYywgMHgwNmRjLCAweDA5MWMgfSwKKwl9LCB7CisJCSA3NDI1MDAwMCwgeyAweDA2ZGMsIDB4MGI1YywgMHgwOTFjIH0sCisJfSwgeworCQkxMTg4MDAwMDAsIHsgMHgwOTFjLCAweDA5MWMsIDB4MDZkYyB9LAorCX0sIHsKKwkJMjE2MDAwMDAwLCB7IDB4MDZkYywgMHgwYjVjLCAweDA5MWMgfSwKKwl9Cit9OworCiBzdGF0aWMgaW50IGhkbWlfcGh5X2NvbmZpZ3VyZShzdHJ1Y3QgaW14X2hkbWkgKmhkbWksIHVuc2lnbmVkIGNoYXIgcHJlcCwKIAkJCSAgICAgIHVuc2lnbmVkIGNoYXIgcmVzLCBpbnQgY3Njb24pCiB7CisJdW5zaWduZWQgcmVzX2lkeCwgaTsKIAl1OCB2YWwsIG1zZWM7CiAKLQkvKiBjb2xvciByZXNvbHV0aW9uIDAgaXMgOCBiaXQgY29sb3VyIGRlcHRoICovCi0JaWYgKCFyZXMpCi0JCXJlcyA9IDg7Ci0KIAlpZiAocHJlcCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZSBpZiAocmVzICE9IDggJiYgcmVzICE9IDEyKQorCisJc3dpdGNoIChyZXMpIHsKKwljYXNlIDA6CS8qIGNvbG9yIHJlc29sdXRpb24gMCBpcyA4IGJpdCBjb2xvdXIgZGVwdGggKi8KKwljYXNlIDg6CisJCXJlc19pZHggPSBSRVNfODsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJcmVzX2lkeCA9IFJFU18xMDsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJcmVzX2lkeCA9IFJFU18xMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogRW5hYmxlIGNzYyBwYXRoICovCiAJaWYgKGNzY29uKQpAQCAtODQ1LDE2NSArODQ3LDMwIEBACiAJCQlIRE1JX1BIWV9JMkNNX1NMQVZFX0FERFIpOwogCWhkbWlfcGh5X3Rlc3RfY2xlYXIoaGRtaSwgMCk7CiAKLQlpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gNDUyNTAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJLyogUExML01QTEwgQ2ZnICovCi0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMWUwLCAweDA2KTsKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwMDAsIDB4MTUpOyAgLyogR01QQ1RSTCAqLworCS8qIFBMTC9NUExMIENmZyAtIGFsd2F5cyBtYXRjaCBvbiBmaW5hbCBlbnRyeSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1wbGxfY29uZmlnKSAtIDE7IGkrKykKKwkJaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9CisJCSAgICBtcGxsX2NvbmZpZ1tpXS5tcGl4ZWxjbG9jaykKIAkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MjFlMSwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDAwLCAweDE1KTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4NDFlMiwgMHgwNik7Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDAwLCAweDE1KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDkyNTAwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAxNDAsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwNSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDIxNDEsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwNSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDQxNDIsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwNSwgMHgxNSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gMTQ4NTAwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwYTAsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDIwYTEsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDQwYTIsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwYTAsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwYSwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDIwMDEsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwZiwgMHgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDQwMDIsIDB4MDYpOwotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDAwZiwgMHgxNSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KIAotCWlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSA1NDAwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsgIC8qIENVUlJDVFJMICovCisJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIG1wbGxfY29uZmlnW2ldLnJlc1tyZXNfaWR4XS5jcGNlLCAweDA2KTsKKwloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgbXBsbF9jb25maWdbaV0ucmVzW3Jlc19pZHhdLmdtcCwgMHgxNSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdXJyX2N0cmwpOyBpKyspCisJCWlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PQorCQkgICAgY3Vycl9jdHJsW2ldLm1waXhlbGNsb2NrKQogCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSA1ODQwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUubXBpeGVsY2xvY2sgPD0gNzIwMDAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDZkYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwOTFjLCAweDEwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDc0MjUwMDAwKSB7Ci0JCXN3aXRjaCAocmVzKSB7Ci0JCWNhc2UgODoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA2ZGMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwYjVjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDkxYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChoZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayA8PSAxMTg4MDAwMDApIHsKLQkJc3dpdGNoIChyZXMpIHsKLQkJY2FzZSA4OgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MDkxYywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwNmRjLCAweDEwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1waXhlbGNsb2NrIDw9IDIxNjAwMDAwMCkgewotCQlzd2l0Y2ggKHJlcykgewotCQljYXNlIDg6Ci0JCQloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwNmRjLCAweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIDB4MGI1YywgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDA5MWMsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7CisKKwlpZiAoaSA+PSBBUlJBWV9TSVpFKGN1cnJfY3RybCkpIHsKIAkJZGV2X2VycihoZG1pLT5kZXYsCiAJCQkJIlBpeGVsIGNsb2NrICVkIC0gdW5zdXBwb3J0ZWQgYnkgSERNSVxuIiwKIAkJCQloZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tcGl4ZWxjbG9jayk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIENVUlJDVFJMICovCisJaGRtaV9waHlfaTJjX3dyaXRlKGhkbWksIGN1cnJfY3RybFtpXS5jdXJyW3Jlc19pZHhdLCAweDEwKTsKKwogCWhkbWlfcGh5X2kyY193cml0ZShoZG1pLCAweDAwMDAsIDB4MTMpOyAgLyogUExMUEhCWUNUUkwgKi8KIAloZG1pX3BoeV9pMmNfd3JpdGUoaGRtaSwgMHgwMDA2LCAweDE3KTsKIAkvKiBSRVNJU1RBTkNFIFRFUk0gMTMzT2htIENmZyAqLwpAQCAtMTA3Miw3ICs5MzksNyBAQAogCiBzdGF0aWMgdm9pZCBoZG1pX3R4X2hkY3BfY29uZmlnKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKIHsKLQl1OCBkZSwgdmFsOworCXU4IGRlOwogCiAJaWYgKGhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1kYXRhZW5hYmxlcG9sYXJpdHkpCiAJCWRlID0gSERNSV9BX1ZJRFBPTENGR19EQVRBRU5QT0xfQUNUSVZFX0hJR0g7CkBAIC0xMDgwLDIwICs5NDcsMTMgQEAKIAkJZGUgPSBIRE1JX0FfVklEUE9MQ0ZHX0RBVEFFTlBPTF9BQ1RJVkVfTE9XOwogCiAJLyogZGlzYWJsZSByeCBkZXRlY3QgKi8KLQl2YWwgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfQV9IRENQQ0ZHMCk7Ci0JdmFsICY9IEhETUlfQV9IRENQQ0ZHMF9SWERFVEVDVF9NQVNLOwotCXZhbCB8PSBIRE1JX0FfSERDUENGRzBfUlhERVRFQ1RfRElTQUJMRTsKLQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfQV9IRENQQ0ZHMCk7CisJaGRtaV9tb2RiKGhkbWksIEhETUlfQV9IRENQQ0ZHMF9SWERFVEVDVF9ESVNBQkxFLAorCQkgIEhETUlfQV9IRENQQ0ZHMF9SWERFVEVDVF9NQVNLLCBIRE1JX0FfSERDUENGRzApOwogCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0FfVklEUE9MQ0ZHKTsKLQl2YWwgJj0gSERNSV9BX1ZJRFBPTENGR19EQVRBRU5QT0xfTUFTSzsKLQl2YWwgfD0gZGU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0FfVklEUE9MQ0ZHKTsKKwloZG1pX21vZGIoaGRtaSwgZGUsIEhETUlfQV9WSURQT0xDRkdfREFUQUVOUE9MX01BU0ssIEhETUlfQV9WSURQT0xDRkcpOwogCi0JdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0FfSERDUENGRzEpOwotCXZhbCAmPSBIRE1JX0FfSERDUENGRzFfRU5DUllQVElPTkRJU0FCTEVfTUFTSzsKLQl2YWwgfD0gSERNSV9BX0hEQ1BDRkcxX0VOQ1JZUFRJT05ESVNBQkxFX0RJU0FCTEU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX0FfSERDUENGRzEpOworCWhkbWlfbW9kYihoZG1pLCBIRE1JX0FfSERDUENGRzFfRU5DUllQVElPTkRJU0FCTEVfRElTQUJMRSwKKwkJICBIRE1JX0FfSERDUENGRzFfRU5DUllQVElPTkRJU0FCTEVfTUFTSywgSERNSV9BX0hEQ1BDRkcxKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9jb25maWdfQVZJKHN0cnVjdCBpbXhfaGRtaSAqaGRtaSkKQEAgLTEzMTcsMTEgKzExNzcsNyBAQAogCiBzdGF0aWMgdm9pZCBoZG1pX2VuYWJsZV9hdWRpb19jbGsoc3RydWN0IGlteF9oZG1pICpoZG1pKQogewotCXU4IGNsa2RpczsKLQotCWNsa2RpcyA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9NQ19DTEtESVMpOwotCWNsa2RpcyAmPSB+SERNSV9NQ19DTEtESVNfQVVEQ0xLX0RJU0FCTEU7Ci0JaGRtaV93cml0ZWIoaGRtaSwgY2xrZGlzLCBIRE1JX01DX0NMS0RJUyk7CisJaGRtaV9tb2RiKGhkbWksIDAsIEhETUlfTUNfQ0xLRElTX0FVRENMS19ESVNBQkxFLCBIRE1JX01DX0NMS0RJUyk7CiB9CiAKIC8qIFdvcmthcm91bmQgdG8gY2xlYXIgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiAqLwpAQCAtMTQ1Niw5ICsxMzEyLDYgQEAKIAkvKiBDbGVhciBIb3RwbHVnIGludGVycnVwdHMgKi8KIAloZG1pX3dyaXRlYihoZG1pLCBIRE1JX0lIX1BIWV9TVEFUMF9IUEQsIEhETUlfSUhfUEhZX1NUQVQwKTsKIAotCS8qIFVubXV0ZSBpbnRlcnJ1cHRzICovCi0JaGRtaV93cml0ZWIoaGRtaSwgfkhETUlfSUhfUEhZX1NUQVQwX0hQRCwgSERNSV9JSF9NVVRFX1BIWV9TVEFUMCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUyNywxMiArMTM4MCw5IEBACiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBpbXhfaGRtaV9jb25uZWN0b3JfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yCiAJCQkJCQkJKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKIHsKLQkvKiBGSVhNRSAqLwotCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLX0KLQotc3RhdGljIHZvaWQgaW14X2hkbWlfY29ubmVjdG9yX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKKwlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBjb250YWluZXJfb2YoY29ubmVjdG9yLCBzdHJ1Y3QgaW14X2hkbWksCisJCQkJCSAgICAgY29ubmVjdG9yKTsKKwlyZXR1cm4gaGRtaS0+Y29ubmVjdG9yX3N0YXR1czsKIH0KIAogc3RhdGljIGludCBpbXhfaGRtaV9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCkBAIC0xNTYwLDEzICsxNDEwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfaGRtaV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQotCXJldHVybiBNT0RFX09LOwotfQotCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICppbXhfaGRtaV9jb25uZWN0b3JfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yCiAJCQkJCQkJICAgKmNvbm5lY3RvcikKIHsKQEAgLTE2MTQsMjggKzE0NTcsMjEgQEAKIAlzdHJ1Y3QgaW14X2hkbWkgKmhkbWkgPSBjb250YWluZXJfb2YoZW5jb2Rlciwgc3RydWN0IGlteF9oZG1pLCBlbmNvZGVyKTsKIAogCWlteF9oZG1pX3Bvd2Vyb2ZmKGhkbWkpOwotCWlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXQoZW5jb2Rlci0+Y3J0YywgRFJNX01PREVfRU5DT0RFUl9OT05FLAotCQkJCSAgVjRMMl9QSVhfRk1UX1JHQjI0KTsKKwlpbXhfZHJtX3BhbmVsX2Zvcm1hdChlbmNvZGVyLCBWNEwyX1BJWF9GTVRfUkdCMjQpOwogfQogCiBzdGF0aWMgdm9pZCBpbXhfaGRtaV9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGlteF9oZG1pICpoZG1pID0gY29udGFpbmVyX29mKGVuY29kZXIsIHN0cnVjdCBpbXhfaGRtaSwgZW5jb2Rlcik7Ci0JaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGhkbWktPmlteF9kcm1fZW5jb2RlciwKLQkJCQkJICAgICBlbmNvZGVyLT5jcnRjKTsKKwlpbnQgbXV4ID0gaW14X2RybV9lbmNvZGVyX2dldF9tdXhfaWQoaGRtaS0+ZGV2LT5vZl9ub2RlLCBlbmNvZGVyKTsKIAogCWlteF9oZG1pX3NldF9pcHVfZGlfbXV4KGhkbWksIG11eCk7CiAKIAlpbXhfaGRtaV9wb3dlcm9uKGhkbWkpOwogfQogCi1zdGF0aWMgdm9pZCBpbXhfaGRtaV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXJldHVybjsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbXhfaGRtaV9lbmNvZGVyX2Z1bmNzID0gewotCS5kZXN0cm95ID0gaW14X2hkbWlfZW5jb2Rlcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbXhfaGRtaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTE2NTEsMjEgKzE0ODcsMzIgQEAKIAkuZHBtcyA9IGRybV9oZWxwZXJfY29ubmVjdG9yX2RwbXMsCiAJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCiAJLmRldGVjdCA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9kZXRlY3QsCi0JLmRlc3Ryb3kgPSBpbXhfaGRtaV9jb25uZWN0b3JfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGlteF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCi0JLm1vZGVfdmFsaWQgPSBpbXhfaGRtaV9jb25uZWN0b3JfbW9kZV92YWxpZCwKKwkubW9kZV92YWxpZCA9IGlteF9kcm1fY29ubmVjdG9yX21vZGVfdmFsaWQsCiAJLmJlc3RfZW5jb2RlciA9IGlteF9oZG1pX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIsCiB9OwogCitzdGF0aWMgaXJxcmV0dXJuX3QgaW14X2hkbWlfaGFyZGlycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGlteF9oZG1pICpoZG1pID0gZGV2X2lkOworCXU4IGludHJfc3RhdDsKKworCWludHJfc3RhdCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9JSF9QSFlfU1RBVDApOworCWlmIChpbnRyX3N0YXQpCisJCWhkbWlfd3JpdGViKGhkbWksIH4wLCBIRE1JX0lIX01VVEVfUEhZX1NUQVQwKTsKKworCXJldHVybiBpbnRyX3N0YXQgPyBJUlFfV0FLRV9USFJFQUQgOiBJUlFfTk9ORTsKK30KKwogc3RhdGljIGlycXJldHVybl90IGlteF9oZG1pX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGlteF9oZG1pICpoZG1pID0gZGV2X2lkOwogCXU4IGludHJfc3RhdDsKIAl1OCBwaHlfaW50X3BvbDsKLQl1OCB2YWw7CiAKIAlpbnRyX3N0YXQgPSBoZG1pX3JlYWRiKGhkbWksIEhETUlfSUhfUEhZX1NUQVQwKTsKIApAQCAtMTY3NSw1NSArMTUyMiw0NyBAQAogCQlpZiAocGh5X2ludF9wb2wgJiBIRE1JX1BIWV9IUEQpIHsKIAkJCWRldl9kYmcoaGRtaS0+ZGV2LCAiRVZFTlQ9cGx1Z2luXG4iKTsKIAotCQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1BIWV9QT0wwKTsKLQkJCXZhbCAmPSB+SERNSV9QSFlfSFBEOwotCQkJaGRtaV93cml0ZWIoaGRtaSwgdmFsLCBIRE1JX1BIWV9QT0wwKTsKKwkJCWhkbWlfbW9kYihoZG1pLCAwLCBIRE1JX1BIWV9IUEQsIEhETUlfUEhZX1BPTDApOwogCisJCQloZG1pLT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJCQlpbXhfaGRtaV9wb3dlcm9uKGhkbWkpOwogCQl9IGVsc2UgewogCQkJZGV2X2RiZyhoZG1pLT5kZXYsICJFVkVOVD1wbHVnb3V0XG4iKTsKIAotCQkJdmFsID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX1BIWV9QT0wwKTsKLQkJCXZhbCB8PSBIRE1JX1BIWV9IUEQ7Ci0JCQloZG1pX3dyaXRlYihoZG1pLCB2YWwsIEhETUlfUEhZX1BPTDApOworCQkJaGRtaV9tb2RiKGhkbWksIEhETUlfUEhZX0hQRCwgSERNSV9QSFlfSFBELAorCQkJCUhETUlfUEhZX1BPTDApOwogCisJCQloZG1pLT5jb25uZWN0b3Jfc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CiAJCQlpbXhfaGRtaV9wb3dlcm9mZihoZG1pKTsKIAkJfQorCQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoaGRtaS0+Y29ubmVjdG9yLmRldik7CiAJfQogCiAJaGRtaV93cml0ZWIoaGRtaSwgaW50cl9zdGF0LCBIRE1JX0lIX1BIWV9TVEFUMCk7CisJaGRtaV93cml0ZWIoaGRtaSwgfkhETUlfSUhfUEhZX1NUQVQwX0hQRCwgSERNSV9JSF9NVVRFX1BIWV9TVEFUMCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2hkbWlfcmVnaXN0ZXIoc3RydWN0IGlteF9oZG1pICpoZG1pKQorc3RhdGljIGludCBpbXhfaGRtaV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBzdHJ1Y3QgaW14X2hkbWkgKmhkbWkpCiB7CiAJaW50IHJldDsKIAotCWhkbWktPmNvbm5lY3Rvci5mdW5jcyA9ICZpbXhfaGRtaV9jb25uZWN0b3JfZnVuY3M7Ci0JaGRtaS0+ZW5jb2Rlci5mdW5jcyA9ICZpbXhfaGRtaV9lbmNvZGVyX2Z1bmNzOworCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZihkcm0sICZoZG1pLT5lbmNvZGVyLAorCQkJCSAgICAgICBoZG1pLT5kZXYtPm9mX25vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQloZG1pLT5lbmNvZGVyLmVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfVE1EUzsKLQloZG1pLT5jb25uZWN0b3IuY29ubmVjdG9yX3R5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUE7CisJaGRtaS0+Y29ubmVjdG9yLnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7CiAKIAlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKCZoZG1pLT5lbmNvZGVyLCAmaW14X2hkbWlfZW5jb2Rlcl9oZWxwZXJfZnVuY3MpOwotCXJldCA9IGlteF9kcm1fYWRkX2VuY29kZXIoJmhkbWktPmVuY29kZXIsICZoZG1pLT5pbXhfZHJtX2VuY29kZXIsCi0JCQlUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGhkbWktPmRldiwgImFkZGluZyBlbmNvZGVyIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9lbmNvZGVyX2luaXQoZHJtLCAmaGRtaS0+ZW5jb2RlciwgJmlteF9oZG1pX2VuY29kZXJfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9UTURTKTsKIAogCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaGRtaS0+Y29ubmVjdG9yLAogCQkJJmlteF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwotCi0JcmV0ID0gaW14X2RybV9hZGRfY29ubmVjdG9yKCZoZG1pLT5jb25uZWN0b3IsCi0JCQkmaGRtaS0+aW14X2RybV9jb25uZWN0b3IsIFRISVNfTU9EVUxFKTsKLQlpZiAocmV0KSB7Ci0JCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoaGRtaS0+aW14X2RybV9lbmNvZGVyKTsKLQkJZGV2X2VycihoZG1pLT5kZXYsICJhZGRpbmcgY29ubmVjdG9yIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9jb25uZWN0b3JfaW5pdChkcm0sICZoZG1pLT5jb25uZWN0b3IsICZpbXhfaGRtaV9jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpOwogCiAJaGRtaS0+Y29ubmVjdG9yLmVuY29kZXIgPSAmaGRtaS0+ZW5jb2RlcjsKIApAQCAtMTc1MCwyOCArMTU4OSwzMyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9oZG1pX2R0X2lkcyk7CiAKLXN0YXRpYyBpbnQgaW14X2hkbWlfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaW14X2hkbWlfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQotCQkJCW9mX21hdGNoX2RldmljZShpbXhfaGRtaV9kdF9pZHMsICZwZGV2LT5kZXYpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwkJCQlvZl9tYXRjaF9kZXZpY2UoaW14X2hkbWlfZHRfaWRzLCBkZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpkZGNfbm9kZTsKIAlzdHJ1Y3QgaW14X2hkbWkgKmhkbWk7CiAJc3RydWN0IHJlc291cmNlICppb3JlczsKIAlpbnQgcmV0LCBpcnE7CiAKLQloZG1pID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaGRtaSksIEdGUF9LRVJORUwpOworCWhkbWkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhkbWkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhkbWkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaGRtaS0+ZGV2ID0gJnBkZXYtPmRldjsKKwloZG1pLT5kZXYgPSBkZXY7CisJaGRtaS0+Y29ubmVjdG9yX3N0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCWhkbWktPnNhbXBsZV9yYXRlID0gNDgwMDA7CisJaGRtaS0+cmF0aW8gPSAxMDA7CiAKIAlpZiAob2ZfaWQpIHsKIAkJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqZGV2aWNlX2lkID0gb2ZfaWQtPmRhdGE7CiAJCWhkbWktPmRldl90eXBlID0gZGV2aWNlX2lkLT5kcml2ZXJfZGF0YTsKIAl9CiAKLQlkZGNfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJkZGMiLCAwKTsKKwlkZGNfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJkZGMtaTJjLWJ1cyIsIDApOwogCWlmIChkZGNfbm9kZSkgewogCQloZG1pLT5kZGMgPSBvZl9maW5kX2kyY19hZGFwdGVyX2J5X25vZGUoZGRjX25vZGUpOwogCQlpZiAoIWhkbWktPmRkYykKQEAgLTE3ODYsMTMgKzE2MzAsMTQgQEAKIAlpZiAoaXJxIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgaW14X2hkbWlfaXJxLCAwLAotCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBoZG1pKTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgaXJxLCBpbXhfaGRtaV9oYXJkaXJxLAorCQkJCQlpbXhfaGRtaV9pcnEsIElSUUZfU0hBUkVELAorCQkJCQlkZXZfbmFtZShkZXYpLCBoZG1pKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWhkbWktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgaW9yZXMpOworCWhkbWktPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCBpb3Jlcyk7CiAJaWYgKElTX0VSUihoZG1pLT5yZWdzKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGRtaS0+cmVncyk7CiAKQEAgLTE4MzEsNyArMTY3Niw3IEBACiAJfQogCiAJLyogUHJvZHVjdCBhbmQgcmV2aXNpb24gSURzICovCi0JZGV2X2luZm8oJnBkZXYtPmRldiwKKwlkZXZfaW5mbyhkZXYsCiAJCSJEZXRlY3RlZCBIRE1JIGNvbnRyb2xsZXIgMHgleDoweCV4OjB4JXg6MHgleFxuIiwKIAkJaGRtaV9yZWFkYihoZG1pLCBIRE1JX0RFU0lHTl9JRCksCiAJCWhkbWlfcmVhZGIoaGRtaSwgSERNSV9SRVZJU0lPTl9JRCksCkBAIC0xODU5LDEzICsxNzA0LDE0IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfaWFoYjsKIAotCXJldCA9IGlteF9oZG1pX3JlZ2lzdGVyKGhkbWkpOworCXJldCA9IGlteF9oZG1pX3JlZ2lzdGVyKGRybSwgaGRtaSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfaWFoYjsKIAotCWlteF9kcm1fZW5jb2Rlcl9hZGRfcG9zc2libGVfY3J0Y3MoaGRtaS0+aW14X2RybV9lbmNvZGVyLCBucCk7CisJLyogVW5tdXRlIGludGVycnVwdHMgKi8KKwloZG1pX3dyaXRlYihoZG1pLCB+SERNSV9JSF9QSFlfU1RBVDBfSFBELCBIRE1JX0lIX01VVEVfUEhZX1NUQVQwKTsKIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhkbWkpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGhkbWkpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTE4NzcsMjAgKzE3MjMsMzUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlteF9oZG1pX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgaW14X2hkbWlfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCXZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlteF9oZG1pICpoZG1pID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZoZG1pLT5jb25uZWN0b3I7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gJmhkbWktPmVuY29kZXI7CisJc3RydWN0IGlteF9oZG1pICpoZG1pID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlkcm1fbW9kZV9jb25uZWN0b3JfZGV0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKLQlpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IoaGRtaS0+aW14X2RybV9jb25uZWN0b3IpOwotCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoaGRtaS0+aW14X2RybV9lbmNvZGVyKTsKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJaGRtaV93cml0ZWIoaGRtaSwgfjAsIEhETUlfSUhfTVVURV9QSFlfU1RBVDApOworCisJaGRtaS0+Y29ubmVjdG9yLmZ1bmNzLT5kZXN0cm95KCZoZG1pLT5jb25uZWN0b3IpOworCWhkbWktPmVuY29kZXIuZnVuY3MtPmRlc3Ryb3koJmhkbWktPmVuY29kZXIpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhkbWktPmlhaGJfY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoaGRtaS0+aXNmcl9jbGspOwogCWkyY19wdXRfYWRhcHRlcihoZG1pLT5kZGMpOworfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaGRtaV9vcHMgPSB7CisJLmJpbmQJPSBpbXhfaGRtaV9iaW5kLAorCS51bmJpbmQJPSBpbXhfaGRtaV91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGlteF9oZG1pX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmhkbWlfb3BzKTsKK30KKworc3RhdGljIGludCBpbXhfaGRtaV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZoZG1pX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1sZGIuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC1sZGIuYwppbmRleCA3ZTU5MzI5Li5mZTRjMWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtbGRiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LWxkYi5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgPGRybS9kcm1fZmJfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgpAQCAtNTgsOSArNTksOCBAQAogc3RydWN0IGlteF9sZGJfY2hhbm5lbCB7CiAJc3RydWN0IGlteF9sZGIgKmxkYjsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Ci0Jc3RydWN0IGlteF9kcm1fY29ubmVjdG9yICppbXhfZHJtX2Nvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKLQlzdHJ1Y3QgaW14X2RybV9lbmNvZGVyICppbXhfZHJtX2VuY29kZXI7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKIAlpbnQgY2hubzsKIAl2b2lkICplZGlkOwogCWludCBlZGlkX2xlbjsKQEAgLTkxLDExICs5MSw2IEBACiAJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogfQogCi1zdGF0aWMgdm9pZCBpbXhfbGRiX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0JLyogZG8gbm90IGZyZWUgaGVyZSAqLwotfQotCiBzdGF0aWMgaW50IGlteF9sZGJfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBpbXhfbGRiX2NoYW5uZWwgKmlteF9sZGJfY2ggPSBjb25fdG9faW14X2xkYl9jaChjb25uZWN0b3IpOwpAQCAtMTExLDYgKzEwNiw4IEBACiAJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwogCiAJCW1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoY29ubmVjdG9yLT5kZXYpOworCQlpZiAoIW1vZGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJZHJtX21vZGVfY29weShtb2RlLCAmaW14X2xkYl9jaC0+bW9kZSk7CiAJCW1vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9EUklWRVIgfCBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKIAkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwpAQCAtMTIwLDEyICsxMTcsNiBAQAogCXJldHVybiBudW1fbW9kZXM7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2xkYl9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2RlciAqaW14X2xkYl9jb25uZWN0b3JfYmVzdF9lbmNvZGVyKAogCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewpAQCAtMTY4LDcgKzE1OSw5IEBACiAJLyogc2V0IGRpc3BsYXkgY2xvY2sgbXV4IHRvIExEQiBpbnB1dCBjbG9jayAqLwogCXJldCA9IGNsa19zZXRfcGFyZW50KGxkYi0+Y2xrX3NlbFttdXhdLCBsZGItPmNsa1tjaG5vXSk7CiAJaWYgKHJldCkKLQkJZGV2X2VycihsZGItPmRldiwgInVuYWJsZSB0byBzZXQgZGklZCBwYXJlbnQgY2xvY2sgdG8gbGRiX2RpJWRcbiIsIG11eCwgY2hubyk7CisJCWRldl9lcnIobGRiLT5kZXYsCisJCQkidW5hYmxlIHRvIHNldCBkaSVkIHBhcmVudCBjbG9jayB0byBsZGJfZGklZFxuIiwgbXV4LAorCQkJY2hubyk7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9sZGJfZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTE3OSw4ICsxNzIsNyBAQAogCXUzMiBwaXhlbF9mbXQ7CiAJdW5zaWduZWQgbG9uZyBzZXJpYWxfY2xrOwogCXVuc2lnbmVkIGxvbmcgZGlfY2xrID0gbW9kZS0+Y2xvY2sgKiAxMDAwOwotCWludCBtdXggPSBpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZChpbXhfbGRiX2NoLT5pbXhfZHJtX2VuY29kZXIsCi0JCQkJCSAgICAgZW5jb2Rlci0+Y3J0Yyk7CisJaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGlteF9sZGJfY2gtPmNoaWxkLCBlbmNvZGVyKTsKIAogCWlmIChsZGItPmxkYl9jdHJsICYgTERCX1NQTElUX01PREVfRU4pIHsKIAkJLyogZHVhbCBjaGFubmVsIExWRFMgbW9kZSAqLwpAQCAtMTg5LDcgKzE4MSw4IEBACiAJCWlteF9sZGJfc2V0X2Nsb2NrKGxkYiwgbXV4LCAxLCBzZXJpYWxfY2xrLCBkaV9jbGspOwogCX0gZWxzZSB7CiAJCXNlcmlhbF9jbGsgPSA3MDAwVUwgKiBtb2RlLT5jbG9jazsKLQkJaW14X2xkYl9zZXRfY2xvY2sobGRiLCBtdXgsIGlteF9sZGJfY2gtPmNobm8sIHNlcmlhbF9jbGssIGRpX2Nsayk7CisJCWlteF9sZGJfc2V0X2Nsb2NrKGxkYiwgbXV4LCBpbXhfbGRiX2NoLT5jaG5vLCBzZXJpYWxfY2xrLAorCQkJCWRpX2Nsayk7CiAJfQogCiAJc3dpdGNoIChpbXhfbGRiX2NoLT5jaG5vKSB7CkBAIC0yMDcsOCArMjAwLDcgQEAKIAkJcGl4ZWxfZm10ID0gVjRMMl9QSVhfRk1UX1JHQjI0OwogCX0KIAotCWlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXQoZW5jb2Rlci0+Y3J0YywgRFJNX01PREVfRU5DT0RFUl9MVkRTLAotCQkJcGl4ZWxfZm10KTsKKwlpbXhfZHJtX3BhbmVsX2Zvcm1hdChlbmNvZGVyLCBwaXhlbF9mbXQpOwogfQogCiBzdGF0aWMgdm9pZCBpbXhfbGRiX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTIxNiw4ICsyMDgsNyBAQAogCXN0cnVjdCBpbXhfbGRiX2NoYW5uZWwgKmlteF9sZGJfY2ggPSBlbmNfdG9faW14X2xkYl9jaChlbmNvZGVyKTsKIAlzdHJ1Y3QgaW14X2xkYiAqbGRiID0gaW14X2xkYl9jaC0+bGRiOwogCWludCBkdWFsID0gbGRiLT5sZGJfY3RybCAmIExEQl9TUExJVF9NT0RFX0VOOwotCWludCBtdXggPSBpbXhfZHJtX2VuY29kZXJfZ2V0X211eF9pZChpbXhfbGRiX2NoLT5pbXhfZHJtX2VuY29kZXIsCi0JCQkJCSAgICAgZW5jb2Rlci0+Y3J0Yyk7CisJaW50IG11eCA9IGlteF9kcm1fZW5jb2Rlcl9nZXRfbXV4X2lkKGlteF9sZGJfY2gtPmNoaWxkLCBlbmNvZGVyKTsKIAogCWlmIChkdWFsKSB7CiAJCWNsa19wcmVwYXJlX2VuYWJsZShsZGItPmNsa1swXSk7CkBAIC0zMTYsMjYgKzMwNywyMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaW14X2xkYl9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCS8qIGRvIG5vdCBmcmVlIGhlcmUgKi8KLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGlteF9sZGJfY29ubmVjdG9yX2Z1bmNzID0gewogCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKIAkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKIAkuZGV0ZWN0ID0gaW14X2xkYl9jb25uZWN0b3JfZGV0ZWN0LAotCS5kZXN0cm95ID0gaW14X2xkYl9jb25uZWN0b3JfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGlteF9sZGJfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2V0X21vZGVzID0gaW14X2xkYl9jb25uZWN0b3JfZ2V0X21vZGVzLAogCS5iZXN0X2VuY29kZXIgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIsCi0JLm1vZGVfdmFsaWQgPSBpbXhfbGRiX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAorCS5tb2RlX3ZhbGlkID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgaW14X2xkYl9lbmNvZGVyX2Z1bmNzID0gewotCS5kZXN0cm95ID0gaW14X2xkYl9lbmNvZGVyX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBpbXhfZHJtX2VuY29kZXJfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGlteF9sZGJfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7CkBAIC0zNTEsNTYgKzMzNyw0NyBAQAogewogCWNoYXIgY2xrbmFtZVsxNl07CiAKLQlzcHJpbnRmKGNsa25hbWUsICJkaSVkIiwgY2hubyk7CisJc25wcmludGYoY2xrbmFtZSwgc2l6ZW9mKGNsa25hbWUpLCAiZGklZCIsIGNobm8pOwogCWxkYi0+Y2xrW2Nobm9dID0gZGV2bV9jbGtfZ2V0KGxkYi0+ZGV2LCBjbGtuYW1lKTsKIAlpZiAoSVNfRVJSKGxkYi0+Y2xrW2Nobm9dKSkKIAkJcmV0dXJuIFBUUl9FUlIobGRiLT5jbGtbY2hub10pOwogCi0Jc3ByaW50ZihjbGtuYW1lLCAiZGklZF9wbGwiLCBjaG5vKTsKKwlzbnByaW50ZihjbGtuYW1lLCBzaXplb2YoY2xrbmFtZSksICJkaSVkX3BsbCIsIGNobm8pOwogCWxkYi0+Y2xrX3BsbFtjaG5vXSA9IGRldm1fY2xrX2dldChsZGItPmRldiwgY2xrbmFtZSk7CiAKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGxkYi0+Y2xrX3BsbFtjaG5vXSk7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2xkYl9yZWdpc3RlcihzdHJ1Y3QgaW14X2xkYl9jaGFubmVsICppbXhfbGRiX2NoKQorc3RhdGljIGludCBpbXhfbGRiX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJc3RydWN0IGlteF9sZGJfY2hhbm5lbCAqaW14X2xkYl9jaCkKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBpbXhfbGRiICpsZGIgPSBpbXhfbGRiX2NoLT5sZGI7CisJaW50IHJldDsKKworCXJldCA9IGlteF9kcm1fZW5jb2Rlcl9wYXJzZV9vZihkcm0sICZpbXhfbGRiX2NoLT5lbmNvZGVyLAorCQkJCSAgICAgICBpbXhfbGRiX2NoLT5jaGlsZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXJldCA9IGlteF9sZGJfZ2V0X2NsayhsZGIsIGlteF9sZGJfY2gtPmNobm8pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisKIAlpZiAobGRiLT5sZGJfY3RybCAmIExEQl9TUExJVF9NT0RFX0VOKSB7Ci0JCXJldCB8PSBpbXhfbGRiX2dldF9jbGsobGRiLCAxKTsKKwkJcmV0ID0gaW14X2xkYl9nZXRfY2xrKGxkYiwgMSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCWlteF9sZGJfY2gtPmNvbm5lY3Rvci5mdW5jcyA9ICZpbXhfbGRiX2Nvbm5lY3Rvcl9mdW5jczsKLQlpbXhfbGRiX2NoLT5lbmNvZGVyLmZ1bmNzID0gJmlteF9sZGJfZW5jb2Rlcl9mdW5jczsKLQotCWlteF9sZGJfY2gtPmVuY29kZXIuZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9MVkRTOwotCWlteF9sZGJfY2gtPmNvbm5lY3Rvci5jb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOwotCiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZCgmaW14X2xkYl9jaC0+ZW5jb2RlciwKIAkJCSZpbXhfbGRiX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKLQlyZXQgPSBpbXhfZHJtX2FkZF9lbmNvZGVyKCZpbXhfbGRiX2NoLT5lbmNvZGVyLAotCQkJJmlteF9sZGJfY2gtPmlteF9kcm1fZW5jb2RlciwgVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihsZGItPmRldiwgImFkZGluZyBlbmNvZGVyIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlkcm1fZW5jb2Rlcl9pbml0KGRybSwgJmlteF9sZGJfY2gtPmVuY29kZXIsICZpbXhfbGRiX2VuY29kZXJfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKIAogCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaW14X2xkYl9jaC0+Y29ubmVjdG9yLAogCQkJJmlteF9sZGJfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7Ci0KLQlyZXQgPSBpbXhfZHJtX2FkZF9jb25uZWN0b3IoJmlteF9sZGJfY2gtPmNvbm5lY3RvciwKLQkJCSZpbXhfbGRiX2NoLT5pbXhfZHJtX2Nvbm5lY3RvciwgVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJaW14X2RybV9yZW1vdmVfZW5jb2RlcihpbXhfbGRiX2NoLT5pbXhfZHJtX2VuY29kZXIpOwotCQlkZXZfZXJyKGxkYi0+ZGV2LCAiYWRkaW5nIGNvbm5lY3RvciBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRybSwgJmlteF9sZGJfY2gtPmNvbm5lY3RvciwKKwkJCSAgICZpbXhfbGRiX2Nvbm5lY3Rvcl9mdW5jcywgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpOwogCiAJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZpbXhfbGRiX2NoLT5jb25uZWN0b3IsCiAJCQkmaW14X2xkYl9jaC0+ZW5jb2Rlcik7CkBAIC00NTksMTEgKzQzNiwxMiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9sZGJfZHRfaWRzKTsKIAotc3RhdGljIGludCBpbXhfbGRiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGlteF9sZGJfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9Ci0JCQlvZl9tYXRjaF9kZXZpY2UoaW14X2xkYl9kdF9pZHMsICZwZGV2LT5kZXYpOworCQkJb2ZfbWF0Y2hfZGV2aWNlKGlteF9sZGJfZHRfaWRzLCBkZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CiAJY29uc3QgdTggKmVkaWRwOwogCXN0cnVjdCBpbXhfbGRiICppbXhfbGRiOwpAQCAtNDczLDE3ICs0NTEsMTcgQEAKIAlpbnQgcmV0OwogCWludCBpOwogCi0JaW14X2xkYiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlteF9sZGIpLCBHRlBfS0VSTkVMKTsKKwlpbXhfbGRiID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppbXhfbGRiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbXhfbGRiKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlteF9sZGItPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUobnAsICJncHIiKTsKIAlpZiAoSVNfRVJSKGlteF9sZGItPnJlZ21hcCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwYXJlbnQgcmVnbWFwXG4iKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHBhcmVudCByZWdtYXBcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihpbXhfbGRiLT5yZWdtYXApOwogCX0KIAotCWlteF9sZGItPmRldiA9ICZwZGV2LT5kZXY7CisJaW14X2xkYi0+ZGV2ID0gZGV2OwogCiAJaWYgKG9mX2lkKQogCQlpbXhfbGRiLT5sdmRzX211eCA9IG9mX2lkLT5kYXRhOwpAQCAtNTIxLDcgKzQ5OSw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAoZHVhbCAmJiBpID4gMCkgewotCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImR1YWwtY2hhbm5lbCBtb2RlLCBpZ25vcmluZyBzZWNvbmQgb3V0cHV0XG4iKTsKKwkJCWRldl93YXJuKGRldiwgImR1YWwtY2hhbm5lbCBtb2RlLCBpZ25vcmluZyBzZWNvbmQgb3V0cHV0XG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTUzMSw2ICs1MDksNyBAQAogCQljaGFubmVsID0gJmlteF9sZGItPmNoYW5uZWxbaV07CiAJCWNoYW5uZWwtPmxkYiA9IGlteF9sZGI7CiAJCWNoYW5uZWwtPmNobm8gPSBpOworCQljaGFubmVsLT5jaGlsZCA9IGNoaWxkOwogCiAJCWVkaWRwID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAiZWRpZCIsICZjaGFubmVsLT5lZGlkX2xlbik7CiAJCWlmIChlZGlkcCkgewpAQCAtNTUzLDU0ICs1MzIsNjcgQEAKIAkJY2FzZSBMVkRTX0JJVF9NQVBfU1BXRzoKIAkJCWlmIChkYXRhd2lkdGggPT0gMjQpIHsKIAkJCQlpZiAoaSA9PSAwIHx8IGR1YWwpCi0JCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMF8yNDsKKwkJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0KKwkJCQkJCUxEQl9EQVRBX1dJRFRIX0NIMF8yNDsKIAkJCQlpZiAoaSA9PSAxIHx8IGR1YWwpCi0JCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMV8yNDsKKwkJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0KKwkJCQkJCUxEQl9EQVRBX1dJRFRIX0NIMV8yNDsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIExWRFNfQklUX01BUF9KRUlEQToKIAkJCWlmIChkYXRhd2lkdGggPT0gMTgpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJKRUlEQSBzdGFuZGFyZCBvbmx5IHN1cHBvcnRlZCBpbiAyNCBiaXRcbiIpOworCQkJCWRldl9lcnIoZGV2LCAiSkVJREEgc3RhbmRhcmQgb25seSBzdXBwb3J0ZWQgaW4gMjQgYml0XG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWlmIChpID09IDAgfHwgZHVhbCkKLQkJCQlpbXhfbGRiLT5sZGJfY3RybCB8PSBMREJfREFUQV9XSURUSF9DSDBfMjQgfCBMREJfQklUX01BUF9DSDBfSkVJREE7CisJCQkJaW14X2xkYi0+bGRiX2N0cmwgfD0gTERCX0RBVEFfV0lEVEhfQ0gwXzI0IHwKKwkJCQkJTERCX0JJVF9NQVBfQ0gwX0pFSURBOwogCQkJaWYgKGkgPT0gMSB8fCBkdWFsKQotCQkJCWlteF9sZGItPmxkYl9jdHJsIHw9IExEQl9EQVRBX1dJRFRIX0NIMV8yNCB8IExEQl9CSVRfTUFQX0NIMV9KRUlEQTsKKwkJCQlpbXhfbGRiLT5sZGJfY3RybCB8PSBMREJfREFUQV9XSURUSF9DSDFfMjQgfAorCQkJCQlMREJfQklUX01BUF9DSDFfSkVJREE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImRhdGEgbWFwcGluZyBub3Qgc3BlY2lmaWVkIG9yIGludmFsaWRcbiIpOworCQkJZGV2X2VycihkZXYsICJkYXRhIG1hcHBpbmcgbm90IHNwZWNpZmllZCBvciBpbnZhbGlkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJcmV0ID0gaW14X2xkYl9yZWdpc3RlcihjaGFubmVsKTsKKwkJcmV0ID0gaW14X2xkYl9yZWdpc3Rlcihkcm0sIGNoYW5uZWwpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQotCQlpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKGNoYW5uZWwtPmlteF9kcm1fZW5jb2RlciwgY2hpbGQpOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlteF9sZGIpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGlteF9sZGIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW14X2xkYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGlteF9sZGJfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCXZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlteF9sZGIgKmlteF9sZGIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaW14X2xkYiAqaW14X2xkYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlzdHJ1Y3QgaW14X2xkYl9jaGFubmVsICpjaGFubmVsID0gJmlteF9sZGItPmNoYW5uZWxbaV07Ci0JCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSAmY2hhbm5lbC0+Y29ubmVjdG9yOwotCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmY2hhbm5lbC0+ZW5jb2RlcjsKIAotCQlkcm1fbW9kZV9jb25uZWN0b3JfZGV0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKLQotCQlpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IoY2hhbm5lbC0+aW14X2RybV9jb25uZWN0b3IpOwotCQlpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKGNoYW5uZWwtPmlteF9kcm1fZW5jb2Rlcik7CisJCWNoYW5uZWwtPmNvbm5lY3Rvci5mdW5jcy0+ZGVzdHJveSgmY2hhbm5lbC0+Y29ubmVjdG9yKTsKKwkJY2hhbm5lbC0+ZW5jb2Rlci5mdW5jcy0+ZGVzdHJveSgmY2hhbm5lbC0+ZW5jb2Rlcik7CiAJfQorfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaW14X2xkYl9vcHMgPSB7CisJLmJpbmQJPSBpbXhfbGRiX2JpbmQsCisJLnVuYmluZAk9IGlteF9sZGJfdW5iaW5kLAorfTsKKworc3RhdGljIGludCBpbXhfbGRiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmlteF9sZGJfb3BzKTsKK30KKworc3RhdGljIGludCBpbXhfbGRiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmlteF9sZGJfb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LXR2ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaW14LXR2ZS5jCmluZGV4IDlhYmM3Y2EuLjU3NTUzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lteC10dmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pbXgtdHZlLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPGRybS9kcm1fZmJfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgogCisjaW5jbHVkZSAiaXB1LXYzL2lteC1pcHUtdjMuaCIKICNpbmNsdWRlICJpbXgtZHJtLmgiCiAKICNkZWZpbmUgVFZFX0NPTV9DT05GX1JFRwkweDAwCkBAIC0xMTAsOSArMTEyLDcgQEAKIAogc3RydWN0IGlteF90dmUgewogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3BpbmxvY2tfdCBsb2NrOwkvKiByZWdpc3RlciBsb2NrICovCiAJYm9vbCBlbmFibGVkOwpAQCAtMjI1LDExICsyMjUsNiBAQAogCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIH0KIAotc3RhdGljIHZvaWQgaW14X3R2ZV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQotewotCS8qIGRvIG5vdCBmcmVlIGhlcmUgKi8KLX0KLQogc3RhdGljIGludCBpbXhfdHZlX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgaW14X3R2ZSAqdHZlID0gY29uX3RvX3R2ZShjb25uZWN0b3IpOwpAQCAtMjU0LDYgKzI0OSwxMSBAQAogewogCXN0cnVjdCBpbXhfdHZlICp0dmUgPSBjb25fdG9fdHZlKGNvbm5lY3Rvcik7CiAJdW5zaWduZWQgbG9uZyByYXRlOworCWludCByZXQ7CisKKwlyZXQgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKGNvbm5lY3RvciwgbW9kZSk7CisJaWYgKHJldCAhPSBNT0RFX09LKQorCQlyZXR1cm4gcmV0OwogCiAJLyogcGl4ZWwgY2xvY2sgd2l0aCAyeCBvdmVyc2FtcGxpbmcgKi8KIAlyYXRlID0gY2xrX3JvdW5kX3JhdGUodHZlLT5jbGssIDIwMDBVTCAqIG1vZGUtPmNsb2NrKSAvIDIwMDA7CkBAIC0zMDUsMTMgKzMwNSwxMSBAQAogCiAJc3dpdGNoICh0dmUtPm1vZGUpIHsKIAljYXNlIFRWRV9NT0RFX1ZHQToKLQkJaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdF9waW5zKGVuY29kZXItPmNydGMsCi0JCQkJRFJNX01PREVfRU5DT0RFUl9EQUMsIElQVV9QSVhfRk1UX0dCUjI0LAorCQlpbXhfZHJtX3BhbmVsX2Zvcm1hdF9waW5zKGVuY29kZXIsIElQVV9QSVhfRk1UX0dCUjI0LAogCQkJCXR2ZS0+aHN5bmNfcGluLCB0dmUtPnZzeW5jX3Bpbik7CiAJCWJyZWFrOwogCWNhc2UgVFZFX01PREVfVFZPVVQ6Ci0JCWlteF9kcm1fY3J0Y19wYW5lbF9mb3JtYXQoZW5jb2Rlci0+Y3J0YywgRFJNX01PREVfRU5DT0RFUl9UVkRBQywKLQkJCQkJICBWNEwyX1BJWF9GTVRfWVVWNDQ0KTsKKwkJaW14X2RybV9wYW5lbF9mb3JtYXQoZW5jb2RlciwgVjRMMl9QSVhfRk1UX1lVVjQ0NCk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM2NCwxNiArMzYyLDExIEBACiAJdHZlX2Rpc2FibGUodHZlKTsKIH0KIAotc3RhdGljIHZvaWQgaW14X3R2ZV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCS8qIGRvIG5vdCBmcmVlIGhlcmUgKi8KLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGlteF90dmVfY29ubmVjdG9yX2Z1bmNzID0gewogCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKIAkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKIAkuZGV0ZWN0ID0gaW14X3R2ZV9jb25uZWN0b3JfZGV0ZWN0LAotCS5kZXN0cm95ID0gaW14X3R2ZV9jb25uZWN0b3JfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGlteF90dmVfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTM4Myw3ICszNzYsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbXhfdHZlX2VuY29kZXJfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSBpbXhfdHZlX2VuY29kZXJfZGVzdHJveSwKKwkuZGVzdHJveSA9IGlteF9kcm1fZW5jb2Rlcl9kZXN0cm95LAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaW14X3R2ZV9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKQEAgLTUwMywzNCArNDk2LDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW14X3R2ZV9yZWdpc3RlcihzdHJ1Y3QgaW14X3R2ZSAqdHZlKQorc3RhdGljIGludCBpbXhfdHZlX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBpbXhfdHZlICp0dmUpCiB7CisJaW50IGVuY29kZXJfdHlwZTsKIAlpbnQgcmV0OwogCi0JdHZlLT5jb25uZWN0b3IuZnVuY3MgPSAmaW14X3R2ZV9jb25uZWN0b3JfZnVuY3M7Ci0JdHZlLT5lbmNvZGVyLmZ1bmNzID0gJmlteF90dmVfZW5jb2Rlcl9mdW5jczsKKwllbmNvZGVyX3R5cGUgPSB0dmUtPm1vZGUgPT0gVFZFX01PREVfVkdBID8KKwkJCQlEUk1fTU9ERV9FTkNPREVSX0RBQyA6IERSTV9NT0RFX0VOQ09ERVJfVFZEQUM7CiAKLQl0dmUtPmVuY29kZXIuZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9OT05FOwotCXR2ZS0+Y29ubmVjdG9yLmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKKwlyZXQgPSBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2YoZHJtLCAmdHZlLT5lbmNvZGVyLAorCQkJCSAgICAgICB0dmUtPmRldi0+b2Zfbm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJnR2ZS0+ZW5jb2RlciwgJmlteF90dmVfZW5jb2Rlcl9oZWxwZXJfZnVuY3MpOwotCXJldCA9IGlteF9kcm1fYWRkX2VuY29kZXIoJnR2ZS0+ZW5jb2RlciwgJnR2ZS0+aW14X2RybV9lbmNvZGVyLAotCQkJVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycih0dmUtPmRldiwgImFkZGluZyBlbmNvZGVyIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlkcm1fZW5jb2Rlcl9pbml0KGRybSwgJnR2ZS0+ZW5jb2RlciwgJmlteF90dmVfZW5jb2Rlcl9mdW5jcywKKwkJCSBlbmNvZGVyX3R5cGUpOwogCiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZ0dmUtPmNvbm5lY3RvciwKIAkJCSZpbXhfdHZlX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwotCi0JcmV0ID0gaW14X2RybV9hZGRfY29ubmVjdG9yKCZ0dmUtPmNvbm5lY3RvciwKLQkJCSZ0dmUtPmlteF9kcm1fY29ubmVjdG9yLCBUSElTX01PRFVMRSk7Ci0JaWYgKHJldCkgewotCQlpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKHR2ZS0+aW14X2RybV9lbmNvZGVyKTsKLQkJZGV2X2Vycih0dmUtPmRldiwgImFkZGluZyBjb25uZWN0b3IgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9jb25uZWN0b3JfaW5pdChkcm0sICZ0dmUtPmNvbm5lY3RvciwgJmlteF90dmVfY29ubmVjdG9yX2Z1bmNzLAorCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX1ZHQSk7CiAKIAlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJnR2ZS0+Y29ubmVjdG9yLCAmdHZlLT5lbmNvZGVyKTsKIApAQCAtNTc2LDkgKzU2MiwxMSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGlteF90dmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaW14X3R2ZV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRkY19ub2RlOwogCXN0cnVjdCBpbXhfdHZlICp0dmU7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC01ODcsMTQgKzU3NSwxNCBAQAogCWludCBpcnE7CiAJaW50IHJldDsKIAotCXR2ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnR2ZSksIEdGUF9LRVJORUwpOworCXR2ZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdHZlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0dmUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JdHZlLT5kZXYgPSAmcGRldi0+ZGV2OworCXR2ZS0+ZGV2ID0gZGV2OwogCXNwaW5fbG9ja19pbml0KCZ0dmUtPmxvY2spOwogCi0JZGRjX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAiZGRjIiwgMCk7CisJZGRjX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAiaTJjLWRkYy1idXMiLCAwKTsKIAlpZiAoZGRjX25vZGUpIHsKIAkJdHZlLT5kZGMgPSBvZl9maW5kX2kyY19hZGFwdGVyX2J5X25vZGUoZGRjX25vZGUpOwogCQlvZl9ub2RlX3B1dChkZGNfbm9kZSk7CkBAIC02MDIsNyArNTkwLDcgQEAKIAogCXR2ZS0+bW9kZSA9IG9mX2dldF90dmVfbW9kZShucCk7CiAJaWYgKHR2ZS0+bW9kZSAhPSBUVkVfTU9ERV9WR0EpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAib25seSBWR0EgbW9kZSBzdXBwb3J0ZWQsIGN1cnJlbnRseVxuIik7CisJCWRldl9lcnIoZGV2LCAib25seSBWR0EgbW9kZSBzdXBwb3J0ZWQsIGN1cnJlbnRseVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjExLDcgKzU5OSw3IEBACiAJCQkJCSAgICZ0dmUtPmhzeW5jX3Bpbik7CiAKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgdnN5bmMgcGluXG4iKTsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB2c3luYyBwaW5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC02MTksNDAgKzYwNyw0MCBAQAogCQkJCQkgICAgJnR2ZS0+dnN5bmNfcGluKTsKIAogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCB2c3luYyBwaW5cbiIpOworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHZzeW5jIHBpblxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKElTX0VSUihiYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CiAKIAl0dmVfcmVnbWFwX2NvbmZpZy5sb2NrX2FyZyA9IHR2ZTsKLQl0dmUtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoJnBkZXYtPmRldiwgInR2ZSIsIGJhc2UsCisJdHZlLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW9fY2xrKGRldiwgInR2ZSIsIGJhc2UsCiAJCQkJCQkmdHZlX3JlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIodHZlLT5yZWdtYXApKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0IHJlZ21hcDogJWxkXG4iLAorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0IHJlZ21hcDogJWxkXG4iLAogCQkJUFRSX0VSUih0dmUtPnJlZ21hcCkpOwogCQlyZXR1cm4gUFRSX0VSUih0dmUtPnJlZ21hcCk7CiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycVxuIik7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBpcnFcbiIpOwogCQlyZXR1cm4gaXJxOwogCX0KIAotCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgaXJxLCBOVUxMLAorCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBpcnEsIE5VTEwsCiAJCQkJCWlteF90dmVfaXJxX2hhbmRsZXIsIElSUUZfT05FU0hPVCwKIAkJCQkJImlteC10dmUiLCB0dmUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl0dmUtPmRhY19yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgImRhYyIpOworCXR2ZS0+ZGFjX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJkYWMiKTsKIAlpZiAoIUlTX0VSUih0dmUtPmRhY19yZWcpKSB7CiAJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZSh0dmUtPmRhY19yZWcsIDI3NTAwMDAsIDI3NTAwMDApOwogCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHR2ZS0+ZGFjX3JlZyk7CkBAIC02NjAsMTcgKzY0OCwxNyBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQl0dmUtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAidHZlIik7CisJdHZlLT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAidHZlIik7CiAJaWYgKElTX0VSUih0dmUtPmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBoaWdoIHNwZWVkIHR2ZSBjbG9jazogJWxkXG4iLAorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaGlnaCBzcGVlZCB0dmUgY2xvY2s6ICVsZFxuIiwKIAkJCVBUUl9FUlIodHZlLT5jbGspKTsKIAkJcmV0dXJuIFBUUl9FUlIodHZlLT5jbGspOwogCX0KIAogCS8qIHRoaXMgaXMgdGhlIElQVSBESSBjbG9jayBpbnB1dCBzZWxlY3RvciwgY2FuIGJlIHBhcmVudGVkIHRvIHR2ZV9kaSAqLwotCXR2ZS0+ZGlfc2VsX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZGlfc2VsIik7CisJdHZlLT5kaV9zZWxfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImRpX3NlbCIpOwogCWlmIChJU19FUlIodHZlLT5kaV9zZWxfY2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlwdSBkaSBtdXggY2xvY2s6ICVsZFxuIiwKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGlwdSBkaSBtdXggY2xvY2s6ICVsZFxuIiwKIAkJCVBUUl9FUlIodHZlLT5kaV9zZWxfY2xrKSk7CiAJCXJldHVybiBQVFJfRVJSKHR2ZS0+ZGlfc2VsX2Nsayk7CiAJfQpAQCAtNjgxLDQyICs2NjksNTEgQEAKIAogCXJldCA9IHJlZ21hcF9yZWFkKHR2ZS0+cmVnbWFwLCBUVkVfQ09NX0NPTkZfUkVHLCAmdmFsKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJaWYgKHZhbCAhPSAweDAwMTAwMDAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSBpbmRpY2F0ZXMgdGhpcyBpcyBub3QgYSBUVkV2MlxuIik7CisJCWRldl9lcnIoZGV2LCAiY29uZmlndXJhdGlvbiByZWdpc3RlciBkZWZhdWx0IHZhbHVlIGluZGljYXRlcyB0aGlzIGlzIG5vdCBhIFRWRXYyXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJLyogZGlzYWJsZSBjYWJsZSBkZXRlY3Rpb24gZm9yIFZHQSBtb2RlICovCiAJcmV0ID0gcmVnbWFwX3dyaXRlKHR2ZS0+cmVnbWFwLCBUVkVfQ0RfQ09OVF9SRUcsIDApOwogCi0JcmV0ID0gaW14X3R2ZV9yZWdpc3Rlcih0dmUpOworCXJldCA9IGlteF90dmVfcmVnaXN0ZXIoZHJtLCB0dmUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpbXhfZHJtX2VuY29kZXJfYWRkX3Bvc3NpYmxlX2NydGNzKHR2ZS0+aW14X2RybV9lbmNvZGVyLCBucCk7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0dmUpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHR2ZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfdHZlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgaW14X3R2ZV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgaW14X3R2ZSAqdHZlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZ0dmUtPmNvbm5lY3RvcjsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmdHZlLT5lbmNvZGVyOworCXN0cnVjdCBpbXhfdHZlICp0dmUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWRybV9tb2RlX2Nvbm5lY3Rvcl9kZXRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwotCi0JaW14X2RybV9yZW1vdmVfY29ubmVjdG9yKHR2ZS0+aW14X2RybV9jb25uZWN0b3IpOwotCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIodHZlLT5pbXhfZHJtX2VuY29kZXIpOworCXR2ZS0+Y29ubmVjdG9yLmZ1bmNzLT5kZXN0cm95KCZ0dmUtPmNvbm5lY3Rvcik7CisJdHZlLT5lbmNvZGVyLmZ1bmNzLT5kZXN0cm95KCZ0dmUtPmVuY29kZXIpOwogCiAJaWYgKCFJU19FUlIodHZlLT5kYWNfcmVnKSkKIAkJcmVndWxhdG9yX2Rpc2FibGUodHZlLT5kYWNfcmVnKTsKK30KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGlteF90dmVfb3BzID0geworCS5iaW5kCT0gaW14X3R2ZV9iaW5kLAorCS51bmJpbmQJPSBpbXhfdHZlX3VuYmluZCwKK307CisKK3N0YXRpYyBpbnQgaW14X3R2ZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBjb21wb25lbnRfYWRkKCZwZGV2LT5kZXYsICZpbXhfdHZlX29wcyk7Cit9CisKK3N0YXRpYyBpbnQgaW14X3R2ZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZpbXhfdHZlX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pbXgtaXB1LXYzLmggYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaW14LWlwdS12My5oCmluZGV4IDQ4MjZiNWMuLmM0ZDE0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pbXgtaXB1LXYzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lteC1pcHUtdjMuaApAQCAtMjUsNiArMjUsOCBAQAogCUlQVVYzSCwKIH07CiAKKyNkZWZpbmUgSVBVX1BJWF9GTVRfR0JSMjQJdjRsMl9mb3VyY2MoJ0cnLCAnQicsICdSJywgJzMnKQorCiAvKgogICogQml0ZmllbGQgb2YgRGlzcGxheSBJbnRlcmZhY2Ugc2lnbmFsIHBvbGFyaXRpZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGMuYwppbmRleCBkMGUzYmMzLi5kNWRlOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kYy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAogCS8qIFdhaXQgZm9yIERDIHRyaXBsZSBidWZmZXIgdG8gZW1wdHkgKi8KIAl3aGlsZSAoKHJlYWRsKHByaXYtPmRjX3JlZyArIERDX1NUQVQpICYgdmFsKSAhPSB2YWwpIHsKLQkJbXNsZWVwKDIpOworCQl1c2xlZXBfcmFuZ2UoMjAwMCwgMjAwMDApOwogCQl0aW1lb3V0IC09IDI7CiAJCWlmICh0aW1lb3V0IDw9IDApCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZGkuYwppbmRleCA5NDhhNDliLi44MmE5ZWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHUtdjMvaXB1LWRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kaS5jCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KIAogI2luY2x1ZGUgImlteC1pcHUtdjMuaCIKICNpbmNsdWRlICJpcHUtcHJ2LmgiCkBAIC0zMywxMCArMzAsNyBAQAogCXN0cnVjdCBjbGsgKmNsa19kaTsJLyogZGlzcGxheSBpbnB1dCBjbG9jayAqLwogCXN0cnVjdCBjbGsgKmNsa19pcHU7CS8qIElQVSBidXMgY2xvY2sgKi8KIAlzdHJ1Y3QgY2xrICpjbGtfZGlfcGl4ZWw7IC8qIHJlc3VsdGluZyBwaXhlbCBjbG9jayAqLwotCXN0cnVjdCBjbGtfaHcgY2xrX2h3X291dDsKLQljaGFyICpjbGtfbmFtZTsKIAlib29sIGludXNlOwotCXVuc2lnbmVkIGxvbmcgY2xrZmxhZ3M7CiAJc3RydWN0IGlwdV9zb2MgKmlwdTsKIH07CiAKQEAgLTE0MSwxMzAgKzEzNSw2IEBACiAJd3JpdGVsKHZhbHVlLCBkaS0+YmFzZSArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyBpbnQgaXB1X2RpX2Nsa19jYWxjX2Rpdih1bnNpZ25lZCBsb25nIGlucmF0ZSwgdW5zaWduZWQgbG9uZyBvdXRyYXRlKQotewotCXU2NCB0bXAgPSBpbnJhdGU7Ci0JaW50IGRpdjsKLQotCXRtcCAqPSAxNjsKLQotCWRvX2Rpdih0bXAsIG91dHJhdGUpOwotCi0JZGl2ID0gdG1wOwotCi0JaWYgKGRpdiA8IDB4MTApCi0JCWRpdiA9IDB4MTA7Ci0KLSNpZmRlZiBXVEZfSVNfVEhJUwotCS8qCi0JICogRnJlZXNjYWxlIGhhcyB0aGlzIGluIHRoZWlyIEtlcm5lbC4gSXQgaXMgbmVpdGhlciBjbGVhciB3aGF0Ci0JICogaXQgZG9lcyBub3Igd2h5IGl0IGRvZXMgaXQKLQkgKi8KLQlpZiAoZGl2ICYgMHgxMCkKLQkJZGl2ICY9IH4weDc7Ci0JZWxzZSB7Ci0JCS8qIFJvdW5kIHVwIGRpdmlkZXIgaWYgaXQgZ2V0cyB1cyBjbG9zZXIgdG8gZGVzaXJlZCBwaXggY2xrICovCi0JCWlmICgoZGl2ICYgMHhDKSA9PSAweEMpIHsKLQkJCWRpdiArPSAweDEwOwotCQkJZGl2ICY9IH4weEY7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlyZXR1cm4gZGl2OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfZGlfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCi0JCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCi17Ci0Jc3RydWN0IGlwdV9kaSAqZGkgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBpcHVfZGksIGNsa19od19vdXQpOwotCXVuc2lnbmVkIGxvbmcgb3V0cmF0ZTsKLQl1MzIgZGl2ID0gaXB1X2RpX3JlYWQoZGksIERJX0JTX0NMS0dFTjApOwotCi0JaWYgKGRpdiA8IDB4MTApCi0JCWRpdiA9IDB4MTA7Ci0KLQlvdXRyYXRlID0gKHBhcmVudF9yYXRlIC8gZGl2KSAqIDE2OwotCi0JcmV0dXJuIG91dHJhdGU7Ci19Ci0KLXN0YXRpYyBsb25nIGNsa19kaV9yb3VuZF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCQkJdW5zaWduZWQgbG9uZyAqcHJhdGUpCi17Ci0Jc3RydWN0IGlwdV9kaSAqZGkgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBpcHVfZGksIGNsa19od19vdXQpOwotCXVuc2lnbmVkIGxvbmcgb3V0cmF0ZTsKLQlpbnQgZGl2OwotCXUzMiB2YWw7Ci0KLQlkaXYgPSBpcHVfZGlfY2xrX2NhbGNfZGl2KCpwcmF0ZSwgcmF0ZSk7Ci0KLQlvdXRyYXRlID0gKCpwcmF0ZSAvIGRpdikgKiAxNjsKLQotCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKTsKLQotCWlmICghKHZhbCAmIERJX0dFTl9ESV9DTEtfRVhUKSAmJiBvdXRyYXRlID4gKnByYXRlIC8gMikKLQkJb3V0cmF0ZSA9ICpwcmF0ZSAvIDI7Ci0KLQlkZXZfZGJnKGRpLT5pcHUtPmRldiwKLQkJIiVzOiBpbnJhdGU6ICVsZCBkaXY6IDB4JTA4eCBvdXRyYXRlOiAlbGQgd2FudGVkOiAlbGRcbiIsCi0JCQlfX2Z1bmNfXywgKnByYXRlLCBkaXYsIG91dHJhdGUsIHJhdGUpOwotCi0JcmV0dXJuIG91dHJhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX2RpX3NldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JaW50IGRpdjsKLQl1MzIgY2xrZ2VuMDsKLQotCWNsa2dlbjAgPSBpcHVfZGlfcmVhZChkaSwgRElfQlNfQ0xLR0VOMCkgJiB+MHhmZmY7Ci0KLQlkaXYgPSBpcHVfZGlfY2xrX2NhbGNfZGl2KHBhcmVudF9yYXRlLCByYXRlKTsKLQotCWlwdV9kaV93cml0ZShkaSwgY2xrZ2VuMCB8IGRpdiwgRElfQlNfQ0xLR0VOMCk7Ci0KLQlkZXZfZGJnKGRpLT5pcHUtPmRldiwgIiVzOiBpbnJhdGU6ICVsZCBkZXNpcmVkOiAlbGQgZGl2OiAweCUwOHhcbiIsCi0JCQlfX2Z1bmNfXywgcGFyZW50X3JhdGUsIHJhdGUsIGRpdik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBjbGtfZGlfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JdTMyIHZhbDsKLQotCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKTsKLQotCXJldHVybiB2YWwgJiBESV9HRU5fRElfQ0xLX0VYVCA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW50IGNsa19kaV9zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKLXsKLQlzdHJ1Y3QgaXB1X2RpICpkaSA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGlwdV9kaSwgY2xrX2h3X291dCk7Ci0JdTMyIHZhbDsKLQotCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKTsKLQotCWlmIChpbmRleCkKLQkJdmFsIHw9IERJX0dFTl9ESV9DTEtfRVhUOwotCWVsc2UKLQkJdmFsICY9IH5ESV9HRU5fRElfQ0xLX0VYVDsKLQotCWlwdV9kaV93cml0ZShkaSwgdmFsLCBESV9HRU5FUkFMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgY2xrX2RpX29wcyA9IHsKLQkucm91bmRfcmF0ZSA9IGNsa19kaV9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZSA9IGNsa19kaV9zZXRfcmF0ZSwKLQkucmVjYWxjX3JhdGUgPSBjbGtfZGlfcmVjYWxjX3JhdGUsCi0JLnNldF9wYXJlbnQgPSBjbGtfZGlfc2V0X3BhcmVudCwKLQkuZ2V0X3BhcmVudCA9IGNsa19kaV9nZXRfcGFyZW50LAotfTsKLQogc3RhdGljIHZvaWQgaXB1X2RpX2RhdGFfd2F2ZV9jb25maWcoc3RydWN0IGlwdV9kaSAqZGksCiAJCQkJICAgICBpbnQgd2F2ZV9nZW4sCiAJCQkJICAgICBpbnQgYWNjZXNzX3NpemUsIGludCBjb21wb25lbnRfc2l6ZSkKQEAgLTUyOCwxNSArMzk4LDEyNSBAQAogCQlpcHVfZGlfc3luY19jb25maWcoZGksIGNmZ192Z2EsIDAsIEFSUkFZX1NJWkUoY2ZnX3ZnYSkpOwogfQogCitzdGF0aWMgdm9pZCBpcHVfZGlfY29uZmlnX2Nsb2NrKHN0cnVjdCBpcHVfZGkgKmRpLAorCWNvbnN0IHN0cnVjdCBpcHVfZGlfc2lnbmFsX2NmZyAqc2lnKQoreworCXN0cnVjdCBjbGsgKmNsazsKKwl1bnNpZ25lZCBjbGtnZW4wOworCXVpbnQzMl90IHZhbDsKKworCWlmIChzaWctPmNsa2ZsYWdzICYgSVBVX0RJX0NMS01PREVfRVhUKSB7CisJCS8qCisJCSAqIENMS01PREVfRVhUIG1lYW5zIHdlIG11c3QgdXNlIHRoZSBESSBjbG9jazogdGhpcyBpcworCQkgKiBuZWVkZWQgZm9yIHRoaW5ncyBsaWtlIExWRFMgd2hpY2ggbmVlZHMgdG8gZmVlZCB0aGUKKwkJICogREkgYW5kIExEQiB3aXRoIHRoZSBzYW1lIHBpeGVsIGNsb2NrLgorCQkgKi8KKwkJY2xrID0gZGktPmNsa19kaTsKKworCQlpZiAoc2lnLT5jbGtmbGFncyAmIElQVV9ESV9DTEtNT0RFX1NZTkMpIHsKKwkJCS8qCisJCQkgKiBDTEtNT0RFX1NZTkMgbWVhbnMgdGhhdCB3ZSB3YW50IHRoZSBESSB0byBiZQorCQkJICogY2xvY2tlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBwYXJlbnQgY2xvY2suCisJCQkgKiBUaGlzIGlzIG5lZWRlZCAoZWcpIGZvciBMREIgd2hpY2ggbmVlZHMgdG8gYmUKKwkJCSAqIGZlZCB3aXRoIHRoZSBzYW1lIHBpeGVsIGNsb2NrLiAgV2UgYXNzdW1lIHRoYXQKKwkJCSAqIHRoZSBMREIgY2xvY2sgaGFzIGFscmVhZHkgYmVlbiBzZXQgY29ycmVjdGx5LgorCQkJICovCisJCQljbGtnZW4wID0gMSA8PCA0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGNhbiB1c2UgdGhlIGRpdmlkZXIuICBXZSBzaG91bGQgcmVhbGx5IGhhdmUKKwkJCSAqIGEgZmxhZyBoZXJlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYnJpZGdlIGNhbgorCQkJICogY29wZSB3aXRoIGEgZnJhY3Rpb25hbCBkaXZpZGVyIG9yIG5vdC4gIEZvciB0aGUKKwkJCSAqIHRpbWUgYmVpbmcsIGxldCdzIGdvIGZvciBzaW1wbGljaXRseSBhbmQKKwkJCSAqIHJlbGlhYmlsaXR5LgorCQkJICovCisJCQl1bnNpZ25lZCBsb25nIGluX3JhdGU7CisJCQl1bnNpZ25lZCBkaXY7CisKKwkJCWNsa19zZXRfcmF0ZShjbGssIHNpZy0+cGl4ZWxjbG9jayk7CisKKwkJCWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJCWRpdiA9IChpbl9yYXRlICsgc2lnLT5waXhlbGNsb2NrIC8gMikgLyBzaWctPnBpeGVsY2xvY2s7CisJCQlpZiAoZGl2ID09IDApCisJCQkJZGl2ID0gMTsKKworCQkJY2xrZ2VuMCA9IGRpdiA8PCA0OworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRm9yIG90aGVyIGludGVyZmFjZXMsIHdlIGNhbiBhcmJpdGFyaWx5IHNlbGVjdCBiZXR3ZWVuCisJCSAqIHRoZSBESSBzcGVjaWZpYyBjbG9jayBhbmQgdGhlIGludGVybmFsIElQVSBjbG9jay4gIFNlZQorCQkgKiBESV9HRU5FUkFMIGJpdCAyMC4gIFdlIHNlbGVjdCB0aGUgSVBVIGNsb2NrIGlmIGl0IGNhbgorCQkgKiBnaXZlIHVzIGEgY2xvY2sgcmF0ZSB3aXRoaW4gMSUgb2YgdGhlIHJlcXVlc3RlZCBmcmVxdWVuY3ksCisJCSAqIG90aGVyd2lzZSB3ZSB1c2UgdGhlIERJIGNsb2NrLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyByYXRlLCBjbGtyYXRlOworCQl1bnNpZ25lZCBkaXYsIGVycm9yOworCisJCWNsa3JhdGUgPSBjbGtfZ2V0X3JhdGUoZGktPmNsa19pcHUpOworCQlkaXYgPSAoY2xrcmF0ZSArIHNpZy0+cGl4ZWxjbG9jayAvIDIpIC8gc2lnLT5waXhlbGNsb2NrOworCQlyYXRlID0gY2xrcmF0ZSAvIGRpdjsKKworCQllcnJvciA9IHJhdGUgLyAoc2lnLT5waXhlbGNsb2NrIC8gMTAwMCk7CisKKwkJZGV2X2RiZyhkaS0+aXB1LT5kZXYsICIgIElQVSBjbG9jayBjYW4gZ2l2ZSAlbHUgd2l0aCBkaXZpZGVyICV1LCBlcnJvciAlZC4ldSUlXG4iLAorCQkJcmF0ZSwgZGl2LCAoc2lnbmVkKShlcnJvciAtIDEwMDApIC8gMTAsIGVycm9yICUgMTApOworCisJCS8qIEFsbG93IGEgMSUgZXJyb3IgKi8KKwkJaWYgKGVycm9yIDwgMTAxMCAmJiBlcnJvciA+PSA5OTApIHsKKwkJCWNsayA9IGRpLT5jbGtfaXB1OworCisJCQljbGtnZW4wID0gZGl2IDw8IDQ7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIGluX3JhdGU7CisJCQl1bnNpZ25lZCBkaXY7CisKKwkJCWNsayA9IGRpLT5jbGtfZGk7CisKKwkJCWNsa19zZXRfcmF0ZShjbGssIHNpZy0+cGl4ZWxjbG9jayk7CisKKwkJCWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJCWRpdiA9IChpbl9yYXRlICsgc2lnLT5waXhlbGNsb2NrIC8gMikgLyBzaWctPnBpeGVsY2xvY2s7CisJCQlpZiAoZGl2ID09IDApCisJCQkJZGl2ID0gMTsKKworCQkJY2xrZ2VuMCA9IGRpdiA8PCA0OworCQl9CisJfQorCisJZGktPmNsa19kaV9waXhlbCA9IGNsazsKKworCS8qIFNldCB0aGUgZGl2aWRlciAqLworCWlwdV9kaV93cml0ZShkaSwgY2xrZ2VuMCwgRElfQlNfQ0xLR0VOMCk7CisKKwkvKgorCSAqIFNldCB0aGUgaGlnaC9sb3cgcGVyaW9kcy4gIEJpdHMgMjQ6MTYgZ2l2ZSB1cyB0aGUgZmFsbGluZyBlZGdlLAorCSAqIGFuZCBiaXRzIDg6MCBnaXZlIHRoZSByaXNpbmcgZWRnZS4gIExTQiBpcyBmcmFjdGlvbiwgYW5kIGlzCisJICogYmFzZWQgb24gdGhlIGRpdmlkZXIgYWJvdmUuICBXZSB3YW50IGEgNTAlIGR1dHkgY3ljbGUsIHNvIHNldAorCSAqIHRoZSBmYWxsaW5nIGVkZ2UgdG8gYmUgaGFsZiB0aGUgZGl2aWRlci4KKwkgKi8KKwlpcHVfZGlfd3JpdGUoZGksIChjbGtnZW4wID4+IDQpIDw8IDE2LCBESV9CU19DTEtHRU4xKTsKKworCS8qIEZpbmFsbHkgc2VsZWN0IHRoZSBpbnB1dCBjbG9jayAqLworCXZhbCA9IGlwdV9kaV9yZWFkKGRpLCBESV9HRU5FUkFMKSAmIH5ESV9HRU5fRElfQ0xLX0VYVDsKKwlpZiAoY2xrID09IGRpLT5jbGtfZGkpCisJCXZhbCB8PSBESV9HRU5fRElfQ0xLX0VYVDsKKwlpcHVfZGlfd3JpdGUoZGksIHZhbCwgRElfR0VORVJBTCk7CisKKwlkZXZfZGJnKGRpLT5pcHUtPmRldiwgIldhbnQgJWx1SHogSVBVICVsdUh6IERJICVsdUh6IHVzaW5nICVzLCAlbHVIelxuIiwKKwkJc2lnLT5waXhlbGNsb2NrLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19pcHUpLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19kaSksCisJCWNsayA9PSBkaS0+Y2xrX2RpID8gIkRJIiA6ICJJUFUiLAorCQljbGtfZ2V0X3JhdGUoZGktPmNsa19kaV9waXhlbCkgLyAoY2xrZ2VuMCA+PiA0KSk7Cit9CisKIGludCBpcHVfZGlfaW5pdF9zeW5jX3BhbmVsKHN0cnVjdCBpcHVfZGkgKmRpLCBzdHJ1Y3QgaXB1X2RpX3NpZ25hbF9jZmcgKnNpZykKIHsKIAl1MzIgcmVnOwogCXUzMiBkaV9nZW4sIHZzeW5jX2NudDsKIAl1MzIgZGl2OwogCXUzMiBoX3RvdGFsLCB2X3RvdGFsOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyByb3VuZDsKLQlzdHJ1Y3QgY2xrICpwYXJlbnQ7CiAKIAlkZXZfZGJnKGRpLT5pcHUtPmRldiwgImRpc3AgJWQ6IHBhbmVsIHNpemUgPSAlZCB4ICVkXG4iLAogCQlkaS0+aWQsIHNpZy0+d2lkdGgsIHNpZy0+aGVpZ2h0KTsKQEAgLTU0NCwzMyArNTI0LDIwIEBACiAJaWYgKChzaWctPnZfc3luY193aWR0aCA9PSAwKSB8fCAoc2lnLT5oX3N5bmNfd2lkdGggPT0gMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHNpZy0+Y2xrZmxhZ3MgJiBJUFVfRElfQ0xLTU9ERV9FWFQpCi0JCXBhcmVudCA9IGRpLT5jbGtfZGk7Ci0JZWxzZQotCQlwYXJlbnQgPSBkaS0+Y2xrX2lwdTsKLQotCXJldCA9IGNsa19zZXRfcGFyZW50KGRpLT5jbGtfZGlfcGl4ZWwsIHBhcmVudCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5pcHUtPmRldiwKLQkJCSJzZXR0aW5nIHBpeGVsIGNsb2NrIHRvIHBhcmVudCAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCQlfX2Nsa19nZXRfbmFtZShwYXJlbnQpLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChzaWctPmNsa2ZsYWdzICYgSVBVX0RJX0NMS01PREVfU1lOQykKLQkJcm91bmQgPSBjbGtfZ2V0X3JhdGUocGFyZW50KTsKLQllbHNlCi0JCXJvdW5kID0gY2xrX3JvdW5kX3JhdGUoZGktPmNsa19kaV9waXhlbCwgc2lnLT5waXhlbGNsb2NrKTsKLQotCXJldCA9IGNsa19zZXRfcmF0ZShkaS0+Y2xrX2RpX3BpeGVsLCByb3VuZCk7Ci0KIAloX3RvdGFsID0gc2lnLT53aWR0aCArIHNpZy0+aF9zeW5jX3dpZHRoICsgc2lnLT5oX3N0YXJ0X3dpZHRoICsKIAkJc2lnLT5oX2VuZF93aWR0aDsKIAl2X3RvdGFsID0gc2lnLT5oZWlnaHQgKyBzaWctPnZfc3luY193aWR0aCArIHNpZy0+dl9zdGFydF93aWR0aCArCiAJCXNpZy0+dl9lbmRfd2lkdGg7CiAKKwlkZXZfZGJnKGRpLT5pcHUtPmRldiwgIkNsb2NrczogSVBVICVsdUh6IERJICVsdUh6IE5lZWRlZCAlbHVIelxuIiwKKwkJY2xrX2dldF9yYXRlKGRpLT5jbGtfaXB1KSwKKwkJY2xrX2dldF9yYXRlKGRpLT5jbGtfZGkpLAorCQlzaWctPnBpeGVsY2xvY2spOworCiAJbXV0ZXhfbG9jaygmZGlfbXV0ZXgpOwogCisJaXB1X2RpX2NvbmZpZ19jbG9jayhkaSwgc2lnKTsKKwogCWRpdiA9IGlwdV9kaV9yZWFkKGRpLCBESV9CU19DTEtHRU4wKSAmIDB4ZmZmOwogCWRpdiA9IGRpdiAvIDE2OwkJLyogTm93IGRpdmlkZXIgaXMgaW50ZWdlciBwb3J0aW9uICovCiAKQEAgLTY1NCw3ICs2MjEsMTEgQEAKIAogaW50IGlwdV9kaV9lbmFibGUoc3RydWN0IGlwdV9kaSAqZGkpCiB7Ci0JaW50IHJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkaS0+Y2xrX2RpX3BpeGVsKTsKKwlpbnQgcmV0OworCisJV0FSTl9PTihJU19FUlIoZGktPmNsa19kaV9waXhlbCkpOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRpLT5jbGtfZGlfcGl4ZWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTY2Niw2ICs2MzcsOCBAQAogCiBpbnQgaXB1X2RpX2Rpc2FibGUoc3RydWN0IGlwdV9kaSAqZGkpCiB7CisJV0FSTl9PTihJU19FUlIoZGktPmNsa19kaV9waXhlbCkpOworCiAJaXB1X21vZHVsZV9kaXNhYmxlKGRpLT5pcHUsIGRpLT5tb2R1bGUpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRpLT5jbGtfZGlfcGl4ZWwpOwpAQCAtNzIxLDEzICs2OTQsNiBAQAogCQl1MzIgbW9kdWxlLCBzdHJ1Y3QgY2xrICpjbGtfaXB1KQogewogCXN0cnVjdCBpcHVfZGkgKmRpOwotCWludCByZXQ7Ci0JY29uc3QgY2hhciAqZGlfcGFyZW50WzJdOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQgPSB7Ci0JCS5vcHMgPSAmY2xrX2RpX29wcywKLQkJLm51bV9wYXJlbnRzID0gMiwKLQkJLmZsYWdzID0gMCwKLQl9OwogCiAJaWYgKGlkID4gMSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NDksNDUgKzcxNSwxNiBAQAogCWlmICghZGktPmJhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGlfcGFyZW50WzBdID0gX19jbGtfZ2V0X25hbWUoZGktPmNsa19pcHUpOwotCWRpX3BhcmVudFsxXSA9IF9fY2xrX2dldF9uYW1lKGRpLT5jbGtfZGkpOwotCiAJaXB1X2RpX3dyaXRlKGRpLCAweDEwLCBESV9CU19DTEtHRU4wKTsKIAotCWluaXQucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKiopJmRpX3BhcmVudDsKLQlkaS0+Y2xrX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzX2RpJWRfcGl4ZWwiLAotCQkJZGV2X25hbWUoZGV2KSwgaWQpOwotCWlmICghZGktPmNsa19uYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluaXQubmFtZSA9IGRpLT5jbGtfbmFtZTsKLQotCWRpLT5jbGtfaHdfb3V0LmluaXQgPSAmaW5pdDsKLQlkaS0+Y2xrX2RpX3BpeGVsID0gY2xrX3JlZ2lzdGVyKGRldiwgJmRpLT5jbGtfaHdfb3V0KTsKLQotCWlmIChJU19FUlIoZGktPmNsa19kaV9waXhlbCkpIHsKLQkJcmV0ID0gUFRSX0VSUihkaS0+Y2xrX2RpX3BpeGVsKTsKLQkJZ290byBmYWlsZWRfY2xrX3JlZ2lzdGVyOwotCX0KLQogCWRldl9kYmcoZGV2LCAiREklZCBiYXNlOiAweCUwOGx4IHJlbWFwcGVkIHRvICVwXG4iLAogCQkJaWQsIGJhc2UsIGRpLT5iYXNlKTsKIAlkaS0+aW51c2UgPSBmYWxzZTsKIAlkaS0+aXB1ID0gaXB1OwogCiAJcmV0dXJuIDA7Ci0KLWZhaWxlZF9jbGtfcmVnaXN0ZXI6Ci0KLQlrZnJlZShkaS0+Y2xrX25hbWUpOwotCi0JcmV0dXJuIHJldDsKIH0KIAogdm9pZCBpcHVfZGlfZXhpdChzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBpbnQgaWQpCiB7Ci0Jc3RydWN0IGlwdV9kaSAqZGkgPSBpcHUtPmRpX3ByaXZbaWRdOwotCi0JY2xrX3VucmVnaXN0ZXIoZGktPmNsa19kaV9waXhlbCk7Ci0Ja2ZyZWUoZGktPmNsa19uYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdS12My9pcHUtZG1mYy5jIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMKaW5kZXggOTgwNzBkZC4uNDUyMTMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1LXYzL2lwdS1kbWZjLmMKQEAgLTE2MSw5ICsxNjEsNiBAQAogCQkJImRtZmM6IHVzaW5nICVkIHNsb3RzIHN0YXJ0aW5nIGZyb20gc2VnbWVudCAlZCBmb3IgSVBVIGNoYW5uZWwgJWRcbiIsCiAJCQlzbG90cywgc2VnbWVudCwgZG1mYy0+ZGF0YS0+aXB1X2NoYW5uZWwpOwogCi0JaWYgKCFkbWZjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXN3aXRjaCAoc2xvdHMpIHsKIAljYXNlIDE6CiAJCWZpZWxkID0gRE1GQ19GSUZPX1NJWkVfNjQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1jcnRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1jcnRjLmMKaW5kZXggMjJiZTEwNC4uYThkMDE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtY3J0Yy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLWNydGMuYwpAQCAtMTcsNiArMTcsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAogICogTUEgMDIxMTAtMTMwMSwgVVNBLgogICovCisjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0yODQsNiArMjg1LDcgQEAKIAkJaXB1X2NydGMtPmRpX2Nsa2ZsYWdzID0gSVBVX0RJX0NMS01PREVfU1lOQyB8CiAJCQlJUFVfRElfQ0xLTU9ERV9FWFQ7CiAJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRU5DT0RFUl9UTURTOgogCWNhc2UgRFJNX01PREVfRU5DT0RFUl9OT05FOgogCQlpcHVfY3J0Yy0+ZGlfY2xrZmxhZ3MgPSAwOwogCQlicmVhazsKQEAgLTMzNCw3ICszMzYsNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdV9jcnRjX2luaXQoc3RydWN0IGlwdV9jcnRjICppcHVfY3J0YywKLQkJc3RydWN0IGlwdV9jbGllbnRfcGxhdGZvcm1kYXRhICpwZGF0YSkKKwlzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRhdGEgKnBkYXRhLCBzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQogewogCXN0cnVjdCBpcHVfc29jICppcHUgPSBkZXZfZ2V0X2RydmRhdGEoaXB1X2NydGMtPmRldi0+cGFyZW50KTsKIAlpbnQgZHAgPSAtRUlOVkFMOwpAQCAtMzQ4LDEwICszNTAsOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGlteF9kcm1fYWRkX2NydGMoJmlwdV9jcnRjLT5iYXNlLAotCQkJJmlwdV9jcnRjLT5pbXhfY3J0YywKLQkJCSZpcHVfY3J0Y19oZWxwZXJfZnVuY3MsIFRISVNfTU9EVUxFLAotCQkJaXB1X2NydGMtPmRldi0+cGFyZW50LT5vZl9ub2RlLCBwZGF0YS0+ZGkpOworCXJldCA9IGlteF9kcm1fYWRkX2NydGMoZHJtLCAmaXB1X2NydGMtPmJhc2UsICZpcHVfY3J0Yy0+aW14X2NydGMsCisJCQkmaXB1X2NydGNfaGVscGVyX2Z1bmNzLCBpcHVfY3J0Yy0+ZGV2LT5vZl9ub2RlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoaXB1X2NydGMtPmRldiwgImFkZGluZyBjcnRjIGZhaWxlZCB3aXRoICVkLlxuIiwgcmV0KTsKIAkJZ290byBlcnJfcHV0X3Jlc291cmNlczsKQEAgLTM5OSw0MyArMzk5LDk2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpcHVfZHJtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICppcHVfZHJtX2dldF9wb3J0X2J5X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LAorCQkJCQkJICBpbnQgcG9ydF9pZCkKIHsKLQlzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpwb3J0OworCWludCBpZCwgcmV0OworCisJcG9ydCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKHBhcmVudCwgInBvcnQiKTsKKwl3aGlsZSAocG9ydCkgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwb3J0LCAicmVnIiwgJmlkKTsKKwkJaWYgKCFyZXQgJiYgaWQgPT0gcG9ydF9pZCkKKwkJCXJldHVybiBwb3J0OworCisJCWRvIHsKKwkJCXBvcnQgPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIHBvcnQpOworCQkJaWYgKCFwb3J0KQorCQkJCXJldHVybiBOVUxMOworCQl9IHdoaWxlIChvZl9ub2RlX2NtcChwb3J0LT5uYW1lLCAicG9ydCIpKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpcHVfZHJtX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwdV9jbGllbnRfcGxhdGZvcm1kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gZGF0YTsKIAlzdHJ1Y3QgaXB1X2NydGMgKmlwdV9jcnRjOwogCWludCByZXQ7CiAKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaXB1X2NydGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppcHVfY3J0YyksIEdGUF9LRVJORUwpOworCWlwdV9jcnRjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppcHVfY3J0YyksIEdGUF9LRVJORUwpOwogCWlmICghaXB1X2NydGMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaXB1X2NydGMtPmRldiA9ICZwZGV2LT5kZXY7CisJaXB1X2NydGMtPmRldiA9IGRldjsKIAotCXJldCA9IGlwdV9jcnRjX2luaXQoaXB1X2NydGMsIHBkYXRhKTsKKwlyZXQgPSBpcHVfY3J0Y19pbml0KGlwdV9jcnRjLCBwZGF0YSwgZHJtKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaXB1X2NydGMpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGlwdV9jcnRjKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlwdV9kcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBpcHVfZHJtX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwl2b2lkICpkYXRhKQogewotCXN0cnVjdCBpcHVfY3J0YyAqaXB1X2NydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaXB1X2NydGMgKmlwdV9jcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpbXhfZHJtX3JlbW92ZV9jcnRjKGlwdV9jcnRjLT5pbXhfY3J0Yyk7CiAKIAlpcHVfcGxhbmVfcHV0X3Jlc291cmNlcyhpcHVfY3J0Yy0+cGxhbmVbMF0pOwogCWlwdV9wdXRfcmVzb3VyY2VzKGlwdV9jcnRjKTsKK30KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGlwdV9jcnRjX29wcyA9IHsKKwkuYmluZCA9IGlwdV9kcm1fYmluZCwKKwkudW5iaW5kID0gaXB1X2RybV91bmJpbmQsCit9OworCitzdGF0aWMgaW50IGlwdV9kcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBpcHVfY2xpZW50X3BsYXRmb3JtZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKworCWlmICghZGV2LT5wbGF0Zm9ybV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGV2LT5vZl9ub2RlKSB7CisJCS8qIEFzc29jaWF0ZSBjcnRjIGRldmljZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIERJIHBvcnQgbm9kZSAqLworCQlkZXYtPm9mX25vZGUgPSBpcHVfZHJtX2dldF9wb3J0X2J5X2lkKGRldi0+cGFyZW50LT5vZl9ub2RlLAorCQkJCQkJICAgICAgcGRhdGEtPmRpICsgMik7CisJCWlmICghZGV2LT5vZl9ub2RlKSB7CisJCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgcG9ydEAlZCBub2RlIGluICVzXG4iLAorCQkJCXBkYXRhLT5kaSArIDIsIGRldi0+cGFyZW50LT5vZl9ub2RlLT5mdWxsX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXQgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvbXBvbmVudF9hZGQoZGV2LCAmaXB1X2NydGNfb3BzKTsKK30KKworc3RhdGljIGludCBpcHVfZHJtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbXBvbmVudF9kZWwoJnBkZXYtPmRldiwgJmlwdV9jcnRjX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLXBsYW5lLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9pcHV2My1wbGFuZS5jCmluZGV4IDM0YjY0MmEuLmIwYzliNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL2lwdXYzLXBsYW5lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vaXB1djMtcGxhbmUuYwpAQCAtNzIsOCArNzIsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlkZXZfZGJnKGlwdV9wbGFuZS0+YmFzZS5kZXYtPmRldiwgInBoeXMgPSAweCV4LCB4ID0gJWQsIHkgPSAlZCIsCi0JCWNtYV9vYmotPnBhZGRyLCB4LCB5KTsKKwlkZXZfZGJnKGlwdV9wbGFuZS0+YmFzZS5kZXYtPmRldiwgInBoeXMgPSAlcGFkLCB4ID0gJWQsIHkgPSAlZCIsCisJCSZjbWFfb2JqLT5wYWRkciwgeCwgeSk7CiAKIAljcG1lbSA9IGlwdV9nZXRfY3BtZW0oaXB1X3BsYW5lLT5pcHVfY2gpOwogCWlwdV9jcG1lbV9zZXRfc3RyaWRlKGNwbWVtLCBmYi0+cGl0Y2hlc1swXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW14LWRybS9wYXJhbGxlbC1kaXNwbGF5LmMKaW5kZXggMzUxZDYxZC4uYzYwYjZjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lteC1kcm0vcGFyYWxsZWwtZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbXgtZHJtL3BhcmFsbGVsLWRpc3BsYXkuYwpAQCAtMTgsMTAgKzE4LDEyIEBACiAgKiBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGRybS9kcm1QLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mYl9oZWxwZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wYW5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPHZpZGVvL29mX2Rpc3BsYXlfdGltaW5nLmg+CiAKQEAgLTMyLDE1ICszNCwxNCBAQAogCiBzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgewogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGNvbm5lY3RvcjsKLQlzdHJ1Y3QgaW14X2RybV9jb25uZWN0b3IgKmlteF9kcm1fY29ubmVjdG9yOwogCXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOwotCXN0cnVjdCBpbXhfZHJtX2VuY29kZXIgKmlteF9kcm1fZW5jb2RlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJdm9pZCAqZWRpZDsKIAlpbnQgZWRpZF9sZW47CiAJdTMyIGludGVyZmFjZV9waXhfZm10OwogCWludCBtb2RlX3ZhbGlkOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG1vZGU7CisJc3RydWN0IGRybV9wYW5lbCAqcGFuZWw7CiB9OwogCiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBpbXhfcGRfY29ubmVjdG9yX2RldGVjdCgKQEAgLTQ5LDE3ICs1MCwxOSBAQAogCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIH0KIAotc3RhdGljIHZvaWQgaW14X3BkX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0JLyogZG8gbm90IGZyZWUgaGVyZSAqLwotfQotCiBzdGF0aWMgaW50IGlteF9wZF9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGlteF9wYXJhbGxlbF9kaXNwbGF5ICppbXhwZCA9IGNvbl90b19pbXhwZChjb25uZWN0b3IpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBpbXhwZC0+ZGV2LT5vZl9ub2RlOwogCWludCBudW1fbW9kZXMgPSAwOwogCisJaWYgKGlteHBkLT5wYW5lbCAmJiBpbXhwZC0+cGFuZWwtPmZ1bmNzICYmCisJICAgIGlteHBkLT5wYW5lbC0+ZnVuY3MtPmdldF9tb2RlcykgeworCQludW1fbW9kZXMgPSBpbXhwZC0+cGFuZWwtPmZ1bmNzLT5nZXRfbW9kZXMoaW14cGQtPnBhbmVsKTsKKwkJaWYgKG51bV9tb2RlcyA+IDApCisJCQlyZXR1cm4gbnVtX21vZGVzOworCX0KKwogCWlmIChpbXhwZC0+ZWRpZCkgewogCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLCBpbXhwZC0+ZWRpZCk7CiAJCW51bV9tb2RlcyA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGlteHBkLT5lZGlkKTsKQEAgLTY3LDYgKzcwLDggQEAKIAogCWlmIChpbXhwZC0+bW9kZV92YWxpZCkgewogCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IGRybV9tb2RlX2NyZWF0ZShjb25uZWN0b3ItPmRldik7CisJCWlmICghbW9kZSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlkcm1fbW9kZV9jb3B5KG1vZGUsICZpbXhwZC0+bW9kZSk7CiAJCW1vZGUtPnR5cGUgfD0gRFJNX01PREVfVFlQRV9EUklWRVIgfCBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCwKIAkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwpAQCAtNzUsNiArODAsOCBAQAogCiAJaWYgKG5wKSB7CiAJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gZHJtX21vZGVfY3JlYXRlKGNvbm5lY3Rvci0+ZGV2KTsKKwkJaWYgKCFtb2RlKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW9mX2dldF9kcm1fZGlzcGxheV9tb2RlKG5wLCAmaW14cGQtPm1vZGUsIE9GX1VTRV9OQVRJVkVfTU9ERSk7CiAJCWRybV9tb2RlX2NvcHkobW9kZSwgJmlteHBkLT5tb2RlKTsKIAkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVELApAQCAtODUsMTIgKzkyLDYgQEAKIAlyZXR1cm4gbnVtX21vZGVzOwogfQogCi1zdGF0aWMgaW50IGlteF9wZF9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBkcm1fZW5jb2RlciAqaW14X3BkX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoCiAJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CkBAIC0xMDEsNiArMTAyLDEyIEBACiAKIHN0YXRpYyB2b2lkIGlteF9wZF9lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKIHsKKwlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gZW5jX3RvX2lteHBkKGVuY29kZXIpOworCisJaWYgKG1vZGUgIT0gRFJNX01PREVfRFBNU19PTikKKwkJZHJtX3BhbmVsX2Rpc2FibGUoaW14cGQtPnBhbmVsKTsKKwllbHNlCisJCWRybV9wYW5lbF9lbmFibGUoaW14cGQtPnBhbmVsKTsKIH0KIAogc3RhdGljIGJvb2wgaW14X3BkX2VuY29kZXJfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCkBAIC0xMTQsOCArMTIxLDcgQEAKIHsKIAlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gZW5jX3RvX2lteHBkKGVuY29kZXIpOwogCi0JaW14X2RybV9jcnRjX3BhbmVsX2Zvcm1hdChlbmNvZGVyLT5jcnRjLCBEUk1fTU9ERV9FTkNPREVSX05PTkUsCi0JCQlpbXhwZC0+aW50ZXJmYWNlX3BpeF9mbXQpOworCWlteF9kcm1fcGFuZWxfZm9ybWF0KGVuY29kZXIsIGlteHBkLT5pbnRlcmZhY2VfcGl4X2ZtdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlteF9wZF9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC0xMzIsMjYgKzEzOCwyMSBAQAogewogfQogCi1zdGF0aWMgdm9pZCBpbXhfcGRfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQkvKiBkbyBub3QgZnJlZSBoZXJlICovCi19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbXhfcGRfY29ubmVjdG9yX2Z1bmNzID0gewogCS5kcG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKIAkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKIAkuZGV0ZWN0ID0gaW14X3BkX2Nvbm5lY3Rvcl9kZXRlY3QsCi0JLmRlc3Ryb3kgPSBpbXhfcGRfY29ubmVjdG9yX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBpbXhfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95LAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbXhfcGRfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2V0X21vZGVzID0gaW14X3BkX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCiAJLmJlc3RfZW5jb2RlciA9IGlteF9wZF9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAotCS5tb2RlX3ZhbGlkID0gaW14X3BkX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAorCS5tb2RlX3ZhbGlkID0gaW14X2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgaW14X3BkX2VuY29kZXJfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSBpbXhfcGRfZW5jb2Rlcl9kZXN0cm95LAorCS5kZXN0cm95ID0gaW14X2RybV9lbmNvZGVyX2Rlc3Ryb3ksCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbXhfcGRfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7CkBAIC0xNjMsNTEgKzE2NCw0NiBAQAogCS5kaXNhYmxlID0gaW14X3BkX2VuY29kZXJfZGlzYWJsZSwKIH07CiAKLXN0YXRpYyBpbnQgaW14X3BkX3JlZ2lzdGVyKHN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQpCitzdGF0aWMgaW50IGlteF9wZF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLAorCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQpCiB7CiAJaW50IHJldDsKIAotCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmaW14cGQtPmNvbm5lY3RvciwgJmlteHBkLT5lbmNvZGVyKTsKLQotCWlteHBkLT5jb25uZWN0b3IuZnVuY3MgPSAmaW14X3BkX2Nvbm5lY3Rvcl9mdW5jczsKLQlpbXhwZC0+ZW5jb2Rlci5mdW5jcyA9ICZpbXhfcGRfZW5jb2Rlcl9mdW5jczsKLQotCWlteHBkLT5lbmNvZGVyLmVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfTk9ORTsKLQlpbXhwZC0+Y29ubmVjdG9yLmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKKwlyZXQgPSBpbXhfZHJtX2VuY29kZXJfcGFyc2Vfb2YoZHJtLCAmaW14cGQtPmVuY29kZXIsCisJCQkJICAgICAgIGlteHBkLT5kZXYtPm9mX25vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKCZpbXhwZC0+ZW5jb2RlciwgJmlteF9wZF9lbmNvZGVyX2hlbHBlcl9mdW5jcyk7Ci0JcmV0ID0gaW14X2RybV9hZGRfZW5jb2RlcigmaW14cGQtPmVuY29kZXIsICZpbXhwZC0+aW14X2RybV9lbmNvZGVyLAotCQkJVEhJU19NT0RVTEUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihpbXhwZC0+ZGV2LCAiYWRkaW5nIGVuY29kZXIgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWRybV9lbmNvZGVyX2luaXQoZHJtLCAmaW14cGQtPmVuY29kZXIsICZpbXhfcGRfZW5jb2Rlcl9mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX05PTkUpOwogCiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZpbXhwZC0+Y29ubmVjdG9yLAogCQkJJmlteF9wZF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwlkcm1fY29ubmVjdG9yX2luaXQoZHJtLCAmaW14cGQtPmNvbm5lY3RvciwgJmlteF9wZF9jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKTsKIAotCXJldCA9IGlteF9kcm1fYWRkX2Nvbm5lY3RvcigmaW14cGQtPmNvbm5lY3RvciwKLQkJCSZpbXhwZC0+aW14X2RybV9jb25uZWN0b3IsIFRISVNfTU9EVUxFKTsKLQlpZiAocmV0KSB7Ci0JCWlteF9kcm1fcmVtb3ZlX2VuY29kZXIoaW14cGQtPmlteF9kcm1fZW5jb2Rlcik7Ci0JCWRldl9lcnIoaW14cGQtPmRldiwgImFkZGluZyBjb25uZWN0b3IgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmIChpbXhwZC0+cGFuZWwpCisJCWRybV9wYW5lbF9hdHRhY2goaW14cGQtPnBhbmVsLCAmaW14cGQtPmNvbm5lY3Rvcik7CisKKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJmlteHBkLT5jb25uZWN0b3IsICZpbXhwZC0+ZW5jb2Rlcik7CiAKIAlpbXhwZC0+Y29ubmVjdG9yLmVuY29kZXIgPSAmaW14cGQtPmVuY29kZXI7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbXhfcGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaW14X3BkX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpwYW5lbF9ub2RlOwogCWNvbnN0IHU4ICplZGlkcDsKIAlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkOwogCWludCByZXQ7CiAJY29uc3QgY2hhciAqZm10OwogCi0JaW14cGQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppbXhwZCksIEdGUF9LRVJORUwpOworCWlteHBkID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppbXhwZCksIEdGUF9LRVJORUwpOwogCWlmICghaW14cGQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMjUsMzAgKzIyMSw0MyBAQAogCQkJaW14cGQtPmludGVyZmFjZV9waXhfZm10ID0gVjRMMl9QSVhfRk1UX0JHUjY2NjsKIAl9CiAKLQlpbXhwZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwYW5lbF9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgImZzbCxwYW5lbCIsIDApOworCWlmIChwYW5lbF9ub2RlKQorCQlpbXhwZC0+cGFuZWwgPSBvZl9kcm1fZmluZF9wYW5lbChwYW5lbF9ub2RlKTsKIAotCXJldCA9IGlteF9wZF9yZWdpc3RlcihpbXhwZCk7CisJaW14cGQtPmRldiA9IGRldjsKKworCXJldCA9IGlteF9wZF9yZWdpc3Rlcihkcm0sIGlteHBkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gaW14X2RybV9lbmNvZGVyX2FkZF9wb3NzaWJsZV9jcnRjcyhpbXhwZC0+aW14X2RybV9lbmNvZGVyLCBucCk7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbXhwZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW14cGQpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGlteF9wZF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpbXhwZC0+ZW5jb2Rlci5mdW5jcy0+ZGVzdHJveSgmaW14cGQtPmVuY29kZXIpOworCWlteHBkLT5jb25uZWN0b3IuZnVuY3MtPmRlc3Ryb3koJmlteHBkLT5jb25uZWN0b3IpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgaW14X3BkX29wcyA9IHsKKwkuYmluZAk9IGlteF9wZF9iaW5kLAorCS51bmJpbmQJPSBpbXhfcGRfdW5iaW5kLAorfTsKKworc3RhdGljIGludCBpbXhfcGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmaW14X3BkX29wcyk7Cit9CisKIHN0YXRpYyBpbnQgaW14X3BkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmlteHBkLT5jb25uZWN0b3I7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gJmlteHBkLT5lbmNvZGVyOwotCi0JZHJtX21vZGVfY29ubmVjdG9yX2RldGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7Ci0KLQlpbXhfZHJtX3JlbW92ZV9jb25uZWN0b3IoaW14cGQtPmlteF9kcm1fY29ubmVjdG9yKTsKLQlpbXhfZHJtX3JlbW92ZV9lbmNvZGVyKGlteHBkLT5pbXhfZHJtX2VuY29kZXIpOwotCisJY29tcG9uZW50X2RlbCgmcGRldi0+ZGV2LCAmaW14X3BkX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9jb21tb24uaAppbmRleCBjZjM0N2NjLi5mMGI5Nzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2NvbW1vbi5oCkBAIC0xLDE0ICsxLDYgQEAKICNpZm5kZWYgQ09NTU9OX0lOQ0QKICNkZWZpbmUgQ09NTU9OX0lOQ0QKIAotdHlwZWRlZiB1OCBCT09MRUFOOwotdHlwZWRlZiB1OCBCWVRFOwotdHlwZWRlZiB1OCAqUEJZVEU7Ci10eXBlZGVmIHUxNiBXT1JEOwotdHlwZWRlZiB1MTYgKlBXT1JEOwotdHlwZWRlZiB1MzIgRFdPUkQ7Ci10eXBlZGVmIHUzMiAqUERXT1JEOwotCiAjZGVmaW5lIEJZVEVfTUFTSwkweGZmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmMKaW5kZXggZjVkNDFlMC4uZTYxMTgzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jCkBAIC0xNyw3ICsxNyw3IEBACiBpbnQgRU5FX0luaXRNZWRpYShzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJaW50CXJlc3VsdDsKLQlCWVRFCU1pc2NSZWcwMyA9IDA7CisJdTgJTWlzY1JlZzAzID0gMDsKIAogCWRldl9pbmZvKCZ1cy0+cHVzYl9kZXYtPmRldiwgIi0tLSBJbml0IE1lZGlhIC0tLVxuIik7CiAJcmVzdWx0ID0gZW5lX3JlYWRfYnl0ZSh1cywgUkVHX0NBUkRfU1RBVFVTLCAmTWlzY1JlZzAzKTsKQEAgLTQxLDcgKzQxLDcgQEAKIC8qCiAgKiBlbmVfcmVhZF9ieXRlKCkgOgogICovCi1pbnQgZW5lX3JlYWRfYnl0ZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgaW5kZXgsIHZvaWQgKmJ1ZikKK2ludCBlbmVfcmVhZF9ieXRlKHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGluZGV4LCB2b2lkICpidWYpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7CkBAIC01MSw4ICs1MSw4IEBACiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDAxOwogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RUQ7Ci0JYmNiLT5DREJbMl0JCQk9IChCWVRFKShpbmRleD4+OCk7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKWluZGV4OworCWJjYi0+Q0RCWzJdCQkJPSAodTgpKGluZGV4Pj44KTsKKwliY2ItPkNEQlszXQkJCT0gKHU4KWluZGV4OwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTY1LDcgKzY1LDcgQEAKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKLQlCWVRFCWJ1ZlsweDIwMF07CisJdTgJYnVmWzB4MjAwXTsKIAogCWRldl9kYmcoJnVzLT5wdXNiX2Rldi0+ZGV2LCAidHJhbnNwb3J0IC0tLSBFTkVfU01Jbml0XG4iKTsKIApAQCAtMTIyLDEyICsxMjIsMTIgQEAKIC8qCiAgKiBFTkVfTG9hZEJpbkNvZGUoKQogICovCi1pbnQgRU5FX0xvYWRCaW5Db2RlKHN0cnVjdCB1c19kYXRhICp1cywgQllURSBmbGFnKQoraW50IEVORV9Mb2FkQmluQ29kZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4IGZsYWcpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7CiAJLyogdm9pZCAqYnVmOyAqLwotCVBCWVRFIGJ1ZjsKKwl1OCAqYnVmOwogCiAJLyogZGV2X2luZm8oJnVzLT5wdXNiX2Rldi0+ZGV2LCAidHJhbnNwb3J0IC0tLSBFTkVfTG9hZEJpbkNvZGVcbiIpOyAqLwogCWlmICh1cy0+QklOX0ZMQUcgPT0gZmxhZykKQEAgLTE2NCw3ICsxNjQsNyBAQAogLyoKICAqIEVORV9TZW5kU2NzaUNtZCgpOgogICovCi1pbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhICp1cywgQllURSBmRGlyLCB2b2lkICpidWYsIGludCB1c2Vfc2cpCitpbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhICp1cywgdTggZkRpciwgdm9pZCAqYnVmLCBpbnQgdXNlX3NnKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlzdHJ1Y3QgYnVsa19jc193cmFwICpiY3MgPSAoc3RydWN0IGJ1bGtfY3Nfd3JhcCAqKSB1cy0+aW9idWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuaAppbmRleCBjOGIyY2Q2Li45OGQyZTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmgKQEAgLTEsMTEgKzEsMTEgQEAKICNpbmNsdWRlICJjb21tb24uaCIKIAotZXh0ZXJuIERXT1JEIE1lZGlhQ2hhbmdlOworZXh0ZXJuIHUzMiBNZWRpYUNoYW5nZTsKIGV4dGVybiBpbnQgQ2hlY2tfRF9NZWRpYUZtdChzdHJ1Y3QgdXNfZGF0YSAqKTsKIAogCiAKLXN0YXRpYyBCWVRFIFNNX0luaXRbXSA9IHsKK3N0YXRpYyB1OCBTTV9Jbml0W10gPSB7CiAweDdCLCAweDA5LCAweDdDLCAweEYwLCAweDdELCAweDEwLCAweDdFLCAweEU5LAogMHg3RiwgMHhDQywgMHgxMiwgMHgyRiwgMHg3MSwgMHg5MCwgMHhFOSwgMHhDQywKIDB4RTAsIDB4QjQsIDB4MDcsIDB4MTIsIDB4OTAsIDB4RkYsIDB4MDksIDB4RTAsCkBAIC0yNjMsNyArMjYzLDcgQEAKIDB4NTgsIDB4NDQsIDB4MkQsIDB4NDksIDB4NkUsIDB4NjksIDB4NzQsIDB4MjAsCiAweDIwLCAweDIwLCAweDIwLCAweDMxLCAweDMwLCAweDMwLCAweDMwLCAweDMxIH07CiAKLXN0YXRpYyBCWVRFIFNNX1Jkd3JbXSA9IHsKK3N0YXRpYyB1OCBTTV9SZHdyW10gPSB7CiAweDdCLCAweDBDLCAweDdDLCAweEYwLCAweDdELCAweDEwLCAweDdFLCAweEU5LAogMHg3RiwgMHhDQywgMHgxMiwgMHgyRiwgMHg3MSwgMHg5MCwgMHhFOSwgMHhDMywKIDB4RTAsIDB4QjQsIDB4NzMsIDB4MDQsIDB4NzQsIDB4NDAsIDB4ODAsIDB4MDksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbC5oIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWwuaAppbmRleCA5MTM2ZTk0Li4zOTk1MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsLmgKQEAgLTE2OSwyOSArMTY5LDI5IEBACiBTdHJ1Y3QgRGVmaW5pdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IGtldWNyX21lZGlhX2luZm8gewotCUJZVEUgTW9kZWw7Ci0JQllURSBBdHRyaWJ1dGU7Ci0JQllURSBNYXhab25lczsKLQlCWVRFIE1heFNlY3RvcnM7Ci0JV09SRCBNYXhCbG9ja3M7Ci0JV09SRCBNYXhMb2dCbG9ja3M7CisJdTggTW9kZWw7CisJdTggQXR0cmlidXRlOworCXU4IE1heFpvbmVzOworCXU4IE1heFNlY3RvcnM7CisJdTE2IE1heEJsb2NrczsKKwl1MTYgTWF4TG9nQmxvY2tzOwogfTsKIAogc3RydWN0IGtldWNyX21lZGlhX2FkZHJlc3MgewotCUJZVEUgWm9uZTsJLyogWm9uZSBOdW1iZXIgKi8KLQlCWVRFIFNlY3RvcjsJLyogU2VjdG9yKDUxMmJ5dGUpIE51bWJlciBvbiBCbG9jayAqLwotCVdPUkQgUGh5QmxvY2s7CS8qIFBoeXNpY2FsIEJsb2NrIE51bWJlciBvbiBab25lICovCi0JV09SRCBMb2dCbG9jazsJLyogTG9naWNhbCBCbG9jayBOdW1iZXIgb2YgWm9uZSAqLworCXU4IFpvbmU7CS8qIFpvbmUgTnVtYmVyICovCisJdTggU2VjdG9yOwkvKiBTZWN0b3IoNTEyYnl0ZSkgTnVtYmVyIG9uIEJsb2NrICovCisJdTE2IFBoeUJsb2NrOwkvKiBQaHlzaWNhbCBCbG9jayBOdW1iZXIgb24gWm9uZSAqLworCXUxNiBMb2dCbG9jazsJLyogTG9naWNhbCBCbG9jayBOdW1iZXIgb2YgWm9uZSAqLwogfTsKIAogc3RydWN0IGtldWNyX21lZGlhX2FyZWEgewotCUJZVEUgU2VjdG9yOwkvKiBTZWN0b3IoNTEyYnl0ZSkgTnVtYmVyIG9uIEJsb2NrICovCi0JV09SRCBQaHlCbG9jazsJLyogUGh5c2ljYWwgQmxvY2sgTnVtYmVyIG9uIFpvbmUgMCAqLworCXU4IFNlY3RvcjsJLyogU2VjdG9yKDUxMmJ5dGUpIE51bWJlciBvbiBCbG9jayAqLworCXUxNiBQaHlCbG9jazsJLyogUGh5c2ljYWwgQmxvY2sgTnVtYmVyIG9uIFpvbmUgMCAqLwogfTsKIAotZXh0ZXJuIFdPUkQJUmVhZEJsb2NrOwotZXh0ZXJuIFdPUkQJV3JpdGVCbG9jazsKLWV4dGVybiBEV09SRAlNZWRpYUNoYW5nZTsKK2V4dGVybiB1MTYJUmVhZEJsb2NrOworZXh0ZXJuIHUxNglXcml0ZUJsb2NrOworZXh0ZXJuIHUzMglNZWRpYUNoYW5nZTsKIAogZXh0ZXJuIHN0cnVjdCBrZXVjcl9tZWRpYV9pbmZvICAgIFNzZmRjOwogZXh0ZXJuIHN0cnVjdCBrZXVjcl9tZWRpYV9hZGRyZXNzIE1lZGlhOwpAQCAtMjA0LDI0ICsyMDQsMjQgQEAKIGludCAgICAgICAgIEluaXRfRF9TbWFydE1lZGlhKHZvaWQpOwogaW50ICAgICAgICAgUHdvZmZfRF9TbWFydE1lZGlhKHZvaWQpOwogaW50ICAgICAgICAgQ2hlY2tfRF9TbWFydE1lZGlhKHZvaWQpOwotaW50ICAgICAgICAgQ2hlY2tfRF9QYXJhbWV0ZXIoc3RydWN0IHVzX2RhdGEgKiwgV09SRCAqLCBCWVRFICosIEJZVEUgKik7Ci1pbnQgICAgICAgICBNZWRpYV9EX1JlYWRTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQsIFdPUkQsIEJZVEUgKik7Ci1pbnQgICAgICAgICBNZWRpYV9EX1dyaXRlU2VjdG9yKHN0cnVjdCB1c19kYXRhICosIERXT1JELCBXT1JELCBCWVRFICopOwotaW50ICAgICAgICAgTWVkaWFfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICosIERXT1JELCBXT1JELCBCWVRFICopOwotaW50ICAgICAgICAgTWVkaWFfRF9FcmFzZUJsb2NrKHN0cnVjdCB1c19kYXRhICosIERXT1JELCBXT1JEKTsKK2ludCAgICAgICAgIENoZWNrX0RfUGFyYW1ldGVyKHN0cnVjdCB1c19kYXRhICosIHUxNiAqLCB1OCAqLCB1OCAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfUmVhZFNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqLCB1MzIsIHUxNiwgdTggKik7CitpbnQgICAgICAgICBNZWRpYV9EX1dyaXRlU2VjdG9yKHN0cnVjdCB1c19kYXRhICosIHUzMiwgdTE2LCB1OCAqKTsKK2ludCAgICAgICAgIE1lZGlhX0RfQ29weVNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqLCB1MzIsIHUxNiwgdTggKik7CitpbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgdTMyLCB1MTYpOwogaW50ICAgICAgICAgTWVkaWFfRF9FcmFzZUFsbChzdHJ1Y3QgdXNfZGF0YSAqKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZVN0YXJ0KHN0cnVjdCB1c19kYXRhICosIERXT1JELCBCWVRFICopOwotaW50ICAgICAgICAgTWVkaWFfRF9PbmVTZWN0V3JpdGVOZXh0KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKik7CitpbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZVN0YXJ0KHN0cnVjdCB1c19kYXRhICosIHUzMiwgdTggKik7CitpbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZU5leHQoc3RydWN0IHVzX2RhdGEgKiwgdTggKik7CiBpbnQgICAgICAgICBNZWRpYV9EX09uZVNlY3RXcml0ZUZsdXNoKHN0cnVjdCB1c19kYXRhICopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIGludAlTTV9GcmVlTWVtKHZvaWQpOwkvKiBFTkUgU00gZnVuY3Rpb24gKi8KLXZvaWQgICAgICAgIFNNX0VuYWJsZUxFRChzdHJ1Y3QgdXNfZGF0YSAqLCBCT09MRUFOKTsKK3ZvaWQgICAgICAgIFNNX0VuYWJsZUxFRChzdHJ1Y3QgdXNfZGF0YSAqLCBib29sKTsKIHZvaWQgICAgICAgIExlZF9EX1Rlcm5Pbih2b2lkKTsKIHZvaWQgICAgICAgIExlZF9EX1Rlcm5PZmYodm9pZCk7CiAKLWludCAgICAgICAgIE1lZGlhX0RfRXJhc2VBbGxSZWR0RGF0YShEV09SRCBJbmRleCwgQk9PTEVBTiBDaGVja0Jsb2NrKTsKK2ludCAgICAgICAgIE1lZGlhX0RfRXJhc2VBbGxSZWR0RGF0YSh1MzIgSW5kZXgsIGJvb2wgQ2hlY2tCbG9jayk7CiAvKkRXT1JEIE1lZGlhX0RfR2V0TWVkaWFJbmZvKHN0cnVjdCB1c19kYXRhICogZmRvRXh0LAogCVBJT0NUTF9NRURJQV9JTkZPX0lOIHBQYXJhbUluLCBQSU9DVExfTUVESUFfSU5GT19PVVQgcFBhcmFtT3V0KTsgKi8KIApAQCAtMjI5LDMxICsyMjksMzEgQEAKICAqIFNNSUxTdWIuYwogICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50ICBDaGVja19EX0RhdGFCbGFuayhCWVRFICopOwotaW50ICBDaGVja19EX0ZhaWxCbG9jayhCWVRFICopOwotaW50ICBDaGVja19EX0RhdGFTdGF0dXMoQllURSAqKTsKLWludCAgTG9hZF9EX0xvZ0Jsb2NrQWRkcihCWVRFICopOwotdm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKEJZVEUgKik7Ci12b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcihCWVRFICopOwotdm9pZCBTZXRfRF9GYWlsQmxvY2soQllURSAqKTsKLXZvaWQgU2V0X0RfRGF0YVN0YXVzKEJZVEUgKik7CitpbnQgIENoZWNrX0RfRGF0YUJsYW5rKHU4ICopOworaW50ICBDaGVja19EX0ZhaWxCbG9jayh1OCAqKTsKK2ludCAgQ2hlY2tfRF9EYXRhU3RhdHVzKHU4ICopOworaW50ICBMb2FkX0RfTG9nQmxvY2tBZGRyKHU4ICopOwordm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKHU4ICopOwordm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIodTggKik7Cit2b2lkIFNldF9EX0ZhaWxCbG9jayh1OCAqKTsKK3ZvaWQgU2V0X0RfRGF0YVN0YXVzKHU4ICopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBTc2ZkY19EX1Jlc2V0KHN0cnVjdCB1c19kYXRhICopOwotaW50ICBTc2ZkY19EX1JlYWRDaXNTZWN0KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKK2ludCAgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKIHZvaWQgU3NmZGNfRF9Xcml0ZVJlZHRNb2RlKHZvaWQpOwotdm9pZCBTc2ZkY19EX1JlYWRJRChCWVRFICosIEJZVEUpOwotaW50ICBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfV3JpdGVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICosIEJZVEUgKik7Ci1pbnQgIFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKK3ZvaWQgU3NmZGNfRF9SZWFkSUQodTggKiwgdTgpOworaW50ICBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOworaW50ICBTc2ZkY19EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqLCB1MTYsIHU4ICosIHU4ICopOworaW50ICBTc2ZkY19EX1dyaXRlU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Xcml0ZUJsb2NrKHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKIGludCAgU3NmZGNfRF9FcmFzZUJsb2NrKHN0cnVjdCB1c19kYXRhICopOwotaW50ICBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqKTsKK2ludCAgU3NmZGNfRF9SZWFkUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKiwgdTggKik7CitpbnQgIFNzZmRjX0RfV3JpdGVSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqKTsKIGludCAgU3NmZGNfRF9DaGVja1N0YXR1cyh2b2lkKTsKLWludCAgU2V0X0RfU3NmZGNNb2RlbChCWVRFKTsKK2ludCAgU2V0X0RfU3NmZGNNb2RlbCh1OCk7CiB2b2lkIENudF9EX1Jlc2V0KHZvaWQpOwogaW50ICBDbnRfRF9Qb3dlck9uKHZvaWQpOwogdm9pZCBDbnRfRF9Qb3dlck9mZih2b2lkKTsKQEAgLTI2MywyNiArMjYzLDI2IEBACiBpbnQgIENoZWNrX0RfQ2FyZEV4aXN0KHZvaWQpOwogaW50ICBDaGVja19EX0NhcmRTdHNDaGcodm9pZCk7CiBpbnQgIENoZWNrX0RfU3NmZGNXUCh2b2lkKTsKLWludCAgU01fUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKK2ludCAgU01fUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOwogCi1pbnQgIFNzZmRjX0RfUmVhZFNlY3RfRE1BKHN0cnVjdCB1c19kYXRhICosIEJZVEUgKiwgQllURSAqKTsKLWludCAgU3NmZGNfRF9SZWFkU2VjdF9QSU8oc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlU2VjdF9ETUEoc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOwotaW50ICBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oc3RydWN0IHVzX2RhdGEgKiwgQllURSAqLCBCWVRFICopOworaW50ICBTc2ZkY19EX1JlYWRTZWN0X0RNQShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9SZWFkU2VjdF9QSU8oc3RydWN0IHVzX2RhdGEgKiwgdTggKiwgdTggKik7CitpbnQgIFNzZmRjX0RfV3JpdGVTZWN0X0RNQShzdHJ1Y3QgdXNfZGF0YSAqLCB1OCAqLCB1OCAqKTsKK2ludCAgU3NmZGNfRF9Xcml0ZVNlY3RfUElPKHN0cnVjdCB1c19kYXRhICosIHU4ICosIHU4ICopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50ICBDaGVja19EX1JlYWRFcnJvcihCWVRFICopOwotaW50ICBDaGVja19EX0NvcnJlY3QoQllURSAqLCBCWVRFICopOwotaW50ICBDaGVja19EX0NJU2RhdGEoQllURSAqLCBCWVRFICopOwotdm9pZCBTZXRfRF9SaWdodEVDQyhCWVRFICopOworaW50ICBDaGVja19EX1JlYWRFcnJvcih1OCAqKTsKK2ludCAgQ2hlY2tfRF9Db3JyZWN0KHU4ICosIHU4ICopOworaW50ICBDaGVja19EX0NJU2RhdGEodTggKiwgdTggKik7Cit2b2lkIFNldF9EX1JpZ2h0RUNDKHU4ICopOwogCiAvKgogICogU01JTEVDQy5jCiAgKi8KLXZvaWQgY2FsY3VsYXRlX2VjYyhCWVRFICosIEJZVEUgKiwgQllURSAqLCBCWVRFICosIEJZVEUgKik7Ci1CWVRFIGNvcnJlY3RfZGF0YShCWVRFICosIEJZVEUgKiwgQllURSwgICBCWVRFLCAgIEJZVEUpOwotaW50ICBfQ29ycmVjdF9EX1N3RUNDKEJZVEUgKiwgQllURSAqLCBCWVRFICopOwotdm9pZCBfQ2FsY3VsYXRlX0RfU3dFQ0MoQllURSAqLCBCWVRFICopOwordm9pZCBjYWxjdWxhdGVfZWNjKHU4ICosIHU4ICosIHU4ICosIHU4ICosIHU4ICopOwordTggY29ycmVjdF9kYXRhKHU4ICosIHU4ICosIHU4LCAgIHU4LCAgIHU4KTsKK2ludCAgX0NvcnJlY3RfRF9Td0VDQyh1OCAqLCB1OCAqLCB1OCAqKTsKK3ZvaWQgX0NhbGN1bGF0ZV9EX1N3RUNDKHU4ICosIHU4ICopOwogCiB2b2lkIFNNX0luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsZWNjLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbGVjYy5jCmluZGV4IDZiOGY3ZDcuLmZmZTYwMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsZWNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxlY2MuYwpAQCAtMTMsNyArMTMsNyBAQAogLyogI2luY2x1ZGUgIkVNQ1JJT1MuaCIgKi8KIAogLyogQ1AwLUNQNSBjb2RlIHRhYmxlICovCi1zdGF0aWMgQllURSBlY2N0YWJsZVsyNTZdID0geworc3RhdGljIHU4IGVjY3RhYmxlWzI1Nl0gPSB7CiAweDAwLCAweDU1LCAweDU2LCAweDAzLCAweDU5LCAweDBDLCAweDBGLCAweDVBLCAweDVBLCAweDBGLCAweDBDLCAweDU5LCAweDAzLAogMHg1NiwgMHg1NSwgMHgwMCwgMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzQywgMHg2OSwgMHg2QSwgMHgzRiwgMHgzRiwgMHg2QSwKIDB4NjksIDB4M0MsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsIDB4M0YsIDB4NkEsIDB4NjksCkBAIC0zNiw3ICszNiw3IEBACiAweDVBLCAweDVBLCAweDBGLCAweDBDLCAweDU5LCAweDAzLCAweDU2LCAweDU1LCAweDAwCiB9OwogCi1zdGF0aWMgdm9pZCAgIHRyYW5zX3Jlc3VsdChCWVRFLCAgIEJZVEUsICAgQllURSAqLCBCWVRFICopOworc3RhdGljIHZvaWQgICB0cmFuc19yZXN1bHQodTgsICAgdTgsICAgdTggKiwgdTggKik7CiAKICNkZWZpbmUgQklUNyAgICAgICAgMHg4MAogI2RlZmluZSBCSVQ2ICAgICAgICAweDQwCkBAIC01NywxMSArNTcsMTEgQEAKICAqICplY2MxOyAqIExQMTUsTFAxNCxMUDEzLC4uLgogICogKmVjYzI7ICogTFAwNyxMUDA2LExQMDUsLi4uCiAgKi8KLXN0YXRpYyB2b2lkIHRyYW5zX3Jlc3VsdChCWVRFIHJlZzIsIEJZVEUgcmVnMywgQllURSAqZWNjMSwgQllURSAqZWNjMikKK3N0YXRpYyB2b2lkIHRyYW5zX3Jlc3VsdCh1OCByZWcyLCB1OCByZWczLCB1OCAqZWNjMSwgdTggKmVjYzIpCiB7Ci0JQllURSBhOyAvKiBXb3JraW5nIGZvciByZWcyLHJlZzMgKi8KLQlCWVRFIGI7IC8qIFdvcmtpbmcgZm9yIGVjYzEsZWNjMiAqLwotCUJZVEUgaTsgLyogRm9yIGNvdW50aW5nICovCisJdTggYTsgLyogV29ya2luZyBmb3IgcmVnMixyZWczICovCisJdTggYjsgLyogV29ya2luZyBmb3IgZWNjMSxlY2MyICovCisJdTggaTsgLyogRm9yIGNvdW50aW5nICovCiAKIAlhID0gQklUNzsgYiA9IEJJVDc7IC8qIDgwaD0xMDAwMDAwMGIgKi8KIAkqZWNjMSA9ICplY2MyID0gMDsgLyogQ2xlYXIgZWNjMSxlY2MyICovCkBAIC05NSwyMSArOTUsMjEgQEAKICAqICplY2MyOyAqIExQMDcsTFAwNixMUDA1LC4uLgogICogKmVjYzM7ICogQ1A1LENQNCxDUDMsLi4uLCIxIiwiMSIKICAqLwotdm9pZCBjYWxjdWxhdGVfZWNjKEJZVEUgKnRhYmxlLCBCWVRFICpkYXRhLCBCWVRFICplY2MxLCBCWVRFICplY2MyLCBCWVRFICplY2MzKQordm9pZCBjYWxjdWxhdGVfZWNjKHU4ICp0YWJsZSwgdTggKmRhdGEsIHU4ICplY2MxLCB1OCAqZWNjMiwgdTggKmVjYzMpCiB7Ci0JRFdPUkQgIGk7ICAgIC8qIEZvciBjb3VudGluZyAqLwotCUJZVEUgYTsgICAgLyogV29ya2luZyBmb3IgdGFibGUgKi8KLQlCWVRFIHJlZzE7IC8qIEQtYWxsLENQNSxDUDQsQ1AzLC4uLiAqLwotCUJZVEUgcmVnMjsgLyogTFAxNCxMUDEyLEwxMCwuLi4gKi8KLQlCWVRFIHJlZzM7IC8qIExQMTUsTFAxMyxMMTEsLi4uICovCisJdTMyICBpOyAgICAvKiBGb3IgY291bnRpbmcgKi8KKwl1OCBhOyAgICAvKiBXb3JraW5nIGZvciB0YWJsZSAqLworCXU4IHJlZzE7IC8qIEQtYWxsLENQNSxDUDQsQ1AzLC4uLiAqLworCXU4IHJlZzI7IC8qIExQMTQsTFAxMixMMTAsLi4uICovCisJdTggcmVnMzsgLyogTFAxNSxMUDEzLEwxMSwuLi4gKi8KIAogCXJlZzEgPSByZWcyID0gcmVnMyA9IDA7ICAgLyogQ2xlYXIgcGFyYW1ldGVyICovCiAJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAJCWEgPSB0YWJsZVtkYXRhW2ldXTsgLyogR2V0IENQMC1DUDUgY29kZSBmcm9tIHRhYmxlICovCiAJCXJlZzEgXj0gKGEmTUFTS19DUFMpOyAvKiBYT1Igd2l0aCBhICovCiAJCWlmICgoYSZCSVQ2KSAhPSAwKSB7IC8qIElmIERfYWxsKGFsbCBiaXQgWE9SKSA9IDEgKi8KLQkJCXJlZzMgXj0gKEJZVEUpaTsgLyogWE9SIHdpdGggY291bnRlciAqLwotCQkJcmVnMiBePSB+KChCWVRFKWkpOyAvKiBYT1Igd2l0aCBpbnYuIG9mIGNvdW50ZXIgKi8KKwkJCXJlZzMgXj0gKHU4KWk7IC8qIFhPUiB3aXRoIGNvdW50ZXIgKi8KKwkJCXJlZzIgXj0gfigodTgpaSk7IC8qIFhPUiB3aXRoIGludi4gb2YgY291bnRlciAqLwogCQl9CiAJfQogCkBAIC0xMjcsMjIgKzEyNywyMiBAQAogICogZWNjMjsgKiBMUDA3LExQMDYsTFAwNSwuLi4KICAqIGVjYzM7ICogQ1A1LENQNCxDUDMsLi4uLCIxIiwiMSIKICAqLwotQllURSBjb3JyZWN0X2RhdGEoQllURSAqZGF0YSwgQllURSAqZWNjZGF0YSwgQllURSBlY2MxLCBCWVRFIGVjYzIsIEJZVEUgZWNjMykKK3U4IGNvcnJlY3RfZGF0YSh1OCAqZGF0YSwgdTggKmVjY2RhdGEsIHU4IGVjYzEsIHU4IGVjYzIsIHU4IGVjYzMpCiB7Ci0JRFdPUkQgbDsgLyogV29ya2luZyB0byBjaGVjayBkICovCi0JRFdPUkQgZDsgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KLQlEV09SRCBpOyAvKiBGb3IgY291bnRpbmcgKi8KLQlCWVRFIGQxLCBkMiwgZDM7IC8qIFJlc3VsdCBvZiBjb21wYXJpc29uICovCi0JQllURSBhOyAvKiBXb3JraW5nIGZvciBhZGQgKi8KLQlCWVRFIGFkZDsgLyogQnl0ZSBhZGRyZXNzIG9mIGNvci4gREFUQSAqLwotCUJZVEUgYjsgLyogV29ya2luZyBmb3IgYml0ICovCi0JQllURSBiaXQ7IC8qIEJpdCBhZGRyZXNzIG9mIGNvci4gREFUQSAqLworCXUzMiBsOyAvKiBXb3JraW5nIHRvIGNoZWNrIGQgKi8KKwl1MzIgZDsgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KKwl1MzIgaTsgLyogRm9yIGNvdW50aW5nICovCisJdTggZDEsIGQyLCBkMzsgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KKwl1OCBhOyAvKiBXb3JraW5nIGZvciBhZGQgKi8KKwl1OCBhZGQ7IC8qIEJ5dGUgYWRkcmVzcyBvZiBjb3IuIERBVEEgKi8KKwl1OCBiOyAvKiBXb3JraW5nIGZvciBiaXQgKi8KKwl1OCBiaXQ7IC8qIEJpdCBhZGRyZXNzIG9mIGNvci4gREFUQSAqLwogCiAJZDEgPSBlY2MxXmVjY2RhdGFbMV07IGQyID0gZWNjMl5lY2NkYXRhWzBdOyAvKiBDb21wYXJlIExQJ3MgKi8KIAlkMyA9IGVjYzNeZWNjZGF0YVsyXTsgLyogQ29tcGFyZSBDUCdzICovCi0JZCA9ICgoRFdPUkQpZDE8PDE2KSAvKiBSZXN1bHQgb2YgY29tcGFyaXNvbiAqLwotCSsoKERXT1JEKWQyPDw4KQotCSsoRFdPUkQpZDM7CisJZCA9ICgodTMyKWQxPDwxNikgLyogUmVzdWx0IG9mIGNvbXBhcmlzb24gKi8KKwkrKCh1MzIpZDI8PDgpCisJKyh1MzIpZDM7CiAKIAlpZiAoZCA9PSAwKQogCQlyZXR1cm4gMDsgLyogSWYgTm8gZXJyb3IsIHJldHVybiAqLwpAQCAtMTg4LDkgKzE4OCw5IEBACiAJcmV0dXJuIDM7IC8qIFVuY29ycmVjdGFibGUgZXJyb3IgKi8KIH0KIAotaW50IF9Db3JyZWN0X0RfU3dFQ0MoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnRfZWNjLCBCWVRFICpjYWxjdWxhdGVfZWNjKQoraW50IF9Db3JyZWN0X0RfU3dFQ0ModTggKmJ1ZiwgdTggKnJlZHVuZGFudF9lY2MsIHU4ICpjYWxjdWxhdGVfZWNjKQogewotCURXT1JEIGVycjsKKwl1MzIgZXJyOwogCiAJZXJyID0gY29ycmVjdF9kYXRhKGJ1ZiwgcmVkdW5kYW50X2VjYywgKihjYWxjdWxhdGVfZWNjICsgMSksCiAJCQkgICAqKGNhbGN1bGF0ZV9lY2MpLCAqKGNhbGN1bGF0ZV9lY2MgKyAyKSk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXZvaWQgX0NhbGN1bGF0ZV9EX1N3RUNDKEJZVEUgKmJ1ZiwgQllURSAqZWNjKQordm9pZCBfQ2FsY3VsYXRlX0RfU3dFQ0ModTggKmJ1ZiwgdTggKmVjYykKIHsKIAljYWxjdWxhdGVfZWNjKGVjY3RhYmxlLCBidWYsIGVjYysxLCBlY2MrMCwgZWNjKzIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYwppbmRleCAwOWQwN2UwLi5mYzdjYmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYwpAQCAtNCwxMSArNCwxMSBAQAogI2luY2x1ZGUgInNtY29tbW9uLmgiCiAjaW5jbHVkZSAic21pbC5oIgogCi1zdGF0aWMgaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCk7CitzdGF0aWMgaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqLCB1MzIpOwogc3RhdGljIGludCAgICAgICAgIEluY19EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqKTsKLXN0YXRpYyBpbnQgICAgICAgICBNZWRpYV9EX1JlYWRPbmVTZWN0KHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKik7CitzdGF0aWMgaW50ICAgICAgICAgTWVkaWFfRF9SZWFkT25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqLCB1MTYsIHU4ICopOwogCi1zdGF0aWMgaW50ICBDb3B5X0RfQmxvY2tBbGwoc3RydWN0IHVzX2RhdGEgKiwgRFdPUkQpOworc3RhdGljIGludCAgQ29weV9EX0Jsb2NrQWxsKHN0cnVjdCB1c19kYXRhICosIHUzMik7CiAKIHN0YXRpYyBpbnQgIEFzc2lnbl9EX1dyaXRlQmxvY2sodm9pZCk7CiBzdGF0aWMgaW50ICBSZWxlYXNlX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICopOwpAQCAtMTYsNyArMTYsNyBAQAogc3RhdGljIGludCAgUmVsZWFzZV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKik7CiAKIHN0YXRpYyBpbnQgIENvcHlfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICopOwotc3RhdGljIGludCAgUmVhZF9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqKTsKK3N0YXRpYyBpbnQgIFJlYWRfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICosIHUxNiwgdTggKik7CiBzdGF0aWMgaW50ICBFcmFzZV9EX1BoeU9uZUJsb2NrKHN0cnVjdCB1c19kYXRhICopOwogCiBzdGF0aWMgaW50ICBTZXRfRF9QaHlGbXRWYWx1ZShzdHJ1Y3QgdXNfZGF0YSAqKTsKQEAgLTI1LDI0ICsyNSwyNCBAQAogCiBzdGF0aWMgaW50ICBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHN0cnVjdCB1c19kYXRhICopOwogCi1zdGF0aWMgRFdPUkQgRXJyQ29kZTsKLXN0YXRpYyBCWVRFICBXb3JrQnVmW1NFQ1RTSVpFXTsKLXN0YXRpYyBCWVRFICBSZWR1bmRhbnRbUkVEVFNJWkVdOwotc3RhdGljIEJZVEUgIFdvcmtSZWR1bmRbUkVEVFNJWkVdOworc3RhdGljIHUzMiBFcnJDb2RlOworc3RhdGljIHU4ICBXb3JrQnVmW1NFQ1RTSVpFXTsKK3N0YXRpYyB1OCAgUmVkdW5kYW50W1JFRFRTSVpFXTsKK3N0YXRpYyB1OCAgV29ya1JlZHVuZFtSRURUU0laRV07CiAvKiAxMjggeCAxMDAwLCBMb2cyUGh5W01BWF9aT05FTlVNXVtNQVhfTE9HQkxPQ0tdOyAqLwotc3RhdGljIFdPUkQgICpMb2cyUGh5W01BWF9aT05FTlVNXTsKLXN0YXRpYyBCWVRFICBBc3NpZ25bTUFYX1pPTkVOVU1dW01BWF9CTE9DS05VTSAvIDhdOwotc3RhdGljIFdPUkQgIEFzc2lnblN0YXJ0W01BWF9aT05FTlVNXTsKLVdPUkQgIFJlYWRCbG9jazsKLVdPUkQgIFdyaXRlQmxvY2s7Ci1EV09SRCBNZWRpYUNoYW5nZTsKLXN0YXRpYyBEV09SRCBTZWN0Q29weU1vZGU7CitzdGF0aWMgdTE2ICAqTG9nMlBoeVtNQVhfWk9ORU5VTV07CitzdGF0aWMgdTggIEFzc2lnbltNQVhfWk9ORU5VTV1bTUFYX0JMT0NLTlVNIC8gOF07CitzdGF0aWMgdTE2ICBBc3NpZ25TdGFydFtNQVhfWk9ORU5VTV07Cit1MTYgIFJlYWRCbG9jazsKK3UxNiAgV3JpdGVCbG9jazsKK3UzMiBNZWRpYUNoYW5nZTsKK3N0YXRpYyB1MzIgU2VjdENvcHlNb2RlOwogCiAvKiBCSVQgQ29udHJvbCBNYWNybyAqLwotc3RhdGljIEJZVEUgQml0RGF0YVtdID0geyAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwIH07Ci0jZGVmaW5lIFNldF9EX0JpdChhLCBiKSAgICAoYVsoQllURSkoKGIpIC8gOCldIHw9IEJpdERhdGFbKGIpICUgOF0pCi0jZGVmaW5lIENscl9EX0JpdChhLCBiKSAgICAoYVsoQllURSkoKGIpIC8gOCldICY9IH5CaXREYXRhWyhiKSAlIDhdKQotI2RlZmluZSBDaGtfRF9CaXQoYSwgYikgICAgKGFbKEJZVEUpKChiKSAvIDgpXSAmIEJpdERhdGFbKGIpICUgOF0pCitzdGF0aWMgdTggQml0RGF0YVtdID0geyAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwIH07CisjZGVmaW5lIFNldF9EX0JpdChhLCBiKSAgICAoYVsodTgpKChiKSAvIDgpXSB8PSBCaXREYXRhWyhiKSAlIDhdKQorI2RlZmluZSBDbHJfRF9CaXQoYSwgYikgICAgKGFbKHU4KSgoYikgLyA4KV0gJj0gfkJpdERhdGFbKGIpICUgOF0pCisjZGVmaW5lIENoa19EX0JpdChhLCBiKSAgICAoYVsodTgpKChiKSAvIDgpXSAmIEJpdERhdGFbKGIpICUgOF0pCiAKIC8qIC0tLS0tIFNNX0ZyZWVNZW0oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgU01fRnJlZU1lbSh2b2lkKQpAQCAtNjIsOSArNjIsOSBAQAogCiAvKiBTbWFydE1lZGlhIFJlYWQvV3JpdGUvRXJhc2UgRnVuY3Rpb24gKi8KIC8qIC0tLS0tIE1lZGlhX0RfUmVhZFNlY3RvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBNZWRpYV9EX1JlYWRTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBzdGFydCwgV09SRCBjb3VudCwgQllURSAqYnVmKQoraW50IE1lZGlhX0RfUmVhZFNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUzMiBzdGFydCwgdTE2IGNvdW50LCB1OCAqYnVmKQogewotCVdPUkQgbGVuLCBibjsKKwl1MTYgbGVuLCBibjsKIAogCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCiAJCXJldHVybiBFcnJDb2RlOwpAQCAtOTcsOSArOTcsOSBAQAogfQogLyogaGVyZSAqLwogLyogLS0tLS0gTWVkaWFfRF9Db3B5U2VjdG9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgTWVkaWFfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgc3RhcnQsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKK2ludCBNZWRpYV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCB1MzIgc3RhcnQsIHUxNiBjb3VudCwgdTggKmJ1ZikKIHsKLQlXT1JEIGxlbiwgYm47CisJdTE2IGxlbiwgYm47CiAKIAkvKiBwcl9pbmZvKCJNZWRpYV9EX0NvcHlTZWN0b3IgISEhXG4iKTsgKi8KIAlpZiAoQ29udl9EX01lZGlhQWRkcih1cywgc3RhcnQpKQpAQCAtMTg2LDEyICsxODYsMTIgQEAKIAogLyogU21hcnRNZWRpYSBQaHlzaWNhbCBBZGRyZXNzIENvbnRyb2wgU3Vicm91dGluZSAqLwogLyogLS0tLS0gQ29udl9EX01lZGlhQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBDb252X0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgYWRkcikKK3N0YXRpYyBpbnQgQ29udl9EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUzMiBhZGRyKQogewotCURXT1JEIHRlbXA7CisJdTMyIHRlbXA7CiAKIAl0ZW1wICAgICAgICAgICA9IGFkZHIgLyBTc2ZkYy5NYXhTZWN0b3JzOwotCU1lZGlhLlpvbmUgICAgID0gKEJZVEUpICh0ZW1wIC8gU3NmZGMuTWF4TG9nQmxvY2tzKTsKKwlNZWRpYS5ab25lICAgICA9ICh1OCkgKHRlbXAgLyBTc2ZkYy5NYXhMb2dCbG9ja3MpOwogCiAJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV0gPT0gTlVMTCkgewogCQlpZiAoTWFrZV9EX0xvZ1RhYmxlKHVzKSkgewpAQCAtMjAwLDggKzIwMCw4IEBACiAJCX0KIAl9CiAKLQlNZWRpYS5TZWN0b3IgICA9IChCWVRFKSAoYWRkciAlIFNzZmRjLk1heFNlY3RvcnMpOwotCU1lZGlhLkxvZ0Jsb2NrID0gKFdPUkQpICh0ZW1wICUgU3NmZGMuTWF4TG9nQmxvY2tzKTsKKwlNZWRpYS5TZWN0b3IgICA9ICh1OCkgKGFkZHIgJSBTc2ZkYy5NYXhTZWN0b3JzKTsKKwlNZWRpYS5Mb2dCbG9jayA9ICh1MTYpICh0ZW1wICUgU3NmZGMuTWF4TG9nQmxvY2tzKTsKIAogCWlmIChNZWRpYS5ab25lIDwgU3NmZGMuTWF4Wm9uZXMpIHsKIAkJQ2xyX0RfUmVkdW5kYW50RGF0YShSZWR1bmRhbnQpOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAvKiAtLS0tLSBJbmNfRF9NZWRpYUFkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IEluY19EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JV09SRCAgICAgICAgTG9nQmxvY2sgPSBNZWRpYS5Mb2dCbG9jazsKKwl1MTYgICAgICAgIExvZ0Jsb2NrID0gTWVkaWEuTG9nQmxvY2s7CiAKIAlpZiAoKytNZWRpYS5TZWN0b3IgPCBTc2ZkYy5NYXhTZWN0b3JzKQogCQlyZXR1cm4gU01TVUNDRVNTOwpAQCAtMjY1LDkgKzI2NSw5IEBACiAKIC8qIFNtYXJ0TWVkaWEgUmVhZC9Xcml0ZSBTdWJyb3V0aW5lIHdpdGggUmV0cnkgKi8KIC8qIC0tLS0tIE1lZGlhX0RfUmVhZE9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgTWVkaWFfRF9SZWFkT25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKK3N0YXRpYyBpbnQgTWVkaWFfRF9SZWFkT25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUxNiBjb3VudCwgdTggKmJ1ZikKIHsKLQlEV09SRCBlcnIsIHJldHJ5OworCXUzMiBlcnIsIHJldHJ5OwogCiAJaWYgKCFSZWFkX0RfUGh5T25lU2VjdCh1cywgY291bnQsIGJ1ZikpCiAJCXJldHVybiBTTVNVQ0NFU1M7CkBAIC0zMDksOSArMzA5LDkgQEAKIAogLyogU21hcnRNZWRpYSBQaHlzaWNhbCBTZWN0b3IgRGF0YSBDb3B5IFN1YnJvdXRpbmUgKi8KIC8qIC0tLS0tIENvcHlfRF9CbG9ja0FsbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgQ29weV9EX0Jsb2NrQWxsKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgbW9kZSkKK3N0YXRpYyBpbnQgQ29weV9EX0Jsb2NrQWxsKHN0cnVjdCB1c19kYXRhICp1cywgdTMyIG1vZGUpCiB7Ci0JQllURSBzZWN0OworCXU4IHNlY3Q7CiAKIAlzZWN0ID0gTWVkaWEuU2VjdG9yOwogCkBAIC0zODEsNyArMzgxLDcgQEAKIC8qIC0tLS0tIFJlbGVhc2VfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgUmVsZWFzZV9EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JRFdPUkQgbW9kZTsKKwl1MzIgbW9kZTsKIAogCW1vZGUgPSBTZWN0Q29weU1vZGU7CiAJU2VjdENvcHlNb2RlID0gQ09NUExFVEVEOwpAQCAtNDMwLDcgKzQzMCw3IEBACiBzdGF0aWMgaW50IENvcHlfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlpbnQgICAgICAgICAgIGk7Ci0JRFdPUkQgIGVyciwgcmV0cnk7CisJdTMyICBlcnIsIHJldHJ5OwogCiAJLyogcHJfaW5mbygiQ29weV9EX1BoeU9uZVNlY3QgLS0tIFNlY3RvciA9ICV4XG4iLCBNZWRpYS5TZWN0b3IpOyAqLwogCWlmIChSZWFkQmxvY2sgIT0gTk9fQVNTSUdOKSB7CkBAIC01MDQsMTAgKzUwNCwxMCBAQAogCiAvKiBTbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBSZWFkL1dyaXRlL0VyYXNlIFN1YnJvdXRpbmUgKi8KIC8qIC0tLS0tIFJlYWRfRF9QaHlPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgUmVhZF9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYpCitzdGF0aWMgaW50IFJlYWRfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGNvdW50LCB1OCAqYnVmKQogewogCWludCAgICAgICAgICAgaTsKLQlEV09SRCAgcmV0cnk7CisJdTMyICByZXRyeTsKIAogCWlmIChNZWRpYS5QaHlCbG9jayA9PSBOT19BU1NJR04pIHsKIAkJZm9yIChpID0gMDsgaSA8IFNFQ1RTSVpFOyBpKyspCkBAIC02MzcsMTAgKzYzNywxMCBAQAogLyogLS0tLS0gTWFrZV9EX0xvZ1RhYmxlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGludCBNYWtlX0RfTG9nVGFibGUoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCVdPUkQgIHBoeWJsb2NrLCBsb2dibG9jazsKKwl1MTYgIHBoeWJsb2NrLCBsb2dibG9jazsKIAogCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdID09IE5VTEwpIHsKLQkJTG9nMlBoeVtNZWRpYS5ab25lXSA9IGttYWxsb2MoTUFYX0xPR0JMT0NLICogc2l6ZW9mKFdPUkQpLAorCQlMb2cyUGh5W01lZGlhLlpvbmVdID0ga21hbGxvYyhNQVhfTE9HQkxPQ0sgKiBzaXplb2YodTE2KSwKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCS8qIHByX2luZm8oIkV4QWxsb2NhdGVQb29sIFpvbmUgPSAleCwgQWRkciA9ICV4XG4iLAogCQkJCU1lZGlhLlpvbmUsIExvZzJQaHlbTWVkaWEuWm9uZV0pOyAqLwpAQCAtNjkzLDcgKzY5Myw3IEBACiAKIAkJcGh5YmxvY2sgICAgID0gTWVkaWEuUGh5QmxvY2s7CiAJCWxvZ2Jsb2NrICAgICA9IE1lZGlhLkxvZ0Jsb2NrOwotCQlNZWRpYS5TZWN0b3IgPSAoQllURSkoU3NmZGMuTWF4U2VjdG9ycyAtIDEpOworCQlNZWRpYS5TZWN0b3IgPSAodTgpKFNzZmRjLk1heFNlY3RvcnMgLSAxKTsKIAogCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpIHsKIAkJCVNzZmRjX0RfUmVzZXQodXMpOwpAQCAtNzM4LDcgKzczOCw3IEBACiAvKiAtLS0tLSBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IE1hcmtGYWlsX0RfUGh5T25lQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQogewotCUJZVEUgc2VjdDsKKwl1OCBzZWN0OwogCiAJc2VjdCA9IE1lZGlhLlNlY3RvcjsKIAlTZXRfRF9GYWlsQmxvY2soV29ya1JlZHVuZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYwppbmRleCAxNmRhOWE5Li40NGNlZDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKQEAgLTYsMTYgKzYsMTYgQEAKICNpbmNsdWRlICJzbWNvbW1vbi5oIgogI2luY2x1ZGUgInNtaWwuaCIKIAotc3RhdGljIEJZVEUgICBfQ2hlY2tfRF9EZXZDb2RlKEJZVEUpOwotc3RhdGljIERXT1JECUVyclhEQ29kZTsKLXN0YXRpYyBCWVRFCUlzU1NGRENDb21wbGlhbmNlOwotc3RhdGljIEJZVEUJSXNYRENvbXBsaWFuY2U7CitzdGF0aWMgdTggICBfQ2hlY2tfRF9EZXZDb2RlKHU4KTsKK3N0YXRpYyB1MzIJRXJyWERDb2RlOworc3RhdGljIHU4CUlzU1NGRENDb21wbGlhbmNlOworc3RhdGljIHU4CUlzWERDb21wbGlhbmNlOwogCiBzdHJ1Y3Qga2V1Y3JfbWVkaWFfaW5mbyAgICAgICAgIFNzZmRjOwogc3RydWN0IGtldWNyX21lZGlhX2FkZHJlc3MgICAgICBNZWRpYTsKIHN0cnVjdCBrZXVjcl9tZWRpYV9hcmVhICAgICAgICAgQ2lzQXJlYTsKIAotc3RhdGljIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNjQnVmWzZdOworc3RhdGljIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjY0J1Zls2XTsKIAogI2RlZmluZSBFVkVOICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgIC8qIEV2ZW4gUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlICovCiAjZGVmaW5lIE9ERCAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgLyogT2RkIFBhZ2UgZm9yIDI1NmJ5dGUvcGFnZSAqLwpAQCAtMjQsNyArMjQsNyBAQAogLyogU21hcnRNZWRpYSBSZWR1bmRhbnQgYnVmZmVyIGRhdGEgQ29udHJvbCBTdWJyb3V0aW5lCiAgKi0tLS0tIENoZWNrX0RfRGF0YUJsYW5rKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IENoZWNrX0RfRGF0YUJsYW5rKEJZVEUgKnJlZHVuZGFudCkKK2ludCBDaGVja19EX0RhdGFCbGFuayh1OCAqcmVkdW5kYW50KQogewogCWNoYXIgaTsKIApAQCAtMzYsNyArMzYsNyBAQAogfQogCiAvKiAtLS0tLSBDaGVja19EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgQ2hlY2tfRF9GYWlsQmxvY2soQllURSAqcmVkdW5kYW50KQoraW50IENoZWNrX0RfRmFpbEJsb2NrKHU4ICpyZWR1bmRhbnQpCiB7CiAJcmVkdW5kYW50ICs9IFJFRFRfQkxPQ0s7CiAKQEAgLTUxLDcgKzUxLDcgQEAKIH0KIAogLyogLS0tLS0gQ2hlY2tfRF9EYXRhU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IENoZWNrX0RfRGF0YVN0YXR1cyhCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9EYXRhU3RhdHVzKHU4ICpyZWR1bmRhbnQpCiB7CiAJcmVkdW5kYW50ICs9IFJFRFRfREFUQTsKIApAQCAtNzAsMTQgKzcwLDE0IEBACiB9CiAKIC8qIC0tLS0tIExvYWRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBMb2FkX0RfTG9nQmxvY2tBZGRyKEJZVEUgKnJlZHVuZGFudCkKK2ludCBMb2FkX0RfTG9nQmxvY2tBZGRyKHU4ICpyZWR1bmRhbnQpCiB7Ci0JV09SRCBhZGRyMSwgYWRkcjI7CisJdTE2IGFkZHIxLCBhZGRyMjsKIAotCWFkZHIxID0gKFdPUkQpKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCkqMHgwMTAwICsKLQkJCQkJKFdPUkQpKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCk7Ci0JYWRkcjIgPSAoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjJIKSoweDAxMDAgKwotCQkJCQkoV09SRCkqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKTsKKwlhZGRyMSA9ICh1MTYpKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCkqMHgwMTAwICsKKwkJCQkJKHUxNikqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKKwlhZGRyMiA9ICh1MTYpKihyZWR1bmRhbnQgKyBSRURUX0FERFIySCkqMHgwMTAwICsKKwkJCQkJKHUxNikqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKTsKIAogCWlmIChhZGRyMSA9PSBhZGRyMikKIAkJaWYgKChhZGRyMSAmIDB4RjAwMCkgPT0gMHgxMDAwKSB7CkBAIC04NSw3ICs4NSw3IEBACiAJCQlyZXR1cm4gU01TVUNDRVNTOwogCQl9CiAKLQlpZiAoaHdlaWdodDE2KChXT1JEKShhZGRyMV5hZGRyMikpICE9IDB4MDEpCisJaWYgKGh3ZWlnaHQxNigodTE2KShhZGRyMV5hZGRyMikpICE9IDB4MDEpCiAJCXJldHVybiBFUlJPUjsKIAogCWlmICgoYWRkcjEgJiAweEYwMDApID09IDB4MTAwMCkKQEAgLTEwNCw3ICsxMDQsNyBAQAogfQogCiAvKiAtLS0tLSBDbHJfRF9SZWR1bmRhbnREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIENscl9EX1JlZHVuZGFudERhdGEoQllURSAqcmVkdW5kYW50KQordm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKHU4ICpyZWR1bmRhbnQpCiB7CiAJY2hhciBpOwogCkBAIC0xMTMsOSArMTEzLDkgQEAKIH0KIAogLyogLS0tLS0gU2V0X0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIoQllURSAqcmVkdW5kYW50KQordm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIodTggKnJlZHVuZGFudCkKIHsKLQlXT1JEIGFkZHI7CisJdTE2IGFkZHI7CiAKIAkqKHJlZHVuZGFudCArIFJFRFRfQkxPQ0spID0gMHhGRjsKIAkqKHJlZHVuZGFudCArIFJFRFRfREFUQSkgPSAweEZGOwpAQCAtMTI1LDIwICsxMjUsMjAgQEAKIAkJYWRkcisrOwogCiAJKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCkgPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjJIKSA9Ci0JCQkJCQkJKEJZVEUpKGFkZHIgLyAweDAxMDApOwotCSoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpID0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIyTCkgPSAoQllURSlhZGRyOworCQkJCQkJCSh1OCkoYWRkciAvIDB4MDEwMCk7CisJKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCkgPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjJMKSA9ICh1OClhZGRyOwogfQogCiAvKi0tLS0tIFNldF9EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgU2V0X0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKK3ZvaWQgU2V0X0RfRmFpbEJsb2NrKHU4ICpyZWR1bmRhbnQpCiB7CiAJY2hhciBpOwogCWZvciAoaSA9IDA7IGkgPCBSRURUU0laRTsgaSsrKQotCQkqcmVkdW5kYW50KysgPSAoQllURSkoKGkgPT0gUkVEVF9CTE9DSykgPyAweEYwIDogMHhGRik7CisJCSpyZWR1bmRhbnQrKyA9ICh1OCkoKGkgPT0gUkVEVF9CTE9DSykgPyAweEYwIDogMHhGRik7CiB9CiAKIC8qIC0tLS0tIFNldF9EX0RhdGFTdGF1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgU2V0X0RfRGF0YVN0YXVzKEJZVEUgKnJlZHVuZGFudCkKK3ZvaWQgU2V0X0RfRGF0YVN0YXVzKHU4ICpyZWR1bmRhbnQpCiB7CiAJcmVkdW5kYW50ICs9IFJFRFRfREFUQTsKIAkqcmVkdW5kYW50ID0gMHgwMDsKQEAgLTE1NCwxMCArMTU0LDEwIEBACiB9CiAKIC8qIC0tLS0tIFNzZmRjX0RfUmVhZENpc1NlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBTc2ZkY19EX1JlYWRDaXNTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4ICpidWYsIHU4ICpyZWR1bmRhbnQpCiB7Ci0JQllURSB6b25lLCBzZWN0b3I7Ci0JV09SRCBibG9jazsKKwl1OCB6b25lLCBzZWN0b3I7CisJdTE2IGJsb2NrOwogCiAJem9uZSA9IE1lZGlhLlpvbmU7IGJsb2NrID0gTWVkaWEuUGh5QmxvY2s7IHNlY3RvciA9IE1lZGlhLlNlY3RvcjsKIAlNZWRpYS5ab25lID0gMDsKQEAgLTE3NywxMSArMTc3LDExIEBACiAKIC8qIDYyNTAgQ01EIDEgKi8KIC8qIC0tLS0tIFNzZmRjX0RfUmVhZFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9SZWFkU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4ICpidWYsIHU4ICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRAlhZGRyOworCXUxNglhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtMTkwLDggKzE5MCw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCS8qIFJlYWQgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKQEAgLTIwMCw4ICsyMDAsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDI7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CkBAIC0yMTUsOCArMjE1LDggQEAKIAliY2ItPkZsYWdzCQkJPSAweDgwOwogCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwogCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwotCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbNF0JCQk9ICh1OClhZGRyOworCWJjYi0+Q0RCWzNdCQkJPSAodTgpKGFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gMDsKIAliY2ItPkNEQls5XQkJCT0gMTsKQEAgLTIyOSwxMiArMjI5LDEyIEBACiB9CiAKIC8qIC0tLS0tIFNzZmRjX0RfUmVhZEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYsCi0JCQkJCQkJQllURSAqcmVkdW5kYW50KQoraW50IFNzZmRjX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgdTE2IGNvdW50LCB1OCAqYnVmLAorCQkJCQkJCXU4ICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7Ci0JV09SRAlhZGRyOworCXUxNglhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtMjQzLDggKzI0Myw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCS8qIFJlYWQgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKQEAgLTI1Myw4ICsyNTMsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDI7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CkBAIC0yNjgsOCArMjY4LDggQEAKIAliY2ItPkZsYWdzCQkJPSAweDgwOwogCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwogCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwotCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbNF0JCQk9ICh1OClhZGRyOworCWJjYi0+Q0RCWzNdCQkJPSAodTgpKGFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gMDsKIAliY2ItPkNEQls5XQkJCT0gMTsKQEAgLTI4MywxMiArMjgzLDEyIEBACiAKIAogLyogLS0tLS0gU3NmZGNfRF9Db3B5QmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLAotCQkJCQkJCUJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX0NvcHlCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUxNiBjb3VudCwgdTggKmJ1ZiwKKwkJCQkJCQl1OCAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQJUmVhZEFkZHIsIFdyaXRlQWRkcjsKKwl1MTYJUmVhZEFkZHIsIFdyaXRlQWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKQEAgLTI5NywxMCArMjk3LDEwIEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JUmVhZEFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIFJlYWRCbG9jazsKLQlSZWFkQWRkciA9IFJlYWRBZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7Ci0JV3JpdGVBZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBXcml0ZUJsb2NrOwotCVdyaXRlQWRkciA9IFdyaXRlQWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOworCVJlYWRBZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIFJlYWRCbG9jazsKKwlSZWFkQWRkciA9IFJlYWRBZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9yczsKKwlXcml0ZUFkZHIgPSAodTE2KU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgV3JpdGVCbG9jazsKKwlXcml0ZUFkZHIgPSBXcml0ZUFkZHIqKHUxNilTc2ZkYy5NYXhTZWN0b3JzOwogCiAJLyogV3JpdGUgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKQEAgLTMwOSwxNiArMzA5LDE2IEBACiAJYmNiLT5GbGFncwkJCT0gMHgwMDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMDsKIAliY2ItPkNEQlsxXQkJCT0gMHgwODsKLQliY2ItPkNEQls3XQkJCT0gKEJZVEUpV3JpdGVBZGRyOwotCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoV3JpdGVBZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls3XQkJCT0gKHU4KVdyaXRlQWRkcjsKKwliY2ItPkNEQls2XQkJCT0gKHU4KShXcml0ZUFkZHIgLyAweDAxMDApOwogCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCk7CiAJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpOwogCWJjYi0+Q0RCWzEwXQkJPSBNZWRpYS5TZWN0b3I7CiAKIAlpZiAoUmVhZEJsb2NrICE9IE5PX0FTU0lHTikgewotCQliY2ItPkNEQls0XQkJPSAoQllURSlSZWFkQWRkcjsKLQkJYmNiLT5DREJbM10JCT0gKEJZVEUpKFJlYWRBZGRyIC8gMHgwMTAwKTsKKwkJYmNiLT5DREJbNF0JCT0gKHU4KVJlYWRBZGRyOworCQliY2ItPkNEQlszXQkJPSAodTgpKFJlYWRBZGRyIC8gMHgwMTAwKTsKIAkJYmNiLT5DREJbMl0JCT0gTWVkaWEuWm9uZSAvIDI7CiAJfSBlbHNlCiAJCWJjYi0+Q0RCWzExXQk9IDE7CkBAIC0zMzEsMTEgKzMzMSwxMSBAQAogfQogCiAvKiAtLS0tLSBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICp1cywgdTggKmJ1ZiwgdTggKnJlZHVuZGFudCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKLQlXT1JECWFkZHI7CisJdTE2CWFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CkBAIC0zNDUsOCArMzQ1LDggQEAKIAl9CiAKIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CisJYWRkciA9ICh1MTYpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkcioodTE2KVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CiAKIAkvKiBXcml0ZSBzZWN0IGRhdGEgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwpAQCAtMzU1LDggKzM1NSw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHgwMDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMDsKIAliY2ItPkNEQlsxXQkJCT0gMHgwNDsKLQliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzddCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQls2XQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpOwogCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKQEAgLTM3NCw3ICszNzQsNyBAQAogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQJYWRkcjsKKwl1MTYJYWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKQEAgLTM4Myw4ICszODMsOCBAQAogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7CisJYWRkciA9ICh1MTYpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkcioodTE2KVNzZmRjLk1heFNlY3RvcnM7CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKQEAgLTM5Miw4ICszOTIsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjI7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDY7Ci0JYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls3XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbNl0JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwpAQCAtNDA1LDEyICs0MDUsMTIgQEAKIAogLyogNjI1MCBDTUQgMiAqLwogLyotLS0tLSBTc2ZkY19EX1JlYWRSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgU3NmZGNfRF9SZWFkUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgU3NmZGNfRF9SZWFkUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQJYWRkcjsKLQlCWVRFCSpidWY7CisJdTE2CWFkZHI7CisJdTgJKmJ1ZjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKQEAgLTQxOSw4ICs0MTksOCBAQAogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOwotCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CisJYWRkciA9ICh1MTYpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkcioodTE2KVNzZmRjLk1heFNlY3RvcnMgKyBNZWRpYS5TZWN0b3I7CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKQEAgLTQyOCw4ICs0MjgsOCBAQAogCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDM7Ci0JYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls0XQkJCT0gKHU4KWFkZHI7CisJYmNiLT5DREJbM10JCQk9ICh1OCkoYWRkciAvIDB4MDEwMCk7CiAJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCWJjYi0+Q0RCWzhdCQkJPSAwOwogCWJjYi0+Q0RCWzldCQkJPSAxOwpAQCAtNDQ2LDExICs0NDYsMTEgQEAKIAogLyogNjI1MCBDTUQgNCAqLwogLyogLS0tLS0gU3NmZGNfRF9Xcml0ZVJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotaW50IFNzZmRjX0RfV3JpdGVSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKnJlZHVuZGFudCkKK2ludCBTc2ZkY19EX1dyaXRlUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCVdPUkQgICAgICAgICAgICAgICAgICAgIGFkZHI7CisJdTE2ICAgICAgICAgICAgICAgICAgICBhZGRyOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewpAQCAtNDU5LDggKzQ1OSw4IEBACiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKKwlhZGRyID0gKHUxNilNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcyArIE1lZGlhLlBoeUJsb2NrOworCWFkZHIgPSBhZGRyKih1MTYpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwpAQCAtNDY4LDggKzQ2OCw4IEBACiAJYmNiLT5GbGFncwkJCT0gMHg4MDsKIAliY2ItPkNEQlswXQkJCT0gMHhGMjsKIAliY2ItPkNEQlsxXQkJCT0gMHgwNTsKLQliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzddCQkJPSAodTgpYWRkcjsKKwliY2ItPkNEQls2XQkJCT0gKHU4KShhZGRyIC8gMHgwMTAwKTsKIAliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpOwogCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogLyogU21hcnRNZWRpYSBJRCBDb2RlIENoZWNrICYgTW9kZSBTZXQgU3Vicm91dGluZQogICogLS0tLS0gU2V0X0RfU3NmZGNNb2RlbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1pbnQgU2V0X0RfU3NmZGNNb2RlbChCWVRFIGRjb2RlKQoraW50IFNldF9EX1NzZmRjTW9kZWwodTggZGNvZGUpCiB7CiAJc3dpdGNoIChfQ2hlY2tfRF9EZXZDb2RlKGRjb2RlKSkgewogCWNhc2UgU1NGREMxTUI6CkBAIC02MDAsNyArNjAwLDcgQEAKIH0KIAogLyogLS0tLS0gX0NoZWNrX0RfRGV2Q29kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotQllURSBfQ2hlY2tfRF9EZXZDb2RlKEJZVEUgZGNvZGUpCitzdGF0aWMgdTggX0NoZWNrX0RfRGV2Q29kZSh1OCBkY29kZSkKIHsKIAlzd2l0Y2ggKGRjb2RlKSB7CiAJY2FzZSAweDZFOgpAQCAtNjMwLDIxICs2MzAsMjEgQEAKIC8qIFNtYXJ0TWVkaWEgRUNDIENvbnRyb2wgU3Vicm91dGluZQogICogLS0tLS0gQ2hlY2tfRF9SZWFkRXJyb3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLWludCBDaGVja19EX1JlYWRFcnJvcihCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9SZWFkRXJyb3IodTggKnJlZHVuZGFudCkKIHsKIAlyZXR1cm4gU01TVUNDRVNTOwogfQogCiAvKiAtLS0tLSBDaGVja19EX0NvcnJlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgQ2hlY2tfRF9Db3JyZWN0KEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQoraW50IENoZWNrX0RfQ29ycmVjdCh1OCAqYnVmLCB1OCAqcmVkdW5kYW50KQogewogCXJldHVybiBTTVNVQ0NFU1M7CiB9CiAKIC8qIC0tLS0tIENoZWNrX0RfQ0lTZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBDaGVja19EX0NJU2RhdGEoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCitpbnQgQ2hlY2tfRF9DSVNkYXRhKHU4ICpidWYsIHU4ICpyZWR1bmRhbnQpCiB7Ci0JQllURSBjaXNbXSA9IHsweDAxLCAweDAzLCAweEQ5LCAweDAxLCAweEZGLCAweDE4LCAweDAyLAorCXU4IGNpc1tdID0gezB4MDEsIDB4MDMsIDB4RDksIDB4MDEsIDB4RkYsIDB4MTgsIDB4MDIsCiAJCSAgICAgIDB4REYsIDB4MDEsIDB4MjB9OwogCiAJaW50IGNpc19sZW4gPSBzaXplb2YoY2lzKTsKQEAgLTY2OSw3ICs2NjksNyBAQAogfQogCiAvKiAtLS0tLSBTZXRfRF9SaWdodEVDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgU2V0X0RfUmlnaHRFQ0MoQllURSAqcmVkdW5kYW50KQordm9pZCBTZXRfRF9SaWdodEVDQyh1OCAqcmVkdW5kYW50KQogewogCS8qIERyaXZlciBFQ0MgQ2hlY2sgKi8KIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21zY3NpLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21zY3NpLmMKaW5kZXggNWMwM2VjYS4uMjA4NThmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3Ntc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbXNjc2kuYwpAQCAtNjgsNyArNjgsNyBAQAogLyogLS0tLS0gU01fU0NTSV9JbnF1aXJ5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IFNNX1NDU0lfSW5xdWlyeShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQlCWVRFIGRhdGFfcHRyWzM2XSA9IHsweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAorCXU4IGRhdGFfcHRyWzM2XSA9IHsweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAogCQkJCSAweDU1LCAweDUzLCAweDQyLCAweDMyLCAweDJFLCAweDMwLCAweDIwLAogCQkJCSAweDIwLCAweDQzLCAweDYxLCAweDcyLCAweDY0LCAweDUyLCAweDY1LAogCQkJCSAweDYxLCAweDY0LCAweDY1LCAweDcyLCAweDIwLCAweDIwLCAweDIwLApAQCAtODIsOSArODIsOSBAQAogLyogLS0tLS0gU01fU0NTSV9Nb2RlX1NlbnNlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IFNNX1NDU0lfTW9kZV9TZW5zZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQlCWVRFCW1lZGlhTm9XUFsxMl0gPSB7MHgwYiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwKKwl1OAltZWRpYU5vV1BbMTJdID0gezB4MGIsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsCiAJCQkJMHg3MSwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07Ci0JQllURQltZWRpYVdQWzEyXSAgID0gezB4MGIsIDB4MDAsIDB4ODAsIDB4MDgsIDB4MDAsIDB4MDAsCisJdTgJbWVkaWFXUFsxMl0gICA9IHsweDBiLCAweDAwLCAweDgwLCAweDA4LCAweDAwLCAweDAwLAogCQkJCTB4NzEsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OwogCiAJaWYgKHVzLT5TTV9TdGF0dXMuV3RQKQpAQCAtMTAxLDkgKzEwMSw5IEBACiB7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7Ci0JRFdPUkQgICBibF9udW07Ci0JV09SRCAgICBibF9sZW47Ci0JQllURSAgICBidWZbOF07CisJdTMyICAgYmxfbnVtOworCXUxNiAgICBibF9sZW47CisJdTggICAgYnVmWzhdOwogCiAJZGV2X2RiZygmdXMtPnB1c2JfZGV2LT5kZXYsICJTTV9TQ1NJX1JlYWRfQ2FwYWNpdHlcbiIpOwogCkBAIC0xMzIsMTMgKzEzMiwxMyBAQAogc3RhdGljIGludCBTTV9TQ1NJX1JlYWQoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JUEJZVEUJQ2RiID0gc3JiLT5jbW5kOwotCURXT1JEIGJuICA9ICAoKENkYlsyXSA8PCAyNCkgJiAweGZmMDAwMDAwKSB8CisJdTggKkNkYiA9IHNyYi0+Y21uZDsKKwl1MzIgYm4gID0gICgoQ2RiWzJdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHwKIAkJCSgoQ2RiWzNdIDw8IDE2KSAmIDB4MDBmZjAwMDApIHwKIAkJCSgoQ2RiWzRdIDw8IDgpICYgMHgwMDAwZmYwMCkgfAogCQkJKChDZGJbNV0gPDwgMCkgJiAweDAwMDAwMGZmKTsKLQlXT1JEICBibGVuID0gKChDZGJbN10gPDwgOCkgJiAweGZmMDApICAgICB8ICgoQ2RiWzhdIDw8IDApICYgMHgwMGZmKTsKLQlEV09SRAlibGVuQnl0ZSA9IGJsZW4gKiAweDIwMDsKKwl1MTYgIGJsZW4gPSAoKENkYls3XSA8PCA4KSAmIDB4ZmYwMCkgICAgIHwgKChDZGJbOF0gPDwgMCkgJiAweDAwZmYpOworCXUzMglibGVuQnl0ZSA9IGJsZW4gKiAweDIwMDsKIAl2b2lkCSpidWY7CiAKIApAQCAtMTY0LDEzICsxNjQsMTMgQEAKIHN0YXRpYyBpbnQgU01fU0NTSV9Xcml0ZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlQQllURQlDZGIgPSBzcmItPmNtbmQ7Ci0JRFdPUkQgYm4gID0gICgoQ2RiWzJdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHwKKwl1OCAqQ2RiID0gc3JiLT5jbW5kOworCXUzMiBibiAgPSAgKChDZGJbMl0gPDwgMjQpICYgMHhmZjAwMDAwMCkgfAogCQkJKChDZGJbM10gPDwgMTYpICYgMHgwMGZmMDAwMCkgfAogCQkJKChDZGJbNF0gPDwgOCkgJiAweDAwMDBmZjAwKSB8CiAJCQkoKENkYls1XSA8PCAwKSAmIDB4MDAwMDAwZmYpOwotCVdPUkQgIGJsZW4gPSAoKENkYls3XSA8PCA4KSAmIDB4ZmYwMCkgICAgIHwgKChDZGJbOF0gPDwgMCkgJiAweDAwZmYpOwotCURXT1JECWJsZW5CeXRlID0gYmxlbiAqIDB4MjAwOworCXUxNiAgYmxlbiA9ICgoQ2RiWzddIDw8IDgpICYgMHhmZjAwKSAgICAgfCAoKENkYls4XSA8PCAwKSAmIDB4MDBmZik7CisJdTMyCWJsZW5CeXRlID0gYmxlbiAqIDB4MjAwOwogCXZvaWQJKmJ1ZjsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmMKaW5kZXggYWViMjE4Ni4uYWU5NDE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuYwpAQCAtODMsOCArODMsOCBAQAogICovCiBzdGF0aWMgdm9pZCB1c2Jfc3Rvcl9wcmludF9jbWQoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7Ci0JUEJZVEUgICBDZGIgPSBzcmItPmNtbmQ7Ci0JRFdPUkQgICBjbWQgPSBDZGJbMF07CisJdTggKkNkYiA9IHNyYi0+Y21uZDsKKwl1MzIgICBjbWQgPSBDZGJbMF07CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVEVTVF9VTklUX1JFQURZOgpAQCAtNTQ1LDggKzU0NSw4IEBACiAgKi8KIHZvaWQgQnVpbGRTZW5zZUJ1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIGludCBTcmJTdGF0dXMpCiB7Ci0JQllURSAgICAqYnVmID0gc3JiLT5zZW5zZV9idWZmZXI7Ci0JQllURSAgICBhc2M7CisJdTggICAgKmJ1ZiA9IHNyYi0+c2Vuc2VfYnVmZmVyOworCXU4ICAgIGFzYzsKIAogCXByX2luZm8oInRyYW5zcG9ydCAtLS0gQnVpbGRTZW5zZUJ1ZmZlclxuIik7CiAJc3dpdGNoIChTcmJTdGF0dXMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci90cmFuc3BvcnQuaAppbmRleCBkZjM0NDc0Li5hYmQ4ZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdHJhbnNwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3RyYW5zcG9ydC5oCkBAIC01OCw5ICs1OCw5IEBACiBleHRlcm4gdm9pZCBFTkVfc3Rvcl9pbnZva2VfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKiwgc3RydWN0IHVzX2RhdGEgKik7CiBleHRlcm4gaW50IEVORV9Jbml0TWVkaWEoc3RydWN0IHVzX2RhdGEgKik7CiBleHRlcm4gaW50IEVORV9TTUluaXQoc3RydWN0IHVzX2RhdGEgKik7Ci1leHRlcm4gaW50IEVORV9TZW5kU2NzaUNtZChzdHJ1Y3QgdXNfZGF0YSosIEJZVEUsIHZvaWQqLCBpbnQpOwotZXh0ZXJuIGludCBFTkVfTG9hZEJpbkNvZGUoc3RydWN0IHVzX2RhdGEqLCBCWVRFKTsKLWV4dGVybiBpbnQgZW5lX3JlYWRfYnl0ZShzdHJ1Y3QgdXNfZGF0YSosIFdPUkQgaW5kZXgsIHZvaWQgKmJ1Zik7CitleHRlcm4gaW50IEVORV9TZW5kU2NzaUNtZChzdHJ1Y3QgdXNfZGF0YSosIHU4LCB2b2lkKiwgaW50KTsKK2V4dGVybiBpbnQgRU5FX0xvYWRCaW5Db2RlKHN0cnVjdCB1c19kYXRhKiwgdTgpOworZXh0ZXJuIGludCBlbmVfcmVhZF9ieXRlKHN0cnVjdCB1c19kYXRhKiwgdTE2IGluZGV4LCB2b2lkICpidWYpOwogZXh0ZXJuIGludCBFTkVfUmVhZF9EYXRhKHN0cnVjdCB1c19kYXRhKiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKIGV4dGVybiBpbnQgRU5FX1dyaXRlX0RhdGEoc3RydWN0IHVzX2RhdGEqLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpOwogZXh0ZXJuIHZvaWQgQnVpbGRTZW5zZUJ1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmMKaW5kZXggM2UzY2E2My4uMTJlYmRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuYwpAQCAtNTAsNyArNTAsNyBAQAogCiBzdGF0aWMgaW50IGV1Y3JfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKIHsKLQlCWVRFICAgIHRtcCA9IDA7CisJdTggICAgdG1wID0gMDsKIAogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCXByX2luZm8oIi0tLSBldWNyX3Jlc3VtZS0tLVxuIik7CkBAIC03MSw3ICs3MSw3IEBACiAKIHN0YXRpYyBpbnQgZXVjcl9yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQogewotCUJZVEUgICAgdG1wID0gMDsKKwl1OCAgICB0bXAgPSAwOwogCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOwogCiAJcHJfaW5mbygiLS0tIGV1Y3JfcmVzZXRfcmVzdW1lLS0tXG4iKTsKQEAgLTUyOCw3ICs1MjgsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc3RydWN0IHVzX2RhdGEgKnVzOwogCWludCByZXN1bHQ7Ci0JQllURQlNaXNjUmVnMDMgPSAwOworCXU4CU1pc2NSZWcwMyA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0aDsKIAogCXByX2luZm8oInVzYiAtLS0gZXVjcl9wcm9iZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvdXNiLmgKaW5kZXggZDY2NWFmMS4uZTg5NGY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci91c2IuaApAQCAtNTIsMzQgKzUyLDM0IEBACiAjZGVmaW5lIEZESVJfUkVBRCAgICAgICAgIDEKIAogc3RydWN0IGtldWNyX3NkX3N0YXR1cyB7Ci0JQllURSAgICBJbnNlcnQ6MTsKLQlCWVRFICAgIFJlYWR5OjE7Ci0JQllURSAgICBNZWRpYUNoYW5nZToxOwotCUJZVEUgICAgSXNNTUM6MTsKLQlCWVRFICAgIEhpQ2FwYWNpdHk6MTsKLQlCWVRFICAgIEhpU3BlZWQ6MTsKLQlCWVRFICAgIFd0UDoxOwotCUJZVEUgICAgUmVzZXJ2ZWQ6MTsKKwl1OCAgICBJbnNlcnQ6MTsKKwl1OCAgICBSZWFkeToxOworCXU4ICAgIE1lZGlhQ2hhbmdlOjE7CisJdTggICAgSXNNTUM6MTsKKwl1OCAgICBIaUNhcGFjaXR5OjE7CisJdTggICAgSGlTcGVlZDoxOworCXU4ICAgIFd0UDoxOworCXU4ICAgIFJlc2VydmVkOjE7CiB9OwogCiBzdHJ1Y3Qga2V1Y3JfbXNfc3RhdHVzIHsKLQlCWVRFICAgIEluc2VydDoxOwotCUJZVEUgICAgUmVhZHk6MTsKLQlCWVRFICAgIE1lZGlhQ2hhbmdlOjE7Ci0JQllURSAgICBJc01TUHJvOjE7Ci0JQllURSAgICBJc01TUEhHOjE7Ci0JQllURSAgICBSZXNlcnZlZDE6MTsKLQlCWVRFICAgIFd0UDoxOwotCUJZVEUgICAgUmVzZXJ2ZWQyOjE7CisJdTggICAgSW5zZXJ0OjE7CisJdTggICAgUmVhZHk6MTsKKwl1OCAgICBNZWRpYUNoYW5nZToxOworCXU4ICAgIElzTVNQcm86MTsKKwl1OCAgICBJc01TUEhHOjE7CisJdTggICAgUmVzZXJ2ZWQxOjE7CisJdTggICAgV3RQOjE7CisJdTggICAgUmVzZXJ2ZWQyOjE7CiB9OwogCiBzdHJ1Y3Qga2V1Y3Jfc21fc3RhdHVzIHsKLQlCWVRFICAgIEluc2VydDoxOwotCUJZVEUgICAgUmVhZHk6MTsKLQlCWVRFICAgIE1lZGlhQ2hhbmdlOjE7Ci0JQllURSAgICBSZXNlcnZlZDozOwotCUJZVEUgICAgV3RQOjE7Ci0JQllURSAgICBJc01TOjE7CisJdTggICAgSW5zZXJ0OjE7CisJdTggICAgUmVhZHk6MTsKKwl1OCAgICBNZWRpYUNoYW5nZToxOworCXU4ICAgIFJlc2VydmVkOjM7CisJdTggICAgV3RQOjE7CisJdTggICAgSXNNUzoxOwogfTsKIAogLyogU0QgQmxvY2sgTGVuZ3RoICovCkBAIC0xODQsMzggKzE4NCwzOCBAQAogCiAJLyogLS0tLS0gU0QgQ29udHJvbCBEYXRhIC0tLS0tLS0tLS0tLS0tLS0gKi8KIAkvKiBTRF9SRUdJU1RFUiBTRF9SZWdzOyAqLwotCVdPUkQgICAgICAgIFNEX0Jsb2NrX011bHQ7Ci0JQllURSAgICAgICAgU0RfUkVBRF9CTF9MRU47Ci0JV09SRCAgICAgICAgU0RfQ19TSVpFOwotCUJZVEUgICAgICAgIFNEX0NfU0laRV9NVUxUOworCXUxNiAgICAgICAgU0RfQmxvY2tfTXVsdDsKKwl1OCAgICAgICAgU0RfUkVBRF9CTF9MRU47CisJdTE2ICAgICAgICBTRF9DX1NJWkU7CisJdTggICAgICAgIFNEX0NfU0laRV9NVUxUOwogCiAJLyogU0QvTU1DIE5ldyBzcGVjLiAqLwotCUJZVEUgICAgICAgIFNEX1NQRUNfVkVSOwotCUJZVEUgICAgICAgIFNEX0NTRF9WRVI7Ci0JQllURSAgICAgICAgU0QyMF9ISUdIX0NBUEFDSVRZOwotCURXT1JEICAgICAgIEhDX0NfU0laRTsKLQlCWVRFICAgICAgICBNTUNfU1BFQ19WRVI7Ci0JQllURSAgICAgICAgTU1DX0J1c1dpZHRoOwotCUJZVEUgICAgICAgIE1NQ19ISUdIX0NBUEFDSVRZOworCXU4ICAgICAgICBTRF9TUEVDX1ZFUjsKKwl1OCAgICAgICAgU0RfQ1NEX1ZFUjsKKwl1OCAgICAgICAgU0QyMF9ISUdIX0NBUEFDSVRZOworCXUzMiAgICAgICBIQ19DX1NJWkU7CisJdTggICAgICAgIE1NQ19TUEVDX1ZFUjsKKwl1OCAgICAgICAgTU1DX0J1c1dpZHRoOworCXU4ICAgICAgICBNTUNfSElHSF9DQVBBQ0lUWTsKIAogCS8qIC0tLS0tIE1TIENvbnRyb2wgRGF0YSAtLS0tLS0tLS0tLS0tLS0tICovCi0JQk9PTEVBTiAgICAgICAgICAgICBNU19TV1dQOwotCURXT1JEICAgICAgICAgICAgICAgTVNQX1RvdGFsQmxvY2s7CisJYm9vbCAgICAgICAgICAgICBNU19TV1dQOworCXUzMiAgICAgICAgICAgICAgIE1TUF9Ub3RhbEJsb2NrOwogCS8qIE1TX0xpYkNvbnRyb2wgICAgICAgTVNfTGliOyAqLwotCUJPT0xFQU4gICAgICAgICAgICAgTVNfSXNSV1BhZ2U7Ci0JV09SRCAgICAgICAgICAgICAgICBNU19Nb2RlbDsKKwlib29sICAgICAgICAgICAgIE1TX0lzUldQYWdlOworCXUxNiAgICAgICAgICAgICAgICBNU19Nb2RlbDsKIAogCS8qIC0tLS0tIFNNIENvbnRyb2wgRGF0YSAtLS0tLS0tLS0tLS0tLS0tICovCi0JQllURQkJU01fRGV2aWNlSUQ7Ci0JQllURQkJU01fQ2FyZElEOworCXU4CQlTTV9EZXZpY2VJRDsKKwl1OAkJU01fQ2FyZElEOwogCi0JUEJZVEUJCXRlc3RidWY7Ci0JQllURQkJQklOX0ZMQUc7Ci0JRFdPUkQJCWJsX251bTsKKwl1OCAqdGVzdGJ1ZjsKKwl1OAkJQklOX0ZMQUc7CisJdTMyCQlibF9udW07CiAJaW50CQlTcmJTdGF0dXM7CiAKIAkvKiAtLS0tLS1Qb3dlciBNYW5hZ2VybWVudCAtLS0tLS0tLS0tLS0tLS0gKi8KLQlCT09MRUFOICAgICAgICAgUG93ZXJfSXNSZXN1bTsKKwlib29sICAgICAgICAgUG93ZXJfSXNSZXN1bTsKIH07CiAKIC8qIENvbnZlcnQgYmV0d2VlbiB1c19kYXRhIGFuZCB0aGUgY29ycmVzcG9uZGluZyBTY3NpX0hvc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9hdWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKaW5kZXggYTkyZTIxZi4uMTcxZDgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKQEAgLTI0LDggKzI0LDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKLQkJCSAgICAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGxpbmU2LT5pZmNkZXYsCisJCQkgICBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCmluZGV4IGY4MzE2YjcuLjBlZGE1MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYwpAQCAtMTU3LDYgKzE1Nyw3IEBACiAJCSAgIGNvcHkgdHdvIHNlcGFyYXRlIGNodW5rcy4KIAkJICovCiAJCWludCBsZW47CisKIAkJbGVuID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBsaW5lNnBjbS0+cG9zX2luX2RvbmU7CiAKIAkJaWYgKGxlbiA+IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYwppbmRleCA3YTZkODVlLi43N2YxYjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jCkBAIC01NywyOCArNTcsMzIgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGxpbmU2X2lkX3RhYmxlKTsKIAorI2RlZmluZSBMNlBST1AoZGV2X2JpdCwgZGV2X2lkLCBkZXZfbmFtZSwgZGV2X2NhcClcCisJey5kZXZpY2VfYml0ID0gTElORTZfQklUXyMjZGV2X2JpdCwgLmlkID0gZGV2X2lkLFwKKwkgLm5hbWUgPSBkZXZfbmFtZSwgLmNhcGFiaWxpdGllcyA9IExJTkU2X0JJVF8jI2Rldl9jYXB9CisKIC8qICpJTkRFTlQtT0ZGKiAqLwotc3RhdGljIHN0cnVjdCBsaW5lNl9wcm9wZXJ0aWVzIGxpbmU2X3Byb3BlcnRpZXNfdGFibGVbXSA9IHsKLQl7IExJTkU2X0JJVF9CQVNTUE9EWFQsICAgICAiQmFzc1BPRHh0IiwgICAgICJCYXNzUE9EeHQiLCAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfQkFTU1BPRFhUTElWRSwgIkJhc3NQT0R4dExpdmUiLCAiQmFzc1BPRHh0IExpdmUiLCAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX0JBU1NQT0RYVFBSTywgICJCYXNzUE9EeHRQcm8iLCAgIkJhc3NQT0R4dCBQcm8iLCAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9HVUlUQVJQT1JULCAgICAiR3VpdGFyUG9ydCIsICAgICJHdWl0YXJQb3J0IiwgICAgICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9DS0VUUE9ELCAgICAgIlBvY2tldFBPRCIsICAgICAiUG9ja2V0IFBPRCIsICAgICAgIExJTkU2X0JJVF9DT05UUk9MICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1BPREhEMzAwLCAgICAgICJQT0RIRDMwMCIsICAgICAgIlBPRCBIRDMwMCIsICAgICAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9QT0RIRDQwMCwgICAgICAiUE9ESEQ0MDAiLCAgICAgICJQT0QgSEQ0MDAiLCAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfUE9ESEQ1MDAsICAgICAgIlBPREhENTAwIiwgICAgICAiUE9EIEhENTAwIiwgICAgICAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX1BPRFNUVURJT19HWCwgICJQT0RTdHVkaW9HWCIsICAgIlBPRCBTdHVkaW8gR1giLCAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9QT0RTVFVESU9fVVgxLCAiUE9EU3R1ZGlvVVgxIiwgICJQT0QgU3R1ZGlvIFVYMSIsICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9EU1RVRElPX1VYMiwgIlBPRFN0dWRpb1VYMiIsICAiUE9EIFN0dWRpbyBVWDIiLCAgIExJTkU2X0JJVF9QQ00gICAgICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1BPRFgzLCAgICAgICAgICJQT0RYMyIsICAgICAgICAgIlBPRCBYMyIsICAgICAgICAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9QT0RYM0xJVkUsICAgICAiUE9EWDNMaXZlIiwgICAgICJQT0QgWDMgTGl2ZSIsICAgICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfUE9EWFQsICAgICAgICAgIlBPRHh0IiwgICAgICAgICAiUE9EeHQiLCAgICAgICAgICAgIExJTkU2X0JJVF9DT05UUk9MX1BDTV9IV01PTiB9LAotCXsgTElORTZfQklUX1BPRFhUTElWRSwgICAgICJQT0R4dExpdmUiLCAgICAgIlBPRHh0IExpdmUiLCAgICAgICBMSU5FNl9CSVRfQ09OVFJPTF9QQ01fSFdNT04gfSwKLQl7IExJTkU2X0JJVF9QT0RYVFBSTywgICAgICAiUE9EeHRQcm8iLCAgICAgICJQT0R4dCBQcm8iLCAgICAgICAgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OIH0sCi0JeyBMSU5FNl9CSVRfVE9ORVBPUlRfR1gsICAgIlRvbmVQb3J0R1giLCAgICAiVG9uZVBvcnQgR1giLCAgICAgIExJTkU2X0JJVF9QQ00gICAgICAgICAgICAgICB9LAotCXsgTElORTZfQklUX1RPTkVQT1JUX1VYMSwgICJUb25lUG9ydFVYMSIsICAgIlRvbmVQb3J0IFVYMSIsICAgICBMSU5FNl9CSVRfUENNICAgICAgICAgICAgICAgfSwKLQl7IExJTkU2X0JJVF9UT05FUE9SVF9VWDIsICAiVG9uZVBvcnRVWDIiLCAgICJUb25lUG9ydCBVWDIiLCAgICAgTElORTZfQklUX1BDTSAgICAgICAgICAgICAgIH0sCi0JeyBMSU5FNl9CSVRfVkFSSUFYLCAgICAgICAgIlZhcmlheCIsICAgICAgICAiVmFyaWF4IFdvcmtiZW5jaCIsIExJTkU2X0JJVF9DT05UUk9MICAgICAgICAgICB9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBsaW5lNl9wcm9wZXJ0aWVzIGxpbmU2X3Byb3BlcnRpZXNfdGFibGVbXSA9IHsKKwlMNlBST1AoQkFTU1BPRFhULCAgICAgIkJhc3NQT0R4dCIsICAgICAiQmFzc1BPRHh0IiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoQkFTU1BPRFhUTElWRSwgIkJhc3NQT0R4dExpdmUiLCAiQmFzc1BPRHh0IExpdmUiLCAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoQkFTU1BPRFhUUFJPLCAgIkJhc3NQT0R4dFBybyIsICAiQmFzc1BPRHh0IFBybyIsICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoR1VJVEFSUE9SVCwgICAgIkd1aXRhclBvcnQiLCAgICAiR3VpdGFyUG9ydCIsICAgICAgIFBDTSksCisJTDZQUk9QKFBPQ0tFVFBPRCwgICAgICJQb2NrZXRQT0QiLCAgICAgIlBvY2tldCBQT0QiLCAgICAgICBDT05UUk9MKSwKKwlMNlBST1AoUE9ESEQzMDAsICAgICAgIlBPREhEMzAwIiwgICAgICAiUE9EIEhEMzAwIiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoUE9ESEQ0MDAsICAgICAgIlBPREhENDAwIiwgICAgICAiUE9EIEhENDAwIiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoUE9ESEQ1MDAsICAgICAgIlBPREhENTAwIiwgICAgICAiUE9EIEhENTAwIiwgICAgICAgIENUUkxfUENNX0hXKSwKKwlMNlBST1AoUE9EU1RVRElPX0dYLCAgIlBPRFN0dWRpb0dYIiwgICAiUE9EIFN0dWRpbyBHWCIsICAgIFBDTSksCisJTDZQUk9QKFBPRFNUVURJT19VWDEsICJQT0RTdHVkaW9VWDEiLCAgIlBPRCBTdHVkaW8gVVgxIiwgICBQQ00pLAorCUw2UFJPUChQT0RTVFVESU9fVVgyLCAiUE9EU3R1ZGlvVVgyIiwgICJQT0QgU3R1ZGlvIFVYMiIsICAgUENNKSwKKwlMNlBST1AoUE9EWDMsICAgICAgICAgIlBPRFgzIiwgICAgICAgICAiUE9EIFgzIiwgICAgICAgICAgIFBDTSksCisJTDZQUk9QKFBPRFgzTElWRSwgICAgICJQT0RYM0xpdmUiLCAgICAgIlBPRCBYMyBMaXZlIiwgICAgICBQQ00pLAorCUw2UFJPUChQT0RYVCwgICAgICAgICAiUE9EeHQiLCAgICAgICAgICJQT0R4dCIsICAgICAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChQT0RYVExJVkUsICAgICAiUE9EeHRMaXZlIiwgICAgICJQT0R4dCBMaXZlIiwgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChQT0RYVFBSTywgICAgICAiUE9EeHRQcm8iLCAgICAgICJQT0R4dCBQcm8iLCAgICAgICAgQ1RSTF9QQ01fSFcpLAorCUw2UFJPUChUT05FUE9SVF9HWCwgICAiVG9uZVBvcnRHWCIsICAgICJUb25lUG9ydCBHWCIsICAgICAgUENNKSwKKwlMNlBST1AoVE9ORVBPUlRfVVgxLCAgIlRvbmVQb3J0VVgxIiwgICAiVG9uZVBvcnQgVVgxIiwgICAgIFBDTSksCisJTDZQUk9QKFRPTkVQT1JUX1VYMiwgICJUb25lUG9ydFVYMiIsICAgIlRvbmVQb3J0IFVYMiIsICAgICBQQ00pLAorCUw2UFJPUChWQVJJQVgsICAgICAgICAiVmFyaWF4IiwgICAgICAgICJWYXJpYXggV29ya2JlbmNoIiwgQ09OVFJPTCksCiB9OwogLyogKklOREVOVC1PTiogKi8KIApAQCAtMTUyLDEwICsxNTYsMTAgQEAKIAkJaW50IHJldHZhbDsKIAogCQlyZXR2YWwgPSB1c2JfaW50ZXJydXB0X21zZyhsaW5lNi0+dXNiZGV2LAotCQkJCQkgICB1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAotCQkJCQkJCSAgbGluZTYtPmVwX2NvbnRyb2xfd3JpdGUpLAotCQkJCQkgICAoY2hhciAqKWZyYWdfYnVmLCBmcmFnX3NpemUsCi0JCQkJCSAgICZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOworCQkJCQl1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAorCQkJCQkJbGluZTYtPmVwX2NvbnRyb2xfd3JpdGUpLAorCQkJCQkoY2hhciAqKWZyYWdfYnVmLCBmcmFnX3NpemUsCisJCQkJCSZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOwogCiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIobGluZTYtPmlmY2RldiwKQEAgLTIxNyw3ICsyMjEsNyBAQAogCVNldHVwIGFuZCBzdGFydCB0aW1lci4KICovCiB2b2lkIGxpbmU2X3N0YXJ0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgaW50IG1zZWNzLAotCQkgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSAodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgZGF0YSkKKwkJICAgICAgIHZvaWQgKCpmdW5jdGlvbikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzZXR1cF90aW1lcih0aW1lciwgZnVuY3Rpb24sIGRhdGEpOwogCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIG1zZWNzICogSFogLyAxMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5oCmluZGV4IDM0YWU5NWUuLjE2ZTNmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmgKQEAgLTIwNCw3ICsyMDQsNyBAQAogZXh0ZXJuIHNzaXplX3QgbGluZTZfc2V0X3JhdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBleHRlcm4gdm9pZCBsaW5lNl9zdGFydF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIHVuc2lnbmVkIGludCBtc2VjcywKLQkJCSAgICAgIHZvaWQgKCpmdW5jdGlvbikgKHVuc2lnbmVkIGxvbmcpLAorCQkJICAgICAgdm9pZCAoKmZ1bmN0aW9uKSh1bnNpZ25lZCBsb25nKSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4gaW50IGxpbmU2X3RyYW5zbWl0X3BhcmFtZXRlcihzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiwgaW50IHBhcmFtLAogCQkJCSAgICB1OCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYwppbmRleCAzZjZkNzhjLi4wMjM0NWZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAJc3RydWN0IHNuZF9saW5lNl9taWRpICpsaW5lNm1pZGkgPSBsaW5lNi0+bGluZTZtaWRpOwogCXN0cnVjdCBtaWRpX2J1ZmZlciAqbWIgPSAmbGluZTZtaWRpLT5taWRpYnVmX291dDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgY2h1bmtbbGluZTYtPm1heF9wYWNrZXRfc2l6ZV07CisJdW5zaWduZWQgY2hhciBjaHVua1tMSU5FNl9GQUxMQkFDS19NQVhQQUNLRVRTSVpFXTsKIAlpbnQgcmVxLCBkb25lOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpbmU2LT5saW5lNm1pZGktPm1pZGlfdHJhbnNtaXRfbG9jaywgZmxhZ3MpOwpAQCAtNjQsNyArNjQsOCBAQAogCX0KIAogCWZvciAoOzspIHsKLQkJZG9uZSA9IGxpbmU2X21pZGlidWZfcmVhZChtYiwgY2h1bmssIGxpbmU2LT5tYXhfcGFja2V0X3NpemUpOworCQlkb25lID0gbGluZTZfbWlkaWJ1Zl9yZWFkKG1iLCBjaHVuaywKKwkJCQkJICBMSU5FNl9GQUxMQkFDS19NQVhQQUNLRVRTSVpFKTsKIAogCQlpZiAoZG9uZSA9PSAwKQogCQkJYnJlYWs7CkBAIC0zMDcsOCArMzA4LDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYobGluZTYtPmNhcmQsIGxpbmU2LT5pZmNkZXYpOwotCiAJZXJyID0gc25kX2xpbmU2X25ld19taWRpKGxpbmU2bWlkaSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGNtLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGNtLmMKaW5kZXggZGY4MzMxYi4uNjYxMDgwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYwpAQCAtNTAxLDggKzUwMSw2IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGxpbmU2LT5jYXJkLCBsaW5lNi0+aWZjZGV2KTsKLQogCWVyciA9IHNuZF9saW5lNl9uZXdfcGNtKGxpbmU2cGNtKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi91c2JkZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdXNiZGVmcy5oCmluZGV4IDkwY2FkZGQuLjJkMWNjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi91c2JkZWZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3VzYmRlZnMuaApAQCAtOTEsOSArOTEsOSBAQAogCUxJTkU2X0JJVFNfUE9EWFRBTEwgPSBMSU5FNl9CSVRfUE9EWFQgfCBMSU5FNl9CSVRfUE9EWFRMSVZFIHwKIAkJCSAgICAgIExJTkU2X0JJVF9QT0RYVFBSTywKIAlMSU5FNl9CSVRTX1BPRFgzQUxMID0gTElORTZfQklUX1BPRFgzIHwgTElORTZfQklUX1BPRFgzTElWRSwKLQlMSU5FNl9CSVRTX1BPREhEQUxMID0gCUxJTkU2X0JJVF9QT0RIRDMwMCB8Ci0JCQkJTElORTZfQklUX1BPREhENDAwIHwKLQkJCQlMSU5FNl9CSVRfUE9ESEQ1MDAsCisJTElORTZfQklUU19QT0RIREFMTCA9IExJTkU2X0JJVF9QT0RIRDMwMCB8CisJCQkgICAgICBMSU5FNl9CSVRfUE9ESEQ0MDAgfAorCQkJICAgICAgTElORTZfQklUX1BPREhENTAwLAogCUxJTkU2X0JJVFNfQkFTU1BPRFhUQUxMCT0gTElORTZfQklUX0JBU1NQT0RYVCB8CiAJCQkJICBMSU5FNl9CSVRfQkFTU1BPRFhUTElWRSB8CiAJCQkJICBMSU5FNl9CSVRfQkFTU1BPRFhUUFJPCkBAIC0xMDYsNyArMTA2LDcgQEAKIC8qIGRldmljZSBzdXBwb3J0IGhhcmR3YXJlIG1vbml0b3JpbmcgKi8KICNkZWZpbmUgTElORTZfQklUX0hXTU9OICgxIDw8IDIpCiAKLSNkZWZpbmUgTElORTZfQklUX0NPTlRST0xfUENNX0hXTU9OCShMSU5FNl9CSVRfQ09OVFJPTCB8CVwKKyNkZWZpbmUgTElORTZfQklUX0NUUkxfUENNX0hXCShMSU5FNl9CSVRfQ09OVFJPTCB8CVwKIAkJCQkJIExJTkU2X0JJVF9QQ00gfAlcCiAJCQkJCSBMSU5FNl9CSVRfSFdNT04pCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvY3VycHJvYy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9jdXJwcm9jLmgKaW5kZXggNTA3ZDE2Yi4uOGZkNDdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9jdXJwcm9jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9jdXJwcm9jLmgKQEAgLTQ0LDEzICs0NCw2IEBACiAjZGVmaW5lIF9fTElCQ0ZTX0NVUlBST0NfSF9fCiAKIC8qCi0gKiBQb3J0YWJsZSBBUEkgdG8gYWNjZXNzIGNvbW1vbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgImN1cnJlbnQiIFVOSVggcHJvY2Vzcy4KLSAqCi0gKiBJbXBsZW1lbnRlZCBpbiBwb3J0YWxzL2luY2x1ZGUvbGliY2ZzLzxvcz4vCi0gKi8KLWludCAgICBjZnNfY3VycHJvY19ncm91cHNfbnIodm9pZCk7Ci0KLS8qCiAgKiBQbHVzLCBwbGF0Zm9ybS1zcGVjaWZpYyBjb25zdGFudAogICoKICAqIENGU19DVVJQUk9DX0NPTU1fTUFYLApAQCAtOTEsOCArODQsNiBAQAogdm9pZCBjZnNfY2FwX2xvd2VyKGNmc19jYXBfdCBjYXApOwogaW50IGNmc19jYXBfcmFpc2VkKGNmc19jYXBfdCBjYXApOwogY2ZzX2NhcF90IGNmc19jdXJwcm9jX2NhcF9wYWNrKHZvaWQpOwotdm9pZCBjZnNfY3VycHJvY19jYXBfdW5wYWNrKGNmc19jYXBfdCBjYXApOwotaW50IGNmc19jYXBhYmxlKGNmc19jYXBfdCBjYXApOwogCiAvKiBfX0xJQkNGU19DVVJQUk9DX0hfXyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmgKaW5kZXggOWQ1ZWUxYS4uZTVkNWRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaGFzaC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2hhc2guaApAQCAtNjUsOCArNjUsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogCi0jZGVmaW5lIGNmc19oYXNoX2xvbmcodmFsLCBiaXRzKSAgICBoYXNoX2xvbmcodmFsLCBiaXRzKQotCiAvKiogZGlzYWJsZSBkZWJ1ZyAqLwogI2RlZmluZSBDRlNfSEFTSF9ERUJVR19OT05FCSAwCiAvKiogcmVjb3JkIGhhc2ggZGVwdGggYW5kIG91dHB1dCB0byBjb25zb2xlIHdoZW4gaXQncyB0b28gZGVlcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19pb2N0bC5oCmluZGV4IDc0ZGRhNTcuLjQ5YmE2MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaW9jdGwuaApAQCAtMjExLDEwICsyMTEsMTAgQEAKIH0KIAogCi1leHRlcm4gaW50IGxpYmNmc19yZWdpc3Rlcl9pb2N0bChzdHJ1Y3QgbGliY2ZzX2lvY3RsX2hhbmRsZXIgKmhhbmQpOwotZXh0ZXJuIGludCBsaWJjZnNfZGVyZWdpc3Rlcl9pb2N0bChzdHJ1Y3QgbGliY2ZzX2lvY3RsX2hhbmRsZXIgKmhhbmQpOwotZXh0ZXJuIGludCBsaWJjZnNfaW9jdGxfZ2V0ZGF0YShjaGFyICpidWYsIGNoYXIgKmVuZCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgbGliY2ZzX2lvY3RsX3BvcGRhdGEodm9pZCAqYXJnLCB2b2lkICpidWYsIGludCBzaXplKTsKK2ludCBsaWJjZnNfcmVnaXN0ZXJfaW9jdGwoc3RydWN0IGxpYmNmc19pb2N0bF9oYW5kbGVyICpoYW5kKTsKK2ludCBsaWJjZnNfZGVyZWdpc3Rlcl9pb2N0bChzdHJ1Y3QgbGliY2ZzX2lvY3RsX2hhbmRsZXIgKmhhbmQpOworaW50IGxpYmNmc19pb2N0bF9nZXRkYXRhKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCB2b2lkICphcmcpOworaW50IGxpYmNmc19pb2N0bF9wb3BkYXRhKHZvaWQgKmFyZywgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CiAKIAogI2VuZGlmIC8qIF9fTElCQ0ZTX0lPQ1RMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpbS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpbS5oCmluZGV4IGU2ZTQxN2EuLjdjZjM0YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaW0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcmltLmgKQEAgLTQxLDE5ICs0MSwxMCBAQAogI2RlZmluZSBfX0xJQkNGU19QUklNX0hfXwogCiAvKgotICogU2NoZWR1bGUKLSAqLwotdm9pZCBjZnNfcGF1c2UoY2ZzX2R1cmF0aW9uX3QgdGlja3MpOwotCi0vKgogICogVGltZXIKICAqLwogdHlwZWRlZiAgdm9pZCAoY2ZzX3RpbWVyX2Z1bmNfdCkodWxvbmdfcHRyX3QpOwotdm9pZCBzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUobG9uZywgaW50NjRfdCk7CiAKLXZvaWQgaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCh3YWl0X3F1ZXVlX3QgKmxpbmspOwotaW50NjRfdCB3YWl0cV90aW1lZHdhaXQod2FpdF9xdWV1ZV90ICosIGxvbmcsIGludDY0X3QpOwotdm9pZCB3YWl0cV93YWl0KHdhaXRfcXVldWVfdCAqLCBsb25nKTsKIHZvaWQgYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlX2hlYWQod2FpdF9xdWV1ZV9oZWFkX3QgKiwgd2FpdF9xdWV1ZV90ICopOwogCiB2b2lkIGNmc19pbml0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3N0cmluZy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfc3RyaW5nLmgKaW5kZXggYTZiYWM5Yy4uNTA5ZGMxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfc3RyaW5nLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfc3RyaW5nLmgKQEAgLTQ5LDE4ICs0OSw2IEBACiAvKiBDb252ZXJ0IGEgdGV4dCBzdHJpbmcgdG8gYSBiaXRtYXNrICovCiBpbnQgY2ZzX3N0cjJtYXNrKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqKCpiaXQyc3RyKShpbnQgYml0KSwKIAkJIGludCAqb2xkbWFzaywgaW50IG1pbm1hc2ssIGludCBhbGxtYXNrKTsKLQotLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBjb3B5IGFuIGV4aXN0aW5nIHN0cmluZy4KLSAqIE11c3QgZnJlZSB3aXRoIGtmcmVlKCkuCi0gKi8KLWNoYXIgKmNmc19zdHJkdXAoY29uc3QgY2hhciAqc3RyLCB1X2ludDMyX3QgZmxhZ3MpOwotCi0vKiBzYWZlIHZzbnByaW50ZiAqLwotaW50IGNmc192c25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOwotCi0vKiBzYWZlIHNucHJpbnRmICovCi1pbnQgY2ZzX3NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLQogLyogdHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSBjaGFyYWN0ZXJzICovCiBjaGFyICpjZnNfZmlyc3RzdHIoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSk7CiAKQEAgLTkwLDI3ICs3OCwxMCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJZWxfZXhwcnM7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludAotY2ZzX2lzd2hpdGUoY2hhciBjKQotewotCXN3aXRjaCAoYykgewotCWNhc2UgJyAnOgotCWNhc2UgJ1x0JzoKLQljYXNlICdcbic6Ci0JY2FzZSAnXHInOgotCQlyZXR1cm4gMTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIGNoYXIgKmNmc190cmltd2hpdGUoY2hhciAqc3RyKTsKIGludCBjZnNfZ2V0dG9rKHN0cnVjdCBjZnNfbHN0ciAqbmV4dCwgY2hhciBkZWxpbSwgc3RydWN0IGNmc19sc3RyICpyZXMpOwogaW50IGNmc19zdHIybnVtX2NoZWNrKGNoYXIgKnN0ciwgaW50IG5vYiwgdW5zaWduZWQgKm51bSwKIAkJICAgICAgdW5zaWduZWQgbWluLCB1bnNpZ25lZCBtYXgpOwotaW50IGNmc19yYW5nZV9leHByX3BhcnNlKHN0cnVjdCBjZnNfbHN0ciAqc3JjLCB1bnNpZ25lZCBtaW4sIHVuc2lnbmVkIG1heCwKLQkJCSBpbnQgc2luZ2xlX3Rvaywgc3RydWN0IGNmc19yYW5nZV9leHByICoqZXhwcik7CiBpbnQgY2ZzX2V4cHJfbGlzdF9tYXRjaChfX3UzMiB2YWx1ZSwgc3RydWN0IGNmc19leHByX2xpc3QgKmV4cHJfbGlzdCk7CiBpbnQgY2ZzX2V4cHJfbGlzdF92YWx1ZXMoc3RydWN0IGNmc19leHByX2xpc3QgKmV4cHJfbGlzdCwKIAkJCSBpbnQgbWF4LCBfX3UzMiAqKnZhbHVlcyk7CkBAIC0xMjQsNyArOTUsNiBAQAogfQogCiB2b2lkIGNmc19leHByX2xpc3RfZnJlZShzdHJ1Y3QgY2ZzX2V4cHJfbGlzdCAqZXhwcl9saXN0KTsKLXZvaWQgY2ZzX2V4cHJfbGlzdF9wcmludChzdHJ1Y3QgY2ZzX2V4cHJfbGlzdCAqZXhwcl9saXN0KTsKIGludCBjZnNfZXhwcl9saXN0X3BhcnNlKGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgbWluLCB1bnNpZ25lZCBtYXgsCiAJCQlzdHJ1Y3QgY2ZzX2V4cHJfbGlzdCAqKmVscHApOwogdm9pZCBjZnNfZXhwcl9saXN0X2ZyZWVfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItbG5ldC5oCmluZGV4IDNhYzJiYjUuLjg1NmZjZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaApAQCAtNjI4LDcgKzYyOCw3IEBACiBzdGF0aWMgaW5saW5lIGludAogbG5ldF9uaWQycGVlcmhhc2gobG5ldF9uaWRfdCBuaWQpCiB7Ci0JcmV0dXJuIGNmc19oYXNoX2xvbmcobmlkLCBMTkVUX1BFRVJfSEFTSF9CSVRTKTsKKwlyZXR1cm4gaGFzaF9sb25nKG5pZCwgTE5FVF9QRUVSX0hBU0hfQklUUyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi10eXBlcy5oCmluZGV4IGRkOGVkY2YuLjFjMTNlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi10eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi10eXBlcy5oCkBAIC0yODIsMTYgKzI4MiwxNCBAQAogI2RlZmluZSBMTkVUX01EX0ZMQUdfQVVUT19VTkxJTksgICAgICAoMSA8PCAxKQogCiAjaWZkZWYgTE5FVF9VU0VfTElCX0ZSRUVMSVNUCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogCXZvaWQJCSAgKmZsX29ianM7CSAgLyogc2luZ2xlIGNvbnRpZ3VvdXMgYXJyYXkgb2Ygb2JqZWN0cyAqLwogCWludAkJICAgIGZsX25vYmpzOwkgLyogdGhlIG51bWJlciBvZiB0aGVtICovCiAJaW50CQkgICAgZmxfb2Jqc2l6ZTsgICAgICAgLyogdGhlIHNpemUgKGluY2x1ZGluZyBvdmVyaGVhZCkgb2YgZWFjaCBvZiB0aGVtICovCiAJc3RydWN0IGxpc3RfaGVhZAkgICAgIGZsX2xpc3Q7CSAgLyogd2hlcmUgdGhleSBhcmUgZW5xdWV1ZWQgKi8KIH0gbG5ldF9mcmVlbGlzdF90OwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogCXN0cnVjdCBsaXN0X2hlYWQJICAgICBmb19saXN0OwkgICAgIC8qIGVucXVldWUgb24gZmxfbGlzdCAqLwogCXZvaWQJCSAgKmZvX2NvbnRlbnRzOwkgLyogYWxpZ25lZCBjb250ZW50cyAqLwogfSBsbmV0X2ZyZWVvYmpfdDsKQEAgLTMxMiw4ICszMTAsNyBAQAogCiBzdHJ1Y3QgbG5ldF9uaTsJCQkJICAvKiBmb3J3YXJkIHJlZiAqLwogCi10eXBlZGVmIHN0cnVjdCBsbmV0X2xuZAotewordHlwZWRlZiBzdHJ1Y3QgbG5ldF9sbmQgewogCS8qIGZpZWxkcyBtYW5hZ2VkIGJ5IHBvcnRhbHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICBsbmRfbGlzdDsJICAgICAvKiBzdGFzaCBpbiB0aGUgTE5EIHRhYmxlICovCiAJaW50CQkgICBsbmRfcmVmY291bnQ7CSAvKiAjIGFjdGl2ZSBpbnN0YW5jZXMgKi8KQEAgLTMyMSw4ICszMTgsOCBAQAogCS8qIGZpZWxkcyBpbml0aWFsaXNlZCBieSB0aGUgTE5EICovCiAJdW5zaWduZWQgaW50CSAgbG5kX3R5cGU7CiAKLQlpbnQgICgqbG5kX3N0YXJ0dXApIChzdHJ1Y3QgbG5ldF9uaSAqbmkpOwotCXZvaWQgKCpsbmRfc2h1dGRvd24pIChzdHJ1Y3QgbG5ldF9uaSAqbmkpOworCWludCAgKCpsbmRfc3RhcnR1cCkoc3RydWN0IGxuZXRfbmkgKm5pKTsKKwl2b2lkICgqbG5kX3NodXRkb3duKShzdHJ1Y3QgbG5ldF9uaSAqbmkpOwogCWludCAgKCpsbmRfY3RsKShzdHJ1Y3QgbG5ldF9uaSAqbmksIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiAKIAkvKiBJbiBkYXRhIG1vdmVtZW50IEFQSXMgYmVsb3csIHBheWxvYWQgYnVmZmVycyBhcmUgZGVzY3JpYmVkIGFzIGEgc2V0CkBAIC02NjgsOCArNjY1LDcgQEAKICNkZWZpbmUgTE5FVF9SQ19TVEFURV9SVU5OSU5HCQkxCS8qIHN0YXJ0ZWQgdXAgT0sgKi8KICNkZWZpbmUgTE5FVF9SQ19TVEFURV9TVE9QUElORwkJMgkvKiB0ZWxsaW5nIHRocmVhZCB0byBzdG9wICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAJLyogQ1BVIHBhcnRpdGlvbiB0YWJsZSBvZiBMTmV0ICovCiAJc3RydWN0IGNmc19jcHRfdGFibGUJCSpsbl9jcHRfdGFibGU7CiAJLyogbnVtYmVyIG9mIENQVHMgaW4gbG5fY3B0X3RhYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMKaW5kZXggNjQ0YTAwMC4uMDA2MWM4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgIm8yaWJsbmQuaCIKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KIAotbG5kX3QgdGhlX28yaWJsbmQgPSB7CitzdGF0aWMgbG5kX3QgdGhlX28yaWJsbmQgPSB7CiAJLmxuZF90eXBlICAgICAgID0gTzJJQkxORCwKIAkubG5kX3N0YXJ0dXAgICAgPSBraWJsbmRfc3RhcnR1cCwKIAkubG5kX3NodXRkb3duICAgPSBraWJsbmRfc2h1dGRvd24sCkBAIC01Myw4ICs1Myw4IEBACiAKIGtpYl9kYXRhX3QJICAgICAga2libG5kX2RhdGE7CiAKLV9fdTMyCi1raWJsbmRfY2tzdW0gKHZvaWQgKnB0ciwgaW50IG5vYikKK3N0YXRpYyBfX3UzMgora2libG5kX2Nrc3VtKHZvaWQgKnB0ciwgaW50IG5vYikKIHsKIAljaGFyICAqYyAgPSBwdHI7CiAJX191MzIgIHN1bSA9IDA7CkBAIC00MjksOCArNDI5LDggQEAKIAlraWJsbmRfcGVlcl9kZWNyZWYocGVlcik7CiB9CiAKLWludAota2libG5kX2dldF9wZWVyX2luZm8gKGxuZXRfbmlfdCAqbmksIGludCBpbmRleCwKK3N0YXRpYyBpbnQKK2tpYmxuZF9nZXRfcGVlcl9pbmZvKGxuZXRfbmlfdCAqbmksIGludCBpbmRleCwKIAkJICAgICAgbG5ldF9uaWRfdCAqbmlkcCwgaW50ICpjb3VudCkKIHsKIAlraWJfcGVlcl90CSAgICAqcGVlcjsKQEAgLTQ2OCw4ICs0NjgsOCBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi12b2lkCi1raWJsbmRfZGVsX3BlZXJfbG9ja2VkIChraWJfcGVlcl90ICpwZWVyKQorc3RhdGljIHZvaWQKK2tpYmxuZF9kZWxfcGVlcl9sb2NrZWQoa2liX3BlZXJfdCAqcGVlcikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICpjdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgKmNueHQ7CkBAIC00ODksOCArNDg5LDggQEAKIAkgKiBsYXN0IHJlZiBvbiBpdC4gKi8KIH0KIAotaW50Ci1raWJsbmRfZGVsX3BlZXIgKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQorc3RhdGljIGludAora2libG5kX2RlbF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQogewogCUxJU1RfSEVBRAkgKHpvbWJpZXMpOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpwdG1wOwpAQCAtNTQzLDggKzU0Myw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1raWJfY29ubl90ICoKLWtpYmxuZF9nZXRfY29ubl9ieV9pZHggKGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKK3N0YXRpYyBraWJfY29ubl90ICoKK2tpYmxuZF9nZXRfY29ubl9ieV9pZHgobG5ldF9uaV90ICpuaSwgaW50IGluZGV4KQogewogCWtpYl9wZWVyX3QJICAgICpwZWVyOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpwdG1wOwpAQCAtNTg0LDc0ICs1ODQsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkCi1raWJsbmRfZGVidWdfcnggKGtpYl9yeF90ICpyeCkKLXsKLQlDREVCVUcoRF9DT05TT0xFLCAiICAgICAgJXAgc3RhdHVzICVkIG1zZ190eXBlICV4IGNyZWQgJWRcbiIsCi0JICAgICAgIHJ4LCByeC0+cnhfc3RhdHVzLCByeC0+cnhfbXNnLT5pYm1fdHlwZSwKLQkgICAgICAgcngtPnJ4X21zZy0+aWJtX2NyZWRpdHMpOwotfQotCi12b2lkCi1raWJsbmRfZGVidWdfdHggKGtpYl90eF90ICp0eCkKLXsKLQlDREVCVUcoRF9DT05TT0xFLCAiICAgICAgJXAgc25kICVkIHEgJWQgdyAlZCByYyAlZCBkbCAlbHggIgotCSAgICAgICAiY29va2llICJMUFg2NCIgbXNnICVzJXMgdHlwZSAleCBjcmVkICVkXG4iLAotCSAgICAgICB0eCwgdHgtPnR4X3NlbmRpbmcsIHR4LT50eF9xdWV1ZWQsIHR4LT50eF93YWl0aW5nLAotCSAgICAgICB0eC0+dHhfc3RhdHVzLCB0eC0+dHhfZGVhZGxpbmUsIHR4LT50eF9jb29raWUsCi0JICAgICAgIHR4LT50eF9sbnRtc2dbMF0gPT0gTlVMTCA/ICItIiA6ICIhIiwKLQkgICAgICAgdHgtPnR4X2xudG1zZ1sxXSA9PSBOVUxMID8gIi0iIDogIiEiLAotCSAgICAgICB0eC0+dHhfbXNnLT5pYm1fdHlwZSwgdHgtPnR4X21zZy0+aWJtX2NyZWRpdHMpOwotfQotCi12b2lkCi1raWJsbmRfZGVidWdfY29ubiAoa2liX2Nvbm5fdCAqY29ubikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7Ci0JaW50CQlpOwotCi0Jc3Bpbl9sb2NrKCZjb25uLT5pYmNfbG9jayk7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiY29ublslZF0gJXAgW3ZlcnNpb24gJXhdIC0+ICVzOiBcbiIsCi0JICAgICAgIGF0b21pY19yZWFkKCZjb25uLT5pYmNfcmVmY291bnQpLCBjb25uLAotCSAgICAgICBjb25uLT5pYmNfdmVyc2lvbiwgbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpKTsKLQlDREVCVUcoRF9DT05TT0xFLCAiICAgc3RhdGUgJWQgbnBvc3RlZCAlZC8lZCBjcmVkICVkIG9fY3JlZCAlZCByX2NyZWQgJWRcbiIsCi0JICAgICAgIGNvbm4tPmliY19zdGF0ZSwgY29ubi0+aWJjX25vb3BzX3Bvc3RlZCwKLQkgICAgICAgY29ubi0+aWJjX25zZW5kc19wb3N0ZWQsIGNvbm4tPmliY19jcmVkaXRzLAotCSAgICAgICBjb25uLT5pYmNfb3V0c3RhbmRpbmdfY3JlZGl0cywgY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMpOwotCUNERUJVRyhEX0NPTlNPTEUsICIgICBjb21tc19lcnIgJWRcbiIsIGNvbm4tPmliY19jb21tc19lcnJvcik7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiICAgZWFybHlfcnhzOlxuIik7Ci0JbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfZWFybHlfcnhzKQotCQlraWJsbmRfZGVidWdfcngobGlzdF9lbnRyeSh0bXAsIGtpYl9yeF90LCByeF9saXN0KSk7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiICAgdHhfbm9vcHM6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNvbm4tPmliY190eF9ub29wcykKLQkJa2libG5kX2RlYnVnX3R4KGxpc3RfZW50cnkodG1wLCBraWJfdHhfdCwgdHhfbGlzdCkpOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIHR4X3F1ZXVlX25vY3JlZDpcbiIpOwotCWxpc3RfZm9yX2VhY2godG1wLCAmY29ubi0+aWJjX3R4X3F1ZXVlX25vY3JlZCkKLQkJa2libG5kX2RlYnVnX3R4KGxpc3RfZW50cnkodG1wLCBraWJfdHhfdCwgdHhfbGlzdCkpOwotCi0JQ0RFQlVHKERfQ09OU09MRSwgIiAgIHR4X3F1ZXVlX3JzcnZkOlxuIik7Ci0JbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfdHhfcXVldWVfcnNydmQpCi0JCWtpYmxuZF9kZWJ1Z190eChsaXN0X2VudHJ5KHRtcCwga2liX3R4X3QsIHR4X2xpc3QpKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICIgICB0eF9xdWV1ZTpcbiIpOwotCWxpc3RfZm9yX2VhY2godG1wLCAmY29ubi0+aWJjX3R4X3F1ZXVlKQotCQlraWJsbmRfZGVidWdfdHgobGlzdF9lbnRyeSh0bXAsIGtpYl90eF90LCB0eF9saXN0KSk7Ci0KLQlDREVCVUcoRF9DT05TT0xFLCAiICAgYWN0aXZlX3R4czpcbiIpOwotCWxpc3RfZm9yX2VhY2godG1wLCAmY29ubi0+aWJjX2FjdGl2ZV90eHMpCi0JCWtpYmxuZF9kZWJ1Z190eChsaXN0X2VudHJ5KHRtcCwga2liX3R4X3QsIHR4X2xpc3QpKTsKLQotCUNERUJVRyhEX0NPTlNPTEUsICIgICByeHM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgSUJMTkRfUlhfTVNHUyhjb25uLT5pYmNfdmVyc2lvbik7IGkrKykKLQkJa2libG5kX2RlYnVnX3J4KCZjb25uLT5pYmNfcnhzW2ldKTsKLQotCXNwaW5fdW5sb2NrKCZjb25uLT5pYmNfbG9jayk7Ci19Ci0KIGludAoga2libG5kX3RyYW5zbGF0ZV9tdHUoaW50IHZhbHVlKQogewpAQCAtMTAzOSw4ICs5NzEsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotaW50Ci1raWJsbmRfY2xvc2VfbWF0Y2hpbmdfY29ubnMgKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQorc3RhdGljIGludAora2libG5kX2Nsb3NlX21hdGNoaW5nX2Nvbm5zKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQogewogCWtpYl9wZWVyX3QJICAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgKnB0bXA7CkBAIC0xNDQwLDcgKzEzNzIsNyBAQAogCXJldHVybiBtcjsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGtpYmxuZF9kZXN0cm95X2Ztcl9wb29sKGtpYl9mbXJfcG9vbF90ICpwb29sKQogewogCUxBU1NFUlQgKHBvb2wtPmZwb19tYXBfY291bnQgPT0gMCk7CkBAIC0xNDU0LDcgKzEzODYsNyBAQAogCUxJQkNGU19GUkVFKHBvb2wsIHNpemVvZihraWJfZm1yX3Bvb2xfdCkpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAoga2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2xfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCWtpYl9mbXJfcG9vbF90ICpwb29sOwpAQCAtMTQ4MCw3ICsxNDEyLDcgQEAKIAlyZXR1cm4gbWF4KElCTE5EX0ZNUl9QT09MX0ZMVVNILCBzaXplKTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBraWJsbmRfY3JlYXRlX2Ztcl9wb29sKGtpYl9mbXJfcG9vbHNldF90ICpmcHMsIGtpYl9mbXJfcG9vbF90ICoqcHBfZnBvKQogewogCS8qIEZNUiBwb29sIGZvciBSRE1BICovCkBAIC0xNzE5LDcgKzE2NTEsNyBAQAogCXBvb2wtPnBvX3NpemUgICAgID0gc2l6ZTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGtpYmxuZF9kZXN0cm95X3Bvb2xfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCWtpYl9wb29sX3QgKnBvb2w7CkBAIC0yMTkyLDcgKzIxMjQsNyBAQAogCXR4LT50eF9jb29raWUgPSB0cHMtPnRwc19uZXh0X3R4X2Nvb2tpZSArKzsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGtpYmxuZF9uZXRfZmluaV9wb29scyhraWJfbmV0X3QgKm5ldCkKIHsKIAlpbnQJaTsKQEAgLTIyMzQsNyArMjE2Niw3IEBACiAJfQogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGtpYmxuZF9uZXRfaW5pdF9wb29scyhraWJfbmV0X3QgKm5ldCwgX191MzIgKmNwdHMsIGludCBuY3B0cykKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwpAQCAtMjQwOCw3ICsyMzQwLDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGtpYmxuZF9oZGV2X2NsZWFudXBfbXJzKGtpYl9oY2FfZGV2X3QgKmhkZXYpCiB7CiAJaW50ICAgICBpOwpAQCAtMjQ0Miw3ICsyMzc0LDcgQEAKIAlMSUJDRlNfRlJFRShoZGV2LCBzaXplb2YoKmhkZXYpKTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBraWJsbmRfaGRldl9zZXR1cF9tcnMoa2liX2hjYV9kZXZfdCAqaGRldikKIHsKIAlzdHJ1Y3QgaWJfbXIgKm1yOwpAQCAtMjc0Niw3ICsyNjc4LDcgQEAKIAlMSUJDRlNfRlJFRShkZXYsIHNpemVvZigqZGV2KSk7CiB9CiAKLWtpYl9kZXZfdCAqCitzdGF0aWMga2liX2Rldl90ICoKIGtpYmxuZF9jcmVhdGVfZGV2KGNoYXIgKmlmbmFtZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwpAQCAtMjgwMCw3ICsyNzMyLDcgQEAKIAlyZXR1cm4gZGV2OwogfQogCi12b2lkCitzdGF0aWMgdm9pZAoga2libG5kX2Jhc2Vfc2h1dGRvd24odm9pZCkKIHsKIAlzdHJ1Y3Qga2liX3NjaGVkX2luZm8JKnNjaGVkOwpAQCAtMjg0Miw3ICsyNzc0LDggQEAKIAkJCUNERUJVRygoKGkgJiAoLWkpKSA9PSBpKSA/IERfV0FSTklORyA6IERfTkVULCAvKiBwb3dlciBvZiAyPyAqLwogCQkJICAgICAgICJXYWl0aW5nIGZvciAlZCB0aHJlYWRzIHRvIHRlcm1pbmF0ZVxuIiwKIAkJCSAgICAgICBhdG9taWNfcmVhZCgma2libG5kX2RhdGEua2liX250aHJlYWRzKSk7Ci0JCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCQl9CiAKIAkJLyogZmFsbCB0aHJvdWdoICovCkBAIC0yOTAzLDcgKzI4MzYsOCBAQAogCQkJICAgICAgICIlczogd2FpdGluZyBmb3IgJWQgcGVlcnMgdG8gZGlzY29ubmVjdFxuIiwKIAkJCSAgICAgICBsaWJjZnNfbmlkMnN0cihuaS0+bmlfbmlkKSwKIAkJCSAgICAgICBhdG9taWNfcmVhZCgmbmV0LT5pYm5fbnBlZXJzKSk7Ci0JCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCQl9CiAKIAkJa2libG5kX25ldF9maW5pX3Bvb2xzKG5ldCk7CkBAIC0yOTQwLDcgKzI4NzQsNyBAQAogCXJldHVybjsKIH0KIAotaW50CitzdGF0aWMgaW50CiBraWJsbmRfYmFzZV9zdGFydHVwKHZvaWQpCiB7CiAJc3RydWN0IGtpYl9zY2hlZF9pbmZvCSpzY2hlZDsKQEAgLTMwMzAsNyArMjk2NCw3IEBACiAJcmV0dXJuIC1FTkVURE9XTjsKIH0KIAotaW50CitzdGF0aWMgaW50CiBraWJsbmRfc3RhcnRfc2NoZWR1bGVycyhzdHJ1Y3Qga2liX3NjaGVkX2luZm8gKnNjaGVkKQogewogCWludAlyYyA9IDA7CkBAIC0zMDcxLDcgKzMwMDUsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50CitzdGF0aWMgaW50CiBraWJsbmRfZGV2X3N0YXJ0X3RocmVhZHMoa2liX2Rldl90ICpkZXYsIGludCBuZXdkZXYsIF9fdTMyICpjcHRzLCBpbnQgbmNwdHMpCiB7CiAJaW50CWNwdDsKQEAgLTMwOTcsNyArMzAzMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWtpYl9kZXZfdCAqCitzdGF0aWMga2liX2Rldl90ICoKIGtpYmxuZF9kZXZfc2VhcmNoKGNoYXIgKmlmbmFtZSkKIHsKIAlraWJfZGV2X3QJKmFsaWFzID0gTlVMTDsKQEAgLTMyMjYsMTMgKzMxNjAsMTMgQEAKIAlyZXR1cm4gLUVORVRET1dOOwogfQogCi12b2lkIF9fZXhpdAorc3RhdGljIHZvaWQgX19leGl0CiBraWJsbmRfbW9kdWxlX2ZpbmkgKHZvaWQpCiB7CiAJbG5ldF91bnJlZ2lzdGVyX2xuZCgmdGhlX28yaWJsbmQpOwogfQogCi1pbnQgX19pbml0CitzdGF0aWMgaW50IF9faW5pdAoga2libG5kX21vZHVsZV9pbml0ICh2b2lkKQogewogCWludCAgICByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYwppbmRleCA2ZjU4ZWFkLi42MTczZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jCkBAIC0zMTI3LDcgKzMxMjcsNyBAQAogCiAJY2ZzX2Jsb2NrX2FsbHNpZ3MgKCk7CiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50ICgmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWtpYmxuZF9kYXRhLmtpYl9jb25uZCA9IGN1cnJlbnQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgma2libG5kX2RhdGEua2liX2Nvbm5kX2xvY2ssIGZsYWdzKTsKQEAgLTMyMDgsNyArMzIwOCw3IEBACiAJCWFkZF93YWl0X3F1ZXVlKCZraWJsbmRfZGF0YS5raWJfY29ubmRfd2FpdHEsICZ3YWl0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2Nvbm5kX2xvY2ssIGZsYWdzKTsKIAotCQl3YWl0cV90aW1lZHdhaXQoJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSwgdGltZW91dCk7CisJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF93YWl0cSwgJndhaXQpOwpAQCAtMzMyNCw3ICszMzI0LDcgQEAKIAogCWNmc19ibG9ja19hbGxzaWdzKCk7CiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAKIAlzY2hlZCA9IGtpYmxuZF9kYXRhLmtpYl9zY2hlZHNbS0lCX1RIUkVBRF9DUFQoaWQpXTsKIApAQCAtMzQyMyw3ICszNDIzLDcgQEAKIAkJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZzY2hlZC0+aWJzX3dhaXRxLCAmd2FpdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaGVkLT5pYnNfbG9jaywgZmxhZ3MpOwogCi0JCXdhaXRxX3dhaXQoJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CiAJCWJ1c3lfbG9vcHMgPSAwOwogCiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZzY2hlZC0+aWJzX3dhaXRxLCAmd2FpdCk7CkBAIC0zNDUwLDcgKzM0NTAsNyBAQAogCiAJY2ZzX2Jsb2NrX2FsbHNpZ3MgKCk7CiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJd3JpdGVfbG9ja19pcnFzYXZlKGdsb2NrLCBmbGFncyk7CiAKIAl3aGlsZSAoIWtpYmxuZF9kYXRhLmtpYl9zaHV0ZG93bikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jCmluZGV4IDhmNzRkMGIuLjIxZDM2ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMKQEAgLTIzMzYsNyArMjMzNiw4IEBACiAJCQkgICAgICAgIndhaXRpbmcgZm9yICVkIHRocmVhZHMgdG8gdGVybWluYXRlXG4iLAogCQkJCWtzb2NrbmFsX2RhdGEua3NuZF9udGhyZWFkcyk7CiAJCQlyZWFkX3VubG9jaygma3NvY2tuYWxfZGF0YS5rc25kX2dsb2JhbF9sb2NrKTsKLQkJCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJCQlyZWFkX2xvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CiAJCX0KIAkJcmVhZF91bmxvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CkBAIC0yNTg0LDcgKzI1ODUsOCBAQAogCQlDREVCVUcoKChpICYgKC1pKSkgPT0gaSkgPyBEX1dBUk5JTkcgOiBEX05FVCwgLyogcG93ZXIgb2YgMj8gKi8KIAkJICAgICAgICJ3YWl0aW5nIGZvciAlZCBwZWVycyB0byBkaXNjb25uZWN0XG4iLAogCQkgICAgICAgbmV0LT5rc25uX25wZWVycyk7Ci0JCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCiAJCWtzb2NrbmFsX2RlYnVnX3BlZXJoYXNoKG5pKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jCmluZGV4IGI3YjUzYjUuLmJkZjk1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMKQEAgLTE4OSw3ICsxODksOCBAQAogCWludCAgICAgIGJ1Zm5vYjsKIAogCWlmIChrc29ja25hbF9kYXRhLmtzbmRfc3RhbGxfdHggIT0gMCkgewotCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcyhrc29ja25hbF9kYXRhLmtzbmRfc3RhbGxfdHgpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoa3NvY2tuYWxfZGF0YS5rc25kX3N0YWxsX3R4KSk7CiAJfQogCiAJTEFTU0VSVCAodHgtPnR4X3Jlc2lkICE9IDApOwpAQCAtMzQ1LDcgKzM0Niw4IEBACiAJaW50ICAgICByYzsKIAogCWlmIChrc29ja25hbF9kYXRhLmtzbmRfc3RhbGxfcnggIT0gMCkgewotCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcyAoa3NvY2tuYWxfZGF0YS5rc25kX3N0YWxsX3J4KSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKGtzb2NrbmFsX2RhdGEua3NuZF9zdGFsbF9yeCkpOwogCX0KIAogCXJjID0ga3NvY2tuYWxfY29ubnNvY2tfYWRkcmVmKGNvbm4pOwpAQCAtMjE0MCw3ICsyMTQyLDcgQEAKIAogCWNmc19ibG9ja19hbGxzaWdzICgpOwogCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCAoJndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAogCXNwaW5fbG9ja19iaChjb25uZF9sb2NrKTsKIApAQCAtMjIyOSw3ICsyMjMxLDcgQEAKIAkJc3Bpbl91bmxvY2tfYmgoY29ubmRfbG9jayk7CiAKIAkJbmxvb3BzID0gMDsKLQkJd2FpdHFfdGltZWR3YWl0KCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsIHRpbWVvdXQpOworCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwogCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZrc29ja25hbF9kYXRhLmtzbmRfY29ubmRfd2FpdHEsICZ3YWl0KTsKQEAgLTI1MzIsNyArMjUzNCw3IEBACiAJY2ZzX2Jsb2NrX2FsbHNpZ3MgKCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmZW5vbWVtX2Nvbm5zKTsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50ICgmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCiAJc3Bpbl9sb2NrX2JoKCZrc29ja25hbF9kYXRhLmtzbmRfcmVhcGVyX2xvY2spOwogCkBAIC0yNjM5LDggKzI2NDEsNyBAQAogCQlpZiAoIWtzb2NrbmFsX2RhdGEua3NuZF9zaHV0dGluZ2Rvd24gJiYKIAkJICAgIGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfZGVhdGhyb3dfY29ubnMpICYmCiAJCSAgICBsaXN0X2VtcHR5ICgma3NvY2tuYWxfZGF0YS5rc25kX3pvbWJpZV9jb25ucykpCi0JCQl3YWl0cV90aW1lZHdhaXQgKCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsCi0JCQkJCSAgICAgdGltZW91dCk7CisJCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwogCiAJCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX1JVTk5JTkcpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSAoJmtzb2NrbmFsX2RhdGEua3NuZF9yZWFwZXJfd2FpdHEsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jCmluZGV4IDgwMTQxYWEuLmE1NGI1MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguYwpAQCAtMzczLDcgKzM3Myw4IEBACiAKIAkvKiBOQiB3ZSBjYW4ndCB0cnVzdCBzb2NrZXQgb3BzIHRvIGVpdGhlciBjb25zdW1lIG91ciBpb3ZzCiAJICogb3IgbGVhdmUgdGhlbSBhbG9uZS4gKi8KLQlpZiAoKGFkZHIgPSBrc29ja25hbF9saWJfa2lvdl92bWFwKGtpb3YsIG5pb3YsIHNjcmF0Y2hpb3YsIHBhZ2VzKSkgIT0gTlVMTCkgeworCWFkZHIgPSBrc29ja25hbF9saWJfa2lvdl92bWFwKGtpb3YsIG5pb3YsIHNjcmF0Y2hpb3YsIHBhZ2VzKTsKKwlpZiAoYWRkciAhPSBOVUxMKSB7CiAJCW5vYiA9IHNjcmF0Y2hpb3ZbMF0uaW92X2xlbjsKIAkJbXNnLm1zZ19pb3ZsZW4gPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX3Byb3RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX3Byb3RvLmMKaW5kZXggNzEyMDVlMi4uMmQ5MTU3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9wcm90by5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYwpAQCAtMTY1LDcgKzE2NSw4IEBACiAJTEFTU0VSVCAodHhfYWNrID09IE5VTEwgfHwKIAkJIHR4X2Fjay0+dHhfbXNnLmtzbV90eXBlID09IEtTT0NLX01TR19OT09QKTsKIAotCWlmICgodHggPSBjb25uLT5rc25jX3R4X2NhcnJpZXIpID09IE5VTEwpIHsKKwl0eCA9IGNvbm4tPmtzbmNfdHhfY2FycmllcjsKKwlpZiAodHggPT0gTlVMTCkgewogCQlpZiAodHhfYWNrICE9IE5VTEwpIHsKIAkJCWxpc3RfYWRkX3RhaWwoJnR4X2Fjay0+dHhfbGlzdCwKIAkJCQkJICAmY29ubi0+a3NuY190eF9xdWV1ZSk7CkBAIC0zOTIsNyArMzkzLDggQEAKIAlpZiAodHggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoKHJjID0ga3NvY2tuYWxfbGF1bmNoX3BhY2tldChwZWVyLT5rc25wX25pLCB0eCwgcGVlci0+a3NucF9pZCkpID09IDApCisJcmMgPSBrc29ja25hbF9sYXVuY2hfcGFja2V0KHBlZXItPmtzbnBfbmksIHR4LCBwZWVyLT5rc25wX2lkKTsKKwlpZiAocmMgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlrc29ja25hbF9mcmVlX3R4KHR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FjY2VwdG9yLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hY2NlcHRvci5jCmluZGV4IGNiMmVjZDcuLjA5ZWE2Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FjY2VwdG9yLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYWNjZXB0b3IuYwpAQCAtMzcxLDcgKzM3MSw4IEBACiAJCWlmIChyYyAhPSAwKSB7CiAJCQlpZiAocmMgIT0gLUVBR0FJTikgewogCQkJCUNXQVJOKCJBY2NlcHQgZXJyb3IgJWQ6IHBhdXNpbmcuLi5cbiIsIHJjKTsKLQkJCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJCQl9CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYXBpLW5pLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYwppbmRleCBjNTYyZmYzLi40NWMyMzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYwpAQCAtNzcwLDcgKzc3MCw3IEBACiAJaWYgKG51bWJlciA9PSAxKQogCQlyZXR1cm4gMDsKIAotCXZhbCA9IGNmc19oYXNoX2xvbmcoa2V5LCBMTkVUX0NQVF9CSVRTKTsKKwl2YWwgPSBoYXNoX2xvbmcoa2V5LCBMTkVUX0NQVF9CSVRTKTsKIAkvKiBOQjogTE5FVF9DUF9OVU1CRVIgZG9lc24ndCBoYXZlIHRvIGJlIFBPMiAqLwogCWlmICh2YWwgPCBudW1iZXIpCiAJCXJldHVybiB2YWw7CkBAIC05OTQsNyArOTk0LDggQEAKIAkJCQkgICAgICAgIldhaXRpbmcgZm9yIHpvbWJpZSBMTkkgJXNcbiIsCiAJCQkJICAgICAgIGxpYmNmc19uaWQyc3RyKG5pLT5uaV9uaWQpKTsKIAkJCX0KLQkJCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJCQlsbmV0X25ldF9sb2NrKExORVRfTE9DS19FWCk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYwppbmRleCA2YTA3YjBhLi5kOTc0NjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJLyogU3BsaXQgJ3N0cicgaW50byBzZXBhcmF0ZSBjb21tYW5kcyAqLwogCWZvciAoOzspIHsKIAkJLyogc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLQkJd2hpbGUgKGNmc19pc3doaXRlKCpzdHIpKQorCQl3aGlsZSAoaXNzcGFjZSgqc3RyKSkKIAkJCXN0cisrOwogCiAJCS8qIHNjYW4gZm9yIHNlcGFyYXRvciBvciBjb21tZW50ICovCkBAIC00NjAsNyArNDYwLDcgQEAKIAkJCX0KIAogCQkJZm9yIChpID0gMDsgaSA8IG5vYjsgaSsrKQotCQkJCWlmIChjZnNfaXN3aGl0ZShzdHJbaV0pKQorCQkJCWlmIChpc3NwYWNlKHN0cltpXSkpCiAJCQkJCWx0Yi0+bHRiX3RleHRbaV0gPSAnICc7CiAJCQkJZWxzZQogCQkJCQlsdGItPmx0Yl90ZXh0W2ldID0gc3RyW2ldOwpAQCAtNjY3LDcgKzY2Nyw3IEBACiAJc2VwID0gc3RyOwogCWZvciAoOzspIHsKIAkJLyogc2NhbiBmb3IgdG9rZW4gc3RhcnQgKi8KLQkJd2hpbGUgKGNmc19pc3doaXRlKCpzZXApKQorCQl3aGlsZSAoaXNzcGFjZSgqc2VwKSkKIAkJCXNlcCsrOwogCQlpZiAoKnNlcCA9PSAwKSB7CiAJCQlpZiAobnRva2VucyA8IChnb3RfaG9wcyA/IDMgOiAyKSkKQEAgLTY3OSw3ICs2NzksNyBAQAogCQl0b2tlbiA9IHNlcCsrOwogCiAJCS8qIHNjYW4gZm9yIHRva2VuIGVuZCAqLwotCQl3aGlsZSAoKnNlcCAhPSAwICYmICFjZnNfaXN3aGl0ZSgqc2VwKSkKKwkJd2hpbGUgKCpzZXAgIT0gMCAmJiAhaXNzcGFjZSgqc2VwKSkKIAkJCXNlcCsrOwogCQlpZiAoKnNlcCAhPSAwKQogCQkJKnNlcCsrID0gMDsKQEAgLTg1OCw3ICs4NTgsNyBAQAogCXNlcCA9IHRva2VuczsKIAlmb3IgKDs7KSB7CiAJCS8qIHNjYW4gZm9yIHRva2VuIHN0YXJ0ICovCi0JCXdoaWxlIChjZnNfaXN3aGl0ZSgqc2VwKSkKKwkJd2hpbGUgKGlzc3BhY2UoKnNlcCkpCiAJCQlzZXArKzsKIAkJaWYgKCpzZXAgPT0gMCkKIAkJCWJyZWFrOwpAQCAtODY2LDcgKzg2Niw3IEBACiAJCXRva2VuID0gc2VwKys7CiAKIAkJLyogc2NhbiBmb3IgdG9rZW4gZW5kICovCi0JCXdoaWxlICgqc2VwICE9IDAgJiYgIWNmc19pc3doaXRlKCpzZXApKQorCQl3aGlsZSAoKnNlcCAhPSAwICYmICFpc3NwYWNlKCpzZXApKQogCQkJc2VwKys7CiAJCWlmICgqc2VwICE9IDApCiAJCQkqc2VwKysgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLWVxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYwppbmRleCA0Y2U2OGQzLi43Y2UwN2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYwpAQCAtMzM0LDIxICszMzQsMjAgQEAKIAlpZiAodG1zID09IDApCiAJCXJldHVybiAtMTsgLyogZG9uJ3Qgd2FudCB0byB3YWl0IGFuZCBubyBuZXcgZXZlbnQgKi8KIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndsKTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2wsIGN1cnJlbnQpOwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJYWRkX3dhaXRfcXVldWUoJnRoZV9sbmV0LmxuX2VxX3dhaXRxLCAmd2wpOwogCiAJbG5ldF9lcV93YWl0X3VubG9jaygpOwogCiAJaWYgKHRtcyA8IDApIHsKLQkJd2FpdHFfd2FpdCgmd2wsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CiAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgdGltZXZhbCB0djsKIAogCQlub3cgPSBjZnNfdGltZV9jdXJyZW50KCk7Ci0JCXdhaXRxX3RpbWVkd2FpdCgmd2wsIFRBU0tfSU5URVJSVVBUSUJMRSwKLQkJCQkgICAgY2ZzX3RpbWVfc2Vjb25kcyh0bXMpIC8gMTAwMCk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcyh0bXMpIC8gMTAwMCk7CiAJCWNmc19kdXJhdGlvbl91c2VjKGNmc190aW1lX3N1YihjZnNfdGltZV9jdXJyZW50KCksIG5vdyksICZ0dik7CiAJCXRtcyAtPSAoaW50KSh0di50dl9zZWMgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDApOwogCQlpZiAodG1zIDwgMCkgLyogbm8gbW9yZSB3YWl0IGJ1dCBtYXkgaGF2ZSBuZXcgZXZlbnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1wdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1wdGwuYwppbmRleCA2ZmZmZDVlLi45MjBkZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItcHRsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLXB0bC5jCkBAIC0zNjYsNyArMzY2LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBoYXNoID0gbWJpdHMgKyBpZC5uaWQgKyBpZC5waWQ7CiAKIAkJTEFTU0VSVChsbmV0X3B0bF9pc191bmlxdWUocHRsKSk7Ci0JCWhhc2ggPSBjZnNfaGFzaF9sb25nKGhhc2gsIExORVRfTVRfSEFTSF9CSVRTKTsKKwkJaGFzaCA9IGhhc2hfbG9uZyhoYXNoLCBMTkVUX01UX0hBU0hfQklUUyk7CiAJCXJldHVybiAmbXRhYmxlLT5tdF9taGFzaFtoYXNoXTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9wZWVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9wZWVyLmMKaW5kZXggMjg2OTc3Ni4uNzI4MDJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3BlZXIuYwpAQCAtMTQ1LDcgKzE0NSw4IEBACiAJCQkJICAgICAgICJXYWl0aW5nIGZvciAlZCBwZWVycyBvbiBwZWVyIHRhYmxlXG4iLAogCQkJCSAgICAgICBwdGFibGUtPnB0X251bWJlcik7CiAJCQl9Ci0JCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDIpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpIC8gMik7CiAJCQlsbmV0X25ldF9sb2NrKGkpOwogCQl9CiAJCWxpc3Rfc3BsaWNlX2luaXQoJnB0YWJsZS0+cHRfZGVhdGhyb3csICZkZWF0aHJvdyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jCmluZGV4IGQxZWU0NDIuLjk5NWY1MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jCkBAIC03NzksNyArNzc5LDggQEAKIAkJaWYgKGFsbF9rbm93bikKIAkJCXJldHVybjsKIAotCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAl9CiB9CiAKQEAgLTExNDcsNyArMTE0OCw4IEBACiAJCWkrKzsKIAkJQ0RFQlVHKCgoaSAmICgtaSkpID09IGkpID8gRF9XQVJOSU5HIDogRF9ORVQsCiAJCSAgICAgICAiV2FpdGluZyBmb3IgcmMgYnVmZmVycyB0byB1bmxpbmtcbiIpOwotCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDQpOwogCiAJCWxuZXRfbmV0X2xvY2soTE5FVF9MT0NLX0VYKTsKIAl9CkBAIC0xMjA2LDExICsxMjA4LDExIEBACiAKIAkJbG5ldF9wcnVuZV9yY19kYXRhKDApOyAvKiBkb24ndCB3YWl0IGZvciBVTkxJTksgKi8KIAotCQkvKiBDYWxsIGNmc19wYXVzZSgpIGhlcmUgYWx3YXlzIGFkZHMgMSB0byBsb2FkIGF2ZXJhZ2UKKwkJLyogQ2FsbCBzY2hlZHVsZV90aW1lb3V0KCkgaGVyZSBhbHdheXMgYWRkcyAxIHRvIGxvYWQgYXZlcmFnZQogCQkgKiBiZWNhdXNlIGtlcm5lbCBjb3VudHMgIyBhY3RpdmUgdGFza3MgYXMgbnJfcnVubmluZwogCQkgKiArIG5yX3VuaW50ZXJydXB0aWJsZS4gKi8KLQkJc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSwKLQkJCQkJCSAgIGNmc190aW1lX3NlY29uZHMoMSkpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCX0KIAogCUxBU1NFUlQodGhlX2xuZXQubG5fcmNfc3RhdGUgPT0gTE5FVF9SQ19TVEFURV9TVE9QUElORyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXJfcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyX3Byb2MuYwppbmRleCAyMGQ1M2UwLi4wY2JkOWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXJfcHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlcl9wcm9jLmMKQEAgLTgzNyw4ICs4MzcsOCBAQAogCXJjID0gLUVJTlZBTDsKIAlsbmV0X3Jlc19sb2NrKDApOwogCWZvciAoaSA9IDA7IHBvcnRhbF9yb3RvcnNbaV0ucHJfbmFtZSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKGNmc19zdHJuY2FzZWNtcChwb3J0YWxfcm90b3JzW2ldLnByX25hbWUsIHRtcCwKLQkJCQkgICAgc3RybGVuKHBvcnRhbF9yb3RvcnNbaV0ucHJfbmFtZSkpID09IDApIHsKKwkJaWYgKHN0cm5jYXNlY21wKHBvcnRhbF9yb3RvcnNbaV0ucHJfbmFtZSwgdG1wLAorCQkJCXN0cmxlbihwb3J0YWxfcm90b3JzW2ldLnByX25hbWUpKSA9PSAwKSB7CiAJCQlwb3J0YWxfcm90b3IgPSBwb3J0YWxfcm90b3JzW2ldLnByX3ZhbHVlOwogCQkJcmMgPSAwOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29ucnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29ucnBjLmMKaW5kZXggNTNkNTg5Mi4uOGQxZWVhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnJwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25ycGMuYwpAQCAtMTM0Niw3ICsxMzQ2LDggQEAKIAkJbXV0ZXhfdW5sb2NrKCZjb25zb2xlX3Nlc3Npb24uc2VzX211dGV4KTsKIAogCQlDV0FSTigiU2Vzc2lvbiBpcyBzaHV0dGluZyBkb3duLCB3YWl0aW5nIGZvciB0ZXJtaW5hdGlvbiBvZiB0cmFuc2FjdGlvbnNcbiIpOwotCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAogCQltdXRleF9sb2NrKCZjb25zb2xlX3Nlc3Npb24uc2VzX211dGV4KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYwppbmRleCAyYThlZGRjLi4zNTJmYzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAogbHN0Y29uX3Nlc3Npb25fdAljb25zb2xlX3Nlc3Npb247CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBsc3Rjb25fbm9kZV9nZXQobHN0Y29uX25vZGVfdCAqbmQpCiB7CiAJTEFTU0VSVCAobmQtPm5kX3JlZiA+PSAxKTsKQEAgLTExNCw3ICsxMTQsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogbHN0Y29uX25vZGVfcHV0KGxzdGNvbl9ub2RlX3QgKm5kKQogewogCWxzdGNvbl9uZGxpbmtfdCAgKm5kbDsKQEAgLTM0NCw3ICszNDQsNyBAQAogCX0KIH0KIAotaW50CitzdGF0aWMgaW50CiBsc3Rjb25fc2VzcnBjX2NvbmRpdGlvbihpbnQgdHJhbnNvcCwgbHN0Y29uX25vZGVfdCAqbmQsIHZvaWQgKmFyZykKIHsKIAlsc3Rjb25fZ3JvdXBfdCAqZ3JwID0gKGxzdGNvbl9ncm91cF90ICopYXJnOwpAQCAtMzczLDcgKzM3Myw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX3Nlc3JwY19yZWFkZW50KGludCB0cmFuc29wLCBzcnBjX21zZ190ICptc2csCiAJCSAgICAgIGxzdGNvbl9ycGNfZW50X3QgKmVudF91cCkKIHsKQEAgLTgzMCw3ICs4MzAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl9iYXRjaF9maW5kKGNvbnN0IGNoYXIgKm5hbWUsIGxzdGNvbl9iYXRjaF90ICoqYmF0cHApCiB7CiAJbHN0Y29uX2JhdGNoX3QgICAqYmF0OwpAQCAtOTk4LDcgKzk5OCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl9iYXRycGNfY29uZGl0aW9uKGludCB0cmFuc29wLCBsc3Rjb25fbm9kZV90ICpuZCwgdm9pZCAqYXJnKQogewogCXN3aXRjaCAodHJhbnNvcCkgewpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIAlMSUJDRlNfRlJFRShiYXQsIHNpemVvZihsc3Rjb25fYmF0Y2hfdCkpOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl90ZXN0cnBjX2NvbmRpdGlvbihpbnQgdHJhbnNvcCwgbHN0Y29uX25vZGVfdCAqbmQsIHZvaWQgKmFyZykKIHsKIAlsc3Rjb25fdGVzdF90ICAgICp0ZXN0OwpAQCAtMTM3MCw3ICsxMzcwLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX3Rlc3RfZmluZChsc3Rjb25fYmF0Y2hfdCAqYmF0Y2gsIGludCBpZHgsIGxzdGNvbl90ZXN0X3QgKip0ZXN0cHApCiB7CiAJbHN0Y29uX3Rlc3RfdCAqdGVzdDsKQEAgLTEzODUsNyArMTM4NSw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX3RzYnJwY19yZWFkZW50KGludCB0cmFuc29wLCBzcnBjX21zZ190ICptc2csCiAJCSAgICAgIGxzdGNvbl9ycGNfZW50X3QgKmVudF91cCkKIHsKQEAgLTE0NjQsNyArMTQ2NCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl9zdGF0cnBjX3JlYWRlbnQoaW50IHRyYW5zb3AsIHNycGNfbXNnX3QgKm1zZywKIAkJICAgICAgIGxzdGNvbl9ycGNfZW50X3QgKmVudF91cCkKIHsKQEAgLTE0ODgsNyArMTQ4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludAorc3RhdGljIGludAogbHN0Y29uX25kbGlzdF9zdGF0KHN0cnVjdCBsaXN0X2hlYWQgKm5kbGlzdCwKIAkJICAgaW50IHRpbWVvdXQsIHN0cnVjdCBsaXN0X2hlYWQgKnJlc3VsdF91cCkKIHsKQEAgLTE1NzcsNyArMTU3Nyw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxzdGNvbl9kZWJ1Z19uZGxpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbmRsaXN0LAogCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqdHJhbnNsaXN0LAogCQkgICAgaW50IHRpbWVvdXQsIHN0cnVjdCBsaXN0X2hlYWQgKnJlc3VsdF91cCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYwppbmRleCBkODM4OTg1Li45ZmMwNDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jCkBAIC0xNTg1LDcgKzE1ODUsOCBAQAogCXNwaW5fbG9ja19pbml0KCZzcnBjX2RhdGEucnBjX2dsb2NrKTsKIAogCS8qIDEgc2Vjb25kIHBhdXNlIHRvIGF2b2lkIHRpbWVzdGFtcCByZXVzZSAqLwotCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKDEpKTsKIAlzcnBjX2RhdGEucnBjX21hdGNoYml0cyA9ICgoX191NjQpIGNmc190aW1lX2N1cnJlbnRfc2VjKCkpIDw8IDQ4OwogCiAJc3JwY19kYXRhLnJwY19zdGF0ZSA9IFNSUENfU1RBVEVfTk9ORTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9zZWxmdGVzdC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3NlbGZ0ZXN0LmgKaW5kZXggMjI4OTI3ZS4uZjQ4MDZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3NlbGZ0ZXN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3NlbGZ0ZXN0LmgKQEAgLTU3Miw3ICs1NzIsMTEgQEAKICN1bmRlZiBTVEFURTJTVFIKIH0KIAotI2RlZmluZSBzZWxmdGVzdF93YWl0X2V2ZW50cygpCWNmc19wYXVzZShjZnNfdGltZV9zZWNvbmRzKDEpIC8gMTApCisjZGVmaW5lIHNlbGZ0ZXN0X3dhaXRfZXZlbnRzKCkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwlcCisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDEwKTsJXAorCX0gd2hpbGUgKDApCiAKIAogI2RlZmluZSBsc3Rfd2FpdF91bnRpbChjb25kLCBsb2NrLCBmbXQsIC4uLikJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvZmlkX3JlcXVlc3QuYwppbmRleCA3OWZjMmZlLi4zNDAxYzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvZmlkX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvZmlkX3JlcXVlc3QuYwpAQCAtMTk2LDggKzE5Niw4IEBACiAJaWYgKHJhbmdlX2lzX2V4aGF1c3RlZCgmc2VxLT5sY3Nfc3BhY2UpKSB7CiAJCXJjID0gc2VxX2NsaWVudF9hbGxvY19tZXRhKGVudiwgc2VxKTsKIAkJaWYgKHJjKSB7Ci0JCQlDRVJST1IoIiVzOiBDYW4ndCBhbGxvY2F0ZSBuZXcgbWV0YS1zZXF1ZW5jZSwiCi0JCQkgICAgICAgInJjICVkXG4iLCBzZXEtPmxjc19uYW1lLCByYyk7CisJCQlDRVJST1IoIiVzOiBDYW4ndCBhbGxvY2F0ZSBuZXcgbWV0YS1zZXF1ZW5jZSwgcmMgJWRcbiIsCisJCQkJc2VxLT5sY3NfbmFtZSwgcmMpOwogCQkJcmV0dXJuIHJjOwogCQl9IGVsc2UgewogCQkJQ0RFQlVHKERfSU5GTywgIiVzOiBOZXcgcmFuZ2UgLSAiRFJBTkdFIlxuIiwKQEAgLTIyNSw3ICsyMjUsNyBAQAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCW11dGV4X3VubG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCi0JCXdhaXRxX3dhaXQobGluaywgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOwogCiAJCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJnNlcS0+bGNzX3dhaXRxLCBsaW5rKTsKQEAgLTI1Niw3ICsyNTYsNyBAQAogCiAJTEFTU0VSVChzZXFuciAhPSBOVUxMKTsKIAltdXRleF9sb2NrKCZzZXEtPmxjc19tdXRleCk7Ci0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmbGluayk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJmxpbmssIGN1cnJlbnQpOwogCiAJd2hpbGUgKDEpIHsKIAkJcmMgPSBzZXFfZmlkX2FsbG9jX3ByZXAoc2VxLCAmbGluayk7CkBAIC0yNjYsMTUgKzI2NiwxNSBAQAogCiAJcmMgPSBzZXFfY2xpZW50X2FsbG9jX3NlcShlbnYsIHNlcSwgc2VxbnIpOwogCWlmIChyYykgewotCQlDRVJST1IoIiVzOiBDYW4ndCBhbGxvY2F0ZSBuZXcgc2VxdWVuY2UsICIKLQkJICAgICAgICJyYyAlZFxuIiwgc2VxLT5sY3NfbmFtZSwgcmMpOworCQlDRVJST1IoIiVzOiBDYW4ndCBhbGxvY2F0ZSBuZXcgc2VxdWVuY2UsIHJjICVkXG4iLAorCQkJc2VxLT5sY3NfbmFtZSwgcmMpOwogCQlzZXFfZmlkX2FsbG9jX2Zpbmkoc2VxKTsKIAkJbXV0ZXhfdW5sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAJCXJldHVybiByYzsKIAl9CiAKLQlDREVCVUcoRF9JTkZPLCAiJXM6IGFsbG9jYXRlIHNlcXVlbmNlICIKLQkgICAgICAgIlsweCUxNi4xNiJMUEY2NCJ4XVxuIiwgc2VxLT5sY3NfbmFtZSwgKnNlcW5yKTsKKwlDREVCVUcoRF9JTkZPLCAiJXM6IGFsbG9jYXRlIHNlcXVlbmNlIFsweCUxNi4xNiJMUEY2NCJ4XVxuIiwKKwkJCXNlcS0+bGNzX25hbWUsICpzZXFucik7CiAKIAkvKiBTaW5jZSB0aGUgY2FsbGVyIHJlcXVpcmUgdGhlIHdob2xlIHNlcSwKIAkgKiBzbyBtYXJrZWQgdGhpcyBzZXEgdG8gYmUgdXNlZCAqLwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJTEFTU0VSVChzZXEgIT0gTlVMTCk7CiAJTEFTU0VSVChmaWQgIT0gTlVMTCk7CiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZsaW5rKTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmbGluaywgY3VycmVudCk7CiAJbXV0ZXhfbG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX1NFUV9FWEhBVVNUKSkKQEAgLTMyOSwxNSArMzI5LDE1IEBACiAKIAkJcmMgPSBzZXFfY2xpZW50X2FsbG9jX3NlcShlbnYsIHNlcSwgJnNlcW5yKTsKIAkJaWYgKHJjKSB7Ci0JCQlDRVJST1IoIiVzOiBDYW4ndCBhbGxvY2F0ZSBuZXcgc2VxdWVuY2UsICIKLQkJCSAgICAgICAicmMgJWRcbiIsIHNlcS0+bGNzX25hbWUsIHJjKTsKKwkJCUNFUlJPUigiJXM6IENhbid0IGFsbG9jYXRlIG5ldyBzZXF1ZW5jZSwgcmMgJWRcbiIsCisJCQkJc2VxLT5sY3NfbmFtZSwgcmMpOwogCQkJc2VxX2ZpZF9hbGxvY19maW5pKHNlcSk7CiAJCQltdXRleF91bmxvY2soJnNlcS0+bGNzX211dGV4KTsKIAkJCXJldHVybiByYzsKIAkJfQogCi0JCUNERUJVRyhEX0lORk8sICIlczogU3dpdGNoIHRvIHNlcXVlbmNlICIKLQkJICAgICAgICJbMHglMTYuMTYiTFBGNjQieF1cbiIsIHNlcS0+bGNzX25hbWUsIHNlcW5yKTsKKwkJQ0RFQlVHKERfSU5GTywgIiVzOiBTd2l0Y2ggdG8gc2VxdWVuY2UgWzB4JTE2LjE2IkxQRjY0InhdXG4iLAorCQkJCXNlcS0+bGNzX25hbWUsIHNlcW5yKTsKIAogCQlzZXEtPmxjc19maWQuZl9vaWQgPSBMVVNUUkVfRklEX0lOSVRfT0lEOwogCQlzZXEtPmxjc19maWQuZl9zZXEgPSBzZXFucjsKQEAgLTM3MCw3ICszNzAsNyBAQAogCXdhaXRfcXVldWVfdCBsaW5rOwogCiAJTEFTU0VSVChzZXEgIT0gTlVMTCk7Ci0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmbGluayk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJmxpbmssIGN1cnJlbnQpOwogCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKIAogCXdoaWxlIChzZXEtPmxjc191cGRhdGUpIHsKQEAgLTM3OCw3ICszNzgsNyBAQAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCW11dGV4X3VubG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCi0JCXdhaXRxX3dhaXQoJmxpbmssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKIAogCQltdXRleF9sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZzZXEtPmxjc193YWl0cSwgJmxpbmspOwpAQCAtNDI4LDggKzQyOCw4IEBACiAJcmMgPSBscHJvY2ZzX2FkZF92YXJzKHNlcS0+bGNzX3Byb2NfZGlyLAogCQkJICAgICAgc2VxX2NsaWVudF9wcm9jX2xpc3QsIHNlcSk7CiAJaWYgKHJjKSB7Ci0JCUNFUlJPUigiJXM6IENhbid0IGluaXQgc2VxdWVuY2UgbWFuYWdlciAiCi0JCSAgICAgICAicHJvYywgcmMgJWRcbiIsIHNlcS0+bGNzX25hbWUsIHJjKTsKKwkJQ0VSUk9SKCIlczogQ2FuJ3QgaW5pdCBzZXF1ZW5jZSBtYW5hZ2VyIHByb2MsIHJjICVkXG4iLAorCQkJc2VxLT5sY3NfbmFtZSwgcmMpOwogCQlHT1RPKG91dF9jbGVhbnVwLCByYyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2NhY2hlLmMKaW5kZXggNmMzNzkzMC4uYTA2YTY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfY2FjaGUuYwpAQCAtMjM2LDggKzIzNiw4IEBACiAJCW51bSsrOwogCX0KIAotCUNERUJVRyhEX0lORk8sICIlczogRkxEIGNhY2hlIC0gU2hydW5rIGJ5ICIKLQkgICAgICAgIiVkIGVudHJpZXNcbiIsIGNhY2hlLT5mY2lfbmFtZSwgbnVtKTsKKwlDREVCVUcoRF9JTkZPLCAiJXM6IEZMRCBjYWNoZSAtIFNocnVuayBieSAlZCBlbnRyaWVzXG4iLAorCQkJY2FjaGUtPmZjaV9uYW1lLCBudW0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJZmxkX2NhY2hlX2VudHJ5X2FkZChjYWNoZSwgZl9uZXcsICZmX2N1cnItPmZjZV9saXN0KTsKIAl9IGVsc2UKIAkJQ0VSUk9SKCJORVcgcmFuZ2UgPSJEUkFOR0UiIGN1cnIgPSAiRFJBTkdFIlxuIiwKLQkJICAgICAgIFBSQU5HRShyYW5nZSksUFJBTkdFKCZmX2N1cnItPmZjZV9yYW5nZSkpOworCQkgICAgICAgUFJBTkdFKHJhbmdlKSwgUFJBTkdFKCZmX2N1cnItPmZjZV9yYW5nZSkpOwogfQogCiBzdHJ1Y3QgZmxkX2NhY2hlX2VudHJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmgKaW5kZXggNWYzOTM1Yy4uODY2MWE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaApAQCAtOTAsNyArOTAsNyBAQAogCWludAkJICAgICAgZmNpX3RocmVzaG9sZDsKIAogCS8qKgotCSAqIFByZWZlcmVkIG51bWJlciBvZiBjYWNoZWQgZW50cmllcyAqLworCSAqIFByZWZlcnJlZCBudW1iZXIgb2YgY2FjaGVkIGVudHJpZXMgKi8KIAlpbnQJCSAgICAgIGZjaV9jYWNoZV9zaXplOwogCiAJLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCmluZGV4IDg5NmY5ZmUuLjFmOGFiYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCkBAIC0xMzgsOSArMTM4LDggQEAKIAkJCXJldHVybiB0YXJnZXQ7CiAJfQogCi0JQ0VSUk9SKCIlczogQ2FuJ3QgZmluZCB0YXJnZXQgYnkgaGFzaCAlZCAoc2VxICJMUFg2NCIpLiAiCi0JICAgICAgICJUYXJnZXRzICglZCk6XG4iLCBmbGQtPmxjZl9uYW1lLCBoYXNoLCBzZXEsCi0JICAgICAgIGZsZC0+bGNmX2NvdW50KTsKKwlDRVJST1IoIiVzOiBDYW4ndCBmaW5kIHRhcmdldCBieSBoYXNoICVkIChzZXEgIkxQWDY0IikuIFRhcmdldHMgKCVkKTpcbiIsCisJCWZsZC0+bGNmX25hbWUsIGhhc2gsIHNlcSwgZmxkLT5sY2ZfY291bnQpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZmbGQtPmxjZl90YXJnZXRzLCBmdF9jaGFpbikgewogCQljb25zdCBjaGFyICpzcnZfbmFtZSA9IHRhcmdldC0+ZnRfc3J2ICE9IE5VTEwgID8KQEAgLTIwOSw5ICsyMDgsOCBAQAogCUxBU1NFUlQodGFyLT5mdF9zcnYgIT0gTlVMTCB8fCB0YXItPmZ0X2V4cCAhPSBOVUxMKTsKIAogCWlmIChmbGQtPmxjZl9mbGFncyAhPSBMVVNUUkVfRkxEX0lOSVQpIHsKLQkJQ0VSUk9SKCIlczogQXR0ZW1wdCB0byBhZGQgdGFyZ2V0ICVzIChpZHggIkxQVTY0IikgIgotCQkgICAgICAgIm9uIGZseSAtIHNraXAgaXRcbiIsIGZsZC0+bGNmX25hbWUsIG5hbWUsCi0JCSAgICAgICB0YXItPmZ0X2lkeCk7CisJCUNFUlJPUigiJXM6IEF0dGVtcHQgdG8gYWRkIHRhcmdldCAlcyAoaWR4ICJMUFU2NCIpIG9uIGZseSAtIHNraXAgaXRcbiIsCisJCQlmbGQtPmxjZl9uYW1lLCBuYW1lLCB0YXItPmZ0X2lkeCk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCUNERUJVRyhEX0lORk8sICIlczogQWRkaW5nIHRhcmdldCAlcyAoaWR4ICIKQEAgLTQ3Niw5ICs0NzQsOCBAQAogCXRhcmdldCA9IGZsZF9jbGllbnRfZ2V0X3RhcmdldChmbGQsIHNlcSk7CiAJTEFTU0VSVCh0YXJnZXQgIT0gTlVMTCk7CiAKLQlDREVCVUcoRF9JTkZPLCAiJXM6IExvb2t1cCBmbGQgZW50cnkgKHNlcTogIkxQWDY0Iikgb24gIgotCSAgICAgICAidGFyZ2V0ICVzIChpZHggIkxQVTY0IilcbiIsIGZsZC0+bGNmX25hbWUsIHNlcSwKLQkgICAgICAgZmxkX3RhcmdldF9uYW1lKHRhcmdldCksIHRhcmdldC0+ZnRfaWR4KTsKKwlDREVCVUcoRF9JTkZPLCAiJXM6IExvb2t1cCBmbGQgZW50cnkgKHNlcTogIkxQWDY0Iikgb24gdGFyZ2V0ICVzIChpZHggIkxQVTY0IilcbiIsCisJCQlmbGQtPmxjZl9uYW1lLCBzZXEsIGZsZF90YXJnZXRfbmFtZSh0YXJnZXQpLCB0YXJnZXQtPmZ0X2lkeCk7CiAKIAlyZXMubHNyX3N0YXJ0ID0gc2VxOwogCWZsZF9yYW5nZV9zZXRfdHlwZSgmcmVzLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2NsX29iamVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9jbF9vYmplY3QuaAppbmRleCA0ZDY5MmRjLi5jODA5MjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2NsX29iamVjdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvY2xfb2JqZWN0LmgKQEAgLTEzMTQsNyArMTMxNCw3IEBACiAgKiBjYWxscy4gVG8gYWNoaWV2ZSB0aGlzLCBldmVyeSBsYXllciBjYW4gaW1wbGVtZW50IC0+Y2xvX2ZpdHNfaW50bygpIG1ldGhvZCwKICAqIHRoYXQgaXMgY2FsbGVkIGJ5IGxvY2sgbWF0Y2hpbmcgY29kZSAoY2xfbG9ja19sb29rdXAoKSksIGFuZCB0aGF0IGNhbiBiZQogICogdXNlZCB0byBzZWxlY3RpdmVseSBkaXNhYmxlIG1hdGNoaW5nIG9mIGNlcnRhaW4gbG9ja3MgZm9yIGNlcnRhaW4gSU9zLiBGb3IKLSAqIGV4bWFwbGUsIGxvdiBsYXllciBpbXBsZW1lbnRzIGxvdl9sb2NrX2ZpdHNfaW50bygpIHRoYXQgYWxsb3cgbXVsdGktc3RyaXBlCisgKiBleGFtcGxlLCBsb3YgbGF5ZXIgaW1wbGVtZW50cyBsb3ZfbG9ja19maXRzX2ludG8oKSB0aGF0IGFsbG93IG11bHRpLXN0cmlwZQogICogbG9ja3MgdG8gYmUgbWF0Y2hlZCBvbmx5IGZvciB0cnVuY2F0ZXMgYW5kIE9fQVBQRU5EIHdyaXRlcy4KICAqCiAgKiBJbnRlcmFjdGlvbiB3aXRoIERMTQpAQCAtMjM4NSwxNCArMjM4NSwxOCBAQAogCSAqIENoZWNrIGlmIGxheW91dCBjaGFuZ2VkIGFmdGVyIHRoZSBJTyBmaW5pc2hlcy4gTWFpbmx5IGZvciBIU00KIAkgKiByZXF1aXJlbWVudC4gSWYgSU8gb2NjdXJzIHRvIG9wZW5uaW5nIGZpbGVzLCBpdCBkb2Vzbid0IG5lZWQgdG8KIAkgKiB2ZXJpZnkgbGF5b3V0IGJlY2F1c2UgSFNNIHdvbid0IHJlbGVhc2Ugb3Blbm5pbmcgZmlsZXMuCi0JICogUmlnaHQgbm93LCBvbmx5IHR3byBvcGVydGFpb25zIG5lZWQgdG8gdmVyaWZ5IGxheW91dDogZ2xpbXBzZQorCSAqIFJpZ2h0IG5vdywgb25seSB0d28gb3BlcmF0aW9ucyBuZWVkIHRvIHZlcmlmeSBsYXlvdXQ6IGdsaW1wc2UKIAkgKiBhbmQgc2V0YXR0ci4KIAkgKi8KIAkJCSAgICAgY2lfdmVyaWZ5X2xheW91dDoxLAogCS8qKgogCSAqIGZpbGUgaXMgcmVsZWFzZWQsIHJlc3RvcmUgaGFzIHRvIHRvIGJlIHRyaWdnZXJlZCBieSB2dnAgbGF5ZXIKIAkgKi8KLQkJCSAgICAgY2lfcmVzdG9yZV9uZWVkZWQ6MTsKKwkJCSAgICAgY2lfcmVzdG9yZV9uZWVkZWQ6MSwKKwkvKioKKwkgKiBPX05PQVRJTUUKKwkgKi8KKwkJCSAgICAgY2lfbm9hdGltZToxOwogCS8qKgogCSAqIE51bWJlciBvZiBwYWdlcyBvd25lZCBieSB0aGlzIElPLiBGb3IgaW52YXJpYW50IGNoZWNraW5nLgogCSAqLwpAQCAtMjU1Miw3ICsyNTU2LDcgQEAKICAqLwogc3RydWN0IGNsX3JlcSB7CiAJZW51bSBjbF9yZXFfdHlwZSAgICAgIGNycV90eXBlOwotCS8qKiBBIGxpc3Qgb2YgcGFnZXMgYmVpbmcgdHJhbnNmZXJlZCAqLworCS8qKiBBIGxpc3Qgb2YgcGFnZXMgYmVpbmcgdHJhbnNmZXJyZWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICBjcnFfcGFnZXM7CiAJLyoqIE51bWJlciBvZiBwYWdlcyBpbiBjbF9yZXE6OmNycV9wYWdlcyAqLwogCXVuc2lnbmVkCSAgICAgIGNycV9ucnBhZ2VzOwpAQCAtMzIyNCw3ICszMjI4LDcgQEAKICAqCiAgKiAgICAgLSBjYWxsIGNoYWlucyBoYXZlIG5vIG5vbi1sdXN0cmUgcG9ydGlvbnMgaW5zZXJ0ZWQgYmV0d2VlbiBsdXN0cmUgY29kZS4KICAqCi0gKiBPbiBhIGNsaWVudCBib3RoIHRoZXNlIGFzc3VtdHBpb24gZmFpbHMsIGJlY2F1c2UgZXZlcnkgdXNlciB0aHJlYWQgY2FuCisgKiBPbiBhIGNsaWVudCBib3RoIHRoZXNlIGFzc3VtcHRpb24gZmFpbHMsIGJlY2F1c2UgZXZlcnkgdXNlciB0aHJlYWQgY2FuCiAgKiBwb3RlbnRpYWxseSBleGVjdXRlIGx1c3RyZSBjb2RlIGFzIHBhcnQgb2YgYSBzeXN0ZW0gY2FsbCwgYW5kIGx1c3RyZSBjYWxscwogICogaW50byBWRlMgb3IgTU0gdGhhdCBjYWxsIGJhY2sgaW50byBsdXN0cmUuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9pb2N0bC5oCmluZGV4IDIyN2MyNjEuLmI5ODY5MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2lvY3RsLmgKQEAgLTM4LDcgKzM4LDcgQEAKICAqIGFuZCBvbiBuZXdlciBrZXJuZWxzIHRoaXMgaGVhZGVyIGlzIHNoYXJlZCBhcyBfQVNNX0dFTkVSSUNfSU9DVExfSC4KICAqCiAgKiBXZSBjYW4gYXZvaWQgYW55IHByb2JsZW1zIHdpdGggdGhlIGtlcm5lbCBoZWFkZXIgYmVpbmcgaW5jbHVkZWQgYWdhaW4gYnkKLSAqIGRlZmluaW5nIF9BU01fSTM4Nl9JT0NUTF9IIGhlcmUgc28gdGhhdCBhIGxhdGVyIG9jY3VyZW5jZSBvZiA8YXNtL2lvY3RsLmg+CisgKiBkZWZpbmluZyBfQVNNX0kzODZfSU9DVExfSCBoZXJlIHNvIHRoYXQgYSBsYXRlciBvY2N1cnJlbmNlIG9mIDxhc20vaW9jdGwuaD4KICAqIGRvZXMgbm90IGluY2x1ZGUgdGhlIGtlcm5lbCdzIGlvY3RsLmggYWZ0ZXIgdGhpcyBvbmUuIGI9MTQ3NDYgKi8KICNkZWZpbmUgX0FTTV9JMzg2X0lPQ1RMX0gKICNkZWZpbmUgX0FTTV9HRU5FUklDX0lPQ1RMX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGNsaWVudC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sY2xpZW50LmgKaW5kZXggMjczMTZmNy4uODI3MjA5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sY2xpZW50LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sY2xpZW50LmgKQEAgLTExOCw4ICsxMTgsOCBAQAogfTsKIAogLyoqCi0gKiBUcnVlLCBpZiBcYSBpbyBpcyBhIG5vcm1hbCBpbywgRmFsc2UgZm9yIG90aGVyIChzZW5kZmlsZSwgc3BsaWNlKikuCi0gKiBtdXN0IGJlIGltcGVtZW50YXRlZCBpbiBhcmNoIHNwZWNpZmljIGNvZGUuCisgKiBUcnVlLCBpZiBcYSBpbyBpcyBhIG5vcm1hbCBpbywgRmFsc2UgZm9yIHNwbGljZV97cmVhZCx3cml0ZX0uCisgKiBtdXN0IGJlIGltcGxlbWVudGVkIGluIGFyY2ggc3BlY2lmaWMgY29kZS4KICAqLwogaW50IGNsX2lzX25vcm1hbGlvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgY29uc3Qgc3RydWN0IGNsX2lvICppbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2FjbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfYWNsLmgKaW5kZXggNzc4YjEyMy4uYTkxYzU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfYWNsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfYWNsLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKICNkZWZpbmUgX0xVU1RSRV9MSU5VWF9BQ0xfSAogCiAjaWZuZGVmCV9MVVNUUkVfQUNMX0gKLSNlcnJvcglTaG91ZCBub3QgaW5jbHVkZSBkaXJlZWN0bHkuIHVzZSAjaW5jbHVkZSA8bHVzdHJlX2FjbC5oPiBpbnN0ZWFkCisjZXJyb3IJU2hvdWxkIG5vdCBpbmNsdWRlIGRpcmVjdGx5LiB1c2UgI2luY2x1ZGUgPGx1c3RyZV9hY2wuaD4gaW5zdGVhZAogI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9vYmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvb2JkLmgKaW5kZXggMDFhNTAyNi4uZGMzNmY3NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvb2JkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9vYmQuaApAQCAtOTYsNyArOTYsOCBAQAogCQkJTENPTlNPTEVfV0FSTigiPT09PT09IGZvciBjdXJyZW50IHByb2Nlc3MgPT09PT1cbiIpOwogCQkJZHVtcF9zdGFjaygpOwogCQkJTENPTlNPTEVfV0FSTigiPT09PT09IGVuZCA9PT09PT09XG4iKTsKLQkJCWNmc19wYXVzZSgxMDAwICogSFopOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxMDAwICogSFopOwogCQl9CiAJCWNwdV9yZWxheCgpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaAppbmRleCA1ZGEzMWM1Li44NzkwNWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oCkBAIC05MSw4ICs5MSw4IEBACiAjaWZuZGVmIF9MVVNUUkVfSURMX0hfCiAjZGVmaW5lIF9MVVNUUkVfSURMX0hfCiAKLSNpZiAhZGVmaW5lZChMQVNTRVJUKSAmJiAhZGVmaW5lZChMUFU2NCkKLSNpbmNsdWRlIDxsaW51eC9saWJjZnMvbGliY2ZzLmg+IC8qIGZvciBMQVNTRVJULCBMUFVYNjQsIGV0YyAqLworI2lmICFkZWZpbmVkKExQVTY0KQorI2luY2x1ZGUgPGxpbnV4L2xpYmNmcy9saWJjZnMuaD4gLyogZm9yIExQVVg2NCwgZXRjICovCiAjZW5kaWYKIAogLyogRGVmbidzIHNoYXJlZCB3aXRoIHVzZXItc3BhY2UuICovCkBAIC0yMzIsNyArMjMyLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbGRfcmFuZ2Vfc2V0X3R5cGUoc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UsCiAJCQkJICAgICAgdW5zaWduZWQgZmxhZ3MpCiB7Ci0JTEFTU0VSVCghKGZsYWdzICYgfkxVX1NFUV9SQU5HRV9NQVNLKSk7CiAJcmFuZ2UtPmxzcl9mbGFncyB8PSBmbGFnczsKIH0KIApAQCAtMzUxLDcgKzM1MCw3IEBACiAJLyoqIEJpdGZpZWxkIGZvciBzdXBwb3J0ZWQgZGF0YSBpbiB0aGlzIHN0cnVjdHVyZS4gRm9yIGZ1dHVyZSB1c2UuICovCiAJX191MzIJc29tX2NvbXBhdDsKIAotCS8qKiBJbmNvbXBhdCBmZWF0dXJlIGxpc3QuIFRoZSBzdXBwb3J0ZWQgZmVhdHVyZSBtYXNrIGlzIGF2YWlsYWJlIGluCisJLyoqIEluY29tcGF0IGZlYXR1cmUgbGlzdC4gVGhlIHN1cHBvcnRlZCBmZWF0dXJlIG1hc2sgaXMgYXZhaWxhYmxlIGluCiAJICogU09NX0lOQ09NUEFUX1NVUFAgKi8KIAlfX3UzMglzb21faW5jb21wYXQ7CiAKQEAgLTYxNSw3ICs2MTQsNiBAQAogLyogZXh0cmFjdCBvc3QgaW5kZXggZnJvbSBJRElGIEZJRCAqLwogc3RhdGljIGlubGluZSBfX3UzMiBmaWRfaWRpZl9vc3RfaWR4KGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKLQlMQVNTRVJUKGZpZF9pc19pZGlmKGZpZCkpOwogCXJldHVybiAoZmlkX3NlcShmaWQpID4+IDE2KSAmIDB4ZmZmZjsKIH0KIApAQCAtODMzLDExICs4MzEsNiBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlkX2NwdV90b19sZShzdHJ1Y3QgbHVfZmlkICpkc3QsIGNvbnN0IHN0cnVjdCBsdV9maWQgKnNyYykKIHsKLQkvKiBjaGVjayB0aGF0IGFsbCBmaWVsZHMgYXJlIGNvbnZlcnRlZCAqLwotCUNMQVNTRVJUKHNpemVvZigqc3JjKSA9PQotCQkgc2l6ZW9mKGZpZF9zZXEoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF9vaWQoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF92ZXIoc3JjKSkpOwogCWRzdC0+Zl9zZXEgPSBjcHVfdG9fbGU2NChmaWRfc2VxKHNyYykpOwogCWRzdC0+Zl9vaWQgPSBjcHVfdG9fbGUzMihmaWRfb2lkKHNyYykpOwogCWRzdC0+Zl92ZXIgPSBjcHVfdG9fbGUzMihmaWRfdmVyKHNyYykpOwpAQCAtODQ1LDExICs4MzgsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlkX2xlX3RvX2NwdShzdHJ1Y3QgbHVfZmlkICpkc3QsIGNvbnN0IHN0cnVjdCBsdV9maWQgKnNyYykKIHsKLQkvKiBjaGVjayB0aGF0IGFsbCBmaWVsZHMgYXJlIGNvbnZlcnRlZCAqLwotCUNMQVNTRVJUKHNpemVvZigqc3JjKSA9PQotCQkgc2l6ZW9mKGZpZF9zZXEoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF9vaWQoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF92ZXIoc3JjKSkpOwogCWRzdC0+Zl9zZXEgPSBsZTY0X3RvX2NwdShmaWRfc2VxKHNyYykpOwogCWRzdC0+Zl9vaWQgPSBsZTMyX3RvX2NwdShmaWRfb2lkKHNyYykpOwogCWRzdC0+Zl92ZXIgPSBsZTMyX3RvX2NwdShmaWRfdmVyKHNyYykpOwpAQCAtODU3LDExICs4NDUsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlkX2NwdV90b19iZShzdHJ1Y3QgbHVfZmlkICpkc3QsIGNvbnN0IHN0cnVjdCBsdV9maWQgKnNyYykKIHsKLQkvKiBjaGVjayB0aGF0IGFsbCBmaWVsZHMgYXJlIGNvbnZlcnRlZCAqLwotCUNMQVNTRVJUKHNpemVvZigqc3JjKSA9PQotCQkgc2l6ZW9mKGZpZF9zZXEoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF9vaWQoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF92ZXIoc3JjKSkpOwogCWRzdC0+Zl9zZXEgPSBjcHVfdG9fYmU2NChmaWRfc2VxKHNyYykpOwogCWRzdC0+Zl9vaWQgPSBjcHVfdG9fYmUzMihmaWRfb2lkKHNyYykpOwogCWRzdC0+Zl92ZXIgPSBjcHVfdG9fYmUzMihmaWRfdmVyKHNyYykpOwpAQCAtODY5LDExICs4NTIsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlkX2JlX3RvX2NwdShzdHJ1Y3QgbHVfZmlkICpkc3QsIGNvbnN0IHN0cnVjdCBsdV9maWQgKnNyYykKIHsKLQkvKiBjaGVjayB0aGF0IGFsbCBmaWVsZHMgYXJlIGNvbnZlcnRlZCAqLwotCUNMQVNTRVJUKHNpemVvZigqc3JjKSA9PQotCQkgc2l6ZW9mKGZpZF9zZXEoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF9vaWQoc3JjKSkgKwotCQkgc2l6ZW9mKGZpZF92ZXIoc3JjKSkpOwogCWRzdC0+Zl9zZXEgPSBiZTY0X3RvX2NwdShmaWRfc2VxKHNyYykpOwogCWRzdC0+Zl9vaWQgPSBiZTMyX3RvX2NwdShmaWRfb2lkKHNyYykpOwogCWRzdC0+Zl92ZXIgPSBiZTMyX3RvX2NwdShmaWRfdmVyKHNyYykpOwpAQCAtODk3LDExICs4NzUsNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBsdV9maWRfZXEoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZjAsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmYxKQogewotCS8qIENoZWNrIHRoYXQgdGhlcmUgaXMgbm8gYWxpZ25tZW50IHBhZGRpbmcuICovCi0JQ0xBU1NFUlQoc2l6ZW9mKCpmMCkgPT0KLQkJIHNpemVvZihmMC0+Zl9zZXEpICsKLQkJIHNpemVvZihmMC0+Zl9vaWQpICsKLQkJIHNpemVvZihmMC0+Zl92ZXIpKTsKIAlyZXR1cm4gbWVtY21wKGYwLCBmMSwgc2l6ZW9mKCpmMCkpID09IDA7CiB9CiAKQEAgLTk2MCw3ICs5MzMsNyBAQAogCUxVREFfVFlQRQkJPSAweDAwMDIsCiAJTFVEQV82NEJJVEhBU0gJCT0gMHgwMDA0LAogCi0JLyogVGhlIGZvbGxvd2luZyBhdHRycyBhcmUgdXNlZCBmb3IgTURUIGludGVyYW5sIG9ubHksCisJLyogVGhlIGZvbGxvd2luZyBhdHRycyBhcmUgdXNlZCBmb3IgTURUIGludGVybmFsIG9ubHksCiAJICogbm90IHZpc2libGUgdG8gY2xpZW50ICovCiAKIAkvKiBWZXJpZnkgdGhlIGRpcmVudCBjb25zaXN0ZW5jeSAqLwpAQCAtMTMzMSw2ICsxMzA0LDkgQEAKICNkZWZpbmUgT0JEX0NPTk5FQ1RfTElHSFRXRUlHSFQgMHgxMDAwMDAwMDAwMDAwVUxMLyogbGlnaHR3ZWlnaHQgY29ubmVjdGlvbiAqLwogI2RlZmluZSBPQkRfQ09OTkVDVF9TSE9SVElPICAgICAweDIwMDAwMDAwMDAwMDBVTEwvKiBzaG9ydCBpbyAqLwogI2RlZmluZSBPQkRfQ09OTkVDVF9QSU5HTEVTUwkweDQwMDAwMDAwMDAwMDBVTEwvKiBwaW5ncyBub3QgcmVxdWlyZWQgKi8KKyNkZWZpbmUgT0JEX0NPTk5FQ1RfRkxPQ0tfREVBRAkweDgwMDAwMDAwMDAwMDBVTEwvKiBmbG9jayBkZWFkbG9jayBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgT0JEX0NPTk5FQ1RfRElTUF9TVFJJUEUgMHgxMDAwMDAwMDAwMDAwMFVMTC8qY3JlYXRlIHN0cmlwZSBkaXNwb3NpdGlvbiovCisKIC8qIFhYWCBSRUFETUUgWFhYOgogICogUGxlYXNlIERPIE5PVCBhZGQgZmxhZyB2YWx1ZXMgaGVyZSBiZWZvcmUgZmlyc3QgZW5zdXJpbmcgdGhhdCB0aGlzIHNhbWUKICAqIGZsYWcgdmFsdWUgaXMgbm90IGluIHVzZSBvbiBzb21lIG90aGVyIGJyYW5jaC4gIFBsZWFzZSBjbGVhciBhbnkgc3VjaApAQCAtMTM2OCw3ICsxMzQ0LDEwIEBACiAJCQkJT0JEX0NPTk5FQ1RfRUlOUFJPR1JFU1MgfCBcCiAJCQkJT0JEX0NPTk5FQ1RfTElHSFRXRUlHSFQgfCBPQkRfQ09OTkVDVF9VTUFTSyB8IFwKIAkJCQlPQkRfQ09OTkVDVF9MVkJfVFlQRSB8IE9CRF9DT05ORUNUX0xBWU9VVExPQ0sgfFwKLQkJCQlPQkRfQ09OTkVDVF9QSU5HTEVTUyB8IE9CRF9DT05ORUNUX01BWF9FQVNJWkUpCisJCQkJT0JEX0NPTk5FQ1RfUElOR0xFU1MgfCBPQkRfQ09OTkVDVF9NQVhfRUFTSVpFIHxcCisJCQkJT0JEX0NPTk5FQ1RfRkxPQ0tfREVBRCB8IFwKKwkJCQlPQkRfQ09OTkVDVF9ESVNQX1NUUklQRSkKKwogI2RlZmluZSBPU1RfQ09OTkVDVF9TVVBQT1JURUQgIChPQkRfQ09OTkVDVF9TUlZMT0NLIHwgT0JEX0NPTk5FQ1RfR1JBTlQgfCBcCiAJCQkJT0JEX0NPTk5FQ1RfUkVRUE9SVEFMIHwgT0JEX0NPTk5FQ1RfVkVSU0lPTiB8IFwKIAkJCQlPQkRfQ09OTkVDVF9UUlVOQ0xPQ0sgfCBPQkRfQ09OTkVDVF9JTkRFWCB8IFwKQEAgLTE3NzEsNyArMTc1MCw2IEBACiAJCQkgIE9CRF9NRF9GTEdJRCAgIHwgT0JEX01EX0ZMRkxBR1MgfCBPQkRfTURfRkxOTElOSyB8IFwKIAkJCSAgT0JEX01EX0ZMR0VORVIgfCBPQkRfTURfRkxSREVWICB8IE9CRF9NRF9GTEdST1VQKQogCi0jZGVmaW5lIE9CRF9NRF9GTFhBVFRSTE9DS0VEIE9CRF9NRF9GTEdFVEFUVFJMT0NLCiAjZGVmaW5lIE9CRF9NRF9GTFhBVFRSQUxMIChPQkRfTURfRkxYQVRUUiB8IE9CRF9NRF9GTFhBVFRSTFMpCiAKIC8qIGRvbid0IGZvcmdldCBvYmRvX2ZpZCB3aGljaCBpcyB3YXkgZG93biBhdCB0aGUgYm90dG9tIHNvIGl0IGNhbgpAQCAtMjEzNCwxOSArMjExMiwzMiBAQAogI2RlZmluZSBESVNQX0xPT0tVUF9QT1MgICAgICAweDAwMDAwMDA4CiAjZGVmaW5lIERJU1BfT1BFTl9DUkVBVEUgICAgIDB4MDAwMDAwMTAKICNkZWZpbmUgRElTUF9PUEVOX09QRU4gICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBESVNQX0VOUV9DT01QTEVURSAgICAweDAwNDAwMDAwCisjZGVmaW5lIERJU1BfRU5RX0NPTVBMRVRFICAgIDB4MDA0MDAwMDAJCS8qIG9ic29sZXRlIGFuZCB1bnVzZWQgKi8KICNkZWZpbmUgRElTUF9FTlFfT1BFTl9SRUYgICAgMHgwMDgwMDAwMAogI2RlZmluZSBESVNQX0VOUV9DUkVBVEVfUkVGICAweDAxMDAwMDAwCiAjZGVmaW5lIERJU1BfT1BFTl9MT0NLICAgICAgIDB4MDIwMDAwMDAKICNkZWZpbmUgRElTUF9PUEVOX0xFQVNFICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBESVNQX09QRU5fU1RSSVBFICAgICAweDA4MDAwMDAwCiAKIC8qIElOT0RFIExPQ0sgUEFSVFMgKi8KLSNkZWZpbmUgTURTX0lOT0RFTE9DS19MT09LVVAgMHgwMDAwMDEgICAgICAgLyogZGVudHJ5LCBtb2RlLCBvd25lciwgZ3JvdXAgKi8KLSNkZWZpbmUgTURTX0lOT0RFTE9DS19VUERBVEUgMHgwMDAwMDIgICAgICAgLyogc2l6ZSwgbGlua3MsIHRpbWVzdGFtcHMgKi8KLSNkZWZpbmUgTURTX0lOT0RFTE9DS19PUEVOICAgMHgwMDAwMDQgICAgICAgLyogRm9yIG9wZW5lZCBmaWxlcyAqLwotI2RlZmluZSBNRFNfSU5PREVMT0NLX0xBWU9VVCAweDAwMDAwOCAgICAgICAvKiBmb3IgbGF5b3V0ICovCi0jZGVmaW5lIE1EU19JTk9ERUxPQ0tfUEVSTSAgIDB4MDAwMDEwICAgICAgIC8qIGZvciBwZXJtaXNzaW9uICovCi0jZGVmaW5lIE1EU19JTk9ERUxPQ0tfWEFUVFIgIDB4MDAwMDIwICAgICAgIC8qIGV4dGVuZGVkIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgTURTX0lOT0RFTE9DS19MT09LVVAgMHgwMDAwMDEJLyogRm9yIG5hbWVzcGFjZSwgZGVudHJ5IGV0YywgYW5kIGFsc28KKwkJCQkJICogd2FzIHVzZWQgdG8gcHJvdGVjdCBwZXJtaXNzaW9uIChtb2RlLAorCQkJCQkgKiBvd25lciwgZ3JvdXAgZXRjKSBiZWZvcmUgMi40LiAqLworI2RlZmluZSBNRFNfSU5PREVMT0NLX1VQREFURSAweDAwMDAwMgkvKiBzaXplLCBsaW5rcywgdGltZXN0YW1wcyAqLworI2RlZmluZSBNRFNfSU5PREVMT0NLX09QRU4gICAweDAwMDAwNAkvKiBGb3Igb3BlbmVkIGZpbGVzICovCisjZGVmaW5lIE1EU19JTk9ERUxPQ0tfTEFZT1VUIDB4MDAwMDA4CS8qIGZvciBsYXlvdXQgKi8KKworLyogVGhlIFBFUk0gYml0IGlzIGFkZGVkIGludCAyLjQsIGFuZCBpdCBpcyB1c2VkIHRvIHByb3RlY3QgcGVybWlzc2lvbihtb2RlLAorICogb3duZXIsIGdyb3VwLCBhY2wgZXRjKSwgc28gdG8gc2VwYXJhdGUgdGhlIHBlcm1pc3Npb24gZnJvbSBMT09LVVAgbG9jay4KKyAqIEJlY2F1c2UgZm9yIHJlbW90ZSBkaXJlY3RvcmllcyhpbiBETkUpLCB0aGVzZSBsb2NrcyB3aWxsIGJlIGdyYW50ZWQgYnkKKyAqIGRpZmZlcmVudCBNRFRzKGRpZmZlcmVudCBsZGxtIG5hbWVzcGFjZSkuCisgKgorICogRm9yIGxvY2FsIGRpcmVjdG9yeSwgTURUIHdpbGwgYWx3YXlzIGdyYW50IFVQREFURV9MT0NLfFBFUk1fTE9DSyB0b2dldGhlci4KKyAqIEZvciBSZW1vdGUgZGlyZWN0b3J5LCB0aGUgbWFzdGVyIE1EVCwgd2hlcmUgdGhlIHJlbW90ZSBkaXJlY3RvcnkgaXMsIHdpbGwKKyAqIGdyYW50IFVQREFURV9MT0NLfFBFUk1fTE9DSywgYW5kIHRoZSByZW1vdGUgTURULCB3aGVyZSB0aGUgbmFtZSBlbnRyeSBpcywKKyAqIHdpbGwgZ3JhbnQgTE9PS1VQX0xPQ0suICovCisjZGVmaW5lIE1EU19JTk9ERUxPQ0tfUEVSTSAgIDB4MDAwMDEwCisjZGVmaW5lIE1EU19JTk9ERUxPQ0tfWEFUVFIgIDB4MDAwMDIwCS8qIGV4dGVuZGVkIGF0dHJpYnV0ZXMgKi8KIAogI2RlZmluZSBNRFNfSU5PREVMT0NLX01BWFNISUZUIDUKIC8qIFRoaXMgRlVMTCBsb2NrIGlzIHVzZWZ1bCB0byB0YWtlIG9uIHVubGluayBzb3J0IG9mIG9wZXJhdGlvbnMgKi8KQEAgLTI1OTUsNyArMjU4Niw3IEBACiAgKiBEbyBOT1QgY2hhbmdlIHRoZSBzaXplIG9mIHZhcmlvdXMgbWVtYmVycywgb3RoZXJ3aXNlIHRoZSB2YWx1ZQogICogd2lsbCBiZSBicm9rZW4gaW4gbHVzdHJlX3N3YWJfbWR0X3JlY19yZWludCgpLgogICoKLSAqIElmIHlvdSBhZGQgbmV3IG1lbWJlcnMgaW4gb3RoZXIgbWR0X3JlaW50X3h4eCBzdHJ1Y3RyZXMgYW5kIG5lZWQgdG8gdXNlIHRoZQorICogSWYgeW91IGFkZCBuZXcgbWVtYmVycyBpbiBvdGhlciBtZHRfcmVpbnRfeHh4IHN0cnVjdHVyZXMgYW5kIG5lZWQgdG8gdXNlIHRoZQogICogcnJfcGFkZGluZ194IGZpZWxkcywgdGhlbiB1cGRhdGUgbHVzdHJlX3N3YWJfbWR0X3JlY19yZWludCgpIGFsc28uCiAgKi8KIHN0cnVjdCBtZHRfcmVjX3JlaW50IHsKQEAgLTMzMjgsOSArMzMxOSwxMCBAQAogI2RlZmluZSBvX2dyYW50X3VzZWQgb19kYXRhX3ZlcnNpb24KIAogc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9zZXRfd2lyZV9vYmRvKHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2QsCi0JCQkJCXN0cnVjdCBvYmRvICp3b2Jkbywgc3RydWN0IG9iZG8gKmxvYmRvKQorCQkJCQlzdHJ1Y3Qgb2JkbyAqd29iZG8sCisJCQkJCWNvbnN0IHN0cnVjdCBvYmRvICpsb2JkbykKIHsKLQltZW1jcHkod29iZG8sIGxvYmRvLCBzaXplb2YoKmxvYmRvKSk7CisJKndvYmRvID0gKmxvYmRvOwogCXdvYmRvLT5vX2ZsYWdzICY9IH5PQkRfRkxfTE9DQUxfTUFTSzsKIAlpZiAob2NkID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTMzNDUsMTYgKzMzMzcsMTUgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9nZXRfd2lyZV9vYmRvKHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2QsCi0JCQkJCXN0cnVjdCBvYmRvICpsb2Jkbywgc3RydWN0IG9iZG8gKndvYmRvKQorCQkJCQlzdHJ1Y3Qgb2JkbyAqbG9iZG8sCisJCQkJCWNvbnN0IHN0cnVjdCBvYmRvICp3b2JkbykKIHsKIAlvYmRfZmxhZyBsb2NhbF9mbGFncyA9IDA7CiAKIAlpZiAobG9iZG8tPm9fdmFsaWQgJiBPQkRfTURfRkxGTEFHUykKIAkJIGxvY2FsX2ZsYWdzID0gbG9iZG8tPm9fZmxhZ3MgJiBPQkRfRkxfTE9DQUxfTUFTSzsKIAotCUxBU1NFUlQoISh3b2Jkby0+b19mbGFncyAmIE9CRF9GTF9MT0NBTF9NQVNLKSk7Ci0KLQltZW1jcHkobG9iZG8sIHdvYmRvLCBzaXplb2YoKmxvYmRvKSk7CisJKmxvYmRvID0gKndvYmRvOwogCWlmIChsb2NhbF9mbGFncyAhPSAwKSB7CiAJCWxvYmRvLT5vX3ZhbGlkIHw9IE9CRF9NRF9GTEZMQUdTOwogCQlsb2Jkby0+b19mbGFncyAmPSB+T0JEX0ZMX0xPQ0FMX01BU0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaAppbmRleCA3ODkzZDgzLi5mNWYzNjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmgKQEAgLTI2NSwxMyArMjY1LDExIEBACiAKICNkZWZpbmUgTUFYX09CRF9OQU1FIDEyOCAvKiBJZiB0aGlzIGNoYW5nZXMsIGEgTkVXIGlvY3RsIG11c3QgYmUgYWRkZWQgKi8KIAotLyogSG9wZWZ1bGx5IE9fTE9WX0RFTEFZX0NSRUFURSBkb2VzIG5vdCBjb25mbGljdCB3aXRoIHN0YW5kYXJkIE9feHh4IGZsYWdzLgotICogUHJldmlvdXNseSBpdCB3YXMgZGVmaW5lZCBhcyAwMTAwMDAwMDAwIGFuZCBjb25mbGljdHMgd2l0aCBGTU9ERV9OT05PVElGWQotICogd2hpY2ggd2FzIGFkZGVkIHNpbmNlIGtlcm5lbCAyLjYuMzYsIHNvIHdlIHJlZGVmaW5lIGl0IGFzIDAyMDAwMDAwMC4KLSAqIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBvbGQgdmVyc2lvbidzIHN0YXRpY2FsbHkgbGlua2VkIGJpbmFyeSwgZmluYWxseSB3ZQotICogZGVmaW5lIGl0IGFzICgwMjAwMDAwMDAgfCAwMTAwMDAwMDAwKS4KLSAqICovCi0jZGVmaW5lIE9fTE9WX0RFTEFZX0NSRUFURSAgICAgIDAxMjAwMDAwMDAKKy8qIERlZmluZSBPX0xPVl9ERUxBWV9DUkVBVEUgdG8gYmUgYSBtYXNrIHRoYXQgaXMgbm90IHVzZWZ1bCBmb3IgcmVndWxhcgorICogZmlsZXMsIGJ1dCBhcmUgdW5saWtlbHkgdG8gYmUgdXNlZCBpbiBwcmFjdGljZSBhbmQgYXJlIG5vdCBoYXJtZnVsIGlmCisgKiB1c2VkIGluY29ycmVjdGx5LiAgT19OT0NUVFkgYW5kIEZBU1lOQyBhcmUgb25seSBtZWFuaW5nZnVsIGZvciBjaGFyYWN0ZXIKKyAqIGRldmljZXMgYW5kIGFyZSBzYWZlIGZvciB1c2Ugb24gbmV3IGZpbGVzIChTZWUgTFUtODEyLCBMVS00MjA5KS4gKi8KKyNkZWZpbmUgT19MT1ZfREVMQVlfQ1JFQVRFCShPX05PQ1RUWSB8IEZBU1lOQykKIAogI2RlZmluZSBMTF9GSUxFX0lHTk9SRV9MT0NLICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIExMX0ZJTEVfR1JPVVBfTE9DS0VEICAgIDB4MDAwMDAwMDIKQEAgLTMwMCw3ICsyOTgsNyBAQAogI2RlZmluZSBMT1ZfTUFYX1NUUklQRV9DT1VOVF9PTEQgMTYwCiAvKiBUaGlzIGNhbGN1bGF0aW9uIGlzIGNyYWZ0ZWQgc28gdGhhdCBpbnB1dCBvZiA0MDk2IHdpbGwgcmVzdWx0IGluIDE2MAogICogd2hpY2ggaW4gdHVybiBpcyBlcXVhbCB0byBvbGQgbWF4aW1hbCBzdHJpcGUgY291bnQuCi0gKiBYWFg6IEluIGZhY3QgdGhpcyBpcyB0b28gc2ltcGlmaWVkIGZvciBub3csIHdoYXQgaXQgYWxzbyBuZWVkIGlzIHRvIGdldAorICogWFhYOiBJbiBmYWN0IHRoaXMgaXMgdG9vIHNpbXBsaWZpZWQgZm9yIG5vdywgd2hhdCBpdCBhbHNvIG5lZWQgaXMgdG8gZ2V0CiAgKiBlYV90eXBlIGFyZ3VtZW50IHRvIGNsZWFybHkga25vdyBob3cgbXVjaCBzcGFjZSBlYWNoIHN0cmlwZSBjb25zdW1lcy4KICAqCiAgKiBUaGUgbGltaXQgb2YgMTIgcGFnZXMgaXMgc29tZXdoYXQgYXJiaXRyYXJ5LCBidXQgaXMgYSByZWFzb25hYmx5IGxhcmdlCkBAIC05MzAsNyArOTI4LDcgQEAKIAogLyoKICAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgY3VycmVudCBpbi1wcm9ncmVzcyBhY3Rpb24gZm9yIGEgZmlsZS4KLSAqIGl0IGlzIHJldHVuZWQgdG8gdXNlciBzcGFjZSBhbmQgc2VuZCBvdmVyIHRoZSB3aXJlCisgKiBpdCBpcyByZXR1cm5lZCB0byB1c2VyIHNwYWNlIGFuZCBzZW5kIG92ZXIgdGhlIHdpcmUKICAqLwogc3RydWN0IGhzbV9jdXJyZW50X2FjdGlvbiB7CiAJLyoqICBUaGUgY3VycmVudCB1bmRlcmdvaW5nIGFjdGlvbiwgaWYgdGhlcmUgaXMgb25lICovCkBAIC0xMTU5LDEyICsxMTU3LDYgQEAKIAlfX3UzMgkJCXBhZGRpbmc7CiB9OwogCi0vKioKLSAqIFVzZSBieSBjb3B5dG9vbCBkdXJpbmcgYW55IGhzbSByZXF1ZXN0IHRoZXkgaGFuZGxlZC4KLSAqIFRoaXMgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIGJ5IGxsYXBpX2hzbV9jb3B5X3N0YXJ0KCkKLSAqIHdoaWNoIGlzIGFuIGhlbHBlciBvdmVyIHRoZSBpb2N0bCgpIGludGVyZmFjZQotICogU3RvcmUgTHVzdHJlLCBpbnRlcm5hbCB1c2Ugb25seSwgZGF0YS4KLSAqLwogc3RydWN0IGhzbV9jb3B5IHsKIAlfX3U2NAkJCWhjX2RhdGFfdmVyc2lvbjsKIAlfX3UxNgkJCWhjX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jZmcuaAppbmRleCBlMTRhNWY2Li4zNjgwNjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jZmcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jZmcuaApAQCAtODgsNiArODgsOCBAQAogCUxDRkdfU0VUX0xETE1fVElNRU9VVCAgID0gMHgwMGNlMDMwLCAvKio8IHNldCBsZGxtX3RpbWVvdXQgKi8KIAlMQ0ZHX1BSRV9DTEVBTlVQCT0gMHgwMGNmMDMxLCAvKio8IGNhbGwgdHlwZS1zcGVjaWZpYyBwcmUKIAkJCQkJICAgICAgKiBjbGVhbnVwIGNsZWFudXAgKi8KKwlMQ0ZHX1NFVF9QQVJBTQkJPSAweDAwY2UwMzIsIC8qKjwgdXNlIHNldF9wYXJhbSBzeW50YXggdG8gc2V0CisJCQkJCSAgICAgICphIHByb2MgcGFyYW1ldGVycyAqLwogfTsKIAogc3RydWN0IGx1c3RyZV9jZmdfYnVmcyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kaXNrLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kaXNrLmgKaW5kZXggMWRlOWE4Yi4uYWMwODE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGlzay5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2Rpc2suaApAQCAtOTksNiArOTksOCBAQAogI2RlZmluZSBMRERfRl9JUl9DQVBBQkxFICAgIDB4MjAwMAogLyoqIHRoZSBNR1MgcmVmdXNlZCB0byByZWdpc3RlciB0aGUgdGFyZ2V0LiAqLwogI2RlZmluZSBMRERfRl9FUlJPUgkgMHg0MDAwCisvKiogcHJvY2VzcyBhdCBsY3RsIGNvbmZfcGFyYW0gKi8KKyNkZWZpbmUgTEREX0ZfUEFSQU0yCQkweDgwMDAKIAogLyogb3BjIGZvciB0YXJnZXQgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTEREX0ZfT1BDX1JFRyAgIDB4MTAwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKaW5kZXggZWM0YmI1ZS4uM2UyNWYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKQEAgLTMzMCw3ICszMzAsNyBAQAogfTsKIAogdHlwZWRlZiBlbnVtIHsKLQkvKiogaW52YWxpZGUgdHlwZSAqLworCS8qKiBpbnZhbGlkIHR5cGUgKi8KIAlMRExNX05TX1RZUEVfVU5LTk9XTiAgICA9IDAsCiAJLyoqIG1kYyBuYW1lc3BhY2UgKi8KIAlMRExNX05TX1RZUEVfTURDLApAQCAtMTE4NSw3ICsxMTg1LDcgQEAKIAogLyoqCiAgKiBVcGRhdGUgTG9jayBWYWx1ZSBCbG9jayBPcGVyYXRpb25zIChMVkJPKSBvbiBhIHJlc291cmNlIHRha2luZyBpbnRvIGFjY291bnQKLSAqIGRhdGEgZnJvbSByZXFlc3QgXGEgcgorICogZGF0YSBmcm9tIHJlcXVlc3QgXGEgcgogICovCiBzdGF0aWMgaW5saW5lIGludCBsZGxtX3Jlc19sdmJvX3VwZGF0ZShzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqcmVzLAogCQkJCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnIsIGludCBpbmNyZWFzZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtX2ZsYWdzLmgKaW5kZXggNzU3MTZmMS4uMTZkY2RiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtX2ZsYWdzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtX2ZsYWdzLmgKQEAgLTM1LDEwICszNSwxMCBAQAogI2lmbmRlZiBMRExNX0FMTF9GTEFHU19NQVNLCiAKIC8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJhbGxfZmxhZ3MiIGJpdHMgKi8KLSNkZWZpbmUgTERMTV9GTF9BTExfRkxBR1NfTUFTSyAgICAgICAgICAweDAwRkZGRkZGQzA4RjEzMkZVTEwKKyNkZWZpbmUgTERMTV9GTF9BTExfRkxBR1NfTUFTSyAgICAgICAgICAweDAwRkZGRkZGQzA4RjkzMkZVTEwKIAogLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImFzdCIgYml0cyAqLwotI2RlZmluZSBMRExNX0ZMX0FTVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDA4MDAwMDAwMFVMTAorI2RlZmluZSBMRExNX0ZMX0FTVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDA4MDAwODAwMFVMTAogCiAvKiogbF9mbGFncyBiaXRzIG1hcmtlZCBhcyAiYmxvY2tlZCIgYml0cyAqLwogI2RlZmluZSBMRExNX0ZMX0JMT0NLRURfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwRVVMTApAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBMRExNX0ZMX0xPQ0FMX09OTFlfTUFTSyAgICAgICAgIDB4MDBGRkZGRkYwMDAwMDAwMFVMTAogCiAvKiogbF9mbGFncyBiaXRzIG1hcmtlZCBhcyAib25fd2lyZSIgYml0cyAqLwotI2RlZmluZSBMRExNX0ZMX09OX1dJUkVfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMDBDMDhGMTMyRlVMTAorI2RlZmluZSBMRExNX0ZMX09OX1dJUkVfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMDBDMDhGOTMyRlVMTAogCiAvKiogZXh0ZW50LCBtb2RlLCBvciByZXNvdXJjZSBjaGFuZ2VkICovCiAjZGVmaW5lIExETE1fRkxfTE9DS19DSEFOR0VEICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxVUxMIC8vIGJpdCAgIDAKQEAgLTExNCw2ICsxMTQsMTIgQEAKICNkZWZpbmUgbGRsbV9zZXRfaGFzX2ludGVudChfbCkgICAgICAgICBMRExNX1NFVF9GTEFHKCggIF9sKSwgMVVMTCA8PCAxMikKICNkZWZpbmUgbGRsbV9jbGVhcl9oYXNfaW50ZW50KF9sKSAgICAgICBMRExNX0NMRUFSX0ZMQUcoKF9sKSwgMVVMTCA8PCAxMikKIAorLyoqIGZsb2NrIGRlYWRsb2NrIGRldGVjdGVkICovCisjZGVmaW5lIExETE1fRkxfRkxPQ0tfREVBRExPQ0sgICAgICAgICAgMHgwMDAwMDAwMDAwMDA4MDAwVUxMIC8qIGJpdCAgMTUgKi8KKyNkZWZpbmUgbGRsbV9pc19mbG9ja19kZWFkbG9jayhfbCkgICAgICBMRExNX1RFU1RfRkxBRygoX2wpLCAxVUxMIDw8IDE1KQorI2RlZmluZSBsZGxtX3NldF9mbG9ja19kZWFkbG9jayhfbCkgICAgIExETE1fU0VUX0ZMQUcoKF9sKSwgMVVMTCA8PCAxNSkKKyNkZWZpbmUgbGRsbV9jbGVhcl9mbG9ja19kZWFkbG9jayhfbCkgICBMRExNX0NMRUFSX0ZMQUcoKF9sKSwgMVVMTCA8PCAxNSkKKwogLyoqIGRpc2NhcmQgKG5vIHdyaXRlYmFjaykgb24gY2FuY2VsICovCiAjZGVmaW5lIExETE1fRkxfRElTQ0FSRF9EQVRBICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDEwMDAwVUxMIC8vIGJpdCAgMTYKICNkZWZpbmUgbGRsbV9pc19kaXNjYXJkX2RhdGEoX2wpICAgICAgICBMRExNX1RFU1RfRkxBRygoIF9sKSwgMVVMTCA8PCAxNikKQEAgLTE0MSw3ICsxNDcsNyBAQAogI2RlZmluZSBsZGxtX2NsZWFyX3Rlc3RfbG9jayhfbCkgICAgICAgIExETE1fQ0xFQVJfRkxBRygoX2wpLCAxVUxMIDw8IDE5KQogCiAvKioKLSAqIEltbWVkaWF0ZWxseSBjYW5jZWwgc3VjaCBsb2NrcyB3aGVuIHRoZXkgYmxvY2sgc29tZSBvdGhlciBsb2Nrcy4gU2VuZAorICogSW1tZWRpYXRlbHkgY2FuY2VsIHN1Y2ggbG9ja3Mgd2hlbiB0aGV5IGJsb2NrIHNvbWUgb3RoZXIgbG9ja3MuIFNlbmQKICAqIGNhbmNlbCBub3RpZmljYXRpb24gdG8gb3JpZ2luYWwgbG9jayBob2xkZXIsIGJ1dCBleHBlY3Qgbm8gcmVwbHkuIFRoaXMKICAqIGlzIGZvciBjbGllbnRzIChsaWtlIGxpYmx1c3RyZSkgdGhhdCBjYW5ub3QgYmUgZXhwZWN0ZWQgdG8gcmVsaWFibHkKICAqIHJlc3BvbnNlIHRvIGJsb2NraW5nIEFTVC4gKi8KQEAgLTI0Miw3ICsyNDgsNyBAQAogCiAvKioKICAqIEEgbG9jayBjb250cmlidXRlcyB0byB0aGUga25vd24gbWluaW11bSBzaXplIChLTVMpIGNhbGN1bGF0aW9uIHVudGlsIGl0Ci0gKiBoYXMgZmluaXNoZWQgdGhlIHBhcnQgb2YgaXRzIGNhbmNlbGF0aW9uIHRoYXQgcGVyZm9ybXMgd3JpdGUgYmFjayBvbiBpdHMKKyAqIGhhcyBmaW5pc2hlZCB0aGUgcGFydCBvZiBpdHMgY2FuY2VsbGF0aW9uIHRoYXQgcGVyZm9ybXMgd3JpdGUgYmFjayBvbiBpdHMKICAqIGRpcnR5IHBhZ2VzLiAgSXQgY2FuIHJlbWFpbiBvbiB0aGUgZ3JhbnRlZCBsaXN0IGR1cmluZyB0aGlzIHdob2xlIHRpbWUuCiAgKiBUaHJlYWRzIHJhY2luZyB0byB1cGRhdGUgdGhlIEtNUyBhZnRlciBwZXJmb3JtaW5nIHRoZWlyIHdyaXRlYmFjayBuZWVkCiAgKiB0byBrbm93IHRvIGV4Y2x1ZGUgZWFjaCBvdGhlcidzIGxvY2tzIGZyb20gdGhlIGNhbGN1bGF0aW9uIGFzIHRoZXkgd2FsawpAQCAtMzkwLDYgKzM5Niw3IEBACiBzdGF0aWMgaW50IGhmX2x1c3RyZV9sZGxtX2ZsX3JlcGxheSAgICAgICAgICAgICAgPSAtMTsKIHN0YXRpYyBpbnQgaGZfbHVzdHJlX2xkbG1fZmxfaW50ZW50X29ubHkgICAgICAgICA9IC0xOwogc3RhdGljIGludCBoZl9sdXN0cmVfbGRsbV9mbF9oYXNfaW50ZW50ICAgICAgICAgID0gLTE7CitzdGF0aWMgaW50IGhmX2x1c3RyZV9sZGxtX2ZsX2Zsb2NrX2RlYWRsb2NrICAgICAgPSAtMTsKIHN0YXRpYyBpbnQgaGZfbHVzdHJlX2xkbG1fZmxfZGlzY2FyZF9kYXRhICAgICAgICA9IC0xOwogc3RhdGljIGludCBoZl9sdXN0cmVfbGRsbV9mbF9ub190aW1lb3V0ICAgICAgICAgID0gLTE7CiBzdGF0aWMgaW50IGhmX2x1c3RyZV9sZGxtX2ZsX2Jsb2NrX25vd2FpdCAgICAgICAgPSAtMTsKQEAgLTQzMSw2ICs0MzgsNyBAQAogCXtMRExNX0ZMX1JFUExBWSwgICAgICAgICAgICAgICJMRExNX0ZMX1JFUExBWSJ9LAogCXtMRExNX0ZMX0lOVEVOVF9PTkxZLCAgICAgICAgICJMRExNX0ZMX0lOVEVOVF9PTkxZIn0sCiAJe0xETE1fRkxfSEFTX0lOVEVOVCwgICAgICAgICAgIkxETE1fRkxfSEFTX0lOVEVOVCJ9LAorCXtMRExNX0ZMX0ZMT0NLX0RFQURMT0NLLCAgICAgICJMRExNX0ZMX0ZMT0NLX0RFQURMT0NLIn0sCiAJe0xETE1fRkxfRElTQ0FSRF9EQVRBLCAgICAgICAgIkxETE1fRkxfRElTQ0FSRF9EQVRBIn0sCiAJe0xETE1fRkxfTk9fVElNRU9VVCwgICAgICAgICAgIkxETE1fRkxfTk9fVElNRU9VVCJ9LAogCXtMRExNX0ZMX0JMT0NLX05PV0FJVCwgICAgICAgICJMRExNX0ZMX0JMT0NLX05PV0FJVCJ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZXhwb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9leHBvcnQuaAppbmRleCAyZmViMzhiLi4xMDNmN2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9leHBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9leHBvcnQuaApAQCAtMTkyLDkgKzE5Miw5IEBACiAJc3RydWN0IG9iZF9pbXBvcnQJKmV4cF9pbXBfcmV2ZXJzZTsKIAlzdHJ1Y3QgbmlkX3N0YXQJICAqZXhwX25pZF9zdGF0czsKIAlzdHJ1Y3QgbHByb2Nmc19zdGF0cyAgICAgKmV4cF9tZF9zdGF0czsKLQkvKiogQWN0aXZlIGNvbm5ldGlvbiAqLworCS8qKiBBY3RpdmUgY29ubmVjdGlvbiAqLwogCXN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqZXhwX2Nvbm5lY3Rpb247Ci0JLyoqIENvbm5lY3Rpb24gY291bnQgdmFsdWUgZnJvbSBsYXN0IHN1Y2Nlc2Z1bCByZWNvbm5lY3QgcnBjICovCisJLyoqIENvbm5lY3Rpb24gY291bnQgdmFsdWUgZnJvbSBsYXN0IHN1Y2Nlc3NmdWwgcmVjb25uZWN0IHJwYyAqLwogCV9fdTMyCQkgICAgIGV4cF9jb25uX2NudDsKIAkvKiogSGFzaCBsaXN0IG9mIGFsbCBsZGxtIGxvY2tzIGdyYW50ZWQgb24gdGhpcyBleHBvcnQgKi8KIAlzdHJ1Y3QgY2ZzX2hhc2gJICAgICAgICpleHBfbG9ja19oYXNoOwpAQCAtMzgwLDYgKzM4MCwyMyBAQAogCQlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBpbmxpbmUgX191NjQgZXhwX2Nvbm5lY3RfaWJpdHMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCkKK3sKKwlzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkOworCisJb2NkID0gJmV4cC0+ZXhwX2Nvbm5lY3RfZGF0YTsKKwlyZXR1cm4gb2NkLT5vY2RfaWJpdHNfa25vd247Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpbXBfY29ubmVjdF9kaXNwX3N0cmlwZShzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKQoreworCXN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2Q7CisKKwlMQVNTRVJUKGltcCAhPSBOVUxMKTsKKwlvY2QgPSAmaW1wLT5pbXBfY29ubmVjdF9kYXRhOworCXJldHVybiBvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfRElTUF9TVFJJUEU7Cit9CisKIGV4dGVybiBzdHJ1Y3Qgb2JkX2V4cG9ydCAqY2xhc3NfY29ubjJleHBvcnQoc3RydWN0IGx1c3RyZV9oYW5kbGUgKmNvbm4pOwogZXh0ZXJuIHN0cnVjdCBvYmRfZGV2aWNlICpjbGFzc19jb25uMm9iZChzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqY29ubik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZmlkLmgKaW5kZXggODRhODk3ZS4uNWU3YjMxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZmlkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZmlkLmgKQEAgLTMzOSw3ICszMzksNyBAQAogCXN0cnVjdCBtdXRleAkJbGNzX211dGV4OwogCiAJLyoKLQkgKiBSYW5nZSBvZiBhbGxvd2VkIGZvciBhbGxvY2F0aW9uIHNlcXVlY2VzLiBXaGVuIHVzaW5nIGx1X2NsaWVudF9zZXEgb24KKwkgKiBSYW5nZSBvZiBhbGxvd2VkIGZvciBhbGxvY2F0aW9uIHNlcXVlbmNlcy4gV2hlbiB1c2luZyBsdV9jbGllbnRfc2VxIG9uCiAJICogY2xpZW50cywgdGhpcyBjb250YWlucyBtZXRhLXNlcXVlbmNlIHJhbmdlLiBBbmQgZm9yIHNlcnZlcnMgdGhpcwogCSAqIGNvbnRhaW5zIHN1cGVyLXNlcXVlbmNlIHJhbmdlLgogCSAqLwpAQCAtMzk4LDcgKzM5OCw3IEBACiAJLyogTFVTVFJFX1NFUV9TRVJWRVIgb3IgTFVTVFJFX1NFUV9DT05UUk9MTEVSICovCiAJZW51bSBsdV9tZ3JfdHlwZSAgICAgICBsc3NfdHlwZTsKIAotCS8qIENsaWVudCBpbnRlcmFmY2UgdG8gcmVxdWVzdCBjb250cm9sbGVyICovCisJLyogQ2xpZW50IGludGVyZmFjZSB0byByZXF1ZXN0IGNvbnRyb2xsZXIgKi8KIAlzdHJ1Y3QgbHVfY2xpZW50X3NlcSAgICpsc3NfY2xpOwogCiAJLyogTXV0ZXggZm9yIHByb3RlY3RpbmcgYWxsb2NhdGlvbiAqLwpAQCAtNTY4LDE0ICs1NjgsMTQgQEAKICAqIGZpbmFsbHksIHdoZW4gd2UgcmVwbGFjZSBvc3RfaWQgd2l0aCBGSUQgaW4gZGF0YSBzdGFjay4KICAqCiAgKiBDdXJyZW50bHksIHJlc2lkIGZyb20gdGhlIG9sZCBjbGllbnQsIHdob3NlIHJlc1swXSA9IG9iamVjdF9pZCwKLSAqIHJlc1sxXSA9IG9iamVjdF9zZXEsIGlzIGp1c3Qgb3Bvc2l0ZSB3aXRoIE1ldGF0ZGF0YQorICogcmVzWzFdID0gb2JqZWN0X3NlcSwgaXMganVzdCBvcHBvc2l0ZSB3aXRoIE1ldGF0ZGF0YQogICogcmVzaWQsIHdoZXJlLCByZXNbMF0gPSBmaWQtPmZfc2VxLCByZXNbMV0gPSBmaWQtPmZfb2lkLgotICogVG8gdW5pZml5IHRoZSByZXNpZCBpZGVudGlmaWNhdGlvbiwgd2Ugd2lsbCByZXZlcnNlIHRoZSBkYXRhCisgKiBUbyB1bmlmeSB0aGUgcmVzaWQgaWRlbnRpZmljYXRpb24sIHdlIHdpbGwgcmV2ZXJzZSB0aGUgZGF0YQogICogcmVzaWQgdG8ga2VlcCBpdCBzYW1lIHdpdGggTWV0YWRhdGEgcmVzaWQsIGkuZS4KICAqCiAgKiBGb3IgcmVzaWQgZnJvbSB0aGUgb2xkIGNsaWVudCwKICAqICAgIHJlc1swXSA9IG9iamlkLCAgcmVzWzFdID0gMCwgc3RpbGwga2VlcCB0aGUgb3JpZ2luYWwgb3JkZXIsCi0gKiAgICBmb3IgY29tcGF0aWJsaXR5LgorICogICAgZm9yIGNvbXBhdGliaWxpdHkuCiAgKgogICogRm9yIG5ldyByZXNpZAogICogICAgcmVzIHdpbGwgYmUgYnVpbHQgZnJvbSBub3JtYWwgRklEIGRpcmVjdGx5LCBpLmUuIHJlc1swXSA9IGZfc2VxLApAQCAtNjg1LDcgKzY4NSw3IEBACiB7CiAJLyogYWxsIG9iamVjdHMgd2l0aCBzYW1lIGlkIGFuZCBkaWZmZXJlbnQgdmVyc2lvbnMgd2lsbCBiZWxvbmcgdG8gc2FtZQogCSAqIGNvbGxpc2lvbnMgbGlzdC4gKi8KLQlyZXR1cm4gY2ZzX2hhc2hfbG9uZyhmaWRfZmxhdHRlbihmKSwgYml0cyk7CisJcmV0dXJuIGhhc2hfbG9uZyhmaWRfZmxhdHRlbihmKSwgYml0cyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaAppbmRleCA2NzI1OWViLi4wMWVkNzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaApAQCAtMTUyLDcgKzE1Miw3IEBACiB9OwogCiAvKioKLSAqIERlZmludGlvbiBvZiBQb3J0YWxSUEMgaW1wb3J0IHN0cnVjdHVyZS4KKyAqIERlZmluaXRpb24gb2YgUG9ydGFsUlBDIGltcG9ydCBzdHJ1Y3R1cmUuCiAgKiBJbXBvcnRzIGFyZSByZXByZXNlbnRpbmcgY2xpZW50LXNpZGUgdmlldyB0byByZW1vdGUgdGFyZ2V0LgogICovCiBzdHJ1Y3Qgb2JkX2ltcG9ydCB7CkBAIC0xODAsNiArMTgwLDE3IEBACiAJc3RydWN0IGxpc3RfaGVhZAkJaW1wX2RlbGF5ZWRfbGlzdDsKIAkvKiogQH0gKi8KIAorCS8qKgorCSAqIExpc3Qgb2YgcmVxdWVzdHMgdGhhdCBhcmUgcmV0YWluZWQgZm9yIGNvbW1pdHRlZCBvcGVuIHJlcGxheS4gT25jZQorCSAqIG9wZW4gaXMgY29tbWl0dGVkLCBvcGVuIHJlcGxheSByZXF1ZXN0IHdpbGwgYmUgbW92ZWQgZnJvbSB0aGUKKwkgKiBpbXBfcmVwbGF5X2xpc3QgaW50byB0aGUgaW1wX2NvbW1pdHRlZF9saXN0LgorCSAqIFRoZSBpbXBfcmVwbGF5X2N1cnNvciBpcyBmb3IgYWNjZWxlcmF0aW5nIHNlYXJjaGluZyBkdXJpbmcgcmVwbGF5LgorCSAqIEB7CisJICovCisJc3RydWN0IGxpc3RfaGVhZAkJaW1wX2NvbW1pdHRlZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgICppbXBfcmVwbGF5X2N1cnNvcjsKKwkvKiogQH0gKi8KKwogCS8qKiBvYmQgZGV2aWNlIGZvciB0aGlzIGltcG9ydCAqLwogCXN0cnVjdCBvYmRfZGV2aWNlCSppbXBfb2JkOwogCkBAIC0yMTksNyArMjMwLDcgQEAKIAkqIGFmdGVyIGEgY2hlY2sgdG8gc2F2ZSBvbiB1bm5lY2Vzc2FyeSByZXBsYXkgbGlzdCBpdGVyYXRpb25zCiAJKi8KIAlpbnQJCSAgICAgICBpbXBfbGFzdF9nZW5lcmF0aW9uX2NoZWNrZWQ7Ci0JLyoqIExhc3QgdHJhbm5vIHdlIHJlcGxheWVkICovCisJLyoqIExhc3QgdHJhbnNubyB3ZSByZXBsYXllZCAqLwogCV9fdTY0CQkgICAgIGltcF9sYXN0X3JlcGxheV90cmFuc25vOwogCS8qKiBMYXN0IHRyYW5zbm8gY29tbWl0dGVkIG9uIHJlbW90ZSBzaWRlICovCiAJX191NjQJCSAgICAgaW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm87CkBAIC0yMzcsNyArMjQ4LDcgQEAKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAgICAgIGltcF9yZW1vdGVfaGFuZGxlOwogCS8qKiBXaGVuIHRvIHBlcmZvcm0gbmV4dCBwaW5nLiB0aW1lIGluIGppZmZpZXMuICovCiAJY2ZzX3RpbWVfdAkJaW1wX25leHRfcGluZzsKLQkvKiogV2hlbiB3ZSBsYXN0IHN1Y2Nlc2Z1bGx5IGNvbm5lY3RlZC4gdGltZSBpbiA2NGJpdCBqaWZmaWVzICovCisJLyoqIFdoZW4gd2UgbGFzdCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkLiB0aW1lIGluIDY0Yml0IGppZmZpZXMgKi8KIAlfX3U2NAkJICAgICBpbXBfbGFzdF9zdWNjZXNzX2Nvbm47CiAKIAkvKiogTGlzdCBvZiBhbGwgcG9zc2libGUgY29ubmVjdGlvbiBmb3IgaW1wb3J0LiAqLwpAQCAtMjY4LDcgKzI3OSw3IEBACiAJCQkJICBpbXBfbm9fbG9ja19yZXBsYXk6MSwKIAkJCQkgIC8qIHJlY292ZXJ5IGJ5IHZlcnNpb25zIHdhcyBmYWlsZWQgKi8KIAkJCQkgIGltcF92YnJfZmFpbGVkOjEsCi0JCQkJICAvKiBmb3JjZSBhbiBpbW1pZGlhdGUgcGluZyAqLworCQkJCSAgLyogZm9yY2UgYW4gaW1tZWRpYXRlIHBpbmcgKi8KIAkJCQkgIGltcF9mb3JjZV92ZXJpZnk6MSwKIAkJCQkgIC8qIGZvcmNlIGEgc2NoZWR1bGVkIHBpbmcgKi8KIAkJCQkgIGltcF9mb3JjZV9uZXh0X3ZlcmlmeToxLApAQCAtMjgxLDcgKzI5Miw3IEBACiAJCQkJICAvKiBuZWVkIElSIE1ORSBzd2FiICovCiAJCQkJICBpbXBfbmVlZF9tbmVfc3dhYjoxLAogCQkJCSAgLyogaW1wb3J0IG11c3QgYmUgcmVjb25uZWN0ZWQgaW5zdGVhZCBvZgotCQkJCSAgICogY2hvdXNlIG5ldyBjb25uZWN0aW9uICovCisJCQkJICAgKiBjaG9zZSBuZXcgY29ubmVjdGlvbiAqLwogCQkJCSAgaW1wX2ZvcmNlX3JlY29ubmVjdDoxLAogCQkJCSAgLyogaW1wb3J0IGhhcyB0cmllZCB0byBjb25uZWN0IHdpdGggc2VydmVyICovCiAJCQkJICBpbXBfY29ubmVjdF90cmllZDoxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGliLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saWIuaAppbmRleCA2MDlhMDkwLi4wMzY4Y2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saWIuaApAQCAtNTM2LDcgKzUzNiw3IEBACiAJaWYgKGNvbmRpdGlvbikJCQkJCQkJIFwKIAkJYnJlYWs7CQkJCQkJCSBcCiAJCQkJCQkJCQkgICAgICAgXAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJl9fd2FpdCk7CQkJCQkgICAgXAorCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZfX3dhaXQsIGN1cnJlbnQpOwkJCQkJICAgIFwKIAlsX2FkZF93YWl0KCZ3cSwgJl9fd2FpdCk7CQkJCQkgICAgICBcCiAJCQkJCQkJCQkgICAgICAgXAogCS8qIEJsb2NrIGFsbCBzaWduYWxzIChqdXN0IHRoZSBub24tZmF0YWwgb25lcyBpZiBubyB0aW1lb3V0KS4gKi8gICAgICAgXApAQCAtNTU4LDE1ICs1NTgsMTMgQEAKIAkJCWJyZWFrOwkJCQkJCSBcCiAJCQkJCQkJCQkgICAgICAgXAogCQlpZiAoX190aW1lb3V0ID09IDApIHsJCQkJCSAgXAotCQkJd2FpdHFfd2FpdCgmX193YWl0LCBfX3dzdGF0ZSk7CQkgICAgIFwKKwkJCXNjaGVkdWxlKCk7CQkJCQkJXAogCQl9IGVsc2UgewkJCQkJCSAgICAgICBcCiAJCQljZnNfZHVyYXRpb25fdCBpbnRlcnZhbCA9IGluZm8tPmx3aV9pbnRlcnZhbD8JICBcCiAJCQkJCSAgICAgbWluX3QoY2ZzX2R1cmF0aW9uX3QsCSAgICAgXAogCQkJCQkJIGluZm8tPmx3aV9pbnRlcnZhbCxfX3RpbWVvdXQpOlwKIAkJCQkJICAgICBfX3RpbWVvdXQ7CQkJXAotCQkJY2ZzX2R1cmF0aW9uX3QgcmVtYWluaW5nID0gd2FpdHFfdGltZWR3YWl0KCZfX3dhaXQsXAotCQkJCQkJICAgX193c3RhdGUsCQkgICBcCi0JCQkJCQkgICBpbnRlcnZhbCk7CQkgIFwKKwkJCWNmc19kdXJhdGlvbl90IHJlbWFpbmluZyA9IHNjaGVkdWxlX3RpbWVvdXQoaW50ZXJ2YWwpO1wKIAkJCV9fdGltZW91dCA9IGNmc190aW1lX3N1YihfX3RpbWVvdXQsCQkgICAgXAogCQkJCQkgICAgY2ZzX3RpbWVfc3ViKGludGVydmFsLCByZW1haW5pbmcpKTtcCiAJCQlpZiAoX190aW1lb3V0ID09IDApIHsJCQkJICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpbmtlYS5oCmluZGV4IDU3OTBiZTkuLjUwMGFjZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpbmtlYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpbmtlYS5oCkBAIC0zMyw3ICszMyw3IEBACiAJICovCiAJc3RydWN0IGx1X2J1ZgkJKmxkX2J1ZjsKIAkvKioKLQkgKiBUaGUgbWF0Y2hlZCBoZWFkZXIsIGVudHJ5IGFuZCBpdHMgbGVuZ2h0IGluIHRoZSBFQQorCSAqIFRoZSBtYXRjaGVkIGhlYWRlciwgZW50cnkgYW5kIGl0cyBsZW5ndGggaW4gdGhlIEVBCiAJICovCiAJc3RydWN0IGxpbmtfZWFfaGVhZGVyCSpsZF9sZWg7CiAJc3RydWN0IGxpbmtfZWFfZW50cnkJKmxkX2xlZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kYy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRjLmgKaW5kZXggYzFlMDI3MC4uNDY4ZjM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRjLmgKQEAgLTE2Niw2ICsxNjYsMTcgQEAKIHZvaWQgaXRfc2V0X2Rpc3Bvc2l0aW9uKHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgaW50IGZsYWcpOwogaW50IGl0X29wZW5fZXJyb3IoaW50IHBoYXNlLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpOwogCitzdGF0aWMgaW5saW5lIGJvb2wgY2xfaXNfbG92X2RlbGF5X2NyZWF0ZSh1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIChmbGFncyAmIE9fTE9WX0RFTEFZX0NSRUFURSkgPT0gT19MT1ZfREVMQVlfQ1JFQVRFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xfbG92X2RlbGF5X2NyZWF0ZV9jbGVhcih1bnNpZ25lZCBpbnQgKmZsYWdzKQoreworCWlmICgoKmZsYWdzICYgT19MT1ZfREVMQVlfQ1JFQVRFKSA9PSBPX0xPVl9ERUxBWV9DUkVBVEUpCisJCSpmbGFncyAmPSB+T19MT1ZfREVMQVlfQ1JFQVRFOworfQorCiAvKiogQH0gbWRjICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaAppbmRleCBkOGQwODgwLi43NDVhZGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaApAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJbG5ldF9oYW5kbGVfbWRfdCAgICAgICByc19tZF9oOwogCWF0b21pY190CSAgIHJzX3JlZmNvdW50OwogCi0JLyoqIENvbnRleHQgZm9yIHRoZSBzZXZpY2UgdGhyZWFkICovCisJLyoqIENvbnRleHQgZm9yIHRoZSBzZXJ2aWNlIHRocmVhZCAqLwogCXN0cnVjdCBwdGxycGNfc3ZjX2N0eCAqcnNfc3ZjX2N0eDsKIAkvKiogUmVwbHkgYnVmZmVyIChhY3R1YWxseSBzZW50IHRvIHRoZSBjbGllbnQpLCBlbmNvZGVkIGlmIG5lZWRlZCAqLwogCXN0cnVjdCBsdXN0cmVfbXNnICAgICAqcnNfcmVwYnVmOyAgICAgICAvKiB3cmFwcGVyICovCkBAIC00NTQsOSArNDU0LDkgQEAKIAkvKiogU2l6ZSBvZiB0aGUgcmVwbHkgbWVzc2FnZSAqLwogCWludAkJICAgIHJzX3JlcGRhdGFfbGVuOyAgLyogd3JhcHBlciBtc2cgbGVuZ3RoICovCiAJLyoqCi0JICogQWN0dWFsIHJlcGx5IG1lc3NhZ2UuIEl0cyBjb250ZW50IGlzIGVuY3J1cHRlZCAoaWYgbmVlZGVkKSB0bworCSAqIEFjdHVhbCByZXBseSBtZXNzYWdlLiBJdHMgY29udGVudCBpcyBlbmNyeXB0ZWQgKGlmIG5lZWRlZCkgdG8KIAkgKiBwcm9kdWNlIHJlcGx5IGJ1ZmZlciBmb3IgYWN0dWFsIHNlbmRpbmcuIEluIHNpbXBsZSBjYXNlCi0JICogb2Ygbm8gbmV0d29yayBlbmNyeXB0aW9uIHdlIGp1cyBzZXQgXGEgcnNfcmVwYnVmIHRvIFxhIHJzX21zZworCSAqIG9mIG5vIG5ldHdvcmsgZW5jcnlwdGlvbiB3ZSBqdXN0IHNldCBcYSByc19yZXBidWYgdG8gXGEgcnNfbXNnCiAJICovCiAJc3RydWN0IGx1c3RyZV9tc2cgICAgICpyc19tc2c7CSAgLyogcmVwbHkgbWVzc2FnZSAqLwogCkBAIC00OTcsNyArNDk3LDcgQEAKIAlzcGlubG9ja190IHBycF9sb2NrOwogCS8qKiBsaXN0IG9mIHB0bHJwY19yZXF1ZXN0IHN0cnVjdHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHBycF9yZXFfbGlzdDsKLQkvKiogTWF4aW11bSBtZXNzYWdlIHNpemUgdGhhdCB3b3VsZCBmaXQgaW50byBhIHJxdWVzdCBmcm9tIHRoaXMgcG9vbCAqLworCS8qKiBNYXhpbXVtIG1lc3NhZ2Ugc2l6ZSB0aGF0IHdvdWxkIGZpdCBpbnRvIGEgcmVxdWVzdCBmcm9tIHRoaXMgcG9vbCAqLwogCWludCBwcnBfcnFfc2l6ZTsKIAkvKiogRnVuY3Rpb24gdG8gYWxsb2NhdGUgbW9yZSByZXF1ZXN0cyBmb3IgdGhpcyBwb29sICovCiAJdm9pZCAoKnBycF9wb3B1bGF0ZSkoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3Bvb2wgKiwgaW50KTsKQEAgLTkwNCw3ICs5MDQsNyBAQAogCSAqLwogCXN0cnVjdCBtb2R1bGUJCQkgICpuY19vd25lcjsKIAkvKioKLQkgKiBQb2xpY3kgcmVnaXN0cmF0aW9uIGZsYWdzOyBhIGJpdG1hc3Qgb2YgXGUgbnJzX3BvbGljeV9mbGFncworCSAqIFBvbGljeSByZWdpc3RyYXRpb24gZmxhZ3M7IGEgYml0bWFzayBvZiBcZSBucnNfcG9saWN5X2ZsYWdzCiAJICovCiAJdW5zaWduZWQJCQkgICBuY19mbGFnczsKIH07CkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCSAqLwogCWVudW0gbnJzX29ycl9zdXBwCQlvZF9zdXBwOwogCS8qKgotCSAqIFJvdW5kIFJvYmluIHF1YW50dW07IHRoZSBtYXhpdW0gbnVtYmVyIG9mIFJQQ3MgdGhhdCBlYWNoIHJlcXVlc3QKKwkgKiBSb3VuZCBSb2JpbiBxdWFudHVtOyB0aGUgbWF4aW11bSBudW1iZXIgb2YgUlBDcyB0aGF0IGVhY2ggcmVxdWVzdAogCSAqIGJhdGNoIGZvciBlYWNoIG9iamVjdCBvciBPU1QgY2FuIGhhdmUgaW4gYSBzY2hlZHVsaW5nIHJvdW5kLgogCSAqLwogCV9fdTE2CQkJCW9kX3F1YW50dW07CkBAIC0xNDg2LDcgKzE0ODYsNyBAQAogCQkgKi8KIAkJc3RydWN0IG5yc19maWZvX3JlcQlmaWZvOwogCQkvKioKLQkJICogQ1JSLU4gcmVxdWVzdCBkZWZpbnRpb24KKwkJICogQ1JSLU4gcmVxdWVzdCBkZWZpbml0aW9uCiAJCSAqLwogCQlzdHJ1Y3QgbnJzX2Nycm5fcmVxCWNycjsKIAkJLyoqIE9SUiBhbmQgVFJSIHNoYXJlIHRoZSBzYW1lIHJlcXVlc3QgZGVmaW5pdGlvbiAqLwpAQCAtMTU1MCw3ICsxNTUwLDcgQEAKIAkgKiByZXF1ZXN0cyBpbiB0aW1lCiAJICovCiAJc3RydWN0IGxpc3RfaGVhZCBycV90aW1lZF9saXN0OwotCS8qKiBzZXJ2ZXItc2lkZSBoaXN0b3J5LCB1c2VkIGZvciBkZWJ1Z2luZyBwdXJwb3Nlcy4gKi8KKwkvKiogc2VydmVyLXNpZGUgaGlzdG9yeSwgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcnFfaGlzdG9yeV9saXN0OwogCS8qKiBzZXJ2ZXItc2lkZSBwZXItZXhwb3J0IGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJxX2V4cF9saXN0OwpAQCAtMTYxMSw3ICsxNjExLDcgQEAKIAllbnVtIHJxX3BoYXNlIHJxX3BoYXNlOyAvKiBvbmUgb2YgUlFfUEhBU0VfKiAqLwogCWVudW0gcnFfcGhhc2UgcnFfbmV4dF9waGFzZTsgLyogb25lIG9mIFJRX1BIQVNFXyogdG8gYmUgdXNlZCBuZXh0ICovCiAJYXRvbWljX3QgcnFfcmVmY291bnQ7LyogY2xpZW50LXNpZGUgcmVmY291bnQgZm9yIFNFTlQgcmFjZSwKLQkJCQkgICAgc2VydmVyLXNpZGUgcmVmY291bmYgZm9yIG11bHRpcGxlIHJlcGxpZXMgKi8KKwkJCQkgICAgc2VydmVyLXNpZGUgcmVmY291bnQgZm9yIG11bHRpcGxlIHJlcGxpZXMgKi8KIAogCS8qKiBQb3J0YWwgdG8gd2hpY2ggdGhpcyByZXF1ZXN0IHdvdWxkIGJlIHNlbnQgKi8KIAlzaG9ydCBycV9yZXF1ZXN0X3BvcnRhbDsgIC8qIFhYWCBGSVhNRSBidWcgMjQ5ICovCkBAIC0xNjM3LDcgKzE2MzcsNyBAQAogCS8qKiB4aWQgKi8KIAlfX3U2NCBycV94aWQ7CiAJLyoqCi0JICogTGlzdCBpdGVtIHRvIGZvciByZXBsYXkgbGlzdC4gTm90IHlldCBjb21taXRlZCByZXF1ZXN0cyBnZXQgbGlua2VkCisJICogTGlzdCBpdGVtIHRvIGZvciByZXBsYXkgbGlzdC4gTm90IHlldCBjb21taXR0ZWQgcmVxdWVzdHMgZ2V0IGxpbmtlZAogCSAqIHRoZXJlLgogCSAqIEFsc28gc2VlIFxhIHJxX3JlcGxheSBjb21tZW50IGFib3ZlLgogCSAqLwpAQCAtMTk1Miw3ICsxOTUyLDcgQEAKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CiAKIC8qKgotICogSGVscGVyIHRoYXQgZGVjaWRlcyBpZiB3ZSBuZWVkIHRvIHByaW50IHJlcXVlc3QgYWNjb3JkaWcgdG8gY3VycmVudCBkZWJ1ZworICogSGVscGVyIHRoYXQgZGVjaWRlcyBpZiB3ZSBuZWVkIHRvIHByaW50IHJlcXVlc3QgYWNjb3JkaW5nIHRvIGN1cnJlbnQgZGVidWcKICAqIGxldmVsIHNldHRpbmdzCiAgKi8KICNkZWZpbmUgZGVidWdfcmVxKG1zZ2RhdGEsIG1hc2ssIGNkbHMsIHJlcSwgZm10LCBhLi4uKQkJCVwKQEAgLTE5NjYsNyArMTk2Niw3IEBACiB9IHdoaWxlKDApCiAKIC8qKgotICogVGhpcyBpcyB0aGUgZGVidWcgcHJpbnQgZnVuY3Rpb24geW91IG5lZWQgdG8gdXNlIHRvIHByaW50IHJlcXVlc3Qgc3R1cnVjdHVyZQorICogVGhpcyBpcyB0aGUgZGVidWcgcHJpbnQgZnVuY3Rpb24geW91IG5lZWQgdG8gdXNlIHRvIHByaW50IHJlcXVlc3Qgc3RydWN0dXJlCiAgKiBjb250ZW50IGludG8gbHVzdHJlIGRlYnVnIGxvZy4KICAqIGZvciBtb3N0IGNhbGxlcnMgKGxldmVsIGlzIGEgY29uc3RhbnQpIHRoaXMgaXMgcmVzb2x2ZWQgYXQgY29tcGlsZSB0aW1lICovCiAjZGVmaW5lIERFQlVHX1JFUShsZXZlbCwgcmVxLCBmbXQsIGFyZ3MuLi4pCQkJCSAgIFwKQEAgLTI2MjEsNiArMjYyMSw4IEBACiAgKiByZXF1ZXN0IHF1ZXVlcywgcmVxdWVzdCBtYW5hZ2VtZW50LCBldGMuCiAgKiBAewogICovCit2b2lkIHB0bHJwY19yZXF1ZXN0X2NvbW1pdHRlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGZvcmNlKTsKKwogdm9pZCBwdGxycGNfaW5pdF9jbGllbnQoaW50IHJlcV9wb3J0YWwsIGludCByZXBfcG9ydGFsLCBjaGFyICpuYW1lLAogCQkJc3RydWN0IHB0bHJwY19jbGllbnQgKik7CiB2b2lkIHB0bHJwY19jbGVhbnVwX2NsaWVudChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3F1b3RhLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9xdW90YS5oCmluZGV4IDcxYjVkOTcuLjA3Y2I3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3F1b3RhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcXVvdGEuaApAQCAtMTQwLDcgKzE0MCw3IEBACiAgKgkJKGkuZS4gd2hlbiAtPmxkb19yZWNvdmVyeV9jb21wbGV0ZSBpcyBjYWxsZWQpLiBUaGlzIGlzIHVzZWQKICAqCQl0byBub3RpZnkgdGhlIHFzZCBsYXllciB0aGF0IHF1b3RhIHNob3VsZCBub3cgYmUgZW5mb3JjZWQKICAqCQlhZ2FpbiB2aWEgdGhlIHFzZF9vcF9iZWdpbi9lbmQgZnVuY3Rpb25zLiBUaGUgbGFzdCBzdGVwIG9mIHRoZQotICoJCXJlaW50ZWdyYXRpb24gcHJvZGVjdXJlIChuYW1lbHkgdXNhZ2UgcmVjb25jaWxpYXRpb24pIHdpbGwgYmUKKyAqCQlyZWludGVncmF0aW9uIHByb2NlZHVyZSAobmFtZWx5IHVzYWdlIHJlY29uY2lsaWF0aW9uKSB3aWxsIGJlCiAgKgkJY29tcGxldGVkIGR1cmluZyBzdGFydC4KICAqCiAgKiAtIHFzZF9maW5pKCk6IGlzIHVzZWQgdG8gcmVsZWFzZSBhIHFzZF9pbnN0YW5jZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3NlYy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfc2VjLmgKaW5kZXggODg1MjQ3ZC4uYmYzZWUzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfc2VjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfc2VjLmgKQEAgLTU3Miw3ICs1NzIsNyBAQAogCS8qKgogCSAqIENhbGxlZCB0aGVuIHRoZSByZWZlcmVuY2Ugb2YgXGEgY3R4IGRyb3BwZWQgdG8gMC4gVGhlIHBvbGljeSBtb2R1bGUKIAkgKiBpcyBzdXBwb3NlZCB0byBkZXN0cm95IHRoaXMgY29udGV4dCBvciB3aGF0ZXZlciBlbHNlIGFjY29yZGluZyB0bwotCSAqIGl0cyBjYWNoZSBtYWludGFpbmFuY2UgbWVjaGFtaXNtLgorCSAqIGl0cyBjYWNoZSBtYWludGVuYW5jZSBtZWNoYW5pc20uCiAJICoKIAkgKiBccGFyYW0gc3luYyBpZiB6ZXJvLCB3ZSBzaG91bGRuJ3Qgd2FpdCBmb3IgdGhlIGNvbnRleHQgYmVpbmcKIAkgKiBkZXN0cm95ZWQgY29tcGxldGVseS4KQEAgLTEwMDIsNyArMTAwMiw3IEBACiB2b2lkIHNwdGxycGNfc2VjX3B1dChzdHJ1Y3QgcHRscnBjX3NlYyAqc2VjKTsKIAogLyoKLSAqIGludGVybmFsIGFwaXMgd2hpY2ggb25seSB1c2VkIGJ5IHBvbGljeSBpbXBlbGVudGF0aW9uCisgKiBpbnRlcm5hbCBhcGlzIHdoaWNoIG9ubHkgdXNlZCBieSBwb2xpY3kgaW1wbGVtZW50YXRpb24KICAqLwogaW50ICBzcHRscnBjX2dldF9uZXh0X3NlY2lkKHZvaWQpOwogdm9pZCBzcHRscnBjX3NlY19kZXN0cm95KHN0cnVjdCBwdGxycGNfc2VjICpzZWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9tZF9vYmplY3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbWRfb2JqZWN0LmgKaW5kZXggN2I0NWI0Ny4uZWY0NmIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9tZF9vYmplY3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL21kX29iamVjdC5oCkBAIC0zNSw3ICszNSw3IEBACiAgKgogICogbHVzdHJlL2luY2x1ZGUvbWRfb2JqZWN0LmgKICAqCi0gKiBFeHRlbnRpb24gb2YgbHVfb2JqZWN0LmggZm9yIG1ldGFkYXRhIG9iamVjdHMKKyAqIEV4dGVuc2lvbiBvZiBsdV9vYmplY3QuaCBmb3IgbWV0YWRhdGEgb2JqZWN0cwogICovCiAKICNpZm5kZWYgX0xVU1RSRV9NRF9PQkpFQ1RfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkLmgKaW5kZXggYzM0NzBjZS4uNzJjZjNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZC5oCkBAIC0xNTgsNyArMTU4LDcgQEAKIAkvKiBzdGF0ZnMgZGF0YSBzcGVjaWZpYyBmb3IgZXZlcnkgT1NDLCBpZiBuZWVkZWQgYXQgYWxsLiAqLwogCXN0cnVjdCBvYmRfc3RhdGZzICAgICAgKm9pX29zZnM7CiAJLyogQW4gdXBkYXRlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB0byB1cGRhdGUgc29tZSBkYXRhIG9uIHVwcGVyCi0JICogbGV2ZWwuIEUuZy4gaXQgaXMgdXNlZCBmb3IgdXBkYXRlIGxzbS0+bHNtX29pbmZvIGF0IGV2ZXJ5IHJlY2lldmVkCisJICogbGV2ZWwuIEUuZy4gaXQgaXMgdXNlZCBmb3IgdXBkYXRlIGxzbS0+bHNtX29pbmZvIGF0IGV2ZXJ5IHJlY2VpdmVkCiAJICogcmVxdWVzdCBpbiBvc2MgbGV2ZWwgZm9yIGVucXVldWUgcmVxdWVzdHMuIEl0IGlzIGFsc28gcG9zc2libGUgdG8KIAkgKiB1cGRhdGUgc29tZSBjYWxsZXIgZGF0YSBmcm9tIExPViBsYXllciBpZiBuZWVkZWQuICovCiAJb2JkX2VucXVldWVfdXBkYXRlX2YgICAgb2lfY2JfdXA7CkBAIC0xMDQyLDggKzEwNDIsOCBAQAogfQogCiBzdHJ1Y3QgbWRfb3BfZGF0YSB7Ci0Jc3RydWN0IGx1X2ZpZAkgICBvcF9maWQxOyAvKiBvcGVyYXRpb24gZmlkMSAodXN1YWx5IHBhcmVudCkgKi8KLQlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDI7IC8qIG9wZXJhdGlvbiBmaWQyICh1c3VhbHkgY2hpbGQpICovCisJc3RydWN0IGx1X2ZpZAkgICBvcF9maWQxOyAvKiBvcGVyYXRpb24gZmlkMSAodXN1YWxseSBwYXJlbnQpICovCisJc3RydWN0IGx1X2ZpZAkgICBvcF9maWQyOyAvKiBvcGVyYXRpb24gZmlkMiAodXN1YWxseSBjaGlsZCkgKi8KIAlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDM7IC8qIDIgZXh0cmEgZmlkcyB0byBmaW5kIGNvbmZsaWN0aW5nICovCiAJc3RydWN0IGx1X2ZpZAkgICBvcF9maWQ0OyAvKiB0byB0aGUgb3BlcmF0aW9uIGxvY2tzLiAqLwogCW1kc25vX3QJCSBvcF9tZHM7ICAvKiB3aGF0IG1kcyBzZXJ2ZXIgb3BlbiB3aWxsIGdvIHRvICovCkBAIC0xMzIzLDcgKzEzMjMsOCBAQAogCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqbW9kX29jaDsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICAgKm1vZF9vcGVuX3JlcTsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICAgKm1vZF9jbG9zZV9yZXE7Ci0JYXRvbWljX3QJICAgICAgbW9kX3JlZmNvdW50OworCWF0b21pY190CQkgIG1vZF9yZWZjb3VudDsKKwlib29sCQkJICBtb2RfaXNfY3JlYXRlOwogfTsKIAogc3RydWN0IGxvb2t1cF9pbnRlbnQ7CkBAIC0xMzkyLDcgKzEzOTMsNyBAQAogCiAJaW50ICgqbV9zZXRfb3Blbl9yZXBsYXlfZGF0YSkoc3RydWN0IG9iZF9leHBvcnQgKiwKIAkJCQkgICAgICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKiwKLQkJCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKik7CisJCQkJICAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKik7CiAJaW50ICgqbV9jbGVhcl9vcGVuX3JlcGxheV9kYXRhKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLAogCQkJCQlzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKik7CiAJaW50ICgqbV9zZXRfbG9ja19kYXRhKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBfX3U2NCAqLCB2b2lkICosIF9fdTY0ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmgKaW5kZXggOTgzNzE4Zi4uOWQxZjI2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oCkBAIC0xNzUsOSArMTc1LDEzIEBACiAJQ09ORklHX1RfQ09ORklHICA9IDAsCiAJQ09ORklHX1RfU1BUTFJQQyA9IDEsCiAJQ09ORklHX1RfUkVDT1ZFUiA9IDIsCi0JQ09ORklHX1RfTUFYICAgICA9IDMKKwlDT05GSUdfVF9QQVJBTVMgID0gMywKKwlDT05GSUdfVF9NQVggICAgID0gNAogfTsKIAorI2RlZmluZSBQQVJBTVNfRklMRU5BTUUJInBhcmFtcyIKKyNkZWZpbmUgTENUTF9VUENBTEwJImxjdGwiCisKIC8qIGxpc3Qgb2YgYWN0aXZlIGNvbmZpZ3VyYXRpb24gbG9ncyAgKi8KIHN0cnVjdCBjb25maWdfbGxvZ19kYXRhIHsKIAlzdHJ1Y3QgbGRsbV9yZXNfaWQJICBjbGRfcmVzaWQ7CkBAIC0xODUsNyArMTg5LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkgIGNsZF9saXN0X2NoYWluOwogCWF0b21pY190CQljbGRfcmVmY291bnQ7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgICAgKmNsZF9zcHRscnBjOy8qIGRlcGVuZGVkIHNwdGxycGMgbG9nICovCi0Jc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgICAgKmNsZF9yZWNvdmVyOyAgICAvKiBpbXBlcmF0aXZlIHJlY292ZXIgbG9nICovCisJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEJICAgKmNsZF9wYXJhbXM7CS8qIGNvbW1vbiBwYXJhbWV0ZXJzIGxvZyAqLworCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICAgICpjbGRfcmVjb3ZlcjsvKiBpbXBlcmF0aXZlIHJlY292ZXIgbG9nICovCiAJc3RydWN0IG9iZF9leHBvcnQJICAqY2xkX21nY2V4cDsKIAlzdHJ1Y3QgbXV0ZXgJCSAgICBjbGRfbG9jazsKIAlpbnQJCQkgY2xkX3R5cGU7CkBAIC0xNjI2LDcgKzE2MzEsNyBAQAogewogCS8qIHJldHVybnM6IDAgb24gaGVhbHRoeQogCSAqCSA+MCBvbiB1bmhlYWx0aHkgKyByZWFzb24gY29kZS9mbGFnCi0JICoJICAgIGhvd2V2ZXIgdGhlIG9ubHkgc3VwcG9yZWQgcmVhc29uID09IDEgcmlnaHQgbm93CisJICoJICAgIGhvd2V2ZXIgdGhlIG9ubHkgc3VwcG9ydGVkIHJlYXNvbiA9PSAxIHJpZ2h0IG5vdwogCSAqCSAgICBXZSdsbCBuZWVkIHRvIGRlZmluZSBzb21lIGJldHRlciByZWFzb25zCiAJICoJICAgIG9yIGZsYWdzIGluIHRoZSBmdXR1cmUuCiAJICoJIDwwIG9uIGVycm9yCkBAIC0xOTk2LDExICsyMDAxLDExIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IG1kX3NldF9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkJCSAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2gsCi0JCQkJCSAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpvcGVuX3JlcSkKKwkJCQkJICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJRVhQX0NIRUNLX01EX09QKGV4cCwgc2V0X29wZW5fcmVwbGF5X2RhdGEpOwogCUVYUF9NRF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIHNldF9vcGVuX3JlcGxheV9kYXRhKTsKLQlyZXR1cm4gTURQKGV4cC0+ZXhwX29iZCwgc2V0X29wZW5fcmVwbGF5X2RhdGEpKGV4cCwgb2NoLCBvcGVuX3JlcSk7CisJcmV0dXJuIE1EUChleHAtPmV4cF9vYmQsIHNldF9vcGVuX3JlcGxheV9kYXRhKShleHAsIG9jaCwgaXQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBtZF9jbGVhcl9vcGVuX3JlcGxheV9kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmgKaW5kZXggOTc3YmMyMy4uNWVjMzM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfc3VwcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX3N1cHBvcnQuaApAQCAtNjgxLDcgKzY4MSw3IEBACiAgKgogICogQmUgdmVyeSBjYXJlZnVsIHdoZW4gY2hhbmdpbmcgdGhpcyB2YWx1ZSwgZXNwZWNpYWxseSB3aGVuIGRlY3JlYXNpbmcgaXQsCiAgKiBzaW5jZSB2bWFsbG9jIGluIExpbnV4IGRvZXNuJ3QgcGVyZm9ybSB3ZWxsIG9uIG11bHRpLWNvcmVzIHN5c3RlbSwgY2FsbGluZwotICogdm1hbGxvYyBpbiBjcml0aWNhbCBwYXRoIHdvdWxkIGh1cnQgcGVmb3JtYW5jZSBiYWRseS4gU2VlIExVLTY2LgorICogdm1hbGxvYyBpbiBjcml0aWNhbCBwYXRoIHdvdWxkIGh1cnQgcGVyZm9ybWFuY2UgYmFkbHkuIFNlZSBMVS02Ni4KICAqLwogI2RlZmluZSBPQkRfQUxMT0NfQklHICg0ICogUEFHRV9DQUNIRV9TSVpFKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jCmluZGV4IDk0YjE2NDEuLjY5MDdhMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jCkBAIC0xMTk2LDE0ICsxMTk2LDE0IEBACiAKIAkJYmt0ID0gbHVfc2l0ZV9ia3RfZnJvbV9maWQoc2l0ZSwgJmhlYWRlci0+bG9oX2ZpZCk7CiAKLQkJaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdGVyKTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXRlciwgY3VycmVudCk7CiAJCWFkZF93YWl0X3F1ZXVlKCZia3QtPmxzYl9tYXJjaGVfZnVuZWJyZSwgJndhaXRlcik7CiAKIAkJd2hpbGUgKDEpIHsKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCWlmIChhdG9taWNfcmVhZCgmaGVhZGVyLT5sb2hfcmVmKSA9PSAxKQogCQkJCWJyZWFrOwotCQkJd2FpdHFfd2FpdCgmd2FpdGVyLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZSgpOwogCQl9CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9mbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMKaW5kZXggYzlhYWUxMy4uOTg2YmYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMKQEAgLTIwNSw2ICsyMDUsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbGRsbV9mbG9ja19jYW5jZWxfb25fZGVhZGxvY2soc3RydWN0IGxkbG1fbG9jayAqbG9jaywKKwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX2xpc3QpCit7CisJQ0RFQlVHKERfSU5GTywgInJlcHJvY2VzcyBkZWFkbG9jayByZXE9JXBcbiIsIGxvY2spOworCisJaWYgKChleHBfY29ubmVjdF9mbGFncyhsb2NrLT5sX2V4cG9ydCkgJgorCQkJCU9CRF9DT05ORUNUX0ZMT0NLX0RFQUQpID09IDApIHsKKwkJQ0VSUk9SKAorCQkgICAgICAiZGVhZGxvY2sgZm91bmQsIGJ1dCBjbGllbnQgZG9lc24ndCBzdXBwb3J0IGZsb2NrIGNhbmNlbGlhdGlvblxuIik7CisJfSBlbHNlIHsKKwkJTEFTU0VSVChsb2NrLT5sX2NvbXBsZXRpb25fYXN0KTsKKwkJTEFTU0VSVCgobG9jay0+bF9mbGFncyAmIExETE1fRkxfQVNUX1NFTlQpID09IDApOworCQlsb2NrLT5sX2ZsYWdzIHw9IExETE1fRkxfQVNUX1NFTlQgfCBMRExNX0ZMX0NBTkNFTF9PTl9CTE9DSyB8CisJCQlMRExNX0ZMX0ZMT0NLX0RFQURMT0NLOworCQlsZGxtX2Zsb2NrX2Jsb2NraW5nX3VubGluayhsb2NrKTsKKwkJbGRsbV9yZXNvdXJjZV91bmxpbmtfbG9jayhsb2NrKTsKKwkJbGRsbV9hZGRfYXN0X3dvcmtfaXRlbShsb2NrLCBOVUxMLCB3b3JrX2xpc3QpOworCX0KK30KKwogLyoqCiAgKiBQcm9jZXNzIGEgZ3JhbnRpbmcgYXR0ZW1wdCBmb3IgZmxvY2sgbG9jay4KICAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIG5zIGxvY2sgaGVsZC4KQEAgLTI3Miw2ICsyOTIsNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKKwkJaW50IHJlcHJvY2Vzc19mYWlsZWQgPSAwOwogCQlsb2NrbW9kZV92ZXJpZnkobW9kZSk7CiAKIAkJLyogVGhpcyBsb29wIGRldGVybWluZXMgaWYgdGhlcmUgYXJlIGV4aXN0aW5nIGxvY2tzCkBAIC0yOTMsOCArMzE0LDE1IEBACiAJCQlpZiAoIWxkbG1fZmxvY2tzX292ZXJsYXAobG9jaywgcmVxKSkKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKCFmaXJzdF9lbnEpCi0JCQkJcmV0dXJuIExETE1fSVRFUl9DT05USU5VRTsKKwkJCWlmICghZmlyc3RfZW5xKSB7CisJCQkJcmVwcm9jZXNzX2ZhaWxlZCA9IDE7CisJCQkJaWYgKGxkbG1fZmxvY2tfZGVhZGxvY2socmVxLCBsb2NrKSkgeworCQkJCQlsZGxtX2Zsb2NrX2NhbmNlbF9vbl9kZWFkbG9jayhyZXEsCisJCQkJCQkJd29ya19saXN0KTsKKwkJCQkJcmV0dXJuIExETE1fSVRFUl9DT05USU5VRTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CiAKIAkJCWlmICgqZmxhZ3MgJiBMRExNX0ZMX0JMT0NLX05PV0FJVCkgewogCQkJCWxkbG1fZmxvY2tfZGVzdHJveShyZXEsIG1vZGUsICpmbGFncyk7CkBAIC0zMzAsNiArMzU4LDggQEAKIAkJCSpmbGFncyB8PSBMRExNX0ZMX0JMT0NLX0dSQU5URUQ7CiAJCQlyZXR1cm4gTERMTV9JVEVSX1NUT1A7CiAJCX0KKwkJaWYgKHJlcHJvY2Vzc19mYWlsZWQpCisJCQlyZXR1cm4gTERMTV9JVEVSX0NPTlRJTlVFOwogCX0KIAogCWlmICgqZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykgewpAQCAtNjQ2LDcgKzY3NiwxMCBAQAogCS8qIGxkbG1fbG9ja19lbnF1ZXVlKCkgaGFzIGFscmVhZHkgcGxhY2VkIGxvY2sgb24gdGhlIGdyYW50ZWQgbGlzdC4gKi8KIAlsaXN0X2RlbF9pbml0KCZsb2NrLT5sX3Jlc19saW5rKTsKIAotCWlmIChmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKSB7CisJaWYgKGxvY2stPmxfZmxhZ3MgJiBMRExNX0ZMX0ZMT0NLX0RFQURMT0NLKSB7CisJCUxETE1fREVCVUcobG9jaywgImNsaWVudC1zaWRlIGVucXVldWUgZGVhZGxvY2sgcmVjZWl2ZWQiKTsKKwkJcmMgPSAtRURFQURMSzsKKwl9IGVsc2UgaWYgKGZsYWdzICYgTERMTV9GTF9URVNUX0xPQ0spIHsKIAkJLyogZmNudGwoRl9HRVRMSykgcmVxdWVzdCAqLwogCQkvKiBUaGUgb2xkIG1vZGUgd2FzIHNhdmVkIGluIGdldGxrLT5mbF90eXBlIHNvIHRoYXQgaWYgdGhlIG1vZGUKIAkJICogaW4gdGhlIGxvY2sgY2hhbmdlcyB3ZSBjYW4gZGVjcmVmIHRoZSBhcHByb3ByaWF0ZSByZWZjb3VudC4qLwpAQCAtNjcyLDcgKzcwNSw3IEBACiAJCWxkbG1fcHJvY2Vzc19mbG9ja19sb2NrKGxvY2ssICZub3JlcHJvYywgMSwgJmVyciwgTlVMTCk7CiAJfQogCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChsZGxtX2Zsb2NrX2NvbXBsZXRpb25fYXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMKaW5kZXggNjkyNjIzYi4uMDU0OGFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jCkBAIC0xNDUsOCArMTQ1LDYgQEAKIAkJcmV0dXJuICJnZXR4YXR0ciI7CiAJY2FzZSBJVF9MQVlPVVQ6CiAJCXJldHVybiAibGF5b3V0IjsKLQljYXNlIElUX1NFVFhBVFRSOgotCQlyZXR1cm4gInNldHhhdHRyIjsKIAlkZWZhdWx0OgogCQlDRVJST1IoIlVua25vd24gaW50ZW50ICVkXG4iLCBpdCk7CiAJCXJldHVybiAiVU5LTk9XTiI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jCmluZGV4IDNlZDAyMGUuLjdlNjNjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jCkBAIC0xOTIsOCArMTkyLDggQEAKIAlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9DQU5DRUxfQkxfQ0JfUkFDRSkpIHsKIAkJaW50IHRvID0gY2ZzX3RpbWVfc2Vjb25kcygxKTsKIAkJd2hpbGUgKHRvID4gMCkgewotCQkJc2NoZWR1bGVfdGltZW91dF9hbmRfc2V0X3N0YXRlKAotCQkJCVRBU0tfSU5URVJSVVBUSUJMRSwgdG8pOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQodG8pOwogCQkJaWYgKGxvY2stPmxfZ3JhbnRlZF9tb2RlID09IGxvY2stPmxfcmVxX21vZGUgfHwKIAkJCSAgICBsb2NrLT5sX2ZsYWdzICYgTERMTV9GTF9ERVNUUk9ZRUQpCiAJCQkJYnJlYWs7CkBAIC0yMjgsNiArMjI4LDcgQEAKIAogCQkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAJCQlMQVNTRVJUKGxvY2stPmxfbHZiX2RhdGEgPT0gTlVMTCk7CisJCQlsb2NrLT5sX2x2Yl90eXBlID0gTFZCX1RfTEFZT1VUOwogCQkJbG9jay0+bF9sdmJfZGF0YSA9IGx2Yl9kYXRhOwogCQkJbG9jay0+bF9sdmJfbGVuID0gbHZiX2xlbjsKIAkJCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYwppbmRleCBjMGU1NGFlLi5mY2M3YTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMKQEAgLTI5OSw3ICsyOTksNyBAQAogICogQSBoZWxwZXIgdG8gYnVpbGQgYSBibG9ja2luZyBBU1QgZnVuY3Rpb24KICAqCiAgKiBQZXJmb3JtIGEgY29tbW9uIG9wZXJhdGlvbiBmb3IgYmxvY2tpbmcgQVNUczoKLSAqIGRlZmZlcnJlZCBsb2NrIGNhbmNlbGxhdGlvbi4KKyAqIGRlZmVycmVkIGxvY2sgY2FuY2VsbGF0aW9uLgogICoKICAqIFxwYXJhbSBsb2NrIHRoZSBsb2NrIGJsb2NraW5nIG9yIGNhbmNlbGluZyBBU1Qgd2FzIGNhbGxlZCBvbgogICogXHJldHZhbCAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXNvdXJjZS5jCmluZGV4IDVmODk4NjQuLjI4MjRkNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXNvdXJjZS5jCkBAIC00MjEsOSArNDIxLDkgQEAKIAl9IGVsc2UgewogCQl2YWwgPSBmaWRfb2lkKCZmaWQpOwogCX0KLQloYXNoID0gY2ZzX2hhc2hfbG9uZyhoYXNoLCBocy0+aHNfYmt0X2JpdHMpOworCWhhc2ggPSBoYXNoX2xvbmcoaGFzaCwgaHMtPmhzX2JrdF9iaXRzKTsKIAkvKiBnaXZlIG1lIGFub3RoZXIgcmFuZG9tIGZhY3RvciAqLwotCWhhc2ggLT0gY2ZzX2hhc2hfbG9uZygodW5zaWduZWQgbG9uZylocywgdmFsICUgMTEgKyAzKTsKKwloYXNoIC09IGhhc2hfbG9uZygodW5zaWduZWQgbG9uZylocywgdmFsICUgMTEgKyAzKTsKIAogCWhhc2ggPDw9IGhzLT5oc19jdXJfYml0cyAtIGhzLT5oc19ia3RfYml0czsKIAloYXNoIHw9IGxkbG1fcmVzX2hvcF9oYXNoKGhzLCBrZXksIENGU19IQVNIX05CS1QoaHMpIC0gMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9kZWJ1Zy5jCmluZGV4IGYzMGM4NGYuLjFlNGM1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9kZWJ1Zy5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIAkvKiB3ZSdyZSBiZWluZyBjYXJlZnVsIHRvIGVuc3VyZSB0aGF0IHRoZSBrZXJuZWwgdGhyZWFkIGlzCiAJICogYWJsZSB0byBzZXQgb3VyIHN0YXRlIHRvIHJ1bm5pbmcgYXMgaXQgZXhpdHMgYmVmb3JlIHdlCiAJICogZ2V0IHRvIHNjaGVkdWxlKCkgKi8KLQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlhZGRfd2FpdF9xdWV1ZSgmZGVidWdfY3Rsd3EsICZ3YWl0KTsKIApAQCAtMzc5LDcgKzM3OSw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiTHVzdHJlRXJyb3I6IGNhbm5vdCBzdGFydCBsb2cgZHVtcCB0aHJlYWQ6IgogCQkgICAgICAgIiAlbGRcbiIsIFBUUl9FUlIoZHVtcGVyKSk7CiAJZWxzZQotCQl3YWl0cV93YWl0KCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOwogCiAJLyogYmUgc3VyZSB0byB0ZWFyZG93biBpZiBjZnNfY3JlYXRlX3RocmVhZCgpIGZhaWxlZCAqLwogCXJlbW92ZV93YWl0X3F1ZXVlKCZkZWJ1Z19jdGx3cSwgJndhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2ZhaWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9mYWlsLmMKaW5kZXggYzU0NDQ4ZC4uYmE0M2ZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2ZhaWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZmFpbC5jCkBAIC0xMjcsOCArMTI3LDggQEAKIAlpZiAocmV0KSB7CiAJCUNFUlJPUigiY2ZzX2ZhaWxfdGltZW91dCBpZCAleCBzbGVlcGluZyBmb3IgJWRtc1xuIiwKIAkJICAgICAgIGlkLCBtcyk7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSwKLQkJCQkJCSAgIGNmc190aW1lX3NlY29uZHMobXMpIC8gMTAwMCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKG1zKSAvIDEwMDApOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQlDRVJST1IoImNmc19mYWlsX3RpbWVvdXQgaWQgJXggYXdha2VcbiIsIGlkKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMva2VybmVsX3VzZXJfY29tbS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2tlcm5lbF91c2VyX2NvbW0uYwppbmRleCA3YjJjMzE1Li5iNmRkYzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMva2VybmVsX3VzZXJfY29tbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9rZXJuZWxfdXNlcl9jb21tLmMKQEAgLTQ0LDEwNiArNDQsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbGliY2ZzL2xpYmNmcy5oPgogCi0jaWZkZWYgTFVTVFJFX1VUSUxTCi0vKiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2Ugc2lkZS4gKi8KLQotLyoqIFN0YXJ0IHRoZSB1c2Vyc3BhY2Ugc2lkZSBvZiBhIEtVQyBwaXBlLgotICogQHBhcmFtIGxpbmsgUHJpdmF0ZSBkZXNjcmlwdG9yIGZvciBwaXBlL3NvY2tldC4KLSAqIEBwYXJhbSBncm91cHMgS1VDIGJyb2FkY2FzdCBncm91cCB0byBsaXN0ZW4gdG8KLSAqCSAgKGNhbiBiZSBudWxsIGZvciB1bmljYXN0IHRvIHRoaXMgcGlkKQotICovCi1pbnQgbGliY2ZzX3VrdWNfc3RhcnQobHVzdHJlX2tlcm5lbGNvbW0gKmxpbmssIGludCBncm91cCkKLXsKLQlpbnQgcGZkWzJdOwotCi0JaWYgKHBpcGUocGZkKSA8IDApCi0JCXJldHVybiAtZXJybm87Ci0KLQltZW1zZXQobGluaywgMCwgc2l6ZW9mKCpsaW5rKSk7Ci0JbGluay0+bGtfcmZkID0gcGZkWzBdOwotCWxpbmstPmxrX3dmZCA9IHBmZFsxXTsKLQlsaW5rLT5sa19ncm91cCA9IGdyb3VwOwotCWxpbmstPmxrX3VpZCA9IGdldHBpZCgpOwotCXJldHVybiAwOwotfQotCi1pbnQgbGliY2ZzX3VrdWNfc3RvcChsdXN0cmVfa2VybmVsY29tbSAqbGluaykKLXsKLQlpZiAobGluay0+bGtfd2ZkID4gMCkKLQkJY2xvc2UobGluay0+bGtfd2ZkKTsKLQlyZXR1cm4gY2xvc2UobGluay0+bGtfcmZkKTsKLX0KLQotI2RlZmluZSBsaHN6IHNpemVvZigqa3VjaCkKLQotLyoqIFJlYWQgYSBtZXNzYWdlIGZyb20gdGhlIGxpbmsuCi0gKiBBbGxvY2F0ZXMgbWVtb3J5LCByZXR1cm5zIGhhbmRsZQotICoKLSAqIEBwYXJhbSBsaW5rIFByaXZhdGUgZGVzY3JpcHRvciBmb3IgcGlwZS9zb2NrZXQuCi0gKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGludG8sIG11c3QgaW5jbHVkZSBzaXplIGZvciBrdWNfaGRyCi0gKiBAcGFyYW0gbWF4c2l6ZSBNYXhpbXVtIG1lc3NhZ2Ugc2l6ZSBhbGxvd2VkCi0gKiBAcGFyYW0gdHJhbnNwb3J0IE9ubHkgbGlzdGVuIHRvIG1lc3NhZ2VzIG9uIHRoaXMgdHJhbnNwb3J0Ci0gKiAgICAgIChhbmQgdGhlIGdlbmVyaWMgdHJhbnNwb3J0KQotICovCi1pbnQgbGliY2ZzX3VrdWNfbXNnX2dldChsdXN0cmVfa2VybmVsY29tbSAqbGluaywgY2hhciAqYnVmLCBpbnQgbWF4c2l6ZSwKLQkJCWludCB0cmFuc3BvcnQpCi17Ci0Jc3RydWN0IGt1Y19oZHIgKmt1Y2g7Ci0JaW50IHJjID0gMDsKLQotCW1lbXNldChidWYsIDAsIG1heHNpemUpOwotCi0JQ0RFQlVHKERfS1VDLCAiV2FpdGluZyBmb3IgbWVzc2FnZSBmcm9tIGtlcm5lbCBvbiBmZCAlZFxuIiwKLQkgICAgICAgbGluay0+bGtfcmZkKTsKLQotCXdoaWxlICgxKSB7Ci0JCS8qIFJlYWQgaGVhZGVyIGZpcnN0IHRvIGdldCBtZXNzYWdlIHNpemUgKi8KLQkJcmMgPSByZWFkKGxpbmstPmxrX3JmZCwgYnVmLCBsaHN6KTsKLQkJaWYgKHJjIDw9IDApIHsKLQkJCXJjID0gLWVycm5vOwotCQkJYnJlYWs7Ci0JCX0KLQkJa3VjaCA9IChzdHJ1Y3Qga3VjX2hkciAqKWJ1ZjsKLQotCQlDREVCVUcoRF9LVUMsICJSZWNlaXZlZCBtZXNzYWdlIG1nPSV4IHQ9JWQgbT0lZCBsPSVkXG4iLAotCQkgICAgICAga3VjaC0+a3VjX21hZ2ljLCBrdWNoLT5rdWNfdHJhbnNwb3J0LCBrdWNoLT5rdWNfbXNndHlwZSwKLQkJICAgICAgIGt1Y2gtPmt1Y19tc2dsZW4pOwotCi0JCWlmIChrdWNoLT5rdWNfbWFnaWMgIT0gS1VDX01BR0lDKSB7Ci0JCQlDRVJST1IoImJhZCBtZXNzYWdlIG1hZ2ljICV4ICE9ICV4XG4iLAotCQkJICAgICAgIGt1Y2gtPmt1Y19tYWdpYywgS1VDX01BR0lDKTsKLQkJCXJjID0gLUVQUk9UTzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGt1Y2gtPmt1Y19tc2dsZW4gPiBtYXhzaXplKSB7Ci0JCQlyYyA9IC1FTVNHU0laRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogUmVhZCBwYXlsb2FkICovCi0JCXJjID0gcmVhZChsaW5rLT5sa19yZmQsIGJ1ZiArIGxoc3osIGt1Y2gtPmt1Y19tc2dsZW4gLSBsaHN6KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcmMgPSAtZXJybm87Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocmMgPCAoa3VjaC0+a3VjX21zZ2xlbiAtIGxoc3opKSB7Ci0JCQlDRVJST1IoInNob3J0IHJlYWQ6IGdvdCAlZCBvZiAlZCBieXRlc1xuIiwKLQkJCSAgICAgICByYywga3VjaC0+a3VjX21zZ2xlbik7Ci0JCQlyYyA9IC1FUFJPVE87Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChrdWNoLT5rdWNfdHJhbnNwb3J0ID09IHRyYW5zcG9ydCB8fAotCQkgICAga3VjaC0+a3VjX3RyYW5zcG9ydCA9PSBLVUNfVFJBTlNQT1JUX0dFTkVSSUMpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCS8qIERyb3AgbWVzc2FnZXMgZm9yIG90aGVyIHRyYW5zcG9ydHMgKi8KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jZWxzZSAvKiBMVVNUUkVfVVRJTFMgKi8KIC8qIFRoaXMgaXMgdGhlIGtlcm5lbCBzaWRlIChsaWJsdXN0cmUgYXMgd2VsbCkuICovCiAKIC8qKgpAQCAtMzM4LDUgKzIzOCwzIEBACiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChsaWJjZnNfa2t1Y19ncm91cF9mb3JlYWNoKTsKLQotI2VuZGlmIC8qIExVU1RSRV9VVElMUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpYmNmc19zdHJpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saWJjZnNfc3RyaW5nLmMKaW5kZXggOTIyZGViZC4uZWQwYTZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpYmNmc19zdHJpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGliY2ZzX3N0cmluZy5jCkBAIC00MiwyNiArNDIsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbGliY2ZzL2xpYmNmcy5oPgogCi0vKiBub24tMCA9IGRvbid0IG1hdGNoICovCi1pbnQgY2ZzX3N0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pCi17Ci0JaWYgKHMxID09IE5VTEwgfHwgczIgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAobiA9PSAwKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlIChuLS0gIT0gMCAmJiB0b2xvd2VyKCpzMSkgPT0gdG9sb3dlcigqczIpKSB7Ci0JCWlmIChuID09IDAgfHwgKnMxID09ICdcMCcgfHwgKnMyID09ICdcMCcpCi0JCQlicmVhazsKLQkJczErKzsKLQkJczIrKzsKLQl9Ci0KLQlyZXR1cm4gdG9sb3dlcigqKHVuc2lnbmVkIGNoYXIgKilzMSkgLSB0b2xvd2VyKCoodW5zaWduZWQgY2hhciAqKXMyKTsKLX0KLUVYUE9SVF9TWU1CT0woY2ZzX3N0cm5jYXNlY21wKTsKLQogLyogQ29udmVydCBhIHRleHQgc3RyaW5nIHRvIGEgYml0bWFzayAqLwogaW50IGNmc19zdHIybWFzayhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKigqYml0MnN0cikoaW50IGJpdCksCiAJCSBpbnQgKm9sZG1hc2ssIGludCBtaW5tYXNrLCBpbnQgYWxsbWFzaykKQEAgLTEwMSw3ICs4MSw3IEBACiAJCQlkZWJ1Z3N0ciA9IGJpdDJzdHIoaSk7CiAJCQlpZiAoZGVidWdzdHIgIT0gTlVMTCAmJgogCQkJICAgIHN0cmxlbihkZWJ1Z3N0cikgPT0gbGVuICYmCi0JCQkgICAgY2ZzX3N0cm5jYXNlY21wKHN0ciwgZGVidWdzdHIsIGxlbikgPT0gMCkgeworCQkJICAgIHN0cm5jYXNlY21wKHN0ciwgZGVidWdzdHIsIGxlbikgPT0gMCkgewogCQkJCWlmIChvcCA9PSAnLScpCiAJCQkJCW5ld21hc2sgJj0gfigxIDw8IGkpOwogCQkJCWVsc2UKQEAgLTExMSw3ICs5MSw3IEBACiAJCQl9CiAJCX0KIAkJaWYgKCFmb3VuZCAmJiBsZW4gPT0gMyAmJgotCQkgICAgKGNmc19zdHJuY2FzZWNtcChzdHIsICJBTEwiLCBsZW4pID09IDApKSB7CisJCSAgICAoc3RybmNhc2VjbXAoc3RyLCAiQUxMIiwgbGVuKSA9PSAwKSkgewogCQkJaWYgKG9wID09ICctJykKIAkJCQluZXdtYXNrID0gbWlubWFzazsKIAkJCWVsc2UKQEAgLTEyOSw3ICsxMDksNiBAQAogCSpvbGRtYXNrID0gbmV3bWFzazsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woY2ZzX3N0cjJtYXNrKTsKIAogLyogZ2V0IHRoZSBmaXJzdCBzdHJpbmcgb3V0IG9mIEBzdHIgKi8KIGNoYXIgKmNmc19maXJzdHN0cihjaGFyICpzdHIsIHNpemVfdCBzaXplKQpAQCAtMTY0LDEyICsxNDMsMTIgQEAKIHsKIAljaGFyICplbmQ7CiAKLQl3aGlsZSAoY2ZzX2lzd2hpdGUoKnN0cikpCisJd2hpbGUgKGlzc3BhY2UoKnN0cikpCiAJCXN0cisrOwogCiAJZW5kID0gc3RyICsgc3RybGVuKHN0cik7CiAJd2hpbGUgKGVuZCA+IHN0cikgewotCQlpZiAoIWNmc19pc3doaXRlKGVuZFstMV0pKQorCQlpZiAoIWlzc3BhY2UoZW5kWy0xXSkpCiAJCQlicmVhazsKIAkJZW5kLS07CiAJfQpAQCAtMTk5LDcgKzE3OCw3IEBACiAKIAkvKiBza2lwIGxlYWRpbmcgd2hpdGUgc3BhY2VzICovCiAJd2hpbGUgKG5leHQtPmxzX2xlbikgewotCQlpZiAoIWNmc19pc3doaXRlKCpuZXh0LT5sc19zdHIpKQorCQlpZiAoIWlzc3BhY2UoKm5leHQtPmxzX3N0cikpCiAJCQlicmVhazsKIAkJbmV4dC0+bHNfc3RyKys7CiAJCW5leHQtPmxzX2xlbi0tOwpAQCAtMjI2LDE0ICsyMDUsMTMgQEAKIAogCS8qIHNraXAgZW5kaW5nIHdoaXRlc3BhY2VzICovCiAJd2hpbGUgKC0tZW5kICE9IHJlcy0+bHNfc3RyKSB7Ci0JCWlmICghY2ZzX2lzd2hpdGUoKmVuZCkpCisJCWlmICghaXNzcGFjZSgqZW5kKSkKIAkJCWJyZWFrOwogCX0KIAogCXJlcy0+bHNfbGVuID0gZW5kIC0gcmVzLT5sc19zdHIgKyAxOwogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTChjZnNfZ2V0dG9rKTsKIAogLyoqCiAgKiBDb252ZXJ0cyBzdHJpbmcgdG8gaW50ZWdlci4KQEAgLTI1NiwxMyArMjM0LDEyIEBACiAJCXJldHVybiAwOwogCiAJZm9yICg7IGVuZHAgPCBzdHIgKyBub2I7IGVuZHArKykgewotCQlpZiAoIWNmc19pc3doaXRlKCplbmRwKSkKKwkJaWYgKCFpc3NwYWNlKCplbmRwKSkKIAkJCXJldHVybiAwOwogCX0KIAogCXJldHVybiAoKm51bSA+PSBtaW4gJiYgKm51bSA8PSBtYXgpOwogfQotRVhQT1JUX1NZTUJPTChjZnNfc3RyMm51bV9jaGVjayk7CiAKIC8qKgogICogUGFyc2VzIFw8cmFuZ2VfZXhwclw+IHRva2VuIG9mIHRoZSBzeW50YXguIElmIFxhIGJyYWNrZXRlZCBpcyBmYWxzZSwKQEAgLTI3Nyw3ICsyNTQsNyBAQAogICogXHJldHZhbCAwIHdpbGwgYmUgcmV0dXJuZWQgaWYgaXQgY2FuIGJlIHBhcnNlZCwgb3RoZXJ3aXNlIC1FSU5WQUwgb3IKICAqIC1FTk9NRU0gd2lsbCBiZSByZXR1cm5lZC4KICAqLwotaW50CitzdGF0aWMgaW50CiBjZnNfcmFuZ2VfZXhwcl9wYXJzZShzdHJ1Y3QgY2ZzX2xzdHIgKnNyYywgdW5zaWduZWQgbWluLCB1bnNpZ25lZCBtYXgsCiAJCSAgICAgaW50IGJyYWNrZXRlZCwgc3RydWN0IGNmc19yYW5nZV9leHByICoqZXhwcikKIHsKQEAgLTM0MCw3ICszMTcsNiBAQAogCUxJQkNGU19GUkVFKHJlLCBzaXplb2YoKnJlKSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9Ci1FWFBPUlRfU1lNQk9MKGNmc19yYW5nZV9leHByX3BhcnNlKTsKIAogLyoqCiAgKiBNYXRjaGVzIHZhbHVlIChcYSB2YWx1ZSkgYWdhaW5zdCByYW5nZXMgZXhwcmVzc2lvbiBsaXN0IFxhIGV4cHJfbGlzdC4KQEAgLTM2MSw3ICszMzcsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGNmc19leHByX2xpc3RfbWF0Y2gpOwogCiAvKioKICAqIENvbnZlcnQgZXhwcmVzcyBsaXN0IChcYSBleHByX2xpc3QpIHRvIGFuIGFycmF5IG9mIGFsbCBtYXRjaGVkIHZhbHVlcwpAQCAtNDMyLDE4ICs0MDcsNiBAQAogfQogRVhQT1JUX1NZTUJPTChjZnNfZXhwcl9saXN0X2ZyZWUpOwogCi12b2lkCi1jZnNfZXhwcl9saXN0X3ByaW50KHN0cnVjdCBjZnNfZXhwcl9saXN0ICpleHByX2xpc3QpCi17Ci0Jc3RydWN0IGNmc19yYW5nZV9leHByICpleHByOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShleHByLCAmZXhwcl9saXN0LT5lbF9leHBycywgcmVfbGluaykgewotCQlDREVCVUcoRF9XQVJOSU5HLCAiJWQtJWQvJWRcbiIsCi0JCSAgICAgICBleHByLT5yZV9sbywgZXhwci0+cmVfaGksIGV4cHItPnJlX3N0cmlkZSk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChjZnNfZXhwcl9saXN0X3ByaW50KTsKLQogLyoqCiAgKiBQYXJzZXMgXDxjZnNfZXhwcl9saXN0XD4gdG9rZW4gb2YgdGhlIHN5bnRheC4KICAqCkBAIC01MjYsNyArNDg5LDYgQEAKIAkJY2ZzX2V4cHJfbGlzdF9mcmVlKGVsKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGNmc19leHByX2xpc3RfZnJlZV9saXN0KTsKIAogaW50CiBjZnNfaXBfYWRkcl9wYXJzZShjaGFyICpzdHIsIGludCBsZW4sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3B1LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3B1LmMKaW5kZXggNThiYjI1Ni4uNzdiMWVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jcHUuYwpAQCAtOTUyLDYgKzk1Miw3IEBACiBjZnNfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewogCXVuc2lnbmVkIGludCAgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwlib29sCSAgICAgd2FybjsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfREVBRDoKQEAgLTk2Miw5ICs5NjMsMjEgQEAKIAkJY3B0X2RhdGEuY3B0X3ZlcnNpb24rKzsKIAkJc3Bpbl91bmxvY2soJmNwdF9kYXRhLmNwdF9sb2NrKTsKIAlkZWZhdWx0OgotCQlDV0FSTigiTHVzdHJlOiBjYW4ndCBzdXBwb3J0IENQVSBob3RwbHVnIHdlbGwgbm93LCAiCi0JCSAgICAgICJwZXJmb3JtYW5jZSBhbmQgc3RhYmlsaXR5IGNvdWxkIGJlIGltcGFjdGVkIgotCQkgICAgICAiW0NQVSAldSBub3RpZnk6ICVseF1cbiIsIGNwdSwgYWN0aW9uKTsKKwkJaWYgKGFjdGlvbiAhPSBDUFVfREVBRCAmJiBhY3Rpb24gIT0gQ1BVX0RFQURfRlJPWkVOKSB7CisJCQlDREVCVUcoRF9JTkZPLCAiQ1BVIGNoYW5nZWQgW2NwdSAldSBhY3Rpb24gJWx4XVxuIiwKKwkJCSAgICAgICBjcHUsIGFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCisJCWRvd24oJmNwdF9kYXRhLmNwdF9tdXRleCk7CisJCS8qIGlmIGFsbCBIVHMgaW4gYSBjb3JlIGFyZSBvZmZsaW5lLCBpdCBtYXkgYnJlYWsgYWZmaW5pdHkgKi8KKwkJY2ZzX2NwdV9odF9zaWJsaW5ncyhjcHUsIGNwdF9kYXRhLmNwdF9jcHVtYXNrKTsKKwkJd2FybiA9IGFueV9vbmxpbmVfY3B1KCpjcHRfZGF0YS5jcHRfY3B1bWFzaykgPj0gbnJfY3B1X2lkczsKKwkJdXAoJmNwdF9kYXRhLmNwdF9tdXRleCk7CisJCUNERUJVRyh3YXJuID8gRF9XQVJOSU5HIDogRF9JTkZPLAorCQkgICAgICAgIkx1c3RyZTogY2FuJ3Qgc3VwcG9ydCBDUFUgcGx1Zy1vdXQgd2VsbCBub3csICIKKwkJICAgICAgICJwZXJmb3JtYW5jZSBhbmQgc3RhYmlsaXR5IGNvdWxkIGJlIGltcGFjdGVkICIKKwkJICAgICAgICJbQ1BVICV1IGFjdGlvbjogJWx4XVxuIiwgY3B1LCBhY3Rpb24pOwogCX0KIAogCXJldHVybiBOT1RJRllfT0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3VycHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWN1cnByb2MuYwppbmRleCBhMmVmNjRjLi5lNzRjM2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3VycHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jdXJwcm9jLmMKQEAgLTU1LDI1ICs1NSwxMyBAQAogICogZm9yIExpbnV4IGtlcm5lbC4KICAqLwogCi1pbnQgICAgY2ZzX2N1cnByb2NfZ3JvdXBzX25yKHZvaWQpCi17Ci0JaW50IG5yOwotCi0JdGFza19sb2NrKGN1cnJlbnQpOwotCW5yID0gY3VycmVudF9jcmVkKCktPmdyb3VwX2luZm8tPm5ncm91cHM7Ci0JdGFza191bmxvY2soY3VycmVudCk7Ci0JcmV0dXJuIG5yOwotfQotCi0vKiBDdXJyZW50bHkgYWxsIHRoZSBDRlNfQ0FQXyogZGVmaW5lcyBtYXRjaCBDQVBfKiBvbmVzLiAqLwotI2RlZmluZSBjZnNfY2FwX3BhY2soY2FwKSAoY2FwKQotI2RlZmluZSBjZnNfY2FwX3VucGFjayhjYXApIChjYXApCi0KIHZvaWQgY2ZzX2NhcF9yYWlzZShjZnNfY2FwX3QgY2FwKQogewogCXN0cnVjdCBjcmVkICpjcmVkOwotCWlmICgoY3JlZCA9IHByZXBhcmVfY3JlZHMoKSkpIHsKLQkJY2FwX3JhaXNlKGNyZWQtPmNhcF9lZmZlY3RpdmUsIGNmc19jYXBfdW5wYWNrKGNhcCkpOworCisJY3JlZCA9IHByZXBhcmVfY3JlZHMoKTsKKwlpZiAoY3JlZCkgeworCQljYXBfcmFpc2UoY3JlZC0+Y2FwX2VmZmVjdGl2ZSwgY2FwKTsKIAkJY29tbWl0X2NyZWRzKGNyZWQpOwogCX0KIH0KQEAgLTgxLDQyICs2OSwyOCBAQAogdm9pZCBjZnNfY2FwX2xvd2VyKGNmc19jYXBfdCBjYXApCiB7CiAJc3RydWN0IGNyZWQgKmNyZWQ7Ci0JaWYgKChjcmVkID0gcHJlcGFyZV9jcmVkcygpKSkgewotCQljYXBfbG93ZXIoY3JlZC0+Y2FwX2VmZmVjdGl2ZSwgY2ZzX2NhcF91bnBhY2soY2FwKSk7CisKKwljcmVkID0gcHJlcGFyZV9jcmVkcygpOworCWlmIChjcmVkKSB7CisJCWNhcF9sb3dlcihjcmVkLT5jYXBfZWZmZWN0aXZlLCBjYXApOwogCQljb21taXRfY3JlZHMoY3JlZCk7CiAJfQogfQogCiBpbnQgY2ZzX2NhcF9yYWlzZWQoY2ZzX2NhcF90IGNhcCkKIHsKLQlyZXR1cm4gY2FwX3JhaXNlZChjdXJyZW50X2NhcCgpLCBjZnNfY2FwX3VucGFjayhjYXApKTsKKwlyZXR1cm4gY2FwX3JhaXNlZChjdXJyZW50X2NhcCgpLCBjYXApOwogfQogCiB2b2lkIGNmc19rZXJuZWxfY2FwX3BhY2soa2VybmVsX2NhcF90IGtjYXAsIGNmc19jYXBfdCAqY2FwKQogewotI2lmIGRlZmluZWQgKF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04pICYmIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04gPT0gMHgxOTk4MDMzMAotCSpjYXAgPSBjZnNfY2FwX3BhY2soa2NhcCk7Ci0jZWxpZiBkZWZpbmVkIChfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OKSAmJiBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OID09IDB4MjAwNzEwMjYKLQkqY2FwID0gY2ZzX2NhcF9wYWNrKGtjYXBbMF0pOwotI2VsaWYgZGVmaW5lZChfS0VSTkVMX0NBUEFCSUxJVFlfVkVSU0lPTikgJiYgX0tFUk5FTF9DQVBBQklMSVRZX1ZFUlNJT04gPT0gMHgyMDA4MDUyMgogCS8qIFhYWCBsb3N0IGhpZ2ggYnl0ZSAqLwotCSpjYXAgPSBjZnNfY2FwX3BhY2soa2NhcC5jYXBbMF0pOwotI2Vsc2UKLQkjZXJyb3IgIm5lZWQgY29ycmVjdCBfS0VSTkVMX0NBUEFCSUxJVFlfVkVSU0lPTiAiCi0jZW5kaWYKKwkqY2FwID0ga2NhcC5jYXBbMF07CiB9CiAKIHZvaWQgY2ZzX2tlcm5lbF9jYXBfdW5wYWNrKGtlcm5lbF9jYXBfdCAqa2NhcCwgY2ZzX2NhcF90IGNhcCkKIHsKLSNpZiBkZWZpbmVkIChfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OKSAmJiBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OID09IDB4MTk5ODAzMzAKLQkqa2NhcCA9IGNmc19jYXBfdW5wYWNrKGNhcCk7Ci0jZWxpZiBkZWZpbmVkIChfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OKSAmJiBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OID09IDB4MjAwNzEwMjYKLQkoKmtjYXApWzBdID0gY2ZzX2NhcF91bnBhY2soY2FwKTsKLSNlbGlmIGRlZmluZWQoX0tFUk5FTF9DQVBBQklMSVRZX1ZFUlNJT04pICYmIF9LRVJORUxfQ0FQQUJJTElUWV9WRVJTSU9OID09IDB4MjAwODA1MjIKLQlrY2FwLT5jYXBbMF0gPSBjZnNfY2FwX3VucGFjayhjYXApOwotI2Vsc2UKLQkjZXJyb3IgIm5lZWQgY29ycmVjdCBfS0VSTkVMX0NBUEFCSUxJVFlfVkVSU0lPTiAiCi0jZW5kaWYKKwlrY2FwLT5jYXBbMF0gPSBjYXA7CiB9CiAKIGNmc19jYXBfdCBjZnNfY3VycHJvY19jYXBfcGFjayh2b2lkKQpAQCAtMTI2LDIwICsxMDAsNiBAQAogCXJldHVybiBjYXA7CiB9CiAKLXZvaWQgY2ZzX2N1cnByb2NfY2FwX3VucGFjayhjZnNfY2FwX3QgY2FwKQotewotCXN0cnVjdCBjcmVkICpjcmVkOwotCWlmICgoY3JlZCA9IHByZXBhcmVfY3JlZHMoKSkpIHsKLQkJY2ZzX2tlcm5lbF9jYXBfdW5wYWNrKCZjcmVkLT5jYXBfZWZmZWN0aXZlLCBjYXApOwotCQljb21taXRfY3JlZHMoY3JlZCk7Ci0JfQotfQotCi1pbnQgY2ZzX2NhcGFibGUoY2ZzX2NhcF90IGNhcCkKLXsKLQlyZXR1cm4gY2FwYWJsZShjZnNfY2FwX3VucGFjayhjYXApKTsKLX0KLQogc3RhdGljIGludCBjZnNfYWNjZXNzX3Byb2Nlc3Nfdm0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpCiB7CkBAIC0yOTIsMTMgKzI1MiwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChjZnNfZ2V0X2Vudmlyb24pOwogCi1FWFBPUlRfU1lNQk9MKGNmc19jdXJwcm9jX2dyb3Vwc19ucik7CiBFWFBPUlRfU1lNQk9MKGNmc19jYXBfcmFpc2UpOwogRVhQT1JUX1NZTUJPTChjZnNfY2FwX2xvd2VyKTsKIEVYUE9SVF9TWU1CT0woY2ZzX2NhcF9yYWlzZWQpOwogRVhQT1JUX1NZTUJPTChjZnNfY3VycHJvY19jYXBfcGFjayk7Ci1FWFBPUlRfU1lNQk9MKGNmc19jdXJwcm9jX2NhcF91bnBhY2spOwotRVhQT1JUX1NZTUJPTChjZnNfY2FwYWJsZSk7CiAKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtbW9kdWxlLmMKaW5kZXggNTUyOTZhMy4uZTZlYWUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1tb2R1bGUuYwpAQCAtMTUwLDEyICsxNTAsMTIgQEAKIAkvKiBIYW5kbGUgcGxhdGZvcm0tZGVwZW5kZW50IElPQyByZXF1ZXN0cyAqLwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJT0NfTElCQ0ZTX1BBTklDOgotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0JPT1QpKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQk9PVCkpCiAJCQlyZXR1cm4gKC1FUEVSTSk7CiAJCXBhbmljKCJkZWJ1Z2N0bC1pbnZva2VkIHBhbmljIik7CiAJCXJldHVybiAoMCk7CiAJY2FzZSBJT0NfTElCQ0ZTX01FTUhPRzoKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwogCQkvKiBnbyB0aG91Z2h0ICovCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByaW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1wcmltLmMKaW5kZXggYzdiYzdmYy4uOWE0MGQxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByaW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJpbS5jCkBAIC00NiwxMyArNDYsNiBAQAogI2luY2x1ZGUgPGFzbS9rZ2RiLmg+CiAjZW5kaWYKIAotdm9pZAotaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCh3YWl0X3F1ZXVlX3QgKmxpbmspCi17Ci0JaW5pdF93YWl0cXVldWVfZW50cnkobGluaywgY3VycmVudCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQpOwotCiAvKioKICAqIHdhaXRfcXVldWVfdCBvZiBMaW51eCAodmVyc2lvbiA8IDIuNi4zNCkgaXMgYSBGSUZPIGxpc3QgZm9yIGV4Y2x1c2l2ZWx5CiAgKiB3YWl0aW5nIHRocmVhZHMsIHdoaWNoIGlzIG5vdCBhbHdheXMgZGVzaXJhYmxlIGJlY2F1c2UgYWxsIHRocmVhZHMgd2lsbApAQCAtNzcsMzcgKzcwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlX2hlYWQpOwogCi12b2lkCi13YWl0cV93YWl0KHdhaXRfcXVldWVfdCAqbGluaywgbG9uZyBzdGF0ZSkKLXsKLQlzY2hlZHVsZSgpOwotfQotRVhQT1JUX1NZTUJPTCh3YWl0cV93YWl0KTsKLQotaW50NjRfdAotd2FpdHFfdGltZWR3YWl0KHdhaXRfcXVldWVfdCAqbGluaywgbG9uZyBzdGF0ZSwgaW50NjRfdCB0aW1lb3V0KQotewotCXJldHVybiBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotfQotRVhQT1JUX1NZTUJPTCh3YWl0cV90aW1lZHdhaXQpOwotCi12b2lkCi1zY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUobG9uZyBzdGF0ZSwgaW50NjRfdCB0aW1lb3V0KQotewotCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKLQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotfQotRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUpOwotCi0vKiBkZXNjaGVkdWxlIGZvciBhIGJpdC4uLiAqLwotdm9pZAotY2ZzX3BhdXNlKGNmc19kdXJhdGlvbl90IHRpY2tzKQotewotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlzY2hlZHVsZV90aW1lb3V0KHRpY2tzKTsKLX0KLUVYUE9SVF9TWU1CT0woY2ZzX3BhdXNlKTsKLQogdm9pZCBjZnNfaW5pdF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdCkKIHsKIAlpbml0X3RpbWVyKHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL25pZHN0cmluZ3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9uaWRzdHJpbmdzLmMKaW5kZXggNzMyYWU1NS4uY2ZiMjc0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL25pZHN0cmluZ3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbmlkc3RyaW5ncy5jCkBAIC02NSwyMyArNjUsMjAgQEAKIAlzcGluX2xvY2tfaW5pdCgmbGliY2ZzX25pZHN0cmluZ19sb2NrKTsKIH0KIAotIyBkZWZpbmUgTklEU1RSX0xPQ0soZikgICBzcGluX2xvY2tfaXJxc2F2ZSgmbGliY2ZzX25pZHN0cmluZ19sb2NrLCBmKQotIyBkZWZpbmUgTklEU1RSX1VOTE9DSyhmKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaWJjZnNfbmlkc3RyaW5nX2xvY2ssIGYpCi0KIHN0YXRpYyBjaGFyICoKIGxpYmNmc19uZXh0X25pZHN0cmluZyh2b2lkKQogewogCWNoYXIJICAqc3RyOwogCXVuc2lnbmVkIGxvbmcgIGZsYWdzOwogCi0JTklEU1RSX0xPQ0soZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZsaWJjZnNfbmlkc3RyaW5nX2xvY2ssIGZsYWdzKTsKIAogCXN0ciA9IGxpYmNmc19uaWRzdHJpbmdzW2xpYmNmc19uaWRzdHJpbmdfaWR4KytdOwogCWlmIChsaWJjZnNfbmlkc3RyaW5nX2lkeCA9PQogCSAgICBzaXplb2YobGliY2ZzX25pZHN0cmluZ3MpL3NpemVvZihsaWJjZnNfbmlkc3RyaW5nc1swXSkpCiAJCWxpYmNmc19uaWRzdHJpbmdfaWR4ID0gMDsKIAotCU5JRFNUUl9VTkxPQ0soZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpYmNmc19uaWRzdHJpbmdfbG9jaywgZmxhZ3MpOwogCXJldHVybiBzdHI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy90cmFjZWZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy90cmFjZWZpbGUuYwppbmRleCA1NDI5MGNlLi5jODU5OWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdHJhY2VmaWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3RyYWNlZmlsZS5jCkBAIC0xMDc2LDExICsxMDc2LDEwIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmX193YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJl9fd2FpdCwgY3VycmVudCk7CiAJCWFkZF93YWl0X3F1ZXVlKCZ0Y3RsLT50Y3RsX3dhaXRxLCAmX193YWl0KTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJd2FpdHFfdGltZWR3YWl0KCZfX3dhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSwKLQkJCQkgICAgY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZ0Y3RsLT50Y3RsX3dhaXRxLCAmX193YWl0KTsKIAl9CiAJY29tcGxldGUoJnRjdGwtPnRjdGxfc3RvcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdXBjYWxsX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdXBjYWxsX2NhY2hlLmMKaW5kZXggMjQ1YjQ2Zi4uODA4NWUzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3VwY2FsbF9jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy91cGNhbGxfY2FjaGUuYwpAQCAtMjE4LDEzICsyMTgsMTIgQEAKIAkJCSAgICAgIE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCQlsb25nIGxlZnQ7CiAKLQkJaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCgmd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAkJYWRkX3dhaXRfcXVldWUoJmVudHJ5LT51ZV93YWl0cSwgJndhaXQpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzcGluX3VubG9jaygmY2FjaGUtPnVjX2xvY2spOwogCi0JCWxlZnQgPSB3YWl0cV90aW1lZHdhaXQoJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSwKLQkJCQkJICAgZXhwaXJ5KTsKKwkJbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXQoZXhwaXJ5KTsKIAogCQlzcGluX2xvY2soJmNhY2hlLT51Y19sb2NrKTsKIAkJcmVtb3ZlX3dhaXRfcXVldWUoJmVudHJ5LT51ZV93YWl0cSwgJndhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3dvcmtpdGVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvd29ya2l0ZW0uYwppbmRleCAxYTU1YzgxLi5iYTE2ZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvd29ya2l0ZW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvd29ya2l0ZW0uYwpAQCAtMzM0LDcgKzMzNCw4IEBACiAJCSAgICAgICBzY2hlZC0+d3NfbnRocmVhZHMsIHNjaGVkLT53c19uYW1lKTsKIAogCQlzcGluX3VubG9jaygmY2ZzX3dpX2RhdGEud2lfZ2xvY2spOwotCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDIwKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkgLyAyMCk7CiAJCXNwaW5fbG9jaygmY2ZzX3dpX2RhdGEud2lfZ2xvY2spOwogCX0KIApAQCAtMzg5LDExICszOTAsMTEgQEAKIAkJc3Bpbl91bmxvY2soJmNmc193aV9kYXRhLndpX2dsb2NrKTsKIAogCQlpZiAoc2NoZWQtPndzX2NwdGFiICE9IE5VTEwgJiYgc2NoZWQtPndzX2NwdCA+PSAwKSB7Ci0JCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc18lMDJkXyUwMmQiLAorCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXNfJTAyZF8lMDJ1IiwKIAkJCQkgc2NoZWQtPndzX25hbWUsIHNjaGVkLT53c19jcHQsCiAJCQkJIHNjaGVkLT53c19udGhyZWFkcyk7CiAJCX0gZWxzZSB7Ci0JCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc18lMDJkIiwKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzXyUwMnUiLAogCQkJCSBzY2hlZC0+d3NfbmFtZSwgc2NoZWQtPndzX250aHJlYWRzKTsKIAkJfQogCkBAIC00NTksNyArNDYwLDggQEAKIAogCQl3aGlsZSAoc2NoZWQtPndzX250aHJlYWRzICE9IDApIHsKIAkJCXNwaW5fdW5sb2NrKCZjZnNfd2lfZGF0YS53aV9nbG9jayk7Ci0JCQljZnNfcGF1c2UoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDIwKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDIwKTsKIAkJCXNwaW5fbG9jaygmY2ZzX3dpX2RhdGEud2lfZ2xvY2spOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZjZnNfd2lfZGF0YS53aV9nbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jCmluZGV4IGNiZDY2M2UuLjhiNTUwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkvKiBrZXJuZWwgPj0gMi42LjM4IGxhc3QgcmVmY291bnQgaXMgZGVjcmVhc2VkIGFmdGVyIHRoaXMgZnVuY3Rpb24uICovCiAJTEFTU0VSVChkX2NvdW50KGRlKSA9PSAxKTsKIAotCS8qIERpc2FibGUgdGhpcyBwaWVjZSBvZiBjb2RlIHRlbXByb2FyaWx5IGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQKKwkvKiBEaXNhYmxlIHRoaXMgcGllY2Ugb2YgY29kZSB0ZW1wb3JhcmlseSBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkCiAJICogaW5zaWRlIGRjYWNoZV9sb2NrIHNvIGl0J3Mgbm90IGFwcHJvcHJpYXRlIHRvIGRvIGxvdHMgb2Ygd29yawogCSAqIGhlcmUuIEFUVEVOVElPTjogQmVmb3JlIHRoaXMgcGllY2Ugb2YgY29kZSBlbmFibGluZywgTFUtMjQ4NyBtdXN0IGJlCiAJICogcmVzb2x2ZWQuICovCkBAIC0xNzYsNyArMTc2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsbF9zZXRfZGQoc3RydWN0IGRlbnRyeSAqZGUpCitpbnQgbGxfZF9pbml0KHN0cnVjdCBkZW50cnkgKmRlKQogewogCUxBU1NFUlQoZGUgIT0gTlVMTCk7CiAKQEAgLTE5MCw0MCArMTkwLDIyIEBACiAJCU9CRF9BTExPQ19QVFIobGxkKTsKIAkJaWYgKGxpa2VseShsbGQgIT0gTlVMTCkpIHsKIAkJCXNwaW5fbG9jaygmZGUtPmRfbG9jayk7Ci0JCQlpZiAobGlrZWx5KGRlLT5kX2ZzZGF0YSA9PSBOVUxMKSkKKwkJCWlmIChsaWtlbHkoZGUtPmRfZnNkYXRhID09IE5VTEwpKSB7CiAJCQkJZGUtPmRfZnNkYXRhID0gbGxkOwotCQkJZWxzZQorCQkJCV9fZF9sdXN0cmVfaW52YWxpZGF0ZShkZSk7CisJCQl9IGVsc2UgewogCQkJCU9CRF9GUkVFX1BUUihsbGQpOworCQkJfQogCQkJc3Bpbl91bmxvY2soJmRlLT5kX2xvY2spOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9CisJTEFTU0VSVChkZS0+ZF9vcCA9PSAmbGxfZF9vcHMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBsbF9kb3BzX2luaXQoc3RydWN0IGRlbnRyeSAqZGUsIGludCBibG9jaywgaW50IGluaXRfc2EpCi17Ci0Jc3RydWN0IGxsX2RlbnRyeV9kYXRhICpsbGQgPSBsbF9kMmQoZGUpOwotCWludCByYyA9IDA7Ci0KLQlpZiAobGxkID09IE5VTEwgJiYgYmxvY2sgIT0gMCkgewotCQlyYyA9IGxsX3NldF9kZChkZSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQotCQlsbGQgPSBsbF9kMmQoZGUpOwotCX0KLQotCWlmIChsbGQgIT0gTlVMTCAmJiBpbml0X3NhICE9IDApCi0JCWxsZC0+bGxkX3NhX2dlbmVyYXRpb24gPSAwOwotCi0JLyoga2VybmVsID49IDIuNi4zOCBkX29wIGlzIHNldCBpbiBkX2FsbG9jKCkgKi8KLQlMQVNTRVJUKGRlLT5kX29wID09ICZsbF9kX29wcyk7Ci0JcmV0dXJuIHJjOwotfQotCiB2b2lkIGxsX2ludGVudF9kcm9wX2xvY2soc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KQogewogCWlmIChpdC0+aXRfb3AgJiYgaXQtPmQubHVzdHJlLml0X2xvY2tfbW9kZSkgewpAQCAtMjU5LDkgKzI0MSw2IEBACiAJCSBwdGxycGNfcmVxX2ZpbmlzaGVkKGl0LT5kLmx1c3RyZS5pdF9kYXRhKTsgLyogbGxfZmlsZV9vcGVuICovCiAJaWYgKGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0VOUV9DUkVBVEVfUkVGKSkgLyogY3JlYXRlIHJlYyAqLwogCQlwdGxycGNfcmVxX2ZpbmlzaGVkKGl0LT5kLmx1c3RyZS5pdF9kYXRhKTsKLQlpZiAoaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfRU5RX0NPTVBMRVRFKSkgLyogc2F2ZWQgcmVxIGZyb20gcmV2YWxpZGF0ZQotCQkJCQkJICAgICogdG8gbG9va3VwICovCi0JCXB0bHJwY19yZXFfZmluaXNoZWQoaXQtPmQubHVzdHJlLml0X2RhdGEpOwogCiAJaXQtPmQubHVzdHJlLml0X2Rpc3Bvc2l0aW9uID0gMDsKIAlpdC0+ZC5sdXN0cmUuaXRfZGF0YSA9IE5VTEw7CkBAIC0zNDYsMjY4ICszMjUsMzIgQEAKIAogfQogCi1pbnQgbGxfcmV2YWxpZGF0ZV9pdChzdHJ1Y3QgZGVudHJ5ICpkZSwgaW50IGxvb2t1cF9mbGFncywKLQkJICAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCitzdGF0aWMgaW50IGxsX3JldmFsaWRhdGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQl1bnNpZ25lZCBpbnQgbG9va3VwX2ZsYWdzKQogewotCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKLQlzdHJ1Y3QgbG9va3VwX2ludGVudCBsb29rdXBfaXQgPSB7IC5pdF9vcCA9IElUX0xPT0tVUCB9OwotCXN0cnVjdCBvYmRfZXhwb3J0ICpleHA7Ci0Jc3RydWN0IGlub2RlICpwYXJlbnQgPSBkZS0+ZF9wYXJlbnQtPmRfaW5vZGU7Ci0JaW50IHJjOworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKIAotCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOm5hbWU9JXMsaW50ZW50PSVzXG4iLCBkZS0+ZF9uYW1lLm5hbWUsCi0JICAgICAgIExMX0lUMlNUUihpdCkpOworCS8qCisJICogaWYgb3BlbiZjcmVhdGUgaXMgc2V0LCB0YWxrIHRvIE1EUyB0byBtYWtlIHN1cmUgZmlsZSBpcyBjcmVhdGVkIGlmCisJICogbmVjZXNzYXJ5LCBiZWNhdXNlIHdlIGNhbid0IGRvIHRoaXMgaW4gLT5vcGVuKCkgbGF0ZXIgc2luY2UgdGhhdCdzCisJICogY2FsbGVkIG9uIGFuIGlub2RlLiByZXR1cm4gMCBoZXJlIHRvIGxldCBsb29rdXAgdG8gaGFuZGxlIHRoaXMuCisJICovCisJaWYgKChsb29rdXBfZmxhZ3MgJiAoTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKSkgPT0KKwkgICAgKExPT0tVUF9PUEVOIHwgTE9PS1VQX0NSRUFURSkpCisJCXJldHVybiAwOwogCi0JaWYgKGRlLT5kX2lub2RlID09IE5VTEwpIHsKLQkJX191NjQgaWJpdHM7Ci0KLQkJLyogV2UgY2FuIG9ubHkgdXNlIG5lZ2F0aXZlIGRlbnRyaWVzIGlmIHRoaXMgaXMgc3RhdCBvciBsb29rdXAsCi0JCSAgIGZvciBvcGVucyBhbmQgc3R1ZmYgd2UgZG8gbmVlZCB0byBxdWVyeSBzZXJ2ZXIuICovCi0JCS8qIElmIHRoZXJlIGlzIElUX0NSRUFUIGluIGludGVudCBvcCBzZXQsIHRoZW4gd2UgbXVzdCB0aHJvdwotCQkgICBhd2F5IHRoaXMgbmVnYXRpdmUgZGVudHJ5IGFuZCBhY3R1YWxseSBkbyB0aGUgcmVxdWVzdCB0bwotCQkgICBrZXJuZWwgdG8gY3JlYXRlIHdoYXRldmVyIG5lZWRzIHRvIGJlIGNyZWF0ZWQgKGlmIHBvc3NpYmxlKSovCi0JCWlmIChpdCAmJiAoaXQtPml0X29wICYgSVRfQ1JFQVQpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKGRfbHVzdHJlX2ludmFsaWQoZGUpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWJpdHMgPSBNRFNfSU5PREVMT0NLX1VQREFURTsKLQkJcmMgPSBsbF9oYXZlX21kX2xvY2socGFyZW50LCAmaWJpdHMsIExDS19NSU5NT0RFKTsKLQkJR09UTyhvdXRfc2EsIHJjKTsKLQl9Ci0KLQkvKiBOZXZlciBleGVjdXRlIGludGVudHMgZm9yIG1vdW50IHBvaW50cy4KLQkgKiBBdHRyaWJ1dGVzIHdpbGwgYmUgZml4ZWQgdXAgaW4gbGxfaW5vZGVfcmV2YWxpZGF0ZV9pdCAqLwotCWlmIChkX21vdW50cG9pbnQoZGUpKQotCQlHT1RPKG91dF9zYSwgcmMgPSAxKTsKLQotCS8qIG5lZWQgdG8gZ2V0IGF0dHJpYnV0ZXMgaW4gY2FzZSByb290IGdvdCBjaGFuZ2VkIGZyb20gb3RoZXIgY2xpZW50ICovCi0JaWYgKGRlID09IGRlLT5kX3NiLT5zX3Jvb3QpIHsKLQkJcmMgPSBfX2xsX2lub2RlX3JldmFsaWRhdGVfaXQoZGUsIGl0LCBNRFNfSU5PREVMT0NLX0xPT0tVUCk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAxOwotCQlHT1RPKG91dF9zYSwgcmMpOwotCX0KLQotCWV4cCA9IGxsX2kybWRleHAoZGUtPmRfaW5vZGUpOwotCi0JT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9NRENfUkVWQUxJREFURV9QQVVTRSwgNSk7Ci0JbGxfZnJvYl9pbnRlbnQoJml0LCAmbG9va3VwX2l0KTsKLQlMQVNTRVJUKGl0KTsKLQotCWlmIChpdC0+aXRfb3AgPT0gSVRfTE9PS1VQICYmICFkX2x1c3RyZV9pbnZhbGlkKGRlKSkKKwlpZiAobG9va3VwX2ZsYWdzICYgKExPT0tVUF9QQVJFTlQgfCBMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKQogCQlyZXR1cm4gMTsKIAotCWlmIChpdC0+aXRfb3AgPT0gSVRfT1BFTikgewotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGUtPmRfaW5vZGU7Ci0JCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwotCQlzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKipvY2hfcDsKLQkJX191NjQgaWJpdHM7CisJaWYgKGRfbmVlZF9zdGF0YWhlYWQoZGlyLCBkZW50cnkpIDw9IDApCisJCXJldHVybiAxOwogCi0JCS8qCi0JCSAqIFdlIHVzZWQgdG8gY2hlY2sgZm9yIE1EU19JTk9ERUxPQ0tfT1BFTiBoZXJlLCBidXQgaW4gZmFjdAotCQkgKiBqdXN0IGhhdmluZyBMT09LVVAgbG9jayBpcyBlbm91Z2ggdG8ganVzdGlmeSBpbm9kZSBpcyB0aGUKLQkJICogc2FtZS4gQW5kIGlmIGlub2RlIGlzIHRoZSBzYW1lIGFuZCB3ZSBoYXZlIHN1aXRhYmxlCi0JCSAqIG9wZW5oYW5kbGUsIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gZG9pbmcgYW5vdGhlciBPUEVOIFJQQwotCQkgKiBqdXN0IHRvIHRocm93IGF3YXkgbmV3bHkgcmVjZWl2ZWQgb3BlbmhhbmRsZS4gIFRoZXJlIGFyZSBubwotCQkgKiBzZWN1cml0eSBpbXBsaWNhdGlvbnMgdG9vLCBpZiBmaWxlIG93bmVyIG9yIGFjY2VzcyBtb2RlIGlzCi0JCSAqIGNoYW5nZSwgTE9PS1VQIGxvY2sgaXMgcmV2b2tlZC4KLQkJICovCisJaWYgKGxvb2t1cF9mbGFncyAmIExPT0tVUF9SQ1UpCisJCXJldHVybiAtRUNISUxEOwogCi0KLQkJaWYgKGl0LT5pdF9mbGFncyAmIEZNT0RFX1dSSVRFKQotCQkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX3dyaXRlX29jaDsKLQkJZWxzZSBpZiAoaXQtPml0X2ZsYWdzICYgRk1PREVfRVhFQykKLQkJCW9jaF9wID0gJmxsaS0+bGxpX21kc19leGVjX29jaDsKLQkJZWxzZQotCQkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX3JlYWRfb2NoOwotCi0JCS8qIENoZWNrIGZvciB0aGUgcHJvcGVyIGxvY2suICovCi0JCWliaXRzID0gTURTX0lOT0RFTE9DS19MT09LVVA7Ci0JCWlmICghbGxfaGF2ZV9tZF9sb2NrKGlub2RlLCAmaWJpdHMsIExDS19NSU5NT0RFKSkKLQkJCWdvdG8gZG9fbG9jazsKLQkJbXV0ZXhfbG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKLQkJaWYgKCpvY2hfcCkgeyAvKiBFdmVyeXRoaW5nIGlzIG9wZW4gYWxyZWFkeSwgZG8gbm90aGluZyAqLwotCQkJLyogT3JpZ2luYWxseSBpdCB3YXMgaWRlYSB0byBkbyBub3QgbGV0IHRoZW0gc3RlYWwgb3VyCi0JCQkgKiBvcGVuIGhhbmRsZSBmcm9tIHVuZGVyIHVzIGJ5ICgqb2NoX3VzZWNvdW50KSsrIGhlcmUuCi0JCQkgKiBCdXQgaW4gY2FzZSB3ZSBoYXZlIHRoZSBoYW5kbGUsIGJ1dCB3ZSBjYW5ub3QgdXNlIGl0Ci0JCQkgKiBkdWUgdG8gbGF0ZXIgY2hlY2tzIChlLmcuIE9fQ1JFQVR8T19FWENMIGZsYWdzIHNldCksCi0JCQkgKiBub2JvZHkgd291bGQgZGVjcmVtZW50IGNvdW50ZXIgaW5jcmVhc2VkIGhlcmUuIFNvIHdlCi0JCQkgKiBqdXN0IGhvcGUgdGhlIGxvY2sgd29uJ3QgYmUgaW52YWxpZGF0ZWQgaW4gYmV0d2Vlbi4KLQkJCSAqIEJ1dCBpZiBpdCB3b3VsZCBiZSwgd2UnbGwgcmVvcGVuIHRoZSBvcGVuIHJlcXVlc3QgdG8KLQkJCSAqIE1EUyBsYXRlciBkdXJpbmcgZmlsZSBvcGVuIHBhdGguCi0JCQkgKi8KLQkJCW11dGV4X3VubG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCW11dGV4X3VubG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKLQl9Ci0KLQlpZiAoaXQtPml0X29wID09IElUX0dFVEFUVFIpIHsKLQkJcmMgPSBsbF9zdGF0YWhlYWRfZW50ZXIocGFyZW50LCAmZGUsIDApOwotCQlpZiAocmMgPT0gMSkKLQkJCWdvdG8gbWFyazsKLQkJZWxzZSBpZiAocmMgIT0gLUVBR0FJTiAmJiByYyAhPSAwKQotCQkJR09UTyhvdXQsIHJjID0gMCk7Ci0JfQotCi1kb19sb2NrOgotCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgcGFyZW50LCBkZS0+ZF9pbm9kZSwKLQkJCQkgICAgIGRlLT5kX25hbWUubmFtZSwgZGUtPmRfbmFtZS5sZW4sCi0JCQkJICAgICAwLCBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7Ci0JaWYgKElTX0VSUihvcF9kYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7Ci0KLQlpZiAoIUlTX1BPU0lYQUNMKHBhcmVudCkgfHwgIWV4cF9jb25uZWN0X3VtYXNrKGV4cCkpCi0JCWl0LT5pdF9jcmVhdGVfbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwotCWl0LT5pdF9jcmVhdGVfbW9kZSB8PSBNX0NIRUNLX1NUQUxFOwotCXJjID0gbWRfaW50ZW50X2xvY2soZXhwLCBvcF9kYXRhLCBOVUxMLCAwLCBpdCwKLQkJCSAgICBsb29rdXBfZmxhZ3MsCi0JCQkgICAgJnJlcSwgbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKLQlpdC0+aXRfY3JlYXRlX21vZGUgJj0gfk1fQ0hFQ0tfU1RBTEU7Ci0JbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0KLQkvKiBJZiByZXEgaXMgTlVMTCwgdGhlbiBtZF9pbnRlbnRfbG9jayBvbmx5IHRyaWVkIHRvIGRvIGEgbG9jayBtYXRjaDsKLQkgKiBpZiBhbGwgd2FzIHdlbGwsIGl0IHdpbGwgcmV0dXJuIDEgaWYgaXQgZm91bmQgbG9ja3MsIDAgb3RoZXJ3aXNlLiAqLwotCWlmIChyZXEgPT0gTlVMTCAmJiByYyA+PSAwKSB7Ci0JCWlmICghcmMpCi0JCQlnb3RvIGRvX2xvb2t1cDsKLQkJR09UTyhvdXQsIHJjKTsKLQl9Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCWlmIChyYyAhPSAtRVNUQUxFKSB7Ci0JCQlDREVCVUcoRF9JTkZPLCAibGxfaW50ZW50X2xvY2s6IHJjICVkIDogaXQtPml0X3N0YXR1cyAiCi0JCQkgICAgICAgIiVkXG4iLCByYywgaXQtPmQubHVzdHJlLml0X3N0YXR1cyk7Ci0JCX0KLQkJR09UTyhvdXQsIHJjID0gMCk7Ci0JfQotCi1yZXZhbGlkYXRlX2ZpbmlzaDoKLQlyYyA9IGxsX3JldmFsaWRhdGVfaXRfZmluaXNoKHJlcSwgaXQsIGRlKTsKLQlpZiAocmMgIT0gMCkgewotCQlpZiAocmMgIT0gLUVTVEFMRSAmJiByYyAhPSAtRU5PRU5UKQotCQkJbGxfaW50ZW50X3JlbGVhc2UoaXQpOwotCQlHT1RPKG91dCwgcmMgPSAwKTsKLQl9Ci0KLQlpZiAoKGl0LT5pdF9vcCAmIElUX09QRU4pICYmIGRlLT5kX2lub2RlICYmCi0JICAgICFTX0lTUkVHKGRlLT5kX2lub2RlLT5pX21vZGUpICYmCi0JICAgICFTX0lTRElSKGRlLT5kX2lub2RlLT5pX21vZGUpKSB7Ci0JCWxsX3JlbGVhc2Vfb3BlbmhhbmRsZShkZSwgaXQpOwotCX0KLQlyYyA9IDE7Ci0KLW91dDoKLQkvKiBXZSBkbyBub3QgZnJlZSByZXF1ZXN0IGFzIGl0IG1heSBiZSByZXVzZWQgZHVyaW5nIGZvbGxvd2luZyBsb29rdXAKLQkgKiAoc2VlIGNvbW1lbnQgaW4gbWRjL21kY19sb2Nrcy5jOjptZGNfaW50ZW50X2xvY2soKSksIHJlcXVlc3Qgd2lsbAotCSAqIGJlIGZyZWVkIGluIGxsX2xvb2t1cF9pdCBvciBpbiBsbF9pbnRlbnRfcmVsZWFzZS4gQnV0IGlmCi0JICogcmVxdWVzdCB3YXMgbm90IGNvbXBsZXRlZCwgd2UgbmVlZCB0byBmcmVlIGl0LiAoYnVnIDUxNTQsIDk5MDMpICovCi0JaWYgKHJlcSAhPSBOVUxMICYmICFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9FTlFfQ09NUExFVEUpKQotCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0JaWYgKHJjID09IDApIHsKLQkJLyogbWR0IG1heSBncmFudCBsYXlvdXQgbG9jayBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZmlsZSwgc28KLQkJICogcmVsZWFzZSB0aGUgbG9jayB0byBhdm9pZCBsZWFraW5nICovCi0JCWxsX2ludGVudF9kcm9wX2xvY2soaXQpOwotCQlsbF9pbnZhbGlkYXRlX2FsaWFzZXMoZGUtPmRfaW5vZGUpOwotCX0gZWxzZSB7Ci0JCV9fdTY0IGJpdHMgPSAwOwotCQlfX3U2NCBtYXRjaGVkX2JpdHMgPSAwOwotCi0JCUNERUJVRyhEX0RFTlRSWSwgInJldmFsaWRhdGVkIGRlbnRyeSAlLipzICglcCkgcGFyZW50ICVwICIKLQkJICAgICAgICJpbm9kZSAlcCByZWZjICVkXG4iLCBkZS0+ZF9uYW1lLmxlbiwKLQkJICAgICAgIGRlLT5kX25hbWUubmFtZSwgZGUsIGRlLT5kX3BhcmVudCwgZGUtPmRfaW5vZGUsCi0JCSAgICAgICBkX2NvdW50KGRlKSk7Ci0KLQkJbGxfc2V0X2xvY2tfZGF0YShleHAsIGRlLT5kX2lub2RlLCBpdCwgJmJpdHMpOwotCi0JCS8qIE5vdGU6IFdlIGhhdmUgdG8gbWF0Y2ggYm90aCBMT09LVVAgYW5kIFBFUk0gbG9jawotCQkgKiBoZXJlIHRvIG1ha2Ugc3VyZSB0aGUgZGVudHJ5IGlzIHZhbGlkIGFuZCBubyBvbmUKLQkJICogY2hhbmdpbmcgdGhlIHBlcm1pc3Npb24uCi0JCSAqIEJ1dCBpZiB0aGUgY2xpZW50IGNvbm5lY3RzIDwgMi40IHNlcnZlciwgd2hpY2ggd2lsbAotCQkgKiBvbmx5IGdyYW50IExPT0tVUCBsb2NrLCBzbyB3ZSBjYW4gb25seSBNYXRjaCBMT09LVVAKLQkJICogbG9jayBmb3Igb2xkIHNlcnZlciAqLwotCQlpZiAoZXhwX2Nvbm5lY3RfZmxhZ3MobGxfaTJtZGV4cChkZS0+ZF9pbm9kZSkpICYmCi0JCQkJCQkJT0JEX0NPTk5FQ1RfTFZCX1RZUEUpCi0JCQltYXRjaGVkX2JpdHMgPQotCQkJCU1EU19JTk9ERUxPQ0tfTE9PS1VQIHwgTURTX0lOT0RFTE9DS19QRVJNOwotCQllbHNlCi0JCQltYXRjaGVkX2JpdHMgPSBNRFNfSU5PREVMT0NLX0xPT0tVUDsKLQotCQlpZiAoKChiaXRzICYgbWF0Y2hlZF9iaXRzKSA9PSBtYXRjaGVkX2JpdHMpICYmCi0JCSAgICBkX2x1c3RyZV9pbnZhbGlkKGRlKSkKLQkJCWRfbHVzdHJlX3JldmFsaWRhdGUoZGUpOwotCQlsbF9sb29rdXBfZmluaXNoX2xvY2tzKGl0LCBkZSk7Ci0JfQotCi1tYXJrOgotCWlmIChpdCAhPSBOVUxMICYmIGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSICYmIHJjID4gMCkKLQkJbGxfc3RhdGFoZWFkX21hcmsocGFyZW50LCBkZSk7Ci0JcmV0dXJuIHJjOwotCi0JLyoKLQkgKiBUaGlzIHBhcnQgaXMgaGVyZSB0byBjb21iYXQgZXZpbC1ldmlsIHJhY2UgaW4gcmVhbF9sb29rdXAgb24gMi42Ci0JICoga2VybmVscy4gIFRoZSByYWNlIGRldGFpbHMgYXJlOiBXZSBlbnRlciBkb19sb29rdXAoKSBsb29raW5nIGZvciBzb21lCi0JICogbmFtZSwgdGhlcmUgaXMgbm90aGluZyBpbiBkY2FjaGUgZm9yIHRoaXMgbmFtZSB5ZXQgYW5kIGRfbG9va3VwKCkKLQkgKiByZXR1cm5zIE5VTEwuICBXZSBwcm9jZWVkIHRvIHJlYWxfbG9va3VwKCksIGFuZCB3aGlsZSB3ZSBkbyB0aGlzLAotCSAqIGFub3RoZXIgcHJvY2VzcyBkb2VzIG9wZW4gb24gdGhlIHNhbWUgZmlsZSB3ZSBsb29raW5nIHVwIChtb3N0IHNpbXBsZQotCSAqIHJlcHJvZHVjZXIpLCBvcGVuIHN1Y2NlZWRzIGFuZCB0aGUgZGVudHJ5IGlzIGFkZGVkLiBOb3cgYmFjayB0bwotCSAqIHVzLiBJbiByZWFsX2xvb2t1cCgpIHdlIGRvIGRfbG9va3VwKCkgYWdhaW4gYW5kIHN1ZGRlbmx5IGZpbmQgdGhlCi0JICogZGVudHJ5LCBzbyB3ZSBjYWxsIGRfcmV2YWxpZGF0ZSBvbiBpdCwgYnV0IHRoZXJlIGlzIG5vIGxvY2ssIHNvCi0JICogd2l0aG91dCB0aGlzIGNvZGUgd2Ugd291bGQgcmV0dXJuIDAsIGJ1dCB1bnBhdGNoZWQgcmVhbF9sb29rdXAganVzdAotCSAqIHJldHVybnMgLUVOT0VOVCBpbiBzdWNoIGEgY2FzZSBpbnN0ZWFkIG9mIHJldHJ5aW5nIHRoZSBsb29rdXAuIE9uY2UKLQkgKiB0aGlzIGlzIGRlYWx0IHdpdGggaW4gcmVhbF9sb29rdXAoKSwgYWxsIG9mIHRoaXMgdWdseSBtZXNzIGNhbiBnbyBhbmQKLQkgKiB3ZSBjYW4ganVzdCBjaGVjayBsb2NrcyBpbiAtPmRfcmV2YWxpZGF0ZSB3aXRob3V0IGRvaW5nIGFueSBSUENzCi0JICogZXZlci4KLQkgKi8KLWRvX2xvb2t1cDoKLQlpZiAoaXQgIT0gJmxvb2t1cF9pdCkgewotCQkvKiBNRFNfSU5PREVMT0NLX1VQREFURSBuZWVkZWQgZm9yIElUX0dFVEFUVFIgY2FzZS4gKi8KLQkJaWYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSKQotCQkJbG9va3VwX2l0Lml0X29wID0gSVRfR0VUQVRUUjsKLQkJbGxfbG9va3VwX2ZpbmlzaF9sb2NrcyhpdCwgZGUpOwotCQlpdCA9ICZsb29rdXBfaXQ7Ci0JfQotCi0JLyogRG8gcmVhbCBsb29rdXAgaGVyZS4gKi8KLQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIHBhcmVudCwgTlVMTCwgZGUtPmRfbmFtZS5uYW1lLAotCQkJCSAgICAgZGUtPmRfbmFtZS5sZW4sIDAsIChpdC0+aXRfb3AgJiBJVF9DUkVBVCA/Ci0JCQkJCQkJIExVU1RSRV9PUENfQ1JFQVRFIDoKLQkJCQkJCQkgTFVTVFJFX09QQ19BTlkpLCBOVUxMKTsKLQlpZiAoSVNfRVJSKG9wX2RhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKLQotCXJjID0gbWRfaW50ZW50X2xvY2soZXhwLCBvcF9kYXRhLCBOVUxMLCAwLCAgaXQsIDAsICZyZXEsCi0JCQkgICAgbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKLQlpZiAocmMgPj0gMCkgewotCQlzdHJ1Y3QgbWR0X2JvZHkgKm1kdF9ib2R5OwotCQlzdHJ1Y3QgbHVfZmlkIGZpZCA9IHsuZl9zZXEgPSAwLCAuZl9vaWQgPSAwLCAuZl92ZXIgPSAwfTsKLQkJbWR0X2JvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwotCi0JCWlmIChkZS0+ZF9pbm9kZSkKLQkJCWZpZCA9ICpsbF9pbm9kZTJmaWQoZGUtPmRfaW5vZGUpOwotCi0JCS8qIHNlZSBpZiB3ZSBnb3Qgc2FtZSBpbm9kZSwgaWYgbm90IC0gcmV0dXJuIGVycm9yICovCi0JCWlmIChsdV9maWRfZXEoJmZpZCwgJm1kdF9ib2R5LT5maWQxKSkgewotCQkJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0JCQlvcF9kYXRhID0gTlVMTDsKLQkJCWdvdG8gcmV2YWxpZGF0ZV9maW5pc2g7Ci0JCX0KLQkJbGxfaW50ZW50X3JlbGVhc2UoaXQpOwotCX0KLQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQlHT1RPKG91dCwgcmMgPSAwKTsKLQotb3V0X3NhOgotCS8qCi0JICogRm9yIHJjID09IDEgY2FzZSwgc2hvdWxkIG5vdCByZXR1cm4gZGlyZWN0bHkgdG8gcHJldmVudCBsb3NpbmcKLQkgKiBzdGF0YWhlYWQgd2luZG93czsgZm9yIHJjID09IDAgY2FzZSwgdGhlICJsb29rdXAiIHdpbGwgYmUgZG9uZSBsYXRlci4KLQkgKi8KLQlpZiAoaXQgIT0gTlVMTCAmJiBpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUiAmJiByYyA9PSAxKQotCQlsbF9zdGF0YWhlYWRfZW50ZXIocGFyZW50LCAmZGUsIDEpOwotCWdvdG8gbWFyazsKKwlkb19zdGF0YWhlYWRfZW50ZXIoZGlyLCAmZGVudHJ5LCBkZW50cnktPmRfaW5vZGUgPT0gTlVMTCk7CisJbGxfc3RhdGFoZWFkX21hcmsoZGlyLCBkZW50cnkpOworCXJldHVybiAxOwogfQogCiAvKgpAQCAtNjE1LDI0ICszNTgsMTMgQEAKICAqLwogaW50IGxsX3JldmFsaWRhdGVfbmQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGlub2RlICpwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwotCWludCB1bnBsdWcgPSAwOworCWludCByYzsKIAotCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOm5hbWU9JXMsZmxhZ3M9JXVcbiIsCisJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6bmFtZT0lcywgZmxhZ3M9JXVcbiIsCiAJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGZsYWdzKTsKIAotCWlmICghKGZsYWdzICYgKExPT0tVUF9QQVJFTlR8TE9PS1VQX09QRU58TE9PS1VQX0NSRUFURSkpICYmCi0JICAgIGxsX25lZWRfc3RhdGFoZWFkKHBhcmVudCwgZGVudHJ5KSA+IDApIHsKLQkJaWYgKGZsYWdzICYgTE9PS1VQX1JDVSkKLQkJCXJldHVybiAtRUNISUxEOwotCi0JCWlmIChkZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKLQkJCXVucGx1ZyA9IDE7Ci0JCWRvX3N0YXRhaGVhZF9lbnRlcihwYXJlbnQsICZkZW50cnksIHVucGx1Zyk7Ci0JCWxsX3N0YXRhaGVhZF9tYXJrKHBhcmVudCwgZGVudHJ5KTsKLQl9Ci0KLQlyZXR1cm4gMTsKKwlyYyA9IGxsX3JldmFsaWRhdGVfZGVudHJ5KGRlbnRyeSwgZmxhZ3MpOworCXJldHVybiByYzsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jCmluZGV4IDUyYjc3MzEuLjdmYmMxOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jCkBAIC0zNjIsNyArMzYyLDcgQEAKIAkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0OwogCQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAotCQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgTlVMTCwgTlVMTCwgMCwgMCwKKwkJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIGRpciwgTlVMTCwgMCwgMCwKIAkJTFVTVFJFX09QQ19BTlksIE5VTEwpOwogCQlpZiAoSVNfRVJSKG9wX2RhdGEpKQogCQkJcmV0dXJuICh2b2lkICopb3BfZGF0YTsKQEAgLTEwNDgsMjAgKzEwNDgsMjUgQEAKIH0KIAogCi1zdGF0aWMgaW50IGNvcHlfYW5kX2lvY3RsKGludCBjbWQsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHZvaWQgKmRhdGEsIGludCBsZW4pCitzdGF0aWMgaW50IGNvcHlfYW5kX2lvY3RsKGludCBjbWQsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkgIGNvbnN0IHZvaWQgX191c2VyICpkYXRhLCBzaXplX3Qgc2l6ZSkKIHsKLQl2b2lkICpwdHI7CisJdm9pZCAqY29weTsKIAlpbnQgcmM7CiAKLQlPQkRfQUxMT0MocHRyLCBsZW4pOwotCWlmIChwdHIgPT0gTlVMTCkKKwlPQkRfQUxMT0MoY29weSwgc2l6ZSk7CisJaWYgKGNvcHkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGNvcHlfZnJvbV91c2VyKHB0ciwgZGF0YSwgbGVuKSkgewotCQlPQkRfRlJFRShwdHIsIGxlbik7Ci0JCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGNvcHksIGRhdGEsIHNpemUpKSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CiAJfQotCXJjID0gb2JkX2lvY29udHJvbChjbWQsIGV4cCwgbGVuLCBkYXRhLCBOVUxMKTsKLQlPQkRfRlJFRShwdHIsIGxlbik7CisKKwlyYyA9IG9iZF9pb2NvbnRyb2woY21kLCBleHAsIHNpemUsIGNvcHksIE5VTEwpOworb3V0OgorCU9CRF9GUkVFKGNvcHksIHNpemUpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMDgwLDcgKzEwODUsNyBAQAogCWNhc2UgUV9RVU9UQU9GRjoKIAljYXNlIFFfU0VUUVVPVEE6CiAJY2FzZSBRX1NFVElORk86Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKIAkJICAgIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfUk1UX0NMSUVOVCkKIAkJCXJldHVybiAtRVBFUk07CiAJCWJyZWFrOwpAQCAtMTA4OSw3ICsxMDk0LDcgQEAKIAkJICAgICAgIXVpZF9lcShjdXJyZW50X2V1aWQoKSwgbWFrZV9rdWlkKCZpbml0X3VzZXJfbnMsIGlkKSkpIHx8CiAJCSAgICAgKHR5cGUgPT0gR1JQUVVPVEEgJiYKIAkJICAgICAgIWluX2Vncm91cF9wKG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBpZCkpKSkgJiYKLQkJICAgICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CisJCSAgICAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CiAJCSAgICAgc2JpLT5sbF9mbGFncyAmIExMX1NCSV9STVRfQ0xJRU5UKSkKIAkJCXJldHVybiAtRVBFUk07CiAJCWJyZWFrOwpAQCAtMTM5NSw3ICsxNDAwLDcgQEAKIAkJaWYgKHRtcCA9PSBOVUxMKQogCQkJR09UTyhmcmVlX2xtdiwgcmMgPSAtRU5PTUVNKTsKIAotCQltZW1jcHkodG1wLCAmbHVtLCBzaXplb2YobHVtKSk7CisJCSp0bXAgPSBsdW07CiAJCXRtcC0+bHVtX3R5cGUgPSBMTVZfU1RSSVBFX1RZUEU7CiAJCXRtcC0+bHVtX3N0cmlwZV9jb3VudCA9IDE7CiAJCW1kdGluZGV4ID0gbGxfZ2V0X21kdF9pZHgoaW5vZGUpOwpAQCAtMTU5Nyw3ICsxNjAyLDcgQEAKIAkJc3RydWN0IG9iZF9xdW90YWN0bCAqb3FjdGw7CiAJCWludCBlcnJvciA9IDA7CiAKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikgfHwKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAogCQkgICAgc2JpLT5sbF9mbGFncyAmIExMX1NCSV9STVRfQ0xJRU5UKQogCQkJcmV0dXJuIC1FUEVSTTsKIApAQCAtMTYyMSw3ICsxNjI2LDcgQEAKIAljYXNlIE9CRF9JT0NfUE9MTF9RVU9UQUNIRUNLOiB7CiAJCXN0cnVjdCBpZl9xdW90YWNoZWNrICpjaGVjazsKIAotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSB8fAorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pIHx8CiAJCSAgICBzYmktPmxsX2ZsYWdzICYgTExfU0JJX1JNVF9DTElFTlQpCiAJCQlyZXR1cm4gLUVQRVJNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKaW5kZXggYzEyODIxYS4uOGU4NDRhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbGxfbWRfcmVhbF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCitpbnQgbGxfbWRfcmVhbF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBmbW9kZV90IGZtb2RlKQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqKm9jaF9wOwpAQCAtMjEzLDMwICsyMTMsMzMgQEAKIAlfX3U2NCAqb2NoX3VzZWNvdW50OwogCWludCByYyA9IDA7CiAKLQlpZiAoZmxhZ3MgJiBGTU9ERV9XUklURSkgeworCWlmIChmbW9kZSAmIEZNT0RFX1dSSVRFKSB7CiAJCW9jaF9wID0gJmxsaS0+bGxpX21kc193cml0ZV9vY2g7CiAJCW9jaF91c2Vjb3VudCA9ICZsbGktPmxsaV9vcGVuX2ZkX3dyaXRlX2NvdW50OwotCX0gZWxzZSBpZiAoZmxhZ3MgJiBGTU9ERV9FWEVDKSB7CisJfSBlbHNlIGlmIChmbW9kZSAmIEZNT0RFX0VYRUMpIHsKIAkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX2V4ZWNfb2NoOwogCQlvY2hfdXNlY291bnQgPSAmbGxpLT5sbGlfb3Blbl9mZF9leGVjX2NvdW50OwogCX0gZWxzZSB7Ci0JCUxBU1NFUlQoZmxhZ3MgJiBGTU9ERV9SRUFEKTsKKwkJTEFTU0VSVChmbW9kZSAmIEZNT0RFX1JFQUQpOwogCQlvY2hfcCA9ICZsbGktPmxsaV9tZHNfcmVhZF9vY2g7CiAJCW9jaF91c2Vjb3VudCA9ICZsbGktPmxsaV9vcGVuX2ZkX3JlYWRfY291bnQ7CiAJfQogCiAJbXV0ZXhfbG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKLQlpZiAoKm9jaF91c2Vjb3VudCkgeyAvKiBUaGVyZSBhcmUgc3RpbGwgdXNlcnMgb2YgdGhpcyBoYW5kbGUsIHNvCi0JCQkJc2tpcCBmcmVlaW5nIGl0LiAqLworCWlmICgqb2NoX3VzZWNvdW50ID4gMCkgeworCQkvKiBUaGVyZSBhcmUgc3RpbGwgdXNlcnMgb2YgdGhpcyBoYW5kbGUsIHNvIHNraXAKKwkJICogZnJlZWluZyBpdC4gKi8KIAkJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CisKIAlvY2g9Km9jaF9wOwogCSpvY2hfcCA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwogCi0JaWYgKG9jaCkgeyAvKiBUaGVyZSBtaWdodCBiZSBhIHJhY2UgYW5kIHNvbWVib2R5IGhhdmUgZnJlZWQgdGhpcyBvY2gKLQkJICAgICAgYWxyZWFkeSAqLworCWlmIChvY2ggIT0gTlVMTCkgeworCQkvKiBUaGVyZSBtaWdodCBiZSBhIHJhY2UgYW5kIHRoaXMgaGFuZGxlIG1heSBhbHJlYWR5CisJCSAgIGJlIGNsb3NlZC4gKi8KIAkJcmMgPSBsbF9jbG9zZV9pbm9kZV9vcGVuaGFuZGxlKGxsX2kyc2JpKGlub2RlKS0+bGxfbWRfZXhwLAogCQkJCQkgICAgICAgaW5vZGUsIG9jaCwgTlVMTCk7CiAJfQpAQCAtNDQzLDggKzQ0Niw3IEBACiAJCQkJIGl0cCwgTlVMTCk7CiAKIG91dDoKLQlwdGxycGNfcmVxX2ZpbmlzaGVkKGl0cC0+ZC5sdXN0cmUuaXRfZGF0YSk7Ci0JaXRfY2xlYXJfZGlzcG9zaXRpb24oaXRwLCBESVNQX0VOUV9DT01QTEVURSk7CisJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCWxsX2ludGVudF9kcm9wX2xvY2soaXRwKTsKIAogCXJldHVybiByYzsKQEAgLTQ3Nyw3ICs0NzksNyBAQAogCW9jaC0+b2NoX21hZ2ljID0gT0JEX0NMSUVOVF9IQU5ETEVfTUFHSUM7CiAJb2NoLT5vY2hfZmxhZ3MgPSBpdC0+aXRfZmxhZ3M7CiAKLQlyZXR1cm4gbWRfc2V0X29wZW5fcmVwbGF5X2RhdGEobWRfZXhwLCBvY2gsIHJlcSk7CisJcmV0dXJuIG1kX3NldF9vcGVuX3JlcGxheV9kYXRhKG1kX2V4cCwgb2NoLCBpdCk7CiB9CiAKIGludCBsbF9sb2NhbF9vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCkBAIC02NzEsMTQgKzY3MywxMyBAQAogCiAJbGxfY2FwYV9vcGVuKGlub2RlKTsKIAotCWlmICghbGxpLT5sbGlfaGFzX3NtZCkgewotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTE9WX0RFTEFZX0NSRUFURSB8fAotCQkgICAgIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKLQkJCUNERUJVRyhEX0lOT0RFLCAib2JqZWN0IGNyZWF0aW9uIHdhcyBkZWxheWVkXG4iKTsKLQkJCUdPVE8ob3V0X29jaF9mcmVlLCByYyk7Ci0JCX0KKwlpZiAoIWxsaS0+bGxpX2hhc19zbWQgJiYKKwkgICAgKGNsX2lzX2xvdl9kZWxheV9jcmVhdGUoZmlsZS0+Zl9mbGFncykgfHwKKwkgICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPT0gMCkpIHsKKwkJQ0RFQlVHKERfSU5PREUsICJvYmplY3QgY3JlYXRpb24gd2FzIGRlbGF5ZWRcbiIpOworCQlHT1RPKG91dF9vY2hfZnJlZSwgcmMpOwogCX0KLQlmaWxlLT5mX2ZsYWdzICY9IH5PX0xPVl9ERUxBWV9DUkVBVEU7CisJY2xfbG92X2RlbGF5X2NyZWF0ZV9jbGVhcigmZmlsZS0+Zl9mbGFncyk7CiAJR09UTyhvdXRfb2NoX2ZyZWUsIHJjKTsKIAogb3V0X29jaF9mcmVlOgpAQCAtODEzLDEwICs4MTQsNyBAQAogCSAqIGRvZXNuJ3QgZGVhbCB3aXRoIG9wZW5oYW5kbGUsIHNvIG5vcm1hbCBvcGVuaGFuZGxlIHdpbGwgYmUgbGVha2VkLiAqLwogCQkJCUxETE1fRkxfTk9fTFJVIHwgTERMTV9GTF9FWENMKTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQlpZiAocmVxICE9IE5VTEwpIHsKLQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCQlpdF9jbGVhcl9kaXNwb3NpdGlvbigmaXQsIERJU1BfRU5RX0NPTVBMRVRFKTsKLQl9CisJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCWlmIChyYyA8IDApCiAJCUdPVE8ob3V0X3JlbGVhc2VfaXQsIHJjKTsKIApAQCAtMTAzMyw2ICsxMDMxLDMzIEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgYm9vbCBmaWxlX2lzX25vYXRpbWUoY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY29uc3Qgc3RydWN0IHZmc21vdW50ICptbnQgPSBmaWxlLT5mX3BhdGgubW50OworCWNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCisJLyogQWRhcHRlZCBmcm9tIGZpbGVfYWNjZXNzZWQoKSBhbmQgdG91Y2hfYXRpbWUoKS4qLworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT0FUSU1FKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfTk9BVElNRSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoSVNfTk9BVElNRShpbm9kZSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKG1udC0+bW50X2ZsYWdzICYgKE1OVF9OT0FUSU1FIHwgTU5UX1JFQURPTkxZKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoKG1udC0+bW50X2ZsYWdzICYgTU5UX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIGxsX2lvX2luaXQoc3RydWN0IGNsX2lvICppbywgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUsIGludCB3cml0ZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CkBAIC0xMDUyLDYgKzEwNzcsOCBAQAogCX0gZWxzZSBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSB7CiAJCWlvLT5jaV9sb2NrcmVxID0gQ0lMUl9NQU5EQVRPUlk7CiAJfQorCisJaW8tPmNpX25vYXRpbWUgPSBmaWxlX2lzX25vYXRpbWUoZmlsZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0xMDkyLDE2ICsxMTE5LDEyIEBACiAJCQkJZG93bl9yZWFkKCZsbGktPmxsaV90cnVuY19zZW0pOwogCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2UgSU9fU0VOREZJTEU6Ci0JCQl2aW8tPnUuc2VuZGZpbGUuY3VpX2FjdG9yID0gYXJncy0+dS5zZW5kZmlsZS52aWFfYWN0b3I7Ci0JCQl2aW8tPnUuc2VuZGZpbGUuY3VpX3RhcmdldCA9IGFyZ3MtPnUuc2VuZGZpbGUudmlhX3RhcmdldDsKLQkJCWJyZWFrOwogCQljYXNlIElPX1NQTElDRToKIAkJCXZpby0+dS5zcGxpY2UuY3VpX3BpcGUgPSBhcmdzLT51LnNwbGljZS52aWFfcGlwZTsKIAkJCXZpby0+dS5zcGxpY2UuY3VpX2ZsYWdzID0gYXJncy0+dS5zcGxpY2UudmlhX2ZsYWdzOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlDRVJST1IoIlVua25vdyBJTyB0eXBlIC0gJXVcbiIsIHZpby0+Y3VpX2lvX3N1YnR5cGUpOworCQkJQ0VSUk9SKCJVbmtub3duIElPIHR5cGUgLSAldVxuIiwgdmlvLT5jdWlfaW9fc3VidHlwZSk7CiAJCQlMQlVHKCk7CiAJCX0KIAkJcmVzdWx0ID0gY2xfaW9fbG9vcChlbnYsIGlvKTsKQEAgLTEzNDAsNyArMTM2Myw3IEBACiAJc3RydWN0IGxsX3JlY3JlYXRlX29iaiB1Y3JlYXQ7CiAJc3RydWN0IG9zdF9pZAkJb2k7CiAKLQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ1Y3JlYXQsIChzdHJ1Y3QgbGxfcmVjcmVhdGVfb2JqICopYXJnLApAQCAtMTM1OCw3ICsxMzgxLDcgQEAKIAlzdHJ1Y3Qgb3N0X2lkCW9pOwogCW9iZF9jb3VudAlvc3RfaWR4OwogCi0JaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmZmlkLCAoc3RydWN0IGx1X2ZpZCAqKWFyZywgc2l6ZW9mKGZpZCkpKQpAQCAtMTM4MSwyMyArMTQwNCwyNSBAQAogCQljY2NfaW5vZGVfbHNtX3B1dChpbm9kZSwgbHNtKTsKIAkJQ0RFQlVHKERfSU9DVEwsICJzdHJpcGUgYWxyZWFkeSBleGlzdHMgZm9yIGlubyAlbHVcbiIsCiAJCSAgICAgICBpbm9kZS0+aV9pbm8pOwotCQlyZXR1cm4gLUVFWElTVDsKKwkJR09UTyhvdXQsIHJjID0gLUVFWElTVCk7CiAJfQogCiAJbGxfaW5vZGVfc2l6ZV9sb2NrKGlub2RlKTsKIAlyYyA9IGxsX2ludGVudF9maWxlX29wZW4oZmlsZSwgbHVtLCBsdW1fc2l6ZSwgJm9pdCk7CiAJaWYgKHJjKQotCQlHT1RPKG91dCwgcmMpOworCQlHT1RPKG91dF91bmxvY2ssIHJjKTsKIAlyYyA9IG9pdC5kLmx1c3RyZS5pdF9zdGF0dXM7CiAJaWYgKHJjIDwgMCkKIAkJR09UTyhvdXRfcmVxX2ZyZWUsIHJjKTsKIAogCWxsX3JlbGVhc2Vfb3BlbmhhbmRsZShmaWxlLT5mX2RlbnRyeSwgJm9pdCk7CiAKLSBvdXQ6CitvdXRfdW5sb2NrOgogCWxsX2lub2RlX3NpemVfdW5sb2NrKGlub2RlKTsKIAlsbF9pbnRlbnRfcmVsZWFzZSgmb2l0KTsKIAljY2NfaW5vZGVfbHNtX3B1dChpbm9kZSwgbHNtKTsKK291dDoKKwljbF9sb3ZfZGVsYXlfY3JlYXRlX2NsZWFyKCZmaWxlLT5mX2ZsYWdzKTsKIAlyZXR1cm4gcmM7CiBvdXRfcmVxX2ZyZWU6CiAJcHRscnBjX3JlcV9maW5pc2hlZCgoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICopIG9pdC5kLmx1c3RyZS5pdF9kYXRhKTsKQEAgLTE0OTcsNyArMTUyMiw3IEBACiAJCQkJCSAgICBzaXplb2Yoc3RydWN0IGxvdl91c2VyX29zdF9kYXRhKTsKIAlpbnQJCQkgcmM7CiAKLQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJT0JEX0FMTE9DX0xBUkdFKGx1bXAsIGx1bV9zaXplKTsKQEAgLTE3NDcsNyArMTc3Miw3IEBACiAJc3RydWN0IGdldGluZm9fZmlkMnBhdGgJKmdmb3V0LCAqZ2ZpbjsKIAlpbnQJCQkgb3V0c2l6ZSwgcmM7CiAKLQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfREFDX1JFQURfU0VBUkNIKSAmJgorCWlmICghY2FwYWJsZShDRlNfQ0FQX0RBQ19SRUFEX1NFQVJDSCkgJiYKIAkgICAgIShsbF9pMnNiaShpbm9kZSktPmxsX2ZsYWdzICYgTExfU0JJX1VTRVJfRklEMlBBVEgpKQogCQlyZXR1cm4gLUVQRVJNOwogCkBAIC0yMDA1LDcgKzIwMzAsNyBAQAogCQlsbHNzLT5pYTIuaWFfdmFsaWQgPSBBVFRSX01USU1FIHwgQVRUUl9BVElNRTsKIAl9CiAKLQkvKiB1bHRpbWF0ZSBjaGVjaywgYmVmb3JlIHN3YXBpbmcgdGhlIGxheW91dHMgd2UgY2hlY2sgaWYKKwkvKiB1bHRpbWF0ZSBjaGVjaywgYmVmb3JlIHN3YXBwaW5nIHRoZSBsYXlvdXRzIHdlIGNoZWNrIGlmCiAJICogZGF0YXZlcnNpb24gaGFzIGNoYW5nZWQgKGlmIHJlcXVlc3RlZCkgKi8KIAlpZiAobGxzcy0+Y2hlY2tfZHYxKSB7CiAJCXJjID0gbGxfZGF0YV92ZXJzaW9uKGxsc3MtPmlub2RlMSwgJmR2LCAwKTsKQEAgLTIwOTMsNyArMjExOCw3IEBACiAJLyogTm9uLXJvb3QgdXNlcnMgYXJlIGZvcmJpZGRlbiB0byBzZXQgb3IgY2xlYXIgZmxhZ3Mgd2hpY2ggYXJlCiAJICogTk9UIGRlZmluZWQgaW4gSFNNX1VTRVJfTUFTSy4gKi8KIAlpZiAoKChoc3MtPmhzc19zZXRtYXNrIHwgaHNzLT5oc3NfY2xlYXJtYXNrKSAmIH5IU01fVVNFUl9NQVNLKSAmJgotCSAgICAhY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCSAgICAhY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKIAlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGlub2RlLCBOVUxMLCBOVUxMLCAwLCAwLApAQCAtMjY3MCw3ICsyNjk1LDcgQEAKIAkJTEFTU0VSVCgoY21kID09IEZfU0VUTEtXKSB8fCAoY21kID09IEZfU0VUTEspKTsKIAkJLyogZmxvY2tzIGFyZSB3aG9sZS1maWxlIGxvY2tzICovCiAJCWZsb2NrLmxfZmxvY2suZW5kID0gT0ZGU0VUX01BWDsKLQkJLyogRm9yIGZsb2NrcyBvd25lciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb2NhbCBmaWxlIGRlc2N0aXB0b3IqLworCQkvKiBGb3IgZmxvY2tzIG93bmVyIGlzIGRldGVybWluZWQgYnkgdGhlIGxvY2FsIGZpbGUgZGVzY3JpcHRvciovCiAJCWZsb2NrLmxfZmxvY2sub3duZXIgPSAodW5zaWduZWQgbG9uZylmaWxlX2xvY2stPmZsX2ZpbGU7CiAJfSBlbHNlIGlmIChmaWxlX2xvY2stPmZsX2ZsYWdzICYgRkxfUE9TSVgpIHsKIAkJZmxvY2subF9mbG9jay5vd25lciA9ICh1bnNpZ25lZCBsb25nKWZpbGVfbG9jay0+Zmxfb3duZXI7CkBAIC0yODkxLDcgKzI5MTYsNyBAQAogCQkJb2l0Lml0X29wID0gSVRfTE9PS1VQOwogCiAJCS8qIENhbGwgZ2V0YXR0ciBieSBmaWQsIHNvIGRvIG5vdCBwcm92aWRlIG5hbWUgYXQgYWxsLiAqLwotCQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUsCisJCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGVudHJ5LT5kX2lub2RlLAogCQkJCQkgICAgIGRlbnRyeS0+ZF9pbm9kZSwgTlVMTCwgMCwgMCwKIAkJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CiAJCWlmIChJU19FUlIob3BfZGF0YSkpCkBAIC0zMTc1LDcgKzMyMDAsNyBAQAogCS5nZXRfYWNsCT0gbGxfZ2V0X2FjbCwKIH07CiAKLS8qIGR5bmFtaWMgaW9jdGwgbnVtYmVyIHN1cHBvcnQgcm91dGlucyAqLworLyogZHluYW1pYyBpb2N0bCBudW1iZXIgc3VwcG9ydCByb3V0aW5lcyAqLwogc3RhdGljIHN0cnVjdCBsbGlvY19jdGxfZGF0YSB7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZQlpb2Nfc2VtOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgaW9jX2hlYWQ7CkBAIC0zMjk5LDcgKzMzMjQsNyBAQAogCQlpZiAocmVzdWx0ID09IDApIHsKIAkJCS8qIGl0IGNhbiBvbmx5IGJlIGFsbG93ZWQgdG8gbWF0Y2ggYWZ0ZXIgbGF5b3V0IGlzCiAJCQkgKiBhcHBsaWVkIHRvIGlub2RlIG90aGVyd2lzZSBmYWxzZSBsYXlvdXQgd291bGQgYmUKLQkJCSAqIHNlZW4uIEFwcGx5aW5nIGxheW91dCBzaG91ZCBoYXBwZW4gYmVmb3JlIGRyb3BwaW5nCisJCQkgKiBzZWVuLiBBcHBseWluZyBsYXlvdXQgc2hvdWxkIGhhcHBlbiBiZWZvcmUgZHJvcHBpbmcKIAkJCSAqIHRoZSBpbnRlbnQgbG9jay4gKi8KIAkJCWxkbG1fbG9ja19hbGxvd19tYXRjaChsb2NrKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKaW5kZXggZTI5OTZjNC4uMzhjMmQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkJCWJyZWFrOwogCiAJCWlub2RlID0gbGxfaW5mbzJpKGxsaSk7Ci0JCUNERUJVRyhEX0lORk8sICJkb25lX3dyaXR0aW5nIGZvciBpbm9kZSAlbHUvJXVcbiIsCisJCUNERUJVRyhEX0lORk8sICJkb25lX3dyaXRpbmcgZm9yIGlub2RlICVsdS8ldVxuIiwKIAkJICAgICAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfZ2VuZXJhdGlvbik7CiAJCWxsX2RvbmVfd3JpdGluZyhpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmgKaW5kZXggN2VlNWMwMi4uNjlhYmEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCkBAIC0yOTYsMTMgKzI5Niw2IEBACiAJCQlzaXplX3Qgc2l6ZSwKIAkJCV9fdTY0IHZhbGlkKTsKIAotaW50IGxsX3hhdHRyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJY29uc3QgY2hhciAqbmFtZSwKLQkJCWNvbnN0IGNoYXIgKm5ld3ZhbCwKLQkJCXNpemVfdCBzaXplLAotCQkJX191NjQgdmFsaWQsCi0JCQlpbnQgZmxhZ3MpOwotCiAvKgogICogTG9ja2luZyB0byBndWFyYW50ZWUgY29uc2lzdGVuY3kgb2Ygbm9uLWF0b21pYyB1cGRhdGVzIHRvIGxvbmcgbG9uZyBpX3NpemUsCiAgKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIGZpbGUgc2l6ZSBhbmQgS01TLgpAQCAtNTMyLDcgKzUyNSw3IEBACiAJYXRvbWljX3QJCSAgbGxfYWdsX3RvdGFsOyAgLyogQUdMIHRocmVhZCBzdGFydGVkIGNvdW50ICovCiAKIAlkZXZfdAkJICAgICBsbF9zZGV2X29yaWc7IC8qIHNhdmUgc19kZXYgYmVmb3JlIGFzc2lnbiBmb3IKLQkJCQkJCSAqIGNsdXN0cmVkIG5mcyAqLworCQkJCQkJICogY2x1c3RlcmVkIG5mcyAqLwogCXN0cnVjdCBybXRhY2xfY3RsX3RhYmxlICAgbGxfcmN0OwogCXN0cnVjdCBlYWNsX3RhYmxlCSBsbF9ldDsKIAlfX2tlcm5lbF9mc2lkX3QJCSAgbGxfZnNpZDsKQEAgLTc4Miw3ICs3NzUsNyBAQAogaW50IGxsX3JlbGVhc2Vfb3BlbmhhbmRsZShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBsb29rdXBfaW50ZW50ICopOwogaW50IGxsX21kX2Nsb3NlKHN0cnVjdCBvYmRfZXhwb3J0ICptZF9leHAsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCXN0cnVjdCBmaWxlICpmaWxlKTsKLWludCBsbF9tZF9yZWFsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncyk7CitpbnQgbGxfbWRfcmVhbF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBmbW9kZV90IGZtb2RlKTsKIHZvaWQgbGxfaW9lcG9jaF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJICAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICoqb2NoLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHZvaWQgbGxfZG9uZV93cml0aW5nX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpOwpAQCAtODI4LDcgKzgyMSw3IEBACiAKIC8qIGxsaXRlL2RjYWNoZS5jICovCiAKLWludCBsbF9kb3BzX2luaXQoc3RydWN0IGRlbnRyeSAqZGUsIGludCBibG9jaywgaW50IGluaXRfc2EpOworaW50IGxsX2RfaW5pdChzdHJ1Y3QgZGVudHJ5ICpkZSk7CiBleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGxsX2Rfb3BzOwogdm9pZCBsbF9pbnRlbnRfZHJvcF9sb2NrKHN0cnVjdCBsb29rdXBfaW50ZW50ICopOwogdm9pZCBsbF9pbnRlbnRfcmVsZWFzZShzdHJ1Y3QgbG9va3VwX2ludGVudCAqKTsKQEAgLTkxNSwxMiArOTA4LDEwIEBACiB2b2lkIHZ2cF93cml0ZV9wZW5kaW5nIChzdHJ1Y3QgY2NjX29iamVjdCAqY2x1Yiwgc3RydWN0IGNjY19wYWdlICpwYWdlKTsKIHZvaWQgdnZwX3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBjY2Nfb2JqZWN0ICpjbHViLCBzdHJ1Y3QgY2NjX3BhZ2UgKnBhZ2UpOwogCi0vKiBzcGVjaWZpYyBhY2hpdGVjdHVyZSBjYW4gaW1wbGVtZW50IG9ubHkgcGFydCBvZiB0aGlzIGxpc3QgKi8KKy8qIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBjYW4gaW1wbGVtZW50IG9ubHkgcGFydCBvZiB0aGlzIGxpc3QgKi8KIGVudW0gdnZwX2lvX3N1YnR5cGUgewogCS8qKiBub3JtYWwgSU8gKi8KIAlJT19OT1JNQUwsCi0JLyoqIGlvIGNhbGxlZCBmcm9tIC5zZW5kZmlsZSAqLwotCUlPX1NFTkRGSUxFLAogCS8qKiBpbyBzdGFydGVkIGZyb20gc3BsaWNlX3tyZWFkfHdyaXRlfSAqLwogCUlPX1NQTElDRQogfTsKQEAgLTkzMiwxMCArOTIzLDYgQEAKIAogCXVuaW9uIHsKIAkJc3RydWN0IHsKLQkJCXJlYWRfYWN0b3JfdCAgICAgIGN1aV9hY3RvcjsKLQkJCXZvaWQJICAgICAqY3VpX3RhcmdldDsKLQkJfSBzZW5kZmlsZTsKLQkJc3RydWN0IHsKIAkJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmN1aV9waXBlOwogCQkJdW5zaWduZWQgaW50CSAgICBjdWlfZmxhZ3M7CiAJCX0gc3BsaWNlOwpAQCAtOTgxLDcgKzk2OCw3IEBACiAgKiBJTyBhcmd1bWVudHMgZm9yIHZhcmlvdXMgVkZTIEkvTyBpbnRlcmZhY2VzLgogICovCiBzdHJ1Y3QgdnZwX2lvX2FyZ3MgewotCS8qKiBub3JtYWwvc2VuZGZpbGUvc3BsaWNlICovCisJLyoqIG5vcm1hbC9zcGxpY2UgKi8KIAllbnVtIHZ2cF9pb19zdWJ0eXBlIHZpYV9pb19zdWJ0eXBlOwogCiAJdW5pb24gewpAQCAtOTkxLDEwICs5NzgsNiBAQAogCQkJdW5zaWduZWQgbG9uZyAgICAgIHZpYV9ucnNlZ3M7CiAJCX0gbm9ybWFsOwogCQlzdHJ1Y3QgewotCQkJcmVhZF9hY3Rvcl90ICAgICAgIHZpYV9hY3RvcjsKLQkJCXZvaWQJICAgICAgKnZpYV90YXJnZXQ7Ci0JCX0gc2VuZGZpbGU7Ci0JCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICAqdmlhX3BpcGU7CiAJCQl1bnNpZ25lZCBpbnQgICAgICAgdmlhX2ZsYWdzOwogCQl9IHNwbGljZTsKQEAgLTEzMjAsMTIgKzEzMDMsMTMgQEAKIAlpZiAobGxpLT5sbGlfb3BlbmRpcl9waWQgIT0gY3VycmVudF9waWQoKSkKIAkJcmV0dXJuOwogCi0JaWYgKHNhaSAhPSBOVUxMICYmIGxkZCAhPSBOVUxMKQorCUxBU1NFUlQobGRkICE9IE5VTEwpOworCWlmIChzYWkgIT0gTlVMTCkKIAkJbGRkLT5sbGRfc2FfZ2VuZXJhdGlvbiA9IHNhaS0+c2FpX2dlbmVyYXRpb247CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1sbF9uZWVkX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5cCkKK2RfbmVlZF9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeXApCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gICpsbGk7CiAJc3RydWN0IGxsX2RlbnRyeV9kYXRhICpsZGQ7CkBAIC0xMzcwLDE0ICsxMzU0LDE0IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IGxsX25lZWRfc3RhdGFoZWFkKGRpciwgKmRlbnRyeXApOworCXJldCA9IGRfbmVlZF9zdGF0YWhlYWQoZGlyLCAqZGVudHJ5cCk7CiAJaWYgKHJldCA8PSAwKQogCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIGRvX3N0YXRhaGVhZF9lbnRlcihkaXIsIGRlbnRyeXAsIG9ubHlfdW5wbHVnKTsKIH0KIAotLyogbGxpdGUgaW9jdGwgcmVnaXN0ZXIgc3VwcG9ydCByb3VudGluZSAqLworLyogbGxpdGUgaW9jdGwgcmVnaXN0ZXIgc3VwcG9ydCByb3V0aW5lICovCiBlbnVtIGxsaW9jX2l0ZXIgewogCUxMSU9DX0NPTlQgPSAwLAogCUxMSU9DX1NUT1AKQEAgLTEzODksNyArMTM3Myw3IEBACiAgKiBSdWxlcyB0byB3cml0ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uOgogICoKICAqIFBhcmFtZXRlcnM6Ci0gKiAgQG1hZ2ljOiBEeW5hbWljIGlvY3RsIGNhbGwgcm91dGluZSB3aWxsIGZlZWQgdGhpcyB2YXVsZSB3aXRoIHRoZSBwb2ludGVyCisgKiAgQG1hZ2ljOiBEeW5hbWljIGlvY3RsIGNhbGwgcm91dGluZSB3aWxsIGZlZWQgdGhpcyB2YWx1ZSB3aXRoIHRoZSBwb2ludGVyCiAgKiAgICAgIHJldHVybmVkIHRvIGxsX2lvY29udHJvbF9yZWdpc3Rlci4gIENhbGxiYWNrIGZ1bmN0aW9ucyBzaG91bGQgdXNlIHRoaXMKICAqICAgICAgZGF0YSB0byBjaGVjayB0aGUgcG90ZW50aWFsIGNvbGxhc2lvbiBvZiBpb2N0bCBjbWQuIElmIGNvbGxhc2lvbiBpcwogICogICAgICBmb3VuZCwgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBMTElPQ19DT05ULgpAQCAtMTQxNCw3ICsxMzk4LDcgQEAKICAqIEBjYjogY2FsbGJhY2sgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIGlmIGFuIGlvY3RsIGNvbW1hbmQgaXMgZm91bmQgdG8KICAqICAgICAgYmVsb25nIHRvIHRoZSBjb21tYW5kIGxpc3QgQGNtZC4KICAqCi0gKiBSZXR1cm4gdmF1bGU6CisgKiBSZXR1cm4gdmFsdWU6CiAgKiAgICAgIEEgbWFnaWMgcG9pbnRlciB3aWxsIGJlIHJldHVybmVkIGlmIHN1Y2Nlc3M7CiAgKiAgICAgIG90aGVyd2lzZSwgTlVMTCB3aWxsIGJlIHJldHVybmVkLgogICogKi8KQEAgLTE1MjQsNyArMTUwOCw3IEBACiAJCSAqIHNlcGFyYXRlIGxvY2tzIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzLCBNYXN0ZXIgTURULAogCQkgKiB3aGVyZSB0aGUgbmFtZSBlbnRyeSBpcywgd2lsbCBncmFudCBMT09LVVAgbG9jaywKIAkJICogcmVtb3RlIE1EVCwgd2hlcmUgdGhlIG9iamVjdCBpcywgd2lsbCBncmFudAotCQkgKiBVUERBVEV8UEVSTSBsb2NrLiBUaGUgaW5vZGUgd2lsbCBiZSBhdHRjaGVkIHRvIGJvdGgKKwkJICogVVBEQVRFfFBFUk0gbG9jay4gVGhlIGlub2RlIHdpbGwgYmUgYXR0YWNoZWQgdG8gYm90aAogCQkgKiBMT09LVVAgYW5kIFBFUk0gbG9ja3MsIHNvIHJldm9raW5nIGVpdGhlciBsb2NrcyB3aWxsCiAJCSAqIGNhc2UgdGhlIGRjYWNoZSBiZWluZyBjbGVhcmVkICovCiAJCWlmIChpdC0+ZC5sdXN0cmUuaXRfcmVtb3RlX2xvY2tfbW9kZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYwppbmRleCA2Y2ZkYjllLi4yNjAwM2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYwpAQCAtMTU1LDExICsxNTUsNiBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBsbF9kX3Jvb3Rfb3BzID0gewotCS5kX2NvbXBhcmUgPSBsbF9kY29tcGFyZSwKLQkuZF9yZXZhbGlkYXRlID0gbGxfcmV2YWxpZGF0ZV9uZCwKLX07Ci0KIHN0YXRpYyBpbnQgY2xpZW50X2NvbW1vbl9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKm1kLCBjaGFyICpkdCwKIAkJCQkgICAgc3RydWN0IHZmc21vdW50ICptbnQpCiB7CkBAIC0yMTEsNyArMjA2LDEwIEBACiAJCQkJICBPQkRfQ09OTkVDVF9FSU5QUk9HUkVTUyB8CiAJCQkJICBPQkRfQ09OTkVDVF9KT0JTVEFUUyB8IE9CRF9DT05ORUNUX0xWQl9UWVBFIHwKIAkJCQkgIE9CRF9DT05ORUNUX0xBWU9VVExPQ0sgfAotCQkJCSAgT0JEX0NPTk5FQ1RfUElOR0xFU1MgfCBPQkRfQ09OTkVDVF9NQVhfRUFTSVpFOworCQkJCSAgT0JEX0NPTk5FQ1RfUElOR0xFU1MgfAorCQkJCSAgT0JEX0NPTk5FQ1RfTUFYX0VBU0laRSB8CisJCQkJICBPQkRfQ09OTkVDVF9GTE9DS19ERUFEIHwKKwkJCQkgIE9CRF9DT05ORUNUX0RJU1BfU1RSSVBFOwogCiAJaWYgKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfU09NX1BSRVZJRVcpCiAJCWRhdGEtPm9jZF9jb25uZWN0X2ZsYWdzIHw9IE9CRF9DT05ORUNUX1NPTTsKQEAgLTI4MSw3ICsyNzksNyBAQAogCiAJLyogRm9yIG1vdW50LCB3ZSBvbmx5IG5lZWQgZnMgaW5mbyBmcm9tIE1EVDAsIGFuZCBhbHNvIGluIERORSwgaXQKIAkgKiBjYW4gbWFrZSBzdXJlIHRoZSBjbGllbnQgY2FuIGJlIG1vdW50ZWQgYXMgbG9uZyBhcyBNRFQwIGlzCi0JICogYXZhaWJsZSAqLworCSAqIGF2YWlsYWJsZSAqLwogCWVyciA9IG9iZF9zdGF0ZnMoTlVMTCwgc2JpLT5sbF9tZF9leHAsIG9zZnMsCiAJCQljZnNfdGltZV9zaGlmdF82NCgtT0JEX1NUQVRGU19DQUNIRV9TRUNPTkRTKSwKIAkJCU9CRF9TVEFURlNfRk9SX01EVDApOwpAQCAtNTc5LDEwICs1NzcsNiBAQAogCQlHT1RPKG91dF9yb290LCBlcnIgPSAtRU5PTUVNKTsKIAl9CiAKLQkvKiBrZXJuZWwgPj0gMi42LjM4IHN0b3JlIGRlbnRyeSBvcGVyYXRpb25zIGluIHNiLT5zX2Rfb3AuICovCi0JZF9zZXRfZF9vcChzYi0+c19yb290LCAmbGxfZF9yb290X29wcyk7Ci0Jc2ItPnNfZF9vcCA9ICZsbF9kX29wczsKLQogCXNiaS0+bGxfc2Rldl9vcmlnID0gc2ItPnNfZGV2OwogCiAJLyogV2Ugc2V0IHNiLT5zX2RldiBlcXVhbCBvbiBhbGwgbHVzdHJlIGNsaWVudHMgaW4gb3JkZXIgdG8gc3VwcG9ydApAQCAtNzIzLDcgKzcxNyw3IEBACiAJCXJldHVybjsKIAogCXNiaSA9IGxsX3Myc2JpKHNiKTsKLQkvKiB3ZSBuZWVkIHJlc3RvcmUgc19kZXYgZnJvbSBjaGFuZ2VkIGZvciBjbHVzdHJlZCBORlMgYmVmb3JlIHB1dF9zdXBlcgorCS8qIHdlIG5lZWQgdG8gcmVzdG9yZSBzX2RldiBmcm9tIGNoYW5nZWQgZm9yIGNsdXN0ZXJlZCBORlMgYmVmb3JlIHB1dF9zdXBlcgogCSAqIGJlY2F1c2UgbmV3IGtlcm5lbHMgaGF2ZSBjYWNoZWQgc19kZXYgYW5kIGNoYW5nZSBzYi0+c19kZXYgaW4KIAkgKiBwdXRfc3VwZXIgbm90IGFmZmVjdGVkIHJlYWwgcmVtb3ZpbmcgZGV2aWNlcyAqLwogCWlmIChzYmkpIHsKQEAgLTc0MCw3ICs3MzQsOCBAQAogCUNERUJVRyhEX1NVUEVSLCAib3B0aW9uOiAlcywgZGF0YSAlc1xuIiwgb3B0LCBkYXRhKTsKIAlpZiAoc3RybmNtcChvcHQsIGRhdGEsIHN0cmxlbihvcHQpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKCh2YWx1ZSA9IHN0cmNocihkYXRhLCAnPScpKSA9PSBOVUxMKQorCXZhbHVlID0gc3RyY2hyKGRhdGEsICc9Jyk7CisJaWYgKHZhbHVlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJdmFsdWUrKzsKQEAgLTEwMTMsNiArMTAwOCw4IEBACiAJCUdPVE8ob3V0X2ZyZWUsIGVycik7CiAKIAlzYi0+c19iZGkgPSAmbHNpLT5sc2lfYmRpOworCS8qIGtlcm5lbCA+PSAyLjYuMzggc3RvcmUgZGVudHJ5IG9wZXJhdGlvbnMgaW4gc2ItPnNfZF9vcC4gKi8KKwlzYi0+c19kX29wID0gJmxsX2Rfb3BzOwogCiAJLyogR2VuZXJhdGUgYSBzdHJpbmcgdW5pcXVlIHRvIHRoaXMgc3VwZXIsIGluIGNhc2Ugc29tZSBqb2tlciB0cmllcwogCSAgIHRvIG1vdW50IHRoZSBzYW1lIGZzIGF0IHR3byBtb3VudCBwb2ludHMuCkBAIC0xMDY3LDcgKzEwNjQsNyBAQAogCiB2b2lkIGxsX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCBjb25maWdfbGxvZ19pbnN0YW5jZSBjZmc7CisJc3RydWN0IGNvbmZpZ19sbG9nX2luc3RhbmNlIGNmZywgcGFyYW1zX2NmZzsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkOwogCXN0cnVjdCBsdXN0cmVfc2JfaW5mbyAqbHNpID0gczJsc2koc2IpOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CkBAIC0xMDgxLDYgKzEwNzgsOSBAQAogCWNmZy5jZmdfaW5zdGFuY2UgPSBzYjsKIAlsdXN0cmVfZW5kX2xvZyhzYiwgcHJvZmlsZW5tLCAmY2ZnKTsKIAorCXBhcmFtc19jZmcuY2ZnX2luc3RhbmNlID0gc2I7CisJbHVzdHJlX2VuZF9sb2coc2IsIFBBUkFNU19GSUxFTkFNRSwgJnBhcmFtc19jZmcpOworCiAJaWYgKHNiaS0+bGxfbWRfZXhwKSB7CiAJCW9iZCA9IGNsYXNzX2V4cDJvYmQoc2JpLT5sbF9tZF9leHApOwogCQlpZiAob2JkKQpAQCAtMTQwNSw3ICsxNDA1LDcgQEAKIAkvKiBQT1NJWDogY2hlY2sgYmVmb3JlIEFUVFJfKlRJTUVfU0VUIHNldCAoZnJvbSBpbm9kZV9jaGFuZ2Vfb2spICovCiAJaWYgKGF0dHItPmlhX3ZhbGlkICYgVElNRVNfU0VUX0ZMQUdTKSB7CiAJCWlmICgoIXVpZF9lcShjdXJyZW50X2ZzdWlkKCksIGlub2RlLT5pX3VpZCkpICYmCi0JCSAgICAhY2ZzX2NhcGFibGUoQ0ZTX0NBUF9GT1dORVIpKQorCQkgICAgIWNhcGFibGUoQ0ZTX0NBUF9GT1dORVIpKQogCQkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYwppbmRleCBjYWVkNjQyLi45MGIyYzBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCkBAIC0yODUsNyArMjg1LDcgQEAKICAqIEx1c3RyZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZtX29wZXJhdGlvbnNfc3RydWN0OjpmYXVsdCgpIG1ldGhvZCwgY2FsbGVkIGJ5CiAgKiBWTSB0byBzZXJ2ZXIgcGFnZSBmYXVsdCAoYm90aCBpbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UpLgogICoKLSAqIFxwYXJhbSB2bWEgLSBpcyB2aXJ0aXVhbCBhcmVhIHN0cnVjdCByZWxhdGVkIHRvIHBhZ2UgZmF1bHQKKyAqIFxwYXJhbSB2bWEgLSBpcyB2aXJ0dWFsIGFyZWEgc3RydWN0IHJlbGF0ZWQgdG8gcGFnZSBmYXVsdAogICogXHBhcmFtIHZtZiAtIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZSB0eXBlIGFuZCBhZGRyZXNzIHdoZXJlIGhpdCBmYXVsdAogICoKICAqIFxyZXR1cm4gYWxsb2NhdGVkIGFuZCBmaWxsZWQgX2xvY2tlZF8gcGFnZSBmb3IgYWRkcmVzcwpAQCAtMzcwLDcgKzM3MCw3IEBACiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KIAotCQlyZXN1bHQgfD0gVk1fRkFVTFRfTE9DS0VEOworCQlyZXN1bHQgPSBWTV9GQVVMVF9MT0NLRUQ7CiAJfQogCWNmc19yZXN0b3JlX3NpZ3Moc2V0KTsKIAlyZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYwppbmRleCAxNzY3Yzc0Li4zNTgwMDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYwpAQCAtMTY3LDEwICsxNjcsMTAgQEAKIAl9CiAKIAlyZXN1bHQgPSBkX29idGFpbl9hbGlhcyhpbm9kZSk7Ci0JaWYgKElTX0VSUihyZXN1bHQpKQorCWlmIChJU19FUlIocmVzdWx0KSkgeworCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIHJlc3VsdDsKLQotCWxsX2RvcHNfaW5pdChyZXN1bHQsIDEsIDApOworCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxvb3AuYwppbmRleCAwNzE4OTA1Li5mNzhlZGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogCSAqICAgIHRvIHN0b3JlIHBhcml0eTsKIAkgKiAyLiBSZXNlcnZlIHRoZSAjIG9mIChwYWdlX2NvdW50ICogZGVwdGgpIGNsX3BhZ2VzIGZyb20gdGhlIHJlc2VydmVkCiAJICogICAgcG9vbC4gQWZ0ZXJ3YXJkcywgdGhlIGNsaW8gd291bGQgYWxsb2NhdGUgdGhlIHBhZ2VzIGZyb20gcmVzZXJ2ZWQKLQkgKiAgICBwb29sLCB0aGlzIGd1YXJhbnRlZXMgd2UgbmVlZWRuJ3QgYWxsb2NhdGUgdGhlIGNsX3BhZ2VzIGZyb20KKwkgKiAgICBwb29sLCB0aGlzIGd1YXJhbnRlZXMgd2UgbmVlZG4ndCBhbGxvY2F0ZSB0aGUgY2xfcGFnZXMgZnJvbQogCSAqICAgIGdlbmVyaWMgY2xfcGFnZSBzbGFiIGNhY2hlLgogCSAqICAgIE9mIGNvdXJzZSwgaWYgdGhlcmUgaXMgTk9UIGVub3VnaCBwYWdlcyBpbiB0aGUgcG9vbCwgd2UgbWlnaHQKIAkgKiAgICBiZSBhc2tlZCB0byB3cml0ZSBsZXNzIHBhZ2VzIG9uY2UsIHRoaXMgcHVyZWx5IGRlcGVuZHMgb24KQEAgLTMyNSw3ICszMjUsNyBAQAogCQliaW8gPSAmKCpiaW8pLT5iaV9uZXh0OwogCX0KIAlpZiAoKmJpbykgewotCQkvKiBTb21lIG9mIGJpb3MgY2FuJ3QgYmUgbWVyZ2FibGUuICovCisJCS8qIFNvbWUgb2YgYmlvcyBjYW4ndCBiZSBtZXJnZWFibGUuICovCiAJCWxvLT5sb19iaW8gPSAqYmlvOwogCQkqYmlvID0gTlVMTDsKIAl9IGVsc2UgewpAQCAtNjU4LDcgKzY1OCw3IEBACiAgKiBsbF9pb2NvbnRyb2xfY2FsbC4KICAqCiAgKiBUaGlzIGlzIGEgbGxpdGUgcmVndWxhciBmaWxlIGlvY3RsIGZ1bmN0aW9uLiBJdCB0YWtlcyB0aGUgcmVzcG9uc2liaWxpdHkKLSAqIG9mIGF0dGFjaGluZyBvciBkZXRhY2hpbmcgYSBmaWxlIGJ5IGEgbGxvb3AncyBkZXZpY2UgbnVtbmVyLgorICogb2YgYXR0YWNoaW5nIG9yIGRldGFjaGluZyBhIGZpbGUgYnkgYSBsbG9vcCdzIGRldmljZSBudW1iZXIuCiAgKi8KIHN0YXRpYyBlbnVtIGxsaW9jX2l0ZXIgbGxvb3BfaW9jdGwoc3RydWN0IGlub2RlICp1bnVzZWQsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKaW5kZXggZmM4ZDI2NC4uMjVhNmVhNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYwpAQCAtMTk1LDEwMSArMTk1LDEwNyBAQAogaW50IGxsX21kX2Jsb2NraW5nX2FzdChzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrLCBzdHJ1Y3QgbGRsbV9sb2NrX2Rlc2MgKmRlc2MsCiAJCSAgICAgICB2b2lkICpkYXRhLCBpbnQgZmxhZykKIHsKLQlpbnQgcmM7CiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja2g7CisJaW50IHJjOwogCiAJc3dpdGNoIChmbGFnKSB7CiAJY2FzZSBMRExNX0NCX0JMT0NLSU5HOgogCQlsZGxtX2xvY2syaGFuZGxlKGxvY2ssICZsb2NraCk7CiAJCXJjID0gbGRsbV9jbGlfY2FuY2VsKCZsb2NraCwgTENGX0FTWU5DKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJQ0RFQlVHKERfSU5PREUsICJsZGxtX2NsaV9jYW5jZWw6ICVkXG4iLCByYyk7CisJCQlDREVCVUcoRF9JTk9ERSwgImxkbG1fY2xpX2NhbmNlbDogcmMgPSAlZFxuIiwgcmMpOwogCQkJcmV0dXJuIHJjOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTERMTV9DQl9DQU5DRUxJTkc6IHsKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IGxsX2lub2RlX2Zyb21fcmVzb3VyY2VfbG9jayhsb2NrKTsKLQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaTsKIAkJX191NjQgYml0cyA9IGxvY2stPmxfcG9saWN5X2RhdGEubF9pbm9kZWJpdHMuYml0czsKLQkJc3RydWN0IGx1X2ZpZCAqZmlkOwotCQlsZGxtX21vZGVfdCBtb2RlID0gbG9jay0+bF9yZXFfbW9kZTsKIAogCQkvKiBJbm9kZSBpcyBzZXQgdG8gbG9jay0+bF9yZXNvdXJjZS0+bHJfbHZiX2lub2RlCiAJCSAqIGZvciBtZGMgLSBidWcgMjQ1NTUgKi8KIAkJTEFTU0VSVChsb2NrLT5sX2FzdF9kYXRhID09IE5VTEwpOwogCi0JCS8qIEludmFsaWRhdGUgYWxsIGRlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlub2RlICovCiAJCWlmIChpbm9kZSA9PSBOVUxMKQogCQkJYnJlYWs7CiAKKwkJLyogSW52YWxpZGF0ZSBhbGwgZGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5vZGUgKi8KIAkJTEFTU0VSVChsb2NrLT5sX2ZsYWdzICYgTERMTV9GTF9DQU5DRUxJTkcpOwogCi0JCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19YQVRUUikKKwkJaWYgKCFmaWRfcmVzX25hbWVfZXEobGxfaW5vZGUyZmlkKGlub2RlKSwKKwkJCQkgICAgICZsb2NrLT5sX3Jlc291cmNlLT5scl9uYW1lKSkgeworCQkJTERMTV9FUlJPUihsb2NrLCAiZGF0YSBtaXNtYXRjaCB3aXRoIG9iamVjdCAiREZJRCIoJXApIiwKKwkJCQkgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSk7CisJCQlMQlVHKCk7CisJCX0KKworCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfWEFUVFIpIHsKIAkJCWxsX3hhdHRyX2NhY2hlX2Rlc3Ryb3koaW5vZGUpOworCQkJYml0cyAmPSB+TURTX0lOT0RFTE9DS19YQVRUUjsKKwkJfQogCiAJCS8qIEZvciBPUEVOIGxvY2tzIHdlIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsb2NrIG1vZGVzCiAJCSAqIExDS19DUiwgTENLX0NXLCBMQ0tfUFIgLSBidWcgMjI4OTEgKi8KKwkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX09QRU4pCisJCQlsbF9oYXZlX21kX2xvY2soaW5vZGUsICZiaXRzLCBsb2NrLT5sX3JlcV9tb2RlKTsKKworCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfT1BFTikgeworCQkJZm1vZGVfdCBmbW9kZTsKKworCQkJc3dpdGNoIChsb2NrLT5sX3JlcV9tb2RlKSB7CisJCQljYXNlIExDS19DVzoKKwkJCQlmbW9kZSA9IEZNT0RFX1dSSVRFOworCQkJCWJyZWFrOworCQkJY2FzZSBMQ0tfUFI6CisJCQkJZm1vZGUgPSBGTU9ERV9FWEVDOworCQkJCWJyZWFrOworCQkJY2FzZSBMQ0tfQ1I6CisJCQkJZm1vZGUgPSBGTU9ERV9SRUFEOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlMRExNX0VSUk9SKGxvY2ssICJiYWQgbG9jayBtb2RlIGZvciBPUEVOIGxvY2siKTsKKwkJCQlMQlVHKCk7CisJCQl9CisKKwkJCWxsX21kX3JlYWxfY2xvc2UoaW5vZGUsIGZtb2RlKTsKKwkJfQorCiAJCWlmIChiaXRzICYgKE1EU19JTk9ERUxPQ0tfTE9PS1VQIHwgTURTX0lOT0RFTE9DS19VUERBVEUgfAogCQkJICAgIE1EU19JTk9ERUxPQ0tfTEFZT1VUIHwgTURTX0lOT0RFTE9DS19QRVJNKSkKIAkJCWxsX2hhdmVfbWRfbG9jayhpbm9kZSwgJmJpdHMsIExDS19NSU5NT0RFKTsKIAotCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfT1BFTikKLQkJCWxsX2hhdmVfbWRfbG9jayhpbm9kZSwgJmJpdHMsIG1vZGUpOwotCi0JCWZpZCA9IGxsX2lub2RlMmZpZChpbm9kZSk7Ci0JCWlmICghZmlkX3Jlc19uYW1lX2VxKGZpZCwgJmxvY2stPmxfcmVzb3VyY2UtPmxyX25hbWUpKQotCQkJTERMTV9FUlJPUihsb2NrLCAiZGF0YSBtaXNtYXRjaCB3aXRoIG9iamVjdCAiCi0JCQkJICAgREZJRCIgKCVwKSIsIFBGSUQoZmlkKSwgaW5vZGUpOwotCi0JCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19PUEVOKSB7Ci0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJc3dpdGNoIChsb2NrLT5sX3JlcV9tb2RlKSB7Ci0JCQljYXNlIExDS19DVzoKLQkJCQlmbGFncyA9IEZNT0RFX1dSSVRFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMQ0tfUFI6Ci0JCQkJZmxhZ3MgPSBGTU9ERV9FWEVDOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMQ0tfQ1I6Ci0JCQkJZmxhZ3MgPSBGTU9ERV9SRUFEOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlDRVJST1IoIlVuZXhwZWN0ZWQgbG9jayBtb2RlIGZvciBPUEVOIGxvY2sgIgotCQkJCSAgICAgICAiJWQsIGlub2RlICVsZFxuIiwgbG9jay0+bF9yZXFfbW9kZSwKLQkJCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKLQkJCX0KLQkJCWxsX21kX3JlYWxfY2xvc2UoaW5vZGUsIGZsYWdzKTsKLQkJfQotCi0JCWxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19MQVlPVVQpIHsKLQkJCXN0cnVjdCBjbF9vYmplY3RfY29uZiBjb25mID0geyB7IDAgfSB9OworCQkJc3RydWN0IGNsX29iamVjdF9jb25mIGNvbmYgPSB7CisJCQkJLmNvY19vcGMgPSBPQkpFQ1RfQ09ORl9JTlZBTElEQVRFLAorCQkJCS5jb2NfaW5vZGUgPSBpbm9kZSwKKwkJCX07CiAKLQkJCWNvbmYuY29jX29wYyA9IE9CSkVDVF9DT05GX0lOVkFMSURBVEU7Ci0JCQljb25mLmNvY19pbm9kZSA9IGlub2RlOwogCQkJcmMgPSBsbF9sYXlvdXRfY29uZihpbm9kZSwgJmNvbmYpOwotCQkJaWYgKHJjKQotCQkJCUNERUJVRyhEX0lOT0RFLCAiaW52YWxpZGluZyBsYXlvdXQgJWQuXG4iLCByYyk7CisJCQlpZiAocmMgPCAwKQorCQkJCUNERUJVRyhEX0lOT0RFLCAiY2Fubm90IGludmFsaWRhdGUgbGF5b3V0IG9mICIKKwkJCQkgICAgICAgREZJRCI6IHJjID0gJWRcbiIsCisJCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIHJjKTsKIAkJfQogCiAJCWlmIChiaXRzICYgTURTX0lOT0RFTE9DS19VUERBVEUpIHsKKwkJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCiAJCQlzcGluX2xvY2soJmxsaS0+bGxpX2xvY2spOwogCQkJbGxpLT5sbGlfZmxhZ3MgJj0gfkxMSUZfTURTX1NJWkVfTE9DSzsKIAkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9sb2NrKTsKIAkJfQogCi0JCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCi0JCSAgICAgKGJpdHMgJiBNRFNfSU5PREVMT0NLX1VQREFURSkpIHsKKwkJaWYgKChiaXRzICYgTURTX0lOT0RFTE9DS19VUERBVEUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCUNERUJVRyhEX0lOT0RFLCAiaW52YWxpZGF0aW5nIGlub2RlICVsdVxuIiwKIAkJCSAgICAgICBpbm9kZS0+aV9pbm8pOwogCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCk7CiAJCQlsbF9pbnZhbGlkYXRlX25lZ2F0aXZlX2NoaWxkcmVuKGlub2RlKTsKIAkJfQogCi0JCWlmIChpbm9kZS0+aV9zYi0+c19yb290ICYmCi0JCSAgICBpbm9kZSAhPSBpbm9kZS0+aV9zYi0+c19yb290LT5kX2lub2RlICYmCi0JCSAgICAoYml0cyAmIChNRFNfSU5PREVMT0NLX0xPT0tVUCB8IE1EU19JTk9ERUxPQ0tfUEVSTSkpKQorCQlpZiAoKGJpdHMgJiAoTURTX0lOT0RFTE9DS19MT09LVVAgfCBNRFNfSU5PREVMT0NLX1BFUk0pKSAmJgorCQkgICAgaW5vZGUtPmlfc2ItPnNfcm9vdCAhPSBOVUxMICYmCisJCSAgICBpbm9kZSAhPSBpbm9kZS0+aV9zYi0+c19yb290LT5kX2lub2RlKQogCQkJbGxfaW52YWxpZGF0ZV9hbGlhc2VzKGlub2RlKTsKKwogCQlpcHV0KGlub2RlKTsKIAkJYnJlYWs7CiAJfQpAQCAtNDAwLDExICs0MDYsMTYgQEAKIHN0cnVjdCBkZW50cnkgKmxsX3NwbGljZV9hbGlhcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpuZXc7CisJaW50IHJjOwogCiAJaWYgKGlub2RlKSB7CiAJCW5ldyA9IGxsX2ZpbmRfYWxpYXMoaW5vZGUsIGRlKTsKIAkJaWYgKG5ldykgewotCQkJbGxfZG9wc19pbml0KG5ldywgMSwgMSk7CisJCQlyYyA9IGxsX2RfaW5pdChuZXcpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWRwdXQobmV3KTsKKwkJCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJCQl9CiAJCQlkX21vdmUobmV3LCBkZSk7CiAJCQlpcHV0KGlub2RlKTsKIAkJCUNERUJVRyhEX0RFTlRSWSwKQEAgLTQxMyw4ICs0MjQsOSBAQAogCQkJcmV0dXJuIG5ldzsKIAkJfQogCX0KLQlsbF9kb3BzX2luaXQoZGUsIDEsIDEpOwotCV9fZF9sdXN0cmVfaW52YWxpZGF0ZShkZSk7CisJcmMgPSBsbF9kX2luaXQoZGUpOworCWlmIChyYyA8IDApCisJCXJldHVybiBFUlJfUFRSKHJjKTsKIAlkX2FkZChkZSwgaW5vZGUpOwogCUNERUJVRyhEX0RFTlRSWSwgIkFkZCBkZW50cnkgJXAgaW5vZGUgJXAgcmVmYyAlZCBmbGFncyAlI3hcbiIsCiAJICAgICAgIGRlLCBkZS0+ZF9pbm9kZSwgZF9jb3VudChkZSksIGRlLT5kX2ZsYWdzKTsKQEAgLTQ1MywxMCArNDY1LDIyIEBACiAJfQogCiAJLyogT25seSBoYXNoICpkZSBpZiBpdCBpcyB1bmhhc2hlZCAobmV3IGRlbnRyeSkuCi0JICogQXRvaW1jX29wZW4gbWF5IHBhc3NpbiBoYXNoZWQgZGVudHJpZXMgZm9yIG9wZW4uCisJICogQXRvaW1jX29wZW4gbWF5IHBhc3NpbmcgaGFzaGVkIGRlbnRyaWVzIGZvciBvcGVuLgogCSAqLwotCWlmIChkX3VuaGFzaGVkKCpkZSkpCi0JCSpkZSA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwgKmRlKTsKKwlpZiAoZF91bmhhc2hlZCgqZGUpKSB7CisJCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCisJCWFsaWFzID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLCAqZGUpOworCQlpZiAoSVNfRVJSKGFsaWFzKSkKKwkJCXJldHVybiBQVFJfRVJSKGFsaWFzKTsKKwkJKmRlID0gYWxpYXM7CisJfSBlbHNlIGlmICghaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfTE9PS1VQX05FRykgICYmCisJCSAgICFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9PUEVOX0NSRUFURSkpIHsKKwkJLyogV2l0aCBESVNQX09QRU5fQ1JFQVRFIGRlbnRyeSB3aWxsCisJCSAgIGluc3RhbnRpYXRlZCBpbiBsbF9jcmVhdGVfaXQuICovCisJCUxBU1NFUlQoKCpkZSktPmRfaW5vZGUgPT0gTlVMTCk7CisJCWRfaW5zdGFudGlhdGUoKmRlLCBpbm9kZSk7CisJfQogCiAJaWYgKCFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9MT09LVVBfTkVHKSkgewogCQkvKiB3ZSBoYXZlIGxvb2t1cCBsb29rIC0gdW5oaWRlIGRlbnRyeSAqLwpAQCAtNTA1LDE2ICs1MjksNiBAQAogCiAJbGxfZnJvYl9pbnRlbnQoJml0LCAmbG9va3VwX2l0KTsKIAotCS8qIEFzIGRvX2xvb2t1cCBpcyBjYWxsZWQgYmVmb3JlIGZvbGxvd19tb3VudCwgcm9vdCBkZW50cnkgbWF5IGJlIGxlZnQKLQkgKiBub3QgdmFsaWQsIHJldmFsaWRhdGUgaXQgaGVyZS4gKi8KLQlpZiAocGFyZW50LT5pX3NiLT5zX3Jvb3QgJiYgKHBhcmVudC0+aV9zYi0+c19yb290LT5kX2lub2RlID09IHBhcmVudCkgJiYKLQkgICAgKGl0LT5pdF9vcCAmIChJVF9PUEVOIHwgSVRfQ1JFQVQpKSkgewotCQlyYyA9IGxsX2lub2RlX3JldmFsaWRhdGVfaXQocGFyZW50LT5pX3NiLT5zX3Jvb3QsIGl0LAotCQkJCQkgICAgTURTX0lOT0RFTE9DS19MT09LVVApOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0JfQotCiAJaWYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSKSB7CiAJCXJjID0gbGxfc3RhdGFoZWFkX2VudGVyKHBhcmVudCwgJmRlbnRyeSwgMCk7CiAJCWlmIChyYyA9PSAxKSB7CkBAIC01ODQsMTIgKzU5OCw4IEBACiAJICAgICAgIHBhcmVudC0+aV9nZW5lcmF0aW9uLCBwYXJlbnQsIGZsYWdzKTsKIAogCS8qIE9wdGltaXplIGF3YXkgKENSRUFURSAmJiAhT1BFTikuIExldCAuY3JlYXRlIGhhbmRsZSB0aGUgcmFjZS4gKi8KLQlpZiAoKGZsYWdzICYgTE9PS1VQX0NSRUFURSApICYmICEoZmxhZ3MgJiBMT09LVVBfT1BFTikpIHsKLQkJbGxfZG9wc19pbml0KGRlbnRyeSwgMSwgMSk7Ci0JCV9fZF9sdXN0cmVfaW52YWxpZGF0ZShkZW50cnkpOwotCQlkX2FkZChkZW50cnksIE5VTEwpOworCWlmICgoZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSAmJiAhKGZsYWdzICYgTE9PS1VQX09QRU4pKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlpZiAoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVHxMT09LVVBfT1BFTnxMT09LVVBfQ1JFQVRFKSkKIAkJaXRwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCmluZGV4IGU5YmEzOGEuLjQxNmY3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJCX0KIAogCQkvKgotCQkgKiBMb29wLWJhY2sgZHJpdmVyIGNhbGxzIC0+cHJlcGFyZV93cml0ZSgpIGFuZCAtPnNlbmRmaWxlKCkKKwkJICogTG9vcC1iYWNrIGRyaXZlciBjYWxscyAtPnByZXBhcmVfd3JpdGUoKS4KIAkJICogbWV0aG9kcyBkaXJlY3RseSwgYnlwYXNzaW5nIGZpbGUgc3lzdGVtIC0+d3JpdGUoKSBvcGVyYXRpb24sCiAJCSAqIHNvIGNsX2lvIGhhcyB0byBiZSBjcmVhdGVkIGhlcmUuCiAJCSAqLwpAQCAtNTU4LDEwICs1NTgsMTAgQEAKICAqIHN0cmlwZWQgb3ZlciwgcmF0aGVyIHRoYW4gaGF2aW5nIGEgY29uc3RhbnQgdmFsdWUgZm9yIGFsbCBmaWxlcyBoZXJlLiAqLwogCiAvKiBSQVNfSU5DUkVBU0VfU1RFUCBzaG91bGQgYmUgKDFVTCA8PCAoaW5vZGUtPmlfYmxrYml0cyAtIFBBR0VfQ0FDSEVfU0hJRlQpKS4KLSAqIFRlbXByYXJpbHkgc2V0IFJBU19JTkNSRUFTRV9TVEVQIHRvIDFNQi4gQWZ0ZXIgNE1CIFJQQyBpcyBlbmFibGVkCisgKiBUZW1wb3JhcmlseSBzZXQgUkFTX0lOQ1JFQVNFX1NURVAgdG8gMU1CLiBBZnRlciA0TUIgUlBDIGlzIGVuYWJsZWQKICAqIGJ5IGRlZmF1bHQsIHRoaXMgc2hvdWxkIGJlIGFkanVzdGVkIGNvcnJlc3BvbmRpbmcgd2l0aCBtYXhfcmVhZF9haGVhZF9tYgogICogYW5kIG1heF9yZWFkX2FoZWFkX3Blcl9maWxlX21iIG90aGVyd2lzZSB0aGUgcmVhZGFoZWFkIGJ1ZGdldCBjYW4gYmUgdXNlZAotICogdXAgcXVpY2tseSB3aGljaCB3aWxsIGFmZmVjdCByZWFkIHBlcmZvcm1hbmNlIHNpZ2luaWZpY2FudGx5LiBTZWUgTFUtMjgxNiAqLworICogdXAgcXVpY2tseSB3aGljaCB3aWxsIGFmZmVjdCByZWFkIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuIFNlZSBMVS0yODE2ICovCiAjZGVmaW5lIFJBU19JTkNSRUFTRV9TVEVQKGlub2RlKSAoT05FX01CX0JSV19TSVpFID4+IFBBR0VfQ0FDSEVfU0hJRlQpCiAKIHN0YXRpYyBpbmxpbmUgaW50IHN0cmlkZV9pb19tb2RlKHN0cnVjdCBsbF9yZWFkYWhlYWRfc3RhdGUgKnJhcykKQEAgLTU3MCw3ICs1NzAsNyBAQAogfQogLyogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgaG93IG11Y2ggcGFnZXMgd2lsbCBiZSByZWFkIGluCiAgKiBbb2ZmLCBvZmYgKyBsZW5ndGhdLCBpbiBzdWNoIHN0cmlkZSBJTyBhcmVhLAotICogc3RyaWRlX29mZnNldCA9IHN0X29mZiwgc3RyaWRlX2xlbmdoID0gc3RfbGVuLAorICogc3RyaWRlX29mZnNldCA9IHN0X29mZiwgc3RyaWRlX2xlbmd0aCA9IHN0X2xlbiwKICAqIHN0cmlkZV9wYWdlcyA9IHN0X3BncwogICoKICAqICAgfC0tLS0tLS0tLS0tLS0tLS0tLXwqKioqKnwtLS0tLS0tLS0tLS0tLS0tLS18KioqKip8LS0tLS0tLS0tLS0tfCoqKioqfC4uLi4KQEAgLTEwOTAsNyArMTA5MCw3IEBACiAJcmFzX3NldF9zdGFydChpbm9kZSwgcmFzLCBpbmRleCk7CiAKIAlpZiAoc3RyaWRlX2lvX21vZGUocmFzKSkKLQkJLyogU2luY2Ugc3RyaWRlIHJlYWRhaGVhZCBpcyBzZW50aXZpdGUgdG8gdGhlIG9mZnNldAorCQkvKiBTaW5jZSBzdHJpZGUgcmVhZGFoZWFkIGlzIHNlbnNpdGl2ZSB0byB0aGUgb2Zmc2V0CiAJCSAqIG9mIHJlYWQtYWhlYWQsIHNvIHdlIHVzZSBvcmlnaW5hbCBvZmZzZXQgaGVyZSwKIAkJICogaW5zdGVhZCBvZiByYXNfd2luZG93X3N0YXJ0LCB3aGljaCBpcyBSUEMgYWxpZ25lZCAqLwogCQlyYXMtPnJhc19uZXh0X3JlYWRhaGVhZCA9IG1heChpbmRleCwgcmFzLT5yYXNfbmV4dF9yZWFkYWhlYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYwppbmRleCBmNmI1ZjRiOS4uYzg2MjRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCSAqIFNvbWVvbmUgdHJpZ2dlcmVkIGdsaW1wc2Ugd2l0aGluIDEgc2VjIGJlZm9yZS4KIAkgKiAxKSBUaGUgZm9ybWVyIGdsaW1wc2Ugc3VjY2VlZGVkIHdpdGggZ2xpbXBzZSBsb2NrIGdyYW50ZWQgYnkgT1NULCBhbmQKIAkgKiAgICBpZiB0aGUgbG9jayBpcyBzdGlsbCBjYWNoZWQgb24gY2xpZW50LCBBR0wgbmVlZHMgdG8gZG8gbm90aGluZy4gSWYKLQkgKiAgICBpdCBpcyBjYW5jZWxsZWQgYnkgb3RoZXIgY2xpZW50LCBBR0wgbWF5YmUgY2Fubm90IG9idGFpb24gbmV3IGxvY2sKKwkgKiAgICBpdCBpcyBjYW5jZWxsZWQgYnkgb3RoZXIgY2xpZW50LCBBR0wgbWF5YmUgY2Fubm90IG9idGFpbiBuZXcgbG9jawogCSAqICAgIGZvciBubyBnbGltcHNlIGNhbGxiYWNrIHRyaWdnZXJlZCBieSBBR0wuCiAJICogMikgVGhlIGZvcm1lciBnbGltcHNlIHN1Y2NlZWRlZCwgYnV0IE9TVCBkaWQgbm90IGdyYW50IGdsaW1wc2UgbG9jay4KIAkgKiAgICBVbmRlciBzdWNoIGNhc2UsIGl0IGlzIHF1aXRlIHBvc3NpYmxlIHRoYXQgdGhlIE9TVCB3aWxsIG5vdCBncmFudApAQCAtODc3LDkgKzg3Nyw2IEBACiAJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKQogCQlyZXR1cm4gMTsKIAotCWlmICh1bmxpa2VseShkZW50cnkgPT0gZGVudHJ5LT5kX3NiLT5zX3Jvb3QpKQotCQlyZXR1cm4gMTsKLQogCWVudHJ5LT5zZV9pbm9kZSA9IGlncmFiKGlub2RlKTsKIAlyYyA9IG1kX3JldmFsaWRhdGVfbG9jayhsbF9pMm1kZXhwKGRpciksICZpdCwgbGxfaW5vZGUyZmlkKGlub2RlKSxOVUxMKTsKIAlpZiAocmMgPT0gMSkgewpAQCAtMTU4OCw4ICsxNTg1LDE1IEBACiAJCQkJCQlsbF9pbm9kZTJmaWQoaW5vZGUpLCAmYml0cyk7CiAJCQlpZiAocmMgPT0gMSkgewogCQkJCWlmICgoKmRlbnRyeXApLT5kX2lub2RlID09IE5VTEwpIHsKLQkJCQkJKmRlbnRyeXAgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsCisJCQkJCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCisJCQkJCWFsaWFzID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLAogCQkJCQkJCQkgICAqZGVudHJ5cCk7CisJCQkJCWlmIChJU19FUlIoYWxpYXMpKSB7CisJCQkJCQlsbF9zYWlfdW5wbHVnKHNhaSwgZW50cnkpOworCQkJCQkJcmV0dXJuIFBUUl9FUlIoYWxpYXMpOworCQkJCQl9CisJCQkJCSpkZW50cnlwID0gYWxpYXM7CiAJCQkJfSBlbHNlIGlmICgoKmRlbnRyeXApLT5kX2lub2RlICE9IGlub2RlKSB7CiAJCQkJCS8qIHJldmFsaWRhdGUsIGJ1dCBpbm9kZSBpcyByZWNyZWF0ZWQgKi8KIAkJCQkJQ0RFQlVHKERfUkVBREEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jCmluZGV4IDkzY2JmYmIuLmM3ZDcwMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jCkBAIC01MSw3ICs1MSw3IEBACiAJCQkJY29uc3Qgc3RydWN0IGNsX2lvX3NsaWNlICpzbGljZSk7CiAKIC8qKgotICogVHJ1ZSwgaWYgXGEgaW8gaXMgYSBub3JtYWwgaW8sIEZhbHNlIGZvciBzZW5kZmlsZSgpIC8gc3BsaWNlX3tyZWFkfHdyaXRlfQorICogVHJ1ZSwgaWYgXGEgaW8gaXMgYSBub3JtYWwgaW8sIEZhbHNlIGZvciBzcGxpY2Vfe3JlYWQsd3JpdGV9CiAgKi8KIGludCBjbF9pc19ub3JtYWxpbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIGNvbnN0IHN0cnVjdCBjbF9pbyAqaW8pCiB7CkBAIC00NzQsMjAgKzQ3NCw2IEBACiAJdnZwX2lvX2ZpbmkoZW52LCBpb3MpOwogfQogCi1zdGF0aWMgc3NpemVfdCBsdXN0cmVfZ2VuZXJpY19maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCXN0cnVjdCBjY2NfaW8gKnZpbywgbG9mZl90ICpwcG9zKQotewotCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3JlYWQodmlvLT5jdWlfaW9jYiwgdmlvLT5jdWlfaW92LAotCQkJCSAgICAgdmlvLT5jdWlfbnJzZWdzLCAqcHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGx1c3RyZV9nZW5lcmljX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCXN0cnVjdCBjY2NfaW8gKnZpbywgbG9mZl90ICpwcG9zKQotewotCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKHZpby0+Y3VpX2lvY2IsIHZpby0+Y3VpX2lvdiwKLQkJCQkgICAgICB2aW8tPmN1aV9ucnNlZ3MsICpwcG9zKTsKLX0KLQogc3RhdGljIGludCB2dnBfaW9fcmVhZF9zdGFydChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBjbF9pb19zbGljZSAqaW9zKQogewpAQCAtNTQwLDggKzUyNiwxMSBAQAogCWZpbGVfYWNjZXNzZWQoZmlsZSk7CiAJc3dpdGNoICh2aW8tPmN1aV9pb19zdWJ0eXBlKSB7CiAJY2FzZSBJT19OT1JNQUw6Ci0JCSByZXN1bHQgPSBsdXN0cmVfZ2VuZXJpY19maWxlX3JlYWQoZmlsZSwgY2lvLCAmcG9zKTsKLQkJIGJyZWFrOworCQlMQVNTRVJUKGNpby0+Y3VpX2lvY2ItPmtpX3BvcyA9PSBwb3MpOworCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoY2lvLT5jdWlfaW9jYiwKKwkJCQkJICAgICAgIGNpby0+Y3VpX2lvdiwgY2lvLT5jdWlfbnJzZWdzLAorCQkJCQkgICAgICAgY2lvLT5jdWlfaW9jYi0+a2lfcG9zKTsKKwkJYnJlYWs7CiAJY2FzZSBJT19TUExJQ0U6CiAJCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChmaWxlLCAmcG9zLAogCQkJCXZpby0+dS5zcGxpY2UuY3VpX3BpcGUsIGNudCwKQEAgLTU4Niw3ICs1NzUsNiBAQAogCXN0cnVjdCBjbF9pbyAgICAgICAqaW8gICAgPSBpb3MtPmNpc19pbzsKIAlzdHJ1Y3QgY2xfb2JqZWN0ICAgKm9iaiAgID0gaW8tPmNpX29iajsKIAlzdHJ1Y3QgaW5vZGUgICAgICAgKmlub2RlID0gY2NjX29iamVjdF9pbm9kZShvYmopOwotCXN0cnVjdCBmaWxlCSpmaWxlICA9IGNpby0+Y3VpX2ZkLT5mZF9maWxlOwogCXNzaXplX3QgcmVzdWx0ID0gMDsKIAlsb2ZmX3QgcG9zID0gaW8tPnUuY2lfd3Iud3IuY3J3X3BvczsKIAlzaXplX3QgY250ID0gaW8tPnUuY2lfd3Iud3IuY3J3X2NvdW50OwpAQCAtNjAxLDYgKzU4OSw4IEBACiAJCSAqLwogCQlwb3MgPSBpby0+dS5jaV93ci53ci5jcndfcG9zID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCQljaW8tPmN1aV9pb2NiLT5raV9wb3MgPSBwb3M7CisJfSBlbHNlIHsKKwkJTEFTU0VSVChjaW8tPmN1aV9pb2NiLT5raV9wb3MgPT0gcG9zKTsKIAl9CiAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIndyaXRlOiBbJWxsaSwgJWxsaSlcbiIsIHBvcywgcG9zICsgKGxvbmcgbG9uZyljbnQpOwpAQCAtNjA4LDggKzU5OCw5IEBACiAJaWYgKGNpby0+Y3VpX2lvdiA9PSBOVUxMKSAvKiBmcm9tIGEgdGVtcCBpbyBpbiBsbF9jbF9pbml0KCkuICovCiAJCXJlc3VsdCA9IDA7CiAJZWxzZQotCQlyZXN1bHQgPSBsdXN0cmVfZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsIGNpbywgJnBvcyk7Ci0KKwkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZShjaW8tPmN1aV9pb2NiLAorCQkJCQkJY2lvLT5jdWlfaW92LCBjaW8tPmN1aV9ucnNlZ3MsCisJCQkJCQljaW8tPmN1aV9pb2NiLT5raV9wb3MpOwogCWlmIChyZXN1bHQgPiAwKSB7CiAJCWlmIChyZXN1bHQgPCBjbnQpCiAJCQlpby0+Y2lfY29udGludWUgPSAwOwpAQCAtNjU1LDcgKzY0Niw3IEBACiAJaWYgKGNmaW8tPmZhdWx0LmZ0X2ZsYWdzICYgVk1fRkFVTFRfUkVUUlkpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JQ0VSUk9SKCJ1bmtub3cgZXJyb3IgaW4gcGFnZSBmYXVsdCAlZCFcbiIsIGNmaW8tPmZhdWx0LmZ0X2ZsYWdzKTsKKwlDRVJST1IoIlVua25vd24gZXJyb3IgaW4gcGFnZSBmYXVsdCAlZCFcbiIsIGNmaW8tPmZhdWx0LmZ0X2ZsYWdzKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtMTIwMSw3ICsxMTkyLDcgQEAKIAkJaWYgKHJlc3VsdCA9PSAtRU5PRU5UKQogCQkJLyogSWYgdGhlIGlub2RlIG9uIE1EUyBoYXMgYmVlbiByZW1vdmVkLCBidXQgdGhlIG9iamVjdHMKIAkJCSAqIG9uIE9TVHMgaGF2ZW4ndCBiZWVuIGRlc3Ryb3llZCAoYXN5bmMgdW5saW5rKSwgbGF5b3V0Ci0JCQkgKiBmZXRjaCB3aWxsIHJldHVybiAtRU5PRU5ULCB3ZSdkIGluZ29yZSB0aGlzIGVycm9yCisJCQkgKiBmZXRjaCB3aWxsIHJldHVybiAtRU5PRU5ULCB3ZSdkIGlnbm9yZSB0aGlzIGVycm9yCiAJCQkgKiBhbmQgY29udGludWUgd2l0aCBkaXJ0eSBmbHVzaC4gTFUtMzIzMC4gKi8KIAkJCXJlc3VsdCA9IDA7CiAJCWlmIChyZXN1bHQgPCAwKQpAQCAtMTIxNiw3ICsxMjA3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdnZwX2lvICpjbDJ2dnBfaW8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJCWNvbnN0IHN0cnVjdCBjbF9pb19zbGljZSAqc2xpY2UpCiB7Ci0JLyogQ2FsaW5nIGp1c3QgZm9yIGFzc2VydGlvbiAqLworCS8qIENhbGxpbmcganVzdCBmb3IgYXNzZXJ0aW9uICovCiAJY2wyY2NjX2lvKGVudiwgc2xpY2UpOwogCXJldHVybiB2dnBfZW52X2lvKGVudik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYwppbmRleCAzYTdkMDNjLi5iMWVkNGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAogCWlmICh4YXR0cl90eXBlID09IFhBVFRSX1VTRVJfVCAmJiAhKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfVVNFUl9YQVRUUikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQlpZiAoeGF0dHJfdHlwZSA9PSBYQVRUUl9UUlVTVEVEX1QgJiYgIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwlpZiAoeGF0dHJfdHlwZSA9PSBYQVRUUl9UUlVTVEVEX1QgJiYgIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCWlmICh4YXR0cl90eXBlID09IFhBVFRSX09USEVSX1QpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTE4MywxNyArMTgzLDExIEBACiAJCXZhbGlkIHw9IHJjZV9vcHMydmFsaWQocmNlLT5yY2Vfb3BzKTsKIAl9CiAjZW5kaWYKLQlpZiAoc2JpLT5sbF94YXR0cl9jYWNoZV9lbmFibGVkICYmCi0JICAgIChyY2UgPT0gTlVMTCB8fCByY2UtPnJjZV9vcHMgPT0gUk1UX0xTRVRGQUNMKSkgewotCQlyYyA9IGxsX3hhdHRyX2NhY2hlX3VwZGF0ZShpbm9kZSwgbmFtZSwgcHYsIHNpemUsIHZhbGlkLCBmbGFncyk7Ci0JfSBlbHNlIHsKIAkJb2MgPSBsbF9tZHNjYXBhX2dldChpbm9kZSk7CiAJCXJjID0gbWRfc2V0eGF0dHIoc2JpLT5sbF9tZF9leHAsIGxsX2lub2RlMmZpZChpbm9kZSksIG9jLAogCQkJCXZhbGlkLCBuYW1lLCBwdiwgc2l6ZSwgMCwgZmxhZ3MsCiAJCQkJbGxfaTJzdXBwZ2lkKGlub2RlKSwgJnJlcSk7CiAJCWNhcGFfcHV0KG9jKTsKLQl9Ci0KICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCiAJaWYgKG5ld192YWx1ZSAhPSBOVUxMKQogCQlsdXN0cmVfcG9zaXhfYWNsX3hhdHRyX2ZyZWUobmV3X3ZhbHVlLCBzaXplKTsKQEAgLTI5Miw2ICsyODYsNyBAQAogCXZvaWQgKnhkYXRhOwogCXN0cnVjdCBvYmRfY2FwYSAqb2M7CiAJc3RydWN0IHJtdGFjbF9jdGxfZW50cnkgKnJjZSA9IE5VTEw7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0lbHUvJXUoJXApXG4iLAogCSAgICAgICBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX2dlbmVyYXRpb24sIGlub2RlKTsKQEAgLTMzOSw3ICszMzQsNyBAQAogCSAqLwogCWlmICh4YXR0cl90eXBlID09IFhBVFRSX0FDTF9BQ0NFU1NfVCAmJgogCSAgICAhKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfUk1UX0NMSUVOVCkpIHsKLQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisKIAkJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCiAJCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7CkBAIC0zNTgsMTMgKzM1MywyNyBAQAogI2VuZGlmCiAKIGRvX2dldHhhdHRyOgotCWlmIChzYmktPmxsX3hhdHRyX2NhY2hlX2VuYWJsZWQgJiYgKHJjZSA9PSBOVUxMIHx8Ci0JCQkJCSAgICByY2UtPnJjZV9vcHMgPT0gUk1UX0xHRVRGQUNMIHx8Ci0JCQkJCSAgICByY2UtPnJjZV9vcHMgPT0gUk1UX0xTRVRGQUNMKSkgeworCWlmIChzYmktPmxsX3hhdHRyX2NhY2hlX2VuYWJsZWQgJiYgeGF0dHJfdHlwZSAhPSBYQVRUUl9BQ0xfQUNDRVNTX1QpIHsKIAkJcmMgPSBsbF94YXR0cl9jYWNoZV9nZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgdmFsaWQpOworCQlpZiAocmMgPT0gLUVBR0FJTikKKwkJCWdvdG8gZ2V0eGF0dHJfbm9jYWNoZTsKIAkJaWYgKHJjIDwgMCkKIAkJCUdPVE8ob3V0X3hhdHRyLCByYyk7CisKKwkJLyogQWRkICJzeXN0ZW0ucG9zaXhfYWNsX2FjY2VzcyIgdG8gdGhlIGxpc3QgKi8KKwkJaWYgKGxsaS0+bGxpX3Bvc2l4X2FjbCAhPSBOVUxMICYmIHZhbGlkICYgT0JEX01EX0ZMWEFUVFJMUykgeworCQkJaWYgKHNpemUgPT0gMCkgeworCQkJCXJjICs9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpOworCQkJfSBlbHNlIGlmIChzaXplIC0gcmMgPj0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUykpIHsKKwkJCQltZW1jcHkoYnVmZmVyICsgcmMsIFhBVFRSX05BTUVfQUNMX0FDQ0VTUywKKwkJCQkgICAgICAgc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUykpOworCQkJCXJjICs9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpOworCQkJfSBlbHNlIHsKKwkJCQlHT1RPKG91dF94YXR0ciwgcmMgPSAtRVJBTkdFKTsKKwkJCX0KKwkJfQogCX0gZWxzZSB7CitnZXR4YXR0cl9ub2NhY2hlOgogCQlvYyA9IGxsX21kc2NhcGFfZ2V0KGlub2RlKTsKIAkJcmMgPSBtZF9nZXR4YXR0cihzYmktPmxsX21kX2V4cCwgbGxfaW5vZGUyZmlkKGlub2RlKSwgb2MsCiAJCQkJdmFsaWQgfCAocmNlID8gcmNlX29wczJ2YWxpZChyY2UtPnJjZV9vcHMpIDogMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYwppbmRleCAzZTNiZTFmLi40ZGVmYTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKQEAgLTk4LDEzICs5OCwxMyBAQAogfQogCiAvKioKLSAqIFRoaXMgYWRkcyBvciB1cGRhdGVzIGFuIHhhdHRyLgorICogVGhpcyBhZGRzIGFuIHhhdHRyLgogICoKICAqIEFkZCBAeGF0dHJfbmFtZSBhdHRyIHdpdGggQHhhdHRyX3ZhbCB2YWx1ZSBhbmQgQHhhdHRyX3ZhbF9sZW4gbGVuZ3RoLAotICogaWYgdGhlIGF0dHJpYnV0ZSBhbHJlYWR5IGV4aXN0cywgdGhlbiB1cGRhdGUgaXRzIHZhbHVlLgogICoKICAqIFxyZXR2YWwgMCAgICAgICBzdWNjZXNzCiAgKiBccmV0dmFsIC1FTk9NRU0gaWYgbm8gbWVtb3J5IGNvdWxkIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGNhY2hlZCBhdHRyCisgKiBccmV0dmFsIC1FUFJPVE8gaWYgZHVwbGljYXRlIHhhdHRyIGlzIGJlaW5nIGFkZGVkCiAgKi8KIHN0YXRpYyBpbnQgbGxfeGF0dHJfY2FjaGVfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKmNhY2hlLAogCQkJICAgICAgY29uc3QgY2hhciAqeGF0dHJfbmFtZSwKQEAgLTExNiwyNyArMTE2LDggQEAKIAogCiAJaWYgKGxsX3hhdHRyX2NhY2hlX2ZpbmQoY2FjaGUsIHhhdHRyX25hbWUsICZ4YXR0cikgPT0gMCkgewotCQkvKiBGb3VuZCBhIGNhY2hlZCBFQSwgdXBkYXRlIGl0ICovCi0KLQkJaWYgKHhhdHRyX3ZhbF9sZW4gIT0geGF0dHItPnhlX3ZhbGxlbikgewotCQkJY2hhciAqdmFsOwotCQkJT0JEX0FMTE9DKHZhbCwgeGF0dHJfdmFsX2xlbik7Ci0JCQlpZiAodmFsID09IE5VTEwpIHsKLQkJCQlDREVCVUcoRF9DQUNIRSwKLQkJCQkgICAgICAgImZhaWxlZCB0byBhbGxvY2F0ZSAldSBieXRlcyBmb3IgeGF0dHIgJXMgdXBkYXRlXG4iLAotCQkJCSAgICAgICB4YXR0cl92YWxfbGVuLCB4YXR0cl9uYW1lKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJCU9CRF9GUkVFKHhhdHRyLT54ZV92YWx1ZSwgeGF0dHItPnhlX3ZhbGxlbik7Ci0JCQl4YXR0ci0+eGVfdmFsdWUgPSB2YWw7Ci0JCQl4YXR0ci0+eGVfdmFsbGVuID0geGF0dHJfdmFsX2xlbjsKLQkJfQotCQltZW1jcHkoeGF0dHItPnhlX3ZhbHVlLCB4YXR0cl92YWwsIHhhdHRyX3ZhbF9sZW4pOwotCi0JCUNERUJVRyhEX0NBQ0hFLCAidXBkYXRlOiBbJXNdPSUuKnNcbiIsIHhhdHRyX25hbWUsCi0JCQl4YXR0cl92YWxfbGVuLCB4YXR0cl92YWwpOwotCi0JCXJldHVybiAwOworCQlDREVCVUcoRF9DQUNIRSwgImR1cGxpY2F0ZSB4YXR0cjogWyVzXVxuIiwgeGF0dHJfbmFtZSk7CisJCXJldHVybiAtRVBST1RPOwogCX0KIAogCU9CRF9TTEFCX0FMTE9DX1BUUl9HRlAoeGF0dHIsIHhhdHRyX2ttZW0sIF9fR0ZQX0lPKTsKQEAgLTI2MSw3ICsyNDIsNyBAQAogICoKICAqIEZyZWUgYWxsIHhhdHRyIG1lbW9yeS4gQGxsaSBpcyB0aGUgaW5vZGUgaW5mbyBwb2ludGVyLgogICoKLSAqIFxyZXR2YWwgMCBubyBlcnJvciBvY2N1cmVkCisgKiBccmV0dmFsIDAgbm8gZXJyb3Igb2NjdXJyZWQKICAqLwogc3RhdGljIGludCBsbF94YXR0cl9jYWNoZV9kZXN0cm95X2xvY2tlZChzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpKQogewpAQCAtMjkyLDE0ICsyNzMsMTQgQEAKIH0KIAogLyoqCi0gKiBNYXRjaCBvciBlbnF1ZXVlIGEgUFIgb3IgUFcgTERMTSBsb2NrLgorICogTWF0Y2ggb3IgZW5xdWV1ZSBhIFBSIGxvY2suCiAgKgogICogRmluZCBvciByZXF1ZXN0IGFuIExETE0gbG9jayB3aXRoIHhhdHRyIGRhdGEuCiAgKiBTaW5jZSBMRExNIGRvZXMgbm90IHByb3ZpZGUgQVBJIGZvciBhdG9taWMgbWF0Y2hfb3JfZW5xdWV1ZSwKICAqIHRoZSBmdW5jdGlvbiBoYW5kbGVzIGl0IHdpdGggYSBzZXBhcmF0ZSBlbnEgbG9jay4KICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBmdW5jdGlvbiBleGl0cyB3aXRoIHRoZSBsaXN0IGxvY2sgaGVsZC4KICAqCi0gKiBccmV0dmFsIDAgICAgICAgbm8gZXJyb3Igb2NjdXJlZAorICogXHJldHZhbCAwICAgICAgIG5vIGVycm9yIG9jY3VycmVkCiAgKiBccmV0dmFsIC1FTk9NRU0gbm90IGVub3VnaCBtZW1vcnkKICAqLwogc3RhdGljIGludCBsbF94YXR0cl9maW5kX2dldF9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0zMjIsOSArMzAzLDcgQEAKIAogCW11dGV4X2xvY2soJmxsaS0+bGxpX3hhdHRyc19lbnFfbG9jayk7CiAJLyogVHJ5IG1hdGNoaW5nIGZpcnN0LiAqLwotCW1vZGUgPSBsbF90YWtlX21kX2xvY2soaW5vZGUsIE1EU19JTk9ERUxPQ0tfWEFUVFIsICZsb2NraCwgMCwKLQkJCSAgICAgICBvaXQtPml0X29wID09IElUX1NFVFhBVFRSID8gTENLX1BXIDoKLQkJCQkJCQkgICAoTENLX1BSIHwgTENLX1BXKSk7CisJbW9kZSA9IGxsX3Rha2VfbWRfbG9jayhpbm9kZSwgTURTX0lOT0RFTE9DS19YQVRUUiwgJmxvY2toLCAwLCBMQ0tfUFIpOwogCWlmIChtb2RlICE9IDApIHsKIAkJLyogZmFrZSBvaXQgaW4gbWRjX3JldmFsaWRhdGVfbG9jaygpIG1hbm5lciAqLwogCQlvaXQtPmQubHVzdHJlLml0X2xvY2tfaGFuZGxlID0gbG9ja2guY29va2llOwpAQCAtMzQwLDEzICszMTksNyBAQAogCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKIAl9CiAKLQlvcF9kYXRhLT5vcF92YWxpZCA9IE9CRF9NRF9GTFhBVFRSIHwgT0JEX01EX0ZMWEFUVFJMUyB8Ci0JCQkgICAgT0JEX01EX0ZMWEFUVFJMT0NLRUQ7Ci0jaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAotCS8qIElmIHdvcmtpbmcgd2l0aCBBQ0xzLCB3ZSB3b3VsZCBsaWtlIHRvIGNhY2hlIGxvY2FsIEFDTHMgKi8KLQlpZiAoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9STVRfQ0xJRU5UKQotCQlvcF9kYXRhLT5vcF92YWxpZCB8PSBPQkRfTURfRkxSTVRMR0VURkFDTDsKLSNlbmRpZgorCW9wX2RhdGEtPm9wX3ZhbGlkID0gT0JEX01EX0ZMWEFUVFIgfCBPQkRfTURfRkxYQVRUUkxTOwogCiAJcmMgPSBtZF9lbnF1ZXVlKGV4cCwgJmVpbmZvLCBvaXQsIG9wX2RhdGEsICZsb2NraCwgTlVMTCwgMCwgTlVMTCwgMCk7CiAJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CkBAIC0zNzQsNyArMzQ3LDcgQEAKICAqIGEgcmVhZCBvciBhIHdyaXRlIHhhdHRyIGxvY2sgZGVwZW5kaW5nIG9uIG9wZXJhdGlvbiBpbiBAb2l0LgogICogSW50ZW50IGlzIGRyb3BwZWQgb24gZXhpdCB1bmxlc3MgdGhlIG9wZXJhdGlvbiBpcyBzZXR4YXR0ci4KICAqCi0gKiBccmV0dmFsIDAgICAgICAgbm8gZXJyb3Igb2NjdXJlZAorICogXHJldHZhbCAwICAgICAgIG5vIGVycm9yIG9jY3VycmVkCiAgKiBccmV0dmFsIC1FUFJPVE8gbmV0d29yayBwcm90b2NvbCBlcnJvcgogICogXHJldHZhbCAtRU5PTUVNIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgY2FjaGUKICAqLwpAQCAtNDA5LDcgKzM4MiwxMSBAQAogCWlmIChvaXQtPmQubHVzdHJlLml0X3N0YXR1cyA8IDApIHsKIAkJQ0RFQlVHKERfQ0FDSEUsICJnZXR4YXR0ciBpbnRlbnQgcmV0dXJuZWQgJWQgZm9yIGZpZCAiREZJRCJcbiIsCiAJCSAgICAgICBvaXQtPmQubHVzdHJlLml0X3N0YXR1cywgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7Ci0JCUdPVE8ob3V0X2Rlc3Ryb3ksIHJjID0gb2l0LT5kLmx1c3RyZS5pdF9zdGF0dXMpOworCQlyYyA9IG9pdC0+ZC5sdXN0cmUuaXRfc3RhdHVzOworCQkvKiB4YXR0ciBkYXRhIGlzIHNvIGxhcmdlIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBjYWNoZSBpdCAqLworCQlpZiAocmMgPT0gLUVSQU5HRSkKKwkJCXJjID0gLUVBR0FJTjsKKwkJR09UTyhvdXRfZGVzdHJveSwgcmMpOwogCX0KIAogCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwpAQCAtNDQ3LDYgKzQyNCwxMSBAQAogCQkJcmMgPSAtRVBST1RPOwogCQl9IGVsc2UgaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xMSVRFX1hBVFRSX0VOT01FTSkpIHsKIAkJCXJjID0gLUVOT01FTTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHhkYXRhLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpKSB7CisJCQkvKiBGaWx0ZXIgb3V0IEFDTCBBQ0NFU1Mgc2luY2UgaXQncyBjYWNoZWQgc2VwYXJhdGVseSAqLworCQkJQ0RFQlVHKERfQ0FDSEUsICJub3QgY2FjaGluZyAlc1xuIiwKKwkJCSAgICAgICBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpOworCQkJcmMgPSAwOwogCQl9IGVsc2UgewogCQkJcmMgPSBsbF94YXR0cl9jYWNoZV9hZGQoJmxsaS0+bGxpX3hhdHRycywgeGRhdGEsIHh2YWwsCiAJCQkJCQkqeHNpemVzKTsKQEAgLTQ2Nyw4ICs0NDksNyBAQAogCiAJR09UTyhvdXRfbWF5YmVfZHJvcCwgcmMpOwogb3V0X21heWJlX2Ryb3A6Ci0JLyogZHJvcCBsb2NrIG9uIGVycm9yIG9yIGdldHhhdHRyICovCi0JaWYgKHJjICE9IDAgfHwgb2l0LT5pdF9vcCAhPSBJVF9TRVRYQVRUUikKKwogCQlsbF9pbnRlbnRfZHJvcF9sb2NrKG9pdCk7CiAKIAlpZiAocmMgIT0gMCkKQEAgLTQ5Niw3ICs0NzcsNyBAQAogICogVGhlIHJlc3VsdGluZyB2YWx1ZS9saXN0IGlzIHN0b3JlZCBpbiBAYnVmZmVyIGlmIHRoZSBmb3JtZXIKICAqIGlzIG5vdCBsYXJnZXIgdGhhbiBAc2l6ZS4KICAqCi0gKiBccmV0dmFsIDAgICAgICAgIG5vIGVycm9yIG9jY3VyZWQKKyAqIFxyZXR2YWwgMCAgICAgICAgbm8gZXJyb3Igb2NjdXJyZWQKICAqIFxyZXR2YWwgLUVQUk9UTyAgbmV0d29yayBwcm90b2NvbCBlcnJvcgogICogXHJldHZhbCAtRU5PTUVNICBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGNhY2hlCiAgKiBccmV0dmFsIC1FUkFOR0UgIHRoZSBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaApAQCAtNTUzLDY1ICs1MzQsMyBAQAogCiAJcmV0dXJuIHJjOwogfQotCi0KLS8qKgotICogU2V0L3VwZGF0ZSBhbiB4YXR0ciB2YWx1ZSBvciByZW1vdmUgeGF0dHIgdXNpbmcgdGhlIHdyaXRlLXRocm91Z2ggY2FjaGUuCi0gKgotICogU2V0L3VwZGF0ZSB0aGUgeGF0dHIgdmFsdWUgKGlmIEB2YWxpZCBoYXMgT0JEX01EX0ZMWEFUVFIpIG9mIEBuYW1lIHRvIEBuZXd2YWwKLSAqIG9yCi0gKiByZW1vdmUgdGhlIHhhdHRyIEBuYW1lIChAdmFsaWQgaGFzIE9CRF9NRF9GTFhBVFRSUk0gc2V0KSBmcm9tIEBpbm9kZS4KLSAqIEBmbGFncyBpcyBlaXRoZXIgWEFUVFJfQ1JFQVRFIG9yIFhBVFRSX1JFUExBQ0UgYXMgZGVmaW5lZCBieSBzZXR4YXR0cigyKQotICoKLSAqIFxyZXR2YWwgMCAgICAgICAgbm8gZXJyb3Igb2NjdXJlZAotICogXHJldHZhbCAtRVBST1RPICBuZXR3b3JrIHByb3RvY29sIGVycm9yCi0gKiBccmV0dmFsIC1FTk9NRU0gIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgY2FjaGUKLSAqIFxyZXR2YWwgLUVSQU5HRSAgdGhlIGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoCi0gKiBccmV0dmFsIC1FTk9EQVRBIG5vIHN1Y2ggYXR0ciAoaW4gdGhlIHJlbW92YWwgY2FzZSkKLSAqLwotaW50IGxsX3hhdHRyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJY29uc3QgY2hhciAqbmFtZSwKLQkJCWNvbnN0IGNoYXIgKm5ld3ZhbCwKLQkJCXNpemVfdCBzaXplLAotCQkJX191NjQgdmFsaWQsCi0JCQlpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGxvb2t1cF9pbnRlbnQgb2l0ID0geyAuaXRfb3AgPSBJVF9TRVRYQVRUUiB9OwotCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShpbm9kZSk7Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEgPSBOVUxMOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwotCXN0cnVjdCBvYmRfY2FwYSAqb2M7Ci0JaW50IHJjOwotCi0KLQotCUxBU1NFUlQoISEodmFsaWQgJiBPQkRfTURfRkxYQVRUUikgXiAhISh2YWxpZCAmIE9CRF9NRF9GTFhBVFRSUk0pKTsKLQotCXJjID0gbGxfeGF0dHJfY2FjaGVfcmVmaWxsKGlub2RlLCAmb2l0KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCW9jID0gbGxfbWRzY2FwYV9nZXQoaW5vZGUpOwotCXJjID0gbWRfc2V0eGF0dHIoc2JpLT5sbF9tZF9leHAsIGxsX2lub2RlMmZpZChpbm9kZSksIG9jLAotCQkJdmFsaWQgfCBPQkRfTURfRkxYQVRUUkxPQ0tFRCwgbmFtZSwgbmV3dmFsLAotCQkJc2l6ZSwgMCwgZmxhZ3MsIGxsX2kyc3VwcGdpZChpbm9kZSksICZyZXEpOwotCWNhcGFfcHV0KG9jKTsKLQotCWlmIChyYykgewotCQlsbF9pbnRlbnRfZHJvcF9sb2NrKCZvaXQpOwotCQlHT1RPKG91dCwgcmMpOwotCX0KLQotCWlmICh2YWxpZCAmIE9CRF9NRF9GTFhBVFRSKQotCQlyYyA9IGxsX3hhdHRyX2NhY2hlX2FkZCgmbGxpLT5sbGlfeGF0dHJzLCBuYW1lLCBuZXd2YWwsIHNpemUpOwotCWVsc2UgaWYgKHZhbGlkICYgT0JEX01EX0ZMWEFUVFJSTSkKLQkJcmMgPSBsbF94YXR0cl9jYWNoZV9kZWwoJmxsaS0+bGxpX3hhdHRycywgbmFtZSk7Ci0KLQlsbF9pbnRlbnRfZHJvcF9sb2NrKCZvaXQpOwotCUdPVE8ob3V0LCByYyk7Ci1vdXQ6Ci0JdXBfd3JpdGUoJmxsaS0+bGxpX3hhdHRyc19saXN0X3J3c2VtKTsKLQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0KLQlyZXR1cm4gcmM7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYwppbmRleCA1NmRlZGNlLi45YmE1YTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZW50LmMKQEAgLTExOSw3ICsxMTksNiBAQAogCUNERUJVRyhEX0lOT0RFLCAiUkVNT1RFX0lOVEVOVCB3aXRoIGZpZD0iREZJRCIgLT4gbWRzICMlZFxuIiwKIAkgICAgICAgUEZJRCgmYm9keS0+ZmlkMSksIHRndC0+bHRkX2lkeCk7CiAKLQlpdC0+ZC5sdXN0cmUuaXRfZGlzcG9zaXRpb24gJj0gfkRJU1BfRU5RX0NPTVBMRVRFOwogCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBsbW0sIGxtbXNpemUsIGl0LAogCQkJICAgIGZsYWdzLCAmcmVxLCBjYl9ibG9ja2luZywgZXh0cmFfbG9ja19mbGFncyk7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKaW5kZXggMWJkZGQ4Zi4uM2JhMGEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCkBAIC0xNzQ0LDcgKzE3NDQsNiBAQAogCWl0LT5kLmx1c3RyZS5pdF9kYXRhID0gTlVMTDsKIAlmaWQxID0gYm9keS0+ZmlkMTsKIAotCWl0LT5kLmx1c3RyZS5pdF9kaXNwb3NpdGlvbiAmPSB+RElTUF9FTlFfQ09NUExFVEU7CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCiAJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJmZpZDEpOwpAQCAtMjU5Myw3ICsyNTkyLDcgQEAKIAogaW50IGxtdl9zZXRfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJICAgICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCwKLQkJCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpvcGVuX3JlcSkKKwkJCSAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KQogewogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJm9iZC0+dS5sbXY7CkBAIC0yNjAzLDcgKzI2MDIsNyBAQAogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCXJldHVybiBtZF9zZXRfb3Blbl9yZXBsYXlfZGF0YSh0Z3QtPmx0ZF9leHAsIG9jaCwgb3Blbl9yZXEpOworCXJldHVybiBtZF9zZXRfb3Blbl9yZXBsYXlfZGF0YSh0Z3QtPmx0ZF9leHAsIG9jaCwgaXQpOwogfQogCiBpbnQgbG12X2NsZWFyX29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYwppbmRleCBiMzU1ZDAxLi41ZDVjMzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCkBAIC04Nyw4ICs4Nyw5IEBACiAKICNkZWZpbmUgTUFYX1BPTElDWV9TVFJJTkdfU0laRSA2NAogCi1zdGF0aWMgc3NpemVfdCBsbXZfcGxhY2VtZW50X3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAotCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCitzdGF0aWMgc3NpemVfdCBsbXZfcGxhY2VtZW50X3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5wcml2YXRlOwogCWNoYXIJCSAgICAgZHVtbXlbTUFYX1BPTElDWV9TVFJJTkdfU0laRSArIDFdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCmluZGV4IGU2YzYwMTUuLjZmMzU2ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAogCU9CRF9BTExPQ19MQVJHRShsc20sICpzaXplKTsKIAlpZiAoIWxzbSkKLQkJcmV0dXJuIE5VTEw7OworCQlyZXR1cm4gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBzdHJpcGVfY291bnQ7IGkrKykgewogCQlPQkRfU0xBQl9BTExPQ19QVFJfR0ZQKGxvaSwgbG92X29pbmZvX3NsYWIsIF9fR0ZQX0lPKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYwppbmRleCA1YTZhYjcwLi42NTEzM2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCkBAIC0xOTQsNiArMTk0LDcgQEAKIAkJc3ViX2lvLT5jaV9sb2NrcmVxID0gaW8tPmNpX2xvY2tyZXE7CiAJCXN1Yl9pby0+Y2lfdHlwZSAgICA9IGlvLT5jaV90eXBlOwogCQlzdWJfaW8tPmNpX25vX3NydmxvY2sgPSBpby0+Y2lfbm9fc3J2bG9jazsKKwkJc3ViX2lvLT5jaV9ub2F0aW1lID0gaW8tPmNpX25vYXRpbWU7CiAKIAkJbG92X3N1Yl9lbnRlcihzdWIpOwogCQlyZXN1bHQgPSBjbF9pb19zdWJfaW5pdChzdWItPnN1Yl9lbnYsIHN1Yl9pbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCmluZGV4IDUwYTc3YzUuLjAyNTA5ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYwpAQCAtMzM5LDcgKzMzOSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGxvdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewogCQlpZiAobG92LT5sb3ZfdGd0c1tpXSAmJiBsb3YtPmxvdl90Z3RzW2ldLT5sdGRfZXhwKSB7CiAJCQkvKiBEaXNjb25uZWN0aW9uIGlzIHRoZSBsYXN0IHdlIGtub3cgYWJvdXQgYW4gb2JkICovCi0JCQlsb3ZfZGVsX3RhcmdldChvYmQsIGksIDAsIGxvdi0+bG92X3RndHNbaV0tPmx0ZF9nZW4pOworCQkJbG92X2RlbF90YXJnZXQob2JkLCBpLCBOVUxMLCBsb3YtPmxvdl90Z3RzW2ldLT5sdGRfZ2VuKTsKIAkJfQogCX0KIAlvYmRfcHV0cmVmKG9iZCk7CkBAIC02NDQsNyArNjQ0LDcgQEAKIAlpZiAocmMpIHsKIAkJQ0VSUk9SKCJhZGQgZmFpbGVkICglZCksIGRlbGV0aW5nICVzXG4iLCByYywKIAkJICAgICAgIG9iZF91dWlkMnN0cigmdGd0LT5sdGRfdXVpZCkpOwotCQlsb3ZfZGVsX3RhcmdldChvYmQsIGluZGV4LCAwLCAwKTsKKwkJbG92X2RlbF90YXJnZXQob2JkLCBpbmRleCwgTlVMTCwgMCk7CiAJfQogCW9iZF9wdXRyZWYob2JkKTsKIAlyZXR1cm4gcmM7CkBAIC03NjgsNyArNzY4LDcgQEAKIAogaW50IGxvdl9zZXR1cChzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkLCBzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZykKIHsKLQlzdHJ1Y3QgbHByb2Nmc19zdGF0aWNfdmFycyBsdmFycyA9IHsgMCB9OworCXN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzIGx2YXJzID0geyBOVUxMIH07CiAJc3RydWN0IGxvdl9kZXNjICpkZXNjOwogCXN0cnVjdCBsb3Zfb2JkICpsb3YgPSAmb2JkLT51LmxvdjsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYwppbmRleCBkZjhiNWI1Li5kNmIyY2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKQEAgLTEyMiw4ICsxMjIsOCBAQAogfQogCiBzdGF0aWMgaW50IGxvdl9pbml0X3N1Yihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsb3Zfb2JqZWN0ICpsb3YsCi0JCQlzdHJ1Y3QgY2xfb2JqZWN0ICpzdHJpcGUsCi0JCQlzdHJ1Y3QgbG92X2xheW91dF9yYWlkMCAqcjAsIGludCBpZHgpCisJCQlzdHJ1Y3QgY2xfb2JqZWN0ICpzdHJpcGUsIHN0cnVjdCBsb3ZfbGF5b3V0X3JhaWQwICpyMCwKKwkJCWludCBpZHgpCiB7CiAJc3RydWN0IGNsX29iamVjdF9oZWFkZXIgKmhkcjsKIAlzdHJ1Y3QgY2xfb2JqZWN0X2hlYWRlciAqc3ViaGRyOwpAQCAtMTQ0LDcgKzE0NCw2IEBACiAKIAloZHIgICAgPSBjbF9vYmplY3RfaGVhZGVyKGxvdjJjbChsb3YpKTsKIAlzdWJoZHIgPSBjbF9vYmplY3RfaGVhZGVyKHN0cmlwZSk7Ci0JcGFyZW50ID0gc3ViaGRyLT5jb2hfcGFyZW50OwogCiAJb2luZm8gPSBsb3YtPmxvX2xzbS0+bHNtX29pbmZvW2lkeF07CiAJQ0RFQlVHKERfSU5PREUsIERGSUQiQCVwWyVkXSAtPiAiREZJRCJAJXA6IG9zdGlkOiAiRE9TVElECkBAIC0xNTMsOCArMTUyLDEyIEBACiAJICAgICAgIFBGSUQoJmhkci0+Y29oX2x1LmxvaF9maWQpLCBoZHIsIFBPU1RJRCgmb2luZm8tPmxvaV9vaSksCiAJICAgICAgIG9pbmZvLT5sb2lfb3N0X2lkeCwgb2luZm8tPmxvaV9vc3RfZ2VuKTsKIAorCS8qIHJldXNlIC0+Y29oX2F0dHJfZ3VhcmQgdG8gcHJvdGVjdCBjb2hfcGFyZW50IGNoYW5nZSAqLworCXNwaW5fbG9jaygmc3ViaGRyLT5jb2hfYXR0cl9ndWFyZCk7CisJcGFyZW50ID0gc3ViaGRyLT5jb2hfcGFyZW50OwogCWlmIChwYXJlbnQgPT0gTlVMTCkgewogCQlzdWJoZHItPmNvaF9wYXJlbnQgPSBoZHI7CisJCXNwaW5fdW5sb2NrKCZzdWJoZHItPmNvaF9hdHRyX2d1YXJkKTsKIAkJc3ViaGRyLT5jb2hfbmVzdGluZyA9IGhkci0+Y29oX25lc3RpbmcgKyAxOwogCQlsdV9vYmplY3RfcmVmX2FkZCgmc3RyaXBlLT5jb19sdSwgImxvdi1wYXJlbnQiLCBsb3YpOwogCQlyMC0+bG9fc3ViW2lkeF0gPSBjbDJsb3ZzdWIoc3RyaXBlKTsKQEAgLTE2Niw2ICsxNjksNyBAQAogCQlzdHJ1Y3QgbG92X29iamVjdCAqb2xkX2xvdjsKIAkJdW5zaWduZWQgaW50IG1hc2sgPSBEX0lOT0RFOwogCisJCXNwaW5fdW5sb2NrKCZzdWJoZHItPmNvaF9hdHRyX2d1YXJkKTsKIAkJb2xkX29iaiA9IGx1X29iamVjdF9sb2NhdGUoJnBhcmVudC0+Y29oX2x1LCAmbG92X2RldmljZV90eXBlKTsKIAkJTEFTU0VSVChvbGRfb2JqICE9IE5VTEwpOwogCQlvbGRfbG92ID0gY2wybG92KGx1MmNsKG9sZF9vYmopKTsKQEAgLTMwNiw3ICszMTAsNyBAQAogCSAqIC0+bG9fc3ViW10gc2xvdCBpbiBsb3ZzdWJfb2JqZWN0X2ZpbmkoKSAqLwogCWlmIChyMC0+bG9fc3ViW2lkeF0gPT0gbG9zKSB7CiAJCXdhaXRlciA9ICZsb3ZfZW52X2luZm8oZW52KS0+bHRpX3dhaXRlcjsKLQkJaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCh3YWl0ZXIpOworCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSh3YWl0ZXIsIGN1cnJlbnQpOwogCQlhZGRfd2FpdF9xdWV1ZSgmYmt0LT5sc2JfbWFyY2hlX2Z1bmVicmUsIHdhaXRlcik7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJd2hpbGUgKDEpIHsKQEAgLTMxNiw3ICszMjAsNyBAQAogCQkJc3Bpbl9sb2NrKCZyMC0+bG9fc3ViX2xvY2spOwogCQkJaWYgKHIwLT5sb19zdWJbaWR4XSA9PSBsb3MpIHsKIAkJCQlzcGluX3VubG9jaygmcjAtPmxvX3N1Yl9sb2NrKTsKLQkJCQl3YWl0cV93YWl0KHdhaXRlciwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlKCk7CiAJCQl9IGVsc2UgewogCQkJCXNwaW5fdW5sb2NrKCZyMC0+bG9fc3ViX2xvY2spOwogCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CkBAIC01MDgsNyArNTEyLDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1jb25zdCBzdGF0aWMgc3RydWN0IGxvdl9sYXlvdXRfb3BlcmF0aW9ucyBsb3ZfZGlzcGF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbG92X2xheW91dF9vcGVyYXRpb25zIGxvdl9kaXNwYXRjaFtdID0gewogCVtMTFRfRU1QVFldID0gewogCQkubGxvX2luaXQgICAgICA9IGxvdl9pbml0X2VtcHR5LAogCQkubGxvX2RlbGV0ZSAgICA9IGxvdl9kZWxldGVfZW1wdHksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jCmluZGV4IDI3ZWQyN2UuLjc0MjAwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jCkBAIC0zMzksNyArMzM5LDggQEAKIAogCSpsc21wID0gTlVMTDsKIAlMQVNTRVJUKGF0b21pY19yZWFkKCZsc20tPmxzbV9yZWZjKSA+IDApOwotCWlmICgocmVmYyA9IGF0b21pY19kZWNfcmV0dXJuKCZsc20tPmxzbV9yZWZjKSkgPT0gMCkgeworCXJlZmMgPSBhdG9taWNfZGVjX3JldHVybigmbHNtLT5sc21fcmVmYyk7CisJaWYgKHJlZmMgPT0gMCkgewogCQlMQVNTRVJUKGxzbV9vcF9maW5kKGxzbS0+bHNtX21hZ2ljKSAhPSBOVUxMKTsKIAkJbHNtX29wX2ZpbmQobHNtLT5sc21fbWFnaWMpLT5sc21fZnJlZShsc20pOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKaW5kZXggY2E4MWNhYy4uYTU0ODFkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlhdG9taWNfc2V0KCZzZXQtPnNldF9jb21wbGV0ZXMsIDApOwogCWF0b21pY19zZXQoJnNldC0+c2V0X3N1Y2Nlc3MsIDApOwogCWF0b21pY19zZXQoJnNldC0+c2V0X2ZpbmlzaF9jaGVja2VkLCAwKTsKLQlzZXQtPnNldF9jb29raWVzID0gMDsKKwlzZXQtPnNldF9jb29raWVzID0gTlVMTDsKIAlJTklUX0xJU1RfSEVBRCgmc2V0LT5zZXRfbGlzdCk7CiAJYXRvbWljX3NldCgmc2V0LT5zZXRfcmVmY291bnQsIDEpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNldC0+c2V0X3dhaXRxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92c3ViX2Rldi5jCmluZGV4IDk5OGVhMWMuLjkyNmMzNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9kZXYuYwpAQCAtMTMxLDYgKzEzMSwxMCBAQAogCXN0cnVjdCBsb3ZzdWJfZGV2aWNlICpsc2QgID0gbHUybG92c3ViX2RldihkKTsKIAlzdHJ1Y3QgbHVfZGV2aWNlICAgICAqbmV4dCA9IGNsMmx1X2Rldihsc2QtPmFjaWRfbmV4dCk7CiAKKwlpZiAoYXRvbWljX3JlYWQoJmQtPmxkX3JlZikgJiYgZC0+bGRfc2l0ZSkgeworCQlMSUJDRlNfREVCVUdfTVNHX0RBVEFfREVDTChtc2dkYXRhLCBEX0VSUk9SLCBOVUxMKTsKKwkJbHVfc2l0ZV9wcmludChlbnYsIGQtPmxkX3NpdGUsICZtc2dkYXRhLCBsdV9jZGVidWdfcHJpbnRlcik7CisJfQogCWNsX2RldmljZV9maW5pKGx1MmNsX2RldihkKSk7CiAJT0JEX0ZSRUVfUFRSKGxzZCk7CiAJcmV0dXJuIG5leHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sdmZzL2x2ZnNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2x2ZnMvbHZmc19saW51eC5jCmluZGV4IDQyOGZmZDguLmU0NGI3YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2x2ZnMvbHZmc19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2x2ZnMvbHZmc19saW51eC5jCkBAIC01NSw3ICs1NSw3IEBACiAKIHN0cnVjdCBscHJvY2ZzX3N0YXRzICpvYmRfbWVtb3J5ID0gTlVMTDsKIEVYUE9SVF9TWU1CT0wob2JkX21lbW9yeSk7Ci0vKiByZWZpbmUgbGF0ZXIgYW5kIGNoYW5nZSB0byBzZXFsb2NrIG9yIHNpbWxhciBmcm9tIGxpYmNmcyAqLworLyogcmVmaW5lIGxhdGVyIGFuZCBjaGFuZ2UgdG8gc2VxbG9jayBvciBzaW1pbGFyIGZyb20gbGliY2ZzICovCiAKIC8qIERlYnVnZ2luZyBjaGVjayBvbmx5IG5lZWRlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgKi8KICNpZmRlZiBPQkRfQ1RYVF9ERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19pbnRlcm5hbC5oCmluZGV4IDUwNjk4MjkuLmM3OGJmMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmgKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsCiAJCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcSwgX191NjQgZXh0cmFfbG9ja19mbGFncyk7CiAKLWludCBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbHVfZmlkICpmaWQsCitpbnQgbWRjX3Jlc291cmNlX2dldF91bnVzZWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAogCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmNhbmNlbHMsIGxkbG1fbW9kZV90IG1vZGUsCiAJCQkgICAgX191NjQgYml0cyk7CiAvKiBtZGMvbWRjX3JlcXVlc3QuYyAqLwpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIGludCBtZGNfc2V0X29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2gsCi0JCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqb3Blbl9yZXEpOworCQkJICAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpOwogCiBpbnQgbWRjX2NsZWFyX29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19saWIuYwppbmRleCA5MWY2ODc2Li41YjlmMzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCWlmIChmbGFncyAmIEZNT0RFX0VYRUMpCiAJCWNyX2ZsYWdzIHw9IE1EU19GTU9ERV9FWEVDOwogI2VuZGlmCi0JaWYgKGZsYWdzICYgT19MT1ZfREVMQVlfQ1JFQVRFKQorCWlmIChjbF9pc19sb3ZfZGVsYXlfY3JlYXRlKGZsYWdzKSkKIAkJY3JfZmxhZ3MgfD0gTURTX09QRU5fREVMQVlfQ1JFQVRFOwogCiAJaWYgKGZsYWdzICYgT19OT05CTE9DSykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbG9ja3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbG9ja3MuYwppbmRleCA4YWE3YzgwLi41MzAyMmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jCkBAIC0zNywxNSArMzcsMTUgQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTURDCiAKICMgaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jIGluY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSMgaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogCi0jaW5jbHVkZSA8bHVzdHJlX2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L2x1c3RyZV9pbnRlbnQuaD4KKyNpbmNsdWRlIDxvYmQuaD4KICNpbmNsdWRlIDxvYmRfY2xhc3MuaD4KICNpbmNsdWRlIDxsdXN0cmVfZGxtLmg+Ci0vKiBmaWRfcmVzX25hbWVfZXEoKSAqLwotI2luY2x1ZGUgPGx1c3RyZV9maWQuaD4KLSNpbmNsdWRlIDxscHJvY2ZzX3N0YXR1cy5oPgorI2luY2x1ZGUgPGx1c3RyZV9maWQuaD4gLyogZmlkX3Jlc19uYW1lX2VxKCkgKi8KKyNpbmNsdWRlIDxsdXN0cmVfbWRjLmg+CisjaW5jbHVkZSA8bHVzdHJlX25ldC5oPgorI2luY2x1ZGUgPGx1c3RyZV9yZXFfbGF5b3V0Lmg+CiAjaW5jbHVkZSAibWRjX2ludGVybmFsLmgiCiAKIHN0cnVjdCBtZGNfZ2V0YXR0cl9hcmdzIHsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2s7CiAJc3RydWN0IGlub2RlICpuZXdfaW5vZGUgPSBkYXRhOwogCi0JaWYoYml0cykKKwlpZiAoYml0cykKIAkJKmJpdHMgPSAwOwogCiAJaWYgKCEqbG9ja2gpCkBAIC0xNjAsNiArMTYwLDggQEAKIAlsZGxtX21vZGVfdCByYzsKIAogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoZmlkLCAmcmVzX2lkKTsKKwkvKiBMVS00NDA1OiBDbGVhciBiaXRzIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyICovCisJcG9saWN5LT5sX2lub2RlYml0cy5iaXRzICY9IGV4cF9jb25uZWN0X2liaXRzKGV4cCk7CiAJcmMgPSBsZGxtX2xvY2tfbWF0Y2goY2xhc3NfZXhwMm9iZChleHApLT5vYmRfbmFtZXNwYWNlLCBmbGFncywKIAkJCSAgICAgJnJlc19pZCwgdHlwZSwgcG9saWN5LCBtb2RlLCBsb2NraCwgMCk7CiAJcmV0dXJuIHJjOwpAQCAtMTk0LDcgKzE5Niw3IEBACiAJZmlkX2J1aWxkX3JlZ19yZXNfbmFtZShmaWQsICZyZXNfaWQpOwogCiAJcmVzID0gbGRsbV9yZXNvdXJjZV9nZXQobnMsIE5VTEwsICZyZXNfaWQsIDAsIDApOwotCWlmKHJlcyA9PSBOVUxMKQorCWlmIChyZXMgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAlsb2NrX3JlcyhyZXMpOwpAQCAtMzM0LDkgKzMzNiw5IEBACiAJCQkgICAgIG1heChsbW1zaXplLCBvYmRkZXYtPnUuY2xpLmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZSkpOwogCiAJcmMgPSBsZGxtX3ByZXBfZW5xdWV1ZV9yZXEoZXhwLCByZXEsICZjYW5jZWxzLCBjb3VudCk7Ci0JaWYgKHJjKSB7CisJaWYgKHJjIDwgMCkgewogCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUihyYyk7CiAJfQogCiAJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwpAQCAtMzc4LDEzICszODAsNiBAQAogCiAJbWRjX3NldF9jYXBhX3NpemUocmVxLCAmUk1GX0NBUEExLCBvcF9kYXRhLT5vcF9jYXBhMSk7CiAKLQlpZiAoaXQtPml0X29wID09IElUX1NFVFhBVFRSKQotCQkvKiBJZiB3ZSB3YW50IHRvIHVwZ3JhZGUgdG8gTENLX1BXLCBsZXQncyBjYW5jZWwgTENLX1BSCi0JCSAqIGxvY2tzIG5vdy4gVGhpcyBhdm9pZHMgdW5uZWNlc3NhcnkgQVNUcy4gKi8KLQkJY291bnQgPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQxLAotCQkJCQkJJmNhbmNlbHMsIExDS19QVywKLQkJCQkJCU1EU19JTk9ERUxPQ0tfWEFUVFIpOwotCiAJcmMgPSBsZGxtX3ByZXBfZW5xdWV1ZV9yZXEoZXhwLCByZXEsICZjYW5jZWxzLCBjb3VudCk7CiAJaWYgKHJjKSB7CiAJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKQEAgLTY0Niw3ICs2NDEsNyBAQAogCQkJICogaGFwcGVucyBpbW1lZGlhdGVseSBhZnRlciBzd2FiYmluZyBiZWxvdywgbmV3IHJlcGx5CiAJCQkgKiBpcyBzd2FiYmVkIGJ5IHRoYXQgaGFuZGxlciBjb3JyZWN0bHkuCiAJCQkgKi8KLQkJCW1kY19zZXRfb3Blbl9yZXBsYXlfZGF0YShOVUxMLCBOVUxMLCByZXEpOworCQkJbWRjX3NldF9vcGVuX3JlcGxheV9kYXRhKE5VTEwsIE5VTEwsIGl0KTsKIAkJfQogCiAJCWlmICgoYm9keS0+dmFsaWQgJiAoT0JEX01EX0ZMRElSRUEgfCBPQkRfTURfRkxFQVNJWkUpKSAhPSAwKSB7CkBAIC03NTgsNiArNzUzLDcgQEAKIAkJLyogaW5zdGFsbCBsdmJfZGF0YSAqLwogCQlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAkJaWYgKGxvY2stPmxfbHZiX2RhdGEgPT0gTlVMTCkgeworCQkJbG9jay0+bF9sdmJfdHlwZSA9IExWQl9UX0xBWU9VVDsKIAkJCWxvY2stPmxfbHZiX2RhdGEgPSBsbW07CiAJCQlsb2NrLT5sX2x2Yl9sZW4gPSBsdmJfbGVuOwogCQkJbG1tID0gTlVMTDsKQEAgLTg0Miw3ICs4MzgsNyBAQAogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCQlyZXEgPSBtZGNfaW50ZW50X2xheW91dF9wYWNrKGV4cCwgaXQsIG9wX2RhdGEpOwogCQlsdmJfdHlwZSA9IExWQl9UX0xBWU9VVDsKLQl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIChJVF9HRVRYQVRUUiB8IElUX1NFVFhBVFRSKSkgeworCX0gZWxzZSBpZiAoaXQtPml0X29wICYgSVRfR0VUWEFUVFIpIHsKIAkJcmVxID0gbWRjX2ludGVudF9nZXR4YXR0cl9wYWNrKGV4cCwgaXQsIG9wX2RhdGEpOwogCX0gZWxzZSB7CiAJCUxCVUcoKTsKQEAgLTg4MCw3ICs4NzYsNyBAQAogCXJjID0gbGRsbV9jbGlfZW5xdWV1ZShleHAsICZyZXEsIGVpbmZvLCAmcmVzX2lkLCBwb2xpY3ksICZmbGFncywgTlVMTCwKIAkJCSAgICAgIDAsIGx2Yl90eXBlLCBsb2NraCwgMCk7CiAJaWYgKCFpdCkgewotCQkvKiBGb3IgZmxvY2sgcmVxdWVzdHMgd2UgaW1tZWRpYXRlbGx5IHJldHVybiB3aXRob3V0IGZ1cnRoZXIKKwkJLyogRm9yIGZsb2NrIHJlcXVlc3RzIHdlIGltbWVkaWF0ZWx5IHJldHVybiB3aXRob3V0IGZ1cnRoZXIKIAkJICAgZGVsYXkgYW5kIGxldCBjYWxsZXIgZGVhbCB3aXRoIHRoZSByZXN0LCBzaW5jZSByZXN0IG9mCiAJCSAgIHRoaXMgZnVuY3Rpb24gbWV0YWRhdGEgcHJvY2Vzc2luZyBtYWtlcyBubyBzZW5zZSBmb3IgZmxvY2sKIAkJICAgcmVxdWVzdHMgYW55d2F5LiBCdXQgaW4gY2FzZSBvZiBwcm9ibGVtIGR1cmluZyBjb21tcyB3aXRoCkBAIC05NzMsNyArOTY5LDYgQEAKIAlpZiAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpICYmCiAJICAgIGl0LT5pdF9jcmVhdGVfbW9kZSAmIE1fQ0hFQ0tfU1RBTEUgJiYKIAkgICAgaXQtPml0X29wICE9IElUX0dFVEFUVFIpIHsKLQkJaXRfc2V0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0VOUV9DT01QTEVURSk7CiAKIAkJLyogQWxzbzogZGlkIHdlIGZpbmQgdGhlIHNhbWUgaW5vZGU/ICovCiAJCS8qIHNldmVyIGNhbiByZXR1cm4gb25lIG9mIHR3byBmaWRzOgpAQCAtMTA2OCw3ICsxMDYzLDIzIEBACiAJCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoZmlkLCAmcmVzX2lkKTsKIAkJc3dpdGNoIChpdC0+aXRfb3ApIHsKIAkJY2FzZSBJVF9HRVRBVFRSOgotCQkJcG9saWN5LmxfaW5vZGViaXRzLmJpdHMgPSBNRFNfSU5PREVMT0NLX1VQREFURTsKKwkJCS8qIEZpbGUgYXR0cmlidXRlcyBhcmUgaGVsZCB1bmRlciBtdWx0aXBsZSBiaXRzOgorCQkJICogbmxpbmsgaXMgdW5kZXIgbG9va3VwIGxvY2ssIHNpemUgYW5kIHRpbWVzIGFyZQorCQkJICogdW5kZXIgVVBEQVRFIGxvY2sgYW5kIHJlY2VudGx5IHdlJ3ZlIGFsc28gZ290CisJCQkgKiBhIHNlcGFyYXRlIHBlcm1pc3Npb25zIGxvY2sgZm9yIG93bmVyL2dyb3VwL2FjbCB0aGF0CisJCQkgKiB3ZXJlIHByb3RlY3RlZCBieSBsb29rdXAgbG9jayBiZWZvcmUuCisJCQkgKiBHZXRhdHRyIG11c3QgcHJvdmlkZSBhbGwgb2YgdGhhdCBpbmZvcm1hdGlvbiwKKwkJCSAqIHNvIHdlIG5lZWQgdG8gZW5zdXJlIHdlIGhhdmUgYWxsIG9mIHRob3NlIGxvY2tzLgorCQkJICogVW5mb3J0dW5hdGVseSwgaWYgdGhlIGJpdHMgYXJlIHNwbGl0IGFjcm9zcyBtdWx0aXBsZQorCQkJICogbG9ja3MsIHRoZXJlJ3Mgbm8gZWFzeSB3YXkgdG8gbWF0Y2ggYWxsIG9mIHRoZW0gaGVyZSwKKwkJCSAqIHNvIGFuIGV4dHJhIFJQQyB3b3VsZCBiZSBwZXJmb3JtZWQgdG8gZmV0Y2ggYWxsCisJCQkgKiBvZiB0aG9zZSBiaXRzIGF0IG9uY2UgZm9yIG5vdy4gKi8KKwkJCS8qIEZvciBuZXcgTURUcyg+IDIuNCksIFVQREFURXxQRVJNIHNob3VsZCBiZSBlbm91Z2gsCisJCQkgKiBidXQgZm9yIG9sZCBNRFRzICg8IDIuNCksIHBlcm1pc3Npb24gaXMgY292ZXJlZAorCQkJICogYnkgTE9PS1VQIGxvY2ssIHNvIGl0IG5lZWRzIHRvIG1hdGNoIGFsbCBiaXRzIGhlcmUuKi8KKwkJCXBvbGljeS5sX2lub2RlYml0cy5iaXRzID0gTURTX0lOT0RFTE9DS19VUERBVEUgfAorCQkJCQkJICBNRFNfSU5PREVMT0NLX0xPT0tVUCB8CisJCQkJCQkgIE1EU19JTk9ERUxPQ0tfUEVSTTsKIAkJCWJyZWFrOwogCQljYXNlIElUX0xBWU9VVDoKIAkJCXBvbGljeS5sX2lub2RlYml0cy5iaXRzID0gTURTX0lOT0RFTE9DS19MQVlPVVQ7CkBAIC0xMDc3LDEwICsxMDg4LDExIEBACiAJCQlwb2xpY3kubF9pbm9kZWJpdHMuYml0cyA9IE1EU19JTk9ERUxPQ0tfTE9PS1VQOwogCQkJYnJlYWs7CiAJCX0KLQkJbW9kZSA9IGxkbG1fbG9ja19tYXRjaChleHAtPmV4cF9vYmQtPm9iZF9uYW1lc3BhY2UsCi0JCQkJICAgICAgIExETE1fRkxfQkxPQ0tfR1JBTlRFRCwgJnJlc19pZCwKKworCQltb2RlID0gbWRjX2xvY2tfbWF0Y2goZXhwLCBMRExNX0ZMX0JMT0NLX0dSQU5URUQsIGZpZCwKIAkJCQkgICAgICAgTERMTV9JQklUUywgJnBvbGljeSwKLQkJCQkgICAgICAgTENLX0NSfExDS19DV3xMQ0tfUFJ8TENLX1BXLCAmbG9ja2gsIDApOworCQkJCSAgICAgIExDS19DUiB8IExDS19DVyB8IExDS19QUiB8IExDS19QVywKKwkJCQkgICAgICAmbG9ja2gpOwogCX0KIAogCWlmIChtb2RlKSB7CkBAIC0xMTI3LDYgKzExMzksMTIgQEAKIAkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogeworCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsKKwkJLmVpX3R5cGUJPSBMRExNX0lCSVRTLAorCQkuZWlfbW9kZQk9IGl0X3RvX2xvY2tfbW9kZShpdCksCisJCS5laV9jYl9ibAk9IGNiX2Jsb2NraW5nLAorCQkuZWlfY2JfY3AJPSBsZGxtX2NvbXBsZXRpb25fYXN0LAorCX07CiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja2g7CiAJaW50IHJjID0gMDsKIApAQCAtMTE1Miw0MiArMTE3MCwxOSBAQAogCQkJcmV0dXJuIHJjOwogCX0KIAotCS8qIGxvb2t1cF9pdCBtYXkgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgcmV2YWxpZGF0ZV9pdCBoYXMgcnVuLCBiZWNhdXNlCi0JICogcmV2YWxpZGF0ZV9pdCBjYW5ub3QgcmV0dXJuIGVycm9ycywgb25seSB6ZXJvLiAgUmV0dXJuaW5nIHplcm8gY2F1c2VzCi0JICogdGhpcyBjYWxsIHRvIGxvb2t1cCwgd2hpY2ggKmNhbiogcmV0dXJuIGFuIGVycm9yLgotCSAqCi0JICogV2Ugb25seSB3YW50IHRvIGV4ZWN1dGUgdGhlIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlbnQgb25lCi0JICogdGltZSwgaG93ZXZlciwgc28gZG9uJ3Qgc2VuZCB0aGUgcmVxdWVzdCBhZ2Fpbi4gIEluc3RlYWQsIHNraXAgcGFzdAotCSAqIHRoaXMgYW5kIHVzZSB0aGUgcmVxdWVzdCBmcm9tIHJldmFsaWRhdGUuICBJbiB0aGlzIGNhc2UsIHJldmFsaWRhdGUKLQkgKiBuZXZlciBkcm9wcGVkIGl0cyByZWZlcmVuY2UsIHNvIHRoZSByZWZjb3VudHMgYXJlIGFsbCBPSyAqLwotCWlmICghaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfRU5RX0NPTVBMRVRFKSkgewotCQlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gZWluZm8gPSB7Ci0JCQkuZWlfdHlwZQk9IExETE1fSUJJVFMsCi0JCQkuZWlfbW9kZQk9IGl0X3RvX2xvY2tfbW9kZShpdCksCi0JCQkuZWlfY2JfYmwJPSBjYl9ibG9ja2luZywKLQkJCS5laV9jYl9jcAk9IGxkbG1fY29tcGxldGlvbl9hc3QsCi0JCX07Ci0KLQkJLyogRm9yIGNhc2UgaWYgdXBwZXIgbGF5ZXIgZGlkIG5vdCBhbGxvYyBmaWQsIGRvIGl0IG5vdy4gKi8KLQkJaWYgKCFmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgJiYgaXQtPml0X29wICYgSVRfQ1JFQVQpIHsKLQkJCXJjID0gbWRjX2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlDRVJST1IoIkNhbid0IGFsbG9jIG5ldyBmaWQsIHJjICVkXG4iLCByYyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JCXJjID0gbWRjX2VucXVldWUoZXhwLCAmZWluZm8sIGl0LCBvcF9kYXRhLCAmbG9ja2gsCi0JCQkJIGxtbSwgbG1tc2l6ZSwgTlVMTCwgZXh0cmFfbG9ja19mbGFncyk7Ci0JCWlmIChyYyA8IDApCisJLyogRm9yIGNhc2UgaWYgdXBwZXIgbGF5ZXIgZGlkIG5vdCBhbGxvYyBmaWQsIGRvIGl0IG5vdy4gKi8KKwlpZiAoIWZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSAmJiBpdC0+aXRfb3AgJiBJVF9DUkVBVCkgeworCQlyYyA9IG1kY19maWRfYWxsb2MoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CisJCWlmIChyYyA8IDApIHsKKwkJCUNFUlJPUigiQ2FuJ3QgYWxsb2MgbmV3IGZpZCwgcmMgJWRcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKLQl9IGVsc2UgaWYgKCFmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgfHwKLQkJICAgIShpdC0+aXRfY3JlYXRlX21vZGUgJiBNX0NIRUNLX1NUQUxFKSkgewotCQkvKiBESVNQX0VOUV9DT01QTEVURSBzZXQgbWVhbnMgdGhlcmUgaXMgZXh0cmEgcmVmZXJlbmNlIG9uCi0JCSAqIHJlcXVlc3QgcmVmZXJlbmNlZCBmcm9tIHRoaXMgaW50ZW50LCBzYXZlZCBmb3Igc3Vic2VxdWVudAotCQkgKiBsb29rdXAuICBUaGlzIHBhdGggaXMgZXhlY3V0ZWQgd2hlbiB3ZSBwcm9jZWVkIHRvIHRoaXMKLQkJICogbG9va3VwLCBzbyB3ZSBjbGVhciBESVNQX0VOUV9DT01QTEVURSAqLwotCQlpdF9jbGVhcl9kaXNwb3NpdGlvbihpdCwgRElTUF9FTlFfQ09NUExFVEUpOworCQl9CiAJfQorCXJjID0gbWRjX2VucXVldWUoZXhwLCAmZWluZm8sIGl0LCBvcF9kYXRhLCAmbG9ja2gsIGxtbSwgbG1tc2l6ZSwgTlVMTCwKKwkJCSBleHRyYV9sb2NrX2ZsYWdzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKIAkqcmVxcCA9IGl0LT5kLmx1c3RyZS5pdF9kYXRhOwogCXJjID0gbWRjX2ZpbmlzaF9pbnRlbnRfbG9jayhleHAsICpyZXFwLCBvcF9kYXRhLCBpdCwgJmxvY2toKTsKIAlyZXR1cm4gcmM7CkBAIC0xMjY5LDggKzEyNjQsOCBAQAogCiAJZmlkX2J1aWxkX3JlZ19yZXNfbmFtZSgmb3BfZGF0YS0+b3BfZmlkMSwgJnJlc19pZCk7CiAJcmVxID0gbWRjX2ludGVudF9nZXRhdHRyX3BhY2soZXhwLCBpdCwgb3BfZGF0YSk7Ci0JaWYgKCFyZXEpCi0JCXJldHVybiAtRU5PTUVNOworCWlmIChJU19FUlIocmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVxKTsKIAogCXJjID0gbWRjX2VudGVyX3JlcXVlc3QoJm9iZGRldi0+dS5jbGkpOwogCWlmIChyYyAhPSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlaW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlaW50LmMKaW5kZXggOWYzYTM0NS4uZDc5YWExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYwpAQCAtNjYsNyArNjYsNyBAQAogLyogRmluZCBhbmQgY2FuY2VsIGxvY2FsbHkgbG9ja3MgbWF0Y2hlZCBieSBpbm9kZSBAYml0cyAmIEBtb2RlIGluIHRoZSByZXNvdXJjZQogICogZm91bmQgYnkgQGZpZC4gRm91bmQgbG9ja3MgYXJlIGFkZGVkIGludG8gQGNhbmNlbCBsaXN0LiBSZXR1cm5zIHRoZSBhbW91bnQgb2YKICAqIGxvY2tzIGFkZGVkIHRvIEBjYW5jZWxzIGxpc3QuICovCi1pbnQgbWRjX3Jlc291cmNlX2dldF91bnVzZWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAoraW50IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKIAkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpjYW5jZWxzLCBsZGxtX21vZGVfdCBtb2RlLAogCQkJICAgIF9fdTY0IGJpdHMpCiB7CkBAIC0xNjUsNiArMTY1LDcgQEAKIAkJCXJlcS0+cnFfY2JfZGF0YSA9ICptb2Q7CiAJCQkoKm1vZCktPm1vZF9vcGVuX3JlcSA9IHJlcTsKIAkJCXJlcS0+cnFfY29tbWl0X2NiID0gbWRjX2NvbW1pdF9vcGVuOworCQkJKCptb2QpLT5tb2RfaXNfY3JlYXRlID0gdHJ1ZTsKIAkJCS8qKgogCQkJICogVGFrZSBhbiBleHRyYSByZWZlcmVuY2Ugb24gXHZhciBtb2QsIGl0IHByb3RlY3RzIFx2YXIKIAkJCSAqIG1vZCBmcm9tIGJlaW5nIGZyZWVkIG9uIGV2aWN0aW9uIChjb21taXQgY2FsbGJhY2sgaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKaW5kZXggODMwMTM5Mi4uYmRlOWY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKQEAgLTM1NSwxMCArMzU1LDMyIEBACiAJCQkJICAgICBpbnB1dF9zaXplKTsKIAl9CiAKLQlyYyA9IHB0bHJwY19yZXF1ZXN0X3BhY2socmVxLCBMVVNUUkVfTURTX1ZFUlNJT04sIG9wY29kZSk7Ci0JaWYgKHJjKSB7Ci0JCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKLQkJcmV0dXJuIHJjOworCS8qIEZsdXNoIGxvY2FsIFhBVFRSIGxvY2tzIHRvIGdldCByaWQgb2YgYSBwb3NzaWJsZSBjYW5jZWwgUlBDICovCisJaWYgKG9wY29kZSA9PSBNRFNfUkVJTlQgJiYgZmlkX2lzX3NhbmUoZmlkKSAmJgorCSAgICBleHAtPmV4cF9jb25uZWN0X2RhdGEub2NkX2liaXRzX2tub3duICYgTURTX0lOT0RFTE9DS19YQVRUUikgeworCQlMSVNUX0hFQUQoY2FuY2Vscyk7CisJCWludCBjb3VudDsKKworCQkvKiBXaXRob3V0IHRoYXQgcGFja2luZyB3b3VsZCBmYWlsICovCisJCWlmIChpbnB1dF9zaXplID09IDApCisJCQlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX0VBREFUQSwKKwkJCQkJICAgICBSQ0xfQ0xJRU5ULCAwKTsKKworCQljb3VudCA9IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKGV4cCwgZmlkLAorCQkJCQkJJmNhbmNlbHMsIExDS19FWCwKKwkJCQkJCU1EU19JTk9ERUxPQ0tfWEFUVFIpOworCisJCXJjID0gbWRjX3ByZXBfZWxjX3JlcShleHAsIHJlcSwgTURTX1JFSU5ULCAmY2FuY2VscywgY291bnQpOworCQlpZiAocmMpIHsKKwkJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZSB7CisJCXJjID0gcHRscnBjX3JlcXVlc3RfcGFjayhyZXEsIExVU1RSRV9NRFNfVkVSU0lPTiwgb3Bjb2RlKTsKKwkJaWYgKHJjKSB7CisJCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7CisJCQlyZXR1cm4gcmM7CisJCX0KIAl9CiAKIAlpZiAob3Bjb2RlID09IE1EU19SRUlOVCkgewpAQCAtNzAwLDExICs3MjIsMTIgQEAKIAogaW50IG1kY19zZXRfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJICAgICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCwKLQkJCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpvcGVuX3JlcSkKKwkJCSAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KQogewogCXN0cnVjdCBtZF9vcGVuX2RhdGEgICAqbW9kOwogCXN0cnVjdCBtZHRfcmVjX2NyZWF0ZSAqcmVjOwogCXN0cnVjdCBtZHRfYm9keSAgICAgICAqYm9keTsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKm9wZW5fcmVxID0gaXQtPmQubHVzdHJlLml0X2RhdGE7CiAJc3RydWN0IG9iZF9pbXBvcnQgICAgICppbXAgPSBvcGVuX3JlcS0+cnFfaW1wb3J0OwogCiAJaWYgKCFvcGVuX3JlcS0+cnFfcmVwbGF5KQpAQCAtNzM4LDYgKzc2MSw4IEBACiAJCXNwaW5fbG9jaygmb3Blbl9yZXEtPnJxX2xvY2spOwogCQlvY2gtPm9jaF9tb2QgPSBtb2Q7CiAJCW1vZC0+bW9kX29jaCA9IG9jaDsKKwkJbW9kLT5tb2RfaXNfY3JlYXRlID0gaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfT1BFTl9DUkVBVEUpIHx8CisJCQkJICAgICBpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9PUEVOX1NUUklQRSk7CiAJCW1vZC0+bW9kX29wZW5fcmVxID0gb3Blbl9yZXE7CiAJCW9wZW5fcmVxLT5ycV9jYl9kYXRhID0gbW9kOwogCQlvcGVuX3JlcS0+cnFfY29tbWl0X2NiID0gbWRjX2NvbW1pdF9vcGVuOwpAQCAtNzU4LDYgKzc4MywyMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtZGNfZnJlZV9vcGVuKHN0cnVjdCBtZF9vcGVuX2RhdGEgKm1vZCkKK3sKKwlpbnQgY29tbWl0dGVkID0gMDsKKworCWlmIChtb2QtPm1vZF9pc19jcmVhdGUgPT0gMCAmJgorCSAgICBpbXBfY29ubmVjdF9kaXNwX3N0cmlwZShtb2QtPm1vZF9vcGVuX3JlcS0+cnFfaW1wb3J0KSkKKwkJY29tbWl0dGVkID0gMTsKKworCUxBU1NFUlQobW9kLT5tb2Rfb3Blbl9yZXEtPnJxX3JlcGxheSA9PSAwKTsKKworCURFQlVHX1JFUShEX1JQQ1RSQUNFLCBtb2QtPm1vZF9vcGVuX3JlcSwgImZyZWUgb3BlbiByZXF1ZXN0XG4iKTsKKworCXB0bHJwY19yZXF1ZXN0X2NvbW1pdHRlZChtb2QtPm1vZF9vcGVuX3JlcSwgY29tbWl0dGVkKTsKKwlpZiAobW9kLT5tb2RfY2xvc2VfcmVxKQorCQlwdGxycGNfcmVxdWVzdF9jb21taXR0ZWQobW9kLT5tb2RfY2xvc2VfcmVxLCBjb21taXR0ZWQpOworfQorCiBpbnQgbWRjX2NsZWFyX29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgICBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCkKIHsKQEAgLTc3MSw2ICs4MTMsOCBAQAogCQlyZXR1cm4gMDsKIAogCUxBU1NFUlQobW9kICE9IExQX1BPSVNPTik7CisJTEFTU0VSVChtb2QtPm1vZF9vcGVuX3JlcSAhPSBOVUxMKTsKKwltZGNfZnJlZV9vcGVuKG1vZCk7CiAKIAltb2QtPm1vZF9vY2ggPSBOVUxMOwogCW9jaC0+b2NoX21vZCA9IE5VTEw7CkBAIC05NjksNiArMTAxMyw5IEBACiAJaWYgKG1vZCkgewogCQlpZiAocmMgIT0gMCkKIAkJCW1vZC0+bW9kX2Nsb3NlX3JlcSA9IE5VTEw7CisJCUxBU1NFUlQobW9kLT5tb2Rfb3Blbl9yZXEgIT0gTlVMTCk7CisJCW1kY19mcmVlX29wZW4obW9kKTsKKwogCQkvKiBTaW5jZSBub3csIG1vZCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHNldGF0dHIgcmVxIG9ubHksCiAJCSAqIHRodXMgRFcgcmVxIGRvZXMgbm90IGtlZXAgYSByZWZlcmVuY2Ugb24gbW9kIGFueW1vcmUuICovCiAJCW9iZF9tb2RfcHV0KG1vZCk7CkBAIC0xNTI3LDggKzE1NzQsOCBAQAogCXJjID0gbGxvZ19jYXRfcHJvY2VzcyhOVUxMLCBsbGgsIGNoYW5nZWxvZ19ra3VjX2NiLCBjcywgMCwgMCk7CiAKIAkvKiBTZW5kIEVPRiBubyBtYXR0ZXIgd2hhdCBvdXIgcmVzdWx0ICovCi0JaWYgKChrdWNoID0gY2hhbmdlbG9nX2t1Y19oZHIoY3MtPmNzX2J1Ziwgc2l6ZW9mKCprdWNoKSwKLQkJCQkgICAgICBjcy0+Y3NfZmxhZ3MpKSkgeworCWt1Y2ggPSBjaGFuZ2Vsb2dfa3VjX2hkcihjcy0+Y3NfYnVmLCBzaXplb2YoKmt1Y2gpLCBjcy0+Y3NfZmxhZ3MpOworCWlmIChrdWNoKSB7CiAJCWt1Y2gtPmt1Y19tc2d0eXBlID0gQ0xfRU9GOwogCQlsaWJjZnNfa2t1Y19tc2dfcHV0KGNzLT5jc19mcCwga3VjaCk7CiAJfQpAQCAtMTY1MCwxMSArMTY5NywxNiBAQAogCWlmIChyYykKIAkJQ0VSUk9SKCJwdGxycGNfcXVldWVfd2FpdCBmYWlsZWQsIHJjOiAlZFxuIiwgcmMpOwogCi0JaWYgKHJlcS0+cnFfcmVwbXNnICYmCi0JICAgIChvcWMgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT0JEX1FVT1RBQ1RMKSkpIHsKLQkJKm9xY3RsID0gKm9xYzsKKwlpZiAocmVxLT5ycV9yZXBtc2cpIHsKKwkJb3FjID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX09CRF9RVU9UQUNUTCk7CisJCWlmIChvcWMpIHsKKwkJCSpvcWN0bCA9ICpvcWM7CisJCX0gZWxzZSBpZiAoIXJjKSB7CisJCQlDRVJST1IgKCJDYW4ndCB1bnBhY2sgb2JkX3F1b3RhY3RsXG4iKTsKKwkJCXJjID0gLUVQUk9UTzsKKwkJfQogCX0gZWxzZSBpZiAoIXJjKSB7Ci0JCUNFUlJPUiAoIkNhbid0IHVucGFjayBvYmRfcXVvdGFjdGxcbiIpOworCQlDRVJST1IoIkNhbid0IHVucGFjayBvYmRfcXVvdGFjdGxcbiIpOwogCQlyYyA9IC1FUFJPVE87CiAJfQogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21nYy9tZ2NfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKaW5kZXggM2JkYmI5NC4uZGU5ZmIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKQEAgLTU2LDcgKzU2LDcgQEAKIHsKIAlfX3U2NCByZXNuYW1lID0gMDsKIAotCWlmIChsZW4gPiA4KSB7CisJaWYgKGxlbiA+IHNpemVvZihyZXNuYW1lKSkgewogCQlDRVJST1IoIm5hbWUgdG9vIGxvbmc6ICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNzYsNiArNzYsNyBAQAogCQlyZXNuYW1lID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBDT05GSUdfVF9SRUNPVkVSOgorCWNhc2UgQ09ORklHX1RfUEFSQU1TOgogCQlyZXNuYW1lID0gdHlwZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTEwMSwxMCArMTAyLDEzIEBACiAJaW50IGxlbjsKIAogCS8qIGxvZ25hbWUgY29uc2lzdHMgb2YgImZzbmFtZS1ub2RldHlwZSIuCi0JICogZS5nLiAibHVzdHJlLU1EVDAwMDEiLCAiU1VOLTAwMC1jbGllbnQiICovCisJICogZS5nLiAibHVzdHJlLU1EVDAwMDEiLCAiU1VOLTAwMC1jbGllbnQiCisJICogdGhlcmUgaXMgYW4gZXhjZXB0aW9uOiBsbG9nICJwYXJhbXMiICovCiAJbmFtZV9lbmQgPSBzdHJyY2hyKGxvZ25hbWUsICctJyk7Ci0JTEFTU0VSVChuYW1lX2VuZCk7Ci0JbGVuID0gbmFtZV9lbmQgLSBsb2duYW1lOworCWlmICghbmFtZV9lbmQpCisJCWxlbiA9IHN0cmxlbihsb2duYW1lKTsKKwllbHNlCisJCWxlbiA9IG5hbWVfZW5kIC0gbG9nbmFtZTsKIAlyZXR1cm4gbWdjX25hbWUycmVzaWQobG9nbmFtZSwgbGVuLCByZXNfaWQsIHR5cGUpOwogfQogCkBAIC0xNDAsNiArMTQ0LDggQEAKIAkJCWNvbmZpZ19sb2dfcHV0KGNsZC0+Y2xkX3JlY292ZXIpOwogCQlpZiAoY2xkLT5jbGRfc3B0bHJwYykKIAkJCWNvbmZpZ19sb2dfcHV0KGNsZC0+Y2xkX3NwdGxycGMpOworCQlpZiAoY2xkLT5jbGRfcGFyYW1zKQorCQkJY29uZmlnX2xvZ19wdXQoY2xkLT5jbGRfcGFyYW1zKTsKIAkJaWYgKGNsZF9pc19zcHRscnBjKGNsZCkpCiAJCQlzcHRscnBjX2NvbmZfbG9nX3N0b3AoY2xkLT5jbGRfbG9nbmFtZSk7CiAKQEAgLTI3MSw2ICsyNzcsMTkgQEAKIAlyZXR1cm4gY2xkOwogfQogCitzdGF0aWMgc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNvbmZpZ19wYXJhbXNfbG9nX2FkZChzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkLAorCXN0cnVjdCBjb25maWdfbGxvZ19pbnN0YW5jZSAqY2ZnLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBjb25maWdfbGxvZ19pbnN0YW5jZQlsY2ZnID0gKmNmZzsKKwlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YQkJKmNsZDsKKworCWxjZmcuY2ZnX2luc3RhbmNlID0gc2I7CisKKwljbGQgPSBkb19jb25maWdfbG9nX2FkZChvYmQsIFBBUkFNU19GSUxFTkFNRSwgQ09ORklHX1RfUEFSQU1TLAorCQkJCSZsY2ZnLCBzYik7CisKKwlyZXR1cm4gY2xkOworfQogCiAvKiogQWRkIHRoaXMgbG9nIHRvIHRoZSBsaXN0IG9mIGFjdGl2ZSBsb2dzIHdhdGNoZWQgYnkgYW4gTUdDLgogICogQWN0aXZlIG1lYW5zIHdlJ3JlIHdhdGNoaW5nIGZvciB1cGRhdGVzLgpAQCAtMjg0LDggKzMwMywxMCBAQAogCXN0cnVjdCBsdXN0cmVfc2JfaW5mbyAqbHNpID0gczJsc2koc2IpOwogCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpjbGQ7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKnNwdGxycGNfY2xkOwotCWNoYXIJCSAgICAgc2VjbG9nbmFtZVszMl07Ci0JY2hhcgkJICAgICpwdHI7CisJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKnBhcmFtc19jbGQ7CisJY2hhcgkJCXNlY2xvZ25hbWVbMzJdOworCWNoYXIJCQkqcHRyOworCWludAkJCXJjOwogCiAJQ0RFQlVHKERfTUdDLCAiYWRkaW5nIGNvbmZpZyBsb2cgJXM6JXBcbiIsIGxvZ25hbWUsIGNmZy0+Y2ZnX2luc3RhbmNlKTsKIApAQCAtMzA4LDMyICszMjksNDkgQEAKIAkJCQkJCUNPTkZJR19UX1NQVExSUEMsIE5VTEwsIE5VTEwpOwogCQlpZiAoSVNfRVJSKHNwdGxycGNfY2xkKSkgewogCQkJQ0VSUk9SKCJjYW4ndCBjcmVhdGUgc3B0bHJwYyBsb2c6ICVzXG4iLCBzZWNsb2duYW1lKTsKLQkJCXJldHVybiBQVFJfRVJSKHNwdGxycGNfY2xkKTsKKwkJCUdPVE8ob3V0X2VyciwgcmMgPSBQVFJfRVJSKHNwdGxycGNfY2xkKSk7CiAJCX0KIAl9CisJcGFyYW1zX2NsZCA9IGNvbmZpZ19wYXJhbXNfbG9nX2FkZChvYmQsIGNmZywgc2IpOworCWlmIChJU19FUlIocGFyYW1zX2NsZCkpIHsKKwkJcmMgPSBQVFJfRVJSKHBhcmFtc19jbGQpOworCQlDRVJST1IoIiVzOiBjYW4ndCBjcmVhdGUgcGFyYW1zIGxvZzogcmMgPSAlZFxuIiwKKwkJICAgICAgIG9iZC0+b2JkX25hbWUsIHJjKTsKKwkJR09UTyhvdXRfZXJyMSwgcmMpOworCX0KIAogCWNsZCA9IGRvX2NvbmZpZ19sb2dfYWRkKG9iZCwgbG9nbmFtZSwgQ09ORklHX1RfQ09ORklHLCBjZmcsIHNiKTsKIAlpZiAoSVNfRVJSKGNsZCkpIHsKIAkJQ0VSUk9SKCJjYW4ndCBjcmVhdGUgbG9nOiAlc1xuIiwgbG9nbmFtZSk7Ci0JCWNvbmZpZ19sb2dfcHV0KHNwdGxycGNfY2xkKTsKLQkJcmV0dXJuIFBUUl9FUlIoY2xkKTsKKwkJR09UTyhvdXRfZXJyMiwgcmMgPSBQVFJfRVJSKGNsZCkpOwogCX0KIAogCWNsZC0+Y2xkX3NwdGxycGMgPSBzcHRscnBjX2NsZDsKKwljbGQtPmNsZF9wYXJhbXMgPSBwYXJhbXNfY2xkOwogCiAJTEFTU0VSVChsc2ktPmxzaV9sbWQpOwogCWlmICghKGxzaS0+bHNpX2xtZC0+bG1kX2ZsYWdzICYgTE1EX0ZMR19OT0lSKSkgewogCQlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqcmVjb3Zlcl9jbGQ7CiAJCSpzdHJyY2hyKHNlY2xvZ25hbWUsICctJykgPSAwOwogCQlyZWNvdmVyX2NsZCA9IGNvbmZpZ19yZWNvdmVyX2xvZ19hZGQob2JkLCBzZWNsb2duYW1lLCBjZmcsIHNiKTsKLQkJaWYgKElTX0VSUihyZWNvdmVyX2NsZCkpIHsKLQkJCWNvbmZpZ19sb2dfcHV0KGNsZCk7Ci0JCQlyZXR1cm4gUFRSX0VSUihyZWNvdmVyX2NsZCk7Ci0JCX0KKwkJaWYgKElTX0VSUihyZWNvdmVyX2NsZCkpCisJCQlHT1RPKG91dF9lcnIzLCByYyA9IFBUUl9FUlIocmVjb3Zlcl9jbGQpKTsKIAkJY2xkLT5jbGRfcmVjb3ZlciA9IHJlY292ZXJfY2xkOwogCX0KIAogCXJldHVybiAwOworCitvdXRfZXJyMzoKKwljb25maWdfbG9nX3B1dChjbGQpOworCitvdXRfZXJyMjoKKwljb25maWdfbG9nX3B1dChwYXJhbXNfY2xkKTsKKworb3V0X2VycjE6CisJY29uZmlnX2xvZ19wdXQoc3B0bHJwY19jbGQpOworCitvdXRfZXJyOgorCXJldHVybiByYzsKIH0KIAogREVGSU5FX01VVEVYKGxsb2dfcHJvY2Vzc19sb2NrKTsKQEAgLTM0NCw2ICszODIsNyBAQAogewogCXN0cnVjdCBjb25maWdfbGxvZ19kYXRhICpjbGQ7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZF9zcHRscnBjID0gTlVMTDsKKwlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqY2xkX3BhcmFtcyA9IE5VTEw7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZF9yZWNvdmVyID0gTlVMTDsKIAlpbnQgcmMgPSAwOwogCkBAIC0zODIsMTEgKzQyMSwyMCBAQAogCXNwaW5fbG9jaygmY29uZmlnX2xpc3RfbG9jayk7CiAJY2xkX3NwdGxycGMgPSBjbGQtPmNsZF9zcHRscnBjOwogCWNsZC0+Y2xkX3NwdGxycGMgPSBOVUxMOworCWNsZF9wYXJhbXMgPSBjbGQtPmNsZF9wYXJhbXM7CisJY2xkLT5jbGRfcGFyYW1zID0gTlVMTDsKIAlzcGluX3VubG9jaygmY29uZmlnX2xpc3RfbG9jayk7CiAKIAlpZiAoY2xkX3NwdGxycGMpCiAJCWNvbmZpZ19sb2dfcHV0KGNsZF9zcHRscnBjKTsKIAorCWlmIChjbGRfcGFyYW1zKSB7CisJCW11dGV4X2xvY2soJmNsZF9wYXJhbXMtPmNsZF9sb2NrKTsKKwkJY2xkX3BhcmFtcy0+Y2xkX3N0b3BwaW5nID0gMTsKKwkJbXV0ZXhfdW5sb2NrKCZjbGRfcGFyYW1zLT5jbGRfbG9jayk7CisJCWNvbmZpZ19sb2dfcHV0KGNsZF9wYXJhbXMpOworCX0KKwogCS8qIGRyb3AgdGhlIHJlZiBmcm9tIHRoZSBmaW5kICovCiAJY29uZmlnX2xvZ19wdXQoY2xkKTsKIAkvKiBkcm9wIHRoZSBzdGFydCByZWYgKi8KQEAgLTE1ODQsNyArMTYzMiw3IEBACiAJLyoKIAkgKiAtIGNvcHkgaXQgdG8gYmFja3VwIHVzaW5nIGxsb2dfYmFja3VwKCkKIAkgKiAtIGNvcHkgcmVtb3RlIGxsb2cgdG8gbG9nbmFtZSB1c2luZyBsbG9nX2JhY2t1cCgpCi0JICogLSBpZiBmYWlsZWQgdGhlbiBtb3ZlIGJha3VwIHRvIGxvZ25hbWUgYWdhaW4KKwkgKiAtIGlmIGZhaWxlZCB0aGVuIG1vdmUgYmFja3VwIHRvIGxvZ25hbWUgYWdhaW4KIAkgKi8KIAogCU9CRF9BTExPQyh0ZW1wX2xvZywgc3RybGVuKGxvZ25hbWUpICsgMSk7CkBAIC0xNjY0LDcgKzE3MTIsNyBAQAogCQkJCUxDT05TT0xFX0VSUk9SX01TRygweDEzYSwKIAkJCQkJCSAgICJGYWlsZWQgdG8gZ2V0IE1HUyBsb2cgJXMgYW5kIG5vIGxvY2FsIGNvcHkuXG4iLAogCQkJCQkJICAgY2xkLT5jbGRfbG9nbmFtZSk7Ci0JCQkJR09UTyhvdXRfcG9wLCByYyA9IC1FTk9UQ09OTik7CisJCQkJR09UTyhvdXRfcG9wLCByYyA9IC1FTk9FTlQpOwogCQkJfQogCQkJQ0RFQlVHKERfTUdDLAogCQkJICAgICAgICJGYWlsZWQgdG8gZ2V0IE1HUyBsb2cgJXMsIHVzaW5nIGxvY2FsIGNvcHkgZm9yIG5vdywgd2lsbCB0cnkgdG8gdXBkYXRlIGxhdGVyLlxuIiwKQEAgLTE4NjMsNiArMTkxMSwyMCBAQAogCQkJaWYgKHJjKQogCQkJCUNFUlJPUigiQ2Fubm90IHByb2Nlc3MgcmVjb3ZlciBsbG9nICVkXG4iLCByYyk7CiAJCX0KKworCQlpZiAocmMgPT0gMCAmJiBjbGQtPmNsZF9wYXJhbXMgIT0gTlVMTCkgeworCQkJcmMgPSBtZ2NfcHJvY2Vzc19sb2cob2JkLCBjbGQtPmNsZF9wYXJhbXMpOworCQkJaWYgKHJjID09IC1FTk9FTlQpIHsKKwkJCQlDREVCVUcoRF9NR0MsCisJCQkJICAgICAgICJUaGVyZSBpcyBubyBwYXJhbXMgY29uZmlnIGZpbGUgeWV0XG4iKTsKKwkJCQlyYyA9IDA7CisJCQl9CisJCQkvKiBwYXJhbXMgbG9nIGlzIG9wdGlvbmFsICovCisJCQlpZiAocmMpCisJCQkJQ0VSUk9SKAorCQkJCSAgICAgICAiJXM6IGNhbid0IHByb2Nlc3MgcGFyYW1zIGxsb2c6IHJjID0gJWRcbiIsCisJCQkJICAgICAgIG9iZC0+b2JkX25hbWUsIHJjKTsKKwkJfQogCQljb25maWdfbG9nX3B1dChjbGQpOwogCiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2lvLmMKaW5kZXggZTA0ODUwMC4uM2JlYmM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jCkBAIC05NDIsNyArOTQyLDcgQEAKIAlzdHJ1Y3QgY2xfcGFnZSAqcGFnZTsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCUNFUlJPUigiQ2FuY2VsaW5nIG9uZ29pbmcgcGFnZSB0cmFzbWlzc2lvblxuIik7CisJQ0VSUk9SKCJDYW5jZWxpbmcgb25nb2luZyBwYWdlIHRyYW5zbWlzc2lvblxuIik7CiAJY2xfcGFnZV9saXN0X2Zvcl9lYWNoKHBhZ2UsIHF1ZXVlKSB7CiAJCWludCByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfbG9jay5jCmluZGV4IDc0OWViMDguLmQ3OTVjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9sb2NrLmMKQEAgLTkzMiw3ICs5MzIsNyBAQAogCQkgKiBMVS0zMDUgKi8KIAkJYmxvY2tlZCA9IGNmc19ibG9ja19zaWdzaW52KExVU1RSRV9GQVRBTF9TSUdTKTsKIAotCQlpbml0X3dhaXRxdWV1ZV9lbnRyeV9jdXJyZW50KCZ3YWl0ZXIpOworCQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdGVyLCBjdXJyZW50KTsKIAkJYWRkX3dhaXRfcXVldWUoJmxvY2stPmNsbF93cSwgJndhaXRlcik7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWNsX2xvY2tfbXV0ZXhfcHV0KGVudiwgbG9jayk7CkBAIC05NDMsNyArOTQzLDcgQEAKIAkJICogY2FuIGJlIHJlc3RhcnRlZCBpZiBzaWduYWxzIGFyZSBwZW5kaW5nIGhlcmUgKi8KIAkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOwogCQlpZiAobGlrZWx5KCFPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MT0NLX1NUQVRFX1dBSVRfSU5UUikpKSB7Ci0JCQl3YWl0cV93YWl0KCZ3YWl0ZXIsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZSgpOwogCQkJaWYgKCFjZnNfc2lnbmFsX3BlbmRpbmcoKSkKIAkJCQlyZXN1bHQgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCmluZGV4IDFhOTI2MDMuLjBmYzI1NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCkBAIC01MDgsNyArNTA4LDcgQEAKICAqIGFib3V0IGpvdXJuYWxfaW5mby4gQ3VycmVudGx5IGZvbGxvd2luZyBmaWVsZHMgaW4gdGFza19zdHJ1Y3QgYXJlIGlkZW50aWZpZWQKICAqIGNhbiBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2U6CiAgKiAgLSBjbF9lbnY6IGZvciBsaWJsdXN0cmUuCi0gKiAgLSB0dXhfaW5mbzogb255IG9uIFJlZEhhdCBrZXJuZWwuCisgKiAgLSB0dXhfaW5mbzogb25seSBvbiBSZWRIYXQga2VybmVsLgogICogIC0gLi4uCiAgKiBcbm90ZSBBcyBsb25nIGFzIHdlIHVzZSB0YXNrX3N0cnVjdCB0byBzdG9yZSBjbF9lbnYsIHdlIGFzc3VtZSB0aGF0IG9uY2UKICAqIGNhbGxlZCBpbnRvIEx1c3RyZSwgd2UnbGwgbmV2ZXIgY2FsbCBpbnRvIHRoZSBvdGhlciBwYXJ0IG9mIHRoZSBrZXJuZWwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZ2Vub3BzLmMKaW5kZXggZDlmNzUwZC4uZjJiZGVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZ2Vub3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZ2Vub3BzLmMKQEAgLTEwMTAsNiArMTAxMCw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJmltcC0+aW1wX3JlcGxheV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmaW1wLT5pbXBfc2VuZGluZ19saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmaW1wLT5pbXBfZGVsYXllZF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QpOworCWltcC0+aW1wX3JlcGxheV9jdXJzb3IgPSAmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3Q7CiAJc3Bpbl9sb2NrX2luaXQoJmltcC0+aW1wX2xvY2spOwogCWltcC0+aW1wX2xhc3Rfc3VjY2Vzc19jb25uID0gMDsKIAlpbXAtPmltcF9zdGF0ZSA9IExVU1RSRV9JTVBfTkVXOwpAQCAtMTUzMiw4ICsxNTM0LDggQEAKIAlzcGluX2xvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJm9iZC0+b2JkX3VubGlua2VkX2V4cG9ydHMpKSB7CiAJCXNwaW5fdW5sb2NrKCZvYmQtPm9iZF9kZXZfbG9jayk7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSwKLQkJCQkJCSAgIGNmc190aW1lX3NlY29uZHMod2FpdGVkKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChjZnNfdGltZV9zZWNvbmRzKHdhaXRlZCkpOwogCQlpZiAod2FpdGVkID4gNSAmJiBJU19QTzIod2FpdGVkKSkgewogCQkJTENPTlNPTEVfV0FSTigiJXMgaXMgd2FpdGluZyBmb3Igb2JkX3VubGlua2VkX2V4cG9ydHMgIgogCQkJCSAgICAgICJtb3JlIHRoYW4gJWQgc2Vjb25kcy4gIgpAQCAtMTYyNSw3ICsxNjI3LDcgQEAKIH0KIAogLyoqCi0gKiBBZGQgZXhwb3J0IHRvIHRoZSBvYmRfem9tYmUgdGhyZWFkIGFuZCBub3RpZnkgaXQuCisgKiBBZGQgZXhwb3J0IHRvIHRoZSBvYmRfem9tYmllIHRocmVhZCBhbmQgbm90aWZ5IGl0LgogICovCiBzdGF0aWMgdm9pZCBvYmRfem9tYmllX2V4cG9ydF9hZGQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCkgewogCXNwaW5fbG9jaygmZXhwLT5leHBfb2JkLT5vYmRfZGV2X2xvY2spOwpAQCAtMTY0MSw3ICsxNjQzLDcgQEAKIH0KIAogLyoqCi0gKiBBZGQgaW1wb3J0IHRvIHRoZSBvYmRfem9tYmUgdGhyZWFkIGFuZCBub3RpZnkgaXQuCisgKiBBZGQgaW1wb3J0IHRvIHRoZSBvYmRfem9tYmllIHRocmVhZCBhbmQgbm90aWZ5IGl0LgogICovCiBzdGF0aWMgdm9pZCBvYmRfem9tYmllX2ltcG9ydF9hZGQoc3RydWN0IG9iZF9pbXBvcnQgKmltcCkgewogCUxBU1NFUlQoaW1wLT5pbXBfc2VjID09IE5VTEwpOwpAQCAtMTY2MSw3ICsxNjYzLDcgQEAKIHN0YXRpYyB2b2lkIG9iZF96b21iaWVfaW1wZXhwX25vdGlmeSh2b2lkKQogewogCS8qCi0JICogTWFrZSBzdXJlIG9iZF96b21lYmllX2ltcGV4cF90aHJlYWQgZ2V0IHRoaXMgbm90aWZpY2F0aW9uLgorCSAqIE1ha2Ugc3VyZSBvYmRfem9tYmllX2ltcGV4cF90aHJlYWQgZ2V0IHRoaXMgbm90aWZpY2F0aW9uLgogCSAqIEl0IGlzIHBvc3NpYmxlIHRoaXMgc2lnbmFsIG9ubHkgZ2V0IGJ5IG9iZF96b21iaWVfYmFycmllciwgYW5kCiAJICogYmFycmllciBndWxwcyB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgc2xlZXBzIGF3YXkgYW5kIGhhbmdzIGVuc3VlcwogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1tb2R1bGUuYwppbmRleCAxMjFhODU2Li5iYTIwNzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1tb2R1bGUuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJaW50IGVyciA9IDA7CiAKIAkvKiBBbGxvdyBub24tcm9vdCBhY2Nlc3MgZm9yIE9CRF9JT0NfUElOR19UQVJHRVQgLSB1c2VkIGJ5IGxmcyBjaGVjayAqLwotCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pICYmIChjbWQgIT0gT0JEX0lPQ19QSU5HX1RBUkdFVCkpCisJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSAmJiAoY21kICE9IE9CRF9JT0NfUElOR19UQVJHRVQpKQogCQlyZXR1cm4gZXJyID0gLUVBQ0NFUzsKIAlpZiAoKGNtZCAmIDB4ZmZmZmZmMDApID09ICgoaW50KSdUJykgPDwgOCkgLyogaWdub3JlIGFsbCB0dHkgaW9jdGxzICovCiAJCXJldHVybiBlcnIgPSAtRU5PVFRZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKaW5kZXggYzBmM2FmNy4uMWQ5OTkzMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYwpAQCAtNTUxLDkgKzU1MSw4IEBACiAKIAlpZiAocmVjLT5scmhfaW5kZXggPCBkLT5scGRfc3RhcnRjYXQpCiAJCS8qIFNraXAgcHJvY2Vzc2luZyBvZiB0aGUgbG9ncyB1bnRpbCBzdGFydGNhdCAqLwotCQlyZXR1cm4gMDsKLQotCWlmIChkLT5scGRfc3RhcnRpZHggPiAwKSB7CisJCXJjID0gMDsKKwllbHNlIGlmIChkLT5scGRfc3RhcnRpZHggPiAwKSB7CiAJCXN0cnVjdCBsbG9nX3Byb2Nlc3NfY2F0X2RhdGEgY2Q7CiAKIAkJY2QubHBjZF9maXJzdF9pZHggPSBkLT5scGRfc3RhcnRpZHg7CkBAIC01NjYsNiArNTY1LDcgQEAKIAkJcmMgPSBsbG9nX3Byb2Nlc3Nfb3JfZm9yayhlbnYsIGxsaCwgZC0+bHBkX2NiLCBkLT5scGRfZGF0YSwKIAkJCQkJICBOVUxMLCBmYWxzZSk7CiAJfQorCiAJbGxvZ19oYW5kbGVfcHV0KGxsaCk7CiAKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2x2ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfbHZmcy5jCmluZGV4IDUzODVkOGUuLmQ4NmJiOGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2x2ZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2x2ZnMuYwpAQCAtMzc2LDcgKzM3Niw3IEBACiAKIC8qIHNldHM6CiAgKiAgLSBjdXJfb2Zmc2V0IHRvIHRoZSBmdXJ0aGVzdCBwb2ludCByZWFkIGluIHRoZSBsb2cgZmlsZQotICogIC0gY3VyX2lkeCB0byB0aGUgbG9nIGluZGV4IHByZWNlZWRpbmcgY3VyX29mZnNldAorICogIC0gY3VyX2lkeCB0byB0aGUgbG9nIGluZGV4IHByZWNlZGluZyBjdXJfb2Zmc2V0CiAgKiByZXR1cm5zIC1FSU8vLUVJTlZBTCBvbiBlcnJvcgogICovCiBzdGF0aWMgaW50IGxsb2dfbHZmc19uZXh0X2Jsb2NrKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfb3NkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29zZC5jCmluZGV4IDY1NGM4ZTEuLjY4MjI3OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfb3NkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vc2QuYwpAQCAtNTE0LDcgKzUxNCw3IEBACiAKIC8qIHNldHM6CiAgKiAgLSBjdXJfb2Zmc2V0IHRvIHRoZSBmdXJ0aGVzdCBwb2ludCByZWFkIGluIHRoZSBsb2cgZmlsZQotICogIC0gY3VyX2lkeCB0byB0aGUgbG9nIGluZGV4IHByZWNlZWRpbmcgY3VyX29mZnNldAorICogIC0gY3VyX2lkeCB0byB0aGUgbG9nIGluZGV4IHByZWNlZGluZyBjdXJfb2Zmc2V0CiAgKiByZXR1cm5zIC1FSU8vLUVJTlZBTCBvbiBlcnJvcgogICovCiBzdGF0aWMgaW50IGxsb2dfb3NkX25leHRfYmxvY2soY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApAQCAtMTA3Myw3ICsxMDczLDcgQEAKIAlMQVNTRVJUKGN0eHQpOwogCiAJLyogaW5pdGlhbGl6ZSBkYXRhIGFsbG93aW5nIHRvIGdlbmVyYXRlIG5ldyBmaWRzLAotCSAqIGxpdGVyYWxseSB3ZSBuZWVkIGEgc2VxdWVjZSAqLworCSAqIGxpdGVyYWxseSB3ZSBuZWVkIGEgc2VxdWVuY2UgKi8KIAlsZ2ktPmxnaV9maWQuZl9zZXEgPSBGSURfU0VRX0xMT0c7CiAJbGdpLT5sZ2lfZmlkLmZfb2lkID0gMTsKIAlsZ2ktPmxnaV9maWQuZl92ZXIgPSAwOwpAQCAtMTI4MCw3ICsxMjgwLDcgQEAKIAlsZ2ktPmxnaV9idWYubGJfbGVuID0gc2l6ZTsKIAlyYyA9IGR0X3JlY29yZF93cml0ZShlbnYsIG8sICZsZ2ktPmxnaV9idWYsICZsZ2ktPmxnaV9vZmYsIHRoKTsKIAlpZiAocmMpCi0JCUNERUJVRyhEX0lOT0RFLCAiZXJyb3Igd3JpdGVpbmcgQ0FUQUxPR1M6IHJjID0gJWRcbiIsIHJjKTsKKwkJQ0RFQlVHKERfSU5PREUsICJlcnJvciB3cml0aW5nIENBVEFMT0dTOiByYyA9ICVkXG4iLCByYyk7CiBvdXRfdHJhbnM6CiAJZHRfdHJhbnNfc3RvcChlbnYsIGQsIHRoKTsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xvY2FsX3N0b3JhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xvY2FsX3N0b3JhZ2UuYwppbmRleCBlNzllNGJlLi5lNzZmN2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sb2NhbF9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbG9jYWxfc3RvcmFnZS5jCkBAIC03MzcsNyArNzM3LDcgQEAKICAqIEFsbCBkeW5hbWljIGZpZHMgd2lsbCBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgc2FtZSBzZXF1ZW5jZSBhbmQgaW5jcmVtZW50ZWQKICAqIE9JRHMKICAqCi0gKiBSZXR1cm5lZCBsb2NhbF9vaWRfc3RvcmFnZSBpcyBpbi1tZW1vcnkgcmVwcmVzZW50YWlvbiBvZiBPSUQgc3RvcmFnZQorICogUmV0dXJuZWQgbG9jYWxfb2lkX3N0b3JhZ2UgaXMgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIE9JRCBzdG9yYWdlCiAgKi8KIGludCBsb2NhbF9vaWRfc3RvcmFnZV9pbml0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGR0X2RldmljZSAqZGV2LAogCQkJICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlyc3RfZmlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKaW5kZXggZWMzYjYwNS4uMTQzMmRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCkBAIC05OCw2ICs5OCw4IEBACiAJImxpZ2h0d2VpZ2h0X2Nvbm4iLAogCSJzaG9ydF9pbyIsCiAJInBpbmdsZXNzIiwKKwkiZmxvY2tfZGVhZGxvY2siLAorCSJkaXNwX3N0cmlwZSIsCiAJInVua25vd24iLAogCU5VTEwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdV9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCmluZGV4IDk4ODdkOGYuLjkyZThhMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCkBAIC01NzEsNyArNTcxLDcgQEAKIAkgKiBkcmFpbmVkKSwgYW5kIG1vcmVvdmVyLCBsb29rdXAgaGFzIHRvIHdhaXQgdW50aWwgb2JqZWN0IGlzIGZyZWVkLgogCSAqLwogCi0JaW5pdF93YWl0cXVldWVfZW50cnlfY3VycmVudCh3YWl0ZXIpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KHdhaXRlciwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoJmJrdC0+bHNiX21hcmNoZV9mdW5lYnJlLCB3YWl0ZXIpOwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAlscHJvY2ZzX2NvdW50ZXJfaW5jcihzLT5sc19zdGF0cywgTFVfU1NfQ0FDSEVfREVBVEhfUkFDRSk7CkBAIC03MTIsNyArNzEyLDcgQEAKIAkJICogbHVfb2JqZWN0X2ZpbmRfdHJ5KCkgYWxyZWFkeSBhZGRlZCB3YWl0ZXIgaW50byB0aGUKIAkJICogd2FpdCBxdWV1ZS4KIAkJICovCi0JCXdhaXRxX3dhaXQoJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKIAkJYmt0ID0gbHVfc2l0ZV9ia3RfZnJvbV9maWQoZGV2LT5sZF9zaXRlLCAodm9pZCAqKWYpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmYmt0LT5sc2JfbWFyY2hlX2Z1bmVicmUsICZ3YWl0KTsKIAl9CkBAIC04OTAsMTAgKzg5MCwxMCBAQAogCiAJaGFzaCA9IGZpZF9mbGF0dGVuMzIoZmlkKTsKIAloYXNoICs9IChoYXNoID4+IDQpICsgKGhhc2ggPDwgMTIpOyAvKiBtaXhpbmcgb2lkIGFuZCBzZXEgKi8KLQloYXNoID0gY2ZzX2hhc2hfbG9uZyhoYXNoLCBocy0+aHNfYmt0X2JpdHMpOworCWhhc2ggPSBoYXNoX2xvbmcoaGFzaCwgaHMtPmhzX2JrdF9iaXRzKTsKIAogCS8qIGdpdmUgbWUgYW5vdGhlciByYW5kb20gZmFjdG9yICovCi0JaGFzaCAtPSBjZnNfaGFzaF9sb25nKCh1bnNpZ25lZCBsb25nKWhzLCBmaWRfb2lkKGZpZCkgJSAxMSArIDMpOworCWhhc2ggLT0gaGFzaF9sb25nKCh1bnNpZ25lZCBsb25nKWhzLCBmaWRfb2lkKGZpZCkgJSAxMSArIDMpOwogCiAJaGFzaCA8PD0gaHMtPmhzX2N1cl9iaXRzIC0gaHMtPmhzX2JrdF9iaXRzOwogCWhhc2ggfD0gKGZpZF9zZXEoZmlkKSArIGZpZF9vaWQoZmlkKSkgJiAoQ0ZTX0hBU0hfTkJLVChocykgLSAxKTsKQEAgLTIxMDAsNyArMjEwMCw3IEBACiBFWFBPUlRfU1lNQk9MKGx1X29iamVjdF9hc3NpZ25fZmlkKTsKIAogLyoqCi0gKiBhbGxvY2F0ZXMgb2JqZWN0IHdpdGggMCAobm9uLWFzc2lnZWQpIGZpZAorICogYWxsb2NhdGVzIG9iamVjdCB3aXRoIDAgKG5vbi1hc3NpZ25lZCkgZmlkCiAgKiBYWFg6IHRlbXBvcmFyeSBzb2x1dGlvbiB0byBiZSBhYmxlIHRvIGFzc2lnbiBmaWQgaW4gLT5kb19jcmVhdGUoKQogICogICAgICB0aWxsIHdlIGhhdmUgZnVsbHktZnVuY3Rpb25hbCBPU1QgZmlkcwogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9tZF9hdHRycy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbWRfYXR0cnMuYwppbmRleCBmNzE4NzgyLi5mMDgwY2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9tZF9hdHRycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL21kX2F0dHJzLmMKQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogdm9pZCBsdXN0cmVfbG1hX3N3YWIoc3RydWN0IGx1c3RyZV9tZHRfYXR0cnMgKmxtYSkKIHsKLQkvKiBVc2UgTFVTVFJFX01TR19NQUdJQyB0byBkZXRlY3QgbG9jYWwgZW5kaWFuZXNzLiAqLworCS8qIFVzZSBMVVNUUkVfTVNHX01BR0lDIHRvIGRldGVjdCBsb2NhbCBlbmRpYW5uZXNzLiAqLwogCWlmIChMVVNUUkVfTVNHX01BR0lDICE9IGNwdV90b19sZTMyKExVU1RSRV9NU0dfTUFHSUMpKSB7CiAJCV9fc3dhYjMycygmbG1hLT5sbWFfY29tcGF0KTsKIAkJX19zd2FiMzJzKCZsbWEtPmxtYV9pbmNvbXBhdCk7CkBAIC03Nyw3ICs3Nyw3IEBACiAgKi8KIHZvaWQgbHVzdHJlX3NvbV9zd2FiKHN0cnVjdCBzb21fYXR0cnMgKmF0dHJzKQogewotCS8qIFVzZSBMVVNUUkVfTVNHX01BR0lDIHRvIGRldGVjdCBsb2NhbCBlbmRpYW5lc3MuICovCisJLyogVXNlIExVU1RSRV9NU0dfTUFHSUMgdG8gZGV0ZWN0IGxvY2FsIGVuZGlhbm5lc3MuICovCiAJaWYgKExVU1RSRV9NU0dfTUFHSUMgIT0gY3B1X3RvX2xlMzIoTFVTVFJFX01TR19NQUdJQykpIHsKIAkJX19zd2FiMzJzKCZhdHRycy0+c29tX2NvbXBhdCk7CiAJCV9fc3dhYjMycygmYXR0cnMtPnNvbV9pbmNvbXBhdCk7CkBAIC0xMzUsNyArMTM1LDcgQEAKICAqLwogdm9pZCBsdXN0cmVfaHNtX3N3YWIoc3RydWN0IGhzbV9hdHRycyAqYXR0cnMpCiB7Ci0JLyogVXNlIExVU1RSRV9NU0dfTUFHSUMgdG8gZGV0ZWN0IGxvY2FsIGVuZGlhbmVzcy4gKi8KKwkvKiBVc2UgTFVTVFJFX01TR19NQUdJQyB0byBkZXRlY3QgbG9jYWwgZW5kaWFubmVzcy4gKi8KIAlpZiAoTFVTVFJFX01TR19NQUdJQyAhPSBjcHVfdG9fbGUzMihMVVNUUkVfTVNHX01BR0lDKSkgewogCQlfX3N3YWIzMnMoJmF0dHJzLT5oc21fY29tcGF0KTsKIAkJX19zd2FiMzJzKCZhdHRycy0+aHNtX2ZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9jb25maWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9jb25maWcuYwppbmRleCAzNjJhZTU0Li4yZDU3Nzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jCkBAIC02MSw3ICs2MSw4IEBACiAJaWYgKCFidWYpCiAJCXJldHVybiAxOwogCi0JaWYgKChwdHIgPSBzdHJzdHIoYnVmLCBrZXkpKSA9PSBOVUxMKQorCXB0ciA9IHN0cnN0cihidWYsIGtleSk7CisJaWYgKHB0ciA9PSBOVUxMKQogCQlyZXR1cm4gMTsKIAogCWlmICh2YWxwKQpAQCAtNTkyLDcgKzU5Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsYXNzX2RldGFjaCk7CiAKLS8qKiBTdGFydCBzaHV0dGluZyBkb3duIHRoZSBvYmQuICBUaGVyZSBtYXkgYmUgaW4tcHJvZ2VzcyBvcHMgd2hlbgorLyoqIFN0YXJ0IHNodXR0aW5nIGRvd24gdGhlIG9iZC4gIFRoZXJlIG1heSBiZSBpbi1wcm9ncmVzcyBvcHMgd2hlbgogICogdGhpcyBpcyBjYWxsZWQuICBXZSB0ZWxsIHRoZW0gdG8gc3RhcnQgc2h1dHRpbmcgZG93biB3aXRoIGEgY2FsbAogICogdG8gY2xhc3NfZGlzY29ubmVjdF9leHBvcnRzKCkuCiAgKi8KQEAgLTY1NSw3ICs2NTYsNyBAQAogCS8qIFRoZSB0aHJlZSByZWZlcmVuY2VzIHRoYXQgc2hvdWxkIGJlIHJlbWFpbmluZyBhcmUgdGhlCiAJICogb2JkX3NlbGZfZXhwb3J0IGFuZCB0aGUgYXR0YWNoIGFuZCBzZXR1cCByZWZlcmVuY2VzLiAqLwogCWlmIChhdG9taWNfcmVhZCgmb2JkLT5vYmRfcmVmY291bnQpID4gMykgewotCQkvKiByZWZjb3VuZiAtIDMgbWlnaHQgYmUgdGhlIG51bWJlciBvZiByZWFsIGV4cG9ydHMKKwkJLyogcmVmY291bnQgLSAzIG1pZ2h0IGJlIHRoZSBudW1iZXIgb2YgcmVhbCBleHBvcnRzCiAJCSAgIChleGNsdWRpbmcgc2VsZiBleHBvcnQpLiBCdXQgY2xhc3NfaW5jcmVmIGlzIGNhbGxlZAogCQkgICBieSBvdGhlciB0aGluZ3MgYXMgd2VsbCwgc28gZG9uJ3QgY291bnQgb24gaXQuICovCiAJCUNERUJVRyhEX0lPQ1RMLCAiJXM6IGZvcmNpbmcgZXhwb3J0cyB0byBkaXNjb25uZWN0OiAlZFxuIiwKQEAgLTEwMjcsNiArMTAyOCw0NiBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfY2ZnX3JlbmFtZSk7CiAKK3N0YXRpYyBpbnQgcHJvY2Vzc19wYXJhbTJfY29uZmlnKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKQoreworCWNoYXIgKnBhcmFtID0gbHVzdHJlX2NmZ19zdHJpbmcobGNmZywgMSk7CisJY2hhciAqdXBjYWxsID0gbHVzdHJlX2NmZ19zdHJpbmcobGNmZywgMik7CisJY2hhciAqYXJndltdID0geworCQlbMF0gPSAiL3Vzci9zYmluL2xjdGwiLAorCQlbMV0gPSAic2V0X3BhcmFtIiwKKwkJWzJdID0gcGFyYW0sCisJCVszXSA9IE5VTEwKKwl9OworCXN0cnVjdCB0aW1ldmFsCXN0YXJ0OworCXN0cnVjdCB0aW1ldmFsCWVuZDsKKwlpbnQJCXJjOworCisKKwkvKiBBZGQgdXBjYWxsIHByb2Nlc3NpbmcgaGVyZS4gTm93IG9ubHkgbGN0bCBpcyBzdXBwb3J0ZWQgKi8KKwlpZiAoc3RyY21wKHVwY2FsbCwgTENUTF9VUENBTEwpICE9IDApIHsKKwkJQ0VSUk9SKCJVbnN1cHBvcnRlZCB1cGNhbGwgJXNcbiIsIHVwY2FsbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRvX2dldHRpbWVvZmRheSgmc3RhcnQpOworCXJjID0gVVNFUk1PREVIRUxQRVIoYXJndlswXSwgYXJndiwgTlVMTCk7CisJZG9fZ2V0dGltZW9mZGF5KCZlbmQpOworCisJaWYgKHJjIDwgMCkgeworCQlDRVJST1IoCisJCSAgICAgICAibGN0bDogZXJyb3IgaW52b2tpbmcgdXBjYWxsICVzICVzICVzOiByYyA9ICVkOyB0aW1lICVsZHVzXG4iLAorCQkgICAgICAgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSwgcmMsCisJCSAgICAgICBjZnNfdGltZXZhbF9zdWIoJmVuZCwgJnN0YXJ0LCBOVUxMKSk7CisJfSBlbHNlIHsKKwkJQ0RFQlVHKERfSEEsICJsY3RsOiBpbnZva2VkIHVwY2FsbCAlcyAlcyAlcywgdGltZSAlbGR1c1xuIiwKKwkJICAgICAgIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0sCisJCSAgICAgICBjZnNfdGltZXZhbF9zdWIoJmVuZCwgJnN0YXJ0LCBOVUxMKSk7CisJCSAgICAgICByYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCiB2b2lkIGx1c3RyZV9yZWdpc3Rlcl9xdW90YV9wcm9jZXNzX2NvbmZpZyhpbnQgKCpxcGMpKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKSkKIHsKIAlxdW90YV9wcm9jZXNzX2NvbmZpZyA9IHFwYzsKQEAgLTExNDIsMTEgKzExODMsMTQgQEAKIAkJCWVyciA9ICgqcXVvdGFfcHJvY2Vzc19jb25maWcpKGxjZmcpOwogCQkJR09UTyhvdXQsIGVycik7CiAJCX0KLQkJLyogRmFsbCB0aHJvdWdoICovCisKIAkJYnJlYWs7CiAJfQorCWNhc2UgTENGR19TRVRfUEFSQU06IHsKKwkJZXJyID0gcHJvY2Vzc19wYXJhbTJfY29uZmlnKGxjZmcpOworCQlHT1RPKG91dCwgMCk7CiAJfQotCisJfQogCS8qIENvbW1hbmRzIHRoYXQgcmVxdWlyZSBhIGRldmljZSAqLwogCW9iZCA9IGNsYXNzX25hbWUyb2JkKGx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIDApKTsKIAlpZiAob2JkID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKaW5kZXggYTY5YTYzMC4uNmY4YmE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKQEAgLTUwMSw3ICs1MDEsNyBAQAogCX0KIAogCS8qIFRoZSBNR0MgaGFzIG5vIHJlY292ZXJhYmxlIGRhdGEgaW4gYW55IGNhc2UuCi0JICogZm9yY2Ugc2hvdGRvd24gc2V0IGluIHVtb3VudF9iZWdpbiAqLworCSAqIGZvcmNlIHNodXRkb3duIHNldCBpbiB1bW91bnRfYmVnaW4gKi8KIAlvYmQtPm9iZF9ub19yZWNvdiA9IDE7CiAKIAlpZiAob2JkLT51LmNsaS5jbF9tZ2NfbWdzZXhwKSB7CkBAIC03NTQsNyArNzU0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2VydmVyX25hbWUyaW5kZXgpOwogCi0vKioqKioqKioqKioqKioqIG1vdW50IGNvbW1vbiBiZXR3ZWVlbiBzZXJ2ZXIgYW5kIGNsaWVudCAqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqIG1vdW50IGNvbW1vbiBiZXR3ZWVuIHNlcnZlciBhbmQgY2xpZW50ICoqKioqKioqKioqKioqKi8KIAogLyogQ29tbW9uIHVtb3VudCAqLwogaW50IGx1c3RyZV9jb21tb25fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRvLmMKaW5kZXggNzA5OTc2NC4uM2IxYjI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJfQogCWlmICggY29tcGFyZSAmIE9CRF9NRF9GTEdFTkVSICkKIAkJcmVzID0gKHJlcyB8fCAoZHN0LT5vX3BhcmVudF9vaWQgIT0gc3JjLT5vX3BhcmVudF9vaWQpKTsKLQkvKiBYWFggRG9uJ3Qga25vdyBpZiB0aHNlcyBzaG91bGQgYmUgaW5jbHVkZWQgaGVyZSAtIHdhc24ndCBwcmV2aW91c2x5CisJLyogWFhYIERvbid0IGtub3cgaWYgdGhlc2Ugc2hvdWxkIGJlIGluY2x1ZGVkIGhlcmUgLSB3YXNuJ3QgcHJldmlvdXNseQogCWlmICggY29tcGFyZSAmIE9CRF9NRF9GTElOTElORSApCiAJCXJlcyA9IChyZXMgfHwgbWVtY21wKGRzdC0+b19pbmxpbmUsIHNyYy0+b19pbmxpbmUpKTsKIAkqLwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCW9hLT5vX21vZGUgPSBhdHRyLT5pYV9tb2RlOwogCQlvYS0+b192YWxpZCB8PSBPQkRfTURfRkxUWVBFIHwgT0JEX01EX0ZMTU9ERTsKIAkJaWYgKCFpbl9ncm91cF9wKG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBvYS0+b19naWQpKSAmJgotCQkgICAgIWNmc19jYXBhYmxlKENGU19DQVBfRlNFVElEKSkKKwkJICAgICFjYXBhYmxlKENGU19DQVBfRlNFVElEKSkKIAkJCW9hLT5vX21vZGUgJj0gflNfSVNHSUQ7CiAJfQogCWlmIChpYV92YWxpZCAmIEFUVFJfVUlEKSB7CkBAIC0yODIsNyArMjgyLDcgQEAKIAkJYXR0ci0+aWFfbW9kZSA9IChhdHRyLT5pYV9tb2RlICYgU19JRk1UKXwob2EtPm9fbW9kZSAmIH5TX0lGTVQpOwogCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CiAJCWlmICghaW5fZ3JvdXBfcChtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgb2EtPm9fZ2lkKSkgJiYKLQkJICAgICFjZnNfY2FwYWJsZShDRlNfQ0FQX0ZTRVRJRCkpCisJCSAgICAhY2FwYWJsZShDRlNfQ0FQX0ZTRVRJRCkpCiAJCQlhdHRyLT5pYV9tb2RlICY9IH5TX0lTR0lEOwogCX0KIAlpZiAodmFsaWQgJiBPQkRfTURfRkxVSUQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNoby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvLmMKaW5kZXggZGViYjljZS4uOTZhODA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvLmMKQEAgLTYwNiw3ICs2MDYsOCBAQAogCiAJLyogWFhYIEJ1ZyAzNDEzOyB3YWl0IGZvciBhIGJpdCB0byBlbnN1cmUgdGhlIEJMIGNhbGxiYWNrIGhhcwogCSAqIGhhcHBlbmVkIGJlZm9yZSBjYWxsaW5nIGxkbG1fbmFtZXNwYWNlX2ZyZWUoKSAqLwotCXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSwgY2ZzX3RpbWVfc2Vjb25kcygxKSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoY2ZzX3RpbWVfc2Vjb25kcygxKSk7CiAKIAlsZGxtX25hbWVzcGFjZV9mcmVlKG9iZC0+b2JkX25hbWVzcGFjZSwgTlVMTCwgb2JkLT5vYmRfZm9yY2UpOwogCW9iZC0+b2JkX25hbWVzcGFjZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKaW5kZXggOWIyZGVhMi4uNzU0YWE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYwpAQCAtOTk3LDggKzk5Nyw4IEBACiAJCXNwaW5fdW5sb2NrKCZlYy0+ZWNfbG9jayk7CiAJCUNFUlJPUigiZWNob19jbGllbnQgc3RpbGwgaGFzIG9iamVjdHMgYXQgY2xlYW51cCB0aW1lLCAiCiAJCSAgICAgICAid2FpdCBmb3IgMSBzZWNvbmRcbiIpOwotCQlzY2hlZHVsZV90aW1lb3V0X2FuZF9zZXRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUsCi0JCQkJCQkgICBjZnNfdGltZV9zZWNvbmRzKDEpKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoMSkpOwogCQlsdV9zaXRlX3B1cmdlKGVudiwgJmVkLT5lZF9zaXRlLT5jc19sdSwgLTEpOwogCQlzcGluX2xvY2soJmVjLT5lY19sb2NrKTsKIAl9CkBAIC0yNzY0LDcgKzI3NjQsNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9CRF9JT0NfQ1JFQVRFOgkJICAgIC8qIG1heSBjcmVhdGUgZWNobyBvYmplY3QgKi8KLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPIChvdXQsIHJjID0gLUVQRVJNKTsKIAogCQlyYyA9IGVjaG9fY3JlYXRlX29iamVjdChlbnYsIGVkLCAxLCBvYSwgZGF0YS0+aW9jX3BidWYxLApAQCAtMjc3OCw3ICsyNzc4LDcgQEAKIAkJaW50IGRpcmxlbjsKIAkJX191NjQgaWQ7CiAKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPKG91dCwgcmMgPSAtRVBFUk0pOwogCiAJCWNvdW50ID0gZGF0YS0+aW9jX2NvdW50OwpAQCAtMjgwNiw3ICsyODA2LDcgQEAKIAkJX191NjQJICAgIHNlcTsKIAkJaW50CSAgICAgIG1heF9jb3VudDsKIAotCQlpZiAoIWNmc19jYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKIAkJCUdPVE8ob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJY2xfZW52ID0gY2xfZW52X2dldCgmcmVmY2hlY2spOwpAQCAtMjgzOCw3ICsyODM4LDcgQEAKIAkJR09UTyhvdXQsIHJjKTsKIAl9CiAJY2FzZSBPQkRfSU9DX0RFU1RST1k6Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyAob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJcmMgPSBlY2hvX2dldF9vYmplY3QoJmVjbywgZWQsIG9hKTsKQEAgLTI4NjMsNyArMjg2Myw3IEBACiAJCUdPVE8ob3V0LCByYyk7CiAKIAljYXNlIE9CRF9JT0NfU0VUQVRUUjoKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPIChvdXQsIHJjID0gLUVQRVJNKTsKIAogCQlyYyA9IGVjaG9fZ2V0X29iamVjdCgmZWNvLCBlZCwgb2EpOwpAQCAtMjg3OCw3ICsyODc4LDcgQEAKIAkJR09UTyhvdXQsIHJjKTsKIAogCWNhc2UgT0JEX0lPQ19CUldfV1JJVEU6Ci0JCWlmICghY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQorCQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQogCQkJR09UTyAob3V0LCByYyA9IC1FUEVSTSk7CiAKIAkJcncgPSBPQkRfQlJXX1dSSVRFOwpAQCAtMjg5Nyw3ICsyODk3LDcgQEAKIAkJR09UTyhvdXQsIHJjKTsKIAogCWNhc2UgRUNIT19JT0NfU0VUX1NUUklQRToKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPIChvdXQsIHJjID0gLUVQRVJNKTsKIAogCQlpZiAoZGF0YS0+aW9jX3BidWYxID09IE5VTEwpIHsgIC8qIHVuc2V0ICovCkBAIC0yOTE0LDcgKzI5MTQsNyBAQAogCQlHT1RPIChvdXQsIHJjKTsKIAogCWNhc2UgRUNIT19JT0NfRU5RVUVVRToKLQkJaWYgKCFjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCisJCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCiAJCQlHT1RPIChvdXQsIHJjID0gLUVQRVJNKTsKIAogCQlyYyA9IGVjaG9fY2xpZW50X2VucXVldWUoZXhwLCBvYSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYwppbmRleCBiZTQ1MTFlLi5mZTk5ODlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCkBAIC0xMDIwLDcgKzEwMjAsNyBAQAogCiAvKioKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYWtlIHRoZSBleHRlbnQgcHJlcGFyZWQgZm9yIHRyYW5zZmVyLgotICogQSByYWNlIHdpdGggZmx1c2luZyBwYWdlIC0gbGxfd3JpdGVwYWdlKCkgaGFzIHRvIGJlIGhhbmRsZWQgY2F1dGlvdXNseS4KKyAqIEEgcmFjZSB3aXRoIGZsdXNoaW5nIHBhZ2UgLSBsbF93cml0ZXBhZ2UoKSBoYXMgdG8gYmUgaGFuZGxlZCBjYXV0aW91c2x5LgogICovCiBzdGF0aWMgaW50IG9zY19leHRlbnRfbWFrZV9yZWFkeShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJIHN0cnVjdCBvc2NfZXh0ZW50ICpleHQpCkBAIC0yMTQ2LDcgKzIxNDYsNyBAQAogCW9hcC0+b2FwX29ial9vZmYgPSBvZmZzZXQ7CiAJTEFTU0VSVCghKG9mZnNldCAmIH5DRlNfUEFHRV9NQVNLKSk7CiAKLQlpZiAoIWNsaWVudF9pc19yZW1vdGUoZXhwKSAmJiBjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpCisJaWYgKCFjbGllbnRfaXNfcmVtb3RlKGV4cCkgJiYgY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpCiAJCW9hcC0+b2FwX2Jyd19mbGFncyA9IE9CRF9CUldfTk9RVU9UQTsKIAogCUlOSVRfTElTVF9IRUFEKCZvYXAtPm9hcF9wZW5kaW5nX2l0ZW0pOwpAQCAtMjE4Niw3ICsyMTg2LDcgQEAKIAkvKiBTZXQgdGhlIE9CRF9CUldfU1JWTE9DSyBiZWZvcmUgdGhlIHBhZ2UgaXMgcXVldWVkLiAqLwogCWJyd19mbGFncyB8PSBvcHMtPm9wc19zcnZsb2NrID8gT0JEX0JSV19TUlZMT0NLIDogMDsKIAlpZiAoIWNsaWVudF9pc19yZW1vdGUob3NjX2V4cG9ydChvc2MpKSAmJgotCSAgICBjZnNfY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpIHsKKwkgICAgY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpIHsKIAkJYnJ3X2ZsYWdzIHw9IE9CRF9CUldfTk9RVU9UQTsKIAkJY21kIHw9IE9CRF9CUldfTk9RVU9UQTsKIAl9CkBAIC0yMzk0LDYgKzIzOTQsMTIgQEAKIAkJICogcmVhbGx5IHNlbmRpbmcgdGhlIFJQQy4gKi8KIAljYXNlIE9FU19UUlVOQzoKIAkJLyogcmFjZSB3aXRoIHRydW5jYXRlLCBwYWdlIHdpbGwgYmUgcmVkaXJ0aWVkICovCisJY2FzZSBPRVNfQUNUSVZFOgorCQkvKiBUaGUgZXh0ZW50IGlzIGFjdGl2ZSBzbyB3ZSBuZWVkIHRvIGFib3J0IGFuZCBsZXQgdGhlIGNhbGxlcgorCQkgKiByZS1kaXJ0eSB0aGUgcGFnZS4gSWYgd2UgY29udGludWVkIG9uIGhlcmUsIGFuZCB3ZSB3ZXJlIHRoZQorCQkgKiBvbmUgbWFraW5nIHRoZSBleHRlbnQgYWN0aXZlLCB3ZSBjb3VsZCBkZWFkbG9jayB3YWl0aW5nIGZvcgorCQkgKiB0aGUgcGFnZSB3cml0ZWJhY2sgdG8gY2xlYXIgYnV0IGl0IHdvbid0IGJlY2F1c2UgdGhlIGV4dGVudAorCQkgKiBpcyBhY3RpdmUgYW5kIHdvbid0IGJlIHdyaXR0ZW4gb3V0LiAqLwogCQlHT1RPKG91dCwgcmMgPSAtRUFHQUlOKTsKIAlkZWZhdWx0OgogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYwppbmRleCA2ODFkNjBhLi41ZjNjNTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCkBAIC0yOTcsNyArMjk3LDcgQEAKIAkgKi8KIAlvc2NfcGFnZV90b3VjaChlbnYsIGNsMm9zY19wYWdlKHNsaWNlKSwgdG8pOwogCWlmICghY2xpZW50X2lzX3JlbW90ZShvc2NfZXhwb3J0KG9iaikpICYmCi0JICAgIGNmc19jYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkKKwkgICAgY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpCiAJCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX05PUVVPVEE7CiAKIAlpZiAob2lvLT5vaV9sb2NrbGVzcykKQEAgLTUxMiwxOSArNTEyLDE1IEBACiAJc3RydWN0IG9zY19pbyAgICAqb2lvICAgPSBjbDJvc2NfaW8oZW52LCBzbGljZSk7CiAJc3RydWN0IGNsX29iamVjdCAqb2JqICAgPSBzbGljZS0+Y2lzX29iajsKIAlzdHJ1Y3QgY2xfYXR0ciAgICphdHRyICA9ICZvc2NfZW52X2luZm8oZW52KS0+b3RpX2F0dHI7Ci0JaW50CSAgICAgIHJlc3VsdCA9IDA7CisJaW50IHJjID0gMDsKIAotCWlmIChvaW8tPm9pX2xvY2tsZXNzID09IDApIHsKKwlpZiAob2lvLT5vaV9sb2NrbGVzcyA9PSAwICYmICFzbGljZS0+Y2lzX2lvLT5jaV9ub2F0aW1lKSB7CiAJCWNsX29iamVjdF9hdHRyX2xvY2sob2JqKTsKLQkJcmVzdWx0ID0gY2xfb2JqZWN0X2F0dHJfZ2V0KGVudiwgb2JqLCBhdHRyKTsKLQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQlhdHRyLT5jYXRfYXRpbWUgPSBMVElNRV9TKENVUlJFTlRfVElNRSk7Ci0JCQlyZXN1bHQgPSBjbF9vYmplY3RfYXR0cl9zZXQoZW52LCBvYmosIGF0dHIsCi0JCQkJCQkgICAgQ0FUX0FUSU1FKTsKLQkJfQorCQlhdHRyLT5jYXRfYXRpbWUgPSBMVElNRV9TKENVUlJFTlRfVElNRSk7CisJCXJjID0gY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCBDQVRfQVRJTUUpOwogCQljbF9vYmplY3RfYXR0cl91bmxvY2sob2JqKTsKIAl9Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgb3NjX2lvX3dyaXRlX3N0YXJ0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19wYWdlLmMKaW5kZXggNDkwOWU0ODYuLjk2Y2I2ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCkBAIC01NjEsNyArNTYxLDcgQEAKIAlvYXAtPm9hcF9icndfZmxhZ3MgPSBPQkRfQlJXX1NZTkMgfCBicndfZmxhZ3M7CiAKIAlpZiAoIWNsaWVudF9pc19yZW1vdGUob3NjX2V4cG9ydChvYmopKSAmJgotCQkJY2ZzX2NhcGFibGUoQ0ZTX0NBUF9TWVNfUkVTT1VSQ0UpKSB7CisJCQljYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkgewogCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19OT1FVT1RBOwogCQlvYXAtPm9hcF9jbWQgfD0gT0JEX0JSV19OT1FVT1RBOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcXVvdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcXVvdGEuYwppbmRleCA2MDQ1YTc4Li4wMjM1ZmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3F1b3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19xdW90YS5jCkBAIC01MSwxMSArNTEsOCBAQAogCiAJCW9xaSA9IGNmc19oYXNoX2xvb2t1cChjbGktPmNsX3F1b3RhX2hhc2hbdHlwZV0sICZxaWRbdHlwZV0pOwogCQlpZiAob3FpKSB7Ci0JCQlvYmRfdWlkIGlkID0gb3FpLT5vcWlfaWQ7Ci0KLQkJCUxBU1NFUlRGKGlkID09IHFpZFt0eXBlXSwKLQkJCQkgIlRoZSBpZHMgZG9uJ3QgbWF0Y2ggJXUgIT0gJXVcbiIsCi0JCQkJIGlkLCBxaWRbdHlwZV0pOworCQkJLyogZG8gbm90IHRyeSB0byBhY2Nlc3Mgb3FpIGhlcmUsIGl0IGNvdWxkIGhhdmUgYmVlbgorCQkJICogZnJlZWQgYnkgb3NjX3F1b3RhX3NldGRxKCkgKi8KIAogCQkJLyogdGhlIHNsb3QgaXMgYnVzeSwgdGhlIHVzZXIgaXMgYWJvdXQgdG8gcnVuIG91dCBvZgogCQkJICogcXVvdGEgc3BhY2Ugb24gdGhpcyBPU1QgKi8KQEAgLTI2OCwxMSArMjY1LDE2IEBACiAJaWYgKHJjKQogCQlDRVJST1IoInB0bHJwY19xdWV1ZV93YWl0IGZhaWxlZCwgcmM6ICVkXG4iLCByYyk7CiAKLQlpZiAocmVxLT5ycV9yZXBtc2cgJiYKLQkgICAgKG9xYyA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9PQkRfUVVPVEFDVEwpKSkgewotCQkqb3FjdGwgPSAqb3FjOworCWlmIChyZXEtPnJxX3JlcG1zZykgeworCQlvcWMgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT0JEX1FVT1RBQ1RMKTsKKwkJaWYgKG9xYykgeworCQkJKm9xY3RsID0gKm9xYzsKKwkJfSBlbHNlIGlmICghcmMpIHsKKwkJCUNFUlJPUigiQ2FuJ3QgdW5wYWNrIG9iZF9xdW90YWN0bFxuIik7CisJCQlyYyA9IC1FUFJPVE87CisJCX0KIAl9IGVsc2UgaWYgKCFyYykgewotCQlDRVJST1IgKCJDYW4ndCB1bnBhY2sgb2JkX3F1b3RhY3RsXG4iKTsKKwkJQ0VSUk9SKCJDYW4ndCB1bnBhY2sgb2JkX3F1b3RhY3RsXG4iKTsKIAkJcmMgPSAtRVBST1RPOwogCX0KIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKaW5kZXggZDkwZWZlNC4uNGM5ZTAwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgInB0bHJwY19pbnRlcm5hbC5oIgogCiBzdGF0aWMgaW50IHB0bHJwY19zZW5kX25ld19yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwdGxycGNkX2NoZWNrX3dvcmsoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogCiAvKioKICAqIEluaXRpYWxpemUgcGFzc2VkIGluIGNsaWVudCBzdHJ1Y3R1cmUgXGEgY2wuCkBAIC02Miw3ICs2Myw3IEBACiBFWFBPUlRfU1lNQk9MKHB0bHJwY19pbml0X2NsaWVudCk7CiAKIC8qKgotICogUmV0dXJuIFBvcnRhbFJQQyBjb25uZWN0aW9uIGZvciByZW1vcmUgdXVkIFxhIHV1aWQKKyAqIFJldHVybiBQb3J0YWxSUEMgY29ubmVjdGlvbiBmb3IgcmVtb3RlIHV1ZCBcYSB1dWlkCiAgKi8KIHN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqcHRscnBjX3V1aWRfdG9fY29ubmVjdGlvbihzdHJ1Y3Qgb2JkX3V1aWQgKnV1aWQpCiB7CkBAIC0xMjcsNyArMTI4LDcgQEAKICAqIFByZXBhcmUgYnVsayBkZXNjcmlwdG9yIGZvciBzcGVjaWZpZWQgb3V0Z29pbmcgcmVxdWVzdCBcYSByZXEgdGhhdAogICogY2FuIGZpdCBcYSBucGFnZXMgKiBwYWdlcy4gXGEgdHlwZSBpcyBidWxrIHR5cGUuIFxhIHBvcnRhbCBpcyB3aGVyZQogICogdGhlIGJ1bGsgdG8gYmUgc2VudC4gVXNlZCBvbiBjbGllbnQtc2lkZS4KLSAqIFJldHVybnMgcG9pbnRlciB0byBuZXdseSBhbGxvY2F0cmQgaW5pdGlhbGl6ZWQgYnVsayBkZXNjcmlwdG9yIG9yIE5VTEwgb24KKyAqIFJldHVybnMgcG9pbnRlciB0byBuZXdseSBhbGxvY2F0ZWQgaW5pdGlhbGl6ZWQgYnVsayBkZXNjcmlwdG9yIG9yIE5VTEwgb24KICAqIGVycm9yLgogICovCiBzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqcHRscnBjX3ByZXBfYnVsa19pbXAoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCkBAIC02MzEsNyArNjMyLDcgQEAKIAogCS8qIEZvciBzb21lIG9sZCAxLjggY2xpZW50cyAoPCAxLjguNyksIHRoZXkgd2lsbCBMQVNTRVJUIHRoZSBzaXplIG9mCiAJICogcHRscnBjX2JvZHkgc2VudCBmcm9tIHNlcnZlciBlcXVhbCB0byBsb2NhbCBwdGxycGNfYm9keSBzaXplLCBzbyB3ZQotCSAqIGhhdmUgdG8gc2VuZCBvbGQgcHRscnBjX2JvZHkgdG8ga2VlcCBpbnRlcm9wcmFiaWxpdHkgd2l0aCB0aGVzZQorCSAqIGhhdmUgdG8gc2VuZCBvbGQgcHRscnBjX2JvZHkgdG8ga2VlcCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggdGhlc2UKIAkgKiBjbGllbnRzLgogCSAqCiAJICogT25seSB0aHJlZSBraW5kcyBvZiBzZXJ2ZXItPmNsaWVudCBSUENzIHNvIGZhcjoKQEAgLTYzOSw3ICs2NDAsNyBAQAogCSAqICAtIExETE1fQ1BfQ0FMTEJBQ0sKIAkgKiAgLSBMRExNX0dMX0NBTExCQUNLCiAJICoKLQkgKiBYWFggVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuZXZlciB3ZSBkcm9wIHRoZSBpbnRlcm9wcmFiaWxpdHkgd2l0aAorCSAqIFhYWCBUaGlzIHNob3VsZCBiZSByZW1vdmVkIHdoZW5ldmVyIHdlIGRyb3AgdGhlIGludGVyb3BlcmFiaWxpdHkgd2l0aAogCSAqICAgICB0aGUgdGhlc2Ugb2xkIGNsaWVudHMuCiAJICovCiAJaWYgKG9wY29kZSA9PSBMRExNX0JMX0NBTExCQUNLIHx8IG9wY29kZSA9PSBMRExNX0NQX0NBTExCQUNLIHx8CkBAIC02ODYsNyArNjg3LDcgQEAKIAogLyoqCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmVxdWVzdC4KLSAqIENhbGxzIF9fcHRscnBjX3JlcXVlc3RfYWxsb2MgdG8gYWxsb2NhdGUgbmV3IHJlcXVlc3Qgc3R1cmN0dXJlIGFuZCBpbml0cworICogQ2FsbHMgX19wdGxycGNfcmVxdWVzdF9hbGxvYyB0byBhbGxvY2F0ZSBuZXcgcmVxdWVzdCBzdHJ1Y3R1cmUgYW5kIGluaXRzCiAgKiBidWZmZXIgc3RydWN0dXJlcyBhY2NvcmRpbmcgdG8gY2Fwc3VsZSB0ZW1wbGF0ZSBcYSBmb3JtYXQuCiAgKiBSZXR1cm5zIGFsbG9jYXRlZCByZXF1ZXN0IHN0cnVjdHVyZSBwb2ludGVyIG9yIE5VTEwgb24gZXJyb3IuCiAgKi8KQEAgLTc0Myw3ICs3NDQsNyBAQAogRVhQT1JUX1NZTUJPTChwdGxycGNfcmVxdWVzdF9mcmVlKTsKIAogLyoqCi0gKiBBbGxvY2F0ZSBuZXcgcmVxdWVzdCBmb3Igb3BlcmF0aW9uZSBcYSBvcGNvZGUgYW5kIGltbWVkaWF0ZWxseSBwYWNrIGl0IGZvcgorICogQWxsb2NhdGUgbmV3IHJlcXVlc3QgZm9yIG9wZXJhdGlvbiBcYSBvcGNvZGUgYW5kIGltbWVkaWF0ZWx5IHBhY2sgaXQgZm9yCiAgKiBuZXR3b3JrIHRyYW5zZmVyLgogICogT25seSB1c2VkIGZvciBzaW1wbGUgcmVxdWVzdHMgbGlrZSBPQkRfUElORyB3aGVyZSB0aGUgb25seSBpbXBvcnRhbnQKICAqIHBhcnQgb2YgdGhlIHJlcXVlc3QgaXMgb3BlcmF0aW9uIGl0c2VsZi4KQEAgLTc2OCw3ICs3NjksNyBAQAogRVhQT1JUX1NZTUJPTChwdGxycGNfcmVxdWVzdF9hbGxvY19wYWNrKTsKIAogLyoqCi0gKiBQcmVwYXJlIHJlcXVlc3QgKGZldGNoZWQgZnJvbSBwb29sIFxhIHBvb2xpZiBub3QgTlVMTCkgb24gaW1wb3J0IFxhIGltcAorICogUHJlcGFyZSByZXF1ZXN0IChmZXRjaGVkIGZyb20gcG9vbCBcYSBwb29sIGlmIG5vdCBOVUxMKSBvbiBpbXBvcnQgXGEgaW1wCiAgKiBmb3Igb3BlcmF0aW9uIFxhIG9wY29kZS4gUmVxdWVzdCB3b3VsZCBjb250YWluIFxhIGNvdW50IGJ1ZmZlcnMuCiAgKiBTaXplcyBvZiBidWZmZXJzIGFyZSBkZXNjcmliZWQgaW4gYXJyYXkgXGEgbGVuZ3RocyBhbmQgYnVmZmVycyB0aGVtc2VsdmVzCiAgKiBhcmUgcHJvdmlkZWQgYnkgYSBwb2ludGVyIFxhIGJ1ZnMuCkBAIC0xMDczLDcgKzEwNzQsNyBAQAogfQogCiAvKioKLSAqIERlY2lkZSBpZiB0aGUgZXJvciBtZXNzYWdlIHJlZ2FyZGluZyBwcm92aWRlZCByZXF1ZXN0IFxhIHJlcQorICogRGVjaWRlIGlmIHRoZSBlcnJvciBtZXNzYWdlIHJlZ2FyZGluZyBwcm92aWRlZCByZXF1ZXN0IFxhIHJlcQogICogc2hvdWxkIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgb3Igbm90LgogICogTWFrZXMgaXQncyBkZWNpc2lvbiBvbiByZXF1ZXN0IHN0YXR1cyBhbmQgb3RoZXIgcHJvcGVydGllcy4KICAqIFJldHVybnMgMSB0byBwcmludCBlcnJvciBvbiB0aGUgc3lzdGVtIGNvbnNvbGUgb3IgMCBpZiBub3QuCkBAIC0xMTU5LDcgKzExNjAsNyBAQAogLyoqCiAgKiBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBjbGllbnQgcmVjZWl2ZXMgUlBDIHJlcGx5IGZvciBcYSByZXEuCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBlcnJvciBjb2RlLgotICogVGhlIHJldHVybiBhbHVlIHdvdWxkIGJlIGFzc2lnbmVkIHRvIHJlcS0+cnFfc3RhdHVzIGJ5IHRoZSBjYWxsZXIKKyAqIFRoZSByZXR1cm4gdmFsdWUgd291bGQgYmUgYXNzaWduZWQgdG8gcmVxLT5ycV9zdGF0dXMgYnkgdGhlIGNhbGxlcgogICogYXMgcmVxdWVzdCBwcm9jZXNzaW5nIHN0YXR1cy4KICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBkZWNpZGVzIGlmIHRoZSByZXF1ZXN0IG5lZWRzIHRvIGJlIHNhdmVkIGZvciBsYXRlciByZXBsYXkuCiAgKi8KQEAgLTExOTAsNyArMTE5MSw5IEBACiAJCSAqIHdpbGwgcm91bmR1cCBpdCAqLwogCQlyZXEtPnJxX3JlcGxlbiAgICAgICA9IHJlcS0+cnFfbm9iX3JlY2VpdmVkOwogCQlyZXEtPnJxX25vYl9yZWNlaXZlZCA9IDA7CisJCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJcmVxLT5ycV9yZXNlbmQgICAgICAgPSAxOworCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMzEzLDcgKzEzMTYsMTEgQEAKIAkJCS8qKiB2ZXJzaW9uIHJlY292ZXJ5ICovCiAJCQlwdGxycGNfc2F2ZV92ZXJzaW9ucyhyZXEpOwogCQkJcHRscnBjX3JldGFpbl9yZXBsYXlhYmxlX3JlcXVlc3QocmVxLCBpbXApOwotCQl9IGVsc2UgaWYgKHJlcS0+cnFfY29tbWl0X2NiICE9IE5VTEwpIHsKKwkJfSBlbHNlIGlmIChyZXEtPnJxX2NvbW1pdF9jYiAhPSBOVUxMICYmCisJCQkgICBsaXN0X2VtcHR5KCZyZXEtPnJxX3JlcGxheV9saXN0KSkgeworCQkJLyogTkI6IGRvbid0IGNhbGwgcnFfY29tbWl0X2NiIGlmIGl0J3MgYWxyZWFkeSBvbgorCQkJICogcnFfcmVwbGF5X2xpc3QsIHB0bHJwY19mcmVlX2NvbW1pdHRlZCgpIHdpbGwgY2FsbAorCQkJICogaXQgbGF0ZXIsIHNlZSBMVS0zNjE4IGZvciBkZXRhaWxzICovCiAJCQlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiAJCQlyZXEtPnJxX2NvbW1pdF9jYihyZXEpOwogCQkJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKQEAgLTE0MDgsNyArMTQxNSw5IEBACiAJCQlyZXEtPnJxX3N0YXR1cyA9IHJjOwogCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7CisJCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJCQlyZXEtPnJxX3dhaXRfY3R4ID0gMTsKKwkJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0xNDIzLDcgKzE0MzIsOSBAQAogCXJjID0gcHRsX3NlbmRfcnBjKHJlcSwgMCk7CiAJaWYgKHJjKSB7CiAJCURFQlVHX1JFUShEX0hBLCByZXEsICJzZW5kIGZhaWxlZCAoJWQpOyBleHBlY3QgdGltZW91dCIsIHJjKTsKKwkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCQlyZXEtPnJxX25ldF9lcnIgPSAxOworCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJcmV0dXJuIHJjOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE2ODgsNiArMTY5OSw3IEBACiAJCQkJCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJCQkJcmVxLT5ycV9uZXRfZXJyID0gMTsKIAkJCQkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CisJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQkvKiBuZWVkIHRvIHJlc2V0IHRoZSB0aW1lb3V0ICovCiAJCQkJZm9yY2VfdGltZXJfcmVjYWxjID0gMTsKQEAgLTE3NzMsNiArMTc4NSwxMCBAQAogCiAJCXB0bHJwY19yZXFfaW50ZXJwcmV0KGVudiwgcmVxLCByZXEtPnJxX3N0YXR1cyk7CiAKKwkJaWYgKHB0bHJwY2RfY2hlY2tfd29yayhyZXEpKSB7CisJCQlhdG9taWNfZGVjKCZzZXQtPnNldF9yZW1haW5pbmcpOworCQkJY29udGludWU7CisJCX0KIAkJcHRscnBjX3JxcGhhc2VfbW92ZShyZXEsIFJRX1BIQVNFX0NPTVBMRVRFKTsKIAogCQlDREVCVUcocmVxLT5ycV9yZXFtc2cgIT0gTlVMTCA/IERfUlBDVFJBQ0UgOiAwLApAQCAtMjAzMSw3ICsyMDQ3LDcgQEAKIEVYUE9SVF9TWU1CT0wocHRscnBjX3NldF9uZXh0X3RpbWVvdXQpOwogCiAvKioKLSAqIFNlbmQgYWxsIHVuc2V0IHJlcXVlc3QgZnJvbSB0aGUgc2V0IGFuZCB0aGVuIHdhaXQgdW50aWxsIGFsbAorICogU2VuZCBhbGwgdW5zZXQgcmVxdWVzdCBmcm9tIHRoZSBzZXQgYW5kIHRoZW4gd2FpdCB1bnRpbCBhbGwKICAqIHJlcXVlc3RzIGluIHRoZSBzZXQgY29tcGxldGUgKGVpdGhlciBnZXQgYSByZXBseSwgdGltZW91dCwgZ2V0IGFuCiAgKiBlcnJvciBvciBvdGhlcndpc2UgYmUgaW50ZXJydXB0ZWQpLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSBvdGhlcndpc2UuCkBAIC0yMTU2LDcgKzIxNzIsNyBAQAogRVhQT1JUX1NZTUJPTChwdGxycGNfc2V0X3dhaXQpOwogCiAvKioKLSAqIEhlbHBlciBmdWN0aW9uIGZvciByZXF1ZXN0IGZyZWVpbmcuCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlcXVlc3QgZnJlZWluZy4KICAqIENhbGxlZCB3aGVuIHJlcXVlc3QgY291bnQgcmVhY2hlZCB6ZXJvIGFuZCByZXF1ZXN0IG5lZWRzIHRvIGJlIGZyZWVkLgogICogUmVtb3ZlcyByZXF1ZXN0IGZyb20gYWxsIHNvcnRzIG9mIHNlbmRpbmcvcmVwbGF5IGxpc3RzIGl0IG1pZ2h0IGJlIG9uLAogICogZnJlZXMgbmV0d29yayBidWZmZXJzIGlmIGFueSBhcmUgcHJlc2VudC4KQEAgLTIyMjMsNyArMjIzOSw3IEBACiBzdGF0aWMgaW50IF9fcHRscnBjX3JlcV9maW5pc2hlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIGludCBsb2NrZWQpOwogLyoqCiAgKiBEcm9wIG9uZSByZXF1ZXN0IHJlZmVyZW5jZS4gTXVzdCBiZSBjYWxsZWQgd2l0aCBpbXBvcnQgaW1wX2xvY2sgaGVsZC4KLSAqIFdoZW4gcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8sIHJldXFlc3QgaXMgZnJlZWQuCisgKiBXaGVuIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLCByZXF1ZXN0IGlzIGZyZWVkLgogICovCiB2b2lkIHB0bHJwY19yZXFfZmluaXNoZWRfd2l0aF9pbXBfbG9jayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QpCiB7CkBAIC0yMjM2LDcgKzIyNTIsNyBAQAogICogSGVscGVyIGZ1bmN0aW9uCiAgKiBEcm9wcyBvbmUgcmVmZXJlbmNlIGNvdW50IGZvciByZXF1ZXN0IFxhIHJlcXVlc3QuCiAgKiBcYSBsb2NrZWQgc2V0IGluZGljYXRlcyB0aGF0IGNhbGxlciBob2xkcyBpbXBvcnQgaW1wX2xvY2suCi0gKiBGcmVlcyB0aGUgcmVxdWVzdCB3aGUgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqIEZyZWVzIHRoZSByZXF1ZXN0IHdoZW4gcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4KICAqLwogc3RhdGljIGludCBfX3B0bHJwY19yZXFfZmluaXNoZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgbG9ja2VkKQogewpAQCAtMjM2MCwxOSArMjM3Niw1MiBAQAogfQogRVhQT1JUX1NZTUJPTChwdGxycGNfdW5yZWdpc3Rlcl9yZXBseSk7CiAKK3N0YXRpYyB2b2lkIHB0bHJwY19mcmVlX3JlcXVlc3Qoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCit7CisJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOworCXJlcS0+cnFfcmVwbGF5ID0gMDsKKwlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKKworCWlmIChyZXEtPnJxX2NvbW1pdF9jYiAhPSBOVUxMKQorCQlyZXEtPnJxX2NvbW1pdF9jYihyZXEpOworCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcmVwbGF5X2xpc3QpOworCisJX19wdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSwgMSk7Cit9CisKKy8qKgorICogdGhlIHJlcXVlc3QgaXMgY29tbWl0dGVkIGFuZCBkcm9wcGVkIGZyb20gdGhlIHJlcGxheSBsaXN0IG9mIGl0cyBpbXBvcnQKKyAqLwordm9pZCBwdGxycGNfcmVxdWVzdF9jb21taXR0ZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3Qgb2JkX2ltcG9ydAkqaW1wID0gcmVxLT5ycV9pbXBvcnQ7CisKKwlzcGluX2xvY2soJmltcC0+aW1wX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZyZXEtPnJxX3JlcGxheV9saXN0KSkgeworCQlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZm9yY2UgfHwgcmVxLT5ycV90cmFuc25vIDw9IGltcC0+aW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm8pCisJCXB0bHJwY19mcmVlX3JlcXVlc3QocmVxKTsKKworCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wocHRscnBjX3JlcXVlc3RfY29tbWl0dGVkKTsKKwogLyoqCiAgKiBJdGVyYXRlcyB0aHJvdWdoIHJlcGxheV9saXN0IG9uIGltcG9ydCBhbmQgcHJ1bmVzCiAgKiBhbGwgcmVxdWVzdHMgaGF2ZSB0cmFuc25vIHNtYWxsZXIgdGhhbiBsYXN0X2NvbW1pdHRlZCBmb3IgdGhlCiAgKiBpbXBvcnQgYW5kIGRvbid0IGhhdmUgcnFfcmVwbGF5IHNldC4KLSAqIFNpbmNlIHJlcXVlc3RzIGFyZSBzb3J0ZWQgaW4gdHJhbnNubyBvcmRlciwgc3RvcHMgd2hlbiBtZWV0aWduIGZpcnN0CisgKiBTaW5jZSByZXF1ZXN0cyBhcmUgc29ydGVkIGluIHRyYW5zbm8gb3JkZXIsIHN0b3BzIHdoZW4gbWVldGluZyBmaXJzdAogICogdHJhbnNubyBiaWdnZXIgdGhhbiBsYXN0X2NvbW1pdHRlZC4KICAqIGNhbGxlciBtdXN0IGhvbGQgaW1wLT5pbXBfbG9jawogICovCiB2b2lkIHB0bHJwY19mcmVlX2NvbW1pdHRlZChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnNhdmVkOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCAqc2F2ZWQ7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpsYXN0X3JlcSA9IE5VTEw7IC8qIHRlbXBvcmFyeSBmaXJlIGVzY2FwZSAqLworCWJvb2wJCSAgICAgICBza2lwX2NvbW1pdHRlZF9saXN0ID0gdHJ1ZTsKIAogCUxBU1NFUlQoaW1wICE9IE5VTEwpOwogCkBAIC0yMzg4LDEzICsyNDM3LDE1IEBACiAJQ0RFQlVHKERfUlBDVFJBQ0UsICIlczogY29tbWl0dGluZyBmb3IgbGFzdF9jb21taXR0ZWQgIkxQVTY0IiBnZW4gJWRcbiIsCiAJICAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsIGltcC0+aW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm8sCiAJICAgICAgIGltcC0+aW1wX2dlbmVyYXRpb24pOworCisJaWYgKGltcC0+aW1wX2dlbmVyYXRpb24gIT0gaW1wLT5pbXBfbGFzdF9nZW5lcmF0aW9uX2NoZWNrZWQpCisJCXNraXBfY29tbWl0dGVkX2xpc3QgPSBmYWxzZTsKKwogCWltcC0+aW1wX2xhc3RfdHJhbnNub19jaGVja2VkID0gaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubzsKIAlpbXAtPmltcF9sYXN0X2dlbmVyYXRpb25fY2hlY2tlZCA9IGltcC0+aW1wX2dlbmVyYXRpb247CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBzYXZlZCwgJmltcC0+aW1wX3JlcGxheV9saXN0KSB7Ci0JCXJlcSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QsCi0JCQkJICAgICBycV9yZXBsYXlfbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCBzYXZlZCwgJmltcC0+aW1wX3JlcGxheV9saXN0LAorCQkJCSBycV9yZXBsYXlfbGlzdCkgewogCQkvKiBYWFggb2sgdG8gcmVtb3ZlIHdoZW4gMTM1NyByZXNvbHZlZCAtIHJyZWFkIDA1LzI5LzAzICAqLwogCQlMQVNTRVJUKHJlcSAhPSBsYXN0X3JlcSk7CiAJCWxhc3RfcmVxID0gcmVxOwpAQCAtMjQwOCwyNyArMjQ1OSwzNCBAQAogCQkJR09UTyhmcmVlX3JlcSwgMCk7CiAJCX0KIAotCQlpZiAocmVxLT5ycV9yZXBsYXkpIHsKLQkJCURFQlVHX1JFUShEX1JQQ1RSQUNFLCByZXEsICJrZWVwaW5nIChGTF9SRVBMQVkpIik7Ci0JCQljb250aW51ZTsKLQkJfQotCiAJCS8qIG5vdCB5ZXQgY29tbWl0dGVkICovCiAJCWlmIChyZXEtPnJxX3RyYW5zbm8gPiBpbXAtPmltcF9wZWVyX2NvbW1pdHRlZF90cmFuc25vKSB7CiAJCQlERUJVR19SRVEoRF9SUENUUkFDRSwgcmVxLCAic3RvcHBpbmcgc2VhcmNoIik7CiAJCQlicmVhazsKIAkJfQogCisJCWlmIChyZXEtPnJxX3JlcGxheSkgeworCQkJREVCVUdfUkVRKERfUlBDVFJBQ0UsIHJlcSwgImtlZXBpbmcgKEZMX1JFUExBWSkiKTsKKwkJCWxpc3RfbW92ZV90YWlsKCZyZXEtPnJxX3JlcGxheV9saXN0LAorCQkJCSAgICAgICAmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QpOworCQkJY29udGludWU7CisJCX0KKwogCQlERUJVR19SRVEoRF9JTkZPLCByZXEsICJjb21taXQgKGxhc3RfY29tbWl0dGVkICJMUFU2NCIpIiwKIAkJCSAgaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubyk7CiBmcmVlX3JlcToKLQkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwotCQlyZXEtPnJxX3JlcGxheSA9IDA7Ci0JCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwotCQlpZiAocmVxLT5ycV9jb21taXRfY2IgIT0gTlVMTCkKLQkJCXJlcS0+cnFfY29tbWl0X2NiKHJlcSk7Ci0JCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcmVwbGF5X2xpc3QpOwotCQlfX3B0bHJwY19yZXFfZmluaXNoZWQocmVxLCAxKTsKKwkJcHRscnBjX2ZyZWVfcmVxdWVzdChyZXEpOworCX0KKwlpZiAoc2tpcF9jb21taXR0ZWRfbGlzdCkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgc2F2ZWQsICZpbXAtPmltcF9jb21taXR0ZWRfbGlzdCwKKwkJCQkgcnFfcmVwbGF5X2xpc3QpIHsKKwkJTEFTU0VSVChyZXEtPnJxX3RyYW5zbm8gIT0gMCk7CisJCWlmIChyZXEtPnJxX2ltcG9ydF9nZW5lcmF0aW9uIDwgaW1wLT5pbXBfZ2VuZXJhdGlvbikgeworCQkJREVCVUdfUkVRKERfUlBDVFJBQ0UsIHJlcSwgImZyZWUgc3RhbGUgb3BlbiByZXF1ZXN0Iik7CisJCQlwdGxycGNfZnJlZV9yZXF1ZXN0KHJlcSk7CisJCX0KIAl9CiB9CiAKQEAgLTI1ODUsNyArMjY0Myw3IEBACiAKIC8qKgogICogQ2FsbGJhY2sgdXNlZCBmb3IgcmVwbGF5ZWQgcmVxdWVzdHMgcmVwbHkgcHJvY2Vzc2luZy4KLSAqIEluIGNhc2Ugb2Ygc3VjY2VzZnVsIHJlcGx5IGNhbGxzIHJlZ2lzdGVyZXNkIHJlcXVlc3QgcmVwbGF5IGNhbGxiYWNrLgorICogSW4gY2FzZSBvZiBzdWNjZXNzZnVsIHJlcGx5IGNhbGxzIHJlZ2lzdGVyZWQgcmVxdWVzdCByZXBsYXkgY2FsbGJhY2suCiAgKiBJbiBjYXNlIG9mIGVycm9yIHJlc3RhcnQgcmVwbGF5IHByb2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQgcHRscnBjX3JlcGxheV9pbnRlcnByZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApAQCAtMjgzNCw3ICsyODkyLDcgQEAKIAkJcHRscnBjX2xhc3RfeGlkID0gKF9fdTY0KW5vdyA8PCAyMDsKIAl9CiAKLQkvKiBOZWVkIHRvIGFsd2F5cyBiZSBhbGlnbmVkIHRvIGEgcG93ZXItb2YtdHdvIGZvciBtdXRsaS1idWxrIEJSVyAqLworCS8qIEFsd2F5cyBuZWVkIHRvIGJlIGFsaWduZWQgdG8gYSBwb3dlci1vZi10d28gZm9yIG11bHRpLWJ1bGsgQlJXICovCiAJQ0xBU1NFUlQoKFBUTFJQQ19CVUxLX09QU19DT1VOVCAmIChQVExSUENfQlVMS19PUFNfQ09VTlQgLSAxKSkgPT0gMCk7CiAJcHRscnBjX2xhc3RfeGlkICY9IFBUTFJQQ19CVUxLX09QU19NQVNLOwogfQpAQCAtMjkwNCwyMiArMjk2Miw1MCBAQAogICogICAgaGF2ZSBkZWxheSBiZWZvcmUgaXQgcmVhbGx5IHJ1bnMgYnkgcHRscnBjZCB0aHJlYWQuCiAgKi8KIHN0cnVjdCBwdGxycGNfd29ya19hc3luY19hcmdzIHsKLQlfX3U2NCAgIG1hZ2ljOwogCWludCAgICgqY2IpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKiwgdm9pZCAqKTsKIAl2b2lkICAgKmNiZGF0YTsKIH07CiAKLSNkZWZpbmUgUFRMUlBDX1dPUktfTUFHSUMgMHg2NjU1NDM2YjY3NmY0ZjQ0VUxMIC8qIG1hZ2ljIGNvZGUgKi8KK3N0YXRpYyB2b2lkIHB0bHJwY2RfYWRkX3dvcmtfcmVxKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQoreworCS8qIHJlLWluaXRpYWxpemUgdGhlIHJlcSAqLworCXJlcS0+cnFfdGltZW91dAkJPSBvYmRfdGltZW91dDsKKwlyZXEtPnJxX3NlbnQJCT0gY2ZzX3RpbWVfY3VycmVudF9zZWMoKTsKKwlyZXEtPnJxX2RlYWRsaW5lCT0gcmVxLT5ycV9zZW50ICsgcmVxLT5ycV90aW1lb3V0OworCXJlcS0+cnFfcmVwbHlfZGVhZGxpbmUJPSByZXEtPnJxX2RlYWRsaW5lOworCXJlcS0+cnFfcGhhc2UJCT0gUlFfUEhBU0VfSU5URVJQUkVUOworCXJlcS0+cnFfbmV4dF9waGFzZQk9IFJRX1BIQVNFX0NPTVBMRVRFOworCXJlcS0+cnFfeGlkCQk9IHB0bHJwY19uZXh0X3hpZCgpOworCXJlcS0+cnFfaW1wb3J0X2dlbmVyYXRpb24gPSByZXEtPnJxX2ltcG9ydC0+aW1wX2dlbmVyYXRpb247CisKKwlwdGxycGNkX2FkZF9yZXEocmVxLCBQRExfUE9MSUNZX1JPVU5ELCAtMSk7Cit9CiAKIHN0YXRpYyBpbnQgd29ya19pbnRlcnByZXRlcihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHZvaWQgKmRhdGEsIGludCByYykKIHsKIAlzdHJ1Y3QgcHRscnBjX3dvcmtfYXN5bmNfYXJncyAqYXJnID0gZGF0YTsKIAotCUxBU1NFUlQoYXJnLT5tYWdpYyA9PSBQVExSUENfV09SS19NQUdJQyk7CisJTEFTU0VSVChwdGxycGNkX2NoZWNrX3dvcmsocmVxKSk7CiAJTEFTU0VSVChhcmctPmNiICE9IE5VTEwpOwogCi0JcmV0dXJuIGFyZy0+Y2IoZW52LCBhcmctPmNiZGF0YSk7CisJcmMgPSBhcmctPmNiKGVudiwgYXJnLT5jYmRhdGEpOworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9zZXRfY2hhaW4pOworCXJlcS0+cnFfc2V0ID0gTlVMTDsKKworCWlmIChhdG9taWNfZGVjX3JldHVybigmcmVxLT5ycV9yZWZjb3VudCkgPiAxKSB7CisJCWF0b21pY19zZXQoJnJlcS0+cnFfcmVmY291bnQsIDIpOworCQlwdGxycGNkX2FkZF93b3JrX3JlcShyZXEpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd29ya2VyX2Zvcm1hdDsKKworc3RhdGljIGludCBwdGxycGNkX2NoZWNrX3dvcmsoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCit7CisJcmV0dXJuIHJlcS0+cnFfcGlsbC5yY19mbXQgPT0gKHZvaWQgKikmd29ya2VyX2Zvcm1hdDsKIH0KIAogLyoqCkBAIC0yOTUyLDYgKzMwMzgsNyBAQAogCXJlcS0+cnFfcmVjZWl2aW5nX3JlcGx5ID0gMDsKIAlyZXEtPnJxX211c3RfdW5saW5rID0gMDsKIAlyZXEtPnJxX25vX2RlbGF5ID0gcmVxLT5ycV9ub19yZXNlbmQgPSAxOworCXJlcS0+cnFfcGlsbC5yY19mbXQgPSAodm9pZCAqKSZ3b3JrZXJfZm9ybWF0OwogCiAJc3Bpbl9sb2NrX2luaXQoJnJlcS0+cnFfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnJlcS0+cnFfbGlzdCk7CkBAIC0yOTY1LDcgKzMwNTIsNiBAQAogCiAJQ0xBU1NFUlQoc2l6ZW9mKCphcmdzKSA8PSBzaXplb2YocmVxLT5ycV9hc3luY19hcmdzKSk7CiAJYXJncyA9IHB0bHJwY19yZXFfYXN5bmNfYXJncyhyZXEpOwotCWFyZ3MtPm1hZ2ljICA9IFBUTFJQQ19XT1JLX01BR0lDOwogCWFyZ3MtPmNiICAgICA9IGNiOwogCWFyZ3MtPmNiZGF0YSA9IGNiZGF0YTsKIApAQCAtMjk5NSwyNSArMzA4MSw4IEBACiAJICogcmVxIGFzIG9wYXF1ZSBkYXRhLiAtIEppbnNoYW4KIAkgKi8KIAlMQVNTRVJUKGF0b21pY19yZWFkKCZyZXEtPnJxX3JlZmNvdW50KSA+IDApOwotCWlmIChhdG9taWNfcmVhZCgmcmVxLT5ycV9yZWZjb3VudCkgPiAxKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKGF0b21pY19pbmNfcmV0dXJuKCZyZXEtPnJxX3JlZmNvdW50KSA+IDIpIHsgLyogcmFjZSAqLwotCQlhdG9taWNfZGVjKCZyZXEtPnJxX3JlZmNvdW50KTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQkvKiByZS1pbml0aWFsaXplIHRoZSByZXEgKi8KLQlyZXEtPnJxX3RpbWVvdXQJPSBvYmRfdGltZW91dDsKLQlyZXEtPnJxX3NlbnQJICAgPSBjZnNfdGltZV9jdXJyZW50X3NlYygpOwotCXJlcS0+cnFfZGVhZGxpbmUgICAgICAgPSByZXEtPnJxX3NlbnQgKyByZXEtPnJxX3RpbWVvdXQ7Ci0JcmVxLT5ycV9yZXBseV9kZWFkbGluZSA9IHJlcS0+cnFfZGVhZGxpbmU7Ci0JcmVxLT5ycV9waGFzZQkgID0gUlFfUEhBU0VfSU5URVJQUkVUOwotCXJlcS0+cnFfbmV4dF9waGFzZSAgICAgPSBSUV9QSEFTRV9DT01QTEVURTsKLQlyZXEtPnJxX3hpZAkgICAgPSBwdGxycGNfbmV4dF94aWQoKTsKLQlyZXEtPnJxX2ltcG9ydF9nZW5lcmF0aW9uID0gcmVxLT5ycV9pbXBvcnQtPmltcF9nZW5lcmF0aW9uOwotCi0JcHRscnBjZF9hZGRfcmVxKHJlcSwgUERMX1BPTElDWV9ST1VORCwgLTEpOworCWlmIChhdG9taWNfaW5jX3JldHVybigmcmVxLT5ycV9yZWZjb3VudCkgPT0gMikKKwkJcHRscnBjZF9hZGRfd29ya19yZXEocmVxKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocHRscnBjZF9xdWV1ZV93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ldmVudHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ldmVudHMuYwppbmRleCBmNjZjZmVhLi42ZWEwYTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jCkBAIC01NDUsNyArNTQ1LDcgQEAKIAkgKiBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uLi4uICovCiAJLyoga2VybmVsIExOZXQgY2FsbHMgb3VyIG1hc3RlciBjYWxsYmFjayB3aGVuIHRoZXJlIGFyZSBuZXcgZXZlbnQsCiAJICogYmVjYXVzZSB3ZSBhcmUgZ3VhcmFudGVlZCB0byBnZXQgZXZlcnkgZXZlbnQgdmlhIGNhbGxiYWNrLAotCSAqIHNvIHdlIGp1c3Qgc2V0IEVRIHNpemUgdG8gMCB0byBhdm9pZCBvdmVyaHJlYWQgb2Ygc2VyaWFsaXppbmcKKwkgKiBzbyB3ZSBqdXN0IHNldCBFUSBzaXplIHRvIDAgdG8gYXZvaWQgb3ZlcmhlYWQgb2Ygc2VyaWFsaXppbmcKIAkgKiBlbnF1ZXVlL2RlcXVldWUgb3BlcmF0aW9ucyBpbiBMTmV0LiAqLwogCXJjID0gTE5ldEVRQWxsb2MoMCwgcHRscnBjX21hc3Rlcl9jYWxsYmFjaywgJnB0bHJwY19lcV9oKTsKIAlpZiAocmMgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2NsaV91cGNhbGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2NsaV91cGNhbGwuYwppbmRleCA1NTI0N2FmLi5jMjc5ZWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19jbGlfdXBjYWxsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfY2xpX3VwY2FsbC5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIAlpZiAocmMpIHsKIAkJLyogSWYgYW55IF9yZWFsXyBkZW5pYWwgYmUgbWFkZSwgd2UgZXhwZWN0IHNlcnZlciByZXR1cm4KIAkJICogLUVBQ0NFUyByZXBseSBvciByZXR1cm4gc3VjY2VzcyBidXQgaW5kaWNhdGUgZ3NzIGVycm9yCi0JCSAqIGluc2lkZSByZXBseSBtZXNzc2FnZS4gQWxsIG90aGVyIGVycm9ycyBhcmUgdHJlYXRlZCBhcworCQkgKiBpbnNpZGUgcmVwbHkgbWVzc2FnZS4gQWxsIG90aGVyIGVycm9ycyBhcmUgdHJlYXRlZCBhcwogCQkgKiB0aW1lb3V0LCBjYWxsZXIgbWlnaHQgdHJ5IHRoZSBuZWdvdGlhdGlvbiByZXBlYXRlZGx5LAogCQkgKiBsZWF2ZSByZWNvdmVyeSBkZWNpc2lvbnMgdG8gZ2VuZXJhbCBwdGxycGMgbGF5ZXIuCiAJCSAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19nZW5lcmljX3Rva2VuLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19nZW5lcmljX3Rva2VuLmMKaW5kZXggNTZjMjgyOC4uOGRjNWM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfZ2VuZXJpY190b2tlbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2dlbmVyaWNfdG9rZW4uYwpAQCAtMTQ0LDcgKzE0NCw4IEBACiAJc2YgPSAqKCpidWYpKys7CiAJKCpidWZzaXplKS0tOwogCWlmIChzZiAmIDB4ODApIHsKLQkJaWYgKChzZiAmPSAweDdmKSA+ICgoKmJ1ZnNpemUpIC0gMSkpCisJCXNmICY9IDB4N2Y7CisJCWlmICgoKCpidWZzaXplKSAtIDEpIDwgc2YpCiAJCQlyZXR1cm4gLTE7CiAJCWlmIChzZiA+IFNJWkVPRl9JTlQpCiAJCQlyZXR1cm4gLTE7CkBAIC0xOTksMjcgKzIwMCwzMiBAQAogCXJhd29ial90IHRvaWQ7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoKHRva3NpemUgLT0gMSkgPCAwKQorCXRva3NpemUgLT0gMTsKKwlpZiAoMCA+IHRva3NpemUpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJaWYgKCpidWYrKyAhPSAweDYwKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCi0JaWYgKChzZXFzaXplID0gZGVyX3JlYWRfbGVuZ3RoKCZidWYsICZ0b2tzaXplKSkgPCAwKQorCXNlcXNpemUgPSBkZXJfcmVhZF9sZW5ndGgoJmJ1ZiwgJnRva3NpemUpOworCWlmIChzZXFzaXplIDwgMCkKIAkJcmV0dXJuKEdfQkFEX1RPS19IRUFERVIpOwogCiAJaWYgKHNlcXNpemUgIT0gdG9rc2l6ZSkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAotCWlmICgodG9rc2l6ZSAtPSAxKSA8IDApCisJdG9rc2l6ZSAtPSAxOworCWlmICgwID4gdG9rc2l6ZSkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAlpZiAoKmJ1ZisrICE9IDB4MDYpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAKLQlpZiAoKHRva3NpemUgLT0gMSkgPCAwKQorCXRva3NpemUgLT0gMTsKKwlpZiAoMCA+IHRva3NpemUpCiAJCXJldHVybiAoR19CQURfVE9LX0hFQURFUik7CiAJdG9pZC5sZW4gPSAqYnVmKys7CiAKLQlpZiAoKHRva3NpemUgLT0gdG9pZC5sZW4pIDwgMCkKKwl0b2tzaXplIC09IHRvaWQubGVuOworCWlmICgwID4gdG9rc2l6ZSkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAl0b2lkLmRhdGEgPSBidWY7CiAJYnVmICs9IHRvaWQubGVuOwpAQCAtMjMxLDcgKzIzNyw4IEBACiAJICogaW1wb3J0YW50IHRvIHJldHVybiBHX0JBRF9UT0tfSEVBREVSIGlmIHRoZSB0b2tlbiBoZWFkZXIgaXMKIAkgKiBpbiBmYWN0IGJhZAogCSAqLwotCWlmICgodG9rc2l6ZSAtPSAyKSA8IDApCisJdG9rc2l6ZSAtPSAyOworCWlmICgwID4gdG9rc2l6ZSkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAogCWlmIChyZXQpCkBAIC0yNTYsMjQgKzI2MywyOSBAQAogCWludCByZXQgPSAwOwogCWludCBzZXFzaXplOwogCi0JaWYgKChsZW4gLT0gMSkgPCAwKQorCWxlbiAtPSAxOworCWlmICgwID4gbGVuKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCWlmICgqYnVmKysgIT0gMHg2MCkKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAotCWlmICgoc2Vxc2l6ZSA9IGRlcl9yZWFkX2xlbmd0aCgmYnVmLCAmbGVuKSkgPCAwKQorCXNlcXNpemUgPSBkZXJfcmVhZF9sZW5ndGgoJmJ1ZiwgJmxlbik7CisJaWYgKHNlcXNpemUgPCAwKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCi0JaWYgKChsZW4gLT0gMSkgPCAwKQorCWxlbiAtPSAxOworCWlmICgwID4gbGVuKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCWlmICgqYnVmKysgIT0gMHgwNikKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAotCWlmICgobGVuIC09IDEpIDwgMCkKKwlsZW4gLT0gMTsKKwlpZiAoMCA+IGxlbikKIAkJcmV0dXJuIChHX0JBRF9UT0tfSEVBREVSKTsKIAltZWNoLT5sZW4gPSAqYnVmKys7CiAKLQlpZiAoKGxlbiAtPSBtZWNoLT5sZW4pIDwgMCkKKwlsZW4gLT0gbWVjaC0+bGVuOworCWlmICgwID4gbGVuKQogCQlyZXR1cm4gKEdfQkFEX1RPS19IRUFERVIpOwogCU9CRF9BTExPQ19MQVJHRShtZWNoLT5kYXRhLCBtZWNoLT5sZW4pOwogCWlmICghbWVjaC0+ZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tleXJpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tleXJpbmcuYwppbmRleCBkNDNhMTNjLi40NjQyYmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19rZXlyaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa2V5cmluZy5jCkBAIC0xMTc2LDcgKzExNzYsNyBAQAogCiAvKgogICogY2FsbGVkIHdpdGgga2V5IHNlbWFwaG9yZSB3cml0ZSBsb2NrZWQuIGl0IG1lYW5zIHdlIGNhbiBvcGVyYXRlCi0gKiBvbiB0aGUgY29udGV4dCB3aXRob3V0IGZlYXIgb2YgbG9vc2luZyByZWZjb3VudC4KKyAqIG9uIHRoZSBjb250ZXh0IHdpdGhvdXQgZmVhciBvZiBsb3NpbmcgcmVmY291bnQuCiAgKi8KIHN0YXRpYwogaW50IGdzc19rdF91cGRhdGUoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX2tyYjVfbWVjaC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa3JiNV9tZWNoLmMKaW5kZXggYjlmYTNiNC4uZDAzZjZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa3JiNV9tZWNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfa3JiNV9tZWNoLmMKQEAgLTU0LDcgKzU0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KIAogI2luY2x1ZGUgPG9iZC5oPgogI2luY2x1ZGUgPG9iZF9jbGFzcy5oPgpAQCAtNjc5LDcgKzY3OCw4IEBACiAJX191MzIJCSAgY29kZSA9IEdTU19TX0ZBSUxVUkU7CiAJaW50CQkgICAgcmM7CiAKLQlpZiAoISh0Zm0gPSBsbF9jcnlwdG9fYWxsb2NfaGFzaChrZS0+a2VfaGFzaF9uYW1lLCAwLCAwKSkpIHsKKwl0Zm0gPSBsbF9jcnlwdG9fYWxsb2NfaGFzaChrZS0+a2VfaGFzaF9uYW1lLCAwLCAwKTsKKwlpZiAoIXRmbSkgewogCQlDRVJST1IoImZhaWxlZCB0byBhbGxvYyBURk06ICVzXG4iLCBrZS0+a2VfaGFzaF9uYW1lKTsKIAkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3NfcGlwZWZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19waXBlZnMuYwppbmRleCBjNjI0NTE4Li43YTFmZjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19waXBlZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19waXBlZnMuYwpAQCAtODUsNyArODUsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogaW50ZXJuZWwgY29udGV4dCBoZWxwZXJzCSAgICAgKgorICogaW50ZXJuYWwgY29udGV4dCBoZWxwZXJzCSAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYwpAQCAtNjUyLDcgKzY1Miw3IEBACiAKIC8qIHBpcGVmcyBkZW50cmllcyBmb3IgZWFjaCBtZWNoYW5pc21zICovCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVfcGlwZXNbTUVDSF9NQVhdID0geyBOVUxMLCB9OwotLyogYWxsIHVwY2FsbCBtZXNzZ2FlcyBsaW5rZWQgaGVyZSAqLworLyogYWxsIHVwY2FsbCBtZXNzYWdlcyBsaW5rZWQgaGVyZSAqLwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdXBjYWxsX2xpc3RzW01FQ0hfTUFYXTsKIC8qIGFuZCBwcm90ZWN0ZWQgYnkgdGhpcyAqLwogc3RhdGljIHNwaW5sb2NrX3QgdXBjYWxsX2xvY2tzW01FQ0hfTUFYXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3N2Y191cGNhbGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3MvZ3NzX3N2Y191cGNhbGwuYwppbmRleCA1YjUzNjViLi4zNTljNDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZ3NzL2dzc19zdmNfdXBjYWxsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9nc3Nfc3ZjX3VwY2FsbC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJbGVuKys7CiAKIAkJaWYgKChsZW4gJiAoQklUU19QRVJfTE9ORy84LTEpKSA9PSAwKQotCQkJaGFzaCA9IGNmc19oYXNoX2xvbmcoaGFzaF5sLCBCSVRTX1BFUl9MT05HKTsKKwkJCWhhc2ggPSBoYXNoX2xvbmcoaGFzaF5sLCBCSVRTX1BFUl9MT05HKTsKIAl9IHdoaWxlIChsZW4pOwogCiAJcmV0dXJuIGhhc2ggPj4gKEJJVFNfUEVSX0xPTkcgLSBiaXRzKTsKQEAgLTU4Niw3ICs1ODYsNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJLyogY3VycmVudGx5IHRoZSBleHBpcnkgdGltZSBwYXNzZWQgZG93biBmcm9tIHVzZXItc3BhY2UKLQkJICogaXMgaW52YWxpZCwgaGVyZSB3ZSByZXRyaXZlIGl0IGZyb20gbWVjaC4gKi8KKwkJICogaXMgaW52YWxpZCwgaGVyZSB3ZSByZXRyaWV2ZSBpdCBmcm9tIG1lY2guICovCiAJCWlmIChsZ3NzX2lucXVpcmVfY29udGV4dChyc2NpLmN0eC5nc2NfbWVjaGN0eCwgJmN0eF9leHBpcnkpKSB7CiAJCQlDRVJST1IoInVuYWJsZSB0byBnZXQgZXhwaXJlIHRpbWUsIGRyb3AgaXRcbiIpOwogCQkJZ290byBvdXQ7CkBAIC04ODAsNyArODgwLDcgQEAKIAogCWNhY2hlX2dldCgmcnNpcC0+aCk7IC8qIHRha2UgYW4gZXh0cmEgcmVmICovCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcnNpcC0+d2FpdHEpOwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZSgmcnNpcC0+d2FpdHEsICZ3YWl0KTsKIAogY2FjaGVfY2hlY2s6CkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCSAqIHRoZSBpbml0IHVwY2FsbCBjaGFubmVsLCBvdGhlcndpc2UgdGhlcmUncyBiaWcgY2hhbmNlIHRoYXQgdGhlIGZpcnN0CiAJICogdXBjYWxsIGlzc3VlZCBiZWZvcmUgdGhlIGNoYW5uZWwgYmUgb3BlbmVkIHRodXMgbmZzdjQgY2FjaGUgY29kZSB3aWxsCiAJICogZHJvcCB0aGUgcmVxdWVzdCBkaXJlY2x0eSwgdGh1cyBsZWFkIHRvIHVubmVjZXNzYXJ5IHJlY292ZXJ5IHRpbWUuCi0JICogaGVyZSB3ZSB3YWl0IGF0IG1peGltdW0gMS41IHNlY29uZHMuICovCisJICogaGVyZSB3ZSB3YWl0IGF0IG1heGltdW0gMS41IHNlY29uZHMuICovCiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogCQlpZiAoYXRvbWljX3JlYWQoJnJzaV9jYWNoZS5yZWFkZXJzKSA+IDApCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9nc3Mvc2VjX2dzcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9zZWNfZ3NzLmMKaW5kZXggOGNlNjI3MS4uMzgzNjAxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9zZWNfZ3NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2dzcy9zZWNfZ3NzLmMKQEAgLTM4Miw3ICszODIsNyBAQAogCS8qIEF0IHRoaXMgcG9pbnQgdGhpcyBjdHggbWlnaHQgaGF2ZSBiZWVuIG1hcmtlZCBhcyBkZWFkIGJ5CiAJICogc29tZW9uZSBlbHNlLCBpbiB3aGljaCBjYXNlIG5vYm9keSB3aWxsIG1ha2UgZnVydGhlciB1c2UKIAkgKiBvZiBpdC4gd2UgZG9uJ3QgY2FyZSwgYW5kIG1hcmsgaXQgVVBUT0RBVEUgd2lsbCBoZWxwCi0JICogZGVzdHJveWluZyBzZXJ2ZXIgc2lkZSBjb250ZXh0IHdoZW4gaXQgYmUgZGVzdHJvaWVkLiAqLworCSAqIGRlc3Ryb3lpbmcgc2VydmVyIHNpZGUgY29udGV4dCB3aGVuIGl0IGJlIGRlc3Ryb3llZC4gKi8KIAlzZXRfYml0KFBUTFJQQ19DVFhfVVBUT0RBVEVfQklULCAmY3R4LT5jY19mbGFncyk7CiAKIAlpZiAoc2VjX2lzX3JldmVyc2UoY3R4LT5jY19zZWMpKSB7CkBAIC02NzYsNyArNjc2LDcgQEAKIAkgKiBsZWFkIHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgZmFsbCBiZWhpbmQgdGhlIHdpbmRvdyBvbiBzZXJ2ZXIgYW5kCiAJICogYmUgZHJvcHBlZC4gYWxzbyBhcHBsaWVzIHRvIGdzc19jbGlfY3R4X3NlYWwoKS4KIAkgKgotCSAqIE5vdGU6IG51bGwgbW9kZSBkb3Nlbid0IGNoZWNrIHNlcXVlbmNlIG51bWJlci4gKi8KKwkgKiBOb3RlOiBudWxsIG1vZGUgZG9lc24ndCBjaGVjayBzZXF1ZW5jZSBudW1iZXIuICovCiAJaWYgKHN2YyAhPSBTUFRMUlBDX1NWQ19OVUxMICYmCiAJICAgIGF0b21pY19yZWFkKCZnY3R4LT5nY19zZXEpIC0gc2VxID4gR1NTX1NFUV9SRVBBQ0tfVEhSRVNIT0xEKSB7CiAJCWludCBiZWhpbmQgPSBhdG9taWNfcmVhZCgmZ2N0eC0+Z2Nfc2VxKSAtIHNlcTsKQEAgLTEyMTUsNyArMTIxNSw3IEBACiAJLyoKIAkgKiByZW1vdmUgVVBUT0RBVEUgZmxhZyBvZiByZXZlcnNlIGN0eCB0aHVzIHdlIHdvbid0IHNlbmQgZmluaSBycGMsCiAJICogdGhpcyBpcyB0byBhdm9pZCBwb3RlbnRpYWwgcHJvYmxlbXMgb2YgY2xpZW50IHNpZGUgcmV2ZXJzZSBzdmMgY3R4Ci0JICogYmUgbWlzLWRlc3Ryb3llZCBpbiB2YXJpb3VzIHJlY292ZXJ5IHNlbmFyaW9zLiBhbnl3YXkgY2xpZW50IGNhbgorCSAqIGJlIG1pcy1kZXN0cm95ZWQgaW4gdmFyaW91cyByZWNvdmVyeSBzY2VuYXJpb3MuIGFueXdheSBjbGllbnQgY2FuCiAJICogbWFuYWdlIGl0cyByZXZlcnNlIGN0eCB3ZWxsIGJ5IGFzc29jaWF0aW5nIGl0IHdpdGggaXRzIGJ1ZGR5IGN0eC4KIAkgKi8KIAlpZiAoc2VjX2lzX3JldmVyc2Uoc2VjKSkKQEAgLTE4ODIsNyArMTg4Miw3IEBACiAKIAlMQVNTRVJUKHJzLT5yc19tc2cgPT0gbHVzdHJlX21zZ19idWYocnMtPnJzX3JlcGJ1ZiwgMSwgMCkpOwogCi0JLyogZW1iZWRkZWQgbHVzdHJlX21zZyBtaWdodCBoYXZlIGJlZW4gc2hyaW5rZWQgKi8KKwkvKiBlbWJlZGRlZCBsdXN0cmVfbXNnIG1pZ2h0IGhhdmUgYmVlbiBzaHJ1bmsgKi8KIAlpZiAocmVxLT5ycV9yZXBsZW4gIT0gcnMtPnJzX3JlcGJ1Zi0+bG1fYnVmbGVuc1sxXSkKIAkJbHVzdHJlX3Nocmlua19tc2cocnMtPnJzX3JlcGJ1ZiwgMSwgcmVxLT5ycV9yZXBsZW4sIDEpOwogCkBAIC0yNTk2LDcgKzI1OTYsNyBAQAogCWludAkJICAgICAgbXNnbGVuLCByYzsKIAogCS8qIGdldCBjbGVhciBkYXRhIGxlbmd0aC4gbm90ZSBlbWJlZGRlZCBsdXN0cmVfbXNnIG1pZ2h0Ci0JICogaGF2ZSBiZWVuIHNocmlua2VkICovCisJICogaGF2ZSBiZWVuIHNocnVuayAqLwogCWlmIChyZXEtPnJxX3JlcGxlbiAhPSBsdXN0cmVfbXNnX2J1Zmxlbihycy0+cnNfcmVwYnVmLCAwKSkKIAkJbXNnbGVuID0gbHVzdHJlX3Nocmlua19tc2cocnMtPnJzX3JlcGJ1ZiwgMCwgcmVxLT5ycV9yZXBsZW4sIDEpOwogCWVsc2UKQEAgLTI3NjUsNyArMjc2NSw3IEBACiAJICogcmVwbGF5LgogCSAqCiAJICogZWFjaCByZXZlcnNlIHJvb3QgY3R4IHdpbGwgcmVjb3JkIGl0cyBsYXRlc3Qgc2VxdWVuY2UgbnVtYmVyIG9uIGl0cwotCSAqIGJ1ZGR5IHN2Y2N0eCBiZWZvcmUgYmUgZGVzdHJvaWVkLCBzbyBoZXJlIHdlIGNvbnRpbnVlIHVzZSBpdC4KKwkgKiBidWRkeSBzdmNjdHggYmVmb3JlIGJlIGRlc3Ryb3llZCwgc28gaGVyZSB3ZSBjb250aW51ZSB1c2UgaXQuCiAJICovCiAJYXRvbWljX3NldCgmY2xpX2djdHgtPmdjX3NlcSwgc3ZjX2djdHgtPmdzY19ydnNfc2VxKTsKIApAQCAtMjgzNiw3ICsyODM2LDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0X3N2Y191cGNhbGw7CiAKLQkvKiByZWdpc3RlciBwb2xpY3kgYWZ0ZXIgYWxsIG90aGVyIHN0dWZmIGJlIGludGlhbGl6ZWQsIGJlY2F1c2UgaXQKKwkvKiByZWdpc3RlciBwb2xpY3kgYWZ0ZXIgYWxsIG90aGVyIHN0dWZmIGJlIGluaXRpYWxpemVkLCBiZWNhdXNlIGl0CiAJICogbWlnaHQgYmUgaW4gdXNlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgcmVnaXN0cmF0aW9uLiAqLwogCiAJcmMgPSBnc3NfaW5pdF9rZXlyaW5nKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKaW5kZXggZjQ2NTU0Ny4uNTM3YWE2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYwpAQCAtNTYwLDE3ICs1NjAsMzAgQEAKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKLQlpZiAobGlzdF9lbXB0eSgmaW1wLT5pbXBfcmVwbGF5X2xpc3QpKQotCQlyZXR1cm4gMDsKLQl0bXAgPSBpbXAtPmltcF9yZXBsYXlfbGlzdC5uZXh0OwotCXJlcSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QsIHJxX3JlcGxheV9saXN0KTsKLQkqdHJhbnNubyA9IHJlcS0+cnFfdHJhbnNubzsKLQlpZiAocmVxLT5ycV90cmFuc25vID09IDApIHsKLQkJREVCVUdfUkVRKERfRVJST1IsIHJlcSwgInplcm8gdHJhbnNubyBpbiByZXBsYXkiKTsKLQkJTEJVRygpOworCS8qIFRoZSByZXF1ZXN0cyBpbiBjb21taXR0ZWRfbGlzdCBhbHdheXMgaGF2ZSBzbWFsbGVyIHRyYW5zbm9zIHRoYW4KKwkgKiB0aGUgcmVxdWVzdHMgaW4gcmVwbGF5X2xpc3QgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmltcC0+aW1wX2NvbW1pdHRlZF9saXN0KSkgeworCQl0bXAgPSBpbXAtPmltcF9jb21taXR0ZWRfbGlzdC5uZXh0OworCQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0LCBycV9yZXBsYXlfbGlzdCk7CisJCSp0cmFuc25vID0gcmVxLT5ycV90cmFuc25vOworCQlpZiAocmVxLT5ycV90cmFuc25vID09IDApIHsKKwkJCURFQlVHX1JFUShEX0VSUk9SLCByZXEsCisJCQkJICAiemVybyB0cmFuc25vIGluIGNvbW1pdHRlZF9saXN0Iik7CisJCQlMQlVHKCk7CisJCX0KKwkJcmV0dXJuIDE7CiAJfQotCi0JcmV0dXJuIDE7CisJaWYgKCFsaXN0X2VtcHR5KCZpbXAtPmltcF9yZXBsYXlfbGlzdCkpIHsKKwkJdG1wID0gaW1wLT5pbXBfcmVwbGF5X2xpc3QubmV4dDsKKwkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCwgcnFfcmVwbGF5X2xpc3QpOworCQkqdHJhbnNubyA9IHJlcS0+cnFfdHJhbnNubzsKKwkJaWYgKHJlcS0+cnFfdHJhbnNubyA9PSAwKSB7CisJCQlERUJVR19SRVEoRF9FUlJPUiwgcmVxLCAiemVybyB0cmFuc25vIGluIHJlcGxheV9saXN0Iik7CisJCQlMQlVHKCk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEwNDIsNyArMTA1NSw3IEBACiAJCQlpZiAoKG9jZC0+b2NkX2Nrc3VtX3R5cGVzICYKIAkJCSAgICAgY2tzdW1fdHlwZXNfc3VwcG9ydGVkX2NsaWVudCgpKSA9PSAwKSB7CiAJCQkJTENPTlNPTEVfV0FSTigiVGhlIG5lZ290aWF0aW9uIG9mIHRoZSBjaGVja3N1bSAiCi0JCQkJCSAgICAgICJhbG9ncml0aG0gdG8gdXNlIHdpdGggc2VydmVyICVzICIKKwkJCQkJICAgICAgImFsZ29yaXRobSB0byB1c2Ugd2l0aCBzZXJ2ZXIgJXMgIgogCQkJCQkgICAgICAiZmFpbGVkICgleC8leCksIGRpc2FibGluZyAiCiAJCQkJCSAgICAgICJjaGVja3N1bXNcbiIsCiAJCQkJCSAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCkBAIC0xMjYwLDcgKzEyNzMsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciBjbGllbnQtc2lkZSByZWNvdmVyeSBvbiBpbXBvcnQuCiAgKgotICogVHlwaWNhbHkgd2UgaGF2ZSB0d28gcG9zc2libHkgcGF0aHMuIElmIHdlIGNhbWUgdG8gc2VydmVyIGFuZCBpdCBpcyBub3QKKyAqIFR5cGljYWxseSB3ZSBoYXZlIHR3byBwb3NzaWJseSBwYXRocy4gSWYgd2UgY2FtZSB0byBzZXJ2ZXIgYW5kIGl0IGlzIG5vdAogICogaW4gcmVjb3ZlcnksIHdlIGp1c3QgZW50ZXIgSU1QX0VWSUNURUQgc3RhdGUsIGludmFsaWRhdGUgb3VyIGltcG9ydAogICogc3RhdGUgYW5kIHJlY29ubmVjdCBmcm9tIHNjcmF0Y2guCiAgKiBJZiB3ZSBjYW1lIHRvIHNlcnZlciB0aGF0IGlzIGluIHJlY292ZXJ5LCB3ZSBlbnRlciBJTVBfUkVQTEFZIGltcG9ydCBzdGF0ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYwppbmRleCBkZmNiNDEwLi40MWMxMmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jCkBAIC0yOTUsNyArMjk1LDggQEAKIAkmUk1GX1JFQ19SRUlOVCwKIAkmUk1GX0NBUEExLAogCSZSTUZfTkFNRSwKLQkmUk1GX0VBREFUQQorCSZSTUZfRUFEQVRBLAorCSZSTUZfRExNX1JFUQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICptZHRfc3dhcF9sYXlvdXRzW10gPSB7CkBAIC0yMTU0LDcgKzIxNTUsNyBAQAogICogcmVxdWVzdCAoaWYgdGhlIGNhbGxlciBpcyBleGVjdXRpbmcgb24gdGhlIHNlcnZlci1zaWRlKSBvciByZXBseSAoaWYgdGhlCiAgKiBjYWxsZXIgaXMgZXhlY3V0aW5nIG9uIHRoZSBjbGllbnQtc2lkZSkuCiAgKgotICogVGhpcyBmdW5jdGlvbiBjb252aWVuaWVudCBmb3IgdXNlIGlzIGNvZGUgdGhhdCBjb3VsZCBiZSBleGVjdXRlZCBvbiB0aGUKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVuaWVudCBmb3IgdXNlIGlzIGNvZGUgdGhhdCBjb3VsZCBiZSBleGVjdXRlZCBvbiB0aGUKICAqIGNsaWVudCBhbmQgc2VydmVyIGFsaWtlLgogICovCiBjb25zdCB2b2lkICpyZXFfY2Fwc3VsZV9vdGhlcl9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCmluZGV4IDFiZTk3ODYuLjU4ZjFjOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKQEAgLTYxNiw3ICs2MTYsNyBAQAogfQogCiAvKioKLSAqIFRoZSBsb25nZXN0IHZhbGlkIGNvbW1hbmQgc3RyaW5nIGlzIHRoZSBtYXhpdW0gcG9saWN5IG5hbWUgc2l6ZSwgcGx1cyB0aGUKKyAqIFRoZSBsb25nZXN0IHZhbGlkIGNvbW1hbmQgc3RyaW5nIGlzIHRoZSBtYXhpbXVtIHBvbGljeSBuYW1lIHNpemUsIHBsdXMgdGhlCiAgKiBsZW5ndGggb2YgdGhlICIgcmVnIiBzdWJzdHJpbmcKICAqLwogI2RlZmluZSBMUFJPQ0ZTX05SU19XUl9NQVhfQ01ECShOUlNfUE9MX05BTUVfTUFYICsgc2l6ZW9mKCIgcmVnIikgLSAxKQpAQCAtMTE4NCw3ICsxMTg0LDcgQEAKIAl9CiAJdG1wYnVmID0gY2ZzX2ZpcnN0c3RyKGtidWYsIG1pbl90KHVuc2lnbmVkIGxvbmcsIEJVRkxFTiAtIDEsIGNvdW50KSk7CiAJLyogS2x1ZGdlIGNvZGUoZGVhZGxvY2sgc2l0dWF0aW9uKTogdGhlIGxwcm9jZnMgbG9jayBoYXMgYmVlbiBoZWxkCi0JICogc2luY2UgdGhlIGNsaWVudCBpcyBldmljdGVkIGJ5IHdyaXR0aW5nIGNsaWVudCdzCisJICogc2luY2UgdGhlIGNsaWVudCBpcyBldmljdGVkIGJ5IHdyaXRpbmcgY2xpZW50J3MKIAkgKiB1dWlkL25pZCB0byBwcm9jZnMgImV2aWN0X2NsaWVudCIgZW50cnkuIEhvd2V2ZXIsCiAJICogb2JkX2V4cG9ydF9ldmljdF9ieV91dWlkKCkgd2lsbCBjYWxsIGxwcm9jZnNfcmVtb3ZlKCkgdG8gZGVzdHJveQogCSAqIHRoZSBwcm9jIGVudHJpZXMgdW5kZXIgdGhlIGJlaW5nIGRlc3Ryb3llZCBleHBvcnR7fSwgc28gSSBoYXZlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKaW5kZXggM2M2YmYyMy4uYTQ3YThkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAvKioKICAqIFNlbmQgcmVxdWVzdCByZXBseSBmcm9tIHJlcXVlc3QgXGEgcmVxIHJlcGx5IGJ1ZmZlci4KICAqIFxhIGZsYWdzIGRlZmluZXMgcmVwbHkgdHlwZXMKLSAqIFJldHVybnMgMCBvbiBzdWNlc3Mgb3IgZXJyb3IgY29kZQorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQogICovCiBpbnQgcHRscnBjX3NlbmRfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBmbGFncykKIHsKQEAgLTM4OSw3ICszODksNyBAQAogCSAqIHB0bHJwY19ib2R5IGluIHJlcGx5IGJ1ZmZlciB0byBwdGxycGNfYm9keV92Miwgb3RoZXJ3aXNlLCB0aGUKIAkgKiByZXBseSBidWZmZXIgb24gY2xpZW50IHdpbGwgYmUgb3ZlcmZsb3cuCiAJICoKLQkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbnZlciB3ZSBkcm9wIHRoZSBpbnRlcm9wcmFiaWxpdHkgd2l0aCBzdWNoIGNsaWVudC4KKwkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbmV2ZXIgd2UgZHJvcCB0aGUgaW50ZXJvcHJhYmlsaXR5IHdpdGggc3VjaCBjbGllbnQuCiAJICovCiAJcmVxLT5ycV9yZXBsZW4gPSBsdXN0cmVfc2hyaW5rX21zZyhyZXEtPnJxX3JlcG1zZywgMCwKIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keV92MiksIDEpOwpAQCAtNTExLDcgKzUxMSw5IEBACiAJCUNERUJVRyhEX0hBLCAibXV0aW5nIHJwYyBmb3IgZmFpbGVkIGltcCBvYmQgJXNcbiIsCiAJCSAgICAgICByZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lKTsKIAkJLyogdGhpcyBwcmV2ZW50cyB1cyBmcm9tIHdhaXRpbmcgaW4gcHRscnBjX3F1ZXVlX3dhaXQgKi8KKwkJc3Bpbl9sb2NrKCZyZXF1ZXN0LT5ycV9sb2NrKTsKIAkJcmVxdWVzdC0+cnFfZXJyID0gMTsKKwkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnJxX2xvY2spOwogCQlyZXF1ZXN0LT5ycV9zdGF0dXMgPSAtRU5PREVWOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC01NTMsNyArNTU1LDkgQEAKIAkJCWlmIChyYykgewogCQkJCS8qIHRoaXMgcHJldmVudHMgdXMgZnJvbSBsb29waW5nIGluCiAJCQkJICogcHRscnBjX3F1ZXVlX3dhaXQgKi8KKwkJCQlzcGluX2xvY2soJnJlcXVlc3QtPnJxX2xvY2spOwogCQkJCXJlcXVlc3QtPnJxX2VyciA9IDE7CisJCQkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnJxX2xvY2spOwogCQkJCXJlcXVlc3QtPnJxX3N0YXR1cyA9IHJjOwogCQkJCUdPVE8oY2xlYW51cF9idWxrLCByYyk7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbnJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbnJzLmMKaW5kZXggMGFiY2Q2ZC4uYmNiYTFjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ucnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbnJzLmMKQEAgLTEzMjIsNyArMTMyMiw3IEBACiAgKiBTZXR1cCBOUlMgaGVhZHMgb24gYWxsIHNlcnZpY2UgcGFydGl0aW9ucyBvZiBzZXJ2aWNlIFxhIHN2YywgYW5kIHJlZ2lzdGVyCiAgKiBhbGwgY29tcGF0aWJsZSBwb2xpY2llcyBvbiB0aG9zZSBOUlMgaGVhZHMuCiAgKgotICogVG8gYmUgY2FsbGVkIGZyb20gd2l0aGluZyBwdGwKKyAqIFRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBwdGwKICAqIFxwYXJhbVtpbl0gc3ZjIHRoZSBzZXJ2aWNlIHRvIHNldHVwCiAgKgogICogXHJldHZhbCAtdmUgZXJyb3IsIHRoZSBjYWxsaW5nIGxvZ2ljIHNob3VsZCBldmVudHVhbGx5IGNhbGwKQEAgLTE3MzYsNyArMTczNiw3IEBACiB9CiAKIC8qKgotICogUmVtb3ZlcyBhbGwgcG9saWN5IGRlc2NpcHRvcnMgZnJvbSBucnNfY29yZTo6bnJzX3BvbGljaWVzLCBhbmQgZnJlZXMgdGhlCisgKiBSZW1vdmVzIGFsbCBwb2xpY3kgZGVzY3JpcHRvcnMgZnJvbSBucnNfY29yZTo6bnJzX3BvbGljaWVzLCBhbmQgZnJlZXMgdGhlCiAgKiBwb2xpY3kgZGVzY3JpcHRvcnMuCiAgKgogICogU2luY2UgYWxsIFBUTFJQQyBzZXJ2aWNlcyBhcmUgc3RvcHBlZCBhdCB0aGlzIHBvaW50LCB0aGVyZSBhcmUgbm8gbW9yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCmluZGV4IDQ2NDQ3OWMuLjQ1YzBiODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCQkgKiB3aXRoIHRoZSBvbGQgY2xpZW50ICg8IDIuMykgd2hpY2ggZG9lc24ndCBoYXZlIHBiX2pvYmlkCiAJCSAqIGluIHRoZSBwdGxycGNfYm9keS4KIAkJICoKLQkJICogWFhYIFJlbW92ZSB0aGlzIHdoZW5ldmVyIHdlIGRvcnAgaW50ZXJvcHJhYmlsaXR5IHdpdGggc3VjaAorCQkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbmV2ZXIgd2UgZHJvcCBpbnRlcm9wcmFiaWxpdHkgd2l0aCBzdWNoCiAJCSAqICAgICBjbGllbnQuCiAJCSAqLwogCQlfX3UzMiBwYmxlbiA9IHNpemVvZihzdHJ1Y3QgcHRscnBjX2JvZHlfdjIpOwpAQCAtMjQ0LDE1ICsyNDQsNyBAQAogCUxBU1NFUlQobGVuc1tNU0dfUFRMUlBDX0JPRFlfT0ZGXSA9PSBzaXplb2Yoc3RydWN0IHB0bHJwY19ib2R5KSk7CiAKIAkvKiBvbmx5IHVzZSBuZXcgZm9ybWF0LCB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCAxLjQgKi8KLQltYWdpYyA9IExVU1RSRV9NU0dfTUFHSUNfVjI7Ci0KLQlzd2l0Y2ggKG1hZ2ljKSB7Ci0JY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOgotCQlyZXR1cm4gbHVzdHJlX3BhY2tfcmVxdWVzdF92MihyZXEsIGNvdW50LCBsZW5zLCBidWZzKTsKLQlkZWZhdWx0OgotCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1hZ2ljKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXJldHVybiBsdXN0cmVfcGFja19yZXF1ZXN0X3YyKHJlcSwgY291bnQsIGxlbnMsIGJ1ZnMpOwogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfcGFja19yZXF1ZXN0KTsKIApAQCAtMTU0NSw3ICsxNTM3LDcgQEAKIAkJX191MzIgb3BjID0gbHVzdHJlX21zZ19nZXRfb3BjKG1zZyk7CiAJCXN0cnVjdCBwdGxycGNfYm9keSAqcGI7CiAKLQkJLyogRG9uJ3Qgc2V0IGpvYmlkIGZvciBsZGxtIGFzdCBSUENzLCB0aGV5J3ZlIGJlZW4gc2hyaW5rZWQuCisJCS8qIERvbid0IHNldCBqb2JpZCBmb3IgbGRsbSBhc3QgUlBDcywgdGhleSd2ZSBiZWVuIHNocnVuay4KIAkJICogU2VlIHRoZSBjb21tZW50IGluIHB0bHJwY19yZXF1ZXN0X3BhY2soKS4gKi8KIAkJaWYgKCFvcGMgfHwgb3BjID09IExETE1fQkxfQ0FMTEJBQ0sgfHwKIAkJICAgIG9wYyA9PSBMRExNX0NQX0NBTExCQUNLIHx8IG9wYyA9PSBMRExNX0dMX0NBTExCQUNLKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKaW5kZXggMmQyNmZkNS4uY2E3MzRjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCkBAIC0yMjksNyArMjI5LDcgQEAKIAkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiAJCWxfd2FpdF9ldmVudChyZXEtPnJxX3NldF93YWl0cSwgKHJlcS0+cnFfc2V0ID09IE5VTEwpLCAmbHdpKTsKIAl9IGVsc2UgaWYgKHJlcS0+cnFfc2V0KSB7Ci0JCS8qIElmIHdlIGhhdmUgYSB2YWlkICJycV9zZXQiLCBqdXN0IHJldXNlIGl0IHRvIGF2b2lkIGRvdWJsZQorCQkvKiBJZiB3ZSBoYXZlIGEgdmFsaWQgInJxX3NldCIsIGp1c3QgcmV1c2UgaXQgdG8gYXZvaWQgZG91YmxlCiAJCSAqIGxpbmtlZC4gKi8KIAkJTEFTU0VSVChyZXEtPnJxX3BoYXNlID09IFJRX1BIQVNFX05FVyk7CiAJCUxBU1NFUlQocmVxLT5ycV9zZW5kX3N0YXRlID09IExVU1RSRV9JTVBfUkVQTEFZKTsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogICogICAgICBiZSBiZXR0ZXIuIEJ1dCBpdCBicmVha3MgZm9ybWVyIGRhdGEgdHJhbnNmZXIgcG9saWN5LgogICoKICAqICAgICAgU28gd2Ugc2hvdWxkbid0IGJlIGJsaW5kIGZvciBhdm9pZGluZyB0aGUgZGF0YSB0cmFuc2Zlci4gV2UgbWFrZSBzb21lCi0gKiAgICAgIGNvbXByb21pc2U6IGRpdmlkZSB0aGUgcHRscnBjZCB0aHJlZHMgcG9vbCBpbnRvIHR3byBwYXJ0cy4gT25lIHBhcnQgaXMKKyAqICAgICAgY29tcHJvbWlzZTogZGl2aWRlIHRoZSBwdGxycGNkIHRocmVhZHMgcG9vbCBpbnRvIHR3byBwYXJ0cy4gT25lIHBhcnQgaXMKICAqICAgICAgZm9yIGJvdW5kIG1vZGUsIGVhY2ggcHRscnBjZCB0aHJlYWQgaW4gdGhpcyBwYXJ0IGlzIGJvdW5kIHRvIHNvbWUgQ1BVCiAgKiAgICAgIGNvcmUuIFRoZSBvdGhlciBwYXJ0IGlzIGZvciBmcmVlIG1vZGUsIGFsbCB0aGUgcHRscnBjZCB0aHJlYWRzIGluIHRoZQogICogICAgICBwYXJ0IGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IENQVSBjb3JlLiBXZSBzcGVjaWZ5IHNvbWUgcGFydG5lcnNoaXAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jCmluZGV4IDg0YzM5ZTAuLjQ4YWUzMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3JlY292ZXIuYwpAQCAtMTA1LDI0ICsxMDUsNTkgQEAKIAkgKiBpbXBfbG9jayBpcyBiZWluZyBoZWxkIGJ5IHB0bHJwY19yZXBsYXksIGJ1dCBpdCdzIG5vdC4gaXQncwogCSAqIGp1c3QgYSBsaXR0bGUgcmFjZS4uLgogCSAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHBvcywgJmltcC0+aW1wX3JlcGxheV9saXN0KSB7CisKKwkvKiBSZXBsYXkgYWxsIHRoZSBjb21taXR0ZWQgb3BlbiByZXF1ZXN0cyBvbiBjb21taXR0ZWRfbGlzdCBmaXJzdCAqLworCWlmICghbGlzdF9lbXB0eSgmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3QpKSB7CisJCXRtcCA9IGltcC0+aW1wX2NvbW1pdHRlZF9saXN0LnByZXY7CiAJCXJlcSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QsCiAJCQkJICAgICBycV9yZXBsYXlfbGlzdCk7CiAKLQkJLyogSWYgbmVlZCB0byByZXNlbmQgdGhlIGxhc3Qgc2VudCB0cmFuc25vIChiZWNhdXNlIGEKLQkJICAgcmVjb25uZWN0IGhhcyBvY2N1cnJlZCksIHRoZW4gc3RvcCBvbiB0aGUgbWF0Y2hpbmcKLQkJICAgcmVxIGFuZCBzZW5kIGl0IGFnYWluLiBJZiwgaG93ZXZlciwgdGhlIGxhc3Qgc2VudAotCQkgICB0cmFuc25vIGhhcyBiZWVuIGNvbW1pdHRlZCB0aGVuIHdlIGNvbnRpbnVlIHJlcGxheQotCQkgICBmcm9tIHRoZSBuZXh0IHJlcXVlc3QuICovCisJCS8qIFRoZSBsYXN0IHJlcXVlc3Qgb24gY29tbWl0dGVkX2xpc3QgaGFzbid0IGJlZW4gcmVwbGF5ZWQgKi8KIAkJaWYgKHJlcS0+cnFfdHJhbnNubyA+IGxhc3RfdHJhbnNubykgewotCQkJaWYgKGltcC0+aW1wX3Jlc2VuZF9yZXBsYXkpCi0JCQkJbHVzdHJlX21zZ19hZGRfZmxhZ3MocmVxLT5ycV9yZXFtc2csCi0JCQkJCQkgICAgIE1TR19SRVNFTlQpOwotCQkJYnJlYWs7CisJCQkvKiBTaW5jZSB0aGUgaW1wX2NvbW1pdHRlZF9saXN0IGlzIGltbXV0YWJsZSBiZWZvcmUKKwkJCSAqIGFsbCBvZiBpdCdzIHJlcXVlc3RzIGJlaW5nIHJlcGxheWVkLCBpdCdzIHNhZmUgdG8KKwkJCSAqIHVzZSBhIGN1cnNvciB0byBhY2NlbGVyYXRlIHRoZSBzZWFyY2ggKi8KKwkJCWltcC0+aW1wX3JlcGxheV9jdXJzb3IgPSBpbXAtPmltcF9yZXBsYXlfY3Vyc29yLT5uZXh0OworCisJCQl3aGlsZSAoaW1wLT5pbXBfcmVwbGF5X2N1cnNvciAhPQorCQkJICAgICAgICZpbXAtPmltcF9jb21taXR0ZWRfbGlzdCkgeworCQkJCXJlcSA9IGxpc3RfZW50cnkoaW1wLT5pbXBfcmVwbGF5X2N1cnNvciwKKwkJCQkJCSBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QsCisJCQkJCQkgcnFfcmVwbGF5X2xpc3QpOworCQkJCWlmIChyZXEtPnJxX3RyYW5zbm8gPiBsYXN0X3RyYW5zbm8pCisJCQkJCWJyZWFrOworCisJCQkJcmVxID0gTlVMTDsKKwkJCQlpbXAtPmltcF9yZXBsYXlfY3Vyc29yID0KKwkJCQkJaW1wLT5pbXBfcmVwbGF5X2N1cnNvci0+bmV4dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEFsbCByZXF1ZXN0cyBvbiBjb21taXR0ZWRfbGlzdCBoYXZlIGJlZW4gcmVwbGF5ZWQgKi8KKwkJCWltcC0+aW1wX3JlcGxheV9jdXJzb3IgPSAmaW1wLT5pbXBfY29tbWl0dGVkX2xpc3Q7CisJCQlyZXEgPSBOVUxMOwogCQl9Ci0JCXJlcSA9IE5VTEw7CiAJfQogCisJLyogQWxsIHRoZSByZXF1ZXN0cyBpbiBjb21taXR0ZWQgbGlzdCBoYXZlIGJlZW4gcmVwbGF5ZWQsIGxldCdzIHJlcGxheQorCSAqIHRoZSBpbXBfcmVwbGF5X2xpc3QgKi8KKwlpZiAocmVxID09IE5VTEwpIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgcG9zLCAmaW1wLT5pbXBfcmVwbGF5X2xpc3QpIHsKKwkJCXJlcSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QsCisJCQkJCSBycV9yZXBsYXlfbGlzdCk7CisKKwkJCWlmIChyZXEtPnJxX3RyYW5zbm8gPiBsYXN0X3RyYW5zbm8pCisJCQkJYnJlYWs7CisJCQlyZXEgPSBOVUxMOworCQl9CisJfQorCisJLyogSWYgbmVlZCB0byByZXNlbmQgdGhlIGxhc3Qgc2VudCB0cmFuc25vIChiZWNhdXNlIGEgcmVjb25uZWN0CisJICogaGFzIG9jY3VycmVkKSwgdGhlbiBzdG9wIG9uIHRoZSBtYXRjaGluZyByZXEgYW5kIHNlbmQgaXQgYWdhaW4uCisJICogSWYsIGhvd2V2ZXIsIHRoZSBsYXN0IHNlbnQgdHJhbnNubyBoYXMgYmVlbiBjb21taXR0ZWQgdGhlbiB3ZQorCSAqIGNvbnRpbnVlIHJlcGxheSBmcm9tIHRoZSBuZXh0IHJlcXVlc3QuICovCisJaWYgKHJlcSAhPSBOVUxMICYmIGltcC0+aW1wX3Jlc2VuZF9yZXBsYXkpCisJCWx1c3RyZV9tc2dfYWRkX2ZsYWdzKHJlcS0+cnFfcmVxbXNnLCBNU0dfUkVTRU5UKTsKKwogCXNwaW5fbG9jaygmaW1wLT5pbXBfbG9jayk7CiAJaW1wLT5pbXBfcmVzZW5kX3JlcGxheSA9IDA7CiAJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlYy5jCmluZGV4IDk2MmIzMWQuLmQ4MDQxODA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlYy5jCkBAIC01NDMsOCArNTQzLDggQEAKIAkJICAgICAgICJjdHggKCVwLCBmbCAlbHgpIGRvZXNuJ3Qgc3dpdGNoLCByZWxheCBhIGxpdHRsZSBiaXRcbiIsCiAJCSAgICAgICBuZXdjdHgsIG5ld2N0eC0+Y2NfZmxhZ3MpOwogCi0JCXNjaGVkdWxlX3RpbWVvdXRfYW5kX3NldF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUsCi0JCQkJCQkgICBIWik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFopOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIGl0J3MgcG9zc2libGUgbmV3Y3R4ID09IG9sZGN0eCBpZiB3ZSdyZSBzd2l0Y2hpbmcKQEAgLTc3OSw3ICs3NzksNyBAQAogCSAqICAgZS5nLiBwdGxycGNfYWJvcnRfaW5mbGlnaHQoKTsKIAkgKi8KIAlpZiAoIWNsaV9jdHhfaXNfcmVmcmVzaGVkKGN0eCkpIHsKLQkJLyogdGltZWQgb3V0IG9yIGludGVycnVwdHRlZCAqLworCQkvKiB0aW1lZCBvdXQgb3IgaW50ZXJydXB0ZWQgKi8KIAkJcmVxX29mZl9jdHhfbGlzdChyZXEsIGN0eCk7CiAKIAkJTEFTU0VSVChyYyAhPSAwKTsKQEAgLTgwNSw3ICs4MDUsNyBAQAogCUxBU1NFUlQocmVxLT5ycV9jbGlfY3R4LT5jY19zZWMpOwogCUxBU1NFUlQocmVxLT5ycV9idWxrX3JlYWQgPT0gMCB8fCByZXEtPnJxX2J1bGtfd3JpdGUgPT0gMCk7CiAKLQkvKiBzcGVjaWFsIHNlY3VyaXR5IGZsYWdzIGFjY29kaW5nIHRvIG9wY29kZSAqLworCS8qIHNwZWNpYWwgc2VjdXJpdHkgZmxhZ3MgYWNjb3JkaW5nIHRvIG9wY29kZSAqLwogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBPU1RfUkVBRDoKIAljYXNlIE1EU19SRUFEUEFHRToKQEAgLTEyMTgsNyArMTIxOCw3IEBACiAJTEFTU0VSVF9BVE9NSUNfWkVSTygmc2VjLT5wc19uY3R4KTsKIAlMQVNTRVJUKHBvbGljeS0+c3BfY29wcy0+ZGVzdHJveV9zZWMpOwogCi0JQ0RFQlVHKERfU0VDLCAiJXNAJXA6IGJlaW5nIGRlc3Ryb2llZFxuIiwgc2VjLT5wc19wb2xpY3ktPnNwX25hbWUsIHNlYyk7CisJQ0RFQlVHKERfU0VDLCAiJXNAJXA6IGJlaW5nIGRlc3Ryb3llZFxuIiwgc2VjLT5wc19wb2xpY3ktPnNwX25hbWUsIHNlYyk7CiAKIAlwb2xpY3ktPnNwX2NvcHMtPmRlc3Ryb3lfc2VjKHNlYyk7CiAJc3B0bHJwY19wb2xpY3lfcHV0KHBvbGljeSk7CkBAIC0xMjY0LDcgKzEyNjQsNyBAQAogRVhQT1JUX1NZTUJPTChzcHRscnBjX3NlY19wdXQpOwogCiAvKgotICogcG9saWN5IG1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHJlZnJlbmNlIG9mIGltcG9ydAorICogcG9saWN5IG1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHJlZmVyZW5jZSBvZiBpbXBvcnQKICAqLwogc3RhdGljCiBzdHJ1Y3QgcHRscnBjX3NlYyAqIHNwdGxycGNfc2VjX2NyZWF0ZShzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLApAQCAtMTQxOSw3ICsxNDE5LDcgQEAKIAogCQlzcCA9IGltcC0+aW1wX29iZC0+dS5jbGkuY2xfc3BfbWU7CiAJfSBlbHNlIHsKLQkJLyogcmV2ZXJzZSBpbXBvcnQsIGRldGVybWluZSBmbGF2b3IgZnJvbSBpbmNvbWluZyByZXFldXN0ICovCisJCS8qIHJldmVyc2UgaW1wb3J0LCBkZXRlcm1pbmUgZmxhdm9yIGZyb20gaW5jb21pbmcgcmVxdWVzdCAqLwogCQlzZiA9ICpmbHZyOwogCiAJCWlmIChzZi5zZl9ycGMgIT0gU1BUTFJQQ19GTFZSX05VTEwpCkBAIC0yMDU3LDcgKzIwNTcsNyBAQAogCiAJLyoKIAkgKiBpZiBpdCdzIG5vdCBudWxsIGZsYXZvciAod2hpY2ggbWVhbnMgZW1iZWRkZWQgcGFja2luZyBtc2cpLAotCSAqIHJlc2V0IHRoZSBzd2FiIG1hc2sgZm9yIHRoZSBjb21taW5nIGlubmVyIG1zZyB1bnBhY2tpbmcuCisJICogcmVzZXQgdGhlIHN3YWIgbWFzayBmb3IgdGhlIGNvbWluZyBpbm5lciBtc2cgdW5wYWNraW5nLgogCSAqLwogCWlmIChTUFRMUlBDX0ZMVlJfUE9MSUNZKHJlcS0+cnFfZmx2ci5zZl9ycGMpICE9IFNQVExSUENfUE9MSUNZX05VTEwpCiAJCXJlcS0+cnFfcmVxX3N3YWJfbWFzayA9IDA7CkBAIC0yMTA4LDcgKzIxMDgsNyBAQAogLyoqCiAgKiBVc2VkIGJ5IHB0bHJwYyBzZXJ2ZXIsIHRvIHBlcmZvcm0gdHJhbnNmb3JtYXRpb24gdXBvbiByZXBseSBtZXNzYWdlLgogICoKLSAqIFxwb3N0IHJlcS0+cnFfcmVwbHlfb2ZmIGlzIHNldCB0byBhcHByb3JpYXRlIHNlcnZlci1jb250cm9sbGVkIHJlcGx5IG9mZnNldC4KKyAqIFxwb3N0IHJlcS0+cnFfcmVwbHlfb2ZmIGlzIHNldCB0byBhcHByb3ByaWF0ZSBzZXJ2ZXItY29udHJvbGxlZCByZXBseSBvZmZzZXQuCiAgKiBccG9zdCByZXEtPnJxX3JlcG1zZyBhbmQgcmVxLT5ycV9yZXBseV9zdGF0ZS0+cnNfbXNnIGJlY29tZXMgaW5hY2Nlc3NpYmxlLgogICovCiBpbnQgc3B0bHJwY19zdmNfd3JhcF9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMKaW5kZXggMzE2MTAzYS4uOTY1NjY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXVuc2lnbmVkIGxvbmcgICAgZXBwX3N0X21pc3NpbmdzOyAgICAgICAvKiAjIG9mIGNhY2hlIG1pc3NpbmcgKi8KIAl1bnNpZ25lZCBsb25nICAgIGVwcF9zdF9sb3dmcmVlOwkvKiBsb3dlc3QgZnJlZSBwYWdlcyByZWFjaGVkICovCiAJdW5zaWduZWQgaW50ICAgICBlcHBfc3RfbWF4X3dxbGVuOyAgICAgIC8qIGhpZ2hlc3Qgd2FpdHF1ZXVlIGxlbmd0aCAqLwotCWNmc190aW1lX3QgICAgICAgZXBwX3N0X21heF93YWl0OyAgICAgICAvKiBpbiBqZWZmaWVzICovCisJY2ZzX3RpbWVfdCAgICAgICBlcHBfc3RfbWF4X3dhaXQ7ICAgICAgIC8qIGluIGppZmZpZXMgKi8KIAkvKgogCSAqIHBvaW50ZXJzIHRvIHBvb2xzCiAJICovCkBAIC01NDUsMTEgKzU0NSwxMSBAQAogCQkJCQkJcGFnZV9wb29scy5lcHBfd2FpdHFsZW47CiAKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJCWluaXRfd2FpdHF1ZXVlX2VudHJ5X2N1cnJlbnQoJndhaXRsaW5rKTsKKwkJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0bGluaywgY3VycmVudCk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmcGFnZV9wb29scy5lcHBfd2FpdHEsICZ3YWl0bGluayk7CiAKIAkJCXNwaW5fdW5sb2NrKCZwYWdlX3Bvb2xzLmVwcF9sb2NrKTsKLQkJCXdhaXRxX3dhaXQoJndhaXRsaW5rLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZSgpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBhZ2VfcG9vbHMuZXBwX3dhaXRxLCAmd2FpdGxpbmspOwogCQkJTEFTU0VSVChwYWdlX3Bvb2xzLmVwcF93YWl0cWxlbiA+IDApOwogCQkJc3Bpbl9sb2NrKCZwYWdlX3Bvb2xzLmVwcF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jCmluZGV4IDZjYzNmMjMuLmJmNTYxMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19jb25maWcuYwpAQCAtMjU1LDcgKzI1NSw3IEBACiBFWFBPUlRfU1lNQk9MKHNwdGxycGNfcnVsZV9zZXRfZnJlZSk7CiAKIC8qCi0gKiByZXR1cm4gMCBpZiB0aGUgcnVsZSBzZXQgY291bGQgYWNjb21vZGF0ZSBvbmUgbW9yZSBydWxlLgorICogcmV0dXJuIDAgaWYgdGhlIHJ1bGUgc2V0IGNvdWxkIGFjY29tbW9kYXRlIG9uZSBtb3JlIHJ1bGUuCiAgKi8KIGludCBzcHRscnBjX3J1bGVfc2V0X2V4cGFuZChzdHJ1Y3Qgc3B0bHJwY19ydWxlX3NldCAqcnNldCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCmluZGV4IDU5MGZhOGQuLjE5MmFkZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIC8qKgogICogUGFydCBvZiBSZXAtQWNrIGxvZ2ljLgotICogUHV0cyBhIGxvY2sgYW5kIGl0cyBtb2RlIGludG8gcmVwbHkgc3RhdGUgYXNzb3RpYXRlZCB0byByZXF1ZXN0IHJlcGx5LgorICogUHV0cyBhIGxvY2sgYW5kIGl0cyBtb2RlIGludG8gcmVwbHkgc3RhdGUgYXNzb2NpYXRlZCB0byByZXF1ZXN0IHJlcGx5LgogICovCiB2b2lkCiBwdGxycGNfc2F2ZV9sb2NrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLApAQCAtMjUyLDcgKzI1Miw3IEBACiBzdGF0aWMgc3RydWN0IHB0bHJwY19ocl9zZXJ2aWNlCQlwdGxycGNfaHI7CiAKIC8qKgotICogbWF4aW11bSBtdW1iZXIgb2YgcmVwbGllcyBzY2hlZHVsZWQgaW4gb25lIGJhdGNoCisgKiBtYXhpbXVtIG51bWJlciBvZiByZXBsaWVzIHNjaGVkdWxlZCBpbiBvbmUgYmF0Y2gKICAqLwogI2RlZmluZSBNQVhfU0NIRURVTEVEIDI1NgogCkBAIC02MTIsNyArNjEyLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmc3ZjcHQtPnNjcF9oaXN0X3JlcXMpOwogCUlOSVRfTElTVF9IRUFEKCZzdmNwdC0+c2NwX2hpc3RfcnFiZHMpOwogCi0JLyogYWNpdHZlIHJlcXVlc3RzIGFuZCBocCByZXF1ZXN0cyAqLworCS8qIGFjdGl2ZSByZXF1ZXN0cyBhbmQgaHAgcmVxdWVzdHMgKi8KIAlzcGluX2xvY2tfaW5pdCgmc3ZjcHQtPnNjcF9yZXFfbG9jayk7CiAKIAkvKiByZXBseSBzdGF0ZXMgKi8KQEAgLTc1Miw3ICs3NTIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZzZXJ2aWNlLT5zcnZfbG9jayk7CiAJc2VydmljZS0+c3J2X25hbWUJCT0gY29uZi0+cHNjX25hbWU7CiAJc2VydmljZS0+c3J2X3dhdGNoZG9nX2ZhY3Rvcgk9IGNvbmYtPnBzY193YXRjaGRvZ19mYWN0b3I7Ci0JSU5JVF9MSVNUX0hFQUQoJnNlcnZpY2UtPnNydl9saXN0KTsgLyogZm9yIHNhZnR5IG9mIGNsZWFudXAgKi8KKwlJTklUX0xJU1RfSEVBRCgmc2VydmljZS0+c3J2X2xpc3QpOyAvKiBmb3Igc2FmZXR5IG9mIGNsZWFudXAgKi8KIAogCS8qIGJ1ZmZlciBjb25maWd1cmF0aW9uICovCiAJc2VydmljZS0+c3J2X25idWZfcGVyX2dyb3VwCT0gdGVzdF9yZXFfYnVmZmVyX3ByZXNzdXJlID8KQEAgLTE5ODIsNyArMTk4Miw3IEBACiAJZG9fZ2V0dGltZW9mZGF5KCZ3b3JrX2VuZCk7CiAJdGltZWRpZmYgPSBjZnNfdGltZXZhbF9zdWIoJndvcmtfZW5kLCAmd29ya19zdGFydCwgTlVMTCk7CiAJQ0RFQlVHKERfUlBDVFJBQ0UsICJIYW5kbGVkIFJQQyBwbmFtZTpjbHV1aWQrcmVmOnBpZDp4aWQ6bmlkOm9wYyAiCi0JICAgICAgICIlczolcyslZDolZDp4IkxQVTY0IjolczolZCBSZXF1ZXN0IHByb2Nlc2VkIGluICIKKwkgICAgICAgIiVzOiVzKyVkOiVkOngiTFBVNjQiOiVzOiVkIFJlcXVlc3QgcHJvY2Vzc2VkIGluICIKIAkgICAgICAgIiVsZHVzICglbGR1cyB0b3RhbCkgdHJhbnMgIkxQVTY0IiByYyAlZC8lZFxuIiwKIAkJY3VycmVudF9jb21tKCksCiAJCShyZXF1ZXN0LT5ycV9leHBvcnQgPwpAQCAtMjczNiw3ICsyNzM2LDcgQEAKIAkJc3Bpbl9sb2NrKCZzdmNwdC0+c2NwX2xvY2spOwogCQktLXN2Y3B0LT5zY3BfbnRocnNfc3RhcnRpbmc7CiAJCWlmICh0aHJlYWRfaXNfc3RvcHBpbmcodGhyZWFkKSkgewotCQkJLyogdGhpcyBwdGxycGNfdGhyZWFkIGlzIGJlaW5nIGhhbmxlZAorCQkJLyogdGhpcyBwdGxycGNfdGhyZWFkIGlzIGJlaW5nIGhhbmRsZWQKIAkJCSAqIGJ5IHB0bHJwY19zdmNwdF9zdG9wX3RocmVhZHMgbm93CiAJCQkgKi8KIAkJCXRocmVhZF9hZGRfZmxhZ3ModGhyZWFkLCBTVkNfU1RPUFBFRCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCmluZGV4IDNhYTQ0NTkuLjNjODg0NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCkBAIC0xMTUyLDYgKzExNTIsOCBAQAogCQkgT0JEX0NPTk5FQ1RfU0hPUlRJTyk7CiAJTEFTU0VSVEYoT0JEX0NPTk5FQ1RfUElOR0xFU1MgPT0gMHg0MDAwMDAwMDAwMDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAogCQkgT0JEX0NPTk5FQ1RfUElOR0xFU1MpOworCUxBU1NFUlRGKE9CRF9DT05ORUNUX0ZMT0NLX0RFQUQgPT0gMHg4MDAwMDAwMDAwMDAwVUxMLAorCQkgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwgT0JEX0NPTk5FQ1RfRkxPQ0tfREVBRCk7CiAJTEFTU0VSVEYoT0JEX0NLU1VNX0NSQzMyID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAogCQkodW5zaWduZWQpT0JEX0NLU1VNX0NSQzMyKTsKIAlMQVNTRVJURihPQkRfQ0tTVU1fQURMRVIgPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmgKaW5kZXggNjJiOTc5NS4uNTYzOGIxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2hhbmRsZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9oYW5kbGUuaApAQCAtMjgsMjYgKzI4LDI2IEBACiAjZGVmaW5lIFJFR01PREUzMgkzMgogCiBzdHJ1Y3QgYXMxMDJfcHJpdl9vcHNfdCB7Ci0JaW50ICgqdXBsb2FkX2Z3X3BrdCkgKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwlpbnQgKCp1cGxvYWRfZndfcGt0KShzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCiAJCQkgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4sIGludCBzd2FwMzIpOwogCi0JaW50ICgqc2VuZF9jbWQpIChzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJaW50ICgqc2VuZF9jbWQpKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKIAkJCSB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4pOwogCi0JaW50ICgqeGZlcl9jbWQpIChzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJaW50ICgqeGZlcl9jbWQpKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKIAkJCSB1bnNpZ25lZCBjaGFyICpzZW5kX2J1ZiwgaW50IHNlbmRfYnVmX2xlbiwKIAkJCSB1bnNpZ25lZCBjaGFyICpyZWN2X2J1ZiwgaW50IHJlY3ZfYnVmX2xlbik7CiAKLQlpbnQgKCpzdGFydF9zdHJlYW0pIChzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7Ci0Jdm9pZCAoKnN0b3Bfc3RyZWFtKSAoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOworCWludCAoKnN0YXJ0X3N0cmVhbSkoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOworCXZvaWQgKCpzdG9wX3N0cmVhbSkoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOwogCi0JaW50ICgqcmVzZXRfdGFyZ2V0KSAoc3RydWN0IGFzMTB4X2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwKTsKKwlpbnQgKCpyZXNldF90YXJnZXQpKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCk7CiAKIAlpbnQgKCpyZWFkX3dyaXRlKShzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsIHVpbnQ4X3QgbW9kZSwKIAkJCSAgdWludDMyX3QgcmRfYWRkciwgdWludDE2X3QgcmRfbGVuLAogCQkJICB1aW50MzJfdCB3cl9hZGRyLCB1aW50MTZfdCB3cl9sZW4pOwogCi0JaW50ICgqYXMxMDJfcmVhZF9lcDIpIChzdHJ1Y3QgYXMxMHhfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJaW50ICgqYXMxMDJfcmVhZF9lcDIpKHN0cnVjdCBhczEweF9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKIAkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpyZWN2X2J1ZiwKIAkJCSAgICAgICBpbnQgcmVjdl9idWZfbGVuKTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKaW5kZXggNmNiNzRkYS4uYTJhNTE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYwpAQCAtMzI5LDExICszMjksMTQgQEAKIAkJCWJyZWFrOwogCiAjaWYgMAotCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDksIDB4NEQpOyAvKiBJbnB1dCBNb2RlIEMsIEJZUGFzcyBTZXJpYWwsIFRJVkFMID0gbG93LCBNU0IgKi8KKwkJLyogSW5wdXQgTW9kZSBDLCBCWVBhc3MgU2VyaWFsLCBUSVZBTCA9IGxvdywgTVNCICovCisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwOSwgMHg0RCk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJYnJlYWs7CiAjZW5kaWYKLQkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDBBLCAweEE3KTsgLyogVE9TVFJUID0gOCwgTW9kZSBCIChnYXRlZCBjbG9jayksIGZhbGxpbmcgRWRnZSwgU2VyaWFsLCBQT0w9SElHSCwgTVNCICovCisJCS8qIFRPU1RSVCA9IDgsIE1vZGUgQiAoZ2F0ZWQgY2xvY2spLCBmYWxsaW5nIEVkZ2UsCisJCSAqIFNlcmlhbCwgUE9MPUhJR0gsIE1TQiAqLworCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MEEsIDB4QTcpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCkBAIC01ODksNyArNTkyLDcgQEAKIAkJcmVhZF9yZWcoY2ksIDB4MDEsICZzbG90c3RhdCk7CiAJCWlmICghKDImc2xvdHN0YXQpKSB7CiAJCQlpZiAoIWNpLT5zbG90X3N0YXQpIHsKLQkJCQljaS0+c2xvdF9zdGF0IHw9IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQ7CisJCQkJY2ktPnNsb3Rfc3RhdCA9IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQ7CiAJCQkJd3JpdGVfcmVnbShjaSwgMHgwMywgMHgwOCwgMHgwOCk7CiAJCQl9CiAKQEAgLTYwMSw3ICs2MDQsOCBAQAogCQkJCWNpLT5yZWFkeSA9IDA7CiAJCQl9CiAJCX0KLQkJaWYgKGlzdGF0JjggJiYgY2ktPnNsb3Rfc3RhdCA9PSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UKSB7CisJCWlmIChpc3RhdCY4ICYmCisJCSAgICBjaS0+c2xvdF9zdGF0ID09IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQpIHsKIAkJCWNpLT5yZWFkeSA9IDE7CiAJCQljaS0+c2xvdF9zdGF0IHw9IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV92aWRlby5oCmluZGV4IGRmMGFlZWMuLmNhOWE3MDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uaApAQCAtMzIsNyArMzIsNyBAQAogICoJCWlmIHRoZXJlIHdhcyBubyBidWZmZXIgcHJldmlvdXNseSBxdWV1ZWQuCiAgKi8KIHN0cnVjdCB2cGZlX3ZpZGVvX29wZXJhdGlvbnMgewotCWludCgqcXVldWUpIChzdHJ1Y3QgdnBmZV9kZXZpY2UgKnZwZmVfZGV2LCB1bnNpZ25lZCBsb25nIGFkZHIpOworCWludCAoKnF1ZXVlKShzdHJ1Y3QgdnBmZV9kZXZpY2UgKnZwZmVfZGV2LCB1bnNpZ25lZCBsb25nIGFkZHIpOwogfTsKIAogZW51bSB2cGZlX3BpcGVsaW5lX3N0cmVhbV9zdGF0ZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL2R0MzE1NXY0bC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwppbmRleCBlNzI5ZTUyLi45N2U3YTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL2R0MzE1NXY0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvZHQzMTU1djRsLmMKQEAgLTI5OSw3ICsyOTksNyBAQAogICoJZW5kIGRyaXZlci1zcGVjaWZpYyBjYWxsYmFja3MKICAqLwogCi1jb25zdCBzdHJ1Y3QgdmIyX29wcyBxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmIyX29wcyBxX29wcyA9IHsKIAkucXVldWVfc2V0dXAgPSBkdDMxNTVfcXVldWVfc2V0dXAsCiAJLndhaXRfcHJlcGFyZSA9IGR0MzE1NV93YWl0X3ByZXBhcmUsCiAJLndhaXRfZmluaXNoID0gZHQzMTU1X3dhaXRfZmluaXNoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctbG9hZGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1sb2FkZXIuYwppbmRleCBlZWNiMWYyLi40OTFkMGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1sb2FkZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1sb2FkZXIuYwpAQCAtMjgsNyArMjgsNyBAQAogCWNvbnN0IGNoYXIgKiBjb25zdCBmd19uYW1lMjsKIH07CiAKLXN0cnVjdCBmd19jb25maWcgZndfY29uZmlnc1tdID0geworc3RhdGljIHN0cnVjdCBmd19jb25maWcgZndfY29uZmlnc1tdID0gewogCXsgMHgxOTQzLCAweGEyNTAsICJnbzcwMDcvczIyNTAtMS5mdyIsICJnbzcwMDcvczIyNTAtMi5mdyIgfSwKIAl7IDB4MDkzYiwgMHhhMDAyLCAiZ283MDA3L3B4LW00MDJ1LmZ3IiwgTlVMTCB9LAogCXsgMHgwOTNiLCAweGEwMDQsICJnbzcwMDcvcHgtdHY0MDJ1LmZ3IiwgTlVMTCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctdjRsMi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctdjRsMi5jCmluZGV4IGVkYzUyZTIuLmJkZjQxNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXY0bDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy12NGwyLmMKQEAgLTQzMyw3ICs0MzMsOCBAQAogCXJldHVybiBzZXRfY2FwdHVyZV9zaXplKGdvLCBmbXQsIDApOwogfQogCi1zdGF0aWMgaW50IGdvNzAwN19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKK3N0YXRpYyBpbnQgZ283MDA3X3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnEsCisJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAogCQl1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsCiAJCXVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCiB7CkBAIC03MzcsNyArNzM4LDggQEAKIAogCWlmIChhLT5pbmRleCA+PSBnby0+Ym9hcmRfaW5mby0+bnVtX2F1ZF9pbnB1dHMpCiAJCXJldHVybiAtRUlOVkFMOwotCXN0cmxjcHkoYS0+bmFtZSwgZ28tPmJvYXJkX2luZm8tPmF1ZF9pbnB1dHNbYS0+aW5kZXhdLm5hbWUsIHNpemVvZihhLT5uYW1lKSk7CisJc3RybGNweShhLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+YXVkX2lucHV0c1thLT5pbmRleF0ubmFtZSwKKwkJc2l6ZW9mKGEtPm5hbWUpKTsKIAlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOwogCXJldHVybiAwOwogfQpAQCAtNzQ3LDEyICs3NDksMTQgQEAKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlhLT5pbmRleCA9IGdvLT5hdWRfaW5wdXQ7Ci0Jc3RybGNweShhLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+YXVkX2lucHV0c1tnby0+YXVkX2lucHV0XS5uYW1lLCBzaXplb2YoYS0+bmFtZSkpOworCXN0cmxjcHkoYS0+bmFtZSwgZ28tPmJvYXJkX2luZm8tPmF1ZF9pbnB1dHNbZ28tPmF1ZF9pbnB1dF0ubmFtZSwKKwkJc2l6ZW9mKGEtPm5hbWUpKTsKIAlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgY29uc3Qgc3RydWN0IHY0bDJfYXVkaW8gKmEpCitzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwljb25zdCBzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKIHsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKQEAgLTc2MCw3ICs3NjQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlnby0+YXVkX2lucHV0ID0gYS0+aW5kZXg7CiAJdjRsMl9zdWJkZXZfY2FsbChnby0+c2RfYXVkaW8sIGF1ZGlvLCBzX3JvdXRpbmcsCi0JCQlnby0+Ym9hcmRfaW5mby0+YXVkX2lucHV0c1tnby0+YXVkX2lucHV0XS5hdWRpb19pbnB1dCwgMCwgMCk7CisJCWdvLT5ib2FyZF9pbmZvLT5hdWRfaW5wdXRzW2dvLT5hdWRfaW5wdXRdLmF1ZGlvX2lucHV0LCAwLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTYwLDggKzk2NCwxMCBAQAogCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEpOwogCWN0cmwgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIE5VTEwsCiAJCQlWNEwyX0NJRF9KUEVHX0FDVElWRV9NQVJLRVIsIDAsCi0JCQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9EUVQgfCBWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9ESFQsIDAsCi0JCQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9EUVQgfCBWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9ESFQpOworCQkJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfRFFUIHwKKwkJCVY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RIVCwgMCwKKwkJCVY0TDJfSlBFR19BQ1RJVkVfTUFSS0VSX0RRVCB8CisJCQlWNEwyX0pQRUdfQUNUSVZFX01BUktFUl9ESFQpOwogCWlmIChjdHJsKQogCQljdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFk7CiAJaWYgKGhkbC0+ZXJyb3IpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvc25kLWdvNzAwNy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zbmQtZ283MDA3LmMKaW5kZXggMTZkZDY0OS4uOWViMmEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zbmQtZ283MDA3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zbmQtZ283MDA3LmMKQEAgLTI0NSw4ICsyNDUsOCBAQAogCXNwaW5fbG9ja19pbml0KCZnb3NuZC0+bG9jayk7CiAJZ29zbmQtPmh3X3B0ciA9IGdvc25kLT53X2lkeCA9IGdvc25kLT5hdmFpbCA9IDA7CiAJZ29zbmQtPmNhcHR1cmluZyA9IDA7Ci0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLAotCQkJICAgICAgJmdvc25kLT5jYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoZ28tPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsCisJCQkgICAmZ29zbmQtPmNhcmQpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKGdvc25kKTsKIAkJcmV0dXJuIHJldDsKQEAgLTI1Nyw3ICsyNTcsNiBAQAogCQlrZnJlZShnb3NuZCk7CiAJCXJldHVybiByZXQ7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoZ29zbmQtPmNhcmQsIGdvLT5kZXYpOwogCXJldCA9IHNuZF9wY21fbmV3KGdvc25kLT5jYXJkLCAiZ283MDA3IiwgMCwgMCwgMSwgJmdvc25kLT5wY20pOwogCWlmIChyZXQgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoZ29zbmQtPmNhcmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jCmluZGV4IGYyZGNjNGEuLmY1MDhhMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaWdvcnBsdWd1c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAogLyogZGVidWdnaW5nIHN1cHBvcnQgKi8KICNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCi1zdGF0aWMgYm9vbCBkZWJ1ZyA9IDE7CitzdGF0aWMgYm9vbCBkZWJ1ZyA9IHRydWU7CiAjZWxzZQogc3RhdGljIGJvb2wgZGVidWc7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMKaW5kZXggZjJkMzk2Yy4uYTViNjJlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMKQEAgLTk0MywxMyArOTQzLDE3IEBACiAJCXVzYl9mcmVlX3VyYih0eF91cmIpOwogCWNhc2UgNjoKIAkJdXNiX2ZyZWVfdXJiKHJ4X3VyYik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgNToKIAkJaWYgKHJidWYpCiAJCQlsaXJjX2J1ZmZlcl9mcmVlKHJidWYpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDQ6CiAJCWtmcmVlKHJidWYpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDM6CiAJCWtmcmVlKGRyaXZlcik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgMjoKIAkJa2ZyZWUoY29udGV4dCk7CiAJCWNvbnRleHQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCmluZGV4IDBiNTg5ODkuLjYyZjUxMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKQEAgLTY4LDI5ICs2OCwyOSBAQAogc3RhdGljIGJvb2wgZGVidWc7CiBzdGF0aWMgYm9vbCBjaGVja19wc2VsZWNkOwogCi11bnNpZ25lZCBpbnQgaXJxID0gTElSQ19JUlE7Ci11bnNpZ25lZCBpbnQgaW8gPSBMSVJDX1BPUlQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGlycSA9IExJUkNfSVJROworc3RhdGljIHVuc2lnbmVkIGludCBpbyA9IExJUkNfUE9SVDsKICNpZmRlZiBMSVJDX1RJTUVSCi11bnNpZ25lZCBpbnQgdGltZXI7Ci11bnNpZ25lZCBpbnQgZGVmYXVsdF90aW1lciA9IExJUkNfVElNRVI7CitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWVyOworc3RhdGljIHVuc2lnbmVkIGludCBkZWZhdWx0X3RpbWVyID0gTElSQ19USU1FUjsKICNlbmRpZgogCiAjZGVmaW5lIFJCVUZfU0laRSAoMjU2KSAvKiB0aGlzIG11c3QgYmUgYSBwb3dlciBvZiAyIGxhcmdlciB0aGFuIDEgKi8KIAogc3RhdGljIGludCByYnVmW1JCVUZfU0laRV07CiAKLURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGxpcmNfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobGlyY193YWl0KTsKIAotdW5zaWduZWQgaW50IHJwdHI7Ci11bnNpZ25lZCBpbnQgd3B0cjsKLXVuc2lnbmVkIGludCBsb3N0X2lycXM7Ci1pbnQgaXNfb3BlbjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnB0cjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd3B0cjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9zdF9pcnFzOworc3RhdGljIGludCBpc19vcGVuOwogCi1zdHJ1Y3QgcGFycG9ydCAqcHBvcnQ7Ci1zdHJ1Y3QgcGFyZGV2aWNlICpwcGRldmljZTsKLWludCBpc19jbGFpbWVkOworc3RhdGljIHN0cnVjdCBwYXJwb3J0ICpwcG9ydDsKK3N0YXRpYyBzdHJ1Y3QgcGFyZGV2aWNlICpwcGRldmljZTsKK3N0YXRpYyBpbnQgaXNfY2xhaW1lZDsKIAotdW5zaWduZWQgaW50IHR4X21hc2sgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB0eF9tYXNrID0gMTsKIAogLyoqKiBJbnRlcm5hbCBGdW5jdGlvbnMgKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKaW5kZXggZDI0NDVmZC4uODFmOTBlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwpAQCAtNzQsNyArNzQsNyBAQAogc3RhdGljIGludCB2ZmRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgbG9uZyB2ZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCB2ZmRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHNzaXplX3QgdmZkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkJc2l6ZV90IG5fYnl0ZXMsIGxvZmZfdCAqcG9zKTsKIAogLyogTElSQyBkcml2ZXIgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwpAQCAtMTIwLDcgKzEyMCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2ZmRfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gJnZmZF9vcGVuLAotCS53cml0ZQkJPSAmdmZkX3dyaXRlLAorCS53cml0ZQkJPSB2ZmRfd3JpdGUsCiAJLnVubG9ja2VkX2lvY3RsCT0gJnZmZF9pb2N0bCwKIAkucmVsZWFzZQk9ICZ2ZmRfY2xvc2UsCiAJLmxsc2VlawkJPSBub29wX2xsc2VlaywKQEAgLTM2MCw3ICszNjAsNyBAQAogICogYW5kIHJlcXVpcmVzIGRhdGEgaW4gOSBjb25zZWN1dGl2ZSBVU0IgaW50ZXJydXB0IHBhY2tldHMsCiAgKiBlYWNoIHBhY2tldCBjYXJyeWluZyA4IGJ5dGVzLgogICovCi1zdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHZmZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpCiB7CiAJaW50IGk7CkBAIC0zODksNyArMzg5LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWRhdGFfYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuX2J5dGVzKTsKKwlkYXRhX2J1ZiA9IG1lbWR1cF91c2VyKCh2b2lkIGNvbnN0IF9fdXNlciAqKWJ1Ziwgbl9ieXRlcyk7CiAJaWYgKElTX0VSUihkYXRhX2J1ZikpIHsKIAkJcmV0dmFsID0gUFRSX0VSUihkYXRhX2J1Zik7CiAJCWdvdG8gZXhpdDsKQEAgLTg2NSwxNSArODY1LDIwIEBACiAJCQl1c2JfZnJlZV91cmIodHhfdXJiKTsKIAljYXNlIDY6CiAJCXVzYl9mcmVlX3VyYihyeF91cmIpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIDU6CiAJCWxpcmNfYnVmZmVyX2ZyZWUocmJ1Zik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgNDoKIAkJa2ZyZWUocmJ1Zik7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgMzoKIAkJa2ZyZWUoZHJpdmVyKTsKKwkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSAyOgogCQlrZnJlZShjb250ZXh0KTsKIAkJY29udGV4dCA9IE5VTEw7CisJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgMToKIAkJaWYgKHJldHZhbCA9PSAwKQogCQkJcmV0dmFsID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tc2kzMTAxL3Nkci1tc2kzMTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbXNpMzEwMS9zZHItbXNpMzEwMS5jCmluZGV4IDRjM2JmNzcuLjVhMDQwMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tc2kzMTAxL3Nkci1tc2kzMTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL21zaTMxMDEvc2RyLW1zaTMxMDEuYwpAQCAtNDExLDcgKzQxMSw3IEBACiAJdW5zaWduZWQgaW50IHZiX2Z1bGw7IC8qIHZiIGlzIGZ1bGwgYW5kIHBhY2tldHMgZHJvcHBlZCAqLwogCiAJc3RydWN0IHVyYiAqdXJic1tNQVhfSVNPX0JVRlNdOwotCWludCAoKmNvbnZlcnRfc3RyZWFtKSAoc3RydWN0IG1zaTMxMDFfc3RhdGUgKnMsIHUzMiAqZHN0LCB1OCAqc3JjLAorCWludCAoKmNvbnZlcnRfc3RyZWFtKShzdHJ1Y3QgbXNpMzEwMV9zdGF0ZSAqcywgdTMyICpkc3QsIHU4ICpzcmMsCiAJCQl1bnNpZ25lZCBpbnQgc3JjX2xlbik7CiAKIAkvKiBDb250cm9scyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmMKaW5kZXggYjFhZThlOS4uZjRkZDMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5jCkBAIC0yNDksMTEgKzI0OSwxMSBAQAogfTsKIAogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRjbTgyNXhfcmVnICp0Y204MjV4X3Npel9yZWdbTlVNX0lNQUdFX1NJWkVTXSA9Ci17ICZzdWJxY2lmLCAmcXF2Z2EsICZxY2lmLCAmcXZnYSwgJmNpZiwgJnZnYSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0Y204MjV4X3JlZyAqdGNtODI1eF9zaXpfcmVnW05VTV9JTUFHRV9TSVpFU10gPSB7CisJJnN1YnFjaWYsICZxcXZnYSwgJnFjaWYsICZxdmdhLCAmY2lmLCAmdmdhIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGNtODI1eF9yZWcgKnRjbTgyNXhfZm10X3JlZ1tOVU1fUElYRUxfRk9STUFUU10gPQoteyAmeXV2NDIyLCAmcmdiNTY1IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IHRjbTgyNXhfcmVnICp0Y204MjV4X2ZtdF9yZWdbTlVNX1BJWEVMX0ZPUk1BVFNdID0geworCSZ5dXY0MjIsICZyZ2I1NjUgfTsKIAogLyoKICAqIFJlYWQgYSB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXIgaW4gYW4gVENNODI1WCBzZW5zb3IgZGV2aWNlLiAgVGhlIHZhbHVlIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXAyNHh4L3RjbTgyNXguaAppbmRleCBlMmQxYmNkLi45OTcwZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDI0eHgvdGNtODI1eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwMjR4eC90Y204MjV4LmgKQEAgLTE3OCw3ICsxNzgsNyBAQAogCS8qIFNldCBwb3dlciBzdGF0ZSwgemVybyBpcyBvZmYsIG5vbi16ZXJvIGlzIG9uLiAqLwogCWludCAoKnBvd2VyX3NldCkoaW50IHBvd2VyKTsKIAkvKiBEZWZhdWx0IHJlZ2lzdGVycyB3cml0dGVuIGFmdGVyIHBvd2VyLW9uIG9yIHJlc2V0LiAqLwotCWNvbnN0IHN0cnVjdCB0Y204MjV4X3JlZyAqKCpkZWZhdWx0X3JlZ3MpKHZvaWQpOworCWNvbnN0IHN0cnVjdCB0Y204MjV4X3JlZyAqICgqZGVmYXVsdF9yZWdzKSh2b2lkKTsKIAlpbnQgKCpuZWVkc19yZXNldCkoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgdm9pZCAqYnVmLAogCQkJICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqZm10KTsKIAlpbnQgKCppZnBhcm0pKHN0cnVjdCB2NGwyX2lmcGFybSAqcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfY29yZS5jCmluZGV4IDJjYjQ0ZGUuLjcxZjU5NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfY29yZS5jCkBAIC0xNTgsOCArMTU4LDggQEAKIAogCWNhbS0+bmJ1ZmZlcnMgPSBjb3VudDsKIAl3aGlsZSAoY2FtLT5uYnVmZmVycyA+IDApIHsKLQkJaWYgKChidWZmID0gdm1hbGxvY18zMl91c2VyKGNhbS0+bmJ1ZmZlcnMgKgotCQkJCQkgICAgUEFHRV9BTElHTihpbWFnZXNpemUpKSkpCisJCWJ1ZmYgPSB2bWFsbG9jXzMyX3VzZXIoY2FtLT5uYnVmZmVycyAqIFBBR0VfQUxJR04oaW1hZ2VzaXplKSk7CisJCWlmIChidWZmKQogCQkJYnJlYWs7CiAJCWNhbS0+bmJ1ZmZlcnMtLTsKIAl9CkBAIC0xMTIxLDcgKzExMjEsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoKHZhbCA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCBjYW0tPnN5c2ZzLnJlZykpIDwgMCkgeworCXZhbCA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCBjYW0tPnN5c2ZzLnJlZyk7CisJaWYgKHZhbCA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZzbjljMTAyX3N5c2ZzX2xvY2spOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMjU2LDcgKzEyNTcsOCBAQAogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKLQlpZiAoKHZhbCA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCBjYW0tPnN5c2ZzLmkyY19yZWcpKSA8IDApIHsKKwl2YWwgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgY2FtLT5zeXNmcy5pMmNfcmVnKTsKKwlpZiAodmFsIDwgMCkgewogCQltdXRleF91bmxvY2soJnNuOWMxMDJfc3lzZnNfbG9jayk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE0NDAsMjcgKzE0NDIsMzUgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmKGNhbS0+djRsZGV2LT5kZXYpOwogCWludCBlcnIgPSAwOwogCi0JaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnKSkpCisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZyk7CisJaWYgKGVycikKIAkJZ290byBlcnJfb3V0OwotCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZhbCkpKQorCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92YWwpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyX3JlZzsKLQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9mcmFtZV9oZWFkZXIpKSkKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZnJhbWVfaGVhZGVyKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycl92YWw7CiAKIAlpZiAoY2FtLT5zZW5zb3Iuc3lzZnNfb3BzKSB7Ci0JCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2kyY19yZWcpKSkKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2kyY19yZWcpOworCQlpZiAoZXJyKQogCQkJZ290byBlcnJfZnJhbWVfaGVhZGVyOwotCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9pMmNfdmFsKSkpCisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9pMmNfdmFsKTsKKwkJaWYgKGVycikKIAkJCWdvdG8gZXJyX2kyY19yZWc7CiAJfQogCiAJaWYgKGNhbS0+YnJpZGdlID09IEJSSURHRV9TTjlDMTAxIHx8IGNhbS0+YnJpZGdlID09IEJSSURHRV9TTjlDMTAyKSB7Ci0JCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2dyZWVuKSkpCisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9ncmVlbik7CisJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9pMmNfdmFsOwogCX0gZWxzZSB7Ci0JCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JsdWUpKSkKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JsdWUpOworCQlpZiAoZXJyKQogCQkJZ290byBlcnJfaTJjX3ZhbDsKLQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVkKSkpCisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWQpOworCQlpZiAoZXJyKQogCQkJZ290byBlcnJfYmx1ZTsKIAl9CiAKQEAgLTE2ODQsMTEgKzE2OTQsMTMgQEAKIAllbHNlCiAJCURCRygzLCAiVW5jb21wcmVzc2VkIHZpZGVvIGZvcm1hdCBpcyBhY3RpdmUiKTsKIAotCWlmIChzLT5zZXRfY3JvcCkKLQkJaWYgKChlcnIgPSBzLT5zZXRfY3JvcChjYW0sIHJlY3QpKSkgeworCWlmIChzLT5zZXRfY3JvcCkgeworCQllcnIgPSBzLT5zZXRfY3JvcChjYW0sIHJlY3QpOworCQlpZiAoZXJyKSB7CiAJCQlEQkcoMywgInNldF9jcm9wKCkgZmFpbGVkIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CisJfQogCiAJaWYgKHMtPnNldF9jdHJsKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnFjdHJsKTsgaSsrKQpAQCAtMTgzNSw3ICsxODQ3LDggQEAKIAkJY2FtLT5zdGF0ZSAmPSB+REVWX01JU0NPTkZJR1VSRUQ7CiAJfQogCi0JaWYgKChlcnIgPSBzbjljMTAyX3N0YXJ0X3RyYW5zZmVyKGNhbSkpKQorCWVyciA9IHNuOWMxMDJfc3RhcnRfdHJhbnNmZXIoY2FtKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNhbTsKQEAgLTIzMDgsNyArMjMyMSw4IEBACiAJfQogCWlmIChpID09IEFSUkFZX1NJWkUocy0+cWN0cmwpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKGVyciA9IHMtPnNldF9jdHJsKGNhbSwgJmN0cmwpKSkKKwllcnIgPSBzLT5zZXRfY3RybChjYW0sICZjdHJsKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJcy0+X3FjdHJsW2ldLmRlZmF1bHRfdmFsdWUgPSBjdHJsLnZhbHVlOwpAQCAtMjQxNiw5ICsyNDMwLDExIEBACiAJfSBlbHNlCiAJCXNjYWxlID0gMTsKIAotCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCi0JCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pIHsKKwkJZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCX0KIAogCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY3JvcCwgc2l6ZW9mKGNyb3ApKSkgewogCQljYW0tPnN0cmVhbSA9IHN0cmVhbTsKQEAgLTI2NzIsOSArMjY4OCwxMSBAQAogCQkJCXJldHVybiAtRUJVU1k7CiAJCQl9CiAKLQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQotCQlpZiAoKGVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKKwlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKSB7CisJCWVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKKwl9CiAKIAlpZiAoY29weV90b191c2VyKGFyZywgJmZvcm1hdCwgc2l6ZW9mKGZvcm1hdCkpKSB7CiAJCWNhbS0+c3RyZWFtID0gc3RyZWFtOwpAQCAtMjc0Niw5ICsyNzY0LDExIEBACiAJaWYgKGpjLnF1YWxpdHkgIT0gMCAmJiBqYy5xdWFsaXR5ICE9IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKLQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikgeworCQllcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisJfQogCiAJZXJyICs9IHNuOWMxMDJfc2V0X2NvbXByZXNzaW9uKGNhbSwgJmpjKTsKIAlpZiAoZXJyKSB7IC8qIGF0b21pYywgbm8gcm9sbGJhY2sgaW4gaW9jdGwoKSAqLwpAQCAtMjc5NCw5ICsyODE0LDExIEBACiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAKLQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQotCQlpZiAoKGVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKKwlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKSB7CisJCWVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKKwl9CiAKIAlzbjljMTAyX2VtcHR5X2ZyYW1lcXVldWVzKGNhbSk7CiAKQEAgLTI5NzQsOSArMjk5NiwxMSBAQAogCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fCBjYW0tPmlvICE9IElPX01NQVApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKLQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikgeworCQllcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisJfQogCiAJc245YzEwMl9lbXB0eV9mcmFtZXF1ZXVlcyhjYW0pOwogCkBAIC0zMjUwLDcgKzMyNzQsOCBAQAogCXVuc2lnbmVkIGludCBpOwogCWludCBlcnIgPSAwLCByOwogCi0JaWYgKCEoY2FtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuOWMxMDJfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQorCWNhbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbjljMTAyX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghY2FtKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNhbS0+dXNiZGV2ID0gdWRldjsKQEAgLTMyNjIsMTMgKzMyODcsMTUgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICghKGNhbS0+Y29udHJvbF9idWZmZXIgPSBremFsbG9jKDgsIEdGUF9LRVJORUwpKSkgeworCWNhbS0+Y29udHJvbF9idWZmZXIgPSBremFsbG9jKDgsIEdGUF9LRVJORUwpOworCWlmICghY2FtLT5jb250cm9sX2J1ZmZlcikgewogCQlEQkcoMSwgImt6YWxsb2MoKSBmYWlsZWQiKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICghKGNhbS0+djRsZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCkpKSB7CisJY2FtLT52NGxkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIWNhbS0+djRsZGV2KSB7CiAJCURCRygxLCAidmlkZW9fZGV2aWNlX2FsbG9jKCkgZmFpbGVkIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMKaW5kZXggMmRjZTVjOS4uNDY4MDcyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMKQEAgLTUzLDI3ICs1MywzMiBAQAogCQl9CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSAweDNmIC0gKGN0cmwtPnZhbHVlICYgMHgzZik7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzMpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzMpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gMHgzZiAtIChjdHJsLT52YWx1ZSAmIDB4M2YpOwogCQlyZXR1cm4gMDsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMyKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMyKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IDB4M2YgLSAoY3RybC0+dmFsdWUgJiAweDNmKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX1JFU0VUX0xFVkVMOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzApKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzApOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4M2Y7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9QSVhFTF9CSUFTX1ZPTFRBR0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzNCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzNCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwNzsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCmluZGV4IDQyOTU4ODcuLjI2YTkxMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCkBAIC0xNDIsMjYgKzE0MiwzMSBAQAogewogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMxKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMxKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IGN0cmwtPnZhbHVlICYgMHgzZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgPSBjdHJsLT52YWx1ZSAmIDB4M2Y7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzIpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzIpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgJiAweDNmOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0JMQUNLX0xFVkVMOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDEpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDEpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHgwOCkgPyAxIDogMDsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzYzMC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYwppbmRleCA4MDM3MTJjLi5kM2ExYmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzYzMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMKQEAgLTI2MCw3ICsyNjAsOCBAQAogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKQEAgLTI4MCwzNyArMjgxLDQ0IEBACiAJCWJyZWFrOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgzZjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGMpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGMpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4M2Y7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfV0hJVEVORVNTOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGQpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGQpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4M2Y7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwMTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDc1KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDc1KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IChjdHJsLT52YWx1ZSAmIDB4ODApID8gMSA6IDA7CiAJCWJyZWFrOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HQU1NQToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDE0KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDE0KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IChjdHJsLT52YWx1ZSAmIDB4MDIpID8gMSA6IDA7CiAJCWJyZWFrOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9CQU5EX0ZJTFRFUjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDJkKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDJkKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSA9IChjdHJsLT52YWx1ZSAmIDB4MDIpID8gMSA6IDA7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfb3Y3NjYwLmMKaW5kZXggNzk3Nzc5NS4uNTMwMTU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX292NzY2MC5jCkBAIC0yNzgsNDEgKzI3OCw0OSBAQAogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDIpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDIpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHgwNCkgPyAxIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA1KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA1KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDdmOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA2KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA2KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDdmOwogCQlicmVhazsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA3KSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA3KTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDdmOwogCQlicmVhazsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfQkFORF9GSUxURVI6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzYikpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzYik7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwODsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDApKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDApOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MWY7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgxMyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwMTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczEwNmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jCmluZGV4IDgxY2Q5NjkuLjQ3YmQ4MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jCkBAIC02MiwzMiArNjIsMzggQEAKIAkJfQogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGMpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGMpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MWY7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDkpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDkpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MWY7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBlKSkgPCAwKQorCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBlKTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDFmOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGYpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGYpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MDc7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGEpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGEpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHgxZikgPDwgMTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0RBQ19NQUdOSVRVREU6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOCkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOCk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHhmODsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NuOWMxMDIvc245YzEwMl9wYXMyMDJiY2IuYwppbmRleCAyZTg2ZmRjLi5jYmZhY2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zbjljMTAyL3NuOWMxMDJfcGFzMjAyYmNiLmMKQEAgLTkyLDI3ICs5MiwzMiBAQAogCQl9CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOSkpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOSk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwNykpIDwgMCkKKwkJY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwNyk7CisJCWlmIChjdHJsLT52YWx1ZSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHgwZjsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTApKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTApOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MWY7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDgpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDgpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4MGY7CiAJCXJldHVybiAwOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9EQUNfTUFHTklUVURFOgotCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGMpKSA8IDApCisJCWN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGMpOworCQlpZiAoY3RybC0+dmFsdWUgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWNvcmUuYwppbmRleCA0ODBiN2M0Li5mNjcwNDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1jb3JlLmMKQEAgLTQwLDcgKzQwLDcgQEAKIE1PRFVMRV9WRVJTSU9OKFNPTE82WDEwX1ZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi11bnNpZ25lZCB2aWRlb19uciA9IC0xOworc3RhdGljIHVuc2lnbmVkIHZpZGVvX25yID0gLTE7CiBtb2R1bGVfcGFyYW0odmlkZW9fbnIsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh2aWRlb19uciwgInZpZGVvWCBzdGFydCBudW1iZXIsIC0xIGlzIGF1dG9kZXRlY3QgKGRlZmF1bHQpIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1nNzIzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtZzcyMy5jCmluZGV4IDFkYjE4YzcuLjc0ZjAzN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC1nNzIzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLWc3MjMuYwpAQCAtMzY2LDggKzM2Niw5IEBACiAJLyogQWxsb3dzIGZvciBlYXNpZXIgbWFwcGluZyBiZXR3ZWVuIHZpZGVvIGFuZCBhdWRpbyAqLwogCXNwcmludGYobmFtZSwgIlNvZnRsb2dpYyVkIiwgc29sb19kZXYtPnZmZC0+bnVtKTsKIAotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIG5hbWUsIFRISVNfTU9EVUxFLCAwLAotCQkJICAgICAgJnNvbG9fZGV2LT5zbmRfY2FyZCk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZzb2xvX2Rldi0+cGRldi0+ZGV2LAorCQkJICAgU05EUlZfREVGQVVMVF9JRFgxLCBuYW1lLCBUSElTX01PRFVMRSwgMCwKKwkJCSAgICZzb2xvX2Rldi0+c25kX2NhcmQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNzcsNyArMzc4LDYgQEAKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiU09MTy02eDEwIEF1ZGlvIik7CiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIG9uICVzIElSUSAlZCIsIGNhcmQtPnNob3J0bmFtZSwKIAkJcGNpX25hbWUoc29sb19kZXYtPnBkZXYpLCBzb2xvX2Rldi0+cGRldi0+aXJxKTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZzb2xvX2Rldi0+cGRldi0+ZGV2KTsKIAogCXJldCA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgc29sb19kZXYsICZvcHMpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXR3MjguYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC10dzI4LmMKaW5kZXggYWY2NWVhNi4uMzZkYWExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLXR3MjguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdHcyOC5jCkBAIC01MTYsNyArNTE2LDcgQEAKIHN0YXRpYyB2b2lkIHNhYTcxMnhfd3JpdGVfcmVncyhzdHJ1Y3Qgc29sb19kZXYgKmRldiwgY29uc3QgdWludDhfdCAqdmFscywKIAkJaW50IHN0YXJ0LCBpbnQgbikKIHsKLQlmb3IgKDtzdGFydCA8IG47IHN0YXJ0KyssIHZhbHMrKykgeworCWZvciAoOyBzdGFydCA8IG47IHN0YXJ0KyssIHZhbHMrKykgewogCQkvKiBTa2lwIHJlYWQtb25seSByZWdpc3RlcnMgKi8KIAkJc3dpdGNoIChzdGFydCkgewogCQkvKiBjYXNlIDB4MDAgLi4uIDB4MjU6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAtdjRsMi1lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC12NGwyLWVuYy5jCmluZGV4IGNlOWU1YWEuLjVhZWI5YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC12NGwyLWVuYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9zb2xvNngxMC12NGwyLWVuYy5jCkBAIC0zOTksOCArMzk5LDggQEAKIAlpZiAoc29sb19lbmMtPmRlc2NfY291bnQgPD0gMSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gc29sb19wMm1fZG1hX2Rlc2Moc29sb19kZXYsIHNvbG9fZW5jLT5kZXNjX2l0ZW1zLCBzb2xvX2VuYy0+ZGVzY19kbWEsCi0JCQkJIHNvbG9fZW5jLT5kZXNjX2NvdW50IC0gMSk7CisJcmV0dXJuIHNvbG9fcDJtX2RtYV9kZXNjKHNvbG9fZGV2LCBzb2xvX2VuYy0+ZGVzY19pdGVtcywKKwkJCXNvbG9fZW5jLT5kZXNjX2RtYSwgc29sb19lbmMtPmRlc2NfY291bnQgLSAxKTsKIH0KIAogLyogRXh0cmFjdCB2YWx1ZXMgZnJvbSBWT1AgaGVhZGVyIC0gVkVfU1RBVFVTeHggKi8KQEAgLTQ3Miw4ICs0NzIsNyBAQAogCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCB2b3BfanBlZ19zaXplKHZoKSArIHNvbG9fZW5jLT5qcGVnX2xlbikKIAkJcmV0dXJuIC1FSU87CiAKLQlmcmFtZV9zaXplID0gKHZvcF9qcGVnX3NpemUodmgpICsgc29sb19lbmMtPmpwZWdfbGVuICsgKERNQV9BTElHTiAtIDEpKQotCQkmIH4oRE1BX0FMSUdOIC0gMSk7CisJZnJhbWVfc2l6ZSA9IEFMSUdOKHZvcF9qcGVnX3NpemUodmgpICsgc29sb19lbmMtPmpwZWdfbGVuLCBETUFfQUxJR04pOwogCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgdm9wX2pwZWdfc2l6ZSh2aCkgKyBzb2xvX2VuYy0+anBlZ19sZW4pOwogCiAJLyogbWF5IGRpc2NhcmQgYWxsIHByZXZpb3VzIGRhdGEgaW4gdmJ1Zi0+c2dsICovCkBAIC01MDYsMjEgKzUwNSwyMiBAQAogCQlyZXR1cm4gLUVJTzsKIAogCS8qIElmIHRoaXMgaXMgYSBrZXkgZnJhbWUsIGFkZCBleHRyYSBoZWFkZXIgKi8KLQl2Yi0+djRsMl9idWYuZmxhZ3MgJj0gfihWNEwyX0JVRl9GTEFHX0tFWUZSQU1FIHwgVjRMMl9CVUZfRkxBR19QRlJBTUUgfCBWNEwyX0JVRl9GTEFHX0JGUkFNRSk7CisJdmItPnY0bDJfYnVmLmZsYWdzICY9IH4oVjRMMl9CVUZfRkxBR19LRVlGUkFNRSB8IFY0TDJfQlVGX0ZMQUdfUEZSQU1FIHwKKwkJVjRMMl9CVUZfRkxBR19CRlJBTUUpOwogCWlmICghdm9wX3R5cGUodmgpKSB7CiAJCXNraXAgPSBzb2xvX2VuYy0+dm9wX2xlbjsKIAkJdmItPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7Ci0JCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgdm9wX21wZWdfc2l6ZSh2aCkgKyBzb2xvX2VuYy0+dm9wX2xlbik7CisJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgdm9wX21wZWdfc2l6ZSh2aCkgKworCQkJc29sb19lbmMtPnZvcF9sZW4pOwogCX0gZWxzZSB7CiAJCXZiLT52NGwyX2J1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1BGUkFNRTsKIAkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCB2b3BfbXBlZ19zaXplKHZoKSk7CiAJfQogCiAJLyogTm93IGdldCB0aGUgYWN0dWFsIG1wZWcgcGF5bG9hZCAqLwotCWZyYW1lX29mZiA9ICh2b3BfbXBlZ19vZmZzZXQodmgpIC0gU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIHNpemVvZigqdmgpKQotCQklIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2Rldik7Ci0JZnJhbWVfc2l6ZSA9ICh2b3BfbXBlZ19zaXplKHZoKSArIHNraXAgKyAoRE1BX0FMSUdOIC0gMSkpCi0JCSYgfihETUFfQUxJR04gLSAxKTsKKwlmcmFtZV9vZmYgPSAodm9wX21wZWdfb2Zmc2V0KHZoKSAtIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKworCQlzaXplb2YoKnZoKSkgJSBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpOworCWZyYW1lX3NpemUgPSBBTElHTih2b3BfbXBlZ19zaXplKHZoKSArIHNraXAsIERNQV9BTElHTik7CiAKIAkvKiBtYXkgZGlzY2FyZCBhbGwgcHJldmlvdXMgZGF0YSBpbiB2YnVmLT5zZ2wgKi8KIAlkbWFfbWFwX3NnKCZzb2xvX2Rldi0+cGRldi0+ZGV2LCB2YnVmLT5zZ2wsIHZidWYtPm5lbnRzLApAQCAtNTg5LDcgKzU4OSw4IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvbG9fZW5jLT5hdl9sb2NrLCBmbGFncyk7CiAJCWdvdG8gdW5sb2NrOwogCX0KLQl2YiA9IGxpc3RfZmlyc3RfZW50cnkoJnNvbG9fZW5jLT52aWRxX2FjdGl2ZSwgc3RydWN0IHNvbG9fdmIyX2J1ZiwgbGlzdCk7CisJdmIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzb2xvX2VuYy0+dmlkcV9hY3RpdmUsIHN0cnVjdCBzb2xvX3ZiMl9idWYsCisJCWxpc3QpOwogCWxpc3RfZGVsKCZ2Yi0+bGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29sb19lbmMtPmF2X2xvY2ssIGZsYWdzKTsKIApAQCAtNjQ1LDcgKzY0Niw4IEBACiAJCWVuY19idWYudmggPSBzb2xvX2Rldi0+dmhfYnVmOwogCiAJCS8qIFNhbml0eSBjaGVjayAqLwotCQlpZiAodm9wX21wZWdfb2Zmc2V0KGVuY19idWYudmgpICE9IFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYpCisJCWlmICh2b3BfbXBlZ19vZmZzZXQoZW5jX2J1Zi52aCkgIT0KKwkJCVNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYpCiAJCQljb250aW51ZTsKIAogCQlpZiAoc29sb19tb3Rpb25fZGV0ZWN0ZWQoc29sb19lbmMpKQpAQCAtNjgwLDkgKzY4MiwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNvbG9fZW5jX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnEsIGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAotCQkJICAgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywgdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLAotCQkJICAgdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKK3N0YXRpYyBpbnQgc29sb19lbmNfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqcSwKKwkJCQljb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCQl1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLAorCQkJCXVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywgdW5zaWduZWQgaW50IHNpemVzW10sCisJCQkJdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXNpemVzWzBdID0gRlJBTUVfQlVGX1NJWkU7CiAJKm51bV9wbGFuZXMgPSAxOwpAQCAtMTExMiwxNCArMTExNiwxNSBAQAogCQlzb2xvX2VuYy0+bW90aW9uX3RocmVzaCA9IGN0cmwtPnZhbDsKIAkJaWYgKCFzb2xvX2VuYy0+bW90aW9uX2dsb2JhbCB8fCAhc29sb19lbmMtPm1vdGlvbl9lbmFibGVkKQogCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBzb2xvX3NldF9tb3Rpb25fdGhyZXNob2xkKHNvbG9fZGV2LCBzb2xvX2VuYy0+Y2gsIGN0cmwtPnZhbCk7CisJCXJldHVybiBzb2xvX3NldF9tb3Rpb25fdGhyZXNob2xkKHNvbG9fZGV2LCBzb2xvX2VuYy0+Y2gsCisJCQljdHJsLT52YWwpOwogCWNhc2UgVjRMMl9DSURfTU9USU9OX01PREU6CiAJCXNvbG9fZW5jLT5tb3Rpb25fZ2xvYmFsID0gY3RybC0+dmFsID09IDE7CiAJCXNvbG9fZW5jLT5tb3Rpb25fZW5hYmxlZCA9IGN0cmwtPnZhbCA+IDA7CiAJCWlmIChjdHJsLT52YWwpIHsKIAkJCWlmIChzb2xvX2VuYy0+bW90aW9uX2dsb2JhbCkKLQkJCQlzb2xvX3NldF9tb3Rpb25fdGhyZXNob2xkKHNvbG9fZGV2LCBzb2xvX2VuYy0+Y2gsCi0JCQkJCQlzb2xvX2VuYy0+bW90aW9uX3RocmVzaCk7CisJCQkJc29sb19zZXRfbW90aW9uX3RocmVzaG9sZChzb2xvX2RldiwKKwkJCQkJc29sb19lbmMtPmNoLCBzb2xvX2VuYy0+bW90aW9uX3RocmVzaCk7CiAJCQllbHNlCiAJCQkJc29sb19zZXRfbW90aW9uX2Jsb2NrKHNvbG9fZGV2LCBzb2xvX2VuYy0+Y2gsCiAJCQkJCQkmc29sb19lbmMtPm1vdGlvbl90aHJlc2hvbGRzKTsKQEAgLTEzMDcsNyArMTMxMiw4IEBACiAJc29sb19lbmMtPmRlc2NfbmVsdHMgPSAzMjsKIAlzb2xvX2VuYy0+ZGVzY19pdGVtcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHNvbG9fZGV2LT5wZGV2LAogCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc29sb19wMm1fZGVzYykgKgotCQkJCSAgICAgIHNvbG9fZW5jLT5kZXNjX25lbHRzLCAmc29sb19lbmMtPmRlc2NfZG1hKTsKKwkJCQkgICAgICBzb2xvX2VuYy0+ZGVzY19uZWx0cywKKwkJCQkgICAgICAmc29sb19lbmMtPmRlc2NfZG1hKTsKIAlyZXQgPSAtRU5PTUVNOwogCWlmIChzb2xvX2VuYy0+ZGVzY19pdGVtcyA9PSBOVUxMKQogCQlnb3RvIGhkbF9mcmVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKaW5kZXggMzFiMjY5YS4uYzgzZTMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCkBAIC0zMDcsNyArMzA3LDggQEAKIH0KIAogc3RhdGljIHUxNiB4bHJfbmV0X3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQl2b2lkICphY2NlbF9wcml2LCBzZWxlY3RfcXVldWVfZmFsbGJhY2tfdCBmYWxsYmFjaykKKwkJCQl2b2lkICphY2NlbF9wcml2LAorCQkJCXNlbGVjdF9xdWV1ZV9mYWxsYmFja190IGZhbGxiYWNrKQogewogCXJldHVybiAodTE2KXNtcF9wcm9jZXNzb3JfaWQoKTsKIH0KQEAgLTYxNCw4ICs2MTUsNiBAQAogCQlrID0gKGsgKyAxKSAlIGo7CiAJCWIyID0gYmt0c1trXTsKIAkJayA9IChrICsgMSkgJSBqOwotCQl2YWwgPSAoKGMxIDw8IDIzKSB8IChiMSA8PCAxNykgfCAodXNlX2JrdCA8PCAxNikgfAotCQkJCShjMiA8PCA3KSB8IChiMiA8PCAxKSB8ICh1c2VfYmt0IDw8IDApKTsKIAogCQl2YWwgPSAoKGMxIDw8IDIzKSB8IChiMSA8PCAxNykgfCAodXNlX2JrdCA8PCAxNikgfAogCQkJCShjMiA8PCA3KSB8IChiMiA8PCAxKSB8ICh1c2VfYmt0IDw8IDApKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM2YzBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9LY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorY29uZmlnIEJUX05PS0lBX0g0UAorCXRyaXN0YXRlICJIQ0kgZHJpdmVyIHdpdGggSDQgTm9raWEgZXh0ZW5zaW9ucyIKKwlkZXBlbmRzIG9uIEJUICYmIEFSQ0hfT01BUAorCWhlbHAKKwkgIEJsdWV0b290aCBIQ0kgZHJpdmVyIHdpdGggSDQgZXh0ZW5zaW9ucy4gIFRoaXMgZHJpdmVyIHByb3ZpZGVzCisJICBzdXBwb3J0IGZvciBINCsgQmx1ZXRvb3RoIGNoaXAgd2l0aCB2ZW5kb3Itc3BlY2lmaWMgSDQgZXh0ZW5zaW9ucy4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIGg0IGV4dGVuZGVkIGRldmljZXMgaW50byB0aGUga2VybmVsCisJICBvciBzYXkgTSB0byBjb21waWxlIGl0IGFzIG1vZHVsZSAoYnRub2tpYV9oNHApLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyNWRiNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisKK29iai0kKENPTkZJR19CVF9OT0tJQV9INFApCQkrPSBidG5va2lhX2g0cC5vCitidG5va2lhX2g0cC1vYmpzIDo9IG5va2lhX2NvcmUubyBub2tpYV9mdy5vIG5va2lhX3VhcnQubyBub2tpYV9mdy1jc3IubyBcCisJCW5va2lhX2Z3LWJjbS5vIG5va2lhX2Z3LXRpMTI3My5vCisKK2NjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWM1ODIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9UT0RPCkBAIC0wLDAgKzEsMTMyIEBACitGZXcgYXR0ZW1wdHMgdG8gc3VibWlzc2lvbiBoYXZlIGJlZW4gbWFkZSwgbGFzdCByZXZpZXcgY29tbWVudHMgd2VyZSByZWNlaXZlZCBpbgorCitEYXRlOiBXZWQsIDE1IEphbiAyMDE0IDE5OjAxOjUxIC0wODAwCitGcm9tOiBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CitTdWJqZWN0OiBSZTogW1BBVENIIHY2XSBCbHVldG9vdGg6IEFkZCBoY2lfaDRwIGRyaXZlcgorCitTb21lIGNvZGUgcmVmYWN0b3JpbmcgaXMgc3RpbGwgbmVlZGVkLgorCitUT0RPOgorCis+ICsrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNHAuaAorCitjYW4gd2UgcGxlYXNlIGdldCB0aGUgbmFtaW5nIHN0cmFpZ2h0LiBGaWxlIG5hbWVzIGRvIG5vdCBzdGFydCB3aXRoCitoY2lfIGFueW1vcmUuIFdlIG1vdmVkIGF3YXkgZnJvbSBpdCBzaW5jZSB0aGF0IHRlcm0gaXMgdG9vIGdlbmVyaWMuCisKKz4gK3N0cnVjdCBoY2lfaDRwX2luZm8geworCitDYW4gd2UgcGxlYXNlIGdldCByaWQgb2YgdGhlIGhjaV8gcHJlZml4IGZvciBldmVyeXRoaW5nLiBDb3B5aW5nIGZyb20KK2RyaXZlcnMgdGhhdCBhcmUgb3ZlciAxMCB5ZWFycyBvbGQgaXMgbm90IGEgZ29vZCBpZGVhLiBQbGVhc2UgbG9vayBhdAorcmVjZW50IG9uZXMuCisKKz4gKyAgICAgc3RydWN0IHRpbWVyX2xpc3QgbGF6eV9yZWxlYXNlOworCitUaW1lcj8gTm90IGRlbGF5ZWQgd29yaz8KKworPiArdm9pZCBoY2lfaDRwX291dGIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IG9mZnNldCwgdTggdmFsKTsKKz4gK3U4IGhjaV9oNHBfaW5iKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBvZmZzZXQpOworPiArdm9pZCBoY2lfaDRwX3NldF9ydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IGFjdGl2ZSk7Cis+ICtpbnQgaGNpX2g0cF93YWl0X2Zvcl9jdHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IGFjdGl2ZSwgaW50IHRpbWVvdXRfbXMpOworPiArdm9pZCBfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBvbiwgdTggd2hpY2gpOworPiArdm9pZCBoY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgb24sIHU4IHdoaWNoKTsKKz4gK3ZvaWQgaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBzcGVlZCk7Cis+ICtpbnQgaGNpX2g0cF9yZXNldF91YXJ0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOworPiArdm9pZCBoY2lfaDRwX2luaXRfdWFydChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKKz4gK3ZvaWQgaGNpX2g0cF9lbmFibGVfdHgoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cis+ICt2b2lkIGhjaV9oNHBfc3RvcmVfcmVncyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKKz4gK3ZvaWQgaGNpX2g0cF9yZXN0b3JlX3JlZ3Moc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cis+ICt2b2lkIGhjaV9oNHBfc21hcnRfaWRsZShzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBib29sIGVuYWJsZSk7CisKK1RoZXNlIGFyZSBhIGxvdCBvZiBwdWJsaWMgZnVuY3Rpb25zLiBBcmUgdGhleSBhbGwgcmVhbGx5IG5lZWRlZCBvciBjYW4KK3RoZSBjb2RlIGJlIGRvbmUgc21hcnQuCisKKz4gK3N0YXRpYyBzc2l6ZV90IGhjaV9oNHBfc3RvcmVfYmRhZGRyKHN0cnVjdCBkZXZpY2UgKmRldiwKKz4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCis+ICt7Cis+ICsgICAgIHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworU2luY2Ugbm9uZSBvZiB0aGVzZSBkZXZpY2VzIGNhbiBmdW5jdGlvbiB3aXRob3V0IGhhdmluZyBhIHZhbGlkCithZGRyZXNzLCB0aGUgd2F5IHRoaXMgc2hvdWxkIHdvcmsgaXMgdGhhdCB3ZSBzaG91bGQgbm90IHJlZ2lzdGVyIHRoZQorSENJIGRldmljZSB3aGVuIHByb2JpbmcgdGhlIHBsYXRmb3JtIGRldmljZS4KKyAgICAKK1RoZSBIQ0kgZGV2aWNlIHNob3VsZCBiZSByZWdpc3RlcmVkIG9uY2UgYSB2YWxpZCBhZGRyZXNzIGhhcyBiZWVuCit3cml0dGVuIGludG8gdGhlIHN5c2ZzIGZpbGUuIEkgZG8gbm90IHdhbnQgdG8gcGxheSB0aGUgdHJpY2tzIHdpdGgKK2JyaW5naW5nIHVwIHRoZSBkZXZpY2Ugd2l0aG91dCBhIHZhbGlkIGFkZHJlc3MuCisKKz4gKyAgICAgaGRldi0+Y2xvc2UgPSBoY2lfaDRwX2hjaV9jbG9zZTsKKz4gKyAgICAgaGRldi0+Zmx1c2ggPSBoY2lfaDRwX2hjaV9mbHVzaDsKKz4gKyAgICAgaGRldi0+c2VuZCA9IGhjaV9oNHBfaGNpX3NlbmRfZnJhbWU7CisgICAgCitJdCBuZWVkcyB0byB1c2UgaGRldi0+c2V0dXAgdG8gbG9hZCB0aGUgZmlybXdhcmUuIEkgYXNzdW1lIHRoZQorZmlybXdhcmUgb25seSBuZWVkcyB0byBiZSBsb2FkZWQgb25jZS4gVGhhdCBpcyBleGFjdGx5IHdoYXQKK2hkZXYtPnNldHVwIGRvZXMuIEl0IGdldHMgZXhlY3V0ZWQgb25jZS4KKyAgICAKKz4gKyAgICAgc2V0X2JpdChIQ0lfUVVJUktfUkVTRVRfT05fQ0xPU0UsICZoZGV2LT5xdWlya3MpOworCitJcyB0aGlzIHF1aXJrIHJlYWxseSBuZWVkZWQ/IE5vcm1hbGx5IG9ubHkgQmx1ZXRvb3RoIDEuMSBhbmQgZWFybHkKK2RldmljZXMgcXVhbGlmeSBmb3IgaXQuCisKKz4gK3N0YXRpYyBpbnQgaGNpX2g0cF9iY21fc2V0X2JkYWRkcihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorPiAreworPiArICAgICBpbnQgaTsKKz4gKyAgICAgc3RhdGljIGNvbnN0IHU4IG5va2lhX291aVszXSA9IHsweDAwLCAweDFmLCAweGRmfTsKKz4gKyAgICAgaW50IG5vdF92YWxpZDsKKworSGFzIHRoaXMgYWN0dWFsbHkgYmVlbiBjb25maXJtZWQgdGhhdCB3ZSBjYW4ganVzdCByYW5kb21seSBzZXQgYW4KK2FkZHJlc3Mgb3V0IG9mIHRoZSBOb2tpYSByYW5nZS4gSSBkbyBub3QgdGhpbmsgc28uIFRoaXMgaXMgYSBwcmV0dHkKK2JhZCBpZGVhLgorCitJIGhhdmUgbm8gaW50ZXJlc3QgaW4gbWVyZ2luZyBhIGRyaXZlciB3aXRoIHN1Y2ggYSBoYWNrLgorCis+ICsgICAgIG5vdF92YWxpZCA9IDE7Cis+ICsgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKz4gKyAgICAgICAgICAgICBpZiAoaW5mby0+YmRfYWRkcltpXSAhPSAweDAwKSB7Cis+ICsgICAgICAgICAgICAgICAgICAgICBub3RfdmFsaWQgPSAwOworPiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cis+ICsgICAgICAgICAgICAgfSAgIAorPiArICAgICB9CisKK0FueWJvZHkgZXZlcnkgaGVhcmQgb2YgbWVtY21wIG9yIGJhY21wIGFuZCBCREFERFJfQU5ZPworCis+ICsgICAgICAgICAgICAgaWYgKG5vdF92YWxpZCkgeworPiArICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8oaW5mby0+ZGV2LCAiVmFsaWQgYmx1ZXRvb3RoIGFkZHJlc3Mgbm90IGZvdW5kLCIKKz4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNldHRpbmcgc29tZSByYW5kb21cbiIpOworPiArICAgICAgICAgICAgICAgICAgICAgLyogV2hlbiBhZGRyZXNzIGlzIG5vdCB2YWxpZCwgdXNlIHNvbWUgcmFuZG9tICovCis+ICsgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaW5mby0+YmRfYWRkciwgbm9raWFfb3VpLCAzKTsKKz4gKyAgICAgICAgICAgICAgICAgICAgIGdldF9yYW5kb21fYnl0ZXMoaW5mby0+YmRfYWRkciArIDMsIDMpOworPiArICAgICAgICAgICAgIH0KKworCitBbmQgd2h5IGRvZXMgZXZlcnkgc2luZ2xlIGNoaXAgZmlybXdhcmUgZG9lcyB0aGlzIGRpZmZlcmVudGx5LiBTZXJpb3VzbHksIHRoaXMgaXMgYSBtZXNzLgorCis+ICt2b2lkIGhjaV9oNHBfcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKKz4gK3sKKz4gKyAgICAgc3dpdGNoIChpbmZvLT5tYW5faWQpIHsKKz4gKyAgICAgY2FzZSBINFBfSURfQ1NSOgorPiArICAgICAgICAgICAgIGhjaV9oNHBfYmM0X3BhcnNlX2Z3X2V2ZW50KGluZm8sIHNrYik7Cis+ICsgICAgICAgICAgICAgYnJlYWs7CisuLi4KKz4gK30KKworV2UgaGF2ZSBwcm9wZXIgSENJIHN5bmMgY29tbWFuZCBoYW5kbGluZyBpbiByZWNlbnQga2VybmVscy4gSSByZWFsbHkKK2RvIG5vdCBrbm93IHdoeSB0aGlzIGlzIGhhbmQgY29kZWQgdGhlc2UgZGF5cy4gQ2hlY2sgaG93IHRoZSBJbnRlbAorZmlybXdhcmUgbG9hZGluZyBpbnNpZGUgYnR1c2IuYyBkb2VzIGl0LgorCis+ICtpbmxpbmUgdTggaGNpX2g0cF9pbmIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IG9mZnNldCkKKz4gK3sgCis+ICsgICAgIHJldHVybiBfX3Jhd19yZWFkYihpbmZvLT51YXJ0X2Jhc2UgKyAob2Zmc2V0IDw8IDIpKTsKKz4gK30KKworSW5saW5lIGluIGEgKi5jIGZpbGUgZm9yIGEgbm9uLXN0YXRpYyBmdW5jdGlvbi4gTWFrZXMgbm8gc2Vuc2UgdG8gbWUuCisKKz4gKy8qKgorPiArICogc3RydWN0IGhjaV9oNHBfcGxhdGZvcm0gZGF0YSAtIGhjaV9oNHAgUGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUKKz4gKyAqLworPiArc3RydWN0IGhjaV9oNHBfcGxhdGZvcm1fZGF0YSB7CisKK3BsZWFzZSBoYXZlIGEgcHJvcGVyIG5hbWUgaGVyZS4gRm9yIGV4YW1wbGUKK2J0bm9raWFfaDRwX3BsYXRmb3JtX2RhdGEuCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kIENjOgorUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL2hjaV9oNHAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvaGNpX2g0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzRkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL2hjaV9oNHAuaApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5va2lhIEg0UCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fRFJJVkVSU19CTFVFVE9PVEhfSENJX0g0UF9ICisjZGVmaW5lIF9fRFJJVkVSU19CTFVFVE9PVEhfSENJX0g0UF9ICisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaS5oPgorCisjZGVmaW5lIFVBUlRfU1lTQ19PTUFQX1JFU0VUCTB4MDMKKyNkZWZpbmUgVUFSVF9TWVNTX1JFU0VURE9ORQkweDAxCisjZGVmaW5lIFVBUlRfT01BUF9TQ1JfRU1QVFlfVEhSCTB4MDgKKyNkZWZpbmUgVUFSVF9PTUFQX1NDUl9XQUtFVVAJMHgxMAorI2RlZmluZSBVQVJUX09NQVBfU1NSX1dBS0VVUAkweDAyCisjZGVmaW5lIFVBUlRfT01BUF9TU1JfVFhGVUxMCTB4MDEKKworI2RlZmluZSBVQVJUX09NQVBfU1lTQ19JRExFTU9ERQkJMHgwMworI2RlZmluZSBVQVJUX09NQVBfU1lTQ19JRExFTUFTSwkJKDMgPDwgVUFSVF9PTUFQX1NZU0NfSURMRU1PREUpCisKKyNkZWZpbmUgVUFSVF9PTUFQX1NZU0NfRk9SQ0VfSURMRQkoMCA8PCBVQVJUX09NQVBfU1lTQ19JRExFTU9ERSkKKyNkZWZpbmUgVUFSVF9PTUFQX1NZU0NfTk9fSURMRQkJKDEgPDwgVUFSVF9PTUFQX1NZU0NfSURMRU1PREUpCisjZGVmaW5lIFVBUlRfT01BUF9TWVNDX1NNQVJUX0lETEUJKDIgPDwgVUFSVF9PTUFQX1NZU0NfSURMRU1PREUpCisKKyNkZWZpbmUgSDRQX1RSQU5TRkVSX01PREUJCTEKKyNkZWZpbmUgSDRQX1NDSEVEX1RSQU5TRkVSX01PREUJCTIKKyNkZWZpbmUgSDRQX0FDVElWRV9NT0RFCQkJMworCitzdHJ1Y3QgaGNpX2g0cF9pbmZvIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBsYXp5X3JlbGVhc2U7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3BpbmxvY2tfdCBsb2NrOworCisJdm9pZCBfX2lvbWVtICp1YXJ0X2Jhc2U7CisJdW5zaWduZWQgbG9uZyB1YXJ0X3BoeXNfYmFzZTsKKwlpbnQgaXJxOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1OCBjaGlwX3R5cGU7CisJdTggYnRfd2FrZXVwX2dwaW87CisJdTggaG9zdF93YWtldXBfZ3BpbzsKKwl1OCByZXNldF9ncGlvOworCXU4IHJlc2V0X2dwaW9fc2hhcmVkOworCXU4IGJ0X3N5c2NsazsKKwl1OCBtYW5faWQ7CisJdTggdmVyX2lkOworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBmd19xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWxpdmVfY21kX3NrYjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBpbml0X2NvbXBsZXRpb247CisJc3RydWN0IGNvbXBsZXRpb24gZndfY29tcGxldGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0ZXN0X2NvbXBsZXRpb247CisJaW50IGZ3X2Vycm9yOworCWludCBpbml0X2Vycm9yOworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCWxvbmcgcnhfY291bnQ7CisJdW5zaWduZWQgbG9uZyByeF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGdhcmJhZ2VfYnl0ZXM7CisKKwl1OCBiZF9hZGRyWzZdOworCXN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3E7CisKKwlpbnQgcG1fZW5hYmxlZDsKKwlpbnQgdHhfZW5hYmxlZDsKKwlpbnQgYXV0b3J0czsKKwlpbnQgcnhfZW5hYmxlZDsKKwl1bnNpZ25lZCBsb25nIHBtX2ZsYWdzOworCisJaW50IHR4X2Nsb2Nrc19lbjsKKwlpbnQgcnhfY2xvY2tzX2VuOworCXNwaW5sb2NrX3QgY2xvY2tzX2xvY2s7CisJc3RydWN0IGNsayAqdWFydF9pY2xrOworCXN0cnVjdCBjbGsgKnVhcnRfZmNsazsKKwlhdG9taWNfdCBjbGtfdXNlcnM7CisJdTE2IGRsbDsKKwl1MTYgZGxoOworCXUxNiBpZXI7CisJdTE2IG1kcjE7CisJdTE2IGVmcjsKK307CisKK3N0cnVjdCBoY2lfaDRwX3JhZGlvX2hkciB7CisJX191OCBldnQ7CisJX191OCBkbGVuOworfSBfX3BhY2tlZDsKKworc3RydWN0IGhjaV9oNHBfbmVnX2hkciB7CisJX191OCBkbGVuOworfSBfX3BhY2tlZDsKKyNkZWZpbmUgSDRQX05FR19IRFJfU0laRSAxCisKKyNkZWZpbmUgSDRQX05FR19SRVEJMHgwMAorI2RlZmluZSBINFBfTkVHX0FDSwkweDIwCisjZGVmaW5lIEg0UF9ORUdfTkFLCTB4NDAKKworI2RlZmluZSBINFBfUFJPVE9fUEtUCTB4NDQKKyNkZWZpbmUgSDRQX1BST1RPX0JZVEUJMHg0YworCisjZGVmaW5lIEg0UF9JRF9DU1IJMHgwMgorI2RlZmluZSBINFBfSURfQkNNMjA0OAkweDA0CisjZGVmaW5lIEg0UF9JRF9USTEyNzEJMHgzMQorCitzdHJ1Y3QgaGNpX2g0cF9uZWdfY21kIHsKKwlfX3U4CWFjazsKKwlfX3UxNgliYXVkOworCV9fdTE2CXVudXNlZDE7CisJX191OAlwcm90bzsKKwlfX3UxNglzeXNfY2xrOworCV9fdTE2CXVudXNlZDI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGNpX2g0cF9uZWdfZXZ0IHsKKwlfX3U4CWFjazsKKwlfX3UxNgliYXVkOworCV9fdTE2CXVudXNlZDE7CisJX191OAlwcm90bzsKKwlfX3UxNglzeXNfY2xrOworCV9fdTE2CXVudXNlZDI7CisJX191OAltYW5faWQ7CisJX191OAl2ZXJfaWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEg0UF9BTElWRV9SRVEJMHg1NQorI2RlZmluZSBINFBfQUxJVkVfUkVTUAkweGNjCisKK3N0cnVjdCBoY2lfaDRwX2FsaXZlX2hkciB7CisJX191OAlkbGVuOworfSBfX3BhY2tlZDsKKyNkZWZpbmUgSDRQX0FMSVZFX0hEUl9TSVpFIDEKKworc3RydWN0IGhjaV9oNHBfYWxpdmVfcGt0IHsKKwlfX3U4CW1pZDsKKwlfX3U4CXVudXNlZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUFYX0JBVURfUkFURQkJOTIxNjAwCisjZGVmaW5lIEJDNF9NQVhfQkFVRF9SQVRFCTM2OTIzMDAKKyNkZWZpbmUgVUFSVF9DTE9DSwkJNDgwMDAwMDAKKyNkZWZpbmUgQlRfSU5JVF9ESVZJREVSCQkzMjAKKyNkZWZpbmUgQlRfQkFVRFJBVEVfRElWSURFUgkzODQwMDAwMDAKKyNkZWZpbmUgQlRfU1lTQ0xLX0RJVgkJMTAwMAorI2RlZmluZSBJTklUX1NQRUVECQkxMjAwMDAKKworI2RlZmluZSBINF9UWVBFX1NJWkUJCTEKKyNkZWZpbmUgSDRfUkFESU9fSERSX1NJWkUJMgorCisvKiBINCsgcGFja2V0IHR5cGVzICovCisjZGVmaW5lIEg0X0NNRF9QS1QJCTB4MDEKKyNkZWZpbmUgSDRfQUNMX1BLVAkJMHgwMgorI2RlZmluZSBINF9TQ09fUEtUCQkweDAzCisjZGVmaW5lIEg0X0VWVF9QS1QJCTB4MDQKKyNkZWZpbmUgSDRfTkVHX1BLVAkJMHgwNgorI2RlZmluZSBINF9BTElWRV9QS1QJCTB4MDcKKyNkZWZpbmUgSDRfUkFESU9fUEtUCQkweDA4CisKKy8qIFRYIHN0YXRlcyAqLworI2RlZmluZSBXQUlUX0ZPUl9QS1RfVFlQRQkxCisjZGVmaW5lIFdBSVRfRk9SX0hFQURFUgkJMgorI2RlZmluZSBXQUlUX0ZPUl9EQVRBCQkzCisKK3N0cnVjdCBoY2lfZndfZXZlbnQgeworCXN0cnVjdCBoY2lfZXZlbnRfaGRyIGhldjsKKwlzdHJ1Y3QgaGNpX2V2X2NtZF9jb21wbGV0ZSBjbWQ7CisJdTggc3RhdHVzOworfSBfX3BhY2tlZDsKKworaW50IGhjaV9oNHBfc2VuZF9hbGl2ZV9wYWNrZXQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7CisKK3ZvaWQgaGNpX2g0cF9iY21fcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBoY2lfaDRwX2JjbV9zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSk7CisKK3ZvaWQgaGNpX2g0cF9iYzRfcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBoY2lfaDRwX2JjNF9zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSk7CisKK3ZvaWQgaGNpX2g0cF90aTEyNzNfcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgaGNpX2g0cF90aTEyNzNfc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJICAgIHN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKTsKKworaW50IGhjaV9oNHBfcmVhZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSk7CitpbnQgaGNpX2g0cF9zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKTsKK3ZvaWQgaGNpX2g0cF9wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwordm9pZCBoY2lfaDRwX291dGIoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IG9mZnNldCwgdTggdmFsKTsKK3U4IGhjaV9oNHBfaW5iKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBvZmZzZXQpOwordm9pZCBoY2lfaDRwX3NldF9ydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IGFjdGl2ZSk7CitpbnQgaGNpX2g0cF93YWl0X2Zvcl9jdHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IGFjdGl2ZSwgaW50IHRpbWVvdXRfbXMpOwordm9pZCBfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBvbiwgdTggd2hpY2gpOwordm9pZCBoY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgb24sIHU4IHdoaWNoKTsKK3ZvaWQgaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBzcGVlZCk7CitpbnQgaGNpX2g0cF9yZXNldF91YXJ0KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pOwordm9pZCBoY2lfaDRwX2luaXRfdWFydChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKK3ZvaWQgaGNpX2g0cF9lbmFibGVfdHgoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cit2b2lkIGhjaV9oNHBfc3RvcmVfcmVncyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKTsKK3ZvaWQgaGNpX2g0cF9yZXN0b3JlX3JlZ3Moc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyk7Cit2b2lkIGhjaV9oNHBfc21hcnRfaWRsZShzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBib29sIGVuYWJsZSk7CisKKyNlbmRpZiAvKiBfX0RSSVZFUlNfQkxVRVRPT1RIX0hDSV9INFBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTE5Y2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9jb3JlLmMKQEAgLTAsMCArMSwxMjA2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTm9raWEgSDRQIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICogVGhhbmtzIHRvIGFsbCB0aGUgTm9raWEgcGVvcGxlIHRoYXQgaGVscGVkIHdpdGggdGhpcyBkcml2ZXIsCisgKiBpbmNsdWRpbmcgVmlsbGUgVGVydm8gYW5kIFJvZ2VyIFF1YWRyb3MuCisgKgorICogUG93ZXIgc2F2aW5nIGZ1bmN0aW9uYWxpdHkgd2FzIHJlbW92ZWQgZnJvbSB0aGlzIGRyaXZlciB0byBtYWtlCisgKiBtZXJnaW5nIGVhc2llci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2J0LW5va2lhLWg0cC5oPgorCisjaW5jbHVkZSAiaGNpX2g0cC5oIgorCisvKiBUaGlzIHNob3VsZCBiZSB1c2VkIGluIGZ1bmN0aW9uIHRoYXQgY2Fubm90IHJlbGVhc2UgY2xvY2tzICovCitzdGF0aWMgdm9pZCBoY2lfaDRwX3NldF9jbGsoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50ICpjbG9jaywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmNsb2Nrc19sb2NrLCBmbGFncyk7CisJaWYgKGVuYWJsZSAmJiAhKmNsb2NrKSB7CisJCUJUX0RCRygiRW5hYmxpbmcgJXAiLCBjbG9jayk7CisJCWNsa19wcmVwYXJlX2VuYWJsZShpbmZvLT51YXJ0X2ZjbGspOworCQljbGtfcHJlcGFyZV9lbmFibGUoaW5mby0+dWFydF9pY2xrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZpbmZvLT5jbGtfdXNlcnMpID09IDApCisJCQloY2lfaDRwX3Jlc3RvcmVfcmVncyhpbmZvKTsKKwkJYXRvbWljX2luYygmaW5mby0+Y2xrX3VzZXJzKTsKKwl9CisKKwlpZiAoIWVuYWJsZSAmJiAqY2xvY2spIHsKKwkJQlRfREJHKCJEaXNhYmxpbmcgJXAiLCBjbG9jayk7CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpbmZvLT5jbGtfdXNlcnMpKQorCQkJaGNpX2g0cF9zdG9yZV9yZWdzKGluZm8pOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaW5mby0+dWFydF9mY2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPnVhcnRfaWNsayk7CisJfQorCisJKmNsb2NrID0gZW5hYmxlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmNsb2Nrc19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfbGF6eV9jbG9ja19yZWxlYXNlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gKHN0cnVjdCBoY2lfaDRwX2luZm8gKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyogUG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK3ZvaWQgaGNpX2g0cF9zbWFydF9pZGxlKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGJvb2wgZW5hYmxlKQoreworCXU4IHY7CisKKwl2ID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NZU0MpOworCXYgJj0gfihVQVJUX09NQVBfU1lTQ19JRExFTUFTSyk7CisKKwlpZiAoZW5hYmxlKQorCQl2IHw9IFVBUlRfT01BUF9TWVNDX1NNQVJUX0lETEU7CisJZWxzZQorCQl2IHw9IFVBUlRfT01BUF9TWVNDX05PX0lETEU7CisKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX1NZU0MsIHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaDRwX3NjaGVkdWxlX3BtKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfZGlzYWJsZV90eChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCWlmICghaW5mby0+cG1fZW5hYmxlZCkKKwkJcmV0dXJuOworCisJLyogUmUtZW5hYmxlIHNtYXJ0LWlkbGUgKi8KKwloY2lfaDRwX3NtYXJ0X2lkbGUoaW5mbywgMSk7CisKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMCk7CisJbW9kX3RpbWVyKCZpbmZvLT5sYXp5X3JlbGVhc2UsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCkpOworCWluZm8tPnR4X2VuYWJsZWQgPSAwOworfQorCit2b2lkIGhjaV9oNHBfZW5hYmxlX3R4KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mby0+cG1fZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaDRwX3NjaGVkdWxlX3BtKGluZm8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlkZWxfdGltZXIoJmluZm8tPmxhenlfcmVsZWFzZSk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDEpOworCWluZm8tPnR4X2VuYWJsZWQgPSAxOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAxKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCSAgICAgVUFSVF9JRVJfVEhSSSk7CisJLyoKKwkgKiBEaXNhYmxlIHNtYXJ0LWlkbGUgYXMgVUFSVCBUWCBpbnRlcnJ1cHRzCisJICogYXJlIG5vdCB3YWtlLXVwIGNhcGFibGUKKwkgKi8KKwloY2lfaDRwX3NtYXJ0X2lkbGUoaW5mbywgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfZGlzYWJsZV9yeChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCWlmICghaW5mby0+cG1fZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaW5mby0+cnhfZW5hYmxlZCA9IDA7CisKKwlpZiAoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfRFIpCisJCXJldHVybjsKKworCWlmICghKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKQorCQlyZXR1cm47CisKKwlfX2hjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDAsIFVBUlRfRUZSX1JUUyk7CisJaW5mby0+YXV0b3J0cyA9IDA7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIDApOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX2VuYWJsZV9yeChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCWlmICghaW5mby0+cG1fZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaDRwX3NjaGVkdWxlX3BtKGluZm8pOworCisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIDEpOworCWluZm8tPnJ4X2VuYWJsZWQgPSAxOworCisJaWYgKCEoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpCisJCXJldHVybjsKKworCV9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMSwgVUFSVF9FRlJfUlRTKTsKKwlpbmZvLT5hdXRvcnRzID0gMTsKK30KKworLyogTmVnb3RpYXRpb24gZnVuY3Rpb25zICovCitpbnQgaGNpX2g0cF9zZW5kX2FsaXZlX3BhY2tldChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCXN0cnVjdCBoY2lfaDRwX2FsaXZlX2hkciAqaGRyOworCXN0cnVjdCBoY2lfaDRwX2FsaXZlX3BrdCAqcGt0OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGVuOworCisJQlRfREJHKCJTZW5kaW5nIGFsaXZlIHBhY2tldCIpOworCisJbGVuID0gSDRfVFlQRV9TSVpFICsgc2l6ZW9mKCpoZHIpICsgc2l6ZW9mKCpwa3QpOworCXNrYiA9IGJ0X3NrYl9hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChza2ItPmRhdGEsIDB4MDAsIGxlbik7CisJKnNrYl9wdXQoc2tiLCAxKSA9IEg0X0FMSVZFX1BLVDsKKwloZHIgPSAoc3RydWN0IGhjaV9oNHBfYWxpdmVfaGRyICopc2tiX3B1dChza2IsIHNpemVvZigqaGRyKSk7CisJaGRyLT5kbGVuID0gc2l6ZW9mKCpwa3QpOworCXBrdCA9IChzdHJ1Y3QgaGNpX2g0cF9hbGl2ZV9wa3QgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpwa3QpKTsKKwlwa3QtPm1pZCA9IEg0UF9BTElWRV9SRVE7CisKKwlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBza2IpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkgICAgIFVBUlRfSUVSX1RIUkkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCUJUX0RCRygiQWxpdmUgcGFja2V0IHNlbnQiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX2FsaXZlX3BhY2tldChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfaDRwX2FsaXZlX2hkciAqaGRyOworCXN0cnVjdCBoY2lfaDRwX2FsaXZlX3BrdCAqcGt0OworCisJQlRfREJHKCJSZWNlaXZlZCBhbGl2ZSBwYWNrZXQiKTsKKwloZHIgPSAoc3RydWN0IGhjaV9oNHBfYWxpdmVfaGRyICopc2tiLT5kYXRhOworCWlmIChoZHItPmRsZW4gIT0gc2l6ZW9mKCpwa3QpKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ29ycnVwdGVkIGFsaXZlIG1lc3NhZ2VcbiIpOworCQlpbmZvLT5pbml0X2Vycm9yID0gLUVJTzsKKwkJZ290byBmaW5pc2hfYWxpdmU7CisJfQorCisJcGt0ID0gKHN0cnVjdCBoY2lfaDRwX2FsaXZlX3BrdCAqKXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwlpZiAocGt0LT5taWQgIT0gSDRQX0FMSVZFX1JFU1ApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDb3VsZCBub3QgbmVnb3RpYXRlIGhjaV9oNHAgc2V0dGluZ3NcbiIpOworCQlpbmZvLT5pbml0X2Vycm9yID0gLUVJTlZBTDsKKwl9CisKK2ZpbmlzaF9hbGl2ZToKKwljb21wbGV0ZSgmaW5mby0+aW5pdF9jb21wbGV0aW9uKTsKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBoY2lfaDRwX3NlbmRfbmVnb3RpYXRpb24oc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9uZWdfY21kICpuZWdfY21kOworCXN0cnVjdCBoY2lfaDRwX25lZ19oZHIgKm5lZ19oZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIsIGxlbjsKKwl1MTYgc3lzY2xrOworCisJQlRfREJHKCJTZW5kaW5nIG5lZ290aWF0aW9uLi4iKTsKKworCXN3aXRjaCAoaW5mby0+YnRfc3lzY2xrKSB7CisJY2FzZSAxOgorCQlzeXNjbGsgPSAxMjAwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzeXNjbGsgPSAzODQwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGVuID0gc2l6ZW9mKCpuZWdfY21kKSArIHNpemVvZigqbmVnX2hkcikgKyBINF9UWVBFX1NJWkU7CisJc2tiID0gYnRfc2tiX2FsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHNrYi0+ZGF0YSwgMHgwMCwgbGVuKTsKKwkqc2tiX3B1dChza2IsIDEpID0gSDRfTkVHX1BLVDsKKwluZWdfaGRyID0gKHN0cnVjdCBoY2lfaDRwX25lZ19oZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpuZWdfaGRyKSk7CisJbmVnX2NtZCA9IChzdHJ1Y3QgaGNpX2g0cF9uZWdfY21kICopc2tiX3B1dChza2IsIHNpemVvZigqbmVnX2NtZCkpOworCisJbmVnX2hkci0+ZGxlbiA9IHNpemVvZigqbmVnX2NtZCk7CisJbmVnX2NtZC0+YWNrID0gSDRQX05FR19SRVE7CisJbmVnX2NtZC0+YmF1ZCA9IGNwdV90b19sZTE2KEJUX0JBVURSQVRFX0RJVklERVIvTUFYX0JBVURfUkFURSk7CisJbmVnX2NtZC0+cHJvdG8gPSBINFBfUFJPVE9fQllURTsKKwluZWdfY21kLT5zeXNfY2xrID0gY3B1X3RvX2xlMTYoc3lzY2xrKTsKKworCWhjaV9oNHBfY2hhbmdlX3NwZWVkKGluZm8sIElOSVRfU1BFRUQpOworCisJaGNpX2g0cF9zZXRfcnRzKGluZm8sIDEpOworCWluZm8tPmluaXRfZXJyb3IgPSAwOworCWluaXRfY29tcGxldGlvbigmaW5mby0+aW5pdF9jb21wbGV0aW9uKTsKKwlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBza2IpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkgICAgIFVBUlRfSUVSX1RIUkkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmluZm8tPmluaXRfY29tcGxldGlvbiwKKwkJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoaW5mby0+aW5pdF9lcnJvciA8IDApCisJCXJldHVybiBpbmZvLT5pbml0X2Vycm9yOworCisJLyogQ2hhbmdlIHRvIG9wZXJhdGlvbmFsIHNldHRpbmdzICovCisJaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMCwgVUFSVF9FRlJfUlRTKTsKKwloY2lfaDRwX3NldF9ydHMoaW5mbywgMCk7CisJaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoaW5mbywgTUFYX0JBVURfUkFURSk7CisKKwllcnIgPSBoY2lfaDRwX3dhaXRfZm9yX2N0cyhpbmZvLCAxLCAxMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMSwgVUFSVF9FRlJfUlRTKTsKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmluaXRfY29tcGxldGlvbik7CisJZXJyID0gaGNpX2g0cF9zZW5kX2FsaXZlX3BhY2tldChpbmZvKTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmaW5mby0+aW5pdF9jb21wbGV0aW9uLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCWlmIChpbmZvLT5pbml0X2Vycm9yIDwgMCkKKwkJcmV0dXJuIGluZm8tPmluaXRfZXJyb3I7CisKKwlCVF9EQkcoIk5lZ290aWF0aW9uIHN1Y2Nlc3NmdWwiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGNpX2g0cF9uZWdvdGlhdGlvbl9wYWNrZXQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9uZWdfaGRyICpoZHI7CisJc3RydWN0IGhjaV9oNHBfbmVnX2V2dCAqZXZ0OworCisJaGRyID0gKHN0cnVjdCBoY2lfaDRwX25lZ19oZHIgKilza2ItPmRhdGE7CisJaWYgKGhkci0+ZGxlbiAhPSBzaXplb2YoKmV2dCkpIHsKKwkJaW5mby0+aW5pdF9lcnJvciA9IC1FSU87CisJCWdvdG8gZmluaXNoX25lZzsKKwl9CisKKwlldnQgPSAoc3RydWN0IGhjaV9oNHBfbmVnX2V2dCAqKXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKworCWlmIChldnQtPmFjayAhPSBINFBfTkVHX0FDSykgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNvdWxkIG5vdCBuZWdvdGlhdGUgaGNpX2g0cCBzZXR0aW5nc1xuIik7CisJCWluZm8tPmluaXRfZXJyb3IgPSAtRUlOVkFMOworCX0KKworCWluZm8tPm1hbl9pZCA9IGV2dC0+bWFuX2lkOworCWluZm8tPnZlcl9pZCA9IGV2dC0+dmVyX2lkOworCitmaW5pc2hfbmVnOgorCisJY29tcGxldGUoJmluZm8tPmluaXRfY29tcGxldGlvbik7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qIEg0IHBhY2tldCBoYW5kbGluZyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgaGNpX2g0cF9nZXRfaGRyX2xlbihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1OCBwa3RfdHlwZSkKK3sKKwlsb25nIHJldHZhbDsKKworCXN3aXRjaCAocGt0X3R5cGUpIHsKKwljYXNlIEg0X0VWVF9QS1Q6CisJCXJldHZhbCA9IEhDSV9FVkVOVF9IRFJfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBINF9BQ0xfUEtUOgorCQlyZXR2YWwgPSBIQ0lfQUNMX0hEUl9TSVpFOworCQlicmVhazsKKwljYXNlIEg0X1NDT19QS1Q6CisJCXJldHZhbCA9IEhDSV9TQ09fSERSX1NJWkU7CisJCWJyZWFrOworCWNhc2UgSDRfTkVHX1BLVDoKKwkJcmV0dmFsID0gSDRQX05FR19IRFJfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBINF9BTElWRV9QS1Q6CisJCXJldHZhbCA9IEg0UF9BTElWRV9IRFJfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBINF9SQURJT19QS1Q6CisJCXJldHZhbCA9IEg0X1JBRElPX0hEUl9TSVpFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwgIlVua25vd24gSDQgcGFja2V0IHR5cGUgMHglLjJ4XG4iLCBwa3RfdHlwZSk7CisJCXJldHZhbCA9IC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhjaV9oNHBfZ2V0X2RhdGFfbGVuKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxvbmcgcmV0dmFsID0gLTE7CisJc3RydWN0IGhjaV9hY2xfaGRyICphY2xfaGRyOworCXN0cnVjdCBoY2lfc2NvX2hkciAqc2NvX2hkcjsKKwlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqZXZ0X2hkcjsKKwlzdHJ1Y3QgaGNpX2g0cF9uZWdfaGRyICpuZWdfaGRyOworCXN0cnVjdCBoY2lfaDRwX2FsaXZlX2hkciAqYWxpdmVfaGRyOworCXN0cnVjdCBoY2lfaDRwX3JhZGlvX2hkciAqcmFkaW9faGRyOworCisJc3dpdGNoIChidF9jYihza2IpLT5wa3RfdHlwZSkgeworCWNhc2UgSDRfRVZUX1BLVDoKKwkJZXZ0X2hkciA9IChzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqKXNrYi0+ZGF0YTsKKwkJcmV0dmFsID0gZXZ0X2hkci0+cGxlbjsKKwkJYnJlYWs7CisJY2FzZSBINF9BQ0xfUEtUOgorCQlhY2xfaGRyID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKXNrYi0+ZGF0YTsKKwkJcmV0dmFsID0gbGUxNl90b19jcHUoYWNsX2hkci0+ZGxlbik7CisJCWJyZWFrOworCWNhc2UgSDRfU0NPX1BLVDoKKwkJc2NvX2hkciA9IChzdHJ1Y3QgaGNpX3Njb19oZHIgKilza2ItPmRhdGE7CisJCXJldHZhbCA9IHNjb19oZHItPmRsZW47CisJCWJyZWFrOworCWNhc2UgSDRfUkFESU9fUEtUOgorCQlyYWRpb19oZHIgPSAoc3RydWN0IGhjaV9oNHBfcmFkaW9faGRyICopc2tiLT5kYXRhOworCQlyZXR2YWwgPSByYWRpb19oZHItPmRsZW47CisJCWJyZWFrOworCWNhc2UgSDRfTkVHX1BLVDoKKwkJbmVnX2hkciA9IChzdHJ1Y3QgaGNpX2g0cF9uZWdfaGRyICopc2tiLT5kYXRhOworCQlyZXR2YWwgPSBuZWdfaGRyLT5kbGVuOworCQlicmVhazsKKwljYXNlIEg0X0FMSVZFX1BLVDoKKwkJYWxpdmVfaGRyID0gKHN0cnVjdCBoY2lfaDRwX2FsaXZlX2hkciAqKXNrYi0+ZGF0YTsKKwkJcmV0dmFsID0gYWxpdmVfaGRyLT5kbGVuOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2g0cF9yZWN2X2ZyYW1lKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAodW5saWtlbHkoIXRlc3RfYml0KEhDSV9SVU5OSU5HLCAmaW5mby0+aGRldi0+ZmxhZ3MpKSkgeworCQlzd2l0Y2ggKGJ0X2NiKHNrYiktPnBrdF90eXBlKSB7CisJCWNhc2UgSDRfTkVHX1BLVDoKKwkJCWhjaV9oNHBfbmVnb3RpYXRpb25fcGFja2V0KGluZm8sIHNrYik7CisJCQlpbmZvLT5yeF9zdGF0ZSA9IFdBSVRfRk9SX1BLVF9UWVBFOworCQkJcmV0dXJuOworCQljYXNlIEg0X0FMSVZFX1BLVDoKKwkJCWhjaV9oNHBfYWxpdmVfcGFja2V0KGluZm8sIHNrYik7CisJCQlpbmZvLT5yeF9zdGF0ZSA9IFdBSVRfRk9SX1BLVF9UWVBFOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCF0ZXN0X2JpdChIQ0lfVVAsICZpbmZvLT5oZGV2LT5mbGFncykpIHsKKwkJCUJUX0RCRygiZndfZXZlbnQiKTsKKwkJCWhjaV9oNHBfcGFyc2VfZndfZXZlbnQoaW5mbywgc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWhjaV9yZWN2X2ZyYW1lKGluZm8tPmhkZXYsIHNrYik7CisJQlRfREJHKCJGcmFtZSBzZW50IHRvIHVwcGVyIGxheWVyIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaDRwX2hhbmRsZV9ieXRlKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHU4IGJ5dGUpCit7CisJc3dpdGNoIChpbmZvLT5yeF9zdGF0ZSkgeworCWNhc2UgV0FJVF9GT1JfUEtUX1RZUEU6CisJCWJ0X2NiKGluZm8tPnJ4X3NrYiktPnBrdF90eXBlID0gYnl0ZTsKKwkJaW5mby0+cnhfY291bnQgPSBoY2lfaDRwX2dldF9oZHJfbGVuKGluZm8sIGJ5dGUpOworCQlpZiAoaW5mby0+cnhfY291bnQgPCAwKSB7CisJCQlpbmZvLT5oZGV2LT5zdGF0LmVycl9yeCsrOworCQkJa2ZyZWVfc2tiKGluZm8tPnJ4X3NrYik7CisJCQlpbmZvLT5yeF9za2IgPSBOVUxMOworCQl9IGVsc2UgeworCQkJaW5mby0+cnhfc3RhdGUgPSBXQUlUX0ZPUl9IRUFERVI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXQUlUX0ZPUl9IRUFERVI6CisJCWluZm8tPnJ4X2NvdW50LS07CisJCSpza2JfcHV0KGluZm8tPnJ4X3NrYiwgMSkgPSBieXRlOworCQlpZiAoaW5mby0+cnhfY291bnQgIT0gMCkKKwkJCWJyZWFrOworCQlpbmZvLT5yeF9jb3VudCA9IGhjaV9oNHBfZ2V0X2RhdGFfbGVuKGluZm8sIGluZm8tPnJ4X3NrYik7CisJCWlmIChpbmZvLT5yeF9jb3VudCA+IHNrYl90YWlscm9vbShpbmZvLT5yeF9za2IpKSB7CisJCQlkZXZfZXJyKGluZm8tPmRldiwgImZyYW1lIHRvbyBsb25nXG4iKTsKKwkJCWluZm8tPmdhcmJhZ2VfYnl0ZXMgPSBpbmZvLT5yeF9jb3VudAorCQkJCS0gc2tiX3RhaWxyb29tKGluZm8tPnJ4X3NrYik7CisJCQlrZnJlZV9za2IoaW5mby0+cnhfc2tiKTsKKwkJCWluZm8tPnJ4X3NrYiA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpbmZvLT5yeF9zdGF0ZSA9IFdBSVRfRk9SX0RBVEE7CisJCWJyZWFrOworCWNhc2UgV0FJVF9GT1JfREFUQToKKwkJaW5mby0+cnhfY291bnQtLTsKKwkJKnNrYl9wdXQoaW5mby0+cnhfc2tiLCAxKSA9IGJ5dGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCWJyZWFrOworCX0KKworCWlmIChpbmZvLT5yeF9jb3VudCA9PSAwKSB7CisJCS8qIEg0KyBkZXZpY2VzIHNob3VsZCBhbHdheXMgc2VuZCB3b3JkIGFsaWduZWQgcGFja2V0cyAqLworCQlpZiAoIShpbmZvLT5yeF9za2ItPmxlbiAlIDIpKQorCQkJaW5mby0+Z2FyYmFnZV9ieXRlcysrOworCQloY2lfaDRwX3JlY3ZfZnJhbWUoaW5mbywgaW5mby0+cnhfc2tiKTsKKwkJaW5mby0+cnhfc2tiID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfcnhfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdTggYnl0ZTsKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gKHN0cnVjdCBoY2lfaDRwX2luZm8gKilkYXRhOworCisJQlRfREJHKCJ0YXNrbGV0IHdva2UgdXAiKTsKKwlCVF9EQkcoInJ4X3Rhc2tsZXQgd29rZSB1cCIpOworCisJd2hpbGUgKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKSB7CisJCWJ5dGUgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX1JYKTsKKwkJaWYgKGluZm8tPmdhcmJhZ2VfYnl0ZXMpIHsKKwkJCWluZm8tPmdhcmJhZ2VfYnl0ZXMtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpbmZvLT5yeF9za2IgPT0gTlVMTCkgeworCQkJaW5mby0+cnhfc2tiID0gYnRfc2tiX2FsbG9jKEhDSV9NQVhfRlJBTUVfU0laRSwKKwkJCQkJCSAgICBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CisJCQlpZiAoIWluZm8tPnJ4X3NrYikgeworCQkJCWRldl9lcnIoaW5mby0+ZGV2LAorCQkJCQkiTm8gbWVtb3J5IGZvciBuZXcgcGFja2V0XG4iKTsKKwkJCQlnb3RvIGZpbmlzaF9yeDsKKwkJCX0KKwkJCWluZm8tPnJ4X3N0YXRlID0gV0FJVF9GT1JfUEtUX1RZUEU7CisJCQlpbmZvLT5yeF9za2ItPmRldiA9ICh2b2lkICopaW5mby0+aGRldjsKKwkJfQorCQlpbmZvLT5oZGV2LT5zdGF0LmJ5dGVfcngrKzsKKwkJaGNpX2g0cF9oYW5kbGVfYnl0ZShpbmZvLCBieXRlKTsKKwl9CisKKwlpZiAoIWluZm8tPnJ4X2VuYWJsZWQpIHsKKwkJaWYgKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQgJiYKKwkJCQkJCSAgaW5mby0+YXV0b3J0cykgeworCQkJX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAwICwgVUFSVF9FRlJfUlRTKTsKKwkJCWluZm8tPmF1dG9ydHMgPSAwOworCQl9CisJCS8qIEZsdXNoIHBvc3RlZCB3cml0ZSB0byBhdm9pZCBzcHVyaW91cyBpbnRlcnJ1cHRzICovCisJCWhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TQ1IpOworCQloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgMCk7CisJfQorCitmaW5pc2hfcng6CisJQlRfREJHKCJyeF9lbmRlZCIpOworfQorCitzdGF0aWMgdm9pZCBoY2lfaDRwX3R4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGludCBzZW50ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSAoc3RydWN0IGhjaV9oNHBfaW5mbyAqKWRhdGE7CisKKwlCVF9EQkcoInRhc2tsZXQgd29rZSB1cCIpOworCUJUX0RCRygidHhfdGFza2xldCB3b2tlIHVwIik7CisKKwlpZiAoaW5mby0+YXV0b3J0cyAhPSBpbmZvLT5yeF9lbmFibGVkKSB7CisJCWlmIChoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSB7CisJCQlpZiAoaW5mby0+YXV0b3J0cyAmJiAhaW5mby0+cnhfZW5hYmxlZCkgeworCQkJCV9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMCwKKwkJCQkJCQkgIFVBUlRfRUZSX1JUUyk7CisJCQkJaW5mby0+YXV0b3J0cyA9IDA7CisJCQl9CisJCQlpZiAoIWluZm8tPmF1dG9ydHMgJiYgaW5mby0+cnhfZW5hYmxlZCkgeworCQkJCV9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMSwKKwkJCQkJCQkgIFVBUlRfRUZSX1JUUyk7CisJCQkJaW5mby0+YXV0b3J0cyA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX1NDUiwKKwkJCQkgICAgIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfT01BUF9TQ1IpIHwKKwkJCQkgICAgIFVBUlRfT01BUF9TQ1JfRU1QVFlfVEhSKTsKKwkJCWdvdG8gZmluaXNoX3R4OworCQl9CisJfQorCisJc2tiID0gc2tiX2RlcXVldWUoJmluZm8tPnR4cSk7CisJaWYgKCFza2IpIHsKKwkJLyogTm8gZGF0YSBpbiBidWZmZXIgKi8KKwkJQlRfREJHKCJza2IgcmVhZHkiKTsKKwkJaWYgKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpIHsKKwkJCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwKKwkJCQkgICAgIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSAmCisJCQkJICAgICB+VUFSVF9JRVJfVEhSSSk7CisJCQloY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU0NSKTsKKwkJCWhjaV9oNHBfZGlzYWJsZV90eChpbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX1NDUiwKKwkJCSAgICAgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NDUikgfAorCQkJICAgICBVQVJUX09NQVBfU0NSX0VNUFRZX1RIUik7CisJCWdvdG8gZmluaXNoX3R4OworCX0KKworCS8qIENvcHkgZGF0YSB0byB0eCBmaWZvICovCisJd2hpbGUgKCEoaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9PTUFQX1NTUikgJiBVQVJUX09NQVBfU1NSX1RYRlVMTCkgJiYKKwkgICAgICAgKHNlbnQgPCBza2ItPmxlbikpIHsKKwkJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfVFgsIHNrYi0+ZGF0YVtzZW50XSk7CisJCXNlbnQrKzsKKwl9CisKKwlpbmZvLT5oZGV2LT5zdGF0LmJ5dGVfdHggKz0gc2VudDsKKwlpZiAoc2tiLT5sZW4gPT0gc2VudCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlza2JfcHVsbChza2IsIHNlbnQpOworCQlza2JfcXVldWVfaGVhZCgmaW5mby0+dHhxLCBza2IpOworCX0KKworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfU0NSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU0NSKSAmCisJCQkJCQkgICAgIH5VQVJUX09NQVBfU0NSX0VNUFRZX1RIUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkJCQkJIFVBUlRfSUVSX1RIUkkpOworCitmaW5pc2hfdHg6CisJLyogRmx1c2ggcG9zdGVkIHdyaXRlIHRvIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMgKi8KKwloY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU0NSKTsKKworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaGNpX2g0cF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gKHN0cnVjdCBoY2lfaDRwX2luZm8gKilkYXRhOworCXU4IGlpciwgbXNyOworCWludCByZXQ7CisKKwlyZXQgPSBJUlFfTk9ORTsKKworCWlpciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUlSKTsKKwlpZiAoaWlyICYgVUFSVF9JSVJfTk9fSU5UKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlCVF9EQkcoIkluIGludGVycnVwdCBoYW5kbGVyIGlpciAweCUuMngiLCBpaXIpOworCisJaWlyICY9IFVBUlRfSUlSX0lEOworCisJaWYgKGlpciA9PSBVQVJUX0lJUl9NU0kpIHsKKwkJbXNyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9NU1IpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisJaWYgKGlpciA9PSBVQVJUX0lJUl9STFNJKSB7CisJCWhjaV9oNHBfaW5iKGluZm8sIFVBUlRfUlgpOworCQloY2lfaDRwX2luYihpbmZvLCBVQVJUX0xTUik7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmIChpaXIgPT0gVUFSVF9JSVJfUkRJKSB7CisJCWhjaV9oNHBfcnhfdGFza2xldCgodW5zaWduZWQgbG9uZylkYXRhKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGlpciA9PSBVQVJUX0lJUl9USFJJKSB7CisJCWhjaV9oNHBfdHhfdGFza2xldCgodW5zaWduZWQgbG9uZylkYXRhKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IGhjaV9oNHBfd2FrZXVwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdCkKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gZGV2X2luc3Q7CisJaW50IHNob3VsZF93YWtldXA7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisKKwlpZiAoIWluZm8tPmhkZXYpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXNob3VsZF93YWtldXAgPSBncGlvX2dldF92YWx1ZShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKTsKKwloZGV2ID0gaW5mby0+aGRldjsKKworCWlmICghdGVzdF9iaXQoSENJX1JVTk5JTkcsICZoZGV2LT5mbGFncykpIHsKKwkJaWYgKHNob3VsZF93YWtldXAgPT0gMSkKKwkJCWNvbXBsZXRlX2FsbCgmaW5mby0+dGVzdF9jb21wbGV0aW9uKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJQlRfREJHKCJncGlvIGludGVycnVwdCAlZCIsIHNob3VsZF93YWtldXApOworCisJLyogQ2hlY2sgaWYgd2VlIGhhdmUgbWlzc2VkIHNvbWUgaW50ZXJydXB0cyAqLworCWlmIChpbmZvLT5yeF9lbmFibGVkID09IHNob3VsZF93YWtldXApCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWlmIChzaG91bGRfd2FrZXVwKQorCQloY2lfaDRwX2VuYWJsZV9yeChpbmZvKTsKKwllbHNlCisJCWhjaV9oNHBfZGlzYWJsZV9yeChpbmZvKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhjaV9oNHBfc2V0X3BtX2xpbWl0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBib29sIHNldCkKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9wbGF0Zm9ybV9kYXRhICpidF9wbGF0X2RhdGEgPSBpbmZvLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJY29uc3QgY2hhciAqc3NldCA9IHNldCA/ICJzZXQiIDogImNsZWFyIjsKKworCWlmICh1bmxpa2VseSghYnRfcGxhdF9kYXRhIHx8ICFidF9wbGF0X2RhdGEtPnNldF9wbV9saW1pdHMpKQorCQlyZXR1cm47CisKKwlpZiAoc2V0ICE9ICEhdGVzdF9iaXQoSDRQX0FDVElWRV9NT0RFLCAmaW5mby0+cG1fZmxhZ3MpKSB7CisJCWJ0X3BsYXRfZGF0YS0+c2V0X3BtX2xpbWl0cyhpbmZvLT5kZXYsIHNldCk7CisJCWlmIChzZXQpCisJCQlzZXRfYml0KEg0UF9BQ1RJVkVfTU9ERSwgJmluZm8tPnBtX2ZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KEg0UF9BQ1RJVkVfTU9ERSwgJmluZm8tPnBtX2ZsYWdzKTsKKwkJQlRfREJHKCJDaGFuZ2UgcG0gY29uc3RyYWludHMgdG86ICVzIiwgc3NldCk7CisJCXJldHVybjsKKwl9CisKKwlCVF9EQkcoInBtIGNvbnN0cmFpbnRzIHJlbWFpbnM6ICVzIiwgc3NldCk7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9yZXNldChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCWludCBlcnI7CisKKwllcnIgPSBoY2lfaDRwX3Jlc2V0X3VhcnQoaW5mbyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJVYXJ0IHJlc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCWhjaV9oNHBfaW5pdF91YXJ0KGluZm8pOworCWhjaV9oNHBfc2V0X3J0cyhpbmZvLCAwKTsKKworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPnJlc2V0X2dwaW8sIDApOworCWdwaW9fc2V0X3ZhbHVlKGluZm8tPmJ0X3dha2V1cF9ncGlvLCAxKTsKKwltc2xlZXAoMTApOworCisJaWYgKGdwaW9fZ2V0X3ZhbHVlKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pID09IDEpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJob3N0X3dha2V1cF9ncGlvIG5vdCBsb3dcbiIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPnRlc3RfY29tcGxldGlvbik7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+cmVzZXRfZ3BpbywgMSk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZpbmZvLT50ZXN0X2NvbXBsZXRpb24sCisJCQkJCQkgICAgICAgbXNlY3NfdG9famlmZmllcygxMDApKSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIndha2V1cCB0ZXN0IHRpbWVkIG91dFxuIik7CisJCWNvbXBsZXRlX2FsbCgmaW5mby0+dGVzdF9jb21wbGV0aW9uKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJZXJyID0gaGNpX2g0cF93YWl0X2Zvcl9jdHMoaW5mbywgMSwgMTAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIk5vIGN0cyBmcm9tIGJ0IGNoaXBcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWhjaV9oNHBfc2V0X3J0cyhpbmZvLCAxKTsKKworCXJldHVybiAwOworfQorCisvKiBoY2kgY2FsbGJhY2sgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGhjaV9oNHBfaGNpX2ZsdXNoKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJc2tiX3F1ZXVlX3B1cmdlKCZpbmZvLT50eHEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9idF93YWtldXBfdGVzdChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCS8qCisJICogVGVzdCBTZXF1ZW5jZToKKwkgKiBIb3N0IGRlLWFzc2VydHMgdGhlIEJUX1dBS0VfVVAgbGluZS4KKwkgKiBIb3N0IHBvbGxzIHRoZSBVQVJUX0NUUyBsaW5lLCB3YWl0aW5nIGZvciBpdCB0byBiZSBkZS1hc3NlcnRlZC4KKwkgKiBIb3N0IGFzc2VydHMgdGhlIEJUX1dBS0VfVVAgbGluZS4KKwkgKiBIb3N0IHBvbGxzIHRoZSBVQVJUX0NUUyBsaW5lLCB3YWl0aW5nIGZvciBpdCB0byBiZSBhc3NlcnRlZC4KKwkgKiBIb3N0IGRlLWFzc2VydHMgdGhlIEJUX1dBS0VfVVAgbGluZSAoYWxsb3cgdGhlIEJsdWV0b290aCBkZXZpY2UgdG8KKwkgKiBzbGVlcCkuCisJICogSG9zdCBwb2xscyB0aGUgVUFSVF9DVFMgbGluZSwgd2FpdGluZyBmb3IgaXQgdG8gYmUgZGUtYXNzZXJ0ZWQuCisJICovCisJaW50IGVycjsKKwlpbnQgcmV0ID0gLUVDT01NOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpc2FibGUgd2FrZXVwIGludGVycnVwdHMgKi8KKwlkaXNhYmxlX2lycShncGlvX3RvX2lycShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKSk7CisKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMCk7CisJZXJyID0gaGNpX2g0cF93YWl0X2Zvcl9jdHMoaW5mbywgMCwgMTAwKTsKKwlpZiAoZXJyKSB7CisJCWRldl93YXJuKGluZm8tPmRldiwKKwkJCQkiYnRfd2FrZXVwX3Rlc3Q6IGZhaWw6IENUUyBsb3cgdGltZWQgb3V0OiAlZFxuIiwKKwkJCQllcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwlncGlvX3NldF92YWx1ZShpbmZvLT5idF93YWtldXBfZ3BpbywgMSk7CisJZXJyID0gaGNpX2g0cF93YWl0X2Zvcl9jdHMoaW5mbywgMSwgMTAwKTsKKwlpZiAoZXJyKSB7CisJCWRldl93YXJuKGluZm8tPmRldiwKKwkJCQkiYnRfd2FrZXVwX3Rlc3Q6IGZhaWw6IENUUyBoaWdoIHRpbWVkIG91dDogJWRcbiIsCisJCQkJZXJyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDApOworCWVyciA9IGhjaV9oNHBfd2FpdF9mb3JfY3RzKGluZm8sIDAsIDEwMCk7CisJaWYgKGVycikgeworCQlkZXZfd2FybihpbmZvLT5kZXYsCisJCQkJImJ0X3dha2V1cF90ZXN0OiBmYWlsOiBDVFMgcmUtbG93IHRpbWVkIG91dDogJWRcbiIsCisJCQkJZXJyKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gMDsKKworb3V0OgorCisJLyogUmUtZW5hYmxlIHdha2V1cCBpbnRlcnJ1cHRzICovCisJZW5hYmxlX2lycShncGlvX3RvX2lycShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhjaV9oNHBfaGNpX29wZW4oc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbzsKKwlpbnQgZXJyLCByZXRyaWVzID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZ3X3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbmZvID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKHRlc3RfYml0KEhDSV9SVU5OSU5HLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gMDsKKworCS8qIFRJMTI3MSBoYXMgSFcgYnVnIGFuZCBib290IHVwIG1pZ2h0IGZhaWwuIFJldHJ5IHVwIHRvIHRocmVlIHRpbWVzICovCithZ2FpbjoKKworCWluZm8tPnJ4X2VuYWJsZWQgPSAxOworCWluZm8tPnJ4X3N0YXRlID0gV0FJVF9GT1JfUEtUX1RZUEU7CisJaW5mby0+cnhfY291bnQgPSAwOworCWluZm8tPmdhcmJhZ2VfYnl0ZXMgPSAwOworCWluZm8tPnJ4X3NrYiA9IE5VTEw7CisJaW5mby0+cG1fZW5hYmxlZCA9IDA7CisJaW5pdF9jb21wbGV0aW9uKCZpbmZvLT5md19jb21wbGV0aW9uKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnR4X2Nsb2Nrc19lbiwgMSk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT5yeF9jbG9ja3NfZW4sIDEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmZ3X3F1ZXVlKTsKKworCWVyciA9IGhjaV9oNHBfcmVzZXQoaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX2NsZWFuOworCisJaGNpX2g0cF9zZXRfYXV0b19jdHNydHMoaW5mbywgMSwgVUFSVF9FRlJfQ1RTIHwgVUFSVF9FRlJfUlRTKTsKKwlpbmZvLT5hdXRvcnRzID0gMTsKKworCWVyciA9IGhjaV9oNHBfc2VuZF9uZWdvdGlhdGlvbihpbmZvKTsKKworCWVyciA9IGhjaV9oNHBfcmVhZF9mdyhpbmZvLCAmZndfcXVldWUpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ2Fubm90IHJlYWQgZmlybXdhcmVcbiIpOworCQlnb3RvIGVycl9jbGVhbjsKKwl9CisKKwllcnIgPSBoY2lfaDRwX3NlbmRfZncoaW5mbywgJmZ3X3F1ZXVlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIlNlbmRpbmcgZmlybXdhcmUgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX2NsZWFuOworCX0KKworCWluZm8tPnBtX2VuYWJsZWQgPSAxOworCisJZXJyID0gaGNpX2g0cF9idF93YWtldXBfdGVzdChpbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkJUIHdha2V1cCB0ZXN0IGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9jbGVhbjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWluZm8tPnJ4X2VuYWJsZWQgPSBncGlvX2dldF92YWx1ZShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgaW5mby0+cnhfZW5hYmxlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDApOworCisJa2ZyZWVfc2tiKGluZm8tPmFsaXZlX2NtZF9za2IpOworCWluZm8tPmFsaXZlX2NtZF9za2IgPSBOVUxMOworCXNldF9iaXQoSENJX1JVTk5JTkcsICZoZGV2LT5mbGFncyk7CisKKwlCVF9EQkcoImhjaSB1cCBhbmQgcnVubmluZyIpOworCXJldHVybiAwOworCitlcnJfY2xlYW46CisJaGNpX2g0cF9oY2lfZmx1c2goaGRldik7CisJaGNpX2g0cF9yZXNldF91YXJ0KGluZm8pOworCWRlbF90aW1lcl9zeW5jKCZpbmZvLT5sYXp5X3JlbGVhc2UpOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAwKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgMCk7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+cmVzZXRfZ3BpbywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDApOworCXNrYl9xdWV1ZV9wdXJnZSgmZndfcXVldWUpOworCWtmcmVlX3NrYihpbmZvLT5hbGl2ZV9jbWRfc2tiKTsKKwlpbmZvLT5hbGl2ZV9jbWRfc2tiID0gTlVMTDsKKwlrZnJlZV9za2IoaW5mby0+cnhfc2tiKTsKKwlpbmZvLT5yeF9za2IgPSBOVUxMOworCisJaWYgKHJldHJpZXMrKyA8IDMpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJGVyBsb2FkaW5nIHRyeSAlZCBmYWlsLiBSZXRyeS5cbiIsIHJldHJpZXMpOworCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9oY2lfY2xvc2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbyA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9SVU5OSU5HLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gMDsKKworCWhjaV9oNHBfaGNpX2ZsdXNoKGhkZXYpOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAxKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgMSk7CisJaGNpX2g0cF9yZXNldF91YXJ0KGluZm8pOworCWRlbF90aW1lcl9zeW5jKCZpbmZvLT5sYXp5X3JlbGVhc2UpOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAwKTsKKwloY2lfaDRwX3NldF9jbGsoaW5mbywgJmluZm8tPnJ4X2Nsb2Nrc19lbiwgMCk7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+cmVzZXRfZ3BpbywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+YnRfd2FrZXVwX2dwaW8sIDApOworCWtmcmVlX3NrYihpbmZvLT5yeF9za2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9oY2lfc2VuZF9mcmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJkZXYgJXAsIHNrYiAlcCIsIGhkZXYsIHNrYik7CisKKwlpbmZvID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKCF0ZXN0X2JpdChIQ0lfUlVOTklORywgJmhkZXYtPmZsYWdzKSkgeworCQlkZXZfd2FybihpbmZvLT5kZXYsICJGcmFtZSBmb3Igbm9uLXJ1bm5pbmcgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3dpdGNoIChidF9jYihza2IpLT5wa3RfdHlwZSkgeworCWNhc2UgSENJX0NPTU1BTkRfUEtUOgorCQloZGV2LT5zdGF0LmNtZF90eCsrOworCQlicmVhazsKKwljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKKwkJaGRldi0+c3RhdC5hY2xfdHgrKzsKKwkJYnJlYWs7CisJY2FzZSBIQ0lfU0NPREFUQV9QS1Q6CisJCWhkZXYtPnN0YXQuc2NvX3R4Kys7CisJCWJyZWFrOworCX0KKworCS8qIFB1c2ggZnJhbWUgdHlwZSB0byBza2IgKi8KKwkqc2tiX3B1c2goc2tiLCAxKSA9IChidF9jYihza2IpLT5wa3RfdHlwZSk7CisJLyogV2Ugc2hvdWxkIGFsbHdheXMgc2VuZCB3b3JkIGFsaWduZWQgZGF0YSB0byBoNCsgZGV2aWNlcyAqLworCWlmIChza2ItPmxlbiAlIDIpIHsKKwkJZXJyID0gc2tiX3BhZChza2IsIDEpOworCQlpZiAoIWVycikKKwkJCSpza2JfcHV0KHNrYiwgMSkgPSAweDAwOworCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgc2tiKTsKKwloY2lfaDRwX2VuYWJsZV90eChpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBoY2lfaDRwX3N0b3JlX2JkYWRkcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGJkYWRkcls2XTsKKwlpbnQgcmV0LCBpOworCisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiUyeDolMng6JTJ4OiUyeDolMng6JTJ4XG4iLAorCQkJJmJkYWRkclswXSwgJmJkYWRkclsxXSwgJmJkYWRkclsyXSwKKwkJCSZiZGFkZHJbM10sICZiZGFkZHJbNF0sICZiZGFkZHJbNV0pOworCisJaWYgKHJldCAhPSA2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKGJkYWRkcltpXSA+IDB4ZmYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5mby0+YmRfYWRkcltpXSA9IGJkYWRkcltpXSAmIDB4ZmY7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBoY2lfaDRwX3Nob3dfYmRhZGRyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVwTVJcbiIsIGluZm8tPmJkX2FkZHIpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYmRhZGRyLCBTX0lSVUdPIHwgU19JV1VTUiwgaGNpX2g0cF9zaG93X2JkYWRkciwKKwkJICAgaGNpX2g0cF9zdG9yZV9iZGFkZHIpOworCitzdGF0aWMgaW50IGhjaV9oNHBfc3lzZnNfY3JlYXRlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JkYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfc3lzZnNfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmRhZGRyKTsKK30KKworc3RhdGljIGludCBoY2lfaDRwX3JlZ2lzdGVyX2hkZXYoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKworCS8qIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEhDSSBkZXZpY2UgKi8KKworCWhkZXYgPSBoY2lfYWxsb2NfZGV2KCk7CisJaWYgKCFoZGV2KSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaW5mby0+aGRldiA9IGhkZXY7CisKKwloZGV2LT5idXMgPSBIQ0lfVUFSVDsKKwloY2lfc2V0X2RydmRhdGEoaGRldiwgaW5mbyk7CisKKwloZGV2LT5vcGVuID0gaGNpX2g0cF9oY2lfb3BlbjsKKwloZGV2LT5jbG9zZSA9IGhjaV9oNHBfaGNpX2Nsb3NlOworCWhkZXYtPmZsdXNoID0gaGNpX2g0cF9oY2lfZmx1c2g7CisJaGRldi0+c2VuZCA9IGhjaV9oNHBfaGNpX3NlbmRfZnJhbWU7CisJc2V0X2JpdChIQ0lfUVVJUktfUkVTRVRfT05fQ0xPU0UsICZoZGV2LT5xdWlya3MpOworCisJU0VUX0hDSURFVl9ERVYoaGRldiwgaW5mby0+ZGV2KTsKKworCWlmIChoY2lfaDRwX3N5c2ZzX2NyZWF0ZV9maWxlcyhpbmZvLT5kZXYpIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOworCQlnb3RvIGZyZWU7CisJfQorCisJaWYgKGhjaV9yZWdpc3Rlcl9kZXYoaGRldikgPj0gMCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZXJyKGluZm8tPmRldiwgImhjaV9yZWdpc3RlciBmYWlsZWQgJXMuXG4iLCBoZGV2LT5uYW1lKTsKKwloY2lfaDRwX3N5c2ZzX3JlbW92ZV9maWxlcyhpbmZvLT5kZXYpOworZnJlZToKKwloY2lfZnJlZV9kZXYoaW5mby0+aGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2g0cF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBoY2lfaDRwX3BsYXRmb3JtX2RhdGEgKmJ0X3BsYXRfZGF0YTsKKwlzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvOworCWludCBlcnI7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUmVnaXN0ZXJpbmcgSENJIEg0UCBkZXZpY2VcbiIpOworCWluZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBoY2lfaDRwX2luZm8pLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluZm8tPmRldiA9ICZwZGV2LT5kZXY7CisJaW5mby0+dHhfZW5hYmxlZCA9IDE7CisJaW5mby0+cnhfZW5hYmxlZCA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZpbmZvLT5jbG9ja3NfbG9jayk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaW5mby0+dHhxKTsKKworCWlmIChwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgQmx1ZXRvb3RoIGNvbmZpZyBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KKworCWJ0X3BsYXRfZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWluZm8tPmNoaXBfdHlwZSA9IGJ0X3BsYXRfZGF0YS0+Y2hpcF90eXBlOworCWluZm8tPmJ0X3dha2V1cF9ncGlvID0gYnRfcGxhdF9kYXRhLT5idF93YWtldXBfZ3BpbzsKKwlpbmZvLT5ob3N0X3dha2V1cF9ncGlvID0gYnRfcGxhdF9kYXRhLT5ob3N0X3dha2V1cF9ncGlvOworCWluZm8tPnJlc2V0X2dwaW8gPSBidF9wbGF0X2RhdGEtPnJlc2V0X2dwaW87CisJaW5mby0+cmVzZXRfZ3Bpb19zaGFyZWQgPSBidF9wbGF0X2RhdGEtPnJlc2V0X2dwaW9fc2hhcmVkOworCWluZm8tPmJ0X3N5c2NsayA9IGJ0X3BsYXRfZGF0YS0+YnRfc3lzY2xrOworCisJQlRfREJHKCJSRVNFVCBncGlvOiAlZCIsIGluZm8tPnJlc2V0X2dwaW8pOworCUJUX0RCRygiQlRXVSBncGlvOiAlZCIsIGluZm8tPmJ0X3dha2V1cF9ncGlvKTsKKwlCVF9EQkcoIkhPU1RXVSBncGlvOiAlZCIsIGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pOworCUJUX0RCRygic3lzY2xrOiAlZCIsIGluZm8tPmJ0X3N5c2Nsayk7CisKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPnRlc3RfY29tcGxldGlvbik7CisJY29tcGxldGVfYWxsKCZpbmZvLT50ZXN0X2NvbXBsZXRpb24pOworCisJaWYgKCFpbmZvLT5yZXNldF9ncGlvX3NoYXJlZCkgeworCQllcnIgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwgaW5mby0+cmVzZXRfZ3BpbywKKwkJCQkJICAgIEdQSU9GX09VVF9JTklUX0xPVywgImJ0X3Jlc2V0Iik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IEdQSU8gbGluZSAlZFxuIiwKKwkJCQlpbmZvLT5yZXNldF9ncGlvKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwllcnIgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwgaW5mby0+YnRfd2FrZXVwX2dwaW8sCisJCQkJICAgIEdQSU9GX09VVF9JTklUX0xPVywgImJ0X3dha2V1cCIpOworCisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDYW5ub3QgZ2V0IEdQSU8gbGluZSAweCVkIiwKKwkJCWluZm8tPmJ0X3dha2V1cF9ncGlvKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwgaW5mby0+aG9zdF93YWtldXBfZ3BpbywKKwkJCQkgICAgR1BJT0ZfRElSX0lOLCAiaG9zdF93YWtldXAiKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNhbm5vdCBnZXQgR1BJTyBsaW5lICVkIiwKKwkJICAgICAgIGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pOworCQlyZXR1cm4gZXJyOworCX0KKworCWluZm8tPmlycSA9IGJ0X3BsYXRfZGF0YS0+dWFydF9pcnE7CisJaW5mby0+dWFydF9iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIGJ0X3BsYXRfZGF0YS0+dWFydF9iYXNlLAorCQkJCQlTWl8ySyk7CisJaW5mby0+dWFydF9pY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIGJ0X3BsYXRfZGF0YS0+dWFydF9pY2xrKTsKKwlpbmZvLT51YXJ0X2ZjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgYnRfcGxhdF9kYXRhLT51YXJ0X2ZjbGspOworCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpbmZvLT5pcnEsIGhjaV9oNHBfaW50ZXJydXB0LAorCQkJCUlSUUZfRElTQUJMRUQsICJoY2lfaDRwIiwgaW5mbyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJoY2lfaDRwOiB1bmFibGUgdG8gZ2V0IElSUSAlZFxuIiwKKwkJCWluZm8tPmlycSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBncGlvX3RvX2lycShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKSwKKwkJCSAgaGNpX2g0cF93YWtldXBfaW50ZXJydXB0LCAgSVJRRl9UUklHR0VSX0ZBTExJTkcgfAorCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgImhjaV9oNHBfd2t1cCIsIGluZm8pOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiaGNpX2g0cDogdW5hYmxlIHRvIGdldCB3YWtldXAgSVJRICVkXG4iLAorCQkJICBncGlvX3RvX2lycShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gaXJxX3NldF9pcnFfd2FrZShncGlvX3RvX2lycShpbmZvLT5ob3N0X3dha2V1cF9ncGlvKSwgMSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJoY2lfaDRwOiB1bmFibGUgdG8gc2V0IHdha2V1cCBmb3IgSVJRICVkXG4iLAorCQkJCWdwaW9fdG9faXJxKGluZm8tPmhvc3Rfd2FrZXVwX2dwaW8pKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpbml0X3RpbWVyX2RlZmVycmFibGUoJmluZm8tPmxhenlfcmVsZWFzZSk7CisJaW5mby0+bGF6eV9yZWxlYXNlLmZ1bmN0aW9uID0gaGNpX2g0cF9sYXp5X2Nsb2NrX3JlbGVhc2U7CisJaW5mby0+bGF6eV9yZWxlYXNlLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOworCWhjaV9oNHBfc2V0X2NsayhpbmZvLCAmaW5mby0+dHhfY2xvY2tzX2VuLCAxKTsKKwllcnIgPSBoY2lfaDRwX3Jlc2V0X3VhcnQoaW5mbyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZ3Bpb19zZXRfdmFsdWUoaW5mby0+cmVzZXRfZ3BpbywgMCk7CisJaGNpX2g0cF9zZXRfY2xrKGluZm8sICZpbmZvLT50eF9jbG9ja3NfZW4sIDApOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisKKwlpZiAoaGNpX2g0cF9yZWdpc3Rlcl9oZGV2KGluZm8pIDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBoY2lfaDRwIGhjaSBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoY2lfaDRwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm87CisKKwlpbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwloY2lfaDRwX3N5c2ZzX3JlbW92ZV9maWxlcyhpbmZvLT5kZXYpOworCWhjaV9oNHBfaGNpX2Nsb3NlKGluZm8tPmhkZXYpOworCWhjaV91bnJlZ2lzdGVyX2RldihpbmZvLT5oZGV2KTsKKwloY2lfZnJlZV9kZXYoaW5mby0+aGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGNpX2g0cF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGhjaV9oNHBfcHJvYmUsCisJLnJlbW92ZQkJPSBoY2lfaDRwX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiaGNpX2g0cCIsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaGNpX2g0cF9kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmhjaV9oNHAiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIGg0IGRyaXZlciB3aXRoIG5va2lhIGV4dGVuc2lvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlZpbGxlIFRlcnZvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LWJjbS5jIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy1iY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTFhZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy1iY20uYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5va2lhIEg0UCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNpbmNsdWRlICJoY2lfaDRwLmgiCisKK3N0YXRpYyBpbnQgaGNpX2g0cF9iY21fc2V0X2JkYWRkcihzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGk7CisJc3RhdGljIGNvbnN0IHU4IG5va2lhX291aVszXSA9IHsweDAwLCAweDFmLCAweGRmfTsKKwlpbnQgbm90X3ZhbGlkOworCisJbm90X3ZhbGlkID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmIChpbmZvLT5iZF9hZGRyW2ldICE9IDB4MDApIHsKKwkJCW5vdF92YWxpZCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChub3RfdmFsaWQpIHsKKwkJZGV2X2luZm8oaW5mby0+ZGV2LCAiVmFsaWQgYmx1ZXRvb3RoIGFkZHJlc3Mgbm90IGZvdW5kLCBzZXR0aW5nIHNvbWUgcmFuZG9tXG4iKTsKKwkJLyogV2hlbiBhZGRyZXNzIGlzIG5vdCB2YWxpZCwgdXNlIHNvbWUgcmFuZG9tIGJ1dCBOb2tpYSBNQUMgKi8KKwkJbWVtY3B5KGluZm8tPmJkX2FkZHIsIG5va2lhX291aSwgMyk7CisJCWdldF9yYW5kb21fYnl0ZXMoaW5mby0+YmRfYWRkciArIDMsIDMpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXNrYi0+ZGF0YVs5IC0gaV0gPSBpbmZvLT5iZF9hZGRyW2ldOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGNpX2g0cF9iY21fcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqZndfc2tiOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChza2ItPmRhdGFbNV0gIT0gMHgwMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkZpcm13YXJlIHNlbmRpbmcgY29tbWFuZCBmYWlsZWQgMHglLjJ4XG4iLAorCQkJc2tiLT5kYXRhWzVdKTsKKwkJaW5mby0+ZndfZXJyb3IgPSAtRVBST1RPOworCX0KKworCWtmcmVlX3NrYihza2IpOworCisJZndfc2tiID0gc2tiX2RlcXVldWUoaW5mby0+ZndfcSk7CisJaWYgKGZ3X3NrYiA9PSBOVUxMIHx8IGluZm8tPmZ3X2Vycm9yKSB7CisJCWNvbXBsZXRlKCZpbmZvLT5md19jb21wbGV0aW9uKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmd19za2ItPmRhdGFbMV0gPT0gMHgwMSAmJiBmd19za2ItPmRhdGFbMl0gPT0gMHhmYyAmJiBmd19za2ItPmxlbiA+PSAxMCkgeworCQlCVF9EQkcoIlNldHRpbmcgYmx1ZXRvb3RoIGFkZHJlc3MiKTsKKwkJZXJyID0gaGNpX2g0cF9iY21fc2V0X2JkYWRkcihpbmZvLCBmd19za2IpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWVfc2tiKGZ3X3NrYik7CisJCQlpbmZvLT5md19lcnJvciA9IGVycjsKKwkJCWNvbXBsZXRlKCZpbmZvLT5md19jb21wbGV0aW9uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIGZ3X3NrYik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCQlVQVJUX0lFUl9USFJJKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Cit9CisKKworaW50IGhjaV9oNHBfYmNtX3NlbmRfZncoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZTsKKworCWluZm8tPmZ3X2Vycm9yID0gMDsKKworCUJUX0RCRygiU2VuZGluZyBmaXJtd2FyZSIpOworCisJdGltZSA9IGppZmZpZXM7CisKKwlpbmZvLT5md19xID0gZndfcXVldWU7CisJc2tiID0gc2tiX2RlcXVldWUoZndfcXVldWUpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlCVF9EQkcoIlNlbmRpbmcgY29tbWFuZHMiKTsKKworCS8qCisJICogRGlzYWJsZSBzbWFydC1pZGxlIGFzIFVBUlQgVFggaW50ZXJydXB0cworCSAqIGFyZSBub3Qgd2FrZS11cCBjYXBhYmxlCisJICovCisJaGNpX2g0cF9zbWFydF9pZGxlKGluZm8sIDApOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBiZF9hZGRyZXNzIHBhY2tldCAqLworCWluaXRfY29tcGxldGlvbigmaW5mby0+ZndfY29tcGxldGlvbik7CisJc2tiX3F1ZXVlX3RhaWwoJmluZm8tPnR4cSwgc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJCVVBUlRfSUVSX1RIUkkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbmZvLT5md19jb21wbGV0aW9uLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiTm8gcmVwbHkgdG8gZncgY29tbWFuZFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCWlmIChpbmZvLT5md19lcnJvcikgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkZXIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJQlRfREJHKCJGaXJtd2FyZSBzZW50IGluICVkIG1zZWNzIiwKKwkJICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzLXRpbWUpKTsKKworCWhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKGluZm8sIDAsIFVBUlRfRUZSX1JUUyk7CisJaGNpX2g0cF9zZXRfcnRzKGluZm8sIDApOworCWhjaV9oNHBfY2hhbmdlX3NwZWVkKGluZm8sIEJDNF9NQVhfQkFVRF9SQVRFKTsKKwloY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAxLCBVQVJUX0VGUl9SVFMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LWNzci5jIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy1jc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZiNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy1jc3IuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5va2lhIEg0UCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNpbmNsdWRlICJoY2lfaDRwLmgiCisKK3ZvaWQgaGNpX2g0cF9iYzRfcGFyc2VfZndfZXZlbnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGZ3IHBhY2tldCAqLworCWlmIChza2ItPmRhdGFbMF0gIT0gMHhmZikgeworCQloY2lfcmVjdl9mcmFtZShpbmZvLT5oZGV2LCBza2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNrYi0+ZGF0YVsxMV0gfHwgc2tiLT5kYXRhWzEyXSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkZpcm13YXJlIHNlbmRpbmcgY29tbWFuZCBmYWlsZWRcbiIpOworCQlpbmZvLT5md19lcnJvciA9IC1FUFJPVE87CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisJY29tcGxldGUoJmluZm8tPmZ3X2NvbXBsZXRpb24pOworfQorCitpbnQgaGNpX2g0cF9iYzRfc2VuZF9mdyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcXVldWUpCit7CisJc3RhdGljIGNvbnN0IHU4IG5va2lhX291aVszXSA9IHsweDAwLCAweDE5LCAweDRGfTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJaW50IHJldHJpZXMsIGNvdW50LCBpLCBub3RfdmFsaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWluZm8tPmZ3X2Vycm9yID0gMDsKKworCUJUX0RCRygiU2VuZGluZyBmaXJtd2FyZSIpOworCXNrYiA9IHNrYl9kZXF1ZXVlKGZ3X3F1ZXVlKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01TRzsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYmRfYWRkcmVzcyBwYWNrZXQgKi8KKwlpZiAoc2tiLT5kYXRhWzE1XSA9PSAweDAxICYmIHNrYi0+ZGF0YVsxNl0gPT0gMHgwMCkgeworCQlvZmZzZXQgPSAyMTsKKwkJc2tiLT5kYXRhW29mZnNldCArIDFdID0gMHgwMDsKKwkJc2tiLT5kYXRhW29mZnNldCArIDVdID0gMHgwMDsKKworCQlub3RfdmFsaWQgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlpZiAoaW5mby0+YmRfYWRkcltpXSAhPSAweDAwKSB7CisJCQkJbm90X3ZhbGlkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChub3RfdmFsaWQpIHsKKwkJCWRldl9pbmZvKGluZm8tPmRldiwgIlZhbGlkIGJsdWV0b290aCBhZGRyZXNzIG5vdCBmb3VuZCwgc2V0dGluZyBzb21lIHJhbmRvbVxuIik7CisJCQkvKiBXaGVuIGFkZHJlc3MgaXMgbm90IHZhbGlkLCB1c2Ugc29tZSByYW5kb20gKi8KKwkJCW1lbWNweShpbmZvLT5iZF9hZGRyLCBub2tpYV9vdWksIDMpOworCQkJZ2V0X3JhbmRvbV9ieXRlcyhpbmZvLT5iZF9hZGRyICsgMywgMyk7CisJCX0KKworCQlza2ItPmRhdGFbb2Zmc2V0ICsgN10gPSBpbmZvLT5iZF9hZGRyWzBdOworCQlza2ItPmRhdGFbb2Zmc2V0ICsgNl0gPSBpbmZvLT5iZF9hZGRyWzFdOworCQlza2ItPmRhdGFbb2Zmc2V0ICsgNF0gPSBpbmZvLT5iZF9hZGRyWzJdOworCQlza2ItPmRhdGFbb2Zmc2V0ICsgMF0gPSBpbmZvLT5iZF9hZGRyWzNdOworCQlza2ItPmRhdGFbb2Zmc2V0ICsgM10gPSBpbmZvLT5iZF9hZGRyWzRdOworCQlza2ItPmRhdGFbb2Zmc2V0ICsgMl0gPSBpbmZvLT5iZF9hZGRyWzVdOworCX0KKworCWZvciAoY291bnQgPSAxOyA7IGNvdW50KyspIHsKKwkJQlRfREJHKCJTZW5kaW5nIGZpcm13YXJlIGNvbW1hbmQgJWQiLCBjb3VudCk7CisJCWluaXRfY29tcGxldGlvbigmaW5mby0+ZndfY29tcGxldGlvbik7CisJCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIHNrYik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpIHwKKwkJCQkJCQkgVUFSVF9JRVJfVEhSSSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCQlza2IgPSBza2JfZGVxdWV1ZShmd19xdWV1ZSk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8tPmZ3X2NvbXBsZXRpb24sCisJCQkJCQkgbXNlY3NfdG9famlmZmllcygxMDAwKSkpIHsKKwkJCWRldl9lcnIoaW5mby0+ZGV2LCAiTm8gcmVwbHkgdG8gZncgY29tbWFuZFxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCWlmIChpbmZvLT5md19lcnJvcikgeworCQkJZGV2X2VycihpbmZvLT5kZXYsICJGVyBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVQUk9UTzsKKwkJfQorCX07CisKKwkvKiBXYWl0IGZvciBjaGlwIHdhcm0gcmVzZXQgKi8KKwlyZXRyaWVzID0gMTAwOworCXdoaWxlICgoIXNrYl9xdWV1ZV9lbXB0eSgmaW5mby0+dHhxKSB8fAorCSAgICAgICAhKGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKSAmJgorCSAgICAgICByZXRyaWVzLS0pIHsKKwkJbXNsZWVwKDEwKTsKKwl9CisJaWYgKCFyZXRyaWVzKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiVHJhbnNtaXR0ZXIgbm90IGVtcHR5XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJaGNpX2g0cF9jaGFuZ2Vfc3BlZWQoaW5mbywgQkM0X01BWF9CQVVEX1JBVEUpOworCisJaWYgKGhjaV9oNHBfd2FpdF9mb3JfY3RzKGluZm8sIDEsIDEwMCkpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJjdHMgZGlkbid0IGRlYXNzZXJ0IGFmdGVyIGZpbmFsIHNwZWVkXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0cmllcyA9IDEwMDsKKwlkbyB7CisJCWluaXRfY29tcGxldGlvbigmaW5mby0+aW5pdF9jb21wbGV0aW9uKTsKKwkJaGNpX2g0cF9zZW5kX2FsaXZlX3BhY2tldChpbmZvKTsKKwkJcmV0cmllcy0tOworCX0gd2hpbGUgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8tPmluaXRfY29tcGxldGlvbiwgMTAwKSAmJgorCQkgcmV0cmllcyA+IDApOworCisJaWYgKCFyZXRyaWVzKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiTm8gYWxpdmUgcmVwbHkgYWZ0ZXIgc3BlZWQgY2hhbmdlXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LXRpMTI3My5jIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy10aTEyNzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUwMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL25va2lhX2g0cC9ub2tpYV9mdy10aTEyNzMuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5va2lhIEg0UCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSAiaGNpX2g0cC5oIgorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCAqZndfcTsKKwordm9pZCBoY2lfaDRwX3RpMTI3M19wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqZndfc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2tiLT5kYXRhWzVdICE9IDB4MDApIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJGaXJtd2FyZSBzZW5kaW5nIGNvbW1hbmQgZmFpbGVkIDB4JS4yeFxuIiwKKwkJCXNrYi0+ZGF0YVs1XSk7CisJCWluZm8tPmZ3X2Vycm9yID0gLUVQUk9UTzsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKworCWZ3X3NrYiA9IHNrYl9kZXF1ZXVlKGZ3X3EpOworCWlmIChmd19za2IgPT0gTlVMTCB8fCBpbmZvLT5md19lcnJvcikgeworCQljb21wbGV0ZSgmaW5mby0+ZndfY29tcGxldGlvbik7CisJCXJldHVybjsKKwl9CisKKwlza2JfcXVldWVfdGFpbCgmaW5mby0+dHhxLCBmd19za2IpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfSUVSLCBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0lFUikgfAorCQkJVUFSVF9JRVJfVEhSSSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCisKK2ludCBoY2lfaDRwX3RpMTI3M19zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmd19xdWV1ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHRpbWU7CisKKwlpbmZvLT5md19lcnJvciA9IDA7CisKKwlCVF9EQkcoIlNlbmRpbmcgZmlybXdhcmUiKTsKKworCXRpbWUgPSBqaWZmaWVzOworCisJZndfcSA9IGZ3X3F1ZXVlOworCXNrYiA9IHNrYl9kZXF1ZXVlKGZ3X3F1ZXVlKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJQlRfREJHKCJTZW5kaW5nIGNvbW1hbmRzIik7CisJLyogQ2hlY2sgaWYgdGhpcyBpcyBiZF9hZGRyZXNzIHBhY2tldCAqLworCWluaXRfY29tcGxldGlvbigmaW5mby0+ZndfY29tcGxldGlvbik7CisJaGNpX2g0cF9zbWFydF9pZGxlKGluZm8sIDApOworCXNrYl9xdWV1ZV90YWlsKCZpbmZvLT50eHEsIHNrYik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9JRVIsIGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfSUVSKSB8CisJCQlVQVJUX0lFUl9USFJJKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5mby0+ZndfY29tcGxldGlvbiwKKwkJCQltc2Vjc190b19qaWZmaWVzKDIwMDApKSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIk5vIHJlcGx5IHRvIGZ3IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlpZiAoaW5mby0+ZndfZXJyb3IpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJGVyBlcnJvclxuIik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCUJUX0RCRygiRmlybXdhcmUgc2VudCBpbiAlZCBtc2VjcyIsCisJCSAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcy10aW1lKSk7CisKKwloY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAwLCBVQVJUX0VGUl9SVFMpOworCWhjaV9oNHBfc2V0X3J0cyhpbmZvLCAwKTsKKwloY2lfaDRwX2NoYW5nZV9zcGVlZChpbmZvLCBCQzRfTUFYX0JBVURfUkFURSk7CisJaWYgKGhjaV9oNHBfd2FpdF9mb3JfY3RzKGluZm8sIDEsIDEwMCkpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsCisJCQkiY3RzIGRpZG4ndCBnbyBkb3duIGFmdGVyIGZpbmFsIHNwZWVkIGNoYW5nZVxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwloY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCAxLCBVQVJUX0VGUl9SVFMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LmMgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiYTIxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfZncuYwpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGhjaV9oNHAgYmx1ZXRvb3RoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBDb250YWN0OiBWaWxsZSBUZXJ2byA8dmlsbGUudGVydm9Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorCisjaW5jbHVkZSAiaGNpX2g0cC5oIgorCisjZGVmaW5lIEZXX05BTUVfVEkxMjcxX1BSRUxFCSJ0aTEyNzNfcHJlbGUuYmluIgorI2RlZmluZSBGV19OQU1FX1RJMTI3MV9MRQkidGkxMjczX2xlLmJpbiIKKyNkZWZpbmUgRldfTkFNRV9USTEyNzEJCSJ0aTEyNzMuYmluIgorI2RlZmluZSBGV19OQU1FX0JDTTIwNDgJCSJiY21mdy5iaW4iCisjZGVmaW5lIEZXX05BTUVfQ1NSCQkiYmM0ZncuYmluIgorCitzdGF0aWMgaW50IGZ3X3BvczsKKworLyogRmlybXdhcmUgaGFuZGxpbmcgKi8KK3N0YXRpYyBpbnQgaGNpX2g0cF9vcGVuX2Zpcm13YXJlKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sCisJCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3X2VudHJ5KQoreworCWludCBlcnI7CisKKwlmd19wb3MgPSAwOworCUJUX0RCRygiT3BlbmluZyBmaXJtd2FyZSBtYW5faWQgMHglLjJ4IHZlcl9pZCAweCUuMngiLAorCQkJaW5mby0+bWFuX2lkLCBpbmZvLT52ZXJfaWQpOworCXN3aXRjaCAoaW5mby0+bWFuX2lkKSB7CisJY2FzZSBINFBfSURfVEkxMjcxOgorCQlzd2l0Y2ggKGluZm8tPnZlcl9pZCkgeworCQljYXNlIDB4ZTE6CisJCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKGZ3X2VudHJ5LCBGV19OQU1FX1RJMTI3MV9QUkVMRSwKKwkJCQkJCWluZm8tPmRldik7CisJCQlicmVhazsKKwkJY2FzZSAweGQxOgorCQljYXNlIDB4ZjE6CisJCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKGZ3X2VudHJ5LCBGV19OQU1FX1RJMTI3MV9MRSwKKwkJCQkJCWluZm8tPmRldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoZndfZW50cnksIEZXX05BTUVfVEkxMjcxLAorCQkJCQkJaW5mby0+ZGV2KTsKKwkJfQorCQlicmVhazsKKwljYXNlIEg0UF9JRF9DU1I6CisJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoZndfZW50cnksIEZXX05BTUVfQ1NSLCBpbmZvLT5kZXYpOworCQlicmVhazsKKwljYXNlIEg0UF9JRF9CQ00yMDQ4OgorCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKGZ3X2VudHJ5LCBGV19OQU1FX0JDTTIwNDgsIGluZm8tPmRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiSW52YWxpZCBjaGlwIHR5cGVcbiIpOworCQkqZndfZW50cnkgPSBOVUxMOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9oNHBfY2xvc2VfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSkKK3sKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKK30KKworLyogUmVhZCBmdy4gUmV0dXJuIGxlbmd0aCBvZiB0aGUgY29tbWFuZC4gSWYgbm8gbW9yZSBjb21tYW5kcyBpbgorICogZncgMCBpcyByZXR1cm5lZC4gSW4gZXJyb3IgY2FzZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuCisgKi8KK3N0YXRpYyBpbnQgaGNpX2g0cF9yZWFkX2Z3X2NtZChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5LCBnZnBfdCBob3cpCit7CisJdW5zaWduZWQgaW50IGNtZF9sZW47CisKKwlpZiAoZndfcG9zID49IGZ3X2VudHJ5LT5zaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChmd19wb3MgKyAyID4gZndfZW50cnktPnNpemUpIHsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJDb3JydXB0ZWQgZmlybXdhcmUgaW1hZ2UgMVxuIik7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQorCisJY21kX2xlbiA9IGZ3X2VudHJ5LT5kYXRhW2Z3X3BvcysrXTsKKwljbWRfbGVuICs9IGZ3X2VudHJ5LT5kYXRhW2Z3X3BvcysrXSA8PCA4OworCWlmIChjbWRfbGVuID09IDApCisJCXJldHVybiAwOworCisJaWYgKGZ3X3BvcyArIGNtZF9sZW4gPiBmd19lbnRyeS0+c2l6ZSkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIkNvcnJ1cHRlZCBmaXJtd2FyZSBpbWFnZSAyXG4iKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwkqc2tiID0gYnRfc2tiX2FsbG9jKGNtZF9sZW4sIGhvdyk7CisJaWYgKCEqc2tiKSB7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiQ2Fubm90IHJlc2VydmUgbWVtb3J5IGZvciBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtY3B5KHNrYl9wdXQoKnNrYiwgY21kX2xlbiksICZmd19lbnRyeS0+ZGF0YVtmd19wb3NdLCBjbWRfbGVuKTsKKworCWZ3X3BvcyArPSBjbWRfbGVuOworCisJcmV0dXJuICgqc2tiKS0+bGVuOworfQorCitpbnQgaGNpX2g0cF9yZWFkX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKQoreworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnkgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCBlcnI7CisKKwllcnIgPSBoY2lfaDRwX29wZW5fZmlybXdhcmUoaW5mbywgJmZ3X2VudHJ5KTsKKwlpZiAoZXJyIDwgMCB8fCAhZndfZW50cnkpCisJCWdvdG8gZXJyX2NsZWFuOworCisJd2hpbGUgKChlcnIgPSBoY2lfaDRwX3JlYWRfZndfY21kKGluZm8sICZza2IsIGZ3X2VudHJ5LCBHRlBfS0VSTkVMKSkpIHsKKwkJaWYgKGVyciA8IDAgfHwgIXNrYikKKwkJCWdvdG8gZXJyX2NsZWFuOworCisJCXNrYl9xdWV1ZV90YWlsKGZ3X3F1ZXVlLCBza2IpOworCX0KKworCS8qIENoaXAgZGV0ZWN0aW9uIGNvZGUgZG9lcyBuZWcgYW5kIGFsaXZlIHN0dWZmCisJICogZGlzY2FyZCB0d28gZmlyc3Qgc2ticyAqLworCXNrYiA9IHNrYl9kZXF1ZXVlKGZ3X3F1ZXVlKTsKKwlpZiAoIXNrYikgeworCQllcnIgPSAtRU1TR1NJWkU7CisJCWdvdG8gZXJyX2NsZWFuOworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKwlza2IgPSBza2JfZGVxdWV1ZShmd19xdWV1ZSk7CisJaWYgKCFza2IpIHsKKwkJZXJyID0gLUVNU0dTSVpFOworCQlnb3RvIGVycl9jbGVhbjsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisKK2Vycl9jbGVhbjoKKwloY2lfaDRwX2Nsb3NlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaGNpX2g0cF9zZW5kX2Z3KHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmX2hlYWQgKmZ3X3F1ZXVlKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKGluZm8tPm1hbl9pZCkgeworCWNhc2UgSDRQX0lEX0NTUjoKKwkJZXJyID0gaGNpX2g0cF9iYzRfc2VuZF9mdyhpbmZvLCBmd19xdWV1ZSk7CisJCWJyZWFrOworCWNhc2UgSDRQX0lEX1RJMTI3MToKKwkJZXJyID0gaGNpX2g0cF90aTEyNzNfc2VuZF9mdyhpbmZvLCBmd19xdWV1ZSk7CisJCWJyZWFrOworCWNhc2UgSDRQX0lEX0JDTTIwNDg6CisJCWVyciA9IGhjaV9oNHBfYmNtX3NlbmRfZncoaW5mbywgZndfcXVldWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGluZm8tPmRldiwgIkRvbid0IGtub3cgaG93IHRvIHNlbmQgZmlybXdhcmVcbiIpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgaGNpX2g0cF9wYXJzZV9md19ldmVudChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN3aXRjaCAoaW5mby0+bWFuX2lkKSB7CisJY2FzZSBINFBfSURfQ1NSOgorCQloY2lfaDRwX2JjNF9wYXJzZV9md19ldmVudChpbmZvLCBza2IpOworCQlicmVhazsKKwljYXNlIEg0UF9JRF9USTEyNzE6CisJCWhjaV9oNHBfdGkxMjczX3BhcnNlX2Z3X2V2ZW50KGluZm8sIHNrYik7CisJCWJyZWFrOworCWNhc2UgSDRQX0lEX0JDTTIwNDg6CisJCWhjaV9oNHBfYmNtX3BhcnNlX2Z3X2V2ZW50KGluZm8sIHNrYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaW5mby0+ZGV2LCAiRG9uJ3Qga25vdyBob3cgdG8gcGFyc2UgZncgZXZlbnRcbiIpOworCQlpbmZvLT5md19lcnJvciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuOworfQorCitNT0RVTEVfRklSTVdBUkUoRldfTkFNRV9USTEyNzFfUFJFTEUpOworTU9EVUxFX0ZJUk1XQVJFKEZXX05BTUVfVEkxMjcxX0xFKTsKK01PRFVMRV9GSVJNV0FSRShGV19OQU1FX1RJMTI3MSk7CitNT0RVTEVfRklSTVdBUkUoRldfTkFNRV9CQ00yMDQ4KTsKK01PRFVMRV9GSVJNV0FSRShGV19OQU1FX0NTUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX3VhcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ub2tpYV9oNHAvbm9raWFfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjU3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbm9raWFfaDRwL25va2lhX3VhcnQuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5va2lhIEg0UCBibHVldG9vdGggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgImhjaV9oNHAuaCIKKworaW5saW5lIHZvaWQgaGNpX2g0cF9vdXRiKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBvZmZzZXQsIHU4IHZhbCkKK3sKKwlfX3Jhd193cml0ZWIodmFsLCBpbmZvLT51YXJ0X2Jhc2UgKyAob2Zmc2V0IDw8IDIpKTsKK30KKworaW5saW5lIHU4IGhjaV9oNHBfaW5iKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRiKGluZm8tPnVhcnRfYmFzZSArIChvZmZzZXQgPDwgMikpOworfQorCit2b2lkIGhjaV9oNHBfc2V0X3J0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgYWN0aXZlKQoreworCXU4IGI7CisKKwliID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9NQ1IpOworCWlmIChhY3RpdmUpCisJCWIgfD0gVUFSVF9NQ1JfUlRTOworCWVsc2UKKwkJYiAmPSB+VUFSVF9NQ1JfUlRTOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX01DUiwgYik7Cit9CisKK2ludCBoY2lfaDRwX3dhaXRfZm9yX2N0cyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCBpbnQgYWN0aXZlLAorCQkJIGludCB0aW1lb3V0X21zKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgc3RhdGU7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcyk7CisJZm9yICg7OykgeworCQlzdGF0ZSA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTVNSKSAmIFVBUlRfTVNSX0NUUzsKKwkJaWYgKGFjdGl2ZSkgeworCQkJaWYgKHN0YXRlKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJaWYgKCFzdGF0ZSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQltc2xlZXAoMSk7CisJfQorfQorCit2b2lkIF9faGNpX2g0cF9zZXRfYXV0b19jdHNydHMoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbywgaW50IG9uLCB1OCB3aGljaCkKK3sKKwl1OCBsY3IsIGI7CisKKwlsY3IgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0xDUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCAweGJmKTsKKwliID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9FRlIpOworCWlmIChvbikKKwkJYiB8PSB3aGljaDsKKwllbHNlCisJCWIgJj0gfndoaWNoOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0VGUiwgYik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBsY3IpOworfQorCit2b2lkIGhjaV9oNHBfc2V0X2F1dG9fY3RzcnRzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8sIGludCBvbiwgdTggd2hpY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJX19oY2lfaDRwX3NldF9hdXRvX2N0c3J0cyhpbmZvLCBvbiwgd2hpY2gpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBoY2lfaDRwX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIHNwZWVkKQoreworCXVuc2lnbmVkIGludCBkaXZpc29yOworCXU4IGxjciwgbWRyMTsKKworCUJUX0RCRygiU2V0dGluZyBzcGVlZCAlbHUiLCBzcGVlZCk7CisKKwlpZiAoc3BlZWQgPj0gNDYwODAwKSB7CisJCWRpdmlzb3IgPSBVQVJUX0NMT0NLIC8gMTMgLyBzcGVlZDsKKwkJbWRyMSA9IDM7CisJfSBlbHNlIHsKKwkJZGl2aXNvciA9IFVBUlRfQ0xPQ0sgLyAxNiAvIHNwZWVkOworCQltZHIxID0gMDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgVUFSVCBtb2RlIGlzIGRpc2FibGVkICovCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9NRFIxLCA3KTsKKworCWxjciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTENSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIpOyAgICAgLyogU2V0IERMQUIgKi8KKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9ETEwsIGRpdmlzb3IgJiAweGZmKTsgICAgLyogU2V0IHNwZWVkICovCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRExNLCBkaXZpc29yID4+IDgpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgbGNyKTsKKworCS8qIE1ha2Ugc3VyZSBVQVJUIG1vZGUgaXMgZW5hYmxlZCAqLworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfTURSMSwgbWRyMSk7Cit9CisKK2ludCBoY2lfaDRwX3Jlc2V0X3VhcnQoc3RydWN0IGhjaV9oNHBfaW5mbyAqaW5mbykKK3sKKwlpbnQgY291bnQgPSAwOworCisJLyogUmVzZXQgdGhlIFVBUlQgKi8KKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX1NZU0MsIFVBUlRfU1lTQ19PTUFQX1JFU0VUKTsKKwl3aGlsZSAoIShoY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfU1lTUykgJiBVQVJUX1NZU1NfUkVTRVRET05FKSkgeworCQlpZiAoY291bnQrKyA+IDEwMCkgeworCQkJZGV2X2VycihpbmZvLT5kZXYsICJoY2lfaDRwOiBVQVJUIHJlc2V0IHRpbWVvdXRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGhjaV9oNHBfc3RvcmVfcmVncyhzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCXUxNiBsY3IgPSAwOworCisJbGNyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MQ1IpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgMHhCRik7CisJaW5mby0+ZGxsID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9ETEwpOworCWluZm8tPmRsaCA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfRExNKTsKKwlpbmZvLT5lZnIgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX0VGUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBsY3IpOworCWluZm8tPm1kcjEgPSBoY2lfaDRwX2luYihpbmZvLCBVQVJUX09NQVBfTURSMSk7CisJaW5mby0+aWVyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9JRVIpOworfQorCit2b2lkIGhjaV9oNHBfcmVzdG9yZV9yZWdzKHN0cnVjdCBoY2lfaDRwX2luZm8gKmluZm8pCit7CisJdTE2IGxjciA9IDA7CisKKwloY2lfaDRwX2luaXRfdWFydChpbmZvKTsKKworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX09NQVBfTURSMSwgNyk7CisJbGNyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9MQ1IpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgMHhCRik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRExMLCBpbmZvLT5kbGwpOyAgICAvKiBTZXQgc3BlZWQgKi8KKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9ETE0sIGluZm8tPmRsaCk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRUZSLCBpbmZvLT5lZnIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgbGNyKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX01EUjEsIGluZm8tPm1kcjEpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgaW5mby0+aWVyKTsKK30KKwordm9pZCBoY2lfaDRwX2luaXRfdWFydChzdHJ1Y3QgaGNpX2g0cF9pbmZvICppbmZvKQoreworCXU4IG1jciwgZWZyOworCisJLyogRW5hYmxlIGFuZCBzZXR1cCBGSUZPICovCisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfT01BUF9NRFIxLCAweDAwKTsKKworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgMHhiZik7CisJZWZyID0gaGNpX2g0cF9pbmIoaW5mbywgVUFSVF9FRlIpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0VGUiwgVUFSVF9FRlJfRUNCKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIpOworCW1jciA9IGhjaV9oNHBfaW5iKGluZm8sIFVBUlRfTUNSKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9NQ1IsIFVBUlRfTUNSX1RDUlRMUik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8CisJCQlVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8CisJCQkoMyA8PCA2KSB8ICgwIDw8IDQpKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9MQ1IsIDB4YmYpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX1RJNzUyX1RMUiwgMHhlZCk7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfVEk3NTJfVENSLCAweGVmKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9FRlIsIGVmcik7CisJaGNpX2g0cF9vdXRiKGluZm8sIFVBUlRfTENSLCBVQVJUX0xDUl9ETEFCKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9NQ1IsIDB4MDApOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0xDUiwgVUFSVF9MQ1JfV0xFTjgpOworCWhjaV9oNHBfb3V0YihpbmZvLCBVQVJUX0lFUiwgVUFSVF9JRVJfUkRJKTsKKwloY2lfaDRwX291dGIoaW5mbywgVUFSVF9PTUFQX1NZU0MsICgxIDw8IDApIHwgKDEgPDwgMikgfCAoMiA8PCAzKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMKaW5kZXggM2VlMGIxOC4uOTBmMWM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYwpAQCAtNjc4LDggKzY3OCw3IEBACiAJCQludmVjLT5yeC0+ZGF0YVtudmVjLT5yeC0+cG9zKytdID0gcmVjZWl2ZWQ7CiAJCWVsc2UKIAkJCWRldl9lcnIobnZlYy0+ZGV2LAotCQkJCSJSWCBidWZmZXIgb3ZlcmZsb3cgb24gJXA6ICIKLQkJCQkiVHJ5aW5nIHRvIHdyaXRlIGJ5dGUgJXUgb2YgJXVcbiIsCisJCQkJIlJYIGJ1ZmZlciBvdmVyZmxvdyBvbiAlcDogVHJ5aW5nIHRvIHdyaXRlIGJ5dGUgJXUgb2YgJXVcbiIsCiAJCQkJbnZlYy0+cngsIG52ZWMtPnJ4ID8gbnZlYy0+cngtPnBvcyA6IDAsCiAJCQkJTlZFQ19NU0dfU0laRSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMKaW5kZXggMDZkYmIwMi4uNDViMmYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BzMi5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlzdHJ1Y3Qgc2VyaW8gKnNlcl9kZXY7CiAJY2hhciBtb3VzZV9yZXNldFtdID0geyBOVkVDX1BTMiwgU0VORF9DT01NQU5ELCBQU01PVVNFX1JTVCwgMyB9OwogCi0Jc2VyX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOworCXNlcl9kZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOwogCWlmIChzZXJfZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKaW5kZXggNWEwMDFkOS4uOGI4Y2U3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYwpAQCAtNDY1LDYgKzQ2NSwxMTIgQEAKICNkZWZpbmUgVVNCX0ZJRk9fQUREUkVTUyhjaGFubmVsLCB1c2JfaW5kZXgpIChDVk1YX1VTQkNYX0dPVEdDVEwodXNiX2luZGV4KSArICgoY2hhbm5lbCkrMSkqMHgxMDAwKQogCiAvKioKKyAqIHN0cnVjdCBvY3Rlb25fdGVtcF9idWZmZXIgLSBhIGJvdW5jZSBidWZmZXIgZm9yIFVTQiB0cmFuc2ZlcnMKKyAqIEB0ZW1wX2J1ZmZlcjogdGhlIG5ld2x5IGFsbG9jYXRlZCB0ZW1wb3JhcnkgYnVmZmVyIChpbmNsdWRpbmcgbWV0YS1kYXRhKQorICogQG9yaWdfYnVmZmVyOiB0aGUgb3JpZ2luYWwgYnVmZmVyIHBhc3NlZCBieSB0aGUgVVNCIHN0YWNrCisgKiBAZGF0YToJIHRoZSBuZXdseSBhbGxvY2F0ZWQgdGVtcG9yYXJ5IGJ1ZmZlciAoZXhjbHVkaW5nIG1ldGEtZGF0YSkKKyAqCisgKiBCb3RoIHRoZSBETUEgZW5naW5lIGFuZCBGSUZPIG1vZGUgd2lsbCBhbHdheXMgdHJhbnNmZXIgZnVsbCAzMi1iaXQgd29yZHMuIElmCisgKiB0aGUgYnVmZmVyIGlzIHRvbyBzaG9ydCwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBvbmUsIGFuZCB0aGlzIHN0cnVjdAorICogcmVwcmVzZW50cyBpdC4KKyAqLworc3RydWN0IG9jdGVvbl90ZW1wX2J1ZmZlciB7CisJdm9pZCAqdGVtcF9idWZmZXI7CisJdm9pZCAqb3JpZ19idWZmZXI7CisJdTggZGF0YVswXTsKK307CisKKy8qKgorICogb2N0ZW9uX2FsbG9jX3RlbXBfYnVmZmVyIC0gYWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciBVU0IgdHJhbnNmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBuZWVkZWQpCisgKiBAdXJiOglVUkIuCisgKiBAbWVtX2ZsYWdzOglNZW1vcnkgYWxsb2NhdGlvbiBmbGFncy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHRlbXBvcmFyeSBib3VuY2UgYnVmZmVyIHdoZW5ldmVyIGl0J3MgbmVlZGVkCisgKiBkdWUgdG8gSFcgbGltaXRhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX2FsbG9jX3RlbXBfYnVmZmVyKHN0cnVjdCB1cmIgKnVyYiwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXN0cnVjdCBvY3Rlb25fdGVtcF9idWZmZXIgKnRlbXA7CisKKwlpZiAodXJiLT5udW1fc2dzIHx8IHVyYi0+c2cgfHwKKwkgICAgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCkgfHwKKwkgICAgISh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJSBzaXplb2YodTMyKSkpCisJCXJldHVybiAwOworCisJdGVtcCA9IGttYWxsb2MoQUxJR04odXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLCBzaXplb2YodTMyKSkgKworCQkgICAgICAgc2l6ZW9mKCp0ZW1wKSwgbWVtX2ZsYWdzKTsKKwlpZiAoIXRlbXApCisJCXJldHVybiAtRU5PTUVNOworCisJdGVtcC0+dGVtcF9idWZmZXIgPSB0ZW1wOworCXRlbXAtPm9yaWdfYnVmZmVyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJaWYgKHVzYl91cmJfZGlyX291dCh1cmIpKQorCQltZW1jcHkodGVtcC0+ZGF0YSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCSAgICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdGVtcC0+ZGF0YTsKKwl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BTElHTkVEX1RFTVBfQlVGRkVSOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb2N0ZW9uX2ZyZWVfdGVtcF9idWZmZXIgLSBmcmVlIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IFVTQiB0cmFuc2ZlcnMuCisgKiBAdXJiOiBVUkIuCisgKgorICogRnJlZXMgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IG9jdGVvbl9hbGxvY190ZW1wX2J1ZmZlcigpLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fZnJlZV90ZW1wX2J1ZmZlcihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IG9jdGVvbl90ZW1wX2J1ZmZlciAqdGVtcDsKKworCWlmICghKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfQUxJR05FRF9URU1QX0JVRkZFUikpCisJCXJldHVybjsKKworCXRlbXAgPSBjb250YWluZXJfb2YodXJiLT50cmFuc2Zlcl9idWZmZXIsIHN0cnVjdCBvY3Rlb25fdGVtcF9idWZmZXIsCisJCQkgICAgZGF0YSk7CisJaWYgKHVzYl91cmJfZGlyX2luKHVyYikpCisJCW1lbWNweSh0ZW1wLT5vcmlnX2J1ZmZlciwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCSAgICAgICB1cmItPmFjdHVhbF9sZW5ndGgpOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdGVtcC0+b3JpZ19idWZmZXI7CisJdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FMSUdORURfVEVNUF9CVUZGRVI7CisJa2ZyZWUodGVtcC0+dGVtcF9idWZmZXIpOworfQorCisvKioKKyAqIG9jdGVvbl9tYXBfdXJiX2Zvcl9kbWEgLSBPY3Rlb24tc3BlY2lmaWMgbWFwX3VyYl9mb3JfZG1hKCkuCisgKiBAaGNkOglVU0IgSENEIHN0cnVjdHVyZS4KKyAqIEB1cmI6CVVSQi4KKyAqIEBtZW1fZmxhZ3M6CU1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzLgorICovCitzdGF0aWMgaW50IG9jdGVvbl9tYXBfdXJiX2Zvcl9kbWEoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLAorCQkJCSAgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCWludCByZXQ7CisKKwlyZXQgPSBvY3Rlb25fYWxsb2NfdGVtcF9idWZmZXIodXJiLCBtZW1fZmxhZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB1c2JfaGNkX21hcF91cmJfZm9yX2RtYShoY2QsIHVyYiwgbWVtX2ZsYWdzKTsKKwlpZiAocmV0KQorCQlvY3Rlb25fZnJlZV90ZW1wX2J1ZmZlcih1cmIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBvY3Rlb25fdW5tYXBfdXJiX2Zvcl9kbWEgLSBPY3Rlb24tc3BlY2lmaWMgdW5tYXBfdXJiX2Zvcl9kbWEoKQorICogQGhjZDoJVVNCIEhDRCBzdHJ1Y3R1cmUuCisgKiBAdXJiOglVUkIuCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl91bm1hcF91cmJfZm9yX2RtYShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJdXNiX2hjZF91bm1hcF91cmJfZm9yX2RtYShoY2QsIHVyYik7CisJb2N0ZW9uX2ZyZWVfdGVtcF9idWZmZXIodXJiKTsKK30KKworLyoqCiAgKiBSZWFkIGEgVVNCIDMyYml0IENTUi4gSXQgcGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBhZGRyZXNzIHN3aXp6bGUKICAqIGZvciAzMmJpdCBDU1JzIGFuZCBsb2dzIHRoZSB2YWx1ZSBpbiBhIHJlYWRhYmxlIGZvcm1hdCBpZgogICogZGVidWdnaW5nIGlzIG9uLgpAQCAtNjA1LDcgKzcxMSw4IEBACiAJICogMmEuIFdyaXRlIFVTQk4wLzFfQ0xLX0NUTFtQT1JdID0gMSBhbmQKIAkgKiAgICAgVVNCTjAvMV9DTEtfQ1RMW0hSU1QsUFJTVCxIQ0xLX1JTVF0gPSAwCiAJICovCi0JdXNibl9jbGtfY3RsLnU2NCA9IF9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSk7CisJdXNibl9jbGtfY3RsLnU2NCA9CisJCV9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSk7CiAJdXNibl9jbGtfY3RsLnMucG9yID0gMTsKIAl1c2JuX2Nsa19jdGwucy5ocnN0ID0gMDsKIAl1c2JuX2Nsa19jdGwucy5wcnN0ID0gMDsKQEAgLTY5MSw3ICs3OTgsOCBAQAogCSAqICAgIFVTQlAgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyOgogCSAqICAgIFVTQk5fVVNCUF9DVExfU1RBVFVTW0FURV9SRVNFVF0gPSAxCiAJICovCi0JdXNibl91c2JwX2N0bF9zdGF0dXMudTY0ID0gX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCkpOworCXVzYm5fdXNicF9jdGxfc3RhdHVzLnU2NCA9IF9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsCisJCQlDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSk7CiAJdXNibl91c2JwX2N0bF9zdGF0dXMucy5hdGVfcmVzZXQgPSAxOwogCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSwKIAkJCSAgICAgICB1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQpOwpAQCAtNzU4LDcgKzg2Niw4IEBACiAJCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzFYWCkpCiAJCQl1c2ItPmluaXRfZmxhZ3MgfD0gQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUE7CiAJCXVzYmN4X2dhaGJjZmcudTMyID0gMDsKLQkJdXNiY3hfZ2FoYmNmZy5zLmRtYWVuID0gISh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSk7CisJCXVzYmN4X2dhaGJjZmcucy5kbWFlbiA9ICEodXNiLT5pbml0X2ZsYWdzICYKKwkJCQkJICBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSk7CiAJCWlmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkKIAkJCS8qIE9ubHkgdXNlIG9uZSBjaGFubmVsIHdpdGggbm9uIERNQSAqLwogCQkJdXNiLT5pZGxlX2hhcmR3YXJlX2NoYW5uZWxzID0gMHgxOwpAQCAtNzgzLDcgKzg5Miw4IEBACiAJICovCiAJewogCQl1bmlvbiBjdm14X3VzYmN4X2d1c2JjZmcgdXNiY3hfZ3VzYmNmZzsKLQkJdXNiY3hfZ3VzYmNmZy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dVU0JDRkcodXNiLT5pbmRleCkpOworCQl1c2JjeF9ndXNiY2ZnLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9HVVNCQ0ZHKHVzYi0+aW5kZXgpKTsKIAkJdXNiY3hfZ3VzYmNmZy5zLnRvdXRjYWwgPSAwOwogCQl1c2JjeF9ndXNiY2ZnLnMuZGRyc2VsID0gMDsKIAkJdXNiY3hfZ3VzYmNmZy5zLnVzYnRyZHRpbSA9IDB4NTsKQEAgLTgwMSw3ICs5MTEsOCBAQAogCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2sgdXNiY3hfZ2ludG1zazsKIAkJaW50IGNoYW5uZWw7CiAKLQkJdXNiY3hfZ2ludG1zay51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCkpOworCQl1c2JjeF9naW50bXNrLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpKTsKIAkJdXNiY3hfZ2ludG1zay5zLm90Z2ludG1zayA9IDE7CiAJCXVzYmN4X2dpbnRtc2sucy5tb2RlbWlzbXNrID0gMTsKIAkJdXNiY3hfZ2ludG1zay5zLmhjaGludG1zayA9IDE7CkBAIC04MTcsNyArOTI4LDggQEAKIAkJICogbGF0ZXIuCiAJCSAqLwogCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgODsgY2hhbm5lbCsrKQotCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENJTlRNU0tYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCAwKTsKKwkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSENJTlRNU0tYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCAwKTsKIAl9CiAKIAl7CkBAIC04MjcsMjYgKzkzOSwzMCBAQAogCQkgKiAxLiBQcm9ncmFtIHRoZSBob3N0LXBvcnQgaW50ZXJydXB0LW1hc2sgZmllbGQgdG8gdW5tYXNrLAogCQkgKiAgICBVU0JDX0dJTlRNU0tbUFJUSU5UXSA9IDEKIAkJICovCi0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywKLQkJCQlwcnRpbnRtc2ssIDEpOwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCi0JCQkJZGlzY29ubmludG1zaywgMSk7CisJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBwcnRpbnRtc2ssIDEpOworCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgZGlzY29ubmludG1zaywgMSk7CiAJCS8qCiAJCSAqIDIuIFByb2dyYW0gdGhlIFVTQkNfSENGRyByZWdpc3RlciB0byBzZWxlY3QgZnVsbC1zcGVlZCBob3N0CiAJCSAqICAgIG9yIGhpZ2gtc3BlZWQgaG9zdC4KIAkJICovCiAJCXsKIAkJCXVuaW9uIGN2bXhfdXNiY3hfaGNmZyB1c2JjeF9oY2ZnOwotCQkJdXNiY3hfaGNmZy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDRkcodXNiLT5pbmRleCkpOworCQkJdXNiY3hfaGNmZy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQlDVk1YX1VTQkNYX0hDRkcodXNiLT5pbmRleCkpOwogCQkJdXNiY3hfaGNmZy5zLmZzbHNzdXBwID0gMDsKIAkJCXVzYmN4X2hjZmcucy5mc2xzcGNsa3NlbCA9IDA7Ci0JCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0ZHKHVzYi0+aW5kZXgpLCB1c2JjeF9oY2ZnLnUzMik7CisJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkJQ1ZNWF9VU0JDWF9IQ0ZHKHVzYi0+aW5kZXgpLAorCQkJCQl1c2JjeF9oY2ZnLnUzMik7CiAJCX0KIAkJLyoKIAkJICogMy4gUHJvZ3JhbSB0aGUgcG9ydCBwb3dlciBiaXQgdG8gZHJpdmUgVkJVUyBvbiB0aGUgVVNCLAogCQkgKiAgICBVU0JDX0hQUlRbUFJUUFdSXSA9IDEKIAkJICovCi0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0cHdyLCAxKTsKKwkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2hwcnQsIHBydHB3ciwgMSk7CiAKIAkJLyoKIAkJICogU3RlcHMgNC0xNSBmcm9tIHRoZSBtYW51YWwgYXJlIGRvbmUgbGF0ZXIgaW4gdGhlIHBvcnQgZW5hYmxlCkBAIC04NzksNyArOTk1LDggQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIERpc2FibGUgdGhlIGNsb2NrcyBhbmQgcHV0IHRoZW0gaW4gcG93ZXIgb24gcmVzZXQgKi8KLQl1c2JuX2Nsa19jdGwudTY0ID0gX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpKTsKKwl1c2JuX2Nsa19jdGwudTY0ID0gX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwKKwkJCUNWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSk7CiAJdXNibl9jbGtfY3RsLnMuZW5hYmxlID0gMTsKIAl1c2JuX2Nsa19jdGwucy5wb3IgPSAxOwogCXVzYm5fY2xrX2N0bC5zLmhjbGtfcnN0ID0gMTsKQEAgLTkwMyw3ICsxMDIwLDggQEAKIHsKIAl1bmlvbiBjdm14X3VzYmN4X2dod2NmZzMgdXNiY3hfZ2h3Y2ZnMzsKIAotCXVzYi0+dXNiY3hfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOworCXVzYi0+dXNiY3hfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKIAogCS8qCiAJICogSWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBlbmFibGVkIHRoZSBqdXN0IHJldHVybi4gV2UgZG9uJ3QgbmVlZCB0byBkbwpAQCAtOTEzLDEyICsxMDMxLDEyIEBACiAJCXJldHVybiAwOwogCiAJLyogSWYgdGhlcmUgaXMgbm90aGluZyBwbHVnZ2VkIGludG8gdGhlIHBvcnQgdGhlbiBmYWlsIGltbWVkaWF0ZWx5ICovCi0JaWYgKCF1c2ItPnVzYmN4X2hwcnQucy5wcnRjb25uc3RzKSB7CisJaWYgKCF1c2ItPnVzYmN4X2hwcnQucy5wcnRjb25uc3RzKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9CiAKIAkvKiBQcm9ncmFtIHRoZSBwb3J0IHJlc2V0IGJpdCB0byBzdGFydCB0aGUgcmVzZXQgcHJvY2VzcyAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0cnN0LCAxKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsCisJCQlwcnRyc3QsIDEpOwogCiAJLyoKIAkgKiBXYWl0IGF0IGxlYXN0IDUwbXMgKGhpZ2ggc3BlZWQpLCBvciAxMG1zIChmdWxsIHNwZWVkKSBmb3IgdGhlIHJlc2V0CkBAIC05MjcsMjYgKzEwNDUsMzAgQEAKIAltZGVsYXkoNTApOwogCiAJLyogUHJvZ3JhbSB0aGUgcG9ydCByZXNldCBiaXQgdG8gMCwgVVNCQ19IUFJUW1BSVFJTVF0gPSAwICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LCBwcnRyc3QsIDApOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwKKwkJCXBydHJzdCwgMCk7CiAKIAkvKiBXYWl0IGZvciB0aGUgVVNCQ19IUFJUW1BSVEVOQV0uICovCi0JaWYgKENWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwKLQkJCQkgIHBydGVuYSwgPT0sIDEsIDEwMDAwMCkpCisJaWYgKENWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9ocHJ0LCBwcnRlbmEsID09LCAxLCAxMDAwMDApKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAogCS8qCiAJICogUmVhZCB0aGUgcG9ydCBzcGVlZCBmaWVsZCB0byBnZXQgdGhlIGVudW1lcmF0ZWQgc3BlZWQsCiAJICogVVNCQ19IUFJUW1BSVFNQRF0uCiAJICovCi0JdXNiLT51c2JjeF9ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7Ci0JdXNiY3hfZ2h3Y2ZnMy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dIV0NGRzModXNiLT5pbmRleCkpOworCXVzYi0+dXNiY3hfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKKwl1c2JjeF9naHdjZmczLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0dIV0NGRzModXNiLT5pbmRleCkpOwogCiAJLyoKIAkgKiAxMy4gUHJvZ3JhbSB0aGUgVVNCQ19HUlhGU0laIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgc2l6ZSBvZiB0aGUKIAkgKiAgICAgcmVjZWl2ZSBGSUZPICgyNSUpLgogCSAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSWEZTSVoodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfZ3J4ZnNpeiwKLQkJCXJ4ZmRlcCwgdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0KTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlhGU0laKHVzYi0+aW5kZXgpLAorCQkJdW5pb24gY3ZteF91c2JjeF9ncnhmc2l6LCByeGZkZXAsCisJCQl1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQpOwogCS8qCiAJICogMTQuIFByb2dyYW0gdGhlIFVTQkNfR05QVFhGU0laIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgc2l6ZSBhbmQgdGhlCiAJICogICAgIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5vbi0gcGVyaW9kaWMgdHJhbnNtaXQgRklGTyBmb3Igbm9ucGVyaW9kaWMKQEAgLTk1NCwxMCArMTA3NiwxMiBAQAogCSAqLwogCXsKIAkJdW5pb24gY3ZteF91c2JjeF9nbnB0eGZzaXogc2l6OwotCQlzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HTlBUWEZTSVoodXNiLT5pbmRleCkpOworCQlzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0dOUFRYRlNJWih1c2ItPmluZGV4KSk7CiAJCXNpei5zLm5wdHhmZGVwID0gdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyAyOwogCQlzaXoucy5ucHR4ZnN0YWRkciA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR05QVFhGU0laKHVzYi0+aW5kZXgpLCBzaXoudTMyKTsKKwkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR05QVFhGU0laKHVzYi0+aW5kZXgpLAorCQkJCSAgICAgICBzaXoudTMyKTsKIAl9CiAJLyoKIAkgKiAxNS4gUHJvZ3JhbSB0aGUgVVNCQ19IUFRYRlNJWiByZWdpc3RlciB0byBzZWxlY3QgdGhlIHNpemUgYW5kIHN0YXJ0CkBAIC05NjYsMTggKzEwOTAsMjUgQEAKIAkgKi8KIAl7CiAJCXVuaW9uIGN2bXhfdXNiY3hfaHB0eGZzaXogc2l6OwotCQlzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFRYRlNJWih1c2ItPmluZGV4KSk7CisJCXNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSFBUWEZTSVoodXNiLT5pbmRleCkpOwogCQlzaXoucy5wdHhmc2l6ZSA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNDsKIAkJc2l6LnMucHR4ZnN0YWRkciA9IDMgKiB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpLCBzaXoudTMyKTsKKwkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBUWEZTSVoodXNiLT5pbmRleCksCisJCQkJICAgICAgIHNpei51MzIpOwogCX0KIAkvKiBGbHVzaCBhbGwgRklGT3MgKi8KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHR4Zm51bSwgMHgxMCk7Ci0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLCB0eGZmbHNoLCAxKTsKLQlDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsCisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCXVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgdHhmbnVtLCAweDEwKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLCB0eGZmbHNoLCAxKTsKKwlDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJICAgICAgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLAogCQkJICAgICAgdHhmZmxzaCwgPT0sIDAsIDEwMCk7Ci0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLCByeGZmbHNoLCAxKTsKLQlDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsCisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCXVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgcnhmZmxzaCwgMSk7CisJQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCSAgICAgIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwKIAkJCSAgICAgIHJ4ZmZsc2gsID09LCAwLCAxMDApOwogCiAJcmV0dXJuIDA7CkBAIC05OTcsNyArMTEyOCw4IEBACiBzdGF0aWMgaW50IGN2bXhfdXNiX2Rpc2FibGUoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCiB7CiAJLyogRGlzYWJsZSB0aGUgcG9ydCAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0ZW5hLCAxKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsCisJCQlwcnRlbmEsIDEpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDEzLDIwICsxMTQ1LDIzIEBACiAgKgogICogUmV0dXJuczogUG9ydCBzdGF0dXMgaW5mb3JtYXRpb24KICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl9wb3J0X3N0YXR1cyBjdm14X3VzYl9nZXRfc3RhdHVzKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiKQorc3RhdGljIHN0cnVjdCBjdm14X3VzYl9wb3J0X3N0YXR1cyBjdm14X3VzYl9nZXRfc3RhdHVzKAorCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKIHsKIAl1bmlvbiBjdm14X3VzYmN4X2hwcnQgdXNiY19ocHJ0OwogCXN0cnVjdCBjdm14X3VzYl9wb3J0X3N0YXR1cyByZXN1bHQ7CiAKIAltZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOwogCi0JdXNiY19ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CisJdXNiY19ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwogCXJlc3VsdC5wb3J0X2VuYWJsZWQgPSB1c2JjX2hwcnQucy5wcnRlbmE7CiAJcmVzdWx0LnBvcnRfb3Zlcl9jdXJyZW50ID0gdXNiY19ocHJ0LnMucHJ0b3ZyY3VycmFjdDsKIAlyZXN1bHQucG9ydF9wb3dlcmVkID0gdXNiY19ocHJ0LnMucHJ0cHdyOwogCXJlc3VsdC5wb3J0X3NwZWVkID0gdXNiY19ocHJ0LnMucHJ0c3BkOwogCXJlc3VsdC5jb25uZWN0ZWQgPSB1c2JjX2hwcnQucy5wcnRjb25uc3RzOwotCXJlc3VsdC5jb25uZWN0X2NoYW5nZSA9IChyZXN1bHQuY29ubmVjdGVkICE9IHVzYi0+cG9ydF9zdGF0dXMuY29ubmVjdGVkKTsKKwlyZXN1bHQuY29ubmVjdF9jaGFuZ2UgPQorCQkocmVzdWx0LmNvbm5lY3RlZCAhPSB1c2ItPnBvcnRfc3RhdHVzLmNvbm5lY3RlZCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTEyMSw3ICsxMjU2LDggQEAKIAlpZiAodW5saWtlbHkoKGRldmljZV9zcGVlZCAhPSBDVk1YX1VTQl9TUEVFRF9ISUdIKSAmJgogCQkobXVsdGlfY291bnQgIT0gMCkpKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkoKGh1Yl9kZXZpY2VfYWRkciA8IDApIHx8IChodWJfZGV2aWNlX2FkZHIgPiBNQVhfVVNCX0FERFJFU1MpKSkKKwlpZiAodW5saWtlbHkoKGh1Yl9kZXZpY2VfYWRkciA8IDApIHx8CisJCShodWJfZGV2aWNlX2FkZHIgPiBNQVhfVVNCX0FERFJFU1MpKSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKHVubGlrZWx5KChodWJfcG9ydCA8IDApIHx8IChodWJfcG9ydCA+IE1BWF9VU0JfSFVCX1BPUlQpKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMTg2LDcgKzEzMjIsOCBAQAogCXVpbnQ2NF90IGFkZHJlc3M7CiAJdWludDMyX3QgKnB0cjsKIAotCXJ4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dSWFNUU1BIKHVzYi0+aW5kZXgpKTsKKwlyeF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfR1JYU1RTUEgodXNiLT5pbmRleCkpOwogCS8qIE9ubHkgcmVhZCBkYXRhIGlmIElOIGRhdGEgaXMgdGhlcmUgKi8KIAlpZiAocnhfc3RhdHVzLnMucGt0c3RzICE9IDIpCiAJCXJldHVybjsKQEAgLTEyMzYsNyArMTM3Myw4IEBACiAJd2hpbGUgKGF2YWlsYWJsZSAmJiAoZmlmby0+aGVhZCAhPSBmaWZvLT50YWlsKSkgewogCQlpbnQgaSA9IGZpZm8tPnRhaWw7CiAJCWNvbnN0IHVpbnQzMl90ICpwdHIgPSBjdm14X3BoeXNfdG9fcHRyKGZpZm8tPmVudHJ5W2ldLmFkZHJlc3MpOwotCQl1aW50NjRfdCBjc3JfYWRkcmVzcyA9IFVTQl9GSUZPX0FERFJFU1MoZmlmby0+ZW50cnlbaV0uY2hhbm5lbCwgdXNiLT5pbmRleCkgXiA0OworCQl1aW50NjRfdCBjc3JfYWRkcmVzcyA9IFVTQl9GSUZPX0FERFJFU1MoZmlmby0+ZW50cnlbaV0uY2hhbm5lbCwKKwkJCQkJCQl1c2ItPmluZGV4KSBeIDQ7CiAJCWludCB3b3JkcyA9IGF2YWlsYWJsZTsKIAogCQkvKiBMaW1pdCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gd2FodCB0aGUgU1cgZmlmbyBoYXMgKi8KQEAgLTEyNjAsNyArMTM5OCw4IEBACiAJCQljdm14X3dyaXRlNjRfdWludDMyKGNzcl9hZGRyZXNzLCAqcHRyKyspOwogCQkJY3ZteF93cml0ZTY0X3VpbnQzMihjc3JfYWRkcmVzcywgKnB0cisrKTsKIAkJCWN2bXhfd3JpdGU2NF91aW50MzIoY3NyX2FkZHJlc3MsICpwdHIrKyk7Ci0JCQljdm14X3JlYWQ2NF91aW50NjQoQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpKTsKKwkJCWN2bXhfcmVhZDY0X3VpbnQ2NCgKKwkJCQkJQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpKTsKIAkJCXdvcmRzIC09IDM7CiAJCX0KIAkJY3ZteF93cml0ZTY0X3VpbnQzMihjc3JfYWRkcmVzcywgKnB0cisrKTsKQEAgLTEyODQsMjAgKzE0MjMsMzIgQEAKIHsKIAlpZiAodXNiLT5wZXJpb2RpYy5oZWFkICE9IHVzYi0+cGVyaW9kaWMudGFpbCkgewogCQl1bmlvbiBjdm14X3VzYmN4X2hwdHhzdHMgdHhfc3RhdHVzOwotCQl0eF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFRYU1RTKHVzYi0+aW5kZXgpKTsKLQkJaWYgKF9fY3ZteF91c2JfZmlsbF90eF9odyh1c2IsICZ1c2ItPnBlcmlvZGljLCB0eF9zdGF0dXMucy5wdHhmc3BjYXZhaWwpKQotCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBwdHhmZW1wbXNrLCAxKTsKKwkJdHhfc3RhdHVzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IUFRYU1RTKHVzYi0+aW5kZXgpKTsKKwkJaWYgKF9fY3ZteF91c2JfZmlsbF90eF9odyh1c2IsICZ1c2ItPnBlcmlvZGljLAorCQkJCQkgIHR4X3N0YXR1cy5zLnB0eGZzcGNhdmFpbCkpCisJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCisJCQkJCXB0eGZlbXBtc2ssIDEpOwogCQllbHNlCi0JCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIHB0eGZlbXBtc2ssIDApOworCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAorCQkJCQlwdHhmZW1wbXNrLCAwKTsKIAl9CiAKIAlpZiAodXNiLT5ub25wZXJpb2RpYy5oZWFkICE9IHVzYi0+bm9ucGVyaW9kaWMudGFpbCkgewogCQl1bmlvbiBjdm14X3VzYmN4X2ducHR4c3RzIHR4X3N0YXR1czsKLQkJdHhfc3RhdHVzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR05QVFhTVFModXNiLT5pbmRleCkpOwotCQlpZiAoX19jdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+bm9ucGVyaW9kaWMsIHR4X3N0YXR1cy5zLm5wdHhmc3BjYXZhaWwpKQotCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBucHR4ZmVtcG1zaywgMSk7CisJCXR4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfR05QVFhTVFModXNiLT5pbmRleCkpOworCQlpZiAoX19jdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+bm9ucGVyaW9kaWMsCisJCQkJCSAgdHhfc3RhdHVzLnMubnB0eGZzcGNhdmFpbCkpCisJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCisJCQkJCW5wdHhmZW1wbXNrLCAxKTsKIAkJZWxzZQotCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBucHR4ZmVtcG1zaywgMCk7CisJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCisJCQkJCW5wdHhmZW1wbXNrLCAwKTsKIAl9CiAKIAlyZXR1cm47CkBAIC0xMzE4LDEyICsxNDY5LDE0IEBACiAJc3RydWN0IGN2bXhfdXNiX3R4X2ZpZm8gKmZpZm87CiAKIAkvKiBXZSBvbmx5IG5lZWQgdG8gZmlsbCBkYXRhIG9uIG91dGJvdW5kIGNoYW5uZWxzICovCi0JaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCWlmIChoY2NoYXIucy5lcGRpciAhPSBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKQogCQlyZXR1cm47CiAKIAkvKiBPVVQgU3BsaXRzIG9ubHkgaGF2ZSBkYXRhIG9uIHRoZSBzdGFydCBhbmQgbm90IHRoZSBjb21wbGV0ZSAqLwotCXVzYmNfaGNzcGx0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY3NwbHQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCUNWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAJaWYgKHVzYmNfaGNzcGx0LnMuc3BsdGVuYSAmJiB1c2JjX2hjc3BsdC5zLmNvbXBzcGx0KQogCQlyZXR1cm47CiAKQEAgLTEzMzEsNyArMTQ4NCw4IEBACiAJICogRmluZCBvdXQgaG93IG1hbnkgYnl0ZXMgd2UgbmVlZCB0byBmaWxsIGFuZCBjb252ZXJ0IGl0IGludG8gMzJiaXQKIAkgKiB3b3Jkcy4KIAkgKi8KLQl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCXVzYmNfaGN0c2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCWlmICghdXNiY19oY3RzaXoucy54ZmVyc2l6ZSkKIAkJcmV0dXJuOwogCkBAIC0xMzcxLDExICsxNTI1LDEzIEBACiAJCQkJIG5vZGUpOwogCXVuaW9uIGN2bXhfdXNiX2NvbnRyb2xfaGVhZGVyICpoZWFkZXIgPQogCQljdm14X3BoeXNfdG9fcHRyKHRyYW5zYWN0aW9uLT5jb250cm9sX2hlYWRlcik7Ci0JaW50IGJ5dGVzX3RvX3RyYW5zZmVyID0gdHJhbnNhY3Rpb24tPmJ1ZmZlcl9sZW5ndGggLSB0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOworCWludCBieXRlc190b190cmFuc2ZlciA9IHRyYW5zYWN0aW9uLT5idWZmZXJfbGVuZ3RoIC0KKwkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKIAlpbnQgcGFja2V0c190b190cmFuc2ZlcjsKIAl1bmlvbiBjdm14X3VzYmN4X2hjdHNpenggdXNiY19oY3RzaXo7CiAKLQl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCXVzYmNfaGN0c2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCiAJc3dpdGNoICh0cmFuc2FjdGlvbi0+c3RhZ2UpIHsKIAljYXNlIENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MOgpAQCAtMTQyMywxMiArMTU3OSwxNCBAQAogCQkJCSgoaGVhZGVyLT5zLnJlcXVlc3RfdHlwZSAmIDB4ODApID8KIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX0lOIDoKIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkpOwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKKwkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVM6CiAJCXVzYmNfaGN0c2l6LnMucGlkID0gX19jdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CiAJCWJ5dGVzX3RvX3RyYW5zZmVyID0gMDsKLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKKwkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQl1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAogCQkJCSgoaGVhZGVyLT5zLnJlcXVlc3RfdHlwZSAmIDB4ODApID8KIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCA6CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9JTikpOwpAQCAtMTQzNiwxMSArMTU5NCwxMyBAQAogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTX1NQTElUX0NPTVBMRVRFOgogCQl1c2JjX2hjdHNpei5zLnBpZCA9IF9fY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOwogCQlieXRlc190b190cmFuc2ZlciA9IDA7Ci0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCisJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKIAkJCQkoKGhlYWRlci0+cy5yZXF1ZXN0X3R5cGUgJiAweDgwKSA/CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQgOgogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4pKTsKLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CisJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQ1OCwxMCArMTYxOCwxMiBAQAogCSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdG8gdHJhbnNmZXIuIElmIHRoZSBsZW5ndGggaXMgemVybwogCSAqIHdlIHN0aWxsIG5lZWQgdG8gdHJhbnNmZXIgb25lIHBhY2tldAogCSAqLwotCXBhY2tldHNfdG9fdHJhbnNmZXIgPSAoYnl0ZXNfdG9fdHJhbnNmZXIgKyBwaXBlLT5tYXhfcGFja2V0IC0gMSkgLyBwaXBlLT5tYXhfcGFja2V0OworCXBhY2tldHNfdG9fdHJhbnNmZXIgPSAoYnl0ZXNfdG9fdHJhbnNmZXIgKyBwaXBlLT5tYXhfcGFja2V0IC0gMSkgLworCQlwaXBlLT5tYXhfcGFja2V0OwogCWlmIChwYWNrZXRzX3RvX3RyYW5zZmVyID09IDApCiAJCXBhY2tldHNfdG9fdHJhbnNmZXIgPSAxOwotCWVsc2UgaWYgKChwYWNrZXRzX3RvX3RyYW5zZmVyID4gMSkgJiYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKSkgeworCWVsc2UgaWYgKChwYWNrZXRzX3RvX3RyYW5zZmVyID4gMSkgJiYKKwkJCSh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkpIHsKIAkJLyoKIAkJICogTGltaXQgdG8gb25lIHBhY2tldCB3aGVuIG5vdCB1c2luZyBETUEuIENoYW5uZWxzIG11c3QgYmUKIAkJICogcmVzdGFydGVkIGJldHdlZW4gZXZlcnkgcGFja2V0IGZvciBJTiB0cmFuc2FjdGlvbnMsIHNvIHRoZXJlCkBAIC0xNDgxLDcgKzE2NDMsOCBAQAogCXVzYmNfaGN0c2l6LnMueGZlcnNpemUgPSBieXRlc190b190cmFuc2ZlcjsKIAl1c2JjX2hjdHNpei5zLnBrdGNudCA9IHBhY2tldHNfdG9fdHJhbnNmZXI7CiAKLQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjdHNpei51MzIpOworCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkgICAgICAgdXNiY19oY3RzaXoudTMyKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE1MTksOCArMTY4MiwxMSBAQAogCQl1bmlvbiBjdm14X3VzYmN4X2hhaW50bXNrIHVzYmNfaGFpbnRtc2s7CiAKIAkJLyogQ2xlYXIgYWxsIGNoYW5uZWwgc3RhdHVzIGJpdHMgKi8KLQkJdXNiY19oY2ludC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdXNiY19oY2ludC51MzIpOworCQl1c2JjX2hjaW50LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkgICAgICAgQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJICAgICAgIHVzYmNfaGNpbnQudTMyKTsKIAogCQl1c2JjX2hjaW50bXNrLnUzMiA9IDA7CiAJCXVzYmNfaGNpbnRtc2sucy5jaGhsdGRtc2sgPSAxOwpAQCAtMTU2NywxNCArMTczMywxNyBAQAogCQl1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHggdXNiY19oY3NwbHQgPSB7LnUzMiA9IDB9OwogCQl1bmlvbiBjdm14X3VzYmN4X2hjdHNpenggdXNiY19oY3RzaXogPSB7LnUzMiA9IDB9OwogCQlpbnQgcGFja2V0c190b190cmFuc2ZlcjsKLQkJaW50IGJ5dGVzX3RvX3RyYW5zZmVyID0gdHJhbnNhY3Rpb24tPmJ1ZmZlcl9sZW5ndGggLSB0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOworCQlpbnQgYnl0ZXNfdG9fdHJhbnNmZXIgPSB0cmFuc2FjdGlvbi0+YnVmZmVyX2xlbmd0aCAtCisJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOwogCiAJCS8qCiAJCSAqIElTT0NIUk9OT1VTIHRyYW5zYWN0aW9ucyBzdG9yZSBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIgc2l6ZQogCQkgKiBpbiB0aGUgcGFja2V0IHN0cnVjdHVyZSwgbm90IHRoZSBnbG9iYWwgYnVmZmVyX2xlbmd0aAogCQkgKi8KIAkJaWYgKHRyYW5zYWN0aW9uLT50eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTKQotCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSB0cmFuc2FjdGlvbi0+aXNvX3BhY2tldHNbMF0ubGVuZ3RoIC0gdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKKwkJCWJ5dGVzX3RvX3RyYW5zZmVyID0KKwkJCQl0cmFuc2FjdGlvbi0+aXNvX3BhY2tldHNbMF0ubGVuZ3RoIC0KKwkJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOwogCiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gZG8gc3BsaXQgdHJhbnNhY3Rpb25zIHdoZW4gd2UgYXJlIHRhbGtpbmcgdG8gbm9uCkBAIC0xNTg5LDE2ICsxNzU4LDE5IEBACiAJCQkgKi8KIAkJCWlmICgodHJhbnNhY3Rpb24tPnN0YWdlJjEpID09IDApIHsKIAkJCQlpZiAodHJhbnNhY3Rpb24tPnR5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSykKLQkJCQkJcGlwZS0+c3BsaXRfc2NfZnJhbWUgPSAodXNiLT5mcmFtZV9udW1iZXIgKyAxKSAmIDB4N2Y7CisJCQkJCXBpcGUtPnNwbGl0X3NjX2ZyYW1lID0KKwkJCQkJCSh1c2ItPmZyYW1lX251bWJlciArIDEpICYgMHg3ZjsKIAkJCQllbHNlCi0JCQkJCXBpcGUtPnNwbGl0X3NjX2ZyYW1lID0gKHVzYi0+ZnJhbWVfbnVtYmVyICsgMikgJiAweDdmOworCQkJCQlwaXBlLT5zcGxpdF9zY19mcmFtZSA9CisJCQkJCQkodXNiLT5mcmFtZV9udW1iZXIgKyAyKSAmIDB4N2Y7CiAJCQl9IGVsc2UKIAkJCQlwaXBlLT5zcGxpdF9zY19mcmFtZSA9IC0xOwogCiAJCQl1c2JjX2hjc3BsdC5zLnNwbHRlbmEgPSAxOwogCQkJdXNiY19oY3NwbHQucy5odWJhZGRyID0gcGlwZS0+aHViX2RldmljZV9hZGRyOwogCQkJdXNiY19oY3NwbHQucy5wcnRhZGRyID0gcGlwZS0+aHViX3BvcnQ7Ci0JCQl1c2JjX2hjc3BsdC5zLmNvbXBzcGx0ID0gKHRyYW5zYWN0aW9uLT5zdGFnZSA9PSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURSk7CisJCQl1c2JjX2hjc3BsdC5zLmNvbXBzcGx0ID0gKHRyYW5zYWN0aW9uLT5zdGFnZSA9PQorCQkJCUNWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFKTsKIAogCQkJLyoKIAkJCSAqIFNQTElUIHRyYW5zYWN0aW9ucyBjYW4gb25seSBldmVyIHRyYW5zbWl0IG9uZSBkYXRhCkBAIC0xNjE0LDggKzE3ODYsMTAgQEAKIAkJCSAqIGJlZ2luL21pZGRsZS9lbmQgb2YgdGhlIGRhdGEgb3IgYWxsCiAJCQkgKi8KIAkJCWlmICghdXNiY19oY3NwbHQucy5jb21wc3BsdCAmJgotCQkJCShwaXBlLT50cmFuc2Zlcl9kaXIgPT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgJiYKLQkJCQkocGlwZS0+dHJhbnNmZXJfdHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUykpIHsKKwkJCQkocGlwZS0+dHJhbnNmZXJfZGlyID09CisJCQkJIENWTVhfVVNCX0RJUkVDVElPTl9PVVQpICYmCisJCQkJKHBpcGUtPnRyYW5zZmVyX3R5cGUgPT0KKwkJCQkgQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMpKSB7CiAJCQkJLyoKIAkJCQkgKiBDbGVhciB0aGUgc3BsaXQgY29tcGxldGUgZnJhbWUgbnVtYmVyIGFzCiAJCQkJICogdGhlcmUgaXNuJ3QgZ29pbmcgdG8gYmUgYSBzcGxpdCBjb21wbGV0ZQpAQCAtMTY2Nyw3ICsxODQxLDggQEAKIAkJCSAqIFJvdW5kIE1BWF9UUkFOU0ZFUl9CWVRFUyB0byBhIG11bHRpcGxlIG9mIG91dCBwYWNrZXQKIAkJCSAqIHNpemUKIAkJCSAqLwotCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBNQVhfVFJBTlNGRVJfQllURVMgLyBwaXBlLT5tYXhfcGFja2V0OworCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBNQVhfVFJBTlNGRVJfQllURVMgLworCQkJCXBpcGUtPm1heF9wYWNrZXQ7CiAJCQlieXRlc190b190cmFuc2ZlciAqPSBwaXBlLT5tYXhfcGFja2V0OwogCQl9CiAKQEAgLTE2NzUsMTAgKzE4NTAsMTQgQEAKIAkJICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0byB0cmFuc2Zlci4gSWYgdGhlIGxlbmd0aCBpcwogCQkgKiB6ZXJvIHdlIHN0aWxsIG5lZWQgdG8gdHJhbnNmZXIgb25lIHBhY2tldAogCQkgKi8KLQkJcGFja2V0c190b190cmFuc2ZlciA9IChieXRlc190b190cmFuc2ZlciArIHBpcGUtPm1heF9wYWNrZXQgLSAxKSAvIHBpcGUtPm1heF9wYWNrZXQ7CisJCXBhY2tldHNfdG9fdHJhbnNmZXIgPQorCQkJKGJ5dGVzX3RvX3RyYW5zZmVyICsgcGlwZS0+bWF4X3BhY2tldCAtIDEpIC8KKwkJCXBpcGUtPm1heF9wYWNrZXQ7CiAJCWlmIChwYWNrZXRzX3RvX3RyYW5zZmVyID09IDApCiAJCQlwYWNrZXRzX3RvX3RyYW5zZmVyID0gMTsKLQkJZWxzZSBpZiAoKHBhY2tldHNfdG9fdHJhbnNmZXIgPiAxKSAmJiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpKSB7CisJCWVsc2UgaWYgKChwYWNrZXRzX3RvX3RyYW5zZmVyID4gMSkgJiYKKwkJCQkodXNiLT5pbml0X2ZsYWdzICYKKwkJCQkgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpKSB7CiAJCQkvKgogCQkJICogTGltaXQgdG8gb25lIHBhY2tldCB3aGVuIG5vdCB1c2luZyBETUEuIENoYW5uZWxzIG11c3QKIAkJCSAqIGJlIHJlc3RhcnRlZCBiZXR3ZWVuIGV2ZXJ5IHBhY2tldCBmb3IgSU4KQEAgLTE2ODYsMTQgKzE4NjUsMTYgQEAKIAkJCSAqIHBhY2tldHMgaW4gYSByb3cKIAkJCSAqLwogCQkJcGFja2V0c190b190cmFuc2ZlciA9IDE7Ci0JCQlieXRlc190b190cmFuc2ZlciA9IHBhY2tldHNfdG9fdHJhbnNmZXIgKiBwaXBlLT5tYXhfcGFja2V0OworCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBwYWNrZXRzX3RvX3RyYW5zZmVyICoKKwkJCQlwaXBlLT5tYXhfcGFja2V0OwogCQl9IGVsc2UgaWYgKHBhY2tldHNfdG9fdHJhbnNmZXIgPiBNQVhfVFJBTlNGRVJfUEFDS0VUUykgewogCQkJLyoKIAkJCSAqIExpbWl0IHRoZSBudW1iZXIgb2YgcGFja2V0IGFuZCBkYXRhIHRyYW5zZmVycmVkIHRvCiAJCQkgKiB3aGF0IHRoZSBoYXJkd2FyZSBjYW4gaGFuZGxlCiAJCQkgKi8KIAkJCXBhY2tldHNfdG9fdHJhbnNmZXIgPSBNQVhfVFJBTlNGRVJfUEFDS0VUUzsKLQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gcGFja2V0c190b190cmFuc2ZlciAqIHBpcGUtPm1heF9wYWNrZXQ7CisJCQlieXRlc190b190cmFuc2ZlciA9IHBhY2tldHNfdG9fdHJhbnNmZXIgKgorCQkJCXBpcGUtPm1heF9wYWNrZXQ7CiAJCX0KIAogCQl1c2JjX2hjdHNpei5zLnhmZXJzaXplID0gYnl0ZXNfdG9fdHJhbnNmZXI7CkBAIC0xNzA3LDggKzE4ODgsMTEgQEAKIAkJaWYgKHBpcGUtPmZsYWdzICYgX19DVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORykKIAkJCXVzYmNfaGN0c2l6LnMuZG9wbmcgPSAxOwogCi0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGNzcGx0LnUzMik7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGN0c2l6LnUzMik7CisJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgICBDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJICAgICAgIHVzYmNfaGNzcGx0LnUzMik7CisJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwKKwkJCQkJdXNiLT5pbmRleCksIHVzYmNfaGN0c2l6LnUzMik7CiAJfQogCiAJLyogU2V0dXAgdGhlIEhvc3QgQ2hhbm5lbCBDaGFyYWN0ZXJpc3RpY3MgUmVnaXN0ZXIgKi8KQEAgLTE3MzksMTEgKzE5MjMsMTQgQEAKIAkJLyogU2V0IHRoZSByZXN0IG9mIHRoZSBlbmRwb2ludCBzcGVjaWZpYyBzZXR0aW5ncyAqLwogCQl1c2JjX2hjY2hhci5zLmRldmFkZHIgPSBwaXBlLT5kZXZpY2VfYWRkcjsKIAkJdXNiY19oY2NoYXIucy5lcHR5cGUgPSB0cmFuc2FjdGlvbi0+dHlwZTsKLQkJdXNiY19oY2NoYXIucy5sc3BkZGV2ID0gKHBpcGUtPmRldmljZV9zcGVlZCA9PSBDVk1YX1VTQl9TUEVFRF9MT1cpOworCQl1c2JjX2hjY2hhci5zLmxzcGRkZXYgPQorCQkJKHBpcGUtPmRldmljZV9zcGVlZCA9PSBDVk1YX1VTQl9TUEVFRF9MT1cpOwogCQl1c2JjX2hjY2hhci5zLmVwZGlyID0gcGlwZS0+dHJhbnNmZXJfZGlyOwogCQl1c2JjX2hjY2hhci5zLmVwbnVtID0gcGlwZS0+ZW5kcG9pbnRfbnVtOwogCQl1c2JjX2hjY2hhci5zLm1wcyA9IHBpcGUtPm1heF9wYWNrZXQ7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGNjaGFyLnUzMik7CisJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgICBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJICAgICAgIHVzYmNfaGNjaGFyLnUzMik7CiAJfQogCiAJLyogRG8gdHJhbnNhY3Rpb24gdHlwZSBzcGVjaWZpYyBmaXh1cHMgYXMgbmVlZGVkICovCkBAIC0xNzYyLDIyICsxOTQ5LDMzIEBACiAJCQkgKi8KIAkJCWlmIChwaXBlLT50cmFuc2Zlcl9kaXIgPT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgewogCQkJCWlmIChwaXBlLT5tdWx0aV9jb3VudCA8IDIpIC8qIE5lZWQgREFUQTAgKi8KLQkJCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4LCBwaWQsIDApOworCQkJCQlVU0JfU0VUX0ZJRUxEMzIoCisJCQkJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwKKwkJCQkJCQkJICAgdXNiLT5pbmRleCksCisJCQkJCQl1bmlvbiBjdm14X3VzYmN4X2hjdHNpengsCisJCQkJCQlwaWQsIDApOwogCQkJCWVsc2UgLyogTmVlZCBNREFUQSAqLwotCQkJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hjdHNpengsIHBpZCwgMyk7CisJCQkJCVVTQl9TRVRfRklFTEQzMigKKwkJCQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLAorCQkJCQkJCQkgICB1c2ItPmluZGV4KSwKKwkJCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCwKKwkJCQkJCXBpZCwgMyk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAJfQogCXsKLQkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4IHVzYmNfaGN0c2l6ID0gey51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpfTsKKwkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4IHVzYmNfaGN0c2l6ID0gey51MzIgPQorCQkJX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpfTsKIAkJdHJhbnNhY3Rpb24tPnhmZXJzaXplID0gdXNiY19oY3RzaXoucy54ZmVyc2l6ZTsKIAkJdHJhbnNhY3Rpb24tPnBrdGNudCA9IHVzYmNfaGN0c2l6LnMucGt0Y250OwogCX0KIAkvKiBSZW1lYmVyIHdoZW4gd2Ugc3RhcnQgYSBzcGxpdCB0cmFuc2FjdGlvbiAqLwogCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkKIAkJdXNiLT5hY3RpdmVfc3BsaXQgPSB0cmFuc2FjdGlvbjsKLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGNoZW5hLCAxKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBjaGVuYSwgMSk7CiAJaWYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKQogCQlfX2N2bXhfdXNiX2ZpbGxfdHhfZmlmbyh1c2IsIGNoYW5uZWwpOwogCXJldHVybjsKQEAgLTE3OTMsMTYgKzE5OTEsMjIgQEAKICAqCiAgKiBSZXR1cm5zOiBQaXBlIG9yIE5VTEwgaWYgbm9uZSBhcmUgcmVhZHkKICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl9waXBlICpfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZShzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgdWludDY0X3QgY3VycmVudF9mcmFtZSkKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUoCisJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQl1aW50NjRfdCBjdXJyZW50X2ZyYW1lKQogewogCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwaXBlLCBsaXN0LCBub2RlKSB7CiAJCXN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqdCA9Ci0JCQlsaXN0X2ZpcnN0X2VudHJ5KCZwaXBlLT50cmFuc2FjdGlvbnMsIHR5cGVvZigqdCksIG5vZGUpOworCQkJbGlzdF9maXJzdF9lbnRyeSgmcGlwZS0+dHJhbnNhY3Rpb25zLCB0eXBlb2YoKnQpLAorCQkJCQkgbm9kZSk7CiAJCWlmICghKHBpcGUtPmZsYWdzICYgX19DVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRCkgJiYgdCAmJgogCQkJKHBpcGUtPm5leHRfdHhfZnJhbWUgPD0gY3VycmVudF9mcmFtZSkgJiYKLQkJCSgocGlwZS0+c3BsaXRfc2NfZnJhbWUgPT0gLTEpIHx8ICgoKChpbnQpY3VycmVudF9mcmFtZSAtIChpbnQpcGlwZS0+c3BsaXRfc2NfZnJhbWUpICYgMHg3ZikgPCAweDQwKSkgJiYKKwkJCSgocGlwZS0+c3BsaXRfc2NfZnJhbWUgPT0gLTEpIHx8CisJCQkgKCgoKGludCljdXJyZW50X2ZyYW1lIC0gKGludClwaXBlLT5zcGxpdF9zY19mcmFtZSkKKwkJCSAgICYgMHg3ZikgPCAweDQwKSkgJiYKIAkJCSghdXNiLT5hY3RpdmVfc3BsaXQgfHwgKHVzYi0+YWN0aXZlX3NwbGl0ID09IHQpKSkgewogCQkJQ1ZNWF9QUkVGRVRDSChwaXBlLCAxMjgpOwogCQkJQ1ZNWF9QUkVGRVRDSCh0LCAwKTsKQEAgLTE4NTIsMTQgKzIwNTYsMjYgQEAKIAkJCSAqIHdheSB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBwZXJpb2RpYyBkYXRhIGlzIHNlbnQgaW4gdGhlCiAJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lCiAJCQkgKi8KLQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsIHVzYi0+YWN0aXZlX3BpcGVzICsgQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMsIHVzYi0+ZnJhbWVfbnVtYmVyKTsKKwkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCisJCQkJCXVzYi0+YWN0aXZlX3BpcGVzICsKKwkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMsCisJCQkJCXVzYi0+ZnJhbWVfbnVtYmVyKTsKIAkJCWlmIChsaWtlbHkoIXBpcGUpKQotCQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsIHVzYi0+YWN0aXZlX3BpcGVzICsgQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBULCB1c2ItPmZyYW1lX251bWJlcik7CisJCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCQkJCXVzYi0+YWN0aXZlX3BpcGVzICsKKwkJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCwKKwkJCQkJCXVzYi0+ZnJhbWVfbnVtYmVyKTsKIAkJfQogCQlpZiAobGlrZWx5KCFwaXBlKSkgewotCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwgdXNiLT5hY3RpdmVfcGlwZXMgKyBDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MLCB1c2ItPmZyYW1lX251bWJlcik7CisJCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAorCQkJCQl1c2ItPmFjdGl2ZV9waXBlcyArCisJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0wsCisJCQkJCXVzYi0+ZnJhbWVfbnVtYmVyKTsKIAkJCWlmIChsaWtlbHkoIXBpcGUpKQotCQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsIHVzYi0+YWN0aXZlX3BpcGVzICsgQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSywgdXNiLT5mcmFtZV9udW1iZXIpOworCQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCisJCQkJCQl1c2ItPmFjdGl2ZV9waXBlcyArCisJCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLLAorCQkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwogCQl9CiAJCWlmICghcGlwZSkKIAkJCWJyZWFrOwpAQCAtMTg3Myw3ICsyMDg5LDggQEAKIAkgKiBmdXR1cmUgdGhhdCBtaWdodCBuZWVkIHRvIGJlIHNjaGVkdWxlZAogCSAqLwogCW5lZWRfc29mID0gMDsKLQlmb3IgKHR0eXBlID0gQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTDsgdHR5cGUgPD0gQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUOyB0dHlwZSsrKSB7CisJZm9yICh0dHlwZSA9IENWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0w7CisJCQl0dHlwZSA8PSBDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQ7IHR0eXBlKyspIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShwaXBlLCAmdXNiLT5hY3RpdmVfcGlwZXNbdHR5cGVdLCBub2RlKSB7CiAJCQlpZiAocGlwZS0+bmV4dF90eF9mcmFtZSA+IHVzYi0+ZnJhbWVfbnVtYmVyKSB7CiAJCQkJbmVlZF9zb2YgPSAxOwpAQCAtMTg4MSw3ICsyMDk4LDggQEAKIAkJCX0KIAkJfQogCX0KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIHNvZm1zaywgbmVlZF9zb2YpOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIHNvZm1zaywgbmVlZF9zb2YpOwogCXJldHVybjsKIH0KIApAQCAtMTkzMiwxMCArMjE1MCwxMyBAQAogCQkvKiBSZWNhbGN1bGF0ZSB0aGUgdHJhbnNmZXIgc2l6ZSBieSBhZGRpbmcgdXAgZWFjaCBwYWNrZXQgKi8KIAkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgewotCQkJaWYgKGlzb19wYWNrZXRbaV0uc3RhdHVzID09IENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpIHsKKwkJCWlmIChpc29fcGFja2V0W2ldLnN0YXR1cyA9PQorCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKSB7CiAJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPSAwOwotCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA9IGlzb19wYWNrZXRbaV0ubGVuZ3RoOwotCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCArPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0KKwkJCQkJaXNvX3BhY2tldFtpXS5sZW5ndGg7CisJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9CisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2RiZyhkZXYsICJJU09DSFJPTk9VUyBwYWNrZXQ9JWQgb2YgJWQgc3RhdHVzPSVkIHBpcGU9JXAgdHJhbnNhY3Rpb249JXAgc2l6ZT0lZFxuIiwKIAkJCQkJaSwgdXJiLT5udW1iZXJfb2ZfcGFja2V0cywKQEAgLTE5OTcsMTAgKzIyMTgsMTEgQEAKICAqIEBjb21wbGV0ZV9jb2RlOgogICoJCSBDb21wbGV0aW9uIGNvZGUKICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKLQkJCQkJc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKLQkJCQkJZW51bSBjdm14X3VzYl9jb21wbGV0ZSBjb21wbGV0ZV9jb2RlKQorc3RhdGljIHZvaWQgX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAorCQkJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAorCQkJCXN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJZW51bSBjdm14X3VzYl9jb21wbGV0ZSBjb21wbGV0ZV9jb2RlKQogewogCS8qIElmIHRoaXMgd2FzIGEgc3BsaXQgdGhlbiBjbGVhciBvdXIgc3BsaXQgaW4gcHJvZ3Jlc3MgbWFya2VyICovCiAJaWYgKHVzYi0+YWN0aXZlX3NwbGl0ID09IHRyYW5zYWN0aW9uKQpAQCAtMjAxOSw3ICsyMjQxLDggQEAKIAkJICogSWYgdGhlcmUgYXJlIG1vcmUgSVNPcyBwZW5kaW5nIGFuZCB3ZSBzdWNjZWVkZWQsIHNjaGVkdWxlIHRoZQogCQkgKiBuZXh0IG9uZQogCQkgKi8KLQkJaWYgKCh0cmFuc2FjdGlvbi0+aXNvX251bWJlcl9wYWNrZXRzID4gMSkgJiYgKGNvbXBsZXRlX2NvZGUgPT0gQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUykpIHsKKwkJaWYgKCh0cmFuc2FjdGlvbi0+aXNvX251bWJlcl9wYWNrZXRzID4gMSkgJiYKKwkJCShjb21wbGV0ZV9jb2RlID09IENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpKSB7CiAJCQkvKiBObyBieXRlcyB0cmFuc2ZlcnJlZCBmb3IgdGhpcyBwYWNrZXQgYXMgb2YgeWV0ICovCiAJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzID0gMDsKIAkJCS8qIE9uZSBsZXNzIElTTyB3YWl0aW5nIHRvIHRyYW5zZmVyICovCkBAIC0yMDY3LDE2ICsyMjkwLDE3IEBACiAgKgogICogUmV0dXJuczogVHJhbnNhY3Rpb24gb3IgTlVMTCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbihzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJCQkJICBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKLQkJCQkJCQkJICBlbnVtIGN2bXhfdXNiX3RyYW5zZmVyIHR5cGUsCi0JCQkJCQkJCSAgdWludDY0X3QgYnVmZmVyLAotCQkJCQkJCQkgIGludCBidWZmZXJfbGVuZ3RoLAotCQkJCQkJCQkgIHVpbnQ2NF90IGNvbnRyb2xfaGVhZGVyLAotCQkJCQkJCQkgIGludCBpc29fc3RhcnRfZnJhbWUsCi0JCQkJCQkJCSAgaW50IGlzb19udW1iZXJfcGFja2V0cywKLQkJCQkJCQkJICBzdHJ1Y3QgY3ZteF91c2JfaXNvX3BhY2tldCAqaXNvX3BhY2tldHMsCi0JCQkJCQkJCSAgc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24oCisJCQkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCisJCQkJZW51bSBjdm14X3VzYl90cmFuc2ZlciB0eXBlLAorCQkJCXVpbnQ2NF90IGJ1ZmZlciwKKwkJCQlpbnQgYnVmZmVyX2xlbmd0aCwKKwkJCQl1aW50NjRfdCBjb250cm9sX2hlYWRlciwKKwkJCQlpbnQgaXNvX3N0YXJ0X2ZyYW1lLAorCQkJCWludCBpc29fbnVtYmVyX3BhY2tldHMsCisJCQkJc3RydWN0IGN2bXhfdXNiX2lzb19wYWNrZXQgKmlzb19wYWNrZXRzLAorCQkJCXN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOwogCkBAIC0yMTI4LDkgKzIzNTIsMTAgQEAKICAqCiAgKiBSZXR1cm5zOiBBIHN1Ym1pdHRlZCB0cmFuc2FjdGlvbiBvciBOVUxMIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9idWxrKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkJCSBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKLQkJCQkJCQkgc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2J1bGsoCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAorCQkJCQkJc3RydWN0IHVyYiAqdXJiKQogewogCXJldHVybiBfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsIENWTVhfVVNCX1RSQU5TRkVSX0JVTEssCiAJCQkJCSAgICAgdXJiLT50cmFuc2Zlcl9kbWEsCkBAIC0yMTUyLDkgKzIzNzcsMTAgQEAKICAqCiAgKiBSZXR1cm5zOiBBIHN1Ym1pdHRlZCB0cmFuc2FjdGlvbiBvciBOVUxMIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9pbnRlcnJ1cHQoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCQkJICAgICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCi0JCQkJCQkJICAgICAgc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2ludGVycnVwdCgKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCisJCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJcmV0dXJuIF9fY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHVzYiwgcGlwZSwKIAkJCQkJICAgICBDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQsCkBAIC0yMTc3LDkgKzI0MDMsMTAgQEAKICAqCiAgKiBSZXR1cm5zOiBBIHN1Ym1pdHRlZCB0cmFuc2FjdGlvbiBvciBOVUxMIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9jb250cm9sKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkJCSAgICBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKLQkJCQkJCQkgICAgc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqY3ZteF91c2Jfc3VibWl0X2NvbnRyb2woCisJCQkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAorCQkJCQkJc3RydWN0IHVyYiAqdXJiKQogewogCWludCBidWZmZXJfbGVuZ3RoID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCXVpbnQ2NF90IGNvbnRyb2xfaGVhZGVyID0gdXJiLT5zZXR1cF9kbWE7CkBAIC0yMjA5LDkgKzI0MzYsMTAgQEAKICAqCiAgKiBSZXR1cm5zOiBBIHN1Ym1pdHRlZCB0cmFuc2FjdGlvbiBvciBOVUxMIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9pc29jaHJvbm91cyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCi0JCQkJCQkJCXN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF9pc29jaHJvbm91cygKKwkJCQkJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCisJCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGN2bXhfdXNiX2lzb19wYWNrZXQgKnBhY2tldHM7CiAKQEAgLTIyNTcsMTcgKzI0ODUsMjIgQEAKIAogCQlDVk1YX1NZTkNXOwogCi0JCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChwaXBlLT5jaGFubmVsLCB1c2ItPmluZGV4KSk7CisJCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKHBpcGUtPmNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAkJLyoKIAkJICogSWYgdGhlIGNoYW5uZWwgaXNuJ3QgZW5hYmxlZCB0aGVuIHRoZSB0cmFuc2FjdGlvbiBhbHJlYWR5CiAJCSAqIGNvbXBsZXRlZC4KIAkJICovCiAJCWlmICh1c2JjX2hjY2hhci5zLmNoZW5hKSB7CiAJCQl1c2JjX2hjY2hhci5zLmNoZGlzID0gMTsKLQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgocGlwZS0+Y2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGNjaGFyLnUzMik7CisJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKHBpcGUtPmNoYW5uZWwsCisJCQkJCQl1c2ItPmluZGV4KSwKKwkJCQkJdXNiY19oY2NoYXIudTMyKTsKIAkJfQogCX0KLQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfQ0FOQ0VMKTsKKwlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkgICAgQ1ZNWF9VU0JfQ09NUExFVEVfQ0FOQ0VMKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjMzMSw3ICsyNTY0LDggQEAKIAlpbnQgZnJhbWVfbnVtYmVyOwogCXVuaW9uIGN2bXhfdXNiY3hfaGZudW0gdXNiY19oZm51bTsKIAotCXVzYmNfaGZudW0udTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IRk5VTSh1c2ItPmluZGV4KSk7CisJdXNiY19oZm51bS51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IRk5VTSh1c2ItPmluZGV4KSk7CiAJZnJhbWVfbnVtYmVyID0gdXNiY19oZm51bS5zLmZybnVtOwogCiAJcmV0dXJuIGZyYW1lX251bWJlcjsKQEAgLTIzNTksMTAgKzI1OTMsMTIgQEAKIAlpbnQgYnVmZmVyX3NwYWNlX2xlZnQ7CiAKIAkvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgZm9yIHRoZSBjaGFubmVsICovCi0JdXNiY19oY2ludC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY2ludC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCiAJaWYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKSB7Ci0JCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCQlpZiAodXNiY19oY2NoYXIucy5jaGVuYSAmJiB1c2JjX2hjY2hhci5zLmNoZGlzKSB7CiAJCQkvKgpAQCAtMjM3MCw3ICsyNjA2LDEwIEBACiAJCQkgKiBpbnRlcnJ1cHQgSU4gdHJhbnNmZXJzIHRvIGdldCBzdHVjayB1bnRpbCB3ZSBkbyBhCiAJCQkgKiB3cml0ZSBvZiBIQ0NIQVJYIHdpdGhvdXQgY2hhbmdpbmcgdGhpbmdzCiAJCQkgKi8KLQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksIHVzYmNfaGNjaGFyLnUzMik7CisJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsCisJCQkJCQkJICAgdXNiLT5pbmRleCksCisJCQkJCXVzYmNfaGNjaGFyLnUzMik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC0yMzg0LDkgKzI2MjMsMTUgQEAKIAkJCQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBDSEhMVEQgKi8KIAkJCQloY2ludG1zay51MzIgPSAwOwogCQkJCWhjaW50bXNrLnMuY2hobHRkbXNrID0gMTsKLQkJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksIGhjaW50bXNrLnUzMik7CisJCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJCQlDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLAorCQkJCQkJCXVzYi0+aW5kZXgpLAorCQkJCQkJaGNpbnRtc2sudTMyKTsKIAkJCQl1c2JjX2hjY2hhci5zLmNoZGlzID0gMTsKLQkJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCB1c2JjX2hjY2hhci51MzIpOworCQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsCisJCQkJCQkJdXNiLT5pbmRleCksCisJCQkJCQl1c2JjX2hjY2hhci51MzIpOwogCQkJCXJldHVybiAwOwogCQkJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMueGZlcmNvbXBsKSB7CiAJCQkJLyoKQEAgLTIzOTQsNyArMjYzOSw4IEBACiAJCQkJICogQ2hhbm5lbCBoYWx0IGlzbid0IG5lZWRlZC4KIAkJCQkgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJY3ZteF9kcHJpbnRmKCJVU0IlZDogQ2hhbm5lbCAlZCBpbnRlcnJ1cHQgd2l0aG91dCBoYWx0XG4iLCB1c2ItPmluZGV4LCBjaGFubmVsKTsKKwkJCQljdm14X2RwcmludGYoIlVTQiVkOiBDaGFubmVsICVkIGludGVycnVwdCB3aXRob3V0IGhhbHRcbiIsCisJCQkJCQl1c2ItPmluZGV4LCBjaGFubmVsKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMjQxNyw3ICsyNjYzLDggQEAKIAlDVk1YX1BSRUZFVENIKHBpcGUsIDEyOCk7CiAJaWYgKCFwaXBlKQogCQlyZXR1cm4gMDsKLQl0cmFuc2FjdGlvbiA9IGxpc3RfZmlyc3RfZW50cnkoJnBpcGUtPnRyYW5zYWN0aW9ucywgdHlwZW9mKCp0cmFuc2FjdGlvbiksCisJdHJhbnNhY3Rpb24gPSBsaXN0X2ZpcnN0X2VudHJ5KCZwaXBlLT50cmFuc2FjdGlvbnMsCisJCQkJICAgICAgIHR5cGVvZigqdHJhbnNhY3Rpb24pLAogCQkJCSAgICAgICBub2RlKTsKIAlDVk1YX1BSRUZFVENIKHRyYW5zYWN0aW9uLCAwKTsKIApAQCAtMjQzMiw4ICsyNjc5LDEwIEBACiAJICogUmVhZCB0aGUgY2hhbm5lbCBjb25maWcgaW5mbyBzbyB3ZSBjYW4gZmlndXJlIG91dCBob3cgbXVjaCBkYXRhCiAJICogdHJhbnNmZXJlZAogCSAqLwotCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSk7Ci0JdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCS8qCiAJICogQ2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBieXRlcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgaXMgZGVwZW5kZW50CkBAIC0yNDQ3LDcgKzI2OTYsOCBAQAogCQkgKiB0aGUgY3VycmVudCB2YWx1ZSBvZiB4ZmVyc2l6ZSBmcm9tIGl0cyBzdGFydGluZyB2YWx1ZSBhbmQgd2UKIAkJICoga25vdyBob3cgbWFueSBieXRlcyB3ZXJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgogCQkgKi8KLQkJYnl0ZXNfdGhpc190cmFuc2ZlciA9IHRyYW5zYWN0aW9uLT54ZmVyc2l6ZSAtIHVzYmNfaGN0c2l6LnMueGZlcnNpemU7CisJCWJ5dGVzX3RoaXNfdHJhbnNmZXIgPSB0cmFuc2FjdGlvbi0+eGZlcnNpemUgLQorCQkJdXNiY19oY3RzaXoucy54ZmVyc2l6ZTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBPVVQgdHJhbnNhY3Rpb24gZG9uJ3QgZGVjcmVtZW50IHhmZXJzaXplLiBJbnN0ZWFkIHBrdGNudCBpcwpAQCAtMjQ2NSw3ICsyNzE1LDggQEAKIAl9CiAJLyogRmlndXJlIG91dCBob3cgbWFueSBieXRlcyB3ZXJlIGluIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgdHJhbnNmZXIgKi8KIAlpZiAocGFja2V0c19wcm9jZXNzZWQpCi0JCWJ5dGVzX2luX2xhc3RfcGFja2V0ID0gYnl0ZXNfdGhpc190cmFuc2ZlciAtIChwYWNrZXRzX3Byb2Nlc3NlZC0xKSAqIHVzYmNfaGNjaGFyLnMubXBzOworCQlieXRlc19pbl9sYXN0X3BhY2tldCA9IGJ5dGVzX3RoaXNfdHJhbnNmZXIgLQorCQkJKHBhY2tldHNfcHJvY2Vzc2VkIC0gMSkgKiB1c2JjX2hjY2hhci5zLm1wczsKIAllbHNlCiAJCWJ5dGVzX2luX2xhc3RfcGFja2V0ID0gYnl0ZXNfdGhpc190cmFuc2ZlcjsKIApAQCAtMjQ4NSw5ICsyNzM2LDExIEBACiAJICovCiAJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlcyArPSBieXRlc190aGlzX3RyYW5zZmVyOwogCWlmICh0cmFuc2FjdGlvbi0+dHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUykKLQkJYnVmZmVyX3NwYWNlX2xlZnQgPSB0cmFuc2FjdGlvbi0+aXNvX3BhY2tldHNbMF0ubGVuZ3RoIC0gdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKKwkJYnVmZmVyX3NwYWNlX2xlZnQgPSB0cmFuc2FjdGlvbi0+aXNvX3BhY2tldHNbMF0ubGVuZ3RoIC0KKwkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CiAJZWxzZQotCQlidWZmZXJfc3BhY2VfbGVmdCA9IHRyYW5zYWN0aW9uLT5idWZmZXJfbGVuZ3RoIC0gdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlczsKKwkJYnVmZmVyX3NwYWNlX2xlZnQgPSB0cmFuc2FjdGlvbi0+YnVmZmVyX2xlbmd0aCAtCisJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBQSUQgdG9nZ2xlIHN0YXRlIGZvciB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KQEAgLTI1MTMsNyArMjc2Niw4IEBACiAJCSAqIHRoZSBhY3R1YWwgYnl0ZXMgdHJhbnNmZXJyZWQKIAkJICovCiAJCXBpcGUtPnBpZF90b2dnbGUgPSAwOwotCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1RBTEwpOworCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX1NUQUxMKTsKIAl9IGVsc2UgaWYgKHVzYmNfaGNpbnQucy54YWN0ZXJyKSB7CiAJCS8qCiAJCSAqIFdlIGtub3cgYXQgbGVhc3Qgb25lIHBhY2tldCB3b3JrZWQgaWYgd2UgZ2V0IGEgQUNLIG9yIE5BSy4KQEAgLTI1MjgsNyArMjc4Miw4IEBACiAJCQkgKiBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgdHJhbnNmZXIuIEZvciBleGFtcGxlLCBQSUQKIAkJCSAqIHRvZ2dsZSBlcnJvcnMgY2F1c2UgdGhlc2UKIAkJCSAqLwotCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1hBQ1RFUlIpOworCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJCQkgICAgQ1ZNWF9VU0JfQ09NUExFVEVfWEFDVEVSUik7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogSWYgdGhpcyB3YXMgYSBzcGxpdCB0aGVuIGNsZWFyIG91ciBzcGxpdCBpbiBwcm9ncmVzcwpAQCAtMjU0NCwxMiArMjc5OSwxNSBAQAogCQkJcGlwZS0+c3BsaXRfc2NfZnJhbWUgPSAtMTsKIAkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7CiAJCQlpZiAocGlwZS0+bmV4dF90eF9mcmFtZSA8IHVzYi0+ZnJhbWVfbnVtYmVyKQotCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgPSB1c2ItPmZyYW1lX251bWJlciArIHBpcGUtPmludGVydmFsIC0KLQkJCQkJCSAgICAgICh1c2ItPmZyYW1lX251bWJlciAtIHBpcGUtPm5leHRfdHhfZnJhbWUpICUgcGlwZS0+aW50ZXJ2YWw7CisJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSA9CisJCQkJCXVzYi0+ZnJhbWVfbnVtYmVyICsgcGlwZS0+aW50ZXJ2YWwgLQorCQkJCQkodXNiLT5mcmFtZV9udW1iZXIgLQorCQkJCQkgcGlwZS0+bmV4dF90eF9mcmFtZSkgJSBwaXBlLT5pbnRlcnZhbDsKIAkJfQogCX0gZWxzZSBpZiAodXNiY19oY2ludC5zLmJibGVycikgewogCQkvKiBCYWJibGUgRXJyb3IgKEJibEVycikgKi8KLQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX0JBQkJMRUVSUik7CisJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCQkgICAgQ1ZNWF9VU0JfQ09NUExFVEVfQkFCQkxFRVJSKTsKIAl9IGVsc2UgaWYgKHVzYmNfaGNpbnQucy5kYXRhdGdsZXJyKSB7CiAJCS8qIFdlJ2xsIHJldHJ5IHRoZSBleGFjdCBzYW1lIHRyYW5zYWN0aW9uIGFnYWluICovCiAJCXRyYW5zYWN0aW9uLT5yZXRyaWVzKys7CkBAIC0yNTY2LDggKzI4MjQsMTEgQEAKIAkJCSAqIElmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBnbyB0aGVuIHdlIG5lZWQgdG8gdHJ5CiAJCQkgKiBhZ2Fpbi4gT3RoZXJ3aXNlIHRoaXMgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUKIAkJCSAqLwotCQkJaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fCAoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPCBwaXBlLT5tYXhfcGFja2V0KSkKLQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQlpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8CisJCQkJKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwgcGlwZS0+bWF4X3BhY2tldCkpCisJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKKwkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogU3BsaXQgdHJhbnNhY3Rpb25zIHJldHJ5IHRoZSBzcGxpdCBjb21wbGV0ZSA0IHRpbWVzCkBAIC0yNjA1LDEyICsyODY2LDE0IEBACiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MOgogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURToKIAkJCQkvKiBUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlICovCi0JCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX0VSUk9SKTsKKwkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAorCQkJCQl0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfRVJST1IpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9TRVRVUDoKIAkJCQlwaXBlLT5waWRfdG9nZ2xlID0gMTsKIAkJCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCi0JCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX1NFVFVQX1NQTElUX0NPTVBMRVRFOworCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfU0VUVVBfU1BMSVRfQ09NUExFVEU7CiAJCQkJZWxzZSB7CiAJCQkJCXVuaW9uIGN2bXhfdXNiX2NvbnRyb2xfaGVhZGVyICpoZWFkZXIgPQogCQkJCQkJY3ZteF9waHlzX3RvX3B0cih0cmFuc2FjdGlvbi0+Y29udHJvbF9oZWFkZXIpOwpAQCAtMjYzMiw3ICsyODk1LDggQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfREFUQToKIAkJCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKLQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfREFUQV9TUExJVF9DT01QTEVURTsKKwkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX0RBVEFfU1BMSVRfQ09NUExFVEU7CiAJCQkJCS8qCiAJCQkJCSAqIEZvciBzZXR1cCBPVVQgZGF0YSB0aGF0IGFyZSBzcGxpdHMsCiAJCQkJCSAqIHRoZSBoYXJkd2FyZSBkb2Vzbid0IGFwcGVhciB0byBjb3VudApAQCAtMjY0MSwzMSArMjkwNSw0NSBAQAogCQkJCQkgKi8KIAkJCQkJaWYgKCF1c2JjX2hjY2hhci5zLmVwZGlyKSB7CiAJCQkJCQlpZiAoYnVmZmVyX3NwYWNlX2xlZnQgPCBwaXBlLT5tYXhfcGFja2V0KQotCQkJCQkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXMgKz0gYnVmZmVyX3NwYWNlX2xlZnQ7CisJCQkJCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlcyArPQorCQkJCQkJCQlidWZmZXJfc3BhY2VfbGVmdDsKIAkJCQkJCWVsc2UKLQkJCQkJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzICs9IHBpcGUtPm1heF9wYWNrZXQ7CisJCQkJCQkJdHJhbnNhY3Rpb24tPmFjdHVhbF9ieXRlcyArPQorCQkJCQkJCQlwaXBlLT5tYXhfcGFja2V0OwogCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwgKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwgcGlwZS0+bWF4X3BhY2tldCkpIHsKKwkJCQl9IGVsc2UgaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fAorCQkJCQkJKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwKKwkJCQkJCSBwaXBlLT5tYXhfcGFja2V0KSkgewogCQkJCQlwaXBlLT5waWRfdG9nZ2xlID0gMTsKLQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOworCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfREFUQV9TUExJVF9DT01QTEVURToKLQkJCQlpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8IChieXRlc19pbl9sYXN0X3BhY2tldCA8IHBpcGUtPm1heF9wYWNrZXQpKSB7CisJCQkJaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fAorCQkJCQkJKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwKKwkJCQkJCSBwaXBlLT5tYXhfcGFja2V0KSkgewogCQkJCQlwaXBlLT5waWRfdG9nZ2xlID0gMTsKLQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOworCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX0RBVEE7CisJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9EQVRBOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOgogCQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkKLQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTX1NQTElUX0NPTVBMRVRFOworCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTX1NQTElUX0NPTVBMRVRFOwogCQkJCWVsc2UKLQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAorCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTX1NQTElUX0NPTVBMRVRFOgotCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKKwkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAorCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjY3OCwyNyArMjk1Niw0OSBAQAogCQkJICogZGF0YSBpcyBuZWVkZWQKIAkJCSAqLwogCQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7Ci0JCQkJaWYgKHRyYW5zYWN0aW9uLT5zdGFnZSA9PSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTCkKLQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEU7CisJCQkJaWYgKHRyYW5zYWN0aW9uLT5zdGFnZSA9PQorCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0wpCisJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CisJCQkJCQlDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURTsKIAkJCQllbHNlIHsKLQkJCQkJaWYgKGJ1ZmZlcl9zcGFjZV9sZWZ0ICYmIChieXRlc19pbl9sYXN0X3BhY2tldCA9PSBwaXBlLT5tYXhfcGFja2V0KSkKLQkJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9IENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MOworCQkJCQlpZiAoYnVmZmVyX3NwYWNlX2xlZnQgJiYKKwkJCQkJCShieXRlc19pbl9sYXN0X3BhY2tldCA9PQorCQkJCQkJIHBpcGUtPm1heF9wYWNrZXQpKQorCQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KKwkJCQkJCQlDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTDsKIAkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAodHJhbnNhY3Rpb24tPnR5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUKQotCQkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJCQkJaWYgKHRyYW5zYWN0aW9uLT50eXBlID09CisJCQkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUKQorCQkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0KKwkJCQkJCQkJcGlwZS0+aW50ZXJ2YWw7CisJCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAorCQkJCQkJCQl1c2IsCisJCQkJCQkJCXBpcGUsCisJCQkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKChwaXBlLT5kZXZpY2Vfc3BlZWQgPT0gQ1ZNWF9VU0JfU1BFRURfSElHSCkgJiYKLQkJCQkgICAgKHBpcGUtPnRyYW5zZmVyX3R5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSykgJiYKLQkJCQkgICAgKHBpcGUtPnRyYW5zZmVyX2RpciA9PSBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSAmJgorCQkJCWlmICgocGlwZS0+ZGV2aWNlX3NwZWVkID09CisJCQkJCUNWTVhfVVNCX1NQRUVEX0hJR0gpICYmCisJCQkJICAgIChwaXBlLT50cmFuc2Zlcl90eXBlID09CisJCQkJICAgICBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLKSAmJgorCQkJCSAgICAocGlwZS0+dHJhbnNmZXJfZGlyID09CisJCQkJICAgICBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSAmJgogCQkJCSAgICAodXNiY19oY2ludC5zLm5haykpCi0JCQkJCXBpcGUtPmZsYWdzIHw9IF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc7Ci0JCQkJaWYgKCFidWZmZXJfc3BhY2VfbGVmdCB8fCAoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPCBwaXBlLT5tYXhfcGFja2V0KSkgewotCQkJCQlpZiAodHJhbnNhY3Rpb24tPnR5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUKQotCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKLQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOworCQkJCQlwaXBlLT5mbGFncyB8PQorCQkJCQkJX19DVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORzsKKwkJCQlpZiAoIWJ1ZmZlcl9zcGFjZV9sZWZ0IHx8CisJCQkJCShieXRlc19pbl9sYXN0X3BhY2tldCA8CisJCQkJCSBwaXBlLT5tYXhfcGFja2V0KSkgeworCQkJCQlpZiAodHJhbnNhY3Rpb24tPnR5cGUgPT0KKwkJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCkKKwkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0KKwkJCQkJCQlwaXBlLT5pbnRlcnZhbDsKKwkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwKKwkJCQkJCXBpcGUsCisJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjcxOSwyOCArMzAxOSw0NSBAQAogCQkJCQkgKiBjb21wbGV0ZS4gT3RoZXJ3aXNlIHN0YXJ0IGl0IGFnYWluIHRvCiAJCQkJCSAqIHNlbmQgdGhlIG5leHQgMTg4IGJ5dGVzCiAJCQkJCSAqLwotCQkJCQlpZiAoIWJ1ZmZlcl9zcGFjZV9sZWZ0IHx8IChieXRlc190aGlzX3RyYW5zZmVyIDwgMTg4KSkgeworCQkJCQlpZiAoIWJ1ZmZlcl9zcGFjZV9sZWZ0IHx8CisJCQkJCQkoYnl0ZXNfdGhpc190cmFuc2ZlciA8IDE4OCkpIHsKIAkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoCisJCQkJCQkJdXNiLAorCQkJCQkJCXBpcGUsCisJCQkJCQkJdHJhbnNhY3Rpb24sCisJCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlpZiAodHJhbnNhY3Rpb24tPnN0YWdlID09IENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFKSB7CisJCQkJCWlmICh0cmFuc2FjdGlvbi0+c3RhZ2UgPT0KKwkJCQkJCUNWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFKSB7CiAJCQkJCQkvKgogCQkJCQkJICogV2UgYXJlIGluIHRoZSBpbmNvbWluZyBkYXRhCiAJCQkJCQkgKiBwaGFzZS4gS2VlcCBnZXR0aW5nIGRhdGEKIAkJCQkJCSAqIHVudGlsIHdlIHJ1biBvdXQgb2Ygc3BhY2Ugb3IKIAkJCQkJCSAqIGdldCBhIHNtYWxsIHBhY2tldAogCQkJCQkJICovCi0JCQkJCQlpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8IChieXRlc19pbl9sYXN0X3BhY2tldCA8IHBpcGUtPm1heF9wYWNrZXQpKSB7Ci0JCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKLQkJCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQkJCQlpZiAoKGJ1ZmZlcl9zcGFjZV9sZWZ0ID09IDApIHx8CisJCQkJCQkJKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwKKwkJCQkJCQkgcGlwZS0+bWF4X3BhY2tldCkpIHsKKwkJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9CisJCQkJCQkJCXBpcGUtPmludGVydmFsOworCQkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKKwkJCQkJCQkJdXNiLAorCQkJCQkJCQlwaXBlLAorCQkJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZQotCQkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0gQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEU7CisJCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQorCQkJCQkJCUNWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MX1NQTElUX0NPTVBMRVRFOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKLQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CisJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwKKwkJCQkJCXBpcGUsCisJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KQEAgLTI3NjAsOCArMzA3NywxMCBAQAogCQl0cmFuc2FjdGlvbi0+c3RhZ2UgJj0gfjE7CiAJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7CiAJCWlmIChwaXBlLT5uZXh0X3R4X2ZyYW1lIDwgdXNiLT5mcmFtZV9udW1iZXIpCi0JCQlwaXBlLT5uZXh0X3R4X2ZyYW1lID0gdXNiLT5mcmFtZV9udW1iZXIgKyBwaXBlLT5pbnRlcnZhbCAtCi0JCQkJKHVzYi0+ZnJhbWVfbnVtYmVyIC0gcGlwZS0+bmV4dF90eF9mcmFtZSkgJSBwaXBlLT5pbnRlcnZhbDsKKwkJCXBpcGUtPm5leHRfdHhfZnJhbWUgPSB1c2ItPmZyYW1lX251bWJlciArCisJCQkJcGlwZS0+aW50ZXJ2YWwgLQorCQkJCSh1c2ItPmZyYW1lX251bWJlciAtIHBpcGUtPm5leHRfdHhfZnJhbWUpICUKKwkJCQlwaXBlLT5pbnRlcnZhbDsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgY3ZteF91c2JfcG9ydF9zdGF0dXMgcG9ydDsKIAkJcG9ydCA9IGN2bXhfdXNiX2dldF9zdGF0dXModXNiKTsKQEAgLTI3NzMsNyArMzA5Miw4IEBACiAJCQkgKiBXZSBnZXQgY2hhbm5lbCBoYWx0ZWQgaW50ZXJydXB0cyB3aXRoIG5vIHJlc3VsdCBiaXRzCiAJCQkgKiBzZXRzIHdoZW4gdGhlIGNhYmxlIGlzIHVucGx1Z2dlZAogCQkJICovCi0JCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwgQ1ZNWF9VU0JfQ09NUExFVEVfRVJST1IpOworCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX0VSUk9SKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTI4NTYsOSArMzE3NiwxMSBAQAogCQkgKi8KIAkJb2N0ZW9uX3VzYl9wb3J0X2NhbGxiYWNrKHVzYik7CiAJCS8qIENsZWFyIHRoZSBwb3J0IGNoYW5nZSBiaXRzICovCi0JCXVzYmNfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOworCQl1c2JjX2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwogCQl1c2JjX2hwcnQucy5wcnRlbmEgPSAwOwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1c2JjX2hwcnQudTMyKTsKKwkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwKKwkJCQkgICAgICAgdXNiY19ocHJ0LnUzMik7CiAJfQogCWlmICh1c2JjX2dpbnRzdHMucy5oY2hpbnQpIHsKIAkJLyoKQEAgLTMwMDIsMTMgKzMzMjQsMTUgQEAKIAkJfQogCQlwaXBlID0gY3ZteF91c2Jfb3Blbl9waXBlKCZwcml2LT51c2IsIHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksCiAJCQkJCSAgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLCBzcGVlZCwKLQkJCQkJICBsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSkgJiAweDdmZiwKKwkJCQkJICBsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSkKKwkJCQkJICAmIDB4N2ZmLAogCQkJCQkgIHRyYW5zZmVyX3R5cGUsCiAJCQkJCSAgdXNiX3BpcGVpbih1cmItPnBpcGUpID8KIAkJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9JTiA6CiAJCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VULAogCQkJCQkgIHVyYi0+aW50ZXJ2YWwsCi0JCQkJCSAgKGxlMTZfdG9fY3B1KGVwLT5kZXNjLndNYXhQYWNrZXRTaXplKSA+PiAxMSkgJiAweDMsCisJCQkJCSAgKGxlMTZfdG9fY3B1KGVwLT5kZXNjLndNYXhQYWNrZXRTaXplKQorCQkJCQkgICA+PiAxMSkgJiAweDMsCiAJCQkJCSAgc3BsaXRfZGV2aWNlLCBzcGxpdF9wb3J0KTsKIAkJaWYgKCFwaXBlKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0zMDIzLDcgKzMzNDcsOCBAQAogCXN3aXRjaCAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkpIHsKIAljYXNlIFBJUEVfSVNPQ0hST05PVVM6CiAJCWRldl9kYmcoZGV2LCAiU3VibWl0IGlzb2Nocm9ub3VzIHRvICVkLiVkXG4iLAotCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKKwkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksCisJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOwogCQkvKgogCQkgKiBBbGxvY2F0ZSBhIHN0cnVjdHVyZSB0byB1c2UgZm9yIG91ciBwcml2YXRlIGxpc3Qgb2YKIAkJICogaXNvY2hyb25vdXMgcGFja2V0cy4KQEAgLTMwMzUsOSArMzM2MCwxMiBAQAogCQkJaW50IGk7CiAJCQkvKiBGaWxsIHRoZSBsaXN0IHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgVVJCICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7Ci0JCQkJaXNvX3BhY2tldFtpXS5vZmZzZXQgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKLQkJCQlpc29fcGFja2V0W2ldLmxlbmd0aCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoOwotCQkJCWlzb19wYWNrZXRbaV0uc3RhdHVzID0gQ1ZNWF9VU0JfQ09NUExFVEVfRVJST1I7CisJCQkJaXNvX3BhY2tldFtpXS5vZmZzZXQgPQorCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKKwkJCQlpc29fcGFja2V0W2ldLmxlbmd0aCA9CisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoOworCQkJCWlzb19wYWNrZXRbaV0uc3RhdHVzID0KKwkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfRVJST1I7CiAJCQl9CiAJCQkvKgogCQkJICogU3RvcmUgYSBwb2ludGVyIHRvIHRoZSBsaXN0IGluIHRoZSBVUkIgc2V0dXBfcGFja2V0CkBAIC0zMDU5LDE3ICszMzg3LDIwIEBACiAJCWJyZWFrOwogCWNhc2UgUElQRV9JTlRFUlJVUFQ6CiAJCWRldl9kYmcoZGV2LCAiU3VibWl0IGludGVycnVwdCB0byAlZC4lZFxuIiwKLQkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSk7CisJCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKIAkJdHJhbnNhY3Rpb24gPSBjdm14X3VzYl9zdWJtaXRfaW50ZXJydXB0KCZwcml2LT51c2IsIHBpcGUsIHVyYik7CiAJCWJyZWFrOwogCWNhc2UgUElQRV9DT05UUk9MOgogCQlkZXZfZGJnKGRldiwgIlN1Ym1pdCBjb250cm9sIHRvICVkLiVkXG4iLAotCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKKwkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksCisJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOwogCQl0cmFuc2FjdGlvbiA9IGN2bXhfdXNiX3N1Ym1pdF9jb250cm9sKCZwcml2LT51c2IsIHBpcGUsIHVyYik7CiAJCWJyZWFrOwogCWNhc2UgUElQRV9CVUxLOgogCQlkZXZfZGJnKGRldiwgIlN1Ym1pdCBidWxrIHRvICVkLiVkXG4iLAotCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKTsKKwkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksCisJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkpOwogCQl0cmFuc2FjdGlvbiA9IGN2bXhfdXNiX3N1Ym1pdF9idWxrKCZwcml2LT51c2IsIHBpcGUsIHVyYik7CiAJCWJyZWFrOwogCX0KQEAgLTMxMDAsNyArMzQzMSw5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IG9jdGVvbl91c2JfdXJiX2RlcXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQorc3RhdGljIGludCBvY3Rlb25fdXNiX3VyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsCisJCQkJICBzdHJ1Y3QgdXJiICp1cmIsCisJCQkJICBpbnQgc3RhdHVzKQogewogCXN0cnVjdCBvY3Rlb25faGNkICpwcml2ID0gaGNkX3RvX29jdGVvbihoY2QpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zMTIwLDcgKzM0NTMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBvY3Rlb25fdXNiX2VuZHBvaW50X2Rpc2FibGUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKK3N0YXRpYyB2b2lkIG9jdGVvbl91c2JfZW5kcG9pbnRfZGlzYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhjZC0+c2VsZi5jb250cm9sbGVyOwogCkBAIC0zMjAzLDcgKzM1MzcsOCBAQAogCQkJZGV2X2RiZyhkZXYsICIgQ19DT05ORUNUSU9OXG4iKTsKIAkJCS8qIENsZWFycyBkcml2ZXJzIGludGVybmFsIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSBmbGFnICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0gY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKKwkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9CisJCQkJY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19SRVNFVDoKQEAgLTMyMTIsNyArMzU0Nyw4IEBACiAJCQkgKiBDbGVhcnMgdGhlIGRyaXZlcidzIGludGVybmFsIFBvcnQgUmVzZXQgQ2hhbmdlIGZsYWcuCiAJCQkgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPSBjdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOworCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0KKwkJCQljdm14X3VzYl9nZXRfc3RhdHVzKCZwcml2LT51c2IpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0VOQUJMRToKQEAgLTMyMjIsNyArMzU1OCw4IEBACiAJCQkgKiBDaGFuZ2UgZmxhZy4KIAkJCSAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9IGN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CisJCQlwcml2LT51c2IucG9ydF9zdGF0dXMgPQorCQkJCWN2bXhfdXNiX2dldF9zdGF0dXMoJnByaXYtPnVzYik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORDoKQEAgLTMyMzcsNyArMzU3NCw4IEBACiAJCQlkZXZfZGJnKGRldiwgIiBDX09WRVJfQ1VSUkVOVFxuIik7CiAJCQkvKiBDbGVhcnMgdGhlIGRyaXZlcidzIG92ZXJjdXJyZW50IENoYW5nZSBmbGFnICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJcHJpdi0+dXNiLnBvcnRfc3RhdHVzID0gY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKKwkJCXByaXYtPnVzYi5wb3J0X3N0YXR1cyA9CisJCQkJY3ZteF91c2JfZ2V0X3N0YXR1cygmcHJpdi0+dXNiKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMzM2OSw2ICszNzA3LDggQEAKIAkuZ2V0X2ZyYW1lX251bWJlcgk9IG9jdGVvbl91c2JfZ2V0X2ZyYW1lX251bWJlciwKIAkuaHViX3N0YXR1c19kYXRhCT0gb2N0ZW9uX3VzYl9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sCQk9IG9jdGVvbl91c2JfaHViX2NvbnRyb2wsCisJLm1hcF91cmJfZm9yX2RtYQk9IG9jdGVvbl9tYXBfdXJiX2Zvcl9kbWEsCisJLnVubWFwX3VyYl9mb3JfZG1hCT0gb2N0ZW9uX3VubWFwX3VyYl9mb3JfZG1hLAogfTsKIAogc3RhdGljIGludCBvY3Rlb25fdXNiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0zNDExLDcgKzM3NTEsOCBAQAogCQlpbml0aWFsaXplX2ZsYWdzID0gQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19DTE9DS180OE1IWjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihkZXYsICJJbGxlYmFsIFVTQk4gXCJyZWZjbGstZnJlcXVlbmN5XCIgJXVcbiIsIGNsb2NrX3JhdGUpOworCQlkZXZfZXJyKGRldiwgIklsbGViYWwgVVNCTiBcInJlZmNsay1mcmVxdWVuY3lcIiAldVxuIiwKKwkJCQljbG9ja19yYXRlKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAogCX0KQEAgLTM0NzcsNyArMzgxOCw4IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CiAKLQl0YXNrbGV0X2luaXQoJnByaXYtPmRlcXVldWVfdGFza2xldCwgb2N0ZW9uX3VzYl91cmJfZGVxdWV1ZV93b3JrLCAodW5zaWduZWQgbG9uZylwcml2KTsKKwl0YXNrbGV0X2luaXQoJnByaXYtPmRlcXVldWVfdGFza2xldCwgb2N0ZW9uX3VzYl91cmJfZGVxdWV1ZV93b3JrLAorCQkgICAgICh1bnNpZ25lZCBsb25nKXByaXYpOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5kZXF1ZXVlX2xpc3QpOwogCiAJc3RhdHVzID0gY3ZteF91c2JfaW5pdGlhbGl6ZSgmcHJpdi0+dXNiLCB1c2JfbnVtLCBpbml0aWFsaXplX2ZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtZGVmaW5lcy5oIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1kZWZpbmVzLmgKaW5kZXggYmRhZWM4ZC4uMmE5OGEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1kZWZpbmVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1kZWZpbmVzLmgKQEAgLTMzLDEwICszMyw2IEBACiAgKiAgICAgIGRyaXZlciB3aWxsIHVzZSB0aGlzIG1lbW9yeSBpbnN0ZWFkIG9mIGtlcm5lbCBtZW1vcnkgZm9yIHBvb2xzLiBUaGlzCiAgKiAgICAgIGFsbG93cyAzMmJpdCB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdG8gYWNjZXNzIHRoZSBidWZmZXJzLCBidXQgYWxzbwogICogICAgICByZXF1aXJlcyBhbGwgcmVjZWl2ZWQgcGFja2V0cyB0byBiZSBjb3BpZWQuCi0gKiAgQ09ORklHX0NBVklVTV9PQ1RFT05fTlVNX1BBQ0tFVF9CVUZGRVJTCi0gKiAgICAgIFRoaXMga2VybmVsIGNvbmZpZyBvcHRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgdGhlIG51bWJlciBvZgotICogICAgICBwYWNrZXQgYW5kIHdvcmsgcXVldWUgYnVmZmVycyBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4gSWYgdGhpcyBpcyB6ZXJvLAotICogICAgICB0aGUgZHJpdmVyIHVzZXMgdGhlIGRlZmF1bHQgZnJvbSBiZWxvdy4KICAqICBVU0VfU0tCVUZGU19JTl9IVwogICogICAgICBUZWxscyB0aGUgZHJpdmVyIHRvIHBvcHVsYXRlIHRoZSBwYWNrZXQgYnVmZmVycyB3aXRoIGtlcm5lbCBza2J1ZmZzLgogICogICAgICBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIHJlY2VpdmUgcGFja2V0cyB3aXRob3V0IGNvcHlpbmcgdGhlbS4gSXQgYWxzbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwppbmRleCA4M2IxMDMwLi4zZjA2N2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwpAQCAtMTI3LDIzICsxMjcsMjEgQEAKIAkJbGlua19pbmZvLnMubGlua191cCA9IHByaXYtPmxhc3RfbGluayA/IDEgOiAwOwogCQlsaW5rX2luZm8ucy5mdWxsX2R1cGxleCA9IHByaXYtPnBoeWRldi0+ZHVwbGV4ID8gMSA6IDA7CiAJCWxpbmtfaW5mby5zLnNwZWVkID0gcHJpdi0+cGh5ZGV2LT5zcGVlZDsKLQkJY3ZteF9oZWxwZXJfbGlua19zZXQoIHByaXYtPnBvcnQsIGxpbmtfaW5mbyk7CisJCWN2bXhfaGVscGVyX2xpbmtfc2V0KHByaXYtPnBvcnQsIGxpbmtfaW5mbyk7CiAJCWlmIChwcml2LT5sYXN0X2xpbmspIHsKIAkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIAkJCWlmIChwcml2LT5xdWV1ZSAhPSAtMSkKIAkJCQlwcmludGtfcmF0ZWxpbWl0ZWQoIiVzOiAldSBNYnBzICVzIGR1cGxleCwgIgotCQkJCQkJICAgInBvcnQgJTJkLCBxdWV1ZSAlMmRcbiIsCi0JCQkJCQkgICBkZXYtPm5hbWUsIHByaXYtPnBoeWRldi0+c3BlZWQsCi0JCQkJCQkgICBwcml2LT5waHlkZXYtPmR1cGxleCA/Ci0JCQkJCQkgICAiRnVsbCIgOiAiSGFsZiIsCi0JCQkJCQkgICBwcml2LT5wb3J0LCBwcml2LT5xdWV1ZSk7CisJCQkJCSJwb3J0ICUyZCwgcXVldWUgJTJkXG4iLCBkZXYtPm5hbWUsCisJCQkJCXByaXYtPnBoeWRldi0+c3BlZWQsCisJCQkJCXByaXYtPnBoeWRldi0+ZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiLAorCQkJCQlwcml2LT5wb3J0LCBwcml2LT5xdWV1ZSk7CiAJCQllbHNlCiAJCQkJcHJpbnRrX3JhdGVsaW1pdGVkKCIlczogJXUgTWJwcyAlcyBkdXBsZXgsICIKLQkJCQkJCSAgICJwb3J0ICUyZCwgUE9XXG4iLAotCQkJCQkJICAgZGV2LT5uYW1lLCBwcml2LT5waHlkZXYtPnNwZWVkLAotCQkJCQkJICAgcHJpdi0+cGh5ZGV2LT5kdXBsZXggPwotCQkJCQkJICAgIkZ1bGwiIDogIkhhbGYiLAotCQkJCQkJICAgcHJpdi0+cG9ydCk7CisJCQkJCSJwb3J0ICUyZCwgUE9XXG4iLCBkZXYtPm5hbWUsCisJCQkJCXByaXYtPnBoeWRldi0+c3BlZWQsCisJCQkJCXByaXYtPnBoeWRldi0+ZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiLAorCQkJCQlwcml2LT5wb3J0KTsKIAkJfSBlbHNlIHsKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJCQlwcmludGtfcmF0ZWxpbWl0ZWQoIiVzOiBMaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1lbS5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZW0uYwppbmRleCAxOTkwNTlkLi5iZjY2NmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1lbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWVtLmMKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9vY3Rlb24vb2N0ZW9uLmg+CiAKKyNpbmNsdWRlICJldGhlcm5ldC1tZW0uaCIKICNpbmNsdWRlICJldGhlcm5ldC1kZWZpbmVzLmgiCiAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtZnBhLmg+CkBAIC03OSwxMCArODAsMTAgQEAKIAl9IHdoaWxlIChtZW1vcnkpOwogCiAJaWYgKGVsZW1lbnRzIDwgMCkKLQkJcHJfd2FybmluZygiRnJlZWluZyBvZiBwb29sICV1IGhhZCB0b28gbWFueSBza2J1ZmZzICglZClcbiIsCisJCXByX3dhcm4oIkZyZWVpbmcgb2YgcG9vbCAldSBoYWQgdG9vIG1hbnkgc2tidWZmcyAoJWQpXG4iLAogCQkgICAgIHBvb2wsIGVsZW1lbnRzKTsKIAllbHNlIGlmIChlbGVtZW50cyA+IDApCi0JCXByX3dhcm5pbmcoIkZyZWVpbmcgb2YgcG9vbCAldSBpcyBtaXNzaW5nICVkIHNrYnVmZnNcbiIsCisJCXByX3dhcm4oIkZyZWVpbmcgb2YgcG9vbCAldSBpcyBtaXNzaW5nICVkIHNrYnVmZnNcbiIsCiAJCSAgICAgICBwb29sLCBlbGVtZW50cyk7CiB9CiAKQEAgLTExMyw3ICsxMTQsNyBAQAogCQkgKi8KIAkJbWVtb3J5ID0ga21hbGxvYyhzaXplICsgMjU2LCBHRlBfQVRPTUlDKTsKIAkJaWYgKHVubGlrZWx5KG1lbW9yeSA9PSBOVUxMKSkgewotCQkJcHJfd2FybmluZygiVW5hYmxlIHRvIGFsbG9jYXRlICV1IGJ5dGVzIGZvciBGUEEgcG9vbCAlZFxuIiwKKwkJCXByX3dhcm4oIlVuYWJsZSB0byBhbGxvY2F0ZSAldSBieXRlcyBmb3IgRlBBIHBvb2wgJWRcbiIsCiAJCQkJICAgZWxlbWVudHMgKiBzaXplLCBwb29sKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNDYsMTAgKzE0NywxMCBAQAogCX0gd2hpbGUgKGZwYSk7CiAKIAlpZiAoZWxlbWVudHMgPCAwKQotCQlwcl93YXJuaW5nKCJGcmVlaW5nIG9mIHBvb2wgJXUgaGFkIHRvbyBtYW55IGJ1ZmZlcnMgKCVkKVxuIiwKKwkJcHJfd2FybigiRnJlZWluZyBvZiBwb29sICV1IGhhZCB0b28gbWFueSBidWZmZXJzICglZClcbiIsCiAJCQlwb29sLCBlbGVtZW50cyk7CiAJZWxzZSBpZiAoZWxlbWVudHMgPiAwKQotCQlwcl93YXJuaW5nKCJXYXJuaW5nOiBGcmVlaW5nIG9mIHBvb2wgJXUgaXMgbWlzc2luZyAlZCBidWZmZXJzXG4iLAorCQlwcl93YXJuKCJXYXJuaW5nOiBGcmVlaW5nIG9mIHBvb2wgJXUgaXMgbWlzc2luZyAlZCBidWZmZXJzXG4iLAogCQkJcG9vbCwgZWxlbWVudHMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKaW5kZXggZWE1M2FmMy4uMGVjMGRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYwpAQCAtNDMsNyArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1ucGktZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1nbXh4LWRlZnMuaD4KIAotREVGSU5FX1NQSU5MT0NLKGdsb2JhbF9yZWdpc3Rlcl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2xvYmFsX3JlZ2lzdGVyX2xvY2spOwogCiBzdGF0aWMgaW50IG51bWJlcl9yZ21paV9wb3J0czsKIApAQCAtNzIsNyArNzIsOCBAQAogCQkgKiBJZiB0aGUgMTBNYnBzIHByZWFtYmxlIHdvcmthcm91bmQgaXMgc3VwcG9ydGVkIGFuZCB3ZSdyZQogCQkgKiBhdCAxME1icHMgd2UgbWF5IG5lZWQgdG8gZG8gc29tZSBzcGVjaWFsIGNoZWNraW5nLgogCQkgKi8KLQkJaWYgKFVTRV8xME1CUFNfUFJFQU1CTEVfV09SS0FST1VORCAmJiAobGlua19pbmZvLnMuc3BlZWQgPT0gMTApKSB7CisJCWlmIChVU0VfMTBNQlBTX1BSRUFNQkxFX1dPUktBUk9VTkQgJiYKKwkJCQkobGlua19pbmZvLnMuc3BlZWQgPT0gMTApKSB7CiAKIAkJCS8qCiAJCQkgKiBSZWFkIHRoZSBHTVhYX1JYWF9JTlRfUkVHW1BDVEVSUl0gYml0IGFuZApAQCAtMTY2LDkgKzE2Nyw4IEBACiAKIAlpZiAodXNlX2dsb2JhbF9yZWdpc3Rlcl9sb2NrKQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnbG9iYWxfcmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotCWVsc2UgeworCWVsc2UKIAkJbXV0ZXhfdW5sb2NrKCZwcml2LT5waHlkZXYtPmJ1cy0+bWRpb19sb2NrKTsKLQl9CiAKIAlpZiAocHJpdi0+cGh5ZGV2ID09IE5VTEwpIHsKIAkJLyogVGVsbCBjb3JlLiAqLwpAQCAtMjMyLDggKzIzMiwxMCBAQAogCQkJCQkJICAgKGludGVyZmFjZSwgaW5kZXgpXTsKIAkJCQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCQkJCWlmIChkZXYgJiYgIWF0b21pY19yZWFkKCZjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmcpKQotCQkJCQlxdWV1ZV93b3JrKGN2bV9vY3RfcG9sbF9xdWV1ZSwgJnByaXYtPnBvcnRfd29yayk7CisJCQkJaWYgKGRldiAmJgorCQkJCSFhdG9taWNfcmVhZCgmY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nKSkKKwkJCQkJcXVldWVfd29yayhjdm1fb2N0X3BvbGxfcXVldWUsCisJCQkJCQkmcHJpdi0+cG9ydF93b3JrKTsKIAogCQkJCWdteF9yeF9pbnRfcmVnLnU2NCA9IDA7CiAJCQkJZ214X3J4X2ludF9yZWcucy5waHlfZHVweCA9IDE7CkBAIC0yNzQsOCArMjc2LDEwIEBACiAJCQkJCQkgICAoaW50ZXJmYWNlLCBpbmRleCldOwogCQkJCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JCQkJaWYgKGRldiAmJiAhYXRvbWljX3JlYWQoJmN2bV9vY3RfcG9sbF9xdWV1ZV9zdG9wcGluZykpCi0JCQkJCXF1ZXVlX3dvcmsoY3ZtX29jdF9wb2xsX3F1ZXVlLCAmcHJpdi0+cG9ydF93b3JrKTsKKwkJCQlpZiAoZGV2ICYmCisJCQkJIWF0b21pY19yZWFkKCZjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmcpKQorCQkJCQlxdWV1ZV93b3JrKGN2bV9vY3RfcG9sbF9xdWV1ZSwKKwkJCQkJCSZwcml2LT5wb3J0X3dvcmspOwogCiAJCQkJZ214X3J4X2ludF9yZWcudTY0ID0gMDsKIAkJCQlnbXhfcnhfaW50X3JlZy5zLnBoeV9kdXB4ID0gMTsKQEAgLTMyNyw3ICszMzEsOCBAQAogCiBzdGF0aWMgdm9pZCBjdm1fb2N0X3JnbWlpX2ltbWVkaWF0ZV9wb2xsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvY3Rlb25fZXRoZXJuZXQsIHBvcnRfd29yayk7CisJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0LCBwb3J0X3dvcmspOwogCWN2bV9vY3RfcmdtaWlfcG9sbChjdm1fb2N0X2RldmljZVtwcml2LT5wb3J0XSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYwppbmRleCA0NzU0MWUxLi44Y2E1NWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jCkBAIC05NSw3ICs5NSw3IEBACiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfVElNWCgxKSwgY2l1X3RpbXgudTY0KTsKIH0KIAotdm9pZCBjdm1fb2N0X2ZyZWVfdHhfc2ticyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgY3ZtX29jdF9mcmVlX3R4X3NrYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpbnQzMl90IHNrYl90b19mcmVlOwogCWludCBxb3MsIHF1ZXVlc19wZXJfcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYwppbmRleCAwODlkYzRiLi5mZjcyMTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCkBAIC01NSwxNyArNTUsMTEgQEAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtZ214eC1kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LXNtaXgtZGVmcy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ0FWSVVNX09DVEVPTl9OVU1fUEFDS0VUX0JVRkZFUlMpIFwKLQkmJiBDT05GSUdfQ0FWSVVNX09DVEVPTl9OVU1fUEFDS0VUX0JVRkZFUlMKLWludCBudW1fcGFja2V0X2J1ZmZlcnMgPSBDT05GSUdfQ0FWSVVNX09DVEVPTl9OVU1fUEFDS0VUX0JVRkZFUlM7Ci0jZWxzZQotaW50IG51bV9wYWNrZXRfYnVmZmVycyA9IDEwMjQ7Ci0jZW5kaWYKK3N0YXRpYyBpbnQgbnVtX3BhY2tldF9idWZmZXJzID0gMTAyNDsKIG1vZHVsZV9wYXJhbShudW1fcGFja2V0X2J1ZmZlcnMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG51bV9wYWNrZXRfYnVmZmVycywgIlxuIgogCSJcdE51bWJlciBvZiBwYWNrZXQgYnVmZmVycyB0byBhbGxvY2F0ZSBhbmQgc3RvcmUgaW4gdGhlXG4iCi0JIlx0RlBBLiBCeSBkZWZhdWx0LCAxMDI0IHBhY2tldCBidWZmZXJzIGFyZSB1c2VkIHVubGVzc1xuIgotCSJcdENPTkZJR19DQVZJVU1fT0NURU9OX05VTV9QQUNLRVRfQlVGRkVSUyBpcyBkZWZpbmVkLiIpOworCSJcdEZQQS4gQnkgZGVmYXVsdCwgMTAyNCBwYWNrZXQgYnVmZmVycyBhcmUgdXNlZC5cbiIpOwogCiBpbnQgcG93X3JlY2VpdmVfZ3JvdXAgPSAxNTsKIG1vZHVsZV9wYXJhbShwb3dfcmVjZWl2ZV9ncm91cCwgaW50LCAwNDQ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oCmluZGV4IDkzNjBlMjIuLjRjZjM4ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9vY3Rlb24tZXRoZXJuZXQuaApAQCAtNTgsNyArNTgsNyBAQAogCS8qIExhc3QgbmVnb3RpYXRlZCBsaW5rIHN0YXRlICovCiAJdWludDY0X3QgbGlua19pbmZvOwogCS8qIENhbGxlZCBwZXJpb2RpY2FsbHkgdG8gY2hlY2sgbGluayBzdGF0dXMgKi8KLQl2b2lkICgqcG9sbCkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpwb2xsKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCXBvcnRfcGVyaW9kaWNfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcG9ydF93b3JrOwkvKiBtYXkgYmUgdW51c2VkLiAqLwogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqb2Zfbm9kZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmggYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5oCmluZGV4IGUyNjYzYjEuLmFlYzk4OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uaApAQCAtMzcsNyArMzcsNyBAQAogLyogTG9hZCBEZWxheSBMb2NrZWQgTG9vcCAoRExMKSBzZXR0aW5ncyBmb3IgY2xvY2sgZGVsYXkgKi8KICNkZWZpbmUgTUVNX0RMTF9DTE9DS19ERUxBWQkoMTw8MCkKIC8qIE1lbW9yeSBjb250cm9sbGVyIHBvd2VyIGRvd24gZnVuY3Rpb24gKi8KLSNkZWZpbmUgTUVNX1BPV0VSX0RPV04gIAkoMTw8OCkKKyNkZWZpbmUgTUVNX1BPV0VSX0RPV04JCSgxPDw4KQogLyogTWVtb3J5IGNvbnRyb2xsZXIgc29mdHdhcmUgcmVzZXQgKi8KICNkZWZpbmUgTUVNX1NPRlRfUkVTRVQJCSgxPDwwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296Y2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemNkZXYuYwppbmRleCA1ZGU1OTgxLi4xMGMwYTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296Y2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pjZGV2LmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCXBkID0gb3pfcGRfZmluZChhZGRyKTsKIAlpZiAocGQpIHsKIAkJc3Bpbl9sb2NrX2JoKCZnX2NkZXYubG9jayk7Ci0JCW1lbWNweShnX2NkZXYuYWN0aXZlX2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KGdfY2Rldi5hY3RpdmVfYWRkciwgYWRkcik7CiAJCW9sZF9wZCA9IGdfY2Rldi5hY3RpdmVfcGQ7CiAJCWdfY2Rldi5hY3RpdmVfcGQgPSBwZDsKIAkJc3Bpbl91bmxvY2tfYmgoJmdfY2Rldi5sb2NrKTsKQEAgLTI4Myw3ICsyODMsNyBAQAogCQkJdTggYWRkcltFVEhfQUxFTl07CiAJCQlvel9kYmcoT04sICJPWl9JT0NUTF9HRVRfQUNUSVZFX1BEXG4iKTsKIAkJCXNwaW5fbG9ja19iaCgmZ19jZGV2LmxvY2spOwotCQkJbWVtY3B5KGFkZHIsIGdfY2Rldi5hY3RpdmVfYWRkciwgRVRIX0FMRU4pOworCQkJZXRoZXJfYWRkcl9jb3B5KGFkZHIsIGdfY2Rldi5hY3RpdmVfYWRkcik7CiAJCQlzcGluX3VubG9ja19iaCgmZ19jZGV2LmxvY2spOwogCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIGFkZHIsIEVUSF9BTEVOKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3poY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3poY2QuYwppbmRleCBlZmFmMjZmLi5iM2Q0MDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296aGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemhjZC5jCkBAIC0zNTQsNyArMzU0LDggQEAKICAqIGRpc2FibGVkLgogICogQ29udGV4dDogc29mdGlycSBvciBwcm9jZXNzCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb3pfdXJiX2xpbmsgKm96X3VuY2FuY2VsX3VyYihzdHJ1Y3Qgb3pfaGNkICpvemhjZCwgc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHN0cnVjdCBvel91cmJfbGluayAqb3pfdW5jYW5jZWxfdXJiKHN0cnVjdCBvel9oY2QgKm96aGNkLAorCQlzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IG96X3VyYl9saW5rICp1cmJsOwogCXN0cnVjdCBsaXN0X2hlYWQgKmU7CkBAIC0xOTg2LDggKzE5ODcsNyBAQAogCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKIAlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OwogCWRlc2MtPmJEZXNjTGVuZ3RoID0gOTsKLQlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gKF9fZm9yY2UgX191MTYpCi0JCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSk7CisJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IChfX2ZvcmNlIF9fdTE2KWNwdV90b19sZTE2KDB4MDAwMSk7CiAJZGVzYy0+Yk5iclBvcnRzID0gT1pfTkJfUE9SVFM7CiB9CiAKQEAgLTIxODEsNyArMjE4MSw3IEBACiAJCWJyZWFrOwogCWNhc2UgR2V0SHViU3RhdHVzOgogCQlvel9kYmcoSFVCLCAiR2V0SHViU3RhdHVzOiByZXFfdHlwZSA9IDB4JXhcbiIsIHJlcV90eXBlKTsKLQkJcHV0X3VuYWxpZ25lZChfX2NvbnN0YW50X2NwdV90b19sZTMyKDApLCAoX19sZTMyICopYnVmKTsKKwkJcHV0X3VuYWxpZ25lZChjcHVfdG9fbGUzMigwKSwgKF9fbGUzMiAqKWJ1Zik7CiAJCWJyZWFrOwogCWNhc2UgR2V0UG9ydFN0YXR1czoKIAkJZXJyID0gb3pfZ2V0X3BvcnRfc3RhdHVzKGhjZCwgd2luZGV4LCBidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuYwppbmRleCA3NDM2OTUwLi4xMGYxYjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgIm96ZGJnLmgiCiAjaW5jbHVkZSAib3pwcm90b2NvbC5oIgpAQCAtMTczLDcgKzE3NCw3IEBACiAJCXBkLT5sYXN0X3J4X3BrdF9udW0gPSAweGZmZmZmZmZmOwogCQlvel9wZF9zZXRfc3RhdGUocGQsIE9aX1BEX1NfSURMRSk7CiAJCXBkLT5tYXhfdHhfc2l6ZSA9IE9aX01BWF9UWF9TSVpFOwotCQltZW1jcHkocGQtPm1hY19hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkocGQtPm1hY19hZGRyLCBtYWNfYWRkcik7CiAJCWlmICgwICE9IG96X2VsdF9idWZfaW5pdCgmcGQtPmVsdF9idWZmKSkgewogCQkJa2ZyZWUocGQpOwogCQkJcGQgPSBOVUxMOwpAQCAtMjg0LDExICsyODUsMTEgQEAKIAkJCQkJICBhaS0+YXBwX2lkKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCW96X3BvbGxpbmdfbG9ja19iaCgpOworCQkJc3Bpbl9sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCQlwZC0+dG90YWxfYXBwcyB8PSAoMTw8YWktPmFwcF9pZCk7CiAJCQlpZiAocmVzdW1lKQogCQkJCXBkLT5wYXVzZWRfYXBwcyAmPSB+KDE8PGFpLT5hcHBfaWQpOwotCQkJb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCX0KIAl9CiAJcmV0dXJuIHJjOwpAQCAtMzA0LDE0ICszMDUsMTQgQEAKIAlvel9wZF9kYmcocGQsIE9OLCAiJXM6ICgweCV4KSBwYXVzZSglZClcbiIsIF9fZnVuY19fLCBhcHBzLCBwYXVzZSk7CiAJZm9yIChhaSA9IGdfYXBwX2lmOyBhaSA8ICZnX2FwcF9pZltPWl9BUFBJRF9NQVhdOyBhaSsrKSB7CiAJCWlmIChhcHBzICYgKDE8PGFpLT5hcHBfaWQpKSB7Ci0JCQlvel9wb2xsaW5nX2xvY2tfYmgoKTsKKwkJCXNwaW5fbG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQkJaWYgKHBhdXNlKSB7CiAJCQkJcGQtPnBhdXNlZF9hcHBzIHw9ICgxPDxhaS0+YXBwX2lkKTsKIAkJCX0gZWxzZSB7CiAJCQkJcGQtPnRvdGFsX2FwcHMgJj0gfigxPDxhaS0+YXBwX2lkKTsKIAkJCQlwZC0+cGF1c2VkX2FwcHMgJj0gfigxPDxhaS0+YXBwX2lkKTsKIAkJCX0KLQkJCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJCQlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQkJYWktPnN0b3AocGQsIHBhdXNlKTsKIAkJfQogCX0KQEAgLTM0OSwxNyArMzUwLDE3IEBACiAKIAlvel9kYmcoT04sICJvel9wZF9zdG9wKCkgU3RhdGUgPSAweCV4XG4iLCBwZC0+c3RhdGUpOwogCW96X3BkX2luZGljYXRlX2ZhcmV3ZWxscyhwZCk7Ci0Jb3pfcG9sbGluZ19sb2NrX2JoKCk7CisJc3Bpbl9sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJc3RvcF9hcHBzID0gcGQtPnRvdGFsX2FwcHM7CiAJcGQtPnRvdGFsX2FwcHMgPSAwOwogCXBkLT5wYXVzZWRfYXBwcyA9IDA7Ci0Jb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCW96X3NlcnZpY2VzX3N0b3AocGQsIHN0b3BfYXBwcywgMCk7Ci0Jb3pfcG9sbGluZ19sb2NrX2JoKCk7CisJc3Bpbl9sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJb3pfcGRfc2V0X3N0YXRlKHBkLCBPWl9QRF9TX1NUT1BQRUQpOwogCS8qIFJlbW92ZSBmcm9tIFBEIGxpc3QuKi8KIAlsaXN0X2RlbCgmcGQtPmxpbmspOwotCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAlvel9kYmcoT04sICJwZCByZWYgY291bnQgPSAlZFxuIiwgYXRvbWljX3JlYWQoJnBkLT5yZWZfY291bnQpKTsKIAlvel9wZF9wdXQocGQpOwogfQpAQCAtMzcyLDkgKzM3Myw5IEBACiAJaW50IGRvX3N0b3AgPSAwOwogCXUxNiBzdG9wX2FwcHM7CiAKLQlvel9wb2xsaW5nX2xvY2tfYmgoKTsKKwlzcGluX2xvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAlpZiAocGQtPnN0YXRlICYgKE9aX1BEX1NfU0xFRVAgfCBPWl9QRF9TX1NUT1BQRUQpKSB7Ci0JCW96X3BvbGxpbmdfdW5sb2NrX2JoKCk7CisJCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAocGQtPmtlZXBfYWxpdmUgJiYgcGQtPnNlc3Npb25faWQpCkBAIC0zODMsNyArMzg0LDcgQEAKIAkJZG9fc3RvcCA9IDE7CiAKIAlzdG9wX2FwcHMgPSBwZC0+dG90YWxfYXBwczsKLQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJaWYgKGRvX3N0b3ApIHsKIAkJb3pfcGRfc3RvcChwZCk7CiAJfSBlbHNlIHsKQEAgLTk5OSwxNSArMTAwMCwxNSBAQAogCWNvbnN0IHN0cnVjdCBvel9hcHBfaWYgKmFpID0gJmdfYXBwX2lmW09aX0FQUElEX1VTQi0xXTsKIAogCXdoaWxlICgxKSB7Ci0JCW96X3BvbGxpbmdfbG9ja19iaCgpOworCQlzcGluX2xvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKIAkJaWYgKGxpc3RfZW1wdHkoJnBkLT5mYXJld2VsbF9saXN0KSkgewotCQkJb3pfcG9sbGluZ191bmxvY2tfYmgoKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZnX3BvbGxpbmdfbG9jayk7CiAJCQlicmVhazsKIAkJfQogCQlmID0gbGlzdF9maXJzdF9lbnRyeSgmcGQtPmZhcmV3ZWxsX2xpc3QsCiAJCQkJc3RydWN0IG96X2ZhcmV3ZWxsLCBsaW5rKTsKIAkJbGlzdF9kZWwoJmYtPmxpbmspOwotCQlvel9wb2xsaW5nX3VubG9ja19iaCgpOworCQlzcGluX3VubG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwogCQlpZiAoYWktPmZhcmV3ZWxsKQogCQkJYWktPmZhcmV3ZWxsKHBkLCBmLT5lcF9udW0sIGYtPnJlcG9ydCwgZi0+bGVuKTsKIAkJa2ZyZWUoZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuaCBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5oCmluZGV4IDEyYzcxMjkuLmFkNWZlN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5oCkBAIC0yMiw2ICsyMiwxMSBAQAogI2RlZmluZSBPWl9USU1FUl9IRUFSVEJFQVQJMgogI2RlZmluZSBPWl9USU1FUl9TVE9QCQkzCiAKKy8qCisgKkV4dGVybmFsIHNwaW5sb2NrIHZhcmlhYmxlCisgKi8KK2V4dGVybiBzcGlubG9ja190IGdfcG9sbGluZ19sb2NrOworCiAvKiBEYXRhIHN0cnVjdHVyZSB0aGF0IGhvbGQgaW5mb3JtYXRpb24gb24gYSBmcmFtZSBmb3IgdHJhbnNtaXNzb24uIFRoaXMgaXMKICAqIGJ1aWx0IHdoZW4gdGhlIGZyYW1lIGlzIGZpcnN0IHRyYW5zbWl0dGVkIGFuZCBpcyB1c2VkIHRvIHJlYnVpbGQgdGhlIGZyYW1lCiAgKiBpZiBhIHJlLXRyYW5zbWlzc2lvbiBpcyByZXF1aXJlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5jIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMKaW5kZXggNWQ5NjVjZi4uZjA5YWNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMKQEAgLTM4LDkgKzM4LDEzIEBACiB9OwogCiAvKgorICogRXh0ZXJuYWwgdmFyaWFibGUKKyAqLworCitERUZJTkVfU1BJTkxPQ0soZ19wb2xsaW5nX2xvY2spOworLyoKICAqIFN0YXRpYyBleHRlcm5hbCB2YXJpYWJsZXMuCiAgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ19wb2xsaW5nX2xvY2spOwogc3RhdGljIExJU1RfSEVBRChnX3BkX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChnX2JpbmRpbmcpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhnX2JpbmRpbmdfbG9jayk7CkBAIC02NjQsMzIgKzY2OCwyNiBAQAogewogCXN0cnVjdCBvel9iaW5kaW5nICpiaW5kaW5nOwogCi0JYmluZGluZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvel9iaW5kaW5nKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJpbmRpbmcpIHsKLQkJYmluZGluZy0+cHR5cGUudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoT1pfRVRIRVJUWVBFKTsKLQkJYmluZGluZy0+cHR5cGUuZnVuYyA9IG96X3BrdF9yZWN2OwotCQlpZiAobmV0X2RldiAmJiAqbmV0X2RldikgewotCQkJbWVtY3B5KGJpbmRpbmctPm5hbWUsIG5ldF9kZXYsIE9aX01BWF9CSU5ESU5HX0xFTik7Ci0JCQlvel9kYmcoT04sICJBZGRpbmcgYmluZGluZzogJXNcbiIsIG5ldF9kZXYpOwotCQkJYmluZGluZy0+cHR5cGUuZGV2ID0KLQkJCQlkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBuZXRfZGV2KTsKLQkJCWlmIChiaW5kaW5nLT5wdHlwZS5kZXYgPT0gTlVMTCkgewotCQkJCW96X2RiZyhPTiwgIk5ldGRldiAlcyBub3QgZm91bmRcbiIsIG5ldF9kZXYpOwotCQkJCWtmcmVlKGJpbmRpbmcpOwotCQkJCWJpbmRpbmcgPSBOVUxMOwotCQkJfQotCQl9IGVsc2UgewotCQkJb3pfZGJnKE9OLCAiQmluZGluZyB0byBhbGwgbmV0Y2FyZHNcbiIpOwotCQkJbWVtc2V0KGJpbmRpbmctPm5hbWUsIDAsIE9aX01BWF9CSU5ESU5HX0xFTik7Ci0JCQliaW5kaW5nLT5wdHlwZS5kZXYgPSBOVUxMOwotCQl9Ci0JCWlmIChiaW5kaW5nKSB7Ci0JCQlkZXZfYWRkX3BhY2soJmJpbmRpbmctPnB0eXBlKTsKLQkJCXNwaW5fbG9ja19iaCgmZ19iaW5kaW5nX2xvY2spOwotCQkJbGlzdF9hZGRfdGFpbCgmYmluZGluZy0+bGluaywgJmdfYmluZGluZyk7Ci0JCQlzcGluX3VubG9ja19iaCgmZ19iaW5kaW5nX2xvY2spOworCWJpbmRpbmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3pfYmluZGluZyksIEdGUF9LRVJORUwpOworCWlmICghYmluZGluZykKKwkJcmV0dXJuOworCisJYmluZGluZy0+cHR5cGUudHlwZSA9IGh0b25zKE9aX0VUSEVSVFlQRSk7CisJYmluZGluZy0+cHR5cGUuZnVuYyA9IG96X3BrdF9yZWN2OworCWlmIChuZXRfZGV2ICYmICpuZXRfZGV2KSB7CisJCW1lbWNweShiaW5kaW5nLT5uYW1lLCBuZXRfZGV2LCBPWl9NQVhfQklORElOR19MRU4pOworCQlvel9kYmcoT04sICJBZGRpbmcgYmluZGluZzogJXNcbiIsIG5ldF9kZXYpOworCQliaW5kaW5nLT5wdHlwZS5kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBuZXRfZGV2KTsKKwkJaWYgKGJpbmRpbmctPnB0eXBlLmRldiA9PSBOVUxMKSB7CisJCQlvel9kYmcoT04sICJOZXRkZXYgJXMgbm90IGZvdW5kXG4iLCBuZXRfZGV2KTsKKwkJCWtmcmVlKGJpbmRpbmcpOworCQkJcmV0dXJuOwogCQl9CiAJfQorCWRldl9hZGRfcGFjaygmYmluZGluZy0+cHR5cGUpOworCXNwaW5fbG9ja19iaCgmZ19iaW5kaW5nX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmJpbmRpbmctPmxpbmssICZnX2JpbmRpbmcpOworCXNwaW5fdW5sb2NrX2JoKCZnX2JpbmRpbmdfbG9jayk7CiB9CiAKIC8qCkBAIC04MDAsMTIgKzc5OCwzIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi12b2lkIG96X3BvbGxpbmdfbG9ja19iaCh2b2lkKQotewotCXNwaW5fbG9ja19iaCgmZ19wb2xsaW5nX2xvY2spOwotfQotCi12b2lkIG96X3BvbGxpbmdfdW5sb2NrX2JoKHZvaWQpCi17Ci0Jc3Bpbl91bmxvY2tfYmgoJmdfcG9sbGluZ19sb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5oIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmgKaW5kZXggMGM0OWM4YS4uY2IzOGUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmgKQEAgLTU5LDggKzU5LDYgQEAKIHZvaWQgb3pfdGltZXJfYWRkKHN0cnVjdCBvel9wZCAqcGQsIGludCB0eXBlLCB1bnNpZ25lZCBsb25nIGR1ZV90aW1lKTsKIHZvaWQgb3pfdGltZXJfZGVsZXRlKHN0cnVjdCBvel9wZCAqcGQsIGludCB0eXBlKTsKIHZvaWQgb3pfcGRfcmVxdWVzdF9oZWFydGJlYXQoc3RydWN0IG96X3BkICpwZCk7Ci12b2lkIG96X3BvbGxpbmdfbG9ja19iaCh2b2lkKTsKLXZvaWQgb3pfcG9sbGluZ191bmxvY2tfYmgodm9pZCk7CiB2b2lkIG96X3BkX2hlYXJ0YmVhdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiB2b2lkIG96X3BkX3RpbWVvdXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpOwogZW51bSBocnRpbWVyX3Jlc3RhcnQgb3pfcGRfaGVhcnRiZWF0X2V2ZW50KHN0cnVjdCBocnRpbWVyICp0aW1lcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG9jb2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90b2NvbC5oCmluZGV4IDE3YjA5YjkuLjliYmIxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90b2NvbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90b2NvbC5oCkBAIC0xOTIsNyArMTkyLDcgQEAKIAl1MTYJc2l6ZTsKIAl1OAlyZXFfdHlwZTsKIAl1OAlkZXNjX3R5cGU7Ci0JdTE2CXdfaW5kZXg7CisJX19sZTE2CXdfaW5kZXg7CiAJdTgJaW5kZXg7CiB9IFBBQ0tFRDsKIApAQCAtMjE5LDggKzIxOSw4IEBACiAJdTgJZWx0X3NlcV9udW07CiAJdTgJdHlwZTsKIAl1OAlyZXFfaWQ7Ci0JdTE2CW9mZnNldDsKLQl1MTYJdG90YWxfc2l6ZTsKKwlfX2xlMTYJb2Zmc2V0OworCV9fbGUxNgl0b3RhbF9zaXplOwogCXU4CXJjb2RlOwogCXU4CWRhdGFbMV07CiB9IFBBQ0tFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JpZi5oIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYmlmLmgKaW5kZXggODUzMTQzOC4uNDI0OWZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYmlmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYmlmLmgKQEAgLTIzLDcgKzIzLDcgQEAKIGludCBvel91c2JfY29udHJvbF9yZXEodm9pZCAqaHBkLCB1OCByZXFfaWQsIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwLAogCQljb25zdCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuKTsKIGludCBvel91c2JfZ2V0X2Rlc2NfcmVxKHZvaWQgKmhwZCwgdTggcmVxX2lkLCB1OCByZXFfdHlwZSwgdTggZGVzY190eXBlLAotCXU4IGluZGV4LCB1MTYgd2luZGV4LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKTsKKwl1OCBpbmRleCwgX19sZTE2IHdpbmRleCwgaW50IG9mZnNldCwgaW50IGxlbik7CiBpbnQgb3pfdXNiX3NlbmRfaXNvYyh2b2lkICpocGQsIHU4IGVwX251bSwgc3RydWN0IHVyYiAqdXJiKTsKIHZvaWQgb3pfdXNiX3JlcXVlc3RfaGVhcnRiZWF0KHZvaWQgKmhwZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JzdmMxLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296dXNic3ZjMS5jCmluZGV4IDYxN2Y1MWMuLmYzMmQwMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3p1c2JzdmMxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venVzYnN2YzEuYwpAQCAtNTQsNyArNTQsNyBAQAogICogQ29udGV4dDogc29mdGlycQogICovCiBpbnQgb3pfdXNiX2dldF9kZXNjX3JlcSh2b2lkICpocGQsIHU4IHJlcV9pZCwgdTggcmVxX3R5cGUsIHU4IGRlc2NfdHlwZSwKLQl1OCBpbmRleCwgdTE2IHdpbmRleCwgaW50IG9mZnNldCwgaW50IGxlbikKKwl1OCBpbmRleCwgX19sZTE2IHdpbmRleCwgaW50IG9mZnNldCwgaW50IGxlbikKIHsKIAlzdHJ1Y3Qgb3pfdXNiX2N0eCAqdXNiX2N0eCA9IChzdHJ1Y3Qgb3pfdXNiX2N0eCAqKWhwZDsKIAlzdHJ1Y3Qgb3pfcGQgKnBkID0gdXNiX2N0eC0+cGQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCmluZGV4IGVjNGIxZmQuLjA4ZjlhNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCkBAIC0xNzEsOCArMTcxLDggQEAKIAogCXVuaW9uIHsKIAkJc3RydWN0IHsJLyogdmFsaWQgd2hlbiB0eXBlID09IElOUFVUX1RZUEVfU1REICovCi0JCQl2b2lkICgqcHJlc3NfZmN0KSAoaW50KTsKLQkJCXZvaWQgKCpyZWxlYXNlX2ZjdCkgKGludCk7CisJCQl2b2lkICgqcHJlc3NfZmN0KShpbnQpOworCQkJdm9pZCAoKnJlbGVhc2VfZmN0KShpbnQpOwogCQkJaW50IHByZXNzX2RhdGE7CiAJCQlpbnQgcmVsZWFzZV9kYXRhOwogCQl9IHN0ZDsKQEAgLTQxNyw5ICs0MTcsOSBAQAogc3RhdGljIGNoYXIgbGNkX2xlZnRfc2hpZnQ7CiBzdGF0aWMgY2hhciBpbml0X2luX3Byb2dyZXNzOwogCi1zdGF0aWMgdm9pZCAoKmxjZF93cml0ZV9jbWQpIChpbnQpOwotc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfZGF0YSkgKGludCk7Ci1zdGF0aWMgdm9pZCAoKmxjZF9jbGVhcl9mYXN0KSAodm9pZCk7CitzdGF0aWMgdm9pZCAoKmxjZF93cml0ZV9jbWQpKGludCk7CitzdGF0aWMgdm9pZCAoKmxjZF93cml0ZV9kYXRhKShpbnQpOworc3RhdGljIHZvaWQgKCpsY2RfY2xlYXJfZmFzdCkodm9pZCk7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHBydF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzY2FuX3RpbWVyOwpAQCAtNDU3LDE0ICs0NTcsMTIgQEAKIHN0YXRpYyBpbnQgbGNkX3R5cGUgPSAtMTsKIG1vZHVsZV9wYXJhbShsY2RfdHlwZSwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX3R5cGUsCi0JCSAiTENEIHR5cGU6IDA9bm9uZSwgMT1vbGQgLy8sIDI9c2VyaWFsIGtzMDA3NCwgIgotCQkgIjM9aGFudHJvbml4IC8vLCA0PW5leGNvbSAvLywgNT1jb21waWxlZC1pbiIpOworCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9b2xkIC8vLCAyPXNlcmlhbCBrczAwNzQsIDM9aGFudHJvbml4IC8vLCA0PW5leGNvbSAvLywgNT1jb21waWxlZC1pbiIpOwogCiBzdGF0aWMgaW50IGxjZF9wcm90byA9IC0xOwogbW9kdWxlX3BhcmFtKGxjZF9wcm90bywgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX3Byb3RvLAotCQkiTENEIGNvbW11bmljYXRpb246IDA9cGFyYWxsZWwgKC8vKSwgMT1zZXJpYWwsIgotCQkiMj1USSBMQ0QgSW50ZXJmYWNlIik7CisJCSJMQ0QgY29tbXVuaWNhdGlvbjogMD1wYXJhbGxlbCAoLy8pLCAxPXNlcmlhbCwgMj1USSBMQ0QgSW50ZXJmYWNlIik7CiAKIHN0YXRpYyBpbnQgbGNkX2NoYXJzZXQgPSAtMTsKIG1vZHVsZV9wYXJhbShsY2RfY2hhcnNldCwgaW50LCAwMDAwKTsKQEAgLTQ3Myw4ICs0NzEsNyBAQAogc3RhdGljIGludCBrZXlwYWRfdHlwZSA9IC0xOwogbW9kdWxlX3BhcmFtKGtleXBhZF90eXBlLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhrZXlwYWRfdHlwZSwKLQkJICJLZXlwYWQgdHlwZTogMD1ub25lLCAxPW9sZCA2IGtleXMsIDI9bmV3IDYrMSBrZXlzLCAiCi0JCSAiMz1uZXhjb20gNCBrZXlzIik7CisJCSAiS2V5cGFkIHR5cGU6IDA9bm9uZSwgMT1vbGQgNiBrZXlzLCAyPW5ldyA2KzEga2V5cywgMz1uZXhjb20gNCBrZXlzIik7CiAKIHN0YXRpYyBpbnQgcHJvZmlsZSA9IERFRkFVTFRfUFJPRklMRTsKIG1vZHVsZV9wYXJhbShwcm9maWxlLCBpbnQsIDAwMDApOwpAQCAtNDk0LDM4ICs0OTEsMzIgQEAKIHN0YXRpYyBpbnQgbGNkX2VfcGluICA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9lX3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX2VfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ0UnIHNpZ25hbCwgIgotCQkgIndpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnRScgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOwogCiBzdGF0aWMgaW50IGxjZF9yc19waW4gPSBQSU5fTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfcnNfcGluLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhsY2RfcnNfcGluLAotCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JTJyBzaWduYWwsICIKLQkJICJ3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JTJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX3J3X3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9yd19waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9yd19waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlcnIHNpZ25hbCwgIgotCQkgIndpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlcnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKIAogc3RhdGljIGludCBsY2RfYmxfcGluID0gUElOX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX2JsX3BpbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX2JsX3BpbiwKLQkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEIGJhY2tsaWdodCwgIgotCQkgIndpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCBiYWNrbGlnaHQsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX2RhX3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9kYV9waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9kYV9waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NEQScgIgotCQkgInNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gc2VyaWFsIExDRCAnU0RBJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBpbnQgbGNkX2NsX3BpbiA9IFBJTl9OT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9jbF9waW4sIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF9jbF9waW4sCi0JCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NDTCcgIgotCQkgInNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gc2VyaWFsIExDRCAnU0NMJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICpsY2RfY2hhcl9jb252OwogCkBAIC0yMDE3LDkgKzIwMDgsOSBAQAogICogYmUgYm91bmQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqcGFuZWxfYmluZF9jYWxsYmFjayhjaGFyICpuYW1lLAotCQkJCQkJIHZvaWQgKCpwcmVzc19mY3QpIChpbnQpLAorCQkJCQkJIHZvaWQgKCpwcmVzc19mY3QpKGludCksCiAJCQkJCQkgaW50IHByZXNzX2RhdGEsCi0JCQkJCQkgdm9pZCAoKnJlbGVhc2VfZmN0KSAoaW50KSwKKwkJCQkJCSB2b2lkICgqcmVsZWFzZV9mY3QpKGludCksCiAJCQkJCQkgaW50IHJlbGVhc2VfZGF0YSkKIHsKIAlzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqY2FsbGJhY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01vZHVsZS5zeW12ZXJzIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9Nb2R1bGUuc3ltdmVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9Nb2R1bGUuc3ltdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuaAppbmRleCA2M2Y0ZjNjLi5mOTk2NjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuaApAQCAtMTEsMTMgKzExLDEzIEBACiAJdTggRmlyc3RDaG5sOwogCXU4ICBOdW1DaG5sczsKIAl1OCAgTWF4VHhQb3dlckluRGJtOwotfUNITkxfVFhQT1dFUl9UUklQTEUsICpQQ0hOTF9UWFBPV0VSX1RSSVBMRTsKK30gQ0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOwogCiB0eXBlZGVmIGVudW0gX0RPVDExRF9TVEFURSB7CiAJRE9UMTFEX1NUQVRFX05PTkUgPSAwLAogCURPVDExRF9TVEFURV9MRUFSTkVELAogCURPVDExRF9TVEFURV9ET05FLAotfURPVDExRF9TVEFURTsKK30gRE9UMTFEX1NUQVRFOwogCiB0eXBlZGVmIHN0cnVjdCBfUlRfRE9UMTFEX0lORk8gewogCS8qIERFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDEyRF9JTkZPKTsgKi8KQEAgLTM1LDkgKzM1LDEwIEBACiAJdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAKIAlET1QxMURfU1RBVEUgU3RhdGU7Ci19UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87Ci0jZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQotI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQorfSBSVF9ET1QxMURfSU5GTywgKlBSVF9ET1QxMURfSU5GTzsKKworI2RlZmluZSBlcU1hY0FkZHIoYSwgYikgKCgoYSlbMF0gPT0gKGIpWzBdICYmIChhKVsxXSA9PSAoYilbMV0gJiYgKGEpWzJdID09IChiKVsyXSAmJiAoYSlbM10gPT0gKGIpWzNdICYmIChhKVs0XSA9PSAoYilbNF0gJiYgKGEpWzVdID09IChiKVs1XSkgPyAxOjApCisjZGVmaW5lIGNwTWFjQWRkcihkZXMsIHNyYykgKChkZXMpWzBdID0gKHNyYylbMF0sIChkZXMpWzFdID0gKHNyYylbMV0sIChkZXMpWzJdID0gKHNyYylbMl0sIChkZXMpWzNdID0gKHNyYylbM10sIChkZXMpWzRdID0gKHNyYylbNF0sIChkZXMpWzVdID0gKHNyYylbNV0pCiAjZGVmaW5lIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KSAoKFBSVF9ET1QxMURfSU5GTykoKF9fcEllZWVEZXYpLT5wRG90MTFkSW5mbykpCiAKICNkZWZpbmUgSVNfRE9UMTFEX0VOQUJMRShfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPmJFbmFibGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IDA5ZmZkOWIuLmQxNzYzYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC00NzMsNyArNDczLDcgQEAKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgewotCXUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGZyYW1lX2N0bDsKIAl1MTYgZHVyYXRpb25faWQ7CiAJdTggYWRkcjFbNl07CiAJdTggYWRkcjJbNl07CkBAIC00ODIsNyArNDgyLDcgQEAKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyIHsKLQl1MTYgZnJhbWVfY3RsOworCV9fbGUxNiBmcmFtZV9jdGw7CiAJdTE2IGR1cmF0aW9uX2lkOwogCXU4IGFkZHIxW0VUSF9BTEVOXTsKIAl1OCBhZGRyMltFVEhfQUxFTl07CkBAIC03MDksMTAgKzcwOSwxMCBAQAogCiAjZGVmaW5lIE1BWF9JRV9MRU4JCQkJCQkweEZGIC8vK1lKLDA4MDYyNQogCi10eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9MSVNUewotCXU4CUNoYW5uZWxbTUFYX0NIQU5ORUxfTlVNQkVSICsgMV07Ci0JdTgJTGVuOwotfUNIQU5ORUxfTElTVCwgKlBDSEFOTkVMX0xJU1Q7CitzdHJ1Y3QgcnRsODE4N3NlX2NoYW5uZWxfbGlzdCB7CisJdTgJY2hhbm5lbFtNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxXTsKKwl1OAlsZW47Cit9OwogCiAvL2J5IGFteSBmb3IgcHMKICNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCmluZGV4IGM4MDEzZDMuLjRmZTI1MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwpAQCAtNTgsNyArNTgsNyBAQAogCXU4IHJ4X2IwW0FFU19CTE9DS19MRU5dLCByeF9iW0FFU19CTE9DS19MRU5dLCByeF9hW0FFU19CTE9DS19MRU5dOwogfTsKIAotdm9pZCBpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKIAkJCQljb25zdCB1OCBwdFsxNl0sIHU4IGN0WzE2XSkKIHsKIAljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKCh2b2lkICopdGZtLCBjdCwgcHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKaW5kZXggYzU5MDc5Ni4uNmMxYWNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCkBAIC0xODcsOCArMTg3LDcgQEAKIH0KIAogCi1zdGF0aWMgY29uc3QgdTE2IFNib3hbMjU2XSA9Ci17CitzdGF0aWMgY29uc3QgdTE2IFNib3hbMjU2XSA9IHsKIAkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKIAkweDYwNTAsIDB4MDIwMywgMHhDRUE5LCAweDU2N0QsIDB4RTcxOSwgMHhCNTYyLCAweDRERTYsIDB4RUM5QSwKIAkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKQEAgLTMwNyw3ICszMDYsNyBAQAogCWludCBsZW47CiAJdTggICpwb3M7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKLQl1OCByYzRrZXlbMTZdLCppY3Y7CisJdTggcmM0a2V5WzE2XSwgKmljdjsKIAl1MzIgY3JjOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIAlpbnQgcmV0OwpAQCAtMzQ4LDcgKzM0Nyw3IEBACiAJaWN2WzNdID0gY3JjID4+IDI0OwogCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRrZXktPnR4X3RmbV9hcmM0LCByYzRrZXksIDE2KTsKIAlzZ19pbml0X29uZSgmc2csIHBvcywgbGVuICsgNCk7Ci0JcmV0PSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKKwlyZXQgPSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKIAogCXRrZXktPnR4X2l2MTYrKzsKIAlpZiAodGtleS0+dHhfaXYxNiA9PSAwKSB7CkBAIC01MzcsOSArNTM2LDkgQEAKIAogCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnR4X2hkcik7CiAKLQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCWlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkKIAkJdGtleS0+dHhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKLQl9CisKIAlwb3MgPSBza2JfcHV0KHNrYiwgOCk7CiAKIAlpZiAobWljaGFlbF9taWModGtleS0+dHhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMTZdLCB0a2V5LT50eF9oZHIsCkBAIC01ODMsOSArNTgyLDggQEAKIAkJcmV0dXJuIC0xOwogCiAJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+cnhfaGRyKTsKLQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCWlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkKIAkJdGtleS0+cnhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKLQl9CiAKIAlpZiAobWljaGFlbF9taWModGtleS0+cnhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMjRdLCB0a2V5LT5yeF9oZHIsCiAJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBtaWMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCmluZGV4IGYxMTRmOWEuLmYyNTM2NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKQEAgLTExLDcgKzExLDYgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCi0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CkBAIC0yOCw4ICsyNyw2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IFdFUCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0KLQogc3RydWN0IHByaXNtMl93ZXBfZGF0YSB7CiAJdTMyIGl2OwogI2RlZmluZSBXRVBfS0VZX0xFTiAxMwpAQCAtNDAsNyArMzcsNiBAQAogCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpyeF90Zm07CiB9OwogCi0KIHN0YXRpYyB2b2lkICpwcmlzbTJfd2VwX2luaXQoaW50IGtleWlkeCkKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpwcml2OwpAQCAtNzksNyArNzUsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0KIHN0YXRpYyB2b2lkIHByaXNtMl93ZXBfZGVpbml0KHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqX3ByaXYgPSBwcml2OwpAQCAtOTQsNyArODksNiBAQAogCWtmcmVlKHByaXYpOwogfQogCi0KIC8qIFBlcmZvcm0gV0VQIGVuY3J5cHRpb24gb24gZ2l2ZW4gc2tiIHRoYXQgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgb2YgaGVhZHJvb20KICAqIGZvciBJViBhbmQgNCBieXRlcyBvZiB0YWlscm9vbSBmb3IgSUNWLiBCb3RoIElWIGFuZCBJQ1Ygd2lsbCBiZSB0cmFuc21pdHRlZCwKICAqIHNvIHRoZSBwYXlsb2FkIGxlbmd0aCBpbmNyZWFzZXMgd2l0aCA4IGJ5dGVzLgpAQCAtMTU3LDcgKzE1MSw2IEBACiAJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOwogfQogCi0KIC8qIFBlcmZvcm0gV0VQIGRlY3J5cHRpb24gb24gZ2l2ZW4gYnVmZmVyLiBCdWZmZXIgaW5jbHVkZXMgd2hvbGUgV0VQIHBhcnQgb2YKICAqIHRoZSBmcmFtZTogSVYgKDQgYnl0ZXMpLCBlbmNyeXB0ZWQgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVAgaGVhZGVyKSwKICAqIElDViAoNCBieXRlcykuIGxlbiBpbmNsdWRlcyBib3RoIElWIGFuZCBJQ1YuCkBAIC0yMTksNyArMjEyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHByaXNtMl93ZXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKQEAgLTIzMyw3ICsyMjUsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgcHJpc20yX3dlcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OwpAQCAtMjQ2LDcgKzIzNyw2IEBACiAJcmV0dXJuIHdlcC0+a2V5X2xlbjsKIH0KIAotCiBzdGF0aWMgY2hhciAqcHJpc20yX3dlcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CkBAIC0yNTUsNyArMjQ1LDYgQEAKIAlyZXR1cm4gcDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF93ZXAgPSB7CiAJLm5hbWUJCQk9ICJXRVAiLAogCS5pbml0CQkJPSBwcmlzbTJfd2VwX2luaXQsCkBAIC0yNzIsMjEgKzI2MSwxNyBAQAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiB9OwogCi0KIGludCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCkKIHsKIAlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKQogewotLy8JcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IGMyNzM5MmQuLjAzZWIxNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMTMsNyArMTMsNiBAQAogICogcmVsZWFzZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLQogI2luY2x1ZGUgImllZWU4MDIxMS5oIgogCiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CkBAIC0yNCwxNCArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKICNpbmNsdWRlICJkb3QxMWQuaCIKLXU4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKLQl7MHgwMCwgMHgwRiwgMHhBQywgMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZAotCXsweDAwLCAweDBGLCAweEFDLCAweDAxfSwgLy9XRVAtNDAgICAgICAgICAvL1JTTkEgZGVmYXVsdAotCXsweDAwLCAweDBGLCAweEFDLCAweDAyfSwgLy9US0lQICAgICAgICAgICAvL05PTkUJCS8ve3VzZWQganVzdCBhcyBkZWZhdWx0fQotCXsweDAwLCAweDBGLCAweEFDLCAweDAzfSwgLy9XUkFQLWhpc3RvcmljYWwKLQl7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH0sIC8vQ0NNUAotCXsweDAwLCAweDBGLCAweEFDLCAweDA1fSwgLy9XRVAtMTA0Ci19OwogCiBzaG9ydCBpZWVlODAyMTFfaXNfNTRnKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KQogewpAQCAtNjIsMTQgKzUzLDEzIEBACiB9CiAKIC8qIHBsYWNlIHRoZSBNRklFIHJhdGUsIHRhZyB0byB0aGUgbWVtb3J5IChkb3VibGUpIHBvaXNlZC4KLSAqIFRoZW4gaXQgdXBkYXRlcyB0aGUgcG9pbnRlciBzbyB0aGF0Ci0gKiBpdCBwb2ludHMgYWZ0ZXIgdGhlIG5ldyBNRklFIHRhZyBhZGRlZC4KKyAqIFRoZW4gaXQgdXBkYXRlcyB0aGUgcG9pbnRlciBzbyB0aGF0IGl0IHBvaW50cyBhZnRlciB0aGUgbmV3IE1GSUUgdGFnIGFkZGVkLgogICovCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfTUZJRV9CcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKIHsKIAl1OCAqdGFnID0gKnRhZ19wOwogCi0JaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSB7CiAJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFUzsKIAkJKnRhZysrID0gNDsKIAkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CkBAIC04Niw4ICs3Niw3IEBACiB7CiAJdTggKnRhZyA9ICp0YWdfcDsKIAotCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pewotCisJCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgewogCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVNfRVg7CiAJCSp0YWcrKyA9IDg7CiAJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKQEAgLTEwMCwyMiArODksMjAgQEAKIAkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKIAogCX0KLQogCS8qIFdlIG1heSBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gcmF0ZXMgdGhhdCBzcGVjaWZpYyBIVyBtaWdodCBzdXBwb3J0ICovCiAJKnRhZ19wID0gdGFnOwogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKIHsKIAl1OCAqdGFnID0gKnRhZ19wOwogCi0JKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8vMAorCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOyAvKiAwICovCiAJKnRhZysrID0gNzsKIAkqdGFnKysgPSAweDAwOwogCSp0YWcrKyA9IDB4NTA7CiAJKnRhZysrID0gMHhmMjsKLQkqdGFnKysgPSAweDAyOy8vNQorCSp0YWcrKyA9IDB4MDI7IC8qIDUgKi8KIAkqdGFnKysgPSAweDAwOwogCSp0YWcrKyA9IDB4MDE7CiAjaWZkZWYgU1VQUE9SVF9VU1BECkBAIC0xNDgsMzIgKzEzNSwyMyBAQAogc3RhdGljIHZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBuaDsKLQluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKzEpICUgTUdNVF9RVUVVRV9OVU07CisJbmggPSAoaWVlZS0+bWdtdF9xdWV1ZV9oZWFkICsgMSkgJSBNR01UX1FVRVVFX05VTTsKIAotLyoKLSAqIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dCB3ZSBoYXZlIG5ld2VyIGZyYW1lcyB0aGVuCi0gKiBqdXN0IG92ZXJ3cml0ZXMgdGhlIG9sZGVzdC4KLSAqCi0gKiBpZiAobmggPT0gaWVlZS0+bWdtdF9xdWV1ZV90YWlsKQotICoJCXJldHVybiAtMTsKLSAqLwogCWllZWUtPm1nbXRfcXVldWVfaGVhZCA9IG5oOwogCWllZWUtPm1nbXRfcXVldWVfcmluZ1tuaF0gPSBza2I7Ci0KLQkvL3JldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmV0OwogCi0JaWYoaWVlZS0+bWdtdF9xdWV1ZV90YWlsID09IGllZWUtPm1nbXRfcXVldWVfaGVhZCkKKwlpZiAoaWVlZS0+bWdtdF9xdWV1ZV90YWlsID09IGllZWUtPm1nbXRfcXVldWVfaGVhZCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXQgPSBpZWVlLT5tZ210X3F1ZXVlX3JpbmdbaWVlZS0+bWdtdF9xdWV1ZV90YWlsXTsKIAogCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9Ci0JCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwrMSkgJSBNR01UX1FVRVVFX05VTTsKKwkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCArIDEpICUgTUdNVF9RVUVVRV9OVU07CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTgzLDcgKzE2MSw2IEBACiAJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkID0gMDsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCk7CiAKIGlubGluZSB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCkBAIC0xOTEsMjAgKzE2OCwxOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXI9CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXIgPQogCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKIAotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogCS8qIGNhbGxlZCB3aXRoIDJuZCBwYXJhbSAwLCBubyBtZ210IGxvY2sgcmVxdWlyZWQgKi8KLQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsIDApOwogCi0JaWYoc2luZ2xlKXsKLQkJaWYoaWVlZS0+cXVldWVfc3RvcCl7Ci0KLQkJCWVucXVldWVfbWdtdChpZWVlLHNrYik7Ci0JCX1lbHNleworCWlmIChzaW5nbGUpIHsKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApIHsKKwkJCWVucXVldWVfbWdtdChpZWVlLCBza2IpOworCQl9IGVsc2UgewogCQkJaGVhZGVyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdPDw0KTsKIAogCQkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQpAQCAtMjE0LDExICsxODksMTEgQEAKIAogCQkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KIAkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUtPmRldiwgaWVlZS0+YmFzaWNfcmF0ZSk7CiAJCX0KIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0JfWVsc2V7CisJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFncyk7CiAKQEAgLTIzMSwyNCArMjA2LDIwIEBACiAKIAkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KIAkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUtPmRldik7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFncyk7CiAJfQogfQogCi0KIGlubGluZSB2b2lkIHNvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCiAJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXIgPQogCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKIAotCi0JaWYoc2luZ2xlKXsKLQorCWlmIChzaW5nbGUpIHsKIAkJaGVhZGVyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOwogCiAJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKQEAgLTI1OCwxMCArMjI5LDggQEAKIAogCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLwogCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOwotCi0JfWVsc2V7Ci0KKwkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUtPmRldiwgaWVlZS0+YmFzaWNfcmF0ZSk7CisJfSBlbHNlIHsKIAkJaGVhZGVyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOwogCiAJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKQEAgLTI3MSwxMiArMjQwLDEwIEBACiAKIAkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KIAkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOwotCisJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZS0+ZGV2KTsKIAl9Ci0vLwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIH0KLS8vYnkgYW15IGZvciBwb3dlciBzYXZlCisKIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCiBpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCBhc1JzbikKQEAgLTI4OCw3ICsyNTUsNyBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKIAotCWRpc2FzcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lKSk7CisJZGlzYXNzID0gKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lKSk7CiAJZGlzYXNzLT5oZWFkZXIuZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyk7CiAJZGlzYXNzLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOwogCkBAIC0yOTksMjEgKzI2NiwxOSBAQAogCWRpc2Fzcy0+cmVhc29uY29kZSA9IGFzUnNuOwogCXJldHVybiBza2I7CiB9CisKIHZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqYXNTdGEsIHU4IGFzUnNuKQogewotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7Ci0gICAgICAgIHN0cnVjdCBza19idWZmICpza2I7Ci0gICAgICAgIHNrYiA9IGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbixpZWVlLGFzUnNuKTsKLSAgICAgICAgaWYgKHNrYil7Ci0gICAgICAgICAgICAgICAgc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLSAgICAgICAgICAgICAgICAvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwotICAgICAgICB9CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCXN0cnVjdCBza19idWZmICpza2I7CisJc2tiID0gaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoYmVhY29uLCBpZWVlLCBhc1Jzbik7CisJaWYgKHNrYikKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIH0KIAotLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQl1bnNpZ25lZCBpbnQgbGVuLHJhdGVfbGVuOworCXVuc2lnbmVkIGludCBsZW4sIHJhdGVfbGVuOwogCXU4ICp0YWc7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKnJlcTsKQEAgLTMyNyw3NSArMjkyLDQ1IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCi0JcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkpOwogCXJlcS0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOwotCXJlcS0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRTogaXMgdGhpcyBPSyA/CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvKiBGSVhNRTogaXMgdGhpcyBPSyA/ICovCiAKIAltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjEsIDB4ZmYsIEVUSF9BTEVOKTsKIAltZW1jcHkocmVxLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjMsIDB4ZmYsIEVUSF9BTEVOKTsKIAotCXRhZyA9ICh1OCAqKSBza2JfcHV0KHNrYixsZW4rMityYXRlX2xlbik7CisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLCBsZW4gKyAyICsgcmF0ZV9sZW4pOwogCiAJKnRhZysrID0gTUZJRV9UWVBFX1NTSUQ7CiAJKnRhZysrID0gbGVuOwogCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBsZW4pOwogCXRhZyArPSBsZW47Ci0JaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwmdGFnKTsKLQlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCZ0YWcpOworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOwogCiAJcmV0dXJuIHNrYjsKIH0KIAogc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiAKLXZvaWQgZXh0X2llZWU4MDIxMV9zZW5kX2JlYWNvbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JLy91bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOwotCi0JaWYgKHNrYil7Ci0JCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0JCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYmVhY29ucysrOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKLQl9Ci0KLQotCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGJlYWNvbiBzZW5kaW5nIVxuIik7Ci0JaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKLQkJKE1TRUNTKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC01KSk7Ci0KLQkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Ci0JaWYoaWVlZS0+YmVhY29uX3R4aW5nKQotCQlhZGRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7Ci0JLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JLy91bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOwogCi0JaWYgKHNrYil7CisJaWYgKHNrYikgewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2JlYWNvbnMrKzsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCi0JLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gYmVhY29uIHNlbmRpbmchXG4iKTsKIAlpZWVlLT5iZWFjb25fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKwotCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKKwkJKE1TRUNTKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLSA1KSk7CiAKLQkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Ci0JaWYoaWVlZS0+YmVhY29uX3R4aW5nKQorCWlmIChpZWVlLT5iZWFjb25fdHhpbmcpCiAJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKLQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKIH0KIAogCkBAIC00MTUsMTYgKzM1MCwxNSBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVxKGllZWUpOwotCWlmIChza2IpeworCWlmIChza2IpIHsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycSsrOwotCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwogCX0KIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYgKGllZWUtPmFjdGl2ZV9zY2FuICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlEpKXsKKwlpZiAoaWVlZS0+YWN0aXZlX3NjYW4gJiYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUSkpIHsKIAkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7CiAJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOwogCX0KQEAgLTQzOSwxNyArMzczLDE0IEBACiAJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwogCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKLS8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PiBTeW5jIHNjYW5cbiIpOwogCi0Jd2hpbGUoMSkKLQl7Ci0KLQkJZG97CisJd2hpbGUgKDEpIHsKKwkJZG8gewogCQkJY2grKzsKIAkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKIAkJCQlnb3RvIG91dDsgLyogc2NhbiBjb21wbGV0ZWQgKi8KIAotCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2NoXSk7CisJCX0gd2hpbGUgKCFjaGFubmVsX21hcFtjaF0pOwogCQkvKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKIAkJICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCiAJCSAqICAgIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzeW5jcm8gc2NhbiBiZWZvcmUgY29uY2x1ZGUKQEAgLTQ3MywxMDEgKzQwNCw3NCBAQAogCQkJZ290byBvdXQ7CiAKIAkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaCk7Ci0vLwkJcHJpbnRrKCI9PT09PT5jaGFubmVsPSVkICAgIixjaCk7Ci0JCWlmKGNoYW5uZWxfbWFwW2NoXSA9PSAxKQotCQl7Ci0vLwkJCXByaW50aygiPT09PXNlbmQgcHJvYmUgcmVxdWVzdFxuIik7CisJCWlmIChjaGFubmVsX21hcFtjaF0gPT0gMSkKIAkJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOwotCQl9CisKIAkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQogCQkgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KIAkJICovCiAJCWlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKIAkJCWdvdG8gb3V0OwogCi0KIAkJbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7Ci0KIAl9CiBvdXQ6CiAJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwogCXVwKCZpZWVlLT5zY2FuX3NlbSk7Ci0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaW50IGNoOwotICAgICAgICB1bnNpZ25lZCBpbnQgd2F0Y2hfZG9nID0gMDsKKwl1bnNpZ25lZCBpbnQgd2F0Y2hfZG9nID0gMDsKIAl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0gICAgICAgIGRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CiAJY2ggPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKLS8vICAgICAgCWlmKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKQotLy8JewogCi0vLwkJcHJpbnRrKCJzdG9wIHNjYW4gc3luY1xuIik7Ci0vLyAgIAkJZ290byBvdXQ7Ci0vLyAgCX0KLS8vCXByaW50aygiPT09PT09PWhoPT09PT09PT09PT09PT09PmlwcyBzY2FuXG4iKTsKLSAgICAgCXdoaWxlKDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKLSAgICAgICAgICAgICAgICAgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgKiAgICBwZXJmb3JtaW5nIGEgY29tcGxldGUgc3luY3JvIHNjYW4gYmVmb3JlIGNvbmNsdWRlCi0gICAgICAgICAgICAgICAgICogICAgdGhlcmUgYXJlIG5vIGludGVyZXN0aW5nIGNlbGwgYW5kIHRvIGNyZWF0ZSBhCi0gICAgICAgICAgICAgICAgICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCi0gICAgICAgICAgICAgICAgICogICAgSUVFRTgwMjExX05PTElOSyB1bnRpbCB3ZSBmb3VuZCBhbiBpbnRlcmVzdGluZyBjZWxsLgotICAgICAgICAgICAgICAgICAqICAgIElmIHNvIHRoZSBpZWVlODAyMV9uZXdfbmV0LCBjYWxsZWQgYnkgdGhlIFJYIHBhdGgKLSAgICAgICAgICAgICAgICAgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAotICAgICAgICAgICAgICAgICAqICAgIHNjYW5uaW5nCi0gICAgICAgICAgICAgICAgICogMi0gV2UgYXJlIGxpbmtlZCBhbmQgdGhlIHJvb3QgdXNlcyBydW4gaXdsaXN0IHNjYW4uCi0gICAgICAgICAgICAgICAgICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKLSAgICAgICAgICAgICAgICAgKiAgICB0aGF0IHdlIGFyZSBzdGlsbCBsb2dpY2FsbHkgbGlua2VkIChub3QgaW50ZXJlc3RlZCBpbgotICAgICAgICAgICAgICAgICAqICAgIG5ldyBuZXR3b3JrIGV2ZW50cywgZGVzcGl0ZSBmb3IgdXBkYXRpbmcgdGhlIG5ldCBsaXN0LAotICAgICAgICAgICAgICAgICAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJpbHkgJ3VubGlua2VkJyBhcyB0aGUgZHJpdmVyIHNoYWxsCi0gICAgICAgICAgICAgICAgICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgotICAgICAgICAgICAgICAgICAqIFNvIHRoZSBvbmx5IHNpdHVhdGlvbiBpbiB3aXRjaCBhcmUgaW50ZXJlc3RlZCBpcyB0byBjaGVjawotICAgICAgICAgICAgICAgICAqIGlmIHRoZSBzdGF0ZSBiZWNvbWUgTElOS0VEIGJlY2F1c2Ugb2YgdGhlICMxIHNpdHVhdGlvbgotICAgICAgICAgICAgICAgICAqLworCXdoaWxlICgxKSB7CisJCS8qIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucworCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKKwkJICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQorCQkgKiAgICB0aGVyZSBhcmUgbm8gaW50ZXJlc3RpbmcgY2VsbCBhbmQgdG8gY3JlYXRlIGEKKwkJICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCisJCSAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KKwkJICogICAgSWYgc28gdGhlIGllZWU4MDIxX25ld19uZXQsIGNhbGxlZCBieSB0aGUgUlggcGF0aAorCQkgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAorCQkgKiAgICBzY2FubmluZworCQkgKiAyLSBXZSBhcmUgbGlua2VkIGFuZCB0aGUgcm9vdCB1c2VzIHJ1biBpd2xpc3Qgc2Nhbi4KKwkJICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKKwkJICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KKwkJICogICAgbmV3IG5ldHdvcmsgZXZlbnRzLCBkZXNwaXRlIGZvciB1cGRhdGluZyB0aGUgbmV0IGxpc3QsCisJCSAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJpbHkgJ3VubGlua2VkJyBhcyB0aGUgZHJpdmVyIHNoYWxsCisJCSAqICAgIG5vdCBmaWx0ZXIgUlggZnJhbWVzIGFuZCB0aGUgY2hhbm5lbCBpcyBjaGFuZ2luZy4KKwkJICogU28gdGhlIG9ubHkgc2l0dWF0aW9uIGluIHdpdGNoIGFyZSBpbnRlcmVzdGVkIGlzIHRvIGNoZWNrCisJCSAqIGlmIHRoZSBzdGF0ZSBiZWNvbWUgTElOS0VEIGJlY2F1c2Ugb2YgdGhlICMxIHNpdHVhdGlvbgorCQkgKi8KIAkJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCi0JCXsKIAkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA+IDApCi0JCXsKKworCQlpZiAoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID4gMCkKIAkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwotLy8JCQlwcmludGsoIj09PT09PT5jaGFubmVsPSVkICAiLGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQkJfQotCQlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKLQkJewotLy8JCQlwcmludGsoIj09PT1zZW5kIHByb2JlIHJlcXVlc3RcbiIpOworCisJCWlmIChjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKIAkJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOwotICAgICAgICAgICAgICAgIH0KLQkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQotICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gd2FpdCBmb3IgYSBzeW5jcm8gc2NhbiB0byBlbmQuLgotICAgICAgICAgICAgICAgICAqLwotLy8gICAgICAgICAgICAgICAgaWYgKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKQotLy8gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKIAogCQltc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKIAotCQlkb3sKKwkJZG8gewogCQkJaWYgKHdhdGNoX2RvZysrID49IE1BWF9DSEFOTkVMX05VTUJFUikKLQkJLy8JaWYgKCsrd2F0Y2hfZG9nID49IDE1KTsvL01BWF9DSEFOTkVMX05VTUJFUikgIC8vWUosbW9kaWZpZWQsMDgwNjMwCiAJCQkJZ290byBvdXQ7IC8qIHNjYW4gY29tcGxldGVkICovCiAKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSklTUFYX0NIQU5ORUxfTlVNQkVSOwotCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7Ci0gICAgICAgIH0KKwkJfSB3aGlsZSAoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisJfQogb3V0OgotCS8vaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwotICAgCS8vaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaCk7Ci0gICAJLy9pZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGNoOwogCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOwogfQogCkBAIC01NzUsMjkgKzQ3OSwyNCBAQAogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKLQlzdGF0aWMgc2hvcnQgd2F0Y2hkb2cgPSAwOworCXN0YXRpYyBzaG9ydCB3YXRjaGRvZzsKIAl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0vLwlwcmludGsoImllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EgRU5BQkxFX0lQU1xuIik7Ci0vLwlwcmludGsoImluICVzXG4iLF9fZnVuY19fKTsKIAlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CiAKLQlkb3sKKwlkbyB7CiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0KIAkJCShpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpICUgTUFYX0NIQU5ORUxfTlVNQkVSOwogCQlpZiAod2F0Y2hkb2crKyA+IE1BWF9DSEFOTkVMX05VTUJFUikKIAkJCQlnb3RvIG91dDsgLyogbm8gZ29vZCBjaGFucyAqLworCX0gd2hpbGUgKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwogCi0gCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLQotCS8vcHJpbnRrKCJjdXJyZW50X25ldHdvcmsuY2hhbm5lbDolZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwotCWlmIChpZWVlLT5zY2FubmluZyA9PSAwICkKLQl7CisJaWYgKGllZWUtPnNjYW5uaW5nID09IDApIHsKIAkJcHJpbnRrKCJlcnJvciBvdXQsIHNjYW5uaW5nID0gMFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKKwlpZiAoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCiAJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOwogCiAJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLCBJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOwpAQCAtNjA5LDcgKzUwOCw3IEBACiAJaWVlZS0+c2Nhbm5pbmcgPSAwOwogCXVwKCZpZWVlLT5zY2FuX3NlbSk7CiAKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOwogCXJldHVybjsKIH0KQEAgLTYxOCw2MiArNTE3LDUxIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CiAKIAlpZWVlLT5iZWFjb25fdHhpbmcgPSAxOwogCWllZWU4MDIxMV9zZW5kX2JlYWNvbihpZWVlKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfYmVhY29uc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOwogCiAJaWVlZS0+YmVhY29uX3R4aW5nID0gMDsKLSAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmJlYWNvbl90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmJlYWNvbl90aW1lcik7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Ci0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQorCWlmIChpZWVlLT5zdG9wX3NlbmRfYmVhY29ucykKIAkJaWVlZS0+c3RvcF9zZW5kX2JlYWNvbnMoaWVlZS0+ZGV2KTsKIAlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19CRUFDT05TKQogCQlpZWVlODAyMTFfYmVhY29uc19zdG9wKGllZWUpOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMpCisJaWYgKGllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucykKIAkJaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKGllZWUtPmRldik7Ci0JaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19CRUFDT05TKQorCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCiAJCWllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KGllZWUpOwogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLS8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvL2llZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKLQogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKLS8vCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSl7CisJaWYgKGllZWUtPnNjYW5uaW5nID09IDEpIHsKIAkJaWVlZS0+c2Nhbm5pbmcgPSAwOwotCQkvL2RlbF90aW1lcl9zeW5jKCZpZWVlLT5zY2FuX3RpbWVyKTsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKIAl9CiAKLS8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwogfQogCkBAIC02ODgsMzggKzU3NiwyOCBAQAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCiB2b2lkIGllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKLQl7Ci0JCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCi0JCXsKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkgeworCQlpZiAoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKIAkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKLQkJfQogCX0KLQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKXsKLQkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApCi0JCXsKKworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pIHsKKwkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApIHsKIAkJCWllZWUtPnNjYW5uaW5nID0gMTsKLQkJCS8vaWVlZTgwMjExX3NvZnRtYWNfc2NhbihpZWVlKTsKLQkJLy8JcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7Ci0JCS8vY2FyZSB0aGlzLDEyMDMsMjAwNyxieSBsYXdyZW5jZQogI2lmIDEKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwwKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgMCk7CiAjZW5kaWYKIAkJfQogCX1lbHNlCiAJCWllZWUtPnN0YXJ0X3NjYW4oaWVlZS0+ZGV2KTsKLQogfQogCiAvKiBjYWxsZWQgd2l0aCB3eF9zZW0gaGVsZCAqLwogdm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCi0JewotCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQotCQl7CisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpIHsKKwkJaWYgKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCiAJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7Ci0JCX0KIAl9CiAJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwogCkBAIC03MjcsNyArNjA1LDYgQEAKIAkJaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oaWVlZSk7CiAJZWxzZQogCQlpZWVlLT5zY2FuX3N5bmNybyhpZWVlLT5kZXYpOwotCiB9CiAKIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCkBAIC03MzksMTUgKzYxNiwxNyBAQAogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKyBjaGFsbGVuZ2VsZW4pOwogCi0JaWYgKCFza2IpIHJldHVybiBOVUxMOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKIAogCWF1dGggPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKQogCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pKTsKIAogCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgPSBJRUVFODAyMTFfU1RZUEVfQVVUSDsKLQlpZiAoY2hhbGxlbmdlbGVuKSBhdXRoLT5oZWFkZXIuZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1dFUDsKKwlpZiAoY2hhbGxlbmdlbGVuKQorCQlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1dFUDsKIAotCWF1dGgtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDB4MDEzYTsgLy9GSVhNRQorCWF1dGgtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDB4MDEzYTsgLyogRklYTUUgKi8KIAogCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKIAltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CkBAIC03NjEsNyArNjQwLDYgQEAKIAlhdXRoLT5zdGF0dXMgPSBjcHVfdG9fbGUxNihXTEFOX1NUQVRVU19TVUNDRVNTKTsKIAogCXJldHVybiBza2I7Ci0KIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKQEAgLTc3MiwyOSArNjUwLDMwIEBACiAJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uX2J1ZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlbmNyeXB0OwotCWludCBhdGltX2xlbixlcnBfbGVuOwotCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJaW50IGF0aW1fbGVuLCBlcnBfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQ7CiAKIAljaGFyICpzc2lkID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQ7CiAJaW50IHNzaWRfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOwogCWludCByYXRlX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4rMjsKIAlpbnQgcmF0ZV9leF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuOwogCWludCB3cGFfaWVfbGVuID0gaWVlZS0+d3BhX2llX2xlbjsKLQlpZihyYXRlX2V4X2xlbiA+IDApIHJhdGVfZXhfbGVuKz0yOworCWlmIChyYXRlX2V4X2xlbiA+IDApCisJCXJhdGVfZXhfbGVuICs9IDI7CiAKLQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKQorCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKQogCQlhdGltX2xlbiA9IDQ7CiAJZWxzZQogCQlhdGltX2xlbiA9IDA7CiAKLQlpZihpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspKQorCWlmIChpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspKQogCQllcnBfbGVuID0gMzsKIAllbHNlCiAJCWVycF9sZW4gPSAwOwogCiAJYmVhY29uX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSkrCiAJCXNzaWRfbGVuCi0JCSszIC8vY2hhbm5lbAorCQkrMyAvKiBjaGFubmVsICovCiAJCStyYXRlX2xlbgogCQkrcmF0ZV9leF9sZW4KIAkJK2F0aW1fbGVuCkBAIC04MDYsMTkgKzY4NSwxOSBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKIAotCWJlYWNvbl9idWYgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSopIHNrYl9wdXQoc2tiLCBiZWFjb25fc2l6ZSk7CisJYmVhY29uX2J1ZiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYl9wdXQoc2tiLCBiZWFjb25fc2l6ZSk7CiAKLQltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7Ci0JbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOworCW1lbWNweShiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKIAotCWJlYWNvbl9idWYtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUUKKwliZWFjb25fYnVmLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvKiBGSVhNRSAqLwogCWJlYWNvbl9idWYtPmJlYWNvbl9pbnRlcnZhbCA9CiAJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOwogCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgPQogCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKIAotCWlmKGllZWUtPnNob3J0X3Nsb3QgJiYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKQorCWlmIChpZWVlLT5zaG9ydF9zbG90ICYmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSkKIAkJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7CiAKIAljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CkBAIC04MzUsNTEgKzcxNCw1MiBAQAogCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5pZCA9IE1GSUVfVFlQRV9TU0lEOwogCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5sZW4gPSBzc2lkX2xlbjsKIAotCXRhZyA9ICh1OCopIGJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5kYXRhOworCXRhZyA9ICh1OCAqKSBiZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuZGF0YTsKIAogCW1lbWNweSh0YWcsIHNzaWQsIHNzaWRfbGVuKTsKIAogCXRhZyArPSBzc2lkX2xlbjsKIAogCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTOwotCSoodGFnKyspID0gcmF0ZV9sZW4tMjsKLQltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlcyxyYXRlX2xlbi0yKTsKLQl0YWcrPXJhdGVfbGVuLTI7CisJKih0YWcrKykgPSByYXRlX2xlbiAtIDI7CisJbWVtY3B5KHRhZywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzLCByYXRlX2xlbi0yKTsKKwl0YWcgKz0gcmF0ZV9sZW4gLSAyOwogCiAJKih0YWcrKykgPSBNRklFX1RZUEVfRFNfU0VUOwogCSoodGFnKyspID0gMTsKIAkqKHRhZysrKSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOwogCi0JaWYoYXRpbV9sZW4peworCWlmIChhdGltX2xlbikgewogCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9JQlNTX1NFVDsKIAkJKih0YWcrKykgPSAyOwotCQkqKCh1MTYqKSh0YWcpKSA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7Ci0JCXRhZys9MjsKKwkJKigodTE2ICopKHRhZykpID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKKwkJdGFnICs9IDI7CiAJfQogCi0JaWYoZXJwX2xlbil7CisJaWYgKGVycF9sZW4pIHsKIAkJKih0YWcrKykgPSBNRklFX1RZUEVfRVJQOwogCQkqKHRhZysrKSA9IDE7CiAJCSoodGFnKyspID0gMDsKIAl9CiAKLQlpZihyYXRlX2V4X2xlbil7CisJaWYgKHJhdGVfZXhfbGVuKSB7CiAJCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTX0VYOwogCQkqKHRhZysrKSA9IHJhdGVfZXhfbGVuLTI7Ci0JCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4LHJhdGVfZXhfbGVuLTIpOwotCQl0YWcrPXJhdGVfZXhfbGVuLTI7CisJCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCwgcmF0ZV9leF9sZW4tMik7CisJCXRhZyArPSByYXRlX2V4X2xlbiAtIDI7CiAJfQogCi0JaWYgKHdwYV9pZV9sZW4pCi0JewotCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQl7Ly9hcyBXaW5kb3dzIHdpbGwgc2V0IHBhaXJ3aXNlIGtleSBzYW1lIGFzIHRoZSBncm91cCBrZXkgd2hpY2ggaXMgbm90IGFsbG93ZWQgaW4gTGludXgsIHNvIHNldCB0aGlzIGZvciBJT1QgaXNzdWUuIFdCIDIwMDguMDcuMDcKKwlpZiAod3BhX2llX2xlbikJeworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQkvKiBhcyBXaW5kb3dzIHdpbGwgc2V0IHBhaXJ3aXNlIGtleSBzYW1lIGFzIHRoZSBncm91cAorCQkJICoga2V5IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIExpbnV4LCBzbyBzZXQgdGhpcyBmb3IKKwkJCSAqIElPVCBpc3N1ZS4KKwkJCSAqLwogCQkJbWVtY3B5KCZpZWVlLT53cGFfaWVbMTRdLCAmaWVlZS0+d3BhX2llWzhdLCA0KTsKIAkJfQogCiAJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CiAJfQotCiAJc2tiLT5kZXYgPSBpZWVlLT5kZXY7CiAJcmV0dXJuIHNrYjsKIH0KQEAgLTg4OCw5ICs3NjgsOSBAQAogCQkJCQkgICAgdTggKmRlc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1OCogdGFnOworCXU4ICp0YWc7CiAKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQ7CiAJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2M7CiAJc2hvcnQgZW5jcnlwdDsKIApAQCAtOTAzLDM0ICs3ODMsMzYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlhc3NvYyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopCi0JCXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSk7CisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpOwogCiAJYXNzb2MtPmhlYWRlci5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOwotCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOwogCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIzLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAlhc3NvYy0+Y2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgPwogCQlXTEFOX0NBUEFCSUxJVFlfQlNTIDogV0xBTl9DQVBBQklMSVRZX0lCU1MpOwogCi0KLQlpZihpZWVlLT5zaG9ydF9zbG90KQorCWlmIChpZWVlLT5zaG9ydF9zbG90KQogCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7CiAKIAlpZiAoaWVlZS0+aG9zdF9lbmNyeXB0KQogCQljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07Ci0JZWxzZSBjcnlwdCA9IE5VTEw7CisJZWxzZQorCQljcnlwdCA9IE5VTEw7CiAKLQllbmNyeXB0ID0gKCBjcnlwdCAmJiBjcnlwdC0+b3BzKTsKKwllbmNyeXB0ID0gKGNyeXB0ICYmIGNyeXB0LT5vcHMpOwogCiAJaWYgKGVuY3J5cHQpCiAJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKIAogCWFzc29jLT5zdGF0dXMgPSAwOwogCWFzc29jLT5haWQgPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY19pZCk7Ci0JaWYgKGllZWUtPmFzc29jX2lkID09IDB4MjAwNykgaWVlZS0+YXNzb2NfaWQ9MDsKLQllbHNlIGllZWUtPmFzc29jX2lkKys7CisJaWYgKGllZWUtPmFzc29jX2lkID09IDB4MjAwNykKKwkJaWVlZS0+YXNzb2NfaWQgPSAwOworCWVsc2UKKwkJaWVlZS0+YXNzb2NfaWQrKzsKIAotCXRhZyA9ICh1OCopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CiAKIAlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKIAlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKQEAgLTk2MiwyMSArODQ0LDE5IEBACiAJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOwogCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVVUSCk7CiAJcmV0dXJuIHNrYjsKLQotCiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX251bGxfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqIGhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOwogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAogCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCiAJbWVtY3B5KGhkci0+YWRkcjEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOwogCW1lbWNweShoZHItPmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CkBAIC05ODcsODMgKzg2Nyw2NCBAQAogCQkocHdyID8gSUVFRTgwMjExX0ZDVExfUE06MCkpOwogCiAJcmV0dXJuIHNrYjsKLQotCiB9CiAKLQogc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXNzb2NfcmVzcChpZWVlLCBkZXN0KTsKIAotCWlmIChidWYpeworCWlmIChidWYpIHsKIAkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7CiAJfQogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBzLCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2F1dGhfcmVzcChpZWVlLCBzLCBkZXN0KTsKIAotCWlmIChidWYpeworCWlmIChidWYpIHsKIAkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7CiAJfQogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKIHsKLQogCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfcHJvYmVfcmVzcChpZWVlLCBkZXN0KTsKIAogCWlmIChidWYpIHsKIAkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7CiAJfQogfQogCi0KIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCiBpZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqaGRyOwogCXU4ICp0YWc7Ci0JLy9zaG9ydCBpbmZvX2FkZHIgPSAwOwotCS8vaW50IGk7Ci0JLy91MTYgc3VpdGVfY291bnQgPSAwOwotCS8vdTggc3VpdF9zZWxlY3QgPSAwOwogCXVuc2lnbmVkIGludCB3cGFfbGVuID0gYmVhY29uLT53cGFfaWVfbGVuOwotCS8vc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKLQkvL3VuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQkvL3U4ICpidWZmOwotCS8vdTggKnA7CiAjaWYgMQotCS8vIGZvciB0ZXN0aW5nIHB1cnBvc2UKKwkvKiBmb3IgdGVzdGluZyBwdXJwb3NlICovCiAJdW5zaWduZWQgaW50IHJzbl9sZW4gPSBiZWFjb24tPnJzbl9pZV9sZW47Ci0jZWxzZQotCXVuc2lnbmVkIGludCByc25fbGVuID0gYmVhY29uLT5yc25faWVfbGVuIC0gNDsKICNlbmRpZgogCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOwogCXVuc2lnbmVkIGludCB3bW1faW5mb19sZW4gPSBiZWFjb24tPlFvU19FbmFibGU/OTowOwogCXVuc2lnbmVkIGludCB0dXJib19pbmZvX2xlbiA9IGJlYWNvbi0+VHVyYm9fRW5hYmxlPzk6MDsKIAogCXU4ICBlbmNyeV9wcm90byA9IGllZWUtPndwYXhfdHlwZV9ub3RpZnkgJiAweGZmOwotCS8vdTggIHBhaXJ3aXNlX3R5cGUgPSAoaWVlZS0+d3BheF90eXBlX25vdGlmeSA+PiA4KSAmIDB4ZmY7Ci0JLy91OCAgYXV0aGVuX3R5cGUgPSAoaWVlZS0+d3BheF90eXBlX25vdGlmeSA+PiAxNikgJiAweGZmOwogCiAJaW50IGxlbiA9IDA7CiAKLQkvL1swXSBOb3RpZnkgdHlwZSBvZiBlbmNyeXB0aW9uOiBXUEEvV1BBMgotCS8vWzFdIHBhaXIgd2lzZSB0eXBlCi0JLy9bMl0gYXV0aGVuIHR5cGUKLQlpZihpZWVlLT53cGF4X3R5cGVfc2V0KSB7CisJLyogWzBdIE5vdGlmeSB0eXBlIG9mIGVuY3J5cHRpb246IFdQQS9XUEEyCisJICogWzFdIHBhaXIgd2lzZSB0eXBlCisJICogWzJdIGF1dGhlbiB0eXBlCisJICovCisJaWYgKGllZWUtPndwYXhfdHlwZV9zZXQpIHsKIAkJaWYgKElFRUVfUFJPVE9fV1BBID09IGVuY3J5X3Byb3RvKSB7CiAJCQlyc25fbGVuID0gMDsKIAkJfSBlbHNlIGlmIChJRUVFX1BST1RPX1JTTiA9PSBlbmNyeV9wcm90bykgewpAQCAtMTA3MSw4ICs5MzIsOCBAQAogCQl9CiAJfQogCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKwotCQkrIGJlYWNvbi0+c3NpZF9sZW4vL2Vzc2lkIHRhZ2dlZCB2YWwKLQkJKyByYXRlX2xlbi8vcmF0ZXMgdGFnZ2VkIHZhbAorCQkrIGJlYWNvbi0+c3NpZF9sZW4gLyogZXNzaWQgdGFnZ2VkIHZhbCAqLworCQkrIHJhdGVfbGVuIC8qIHJhdGVzIHRhZ2dlZCB2YWwgKi8KIAkJKyB3cGFfbGVuCiAJCSsgcnNuX2xlbgogCQkrIHdtbV9pbmZvX2xlbgpAQCAtMTA4NiwyNCArOTQ3LDIzIEBACiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqKQogCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkpOwogCi0KIAloZHItPmhlYWRlci5mcmFtZV9jb250cm9sID0gSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUTsKLQloZHItPmhlYWRlci5kdXJhdGlvbl9pZD0gMzc7IC8vRklYTUUKKwloZHItPmhlYWRlci5kdXJhdGlvbl9pZCA9IDM3OyAvKiBGSVhNRSAqLwogCW1lbWNweShoZHItPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOwogCW1lbWNweShoZHItPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCW1lbWNweShoZHItPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShpZWVlLT5hcF9tYWNfYWRkciwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOy8vZm9yIEhXIHNlY3VyaXR5LCBKb2huCisJbWVtY3B5KGllZWUtPmFwX21hY19hZGRyLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7IC8qIGZvciBIVyBzZWN1cml0eSAqLwogCiAJaGRyLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX0JTUyk7Ci0JaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICkKKwlpZiAoYmVhY29uLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCiAJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CiAJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKIAkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSk7CiAKLQlpZihpZWVlLT5zaG9ydF9zbG90KQorCWlmIChpZWVlLT5zaG9ydF9zbG90KQogCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOwogCi0JaGRyLT5saXN0ZW5faW50ZXJ2YWwgPSAweGE7IC8vRklYTUUKKwloZHItPmxpc3Rlbl9pbnRlcnZhbCA9IDB4YTsgLyogRklYTUUgKi8KIAogCWhkci0+aW5mb19lbGVtZW50LmlkID0gTUZJRV9UWVBFX1NTSUQ7CiAKQEAgLTExMTYsMjcgKzk3NiwyNiBAQAogCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOwogCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOwogCi0JLy9hZGQgcnNuPT0wIGNvbmRpdGlvbiBmb3IgYXAncyBtaXggc2VjdXJpdHkgbW9kZSh3cGErd3BhMiksIGpvaG4yMDA3LjguOQotCS8vY2hvb3NlIEFFUyBlbmNyeXB0aW9uIGFzIGRlZmF1bHQgYWxnb3JpdGhtIHdoaWxlIHVzaW5nIG1peGVkIG1vZGUKKwkvKiBhZGQgcnNuPT0wIGNvbmRpdGlvbiBmb3IgYXAncyBtaXggc2VjdXJpdHkgbW9kZSh3cGErd3BhMikKKwkgKiBjaG9vc2UgQUVTIGVuY3J5cHRpb24gYXMgZGVmYXVsdCBhbGdvcml0aG0gd2hpbGUgdXNpbmcgbWl4ZWQgbW9kZS4KKwkgKi8KIAotCXRhZyA9IHNrYl9wdXQoc2tiLGllZWUtPndwYV9pZV9sZW4pOwotCW1lbWNweSh0YWcsaWVlZS0+d3BhX2llLGllZWUtPndwYV9pZV9sZW4pOworCXRhZyA9IHNrYl9wdXQoc2tiLCBpZWVlLT53cGFfaWVfbGVuKTsKKwltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOwogCi0JdGFnID0gc2tiX3B1dChza2Isd21tX2luZm9fbGVuKTsKLQlpZih3bW1faW5mb19sZW4pIHsKKwl0YWcgPSBza2JfcHV0KHNrYiwgd21tX2luZm9fbGVuKTsKKwlpZiAod21tX2luZm9fbGVuKQogCSAgaWVlZTgwMjExX1dNTV9JbmZvKGllZWUsICZ0YWcpOwotCX0KLQl0YWcgPSBza2JfcHV0KHNrYix0dXJib19pbmZvX2xlbik7Ci0gICAgICAgIGlmKHR1cmJvX2luZm9fbGVuKSB7Ci0gICAgICAgICAgICAgICAgaWVlZTgwMjExX1RVUkJPX0luZm8oaWVlZSwgJnRhZyk7Ci0gICAgICAgIH0KKworCXRhZyA9IHNrYl9wdXQoc2tiLCB0dXJib19pbmZvX2xlbik7CisJaWYgKHR1cmJvX2luZm9fbGVuKQorCQlpZWVlODAyMTFfVFVSQk9fSW5mbyhpZWVlLCAmdGFnKTsKIAogCXJldHVybiBza2I7CiB9CiAKIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTE0OCwxNyArMTAwNywxNyBAQAogCSAqIEhlcmUgd2Ugd2lsbCBjaGVjayBpZiB0aGVyZSBhcmUgZ29vZCBuZXRzIHRvIGFzc29jaWF0ZQogCSAqIHdpdGgsIHNvIHdlIHJldHJ5IG9yIGp1c3QgZ2V0IGJhY2sgdG8gTk9fTElOSyBhbmQgc2Nhbm5pbmcKIAkgKi8KLQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HKXsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HKSB7CiAJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2F1dGhfcnMrKzsKLQl9ZWxzZXsKKwl9IGVsc2UgewogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXNzb2NpYXRpb24gZmFpbGVkXG4iKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy5ub19hc3NfcnMrKzsKIAl9CiAKIAlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWTsKIAotCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSxJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsIElFRUU4MDIxMV9TT0ZUTUFDX0FTU09DX1JFVFJZX1RJTUUpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogfQpAQCAtMTE2OCw3ICsxMDI3LDYgQEAKIAlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBkZXYpOwogfQogCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwpAQCAtMTE3NiwyNiArMTAzNCwyNCBAQAogCiAJSUVFRTgwMjExX0RFQlVHX01HTVQoIlN0b3BwaW5nIHNjYW5cbiIpOwogCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXV0aF9ycSsrOwotCXNrYj1pZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKGJlYWNvbiwgaWVlZSwgMCk7Ci0JaWYgKCFza2IpewotCisJc2tiID0gaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIDApOworCWlmICghc2tiKSB7CiAJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7Ci0JfQotCWVsc2V7Ci0JCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HIDsKKwl9IGVsc2UgeworCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORzsKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7Ci0JCS8vcHJpbnRrKCItLS1TZW5kaW5nIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RcbiIpOwogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQkvL0JVR09OIHdoZW4geW91IHRyeSB0byBhZGRfdGltZXIgdHdpY2UsIHVzaW5nIG1vZF90aW1lciBtYXkgYmUgYmV0dGVyLCBqb2huMDcwOQotCQlpZighdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7CisJCS8qIEJVR09OIHdoZW4geW91IHRyeSB0byBhZGRfdGltZXIgdHdpY2UsIHVzaW5nIG1vZF90aW1lciBtYXkKKwkJICogYmUgYmV0dGVyLgorCQkgKi8KKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKSB7CiAJCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKIAkJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAkJfQotCQkvL0lmIGNhbGwgZGV2X2tmcmVlX3NrYl9hbnksYSB3YXJuaW5nIHdpbGwgb2N1ci4uLi4KLQkJLy9LRVJORUw6IGFzc2VydGlvbiAoIWF0b21pY19yZWFkKCZza2ItPnVzZXJzKSkgZmFpbGVkIGF0IG5ldC9jb3JlL2Rldi5jICgxNzA4KQotCQkvL1NvIC4uLiAxMjA0IGJ5IGxhd3JlbmNlLgotCQkvL3ByaW50aygiXG5JbiAlcyxsaW5lICVkIGNhbGwga2ZyZWUgc2tiLiIsX19mdW5jX18sX19MSU5FX18pOwotCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQkvKiBJZiBjYWxsIGRldl9rZnJlZV9za2JfYW55LGEgd2FybmluZyB3aWxsIG9jdXIuLi4uCisJCSAqIEtFUk5FTDogYXNzZXJ0aW9uICghYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpKSBmYWlsZWQgYXQKKwkJICogbmV0L2NvcmUvZGV2LmMgKDE3MDgpCisJCSAqLwogCX0KIH0KIApAQCAtMTIwNSw3ICsxMDYxLDYgQEAKIAl1OCAqYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLS8vCWludCBobGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOwogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKQEAgLTEyMTMsNyArMTA2OCw3IEBACiAJc2tiID0gaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIGNobGVuKzIpOwogCWlmICghc2tiKQogCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwotCWVsc2V7CisJZWxzZSB7CiAJCWMgPSBza2JfcHV0KHNrYiwgY2hsZW4rMik7CiAJCSooYysrKSA9IE1GSUVfVFlQRV9DSEFMTEVOR0U7CiAJCSooYysrKSA9IGNobGVuOwpAQCAtMTIyMSwzOCArMTA3NiwzNiBAQAogCiAJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSByZXNwb25zZVxuIik7CiAKLQkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpOworCQlpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0JCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7Ci0JCS8vcHJpbnRrKCI9PT09PT09PT0+YWRkIHRpbWVyIGFnYWluLCB0byBjcmFzaFxuIik7CisJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSkgewogCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKIAkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCQl9Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0KIAlrZnJlZShjaGFsbGVuZ2UpOwogfQogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCXN0cnVjdCBza19idWZmKiBza2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CiAKIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAogCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGFzc29jaWF0aW9uIHJlcXVlc3RcbiIpOwogCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXNzX3JxKys7Ci0Jc2tiPWllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoYmVhY29uLCBpZWVlKTsKKwlza2IgPSBpZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKGJlYWNvbiwgaWVlZSk7CiAJaWYgKCFza2IpCiAJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7Ci0JZWxzZXsKKwllbHNlIHsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKSB7CiAJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOwogCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJCX0KLQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIAl9CiB9CiAKQEAgLTEyNjEsMTIgKzExMTQsMTEgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKLQlpZihpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCi0JCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpewotCisJaWYgKGllZWU4MDIxMV9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSkgewogCQlpZWVlLT5yYXRlID0gNTQwOwogCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXNcbiIpOwotCX1lbHNleworCX0gZWxzZSB7CiAJCWllZWUtPnJhdGUgPSAxMTA7CiAJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CiAJfQpAQCAtMTI3OSwxMiArMTEzMSw4IEBACiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaW50IGk7CiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAKLQlmb3IoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkgIC8vaWVlZS0+c2VxX2N0cmxbaV0gPSAwOwotCX0KIAlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CiAJSUVFRTgwMjExX0RFQlVHX01HTVQoIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkXG4iKTsKIApAQCAtMTMxNiw3ICsxMTY0LDcgQEAKIAl1OCB0bXBfc3NpZFtJV19FU1NJRF9NQVhfU0laRSsxXTsKIAlpbnQgdG1wX3NzaWRfbGVuID0gMDsKIAotCXNob3J0IGFwc2V0LHNzaWRzZXQsc3NpZGJyb2FkLGFwbWF0Y2gsc3NpZG1hdGNoOworCXNob3J0IGFwc2V0LCBzc2lkc2V0LCBzc2lkYnJvYWQsIGFwbWF0Y2gsIHNzaWRtYXRjaDsKIAogCS8qIHdlIGFyZSBpbnRlcmVzdGVkIGluIG5ldyBuZXcgb25seSBpZiB3ZSBhcmUgbm90IGFzc29jaWF0ZWQKIAkgKiBhbmQgd2UgYXJlIG5vdCBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nCkBAIC0xMzMwLDc0ICsxMTc4LDcwIEBACiAJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmICEobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpKQogCQlyZXR1cm47CiAKLQotCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKXsKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgewogCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIEFQIE1BQywgd2UgbmVlZCBhbHNvIHRoZSBlc3NpZAogCQkgKiBUaGlzIGNvdWxkIGJlIG9idGFpbmVkIGJ5IGJlYWNvbnMgb3IsIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90CiAJCSAqIGJyb2FkY2FzdCBpdCwgaXQgY2FuIGJlIHB1dCBtYW51YWxseS4KIAkJICovCi0JCWFwc2V0ID0gaWVlZS0+d2FwX3NldDsvLyhtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCB6ZXJvLEVUSF9BTEVOKSE9MCApOwotCQlzc2lkc2V0ID0gaWVlZS0+c3NpZF9zZXQ7Ly9pZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSAhPSAnXDAnOwotCQlzc2lkYnJvYWQgPSAgIShuZXQtPnNzaWRfbGVuID09IDAgfHwgbmV0LT5zc2lkWzBdPT0gJ1wwJyk7Ci0JCWFwbWF0Y2ggPSAobWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgbmV0LT5ic3NpZCwgRVRIX0FMRU4pPT0wKTsKKwkJYXBzZXQgPSBpZWVlLT53YXBfc2V0OworCQlzc2lkc2V0ID0gaWVlZS0+c3NpZF9zZXQ7CisJCXNzaWRicm9hZCA9ICAhKG5ldC0+c3NpZF9sZW4gPT0gMCB8fCBuZXQtPnNzaWRbMF0gPT0gJ1wwJyk7CisJCWFwbWF0Y2ggPSAobWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgbmV0LT5ic3NpZCwgRVRIX0FMRU4pID09IDApOwogCi0JCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiAhPSBuZXQtPnNzaWRfbGVuKQorCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuICE9IG5ldC0+c3NpZF9sZW4pCiAJCQlzc2lkbWF0Y2ggPSAwOwogCQllbHNlCi0JCQlzc2lkbWF0Y2ggPSAoMD09c3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKSk7CisJCQlzc2lkbWF0Y2ggPSAoMCA9PSBzdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXQtPnNzaWQsIG5ldC0+c3NpZF9sZW4pKTsKIAotCQkvL3ByaW50aygiY3VyOiAlcywgJWQsIG5ldDolcywgJWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4sIG5ldC0+c3NpZCwgbmV0LT5zc2lkX2xlbik7Ci0JCS8vcHJpbnRrKCJhcHNldD0lZCBhcG1hdGNoPSVkIHNzaWRzZXQ9JWQgc3NpZGJyb2FkPSVkIHNzaWRtYXRjaD0lZFxuIixhcHNldCxhcG1hdGNoLHNzaWRzZXQsc3NpZGJyb2FkLHNzaWRtYXRjaCk7Ci0KLQkJaWYgKAkvKiBpZiB0aGUgdXNlciBzZXQgdGhlIEFQIGNoZWNrIGlmIG1hdGNoLgotCQkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QgYnJvYWRjYXN0IGVzc2lkIHdlIGNoZWNrIHRoZSB1c2VyIHN1cHBsaWVkIEFOWSBlc3NpZAotCQkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRvZXMgbm90IHNldCBlc3NpZCBpdCBpcyBPSwotCQkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRpZCBzZXQgZXNzaWQgY2hlY2ggaWYgZXNzaWQgbWF0Y2gKLQkJCSAqLwotCQkJCSggYXBzZXQgJiYgYXBtYXRjaCAmJgotCQkJCSAgKChzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpIHx8IChzc2lkYnJvYWQgJiYgIXNzaWRzZXQpIHx8ICghc3NpZGJyb2FkICYmIHNzaWRzZXQpKSApIHx8Ci0JCQkJLyogaWYgdGhlIGFwIGlzIG5vdCBzZXQsIGNoZWNrIHRoYXQgdGhlIHVzZXIgc2V0IHRoZSBic3NpZAotCQkJCSAqIGFuZCB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhhdCB0aG9zZSB0d28gYnNzaWQgbWF0Y2hlcwotCQkJCSAqLwotCQkJCSghYXBzZXQgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKQotCQkgICApewotCi0KKwkJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBBUCBjaGVjayBpZiBtYXRjaC4KKwkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QgYnJvYWRjYXN0IGVzc2lkIHdlIGNoZWNrIHRoZSB1c2VyCisJCSAqIHN1cHBsaWVkIEFOWSBlc3NpZAorCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZG9lcyBub3Qgc2V0IGVzc2lkCisJCSAqIGl0IGlzIE9LCisJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkaWQgc2V0IGVzc2lkCisJCSAqIGNoZWNoIGlmIGVzc2lkIG1hdGNoCisJCSAqIChhcHNldCAmJiBhcG1hdGNoICYmICgoc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSB8fAorCQkgKiAgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpKSB8fAorCQkgKiBpZiB0aGUgYXAgaXMgbm90IHNldCwgY2hlY2sgdGhhdCB0aGUgdXNlciBzZXQgdGhlIGJzc2lkIGFuZAorCQkgKiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhhdCB0aG9zZSB0d28gYnNzaWQgbWF0Y2hlcworCQkgKiAoIWFwc2V0ICYmIHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkKKwkJICovCisJCWlmICgoYXBzZXQgJiYgYXBtYXRjaCAmJiAoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwKKwkJICAgICAoc3NpZGJyb2FkICYmICFzc2lkc2V0KSB8fCAoIXNzaWRicm9hZCAmJiBzc2lkc2V0KSkpIHx8CisJCSAgICAoIWFwc2V0ICYmIHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkpIHsKIAkJCS8qIGlmIHRoZSBlc3NpZCBpcyBoaWRkZW4gcmVwbGFjZSBpdCB3aXRoIHRoZQogCQkJICogZXNzaWQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCiAJCQkgKi8KLQkJCWlmICghc3NpZGJyb2FkKXsKKwkJCWlmICghc3NpZGJyb2FkKSB7CiAJCQkJc3RybmNweSh0bXBfc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKIAkJCQl0bXBfc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CiAJCQl9CiAJCQltZW1jcHkoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgbmV0LCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CiAKLQkJCWlmICghc3NpZGJyb2FkKXsKKwkJCWlmICghc3NpZGJyb2FkKSB7CiAJCQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgdG1wX3NzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKIAkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSB0bXBfc3NpZF9sZW47CiAJCQl9Ci0JCQlwcmludGsoS0VSTl9JTkZPIkxpbmtpbmcgd2l0aCAlczogY2hhbm5lbCBpcyAlZFxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJCQlwcmludGsoS0VSTl9JTkZPIkxpbmtpbmcgd2l0aCAlczogY2hhbm5lbCBpcyAlZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKIAotCQkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CiAJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CiAJCQkJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CiAJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotCQkJfWVsc2V7Ci0JCQkJaWYoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgotCQkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7CisJCQl9IGVsc2UgeworCQkJCWlmIChpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCQkJCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKSB7CiAJCQkJCWllZWUtPnJhdGUgPSA1NDA7CiAJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlc1xuIik7Ci0JCQkJfWVsc2V7CisJCQkJfSBlbHNlIHsKIAkJCQkJaWVlZS0+cmF0ZSA9IDExMDsKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzXG4iKTsKIAkJCQl9CiAJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwogCQkJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOwogCQkJfQotCiAJCX0KIAl9Ci0KIH0KIAogdm9pZCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKQEAgLTE0MDcsNjAgKzEyNTEsNTIgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKLQogCQkvKiBpZiB0aGUgc3RhdGUgYmVjb21lIGRpZmZlcmVudCB0aGF0IE5PTElOSyBtZWFucwogCQkgKiB3ZSBoYWQgZm91bmQgd2hhdCB3ZSBhcmUgc2VhcmNoaW5nIGZvcgogCQkgKi8KLQogCQlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX05PTElOSykKIAkJCWJyZWFrOwogCiAJCWlmIChpZWVlLT5zY2FuX2FnZSA9PSAwIHx8IHRpbWVfYWZ0ZXIodGFyZ2V0LT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcykpCiAJCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsIHRhcmdldCk7CiAJfQotCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCiB9CiAKLQogc3RhdGljIGlubGluZSB1MTYgYXV0aF9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqKmNoYWxsZW5nZSwgaW50ICpjaGxlbikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOwogCXU4ICp0OwotCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKLQkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsc2tiLT5sZW4pOworCWlmIChza2ItPmxlbiA8IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgLSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIiwgc2tiLT5sZW4pOwogCQlyZXR1cm4gMHhjYWZlOwogCX0KIAkqY2hhbGxlbmdlID0gTlVMTDsKLQlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24qKSBza2ItPmRhdGE7Ci0JaWYoc2tiLT5sZW4gPiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICszKSl7CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopIHNrYi0+ZGF0YTsKKwlpZiAoc2tiLT5sZW4gPiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICsgMykpIHsKIAkJdCA9IHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKIAotCQlpZigqKHQrKykgPT0gTUZJRV9UWVBFX0NIQUxMRU5HRSl7CisJCWlmICgqKHQrKykgPT0gTUZJRV9UWVBFX0NIQUxMRU5HRSkgewogCQkJKmNobGVuID0gKih0KyspOwogCQkJKmNoYWxsZW5nZSA9IGttZW1kdXAodCwgKmNobGVuLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghKmNoYWxsZW5nZSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KLQogCXJldHVybiBjcHVfdG9fbGUxNihhLT5zdGF0dXMpOwotCiB9CiAKLQogc3RhdGljIGludCBhdXRoX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpkZXN0KQogewogCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CiAKLQlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7Ci0JCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6ICVkXG4iLHNrYi0+bGVuKTsKKwlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpIHsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDogJWRcbiIsIHNrYi0+bGVuKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24qKSBza2ItPmRhdGE7CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopIHNrYi0+ZGF0YTsKIAotCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMiwgRVRIX0FMRU4pOworCW1lbWNweShkZXN0LCBhLT5oZWFkZXIuYWRkcjIsIEVUSF9BTEVOKTsKIAogCWlmIChsZTE2X3RvX2NwdShhLT5hbGdvcml0aG0pICE9IFdMQU5fQVVUSF9PUEVOKQogCQlyZXR1cm4gIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEc7CkBAIC0xNDczLDIzICsxMzA5LDIzIEBACiB7CiAJdTggKnRhZzsKIAl1OCAqc2tiZW5kOwotCXU4ICpzc2lkPU5VTEw7CisJdTggKnNzaWQgPSBOVUxMOwogCXU4IHNzaWRsZW4gPSAwOwogCiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqaGVhZGVyID0KIAkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAgKikgc2tiLT5kYXRhOwogCi0JaWYgKHNrYi0+bGVuIDwgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSkKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKQogCQlyZXR1cm4gLTE7IC8qIGNvcnJ1cHRlZCAqLwogCi0JbWVtY3B5KHNyYyxoZWFkZXItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtY3B5KHNyYywgaGVhZGVyLT5hZGRyMiwgRVRIX0FMRU4pOwogCi0Jc2tiZW5kID0gKHU4Kilza2ItPmRhdGEgKyBza2ItPmxlbjsKKwlza2JlbmQgPSAodTggKilza2ItPmRhdGEgKyBza2ItPmxlbjsKIAotCXRhZyA9IHNrYi0+ZGF0YSArIHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICk7CisJdGFnID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAotCXdoaWxlICh0YWcrMSA8IHNrYmVuZCl7Ci0JCWlmICgqdGFnID09IDApeworCXdoaWxlICh0YWcrMSA8IHNrYmVuZCkgeworCQlpZiAoKnRhZyA9PSAwKSB7CiAJCQlzc2lkID0gdGFnKzI7CiAJCQlzc2lkbGVuID0gKih0YWcrMSk7CiAJCQlicmVhazsKQEAgLTE0OTksMTAgKzEzMzUsMTIgQEAKIAkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBuZXh0IHRhZyAqLwogCX0KIAotCS8vSUVFRTgwMjExRE1FU0coIkNhcmQgTUFDIGFkZHJlc3MgaXMgIk1BQ1NUUiwgTUFDMlNUUihzcmMpKTsKLQlpZiAoc3NpZGxlbiA9PSAwKSByZXR1cm4gMTsKKwlpZiAoc3NpZGxlbiA9PSAwKQorCQlyZXR1cm4gMTsKIAotCWlmICghc3NpZCkgcmV0dXJuIDE7IC8qIHNzaWQgbm90IGZvdW5kIGluIHRhZ2dlZCBwYXJhbSAqLworCWlmICghc3NpZCkKKwkJIHJldHVybiAxOyAvKiBzc2lkIG5vdCBmb3VuZCBpbiB0YWdnZWQgcGFyYW0gKi8KKwogCXJldHVybiAoIXN0cm5jbXAoc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHNzaWRsZW4pKTsKIAogfQpAQCAtMTUxNCwxMyArMTM1MiwxMyBAQAogCWlmIChza2ItPmxlbiA8IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSAtCiAJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKSB7CiAKLQkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDolZCBcbiIsIHNrYi0+bGVuKTsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDolZFxuIiwgc2tiLT5sZW4pOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUqKSBza2ItPmRhdGE7CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKikgc2tiLT5kYXRhOwogCi0JbWVtY3B5KGRlc3QsYS0+aGVhZGVyLmFkZHIyLEVUSF9BTEVOKTsKKwltZW1jcHkoZGVzdCwgYS0+aGVhZGVyLmFkZHIyLCBFVEhfQUxFTik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MjgsMTIgKzEzNjYsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdTE2IGFzc29jX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIGludCAqYWlkKQogewogCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmE7Ci0JaWYgKHNrYi0+bGVuIDwgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSl7CisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKSB7CiAJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLCBza2ItPmxlbik7CiAJCXJldHVybiAweGNhZmU7CiAJfQogCi0JYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKikgc2tiLT5kYXRhOworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqKSBza2ItPmRhdGE7CiAJKmFpZCA9IGxlMTZfdG9fY3B1KGEtPmFpZCkgJiAweDNmZmY7CiAJcmV0dXJuIGxlMTZfdG9fY3B1KGEtPnN0YXR1cyk7CiB9CkBAIC0xNTQzLDExICsxMzgxLDggQEAKIHsKIAl1OCBkZXN0W0VUSF9BTEVOXTsKIAotCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CiAJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9wcm9iZV9ycSsrOwotCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7Ci0JaWYgKHByb2JlX3JxX3BhcnNlKGllZWUsIHNrYiwgZGVzdCkpewotCQkvL0lFRUU4MDIxMURNRVNHKCJXYXMgZm9yIG1lISIpOworCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKSB7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnMrKzsKIAkJaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoaWVlZSwgZGVzdCk7CiAJfQpAQCAtMTU1OCwxMTUgKzEzOTMsOTIgQEAKIHsKIAl1OCBkZXN0W0VUSF9BTEVOXTsKIAlpbnQgc3RhdHVzOwotCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CiAJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JxKys7CiAKIAlzdGF0dXMgPSBhdXRoX3JxX3BhcnNlKHNrYiwgZGVzdCk7Ci0JaWYgKHN0YXR1cyAhPSAtMSkgeworCWlmIChzdGF0dXMgIT0gLTEpCiAJCWllZWU4MDIxMV9yZXNwX3RvX2F1dGgoaWVlZSwgc3RhdHVzLCBkZXN0KTsKLQl9Ci0JLy9ETUVTRygiRGVzdCBpcyAiTUFDU1RSLCBNQUMyU1RSKGRlc3QpKTsKLQogfQogCi0gaW5saW5lIHZvaWQKK2lubGluZSB2b2lkCiBpZWVlODAyMTFfcnhfYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAKIAl1OCBkZXN0W0VUSF9BTEVOXTsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19ycSsrOwotCWlmIChhc3NvY19ycV9wYXJzZShza2IsZGVzdCkgIT0gLTEpeworCWlmIChhc3NvY19ycV9wYXJzZShza2IsIGRlc3QpICE9IC0xKQogCQlpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShpZWVlLCBkZXN0KTsKLQl9CisKIAogCXByaW50ayhLRVJOX0lORk8iTmV3IGNsaWVudCBhc3NvY2lhdGVkOiAlcE1cbiIsIGRlc3QpOwogfQogCi0KLQogdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKQogewotCiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9udWxsX2Z1bmMoaWVlZSwgcHdyKTsKIAogCWlmIChidWYpCiAJCXNvZnRtYWNfcHNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Ci0KIH0KIAotCiBzdGF0aWMgc2hvcnQgaWVlZTgwMjExX3N0YV9wc19zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTMyICp0aW1lX2gsCiAJCQkgICAgIHUzMiAqdGltZV9sKQogewotICAgICAgICBpbnQgdGltZW91dCA9IDA7CisJaW50IHRpbWVvdXQgPSAwOwogCiAJdTggZHRpbTsKLQkvKmlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAotCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKLQkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKLQotCQlyZXR1cm4gMDsKLQkqLwogCWR0aW0gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhOwotCS8vcHJpbnRrKCJEVElNXG4iKTsKIAotCWlmKCEoZHRpbSAmIElFRUU4MDIxMV9EVElNX1ZBTElEKSkKKwlpZiAoIShkdGltICYgSUVFRTgwMjExX0RUSU1fVkFMSUQpKQogCQlyZXR1cm4gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOworCWVsc2UKKwkJdGltZW91dCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7CiAKLQkvL3ByaW50aygiVkFMSURcbiIpOwogCWllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGEgPSBJRUVFODAyMTFfRFRJTV9JTlZBTElEOwogCi0JaWYoZHRpbSAmICgoSUVFRTgwMjExX0RUSU1fVUNBU1QgfCBJRUVFODAyMTFfRFRJTV9NQkNBU1QpJiBpZWVlLT5wcykpCisJaWYgKGR0aW0gJiAoKElFRUU4MDIxMV9EVElNX1VDQVNUIHwgSUVFRTgwMjExX0RUSU1fTUJDQVNUKSAmIGllZWUtPnBzKSkKIAkJcmV0dXJuIDI7CiAKLQlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ICsgTVNFQ1ModGltZW91dCkpKQorCWlmICghdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ICsgTVNFQ1ModGltZW91dCkpKQogCQlyZXR1cm4gMDsKIAotCWlmKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmxhc3RfcnhfcHNfdGltZSArIE1TRUNTKHRpbWVvdXQpKSkKKwlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+bGFzdF9yeF9wc190aW1lICsgTVNFQ1ModGltZW91dCkpKQogCQlyZXR1cm4gMDsKIAotCWlmKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSApICYmCisJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSkgJiYKIAkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCAhPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpKQogCQlyZXR1cm4gMDsKIAotCWlmKHRpbWVfbCl7CisJaWYgKHRpbWVfbCkgewogCQkqdGltZV9sID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXQogCQkJKyBNU0VDUygoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCkpOwotCQkJLy8qIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkpOwotCQkJLy9wcmludGsoImJlYWNvbl9pbnRlcnZhbDoleCwgZHRpbV9wZXJpb2Q6JXgsIHRvdG9sIHRvIE1zZWNzOiV4LCBIWjoleFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kLCBNU0VDUygoKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgKiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QpKSksIEhaKTsKIAl9CiAKLQlpZih0aW1lX2gpeworCWlmICh0aW1lX2gpIHsKIAkJKnRpbWVfaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMV07Ci0JCWlmKHRpbWVfbCAmJiAqdGltZV9sIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXSkKKwkJaWYgKHRpbWVfbCAmJiAqdGltZV9sIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXSkKIAkJCSp0aW1lX2ggKz0gMTsKIAl9CiAKIAlyZXR1cm4gMTsKLQotCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhX3BzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCi0JdTMyIHRoLHRsOworCXUzMiB0aCwgdGw7CiAJc2hvcnQgc2xlZXA7CiAKLQl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCi0JaWYoKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAotCisJaWYgKChpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQgfHwKIAkJaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBIHx8Ci0JCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpKXsKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpIHsKIAotCQkvLyN3YXJuaW5nIENIRUNLX0xPQ0tfSEVSRQorCQkvKiAjd2FybmluZyBDSEVDS19MT0NLX0hFUkUgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAogCQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLCAxKTsKQEAgLTE2NzQsNzEgKzE0ODYsNTcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwogCX0KIAotCXNsZWVwID0gaWVlZTgwMjExX3N0YV9wc19zbGVlcChpZWVlLCZ0aCwgJnRsKTsKLS8vCXByaW50aygiPT09PiVzLCVkWzIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nXSwgaWVlZS0+c3RhX3NsZWVwID0gJWRcbiIsX19mdW5jX18sIHNsZWVwLGllZWUtPnN0YV9zbGVlcCk7CisJc2xlZXAgPSBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKGllZWUsICZ0aCwgJnRsKTsKIAkvKiAyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZyAqLwotCWlmKHNsZWVwID09IDApCisJaWYgKHNsZWVwID09IDApCiAJCWdvdG8gb3V0OwogCi0JaWYoc2xlZXAgPT0gMSl7CisJaWYgKHNsZWVwID09IDEpIHsKKwkJaWYgKGllZWUtPnN0YV9zbGVlcCA9PSAxKQorCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LCB0aCwgdGwpOwogCi0JCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAxKQotCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LHRoLHRsKTsKLQotCQllbHNlIGlmKGllZWUtPnN0YV9zbGVlcCA9PSAwKXsKLQkvLwkJcHJpbnRrKCJzZW5kIG51bGwgMVxuIik7CisJCWVsc2UgaWYgKGllZWUtPnN0YV9zbGVlcCA9PSAwKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwotCi0JCQlpZihpZWVlLT5wc19pc19xdWV1ZV9lbXB0eShpZWVlLT5kZXYpKXsKLQotCisJCQlpZiAoaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkoaWVlZS0+ZGV2KSkgewogCQkJCWllZWUtPnN0YV9zbGVlcCA9IDI7CiAKIAkJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOwogCi0JCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwxKTsKKwkJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAxKTsKIAogCQkJCWllZWUtPnBzX3RoID0gdGg7CiAJCQkJaWVlZS0+cHNfdGwgPSB0bDsKIAkJCX0KIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKLQogCQl9Ci0KLQotCX1lbHNlIGlmKHNsZWVwID09IDIpewotLy8jd2FybmluZyBDSEVDS19MT0NLX0hFUkUKKwl9IGVsc2UgaWYgKHNsZWVwID09IDIpIHsKKwkJLyogI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CiAKLQkvLwlwcmludGsoInNlbmQgd2FrZXVwIHBhY2tldFxuIik7Ci0JCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMSk7CisJCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsIDEpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAl9Ci0KIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KIH0KIAogdm9pZCBpZWVlODAyMTFfc3RhX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpCiB7Ci0JaWYoaWVlZS0+c3RhX3NsZWVwID09IDApewotCQlpZihubCl7Ci0JCS8vCXByaW50aygiV2FybmluZzogZHJpdmVyIGlzIHByb2JhYmx5IGZhaWxpbmcgdG8gcmVwb3J0IFRYIHBzIGVycm9yXG4iKTsKKwlpZiAoaWVlZS0+c3RhX3NsZWVwID09IDApIHsKKwkJaWYgKG5sKSB7CiAJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOwogCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CiAJCX0KIAkJcmV0dXJuOwotCiAJfQogCi0JaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJaWYgKGllZWUtPnN0YV9zbGVlcCA9PSAxKQogCQlpZWVlLT5zdGFfd2FrZV91cChpZWVlLT5kZXYpOwogCiAJaWVlZS0+c3RhX3NsZWVwID0gMDsKIAotCWlmKG5sKXsKKwlpZiAobmwpIHsKIAkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKIAkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CiAJfQpAQCAtMTc0NiwyNSArMTU0NCwyMCBAQAogCiB2b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MyOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMil7CisJaWYgKGllZWUtPnN0YV9zbGVlcCA9PSAyKSB7CiAJCS8qIE51bGwgZnJhbWUgd2l0aCBQUyBiaXQgc2V0ICovCi0JCWlmKHN1Y2Nlc3MpewotCi0JCS8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PiAlczo6ZW50ZXIgc2xlZXAgc3RhdGVcbiIsX19mdW5jX18pOworCQlpZiAoc3VjY2VzcykgewogCQkJaWVlZS0+c3RhX3NsZWVwID0gMTsKLQkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldixpZWVlLT5wc190aCxpZWVlLT5wc190bCk7CisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsIGllZWUtPnBzX3RoLCBpZWVlLT5wc190bCk7CiAJCX0KIAkJLyogaWYgdGhlIGNhcmQgcmVwb3J0IG5vdCBzdWNjZXNzIHdlIGNhbid0IGJlIHN1cmUgdGhlIEFQCiAJCSAqIGhhcyBub3QgUlhlZCBzbyB3ZSBjYW4ndCBhc3N1bWUgdGhlIEFQIGJlbGlldmUgdXMgYXdha2UKIAkJICovCi0JfQotCS8qIDIxMTEyMDA1IC0gdHggYWdhaW4gbnVsbCB3aXRob3V0IFBTIGJpdCBpZiBsb3N0ICovCi0JZWxzZSB7Ci0KLQkJaWYoKGllZWUtPnN0YV9zbGVlcCA9PSAwKSAmJiAhc3VjY2Vzcyl7CisJfSBlbHNlIHsKKwkJaWYgKChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgJiYgIXN1Y2Nlc3MpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CiAJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKQEAgLTE3ODAsMTYgKzE1NzMsMTYgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopIHNrYi0+ZGF0YTsKIAl1MTYgZXJyY29kZTsKLQl1OCogY2hhbGxlbmdlPU5VTEw7Ci0JaW50IGNobGVuPTA7Ci0JaW50IGFpZD0wOworCXU4ICpjaGFsbGVuZ2UgPSBOVUxMOworCWludCBjaGxlbiA9IDA7CisJaW50IGFpZCA9IDA7CiAJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2NfcmVzcDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OwogCi0JaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKQogCQlyZXR1cm4gMDsKIAotCWlmKGllZWUtPnN0YV9zbGVlcCB8fCAoaWVlZS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEICYmCisJaWYgKGllZWUtPnN0YV9zbGVlcCB8fCAoaWVlZS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEICYmCiAJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgogCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkKIApAQCAtMTgwMCwzMCArMTU5MywyNyBAQAogCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOwogCiAJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2NvbnRyb2wpKSB7Ci0KIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUDoKIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQOgotCiAJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgW1JFXUFTU09DSUFUSU9OIFJFU1BPTlNFICglZClcbiIsCiAJCQkJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CiAJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgogCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEICYmCi0JCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKLQkJCQlpZiAoMCA9PSAoZXJyY29kZT1hc3NvY19wYXJzZShza2IsICZhaWQpKSl7CisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCQkJZXJyY29kZSA9IGFzc29jX3BhcnNlKHNrYiwgJmFpZCk7CisJCQkJaWYgKDAgPT0gZXJyY29kZSkgewogCQkJCQl1MTYgbGVmdDsKIAotCQkJCQlpZWVlLT5zdGF0ZT1JRUVFODAyMTFfTElOS0VEOworCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CiAJCQkJCWllZWUtPmFzc29jX2lkID0gYWlkOwogCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19vaysrOwotCi0JCQkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAibmljX3R5cGUgPSAlcyIsIChyeF9zdGF0cy0+bmljX3R5cGUgPT0gMSk/InJ0bDgxODciOiJydGw4MTg3QiIpOwotCQkJCQlpZigxID09IHJ4X3N0YXRzLT5uaWNfdHlwZSkgLy9jYXJkIHR5cGUgaXMgODE4NwotCQkJCQl7CisJCQkJCS8qIGNhcmQgdHlwZSBpcyA4MTg3ICovCisJCQkJCWlmICgxID09IHJ4X3N0YXRzLT5uaWNfdHlwZSkKIAkJCQkJCWdvdG8gYXNzb2NpYXRlX2NvbXBsZXRlOwotCQkJCQl9Ci0JCQkJCWFzc29jX3Jlc3AgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopc2tiLT5kYXRhOwotCQkJCQlpbmZvX2VsZW1lbnQgPSAJJmFzc29jX3Jlc3AtPmluZm9fZWxlbWVudDsKLQkJCQkJbGVmdCA9IHNrYi0+bGVuIC0gKCh2b2lkKilpbmZvX2VsZW1lbnQgLSAodm9pZCopYXNzb2NfcmVzcCk7CisKKwkJCQkJYXNzb2NfcmVzcCA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopc2tiLT5kYXRhOworCQkJCQlpbmZvX2VsZW1lbnQgPSAmYXNzb2NfcmVzcC0+aW5mb19lbGVtZW50OworCQkJCQlsZWZ0ID0gc2tiLT5sZW4gLSAoKHZvaWQgKilpbmZvX2VsZW1lbnQgLSAodm9pZCAqKWFzc29jX3Jlc3ApOwogCiAJCQkJCXdoaWxlIChsZWZ0ID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpKSB7CiAJCQkJCQlpZiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikgKyBpbmZvX2VsZW1lbnQtPmxlbiA+IGxlZnQpIHsKQEAgLTE4MzIsMzIgKzE2MjIsMzMgQEAKIAkJCQkJCX0KIAkJCQkJCXN3aXRjaCAoaW5mb19lbGVtZW50LT5pZCkgewogCQkJCQkJICBjYXNlIE1GSUVfVFlQRV9HRU5FUklDOgotCQkJCQkJICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9HRU5FUklDOiAlZCBieXRlc1xuIiwgaW5mb19lbGVtZW50LT5sZW4pOworCQkJCQkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsIGluZm9fZWxlbWVudC0+bGVuKTsKIAkJCQkJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gOCAgJiYKIAkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKIAkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKIAkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKIAkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIgJiYKIAkJCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDEpIHsKLQkJCQkJCQkgICAgLy8gTm90IGNhcmUgYWJvdXQgdmVyc2lvbiBhdCBwcmVzZW50LgotCQkJCQkJCSAgICAvL1dNTSBQYXJhbWV0ZXIgRWxlbWVudAotCQkJCQkJCSAgICBtZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9wYXJhbSwodTgqKShpbmZvX2VsZW1lbnQtPmRhdGFcCi0JCQkJCQkJCQkJICAgICsgOCksKGluZm9fZWxlbWVudC0+bGVuIC0gOCkpOworCQkJCQkJCQkvKiBOb3QgY2FyZSBhYm91dCB2ZXJzaW9uIGF0IHByZXNlbnQuCisJCQkJCQkJCSAqIFdNTSBQYXJhbWV0ZXIgRWxlbWVudC4KKwkJCQkJCQkJICovCisJCQkJCQkJCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX3BhcmFtLCAodTggKikoaW5mb19lbGVtZW50LT5kYXRhXAorCQkJCQkJCQkJKyA4KSwgKGluZm9fZWxlbWVudC0+bGVuIC0gOCkpOwogCi0JCQkJCSAJICAgICAgICAgICAgaWYgKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvXmluZm9fZWxlbWVudC0+ZGF0YVs2XSkmIFwKLQkJCQkJCQkJCQkgICAgMHgwZil8fCghaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSkgewotCQkJCQkJICAgCSAgICAgIC8vIHJlZnJlc2ggcGFyYW1ldGVyIGVsZW1lbnQgZm9yIGN1cnJlbnQgbmV0d29yawotCQkJCQkJCSAgICAgIC8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgcGFyYW1ldGVyIGZvciBoYXJkd2FyZQotCQkJCQkJCSAgICAgIGllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDE7Ci0JCQkJCQkJICAgICAgcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPndtbV9wYXJhbV91cGRhdGVfd3EpOwotCi0JCQkJCQkgICAgICAgICAgICB9Ci0JCQkJCQkgICAgICAgICAgICAvL3VwZGF0ZSBpbmZvX2VsZW1lbnQgZm9yIGN1cnJlbnQgbmV0d29yawotCQkJCQkJICAgICAgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvICA9IGluZm9fZWxlbWVudC0+ZGF0YVs2XTsKKwkJCQkJCQkJaWYgKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvXmluZm9fZWxlbWVudC0+ZGF0YVs2XSkmIFwKKwkJCQkJCQkJCQkgICAgMHgwZikgfHwgKCFpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcpKSB7CisJCQkJCQkJCQkvKiByZWZyZXNoIHBhcmFtZXRlciBlbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKKwkJCQkJCQkJCSAqIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgcGFyYW1ldGVyIGZvciBoYXJkd2FyZS4KKwkJCQkJCQkJCSAqLworCQkJCQkJCQkJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsKKwkJCQkJCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkvKiB1cGRhdGUgaW5mb19lbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsgKi8KKwkJCQkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvICA9IGluZm9fZWxlbWVudC0+ZGF0YVs2XTsKIAkJCQkJCQl9CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQkgIGRlZmF1bHQ6Ci0JCQkJCQkJLy9ub3RoaW5nIHRvIGRvIGF0IHByZXNlbnQhISEKKwkJCQkJCQkvKiBub3RoaW5nIHRvIGRvIGF0IHByZXNlbnQhISEgKi8KIAkJCQkJCQlicmVhazsKIAkJCQkJCX0KIApAQCAtMTg2NiwxNCArMTY1NywxNCBAQAogCQkJCQkJaW5mb19lbGVtZW50ID0gKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICopCiAJCQkJCQkJJmluZm9fZWxlbWVudC0+ZGF0YVtpbmZvX2VsZW1lbnQtPmxlbl07CiAJCQkJCX0KLQkJCQkJaWYoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykgLy9sZWdhY3kgQVAsIHJlc2V0IHRoZSBBQ194eF9wYXJhbSByZWdpc3RlcgotCQkJCQl7Ci0JCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKLQkJCQkJCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDE7Ly9pbmRpY2F0ZSBBQ194eF9wYXJhbSB1cGF0ZWQgc2luY2UgbGFzdCBhc3NvY2lhdGUKKwkJCQkJLyogbGVnYWN5IEFQLCByZXNldCB0aGUgQUNfeHhfcGFyYW0gcmVnaXN0ZXIgKi8KKwkJCQkJaWYgKCFpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcpIHsKKwkJCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKKwkJCQkJCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDE7IC8qIGluZGljYXRlIEFDX3h4X3BhcmFtIHVwYXRlZCBzaW5jZSBsYXN0IGFzc29jaWF0ZSAqLwogCQkJCQl9CiBhc3NvY2lhdGVfY29tcGxldGU6CiAJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoaWVlZSk7Ci0JCQkJfWVsc2V7CisJCQkJfSBlbHNlIHsKIAkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfZXJyKys7CiAJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKAogCQkJCQkJIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCkBAIC0xODgyLDQ3ICsxNjczLDQxIEBACiAJCQkJfQogCQkJfQogCQkJYnJlYWs7Ci0KIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROgogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUToKLQogCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKIAkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQogCiAJCQkJaWVlZTgwMjExX3J4X2Fzc29jX3JxKGllZWUsIHNrYik7CiAJCQlicmVhazsKLQogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgotCi0JCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpeworCQkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSB7CiAJCQkJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyAmJgogCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7Ci0KIAkJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJSZWNlaXZlZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZSIpOwogCi0JCQkJCQlpZiAoMCA9PSAoZXJyY29kZT1hdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKSkpewotCQkJCQkJCWlmKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpeworCQkJCQkJZXJyY29kZSA9IGF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pOworCQkJCQkJaWYgKDAgPT0gZXJyY29kZSkgeworCQkJCQkJCWlmIChpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKSB7CiAJCQkJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7CiAJCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOwogCiAJCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7Ci0JCQkJCQkJfWVsc2V7CisJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJaWVlZTgwMjExX3J0bF9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsIGNobGVuKTsKIAkJCQkJCQl9Ci0JCQkJCQl9ZWxzZXsKKwkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOwotCQkJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4IixlcnJjb2RlKTsKKwkJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleCIsIGVycmNvZGUpOwogCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CiAJCQkJCQl9CiAKLQkJCQkJfWVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpeworCQkJCQl9IGVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKIAkJCQkJCWllZWU4MDIxMV9yeF9hdXRoX3JxKGllZWUsIHNrYik7CiAJCQkJCX0KIAkJCQl9CiAJCQlicmVhazsKLQogCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6Ci0KIAkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJTKSAmJgogCQkJCSgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8CiAJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgJiYKQEAgLTE5MzAsMzYgKzE3MTUsMjggQEAKIAogCQkJCWllZWU4MDIxMV9yeF9wcm9iZV9ycShpZWVlLCBza2IpOwogCQkJYnJlYWs7Ci0KIAkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CiAJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKIAkJCS8qIEZJWE1FIGZvciBub3cgcmVwZWF0IGFsbCB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlCi0JCQkqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCi0JCQkqLworCQkJICogYm90aCBmb3IgZGlzYXNzb2NpYXRpb24gYW5kIGRlYXV0aGVudGljYXRpb24KKwkJCSAqLwogCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKIAkJCQkoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYKIAkJCQkoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSAmJgotCQkJCSghbWVtY21wKGhlYWRlci0+YWRkcjIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLEVUSF9BTEVOKSkpeworCQkJCSghbWVtY21wKGhlYWRlci0+YWRkcjIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pKSkgewogCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOwogCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOwogCi0JCQkJLy9ub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7ICAvL1lKLGRlbCwwODA4MjgsIGRvIG5vdCBub3RpZnkgb3MgaGVyZQogCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKIAkJCX0KLQogCQkJYnJlYWs7Ci0KIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtMTsKIAkJCWJyZWFrOwogCX0KLQotCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAlyZXR1cm4gMDsKIH0KIAotCi0KIC8qIGZvbGxvd2luZyBhcmUgZm9yIGEgc2ltcGxlciBUWCBxdWV1ZSBtYW5hZ2VtZW50LgogICogSW5zdGVhZCBvZiB1c2luZyBuZXRpZl9bc3RvcC93YWtlXV9xdWV1ZSB0aGUgZHJpdmVyCiAgKiB3aWxsIHVzZXMgdGhlc2UgdHdvIGZ1bmN0aW9uIChwbHVzIGEgcmVzZXQgb25lKSwgdGhhdApAQCAtMTk4MiwyNyArMTc1OSwyMyBAQAogdm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCiAJCQkgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0KLQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50ICBpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBjYWxsZWQgd2l0aCAybmQgcGFybSAwLCBubyB0eCBtZ210IGxvY2sgcmVxdWlyZWQgKi8KLQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsIDApOwogCi0JZm9yKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7Ci0KLQkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApeworCWZvciAoaSA9IDA7IGkgPCB0eGItPm5yX2ZyYWdzOyBpKyspIHsKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApIHsKIAkJCWllZWUtPnR4X3BlbmRpbmcudHhiID0gdHhiOwogCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKIAkJCWdvdG8gZXhpdDsKLQkJfWVsc2V7CisJCX0gZWxzZSB7CiAJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KAogCQkJCXR4Yi0+ZnJhZ21lbnRzW2ldLAotCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKLQkJCQkvLyhpKzEpPHR4Yi0+bnJfZnJhZ3MpOworCQkJCWllZWUtPmRldiwgaWVlZS0+cmF0ZSk7CiAJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCQlpZWVlLT5zdGF0cy50eF9ieXRlcyArPSB0eGItPmZyYWdtZW50c1tpXS0+bGVuOwogCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CkBAIC0yMDEyLDY2ICsxNzg1LDU5IEBACiAJaWVlZTgwMjExX3R4Yl9mcmVlKHR4Yik7CiAKIAlleGl0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogfQogCiAvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGFjcXVpcmVkICovCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzdW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCWludCBpOwotCWZvcihpID0gaWVlZS0+dHhfcGVuZGluZy5mcmFnOyBpIDwgaWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzOyBpKyspIHsKKwlmb3IgKGkgPSBpZWVlLT50eF9wZW5kaW5nLmZyYWc7IGkgPCBpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3M7IGkrKykgewogCi0JCWlmIChpZWVlLT5xdWV1ZV9zdG9wKXsKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApIHsKIAkJCWllZWUtPnR4X3BlbmRpbmcuZnJhZyA9IGk7CiAJCQlyZXR1cm47Ci0JCX1lbHNlewotCisJCX0gZWxzZSB7CiAJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KAogCQkJCWllZWUtPnR4X3BlbmRpbmcudHhiLT5mcmFnbWVudHNbaV0sCi0JCQkJaWVlZS0+ZGV2LGllZWUtPnJhdGUpOwotCQkJCS8vKGkrMSk8aWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzKTsKKwkJCQlpZWVlLT5kZXYsIGllZWUtPnJhdGUpOwogCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJCX0KIAl9CiAKLQogCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CiAJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAlpbml0X21nbXRfcXVldWUoaWVlZSk7Ci0JaWYgKGllZWUtPnR4X3BlbmRpbmcudHhiKXsKKwlpZiAoaWVlZS0+dHhfcGVuZGluZy50eGIpIHsKIAkJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKIAkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOwogCX0KIAlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfcnRsX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXI7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7Ci0JaWYgKCEgaWVlZS0+cXVldWVfc3RvcCkgZ290byBleGl0OworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wKQorCQlnb3RvIGV4aXQ7CiAKIAlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKIAotCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKXsKLQkJd2hpbGUgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIChza2IgPSBkZXF1ZXVlX21nbXQoaWVlZSkpKXsKLQorCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSkgeworCQl3aGlsZSAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgKHNrYiA9IGRlcXVldWVfbWdtdChpZWVlKSkpIHsKIAkJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOwogCiAJCQloZWFkZXItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CkBAIC0yMDgxLDQyICsxODQ3LDMyIEBACiAJCQllbHNlCiAJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKIAotCQkJLy9wcmludGsoS0VSTl9BTEVSVCAiaWVlZTgwMjExX3dha2VfcXVldWUgXG4iKTsKLQkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUtPmRldiwgaWVlZS0+YmFzaWNfcmF0ZSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQl9CiAJfQogCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBpZWVlLT50eF9wZW5kaW5nLnR4YikKIAkJaWVlZTgwMjExX3Jlc3VtZV90eChpZWVlKTsKIAotCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpIHsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4YXdha2UrKzsKIAkJbmV0aWZfd2FrZV9xdWV1ZShpZWVlLT5kZXYpOwogCX0KLQotZXhpdCA6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CitleGl0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KIAotCiB2b2lkIGllZWU4MDIxMV9ydGxfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7Ci0KLQlpZiAoISBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoaWVlZS0+ZGV2KTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4c3RvcCsrOwogCX0KIAlpZWVlLT5xdWV1ZV9zdG9wID0gMTsKLQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCiB9CiAKLQogaW5saW5lIHZvaWQgaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCiAJcmFuZG9tX2V0aGVyX2FkZHIoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKIH0KIApAQCAtMjEyNSw3ICsxODgxLDcgQEAKIHsKIAlpZWVlLT5hc3NvY19pZCA9IDE7CiAKLQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCkgewogCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLAogCQkJSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQsCiAJCQlJV19FU1NJRF9NQVhfU0laRSk7CkBAIC0yMTQ5LDcgKzE5MDUsNyBAQAogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmKGllZWUtPnJhd190eCl7CisJaWYgKGllZWUtPnJhd190eCkgewogCiAJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQogCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOwpAQCAtMjE3Myw5ICsxOTI5LDggQEAKIAogCWRvd24oJmllZWUtPnd4X3NlbSk7CiAKLQotCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7Ci0JCXN0cmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKSB7CisJCXN0cmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOwogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOwogCQlpZWVlLT5zc2lkX3NldCA9IDE7CiAJfQpAQCAtMjE4Myw3ICsxOTM4LDcgQEAKIAkvKiBjaGVjayBpZiB3ZSBoYXZlIHRoaXMgY2VsbCBpbiBvdXIgbmV0d29yayBsaXN0ICovCiAJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CiAKLQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IDEwOwogCS8qIGlmIG5vdCB0aGVuIHRoZSBzdGF0ZSBpcyBub3QgbGlua2VkLiBNYXliZSB0aGUgdXNlciBzd2l0Y2hlZCB0bwogCSAqIGFkLWhvYyBtb2RlIGp1c3QgYWZ0ZXIgYmVpbmcgaW4gbW9uaXRvciBtb2RlLCBvciBqdXN0IGFmdGVyCkBAIC0yMjAzLDEzICsxOTU4LDEyIEBACiAJCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhpZWVlKTsKIAogCS8qIHRoZSBuZXR3b3JrIGRlZmluaXRpdmVseSBpcyBub3QgaGVyZS4uIGNyZWF0ZSBhIG5ldyBjZWxsICovCi0JaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSB7CiAJCXByaW50aygiY3JlYXRpbmcgbmV3IElCU1MgY2VsbFxuIik7Ci0JCWlmKCFpZWVlLT53YXBfc2V0KQorCQlpZiAoIWllZWUtPndhcF9zZXQpCiAJCQlpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoaWVlZSk7CiAKLQkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7Ci0KKwkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pIHsKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSA0OwogCiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKQEAgLTIyMTcsMTAgKzE5NzEsMTAgQEAKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1syXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COwogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzNdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COwogCi0JCX1lbHNlCisJCX0gZWxzZQogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDA7CiAKLQkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pIHsKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSA4OwogCiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV82TUI7CkBAIC0yMjMzLDE5ICsxOTg3LDE4IEBACiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbN10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV81NE1COwogCiAJCQlpZWVlLT5yYXRlID0gNTQwOwotCQl9ZWxzZXsKKwkJfSBlbHNlIHsKIAkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSAwOwogCQkJaWVlZS0+cmF0ZSA9IDExMDsKIAkJfQogCi0JCS8vIEJ5IGRlZmF1bHQsIFdNTSBmdW5jdGlvbiB3aWxsIGJlIGRpc2FibGVkIGluIElCU1MgbW9kZQorCQkvKiBCeSBkZWZhdWx0LCBXTU0gZnVuY3Rpb24gd2lsbCBiZSBkaXNhYmxlZCBpbiBJQlNTIG1vZGUgKi8KIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUgPSAwOwogCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyA9IDA7CiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7Ci0JCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCWlmIChpZWVlLT5zaG9ydF9zbG90KQogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1Q7Ci0KIAl9CiAKIAlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CkBAIC0yMjY0LDYgKzIwMTcsNyBAQAogCiAJdXAoJmllZWUtPnd4X3NlbSk7CiB9CisKIGlubGluZSB2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnN0YXJ0X2lic3Nfd3EsIDEwMCk7CkBAIC0yMjczLDE5ICsyMDI3LDE1IEBACiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvLwotCS8vIFJlZjogODAyLjExZCAxMS4xLjMuMwotCS8vIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUgaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KLQkvLwotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCi0JewotCQlpZighIGllZWUtPmJHbG9iYWxEb21haW4pCi0JCXsKKwkvKiBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKKwkgKiBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lCisJICogaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KKwkgKi8KKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSAmJiAhSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkgeworCQlpZiAoIWllZWUtPmJHbG9iYWxEb21haW4pCiAJCQlyZXR1cm47Ci0JCX0KIAl9Ci0JLyogY2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGZvdW5kIHRoZSBuZXQgd2UKLQkgKiBhcmUgaW50ZXJlc3RlZCBpbiAoaWYgYW55KS4KKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgZm91bmQgdGhlIG5ldCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAoaWYgYW55KS4KIAkgKiBpZiBub3QgKHdlIGFyZSBkaXNhc3NvY2lhdGVkIGFuZCB3ZSBhcmUgbm90CiAJICogaW4gYXNzb2NpYXRpbmcgLyBhdXRoZW50aWNhdGluZyBwaGFzZSkgc3RhcnQgdGhlIGJhY2tncm91bmQgc2Nhbm5pbmcuCiAJICovCkBAIC0yMzAwLDE0ICsyMDUwLDEwIEBACiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotLy8jaWZkZWYgRU5BQkxFX0lQUwotLy8JcHJpbnRrKCJzdGFydCBic3MgRU5BQkxFX0lQU1xuIik7Ci0vLyNlbHNlCi0JaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSB7CiAJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKIAkJaWVlZTgwMjExX3J0bF9zdGFydF9zY2FuKGllZWUpOwogCX0KLS8vI2VuZGlmCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC0yMzIyLDcgKzIwNjgsNyBAQAogCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKIAkJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CiAKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCQlEb3QxMWRfUmVzZXQoaWVlZSk7CiAKIAlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOwpAQCAtMjMzNyw5ICsyMDgzLDkgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9yZXRyeV93cSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlkb3duKCZpZWVlLT53eF9zZW0pOwotCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkKIAkJZ290byBleGl0OwotCWlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWSkKKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZKQogCQlnb3RvIGV4aXQ7CiAJLyogdW50aWwgd2UgZG8gbm90IHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX05PTElOSwogCSogdGhlcmUgYXJlIG5vIHBvc3NpYmlsaXR5IHRvIGhhdmUgc29tZW9uZSBlbHNlIHRyeWluZwpAQCAtMjM2MCwxNyArMjEwNiwxMyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSB7CiAJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOwogCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7CiAJCWllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihpZWVlKTsKIAl9Ci0JLy9ZSixhZGQsMDgwODI4LCBub3RpZnkgb3MgaGVyZQotCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCi0JeworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQogCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7Ci0JfQotCS8vWUosYWRkLDA4MDgyOCxlbmQKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKIGV4aXQ6CkBAIC0yMzc5LDcgKzIxMjEsNyBAQAogCiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb25fKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCXU4IGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCXU4IGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CiAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOwpAQCAtMjM5Miw3ICsyMTM0LDYgQEAKIAliLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CiAKIAlyZXR1cm4gc2tiOwotCiB9CiAKIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKQEAgLTI0MDEsNyArMjE0Miw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYjsKIAogCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKLQlpZighc2tiKQorCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKIAogCWIgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CkBAIC0yNDIzLDcgKzIxNjQsNiBAQAogCXVwKCZpZWVlLT53eF9zZW0pOwogfQogCi0KIHZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKQpAQCAtMjQzMiw5ICsyMTcyLDkgQEAKIAlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKIAogCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKLQlpZigoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSYmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKSB7Ci0JCVNlbmREaXNhc3NvY2lhdGlvbihpZWVlLE5VTEwsV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUKTsKLQl9CisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkKKwkJU2VuZERpc2Fzc29jaWF0aW9uKGllZWUsIE5VTEwsIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCk7CisKIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnN0YXJ0X2lic3Nfd3EpOwpAQCAtMjQ1NCwzNiArMjE5NCwzNSBAQAogdm9pZCBpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc2hvcnQgY2ggPSAwOwotIAlpbnQgaSA9IDA7CisJaW50IGkgPSAwOwogCiAJaWYgKGllZWUtPnByb3RvX3N0YXJ0ZWQpCiAJCXJldHVybjsKIAogCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAxOwogCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApewotCQlkb3sKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMCkgeworCQlkbyB7CiAJCQljaCsrOwogCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQogCQkJCXJldHVybjsgLyogbm8gY2hhbm5lbCBmb3VuZCAqLwogCi0JCX13aGlsZSghR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaF0pOworCQl9IHdoaWxlICghR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaF0pOwogCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7CiAJfQogCiAJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPT0gMCkKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IDEwMDsKLQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwogCi0gICAgICAgCWZvcihpID0gMDsgaSA8IDE3OyBpKyspIHsKLQkgIGllZWUtPmxhc3RfcnhzZXFfbnVtW2ldID0gLTE7Ci0JICBpZWVlLT5sYXN0X3J4ZnJhZ19udW1baV0gPSAtMTsKLQkgIGllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKSB7CisJCWllZWUtPmxhc3RfcnhzZXFfbnVtW2ldID0gLTE7CisJCWllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOworCQlpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKIAl9CiAKLQlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOy8vcmVpbml0aWFsaXplIEFDX3h4X1BBUkFNIHJlZ2lzdGVycy4KLQorCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDA7IC8qIHJlaW5pdGlhbGl6ZSBBQ194eF9QQVJBTSByZWdpc3RlcnMuICovCiAKIAkvKiBpZiB0aGUgdXNlciBzZXQgdGhlIE1BQyBvZiB0aGUgYWQtaG9jIGNlbGwgYW5kIHRoZW4KIAkgKiBzd2l0Y2ggdG8gbWFuYWdlZCBtb2RlLCBzaGFsbCB3ZSAgbWFrZSBzdXJlIHRoYXQgYXNzb2NpYXRpb24KQEAgLTI0OTMsNyArMjIzMiw3IEBACiAJc3dpdGNoIChpZWVlLT5pd19tb2RlKSB7CiAJCWNhc2UgSVdfTU9ERV9BVVRPOgogCQkJaWVlZS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7Ci0JCQkvL25vdCBzZXQgYnJlYWsgaGVyZSBpbnRlbnRpb25seQorCQkJLyogbm90IHNldCBicmVhayBoZXJlIGludGVudGlvbmx5ICovCiAJCWNhc2UgSVdfTU9ERV9JTkZSQToKIAkJCWllZWU4MDIxMV9zdGFydF9ic3MoaWVlZSk7CiAJCQlicmVhazsKQEAgLTI1MTcsNyArMjI1Niw2IEBACiAJfQogfQogCi0KICNkZWZpbmUgRFJWX05BTUUgICJJZWVlODAyMTEiCiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CkBAIC0yNTI2LDM2ICsyMjY0LDI5IEBACiAKIAlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CiAJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwotCWZvcihpID0gMDsgaSA8IDU7IGkrKykgewotCSAgaWVlZS0+c2VxX2N0cmxbaV0gPSAwOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlpZWVlLT5zZXFfY3RybFtpXSA9IDA7CiAKIAlpZWVlLT5hc3NvY19pZCA9IDA7CiAJaWVlZS0+cXVldWVfc3RvcCA9IDA7CiAJaWVlZS0+c2Nhbm5pbmcgPSAwOwotCWllZWUtPnNvZnRtYWNfZmVhdHVyZXMgPSAwOyAvL3NvIElFRUUyMTAwLWxpa2UgZHJpdmVyIGFyZSBoYXBweQorCWllZWUtPnNvZnRtYWNfZmVhdHVyZXMgPSAwOyAvKiBzbyBJRUVFMjEwMC1saWtlIGRyaXZlciBhcmUgaGFwcHkgKi8KIAlpZWVlLT53YXBfc2V0ID0gMDsKIAlpZWVlLT5zc2lkX3NldCA9IDA7CiAJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDA7CiAJaWVlZS0+YmFzaWNfcmF0ZSA9IElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEU7CiAJaWVlZS0+cmF0ZSA9IDM7Ci0vLyNpZmRlZiBFTkFCTEVfTFBTCiAJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfTUJDQVNUfElFRUU4MDIxMV9QU19VTklDQVNUOwotLy8jZWxzZQotLy8JaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7Ci0vLyNlbmRpZgogCWllZWUtPnN0YV9zbGVlcCA9IDA7Ci0vL2J5IGFteQogCWllZWUtPmJJbmFjdGl2ZVBzID0gZmFsc2U7CiAJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKIAlpZWVlLT5MaXN0ZW5JbnRlcnZhbCA9IDI7Ci0JaWVlZS0+TnVtUnhEYXRhSW5QZXJpb2QgPSAwOyAvL1lKLGFkZCwwODA4MjgKLQlpZWVlLT5OdW1SeEJjbkluUGVyaW9kID0gMDsgLy9ZSixhZGQsMDgwODI4Ci0JaWVlZS0+TnVtUnhPa1RvdGFsID0gMDsvLytieSBhbXkgMDgwMzEyCi0JaWVlZS0+TnVtUnhVbmljYXN0ID0gMDsvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUKKwlpZWVlLT5OdW1SeERhdGFJblBlcmlvZCA9IDA7CisJaWVlZS0+TnVtUnhCY25JblBlcmlvZCA9IDA7CisJaWVlZS0+TnVtUnhPa1RvdGFsID0gMDsKKwlpZWVlLT5OdW1SeFVuaWNhc3QgPSAwOyAvKiBmb3Iga2VlcCBhbGl2ZSAqLwogCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOwogCWllZWUtPmJId1JhZGlvT2ZmID0gZmFsc2U7Ci0vL2J5IGFteQogCiAJaW5pdF9tZ210X3F1ZXVlKGllZWUpOwogCkBAIC0yNTcxLDEzICsyMzAyLDEyIEBACiAKIAlpZWVlLT53cSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUpOwogCi0JSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnN0YXJ0X2lic3Nfd3EsKHZvaWQqKSBpZWVlODAyMTFfc3RhcnRfaWJzc193cSk7Ci0JSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKLQlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKTsKLQlJTklUX1dPUksoJmllZWUtPnd4X3N5bmNfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3EpOwotLy8JSU5JVF9XT1JLKCZpZWVlLT53YXRjaF9kb2dfd3EsKHZvaWQqKSBpZWVlODAyMTFfd2F0Y2hfZG9nX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c3RhcnRfaWJzc193cSwgKHZvaWQgKikgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCAodm9pZCAqKSBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsICh2b2lkICopIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c29mdG1hY19zY2FuX3dxLCAodm9pZCAqKSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCAodm9pZCAqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKTsKKwlJTklUX1dPUksoJmllZWUtPnd4X3N5bmNfc2Nhbl93cSwgKHZvaWQgKikgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSk7CiAKIAlzZW1hX2luaXQoJmllZWUtPnd4X3NlbSwgMSk7CiAJc2VtYV9pbml0KCZpZWVlLT5zY2FuX3NlbSwgMSk7CkBAIC0yNTk4LDggKzIzMjgsNyBAQAogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CiAKLQotCS8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCS8qIGFkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2YgKi8KIAljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSk7CiAKIAlkZXN0cm95X3dvcmtxdWV1ZShpZWVlLT53cSk7CkBAIC0yNjA3LDIyICsyMzM2LDE2IEBACiAJdXAoJmllZWUtPnd4X3NlbSk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RhcnQgb2YgV1BBIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiB0aGlzIGlzIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlciAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCisvKiBTdGFydCBvZiBXUEEgY29kZS4gVGhpcyBpcyBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIgICovCiBzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCiB7CiAJLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3cGFfc3VwcGxpY2FudCBsb2FkcyBhbmQgY2xvc2VzIHRoZSBkcml2ZXIKIAkgKiBpbnRlcmZhY2UuICovCi0JcHJpbnRrKCIlcyBXUEFcbiIsdmFsdWUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworCXByaW50aygiJXMgV1BBXG4iLCB2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CiAJaWVlZS0+d3BhX2VuYWJsZWQgPSB2YWx1ZTsKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfd3BhX2Fzc29jX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBjaGFyICp3cGFfaWUsCiAJCQkgICAgICAgaW50IHdwYV9pZV9sZW4pCiB7CkBAIC0yNjMyLDE2ICsyMzU1LDE0IEBACiAJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKIH0KIAotCiBzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGNvbW1hbmQsCiAJCQkgICAgICBpbnQgcmVhc29uKQogewotCiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKGNvbW1hbmQpIHsKIAljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgotCQkvLyBzaWxlbnRseSBpZ25vcmUKKwkJLyogc2lsZW50bHkgaWdub3JlICovCiAJCWJyZWFrOwogCiAJY2FzZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DOgpAQCAtMjY1Niw3ICsyMzc3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJCSAgICBzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW0sIGludCBwbGVuKQogewpAQCAtMjY5MCw3ICsyNDEwLDYgQEAKIAogc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKIHsKLQogCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0gewogCQkuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAogCX07CkBAIC0yNzE1LDcgKzI0MzQsNyBAQAogc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggbmFtZSwKIAkJCQkgICB1MzIgdmFsdWUpCiB7Ci0JaW50IHJldD0wOworCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzd2l0Y2ggKG5hbWUpIHsKQEAgLTI3MjQsNyArMjQ0Myw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBJRUVFX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgotCQlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcz12YWx1ZTsKKwkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSB2YWx1ZTsKIAkJYnJlYWs7CiAKIAljYXNlIElFRUVfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRDogewpAQCAtMjc0MywxNSArMjQ2MiwxNCBAQAogCQkJLmZsYWdzID0gU0VDX0VOQUJMRUQsCiAJCQkuZW5hYmxlZCA9IHZhbHVlLAogCQl9OwotIAkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IHZhbHVlOworCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gdmFsdWU7CiAJCS8qIFdlIG9ubHkgY2hhbmdlIFNFQ19MRVZFTCBmb3Igb3BlbiBtb2RlLiBPdGhlcnMKIAkJICogYXJlIHNldCBieSBpcHdfd3BhX3NldF9lbmNyeXB0aW9uLgogCQkgKi8KIAkJaWYgKCF2YWx1ZSkgewogCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOwogCQl9CkBAIC0yNzYxLDI3ICsyNDc5LDIyIEBACiAJfQogCiAJY2FzZSBJRUVFX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRDoKLQkJaWVlZS0+cHJpdmFjeV9pbnZva2VkPXZhbHVlOworCQlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSB2YWx1ZTsKIAkJYnJlYWs7Ci0KIAljYXNlIElFRUVfUEFSQU1fQVVUSF9BTEdTOgogCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3MoaWVlZSwgdmFsdWUpOwogCQlicmVhazsKLQogCWNhc2UgSUVFRV9QQVJBTV9JRUVFXzgwMl8xWDoKLQkJaWVlZS0+aWVlZTgwMl8xeD12YWx1ZTsKKwkJaWVlZS0+aWVlZTgwMl8xeCA9IHZhbHVlOwogCQlicmVhazsKIAljYXNlIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1Q6Ci0JCS8vIGFkZGVkIGZvciBXUEEyIG1peGVkIG1vZGUKLQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+d3BheCB2YWx1ZSA9ICV4XG4iLCB2YWx1ZSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLCBmbGFncyk7CiAJCWllZWUtPndwYXhfdHlwZV9zZXQgPSAxOwogCQlpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID0gdmFsdWU7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jaywgZmxhZ3MpOwogCQlicmVhazsKLQogCWRlZmF1bHQ6Ci0JCXByaW50aygiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLG5hbWUpOworCQlwcmludGsoIlVua25vd24gV1BBIHBhcmFtOiAlZFxuIiwgbmFtZSk7CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCX0KIApAQCAtMjgyMyw4ICsyNTM2LDcgQEAKIAlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwKSB7CiAJCWlmIChjcnlwdCkgewogCQkJc2VjLmVuYWJsZWQgPSAwOwotCQkJLy8gRklYTUUgRklYTUUKLQkJCS8vc2VjLmVuY3J5cHQgPSAwOworCQkJLyogRklYTUUgRklYTUUgKi8KIAkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOwogCQkJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEIHwgU0VDX0xFVkVMOwogCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKQEAgLTI4MzIsOCArMjU0NCw3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAJc2VjLmVuYWJsZWQgPSAxOwotLy8gRklYTUUgRklYTUUKLS8vCXNlYy5lbmNyeXB0ID0gMTsKKwkvKiBGSVhNRSBGSVhNRSAqLwogCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKIAogCS8qIElQVyBIVyBjYW5ub3QgYnVpbGQgVEtJUCBNSUMsIGhvc3QgZGVjcnlwdGlvbiBzdGlsbCBuZWVkZWQuICovCkBAIC0yOTQyLDEyICsyNjUzLDExIEBACiAJCQkJICAgc3RydWN0IGl3X3BvaW50ICpwKQogewogCXN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbTsKLQlpbnQgcmV0PTA7CisJaW50IHJldCA9IDA7CiAKIAlkb3duKCZpZWVlLT53eF9zZW0pOwotCS8vSUVFRV9ERUJVR19JTkZPKCJ3cGFfc3VwcGxpY2FudDogbGVuPSVkXG4iLCBwLT5sZW5ndGgpOwogCi0JaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpeworCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI5NTksMjcgKzI2NjksMjIgQEAKIAl9CiAKIAlzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKLQogCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9QQVJBTToKIAkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oaWVlZSwgcGFyYW0tPnUud3BhX3BhcmFtLm5hbWUsCiAJCQkJCXBhcmFtLT51LndwYV9wYXJhbS52YWx1ZSk7CiAJCWJyZWFrOwotCiAJY2FzZSBJRUVFX0NNRF9TRVRfV1BBX0lFOgogCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF93cGFfaWUoaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CiAJCWJyZWFrOwotCiAJY2FzZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTjoKIAkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfZW5jcnlwdGlvbihpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKIAkJYnJlYWs7Ci0KIAljYXNlIElFRUVfQ01EX01MTUU6CiAJCXJldCA9IGllZWU4MDIxMV93cGFfbWxtZShpZWVlLCBwYXJhbS0+dS5tbG1lLmNvbW1hbmQsCiAJCQkJICAgcGFyYW0tPnUubWxtZS5yZWFzb25fY29kZSk7CiAJCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLHBhcmFtLT5jbWQpOworCQlwcmludGsoIlVua25vd24gV1BBIHN1cHBsaWNhbnQgcmVxdWVzdDogJWRcbiIsIHBhcmFtLT5jbWQpOwogCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwppbmRleCAzYjc5NTVmLi4wN2MzZjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtMSwzOCArMSwzOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoKKyAqICBDb3B5cmlnaHQoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGJhc2VkIG9uIHRoZSBXRVAgZW5hYmxlbWVudCBjb2RlIHByb3ZpZGVkIGJ5IHRoZQorICogSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqLwogCi0gIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCi0gIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKLSAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCi0gIDxqa21hbGluZUBjYy5odXQuZmk+Ci0gIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+Ci0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAgZmlsZSBjYWxsZWQgTElDRU5TRS4KLQotICBDb250YWN0IEluZm9ybWF0aW9uOgotICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiBzdGF0aWMgY29uc3QgY2hhciAqaWVlZTgwMjExX21vZGVzW10gPSB7CkBAIC01NCw3ICs1NCw3IEBACiAJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CiAJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBuZXR3b3JrLT5ic3NpZCk7CiAJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwogCiAJLyogUmVtYWluaW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIHByb3ZpZGUgdGhlbSAqLwpAQCAtNjIsMTcgKzYyLDEzIEBACiAJLyogQWRkIHRoZSBFU1NJRCAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CiAJaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0JLy9ZSixtb2RpZmllZCwwODA5MDMsZm9yIGhpZGRlbiBhcAotCS8vaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19FTVBUWV9FU1NJRCkgewogCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA9PSAwKSB7Ci0JLy9ZSixtb2RpZmllZCwwODA5MDMsZW5kCiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOwogCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKIAl9IGVsc2UgewotCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5zc2lkX2xlbiwgKHU4KTMyKTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW5fdCh1OCwgbmV0d29yay0+c3NpZF9sZW4sIDMyKTsKIAkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CiAJfQotCS8vcHJpbnRrKCJFU1NJRDogJXNcbiIsbmV0d29yay0+c3NpZCk7CiAJLyogQWRkIHRoZSBwcm90b2NvbCBuYW1lICovCiAJaXdlLmNtZCA9IFNJT0NHSVdOQU1FOwogCXNucHJpbnRmKGl3ZS51Lm5hbWUsIElGTkFNU0laLCAiSUVFRSA4MDIuMTElcyIsIGllZWU4MDIxMV9tb2Rlc1tuZXR3b3JrLT5tb2RlXSk7CkBAIC05Miw4ICs4OCw2IEBACiAKIAkvKiBBZGQgZnJlcXVlbmN5L2NoYW5uZWwgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7Ci0vKglpd2UudS5mcmVxLm0gPSBpZWVlODAyMTFfZnJlcXVlbmN5KG5ldHdvcmstPmNoYW5uZWwsIG5ldHdvcmstPm1vZGUpOwotCWl3ZS51LmZyZXEuZSA9IDM7ICovCiAJaXdlLnUuZnJlcS5tID0gbmV0d29yay0+Y2hhbm5lbDsKIAlpd2UudS5mcmVxLmUgPSAwOwogCWl3ZS51LmZyZXEuaSA9IDA7CkBAIC0xNDUsMTAgKzEzOSw5IEBACiAJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLwogCS8qIFRPRE86IEZpeCB0aGVzZSB2YWx1ZXMuLi4gKi8KIAlpZiAobmV0d29yay0+c3RhdHMuc2lnbmFsID09IDAgfHwgbmV0d29yay0+c3RhdHMucnNzaSA9PSAwKQotCQlwcmludGsoIj09PT09PT09PnNpZ25hbDolZCwgcnNzaTolZFxuIiwgbmV0d29yay0+c3RhdHMuc2lnbmFsLAotCQkgICAgICAgbmV0d29yay0+c3RhdHMucnNzaSk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIj09PT09PT09PnNpZ25hbDolZCwgcnNzaTolZFxuIiwKKwkJCSAgICBuZXR3b3JrLT5zdGF0cy5zaWduYWwsIG5ldHdvcmstPnN0YXRzLnJzc2kpOwogCWl3ZS5jbWQgPSBJV0VWUVVBTDsKLS8vCXByaW50aygiU0lHTkFMOiAlZCxSU1NJOiAlZCxOT0lTRTogJWRcbiIsbmV0d29yay0+c3RhdHMuc2lnbmFsLG5ldHdvcmstPnN0YXRzLnJzc2ksbmV0d29yay0+c3RhdHMubm9pc2UpOwogCWl3ZS51LnF1YWwucXVhbCA9IG5ldHdvcmstPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOwogCWl3ZS51LnF1YWwubGV2ZWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWw7CiAJaXdlLnUucXVhbC5ub2lzZSA9IG5ldHdvcmstPnN0YXRzLm5vaXNlOwpAQCAtMTcxLDcgKzE2NCw2IEBACiAKIAltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCWlmIChuZXR3b3JrLT53cGFfaWVfbGVuKSB7Ci0JLy8JcHJpbnRrKCJ3cGFfaWVfbGVuOiVkXG4iLCBuZXR3b3JrLT53cGFfaWVfbGVuKTsKIAkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOwogCQltZW1jcHkoYnVmLCBuZXR3b3JrLT53cGFfaWUsIG5ldHdvcmstPndwYV9pZV9sZW4pOwogCQlpd2UuY21kID0gSVdFVkdFTklFOwpAQCAtMTgxLDcgKzE3Myw2IEBACiAKIAltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCWlmIChuZXR3b3JrLT5yc25faWVfbGVuKSB7Ci0JLy8JcHJpbnRrKCI9PT09PT5yc25faWVfbGVuOlxuIiwgbmV0d29yay0+cnNuX2llX2xlbik7CiAJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOXTsKIAkJbWVtY3B5KGJ1ZiwgbmV0d29yay0+cnNuX2llLCBuZXR3b3JrLT5yc25faWVfbGVuKTsKIAkJaXdlLmNtZCA9IElXRVZHRU5JRTsKQEAgLTE5MCw3ICsxODEsOCBAQAogCX0KIAogCS8qIEFkZCBFWFRSQTogQWdlIHRvIGRpc3BsYXkgc2Vjb25kcyBzaW5jZSBsYXN0IGJlYWNvbi9wcm9iZSByZXNwb25zZQotCSAqIGZvciBnaXZlbiBuZXR3b3JrLiAqLworCSAqIGZvciBnaXZlbiBuZXR3b3JrLgorCSAqLwogCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOwogCXAgPSBjdXN0b207CiAJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKQEAgLTIxMCw4ICsyMDIsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IDA7CiAJY2hhciAqZXYgPSBleHRyYTsKLQljaGFyICpzdG9wID0gZXYgKyB3cnF1LT5kYXRhLmxlbmd0aDsvL0lXX1NDQU5fTUFYX0RBVEE7Ci0JLy9jaGFyICpzdG9wID0gZXYgKyBJV19TQ0FOX01BWF9EQVRBOworCWNoYXIgKnN0b3AgPSBldiArIHdycXUtPmRhdGEubGVuZ3RoOwogCWludCBpID0gMDsKIAogCUlFRUU4MDIxMV9ERUJVR19XWCgiR2V0dGluZyBzY2FuXG4iKTsKQEAgLTI4Nyw3ICsyNzgsOCBAQAogCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbi5cbiIpOwogCiAJCS8qIENoZWNrIGFsbCB0aGUga2V5cyB0byBzZWUgaWYgYW55IGFyZSBzdGlsbCBjb25maWd1cmVkLAotCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbCAqLworCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbC4KKwkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CiAJCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkgewogCQkJCWlmIChrZXlfcHJvdmlkZWQpCkBAIC0zMDYsMTUgKzI5OCwxNCBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0KLQogCXNlYy5lbmFibGVkID0gMTsKIAlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CiAKIAlpZiAoKmNyeXB0ICE9IE5VTEwgJiYgKCpjcnlwdCktPm9wcyAhPSBOVUxMICYmCiAJICAgIHN0cmNtcCgoKmNyeXB0KS0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgewogCQkvKiBjaGFuZ2luZyB0byB1c2UgV0VQOyBkZWluaXQgcHJldmlvdXNseSB1c2VkIGFsZ29yaXRobQotCQkgKiBvbiB0aGlzIGtleSAqLworCQkgKiBvbiB0aGlzIGtleS4KKwkJICovCiAJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CiAJfQogCkBAIC0zNTksMTAgKzM1MCwxMSBAQAogCQkJCSAgICAgICAoKmNyeXB0KS0+cHJpdik7CiAJCXNlYy5mbGFncyB8PSAoMSA8PCBrZXkpOwogCQkvKiBUaGlzIGVuc3VyZXMgYSBrZXkgd2lsbCBiZSBhY3RpdmF0ZWQgaWYgbm8ga2V5IGlzCi0JCSAqIGV4cGxpY2l0bHkgc2V0ICovCisJCSAqIGV4cGxpY2l0bHkgc2V0LgorCQkgKi8KIAkJaWYgKGtleSA9PSBzZWMuYWN0aXZlX2tleSkKIAkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKLQkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5Oy8vYnkgd2IgMDgwMzEyCisJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKIAl9IGVsc2UgewogCQlsZW4gPSAoKmNyeXB0KS0+b3BzLT5nZXRfa2V5KHNlYy5rZXlzW2tleV0sIFdFUF9LRVlfTEVOLAogCQkJCQkgICAgIE5VTEwsICgqY3J5cHQpLT5wcml2KTsKQEAgLTM5NSw3ICszODcsOCBAQAogCQkJICAgIk9QRU4iIDogIlNIQVJFRCBLRVkiKTsKIAogCS8qIEZvciBub3cgd2UganVzdCBzdXBwb3J0IFdFUCwgc28gb25seSBzZXQgdGhhdCBzZWN1cml0eSBsZXZlbC4uLgotCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlICovCisJICogVE9ETzogV2hlbiBXUEEgaXMgYWRkZWQgdGhpcyBpcyBvbmUgcGxhY2UgdGhhdCBuZWVkcyB0byBjaGFuZ2UKKwkgKi8KIAlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOyAvKiA0MCBhbmQgMTA0IGJpdCBXRVAgKi8KIApAQCAtNDA2LDcgKzM5OSw4IEBACiAJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZwogCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCiAJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCi0JICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4KKwkgKi8KIAlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCiAJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgogCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgewpAQCAtNDQ4LDcgKzQ0Miw4IEBACiAKIAlpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CiAJCS8qIG9ubHkgV0VQIGlzIHN1cHBvcnRlZCB3aXRoIHdpcmVsZXNzIGV4dGVuc2lvbnMsIHNvIGp1c3QKLQkJICogcmVwb3J0IHRoYXQgZW5jcnlwdGlvbiBpcyB1c2VkICovCisJCSAqIHJlcG9ydCB0aGF0IGVuY3J5cHRpb24gaXMgdXNlZC4KKwkJICovCiAJCWVycS0+bGVuZ3RoID0gMDsKIAkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKIAkJcmV0dXJuIDA7CkBAIC00ODMsNyArNDc4LDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKIAkJLmZsYWdzID0gMCwKIAl9OwotCS8vcHJpbnRrKCI9PT09PT0+ZW5jb2RpbmcgZmxhZzoleCxleHQgZmxhZzoleCwgZXh0IGFsZzolZFxuIiwgZW5jb2RpbmctPmZsYWdzLGV4dC0+ZXh0X2ZsYWdzLCBleHQtPmFsZyk7CiAJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwogCWlmIChpZHgpIHsKIAkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCkBAIC00OTcsNyArNDkxLDYgQEAKIAkJZ3JvdXBfa2V5ID0gMTsKIAl9IGVsc2UgewogCQkvKiBzb21lIENpc2NvIEFQcyB1c2UgaWR4PjAgZm9yIHVuaWNhc3QgaW4gZHluYW1pYyBXRVAgKi8KLQkJLy9wcmludGsoIm5vdCBncm91cCBrZXksIGZsYWdzOiV4LCBleHQtPmFsZzolZFxuIiwgZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKIAkJaWYgKGlkeCAhPSAwICYmIGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCkBAIC01MDYsNyArNDk5LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsvLyB8IFNFQ19FTkNSWVBUOworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKIAlpZiAoKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgfHwKIAkgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19OT05FKSB7CiAJCWlmICgqY3J5cHQpCkBAIC01MTgsMTYgKzUxMSwxMyBAQAogCiAJCWlmIChpID09IFdFUF9LRVlTKSB7CiAJCQlzZWMuZW5hYmxlZCA9IDA7Ci0JCQkvLyBzZWMuZW5jcnlwdCA9IDA7CiAJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKIAkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CiAJCX0KLQkJLy9wcmludGsoImRpc2FibGVkOiBmbGFnOiV4XG4iLCBlbmNvZGluZy0+ZmxhZ3MpOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJc2VjLmVuYWJsZWQgPSAxOwotICAgIC8vICAgIHNlYy5lbmNyeXB0ID0gMTsKIAogCXN3aXRjaCAoZXh0LT5hbGcpIHsKIAljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgpAQCAtNTQ1LDcgKzUzNSw2IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKIAl9Ci0vLwlwcmludGsoIjgtMDktMDgtOT09PT09PiVzLCBhbGcgbmFtZTolc1xuIixfX2Z1bmNfXywgYWxnKTsKIAogCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOwogCWlmIChvcHMgPT0gTlVMTCkKQEAgLTU1Myw3ICs1NDIsOCBAQAogCWlmIChvcHMgPT0gTlVMTCkgewogCQlJRUVFODAyMTFfREVCVUdfV1goIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCiAJCQkJICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7Ci0JCXByaW50aygiPT09PT09PT0+dW5rbm93biBjcnlwdG8gYWxnICVkXG4iLCBleHQtPmFsZyk7CisJCW5ldGRldl9lcnIoaWVlZS0+ZGV2LCAiPT09PT09PT0+dW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAorCQkJICAgZXh0LT5hbGcpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtNTg0LDEzICs1NzQsMTEgQEAKIAkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShleHQtPmtleSwgZXh0LT5rZXlfbGVuLCBleHQtPnJ4X3NlcSwKIAkJCQkgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7CiAJCUlFRUU4MDIxMV9ERUJVR19XWCgiJXM6IGtleSBzZXR0aW5nIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKLQkJcHJpbnRrKCJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOworCQluZXRkZXZfZXJyKGllZWUtPmRldiwgImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKIAl9CiAjaWYgMQotIC8vc2tpcF9ob3N0X2NyeXB0OgotCS8vcHJpbnRrKCJza2lwX2hvc3RfY3J5cHQ6ZXh0X2ZsYWdzOiV4XG4iLCBleHQtPmV4dF9mbGFncyk7CiAJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7CiAJCWllZWUtPnR4X2tleWlkeCA9IGlkeDsKIAkJc2VjLmFjdGl2ZV9rZXkgPSBpZHg7CkBAIC02MDIsMTUgKzU5MCwxMiBAQAogCQlzZWMua2V5X3NpemVzW2lkeF0gPSBleHQtPmtleV9sZW47CiAJCXNlYy5mbGFncyB8PSAoMSA8PCBpZHgpOwogCQlpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19XRVApIHsKLQkJICAgICAgLy8gIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX1dFUDsKIAkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CiAJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKIAkJfSBlbHNlIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1RLSVApIHsKLQkJICAgICAgLy8gIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX1RLSVA7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzI7CiAJCX0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSB7Ci0JCSAgICAgICAvLyBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19DQ01QOwogCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8zOwogCQl9CkBAIC02MzIsMjAgKzYxNywxOSBAQAogCiAJcmV0dXJuIHJldDsKIH0KKwogaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKikgZXh0cmE7Ci0vLwlwcmludGsoIlxuZGtnYWRmc2xrZGpnYWxza2RmPT09PT09PT09PT09PT09PiVzKCksIGNtZDoleFxuIiwgX19mdW5jX18sIG1sbWUtPmNtZCk7CiAjaWYgMQogCXN3aXRjaCAobWxtZS0+Y21kKSB7CiAJY2FzZSBJV19NTE1FX0RFQVVUSDoKIAljYXNlIElXX01MTUVfRElTQVNTT0M6Ci0JLy8JcHJpbnRrKCJkaXNhc3NvYyBub3dcbiIpOwogCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOwogCQlicmVhazsKLQkgZGVmYXVsdDoKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogI2VuZGlmCkBAIC02NTYsMjQgKzY0MCwxNiBAQAogCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQogewotLyoKLQkgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7Ci0JCS5mbGFncyA9IFNFQ19BVVRIX01PREUsCi0JfQotKi8KLQkvL3ByaW50aygic2V0IGF1dGg6ZmxhZzoleCwgZGF0YSB2YWx1ZToleFxuIiwgZGF0YS0+ZmxhZ3MsIGRhdGEtPnZhbHVlKTsKIAlzd2l0Y2ggKGRhdGEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgewogCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKLQkgICAgIC8qbmVlZCB0byBzdXBwb3J0IHdwYTIgaGVyZSovCi0JCS8vcHJpbnRrKCJ3cGEgdmVyc2lvbjoleFxuIiwgZGF0YS0+dmFsdWUpOworCQkvKiBuZWVkIHRvIHN1cHBvcnQgd3BhMiBoZXJlICovCiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CiAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6Ci0JCS8qCi0gKiAgICAgICAgICAgICAgICAgICogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgdG8gY29udHJvbCB0aGVtIGludGVybmFsbHkuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkvKiBIb3N0IEFQIGRyaXZlciBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgYWxsb3dzCisJCSAqIHdwYV9zdXBwbGljYW50IHRvIGNvbnRyb2wgdGhlbSBpbnRlcm5hbGx5LgorCQkgKi8KIAkJYnJlYWs7CiAJY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgogCQlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IGRhdGEtPnZhbHVlOwpAQCAtNjg0LDEzICs2NjAsMTEgQEAKIAogCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKIAkJaWVlZS0+b3Blbl93ZXAgPSAoZGF0YS0+dmFsdWUmSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pID8gMSA6IDA7Ci0JCS8vcHJpbnRrKCJvcGVuX3dlcDolZFxuIiwgaWVlZS0+b3Blbl93ZXApOwogCQlicmVhazsKIAogI2lmIDEKIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CiAJCWllZWUtPndwYV9lbmFibGVkID0gKGRhdGEtPnZhbHVlKSA/IDEgOiAwOwotCQkvL3ByaW50aygiZW5hYmxlIHdwYTolZFxuIiwgaWVlZS0+d3BhX2VuYWJsZWQpOwogCQlicmVhazsKIAogI2VuZGlmCkBAIC03MTIsMTMgKzY4NiwxMyBAQAogCXU4ICpidWYgPSBOVUxMOwogCiAJaWYgKGxlbiA+IE1BWF9XUEFfSUVfTEVOIHx8IChsZW4gJiYgaWUgPT0gTlVMTCkpIHsKLQkJcHJpbnRrKCJyZXR1cm4gZXJyb3Igb3V0LCBsZW46JXp1XG4iLCBsZW4pOworCQluZXRkZXZfZXJyKGllZWUtPmRldiwgInJldHVybiBlcnJvciBvdXQsIGxlbjolenVcbiIsIGxlbik7CiAJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGxlbikgewogCQlpZiAobGVuICE9IGllWzFdKzIpIHsKLQkJCXByaW50aygibGVuOiV6dSwgaWU6JWRcbiIsIGxlbiwgaWVbMV0pOworCQkJbmV0ZGV2X2VycihpZWVlLT5kZXYsICJsZW46JXp1LCBpZTolZFxuIiwgbGVuLCBpZVsxXSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlidWYgPSBrbWVtZHVwKGllLCBsZW4sIEdGUF9LRVJORUwpOwpAQCAtNzMyLDcgKzcwNiw2IEBACiAJCWllZWUtPndwYV9pZSA9IE5VTEw7CiAJCWllZWUtPndwYV9pZV9sZW4gPSAwOwogCX0KLS8vCXByaW50aygiPD09PT09b3V0ICVzKClcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKaW5kZXggODk5OWVjNi4uOWY5MzFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaApAQCAtMSwxOSArMSwxOCBAQAogLyoKLSAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgotICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+Ci0gICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQotICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgotICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgotCi0gICBXZSB3YW50IHRvIHRoYW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCi0gICBwcm9qZWN0IEF1dGhvcnMuCi0qLworICogVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisgKgorICogUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljCisgKiBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKyAqCisgKiBXZSB3YW50IHRvIHRoYW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QKKyAqIEF1dGhvcnMuCisgKi8KIAogI2lmbmRlZiBSODE4MEgKICNkZWZpbmUgUjgxODBICkBAIC0yMSwxMyArMjAsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2RlZmluZSBSVEw4MTgwX01PRFVMRV9OQU1FICJyODE4MCIKLSNkZWZpbmUgRE1FU0coeCxhLi4uKSBwcmludGsoS0VSTl9JTkZPIFJUTDgxODBfTU9EVUxFX05BTUUgIjogIiB4ICJcbiIsICMjIGEpCi0jZGVmaW5lIERNRVNHVyh4LGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBXVzoiIHggIlxuIiwgIyMgYSkKLSNkZWZpbmUgRE1FU0dFKHgsYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBSVEw4MTgwX01PRFVMRV9OQU1FICI6IEVFOiIgeCAiXG4iLCAjIyBhKQorI2RlZmluZSBETUVTRyh4LCBhLi4uKSBwcmludGsoS0VSTl9JTkZPIFJUTDgxODBfTU9EVUxFX05BTUUgIjogIiB4ICJcbiIsICMjIGEpCisjZGVmaW5lIERNRVNHVyh4LCBhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFJUTDgxODBfTU9EVUxFX05BTUUgIjogV1c6IiB4ICJcbiIsICMjIGEpCisjZGVmaW5lIERNRVNHRSh4LCBhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFJUTDgxODBfTU9EVUxFX05BTUUgIjogRUU6IiB4ICJcbiIsICMjIGEpCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTM2LDIyICszNCwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4JLy9mb3IgcnRubF9sb2NrKCkKKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4gLyogZm9yIHJ0bmxfbG9jaygpICovCiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4JLy8gTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPiAvKiBOZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgdGhlIHByb2MgZnMuICovCiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExL2llZWU4MDIxMS5oIgogI2luY2x1ZGUgPGFzbS9pby5oPgotLy8jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjZGVmaW5lIEVQUk9NXzkzYzQ2IDAKICNkZWZpbmUgRVBST01fOTNjNTYgMQogCi0jZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkJU0lPQ0lXRklSU1RQUklWKzMwCisjZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVCAoU0lPQ0lXRklSU1RQUklWICsgMzApCiAKICNkZWZpbmUgREVGQVVMVF9GUkFHX1RIUkVTSE9MRCAyMzQyVQotI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEIDI1NlUKICNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEIDIzNDJVCiAjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEIDBVCiAjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEIDIzNDJVCkBAIC02MCwxMzIgKzU3LDk5IEBACiAjZGVmaW5lIERFRkFVTFRfUkVUUllfUlRTIDcKICNkZWZpbmUgREVGQVVMVF9SRVRSWV9EQVRBIDcKIAotI2RlZmluZSBCRUFDT05fUVVFVUUJCQkJCTYKKyNkZWZpbmUgQkVBQ09OX1FVRVVFIDYKIAotI2RlZmluZSBhU2lmc1RpbWUgCTEwCisjZGVmaW5lIGFTaWZzVGltZSAxMAogCi0jZGVmaW5lIHNDcmNMbmcgICAgICAgICA0Ci0jZGVmaW5lIHNBY2tDdHNMbmcJMTEyCQkvLyBiaXRzIGluIEFDSyBhbmQgQ1RTIGZyYW1lcwotLy8rYnkgYW15IDA4MDMxMgotI2RlZmluZSBSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRAkzMDAKKyNkZWZpbmUgc0NyY0xuZyA0CisjZGVmaW5lIHNBY2tDdHNMbmcgMTEyIC8qIGJpdHMgaW4gQUNLIGFuZCBDVFMgZnJhbWVzLiAqLworLyogK2J5IGFteSAwODAzMTIuICovCisjZGVmaW5lIFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9EIDMwMAogCi10eXBlZGVmIGVudW0gX1dJUkVMRVNTX01PREUgeworZW51bSB3aXJlbGVzc19tb2RlIHsKIAlXSVJFTEVTU19NT0RFX1VOS05PV04gPSAweDAwLAogCVdJUkVMRVNTX01PREVfQSA9IDB4MDEsCiAJV0lSRUxFU1NfTU9ERV9CID0gMHgwMiwKIAlXSVJFTEVTU19NT0RFX0cgPSAweDA0LAogCVdJUkVMRVNTX01PREVfQVVUTyA9IDB4MDgsCi19IFdJUkVMRVNTX01PREU7Cit9OwogCi10eXBlZGVmIHN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgewotCXUxNiBTSUZTX1RpbWVyOwotCXUxNiBESUZTX1RpbWVyOwotCXUxNiBTbG90VGltZVRpbWVyOwotCXUxNiBFSUZTX1RpbWVyOwotCXUxNiBDV21pbkluZGV4OwotCXUxNiBDV21heEluZGV4OwotfSpQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyxDSEFOTkVMX0FDQ0VTU19TRVRUSU5HOworc3RydWN0IGNobmxfYWNjZXNzX3NldHRpbmcgeworCXUxNiBzaWZzX3RpbWVyOworCXUxNiBkaWZzX3RpbWVyOworCXUxNiBzbG90X3RpbWVfdGltZXI7CisJdTE2IGVpZnNfdGltZXI7CisJdTE2IGN3bWluX2luZGV4OworCXUxNiBjd21heF9pbmRleDsKK307CiAKLXR5cGVkZWYgZW51bXsKLSAgICAgICAgTklDXzgxODUgPSAxLAotICAgICAgICBOSUNfODE4NUIKLSAgICAgICAgfSBuaWNfdDsKK2VudW0gbmljX3QgeworCU5JQ184MTg1ID0gMSwKKwlOSUNfODE4NUIKK307CiAKIHR5cGVkZWYgdTMyIEFDX0NPRElORzsKLSNkZWZpbmUgQUMwX0JFCTAJCS8vIEFDSTogMHgwMAkvLyBCZXN0IEVmZm9ydAotI2RlZmluZSBBQzFfQksJMQkJLy8gQUNJOiAweDAxCS8vIEJhY2tncm91bmQKLSNkZWZpbmUgQUMyX1ZJCTIJCS8vIEFDSTogMHgxMAkvLyBWaWRlbwotI2RlZmluZSBBQzNfVk8JMwkJLy8gQUNJOiAweDExCS8vIFZvaWNlCi0jZGVmaW5lIEFDX01BWAk0CQkvLyBNYXg6IGRlZmluZSB0b3RhbCBudW1iZXI7IFNob3VsZCBub3QgdG8gYmUgdXNlZCBhcyBhIHJlYWwgZW51bS4KKyNkZWZpbmUgQUMwX0JFCTAgLyogQUNJOiAweDAwICovIC8qIEJlc3QgRWZmb3J0LiAqLworI2RlZmluZSBBQzFfQksJMSAvKiBBQ0k6IDB4MDEgKi8gLyogQmFja2dyb3VuZC4gKi8KKyNkZWZpbmUgQUMyX1ZJCTIgLyogQUNJOiAweDEwICovIC8qIFZpZGVvLiAqLworI2RlZmluZSBBQzNfVk8JMyAvKiBBQ0k6IDB4MTEgKi8gLyogVm9pY2UuICovCisjZGVmaW5lIEFDX01BWAk0IC8qIE1heDogZGVmaW5lIHRvdGFsIG51bWJlcjsgU2hvdWxkIG5vdCB0byBiZSB1c2VkIGFzIGEgcmVhbAorCQkgICAqIGVudW0uCisJCSAgICovCiAKLS8vCi0vLyBFQ1dtaW4vRUNXbWF4IGZpZWxkLgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgotLy8KLXR5cGVkZWYJdW5pb24gX0VDV3sKLQl1OAljaGFyRGF0YTsKLQlzdHJ1Y3QKLQl7Ci0JCXU4CUVDV21pbjo0OwotCQl1OAlFQ1dtYXg6NDsKLQl9ZjsJLy8gRmllbGQKLX1FQ1csICpQRUNXOwotCi0vLwotLy8gQUNJL0FJRlNOIEZpZWxkLgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgotLy8KLXR5cGVkZWYJdW5pb24gX0FDSV9BSUZTTnsKLQl1OAljaGFyRGF0YTsKLQotCXN0cnVjdAotCXsKLQkJdTgJQUlGU046NDsKLQkJdTgJQUNNOjE7Ci0JCXU4CUFDSToyOwotCQl1OAlSZXNlcnZlZDoxOwotCX1mOwkvLyBGaWVsZAotfUFDSV9BSUZTTiwgKlBBQ0lfQUlGU047Ci0KLS8vCi0vLyBBQyBQYXJhbWV0ZXJzIFJlY29yZCBGb3JtYXQuCi0vLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCi0vLwotdHlwZWRlZgl1bmlvbiBfQUNfUEFSQU17Ci0JdTMyCWxvbmdEYXRhOwotCXU4CWNoYXJEYXRhWzRdOwotCi0Jc3RydWN0Ci0JewotCQlBQ0lfQUlGU04JQWNpQWlmc247Ci0JCUVDVwkJRWN3OwotCQl1MTYJCVRYT1BMaW1pdDsKLQl9ZjsJLy8gRmllbGQKLX1BQ19QQVJBTSwgKlBBQ19QQVJBTTsKLQotLyogaXQgaXMgYSB3cm9uZyBkZWZpbml0aW9uLiAteGlvbmctMjAwNi0xMS0xNwotdHlwZWRlZiBzdHJ1Y3QgVGhyZWVXaXJlUmVnIHsKLQl1MTYJbG9uZ0RhdGE7CisvKgorICogRUNXbWluL0VDV21heCBmaWVsZC4KKyAqIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMy4KKyAqLwordHlwZWRlZiB1bmlvbiBfRUNXIHsKKwl1OCBjaGFyRGF0YTsKIAlzdHJ1Y3QgewotCQl1OAllbmFibGVCOwotCQl1OAlkYXRhOwotCQl1OAljbGs7Ci0JCXU4CXJlYWRfd3JpdGU7Ci0JfSBzdHJ1YzsKLX0gVGhyZWVXaXJlUmVnOwotKi8KKwkJdTggRUNXbWluOjQ7CisJCXU4IEVDV21heDo0OworCX0gZjsJLyogRmllbGQgKi8KK30gRUNXLCAqUEVDVzsKIAotdHlwZWRlZgl1bmlvbiBfVGhyZWVXaXJlewotCXN0cnVjdCBfVGhyZWVXaXJlU3RydWN7Ci0JCXUxNgkJZGF0YToxOwotCQl1MTYJCWNsazoxOwotCQl1MTYJCWVuYWJsZUI6MTsKLQkJdTE2CQlyZWFkX3dyaXRlOjE7Ci0JCXUxNgkJcmVzdjE6MTI7Ci0vLwkJdTJCeXRlCXJlc3YyOjE0OwotLy8JCXUyQnl0ZQlUaHJlZVdpcmVFbmFibGU6MTsKLS8vCQl1MkJ5dGUJcmVzdjM6MTsKLQl9c3RydWM7Ci0JdTE2CQkJbG9uZ0RhdGE7Ci19VGhyZWVXaXJlUmVnOworLyoKKyAqIEFDSS9BSUZTTiBGaWVsZC4gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgorICovCit0eXBlZGVmIHVuaW9uIF9BQ0lfQUlGU04geworCXU4IGNoYXJEYXRhOwogCisJc3RydWN0IHsKKwkJdTggQUlGU046NDsKKwkJdTggQUNNOjE7CisJCXU4IEFDSToyOworCQl1OCBSZXNlcnZlZDoxOworCX0gZjsJLyogRmllbGQgKi8KK30gQUNJX0FJRlNOLCAqUEFDSV9BSUZTTjsKIAotdHlwZWRlZiBzdHJ1Y3QgYnVmZmVyCi17CisvKgorICogQUMgUGFyYW1ldGVycyBSZWNvcmQgRm9ybWF0LgorICogUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgorICovCit0eXBlZGVmIHVuaW9uIF9BQ19QQVJBTSB7CisJdTMyIGxvbmdEYXRhOworCXU4IGNoYXJEYXRhWzRdOworCisJc3RydWN0IHsKKwkJQUNJX0FJRlNOIEFjaUFpZnNuOworCQlFQ1cgRWN3OworCQl1MTYgVFhPUExpbWl0OworCX0gZjsJLyogRmllbGQgKi8KK30gQUNfUEFSQU0sICpQQUNfUEFSQU07CisKK3N0cnVjdCBidWZmZXIgewogCXN0cnVjdCBidWZmZXIgKm5leHQ7CiAJdTMyICpidWY7CiAJZG1hX2FkZHJfdCBkbWE7Ci19IGJ1ZmZlcjsKK307CiAKLS8vWUosbW9kaWZpZWQsMDgwODI4Ci10eXBlZGVmIHN0cnVjdCBTdGF0cwoteworLyogWUosbW9kaWZpZWQsMDgwODI4LiAqLworc3RydWN0IHN0YXRzIHsKIAl1bnNpZ25lZCBsb25nIHR4cmR1OwogCXVuc2lnbmVkIGxvbmcgcnhyZHU7CiAJdW5zaWduZWQgbG9uZyByeG5vbGFzdDsKIAl1bnNpZ25lZCBsb25nIHJ4bm9kYXRhOwotLy8JdW5zaWduZWQgbG9uZyByeHJlc2V0OwotLy8JdW5zaWduZWQgbG9uZyByeHdya2Fyb3VuZDsKIAl1bnNpZ25lZCBsb25nIHJ4bm9wb2ludGVyOwogCXVuc2lnbmVkIGxvbmcgdHhucGVycjsKIAl1bnNpZ25lZCBsb25nIHR4cmVzdW1lZDsKQEAgLTIwNywxMjYgKzE3MSwxMjMgQEAKIAl1bnNpZ25lZCBsb25nIHR4YmVhY29uZXJyOwogCXVuc2lnbmVkIGxvbmcgdHhscG9raW50OwogCXVuc2lnbmVkIGxvbmcgdHhscGVycjsKLQl1bnNpZ25lZCBsb25nIHR4cmV0cnk7Ly9yZXRyeSBudW1iZXIgIHRvbnkgMjAwNjA2MDEKLQl1bnNpZ25lZCBsb25nIHJ4Y3JjZXJybWluOy8vY3JjIGVycm9yICgwLTUwMCkKLQl1bnNpZ25lZCBsb25nIHJ4Y3JjZXJybWlkOy8vY3JjIGVycm9yICg1MDAtMTAwMCkKLQl1bnNpZ25lZCBsb25nIHJ4Y3JjZXJybWF4Oy8vY3JjIGVycm9yICg+MTAwMCkKLQl1bnNpZ25lZCBsb25nIHJ4aWN2ZXJyOy8vSUNWIGVycm9yCi19IFN0YXRzOworCXVuc2lnbmVkIGxvbmcgdHhyZXRyeTsgLyogcmV0cnkgbnVtYmVyIHRvbnkgMjAwNjA2MDEgKi8KKwl1bnNpZ25lZCBsb25nIHJ4Y3JjZXJybWluOyAvKiBjcmMgZXJyb3IgKDAtNTAwKSAqLworCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaWQ7IC8qIGNyYyBlcnJvciAoNTAwLTEwMDApICovCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1heDsgLyogY3JjIGVycm9yICg+MTAwMCkgKi8KKwl1bnNpZ25lZCBsb25nIHJ4aWN2ZXJyOyAvKiBJQ1YgZXJyb3IgKi8KK307CiAKICNkZWZpbmUgTUFYX0xEX1NMT1RfTlVNIDEwCi0jZGVmaW5lIEtFRVBfQUxJVkVfSU5URVJWQUwgCQkJCTIwIC8vIGluIHNlY29uZHMuCi0jZGVmaW5lIENIRUNLX0ZPUl9IQU5HX1BFUklPRAkJCTIgLy9iZSBlcXVhbCB0byB3YXRjaGRvZyBjaGVjayB0aW1lCi0jZGVmaW5lIERFRkFVTFRfS0VFUF9BTElWRV9MRVZFTAkJCTEKLSNkZWZpbmUgREVGQVVMVF9TTE9UX05VTQkJCQkJMgotI2RlZmluZSBQT1dFUl9QUk9GSUxFX0FDCQkJCQkwCi0jZGVmaW5lIFBPV0VSX1BST0ZJTEVfQkFUVEVSWQkJCTEKKyNkZWZpbmUgS0VFUF9BTElWRV9JTlRFUlZBTCAyMCAvKiBpbiBzZWNvbmRzLiAqLworI2RlZmluZSBDSEVDS19GT1JfSEFOR19QRVJJT0QgMiAvKiBiZSBlcXVhbCB0byB3YXRjaGRvZyBjaGVjayB0aW1lLiAqLworI2RlZmluZSBERUZBVUxUX0tFRVBfQUxJVkVfTEVWRUwgMQorI2RlZmluZSBERUZBVUxUX1NMT1RfTlVNIDIKKyNkZWZpbmUgUE9XRVJfUFJPRklMRV9BQyAwCisjZGVmaW5lIFBPV0VSX1BST0ZJTEVfQkFUVEVSWSAxCiAKLXR5cGVkZWYgc3RydWN0IF9saW5rX2RldGVjdF90Ci17Ci0JdTMyCQkJCVJ4RnJhbWVOdW1bTUFYX0xEX1NMT1RfTlVNXTsJLy8gbnVtYmVyIG9mIFJ4IEZyYW1lIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCi0JdTE2CQkJCVNsb3ROdW07CS8vIG51bWJlciBvZiBDaGVja0ZvckhhbmcgcGVyaW9kIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cywgZGVmYXVsdCBpcyAyCi0JdTE2CQkJCVNsb3RJbmRleDsKK3N0cnVjdCBsaW5rX2RldGVjdF90IHsKKwl1MzIgcnhfZnJhbWVfbnVtW01BWF9MRF9TTE9UX05VTV07IC8qIG51bWJlciBvZiBSeCBGcmFtZS4KKwkJCQkJICAgICogQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lCisJCQkJCSAgICAqIGxpbmsgc3RhdHVzLgorCQkJCQkgICAgKi8KKwl1MTYgc2xvdF9udW07IC8qIG51bWJlciBvZiBDaGVja0ZvckhhbmcgcGVyaW9kIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cywKKwkJICAgICAgICogZGVmYXVsdCBpcyAyLgorCQkgICAgICAgKi8KKwl1MTYgc2xvdF9pbmRleDsKKwl1MzIgbnVtX3R4X29rX2luX3BlcmlvZDsgLyogbnVtYmVyIG9mIHBhY2tldCB0cmFuc21pdHRlZCBkdXJpbmcKKwkJCQkgICogQ2hlY2tGb3JIYW5nLgorCQkJCSAgKi8KKwl1MzIgbnVtX3J4X29rX2luX3BlcmlvZDsgLyogbnVtYmVyIG9mIHBhY2tldCByZWNlaXZlZCBkdXJpbmcKKwkJCQkgICogQ2hlY2tGb3JIYW5nLgorCQkJCSAgKi8KKwl1OCBpZGxlX2NvdW50OyAvKiAoS0VFUF9BTElWRV9JTlRFUlZBTCAvIENIRUNLX0ZPUl9IQU5HX1BFUklPRCkgKi8KKwl1MzIgbGFzdF9udW1fdHhfdW5pY2FzdDsKKwl1MzIgbGFzdF9udW1fcnhfdW5pY2FzdDsKIAotCXUzMgkJCQlOdW1UeE9rSW5QZXJpb2Q7ICAvL251bWJlciBvZiBwYWNrZXQgdHJhbnNtaXR0ZWQgZHVyaW5nIENoZWNrRm9ySGFuZwotCXUzMgkJCQlOdW1SeE9rSW5QZXJpb2Q7ICAvL251bWJlciBvZiBwYWNrZXQgcmVjZWl2ZWQgZHVyaW5nIENoZWNrRm9ySGFuZworCWJvb2wgYl9idXN5X3RyYWZmaWM7IC8qIHdoZW4gaXQgaXMgc2V0IHRvIDEsIFVJIGNhbm4ndCBzY2FuIGF0IHdpbGwuICovCit9OwogCi0JdTgJCQkJSWRsZUNvdW50OyAgICAgLy8gKEtFRVBfQUxJVkVfSU5URVJWQUwgLyBDSEVDS19GT1JfSEFOR19QRVJJT0QpCi0JdTMyCQkJCUxhc3ROdW1UeFVuaWNhc3Q7Ci0JdTMyCQkJCUxhc3ROdW1SeFVuaWNhc3Q7CisvKiBZSixtb2RpZmllZCwwODA4MjgsZW5kICovCiAKLQlib29sCQkJCWJCdXN5VHJhZmZpYzsgICAgLy93aGVuIGl0IGlzIHNldCB0byAxLCBVSSBjYW5uJ3Qgc2NhbiBhdCB3aWxsLgotfWxpbmtfZGV0ZWN0X3QsICpwbGlua19kZXRlY3RfdDsKKy8qIGJ5IGFteSBmb3IgbGVkCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTEVEIGN1c3RvbWl6YXRpb24uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitlbnVtIGxlZF9zdHJhdGVneV84MTg1IHsKKwlTV19MRURfTU9ERTAsCisJU1dfTEVEX01PREUxLAorCUhXX0xFRCwgLyogSFcgY29udHJvbCAyIExFRHMsIExFRDAgYW5kIExFRDEgKHRoZXJlIGFyZSA0IGRpZmZlcmVudAorCQkgKiBjb250cm9sIG1vZGVzKS4gKi8KK307CiAKLS8vWUosbW9kaWZpZWQsMDgwODI4LGVuZAorZW51bSBydF9yZl9wb3dlcl9zdGF0ZSB7CisJUkZfT04sCisJUkZfU0xFRVAsCisJUkZfT0ZGCit9OwogCi0vL2J5IGFteSBmb3IgbGVkCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBMRUQgY3VzdG9taXphdGlvbi4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2VudW0gX1JlYXNvbkNvZGUgeworCXVuc3BlY19yZWFzb24gPSAweDEsCisJYXV0aF9ub3RfdmFsaWQgPSAweDIsCisJZGVhdXRoX2x2X3NzID0gMHgzLAorCWluYWN0aXZpdHkgPSAweDQsCisJYXBfb3ZlcmxvYWQgPSAweDUsCisJY2xhc3MyX2VyciA9IDB4NiwKKwljbGFzczNfZXJyID0gMHg3LAorCWRpc2FzX2x2X3NzID0gMHg4LAorCWFzb2Nfbm90X2F1dGggPSAweDksCiAKLXR5cGVkZWYJZW51bSBfTEVEX1NUUkFURUdZXzgxODV7Ci0JU1dfTEVEX01PREUwLCAvLwotCVNXX0xFRF9NT0RFMSwgLy8KLQlIV19MRUQsIC8vIEhXIGNvbnRyb2wgMiBMRURzLCBMRUQwIGFuZCBMRUQxICh0aGVyZSBhcmUgNCBkaWZmZXJlbnQgY29udHJvbCBtb2RlcykKLX1MRURfU1RSQVRFR1lfODE4NSwgKlBMRURfU1RSQVRFR1lfODE4NTsKLS8vYnkgYW15IGZvciBsZWQKLS8vYnkgYW15IGZvciBwb3dlciBzYXZlCi10eXBlZGVmCWVudW0gX0xFRF9DVExfTU9ERXsKLQlMRURfQ1RMX1BPV0VSX09OID0gMSwKLQlMRURfQ1RMX0xJTksgPSAyLAotCUxFRF9DVExfTk9fTElOSyA9IDMsCi0JTEVEX0NUTF9UWCA9IDQsCi0JTEVEX0NUTF9SWCA9IDUsCi0JTEVEX0NUTF9TSVRFX1NVUlZFWSA9IDYsCi0JTEVEX0NUTF9QT1dFUl9PRkYgPSA3Ci19TEVEX0NUTF9NT0RFOworCS8qIC0tLS1NSUNfQ0hFQ0sgKi8KKwltaWNfZmFpbHVyZSA9IDB4ZSwKKwkvKiAtLS0tRU5EIE1JQ19DSEVDSyAqLwogCi10eXBlZGVmCWVudW0gX1JUX1JGX1BPV0VSX1NUQVRFCi17Ci0JZVJmT24sCi0JZVJmU2xlZXAsCi0JZVJmT2ZmCi19UlRfUkZfUE9XRVJfU1RBVEU7Ci0KLWVudW0JX1JlYXNvbkNvZGV7Ci0JdW5zcGVjX3JlYXNvbgk9IDB4MSwKLQlhdXRoX25vdF92YWxpZAk9IDB4MiwKLQlkZWF1dGhfbHZfc3MJPSAweDMsCi0JaW5hY3Rpdml0eQkJPSAweDQsCi0JYXBfb3ZlcmxvYWQJCT0gMHg1LAotCWNsYXNzMl9lcnIJCT0gMHg2LAotCWNsYXNzM19lcnIJCT0gMHg3LAotCWRpc2FzX2x2X3NzCQk9IDB4OCwKLQlhc29jX25vdF9hdXRoCT0gMHg5LAotCi0JLy8tLS0tTUlDX0NIRUNLCi0JbWljX2ZhaWx1cmUJCT0gMHhlLAotCS8vLS0tLUVORCBNSUNfQ0hFQ0sKLQotCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gODAyLjExaSBEMTAuMCBwLjI4LgotCWludmFsaWRfSUUJCT0gMHgwZCwKLQlmb3VyX3dheV90bW91dAk9IDB4MGYsCi0JdHdvX3dheV90bW91dAk9IDB4MTAsCi0JSUVfZGlzbWF0Y2gJCT0gMHgxMSwKKwkvKiBSZWFzb24gY29kZSBkZWZpbmVkIGluIDgwMi4xMWkgRDEwLjAgcC4yOC4gKi8KKwlpbnZhbGlkX0lFID0gMHgwZCwKKwlmb3VyX3dheV90bW91dCA9IDB4MGYsCisJdHdvX3dheV90bW91dCA9IDB4MTAsCisJSUVfZGlzbWF0Y2ggPSAweDExLAogCWludmFsaWRfR2NpcGhlcgk9IDB4MTIsCiAJaW52YWxpZF9QY2lwaGVyCT0gMHgxMywKLQlpbnZhbGlkX0FLTVAJPSAweDE0LAorCWludmFsaWRfQUtNUCA9IDB4MTQsCiAJdW5zdXBfUlNOSUV2ZXIgPSAweDE1LAotCWludmFsaWRfUlNOSUUJPSAweDE2LAotCWF1dGhfODAyXzF4X2ZhaWw9IDB4MTcsCi0JY2lwZXJfcmVqZWN0CQk9IDB4MTgsCisJaW52YWxpZF9SU05JRSA9IDB4MTYsCisJYXV0aF84MDJfMXhfZmFpbCA9IDB4MTcsCisJY2lwZXJfcmVqZWN0ID0gMHgxOCwKIAotCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gNy4zLjEuNywgODAyLjFlIEQxMy4wLCBwLjQyLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0xNS4KLQlRb1NfdW5zcGVjCQk9IDB4MjAsCS8vIDMyCi0JUUFQX2JhbmR3aWR0aAk9IDB4MjEsCS8vIDMzCi0JcG9vcl9jb25kaXRpb24JPSAweDIyLAkvLyAzNAotCW5vX2ZhY2lsaXR5CQk9IDB4MjMsCS8vIDM1Ci0JCQkJCQkJLy8gV2hlcmUgaXMgMzY/Pz8KLQlyZXFfZGVjbGluZWQJPSAweDI1LAkvLyAzNwotCWludmFsaWRfcGFyYW0JPSAweDI2LAkvLyAzOAotCXJlcV9ub3RfaG9ub3JlZD0gMHgyNywJLy8gMzkKLQlUU19ub3RfY3JlYXRlZAk9IDB4MkYsCS8vIDQ3Ci0JRExfbm90X2FsbG93ZWQJPSAweDMwLAkvLyA0OAotCWRlc3Rfbm90X2V4aXN0CT0gMHgzMSwJLy8gNDkKLQlkZXN0X25vdF9RU1RBCT0gMHgzMiwJLy8gNTAKKwkvKiBSZWFzb24gY29kZSBkZWZpbmVkIGluIDcuMy4xLjcsIDgwMi4xZSBEMTMuMCwgcC40Mi4gQWRkZWQgYnkgQW5uaWUsCisJICogMjAwNS0xMS0xNS4KKwkgKi8KKwlRb1NfdW5zcGVjID0gMHgyMCwgLyogMzIgKi8KKwlRQVBfYmFuZHdpZHRoID0gMHgyMSwgLyogMzMgKi8KKwlwb29yX2NvbmRpdGlvbiA9IDB4MjIsIC8qIDM0ICovCisJbm9fZmFjaWxpdHkgPSAweDIzLCAvKiAzNSAqLworCS8qIFdoZXJlIGlzIDM2Pz8/ICovCisJcmVxX2RlY2xpbmVkID0gMHgyNSwgLyogMzcgKi8KKwlpbnZhbGlkX3BhcmFtID0gMHgyNiwgLyogMzggKi8KKwlyZXFfbm90X2hvbm9yZWQgPSAweDI3LCAvKiAzOSAqLworCVRTX25vdF9jcmVhdGVkID0gMHgyRiwgLyogNDcgKi8KKwlETF9ub3RfYWxsb3dlZCA9IDB4MzAsIC8qIDQ4ICovCisJZGVzdF9ub3RfZXhpc3QgPSAweDMxLCAvKiA0OSAqLworCWRlc3Rfbm90X1FTVEEgPSAweDMyLCAvKiA1MCAqLwogfTsKLXR5cGVkZWYJZW51bSBfUlRfUFNfTU9ERQotewotCWVBY3RpdmUsCS8vIEFjdGl2ZS9Db250aW51b3VzIGFjY2Vzcy4KLQllTWF4UHMsCQkvLyBNYXggcG93ZXIgc2F2ZSBtb2RlLgotCWVGYXN0UHMJCS8vIEZhc3QgcG93ZXIgc2F2ZSBtb2RlLgotfVJUX1BTX01PREU7Ci0vL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQotdHlwZWRlZiBzdHJ1Y3QgcjgxODBfcHJpdgoteworCitlbnVtIHJ0X3BzX21vZGUgeworCUFDVElWRSwgLyogQWN0aXZlL0NvbnRpbnVvdXMgYWNjZXNzLiAqLworCU1BWF9QUywJLyogTWF4IHBvd2VyIHNhdmUgbW9kZS4gKi8KKwlGQVNUX1BTIC8qIEZhc3QgcG93ZXIgc2F2ZSBtb2RlLiAqLworfTsKKworLyogYnkgYW15IGZvciBwb3dlciBzYXZlLiAqLworc3RydWN0IHI4MTgwX3ByaXYgewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCiAJc2hvcnQgZXByb210eXBlOwogCWludCBpcnE7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMTsKIAotCXNob3J0IHBsY3BfcHJlYW1ibGVfbW9kZTsgLy8gMDphdXRvIDE6c2hvcnQgMjpsb25nCisJc2hvcnQgcGxjcF9wcmVhbWJsZV9tb2RlOyAvKiAwOmF1dG8gMTpzaG9ydCAyOmxvbmcgKi8KIAogCXNwaW5sb2NrX3QgaXJxX3RoX2xvY2s7CiAJc3BpbmxvY2tfdCB0eF9sb2NrOwpAQCAtMzM5LDE5ICszMDAsMTUgQEAKIAlzaG9ydCBjaGFuOwogCXNob3J0IHNlbnM7CiAJc2hvcnQgbWF4X3NlbnM7Ci0JdTggY2h0eHB3clsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCi0JdTggY2h0eHB3cl9vZmRtWzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKLQkvL3U4IGNoYWxsb3dbMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAotCXU4IGNoYW5uZWxfcGxhbjsgIC8vIGl0J3MgdGhlIGNoYW5uZWwgcGxhbiBpbmRleAorCXU4IGNodHhwd3JbMTVdOyAvKiBjaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQuICovCisJdTggY2h0eHB3cl9vZmRtWzE1XTsgLyogY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkLiAqLworCXU4IGNoYW5uZWxfcGxhbjsgIC8qIGl0J3MgdGhlIGNoYW5uZWwgcGxhbiBpbmRleC4gKi8KIAlzaG9ydCB1cDsKLQlzaG9ydCBjcmNtb247IC8vaWYgMSBhbGxvdyBiYWQgY3JjIGZyYW1lIHJlY2VwdGlvbiBpbiBtb25pdG9yIG1vZGUKKwlzaG9ydCBjcmNtb247IC8qIGlmIDEgYWxsb3cgYmFkIGNyYyBmcmFtZSByZWNlcHRpb24gaW4gbW9uaXRvciBtb2RlLiAqLwogCiAJc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKLQkvKnNob3J0IHNjYW5wZW5kaW5nOwotCXNob3J0IHN0b3BzY2FuOyovCiAJc3BpbmxvY2tfdCBzY2FuX2xvY2s7CiAJdTggYWN0aXZlX3Byb2JlOwotCS8vdTggYWN0aXZlX3NjYW5fbnVtOwogCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOwogCXNob3J0IGh3X3dlcDsKIApAQCAtMzU5LDIwICszMTYsMjAgQEAKIAlzaG9ydCBhbnRiOwogCXNob3J0IGRpdmVyc2l0eTsKIAl1MzIga2V5MFs0XTsKLQlzaG9ydCAoKnJmX3NldF9zZW5zKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IHNlbnMpOwotCXZvaWQgKCpyZl9zZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisJc2hvcnQgKCpyZl9zZXRfc2Vucykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgc2Vucyk7CisJdm9pZCAoKnJmX3NldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCk7CiAJdm9pZCAoKnJmX2Nsb3NlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqcmZfaW5pdCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnJmX3NsZWVwKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqcmZfd2FrZXVwKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQkvL3Nob3J0IHJhdGU7CisJLyogc2hvcnQgcmF0ZTsgKi8KIAlzaG9ydCBwcm9taXNjOwotCS8qc3RhdHMqLwotCXN0cnVjdCBTdGF0cyBzdGF0czsKLQlzdHJ1Y3QgX2xpbmtfZGV0ZWN0X3QgbGlua19kZXRlY3Q7ICAvL1lKLGFkZCwwODA4MjgKKwkvKiBzdGF0cyAqLworCXN0cnVjdCBzdGF0cyBzdGF0czsKKwlzdHJ1Y3QgbGlua19kZXRlY3RfdCBsaW5rX2RldGVjdDsgLyogWUosYWRkLDA4MDgyOCAqLwogCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKIAotCS8qUlggc3R1ZmYqLworCS8qIFJYIHN0dWZmLiAqLwogCXUzMiAqcnhyaW5nOwogCXUzMiAqcnhyaW5ndGFpbDsKIAlkbWFfYWRkcl90IHJ4cmluZ2RtYTsKQEAgLTM4NywyNyArMzQ0LDYgQEAKIAogCXUzMiByeF9wcmV2bGVuOwogCi0JLypUWCBzdHVmZiovCi0vKgotCXUzMiAqdHhscHJpbmc7Ci0JdTMyICp0eGhwcmluZzsKLQl1MzIgKnR4bnByaW5nOwotCWRtYV9hZGRyX3QgdHhscHJpbmdkbWE7Ci0JZG1hX2FkZHJfdCB0eGhwcmluZ2RtYTsKLQlkbWFfYWRkcl90IHR4bnByaW5nZG1hOwotCXUzMiAqdHhscHJpbmd0YWlsOwotCXUzMiAqdHhocHJpbmd0YWlsOwotCXUzMiAqdHhucHJpbmd0YWlsOwotCXUzMiAqdHhscHJpbmdoZWFkOwotCXUzMiAqdHhocHJpbmdoZWFkOwotCXUzMiAqdHhucHJpbmdoZWFkOwotCXN0cnVjdCBidWZmZXIgKnR4bHBidWZzOwotCXN0cnVjdCBidWZmZXIgKnR4aHBidWZzOwotCXN0cnVjdCBidWZmZXIgKnR4bnBidWZzOwotCXN0cnVjdCBidWZmZXIgKnR4bHBidWZzdGFpbDsKLQlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmc3RhaWw7Ci0Jc3RydWN0IGJ1ZmZlciAqdHhucGJ1ZnN0YWlsOwotKi8KIAl1MzIgKnR4bWFwcmluZzsKIAl1MzIgKnR4YmtwcmluZzsKIAl1MzIgKnR4YmVwcmluZzsKQEAgLTQ0Nyw1NCArMzgzLDQ3IEBACiAKIAlpbnQgdHhyaW5nY291bnQ7CiAJaW50IHR4YnVmZnNpemU7Ci0JLy9zdHJ1Y3QgdHhfcGVuZGluZ2J1ZiB0eG5wX3BlbmRpbmc7Ci0JLy9zdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3R4X3Rhc2tsZXQ7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV9yeF90YXNrbGV0OwogCXU4IGRtYV9wb2xsX21hc2s7Ci0JLy9zaG9ydCB0eF9zdXNwZW5kOwogCi0JLyogYWRob2MvbWFzdGVyIG1vZGUgc3R1ZmYgKi8KKwkvKiBhZGhvYy9tYXN0ZXIgbW9kZSBzdHVmZi4gKi8KIAl1MzIgKnR4YmVhY29ucmluZ3RhaWw7CiAJZG1hX2FkZHJfdCB0eGJlYWNvbnJpbmdkbWE7CiAJdTMyICp0eGJlYWNvbnJpbmc7CiAJaW50IHR4YmVhY29uY291bnQ7CiAJc3RydWN0IGJ1ZmZlciAqdHhiZWFjb25idWZzOwogCXN0cnVjdCBidWZmZXIgKnR4YmVhY29uYnVmc3RhaWw7Ci0JLy9jaGFyICptYXN0ZXJfZXNzaWQ7Ci0JLy91MTYgbWFzdGVyX2JlYWNvbmludGVydmFsOwotCS8vdTMyIG1hc3Rlcl9iZWFjb25zaXplOwotCS8vdTE2IGJlYWNvbl9pbnRlcnZhbDsKIAogCXU4IHJldHJ5X2RhdGE7CiAJdTggcmV0cnlfcnRzOwogCXUxNiBydHM7CiAKLS8vYnkgYW15IGZvciBsZWQKLQlMRURfU1RSQVRFR1lfODE4NSBMZWRTdHJhdGVneTsKLS8vYnkgYW15IGZvciBsZWQKKwkvKiBieSBhbXkgZm9yIGxlZC4gKi8KKwllbnVtIGxlZF9zdHJhdGVneV84MTg1IGxlZF9zdHJhdGVneTsKKwkvKiBieSBhbXkgZm9yIGxlZC4gKi8KIAotLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKwkvKiBieSBhbXkgZm9yIHBvd2VyIHNhdmUuICovCiAJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hfZG9nX3RpbWVyOwogCWJvb2wgYkluYWN0aXZlUHM7CiAJYm9vbCBiU3dSZlByb2Nlc3Npbmc7Ci0JUlRfUkZfUE9XRVJfU1RBVEUJZUluYWN0aXZlUG93ZXJTdGF0ZTsKLQlSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZUluYWN0aXZlUG93ZXJTdGF0ZTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGU7CiAJdTMyIFJmT2ZmUmVhc29uOwogCWJvb2wgUkZDaGFuZ2VJblByb2dyZXNzOwogCWJvb2wgU2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzczsKLQl1OCAgIFJGUHJvZ1R5cGU7CisJdTggUkZQcm9nVHlwZTsKIAlib29sIGJMZWlzdXJlUHM7Ci0JUlRfUFNfTU9ERSBkb3QxMVBvd2VyU2F2ZU1vZGU7Ci0JLy91MzIgTnVtUnhPa0luUGVyaW9kOyAgIC8vWUosZGVsLDA4MDgyOAotCS8vdTMyIE51bVR4T2tJblBlcmlvZDsgICAvL1lKLGRlbCwwODA4MjgKLQl1OCAgIFR4UG9sbGluZ1RpbWVzOworCWVudW0gcnRfcHNfbW9kZSBkb3QxMVBvd2VyU2F2ZU1vZGU7CisJdTggVHhQb2xsaW5nVGltZXM7CiAKLQlib29sCWJBcEJ1Zk91ckZyYW1lOy8vIFRSVUUgaWYgQVAgYnVmZmVyIG91ciB1bmljYXN0IGRhdGEgLCB3ZSB3aWxsIGtlZXAgZUF3YWtlIHVudGlsIHJlY2VpdmUgZGF0YSBvciB0aW1lb3V0LgotCXU4CVdhaXRCdWZEYXRhQmNuQ291bnQ7Ci0JdTgJV2FpdEJ1ZkRhdGFUaW1lT3V0OworCWJvb2wgYkFwQnVmT3VyRnJhbWU7IC8qIFRSVUUgaWYgQVAgYnVmZmVyIG91ciB1bmljYXN0IGRhdGEgLCB3ZSB3aWxsCisJCQkgICAgICAqIGtlZXAgZUF3YWtlIHVudGlsIHJlY2VpdmUgZGF0YSBvciB0aW1lb3V0LgorCQkJICAgICAgKi8KKwl1OCBXYWl0QnVmRGF0YUJjbkNvdW50OworCXU4IFdhaXRCdWZEYXRhVGltZU91dDsKIAotLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKLS8vYnkgYW15IGZvciBhbnRlbm5hCisJLyogYnkgYW15IGZvciBwb3dlciBzYXZlLiAqLworCS8qIGJ5IGFteSBmb3IgYW50ZW5uYS4gKi8KIAl1OCBFRVBST01Td0FudGVubmFEaXZlcnNpdHk7CiAJYm9vbCBFRVBST01EZWZhdWx0QW50ZW5uYTE7CiAJdTggUmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtOwpAQCAtNTAzLDExNSArNDMyLDEyOCBAQAogCWJvb2wgYkRlZmF1bHRBbnRlbm5hMTsKIAl1OCBTaWduYWxTdHJlbmd0aDsKIAlsb25nIFN0YXRzX1NpZ25hbFN0cmVuZ3RoOwotCWxvbmcgTGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50OyAvLyBJbiBwZXJjZW50YWdlLCB1c2VkIGZvciBzbW9vdGhpbmcsIGUuZy4gTW92aW5nIEF2ZXJhZ2UuCi0JdTgJIFNpZ25hbFF1YWxpdHk7IC8vIGluIDAtMTAwIGluZGV4LgorCWxvbmcgTGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50OyAvKiBJbiBwZXJjZW50YWdlLCB1c2VkIGZvciBzbW9vdGhpbmcsCisJCQkJCSAgICogZS5nLiBNb3ZpbmcgQXZlcmFnZS4KKwkJCQkJICAgKi8KKwl1OCBTaWduYWxRdWFsaXR5OyAvKiBpbiAwLTEwMCBpbmRleC4gKi8KIAlsb25nIFN0YXRzX1NpZ25hbFF1YWxpdHk7Ci0JbG9uZyBSZWN2U2lnbmFsUG93ZXI7IC8vIGluIGRCbS4KKwlsb25nIFJlY3ZTaWduYWxQb3dlcjsgLyogaW4gZEJtLiAqLwogCWxvbmcgU3RhdHNfUmVjdlNpZ25hbFBvd2VyOwotCXU4CSBMYXN0UnhQa3RBbnRlbm5hOwkvLyArYnkgYW15IDA4MDMxMiBBbnRlbm5hIHdoaWNoIHJlY2VpdmVkIHRoZSBsYXN0ZWQgcGFja2V0LiAwOiBBdXgsIDE6TWFpbi4gQWRkZWQgYnkgUm9nZXIsIDIwMDguMDEuMjUuCisJdTggTGFzdFJ4UGt0QW50ZW5uYTsgLyogK2J5IGFteSAwODAzMTIgQW50ZW5uYSB3aGljaCByZWNlaXZlZCB0aGUgbGFzdGVkCisJCQkgICAgICAqIHBhY2tldC4gMDogQXV4LCAxOk1haW4uIEFkZGVkIGJ5IFJvZ2VyLAorCQkJICAgICAgKiAyMDA4LjAxLjI1LgorCQkJICAgICAgKi8KIAl1MzIgQWRSeE9rQ250OwogCWxvbmcgQWRSeFNpZ25hbFN0cmVuZ3RoOwotCXU4IEN1cnJBbnRlbm5hSW5kZXg7CQkJLy8gSW5kZXggdG8gY3VycmVudCBBbnRlbm5hIChib3RoIFR4IGFuZCBSeCkuCi0JdTggQWRUaWNrQ291bnQ7CQkJCS8vIFRpbWVzIG9mIFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyIGhhcHBlbmVkLgotCXU4IEFkQ2hlY2tQZXJpb2Q7CQkJCS8vICMgb2YgcGVyaW9kIFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyIHRvIGNoZWNrIFJ4IHNpZ25hbCBzdHJlbmd0aCBmb3IgU1cgQW50ZW5uYSBEaXZlcnNpdHkuCi0JdTggQWRNaW5DaGVja1BlcmlvZDsJCQkvLyBNaW4gdmFsdWUgb2YgQWRDaGVja1BlcmlvZC4KLQl1OCBBZE1heENoZWNrUGVyaW9kOwkJCS8vIE1heCB2YWx1ZSBvZiBBZENoZWNrUGVyaW9kLgotCWxvbmcgQWRSeFNzVGhyZXNob2xkOwkJCS8vIFNpZ25hbCBzdHJlbmd0aCB0aHJlc2hvbGQgdG8gc3dpdGNoIGFudGVubmEuCi0JbG9uZyBBZE1heFJ4U3NUaHJlc2hvbGQ7CQkJLy8gTWF4IHZhbHVlIG9mIEFkUnhTc1RocmVzaG9sZC4KLQlib29sIGJBZFN3aXRjaGVkQ2hlY2tpbmc7CQkvLyBUUlVFIGlmIHdlIHNoYWxsIHNoYWxsIGNoZWNrIFJ4IHNpZ25hbCBzdHJlbmd0aCBmb3IgbGFzdCB0aW1lIHN3aXRjaGluZyBhbnRlbm5hLgotCWxvbmcgQWRSeFNzQmVmb3JlU3dpdGNoZWQ7CQkvLyBSeCBzaWduYWwgc3RyZW5ndGggYmVmb3JlIHdlIHN3aXRjaGVkIGFudGVubmEuCisJdTggQ3VyckFudGVubmFJbmRleDsgLyogSW5kZXggdG8gY3VycmVudCBBbnRlbm5hIChib3RoIFR4IGFuZCBSeCkuICovCisJdTggQWRUaWNrQ291bnQ7IC8qIFRpbWVzIG9mIFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyIGhhcHBlbmVkLiAqLworCXU4IEFkQ2hlY2tQZXJpb2Q7IC8qICMgb2YgcGVyaW9kIFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyIHRvIGNoZWNrIFJ4CisJCQkgICAqIHNpZ25hbCBzdHJlbmd0aCBmb3IgU1cgQW50ZW5uYSBEaXZlcnNpdHkuCisJCQkgICAqLworCXU4IEFkTWluQ2hlY2tQZXJpb2Q7IC8qIE1pbiB2YWx1ZSBvZiBBZENoZWNrUGVyaW9kLiAqLworCXU4IEFkTWF4Q2hlY2tQZXJpb2Q7IC8qIE1heCB2YWx1ZSBvZiBBZENoZWNrUGVyaW9kLiAqLworCWxvbmcgQWRSeFNzVGhyZXNob2xkOyAvKiBTaWduYWwgc3RyZW5ndGggdGhyZXNob2xkIHRvIHN3aXRjaCBhbnRlbm5hLiAqLworCWxvbmcgQWRNYXhSeFNzVGhyZXNob2xkOyAvKiBNYXggdmFsdWUgb2YgQWRSeFNzVGhyZXNob2xkLiAqLworCWJvb2wgYkFkU3dpdGNoZWRDaGVja2luZzsgLyogVFJVRSBpZiB3ZSBzaGFsbCBzaGFsbCBjaGVjayBSeCBzaWduYWwKKwkJCQkgICAqIHN0cmVuZ3RoIGZvciBsYXN0IHRpbWUgc3dpdGNoaW5nIGFudGVubmEuCisJCQkJICAgKi8KKwlsb25nIEFkUnhTc0JlZm9yZVN3aXRjaGVkOyAvKiBSeCBzaWduYWwgc3RyZW5ndGggYmVmb3JlIHdlIHN3aXRjaGVkCisJCQkJICAgICogYW50ZW5uYS4KKwkJCQkgICAgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBTd0FudGVubmFEaXZlcnNpdHlUaW1lcjsKLS8vYnkgYW15IGZvciBhbnRlbm5hCi0vL3tieSBhbXkgMDgwMzEyCi0vLwotCS8vIENyeXN0YWwgY2FsaWJyYXRpb24uCi0JLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCi0JLy8KLQlib29sCQliWHRhbENhbGlicmF0aW9uOyAvLyBDcnlzdGFsIGNhbGlicmF0aW9uLgotCXU4CQkJWHRhbENhbF9YaW47IC8vIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhpbi4gMH43LjVwRgotCXU4CQkJWHRhbENhbF9Yb3V0OyAvLyBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYb3V0LiAwfjcuNXBGCi0JLy8KLQkvLyBUeCBwb3dlciB0cmFja2luZyB3aXRoIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbi4KLQkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KLQkvLwotCWJvb2wJCWJUeFBvd2VyVHJhY2s7IC8vIFR4IFBvd2VyIHRyYWNraW5nLgotCXU4CQkJVGhlcm1hbE1ldGVyOyAvLyBUaGVybWFsIG1ldGVyIHJlZmVyZW5jZSBpbmRpY2F0aW9uLgotCS8vCi0JLy8gRHluYW1pYyBJbml0aWFsIEdhaW4gQWRqdXN0bWVudCBNZWNoYW5pc20uIEFkZGVkIGJ5IEJydWNlLCAyMDA3LTAyLTE0LgotCS8vCi0JYm9vbAkJCQliRGlnTWVjaGFuaXNtOyAvLyBUUlVFIGlmIERJRyBpcyBlbmFibGVkLCBGQUxTRSBvdy4KLQlib29sCQkJCWJSZWdIaWdoUG93ZXJNZWNoYW5pc207IC8vIEZvciBIaWdoIFBvd2VyIE1lY2hhbmlzbS4gMDYxMDEwLCBieSByY25qa28uCi0JdTMyCQkJCQlGYWxzZUFsYXJtUmVnVmFsdWU7Ci0JdTgJCQkJCVJlZ0RpZ09mZG1GYVVwVGg7IC8vIFVwcGVyIHRocmVzaG9sZCBvZiBPRkRNIGZhbHNlIGFsYXJtLCB3aGljaCBpcyB1c2VkIGluIERJRy4KLQl1OAkJCQkJRElHX051bWJlckZhbGxiYWNrVm90ZTsKLQl1OAkJCQkJRElHX051bWJlclVwZ3JhZGVWb3RlOwotCS8vIEZvciBIVyBhbnRlbm5hIGRpdmVyc2l0eSwgYWRkZWQgYnkgUm9nZXIsIDIwMDguMDEuMzAuCi0JdTMyCQkJQWRNYWluQW50ZW5uYVJ4T2tDbnQ7CQkvLyBNYWluIGFudGVubmEgUnggT0sgY291bnQuCi0JdTMyCQkJQWRBdXhBbnRlbm5hUnhPa0NudDsJCS8vIEF1eCBhbnRlbm5hIFJ4IE9LIGNvdW50LgotCWJvb2wJCWJIV0FkU3dpdGNoZWQ7CQkJCS8vIFRSVUUgaWYgd2UgaGFzIHN3aXRjaGVkIGRlZmF1bHQgYW50ZW5uYSBieSBIVyBldmFsdWF0aW9uLgotCS8vIFJGIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgdGhyZXNob2xkLgotCXU4CQkJCQlSZWdIaVB3clVwcGVyVGg7Ci0JdTgJCQkJCVJlZ0hpUHdyTG93ZXJUaDsKLQkvLyBSRiBSU1NJIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgVGhyZXNob2xkLgotCXU4CQkJCQlSZWdSU1NJSGlQd3JVcHBlclRoOwotCXU4CQkJCQlSZWdSU1NJSGlQd3JMb3dlclRoOwotCS8vIEN1cnJlbnQgQ0NLIFJTU0kgdmFsdWUgdG8gZGV0ZXJtaW5lIENDSyBoaWdoIHBvd2VyLCBhc2tlZCBieSBTRDMgRFosIGJ5IEJydWNlLCAyMDA3LTA0LTEyLgotCXU4CQkJQ3VyQ0NLUlNTSTsKLQlib29sICAgICAgICBiQ3VyQ0NLUGt0OwotCS8vCi0JLy8gSGlnaCBQb3dlciBNZWNoYW5pc20uIEFkZGVkIGJ5IGFteSwgMDgwMzEyLgotCS8vCi0JYm9vbAkJCQkJYlRvVXBkYXRlVHhQd3I7Ci0JbG9uZwkJCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOwotCWxvbmcJCQkJCVVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyOwotCXU4CQkJCQkJUlNTSTsKLQljaGFyCQkJCQlSeFBvd2VyOwotCSB1OCBJbml0aWFsR2FpbjsKLQkgLy9Gb3IgYWRqdXN0IERpZyBUaHJlc2hvbGQgZHVyaW5nIExlZ2FjeS9MZWlzdXJlIFBvd2VyIFNhdmUgTW9kZQotCXUzMgkJCQlEb3plUGVyaW9kSW5QYXN0MlNlYzsKLQkgLy8gRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIGRpc2FibGUgUExMIHNpdHVhdGlvbi4KLQl1OAkJCQkJSW5pdGlhbEdhaW5CYWNrVXA7Ci0JIHU4IFJlZ0JNb2RlR2FpblN0YWdlOwotLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKLSAgICBzdHJ1Y3QgdGltZXJfbGlzdCByYXRlYWRhcHRlcl90aW1lcjsKLQl1MzIgICAgUmF0ZUFkYXB0aXZlUGVyaW9kOwotCWJvb2wgICBiRW5oYW5jZVR4UHdyOwotCWJvb2wgICBiVXBkYXRlQVJGUjsKLQlpbnQJICAgRm9yY2VkRGF0YVJhdGU7IC8vIEZvcmNlIERhdGEgUmF0ZS4gMDogQXV0bywgMHgwMjogMU0gfiAweDZDOiA1NE0uKQotCXUzMiAgICAgTnVtVHhVbmljYXN0OyAvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUKLQl1OCAgICAgIGtlZXBBbGl2ZUxldmVsOyAvL1lKLGFkZCwwODA4MjgsZm9yIEtlZXBBbGl2ZQotCXVuc2lnbmVkIGxvbmcgCU51bVR4T2tUb3RhbDsKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0UmV0cnlDbnQ7Ci0gICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0UmV0cnlSYXRlOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgIExhc3RUeG9rQ250OwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBMYXN0Unhva0NudDsKLSAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJSZXRyeUNudDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgTGFzdFR4T0tCeXRlczsKLQl1bnNpZ25lZCBsb25nIAkJICAgIE51bVR4T2tCeXRlc1RvdGFsOwotICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdEZhaWxUeFJhdGU7Ci0gICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICBMYXN0RmFpbFR4UmF0ZVNTOwotICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbFR4UmF0ZUNvdW50OwotICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFR4VGhyb3VnaHB1dDsKLSAgICAgICAgLy9mb3IgdXAgcmF0ZQotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBiVHJ5dXBpbmc7Ci0gICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyVHhSYXRlOyAgICAgLy90aGUgcmF0ZSBiZWZvcmUgdXAKLSAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJSZXRyeVJhdGU7Ci0gICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnl1cGluZ0NvdW50OwotICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ5RG93bkNvdW50TG93RGF0YTsKLSAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeXVwaW5nQ291bnROb0RhdGE7CisJLyogYnkgYW15IGZvciBhbnRlbm5hIHtieSBhbXkgMDgwMzEyICovCiAKLSAgICAgICAgdTggICAgICAgICAgICAgICAgICBDdXJyZW50T3BlcmFSYXRlOwotLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKLS8vYnkgYW15IDA4MDMxMn0KLS8vCXNob3J0IHdxX2h1cnJ5dXA7Ci0vLwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCS8qIENyeXN0YWwgY2FsaWJyYXRpb24uIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLiAqLworCisJYm9vbCBiWHRhbENhbGlicmF0aW9uOyAvKiBDcnlzdGFsIGNhbGlicmF0aW9uLiovCisJdTggWHRhbENhbF9YaW47IC8qIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhpbi4gMH43LjVwRiAqLworCXU4IFh0YWxDYWxfWG91dDsgLyogQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWG91dC4gMH43LjVwRiAqLworCisJLyogVHggcG93ZXIgdHJhY2tpbmcgd2l0aCB0aGVybWFsIG1ldGVyIGluZGljYXRpb24uCisJICogQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisJICovCisKKwlib29sIGJUeFBvd2VyVHJhY2s7IC8qIFR4IFBvd2VyIHRyYWNraW5nLiAqLworCXU4IFRoZXJtYWxNZXRlcjsgLyogVGhlcm1hbCBtZXRlciByZWZlcmVuY2UgaW5kaWNhdGlvbi4gKi8KKworCS8qIER5bmFtaWMgSW5pdGlhbCBHYWluIEFkanVzdG1lbnQgTWVjaGFuaXNtLiBBZGRlZCBieSBCcnVjZSwKKwkgKiAyMDA3LTAyLTE0LgorCSAqLworCWJvb2wgYkRpZ01lY2hhbmlzbTsgLyogVFJVRSBpZiBESUcgaXMgZW5hYmxlZCwgRkFMU0Ugb3cuICovCisJYm9vbCBiUmVnSGlnaFBvd2VyTWVjaGFuaXNtOyAvKiBGb3IgSGlnaCBQb3dlciBNZWNoYW5pc20uIDA2MTAxMCwKKwkJCQkgICAgICAqIGJ5IHJjbmprby4KKwkJCQkgICAgICAqLworCXUzMiBGYWxzZUFsYXJtUmVnVmFsdWU7CisJdTggUmVnRGlnT2ZkbUZhVXBUaDsgLyogVXBwZXIgdGhyZXNob2xkIG9mIE9GRE0gZmFsc2UgYWxhcm0sIHdoaWNoIGlzCisJCQkgICAgICAqIHVzZWQgaW4gRElHLgorCQkJICAgICAgKi8KKwl1OCBESUdfTnVtYmVyRmFsbGJhY2tWb3RlOworCXU4IERJR19OdW1iZXJVcGdyYWRlVm90ZTsKKwkvKiBGb3IgSFcgYW50ZW5uYSBkaXZlcnNpdHksIGFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjMwLiAqLworCXUzMiBBZE1haW5BbnRlbm5hUnhPa0NudDsgLyogTWFpbiBhbnRlbm5hIFJ4IE9LIGNvdW50LiAqLworCXUzMiBBZEF1eEFudGVubmFSeE9rQ250OyAvKiBBdXggYW50ZW5uYSBSeCBPSyBjb3VudC4gKi8KKwlib29sIGJIV0FkU3dpdGNoZWQ7IC8qIFRSVUUgaWYgd2UgaGFzIHN3aXRjaGVkIGRlZmF1bHQgYW50ZW5uYSBieSBIVworCQkJICAgICAqIGV2YWx1YXRpb24uCisJCQkgICAgICovCisJLyogUkYgSGlnaCBQb3dlciB1cHBlci9sb3dlciB0aHJlc2hvbGQuICovCisJdTggUmVnSGlQd3JVcHBlclRoOworCXU4IFJlZ0hpUHdyTG93ZXJUaDsKKwkvKiBSRiBSU1NJIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgVGhyZXNob2xkLiAqLworCXU4IFJlZ1JTU0lIaVB3clVwcGVyVGg7CisJdTggUmVnUlNTSUhpUHdyTG93ZXJUaDsKKwkvKiBDdXJyZW50IENDSyBSU1NJIHZhbHVlIHRvIGRldGVybWluZSBDQ0sgaGlnaCBwb3dlciwgYXNrZWQgYnkgU0QzIERaLAorCSAqIGJ5IEJydWNlLCAyMDA3LTA0LTEyLgorCSAqLworCXU4IEN1ckNDS1JTU0k7CisJYm9vbCBiQ3VyQ0NLUGt0OworCS8qIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiBBZGRlZCBieSBhbXksIDA4MDMxMi4gKi8KKwlib29sIGJUb1VwZGF0ZVR4UHdyOworCWxvbmcgVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOworCWxvbmcgVW5kZWNvcmF0ZWRTbW9vdGhlZFJ4UG93ZXI7CisJdTggUlNTSTsKKwljaGFyIFJ4UG93ZXI7CisJdTggSW5pdGlhbEdhaW47CisJLyogRm9yIGFkanVzdCBEaWcgVGhyZXNob2xkIGR1cmluZyBMZWdhY3kvTGVpc3VyZSBQb3dlciBTYXZlIE1vZGUuICovCisJdTMyIERvemVQZXJpb2RJblBhc3QyU2VjOworCS8qIERvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBkaXNhYmxlIFBMTCBzaXR1YXRpb24uICovCisJdTggSW5pdGlhbEdhaW5CYWNrVXA7CisJdTggUmVnQk1vZGVHYWluU3RhZ2U7CisJLyogYnkgYW15IGZvciByYXRlIGFkYXB0aXZlICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmF0ZWFkYXB0ZXJfdGltZXI7CisJdTMyIFJhdGVBZGFwdGl2ZVBlcmlvZDsKKwlib29sIGJFbmhhbmNlVHhQd3I7CisJYm9vbCBiVXBkYXRlQVJGUjsKKwlpbnQgRm9yY2VkRGF0YVJhdGU7IC8qIEZvcmNlIERhdGEgUmF0ZS4gMDogQXV0bywgMHgwMjogMU0gfiAweDZDOiA1NE0uKQorCQkJICAgICAqLworCXUzMiBOdW1UeFVuaWNhc3Q7IC8qIFlKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUuICovCisJdTgga2VlcEFsaXZlTGV2ZWw7IC8qWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlLiAqLworCXVuc2lnbmVkIGxvbmcgTnVtVHhPa1RvdGFsOworCXUxNiBMYXN0UmV0cnlDbnQ7CisJdTE2IExhc3RSZXRyeVJhdGU7CisJdW5zaWduZWQgbG9uZyBMYXN0VHhva0NudDsKKwl1bnNpZ25lZCBsb25nIExhc3RSeG9rQ250OworCXUxNiBDdXJyUmV0cnlDbnQ7CisJdW5zaWduZWQgbG9uZyBMYXN0VHhPS0J5dGVzOworCXVuc2lnbmVkIGxvbmcgTnVtVHhPa0J5dGVzVG90YWw7CisJdTggTGFzdEZhaWxUeFJhdGU7CisJbG9uZyBMYXN0RmFpbFR4UmF0ZVNTOworCXU4IEZhaWxUeFJhdGVDb3VudDsKKwl1MzIgTGFzdFR4VGhyb3VnaHB1dDsKKwkvKiBmb3IgdXAgcmF0ZS4gKi8KKwl1bnNpZ25lZCBzaG9ydCBiVHJ5dXBpbmc7CisJdTggQ3VyclR4UmF0ZTsgLyogdGhlIHJhdGUgYmVmb3JlIHVwLiAqLworCXUxNiBDdXJyUmV0cnlSYXRlOworCXUxNiBUcnl1cGluZ0NvdW50OworCXU4IFRyeURvd25Db3VudExvd0RhdGE7CisJdTggVHJ5dXBpbmdDb3VudE5vRGF0YTsKKworCXU4IEN1cnJlbnRPcGVyYVJhdGU7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dxOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaF9kb2dfd3E7CiAJc2hvcnQgYWNrX3R4X3RvX2llZWU7CiAKIAl1OCBkbWFfcG9sbF9zdG9wX21hc2s7CiAKLQkvL3U4IFJlZ1RocmVlV2lyZU1vZGU7CiAJdTE2IFNob3J0UmV0cnlMaW1pdDsKIAl1MTYgTG9uZ1JldHJ5TGltaXQ7CiAJdTE2IEVhcmx5UnhUaHJlc2hvbGQ7CkBAIC02MTksOCArNTYxLDggQEAKIAl1MzIgUmVjZWl2ZUNvbmZpZzsKIAl1MzIgSW50ck1hc2s7CiAKLQlzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nICBDaGFubmVsQWNjZXNzU2V0dGluZzsKLX1yODE4MF9wcml2OworCXN0cnVjdCBjaG5sX2FjY2Vzc19zZXR0aW5nIENoYW5uZWxBY2Nlc3NTZXR0aW5nOworfTsKIAogI2RlZmluZSBNQU5BR0VfUFJJT1JJVFkgMAogI2RlZmluZSBCS19QUklPUklUWSAxCkBAIC02MzIsMTQgKzU3NCwxNCBAQAogCiAjZGVmaW5lIExPV19QUklPUklUWSBWSV9QUklPUklUWQogI2RlZmluZSBOT1JNX1BSSU9SSVRZIFZPX1BSSU9SSVRZCi0vL0FDMlF1ZXVlIG1hcHBpbmcKKy8qIEFDMlF1ZXVlIG1hcHBpbmcuICovCiAjZGVmaW5lIEFDMlEoX2FjKSAoKChfYWMpID09IFdNRV9BQ19WTykgPyBWT19QUklPUklUWSA6IFwKIAkJKChfYWMpID09IFdNRV9BQ19WSSkgPyBWSV9QUklPUklUWSA6IFwKIAkJKChfYWMpID09IFdNRV9BQ19CSykgPyBCS19QUklPUklUWSA6IFwKIAkJQkVfUFJJT1JJVFkpCiAKIHNob3J0IHJ0bDgxODBfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnNrYnVmLCBpbnQgbGVuLCBpbnQgcHJpb3JpdHksCi0JCSBzaG9ydCBtb3JlZnJhZywgc2hvcnQgZnJhZ2Rlc2MsIGludCByYXRlKTsKKwkJIGJvb2wgbW9yZWZyYWcsIHNob3J0IGZyYWdkZXNjLCBpbnQgcmF0ZSk7CiAKIHU4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwogdTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKQEAgLTY3Myw3ICs2MTUsNiBAQAogYm9vbCBTZXRBbnRlbm5hQ29uZmlnODdTRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBEZWZhdWx0QW50LAogCQkJICBib29sIGJBbnREaXZlcnNpdHkpOwogCi0vLyNpZmRlZiBDT05GSUdfUlRMODE4NUIKIHZvaWQgcnRsODE4NWJfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgcnRsODE4NWJfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBydGw4MTg1Yl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC02ODIsOSArNjIzLDggQEAKIHZvaWQgZml4X3J4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIGZpeF90eF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBydGw4MjI1ejJfU2V0VFhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKTsKLXZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICogd29yayk7Ci0vLyNlbmRpZgotYm9vbCBNZ250QWN0U2V0X1JGX1N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFJUX1JGX1BPV0VSX1NUQVRFIFN0YXRlVG9TZXQsCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Citib29sIE1nbnRBY3RTZXRfUkZfU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBTdGF0ZVRvU2V0LAogCQkJIHUzMiBDaGFuZ2VTb3VyY2UpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKaW5kZXggNmNhZmVlMi4uYTYwMjJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKQEAgLTEsMzEgKzEsMzEgQEAKIC8qCi0gICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4eCBwY2kgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMQotICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+Ci0gICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKQotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbAotICAgUmVhbHRlayBkcml2ZXIuCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KLSAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgotCi0gICBQYXJ0cyBvZiBCQi9SRiBjb2RlIGFyZSBkZXJpdmVkIGZyb20gRGF2aWQgWW91bmcgcnRsODE4MCBuZXRic2QgZHJpdmVyLgotCi0gICBSU1NJIGNhbGMgZnVuY3Rpb24gZnJvbSAnVGhlIERldWNlJwotCi0gICBTb21lIGlkZWFzIGJvcnJvd2VkIGZyb20gdGhlIDgxMzl0b28uYyBkcml2ZXIgaW5jbHVkZWQgaW4gbGludXgga2VybmVsLgotCi0gICBXZSAoST8pIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3MgYW5kIGFsc28gdGhlCi0gICBOZGlzd3JhcHBlcidzIHByb2plY3QgQXV0aG9ycy4KLQotICAgQSBiaWcgYmlnIHRoYW5rcyBnb2VzIGFsc28gdG8gUmVhbHRlayBjb3JwLiBmb3IgdGhlaXIgaGVscCBpbiBteSBhdHRlbXB0IHRvCi0gICBhZGQgUlRMODE4NSBhbmQgUlRMODIyNSBzdXBwb3J0LCBhbmQgdG8gRGF2aWQgWW91bmcgYWxzby4KLQotICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCi0gICBXcml0dGVuIGJ5IE1hcml1c3ogTWF0dXN6ZWsuCi0qLworICogVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxOHggcGNpIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjEKKyAqIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkKKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbAorICogUmVhbHRlayBkcml2ZXIuCisgKgorICogUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICogZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKyAqCisgKiBQYXJ0cyBvZiBCQi9SRiBjb2RlIGFyZSBkZXJpdmVkIGZyb20gRGF2aWQgWW91bmcgcnRsODE4MCBuZXRic2QgZHJpdmVyLgorICoKKyAqIFJTU0kgY2FsYyBmdW5jdGlvbiBmcm9tICdUaGUgRGV1Y2UnCisgKgorICogU29tZSBpZGVhcyBib3Jyb3dlZCBmcm9tIHRoZSA4MTM5dG9vLmMgZHJpdmVyIGluY2x1ZGVkIGluIGxpbnV4IGtlcm5lbC4KKyAqCisgKiBXZSAoST8pIHdhbnQgdG8gdGhhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3MgYW5kIGFsc28gdGhlCisgKiBOZGlzd3JhcHBlcidzIHByb2plY3QgQXV0aG9ycy4KKyAqCisgKiBBIGJpZyBiaWcgdGhhbmtzIGdvZXMgYWxzbyB0byBSZWFsdGVrIGNvcnAuIGZvciB0aGVpciBoZWxwIGluIG15IGF0dGVtcHQgdG8KKyAqIGFkZCBSVEw4MTg1IGFuZCBSVEw4MjI1IHN1cHBvcnQsIGFuZCB0byBEYXZpZCBZb3VuZyBhbHNvLgorICoKKyAqIFBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgorICogV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgorICovCiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIApAQCAtMjU4LDcgKzI1OCw5IEBACiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgdG90YWxPSzsKIAotCXRvdGFsT0sgPSBwcml2LT5zdGF0cy50eG5wb2tpbnQrcHJpdi0+c3RhdHMudHhocG9raW50K3ByaXYtPnN0YXRzLnR4bHBva2ludDsKKwl0b3RhbE9LID0gcHJpdi0+c3RhdHMudHhucG9raW50ICsgcHJpdi0+c3RhdHMudHhocG9raW50ICsKKwkJcHJpdi0+c3RhdHMudHhscG9raW50OworCiAJc2VxX3ByaW50ZihtLAogCQkiVFggT0s6ICVsdVxuIgogCQkiVFggRXJyb3I6ICVsdVxuIgpAQCAtMzQ3LDkgKzM0OSw5IEBACiB9CiAKIC8qCi0gIEZJWE1FOiBjaGVjayBpZiB3ZSBjYW4gdXNlIHNvbWUgc3RhbmRhcmQgYWxyZWFkeS1leGlzdGVudAotICBkYXRhIHR5cGUrZnVuY3Rpb25zIGluIGtlcm5lbAotKi8KKyAqIEZJWE1FOiBjaGVjayBpZiB3ZSBjYW4gdXNlIHNvbWUgc3RhbmRhcmQgYWxyZWFkeS1leGlzdGVudAorICogZGF0YSB0eXBlK2Z1bmN0aW9ucyBpbiBrZXJuZWwuCisgKi8KIAogc3RhdGljIHNob3J0IGJ1ZmZlcl9hZGQoc3RydWN0IGJ1ZmZlciAqKmJ1ZmZlciwgdTMyICpidWYsIGRtYV9hZGRyX3QgZG1hLAogCQkJc3RydWN0IGJ1ZmZlciAqKmJ1ZmZlcmhlYWQpCkBAIC00NjgsOSArNDcwLDExIEBACiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgcmVxdWlyZWRieXRlLCByZXF1aXJlZDsKKwlpbnQgcmVxdWlyZWRieXRlOworCWludCByZXF1aXJlZDsKIAotCXJlcXVpcmVkYnl0ZSA9IHByaXYtPmllZWU4MDIxMS0+ZnRzICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEpOworCXJlcXVpcmVkYnl0ZSA9IHByaXYtPmllZWU4MDIxMS0+ZnRzICsKKwkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEpOwogCiAJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQogCQlyZXF1aXJlZGJ5dGUgKz0gMjsKQEAgLTQ4NCw3ICs0ODgsNyBAQAogCSAqIGJldHdlZW4gdGhlIHRhaWwgYW5kIHRoZSBoZWFkCiAJICovCiAKLQlyZXR1cm4gKHJlcXVpcmVkKzIgPCBnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBwcmlvcml0eSkpOworCXJldHVybiByZXF1aXJlZCArIDIgPCBnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBwcmlvcml0eSk7CiB9CiAKIHZvaWQgZml4X3R4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTY0OSw3ICs2NTMsNyBAQAogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAogCWlmICgoY2ggPiAxNCkgfHwgKGNoIDwgMSkpIHsKLQkJcHJpbnRrKCJJbiAlczogSW52YWxpZCBjaG5hbmVsICVkXG4iLCBfX2Z1bmNfXywgY2gpOworCQluZXRkZXZfZXJyKGRldiwgIkluICVzOiBJbnZhbGlkIGNoYW5uZWwgJWRcbiIsIF9fZnVuY19fLCBjaCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTc0Miw0MyArNzQ2LDUwIEBACiAKIAkJc3dpdGNoIChhZGRyKSB7CiAJCWNhc2UgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSOgotCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eG1hcGJ1ZnMpLCBidWYsIGRtYV90bXAsIE5VTEwpKSB7CisJCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmcHJpdi0+dHhtYXBidWZzLAorCQkJCWJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKIAkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBOUCIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFhfQktQUklPUklUWV9SSU5HX0FERFI6Ci0JCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4YmtwYnVmcyksIGJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKKwkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCZwcml2LT50eGJrcGJ1ZnMsCisJCQkJYnVmLCBkbWFfdG1wLCBOVUxMKSkgewogCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIExQIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUjoKLQkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhiZXBidWZzKSwgYnVmLCBkbWFfdG1wLCBOVUxMKSkgeworCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJnByaXYtPnR4YmVwYnVmcywKKwkJCQlidWYsIGRtYV90bXAsIE5VTEwpKSB7CiAJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRYX1ZJUFJJT1JJVFlfUklOR19BRERSOgotCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eHZpcGJ1ZnMpLCBidWYsIGRtYV90bXAsIE5VTEwpKSB7CisJCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmcHJpdi0+dHh2aXBidWZzLAorCQkJCWJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKIAkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBMUCIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFhfVk9QUklPUklUWV9SSU5HX0FERFI6Ci0JCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4dm9wYnVmcyksIGJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKKwkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCZwcml2LT50eHZvcGJ1ZnMsCisJCQkJYnVmLCBkbWFfdG1wLCBOVUxMKSkgewogCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSOgotCQkJaWYgKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGhwYnVmcyksIGJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKKwkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCZwcml2LT50eGhwYnVmcywKKwkJCQlidWYsIGRtYV90bXAsIE5VTEwpKSB7CiAJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgSFAiKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRYX0JFQUNPTl9SSU5HX0FERFI6Ci0JCQlpZiAoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4YmVhY29uYnVmcyksIGJ1ZiwgZG1hX3RtcCwgTlVMTCkpIHsKKwkJCWlmICgtMSA9PSBidWZmZXJfYWRkKCZwcml2LT50eGJlYWNvbmJ1ZnMsCisJCQkJYnVmLCBkbWFfdG1wLCBOVUxMKSkgewogCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEJQIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CkBAIC04OTcsOCArOTA4LDggQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRlc2MgPSAodTMyICopcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqcnhfZGVzY19zaXplKmNvdW50KzI1NiwKLQkJCQkJICAmZG1hX2Rlc2MpOworCWRlc2MgPSAodTMyICopcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJc2l6ZW9mKHUzMikgKiByeF9kZXNjX3NpemUgKiBjb3VudCArIDI1NiwgJmRtYV9kZXNjKTsKIAogCWlmIChkbWFfZGVzYyAmIDB4ZmYpCiAJCS8qCkBAIC05MzUsNyArOTQ2LDggQEAKIAkJdG1wID0gdG1wK3J4X2Rlc2Nfc2l6ZTsKIAl9CiAKLQkqKHRtcC1yeF9kZXNjX3NpemUpID0gKih0bXAtcnhfZGVzY19zaXplKSB8ICgxPDwzMCk7IC8qIHRoaXMgaXMgdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCS8qIHRoaXMgaXMgdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCSoodG1wIC0gcnhfZGVzY19zaXplKSA9ICoodG1wIC0gcnhfZGVzY19zaXplKSB8ICgxIDw8IDMwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAwOSw3ICsxMDIxLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB1MTYgcnRsX3JhdGVbXSA9IHsxMCwgMjAsIDU1LCAxMTAsIDYwLCA5MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNzIwfTsKK3N0YXRpYyB1MTYgcnRsX3JhdGVbXSA9IHsxMCwgMjAsIDU1LCAxMTAsIDYwLAorCTkwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA3MjB9OwogCiBpbmxpbmUgdTE2IHJ0bDgxODBfcmF0ZTJyYXRlKHNob3J0IHJhdGUpCiB7CkBAIC0xMTQzLDIzICsxMTU2LDMwIEBACiAvKgogICogUGVyZm9ybSBzaWduYWwgc21vb3RoaW5nIGZvciBkeW5hbWljIG1lY2hhbmlzbS4KICAqIFRoaXMgaXMgZGlmZmVyZW50IHdpdGggUGVyZm9ybVNpZ25hbFNtb290aGluZzgxODUgaW4gc21vb3RoaW5nIGZvcm11bGEuCi0gKiBObyBkcmFtYXRpYyBhZGp1c3Rpb24gaXMgYXBwbHkgYmVjYXVzZSBkeW5hbWljIG1lY2hhbmlzbSBuZWVkIHNvbWUgZGVncmVlCi0gKiBvZiBjb3JyZWN0bmVzcy4gUG9ydGVkIGZyb20gODE4N0IuCisgKiBObyBkcmFtYXRpYyBhZGp1c3RtZW50IGlzIGFwcGxpZWQgYmVjYXVzZSBkeW5hbWljIG1lY2hhbmlzbSBuZWVkIHNvbWUKKyAqIGRlZ3JlZSBvZiBjb3JyZWN0bmVzcy4gUG9ydGVkIGZyb20gODE4N0IuCiAgKi8KIHN0YXRpYyB2b2lkIFBlcmZvcm1VbmRlY29yYXRlZFNpZ25hbFNtb290aGluZzgxODUoc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCiAJCQkJCQkgIGJvb2wgYkNja1JhdGUpCiB7Ci0JLyogRGV0ZXJtaW4gdGhlIGN1cnJlbnQgcGFja2V0IGlzIENDSyByYXRlLiAqLworCWxvbmcgc21vb3RoZWRTUzsKKwlsb25nIHNtb290aGVkUng7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgcGFja2V0IGlzIENDSyByYXRlLiAqLwogCXByaXYtPmJDdXJDQ0tQa3QgPSBiQ2NrUmF0ZTsKIAotCWlmIChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPj0gMCkKLQkJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gKChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgKiA1KSArCi0JCQkJCSAgICAgICAocHJpdi0+U2lnbmFsU3RyZW5ndGggKiAxMCkpIC8gNjsKLQllbHNlCi0JCXByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoICogMTA7CisJc21vb3RoZWRTUyA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoICogMTA7CiAKLQlwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlciA9ICgocHJpdi0+VW5kZXJjb3JhdGVTbW9vdGhlZFJ4UG93ZXIgKiA1MCkgKwotCQkJCQkgICAgKHByaXYtPlJ4UG93ZXIgKiAxMSkpIC8gNjA7CisJaWYgKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA+PSAwKQorCQlzbW9vdGhlZFNTID0gKChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgKiA1KSArCisJCQkJc21vb3RoZWRTUykgLyA2OworCisJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gc21vb3RoZWRTUzsKKworCXNtb290aGVkUnggPSAoKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRSeFBvd2VyICogNTApICsKKwkJCShwcml2LT5SeFBvd2VyICogMTEpKSAvIDYwOworCisJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFJ4UG93ZXIgPSBzbW9vdGhlZFJ4OwogCiAJaWYgKGJDY2tSYXRlKQogCQlwcml2LT5DdXJDQ0tSU1NJID0gcHJpdi0+UlNTSTsKQEAgLTEyMDYsOCArMTIyNiw5IEBACiAJcnhfZGVzY19zaXplID0gODsKIAogCWlmICgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMTw8MzEpKSB7Ci0JCS8qIHdlIGhhdmUgZ290IGFuIFJYIGludCwgYnV0IHRoZSBkZXNjcmlwdG9yCi0JCSAqIHdlIGFyZSBwb2ludGluZyBpcyBlbXB0eSAqLworCQkvKiB3ZSBoYXZlIGdvdCBhbiBSWCBpbnQsIGJ1dCB0aGUgZGVzY3JpcHRvci4gd2UgYXJlIHBvaW50aW5nCisJCSAqIGlzIGVtcHR5LgorCQkgKi8KIAogCQlwcml2LT5zdGF0cy5yeG5vZGF0YSsrOwogCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnJ4X2Vycm9ycysrOwpAQCAtMTIxNiw3ICsxMjM3LDggQEAKIAkJdG1wID0gcHJpdi0+cnhyaW5ndGFpbDsKIAkJZG8gewogCQkJaWYgKHRtcCA9PSBwcml2LT5yeHJpbmcpCi0JCQkJdG1wICA9IHByaXYtPnJ4cmluZyArIChwcml2LT5yeHJpbmdjb3VudCAtIDEpKnJ4X2Rlc2Nfc2l6ZTsKKwkJCQl0bXAgID0gcHJpdi0+cnhyaW5nICsgKHByaXYtPnJ4cmluZ2NvdW50IC0gMSkgKgorCQkJCQlyeF9kZXNjX3NpemU7CiAJCQllbHNlCiAJCQkJdG1wIC09IHJ4X2Rlc2Nfc2l6ZTsKIApAQCAtMTIzNyw3ICsxMjU5LDYgQEAKIAogCQlpZiAoKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwyNykpIHsKIAkJCXByaXYtPnN0YXRzLnJ4ZG1hZmFpbCsrOwotCQkJLyogRE1FU0coIkVFOiBSWCBETUEgRkFJTEVEIGF0IGJ1ZmZlciBwb2ludGVkIGJ5IGRlc2NyaXB0b3IgJXgiLCh1MzIpcHJpdi0+cnhyaW5ndGFpbCk7ICovCiAJCQlnb3RvIGRyb3A7CiAJCX0KIApAQCAtMTI1NCwxMCArMTI3NSw5IEBACiAJCWlmIChsYXN0KSB7CiAJCQlsYXN0bGVuID0gKCgqcHJpdi0+cnhyaW5ndGFpbCkgJiAweGZmZik7CiAKLQkJCS8qIGlmIHRoZSBsYXN0IGRlc2NyaXB0b3IgKHRoYXQgc2hvdWxkCi0JCQkgKiB0ZWxsIHVzIHRoZSB0b3RhbCBwYWNrZXQgbGVuKSB0ZWxsCi0JCQkgKiB1cyBzb21ldGhpbmcgbGVzcyB0aGFuIHRoZSBkZXNjcmlwdG9ycwotCQkJICogbGVuIHdlIGhhZCB1bnRpbCBub3csIHRoZW4gdGhlcmUgaXMgc29tZQorCQkJLyogaWYgdGhlIGxhc3QgZGVzY3JpcHRvciAodGhhdCBzaG91bGQgdGVsbCB1cyB0aGUgdG90YWwKKwkJCSAqIHBhY2tldCBsZW4pIHRlbGwgdXMgc29tZXRoaW5nIGxlc3MgdGhhbiB0aGUKKwkJCSAqIGRlc2NyaXB0b3JzIGxlbiB3ZSBoYWQgdW50aWwgbm93LCB0aGVuIHRoZXJlIGlzIHNvbWUKIAkJCSAqIHByb2JsZW0uLgogCQkJICogd29ya2Fyb3VuZCB0byBwcmV2ZW50IGtlcm5lbCBwYW5pYwogCQkJICovCkBAIC0xMjkzLDMxICsxMzEzLDM2IEBACiAJCXByaXYtPnJ4X3ByZXZsZW4gKz0gbGVuOwogCiAJCWlmIChwcml2LT5yeF9wcmV2bGVuID4gTUFYX0ZSQUdfVEhSRVNIT0xEICsgMTAwKSB7Ci0JCQkvKiBIVyBpcyBwcm9iYWJseSBwYXNzaW5nIHNldmVyYWwgYnVnZ3kgZnJhbWVzCi0JCQkqIHdpdGhvdXQgRkQgb3IgTEQgZmxhZyBzZXQuCi0JCQkqIFRocm93IHRoaXMgZ2FyYmFnZSBhd2F5IHRvIHByZXZlbnQgc2tiCi0JCQkqIG1lbW9yeSBleGhhdXN0aW5nCi0JCQkqLworCQkJLyogSFcgaXMgcHJvYmFibHkgcGFzc2luZyBzZXZlcmFsIGJ1Z2d5IGZyYW1lcyB3aXRob3V0CisJCQkgKiBGRCBvciBMRCBmbGFnIHNldC4KKwkJCSAqIFRocm93IHRoaXMgZ2FyYmFnZSBhd2F5IHRvIHByZXZlbnQgc2tiIG1lbW9yeQorCQkJICogZXhoYXVzdGluZworCQkJICovCiAJCQlpZiAoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9za2IpOwogCQkJcHJpdi0+cnhfc2tiX2NvbXBsZXRlID0gMTsKIAkJfQogCi0JCXNpZ25hbCA9ICh1bnNpZ25lZCBjaGFyKSgoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkgJiAoMHgwMGZmMDAwMCkpPj4xNik7CisJCXNpZ25hbCA9ICh1bnNpZ25lZCBjaGFyKSgoKihwcml2LT5yeHJpbmd0YWlsICsgMykgJgorCQkJMHgwMGZmMDAwMCkgPj4gMTYpOwogCQlzaWduYWwgPSAoc2lnbmFsICYgMHhmZSkgPj4gMTsKIAogCQlxdWFsaXR5ID0gKHVuc2lnbmVkIGNoYXIpKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpICYgKDB4ZmYpKTsKIAogCQlzdGF0cy5tYWNfdGltZVswXSA9ICoocHJpdi0+cnhyaW5ndGFpbCsxKTsKIAkJc3RhdHMubWFjX3RpbWVbMV0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMik7Ci0JCXJ4cG93ZXIgPSAoKGNoYXIpKCgoKihwcml2LT5yeHJpbmd0YWlsKzQpKSAmICgweDAwZmYwMDAwKSk+PjE2KSkvMiAtIDQyOwotCQlSU1NJID0gKCh1OCkoKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpICYgKDB4MDAwMGZmMDApKT4+OCkpICYgKDB4N2YpOworCisJCXJ4cG93ZXIgPSAoKGNoYXIpKCgqKHByaXYtPnJ4cmluZ3RhaWwgKyA0KSAmCisJCQkweDAwZmYwMDAwKSA+PiAxNikpIC8gMiAtIDQyOworCisJCVJTU0kgPSAoKHU4KSgoKihwcml2LT5yeHJpbmd0YWlsICsgMykgJgorCQkJMHgwMDAwZmYwMCkgPj4gOCkpICYgMHg3ZjsKIAogCQlyYXRlID0gKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmCiAJCQkoKDE8PDIzKXwoMTw8MjIpfCgxPDwyMSl8KDE8PDIwKSkpPj4yMDsKIAogCQlzdGF0cy5yYXRlID0gcnRsODE4MF9yYXRlMnJhdGUocmF0ZSk7Ci0JCUFudGVubmEgPSAoKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpICYgKDB4MDAwMDgwMDApKSA9PSAwKSA/IDAgOiAxOworCQlBbnRlbm5hID0gKCoocHJpdi0+cnhyaW5ndGFpbCArIDMpICYgMHgwMDAwODAwMCkgPT0gMCA/IDAgOiAxOwogCQlpZiAoIXJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKHN0YXRzLnJhdGUpKSB7IC8qIE9GRE0gcmF0ZS4gKi8KIAkJCVJ4QUdDX2RCbSA9IHJ4cG93ZXIrMTsJLyogYmlhcyAqLwogCQl9IGVsc2UgeyAvKiBDQ0sgcmF0ZS4gKi8KQEAgLTEzMjYsNyArMTM1MSw4IEBACiAJCQlMTkEgPSAodTgpIChSeEFHQ19kQm0gJiAweDYwKSA+PiA1OyAvKiBiaXQgNn4gYml0IDUgKi8KIAkJCUJCICA9ICh1OCkgKFJ4QUdDX2RCbSAmIDB4MUYpOyAvKiBiaXQgNCB+IGJpdCAwICovCiAKLQkJCVJ4QUdDX2RCbSA9IC0oTE5BX2dhaW5bTE5BXSArIChCQioyKSk7IC8qIFBpbl8xMWI9LShMTkFfZ2FpbitCQl9nYWluKSAoZEJtKSAqLworCQkJLyogUGluXzExYj0tKExOQV9nYWluK0JCX2dhaW4pIChkQm0pICovCisJCQlSeEFHQ19kQm0gPSAtKExOQV9nYWluW0xOQV0gKyAoQkIgKiAyKSk7CiAKIAkJCVJ4QUdDX2RCbSArPSA0OyAvKiBiaWFzICovCiAJCX0KQEAgLTEzNTQsMjEgKzEzODAsMjMgQEAKIAkJcHJpdi0+UlNTSSA9IFJTU0k7CiAJCS8qIFNRIHRyYW5zbGF0aW9uIGZvcm11bGEgaXMgcHJvdmlkZWQgYnkgU0QzIERaLiAyMDA2LjA2LjI3ICovCiAJCWlmIChxdWFsaXR5ID49IDEyNykKLQkJCXF1YWxpdHkgPSAxOyAvKjA7ICovIC8qIDAgd2lsbCBjYXVzZSBlcGMgdG8gc2hvdyBzaWduYWwgemVybyAsIHdhbGsgYXJvdW5kIG5vdzsgKi8KKwkJCS8qIDAgY2F1c2VzIGVwYyB0byBzaG93IHNpZ25hbCB6ZXJvLCB3YWxrIGFyb3VuZCBub3cgKi8KKwkJCXF1YWxpdHkgPSAxOwogCQllbHNlIGlmIChxdWFsaXR5IDwgMjcpCiAJCQlxdWFsaXR5ID0gMTAwOwogCQllbHNlCiAJCQlxdWFsaXR5ID0gMTI3IC0gcXVhbGl0eTsKIAkJcHJpdi0+U2lnbmFsUXVhbGl0eSA9IHF1YWxpdHk7CiAKLQkJc3RhdHMuc2lnbmFsID0gKHU4KXF1YWxpdHk7IC8qcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwgPSBwcml2LT5TaWduYWxTdHJlbmd0aDsgKi8KKwkJc3RhdHMuc2lnbmFsID0gKHU4KSBxdWFsaXR5OworCiAJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gUlhBR0M7CiAJCWlmIChzdGF0cy5zaWduYWxzdHJlbmd0aCA+IDEwMCkKIAkJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gMTAwOwotCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IChzdGF0cy5zaWduYWxzdHJlbmd0aCAqIDcwKS8xMDAgKyAzMDsKLQkJLyogcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT5yeCA6IFJYQUdDIGlzICVkLHNpZ25hbHN0cmVuZ3RoIGlzICVkXG4iLFJYQUdDLHN0YXRzLnNpZ25hbHN0cmVuZ3RoKTsgKi8KKwkJc3RhdHMuc2lnbmFsc3RyZW5ndGggPSAoc3RhdHMuc2lnbmFsc3RyZW5ndGggKiA3MCkgLyAxMDAgKyAzMDsKIAkJc3RhdHMucnNzaSA9IHByaXYtPndzdGF0cy5xdWFsLnF1YWwgPSBwcml2LT5TaWduYWxRdWFsaXR5OwotCQlzdGF0cy5ub2lzZSA9IHByaXYtPndzdGF0cy5xdWFsLm5vaXNlID0gMTAwIC0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbDsKKwkJc3RhdHMubm9pc2UgPSBwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9CisJCQkxMDAgLSBwcml2LT53c3RhdHMucXVhbC5xdWFsOwogCQliSHdFcnJvciA9ICgoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDB4MDAwMDBmZmYpKSA9PSA0MDgwKSB8CiAJCQkgICAoKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgweDA0MDAwMDAwKSkgIT0gMCkgfAogCQkJICAgKCgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMHgwODAwMDAwMCkpICE9IDApIHwKQEAgLTEzOTcsMjcgKzE0MjUsNDAgQEAKIAogCQkJLyogRm9yIGdvb2QtbG9va2luZyBzaW5nYWwgc3RyZW5ndGguICovCiAJCQlTaWduYWxTdHJlbmd0aEluZGV4ID0gTmV0Z2VhclNpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKAotCQkJCQkJCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCwKLQkJCQkJCQlwcml2LT5TaWduYWxTdHJlbmd0aCk7CisJCQkJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50LAorCQkJCXByaXYtPlNpZ25hbFN0cmVuZ3RoKTsKIAogCQkJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50ID0gU2lnbmFsU3RyZW5ndGhJbmRleDsKLQkJCXByaXYtPlN0YXRzX1NpZ25hbFN0cmVuZ3RoID0gVHJhbnNsYXRlVG9EYm04MTg1KCh1OClTaWduYWxTdHJlbmd0aEluZGV4KTsKLQkJLyoKLQkJICogV2UgbmVlZCBtb3JlIGNvcnJlY3QgcG93ZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyBhbmQgdGhlICAiU2lnbmFsU3RyZW5ndGgiIG9mIFJ4U3RhdHMgaXMgYmVhdXRpZmllZCwKLQkJICogc28gd2UgcmVjb3JkIHRoZSBjb3JyZWN0IHBvd2VyIGhlcmUuCi0JCSAqLwotCQkJcHJpdi0+U3RhdHNfU2lnbmFsUXVhbGl0eSA9IChsb25nKShwcml2LT5TdGF0c19TaWduYWxRdWFsaXR5ICogNSArIChsb25nKXByaXYtPlNpZ25hbFF1YWxpdHkgKyA1KSAvIDY7Ci0JCQlwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgPSAobG9uZykocHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyICogNSArIHByaXYtPlJlY3ZTaWduYWxQb3dlciAtIDEpIC8gNjsKKwkJCXByaXYtPlN0YXRzX1NpZ25hbFN0cmVuZ3RoID0KKwkJCQlUcmFuc2xhdGVUb0RibTgxODUoKHU4KVNpZ25hbFN0cmVuZ3RoSW5kZXgpOwogCi0JCS8qIEZpZ3VyZSBvdXQgd2hpY2ggYW50ZW5uYSB0aGF0IHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldC4gKi8KLQkJCXByaXYtPkxhc3RSeFBrdEFudGVubmEgPSBBbnRlbm5hID8gMSA6IDA7IC8qIDA6IGF1eCwgMTogbWFpbi4gKi8KKwkJCS8qCisJCQkgKiBXZSBuZWVkIG1vcmUgY29ycmVjdCBwb3dlciBvZiByZWNlaXZlZCBwYWNrZXRzIGFuZAorCQkJICogdGhlICJTaWduYWxTdHJlbmd0aCIgb2YgUnhTdGF0cyBpcyBiZWF1dGlmaWVkLCBzbyB3ZQorCQkJICogcmVjb3JkIHRoZSBjb3JyZWN0IHBvd2VyIGhlcmUuCisJCQkgKi8KKworCQkJcHJpdi0+U3RhdHNfU2lnbmFsUXVhbGl0eSA9IChsb25nKSgKKwkJCQlwcml2LT5TdGF0c19TaWduYWxRdWFsaXR5ICogNSArCisJCQkJKGxvbmcpcHJpdi0+U2lnbmFsUXVhbGl0eSArIDUpIC8gNjsKKworCQkJcHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyID0gKGxvbmcpKAorCQkJCXByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlciAqIDUgKworCQkJCXByaXYtPlJlY3ZTaWduYWxQb3dlciAtIDEpIC8gNjsKKworCQkJLyoKKwkJCSAqIEZpZ3VyZSBvdXQgd2hpY2ggYW50ZW5uYSByZWNlaXZlZCB0aGUgbGFzdCBwYWNrZXQuCisJCQkgKiAwOiBhdXgsIDE6IG1haW4KKwkJCSAqLworCQkJcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSA9IEFudGVubmEgPyAxIDogMDsKIAkJCVN3QW50ZW5uYURpdmVyc2l0eVJ4T2s4MTg1KGRldiwgcHJpdi0+U2lnbmFsU3RyZW5ndGgpOwogCQl9CiAKIAkJaWYgKGZpcnN0KSB7CiAJCQlpZiAoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkgewogCQkJCS8qIHNlZW1zIHRoYXQgSFcgc29tZXRpbWVzIGZhaWxzIHRvIHJlY2VpdmUgYW5kCi0JCQkJICAgZG9lc24ndCBwcm92aWRlIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkJCQkgKiBkb2Vzbid0IHByb3ZpZGUgdGhlIGxhc3QgZGVzY3JpcHRvci4KKwkJCQkgKi8KIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9za2IpOwogCQkJCXByaXYtPnN0YXRzLnJ4bm9sYXN0Kys7CiAJCQl9CkBAIC0xNDI4LDE1ICsxNDY5LDE2IEBACiAJCQlwcml2LT5yeF9za2JfY29tcGxldGUgPSAwOwogCQkJcHJpdi0+cnhfc2tiLT5kZXYgPSBkZXY7CiAJCX0gZWxzZSB7Ci0JCQkvKiBpZiB3ZSBhcmUgaGVyZSB3ZSBzaG91bGQgaGF2ZSBhbHJlYWR5IFJYZWQKLQkJCSogdGhlIGZpcnN0IGZyYW1lLgotCQkJKiBJZiB3ZSBnZXQgaGVyZSBhbmQgdGhlIHNrYiBpcyBub3QgYWxsb2NhdGVkIHRoZW4KLQkJCSogd2UgaGF2ZSBqdXN0IHRocm93IG91dCBnYXJiYWdlIChza2Igbm90IGFsbG9jYXRlZCkKLQkJCSogYW5kIHdlIGFyZSBzdGlsbCByeGluZyBnYXJiYWdlLi4uLgotCQkJKi8KKwkJCS8qIGlmIHdlIGFyZSBoZXJlIHdlIHNob3VsZCBoYXZlIGFscmVhZHkgUlhlZCB0aGUgZmlyc3QKKwkJCSAqIGZyYW1lLgorCQkJICogSWYgd2UgZ2V0IGhlcmUgYW5kIHRoZSBza2IgaXMgbm90IGFsbG9jYXRlZCB0aGVuCisJCQkgKiB3ZSBoYXZlIGp1c3QgdGhyb3cgb3V0IGdhcmJhZ2UgKHNrYiBub3QgYWxsb2NhdGVkKQorCQkJICogYW5kIHdlIGFyZSBzdGlsbCByeGluZyBnYXJiYWdlLi4uLgorCQkJICovCiAJCQlpZiAoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkgewogCi0JCQkJdG1wX3NrYiA9IGRldl9hbGxvY19za2IocHJpdi0+cnhfc2tiLT5sZW4rbGVuKzIpOworCQkJCXRtcF9za2IgPSBkZXZfYWxsb2Nfc2tiKAorCQkJCQlwcml2LT5yeF9za2ItPmxlbiArIGxlbiArIDIpOwogCiAJCQkJaWYgKCF0bXBfc2tiKQogCQkJCQlnb3RvIGRyb3A7CkBAIC0xNDU0LDEzICsxNDk2LDggQEAKIAkJfQogCiAJCWlmICghcHJpdi0+cnhfc2tiX2NvbXBsZXRlKSB7Ci0JCQlpZiAocGFkZGluZykgewotCQkJCW1lbWNweShza2JfcHV0KHByaXYtPnJ4X3NrYiwgbGVuKSwKLQkJCQkJKCgodW5zaWduZWQgY2hhciAqKXByaXYtPnJ4YnVmZmVyLT5idWYpICsgMiksIGxlbik7Ci0JCQl9IGVsc2UgewotCQkJCW1lbWNweShza2JfcHV0KHByaXYtPnJ4X3NrYiwgbGVuKSwKLQkJCQkJcHJpdi0+cnhidWZmZXItPmJ1ZiwgbGVuKTsKLQkJCX0KKwkJCW1lbWNweShza2JfcHV0KHByaXYtPnJ4X3NrYiwgbGVuKSwgKCh1bnNpZ25lZCBjaGFyICopCisJCQkJcHJpdi0+cnhidWZmZXItPmJ1ZikgKyAocGFkZGluZyA/IDIgOiAwKSwgbGVuKTsKIAkJfQogCiAJCWlmIChsYXN0ICYmICFwcml2LT5yeF9za2JfY29tcGxldGUpIHsKQEAgLTE1MzgsOCArMTU3NSw4IEBACiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCWludCBtb2RlOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopIHNrYi0+ZGF0YTsKLQlzaG9ydCBtb3JlZnJhZyA9IChoLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaCA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKKwlib29sIG1vcmVmcmFnID0gbGUxNl90b19jcHUoaC0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcHJpb3JpdHk7CiAKQEAgLTE1NDcsMTEgKzE1ODQsMTAgQEAKIAogCXJhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKHJhdGUpOwogCS8qCi0JICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgbG9jayBiZWNhdXNlIHdlIG1ha2UKLQkgKiBzdXJlIGl0J3MgY2FsbGVkIHdpdGggdGhlIHR4X2xvY2sgYWxyZWFkeSBhY3F1aXJlZC4KLQkgKiB0aGlzIGNvbWUgZnJvbSB0aGUga2VybmVsJ3MgaGFyZF94bWl0IGNhbGxiYWNrICh0aHJvdWdoCi0JICogdGhlIGllZWUgc3RhY2ssIG9yIGZyb20gdGhlIHRyeV93YWtlX3F1ZXVlIChhZ2FpbiB0aHJvdWdoCi0JICogdGhlIGllZWUgc3RhY2suCisJICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgbG9jayBiZWNhdXNlIHdlIG1ha2Ugc3VyZSBpdCdzIGNhbGxlZAorCSAqIHdpdGggdGhlIHR4X2xvY2sgYWxyZWFkeSBhY3F1aXJlZC4KKwkgKiBUaGlzIGNvbWUgZnJvbSB0aGUga2VybmVsJ3MgaGFyZF94bWl0IGNhbGxiYWNrICh0aHJvdWdoIHRoZSBpZWVlCisJICogc3RhY2ssIG9yIGZyb20gdGhlIHRyeV93YWtlX3F1ZXVlIChhZ2FpbiB0aHJvdWdoIHRoZSBpZWVlIHN0YWNrLgogCSAqLwogCXByaW9yaXR5ID0gQUMyUShza2ItPnByaW9yaXR5KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwpAQCAtMTYxMyw1NSArMTY0OSw2IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAotLyogbG9uZ3ByZSAxNDQrNDggc2hvcnRwcmUgNzIrMjQgKi8KLXUxNiBydGw4MTgwX2xlbjJkdXJhdGlvbih1MzIgbGVuLCBzaG9ydCByYXRlLCBzaG9ydCAqZXh0KQotewotCXUxNiBkdXJhdGlvbjsKLQl1MTYgZHJpZnQ7Ci0JKmV4dCA9IDA7Ci0KLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIDA6IC8qIDFtYnBzICovCi0JCSpleHQgPSAwOwotCQlkdXJhdGlvbiA9ICgobGVuKzQpPDw0KSAvIDB4MjsKLQkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDI7Ci0JCWlmIChkcmlmdCA9PSAwKQotCQkJYnJlYWs7Ci0JCWR1cmF0aW9uKys7Ci0JCWJyZWFrOwotCWNhc2UgMTogLyogMm1icHMgKi8KLQkJKmV4dCA9IDA7Ci0JCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8gMHg0OwotCQlkcmlmdCA9ICgobGVuKzQpPDw0KSAlIDB4NDsKLQkJaWYgKGRyaWZ0ID09IDApCi0JCQlicmVhazsKLQkJZHVyYXRpb24rKzsKLQkJYnJlYWs7Ci0JY2FzZSAyOiAvKiA1LjVtYnBzICovCi0JCSpleHQgPSAwOwotCQlkdXJhdGlvbiA9ICgobGVuKzQpPDw0KSAvIDB4YjsKLQkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweGI7Ci0JCWlmIChkcmlmdCA9PSAwKQotCQkJYnJlYWs7Ci0JCWR1cmF0aW9uKys7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSAzOiAvKiAxMW1icHMgKi8KLQkJKmV4dCA9IDA7Ci0JCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8gMHgxNjsKLQkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDE2OwotCQlpZiAoZHJpZnQgPT0gMCkKLQkJCWJyZWFrOwotCQlkdXJhdGlvbisrOwotCQlpZiAoZHJpZnQgPiA2KQotCQkJYnJlYWs7Ci0JCSpleHQgPSAxOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZHVyYXRpb247Ci19Ci0KIHN0YXRpYyB2b2lkIHJ0bDgxODBfcHJlcGFyZV9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNjY5LDcgKzE2NTYsMTAgQEAKIAogCXUxNiB3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCY25JdHYpOwogCXdvcmQgJj0gfkJjbkl0dl9CY25JdHY7IC8qIGNsZWFyIEJjbl9JdHYgKi8KLQl3b3JkIHw9IGNwdV90b19sZTE2KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7IC8qIDB4NjQ7ICovCisKKwkvKiB3b3JkIHw9IDB4NjQ7ICovCisJd29yZCB8PSBjcHVfdG9fbGUxNihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOworCiAJd3JpdGVfbmljX3dvcmQoZGV2LCBCY25JdHYsIHdvcmQpOwogCiAJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb24ocHJpdi0+aWVlZTgwMjExKTsKQEAgLTE2ODEsMTIgKzE2NzEsMTIgQEAKIH0KIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gZG8gdGhlIHJlYWwgZGlydHkgd29yazogaXQgZW5xdWV1ZXMgYSBUWCBjb21tYW5kCi0gKiBkZXNjcmlwdG9yIGluIHRoZSByaW5nIGJ1ZmZlciwgY29weWVzIHRoZSBmcmFtZSBpbiBhIFRYIGJ1ZmZlcgotICogYW5kIGtpY2tzIHRoZSBOSUMgdG8gZW5zdXJlIGl0IGRvZXMgdGhlIERNQSB0cmFuc2Zlci4KKyAqIFRoaXMgZnVuY3Rpb24gZG8gdGhlIHJlYWwgZGlydHkgd29yazogaXQgZW5xdWV1ZXMgYSBUWCBjb21tYW5kIGRlc2NyaXB0b3IgaW4KKyAqIHRoZSByaW5nIGJ1ZmZlciwgY29weWVzIHRoZSBmcmFtZSBpbiBhIFRYIGJ1ZmZlciBhbmQga2lja3MgdGhlIE5JQyB0byBlbnN1cmUKKyAqIGl0IGRvZXMgdGhlIERNQSB0cmFuc2Zlci4KICAqLwogc2hvcnQgcnRsODE4MF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqdHhidWYsIGludCBsZW4sIGludCBwcmlvcml0eSwKLQkJIHNob3J0IG1vcmVmcmFnLCBzaG9ydCBkZXNjZnJhZywgaW50IHJhdGUpCisJCSBib29sIG1vcmVmcmFnLCBzaG9ydCBkZXNjZnJhZywgaW50IHJhdGUpCiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUzMiAqdGFpbCwgKnRlbXBfdGFpbDsKQEAgLTE2OTcsMTYgKzE2ODcsMTcgQEAKIAlpbnQgYnVmbGVuOwogCWludCBjb3VudDsKIAlzdHJ1Y3QgYnVmZmVyICpidWZsaXN0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpmcmFnX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXR4YnVmOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpmcmFnX2hkciA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXR4YnVmOwogCXU4IGRlc3RbRVRIX0FMRU5dOwotCXU4CQkJYlVzZVNob3J0UHJlYW1ibGUgPSAwOwotCXU4CQkJYkNUU0VuYWJsZSA9IDA7Ci0JdTgJCQliUlRTRW5hYmxlID0gMDsKLQl1MTYJCQlEdXJhdGlvbiA9IDA7Ci0JdTE2CQkJUnRzRHVyID0gMDsKLQl1MTYJCQlUaGlzRnJhbWVUaW1lID0gMDsKLQl1MTYJCQlUeERlc2NEdXJhdGlvbiA9IDA7Ci0JYm9vbAkJCW93bmJpdF9mbGFnID0gZmFsc2U7CisJdTggYlVzZVNob3J0UHJlYW1ibGUgPSAwOworCXU4IGJDVFNFbmFibGUgPSAwOworCXU4IGJSVFNFbmFibGUgPSAwOworCXUxNiBEdXJhdGlvbiA9IDA7CisJdTE2IFJ0c0R1ciA9IDA7CisJdTE2IFRoaXNGcmFtZVRpbWUgPSAwOworCXUxNiBUeERlc2NEdXJhdGlvbiA9IDA7CisJYm9vbCBvd25iaXRfZmxhZyA9IGZhbHNlOwogCiAJc3dpdGNoIChwcmlvcml0eSkgewogCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgpAQCAtMTc1Niw3NCArMTc0Nyw3OSBAQAogCQlicmVhazsKIAl9CiAKLQkJbWVtY3B5KCZkZXN0LCBmcmFnX2hkci0+YWRkcjEsIEVUSF9BTEVOKTsKLQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7Ci0JCQlEdXJhdGlvbiA9IDA7Ci0JCQlSdHNEdXIgPSAwOwotCQkJYlJUU0VuYWJsZSA9IDA7CisJbWVtY3B5KCZkZXN0LCBmcmFnX2hkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKKwkJRHVyYXRpb24gPSAwOworCQlSdHNEdXIgPSAwOworCQliUlRTRW5hYmxlID0gMDsKKwkJYkNUU0VuYWJsZSA9IDA7CisKKwkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywKKwkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7CisJCVR4RGVzY0R1cmF0aW9uID0gVGhpc0ZyYW1lVGltZTsKKwl9IGVsc2UgeyAvKiBVbmljYXN0IHBhY2tldCAqLworCQl1MTYgQWNrVGltZTsKKworCQkvKiBmb3IgS2VlcCBhbGl2ZSAqLworCQlwcml2LT5OdW1UeFVuaWNhc3QrKzsKKworCQkvKiBGaWd1cmUgb3V0IEFDSyByYXRlIGFjY29yZGluZyB0byBCU1MgYmFzaWMgcmF0ZQorCQkgKiBhbmQgVHggcmF0ZS4KKwkJICogQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCSAqLworCQlBY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsIDAsIDApOworCisJCWlmICgoKGxlbiArIHNDcmNMbmcpID4gcHJpdi0+cnRzKSAmJiBwcml2LT5ydHMpIHsgLyogUlRTL0NUUy4gKi8KKwkJCXUxNiBSdHNUaW1lLCBDdHNUaW1lOworCQkJYlJUU0VuYWJsZSA9IDE7CiAJCQliQ1RTRW5hYmxlID0gMDsKIAotCQkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywgcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCi0JCQkJCQkgICAgICAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7Ci0JCQlUeERlc2NEdXJhdGlvbiA9IFRoaXNGcmFtZVRpbWU7Ci0JCX0gZWxzZSB7IC8qIFVuaWNhc3QgcGFja2V0ICovCi0JCQl1MTYgQWNrVGltZTsKKwkJCS8qIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIFJUUy4gKi8KKwkJCVJ0c1RpbWUgPSBDb21wdXRlVHhUaW1lKHNBY2tDdHNMbmcgLyA4LAorCQkJCXByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSwgMCwgMCk7CiAKLQkJCS8qIFlKLGFkZCwwODA4MjgsZm9yIEtlZXAgYWxpdmUgKi8KLQkJCXByaXYtPk51bVR4VW5pY2FzdCsrOworCQkJLyogUmF0ZSBhbmQgdGltZSByZXF1aXJlZCBmb3IgQ1RTLgorCQkJICogQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCQkgKi8KKwkJCUN0c1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwgMCwgMCk7CiAKLQkJCS8qIEZpZ3VyZSBvdXQgQUNLIHJhdGUgYWNjb3JkaW5nIHRvIEJTUyBiYXNpYyByYXRlCi0JCQkgKiBhbmQgVHggcmF0ZS4gKi8KLQkJCUFja1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwgMCwgMCk7CS8qIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZCAqLworCQkJLyogRmlndXJlIG91dCB0aW1lIHJlcXVpcmVkIHRvIHRyYW5zbWl0IHRoaXMgZnJhbWUuICovCisJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLAorCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLAorCQkJCWJVc2VTaG9ydFByZWFtYmxlKTsKIAotCQkJaWYgKCgobGVuICsgc0NyY0xuZykgPiBwcml2LT5ydHMpICYmIHByaXYtPnJ0cykgeyAvKiBSVFMvQ1RTLiAqLwotCQkJCXUxNiBSdHNUaW1lLCBDdHNUaW1lOwotCQkJCS8qIHUxNiBDdHNSYXRlOyAqLwotCQkJCWJSVFNFbmFibGUgPSAxOwotCQkJCWJDVFNFbmFibGUgPSAwOworCQkJLyogUlRTLUNUUy1UaGlzRnJhbWUtQUNLLiAqLworCQkJUnRzRHVyID0gQ3RzVGltZSArIFRoaXNGcmFtZVRpbWUgKworCQkJCUFja1RpbWUgKyAzICogYVNpZnNUaW1lOwogCi0JCQkJLyogUmF0ZSBhbmQgdGltZSByZXF1aXJlZCBmb3IgUlRTLiAqLwotCQkJCVJ0c1RpbWUgPSBDb21wdXRlVHhUaW1lKHNBY2tDdHNMbmcvOCwgcHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlLCAwLCAwKTsKLQkJCQkvKiBSYXRlIGFuZCB0aW1lIHJlcXVpcmVkIGZvciBDVFMuICovCi0JCQkJQ3RzVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDEwLCAwLCAwKTsJLyogQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kICovCisJCQlUeERlc2NEdXJhdGlvbiA9IFJ0c1RpbWUgKyBSdHNEdXI7CisJCX0gZWxzZSB7IC8qIE5vcm1hbCBjYXNlLiAqLworCQkJYkNUU0VuYWJsZSA9IDA7CisJCQliUlRTRW5hYmxlID0gMDsKKwkJCVJ0c0R1ciA9IDA7CiAKLQkJCQkvKiBGaWd1cmUgb3V0IHRpbWUgcmVxdWlyZWQgdG8gdHJhbnNtaXQgdGhpcyBmcmFtZS4gKi8KLQkJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLAotCQkJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCi0JCQkJCQkwLAotCQkJCQkJYlVzZVNob3J0UHJlYW1ibGUpOworCQkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywKKwkJCQlydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwgYlVzZVNob3J0UHJlYW1ibGUpOworCQkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lICsgYVNpZnNUaW1lICsgQWNrVGltZTsKKwkJfQogCi0JCQkJLyogUlRTLUNUUy1UaGlzRnJhbWUtQUNLLiAqLwotCQkJCVJ0c0R1ciA9IEN0c1RpbWUgKyBUaGlzRnJhbWVUaW1lICsgQWNrVGltZSArIDMqYVNpZnNUaW1lOworCQlpZiAoIShsZTE2X3RvX2NwdShmcmFnX2hkci0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpKSB7CisJCQkvKiBUaGlzRnJhbWUtQUNLLiAqLworCQkJRHVyYXRpb24gPSBhU2lmc1RpbWUgKyBBY2tUaW1lOworCQl9IGVsc2UgeyAvKiBPbmUgb3IgbW9yZSBmcmFnbWVudHMgcmVtYWluZWQuICovCisJCQl1MTYgTmV4dEZyYWdUaW1lOwogCi0JCQkJVHhEZXNjRHVyYXRpb24gPSBSdHNUaW1lICsgUnRzRHVyOwotCQkJfSBlbHNlIHsgLyogTm9ybWFsIGNhc2UuICovCi0JCQkJYkNUU0VuYWJsZSA9IDA7Ci0JCQkJYlJUU0VuYWJsZSA9IDA7Ci0JCQkJUnRzRHVyID0gMDsKKwkJCS8qIHByZXRlbmQgZm9sbG93aW5nIHBhY2tldCBsZW5ndGggPSBjdXJyZW50IHBhY2tldCAqLworCQkJTmV4dEZyYWdUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLAorCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7CiAKLQkJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLCBydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwKLQkJCQkJCQkgICAgICAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7Ci0JCQkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lICsgYVNpZnNUaW1lICsgQWNrVGltZTsKLQkJCX0KKwkJCS8qIFRoaXNGcmFnLUFDay1OZXh0RnJhZy1BQ0suICovCisJCQlEdXJhdGlvbiA9IE5leHRGcmFnVGltZSArIDMgKiBhU2lmc1RpbWUgKyAyICogQWNrVGltZTsKKwkJfQogCi0JCQlpZiAoIShmcmFnX2hkci0+ZnJhbWVfY29udHJvbCAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpIHsKLQkJCQkvKiBUaGlzRnJhbWUtQUNLLiAqLwotCQkJCUR1cmF0aW9uID0gYVNpZnNUaW1lICsgQWNrVGltZTsKLQkJCX0gZWxzZSB7IC8qIE9uZSBvciBtb3JlIGZyYWdtZW50cyByZW1haW5lZC4gKi8KLQkJCQl1MTYgTmV4dEZyYWdUaW1lOwotCQkJCU5leHRGcmFnVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywgLyogcHJldGVuZCBmb2xsb3dpbmcgcGFja2V0IGxlbmd0aCBlcXVhbCBjdXJyZW50IHBhY2tldCAqLwotCQkJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCi0JCQkJCQkwLAotCQkJCQkJYlVzZVNob3J0UHJlYW1ibGUpOworCX0gLyogRW5kIG9mIFVuaWNhc3QgcGFja2V0ICovCiAKLQkJCQkvKiBUaGlzRnJhZy1BQ2stTmV4dEZyYWctQUNLLiAqLwotCQkJCUR1cmF0aW9uID0gTmV4dEZyYWdUaW1lICsgMyphU2lmc1RpbWUgKyAyKkFja1RpbWU7Ci0JCQl9Ci0KLQkJfSAvKiBFbmQgb2YgVW5pY2FzdCBwYWNrZXQgKi8KLQotCQlmcmFnX2hkci0+ZHVyYXRpb25faWQgPSBEdXJhdGlvbjsKKwlmcmFnX2hkci0+ZHVyYXRpb25faWQgPSBEdXJhdGlvbjsKIAogCWJ1ZmxlbiA9IHByaXYtPnR4YnVmZnNpemU7CiAJcmVtYWluID0gbGVuOwpAQCAtMTgzMiw3ICsxODI4LDggQEAKIAl3aGlsZSAocmVtYWluICE9IDApIHsKIAkJbWIoKTsKIAkJaWYgKCFidWZsaXN0KSB7Ci0JCQlETUVTR0UoIlRYIGJ1ZmZlciBlcnJvciwgY2Fubm90IFRYIGZyYW1lcy4gcHJpICVkLiIsIHByaW9yaXR5KTsKKwkJCURNRVNHRSgiVFggYnVmZmVyIGVycm9yLCBjYW5ub3QgVFggZnJhbWVzLiBwcmkgJWQuIiwKKwkJCQlwcmlvcml0eSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJYnVmID0gYnVmbGlzdC0+YnVmOwpAQCAtMTg1MSw0MyArMTg0OCw0MyBAQAogCQkqKHRhaWwrNikgPSAwOwogCQkqKHRhaWwrNykgPSAwOwogCi0JCS8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgSFcgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLiovCisJCS8qIEZJWE1FOiBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IEhXIGVuY3J5cHRpb24gcGFyYW1ldGVycy4qLwogCQkqdGFpbCB8PSAoMTw8MTUpOyAvKiBubyBlbmNyeXB0ICovCiAKIAkJaWYgKHJlbWFpbiA9PSBsZW4gJiYgIWRlc2NmcmFnKSB7CiAJCQlvd25iaXRfZmxhZyA9IGZhbHNlOwotCQkJKnRhaWwgPSAqdGFpbCB8ICgxPDwyOSk7IC8qIGZpc3Qgc2VnbWVudCBvZiB0aGUgcGFja2V0ICovCisJCQkqdGFpbCA9ICp0YWlsIHwgKDEgPDwgMjkpOyAvKiBmaXJzdCBzZWdtZW50IG9mIHBhY2tldCAqLwogCQkJKnRhaWwgPSAqdGFpbCB8IChsZW4pOwogCQl9IGVsc2UgewogCQkJb3duYml0X2ZsYWcgPSB0cnVlOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IGJ1ZmxlbiAmJiByZW1haW4gPiAwOyBpKyssIHJlbWFpbi0tKSB7Ci0JCQkoKHU4ICopYnVmKVtpXSA9IHR4YnVmW2ldOyAvKiBjb3B5IGRhdGEgaW50byBkZXNjcmlwdG9yIHBvaW50ZWQgRE1BYmxlIGJ1ZmZlciAqLworCQkJLyogY29weSBkYXRhIGludG8gZGVzY3JpcHRvciBwb2ludGVkIERNQWJsZSBidWZmZXIgKi8KKwkJCSgodTggKilidWYpW2ldID0gdHhidWZbaV07CisKIAkJCWlmIChyZW1haW4gPT0gNCAmJiBpKzQgPj0gYnVmbGVuKQogCQkJCWJyZWFrOwogCQkJLyogZW5zdXJlIHRoZSBsYXN0IGRlc2MgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgcGF5bG9hZCAqLwotCiAJCX0KIAkJdHhidWYgPSB0eGJ1ZiArIGk7CiAJCSoodGFpbCszKSA9ICoodGFpbCszKSAmIH4weGZmZjsKIAkJKih0YWlsKzMpID0gKih0YWlsKzMpIHwgaTsgLyogYnVmZmVyIGxlbmd0aCAqLwotCQkvKiBVc2Ugc2hvcnQgcHJlYW1ibGUgb3Igbm90ICovCi0JCWlmIChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5JldMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKLQkJCWlmIChwcml2LT5wbGNwX3ByZWFtYmxlX21vZGUgPT0gMSAmJiByYXRlICE9IDApCS8qICBzaG9ydCBtb2RlIG5vdywgbm90IGxvbmchICovCi0JCQk7IC8qICp0YWlsIHw9ICgxPDwxNik7ICovCQkJCS8qIGVuYWJsZSBzaG9ydCBwcmVhbWJsZSBtb2RlLiAqLwogCiAJCWlmIChiQ1RTRW5hYmxlKQogCQkJKnRhaWwgfD0gKDE8PDE4KTsKIAogCQlpZiAoYlJUU0VuYWJsZSkgeyAvKiBydHMgZW5hYmxlICovCi0JCQkqdGFpbCB8PSAoKGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSk8PDE5KTsgLyogUlRTIFJBVEUgKi8KKwkJCS8qIFJUUyBSQVRFICovCisJCQkqdGFpbCB8PSAoaWVlZXJhdGUycnRscmF0ZSgKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpIDw8IDE5KTsKKwogCQkJKnRhaWwgfD0gKDE8PDIzKTsgLyogcnRzIGVuYWJsZSAqLwogCQkJKih0YWlsKzEpIHw9IChSdHNEdXImMHhmZmZmKTsgLyogUlRTIER1cmF0aW9uICovCiAJCX0KIAkJKih0YWlsKzMpIHw9ICgoVHhEZXNjRHVyYXRpb24mMHhmZmZmKTw8MTYpOyAvKiBEVVJBVElPTiAqLwotCQkvKiAqKHRhaWwrMykgfD0gKDB4ZTY8PDE2KTsgKi8KLQkJKih0YWlsKzUpIHw9ICgxMTw8OCk7IC8qIChwcml2LT5yZXRyeV9kYXRhPDw4KTsgKi8gLyogcmV0cnkgbGltOyAqLworCisJCSoodGFpbCArIDUpIHw9ICgxMSA8PCA4KTsgLyogcmV0cnkgbGltOyAqLwogCiAJCSp0YWlsID0gKnRhaWwgfCAoKHJhdGUmMHhmKSA8PCAyNCk7CiAKQEAgLTE5MDEsNyArMTg5OCw4IEBACiAKIAkJd21iKCk7CiAJCWlmIChvd25iaXRfZmxhZykKLQkJCSp0YWlsID0gKnRhaWwgfCAoMTw8MzEpOyAvKiBkZXNjcmlwdG9yIHJlYWR5IHRvIGJlIHR4ZWQgKi8KKwkJCS8qIGRlc2NyaXB0b3IgcmVhZHkgdG8gYmUgdHhlZCAqLworCQkJKnRhaWwgfD0gKDEgPDwgMzEpOwogCiAJCWlmICgodGFpbCAtIGJlZ2luKS84ID09IGNvdW50LTEpCiAJCQl0YWlsID0gYmVnaW47CkBAIC0xOTgzLDcgKzE5ODEsOCBAQAogCiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCi0Jd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc0LCByZWFkX25pY19ieXRlKGRldiwgQ09ORklHNCkgfCBDT05GSUc0X1BXUk1HVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc0LAorCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNCkgfCBDT05GSUc0X1BXUk1HVCk7CiAJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAxOwogfQogCkBAIC0yMDMxLDcgKzIwMzAsOCBAQAogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wc19sb2NrLCBmbGFncyk7Ci0Jd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc0LCByZWFkX25pY19ieXRlKGRldiwgQ09ORklHNCkgJiB+Q09ORklHNF9QV1JNR1QpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNCwKKwkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzQpICYgfkNPTkZJRzRfUFdSTUdUKTsKIAlpZiAocHJpdi0+cmZfd2FrZXVwKQogCQlwcml2LT5yZl93YWtldXAoZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLCBmbGFncyk7CkBAIC0yMDYzLDEzICsyMDYzLDEzIEBACiAJdGwgLT0gTVNFQ1MoNCsxNis3KTsKIAogCS8qCi0JICogSWYgdGhlIGludGVydmFsIGluIHdpdGNoIHdlIGFyZSByZXF1ZXN0ZWQgdG8gc2xlZXAgaXMgdG9vCisJICogSWYgdGhlIGludGVydmFsIGluIHdoaWNoIHdlIGFyZSByZXF1ZXN0ZWQgdG8gc2xlZXAgaXMgdG9vCiAJICogc2hvcnQgdGhlbiBnaXZlIHVwIGFuZCByZW1haW4gYXdha2UKIAkgKi8KIAlpZiAoKCh0bCA+PSByYikgJiYgKHRsLXJiKSA8PSBNU0VDUyhNSU5fU0xFRVBfVElNRSkpCiAJCXx8ICgocmIgPiB0bCkgJiYgKHJiLXRsKSA8IE1TRUNTKE1JTl9TTEVFUF9USU1FKSkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOwotCQlwcmludGsoInRvbyBzaG9ydCB0byBzbGVlcFxuIik7CisJCW5ldGRldl93YXJuKGRldiwgInRvbyBzaG9ydCB0byBzbGVlcFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIwNzgsNyArMjA3OCw4IEBACiAKIAkJcHJpdi0+RG96ZVBlcmlvZEluUGFzdDJTZWMgKz0gamlmZmllc190b19tc2Vjcyh0bXApOwogCQkvKiBhcyB0bCBtYXkgYmUgbGVzcyB0aGFuIHJiICovCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EsIHRtcCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5pZWVlODAyMTEtPndxLAorCQkJJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxLCB0bXApOwogCX0KIAkvKgogCSAqIElmIHdlIHN1c3BlY3QgdGhlIFRpbWVySW50IGlzIGdvbmUgYmV5b25kIHRsCkBAIC0yMDk1LDE2ICsyMDk2LDQ5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBydGw4MTgwX3dtbV9zaW5nbGVfcGFyYW1fdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTggbW9kZSwgQUNfQ09ESU5HIGVBQ0ksIFBBQ19QQVJBTSBwYXJhbSkKK3sKKwl1OCB1MWJBSUZTOworCXUzMiB1NGJBY1BhcmFtOworCisJLyogUmV0cmlldmUgcGFyYW1ldGVycyB0byB1cGRhdGUuICovCisJLyogTW9kZSBHL0E6IHNsb3RUaW1lVGltZXIgPSA5OyBNb2RlIEI6IDIwICovCisJdTFiQUlGUyA9IHBhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKiAoKG1vZGUgJiBJRUVFX0cpID09IElFRUVfRyA/CisJCTkgOiAyMCkgKyBhU2lmc1RpbWU7CisJdTRiQWNQYXJhbSA9ICgoKHUzMilwYXJhbS0+Zi5UWE9QTGltaXQgPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpIHwKKwkJKCh1MzIpcGFyYW0tPmYuRWN3LmYuRUNXbWF4IDw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKSB8CisJCSgodTMyKXBhcmFtLT5mLkVjdy5mLkVDV21pbiA8PCBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCkgfAorCQkoKHUzMil1MWJBSUZTIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7CisKKwlzd2l0Y2ggKGVBQ0kpIHsKKwljYXNlIEFDMV9CSzoKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQktfUEFSQU0sIHU0YkFjUGFyYW0pOworCQlyZXR1cm47CisJY2FzZSBBQzBfQkU6CisJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JFX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJcmV0dXJuOworCWNhc2UgQUMyX1ZJOgorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WSV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCXJldHVybjsKKwljYXNlIEFDM19WTzoKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVk9fUEFSQU0sIHU0YkFjUGFyYW0pOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJcHJfd2FybigiU2V0SHdSZWc4MTg1KCk6IGludmFsaWQgQUNJOiAlZCFcbiIsIGVBQ0kpOworCQlyZXR1cm47CisJfQorfQorCiBzdGF0aWMgdm9pZCBydGw4MTgwX3dtbV9wYXJhbV91cGRhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3bW1fcGFyYW1fdXBkYXRlX3dxKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd21tX3BhcmFtX3VwZGF0ZV93cSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKIAl1OCAqYWNfcGFyYW0gPSAodTggKikoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9wYXJhbSk7CiAJdTggbW9kZSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlOwotCUFDX0NPRElORwllQUNJOwotCUFDX1BBUkFNCUFjUGFyYW07Ci0JUEFDX1BBUkFNCXBBY1BhcmFtOwotCXU4IGk7CisJQUNfQ09ESU5HIGVBQ0k7CisJQUNfUEFSQU0gQWNQYXJhbTsKIAogCWlmICghaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpIHsKIAkJLyogbGVnYWN5IGFjX3h4X3BhcmFtIHVwZGF0ZSAqLwpAQCAtMjExNCw4MyArMjE0OCwyNiBAQAogCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWluID0gMzsgLyogRm9sbG93IDgwMi4xMSBDV21pbi4gKi8KIAkJQWNQYXJhbS5mLkVjdy5mLkVDV21heCA9IDc7IC8qIEZvbGxvdyA4MDIuMTEgQ1dtYXguICovCiAJCUFjUGFyYW0uZi5UWE9QTGltaXQgPSAwOworCiAJCWZvciAoZUFDSSA9IDA7IGVBQ0kgPCBBQ19NQVg7IGVBQ0krKykgewogCQkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUNJID0gKHU4KWVBQ0k7Ci0JCQl7Ci0JCQkJdTgJCXUxYkFJRlM7Ci0JCQkJdTMyCQl1NGJBY1BhcmFtOwotCQkJCXBBY1BhcmFtID0gKFBBQ19QQVJBTSkoJkFjUGFyYW0pOwotCQkJCS8qIFJldHJpZXZlIHBhcmFtZXRlcnMgdG8gdXBkYXRlLiAqLwotCQkJCXUxYkFJRlMgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFJRlNOICogKCgobW9kZSZJRUVFX0cpID09IElFRUVfRykgPyA5IDogMjApICsgYVNpZnNUaW1lOwotCQkJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShwQWNQYXJhbS0+Zi5UWE9QTGltaXQpKTw8QUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpfAotCQkJCQkgICAgICAoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21heCkpPDxBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCl8Ci0JCQkJCSAgICAgICgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWluKSk8PEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKLQkJCQkJICAgICAgICgoKHUzMil1MWJBSUZTKSA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOwotCQkJCXN3aXRjaCAoZUFDSSkgewotCQkJCWNhc2UgQUMxX0JLOgotCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CS19QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUMwX0JFOgotCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUMyX1ZJOgotCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WSV9QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUMzX1ZPOgotCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WT19QQVJBTSwgdTRiQWNQYXJhbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXByX3dhcm4oIlNldEh3UmVnODE4NSgpOmludmFsaWQgQUNJOiAlZCFcbiIsCi0JCQkJCQllQUNJKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQorCisJCQlydGw4MTgwX3dtbV9zaW5nbGVfcGFyYW1fdXBkYXRlKGRldiwgbW9kZSwgZUFDSSwKKwkJCQkoUEFDX1BBUkFNKSZBY1BhcmFtKTsKIAkJfQogCQlyZXR1cm47CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IEFDX01BWDsgaSsrKSB7Ci0JCS8qIEFjUGFyYW0ubG9uZ0RhdGEgPSAwOyAqLwotCQlwQWNQYXJhbSA9IChBQ19QQVJBTSAqKWFjX3BhcmFtOwotCQl7Ci0JCQlBQ19DT0RJTkcJZUFDSTsKLQkJCXU4CQl1MWJBSUZTOwotCQkJdTMyCQl1NGJBY1BhcmFtOworCWZvciAoZUFDSSA9IDA7IGVBQ0kgPCBBQ19NQVg7IGVBQ0krKykgeworCQlydGw4MTgwX3dtbV9zaW5nbGVfcGFyYW1fdXBkYXRlKGRldiwgbW9kZSwKKwkJCSgoUEFDX1BBUkFNKWFjX3BhcmFtKS0+Zi5BY2lBaWZzbi5mLkFDSSwKKwkJCShQQUNfUEFSQU0pYWNfcGFyYW0pOwogCi0JCQkvKiBSZXRyaWV2ZSBwYXJhbWV0ZXJzIHRvIHVwZGF0ZS4gKi8KLQkJCWVBQ0kgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFDSTsKLQkJCS8qIE1vZGUgRy9BOiBzbG90VGltZVRpbWVyID0gOTsgTW9kZSBCOiAyMCAqLwotCQkJdTFiQUlGUyA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKiAoKChtb2RlJklFRUVfRykgPT0gSUVFRV9HKSA/IDkgOiAyMCkgKyBhU2lmc1RpbWU7Ci0JCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocEFjUGFyYW0tPmYuVFhPUExpbWl0KSkgPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpCXwKLQkJCQkJKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtYXgpKSA8PCBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCkJfAotCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21pbikpIDw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKQl8Ci0JCQkJCSgoKHUzMil1MWJBSUZTKSA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOwotCi0JCQlzd2l0Y2ggKGVBQ0kpIHsKLQkJCWNhc2UgQUMxX0JLOgotCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUMwX0JFOgotCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JFX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUMyX1ZJOgotCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZJX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUMzX1ZPOgotCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJfd2FybigiU2V0SHdSZWc4MTg1KCk6IGludmFsaWQgQUNJOiAlZCAhXG4iLAotCQkJCQllQUNJKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhY19wYXJhbSArPSAoc2l6ZW9mKEFDX1BBUkFNKSk7CisJCWFjX3BhcmFtICs9IHNpemVvZihBQ19QQVJBTSk7CiAJfQogfQogCiB2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotLyogdm9pZCBydGw4MTgwX3JxX3R4X2FjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOyAqLwogdm9pZCBydGw4MTgwX3dhdGNoX2RvZ193cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBydGw4MTgwX2h3X3dha2V1cF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBydGw4MTgwX2h3X3NsZWVwX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CkBAIC0yMjA4LDcgKzIxODUsOCBAQAogCiAJLyogVHggSGlnaCBQb3dlciBNZWNoYW5pc20uICovCiAJaWYgKENoZWNrSGlnaFBvd2VyKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpKQotCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EpOworCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsCisJCQkodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxKTsKIAogCS8qIFR4IFBvd2VyIFRyYWNraW5nIG9uIDg3U0UuICovCiAJaWYgKENoZWNrVHhQd3JUcmFja2luZygoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSkKQEAgLTIyMTYsMjcgKzIxOTQsNTkgQEAKIAogCS8qIFBlcmZvcm0gRElHIGltbWVkaWF0ZWx5LiAqLwogCWlmIChDaGVja0RpZygoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSkKLQkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSk7CisJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwKKwkJCSh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKKwogCXJ0bDgxODBfd2F0Y2hfZG9nKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOwogCi0JcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPkdQSU9DaGFuZ2VSRldvcmtJdGVtKTsKKwlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsCisJCSh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0pOwogCi0JcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MoSUVFRTgwMjExX1dBVENIX0RPR19USU1FKTsKKwlwcml2LT53YXRjaF9kb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQlNU0VDUyhJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUpOworCiAJYWRkX3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOwogfQogCi1zdGF0aWMgQ0hBTk5FTF9MSVNUIENoYW5uZWxQbGFuW10gPSB7Ci0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMTl9LAkJLyogRkNDICovCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMX0sMTF9LAkJCQkJLyogSUMgKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sCS8qIEVUU0kgKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sCS8qIFNwYWluLiBDaGFuZ2UgdG8gRVRTSS4gKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sCS8qIEZyYW5jZS4gQ2hhbmdlIHRvIEVUU0kuICovCi0Je3sxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sOX0sCQkJCS8qIE1LSyAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsIDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMn0sLyogTUtLMSAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwJLyogSXNyYWVsLiAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzQsMzgsNDIsNDZ9LDE3fSwJCS8qIEZvciAxMWEgLCBURUxFQyAqLwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTR9LDE0fSwgIC8qIEZvciBHbG9iYWwgRG9tYWluLiAxLTExOmFjdGl2ZSBzY2FuLCAxMi0xNCBwYXNzaXZlIHNjYW4uIC8vK1lKLCAwODA2MjYgKi8KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzfSwxM30gLyogd29ybGQgd2lkZSAxMzogY2gxfmNoMTEgYWN0aXZlIHNjYW4sIGNoMTJ+MTMgcGFzc2l2ZSAvL2x6bSBhZGQgMDgwODI2ICovCitzdGF0aWMgc3RydWN0IHJ0bDgxODdzZV9jaGFubmVsX2xpc3QgY2hhbm5lbF9wbGFuX2xpc3RbXSA9IHsKKwkvKiBGQ0MgKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMzYsIDQwLAorCQk0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMTl9LAorCisJLyogSUMgKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0sIDExfSwKKworCS8qIEVUU0kgKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAzNiwgNDAsCisJCTQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAyMX0sCisKKwkvKiBTcGFpbi4gQ2hhbmdlIHRvIEVUU0kuICovCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzYsIDQwLAorCQk0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMjF9LAorCisJLyogRnJhbmNlLiBDaGFuZ2UgdG8gRVRTSS4gKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAzNiwgNDAsCisJCTQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAyMX0sCisKKwkvKiBNS0sgKi8KKwl7ezE0LCAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCA5fSwKKworCS8qIE1LSzEgKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMzYsCisJCTQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgMjJ9LAorCisJLyogSXNyYWVsLiAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDM2LCA0MCwKKwkJNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDIxfSwKKworCS8qIEZvciAxMWEgLCBURUxFQyAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDM0LCAzOCwgNDIsIDQ2fSwgMTd9LAorCisJLyogRm9yIEdsb2JhbCBEb21haW4uIDEtMTEgYWN0aXZlLCAxMi0xNCBwYXNzaXZlLiAqLworCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0fSwgMTR9LAorCisJLyogd29ybGQgd2lkZSAxMzogY2gxfmNoMTEgYWN0aXZlLCBjaDEyfjEzIHBhc3NpdmUgKi8KKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfSwgMTN9CiB9OwogCiBzdGF0aWMgdm9pZCBydGw4MTgwX3NldF9jaGFubmVsX21hcCh1OCBjaGFubmVsX3BsYW4sCkBAIC0yMjQ0LDcgKzIyNTQsNiBAQAogewogCWludCBpOwogCi0JLyogbHptIGFkZCAwODA4MjYgKi8KIAlpZWVlLT5NaW5QYXNzaXZlQ2hubE51bSA9IE1BWF9DSEFOTkVMX05VTUJFUisxOwogCWllZWUtPklic3NTdGFydENobmwgPSAwOwogCkBAIC0yMjYxLDEzICsyMjcwLDEzIEBACiAJCXsKIAkJCURvdDExZF9Jbml0KGllZWUpOwogCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IGZhbHNlOwotCQkJaWYgKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uTGVuICE9IDApIHsKKwkJCWlmIChjaGFubmVsX3BsYW5fbGlzdFtjaGFubmVsX3BsYW5dLmxlbiAhPSAwKSB7CiAJCQkJLyogQ2xlYXIgb2xkIGNoYW5uZWwgbWFwICovCiAJCQkJbWVtc2V0KEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIDAsIHNpemVvZihHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKSk7CiAJCQkJLyogU2V0IG5ldyBjaGFubmVsIG1hcCAqLwotCQkJCWZvciAoaSA9IDA7IGkgPCBDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbjsgaSsrKSB7Ci0JCQkJCWlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV0gPD0gMTQpCi0JCQkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXV0gPSAxOworCQkJCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsX3BsYW5fbGlzdFtjaGFubmVsX3BsYW5dLmxlbjsgaSsrKSB7CisJCQkJCWlmIChjaGFubmVsX3BsYW5fbGlzdFtjaGFubmVsX3BsYW5dLmNoYW5uZWxbaV0gPD0gMTQpCisJCQkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2NoYW5uZWxfcGxhbl9saXN0W2NoYW5uZWxfcGxhbl0uY2hhbm5lbFtpXV0gPSAxOwogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjI3OSw3ICsyMjg4LDcgQEAKIAkJCWllZWUtPmJHbG9iYWxEb21haW4gPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KLQljYXNlIENPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzX0lOREVYOi8qIGx6bSBhZGQgMDgwODI2ICovCisJY2FzZSBDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWDoKIAkJewogCQkJaWVlZS0+TWluUGFzc2l2ZUNobmxOdW0gPSAxMjsKIAkJCWllZWUtPklic3NTdGFydENobmwgPSAxMDsKQEAgLTIyOTksMTkgKzIzMDgsMTcgQEAKIAogdm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKLS8qIFlKLGFkZCwwODA4MjggKi8KLXN0YXRpYyB2b2lkIHJ0bDgxODBfc3RhdGlzdGljc19pbml0KHN0cnVjdCBTdGF0cyAqcHN0YXRzKQorc3RhdGljIHZvaWQgcnRsODE4MF9zdGF0aXN0aWNzX2luaXQoc3RydWN0IHN0YXRzICpwc3RhdHMpCiB7Ci0JbWVtc2V0KHBzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBTdGF0cykpOworCW1lbXNldChwc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdHMpKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE4MF9saW5rX2RldGVjdF9pbml0KHBsaW5rX2RldGVjdF90IHBsaW5rX2RldGVjdCkKK3N0YXRpYyB2b2lkIHJ0bDgxODBfbGlua19kZXRlY3RfaW5pdChzdHJ1Y3QgbGlua19kZXRlY3RfdCAqcGxpbmtfZGV0ZWN0KQogewotCW1lbXNldChwbGlua19kZXRlY3QsIDAsIHNpemVvZihsaW5rX2RldGVjdF90KSk7Ci0JcGxpbmtfZGV0ZWN0LT5TbG90TnVtID0gREVGQVVMVF9TTE9UX05VTTsKKwltZW1zZXQocGxpbmtfZGV0ZWN0LCAwLCBzaXplb2Yoc3RydWN0IGxpbmtfZGV0ZWN0X3QpKTsKKwlwbGlua19kZXRlY3QtPnNsb3RfbnVtID0gREVGQVVMVF9TTE9UX05VTTsKIH0KIAotLyogWUosYWRkLDA4MDgyOCxlbmQgKi8KIHN0YXRpYyB2b2lkIHJ0bDgxODdzZV9lZXByb21fcmVnaXN0ZXJfcmVhZChzdHJ1Y3QgZWVwcm9tXzkzY3g2ICplZXByb20pCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGVlcHJvbS0+ZGF0YTsKQEAgLTIzNjAsNyArMjM2Nyw3IEBACiAJZWVwcm9tXzkzY3g2X3JlYWQoJmVlcHJvbSwgRUVQUk9NX0NPVU5UUllfQ09ERT4+MSwgJmVlcHJvbV92YWwpOwogCXByaXYtPmNoYW5uZWxfcGxhbiA9IGVlcHJvbV92YWwgJiAweEZGOwogCWlmIChwcml2LT5jaGFubmVsX3BsYW4gPiBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTikgewotCQlwcmludGsoInJ0bDgxODBfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CisJCW5ldGRldl9lcnIoZGV2LCAicnRsODE4MF9pbml0OiBJbnZhbGlkIGNoYW5uZWwgcGxhbiEgU2V0IHRvIGRlZmF1bHQuXG4iKTsKIAkJcHJpdi0+Y2hhbm5lbF9wbGFuID0gMDsKIAl9CiAKQEAgLTIzODUsNyArMjM5Miw4IEBACiAJcnRsODE4MF9saW5rX2RldGVjdF9pbml0KCZwcml2LT5saW5rX2RldGVjdCk7CiAKIAlwcml2LT5hY2tfdHhfdG9faWVlZSA9IDA7Ci0JcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gREVGQVVMVF9CRUFDT05JTlRFUlZBTDsKKwlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPQorCQlERUZBVUxUX0JFQUNPTklOVEVSVkFMOwogCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CiAJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2ZlYXR1cmVzICA9IElFRUVfU09GVE1BQ19TQ0FOIHwKIAkJSUVFRV9TT0ZUTUFDX0FTU09DSUFURSB8IElFRUVfU09GVE1BQ19QUk9CRVJRIHwKQEAgLTI0MTAsMTIgKzI0MTgsMTIgQEAKIAlwcml2LT5iSW5hY3RpdmVQcyA9IHRydWU7IC8qIGZhbHNlOyAqLwogCXByaXYtPmllZWU4MDIxMS0+YkluYWN0aXZlUHMgPSBwcml2LT5iSW5hY3RpdmVQczsKIAlwcml2LT5iU3dSZlByb2Nlc3NpbmcgPSBmYWxzZTsKLQlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJmT2ZmOworCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBSRl9PRkY7CiAJcHJpdi0+UmZPZmZSZWFzb24gPSAwOwotCXByaXYtPkxlZFN0cmF0ZWd5ID0gU1dfTEVEX01PREUwOwotCXByaXYtPlR4UG9sbGluZ1RpbWVzID0gMDsgLyogbHptIGFkZCAwODA4MjYgKi8KKwlwcml2LT5sZWRfc3RyYXRlZ3kgPSBTV19MRURfTU9ERTA7CisJcHJpdi0+VHhQb2xsaW5nVGltZXMgPSAwOwogCXByaXYtPmJMZWlzdXJlUHMgPSB0cnVlOwotCXByaXYtPmRvdDExUG93ZXJTYXZlTW9kZSA9IGVBY3RpdmU7CisJcHJpdi0+ZG90MTFQb3dlclNhdmVNb2RlID0gQUNUSVZFOwogCXByaXYtPkFkTWluQ2hlY2tQZXJpb2QgPSA1OwogCXByaXYtPkFkTWF4Q2hlY2tQZXJpb2QgPSAxMDsKIAlwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQgPSAzMDsJLyogNjAtPjMwICovCkBAIC0yNDMxLDcgKzI0MzksOCBAQAogCXByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkID0gMDsKIAlpbml0X3RpbWVyKCZwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lcik7CiAJcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKLQlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5mdW5jdGlvbiA9ICh2b2lkICopU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjazsKKwlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5mdW5jdGlvbiA9CisJCSh2b2lkICopU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjazsKIAlwcml2LT5iRGlnTWVjaGFuaXNtID0gdHJ1ZTsKIAlwcml2LT5Jbml0aWFsR2FpbiA9IDY7CiAJcHJpdi0+Ylh0YWxDYWxpYnJhdGlvbiA9IGZhbHNlOwpAQCAtMjQ0MCw3ICsyNDQ5LDggQEAKIAlwcml2LT5iVHhQb3dlclRyYWNrID0gZmFsc2U7CiAJcHJpdi0+VGhlcm1hbE1ldGVyID0gMDsKIAlwcml2LT5GYWxzZUFsYXJtUmVnVmFsdWUgPSAwOwotCXByaXYtPlJlZ0RpZ09mZG1GYVVwVGggPSAweGM7IC8qIFVwcGVyIHRocmVzaG9sZCBvZiBPRkRNIGZhbHNlIGFsYXJtLCB3aGljaCBpcyB1c2VkIGluIERJRy4gKi8KKwlwcml2LT5SZWdEaWdPZmRtRmFVcFRoID0gMHhjOyAvKiBVcHBlciB0aHJlc2hvbGQgb2YgT0ZETSBmYWxzZSBhbGFybSwKKwkJCQkJd2hpY2ggaXMgdXNlZCBpbiBESUcuICovCiAJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSA9IDA7CiAJcHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlID0gMDsKIAlwcml2LT5MYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQgPSAwOwpAQCAtMjU4NSw3ICsyNTk1LDggQEAKIAkJcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5ID0gcHJpdi0+RUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5OwogCWVsc2UKIAkJLyogMTpkaXNhYmxlIGFudGVubmEgZGl2ZXJzaXR5LCAyOiBlbmFibGUgYW50ZW5uYSBkaXZlcnNpdHkuICovCi0JCXByaXYtPmJTd0FudGVubmFEaXZlcml0eSA9IHByaXYtPlJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbSA9PSAyOworCQlwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkgPQorCQkJcHJpdi0+UmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtID09IDI7CiAKIAlpZiAocHJpdi0+UmVnRGVmYXVsdEFudGVubmEgPT0gMCkKIAkJLyogMDogZGVmYXVsdCBmcm9tIEVFUFJPTS4gKi8KQEAgLTI2NjksNyArMjY4MCw4IEBACiAJCQkJICBUWF9CRUFDT05fUklOR19BRERSKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHJ0bDgxODBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpKSB7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBydGw4MTgwX2ludGVycnVwdCwKKwkJSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSkgewogCQlETUVTR0UoIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkIiwgZGV2LT5pcnEpOwogCQlyZXR1cm4gLTE7CiAJfSBlbHNlIHsKQEAgLTI3MTgsOCArMjczMCw2IEBACiAKIHZvaWQgcnRsODE4NV9yZl9waW5zX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCS8qIHUxNiB0bXA7ICovCi0JLyogdG1wID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSk7ICovCiAJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4MWZmZik7IC8qIHwgdG1wKTsgKi8KIH0KIApAQCAtMjc2OCwxNiArMjc3OCwxMSBAQAogCiAJcGh5dyA9ICgoZGF0YTw8OCkgfCBhZHIpOwogCi0JLyogTm90ZSB0aGF0LCB3ZSBtdXN0IHdyaXRlIDB4ZmY3YyBhZnRlciAweDdkLTB4N2YgdG8gd3JpdGUgQkIgcmVnaXN0ZXIuICovCisJLyogTm90ZTogd2UgbXVzdCB3cml0ZSAweGZmN2MgYWZ0ZXIgMHg3ZC0weDdmIHRvIHdyaXRlIEJCIHJlZ2lzdGVyLiAqLwogCXdyaXRlX25pY19ieXRlKGRldiwgMHg3ZiwgKChwaHl3ICYgMHhmZjAwMDAwMCkgPj4gMjQpKTsKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2UsICgocGh5dyAmIDB4MDBmZjAwMDApID4+IDE2KSk7CiAJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdkLCAoKHBoeXcgJiAweDAwMDBmZjAwKSA+PiA4KSk7CiAJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdjLCAoKHBoeXcgJiAweDAwMDAwMGZmKSkpOwotCi0JLyogdGhpcyBpcyBvayB0byBmYWlsIHdoZW4gd2Ugd3JpdGUgQUdDIHRhYmxlLiBjaGVjayBmb3IgQUdDIHRhYmxlIG1pZ2h0IGJlCi0JICogZG9uZSBieSBtYXNraW5nIHdpdGggMHg3ZiBpbnN0ZWFkIG9mIDB4ZmYKLQkgKi8KLQkvKiBpZiAocGh5ciAhPSAoZGF0YSYweGZmKSkgRE1FU0dXKCJQaHkgd3JpdGUgdGltZW91dCAleCAleCAleCIsIHBoeXIsIGRhdGEsIGFkcik7ICovCiB9CiAKIGlubGluZSB2b2lkIHdyaXRlX3BoeV9vZmRtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpCkBAIC0yODEyLDkgKzI4MTcsOSBAQAogCXdvcmQgID0gcmVhZF9uaWNfd29yZChkZXYsIEJpbnRySXR2KTsKIAl3b3JkICY9IH5CaW50ckl0dl9CaW50ckl0djsKIAl3b3JkIHw9IDEwMDA7IC8qIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqCi0JCSgocHJpdi0+dHhiZWFjb25jb3VudCA+IDEpPyhwcml2LT50eGJlYWNvbmNvdW50LTEpOjEpOwotCS8vIEZJWE1FOiBjaGVjayBpZiBjb3JyZWN0IF5eIHdvcmtlZCB3aXRoIDB4M2U4OwotCSovCisJCSAgICAgICAqICgocHJpdi0+dHhiZWFjb25jb3VudCA+IDEpPyhwcml2LT50eGJlYWNvbmNvdW50LTEpOjEpOworCQkgICAgICAgKiBGSVhNRTogY2hlY2sgaWYgY29ycmVjdCBeXiB3b3JrZWQgd2l0aCAweDNlODsKKwkJICAgICAgICovCiAJd3JpdGVfbmljX3dvcmQoZGV2LCBCaW50ckl0diwgd29yZCk7CiAKIAlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CkBAIC0yODMzLDcgKzI4MzgsNyBAQAogICogQ2hhbmdlIGN1cnJlbnQgYW5kIGRlZmF1bHQgcHJlYW1ibGUgbW9kZS4KICAqLwogc3RhdGljIGJvb2wgTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKLQkJCQkgICAgIFJUX1BTX01PREUgcnRQc01vZGUpCisJCQkJICAgICBlbnVtIHJ0X3BzX21vZGUgcnRQc01vZGUpCiB7CiAJLyogQ3VycmVudGx5LCB3ZSBkbyBub3QgY2hhbmdlIHBvd2VyIHNhdmUgbW9kZSBvbiBJQlNTIG1vZGUuICovCiAJaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQpAQCAtMjg0NiwyNSArMjg1MSwyNiBAQAogCiBzdGF0aWMgdm9pZCBMZWlzdXJlUFNFbnRlcihzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdikKIHsKLQlpZiAocHJpdi0+YkxlaXN1cmVQcykgeworCWlmIChwcml2LT5iTGVpc3VyZVBzKQogCQlpZiAocHJpdi0+aWVlZTgwMjExLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCiAJCQkvKiBJRUVFODAyMTFfUFNfRU5BQkxFICovCi0JCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKHByaXYsIElFRUU4MDIxMV9QU19NQkNBU1R8SUVFRTgwMjExX1BTX1VOSUNBU1QpOwotCX0KKwkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUocHJpdiwKKwkJCQlJRUVFODAyMTFfUFNfTUJDQVNUIHwgSUVFRTgwMjExX1BTX1VOSUNBU1QpOwogfQogCiBzdGF0aWMgdm9pZCBMZWlzdXJlUFNMZWF2ZShzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdikKIHsKLQlpZiAocHJpdi0+YkxlaXN1cmVQcykgeworCWlmIChwcml2LT5iTGVpc3VyZVBzKQogCQlpZiAocHJpdi0+aWVlZTgwMjExLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCi0JCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKHByaXYsIElFRUU4MDIxMV9QU19ESVNBQkxFRCk7Ci0JfQorCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZSgKKwkJCQlwcml2LCBJRUVFODAyMTFfUFNfRElTQUJMRUQpOwogfQogCiB2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGh3X3dha2V1cF93cSk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoCisJCWR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgaHdfd2FrZXVwX3dxKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwogCiAJcnRsODE4MF9od193YWtldXAoZGV2KTsKQEAgLTI4NzMsNyArMjg3OSw4IEBACiB2b2lkIHJ0bDgxODBfaHdfc2xlZXBfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgaHdfc2xlZXBfd3EpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKAorCQlkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGh3X3NsZWVwX3dxKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwogCiAJcnRsODE4MF9od19zbGVlcF9kb3duKGRldik7CkBAIC0yODkwLDIzICsyODk3LDMwIEBACiAJCSAqLwogCiAJCWlmICgocHJpdi0+a2VlcEFsaXZlTGV2ZWwgPT0gMikgfHwKLQkJCShwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtVHhVbmljYXN0ID09IHByaXYtPk51bVR4VW5pY2FzdCAmJgotCQkJcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVJ4VW5pY2FzdCA9PSBwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdCkKKwkJCShwcml2LT5saW5rX2RldGVjdC5sYXN0X251bV90eF91bmljYXN0ID09CisJCQkJcHJpdi0+TnVtVHhVbmljYXN0ICYmCisJCQlwcml2LT5saW5rX2RldGVjdC5sYXN0X251bV9yeF91bmljYXN0ID09CisJCQkJcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3QpCiAJCQkpIHsKLQkJCXByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCsrOworCQkJcHJpdi0+bGlua19kZXRlY3QuaWRsZV9jb3VudCsrOwogCiAJCQkvKgotCQkJICogU2VuZCBhIEtlZXAtQWxpdmUgcGFja2V0IHBhY2tldCB0byBBUCBpZiB3ZSBoYWQgYmVlbiBpZGxlIGZvciBhIHdoaWxlLgorCQkJICogU2VuZCBhIEtlZXAtQWxpdmUgcGFja2V0IHBhY2tldCB0byBBUCBpZiB3ZSBoYWQKKwkJCSAqIGJlZW4gaWRsZSBmb3IgYSB3aGlsZS4KIAkJCSAqLwotCQkJaWYgKHByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCA+PSAoKEtFRVBfQUxJVkVfSU5URVJWQUwgLyBDSEVDS19GT1JfSEFOR19QRVJJT0QpLTEpKSB7Ci0JCQkJcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50ID0gMDsKLQkJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShwcml2LT5pZWVlODAyMTEsIGZhbHNlKTsKKwkJCWlmIChwcml2LT5saW5rX2RldGVjdC5pZGxlX2NvdW50ID49CisJCQkJS0VFUF9BTElWRV9JTlRFUlZBTCAvCisJCQkJQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EIC0gMSkgeworCQkJCXByaXYtPmxpbmtfZGV0ZWN0LmlkbGVfY291bnQgPSAwOworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKAorCQkJCQlwcml2LT5pZWVlODAyMTEsIGZhbHNlKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCA9IDA7CisJCQlwcml2LT5saW5rX2RldGVjdC5pZGxlX2NvdW50ID0gMDsKIAkJfQotCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtVHhVbmljYXN0ID0gcHJpdi0+TnVtVHhVbmljYXN0OwotCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtUnhVbmljYXN0ID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3Q7CisJCXByaXYtPmxpbmtfZGV0ZWN0Lmxhc3RfbnVtX3R4X3VuaWNhc3QgPSBwcml2LT5OdW1UeFVuaWNhc3Q7CisJCXByaXYtPmxpbmtfZGV0ZWN0Lmxhc3RfbnVtX3J4X3VuaWNhc3QgPQorCQkJcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3Q7CiAJfQogfQogCkBAIC0yOTIyLDM2ICsyOTM2LDQyIEBACiAJCWlmICgocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfQURIT0MpICYmCiAJCSAgICAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSAmJgogCQkgICAgKHByaXYtPmllZWU4MDIxMS0+YmVpbnJldHJ5ID09IGZhbHNlKSAmJgotCQkgICAgKHByaXYtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT24pKQorCQkgICAgKHByaXYtPmVSRlBvd2VyU3RhdGUgPT0gUkZfT04pKQogCQkJSVBTRW50ZXIoZGV2KTsKIAl9Ci0JLyogWUosYWRkLDA4MDgyOCxmb3IgbGluayBzdGF0ZSBjaGVjayAqLwotCWlmICgocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSB7Ci0JCVNsb3RJbmRleCA9IChwcml2LT5saW5rX2RldGVjdC5TbG90SW5kZXgrKykgJSBwcml2LT5saW5rX2RldGVjdC5TbG90TnVtOwotCQlwcml2LT5saW5rX2RldGVjdC5SeEZyYW1lTnVtW1Nsb3RJbmRleF0gPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kICsgcHJpdi0+aWVlZTgwMjExLT5OdW1SeEJjbkluUGVyaW9kOwotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bGlua19kZXRlY3QuU2xvdE51bTsgaSsrKQotCQkJVG90YWxSeE51bSArPSBwcml2LT5saW5rX2RldGVjdC5SeEZyYW1lTnVtW2ldOworCWlmICgocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJgorCQkocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSB7CisJCVNsb3RJbmRleCA9IChwcml2LT5saW5rX2RldGVjdC5zbG90X2luZGV4KyspICUKKwkJCXByaXYtPmxpbmtfZGV0ZWN0LnNsb3RfbnVtOworCisJCXByaXYtPmxpbmtfZGV0ZWN0LnJ4X2ZyYW1lX251bVtTbG90SW5kZXhdID0KKwkJCXByaXYtPmllZWU4MDIxMS0+TnVtUnhEYXRhSW5QZXJpb2QgKworCQkJcHJpdi0+aWVlZTgwMjExLT5OdW1SeEJjbkluUGVyaW9kOworCisJCWZvciAoaSA9IDA7IGkgPCBwcml2LT5saW5rX2RldGVjdC5zbG90X251bTsgaSsrKQorCQkJVG90YWxSeE51bSArPSBwcml2LT5saW5rX2RldGVjdC5yeF9mcmFtZV9udW1baV07CiAKIAkJaWYgKFRvdGFsUnhOdW0gPT0gMCkgewogCQkJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKLQkJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgJnByaXYtPmllZWU4MDIxMS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsCisJCQkJJnByaXYtPmllZWU4MDIxMS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CiAJCX0KIAl9CiAKLQkvKiBZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUgKi8KIAlNZ250TGlua0tlZXBBbGl2ZShwcml2KTsKIAotCS8qIFlKLGFkZCwwODA4MjgsZm9yIExQUyAqLwogCUxlaXN1cmVQU0xlYXZlKHByaXYpOwogCiAJaWYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgewotCQlwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kOwotCQlpZiAocHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID4gNjY2IHx8Ci0JCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QgPiA2NjYpIHsKKwkJcHJpdi0+bGlua19kZXRlY3QubnVtX3J4X29rX2luX3BlcmlvZCA9CisJCQlwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kOworCQlpZiAocHJpdi0+bGlua19kZXRlY3QubnVtX3J4X29rX2luX3BlcmlvZCA+IDY2NiB8fAorCQkJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCA+IDY2NikgewogCQkJYkJ1c3lUcmFmZmljID0gdHJ1ZTsKIAkJfQotCQlpZiAoKChwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgKyBwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QpID4gOCkKLQkJCXx8IChwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPiAyKSkgeworCQlpZiAoKHByaXYtPmxpbmtfZGV0ZWN0Lm51bV9yeF9va19pbl9wZXJpb2QgKworCQkJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCA+IDgpCisJCQl8fCAocHJpdi0+bGlua19kZXRlY3QubnVtX3J4X29rX2luX3BlcmlvZCA+IDIpKSB7CiAJCQliRW50ZXJQUyA9IGZhbHNlOwogCQl9IGVsc2UKIAkJCWJFbnRlclBTID0gdHJ1ZTsKQEAgLTI5NjIsOSArMjk4Miw5IEBACiAJCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKIAl9IGVsc2UKIAkJTGVpc3VyZVBTTGVhdmUocHJpdik7Ci0JcHJpdi0+bGlua19kZXRlY3QuYkJ1c3lUcmFmZmljID0gYkJ1c3lUcmFmZmljOwotCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA9IDA7Ci0JcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kID0gMDsKKwlwcml2LT5saW5rX2RldGVjdC5iX2J1c3lfdHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKKwlwcml2LT5saW5rX2RldGVjdC5udW1fcnhfb2tfaW5fcGVyaW9kID0gMDsKKwlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kID0gMDsKIAlwcml2LT5pZWVlODAyMTEtPk51bVJ4RGF0YUluUGVyaW9kID0gMDsKIAlwcml2LT5pZWVlODAyMTEtPk51bVJ4QmNuSW5QZXJpb2QgPSAwOwogfQpAQCAtMzA0NywxNSArMzA2NywxNyBAQAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxKTsKIAlkZWxfdGltZXJfc3luYygmcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIpOwotCVNldFplYnJhUkZQb3dlclN0YXRlODE4NShkZXYsIGVSZk9mZik7Ci0JbWVtc2V0KCYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisJU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KGRldiwgUkZfT0ZGKTsKKwltZW1zZXQoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLAorCQkwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CiAJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgcnRsODE4MF9yZXN0YXJ0X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgcmVzZXRfd3EpOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKAorCQl3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgcmVzZXRfd3EpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMzExNiw3ICszMTM4LDggQEAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCiAJaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKLQkJbWVtY3B5KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwKKwkJCWRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAogCWlmIChwcml2LT51cCkgewogCQlydGw4MTgwX2Rvd24oZGV2KTsKQEAgLTMxMzcsNyArMzE2MCw4IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UOgotCQlyZXQgPSBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwocHJpdi0+aWVlZTgwMjExLCAmd3JxLT51LmRhdGEpOworCQlyZXQgPSBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoCisJCQlwcml2LT5pZWVlODAyMTEsICZ3cnEtPnUuZGF0YSk7CiAJCXJldHVybiByZXQ7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMzM4Nyw3ICszNDExLDcgQEAKIAlpbnQgaiwgaTsKIAlpbnQgaGQ7CiAJaWYgKGVycm9yKQotCQlwcml2LT5zdGF0cy50eHJldHJ5Kys7IC8qIHRvbnkgMjAwNjA2MDEgKi8KKwkJcHJpdi0+c3RhdHMudHhyZXRyeSsrOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFnKTsKIAlzd2l0Y2ggKHByaSkgewogCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgpAQCAtMzU0MCw3ICszNTY0LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKIAogCS8qIElTUjogNGJ5dGVzICovCi0JaW50YSA9IHJlYWRfbmljX2R3b3JkKGRldiwgSVNSKTsgLyogJiBwcml2LT5JbnRyTWFzazsgKi8KKwlpbnRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBJU1IpOwogCXdyaXRlX25pY19kd29yZChkZXYsIElTUiwgaW50YSk7IC8qIHJlc2V0IGludCBzaXR1YXRpb24gKi8KIAogCXByaXYtPnN0YXRzLnNoaW50cysrOwpAQCAtMzU4Niw3ICszNjEwLDcgQEAKIAl9CiAKIAlpZiAoaW50YSAmIElTUl9USFBET0spIHsgLyogSGlnaCBwcmlvcml0eSB0eCBvayAqLwotCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLyogWUosYWRkLDA4MDgyOCAqLworCQlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kKys7CiAJCXByaXYtPnN0YXRzLnR4aHBva2ludCsrOwogCQlydGw4MTgwX3R4X2lzcihkZXYsIEhJX1BSSU9SSVRZLCAwKTsKIAl9CkBAIC0zNjQ5LDE0ICszNjczLDE0IEBACiAJCXByaXYtPnN0YXRzLnR4b3ZlcmZsb3crKzsKIAogCWlmIChpbnRhICYgSVNSX1ROUERPSykgeyAvKiBOb3JtYWwgcHJpb3JpdHkgdHggb2sgKi8KLQkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8qIFlKLGFkZCwwODA4MjggKi8KKwkJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCsrOwogCQlwcml2LT5zdGF0cy50eG5wb2tpbnQrKzsKIAkJcnRsODE4MF90eF9pc3IoZGV2LCBOT1JNX1BSSU9SSVRZLCAwKTsKIAkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIE5PUk1fUFJJT1JJVFkpOwogCX0KIAogCWlmIChpbnRhICYgSVNSX1RMUERPSykgeyAvKiBMb3cgcHJpb3JpdHkgdHggb2sgKi8KLQkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8qIFlKLGFkZCwwODA4MjggKi8KKwkJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCsrOwogCQlwcml2LT5zdGF0cy50eGxwb2tpbnQrKzsKIAkJcnRsODE4MF90eF9pc3IoZGV2LCBMT1dfUFJJT1JJVFksIDApOwogCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgTE9XX1BSSU9SSVRZKTsKQEAgLTM2NjQsMTQgKzM2ODgsMTQgQEAKIAogCWlmIChpbnRhICYgSVNSX1RCS0RPSykgeyAvKiBjb3JyZXNwb25kaW5nIHRvIEJLX1BSSU9SSVRZICovCiAJCXByaXYtPnN0YXRzLnR4Ymtwb2tpbnQrKzsKLQkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8qIFlKLGFkZCwwODA4MjggKi8KKwkJcHJpdi0+bGlua19kZXRlY3QubnVtX3R4X29rX2luX3BlcmlvZCsrOwogCQlydGw4MTgwX3R4X2lzcihkZXYsIEJLX1BSSU9SSVRZLCAwKTsKIAkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKIAl9CiAKIAlpZiAoaW50YSAmIElTUl9UQkVET0spIHsgLyogY29ycmVzcG9uZGluZyB0byBCRV9QUklPUklUWSAqLwogCQlwcml2LT5zdGF0cy50eGJlcGVycisrOwotCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLyogWUosYWRkLDA4MDgyOCAqLworCQlwcml2LT5saW5rX2RldGVjdC5udW1fdHhfb2tfaW5fcGVyaW9kKys7CiAJCXJ0bDgxODBfdHhfaXNyKGRldiwgQkVfUFJJT1JJVFksIDApOwogCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgQkVfUFJJT1JJVFkpOwogCX0KQEAgLTM2ODgsMTcgKzM3MTIsMTkgQEAKIAogdm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgR1BJT0NoYW5nZVJGV29ya0l0ZW0ud29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoCisJCXdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBHUElPQ2hhbmdlUkZXb3JrSXRlbS53b3JrKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OCBidFBTUjsKIAl1OCBidENvbmZpZzA7Ci0JUlRfUkZfUE9XRVJfU1RBVEUJZVJmUG93ZXJTdGF0ZVRvU2V0OworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJmUG93ZXJTdGF0ZVRvU2V0OwogCWJvb2wgYkFjdHVhbGx5U2V0ID0gZmFsc2U7CiAKIAljaGFyICphcmd2WzNdOwogCXN0YXRpYyBjaGFyICpSYWRpb1Bvd2VyUGF0aCA9ICIvZXRjL2FjcGkvZXZlbnRzL1JhZGlvUG93ZXIuc2giOwotCXN0YXRpYyBjaGFyICplbnZwW10gPSB7IkhPTUU9LyIsICJURVJNPWxpbnV4IiwgIlBBVEg9L3Vzci9iaW46L2JpbiIsIE5VTEx9OworCXN0YXRpYyBjaGFyICplbnZwW10gPSB7IkhPTUU9LyIsICJURVJNPWxpbnV4IiwKKwkJIlBBVEg9L3Vzci9iaW46L2JpbiIsIE5VTEx9OwogCXN0YXRpYyBpbnQgcmVhZGZfY291bnQ7CiAKIAlyZWFkZl9jb3VudCA9IChyZWFkZl9jb3VudCsxKSUweGZmZmY7CkBAIC0zNzA4LDI0ICszNzM0LDI0IEBACiAJYnRQU1IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKGJ0UFNSICYgfkJJVDMpKTsKIAotCS8qIEl0IG5lZWQgdG8gZGVsYXkgNHVzIHN1Z2dlc3RlZCBieSBKb25nLCAyMDA4LTAxLTE2ICovCisJLyogSXQgbmVlZCB0byBkZWxheSA0dXMgc3VnZ2VzdGVkICovCiAJdWRlbGF5KDQpOwogCiAJLyogSFcgcmFkaW8gT24vT2ZmIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgRkY1MVs0XShjb25maWcwKSAqLwogCWJ0Q29uZmlnMCA9IGJ0UFNSID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzApOwogCi0JZVJmUG93ZXJTdGF0ZVRvU2V0ID0gKGJ0Q29uZmlnMCAmIEJJVDQpID8gIGVSZk9uIDogZVJmT2ZmOworCWVSZlBvd2VyU3RhdGVUb1NldCA9IChidENvbmZpZzAgJiBCSVQ0KSA/ICBSRl9PTiA6IFJGX09GRjsKIAogCS8qIFR1cm4gTEVEIGJhY2sgb24gd2hlbiByYWRpbyBlbmFibGVkICovCi0JaWYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPbikKKwlpZiAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IFJGX09OKQogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgYnRQU1IgfCBCSVQzKTsKIAogCWlmICgocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9PSB0cnVlKSAmJgotCSAgIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT24pKSB7CisJICAgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBSRl9PTikpIHsKIAkJcHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9IGZhbHNlOwogCQliQWN0dWFsbHlTZXQgPSB0cnVlOwogCX0gZWxzZSBpZiAoKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPT0gZmFsc2UpICYmCi0JCSAgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPZmYpKSB7CisJCSAgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBSRl9PRkYpKSB7CiAJCXByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPSB0cnVlOwogCQliQWN0dWFsbHlTZXQgPSB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYwppbmRleCAyY2NkMmNiLi44YzAyMGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCkBAIC0xMTE2LDE0ICsxMTE2LDE0IEBACiB2b2lkIFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7Ci0JUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CiAKIAkgLyogV2UgZG8gTk9UIG5lZWQgdG8gc3dpdGNoIGFudGVubmEgd2hpbGUgUkYgaXMgb2ZmLiAqLwogCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOwogCWRvIHsKLQkJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKSB7CisJCWlmIChydFN0YXRlID09IFJGX09GRikgewogCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocnRTdGF0ZSA9PSBlUmZTbGVlcCkgeworCQl9IGVsc2UgaWYgKHJ0U3RhdGUgPT0gUkZfU0xFRVApIHsKIAkJCS8qIERvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBEaXNhYmxlIFBMTCBzaXR1YXRpb24uICovCiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaAppbmRleCBkZTA4NGYwLi43ZGY3MzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaApAQCAtMSwxNCArMSwxMyBAQAogLyoKLQlUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlcgotCXJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgotCUNvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgotCi0JVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODIyNQotCXJhZGlvIGZyb250ZW5kLgotCi0JKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQotCi0qLworICogVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUKKyAqIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyMjUgcmFkaW8gZnJvbnRlbmQuCisgKgorICogKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorICovCiAKICNpbmNsdWRlICJyODE4MC5oIgogCkBAIC0yOSw3ICsyOCw3IEBACiB2b2lkIHJ0bDgxODBfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1vZGUpOwogdm9pZCBydGw4MTgwX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtb2RlKTsKIGJvb2wgU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICBSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlKTsKKwkJCSAgICAgIGVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJGUG93ZXJTdGF0ZSk7CiB2b2lkIHJ0bDgyMjV6NF9yZl9zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgcnRsODIyNXo0X3JmX3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKaW5kZXggN2M5YThiZi4uNDcxMDRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCkBAIC0yNzksOCArMjc5LDggQEAKICAqIE1hcCBkQm0gaW50byBUeCBwb3dlciBpbmRleCBhY2NvcmRpbmcgdG8gY3VycmVudCBIVyBtb2RlbCwgZm9yIGV4YW1wbGUsCiAgKiBSRiBhbmQgUEEsIGFuZCBjdXJyZW50IHdpcmVsZXNzIG1vZGUuCiAgKi8KLXN0YXRpYyBzOCBEYm1Ub1R4UHdySWR4KHN0cnVjdCByODE4MF9wcml2ICpwcml2LCBXSVJFTEVTU19NT0RFIFdpcmVsZXNzTW9kZSwKLQkJCXMzMiBQb3dlckluRGJtKQorc3RhdGljIHM4IERibVRvVHhQd3JJZHgoc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCisJCQllbnVtIHdpcmVsZXNzX21vZGUgbW9kZSwgczMyIFBvd2VySW5EYm0pCiB7CiAJYm9vbCBiVXNlRGVmYXVsdCA9IHRydWU7CiAJczggVHhQd3JJZHggPSAwOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJICovCiAJczMyIHRtcCA9IDA7CiAKLQlpZiAoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfRykgeworCWlmIChtb2RlID09IFdJUkVMRVNTX01PREVfRykgewogCQliVXNlRGVmYXVsdCA9IGZhbHNlOwogCQl0bXAgPSAoMiAqIFBvd2VySW5EYm0pOwogCkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJCVR4UHdySWR4ID0gNDA7CiAJCWVsc2UKIAkJCVR4UHdySWR4ID0gKHM4KXRtcDsKLQl9IGVsc2UgaWYgKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpIHsKKwl9IGVsc2UgaWYgKG1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKSB7CiAJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CiAJCXRtcCA9ICg0ICogUG93ZXJJbkRibSkgLSA1MjsKIApAQCAtNjA2LDUxICs2MDYsMTIgQEAKIAlydGw4MjI1ejJfcmZfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKIH0KIAotdm9pZCBydGw4MjI1ejJfcmZfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlpZiAocHJpdi0+aWVlZTgwMjExLT5tb2RlID09IElFRUVfQSkgewotCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweDE4NjUpOwotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDg0KTsKLQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweGE4MDA4KTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MCk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDYpOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgMHg5OSk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDIwKTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDcpOwotCi0JCXJ0bDgyMjV6Ml9zZXRfZ2FpbihkZXYsIDQpOwotCi0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7Ci0KLQkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxMDAwMDAwMCk7Ci0JfSBlbHNlIHsKLQkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHgxODY0KTsKLQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDA0NCk7Ci0JCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHhhODAwOCk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwLCAweDEpOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg2KTsKLQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4OTkpOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyMCk7Ci0JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHg3KTsKLQotCQlydGw4MjI1ejJfc2V0X2dhaW4oZGV2LCA0KTsKLQotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOwotCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOwotCi0JCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4MDQwMDAwMDIpOwotCX0KLX0KLQogI2RlZmluZSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QgkJMjAKICNkZWZpbmUgTUFYX1BPTExJTkdfMjRGX1RJTUVTXzg3U0UJCTEwCiAjZGVmaW5lIExQU19NQVhfU0xFRVBfV0FJVElOR19USU1FU184N1NFCTUKIAogYm9vbCBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIFJUX1JGX1BPV0VSX1NUQVRFIGVSRlBvd2VyU3RhdGUpCisJCQkgICAgICBlbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGUpCiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4CQkJYnRDUjkzNDYsIGJ0Q29uZmlnMzsKQEAgLTY3Miw3ICs2MzMsNyBAQAogCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKGJ0Q29uZmlnMyB8IENPTkZJRzNfUEFSTV9FbikpOwogCiAJc3dpdGNoIChlUkZQb3dlclN0YXRlKSB7Ci0JY2FzZSBlUmZPbjoKKwljYXNlIFJGX09OOgogCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRUMpOwogCiAJCS8qIHR1cm4gb24gQUZFICovCkBAIC02OTcsNyArNjU4LDcgQEAKIAkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwgKHUxYlRtcCAmICh+KEJJVDUgfCBCSVQ2KSkpKTsKIAkJYnJlYWs7Ci0JY2FzZSBlUmZTbGVlcDoKKwljYXNlIFJGX1NMRUVQOgogCQlmb3IgKFF1ZXVlSUQgPSAwLCBpID0gMDsgUXVldWVJRCA8IDY7KSB7CiAJCQlpZiAoZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldiwgUXVldWVJRCkgPT0KIAkJCQkJCQlwcml2LT50eHJpbmdjb3VudCkgewpAQCAtNzY0LDcgKzcyNSw3IEBACiAJCQl9CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBlUmZPZmY6CisJY2FzZSBSRl9PRkY6CiAJCWZvciAoUXVldWVJRCA9IDAsIGkgPSAwOyBRdWV1ZUlEIDwgNjspIHsKIAkJCWlmIChnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBRdWV1ZUlEKSA9PQogCQkJCQlwcml2LT50eHJpbmdjb3VudCkgewpAQCAtODQxLDEwICs4MDIsMTAgQEAKIAogdm9pZCBydGw4MjI1ejRfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmU2xlZXAsIFJGX0NIQU5HRV9CWV9QUyk7CisJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIFJGX1NMRUVQLCBSRl9DSEFOR0VfQllfUFMpOwogfQogCiB2b2lkIHJ0bDgyMjV6NF9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT24sIFJGX0NIQU5HRV9CWV9QUyk7CisJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIFJGX09OLCBSRl9DSEFOR0VfQllfUFMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCmluZGV4IDliNjc2ZTAuLmI1NTI0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogI2RlZmluZSBSQVRFX0NPVU5UIEFSUkFZX1NJWkUocnRsODE4MF9yYXRlcykKIAotc3RhdGljIENIQU5ORUxfTElTVCBEZWZhdWx0Q2hhbm5lbFBsYW5bXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcnRsODE4N3NlX2NoYW5uZWxfbGlzdCBkZWZhdWx0X2NoYW5uZWxfcGxhbltdID0gewogCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9LCAxOX0sCQkvKiBGQ0MgKi8KIAl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0sIDExfSwJCQkJCQkvKiBJQyAqLwogCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDIxfSwJLyogRVRTSQkqLwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCX0JZWxzZQl7CiAJCQkvKiBwcmV2ZW50IHNjYW4gaW4gQnVzeVRyYWZmaWMgKi8KIAkJCS8qIEZJWE1FOiBOZWVkIHRvIGNvbnNpZGVyIGxhc3Qgc2NhbiB0aW1lICovCi0JCQlpZiAoKHByaXYtPmxpbmtfZGV0ZWN0LmJCdXN5VHJhZmZpYykgJiYgKHRydWUpKQl7CisJCQlpZiAoKHByaXYtPmxpbmtfZGV0ZWN0LmJfYnVzeV90cmFmZmljKSAmJiAodHJ1ZSkpIHsKIAkJCQlyZXQgPSAwOwogCQkJCXByaW50aygiTm93IHRyYWZmaWMgaXMgYnVzeSwgcGxlYXNlIHRyeSBsYXRlciFcbiIpOwogCQkJfQllbHNlCkBAIC0xMDMwLDE1ICsxMDMwLDE1IEBACiAKIAkvKiB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLwogCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0JaWYgKERlZmF1bHRDaGFubmVsUGxhblsqdmFsXS5MZW4gIT0gMCkJeworCWlmIChkZWZhdWx0X2NoYW5uZWxfcGxhblsqdmFsXS5sZW4gIT0gMCkgewogCQlwcml2LT5jaGFubmVsX3BsYW4gPSAqdmFsOwogCQkvKiBDbGVhciBvbGQgY2hhbm5lbCBtYXAgOCAqLwogCQlmb3IgKGkgPSAxOyBpIDw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQogCQkJR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwW2ldID0gMDsKIAogCQkvKiBTZXQgbmV3IGNoYW5uZWwgbWFwICovCi0JCWZvciAoaSA9IDE7IGkgPD0gRGVmYXVsdENoYW5uZWxQbGFuWyp2YWxdLkxlbjsgaSsrKQotCQkJR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwW0RlZmF1bHRDaGFubmVsUGxhblsqdmFsXS5DaGFubmVsW2ktMV1dID0gMTsKKwkJZm9yIChpID0gMTsgaSA8PSBkZWZhdWx0X2NoYW5uZWxfcGxhblsqdmFsXS5sZW47IGkrKykKKwkJCUdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpLT5jaGFubmVsX21hcFtkZWZhdWx0X2NoYW5uZWxfcGxhblsqdmFsXS5jaGFubmVsW2ktMV1dID0gMTsKIAogCX0KIAl1cCgmcHJpdi0+d3hfc2VtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYwppbmRleCBjOGI5YmFmLi5jYzZmMTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCkBAIC02MTksMTAgKzYxOSwxMCBAQAogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAogCS8qIGx6bSBhZGQgMDgwODI2ICovCi0JaWYgKHByaXYtPmVSRlBvd2VyU3RhdGUgIT0gZVJmT24pIHsKKwlpZiAocHJpdi0+ZVJGUG93ZXJTdGF0ZSAhPSBSRl9PTikgewogCQkvKglEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgZGlzYWJsZSBQTEwgc2l0dWF0aW9uLgogCQkgKglSVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsICgiVXBkYXRlSW5pdGlhbEdhaW4gLQotCQkgKglwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSE9ZVJmT25cbiIpKTsKKwkJICoJcEhhbERhdGEtPmVSRlBvd2VyU3RhdGUhPVJGX09OXG4iKSk7CiAJCSAqCUJhY2sgdG8gdGhlIG9yaWdpbmFsIHN0YXRlCiAJCSAqLwogCQlwcml2LT5Jbml0aWFsR2FpbiA9IHByaXYtPkluaXRpYWxHYWluQmFja1VwOwpAQCAtODcyLDggKzg3Miw4IEBACiAKIHN0YXRpYyB2b2lkCiBBY3RVcGRhdGVDaGFubmVsQWNjZXNzU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgV0lSRUxFU1NfTU9ERSBXaXJlbGVzc01vZGUsCi0JCQkgICAgICBQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyBDaG5sQWNjZXNzU2V0dGluZykKKwkJCSAgICAgIGVudW0gd2lyZWxlc3NfbW9kZSBtb2RlLAorCQkJICAgICAgc3RydWN0IGNobmxfYWNjZXNzX3NldHRpbmcgKmNobmxfYWNjZXNzX3NldHRpbmcpCiB7CiAJQUNfQ09ESU5HCWVBQ0k7CiAKQEAgLTg5MCwyNSArODkwLDI1IEBACiAJICovCiAKIAkvKiBTdWdnZXN0ZWQgYnkgSm9uZywgMjAwNS4xMi4wOC4gKi8KLQlDaG5sQWNjZXNzU2V0dGluZy0+U0lGU19UaW1lciA9IDB4MjI7Ci0JQ2hubEFjY2Vzc1NldHRpbmctPkRJRlNfVGltZXIgPSAweDFDOyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCi0JQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIgPSA5OyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCisJY2hubF9hY2Nlc3Nfc2V0dGluZy0+c2lmc190aW1lciA9IDB4MjI7CisJY2hubF9hY2Nlc3Nfc2V0dGluZy0+ZGlmc190aW1lciA9IDB4MUM7IC8qIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4gKi8KKwljaG5sX2FjY2Vzc19zZXR0aW5nLT5zbG90X3RpbWVfdGltZXIgPSA5OyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCiAJLyoKIAkgKiBTdWdnZXN0ZWQgYnkgd2NjaHUsIGl0IGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEVJRlMgcmVnaXN0ZXIsCiAJICogMjAwNS4xMi4wOC4KIAkgKi8KLQlDaG5sQWNjZXNzU2V0dGluZy0+RUlGU19UaW1lciA9IDB4NUI7Ci0JQ2hubEFjY2Vzc1NldHRpbmctPkNXbWluSW5kZXggPSAzOyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCi0JQ2hubEFjY2Vzc1NldHRpbmctPkNXbWF4SW5kZXggPSA3OyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCisJY2hubF9hY2Nlc3Nfc2V0dGluZy0+ZWlmc190aW1lciA9IDB4NUI7CisJY2hubF9hY2Nlc3Nfc2V0dGluZy0+Y3dtaW5faW5kZXggPSAzOyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCisJY2hubF9hY2Nlc3Nfc2V0dGluZy0+Y3dtYXhfaW5kZXggPSA3OyAvKiAyMDA2LjA2LjAyLCBieSByY25qa28uICovCiAKLQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNJRlMsIENobmxBY2Nlc3NTZXR0aW5nLT5TSUZTX1RpbWVyKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFNJRlMsIGNobmxfYWNjZXNzX3NldHRpbmctPnNpZnNfdGltZXIpOwogCS8qCiAJICogUmV3cml0ZWQgZnJvbSBkaXJlY3RseSB1c2UgUGxhdGZvcm1FRklPV3JpdGUxQnl0ZSgpLAogCSAqIGJ5IEFubmllLCAyMDA2LTAzLTI5LgogCSAqLwotCXdyaXRlX25pY19ieXRlKGRldiwgU0xPVCwgQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIpOworCXdyaXRlX25pY19ieXRlKGRldiwgU0xPVCwgY2hubF9hY2Nlc3Nfc2V0dGluZy0+c2xvdF90aW1lX3RpbWVyKTsKIAotCXdyaXRlX25pY19ieXRlKGRldiwgRUlGUywgQ2hubEFjY2Vzc1NldHRpbmctPkVJRlNfVGltZXIpOworCXdyaXRlX25pY19ieXRlKGRldiwgRUlGUywgY2hubF9hY2Nlc3Nfc2V0dGluZy0+ZWlmc190aW1lcik7CiAKIAkvKgogCSAqIDxSSl9FWFBSX1FPUz4gU3VnZ2VzdGVkIGJ5IHdjY2h1LCBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBFSUZTCkBAIC05NTksNyArOTU5LDcgQEAKIAkgKiB3aXJlbGVzcyBtb2RlIGlmIHdlIHN3aXRjaCB0byBzcGVjaWZpZWQgYmFuZCBzdWNjZXNzZnVsbHkuCiAJICovCiAKLQlpZWVlLT5tb2RlID0gKFdJUkVMRVNTX01PREUpYnRXaXJlbGVzc01vZGU7CisJaWVlZS0+bW9kZSA9IChlbnVtIHdpcmVsZXNzX21vZGUpYnRXaXJlbGVzc01vZGU7CiAKIAkvKiAzLiBDaGFuZ2UgcmVsYXRlZCBzZXR0aW5nLiAqLwogCWlmIChpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfQSkKQEAgLTEwODUsNyArMTA4NSw3IEBACiAgKgkJUEFTU0lWRSBMRVZFTC4KICAqLwogc3RhdGljIGJvb2wgU2V0UkZQb3dlclN0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSkKKwkJCSAgICBlbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGUpCiB7CiAJc3RydWN0CXI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwogCWJvb2wJYlJlc3VsdCA9IGZhbHNlOwpAQCAtMTA5OCwxMyArMTA5OCwxMyBAQAogCXJldHVybiBiUmVzdWx0OwogfQogCi1ib29sIE1nbnRBY3RTZXRfUkZfU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUlRfUkZfUE9XRVJfU1RBVEUgU3RhdGVUb1NldCwKK2Jvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBlbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIFN0YXRlVG9TZXQsCiAJCQkgdTMyIENoYW5nZVNvdXJjZSkKIHsKIAlzdHJ1Y3QJcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJYm9vbAliQWN0aW9uQWxsb3dlZCA9IGZhbHNlOwogCWJvb2wJYkNvbm5lY3RCeVNTSUQgPSBmYWxzZTsKLQlSVF9SRl9QT1dFUl9TVEFURSBydFN0YXRlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgcnRTdGF0ZTsKIAl1MTYJUkZXYWl0Q291bnRlciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCS8qCkBAIC0xMTQwLDcgKzExNDAsNyBAQAogCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOwogCiAJc3dpdGNoIChTdGF0ZVRvU2V0KSB7Ci0JY2FzZSBlUmZPbjoKKwljYXNlIFJGX09OOgogCQkvKgogCQkgKglUdXJuIE9uIFJGIG5vIG1hdHRlciB0aGUgSVBTIHNldHRpbmcgYmVjYXVzZSB3ZSBuZWVkIHRvCiAJCSAqCXVwZGF0ZSB0aGUgUkYgc3RhdGUgdG8gTmRpcyB1bmRlciBWaXN0YSwgb3IgdGhlIFdpbmRvd3MKQEAgLTExNTMsMTMgKzExNTMsMTMgQEAKIAkJCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKIAkJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKIAotCQkJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmICYmCisJCQlpZiAocnRTdGF0ZSA9PSBSRl9PRkYgJiYKIAkJCSAgICBDaGFuZ2VTb3VyY2UgPj0gUkZfQ0hBTkdFX0JZX0hXKQogCQkJCWJDb25uZWN0QnlTU0lEID0gdHJ1ZTsKIAkJfQogCQlicmVhazsKIAotCWNhc2UgZVJmT2ZmOgorCWNhc2UgUkZfT0ZGOgogCQkgLyogMDcwMTI1LCByY25qa286IHdlIGFsd2F5cyBrZWVwIGNvbm5lY3RlZCBpbiBBUCBtb2RlLiAqLwogCiAJCWlmIChwcml2LT5SZk9mZlJlYXNvbiA+IFJGX0NIQU5HRV9CWV9JUFMpIHsKQEAgLTExODIsNyArMTE4Miw3IEBACiAJCXByaXYtPlJmT2ZmUmVhc29uIHw9IENoYW5nZVNvdXJjZTsKIAkJYkFjdGlvbkFsbG93ZWQgPSB0cnVlOwogCQlicmVhazsKLQljYXNlIGVSZlNsZWVwOgorCWNhc2UgUkZfU0xFRVA6CiAJCXByaXYtPlJmT2ZmUmVhc29uIHw9IENoYW5nZVNvdXJjZTsKIAkJYkFjdGlvbkFsbG93ZWQgPSB0cnVlOwogCQlicmVhazsKQEAgLTEyMzMsNyArMTIzMyw3IEBACiB2b2lkIElQU0VudGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwotCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBydFN0YXRlOwogCWlmIChwcml2LT5iSW5hY3RpdmVQcykgewogCQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKIApAQCAtMTI0NSw5ICsxMjQ1LDkgQEAKIAkJICoJdHJpZ2dlciBJUFMpKDQpIElCU1MgKHNlbmQgQmVhY29uKQogCQkgKgkoNSkgQVAgbW9kZSAoc2VuZCBCZWFjb24pCiAJCSAqLwotCQlpZiAocnRTdGF0ZSA9PSBlUmZPbiAmJiAhcHJpdi0+YlN3UmZQcm9jZXNzaW5nCisJCWlmIChydFN0YXRlID09IFJGX09OICYmICFwcml2LT5iU3dSZlByb2Nlc3NpbmcKIAkJCSYmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpKSB7Ci0JCQlwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlID0gZVJmT2ZmOworCQkJcHJpdi0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IFJGX09GRjsKIAkJCUluYWN0aXZlUG93ZXJTYXZlKGRldik7CiAJCX0KIAl9CkBAIC0xMjU1LDEzICsxMjU1LDEzIEBACiB2b2lkIElQU0xlYXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOwotCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBydFN0YXRlOwogCWlmIChwcml2LT5iSW5hY3RpdmVQcykgewogCQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKLQkJaWYgKChydFN0YXRlID09IGVSZk9mZiB8fCBydFN0YXRlID09IGVSZlNsZWVwKSAmJgorCQlpZiAoKHJ0U3RhdGUgPT0gUkZfT0ZGIHx8IHJ0U3RhdGUgPT0gUkZfU0xFRVApICYmCiAJCSAgICAhcHJpdi0+YlN3UmZQcm9jZXNzaW5nCiAJCSAgICAmJiBwcml2LT5SZk9mZlJlYXNvbiA8PSBSRl9DSEFOR0VfQllfSVBTKSB7Ci0JCQlwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlID0gZVJmT247CisJCQlwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlID0gUkZfT047CiAJCQlJbmFjdGl2ZVBvd2VyU2F2ZShkZXYpOwogCQl9CiAJfQpAQCAtMTM4NSwyMyArMTM4NSwyMyBAQAogCiAJCS8qIEluaXRpYWxpemUgUmVnV2lyZWxlc3NNb2RlIGlmIGl0IGlzIG5vdCBhIHZhbGlkIG9uZS4JKi8KIAkJaWYgKGJJbnZhbGlkV2lyZWxlc3NNb2RlKQotCQkJaWVlZS0+bW9kZSA9IChXSVJFTEVTU19NT0RFKUluaXRXaXJlbGVzc01vZGU7CisJCQlpZWVlLT5tb2RlID0gKGVudW0gd2lyZWxlc3NfbW9kZSlJbml0V2lyZWxlc3NNb2RlOwogCiAJfSBlbHNlIHsKIAkvKiBPbmUgb2YgQiwgRywgQS4gKi8KIAkJSW5pdFdpcmVsZXNzTW9kZSA9IGllZWUtPm1vZGU7CiAJfQotCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBlUmZPZmY7CisJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IFJGX09GRjsKIAlwcml2LT5SZk9mZlJlYXNvbiA9IDA7CiAJewotCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT24sIDApOworCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgUkZfT04sIDApOwogCX0KIAkJLyoKIAkJICogSWYgaW5hY3RpdmUgcG93ZXIgbW9kZSBpcyBlbmFibGVkLCBkaXNhYmxlIHJmIHdoaWxlIGluCiAJCSAqIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KIAkJICovCiAJaWYgKHByaXYtPmJJbmFjdGl2ZVBzKQotCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiAsIGVSZk9mZiwgUkZfQ0hBTkdFX0JZX0lQUyk7CisJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2ICwgUkZfT0ZGLCBSRl9DSEFOR0VfQllfSVBTKTsKIAogCUFjdFNldFdpcmVsZXNzTW9kZTgxODUoZGV2LCAodTgpKEluaXRXaXJlbGVzc01vZGUpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9LY29uZmlnCmluZGV4IGM5YzU0OGYuLjlhNTdkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L0tjb25maWcKQEAgLTEyLDcgKzEyLDcgQEAKIAogY29uZmlnIDg4RVVfQVBfTU9ERQogCWJvb2wgIlJlYWx0ZWsgUlRMODE4OEVVIEFQIG1vZGUiCi0JZGVmYXVsdCBZCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCVRoaXMgb3B0aW9uIGVuYWJsZXMgQWNjZXNzIFBvaW50IG1vZGUuIFVubGVzcyB5b3Uga25vdyB0aGF0IHlvdXIgc3lzdGVtCiAJd2lsbCBuZXZlciBiZSB1c2VkIGFzIGFuIEFQLCBvciB0aGUgdGFyZ2V0IHN5c3RlbSBoYXMgbGltaXRlZCBtZW1vcnksCkBAIC0yMCw3ICsyMCw3IEBACiAKIGNvbmZpZyA4OEVVX1AyUAogCWJvb2wgIlJlYWx0ZWsgUlRMODE4OEVVIFBlZXItdG8tcGVlciBtb2RlIgotCWRlZmF1bHQgWQorCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAlUaGlzIG9wdGlvbiBlbmFibGVzIHBlZXItdG8tcGVlciBtb2RlIGZvciB0aGUgcjgxODhldSBkcml2ZXIuIFVubGVzcyB5b3UKIAlrbm93IHRoYXQgcGVlci10by1wZWVyIChQMlApIG1vZGUgd2lsbCBuZXZlciBiZSB1c2VkLCBvciB0aGUgdGFyZ2V0IHN5c3RlbSBoYXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L01ha2VmaWxlCmluZGV4IDBhNjE3YjQuLjZhMTM4ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9NYWtlZmlsZQpAQCAtMzQsNyArMzQsNiBAQAogCQloYWwvaGFsX2NvbS5vCQlcCiAJCWhhbC9vZG0ubwkJXAogCQloYWwvb2RtX2RlYnVnLm8JCVwKLQkJaGFsL29kbV9pbnRlcmZhY2UubwlcCiAJCWhhbC9vZG1fSFdDb25maWcubwlcCiAJCWhhbC9vZG1fUmVnQ29uZmlnODE4OEUub1wKIAkJaGFsL29kbV9SVEw4MTg4RS5vCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvVE9ETwppbmRleCBmN2YzODljLi5iNTc0YjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9UT0RPCkBAIC05LDYgKzksMTEgQEAKIC0gbWVyZ2UgUmVhbHRlaydzIGJ1Z2ZpeGVzIGFuZCBuZXcgZmVhdHVyZXMgaW50byB0aGUgZHJpdmVyCiAtIHN3aXRjaCB0byB1c2UgTElCODAyMTEKIC0gc3dpdGNoIHRvIHVzZSBNQUM4MDIxMQorLSBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGlzIGNvZGUgaW4gcnR3X3JlY3ZfaW5kaWNhdGVwa3QoKToKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmN1X2RlcmVmZXJlbmNlKHBhZGFwdGVyLT5wbmV0ZGV2LT5yeF9oYW5kbGVyX2RhdGEpOworCXJjdV9yZWFkX3VubG9jaygpOworICBQZXJoYXBzIGRlbGV0ZSBpdCwgcGVyaGFwcyBhc3NpZ24gdG8gc29tZSBsb2NhbCB2YXJpYWJsZS4KIAogUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXguY29tPiwKIGFuZCBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCmluZGV4IDhlYmU2YmMuLmZmNzRkMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAkJfSBlbHNlIHsKIAkJCXRpbV9pZWxlbiA9IDA7CiAKLQkJCS8qIGNhbHVjYXRlIGhlYWRfbGVuICovCisJCQkvKiBjYWxjdWxhdGUgaGVhZF9sZW4gKi8KIAkJCW9mZnNldCA9IF9GSVhFRF9JRV9MRU5HVEhfOwogCQkJb2Zmc2V0ICs9IHBuZXR3b3JrX21sbWVleHQtPlNzaWQuU3NpZExlbmd0aCArIDI7CiAKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkqZHN0X2llKysgPSB0aW1faWVsZW47CiAKIAkJKmRzdF9pZSsrID0gMDsvKiBEVElNIGNvdW50ICovCi0JCSpkc3RfaWUrKyA9IDE7LyogRFRJTSBwZXJvaWQgKi8KKwkJKmRzdF9pZSsrID0gMTsvKiBEVElNIHBlcmlvZCAqLwogCiAJCWlmIChwc3RhcHJpdi0+dGltX2JpdG1hcCZCSVQoMCkpLyogZm9yIGJjL21jIGZyYW1lcyAqLwogCQkJKmRzdF9pZSsrID0gQklUKDApOy8qIGJpdG1hcCBjdHJsICovCkBAIC0yODUsMTIgKzI4NSwxMiBAQAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKIAogCXBoZWFkID0gJnBzdGFwcml2LT5hdXRoX2xpc3Q7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCS8qIGNoZWNrIGF1dGhfcXVldWUgKi8KIAl3aGlsZSAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpID09IGZhbHNlKSB7Ci0JCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhdXRoX2xpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhdXRoX2xpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCWlmIChwc3RhLT5leHBpcmVfdG8gPiAwKSB7CiAJCQlwc3RhLT5leHBpcmVfdG8tLTsKQEAgLTMxOSwxMiArMzE5LDEyIEBACiAJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCiAJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJLyogY2hlY2sgYXNvY19xdWV1ZSAqLwogCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJaWYgKGNoa19zdGFfaXNfYWxpdmUocHN0YSkgfHwgIXBzdGEtPmV4cGlyZV90bykgewogCQkJcHN0YS0+ZXhwaXJlX3RvID0gcHN0YXByaXYtPmV4cGlyZV90bzsKQEAgLTgyMSw3ICs4MjEsNyBAQAogCS8qIHVwZGF0ZSBjdXJfd2lyZWxlc3NfbW9kZSAqLwogCXVwZGF0ZV93aXJlbGVzc19tb2RlKHBhZGFwdGVyKTsKIAotCS8qIHVkcGF0ZSBjYXBhYmlsaXR5IGFmdGVyIGN1cl93aXJlbGVzc19tb2RlIHVwZGF0ZWQgKi8KKwkvKiB1cGRhdGUgY2FwYWJpbGl0eSBhZnRlciBjdXJfd2lyZWxlc3NfbW9kZSB1cGRhdGVkICovCiAJdXBkYXRlX2NhcGluZm8ocGFkYXB0ZXIsIHJ0d19nZXRfY2FwYWJpbGl0eSgoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwbmV0d29yaykpOwogCiAJLyogbGV0IHBuZXR3b3JrX21sbWVleHQgPT0gcG5ldHdvcmtfbWxtZS4gKi8KQEAgLTk4MCw3ICs5ODAsNyBAQAogCWZvciAocCA9IGllICsgX0JFQUNPTl9JRV9PRkZTRVRfOzsgcCArPSAoaWVfbGVuICsgMikpIHsKIAkJcCA9IHJ0d19nZXRfaWUocCwgX1NTTl9JRV8xXywgJmllX2xlbiwKIAkJCSAgICAgICAocGJzc19uZXR3b3JrLT5JRUxlbmd0aCAtIF9CRUFDT05fSUVfT0ZGU0VUXyAtIChpZV9sZW4gKyAyKSkpOwotCQlpZiAoKHApICYmIChfcnR3X21lbWNtcChwKzIsIE9VSTEsIDQpKSkgeworCQlpZiAoKHApICYmICghbWVtY21wKHArMiwgT1VJMSwgNCkpKSB7CiAJCQlpZiAocnR3X3BhcnNlX3dwYV9pZShwLCBpZV9sZW4rMiwgJmdyb3VwX2NpcGhlciwKIAkJCQkJICAgICAmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgewogCQkJCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIAkJZm9yIChwID0gaWUgKyBfQkVBQ09OX0lFX09GRlNFVF87OyBwICs9IChpZV9sZW4gKyAyKSkgewogCQkJcCA9IHJ0d19nZXRfaWUocCwgX1ZFTkRPUl9TUEVDSUZJQ19JRV8sICZpZV9sZW4sCiAJCQkJICAgICAgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfIC0gKGllX2xlbiArIDIpKSk7Ci0JCQlpZiAoKHApICYmIF9ydHdfbWVtY21wKHArMiwgV01NX1BBUkFfSUUsIDYpKSB7CisJCQlpZiAoKHApICYmICFtZW1jbXAocCsyLCBXTU1fUEFSQV9JRSwgNikpIHsKIAkJCQlwbWxtZXByaXYtPnFvc3ByaXYucW9zX29wdGlvbiA9IDE7CiAKIAkJCQkqKHArOCkgfD0gQklUKDcpOy8qIFFvUyBJbmZvLCBzdXBwb3J0IFUtQVBTRCAqLwpAQCAtMTE0NCwxMyArMTE0NCwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBhY2xfbm9kZV9xLT5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocGFjbF9ub2RlX3EpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKLQkJcGFjbG5vZGUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBhY2xub2RlID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCi0JCWlmIChfcnR3X21lbWNtcChwYWNsbm9kZS0+YWRkciwgYWRkciwgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKHBhY2xub2RlLT5hZGRyLCBhZGRyLCBFVEhfQUxFTikpIHsKIAkJCWlmIChwYWNsbm9kZS0+dmFsaWQpIHsKIAkJCQlhZGRlZCA9IHRydWU7CiAJCQkJREJHXzg4RSgiJXMsIHN0YSBoYXMgYmVlbiBhZGRlZFxuIiwgX19mdW5jX18pOwpAQCAtMTIwNSwxMyArMTIwNSwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBhY2xfbm9kZV9xLT5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocGFjbF9ub2RlX3EpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKLQkJcGFjbG5vZGUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBhY2xub2RlID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCi0JCWlmIChfcnR3X21lbWNtcChwYWNsbm9kZS0+YWRkciwgYWRkciwgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKHBhY2xub2RlLT5hZGRyLCBhZGRyLCBFVEhfQUxFTikpIHsKIAkJCWlmIChwYWNsbm9kZS0+dmFsaWQpIHsKIAkJCQlwYWNsbm9kZS0+dmFsaWQgPSBmYWxzZTsKIApAQCAtMTMzOSw4ICsxMzM5LDcgQEAKIAkJcG5ldHdvcmstPklFTGVuZ3RoID0gd3BzX29mZnNldCArICh3cHNfaWVsZW4rMikgKyByZW1haW5kZXJfaWVsZW47CiAJfQogCi0JaWYgKHBiYWNrdXBfcmVtYWluZGVyX2llKQotCQlrZnJlZShwYmFja3VwX3JlbWFpbmRlcl9pZSk7CisJa2ZyZWUocGJhY2t1cF9yZW1haW5kZXJfaWUpOwogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfYmNuX3AycF9pZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCkBAIC0xMzUxLDEzICsxMzUwLDEzIEBACiB7CiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKIAotCWlmIChfcnR3X21lbWNtcChSVFdfV1BBX09VSSwgb3VpLCA0KSkKKwlpZiAoIW1lbWNtcChSVFdfV1BBX09VSSwgb3VpLCA0KSkKIAkJdXBkYXRlX2Jjbl93cGFfaWUocGFkYXB0ZXIpOwotCWVsc2UgaWYgKF9ydHdfbWVtY21wKFdNTV9PVUksIG91aSwgNCkpCisJZWxzZSBpZiAoIW1lbWNtcChXTU1fT1VJLCBvdWksIDQpKQogCQl1cGRhdGVfYmNuX3dtbV9pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoX3J0d19tZW1jbXAoV1BTX09VSSwgb3VpLCA0KSkKKwllbHNlIGlmICghbWVtY21wKFdQU19PVUksIG91aSwgNCkpCiAJCXVwZGF0ZV9iY25fd3BzX2llKHBhZGFwdGVyKTsKLQllbHNlIGlmIChfcnR3X21lbWNtcChQMlBfT1VJLCBvdWksIDQpKQorCWVsc2UgaWYgKCFtZW1jbXAoUDJQX09VSSwgb3VpLCA0KSkKIAkJdXBkYXRlX2Jjbl9wMnBfaWUocGFkYXB0ZXIpOwogCWVsc2UKIAkJREJHXzg4RSgidW5rbm93biBPVUkgdHlwZSFcbiIpOwpAQCAtMTQxNSw3ICsxNDE0LDcgQEAKIAogLyoKIG9wX21vZGUKLVNldCB0byAwIChIVCBwdXJlKSB1bmRlciB0aGUgZm9sbG93aWduIGNvbmRpdGlvbnMKK1NldCB0byAwIChIVCBwdXJlKSB1bmRlciB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKIAktIGFsbCBTVEFzIGluIHRoZSBCU1MgYXJlIDIwLzQwIE1IeiBIVCBpbiAyMC80MCBNSHogQlNTIG9yCiAJLSBhbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMCBNSHogSFQgaW4gMjAgTUh6IEJTUwogU2V0IHRvIDEgKEhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbikgaWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzCkBAIC0xNDk0LDcgKzE0OTMsNyBAQAogCiB2b2lkIGFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCB1cGRhdGVkKQogewotCS8qIHVwZGF0ZSBhc3NvY2ljYXRlZCBzdGF0aW9ucyBjYXAuICovCisJLyogdXBkYXRlIGFzc29jaWF0ZWQgc3RhdGlvbnMgY2FwLiAqLwogCWlmICh1cGRhdGVkKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7CiAJCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CkBAIC0xNTAzLDEzICsxNTAyLDEzIEBACiAJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAogCQlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQkvKiBjaGVjayBhc29jX3F1ZXVlICovCiAJCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOworCQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwogCi0JCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJCVZDU191cGRhdGUocGFkYXB0ZXIsIHBzdGEpOwogCQl9CkBAIC0xNjQ3LDcgKzE2NDYsNyBAQAogCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfSFRfQUREX0lORk9fSUVfLCBOVUxMLCB0cnVlKTsKIAl9CiAKLQkvKiB1cGRhdGUgYXNzb2NpY2F0ZWQgc3RhdGlvbnMgY2FwLiAqLworCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KIAlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlKHBhZGFwdGVyLCAgYmVhY29uX3VwZGF0ZWQpOwogCiAJREJHXzg4RSgiJXMsIHVwZGF0ZWQgPSVkXG4iLCBfX2Z1bmNfXywgYmVhY29uX3VwZGF0ZWQpOwpAQCAtMTcxMSw3ICsxNzEwLDcgQEAKIAkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX0hUX0FERF9JTkZPX0lFXywgTlVMTCwgdHJ1ZSk7CiAJfQogCi0JLyogdXBkYXRlIGFzc29jaWNhdGVkIHN0YXRpb25zIGNhcC4gKi8KKwkvKiB1cGRhdGUgYXNzb2NpYXRlZCBzdGF0aW9ucyBjYXAuICovCiAKIAlEQkdfODhFKCIlcywgdXBkYXRlZCA9JWRcbiIsIF9fZnVuY19fLCBiZWFjb25fdXBkYXRlZCk7CiAKQEAgLTE3NzcsMTIgKzE3NzYsMTIgQEAKIAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkvKiBmb3IgZWFjaCBzdGEgaW4gYXNvY19xdWV1ZSAqLwogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQlpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2gocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgbmV3X2NoLCBjaF9vZmZzZXQpOwogCQlwc3RhLT5leHBpcmVfdG8gPSAoKHBzdGFwcml2LT5leHBpcmVfdG8gKiAyKSA+IDUpID8gNSA6IChwc3RhcHJpdi0+ZXhwaXJlX3RvICogMik7CkBAIC0xODExLDEzICsxODEwLDEzIEBACiAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7CiAJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJLyogZnJlZSBzdGEgYXNvY19xdWV1ZSAqLwogCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQlydHdfbGlzdF9kZWxldGUoJnBzdGEtPmFzb2NfbGlzdCk7CiAJCXBzdGFwcml2LT5hc29jX2xpc3RfY250LS07CkBAIC0xOTQyLDEwICsxOTQxLDEwIEBACiAJLyogZm9yIEFDTCAqLwogCXNwaW5fbG9ja19iaCgmKHBhY2xfbm9kZV9xLT5sb2NrKSk7CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBhY2xfbm9kZV9xKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJcGFjbG5vZGUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBhY2xub2RlID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUsIGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCWlmIChwYWNsbm9kZS0+dmFsaWQpIHsKIAkJCXBhY2xub2RlLT52YWxpZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19icl9leHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYnJfZXh0LmMKaW5kZXggNzVlMzhkNC4uZTg0M2M2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19icl9leHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2JyX2V4dC5jCkBAIC00MDksNyArNDA5LDcgQEAKIAlkYiA9IHByaXYtPm5ldGhhc2hbaGFzaF07CiAJd2hpbGUgKGRiICE9IE5VTEwpIHsKIAkJaWYgKCFtZW1jbXAoZGItPm5ldHdvcmtBZGRyLCBuZXR3b3JrQWRkciwgTUFYX05FVFdPUktfQUREUl9MRU4pKSB7Ci0JCQltZW1jcHkoZGItPm1hY0FkZHIsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKwkJCWV0aGVyX2FkZHJfY29weShkYi0+bWFjQWRkciwgbWFjQWRkcik7CiAJCQlkYi0+YWdlaW5nX3RpbWVyID0gamlmZmllczsKIAkJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5icl9leHRfbG9jayk7CiAJCQlyZXR1cm47CkBAIC00MjIsNyArNDIyLDcgQEAKIAkJcmV0dXJuOwogCX0KIAltZW1jcHkoZGItPm5ldHdvcmtBZGRyLCBuZXR3b3JrQWRkciwgTUFYX05FVFdPUktfQUREUl9MRU4pOwotCW1lbWNweShkYi0+bWFjQWRkciwgbWFjQWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShkYi0+bWFjQWRkciwgbWFjQWRkcik7CiAJYXRvbWljX3NldCgmZGItPnVzZV9jb3VudCwgMSk7CiAJZGItPmFnZWluZ190aW1lciA9IGppZmZpZXM7CiAKQEAgLTU0MywxMyArNTQzLDE0IEBACiAJCQlpZiAoIV9fbmF0MjVfZGJfbmV0d29ya19sb29rdXBfYW5kX3JlcGxhY2UocHJpdiwgc2tiLCBuZXR3b3JrQWRkcikpIHsKIAkJCQlpZiAoKigodW5zaWduZWQgY2hhciAqKSZpcGgtPmRhZGRyICsgMykgPT0gMHhmZikgewogCQkJCQkvKiAgTDIgaXMgdW5pY2FzdCBidXQgTDMgaXMgYnJvYWRjYXN0LCBtYWtlIEwyIGJhY29tZSBicm9hZGNhc3QgKi8KLQkJCQkJREVCVUdfSU5GTygiTkFUMjU6IFNldCBEQSBhcyBib2FyZGNhc3RcbiIpOworCQkJCQlERUJVR19JTkZPKCJOQVQyNTogU2V0IERBIGFzIGJyb2FkY2FzdFxuIik7CiAJCQkJCW1lbXNldChza2ItPmRhdGEsIDB4ZmYsIEVUSF9BTEVOKTsKIAkJCQl9IGVsc2UgewotCQkJCQkvKiAgZm9yd2FyZCB1bmtub3cgSVAgcGFja2V0IHRvIHVwcGVyIFRDUC9JUCAqLworCQkJCQkvKiAgZm9yd2FyZCB1bmtub3duIElQIHBhY2tldCB0byB1cHBlciBUQ1AvSVAgKi8KIAkJCQkJREVCVUdfSU5GTygiTkFUMjU6IFJlcGxhY2UgREEgd2l0aCBCUidzIE1BQ1xuIik7CiAJCQkJCWlmICgoKih1MzIgKilwcml2LT5icl9tYWMpID09IDAgJiYgKCoodTE2ICopKHByaXYtPmJyX21hYys0KSkgPT0gMCkgewotCQkJCQkJcHJpbnRrKCJSZS1pbml0IG5ldGRldl9icl9pbml0KCkgZHVlIHRvIGJyX21hYyA9PSAwIVxuIik7CisJCQkJCQluZXRkZXZfaW5mbyhza2ItPmRldiwKKwkJCQkJCQkJIlJlLWluaXQgbmV0ZGV2X2JyX2luaXQoKSBkdWUgdG8gYnJfbWFjID09IDAhXG4iKTsKIAkJCQkJCW5ldGRldl9icl9pbml0KHByaXYtPnBuZXRkZXYpOwogCQkJCQl9CiAJCQkJCW1lbWNweShza2ItPmRhdGEsIHByaXYtPmJyX21hYywgRVRIX0FMRU4pOwpAQCAtOTMyLDcgKzkzMyw3IEBACiAJCQkJCQkocGgtPmNvZGUgPT0gUEFET19DT0RFID8gIlBBRE8iIDogIlBBRFMiKSwJc2tiLT5kZXYtPm5hbWUpOwogCQkJCX0gZWxzZSB7IC8qICBub3QgYWRkIHJlbGF5IHRhZyAqLwogCQkJCQlpZiAoIXByaXYtPnBwcG9lX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MpIHsKLQkJCQkJCURFQlVHX0VSUigiRGlzY2FyZCBQUFBvRSBwYWNrZXQgZHVlIHRvIG5vIGNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3NzIVxuIik7CisJCQkJCQlERUJVR19FUlIoIkRpc2NhcmQgUFBQb0UgcGFja2V0IGR1ZSB0byBubyBjb25uZWN0aW9uIGluIHByb2dyZXNzIVxuIik7CiAJCQkJCQlyZXR1cm4gLTE7CiAJCQkJCX0KIAkJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcHJpdi0+cHBwb2VfYWRkciwgRVRIX0FMRU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKaW5kZXggODJmZThjNC4uYzJmYjA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCkBAIC0zMiwxMSArMzIsMTAgQEAKIE5vIGlycXNhdmUgaXMgbmVjZXNzYXJ5LgogKi8KIAotaW50CV9ydHdfaW5pdF9jbWRfcHJpdiAoc3RydWN0CWNtZF9wcml2ICpwY21kcHJpdikKK2ludCBfcnR3X2luaXRfY21kX3ByaXYoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKIHsKIAlpbnQgcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNlbWFfaW5pdCgmKHBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSksIDApOwogCS8qIHNlbWFfaW5pdCgmKHBjbWRwcml2LT5jbWRfZG9uZV9zZW1hKSwgMCk7ICovCkBAIC03MSw3ICs3MCw2IEBACiAJcGNtZHByaXYtPmNtZF9kb25lX2NudCA9IDA7CiAJcGNtZHByaXYtPnJzcF9jbnQgPSAwOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTgxLDI0ICs3OSwyMSBAQAogewogCWludCByZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJLyogYWxsb2NhdGUgRE1BLWFibGUvTm9uLVBhZ2UgbWVtb3J5IGZvciBjbWRfYnVmIGFuZCByc3BfYnVmICovCiAJYXRvbWljX3NldCgmcGV2dHByaXYtPmV2ZW50X3NlcSwgMCk7CiAJcGV2dHByaXYtPmV2dF9kb25lX2NudCA9IDA7CiAKLQlfaW5pdF93b3JraXRlbSgmcGV2dHByaXYtPmMyaF93aywgYzJoX3drX2NhbGxiYWNrLCBOVUxMKTsKKwlJTklUX1dPUksoJnBldnRwcml2LT5jMmhfd2ssIGMyaF93a19jYWxsYmFjayk7CiAJcGV2dHByaXYtPmMyaF93a19hbGl2ZSA9IGZhbHNlOwogCXBldnRwcml2LT5jMmhfcXVldWUgPSBydHdfY2J1Zl9hbGxvYyhDMkhfUVVFVUVfTUFYX0xFTisxKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQogCi12b2lkIHJ0d19mcmVlX2V2dF9wcml2KHN0cnVjdAlldnRfcHJpdiAqcGV2dHByaXYpCit2b2lkIHJ0d19mcmVlX2V2dF9wcml2KHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpCiB7Ci1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoIitydHdfZnJlZV9ldnRfcHJpdlxuIikpOwogCkBAIC0xMTMsMjEgKzEwOCwxNSBAQAogCX0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoIi1ydHdfZnJlZV9ldnRfcHJpdlxuIikpOwogCi1fZnVuY19leGl0XzsKIH0KIAotdm9pZCBfcnR3X2ZyZWVfY21kX3ByaXYgKHN0cnVjdAljbWRfcHJpdiAqcGNtZHByaXYpCit2b2lkIF9ydHdfZnJlZV9jbWRfcHJpdihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBjbWRwcml2KSB7Ci0JCWlmIChwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYpCi0JCQlrZnJlZShwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYpOwotCi0JCWlmIChwY21kcHJpdi0+cnNwX2FsbG9jYXRlZF9idWYpCi0JCQlrZnJlZShwY21kcHJpdi0+cnNwX2FsbG9jYXRlZF9idWYpOworCQlrZnJlZShwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYpOworCQlrZnJlZShwY21kcHJpdi0+cnNwX2FsbG9jYXRlZF9idWYpOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtMTQwLDExICsxMjksMTAgQEAKIAogKi8KIAotaW50CV9ydHdfZW5xdWV1ZV9jbWQoc3RydWN0IF9fcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgY21kX29iaiAqb2JqKQoraW50IF9ydHdfZW5xdWV1ZV9jbWQoc3RydWN0IF9fcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgY21kX29iaiAqb2JqKQogewogCXVuc2lnbmVkIGxvbmcgaXJxTDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKG9iaiA9PSBOVUxMKQogCQlnb3RvIGV4aXQ7CkBAIC0xNTcsNyArMTQ1LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xNjcsNDcgKzE1NCwzOSBAQAogCXVuc2lnbmVkIGxvbmcgaXJxTDsKIAlzdHJ1Y3QgY21kX29iaiAqb2JqOwogCi1fZnVuY19lbnRlcl87CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmxvY2ssIGlycUwpOwogCWlmIChydHdfaXNfbGlzdF9lbXB0eSgmKHF1ZXVlLT5xdWV1ZSkpKSB7CiAJCW9iaiA9IE5VTEw7CiAJfSBlbHNlIHsKLQkJb2JqID0gTElTVF9DT05UQUlOT1IoZ2V0X25leHQoJihxdWV1ZS0+cXVldWUpKSwgc3RydWN0IGNtZF9vYmosIGxpc3QpOworCQlvYmogPSBjb250YWluZXJfb2YoKCZxdWV1ZS0+cXVldWUpLT5uZXh0LCBzdHJ1Y3QgY21kX29iaiwgbGlzdCk7CiAJCXJ0d19saXN0X2RlbGV0ZSgmb2JqLT5saXN0KTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+bG9jaywgaXJxTCk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIG9iajsKIH0KIAotdTMyCXJ0d19pbml0X2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCit1MzIgcnR3X2luaXRfY21kX3ByaXYoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKIHsKIAl1MzIJcmVzOwotX2Z1bmNfZW50ZXJfOwotCXJlcyA9IF9ydHdfaW5pdF9jbWRfcHJpdiAocGNtZHByaXYpOwotX2Z1bmNfZXhpdF87CisJcmVzID0gX3J0d19pbml0X2NtZF9wcml2KHBjbWRwcml2KTsKIAlyZXR1cm4gcmVzOwogfQogCi11MzIJcnR3X2luaXRfZXZ0X3ByaXYgKHN0cnVjdAlldnRfcHJpdiAqcGV2dHByaXYpCit1MzIgcnR3X2luaXRfZXZ0X3ByaXYoc3RydWN0IGV2dF9wcml2ICpwZXZ0cHJpdikKIHsKLQlpbnQJcmVzOwotX2Z1bmNfZW50ZXJfOworCWludCByZXM7CiAJcmVzID0gX3J0d19pbml0X2V2dF9wcml2KHBldnRwcml2KTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKLXZvaWQgcnR3X2ZyZWVfY21kX3ByaXYoc3RydWN0CWNtZF9wcml2ICpwY21kcHJpdikKK3ZvaWQgcnR3X2ZyZWVfY21kX3ByaXYoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKIHsKLV9mdW5jX2VudGVyXzsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoInJ0d19mcmVlX2NtZF9wcml2XG4iKSk7CiAJX3J0d19mcmVlX2NtZF9wcml2KHBjbWRwcml2KTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgaW50IHJ0d19jbWRfZmlsdGVyKHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYsIHN0cnVjdCBjbWRfb2JqICpjbWRfb2JqKQpAQCAtMjM4LDcgKzIxNyw2IEBACiAJaW50IHJlcyA9IF9GQUlMOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHBjbWRwcml2LT5wYWRhcHRlcjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKGNtZF9vYmogPT0gTlVMTCkKIAkJZ290byBleGl0OwpAQCAtMjU4LDM0ICsyMzYsMjggQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQogCi1zdHJ1Y3QJY21kX29iagkqcnR3X2RlcXVldWVfY21kKHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCitzdHJ1Y3QgY21kX29iagkqcnR3X2RlcXVldWVfY21kKHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7CiAJc3RydWN0IGNtZF9vYmogKmNtZF9vYmo7CiAKLV9mdW5jX2VudGVyXzsKIAogCWNtZF9vYmogPSBfcnR3X2RlcXVldWVfY21kKCZwY21kcHJpdi0+Y21kX3F1ZXVlKTsKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIGNtZF9vYmo7CiB9CiAKLXZvaWQgcnR3X2NtZF9jbHJfaXNyKHN0cnVjdAljbWRfcHJpdiAqcGNtZHByaXYpCit2b2lkIHJ0d19jbWRfY2xyX2lzcihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewotX2Z1bmNfZW50ZXJfOwogCXBjbWRwcml2LT5jbWRfZG9uZV9jbnQrKzsKIAkvKiB1cCgmKHBjbWRwcml2LT5jbWRfZG9uZV9zZW1hKSk7ICovCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfZnJlZV9jbWRfb2JqKHN0cnVjdCBjbWRfb2JqICpwY21kKQogewotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKChwY21kLT5jbWRjb2RlICE9IF9Kb2luQnNzX0NNRF8pICYmIChwY21kLT5jbWRjb2RlICE9IF9DcmVhdGVCc3NfQ01EXykpIHsKIAkJLyogZnJlZSBwYXJtYnVmIGluIGNtZF9vYmogKi8KQEAgLTMwMiw3ICsyNzQsNiBAQAogCS8qIGZyZWUgY21kX29iaiAqLwogCWtmcmVlKHBjbWQpOwogCi1fZnVuY19leGl0XzsKIH0KIAogaW50IHJ0d19jbWRfdGhyZWFkKHZvaWQgKmNvbnRleHQpCkBAIC0zMTUsNyArMjg2LDYgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKiljb250ZXh0OwogCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmKHBhZGFwdGVyLT5jbWRwcml2KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJdGhyZWFkX2VudGVyKCJSVFdfQ01EX1RIUkVBRCIpOwogCkBAIC00MTAsNyArMzgwLDYgQEAKIAogCXVwKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKIAotX2Z1bmNfZXhpdF87CiAKIAljb21wbGV0ZV9hbmRfZXhpdChOVUxMLCAwKTsKIH0KQEAgLTQyMywxNSArMzkyLDE0IEBACiAKIAl1OCByZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCi0JcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOworCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOwogCWlmIChwaDJjID09IE5VTEwpIHsKIAkJcmV0ID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlwc2V0dXNic3VzcGVuZCA9IChzdHJ1Y3QgdXNiX3N1c3BlbmRfcGFybSAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX3N1c3BlbmRfcGFybSkpOworCXBzZXR1c2JzdXNwZW5kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zdXNwZW5kX3Bhcm0pLCBHRlBfS0VSTkVMKTsKIAlpZiAocHNldHVzYnN1c3BlbmQgPT0gTlVMTCkgewogCQlrZnJlZShwaDJjKTsKIAkJcmV0ID0gX0ZBSUw7CkBAIC00NDYsNyArNDE0LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDY1LDE0ICs0MzIsMTEgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJCSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi1fZnVuY19lbnRlcl87Ci0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSA9PSB0cnVlKSB7CisJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSA9PSB0cnVlKQogCQlydHdfbHBzX2N0cmxfd2tfY21kKHBhZGFwdGVyLCBMUFNfQ1RSTF9TQ0FOLCAxKTsKLQl9CiAKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUpIHsKKwlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUpCiAJCXAycF9wc193a19jbWQocGFkYXB0ZXIsIFAyUF9QU19TQ0FOLCAxKTsKLQl9CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkKQEAgLTUwMCw5ICs0NjQsNiBAQAogCQkJaWYgKHNzaWRbaV0uU3NpZExlbmd0aCkgewogCQkJCW1lbWNweSgmcHN1cnZleVBhcmEtPnNzaWRbaV0sICZzc2lkW2ldLCBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX3NzaWQpKTsKIAkJCQlwc3VydmV5UGFyYS0+c3NpZF9udW0rKzsKLQkJCQlpZiAoMCkKLQkJCQlEQkdfODhFKEZVTkNfQURQVF9GTVQiIHNzaWQ6KCVzLCAlZClcbiIsIEZVTkNfQURQVF9BUkcocGFkYXB0ZXIpLAotCQkJCQlwc3VydmV5UGFyYS0+c3NpZFtpXS5Tc2lkLCBwc3VydmV5UGFyYS0+c3NpZFtpXS5Tc2lkTGVuZ3RoKTsKIAkJCX0KIAkJfQogCX0KQEAgLTUxNCw5ICs0NzUsNiBAQAogCQkJaWYgKGNoW2ldLmh3X3ZhbHVlICYmICEoY2hbaV0uZmxhZ3MgJiBSVFdfSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpKSB7CiAJCQkJbWVtY3B5KCZwc3VydmV5UGFyYS0+Y2hbaV0sICZjaFtpXSwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKIAkJCQlwc3VydmV5UGFyYS0+Y2hfbnVtKys7Ci0JCQkJaWYgKDApCi0JCQkJREJHXzg4RShGVU5DX0FEUFRfRk1UIiBjaDoldVxuIiwgRlVOQ19BRFBUX0FSRyhwYWRhcHRlciksCi0JCQkJCXBzdXJ2ZXlQYXJhLT5jaFtpXS5od192YWx1ZSk7CiAJCQl9CiAJCX0KIAl9CkBAIC01MzcsNyArNDk1LDYgQEAKIAkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtNTQ5LDcgKzUwNiw2IEBACiAJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpIHsKQEAgLTU3MCw3ICs1MjYsNiBAQAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC01ODIsNyArNTM3LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtNjA0LDcgKzU1OCw2IEBACiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTYyNCw3ICs1NzcsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC02NDgsNyArNjAwLDYgQEAKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNjU5LDcgKzYxMCw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwpAQCAtNjgwLDcgKzYzMCw2IEBACiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTY5MSw3ICs2NDAsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsKQEAgLTcxNSw3ICs2NjMsNiBAQAogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC03MjUsNyArNjcyLDYgQEAKIAlzdHJ1Y3Qgd3JpdGVSRl9wYXJtICpwd3JpdGVyZnBhcm07CiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsKQEAgLTc0Niw3ICs2OTIsNiBAQAogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC03NTcsNyArNzAyLDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtNzg1LDMzICs3MjksMjggQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQogCiB2b2lkIHJ0d19nZXRiYnJmcmVnX2NtZHJzcF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKIHsKLSBfZnVuY19lbnRlcl87CiAKIAlrZnJlZShwY21kLT5wYXJtYnVmKTsKIAlrZnJlZShwY21kKTsKIAogCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2Lm1wX21vZGUgPT0gMSkKIAkJcGFkYXB0ZXItPm1wcHJpdi53b3JrcGFyYW0uYmNvbXBsZXRlZCA9IHRydWU7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfcmVhZHRzc2lfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgIHN0cnVjdCBjbWRfb2JqICpwY21kKQogewotIF9mdW5jX2VudGVyXzsKIAogCWtmcmVlKHBjbWQtPnBhcm1idWYpOwogCWtmcmVlKHBjbWQpOwogCiAJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZSA9PSAxKQogCQlwYWRhcHRlci0+bXBwcml2LndvcmtwYXJhbS5iY29tcGxldGVkID0gdHJ1ZTsKLV9mdW5jX2V4aXRfOwogfQogCiB1OCBydHdfY3JlYXRlYnNzX2NtZChzdHJ1Y3QgYWRhcHRlciAgKnBhZGFwdGVyKQpAQCAtODIyLDcgKzc2MSw2IEBACiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBkZXZfbmV0d29yayA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrOwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlydHdfbGVkX2NvbnRyb2wocGFkYXB0ZXIsIExFRF9DVExfU1RBUlRfVE9fTElOSyk7CiAKQEAgLTg0Nyw3ICs3ODUsNiBAQAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGNtZCk7CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC04NTgsNyArNzk1LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwY21kID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBjbWQgPT0gTlVMTCkgewpAQCAtODc3LDcgKzgxMyw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTg5OCwxNSArODMzLDEzIEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCi1fZnVuY19lbnRlcl87CiAKIAlydHdfbGVkX2NvbnRyb2wocGFkYXB0ZXIsIExFRF9DVExfU1RBUlRfVE9fTElOSyk7CiAKLQlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGggPT0gMCkgeworCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCA9PSAwKQogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoIitKb2luIGNtZDogQW55IFNTaWRcbiIpKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9ub3RpY2VfLCAoIitKb2luIGNtZDogU1NpZCA9WyVzXVxuIiwgcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWQpKTsKLQl9CiAKIAlwY21kID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBjbWQgPT0gTlVMTCkgewpAQCAtOTUyLDExICs4ODUsMTAgQEAKIAogCXBzZWN1cml0eXByaXYtPmF1dGhlbnRpY2F0b3JfaWVbMF0gPSAodW5zaWduZWQgY2hhcilwc2VjbmV0d29yay0+SUVMZW5ndGg7CiAKLQlpZiAoKHBzZWNuZXR3b3JrLT5JRUxlbmd0aC0xMikgPCAoMjU2LTEpKSB7CisJaWYgKChwc2VjbmV0d29yay0+SUVMZW5ndGgtMTIpIDwgKDI1Ni0xKSkKIAkJbWVtY3B5KCZwc2VjdXJpdHlwcml2LT5hdXRoZW50aWNhdG9yX2llWzFdLCAmcHNlY25ldHdvcmstPklFc1sxMl0sIHBzZWNuZXR3b3JrLT5JRUxlbmd0aC0xMik7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCW1lbWNweSgmcHNlY3VyaXR5cHJpdi0+YXV0aGVudGljYXRvcl9pZVsxXSwgJnBzZWNuZXR3b3JrLT5JRXNbMTJdLCAoMjU2LTEpKTsKLQl9CiAKIAlwc2VjbmV0d29yay0+SUVMZW5ndGggPSAwOwogCS8qICBBZGRlZCBieSBBbGJlcnQgMjAwOS8wMi8xOCAqLwpAQCAtOTg3LDkgKzkxOSwxMiBAQAogCiAJcGh0cHJpdi0+aHRfb3B0aW9uID0gZmFsc2U7CiAJaWYgKHByZWdpc3RyeXByaXYtPmh0X2VuYWJsZSkgewotCQkvKiAJQWRkZWQgYnkgQWxiZXJ0IDIwMTAvMDYvMjMgKi8KLQkJLyogCUZvciB0aGUgV0VQIG1vZGUsIHdlIHdpbGwgdXNlIHRoZSBiZyBtb2RlIHRvIGRvIHRoZSBjb25uZWN0aW9uIHRvIGF2b2lkIHNvbWUgSU9UIGlzc3VlLiAqLwotCQkvKiAJRXNwZWNpYWxseSBmb3IgUmVhbHRlayA4MTkydSBTb2Z0QVAuICovCisJCS8qCisJCSAqIEFkZGVkIGJ5IEFsYmVydCAyMDEwLzA2LzIzCisJCSAqIEZvciB0aGUgV0VQIG1vZGUsIHdlIHdpbGwgdXNlIHRoZSBiZyBtb2RlIHRvIGRvCisJCSAqIHRoZSBjb25uZWN0aW9uIHRvIGF2b2lkIHNvbWUgSU9UIGlzc3VlLgorCQkgKiBFc3BlY2lhbGx5IGZvciBSZWFsdGVrIDgxOTJ1IFNvZnRBUC4KKwkJICovCiAJCWlmICgocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtICE9IF9XRVA0MF8pICYmCiAJCSAgICAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtICE9IF9XRVAxMDRfKSAmJgogCQkgICAgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSAhPSBfVEtJUF8pKSB7CkBAIC0xMDIwLDcgKzk1NSw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEwMzIsNyArOTY2LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYgKmNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTggcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywgKCIrcnR3X2Rpc2Fzc29jX2NtZFxuIikpOwogCkBAIC0xMDYzLDcgKzk5Niw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTEwNzYsNyArMTAwOCw2IEBACiAJc3RydWN0CWNtZF9wcml2ICAgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTA5OCw3ICsxMDI5LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTExNSw3ICsxMDQ1LDYgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IChzdHJ1Y3Qgc3RhX2luZm8gKilwc3RhOwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTE0Miw3ICsxMDcxLDcgQEAKIAlwaDJjLT5yc3AgPSAodTggKilwc2V0c3Rha2V5X3JzcDsKIAlwaDJjLT5yc3BzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9yc3ApOwogCi0JbWVtY3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBzdGEtPmh3YWRkcik7CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCiAJCXBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtID0gKHVuc2lnbmVkIGNoYXIpIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG07CkBAIC0xMTYxLDcgKzEwOTAsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMTc1LDcgKzExMDMsNiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBzdGE7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmICghZW5xdWV1ZSkgewogCQljbGVhcl9jYW1fZW50cnkocGFkYXB0ZXIsIGVudHJ5KTsKQEAgLTEyMDUsNyArMTEzMiw3IEBACiAJCXBoMmMtPnJzcCA9ICh1OCAqKXBzZXRzdGFrZXlfcnNwOwogCQlwaDJjLT5yc3BzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9yc3ApOwogCi0JCW1lbWNweShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHN0YS0+aHdhZGRyLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHN0YS0+aHdhZGRyKTsKIAogCQlwc2V0c3Rha2V5X3BhcmEtPmFsZ29yaXRobSA9IF9OT19QUklWQUNZXzsKIApAQCAtMTIxNSw3ICsxMTQyLDYgQEAKIAl9CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMjI2LDcgKzExNTIsNiBAQAogCXN0cnVjdCBzZXRyYXRhYmxlX3Bhcm0gKnBzZXRydHRibHBhcm07CiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xMjQ3LDcgKzExNzIsNiBAQAogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xMjU3LDcgKzExODEsNiBAQAogCXN0cnVjdCBnZXRyYXRhYmxlX3Bhcm0gKnBnZXRydHRibHBhcm07CiAJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xMjcyLDggKzExOTUsNiBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0vKiAJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldHJ0dGJscGFybSwgR0VOX0NNRF9DT0RFKF9TZXRSYVRhYmxlKSk7ICovCi0KIAlfcnR3X2luaXRfbGlzdGhlYWQoJnBoMmMtPmxpc3QpOwogCXBoMmMtPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX0dldFJhVGFibGUpOwogCXBoMmMtPnBhcm1idWYgPSAodW5zaWduZWQgY2hhciAqKXBnZXRydHRibHBhcm07CkBAIC0xMjg1LDcgKzEyMDYsNiBAQAogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xMjk4LDcgKzEyMTgsNiBAQAogCiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xMzI0LDE2ICsxMjQzLDE1IEBACiAJcGgyYy0+cnNwID0gKHU4ICopcHNldGFzc29jc3RhX3JzcDsKIAlwaDJjLT5yc3BzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCk7CiAKLQltZW1jcHkocHNldGFzc29jc3RhX3BhcmEtPmFkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHBzZXRhc3NvY3N0YV9wYXJhLT5hZGRyLCBtYWNfYWRkcik7CiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7Ci0gfQorfQogCiB1OCBydHdfYWRkYmFyZXFfY21kKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggdGlkLCB1OCAqYWRkcikKIHsKQEAgLTEzNDIsNyArMTI2MCw2IEBACiAJc3RydWN0IGFkZEJhUmVxX3Bhcm0gKnBhZGRiYXJlcV9wYXJtOwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTM2OSw3ICsxMjg2LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTM4MSw3ICsxMjk3LDYgQEAKIAlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtMTQwNiw3ICsxMzIxLDYgQEAKIAkvKiBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOyAqLwogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTQxOCw3ICsxMzMyLDYgQEAKIAogCXU4IHJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKEZVTkNfTkRFVl9GTVQiIGNoOiV1LCBidzoldSwgY2hfb2Zmc2V0OiV1XG4iLAogCQlGVU5DX05ERVZfQVJHKHBhZGFwdGVyLT5wbmV0ZGV2KSwgY2gsIGJ3LCBjaF9vZmZzZXQpOwpAQCAtMTQ2MCw3ICsxMzczLDYgQEAKIAogCURCR184OEUoRlVOQ19OREVWX0ZNVCIgcmVzOiV1XG4iLCBGVU5DX05ERVZfQVJHKHBhZGFwdGVyLT5wbmV0ZGV2KSwgcmVzKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTQ3Myw3ICsxMzg1LDYgQEAKIAogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sICgiK3J0d19zZXRfY2hwbGFuX2NtZFxuIikpOwogCkBAIC0xNTE2LDcgKzE0MjcsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xNTI5LDcgKzE0MzksNiBAQAogCiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywgKCIrcnR3X2xlZF9ibGlua19jbWRcbiIpKTsKIApAQCAtMTU1Myw3ICsxNDYyLDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTU2Niw3ICsxNDc0LDYgQEAKIAogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sICgiK3J0d19zZXRfY3NhX2NtZFxuIikpOwogCkBAIC0xNTkwLDcgKzE0OTcsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xNjg1LDcgKzE1OTEsNiBAQAogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICYocGFkYXB0ZXItPm1sbWVwcml2KTsKIAl1OAltc3RhdHVzOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgPT0gdHJ1ZSkgfHwKIAkgICAgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSA9PSB0cnVlKSkKQEAgLTE3MjQsNyArMTYyOSw2IEBACiAJCWJyZWFrOwogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIHU4IHJ0d19scHNfY3RybF93a19jbWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBscHNfY3RybF90eXBlLCB1OCBlbnF1ZXVlKQpAQCAtMTczNSwxMSArMTYzOSw2IEBACiAJLyogc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OyAqLwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87Ci0KLQkvKiBpZiAoIXB3cmN0cmxwcml2LT5iTGVpc3VyZVBzKSAqLwotCS8qIAlyZXR1cm4gcmVzOyAqLwotCiAJaWYgKGVucXVldWUpIHsKIAkJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCQlpZiAocGgyYyA9PSBOVUxMKSB7CkBAIC0xNzY3LDcgKzE2NjYsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xNzg1LDcgKzE2ODMsNiBAQAogCiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsKQEAgLTE4MDYsNyArMTcwMyw2IEBACiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE4MjQsNyArMTcyMCw2IEBACiAJdTgJc3VwcG9ydF9hbnRfZGl2OwogCXU4CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAJcnR3X2hhbF9nZXRfZGVmX3ZhcihwYWRhcHRlciwgSEFMX0RFRl9JU19TVVBQT1JUX0FOVF9ESVYsICZzdXBwb3J0X2FudF9kaXYpOwogCWlmICghc3VwcG9ydF9hbnRfZGl2KQogCQlyZXR1cm4gcmVzOwpAQCAtMTg1NCw3ICsxNzQ5LDYgQEAKIAl9CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xODczLDcgKzE3NjcsNiBAQAogCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfTk9ORSkpCiAJCXJldHVybiByZXM7CkBAIC0xODkyLDggKzE3ODUsOCBAQAogCX0KIAogCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBQMlBfUFJPVE9fV0tfQ0lEOwotCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gaW50Q21kVHlwZTsJLyogCUFzIHRoZSBjb21tYW5kIHRwcGUuICovCi0JcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsJCS8qIAlNdXN0IGJlIE5VTEwgaGVyZSAqLworCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gaW50Q21kVHlwZTsgLyogQXMgdGhlIGNvbW1hbmQgdHBwZS4gKi8KKwlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwkgICAgLyogTXVzdCBiZSBOVUxMIGhlcmUgKi8KIAogCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7CiAKQEAgLTE5MDEsNyArMTc5NCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE5MTQsNyArMTgwNiw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAogCXU4CXJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwogCiAJcHBzY21kID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBwc2NtZCA9PSBOVUxMKSB7CkBAIC0xOTM3LDcgKzE4MjgsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0yMDg0LDEyICsxOTc0LDE2IEBACiAJZXZ0cHJpdi0+YzJoX3drX2FsaXZlID0gdHJ1ZTsKIAogCXdoaWxlICghcnR3X2NidWZfZW1wdHkoZXZ0cHJpdi0+YzJoX3F1ZXVlKSkgewotCQlpZiAoKGMyaF9ldnQgPSAoc3RydWN0IGMyaF9ldnRfaGRyICopcnR3X2NidWZfcG9wKGV2dHByaXYtPmMyaF9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJYzJoX2V2dCA9IChzdHJ1Y3QgYzJoX2V2dF9oZHIgKikKKwkJCXJ0d19jYnVmX3BvcChldnRwcml2LT5jMmhfcXVldWUpOworCQlpZiAoYzJoX2V2dCAhPSBOVUxMKQogCQkJLyogVGhpcyBDMkggZXZlbnQgaXMgcmVhZCwgY2xlYXIgaXQgKi8KIAkJCWMyaF9ldnRfY2xlYXIoYWRhcHRlcik7Ci0JCX0gZWxzZSBpZiAoKGMyaF9ldnQgPSAoc3RydWN0IGMyaF9ldnRfaGRyICopcnR3X21hbGxvYygxNikpICE9IE5VTEwpIHsKKwkJZWxzZSB7CisJCQljMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKXJ0d19tYWxsb2MoMTYpOwogCQkJLyogVGhpcyBDMkggZXZlbnQgaXMgbm90IHJlYWQsIHJlYWQgJiBjbGVhciBub3cgKi8KLQkJCWlmIChjMmhfZXZ0X3JlYWQoYWRhcHRlciwgKHU4ICopYzJoX2V2dCkgIT0gX1NVQ0NFU1MpCisJCQlpZiAoYzJoX2V2dCAhPSBOVUxMICYmCisJCQkgICAgYzJoX2V2dF9yZWFkKGFkYXB0ZXIsICh1OCAqKWMyaF9ldnQpICE9IF9TVUNDRVNTKQogCQkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTIxNDcsOCArMjA0MSwxMCBAQAogCQlwMnBfcHNfd2tfaGRsKHBhZGFwdGVyLCBwZHJ2ZXh0cmFfY21kLT50eXBlX3NpemUpOwogCQlicmVhazsKIAljYXNlIFAyUF9QUk9UT19XS19DSUQ6Ci0JCS8qIAlDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTEvMDcvMDEgKi8KLQkJLyogCUkgdXNlZCB0aGUgdHlwZV9zaXplIGFzIHRoZSB0eXBlIGNvbW1hbmQgKi8KKwkJLyoKKwkJICogQ29tbWVudGVkIGJ5IEFsYmVydCAyMDExLzA3LzAxCisJCSAqIEkgdXNlZCB0aGUgdHlwZV9zaXplIGFzIHRoZSB0eXBlIGNvbW1hbmQKKwkJICovCiAJCXAycF9wcm90b2NvbF93a19oZGwocGFkYXB0ZXIsIHBkcnZleHRyYV9jbWQtPnR5cGVfc2l6ZSk7CiAJCWJyZWFrOwogI2VuZGlmCkBAIC0yMTc0LDEzICsyMDcwLDEyIEBACiB7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBjbWQtPnJlcyA9PSBIMkNfRFJPUFBFRCkgewogCQkvKiBUT0RPOiBjYW5jZWwgdGltZXIgYW5kIGRvIHRpbWVvdXQgaGFuZGxlciBkaXJlY3RseS4uLiAqLwogCQkvKiBuZWVkIHRvIG1ha2UgdGltZW91dCBoYW5kbGVyT1MgaW5kZXBlbmRlbnQgKi8KIAkJX3NldF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCAxKTsKLQkJfSBlbHNlIGlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKKwl9IGVsc2UgaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewogCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIDEpOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sICgiXG4gKioqKioqKipFcnJvcjogTWdudEFjdHJ0d19zZXRfODAyXzExX2Jzc2lkX0xJU1RfU0NBTiBGYWlsICoqKioqKioqKioqKlxuXG4uIikpOwogCX0KQEAgLTIxODgsMTMgKzIwODMsMTEgQEAKIAkvKiAgZnJlZSBjbWQgKi8KIAlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwogCi1fZnVuY19leGl0XzsKIH0KIHZvaWQgcnR3X2Rpc2Fzc29jX2NtZF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKQogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKIAkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwpAQCAtMjIwMiwyNCArMjA5NSwxOCBAQAogCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sICgiXG4gKioqRXJyb3I6IGRpc2Nvbm5lY3RfY21kX2NhbGxiYWNrIEZhaWwgKioqXG4uIikpOwotCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCX0gZWxzZSAvKiBjbGVhciBicmlkZ2UgZGF0YWJhc2UgKi8KIAkJbmF0MjVfZGJfY2xlYW51cChwYWRhcHRlcik7CiAKIAkvKiAgZnJlZSBjbWQgKi8KIAlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwotCi1leGl0OgotCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfam9pbmJzc19jbWRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCAgc3RydWN0IGNtZF9vYmogKnBjbWQpCiB7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBjbWQtPnJlcyA9PSBIMkNfRFJPUFBFRCkgewogCQkvKiBUT0RPOiBjYW5jZWwgdGltZXIgYW5kIGRvIHRpbWVvdXQgaGFuZGxlciBkaXJlY3RseS4uLiAqLwpAQCAtMjIzMiw3ICsyMTE5LDYgQEAKIAogCXJ0d19mcmVlX2NtZF9vYmoocGNtZCk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19jcmVhdGVic3NfY21kX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGNtZF9vYmogKnBjbWQpCkBAIC0yMjQ0LDkgKzIxMzAsOCBAQAogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9IChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBjbWQtPnBhcm1idWY7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmspOwogCi1fZnVuY19lbnRlcl87CiAKLQlpZiAoKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykpIHsKKwlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbiAqKioqKioqKkVycm9yOiBydHdfY3JlYXRlYnNzX2NtZF9jYWxsYmFjayAgRmFpbCAqKioqKioqKioqKipcblxuLiIpKTsKIAkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CiAJfQpAQCAtMjI2MSw3ICsyMTQ2LDcgQEAKIAkJCXBzdGEgPSBydHdfYWxsb2Nfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAkJCWlmIChwc3RhID09IE5VTEwpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sICgiXG5DYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuIGNyZWF0ZWJzc19jbWRfY2FsbGJhY2tcbiIpKTsKLQkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbCA7CisJCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWw7CiAJCQl9CiAJCX0KIApAQCAtMjI5OCw3ICsyMTgzLDYgQEAKIAogCXJ0d19mcmVlX2NtZF9vYmoocGNtZCk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgIHN0cnVjdCBjbWRfb2JqICpwY21kKQpAQCAtMjMwNyw3ICsyMTkxLDYgQEAKIAlzdHJ1Y3Qgc2V0X3N0YWtleV9yc3AgKnBzZXRzdGFrZXlfcnNwID0gKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCAqKShwY21kLT5yc3ApOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcHNldHN0YWtleV9yc3AtPmFkZHIpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocHN0YSA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbkVSUk9SOiBydHdfc2V0c3RhS2V5X2NtZHJzcF9jYWxsYmFjayA9PiBjYW4ndCBnZXQgc3RhX2luZm9cblxuIikpOwpAQCAtMjMxNSw3ICsyMTk4LDYgQEAKIAl9CiBleGl0OgogCXJ0d19mcmVlX2NtZF9vYmoocGNtZCk7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgIHN0cnVjdCBjbWRfb2JqICpwY21kKQpAQCAtMjMyNiw3ICsyMjA4LDYgQEAKIAlzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCAqcGFzc29jc3RhX3JzcCA9IChzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCAqKShwY21kLT5yc3ApOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcGFzc29jc3RhX3Bhcm0tPmFkZHIpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocHN0YSA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbkVSUk9SOiBzZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhYyA9PiBjYW4ndCBnZXQgc3RhX2luZm9cblxuIikpOwpAQCAtMjM0Nyw1ICsyMjI4LDQgQEAKIGV4aXQ6CiAJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKIAotX2Z1bmNfZXhpdF87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMKaW5kZXggYWYzMjA0MS4uMmJlYjI2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZGVidWcuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlpbnQgbGVuID0gMDsKIAotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImN1cl9jaD0lZCwgY3VyX2J3PSVkLCBjdXJfY2hfb2ZmZXQ9JWRcbiIsCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiY3VyX2NoPSVkLCBjdXJfYnc9JWQsIGN1cl9jaF9vZmZzZXQ9JWRcbiIsCiAJCQkJCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9id21vZGUsIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0KTsKIAkqZW9mID0gMTsKIAlyZXR1cm4gbGVuOwpAQCAtNzgzLDcgKzc4Myw3IEBACiAJaWYgKGJ1ZmZlciAmJiAhY29weV9mcm9tX3VzZXIodG1wLCBidWZmZXIsIHNpemVvZih0bXApKSkgewogCQlpZiAocHJlZ3ByaXYpIHsKIAkJCXByZWdwcml2LT5yeF9zdGJjID0gbW9kZTsKLQkJCXByaW50aygicnhfc3RiYz0lZFxuIiwgbW9kZSk7CisJCQluZXRkZXZfaW5mbyhkZXYsICJyeF9zdGJjPSVkXG4iLCBtb2RlKTsKIAkJfQogCX0KIAlyZXR1cm4gY291bnQ7CkBAIC04MjAsNyArODIwLDcgQEAKIAogCQlpZiAoZW5hYmxlKSB7CiAJCQlEQkdfODhFKCJUdXJuIE9uIFJ4IFJTU0kgRGlzcGxheSBGdW5jdGlvblxuIik7Ci0JCQlwYWRhcHRlci0+YlJ4UlNTSURpc3BsYXkgPSBlbmFibGUgOworCQkJcGFkYXB0ZXItPmJSeFJTU0lEaXNwbGF5ID0gZW5hYmxlOwogCQl9IGVsc2UgewogCQkJREJHXzg4RSgiVHVybiBPZmYgUnggUlNTSSBEaXNwbGF5IEZ1bmN0aW9uXG4iKTsKIAkJCXBhZGFwdGVyLT5iUnhSU1NJRGlzcGxheSA9IDA7CkBAIC04NTEsMTIgKzg1MSwxMiBAQAogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9TVEE7IGkrKykgewogCQlwaGVhZCA9ICYocHN0YXByaXYtPnN0YV9oYXNoW2ldKTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbGlzdCk7CisJCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbGlzdCk7CiAKLQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic3RhJ3MgbWFjYWRkcjogJXBNXG4iLCBwc3RhLT5od2FkZHIpOwogCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicnRzZW49JWQsIGN0czJzbGVmPSVkXG4iLCBwc3RhLT5ydHNlbiwgcHN0YS0+Y3RzMnNlbGYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCmluZGV4IDYxNDllM2EuLjQwYWZlNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKQEAgLTc2LDExICs3NiwxMCBAQAogewogCWlmIChPZmZzZXQgPj0gRUZVU0VfTUFYX0hXX1NJWkUpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAoZmFrZUVmdXNlQmFuayA9PSAwKSB7CisJaWYgKGZha2VFZnVzZUJhbmsgPT0gMCkKIAkJZmFrZUVmdXNlQ29udGVudFtPZmZzZXRdID0gVmFsdWU7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWZha2VCVEVmdXNlQ29udGVudFtmYWtlRWZ1c2VCYW5rLTFdW09mZnNldF0gPSBWYWx1ZTsKLQl9CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTE1NiwxNyArMTU1LDE1IEBACiAJcmV0dXJuIHdvcmRfY250czsKIH0KIAotLyogICovCi0vKiAJRGVzY3JpcHRpb246ICovCi0vKiAJCUV4ZWN1dGUgRS1GdXNlIHJlYWQgYnl0ZSBvcGVyYXRpb24uICovCi0vKiAJCVJlZmVycmVkIGZyb20gU0QxIFJpY2hhcmQuICovCi0vKiAgKi8KLS8qIAlBc3N1bXB0aW9uOiAqLwotLyogCQkxLiBCb290IGZyb20gRS1GdXNlIGFuZCBzdWNjZXNzZnVsbHkgYXV0by1sb2FkLiAqLwotLyogCQkyLiBQQVNTSVZFX0xFVkVMIChVU0IgaW50ZXJmYWNlKSAqLwotLyogICovCi0vKiAJQ3JlYXRlZCBieSBSb2dlciwgMjAwOC4xMC4yMS4gKi8KLS8qICAqLworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRXhlY3V0ZSBFLUZ1c2UgcmVhZCBieXRlIG9wZXJhdGlvbi4KKyAqIFJlZmVycmVkIGZyb20gU0QxIFJpY2hhcmQuCisgKiBBc3N1bXB0aW9uOgorICoJCTEuIEJvb3QgZnJvbSBFLUZ1c2UgYW5kIHN1Y2Nlc3NmdWxseSBhdXRvLWxvYWQuCisgKgkJMi4gUEFTU0lWRV9MRVZFTCAoVVNCIGludGVyZmFjZSkKKyAqIENyZWF0ZWQgYnkgUm9nZXIsIDIwMDguMTAuMjEuCisgKi8KIHZvaWQKIFJlYWRFRnVzZUJ5dGUoCiAJCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLApAQCAtMjEwLDIzICsyMDcsMjEgQEAKIAkqcGJ1ZiA9ICh1OCkodmFsdWUzMiAmIDB4ZmYpOwogfQogCi0vKiAgKi8KLS8qIAlEZXNjcmlwdGlvbjogKi8KLS8qIAkJMS4gRXhlY3V0ZSBFLUZ1c2UgcmVhZCBieXRlIG9wZXJhdGlvbiBhY2NvcmRpbmcgYXMgbWFwIG9mZnNldCBhbmQgKi8KLS8qIAkJICAgIHNhdmUgdG8gRS1GdXNlIHRhYmxlLiAqLwotLyogCQkyLiBSZWZlcnJlZCBmcm9tIFNEMSBSaWNoYXJkLiAqLwotLyogICovCi0vKiAJQXNzdW1wdGlvbjogKi8KLS8qIAkJMS4gQm9vdCBmcm9tIEUtRnVzZSBhbmQgc3VjY2Vzc2Z1bGx5IGF1dG8tbG9hZC4gKi8KLS8qIAkJMi4gUEFTU0lWRV9MRVZFTCAoVVNCIGludGVyZmFjZSkgKi8KLS8qICAqLwotLyogCUNyZWF0ZWQgYnkgUm9nZXIsIDIwMDguMTAuMjEuICovCi0vKiAgKi8KLS8qIAkyMDA4LzEyLzEyIE1ICTEuIFJlb3JnYW5pemUgY29kZSBmbG93IGFuZCByZXNlcnZlIGJ5dGVzLiBhbmQgYWRkIGRlc2NyaXB0aW9uLiAqLwotLyogCQkJCQkyLiBBZGQgZWZ1c2UgdXRpbGl6YXRpb24gY29sbGVjdC4gKi8KLS8qIAkyMDA4LzEyLzIyIE1ICVJlYWQgRWZ1c2UgbXVzdCBjaGVjayBpZiB3ZSB3cml0ZSBzZWN0aW9uIDEgZGF0YSBhZ2FpbiEhISBTZWMxICovCi0vKiAJCQkJCXdyaXRlIGFkZHIgbXVzdCBiZSBhZnRlciBzZWM1LiAqLwotLyogICovCisvKiBEZXNjcmlwdGlvbjoKKyAqCTEuIEV4ZWN1dGUgRS1GdXNlIHJlYWQgYnl0ZSBvcGVyYXRpb24gYWNjb3JkaW5nIGFzIG1hcCBvZmZzZXQgYW5kCisgKglzYXZlIHRvIEUtRnVzZSB0YWJsZS4KKyAqCTIuIFJlZmVycmVkIGZyb20gU0QxIFJpY2hhcmQuCisgKiBBc3N1bXB0aW9uOgorICoJMS4gQm9vdCBmcm9tIEUtRnVzZSBhbmQgc3VjY2Vzc2Z1bGx5IGF1dG8tbG9hZC4KKyAqCTIuIFBBU1NJVkVfTEVWRUwgKFVTQiBpbnRlcmZhY2UpCisgKglDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA4LjEwLjIxLgorICogMjAwOC8xMi8xMiBNSAorICoJMS4gUmVvcmdhbml6ZSBjb2RlIGZsb3cgYW5kIHJlc2VydmUgYnl0ZXMuIGFuZCBhZGQgZGVzY3JpcHRpb24uCisgKgkyLiBBZGQgZWZ1c2UgdXRpbGl6YXRpb24gY29sbGVjdC4KKyAqIDIwMDgvMTIvMjIgTUgKKyAqCVJlYWQgRWZ1c2UgbXVzdCBjaGVjayBpZiB3ZSB3cml0ZSBzZWN0aW9uIDEgZGF0YSBhZ2FpbiEhIQorICoJU2VjMSB3cml0ZSBhZGRyIG11c3QgYmUgYWZ0ZXIgc2VjNS4KKyAqLwogCiBzdGF0aWMgdm9pZCBlZnVzZV9SZWFkRUZ1c2Uoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4IGVmdXNlVHlwZSwgdTE2IF9vZmZzZXQsIHUxNiBfc2l6ZV9ieXRlLCB1OCAqcGJ1ZiwgYm9vbCBwc2V1ZG8pCiB7CkBAIC00NTAsNyArNDQ1LDcgQEAKIHsKIAlpbnQgaSA9IDA7CiAJdTE2IHJlYWxfY29udGVudF9sZW4gPSAwLCBtYXhfYXZhaWxhYmxlX3NpemUgPSAwOwotCXU4IHJlcyA9IF9GQUlMIDsKKwl1OCByZXMgPSBfRkFJTDsKIAl1OCAoKnJ3OCkoc3RydWN0IGFkYXB0ZXIgKiwgdTE2LCB1OCopOwogCiAJRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHBhZGFwdGVyLCBFRlVTRV9XSUZJLCBUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU4sICh2b2lkICopJnJlYWxfY29udGVudF9sZW4sIGZhbHNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCmluZGV4IGU2Zjk4ZmIuLjA1NTIwMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYwpAQCAtMTQ3LDcgKzE0Nyw2IEBACiAJdWludCAqZnJsZW4gLyogZnJhbWUgbGVuZ3RoICovCiApCiB7Ci1fZnVuY19lbnRlcl87CiAJKnBidWYgPSAodTgpaW5kZXg7CiAKIAkqKHBidWYgKyAxKSA9ICh1OClsZW47CkBAIC0xNTcsNyArMTU2LDYgQEAKIAogCSpmcmxlbiA9ICpmcmxlbiArIChsZW4gKyAyKTsKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHBidWYgKyBsZW4gKyAyOwogfQogCkBAIC0yMjEsMTEgKzIxOSw4IEBACiB7CiAJaW50IHRtcCwgaTsKIAl1OCAqcDsKLV9mdW5jX2VudGVyXzsKLQlpZiAobGltaXQgPCAxKSB7Ci0JCV9mdW5jX2V4aXRfOworCWlmIChsaW1pdCA8IDEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXAgPSBwYnVmOwogCWkgPSAwOwpAQCAtMjQyLDcgKzIzNyw2IEBACiAJCWlmIChpID49IGxpbWl0KQogCQkJYnJlYWs7CiAJfQotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI3Myw3ICsyNjcsNyBAQAogCWNudCA9IDA7CiAKIAl3aGlsZSAoY250IDwgaW5fbGVuKSB7Ci0JCWlmIChlaWQgPT0gaW5faWVbY250XSAmJiAoIW91aSB8fCBfcnR3X21lbWNtcCgmaW5faWVbY250KzJdLCBvdWksIG91aV9sZW4pKSkgeworCQlpZiAoZWlkID09IGluX2llW2NudF0gJiYgKCFvdWkgfHwgIW1lbWNtcCgmaW5faWVbY250KzJdLCBvdWksIG91aV9sZW4pKSkgewogCQkJdGFyZ2V0X2llID0gJmluX2llW2NudF07CiAKIAkJCWlmIChpZSkKQEAgLTMzOSw3ICszMzMsNiBAQAogCiB2b2lkIHJ0d19zZXRfc3VwcG9ydGVkX3JhdGUodTggKlN1cHBvcnRlZFJhdGVzLCB1aW50IG1vZGUpCiB7Ci1fZnVuY19lbnRlcl87CiAKIAlfcnR3X21lbXNldChTdXBwb3J0ZWRSYXRlcywgMCwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKTsKIApAQCAtMzYxLDEzICszNTQsMTEgQEAKIAkJbWVtY3B5KFN1cHBvcnRlZFJhdGVzICsgSUVFRTgwMjExX0NDS19SQVRFX0xFTiwgV0lGSV9PRkRNUkFURVMsIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTik7CiAJCWJyZWFrOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiB1aW50CXJ0d19nZXRfcmF0ZXNldF9sZW4odTgJKnJhdGVzZXQpCiB7CiAJdWludCBpID0gMDsKLV9mdW5jX2VudGVyXzsKIAl3aGlsZSAoMSkgewogCQlpZiAoKHJhdGVzZXRbaV0pID09IDApCiAJCQlicmVhazsKQEAgLTM3NSw3ICszNjYsNiBAQAogCQkJYnJlYWs7CiAJCWkrKzsKIAl9Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gaTsKIH0KIApAQCAtMzg2LDcgKzM3Niw2IEBACiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBkZXZfbmV0d29yayA9ICZwcmVnaXN0cnlwcml2LT5kZXZfbmV0d29yazsKIAl1OCAqaWUgPSBwZGV2X25ldHdvcmstPklFczsKIAotX2Z1bmNfZW50ZXJfOwogCiAJLyogdGltZXN0YW1wIHdpbGwgYmUgaW5zZXJ0ZWQgYnkgaGFyZHdhcmUgKi8KIAlzeiArPSA4OwpAQCAtNDQ0LDcgKzQzMyw2IEBACiAKIAlpZiAocmF0ZUxlbiA+IDgpCiAJCWllID0gcnR3X3NldF9pZShpZSwgX0VYVF9TVVBQT1JURURSQVRFU19JRV8sIChyYXRlTGVuIC0gOCksIChwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzICsgOCksICZzeik7Ci1fZnVuY19leGl0XzsKIAogCXJldHVybiBzejsKIH0KQEAgLTQ2Myw3ICs0NTEsNyBAQAogCiAJCWlmIChwYnVmKSB7CiAJCQkvKiBjaGVjayBpZiBvdWkgbWF0Y2hlcy4uLiAqLwotCQkJaWYgKF9ydHdfbWVtY21wKChwYnVmICsgMiksIHdwYV9vdWlfdHlwZSwgc2l6ZW9mICh3cGFfb3VpX3R5cGUpKSA9PSBmYWxzZSkKKwkJCWlmICghbWVtY21wKChwYnVmICsgMiksIHdwYV9vdWlfdHlwZSwgc2l6ZW9mKHdwYV9vdWlfdHlwZSkpID09IGZhbHNlKQogCQkJCWdvdG8gY2hlY2tfbmV4dF9pZTsKIAogCQkJLyogY2hlY2sgdmVyc2lvbi4uLiAqLwpAQCAtNDk3LDE1ICs0ODUsMTUgQEAKIAogaW50IHJ0d19nZXRfd3BhX2NpcGhlcl9zdWl0ZSh1OCAqcykKIHsKLQlpZiAoX3J0d19tZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9OT05FLCBXUEFfU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfTk9ORSwgV1BBX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX05PTkU7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfV0VQNDAsIFdQQV9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9XRVA0MCwgV1BBX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX1dFUDQwOwotCWlmIChfcnR3X21lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1RLSVAsIFdQQV9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9US0lQLCBXUEFfU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfVEtJUDsKLQlpZiAoX3J0d19tZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9DQ01QLCBXUEFfU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUCwgV1BBX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX0NDTVA7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfV0VQMTA0LCBXUEFfU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfV0VQMTA0LCBXUEFfU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQMTA0OwogCiAJcmV0dXJuIDA7CkBAIC01MTMsMTUgKzUwMSwxNSBAQAogCiBpbnQgcnR3X2dldF93cGEyX2NpcGhlcl9zdWl0ZSh1OCAqcykKIHsKLQlpZiAoX3J0d19tZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9OT05FLCBSU05fU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfTk9ORSwgUlNOX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX05PTkU7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfV0VQNDAsIFJTTl9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9XRVA0MCwgUlNOX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX1dFUDQwOwotCWlmIChfcnR3X21lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1RLSVAsIFJTTl9TRUxFQ1RPUl9MRU4pID09IHRydWUpCisJaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9US0lQLCBSU05fU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfVEtJUDsKLQlpZiAoX3J0d19tZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9DQ01QLCBSU05fU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUCwgUlNOX1NFTEVDVE9SX0xFTikpCiAJCXJldHVybiBXUEFfQ0lQSEVSX0NDTVA7Ci0JaWYgKF9ydHdfbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfV0VQMTA0LCBSU05fU0VMRUNUT1JfTEVOKSA9PSB0cnVlKQorCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfV0VQMTA0LCBSU05fU0VMRUNUT1JfTEVOKSkKIAkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQMTA0OwogCiAJcmV0dXJuIDA7CkBAIC01NDIsNyArNTMwLDcgQEAKIAogCiAJaWYgKCgqd3BhX2llICE9IF9XUEFfSUVfSURfKSB8fCAoKih3cGFfaWUrMSkgIT0gKHU4KSh3cGFfaWVfbGVuIC0gMikpIHx8Ci0JICAgIChfcnR3X21lbWNtcCh3cGFfaWUrMiwgUlRXX1dQQV9PVUlfVFlQRSwgV1BBX1NFTEVDVE9SX0xFTikgIT0gdHJ1ZSkpCisJICAgIChtZW1jbXAod3BhX2llKzIsIFJUV19XUEFfT1VJX1RZUEUsIFdQQV9TRUxFQ1RPUl9MRU4pKSkKIAkJcmV0dXJuIF9GQUlMOwogCiAJcG9zID0gd3BhX2llOwpAQCAtNTg3LDcgKzU3NSw3IEBACiAJaWYgKGlzXzgwMjF4KSB7CiAJCWlmIChsZWZ0ID49IDYpIHsKIAkJCXBvcyArPSAyOwotCQkJaWYgKF9ydHdfbWVtY21wKHBvcywgU1VJVEVfMVgsIDQpID09IDEpIHsKKwkJCWlmICghbWVtY21wKHBvcywgU1VJVEVfMVgsIDQpKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgiJXMgOiB0aGVyZSBoYXMgODAyLjF4IGF1dGhcbiIsIF9fZnVuY19fKSk7CiAJCQkJKmlzXzgwMjF4ID0gMTsKIAkJCX0KQEAgLTY1Nyw3ICs2NDUsNyBAQAogCWlmIChpc184MDIxeCkgewogCQlpZiAobGVmdCA+PSA2KSB7CiAJCQlwb3MgKz0gMjsKLQkJCWlmIChfcnR3X21lbWNtcChwb3MsIFNVSVRFXzFYLCA0KSA9PSAxKSB7CisJCQlpZiAoIW1lbWNtcChwb3MsIFNVSVRFXzFYLCA0KSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoIiVzICgpOiB0aGVyZSBoYXMgODAyLjF4IGF1dGhcbiIsIF9fZnVuY19fKSk7CiAJCQkJKmlzXzgwMjF4ID0gMTsKIAkJCX0KQEAgLTY3Miw3ICs2NjAsNiBAQAogCXU4IHdwYV9vdWlbNF0gPSB7MHgwLCAweDUwLCAweGYyLCAweDAxfTsKIAl1aW50CWNudDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJLyogU2VhcmNoIHJlcXVpcmVkIFdQQSBvciBXUEEyIElFIGFuZCBjb3B5IHRvIHNlY19pZVtdICovCiAKQEAgLTY4Myw3ICs2NzAsNyBAQAogCXdoaWxlIChjbnQgPCBpbl9sZW4pIHsKIAkJYXV0aG1vZGUgPSBpbl9pZVtjbnRdOwogCi0JCWlmICgoYXV0aG1vZGUgPT0gX1dQQV9JRV9JRF8pICYmIChfcnR3X21lbWNtcCgmaW5faWVbY250KzJdLCAmd3BhX291aVswXSwgNCkpKSB7CisJCWlmICgoYXV0aG1vZGUgPT0gX1dQQV9JRV9JRF8pICYmICghbWVtY21wKCZpbl9pZVtjbnQrMl0sICZ3cGFfb3VpWzBdLCA0KSkpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKIAkJCQkJICgiXG4gcnR3X2dldF93cGFfaWU6IHNlY19pZHggPSVkIGluX2llW2NudCsxXSsyID0lZFxuIiwKIAkJCQkJIHNlY19pZHgsIGluX2llW2NudCsxXSsyKSk7CkBAIC03MjYsNyArNzEzLDYgQEAKIAkJfQogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gKnJzbl9sZW4gKyAqd3BhX2xlbjsKIH0KQEAgLTc0MSw3ICs3MjcsNyBAQAogCiAJZWlkID0gaWVfcHRyWzBdOwogCi0JaWYgKChlaWQgPT0gX1dQQV9JRV9JRF8pICYmIChfcnR3X21lbWNtcCgmaWVfcHRyWzJdLCB3cHNfb3VpLCA0KSkpIHsKKwlpZiAoKGVpZCA9PSBfV1BBX0lFX0lEXykgJiYgKCFtZW1jbXAoJmllX3B0clsyXSwgd3BzX291aSwgNCkpKSB7CiAJCSp3cHNfaWVsZW4gPSBpZV9wdHJbMV0rMjsKIAkJbWF0Y2ggPSB0cnVlOwogCX0KQEAgLTc3NCw3ICs3NjAsNyBAQAogCXdoaWxlIChjbnQgPCBpbl9sZW4pIHsKIAkJZWlkID0gaW5faWVbY250XTsKIAotCQlpZiAoKGVpZCA9PSBfV1BBX0lFX0lEXykgJiYgKF9ydHdfbWVtY21wKCZpbl9pZVtjbnQrMl0sIHdwc19vdWksIDQpKSkgeworCQlpZiAoKGVpZCA9PSBfV1BBX0lFX0lEXykgJiYgKCFtZW1jbXAoJmluX2llW2NudCsyXSwgd3BzX291aSwgNCkpKSB7CiAJCQl3cHNpZV9wdHIgPSAmaW5faWVbY250XTsKIAogCQkJaWYgKHdwc19pZSkKQEAgLTgxMyw3ICs3OTksNyBAQAogCQkqbGVuX2F0dHIgPSAwOwogCiAJaWYgKCh3cHNfaWVbMF0gIT0gX1ZFTkRPUl9TUEVDSUZJQ19JRV8pIHx8Ci0JICAgIChfcnR3X21lbWNtcCh3cHNfaWUgKyAyLCB3cHNfb3VpICwgNCkgIT0gdHJ1ZSkpCisJICAgIChtZW1jbXAod3BzX2llICsgMiwgd3BzX291aSAsIDQpKSkKIAkJcmV0dXJuIGF0dHJfcHRyOwogCiAJLyogIDYgPSAxKEVsZW1lbnQgSUQpICsgMShMZW5ndGgpICsgNChXUFMgT1VJKSAqLwpAQCAtMTIyMyw3ICsxMjA5LDcgQEAKIAkJCWR1bXBfc3RhY2soKTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JCWlmICgoZWlkID09IF9WRU5ET1JfU1BFQ0lGSUNfSUVfKSAmJiAoX3J0d19tZW1jbXAoJmluX2llW2NudCsyXSwgcDJwX291aSwgNCkgPT0gdHJ1ZSkpIHsKKwkJaWYgKChlaWQgPT0gX1ZFTkRPUl9TUEVDSUZJQ19JRV8pICYmICghbWVtY21wKCZpbl9pZVtjbnQrMl0sIHAycF9vdWksIDQpKSkgewogCQkJcDJwX2llX3B0ciA9IGluX2llICsgY250OwogCiAJCQlpZiAocDJwX2llICE9IE5VTEwpCkBAIC0xMjU4LDcgKzEyNDQsNyBAQAogCQkqbGVuX2F0dHIgPSAwOwogCiAJaWYgKCFwMnBfaWUgfHwgKHAycF9pZVswXSAhPSBfVkVORE9SX1NQRUNJRklDX0lFXykgfHwKLQkgICAgKF9ydHdfbWVtY21wKHAycF9pZSArIDIsIHAycF9vdWkgLCA0KSAhPSB0cnVlKSkKKwkgICAgKG1lbWNtcChwMnBfaWUgKyAyLCBwMnBfb3VpICwgNCkpKQogCQlyZXR1cm4gYXR0cl9wdHI7CiAKIAkvKiAgNiA9IDEoRWxlbWVudCBJRCkgKyAxKExlbmd0aCkgKyAzIChPVUkpICsgMShPVUkgVHlwZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW8uYwppbmRleCBmZjAzOThmLi43NTMwNTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pby5jCkBAIC01OSwxMCArNTksOCBAQAogCXN0cnVjdAlpbnRmX2hkbCAqcGludGZoZGwgPSAmKHBpb19wcml2LT5pbnRmKTsKIAl1OCAoKl9yZWFkOCkoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIpOwogCi0JX2Z1bmNfZW50ZXJfOwogCV9yZWFkOCA9IHBpbnRmaGRsLT5pb19vcHMuX3JlYWQ4OwogCXJfdmFsID0gX3JlYWQ4KHBpbnRmaGRsLCBhZGRyKTsKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gcl92YWw7CiB9CiAKQEAgLTcyLDExICs3MCw5IEBACiAJc3RydWN0IGlvX3ByaXYgKnBpb19wcml2ID0gJmFkYXB0ZXItPmlvcHJpdjsKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCXUxNiAoKl9yZWFkMTYpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyKTsKLV9mdW5jX2VudGVyXzsKIAlfcmVhZDE2ID0gcGludGZoZGwtPmlvX29wcy5fcmVhZDE2OwogCiAJcl92YWwgPSBfcmVhZDE2KHBpbnRmaGRsLCBhZGRyKTsKLV9mdW5jX2V4aXRfOwogCXJldHVybiByX3ZhbDsKIH0KIApAQCAtODYsMTEgKzgyLDkgQEAKIAlzdHJ1Y3QgaW9fcHJpdiAqcGlvX3ByaXYgPSAmYWRhcHRlci0+aW9wcml2OwogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJdTMyCSgqX3JlYWQzMikoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIpOwotX2Z1bmNfZW50ZXJfOwogCV9yZWFkMzIgPSBwaW50ZmhkbC0+aW9fb3BzLl9yZWFkMzI7CiAKIAlyX3ZhbCA9IF9yZWFkMzIocGludGZoZGwsIGFkZHIpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJfdmFsOwogfQogCkBAIC0xMDAsMTEgKzk0LDkgQEAKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCWludCAoKl93cml0ZTgpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1OCB2YWwpOwogCWludCByZXQ7Ci0JX2Z1bmNfZW50ZXJfOwogCV93cml0ZTggPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZTg7CiAKIAlyZXQgPSBfd3JpdGU4KHBpbnRmaGRsLCBhZGRyLCB2YWwpOwotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFJUV19TVEFUVVNfQ09ERShyZXQpOwogfQpAQCAtMTE1LDExICsxMDcsOSBAQAogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJaW50ICgqX3dyaXRlMTYpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MTYgdmFsKTsKIAlpbnQgcmV0OwotCV9mdW5jX2VudGVyXzsKIAlfd3JpdGUxNiA9IHBpbnRmaGRsLT5pb19vcHMuX3dyaXRlMTY7CiAKIAlyZXQgPSBfd3JpdGUxNihwaW50ZmhkbCwgYWRkciwgdmFsKTsKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiBSVFdfU1RBVFVTX0NPREUocmV0KTsKIH0KQEAgLTEyOSwxMSArMTE5LDkgQEAKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCWludCAoKl93cml0ZTMyKShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIHZhbCk7CiAJaW50IHJldDsKLQlfZnVuY19lbnRlcl87CiAJX3dyaXRlMzIgPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZTMyOwogCiAJcmV0ID0gX3dyaXRlMzIocGludGZoZGwsIGFkZHIsIHZhbCk7Ci0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gUlRXX1NUQVRVU19DT0RFKHJldCk7CiB9CkBAIC0xNDQsMTEgKzEzMiw5IEBACiAJc3RydWN0CWludGZfaGRsICpwaW50ZmhkbCA9IChzdHJ1Y3QgaW50Zl9oZGwgKikoJihwaW9fcHJpdi0+aW50ZikpOwogCWludCAoKl93cml0ZU4pKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgbGVuZ3RoLCB1OCAqcGRhdGEpOwogCWludCByZXQ7Ci0JX2Z1bmNfZW50ZXJfOwogCV93cml0ZU4gPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZU47CiAKIAlyZXQgPSBfd3JpdGVOKHBpbnRmaGRsLCBhZGRyLCBsZW5ndGgsIHBkYXRhKTsKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiBSVFdfU1RBVFVTX0NPREUocmV0KTsKIH0KQEAgLTE1OCwxMSArMTQ0LDkgQEAKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCWludCAoKl93cml0ZThfYXN5bmMpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1OCB2YWwpOwogCWludCByZXQ7Ci0JX2Z1bmNfZW50ZXJfOwogCV93cml0ZThfYXN5bmMgPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZThfYXN5bmM7CiAKIAlyZXQgPSBfd3JpdGU4X2FzeW5jKHBpbnRmaGRsLCBhZGRyLCB2YWwpOwotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFJUV19TVEFUVVNfQ09ERShyZXQpOwogfQpAQCAtMTc0LDEwICsxNTgsOCBAQAogCWludCAoKl93cml0ZTE2X2FzeW5jKShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTE2IHZhbCk7CiAJaW50IHJldDsKIAotX2Z1bmNfZW50ZXJfOwogCV93cml0ZTE2X2FzeW5jID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGUxNl9hc3luYzsKIAlyZXQgPSBfd3JpdGUxNl9hc3luYyhwaW50ZmhkbCwgYWRkciwgdmFsKTsKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFJUV19TVEFUVVNfQ09ERShyZXQpOwogfQpAQCAtMTg5LDEwICsxNzEsOCBAQAogCWludCAoKl93cml0ZTMyX2FzeW5jKShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIHZhbCk7CiAJaW50IHJldDsKIAotX2Z1bmNfZW50ZXJfOwogCV93cml0ZTMyX2FzeW5jID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGUzMl9hc3luYzsKIAlyZXQgPSBfd3JpdGUzMl9hc3luYyhwaW50ZmhkbCwgYWRkciwgdmFsKTsKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIFJUV19TVEFUVVNfQ09ERShyZXQpOwogfQpAQCAtMjAzLDcgKzE4Myw2IEBACiAJc3RydWN0IGlvX3ByaXYgKnBpb19wcml2ID0gJmFkYXB0ZXItPmlvcHJpdjsKIAlzdHJ1Y3QJaW50Zl9oZGwJCSpwaW50ZmhkbCA9ICYocGlvX3ByaXYtPmludGYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb19jXywgX2Rydl9pbmZvXywKIAkJCSAoInJ0d19yZWFkX21lbTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZCkiLApAQCAtMjEyLDcgKzE5MSw2IEBACiAJfQogCV9yZWFkX21lbSA9IHBpbnRmaGRsLT5pb19vcHMuX3JlYWRfbWVtOwogCV9yZWFkX21lbShwaW50ZmhkbCwgYWRkciwgY250LCBwbWVtKTsKLQlfZnVuY19leGl0XzsKIH0KIAogdm9pZCBfcnR3X3dyaXRlX21lbShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICpwbWVtKQpAQCAtMjIxLDEzICsxOTksMTEgQEAKIAlzdHJ1Y3QgaW9fcHJpdiAqcGlvX3ByaXYgPSAmYWRhcHRlci0+aW9wcml2OwogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlfd3JpdGVfbWVtID0gcGludGZoZGwtPmlvX29wcy5fd3JpdGVfbWVtOwogCiAJX3dyaXRlX21lbShwaW50ZmhkbCwgYWRkciwgY250LCBwbWVtKTsKIAotCV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIF9ydHdfcmVhZF9wb3J0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKnBtZW0pCkBAIC0yMzYsNyArMjEyLDYgQEAKIAlzdHJ1Y3QgaW9fcHJpdiAqcGlvX3ByaXYgPSAmYWRhcHRlci0+aW9wcml2OwogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9fY18sIF9kcnZfaW5mb18sCkBAIC0yNDksNyArMjI0LDYgQEAKIAogCV9yZWFkX3BvcnQocGludGZoZGwsIGFkZHIsIGNudCwgcG1lbSk7CiAKLQlfZnVuY19leGl0XzsKIH0KIAogdm9pZCBfcnR3X3JlYWRfcG9ydF9jYW5jZWwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0yNzEsMTMgKzI0NSwxMSBAQAogCXN0cnVjdAlpbnRmX2hkbAkJKnBpbnRmaGRsID0gJihwaW9fcHJpdi0+aW50Zik7CiAJdTMyIHJldCA9IF9TVUNDRVNTOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJX3dyaXRlX3BvcnQgPSBwaW50ZmhkbC0+aW9fb3BzLl93cml0ZV9wb3J0OwogCiAJcmV0ID0gX3dyaXRlX3BvcnQocGludGZoZGwsIGFkZHIsIGNudCwgcG1lbSk7CiAKLQkgX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKaW5kZXggZTI1YjM5Yi4uZjEzOThhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCkBAIC00Miw3ICs0Miw2IEBACiAJdTgJIGk7CiAJdTgJcmV0ID0gdHJ1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHNzaWQtPlNzaWRMZW5ndGggPiAzMikgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sICgic3NpZCBsZW5ndGggPjMyXG4iKSk7CkBAIC02MSw4ICs2MCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzQsMTEgKzcxLDEwIEBACiAJc3RydWN0IF9fcXVldWUgKnF1ZXVlCT0gJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUpOwogCXU4IHJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sICgiXG4gcnR3X2RvX2pvaW46IHBoZWFkID0gJXA7IHBsaXN0ID0gJXBcblxuXG4iLCBwaGVhZCwgcGxpc3QpKTsKIApAQCAtMTcwLDcgKzE2Niw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4MSw3ICsxNzYsNiBAQAogCXUzMiBjdXJfdGltZSA9IDA7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RV9MRVZFTChfZHJ2X2luZm9fLCAic2V0IGJzc2lkOiVwTVxuIiwgYnNzaWQpOwogCkBAIC0yMDUsNyArMTk5LDcgQEAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUR8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sICgic2V0X2Jzc2lkOiBfRldfTElOS0VEfHxXSUZJX0FESE9DX01BU1RFUl9TVEFURVxuIikpOwogCi0JCWlmIChfcnR3X21lbWNtcCgmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MsIGJzc2lkLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAoJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzLCBic3NpZCwgRVRIX0FMRU4pKSB7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gZmFsc2UpCiAJCQkJZ290byByZWxlYXNlX21sbWVfbG9jazsvKiBpdCBtZWFucyBkcml2ZXIgaXMgaW4gV0lGSV9BREhPQ19NQVNURVJfU1RBVEUsIHdlIG5lZWRuJ3QgY3JlYXRlIGJzcyBhZ2Fpbi4gKi8KIAkJfSBlbHNlIHsKQEAgLTI1Nyw3ICsyNTEsNiBAQAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKIAkJICgicnR3X3NldF84MDJfMTFfYnNzaWQ6IHN0YXR1cz0lZFxuIiwgc3RhdHVzKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI3MCw3ICsyNjMsNiBAQAogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKIAotX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RV9MRVZFTChfZHJ2X2luZm9fLCAic2V0IHNzaWQgWyVzXSBmd19zdGF0ZT0weCUwOHhcbiIsCiAJCSAgICAgIHNzaWQtPlNzaWQsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwpAQCAtMjg1LDE4ICsyNzcsMTcgQEAKIAlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAKIAlEQkdfODhFKCJTZXQgU1NJRCB1bmRlciBmd19zdGF0ZSA9IDB4JTA4eFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSA9PSB0cnVlKSB7CisJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSA9PSB0cnVlKQogCQlnb3RvIGhhbmRsZV90a2lwX2NvdW50ZXJtZWFzdXJlOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSA9PSB0cnVlKSB7CisJZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSA9PSB0cnVlKQogCQlnb3RvIHJlbGVhc2VfbWxtZV9sb2NrOwotCX0KIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRHxXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKIAkJCSAoInNldF9zc2lkOiBfRldfTElOS0VEfHxXSUZJX0FESE9DX01BU1RFUl9TVEFURVxuIikpOwogCiAJCWlmICgocG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGggPT0gc3NpZC0+U3NpZExlbmd0aCkgJiYKLQkJICAgIChfcnR3X21lbWNtcCgmcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWQsIHNzaWQtPlNzaWQsIHNzaWQtPlNzaWRMZW5ndGgpKSkgeworCQkgICAgKCFtZW1jbXAoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkLCBzc2lkLT5Tc2lkLCBzc2lkLT5Tc2lkTGVuZ3RoKSkpIHsKIAkJCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gZmFsc2UpKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLAogCQkJCQkgKCJTZXQgU1NJRCBpcyB0aGUgc2FtZSBzc2lkLCBmd19zdGF0ZSA9IDB4JTA4eFxuIiwKQEAgLTM1NywxMSArMzQ4LDEwIEBACiAJbWVtY3B5KCZwbWxtZXByaXYtPmFzc29jX3NzaWQsIHNzaWQsIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCkpOwogCXBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQgPSBmYWxzZTsKIAotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgPT0gdHJ1ZSkgeworCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgPT0gdHJ1ZSkKIAkJcG1sbWVwcml2LT50b19qb2luID0gdHJ1ZTsKLQl9IGVsc2UgeworCWVsc2UKIAkJc3RhdHVzID0gcnR3X2RvX2pvaW4ocGFkYXB0ZXIpOwotCX0KIAogcmVsZWFzZV9tbG1lX2xvY2s6CiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CkBAIC0zNjksNyArMzU5LDYgQEAKIGV4aXQ6CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLAogCQkgKCItcnR3X3NldF84MDJfMTFfc3NpZDogc3RhdHVzID0lZFxuIiwgc3RhdHVzKSk7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zODAsNyArMzY5LDYgQEAKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpjdXJfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwogCWVudW0gbmRpc184MDJfMTFfbmV0d29ya19pbmZyYSAqcG9sZF9zdGF0ZSA9ICYoY3VyX25ldHdvcmstPm5ldHdvcmsuSW5mcmFzdHJ1Y3R1cmVNb2RlKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9ub3RpY2VfLAogCQkgKCIrcnR3X3NldF84MDJfMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZTogb2xkID0lZCBuZXcgPSVkIGZ3X3N0YXRlID0gMHglMDh4XG4iLApAQCAtNDExLDcgKzM5OSw3IEBACiAKIAkJaWYgKCgqcG9sZF9zdGF0ZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpIHx8ICgqcG9sZF9zdGF0ZSA9PSBOZGlzODAyXzExSUJTUykpIHsKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSkKLQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdChwYWRhcHRlcik7IC8qIHdpbGwgY2xyIExpbmtlZF9zdGF0ZTsgYmVmb3JlIHRoaXMgZnVuY3Rpb24sIHdlIG11c3QgaGF2ZSBjaGtlZCB3aGV0aGVyICBpc3N1ZSBkaXMtYXNzb2NfY21kIG9yIG5vdCAqLworCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsgLyogd2lsbCBjbHIgTGlua2VkX3N0YXRlOyBiZWZvcmUgdGhpcyBmdW5jdGlvbiwgd2UgbXVzdCBoYXZlIGNoZWNrZWQgd2hldGhlciAgaXNzdWUgZGlzLWFzc29jX2NtZCBvciBub3QgKi8KIAkgICAgICAgfQogCiAJCSpwb2xkX3N0YXRlID0gbmV0d29ya3R5cGU7CkBAIC00MzgsNyArNDI2LDYgQEAKIAkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtNDQ4LDcgKzQzNSw2IEBACiB7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCkBAIC00NjQsNyArNDUwLDYgQEAKIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtNDc0LDcgKzQ1OSw2IEBACiAJc3RydWN0CW1sbWVfcHJpdgkJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJdTgJcmVzID0gdHJ1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLCAoIitydHdfc2V0XzgwMl8xMV9ic3NpZF9saXN0X3NjYW4oKSwgZndfc3RhdGUgPSV4XG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CiAKQEAgLTQ5NCwxMSArNDc4LDEyIEBACiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywgKCJydHdfc2V0XzgwMl8xMV9ic3NpZF9saXN0X3NjYW4gZmFpbCBzaW5jZSBmd19zdGF0ZSA9ICV4XG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CiAJCXJlcyA9IHRydWU7CiAKLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpID09IHRydWUpIHsKKwkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAorCQkJCShfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkgPT0gdHJ1ZSkKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywgKCJcbiMjI19GV19VTkRFUl9TVVJWRVl8X0ZXX1VOREVSX0xJTktJTkdcblxuIikpOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sICgiXG4jIyNwbWxtZXByaXYtPnNpdGVzdXJ2ZXljdHJsLnRyYWZmaWNfYnVzeSA9PSB0cnVlXG5cbiIpKTsKLQkJfQorCiAJfSBlbHNlIHsKIAkJaWYgKHJ0d19pc19zY2FuX2RlbnkocGFkYXB0ZXIpKSB7CiAJCQlEQkdfODhFKEZVTkNfQURQVF9GTVQiOiBzY2FuIGRlbnlcbiIsIEZVTkNfQURQVF9BUkcocGFkYXB0ZXIpKTsKQEAgLTUxNCw3ICs0OTksNiBAQAogCX0KIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTUyNSw3ICs1MDksNiBAQAogCWludCByZXM7CiAJdTggcmV0OwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLCAoInNldF84MDJfMTFfYXV0aC5tb2RlKCk6IG1vZGUgPSV4XG4iLCBhdXRobW9kZSkpOwogCkBAIC01NDUsNyArNTI4LDYgQEAKIAllbHNlCiAJCXJldCA9IGZhbHNlOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01NTYsNyArNTM4LDYgQEAKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICYocGFkYXB0ZXItPnNlY3VyaXR5cHJpdik7CiAJdTgJCXJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlrZXlpZCA9IHdlcC0+S2V5SW5kZXggJiAweDNmZmZmZmZmOwogCkBAIC01ODEsNyArNTYyLDcgQEAKIAkJYnJlYWs7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCSAoInJ0d19zZXRfODAyXzExX2FkZF93ZXA6YmVmb3IgbWVtY3B5LCB3ZXAtPktleUxlbmd0aCA9IDB4JXggd2VwLT5LZXlJbmRleCA9IDB4JXggIGtleWlkID0leFxuIiwKKwkJICgicnR3X3NldF84MDJfMTFfYWRkX3dlcDpiZWZvcmUgbWVtY3B5LCB3ZXAtPktleUxlbmd0aCA9IDB4JXggd2VwLT5LZXlJbmRleCA9IDB4JXggIGtleWlkID0leFxuIiwKIAkJIHdlcC0+S2V5TGVuZ3RoLCB3ZXAtPktleUluZGV4LCBrZXlpZCkpOwogCiAJbWVtY3B5KCYocHNlY3VyaXR5cHJpdi0+ZG90MTFEZWZLZXlba2V5aWRdLnNrZXlbMF0pLCAmKHdlcC0+S2V5TWF0ZXJpYWwpLCB3ZXAtPktleUxlbmd0aCk7CkBAIC02MTEsNyArNTkyLDYgQEAKIAlpZiAocmVzID09IF9GQUlMKQogCQlyZXQgPSBmYWxzZTsKIGV4aXQ6Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MTksNyArNTk5LDYgQEAKIHsKIAl1OCByZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCWlmIChrZXlpbmRleCA+PSAweDgwMDAwMDAwIHx8IHBhZGFwdGVyID09IE5VTEwpIHsKIAkJcmV0ID0gZmFsc2U7CiAJCWdvdG8gZXhpdDsKQEAgLTYzOCw3ICs2MTcsNiBAQAogCX0KIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY1MSw3ICs2MjksNiBAQAogCXU4CWJncm91cHRrZXkgPSBmYWxzZTsvKiBjYW4gYmUgcmVtb3ZlZCBsYXRlciAqLwogCXU4CXJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoKChrZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPT0gMCkgJiYgKChrZXktPktleUluZGV4ICYgMHg0MDAwMDAwMCkgPiAwKSkgewogCQkvKiAgSXQgaXMgaW52YWxpZCB0byBjbGVhciBiaXQgMzEgYW5kIHNldCBiaXQgMzAuIElmIHRoZSBtaW5pcG9ydCBkcml2ZXIgZW5jb3VudGVycyB0aGlzIGNvbWJpbmF0aW9uLCAqLwpAQCAtOTkyLDcgKzk2OSw2IEBACiAJfQogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTAwNCw3ICs5ODAsNiBAQAogCXU4CWtleUluZGV4ID0gKHU4KWtleS0+S2V5SW5kZXggJiAweDAzOwogCXU4CXJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoKGtleS0+S2V5SW5kZXggJiAweGJmZmZmZmZjKSA+IDApIHsKIAkJcmV0ID0gX0ZBSUw7CkBAIC0xMDMyLDcgKzEwMDcsNiBAQAogCX0KIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2xlZC5jCmluZGV4IGFmYWM1MzcuLjQyYjQxYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYwpAQCAtMzQsNyArMzQsNyBAQAogCWlmICgocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHx8IChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpKQogCQlyZXR1cm47CiAKLQlfc2V0X3dvcmtpdGVtKCYocExlZC0+QmxpbmtXb3JrSXRlbSkpOworCXNjaGVkdWxlX3dvcmsoJihwTGVkLT5CbGlua1dvcmtJdGVtKSk7CiB9CiAKIC8qICAqLwpAQCAtODAsNyArODAsNyBAQAogCiAJX2luaXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsIEJsaW5rVGltZXJDYWxsYmFjaywgcExlZCk7CiAKLQlfaW5pdF93b3JraXRlbSgmKHBMZWQtPkJsaW5rV29ya0l0ZW0pLCBCbGlua1dvcmtJdGVtQ2FsbGJhY2ssIHBMZWQpOworCUlOSVRfV09SSygmKHBMZWQtPkJsaW5rV29ya0l0ZW0pLCBCbGlua1dvcmtJdGVtQ2FsbGJhY2spOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMKaW5kZXggYzczODIzMC4uNzY5ZDRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMKQEAgLTMxLDExICszMSwxMiBAQAogI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+CiAjaW5jbHVkZSA8cnR3X2lvY3RsX3NldC5oPgogI2luY2x1ZGUgPHVzYl9vc2ludGYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKIGV4dGVybiB1bnNpZ25lZCBjaGFyCU1DU19yYXRlXzJSWzE2XTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyCU1DU19yYXRlXzFSWzE2XTsKIAotaW50CV9ydHdfaW5pdF9tbG1lX3ByaXYgKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK2ludCBfcnR3X2luaXRfbWxtZV9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlpbnQJaTsKIAl1OAkqcGJ1ZjsKQEAgLTQzLDkgKzQ0LDcgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2CQkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlpbnQJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKLQotCS8qICBXZSBkb24ndCBuZWVkIHRvIG1lbXNldCBwYWRhcHRlci0+WFhYIHRvIHplcm8sIGJlY2F1c2UgYWRhcHRlciBpcyBhbGxvY2F0ZWQgYnkgcnR3X3p2bWFsbG9jKCkuICovCisJLyogIFdlIGRvbid0IG5lZWQgdG8gbWVtc2V0IHBhZGFwdGVyLT5YWFggdG8gemVybywgYmVjYXVzZSBhZGFwdGVyIGlzIGFsbG9jYXRlZCBieSB2emFsbG9jKCkuICovCiAKIAlwbWxtZXByaXYtPm5pY19oZGwgPSAodTggKilwYWRhcHRlcjsKIApAQCAtNjIsNyArNjEsNyBAQAogCiAJX3J0d19tZW1zZXQoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSk7CiAKLQlwYnVmID0gcnR3X3p2bWFsbG9jKE1BWF9CU1NfQ05UICogKHNpemVvZihzdHJ1Y3Qgd2xhbl9uZXR3b3JrKSkpOworCXBidWYgPSB2emFsbG9jKE1BWF9CU1NfQ05UICogKHNpemVvZihzdHJ1Y3Qgd2xhbl9uZXR3b3JrKSkpOwogCiAJaWYgKHBidWYgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsKQEAgLTg3LDEzICs4NiwxMCBAQAogCXJ0d19pbml0X21sbWVfdGltZXIocGFkYXB0ZXIpOwogCiBleGl0OgotCi1fZnVuY19leGl0XzsKLQogCXJldHVybiByZXM7CiB9CiAKLSNpZiBkZWZpbmVkIChDT05GSUdfODhFVV9BUF9NT0RFKQorI2lmIGRlZmluZWQoQ09ORklHXzg4RVVfQVBfTU9ERSkKIHN0YXRpYyB2b2lkIHJ0d19mcmVlX21sbWVfaWVfZGF0YSh1OCAqKnBwaWUsIHUzMiAqcGxlbikKIHsKIAlrZnJlZSgqcHBpZSk7CkBAIC0xMjIsMjQgKzExOCwxOCBAQAogfQogI2VuZGlmCiAKLXZvaWQgX3J0d19mcmVlX21sbWVfcHJpdiAoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQordm9pZCBfcnR3X2ZyZWVfbWxtZV9wcml2KHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKIHsKLV9mdW5jX2VudGVyXzsKLQogCXJ0d19mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHBtbG1lcHJpdik7CiAKIAlpZiAocG1sbWVwcml2KSB7Ci0JCWlmIChwbWxtZXByaXYtPmZyZWVfYnNzX2J1ZikgewotCQkJcnR3X3ZtZnJlZShwbWxtZXByaXYtPmZyZWVfYnNzX2J1ZiwgTUFYX0JTU19DTlQgKiBzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yaykpOwotCQl9CisJCWlmIChwbWxtZXByaXYtPmZyZWVfYnNzX2J1ZikKKwkJCXZmcmVlKHBtbG1lcHJpdi0+ZnJlZV9ic3NfYnVmKTsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogaW50CV9ydHdfZW5xdWV1ZV9uZXR3b3JrKHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSwgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCiB7Ci1fZnVuY19lbnRlcl87Ci0KIAlpZiAocG5ldHdvcmsgPT0gTlVMTCkKIAkJZ290byBleGl0OwogCkBAIC0xNTAsOSArMTQwLDYgQEAKIAlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwogCiBleGl0OgotCi1fZnVuY19leGl0XzsKLQogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtMTYwLDIyICsxNDcsMTggQEAKIHsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yazsKIAotX2Z1bmNfZW50ZXJfOwotCiAJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAKIAlpZiAoX3J0d19xdWV1ZV9lbXB0eShxdWV1ZSkpIHsKIAkJcG5ldHdvcmsgPSBOVUxMOwogCX0gZWxzZSB7Ci0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IoZ2V0X25leHQoJnF1ZXVlLT5xdWV1ZSksIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZigoJnF1ZXVlLT5xdWV1ZSktPm5leHQsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmKHBuZXR3b3JrLT5saXN0KSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcG5ldHdvcms7CiB9CiAKQEAgLTE4NSwxNyArMTY4LDE1IEBACiAJc3RydWN0IF9fcXVldWUgKmZyZWVfcXVldWUgPSAmcG1sbWVwcml2LT5mcmVlX2Jzc19wb29sOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0ID0gTlVMTDsKIAotX2Z1bmNfZW50ZXJfOwotCiAJc3Bpbl9sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIAogCWlmIChfcnR3X3F1ZXVlX2VtcHR5KGZyZWVfcXVldWUpID09IHRydWUpIHsKIAkJcG5ldHdvcmsgPSBOVUxMOwogCQlnb3RvIGV4aXQ7CiAJfQotCXBsaXN0ID0gZ2V0X25leHQoJihmcmVlX3F1ZXVlLT5xdWV1ZSkpOworCXBsaXN0ID0gZnJlZV9xdWV1ZS0+cXVldWUubmV4dDsKIAotCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QgLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCAsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJcnR3X2xpc3RfZGVsZXRlKCZwbmV0d29yay0+bGlzdCk7CiAKQEAgLTIxMSw4ICsxOTIsNiBAQAogZXhpdDoKIAlzcGluX3VubG9ja19iaCgmZnJlZV9xdWV1ZS0+bG9jayk7CiAKLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHBuZXR3b3JrOwogfQogCkBAIC0yMjIsMTMgKzIwMSwxMSBAQAogCXUzMiBsaWZldGltZSA9IFNDQU5RVUVVRV9MSUZFVElNRTsKIAlzdHJ1Y3QgX19xdWV1ZSAqZnJlZV9xdWV1ZSA9ICYocG1sbWVwcml2LT5mcmVlX2Jzc19wb29sKTsKIAotX2Z1bmNfZW50ZXJfOwotCiAJaWYgKHBuZXR3b3JrID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCiAJaWYgKHBuZXR3b3JrLT5maXhlZCkKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJY3Vycl90aW1lID0gamlmZmllczsKIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHx8CiAJICAgIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpKQpAQCAtMjM2LDMzICsyMTMsMjYgQEAKIAlpZiAoIWlzZnJlZWFsbCkgewogCQlkZWx0YV90aW1lID0gKGN1cnJfdGltZSAtIHBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpL0haOwogCQlpZiAoZGVsdGFfdGltZSA8IGxpZmV0aW1lKS8qICB1bml0OnNlYyAqLwotCQkJZ290byBleGl0OworCQkJcmV0dXJuOwogCX0KIAlzcGluX2xvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCXJ0d19saXN0X2RlbGV0ZSgmKHBuZXR3b3JrLT5saXN0KSk7CiAJcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwbmV0d29yay0+bGlzdCksICYoZnJlZV9xdWV1ZS0+cXVldWUpKTsKIAlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07CiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwotCi1leGl0OgotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgX3J0d19mcmVlX25ldHdvcmtfbm9sb2NrKHN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiwgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCiB7CiAJc3RydWN0IF9fcXVldWUgKmZyZWVfcXVldWUgPSAmKHBtbG1lcHJpdi0+ZnJlZV9ic3NfcG9vbCk7CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAocG5ldHdvcmsgPT0gTlVMTCkKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJaWYgKHBuZXR3b3JrLT5maXhlZCkKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJcnR3X2xpc3RfZGVsZXRlKCYocG5ldHdvcmstPmxpc3QpKTsKIAlydHdfbGlzdF9pbnNlcnRfdGFpbCgmKHBuZXR3b3JrLT5saXN0KSwgZ2V0X2xpc3RfaGVhZChmcmVlX3F1ZXVlKSk7CiAJcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZC0tOwotZXhpdDoKLQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC0yNzYsMjQgKzI0NiwyMiBAQAogCXN0cnVjdAl3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKIAl1OCB6ZXJvX2FkZHJbRVRIX0FMRU5dID0gezAsIDAsIDAsIDAsIDAsIDB9OwogCi1fZnVuY19lbnRlcl87Ci0JaWYgKF9ydHdfbWVtY21wKHplcm9fYWRkciwgYWRkciwgRVRIX0FMRU4pKSB7CisJaWYgKCFtZW1jbXAoemVyb19hZGRyLCBhZGRyLCBFVEhfQUxFTikpIHsKIAkJcG5ldHdvcmsgPSBOVUxMOwogCQlnb3RvIGV4aXQ7CiAJfQogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FubmVkX3F1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKHBsaXN0ICE9IHBoZWFkKSB7Ci0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmsgLCBsaXN0KTsKLQkJaWYgKF9ydHdfbWVtY21wKGFkZHIsIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIEVUSF9BTEVOKSA9PSB0cnVlKQorCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yayAsIGxpc3QpOworCQlpZiAoIW1lbWNtcChhZGRyLCBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBFVEhfQUxFTikpCiAJCQlicmVhazsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCWlmIChwbGlzdCA9PSBwaGVhZCkKIAkJcG5ldHdvcmsgPSBOVUxMOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiBwbmV0d29yazsKIH0KIApAQCAtMzA1LDI5ICsyNzMsMjQgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBfX3F1ZXVlICpzY2FubmVkX3F1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKIAotX2Z1bmNfZW50ZXJfOwotCi0KIAlzcGluX2xvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5uZWRfcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSBmYWxzZSkgewotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCV9ydHdfZnJlZV9uZXR3b3JrKHBtbG1lcHJpdiwgcG5ldHdvcmssIGlzZnJlZWFsbCk7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsKLV9mdW5jX2V4aXRfOwogfQogCiBpbnQgcnR3X2lmX3VwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlpbnQgcmVzOwotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAogCSAgICAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSA9PSBmYWxzZSkpIHsKQEAgLTMzOCw4ICszMDEsNiBAQAogCX0gZWxzZSB7CiAJCXJlcyA9ICB0cnVlOwogCX0KLQotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMzQ3LDE0ICszMDgsMTIgQEAKIHsKIAl1MzIJY3VydGltZSA9IGppZmZpZXM7CiAKLV9mdW5jX2VudGVyXzsKIAlwaWJzc1swXSA9IDB4MDI7ICAvKiBpbiBhZC1ob2MgbW9kZSBiaXQxIG11c3Qgc2V0IHRvIDEgKi8KIAlwaWJzc1sxXSA9IDB4MTE7CiAJcGlic3NbMl0gPSAweDg3OwogCXBpYnNzWzNdID0gKHU4KShjdXJ0aW1lICYgMHhmZik7LyogcFswXTsgKi8KIAlwaWJzc1s0XSA9ICh1OCkoKGN1cnRpbWU+PjgpICYgMHhmZik7LyogcFsxXTsgKi8KIAlwaWJzc1s1XSA9ICh1OCkoKGN1cnRpbWU+PjE2KSAmIDB4ZmYpOy8qIHBbMl07ICovCi1fZnVuY19leGl0XzsKIAlyZXR1cm47CiB9CiAKQEAgLTM2NywxMSArMzI2LDkgQEAKIHUxNiBydHdfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzcykKIHsKIAlfX2xlMTYJdmFsOwotX2Z1bmNfZW50ZXJfOwogCiAJbWVtY3B5KCh1OCAqKSZ2YWwsIHJ0d19nZXRfY2FwYWJpbGl0eV9mcm9tX2llKGJzcy0+SUVzKSwgMik7CiAKLV9mdW5jX2V4aXRfOwogCXJldHVybiBsZTE2X3RvX2NwdSh2YWwpOwogfQogCkBAIC0zODUsNDYgKzM0MiwzNCBAQAogCXJldHVybiBpZSArIDg7CiB9CiAKLWludAlydHdfaW5pdF9tbG1lX3ByaXYgKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikvKiBzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYpICovCitpbnQgcnR3X2luaXRfbWxtZV9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlpbnQJcmVzOwotX2Z1bmNfZW50ZXJfOwogCXJlcyA9IF9ydHdfaW5pdF9tbG1lX3ByaXYocGFkYXB0ZXIpOy8qICAocG1sbWVwcml2KTsgKi8KLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKLXZvaWQgcnR3X2ZyZWVfbWxtZV9wcml2IChzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCit2b2lkIHJ0d19mcmVlX21sbWVfcHJpdihzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCiB7Ci1fZnVuY19lbnRlcl87CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJydHdfZnJlZV9tbG1lX3ByaXZcbiIpKTsKLQlfcnR3X2ZyZWVfbWxtZV9wcml2IChwbWxtZXByaXYpOwotX2Z1bmNfZXhpdF87CisJX3J0d19mcmVlX21sbWVfcHJpdihwbWxtZXByaXYpOwogfQogCiBzdGF0aWMgc3RydWN0IHdsYW5fbmV0d29yayAqcnR3X2FsbG9jX25ldHdvcmsoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQogewotCXN0cnVjdAl3bGFuX25ldHdvcmsJKnBuZXR3b3JrOwotX2Z1bmNfZW50ZXJfOwotCXBuZXR3b3JrID0gX3J0d19hbGxvY19uZXR3b3JrKHBtbG1lcHJpdik7Ci1fZnVuY19leGl0XzsKLQlyZXR1cm4gcG5ldHdvcms7CisJcmV0dXJuIF9ydHdfYWxsb2NfbmV0d29yayhwbWxtZXByaXYpOwogfQogCiBzdGF0aWMgdm9pZCBydHdfZnJlZV9uZXR3b3JrX25vbG9jayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsCiAJCQkJICAgIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQogewotX2Z1bmNfZW50ZXJfOwogCV9ydHdfZnJlZV9uZXR3b3JrX25vbG9jayhwbWxtZXByaXYsIHBuZXR3b3JrKTsKLV9mdW5jX2V4aXRfOwogfQogCiAKIHZvaWQgcnR3X2ZyZWVfbmV0d29ya19xdWV1ZShzdHJ1Y3QgYWRhcHRlciAqZGV2LCB1OCBpc2ZyZWVhbGwpCiB7Ci1fZnVuY19lbnRlcl87CiAJX3J0d19mcmVlX25ldHdvcmtfcXVldWUoZGV2LCBpc2ZyZWVhbGwpOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC00NTgsNyArNDAzLDcgQEAKIHN0YXRpYyBpbnQgaXNfc2FtZV9lc3Moc3RydWN0IHdsYW5fYnNzaWRfZXggKmEsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpiKQogewogCXJldHVybiAoYS0+U3NpZC5Tc2lkTGVuZ3RoID09IGItPlNzaWQuU3NpZExlbmd0aCkgJiYKLQkgICAgICAgX3J0d19tZW1jbXAoYS0+U3NpZC5Tc2lkLCBiLT5Tc2lkLlNzaWQsIGEtPlNzaWQuU3NpZExlbmd0aCk7CisJICAgICAgICFtZW1jbXAoYS0+U3NpZC5Tc2lkLCBiLT5Tc2lkLlNzaWQsIGEtPlNzaWQuU3NpZExlbmd0aCk7CiB9CiAKIGludCBpc19zYW1lX25ldHdvcmsoc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCkKQEAgLTQ2Niw3ICs0MTEsNiBAQAogCSB1MTYgc19jYXAsIGRfY2FwOwogCV9fbGUxNiBsZV9zY2FwLCBsZV9kY2FwOwogCi1fZnVuY19lbnRlcl87CiAJbWVtY3B5KCh1OCAqKSZsZV9zY2FwLCBydHdfZ2V0X2NhcGFiaWxpdHlfZnJvbV9pZShzcmMtPklFcyksIDIpOwogCW1lbWNweSgodTggKikmbGVfZGNhcCwgcnR3X2dldF9jYXBhYmlsaXR5X2Zyb21faWUoZHN0LT5JRXMpLCAyKTsKIApAQCAtNDc0LDExICs0MTgsOSBAQAogCXNfY2FwID0gbGUxNl90b19jcHUobGVfc2NhcCk7CiAJZF9jYXAgPSBsZTE2X3RvX2NwdShsZV9kY2FwKTsKIAotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gKChzcmMtPlNzaWQuU3NpZExlbmd0aCA9PSBkc3QtPlNzaWQuU3NpZExlbmd0aCkgJiYKLQkJKChfcnR3X21lbWNtcChzcmMtPk1hY0FkZHJlc3MsIGRzdC0+TWFjQWRkcmVzcywgRVRIX0FMRU4pKSA9PSB0cnVlKSAmJgotCQkoKF9ydHdfbWVtY21wKHNyYy0+U3NpZC5Tc2lkLCBkc3QtPlNzaWQuU3NpZCwgc3JjLT5Tc2lkLlNzaWRMZW5ndGgpKSA9PSB0cnVlKSAmJgorCQkoKCFtZW1jbXAoc3JjLT5NYWNBZGRyZXNzLCBkc3QtPk1hY0FkZHJlc3MsIEVUSF9BTEVOKSkgPT0gdHJ1ZSkgJiYKKwkJKCghbWVtY21wKHNyYy0+U3NpZC5Tc2lkLCBkc3QtPlNzaWQuU3NpZCwgc3JjLT5Tc2lkLlNzaWRMZW5ndGgpKSA9PSB0cnVlKSAmJgogCQkoKHNfY2FwICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09CiAJCShkX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgJiYKIAkJKChzX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpID09CkBAIC00OTEsMjUgKzQzMywyMyBAQAogCXN0cnVjdAl3bGFuX25ldHdvcmsJKnB3bGFuID0gTlVMTDsKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpvbGRlc3QgPSBOVUxMOwogCi1fZnVuY19lbnRlcl87CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5uZWRfcXVldWUpOwogCi0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwd2xhbiA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcHdsYW4gPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJCWlmICghcHdsYW4tPmZpeGVkKSB7CiAJCQlpZiAob2xkZXN0ID09IE5VTEwgfHwgdGltZV9hZnRlcihvbGRlc3QtPmxhc3Rfc2Nhbm5lZCwgcHdsYW4tPmxhc3Rfc2Nhbm5lZCkpCiAJCQkJb2xkZXN0ID0gcHdsYW47CiAJCX0KIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gb2xkZXN0OwogfQogCkBAIC01MjIsNyArNDYyLDYgQEAKIAl1OCBzcV9maW5hbDsKIAlsb25nIHJzc2lfZmluYWw7CiAKLV9mdW5jX2VudGVyXzsKIAlydHdfaGFsX2FudGRpdl9yc3NpX2NvbXBhcmVkKHBhZGFwdGVyLCBkc3QsIHNyYyk7IC8qIHRoaXMgd2lsbCB1cGRhdGUgc3JjLlJzc2ksIG5lZWQgY29uc2lkZXIgYWdhaW4gKi8KIAogCS8qIFRoZSBydWxlIGJlbG93IGlzIDEvNSBmb3Igc2FtcGxlIHZhbHVlLCA0LzUgZm9yIGhpc3RvcnkgdmFsdWUgKi8KQEAgLTU1MywyMiArNDkyLDE4IEBACiAJZHN0LT5QaHlJbmZvLlNpZ25hbFF1YWxpdHkgPSBzcV9maW5hbDsKIAlkc3QtPlJzc2kgPSByc3NpX2ZpbmFsOwogCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX2N1cnJlbnRfbmV0d29yayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrKQogewogCXN0cnVjdAltbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICYoYWRhcHRlci0+bWxtZXByaXYpOwogCi1fZnVuY19lbnRlcl87Ci0KIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSA9PSB0cnVlKSAmJgogCSAgICAoaXNfc2FtZV9uZXR3b3JrKCYocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrKSwgcG5ldHdvcmspKSkgewogCQl1cGRhdGVfbmV0d29yaygmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yayksIHBuZXR3b3JrLCBhZGFwdGVyLCB0cnVlKTsKIAkJcnR3X3VwZGF0ZV9wcm90ZWN0aW9uKGFkYXB0ZXIsIChwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuSUVzKSArIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpLAogCQkJCSAgICAgIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5JRUxlbmd0aCk7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC01ODMsMjQgKzUxOCwyMiBAQAogCXN0cnVjdCB3bGFuX25ldHdvcmsJKnBuZXR3b3JrID0gTlVMTDsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrCSpvbGRlc3QgPSBOVUxMOwogCi1fZnVuY19lbnRlcl87Ci0KIAlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsJPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrCT0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAogCQlpZiAoaXNfc2FtZV9uZXR3b3JrKCYocG5ldHdvcmstPm5ldHdvcmspLCB0YXJnZXQpKQogCQkJYnJlYWs7CiAJCWlmICgob2xkZXN0ID09ICgoc3RydWN0IHdsYW5fbmV0d29yayAqKTApKSB8fAogCQkgICAgdGltZV9hZnRlcihvbGRlc3QtPmxhc3Rfc2Nhbm5lZCwgcG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkpCiAJCQlvbGRlc3QgPSBwbmV0d29yazsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCS8qIElmIHdlIGRpZG4ndCBmaW5kIGEgbWF0Y2gsIHRoZW4gZ2V0IGEgbmV3IG5ldHdvcmsgc2xvdCB0byBpbml0aWFsaXplCiAJICogd2l0aCB0aGlzIGJlYWNvbidzIGluZm9ybWF0aW9uICovCkBAIC02NjMsMjcgKzU5NiwyNiBAQAogZXhpdDoKIAlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwogCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgcnR3X2FkZF9uZXR3b3JrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJICAgIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaykKIHsKLV9mdW5jX2VudGVyXzsKICNpZiBkZWZpbmVkKENPTkZJR184OEVVX1AyUCkKIAlydHdfd2xhbl9ic3NpZF9leF9yZW1vdmVfcDJwX2F0dHIocG5ldHdvcmssIFAyUF9BVFRSX0dST1VQX0lORk8pOwogI2VuZGlmCiAJdXBkYXRlX2N1cnJlbnRfbmV0d29yayhhZGFwdGVyLCBwbmV0d29yayk7CiAJcnR3X3VwZGF0ZV9zY2FubmVkX25ldHdvcmsoYWRhcHRlciwgcG5ldHdvcmspOwotX2Z1bmNfZXhpdF87CiB9CiAKLS8qIHNlbGVjdCB0aGUgZGVzaXJlZCBuZXR3b3JrIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSAoaSlic3MuICovCi0vKiAgY2hlY2sgaXRlbXM6CSgxKSBzZWN1cml0eSAqLwotLyogCQkJKDIpIG5ldHdvcmtfdHlwZSAqLwotLyogCQkJKDMpIFdNTSAqLwotLyoJCQkoNCkgSFQgKi8KLS8qCQkJKDUpIG90aGVycyAqLworLyoKKyAqIHNlbGVjdCB0aGUgZGVzaXJlZCBuZXR3b3JrIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSAoaSlic3MuCisgKiBjaGVjayBpdGVtczoJKDEpIHNlY3VyaXR5CisgKgkJCSgyKSBuZXR3b3JrX3R5cGUKKyAqCQkJKDMpIFdNTQorICoJCQkoNCkgSFQKKyAqCQkJKDUpIG90aGVycworICovCiBzdGF0aWMgaW50IHJ0d19pc19kZXNpcmVkX25ldHdvcmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQogewogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKQEAgLTcyOCw5ICs2NjAsNyBAQAogLyogVE9ETzogUGVycnk6IEZvciBQb3dlciBNYW5hZ2VtZW50ICovCiB2b2lkIHJ0d19hdGltZG9uZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciAsIHU4ICpwYnVmKQogewotX2Z1bmNfZW50ZXJfOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgicmVjZWl2ZSBhdGltZG9uZV9ldmV0XG4iKSk7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm47CiB9CiAKQEAgLTc0MSw4ICs2NzEsNiBAQAogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yazsKIAlzdHJ1Y3QJbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmKGFkYXB0ZXItPm1sbWVwcml2KTsKIAotX2Z1bmNfZW50ZXJfOwotCiAJcG5ldHdvcmsgPSAoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwYnVmOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgicnR3X3N1cnZleV9ldmVudF9jYWxsYmFjaywgc3NpZD0lc1xuIiwgIHBuZXR3b3JrLT5Tc2lkLlNzaWQpKTsKQEAgLTc1Niw3ICs2ODQsNyBAQAogCiAJLyogIHVwZGF0ZSBJQlNTX25ldHdvcmsgJ3MgdGltZXN0YW1wICovCiAJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSA9PSB0cnVlKSB7Ci0JCWlmIChfcnR3X21lbWNtcCgmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzKSwgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcCgmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzKSwgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKSkgewogCQkJc3RydWN0IHdsYW5fbmV0d29yayAqaWJzc193bGFuID0gTlVMTDsKIAogCQkJbWVtY3B5KHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5JRXMsIHBuZXR3b3JrLT5JRXMsIDgpOwpAQCAtNzgxLDIwICs3MDksMTQgQEAKIGV4aXQ6CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm47CiB9CiAKLQotCiB2b2lkIHJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyCSphZGFwdGVyLCB1OCAqcGJ1ZikKIHsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmKGFkYXB0ZXItPm1sbWVwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7CiAKLV9mdW5jX2VudGVyXzsKIAlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAKIAlpZiAocG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llKSB7CkBAIC04ODQsNyArODA2LDYgQEAKIAlwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQgPT0gMCkKIAkJcnR3X2hhbF9zcmVzZXRfcmVzZXQoYWRhcHRlcik7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfZHVtbXlfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgLCB1OCAqcGJ1ZikKQEAgLTkwMSwxNyArODIyLDE1IEBACiAJc3RydWN0IF9fcXVldWUgKnNjYW5fcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQsICpwdGVtcDsKIAotX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywgKCIrZnJlZV9zY2FucXVldWVcbiIpKTsKIAlzcGluX2xvY2tfYmgoJnNjYW5fcXVldWUtPmxvY2spOwogCXNwaW5fbG9ja19iaCgmZnJlZV9xdWV1ZS0+bG9jayk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbl9xdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlIChwbGlzdCAhPSBwaGVhZCkgewotCQlwdGVtcCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcHRlbXAgPSBwbGlzdC0+bmV4dDsKIAkJcnR3X2xpc3RfZGVsZXRlKHBsaXN0KTsKIAkJcnR3X2xpc3RfaW5zZXJ0X3RhaWwocGxpc3QsICZmcmVlX3F1ZXVlLT5xdWV1ZSk7CiAJCXBsaXN0ID0gcHRlbXA7CkBAIC05MjAsOCArODM5LDYgQEAKIAogCXNwaW5fdW5sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIAlzcGluX3VubG9ja19iaCgmc2Nhbl9xdWV1ZS0+bG9jayk7Ci0KLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtOTM0LDggKzg1MSw2IEBACiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7CiAKLV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sICgiK3J0d19mcmVlX2Fzc29jX3Jlc291cmNlc1xuIikpOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAogCQkgKCJ0Z3RfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzPSVwTSBzc2lkPSVzXG4iLApAQCAtOTc5LDcgKzg5NCw2IEBACiAJaWYgKGxvY2tfc2Nhbm5lZF9xdWV1ZSkKIAkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKIAlwbWxtZXByaXYtPmtleV9tYXNrID0gMDsKLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtOTg5LDggKzkwMyw2IEBACiB7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCIrcnR3X2luZGljYXRlX2Nvbm5lY3RcbiIpKTsKIAogCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwpAQCAtMTAwOCw3ICs5MjAsNiBAQAogCXJ0d19zZXRfc2Nhbl9kZW55KHBhZGFwdGVyLCAzMDAwKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiLXJ0d19pbmRpY2F0ZV9jb25uZWN0OiBmd19zdGF0ZT0weCUwOHhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKLV9mdW5jX2V4aXRfOwogfQogCiAvKgpAQCAtMTAxOCw3ICs5MjksNiBAQAogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIitydHdfaW5kaWNhdGVfZGlzY29ubmVjdFxuIikpOwogCiAJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HIHwgV0lGSV9VTkRFUl9XUFMpOwpAQCAtMTAzOCw4ICs5NDgsNiBAQAogCXAycF9wc193a19jbWQocGFkYXB0ZXIsIFAyUF9QU19ESVNBQkxFLCAxKTsKIAogCXJ0d19scHNfY3RybF93a19jbWQocGFkYXB0ZXIsIExQU19DVFJMX0RJU0NPTk5FQ1QsIDEpOwotCi1fZnVuY19leGl0XzsKIH0KIAogaW5saW5lIHZvaWQgcnR3X2luZGljYXRlX3NjYW5fZG9uZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIGJvb2wgYWJvcnRlZCkKQEAgLTExMDAsOSArMTAwOCwxMiBAQAogCQkJX3J0d19tZW1zZXQoKHU4ICopJnBzdGEtPmRvdDExdHhwbiwgMCwgc2l6ZW9mKHVuaW9uIHBuNDgpKTsKIAkJCV9ydHdfbWVtc2V0KCh1OCAqKSZwc3RhLT5kb3QxMXJ4cG4sIDAsIHNpemVvZih1bmlvbiBwbjQ4KSk7CiAJCX0KLQkJLyogCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMi8wNy8yMSAqLwotCQkvKiAJV2hlbiBkb2luZyB0aGUgV1BTLCB0aGUgd3BzX2llX2xlbiB3b24ndCBlcXVhbCB0byAwICovCi0JCS8qIAlBbmQgdGhlIFdpLUZpIGRyaXZlciBzaG91bGRuJ3QgYWxsb3cgdGhlIGRhdGEgcGFja2V0IHRvIGJlIHRyYW1zbWl0dGVkLiAqLworCQkvKgorCQkgKiBDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTIvMDcvMjEKKwkJICogV2hlbiBkb2luZyB0aGUgV1BTLCB0aGUgd3BzX2llX2xlbiB3b24ndCBlcXVhbCB0byAwCisJCSAqIEFuZCB0aGUgV2ktRmkgZHJpdmVyIHNob3VsZG4ndCBhbGxvdyB0aGUgZGF0YQorCQkgKiBwYWNrZXQgdG8gYmUgdHJhbXNtaXR0ZWQuCisJCSAqLwogCQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuICE9IDApIHsKIAkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gdHJ1ZTsKIAkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYud3BzX2llX2xlbiA9IDA7CkBAIC0xMjA2LDggKzExMTcsNiBAQAogCXN0cnVjdCB3bGFuX25ldHdvcmsJKnBjdXJfd2xhbiA9IE5VTEwsICpwdGFyZ2V0X3dsYW4gPSBOVUxMOwogCXVuc2lnbmVkIGludAkJdGhlX3NhbWVfbWFjYWRkciA9IGZhbHNlOwogCi1fZnVuY19lbnRlcl87Ci0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJqb2luYnNzIGV2ZW50IGNhbGwgYmFjayByZWNlaXZlZCB3aXRoIHJlcz0lZFxuIiwgcG5ldHdvcmstPmpvaW5fcmVzKSk7CiAKIAlydHdfZ2V0X2VuY3J5cHRfZGVjcnlwdF9mcm9tX3JlZ2lzdHJ5cHJpdihhZGFwdGVyKTsKQEAgLTEyMTgsMTIgKzExMjcsMTIgQEAKIAllbHNlCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiQEBAQEAgICBydHdfam9pbmJzc19ldmVudF9jYWxsYmFjayBmb3IgU1NpZDolc1xuIiwgcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWQpKTsKIAotCXRoZV9zYW1lX21hY2FkZHIgPSBfcnR3X21lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJdGhlX3NhbWVfbWFjYWRkciA9ICFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgRVRIX0FMRU4pOwogCiAJcG5ldHdvcmstPm5ldHdvcmsuTGVuZ3RoID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3ooJnBuZXR3b3JrLT5uZXR3b3JrKTsKIAlpZiAocG5ldHdvcmstPm5ldHdvcmsuTGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIlxuXG4gKioqam9pbmJzc19ldnRfY2FsbGJhY2sgcmV0dXJuIGEgd3JvbmcgYnNzICoqKlxuXG4iKSk7Ci0JCWdvdG8gaWdub3JlX25vbG9jazsKKwkJcmV0dXJuOwogCX0KIAogCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKQEAgLTEzMTksMjcgKzEyMjgsMjEgQEAKIAogaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s6CiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci1pZ25vcmVfbm9sb2NrOgotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpwYnVmKQogewogCXN0cnVjdCB3bGFuX25ldHdvcmsJKnBuZXR3b3JrCT0gKHN0cnVjdCB3bGFuX25ldHdvcmsgKilwYnVmOwogCi1fZnVuY19lbnRlcl87Ci0KIAltbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2soYWRhcHRlciwgcG5ldHdvcmstPmpvaW5fcmVzKTsKIAogCXJ0d19vc194bWl0X3NjaGVkdWxlKGFkYXB0ZXIpOwotCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHU4IHNlYXJjaF9tYXhfbWFjX2lkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAl1OCBtYWNfaWQ7Ci0jaWYgZGVmaW5lZCAoQ09ORklHXzg4RVVfQVBfTU9ERSkKKyNpZiBkZWZpbmVkKENPTkZJR184OEVVX0FQX01PREUpCiAJdTggYWlkOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICYocGFkYXB0ZXItPm1sbWVwcml2KTsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwpAQCAtMTM0Nyw3ICsxMjUwLDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmKHBhZGFwdGVyLT5tbG1lZXh0cHJpdik7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAotI2lmIGRlZmluZWQgKENPTkZJR184OEVVX0FQX01PREUpCisjaWYgZGVmaW5lZChDT05GSUdfODhFVV9BUF9NT0RFKQogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKIAkJZm9yIChhaWQgPSAocHN0YXByaXYtPm1heF9udW1fc3RhKTsgYWlkID4gMDsgYWlkLS0pIHsKIAkJCWlmIChwc3RhcHJpdi0+c3RhX2FpZFthaWQtMV0gIT0gTlVMTCkKQEAgLTEzODgsMTkgKzEyOTEsMTcgQEAKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrCSpjdXJfbmV0d29yayA9ICYocG1sbWVwcml2LT5jdXJfbmV0d29yayk7CiAJc3RydWN0IHdsYW5fbmV0d29yawkqcHRhcmdldF93bGFuID0gTlVMTDsKIAotX2Z1bmNfZW50ZXJfOwotCiAJaWYgKHJ0d19hY2Nlc3NfY3RybChhZGFwdGVyLCBwc3Rhc3NvYy0+bWFjYWRkcikgPT0gZmFsc2UpCiAJCXJldHVybjsKIAotI2lmIGRlZmluZWQgKENPTkZJR184OEVVX0FQX01PREUpCisjaWYgZGVmaW5lZChDT05GSUdfODhFVV9BUF9NT0RFKQogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKIAkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbygmYWRhcHRlci0+c3RhcHJpdiwgcHN0YXNzb2MtPm1hY2FkZHIpOwogCQlpZiAocHN0YSkgewogCQkJYXBfc3RhX2luZm9fZGVmZXJfdXBkYXRlKGFkYXB0ZXIsIHBzdGEpOwogCQkJcnR3X3N0YXNzb2NfaHdfcnB0KGFkYXB0ZXIsIHBzdGEpOwogCQl9Ci0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCX0KICNlbmRpZgogCS8qIGZvciBBRC1IT0MgbW9kZSAqLwpAQCAtMTQwOCwxMiArMTMwOSwxMiBAQAogCWlmIChwc3RhICE9IE5VTEwpIHsKIAkJLyogdGhlIHN0YSBoYXZlIGJlZW4gaW4gc3RhX2luZm9fcXVldWUgPT4gZG8gbm90aGluZyAqLwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIkVycm9yOiBydHdfc3Rhc3NvY19ldmVudF9jYWxsYmFjazogc3RhIGhhcyBiZWVuIGluIHN0YV9oYXNoX3F1ZXVlXG4iKSk7Ci0JCWdvdG8gZXhpdDsgLyogYmV0d2VlbiBkcnYgaGFzIHJlY2VpdmVkIHRoaXMgZXZlbnQgYmVmb3JlIGFuZCAgZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKSAqLworCQlyZXR1cm47IC8qIGJldHdlZW4gZHJ2IGhhcyByZWNlaXZlZCB0aGlzIGV2ZW50IGJlZm9yZSBhbmQgIGZ3IGhhdmUgbm90IHlldCB0byBzZXQga2V5IHRvIENBTV9FTlRSWSkgKi8KIAl9CiAJcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvKCZhZGFwdGVyLT5zdGFwcml2LCBwc3Rhc3NvYy0+bWFjYWRkcik7CiAJaWYgKHBzdGEgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIkNhbid0IGFsbG9jIHN0YV9pbmZvIHdoZW4gcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2tcbiIpKTsKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAJfQogCS8qIHRvIGRvOiBpbml0IHN0YV9pbmZvIHZhcmlhYmxlICovCiAJcHN0YS0+cW9zX29wdGlvbiA9IDA7CkBAIC0xNDQwLDggKzEzNDEsNiBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAltbG1lZXh0X3N0YV9hZGRfZXZlbnRfY2FsbGJhY2soYWRhcHRlciwgcHN0YSk7Ci1leGl0OgotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3N0YWRlbF9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpCkBAIC0xNDU2LDggKzEzNTUsNiBAQAogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICYocG1sbWVwcml2LT5jdXJfbmV0d29yayk7CiAKLV9mdW5jX2VudGVyXzsKLQogCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8oJmFkYXB0ZXItPnN0YXByaXYsIHBzdGFkZWwtPm1hY2FkZHIpOwogCWlmIChwc3RhKQogCQltYWNfaWQgPSBwc3RhLT5tYWNfaWQ7CkBAIC0xNTQxLDE0ICsxNDM4LDExIEBACiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfY3B3bV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKQogewotX2Z1bmNfZW50ZXJfOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgiK3J0d19jcHdtX2V2ZW50X2NhbGxiYWNrICEhIVxuIikpOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qCkBAIC0xNTYwLDggKzE0NTQsNiBAQAogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKIAlpbnQgZG9fam9pbl9yOwogCi1fZnVuY19lbnRlcl87Ci0KIAlEQkdfODhFKCIlcywgZndfc3RhdGU9JXhcbiIsIF9fZnVuY19fLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKIAogCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQpAQCAtMTU5Miw3ICsxNDg0LDYgQEAKIAkJZnJlZV9zY2FucXVldWUocG1sbWVwcml2KTsvKiAgKi8KIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTE2NTgsMTQgKzE1NDksMTIgQEAKIAkJLyogIGV4cGlyZSBOQVQyLjUgZW50cnkgKi8KIAkJbmF0MjVfZGJfZXhwaXJlKGFkYXB0ZXIpOwogCi0JCWlmIChhZGFwdGVyLT5wcHBvZV9jb25uZWN0aW9uX2luX3Byb2dyZXNzID4gMCkgeworCQlpZiAoYWRhcHRlci0+cHBwb2VfY29ubmVjdGlvbl9pbl9wcm9ncmVzcyA+IDApCiAJCQlhZGFwdGVyLT5wcHBvZV9jb25uZWN0aW9uX2luX3Byb2dyZXNzLS07Ci0JCX0KIAogCQkvKiAgZHVlIHRvIHJ0d19keW5hbWljX2NoZWNrX3RpbWVyX2hhbmRsZGVyKCkgaXMgY2FsbGVkIGV2ZXJ5IDIgc2Vjb25kcyAqLwotCQlpZiAoYWRhcHRlci0+cHBwb2VfY29ubmVjdGlvbl9pbl9wcm9ncmVzcyA+IDApIHsKKwkJaWYgKGFkYXB0ZXItPnBwcG9lX2Nvbm5lY3Rpb25faW5fcHJvZ3Jlc3MgPiAwKQogCQkJYWRhcHRlci0+cHBwb2VfY29ubmVjdGlvbl9pbl9wcm9ncmVzcy0tOwotCQl9CiAJfQogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNjg3LDE0ICsxNTc2LDE0IEBACiAKIAkvKiBjaGVjayBic3NpZCwgaWYgbmVlZGVkICovCiAJaWYgKHBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQpIHsKLQkJaWYgKCFfcnR3X21lbWNtcChjb21wZXRpdG9yLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBtbG1lcHJpdi0+YXNzb2NfYnNzaWQsIEVUSF9BTEVOKSkKKwkJaWYgKG1lbWNtcChjb21wZXRpdG9yLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBtbG1lcHJpdi0+YXNzb2NfYnNzaWQsIEVUSF9BTEVOKSkKIAkJCWdvdG8gZXhpdDsKIAl9CiAKIAkvKiBjaGVjayBzc2lkLCBpZiBuZWVkZWQgKi8KLQlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWQgJiYgcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGgpIHsKKwlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWRMZW5ndGgpIHsKIAkJaWYgKGNvbXBldGl0b3ItPm5ldHdvcmsuU3NpZC5Tc2lkTGVuZ3RoICE9IHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoIHx8Ci0JCSAgICBfcnR3X21lbWNtcChjb21wZXRpdG9yLT5uZXR3b3JrLlNzaWQuU3NpZCwgcG1sbWVwcml2LT5hc3NvY19zc2lkLlNzaWQsIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoKSA9PSBmYWxzZSkKKwkJICAgICFtZW1jbXAoY29tcGV0aXRvci0+bmV0d29yay5Tc2lkLlNzaWQsIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkLCBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCkgPT0gZmFsc2UpCiAJCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xNzQyLDIwICsxNjMxLDE4IEBACiAJc3RydWN0CXdsYW5fbmV0d29yawkqY2FuZGlkYXRlID0gTlVMTDsKIAl1OAlzdXBwX2FudF9kaXYgPSBmYWxzZTsKIAotX2Z1bmNfZW50ZXJfOwotCiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwogCWFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilwbWxtZXByaXYtPm5pY19oZGw7Ci0JcG1sbWVwcml2LT5wc2Nhbm5lZCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbWxtZXByaXYtPnBzY2FubmVkID0gcGhlYWQtPm5leHQ7CiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcG1sbWVwcml2LT5wc2Nhbm5lZCkpIHsKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbWxtZXByaXYtPnBzY2FubmVkLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocG1sbWVwcml2LT5wc2Nhbm5lZCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmIChwbmV0d29yayA9PSBOVUxMKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoIiVzIHJldHVybiBfRkFJTDoocG5ldHdvcms9PU5VTEwpXG4iLCBfX2Z1bmNfXykpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KLQkJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IGdldF9uZXh0KHBtbG1lcHJpdi0+cHNjYW5uZWQpOworCQlwbWxtZXByaXYtPnBzY2FubmVkID0gcG1sbWVwcml2LT5wc2Nhbm5lZC0+bmV4dDsKIAkJcnR3X2NoZWNrX2pvaW5fY2FuZGlkYXRlKHBtbG1lcHJpdiwgJmNhbmRpZGF0ZSwgcG5ldHdvcmspOwogCX0KIAlpZiAoY2FuZGlkYXRlID09IE5VTEwpIHsKQEAgLTE3OTIsOSArMTY3OSw2IEBACiAKIGV4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQotX2Z1bmNfZXhpdF87Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xODA1LDggKzE2ODksNiBAQAogCXN0cnVjdAljbWRfcHJpdiAqcGNtZHByaXYgPSAmKGFkYXB0ZXItPmNtZHByaXYpOwogCWludAkJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKLQogCXBjbWQgPSAoc3RydWN0CWNtZF9vYmogKilydHdfem1hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKIAlpZiAocGNtZCA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOyAgLyogdHJ5IGFnYWluICovCkBAIC0xODMyLDcgKzE3MTQsNiBAQAogCQkgcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSkpOwogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGNtZCk7CiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTg0NSw3ICsxNzI2LDYgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2CQkqcG1sbWVwcml2ID0gJihhZGFwdGVyLT5tbG1lcHJpdik7CiAJaW50CXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAJcGNtZCA9IChzdHJ1Y3QJY21kX29iaiAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QJY21kX29iaikpOwogCWlmIChwY21kID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7ICAvKiB0cnkgYWdhaW4gKi8KQEAgLTE5MTQsNyArMTc5NCw2IEBACiAJX3J0d19pbml0X2xpc3RoZWFkKCZwY21kLT5saXN0KTsKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBjbWQpOwogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE5NDYsMTcgKzE4MjUsMTUgQEAKIAlyZXR1cm4gaWVsZW5ndGg7CiB9CiAKLS8qICAqLwotLyogIFBvcnRlZCBmcm9tIDgxODU6IElzSW5QcmVBdXRoS2V5TGlzdCgpLiAoUmVuYW1lZCBmcm9tIFNlY0lzSW5QcmVBdXRoS2V5TGlzdCgpLCAyMDA2LTEwLTEzLikgKi8KLS8qICBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNS0wNy4gKi8KLS8qICAqLwotLyogIFNlYXJjaCBieSBCU1NJRCwgKi8KLS8qICBSZXR1cm4gVmFsdWU6ICovCi0vKiAJCS0xCQk6aWYgdGhlcmUgaXMgbm8gcHJlLWF1dGgga2V5IGluIHRoZSAgdGFibGUgKi8KLS8qIAkJPj0gMAkJOmlmIHRoZXJlIGlzIHByZS1hdXRoIGtleSwgYW5kICAgcmV0dXJuIHRoZSBlbnRyeSBpZCAqLwotLyogICovCi0vKiAgKi8KLQorLyoKKyAqIFBvcnRlZCBmcm9tIDgxODU6IElzSW5QcmVBdXRoS2V5TGlzdCgpLgorICogKFJlbmFtZWQgZnJvbSBTZWNJc0luUHJlQXV0aEtleUxpc3QoKSwgMjAwNi0xMC0xMy4pCisgKiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNS0wNy4KKyAqIFNlYXJjaCBieSBCU1NJRCwKKyAqIFJldHVybiBWYWx1ZToKKyAqCQktMQk6aWYgdGhlcmUgaXMgbm8gcHJlLWF1dGgga2V5IGluIHRoZSB0YWJsZQorICoJCT49IDAJOmlmIHRoZXJlIGlzIHByZS1hdXRoIGtleSwgYW5kIHJldHVybiB0aGUgZW50cnkgaWQKKyAqLwogc3RhdGljIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCAqYnNzaWQpCiB7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmQWRhcHRlci0+c2VjdXJpdHlwcml2OwpAQCAtMTk2NCw3ICsxODQxLDcgQEAKIAogCWRvIHsKIAkJaWYgKChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaV0uYlVzZWQpICYmCi0JCSAgICAoX3J0d19tZW1jbXAocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2ldLkJzc2lkLCBic3NpZCwgRVRIX0FMRU4pID09IHRydWUpKSB7CisJCSAgICAoIW1lbWNtcChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaV0uQnNzaWQsIGJzc2lkLCBFVEhfQUxFTikpKSB7CiAJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCWkrKzsKQEAgLTE5NzMsMTEgKzE4NTAsOSBAQAogCiAJfSB3aGlsZSAoaSA8IE5VTV9QTUtJRF9DQUNIRSk7CiAKLQlpZiAoaSA9PSBOVU1fUE1LSURfQ0FDSEUpIHsKKwlpZiAoaSA9PSBOVU1fUE1LSURfQ0FDSEUpCiAJCWkgPSAtMTsvKiAgQ291bGQgbm90IGZpbmQuICovCi0JfSBlbHNlIHsKLQkJLyogIFRoZXJlIGlzIG9uZSBQcmUtQXV0aGVudGljYXRpb24gS2V5IGZvciB0aGUgc3BlY2lmaWMgQlNTSUQuICovCi0JfQorCiAJcmV0dXJuIGk7CiB9CiAKQEAgLTIwMTgsOCArMTg5Myw2IEBACiAJdWludAluZGlzYXV0aG1vZGUgPSBwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGU7CiAJdWludCBuZGlzc2VjdXJpdHl0eXBlID0gcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXM7CiAKLV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCiAJCSAoIitydHdfcmVzdHJ1Y3Rfc2VjX2llOiBuZGlzYXV0aG1vZGU9JWQgbmRpc3NlY3VyaXR5dHlwZT0lZFxuIiwKIAkJICBuZGlzYXV0aG1vZGUsIG5kaXNzZWN1cml0eXR5cGUpKTsKQEAgLTIwNTIsOSArMTkyNSw2IEBACiAJCWlmIChhdXRobW9kZSA9PSBfV1BBMl9JRV9JRF8pCiAJCQlpZWxlbmd0aCA9IHJ0d19hcHBlbmRfcG1raWQoYWRhcHRlciwgaUVudHJ5LCBvdXRfaWUsIGllbGVuZ3RoKTsKIAl9Ci0KLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIGllbGVuZ3RoOwogfQogCkBAIC0yMDY1LDggKzE5MzUsNiBAQAogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAgICpwZGV2X25ldHdvcmsgPSAmcHJlZ2lzdHJ5cHJpdi0+ZGV2X25ldHdvcms7CiAJdTggKm15aHdhZGRyID0gbXlpZChwZWVwcml2KTsKIAotX2Z1bmNfZW50ZXJfOwotCiAJbWVtY3B5KHBkZXZfbmV0d29yay0+TWFjQWRkcmVzcywgbXlod2FkZHIsIEVUSF9BTEVOKTsKIAogCW1lbWNweSgmcGRldl9uZXR3b3JrLT5Tc2lkLCAmcHJlZ2lzdHJ5cHJpdi0+c3NpZCwgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSk7CkBAIC0yMDc3LDggKzE5NDUsNiBAQAogCXBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5GSENvbmZpZy5Ib3BQYXR0ZXJuID0gMDsKIAlwZGV2X25ldHdvcmstPkNvbmZpZ3VyYXRpb24uRkhDb25maWcuSG9wU2V0ID0gMDsKIAlwZGV2X25ldHdvcmstPkNvbmZpZ3VyYXRpb24uRkhDb25maWcuRHdlbGxUaW1lID0gMDsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3VwZGF0ZV9yZWdpc3RyeXByaXZfZGV2X25ldHdvcmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0yMDg5LDggKzE5NTUsNiBAQAogCXN0cnVjdAlzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpjdXJfbmV0d29yayA9ICZhZGFwdGVyLT5tbG1lcHJpdi5jdXJfbmV0d29yazsKIAotX2Z1bmNfZW50ZXJfOwotCiAJcGRldl9uZXR3b3JrLT5Qcml2YWN5ID0gKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPiAwID8gMSA6IDApOyAvKiAgYWRob2Mgbm8gODAyLjF4ICovCiAKIAlwZGV2X25ldHdvcmstPlJzc2kgPSAwOwpAQCAtMjE0MCwxMyArMjAwNCwxMCBAQAogCiAJLyogbm90ZXM6IHRyYW5zbGF0ZSBJRUxlbmd0aCAmIExlbmd0aCBhZnRlciBhc3NpZ24gdGhlIExlbmd0aCB0byBjbWRzeiBpbiBjcmVhdGVic3NfY21kKCk7ICovCiAJLyogcGRldl9uZXR3b3JrLT5JRUxlbmd0aCA9IGNwdV90b19sZTMyKHN6KTsgKi8KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19nZXRfZW5jcnlwdF9kZWNyeXB0X2Zyb21fcmVnaXN0cnlwcml2KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewotX2Z1bmNfZW50ZXJfOwotX2Z1bmNfZXhpdF87CiB9CiAKIC8qIHRoZSBmdW5jdGlvbiBpcyBhdCBwYXNzaXZlX2xldmVsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKaW5kZXggNmY3ZTQxNS4uM2VkNTk0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJezB4MDN9LAkvKiAweDQxLCBSVF9DSEFOTkVMX0RPTUFJTl9HTE9CQUxfRE9BTUlOXzJHICovCiB9OwogCi1zdGF0aWMgc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl9tYXAgUlRXX0NIQU5ORUxfUExBTl9NQVBfUkVBTFRFS19ERUZJTkUgPSB7MHgwM307IC8qIHVzZSB0aGUgY29uYmluYXRpb24gZm9yIG1heCBjaGFubmVsIG51bWJlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuX21hcCBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORSA9IHsweDAzfTsgLyogdXNlIHRoZSBjb21iaW5hdGlvbiBmb3IgbWF4IGNoYW5uZWwgbnVtYmVycyAqLwogCiAvKgogICogU2VhcmNoIHRoZSBAcGFyYW0gY2hhbm5lbF9udW0gaW4gZ2l2ZW4gQHBhcmFtIGNoYW5uZWxfc2V0CkBAIC00MTQsMjEgKzQxNCwyMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX21ndF9kaXNwYXRjaGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IG1sbWVfaGFuZGxlciAqcHRhYmxlLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0YXRpYyB2b2lkIF9tZ3RfZGlzcGF0Y2hlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBtbG1lX2hhbmRsZXIgKnB0YWJsZSwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAKIAkgIGlmIChwdGFibGUtPmZ1bmMpIHsKIAkgLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3Mgb3IgcmEoYTEpIGlzIGJjIGFkZHJlc3MuICovCi0JCWlmICghX3J0d19tZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikgJiYKLQkJICAgICFfcnR3X21lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBiY19hZGRyLCBFVEhfQUxFTikpCisJCWlmIChtZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikgJiYKKwkJICAgIG1lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBiY19hZGRyLCBFVEhfQUxFTikpCiAJCQlyZXR1cm47CiAJCXB0YWJsZS0+ZnVuYyhwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwogCX0KIH0KIAotdm9pZCBtZ3RfZGlzcGF0Y2hlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordm9pZCBtZ3RfZGlzcGF0Y2hlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlpbnQgaW5kZXg7CiAJc3RydWN0IG1sbWVfaGFuZGxlciAqcHRhYmxlOwpAQCAtNDM2LDcgKzQzNiw3IEBACiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKICNlbmRpZiAvKiBDT05GSUdfODhFVV9BUF9NT0RFICovCiAJdTggYmNfYWRkcltFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LCBHZXRBZGRyMlB0cihwZnJhbWUpKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLApAQCAtNDQ5LDggKzQ0OSw4IEBACiAJfQogCiAJLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3Mgb3IgcmEoYTEpIGlzIGJjIGFkZHJlc3MuICovCi0JaWYgKCFfcnR3X21lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSAmJgotCSAgICAhX3J0d19tZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgYmNfYWRkciwgRVRIX0FMRU4pKQorCWlmIChtZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikgJiYKKwkgICAgbWVtY21wKEdldEFkZHIxUHRyKHBmcmFtZSksIGJjX2FkZHIsIEVUSF9BTEVOKSkKIAkJcmV0dXJuOwogCiAJcHRhYmxlID0gbWxtZV9zdGFfdGJsOwpAQCAtNDY1LDEzICs0NjUsMTUgQEAKIAogCWlmIChwc3RhICE9IE5VTEwpIHsKIAkJaWYgKEdldFJldHJ5KHBmcmFtZSkpIHsKLQkJCWlmIChwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnNlcV9udW0gPT0gcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0pIHsKKwkJCWlmIChwcmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW0gPT0KKwkJCSAgICBwc3RhLT5SeE1nbXRGcmFtZVNlcU51bSkgewogCQkJCS8qIGRyb3AgdGhlIGR1cGxpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lICovCi0JCQkJREJHXzg4RSgiRHJvcCBkdXBsaWNhdGUgbWFuYWdlbWVudCBmcmFtZSB3aXRoIHNlcV9udW09JWQuXG4iLCBwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnNlcV9udW0pOworCQkJCURCR184OEUoIkRyb3AgZHVwbGljYXRlIG1hbmFnZW1lbnQgZnJhbWUgd2l0aCBzZXFfbnVtPSVkLlxuIiwKKwkJCQkJcHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KLQkJcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0gPSBwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnNlcV9udW07CisJCXBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtOwogCX0KIAogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKQEAgLTUzMiw3ICs1MzQsNyBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5zaWduZWQgaW50IE9uUHJvYmVSZXEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPblByb2JlUmVxKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXVuc2lnbmVkIGludAlpZWxlbjsKIAl1bnNpZ25lZCBjaGFyCSpwOwpAQCAtNTQwLDggKzU0Miw4IEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXIgPSAmKHBtbG1laW5mby0+bmV0d29yayk7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCXU4IGlzX3ZhbGlkX3AycF9wcm9iZXJlcSA9IGZhbHNlOwogCiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCkBAIC01OTYsNyArNTk4LDcgQEAKIAkJaWYgKGlzX3ZhbGlkX3AycF9wcm9iZXJlcSkKIAkJCWdvdG8gX2lzc3VlX3Byb2JlcnNwOwogCi0JCWlmICgoaWVsZW4gIT0gMCAmJiAhX3J0d19tZW1jbXAoKHZvaWQgKikocCsyKSwgKHZvaWQgKiljdXItPlNzaWQuU3NpZCwgY3VyLT5Tc2lkLlNzaWRMZW5ndGgpKSB8fAorCQlpZiAoKGllbGVuICE9IDAgJiYgbWVtY21wKCh2b2lkICopKHArMiksICh2b2lkICopY3VyLT5Tc2lkLlNzaWQsIGN1ci0+U3NpZC5Tc2lkTGVuZ3RoKSkgfHwKIAkJICAgIChpZWxlbiA9PSAwICYmIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSkpCiAJCQlyZXR1cm4gX1NVQ0NFU1M7CiAKQEAgLTYwOSwxOCArNjExLDE4IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25Qcm9iZVJzcChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uUHJvYmVSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvCSpwd2RpbmZvID0gJnBhZGFwdGVyLT53ZGluZm87Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCiAJaWYgKHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9UWF9QUk9WSVNJT05fRElTX1JFUSkpIHsKIAkJaWYgKHB3ZGluZm8tPnR4X3Byb3ZfZGlzY19pbmZvLmJlbmFibGUpIHsKLQkJCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT50eF9wcm92X2Rpc2NfaW5mby5wZWVySUZBZGRyLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTikpIHsKKwkJCWlmICghbWVtY21wKHB3ZGluZm8tPnR4X3Byb3ZfZGlzY19pbmZvLnBlZXJJRkFkZHIsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkgewogCQkJCWlmIChydHdfcDJwX2Noa19yb2xlKHB3ZGluZm8sIFAyUF9ST0xFX0NMSUVOVCkpIHsKIAkJCQkJcHdkaW5mby0+dHhfcHJvdl9kaXNjX2luZm8uYmVuYWJsZSA9IGZhbHNlOwogCQkJCQlpc3N1ZV9wMnBfcHJvdmlzaW9uX3JlcXVlc3QocGFkYXB0ZXIsCkBAIC02MzgsNyArNjQwLDcgQEAKIAl9IGVsc2UgaWYgKHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9HT05FR09fSU5HKSkgewogCQlpZiAocHdkaW5mby0+bmVnb19yZXFfaW5mby5iZW5hYmxlKSB7CiAJCQlEQkdfODhFKCJbJXNdIFAyUCBTdGF0ZSBpcyBHT05FR08gSU5HIVxuIiwgX19mdW5jX18pOwotCQkJaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPm5lZ29fcmVxX2luZm8ucGVlckRldkFkZHIsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkgeworCQkJaWYgKCFtZW1jbXAocHdkaW5mby0+bmVnb19yZXFfaW5mby5wZWVyRGV2QWRkciwgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pKSB7CiAJCQkJcHdkaW5mby0+bmVnb19yZXFfaW5mby5iZW5hYmxlID0gZmFsc2U7CiAJCQkJaXNzdWVfcDJwX0dPX3JlcXVlc3QocGFkYXB0ZXIsIHB3ZGluZm8tPm5lZ29fcmVxX2luZm8ucGVlckRldkFkZHIpOwogCQkJfQpAQCAtNjQ2LDcgKzY0OCw3IEBACiAJfSBlbHNlIGlmIChydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfVFhfSU5WSVRFX1JFUSkpIHsKIAkJaWYgKHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLmJlbmFibGUpIHsKIAkJCURCR184OEUoIlslc10gUDJQX1NUQVRFX1RYX0lOVklURV9SRVEhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+aW52aXRlcmVxX2luZm8ucGVlcl9tYWNhZGRyLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTikpIHsKKwkJCWlmICghbWVtY21wKHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLnBlZXJfbWFjYWRkciwgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pKSB7CiAJCQkJcHdkaW5mby0+aW52aXRlcmVxX2luZm8uYmVuYWJsZSA9IGZhbHNlOwogCQkJCWlzc3VlX3AycF9pbnZpdGF0aW9uX3JlcXVlc3QocGFkYXB0ZXIsIHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLnBlZXJfbWFjYWRkcik7CiAJCQl9CkBAIC02NjMsNyArNjY1LDcgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkJlYWNvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQmVhY29uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCWludCBjYW1faWR4OwogCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKQEAgLTY3MSw4ICs2NzMsOCBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzczsKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7CiAKQEAgLTY4MSw3ICs2ODMsNyBAQAogCQlyZXR1cm4gX1NVQ0NFU1M7CiAJfQogCi0JaWYgKF9ydHdfbWVtY21wKEdldEFkZHIzUHRyKHBmcmFtZSksIGdldF9teV9ic3NpZCgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pKSB7CisJaWYgKCFtZW1jbXAoR2V0QWRkcjNQdHIocGZyYW1lKSwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTikpIHsKIAkJaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfTlVMTCkgewogCQkJLyogd2Ugc2hvdWxkIHVwZGF0ZSBjdXJyZW50IG5ldHdvcmsgYmVmb3JlIGF1dGgsIG9yIHNvbWUgSUUgaXMgd3JvbmcgKi8KIAkJCXBic3MgPSAoc3RydWN0IHdsYW5fYnNzaWRfZXggKilydHdfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpOwpAQCAtNzUzLDcgKzc1NSw3IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25BdXRoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BdXRoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKIAl1bnNpZ25lZCBpbnQJYXV0aF9tb2RlLCBpZV9sZW47CkBAIC03NjcsOCArNzY5LDggQEAKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAKIAlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgIT0gV0lGSV9GV19BUF9TVEFURSkKIAkJcmV0dXJuIF9GQUlMOwpAQCAtODc4LDcgKzg4MCw3IEBACiAJCQkJZ290byBhdXRoX2ZhaWw7CiAJCQl9CiAKLQkJCWlmIChfcnR3X21lbWNtcCgodm9pZCAqKShwICsgMiksIHBzdGF0LT5jaGdfdHh0LCAxMjgpKSB7CisJCQlpZiAoIW1lbWNtcCgodm9pZCAqKShwICsgMiksIHBzdGF0LT5jaGdfdHh0LCAxMjgpKSB7CiAJCQkJcHN0YXQtPnN0YXRlICY9ICh+V0lGSV9GV19BVVRIX1NUQVRFKTsKIAkJCQlwc3RhdC0+c3RhdGUgfD0gV0lGSV9GV19BVVRIX1NVQ0NFU1M7CiAJCQkJLyogIGNoYWxsZW5naW5nIHR4dCBpcyBjb3JyZWN0Li4uICovCkBAIC05MjYsMjAgKzkyOCwyMCBAQAogCXJldHVybiBfRkFJTDsKIH0KIAotdW5zaWduZWQgaW50IE9uQXV0aENsaWVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQXV0aENsaWVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1bnNpZ25lZCBpbnQJc2VxLCBsZW4sIHN0YXR1cywgb2Zmc2V0OwogCXVuc2lnbmVkIGNoYXIJKnA7CiAJdW5zaWduZWQgaW50CWdvMmFzb2MgPSAwOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdWludCBwa3RfbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdWludCBwa3RfbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBjaGVjayBBMSBtYXRjaGVzIG9yIG5vdCAqLwotCWlmICghX3J0d19tZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIGdldF9kYShwZnJhbWUpLCBFVEhfQUxFTikpCisJaWYgKG1lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgZ2V0X2RhKHBmcmFtZSksIEVUSF9BTEVOKSkKIAkJcmV0dXJuIF9TVUNDRVNTOwogCiAJaWYgKCEocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9TVEFURSkpCkBAIC0xMDAxLDcgKzEwMDMsNyBAQAogCXJldHVybiBfRkFJTDsKIH0KIAotdW5zaWduZWQgaW50IE9uQXNzb2NSZXEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFzc29jUmVxKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKIAl1MTYgY2FwYWJfaW5mbzsKQEAgLTEwMjAsOCArMTAyMiw4IEBACiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXVpbnQgcGt0X2xlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXVpbnQgcGt0X2xlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbwkqcHdkaW5mbyA9ICYocGFkYXB0ZXItPndkaW5mbyk7CiAJdTggcDJwX3N0YXR1c19jb2RlID0gUDJQX1NUQVRVU19TVUNDRVNTOwpAQCAtMTA5Nyw3ICsxMDk5LDcgQEAKIAkJc3RhdHVzID0gX1NUQVRTX0ZBSUxVUkVfOwogCX0gZWxzZSB7CiAJCS8qICBjaGVjayBpZiBzc2lkIG1hdGNoICovCi0JCWlmICghX3J0d19tZW1jbXAoKHZvaWQgKikocCsyKSwgY3VyLT5Tc2lkLlNzaWQsIGN1ci0+U3NpZC5Tc2lkTGVuZ3RoKSkKKwkJaWYgKG1lbWNtcCgodm9pZCAqKShwKzIpLCBjdXItPlNzaWQuU3NpZCwgY3VyLT5Tc2lkLlNzaWRMZW5ndGgpKQogCQkJc3RhdHVzID0gX1NUQVRTX0ZBSUxVUkVfOwogCiAJCWlmIChpZV9sZW4gIT0gY3VyLT5Tc2lkLlNzaWRMZW5ndGgpCkBAIC0xMjcwLDcgKzEyNzIsNyBAQAogCQlmb3IgKDs7KSB7CiAJCQlwID0gcnR3X2dldF9pZShwLCBfVkVORE9SX1NQRUNJRklDX0lFXywgJmllX2xlbiwgcGt0X2xlbiAtIFdMQU5fSERSX0EzX0xFTiAtIGllX29mZnNldCk7CiAJCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJaWYgKF9ydHdfbWVtY21wKHArMiwgV01NX0lFLCA2KSkgeworCQkJCWlmICghbWVtY21wKHArMiwgV01NX0lFLCA2KSkgewogCQkJCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfV01FOwogCiAJCQkJCXBzdGF0LT5xb3Nfb3B0aW9uID0gMTsKQEAgLTE0NzAsNyArMTQ3Miw3IEBACiAJcmV0dXJuIF9GQUlMOwogfQogCi11bnNpZ25lZCBpbnQgT25Bc3NvY1JzcChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQXNzb2NSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdWludCBpOwogCWludCByZXM7CkBAIC0xNDgwLDEzICsxNDgyLDEzIEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCS8qIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICYocG1sbWVpbmZvLT5uZXR3b3JrKTsgKi8KLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdWludCBwa3RfbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJdWludCBwa3RfbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBjaGVjayBBMSBtYXRjaGVzIG9yIG5vdCAqLwotCWlmICghX3J0d19tZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIGdldF9kYShwZnJhbWUpLCBFVEhfQUxFTikpCisJaWYgKG1lbWNtcChteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgZ2V0X2RhKHBmcmFtZSksIEVUSF9BTEVOKSkKIAkJcmV0dXJuIF9TVUNDRVNTOwogCiAJaWYgKCEocG1sbWVpbmZvLT5zdGF0ZSAmIChXSUZJX0ZXX0FVVEhfU1VDQ0VTUyB8IFdJRklfRldfQVNTT0NfU1RBVEUpKSkKQEAgLTE1MjQsNyArMTUyNiw3IEBACiAKIAkJc3dpdGNoIChwSUUtPkVsZW1lbnRJRCkgewogCQljYXNlIF9WRU5ET1JfU1BFQ0lGSUNfSUVfOgotCQkJaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgV01NX1BBUkFfT1VJLCA2KSkJLyogV01NICovCisJCQlpZiAoIW1lbWNtcChwSUUtPmRhdGEsIFdNTV9QQVJBX09VSSwgNikpIC8qIFdNTSAqLwogCQkJCVdNTV9wYXJhbV9oYW5kbGVyKHBhZGFwdGVyLCBwSUUpOwogCQkJYnJlYWs7CiAJCWNhc2UgX0hUX0NBUEFCSUxJVFlfSUVfOgkvKiBIVCBjYXBzICovCkBAIC0xNTYwLDE5ICsxNTYyLDIwIEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25EZUF1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkRlQXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1bnNpZ25lZCBzaG9ydAlyZWFzb247CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvICpwd2RpbmZvID0gJihwYWRhcHRlci0+d2RpbmZvKTsKICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KIAogCS8qIGNoZWNrIEEzICovCi0JaWYgKCEoX3J0d19tZW1jbXAoR2V0QWRkcjNQdHIocGZyYW1lKSwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTikpKQorCWlmIChtZW1jbXAoR2V0QWRkcjNQdHIocGZyYW1lKSwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLAorCQkgICBFVEhfQUxFTikpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogI2lmZGVmIENPTkZJR184OEVVX1AyUApAQCAtMTYyMywxOSArMTYyNiwyMCBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uRGlzYXNzb2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkRpc2Fzc29jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXUxNiByZWFzb247CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKICNpZmRlZiBDT05GSUdfODhFVV9QMlAKIAlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvICpwd2RpbmZvID0gJihwYWRhcHRlci0+d2RpbmZvKTsKICNlbmRpZiAvKiBDT05GSUdfODhFVV9QMlAgKi8KIAogCS8qIGNoZWNrIEEzICovCi0JaWYgKCEoX3J0d19tZW1jbXAoR2V0QWRkcjNQdHIocGZyYW1lKSwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTikpKQorCWlmIChtZW1jbXAoR2V0QWRkcjNQdHIocGZyYW1lKSwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLAorCQkgICBFVEhfQUxFTikpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogI2lmZGVmIENPTkZJR184OEVVX1AyUApAQCAtMTY4NSwxOCArMTY4OSwxOCBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQXRpbShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQXRpbShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IG9uX2FjdGlvbl9zcGN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3NwY3Qoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdW5zaWduZWQgaW50IHJldCA9IF9GQUlMOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICpmcmFtZV9ib2R5ID0gKHU4ICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAl1OCBjYXRlZ29yeTsKIAl1OCBhY3Rpb247CkBAIC0xNzI5LDE3ICsxNzMzLDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdW5zaWduZWQgaW50IE9uQWN0aW9uX3FvcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQWN0aW9uX3FvcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFjdGlvbl9kbHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFjdGlvbl9kbHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25BY3Rpb25fYmFjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordW5zaWduZWQgaW50IE9uQWN0aW9uX2JhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdTggKmFkZHI7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKQEAgLTE3NDksMTAgKzE3NTMsMTEgQEAKIAl1bnNpZ25lZCBzaG9ydAl0aWQsIHN0YXR1cywgcmVhc29uX2NvZGUgPSAwOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAJLyogY2hlY2sgUkEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIV9ydHdfbWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBHZXRBZGRyMVB0cihwZnJhbWUpLCBFVEhfQUxFTikpLyogZm9yIGlmMSwgc3RhL2FwIG1vZGUgKi8KKwlpZiAobWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBHZXRBZGRyMVB0cihwZnJhbWUpLAorCQkgICBFVEhfQUxFTikpLyogZm9yIGlmMSwgc3RhL2FwIG1vZGUgKi8KIAkJcmV0dXJuIF9TVUNDRVNTOwogCiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKQEAgLTE5MzcsNyArMTk0Miw3IEBACiAJcDJwaWVbcDJwaWVsZW4rK10gPSAweDA5OwkvKglXRkEgUDJQIHYxLjAgKi8KIAogCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMTAzMDYgKi8KLQkvKglBY2NvcmRpbmcgdG8gdGhlIFAyUCBTcGVjaWZpY2F0aW9uLCB0aGUgZ3JvdXAgbmVnb2l0YXRpb24gcmVxdWVzdCBmcmFtZSBzaG91bGQgY29udGFpbiA5IFAyUCBhdHRyaWJ1dGVzICovCisJLyoJQWNjb3JkaW5nIHRvIHRoZSBQMlAgU3BlY2lmaWNhdGlvbiwgdGhlIGdyb3VwIG5lZ290aWF0aW9uIHJlcXVlc3QgZnJhbWUgc2hvdWxkIGNvbnRhaW4gOSBQMlAgYXR0cmlidXRlcyAqLwogCS8qCTEuIFAyUCBDYXBhYmlsaXR5ICovCiAJLyoJMi4gR3JvdXAgT3duZXIgSW50ZW50ICovCiAJLyoJMy4gQ29uZmlndXJhdGlvbiBUaW1lb3V0ICovCkBAIC0yMjgwLDcgKzIyODUsNyBAQAogCS8qCUNvbW1lbnRlZCBieSBLdXJ0IDIwMTIwMTEzICovCiAJLyoJSWYgc29tZSBkZXZpY2Ugd2FudHMgdG8gZG8gcDJwIGhhbmRzaGFrZSB3aXRob3V0IHNlbmRpbmcgcHJvdl9kaXNjX3JlcSAqLwogCS8qCVdlIGhhdmUgdG8gZ2V0IHBlZXJfcmVxX2NtIGZyb20gaGVyZS4gKi8KLQlpZiAoX3J0d19tZW1jbXAocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8uc3RyY29uZmlnX21ldGhvZF9kZXNjX29mX3Byb3ZfZGlzY19yZXEsICIwMDAiLCAzKSkgeworCWlmICghbWVtY21wKHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnN0cmNvbmZpZ19tZXRob2RfZGVzY19vZl9wcm92X2Rpc2NfcmVxLCAiMDAwIiwgMykpIHsKIAkJaWYgKHdwc19kZXZpY2VwYXNzd29yZF9pZCA9PSBXUFNfRFBJRF9VU0VSX1NQRUMpCiAJCQltZW1jcHkocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8uc3RyY29uZmlnX21ldGhvZF9kZXNjX29mX3Byb3ZfZGlzY19yZXEsICJkaXMiLCAzKTsKIAkJZWxzZSBpZiAod3BzX2RldmljZXBhc3N3b3JkX2lkID09IFdQU19EUElEX1JFR0lTVFJBUl9TUEVDKQpAQCAtMjMwMiw3ICsyMzA3LDcgQEAKIAlwMnBpZVtwMnBpZWxlbisrXSA9IDB4MDk7CS8qCVdGQSBQMlAgdjEuMCAqLwogCiAJLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDEwMDkwOCAqLwotCS8qCUFjY29yZGluZyB0byB0aGUgUDJQIFNwZWNpZmljYXRpb24sIHRoZSBncm91cCBuZWdvaXRhdGlvbiByZXNwb25zZSBmcmFtZSBzaG91bGQgY29udGFpbiA5IFAyUCBhdHRyaWJ1dGVzICovCisJLyoJQWNjb3JkaW5nIHRvIHRoZSBQMlAgU3BlY2lmaWNhdGlvbiwgdGhlIGdyb3VwIG5lZ290aWF0aW9uIHJlc3BvbnNlIGZyYW1lIHNob3VsZCBjb250YWluIDkgUDJQIGF0dHJpYnV0ZXMgKi8KIAkvKgkxLiBTdGF0dXMgKi8KIAkvKgkyLiBQMlAgQ2FwYWJpbGl0eSAqLwogCS8qCTMuIEdyb3VwIE93bmVyIEludGVudCAqLwpAQCAtMjYwNCw3ICsyNjA5LDcgQEAKIAlwMnBpZVtwMnBpZWxlbisrXSA9IDB4MDk7CS8qCVdGQSBQMlAgdjEuMCAqLwogCiAJLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDExMDMwNiAqLwotCS8qCUFjY29yZGluZyB0byB0aGUgUDJQIFNwZWNpZmljYXRpb24sIHRoZSBncm91cCBuZWdvaXRhdGlvbiByZXF1ZXN0IGZyYW1lIHNob3VsZCBjb250YWluIDUgUDJQIGF0dHJpYnV0ZXMgKi8KKwkvKglBY2NvcmRpbmcgdG8gdGhlIFAyUCBTcGVjaWZpY2F0aW9uLCB0aGUgZ3JvdXAgbmVnb3RpYXRpb24gcmVxdWVzdCBmcmFtZSBzaG91bGQgY29udGFpbiA1IFAyUCBhdHRyaWJ1dGVzICovCiAJLyoJMS4gU3RhdHVzICovCiAJLyoJMi4gUDJQIENhcGFiaWxpdHkgKi8KIAkvKgkzLiBPcGVyYXRpbmcgQ2hhbm5lbCAqLwpAQCAtMjgyNSw3ICsyODMwLDggQEAKIAkvKglDaGFubmVsIE51bWJlciAqLwogCXAycGllW3AycGllbGVuKytdID0gcHdkaW5mby0+aW52aXRlcmVxX2luZm8ub3BlcmF0aW5nX2NoOwkvKglvcGVyYXRpbmcgY2hhbm5lbCBudW1iZXIgKi8KIAotCWlmIChfcnR3X21lbWNtcChteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLmdvX2Jzc2lkLCBFVEhfQUxFTikpIHsKKwlpZiAoIW1lbWNtcChteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksCisJCSAgICBwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5nb19ic3NpZCwgRVRIX0FMRU4pKSB7CiAJCS8qCVAyUCBHcm91cCBCU1NJRCAqLwogCQkvKglUeXBlOiAqLwogCQlwMnBpZVtwMnBpZWxlbisrXSA9IFAyUF9BVFRSX0dST1VQX0JTU0lEOwpAQCAtMzI2MCw3ICszMjY2LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgUDJQX01BWF9QRVJTSVNURU5UX0dST1VQX05VTTsgaSsrLCBwcm9maWxlaW5mbysrKSB7CiAJICAgICAgIERCR184OEUoIlslc10gcHJvZmlsZWluZm9fbWFjPSUuMlggJS4yWCAlLjJYICUuMlggJS4yWCAlLjJYXG4iLCBfX2Z1bmNfXywKIAkJCSAgICBwcm9maWxlaW5mby0+cGVlcm1hY1swXSwgcHJvZmlsZWluZm8tPnBlZXJtYWNbMV0sIHByb2ZpbGVpbmZvLT5wZWVybWFjWzJdLCBwcm9maWxlaW5mby0+cGVlcm1hY1szXSwgcHJvZmlsZWluZm8tPnBlZXJtYWNbNF0sIHByb2ZpbGVpbmZvLT5wZWVybWFjWzVdKTsKLQkJaWYgKF9ydHdfbWVtY21wKHBlZXJtYWNhZGRyLCBwcm9maWxlaW5mby0+cGVlcm1hYywgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKHBlZXJtYWNhZGRyLCBwcm9maWxlaW5mby0+cGVlcm1hYywgRVRIX0FMRU4pKSB7CiAJCQltYXRjaF9yZXN1bHQgPSAxOwogCQkJREJHXzg4RSgiWyVzXSBNYXRjaCFcbiIsIF9fZnVuY19fKTsKIAkJCWJyZWFrOwpAQCAtMzg1MywxMyArMzg1OSwxMyBAQAogCiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCiAKLXN0YXRpYyBzMzIgcnR3X2FjdGlvbl9wdWJsaWNfZGVjYWNoZSh1bmlvbiByZWN2X2ZyYW1lICpyZWN2X2ZyYW1lLCBzMzIgdG9rZW4pCitzdGF0aWMgczMyIHJ0d19hY3Rpb25fcHVibGljX2RlY2FjaGUoc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZfZnJhbWUsIHMzMiB0b2tlbikKIHsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHJlY3ZfZnJhbWUtPnUuaGRyLmFkYXB0ZXI7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSByZWN2X2ZyYW1lLT5hZGFwdGVyOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICptbG1lZXh0ID0gJihhZGFwdGVyLT5tbG1lZXh0cHJpdik7Ci0JdTggKmZyYW1lID0gcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1MTYgc2VxX2N0cmwgPSAoKHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5zZXFfbnVtJjB4ZmZmZikgPDwgNCkgfAotCQkocmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLmZyYWdfbnVtICYgMHhmKTsKKwl1OCAqZnJhbWUgPSByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXUxNiBzZXFfY3RybCA9ICgocmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW0mMHhmZmZmKSA8PCA0KSB8CisJCShyZWN2X2ZyYW1lLT5hdHRyaWIuZnJhZ19udW0gJiAweGYpOwogCiAJaWYgKEdldFJldHJ5KGZyYW1lKSkgewogCQlpZiAodG9rZW4gPj0gMCkgewpAQCAtMzg4NSwxNCArMzg5MSwxNCBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljX3AycCh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpY19wMnAoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJdTggKmZyYW1lX2JvZHk7CiAJdTggZGlhbG9nVG9rZW4gPSAwOwogI2lmZGVmIENPTkZJR184OEVVX1AyUAotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZWN2X2ZyYW1lLT51Lmhkci5hZGFwdGVyOwotCXVpbnQgbGVuID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbjsKKwlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdl9mcmFtZS0+YWRhcHRlcjsKKwl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAJdTggKnAycF9pZTsKIAl1MzIJcDJwX2llbGVuOwogCXN0cnVjdAl3aWZpZGlyZWN0X2luZm8JKnB3ZGluZm8gPSAmKHBhZGFwdGVyLT53ZGluZm8pOwpAQCAtMzkzOSw3ICszOTQ1LDggQEAKIAogCQkvKglDb21tZW50ZWQgYnkgS3VydCAyMDEyMDExMyAqLwogCQkvKglHZXQgcGVlcl9kZXZfYWRkciBoZXJlIGlmIHBlZXIgZG9lc24ndCBpc3N1ZSBwcm92X2Rpc2MgZnJhbWUuICovCi0JCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5wZWVyRGV2QWRkciwgZW1wdHlfYWRkciwgRVRIX0FMRU4pKQorCQlpZiAoIW1lbWNtcChwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5wZWVyRGV2QWRkciwgZW1wdHlfYWRkciwKKwkJCSAgICBFVEhfQUxFTikpCiAJCQltZW1jcHkocHdkaW5mby0+cnhfcHJvdl9kaXNjX2luZm8ucGVlckRldkFkZHIsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKTsKIAogCQlyZXN1bHQgPSBwcm9jZXNzX3AycF9ncm91cF9uZWdvdGF0aW9uX3JlcShwd2RpbmZvLCBmcmFtZV9ib2R5LCBsZW4pOwpAQCAtNDAyMSw3ICs0MDI4LDcgQEAKIAkJCQkJX3J0d19tZW1zZXQoJmdyb3VwX2lkLCAweDAwLCBzaXplb2Yoc3RydWN0IGdyb3VwX2lkX2luZm8pKTsKIAkJCQkJcnR3X2dldF9wMnBfYXR0cl9jb250ZW50KHAycF9pZSwgcDJwX2llbGVuLCBQMlBfQVRUUl9HUk9VUF9JRCwgKHU4ICopJmdyb3VwX2lkLCAmYXR0cl9jb250ZW50bGVuKTsKIAkJCQkJaWYgKGF0dHJfY29udGVudGxlbikgewotCQkJCQkJaWYgKF9ydHdfbWVtY21wKGdyb3VwX2lkLmdvX2RldmljZV9hZGRyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgeworCQkJCQkJaWYgKCFtZW1jbXAoZ3JvdXBfaWQuZ29fZGV2aWNlX2FkZHIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CiAJCQkJCQkJLyoJVGhlIHAycCBkZXZpY2Ugc2VuZGluZyB0aGlzIHAycCBpbnZpdGF0aW9uIHJlcXVlc3Qgd2FudHMgdGhpcyBXaS1GaSBkZXZpY2UgdG8gYmUgdGhlIHBlcnNpc3RlbnQgR08uICovCiAJCQkJCQkJcnR3X3AycF9zZXRfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX1JFQ1ZfSU5WSVRFX1JFUV9HTyk7CiAJCQkJCQkJcnR3X3AycF9zZXRfcm9sZShwd2RpbmZvLCBQMlBfUk9MRV9HTyk7CkBAIC00MDY5LDcgKzQwNzYsNyBAQAogCQkJCQlfcnR3X21lbXNldCgmZ3JvdXBfaWQsIDB4MDAsIHNpemVvZihzdHJ1Y3QgZ3JvdXBfaWRfaW5mbykpOwogCQkJCQlydHdfZ2V0X3AycF9hdHRyX2NvbnRlbnQocDJwX2llLCBwMnBfaWVsZW4sIFAyUF9BVFRSX0dST1VQX0lELCAodTggKikmZ3JvdXBfaWQsICZhdHRyX2NvbnRlbnRsZW4pOwogCQkJCQlpZiAoYXR0cl9jb250ZW50bGVuKSB7Ci0JCQkJCQlpZiAoX3J0d19tZW1jbXAoZ3JvdXBfaWQuZ29fZGV2aWNlX2FkZHIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKSB7CisJCQkJCQlpZiAoIW1lbWNtcChncm91cF9pZC5nb19kZXZpY2VfYWRkciwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKIAkJCQkJCQkvKglJbiB0aGlzIGNhc2UsIHRoZSBHTyBjYW4ndCBiZSBteXNlbGYuICovCiAJCQkJCQkJcnR3X3AycF9zZXRfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX1JFQ1ZfSU5WSVRFX1JFUV9ESVNNQVRDSCk7CiAJCQkJCQkJc3RhdHVzX2NvZGUgPSBQMlBfU1RBVFVTX0ZBSUxfSU5GT19VTkFWQUlMQUJMRTsKQEAgLTQxMTYsNyArNDEyMyw3IEBACiAJCQkJcHdkaW5mby0+aW52aXRlcmVxX2luZm8uYmVuYWJsZSA9IGZhbHNlOwogCiAJCQkJaWYgKGF0dHJfY29udGVudCA9PSBQMlBfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQkJaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLmdvX2Jzc2lkLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgeworCQkJCQlpZiAoIW1lbWNtcChwd2RpbmZvLT5pbnZpdGVyZXFfaW5mby5nb19ic3NpZCwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKIAkJCQkJCXJ0d19wMnBfc2V0X3JvbGUocHdkaW5mbywgUDJQX1JPTEVfR08pOwogCQkJCQl9IGVsc2UgewogCQkJCQkJcnR3X3AycF9zZXRfcm9sZShwd2RpbmZvLCBQMlBfUk9MRV9DTElFTlQpOwpAQCAtNDE3NSwyMyArNDE4MiwyMiBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljX3ZlbmRvcih1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpY192ZW5kb3Ioc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKLQlpZiAoX3J0d19tZW1jbXAoZnJhbWVfYm9keSArIDIsIFAyUF9PVUksIDQpID09IHRydWUpIHsKKwlpZiAoIW1lbWNtcChmcmFtZV9ib2R5ICsgMiwgUDJQX09VSSwgNCkpCiAJCXJldCA9IG9uX2FjdGlvbl9wdWJsaWNfcDJwKHByZWN2X2ZyYW1lKTsKLQl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9uX2FjdGlvbl9wdWJsaWNfZGVmYXVsdCh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgdTggYWN0aW9uKQorc3RhdGljIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljX2RlZmF1bHQoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCB1OCBhY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IHJldCA9IF9GQUlMOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKIAl1OCB0b2tlbjsKIApAQCAtNDIwNiwxNSArNDIxMiwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgb25fYWN0aW9uX3B1YmxpYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwogCXU4IGNhdGVnb3J5LCBhY3Rpb247CiAKIAkvKiBjaGVjayBSQSBtYXRjaGVzIG9yIG5vdCAqLwotCWlmICghX3J0d19tZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEdldEFkZHIxUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkKKwlpZiAobWVtY21wKG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBHZXRBZGRyMVB0cihwZnJhbWUpLCBFVEhfQUxFTikpCiAJCWdvdG8gZXhpdDsKIAogCWNhdGVnb3J5ID0gZnJhbWVfYm9keVswXTsKQEAgLTQyMzUsMzAgKzQyNDEsMzAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi11bnNpZ25lZCBpbnQgT25BY3Rpb25faHQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFjdGlvbl9odChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXVuc2lnbmVkIGludCBPbkFjdGlvbl93bW0oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBPbkFjdGlvbl93bW0oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi11bnNpZ25lZCBpbnQgT25BY3Rpb25fcDJwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BY3Rpb25fcDJwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogI2lmZGVmIENPTkZJR184OEVVX1AyUAogCXU4ICpmcmFtZV9ib2R5OwogCXU4IGNhdGVnb3J5LCBPVUlfU3VidHlwZTsKLQl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci0JdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOworCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwl1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT5sZW47CiAJc3RydWN0CXdpZmlkaXJlY3RfaW5mbwkqcHdkaW5mbyA9ICYocGFkYXB0ZXItPndkaW5mbyk7CiAKIAogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBjaGVjayBSQSBtYXRjaGVzIG9yIG5vdCAqLwotCWlmICghX3J0d19tZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEdldEFkZHIxUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkvKiBmb3IgaWYxLCBzdGEvYXAgbW9kZSAqLworCWlmIChtZW1jbXAobXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEdldEFkZHIxUHRyKHBmcmFtZSksIEVUSF9BTEVOKSkvKiBmb3IgaWYxLCBzdGEvYXAgbW9kZSAqLwogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKIAlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpOwpAQCAtNDI5MCwxMyArNDI5NiwxMyBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IE9uQWN0aW9uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit1bnNpZ25lZCBpbnQgT25BY3Rpb24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgY2hhcgljYXRlZ29yeTsKIAlzdHJ1Y3QgYWN0aW9uX2hhbmRsZXIgKnB0YWJsZTsKIAl1bnNpZ25lZCBjaGFyCSpmcmFtZV9ib2R5OwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAKIAlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCkBAIC00MzEwLDcgKzQzMTYsNyBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotdW5zaWduZWQgaW50IERvUmVzZXJ2ZWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3Vuc2lnbmVkIGludCBEb1Jlc2VydmVkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTQzNDEsNyArNDM0Nyw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLUZvbGxvd2luZyBhcmUgc29tZSBUWCBmdWN0aW9ucyBmb3IgV2lGaSBNTE1FCitGb2xsb3dpbmcgYXJlIHNvbWUgVFggZnVuY3Rpb25zIGZvciBXaUZpIE1MTUUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ0MzIsNyArNDQzOCw3IEBACiAJfQogCiAJcHhtaXRwcml2LT5hY2tfdHggPSBmYWxzZTsKLQlfZXhpdF9jcml0aWNhbF9tdXRleCgmcHhtaXRwcml2LT5hY2tfdHhfbXV0ZXgsIE5VTEwpOworCW11dGV4X3VubG9jaygmcHhtaXRwcml2LT5hY2tfdHhfbXV0ZXgpOwogCiAJIHJldHVybiByZXQ7CiB9CkBAIC00OTk1LDcgKzUwMDEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qICBpZiBwc3RhID09IE5VTEwsIGluZGlhdGUgd2UgYXJlIHN0YXRpb24oY2xpZW50KSBub3cuLi4gKi8KKy8qICBpZiBwc3RhID09IE5VTEwsIGluZGljYXRlIHdlIGFyZSBzdGF0aW9uKGNsaWVudCkgbm93Li4uICovCiB2b2lkIGlzc3VlX2F1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsIHVuc2lnbmVkIHNob3J0IHN0YXR1cykKIHsKIAlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKQEAgLTUyMzQsNyArNTI0MCw3IEBACiAKIAkJZm9yIChwYnVmID0gaWUgKyBfQkVBQ09OX0lFX09GRlNFVF87OyBwYnVmICs9IChpZV9sZW4gKyAyKSkgewogCQkJcGJ1ZiA9IHJ0d19nZXRfaWUocGJ1ZiwgX1ZFTkRPUl9TUEVDSUZJQ19JRV8sICZpZV9sZW4sIChwbmV0d29yay0+SUVMZW5ndGggLSBfQkVBQ09OX0lFX09GRlNFVF8gLSAoaWVfbGVuICsgMikpKTsKLQkJCWlmIChwYnVmICYmIF9ydHdfbWVtY21wKHBidWYrMiwgV01NX1BBUkFfSUUsIDYpKSB7CisJCQlpZiAocGJ1ZiAmJiAhbWVtY21wKHBidWYrMiwgV01NX1BBUkFfSUUsIDYpKSB7CiAJCQkJbWVtY3B5KHBmcmFtZSwgcGJ1ZiwgaWVfbGVuKzIpOwogCQkJCXBmcmFtZSArPSAoaWVfbGVuKzIpOwogCQkJCXBhdHRyaWItPnBrdGxlbiArPSAoaWVfbGVuKzIpOwpAQCAtNTQzOSwxNCArNTQ0NSwxNCBAQAogCiAJCXN3aXRjaCAocElFLT5FbGVtZW50SUQpIHsKIAkJY2FzZSBfVkVORE9SX1NQRUNJRklDX0lFXzoKLQkJCWlmICgoX3J0d19tZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkpIHx8Ci0JCQkgICAgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgV01NX09VSSwgNCkpIHx8Ci0JCQkgICAgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgV1BTX09VSSwgNCkpKSB7CisJCQlpZiAoKCFtZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkpIHx8CisJCQkgICAgKCFtZW1jbXAocElFLT5kYXRhLCBXTU1fT1VJLCA0KSkgfHwKKwkJCSAgICAoIW1lbWNtcChwSUUtPmRhdGEsIFdQU19PVUksIDQpKSkgewogCQkJCWlmICghcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMpIHsKIAkJCQkJLyogQ29tbWVudGVkIGJ5IEt1cnQgMjAxMTA2MjkgKi8KIAkJCQkJLyogSW4gc29tZSBvbGRlciBBUHMsIFdQUyBoYW5kc2hha2UgKi8KIAkJCQkJLyogd291bGQgYmUgZmFpbCBpZiB3ZSBhcHBlbmQgdmVuZGVyIGV4dGVuc2lvbnMgaW5mb3JtYXRpb25zIHRvIEFQICovCi0JCQkJCWlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFdQU19PVUksIDQpKQorCQkJCQlpZiAoIW1lbWNtcChwSUUtPmRhdGEsIFdQU19PVUksIDQpKQogCQkJCQkJcElFLT5MZW5ndGggPSAxNDsKIAkJCQl9CiAJCQkJcGZyYW1lID0gcnR3X3NldF9pZShwZnJhbWUsIF9WRU5ET1JfU1BFQ0lGSUNfSUVfLCBwSUUtPkxlbmd0aCwgcElFLT5kYXRhLCAmKHBhdHRyaWItPnBrdGxlbikpOwpAQCAtNTYwNiw3ICs1NjEyLDcgQEAKIAlyZXR1cm47CiB9CiAKLS8qIHdoZW4gd2FpdF9hY2sgaXMgdHVyZSwgdGhpcyBmdW5jdGlvbiBzaG91bGUgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLworLyogd2hlbiB3YWl0X2FjayBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCiBzdGF0aWMgaW50IF9pc3N1ZV9udWxsZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLCB1bnNpZ25lZCBpbnQgcG93ZXJfbW9kZSwgaW50IHdhaXRfYWNrKQogewogCWludCByZXQgPSBfRkFJTDsKQEAgLTU2NzYsNyArNTY4Miw3IEBACiB9CiAKIAotLyogd2hlbiB3YWl0X21zID4gMCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxlIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KKy8qIHdoZW4gd2FpdF9tcyA+IDAgLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCiAvKiBkYSA9PSBOVUxMIGZvciBzdGF0aW9uIG1vZGUgKi8KIGludCBpc3N1ZV9udWxsZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLCB1bnNpZ25lZCBpbnQgcG93ZXJfbW9kZSwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQogewpAQCAtNTY4Niw3ICs1NjkyLDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmKHBhZGFwdGVyLT5tbG1lZXh0cHJpdik7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAotCS8qIGRhID09IE5VTEwsIGFzc3VtIGl0J3MgbnVsbCBkYXRhIGZvciBzdGEgdG8gYXAqLworCS8qIGRhID09IE5VTEwsIGFzc3VtZSBpdCdzIG51bGwgZGF0YSBmb3Igc3RhIHRvIGFwKi8KIAlpZiAoZGEgPT0gTlVMTCkKIAkJZGEgPSBnZXRfbXlfYnNzaWQoJihwbWxtZWluZm8tPm5ldHdvcmspKTsKIApAQCAtNTcyMSw3ICs1NzI3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiB3aGVuIHdhaXRfYWNrIGlzIHR1cmUsIHRoaXMgZnVuY3Rpb24gc2hvdWxlIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KKy8qIHdoZW4gd2FpdF9hY2sgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLwogc3RhdGljIGludCBfaXNzdWVfcW9zX251bGxkYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsIHUxNiB0aWQsIGludCB3YWl0X2FjaykKIHsKIAlpbnQgcmV0ID0gX0ZBSUw7CkBAIC01Nzk5LDcgKzU4MDUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIHdoZW4gd2FpdF9tcyA+IDAgLCB0aGlzIGZ1bmN0aW9uIHNob3VsZSBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCisvKiB3aGVuIHdhaXRfbXMgPiAwICwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLwogLyogZGEgPT0gTlVMTCBmb3Igc3RhdGlvbiBtb2RlICovCiBpbnQgaXNzdWVfcW9zX251bGxkYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsIHUxNiB0aWQsIGludCB0cnlfY250LCBpbnQgd2FpdF9tcykKIHsKQEAgLTU4MDksNyArNTgxNSw3IEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJihwYWRhcHRlci0+bWxtZWV4dHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKLQkvKiBkYSA9PSBOVUxMLCBhc3N1bSBpdCdzIG51bGwgZGF0YSBmb3Igc3RhIHRvIGFwKi8KKwkvKiBkYSA9PSBOVUxMLCBhc3N1bWUgaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCiAJaWYgKGRhID09IE5VTEwpCiAJCWRhID0gZ2V0X215X2Jzc2lkKCYocG1sbWVpbmZvLT5uZXR3b3JrKSk7CiAKQEAgLTYxMDMsMTcgKzYxMDksMjYgQEAKIAkJY2FzZSAxOiAvKiBBRERCQSByc3AgKi8KIAkJCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKHBtbG1laW5mby0+QUREQkFfcmVxLmRpYWxvZ190b2tlbiksICYocGF0dHJpYi0+cGt0bGVuKSk7CiAJCQlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMiwgKHVuc2lnbmVkIGNoYXIgKikoJnN0YXR1cyksICYocGF0dHJpYi0+cGt0bGVuKSk7CisKKwkJCUJBX3BhcmFfc2V0ID0gbGUxNl90b19jcHUocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZjsKIAkJCXJ0d19oYWxfZ2V0X2RlZl92YXIocGFkYXB0ZXIsIEhXX1ZBUl9NQVhfUlhfQU1QRFVfRkFDVE9SLCAmbWF4X3J4X2FtcGR1X2ZhY3Rvcik7Ci0JCQlpZiAoTUFYX0FNUERVX0ZBQ1RPUl82NEsgPT0gbWF4X3J4X2FtcGR1X2ZhY3RvcikKLQkJCQlCQV9wYXJhX3NldCA9ICgoKHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3BhcmFfc2V0KSAmIDB4M2YpIHwgMHgxMDAwKTsgLyogNjQgYnVmZmVyIHNpemUgKi8KLQkJCWVsc2UgaWYgKE1BWF9BTVBEVV9GQUNUT1JfMzJLID09IG1heF9yeF9hbXBkdV9mYWN0b3IpCi0JCQkJQkFfcGFyYV9zZXQgPSAoKChwbWxtZWluZm8tPkFEREJBX3JlcS5CQV9wYXJhX3NldCkgJiAweDNmKSB8IDB4MDgwMCk7IC8qIDMyIGJ1ZmZlciBzaXplICovCi0JCQllbHNlIGlmIChNQVhfQU1QRFVfRkFDVE9SXzE2SyA9PSBtYXhfcnhfYW1wZHVfZmFjdG9yKQotCQkJCUJBX3BhcmFfc2V0ID0gKCgocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZikgfCAweDA0MDApOyAvKiAxNiBidWZmZXIgc2l6ZSAqLwotCQkJZWxzZSBpZiAoTUFYX0FNUERVX0ZBQ1RPUl84SyA9PSBtYXhfcnhfYW1wZHVfZmFjdG9yKQotCQkJCUJBX3BhcmFfc2V0ID0gKCgocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZikgfCAweDAyMDApOyAvKiA4IGJ1ZmZlciBzaXplICovCi0JCQllbHNlCi0JCQkJQkFfcGFyYV9zZXQgPSAoKChwbWxtZWluZm8tPkFEREJBX3JlcS5CQV9wYXJhX3NldCkgJiAweDNmKSB8IDB4MTAwMCk7IC8qIDY0IGJ1ZmZlciBzaXplICovCisJCQlzd2l0Y2ggKG1heF9yeF9hbXBkdV9mYWN0b3IpIHsKKwkJCWNhc2UgTUFYX0FNUERVX0ZBQ1RPUl82NEs6CisJCQkJQkFfcGFyYV9zZXQgfD0gMHgxMDAwOyAvKiA2NCBidWZmZXIgc2l6ZSAqLworCQkJCWJyZWFrOworCQkJY2FzZSBNQVhfQU1QRFVfRkFDVE9SXzMySzoKKwkJCQlCQV9wYXJhX3NldCB8PSAweDA4MDA7IC8qIDMyIGJ1ZmZlciBzaXplICovCisJCQkJYnJlYWs7CisJCQljYXNlIE1BWF9BTVBEVV9GQUNUT1JfMTZLOgorCQkJCUJBX3BhcmFfc2V0IHw9IDB4MDQwMDsgLyogMTYgYnVmZmVyIHNpemUgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgTUFYX0FNUERVX0ZBQ1RPUl84SzoKKwkJCQlCQV9wYXJhX3NldCB8PSAweDAyMDA7IC8qIDggYnVmZmVyIHNpemUgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQkFfcGFyYV9zZXQgfD0gMHgxMDAwOyAvKiA2NCBidWZmZXIgc2l6ZSAqLworCQkJCWJyZWFrOworCQkJfQogCiAJCQlpZiAocHJlZ3ByaXYtPmFtcGR1X2Ftc2R1ID09IDApLyogZGlzYWJsZWQgKi8KIAkJCQlCQV9wYXJhX3NldCA9IEJBX3BhcmFfc2V0ICYgfkJJVCgwKTsKQEAgLTYyMjIsNyArNjIzNyw3IEBACiAJCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJd2hpbGUgKDEpIHsKIAkJCWludCBsZW47CkBAIC02MjMyLDkgKzYyNDcsOSBAQAogCQkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpCiAJCQkJYnJlYWs7CiAKLQkJCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCi0JCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJCXBic3NfbmV0d29yayA9IChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKSZwbmV0d29yay0+bmV0d29yazsKIApAQCAtNjM1NSw3ICs2MzcwLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotRm9sbG93aW5nIGFyZSBzb21lIHV0aXRpdHkgZnVjdGlvbnMgZm9yIFdpRmkgTUxNRQorRm9sbG93aW5nIGFyZSBzb21lIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBXaUZpIE1MTUUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTY0NjgsNyArNjQ4Myw3IEBACiAJCXsKIAkJCS8qICAyMDEwMDcyMTpJbnRlcnJ1cHQgc2NhbiBvcGVyYXRpb24gaGVyZS4gKi8KIAkJCS8qICBGb3IgU1cgYW50ZW5uYSBkaXZlcnNpdHkgYmVmb3JlIGxpbmssIGl0IG5lZWRzIHRvIHN3aXRjaCB0byBhbm90aGVyIGFudGVubmEgYW5kIHNjYW4gYWdhaW4uICovCi0JCQkvKiAgSXQgY29tcGFyZXMgdGhlIHNjYW4gcmVzdWx0IGFuZCBzZWxlY3QgYmV0ZXIgb25lIHRvIGRvIGNvbm5lY3Rpb24uICovCisJCQkvKiAgSXQgY29tcGFyZXMgdGhlIHNjYW4gcmVzdWx0IGFuZCBzZWxlY3QgYmV0dGVyIG9uZSB0byBkbyBjb25uZWN0aW9uLiAqLwogCQkJaWYgKHJ0d19oYWxfYW50ZGl2X2JlZm9yZV9saW5rZWQocGFkYXB0ZXIpKSB7CiAJCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQgPSAwOwogCQkJCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeCA9IC0xOwpAQCAtNjUyNiwxNCArNjU0MSwxNCBAQAogfQogCiAvKiBjb2xsZWN0IGJzcyBpbmZvIGZyb20gQmVhY29uIGFuZCBQcm9iZSByZXF1ZXN0L3Jlc3BvbnNlIGZyYW1lcy4gKi8KLXU4IGNvbGxlY3RfYnNzX2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzc2lkKQordTggY29sbGVjdF9ic3NfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzc2lkKQogewogCWludAlpOwogCXUzMglsZW47CiAJdTggKnA7CiAJdTE2IHZhbDE2LCBzdWJ0eXBlOwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQl1MzIJcGFja2V0X2xlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXUzMglwYWNrZXRfbGVuID0gcHJlY3ZfZnJhbWUtPmxlbjsKIAl1OCBpZV9vZmZzZXQ7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwpAQCAtNjU3MiwxMCArNjU4NywxMCBAQAogCWJzc2lkLT5JRUxlbmd0aCA9IGxlbjsKIAltZW1jcHkoYnNzaWQtPklFcywgKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKSwgYnNzaWQtPklFTGVuZ3RoKTsKIAotCS8qIGdldCB0aGUgc2lnbmFsIHN0cmVuZ3RoICovCi0JYnNzaWQtPlJzc2kgPSBwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnBoeV9pbmZvLnJlY3Zwb3dlcjsgLyogIGluIGRCTS5yYXcgZGF0YSAqLwotCWJzc2lkLT5QaHlJbmZvLlNpZ25hbFF1YWxpdHkgPSBwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliLnBoeV9pbmZvLlNpZ25hbFF1YWxpdHk7LyogaW4gcGVyY2VudGFnZSAqLwotCWJzc2lkLT5QaHlJbmZvLlNpZ25hbFN0cmVuZ3RoID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5waHlfaW5mby5TaWduYWxTdHJlbmd0aDsvKiBpbiBwZXJjZW50YWdlICovCisJLyogZ2V0IHRoZSBzaWduYWwgc3RyZW5ndGggaW4gZEJNLnJhdyBkYXRhICovCisJYnNzaWQtPlJzc2kgPSBwcmVjdl9mcmFtZS0+YXR0cmliLnBoeV9pbmZvLnJlY3Zwb3dlcjsKKwlic3NpZC0+UGh5SW5mby5TaWduYWxRdWFsaXR5ID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5waHlfaW5mby5TaWduYWxRdWFsaXR5Oy8qIGluIHBlcmNlbnRhZ2UgKi8KKwlic3NpZC0+UGh5SW5mby5TaWduYWxTdHJlbmd0aCA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8uU2lnbmFsU3RyZW5ndGg7LyogaW4gcGVyY2VudGFnZSAqLwogCXJ0d19oYWxfZ2V0X2RlZl92YXIocGFkYXB0ZXIsIEhBTF9ERUZfQ1VSUkVOVF9BTlRFTk5BLCAgJmJzc2lkLT5QaHlJbmZvLk9wdGltdW1fYW50ZW5uYSk7CiAKIAkvKiAgY2hlY2tpbmcgU1NJRCAqLwpAQCAtNjcwNyw3ICs2NzIyLDcgQEAKIAkvKiB1cGRhdGUgd2lyZWxlc3MgbW9kZSAqLwogCXVwZGF0ZV93aXJlbGVzc19tb2RlKHBhZGFwdGVyKTsKIAotCS8qIHVkcGF0ZSBjYXBhYmlsaXR5ICovCisJLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KIAljYXBzID0gcnR3X2dldF9jYXBhYmlsaXR5KChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBuZXR3b3JrKTsKIAl1cGRhdGVfY2FwaW5mbyhwYWRhcHRlciwgY2Fwcyk7CiAJaWYgKGNhcHMmY2FwX0lCU1MpIHsvKiBhZGhvYyBtYXN0ZXIgKi8KQEAgLTY3NTksNyArNjc3NCw3IEBACiAJLyogdXBkYXRlIHdpcmVsZXNzIG1vZGUgKi8KIAl1cGRhdGVfd2lyZWxlc3NfbW9kZShwYWRhcHRlcik7CiAKLQkvKiB1ZHBhdGUgY2FwYWJpbGl0eSAqLworCS8qIHVwZGF0ZSBjYXBhYmlsaXR5ICovCiAJY2FwcyA9IHJ0d19nZXRfY2FwYWJpbGl0eSgoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwbmV0d29yayk7CiAJdXBkYXRlX2NhcGluZm8ocGFkYXB0ZXIsIGNhcHMpOwogCWlmIChjYXBzJmNhcF9FU1MpIHsKQEAgLTY4NTEsNyArNjg2Niw3IEBACiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAogCS8qIGNoZWNrIEEzICovCi0JaWYgKCEoX3J0d19tZW1jbXAoTWFjQWRkciwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTikpKQorCWlmIChtZW1jbXAoTWFjQWRkciwgZ2V0X215X2Jzc2lkKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTikpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CkBAIC03MDI4LDcgKzcwNDMsOCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCByZXBvcnRfc3VydmV5X2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCit2b2lkIHJlcG9ydF9zdXJ2ZXlfZXZlbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAlzdHJ1Y3QgY21kX29iaiAqcGNtZF9vYmo7CiAJdTggKnBldnRjbWQ7CkBAIC03MDM3LDggKzcwNTMsNiBAQAogCXN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKnBjMmhfZXZ0X2hkcjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7CiAJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdjsKLQkvKiB1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7ICovCi0JLyogdWludCBsZW4gPSBwcmVjdl9mcmFtZS0+dS5oZHIubGVuOyAqLwogCiAJaWYgKCFwYWRhcHRlcikKIAkJcmV0dXJuOwpAQCAtNzM3Myw3ICs3Mzg3LDcgQEAKIAkvKiB0dXJuIG9uIGR5bmFtaWMgZnVuY3Rpb25zICovCiAJU3dpdGNoX0RNX0Z1bmMocGFkYXB0ZXIsIERZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFLCB0cnVlKTsKIAotCS8qICB1cGRhdGUgSU9ULXJlbGVhdGVkIGlzc3VlICovCisJLyogIHVwZGF0ZSBJT1QtcmVsYXRlZCBpc3N1ZSAqLwogCXVwZGF0ZV9JT1RfaW5mbyhwYWRhcHRlcik7CiAKIAlydHdfaGFsX3NldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX0JBU0lDX1JBVEUsIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyk7CkBAIC03MzgxLDcgKzczOTUsNyBAQAogCS8qIEJDTiBpbnRlcnZhbCAqLwogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfQkVBQ09OX0lOVEVSVkFMLCAodTggKikoJnBtbG1laW5mby0+YmNuX2ludGVydmFsKSk7CiAKLQkvKiB1ZHBhdGUgY2FwYWJpbGl0eSAqLworCS8qIHVwZGF0ZSBjYXBhYmlsaXR5ICovCiAJdXBkYXRlX2NhcGluZm8ocGFkYXB0ZXIsIHBtbG1laW5mby0+Y2FwYWJpbGl0eSk7CiAKIAkvKiBXTU0sIFVwZGF0ZSBFRENBIHBhcmFtICovCkBAIC03OTAyLDcgKzc5MTYsNyBAQAogCiAJCXN3aXRjaCAocElFLT5FbGVtZW50SUQpIHsKIAkJY2FzZSBfVkVORE9SX1NQRUNJRklDX0lFXzovKiBHZXQgV01NIElFLiAqLwotCQkJaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgV01NX09VSSwgNCkpCisJCQlpZiAoIW1lbWNtcChwSUUtPmRhdGEsIFdNTV9PVUksIDQpKQogCQkJCXBtbG1laW5mby0+V01NX2VuYWJsZSA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBfSFRfQ0FQQUJJTElUWV9JRV86CS8qIEdldCBIVCBDYXAgSUUuICovCkBAIC04MDE2LDcgKzgwMzAsNyBAQAogCQlzZXRfaWR4ID0gcnR3X2NoX3NldF9zZWFyY2hfY2gocG1sbWVleHQtPmNoYW5uZWxfc2V0LCBpbltpXS5od192YWx1ZSk7CiAJCWlmIChpbltpXS5od192YWx1ZSAmJiAhKGluW2ldLmZsYWdzICYgUlRXX0lFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSAmJgogCQkgICAgc2V0X2lkeCA+PSAwKSB7Ci0JCQltZW1jcHkoJm91dFtqXSwgJmluW2ldLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOworCQkJb3V0W2pdID0gaW5baV07CiAKIAkJCWlmIChwbWxtZWV4dC0+Y2hhbm5lbF9zZXRbc2V0X2lkeF0uU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFKQogCQkJCW91dFtqXS5mbGFncyAmPSBSVFdfSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOOwpAQCAtODI2MSw3ICs4Mjc1LDYgQEAKIAl1OCByZXMgPSBfU1VDQ0VTUzsKIAlpbnQgbGVuX2RpZmYgPSAwOwogCi1fZnVuY19lbnRlcl87CiAKIAlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CiAJaWYgKHBoMmMgPT0gTlVMTCkgewpAQCAtODI5MCw3ICs4MzAzLDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtODM2OCwxMiArODM4MCwxMiBAQAogCQkJc3Bpbl9sb2NrX2JoKCZwc3RhX2JtYy0+c2xlZXBfcS5sb2NrKTsKIAogCQkJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YV9ibWMtPnNsZWVwX3EpOwotCQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BoZWFkKTsKKwkJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9waGVhZC0+bmV4dDsKIAogCQkJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaCh4bWl0ZnJhbWVfcGhlYWQsIHhtaXRmcmFtZV9wbGlzdCkpIHsKLQkJCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCQkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQkJCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9wbGlzdCk7CisJCQkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BsaXN0LT5uZXh0OwogCiAJCQkJcnR3X2xpc3RfZGVsZXRlKCZweG1pdGZyYW1lLT5saXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcC5jCmluZGV4IDY0NTFlZmQuLjcwNWY2NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wLmMKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCiAjaW5jbHVkZSAicnRsODE4OGVfaGFsLmgiCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiB1MzIgcmVhZF9tYWNyZWcoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYWRkciwgdTMyIHN6KQogewpAQCAtNDA2LDcgKzQwNyw3IEBACiAJCWdvdG8gZW5kX29mX21wX3N0YXJ0X3Rlc3Q7CiAJfQogCi0JLyogMyAzLiBqb2luIHBzdWRvIEFkSG9jICovCisJLyogMyAzLiBqb2luIHBzZXVkbyBBZEhvYyAqLwogCXRndF9uZXR3b3JrLT5qb2luX3JlcyA9IDE7CiAJdGd0X25ldHdvcmstPmFpZCA9IDE7CiAJcHN0YS0+YWlkID0gMTsKQEAgLTQ0Miw3ICs0NDMsNyBAQAogCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpID09IGZhbHNlKQogCQkJZ290byBlbmRfb2ZfbXBfc3RvcF90ZXN0OwogCi0JCS8qIDMgMS4gZGlzY29ubmVjdCBwc3VkbyBBZEhvYyAqLworCQkvKiAzIDEuIGRpc2Nvbm5lY3QgcHNldWRvIEFkSG9jICovCiAJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsKIAogCQkvKiAzIDIuIGNsZWFyIHBzdGEgdXNlZCBpbiBtcCB0ZXN0IG1vZGUuICovCkBAIC04ODIsNyArODgzLDcgQEAKIHsKIAl1MzIgaSwgcHNkX3B0cyA9IDAsIHBzZF9zdGFydCA9IDAsIHBzZF9zdG9wID0gMDsKIAl1MzIgcHNkX2RhdGEgPSAwOwotCisJaW50IHJldDsKIAogCWlmICghbmV0aWZfcnVubmluZyhwQWRhcHRlci0+cG5ldGRldikpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfd2FybmluZ18sICgibXBfcXVlcnlfcHNkOiBGYWlsISBpbnRlcmZhY2Ugbm90IG9wZW5lZCFcbiIpKTsKQEAgLTg5OSw3ICs5MDAsMTAgQEAKIAkJcHNkX3N0YXJ0ID0gNjQ7CiAJCXBzZF9zdG9wID0gMTI4OwogCX0gZWxzZSB7Ci0JCXNzY2FuZihkYXRhLCAicHRzID0lZCwgc3RhcnQgPSVkLCBzdG9wID0lZCIsICZwc2RfcHRzLCAmcHNkX3N0YXJ0LCAmcHNkX3N0b3ApOworCQlyZXQgPSBzc2NhbmYoZGF0YSwgInB0cyA9JWQsIHN0YXJ0ID0lZCwgc3RvcCA9JWQiLAorCQkJCSZwc2RfcHRzLCAmcHNkX3N0YXJ0LCAmcHNkX3N0b3ApOworCQlpZiAocmV0ICE9IDMpCisJCQlyZXR1cm4gMDsKIAl9CiAKIAlfcnR3X21lbXNldChkYXRhLCAnXDAnLCBzaXplb2YoKmRhdGEpKTsKQEAgLTk0Myw3ICs5NDcsNyBAQAogCX0KIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpCi0JCXJ0d192bWZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmLCBudW1feG1pdF9leHRidWYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOworCQl2ZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpOwogCiAJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZSA9PSAwKSB7CiAJCW1heF94bWl0X2V4dGJ1Zl9zaXplID0gMjAwMDA7CkBAIC05NTYsNyArOTYwLDcgQEAKIAkvKiAgSW5pdCB4bWl0IGV4dGVuc2lvbiBidWZmICovCiAJX3J0d19pbml0X3F1ZXVlKCZweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfcXVldWUpOwogCi0JcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmID0gcnR3X3p2bWFsbG9jKG51bV94bWl0X2V4dGJ1ZiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CisJcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmID0gdnphbGxvYyhudW1feG1pdF9leHRidWYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOwogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiAgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLCAoImFsbG9jIHhtaXRfZXh0YnVmIGZhaWwhXG4iKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21wX2lvY3RsLmMKaW5kZXggZWRjZDhhNS4uZTc4Mzk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tcF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbXBfaW9jdGwuYwpAQCAtMzMsNyArMzMsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWZfbGVuIDwgc2l6ZW9mKHU4KSkKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfTEVOR1RIOwpAQCAtNDgsNyArNDcsNiBAQAogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC02MSw3ICs1OSw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fd3JpdGVfYmJfcmVnX2hkbFxuIikpOwogCkBAIC04Nyw3ICs4NCw2IEBACiAJd3JpdGVfYmJyZWcoQWRhcHRlciwgb2Zmc2V0LCAweEZGRkZGRkZGLCB2YWx1ZSk7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEwMCw3ICs5Niw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fcmVhZF9iYl9yZWdfaGRsXG4iKSk7CiAKQEAgLTEyNiw3ICsxMjEsNiBAQAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sCiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X3Byb19yZWFkX2JiX3JlZ19oZGw6IG9mZnNldD0weCUwM1ggdmFsdWU6MHglMDhYXG4iLAogCQkgIG9mZnNldCwgdmFsdWUpKTsKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE0MCw3ICsxMzQsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3dyaXRlX3JmX3JlZ19oZGxcbiIpKTsKIApAQCAtMTcxLDcgKzE2NCw2IEBACiAJd3JpdGVfcmZyZWcoQWRhcHRlciwgcGF0aCwgb2Zmc2V0LCB2YWx1ZSk7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE4NSw3ICsxNzcsNiBAQAogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3JlYWRfcmZfcmVnX2hkbFxuIikpOwogCkBAIC0yMTcsNyArMjA4LDYgQEAKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfcHJvX3JlYWRfcmZfcmVnX2hkbDogcGF0aD0lZCBvZmZzZXQ9MHglMDJYIHZhbHVlPTB4JTA1WFxuIiwKIAkJICBwYXRoLCBvZmZzZXQsIHZhbHVlKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIzMiw3ICsyMjIsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sCiAJCSAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfZGF0YV9yYXRlX2hkbFxuIikpOwpAQCAtMjU1LDcgKzI0NCw2IEBACiAJU2V0RGF0YVJhdGUoQWRhcHRlcik7CiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI2Niw3ICsyNTQsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3N0YXJ0X3Rlc3RfaGRsXG4iKSk7CiAKQEAgLTI5Myw3ICsyODAsNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCItcnRsODE4OGV1X29pZF9ydF9wcm9fc3RhcnRfdGVzdF9oZGw6IG1wX21vZGU9JWRcbiIsIEFkYXB0ZXItPm1wcHJpdi5tb2RlKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMwMyw3ICsyODksNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiK1NldCBPSURfUlRfUFJPX1NUT1BfVEVTVFxuIikpOwogCkBAIC0zMTYsNyArMzAxLDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X25vdGljZV8sICgiLVNldCBPSURfUlRfUFJPX1NUT1BfVEVTVFxuIikpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zMjcsNyArMzExLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfY2hhbm5lbF9kaXJlY3RfY2FsbF9oZGxcbiIpKTsKIApAQCAtMzUyLDcgKzMzNSw2IEBACiAJU2V0Q2hhbm5lbChBZGFwdGVyKTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzY0LDcgKzM0Niw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLAogCQkgKCIrcnRsODE4OGV1X29pZF9ydF9zZXRfYmFuZHdpZHRoX2hkbFxuIikpOwpAQCAtMzkxLDcgKzM3Miw2IEBACiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X3NldF9iYW5kd2lkdGhfaGRsOiBiYW5kd2lkdGg9JWQgY2hhbm5lbF9vZmZzZXQ9JWRcbiIsCiAJCSAgYmFuZHdpZHRoLCBjaGFubmVsX29mZnNldCkpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00MDIsNyArMzgyLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfYW50ZW5uYV9iYl9oZGxcbiIpKTsKIApAQCAtNDI2LDcgKzQwNSw2IEBACiAJCSoodTMyICopcG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmID0gYW50ZW5uYTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQzNyw3ICs0MTUsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfdHhfcG93ZXJfY29udHJvbF9oZGxcbiIpKTsKIApAQCAtNDYxLDcgKzQzOCw2IEBACiAJU2V0VHhQb3dlcihBZGFwdGVyKTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNDc0LDcgKzQ1MCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFFVRVJZX09JRCkgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC00ODgsNyArNDYzLDYgQEAKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9MRU5HVEg7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00OTgsNyArNDcyLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gUVVFUllfT0lEKSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTUxMyw3ICs0ODYsNiBAQAogCQlzdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0xFTkdUSDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTUyMyw3ICs0OTUsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBRVUVSWV9PSUQpIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtNTM4LDcgKzUwOSw2IEBACiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfTEVOR1RIOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTQ5LDcgKzUxOSw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFNFVF9PSUQpIHsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtNTU5LDcgKzUyOCw2IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfYWxlcnRfLCAoIj09PT4gcnRsODE4OGV1X29pZF9ydF9wcm9fcmVzZXRfdHhfcGFja2V0X3NlbnRfaGRsLlxuIikpOwogCUFkYXB0ZXItPm1wcHJpdi50eF9wa3Rjb3VudCA9IDA7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU2OSw3ICs1MzcsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBTRVRfT0lEKSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTU4Myw3ICs1NTAsNiBAQAogCQlzdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0xFTkdUSDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU5Myw3ICs1NTksNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBTRVRfT0lEKSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTYwNCw3ICs1NjksNiBAQAogCVJlc2V0UGh5UnhQa3RDb3VudChBZGFwdGVyKTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNjE0LDcgKzU3OCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sICgiK3J0bDgxODhldV9vaWRfcnRfZ2V0X3BoeV9yeF9wYWNrZXRfcmVjZWl2ZWRfaGRsXG4iKSk7CiAKQEAgLTYzMiw3ICs1OTUsNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCItcnRsODE4OGV1X29pZF9ydF9nZXRfcGh5X3J4X3BhY2tldF9yZWNlaXZlZF9oZGw6IHJlY3Zfb2s9JWRcbiIsICoodTMyICopcG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTY0Miw3ICs2MDQsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLCAoIitydGw4MTg4ZXVfb2lkX3J0X2dldF9waHlfcnhfcGFja2V0X2NyYzMyX2Vycm9yX2hkbFxuIikpOwogCkBAIC02NjMsNyArNjI0LDYgQEAKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfZ2V0X3BoeV9yeF9wYWNrZXRfY3JjMzJfZXJyb3JfaGRsOiByZWN2X2VyciA9JWRcbiIsCiAJCSAqKHUzMiAqKXBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1ZikpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC02NzQsNyArNjM0LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfY29udGludW91c190eF9oZGxcbiIpKTsKIApAQCAtNjk4LDcgKzY1Nyw2IEBACiAJfQogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC03MDksNyArNjY3LDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9hbGVydF8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF9zaW5nbGVfY2Fycmllcl90eF9oZGxcbiIpKTsKIApAQCAtNzMzLDcgKzY5MCw2IEBACiAJfQogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC03NDQsNyArNzAwLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19zZXRfY2Fycmllcl9zdXBwcmVzc2lvbl90eF9oZGxcbiIpKTsKIApAQCAtNzY4LDcgKzcyMyw2IEBACiAJfQogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC03NzksNyArNzMzLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9hbGVydF8sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX3NldF9zaW5nbGVfdG9uZV90eF9oZGxcbiIpKTsKIApAQCAtNzkyLDcgKzc0NSw2IEBACiAJU2V0U2luZ2xlVG9uZVR4KEFkYXB0ZXIsICh1OCliU3RhcnRUZXN0KTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtODA2LDcgKzc1OCw2IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBTRVRfT0lEKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtODE1LDcgKzc2Niw2IEBACiAJcnR3X2hhbF9zZXRfaHdyZWcoQWRhcHRlciwgSFdfVkFSX1RSSUdHRVJfR1BJT18wLCBOVUxMKTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtODMzLDcgKzc4Myw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sCiAJCSAoIitydGw4MTg4ZXVfb2lkX3J0X3Byb19yZWFkX3JlZ2lzdGVyX2hkbFxuIikpOwpAQCAtODcwLDcgKzgxOSw2IEBACiAKIAkqcG9pZF9wYXJfcHJpdi0+Ynl0ZXNfcncgPSB3aWR0aDsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtODgyLDcgKzgzMCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLAogCQkgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fd3JpdGVfcmVnaXN0ZXJfaGRsXG4iKSk7CkBAIC05MjksNyArODc2LDYgQEAKIAkJICgiLXJ0bDgxODhldV9vaWRfcnRfcHJvX3dyaXRlX3JlZ2lzdGVyX2hkbDogb2Zmc2V0PTB4JTA4WCB3aWR0aD0lZCB2YWx1ZT0weCVYXG4iLAogCQkgIG9mZnNldCwgd2lkdGgsIHZhbHVlKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEwMDIsNyArOTQ4LDYgQEAKIAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitPSURfUlRfUFJPX1NFVF9EQVRBX1JBVEVfRVhcbiIpKTsKIApAQCAtMTAxNiw3ICs5NjEsNiBAQAogCiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEwMjcsNyArOTcxLDYgQEAKIAl1OCB0aGVybWFsID0gMDsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X2dldF90aGVybWFsX21ldGVyX2hkbFxuIikpOwogCkBAIC0xMDQ0LDcgKzk4Nyw2IEBACiAJKih1MzIgKilwb2lkX3Bhcl9wcml2LT5pbmZvcm1hdGlvbl9idWYgPSAodTMyKXRoZXJtYWw7CiAJKnBvaWRfcGFyX3ByaXYtPmJ5dGVzX3J3ID0gc2l6ZW9mKHUzMik7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEwNjAsNyArMTAwMiw2IEBACiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmX2xlbiA8IHNpemVvZih1OCkpCiAJCXJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0xFTkdUSDsKQEAgLTEwNzksNyArMTAyMCw2IEBACiAJfQogCV9pcnFsZXZlbF9jaGFuZ2VkXygmb2xkaXJxbCwgUkFJU0UpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMTQzLDcgKzEwODMsNiBAQAogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopKHBvaWRfcGFyX3ByaXYtPmFkYXB0ZXJfY29udGV4dCk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBRVUVSWV9PSUQpCiAJCXJldHVybiBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC0xMTc2LDcgKzExMTUsNiBAQAogCX0KIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTE5MCw3ICsxMTI4LDYgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwb2lkX3Bhcl9wcml2LT50eXBlX29mX29pZCAhPSBTRVRfT0lEKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtMTIxNiw3ICsxMTUzLDYgQEAKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAlfaXJxbGV2ZWxfY2hhbmdlZF8oJm9sZGlycWwsIFJBSVNFKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTIyNyw3ICsxMTYzLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAkqcG9pZF9wYXJfcHJpdi0+Ynl0ZXNfcncgPSAwOwogCkBAIC0xMjY3LDcgKzEyMDIsNiBAQAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9wcm9fcndfZWZ1c2VfcGdwa3RfaGRsOiBzdGF0dXM9MHglMDhYXG4iLCBzdGF0dXMpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTI3OSw3ICsxMjEzLDYgQEAKIAlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKShwb2lkX3Bhcl9wcml2LT5hZGFwdGVyX2NvbnRleHQpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gUVVFUllfT0lEKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEOwpAQCAtMTI5Niw3ICsxMjI5LDYgQEAKIAl9IGVsc2UgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEzMDYsNyArMTIzOCw2IEBACiAJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBvaWRfcGFyX3ByaXYtPnR5cGVfb2Zfb2lkICE9IFFVRVJZX09JRCkKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRDsKQEAgLTEzMjEsNyArMTI1Miw2IEBACiAJCSAoIi1ydGw4MTg4ZXVfb2lkX3J0X2dldF9lZnVzZV9tYXhfc2l6ZV9oZGw6IHNpemU9JWQgc3RhdHVzPTB4JTA4WFxuIiwKIAkJICAqKGludCAqKXBvaWRfcGFyX3ByaXYtPmluZm9ybWF0aW9uX2J1Ziwgc3RhdHVzKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEzMzAsNyArMTI2MCw2IEBACiB7CiAJaW50IHN0YXR1czsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sICgiK3J0bDgxODhldV9vaWRfcnRfcHJvX2VmdXNlX2hkbFxuIikpOwogCkBAIC0xMzQxLDcgKzEyNzAsNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfaW5mb18sICgiLXJ0bDgxODhldV9vaWRfcnRfcHJvX2VmdXNlX2hkbDogc3RhdHVzPTB4JTA4WFxuIiwgc3RhdHVzKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEzNTMsNyArMTI4MSw2IEBACiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikocG9pZF9wYXJfcHJpdi0+YWRhcHRlcl9jb250ZXh0KTsKIAl1MTYJbWFwbGVuID0gMDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9tcF8sIF9kcnZfbm90aWNlXywgKCIrcnRsODE4OGV1X29pZF9ydF9wcm9fZWZ1c2VfbWFwX2hkbFxuIikpOwogCkBAIC0xMzk4LDcgKzEzMjUsNiBAQAogCVJUX1RSQUNFKF9tb2R1bGVfbXBfLCBfZHJ2X2luZm9fLAogCQkgKCItcnRsODE4OGV1X29pZF9ydF9wcm9fZWZ1c2VfbWFwX2hkbDogc3RhdHVzPTB4JTA4WFxuIiwgc3RhdHVzKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE0MTQsNyArMTM0MCw2IEBACiAJdTgJCXJ4X3BrdF90eXBlOwogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9ub3RpY2VfLCAoIitydGw4MTg4ZXVfb2lkX3J0X3NldF9yeF9wYWNrZXRfdHlwZV9oZGxcbiIpKTsKIApAQCAtMTQyNyw3ICsxMzUyLDYgQEAKIAlyeF9wa3RfdHlwZSA9ICooKHU4ICopcG9pZF9wYXJfcHJpdi0+aW5mb3JtYXRpb25fYnVmKTsvKiA0ICovCiAKIAlSVF9UUkFDRShfbW9kdWxlX21wXywgX2Rydl9pbmZvXywgKCJyeF9wa3RfdHlwZTogJXhcbiIsIHJ4X3BrdF90eXBlKSk7Ci1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNDgyLDcgKzE0MDYsNiBAQAogewogCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAocG9pZF9wYXJfcHJpdi0+dHlwZV9vZl9vaWQgIT0gU0VUX09JRCkgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19OT1RfQUNDRVBURUQ7CkBAIC0xNDk3LDcgKzE0MjAsNiBAQAogCS8qIENBTEwgIHRoZSBwb3dlcl9kb3duIGZ1bmN0aW9uICovCiAJX2lycWxldmVsX2NoYW5nZWRfKCZvbGRpcnFsLCBSQUlTRSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcDJwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3AycC5jCmluZGV4IDZlOGMwNmUuLjk0MjVjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcDJwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wMnAuYwpAQCAtNTcsMTMgKzU3LDEzIEBACiAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7CiAJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJLyogbG9vayB1cCBzdGEgYXNvY19xdWV1ZSAqLwogCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGFzb2NfbGlzdCk7CisJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCiAJCWlmIChwc3RhLT5pc19wMnBfZGV2aWNlKSB7CkBAIC04MjQsNyArODI0LDcgQEAKIAlpZiAocnR3X3AycF9jaGtfcm9sZShwd2RpbmZvLCBQMlBfUk9MRV9ERVZJQ0UpIHx8IHJ0d19wMnBfY2hrX3JvbGUocHdkaW5mbywgUDJQX1JPTEVfR08pKSB7CiAJCXAycGllID0gcnR3X2dldF9wMnBfaWUocGZyYW1lICsgV0xBTl9IRFJfQTNfTEVOICsgX1BST0JFUkVRX0lFX09GRlNFVF8gLCBsZW4gLSBXTEFOX0hEUl9BM19MRU4gLSBfUFJPQkVSRVFfSUVfT0ZGU0VUXyAsIE5VTEwsICZwMnBpZWxlbik7CiAJCWlmIChwMnBpZSkgewotCQkJaWYgKChwICE9IE5VTEwpICYmIF9ydHdfbWVtY21wKCh2b2lkICopKHArMiksICh2b2lkICopcHdkaW5mby0+cDJwX3dpbGRjYXJkX3NzaWQgLCA3KSkgeworCQkJaWYgKChwICE9IE5VTEwpICYmICFtZW1jbXAoKHZvaWQgKikocCsyKSwgKHZvaWQgKilwd2RpbmZvLT5wMnBfd2lsZGNhcmRfc3NpZCAsIDcpKSB7CiAJCQkJLyogdG9kbzogKi8KIAkJCQkvKiBDaGVjayBSZXF1ZXN0ZWQgRGV2aWNlIFR5cGUgYXR0cmlidXRlcyBpbiBXU0MgSUUuICovCiAJCQkJLyogQ2hlY2sgRGV2aWNlIElEIGF0dHJpYnV0ZSBpbiBQMlAgSUUgKi8KQEAgLTk3MiwyNCArOTcyLDI0IEBACiAJCXUzMglhdHRyX2NvbnRlbnRsZW4gPSAwOwogCiAJCWlmIChydHdfZ2V0X3AycF9hdHRyX2NvbnRlbnQocDJwX2llLCBwMnBfaWVsZW4sIFAyUF9BVFRSX0dST1VQX0lELCBncm91cGlkLCAmYXR0cl9jb250ZW50bGVuKSkgewotCQkJaWYgKF9ydHdfbWVtY21wKHB3ZGluZm8tPmRldmljZV9hZGRyLCBncm91cGlkLCBFVEhfQUxFTikgJiYKLQkJCSAgICBfcnR3X21lbWNtcChwd2RpbmZvLT5wMnBfZ3JvdXBfc3NpZCwgZ3JvdXBpZCtFVEhfQUxFTiwgcHdkaW5mby0+cDJwX2dyb3VwX3NzaWRfbGVuKSkgeworCQkJaWYgKCFtZW1jbXAocHdkaW5mby0+ZGV2aWNlX2FkZHIsIGdyb3VwaWQsIEVUSF9BTEVOKSAmJgorCQkJICAgICFtZW1jbXAocHdkaW5mby0+cDJwX2dyb3VwX3NzaWQsIGdyb3VwaWQrRVRIX0FMRU4sIHB3ZGluZm8tPnAycF9ncm91cF9zc2lkX2xlbikpIHsKIAkJCQlhdHRyX2NvbnRlbnRsZW4gPSAwOwogCQkJCWlmIChydHdfZ2V0X3AycF9hdHRyX2NvbnRlbnQocDJwX2llLCBwMnBfaWVsZW4sIFAyUF9BVFRSX0RFVklDRV9JRCwgZGV2X2FkZHIsICZhdHRyX2NvbnRlbnRsZW4pKSB7CiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7CiAKIAkJCQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCQkJCQlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCQkJCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJCQkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQkJCQkvKiBsb29rIHVwIHN0YSBhc29jX3F1ZXVlICovCiAJCQkJCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJCQkJCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOworCQkJCQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwogCi0JCQkJCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJCQkJCWlmIChwc3RhLT5pc19wMnBfZGV2aWNlICYmIChwc3RhLT5kZXZfY2FwJlAyUF9ERVZDQVBfQ0xJRU5UX0RJU0NPVkVSQUJJTElUWSkgJiYKLQkJCQkJCSAgICBfcnR3X21lbWNtcChwc3RhLT5kZXZfYWRkciwgZGV2X2FkZHIsIEVUSF9BTEVOKSkgeworCQkJCQkJICAgICFtZW1jbXAocHN0YS0+ZGV2X2FkZHIsIGRldl9hZGRyLCBFVEhfQUxFTikpIHsKIAkJCQkJCQkvKiBpc3N1ZSBHTyBEaXNjb3ZlcmFiaWxpdHkgUmVxdWVzdCAqLwogCQkJCQkJCWlzc3VlX2dyb3VwX2Rpc2NfcmVxKHB3ZGluZm8sIHBzdGEtPmh3YWRkcik7CiAJCQkJCQkJc3RhdHVzID0gUDJQX1NUQVRVU19TVUNDRVNTOwpAQCAtMTExOCw3ICsxMTE4LDcgQEAKIAkJLyoJQ29tbWVudGVkIGJ5IEt1cnQgMjAxMjAxMTMgKi8KIAkJLyoJSWYgc29tZSBkZXZpY2Ugd2FudHMgdG8gZG8gcDJwIGhhbmRzaGFrZSB3aXRob3V0IHNlbmRpbmcgcHJvdl9kaXNjX3JlcSAqLwogCQkvKglXZSBoYXZlIHRvIGdldCBwZWVyX3JlcV9jbSBmcm9tIGhlcmUuICovCi0JCWlmIChfcnR3X21lbWNtcChwd2RpbmZvLT5yeF9wcm92X2Rpc2NfaW5mby5zdHJjb25maWdfbWV0aG9kX2Rlc2Nfb2ZfcHJvdl9kaXNjX3JlcSwgIjAwMCIsIDMpKSB7CisJCWlmICghbWVtY21wKHB3ZGluZm8tPnJ4X3Byb3ZfZGlzY19pbmZvLnN0cmNvbmZpZ19tZXRob2RfZGVzY19vZl9wcm92X2Rpc2NfcmVxLCAiMDAwIiwgMykpIHsKIAkJCXJ0d19nZXRfd3BzX2F0dHJfY29udGVudCh3cHNpZSwgd3BzX2llbGVuLCBXUFNfQVRUUl9ERVZJQ0VfUFdJRCwgKHU4ICopJmJlX3RtcCwgJndwc19kZXZpY2VwYXNzd29yZF9pZF9sZW4pOwogCQkJd3BzX2RldmljZXBhc3N3b3JkX2lkID0gYmUxNl90b19jcHUoYmVfdG1wKTsKIApAQCAtMTQ5OCw3ICsxNDk4LDYgQEAKIAlzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZAlzc2lkOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCV9ydHdfbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopJnNzaWQsIDAsIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCkpOwogCW1lbWNweShzc2lkLlNzaWQsIHB3ZGluZm8tPnAycF93aWxkY2FyZF9zc2lkLCBQMlBfV0lMRENBUkRfU1NJRF9MRU4pOwpAQCAtMTUwOSw3ICsxNTA4LDYgQEAKICAgICAgICAgc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogICAgICAgICBydHdfc2l0ZXN1cnZleV9jbWQocGFkYXB0ZXIsICZzc2lkLCAxLCBOVUxMLCAwKTsKICAgICAgICAgc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBwMnBfY29uY3VycmVudF9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CkBAIC0xNTE4LDcgKzE1MTYsNiBAQAogewogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8gICpwd2RpbmZvID0gJnBhZGFwdGVyLT53ZGluZm87CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAocnR3X3AycF9jaGtfc3RhdGUocHdkaW5mbywgUDJQX1NUQVRFX0dPTkVHT19JTkcpIHx8IHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9HT05FR09fRkFJTCkpCiAJCXJ0d19wMnBfc2V0X3JvbGUocHdkaW5mbywgUDJQX1JPTEVfREVWSUNFKTsKIAlydHdfcDJwX3NldF9zdGF0ZShwd2RpbmZvLCBydHdfcDJwX3ByZV9zdGF0ZShwd2RpbmZvKSk7CkBAIC0xNTI4LDU0ICsxNTI1LDQ2IEBACiAJCS8qCWJlY2F1c2UgdGhpcyBQMlAgY2xpZW50IHNob3VsZCBzdGF5IGF0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBvZiBQMlAgR08uICovCiAJCXNldF9jaGFubmVsX2J3bW9kZShwYWRhcHRlciwgcHdkaW5mby0+bGlzdGVuX2NoYW5uZWwsIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsIEhUX0NIQU5ORUxfV0lEVEhfMjApOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBwcmVfdHhfaW52aXRlcmVxX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8gICpwd2RpbmZvID0gJnBhZGFwdGVyLT53ZGluZm87CiAJdTgJdmFsOCA9IDE7Ci1fZnVuY19lbnRlcl87CiAKIAlzZXRfY2hhbm5lbF9id21vZGUocGFkYXB0ZXIsIHB3ZGluZm8tPmludml0ZXJlcV9pbmZvLnBlZXJfY2gsIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsIEhUX0NIQU5ORUxfV0lEVEhfMjApOwogCXBhZGFwdGVyLT5IYWxGdW5jLlNldEh3UmVnSGFuZGxlcihwYWRhcHRlciwgSFdfVkFSX01MTUVfU0lURVNVUlZFWSwgKHU4ICopKCZ2YWw4KSk7CiAJaXNzdWVfcHJvYmVyZXFfcDJwKHBhZGFwdGVyLCBOVUxMKTsKIAlfc2V0X3RpbWVyKCZwd2RpbmZvLT5wcmVfdHhfc2Nhbl90aW1lciwgUDJQX1RYX1BSRVNDQU5fVElNRU9VVCk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBwcmVfdHhfcHJvdmRpc2NfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbyAgKnB3ZGluZm8gPSAmcGFkYXB0ZXItPndkaW5mbzsKIAl1OAl2YWw4ID0gMTsKLV9mdW5jX2VudGVyXzsKIAogCXNldF9jaGFubmVsX2J3bW9kZShwYWRhcHRlciwgcHdkaW5mby0+dHhfcHJvdl9kaXNjX2luZm8ucGVlcl9jaGFubmVsX251bVswXSwgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwgSFRfQ0hBTk5FTF9XSURUSF8yMCk7CiAJcnR3X2hhbF9zZXRfaHdyZWcocGFkYXB0ZXIsIEhXX1ZBUl9NTE1FX1NJVEVTVVJWRVksICh1OCAqKSgmdmFsOCkpOwogCWlzc3VlX3Byb2JlcmVxX3AycChwYWRhcHRlciwgTlVMTCk7CiAJX3NldF90aW1lcigmcHdkaW5mby0+cHJlX3R4X3NjYW5fdGltZXIsIFAyUF9UWF9QUkVTQ0FOX1RJTUVPVVQpOwogCi1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgcHJlX3R4X25lZ29yZXFfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbyAgKnB3ZGluZm8gPSAmcGFkYXB0ZXItPndkaW5mbzsKIAl1OAl2YWw4ID0gMTsKLV9mdW5jX2VudGVyXzsKIAogCXNldF9jaGFubmVsX2J3bW9kZShwYWRhcHRlciwgcHdkaW5mby0+bmVnb19yZXFfaW5mby5wZWVyX2NoYW5uZWxfbnVtWzBdLCBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFLCBIVF9DSEFOTkVMX1dJRFRIXzIwKTsKIAlydHdfaGFsX3NldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX01MTUVfU0lURVNVUlZFWSwgKHU4ICopKCZ2YWw4KSk7CiAJaXNzdWVfcHJvYmVyZXFfcDJwKHBhZGFwdGVyLCBOVUxMKTsKIAlfc2V0X3RpbWVyKCZwd2RpbmZvLT5wcmVfdHhfc2Nhbl90aW1lciwgUDJQX1RYX1BSRVNDQU5fVElNRU9VVCk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHAycF9wcm90b2NvbF93a19oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgaW50Q21kVHlwZSkKIHsKLV9mdW5jX2VudGVyXzsKIAlzd2l0Y2ggKGludENtZFR5cGUpIHsKIAljYXNlIFAyUF9GSU5EX1BIQVNFX1dLOgogCQlmaW5kX3BoYXNlX2hhbmRsZXIocGFkYXB0ZXIpOwpAQCAtMTU5NCw3ICsxNTgzLDYgQEAKIAkJYnJlYWs7CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBwcm9jZXNzX3AycF9wc19pZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpJRXMsIHUzMiBJRUxlbmd0aCkKQEAgLTE2MTAsNyArMTU5OCw2IEBACiAJdTgJZmluZF9wMnAgPSBmYWxzZSwgZmluZF9wMnBfcHMgPSBmYWxzZTsKIAl1OAlub2Ffb2Zmc2V0LCBub2FfbnVtLCBub2FfaW5kZXg7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChydHdfcDJwX2Noa19zdGF0ZShwd2RpbmZvLCBQMlBfU1RBVEVfTk9ORSkpCiAJCXJldHVybjsKQEAgLTE2ODMsNyArMTY3MCw2IEBACiAJCQlwMnBfcHNfd2tfY21kKHBhZGFwdGVyLCBQMlBfUFNfRElTQUJMRSwgMSk7CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBwMnBfcHNfd2tfaGRsKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggcDJwX3BzX3N0YXRlKQpAQCAtMTY5MSw3ICsxNjc3LDYgQEAKIAlzdHJ1Y3QgcHdyY3RybF9wcml2CQkqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbwkqcHdkaW5mbyA9ICYocGFkYXB0ZXItPndkaW5mbyk7CiAKLV9mdW5jX2VudGVyXzsKIAogCS8qICBQcmUgYWN0aW9uIGZvciBwMnAgc3RhdGUgKi8KIAlzd2l0Y2ggKHAycF9wc19zdGF0ZSkgewpAQCAtMTczOCw3ICsxNzIzLDYgQEAKIAkJYnJlYWs7CiAJfQogCi1fZnVuY19leGl0XzsKIH0KIAogdTggcDJwX3BzX3drX2NtZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHAycF9wc19zdGF0ZSwgdTggZW5xdWV1ZSkKQEAgLTE3NDksNyArMTczMyw2IEBACiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9OT05FKSkKIAkJcmV0dXJuIHJlczsKQEAgLTE3ODEsNyArMTc2NCw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTIwMjQsMTEgKzIwMDYsMTEgQEAKIAogCQkvKiBEaXNhYmxlIFAyUCBmdW5jdGlvbiAqLwogCQlpZiAoIXJ0d19wMnBfY2hrX3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9OT05FKSkgewotCQkJX2NhbmNlbF90aW1lcl9leCgmcHdkaW5mby0+ZmluZF9waGFzZV90aW1lcik7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCZwd2RpbmZvLT5yZXN0b3JlX3AycF9zdGF0ZV90aW1lcik7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCZwd2RpbmZvLT5wcmVfdHhfc2Nhbl90aW1lcik7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCZwd2RpbmZvLT5yZXNldF9jaF9zaXRlc3VydmV5KTsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJnB3ZGluZm8tPnJlc2V0X2NoX3NpdGVzdXJ2ZXkyKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwd2RpbmZvLT5maW5kX3BoYXNlX3RpbWVyKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwd2RpbmZvLT5yZXN0b3JlX3AycF9zdGF0ZV90aW1lcik7CisJCQlkZWxfdGltZXJfc3luYygmcHdkaW5mby0+cHJlX3R4X3NjYW5fdGltZXIpOworCQkJZGVsX3RpbWVyX3N5bmMoJnB3ZGluZm8tPnJlc2V0X2NoX3NpdGVzdXJ2ZXkpOworCQkJZGVsX3RpbWVyX3N5bmMoJnB3ZGluZm8tPnJlc2V0X2NoX3NpdGVzdXJ2ZXkyKTsKIAkJCXJlc2V0X2NoX3NpdGVzdXJ2ZXlfdGltZXJfcHJvY2VzcyhwYWRhcHRlcik7CiAJCQlyZXNldF9jaF9zaXRlc3VydmV5X3RpbWVyX3Byb2Nlc3MyKHBhZGFwdGVyKTsKIAkJCXJ0d19wMnBfc2V0X3N0YXRlKHB3ZGluZm8sIFAyUF9TVEFURV9OT05FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wd3JjdHJsLmMKaW5kZXggYjVkYjIyYy4uZjY1ODM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wd3JjdHJsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wd3JjdHJsLmMKQEAgLTIyNiwxMSArMjI2LDggQEAKIAl1OAlycHdtOwogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCi1fZnVuY19lbnRlcl87Ci0KIAlwc2x2ID0gUFNfU1RBVEUocHNsdik7CiAKLQogCWlmIChwd3Jwcml2LT5idGNvZXhfcmZvbikgewogCQlpZiAocHNsdiA8IFBTX1NUQVRFX1M0KQogCQkJcHNsdiA9IFBTX1NUQVRFX1MzOwpAQCAtMjc0LDggKzI3MSw2IEBACiAKIAlwd3Jwcml2LT50b2cgKz0gMHg4MDsKIAlwd3Jwcml2LT5jcHdtID0gcHNsdjsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB1OCBQU19SRFlfQ0hFQ0soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMzEzLDggKzMwOCw2IEBACiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbwkqcHdkaW5mbyA9ICYocGFkYXB0ZXItPndkaW5mbyk7CiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCiAKLV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X25vdGljZV8sCiAJCSAoIiVzOiBQb3dlck1vZGU9JWQgU21hcnRfUFM9JWRcbiIsCiAJCSAgX19mdW5jX18sIHBzX21vZGUsIHNtYXJ0X3BzKSk7CkBAIC0zNjIsOCArMzU1LDYgQEAKIAkJCXJ0d19zZXRfcnB3bShwYWRhcHRlciwgUFNfU1RBVEVfUzIpOwogCQl9CiAJfQotCi1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTQxMCw4ICs0MDEsNiBAQAogewogCXN0cnVjdCBwd3JjdHJsX3ByaXYJKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCi1fZnVuY19lbnRlcl87Ci0KIAlpZiAoUFNfUkRZX0NIRUNLKHBhZGFwdGVyKSA9PSBmYWxzZSkKIAkJcmV0dXJuOwogCkBAIC00MjgsOCArNDE3LDYgQEAKIAkJCXB3cnByaXYtPkxwc0lkbGVDb3VudCsrOwogCQl9CiAJfQotCi1fZnVuY19leGl0XzsKIH0KIAogI2RlZmluZSBMUFNfTEVBVkVfVElNRU9VVF9NUyAxMDAKQEAgLTQ0MCw4ICs0MjcsNiBAQAogewogCXN0cnVjdCBwd3JjdHJsX3ByaXYJKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCi1fZnVuY19lbnRlcl87Ci0KIAlpZiAocHdycHJpdi0+YkxlaXN1cmVQcykgewogCQlpZiAocHdycHJpdi0+cHdyX21vZGUgIT0gUFNfTU9ERV9BQ1RJVkUpIHsKIAkJCXJ0d19zZXRfcHNfbW9kZShwYWRhcHRlciwgUFNfTU9ERV9BQ1RJVkUsIDAsIDApOwpAQCAtNDUyLDggKzQzNyw2IEBACiAJfQogCiAJcHdycHJpdi0+YnBvd2VyX3NhdmluZyA9IGZhbHNlOwotCi1fZnVuY19leGl0XzsKIH0KIAogLyogICovCkBAIC00NjUsMjMgKzQ0OCwxNyBAQAogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICYoQWRhcHRlci0+bWxtZXByaXYpOwogCXU4CWVucXVldWUgPSAwOwogCi1fZnVuY19lbnRlcl87Ci0KIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7IC8qIGNvbm5lY3QgKi8KIAkJcDJwX3BzX3drX2NtZChBZGFwdGVyLCBQMlBfUFNfRElTQUJMRSwgZW5xdWV1ZSk7CiAKIAkJcnR3X2xwc19jdHJsX3drX2NtZChBZGFwdGVyLCBMUFNfQ1RSTF9MRUFWRSwgZW5xdWV1ZSk7CiAJfQotCi1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfaW5pdF9wd3JjdHJsX3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAotX2Z1bmNfZW50ZXJfOwotCiAJX2luaXRfcHdybG9jaygmcHdyY3RybHByaXYtPmxvY2spOwogCXB3cmN0cmxwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29uOwogCXB3cmN0cmxwcml2LT5pcHNfZW50ZXJfY250cyA9IDA7CkBAIC01MTgsOCArNDk1LDYgQEAKIAlwd3JjdHJscHJpdi0+YnRjb2V4X3Jmb24gPSBmYWxzZTsKIAogCV9pbml0X3RpbWVyKCYocHdyY3RybHByaXYtPnB3cl9zdGF0ZV9jaGVja190aW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LCBwd3Jfc3RhdGVfY2hlY2tfaGFuZGxlciwgKHU4ICopcGFkYXB0ZXIpOwotCi1fZnVuY19leGl0XzsKIH0KIAogdTggcnR3X2ludGVyZmFjZV9wc19mdW5jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgZW51bSBoYWxfaW50Zl9wc19mdW5jIGVmdW5jX2lkLCB1OCAqdmFsKQpAQCAtNTQwLDcgKzUxNSw3IEBACiAvKgogKiBydHdfcHdyX3dha2V1cCAtIFdha2UgdGhlIE5JQyB1cCBmcm9tOiAxKUlQUy4gMilVU0IgYXV0b3N1c3BlbmQKICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gc3RydWN0IGFkYXB0ZXIgc3RydWN0dXJlCi0qIEBpcHNfZGVmZmVyX21zOiB0aGUgbXMgd2lpbCBwcmV2ZW50IGZyb20gZmFsbGluZyBpbnRvIElQUyBhZnRlciB3YWtldXAKKyogQGlwc19kZWZmZXJfbXM6IHRoZSBtcyB3aWxsIHByZXZlbnQgZnJvbSBmYWxsaW5nIGludG8gSVBTIGFmdGVyIHdha2V1cAogKiBSZXR1cm4gX1NVQ0NFU1Mgb3IgX0ZBSUwKICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZWN2LmMKaW5kZXggYzljMTgwNi4uNjM2ZWM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZWN2LmMKQEAgLTIzLDExICsyMywxMiBAQAogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KICNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8aXAuaD4KLSNpbmNsdWRlIDxpZl9ldGhlci5oPgotI2luY2x1ZGUgPGV0aGVybmV0Lmg+CiAjaW5jbHVkZSA8dXNiX29wcy5oPgogI2luY2x1ZGUgPHdpZmkuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNkZWZpbmUgRVRIRVJORVRfSEVBREVSX1NJWkUJMTQJLyogIEV0aGVybmV0IEhlYWRlciBMZW5ndGggKi8KKyNkZWZpbmUgTExDX0hFQURFUl9TSVpFCQkJNgkvKiAgTExDIEhlYWRlciBMZW5ndGggKi8KIAogc3RhdGljIHU4IFNOQVBfRVRIX1RZUEVfSVBYWzJdID0gezB4ODEsIDB4Mzd9Owogc3RhdGljIHU4IFNOQVBfRVRIX1RZUEVfQVBQTEVUQUxLX0FBUlBbMl0gPSB7MHg4MCwgMHhmM307CkBAIC00NSw3ICs0Niw2IEBACiAKIHZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpCiB7Ci1fZnVuY19lbnRlcl87CiAKIAlfcnR3X21lbXNldCgodTggKilwc3RhX3JlY3Zwcml2LCAwLCBzaXplb2YgKHN0cnVjdCBzdGFfcmVjdl9wcml2KSk7CiAKQEAgLTUzLDE4ICs1MywxNiBAQAogCiAJX3J0d19pbml0X3F1ZXVlKCZwc3RhX3JlY3Zwcml2LT5kZWZyYWdfcSk7CiAKLV9mdW5jX2V4aXRfOwogfQogCiBpbnQgX3J0d19pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsIHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlpbnQgaTsKIAotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWU7CiAKIAlpbnQJcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAlzcGluX2xvY2tfaW5pdCgmcHJlY3Zwcml2LT5sb2NrKTsKIAogCV9ydHdfaW5pdF9xdWV1ZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpOwpAQCAtNzcsNyArNzUsNyBAQAogCiAJcnR3X29zX3JlY3ZfcmVzb3VyY2VfaW5pdChwcmVjdnByaXYsIHBhZGFwdGVyKTsKIAotCXByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYgPSBydHdfenZtYWxsb2MoTlJfUkVDVkZSQU1FICogc2l6ZW9mKHVuaW9uIHJlY3ZfZnJhbWUpICsgUlhGUkFNRV9BTElHTl9TWik7CisJcHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiA9IHZ6YWxsb2MoTlJfUkVDVkZSQU1FICogc2l6ZW9mKHN0cnVjdCByZWN2X2ZyYW1lKSArIFJYRlJBTUVfQUxJR05fU1opOwogCiAJaWYgKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsKQEAgLTg2LDE4ICs4NCwxOSBAQAogCiAJcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWYgPSAodTggKilOX0JZVEVfQUxJR01FTlQoKHNpemVfdCkocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiksIFJYRlJBTUVfQUxJR05fU1opOwogCi0JcHJlY3ZmcmFtZSA9ICh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWY7CisJcHJlY3ZmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2cHJpdi0+cHJlY3ZfZnJhbWVfYnVmOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZGUkFNRTsgaSsrKSB7Ci0JCV9ydHdfaW5pdF9saXN0aGVhZCgmKHByZWN2ZnJhbWUtPnUubGlzdCkpOworCQlfcnR3X2luaXRfbGlzdGhlYWQoJihwcmVjdmZyYW1lLT5saXN0KSk7CiAKLQkJcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmVjdmZyYW1lLT51Lmxpc3QpLCAmKHByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlLnF1ZXVlKSk7CisJCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJlY3ZmcmFtZS0+bGlzdCksCisJCQkJICAgICAmKHByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlLnF1ZXVlKSk7CiAKIAkJcmVzID0gcnR3X29zX3JlY3ZfcmVzb3VyY2VfYWxsb2MocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwogCi0JCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiA9IDA7CisJCXByZWN2ZnJhbWUtPmxlbiA9IDA7CiAKLQkJcHJlY3ZmcmFtZS0+dS5oZHIuYWRhcHRlciA9IHBhZGFwdGVyOworCQlwcmVjdmZyYW1lLT5hZGFwdGVyID0gcGFkYXB0ZXI7CiAJCXByZWN2ZnJhbWUrKzsKIAl9CiAJcHJlY3Zwcml2LT5yeF9wZW5kaW5nX2NudCA9IDE7CkBAIC0xMTMsNyArMTEyLDYgQEAKIAlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKHByZWN2cHJpdik7CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMjIsNDAgKzEyMCwzNyBAQAogewogCXN0cnVjdCBhZGFwdGVyCSpwYWRhcHRlciA9IHByZWN2cHJpdi0+YWRhcHRlcjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcnR3X2ZyZWVfdWNfc3dkZWNfcGVuZGluZ19xdWV1ZShwYWRhcHRlcik7CiAKIAlydHdfb3NfcmVjdl9yZXNvdXJjZV9mcmVlKHByZWN2cHJpdik7CiAKIAlpZiAocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZikgewotCQlydHdfdm1mcmVlKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYsIE5SX1JFQ1ZGUkFNRSAqIHNpemVvZih1bmlvbiByZWN2X2ZyYW1lKSArIFJYRlJBTUVfQUxJR05fU1opOworCQl2ZnJlZShwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKTsKIAl9CiAKIAlydHdfaGFsX2ZyZWVfcmVjdl9wcml2KHBhZGFwdGVyKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKLXVuaW9uIHJlY3ZfZnJhbWUgKl9ydHdfYWxsb2NfcmVjdmZyYW1lIChzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKK3N0cnVjdCByZWN2X2ZyYW1lICpfcnR3X2FsbG9jX3JlY3ZmcmFtZSAoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCiB7Ci0JdW5pb24gcmVjdl9mcmFtZSAgKnByZWN2ZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKmhkcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcjsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXY7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAoX3J0d19xdWV1ZV9lbXB0eShwZnJlZV9yZWN2X3F1ZXVlKSkgewotCQlwcmVjdmZyYW1lID0gTlVMTDsKKwkJaGRyID0gTlVMTDsKIAl9IGVsc2UgewogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyZWVfcmVjdl9xdWV1ZSk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKLQkJcHJlY3ZmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKKwkJaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CiAKLQkJcnR3X2xpc3RfZGVsZXRlKCZwcmVjdmZyYW1lLT51Lmhkci5saXN0KTsKLQkJcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT51Lmhkci5hZGFwdGVyOworCQlydHdfbGlzdF9kZWxldGUoJmhkci0+bGlzdCk7CisJCXBhZGFwdGVyID0gaGRyLT5hZGFwdGVyOwogCQlpZiAocGFkYXB0ZXIgIT0gTlVMTCkgewogCQkJcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKIAkJCWlmIChwZnJlZV9yZWN2X3F1ZXVlID09ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSkKQEAgLTE2MywxNCArMTU4LDEzIEBACiAJCX0KIAl9CiAKLV9mdW5jX2V4aXRfOwogCi0JcmV0dXJuIHByZWN2ZnJhbWU7CisJcmV0dXJuIChzdHJ1Y3QgcmVjdl9mcmFtZSAqKWhkcjsKIH0KIAotdW5pb24gcmVjdl9mcmFtZSAqcnR3X2FsbG9jX3JlY3ZmcmFtZSAoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCitzdHJ1Y3QgcmVjdl9mcmFtZSAqcnR3X2FsbG9jX3JlY3ZmcmFtZShzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKIHsKLQl1bmlvbiByZWN2X2ZyYW1lICAqcHJlY3ZmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAgKnByZWN2ZnJhbWU7CiAKIAlzcGluX2xvY2tfYmgoJnBmcmVlX3JlY3ZfcXVldWUtPmxvY2spOwogCkBAIC0xODEsMzYgKzE3NSwzNiBAQAogCXJldHVybiBwcmVjdmZyYW1lOwogfQogCi12b2lkIHJ0d19pbml0X3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpCit2b2lkIHJ0d19pbml0X3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KQogewogCS8qIFBlcnJ5OiBUaGlzIGNhbiBiZSByZW1vdmVkICovCi0JX3J0d19pbml0X2xpc3RoZWFkKCZwcmVjdmZyYW1lLT51Lmhkci5saXN0KTsKKwlfcnR3X2luaXRfbGlzdGhlYWQoJnByZWN2ZnJhbWUtPmxpc3QpOwogCi0JcHJlY3ZmcmFtZS0+dS5oZHIubGVuID0gMDsKKwlwcmVjdmZyYW1lLT5sZW4gPSAwOwogfQogCi1pbnQgcnR3X2ZyZWVfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKQoraW50IHJ0d19mcmVlX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKKwkJICAgICAgIHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKQogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcjsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAoIXByZWN2ZnJhbWUpCiAJCXJldHVybiBfRkFJTDsKLQlwYWRhcHRlciA9IHByZWN2ZnJhbWUtPnUuaGRyLmFkYXB0ZXI7CisJcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwogCXByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0JaWYgKHByZWN2ZnJhbWUtPnUuaGRyLnBrdCkgewotCQlkZXZfa2ZyZWVfc2tiX2FueShwcmVjdmZyYW1lLT51Lmhkci5wa3QpOy8qIGZyZWUgc2tiIGJ5IGRyaXZlciAqLwotCQlwcmVjdmZyYW1lLT51Lmhkci5wa3QgPSBOVUxMOworCWlmIChwcmVjdmZyYW1lLT5wa3QpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocHJlY3ZmcmFtZS0+cGt0KTsvKiBmcmVlIHNrYiBieSBkcml2ZXIgKi8KKwkJcHJlY3ZmcmFtZS0+cGt0ID0gTlVMTDsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnBmcmVlX3JlY3ZfcXVldWUtPmxvY2spOwogCi0JcnR3X2xpc3RfZGVsZXRlKCYocHJlY3ZmcmFtZS0+dS5oZHIubGlzdCkpOworCXJ0d19saXN0X2RlbGV0ZSgmKHByZWN2ZnJhbWUtPmxpc3QpKTsKIAotCXByZWN2ZnJhbWUtPnUuaGRyLmxlbiA9IDA7CisJcHJlY3ZmcmFtZS0+bGVuID0gMDsKIAotCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJlY3ZmcmFtZS0+dS5oZHIubGlzdCksIGdldF9saXN0X2hlYWQocGZyZWVfcmVjdl9xdWV1ZSkpOworCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJlY3ZmcmFtZS0+bGlzdCksIGdldF9saXN0X2hlYWQocGZyZWVfcmVjdl9xdWV1ZSkpOwogCiAJaWYgKHBhZGFwdGVyICE9IE5VTEwpIHsKIAkJaWYgKHBmcmVlX3JlY3ZfcXVldWUgPT0gJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlKQpAQCAtMjE5LDMyICsyMTMsMjkgQEAKIAogICAgICAgc3Bpbl91bmxvY2tfYmgoJnBmcmVlX3JlY3ZfcXVldWUtPmxvY2spOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotaW50IF9ydHdfZW5xdWV1ZV9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnF1ZXVlKQoraW50IF9ydHdfZW5xdWV1ZV9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSkKIHsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT51Lmhkci5hZGFwdGVyOworCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCi0JcnR3X2xpc3RfZGVsZXRlKCYocHJlY3ZmcmFtZS0+dS5oZHIubGlzdCkpOwotCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJlY3ZmcmFtZS0+dS5oZHIubGlzdCksIGdldF9saXN0X2hlYWQocXVldWUpKTsKKwlydHdfbGlzdF9kZWxldGUoJihwcmVjdmZyYW1lLT5saXN0KSk7CisJcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmVjdmZyYW1lLT5saXN0KSwgZ2V0X2xpc3RfaGVhZChxdWV1ZSkpOwogCiAJaWYgKHBhZGFwdGVyICE9IE5VTEwpIHsKIAkJaWYgKHF1ZXVlID09ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSkKIAkJCXByZWN2cHJpdi0+ZnJlZV9yZWN2ZnJhbWVfY250Kys7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotaW50IHJ0d19lbnF1ZXVlX3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpCitpbnQgcnR3X2VucXVldWVfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgX19xdWV1ZSAqcXVldWUpCiB7CiAJaW50IHJldDsKIApAQCAtMjY1LDMyICsyNTYsMzAgQEAKIAogdm9pZCBydHdfZnJlZV9yZWN2ZnJhbWVfcXVldWUoc3RydWN0IF9fcXVldWUgKnBmcmFtZXF1ZXVlLCAgc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCiB7Ci0JdW5pb24JcmVjdl9mcmFtZQkqcHJlY3ZmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqaGRyOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAKLV9mdW5jX2VudGVyXzsKIAlzcGluX2xvY2soJnBmcmFtZXF1ZXVlLT5sb2NrKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IGZhbHNlKSB7Ci0JCXByZWN2ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdSk7CisJCWhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCi0JCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmVjdmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKKwkJcnR3X2ZyZWVfcmVjdmZyYW1lKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKWhkciwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAJfQogCiAJc3Bpbl91bmxvY2soJnBmcmFtZXF1ZXVlLT5sb2NrKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHUzMiBydHdfZnJlZV91Y19zd2RlY19wZW5kaW5nX3F1ZXVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCXUzMiBjbnQgPSAwOwotCXVuaW9uIHJlY3ZfZnJhbWUgKnBlbmRpbmdfZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnBlbmRpbmdfZnJhbWU7CiAJd2hpbGUgKChwZW5kaW5nX2ZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZSgmYWRhcHRlci0+cmVjdnByaXYudWNfc3dkZWNfcGVuZGluZ19xdWV1ZSkpKSB7CiAJCXJ0d19mcmVlX3JlY3ZmcmFtZShwZW5kaW5nX2ZyYW1lLCAmYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlKTsKIAkJREJHXzg4RSgiJXM6IGRlcXVldWUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZVxuIiwgX19mdW5jX18pOwpAQCAtMzM3LDkgKzMyNiw5IEBACiAJfSBlbHNlIHsKIAkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAotCQlwcmVjdmJ1ZiA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgcmVjdl9idWYsIGxpc3QpOworCQlwcmVjdmJ1ZiA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfYnVmLCBsaXN0KTsKIAogCQlydHdfbGlzdF9kZWxldGUoJnByZWN2YnVmLT5saXN0KTsKIAl9CkBAIC0zNDksNyArMzM4LDggQEAKIAlyZXR1cm4gcHJlY3ZidWY7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdmZyYW1lX2Noa21pYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCitzdGF0aWMgaW50IHJlY3ZmcmFtZV9jaGttaWMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7CiAJaW50CWksIHJlcyA9IF9TVUNDRVNTOwogCXUzMglkYXRhbGVuOwpAQCAtMzU4LDEyICszNDgsMTEgQEAKIAl1OAkqcGZyYW1lLCAqcGF5bG9hZCwgKnBmcmFtZW1pYzsKIAl1OAkqbWlja2V5OwogCXN0cnVjdAlzdGFfaW5mbwkJKnN0YWluZm87Ci0Jc3RydWN0CXJ4X3BrdF9hdHRyaWIJKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0CXJ4X3BrdF9hdHRyaWIJKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7CiAJc3RydWN0CXNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJmFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7Ci1fZnVuY19lbnRlcl87CiAKIAlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvKCZhZGFwdGVyLT5zdGFwcml2LCAmcHJ4YXR0cmliLT50YVswXSk7CiAKQEAgLTM3NSwyMyArMzY0LDI0IEBACiAJCS8qIGNhbGN1bGF0ZSBtaWMgY29kZSAqLwogCQlpZiAoc3RhaW5mbyAhPSBOVUxMKSB7CiAJCQlpZiAoSVNfTUNBU1QocHJ4YXR0cmliLT5yYSkpIHsKLQkJCQltaWNrZXkgPSAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHJ4bWlja2V5W3ByeGF0dHJpYi0+a2V5X2luZGV4XS5za2V5WzBdOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgiXG4gcmVjdmZyYW1lX2Noa21pYzogYmNtYyBrZXlcbiIpKTsKLQogCQkJCWlmICghcHNlY3VyaXR5cHJpdikgewogCQkJCQlyZXMgPSBfRkFJTDsKIAkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJcbiByZWN2ZnJhbWVfY2hrbWljOmRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSEhISEhISEhISFcbiIpKTsKIAkJCQkJREJHXzg4RSgiXG4gcmVjdmZyYW1lX2Noa21pYzpkaWRuJ3QgaW5zdGFsbCBncm91cCBrZXkhISEhISEhISEhXG4iKTsKIAkJCQkJZ290byBleGl0OwogCQkJCX0KKwkJCQltaWNrZXkgPSAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHJ4bWlja2V5W3ByeGF0dHJpYi0+a2V5X2luZGV4XS5za2V5WzBdOworCisJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgiXG4gcmVjdmZyYW1lX2Noa21pYzogYmNtYyBrZXlcbiIpKTsKIAkJCX0gZWxzZSB7CiAJCQkJbWlja2V5ID0gJnN0YWluZm8tPmRvdDExdGtpcHJ4bWlja2V5LnNrZXlbMF07CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJcbiByZWN2ZnJhbWVfY2hrbWljOiB1bmljYXN0IGtleVxuIikpOwogCQkJfQogCi0JCQlkYXRhbGVuID0gcHJlY3ZmcmFtZS0+dS5oZHIubGVuLXByeGF0dHJpYi0+aGRybGVuLXByeGF0dHJpYi0+aXZfbGVuLXByeGF0dHJpYi0+aWN2X2xlbi04Oy8qIGljdl9sZW4gaW5jbHVkZWQgdGhlIG1pYyBjb2RlICovCi0JCQlwZnJhbWUgPSBwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhOworCQkJLyogaWN2X2xlbiBpbmNsdWRlZCB0aGUgbWljIGNvZGUgKi8KKwkJCWRhdGFsZW4gPSBwcmVjdmZyYW1lLT5sZW4tcHJ4YXR0cmliLT5oZHJsZW4gLQorCQkJCSAgcHJ4YXR0cmliLT5pdl9sZW4tcHJ4YXR0cmliLT5pY3ZfbGVuLTg7CisJCQlwZnJhbWUgPSBwcmVjdmZyYW1lLT5yeF9kYXRhOwogCQkJcGF5bG9hZCA9IHBmcmFtZStwcnhhdHRyaWItPmhkcmxlbitwcnhhdHRyaWItPml2X2xlbjsKIAogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgiXG4gcHJ4YXR0cmliLT5pdl9sZW49JWQgcHJ4YXR0cmliLT5pY3ZfbGVuPSVkXG4iLCBwcnhhdHRyaWItPml2X2xlbiwgcHJ4YXR0cmliLT5pY3ZfbGVuKSk7CkBAIC00MjQsMTYgKzQxNCwzMCBAQAogCQkJCQkgKihwZnJhbWVtaWMtMTApLCAqKHBmcmFtZW1pYy05KSkpOwogCQkJCXsKIAkJCQkJdWludCBpOwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIlxuID09PT09PWRlbXAgcGFja2V0IChsZW49JWQpPT09PT09XG4iLCBwcmVjdmZyYW1lLT51Lmhkci5sZW4pKTsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHByZWN2ZnJhbWUtPnUuaGRyLmxlbjsgaSA9IGkrOCkgewotCQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCIweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4IiwKLQkJCQkJCQkgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2kpLCAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSsxKSwKLQkJCQkJCQkgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2krMiksICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKzMpLAotCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSs0KSwgKihwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhK2krNSksCi0JCQkJCQkJICoocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YStpKzYpLCAqKHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEraSs3KSkpOworCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAorCQkJCQkJICgiXG4gPT09PT09ZGVtcCBwYWNrZXQgKGxlbj0lZCk9PT09PT1cbiIsCisJCQkJCQkgcHJlY3ZmcmFtZS0+bGVuKSk7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBwcmVjdmZyYW1lLT5sZW47IGkgKz0gOCkgeworCQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCisJCQkJCQkJIF9kcnZfZXJyXywKKwkJCQkJCQkgKCIweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4IiwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2kpLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSsxKSwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2krMiksCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKzMpLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSs0KSwKKwkJCQkJCQkgKihwcmVjdmZyYW1lLT5yeF9kYXRhK2krNSksCisJCQkJCQkJICoocHJlY3ZmcmFtZS0+cnhfZGF0YStpKzYpLAorCQkJCQkJCSAqKHByZWN2ZnJhbWUtPnJ4X2RhdGEraSs3KSkpOwogCQkJCQl9Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiXG4gPT09PT09IGRlbXAgcGFja2V0IGVuZCBbbGVuPSVkXT09PT09PVxuIiwgcHJlY3ZmcmFtZS0+dS5oZHIubGVuKSk7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiXG4gaHJkbGVuPSVkLFxuIiwgcHJ4YXR0cmliLT5oZHJsZW4pKTsKKwkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCisJCQkJCQkgX2Rydl9lcnJfLAorCQkJCQkJICgiXG4gPT09PT09IGRlbXAgcGFja2V0IGVuZCBbbGVuPSVkXT09PT09PVxuIiwKKwkJCQkJCSBwcmVjdmZyYW1lLT5sZW4pKTsKKwkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCisJCQkJCQkgX2Rydl9lcnJfLAorCQkJCQkJICgiXG4gaHJkbGVuPSVkLFxuIiwKKwkJCQkJCSBwcnhhdHRyaWItPmhkcmxlbikpOwogCQkJCX0KIAogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCkBAIC00NzEsMjQgKzQ3NSwyMyBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CiAKIC8qIGRlY3J5cHQgYW5kIHNldCB0aGUgaXZsZW4sIGljdmxlbiBvZiB0aGUgcmVjdl9mcmFtZSAqLwotc3RhdGljIHVuaW9uIHJlY3ZfZnJhbWUgKmRlY3J5cHRvcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorc3RhdGljIHN0cnVjdCByZWN2X2ZyYW1lICpkZWNyeXB0b3Ioc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXVuaW9uIHJlY3ZfZnJhbWUgKnJldHVybl9wYWNrZXQgPSBwcmVjdl9mcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcmV0dXJuX3BhY2tldCA9IHByZWN2X2ZyYW1lOwogCXUzMgkgcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywgKCJwcnhzdGF0LT5kZWNyeXB0ZWQ9JXggcHJ4YXR0cmliLT5lbmNyeXB0PTB4JTAzeFxuIiwgcHJ4YXR0cmliLT5iZGVjcnlwdGVkLCBwcnhhdHRyaWItPmVuY3J5cHQpKTsKIAogCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgPiAwKSB7Ci0JCXU4ICppdiA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhK3ByeGF0dHJpYi0+aGRybGVuOworCQl1OCAqaXYgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YStwcnhhdHRyaWItPmhkcmxlbjsKIAkJcHJ4YXR0cmliLT5rZXlfaW5kZXggPSAoKChpdlszXSk+PjYpJjB4Myk7CiAKIAkJaWYgKHByeGF0dHJpYi0+a2V5X2luZGV4ID4gV0VQX0tFWVMpIHsKQEAgLTUzNCwzNCArNTM3LDMzIEBACiAJCXJldHVybl9wYWNrZXQgPSBOVUxMOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0dXJuX3BhY2tldDsKIH0KIAogLyogc2V0IHRoZSBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVjdl9mcmFtZSAqLwotc3RhdGljIHVuaW9uIHJlY3ZfZnJhbWUgKnBvcnRjdHJsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0YXRpYyBzdHJ1Y3QgcmVjdl9mcmFtZSAqcG9ydGN0cmwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXU4ICAgKnBzdGFfYWRkciA9IE5VTEwsICpwdHI7CiAJdWludCAgYXV0aF9hbGc7Ci0Jc3RydWN0IHJlY3ZfZnJhbWVfaGRyICpwZmhkcjsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGZoZHI7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXY7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcHJ0bmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpwcnRuZnJhbWU7CiAJdTE2CWV0aGVyX3R5cGUgPSAwOwogCXUxNiAgZWFwb2xfdHlwZSA9IDB4ODg4ZTsvKiBmb3IgRnVuaWEgQkQncyBXUEEgaXNzdWUgKi8KIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKIAlfX2JlMTYgYmVfdG1wOwogCi1fZnVuY19lbnRlcl87CiAKIAlwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwogCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBzdGFfYWRkcik7CiAKIAlhdXRoX2FsZyA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtOwogCi0JcHRyID0gZ2V0X3JlY3ZmcmFtZV9kYXRhKHByZWN2X2ZyYW1lKTsKLQlwZmhkciA9ICZwcmVjdl9mcmFtZS0+dS5oZHI7CisJcHRyID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CisJcGZoZHIgPSBwcmVjdl9mcmFtZTsKIAlwYXR0cmliID0gJnBmaGRyLT5hdHRyaWI7CiAJcHN0YV9hZGRyID0gcGF0dHJpYi0+dGE7CiAKQEAgLTU5Myw3ICs1OTUsOSBAQAogCQkJLyogYWxsb3dlZCAqLwogCQkJLyogY2hlY2sgZGVjcnlwdGlvbiBzdGF0dXMsIGFuZCBkZWNyeXB0IHRoZSBmcmFtZSBpZiBuZWVkZWQgKi8KIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoIiMjIyMjIyMjcG9ydGN0cmw6cHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQ9PTBcbiIpKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLCAoInBvcnRjdHJsOnByZWN2X2ZyYW1lLT5oZHIuYXR0cmliLnByaXZhY3k9JXhcbiIsIHByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWIucHJpdmFjeSkpOworCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCisJCQkJICgicG9ydGN0cmw6cHJlY3ZfZnJhbWUtPmhkci5hdHRyaWIucHJpdmFjeT0leFxuIiwKKwkJCQkgcHJlY3ZfZnJhbWUtPmF0dHJpYi5wcml2YWN5KSk7CiAKIAkJCWlmIChwYXR0cmliLT5iZGVjcnlwdGVkID09IDApCiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgicG9ydGN0cmw6cHJ4c3RhdC0+ZGVjcnlwdGVkPSV4XG4iLCBwYXR0cmliLT5iZGVjcnlwdGVkKSk7CkBAIC02MTMsMTkgKzYxNywxOCBAQAogCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJCXJldHVybiBwcnRuZnJhbWU7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9kZWNhY2hlKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCB1OCBicmV0cnksIHN0cnVjdCBzdGFpbmZvX3J4Y2FjaGUgKnByeGNhY2hlKQorc3RhdGljIGludCByZWN2X2RlY2FjaGUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCB1OCBicmV0cnksCisJCQlzdHJ1Y3Qgc3RhaW5mb19yeGNhY2hlICpwcnhjYWNoZSkKIHsKLQlpbnQgdGlkID0gcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5wcmlvcml0eTsKKwlpbnQgdGlkID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5wcmlvcml0eTsKIAotCXUxNiBzZXFfY3RybCA9ICgocHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5zZXFfbnVtJjB4ZmZmZikgPDwgNCkgfAotCQkocHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYi5mcmFnX251bSAmIDB4Zik7CisJdTE2IHNlcV9jdHJsID0gKChwcmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW0mMHhmZmZmKSA8PCA0KSB8CisJCShwcmVjdl9mcmFtZS0+YXR0cmliLmZyYWdfbnVtICYgMHhmKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHRpZCA+IDE1KSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sICgicmVjdl9kZWNhY2hlLCAodGlkPjE1KSEgc2VxX2N0cmw9MHgleCwgdGlkPTB4JXhcbiIsIHNlcV9jdHJsLCB0aWQpKTsKQEAgLTY0MywxOCArNjQ2LDE3IEBACiAKIAlwcnhjYWNoZS0+dGlkX3J4c2VxW3RpZF0gPSBzZXFfY3RybDsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXZvaWQgcHJvY2Vzc19wd3JiaXRfZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXZvaWQgcHJvY2Vzc19wd3JiaXRfZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQordm9pZCBwcm9jZXNzX3B3cmJpdF9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAjaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQogCXVuc2lnbmVkIGNoYXIgcHdyYml0OwotCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKIApAQCAtNjc1LDEwICs2NzcsMTEgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3dtbXBzX2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfd21tcHNfZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwogCkBAIC03MzAsMTUgKzczMywxNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIGNvdW50X3J4X3N0YXRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSwgc3RydWN0IHN0YV9pbmZvICpzdGEpCitzdGF0aWMgdm9pZCBjb3VudF9yeF9zdGF0cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSwKKwkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewogCWludAlzejsKIAlzdHJ1Y3Qgc3RhX2luZm8JCSpwc3RhID0gTlVMTDsKIAlzdHJ1Y3Qgc3RhaW5mb19zdGF0cwkqcHN0YXRzID0gTlVMTDsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwogCXN0cnVjdCByZWN2X3ByaXYJKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAKLQlzeiA9IGdldF9yZWN2ZnJhbWVfbGVuKHByZnJhbWUpOworCXN6ID0gcHJmcmFtZS0+bGVuOwogCXByZWN2cHJpdi0+cnhfYnl0ZXMgKz0gc3o7CiAKIAlwYWRhcHRlci0+bWxtZXByaXYuTGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kKys7CkBAIC03NDksNyArNzU0LDcgQEAKIAlpZiAoc3RhKQogCQlwc3RhID0gc3RhOwogCWVsc2UKLQkJcHN0YSA9IHByZnJhbWUtPnUuaGRyLnBzdGE7CisJCXBzdGEgPSBwcmZyYW1lLT5wc3RhOwogCiAJaWYgKHBzdGEpIHsKIAkJcHN0YXRzID0gJnBzdGEtPnN0YV9zdGF0czsKQEAgLTc2MSwxNSArNzY2LDE2IEBACiAKIGludCBzdGEyc3RhX2RhdGFfZnJhbWUoCiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCisJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAogCXN0cnVjdCBzdGFfaW5mbyAqKnBzdGEKICk7CiAKLWludCBzdGEyc3RhX2RhdGFfZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQoraW50IHN0YTJzdGFfZGF0YV9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAorCQkgICAgICAgc3RydWN0IHN0YV9pbmZvICoqcHN0YSkKIHsKLQl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJdTggKnB0ciA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKIAl1OCAqbXlic3NpZCAgPSBnZXRfYnNzaWQocG1sbWVwcml2KTsKQEAgLTc3NywyNSArNzgzLDI0IEBACiAJdTggKnN0YV9hZGRyID0gTlVMTDsKIAlpbnQgYm1jYXN0ID0gSVNfTUNBU1QocGF0dHJpYi0+ZHN0KTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkgPT0gdHJ1ZSkgfHwKIAkgICAgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgPT0gdHJ1ZSkpIHsKIAkJLyogIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KLQkJaWYgKF9ydHdfbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTikpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiIFNBPT1teXNlbGZcbiIpKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CiAKLQkJaWYgKCghX3J0d19tZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKQkmJiAoIWJtY2FzdCkpIHsKKwkJaWYgKChtZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKSAmJiAoIWJtY2FzdCkpIHsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CiAKLQkJaWYgKF9ydHdfbWVtY21wKHBhdHRyaWItPmJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8Ci0JCSAgICBfcnR3X21lbWNtcChteWJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8Ci0JCSAgICAhX3J0d19tZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkgeworCQlpZiAoIW1lbWNtcChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAorCQkgICAgIW1lbWNtcChteWJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIiwgRVRIX0FMRU4pIHx8CisJCSAgICBtZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkgewogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTgwMyw3ICs4MDgsNyBAQAogCQlzdGFfYWRkciA9IHBhdHRyaWItPnNyYzsKIAl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7CiAJCS8qICBGb3IgU3RhdGlvbiBtb2RlLCBzYSBhbmQgYnNzaWQgc2hvdWxkIGFsd2F5cyBiZSBCU1NJRCwgYW5kIERBIGlzIG15IG1hYy1hZGRyZXNzICovCi0JCWlmICghX3J0d19tZW1jbXAocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPnNyYywgRVRIX0FMRU4pKSB7CisJCWlmIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPnNyYywgRVRIX0FMRU4pKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoImJzc2lkIT1UQSB1bmRlciBTVEFUSU9OX01PREU7IGRyb3AgcGt0XG4iKSk7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKQEAgLTgxOCw3ICs4MjMsNyBAQAogCQkJfQogCQl9IGVsc2UgeyAvKiAgbm90IG1jLWZyYW1lICovCiAJCQkvKiAgRm9yIEFQIG1vZGUsIGlmIERBIGlzIG5vbi1NQ0FTVCwgdGhlbiBpdCBtdXN0IGJlIEJTU0lELCBhbmQgYnNzaWQgPT0gQlNTSUQgKi8KLQkJCWlmICghX3J0d19tZW1jbXAocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKSB7CisJCQlpZiAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSkgewogCQkJCXJldCA9IF9GQUlMOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KQEAgLTg1MywxNyArODU4LDE2IEBACiAJfQogCiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhcDJzdGFfZGF0YV9mcmFtZSAoCiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCisJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAogCXN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpCiB7Ci0JdTggKnB0ciA9IHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJdTggKnB0ciA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7CiAJaW50IHJldCA9IF9TVUNDRVNTOwogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7CkBAIC04NzEsMjAgKzg3NSwxOSBAQAogCXU4ICpteWh3YWRkciA9IG15aWQoJmFkYXB0ZXItPmVlcHJvbXByaXYpOwogCWludCBibWNhc3QgPSBJU19NQ0FTVChwYXR0cmliLT5kc3QpOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpID09IHRydWUpICYmCiAJICAgIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSB8fAogCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSkgewogCQkvKiAgZmlsdGVyIHBhY2tldHMgdGhhdCBTQSBpcyBteXNlbGYgb3IgbXVsdGljYXN0IG9yIGJyb2FkY2FzdCAqLwotCQlpZiAoX3J0d19tZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPnNyYywgRVRIX0FMRU4pKSB7CisJCWlmICghbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCIgU0E9PW15c2VsZlxuIikpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAogCQkvKiAgZGEgc2hvdWxkIGJlIGZvciBtZSAqLwotCQlpZiAoKCFfcnR3X21lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikpICYmICghYm1jYXN0KSkgeworCQlpZiAoKG1lbWNtcChteWh3YWRkciwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTikpICYmICghYm1jYXN0KSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCiAJCQkJICgiIGFwMnN0YV9kYXRhX2ZyYW1lOiAgY29tcGFyZSBEQSBmYWlsOyBEQT0lcE1cbiIsIChwYXR0cmliLT5kc3QpKSk7CiAJCQlyZXQgPSBfRkFJTDsKQEAgLTg5Miw5ICs4OTUsOSBAQAogCQl9CiAKIAkJLyogIGNoZWNrIEJTU0lEICovCi0JCWlmIChfcnR3X21lbWNtcChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAotCQkgICAgX3J0d19tZW1jbXAobXlic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAotCQkgICAgICghX3J0d19tZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkpIHsKKwkJaWYgKCFtZW1jbXAocGF0dHJpYi0+YnNzaWQsICJceDBceDBceDBceDBceDBceDAiLCBFVEhfQUxFTikgfHwKKwkJICAgICFtZW1jbXAobXlic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIsIEVUSF9BTEVOKSB8fAorCQkgICAgIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAogCQkJCSAoIiBhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgQlNTSUQgZmFpbCA7IEJTU0lEPSVwTVxuIiwgKHBhdHRyaWItPmJzc2lkKSkpOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgibXlic3NpZD0lcE1cbiIsIChteWJzc2lkKSkpOwpAQCAtOTUwLDcgKzk1Myw3IEBACiAJCXJldCA9IFJUV19SWF9IQU5ETEVEOwogCQlnb3RvIGV4aXQ7CiAJfSBlbHNlIHsKLQkJaWYgKF9ydHdfbWVtY21wKG15aHdhZGRyLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSAmJiAoIWJtY2FzdCkpIHsKKwkJaWYgKCFtZW1jbXAobXlod2FkZHIsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pICYmICghYm1jYXN0KSkgewogCQkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBhdHRyaWItPmJzc2lkKTsgLyogIGdldCBzdGFfaW5mbyAqLwogCQkJaWYgKCpwc3RhID09IE5VTEwpIHsKIAkJCQlEQkdfODhFKCJpc3N1ZV9kZWF1dGggdG8gdGhlIGFwID0lcE0gZm9yIHRoZSByZWFzb24oNylcbiIsIChwYXR0cmliLT5ic3NpZCkpOwpAQCAtOTY0LDI3ICs5NjcsMjUgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHN0YTJhcF9kYXRhX2ZyYW1lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkJICAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKKwkJCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAogCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQogewotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKKwl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJdW5zaWduZWQgY2hhciAqbXlic3NpZCAgPSBnZXRfYnNzaWQocG1sbWVwcml2KTsKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgPT0gdHJ1ZSkgewogCQkvKiBGb3IgQVAgbW9kZSwgUkEgPSBCU1NJRCwgVFggPSBTVEEoU1JDX0FERFIpLCBBMyA9IERTVF9BRERSICovCi0JCWlmICghX3J0d19tZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkgeworCQlpZiAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkLCBFVEhfQUxFTikpIHsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0xMDE0LDcgKzEwMTUsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJdTggKm15aHdhZGRyID0gbXlpZCgmYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0JCWlmICghX3J0d19tZW1jbXAocGF0dHJpYi0+cmEsIG15aHdhZGRyLCBFVEhfQUxFTikpIHsKKwkJaWYgKG1lbWNtcChwYXR0cmliLT5yYSwgbXlod2FkZHIsIEVUSF9BTEVOKSkgewogCQkJcmV0ID0gUlRXX1JYX0hBTkRMRUQ7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTEwMjYsMjUgKzEwMjcsMjMgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfY3RybF9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAjaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQkvKiB1aW50IGxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47ICovCisJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCiAJaWYgKEdldEZyYW1lVHlwZShwZnJhbWUpICE9IFdJRklfQ1RSTF9UWVBFKQogCQlyZXR1cm4gX0ZBSUw7CiAKIAkvKiByZWNlaXZlIHRoZSBmcmFtZXMgdGhhdCByYShhMSkgaXMgbXkgYWRkcmVzcyAqLwotCWlmICghX3J0d19tZW1jbXAoR2V0QWRkcjFQdHIocGZyYW1lKSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpCisJaWYgKG1lbWNtcChHZXRBZGRyMVB0cihwZnJhbWUpLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkKIAkJcmV0dXJuIF9GQUlMOwogCiAJLyogb25seSBoYW5kbGUgcHMtcG9sbCAqLwpAQCAtMTA5OCwxMiArMTA5NywxMiBAQAogCQkJc3Bpbl9sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOwogCiAJCQl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQkJCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9waGVhZCk7CisJCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGhlYWQtPm5leHQ7CiAKIAkJCWlmICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goeG1pdGZyYW1lX3BoZWFkLCB4bWl0ZnJhbWVfcGxpc3QpKSA9PSBmYWxzZSkgewotCQkJCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BsaXN0KTsKKwkJCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGxpc3QtPm5leHQ7CiAKIAkJCQlydHdfbGlzdF9kZWxldGUoJnB4bWl0ZnJhbWUtPmxpc3QpOwogCkBAIC0xMTI0LDcgKzExMjMsNyBAQAogCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDApIHsKIAkJCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkJJVChwc3RhLT5haWQpOwogCi0JCQkJCS8qIHVwYXRlIEJDTiBmb3IgVElNIElFICovCisJCQkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwogCQkJCQkvKiB1cGRhdGVfQkNOVElNKHBhZGFwdGVyKTsgKi8KIAkJCQkJdXBkYXRlX2JlYWNvbihwYWRhcHRlciwgX1RJTV9JRV8sIE5VTEwsIGZhbHNlKTsKIAkJCQl9CkBAIC0xMTQyLDcgKzExNDEsNyBAQAogCiAJCQkJCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5CSVQocHN0YS0+YWlkKTsKIAotCQkJCQkvKiB1cGF0ZSBCQ04gZm9yIFRJTSBJRSAqLworCQkJCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KIAkJCQkJLyogdXBkYXRlX0JDTlRJTShwYWRhcHRlcik7ICovCiAJCQkJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9USU1fSUVfLCBOVUxMLCBmYWxzZSk7CiAJCQkJfQpAQCAtMTE1NywxMCArMTE1NiwxMSBAQAogCXJldHVybiBfRkFJTDsKIH0KIAotdW5pb24gcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2Noa19kZWZyYWcoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CitzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2Noa19kZWZyYWcoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogCiBzdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfbWdudF9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQorCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCkBAIC0xMTczLDE4ICsxMTczLDIwIEBACiAJfQogCiAJLyogZm9yIHJ4IHBrdCBzdGF0aXN0aWNzICovCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYsIEdldEFkZHIyUHRyKHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSk7CisJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYsCisJCQkgICAgICAgR2V0QWRkcjJQdHIocHJlY3ZfZnJhbWUtPnJ4X2RhdGEpKTsKIAlpZiAocHN0YSkgewogCQlwc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzKys7Ci0JCWlmIChHZXRGcmFtZVN1YlR5cGUocHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpID09IFdJRklfQkVBQ09OKSB7CisJCWlmIChHZXRGcmFtZVN1YlR5cGUocHJlY3ZfZnJhbWUtPnJ4X2RhdGEpID09IFdJRklfQkVBQ09OKSB7CiAJCQlwc3RhLT5zdGFfc3RhdHMucnhfYmVhY29uX3BrdHMrKzsKLQkJfSBlbHNlIGlmIChHZXRGcmFtZVN1YlR5cGUocHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGEpID09IFdJRklfUFJPQkVSRVEpIHsKKwkJfSBlbHNlIGlmIChHZXRGcmFtZVN1YlR5cGUocHJlY3ZfZnJhbWUtPnJ4X2RhdGEpID09IFdJRklfUFJPQkVSRVEpIHsKIAkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJlcV9wa3RzKys7Ci0JCX0gZWxzZSBpZiAoR2V0RnJhbWVTdWJUeXBlKHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSA9PSBXSUZJX1BST0JFUlNQKSB7Ci0JCQlpZiAoX3J0d19tZW1jbXAocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsIEdldEFkZHIxUHRyKHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSwgRVRIX0FMRU4pID09IHRydWUpCisJCX0gZWxzZSBpZiAoR2V0RnJhbWVTdWJUeXBlKHByZWN2X2ZyYW1lLT5yeF9kYXRhKSA9PSBXSUZJX1BST0JFUlNQKSB7CisJCQlpZiAoIW1lbWNtcChwYWRhcHRlci0+ZWVwcm9tcHJpdi5tYWNfYWRkciwKKwkJCQkgICAgR2V0QWRkcjFQdHIocHJlY3ZfZnJhbWUtPnJ4X2RhdGEpLCBFVEhfQUxFTikpCiAJCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX3BrdHMrKzsKLQkJCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9tYWNfYWRkcihHZXRBZGRyMVB0cihwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSkpIHx8Ci0JCQkJIGlzX211bHRpY2FzdF9tYWNfYWRkcihHZXRBZGRyMVB0cihwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YSkpKQorCQkJZWxzZSBpZiAoaXNfYnJvYWRjYXN0X21hY19hZGRyKEdldEFkZHIxUHRyKHByZWN2X2ZyYW1lLT5yeF9kYXRhKSkgfHwKKwkJCQkgaXNfbXVsdGljYXN0X21hY19hZGRyKEdldEFkZHIxUHRyKHByZWN2X2ZyYW1lLT5yeF9kYXRhKSkpCiAJCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX2JtX3BrdHMrKzsKIAkJCWVsc2UKIAkJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfdW9fcGt0cysrOwpAQCAtMTE5NywxNyArMTE5OSwxNiBAQAogfQogCiBzdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCisJCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKIHsKIAl1OCBicmV0cnk7CiAJdTggKnBzYSwgKnBkYSwgKnBic3NpZDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZGF0YTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+dS5oZHIuYXR0cmliOworCXU4ICpwdHIgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwogCXN0cnVjdCBzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWJyZXRyeSA9IEdldFJldHJ5KHB0cik7CiAJcGRhID0gZ2V0X2RhKHB0cik7CkBAIC0xMjY1LDcgKzEyNjYsNyBAQAogCiAJLyogcHN0YS0+cnNzaSA9IHByeGNtZC0+cnNzaTsgKi8KIAkvKiBwc3RhLT5zaWduYWxfcXVhbGl0eSA9IHByeGNtZC0+c3E7ICovCi0JcHJlY3ZfZnJhbWUtPnUuaGRyLnBzdGEgPSBwc3RhOworCXByZWN2X2ZyYW1lLT5wc3RhID0gcHN0YTsKIAogCXBhdHRyaWItPmFtc2R1ID0gMDsKIAlwYXR0cmliLT5hY2tfcG9saWN5ID0gMDsKQEAgLTEyODYsNyArMTI4Nyw3IEBACiAJaWYgKHBhdHRyaWItPm9yZGVyKS8qIEhULUNUUkwgMTFuICovCiAJCXBhdHRyaWItPmhkcmxlbiArPSA0OwogCi0JcHJlY3ZfZnJhbWUtPnUuaGRyLnByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtwYXR0cmliLT5wcmlvcml0eV07CisJcHJlY3ZfZnJhbWUtPnByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtwYXR0cmliLT5wcmlvcml0eV07CiAKIAkvKiAgZGVjYWNoZSwgZHJvcCBkdXBsaWNhdGUgcmVjdiBwYWNrZXRzICovCiAJaWYgKHJlY3ZfZGVjYWNoZShwcmVjdl9mcmFtZSwgYnJldHJ5LCAmcHN0YS0+c3RhX3JlY3Zwcml2LnJ4Y2FjaGUpID09IF9GQUlMKSB7CkBAIC0xMzEyLDEyICsxMzEzLDEyIEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB2YWxpZGF0ZV9yZWN2X2ZyYW1lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKK3N0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9mcmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJLyogc2hhbGwgY2hlY2sgZnJhbWUgc3VidHlwZSwgdG8gLyBmcm9tIGRzLCBkYSwgYnNzaWQgKi8KIApAQCAtMTMyNywxMiArMTMyOCwxMSBAQAogCXU4IHN1YnR5cGU7CiAJaW50IHJldHZhbCA9IF9TVUNDRVNTOwogCXU4IGJEdW1wUnhQa3Q7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKLQl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKKwl1OCAqcHRyID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAJdTggIHZlciA9ICh1bnNpZ25lZCBjaGFyKSAoKnB0cikmMHgzOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9PSBTQ0FOX1BST0NFU1MpIHsKIAkJaW50IGNoX3NldF9pZHggPSBydHdfY2hfc2V0X3NlYXJjaF9jaChwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsIHJ0d19nZXRfb3Blcl9jaChhZGFwdGVyKSk7CkBAIC0xNDIyLDE0ICsxNDIyLDEzIEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KIAogLyogcmVtb3ZlIHRoZSB3bGFuaGRyIGFuZCBhZGQgdGhlIGV0aF9oZHIgKi8KIAotc3RhdGljIGludCB3bGFuaGRyX3RvX2V0aGhkciAodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKK3N0YXRpYyBpbnQgd2xhbmhkcl90b19ldGhoZHIoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7CiAJaW50CXJtdl9sZW47CiAJdTE2CWV0aF90eXBlLCBsZW47CkBAIC0xNDM5LDEzICsxNDM4LDEwIEBACiAJc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkcgkqcHNuYXA7CiAKIAlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGFkYXB0ZXIJCQkqYWRhcHRlciA9IHByZWN2ZnJhbWUtPnUuaGRyLmFkYXB0ZXI7CisJc3RydWN0IGFkYXB0ZXIJCSphZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0KLQl1OAkqcHRyID0gZ2V0X3JlY3ZmcmFtZV9kYXRhKHByZWN2ZnJhbWUpOyAvKiAgcG9pbnQgdG8gZnJhbWVfY3RybCBmaWVsZCAqLwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPnUuaGRyLmF0dHJpYjsKLQotX2Z1bmNfZW50ZXJfOworCXU4ICpwdHIgPSBwcmVjdmZyYW1lLT5yeF9kYXRhOworCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKIAogCWlmIChwYXR0cmliLT5lbmNyeXB0KQogCQlyZWN2ZnJhbWVfcHVsbF90YWlsKHByZWN2ZnJhbWUsIHBhdHRyaWItPmljdl9sZW4pOwpAQCAtMTQ1MywxMCArMTQ0OSwxMCBAQAogCXBzbmFwID0gKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKikocHRyK3BhdHRyaWItPmhkcmxlbiArIHBhdHRyaWItPml2X2xlbik7CiAJcHNuYXBfdHlwZSA9IHB0citwYXR0cmliLT5oZHJsZW4gKyBwYXR0cmliLT5pdl9sZW4rU05BUF9TSVpFOwogCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KLQlpZiAoKF9ydHdfbWVtY21wKHBzbmFwLCBydHdfcmZjMTA0Ml9oZWFkZXIsIFNOQVBfU0laRSkgJiYKLQkgICAgIChfcnR3X21lbWNtcChwc25hcF90eXBlLCBTTkFQX0VUSF9UWVBFX0lQWCwgMikgPT0gZmFsc2UpICYmCi0JICAgICAoX3J0d19tZW1jbXAocHNuYXBfdHlwZSwgU05BUF9FVEhfVFlQRV9BUFBMRVRBTEtfQUFSUCwgMikgPT0gZmFsc2UpKSB8fAotCSAgICBfcnR3X21lbWNtcChwc25hcCwgcnR3X2JyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpKSB7CisJaWYgKCghbWVtY21wKHBzbmFwLCBydHdfcmZjMTA0Ml9oZWFkZXIsIFNOQVBfU0laRSkgJiYKKwkgICAgICghbWVtY21wKHBzbmFwX3R5cGUsIFNOQVBfRVRIX1RZUEVfSVBYLCAyKSA9PSBmYWxzZSkgJiYKKwkgICAgICghbWVtY21wKHBzbmFwX3R5cGUsIFNOQVBfRVRIX1RZUEVfQVBQTEVUQUxLX0FBUlAsIDIpID09IGZhbHNlKSkgfHwKKwkgICAgICFtZW1jbXAocHNuYXAsIHJ0d19icmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSkgewogCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kIHJlcGxhY2UgRXRoZXJUeXBlICovCiAJCWJzbmFwaGRyID0gdHJ1ZTsKIAl9IGVsc2UgewpAQCAtMTQ2NSw3ICsxNDYxLDcgQEAKIAl9CiAKIAlybXZfbGVuID0gcGF0dHJpYi0+aGRybGVuICsgcGF0dHJpYi0+aXZfbGVuICsgKGJzbmFwaGRyID8gU05BUF9TSVpFIDogMCk7Ci0JbGVuID0gcHJlY3ZmcmFtZS0+dS5oZHIubGVuIC0gcm12X2xlbjsKKwlsZW4gPSBwcmVjdmZyYW1lLT5sZW4gLSBybXZfbGVuOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCiAJCSAoIlxuPT09cGF0dHJpYi0+aGRybGVuOiAleCwgIHBhdHRyaWItPml2X2xlbjoleD09PVxuXG4iLCBwYXR0cmliLT5oZHJsZW4sICBwYXR0cmliLT5pdl9sZW4pKTsKQEAgLTE0OTYsMzAgKzE0OTIsMjkgQEAKIAkJbWVtY3B5KHB0cisxMiwgJmJlX3RtcCwgMik7CiAJfQogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBwZXJmb3JtIGRlZnJhZyAqLwotc3RhdGljIHVuaW9uIHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9kZWZyYWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBfX3F1ZXVlICpkZWZyYWdfcSkKK3N0YXRpYyBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2RlZnJhZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgc3RydWN0IF9fcXVldWUgKmRlZnJhZ19xKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAJdTggd2xhbmhkcl9vZmZzZXQ7CiAJdTgJY3VyZnJhZ251bTsKLQlzdHJ1Y3QgcmVjdl9mcmFtZV9oZHIgKnBmaGRyLCAqcG5maGRyOwotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUsICpwbmV4dHJmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGZoZHIsICpwbmZoZHI7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUsICpwbmV4dHJmcmFtZTsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJY3VyZnJhZ251bSA9IDA7CiAJcGZyZWVfcmVjdl9xdWV1ZSA9ICZhZGFwdGVyLT5yZWN2cHJpdi5mcmVlX3JlY3ZfcXVldWU7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQoZGVmcmFnX3EpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOwotCXByZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdSk7Ci0JcGZoZHIgPSAmcHJmcmFtZS0+dS5oZHI7Ci0JcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+dS5saXN0KSk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKKwlwZmhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOworCXByZnJhbWUgPSAoc3RydWN0IHJlY3ZfZnJhbWUgKilwZmhkcjsKKwlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT5saXN0KSk7CiAKIAlpZiAoY3VyZnJhZ251bSAhPSBwZmhkci0+YXR0cmliLmZyYWdfbnVtKSB7CiAJCS8qIHRoZSBmaXJzdCBmcmFnbWVudCBudW1iZXIgbXVzdCBiZSAwICovCkBAIC0xNTM0LDExICsxNTI5LDExIEBACiAKIAlwbGlzdCA9IGdldF9saXN0X2hlYWQoZGVmcmFnX3EpOwogCi0JcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCXdoaWxlIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IGZhbHNlKSB7Ci0JCXBuZXh0cmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUgLCB1KTsKLQkJcG5maGRyID0gJnBuZXh0cmZyYW1lLT51LmhkcjsKKwkJcG5maGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CisJCXBuZXh0cmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcG5maGRyOwogCiAJCS8qIGNoZWNrIHRoZSBmcmFnbWVudCBzZXF1ZW5jZSAgKDJuZCB+biBmcmFnbWVudCBmcmFtZSkgKi8KIApAQCAtMTU2OCw3ICsxNTYzLDcgQEAKIAkJcmVjdmZyYW1lX3B1dChwcmZyYW1lLCBwbmZoZHItPmxlbik7CiAKIAkJcGZoZHItPmF0dHJpYi5pY3ZfbGVuID0gcG5maGRyLT5hdHRyaWIuaWN2X2xlbjsKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJLyogZnJlZSB0aGUgZGVmcmFnX3EgcXVldWUgYW5kIHJldHVybiB0aGUgcHJmcmFtZSAqLwpAQCAtMTU3NiwyOSArMTU3MSwyOCBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sICgiUGVyZm9ybWFuY2UgZGVmcmFnISEhISFcbiIpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcHJmcmFtZTsKIH0KIAogLyogY2hlY2sgaWYgbmVlZCB0byBkZWZyYWcsIGlmIG5lZWRlZCBxdWV1ZSB0aGUgZnJhbWUgdG8gZGVmcmFnX3EgKi8KLXVuaW9uIHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9jaGtfZGVmcmFnKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCitzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2Noa19kZWZyYWcoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiAJdTgJaXNtZnJhZzsKIAl1OAlmcmFnbnVtOwogCXU4CSpwc3RhX2FkZHI7Ci0Jc3RydWN0IHJlY3ZfZnJhbWVfaGRyICpwZmhkcjsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGZoZHI7CiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0JdW5pb24gcmVjdl9mcmFtZSAqcHJ0bmZyYW1lID0gTlVMTDsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJ0bmZyYW1lID0gTlVMTDsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSwgKnBkZWZyYWdfcTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAKLQlwZmhkciA9ICZwcmVjdl9mcmFtZS0+dS5oZHI7CisJcGZoZHIgPSBwcmVjdl9mcmFtZTsKIAogCXBmcmVlX3JlY3ZfcXVldWUgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKIApAQCAtMTY3MCw3ICsxNjY0LDcgQEAKIAkJfQogCX0KIAotCWlmICgocHJ0bmZyYW1lICE9IE5VTEwpICYmIChwcnRuZnJhbWUtPnUuaGRyLmF0dHJpYi5wcml2YWN5KSkgeworCWlmICgocHJ0bmZyYW1lICE9IE5VTEwpICYmIChwcnRuZnJhbWUtPmF0dHJpYi5wcml2YWN5KSkgewogCQkvKiBhZnRlciBkZWZyYWcgd2UgbXVzdCBjaGVjayB0a2lwIG1pYyBjb2RlICovCiAJCWlmIChyZWN2ZnJhbWVfY2hrbWljKHBhZGFwdGVyLCAgcHJ0bmZyYW1lKSA9PSBfRkFJTCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJyZWN2ZnJhbWVfY2hrbWljKHBhZGFwdGVyLCAgcHJ0bmZyYW1lKT09X0ZBSUxcbiIpKTsKQEAgLTE2NzksMTIgKzE2NzMsMTEgQEAKIAkJfQogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcHJ0bmZyYW1lOwogfQogCi1zdGF0aWMgaW50IGFtc2R1X3RvX21zZHUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lKQorc3RhdGljIGludCBhbXNkdV90b19tc2R1KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCiB7CiAJaW50CWFfbGVuLCBwYWRkaW5nX2xlbjsKIAl1MTYJZXRoX3R5cGUsIG5TdWJmcmFtZV9MZW5ndGg7CkBAIC0xNjk4LDE2ICsxNjkxLDE2IEBACiAJaW50CXJldCA9IF9TVUNDRVNTOwogCW5yX3N1YmZyYW1lcyA9IDA7CiAKLQlwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKIAotCXJlY3ZmcmFtZV9wdWxsKHByZnJhbWUsIHByZnJhbWUtPnUuaGRyLmF0dHJpYi5oZHJsZW4pOworCXJlY3ZmcmFtZV9wdWxsKHByZnJhbWUsIHByZnJhbWUtPmF0dHJpYi5oZHJsZW4pOwogCi0JaWYgKHByZnJhbWUtPnUuaGRyLmF0dHJpYi5pdl9sZW4gPiAwKQotCQlyZWN2ZnJhbWVfcHVsbChwcmZyYW1lLCBwcmZyYW1lLT51Lmhkci5hdHRyaWIuaXZfbGVuKTsKKwlpZiAocHJmcmFtZS0+YXR0cmliLml2X2xlbiA+IDApCisJCXJlY3ZmcmFtZV9wdWxsKHByZnJhbWUsIHByZnJhbWUtPmF0dHJpYi5pdl9sZW4pOwogCi0JYV9sZW4gPSBwcmZyYW1lLT51Lmhkci5sZW47CisJYV9sZW4gPSBwcmZyYW1lLT5sZW47CiAKLQlwZGF0YSA9IHByZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJcGRhdGEgPSBwcmZyYW1lLT5yeF9kYXRhOwogCiAJd2hpbGUgKGFfbGVuID4gRVRIX0hMRU4pIHsKIAkJLyogT2Zmc2V0IDEyIGRlbm90ZSAyIG1hYyBhZGRyZXNzICovCkBAIC0xNzI5LDcgKzE3MjIsNyBAQAogCQkJZGF0YV9wdHIgPSAodTggKilza2JfcHV0KHN1Yl9za2IsIG5TdWJmcmFtZV9MZW5ndGgpOwogCQkJbWVtY3B5KGRhdGFfcHRyLCBwZGF0YSwgblN1YmZyYW1lX0xlbmd0aCk7CiAJCX0gZWxzZSB7Ci0JCQlzdWJfc2tiID0gc2tiX2Nsb25lKHByZnJhbWUtPnUuaGRyLnBrdCwgR0ZQX0FUT01JQyk7CisJCQlzdWJfc2tiID0gc2tiX2Nsb25lKHByZnJhbWUtPnBrdCwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoc3ViX3NrYikgewogCQkJCXN1Yl9za2ItPmRhdGEgPSBwZGF0YTsKIAkJCQlzdWJfc2tiLT5sZW4gPSBuU3ViZnJhbWVfTGVuZ3RoOwpAQCAtMTc2OCw5ICsxNzYxLDkgQEAKIAkJLyogY29udmVydCBoZHIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0IGhlYWRlciAqLwogCQlldGhfdHlwZSA9IFJUV19HRVRfQkUxNigmc3ViX3NrYi0+ZGF0YVs2XSk7CiAJCWlmIChzdWJfc2tiLT5sZW4gPj0gOCAmJgotCQkgICAgKChfcnR3X21lbWNtcChzdWJfc2tiLT5kYXRhLCBydHdfcmZjMTA0Ml9oZWFkZXIsIFNOQVBfU0laRSkgJiYKKwkJICAgICgoIW1lbWNtcChzdWJfc2tiLT5kYXRhLCBydHdfcmZjMTA0Ml9oZWFkZXIsIFNOQVBfU0laRSkgJiYKIAkJCSAgZXRoX3R5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhfdHlwZSAhPSBFVEhfUF9JUFgpIHx8Ci0JCQkgX3J0d19tZW1jbXAoc3ViX3NrYi0+ZGF0YSwgcnR3X2JyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpKSkgeworCQkJICFtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgcnR3X2JyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpKSkgewogCQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZCByZXBsYWNlIEV0aGVyVHlwZSAqLwogCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKIAkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHBhdHRyaWItPnNyYywgRVRIX0FMRU4pOwpAQCAtMTc5Niw3ICsxNzg5LDcgQEAKIAogZXhpdDoKIAotCXByZnJhbWUtPnUuaGRyLmxlbiA9IDA7CisJcHJmcmFtZS0+bGVuID0gMDsKIAlydHdfZnJlZV9yZWN2ZnJhbWUocHJmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7LyogZnJlZSB0aGlzIHJlY3ZfZnJhbWUgKi8KIAogCXJldHVybiByZXQ7CkBAIC0xODMyLDcwICsxODI1LDcyIEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLWludCBlbnF1ZXVlX3Jlb3JkZXJfcmVjdmZyYW1lKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSk7Ci1pbnQgZW5xdWV1ZV9yZW9yZGVyX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpCitpbnQgZW5xdWV1ZV9yZW9yZGVyX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsCisJCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKIHsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwogCXN0cnVjdCBfX3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKLQl1bmlvbiByZWN2X2ZyYW1lICpwbmV4dHJmcmFtZTsKKwlzdHJ1Y3QgcmVjdl9mcmFtZSAqaGRyOwogCXN0cnVjdCByeF9wa3RfYXR0cmliICpwbmV4dGF0dHJpYjsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSBmYWxzZSkgewotCQlwbmV4dHJmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKLQkJcG5leHRhdHRyaWIgPSAmcG5leHRyZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwkJaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CisJCXBuZXh0YXR0cmliID0gJmhkci0+YXR0cmliOwogCiAJCWlmIChTTl9MRVNTKHBuZXh0YXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5zZXFfbnVtKSkKLQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAkJZWxzZSBpZiAoU05fRVFVQUwocG5leHRhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPnNlcV9udW0pKQogCQkJcmV0dXJuIGZhbHNlOwogCQllbHNlCiAJCQlicmVhazsKIAl9CiAKLQlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT51Lmhkci5saXN0KSk7CisJcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+bGlzdCkpOwogCi0JcnR3X2xpc3RfaW5zZXJ0X3RhaWwoJihwcmZyYW1lLT51Lmhkci5saXN0KSwgcGxpc3QpOworCXJ0d19saXN0X2luc2VydF90YWlsKCYocHJmcmFtZS0+bGlzdCksIHBsaXN0KTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCByZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwgaW50IGJmb3JjZWQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKLQl1bmlvbiByZWN2X2ZyYW1lICpwcmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpwcmhkcjsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKIAlpbnQgYlBrdEluQnVmID0gZmFsc2U7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKIAlzdHJ1Y3QgX19xdWV1ZSAqcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0gJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwogCiAJcGhlYWQgPQkJZ2V0X2xpc3RfaGVhZChwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkvKiAgSGFuZGxpbmcgc29tZSBjb25kaXRpb24gZm9yIGZvcmNlZCBpbmRpY2F0ZSBjYXNlLiAqLwogCWlmIChiZm9yY2VkKSB7CiAJCWlmIChydHdfaXNfbGlzdF9lbXB0eShwaGVhZCkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAotCQlwcmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUsIHUpOwotCQlwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwkJcHJoZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKKwkgICAgICAgIHBhdHRyaWIgPSAmcHJoZHItPmF0dHJpYjsKIAkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gcGF0dHJpYi0+c2VxX251bTsKIAl9CiAKIAkvKiAgUHJlcGFyZSBpbmRpY2F0aW9uIGxpc3QgYW5kIGluZGljYXRpb24uICovCiAJLyogIENoZWNrIGlmIHRoZXJlIGlzIGFueSBwYWNrZXQgbmVlZCBpbmRpY2F0ZS4gKi8KIAl3aGlsZSAoIXJ0d19pc19saXN0X2VtcHR5KHBoZWFkKSkgewotCQlwcmZyYW1lID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHVuaW9uIHJlY3ZfZnJhbWUsIHUpOwotCQlwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwkJcHJoZHIgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKKwkJcHJmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByaGRyOworCQlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKIAogCQlpZiAoIVNOX0xFU1MocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLCBwYXR0cmliLT5zZXFfbnVtKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKIAkJCQkgKCJyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcjogaW5kaWNhdGU9JWQgc2VxPSVkIGFtc2R1PSVkXG4iLAogCQkJCSAgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLCBwYXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5hbXNkdSkpOwotCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7Ci0JCQlydHdfbGlzdF9kZWxldGUoJihwcmZyYW1lLT51Lmhkci5saXN0KSk7CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OworCQkJcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+bGlzdCkpOwogCiAJCQlpZiAoU05fRVFVQUwocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLCBwYXR0cmliLT5zZXFfbnVtKSkKIAkJCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSAocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgMSkgJiAweEZGRjsKQEAgLTE5MjQsMTEgKzE5MTksMTIgQEAKIAlyZXR1cm4gYlBrdEluQnVmOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpCitzdGF0aWMgaW50IHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQogewogCWludCByZXR2YWwgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsID0gcHJmcmFtZS0+dS5oZHIucHJlb3JkZXJfY3RybDsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7CisJc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsID0gcHJmcmFtZS0+cHJlb3JkZXJfY3RybDsKIAlzdHJ1Y3QgX19xdWV1ZSAqcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0gJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwogCiAJaWYgKCFwYXR0cmliLT5hbXNkdSkgewpAQCAtMjAwMSw3ICsxOTk3LDcgQEAKIAkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7Ci0JCV9jYW5jZWxfdGltZXJfZXgoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwogCX0KIAogX3N1Y2Nlc3NfZXhpdDoKQEAgLTIwMzIsMTcgKzIwMjgsMTQgQEAKIAlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKIH0KIAotc3RhdGljIGludCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKIHsKIAlpbnQgcmV0dmFsID0gX1NVQ0NFU1M7Ci0JLyogc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsgKi8KLQkvKiBzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7ICovCiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgaHRfcHJpdgkqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKIAogCWlmIChwaHRwcml2LT5odF9vcHRpb24pIHsgIC8qIEIvRy9OIE1vZGUgKi8KLQkJLyogcHJmcmFtZS0+dS5oZHIucHJlb3JkZXJfY3RybCA9ICZwcmVjdnByaXYtPnJlY3ZyZW9yZGVyX2N0cmxbcGF0dHJpYi0+cHJpb3JpdHldOyAqLwotCiAJCWlmIChyZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIocGFkYXB0ZXIsIHByZnJhbWUpICE9IF9TVUNDRVNTKSB7CiAJCQkvKiAgaW5jbHVkaW5nIHBlcmZvcm0gQS1NUERVIFJ4IE9yZGVyaW5nIEJ1ZmZlciBDb250cm9sICovCiAJCQlpZiAoKCFwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpICYmCkBAIC0yMDc1LDEwICsyMDY4LDExIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCByZWN2X2Z1bmNfcHJlaGFuZGxlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcmZyYW1lKQorc3RhdGljIGludCByZWN2X2Z1bmNfcHJlaGFuZGxlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmZyYW1lKQogewogCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZyZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZyZnJhbWUtPmF0dHJpYjsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSA9ICZwYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKQEAgLTIxMTAsMTAgKzIxMDQsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJlY3ZfZnVuY19wb3N0aGFuZGxlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkKK3N0YXRpYyBpbnQgcmVjdl9mdW5jX3Bvc3RoYW5kbGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQogewogCWludCByZXQgPSBfU1VDQ0VTUzsKLQl1bmlvbiByZWN2X2ZyYW1lICpvcmlnX3ByZnJhbWUgPSBwcmZyYW1lOworCXN0cnVjdCByZWN2X2ZyYW1lICpvcmlnX3ByZnJhbWUgPSBwcmZyYW1lOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKIApAQCAtMjE1NSwxNiArMjE1MCwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9mdW5jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcmZyYW1lKQorc3RhdGljIGludCByZWN2X2Z1bmMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmZyYW1lKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZyZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnJmcmFtZS0+YXR0cmliOwogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0IG1sbWVfcHJpdiAqbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCiAJLyogY2hlY2sgaWYgbmVlZCB0byBoYW5kbGUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZSovCiAJaWYgKGNoZWNrX2Z3c3RhdGUobWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgJiYgcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkpIHsKLQkJdW5pb24gcmVjdl9mcmFtZSAqcGVuZGluZ19mcmFtZTsKKwkJc3RydWN0IHJlY3ZfZnJhbWUgKnBlbmRpbmdfZnJhbWU7CiAKIAkJd2hpbGUgKChwZW5kaW5nX2ZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZSgmcGFkYXB0ZXItPnJlY3Zwcml2LnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpKSkgewogCQkJaWYgKHJlY3ZfZnVuY19wb3N0aGFuZGxlKHBhZGFwdGVyLCBwZW5kaW5nX2ZyYW1lKSA9PSBfU1VDQ0VTUykKQEAgLTIxOTMsMTUgKzIxODgsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zMzIgcnR3X3JlY3ZfZW50cnkodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKK3MzMiBydHdfcmVjdl9lbnRyeShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXI7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwogCXMzMiByZXQgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCi0JcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT51Lmhkci5hZGFwdGVyOworCXBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKIAogCXByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAKQEAgLTIyMTMsNyArMjIwNyw2IEBACiAKIAlwcmVjdnByaXYtPnJ4X3BrdHMrKzsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogCkBAIC0yMjIyLDcgKzIyMTUsNiBAQAogCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2Lm1wX21vZGUgPT0gMSkKIAkJcGFkYXB0ZXItPm1wcHJpdi5yeF9wa3Rsb3NzID0gcHJlY3Zwcml2LT5yeF9kcm9wOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMjQ0LDEzICsyMjM2LDEzIEBACiAJfSBlbHNlIHsKIAkJaWYgKHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGhfZGF0YS51cGRhdGVfcmVxID09IDApIHsvKiAgdXBkYXRlX3JlcSBpcyBjbGVhciwgbWVhbnMgd2UgZ290IHJ4ICovCiAJCQlhdmdfc2lnbmFsX3N0cmVuZ3RoID0gcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aF9kYXRhLmF2Z192YWw7Ci0JCQkvKiAgYWZ0ZXIgYXZnX3ZhbHMgYXJlIGFjY3F1aXJlZCwgd2UgY2FuIHJlLXN0YXQgdGhlIHNpZ25hbCB2YWx1ZXMgKi8KKwkJCS8qICBhZnRlciBhdmdfdmFscyBhcmUgYWNxdWlyZWQsIHdlIGNhbiByZS1zdGF0IHRoZSBzaWduYWwgdmFsdWVzICovCiAJCQlyZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEudXBkYXRlX3JlcSA9IDE7CiAJCX0KIAogCQlpZiAocmVjdnByaXYtPnNpZ25hbF9xdWFsX2RhdGEudXBkYXRlX3JlcSA9PSAwKSB7LyogIHVwZGF0ZV9yZXEgaXMgY2xlYXIsIG1lYW5zIHdlIGdvdCByeCAqLwogCQkJYXZnX3NpZ25hbF9xdWFsID0gcmVjdnByaXYtPnNpZ25hbF9xdWFsX2RhdGEuYXZnX3ZhbDsKLQkJCS8qICBhZnRlciBhdmdfdmFscyBhcmUgYWNjcXVpcmVkLCB3ZSBjYW4gcmUtc3RhdCB0aGUgc2lnbmFsIHZhbHVlcyAqLworCQkJLyogIGFmdGVyIGF2Z192YWxzIGFyZSBhY3F1aXJlZCwgd2UgY2FuIHJlLXN0YXQgdGhlIHNpZ25hbCB2YWx1ZXMgKi8KIAkJCXJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLnVwZGF0ZV9yZXEgPSAxOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYwppbmRleCBlMDg4NDU3Li5jNGIxNmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCkBAIC00MSw3ICs0MSw2IEBACiAJdTMyCXN0YXRlaW5kZXg7CiAJdTggKnN0YXRlOwogCXUzMgljb3VudGVyOwotX2Z1bmNfZW50ZXJfOwogCXN0YXRlID0gcGFyYzRjdHgtPnN0YXRlOwogCXBhcmM0Y3R4LT54ID0gMDsKIAlwYXJjNGN0eC0+eSA9IDA7CkBAIC01OCw3ICs1Nyw2IEBACiAJCWlmICgrK2tleWluZGV4ID49IGtleV9sZW4pCiAJCQlrZXlpbmRleCA9IDA7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB1MzIgYXJjZm91cl9ieXRlKHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgpCkBAIC02Nyw3ICs2NSw2IEBACiAJdTMyIHk7CiAJdTMyIHN4LCBzeTsKIAl1OCAqc3RhdGU7Ci1fZnVuY19lbnRlcl87CiAJc3RhdGUgPSBwYXJjNGN0eC0+c3RhdGU7CiAJeCA9IChwYXJjNGN0eC0+eCArIDEpICYgMHhmZjsKIAlzeCA9IHN0YXRlW3hdOwpAQCAtNzcsMTcgKzc0LDE0IEBACiAJcGFyYzRjdHgtPnkgPSB5OwogCXN0YXRlW3ldID0gKHU4KXN4OwogCXN0YXRlW3hdID0gKHU4KXN5OwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdOwogfQogCiBzdGF0aWMgdm9pZCBhcmNmb3VyX2VuY3J5cHQoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCwgdTggKmRlc3QsIHU4ICpzcmMsIHUzMiBsZW4pCiB7CiAJdTMyCWk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQogCQlkZXN0W2ldID0gc3JjW2ldIF4gKHVuc2lnbmVkIGNoYXIpYXJjZm91cl9ieXRlKHBhcmM0Y3R4KTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgaW50IGJjcmMzMmluaXRpYWxpemVkOwpAQCAtMTAyLDkgKzk2LDggQEAKIAogc3RhdGljIHZvaWQgY3JjMzJfaW5pdCh2b2lkKQogewotX2Z1bmNfZW50ZXJfOwogCWlmIChiY3JjMzJpbml0aWFsaXplZCA9PSAxKSB7Ci0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCWludCBpLCBqOwogCQl1MzIgYzsKQEAgLTEyNiwxNSArMTE5LDEyIEBACiAJCX0KIAkJYmNyYzMyaW5pdGlhbGl6ZWQgPSAxOwogCX0KLWV4aXQ6Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIF9fbGUzMiBnZXRjcmMzMih1OCAqYnVmLCBpbnQgbGVuKQogewogCXU4ICpwOwogCXUzMiAgY3JjOwotX2Z1bmNfZW50ZXJfOwogCWlmIChiY3JjMzJpbml0aWFsaXplZCA9PSAwKQogCQljcmMzMl9pbml0KCk7CiAKQEAgLTE0Miw3ICsxMzIsNiBAQAogCiAJZm9yIChwID0gYnVmOyBsZW4gPiAwOyArK3AsIC0tbGVuKQogCQljcmMgPSBjcmMzMl90YWJsZVsoY3JjIF4gKnApICYgMHhmZl0gXiAoY3JjID4+IDgpOwotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIGNwdV90b19sZTMyKH5jcmMpOyAgICAvKiB0cmFuc21pdCBjb21wbGVtZW50LCBwZXIgQ1JDLTMyIHNwZWMgKi8KIH0KIApAQCAtMTY1LDcgKzE1NCw2IEBACiAJc3RydWN0CXNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlzdHJ1Y3QJeG1pdF9wcml2CQkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKCgoc3RydWN0IHhtaXRfZnJhbWUgKilweG1pdGZyYW1lKS0+YnVmX2FkZHIgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMjA2LDcgKzE5NCw2IEBACiAJCX0KIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d193ZXBfZGVjcnlwdChzdHJ1Y3QgYWRhcHRlciAgKnBhZGFwdGVyLCB1OCAqcHJlY3ZmcmFtZSkKQEAgLTIxOCwxMiArMjA1LDExIEBACiAJdTMyCWtleWxlbmd0aDsKIAl1OAkqcGZyYW1lLCAqcGF5bG9hZCwgKml2LCB3ZXBrZXlbMTZdOwogCXU4CSBrZXlpbmRleDsKLQlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkgKnByeGF0dHJpYiA9ICYoKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLmF0dHJpYik7CisJc3RydWN0CXJ4X3BrdF9hdHRyaWIJICpwcnhhdHRyaWIgPSAmKCgoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+YXR0cmliKTsKIAlzdHJ1Y3QJc2VjdXJpdHlfcHJpdgkqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCi1fZnVuY19lbnRlcl87CiAKLQlwZnJhbWUgPSAodW5zaWduZWQgY2hhciAqKSgodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5yeF9kYXRhOworCXBmcmFtZSA9ICh1bnNpZ25lZCBjaGFyICopKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5yeF9kYXRhOwogCiAJLyogc3RhcnQgdG8gZGVjcnlwdCByZWN2ZnJhbWUgKi8KIAlpZiAoKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBfV0VQNDBfKSB8fCAocHJ4YXR0cmliLT5lbmNyeXB0ID09IF9XRVAxMDRfKSkgewpAQCAtMjMyLDcgKzIxOCw3IEBACiAJCWtleWxlbmd0aCA9IHBzZWN1cml0eXByaXYtPmRvdDExRGVmS2V5bGVuW2tleWluZGV4XTsKIAkJbWVtY3B5KCZ3ZXBrZXlbMF0sIGl2LCAzKTsKIAkJbWVtY3B5KCZ3ZXBrZXlbM10sICZwc2VjdXJpdHlwcml2LT5kb3QxMURlZktleVtrZXlpbmRleF0uc2tleVswXSwga2V5bGVuZ3RoKTsKLQkJbGVuZ3RoID0gKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLmxlbi1wcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbjsKKwkJbGVuZ3RoID0gKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5sZW4tcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW47CiAKIAkJcGF5bG9hZCA9IHBmcmFtZStwcnhhdHRyaWItPml2X2xlbitwcnhhdHRyaWItPmhkcmxlbjsKIApAQCAtMjUyLDcgKzIzOCw2IEBACiAJCQkJICZjcmMsICZwYXlsb2FkW2xlbmd0aC00XSkpOwogCQl9CiAJfQotX2Z1bmNfZXhpdF87CiAJcmV0dXJuOwogfQogCkBAIC0yNjMsMTAgKzI0OCw4IEBACiB7CiAJczMyIGk7CiAJdTMyIHJlcyA9IDA7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJcmVzIHw9ICgodTMyKSgqcCsrKSkgPDwgKDgqaSk7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0yNzQsMzkgKzI1NywzMiBAQAogLyogIENvbnZlcnQgZnJvbSBVczMyMzIgdG8gQnl0ZVtdIGluIGEgcG9ydGFibGUgd2F5ICovCiB7CiAJbG9uZyBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJKnArKyA9ICh1OCkgKHZhbCAmIDB4ZmYpOwogCQl2YWwgPj49IDg7CiAJfQotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHNlY21pY2NsZWFyKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEpCiB7CiAvKiAgUmVzZXQgdGhlIHN0YXRlIHRvIHRoZSBlbXB0eSBtZXNzYWdlLiAqLwotX2Z1bmNfZW50ZXJfOwogCXBtaWNkYXRhLT5MID0gcG1pY2RhdGEtPkswOwogCXBtaWNkYXRhLT5SID0gcG1pY2RhdGEtPksxOwogCXBtaWNkYXRhLT5uQnl0ZXNJbk0gPSAwOwogCXBtaWNkYXRhLT5NID0gMDsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zZWNtaWNzZXRrZXkoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKmtleSkKIHsKIAkvKiAgU2V0IHRoZSBrZXkgKi8KLV9mdW5jX2VudGVyXzsKIAlwbWljZGF0YS0+SzAgPSBzZWNtaWNnZXR1aW50MzIoa2V5KTsKIAlwbWljZGF0YS0+SzEgPSBzZWNtaWNnZXR1aW50MzIoa2V5ICsgNCk7CiAJLyogIGFuZCByZXNldCB0aGUgbWVzc2FnZSAqLwogCXNlY21pY2NsZWFyKHBtaWNkYXRhKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zZWNtaWNhcHBlbmRieXRlKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4IGIpCiB7Ci1fZnVuY19lbnRlcl87CiAJLyogIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIgKi8KIAlwbWljZGF0YS0+TSB8PSAoKHVuc2lnbmVkIGxvbmcpYikgPDwgKDgqcG1pY2RhdGEtPm5CeXRlc0luTSk7CiAJcG1pY2RhdGEtPm5CeXRlc0luTSsrOwpAQCAtMzI1LDIzICszMDEsMTkgQEAKIAkJcG1pY2RhdGEtPk0gPSAwOwogCQlwbWljZGF0YS0+bkJ5dGVzSW5NID0gMDsKIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogdm9pZCBydHdfc2VjbWljYXBwZW5kKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICpzcmMsIHUzMiBuYnl0ZXMpCiB7Ci1fZnVuY19lbnRlcl87CiAJLyogIFRoaXMgaXMgc2ltcGxlICovCiAJd2hpbGUgKG5ieXRlcyA+IDApIHsKIAkJcnR3X3NlY21pY2FwcGVuZGJ5dGUocG1pY2RhdGEsICpzcmMrKyk7CiAJCW5ieXRlcy0tOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19zZWNnZXRtaWMoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKmRzdCkKIHsKLV9mdW5jX2VudGVyXzsKIAkvKiAgQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcgKi8KIAlydHdfc2VjbWljYXBwZW5kYnl0ZShwbWljZGF0YSwgMHg1YSk7CiAJcnR3X3NlY21pY2FwcGVuZGJ5dGUocG1pY2RhdGEsIDApOwpAQCAtMzU2LDE0ICszMjgsMTIgQEAKIAlzZWNtaWNwdXR1aW50MzIoZHN0KzQsIHBtaWNkYXRhLT5SKTsKIAkvKiAgUmVzZXQgdG8gdGhlIGVtcHR5IG1lc3NhZ2UuICovCiAJc2VjbWljY2xlYXIocG1pY2RhdGEpOwotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X3NlY2NhbGN0a2lwbWljKHU4ICprZXksIHU4ICpoZWFkZXIsIHU4ICpkYXRhLCB1MzIgZGF0YV9sZW4sIHU4ICptaWNfY29kZSwgdTggcHJpKQogewogCXN0cnVjdCBtaWNfZGF0YQltaWNkYXRhOwogCXU4IHByaW9yaXR5WzRdID0gezB4MCwgMHgwLCAweDAsIDB4MH07Ci1fZnVuY19lbnRlcl87CiAJcnR3X3NlY21pY3NldGtleSgmbWljZGF0YSwga2V5KTsKIAlwcmlvcml0eVswXSA9IHByaTsKIApAQCAtMzg2LDcgKzM1Niw2IEBACiAJcnR3X3NlY21pY2FwcGVuZCgmbWljZGF0YSwgZGF0YSwgZGF0YV9sZW4pOwogCiAJcnR3X3NlY2dldG1pYygmbWljZGF0YSwgbWljX2NvZGUpOwotX2Z1bmNfZXhpdF87CiB9CiAKIApAQCAtNTA1LDcgKzQ3NCw2IEBACiBzdGF0aWMgdm9pZCBwaGFzZTEodTE2ICpwMWssIGNvbnN0IHU4ICp0aywgY29uc3QgdTggKnRhLCB1MzIgaXYzMikKIHsKIAlpbnQgIGk7Ci1fZnVuY19lbnRlcl87CiAJLyogSW5pdGlhbGl6ZSB0aGUgODAgYml0cyBvZiBQMUtbXSBmcm9tIElWMzIgYW5kIFRBWzAuLjVdICAgICAqLwogCXAxa1swXSAgICAgID0gTG8xNihpdjMyKTsKIAlwMWtbMV0gICAgICA9IEhpMTYoaXYzMik7CkBAIC01MjMsNyArNDkxLDYgQEAKIAkJcDFrWzRdICs9IF9TXyhwMWtbM10gXiBUSzE2KChpJjEpKzApKTsKIAkJcDFrWzRdICs9ICAodW5zaWduZWQgc2hvcnQpaTsgICAvKiBhdm9pZCAic2xpZGUgYXR0YWNrcyIgKi8KIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogLyoKQEAgLTU1Myw3ICs1MjAsNiBAQAogewogCWludCAgaTsKIAl1MTYgUFBLWzZdOwkJCS8qIHRlbXBvcmFyeSBrZXkgZm9yIG1peGluZyAgICAqLwotX2Z1bmNfZW50ZXJfOwogCS8qIE5vdGU6IGFsbCBhZGRzIGluIHRoZSBQUEtbXSBlcXVhdGlvbnMgYmVsb3cgYXJlIG1vZCAyKioxNgkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQogCQlQUEtbaV0gPSBwMWtbaV07CS8qIGZpcnN0LCBjb3B5IFAxSyB0byBQUEsgICAgICAqLwpAQCAtNTkwLDcgKzU1Niw2IEBACiAJCXJjNGtleVs0KzIqaV0gPSBMbzgoUFBLW2ldKTsKIAkJcmM0a2V5WzUrMippXSA9IEhpOChQUEtbaV0pOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiAvKiBUaGUgaGxlbiBpc24ndCBpbmNsdWRlIHRoZSBJViAqLwpAQCAtNjEyLDcgKzU3Nyw2IEBACiAJc3RydWN0CXNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlzdHJ1Y3QJeG1pdF9wcml2CQkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAl1MzIJcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAoKChzdHJ1Y3QgeG1pdF9mcmFtZSAqKXB4bWl0ZnJhbWUpLT5idWZfYWRkciA9PSBOVUxMKQogCQlyZXR1cm4gX0ZBSUw7CkBAIC02NzIsNyArNjM2LDYgQEAKIAkJCXJlcyA9IF9GQUlMOwogCQl9CiAJfQotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNjkwLDEzICs2NTMsMTIgQEAKIAl1OAkqcGZyYW1lLCAqcGF5bG9hZCwgKml2LCAqcHJ3c2tleTsKIAl1bmlvbiBwbjQ4IGRvdDExdHhwbjsKIAlzdHJ1Y3QJc3RhX2luZm8JCSpzdGFpbmZvOwotCXN0cnVjdAlyeF9wa3RfYXR0cmliCSAqcHJ4YXR0cmliID0gJigodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5hdHRyaWI7CisJc3RydWN0CXJ4X3BrdF9hdHRyaWIJICpwcnhhdHRyaWIgPSAmKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5hdHRyaWI7CiAJc3RydWN0CXNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAl1MzIJCXJlcyA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKLQlwZnJhbWUgPSAodW5zaWduZWQgY2hhciAqKSgodW5pb24gcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT51Lmhkci5yeF9kYXRhOworCXBmcmFtZSA9ICh1bnNpZ25lZCBjaGFyICopKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5yeF9kYXRhOwogCiAJLyogNCBzdGFydCB0byBkZWNyeXB0IHJlY3ZmcmFtZSAqLwogCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgPT0gX1RLSVBfKSB7CkBAIC03MTYsNyArNjc4LDcgQEAKIAogCQkJaXYgPSBwZnJhbWUrcHJ4YXR0cmliLT5oZHJsZW47CiAJCQlwYXlsb2FkID0gcGZyYW1lK3ByeGF0dHJpYi0+aXZfbGVuK3ByeGF0dHJpYi0+aGRybGVuOwotCQkJbGVuZ3RoID0gKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLmxlbi1wcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbjsKKwkJCWxlbmd0aCA9ICgoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+bGVuLXByeGF0dHJpYi0+aGRybGVuLXByeGF0dHJpYi0+aXZfbGVuOwogCiAJCQlHRVRfVEtJUF9QTihpdiwgZG90MTF0eHBuKTsKIApAQCAtNzQ3LDcgKzcwOSw2IEBACiAJCQlyZXMgPSBfRkFJTDsKIAkJfQogCX0KLV9mdW5jX2V4aXRfOwogZXhpdDoKIAlyZXR1cm4gcmVzOwogfQpAQCAtODIxLDE5ICs3ODIsMTUgQEAKIHN0YXRpYyB2b2lkIHhvcl8xMjgodTggKmEsIHU4ICpiLCB1OCAqb3V0KQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCB4b3JfMzIodTggKmEsIHU4ICpiLCB1OCAqb3V0KQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB1OCBzYm94KHU4IGEpCkBAIC04NDksNyArODA2LDYgQEAKIAkJMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwKIAkJMHgxYiwgMHgzNiwgMHgzNiwgMHgzNgogCX07Ci1fZnVuY19lbnRlcl87CiAJc2JveF9rZXlbMF0gPSBzYm94KGtleVsxM10pOwogCXNib3hfa2V5WzFdID0gc2JveChrZXlbMTRdKTsKIAlzYm94X2tleVsyXSA9IHNib3goa2V5WzE1XSk7CkBAIC04NjMsMjEgKzgxOSwxNyBAQAogCXhvcl8zMigma2V5WzRdLCAma2V5WzBdLCAma2V5WzRdKTsKIAl4b3JfMzIoJmtleVs4XSwgJmtleVs0XSwgJmtleVs4XSk7CiAJeG9yXzMyKCZrZXlbMTJdLCAma2V5WzhdLCAma2V5WzEyXSk7Ci1fZnVuY19leGl0XzsKIH0KIAogc3RhdGljIHZvaWQgYnl0ZV9zdWIodTggKmluLCB1OCAqb3V0KQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlvdXRbaV0gPSBzYm94KGluW2ldKTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBzaGlmdF9yb3codTggKmluLCB1OCAqb3V0KQogewotX2Z1bmNfZW50ZXJfOwogCW91dFswXSA9ICBpblswXTsKIAlvdXRbMV0gPSAgaW5bNV07CiAJb3V0WzJdID0gIGluWzEwXTsKQEAgLTg5NCw3ICs4NDYsNiBAQAogCW91dFsxM10gPSBpblsxXTsKIAlvdXRbMTRdID0gaW5bNl07CiAJb3V0WzE1XSA9IGluWzExXTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBtaXhfY29sdW1uKHU4ICppbiwgdTggKm91dCkKQEAgLTkwOCw3ICs4NTksNiBAQAogCXU4IHJvdHJbNF07CiAJdTggdGVtcFs0XTsKIAl1OCB0ZW1wYls0XTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwIDsgaSA8IDQ7IGkrKykgewogCQlpZiAoKGluW2ldICYgMHg4MCkgPT0gMHg4MCkKIAkJCWFkZDFiW2ldID0gMHgxYjsKQEAgLTk1Miw3ICs5MDIsNiBAQAogCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKIAl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCwgdGVtcGIpOwogCXhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBhZXMxMjhrMTI4ZCh1OCAqa2V5LCB1OCAqZGF0YSwgdTggKmNpcGhlcnRleHQpCkBAIC05NjIsNyArOTExLDYgQEAKIAl1OCBpbnRlcm1lZGlhdGVhWzE2XTsKIAl1OCBpbnRlcm1lZGlhdGViWzE2XTsKIAl1OCByb3VuZF9rZXlbMTZdOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlyb3VuZF9rZXlbaV0gPSBrZXlbaV07CiAJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspIHsKQEAgLTk4NCw3ICs5MzIsNiBAQAogCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7CiAJCX0KIAl9Ci1fZnVuY19leGl0XzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk5NSw3ICs5NDIsNiBAQAogCQkJICAgICB1aW50IHBheWxvYWRfbGVuZ3RoLCB1OCAqcG5fdmVjdG9yKQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCW1pY19pdlswXSA9IDB4NTk7CiAJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCiAJCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDCSAgICovCkBAIC0xMDA5LDcgKzk1NSw2IEBACiAJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOwkvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCiAJbWljX2l2WzE0XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOwogCW1pY19pdlsxNV0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKLV9mdW5jX2V4aXRfOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAxOSw3ICs5NjQsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSh1OCAqbWljX2hlYWRlcjEsIGludCBoZWFkZXJfbGVuZ3RoLCB1OCAqbXBkdSkKIHsKLV9mdW5jX2VudGVyXzsKIAltaWNfaGVhZGVyMVswXSA9ICh1OCkoKGhlYWRlcl9sZW5ndGggLSAyKSAvIDI1Nik7CiAJbWljX2hlYWRlcjFbMV0gPSAodTgpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOwogCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7ICAgIC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCkBAIC0xMDM2LDcgKzk4MCw2IEBACiAJbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107CiAJbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07CiAJbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Ci1fZnVuY19leGl0XzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwNDcsNyArOTkwLDYgQEAKIHN0YXRpYyB2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMih1OCAqbWljX2hlYWRlcjIsIHU4ICptcGR1LCBpbnQgYTRfZXhpc3RzLCBpbnQgcWNfZXhpc3RzKQogewogCWludCBpOwotX2Z1bmNfZW50ZXJfOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQltaWNfaGVhZGVyMltpXSA9IDB4MDA7CiAKQEAgLTEwNzksNyArMTAyMSw2IEBACiAJCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA5MCw3ICsxMDMxLDYgQEAKIHN0YXRpYyB2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCh1OCAqY3RyX3ByZWxvYWQsIGludCBhNF9leGlzdHMsIGludCBxY19leGlzdHMsIHU4ICptcGR1LCB1OCAqcG5fdmVjdG9yLCBpbnQgYykKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJY3RyX3ByZWxvYWRbaV0gPSAweDAwOwogCWkgPSAwOwpAQCAtMTEwNyw3ICsxMDQ3LDYgQEAKIAkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbMTMgLSBpXTsJICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KIAljdHJfcHJlbG9hZFsxNF0gPSAgKHVuc2lnbmVkIGNoYXIpIChjIC8gMjU2KTsgLyogQ3RyICovCiAJY3RyX3ByZWxvYWRbMTVdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAlIDI1Nik7Ci1fZnVuY19leGl0XzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExMTcsMTAgKzEwNTYsOCBAQAogc3RhdGljIHZvaWQgYml0d2lzZV94b3IodTggKmluYSwgdTggKmluYiwgdTggKm91dCkKIHsKIAlpbnQgaTsKLV9mdW5jX2VudGVyXzsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJb3V0W2ldID0gaW5hW2ldIF4gaW5iW2ldOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyBpbnQgYWVzX2NpcGhlcih1OCAqa2V5LCB1aW50IGhkcmxlbiwgdTggKnBmcmFtZSwgdWludCBwbGVuKQpAQCAtMTE0Miw3ICsxMDc5LDYgQEAKIAl1aW50CWZydHlwZSAgPSBHZXRGcmFtZVR5cGUocGZyYW1lKTsKIAl1aW50CWZyc3VidHlwZSAgPSBHZXRGcmFtZVN1YlR5cGUocGZyYW1lKTsKIAotX2Z1bmNfZW50ZXJfOwogCWZyc3VidHlwZSA9IGZyc3VidHlwZT4+NDsKIAogCV9ydHdfbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7CkBAIC0xMjUzLDcgKzExODksNiBAQAogCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CiAJZm9yIChqID0gMDsgaiA8IDg7IGorKykKIAkJcGZyYW1lW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTEyNzQsNyArMTIwOSw2IEBACiAKIC8qCXVpbnQJb2Zmc2V0ID0gMDsgKi8KIAl1MzIgcmVzID0gX1NVQ0NFU1M7Ci1fZnVuY19lbnRlcl87CiAKIAlpZiAoKChzdHJ1Y3QgeG1pdF9mcmFtZSAqKXB4bWl0ZnJhbWUpLT5idWZfYWRkciA9PSBOVUxMKQogCQlyZXR1cm4gX0ZBSUw7CkBAIC0xMzE4LDcgKzEyNTIsNiBAQAogCX0KIAogCi1fZnVuY19leGl0XzsKIAkJcmV0dXJuIHJlczsKIH0KIApAQCAtMTM0NCw3ICsxMjc3LDYgQEAKIC8qCXVpbnQJb2Zmc2V0ID0gMDsgKi8KIAl1aW50CWZydHlwZSAgPSBHZXRGcmFtZVR5cGUocGZyYW1lKTsKIAl1aW50CWZyc3VidHlwZSAgPSBHZXRGcmFtZVN1YlR5cGUocGZyYW1lKTsKLV9mdW5jX2VudGVyXzsKIAlmcnN1YnR5cGUgPSBmcnN1YnR5cGU+PjQ7CiAKIAlfcnR3X21lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwpAQCAtMTUxNCw3ICsxNDQ2LDYgQEAKIAkJCXJlcyA9IF9GQUlMOwogCQl9CiAJfQotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTUyNCwxMSArMTQ1NSwxMCBAQAogCWludAkJbGVuZ3RoOwogCXU4CSpwZnJhbWUsICpwcndza2V5OwkvKiAgKnBheWxvYWQsKml2ICovCiAJc3RydWN0CXN0YV9pbmZvCQkqc3RhaW5mbzsKLQlzdHJ1Y3QJcnhfcGt0X2F0dHJpYgkgKnByeGF0dHJpYiA9ICYoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIuYXR0cmliOworCXN0cnVjdAlyeF9wa3RfYXR0cmliCSAqcHJ4YXR0cmliID0gJigoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+YXR0cmliOwogCXN0cnVjdAlzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJdTMyCXJlcyA9IF9TVUNDRVNTOwotX2Z1bmNfZW50ZXJfOwotCXBmcmFtZSA9ICh1bnNpZ25lZCBjaGFyICopKCh1bmlvbiByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnUuaGRyLnJ4X2RhdGE7CisJcGZyYW1lID0gKHVuc2lnbmVkIGNoYXIgKikoKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3ZmcmFtZSktPnJ4X2RhdGE7CiAJLyogNCBzdGFydCB0byBlbmNyeXB0IGVhY2ggZnJhZ21lbnQgKi8KIAlpZiAoKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBfQUVTXykpIHsKIAkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYsICZwcnhhdHRyaWItPnRhWzBdKTsKQEAgLTE1NTIsMTQgKzE0ODIsMTMgQEAKIAkJCX0gZWxzZSB7CiAJCQkJcHJ3c2tleSA9ICZzdGFpbmZvLT5kb3QxMTgwMjF4X1VuY3N0S2V5LnNrZXlbMF07CiAJCQl9Ci0JCQlsZW5ndGggPSAoKHVuaW9uIHJlY3ZfZnJhbWUgKilwcmVjdmZyYW1lKS0+dS5oZHIubGVuLXByeGF0dHJpYi0+aGRybGVuLXByeGF0dHJpYi0+aXZfbGVuOworCQkJbGVuZ3RoID0gKChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2ZnJhbWUpLT5sZW4tcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW47CiAJCQlyZXMgPSBhZXNfZGVjaXBoZXIocHJ3c2tleSwgcHJ4YXR0cmliLT5oZHJsZW4sIHBmcmFtZSwgbGVuZ3RoKTsKIAkJfSBlbHNlIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLCAoInJ0d19hZXNfZW5jcnlwdDogc3RhaW5mbz09TlVMTCEhIVxuIikpOwogCQkJcmVzID0gX0ZBSUw7CiAJCX0KIAl9Ci1fZnVuY19leGl0XzsKIGV4aXQ6CiAJcmV0dXJuIHJlczsKIH0KQEAgLTE3NjcsNyArMTY5Niw2IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJeXl5ydHdfdXNlX3RraXBrZXlfaGFuZGxlciBeXl5cbiIpKTsKIApAQCAtMTc3NSw1ICsxNzAzLDQgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLCAoIl5eXnJ0d191c2VfdGtpcGtleV9oYW5kbGVyIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXk9JWReXl5cbiIsIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkpKTsKIAotX2Z1bmNfZXhpdF87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3N0YV9tZ3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3RhX21ndC5jCmluZGV4IDAyZTFlMWYuLjJkMGI2MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3RhX21ndC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3RhX21ndC5jCkBAIC0yNSwxMCArMjUsMTAgQEAKICNpbmNsdWRlIDx4bWl0X29zZGVwLmg+CiAjaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgogI2luY2x1ZGUgPHN0YV9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiBzdGF0aWMgdm9pZCBfcnR3X2luaXRfc3RhaW5mbyhzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCiB7Ci1fZnVuY19lbnRlcl87CiAJX3J0d19tZW1zZXQoKHU4ICopcHN0YSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3RhX2luZm8pKTsKIAogCSBzcGluX2xvY2tfaW5pdCgmcHN0YS0+bG9jayk7CkBAIC02OSw3ICs2OSw2IEBACiAKICNlbmRpZgkvKiAgQ09ORklHXzg4RVVfQVBfTU9ERSAqLwogCi1fZnVuY19leGl0XzsKIH0KIAogdTMyCV9ydHdfaW5pdF9zdGFfcHJpdihzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2KQpAQCAtNzcsOSArNzYsOCBAQAogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKIAlzMzIgaTsKIAotX2Z1bmNfZW50ZXJfOwogCi0JcHN0YXByaXYtPnBhbGxvY2F0ZWRfc3RhaW5mb19idWYgPSBydHdfenZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGFfaW5mbykgKiBOVU1fU1RBICsgNCk7CisJcHN0YXByaXYtPnBhbGxvY2F0ZWRfc3RhaW5mb19idWYgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pICogTlVNX1NUQSArIDQpOwogCiAJaWYgKCFwc3RhcHJpdi0+cGFsbG9jYXRlZF9zdGFpbmZvX2J1ZikKIAkJcmV0dXJuIF9GQUlMOwpAQCAtMTI1LDcgKzEyMyw2IEBACiAJcHN0YXByaXYtPm1heF9udW1fc3RhID0gTlVNX1NUQTsKICNlbmRpZgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTE1NCwyMSArMTUxLDE5IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwogCi1fZnVuY19lbnRlcl87CiAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YXByaXYtPmZyZWVfc3RhX3F1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSA9PSBmYWxzZSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbyAsIGxpc3QpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvICwgbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHJ0d19tZnJlZV9zdGFfcHJpdl9sb2NrKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYpCkBAIC0xODMsMjIgKzE3OCwyMSBAQAogCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKIAlpbnQJaW5kZXg7CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAocHN0YXByaXYpIHsKIAkJLyoJZGVsZXRlIGFsbCByZW9yZGVyaW5nX2N0cmxfdGltZXIJCSovCiAJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwogCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fU1RBOyBpbmRleCsrKSB7CiAJCQlwaGVhZCA9ICYocHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XSk7Ci0JCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAkJCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKIAkJCQlpbnQgaTsKLQkJCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbyAsIGhhc2hfbGlzdCk7Ci0JCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvICwgaGFzaF9saXN0KTsKKwkJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJCQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwotCQkJCQlfY2FuY2VsX3RpbWVyX2V4KCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOworCQkJCQlkZWxfdGltZXJfc3luYygmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTIwOCwxMCArMjAyLDkgQEAKIAkJcnR3X21mcmVlX3N0YV9wcml2X2xvY2socHN0YXByaXYpOwogCiAJCWlmIChwc3RhcHJpdi0+cGFsbG9jYXRlZF9zdGFpbmZvX2J1ZikKLQkJCXJ0d192bWZyZWUocHN0YXByaXYtPnBhbGxvY2F0ZWRfc3RhaW5mb19idWYsIHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pKk5VTV9TVEErNCk7CisJCQl2ZnJlZShwc3RhcHJpdi0+cGFsbG9jYXRlZF9zdGFpbmZvX2J1Zik7CiAJfQogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTIyNSw3ICsyMTgsNiBAQAogCWludCBpID0gMDsKIAl1MTYgIHdSeFNlcUluaXRpYWxWYWx1ZSA9IDB4ZmZmZjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGZyZWVfc3RhX3F1ZXVlID0gJnBzdGFwcml2LT5mcmVlX3N0YV9xdWV1ZTsKIApAQCAtMjM1LDcgKzIyNyw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV9zdGFfcXVldWUtPmxvY2spOwogCQlwc3RhID0gTlVMTDsKIAl9IGVsc2UgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IoZ2V0X25leHQoJnBmcmVlX3N0YV9xdWV1ZS0+cXVldWUpLCBzdHJ1Y3Qgc3RhX2luZm8sIGxpc3QpOworCQlwc3RhID0gY29udGFpbmVyX29mKCgmcGZyZWVfc3RhX3F1ZXVlLT5xdWV1ZSktPm5leHQsIHN0cnVjdCBzdGFfaW5mbywgbGlzdCk7CiAJCXJ0d19saXN0X2RlbGV0ZSgmKHBzdGEtPmxpc3QpKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnBmcmVlX3N0YV9xdWV1ZS0+bG9jayk7CiAJCV9ydHdfaW5pdF9zdGFpbmZvKHBzdGEpOwpAQCAtMjk3LDkgKzI4OSw2IEBACiAJfQogCiBleGl0OgotCi1fZnVuY19leGl0XzsKLQogCXJldHVybiBwc3RhOwogfQogCkBAIC0zMTMsNyArMzAyLDYgQEAKIAlzdHJ1Y3QJeG1pdF9wcml2CSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwogCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwc3RhID09IE5VTEwpCiAJCWdvdG8gZXhpdDsKQEAgLTM1MywzMiArMzQxLDM0IEBACiAJX3J0d19pbml0X3N0YV94bWl0X3ByaXYoJnBzdGEtPnN0YV94bWl0cHJpdik7CiAJX3J0d19pbml0X3N0YV9yZWN2X3ByaXYoJnBzdGEtPnN0YV9yZWN2cHJpdik7CiAKLQlfY2FuY2VsX3RpbWVyX2V4KCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBzdGEtPmFkZGJhX3JldHJ5X3RpbWVyKTsKIAogCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCwgY2FuY2VsIHJlb3JkZXJpbmdfY3RybF90aW1lciAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7Ci0JCXVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWU7CisJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmhkcjsKKwkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWU7CiAJCXN0cnVjdCBfX3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7CiAJCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlID0gJnBhZGFwdGVyLT5yZWN2cHJpdi5mcmVlX3JlY3ZfcXVldWU7CiAKIAkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwogCi0JCV9jYW5jZWxfdGltZXJfZXgoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwogCiAJCXBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKIAogCQlzcGluX2xvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CiAKIAkJcGhlYWQgPQkJZ2V0X2xpc3RfaGVhZChwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUpOwotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQl3aGlsZSAoIXJ0d19pc19saXN0X2VtcHR5KHBoZWFkKSkgewotCQkJcHJmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKKwkJCXByaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7CisJCQlwcmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcHJoZHI7CiAKLQkJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAotCQkJcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+dS5oZHIubGlzdCkpOworCQkJcnR3X2xpc3RfZGVsZXRlKCYocHJmcmFtZS0+bGlzdCkpOwogCiAJCQlydHdfZnJlZV9yZWN2ZnJhbWUocHJmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAJCX0KQEAgLTQyOCw3ICs0MTgsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTQ0MiwzMiArNDMxLDI2IEBACiAJc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBiY21jX3N0YWluZm8gPSBydHdfZ2V0X2JjbWNfc3RhaW5mbyhwYWRhcHRlcik7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwc3RhcHJpdi0+YXNvY19zdGFfY291bnQgPT0gMSkKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9TVEE7IGluZGV4KyspIHsKIAkJcGhlYWQgPSAmKHBzdGFwcml2LT5zdGFfaGFzaFtpbmRleF0pOwotCQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCQl3aGlsZSAoKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSkgewotCQkJcHN0YSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8gLCBoYXNoX2xpc3QpOworCQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvICwgaGFzaF9saXN0KTsKIAotCQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCQlpZiAocGJjbWNfc3RhaW5mbyAhPSBwc3RhKQogCQkJCXJ0d19mcmVlX3N0YWluZm8ocGFkYXB0ZXIgLCBwc3RhKTsKIAkJfQogCX0KLQogCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0KLWV4aXQ6Ci0KLV9mdW5jX2V4aXRfOwogfQogCiAvKiBhbnkgc3RhdGlvbiBhbGxvY2F0ZWQgY2FuIGJlIHNlYXJjaGVkIGJ5IGhhc2ggbGlzdCAqLwpAQCAtNDc5LDcgKzQ2Miw2IEBACiAJdTggKmFkZHI7CiAJdTggYmNfYWRkcltFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChod2FkZHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CkBAIC00OTQsMjEgKzQ3NiwyMCBAQAogCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwogCiAJcGhlYWQgPSAmKHBzdGFwcml2LT5zdGFfaGFzaFtpbmRleF0pOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBoYXNoX2xpc3QpOwogCi0JCWlmICgoX3J0d19tZW1jbXAocHN0YS0+aHdhZGRyLCBhZGRyLCBFVEhfQUxFTikpID09IHRydWUpIHsKKwkJaWYgKCghbWVtY21wKHBzdGEtPmh3YWRkciwgYWRkciwgRVRIX0FMRU4pKSA9PSB0cnVlKSB7CiAJCQkvKiAgaWYgZm91bmQgdGhlIG1hdGNoZWQgYWRkcmVzcyAqLwogCQkJYnJlYWs7CiAJCX0KIAkJcHN0YSA9IE5VTEw7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcHN0YTsKIH0KIApAQCAtNTE5LDcgKzUwMCw2IEBACiAJdW5zaWduZWQgY2hhciBiY2FzdF9hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKIAlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8ocHN0YXByaXYsIGJjYXN0X2FkZHIpOwogCkBAIC01MzMsNyArNTEzLDYgQEAKIAlwc3RhLT5tYWNfaWQgPSAxOwogCiBleGl0OgotX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNTQyLDkgKzUyMSw3IEBACiAJc3RydWN0IHN0YV9pbmZvCQkqcHN0YTsKIAlzdHJ1Y3Qgc3RhX3ByaXYJCSpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAl1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLV9mdW5jX2VudGVyXzsKIAkgcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgYmNfYWRkcik7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcHN0YTsKIH0KIApAQCAtNTYxLDEyICs1MzgsMTIgQEAKIAogCXNwaW5fbG9ja19iaCgmKHBhY2xfbm9kZV9xLT5sb2NrKSk7CiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBhY2xfbm9kZV9xKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCXdoaWxlICgoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpKSB7Ci0JCXBhY2xub2RlID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSwgbGlzdCk7Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwYWNsbm9kZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlLCBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAotCQlpZiAoX3J0d19tZW1jbXAocGFjbG5vZGUtPmFkZHIsIG1hY19hZGRyLCBFVEhfQUxFTikpIHsKKwkJaWYgKCFtZW1jbXAocGFjbG5vZGUtPmFkZHIsIG1hY19hZGRyLCBFVEhfQUxFTikpIHsKIAkJCWlmIChwYWNsbm9kZS0+dmFsaWQpIHsKIAkJCQltYXRjaCA9IHRydWU7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYwppbmRleCA5NmRmNjJmLi4zZGQ5MDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKQEAgLTkyOSw3ICs5MjksNyBAQAogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCi0JaWYgKF9ydHdfbWVtY21wKGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBic3NpZCwgNikgPT0gZmFsc2UpIHsKKwlpZiAoIW1lbWNtcChjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwYnNzaWQsIDYpID09IGZhbHNlKSB7CiAJCURCR184OEUoIk9vcHM6IHJ0d19jaGVja19uZXR3b3JrX2VuY3J5cHQgbGlua2VkIGJ1dCByZWN2IG90aGVyIGJzc2lkIGJjblxuJXBNICVwTVxuIiwKIAkJCShwYnNzaWQpLCAoY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcykpOwogCQlyZXR1cm4gdHJ1ZTsKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAJCQkJYnNzaWQtPlNzaWQuU3NpZExlbmd0aCwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkLAogCQkJCWN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZExlbmd0aCkpOwogCi0JaWYgKCFfcnR3X21lbWNtcChic3NpZC0+U3NpZC5Tc2lkLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQsIDMyKSB8fAorCWlmIChtZW1jbXAoYnNzaWQtPlNzaWQuU3NpZCwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkLCAzMikgfHwKIAkgICAgYnNzaWQtPlNzaWQuU3NpZExlbmd0aCAhPSBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWRMZW5ndGgpIHsKIAkJaWYgKGJzc2lkLT5Tc2lkLlNzaWRbMF0gIT0gJ1wwJyAmJiBic3NpZC0+U3NpZC5Tc2lkTGVuZ3RoICE9IDApIHsgLyogbm90IGhpZGRlbiBzc2lkICovCiAJCQlEQkdfODhFKCIlcygpLCBTU0lEIGlzIG5vdCBtYXRjaCByZXR1cm4gRkFJTFxuIiwgX19mdW5jX18pOwpAQCAtMTA1MCw3ICsxMDUwLDcgQEAKIAl9CiAKIAlpZiAoY3VyX25ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sICE9IGVuY3J5cF9wcm90b2NvbCkgewotCQlEQkdfODhFKCIlcygpOiBlbmN0eXAgaXMgbm90IG1hdGNoICwgcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKKwkJREJHXzg4RSgiJXMoKTogZW5jcnlwdGlvbiBwcm90b2NvbCBpcyBub3QgbWF0Y2ggLCByZXR1cm4gRkFJTFxuIiwgX19mdW5jX18pOwogCQlnb3RvIF9taXNtYXRjaDsKIAl9CiAKQEAgLTEwOTAsMTIgKzEwOTAsMTAgQEAKIAl9CiAKIAlrZnJlZShic3NpZCk7Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIF9TVUNDRVNTOwogCiBfbWlzbWF0Y2g6CiAJa2ZyZWUoYnNzaWQpOwotCV9mdW5jX2V4aXRfOwogCXJldHVybiBfRkFJTDsKIH0KIApAQCAtMTE0MSwxMSArMTEzOSwxMSBAQAogCiAJCQlzd2l0Y2ggKHBJRS0+RWxlbWVudElEKSB7CiAJCQljYXNlIF9WRU5ET1JfU1BFQ0lGSUNfSUVfOgotCQkJCWlmICgoX3J0d19tZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkpICYmIChfcnR3X21lbWNtcCgocElFLT5kYXRhICsgMTIpLCBXUEFfVEtJUF9DSVBIRVIsIDQpKSkKKwkJCQlpZiAoKCFtZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkpICYmICghbWVtY21wKChwSUUtPmRhdGEgKyAxMiksIFdQQV9US0lQX0NJUEhFUiwgNCkpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQlicmVhazsKIAkJCWNhc2UgX1JTTl9JRV8yXzoKLQkJCQlpZiAoX3J0d19tZW1jbXAoKHBJRS0+ZGF0YSArIDgpLCBSU05fVEtJUF9DSVBIRVIsIDQpKQorCQkJCWlmICghbWVtY21wKChwSUUtPmRhdGEgKyA4KSwgUlNOX1RLSVBfQ0lQSEVSLCA0KSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQlkZWZhdWx0OgogCQkJCWJyZWFrOwpAQCAtMTE3MiwxNCArMTE3MCwxNCBAQAogCiAJCQlzd2l0Y2ggKHBJRS0+RWxlbWVudElEKSB7CiAJCQljYXNlIF9WRU5ET1JfU1BFQ0lGSUNfSUVfOgotCQkJCWlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIFJUV19XUEFfT1VJLCA0KSAmJgotCQkJCSAgICAoKF9ydHdfbWVtY21wKChwSUUtPmRhdGEgKyAxMiksIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpIHx8Ci0JCQkJICAgIChfcnR3X21lbWNtcCgocElFLT5kYXRhICsgMTYpLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSkpCisJCQkJaWYgKCFtZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkgJiYKKwkJCQkgICAgKCghbWVtY21wKChwSUUtPmRhdGEgKyAxMiksIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpIHx8CisJCQkJICAgICghbWVtY21wKChwSUUtPmRhdGEgKyAxNiksIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpKSkKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCWJyZWFrOwogCQkJY2FzZSBfUlNOX0lFXzJfOgotCQkJCWlmICAoKF9ydHdfbWVtY21wKChwSUUtPmRhdGEgKyA4KSwgUlNOX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkgIHx8Ci0JCQkJICAgICAgIChfcnR3X21lbWNtcCgocElFLT5kYXRhICsgMTIpLCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAsIDQpKSkKKwkJCQlpZiAgKCghbWVtY21wKChwSUUtPmRhdGEgKyA4KSwgUlNOX0NJUEhFUl9TVUlURV9DQ01QLCA0KSkgIHx8CisJCQkJICAgICAgICghbWVtY21wKChwSUUtPmRhdGEgKyAxMiksIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUCwgNCkpKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQlkZWZhdWx0OgogCQkJCWJyZWFrOwpAQCAtMTIwOCw3ICsxMjA2LDcgQEAKIAogCQkJc3dpdGNoIChwSUUtPkVsZW1lbnRJRCkgewogCQkJY2FzZSBfVkVORE9SX1NQRUNJRklDX0lFXzoKLQkJCQlpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkpCisJCQkJaWYgKCFtZW1jbXAocElFLT5kYXRhLCBSVFdfV1BBX09VSSwgNCkpCiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQlicmVhazsKIAkJCWNhc2UgX1JTTl9JRV8yXzoKQEAgLTE0MDAsMzUgKzEzOTgsMzUgQEAKIAogCQlzd2l0Y2ggKHBJRS0+RWxlbWVudElEKSB7CiAJCWNhc2UgX1ZFTkRPUl9TUEVDSUZJQ19JRV86Ci0JCQlpZiAoKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgQVJUSEVST1NfT1VJMSwgMykpIHx8Ci0JCQkgICAgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgQVJUSEVST1NfT1VJMiwgMykpKSB7CisJCQlpZiAoKCFtZW1jbXAocElFLT5kYXRhLCBBUlRIRVJPU19PVUkxLCAzKSkgfHwKKwkJCSAgICAoIW1lbWNtcChwSUUtPmRhdGEsIEFSVEhFUk9TX09VSTIsIDMpKSkgewogCQkJCURCR184OEUoImxpbmsgdG8gQXJ0aGVyb3MgQVBcbiIpOwogCQkJCXJldHVybiBIVF9JT1RfUEVFUl9BVEhFUk9TOwotCQkJfSBlbHNlIGlmICgoX3J0d19tZW1jbXAocElFLT5kYXRhLCBCUk9BRENPTV9PVUkxLCAzKSkgfHwKLQkJCQkgICAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBCUk9BRENPTV9PVUkyLCAzKSkgfHwKLQkJCQkgICAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBCUk9BRENPTV9PVUkyLCAzKSkpIHsKKwkJCX0gZWxzZSBpZiAoKCFtZW1jbXAocElFLT5kYXRhLCBCUk9BRENPTV9PVUkxLCAzKSkgfHwKKwkJCQkgICAoIW1lbWNtcChwSUUtPmRhdGEsIEJST0FEQ09NX09VSTIsIDMpKSB8fAorCQkJCSAgICghbWVtY21wKHBJRS0+ZGF0YSwgQlJPQURDT01fT1VJMiwgMykpKSB7CiAJCQkJREJHXzg4RSgibGluayB0byBCcm9hZGNvbSBBUFxuIik7CiAJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0JST0FEQ09NOwotCQkJfSBlbHNlIGlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIE1BUlZFTExfT1VJLCAzKSkgeworCQkJfSBlbHNlIGlmICghbWVtY21wKHBJRS0+ZGF0YSwgTUFSVkVMTF9PVUksIDMpKSB7CiAJCQkJREJHXzg4RSgibGluayB0byBNYXJ2ZWxsIEFQXG4iKTsKIAkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfTUFSVkVMTDsKLQkJCX0gZWxzZSBpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBSQUxJTktfT1VJLCAzKSkgeworCQkJfSBlbHNlIGlmICghbWVtY21wKHBJRS0+ZGF0YSwgUkFMSU5LX09VSSwgMykpIHsKIAkJCQlpZiAoIXJhbGlua192ZW5kb3JfZmxhZykgewogCQkJCQlyYWxpbmtfdmVuZG9yX2ZsYWcgPSAxOwogCQkJCX0gZWxzZSB7CiAJCQkJCURCR184OEUoImxpbmsgdG8gUmFsaW5rIEFQXG4iKTsKIAkJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX1JBTElOSzsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKF9ydHdfbWVtY21wKHBJRS0+ZGF0YSwgQ0lTQ09fT1VJLCAzKSkgeworCQkJfSBlbHNlIGlmICghbWVtY21wKHBJRS0+ZGF0YSwgQ0lTQ09fT1VJLCAzKSkgewogCQkJCURCR184OEUoImxpbmsgdG8gQ2lzY28gQVBcbiIpOwogCQkJCXJldHVybiBIVF9JT1RfUEVFUl9DSVNDTzsKLQkJCX0gZWxzZSBpZiAoX3J0d19tZW1jbXAocElFLT5kYXRhLCBSRUFMVEVLX09VSSwgMykpIHsKKwkJCX0gZWxzZSBpZiAoIW1lbWNtcChwSUUtPmRhdGEsIFJFQUxURUtfT1VJLCAzKSkgewogCQkJCURCR184OEUoImxpbmsgdG8gUmVhbHRlayA5NkJcbiIpOwogCQkJCXJldHVybiBIVF9JT1RfUEVFUl9SRUFMVEVLOwotCQkJfSBlbHNlIGlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIEFJUkdPQ0FQX09VSSwgMykpIHsKKwkJCX0gZWxzZSBpZiAoIW1lbWNtcChwSUUtPmRhdGEsIEFJUkdPQ0FQX09VSSwgMykpIHsKIAkJCQlEQkdfODhFKCJsaW5rIHRvIEFpcmdvIENhcFxuIik7CiAJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0FJUkdPOwotCQkJfSBlbHNlIGlmIChfcnR3X21lbWNtcChwSUUtPmRhdGEsIEVQSUdSQU1fT1VJLCAzKSkgeworCQkJfSBlbHNlIGlmICghbWVtY21wKHBJRS0+ZGF0YSwgRVBJR1JBTV9PVUksIDMpKSB7CiAJCQkJZXBpZ3JhbV92ZW5kb3JfZmxhZyA9IDE7CiAJCQkJaWYgKHJhbGlua192ZW5kb3JfZmxhZykgewogCQkJCQlEQkdfODhFKCJsaW5rIHRvIFRlbmRhIFczMTFSIEFQXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d194bWl0LmMKaW5kZXggMjQxODJmYi4uOGQ0MjY1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d194bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d194bWl0LmMKQEAgLTIzLDI1ICsyMywyMiBAQAogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHdpZmkuaD4KICNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8aXAuaD4KICNpbmNsdWRlIDx1c2Jfb3BzLmg+CiAjaW5jbHVkZSA8dXNiX29zaW50Zi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogc3RhdGljIHU4IFA4MDJfMUhfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHhmOCB9Owogc3RhdGljIHU4IFJGQzEwNDJfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCB9OwogCiBzdGF0aWMgdm9pZCBfaW5pdF90eHNlcnZxKHN0cnVjdCB0eF9zZXJ2cSAqcHR4c2VydnEpCiB7Ci1fZnVuY19lbnRlcl87CiAJX3J0d19pbml0X2xpc3RoZWFkKCZwdHhzZXJ2cS0+dHhfcGVuZGluZyk7CiAJX3J0d19pbml0X3F1ZXVlKCZwdHhzZXJ2cS0+c3RhX3BlbmRpbmcpOwogCXB0eHNlcnZxLT5xY250ID0gMDsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkCV9ydHdfaW5pdF9zdGFfeG1pdF9wcml2KHN0cnVjdCBzdGFfeG1pdF9wcml2ICpwc3RhX3htaXRwcml2KQogewotX2Z1bmNfZW50ZXJfOwogCV9ydHdfbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopcHN0YV94bWl0cHJpdiwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3RhX3htaXRfcHJpdikpOwogCXNwaW5fbG9ja19pbml0KCZwc3RhX3htaXRwcml2LT5sb2NrKTsKIAlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT5iZV9xKTsKQEAgLTUxLDcgKzQ4LDYgQEAKIAlfcnR3X2luaXRfbGlzdGhlYWQoJnBzdGFfeG1pdHByaXYtPmxlZ2FjeV9keik7CiAJX3J0d19pbml0X2xpc3RoZWFkKCZwc3RhX3htaXRwcml2LT5hcHNkKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHMzMglfcnR3X2luaXRfeG1pdF9wcml2KHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtNjMsOSArNTksOCBAQAogCXUzMiBtYXhfeG1pdF9leHRidWZfc2l6ZSA9IE1BWF9YTUlUX0VYVEJVRl9TWjsKIAl1MzIgbnVtX3htaXRfZXh0YnVmID0gTlJfWE1JVF9FWFRCVUZGOwogCi1fZnVuY19lbnRlcl87CiAKLQkvKiAgV2UgZG9uJ3QgbmVlZCB0byBtZW1zZXQgcGFkYXB0ZXItPlhYWCB0byB6ZXJvLCBiZWNhdXNlIGFkYXB0ZXIgaXMgYWxsb2NhdGVkIGJ5IHJ0d196dm1hbGxvYygpLiAqLworCS8qICBXZSBkb24ndCBuZWVkIHRvIG1lbXNldCBwYWRhcHRlci0+WFhYIHRvIHplcm8sIGJlY2F1c2UgYWRhcHRlciBpcyBhbGxvY2F0ZWQgYnkgdnphbGxvYygpLiAqLwogCiAJc3Bpbl9sb2NrX2luaXQoJnB4bWl0cHJpdi0+bG9jayk7CiAJc2VtYV9pbml0KCZweG1pdHByaXYtPnhtaXRfc2VtYSwgMCk7CkBAIC05MSw3ICs4Niw3IEBACiAJUGxlYXNlIGFsc28gYXBwbHkgIGZyZWVfdHhvYmogdG8gbGlua191cCBhbGwgdGhlIHhtaXRfZnJhbWVzLi4uCiAJKi8KIAotCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYgPSBydHdfenZtYWxsb2MoTlJfWE1JVEZSQU1FICogc2l6ZW9mKHN0cnVjdCB4bWl0X2ZyYW1lKSArIDQpOworCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYgPSB2emFsbG9jKE5SX1hNSVRGUkFNRSAqIHNpemVvZihzdHJ1Y3QgeG1pdF9mcmFtZSkgKyA0KTsKIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmICA9PSBOVUxMKSB7CiAJCXB4bWl0cHJpdi0+cHhtaXRfZnJhbWVfYnVmID0gTlVMTDsKQEAgLTEyOSw3ICsxMjQsNyBAQAogCV9ydHdfaW5pdF9xdWV1ZSgmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWUpOwogCV9ydHdfaW5pdF9xdWV1ZSgmcHhtaXRwcml2LT5wZW5kaW5nX3htaXRidWZfcXVldWUpOwogCi0JcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYgPSBydHdfenZtYWxsb2MoTlJfWE1JVEJVRkYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOworCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmID0gdnphbGxvYyhOUl9YTUlUQlVGRiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CiAKIAlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYgID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCJhbGxvYyB4bWl0X2J1ZiBmYWlsIVxuIikpOwpAQCAtMTcxLDcgKzE2Niw3IEBACiAJLyogIEluaXQgeG1pdCBleHRlbnNpb24gYnVmZiAqLwogCV9ydHdfaW5pdF9xdWV1ZSgmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlKTsKIAotCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiA9IHJ0d196dm1hbGxvYyhudW1feG1pdF9leHRidWYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOworCXB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiA9IHZ6YWxsb2MobnVtX3htaXRfZXh0YnVmICogc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZikgKyA0KTsKIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYgID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCJhbGxvYyB4bWl0X2V4dGJ1ZiBmYWlsIVxuIikpOwpAQCAtMjI2LDcgKzIyMSw2IEBACiAKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTI0MCwxMiArMjM0LDExIEBACiAJdTMyIG1heF94bWl0X2V4dGJ1Zl9zaXplID0gTUFYX1hNSVRfRVhUQlVGX1NaOwogCXUzMiBudW1feG1pdF9leHRidWYgPSBOUl9YTUlUX0VYVEJVRkY7CiAKLSBfZnVuY19lbnRlcl87CiAKIAlydHdfaGFsX2ZyZWVfeG1pdF9wcml2KHBhZGFwdGVyKTsKIAogCWlmIChweG1pdHByaXYtPnB4bWl0X2ZyYW1lX2J1ZiA9PSBOVUxMKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX1hNSVRGUkFNRTsgaSsrKSB7CiAJCXJ0d19vc194bWl0X2NvbXBsZXRlKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKQEAgLTI1OSwxMCArMjUyLDEwIEBACiAJfQogCiAJaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYpCi0JCXJ0d192bWZyZWUocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiwgTlJfWE1JVEZSQU1FICogc2l6ZW9mKHN0cnVjdCB4bWl0X2ZyYW1lKSArIDQpOworCQl2ZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKTsKIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1ZikKLQkJcnR3X3ZtZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1ZiwgTlJfWE1JVEJVRkYgKiBzaXplb2Yoc3RydWN0IHhtaXRfYnVmKSArIDQpOworCQl2ZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1Zik7CiAKIAkvKiAgZnJlZSB4bWl0IGV4dGVuc2lvbiBidWZmICovCiAJcHhtaXRidWYgPSAoc3RydWN0IHhtaXRfYnVmICopcHhtaXRwcml2LT5weG1pdF9leHRidWY7CkBAIC0yNzIsMTYgKzI2NSwxMiBAQAogCX0KIAogCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpIHsKLQkJcnR3X3ZtZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYsIG51bV94bWl0X2V4dGJ1ZiAqIHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpICsgNCk7CisJCXZmcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1Zik7CiAJfQogCiAJcnR3X2ZyZWVfaHd4bWl0cyhwYWRhcHRlcik7CiAKIAltdXRleF9kZXN0cm95KCZweG1pdHByaXYtPmFja190eF9tdXRleCk7Ci0KLW91dDoKLQotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9hdHRyaWJfdmNzX2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKQEAgLTQ1NSw3ICs0NDQsNiBAQAogCXN0cnVjdCBxb3NfcHJpdgkJKnBxb3Nwcml2ID0gJnBtbG1lcHJpdi0+cW9zcHJpdjsKIAlpbnQgcmVzID0gX1NVQ0NFU1M7CiAKLSBfZnVuY19lbnRlcl87CiAKIAlfcnR3X29wZW5fcGt0ZmlsZShwa3QsICZwa3RmaWxlKTsKIAlfcnR3X3BrdGZpbGVfcmVhZCgmcGt0ZmlsZSwgKHU4ICopJmV0aGVyaGRyLCBFVEhfSExFTik7CkBAIC02MzksNyArNjI3LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtNjYyLDcgKzY0OSw2IEBACiAJZWxzZQogCQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiAsICZwYXR0cmliLT5yYVswXSk7CiAKLV9mdW5jX2VudGVyXzsKIAogCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfU0laRSArIChweG1pdGZyYW1lLT5wa3Rfb2Zmc2V0ICogUEFDS0VUX09GRlNFVF9TWik7CiAKQEAgLTY3NiwxMiArNjYyLDEyIEBACiAJCQlwZnJhbWUgPSBweG1pdGZyYW1lLT5idWZfYWRkciArIGh3X2hkcl9vZmZzZXQ7CiAKIAkJCWlmIChibWNzdCkgewotCQkJCWlmIChfcnR3X21lbWNtcChwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwdHhtaWNrZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5LCBudWxsX2tleSwgMTYpKQorCQkJCWlmICghbWVtY21wKHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnB0eG1pY2tleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXksIG51bGxfa2V5LCAxNikpCiAJCQkJCXJldHVybiBfRkFJTDsKIAkJCQkvKiBzdGFydCB0byBjYWxjdWxhdGUgdGhlIG1pYyBjb2RlICovCiAJCQkJcnR3X3NlY21pY3NldGtleSgmbWljZGF0YSwgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHR4bWlja2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleSk7CiAJCQl9IGVsc2UgewotCQkJCWlmIChfcnR3X21lbWNtcCgmc3RhaW5mby0+ZG90MTF0a2lwdHhtaWNrZXkuc2tleVswXSwgbnVsbF9rZXksIDE2KSA9PSB0cnVlKSB7CisJCQkJaWYgKCFtZW1jbXAoJnN0YWluZm8tPmRvdDExdGtpcHR4bWlja2V5LnNrZXlbMF0sIG51bGxfa2V5LCAxNikpIHsKIAkJCQkJLyogRGJnUHJpbnQoIlxueG1pdGZyYW1lX2FkZG1pYzpzdGFpbmZvLT5kb3QxMXRraXB0eG1pY2tleSA9PSAwXG4iKTsgKi8KIAkJCQkJLyogbXNsZWVwKDEwKTsgKi8KIAkJCQkJcmV0dXJuIF9GQUlMOwpAQCAtNzYwLDcgKzc0Niw2IEBACiAJCQl9CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTc2OSw3ICs3NTQsNiBAQAogewogCXN0cnVjdAlwa3RfYXR0cmliCSAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwYXR0cmliLT5ic3dlbmMpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfYWxlcnRfLCAoIiMjIyB4bWl0ZnJhbWVfc3dlbmNyeXB0XG4iKSk7CkBAIC03OTEsNyArNzc1LDYgQEAKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfbm90aWNlXywgKCIjIyMgeG1pdGZyYW1lX2h3ZW5jcnlwdFxuIikpOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC04MTIsNyArNzk1LDYgQEAKIAogCWludCBibWNzdCA9IElTX01DQVNUKHBhdHRyaWItPnJhKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBhdHRyaWItPnBzdGEpIHsKIAkJcHN0YSA9IHBhdHRyaWItPnBzdGE7CkBAIC05MTgsNyArOTAwLDYgQEAKIAl9CiBleGl0OgogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xMDA3LDcgKzk4OCw2IEBACiAJczMyIGJtY3N0ID0gSVNfTUNBU1QocGF0dHJpYi0+cmEpOwogCXMzMiByZXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYsIHBhdHRyaWItPnJhKTsKIApAQCAtMTE0NSw3ICsxMTI1LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTE2Miw3ICsxMTQxLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICpzbmFwOwogCXU4ICpvdWk7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNuYXAgPSAoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqKWRhdGE7CiAJc25hcC0+ZHNhcCA9IDB4YWE7CkBAIC0xMTgwLDcgKzExNTgsNiBAQAogCiAJKihfX2JlMTYgKikoZGF0YSArIFNOQVBfU0laRSkgPSBodG9ucyhoX3Byb3RvKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CiB9CkBAIC0xMTkzLDcgKzExNzAsNiBAQAogCXN0cnVjdAl4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAJc3RydWN0CXJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3dpdGNoIChweG1pdHByaXYtPnZjc19zZXR0aW5nKSB7CiAJY2FzZSBESVNBQkxFX1ZDUzoKQEAgLTEyMjAsNyArMTE5Niw2IEBACiAJCWJyZWFrOwogCX0KIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnR3X2NvdW50X3R4X3N0YXRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsIGludCBzeikKQEAgLTEyNTAsNyArMTIyNSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlOwogCi1fZnVuY19lbnRlcl87CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGZyZWVfcXVldWUtPmxvY2ssIGlycWwpOwogCkBAIC0xMjU5LDkgKzEyMzMsOSBAQAogCX0gZWxzZSB7CiAJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV9xdWV1ZSk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKLQkJcHhtaXRidWYgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHhtaXRfYnVmLCBsaXN0KTsKKwkJcHhtaXRidWYgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB4bWl0X2J1ZiwgbGlzdCk7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCYocHhtaXRidWYtPmxpc3QpKTsKIAl9CkBAIC0xMjgwLDcgKzEyNTQsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfcXVldWUtPmxvY2ssIGlycWwpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBweG1pdGJ1ZjsKIH0KQEAgLTEyOTAsNyArMTI2Myw2IEBACiAJdW5zaWduZWQgbG9uZyBpcnFsOwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfcXVldWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChweG1pdGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gX0ZBSUw7CkBAIC0xMzA0LDcgKzEyNzYsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfcXVldWUtPmxvY2ssIGlycWwpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTEzMTYsNyArMTI4Nyw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfeG1pdGJ1Zl9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9xdWV1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJLyogREJHXzg4RSgiK3J0d19hbGxvY194bWl0YnVmXG4iKTsgKi8KIApAQCAtMTMyNyw5ICsxMjk3LDkgQEAKIAl9IGVsc2UgewogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyZWVfeG1pdGJ1Zl9xdWV1ZSk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKLQkJcHhtaXRidWYgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHhtaXRfYnVmLCBsaXN0KTsKKwkJcHhtaXRidWYgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB4bWl0X2J1ZiwgbGlzdCk7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCYocHhtaXRidWYtPmxpc3QpKTsKIAl9CkBAIC0xMzQ0LDcgKzEzMTQsNiBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZnJlZV94bWl0YnVmX3F1ZXVlLT5sb2NrLCBpcnFsKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcHhtaXRidWY7CiB9CkBAIC0xMzU0LDcgKzEzMjMsNiBAQAogCXVuc2lnbmVkIGxvbmcgaXJxbDsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfeG1pdGJ1Zl9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9xdWV1ZTsKIAotX2Z1bmNfZW50ZXJfOwogCWlmIChweG1pdGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gX0ZBSUw7CiAKQEAgLTEzNzYsNyArMTM0NCw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3htaXRidWZfcXVldWUtPmxvY2ssIGlycWwpOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xNDA1LDcgKzEzNzIsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7CiAJc3RydWN0IF9fcXVldWUgKnBmcmVlX3htaXRfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfcXVldWU7CiAKLV9mdW5jX2VudGVyXzsKIAogCXNwaW5fbG9ja19iaCgmcGZyZWVfeG1pdF9xdWV1ZS0+bG9jayk7CiAKQEAgLTE0MTUsOSArMTM4MSw5IEBACiAJfSBlbHNlIHsKIAkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmVlX3htaXRfcXVldWUpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCi0JCXB4ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQlweGZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKIAkJcnR3X2xpc3RfZGVsZXRlKCYocHhmcmFtZS0+bGlzdCkpOwogCX0KQEAgLTE0NDQsNyArMTQxMCw2IEBACiAKIAlzcGluX3VubG9ja19iaCgmcGZyZWVfeG1pdF9xdWV1ZS0+bG9jayk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHB4ZnJhbWU7CiB9CkBAIC0xNDU1LDcgKzE0MjAsNiBAQAogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0cHJpdi0+YWRhcHRlcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcG5kaXNfcGt0ID0gTlVMTDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHB4bWl0ZnJhbWUgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLCAoIj09PT09PSBydHdfZnJlZV94bWl0ZnJhbWUoKTpweG1pdGZyYW1lID09IE5VTEwhISEhISEhISEhXG4iKSk7CkBAIC0xNDgzLDcgKzE0NDcsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTE0OTMsMjMgKzE0NTYsMjEgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwogCXN0cnVjdAl4bWl0X2ZyYW1lCSpweG1pdGZyYW1lOwogCi1fZnVuY19lbnRlcl87CiAKIAlzcGluX2xvY2tfYmgoJihwZnJhbWVxdWV1ZS0+bG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZXF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJcnR3X2ZyZWVfeG1pdGZyYW1lKHB4bWl0cHJpdiwgcHhtaXRmcmFtZSk7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCYocGZyYW1lcXVldWUtPmxvY2spKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHMzMiBydHdfeG1pdGZyYW1lX2VucXVldWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKQEAgLTE1MzAsMTIgKzE0OTEsMTIgQEAKIAlzdHJ1Y3QJeG1pdF9mcmFtZQkqcHhtaXRmcmFtZSA9IE5VTEw7CiAKIAl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZV9xdWV1ZSk7Ci0JeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BoZWFkKTsKKwl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGhlYWQtPm5leHQ7CiAKIAlpZiAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHhtaXRmcmFtZV9waGVhZCwgeG1pdGZyYW1lX3BsaXN0KSkgewotCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BsaXN0KTsKKwkJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BsaXN0LT5uZXh0OwogCiAJCXJ0d19saXN0X2RlbGV0ZSgmcHhtaXRmcmFtZS0+bGlzdCk7CiAKQEAgLTE1NTUsNyArMTUxNiw2IEBACiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJaW50IGksIGlueFs0XTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJaW54WzBdID0gMDsgaW54WzFdID0gMTsgaW54WzJdID0gMjsgaW54WzNdID0gMzsKIApAQCAtMTU3MiwxMCArMTUzMiwxMCBAQAogCQlwaHd4bWl0ID0gcGh3eG1pdF9pICsgaW54W2ldOwogCiAJCXN0YV9waGVhZCA9IGdldF9saXN0X2hlYWQocGh3eG1pdC0+c3RhX3F1ZXVlKTsKLQkJc3RhX3BsaXN0ID0gZ2V0X25leHQoc3RhX3BoZWFkKTsKKwkJc3RhX3BsaXN0ID0gc3RhX3BoZWFkLT5uZXh0OwogCiAJCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goc3RhX3BoZWFkLCBzdGFfcGxpc3QpKSB7Ci0JCQlwdHhzZXJ2cSA9IExJU1RfQ09OVEFJTk9SKHN0YV9wbGlzdCwgc3RydWN0IHR4X3NlcnZxLCB0eF9wZW5kaW5nKTsKKwkJCXB0eHNlcnZxID0gY29udGFpbmVyX29mKHN0YV9wbGlzdCwgc3RydWN0IHR4X3NlcnZxLCB0eF9wZW5kaW5nKTsKIAogCQkJcGZyYW1lX3F1ZXVlID0gJnB0eHNlcnZxLT5zdGFfcGVuZGluZzsKIApAQCAtMTU5MCwxMiArMTU1MCwxMSBAQAogCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAotCQkJc3RhX3BsaXN0ID0gZ2V0X25leHQoc3RhX3BsaXN0KTsKKwkJCXN0YV9wbGlzdCA9IHN0YV9wbGlzdC0+bmV4dDsKIAkJfQogCX0KIGV4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcHhtaXRmcmFtZTsKIH0KIApAQCAtMTYwMyw3ICsxNTYyLDYgQEAKIHsKIAlzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxOwogCi1fZnVuY19lbnRlcl87CiAJc3dpdGNoICh1cCkgewogCWNhc2UgMToKIAljYXNlIDI6CkBAIC0xNjMyLDcgKzE1OTAsNiBAQAogCWJyZWFrOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcHR4c2VydnE7CiB9CkBAIC0xNjUxLDcgKzE2MDgsNiBAQAogCXN0cnVjdCBod194bWl0CSpwaHd4bWl0cyA9ICBwYWRhcHRlci0+eG1pdHByaXYuaHd4bWl0czsKIAlpbnQgcmVzID0gX1NVQ0NFU1M7CiAKLV9mdW5jX2VudGVyXzsKIAogCWlmIChwYXR0cmliLT5wc3RhKSB7CiAJCXBzdGEgPSBwYXR0cmliLT5wc3RhOwpAQCAtMTY3Niw3ICsxNjMyLDYgQEAKIAlwaHd4bWl0c1thY19pbmRleF0uYWNjbnQrKzsKIGV4aXQ6CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE3MTksMTAgKzE2NzQsOCBAQAogdm9pZCBydHdfaW5pdF9od3htaXRzKHN0cnVjdCBod194bWl0ICpwaHd4bWl0LCBpbnQgZW50cnkpCiB7CiAJaW50IGk7Ci1fZnVuY19lbnRlcl87CiAJZm9yIChpID0gMDsgaSA8IGVudHJ5OyBpKyssIHBod3htaXQrKykKIAkJcGh3eG1pdC0+YWNjbnQgPSAwOwotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyBpbnQgcnR3X2JyX2NsaWVudF90eChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICoqcHNrYikKQEAgLTE5OTcsNyArMTk1MCw3IEBACiAJCQlwc3RhcHJpdi0+dGltX2JpdG1hcCB8PSBCSVQoMCk7LyogICovCiAJCQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCB8PSBCSVQoMCk7CiAKLQkJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9USU1fSUVfLCBOVUxMLCBmYWxzZSk7LyogdHggYmMvbWMgcGFja2V0cyBhZnRlciB1cGF0ZSBiY24gKi8KKwkJCXVwZGF0ZV9iZWFjb24ocGFkYXB0ZXIsIF9USU1fSUVfLCBOVUxMLCBmYWxzZSk7LyogdHggYmMvbWMgcGFja2V0cyBhZnRlciB1cGRhdGUgYmNuICovCiAKIAkJCXJldCA9IHRydWU7CiAJCX0KQEAgLTIwNDcsNyArMjAwMCw3IEBACiAJCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgfD0gQklUKHBzdGEtPmFpZCk7CiAKIAkJCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA9PSAxKSB7Ci0JCQkJCS8qIHVwYXRlIEJDTiBmb3IgVElNIElFICovCisJCQkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwogCQkJCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfVElNX0lFXywgTlVMTCwgZmFsc2UpOwogCQkJCX0KIAkJCX0KQEAgLTIwNzAsMTIgKzIwMjMsMTIgQEAKIAlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdHMgPSAgcGFkYXB0ZXItPnhtaXRwcml2Lmh3eG1pdHM7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyYW1lcXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKLQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAogCQl4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKIApAQCAtMjEzNywxMiArMjA5MCwxMiBAQAogCXNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsKIAogCXhtaXRmcmFtZV9waGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGEtPnNsZWVwX3EpOwotCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9waGVhZCk7CisJeG1pdGZyYW1lX3BsaXN0ID0geG1pdGZyYW1lX3BoZWFkLT5uZXh0OwogCiAJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaCh4bWl0ZnJhbWVfcGhlYWQsIHhtaXRmcmFtZV9wbGlzdCkpIHsKLQkJcHhtaXRmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOworCQlweG1pdGZyYW1lID0gY29udGFpbmVyX29mKHhtaXRmcmFtZV9wbGlzdCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwogCi0JCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9wbGlzdCk7CisJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9wbGlzdC0+bmV4dDsKIAogCQlydHdfbGlzdF9kZWxldGUoJnB4bWl0ZnJhbWUtPmxpc3QpOwogCkBAIC0yMjE4LDEyICsyMTcxLDEyIEBACiAJCXNwaW5fbG9ja19iaCgmcHN0YV9ibWMtPnNsZWVwX3EubG9jayk7CiAKIAkJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YV9ibWMtPnNsZWVwX3EpOwotCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGhlYWQpOworCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGhlYWQtPm5leHQ7CiAKIAkJd2hpbGUgKCFydHdfZW5kX29mX3F1ZXVlX3NlYXJjaCh4bWl0ZnJhbWVfcGhlYWQsIHhtaXRmcmFtZV9wbGlzdCkpIHsKLQkJCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CiAKLQkJCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9wbGlzdCk7CisJCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGxpc3QtPm5leHQ7CiAKIAkJCXJ0d19saXN0X2RlbGV0ZSgmcHhtaXRmcmFtZS0+bGlzdCk7CiAKQEAgLTIyNjUsMTIgKzIyMTgsMTIgQEAKIAlzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7CiAKIAl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGhlYWQpOworCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9waGVhZC0+bmV4dDsKIAogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2goeG1pdGZyYW1lX3BoZWFkLCB4bWl0ZnJhbWVfcGxpc3QpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBMSVNUX0NPTlRBSU5PUih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKKwkJcHhtaXRmcmFtZSA9IGNvbnRhaW5lcl9vZih4bWl0ZnJhbWVfcGxpc3QsIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKIAotCQl4bWl0ZnJhbWVfcGxpc3QgPSBnZXRfbmV4dCh4bWl0ZnJhbWVfcGxpc3QpOworCQl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGxpc3QtPm5leHQ7CiAKIAkJc3dpdGNoIChweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHkpIHsKIAkJY2FzZSAxOgpAQCAtMjMxNiw3ICsyMjY5LDcgQEAKIAkJaWYgKChwc3RhLT5zbGVlcHFfYWNfbGVuID09IDApICYmICghcHN0YS0+aGFzX2xlZ2FjeV9hYykgJiYgKHdtbXBzX2FjKSkgewogCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkJJVChwc3RhLT5haWQpOwogCi0JCQkvKiB1cGF0ZSBCQ04gZm9yIFRJTSBJRSAqLworCQkJLyogdXBkYXRlIEJDTiBmb3IgVElNIElFICovCiAJCQl1cGRhdGVfYmVhY29uKHBhZGFwdGVyLCBfVElNX0lFXywgTlVMTCwgZmFsc2UpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbDgxODhFUmF0ZUFkYXB0aXZlLmMKaW5kZXggM2RmMzNiYy4uZGVhMjIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWw4MTg4RVJhdGVBZGFwdGl2ZS5jCkBAIC0zMzEsNiArMzMxLDcgQEAKIAogc3RhdGljIGludCBvZG1fQVJGQlJlZnJlc2hfODE4OEUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSwgc3RydWN0IG9kbV9yYV9pbmZvICpwUmFJbmZvKQogeyAgLyogIFdpbHNvbiAyMDExLzEwLzI2ICovCisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ID0gZG1fb2RtLT5BZGFwdGVyOwogCXUzMiBNYXNrRnJvbVJlZzsKIAlzOCBpOwogCkBAIC0zNTcsMTkgKzM1OCwxOSBAQAogCQlwUmFJbmZvLT5SQVVzZVJhdGUgPSAocFJhSW5mby0+UmF0ZU1hc2spJjB4MDAwMDAwMGQ7CiAJCWJyZWFrOwogCWNhc2UgMTI6Ci0JCU1hc2tGcm9tUmVnID0gT0RNX1JlYWQ0Qnl0ZShkbV9vZG0sIFJFR19BUkZSMCk7CisJCU1hc2tGcm9tUmVnID0gcnR3X3JlYWQzMihhZGFwdCwgUkVHX0FSRlIwKTsKIAkJcFJhSW5mby0+UkFVc2VSYXRlID0gKHBSYUluZm8tPlJhdGVNYXNrKSZNYXNrRnJvbVJlZzsKIAkJYnJlYWs7CiAJY2FzZSAxMzoKLQkJTWFza0Zyb21SZWcgPSBPRE1fUmVhZDRCeXRlKGRtX29kbSwgUkVHX0FSRlIxKTsKKwkJTWFza0Zyb21SZWcgPSBydHdfcmVhZDMyKGFkYXB0LCBSRUdfQVJGUjEpOwogCQlwUmFJbmZvLT5SQVVzZVJhdGUgPSAocFJhSW5mby0+UmF0ZU1hc2spJk1hc2tGcm9tUmVnOwogCQlicmVhazsKIAljYXNlIDE0OgotCQlNYXNrRnJvbVJlZyA9IE9ETV9SZWFkNEJ5dGUoZG1fb2RtLCBSRUdfQVJGUjIpOworCQlNYXNrRnJvbVJlZyA9IHJ0d19yZWFkMzIoYWRhcHQsIFJFR19BUkZSMik7CiAJCXBSYUluZm8tPlJBVXNlUmF0ZSA9IChwUmFJbmZvLT5SYXRlTWFzaykmTWFza0Zyb21SZWc7CiAJCWJyZWFrOwogCWNhc2UgMTU6Ci0JCU1hc2tGcm9tUmVnID0gT0RNX1JlYWQ0Qnl0ZShkbV9vZG0sIFJFR19BUkZSMyk7CisJCU1hc2tGcm9tUmVnID0gcnR3X3JlYWQzMihhZGFwdCwgUkVHX0FSRlIzKTsKIAkJcFJhSW5mby0+UkFVc2VSYXRlID0gKHBSYUluZm8tPlJhdGVNYXNrKSZNYXNrRnJvbVJlZzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTY2Nyw3ICs2NjgsOSBAQAogCiB2b2lkIE9ETV9SQV9TZXRfVHhSUFRfVGltZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtLCB1MTYgbWluUnB0VGltZSkKIHsKLQlPRE1fV3JpdGUyQnl0ZShkbV9vZG0sIFJFR19UWF9SUFRfVElNRSwgbWluUnB0VGltZSk7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ID0gZG1fb2RtLT5BZGFwdGVyOworCisJcnR3X3dyaXRlMTYoYWRhcHQsIFJFR19UWF9SUFRfVElNRSwgbWluUnB0VGltZSk7CiB9CiAKIHZvaWQgT0RNX1JBX1R4UlBUMkhhbmRsZV84MTg4RShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtLCB1OCAqVHhSUFRfQnVmLCB1MTYgVHhSUFRfTGVuLCB1MzIgbWFjaWRfZW50cnkwLCB1MzIgbWFjaWRfZW50cnkxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsUGh5UmZfODE4OGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbFBoeVJmXzgxODhlLmMKaW5kZXggMTVlOGUzZi4uMDU2MDUyZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbFBoeVJmXzgxODhlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsUGh5UmZfODE4OGUuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IENDS19UQUJMRV9TSVpFOyBpKyspIHsKIAkJCWlmIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iQ0NLaW5DSDE0KSB7Ci0JCQkJaWYgKE9ETV9Db21wYXJlTWVtb3J5KGRtX29kbSwgKHZvaWQgKikmVGVtcENDaywgKHZvaWQgKikmQ0NLU3dpbmdUYWJsZV9DaDE0W2ldWzJdLCA0KSA9PSAwKSB7CisJCQkJaWYgKG1lbWNtcCgmVGVtcENDaywgJkNDS1N3aW5nVGFibGVfQ2gxNFtpXVsyXSwgNCkpIHsKIAkJCQkJQ0NLX2luZGV4X29sZCA9ICh1OClpOwogCQkJCQlkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlID0gKHU4KWk7CiAJCQkJCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX0NBTElCUkFUSU9OLCBPRE1fREJHX0xPVUQsCkBAIC0yMjksNyArMjI5LDcgQEAKIAkJCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9DQUxJQlJBVElPTiwgT0RNX0RCR19MT1VELAogCQkJCQkgICAgICgiUmVnQTI0OiAweCVYLCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzWyVkXVsyXTogQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXTogMHglWFxuIiwKIAkJCQkJICAgICBUZW1wQ0NrLCBpLCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzJdKSk7Ci0JCQkJaWYgKE9ETV9Db21wYXJlTWVtb3J5KGRtX29kbSwgKHZvaWQgKikmVGVtcENDaywgKHZvaWQgKikmQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXSwgNCkgPT0gMCkgeworCQkJCWlmIChtZW1jbXAoJlRlbXBDQ2ssICZDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzJdLCA0KSkgewogCQkJCQlDQ0tfaW5kZXhfb2xkID0gKHU4KWk7CiAJCQkJCWRtX29kbS0+QmJTd2luZ0lkeENja0Jhc2UgPSAodTgpaTsKIAkJCQkJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfQ0FMSUJSQVRJT04sIE9ETV9EQkdfTE9VRCwKQEAgLTgzOSw5ICs4MzksOSBAQAogCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7CiAJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfQ0FMSUJSQVRJT04sIE9ETV9EQkdfTE9VRCwgKCJTYXZlIE1BQyBwYXJhbWV0ZXJzLlxuIikpOwogCWZvciAoaSA9IDA7IGkgPCAoSVFLX01BQ19SRUdfTlVNIC0gMSk7IGkrKykgewotCQlNQUNCYWNrdXBbaV0gPSBPRE1fUmVhZDFCeXRlKGRtX29kbSwgTUFDUmVnW2ldKTsKKwkJTUFDQmFja3VwW2ldID0gcnR3X3JlYWQ4KGFkYXB0LCBNQUNSZWdbaV0pOwogCX0KLQlNQUNCYWNrdXBbaV0gPSBPRE1fUmVhZDRCeXRlKGRtX29kbSwgTUFDUmVnW2ldKTsKKwlNQUNCYWNrdXBbaV0gPSBydHdfcmVhZDMyKGFkYXB0LCBNQUNSZWdbaV0pOwogfQogCiBzdGF0aWMgdm9pZCByZWxvYWRfYWRkYV9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgKkFEREFSZWcsIHUzMiAqQUREQUJhY2t1cCwgdTMyIFJlZ2llc3Rlck51bSkKQEAgLTg2OCw5ICs4NjgsOSBAQAogCiAJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfQ0FMSUJSQVRJT04sIE9ETV9EQkdfTE9VRCwgICgiUmVsb2FkIE1BQyBwYXJhbWV0ZXJzICFcbiIpKTsKIAlmb3IgKGkgPSAwOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspIHsKLQkJT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCBNQUNSZWdbaV0sICh1OClNQUNCYWNrdXBbaV0pOworCQlydHdfd3JpdGU4KGFkYXB0LCBNQUNSZWdbaV0sICh1OClNQUNCYWNrdXBbaV0pOwogCX0KLQlPRE1fV3JpdGU0Qnl0ZShkbV9vZG0sIE1BQ1JlZ1tpXSwgTUFDQmFja3VwW2ldKTsKKwlydHdfd3JpdGUzMihhZGFwdCwgTUFDUmVnW2ldLCBNQUNCYWNrdXBbaV0pOwogfQogCiB2b2lkCkBAIC05MTIsMTIgKzkxMiwxMiBAQAogCiAJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfQ0FMSUJSQVRJT04sIE9ETV9EQkdfTE9VRCwgKCJNQUMgc2V0dGluZ3MgZm9yIENhbGlicmF0aW9uLlxuIikpOwogCi0JT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCBNQUNSZWdbaV0sIDB4M0YpOworCXJ0d193cml0ZTgoYWRhcHQsIE1BQ1JlZ1tpXSwgMHgzRik7CiAKIAlmb3IgKGkgPSAxOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspIHsKLQkJT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCBNQUNSZWdbaV0sICh1OCkoTUFDQmFja3VwW2ldJih+QklUMykpKTsKKwkJcnR3X3dyaXRlOChhZGFwdCwgTUFDUmVnW2ldLCAodTgpKE1BQ0JhY2t1cFtpXSYofkJJVDMpKSk7CiAJfQotCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgTUFDUmVnW2ldLCAodTgpKE1BQ0JhY2t1cFtpXSYofkJJVDUpKSk7CisJcnR3X3dyaXRlOChhZGFwdCwgTUFDUmVnW2ldLCAodTgpKE1BQ0JhY2t1cFtpXSYofkJJVDUpKSk7CiB9CiAKIHZvaWQKQEAgLTEyMjMsMTYgKzEyMjMsMTQgQEAKIHsKIAl1OCB0bXByZWc7CiAJdTMyIFJGX0Ftb2RlID0gMCwgUkZfQm1vZGUgPSAwLCBMQ19DYWw7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKIAogCS8qIENoZWNrIGNvbnRpbnVvdXMgVFggYW5kIFBhY2tldCBUWCAqLwotCXRtcHJlZyA9IE9ETV9SZWFkMUJ5dGUoZG1fb2RtLCAweGQwMyk7CisJdG1wcmVnID0gcnR3X3JlYWQ4KGFkYXB0LCAweGQwMyk7CiAKIAlpZiAoKHRtcHJlZyYweDcwKSAhPSAwKQkJCS8qIERlYWwgd2l0aCBjb250aXN1b3VzIFRYIGNhc2UgKi8KLQkJT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCAweGQwMywgdG1wcmVnJjB4OEYpOwkvKiBkaXNhYmxlIGFsbCBjb250aW51b3VzIFRYICovCisJCXJ0d193cml0ZTgoYWRhcHQsIDB4ZDAzLCB0bXByZWcmMHg4Rik7CS8qIGRpc2FibGUgYWxsIGNvbnRpbnVvdXMgVFggKi8KIAllbHNlCQkJCQkJCS8qICBEZWFsIHdpdGggUGFja2V0IFRYIGNhc2UgKi8KLQkJT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCBSRUdfVFhQQVVTRSwgMHhGRik7CQkJLyogIGJsb2NrIGFsbCBxdWV1ZXMgKi8KKwkJcnR3X3dyaXRlOChhZGFwdCwgUkVHX1RYUEFVU0UsIDB4RkYpOwkJCS8qICBibG9jayBhbGwgcXVldWVzICovCiAKIAlpZiAoKHRtcHJlZyYweDcwKSAhPSAwKSB7CiAJCS8qIDEuIFJlYWQgb3JpZ2luYWwgUkYgbW9kZSAqLwpAQCAtMTI2NCw3ICsxMjYyLDcgQEAKIAlpZiAoKHRtcHJlZyYweDcwKSAhPSAwKSB7CiAJCS8qIERlYWwgd2l0aCBjb250aW51b3VzIFRYIGNhc2UgKi8KIAkJLyogUGF0aC1BICovCi0JCU9ETV9Xcml0ZTFCeXRlKGRtX29kbSwgMHhkMDMsIHRtcHJlZyk7CisJCXJ0d193cml0ZTgoYWRhcHQsIDB4ZDAzLCB0bXByZWcpOwogCQlQSFlfU2V0UkZSZWcoYWRhcHQsIFJGX1BBVEhfQSwgUkZfQUMsIGJNYXNrMTJCaXRzLCBSRl9BbW9kZSk7CiAKIAkJLyogUGF0aC1CICovCkBAIC0xMjcyLDcgKzEyNzAsNyBAQAogCQkJUEhZX1NldFJGUmVnKGFkYXB0LCBSRl9QQVRIX0IsIFJGX0FDLCBiTWFzazEyQml0cywgUkZfQm1vZGUpOwogCX0gZWxzZSB7CiAJCS8qICBEZWFsIHdpdGggUGFja2V0IFRYIGNhc2UgKi8KLQkJT0RNX1dyaXRlMUJ5dGUoZG1fb2RtLCBSRUdfVFhQQVVTRSwgMHgwMCk7CisJCXJ0d193cml0ZTgoYWRhcHQsIFJFR19UWFBBVVNFLCAweDAwKTsKIAl9CiB9CiAKQEAgLTE0NjgsMTMgKzE0NjYsMTAgQEAKIAogc3RhdGljIHZvaWQgcGh5X3NldHJmcGF0aHN3aXRjaF84MTg4ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGJvb2wgbWFpbiwgYm9vbCBpczJ0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0KIAlpZiAoIWFkYXB0LT5od19pbml0X2NvbXBsZXRlZCkgewogCQl1OCB1MWJ0bXA7Ci0JCXUxYnRtcCA9IE9ETV9SZWFkMUJ5dGUoZG1fb2RtLCBSRUdfTEVEQ0ZHMikgfCBCSVQ3OwotCQlPRE1fV3JpdGUxQnl0ZShkbV9vZG0sIFJFR19MRURDRkcyLCB1MWJ0bXApOworCQl1MWJ0bXAgPSBydHdfcmVhZDgoYWRhcHQsIFJFR19MRURDRkcyKSB8IEJJVDc7CisJCXJ0d193cml0ZTgoYWRhcHQsIFJFR19MRURDRkcyLCB1MWJ0bXApOwogCQlQSFlfU2V0QkJSZWcoYWRhcHQsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsIEJJVDEzLCAweDAxKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jCmluZGV4IDU5ODE0MDQuLmQ3NWNhN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvaGFsX2ludGYuYwpAQCAtMTE2LDggKzExNiw2IEBACiB7CiAJdWludAlzdGF0dXMgPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwotCiAJc3RhdHVzID0gYWRhcHQtPkhhbEZ1bmMuaGFsX2RlaW5pdChhZGFwdCk7CiAKIAlpZiAoc3RhdHVzID09IF9TVUNDRVNTKQpAQCAtMTI1LDggKzEyMyw2IEBACiAJZWxzZQogCQlEQkdfODhFKCJcbiBydHdfaGFsX2RlaW5pdDogaGFsX2luaXQgZmFpbFxuIik7CiAKLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYwppbmRleCAzNTU1ZmZhLi44OWEyNmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYwpAQCAtODg3LDkgKzg4NywxMCBAQAogdm9pZCBPRE1fV3JpdGVfQ0NLX0NDQV9UaHJlcyhzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTggQ3VyQ0NLX0NDQVRocmVzKQogewogCXN0cnVjdCBydHdfZGlnICpwRE1fRGlnVGFibGUgPSAmcERNX09kbS0+RE1fRGlnVGFibGU7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ID0gcERNX09kbS0+QWRhcHRlcjsKIAogCWlmIChwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyAhPSBDdXJDQ0tfQ0NBVGhyZXMpCQkvKiBtb2RpZnkgYnkgR3VvLk1pbmd6aGkgMjAxMi0wMS0wMyAqLwotCQlPRE1fV3JpdGUxQnl0ZShwRE1fT2RtLCBPRE1fUkVHKENDS19DQ0EsIHBETV9PZG0pLCBDdXJDQ0tfQ0NBVGhyZXMpOworCQlydHdfd3JpdGU4KGFkYXB0LCBPRE1fUkVHKENDS19DQ0EsIHBETV9PZG0pLCBDdXJDQ0tfQ0NBVGhyZXMpOwogCXBETV9EaWdUYWJsZS0+UHJlQ0NLX0NDQVRocmVzID0gcERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXM7CiAJcERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXMgPSBDdXJDQ0tfQ0NBVGhyZXM7CiB9CkBAIC0xMzAxLDggKzEzMDIsOCBAQAogCQlwc3RhID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW2ldOwogCQlpZiAoSVNfU1RBX1ZBTElEKHBzdGEpICYmCiAJCSAgICAocHN0YS0+c3RhdGUgJiBXSUZJX0FTT0NfU1RBVEUpICYmCi0JCSAgICAhX3J0d19tZW1jbXAocHN0YS0+aHdhZGRyLCBiY2FzdF9hZGRyLCBFVEhfQUxFTikgJiYKLQkJICAgICFfcnR3X21lbWNtcChwc3RhLT5od2FkZHIsIG15aWQoJkFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpIHsKKwkJICAgIG1lbWNtcChwc3RhLT5od2FkZHIsIGJjYXN0X2FkZHIsIEVUSF9BTEVOKSAmJgorCQkgICAgbWVtY21wKHBzdGEtPmh3YWRkciwgbXlpZCgmQWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKSkgewogCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IHRtcEVudHJ5TWluUFdEQikKIAkJCQl0bXBFbnRyeU1pblBXREIgPSBwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7CiAKQEAgLTE0MzMsMTAgKzE0MzQsMTAgQEAKIAlwRE1fT2RtLT5ETV9FRENBX1RhYmxlLmJJc0N1clJETFN0YXRlID0gZmFsc2U7CiAJQWRhcHRlci0+cmVjdnByaXYuYklzQW55Tm9uQkVQa3RzID0gZmFsc2U7CiAKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIFZPIFBBUkFNOiAweCV4XG4iLCBPRE1fUmVhZDRCeXRlKHBETV9PZG0sIE9ETV9FRENBX1ZPX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgVkkgUEFSQU06IDB4JXhcbiIsIE9ETV9SZWFkNEJ5dGUocERNX09kbSwgT0RNX0VEQ0FfVklfUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBCRSBQQVJBTTogMHgleFxuIiwgT0RNX1JlYWQ0Qnl0ZShwRE1fT2RtLCBPRE1fRURDQV9CRV9QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIEJLIFBBUkFNOiAweCV4XG4iLCBPRE1fUmVhZDRCeXRlKHBETV9PZG0sIE9ETV9FRENBX0JLX1BBUkFNKSkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgVk8gUEFSQU06IDB4JXhcbiIsIHJ0d19yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfVk9fUEFSQU0pKSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBWSSBQQVJBTTogMHgleFxuIiwgcnR3X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9WSV9QQVJBTSkpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIEJFIFBBUkFNOiAweCV4XG4iLCBydHdfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX0JFX1BBUkFNKSkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgQksgUEFSQU06IDB4JXhcbiIsIHJ0d19yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfQktfUEFSQU0pKSk7CiB9CS8qICBPRE1fSW5pdEVkY2FUdXJibyAqLwogCiB2b2lkIG9kbV9FZGNhVHVyYm9DaGVjayhzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbV9SZWdDb25maWc4MTg4RS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX1JlZ0NvbmZpZzgxODhFLmMKaW5kZXggNjE5M2Q5Zi4uYTk4ODYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX1JlZ0NvbmZpZzgxODhFLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX1JlZ0NvbmZpZzgxODhFLmMKQEAgLTY2LDcgKzY2LDkgQEAKIAogdm9pZCBvZG1fQ29uZmlnTUFDXzgxODhFKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgQWRkciwgdTggRGF0YSkKIHsKLQlPRE1fV3JpdGUxQnl0ZShwRE1fT2RtLCBBZGRyLCBEYXRhKTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHQgPSBwRE1fT2RtLT5BZGFwdGVyOworCisJcnR3X3dyaXRlOChhZGFwdCwgQWRkciwgRGF0YSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0lOSVQsIE9ETV9EQkdfVFJBQ0UsICgiPT09PiBPRE1fQ29uZmlnTUFDV2l0aEhlYWRlckZpbGU6IFtNQUNfUkVHXSAlMDhYICUwOFhcbiIsIEFkZHIsIERhdGEpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX2ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Q2ODIxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbV9pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0vKiAgT0RNIElPIFJlbGF0aXZlIEFQSS4gKi8KLQotdTggT0RNX1JlYWQxQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXJldHVybiBydHdfcmVhZDgoQWRhcHRlciwgUmVnQWRkcik7Ci19Ci0KLXUxNiBPRE1fUmVhZDJCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkcikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JcmV0dXJuIHJ0d19yZWFkMTYoQWRhcHRlciwgUmVnQWRkcik7Ci19Ci0KLXUzMiBPRE1fUmVhZDRCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkcikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JcmV0dXJuIHJ0d19yZWFkMzIoQWRhcHRlciwgUmVnQWRkcik7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlMUJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1OCBEYXRhKQotewotCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlydHdfd3JpdGU4KEFkYXB0ZXIsIFJlZ0FkZHIsIERhdGEpOwotfQotCi12b2lkIE9ETV9Xcml0ZTJCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTE2IERhdGEpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXJ0d193cml0ZTE2KEFkYXB0ZXIsIFJlZ0FkZHIsIERhdGEpOwotfQotCi12b2lkIE9ETV9Xcml0ZTRCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTMyIERhdGEpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXJ0d193cml0ZTMyKEFkYXB0ZXIsIFJlZ0FkZHIsIERhdGEpOwotfQotCi0vKiAgT0RNIE1lbW9yeSByZWxhdGl2ZSBBUEkuICovCi12b2lkIE9ETV9BbGxvY2F0ZU1lbW9yeShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdm9pZCAqKnBQdHIsIHUzMiBsZW5ndGgpCi17Ci0JKnBQdHIgPSBydHdfenZtYWxsb2MobGVuZ3RoKTsKLX0KLQotLyogIGxlbmd0aCBjb3VsZCBiZSBpZ25vcmVkLCB1c2VkIHRvIGRldGVjdCBtZW1vcnkgbGVha2FnZS4gKi8KLXZvaWQgT0RNX0ZyZWVNZW1vcnkoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHZvaWQgKnBQdHIsIHUzMiBsZW5ndGgpCi17Ci0JcnR3X3ZtZnJlZShwUHRyLCBsZW5ndGgpOwotfQotCi1zMzIgT0RNX0NvbXBhcmVNZW1vcnkoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHZvaWQgKnBCdWYxLCB2b2lkICpwQnVmMiwgdTMyIGxlbmd0aCkKLXsKLQlyZXR1cm4gX3J0d19tZW1jbXAocEJ1ZjEsIHBCdWYyLCBsZW5ndGgpOwotfQotCi12b2lkIE9ETV9TZXRUaW1lcihzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgc3RydWN0IHRpbWVyX2xpc3QgKnBUaW1lciwgdTMyIG1zRGVsYXkpCi17Ci0JX3NldF90aW1lcihwVGltZXIsIG1zRGVsYXkpOyAvKiBtcyAqLwotfQotCi12b2lkIE9ETV9Jbml0aWFsaXplVGltZXIoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHN0cnVjdCB0aW1lcl9saXN0ICpwVGltZXIsCi0JCQkgdm9pZCAqQ2FsbEJhY2tGdW5jLCB2b2lkICpwQ29udGV4dCwKLQkJCSBjb25zdCBjaGFyICpzeklEKQotewotCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlfaW5pdF90aW1lcihwVGltZXIsIEFkYXB0ZXItPnBuZXRkZXYsIENhbGxCYWNrRnVuYywgcERNX09kbSk7Ci19Ci0KLXZvaWQgT0RNX0NhbmNlbFRpbWVyKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCBzdHJ1Y3QgdGltZXJfbGlzdCAqcFRpbWVyKQotewotCV9jYW5jZWxfdGltZXJfZXgocFRpbWVyKTsKLX0KLQotLyogIE9ETSBGVyByZWxhdGl2ZSBBUEkuICovCi11MzIgT0RNX0ZpbGxIMkNDbWQodTggKnBIMkNCdWZmZXIsIHUzMiBIMkNCdWZmZXJMZW4sIHUzMiBDbWROdW0sCi0JCSAgICAgIHUzMiAqcEVsZW1lbnRJRCwgdTMyICpwQ21kTGVuLAotCQkgICAgICB1OCAqKnBDbWJCdWZmZXIsIHU4ICpDbWRTdGFydFNlcSkKLXsKLQlyZXR1cm4JdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfY21kLmMKaW5kZXggY2EwYTcwOC4uMDIxZTU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfY21kLmMKQEAgLTcyLDcgKzcyLDYgQEAKIAl1MzIgaDJjX2NtZF9leCA9IDA7CiAJczMyIHJldCA9IF9GQUlMOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoIWFkYXB0LT5iRldSZWFkeSkgewogCQlEQkdfODhFKCJGaWxsSDJDQ21kXzg4RSgpOiByZXR1cm4gSDJDIGNtZCBiZWNhdXNlIGZ3IGlzIG5vdCByZWFkeVxuIik7CkBAIC0xMjUsNyArMTI0LDYgQEAKIAogZXhpdDoKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTM0LDcgKzEzMiw2IEBACiB7CiAJdTggcmVzID0gX1NVQ0NFU1M7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLV9mdW5jX2VudGVyXzsKIAogCWlmIChoYWxkYXRhLT5md19yYWN0cmwpIHsKIAkJOwpAQCAtMTQzLDcgKzE0MCw2IEBACiAJCXJlcyA9IF9GQUlMOwogCX0KIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTU0LDcgKzE1MCw2IEBACiAJdTggcmVzID0gX1NVQ0NFU1M7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAotX2Z1bmNfZW50ZXJfOwogCWlmIChoYWxkYXRhLT5md19yYWN0cmwpIHsKIAkJX19sZTMyIGxtYXNrOwogCkBAIC0xNjgsNyArMTYzLDYgQEAKIAkJcmVzID0gX0ZBSUw7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiByZXM7CiB9CkBAIC0yMTUsNyArMjA5LDYgQEAKIAlzdHJ1Y3Qgc2V0cHdybW9kZV9wYXJtIEgyQ1NldFB3ck1vZGU7CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZhZGFwdC0+cHdyY3RybHByaXY7CiAJdTggUkxCTSA9IDA7IC8qICAwOk1pbiwgMTpNYXgsIDI6VXNlciBkZWZpbmUgKi8KLV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoIiVzOiBNb2RlPSVkIFNtYXJ0UFM9JWQgVUFQU0Q9JWRcbiIsIF9fZnVuY19fLAogCQlNb2RlLCBwd3Jwcml2LT5zbWFydF9wcywgYWRhcHQtPnJlZ2lzdHJ5cHJpdi51YXBzZF9lbmFibGUpOwpAQCAtMjU2LDcgKzI0OSw2IEBACiAKIAlGaWxsSDJDQ21kXzg4RShhZGFwdCwgSDJDX1BTX1BXUl9NT0RFLCBzaXplb2YoSDJDU2V0UHdyTW9kZSksICh1OCAqKSZIMkNTZXRQd3JNb2RlKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnRsODE4OGVfc2V0X0Z3TWVkaWFTdGF0dXNfY21kKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgX19sZTE2IG1zdGF0dXNfcnB0KQpAQCAtNjE3LDcgKzYwOSw2IEBACiAJdTggRExCY25Db3VudCA9IDA7CiAJdTMyIHBvbGwgPSAwOwogCi1fZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKCIlcyBtc3RhdHVzKCV4KVxuIiwgX19mdW5jX18sIG1zdGF0dXMpOwogCkBAIC03MDEsNyArNjkyLDYgQEAKIAkJaGFsZGF0YS0+UmVnQ1JfMSAmPSAofkJJVDApOwogCQlydHdfd3JpdGU4KGFkYXB0LCAgUkVHX0NSKzEsIGhhbGRhdGEtPlJlZ0NSXzEpOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0bDgxODhlX3NldF9wMnBfcHNfb2ZmbG9hZF9jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBwMnBfcHNfc3RhdGUpCkBAIC03MTIsNyArNzAyLDYgQEAKIAlzdHJ1Y3QgUDJQX1BTX09mZmxvYWRfdAkqcDJwX3BzX29mZmxvYWQgPSAmaGFsZGF0YS0+cDJwX3BzX29mZmxvYWQ7CiAJdTggaTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJc3dpdGNoIChwMnBfcHNfc3RhdGUpIHsKIAljYXNlIFAyUF9QU19ESVNBQkxFOgpAQCAtNzc1LDUgKzc2NCw0IEBACiAJRmlsbEgyQ0NtZF84OEUoYWRhcHQsIEgyQ19QU19QMlBfT0ZGTE9BRCwgMSwgKHU4ICopcDJwX3BzX29mZmxvYWQpOwogI2VuZGlmCiAKLV9mdW5jX2V4aXRfOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMKaW5kZXggNGM5MzRlMi4uY2Y4OGJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9kbS5jCkBAIC0xNjAsNyArMTYwLDYgQEAKIAl1OCBod19pbml0X2NvbXBsZXRlZCA9IGZhbHNlOwogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAKLQlfZnVuY19lbnRlcl87CiAJaHdfaW5pdF9jb21wbGV0ZWQgPSBBZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZDsKIAogCWlmICghaHdfaW5pdF9jb21wbGV0ZWQpCkBAIC0xNzgsNyArMTc3LDYgQEAKIAkJLyogIENhbGN1bGF0ZSBUeC9SeCBzdGF0aXN0aWNzLiAqLwogCQlkbV9DaGVja1N0YXRpc3RpY3MoQWRhcHRlcik7CiAKLQlfZnVuY19leGl0XzsKIAl9CiAKIAkvKiBPRE0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCmluZGV4IDU5MjFkYjguLmY5ZDU1NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYwpAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBfSEFMX0lOSVRfQ18KIAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHJ0d19lZnVzZS5oPgogCkBAIC0zNjUsNyArMzY2LDcgQEAKIAl1MzIgZmlmb19kYXRhLCByZWdfMTQwOwogCXUzMiBhZGRyLCByc3RhdHVzLCBsb29wID0gMDsKIAl1MTYgZGF0YV9jbnRzID0gKGRhdGFfbGVuLzgpKzE7Ci0JdTggKnBidWYgPSBydHdfenZtYWxsb2MoZGF0YV9sZW4rMTApOworCXU4ICpwYnVmID0gdnphbGxvYyhkYXRhX2xlbisxMCk7CiAJREJHXzg4RSgiIyMjIyMjICVzICMjIyMjI1xuIiwgX19mdW5jX18pOwogCiAJcnR3X3dyaXRlOChBZGFwdGVyLCBSRUdfUEtUX0JVRkZfQUNDRVNTX0NUUkwsIFRYUEtUX0JVRl9TRUxFQ1QpOwpAQCAtMzg3LDcgKzM4OCw3IEBACiAJCQl9IHdoaWxlICghcnN0YXR1cyAmJiAobG9vcCsrIDwgMTApKTsKIAkJfQogCQlydHdfSU9MX2NtZF9idWZfZHVtcChBZGFwdGVyLCBkYXRhX2xlbiwgcGJ1Zik7Ci0JCXJ0d192bWZyZWUocGJ1ZiwgZGF0YV9sZW4rMTApOworCQl2ZnJlZShwYnVmKTsKIAl9CiAJREJHXzg4RSgiIyMjIyMjICVzICMjIyMjI1xuIiwgX19mdW5jX18pOwogfQpAQCAtNTgzLDYgKzU4NCw0NSBAQAogCiAjZGVmaW5lIElTX0ZXXzgxeHhDKHBhZGFwdGVyKQkoKChHRVRfSEFMX0RBVEEocGFkYXB0ZXIpKS0+RmlybXdhcmVTaWduYXR1cmUgJiAweEZGRjApID09IDB4ODhDMCkKIAorc3RhdGljIGludCBsb2FkX2Zpcm13YXJlKHN0cnVjdCBydF9maXJtd2FyZSAqcEZpcm13YXJlLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHJ0c3RhdHVzID0gX1NVQ0NFU1M7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBjaGFyIGZ3X25hbWVbXSA9ICJydGx3aWZpL3J0bDgxODhldWZ3LmJpbiI7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsIGRldmljZSkpIHsKKwkJcnRzdGF0dXMgPSBfRkFJTDsKKwkJZ290byBleGl0OworCX0KKwlpZiAoIWZ3KSB7CisJCXByX2VycigiRmlybXdhcmUgJXMgbm90IGF2YWlsYWJsZVxuIiwgZndfbmFtZSk7CisJCXJ0c3RhdHVzID0gX0ZBSUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKGZ3LT5zaXplID4gRldfODE4OEVfU0laRSkgeworCQlydHN0YXR1cyA9IF9GQUlMOworCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCisJCQkgKCJGaXJtd2FyZSBzaXplIGV4Y2VlZCAweCVYLiBDaGVjayBpdC5cbiIsCisJCQkgRldfODE4OEVfU0laRSkpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcEZpcm13YXJlLT5zekZ3QnVmZmVyID0ga3phbGxvYyhGV184MTg4RV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBGaXJtd2FyZS0+c3pGd0J1ZmZlcikgeworCQlydHN0YXR1cyA9IF9GQUlMOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbWNweShwRmlybXdhcmUtPnN6RndCdWZmZXIsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJcEZpcm13YXJlLT51bEZ3TGVuZ3RoID0gZnctPnNpemU7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlEQkdfODhFX0xFVkVMKF9kcnZfaW5mb18sCisJCSAgICAgICIrJXM6ICFiVXNlZFdvV0xBTkZ3LCBGbXJtd2FyZUxlbjolZCtcbiIsIF9fZnVuY19fLAorCQkgICAgICBwRmlybXdhcmUtPnVsRndMZW5ndGgpOworZXhpdDoKKwlyZXR1cm4gcnRzdGF0dXM7Cit9CisKIHMzMiBydGw4MTg4ZV9GaXJtd2FyZURvd25sb2FkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzMzIJcnRTdGF0dXMgPSBfU1VDQ0VTUzsKQEAgLTU5MSw1MSArNjMxLDIzIEBACiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CiAJc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlID0gZHZvYmpfdG9fZGV2KGR2b2JqKTsKLQlzdHJ1Y3QgcnRfZmlybXdhcmUgKnBGaXJtd2FyZSA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAlzdHJ1Y3QgcnRfZmlybXdhcmVfaGRyICpwRndIZHIgPSBOVUxMOwogCXU4ICpwRmlybXdhcmVCdWY7CiAJdTMyIEZpcm13YXJlTGVuOwotCWNoYXIgZndfbmFtZVtdID0gInJ0bHdpZmkvcnRsODE4OGV1ZncuYmluIjsKIAlzdGF0aWMgaW50IGxvZ192ZXJzaW9uOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCIrJXNcbiIsIF9fZnVuY19fKSk7Ci0JcEZpcm13YXJlID0gKHN0cnVjdCBydF9maXJtd2FyZSAqKXJ0d196bWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfZmlybXdhcmUpKTsKLQlpZiAoIXBGaXJtd2FyZSkgewotCQlydFN0YXR1cyA9IF9GQUlMOworCWlmICghZHZvYmotPmZpcm13YXJlLnN6RndCdWZmZXIpCisJCXJ0U3RhdHVzID0gbG9hZF9maXJtd2FyZSgmZHZvYmotPmZpcm13YXJlLCBkZXZpY2UpOworCWlmIChydFN0YXR1cyA9PSBfRkFJTCkgeworCQlkdm9iai0+ZmlybXdhcmUuc3pGd0J1ZmZlciA9IE5VTEw7CiAJCWdvdG8gRXhpdDsKIAl9Ci0KLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsIGRldmljZSkpIHsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQlpZiAoIWZ3KSB7Ci0JCXByX2VycigiRmlybXdhcmUgJXMgbm90IGF2YWlsYWJsZVxuIiwgZndfbmFtZSk7Ci0JCXJ0U3RhdHVzID0gX0ZBSUw7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0JaWYgKGZ3LT5zaXplID4gRldfODE4OEVfU0laRSkgewotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sICgiRmlybXdhcmUgc2l6ZSBleGNlZWQgMHglWC4gQ2hlY2sgaXQuXG4iLCBGV184MTg4RV9TSVpFKSk7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0KLQlwRmlybXdhcmUtPnN6RndCdWZmZXIgPSBremFsbG9jKEZXXzgxODhFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghcEZpcm13YXJlLT5zekZ3QnVmZmVyKSB7Ci0JCXJ0U3RhdHVzID0gX0ZBSUw7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0JbWVtY3B5KHBGaXJtd2FyZS0+c3pGd0J1ZmZlciwgZnctPmRhdGEsIGZ3LT5zaXplKTsKLQlwRmlybXdhcmUtPnVsRndMZW5ndGggPSBmdy0+c2l6ZTsKLQlwRmlybXdhcmVCdWYgPSBwRmlybXdhcmUtPnN6RndCdWZmZXI7Ci0JRmlybXdhcmVMZW4gPSBwRmlybXdhcmUtPnVsRndMZW5ndGg7Ci0JcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0KLQlEQkdfODhFX0xFVkVMKF9kcnZfaW5mb18sICIrJXM6ICFiVXNlZFdvV0xBTkZ3LCBGbXJtd2FyZUxlbjolZCtcbiIsIF9fZnVuY19fLCBGaXJtd2FyZUxlbik7CisJcEZpcm13YXJlQnVmID0gZHZvYmotPmZpcm13YXJlLnN6RndCdWZmZXI7CisJRmlybXdhcmVMZW4gPSBkdm9iai0+ZmlybXdhcmUudWxGd0xlbmd0aDsKIAogCS8qICBUbyBDaGVjayBGdyBoZWFkZXIuIEFkZGVkIGJ5IHR5bmxpLiAyMDA5LjEyLjA0LiAqLwotCXBGd0hkciA9IChzdHJ1Y3QgcnRfZmlybXdhcmVfaGRyICopcEZpcm13YXJlLT5zekZ3QnVmZmVyOworCXBGd0hkciA9IChzdHJ1Y3QgcnRfZmlybXdhcmVfaGRyICopZHZvYmotPmZpcm13YXJlLnN6RndCdWZmZXI7CiAKIAlwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uID0gIGxlMTZfdG9fY3B1KHBGd0hkci0+VmVyc2lvbik7CiAJcEhhbERhdGEtPkZpcm13YXJlU3ViVmVyc2lvbiA9IHBGd0hkci0+U3VidmVyc2lvbjsKQEAgLTY4NywxMCArNjk5LDcgQEAKIAkJZ290byBFeGl0OwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIkZpcm13YXJlIGlzIHJlYWR5IHRvIHJ1biFcbiIpKTsKLQlrZnJlZShwRmlybXdhcmUtPnN6RndCdWZmZXIpOwogRXhpdDoKLQotCWtmcmVlKHBGaXJtd2FyZSk7CiAJcmV0dXJuIHJ0U3RhdHVzOwogfQogCkBAIC03MDcsMTAgKzcxNiw4IEBACiAKIHN0YXRpYyB2b2lkIHJ0bDgxODhlX2ZyZWVfaGFsX2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewotX2Z1bmNfZW50ZXJfOwogCWtmcmVlKHBhZGFwdGVyLT5IYWxEYXRhKTsKIAlwYWRhcHRlci0+SGFsRGF0YSA9IE5VTEw7Ci1fZnVuY19leGl0XzsKIH0KIAogLyogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9tcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfbXAuYwppbmRleCAzZDBlNmM5Li5hNGQwNTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9tcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX21wLmMKQEAgLTExNSwxNCArMTE1LDEyIEBACiAKIAogCQkvKiBXcml0ZSAweGEyNCB+IDB4YTI3ICovCi0JCVRlbXBWYWwyID0gMDsKIAkJVGVtcFZhbDIgPSBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS1N3aW5nSW5kZXhdWzJdICsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tTd2luZ0luZGV4XVszXTw8OCkgKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS1N3aW5nSW5kZXhdWzRdPDwxNikrCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLU3dpbmdJbmRleF1bNV08PDI0KTsKIAogCQkvKiBXcml0ZSAweGEyOCAgMHhhMjkgKi8KLQkJVGVtcFZhbDMgPSAwOwogCQlUZW1wVmFsMyA9IENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLU3dpbmdJbmRleF1bNl0gKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW0NDS1N3aW5nSW5kZXhdWzddPDw4KTsKIAl9IGVsc2UgewpAQCAtMTM5LDE0ICsxMzcsMTIgQEAKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS1N3aW5nSW5kZXhdWzFdPDw4KTsKIAogCQkvKiBXcml0ZSAweGEyNCB+IDB4YTI3ICovCi0JCVRlbXBWYWwyID0gMDsKIAkJVGVtcFZhbDIgPSBDQ0tTd2luZ1RhYmxlX0NoMTRbQ0NLU3dpbmdJbmRleF1bMl0gKwogCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbQ0NLU3dpbmdJbmRleF1bM108PDgpICsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS1N3aW5nSW5kZXhdWzRdPDwxNikrCiAJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtDQ0tTd2luZ0luZGV4XVs1XTw8MjQpOwogCiAJCS8qIFdyaXRlIDB4YTI4ICAweGEyOSAqLwotCQlUZW1wVmFsMyA9IDA7CiAJCVRlbXBWYWwzID0gQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS1N3aW5nSW5kZXhdWzZdICsKIAkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS1N3aW5nSW5kZXhdWzddPDw4KTsKIAl9CkBAIC0xODQsMTIgKzE4MCwxMiBAQAogCQlUZW1wQ0NrID0gcmVhZF9iYnJlZyhwQWRhcHRlciwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkKSAmIGJNYXNrQ0NLOwogCQlmb3IgKGkgPSAwOyBpIDwgQ0NLX1RBQkxFX1NJWkU7IGkrKykgewogCQkJaWYgKHBETV9PZG0tPlJGQ2FsaWJyYXRlSW5mby5iQ0NLaW5DSDE0KSB7Ci0JCQkJaWYgKF9ydHdfbWVtY21wKCh2b2lkICopJlRlbXBDQ2ssICh2b2lkICopJkNDS1N3aW5nVGFibGVfQ2gxNFtpXVsyXSwgNCkpIHsKKwkJCQlpZiAoIW1lbWNtcCgodm9pZCAqKSZUZW1wQ0NrLCAodm9pZCAqKSZDQ0tTd2luZ1RhYmxlX0NoMTRbaV1bMl0sIDQpKSB7CiAJCQkJCUNDS19pbmRleF9vbGQgPSAodTgpaTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlpZiAoX3J0d19tZW1jbXAoKHZvaWQgKikmVGVtcENDaywgKHZvaWQgKikmQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXSwgNCkpIHsKKwkJCQlpZiAoIW1lbWNtcCgodm9pZCAqKSZUZW1wQ0NrLCAodm9pZCAqKSZDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzJdLCA0KSkgewogCQkJCQlDQ0tfaW5kZXhfb2xkID0gKHU4KWk7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTIwMSw2ICsxOTcsOCBAQAogCQllbHNlCiAJCQlDQ0tfaW5kZXggPSBDQ0tfaW5kZXhfb2xkICsgMTsKIAorCQlpZiAoQ0NLX2luZGV4ID4gMzIpCisJCQlDQ0tfaW5kZXggPSAzMjsKIAkJLyogQWRqdXN0IENDSyBhY2NvcmRpbmcgdG8gZ2FpbiBpbmRleCAqLwogCQlpZiAoIXBETV9PZG0tPlJGQ2FsaWJyYXRlSW5mby5iQ0NLaW5DSDE0KSB7CiAJCQlydHdfd3JpdGU4KHBBZGFwdGVyLCAweGEyMiwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tfaW5kZXhdWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKaW5kZXggNTExZjYxYy4uNDNlYjk2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KICNpbmNsdWRlIDxydGw4MTg4ZV9oYWwuaD4KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19yc3NpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcnNzaShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQogewotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHNpZ25hbF9zdGF0ICpzaWduYWxfc3RhdCA9ICZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoX2RhdGE7CiAKIAlpZiAoc2lnbmFsX3N0YXQtPnVwZGF0ZV9yZXEpIHsKQEAgLTM5LDcgKzM5LDggQEAKIAlzaWduYWxfc3RhdC0+YXZnX3ZhbCA9IHNpZ25hbF9zdGF0LT50b3RhbF92YWwgLyBzaWduYWxfc3RhdC0+dG90YWxfbnVtOwogfSAvKiAgUHJvY2Vzc19VSV9SU1NJXzgxOTJDICovCiAKLXN0YXRpYyB2b2lkIHByb2Nlc3NfbGlua19xdWFsKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbGlua19xdWFsKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQogewogCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwogCXN0cnVjdCBzaWduYWxfc3RhdCAqc2lnbmFsX3N0YXQ7CkBAIC00Nyw3ICs0OCw3IEBACiAJaWYgKHByZnJhbWUgPT0gTlVMTCB8fCBwYWRhcHRlciA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKIAlzaWduYWxfc3RhdCA9ICZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3F1YWxfZGF0YTsKIAogCWlmIChzaWduYWxfc3RhdC0+dXBkYXRlX3JlcSkgewpAQCAtNjMsNyArNjQsNyBAQAogCiB2b2lkIHJ0bDgxODhlX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwcmZyYW1lKQogewotCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUgPSAodW5pb24gcmVjdl9mcmFtZSAqKXByZnJhbWU7CisJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUgPSAoc3RydWN0IHJlY3ZfZnJhbWUgKilwcmZyYW1lOwogCiAJLyogIENoZWNrIFJTU0kgKi8KIAlwcm9jZXNzX3Jzc2kocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwpAQCAtNzEsNyArNzIsOCBAQAogCXByb2Nlc3NfbGlua19xdWFsKHBhZGFwdGVyLCAgcHJlY3ZmcmFtZSk7CiB9CiAKLXZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWJfODhlKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCByZWN2X3N0YXQgKnByeHN0YXQpCit2b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliXzg4ZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKKwkJCQkgc3RydWN0IHJlY3Zfc3RhdCAqcHJ4c3RhdCkKIHsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYjsKIAlzdHJ1Y3QgcmVjdl9zdGF0CXJlcG9ydDsKQEAgLTgzLDcgKzg1LDcgQEAKIAlyZXBvcnQucnhkdzQgPSBwcnhzdGF0LT5yeGR3NDsKIAlyZXBvcnQucnhkdzUgPSBwcnhzdGF0LT5yeGR3NTsKIAotCXBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+dS5oZHIuYXR0cmliOworCXBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwogCV9ydHdfbWVtc2V0KHBhdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgcnhfcGt0X2F0dHJpYikpOwogCiAJcGF0dHJpYi0+Y3JjX2VyciA9ICh1OCkoKGxlMzJfdG9fY3B1KHJlcG9ydC5yeGR3MCkgPj4gMTQpICYgMHgxKTsvKiB1OClwcnhyZXBvcnQtPmNyYzMyOyAqLwpAQCAtMTM2LDEyICsxMzgsMTMgQEAKIC8qCiAgKiBOb3RpY2U6CiAgKglCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLAotICoJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSBzaG91bGQgYmUgcmVhZHkhCisgKglwcmVjdmZyYW1lLT5yeF9kYXRhIHNob3VsZCBiZSByZWFkeSEKICAqLwotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX3BoeWluZm9fODhlKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBwaHlfc3RhdCAqcHBoeV9zdGF0dXMpCit2b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mb184OGUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCisJCQkJICBzdHJ1Y3QgcGh5X3N0YXQgKnBwaHlfc3RhdHVzKQogewotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZWN2ZnJhbWUtPnUuaGRyLmFkYXB0ZXI7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+dS5oZHIuYXR0cmliOworCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwogCXN0cnVjdCBvZG1fcGh5X3N0YXR1c19pbmZvICpwUEhZSW5mbyAgPSAoc3RydWN0IG9kbV9waHlfc3RhdHVzX2luZm8gKikoJnBhdHRyaWItPnBoeV9pbmZvKTsKIAl1OCAqd2xhbmhkcjsKQEAgLTE1NCwxNSArMTU3LDE1IEBACiAJcGt0X2luZm8uYlBhY2tldFRvU2VsZiA9IGZhbHNlOwogCXBrdF9pbmZvLmJQYWNrZXRCZWFjb24gPSBmYWxzZTsKIAotCXdsYW5oZHIgPSBnZXRfcmVjdmZyYW1lX2RhdGEocHJlY3ZmcmFtZSk7CisJd2xhbmhkciA9IHByZWN2ZnJhbWUtPnJ4X2RhdGE7CiAKIAlwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCA9ICgoIUlzRnJhbWVUeXBlQ3RybCh3bGFuaGRyKSkgJiYKIAkJIXBhdHRyaWItPmljdl9lcnIgJiYgIXBhdHRyaWItPmNyY19lcnIgJiYKLQkJX3J0d19tZW1jbXAoZ2V0X2hkcl9ic3NpZCh3bGFuaGRyKSwKKwkJIW1lbWNtcChnZXRfaGRyX2Jzc2lkKHdsYW5oZHIpLAogCQkgZ2V0X2Jzc2lkKCZwYWRhcHRlci0+bWxtZXByaXYpLCBFVEhfQUxFTikpOwogCiAJcGt0X2luZm8uYlBhY2tldFRvU2VsZiA9IHBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEICYmCi0JCQkJIChfcnR3X21lbWNtcChnZXRfZGEod2xhbmhkciksCisJCQkJICghbWVtY21wKGdldF9kYSh3bGFuaGRyKSwKIAkJCQkgIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKTsKIAogCXBrdF9pbmZvLmJQYWNrZXRCZWFjb24gPSBwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgpAQCAtMTg1LDE3ICsxODgsMTcgQEAKIAogCU9ETV9QaHlTdGF0dXNRdWVyeSgmcEhhbERhdGEtPm9kbXByaXYsIHBQSFlJbmZvLCAodTggKilwcGh5X3N0YXR1cywgJihwa3RfaW5mbykpOwogCi0JcHJlY3ZmcmFtZS0+dS5oZHIucHN0YSA9IE5VTEw7CisJcHJlY3ZmcmFtZS0+cHN0YSA9IE5VTEw7CiAJaWYgKHBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEICYmCiAJICAgIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSkgewogCQlpZiAocHN0YSkgewotCQkJcHJlY3ZmcmFtZS0+dS5oZHIucHN0YSA9IHBzdGE7CisJCQlwcmVjdmZyYW1lLT5wc3RhID0gcHN0YTsKIAkJCXJ0bDgxODhlX3Byb2Nlc3NfcGh5X2luZm8ocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwogCQl9CiAJfSBlbHNlIGlmIChwa3RfaW5mby5iUGFja2V0VG9TZWxmIHx8IHBrdF9pbmZvLmJQYWNrZXRCZWFjb24pIHsKIAkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURXxXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKIAkJCWlmIChwc3RhKQotCQkJCXByZWN2ZnJhbWUtPnUuaGRyLnBzdGEgPSBwc3RhOworCQkJCXByZWN2ZnJhbWUtPnBzdGEgPSBwc3RhOwogCQl9CiAJCXJ0bDgxODhlX3Byb2Nlc3NfcGh5X2luZm8ocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCmluZGV4IDE3Yzk0ZjQuLmIxYjE1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYwpAQCAtMjIsOSArMjIsNiBAQAogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KICNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8aXAuaD4KLSNpbmNsdWRlIDxpZl9ldGhlci5oPgotI2luY2x1ZGUgPGV0aGVybmV0Lmg+CiAKICNpbmNsdWRlIDx1c2Jfb3BzLmg+CiAjaW5jbHVkZSA8d2lmaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMKaW5kZXggNmZiNmE0Ni4uMzQ3NmY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jCkBAIC01MzcsMTEgKzUzNywxMSBAQAogCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKIAogCXhtaXRmcmFtZV9waGVhZCA9IGdldF9saXN0X2hlYWQoJnB0eHNlcnZxLT5zdGFfcGVuZGluZyk7Ci0JeG1pdGZyYW1lX3BsaXN0ID0gZ2V0X25leHQoeG1pdGZyYW1lX3BoZWFkKTsKKwl4bWl0ZnJhbWVfcGxpc3QgPSB4bWl0ZnJhbWVfcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoIXJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHhtaXRmcmFtZV9waGVhZCwgeG1pdGZyYW1lX3BsaXN0KSkgewotCQlweG1pdGZyYW1lID0gTElTVF9DT05UQUlOT1IoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7Ci0JCXhtaXRmcmFtZV9wbGlzdCA9IGdldF9uZXh0KHhtaXRmcmFtZV9wbGlzdCk7CisJCXB4bWl0ZnJhbWUgPSBjb250YWluZXJfb2YoeG1pdGZyYW1lX3BsaXN0LCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7CisJCXhtaXRmcmFtZV9wbGlzdCA9IHhtaXRmcmFtZV9wbGlzdC0+bmV4dDsKIAogCQlweG1pdGZyYW1lLT5hZ2dfbnVtID0gMDsgLyogIG5vdCBmaXJzdCBmcmFtZSBvZiBhZ2dyZWdhdGlvbiAqLwogCQlweG1pdGZyYW1lLT5wa3Rfb2Zmc2V0ID0gMDsgLyogIG5vdCBmaXJzdCBmcmFtZSBvZiBhZ2dyZWdhdGlvbiwgbm8gbmVlZCB0byByZXNlcnZlIG9mZnNldCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKaW5kZXggYjI0YWQ0OS4uYzkyMDY3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCkBAIC03MDksNyArNzA5LDYgQEAKIAogCSNkZWZpbmUgSEFMX0lOSVRfUFJPRklMRV9UQUcoc3RhZ2UpIGRvIHt9IHdoaWxlICgwKQogCi1fZnVuY19lbnRlcl87CiAKIAlIQUxfSU5JVF9QUk9GSUxFX1RBRyhIQUxfSU5JVF9TVEFHRVNfQkVHSU4pOwogCkBAIC05NjcsNyArOTY2LDYgQEAKIAogCURCR184OEUoIiVzIGluICVkbXNcbiIsIF9fZnVuY19fLCBydHdfZ2V0X3Bhc3NpbmdfdGltZV9tcyhpbml0X3N0YXJ0X3RpbWUpKTsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTA4NCw3ICsxMDgyLDYgQEAKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmKEFkYXB0ZXItPnJlY3Zwcml2KTsKIAl1MzIgKCpfcmVhZF9wb3J0KShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKnBtZW0pOwogCi1fZnVuY19lbnRlcl87CiAKIAlfcmVhZF9wb3J0ID0gcGludGZoZGwtPmlvX29wcy5fcmVhZF9wb3J0OwogCkBAIC0xMTEyLDcgKzExMDksNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiPD09PSB1c2JfaW5pcnBfaW5pdFxuIikpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNDAyLDcgKzEzOTgsNiBAQAogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxkYXRhLT5kbXByaXY7CiAJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJmhhbGRhdGEtPm9kbXByaXY7Ci1fZnVuY19lbnRlcl87CiAKIAlzd2l0Y2ggKHZhcmlhYmxlKSB7CiAJY2FzZSBIV19WQVJfTUVESUFfU1RBVFVTOgpAQCAtMTkyMSwxNCArMTkxNiwxMiBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdm9pZCBHZXRId1JlZzgxODhFVShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggdmFyaWFibGUsIHU4ICp2YWwpCiB7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZoYWxkYXRhLT5vZG1wcml2OwotX2Z1bmNfZW50ZXJfOwogCiAJc3dpdGNoICh2YXJpYWJsZSkgewogCWNhc2UgSFdfVkFSX0JBU0lDX1JBVEU6CkBAIC0xOTgwLDcgKzE5NzMsNiBAQAogCQlicmVhazsKIAl9CiAKLV9mdW5jX2V4aXRfOwogfQogCiAvKiAgKi8KQEAgLTIzMDIsNyArMjI5NCw2IEBACiB7CiAJc3RydWN0IGhhbF9vcHMJKmhhbGZ1bmMgPSAmYWRhcHQtPkhhbEZ1bmM7CiAKLV9mdW5jX2VudGVyXzsKIAogCWFkYXB0LT5IYWxEYXRhID0gcnR3X3ptYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYWxfZGF0YV84MTg4ZSkpOwogCWlmIChhZGFwdC0+SGFsRGF0YSA9PSBOVUxMKQpAQCAtMjM0Miw1ICsyMzMzLDQgQEAKIAloYWxmdW5jLT5pbnRlcmZhY2VfcHNfZnVuYyA9ICZydGw4MTg4ZXVfcHNfZnVuYzsKIAogCXJ0bDgxODhlX3NldF9oYWxfb3BzKGhhbGZ1bmMpOwotX2Z1bmNfZXhpdF87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2Jfb3BzX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2Jfb3BzX2xpbnV4LmMKaW5kZXggMzFhZTIxYS4uMWZhNTM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX29wc19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9vcHNfbGludXguYwpAQCAtMTExLDcgKzExMSw3IEBACiAJCQlicmVhazsKIAl9CiByZWxlYXNlX211dGV4OgotCV9leGl0X2NyaXRpY2FsX211dGV4KCZkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4LCBOVUxMKTsKKwltdXRleF91bmxvY2soJmR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwogZXhpdDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTI1LDcgKzEyNSw2IEBACiAJdTE2IGxlbjsKIAl1OCBkYXRhID0gMDsKIAotCV9mdW5jX2VudGVyXzsKIAogCXJlcXVlc3QgPSAweDA1OwogCXJlcXVlc3R0eXBlID0gMHgwMTsvKiByZWFkX2luICovCkBAIC0xMzYsNyArMTM1LDYgQEAKIAogCXVzYmN0cmxfdmVuZG9ycmVxKHBpbnRmaGRsLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiBkYXRhOwogCkBAIC0xNTEsMTQgKzE0OSwxMiBAQAogCXUxNiBsZW47CiAJX19sZTMyIGRhdGE7CiAKLV9mdW5jX2VudGVyXzsKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDE7LyogcmVhZF9pbiAqLwogCWluZGV4ID0gMDsvKiBuL2EgKi8KIAl3dmFsdWUgPSAodTE2KShhZGRyJjB4MDAwMGZmZmYpOwogCWxlbiA9IDI7CiAJdXNiY3RybF92ZW5kb3JyZXEocGludGZoZGwsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuICh1MTYpKGxlMzJfdG9fY3B1KGRhdGEpJjB4ZmZmZik7CiB9CkBAIC0xNzIsNyArMTY4LDYgQEAKIAl1MTYgbGVuOwogCV9fbGUzMiBkYXRhOwogCi1fZnVuY19lbnRlcl87CiAKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDE7LyogcmVhZF9pbiAqLwpAQCAtMTgzLDcgKzE3OCw2IEBACiAKIAl1c2JjdHJsX3ZlbmRvcnJlcShwaW50ZmhkbCwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBsZTMyX3RvX2NwdShkYXRhKTsKIH0KQEAgLTE5OCw3ICsxOTIsNiBAQAogCXU4IGRhdGE7CiAJaW50IHJldDsKIAotCV9mdW5jX2VudGVyXzsKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDA7Lyogd3JpdGVfb3V0ICovCiAJaW5kZXggPSAwOy8qIG4vYSAqLwpAQCAtMjA2LDcgKzE5OSw2IEBACiAJbGVuID0gMTsKIAlkYXRhID0gdmFsOwogCXJldCA9IHVzYmN0cmxfdmVuZG9ycmVxKHBpbnRmaGRsLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjIwLDcgKzIxMiw2IEBACiAJX19sZTMyIGRhdGE7CiAJaW50IHJldDsKIAotCV9mdW5jX2VudGVyXzsKIAogCXJlcXVlc3QgPSAweDA1OwogCXJlcXVlc3R0eXBlID0gMHgwMDsvKiB3cml0ZV9vdXQgKi8KQEAgLTIzMyw3ICsyMjQsNiBAQAogCiAJcmV0ID0gdXNiY3RybF92ZW5kb3JyZXEocGludGZoZGwsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI0OCw3ICsyMzgsNiBAQAogCV9fbGUzMiBkYXRhOwogCWludCByZXQ7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDA7Lyogd3JpdGVfb3V0ICovCkBAIC0yNjAsNyArMjQ5LDYgQEAKIAogCXJldCA9IHVzYmN0cmxfdmVuZG9ycmVxKHBpbnRmaGRsLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNzUsNyArMjYzLDYgQEAKIAl1OCBidWZbVkVORE9SX0NNRF9NQVhfREFUQV9MRU5dID0gezB9OwogCWludCByZXQ7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDA7Lyogd3JpdGVfb3V0ICovCkBAIC0yODcsNyArMjc0LDYgQEAKIAogCXJldCA9IHVzYmN0cmxfdmVuZG9ycmVxKHBpbnRmaGRsLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCBidWYsIGxlbiwgcmVxdWVzdHR5cGUpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzIwLDcgKzMwNiw3IEBACiAJc3RydWN0IHJlY3Zfc3RhdAkqcHJ4c3RhdDsKIAlzdHJ1Y3QgcGh5X3N0YXQJKnBwaHlfc3RhdHVzID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcGt0X2NvcHkgPSBOVUxMOwotCXVuaW9uIHJlY3ZfZnJhbWUJKnByZWN2ZnJhbWUgPSBOVUxMOworCXN0cnVjdCByZWN2X2ZyYW1lCSpwcmVjdmZyYW1lID0gTlVMTDsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYiA9IE5VTEw7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlzdHJ1Y3QgcmVjdl9wcml2CSpwcmVjdnByaXYgPSAmYWRhcHQtPnJlY3Zwcml2OwpAQCAtMzQ2LDEzICszMzIsMTMgQEAKIAkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7CiAJCX0KIAotCQlfcnR3X2luaXRfbGlzdGhlYWQoJnByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpOwotCQlwcmVjdmZyYW1lLT51Lmhkci5wcmVjdmJ1ZiA9IE5VTEw7CS8qIGNhbid0IGFjY2VzcyB0aGUgcHJlY3ZidWYgZm9yIG5ldyBhcmNoLiAqLwotCQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gPSAwOworCQlfcnR3X2luaXRfbGlzdGhlYWQoJnByZWN2ZnJhbWUtPmxpc3QpOworCQlwcmVjdmZyYW1lLT5wcmVjdmJ1ZiA9IE5VTEw7CS8qIGNhbid0IGFjY2VzcyB0aGUgcHJlY3ZidWYgZm9yIG5ldyBhcmNoLiAqLworCQlwcmVjdmZyYW1lLT5sZW4gPSAwOwogCiAJCXVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliXzg4ZShwcmVjdmZyYW1lLCBwcnhzdGF0KTsKIAotCQlwYXR0cmliID0gJnByZWN2ZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwkJcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7CiAKIAkJaWYgKChwYXR0cmliLT5jcmNfZXJyKSB8fCAocGF0dHJpYi0+aWN2X2VycikpIHsKIAkJCURCR184OEUoIiVzOiBSWCBXYXJuaW5nISBjcmNfZXJyPSVkIGljdl9lcnI9JWQsIHNraXAhXG4iLCBfX2Z1bmNfXywgcGF0dHJpYi0+Y3JjX2VyciwgcGF0dHJpYi0+aWN2X2Vycik7CkBAIC0zOTksMjYgKzM4NSwyNiBAQAogCQlwa3RfY29weSA9IG5ldGRldl9hbGxvY19za2IoYWRhcHQtPnBuZXRkZXYsIGFsbG9jX3N6KTsKIAkJaWYgKHBrdF9jb3B5KSB7CiAJCQlwa3RfY29weS0+ZGV2ID0gYWRhcHQtPnBuZXRkZXY7Ci0JCQlwcmVjdmZyYW1lLT51Lmhkci5wa3QgPSBwa3RfY29weTsKLQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2hlYWQgPSBwa3RfY29weS0+ZGF0YTsKLQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2VuZCA9IHBrdF9jb3B5LT5kYXRhICsgYWxsb2Nfc3o7CisJCQlwcmVjdmZyYW1lLT5wa3QgPSBwa3RfY29weTsKKwkJCXByZWN2ZnJhbWUtPnJ4X2hlYWQgPSBwa3RfY29weS0+ZGF0YTsKKwkJCXByZWN2ZnJhbWUtPnJ4X2VuZCA9IHBrdF9jb3B5LT5kYXRhICsgYWxsb2Nfc3o7CiAJCQlza2JfcmVzZXJ2ZShwa3RfY29weSwgOCAtICgoc2l6ZV90KShwa3RfY29weS0+ZGF0YSkgJiA3KSk7LyogZm9yY2UgcGt0X2NvcHktPmRhdGEgYXQgOC1ieXRlIGFsaWdubWVudCBhZGRyZXNzICovCiAJCQlza2JfcmVzZXJ2ZShwa3RfY29weSwgc2hpZnRfc3opOy8qIGZvcmNlIGlwX2hkciBhdCA4LWJ5dGUgYWxpZ25tZW50IGFkZHJlc3MgYWNjb3JkaW5nIHRvIHNoaWZ0X3N6LiAqLwogCQkJbWVtY3B5KHBrdF9jb3B5LT5kYXRhLCAocGJ1ZiArIHBhdHRyaWItPmRydmluZm9fc3ogKyBSWERFU0NfU0laRSksIHNrYl9sZW4pOwotCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCA9IHBrdF9jb3B5LT5kYXRhOwotCQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSA9IHBrdF9jb3B5LT5kYXRhOworCQkJcHJlY3ZmcmFtZS0+cnhfdGFpbCA9IHBrdF9jb3B5LT5kYXRhOworCQkJcHJlY3ZmcmFtZS0+cnhfZGF0YSA9IHBrdF9jb3B5LT5kYXRhOwogCQl9IGVsc2UgewogCQkJaWYgKChwYXR0cmliLT5tZnJhZyA9PSAxKSAmJiAocGF0dHJpYi0+ZnJhZ19udW0gPT0gMCkpIHsKIAkJCQlEQkdfODhFKCJyZWN2YnVmMnJlY3ZmcmFtZTogYWxsb2Nfc2tiIGZhaWwgLCBkcm9wIGZyYWcgZnJhbWVcbiIpOwogCQkJCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmVjdmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJCQlnb3RvIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwogCQkJfQotCQkJcHJlY3ZmcmFtZS0+dS5oZHIucGt0ID0gc2tiX2Nsb25lKHBza2IsIEdGUF9BVE9NSUMpOwotCQkJaWYgKHByZWN2ZnJhbWUtPnUuaGRyLnBrdCkgewotCQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgPSBwYnVmICsgcGF0dHJpYi0+ZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFOwotCQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2hlYWQgPSBwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsOwotCQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgPSBwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsOwotCQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2VuZCA9ICBwYnVmICsgcGF0dHJpYi0+ZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFICsgYWxsb2Nfc3o7CisJCQlwcmVjdmZyYW1lLT5wa3QgPSBza2JfY2xvbmUocHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAocHJlY3ZmcmFtZS0+cGt0KSB7CisJCQkJcHJlY3ZmcmFtZS0+cnhfdGFpbCA9IHBidWYgKyBwYXR0cmliLT5kcnZpbmZvX3N6ICsgUlhERVNDX1NJWkU7CisJCQkJcHJlY3ZmcmFtZS0+cnhfaGVhZCA9IHByZWN2ZnJhbWUtPnJ4X3RhaWw7CisJCQkJcHJlY3ZmcmFtZS0+cnhfZGF0YSA9IHByZWN2ZnJhbWUtPnJ4X3RhaWw7CisJCQkJcHJlY3ZmcmFtZS0+cnhfZW5kID0gIHBidWYgKyBwYXR0cmliLT5kcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUgKyBhbGxvY19zejsKIAkJCX0gZWxzZSB7CiAJCQkJREJHXzg4RSgicmVjdmJ1ZjJyZWN2ZnJhbWU6IHNrYl9jbG9uZSBmYWlsXG4iKTsKIAkJCQlydHdfZnJlZV9yZWN2ZnJhbWUocHJlY3ZmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CkBAIC00NTEsMTcgKzQzNywxNyBAQAogCQkJLyogZW5xdWV1ZSByZWN2ZnJhbWUgdG8gdHhydHAgcXVldWUgKi8KIAkJCWlmIChwYXR0cmliLT5wa3RfcnB0X3R5cGUgPT0gVFhfUkVQT1JUMSkgewogCQkJCS8qIENDWC1UWFJQVCBhY2sgZm9yIHhtaXQgbWdtdCBmcmFtZXMuICovCi0JCQkJaGFuZGxlX3R4cnB0X2NjeF84OGUoYWRhcHQsIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEpOworCQkJCWhhbmRsZV90eHJwdF9jY3hfODhlKGFkYXB0LCBwcmVjdmZyYW1lLT5yeF9kYXRhKTsKIAkJCX0gZWxzZSBpZiAocGF0dHJpYi0+cGt0X3JwdF90eXBlID09IFRYX1JFUE9SVDIpIHsKIAkJCQlPRE1fUkFfVHhSUFQySGFuZGxlXzgxODhFKAogCQkJCQkJCSZoYWxkYXRhLT5vZG1wcml2LAotCQkJCQkJCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEsCisJCQkJCQkJcHJlY3ZmcmFtZS0+cnhfZGF0YSwKIAkJCQkJCQlwYXR0cmliLT5wa3RfbGVuLAogCQkJCQkJCXBhdHRyaWItPk1hY0lEVmFsaWRFbnRyeVswXSwKIAkJCQkJCQlwYXR0cmliLT5NYWNJRFZhbGlkRW50cnlbMV0KIAkJCQkJCQkpOwogCQkJfSBlbHNlIGlmIChwYXR0cmliLT5wa3RfcnB0X3R5cGUgPT0gSElTX1JFUE9SVCkgewotCQkJCWludGVycnVwdF9oYW5kbGVyXzgxODhldShhZGFwdCwgcGF0dHJpYi0+cGt0X2xlbiwgcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSk7CisJCQkJaW50ZXJydXB0X2hhbmRsZXJfODE4OGV1KGFkYXB0LCBwYXR0cmliLT5wa3RfbGVuLCBwcmVjdmZyYW1lLT5yeF9kYXRhKTsKIAkJCX0KIAkJCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmVjdmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJfQpAQCAtNTE5LDcgKzUwNSw3IEBACiAJCURCR184OEUoIiVzKCkgUlggV2FybmluZyEgYkRyaXZlclN0b3BwZWQoJWQpIE9SIGJTdXJwcmlzZVJlbW92ZWQoJWQpIGJSZWFkUG9ydENhbmNlbCglZClcbiIsCiAJCQlfX2Z1bmNfXywgYWRhcHQtPmJEcml2ZXJTdG9wcGVkLAogCQkJYWRhcHQtPmJTdXJwcmlzZVJlbW92ZWQsIGFkYXB0LT5iUmVhZFBvcnRDYW5jZWwpOwotCQlnb3RvIGV4aXQ7CisJCXJldHVybjsKIAl9CiAKIAlpZiAocHVyYi0+c3RhdHVzID09IDApIHsgLyogU1VDQ0VTUyAqLwpAQCAtNTc5LDkgKzU2NSw2IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQotZXhpdDoKLV9mdW5jX2V4aXRfOwogfQogCiBzdGF0aWMgdTMyIHVzYl9yZWFkX3BvcnQoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICpybWVtKQpAQCAtNTk4LDcgKzU4MSw2IEBACiAJc2l6ZV90IGFsaWdubWVudCA9IDA7CiAJdTMyIHJldCA9IF9TVUNDRVNTOwogCi1fZnVuY19lbnRlcl87CiAKIAlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAogCSAgICBhZGFwdGVyLT5wd3JjdHJscHJpdi5wbnBfYnN0b3BfdHJ4KSB7CkBAIC02NzIsNyArNjU0LDYgQEAKIAkJcmV0ID0gX0ZBSUw7CiAJfQogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03MDIsNyArNjgzLDYgQEAKIAogdm9pZCBydGw4MTg4ZXVfc2V0X2ludGZfb3BzKHN0cnVjdCBfaW9fb3BzCSpwb3BzKQogewotCV9mdW5jX2VudGVyXzsKIAlfcnR3X21lbXNldCgodTggKilwb3BzLCAwLCBzaXplb2Yoc3RydWN0IF9pb19vcHMpKTsKIAlwb3BzLT5fcmVhZDggPSAmdXNiX3JlYWQ4OwogCXBvcHMtPl9yZWFkMTYgPSAmdXNiX3JlYWQxNjsKQEAgLTcxNyw3ICs2OTcsNiBAQAogCXBvcHMtPl93cml0ZV9wb3J0ID0gJnVzYl93cml0ZV9wb3J0OwogCXBvcHMtPl9yZWFkX3BvcnRfY2FuY2VsID0gJnVzYl9yZWFkX3BvcnRfY2FuY2VsOwogCXBvcHMtPl93cml0ZV9wb3J0X2NhbmNlbCA9ICZ1c2Jfd3JpdGVfcG9ydF9jYW5jZWw7Ci0JX2Z1bmNfZXhpdF87CiB9CiAKIHZvaWQgcnRsODE4OGV1X3NldF9od190eXBlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9kcnZfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9kcnZfdHlwZXMuaAppbmRleCBhNDkyYTFjLi45MzZjMTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oCkBAIC0xNTksOSArMTU5LDE1IEBACiAKICNkZWZpbmUgTUFYX0NPTlRJTlVBTF9VUkJfRVJSCQk0CiAKK3N0cnVjdCBydF9maXJtd2FyZSB7CisJdTgJCQkqc3pGd0J1ZmZlcjsKKwl1MzIJCQl1bEZ3TGVuZ3RoOworfTsKKwogc3RydWN0IGR2b2JqX3ByaXYgewogCXN0cnVjdCBhZGFwdGVyICppZjE7CiAJc3RydWN0IGFkYXB0ZXIgKmlmMjsKKwlzdHJ1Y3QgcnRfZmlybXdhcmUgZmlybXdhcmU7CiAKIAkvKiBGb3IgOTJELCBETURQIGhhdmUgMiBpbnRlcmZhY2UuICovCiAJdTgJSW50ZXJmYWNlTnVtYmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2V0aGVybmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZXRoZXJuZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5ZjkxMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZXRoZXJuZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyohIFxmaWxlICovCi0jaWZuZGVmIF9fSU5DX0VUSEVSTkVUX0gKLSNkZWZpbmUgX19JTkNfRVRIRVJORVRfSAotCi0jZGVmaW5lIEVUSEVSTkVUX0FERFJFU1NfTEVOR1RICQk2CS8qICBFdGhlcm5ldCBBZGRyZXNzIExlbmd0aCAqLwotI2RlZmluZSBFVEhFUk5FVF9IRUFERVJfU0laRQkJMTQJLyogIEV0aGVybmV0IEhlYWRlciBMZW5ndGggKi8KLSNkZWZpbmUgTExDX0hFQURFUl9TSVpFCQkJNgkvKiAgTExDIEhlYWRlciBMZW5ndGggKi8KLSNkZWZpbmUgVFlQRV9MRU5HVEhfRklFTERfU0laRQkJMgkvKiAgVHlwZS9MZW5ndGggU2l6ZSAqLwotI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX1BBQ0tFVF9TSVpFCTYwCS8qICBNaW4gRXRoZXJuZXQgUGFja2V0IFNpemUgKi8KLSNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9QQUNLRVRfU0laRQkxNTE0CS8qICBNYXggRXRoZXJuZXQgUGFja2V0IFNpemUgKi8KLQotLyogIElzIE11bHRpY2FzdCBBZGRyZXNzPyAqLwotI2RlZmluZSBSVF9FVEhfSVNfTVVMVElDQVNUKF9hZGRyKQkoKCgodTggKikoX2FkZHIpKVswXSYweDAxKSAhPSAwKQotI2RlZmluZSBSVF9FVEhfSVNfQlJPQURDQVNUKF9hZGRyKQkoCQkJXAotCQkoKHU4ICopKF9hZGRyKSlbMF0gPT0gMHhmZiAmJgkJXAotCQkoKHU4ICopKF9hZGRyKSlbMV0gPT0gMHhmZiAmJgkJXAotCQkoKHU4ICopKF9hZGRyKSlbMl0gPT0gMHhmZiAmJgkJXAotCQkoKHU4ICopKF9hZGRyKSlbM10gPT0gMHhmZiAmJgkJXAotCQkoKHU4ICopKF9hZGRyKSlbNF0gPT0gMHhmZiAmJgkJXAotCQkoKHU4ICopKF9hZGRyKSlbNV0gPT0gMHhmZikJLyogIElzIEJyb2FkY2FzdCBBZGRyZXNzPyAqLwotCi0KLSNlbmRpZiAvKiAgI2lmbmRlZiBfX0lOQ19FVEhFUk5FVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaDJjbGJrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaDJjbGJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTUwMzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2gyY2xiay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBfSDJDTEJLX0hfCi0KLQotI2luY2x1ZGUgPHJ0bDg3MTFfc3BlYy5oPgotI2luY2x1ZGUgPFR5cGVEZWYuaD4KLQotCi12b2lkIF9sYmtfY21kKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLQotdm9pZCBfbGJrX3JzcChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgX2xia19ldnQoSU4gc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIGgyY19ldmVudF9jYWxsYmFjayh1bnNpZ25lZCBjaGFyICpkZXYsIHVuc2lnbmVkIGNoYXIgKnBidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lmX2V0aGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWZfZXRoZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxNTc3MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWZfZXRoZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfTElOVVhfSUZfRVRIRVJfSAotI2RlZmluZSBfTElOVVhfSUZfRVRIRVJfSAotCi0vKgotICoJSUVFRSA4MDIuMyBFdGhlcm5ldCBtYWdpYyBjb25zdGFudHMuICBUaGUgZnJhbWUgc2l6ZXMgb21pdCB0aGUgcHJlYW1ibGUKLSAqCWFuZCBGQ1MvQ1JDIChmcmFtZSBjaGVjayBzZXF1ZW5jZSkuCi0gKi8KLQotI2RlZmluZSBFVEhfQUxFTgk2CQkvKiBPY3RldHMgaW4gb25lIGV0aGVybmV0IGFkZHIJICovCi0jZGVmaW5lIEVUSF9ITEVOCTE0CQkvKiBUb3RhbCBvY3RldHMgaW4gaGVhZGVyLgkgKi8KLSNkZWZpbmUgRVRIX1pMRU4JNjAJCS8qIE1pbi4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCi0jZGVmaW5lIEVUSF9EQVRBX0xFTgkxNTAwCQkvKiBNYXguIG9jdGV0cyBpbiBwYXlsb2FkCSAqLwotI2RlZmluZSBFVEhfRlJBTUVfTEVOCTE1MTQJCS8qIE1heC4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCi0KLS8qCi0gKglUaGVzZSBhcmUgdGhlIGRlZmluZWQgRXRoZXJuZXQgUHJvdG9jb2wgSUQncy4KLSAqLwotCi0jZGVmaW5lIEVUSF9QX0xPT1AJMHgwMDYwCQkvKiBFdGhlcm5ldCBMb29wYmFjayBwYWNrZXQJKi8KLSNkZWZpbmUgRVRIX1BfUFVQCTB4MDIwMAkJLyogWGVyb3ggUFVQIHBhY2tldAkJKi8KLSNkZWZpbmUgRVRIX1BfUFVQQVQJMHgwMjAxCQkvKiBYZXJveCBQVVAgQWRkciBUcmFucyBwYWNrZXQJKi8KLSNkZWZpbmUgRVRIX1BfSVAJMHgwODAwCQkvKiBJbnRlcm5ldCBQcm90b2NvbCBwYWNrZXQJKi8KLSNkZWZpbmUgRVRIX1BfWDI1CTB4MDgwNQkJLyogQ0NJVFQgWC4yNQkJCSovCi0jZGVmaW5lIEVUSF9QX0FSUAkweDA4MDYJCS8qIEFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQJKi8KLSNkZWZpbmUJRVRIX1BfQlBRCTB4MDhGRgkJLyogRzhCUFEgQVguMjUgRXRoZXJuZXQgUGFja2V0ICAqLwotI2RlZmluZSBFVEhfUF9JRUVFUFVQCTB4MGEwMAkJLyogWGVyb3ggSUVFRTgwMi4zIFBVUCBwYWNrZXQgICAqLwotI2RlZmluZSBFVEhfUF9JRUVFUFVQQVQJMHgwYTAxCQkvKiBYZXJveCBJRUVFODAyLjMgUFVQCQkqLwotI2RlZmluZSBFVEhfUF9ERUMgICAgICAgMHg2MDAwICAgICAgICAgIC8qIERFQyBBc3NpZ25lZCBwcm90byAgICAgICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfRE5BX0RMICAgIDB4NjAwMSAgICAgICAgICAvKiBERUMgRE5BIER1bXAvTG9hZCAgICAgICAgICAgICovCi0jZGVmaW5lIEVUSF9QX0ROQV9SQyAgICAweDYwMDIgICAgICAgICAgLyogREVDIEROQSBSZW1vdGUgQ29uc29sZSAgICAgICAqLwotI2RlZmluZSBFVEhfUF9ETkFfUlQgICAgMHg2MDAzICAgICAgICAgIC8qIERFQyBETkEgUm91dGluZyAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfTEFUICAgICAgIDB4NjAwNCAgICAgICAgICAvKiBERUMgTEFUICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVUSF9QX0RJQUcgICAgICAweDYwMDUgICAgICAgICAgLyogREVDIERpYWdub3N0aWNzICAgICAgICAgICAgICAqLwotI2RlZmluZSBFVEhfUF9DVVNUICAgICAgMHg2MDA2ICAgICAgICAgIC8qIERFQyBDdXN0b21lciB1c2UgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRVRIX1BfU0NBICAgICAgIDB4NjAwNyAgICAgICAgICAvKiBERUMgU3lzdGVtcyBDb21tcyBBcmNoICAgICAgICovCi0jZGVmaW5lIEVUSF9QX1JBUlAgICAgICAweDgwMzUJCS8qIFJldmVyc2UgQWRkciBSZXMgcGFja2V0CSovCi0jZGVmaW5lIEVUSF9QX0FUQUxLCTB4ODA5QgkJLyogQXBwbGV0YWxrIEREUAkJKi8KLSNkZWZpbmUgRVRIX1BfQUFSUAkweDgwRjMJCS8qIEFwcGxldGFsayBBQVJQCQkqLwotI2RlZmluZSBFVEhfUF84MDIxUQkweDgxMDAgICAgICAgICAgLyogODAyLjFRIFZMQU4gRXh0ZW5kZWQgSGVhZGVyICAqLwotI2RlZmluZSBFVEhfUF9JUFgJMHg4MTM3CQkvKiBJUFggb3ZlciBESVgJCQkqLwotI2RlZmluZSBFVEhfUF9JUFY2CTB4ODZERAkJLyogSVB2NiBvdmVyIGJsdWVib29rCQkqLwotI2RlZmluZSBFVEhfUF9QUFBfRElTQwkweDg4NjMJCS8qIFBQUG9FIGRpc2NvdmVyeSBtZXNzYWdlcyAgICAgKi8KLSNkZWZpbmUgRVRIX1BfUFBQX1NFUwkweDg4NjQJCS8qIFBQUG9FIHNlc3Npb24gbWVzc2FnZXMJKi8KLSNkZWZpbmUgRVRIX1BfQVRNTVBPQQkweDg4NGMJCS8qIE11bHRpUHJvdG9jb2wgT3ZlciBBVE0JKi8KLSNkZWZpbmUgRVRIX1BfQVRNRkFURQkweDg4ODQJCS8qIEZyYW1lLWJhc2VkIEFUTSBUcmFuc3BvcnQKLQkJCQkJICogb3ZlciBFdGhlcm5ldAotCQkJCQkgKi8KLQotLyoKLSAqCU5vbiBESVggdHlwZXMuIFdvbid0IGNsYXNoIGZvciAxNTAwIHR5cGVzLgotICovCi0KLSNkZWZpbmUgRVRIX1BfODAyXzMJMHgwMDAxCQkvKiBEdW1teSB0eXBlIGZvciA4MDIuMyBmcmFtZXMgICovCi0jZGVmaW5lIEVUSF9QX0FYMjUJMHgwMDAyCQkvKiBEdW1teSBwcm90b2NvbCBpZCBmb3IgQVguMjUgICovCi0jZGVmaW5lIEVUSF9QX0FMTAkweDAwMDMJCS8qIEV2ZXJ5IHBhY2tldCAoYmUgY2FyZWZ1bCEhISkgKi8KLSNkZWZpbmUgRVRIX1BfODAyXzIJMHgwMDA0CQkvKiA4MDIuMiBmcmFtZXMJCQkqLwotI2RlZmluZSBFVEhfUF9TTkFQCTB4MDAwNQkJLyogSW50ZXJuYWwgb25seQkJKi8KLSNkZWZpbmUgRVRIX1BfRERDTVAgICAgIDB4MDAwNiAgICAgICAgICAvKiBERUMgRERDTVA6IEludGVybmFsIG9ubHkgICAgICovCi0jZGVmaW5lIEVUSF9QX1dBTl9QUFAgICAweDAwMDcgICAgICAgICAgLyogRHVtbXkgdHlwZSBmb3IgV0FOIFBQUCBmcmFtZXMqLwotI2RlZmluZSBFVEhfUF9QUFBfTVAgICAgMHgwMDA4ICAgICAgICAgIC8qIER1bW15IHR5cGUgZm9yIFBQUCBNUCBmcmFtZXMgKi8KLSNkZWZpbmUgRVRIX1BfTE9DQUxUQUxLIDB4MDAwOQkJLyogTG9jYWx0YWxrIHBzZXVkbyB0eXBlCSovCi0jZGVmaW5lIEVUSF9QX1BQUFRBTEsJMHgwMDEwCQkvKiBEdW1teSB0eXBlIGZvciBBdGFsayBvdmVyIFBQUCovCi0jZGVmaW5lIEVUSF9QX1RSXzgwMl8yCTB4MDAxMQkJLyogODAyLjIgZnJhbWVzCQkJKi8KLSNkZWZpbmUgRVRIX1BfTU9CSVRFWAkweDAwMTUJCS8qIE1vYml0ZXggKGthekBjYWZlLm5ldCkJKi8KLSNkZWZpbmUgRVRIX1BfQ09OVFJPTAkweDAwMTYJCS8qIENhcmQgc3BlY2lmaWMgY29udHJvbCBmcmFtZXMgKi8KLSNkZWZpbmUgRVRIX1BfSVJEQQkweDAwMTcJCS8qIExpbnV4LUlyREEJCQkqLwotI2RlZmluZSBFVEhfUF9FQ09ORVQJMHgwMDE4CQkvKiBBY29ybiBFY29uZXQJCQkqLwotCi0vKgotICoJVGhpcyBpcyBhbiBFdGhlcm5ldCBmcmFtZSBoZWFkZXIuCi0gKi8KLQotc3RydWN0IGV0aGhkciB7Ci0JdW5zaWduZWQgY2hhcgloX2Rlc3RbRVRIX0FMRU5dOwkvKiBkZXN0aW5hdGlvbiBldGggYWRkcgkqLwotCXVuc2lnbmVkIGNoYXIJaF9zb3VyY2VbRVRIX0FMRU5dOwkvKiBzb3VyY2UgZXRoZXIgYWRkcgkqLwotCXVuc2lnbmVkIHNob3J0CWhfcHJvdG87CQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZAkqLwotfTsKLQotc3RydWN0IF92bGFuIHsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICBoX3ZsYW5fVENJOwkvKiAgRW5jYXAgcHJpbyBhbmQgVkxBTiBJRCAqLwotCXVuc2lnbmVkIHNob3J0ICAgICAgIGhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87Ci19OwotCi0jZGVmaW5lIGdldF92bGFuX2lkKHB2bGFuKQkJCQlcCi0JKChudG9ocygodW5zaWduZWQgc2hvcnQpcHZsYW4tPmhfdmxhbl9UQ0kpKSAmIDB4ZmZmKQotI2RlZmluZSBnZXRfdmxhbl9wcmlvcml0eShwdmxhbikJCQlcCi0JKChudG9ocygodW5zaWduZWQgc2hvcnQpcHZsYW4tPmhfdmxhbl9UQ0kpKT4+MTMpCi0jZGVmaW5lIGdldF92bGFuX2VuY2FwX3Byb3RvKHB2bGFuKQkJCVwKLQkgKG50b2hzKCh1bnNpZ25lZCBzaG9ydClwdmxhbi0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bykpCi0KLSNlbmRpZgkvKiBfTElOVVhfSUZfRVRIRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2lvY3RsX2NmZzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaW9jdGxfY2ZnODAyMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3ZTlhNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaW9jdGxfY2ZnODAyMTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19JT0NUTF9DRkc4MDIxMV9IX18KLSNkZWZpbmUgX19JT0NUTF9DRkc4MDIxMV9IX18KLQotc3RydWN0IHJ0d193ZGV2X2ludml0X2luZm8gewotCXU4IHRva2VuOwotCXU4IGZsYWdzOwotCXU4IHN0YXR1czsKLQl1OCByZXFfb3BfY2g7Ci0JdTggcnNwX29wX2NoOwotfTsKLQotI2RlZmluZSBydHdfd2Rldl9pbnZpdF9pbmZvX2luaXQoaW52aXRfaW5mbykgXAotCWRvIHsgXAotCQkoaW52aXRfaW5mbyktPnRva2VuID0gMDsgXAotCQkoaW52aXRfaW5mbyktPmZsYWdzID0gMHgwMDsgXAotCQkoaW52aXRfaW5mbyktPnN0YXR1cyA9IDB4ZmY7IFwKLQkJKGludml0X2luZm8pLT5yZXFfb3BfY2ggPSAwOyBcCi0JCShpbnZpdF9pbmZvKS0+cnNwX29wX2NoID0gMDsgXAotCX0gd2hpbGUgKDApCi0KLXN0cnVjdCBydHdfd2Rldl9wcml2IHsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpydHdfd2RldjsKLQotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcjsKLQotCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnNjYW5fcmVxdWVzdDsKLQlzcGlubG9ja190IHNjYW5fcmVxX2xvY2s7Ci0KLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG1vbl9uZGV2Oy8qIGZvciBtb25pdG9yIGludGVyZmFjZSAqLwotCWNoYXIgaWZuYW1lX21vbltJRk5BTVNJWiArIDFdOyAvKiBuYW1lIG9mIG1vbml0b3IgaW50ZXJmYWNlICovCi0KLQl1OCBwMnBfZW5hYmxlZDsKLQotCXU4IHByb3ZkaXNjX3JlcV9pc3N1ZWQ7Ci0KLQlzdHJ1Y3QgcnR3X3dkZXZfaW52aXRfaW5mbyBpbnZpdF9pbmZvOwotCi0JdTggYmFuZHJvaWRfc2NhbjsKLQlib29sIGJsb2NrOwotCWJvb2wgcG93ZXJfbWdtdDsKLX07Ci0KLSNkZWZpbmUgd2Rldl90b19wcml2KHcpICgoc3RydWN0IHJ0d193ZGV2X3ByaXYgKikod2Rldl9wcml2KHcpKSkKLQotI2RlZmluZSB3aXBoeV90b193ZGV2KHgpCQkJCVwKLSgoc3RydWN0IHdpcmVsZXNzX2RldiAqKSgoKHN0cnVjdCBydHdfd2Rldl9wcml2ICopd2lwaHlfcHJpdih4KSktPnJ0d193ZGV2KSkKLQotaW50IHJ0d193ZGV2X2FsbG9jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgcnR3X3dkZXZfZnJlZShzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKLXZvaWQgcnR3X3dkZXZfdW5yZWdpc3RlcihzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKLQotdm9pZCBydHdfY2ZnODAyMTFfaW5pdF93aXBoeShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19jZmc4MDIxMV9zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX2Nvbm5lY3Qoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX2Rpc2Nvbm5lY3Qoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX3NjYW5fZG9uZShzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqcHdkZXZfcHJpdiwKLQkJCQkgICAgIGJvb2wgYWJvcnRlZCk7Ci0KLSNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfYXNzb2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgdTggKnBtZ210X2ZyYW1lLCB1aW50IGZyYW1lX2xlbik7Ci12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfZGlzYXNzb2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQl1bnNpZ25lZCBjaGFyICpkYSwKLQkJCQkJdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKLSNlbmRpZiAvKiBDT05GSUdfODhFVV9BUF9NT0RFICovCi0KLXZvaWQgcnR3X2NmZzgwMjExX2lzc3VlX3AycF9wcm92aXNpb25fcmVxdWVzdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCSAgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOwotdm9pZCBydHdfY2ZnODAyMTFfcnhfcDJwX2FjdGlvbl9wdWJsaWMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICB1OCAqcG1nbXRfZnJhbWUsIHVpbnQgZnJhbWVfbGVuKTsKLXZvaWQgcnR3X2NmZzgwMjExX3J4X2FjdGlvbl9wMnAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcG1nbXRfZnJhbWUsCi0JCQkJdWludCBmcmFtZV9sZW4pOwotdm9pZCBydHdfY2ZnODAyMTFfcnhfYWN0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqZnJhbWUsCi0JCQkgICAgdWludCBmcmFtZV9sZW4sIGNvbnN0IGNoYXIgKm1zZyk7Ci0KLWludCBydHdfY2ZnODAyMTFfc2V0X21nbnRfd3BzcDJwaWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwKLQkJCQkgICBjaGFyICpidWYsIGludCBsZW4sIGludCB0eXBlKTsKLQotYm9vbCBydHdfY2ZnODAyMTFfcHdyX21nbXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotCi0jZGVmaW5lIHJ0d19jZmc4MDIxMV9yeF9tZ210KGRldiwgZnJlcSwgc2lnX2RibSwgYnVmLCBsZW4sIGdmcCkJCVwKLQljZmc4MDIxMV9yeF9tZ210KGRldiwgZnJlcSwgc2lnX2RibSwgYnVmLCBsZW4sIGdmcCkKLSNkZWZpbmUgcnR3X2NmZzgwMjExX3NlbmRfcnhfYXNzb2MoZGV2LCBic3MsIGJ1ZiwgbGVuKQkJCVwKLQljZmc4MDIxMV9zZW5kX3J4X2Fzc29jKGRldiwgYnNzLCBidWYsIGxlbikKLQotI2VuZGlmIC8qIF9fSU9DVExfQ0ZHODAyMTFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmRhYzZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfTElOVVhfSVBfSAotI2RlZmluZSBfTElOVVhfSVBfSAotCi0vKiBTT0xfSVAgc29ja2V0IG9wdGlvbnMgKi8KLQotI2RlZmluZSBJUFRPU19UT1NfTUFTSwkJMHgxRQotI2RlZmluZSBJUFRPU19UT1ModG9zKQkJKCh0b3MpJklQVE9TX1RPU19NQVNLKQotI2RlZmluZQlJUFRPU19MT1dERUxBWQkJMHgxMAotI2RlZmluZQlJUFRPU19USFJPVUdIUFVUCTB4MDgKLSNkZWZpbmUJSVBUT1NfUkVMSUFCSUxJVFkJMHgwNAotI2RlZmluZQlJUFRPU19NSU5DT1NUCQkweDAyCi0KLSNkZWZpbmUgSVBUT1NfUFJFQ19NQVNLCQkweEUwCi0jZGVmaW5lIElQVE9TX1BSRUModG9zKQkJKCh0b3MpJklQVE9TX1BSRUNfTUFTSykKLSNkZWZpbmUgSVBUT1NfUFJFQ19ORVRDT05UUk9MICAgICAgICAgICAweGUwCi0jZGVmaW5lIElQVE9TX1BSRUNfSU5URVJORVRDT05UUk9MICAgICAgMHhjMAotI2RlZmluZSBJUFRPU19QUkVDX0NSSVRJQ19FQ1AgICAgICAgICAgIDB4YTAKLSNkZWZpbmUgSVBUT1NfUFJFQ19GTEFTSE9WRVJSSURFICAgICAgICAweDgwCi0jZGVmaW5lIElQVE9TX1BSRUNfRkxBU0ggICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBJUFRPU19QUkVDX0lNTUVESUFURSAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgSVBUT1NfUFJFQ19QUklPUklUWSAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIElQVE9TX1BSRUNfUk9VVElORSAgICAgICAgICAgICAgMHgwMAotCi0KLS8qIElQIG9wdGlvbnMgKi8KLSNkZWZpbmUgSVBPUFRfQ09QWQkJMHg4MAotI2RlZmluZSBJUE9QVF9DTEFTU19NQVNLCTB4NjAKLSNkZWZpbmUgSVBPUFRfTlVNQkVSX01BU0sJMHgxZgotCi0jZGVmaW5lCUlQT1BUX0NPUElFRChvKQkJKChvKSZJUE9QVF9DT1BZKQotI2RlZmluZQlJUE9QVF9DTEFTUyhvKQkJKChvKSZJUE9QVF9DTEFTU19NQVNLKQotI2RlZmluZQlJUE9QVF9OVU1CRVIobykJCSgobykmSVBPUFRfTlVNQkVSX01BU0spCi0KLSNkZWZpbmUJSVBPUFRfQ09OVFJPTAkJMHgwMAotI2RlZmluZQlJUE9QVF9SRVNFUlZFRDEJCTB4MjAKLSNkZWZpbmUJSVBPUFRfTUVBU1VSRU1FTlQJMHg0MAotI2RlZmluZQlJUE9QVF9SRVNFUlZFRDIJCTB4NjAKLQotI2RlZmluZSBJUE9QVF9FTkQJKDAgfCBJUE9QVF9DT05UUk9MKQotI2RlZmluZSBJUE9QVF9OT09QCSgxIHwgSVBPUFRfQ09OVFJPTCkKLSNkZWZpbmUgSVBPUFRfU0VDCSgyIHwgSVBPUFRfQ09OVFJPTCB8IElQT1BUX0NPUFkpCi0jZGVmaW5lIElQT1BUX0xTUlIJKDMgfCBJUE9QVF9DT05UUk9MIHwgSVBPUFRfQ09QWSkKLSNkZWZpbmUgSVBPUFRfVElNRVNUQU1QCSg0IHwgSVBPUFRfTUVBU1VSRU1FTlQpCi0jZGVmaW5lIElQT1BUX1JSCSg3IHwgSVBPUFRfQ09OVFJPTCkKLSNkZWZpbmUgSVBPUFRfU0lECSg4IHwgSVBPUFRfQ09OVFJPTCB8IElQT1BUX0NPUFkpCi0jZGVmaW5lIElQT1BUX1NTUlIJKDkgfCBJUE9QVF9DT05UUk9MIHwgSVBPUFRfQ09QWSkKLSNkZWZpbmUgSVBPUFRfUkEJKDIwIHwgSVBPUFRfQ09OVFJPTCB8IElQT1BUX0NPUFkpCi0KLSNkZWZpbmUgSVBWRVJTSU9OCTQKLSNkZWZpbmUgTUFYVFRMCQkyNTUKLSNkZWZpbmUgSVBERUZUVEwJNjQKLSNkZWZpbmUgSVBPUFRfT1BUVkFMIDAKLSNkZWZpbmUgSVBPUFRfT0xFTiAgIDEKLSNkZWZpbmUgSVBPUFRfT0ZGU0VUIDIKLSNkZWZpbmUgSVBPUFRfTUlOT0ZGIDQKLSNkZWZpbmUgTUFYX0lQT1BUTEVOIDQwCi0jZGVmaW5lIElQT1BUX05PUCBJUE9QVF9OT09QCi0jZGVmaW5lIElQT1BUX0VPTCBJUE9QVF9FTkQKLSNkZWZpbmUgSVBPUFRfVFMgIElQT1BUX1RJTUVTVEFNUAotCi0jZGVmaW5lCUlQT1BUX1RTX1RTT05MWQkJMAkvKiB0aW1lc3RhbXBzIG9ubHkgKi8KLSNkZWZpbmUJSVBPUFRfVFNfVFNBTkRBRERSCTEJLyogdGltZXN0YW1wcyBhbmQgYWRkcmVzc2VzICovCi0jZGVmaW5lCUlQT1BUX1RTX1BSRVNQRUMJMwkvKiBzcGVjaWZpZWQgbW9kdWxlcyBvbmx5ICovCi0KLXN0cnVjdCBpcF9vcHRpb25zIHsKLQlfX3UzMgkJZmFkZHI7CQkJLyogU2F2ZWQgZmlyc3QgaG9wIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyCW9wdGxlbjsKLQl1bnNpZ25lZCBjaGFyIHNycjsKLQl1bnNpZ25lZCBjaGFyIHJyOwotCXVuc2lnbmVkIGNoYXIgdHM7Ci0JdW5zaWduZWQgY2hhcglpc19zZXRieXVzZXI6MSwJLyogU2V0IGJ5IHNldHNvY2tvcHQ/CQkqLwotCQkJaXNfZGF0YToxLAkvKiBPcHRpb25zIGluIF9fZGF0YSwgcmF0aGVyIHRoYW4gc2tiKi8KLQkJCWlzX3N0cmljdHJvdXRlOjEsLyogU3RyaWN0IHNvdXJjZSByb3V0ZQkJKi8KLQkJCXNycl9pc19oaXQ6MSwJLyogUGFja2V0IGRlc3RuIGFkZHIgd2FzIG91cnMgKi8KLQkJCWlzX2NoYW5nZWQ6MSwJLyogSVAgY2hlY2tzdW0gbW9yZSBub3QgdmFsaWQJKi8KLQkJCXJyX25lZWRhZGRyOjEsCS8qIE5lZWQgdG8gcmVjb3JkIGFkZHIgb2Ygb3V0IGRldiovCi0JCQl0c19uZWVkdGltZToxLAkvKiBOZWVkIHRvIHJlY29yZCB0aW1lc3RhbXAJKi8KLQkJCXRzX25lZWRhZGRyOjE7CS8qIE5lZWQgdG8gcmVjb3JkIGFkZHIgb2Ygb3V0IGRldiAgKi8KLQl1bnNpZ25lZCBjaGFyIHJvdXRlcl9hbGVydDsKLQl1bnNpZ25lZCBjaGFyIF9fcGFkMTsKLQl1bnNpZ25lZCBjaGFyIF9fcGFkMjsKLQl1bnNpZ25lZCBjaGFyIF9fZGF0YVswXTsKLX07Ci0KLSNkZWZpbmUgb3B0bGVuZ3RoKG9wdCkgKHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykgKyBvcHQtPm9wdGxlbikKLQotc3RydWN0IGlwaGRyIHsKLSNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLQlfX3U4CWlobDo0LAotCQl2ZXJzaW9uOjQ7Ci0jZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLQlfX3U4CXZlcnNpb246NCwKLQkJaWhsOjQ7Ci0jZW5kaWYKLQlfX3U4CXRvczsKLQlfX3UxNgl0b3RfbGVuOwotCV9fdTE2CWlkOwotCV9fdTE2CWZyYWdfb2ZmOwotCV9fdTgJdHRsOwotCV9fdTgJcHJvdG9jb2w7Ci0JX191MTYJY2hlY2s7Ci0JX191MzIJc2FkZHI7Ci0JX191MzIJZGFkZHI7Ci0JLypUaGUgb3B0aW9ucyBzdGFydCBoZXJlLiAqLwotfTsKLQotI2VuZGlmCS8qIF9MSU5VWF9JUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvbmljX3NwZWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9uaWNfc3BlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIyNDQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9uaWNfc3BlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX05JQ19TUEVDX0hfXwotI2RlZmluZSBfX05JQ19TUEVDX0hfXwotCi0jZGVmaW5lIFJUTDg3MTFfTUNUUkxfCQkoMHgyMDAwMCkKLSNkZWZpbmUgUlRMODcxMV9VQVJUXwkJKDB4MzAwMDApCi0jZGVmaW5lIFJUTDg3MTFfVElNRVJfCQkoMHg0MDAwMCkKLSNkZWZpbmUgUlRMODcxMV9GSU5UXwkJKDB4NTAwMDApCi0jZGVmaW5lIFJUTDg3MTFfSElOVF8JCSgweDUwMDAwKQotI2RlZmluZSBSVEw4NzExX0dQSU9fCQkoMHg2MDAwMCkKLSNkZWZpbmUgUlRMODcxMV9XTEFOQ1RSTF8JKDB4MjAwMDAwKQotI2RlZmluZSBSVEw4NzExX1dMQU5GRl8JCSgweGUwMDAwMCkKLSNkZWZpbmUgUlRMODcxMV9IQ0lDVFJMXwkoMHg2MDAwMDApCi0jZGVmaW5lIFJUTDg3MTFfU1lTQ0ZHXwkJKDB4NjIwMDAwKQotI2RlZmluZSBSVEw4NzExX1NZU0NUUkxfCSgweDYyMDAwMCkKLSNkZWZpbmUgUlRMODcxMV9NQ0NUUkxfCQkoMHgwMjAwMDApCi0KLQotI2luY2x1ZGUgPHJ0bDg3MTFfcmVnZGVmLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzExX2JpdGRlZi5oPgotCi0KLSNlbmRpZiAvKiAgX19SVEw4NzExX1NQRUNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaAppbmRleCBhNTBlYWUzLi41NDhhMzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmgKQEAgLTc3LDMyICs3Nyw5IEBACiAKIC8qICA9PT09PT09PT09PSBFWHRlcm4gRnVuY3Rpb24gUHJvdG90eXBlICovCiAKLXU4IE9ETV9SZWFkMUJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKTsKLQotdTE2IE9ETV9SZWFkMkJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKTsKLQotdTMyIE9ETV9SZWFkNEJ5dGUoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKTsKLQotdm9pZCBPRE1fV3JpdGUxQnl0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHU4IERhdGEpOwotCi12b2lkIE9ETV9Xcml0ZTJCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTE2IERhdGEpOwotCi12b2lkIE9ETV9Xcml0ZTRCeXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTMyIERhdGEpOwotCiAvKiAgTWVtb3J5IFJlbGF0aXZlIEZ1bmN0aW9uLiAqLwotdm9pZCBPRE1fQWxsb2NhdGVNZW1vcnkoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHZvaWQgKipwUHRyLCB1MzIgbGVuZ3RoKTsKLXZvaWQgT0RNX0ZyZWVNZW1vcnkoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHZvaWQgKnBQdHIsIHUzMiBsZW5ndGgpOwotCi1zMzIgT0RNX0NvbXBhcmVNZW1vcnkoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHZvaWQgKnBCdWYxLCB2b2lkICpwQnVmMiwKLQkJICAgICAgdTMyIGxlbmd0aCk7CiAKIC8qICBPRE0gVGltZXIgcmVsYXRpdmUgQVBJLiAqLwotdm9pZCBPRE1fU2V0VGltZXIoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHN0cnVjdCB0aW1lcl9saXN0ICpwVGltZXIsCi0JCSAgdTMyIG1zRGVsYXkpOwotCi12b2lkIE9ETV9Jbml0aWFsaXplVGltZXIoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sCi0JCQkgc3RydWN0IHRpbWVyX2xpc3QgKnBUaW1lciwgdm9pZCAqQ2FsbEJhY2tGdW5jLAotCQkJIHZvaWQgKnBDb250ZXh0LCBjb25zdCBjaGFyICpzeklEKTsKIAogdm9pZCBPRE1fQ2FuY2VsVGltZXIoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIHN0cnVjdCB0aW1lcl9saXN0ICpwVGltZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaAppbmRleCA3OTU2ZjBjLi41ODg5ZjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKQEAgLTYyLDIwICs2MiwxMSBAQAogCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqZ2V0X25leHQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKLXsKLQlyZXR1cm4gbGlzdC0+bmV4dDsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpnZXRfbGlzdF9oZWFkKHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSkKIHsKIAlyZXR1cm4gJihxdWV1ZS0+cXVldWUpOwogfQogCi0KLSNkZWZpbmUgTElTVF9DT05UQUlOT1IocHRyLCB0eXBlLCBtZW1iZXIpIFwKLQkoKHR5cGUgKikoKGNoYXIgKikocHRyKS0oc2l6ZV90KSgmKCh0eXBlICopMCktPm1lbWJlcikpKQotCiBzdGF0aWMgaW5saW5lIGludCBfZW50ZXJfY3JpdGljYWxfbXV0ZXgoc3RydWN0IG11dGV4ICpwbXV0ZXgsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKnBpcnFMKQogewpAQCAtODUsMTMgKzc2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfZXhpdF9jcml0aWNhbF9tdXRleChzdHJ1Y3QgbXV0ZXggKnBtdXRleCwKLQkJCQkJdW5zaWduZWQgbG9uZyAqcGlycUwpCi17Ci0JCW11dGV4X3VubG9jayhwbXV0ZXgpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcnR3X2xpc3RfZGVsZXRlKHN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0KQogewogCWxpc3RfZGVsX2luaXQocGxpc3QpOwpAQCAtMTIyLDE3ICsxMDYsNiBAQAogI2RlZmluZSBSVFdfREVDTEFSRV9USU1FUl9IREwobmFtZSkgXAogCXZvaWQgUlRXX1RJTUVSX0hETF9OQU1FKG5hbWUpKFJUV19USU1FUl9IRExfQVJHUykKIAotc3RhdGljIGlubGluZSB2b2lkIF9pbml0X3dvcmtpdGVtKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHdvcmssIHZvaWQgKnBmdW5jLAotCQkJCSAgdm9pZCAqY250eCkKLXsKLQlJTklUX1dPUksocHdvcmssIHBmdW5jKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9zZXRfd29ya2l0ZW0oc3RydWN0IHdvcmtfc3RydWN0ICpwd29yaykKLXsKLQlzY2hlZHVsZV93b3JrKHB3b3JrKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIF9jYW5jZWxfd29ya2l0ZW1fc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnB3b3JrKQogewogCWNhbmNlbF93b3JrX3N5bmMocHdvcmspOwpAQCAtMjMwLDE1ICsyMDMsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgUlNOX1RLSVBfQ0lQSEVSWzRdOwogCiAjZGVmaW5lIHJ0d191cGRhdGVfbWVtX3N0YXQoZmxhZywgc3opIGRvIHt9IHdoaWxlICgwKQotdTggKl9ydHdfdm1hbGxvYyh1MzIgc3opOwotdTggKl9ydHdfenZtYWxsb2ModTMyIHN6KTsKLXZvaWQgX3J0d192bWZyZWUodTggKnBidWYsIHUzMiBzeik7CiB1OCAqX3J0d196bWFsbG9jKHUzMiBzeik7CiB1OCAqX3J0d19tYWxsb2ModTMyIHN6KTsKIHZvaWQgX3J0d19tZnJlZSh1OCAqcGJ1ZiwgdTMyIHN6KTsKLSNkZWZpbmUgcnR3X3ZtYWxsb2Moc3opCQkJX3J0d192bWFsbG9jKChzeikpCi0jZGVmaW5lIHJ0d196dm1hbGxvYyhzeikJCQlfcnR3X3p2bWFsbG9jKChzeikpCi0jZGVmaW5lIHJ0d192bWZyZWUocGJ1Ziwgc3opCQlfcnR3X3ZtZnJlZSgocGJ1ZiksIChzeikpCiAjZGVmaW5lIHJ0d19tYWxsb2Moc3opCQkJX3J0d19tYWxsb2MoKHN6KSkKICNkZWZpbmUgcnR3X3ptYWxsb2Moc3opCQkJX3J0d196bWFsbG9jKChzeikpCiAjZGVmaW5lIHJ0d19tZnJlZShwYnVmLCBzeikJCV9ydHdfbWZyZWUoKHBidWYpLCAoc3opKQpAQCAtMjQ3LDcgKzIxNCw2IEBACiB2b2lkIHJ0d19tZnJlZTJkKHZvaWQgKnBidWYsIGludCBoLCBpbnQgdywgaW50IHNpemUpOwogCiB2b2lkIF9ydHdfbWVtY3B5KHZvaWQgKmRlYywgdm9pZCAqc291ciwgdTMyIHN6KTsKLWludCAgX3J0d19tZW1jbXAodm9pZCAqZHN0LCB2b2lkICpzcmMsIHUzMiBzeik7CiB2b2lkIF9ydHdfbWVtc2V0KHZvaWQgKnBidWYsIGludCBjLCB1MzIgc3opOwogCiB2b2lkIF9ydHdfaW5pdF9saXN0aGVhZChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9yZWN2X29zZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCmluZGV4IDY5MTIzODAuLmQ3NmNjMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaApAQCAtMjgsMTggKzI4LDIwIEBACiB2b2lkIF9ydHdfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KTsKIAogCi1zMzIgIHJ0d19yZWN2X2VudHJ5KHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLWludCBydHdfcmVjdl9pbmRpY2F0ZXBrdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcmVjdl9mcmFtZSk7CitzMzIgIHJ0d19yZWN2X2VudHJ5KHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CitpbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZfZnJhbWUpOwogdm9pZCBydHdfcmVjdl9yZXR1cm5wYWNrZXQoc3RydWN0ICBuZXRfZGV2aWNlICpjbnh0LCBzdHJ1Y3Qgc2tfYnVmZiAqcmV0cGt0KTsKIAotdm9pZCBydHdfaG9zdGFwZF9tbG1lX3J4KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcmVjdl9mcik7Cit2b2lkIHJ0d19ob3N0YXBkX21sbWVfcngoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdl9mcik7CiB2b2lkIHJ0d19oYW5kbGVfdGtpcF9taWNfZXJyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggYmdyb3VwKTsKIAogaW50IHJ0d19pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsIHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHJ0d19mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpOwogCiBpbnQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfaW5pdChzdHJ1Y3QgcmVjdl9wcml2ICpyZWN2cHIsIHN0cnVjdCBhZGFwdGVyICphZGFwdCk7Ci1pbnQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfYWxsb2Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1bmlvbiByZWN2X2ZyYW1lICpyZWN2ZnIpOworaW50IHJ0d19vc19yZWN2X3Jlc291cmNlX2FsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwdCwKKwkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyKTsKIHZvaWQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfZnJlZShzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpOwogCiBpbnQgcnR3X29zX3JlY3ZidWZfcmVzb3VyY2VfYWxsb2Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgcmVjdl9idWYgKmJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfaGFsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfaGFsLmgKaW5kZXggMTYxZjFlNS4uNzVlNDFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaApAQCAtNzYsMTcgKzc2LDYgQEAKIAkobGUxNl90b19jcHUoX3BGd0hkci0+U2lnbmF0dXJlKSYweEZGRjApID09IDB4MjMwMCB8fAlcCiAJKGxlMTZfdG9fY3B1KF9wRndIZHItPlNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDg4RTApCiAKLWVudW0gZmlybXdhcmVfc291cmNlIHsKLQlGV19TT1VSQ0VfSU1HX0ZJTEUgPSAwLAotCUZXX1NPVVJDRV9IRUFERVJfRklMRSA9IDEsCQkvKiBmcm9tIGhlYWRlciBmaWxlICovCi19OwotCi1zdHJ1Y3QgcnRfZmlybXdhcmUgewotCWVudW0gZmlybXdhcmVfc291cmNlCWVGV1NvdXJjZTsKLQl1OAkJCSpzekZ3QnVmZmVyOwotCXUzMgkJCXVsRndMZW5ndGg7Ci19OwotCiAvKiAgVGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBjYXJlZnVsIHdpdGggYnl0ZS1vcmRlcmluZyAqLwogCiBzdHJ1Y3QgcnRfZmlybXdhcmVfaGRyIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfcmVjdi5oCmluZGV4IGE4ZmFjZjAuLjA3ZTVmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaApAQCAtNjEsOSArNjEsMTAgQEAKIHZvaWQgcnRsODE4OGV1X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHJ0bDgxODhldV9yZWN2X2hkbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWYpOwogdm9pZCBydGw4MTg4ZXVfcmVjdl90YXNrbGV0KHZvaWQgKnByaXYpOwotdm9pZCBydGw4MTg4ZV9xdWVyeV9yeF9waHlfc3RhdHVzKHVuaW9uIHJlY3ZfZnJhbWUgKmZyLCBzdHJ1Y3QgcGh5X3N0YXQgKnBoeSk7Cit2b2lkIHJ0bDgxODhlX3F1ZXJ5X3J4X3BoeV9zdGF0dXMoc3RydWN0IHJlY3ZfZnJhbWUgKmZyLCBzdHJ1Y3QgcGh5X3N0YXQgKnBoeSk7CiB2b2lkIHJ0bDgxODhlX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwcmZyYW1lKTsKLXZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvXzg4ZSh1bmlvbiByZWN2X2ZyYW1lICpmcmEsIHN0cnVjdCBwaHlfc3RhdCAqcGh5KTsKLXZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWJfODhlKHVuaW9uIHJlY3ZfZnJhbWUgKmZyYSwgc3RydWN0IHJlY3Zfc3RhdCAqc3RhdCk7Cit2b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mb184OGUoc3RydWN0IHJlY3ZfZnJhbWUgKmZyYSwgc3RydWN0IHBoeV9zdGF0ICpwaHkpOwordm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYl84OGUoc3RydWN0IHJlY3ZfZnJhbWUgKmZyYSwKKwkJCQkgc3RydWN0IHJlY3Zfc3RhdCAqc3RhdCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oCmluZGV4IGM2YjE5M2EuLmFlMDUxNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmgKQEAgLTk5LDIwICs5OSw2IEBACiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgX2Z1bmNfZW50ZXJfCQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmIChHbG9iYWxEZWJ1Z0xldmVsID49IF9kcnZfZGVidWdfKQkJCVwKLQkJCXByX2luZm8oIiVzIDogJXMgZW50ZXJzIGF0ICVkXG4iLAkJXAotCQkJCSBEUklWRVJfUFJFRklYLCBfX2Z1bmNfXywgX19MSU5FX18pOwlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfZnVuY19leGl0XwkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoR2xvYmFsRGVidWdMZXZlbCA+PSBfZHJ2X2RlYnVnXykJCQlcCi0JCQlwcl9pbmZvKCIlcyA6ICVzIGV4aXRzIGF0ICVkXG4iLAkJXAotCQkJCSBEUklWRVJfUFJFRklYLCBfX2Z1bmNfXywgX19MSU5FX18pOwlcCi0JfSB3aGlsZSAoMCkKLQogI2RlZmluZSBSVF9QUklOVF9EQVRBKF9jb21wLCBfbGV2ZWwsIF90aXRsZXN0cmluZywgX2hleGRhdGEsIF9oZXhkYXRhbGVuKVwKIAlkbyB7CQkJCQkJCQlcCiAJCWlmIChfbGV2ZWwgPD0gR2xvYmFsRGVidWdMZXZlbCkgewkJCVwKQEAgLTI3NywxNCArMjYzLDQgQEAKIGludCBwcm9jX3NldF9yc3NpX2Rpc3Aoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKIAotI2lmZGVmIENPTkZJR19CVF9DT0VYSVNUCi1pbnQgcHJvY19nZXRfYnRjb2V4X2RiZyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQlvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCWludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2Nfc2V0X2J0Y29leF9kYmcoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKLQkJCXNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKLQotI2VuZGlmIC8qIENPTkZJR19CVF9DT0VYSVNUICovCi0KICNlbmRpZgkvKiBfX1JUV19ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW8uaAppbmRleCAzZDFkZmNjLi5lODc5MGY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW8uaApAQCAtOTksNyArOTksNiBAQAogCiBzdHJ1Y3QgaW50Zl9wcml2Owogc3RydWN0IGludGZfaGRsOwotc3RydWN0IGlvX3F1ZXVlOwogCiBzdHJ1Y3QgX2lvX29wcyB7CiAJdTggKCpfcmVhZDgpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyKTsKQEAgLTExNyw3ICsxMTYsNiBAQAogCQkJICB1OCAqcG1lbSk7CiAJdm9pZCAoKl93cml0ZV9tZW0pKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgY250LAogCQkJICAgdTggKnBtZW0pOwotCXZvaWQgKCpfc3luY19pcnBfcHJvdG9jb2xfcncpKHN0cnVjdCBpb19xdWV1ZSAqcGlvX3EpOwogCXUzMiAoKl9yZWFkX2ludGVycnVwdCkoc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIpOwogCXUzMiAoKl9yZWFkX3BvcnQpKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwsIHUzMiBhZGRyLCB1MzIgY250LAogCQkJICB1OCAqcG1lbSk7CkBAIC0yMzcsMzQgKzIzNSwxMSBAQAogQmVsb3cgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgYnkgX2lvX2hhbmRsZXIKICovCiAKLXN0cnVjdCBpb19xdWV1ZSB7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9pb3JlcXM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOwkvKiBUaGUgaW9fcmVxIGxpc3QgdGhhdCB3aWxsIGJlIHNlcnZlZAotCQkJCQkgKiBpbiB0aGUgc2luZ2xlIHByb3RvY29sIHJlYWQvd3JpdGUuKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHByb2Nlc3Npbmc7Ci0JdTgJKmZyZWVfaW9yZXFzX2J1ZjsgLyogIDQtYnl0ZSBhbGlnbmVkICovCi0JdTgJKnBhbGxvY2F0ZWRfZnJlZV9pb3JlcXNfYnVmOwotCXN0cnVjdAlpbnRmX2hkbAlpbnRmOwotfTsKLQogc3RydWN0IGlvX3ByaXYgewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcjsKIAlzdHJ1Y3QgaW50Zl9oZGwgaW50ZjsKIH07CiAKLXVpbnQgaW9yZXFfZmx1c2goc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpb19xdWV1ZSAqaW9xdWV1ZSk7Ci12b2lkIHN5bmNfaW9yZXFfZW5xdWV1ZShzdHJ1Y3QgaW9fcmVxICpwcmVxLCBzdHJ1Y3QgaW9fcXVldWUgKmlvcXVldWUpOwotdWludCBzeW5jX2lvcmVxX2ZsdXNoKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgaW9fcXVldWUgKmlvcXVldWUpOwotdWludCBmcmVlX2lvcmVxKHN0cnVjdCBpb19yZXEgKnByZXEsIHN0cnVjdCBpb19xdWV1ZSAqcGlvX3F1ZXVlKTsKLXN0cnVjdCBpb19yZXEgKmFsbG9jX2lvcmVxKHN0cnVjdCBpb19xdWV1ZSAqcGlvX3EpOwotCi11aW50IHJlZ2lzdGVyX2ludGZfaGRsKHU4ICpkZXYsIHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwpOwotdm9pZCB1bnJlZ2lzdGVyX2ludGZfaGRsKHN0cnVjdCBpbnRmX2hkbCAqcGludGZoZGwpOwotCi12b2lkIF9ydHdfYXR0cmliX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcG1lbSk7Ci12b2lkIF9ydHdfYXR0cmliX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKnBtZW0pOwotCiB1OCBfcnR3X3JlYWQ4KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkcik7CiB1MTYgX3J0d19yZWFkMTYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyKTsKIHUzMiBfcnR3X3JlYWQzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIpOwpAQCAtMzYzLDI1ICszMzgsNiBAQAogaW50IHJ0d19pbml0X2lvX3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAogCQkgICAgIHZvaWQgKCpzZXRfaW50Zl9vcHMpKHN0cnVjdCBfaW9fb3BzICpwb3BzKSk7CiAKLXVpbnQgYWxsb2NfaW9fcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBmcmVlX2lvX3F1ZXVlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgYXN5bmNfYnVzX2lvKHN0cnVjdCBpb19xdWV1ZSAqcGlvX3EpOwotdm9pZCBidXNfc3luY19pbyhzdHJ1Y3QgaW9fcXVldWUgKnBpb19xKTsKLXUzMiBfaW9yZXEycndtZW0oc3RydWN0IGlvX3F1ZXVlICpwaW9fcSk7CiB2b2lkIGRldl9wb3dlcl9kb3duKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCBicHdydXApOwogCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoX2EsIF9iLCBfYykJCVwKLQlydHdfd3JpdGU4KF9hLCBfYiwgX2MpCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1dyaXRlMkJ5dGUoX2EsIF9iLCBfYykJCVwKLQlydHdfd3JpdGUxNihfYSwgX2IsIF9jKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9Xcml0ZTRCeXRlKF9hLCBfYiwgX2MpCQlcCi0JcnR3X3dyaXRlMzIoX2EsIF9iLCBfYykKLQotI2RlZmluZSBQbGF0Zm9ybUVGSU9SZWFkMUJ5dGUoX2EsIF9iKQkJXAotCQlydHdfcmVhZDgoX2EsIF9iKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9SZWFkMkJ5dGUoX2EsIF9iKQkJXAotCQlydHdfcmVhZDE2KF9hLCBfYikKLSNkZWZpbmUgUGxhdGZvcm1FRklPUmVhZDRCeXRlKF9hLCBfYikJCVwKLQkJcnR3X3JlYWQzMihfYSwgX2IpCi0KICNlbmRpZgkvKiBfUlRMODcxMV9JT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oCmluZGV4IDg3NzJkMWQuLmYzYWE5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvY3RsLmgKQEAgLTEwMiw4ICsxMDIsNiBAQAogCiAjaWYgZGVmaW5lZChfUlRXX01QX0lPQ1RMX0NfKQogc3RhdGljIGludCBvaWRfbnVsbF9mdW5jdGlvbihzdHJ1Y3Qgb2lkX3Bhcl9wcml2ICpwb2lkX3Bhcl9wcml2KSB7Ci0JX2Z1bmNfZW50ZXJfOwotCV9mdW5jX2V4aXRfOwogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCmluZGV4IDZjZDk4OGYuLjQ1YzIyZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCkBAIC0xMDYsMTMgKzEwNiw2IEBACiAjZGVmaW5lIHRyYWZmaWNfdGhyZXNob2xkCTEwCiAjZGVmaW5lCXRyYWZmaWNfc2Nhbl9wZXJpb2QJNTAwCiAKLXN0cnVjdCBzaXRlc3VydmV5X2N0cmwgewotCXU2NAlsYXN0X3R4X3BrdHM7Ci0JdWludAlsYXN0X3J4X3BrdHM7Ci0JaW50CXRyYWZmaWNfYnVzeTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBzaXRlc3VydmV5X2N0cmxfdGltZXI7Ci19OwotCiBzdHJ1Y3QgcnRfbGlua19kZXRlY3QgewogCXUzMglOdW1UeE9rSW5QZXJpb2Q7CiAJdTMyCU51bVJ4T2tJblBlcmlvZDsKQEAgLTMwNCwzMSArMjk3LDYgQEAKIAl1MzIgbm9hX3N0YXJ0X3RpbWVbUDJQX01BWF9OT0FfTlVNXTsKIH07CiAKLXN0cnVjdCB0ZGxzX3NzX3JlY29yZCB7CS8qIHNpZ25hbCBzdHJlbmd0aCByZWNvcmQgKi8KLQl1OCBtYWNhZGRyW0VUSF9BTEVOXTsKLQl1OCBSeFBXREJBbGw7Ci0JdTggaXNfdGRsc19zdGE7CS8qICB0cnVlOiBkaXJlY3QgbGluayBzdGEsIGZhbHNlOiBlbHNlICovCi19OwotCi1zdHJ1Y3QgdGRsc19pbmZvIHsKLQl1OCBhcF9wcm9oaWJpdGVkOwotCXVpbnQgc2V0dXBfc3RhdGU7Ci0JdTggc3RhX2NudDsKLQl1OCBzdGFfbWF4aW11bTsJLyogIDE6dGRscyBzdGEgaXMgZXF1YWwgKE5VTV9TVEEtMSksIHJlYWNoIG1heCBkaXJlY3QgbGluayBudW1iZXI7IDA6IGVsc2U7ICovCi0Jc3RydWN0IHRkbHNfc3NfcmVjb3JkCXNzX3JlY29yZDsKLQl1OCBtYWNpZF9pbmRleDsJLyogbWFjaWQgZW50cnkgdGhhdCBpcyByZWFkeSB0byB3cml0ZSAqLwotCXU4IGNsZWFyX2NhbTsJLyogY2FtIGVudHJ5IHRoYXQgaXMgdHJ5aW5nIHRvIGNsZWFyLCB1c2luZyBpdCBpbiBkaXJlY3QgbGluayB0ZWFyZG93biAqLwotCXU4IGNoX3NlbnNpbmc7Ci0JdTggY3VyX2NoYW5uZWw7Ci0JdTggY2FuZGlkYXRlX2NoOwotCXU4IGNvbGxlY3RfcGt0X251bVtNQVhfQ0hBTk5FTF9OVU1dOwotCXNwaW5sb2NrX3QgY21kX2xvY2s7Ci0Jc3BpbmxvY2tfdCBoZGxfbG9jazsKLQl1OCB3YXRjaGRvZ19jb3VudDsKLQl1OCBkZXZfZGlzY292ZXJlZDsJCS8qIFdGRF9URExTOiBmb3Igc2lnbWEgdGVzdCAqLwotCXU4IGVuYWJsZTsKLX07Ci0KIHN0cnVjdCBtbG1lX3ByaXYgewogCXNwaW5sb2NrX3QgbG9jazsKIAlpbnQgZndfc3RhdGU7CS8qIHNoYWxsIHdlIHByb3RlY3QgdGhpcyB2YXJpYWJsZT8gbWF5YmUgbm90IG5lY2Vzc2FyaWx5Li4uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKaW5kZXggZjBjOTgyZC4uMDllMmEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaApAQCAtMjM2LDEzICsyMzYsMTMgQEAKIHN0cnVjdCBtbG1lX2hhbmRsZXIgewogCXVuc2lnbmVkIGludCAgIG51bTsKIAljaGFyICpzdHI7Ci0JdW5zaWduZWQgaW50ICgqZnVuYykoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1bmlvbiByZWN2X2ZyYW1lICpmcmFtZSk7CisJdW5zaWduZWQgaW50ICgqZnVuYykoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgcmVjdl9mcmFtZSAqZnJhbWUpOwogfTsKIAogc3RydWN0IGFjdGlvbl9oYW5kbGVyIHsKIAl1bnNpZ25lZCBpbnQgICBudW07CiAJY2hhciAqc3RyOwotCXVuc2lnbmVkIGludCAoKmZ1bmMpKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdW5pb24gcmVjdl9mcmFtZSAqZnJhbWUpOworCXVuc2lnbmVkIGludCAoKmZ1bmMpKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHJlY3ZfZnJhbWUgKmZyYW1lKTsKIH07CiAKIHN0cnVjdAlzc19yZXMgewpAQCAtNDkwLDcgKzQ5MCw3IEBACiB2b2lkIGZsdXNoX2FsbF9jYW1fZW50cnkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIAogdm9pZCBzaXRlX3N1cnZleShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggY29sbGVjdF9ic3NfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAordTggY29sbGVjdF9ic3NfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKIAkJICAgIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpic3NpZCk7CiB2b2lkIHVwZGF0ZV9uZXR3b3JrKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMsCiAJCSAgICBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCB1cGRhdGVfaWUpOwpAQCAtNTQ0LDcgKzU0NCw4IEBACiB1bnNpZ25lZCBpbnQgc2hvdWxkX2ZvcmJpZF9uX3JhdGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIAogdm9pZCByZXBvcnRfam9pbl9yZXMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgcmVzKTsKLXZvaWQgcmVwb3J0X3N1cnZleV9ldmVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKK3ZvaWQgcmVwb3J0X3N1cnZleV9ldmVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHZvaWQgcmVwb3J0X3N1cnZleWRvbmVfZXZlbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgcmVwb3J0X2RlbF9zdGFfZXZlbnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAogCQkJICB1bnNpZ25lZCBjaGFyICphZGRyLCB1bnNpZ25lZCBzaG9ydCByZWFzb24pOwpAQCAtNjA5LDQ2ICs2MTAsNDYgQEAKIHZvaWQgc3RhcnRfY3JlYXRlX2lic3Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIAogdW5zaWduZWQgaW50IE9uQXNzb2NSZXEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFzc29jUnNwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25Qcm9iZVJlcShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uUHJvYmVSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBEb1Jlc2VydmVkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCXVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25CZWFjb24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BdGltKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25EaXNhc3NvYyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQXV0aENsaWVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkRlQXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFjdGlvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIAogdW5zaWduZWQgaW50IG9uX2FjdGlvbl9zcGN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFjdGlvbl9xb3Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BY3Rpb25fZGxzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQWN0aW9uX2JhY2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOworCQkJICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBvbl9hY3Rpb25fcHVibGljKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiB1bnNpZ25lZCBpbnQgT25BY3Rpb25faHQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogdW5zaWduZWQgaW50IE9uQWN0aW9uX3dtbShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKKwkJCSAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIHVuc2lnbmVkIGludCBPbkFjdGlvbl9wMnAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CisJCQkgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiAKIHZvaWQgbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgaW50IGpvaW5fcmVzKTsKIHZvaWQgbWxtZWV4dF9zdGFfZGVsX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oCmluZGV4IDRhMGU5ZmYuLjlhNDI4NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oCkBAIC0yMDYsMTAgKzIwNiw2IEBACiAKIAl1OAkJYkludGVybmFsQXV0b1N1c3BlbmQ7CiAJdTgJCWJJblN1c3BlbmQ7Ci0jaWZkZWYJQ09ORklHX0JUX0NPRVhJU1QKLQl1OAkJYkF1dG9SZXN1bWU7Ci0JdTgJCWF1dG9wbV9jbnQ7Ci0jZW5kaWYKIAl1OAkJYlN1cHBvcnRSZW1vdGVXYWtldXA7CiAJc3RydWN0IHRpbWVyX2xpc3QgcHdyX3N0YXRlX2NoZWNrX3RpbWVyOwogCWludAkJcHdyX3N0YXRlX2NoZWNrX2ludGVydmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaAppbmRleCBiZTljMzBjLi5iY2JjZTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaApAQCAtMjcwLDcgKzI3MCw3IEBACiAJbGVuID0gKHVuc2lnbmVkIGludCApKHRhaWwgLSBkYXRhKTsKIAogKi8KLXN0cnVjdCByZWN2X2ZyYW1lX2hkciB7CitzdHJ1Y3QgcmVjdl9mcmFtZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBza19idWZmCSAqcGt0OwogCXN0cnVjdCBza19idWZmCSAqcGt0X25ld2FsbG9jOwpAQCAtMjg5LDIzICsyODksMTYgQEAKIAlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7CiB9OwogCi11bmlvbiByZWN2X2ZyYW1lIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQkJc3RydWN0IHJlY3ZfZnJhbWVfaGRyIGhkcjsKLQkJdWludCBtZW1bUkVDVkZSQU1FX0hEUl9BTElHTj4+Ml07Ci0JfSB1OwotfTsKLQotdW5pb24gcmVjdl9mcmFtZSAqX3J0d19hbGxvY19yZWN2ZnJhbWUoc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwotdW5pb24gcmVjdl9mcmFtZSAqcnR3X2FsbG9jX3JlY3ZmcmFtZShzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSk7Ci12b2lkIHJ0d19pbml0X3JlY3ZmcmFtZSh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAorc3RydWN0IHJlY3ZfZnJhbWUgKl9ydHdfYWxsb2NfcmVjdmZyYW1lKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKTsKK3N0cnVjdCByZWN2X2ZyYW1lICpydHdfYWxsb2NfcmVjdmZyYW1lKHN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKTsKK3ZvaWQgcnR3X2luaXRfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAogCQkJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KTsKLWludCAgcnR3X2ZyZWVfcmVjdmZyYW1lKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCitpbnQgIHJ0d19mcmVlX3JlY3ZmcmFtZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKIAkJCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKTsKICNkZWZpbmUgcnR3X2RlcXVldWVfcmVjdmZyYW1lKHF1ZXVlKSBydHdfYWxsb2NfcmVjdmZyYW1lKHF1ZXVlKQotaW50IF9ydHdfZW5xdWV1ZV9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnF1ZXVlKTsKLWludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IF9fcXVldWUgKnF1ZXVlKTsKK2ludCBfcnR3X2VucXVldWVfcmVjdmZyYW1lKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLAorCQkJICAgc3RydWN0IF9fcXVldWUgKnF1ZXVlKTsKK2ludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBfX3F1ZXVlICpxdWV1ZSk7CiB2b2lkIHJ0d19mcmVlX3JlY3ZmcmFtZV9xdWV1ZShzdHJ1Y3QgX19xdWV1ZSAqcGZyYW1lcXVldWUsCiAJCQkgICAgICBzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSk7CiB1MzIgcnR3X2ZyZWVfdWNfc3dkZWNfcGVuZGluZ19xdWV1ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CkBAIC0zMTUsMjkgKzMwOCwyMCBAQAogCiB2b2lkIHJ0d19yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyKHZvaWQgKnBjb250ZXh0KTsKIAotc3RhdGljIGlubGluZSB1OCAqZ2V0X3J4bWVtKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCitzdGF0aWMgaW5saW5lIHU4ICpnZXRfcnhtZW0oc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7CiAJLyogYWx3YXlzIHJldHVybiByeF9oZWFkLi4uICovCiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2hlYWQ7CisJcmV0dXJuIHByZWN2ZnJhbWUtPnJ4X2hlYWQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggKmdldF9yeF9zdGF0dXModW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKK3N0YXRpYyBpbmxpbmUgdTggKmdldF9yeF9zdGF0dXMoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7CiAJcmV0dXJuIGdldF9yeG1lbShwcmVjdmZyYW1lKTsKIH0KIAotc3RhdGljIGlubGluZSB1OCAqZ2V0X3JlY3ZmcmFtZV9kYXRhKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17Ci0JLyogYWx3YXlzIHJldHVybiByeF9kYXRhICovCi0JaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YTsKLX0KLQotc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1c2godW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQorc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1c2goc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKIHsKIAkvKiAgYXBwZW5kIGRhdGEgYmVmb3JlIHJ4X2RhdGEgKi8KIApAQCAtMzQ4LDE2ICszMzIsMTYgQEAKICAqLwogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGEgLT0gc3ogOwotCWlmIChwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhIDwgcHJlY3ZmcmFtZS0+dS5oZHIucnhfaGVhZCkgewotCQlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhICs9IHN6OworCXByZWN2ZnJhbWUtPnJ4X2RhdGEgLT0gc3o7CisJaWYgKHByZWN2ZnJhbWUtPnJ4X2RhdGEgPCBwcmVjdmZyYW1lLT5yeF9oZWFkKSB7CisJCXByZWN2ZnJhbWUtPnJ4X2RhdGEgKz0gc3o7CiAJCXJldHVybiBOVUxMOwogCX0KLQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gKz0gc3o7Ci0JcmV0dXJuIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJcHJlY3ZmcmFtZS0+bGVuICs9IHN6OworCXJldHVybiBwcmVjdmZyYW1lLT5yeF9kYXRhOwogfQogCi1zdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHVsbCh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCitzdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHVsbChzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgaW50IHN6KQogewogCS8qICByeF9kYXRhICs9IHN6OyBtb3ZlIHJ4X2RhdGEgc3ogYnl0ZXMgIGhlcmVhZnRlciAqLwogCkBAIC0zNjYsMTYgKzM1MCwxNiBAQAogCiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSArPSBzejsKLQlpZiAocHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSA+IHByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwpIHsKLQkJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSAtPSBzejsKKwlwcmVjdmZyYW1lLT5yeF9kYXRhICs9IHN6OworCWlmIChwcmVjdmZyYW1lLT5yeF9kYXRhID4gcHJlY3ZmcmFtZS0+cnhfdGFpbCkgeworCQlwcmVjdmZyYW1lLT5yeF9kYXRhIC09IHN6OwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcHJlY3ZmcmFtZS0+dS5oZHIubGVuIC09IHN6OwotCXJldHVybiBwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhOworCXByZWN2ZnJhbWUtPmxlbiAtPSBzejsKKwlyZXR1cm4gcHJlY3ZmcmFtZS0+cnhfZGF0YTsKIH0KIAotc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1dCh1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCitzdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHV0KHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBpbnQgc3opCiB7CiAJLyogdXNlZCBmb3IgYXBwZW5kIHN6IGJ5dGVzIGZyb20gcHRyIHRvIHJ4X3RhaWwsIHVwZGF0ZSByeF90YWlsCiAJICogYW5kIHJldHVybiB0aGUgdXBkYXRlZCByeF90YWlsIHRvIHRoZSBjYWxsZXIgKi8KQEAgLTM4NCwxNyArMzY4LDE3IEBACiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsICs9IHN6OworCXByZWN2ZnJhbWUtPnJ4X3RhaWwgKz0gc3o7CiAKLQlpZiAocHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCA+IHByZWN2ZnJhbWUtPnUuaGRyLnJ4X2VuZCkgewotCQlwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsIC09IHN6OworCWlmIChwcmVjdmZyYW1lLT5yeF90YWlsID4gcHJlY3ZmcmFtZS0+cnhfZW5kKSB7CisJCXByZWN2ZnJhbWUtPnJ4X3RhaWwgLT0gc3o7CiAJCXJldHVybiBOVUxMOwogCX0KLQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gKz0gc3o7Ci0JcmV0dXJuIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWw7CisJcHJlY3ZmcmFtZS0+bGVuICs9IHN6OworCXJldHVybiBwcmVjdmZyYW1lLT5yeF90YWlsOwogfQogCi1zdGF0aWMgaW5saW5lIHU4ICpyZWN2ZnJhbWVfcHVsbF90YWlsKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKK3N0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdWxsX3RhaWwoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIGludCBzeikKIHsKIAkvKiAgcm12IGRhdGEgZnJvbSByeF90YWlsIChieSB5aXRzZW4pICovCiAKQEAgLTQwNCw2NCArMzg4LDEzIEBACiAKIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsIC09IHN6OwotCWlmIChwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsIDwgcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSkgewotCQlwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsICs9IHN6OworCXByZWN2ZnJhbWUtPnJ4X3RhaWwgLT0gc3o7CisJaWYgKHByZWN2ZnJhbWUtPnJ4X3RhaWwgPCBwcmVjdmZyYW1lLT5yeF9kYXRhKSB7CisJCXByZWN2ZnJhbWUtPnJ4X3RhaWwgKz0gc3o7CiAJCXJldHVybiBOVUxMOwogCX0KLQlwcmVjdmZyYW1lLT51Lmhkci5sZW4gLT0gc3o7Ci0JcmV0dXJuIHByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqZ2V0X3J4YnVmX2Rlc2ModW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQl1bnNpZ25lZCBjaGFyICpidWZfZGVzYzsKLQotCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBidWZfZGVzYzsKLX0KLQotc3RhdGljIGlubGluZSB1bmlvbiByZWN2X2ZyYW1lICpyeG1lbV90b19yZWN2ZnJhbWUodTggKnJ4bWVtKQotewotCS8qIGR1ZSB0byB0aGUgZGVzaWduIG9mIDIwNDggYnl0ZXMgYWxpZ25tZW50IG9mIHJlY3ZfZnJhbWUsCi0JICogd2UgY2FuIHJlZmVyZW5jZSB0aGUgdW5pb24gcmVjdl9mcmFtZSAqLwotCS8qIGZyb20gYW55IGdpdmVuIG1lbWJlciBvZiByZWN2X2ZyYW1lLiAqLwotCS8qICByeG1lbSBpbmRpY2F0ZXMgdGhlIGFueSBtZW1iZXIvYWRkcmVzcyBpbiByZWN2X2ZyYW1lICovCi0KLQlyZXR1cm4gKHVuaW9uIHJlY3ZfZnJhbWUgKikoKChzaXplX3QpcnhtZW0gPj4gUlhGUkFNRV9BTElHTikgPDwgUlhGUkFNRV9BTElHTik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5pb24gcmVjdl9mcmFtZSAqcGt0X3RvX3JlY3ZmcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQotewotCXU4ICpidWZfc3RhcjsKLQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZTsKLQlwcmVjdl9mcmFtZSA9IHJ4bWVtX3RvX3JlY3ZmcmFtZSgodW5zaWduZWQgY2hhciAqKWJ1Zl9zdGFyKTsKLQotCXJldHVybiBwcmVjdl9mcmFtZTsKLX0KLQotc3RhdGljIGlubGluZSB1OCAqcGt0X3RvX3JlY3ZtZW0oc3RydWN0IHNrX2J1ZmYgKnBrdCkKLXsKLQkvKiAgcmV0dXJuIHRoZSByeF9oZWFkICovCi0KLQl1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSA9IHBrdF90b19yZWN2ZnJhbWUocGt0KTsKLQotCXJldHVybglwcmVjdl9mcmFtZS0+dS5oZHIucnhfaGVhZDsKLX0KLQotc3RhdGljIGlubGluZSB1OCAqcGt0X3RvX3JlY3ZkYXRhKHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0JLyogIHJldHVybiB0aGUgcnhfZGF0YSAqLwotCi0JdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUgPSBwa3RfdG9fcmVjdmZyYW1lKHBrdCk7Ci0KLQlyZXR1cm4JcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF9yZWN2ZnJhbWVfbGVuKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17Ci0JcmV0dXJuIHByZWN2ZnJhbWUtPnUuaGRyLmxlbjsKKwlwcmVjdmZyYW1lLT5sZW4gLT0gc3o7CisJcmV0dXJuIHByZWN2ZnJhbWUtPnJ4X3RhaWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgczMyIHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibSh1MzIgc2lnX3N0cmVuX2luZGV4KQpAQCAtNDgwLDYgKzQxMyw2IEBACiAKIHZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpOwogCi12b2lkICBtZ3RfZGlzcGF0Y2hlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKK3ZvaWQgIG1ndF9kaXNwYXRjaGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCmluZGV4IDFhYzFkZDMuLjYyZjVkYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCkBAIC0xMDUsMTEgKzEwNSw2IEBACiAJX19sZTMyIHR4ZHc3OwogfTsKIAotdW5pb24gdHhkZXNjIHsKLQlzdHJ1Y3QgdHhfZGVzYyB0eGRlc2M7Ci0JdW5zaWduZWQgaW50IHZhbHVlW1RYREVTQ19TSVpFPj4yXTsKLX07Ci0KIHN0cnVjdAlod194bWl0CXsKIAlzdHJ1Y3QgX19xdWV1ZSAqc3RhX3F1ZXVlOwogCWludAlhY2NudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCmluZGV4IDJlNzMwN2YuLmE4OGViZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaApAQCAtNjk0LDcgKzY5NCw3IEBACiAKIHN0cnVjdCBBRERCQV9yZXF1ZXN0IHsKIAl1bnNpZ25lZCBjaGFyCWRpYWxvZ190b2tlbjsKLQl1bnNpZ25lZCBzaG9ydAlCQV9wYXJhX3NldDsKKwlfX2xlMTYJCUJBX3BhcmFfc2V0OwogCXVuc2lnbmVkIHNob3J0CUJBX3RpbWVvdXRfdmFsdWU7CiAJdW5zaWduZWQgc2hvcnQJQkFfc3RhcnRpbmdfc2VxY3RybDsKIH0gX19wYWNrZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYwppbmRleCA0YWQ4MGFlLi4yNjM2ZTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKQEAgLTM1LDYgKzM1LDcgQEAKIAogI2luY2x1ZGUgPHJ0d19tcC5oPgogI2luY2x1ZGUgPHJ0d19pb2wuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCShTSU9DSVdGSVJTVFBSSVYgKyAzMCkKIApAQCAtNDcyLDggKzQ3Myw2IEBACiAJc3RydWN0IHdpZmlkaXJlY3RfaW5mbyAqcHdkaW5mbyA9ICZwYWRhcHRlci0+d2RpbmZvOwogI2VuZGlmIC8qIENPTkZJR184OEVVX1AyUCAqLwogCi1fZnVuY19lbnRlcl87Ci0KIAlwYXJhbS0+dS5jcnlwdC5lcnIgPSAwOwogCXBhcmFtLT51LmNyeXB0LmFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTiAtIDFdID0gJ1wwJzsKIApAQCAtNjE0LDkgKzYxMyw2IEBACiBleGl0OgogCiAJa2ZyZWUocHdlcCk7Ci0KLV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzcwLDggKzc2Niw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJjbWRfY29kZSA9JXhcbiIsIGluZm8tPmNtZCkpOwogCi0JX2Z1bmNfZW50ZXJfOwotCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSA9PSB0cnVlKSB7CiAJCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCiAJCXAgPSBydHdfZ2V0X2llKCZwY3VyX2Jzcy0+SUVzWzEyXSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmaHRfaWVsZW4sIHBjdXJfYnNzLT5JRUxlbmd0aC0xMik7CkBAIC04MDYsOSArODAwLDYgQEAKIAl9IGVsc2UgewogCQlzbnByaW50Zih3cnF1LT5uYW1lLCBJRk5BTVNJWiwgInVuYXNzb2NpYXRlZCIpOwogCX0KLQotCV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgxNiwxMiArODA3LDcgQEAKIAkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JX2Z1bmNfZW50ZXJfOwotCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywgKCIrcnR3X3d4X3NldF9mcmVxXG4iKSk7Ci0KLQlfZnVuY19leGl0XzsKLQogCXJldHVybiAwOwogfQogCkBAIC04NTQsOCArODQwLDYgQEAKIAllbnVtIG5kaXNfODAyXzExX25ldHdvcmtfaW5mcmEgbmV0d29ya1R5cGU7CiAJaW50IHJldCA9IDA7CiAKLQlfZnVuY19lbnRlcl87Ci0KIAlpZiAoX0ZBSUwgPT0gcnR3X3B3cl93YWtldXAocGFkYXB0ZXIpKSB7CiAJCXJldCA9IC1FUEVSTTsKIAkJZ290byBleGl0OwpAQCAtODk0LDcgKzg3OCw2IEBACiAJfQogCXJ0d19zZXRvcG1vZGVfY21kKHBhZGFwdGVyLCBuZXR3b3JrVHlwZSk7CiBleGl0OgotCV9mdW5jX2V4aXRfOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTkwNiw4ICs4ODksNiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgiIHJ0d193eF9nZXRfbW9kZVxuIikpOwogCi0JX2Z1bmNfZW50ZXJfOwotCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKQogCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKIAllbHNlIGlmICAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHx8CkBAIC05MTgsOCArODk5LDYgQEAKIAllbHNlCiAJCXdycXUtPm1vZGUgPSBJV19NT0RFX0FVVE87CiAKLQlfZnVuY19leGl0XzsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDExLDggKzk5MCw2IEBACiAJdTE2IHZhbDsKIAlpbnQgaTsKIAotCV9mdW5jX2VudGVyXzsKLQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d193eF9nZXRfcmFuZ2UuIGNtZF9jb2RlID0leFxuIiwgaW5mby0+Y21kKSk7CiAKIAl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOwpAQCAtMTA5Myw4ICsxMDcwLDYgQEAKIAlyYW5nZS0+c2Nhbl9jYXBhID0gSVdfU0NBTl9DQVBBX0VTU0lEIHwgSVdfU0NBTl9DQVBBX1RZUEUgfAogCQkJICAgSVdfU0NBTl9DQVBBX0JTU0lEIHwgSVdfU0NBTl9DQVBBX0NIQU5ORUwgfAogCQkJICAgSVdfU0NBTl9DQVBBX01PREUgfCBJV19TQ0FOX0NBUEFfUkFURTsKLQlfZnVuY19leGl0XzsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMTE4LDggKzEwOTMsNiBAQAogCXN0cnVjdAl3bGFuX25ldHdvcmsJKnBuZXR3b3JrID0gTlVMTDsKIAllbnVtIG5kaXNfODAyXzExX2F1dGhfbW9kZQlhdXRobW9kZTsKIAotCV9mdW5jX2VudGVyXzsKLQogCWlmIChfRkFJTCA9PSBydHdfcHdyX3dha2V1cChwYWRhcHRlcikpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gZXhpdDsKQEAgLTExMzgsMTUgKzExMTEsMTUgQEAKIAlhdXRobW9kZSA9IHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlOwogCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcG1sbWVwcml2LT5wc2Nhbm5lZCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbWxtZXByaXYtPnBzY2FubmVkID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAoKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbWxtZXByaXYtPnBzY2FubmVkKSkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocG1sbWVwcml2LT5wc2Nhbm5lZCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBtbG1lcHJpdi0+cHNjYW5uZWQsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCi0JCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBnZXRfbmV4dChwbWxtZXByaXYtPnBzY2FubmVkKTsKKwkJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IHBtbG1lcHJpdi0+cHNjYW5uZWQtPm5leHQ7CiAKIAkJZHN0X2Jzc2lkID0gcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzczsKIApAQCAtMTE3Myw4ICsxMTQ2LDYgQEAKIAogZXhpdDoKIAotCV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTE5MiwxNyArMTE2MywxMiBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgicnR3X3d4X2dldF93YXBcbiIpKTsKIAotCV9mdW5jX2VudGVyXzsKLQogCWlmICgoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgPT0gdHJ1ZSkgfHwKIAkgICAgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSA9PSB0cnVlKSB8fAogCSAgICAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgPT0gdHJ1ZSkpCiAJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHBjdXJfYnNzLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CiAJZWxzZQogCQlfcnR3X21lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKLQotCV9mdW5jX2V4aXRfOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNTIsNyArMTIxOCw2IEBACiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgicnR3X3d4X3NldF9zY2FuXG4iKSk7CiAKLV9mdW5jX2VudGVyXzsKIAlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlID09IDEpIHsKIAkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgewogCQkJcmV0ID0gLTE7CkBAIC0xMzgzLDcgKzEzNDgsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDA3LDggKzEzNzEsNiBAQAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d193eF9nZXRfc2NhblxuIikpOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2luZm9fLCAoIiBTdGFydCBvZiBRdWVyeSBTSU9DR0lXU0NBTiAuXG4iKSk7CiAKLQlfZnVuY19lbnRlcl87Ci0KIAlpZiAocGFkYXB0ZXItPnB3cmN0cmxwcml2LmJyZm9mZmJ5aHcgJiYgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdDsKQEAgLTE0NDAsNyArMTQwMiw3IEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKQpAQCAtMTQ1MSwxMyArMTQxMywxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJCS8qIHJlcG9ydCBuZXR3b3JrIG9ubHkgaWYgdGhlIGN1cnJlbnQgY2hhbm5lbCBzZXQgY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gd2hpY2ggdGhpcyBuZXR3b3JrIGJlbG9uZ3MgKi8KIAkJaWYgKHJ0d19jaF9zZXRfc2VhcmNoX2NoKHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5jaGFubmVsX3NldCwgcG5ldHdvcmstPm5ldHdvcmsuQ29uZmlndXJhdGlvbi5EU0NvbmZpZykgPj0gMCkKIAkJCWV2ID0gdHJhbnNsYXRlX3NjYW4ocGFkYXB0ZXIsIGEsIHBuZXR3b3JrLCBldiwgc3RvcCk7CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTE0NjYsNyArMTQyOCw2IEBACiAJd3JxdS0+ZGF0YS5mbGFncyA9IDA7CiAKIGV4aXQ6Ci0JX2Z1bmNfZXhpdF87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ5MCw3ICsxNDUxLDYgQEAKIAogCXVpbnQgcmV0ID0gMCwgbGVuOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfaW5mb18sCiAJCSAoIitydHdfd3hfc2V0X2Vzc2lkOiBmd19zdGF0ZSA9IDB4JTA4eFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOwpAQCAtMTUzMCw3ICsxNDkwLDcgQEAKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfaW5mb18sICgicnR3X3d4X3NldF9lc3NpZDogc3NpZCA9WyVzXVxuIiwgc3JjX3NzaWQpKTsKIAkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAJICAgICAgIHBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JICAgICAgcG1sbWVwcml2LT5wc2Nhbm5lZCA9IGdldF9uZXh0KHBoZWFkKTsKKwkgICAgICBwbWxtZXByaXYtPnBzY2FubmVkID0gcGhlYWQtPm5leHQ7CiAKIAkJd2hpbGUgKDEpIHsKIAkJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcG1sbWVwcml2LT5wc2Nhbm5lZCkgPT0gdHJ1ZSkgewpAQCAtMTU0MCw5ICsxNTAwLDkgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbWxtZXByaXYtPnBzY2FubmVkLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBtbG1lcHJpdi0+cHNjYW5uZWQsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCi0JCQlwbWxtZXByaXYtPnBzY2FubmVkID0gZ2V0X25leHQocG1sbWVwcml2LT5wc2Nhbm5lZCk7CisJCQlwbWxtZXByaXYtPnBzY2FubmVkID0gcG1sbWVwcml2LT5wc2Nhbm5lZC0+bmV4dDsKIAogCQkJZHN0X3NzaWQgPSBwbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQ7CiAKQEAgLTE1ODMsNyArMTU0Myw2IEBACiAKIAlEQkdfODhFKCI8PSVzLCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTU5OSw3ICsxNTU4LDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d193eF9nZXRfZXNzaWRcbiIpKTsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB8fAogCSAgICAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkpIHsKQEAgLTE2MTcsNyArMTU3NSw2IEBACiAKIGV4aXQ6CiAKLQlfZnVuY19leGl0XzsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNjM0LDcgKzE1OTEsNiBAQAogCXUzMglyYXRldmFsdWUgPSAwOwogCSB1OCBtcGRhdGFyYXRlW051bVJhdGVzXSA9IHsxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAsIDB4ZmZ9OwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCIgcnR3X3d4X3NldF9yYXRlXG4iKSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfaW5mb18sICgidGFyZ2V0X3JhdGUgPSAlZCwgZml4ZWQgPSAlZFxuIiwgdGFyZ2V0X3JhdGUsIGZpeGVkKSk7CkBAIC0xNzA2LDcgKzE2NjIsNiBAQAogCQlyZXQgPSAtMTsKIAl9CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3MzQsNyArMTY4OSw2IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAod3JxdS0+cnRzLmRpc2FibGVkKSB7CiAJCXBhZGFwdGVyLT5yZWdpc3RyeXByaXYucnRzX3RocmVzaCA9IDIzNDc7CkBAIC0xNzQ4LDcgKzE3MDIsNiBAQAogCiAJREJHXzg4RSgiJXMsIHJ0c190aHJlc2ggPSVkXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5ydHNfdGhyZXNoKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzU5LDcgKzE3MTIsNiBAQAogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJREJHXzg4RSgiJXMsIHJ0c190aHJlc2ggPSVkXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5ydHNfdGhyZXNoKTsKIApAQCAtMTc2Nyw3ICsxNzE5LDYgQEAKIAl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLwogCS8qIHdycXUtPnJ0cy5kaXNhYmxlZCA9ICh3cnF1LT5ydHMudmFsdWUgPT0gREVGQVVMVF9SVFNfVEhSRVNIT0xEKTsgKi8KIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzc4LDcgKzE3MjksNiBAQAogewogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwogCi0JX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpIHsKIAkJcGFkYXB0ZXItPnhtaXRwcml2LmZyYWdfbGVuID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwpAQCAtMTc5Miw3ICsxNzQyLDYgQEAKIAogCURCR184OEUoIiVzLCBmcmFnX2xlbiA9JWRcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW4pOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MDMsMTQgKzE3NTIsMTIgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKIAotCV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoIiVzLCBmcmFnX2xlbiA9JWRcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW4pOwogCiAJd3JxdS0+ZnJhZy52YWx1ZSA9IHBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbjsKIAl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODQ0LDcgKzE3OTEsNiBAQAogCiAJa2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CiAJCURCR184OEUoIkVuY3J5cHRpb25EaXNhYmxlZFxuIik7CkBAIC0xOTM5LDcgKzE4ODUsNiBAQAogCiBleGl0OgogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk1Myw3ICsxODk4LDYgQEAKIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOwogCXN0cnVjdAltbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICYocGFkYXB0ZXItPm1sbWVwcml2KTsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgIT0gdHJ1ZSkgewogCQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKQEAgLTIwMDcsNyArMTk1MSw2IEBACiAJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwogCQlicmVhazsKIAl9Ci0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjIxMCw2ICsyMTUzLDcgQEAKIAl1MzIgZGF0YTMyOwogCXUzMiBieXRlczsKIAl1OCAqcHRtcDsKKwlpbnQgcnY7CiAKIAlwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwogCXAgPSAmd3JxdS0+ZGF0YTsKQEAgLTIyMjUsNyArMjE2OSwxMSBAQAogCiAJYnl0ZXMgPSAwOwogCWFkZHIgPSAwOwotCXNzY2FuZihwdG1wLCAiJWQsJXgiLCAmYnl0ZXMsICZhZGRyKTsKKwlydiA9IHNzY2FuZihwdG1wLCAiJWQsJXgiLCAmYnl0ZXMsICZhZGRyKTsKKwlpZiAocnYgIT0gMikgeworCQlrZnJlZShwdG1wKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJc3dpdGNoIChieXRlcykgewogCWNhc2UgMToKQEAgLTIyNTUsNiArMjIwMyw3IEBACiAJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CisJaW50IHJ2OwogCiAJdTMyIGFkZHI7CiAJdTMyIGRhdGEzMjsKQEAgLTIyNjMsNyArMjIxMiw5IEBACiAJYnl0ZXMgPSAwOwogCWFkZHIgPSAwOwogCWRhdGEzMiA9IDA7Ci0Jc3NjYW5mKGV4dHJhLCAiJWQsJXgsJXgiLCAmYnl0ZXMsICZhZGRyLCAmZGF0YTMyKTsKKwlydiA9IHNzY2FuZihleHRyYSwgIiVkLCV4LCV4IiwgJmJ5dGVzLCAmYWRkciwgJmRhdGEzMik7CisJaWYgKHJ2ICE9IDMpCisJCXJldHVybiAtRUlOVkFMOwogCiAJc3dpdGNoIChieXRlcykgewogCWNhc2UgMToKQEAgLTI2MDcsMTMgKzI1NTgsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAkJaWYgKGh3YWRkcl9hdG9uX2koZGF0YSwgYnNzaWQpKSB7CiAJCQlEQkdfODhFKCJJbnZhbGlkIEJTU0lEICclcycuXG4iLCAodTggKilkYXRhKTsKQEAgLTI2MzgsNyArMjU4OSw3IEBACiAJCQl9CiAJCX0KIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMjY5MCwxMyArMjY0MSwxMyBAQAogCXN0cnVjdCBpd19wb2ludCAqcGRhdGEgPSAmd3JxdS0+ZGF0YTsKIAl1MzIgICB1MzJ3cHNfc3RhcnQgPSAwOwogCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdTMyd3BzX3N0YXJ0LCBwZGF0YS0+cG9pbnRlciwgNCk7Ci0JaWYgKHJldCkgeworCWlmICgocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSB8fCAocGRhdGEgPT0gTlVMTCkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwogCX0KIAotCWlmICgocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSB8fCAocGRhdGEgPT0gTlVMTCkpIHsKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZ1MzJ3cHNfc3RhcnQsIHBkYXRhLT5wb2ludGVyLCA0KTsKKwlpZiAocmV0KSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0zMTEwLDEzICszMDYxLDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwZWVyTUFDLCBFVEhfQUxFTikpIHsKIAkJCXU4ICp3cHNpZTsKIAkJCXVpbnQgd3BzaWVfbGVuID0gMDsKQEAgLTMxMzQsNyArMzA4NSw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJfQotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzE4MCwxMyArMzEzMSwxMyBAQAogCXNwaW5fbG9ja19iaCgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCXBsaXN0ID0gcGhlYWQtPm5leHQ7CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSB0cnVlKQogCQkJYnJlYWs7CiAKLQkJcG5ldHdvcmsgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CisJCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKIAkJaWYgKCFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgcGVlck1BQywgRVRIX0FMRU4pKSB7CiAJCQkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTEvMDUvMTggKi8KIAkJCS8qCU1hdGNoIHRoZSBkZXZpY2UgYWRkcmVzcyBsb2NhdGVkIGluIHRoZSBQMlAgSUUgKi8KQEAgLTMyMTUsNyArMzE2Niw3IEBACiAJCQl9CiAJICAgICB9CiAKLQkJcGxpc3QgPSBnZXRfbmV4dChwbGlzdCk7CisJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKQEAgLTMyNjQsMTMgKzMyMTUsMTMgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmICghbWVtY21wKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIHBlZXJNQUMsIEVUSF9BTEVOKSkgewogCQkJdTggKndwc2llOwogCQkJdWludCB3cHNpZV9sZW4gPSAwOwpAQCAtMzI5NSw3ICszMjQ2LDcgQEAKIAkJCWJyZWFrOwogCSAgICAgfQogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zMzQzLDEzICszMjk0LDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwZWVyTUFDLCBFVEhfQUxFTikpIHsKIAkJCXU4ICp3cHNpZTsKIAkJCXVpbnQgd3BzaWVfbGVuID0gMDsKQEAgLTMzNjYsNyArMzMxNyw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zNDE0LDEzICszMzY1LDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwZWVyTUFDLCBFVEhfQUxFTikpIHsKIAkJCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMjEyMjYgKi8KIAkJCS8qCU1hdGNoIHRoZSBkZXZpY2UgYWRkcmVzcyBsb2NhdGVkIGluIHRoZSBQMlAgSUUgKi8KQEAgLTM0NDAsNyArMzM5MSw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zNDk2LDE5ICszNDQ3LDE5IEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBwZWVyTUFDLCBFVEhfQUxFTikpIHsKIAkJCXVpbnRQZWVyQ2hhbm5lbCA9IHBuZXR3b3JrLT5uZXR3b3JrLkNvbmZpZ3VyYXRpb24uRFNDb25maWc7CiAJCQlicmVhazsKIAkJfQogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0zNTkxLDEzICszNTQyLDEzIEBACiAJc3Bpbl9sb2NrX2JoKCYocG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JcGxpc3QgPSBnZXRfbmV4dChwaGVhZCk7CisJcGxpc3QgPSBwaGVhZC0+bmV4dDsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChydHdfZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpID09IHRydWUpCiAJCQlicmVhazsKIAotCQlwbmV0d29yayA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKKwkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCiAJCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMS8wNS8xOCAqLwogCQkvKglNYXRjaCB0aGUgZGV2aWNlIGFkZHJlc3MgbG9jYXRlZCBpbiB0aGUgUDJQIElFICovCkBAIC0zNjIyLDcgKzM1NzMsNyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzc0MSw3ICszNjkyLDcgQEAKIAlzcGluX2xvY2tfYmgoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jaykpOwogCiAJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJ0d19lbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkgPT0gdHJ1ZSkKQEAgLTM3NTAsNyArMzcwMSw3IEBACiAJCWlmICh1aW50UGVlckNoYW5uZWwgIT0gMCkKIAkJCWJyZWFrOwogCi0JCXBuZXR3b3JrID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOworCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAKIAkJLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDExLzA1LzE4ICovCiAJCS8qCU1hdGNoIHRoZSBkZXZpY2UgYWRkcmVzcyBsb2NhdGVkIGluIHRoZSBQMlAgSUUgKi8KQEAgLTM3ODEsNyArMzczMiw3IEBACiAJCQl9CiAJCX0KIAotCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMzkxNCwyNCArMzg2NSwzMyBAQAogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKHBhZGFwdGVyLT5iU2hvd0dldFAyUFN0YXRlKQotCQlEQkdfODhFKCJbJXNdIGV4dHJhID0gJXNcbiIsIF9fZnVuY19fLCAoY2hhciAqKXdycXUtPmRhdGEucG9pbnRlcik7Ci0JaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAic3RhdHVzIiwgNikpIHsKKwkJREJHXzg4RSgiWyVzXSBleHRyYSA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJCShjaGFyIF9fdXNlciAqKXdycXUtPmRhdGEucG9pbnRlcik7CisJaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJzdGF0dXMiLCA2KSkgewogCQlydHdfcDJwX2dldF9zdGF0dXMoZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JfSBlbHNlIGlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgInJvbGUiLCA0KSkgeworCX0gZWxzZSBpZiAoIW1lbWNtcCgoX19mb3JjZSBjb25zdCBjaGFyICopd3JxdS0+ZGF0YS5wb2ludGVyLAorCQkJInJvbGUiLCA0KSkgewogCQlydHdfcDJwX2dldF9yb2xlKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwotCX0gZWxzZSBpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJwZWVyX2lmYSIsIDgpKSB7CisJfSBlbHNlIGlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkicGVlcl9pZmEiLCA4KSkgewogCQlydHdfcDJwX2dldF9wZWVyX2lmYWRkcihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl9IGVsc2UgaWYgKCFtZW1jbXAod3JxdS0+ZGF0YS5wb2ludGVyLCAicmVxX2NtIiwgNikpIHsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJyZXFfY20iLCA2KSkgewogCQlydHdfcDJwX2dldF9yZXFfY20oZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JfSBlbHNlIGlmICghbWVtY21wKHdycXUtPmRhdGEucG9pbnRlciwgInBlZXJfZGV2YSIsIDkpKSB7CisJfSBlbHNlIGlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkicGVlcl9kZXZhIiwgOSkpIHsKIAkJLyoJR2V0IHRoZSBQMlAgZGV2aWNlIGFkZHJlc3Mgd2hlbiByZWNlaXZpbmcgdGhlIHByb3Zpc2lvbiBkaXNjb3ZlcnkgcmVxdWVzdCBmcmFtZS4gKi8KIAkJcnR3X3AycF9nZXRfcGVlcl9kZXZhZGRyKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwotCX0gZWxzZSBpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJncm91cF9pZCIsIDgpKSB7CisJfSBlbHNlIGlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkiZ3JvdXBfaWQiLCA4KSkgewogCQlydHdfcDJwX2dldF9ncm91cGlkKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwotCX0gZWxzZSBpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJwZWVyX2RldmFfaW52IiwgOSkpIHsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoKF9fZm9yY2UgY29uc3QgY2hhciAqKXdycXUtPmRhdGEucG9pbnRlciwKKwkJCSJwZWVyX2RldmFfaW52IiwgOSkpIHsKIAkJLyoJR2V0IHRoZSBQMlAgZGV2aWNlIGFkZHJlc3Mgd2hlbiByZWNlaXZpbmcgdGhlIFAyUCBJbnZpdGF0aW9uIHJlcXVlc3QgZnJhbWUuICovCiAJCXJ0d19wMnBfZ2V0X3BlZXJfZGV2YWRkcl9ieV9pbnZpdGF0aW9uKGRldiwgaW5mbywgd3JxdSwgZXh0cmEpOwotCX0gZWxzZSBpZiAoIW1lbWNtcCh3cnF1LT5kYXRhLnBvaW50ZXIsICJvcF9jaCIsIDUpKSB7CisJfSBlbHNlIGlmICghbWVtY21wKChfX2ZvcmNlIGNvbnN0IGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIsCisJCQkib3BfY2giLCA1KSkgewogCQlydHdfcDJwX2dldF9vcF9jaChkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCkBAIC0zOTQ1LDcgKzM5MDUsOCBAQAogCWludCByZXQgPSAwOwogCiAjaWZkZWYgQ09ORklHXzg4RVVfUDJQCi0JREJHXzg4RSgiWyVzXSBleHRyYSA9ICVzXG4iLCBfX2Z1bmNfXywgKGNoYXIgKil3cnF1LT5kYXRhLnBvaW50ZXIpOworCURCR184OEUoIlslc10gZXh0cmEgPSAlc1xuIiwgX19mdW5jX18sCisJCQkoY2hhciBfX3VzZXIgKil3cnF1LT5kYXRhLnBvaW50ZXIpOwogCWlmICghbWVtY21wKGV4dHJhLCAid3BzQ00gPSIsIDYpKSB7CiAJCXdycXUtPmRhdGEubGVuZ3RoIC09IDY7CiAJCXJ0d19wMnBfZ2V0X3dwc19jb25maWdtZXRob2QoZGV2LCBpbmZvLCB3cnF1LCAgJmV4dHJhWzZdKTsKQEAgLTQ0MzYsMTIgKzQzOTcsMTIgQEAKIAogCQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fU1RBOyBpKyspIHsKIAkJCQkJcGhlYWQgPSAmKHBzdGFwcml2LT5zdGFfaGFzaFtpXSk7Ci0JCQkJCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCQkJCQlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJCQkJCXdoaWxlICgocnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgPT0gZmFsc2UpIHsKLQkJCQkJCXBzdGEgPSBMSVNUX0NPTlRBSU5PUihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBoYXNoX2xpc3QpOworCQkJCQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBoYXNoX2xpc3QpOwogCi0JCQkJCQlwbGlzdCA9IGdldF9uZXh0KHBsaXN0KTsKKwkJCQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAKIAkJCQkJCWlmIChleHRyYV9hcmcgPT0gcHN0YS0+YWlkKSB7CiAJCQkJCQkJREJHXzg4RSgic3RhJ3MgbWFjYWRkcjolcE1cbiIsIChwc3RhLT5od2FkZHIpKTsKQEAgLTQ1MDcsMTEgKzQ0NjgsOSBAQAogCQkJc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJCQkvKiAgMDogZGlzYWJsZSwgYml0KDApOmVuYWJsZSAyLjRnLCBiaXQoMSk6ZW5hYmxlIDVnLCAweDM6IGVuYWJsZSBib3RoIDIuNGcgYW5kIDVnICovCiAJCQkvKiBkZWZhdWx0IGlzIHNldCB0byBlbmFibGUgMi40R0haIGZvciBJT1QgaXNzdWUgd2l0aCBidWZmbGFvJ3MgQVAgYXQgNUdIWiAqLwotCQkJaWYgKHByZWdwcml2ICYmCi0JCQkgICAgKGV4dHJhX2FyZyA9PSAwIHx8Ci0JCQkgICAgIGV4dHJhX2FyZyA9PSAxIHx8Ci0JCQkgICAgIGV4dHJhX2FyZyA9PSAyIHx8Ci0JCQkgICAgIGV4dHJhX2FyZyA9PSAzKSkgeworCQkJaWYgKCFwcmVncHJpdikKKwkJCQlicmVhazsKKwkJCWlmIChleHRyYV9hcmcgPj0gMCAmJiBleHRyYV9hcmcgPD0gMykgewogCQkJCXByZWdwcml2LT5yeF9zdGJjID0gZXh0cmFfYXJnOwogCQkJCURCR184OEUoInNldCByeF9zdGJjID0lZFxuIiwgcHJlZ3ByaXYtPnJ4X3N0YmMpOwogCQkJfSBlbHNlIHsKQEAgLTQ1MjMsNyArNDQ4Miw5IEBACiAJCXsKIAkJCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCQkJLyogIDA6IGRpc2FibGUsIDB4MTplbmFibGUgKGJ1dCB3aWZpX3NwZWMgc2hvdWxkIGJlIDApLCAweDI6IGZvcmNlIGVuYWJsZSAoZG9uJ3QgY2FyZSB3aWZpX3NwZWMpICovCi0JCQlpZiAocHJlZ3ByaXYgJiYgZXh0cmFfYXJnID49IDAgJiYgZXh0cmFfYXJnIDwgMykgeworCQkJaWYgKCFwcmVncHJpdikKKwkJCQlicmVhazsKKwkJCWlmIChleHRyYV9hcmcgPj0gMCAmJiBleHRyYV9hcmcgPCAzKSB7CiAJCQkJcHJlZ3ByaXYtPmFtcGR1X2VuYWJsZSA9IGV4dHJhX2FyZzsKIAkJCQlEQkdfODhFKCJzZXQgYW1wZHVfZW5hYmxlID0lZFxuIiwgcHJlZ3ByaXYtPmFtcGR1X2VuYWJsZSk7CiAJCQl9IGVsc2UgewpAQCAtNTY0OCwxMiArNTYwOSwxMiBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWxlbiA9IGR3cnEtPmxlbmd0aDsKLQlleHQgPSBydHdfdm1hbGxvYyhsZW4pOworCWV4dCA9IHZtYWxsb2MobGVuKTsKIAlpZiAoIWV4dCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoZXh0LCBkd3JxLT5wb2ludGVyLCBsZW4pKSB7Ci0JCXJ0d192bWZyZWUoZXh0LCBsZW4pOworCQl2ZnJlZShleHQpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTU2OTMsNyArNTY1NCw3IEBACiAKIEZSRUVfRVhUOgogCi0JcnR3X3ZtZnJlZShleHQsIGxlbik7CisJdmZyZWUoZXh0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01NzA5LDEwICs1NjcwLDE0IEBACiAJREJHXzg4RSgiWyVzXSBleHRyYSA9ICVzXG4iLCBfX2Z1bmNfXywgZXh0cmEpOwogCiAJaWYgKCFtZW1jbXAoZXh0cmEsICJscHMgPSIsIDQpKSB7Ci0JCXNzY2FuZihleHRyYSs0LCAiJXUiLCAmbW9kZSk7CisJCXJldCA9IHNzY2FuZihleHRyYSs0LCAiJXUiLCAmbW9kZSk7CisJCWlmIChyZXQgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlyZXQgPSBydHdfcG1fc2V0X2xwcyhwYWRhcHRlciwgbW9kZSk7CiAJfSBlbHNlIGlmICghbWVtY21wKGV4dHJhLCAiaXBzID0iLCA0KSkgewotCQlzc2NhbmYoZXh0cmErNCwgIiV1IiwgJm1vZGUpOworCQlyZXQgPSBzc2NhbmYoZXh0cmErNCwgIiV1IiwgJm1vZGUpOworCQlpZiAocmV0ICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0ID0gcnR3X3BtX3NldF9pcHMocGFkYXB0ZXIsIG1vZGUpOwogCX0gZWxzZSB7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC02ODEyLDggKzY3NzcsMTEgQEAKIHsKIAl1MzIgYmFuZHdpZHRoID0gMCwgc2cgPSAwOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHJ0d19uZXRkZXZfcHJpdihkZXYpOworCWludCBydjsKIAotCXNzY2FuZihleHRyYSwgIjQwTSA9JWQsIHNob3J0R0kgPSVkIiwgJmJhbmR3aWR0aCwgJnNnKTsKKwlydiA9IHNzY2FuZihleHRyYSwgIjQwTSA9JWQsIHNob3J0R0kgPSVkIiwgJmJhbmR3aWR0aCwgJnNnKTsKKwlpZiAocnYgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYmFuZHdpZHRoICE9IEhUX0NIQU5ORUxfV0lEVEhfNDApCiAJCWJhbmR3aWR0aCA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7CkBAIC02ODMzLDYgKzY4MDEsNyBAQAogCXUzMgkJaWR4X2EgPSAwLCBpZHhfYiA9IDA7CiAJY2hhcgkqaW5wdXQgPSBrbWFsbG9jKHdycXUtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcnR3X25ldGRldl9wcml2KGRldik7CisJaW50IHJ2OwogCiAJaWYgKCFpbnB1dCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02ODQwLDcgKzY4MDksMTEgQEAKIAkJa2ZyZWUoaW5wdXQpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0Jc3NjYW5mKGlucHV0LCAicGF0aGEgPSVkLCBwYXRoYiA9JWQiLCAmaWR4X2EsICZpZHhfYik7CisJcnYgPSBzc2NhbmYoaW5wdXQsICJwYXRoYSA9JWQsIHBhdGhiID0lZCIsICZpZHhfYSwgJmlkeF9iKTsKKwlpZiAocnYgIT0gMikgeworCQlrZnJlZShpbnB1dCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXNwcmludGYoZXh0cmEsICJTZXQgcG93ZXIgbGV2ZWwgcGF0aF9BOiVkIHBhdGhfQjolZCIsIGlkeF9hLCBpZHhfYik7CiAJcGFkYXB0ZXItPm1wcHJpdi50eHBvd2VyaWR4ID0gKHU4KWlkeF9hOwpAQCAtNjkzNCw2ICs2OTA3LDcgQEAKIAl1MzIgcGtUeCA9IDEsIGNvdW50UGtUeCA9IDEsIGNvdHVUeCA9IDEsIENhcnJTcHJUeCA9IDEsIHNjVHggPSAxLCBzZ2xlVHggPSAxLCBzdG9wID0gMTsKIAl1MzIgYlN0YXJ0VGVzdCA9IDE7CiAJdTMyIGNvdW50ID0gMDsKKwlpbnQgcnY7CiAJc3RydWN0IG1wX3ByaXYgKnBtcF9wcml2OwogCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwogCkBAIC02OTUzLDcgKzY5MjcsOSBAQAogCXNnbGVUeCA9IHN0cm5jbXAoZXh0cmEsICJiYWNrZ3JvdW5kLCBzdG9uZSIsIDIwKTsKIAlwa1R4ID0gc3RybmNtcChleHRyYSwgImJhY2tncm91bmQsIHBrdCIsIDIwKTsKIAlzdG9wID0gc3RybmNtcChleHRyYSwgInN0b3AiLCA0KTsKLQlzc2NhbmYoZXh0cmEsICJjb3VudCA9JWQsIHBrdCIsICZjb3VudCk7CisJcnYgPSBzc2NhbmYoZXh0cmEsICJjb3VudCA9JWQsIHBrdCIsICZjb3VudCk7CisJaWYgKHJ2ICE9IDIpCisJCXJldHVybiAtRUlOVkFMOwogCiAJX3J0d19tZW1zZXQoZXh0cmEsICdcMCcsIHNpemVvZigqZXh0cmEpKTsKIApAQCAtNzMxMiw2ICs3Mjg4LDcgQEAKIHsKIAljaGFyCSppbnB1dCA9IGttYWxsb2Mod3JxdS0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAl1MzIJCXZhbHhjYXA7CisJaW50IHJ2OwogCiAJaWYgKCFpbnB1dCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03MzIyLDcgKzcyOTksMTEgQEAKIAogCURCR184OEUoIiVzOml3cHJpdiBpbiA9JXNcbiIsIF9fZnVuY19fLCBpbnB1dCk7CiAKLQlzc2NhbmYoaW5wdXQsICJ4Y2FwID0lZCIsICZ2YWx4Y2FwKTsKKwlydiA9IHNzY2FuZihpbnB1dCwgInhjYXAgPSVkIiwgJnZhbHhjYXApOworCWlmIChydiAhPSAxKSB7CisJCWtmcmVlKGlucHV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJa2ZyZWUoaW5wdXQpOwogCXJldHVybiAwOwpAQCAtNzg4OCw2ICs3ODY5LDcgQEAKIAlzMzIgbGVuOwogCXU4ICpleHRyYSA9IE5VTEw7CiAJdTMyIGV4dHJhX3NpemUgPSAwOworCWludCBydjsKIAogCXMzMiBrOwogCWNvbnN0IGl3X2hhbmRsZXIgKnByaXY7CQkvKiBQcml2YXRlIGlvY3RsICovCkBAIC03OTEzLDcgKzc4OTUsMTEgQEAKIAlwdHIgPSBpbnB1dDsKIAlsZW4gPSBpbnB1dF9sZW47CiAKLQlzc2NhbmYocHRyLCAiJTE2cyIsIGNtZG5hbWUpOworCXJ2ID0gc3NjYW5mKHB0ciwgIiUxNnMiLCBjbWRuYW1lKTsKKwlpZiAocnYgIT0gMSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQogCWNtZGxlbiA9IHN0cmxlbihjbWRuYW1lKTsKIAlEQkdfODhFKCIlczogY21kID0lc1xuIiwgX19mdW5jX18sIGNtZG5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9tbG1lX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9tbG1lX2xpbnV4LmMKaW5kZXggNTdkMWZmNy4uMDYyNDM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvbWxtZV9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYwpAQCAtNjEsMTIgKzYxLDEwIEBACiAKIHZvaWQgcnR3X29zX2luZGljYXRlX2Nvbm5lY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci1fZnVuY19lbnRlcl87CiAJcnR3X2luZGljYXRlX3d4X2Fzc29jX2V2ZW50KGFkYXB0ZXIpOwogCW5ldGlmX2NhcnJpZXJfb24oYWRhcHRlci0+cG5ldGRldik7CiAJaWYgKGFkYXB0ZXItPnBpZFsyXSAhPSAwKQogCQlydHdfc2lnbmFsX3Byb2Nlc3MoYWRhcHRlci0+cGlkWzJdLCBTSUdBTFJNKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19vc19pbmRpY2F0ZV9zY2FuX2RvbmUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGFib3J0ZWQpCkBAIC0xMTksMTEgKzExNyw5IEBACiAKIHZvaWQgcnR3X29zX2luZGljYXRlX2Rpc2Nvbm5lY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci1fZnVuY19lbnRlcl87CiAJbmV0aWZfY2Fycmllcl9vZmYoYWRhcHRlci0+cG5ldGRldik7IC8qICBEbyBpdCBmaXJzdCBmb3IgdHggYnJvYWRjYXN0IHBrdCBhZnRlciBkaXNjb25uZWN0aW9uIGlzc3VlISAqLwogCXJ0d19pbmRpY2F0ZV93eF9kaXNhc3NvY19ldmVudChhZGFwdGVyKTsKIAkgcnR3X3Jlc2V0X3NlY3VyaXR5cHJpdihhZGFwdGVyKTsKLV9mdW5jX2V4aXRfOwogfQogCiB2b2lkIHJ0d19yZXBvcnRfc2VjX2llKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBhdXRobW9kZSwgdTggKnNlY19pZSkKQEAgLTEzMiw3ICsxMjgsNiBAQAogCXU4CSpidWZmLCAqcCwgaTsKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAKLV9mdW5jX2VudGVyXzsKIAlSVF9UUkFDRShfbW9kdWxlX21sbWVfb3NkZXBfY18sIF9kcnZfaW5mb18sCiAJCSAoIitydHdfcmVwb3J0X3NlY19pZSwgYXV0aG1vZGU9JWRcbiIsIGF1dGhtb2RlKSk7CiAJYnVmZiA9IE5VTEw7CkBAIC0xNDEsNyArMTM2LDcgQEAKIAkJCSAoInJ0d19yZXBvcnRfc2VjX2llLCBhdXRobW9kZT0lZFxuIiwgYXV0aG1vZGUpKTsKIAkJYnVmZiA9IHJ0d19tYWxsb2MoSVdfQ1VTVE9NX01BWCk7CiAJCWlmICghYnVmZikKLQkJCWdvdG8gZXhpdDsKKwkJCXJldHVybjsKIAkJX3J0d19tZW1zZXQoYnVmZiwgMCwgSVdfQ1VTVE9NX01BWCk7CiAJCXAgPSBidWZmOwogCQlwICs9IHNwcmludGYocCwgIkFTU09DSU5GTyhSZXFJRXMgPSIpOwpAQCAtMTU3LDggKzE1Miw2IEBACiAJCXdpcmVsZXNzX3NlbmRfZXZlbnQoYWRhcHRlci0+cG5ldGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1ZmYpOwogCQlrZnJlZShidWZmKTsKIAl9Ci1leGl0OgotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIF9zdXJ2ZXlfdGltZXJfaGRsKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCmluZGV4IDdjOWVlNTguLmIyMjVkMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYwpAQCAtNTIwLDcgKzUyMCw2IEBACiAJdWludCBzdGF0dXMgPSBfU1VDQ0VTUzsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAgKnJlZ2lzdHJ5X3BhciA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCi1fZnVuY19lbnRlcl87CiAKIAlHbG9iYWxEZWJ1Z0xldmVsID0gcnR3X2RlYnVnOwogCXJlZ2lzdHJ5X3Bhci0+Y2hpcF92ZXJzaW9uID0gKHU4KXJ0d19jaGlwX3ZlcnNpb247CkBAIC01ODgsNyArNTg3LDYgQEAKIAlzbnByaW50ZihyZWdpc3RyeV9wYXItPmlmbmFtZSwgMTYsICIlcyIsIGlmbmFtZSk7CiAJc25wcmludGYocmVnaXN0cnlfcGFyLT5pZjJuYW1lLCAxNiwgIiVzIiwgaWYybmFtZSk7CiAJcmVnaXN0cnlfcGFyLT5ub3RjaF9maWx0ZXIgPSAodTgpcnR3X25vdGNoX2ZpbHRlcjsKLV9mdW5jX2V4aXRfOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTg1NSw3ICs4NTMsNiBAQAogewogCXU4CXJldDggPSBfU1VDQ0VTUzsKIAotX2Z1bmNfZW50ZXJfOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCIrcnR3X2luaXRfZHJ2X3N3XG4iKSk7CiAKQEAgLTkzMCw3ICs5MjcsNiBAQAogZXhpdDoKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIi1ydHdfaW5pdF9kcnZfc3dcbiIpKTsKIAotCV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIHJldDg7CiB9CkBAIC0xMTE1LDcgKzExMTEsNyBAQAogCiAJX2VudGVyX2NyaXRpY2FsX211dGV4KHBhZGFwdGVyLT5od19pbml0X211dGV4LCBOVUxMKTsKIAlyZXQgPSBfbmV0ZGV2X29wZW4ocG5ldGRldik7Ci0JX2V4aXRfY3JpdGljYWxfbXV0ZXgocGFkYXB0ZXItPmh3X2luaXRfbXV0ZXgsIE5VTEwpOworCW11dGV4X3VubG9jayhwYWRhcHRlci0+aHdfaW5pdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTIwOCw2ICsxMjA0LDcgQEAKIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCIrODhldV9kcnYgLSBkcnZfY2xvc2VcbiIpKTsKIApAQCAtMTI0Niw2ICsxMjQzLDkgQEAKIAlydHdfcDJwX2VuYWJsZShwYWRhcHRlciwgUDJQX1JPTEVfRElTQUJMRSk7CiAjZW5kaWYgLyogQ09ORklHXzg4RVVfUDJQICovCiAKKwlrZnJlZShkdm9iai0+ZmlybXdhcmUuc3pGd0J1ZmZlcik7CisJZHZvYmotPmZpcm13YXJlLnN6RndCdWZmZXIgPSBOVUxMOworCiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItODhldV9kcnYgLSBkcnZfY2xvc2VcbiIpKTsKIAlEQkdfODhFKCItODhldV9kcnYgLSBkcnZfY2xvc2UsIGJ1cCA9JWRcbiIsIHBhZGFwdGVyLT5idXApOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NkZXBfc2VydmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NkZXBfc2VydmljZS5jCmluZGV4IDhjM2IwNzcuLjI1NzlhNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMKQEAgLTU1LDI3ICs1NSw2IEBACiAJcmV0dXJuIG51bTsKIH0KIAotaW5saW5lIHU4ICpfcnR3X3ZtYWxsb2ModTMyIHN6KQotewotCXU4CSpwYnVmOwotCXBidWYgPSB2bWFsbG9jKHN6KTsKLQlyZXR1cm4gcGJ1ZjsKLX0KLQotaW5saW5lIHU4ICpfcnR3X3p2bWFsbG9jKHUzMiBzeikKLXsKLQl1OAkqcGJ1ZjsKLQlwYnVmID0gX3J0d192bWFsbG9jKHN6KTsKLQlpZiAocGJ1ZiAhPSBOVUxMKQotCQltZW1zZXQocGJ1ZiwgMCwgc3opOwotCXJldHVybiBwYnVmOwotfQotCi1pbmxpbmUgdm9pZCBfcnR3X3ZtZnJlZSh1OCAqcGJ1ZiwgdTMyIHN6KQotewotCXZmcmVlKHBidWYpOwotfQotCiB1OCAqX3J0d19tYWxsb2ModTMyIHN6KQogewogCXU4CSpwYnVmID0gTlVMTDsKQEAgLTExNCwxNiArOTMsNiBAQAogCWtmcmVlKHBidWYpOwogfQogCi1pbnQgX3J0d19tZW1jbXAodm9pZCAqZHN0LCB2b2lkICpzcmMsIHUzMiBzeikKLXsKLS8qIHVuZGVyIExpbnV4L0dOVS9HTGliYywgdGhlIHJldHVybiB2YWx1ZSBvZiBtZW1jbXAgZm9yIHR3byBzYW1lCi0gKiBtZW0uIGNodW5rIGlzIDAgKi8KLQlpZiAoIShtZW1jbXAoZHN0LCBzcmMsIHN6KSkpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIF9ydHdfbWVtc2V0KHZvaWQgKnBidWYsIGludCBjLCB1MzIgc3opCiB7CiAJbWVtc2V0KHBidWYsIGMsIHN6KTsKQEAgLTI1Miw3ICsyMjEsNyBAQAogCiAJcG5waSA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwogCi0JcG5waS0+cHJpdiA9IHJ0d196dm1hbGxvYyhzaXplb2ZfcHJpdik7CisJcG5waS0+cHJpdiA9IHZ6YWxsb2Moc2l6ZW9mX3ByaXYpOwogCWlmICghcG5waS0+cHJpdikgewogCQlmcmVlX25ldGRldihwbmV0ZGV2KTsKIAkJcG5ldGRldiA9IE5VTEw7CkBAIC0yNzYsNyArMjQ1LDcgQEAKIAlpZiAoIXBucGktPnByaXYpCiAJCWdvdG8gUkVUVVJOOwogCi0JcnR3X3ZtZnJlZShwbnBpLT5wcml2LCBwbnBpLT5zaXplb2ZfcHJpdik7CisJdmZyZWUocG5waS0+cHJpdik7CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIAogUkVUVVJOOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCmluZGV4IDJhMThiMzIuLmRhMzk3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxyZWN2X29zZGVwLmg+CiAKICNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8ZXRoZXJuZXQuaD4KICNpbmNsdWRlIDx1c2Jfb3BzLmg+CiAKIC8qIGluaXQgb3MgcmVsYXRlZCByZXNvdXJjZSBpbiBzdHJ1Y3QgcmVjdl9wcml2ICovCkBAIC0zNiwxNiArMzUsMTYgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLS8qIGFsbG9jIG9zIHJlbGF0ZWQgcmVzb3VyY2UgaW4gdW5pb24gcmVjdl9mcmFtZSAqLworLyogYWxsb2Mgb3MgcmVsYXRlZCByZXNvdXJjZSBpbiBzdHJ1Y3QgcmVjdl9mcmFtZSAqLwogaW50IHJ0d19vc19yZWN2X3Jlc291cmNlX2FsbG9jKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQorCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewotCXByZWN2ZnJhbWUtPnUuaGRyLnBrdF9uZXdhbGxvYyA9IE5VTEw7Ci0JcHJlY3ZmcmFtZS0+dS5oZHIucGt0ID0gTlVMTDsKKwlwcmVjdmZyYW1lLT5wa3RfbmV3YWxsb2MgPSBOVUxMOworCXByZWN2ZnJhbWUtPnBrdCA9IE5VTEw7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi0vKiBmcmVlIG9zIHJlbGF0ZWQgcmVzb3VyY2UgaW4gdW5pb24gcmVjdl9mcmFtZSAqLworLyogZnJlZSBvcyByZWxhdGVkIHJlc291cmNlIGluIHN0cnVjdCByZWN2X2ZyYW1lICovCiB2b2lkIHJ0d19vc19yZWN2X3Jlc291cmNlX2ZyZWUoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KQogewogfQpAQCAtMTE4LDI0ICsxMTcsMjMgQEAKIH0KIAogdm9pZCBydHdfaG9zdGFwZF9tbG1lX3J4KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSB1bmlvbiByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKKwkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCiB7CiB9CiAKIGludCBydHdfcmVjdl9pbmRpY2F0ZXBrdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgdW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCisJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQogewogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdjsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLV9mdW5jX2VudGVyXzsKIAogCXByZWN2cHJpdiA9ICYocGFkYXB0ZXItPnJlY3Zwcml2KTsKIAlwZnJlZV9yZWN2X3F1ZXVlID0gJihwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSk7CiAKLQlza2IgPSBwcmVjdl9mcmFtZS0+dS5oZHIucGt0OworCXNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7CiAJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9lcnJfLAogCQkJICgicnR3X3JlY3ZfaW5kaWNhdGVwa3QoKTpza2IgPT0gTlVMTCBzb21ldGhpbmcgd3JvbmchISEhXG4iKSk7CkBAIC0xNDUsMTggKzE0MywxOCBAQAogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKIAkJICgicnR3X3JlY3ZfaW5kaWNhdGVwa3QoKTpza2IgIT0gTlVMTCAhISFcbiIpKTsKIAlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAoInJ0d19yZWN2X2luZGljYXRlcGt0KCk6cHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2hlYWQgPSVwICBwcmVjdl9mcmFtZS0+aGRyLnJ4X2RhdGEgPSVwXG4iLAotCQkgcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2hlYWQsIHByZWN2X2ZyYW1lLT51Lmhkci5yeF9kYXRhKSk7CisJCSAoInJ0d19yZWN2X2luZGljYXRlcGt0KCk6cHJlY3ZfZnJhbWUtPnJ4X2hlYWQgPSVwICBwcmVjdl9mcmFtZS0+aGRyLnJ4X2RhdGEgPSVwXG4iLAorCQkgcHJlY3ZfZnJhbWUtPnJ4X2hlYWQsIHByZWN2X2ZyYW1lLT5yeF9kYXRhKSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJwcmVjdl9mcmFtZS0+aGRyLnJ4X3RhaWwgPSVwIHByZWN2X2ZyYW1lLT51Lmhkci5yeF9lbmQgPSVwIHByZWN2X2ZyYW1lLT5oZHIubGVuID0lZFxuIiwKLQkJIHByZWN2X2ZyYW1lLT51Lmhkci5yeF90YWlsLCBwcmVjdl9mcmFtZS0+dS5oZHIucnhfZW5kLAotCQkgcHJlY3ZfZnJhbWUtPnUuaGRyLmxlbikpOworCQkgKCJwcmVjdl9mcmFtZS0+aGRyLnJ4X3RhaWwgPSVwIHByZWN2X2ZyYW1lLT5yeF9lbmQgPSVwIHByZWN2X2ZyYW1lLT5oZHIubGVuID0lZFxuIiwKKwkJIHByZWN2X2ZyYW1lLT5yeF90YWlsLCBwcmVjdl9mcmFtZS0+cnhfZW5kLAorCQkgcHJlY3ZfZnJhbWUtPmxlbikpOwogCi0Jc2tiLT5kYXRhID0gcHJlY3ZfZnJhbWUtPnUuaGRyLnJ4X2RhdGE7CisJc2tiLT5kYXRhID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7CiAKLQlza2Jfc2V0X3RhaWxfcG9pbnRlcihza2IsIHByZWN2X2ZyYW1lLT51Lmhkci5sZW4pOworCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgcHJlY3ZfZnJhbWUtPmxlbik7CiAKLQlza2ItPmxlbiA9IHByZWN2X2ZyYW1lLT51Lmhkci5sZW47CisJc2tiLT5sZW4gPSBwcmVjdl9mcmFtZS0+bGVuOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAogCQkgKCJza2ItPmhlYWQgPSVwIHNrYi0+ZGF0YSA9JXAgc2tiLT50YWlsID0lcCBza2ItPmVuZCA9JXAgc2tiLT5sZW4gPSVkXG4iLApAQCAtMTY3LDExICsxNjUsMTEgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKnBza2IyID0gTlVMTDsKIAkJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKIAkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQkJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPnUuaGRyLmF0dHJpYjsKKwkJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKIAkJaW50IGJtY2FzdCA9IElTX01DQVNUKHBhdHRyaWItPmRzdCk7CiAKLQkJaWYgKCFfcnR3X21lbWNtcChwYXR0cmliLT5kc3QsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwKLQkJCQkgRVRIX0FMRU4pKSB7CisJCWlmIChtZW1jbXAocGF0dHJpYi0+ZHN0LCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksCisJCQkgICBFVEhfQUxFTikpIHsKIAkJCWlmIChibWNhc3QpIHsKIAkJCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8ocGFkYXB0ZXIpOwogCQkJCXBza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CkBAIC0yMDksMTQgKzIwNywxMyBAQAogX3JlY3ZfaW5kaWNhdGVwa3RfZW5kOgogCiAJLyogIHBvaW50ZXJzIHRvIE5VTEwgYmVmb3JlIHJ0d19mcmVlX3JlY3ZmcmFtZSgpICovCi0JcHJlY3ZfZnJhbWUtPnUuaGRyLnBrdCA9IE5VTEw7CisJcHJlY3ZfZnJhbWUtPnBrdCA9IE5VTEw7CiAKIAlydHdfZnJlZV9yZWN2ZnJhbWUocHJlY3ZfZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAogCQkgKCJcbiBydHdfcmVjdl9pbmRpY2F0ZXBrdCA6YWZ0ZXIgbmV0aWZfcnghISEhXG4iKSk7CiAKLV9mdW5jX2V4aXRfOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogCkBAIC0yMjUsNyArMjIyLDYgQEAKIAkgLyogZW5xdWV1ZSBiYWNrIHRvIGZyZWVfcmVjdl9xdWV1ZSAqLwogCXJ0d19mcmVlX3JlY3ZmcmFtZShwcmVjdl9mcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAKLV9mdW5jX2V4aXRfOwogCSByZXR1cm4gX0ZBSUw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3J0d19hbmRyb2lkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9ydHdfYW5kcm9pZC5jCmluZGV4IGEzYzJiYzUuLmNhMjczNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3J0d19hbmRyb2lkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcnR3X2FuZHJvaWQuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHJ0d19hbmRyb2lkLmg+CiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogI2luY2x1ZGUgPHJ0d19kZWJ1Zy5oPgotI2luY2x1ZGUgPGlvY3RsX2NmZzgwMjExLmg+CiAjaW5jbHVkZSA8cnR3X2lvY3RsX3NldC5oPgogCiBzdGF0aWMgY29uc3QgY2hhciAqYW5kcm9pZF93aWZpX2NtZF9zdHJbQU5EUk9JRF9XSUZJX0NNRF9NQVhdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKaW5kZXggMmY0MGZmNS4uMmU0OWNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8aGFsX2ludGYuaD4KICNpbmNsdWRlIDxydHdfdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+CiAKICNpbmNsdWRlIDx1c2JfdmVuZG9yX3JlcS5oPgpAQCAtMTYyLDcgKzE2Myw2IEBACiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpwZW5kcF9kZXNjOwogCXN0cnVjdCB1c2JfZGV2aWNlCSpwdXNiZDsKIAotX2Z1bmNfZW50ZXJfOwogCiAJcGR2b2JqcHJpdiA9IChzdHJ1Y3QgZHZvYmpfcHJpdiAqKXJ0d196bWFsbG9jKHNpemVvZigqcGR2b2JqcHJpdikpOwogCWlmIChwZHZvYmpwcml2ID09IE5VTEwpCkBAIC0yNTUsNyArMjU1LDYgQEAKIAkJcGR2b2JqcHJpdiA9IE5VTEw7CiAJfQogZXhpdDoKLV9mdW5jX2V4aXRfOwogCXJldHVybiBwZHZvYmpwcml2OwogfQogCkBAIC0yNjMsNyArMjYyLDYgQEAKIHsKIAlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSB1c2JfZ2V0X2ludGZkYXRhKHVzYl9pbnRmKTsKIAotX2Z1bmNfZW50ZXJfOwogCiAJdXNiX3NldF9pbnRmZGF0YSh1c2JfaW50ZiwgTlVMTCk7CiAJaWYgKGR2b2JqKSB7CkBAIC0yODgsNyArMjg2LDYgQEAKIAogCXVzYl9wdXRfZGV2KGludGVyZmFjZV90b191c2JkZXYodXNiX2ludGYpKTsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHN0YXRpYyB2b2lkIGNoaXBfYnlfdXNiX2lkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKQEAgLTM5MCw3ICszODcsNiBAQAogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlpZiAoKCFwYWRhcHRlci0+YnVwKSB8fCAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSB8fAogCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpKSB7CkBAIC00NDMsNyArNDM5LDYgQEAKIAl9IGVsc2UgewogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQotCV9mdW5jX2V4aXRfOwogCXJldHVybiAwOwogCiBlcnJvcl9leGl0OgpAQCAtNDU2LDcgKzQ1MSw2IEBACiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKIAotCV9mdW5jX2VudGVyXzsKIAogCWlmIChwYWRhcHRlcikgeyAvKiBzeXN0ZW0gcmVzdW1lICovCiAJCURCR184OEUoIj09PiBydHdfaHdfcmVzdW1lXG4iKTsKQEAgLTQ4OCw3ICs0ODIsNiBAQAogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gMDsKIGVycm9yX2V4aXQ6CkBAIC01MDcsNyArNTAwLDYgQEAKIAlpbnQgcmV0ID0gMDsKIAl1MzIgc3RhcnRfdGltZSA9IGppZmZpZXM7CiAKLQlfZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKCI9PT4gJXMgKCVzOiVkKVxuIiwgX19mdW5jX18sIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CiAKQEAgLTU2NCw3ICs1NTYsNiBAQAogCURCR184OEUoIjw9PT0gICVzIHJldHVybiAlZC4uLi4uLi4uLi4uLi4uIGluICVkbXNcbiIsIF9fZnVuY19fCiAJCSwgcmV0LCBydHdfZ2V0X3Bhc3NpbmdfdGltZV9tcyhzdGFydF90aW1lKSk7CiAKLQlfZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01ODgsNyArNTc5LDYgQEAKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gTlVMTDsKIAlpbnQgcmV0ID0gLTE7CiAJdTMyIHN0YXJ0X3RpbWUgPSBqaWZmaWVzOwotCV9mdW5jX2VudGVyXzsKIAogCURCR184OEUoIj09PiAlcyAoJXM6JWQpXG4iLCBfX2Z1bmNfXywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIApAQCAtNjI3LDcgKzYxNyw2IEBACiAJREJHXzg4RSgiPD09PSAgJXMgcmV0dXJuICVkLi4uLi4uLi4uLi4uLi4gaW4gJWRtc1xuIiwgX19mdW5jX18sCiAJCXJldCwgcnR3X2dldF9wYXNzaW5nX3RpbWVfbXMoc3RhcnRfdGltZSkpOwogCi0JX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQ3LDcgKzYzNiw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYgPSBOVUxMOwogCWludCBzdGF0dXMgPSBfRkFJTDsKIAotCXBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X3p2bWFsbG9jKHNpemVvZigqcGFkYXB0ZXIpKTsKKwlwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXZ6YWxsb2Moc2l6ZW9mKCpwYWRhcHRlcikpOwogCWlmIChwYWRhcHRlciA9PSBOVUxMKQogCQlnb3RvIGV4aXQ7CiAJcGFkYXB0ZXItPmR2b2JqID0gZHZvYmo7CkBAIC03NDcsNyArNzM2LDcgQEAKIAkJaWYgKHBuZXRkZXYpCiAJCQlydHdfZnJlZV9uZXRkZXYocG5ldGRldik7CiAJCWVsc2UgaWYgKHBhZGFwdGVyKQotCQkJcnR3X3ZtZnJlZSgodTggKilwYWRhcHRlciwgc2l6ZW9mKCpwYWRhcHRlcikpOworCQkJdmZyZWUocGFkYXB0ZXIpOwogCQlwYWRhcHRlciA9IE5VTEw7CiAJfQogZXhpdDoKQEAgLTgzNiw3ICs4MjUsNiBAQAogCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBkdm9iai0+aWYxOwogCi1fZnVuY19lbnRlcl87CiAKIAlEQkdfODhFKCIrcnR3X2Rldl9yZW1vdmVcbiIpOwogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiK2Rldl9yZW1vdmUoKVxuIikpOwpAQCAtODU1LDcgKzg0Myw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIi1kZXZfcmVtb3ZlKClcbiIpKTsKIAlEQkdfODhFKCItcjg3MXh1X2Rldl9yZW1vdmUsIGRvbmVcbiIpOwotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKaW5kZXggN2UzZjJmYS4uZmIwYmJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwpAQCAtODAsNyArODAsNiBAQAogCXN0cnVjdCB4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhOwogCi1fZnVuY19lbnRlcl87CiAKIAlzd2l0Y2ggKHB4bWl0YnVmLT5mbGFncykgewogCWNhc2UgVk9fUVVFVUVfSU5YOgpAQCAtMTU2LDggKzE1NSw2IEBACiAJcnR3X2ZyZWVfeG1pdGJ1ZihweG1pdHByaXYsIHB4bWl0YnVmKTsKIAogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKLQotX2Z1bmNfZXhpdF87CiB9CiAKIHUzMiB1c2Jfd3JpdGVfcG9ydChzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKndtZW0pCkBAIC0xNzQsNyArMTcxLDYgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSA9IChzdHJ1Y3QgeG1pdF9mcmFtZSAqKXB4bWl0YnVmLT5wcml2X2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JkID0gcGR2b2JqLT5wdXNiZGV2OwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgKCIrdXNiX3dyaXRlX3BvcnRcbiIpKTsKIApAQCAtMjU1LDcgKzI1MSw2IEBACiBleGl0OgogCWlmIChyZXQgIT0gX1NVQ0NFU1MpCiAJCXJ0d19mcmVlX3htaXRidWYocHhtaXRwcml2LCBweG1pdGJ1Zik7Ci1fZnVuY19leGl0XzsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMKaW5kZXggOTAwNTk3MS4uMmM4ZTNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAveG1pdF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYwpAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KICNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KIAotI2luY2x1ZGUgPGlmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8aXAuaD4KICNpbmNsdWRlIDx3aWZpLmg+CiAjaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgogI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KQEAgLTM5LDcgKzM3LDYgQEAKIAogdm9pZCBfcnR3X29wZW5fcGt0ZmlsZShzdHJ1Y3Qgc2tfYnVmZiAqcGt0cHRyLCBzdHJ1Y3QgcGt0X2ZpbGUgKnBmaWxlKQogewotX2Z1bmNfZW50ZXJfOwogCiAJcGZpbGUtPnBrdCA9IHBrdHB0cjsKIAlwZmlsZS0+Y3VyX2FkZHIgPSBwa3RwdHItPmRhdGE7CkBAIC00OSwxNCArNDYsMTIgQEAKIAogCXBmaWxlLT5jdXJfYnVmZmVyID0gcGZpbGUtPmJ1Zl9zdGFydDsKIAotX2Z1bmNfZXhpdF87CiB9CiAKIHVpbnQgX3J0d19wa3RmaWxlX3JlYWQgKHN0cnVjdCBwa3RfZmlsZSAqcGZpbGUsIHU4ICpybWVtLCB1aW50IHJsZW4pCiB7CiAJdWludAlsZW4gPSAwOwogCi1fZnVuY19lbnRlcl87CiAKIAlsZW4gPSAgcnR3X3JlbWFpbmRlcl9sZW4ocGZpbGUpOwogCWxlbiA9IChybGVuID4gbGVuKSA/IGxlbiA6IHJsZW47CkBAIC02NywyMSArNjIsMTcgQEAKIAlwZmlsZS0+Y3VyX2FkZHIgKz0gbGVuOwogCXBmaWxlLT5wa3RfbGVuIC09IGxlbjsKIAotX2Z1bmNfZXhpdF87CiAKIAlyZXR1cm4gbGVuOwogfQogCiBpbnQgcnR3X2VuZG9mcGt0ZmlsZShzdHJ1Y3QgcGt0X2ZpbGUgKnBmaWxlKQogewotX2Z1bmNfZW50ZXJfOwogCiAJaWYgKHBmaWxlLT5wa3RfbGVuID09IDApIHsKLQlfZnVuY19leGl0XzsKIAkJcmV0dXJuIHRydWU7CiAJfQogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTIwMCwxMyArMTkxLDEzIEBACiAKIAlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7CiAJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlwbGlzdCA9IGdldF9uZXh0KHBoZWFkKTsKKwlwbGlzdCA9IHBoZWFkLT5uZXh0OwogCiAJLyogZnJlZSBzdGEgYXNvY19xdWV1ZSAqLwogCXdoaWxlICghcnR3X2VuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSkgewotCQlwc3RhID0gTElTVF9DT05UQUlOT1IocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKKwkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwogCi0JCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCiAJCS8qIGF2b2lkICAgY29tZSBmcm9tIFNUQTEgYW5kIHNlbmQgYmFjayBTVEExICovCiAJCWlmICghbWVtY21wKHBzdGEtPmh3YWRkciwgJnNrYi0+ZGF0YVs2XSwgNikpCkBAIC0yNDYsNyArMjM3LDYgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXMzMiByZXMgPSAwOwogCi1fZnVuY19lbnRlcl87CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCIreG1pdF9lbnJ5XG4iKSk7CiAKQEAgLTI4Miw3ICsyNzIsNiBAQAogCiBleGl0OgogCi1fZnVuY19leGl0XzsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jCmluZGV4IGViMzNjNTEuLjUzZGE2MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMKQEAgLTEzMywxNCArMTMzLDEyIEBACiAJcFRyaXBsZSA9IChzdHJ1Y3QgY2hubF90eHBvd190cmlwbGUgKikocENvdXRyeUllICsgMyk7CiAJZm9yIChpID0gMDsgaSA8IE51bVRyaXBsZXM7IGkrKykgewogCQlpZiAoTWF4Q2hubE51bSA+PSBwVHJpcGxlLT5GaXJzdENobmwpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCIKLQkJCSAgICAgICAiIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCAocFRyaXBsZS0+Rmlyc3RDaG5sICsKIAkJICAgIHBUcmlwbGUtPk51bUNobmxzKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkICIKLQkJCSAgICAgICAiY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMlxuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtMTY3LDggKzE2NSw3IEBACiAJdTggTWF4VHhQd3JJbkRibSA9IDI1NTsKIAogCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCBDaGFubmVsKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkRPVDExRF9HZXRNYXhUeFB3ckluRGJtKCk6IEludmFsaWQgIgotCQkgICAgICAgIkNoYW5uZWxcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOwogCQlyZXR1cm4gTWF4VHhQd3JJbkRibTsKIAl9CiAJaWYgKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtDaGFubmVsXSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BjaS5oCmluZGV4IDM1NmFlYzQuLjRiOTQ2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wY2kuaApAQCAtMjgsMzEgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1dyaXRlUG9ydFVsb25nKHUzMiBwb3J0LCAgdTMyIHZhbCkKLXsKLQlvdXRsKHZhbCwgcG9ydCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBOZGlzUmF3V3JpdGVQb3J0VWNoYXIodTMyIHBvcnQsICB1OCB2YWwpCi17Ci0Jb3V0Yih2YWwsIHBvcnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1JlYWRQb3J0VWNoYXIodTMyIHBvcnQsIHU4ICpwdmFsKQotewotCSpwdmFsID0gaW5iKHBvcnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1JlYWRQb3J0VXNob3J0KHUzMiBwb3J0LCB1MTYgKnB2YWwpCi17Ci0JKnB2YWwgPSBpbncocG9ydCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBOZGlzUmF3UmVhZFBvcnRVbG9uZyh1MzIgcG9ydCwgdTMyICpwdmFsKQotewotCSpwdmFsID0gaW5sKHBvcnQpOwotfQotCiBzdHJ1Y3QgbXBfYWRhcHRlciB7CiAJdTgJCUxpbmtDdHJsUmVnOwogCkBAIC03MCwzMyArNDUsNiBAQAogCXU4CQlQY2lCcmlkZ2VMaW5rQ3RybFJlZzsKIH07CiAKLXN0cnVjdCBydF9wY2lfY2FwYWJfaGVhZGVyIHsKLQl1bnNpZ25lZCBjaGFyICAgQ2FwYWJpbGl0eUlEOwotCXVuc2lnbmVkIGNoYXIgICBOZXh0OwotfTsKLQotI2RlZmluZSBQQ0lfTUFYX0JSSURHRV9OVU1CRVIJCQkJMjU1Ci0jZGVmaW5lIFBDSV9NQVhfREVWSUNFUwkJCQkJCTMyCi0jZGVmaW5lIFBDSV9NQVhfRlVOQ1RJT04JCQkJCTgKLQotI2RlZmluZSBQQ0lfQ09ORl9BRERSRVNTCQkJCQkweDBDRjgKLSNkZWZpbmUgUENJX0NPTkZfREFUQQkJCQkJCTB4MENGQwotCi0jZGVmaW5lCVBDSV9DTEFTU19CUklER0VfREVWCQkJCTB4MDYKLSNkZWZpbmUJUENJX1NVQkNMQVNTX0JSX1BDSV9UT19QQ0kJCTB4MDQKLQotI2RlZmluZQlVMURPTlRDQVJFCQkJCQkJMHhGRgotI2RlZmluZQlVMkRPTlRDQVJFCQkJCQkJMHhGRkZGCi0jZGVmaW5lCVU0RE9OVENBUkUJCQkJCQkweEZGRkZGRkZGCi0KLSNkZWZpbmUJSU5URUxfVkVORE9SX0lECQkJCQkweDgwODYKLSNkZWZpbmUJU0lTX1ZFTkRPUl9JRAkJCQkJCTB4MTAzOQotI2RlZmluZQlBVElfVkVORE9SX0lECQkJCQkJMHgxMDAyCi0jZGVmaW5lCUFUSV9ERVZJQ0VfSUQJCQkJCQkweDc5MTQKLSNkZWZpbmUJQU1EX1ZFTkRPUl9JRAkJCQkJCTB4MTAyMgotCi0jZGVmaW5lIFBDSV9DQVBBQklMSVRZX0lEX1BDSV9FWFBSRVNTCQkweDEwCi0KIHN0cnVjdCBuZXRfZGV2aWNlOwogYm9vbCBydGw4MTkyX3BjaV9maW5kYWRhcHRlcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYwppbmRleCA2MjAyMzU4Li40OTg5OTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCkBAIC02MDksNyArNjA5LDcgQEAKIAlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKIAkJcmV0dXJuIC1FMkJJRzsKIAlkb3duKCZwcml2LT53eF9zZW0pOwotCXdycXUtPmRhdGEubGVuZ3RoID0gbWluKChzaXplX3QpIHdycXUtPmRhdGEubGVuZ3RoLCBzaXplb2YocHJpdi0+bmljaykpOworCXdycXUtPmRhdGEubGVuZ3RoID0gbWluX3Qoc2l6ZV90LCB3cnF1LT5kYXRhLmxlbmd0aCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKIAltZW1zZXQocHJpdi0+bmljaywgMCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKIAltZW1jcHkocHJpdi0+bmljaywgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKIAl1cCgmcHJpdi0+d3hfc2VtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYwppbmRleCA3Nzk2NDg4Li4xMWQwYTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCkBAIC05MzksMTIgKzkzOSwxMiBAQAogCWlmICh0eGIpIHsKIAkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpIHsKIAkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSB0eGItPnBheWxvYWRfc2l6ZTsKKwkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbGUxNl90b19jcHUodHhiLT5wYXlsb2FkX3NpemUpOwogCQkJcnRsbGliX3NvZnRtYWNfeG1pdCh0eGIsIGllZWUpOwogCQl9IGVsc2UgewogCQkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSh0eGIsIGRldikgPT0gMCkgewogCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7Ci0JCQkJc3RhdHMtPnR4X2J5dGVzICs9IHR4Yi0+cGF5bG9hZF9zaXplOworCQkJCXN0YXRzLT50eF9ieXRlcyArPSBsZTE2X3RvX2NwdSh0eGItPnBheWxvYWRfc2l6ZSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlydGxsaWJfdHhiX2ZyZWUodHhiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvRW5kaWFuRnJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9FbmRpYW5GcmVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjODVmYjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9FbmRpYW5GcmVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotI2lmbmRlZiBfX0lOQ19FTkRJQU5GUkVFX0gKLSNkZWZpbmUgX19JTkNfRU5ESUFORlJFRV9ICi0KLS8qCi0gKglDYWxsIGVuZGlhbiBmcmVlIGZ1bmN0aW9uIHdoZW4KLSAqCQkxLiBSZWFkL3dyaXRlIHBhY2tldCBjb250ZW50LgotICoJCTIuIEJlZm9yZSB3cml0ZSBpbnRlZ2VyIHRvIElPLgotICoJCTMuIEFmdGVyIHJlYWQgaW50ZWdlciBmcm9tIElPLgotICovCi0KLSNkZWZpbmUgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4gMTIzNCAgICAvKiBMU0IgZmlyc3Q6IGkzODYsIHZheCAqLwotI2RlZmluZSBfX01BQ0hJTkVfQklHX0VORElBTiAgICA0MzIxICAgIC8qIE1TQiBmaXJzdDogNjgwMDAsIGlibSwgbmV0LCBwcGMgKi8KLQotI2RlZmluZSBCWVRFX09SREVSIF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCi0KLSNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCi0vLyBDb252ZXJ0IGRhdGEKLSNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgRUYyQnl0ZShfdmFsKQkJCQkoKHUxNikoX3ZhbCkpCi0jZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQkJKCh1MzIpKF92YWwpKQotCi0jZWxzZQotLy8gQ29udmVydCBkYXRhCi0jZGVmaW5lIEVGMUJ5dGUoX3ZhbCkJCQkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIEVGMkJ5dGUoX3ZhbCkJCQkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXwoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCi0jZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKLQkJCQkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCl8XAotCQkJCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KXxcCi0JCQkJCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKLSNlbmRpZgotCi0vLyBSZWFkIGRhdGEgZnJvbSBtZW1vcnkKLSNkZWZpbmUgUmVhZEVGMUJ5dGUoX3B0cikJCUVGMUJ5dGUoKigodTggKikoX3B0cikpKQotI2RlZmluZSBSZWFkRUYyQnl0ZShfcHRyKQkJRUYyQnl0ZSgqKCh1MTYgKikoX3B0cikpKQotI2RlZmluZSBSZWFkRUY0Qnl0ZShfcHRyKQkJRUY0Qnl0ZSgqKCh1MzIgKikoX3B0cikpKQotCi0vLyBXcml0ZSBkYXRhIHRvIG1lbW9yeQotI2RlZmluZSBXcml0ZUVGMUJ5dGUoX3B0ciwgX3ZhbCkJKCooKHU4ICopKF9wdHIpKSk9RUYxQnl0ZShfdmFsKQotI2RlZmluZSBXcml0ZUVGMkJ5dGUoX3B0ciwgX3ZhbCkJKCooKHUxNiAqKShfcHRyKSkpPUVGMkJ5dGUoX3ZhbCkKLSNkZWZpbmUgV3JpdGVFRjRCeXRlKF9wdHIsIF92YWwpCSgqKCh1MzIgKikoX3B0cikpKT1FRjRCeXRlKF92YWwpCi0vLyBDb252ZXJ0IEhvc3Qgc3lzdGVtIHNwZWNpZmljIGJ5dGUgb3JkaW5nIChsaXR0ZW4gb3IgYmlnIGVuZGlhKSB0byBOZXR3b3JrIGJ5dGUgb3JkaW5nIChiaWcgZW5kaWFuKS4KLS8vIDIwMDYuMDUuMDcsIGJ5IHJjbmprby4KLSNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIEgyTjFCWVRFKF92YWwpCSgodTgpKF92YWwpKQotI2RlZmluZSBIMk4yQllURShfdmFsKQkoKCgoKHUxNikoX3ZhbCkpJjB4MDBmZik8PDgpfFwKLQkJCSgoKCh1MTYpKF92YWwpKSYweGZmMDApPj44KSkKLSNkZWZpbmUgSDJONEJZVEUoX3ZhbCkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKLQkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCkJfFwKLQkJCSgoKCh1MzIpKF92YWwpKSYweDAwZmYwMDAwKT4+OCkJfFwKLQkJCSgoKCh1MzIpKF92YWwpKSYweGZmMDAwMDAwKT4+MjQpKQotI2Vsc2UKLSNkZWZpbmUgSDJOMUJZVEUoX3ZhbCkJCQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgSDJOMkJZVEUoX3ZhbCkJCQkoKHUxNikoX3ZhbCkpCi0jZGVmaW5lIEgyTjRCWVRFKF92YWwpCQkJKCh1MzIpKF92YWwpKQotI2VuZGlmCi0KLS8vIENvbnZlcnQgZnJvbSBOZXR3b3JrIGJ5dGUgb3JkaW5nIChiaWcgZW5kaWFuKSB0byBIb3N0IHN5c3RlbSBzcGVjaWZpYyBieXRlIG9yZGluZyAobGl0dGVuIG9yIGJpZyBlbmRpYSkuCi0vLyAyMDA2LjA1LjA3LCBieSByY25qa28uCi0jaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgotI2RlZmluZSBOMkgxQllURShfdmFsKQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgTjJIMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCi0JCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCi0jZGVmaW5lIE4ySDRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKLSNlbHNlCi0jZGVmaW5lIE4ySDFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIE4ySDJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQotI2RlZmluZSBOMkg0QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKLSNlbmRpZgotCi0vLwotLy8JRXhhbXBsZToKLS8vCQlCSVRfTEVOX01BU0tfMzIoMCkgPT4gMHgwMDAwMDAwMAotLy8JCUJJVF9MRU5fTUFTS18zMigxKSA9PiAweDAwMDAwMDAxCi0vLwkJQklUX0xFTl9NQVNLXzMyKDIpID0+IDB4MDAwMDAwMDMKLS8vCQlCSVRfTEVOX01BU0tfMzIoMzIpID0+IDB4RkZGRkZGRkYKLS8vCi0jZGVmaW5lIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgKDB4RkZGRkZGRkYgPj4gKDMyIC0gKF9fQml0TGVuKSkpCi0vLwotLy8JRXhhbXBsZToKLS8vCQlCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDAsIDIpID0+IDB4MDAwMDAwMDMKLS8vCQlCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDE2LCAyKSA9PiAweDAwMDMwMDAwCi0vLwotI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKLQotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCVJldHVybiA0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nIGZyb20KLS8vCQk0LWJ5dGUgcG9pbnRlciBpbiBsaXR0ZW4tZW5kaWFuIHN5c3RlbS4KLS8vCi0jZGVmaW5lIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSAoRUY0Qnl0ZSgqKCh1MzIgKikoX19wU3RhcnQpKSkpCi0KLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlUcmFuc2xhdGUgc3ViZmllbGQgKGNvbnRpbnVvdXMgYml0cyBpbiBsaXR0bGUtZW5kaWFuKSBvZiA0LWJ5dGUgdmFsdWUgaW4gbGl0dGVuIGJ5dGUgdG8KLS8vCQk0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nLgotLy8KLSNkZWZpbmUgTEVfQklUU19UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICAoIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAotCSAgJiBcCi0JICBCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pIFwKLQkpCi0KLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlNYXNrIHN1YmZpZWxkIChjb250aW51b3VzIGJpdHMgaW4gbGl0dGxlLWVuZGlhbikgb2YgNC1ieXRlIHZhbHVlIGluIGxpdHRlbiBieXRlIG9yZWRlcmluZwotLy8JCWFuZCByZXR1cm4gdGhlIHJlc3VsdCBpbiA0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nLgotLy8KLSNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzRCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSBcCi0JICAmIFwKLQkgICggfkJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKLQkpCi0KLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlTZXQgc3ViZmllbGQgb2YgbGl0dGxlLWVuZGlhbiA0LWJ5dGUgdmFsdWUgdG8gc3BlY2lmaWVkIHZhbHVlLgotLy8KLSNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAotCSooKHUzMiAqKShfX3BTdGFydCkpID0gXAotCUVGNEJ5dGUoIFwKLQlMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCXwgXAotCSggKCgodTMyKV9fVmFsdWUpICYgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKLSAgICAgICApOwotCi0KLSNkZWZpbmUgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCi0JKDB4RkZGRiA+PiAoMTYgLSAoX19CaXRMZW4pKSkKLQotI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCShCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCi0KLSNkZWZpbmUgTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpIFwKLQkoRUYyQnl0ZSgqKCh1MTYgKikoX19wU3RhcnQpKSkpCi0KLSNkZWZpbmUgTEVfQklUU19UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICAoIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAotCSAgJiBcCi0JICBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIFwKLQkpCi0KLSNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcFN0YXJ0KSBcCi0JICAmIFwKLQkgICggfkJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKLQkpCi0KLSNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAotCSooKHUxNiAqKShfX3BTdGFydCkpID0gXAotCUVGMkJ5dGUoIFwKLQkJTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkJfCBcCi0JCSggKCgodTE2KV9fVmFsdWUpICYgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKLSAgICAgICApOwotCi0jZGVmaW5lIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSBcCi0JKDB4RkYgPj4gKDggLSAoX19CaXRMZW4pKSkKLQotI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQotCi0jZGVmaW5lIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSBcCi0JKEVGMUJ5dGUoKigodTggKikoX19wU3RhcnQpKSkpCi0KLSNkZWZpbmUgTEVfQklUU19UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICAoIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAotCSAgJiBcCi0JICBCSVRfTEVOX01BU0tfOChfX0JpdExlbikgXAotCSkKLQotI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpIFwKLQkgICYgXAotCSAgKCB+QklUX09GRlNFVF9MRU5fTUFTS184KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKSBcCi0JKQotCi0jZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4sIF9fVmFsdWUpIFwKLQkqKCh1OCAqKShfX3BTdGFydCkpID0gXAotCUVGMUJ5dGUoIFwKLQkJTEVfQklUU19DTEVBUkVEX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkJfCBcCi0JCSggKCgodTgpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfOChfX0JpdExlbikpIDw8IChfX0JpdE9mZnNldCkgKSBcCi0gICAgICAgKTsKLQotI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRU5ESUFORlJFRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2Flcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjMTAyMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2Flcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBBRVMgQ2lwaGVyIEFsZ29yaXRobS4KLSAqCi0gKiBCYXNlZCBvbiBCcmlhbiBHbGFkbWFuJ3MgY29kZS4KLSAqCi0gKiBMaW51eCBkZXZlbG9wZXJzOgotICogIEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KLSAqICBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAaHZybGFiLm9yZz4KLSAqICBLeWxlIE1jTWFydGluIDxreWxlQGRlYmlhbi5vcmc+Ci0gKiAgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+IChjb252ZXJzaW9uIHRvIDIuNSBBUEkpLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIERyIEJyaWFuIEdsYWRtYW4gPGJyZ0BnbGFkbWFuLm1lLnVrPiwgV29yY2VzdGVyLCBVSy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogTElDRU5TRSBURVJNUwotICoKLSAqIFRoZSBmcmVlIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeQotICogZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJvdmlkZWQgdGhhdDoKLSAqCi0gKiAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOwotICoKLSAqICAgMi4gZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiAgICAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBhc3NvY2lhdGVkIG1hdGVyaWFsczsKLSAqCi0gKiAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3MgbmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzCi0gKiAgICAgIGJ1aWx0IHVzaW5nIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQUxURVJOQVRJVkVMWSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBpbiBmdWxsLCB0aGlzIHByb2R1Y3QKLSAqIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLAotICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCi0gKgotICogRElTQ0xBSU1FUgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQgd2FycmFudGllcwotICogaW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGNvcnJlY3RuZXNzCi0gKiBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qIFNvbWUgY2hhbmdlcyBmcm9tIHRoZSBHbGFkbWFuIHZlcnNpb246Ci0gICAgcy9SSUpOREFFTChlX2tleSkvRV9LRVkvZwotICAgIHMvUklKTkRBRUwoZF9rZXkpL0RfS0VZL2cKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotI2RlZmluZSBBRVNfTUlOX0tFWV9TSVpFCTE2Ci0jZGVmaW5lIEFFU19NQVhfS0VZX1NJWkUJMzIKLQotI2RlZmluZSBBRVNfQkxPQ0tfU0laRQkJMTYKLQotc3RhdGljIGlubGluZQotdTMyIGdlbmVyaWNfcm90cjMyIChjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgYml0cykKLXsKLQljb25zdCB1bnNpZ25lZCBuID0gYml0cyAlIDMyOwotCXJldHVybiAoeCA+PiBuKSB8ICh4IDw8ICgzMiAtIG4pKTsKLX0KLQotc3RhdGljIGlubGluZQotdTMyIGdlbmVyaWNfcm90bDMyIChjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgYml0cykKLXsKLQljb25zdCB1bnNpZ25lZCBuID0gYml0cyAlIDMyOwotCXJldHVybiAoeCA8PCBuKSB8ICh4ID4+ICgzMiAtIG4pKTsKLX0KLQotI2RlZmluZSByb3RsIGdlbmVyaWNfcm90bDMyCi0jZGVmaW5lIHJvdHIgZ2VuZXJpY19yb3RyMzIKLQotLyoKLSAqICNkZWZpbmUgYnl0ZSh4LCBucikgKCh1bnNpZ25lZCBjaGFyKSgoeCkgPj4gKG5yKjgpKSkKLSAqLwotaW5saW5lIHN0YXRpYyB1OAotYnl0ZShjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgbikKLXsKLQlyZXR1cm4geCA+PiAobiA8PCAzKTsKLX0KLQotI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCB1MzIgKikoeCkpCi0jZGVmaW5lIHUzMl9vdXQodG8sIGZyb20pICgqKHUzMiAqKSh0bykgPSBjcHVfdG9fbGUzMihmcm9tKSkKLQotc3RydWN0IGFlc19jdHggewotCWludCBrZXlfbGVuZ3RoOwotCXUzMiBFWzYwXTsKLQl1MzIgRFs2MF07Ci19OwotCi0jZGVmaW5lIEVfS0VZIGN0eC0+RQotI2RlZmluZSBEX0tFWSBjdHgtPkQKLQotc3RhdGljIHU4IHBvd190YWJbMjU2XSBfX2luaXRkYXRhOwotc3RhdGljIHU4IGxvZ190YWJbMjU2XSBfX2luaXRkYXRhOwotc3RhdGljIHU4IHNieF90YWJbMjU2XSBfX2luaXRkYXRhOwotc3RhdGljIHU4IGlzYl90YWJbMjU2XSBfX2luaXRkYXRhOwotc3RhdGljIHUzMiByY29fdGFiWzEwXTsKLXN0YXRpYyB1MzIgZnRfdGFiWzRdWzI1Nl07Ci1zdGF0aWMgdTMyIGl0X3RhYls0XVsyNTZdOwotCi1zdGF0aWMgdTMyIGZsX3RhYls0XVsyNTZdOwotc3RhdGljIHUzMiBpbF90YWJbNF1bMjU2XTsKLQotc3RhdGljIGlubGluZSB1OCBfX2luaXQKLWZfbXVsdCAodTggYSwgdTggYikKLXsKLQl1OCBhYSA9IGxvZ190YWJbYV0sIGNjID0gYWEgKyBsb2dfdGFiW2JdOwotCi0JcmV0dXJuIHBvd190YWJbY2MgKyAoY2MgPCBhYSA/IDEgOiAwKV07Ci19Ci0KLSNkZWZpbmUgZmZfbXVsdChhLGIpICAgIChhICYmIGIgPyBmX211bHQoYSwgYikgOiAwKQotCi0jZGVmaW5lIGZfcm4oYm8sIGJpLCBuLCBrKQkJCQkJXAotICAgIGJvW25dID0gIGZ0X3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKLQkgICAgIGZ0X3RhYlsxXVtieXRlKGJpWyhuICsgMSkgJiAzXSwxKV0gXgkJXAotCSAgICAgZnRfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCi0JICAgICBmdF90YWJbM11bYnl0ZShiaVsobiArIDMpICYgM10sMyldIF4gKihrICsgbikKLQotI2RlZmluZSBpX3JuKGJvLCBiaSwgbiwgaykJCQkJCVwKLSAgICBib1tuXSA9ICBpdF90YWJbMF1bYnl0ZShiaVtuXSwwKV0gXgkJCQlcCi0JICAgICBpdF90YWJbMV1bYnl0ZShiaVsobiArIDMpICYgM10sMSldIF4JCVwKLQkgICAgIGl0X3RhYlsyXVtieXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXAotCSAgICAgaXRfdGFiWzNdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDMpXSBeICooayArIG4pCi0KLSNkZWZpbmUgbHNfYm94KHgpCQkJCVwKLSAgICAoIGZsX3RhYlswXVtieXRlKHgsIDApXSBeCQkJXAotICAgICAgZmxfdGFiWzFdW2J5dGUoeCwgMSldIF4JCQlcCi0gICAgICBmbF90YWJbMl1bYnl0ZSh4LCAyKV0gXgkJCVwKLSAgICAgIGZsX3RhYlszXVtieXRlKHgsIDMpXSApCi0KLSNkZWZpbmUgZl9ybChibywgYmksIG4sIGspCQkJCQlcCi0gICAgYm9bbl0gPSAgZmxfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAotCSAgICAgZmxfdGFiWzFdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDEpXSBeCQlcCi0JICAgICBmbF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKLQkgICAgIGZsX3RhYlszXVtieXRlKGJpWyhuICsgMykgJiAzXSwzKV0gXiAqKGsgKyBuKQotCi0jZGVmaW5lIGlfcmwoYm8sIGJpLCBuLCBrKQkJCQkJXAotICAgIGJvW25dID0gIGlsX3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKLQkgICAgIGlsX3RhYlsxXVtieXRlKGJpWyhuICsgMykgJiAzXSwxKV0gXgkJXAotCSAgICAgaWxfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCi0JICAgICBpbF90YWJbM11bYnl0ZShiaVsobiArIDEpICYgM10sMyldIF4gKihrICsgbikKLQotc3RhdGljIHZvaWQgX19pbml0Ci1nZW5fdGFicyAodm9pZCkKLXsKLQl1MzIgaSwgdDsKLQl1OCBwLCBxOwotCi0JLyogbG9nIGFuZCBwb3dlciB0YWJsZXMgZm9yIEdGKDIqKjgpIGZpbml0ZSBmaWVsZCB3aXRoCi0JICAgMHgwMTFiIGFzIG1vZHVsYXIgcG9seW5vbWlhbCAtIHRoZSBzaW1wbGVzdCBwcmltaXRpdmUKLQkgICByb290IGlzIDB4MDMsIHVzZWQgaGVyZSB0byBnZW5lcmF0ZSB0aGUgdGFibGVzICovCi0KLQlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDI1NjsgKytpKSB7Ci0JCXBvd190YWJbaV0gPSAodTgpIHA7Ci0JCWxvZ190YWJbcF0gPSAodTgpIGk7Ci0KLQkJcCBePSAocCA8PCAxKSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7Ci0JfQotCi0JbG9nX3RhYlsxXSA9IDA7Ci0KLQlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDEwOyArK2kpIHsKLQkJcmNvX3RhYltpXSA9IHA7Ci0KLQkJcCA9IChwIDw8IDEpIF4gKHAgJiAweDgwID8gMHgwMWIgOiAwKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLQkJcCA9IChpID8gcG93X3RhYlsyNTUgLSBsb2dfdGFiW2ldXSA6IDApOwotCQlxID0gKChwID4+IDcpIHwgKHAgPDwgMSkpIF4gKChwID4+IDYpIHwgKHAgPDwgMikpOwotCQlwIF49IDB4NjMgXiBxIF4gKChxID4+IDYpIHwgKHEgPDwgMikpOwotCQlzYnhfdGFiW2ldID0gcDsKLQkJaXNiX3RhYltwXSA9ICh1OCkgaTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLQkJcCA9IHNieF90YWJbaV07Ci0KLQkJdCA9IHA7Ci0JCWZsX3RhYlswXVtpXSA9IHQ7Ci0JCWZsX3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOwotCQlmbF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7Ci0JCWZsX3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKLQotCQl0ID0gKCh1MzIpIGZmX211bHQgKDIsIHApKSB8Ci0JCSAgICAoKHUzMikgcCA8PCA4KSB8Ci0JCSAgICAoKHUzMikgcCA8PCAxNikgfCAoKHUzMikgZmZfbXVsdCAoMywgcCkgPDwgMjQpOwotCi0JCWZ0X3RhYlswXVtpXSA9IHQ7Ci0JCWZ0X3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOwotCQlmdF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7Ci0JCWZ0X3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKLQotCQlwID0gaXNiX3RhYltpXTsKLQotCQl0ID0gcDsKLQkJaWxfdGFiWzBdW2ldID0gdDsKLQkJaWxfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7Ci0JCWlsX3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKLQkJaWxfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOwotCi0JCXQgPSAoKHUzMikgZmZfbXVsdCAoMTQsIHApKSB8Ci0JCSAgICAoKHUzMikgZmZfbXVsdCAoOSwgcCkgPDwgOCkgfAotCQkgICAgKCh1MzIpIGZmX211bHQgKDEzLCBwKSA8PCAxNikgfAotCQkgICAgKCh1MzIpIGZmX211bHQgKDExLCBwKSA8PCAyNCk7Ci0KLQkJaXRfdGFiWzBdW2ldID0gdDsKLQkJaXRfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7Ci0JCWl0X3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKLQkJaXRfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOwotCX0KLX0KLQotI2RlZmluZSBzdGFyX3goeCkgKCgoeCkgJiAweDdmN2Y3ZjdmKSA8PCAxKSBeICgoKCh4KSAmIDB4ODA4MDgwODApID4+IDcpICogMHgxYikKLQotI2RlZmluZSBpbWl4X2NvbCh5LHgpICAgICAgIFwKLSAgICB1ICAgPSBzdGFyX3goeCk7ICAgICAgICBcCi0gICAgdiAgID0gc3Rhcl94KHUpOyAgICAgICAgXAotICAgIHcgICA9IHN0YXJfeCh2KTsgICAgICAgIFwKLSAgICB0ICAgPSB3IF4gKHgpOyAgICAgICAgICBcCi0gICAoeSkgID0gdSBeIHYgXiB3OyAgICAgICAgXAotICAgKHkpIF49IHJvdHIodSBeIHQsICA4KSBeIFwKLQkgIHJvdHIodiBeIHQsIDE2KSBeIFwKLQkgIHJvdHIodCwyNCkKLQotLyogaW5pdGlhbGlzZSB0aGUga2V5IHNjaGVkdWxlIGZyb20gdGhlIHVzZXIgc3VwcGxpZWQga2V5ICovCi0KLSNkZWZpbmUgbG9vcDQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgdCA9IHJvdHIodCwgIDgpOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsgICAgXAotICAgIHQgXj0gRV9LRVlbNCAqIGldOyAgICAgRV9LRVlbNCAqIGkgKyA0XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzQgKiBpICsgMV07IEVfS0VZWzQgKiBpICsgNV0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs0ICogaSArIDJdOyBFX0tFWVs0ICogaSArIDZdID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAzXTsgRV9LRVlbNCAqIGkgKyA3XSA9IHQ7ICAgIFwKLX0KLQotI2RlZmluZSBsb29wNihpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICB0ID0gcm90cih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgICBcCi0gICAgdCBePSBFX0tFWVs2ICogaV07ICAgICBFX0tFWVs2ICogaSArIDZdID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAxXTsgRV9LRVlbNiAqIGkgKyA3XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzYgKiBpICsgMl07IEVfS0VZWzYgKiBpICsgOF0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs2ICogaSArIDNdOyBFX0tFWVs2ICogaSArIDldID0gdDsgICAgXAotICAgIHQgXj0gRV9LRVlbNiAqIGkgKyA0XTsgRV9LRVlbNiAqIGkgKyAxMF0gPSB0OyAgIFwKLSAgICB0IF49IEVfS0VZWzYgKiBpICsgNV07IEVfS0VZWzYgKiBpICsgMTFdID0gdDsgICBcCi19Ci0KLSNkZWZpbmUgbG9vcDgoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgdCA9IHJvdHIodCwgIDgpOyA7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgXAotICAgIHQgXj0gRV9LRVlbOCAqIGldOyAgICAgRV9LRVlbOCAqIGkgKyA4XSA9IHQ7ICAgIFwKLSAgICB0IF49IEVfS0VZWzggKiBpICsgMV07IEVfS0VZWzggKiBpICsgOV0gPSB0OyAgICBcCi0gICAgdCBePSBFX0tFWVs4ICogaSArIDJdOyBFX0tFWVs4ICogaSArIDEwXSA9IHQ7ICAgXAotICAgIHQgXj0gRV9LRVlbOCAqIGkgKyAzXTsgRV9LRVlbOCAqIGkgKyAxMV0gPSB0OyAgIFwKLSAgICB0ICA9IEVfS0VZWzggKiBpICsgNF0gXiBsc19ib3godCk7ICAgIFwKLSAgICBFX0tFWVs4ICogaSArIDEyXSA9IHQ7ICAgICAgICAgICAgICAgIFwKLSAgICB0IF49IEVfS0VZWzggKiBpICsgNV07IEVfS0VZWzggKiBpICsgMTNdID0gdDsgICBcCi0gICAgdCBePSBFX0tFWVs4ICogaSArIDZdOyBFX0tFWVs4ICogaSArIDE0XSA9IHQ7ICAgXAotICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA3XTsgRV9LRVlbOCAqIGkgKyAxNV0gPSB0OyAgIFwKLX0KLQotc3RhdGljIGludAotYWVzX3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCi17Ci0Jc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7Ci0JdTMyIGksIHQsIHUsIHYsIHc7Ci0KLQlpZiAoa2V5X2xlbiAhPSAxNiAmJiBrZXlfbGVuICE9IDI0ICYmIGtleV9sZW4gIT0gMzIpIHsKLQkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOwotCi0JRV9LRVlbMF0gPSB1MzJfaW4gKGluX2tleSk7Ci0JRV9LRVlbMV0gPSB1MzJfaW4gKGluX2tleSArIDQpOwotCUVfS0VZWzJdID0gdTMyX2luIChpbl9rZXkgKyA4KTsKLQlFX0tFWVszXSA9IHUzMl9pbiAoaW5fa2V5ICsgMTIpOwotCi0Jc3dpdGNoIChrZXlfbGVuKSB7Ci0JY2FzZSAxNjoKLQkJdCA9IEVfS0VZWzNdOwotCQlmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKLQkJCWxvb3A0IChpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDI0OgotCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOwotCQl0ID0gRV9LRVlbNV0gPSB1MzJfaW4gKGluX2tleSArIDIwKTsKLQkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKLQkJCWxvb3A2IChpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDMyOgotCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOwotCQlFX0tFWVs1XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjApOwotCQlFX0tFWVs2XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjQpOwotCQl0ID0gRV9LRVlbN10gPSB1MzJfaW4gKGluX2tleSArIDI4KTsKLQkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKLQkJCWxvb3A4IChpKTsKLQkJYnJlYWs7Ci0JfQotCi0JRF9LRVlbMF0gPSBFX0tFWVswXTsKLQlEX0tFWVsxXSA9IEVfS0VZWzFdOwotCURfS0VZWzJdID0gRV9LRVlbMl07Ci0JRF9LRVlbM10gPSBFX0tFWVszXTsKLQotCWZvciAoaSA9IDQ7IGkgPCBrZXlfbGVuICsgMjQ7ICsraSkgewotCQlpbWl4X2NvbCAoRF9LRVlbaV0sIEVfS0VZW2ldKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZW5jcnlwdCBhIGJsb2NrIG9mIHRleHQgKi8KLQotI2RlZmluZSBmX25yb3VuZChibywgYmksIGspIFwKLSAgICBmX3JuKGJvLCBiaSwgMCwgayk7ICAgICBcCi0gICAgZl9ybihibywgYmksIDEsIGspOyAgICAgXAotICAgIGZfcm4oYm8sIGJpLCAyLCBrKTsgICAgIFwKLSAgICBmX3JuKGJvLCBiaSwgMywgayk7ICAgICBcCi0gICAgayArPSA0Ci0KLSNkZWZpbmUgZl9scm91bmQoYm8sIGJpLCBrKSBcCi0gICAgZl9ybChibywgYmksIDAsIGspOyAgICAgXAotICAgIGZfcmwoYm8sIGJpLCAxLCBrKTsgICAgIFwKLSAgICBmX3JsKGJvLCBiaSwgMiwgayk7ICAgICBcCi0gICAgZl9ybChibywgYmksIDMsIGspCi0KLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKLXsKLQljb25zdCBzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKLQl1MzIgYjBbNF0sIGIxWzRdOwotCWNvbnN0IHUzMiAqa3AgPSBFX0tFWSArIDQ7Ci0KLQliMFswXSA9IHUzMl9pbiAoaW4pIF4gRV9LRVlbMF07Ci0JYjBbMV0gPSB1MzJfaW4gKGluICsgNCkgXiBFX0tFWVsxXTsKLQliMFsyXSA9IHUzMl9pbiAoaW4gKyA4KSBeIEVfS0VZWzJdOwotCWIwWzNdID0gdTMyX2luIChpbiArIDEyKSBeIEVfS0VZWzNdOwotCi0JaWYgKGN0eC0+a2V5X2xlbmd0aCA+IDI0KSB7Ci0JCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQkJZl9ucm91bmQgKGIwLCBiMSwga3ApOwotCX0KLQotCWlmIChjdHgtPmtleV9sZW5ndGggPiAxNikgewotCQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQl9Ci0KLQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JZl9ucm91bmQgKGIwLCBiMSwga3ApOwotCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlmX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JZl9ucm91bmQgKGIxLCBiMCwga3ApOwotCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JZl9ucm91bmQgKGIwLCBiMSwga3ApOwotCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlmX2xyb3VuZCAoYjAsIGIxLCBrcCk7Ci0KLQl1MzJfb3V0IChvdXQsIGIwWzBdKTsKLQl1MzJfb3V0IChvdXQgKyA0LCBiMFsxXSk7Ci0JdTMyX291dCAob3V0ICsgOCwgYjBbMl0pOwotCXUzMl9vdXQgKG91dCArIDEyLCBiMFszXSk7Ci19Ci0KLS8qIGRlY3J5cHQgYSBibG9jayBvZiB0ZXh0ICovCi0KLSNkZWZpbmUgaV9ucm91bmQoYm8sIGJpLCBrKSBcCi0gICAgaV9ybihibywgYmksIDAsIGspOyAgICAgXAotICAgIGlfcm4oYm8sIGJpLCAxLCBrKTsgICAgIFwKLSAgICBpX3JuKGJvLCBiaSwgMiwgayk7ICAgICBcCi0gICAgaV9ybihibywgYmksIDMsIGspOyAgICAgXAotICAgIGsgLT0gNAotCi0jZGVmaW5lIGlfbHJvdW5kKGJvLCBiaSwgaykgXAotICAgIGlfcmwoYm8sIGJpLCAwLCBrKTsgICAgIFwKLSAgICBpX3JsKGJvLCBiaSwgMSwgayk7ICAgICBcCi0gICAgaV9ybChibywgYmksIDIsIGspOyAgICAgXAotICAgIGlfcmwoYm8sIGJpLCAzLCBrKQotCi1zdGF0aWMgdm9pZCBhZXNfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCi17Ci0JY29uc3Qgc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7Ci0JdTMyIGIwWzRdLCBiMVs0XTsKLQljb25zdCBpbnQga2V5X2xlbiA9IGN0eC0+a2V5X2xlbmd0aDsKLQljb25zdCB1MzIgKmtwID0gRF9LRVkgKyBrZXlfbGVuICsgMjA7Ci0KLQliMFswXSA9IHUzMl9pbiAoaW4pIF4gRV9LRVlba2V5X2xlbiArIDI0XTsKLQliMFsxXSA9IHUzMl9pbiAoaW4gKyA0KSBeIEVfS0VZW2tleV9sZW4gKyAyNV07Ci0JYjBbMl0gPSB1MzJfaW4gKGluICsgOCkgXiBFX0tFWVtrZXlfbGVuICsgMjZdOwotCWIwWzNdID0gdTMyX2luIChpbiArIDEyKSBeIEVfS0VZW2tleV9sZW4gKyAyN107Ci0KLQlpZiAoa2V5X2xlbiA+IDI0KSB7Ci0JCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQkJaV9ucm91bmQgKGIwLCBiMSwga3ApOwotCX0KLQotCWlmIChrZXlfbGVuID4gMTYpIHsKLQkJaV9ucm91bmQgKGIxLCBiMCwga3ApOwotCQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JfQotCi0JaV9ucm91bmQgKGIxLCBiMCwga3ApOwotCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JaV9ucm91bmQgKGIwLCBiMSwga3ApOwotCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKLQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7Ci0JaV9ucm91bmQgKGIxLCBiMCwga3ApOwotCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKLQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7Ci0JaV9scm91bmQgKGIwLCBiMSwga3ApOwotCi0JdTMyX291dCAob3V0LCBiMFswXSk7Ci0JdTMyX291dCAob3V0ICsgNCwgYjBbMV0pOwotCXUzMl9vdXQgKG91dCArIDgsIGIwWzJdKTsKLQl1MzJfb3V0IChvdXQgKyAxMiwgYjBbM10pOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0gewotCS5jcmFfbmFtZQkJPQkiYWVzIiwKLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCi0JLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCi0JLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCi0JLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCi0JLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFlc19hbGcuY3JhX2xpc3QpLAotCS5jcmFfdQkJCT0JewotCQkuY2lwaGVyID0gewotCQkJLmNpYV9taW5fa2V5c2l6ZQk9CUFFU19NSU5fS0VZX1NJWkUsCi0JCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKLQkJCS5jaWFfc2V0a2V5CQk9CWFlc19zZXRfa2V5LAotCQkJLmNpYV9lbmNyeXB0CQk9CWFlc19lbmNyeXB0LAotCQkJLmNpYV9kZWNyeXB0CQk9CWFlc19kZWNyeXB0Ci0JCX0KLQl9Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhZXNfaW5pdCh2b2lkKQotewotCWdlbl90YWJzKCk7Ci0JcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWVzX2Zpbmkodm9pZCkKLXsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOwotfQotCi1tb2R1bGVfaW5pdChhZXNfaW5pdCk7Ci1tb2R1bGVfZXhpdChhZXNfZmluaSk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiUmlqbmRhZWwgKEFFUykgQ2lwaGVyIEFsZ29yaXRobSIpOwotTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcmM0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FyYzQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5MGU5YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FyYzQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkKLSAqCi0gKiBBUkM0IENpcGhlciBBbGdvcml0aG0KLSAqCi0gKiBKb24gT2JlcmhlaWRlIDxqb25Ab2JlcmhlaWRlLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0KLSNkZWZpbmUgQVJDNF9NSU5fS0VZX1NJWkUJMQotI2RlZmluZSBBUkM0X01BWF9LRVlfU0laRQkyNTYKLSNkZWZpbmUgQVJDNF9CTE9DS19TSVpFCQkxCi0KLXN0cnVjdCBhcmM0X2N0eCB7Ci0JdTggU1syNTZdOwotCXU4IHgsIHk7Ci19OwotCi1zdGF0aWMgaW50IGFyYzRfc2V0X2tleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1OCAqaW5fa2V5LCB1bnNpZ25lZCBpbnQga2V5X2xlbiwgdTMyICpmbGFncykKLXsKLQlzdHJ1Y3QgYXJjNF9jdHggKmN0eCA9IGN0eF9hcmc7Ci0JaW50IGksIGogPSAwLCBrID0gMDsKLQotCWN0eC0+eCA9IDE7Ci0JY3R4LT55ID0gMDsKLQotCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQotCQljdHgtPlNbaV0gPSBpOwotCi0JZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JewotCQl1OCBhID0gY3R4LT5TW2ldOwotCQlqID0gKGogKyBpbl9rZXlba10gKyBhKSAmIDB4ZmY7Ci0JCWN0eC0+U1tpXSA9IGN0eC0+U1tqXTsKLQkJY3R4LT5TW2pdID0gYTsKLQkJaWYoKHVuc2lnbmVkIGludCkrK2sgPj0ga2V5X2xlbikKLQkJCWsgPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhcmM0X2NyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKLXsKLQlzdHJ1Y3QgYXJjNF9jdHggKmN0eCA9IGN0eF9hcmc7Ci0KLQl1OCAqY29uc3QgUyA9IGN0eC0+UzsKLQl1OCB4ID0gY3R4LT54OwotCXU4IHkgPSBjdHgtPnk7Ci0JdTggYSwgYjsKLQotCWEgPSBTW3hdOwotCXkgPSAoeSArIGEpICYgMHhmZjsKLQliID0gU1t5XTsKLQlTW3hdID0gYjsKLQlTW3ldID0gYTsKLQl4ID0gKHggKyAxKSAmIDB4ZmY7Ci0JKm91dCsrID0gKmluIF4gU1soYSArIGIpICYgMHhmZl07Ci0KLQljdHgtPnggPSB4OwotCWN0eC0+eSA9IHk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhcmM0X2FsZyA9IHsKLQkuY3JhX25hbWUJCT0JImFyYzQiLAotCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKLQkuY3JhX2Jsb2Nrc2l6ZQkJPQlBUkM0X0JMT0NLX1NJWkUsCi0JLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYXJjNF9jdHgpLAotCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAotCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChhcmM0X2FsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7Ci0JLmNpYV9taW5fa2V5c2l6ZQk9CUFSQzRfTUlOX0tFWV9TSVpFLAotCS5jaWFfbWF4X2tleXNpemUJPQlBUkM0X01BWF9LRVlfU0laRSwKLQkuY2lhX3NldGtleQkJPQlhcmM0X3NldF9rZXksCi0JLmNpYV9lbmNyeXB0CQk9CWFyYzRfY3J5cHQsCi0JLmNpYV9kZWNyeXB0CQk9CWFyYzRfY3J5cHQgfSB9Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhcmM0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYXJjNF9hbGcpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhcmM0X2V4aXQodm9pZCkKLXsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFyYzRfYWxnKTsKLX0KLQotbW9kdWxlX2luaXQoYXJjNF9pbml0KTsKLW1vZHVsZV9leGl0KGFyYzRfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQVJDNCBDaXBoZXIgQWxnb3JpdGhtIik7Ci1NT0RVTEVfQVVUSE9SKCJKb24gT2JlcmhlaWRlIDxqb25Ab2JlcmhlaWRlLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXV0b2xvYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXV0b2xvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NzU2Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2F1dG9sb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQWxnb3JpdGhtIGF1dG9sb2FkZXIuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaW5jbHVkZSAia21hcF90eXBlcy5oIgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLS8qCi0gKiBBIGZhciBtb3JlIGludGVsbGlnZW50IHZlcnNpb24gb2YgdGhpcyBpcyBwbGFubmVkLiAgRm9yIG5vdywganVzdAotICogdHJ5IGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uCi0gKi8KLXZvaWQgY3J5cHRvX2FsZ19hdXRvbG9hZChjb25zdCBjaGFyICpuYW1lKQotewotCXJlcXVlc3RfbW9kdWxlKG5hbWUpOwotfQotCi1zdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOwotCWlmIChhbGcgPT0gTlVMTCkgewotCQljcnlwdG9fYWxnX2F1dG9sb2FkKG5hbWUpOwotCQlhbGcgPSBjcnlwdG9fYWxnX2xvb2t1cChuYW1lKTsKLQl9Ci0JcmV0dXJuIGFsZzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY2lwaGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NpcGhlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDczNDVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY2lwaGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIENpcGhlciBvcGVyYXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzY2F0dGVyd2Fsay5oIgotCi10eXBlZGVmIHZvaWQgKGNyeXB0Zm5fdCkodm9pZCAqLCB1OCAqLCBjb25zdCB1OCAqKTsKLXR5cGVkZWYgdm9pZCAocHJvY2ZuX3QpKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosCi0JCQl1OCosIGNyeXB0Zm5fdCwgaW50IGVuYywgdm9pZCAqLCBpbnQpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgeG9yXzY0KHU4ICphLCBjb25zdCB1OCAqYikKLXsKLQkoKHUzMiAqKWEpWzBdIF49ICgodTMyICopYilbMF07Ci0JKCh1MzIgKilhKVsxXSBePSAoKHUzMiAqKWIpWzFdOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgeG9yXzEyOCh1OCAqYSwgY29uc3QgdTggKmIpCi17Ci0JKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOwotCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKLQkoKHUzMiAqKWEpWzJdIF49ICgodTMyICopYilbMl07Ci0JKCh1MzIgKilhKVszXSBePSAoKHUzMiAqKWIpWzNdOwotfQotCi0KLS8qCi0gKiBHZW5lcmljIGVuY3J5cHQvZGVjcnlwdCB3cmFwcGVyIGZvciBjaXBoZXJzLCBoYW5kbGVzIG9wZXJhdGlvbnMgYWNyb3NzCi0gKiBtdWx0aXBsZSBwYWdlIGJvdW5kYXJpZXMgYnkgdXNpbmcgdGVtcG9yYXJ5IGJsb2Nrcy4gIEluIHVzZXIgY29udGV4dCwKLSAqIHRoZSBrZXJuZWwgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gc2NoZWR1bGUgdXMgb25jZSBwZXIgYmxvY2suCi0gKi8KLXN0YXRpYyBpbnQgY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSB1bnNpZ25lZCBpbnQgbmJ5dGVzLCBjcnlwdGZuX3QgY3JmbiwKLQkJIHByb2Nmbl90IHByZm4sIGludCBlbmMsIHZvaWQgKmluZm8pCi17Ci0Jc3RydWN0IHNjYXR0ZXJfd2FsayB3YWxrX2luLCB3YWxrX291dDsKLQljb25zdCB1bnNpZ25lZCBpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQl1OCB0bXBfc3JjW2JzaXplXTsKLQl1OCB0bXBfZHN0W2JzaXplXTsKLQotCWlmICghbmJ5dGVzKQotCQlyZXR1cm4gMDsKLQotCWlmIChuYnl0ZXMgJSBic2l6ZSkgewotCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfQkxPQ0tfTEVOOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzY2F0dGVyd2Fsa19zdGFydCgmd2Fsa19pbiwgc3JjKTsKLQlzY2F0dGVyd2Fsa19zdGFydCgmd2Fsa19vdXQsIGRzdCk7Ci0KLQlmb3IoOzspIHsKLQkJdTggKnNyY19wLCAqZHN0X3A7Ci0JCWludCBpbl9wbGFjZTsKLQotCQlzY2F0dGVyd2Fsa19tYXAoJndhbGtfaW4pOwotCQlzY2F0dGVyd2Fsa19tYXAoJndhbGtfb3V0KTsKLQkJc3JjX3AgPSBzY2F0dGVyd2Fsa193aGljaGJ1Zigmd2Fsa19pbiwgYnNpemUsIHRtcF9zcmMpOwotCQlkc3RfcCA9IHNjYXR0ZXJ3YWxrX3doaWNoYnVmKCZ3YWxrX291dCwgYnNpemUsIHRtcF9kc3QpOwotCQlpbl9wbGFjZSA9IHNjYXR0ZXJ3YWxrX3NhbWVidWYoJndhbGtfaW4sICZ3YWxrX291dCwKLQkJCQkJICAgICAgIHNyY19wLCBkc3RfcCk7Ci0KLQkJbmJ5dGVzIC09IGJzaXplOwotCi0JCXNjYXR0ZXJ3YWxrX2NvcHljaHVua3Moc3JjX3AsICZ3YWxrX2luLCBic2l6ZSwgMCk7Ci0KLQkJcHJmbih0Zm0sIGRzdF9wLCBzcmNfcCwgY3JmbiwgZW5jLCBpbmZvLCBpbl9wbGFjZSk7Ci0KLQkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19pbiwgbmJ5dGVzKTsKLQotCQlzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKGRzdF9wLCAmd2Fsa19vdXQsIGJzaXplLCAxKTsKLQkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19vdXQsIG5ieXRlcyk7Ci0KLQkJaWYgKCFuYnl0ZXMpCi0JCQlyZXR1cm4gMDsKLQotCQljcnlwdG9feWllbGQodGZtKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNiY19wcm9jZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCi0JCQljcnlwdGZuX3QgZm4sIGludCBlbmMsIHZvaWQgKmluZm8sIGludCBpbl9wbGFjZSkKLXsKLQl1OCAqaXYgPSBpbmZvOwotCi0JLyogTnVsbCBlbmNyeXB0aW9uICovCi0JaWYgKCFpdikKLQkJcmV0dXJuOwotCi0JaWYgKGVuYykgewotCQl0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrKGl2LCBzcmMpOwotCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIGl2KTsKLQkJbWVtY3B5KGl2LCBkc3QsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKLQl9IGVsc2UgewotCQl1OCBzdGFja1tpbl9wbGFjZSA/IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pIDogMF07Ci0JCXU4ICpidWYgPSBpbl9wbGFjZSA/IHN0YWNrIDogZHN0OwotCi0JCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGJ1Ziwgc3JjKTsKLQkJdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jayhidWYsIGl2KTsKLQkJbWVtY3B5KGl2LCBzcmMsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKLQkJaWYgKGJ1ZiAhPSBkc3QpCi0JCQltZW1jcHkoZHN0LCBidWYsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGVjYl9wcm9jZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCi0JCQljcnlwdGZuX3QgZm4sIGludCBlbmMsIHZvaWQgKmluZm8sIGludCBpbl9wbGFjZSkKLXsKLQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCi17Ci0Jc3RydWN0IGNpcGhlcl9hbGcgKmNpYSA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKLQotCWlmIChrZXlsZW4gPCBjaWEtPmNpYV9taW5fa2V5c2l6ZSB8fCBrZXlsZW4gPiBjaWEtPmNpYV9tYXhfa2V5c2l6ZSkgewotCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlCi0JCXJldHVybiBjaWEtPmNpYV9zZXRrZXkoY3J5cHRvX3RmbV9jdHgodGZtKSwga2V5LCBrZXlsZW4sCi0JCQkJICAgICAgICZ0Zm0tPmNydF9mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgZWNiX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKLQkJICAgICBlY2JfcHJvY2VzcywgMSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgZWNiX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2RlY3J5cHQsCi0JCSAgICAgZWNiX3Byb2Nlc3MsIDEsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGNiY19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAotCQkgICAgIGNiY19wcm9jZXNzLCAxLCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKLX0KLQotc3RhdGljIGludCBjYmNfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAotCQkgICAgIGNiY19wcm9jZXNzLCAxLCBpdik7Ci19Ci0KLXN0YXRpYyBpbnQgY2JjX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2RlY3J5cHQsCi0JCSAgICAgY2JjX3Byb2Nlc3MsIDAsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOwotfQotCi1zdGF0aWMgaW50IGNiY19kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCSAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2RlY3J5cHQsCi0JCSAgICAgY2JjX3Byb2Nlc3MsIDAsIGl2KTsKLX0KLQotc3RhdGljIGludCBub2NyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBub2NyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1pbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKLXsKLQl1MzIgbW9kZSA9IGZsYWdzICYgQ1JZUFRPX1RGTV9NT0RFX01BU0s7Ci0KLQl0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPSBtb2RlID8gbW9kZSA6IENSWVBUT19URk1fTU9ERV9FQ0I7Ci0JaWYgKGZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpCi0JCXRmbS0+Y3J0X2ZsYWdzID0gQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGNyeXB0b19pbml0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY2lwaGVyX3RmbSAqb3BzID0gJnRmbS0+Y3J0X2NpcGhlcjsKLQotCW9wcy0+Y2l0X3NldGtleSA9IHNldGtleTsKLQotCXN3aXRjaCAodGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlKSB7Ci0JY2FzZSBDUllQVE9fVEZNX01PREVfRUNCOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gZWNiX2VuY3J5cHQ7Ci0JCW9wcy0+Y2l0X2RlY3J5cHQgPSBlY2JfZGVjcnlwdDsKLQkJYnJlYWs7Ci0KLQljYXNlIENSWVBUT19URk1fTU9ERV9DQkM6Ci0JCW9wcy0+Y2l0X2VuY3J5cHQgPSBjYmNfZW5jcnlwdDsKLQkJb3BzLT5jaXRfZGVjcnlwdCA9IGNiY19kZWNyeXB0OwotCQlvcHMtPmNpdF9lbmNyeXB0X2l2ID0gY2JjX2VuY3J5cHRfaXY7Ci0JCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBjYmNfZGVjcnlwdF9pdjsKLQkJYnJlYWs7Ci0KLQljYXNlIENSWVBUT19URk1fTU9ERV9DRkI6Ci0JCW9wcy0+Y2l0X2VuY3J5cHQgPSBub2NyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7Ci0JCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlicmVhazsKLQotCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0NUUjoKLQkJb3BzLT5jaXRfZW5jcnlwdCA9IG5vY3J5cHQ7Ci0JCW9wcy0+Y2l0X2RlY3J5cHQgPSBub2NyeXB0OwotCQlvcHMtPmNpdF9lbmNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKLQkJb3BzLT5jaXRfZGVjcnlwdF9pdiA9IG5vY3J5cHRfaXY7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JaWYgKG9wcy0+Y2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0NCQykgewotCi0JCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpIHsKLQkJY2FzZSA4OgotCQkJb3BzLT5jaXRfeG9yX2Jsb2NrID0geG9yXzY0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxNjoKLQkJCW9wcy0+Y2l0X3hvcl9ibG9jayA9IHhvcl8xMjg7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJsb2NrIHNpemUgJXUgbm90IHN1cHBvcnRlZFxuIiwKLQkJCSAgICAgICBjcnlwdG9fdGZtX2FsZ19uYW1lKHRmbSksCi0JCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJb3BzLT5jaXRfaXZzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7Ci0JCW9wcy0+Y2l0X2l2ID0ga21hbGxvYyhvcHMtPmNpdF9pdnNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAob3BzLT5jaXRfaXYgPT0gTlVMTCkKLQkJCXJldCA9IC1FTk9NRU07Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0Ja2ZyZWUodGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NvbXByZXNzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NvbXByZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTZhYjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIENvbXByZXNzaW9uIG9wZXJhdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLS8qI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPiovCi0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdGF0aWMgaW50IGNyeXB0b19jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKLXsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfY29tcHJlc3MoY3J5cHRvX3RmbV9jdHgodGZtKSwKLQkJCQkJCQkgc3JjLCBzbGVuLCBkc3QsCi0JCQkJCQkJIGRsZW4pOwotfQotCi1zdGF0aWMgaW50IGNyeXB0b19kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCi17Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2RlY29tcHJlc3MoY3J5cHRvX3RmbV9jdHgodGZtKSwKLQkJCQkJCQkgICBzcmMsIHNsZW4sIGRzdCwKLQkJCQkJCQkgICBkbGVuKTsKLX0KLQotaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKLX0KLQotaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjb21wcmVzc190Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jb21wcmVzczsKLQotCXJldCA9IHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlvcHMtPmNvdF9jb21wcmVzcyA9IGNyeXB0b19jb21wcmVzczsKLQlvcHMtPmNvdF9kZWNvbXByZXNzID0gY3J5cHRvX2RlY29tcHJlc3M7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGNyeXB0b19leGl0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2V4aXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NyeXB0b19jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY3J5cHRvX2NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmEzNzRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY3J5cHRvX2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIEhlYWRlciBmaWxlIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgYW1vbmcgZGlmZmVyZW50IGtlcm5lbCB2ZXJzaW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiAgPGxhd3JlbmNlX3dhbmdAcmVhbHNpbC5jb20uY24+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfdGZtKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKLXsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gTlVMTDsKLQlpbnQgZXJyOwotCXByaW50aygiY2FsbCBjcnlwdG9fYWxsb2NfdGZtISEhXG4iKTsKLQlkbyB7Ci0JCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7Ci0KLQkJYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUsIDAsIENSWVBUT19BTEdfQVNZTkMpOwotCQllcnIgPSBQVFJfRVJSKGFsZyk7Ci0JCWlmIChJU19FUlIoYWxnKSkKLQkJCWNvbnRpbnVlOwotCi0JCXRmbSA9IF9fY3J5cHRvX2FsbG9jX3RmbShhbGcsIGZsYWdzKTsKLQkJZXJyID0gMDsKLQkJaWYgKElTX0VSUih0Zm0pKSB7Ci0JCQljcnlwdG9fbW9kX3B1dChhbGcpOwotCQkJZXJyID0gUFRSX0VSUih0Zm0pOwotCQkJdGZtID0gTlVMTDsKLQkJfQotCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7Ci0KLQlyZXR1cm4gdGZtOwotfQotLy9FWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWxsb2NfdGZtKTsKLS8vRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2ZyZWVfdGZtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZGlnZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RpZ2VzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU3NDk3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZGlnZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIERpZ2VzdCBvcGVyYXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9pbml0KGNyeXB0b190Zm1fY3R4KHRmbSkpOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBuc2c7IGkrKykgewotCi0JCXN0cnVjdCBwYWdlICpwZyA9IHNnW2ldLnBhZ2U7Ci0JCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzZ1tpXS5vZmZzZXQ7Ci0JCXVuc2lnbmVkIGludCBsID0gc2dbaV0ubGVuZ3RoOwotCi0JCWRvIHsKLQkJCXVuc2lnbmVkIGludCBieXRlc19mcm9tX3BhZ2UgPSBtaW4obCwgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICAgKFBBR0VfU0laRSkpIC0KLQkJCQkJCQkgICBvZmZzZXQpOwotCQkJY2hhciAqcCA9IGttYXBfYXRvbWljKHBnKSArIG9mZnNldDsKLQotCQkJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3VwZGF0ZQotCQkJCQkoY3J5cHRvX3RmbV9jdHgodGZtKSwgcCwKLQkJCQkJIGJ5dGVzX2Zyb21fcGFnZSk7Ci0JCQlrdW5tYXBfYXRvbWljKHApOwotCQkJY3J5cHRvX3lpZWxkKHRmbSk7Ci0JCQlvZmZzZXQgPSAwOwotCQkJcGcrKzsKLQkJCWwgLT0gYnl0ZXNfZnJvbV9wYWdlOwotCQl9IHdoaWxlIChsID4gMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmaW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQotewotCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9maW5hbChjcnlwdG9fdGZtX2N0eCh0Zm0pLCBvdXQpOwotfQotCi1zdGF0aWMgaW50IHNldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQotewotCXUzMiBmbGFnczsKLQlpZiAodGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3NldGtleSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT1NZUzsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3NldGtleShjcnlwdG9fdGZtX2N0eCh0Zm0pLAotCQkJCQkJICAgICBrZXksIGtleWxlbiwgJmZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQl0Zm0tPmNydF9kaWdlc3QuZGl0X2luaXQodGZtKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuc2c7IGkrKykgewotCQljaGFyICpwID0ga21hcF9hdG9taWMoc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQ7Ci0JCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV91cGRhdGUoY3J5cHRvX3RmbV9jdHgodGZtKSwKLQkJCQkJCSAgICAgIHAsIHNnW2ldLmxlbmd0aCk7Ci0JCWt1bm1hcF9hdG9taWMocCk7Ci0JCWNyeXB0b195aWVsZCh0Zm0pOwotCX0KLQljcnlwdG9fZGlnZXN0X2ZpbmFsKHRmbSwgb3V0KTsKLX0KLQotaW50IGNyeXB0b19pbml0X2RpZ2VzdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCi17Ci0JcmV0dXJuIGZsYWdzID8gLUVJTlZBTCA6IDA7Ci19Ci0KLWludCBjcnlwdG9faW5pdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0Jc3RydWN0IGRpZ2VzdF90Zm0gKm9wcyA9ICZ0Zm0tPmNydF9kaWdlc3Q7Ci0KLQlvcHMtPmRpdF9pbml0CT0gaW5pdDsKLQlvcHMtPmRpdF91cGRhdGUJPSB1cGRhdGU7Ci0Jb3BzLT5kaXRfZmluYWwJPSBmaW5hbDsKLQlvcHMtPmRpdF9kaWdlc3QJPSBkaWdlc3Q7Ci0Jb3BzLT5kaXRfc2V0a2V5CT0gc2V0a2V5OwotCi0JcmV0dXJuIGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHRmbSk7Ci19Ci0KLXZvaWQgY3J5cHRvX2V4aXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCWNyeXB0b19mcmVlX2htYWNfYmxvY2sodGZtKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCmluZGV4IDM0ZWRjZmEuLjkwYWNlNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwpAQCAtMSwxNiArMSw4IEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwlGaWxlOgotLy8JCURvdDExZC5jCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJSW1wbGVtZW50IDgwMi4xMWQuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogSW1wbGVtZW50IDgwMi4xMWQuICovCiAKICNpbmNsdWRlICJkb3QxMWQuaCIKIAotdm9pZAotRG90MTFkX0luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit2b2lkIERvdDExZF9Jbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKIApAQCAtMjIsNTUgKzE0LDQyIEBACiAJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKIAlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CiAKLQlwcmludGsoIkRvdDExZF9Jbml0KClcbiIpOworCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIkRvdDExZF9Jbml0KClcbiIpOwogfQorRVhQT1JUX1NZTUJPTChEb3QxMWRfSW5pdCk7CiAKLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlSZXNldCB0byB0aGUgc3RhdGUgYXMgd2UgYXJlIGp1c3QgZW50ZXJpbmcgYSByZWd1bGF0b3J5IGRvbWFpbi4KLS8vCi12b2lkCi1Eb3QxMWRfUmVzZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCisvKiBSZXNldCB0byB0aGUgc3RhdGUgYXMgd2UgYXJlIGp1c3QgZW50ZXJpbmcgYSByZWd1bGF0b3J5IGRvbWFpbi4gKi8KK3ZvaWQgRG90MTFkX1Jlc2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXUzMiBpOwogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKLQkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwkvKiBDbGVhciBvbGQgY2hhbm5lbCBtYXAgKi8KIAltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CiAJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLQkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCi0JZm9yIChpPTE7IGk8PTExOyBpKyspIHsKKwkvKiBTZXQgbmV3IGNoYW5uZWwgbWFwICovCisJZm9yIChpID0gMTsgaSA8PSAxMTsgaSsrKQogCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDE7Ci0JfQotCWZvciAoaT0xMjsgaTw9MTQ7IGkrKykgeworCisJZm9yIChpID0gMTI7IGkgPD0gMTQ7IGkrKykKIAkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAyOwotCX0KIAogCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9OT05FOwogCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOwogCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKLQotCS8vcHJpbnRrKCJEb3QxMWRfUmVzZXQoKVxuIik7CiB9CitFWFBPUlRfU1lNQk9MKERvdDExZF9SZXNldCk7CiAKLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vCQlVcGRhdGUgY291bnRyeSBJRSBmcm9tIEJlYWNvbiBvciBQcm9iZSBSZXNvcG5zZQotLy8JCWFuZCBjb25maWd1cmUgUEhZIGZvciBvcGVyYXRpb24gaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLgotLy8KLS8vCVRPRE86Ci0vLwkJQ29uZmlndXJlIFR4IHBvd2VyLgotLy8KLS8vCUFzc3VtcHRpb246Ci0vLwkJMS4gSVNfRE9UMTFEX0VOQUJMRSgpIGlzIFRSVUUuCi0vLwkJMi4gSW5wdXQgSUUgaXMgYW4gdmFsaWQgb25lLgotLy8KLXZvaWQKLURvdDExZF9VcGRhdGVDb3VudHJ5SWUoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKLQl1OCAqcFRhZGRyLAotCXUxNglDb3V0cnlJZUxlbiwKLQl1OCAqcENvdXRyeUllCi0JKQorLyoKKyAqIFVwZGF0ZSBjb3VudHJ5IElFIGZyb20gQmVhY29uIG9yIFByb2JlIFJlc29wbnNlIGFuZCBjb25maWd1cmUgUEhZIGZvcgorICogb3BlcmF0aW9uIGluIHRoZSByZWd1bGF0b3J5IGRvbWFpbi4KKyAqCisgKiBUT0RPOiBDb25maWd1cmUgVHggcG93ZXIuCisgKiBBc3N1bXB0aW9uOgorICogMS4gSVNfRE9UMTFEX0VOQUJMRSgpIGlzIFRSVUUuCisgKiAyLiBJbnB1dCBJRSBpcyBhbiB2YWxpZCBvbmUuCisgKi8KK3ZvaWQgRG90MTFkX1VwZGF0ZUNvdW50cnlJZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LCB1OCAqcFRhZGRyLAorCQkJICAgIHUxNiBDb3V0cnlJZUxlbiwgdTggKnBDb3V0cnlJZSkKIHsKIAlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKIAl1OCBpLCBqLCBOdW1UcmlwbGVzLCBNYXhDaG5sTnVtOwpAQCAtNzksMjMgKzU4LDI1IEBACiAJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwogCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CiAJTWF4Q2hubE51bSA9IDA7Ci0JTnVtVHJpcGxlcyA9IChDb3V0cnlJZUxlbiAtIDMpIC8gMzsgLy8gc2tpcCAzLWJ5dGUgY291bnRyeSBzdHJpbmcuCisJTnVtVHJpcGxlcyA9IChDb3V0cnlJZUxlbiAtIDMpIC8gMzsgLyogc2tpcCAzLWJ5dGUgY291bnRyeSBzdHJpbmcuICovCiAJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkocENvdXRyeUllICsgMyk7Ci0JZm9yKGkgPSAwOyBpIDwgTnVtVHJpcGxlczsgaSsrKQotCXsKLQkJaWYoTWF4Q2hubE51bSA+PSBwVHJpcGxlLT5GaXJzdENobmwpCi0JCXsgLy8gSXQgaXMgbm90IGluIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yZGVyLCBzbyBzdG9wIHByb2Nlc3NpbmcuCi0JCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTnVtVHJpcGxlczsgaSsrKSB7CisJCWlmIChNYXhDaG5sTnVtID49IHBUcmlwbGUtPkZpcnN0Q2hubCkgeworCQkJLyogSXQgaXMgbm90IGluIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yZGVyLCBzbworCQkJICogc3RvcCBwcm9jZXNzaW5nLgorCQkJICovCisJCQluZXRkZXZfZXJyKGRldi0+ZGV2LCAiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IChwVHJpcGxlLT5GaXJzdENobmwgKyBwVHJpcGxlLT5OdW1DaG5scykpCi0JCXsgLy8gSXQgaXMgbm90IGEgdmFsaWQgc2V0IG9mIGNoYW5uZWwgaWQsIHNvIHN0b3AgcHJvY2Vzc2luZy4KLQkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOworCQlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArIHBUcmlwbGUtPk51bUNobmxzKSkgeworCQkJLyogSXQgaXMgbm90IGEgdmFsaWQgc2V0IG9mIGNoYW5uZWwgaWQsIHNvIHN0b3AKKwkJCSAqIHByb2Nlc3NpbmcuCisJCQkgKi8KKwkJCW5ldGRldl9lcnIoZGV2LT5kZXYsICJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMlxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlmb3IoaiA9IDAgOyBqIDwgcFRyaXBsZS0+TnVtQ2hubHM7IGorKykKLQkJeworCQlmb3IgKGogPSAwOyBqIDwgcFRyaXBsZS0+TnVtQ2hubHM7IGorKykgewogCQkJcERvdDExZEluZm8tPmNoYW5uZWxfbWFwW3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gMTsKIAkJCXBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSBwVHJpcGxlLT5NYXhUeFBvd2VySW5EYm07CiAJCQlNYXhDaG5sTnVtID0gcFRyaXBsZS0+Rmlyc3RDaG5sICsgajsKQEAgLTEwMyw2MCArODQsNDggQEAKIAogCQlwVHJpcGxlID0gKFBDSE5MX1RYUE9XRVJfVFJJUExFKSgodTggKilwVHJpcGxlICsgMyk7CiAJfQotCS8vcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IENoYW5uZWwgTGlzdDpcbiIpOwotCXByaW50aygiQ2hhbm5lbCBMaXN0OiIpOwotCWZvcihpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKLQkJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkKLQkJCXByaW50aygiICVkIiwgaSk7Ci0JcHJpbnRrKCJcbiIpOworCW5ldGRldl9pbmZvKGRldi0+ZGV2LCAiQ2hhbm5lbCBMaXN0OiIpOworCWZvciAoaSA9IDE7IGkgPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspCisJCWlmIChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQorCQkJbmV0ZGV2X2luZm8oZGV2LT5kZXYsICIgJWQiLCBpKTsKKwluZXRkZXZfaW5mbyhkZXYtPmRldiwgIlxuIik7CiAKIAlVUERBVEVfQ0lFX1NSQyhkZXYsIHBUYWRkcik7CiAKIAlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gQ291dHJ5SWVMZW47Ci0JbWVtY3B5KHBEb3QxMWRJbmZvLT5Db3VudHJ5SWVCdWYsIHBDb3V0cnlJZSxDb3V0cnlJZUxlbik7CisJbWVtY3B5KHBEb3QxMWRJbmZvLT5Db3VudHJ5SWVCdWYsIHBDb3V0cnlJZSwgQ291dHJ5SWVMZW4pOwogCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9MRUFSTkVEOwogfQorRVhQT1JUX1NZTUJPTChEb3QxMWRfVXBkYXRlQ291bnRyeUllKTsKIAotCi11OAotRE9UMTFEX0dldE1heFR4UHdySW5EYm0oCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKLQl1OCBDaGFubmVsCi0JKQordTggRE9UMTFEX0dldE1heFR4UHdySW5EYm0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwgdTggQ2hhbm5lbCkKIHsKIAlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKIAl1OCBNYXhUeFB3ckluRGJtID0gMjU1OwogCi0JaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgQ2hhbm5lbCkKLQl7Ci0JCXByaW50aygiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCBDaGFubmVsXG4iKTsKKwlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgQ2hhbm5lbCkgeworCQluZXRkZXZfZXJyKGRldi0+ZGV2LCAiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCBDaGFubmVsXG4iKTsKIAkJcmV0dXJuIE1heFR4UHdySW5EYm07CiAJfQotCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtDaGFubmVsXSkKLQl7CisJaWYgKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtDaGFubmVsXSkKIAkJTWF4VHhQd3JJbkRibSA9IHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbQ2hhbm5lbF07Ci0JfQogCiAJcmV0dXJuIE1heFR4UHdySW5EYm07CiB9CitFWFBPUlRfU1lNQk9MKERPVDExRF9HZXRNYXhUeFB3ckluRGJtKTsKIAotCi12b2lkCi1ET1QxMURfU2NhbkNvbXBsZXRlKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYKLQkpCit2b2lkIERPVDExRF9TY2FuQ29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldikKIHsKIAlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKIAotCXN3aXRjaCAocERvdDExZEluZm8tPlN0YXRlKQotCXsKKwlzd2l0Y2ggKHBEb3QxMWRJbmZvLT5TdGF0ZSkgewogCWNhc2UgRE9UMTFEX1NUQVRFX0xFQVJORUQ6CiAJCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9ET05FOwogCQlicmVhazsKIAogCWNhc2UgRE9UMTFEX1NUQVRFX0RPTkU6Ci0JCWlmKCBHRVRfQ0lFX1dBVENIRE9HKGRldikgPT0gMCApCi0JCXsgLy8gUmVzZXQgY291bnRyeSBJRSBpZiBwcmV2aW91cyBvbmUgaXMgZ29uZS4KKwkJaWYgKEdFVF9DSUVfV0FUQ0hET0coZGV2KSA9PSAwKSB7CisJCQkvKiBSZXNldCBjb3VudHJ5IElFIGlmIHByZXZpb3VzIG9uZSBpcyBnb25lLiAqLwogCQkJRG90MTFkX1Jlc2V0KGRldik7CiAJCX0KIAkJYnJlYWs7CkBAIC0xNjQsNTcgKzEzMyw0MyBAQAogCQlicmVhazsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKERPVDExRF9TY2FuQ29tcGxldGUpOwogCi1pbnQgSXNMZWdhbENoYW5uZWwoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKLQl1OCBjaGFubmVsCi0pCitpbnQgSXNMZWdhbENoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKIHsKIAlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKIAotCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpCi0JewotCQlwcmludGsoIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CisJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpIHsKKwkJbmV0ZGV2X2VycihkZXYtPmRldiwgIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CiAJCXJldHVybiAwOwogCX0KLQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQorCWlmIChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woSXNMZWdhbENoYW5uZWwpOwogCi1pbnQgVG9MZWdhbENoYW5uZWwoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKLQl1OCBjaGFubmVsCi0pCitpbnQgVG9MZWdhbENoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKIHsKIAlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKIAl1OCBkZWZhdWx0X2NobiA9IDA7CiAJdTMyIGkgPSAwOwogCi0JZm9yIChpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKLQl7Ci0JCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApCi0JCXsKKwlmb3IgKGkgPSAxOyBpIDw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKSB7CisJCWlmIChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKSB7CiAJCQlkZWZhdWx0X2NobiA9IGk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpCi0JewotCQlwcmludGsoIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CisJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpIHsKKwkJbmV0ZGV2X2VycihkZXYtPmRldiwgIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CiAJCXJldHVybiBkZWZhdWx0X2NobjsKIAl9CiAKLQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQorCWlmIChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQogCQlyZXR1cm4gY2hhbm5lbDsKIAogCXJldHVybiBkZWZhdWx0X2NobjsKIH0KLUVYUE9SVF9TWU1CT0woRG90MTFkX0luaXQpOwotRVhQT1JUX1NZTUJPTChEb3QxMWRfUmVzZXQpOwotRVhQT1JUX1NZTUJPTChEb3QxMWRfVXBkYXRlQ291bnRyeUllKTsKLUVYUE9SVF9TWU1CT0woRE9UMTFEX0dldE1heFR4UHdySW5EYm0pOwotRVhQT1JUX1NZTUJPTChET1QxMURfU2NhbkNvbXBsZXRlKTsKLUVYUE9SVF9TWU1CT0woSXNMZWdhbENoYW5uZWwpOwogRVhQT1JUX1NZTUJPTChUb0xlZ2FsQ2hhbm5lbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaAppbmRleCBiYzY0ZjA1Li5jYWMyMDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTExNTIsNyArMTE1Miw3IEBACiAKIHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKLQl1MzIgdGltZV9zdGFtcFsyXTsKKwlfX2xlMzIgdGltZV9zdGFtcFsyXTsKIAlfX2xlMTYgYmVhY29uX2ludGVydmFsOwogCV9fbGUxNiBjYXBhYmlsaXR5OwogCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgRkggcGFyYW1zLCBEUyBwYXJhbXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCBlNzMwZWQ2Li5hOTg0MTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTUxNywxMSArNTE3LDggQEAKIAogCXJldHVybiAxOwogfQotYm9vbAotQWRkUmVvcmRlckVudHJ5KAotCVBSWF9UU19SRUNPUkQJCQlwVFMsCi0JUFJYX1JFT1JERVJfRU5UUlkJCXBSZW9yZGVyRW50cnkKLQkpCisKK3N0YXRpYyBib29sIEFkZFJlb3JkZXJFbnRyeShQUlhfVFNfUkVDT1JEIHBUUywgUFJYX1JFT1JERVJfRU5UUlkgcFJlb3JkZXJFbnRyeSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwTGlzdCA9ICZwVFMtPlJ4UGVuZGluZ1BrdExpc3Q7CiAJd2hpbGUocExpc3QtPm5leHQgIT0gJnBUUy0+UnhQZW5kaW5nUGt0TGlzdCkKQEAgLTYwMSwxMCArNTk4LDkgQEAKIH0KIAogCi12b2lkIFJ4UmVvcmRlckluZGljYXRlUGFja2V0KCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJc3RydWN0IGllZWU4MDIxMV9yeGIgKnByeGIsCi0JCVBSWF9UU19SRUNPUkQJCXBUUywKLQkJdTE2CQkJU2VxTnVtKQorc3RhdGljIHZvaWQgUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfcnhiICpwcnhiLAorCQkJCSAgICBQUlhfVFNfUkVDT1JEIHBUUywgdTE2IFNlcU51bSkKIHsKIAlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwogCVBSWF9SRU9SREVSX0VOVFJZCXBSZW9yZGVyRW50cnkgPSBOVUxMOwpAQCAtNzcxLDkgKzc2Nyw5IEBACiAJfQogfQogCi11OCBwYXJzZV9zdWJmcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLAotCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhiICpyeGIsdTggKnNyYyx1OCAqZHN0KQorc3RhdGljIHU4IHBhcnNlX3N1YmZyYW1lKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsCisJCQkgc3RydWN0IGllZWU4MDIxMV9yeGIgKnJ4Yix1OCAqc3JjLHU4ICpkc3QpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7CiAJdTE2CQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKQEAgLTIyMDAsNyArMjE5Niw3IEBACiAJbmV0d29yay0+bGFzdF9zY2FubmVkID0gamlmZmllczsKIAluZXR3b3JrLT50aW1lX3N0YW1wWzBdID0gbGUzMl90b19jcHUoYmVhY29uLT50aW1lX3N0YW1wWzBdKTsKIAluZXR3b3JrLT50aW1lX3N0YW1wWzFdID0gbGUzMl90b19jcHUoYmVhY29uLT50aW1lX3N0YW1wWzFdKTsKLQluZXR3b3JrLT5iZWFjb25faW50ZXJ2YWwgPSBsZTMyX3RvX2NwdShiZWFjb24tPmJlYWNvbl9pbnRlcnZhbCk7CisJbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoYmVhY29uLT5iZWFjb25faW50ZXJ2YWwpOwogCS8qIFdoZXJlIHRvIHB1bGwgdGhpcz8gYmVhY29uLT5saXN0ZW5faW50ZXJ2YWw7Ki8KIAluZXR3b3JrLT5saXN0ZW5faW50ZXJ2YWwgPSAweDBBOwogCW5ldHdvcmstPnJhdGVzX2xlbiA9IG5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggNjYyYzdlNC4uMjEzMTkxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMjQsMTUgKzI0LDYgQEAKIAogI2luY2x1ZGUgImRvdDExZC5oIgogCi11OCByc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVsxNl1bNF0gPSB7Ci0JezB4MDAsMHgwRiwweEFDLDB4MDB9LCAvL1VzZSBncm91cCBrZXksIC8vUmVzZXJ2ZWQKLQl7MHgwMCwweDBGLDB4QUMsMHgwMX0sIC8vV0VQLTQwICAgICAgICAgLy9SU05BIGRlZmF1bHQKLQl7MHgwMCwweDBGLDB4QUMsMHgwMn0sIC8vVEtJUCAgICAgICAgICAgLy9OT05FCQkvL3t1c2VkIGp1c3QgYXMgZGVmYXVsdH0KLQl7MHgwMCwweDBGLDB4QUMsMHgwM30sIC8vV1JBUC1oaXN0b3JpY2FsCi0JezB4MDAsMHgwRiwweEFDLDB4MDR9LCAvL0NDTVAKLQl7MHgwMCwweDBGLDB4QUMsMHgwNX0sIC8vV0VQLTEwNAotfTsKLQogc2hvcnQgaWVlZTgwMjExX2lzXzU0Zyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCkKIHsKIAlyZXR1cm4gKG5ldC0+cmF0ZXNfZXhfbGVuID4gMCkgfHwgKG5ldC0+cmF0ZXNfbGVuID4gNCk7CkBAIC00Nyw3ICszOCw3IEBACiAgKiB0YWcgYW5kIHRoZSBFWFRFTkRFRCBSQVRFIE1GSUUgdGFnIGlmIG5lZWRlZC4KICAqIEl0IGVuY2x1ZGVzIHR3byBieXRlcyBwZXIgdGFnIGZvciB0aGUgdGFnIGl0c2VsZiBhbmQgaXRzIGxlbgogICovCi11bnNpZ25lZCBpbnQgaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdW5zaWduZWQgaW50IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IDA7CiAKQEAgLTY1LDcgKzU2LDcgQEAKICAqIFRoZW4gaXQgdXBkYXRlcyB0aGUgcG9pbnRlciBzbyB0aGF0CiAgKiBpdCBwb2ludHMgYWZ0ZXIgdGhlIG5ldyBNRklFIHRhZyBhZGRlZC4KICAqLwotdm9pZCBpZWVlODAyMTFfTUZJRV9CcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9NRklFX0JyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQogewogCXU4ICp0YWcgPSAqdGFnX3A7CiAKQEAgLTgyLDcgKzczLDcgQEAKIAkqdGFnX3AgPSB0YWc7CiB9CiAKLXZvaWQgaWVlZTgwMjExX01GSUVfR3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfTUZJRV9HcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKIHsKIAl1OCAqdGFnID0gKnRhZ19wOwogCkBAIC0xMDYsNyArOTcsOCBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX1dNTV9JbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKSB7CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfV01NX0luZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CiAJdTggKnRhZyA9ICp0YWdfcDsKIAogCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOyAvLzAKQEAgLTE0OCw3ICsxNDAsNyBAQAogfQogI2VuZGlmCiAKLXZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBuaDsKIAluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKzEpICUgTUdNVF9RVUVVRV9OVU07CkBAIC0xNjYsNyArMTU4LDcgQEAKIAkvL3JldHVybiAwOwogfQogCi1zdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHN0cnVjdCBza19idWZmICpkZXF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnJldDsKIApAQCAtMTgxLDEyICsxNzMsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGluaXRfbWdtdF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGluaXRfbWdtdF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSAwOwogfQogCi11OCBNZ250UXVlcnlfTWdudEZyYW1lVHhSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHU4IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJUFJUX0hJR0hfVEhST1VHSFBVVCAgICAgIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwogCXU4IHJhdGU7CkBAIC0zNjUsNyArMzU3LDggQEAKIH0KIAogc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKKworc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaWYoIWllZWUtPmllZWVfdXApCkBAIC0zOTEsNyArMzg0LDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYih1bnNpZ25lZCBsb25nIF9pZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiKHVuc2lnbmVkIGxvbmcgX2llZWUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPQogCQkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikgX2llZWU7CkBAIC00MDMsNyArMzk2LDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtNDk0LDcgKzQ4Nyw3IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKQEAgLTUzOCw3ICs1MzEsNyBAQAogCiAKIAotdm9pZCBpZWVlODAyMTFfYmVhY29uc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKQEAgLTU0OSw3ICs1NDIsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKIH0KIAotdm9pZCBpZWVlODAyMTFfYmVhY29uc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC01ODEsNyArNTc0LDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIC8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTYwOSw3ICs2MDIsNyBAQAogfQogCiAvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KLXZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKIAl7CkBAIC04NDEsNyArODM0LDggQEAKIH0KIAogCi1zdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Fzc29jX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQorc3RhdGljIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgIHU4ICpkZXN0KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTggKnRhZzsKQEAgLTg5Niw3ICs4OTAsOCBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXV0aF9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLGludCBzdGF0dXMsIHU4ICpkZXN0KQorc3RhdGljIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXV0aF9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBpbnQgc3RhdHVzLCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmF1dGg7CkBAIC05MjQsNyArOTE5LDggQEAKIAogfQogCi1zdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX251bGxfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxzaG9ydCBwd3IpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9udWxsX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIHNob3J0IHB3cikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7CkBAIC05NTAsNyArOTQ2LDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7CiAKQEAgLTk1OSw3ICs5NTUsOCBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsIHU4ICpkZXN0KQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsCisJCQkJICAgdTggKmRlc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hdXRoX3Jlc3AoaWVlZSwgcywgZGVzdCk7CiAKQEAgLTk2OCw3ICs5NjUsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQogewogCiAKQEAgLTEyNTAsMTMgKzEyNDcsMTMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYih1bnNpZ25lZCBsb25nIGRldikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2IodW5zaWduZWQgbG9uZyBkZXYpCiB7CiAJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydCgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikgZGV2KTsKIH0KIAogCi12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTI4Miw3ICsxMjc5LDkgQEAKIAl9CiB9CiAKLXZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hsZW4pCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICB1OCAqY2hhbGxlbmdlLAorCQkJCSAgICAgaW50IGNobGVuKQogewogCXU4ICpjOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMzEyLDcgKzEzMTEsNyBAQAogCWtmcmVlKGNoYWxsZW5nZSk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CkBAIC0xMzMxLDcgKzEzMzAsNyBAQAogCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcwogCX0KIH0KLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKIAlwcmludGsoS0VSTl9JTkZPICJBc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseVxuIik7CkBAIC0xMzc4LDcgKzEzNzcsNyBAQAogCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKIH0KIAotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIC8vCWludCBpOwogLy8Jc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGllZWUtPmRldjsKQEAgLTEzODksNyArMTM4OCw3IEBACiAJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKIAlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CkBAIC0xNTYyLDcgKzE1NjEsNyBAQAogfQogCiAKLWludCBhdXRoX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTggKmRlc3QpCitzdGF0aWMgaW50IGF1dGhfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmRlc3QpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKIApAQCAtMTYxOCw3ICsxNjE3LDcgQEAKIAogfQogCi1pbnQgYXNzb2NfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYix1OCAqZGVzdCkKK3N0YXRpYyBpbnQgYXNzb2NfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmRlc3QpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICphOwogCkBAIC0xNzEyLDcgKzE3MTEsOCBAQAogCiAKIAotdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgICAgc2hvcnQgcHdyKQogewogCiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9udWxsX2Z1bmMoaWVlZSwgcHdyKTsKQEAgLTE3MjMsNyArMTcyMyw4IEBACiB9CiAKIAotc2hvcnQgaWVlZTgwMjExX3N0YV9wc19zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTMyICp0aW1lX2gsIHUzMiAqdGltZV9sKQorc3RhdGljIHNob3J0IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHUzMiAqdGltZV9oLAorCQkJCSAgICB1MzIgKnRpbWVfbCkKIHsKIAlpbnQgdGltZW91dCA9IGllZWUtPnBzX3RpbWVvdXQ7CiAJdTggZHRpbTsKQEAgLTE3NzEsNyArMTc3Miw3IEBACiAKIH0KIAotaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YV9wcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhX3BzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewogCiAJdTMyIHRoLHRsOwpAQCAtMTg4OCw3ICsxODg5LDggQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogfQotdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJdTggKmFjdCA9IGllZWU4MDIxMV9nZXRfcGF5bG9hZChoZWFkZXIpOwpAQCAtMTk1OSw3ICsxOTYxLDggQEAKIAkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXR3b3JrX3Jlc3A7CiAJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmsgPSAmbmV0d29ya19yZXNwOwogCi0JCQlpZiAoMCA9PSAoZXJyY29kZT1hc3NvY19wYXJzZShpZWVlLHNrYiwgJmFpZCkpKXsKKwkJCWVycmNvZGUgPSBhc3NvY19wYXJzZShpZWVlLCBza2IsICZhaWQpOworCQkJaWYgKCFlcnJjb2RlKSB7CiAJCQkJaWVlZS0+c3RhdGU9SUVFRTgwMjExX0xJTktFRDsKIAkJCQlpZWVlLT5hc3NvY19pZCA9IGFpZDsKIAkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19vaysrOwpAQCAtMjAxNyw3ICsyMDIwLDggQEAKIAogCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2UiKTsKIAotCQkJCQlpZiAoMCA9PSAoZXJyY29kZT1hdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKSkpeworCQkJCQllcnJjb2RlID0gYXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbik7CisJCQkJCWlmICghZXJyY29kZSkgewogCQkJCQkJaWYoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSl7CiAJCQkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKIAkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKQEAgLTIxODksNyArMjE5Myw3IEBACiB9CiAKIC8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgYWNxdWlyZWQgKi8KLXZvaWQgaWVlZTgwMjExX3Jlc3VtZV90eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXN1bWVfdHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaW50IGk7CiAJZm9yKGkgPSBpZWVlLT50eF9wZW5kaW5nLmZyYWc7IGkgPCBpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3M7IGkrKykgewpAQCAtMjMxOCw3ICsyMzIyLDcgQEAKIAluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CiB9CiAKLXZvaWQgaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaWYoaWVlZS0+cmF3X3R4KXsKIApAQCAtMjMyOCw3ICsyMzMyLDcgQEAKIAkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOwogCX0KIH0KLXZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CkBAIC0yNTAxLDcgKzI1MDUsNyBAQAogCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKIAogfQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3JldHJ5X3dxKTsKQEAgLTI3NzIsNyArMjc3Niw4IEBACiB9CiAKIAotdm9pZCBpZWVlODAyMTFfd3BhX2Fzc29jX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBjaGFyICp3cGFfaWUsIGludCB3cGFfaWVfbGVuKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgICBjaGFyICp3cGFfaWUsIGludCB3cGFfaWVfbGVuKQogewogCS8qIG1ha2Ugc3VyZSBXUEEgaXMgZW5hYmxlZCAqLwogCWllZWU4MDIxMV93cGFfZW5hYmxlKGllZWUsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggMTU3YjJkNy4uNjc3OWJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC0zNzgsNyArMzc4LDggQEAKIAkJcmV0dXJuOwogfQogCi1leHRlcm4gdm9pZCBpZWVlODAyMTFfcXVyZXlfU2hvcnRQcmVhbWJsZU1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNiX2Rlc2MgKnRjYl9kZXNjKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3F1cmV5X1Nob3J0UHJlYW1ibGVNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICAgICBjYl9kZXNjICp0Y2JfZGVzYykKIHsKIAl0Y2JfZGVzYy0+YlVzZVNob3J0UHJlYW1ibGUgPSBmYWxzZTsKIAlpZiAodGNiX2Rlc2MtPmRhdGFfcmF0ZSA9PSAyKQpAQCAtMzkxLDcgKzM5Miw3IEBACiAJfQogCXJldHVybjsKIH0KLWV4dGVybgl2b2lkCitzdGF0aWMgdm9pZAogaWVlZTgwMjExX3F1ZXJ5X0hUQ2FwU2hvcnRHSShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2JfZGVzYyAqdGNiX2Rlc2MpCiB7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAkJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwppbmRleCBlMWZlNTRhLi5iZGY2N2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKQEAgLTM5LDcgKzM5LDcgQEAKIAljaGFyICptb2RlX3N0cmluZzsKIAlpbnQgbW9kZV9zaXplOwogfTsKLXN0cnVjdCBtb2Rlc191bml0IGllZWU4MDIxMV9tb2Rlc1tdID0geworc3RhdGljIHN0cnVjdCBtb2Rlc191bml0IGllZWU4MDIxMV9tb2Rlc1tdID0gewogCXsiYSIsMX0sCiAJeyJiIiwxfSwKIAl7ImciLDF9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjU0Y2ZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDcnlwdG9ncmFwaGljIEFQSS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpZm5kZWYgX0NSWVBUT19JTlRFUk5BTF9ICi0jZGVmaW5lIF9DUllQVE9fSU5URVJOQUxfSAotCi0KLS8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KLSNpbmNsdWRlIDxhc20vc29mdGlycS5oPgotI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b195aWVsZChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCWlmICghaW5fc29mdGlycSgpKQotCQljb25kX3Jlc2NoZWQoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fdGZtX2N0eChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXJldHVybiAodm9pZCAqKSZ0Zm1bMV07Ci19Ci0KLXN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKLQotI2lmZGVmIENPTkZJR19LTU9ECi12b2lkIGNyeXB0b19hbGdfYXV0b2xvYWQoY29uc3QgY2hhciAqbmFtZSk7Ci1zdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiBjcnlwdG9fYWxnX2xvb2t1cChuYW1lKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCi1pbnQgY3J5cHRvX2FsbG9jX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci12b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2FsbG9jX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsgfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotdm9pZCBfX2luaXQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKQoteyB9Ci0jZW5kaWYKLQotaW50IGNyeXB0b19pbml0X2RpZ2VzdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwotaW50IGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwotaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7Ci0KLWludCBjcnlwdG9faW5pdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotaW50IGNyeXB0b19pbml0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci1pbnQgY3J5cHRvX2luaXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwotCi12b2lkIGNyeXB0b19leGl0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci12b2lkIGNyeXB0b19leGl0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Ci12b2lkIGNyeXB0b19leGl0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLQotI2VuZGlmCS8qIF9DUllQVE9fSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9taWNoYWVsX21pYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9taWNoYWVsX21pYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjI1NmU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvbWljaGFlbF9taWMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkKLSAqCi0gKiBNaWNoYWVsIE1JQyAoSUVFRSA4MDIuMTFpL1RLSVApIGtleWVkIGRpZ2VzdAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSAicnRsX2NyeXB0by5oIgotCi0KLXN0cnVjdCBtaWNoYWVsX21pY19jdHggewotCXU4IHBlbmRpbmdbNF07Ci0Jc2l6ZV90IHBlbmRpbmdfbGVuOwotCi0JdTMyIGwsIHI7Ci19OwotCi0KLXN0YXRpYyBpbmxpbmUgdTMyIHJvdGwodTMyIHZhbCwgaW50IGJpdHMpCi17Ci0JcmV0dXJuICh2YWwgPDwgYml0cykgfCAodmFsID4+ICgzMiAtIGJpdHMpKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHUzMiByb3RyKHUzMiB2YWwsIGludCBiaXRzKQotewotCXJldHVybiAodmFsID4+IGJpdHMpIHwgKHZhbCA8PCAoMzIgLSBiaXRzKSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1MzIgeHN3YXAodTMyIHZhbCkKLXsKLQlyZXR1cm4gKCh2YWwgJiAweDAwZmYwMGZmKSA8PCA4KSB8ICgodmFsICYgMHhmZjAwZmYwMCkgPj4gOCk7Ci19Ci0KLQotI2RlZmluZSBtaWNoYWVsX2Jsb2NrKGwsIHIpCVwKLWRvIHsJCQkJXAotCXIgXj0gcm90bChsLCAxNyk7CVwKLQlsICs9IHI7CQkJXAotCXIgXj0geHN3YXAobCk7CQlcCi0JbCArPSByOwkJCVwKLQlyIF49IHJvdGwobCwgMyk7CVwKLQlsICs9IHI7CQkJXAotCXIgXj0gcm90cihsLCAyKTsJXAotCWwgKz0gcjsJCQlcCi19IHdoaWxlICgwKQotCi0KLXN0YXRpYyBpbmxpbmUgdTMyIGdldF9sZTMyKGNvbnN0IHU4ICpwKQotewotCXJldHVybiBwWzBdIHwgKHBbMV0gPDwgOCkgfCAocFsyXSA8PCAxNikgfCAocFszXSA8PCAyNCk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF9sZTMyKHU4ICpwLCB1MzIgdikKLXsKLQlwWzBdID0gdjsKLQlwWzFdID0gdiA+PiA4OwotCXBbMl0gPSB2ID4+IDE2OwotCXBbM10gPSB2ID4+IDI0OwotfQotCi0KLXN0YXRpYyB2b2lkIG1pY2hhZWxfaW5pdCh2b2lkICpjdHgpCi17Ci0Jc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKLQltY3R4LT5wZW5kaW5nX2xlbiA9IDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgbWljaGFlbF91cGRhdGUodm9pZCAqY3R4LCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKLXsKLQlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OwotCi0JaWYgKG1jdHgtPnBlbmRpbmdfbGVuKSB7Ci0JCWludCBmbGVuID0gNCAtIG1jdHgtPnBlbmRpbmdfbGVuOwotCQlpZiAoZmxlbiA+IGxlbikKLQkJCWZsZW4gPSBsZW47Ci0JCW1lbWNweSgmbWN0eC0+cGVuZGluZ1ttY3R4LT5wZW5kaW5nX2xlbl0sIGRhdGEsIGZsZW4pOwotCQltY3R4LT5wZW5kaW5nX2xlbiArPSBmbGVuOwotCQlkYXRhICs9IGZsZW47Ci0JCWxlbiAtPSBmbGVuOwotCi0JCWlmIChtY3R4LT5wZW5kaW5nX2xlbiA8IDQpCi0JCQlyZXR1cm47Ci0KLQkJbWN0eC0+bCBePSBnZXRfbGUzMihtY3R4LT5wZW5kaW5nKTsKLQkJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKLQkJbWN0eC0+cGVuZGluZ19sZW4gPSAwOwotCX0KLQotCXdoaWxlIChsZW4gPj0gNCkgewotCQltY3R4LT5sIF49IGdldF9sZTMyKGRhdGEpOwotCQltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOwotCQlkYXRhICs9IDQ7Ci0JCWxlbiAtPSA0OwotCX0KLQotCWlmIChsZW4gPiAwKSB7Ci0JCW1jdHgtPnBlbmRpbmdfbGVuID0gbGVuOwotCQltZW1jcHkobWN0eC0+cGVuZGluZywgZGF0YSwgbGVuKTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgbWljaGFlbF9maW5hbCh2b2lkICpjdHgsIHU4ICpvdXQpCi17Ci0Jc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKLQl1OCAqZGF0YSA9IG1jdHgtPnBlbmRpbmc7Ci0KLQkvKiBMYXN0IGJsb2NrIGFuZCBwYWRkaW5nICgweDVhLCA0Li43IHggMCkgKi8KLQlzd2l0Y2ggKG1jdHgtPnBlbmRpbmdfbGVuKSB7Ci0JY2FzZSAwOgotCQltY3R4LT5sIF49IDB4NWE7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJbWN0eC0+bCBePSBkYXRhWzBdIHwgMHg1YTAwOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCW1jdHgtPmwgXj0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgMHg1YTAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJbWN0eC0+bCBePSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAoZGF0YVsyXSA8PCAxNikgfAotCQkJMHg1YTAwMDAwMDsKLQkJYnJlYWs7Ci0JfQotCW1pY2hhZWxfYmxvY2sobWN0eC0+bCwgbWN0eC0+cik7Ci0JLyogbCBePSAwOyAqLwotCW1pY2hhZWxfYmxvY2sobWN0eC0+bCwgbWN0eC0+cik7Ci0KLQlwdXRfbGUzMihvdXQsIG1jdHgtPmwpOwotCXB1dF9sZTMyKG91dCArIDQsIG1jdHgtPnIpOwotfQotCi0KLXN0YXRpYyBpbnQgbWljaGFlbF9zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLAotCQkJICB1MzIgKmZsYWdzKQotewotCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7Ci0JaWYgKGtleWxlbiAhPSA4KSB7Ci0JCWlmIChmbGFncykKLQkJCSpmbGFncyA9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWN0eC0+bCA9IGdldF9sZTMyKGtleSk7Ci0JbWN0eC0+ciA9IGdldF9sZTMyKGtleSArIDQpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBtaWNoYWVsX21pY19hbGcgPSB7Ci0JLmNyYV9uYW1lCT0gIm1pY2hhZWxfbWljIiwKLQkuY3JhX2ZsYWdzCT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCwKLQkuY3JhX2Jsb2Nrc2l6ZQk9IDgsCi0JLmNyYV9jdHhzaXplCT0gc2l6ZW9mKHN0cnVjdCBtaWNoYWVsX21pY19jdHgpLAotCS5jcmFfbW9kdWxlCT0gVEhJU19NT0RVTEUsCi0JLmNyYV9saXN0CT0gTElTVF9IRUFEX0lOSVQobWljaGFlbF9taWNfYWxnLmNyYV9saXN0KSwKLQkuY3JhX3UJCT0geyAuZGlnZXN0ID0gewotCS5kaWFfZGlnZXN0c2l6ZQk9IDgsCi0JLmRpYV9pbml0CT0gbWljaGFlbF9pbml0LAotCS5kaWFfdXBkYXRlCT0gbWljaGFlbF91cGRhdGUsCi0JLmRpYV9maW5hbAk9IG1pY2hhZWxfZmluYWwsCi0JLmRpYV9zZXRrZXkJPSBtaWNoYWVsX3NldGtleSB9IH0KLX07Ci0KLQotc3RhdGljIGludCBfX2luaXQgbWljaGFlbF9taWNfaW5pdCh2b2lkKQotewotCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZtaWNoYWVsX21pY19hbGcpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtaWNoYWVsX21pY19leGl0KHZvaWQpCi17Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZtaWNoYWVsX21pY19hbGcpOwotfQotCi0KLW1vZHVsZV9pbml0KG1pY2hhZWxfbWljX2luaXQpOwotbW9kdWxlX2V4aXQobWljaGFlbF9taWNfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTWljaGFlbCBNSUMiKTsKLU1PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9wcm9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MjZkZmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9wcm9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIFNjYXR0ZXJsaXN0IENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIFByb2NmcyBpbmZvcm1hdGlvbi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlICJydGxfY3J5cHRvLmgiCi0jaW5jbHVkZSA8bGludXgvcndzZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCBjcnlwdG9fYWxnX2xpc3Q7Ci1leHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBjcnlwdG9fYWxnX3NlbTsKLQotc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp2OwotCWxvZmZfdCBuID0gKnBvczsKLQotCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOwotCWxpc3RfZm9yX2VhY2godiwgJmNyeXB0b19hbGdfbGlzdCkKLQkJaWYgKCFuLS0pCi0JCQlyZXR1cm4gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgY3J5cHRvX2FsZywgY3JhX2xpc3QpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdiA9IHA7Ci0KLQkoKnBvcykrKzsKLQl2ID0gdi0+bmV4dDsKLQlyZXR1cm4gKHYgPT0gJmNyeXB0b19hbGdfbGlzdCkgPwotCQlOVUxMIDogbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgY3J5cHRvX2FsZywgY3JhX2xpc3QpOwotfQotCi1zdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQotewotCXVwX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKLX0KLQotc3RhdGljIGludCBjX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQotewotCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSAoc3RydWN0IGNyeXB0b19hbGcgKilwOwotCi0Jc2VxX3ByaW50ZihtLCAibmFtZSAgICAgICAgIDogJXNcbiIsIGFsZy0+Y3JhX25hbWUpOwotCXNlcV9wcmludGYobSwgIm1vZHVsZSAgICAgICA6ICVzXG4iLAotCQkgICAoYWxnLT5jcmFfbW9kdWxlID8KLQkJICAgIGFsZy0+Y3JhX21vZHVsZS0+bmFtZSA6Ci0JCSAgICAia2VybmVsIikpOwotCi0Jc3dpdGNoIChhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLKSB7Ci0JY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgotCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBjaXBoZXJcbiIpOwotCQlzZXFfcHJpbnRmKG0sICJibG9ja3NpemUgICAgOiAldVxuIiwgYWxnLT5jcmFfYmxvY2tzaXplKTsKLQkJc2VxX3ByaW50ZihtLCAibWluIGtleXNpemUgIDogJXVcbiIsCi0JCQkJCWFsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemUpOwotCQlzZXFfcHJpbnRmKG0sICJtYXgga2V5c2l6ZSAgOiAldVxuIiwKLQkJCQkJYWxnLT5jcmFfY2lwaGVyLmNpYV9tYXhfa2V5c2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgotCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBkaWdlc3RcbiIpOwotCQlzZXFfcHJpbnRmKG0sICJibG9ja3NpemUgICAgOiAldVxuIiwgYWxnLT5jcmFfYmxvY2tzaXplKTsKLQkJc2VxX3ByaW50ZihtLCAiZGlnZXN0c2l6ZSAgIDogJXVcbiIsCi0JCQkgICBhbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemUpOwotCQlicmVhazsKLQljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKLQkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogY29tcHJlc3Npb25cbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiB1bmtub3duXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0Jc2VxX3B1dGMobSwgJ1xuJyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3J5cHRvX3NlcV9vcHMgPSB7Ci0JLnN0YXJ0CQk9IGNfc3RhcnQsCi0JLm5leHQJCT0gY19uZXh0LAotCS5zdG9wCQk9IGNfc3RvcCwKLQkuc2hvdwkJPSBjX3Nob3cKLX07Ci0KLXN0YXRpYyBpbnQgY3J5cHRvX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmNyeXB0b19zZXFfb3BzKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcnlwdG9fb3BzID0gewotCS5vcGVuCQk9IGNyeXB0b19pbmZvX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzZXFfcmVsZWFzZQotfTsKLQotdm9pZCBfX2luaXQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKQotewotCXByb2NfY3JlYXRlKCJjcnlwdG8iLCAwLCBOVUxMLCAmcHJvY19jcnlwdG9fb3BzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwppbmRleCAzNjg0ZGEzLi43YmY1NWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKgkgICAgIHUxNgkJCVRpbWUgLy9pbmRpY2F0ZSB0aW1lIGRlbGF5LgogICogIG91dHB1dDogIG5vbmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBY3RpdmF0ZUJBRW50cnkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBCQV9SRUNPUkQgcEJBLCB1MTYgVGltZSkKK3N0YXRpYyB2b2lkIEFjdGl2YXRlQkFFbnRyeShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUEJBX1JFQ09SRCBwQkEsIHUxNiBUaW1lKQogewogCXBCQS0+YlZhbGlkID0gdHJ1ZTsKIAlpZihUaW1lICE9IDApCkBAIC0yNSw3ICsyNSw3IEBACiAgKiAgIGlucHV0OiAgUEJBX1JFQ09SRAkJCXBCQSAgLy9CQSBlbnRyeSB0byBiZSBkaXNhYmxlZAogICogIG91dHB1dDogIG5vbmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBEZUFjdGl2YXRlQkFFbnRyeSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBCQV9SRUNPUkQgcEJBKQorc3RhdGljIHZvaWQgRGVBY3RpdmF0ZUJBRW50cnkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBCQV9SRUNPUkQgcEJBKQogewogCXBCQS0+YlZhbGlkID0gZmFsc2U7CiAJZGVsX3RpbWVyX3N5bmMoJnBCQS0+VGltZXIpOwpAQCAtMzcsNyArMzcsNyBAQAogICogIG91dHB1dDogIG5vbmUKICAqICBub3RpY2U6ICBBcyBQVFhfVFNfUkVDT1JEIHN0cnVjdHVyZSB3aWxsIGJlIGRlZmluZWQgaW4gUU9TLCBzbyB3YWl0IHRvIGJlIG1lcmdlZC4gLy9GSVhNRQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBUeFRzRGVsZXRlQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFhfVFNfUkVDT1JECXBUeFRzKQorc3RhdGljIHU4IFR4VHNEZWxldGVCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRYX1RTX1JFQ09SRCBwVHhUcykKIHsKIAlQQkFfUkVDT1JECQlwQWRtaXR0ZWRCYSA9ICZwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkOyAgLy9UaGVzZSB0d28gQkEgZW50cmllcyBtdXN0IGV4aXN0IGluIFRTIHN0cnVjdHVyZQogCVBCQV9SRUNPUkQJCXBQZW5kaW5nQmEgPSAmcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkOwpAQCAtNjcsNyArNjcsNyBAQAogICogIG91dHB1dDogIG5vbmUKICAqICBub3RpY2U6ICBBcyBQUlhfVFNfUkVDT1JEIHN0cnVjdHVyZSB3aWxsIGJlIGRlZmluZWQgaW4gUU9TLCBzbyB3YWl0IHRvIGJlIG1lcmdlZC4gLy9GSVhNRSwgc2FtZSB3aXRoIGFib3ZlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IFJ4VHNEZWxldGVCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIFBSWF9UU19SRUNPUkQJcFJ4VHMpCitzdGF0aWMgdTggUnhUc0RlbGV0ZUJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQUlhfVFNfUkVDT1JEIHBSeFRzKQogewogCVBCQV9SRUNPUkQJCXBCYSA9ICZwUnhUcy0+UnhBZG1pdHRlZEJBUmVjb3JkOwogCXU4CQkJYlNlbmRERUxCQSA9IGZhbHNlOwpAQCAtMzA3LDcgKzMwNyw5IEBACiAgKiAgbm90aWNlOiBJZiBhbnkgcG9zc2libGUsIHBsZWFzZSBoaWRlIHBCQSBpbiBpZWVlLiBBbmQgdGVtcG9yYXJpbHkgdXNlIE1hbmFnZSBRdWV1ZSBhcyBzb2Z0bWFjX21nbXRfeG1pdCgpIHVzdWFsbHkgZG9lcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgaWVlZTgwMjExX3NlbmRfREVMQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkc3QsIFBCQV9SRUNPUkQgcEJBLCBUUl9TRUxFQ1QgVHhSeFNlbGVjdCwgdTE2IFJlYXNvbkNvZGUpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9ERUxCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRzdCwKKwkJCQkgUEJBX1JFQ09SRCBwQkEsIFRSX1NFTEVDVCBUeFJ4U2VsZWN0LAorCQkJCSB1MTYgUmVhc29uQ29kZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlza2IgPSBpZWVlODAyMTFfREVMQkEoaWVlZSwgZHN0LCBwQkEsIFR4UnhTZWxlY3QsIFJlYXNvbkNvZGUpOyAvL2NvbnN0cnVjdCBBQ1RfQUREQkFSU1AgZnJhbWVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKaW5kZXggZTk1NmRhNS4uNTNlYzJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAvKgogKglSZXR1cm46CQl0cnVlIGlmIHN0YXRpb24gaW4gaGFsZiBuIG1vZGUgYW5kIEFQIHN1cHBvcnRzIDQwIGJ3CiAqLwotYm9vbCBJc0hUSGFsZk5tb2RlNDBCYW5kd2lkdGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgYm9vbCBJc0hUSGFsZk5tb2RlNDBCYW5kd2lkdGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAkgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CkBAIC0yMzgsNyArMjM4LDcgQEAKIAlyZXR1cm4gcmV0VmFsdWU7CiB9CiAKLWJvb2wgSXNIVEhhbGZObW9kZVNHSShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgYm9vbCBpczQwTUh6KQorc3RhdGljIGJvb2wgSXNIVEhhbGZObW9kZVNHSShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgYm9vbCBpczQwTUh6KQogewogCWJvb2wJCQlyZXRWYWx1ZSA9IGZhbHNlOwogCVBSVF9ISUdIX1RIUk9VR0hQVVQJIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwpAQCAtMzc2LDcgKzM3Niw3IEBACiAgKiAgcmV0dXJuOgogICogIG5vdGljZToKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBIVElPVFBlZXJEZXRlcm1pbmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgdm9pZCBIVElPVFBlZXJEZXRlcm1pbmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CkBAIC00MTMsNyArNDEzLDcgQEAKICAqICBvdXRwdXQ6ICBub25lCiAgKiAgcmV0dXJuOiAgcmV0dXJuIDEgaWYgZHJpdmVyIHNob3VsZCBkZWNsYXJlIE1DUzEzIG9ubHkob3RoZXJ3aXNlIHJldHVybiAwKQogICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKlBlZXJNYWNBZGRyKQorc3RhdGljIHU4IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpQZWVyTWFjQWRkcikKIHsKIAl1OCByZXQgPSAwOwogCXJldHVybiByZXQ7CkBAIC00MzIsNyArNDMyLDcgQEAKICogUmV0dXJuOgl0cnVlIGlmIGRyaXZlciBzaG91bGQgZGlzYWJsZSBNQ1MxNQogKiAyMDA4LjA0LjE1CUVtaWx5CiAqLwotYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DUzE1KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlib29sIHJldFZhbHVlID0gZmFsc2U7CiAKQEAgLTQ2OSw3ICs0NjksOCBAQAogKiBSZXR1cm46CXRydWUgaWYgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGFsbCB0d28gc3BhdGlhbCBzdHJlYW0gcGFja2V0CiAqIDIwMDguMDQuMjEJRW1pbHkKICovCi1ib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTVHdvU3BhdGlhbFN0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKlBlZXJNYWNBZGRyKQorc3RhdGljIGJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1NUd29TcGF0aWFsU3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkJIHU4ICpQZWVyTWFjQWRkcikKIHsKIAlib29sIHJldFZhbHVlID0gZmFsc2U7CiAKQEAgLTQ4Niw3ICs0ODcsOCBAQAogICogIG91dHB1dDogIG5vbmUKICAqICByZXR1cm46ICByZXR1cm4gMSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgRURDQSB0dXJibyBtb2RlKG90aGVyd2lzZSByZXR1cm4gMCkKICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IEhUSU9UQWN0SXNEaXNhYmxlRURDQVR1cmJvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqUGVlck1hY0FkZHIpCitzdGF0aWMgdTggSFRJT1RBY3RJc0Rpc2FibGVFRENBVHVyYm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICB1OCAqUGVlck1hY0FkZHIpCiB7CiAJdTgJcmV0VmFsdWUgPSBmYWxzZTsJLy8gZGVmYXVsdCBlbmFibGUgRURDQSBUdXJibyBtb2RlLgogCS8vIFNldCBzcGVjaWZpYyBFRENBIHBhcmFtZXRlciBmb3IgZGlmZmVyZW50IEFQIGluIERNIGhhbmRsZXIuCkBAIC01MDAsNyArNTAyLDcgQEAKICAqICBvdXRwdXQ6ICBub25lCiAgKiAgcmV0dXJuOiAgcmV0dXJuIDEgaWYgdHJ1ZQogICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggSFRJT1RBY3RJc01nbnRVc2VDQ0s2TShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCitzdGF0aWMgdTggSFRJT1RBY3RJc01nbnRVc2VDQ0s2TShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCiB7CiAJdTgJcmV0VmFsdWUgPSAwOwogCkBAIC01MTUsNyArNTE3LDcgQEAKIAlyZXR1cm4gcmV0VmFsdWU7CiB9CiAKLXU4IEhUSU9UQWN0SXNDQ0RGc3luYyh1OCAqUGVlck1hY0FkZHIpCitzdGF0aWMgdTggSFRJT1RBY3RJc0NDREZzeW5jKHU4ICpQZWVyTWFjQWRkcikKIHsKIAl1OAlyZXRWYWx1ZSA9IDA7CiAJaWYoCShtZW1jbXAoUGVlck1hY0FkZHIsIFVOS05PV05fQk9SQURDT00sIDMpPT0wKSB8fApAQCAtNzkyLDcgKzc5NCw3IEBACiAgKiAgcmV0dXJuOiAgYWx3YXlzIHdlIHJldHVybiB0cnVlCiAgKiAgbm90aWNlOgogICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggSFRfUGlja01DU1JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwT3BlcmF0ZU1DUykKK3N0YXRpYyB1OCBIVF9QaWNrTUNTUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKnBPcGVyYXRlTUNTKQogewogCXU4CQkJCQlpOwogCWlmIChwT3BlcmF0ZU1DUyA9PSBOVUxMKQpAQCAtOTA3LDcgKzkwOSw4IEBACiAqKgogKiogXHBIVFN1cHBvcnRlZENhcDogdGhlIGNvbm5lY3RlZCBTVEEncyBzdXBwb3J0ZWQgcmF0ZSBDYXBhYmlsaXR5IGVsZW1lbnQKICovCi11OCBIVEZpbHRlck1DU1JhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqcFN1cHBvcnRNQ1MsIHU4ICpwT3BlcmF0ZU1DUykKK3N0YXRpYyB1OCBIVEZpbHRlck1DU1JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwU3VwcG9ydE1DUywKKwkJCSAgdTggKnBPcGVyYXRlTUNTKQogewogCiAJdTggaT0wOwpAQCAtMTMxNyw1MSArMTMyMCw2IEBACiAJfQogfQogCi12b2lkIEhUVXNlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLS8vCXU4CXJlZ0J3T3BNb2RlOwotCi0JaWYocEhUSW5mby0+YkVuYWJsZUhUKQotCXsKLQkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSB0cnVlOwotCi0JCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0gcEhUSW5mby0+YlJlZ1N1cHBDQ0s7Ci0KLQkJcEhUSW5mby0+YkN1ckJXNDBNSHogPSBwSFRJbmZvLT5iUmVnQlc0ME1IejsKLQotCQlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6PSBwSFRJbmZvLT5iUmVnU2hvcnRHSTIwTUh6OwotCi0JCXBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHo9IHBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHo7Ci0KLQkJcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IHBIVEluZm8tPmJBTVNEVV9TdXBwb3J0OwotCi0JCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKLQotCQlwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gcEhUSW5mby0+YkFNUERVRW5hYmxlOwotCi0JCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IHBIVEluZm8tPkFNUERVX0ZhY3RvcjsKLQotCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwSFRJbmZvLT5NUERVX0RlbnNpdHk7Ci0KLQkJLy8gU2V0IEJXT3BNb2RlIHJlZ2lzdGVyCi0KLQkJLy91cGRhdGUgUkFUUiBpbmRleDAKLQkJSFRGaWx0ZXJNQ1NSYXRlKGllZWUsIGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOwotCS8vZnVuY3Rpb24gYmVsb3cgaXMgbm90IGltcGxlbWVudGVkIGF0IGFsbC4gV0IKLSNpZmRlZiBUT0RPCi0JCUFkYXB0ZXItPkhhbEZ1bmMuSW5pdEhhbFJBVFJUYWJsZUhhbmRsZXIoIEFkYXB0ZXIsICZwTWdudEluZm8tPmRvdDExT3BlcmF0aW9uYWxSYXRlU2V0LCBwTWdudEluZm8tPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOwotI2VuZGlmCi0JCWllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZSA9IEhUR2V0SGlnaGVzdE1DU1JhdGUoaWVlZSwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgTUNTX0ZJTFRFUl9BTEwpOwotCQlpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUgPSBpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGU7Ci0KLQl9Ci0JZWxzZQotCXsKLQkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKLQl9Ci0JcmV0dXJuOwotfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKmZ1bmN0aW9uOiAgY2hlY2sgd2hldGhlciBIVCBjb250cm9sIGZpZWxkIGV4aXN0cwogICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlCSppZWVlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKaW5kZXggMzA1ODEyMC4uNDI2ZjIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYwpAQCAtMywxMyArMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICJydGw4MTl4X1RTLmgiCiAKLXZvaWQgVHNTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgVHNTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCS8vIE5vdCBpbXBsZW1lbnQgeWV0CiAJLy8gVGhpcyBpcyB1c2VkIGZvciBXTU1TQSBhbmQgQUNNICwgdGhhdCB3b3VsZCBzZW5kIEFERFRTUmVxIGZyYW1lLgogfQogCi12b2lkIFRzSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIFRzSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAkvLyBOb3QgaW1wbGVtZW50IHlldAogCS8vIFRoaXMgaXMgdXNlZCBmb3IgV01NU0EgYW5kIEFDTS4KQEAgLTIyLDcgKzIyLDcgQEAKICAqICByZXR1cm46ICBOVUxMCiAgKiAgbm90aWNlOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJ4UGt0UGVuZGluZ1RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgUnhQa3RQZW5kaW5nVGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKWRhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YocFJ4VHMsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBSeFRzUmVjb3JkW3BSeFRzLT5udW1dKTsKQEAgLTk5LDcgKzk5LDcgQEAKICAqICByZXR1cm46ICBOVUxMCiAgKiAgbm90aWNlOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFRzQWRkQmFQcm9jZXNzKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIFRzQWRkQmFQcm9jZXNzKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKIAl1OCBudW0gPSBwVHhUcy0+bnVtOwpAQCAtMTEwLDcgKzExMCw3IEBACiB9CiAKIAotdm9pZCBSZXNldFRzQ29tbW9uSW5mbyhQVFNfQ09NTU9OX0lORk8JcFRzQ29tbW9uSW5mbykKK3N0YXRpYyB2b2lkIFJlc2V0VHNDb21tb25JbmZvKFBUU19DT01NT05fSU5GTyBwVHNDb21tb25JbmZvKQogewogCW1lbXNldChwVHNDb21tb25JbmZvLT5BZGRyLCAwLCA2KTsKIAltZW1zZXQoJnBUc0NvbW1vbkluZm8tPlRTcGVjLCAwLCBzaXplb2YoVFNQRUNfQk9EWSkpOwpAQCAtMTE5LDcgKzExOSw3IEBACiAJcFRzQ29tbW9uSW5mby0+VENsYXNOdW0gPSAwOwogfQogCi12b2lkIFJlc2V0VHhUc0VudHJ5KFBUWF9UU19SRUNPUkQgcFRTKQorc3RhdGljIHZvaWQgUmVzZXRUeFRzRW50cnkoUFRYX1RTX1JFQ09SRCBwVFMpCiB7CiAJUmVzZXRUc0NvbW1vbkluZm8oJnBUUy0+VHNDb21tb25JbmZvKTsKIAlwVFMtPlR4Q3VyU2VxID0gMDsKQEAgLTEzMCw3ICsxMzAsNyBAQAogCVJlc2V0QmFFbnRyeSgmcFRTLT5UeFBlbmRpbmdCQVJlY29yZCk7CiB9CiAKLXZvaWQgUmVzZXRSeFRzRW50cnkoUFJYX1RTX1JFQ09SRCBwVFMpCitzdGF0aWMgdm9pZCBSZXNldFJ4VHNFbnRyeShQUlhfVFNfUkVDT1JEIHBUUykKIHsKIAlSZXNldFRzQ29tbW9uSW5mbygmcFRTLT5Uc0NvbW1vbkluZm8pOwogCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsgLy8gVGhpcyBpbmRpY2F0ZSB0aGUgUnhJbmRpY2F0ZVNlcSBpcyBub3QgdXNlZCBub3chIQpAQCAtMjI0LDcgKzIyNCw4IEBACiAKIH0KIAotdm9pZCBBZG1pdFRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgdTMyIEluYWN0VGltZSkKK3N0YXRpYyB2b2lkIEFkbWl0VFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCSAgICBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgdTMyIEluYWN0VGltZSkKIHsKIAlkZWxfdGltZXJfc3luYygmcFRzQ29tbW9uSW5mby0+U2V0dXBUaW1lcik7CiAJZGVsX3RpbWVyX3N5bmMoJnBUc0NvbW1vbkluZm8tPkluYWN0VGltZXIpOwpAQCAtMjM0LDcgKzIzNSw5IEBACiB9CiAKIAotUFRTX0NPTU1PTl9JTkZPIFNlYXJjaEFkbWl0VFJTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpBZGRyLCB1OCBUSUQsIFRSX1NFTEVDVAlUeFJ4U2VsZWN0KQorc3RhdGljIFBUU19DT01NT05fSU5GTyBTZWFyY2hBZG1pdFRSU3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICB1OCAqQWRkciwgdTggVElELAorCQkJCQkgICBUUl9TRUxFQ1QgVHhSeFNlbGVjdCkKIHsKIAkvL0RJUkVDVElPTl9WQUxVRQlkaXI7CiAJdTgJZGlyOwpAQCAtMzA5LDE0ICszMTIsOSBAQAogCQlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBNYWtlVFNFbnRyeSgKLQkJUFRTX0NPTU1PTl9JTkZPCXBUc0NvbW1vbkluZm8sCi0JCXU4CQkqQWRkciwKLQkJUFRTUEVDX0JPRFkJcFRTUEVDLAotCQlQUU9TX1RDTEFTCXBUQ0xBUywKLQkJdTgJCVRDTEFTX051bSwKLQkJdTgJCVRDTEFTX1Byb2MKLQkpCitzdGF0aWMgdm9pZCBNYWtlVFNFbnRyeShQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgdTggKkFkZHIsCisJCQlQVFNQRUNfQk9EWSBwVFNQRUMsIFBRT1NfVENMQVMgcFRDTEFTLCB1OCBUQ0xBU19OdW0sCisJCQl1OCBUQ0xBU19Qcm9jKQogewogCXU4CWNvdW50OwogCkBAIC00NzIsMTEgKzQ3MCw4IEBACiAJfQogfQogCi12b2lkIFJlbW92ZVRzRW50cnkoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UJCSppZWVlLAotCVBUU19DT01NT05fSU5GTwkJCXBUcywKLQlUUl9TRUxFQ1QJCQlUeFJ4U2VsZWN0Ci0JKQorc3RhdGljIHZvaWQgUmVtb3ZlVHNFbnRyeShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUcywKKwkJCSAgVFJfU0VMRUNUIFR4UnhTZWxlY3QpCiB7CiAJLy91MzIgZmxhZ3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGxfY3J5cHRvLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjODcxMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaAorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKgotICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKLSAqCi0gKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gQ3J5cHRvYXBpLCBieSBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGZhc3Qubm8+Ci0gKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN6bCIbGVyLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaWZuZGVmIF9MSU5VWF9DUllQVE9fSAotI2RlZmluZSBfTElOVVhfQ1JZUFRPX0gKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0KLSNkZWZpbmUgY3J5cHRvX3JlZ2lzdGVyX2FsZyBjcnlwdG9fcmVnaXN0ZXJfYWxnX3JzbAotI2RlZmluZSBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcgY3J5cHRvX3VucmVnaXN0ZXJfYWxnX3JzbAotI2RlZmluZSBjcnlwdG9fYWxsb2NfdGZtIGNyeXB0b19hbGxvY190Zm1fcnNsCi0jZGVmaW5lIGNyeXB0b19mcmVlX3RmbSBjcnlwdG9fZnJlZV90Zm1fcnNsCi0jZGVmaW5lIGNyeXB0b19hbGdfYXZhaWxhYmxlIGNyeXB0b19hbGdfYXZhaWxhYmxlX3JzbAotCi0vKgotICogQWxnb3JpdGhtIG1hc2tzIGFuZCB0eXBlcy4KLSAqLwotI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfTUFTSwkJMHgwMDAwMDBmZgotI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSCQkweDAwMDAwMDAxCi0jZGVmaW5lIENSWVBUT19BTEdfVFlQRV9ESUdFU1QJCTB4MDAwMDAwMDIKLSNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTCTB4MDAwMDAwMDQKLQotLyoKLSAqIFRyYW5zZm9ybSBtYXNrcyBhbmQgdmFsdWVzIChmb3IgY3J0X2ZsYWdzKS4KLSAqLwotI2RlZmluZSBDUllQVE9fVEZNX01PREVfTUFTSwkJMHgwMDAwMDBmZgotI2RlZmluZSBDUllQVE9fVEZNX1JFUV9NQVNLCQkweDAwMGZmZjAwCi0jZGVmaW5lIENSWVBUT19URk1fUkVTX01BU0sJCTB4ZmZmMDAwMDAKLQotI2RlZmluZSBDUllQVE9fVEZNX01PREVfRUNCCQkweDAwMDAwMDAxCi0jZGVmaW5lIENSWVBUT19URk1fTU9ERV9DQkMJCTB4MDAwMDAwMDIKLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NGQgkJMHgwMDAwMDAwNAotI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ1RSCQkweDAwMDAwMDA4Ci0KLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkJCTB4MDAwMDAxMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVkJCTB4MDAxMDAwMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU4JMHgwMDIwMDAwMAotI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVECTB4MDA0MDAwMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTgkweDAwODAwMDAwCi0jZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9GTEFHUwkweDAxMDAwMDAwCi0KLS8qCi0gKiBNaXNjZWxsYW5lb3VzIHN0dWZmLgotICovCi0jZGVmaW5lIENSWVBUT19VTlNQRUMJCQkwCi0jZGVmaW5lIENSWVBUT19NQVhfQUxHX05BTUUJCTY0Ci0KLXN0cnVjdCBzY2F0dGVybGlzdDsKLQotLyoKLSAqIEFsZ29yaXRobXM6IG1vZHVsYXIgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG1hbmFnZWQKLSAqIHZpYSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCkgYW5kIGNyeXB0b191bnJlZ2lzdGVyX2FsZygpLgotICovCi1zdHJ1Y3QgY2lwaGVyX2FsZyB7Ci0JdW5zaWduZWQgaW50IGNpYV9taW5fa2V5c2l6ZTsKLQl1bnNpZ25lZCBpbnQgY2lhX21heF9rZXlzaXplOwotCWludCAoKmNpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKLQkJCSAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7Ci0Jdm9pZCAoKmNpYV9lbmNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwotCXZvaWQgKCpjaWFfZGVjcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKLX07Ci0KLXN0cnVjdCBkaWdlc3RfYWxnIHsKLQl1bnNpZ25lZCBpbnQgZGlhX2RpZ2VzdHNpemU7Ci0Jdm9pZCAoKmRpYV9pbml0KSh2b2lkICpjdHgpOwotCXZvaWQgKCpkaWFfdXBkYXRlKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKLQl2b2lkICgqZGlhX2ZpbmFsKSh2b2lkICpjdHgsIHU4ICpvdXQpOwotCWludCAoKmRpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKLQkJCSAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7Ci19OwotCi1zdHJ1Y3QgY29tcHJlc3NfYWxnIHsKLQlpbnQgKCpjb2FfaW5pdCkodm9pZCAqY3R4KTsKLQl2b2lkICgqY29hX2V4aXQpKHZvaWQgKmN0eCk7Ci0JaW50ICgqY29hX2NvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Ci0JaW50ICgqY29hX2RlY29tcHJlc3MpKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwotfTsKLQotI2RlZmluZSBjcmFfY2lwaGVyCWNyYV91LmNpcGhlcgotI2RlZmluZSBjcmFfZGlnZXN0CWNyYV91LmRpZ2VzdAotI2RlZmluZSBjcmFfY29tcHJlc3MJY3JhX3UuY29tcHJlc3MKLQotc3RydWN0IGNyeXB0b19hbGcgewotCXN0cnVjdCBsaXN0X2hlYWQgY3JhX2xpc3Q7Ci0JdTMyIGNyYV9mbGFnczsKLQl1bnNpZ25lZCBpbnQgY3JhX2Jsb2Nrc2l6ZTsKLQl1bnNpZ25lZCBpbnQgY3JhX2N0eHNpemU7Ci0JY29uc3QgY2hhciBjcmFfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKLQotCXVuaW9uIHsKLQkJc3RydWN0IGNpcGhlcl9hbGcgY2lwaGVyOwotCQlzdHJ1Y3QgZGlnZXN0X2FsZyBkaWdlc3Q7Ci0JCXN0cnVjdCBjb21wcmVzc19hbGcgY29tcHJlc3M7Ci0JfSBjcmFfdTsKLQotCXN0cnVjdCBtb2R1bGUgKmNyYV9tb2R1bGU7Ci19OwotCi0vKgotICogQWxnb3JpdGhtIHJlZ2lzdHJhdGlvbiBpbnRlcmZhY2UuCi0gKi8KLWludCBjcnlwdG9fcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOwotaW50IGNyeXB0b191bnJlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKLQotLyoKLSAqIEFsZ29yaXRobSBxdWVyeSBpbnRlcmZhY2UuCi0gKi8KLWludCBjcnlwdG9fYWxnX2F2YWlsYWJsZShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpOwotCi0vKgotICogVHJhbnNmb3JtczogdXNlci1pbnN0YW50aWF0ZWQgb2JqZWN0cyB3aGljaCBlbmNhcHN1bGF0ZSBhbGdvcml0aG1zCi0gKiBhbmQgY29yZSBwcm9jZXNzaW5nIGxvZ2ljLiAgTWFuYWdlZCB2aWEgY3J5cHRvX2FsbG9jX3RmbSgpIGFuZAotICogY3J5cHRvX2ZyZWVfdGZtKCksIGFzIHdlbGwgYXMgdGhlIHZhcmlvdXMgaGVscGVycyBiZWxvdy4KLSAqLwotc3RydWN0IGNyeXB0b190Zm07Ci0KLXN0cnVjdCBjaXBoZXJfdGZtIHsKLQl2b2lkICpjaXRfaXY7Ci0JdW5zaWduZWQgaW50IGNpdF9pdnNpemU7Ci0JdTMyIGNpdF9tb2RlOwotCWludCAoKmNpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOwotCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwotCWludCAoKmNpdF9lbmNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7Ci0JaW50ICgqY2l0X2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7Ci0JaW50ICgqY2l0X2RlY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKLQl2b2lkICgqY2l0X3hvcl9ibG9jaykodTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci19OwotCi1zdHJ1Y3QgZGlnZXN0X3RmbSB7Ci0Jdm9pZCAoKmRpdF9pbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLQl2b2lkICgqZGl0X3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOwotCXZvaWQgKCpkaXRfZmluYWwpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpOwotCXZvaWQgKCpkaXRfZGlnZXN0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJICAgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7Ci0JaW50ICgqZGl0X3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7Ci0jaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCi0Jdm9pZCAqZGl0X2htYWNfYmxvY2s7Ci0jZW5kaWYKLX07Ci0KLXN0cnVjdCBjb21wcmVzc190Zm0gewotCWludCAoKmNvdF9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkJCSAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwotCWludCAoKmNvdF9kZWNvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0JCQkgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwotfTsKLQotI2RlZmluZSBjcnRfY2lwaGVyCWNydF91LmNpcGhlcgotI2RlZmluZSBjcnRfZGlnZXN0CWNydF91LmRpZ2VzdAotI2RlZmluZSBjcnRfY29tcHJlc3MJY3J0X3UuY29tcHJlc3MKLQotc3RydWN0IGNyeXB0b190Zm0gewotCi0JdTMyIGNydF9mbGFnczsKLQotCXVuaW9uIHsKLQkJc3RydWN0IGNpcGhlcl90Zm0gY2lwaGVyOwotCQlzdHJ1Y3QgZGlnZXN0X3RmbSBkaWdlc3Q7Ci0JCXN0cnVjdCBjb21wcmVzc190Zm0gY29tcHJlc3M7Ci0JfSBjcnRfdTsKLQotCXN0cnVjdCBjcnlwdG9fYWxnICpfX2NydF9hbGc7Ci19OwotCi0vKgotICogVHJhbnNmb3JtIHVzZXIgaW50ZXJmYWNlLgotICovCi0KLS8qCi0gKiBjcnlwdG9fYWxsb2NfdGZtKCkgd2lsbCBmaXJzdCBhdHRlbXB0IHRvIGxvY2F0ZSBhbiBhbHJlYWR5IGxvYWRlZCBhbGdvcml0aG0uCi0gKiBJZiB0aGF0IGZhaWxzIGFuZCB0aGUga2VybmVsIHN1cHBvcnRzIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMsIGl0Ci0gKiB3aWxsIHRoZW4gYXR0ZW1wdCB0byBsb2FkIGEgbW9kdWxlIG9mIHRoZSBzYW1lIG5hbWUgb3IgYWxpYXMuICBBIHJlZmNvdW50Ci0gKiBpcyBncmFiYmVkIG9uIHRoZSBhbGdvcml0aG0gd2hpY2ggaXMgdGhlbiBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyB0cmFuc2Zvcm0uCi0gKgotICogY3J5cHRvX2ZyZWVfdGZtKCkgZnJlZXMgdXAgdGhlIHRyYW5zZm9ybSBhbmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2VzLAotICogdGhlbiBkcm9wcyB0aGUgcmVmY291bnQgb24gdGhlIGFzc29jaWF0ZWQgYWxnb3JpdGhtLgotICovCi1zdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHRmbV9mbGFncyk7Ci12b2lkIGNyeXB0b19mcmVlX3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKLQotLyoKLSAqIFRyYW5zZm9ybSBoZWxwZXJzIHdoaWNoIHF1ZXJ5IHRoZSB1bmRlcmx5aW5nIGFsZ29yaXRobS4KLSAqLwotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19uYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfbmFtZTsKLX0KLQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19tb2RuYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOwotCi0JaWYgKGFsZy0+Y3JhX21vZHVsZSkKLQkJcmV0dXJuIGFsZy0+Y3JhX21vZHVsZS0+bmFtZTsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fdGZtX2FsZ190eXBlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19pdnNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2c2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfYmxvY2tzaXplOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemU7Ci19Ci0KLS8qCi0gKiBBUEkgd3JhcHBlcnMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwotCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfaW5pdCh0Zm0pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQkJdW5zaWduZWQgaW50IG5zZykKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwotCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfdXBkYXRlKHRmbSwgc2csIG5zZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKLQl0Zm0tPmNydF9kaWdlc3QuZGl0X2ZpbmFsKHRmbSwgb3V0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJCXVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKLQl0Zm0tPmNydF9kaWdlc3QuZGl0X2RpZ2VzdCh0Zm0sIHNnLCBuc2csIG91dCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19kaWdlc3Rfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKLQlpZiAodGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JcmV0dXJuIHRmbS0+Y3J0X2RpZ2VzdC5kaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJCWNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQltZW1jcHkodGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgc3JjLCBsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9nZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCW1lbWNweShkc3QsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2NvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJCSAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOwotCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkJIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCQkJCQkgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKLQlyZXR1cm4gdGZtLT5jcnRfY29tcHJlc3MuY290X2RlY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Ci19Ci0KLS8qCi0gKiBITUFDIHN1cHBvcnQuCi0gKi8KLSNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKLXZvaWQgY3J5cHRvX2htYWNfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbik7Ci12b2lkIGNyeXB0b19obWFjX3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7Ci12b2lkIGNyeXB0b19obWFjX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgKmtleWxlbiwgdTggKm91dCk7Ci12b2lkIGNyeXB0b19obWFjKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuLAotCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7Ci0jZW5kaWYJLyogQ09ORklHX0NSWVBUT19ITUFDICovCi0KLSNlbmRpZgkvKiBfTElOVVhfQ1JZUFRPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3M2Y2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIENpcGhlciBvcGVyYXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqICAgICAgICAgICAgICAgMjAwMiBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4KLSAqICAgICAgICAgICAgICAgMjAwNCBKZWFuLUx1YyBDb29rZSA8amxjb29rZUBjZXJ0YWlua2V5LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgInNjYXR0ZXJ3YWxrLmgiCi0KLXZvaWQgKnNjYXR0ZXJ3YWxrX3doaWNoYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHVuc2lnbmVkIGludCBuYnl0ZXMsIHZvaWQgKnNjcmF0Y2gpCi17Ci0JaWYgKG5ieXRlcyA8PSB3YWxrLT5sZW5fdGhpc19wYWdlICYmCi0JICAgICgoKHVuc2lnbmVkIGxvbmcpd2Fsay0+ZGF0YSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgbmJ5dGVzIDw9Ci0JICAgIFBBR0VfQ0FDSEVfU0laRSkKLQkJcmV0dXJuIHdhbGstPmRhdGE7Ci0JZWxzZQotCQlyZXR1cm4gc2NyYXRjaDsKLX0KLQotc3RhdGljIHZvaWQgbWVtY3B5X2Rpcih2b2lkICpidWYsIHZvaWQgKnNnZGF0YSwgc2l6ZV90IG5ieXRlcywgaW50IG91dCkKLXsKLQlpZiAob3V0KQotCQltZW1jcHkoc2dkYXRhLCBidWYsIG5ieXRlcyk7Ci0JZWxzZQotCQltZW1jcHkoYnVmLCBzZ2RhdGEsIG5ieXRlcyk7Ci19Ci0KLXZvaWQgc2NhdHRlcndhbGtfc3RhcnQoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKLXsKLQl1bnNpZ25lZCBpbnQgcmVzdF9vZl9wYWdlOwotCi0Jd2Fsay0+c2cgPSBzZzsKLQotCXdhbGstPnBhZ2UgPSBzZy0+cGFnZTsKLQl3YWxrLT5sZW5fdGhpc19zZWdtZW50ID0gc2ctPmxlbmd0aDsKLQotCXJlc3Rfb2ZfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAtIChzZy0+b2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKLQl3YWxrLT5sZW5fdGhpc19wYWdlID0gbWluKHNnLT5sZW5ndGgsIHJlc3Rfb2ZfcGFnZSk7Ci0Jd2Fsay0+b2Zmc2V0ID0gc2ctPm9mZnNldDsKLX0KLQotdm9pZCBzY2F0dGVyd2Fsa19tYXAoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaykKLXsKLQl3YWxrLT5kYXRhID0ga21hcF9hdG9taWMod2Fsay0+cGFnZSkgKyB3YWxrLT5vZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjYXR0ZXJ3YWxrX3BhZ2Vkb25lKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQsCi0JCQkJIHVuc2lnbmVkIGludCBtb3JlKQotewotCS8qIHdhbGstPmRhdGEgbWF5IGJlIHBvaW50aW5nIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBuZXh0IHBhZ2U7Ci0JICAgaG93ZXZlciwgd2Uga25vdyB3ZSB0cmFuc2ZlcnJlZCBhdCBsZWFzdCBvbmUgYnl0ZS4gIFNvLAotCSAgIHdhbGstPmRhdGEgLSAxIHdpbGwgYmUgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIG1hcHBlZCBwYWdlLiAqLwotCi0JaWYgKG91dCkKLQkJZmx1c2hfZGNhY2hlX3BhZ2Uod2Fsay0+cGFnZSk7Ci0KLQlpZiAobW9yZSkgewotCQl3YWxrLT5sZW5fdGhpc19zZWdtZW50IC09IHdhbGstPmxlbl90aGlzX3BhZ2U7Ci0KLQkJaWYgKHdhbGstPmxlbl90aGlzX3NlZ21lbnQpIHsKLQkJCXdhbGstPnBhZ2UrKzsKLQkJCXdhbGstPmxlbl90aGlzX3BhZ2UgPSBtaW4od2Fsay0+bGVuX3RoaXNfc2VnbWVudCwKLQkJCQkJCSAgKHVuc2lnbmVkKVBBR0VfQ0FDSEVfU0laRSk7Ci0JCQl3YWxrLT5vZmZzZXQgPSAwOwotCQl9Ci0JCWVsc2UKLQkJCXNjYXR0ZXJ3YWxrX3N0YXJ0KHdhbGssIHNnX25leHQod2Fsay0+c2cpKTsKLQl9Ci19Ci0KLXZvaWQgc2NhdHRlcndhbGtfZG9uZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0LCBpbnQgbW9yZSkKLXsKLQljcnlwdG9fa3VubWFwKHdhbGstPmRhdGEsIG91dCk7Ci0JaWYgKHdhbGstPmxlbl90aGlzX3BhZ2UgPT0gMCB8fCAhbW9yZSkKLQkJc2NhdHRlcndhbGtfcGFnZWRvbmUod2Fsaywgb3V0LCBtb3JlKTsKLX0KLQotLyoKLSAqIERvIG5vdCBjYWxsIHRoaXMgdW5sZXNzIHRoZSB0b3RhbCBsZW5ndGggb2YgYWxsIG9mIHRoZSBmcmFnbWVudHMKLSAqIGhhcyBiZWVuIHZlcmlmaWVkIGFzIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLgotICovCi1pbnQgc2NhdHRlcndhbGtfY29weWNodW5rcyh2b2lkICpidWYsIHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCi0JCQkgICBzaXplX3QgbmJ5dGVzKQotewotCWlmIChidWYgIT0gd2Fsay0+ZGF0YSkgewotCQl3aGlsZSAobmJ5dGVzID4gd2Fsay0+bGVuX3RoaXNfcGFnZSkgewotCQkJbWVtY3B5X2RpcihidWYsIHdhbGstPmRhdGEsIHdhbGstPmxlbl90aGlzX3BhZ2UsIG91dCk7Ci0JCQlidWYgKz0gd2Fsay0+bGVuX3RoaXNfcGFnZTsKLQkJCW5ieXRlcyAtPSB3YWxrLT5sZW5fdGhpc19wYWdlOwotCi0JCQlrdW5tYXBfYXRvbWljKHdhbGstPmRhdGEpOwotCQkJc2NhdHRlcndhbGtfcGFnZWRvbmUod2Fsaywgb3V0LCAxKTsKLQkJCXNjYXR0ZXJ3YWxrX21hcCh3YWxrKTsKLQkJfQotCi0JCW1lbWNweV9kaXIoYnVmLCB3YWxrLT5kYXRhLCBuYnl0ZXMsIG91dCk7Ci0JfQotCi0Jd2Fsay0+b2Zmc2V0ICs9IG5ieXRlczsKLQl3YWxrLT5sZW5fdGhpc19wYWdlIC09IG5ieXRlczsKLQl3YWxrLT5sZW5fdGhpc19zZWdtZW50IC09IG5ieXRlczsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2NDQ2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICogQ29weXJpZ2h0IChjKSAyMDAyIEFkYW0gSi4gUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDA0IEplYW4tTHVjIENvb2tlIDxqbGNvb2tlQGNlcnRhaW5rZXkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpZm5kZWYgX0NSWVBUT19TQ0FUVEVSV0FMS19ICi0jZGVmaW5lIF9DUllQVE9fU0NBVFRFUldBTEtfSAotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0KLXN0cnVjdCBzY2F0dGVyX3dhbGsgewotCXN0cnVjdCBzY2F0dGVybGlzdAkqc2c7Ci0Jc3RydWN0IHBhZ2UJCSpwYWdlOwotCXZvaWQJCQkqZGF0YTsKLQl1bnNpZ25lZCBpbnQJCWxlbl90aGlzX3BhZ2U7Ci0JdW5zaWduZWQgaW50CQlsZW5fdGhpc19zZWdtZW50OwotCXVuc2lnbmVkIGludAkJb2Zmc2V0OwotfTsKLQotLyogRGVmaW5lIHNnX25leHQgaXMgYW4gaW5saW5lIHJvdXRpbmUgbm93IGluIGNhc2Ugd2Ugd2FudCB0byBjaGFuZ2UKLSAgIHNjYXR0ZXJsaXN0IHRvIGEgbGlua2VkIGxpc3QgbGF0ZXIuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbmV4dChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQotewotCXJldHVybiBzZyArIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHNjYXR0ZXJ3YWxrX3NhbWVidWYoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsa19pbiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrX291dCwKLQkJCQkgICAgICB2b2lkICpzcmNfcCwgdm9pZCAqZHN0X3ApCi17Ci0JcmV0dXJuIHdhbGtfaW4tPnBhZ2UgPT0gd2Fsa19vdXQtPnBhZ2UgJiYKLQkgICAgICAgd2Fsa19pbi0+b2Zmc2V0ID09IHdhbGtfb3V0LT5vZmZzZXQgJiYKLQkgICAgICAgd2Fsa19pbi0+ZGF0YSA9PSBzcmNfcCAmJiB3YWxrX291dC0+ZGF0YSA9PSBkc3RfcDsKLX0KLQotdm9pZCAqc2NhdHRlcndhbGtfd2hpY2hidWYoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgdW5zaWduZWQgaW50IG5ieXRlcywgdm9pZCAqc2NyYXRjaCk7Ci12b2lkIHNjYXR0ZXJ3YWxrX3N0YXJ0KHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpOwotaW50IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Modm9pZCAqYnVmLCBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KTsKLXZvaWQgc2NhdHRlcndhbGtfbWFwKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQpOwotdm9pZCBzY2F0dGVyd2Fsa19kb25lKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQsIGludCBtb3JlKTsKLQotI2VuZGlmICAvKiBfQ1JZUFRPX1NDQVRURVJXQUxLX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF85M2N4Ni5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMKaW5kZXggYzYxNzI5Yi4uY2QwNjA1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiCiAKLXZvaWQgZXByb21fY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYml0KQorc3RhdGljIHZvaWQgZXByb21fY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYml0KQogewogCXU4IGNtZHJlZzsKIApAQCAtMzcsNyArMzcsNyBAQAogfQogCiAKLXZvaWQgZXByb21fY2tfY3ljbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGVwcm9tX2NrX2N5Y2xlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTggY21kcmVnOwogCkBAIC01Myw3ICs1Myw3IEBACiB9CiAKIAotdm9pZCBlcHJvbV93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgYml0KQorc3RhdGljIHZvaWQgZXByb21fdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGJpdCkKIHsKIAl1OCBjbWRyZWc7CiAKQEAgLTY4LDcgKzY4LDcgQEAKIH0KIAogCi1zaG9ydCBlcHJvbV9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc2hvcnQgZXByb21fcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXU4IGJpdDsKIApAQCAtODIsNyArODIsNyBAQAogfQogCiAKLXZvaWQgZXByb21fc2VuZF9iaXRzX3N0cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiW10sIGludCBsZW4pCitzdGF0aWMgdm9pZCBlcHJvbV9zZW5kX2JpdHNfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJbXSwgaW50IGxlbikKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwppbmRleCBjMmJjYmUyLi4xYmI2MTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAKIAogCi12b2lkIENhbVJlc2V0QWxsRW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIENhbVJlc2V0QWxsRW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1MzIgdWxjb21tYW5kID0gMDsKIAkvLzIwMDQvMDIvMTEgIEluIHN0YXRpYyBXRVAsIE9JRF9BRERfS0VZIG9yIE9JRF9BRERfV0VQIGFyZSBzZXQgYmVmb3JlIFNUQSBhc3NvY2lhdGUgdG8gQVAuCkBAIC01OTEsMTIgKzU5MSw2IEBACiAJcnRsODE5Ml9wcm9jID0gcHJvY19ta2RpcihSVEw4MTl4VV9NT0RVTEVfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOwogfQogCi0KLXZvaWQgcnRsODE5Ml9wcm9jX21vZHVsZV9yZW1vdmUodm9pZCkKLXsKLQlyZW1vdmVfcHJvY19lbnRyeShSVEw4MTl4VV9NT0RVTEVfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOwotfQotCiAvKgogICogc2VxX2ZpbGUgd3JhcHBlcnMgZm9yIHByb2NmaWxlIHNob3cgcm91dGluZXMuCiAgKi8KQEAgLTY3Myw3ICs2NjcsNyBAQAogCXJldHVybiAodXNlZCA8IE1BWF9UWF9VUkIpOwogfQogCi12b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTY4OSwyNCArNjgzLDYgQEAKIAkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIkVFUFJPTSBhZGRyICV4IDogJXgiLCBpLCBlcHJvbV9yZWFkKGRldiwgaSkpOwogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IVyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdm9pZCBydGw4MTkyX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtb2RlKQotewotCXU4IGVjbWQ7Ci0JcmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgJmVjbWQpOwotCWVjbWQgPSBlY21kICYgfkVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9NQVNLOwotCWVjbWQgPSBlY21kIHwgKG1vZGU8PEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCk7Ci0JZWNtZCA9IGVjbWQgJiB+RVBST01fQ1NfQklUOwotCWVjbWQgPSBlY21kICYgfkVQUk9NX0NLX0JJVDsKLQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgZWNtZCk7Ci19Ci0KLQogdm9pZCBydGw4MTkyX3VwZGF0ZV9tc3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC05MDMsMTIgKzg3OSw2IEBACiAJcmV0dXJuOwogfQogCi0KLWludCBhbGxvY190eF9iZWFjb25fZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQogewogCXN3aXRjaCAocmF0ZSkgewpAQCAtMTAxMSwxMyArOTgxLDEzIEBACiB9CiAKIAotdm9pZCBydGw4MTkyX2RhdGFfaGFyZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX2RhdGFfaGFyZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJLy9GSVhNRSAhIQogfQogCiAKLXZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTkyX2RhdGFfaGFyZF9yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAkvLyBGSVhNRSAhIQogfQpAQCAtMTAyNSw3ICs5OTUsNyBAQAogLyogdGhpcyBmdW5jdGlvbiBUWCBkYXRhIGZyYW1lcyB3aGVuIHRoZSBpZWVlODAyMTEgc3RhY2sgcmVxdWlyZXMgdGhpcy4KICAqIEl0IGNoZWNrcyBhbHNvIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgaWVlZSB0eCBxdWV1ZSwgZXZlbnR1YWxseSBkbyBpdAogICovCi12b2lkIHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJhdGUpCitzdGF0aWMgdm9pZCBydGw4MTkyX2hhcmRfZGF0YV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByYXRlKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlpbnQgcmV0OwpAQCAtMTA1Myw3ICsxMDIzLDcgQEAKICAqIElmIHRoZSByaW5nIGlzIGZ1bGwgcGFja2V0IGFyZSBkcm9wcGVkIChmb3IgZGF0YSBmcmFtZSB0aGUgcXVldWUKICAqIGlzIHN0b3BwZWQgYmVmb3JlIHRoaXMgY2FuIGhhcHBlbikuCiAgKi8KLWludCBydGw4MTkyX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBydGw4MTkyX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlpbnQgcmV0OwpAQCAtMTMxOCw3ICsxMjg4LDggQEAKIAkJLyogRG9uJ3Qgc2VuZCBkYXRhIGZyYW1lIGR1cmluZyBzY2FubmluZy4qLwogCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkgIT0gMCkgJiYKIAkJICAgICghKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkpKSB7Ci0JCQlpZiAoTlVMTCAhPSAoc2tiID0gc2tiX2RlcXVldWUoJihwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0pKSkpCisJCQlza2IgPSBza2JfZGVxdWV1ZSgmKHByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkpOworCQkJaWYgKHNrYikKIAkJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYiwgZGV2KTsKIAogCQkJcmV0dXJuOyAvL21vZGlmaWVkIGJ5IGRhdmlkIHRvIGF2b2lkIGZ1cnRoZXIgcHJvY2Vzc2luZyBBTVNEVQpAQCAtMTM1OCwyNSArMTMyOSw3IEBACiAKIH0KIAotdm9pZCBydGw4MTkyX2JlYWNvbl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JdTggbXNyLCBtc3JtLCBtc3IyOwotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXJlYWRfbmljX2J5dGUoZGV2LCBNU1IsICZtc3IpOwotCW1zcm0gPSBtc3IgJiBNU1JfTElOS19NQVNLOwotCW1zcjIgPSBtc3IgJiB+TVNSX0xJTktfTUFTSzsKLQotCWlmIChOSUNfODE5MlUgPT0gcHJpdi0+Y2FyZF84MTkyKQotCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiW01BWF9SWF9VUkJdKTsKLQlpZiAoKG1zcm0gPT0gKE1TUl9MSU5LX0FESE9DPDxNU1JfTElOS19TSElGVCkgfHwKLQkgICAgKG1zcm0gPT0gKE1TUl9MSU5LX01BU1RFUjw8TVNSX0xJTktfU0hJRlQpKSkpIHsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIG1zcjIgfCBNU1JfTElOS19OT05FKTsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIG1zcik7Ci0JfQotfQotCi12b2lkIHJ0bDgxOTJfY29uZmlnX3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpyYXRlX2NvbmZpZykKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfY29uZmlnX3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpyYXRlX2NvbmZpZykKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQ7CkBAIC0xNDIzLDcgKzEzNzYsNyBAQAogI2RlZmluZSBTSE9SVF9TTE9UX1RJTUUgOQogI2RlZmluZSBOT05fU0hPUlRfU0xPVF9USU1FIDIwCiAKLXZvaWQgcnRsODE5Ml91cGRhdGVfY2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjYXApCitzdGF0aWMgdm9pZCBydGw4MTkyX3VwZGF0ZV9jYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGNhcCkKIHsKIAl1MzIgdG1wID0gMDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNDQ1LDcgKzEzOTgsNyBAQAogCX0KIAogfQotdm9pZCBydGw4MTkyX25ldF91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfbmV0X3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMTU2MCwxMSArMTUxMyw2IEBACiAJcmV0dXJuIE5fREJQUzsKIH0KIAotdm9pZCBydGw4MTl4VV9jbWRfaXNyKHN0cnVjdCB1cmIgKnR4X2NtZF91cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXVzYl9mcmVlX3VyYih0eF9jbWRfdXJiKTsKLX0KLQogdW5zaWduZWQgaW50IHR4cXVldWUyb3V0cGlwZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHR4X3F1ZXVlKQogewogCWlmICh0eF9xdWV1ZSA+PSA5KSB7CkBAIC0xNjczLDcgKzE2MjEsNyBAQAogCXJldHVybiBRdWV1ZVNlbGVjdDsKIH0KIAotdTggTVJhdGVUb0h3UmF0ZTgxOTBQY2kodTggcmF0ZSkKK3N0YXRpYyB1OCBNUmF0ZVRvSHdSYXRlODE5MFBjaSh1OCByYXRlKQogewogCXU4ICByZXQgPSBERVNDOTBfUkFURTFNOwogCkBAIC0yMDM5LDcgKzE5ODcsNyBAQAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIHJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIHJ0bDgxOTJfbGlua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfbGlua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CkBAIC0yMDcxLDcgKzIwMTksNyBAQAogfTsKIAogCi12b2lkIHJ0bDgxOTJfdXBkYXRlX2JlYWNvbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBydGw4MTkyX3VwZGF0ZV9iZWFjb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCB1cGRhdGVfYmVhY29uX3dxLndvcmspOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKQEAgLTIwODYsOCArMjAzNCw4IEBACiAvKgogKiBiYWNrZ3JvdW5kIHN1cHBvcnQgdG8gcnVuIFFvUyBhY3RpdmF0ZSBmdW5jdGlvbmFsaXR5CiAqLwotaW50IFdEQ0FQQVJBX0FERFtdID0ge0VEQ0FQQVJBX0JFLCBFRENBUEFSQV9CSywgRURDQVBBUkFfVkksIEVEQ0FQQVJBX1ZPfTsKLXZvaWQgcnRsODE5Ml9xb3NfYWN0aXZhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIGludCBXRENBUEFSQV9BRERbXSA9IHtFRENBUEFSQV9CRSwgRURDQVBBUkFfQkssIEVEQ0FQQVJBX1ZJLCBFRENBUEFSQV9WT307CitzdGF0aWMgdm9pZCBydGw4MTkyX3Fvc19hY3RpdmF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHFvc19hY3RpdmF0ZSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OwpAQCAtMjMxNSw3ICsyMjYzLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHM4MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgYm9vbCBHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHM4MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJYm9vbAkJCVJldmFsOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTIzMjksNyArMjI3Nyw3IEBACiAJcmV0dXJuIFJldmFsOwogfQogCi12b2lkIHJ0bDgxOTJfcmVmcmVzaF9zdXBwb3J0cmF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcmVmcmVzaF9zdXBwb3J0cmF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKIAkvL3dlIGRvIG5vdCBjb25zaWRlciBzZXQgc3VwcG9ydCByYXRlIGZvciBBQkcgbW9kZSwgb25seSBIVCBNQ1MgcmF0ZSBpcyBzZXQgaGVyZS4KQEAgLTIzNDAsNyArMjI4OCw3IEBACiAJcmV0dXJuOwogfQogCi11OCBydGw4MTkyX2dldFN1cHBvcnRlZFdpcmVsZWVNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdTggcnRsODE5Ml9nZXRTdXBwb3J0ZWRXaXJlbGVlTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1OCByZXQgPSAwOwpAQCAtMjM1OSw3ICsyMzA3LDcgQEAKIAl9CiAJcmV0dXJuIHJldDsKIH0KLXZvaWQgcnRsODE5Ml9TZXRXaXJlbGVzc01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggd2lyZWxlc3NfbW9kZSkKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHdpcmVsZXNzX21vZGUpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4IGJTdXBwb3J0TW9kZSA9IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoZGV2KTsKQEAgLTI3NzksNyArMjcyNyw3IEBACiAJcmV0dXJuOwogfQogCi1zaG9ydCBydGw4MTkyX2dldF9jaGFubmVsX21hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHNob3J0IHJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCWlmIChwcml2LT5DaGFubmVsUGxhbiA+IENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOKSB7CkBAIC0yNzkyLDcgKzI3NDAsNyBAQAogCXJldHVybiAwOwogfQogCi1zaG9ydCBydGw4MTkyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzaG9ydCBydGw4MTkyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTI4NDAsNyArMjc4OCw3IEBACiAgKiAgcmV0dXJuOiAgbm9uZQogICogIG5vdGljZTogIFRoaXMgcGFydCBuZWVkIHRvIG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgcmF0ZSBzZXQgd2UgZmlsdGVyZWQKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJ0bDgxOTJfaHdjb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaHdjb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1MzIgcmVnUkFUUiA9IDAsIHJlZ1JSU1IgPSAwOwogCXU4IHJlZ0J3T3BNb2RlID0gMCwgcmVnVG1wID0gMDsKQEAgLTI5MjMsNyArMjg3MSw3IEBACiAKIAogLy9Jbml0aWFsaXplQWRhcHRlciBhbmQgUGh5Q2ZnCi1ib29sIHJ0bDgxOTJfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGJvb2wgcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUzMiBkd1JlZ1JlYWQgPSAwOwpAQCAtMzE3OSw3ICszMTI3LDcgQEAKICoJPEFzc3VtcHRpb246IFJUX1RYX1NQSU5MT0NLIGlzIGFjcXVpcmVkLj4KICoJRmlyc3QgYWRkZWQ6IDIwMDYuMTEuMTkgYnkgZW1pbHkKICovCi1SRVNFVF9UWVBFIFR4Q2hlY2tTdHVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIFJFU0VUX1RZUEUgVHhDaGVja1N0dWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXU4CQkJUXVldWVJRDsKQEAgLTMyODIsNyArMzIzMCw3IEBACiAqCiAqCTgxODUgYW5kIDgxODViIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLiBUaGlzIGlzIGFkZGVkIGJ5IEVtaWx5IGF0IDIwMDYuMTEuMjQKICovCi1SRVNFVF9UWVBFIHJ0bDgxOXhfaWZjaGVja19yZXNldG9ybm90KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgUkVTRVRfVFlQRSBydGw4MTl4X2lmY2hlY2tfcmVzZXRvcm5vdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlSRVNFVF9UWVBFCVR4UmVzZXRUeXBlID0gUkVTRVRfVFlQRV9OT1JFU0VUOwpAQCAtMzMyMSw3ICszMjY5LDcgQEAKIAogCiAKLXZvaWQgQ2FtUmVzdG9yZUFsbEVudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBDYW1SZXN0b3JlQWxsRW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1OCBFbnRyeUlkID0gMDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0zMzk3LDcgKzMzNDUsNyBAQAogLy8gVGhlIG1ldGhvZCBjaGVja2luZyBUeC9SeCBzdHVjayBvZiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSBGVywKIC8vIHdoaWNoIHJlcG9ydHMgVHggYW5kIFJ4IGNvdW50ZXIgdG8gcmVnaXN0ZXIgMHgxMjggYW5kIDB4MTMwLgogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgcnRsODE5eF9pZnNpbGVudHJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBydGw4MTl4X2lmc2lsZW50cmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTgJcmVzZXRfdGltZXMgPSAwOwpAQCAtMzUxNyw3ICszNDY1LDcgQEAKIAlwcmludGsoIlxuIik7CiB9CiAKLXZvaWQgcnRsODE5eF91cGRhdGVfcnhjb3VudHMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUzMiAqVG90YWxSeEJjbk51bSwKK3N0YXRpYyB2b2lkIHJ0bDgxOXhfdXBkYXRlX3J4Y291bnRzKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1MzIgKlRvdGFsUnhCY25OdW0sCiAJCQkgICAgIHUzMiAqVG90YWxSeERhdGFOdW0pCiB7CiAJdTE2CQkJU2xvdEluZGV4OwpAQCAtMzUzNiw3ICszNDg0LDcgQEAKIH0KIAogCi1leHRlcm4gdm9pZCBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQordm9pZCBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgcjgxOTJfcHJpdiwgd2F0Y2hfZG9nX3dxKTsKQEAgLTM2MzQsNyArMzU4Miw3IEBACiB9CiAKIAotaW50IHJ0bDgxOTJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBydGw4MTkyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJaW50IHJldDsKQEAgLTM3NTQsNyArMzcwMiw3IEBACiB9CiAKIAotaW50IHI4MTkyX3NldF9tYWNfYWRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKm1hYykKK3N0YXRpYyBpbnQgcjgxOTJfc2V0X21hY19hZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWFjKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBtYWM7CkBAIC0zNzcwLDcgKzM3MTgsNyBAQAogfQogCiAvKiBiYXNlZCBvbiBpcHcyMjAwIGRyaXZlciAqLwotaW50IHJ0bDgxOTJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3N0YXRpYyBpbnQgcnRsODE5Ml9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilycTsKQEAgLTM4NjEsNyArMzgwOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdTggSHdSYXRlVG9NUmF0ZTkwKGJvb2wgYklzSFQsIHU4IHJhdGUpCitzdGF0aWMgdTggSHdSYXRlVG9NUmF0ZTkwKGJvb2wgYklzSFQsIHU4IHJhdGUpCiB7CiAJdTggIHJldF9yYXRlID0gMHhmZjsKIApAQCAtMzk0Nyw3ICszODk1LDcgQEAKIAogLy9ieSBhbXkgMDgwNjA2CiAKLWxvbmcgcnRsODE5eF90cmFuc2xhdGVfdG9kYm0odTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4KS8vIDAtMTAwIGluZGV4Lgorc3RhdGljIGxvbmcgcnRsODE5eF90cmFuc2xhdGVfdG9kYm0odTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4KS8vIDAtMTAwIGluZGV4LgogewogCWxvbmcJc2lnbmFsX3Bvd2VyOyAvLyBpbiBkQm0uCiAKQEAgLTM5NjMsNyArMzkxMSw5IEBACiAgICAgYmUgYSBsb2NhbCBzdGF0aWMuIE90aGVyd2lzZSwgaXQgbWF5IGluY3JlYXNlIHdoZW4gd2UgcmV0dXJuIGZyb20gUzMvUzQuIFRoZQogICAgIHZhbHVlIHdpbGwgYmUga2VwdCBpbiBtZW1vcnkgb3IgZGlzay4gRGVjbGFyZSB0aGUgdmFsdWUgaW4gdGhlIGFkYXB0b3IKICAgICBhbmQgaXQgd2lsbCBiZSByZWluaXRpYWxpemVkIHdoZW4gcmV0dXJuZWQgZnJvbSBTMy9TNC4gKi8KLXZvaWQgcnRsODE5Ml9wcm9jZXNzX3BoeWluZm8oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4ICpidWZmZXIsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBwcmV2aW91c19zdGF0cywgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcGN1cnJlbnRfc3RhdHMpCitzdGF0aWMgdm9pZCBydGw4MTkyX3Byb2Nlc3NfcGh5aW5mbyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggKmJ1ZmZlciwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHByZXZpb3VzX3N0YXRzLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwY3VycmVudF9zdGF0cykKIHsKIAlib29sIGJjaGVjayA9IGZhbHNlOwogCXU4CXJmcGF0aDsKQEAgLTQ0NDksOCArNDM5OSw4IEBACiAJfQogfQkvKiBRdWVyeVJ4UGh5U3RhdHVzODE5MFBjaSAqLwogCi12b2lkIHJ0bDgxOTJfcmVjb3JkX3J4ZGVzY19mb3JsYXRlcnVzZShzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3JjX3N0YXRzLAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwdGFyZ2V0X3N0YXRzKQorc3RhdGljIHZvaWQgcnRsODE5Ml9yZWNvcmRfcnhkZXNjX2ZvcmxhdGVydXNlKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBzcmNfc3RhdHMsCisJCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnB0YXJnZXRfc3RhdHMpCiB7CiAJcHRhcmdldF9zdGF0cy0+YklzQU1QRFUgPSBwc3JjX3N0YXRzLT5iSXNBTVBEVTsKIAlwdGFyZ2V0X3N0YXRzLT5iRmlyc3RNUERVID0gcHNyY19zdGF0cy0+YkZpcnN0TVBEVTsKQEAgLTQ3MjEsNyArNDY3MSw3IEBACiAJCQkrIFN0YXR1cy0+UnhCdWZTaGlmdCk7CiB9CiAKLXZvaWQgcnRsODE5Ml9yeF9ub21hbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9ub21hbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OwpAQCAtNDg3MSw4ICs0ODIxLDggQEAKIAogfQogCi12b2lkIHJ0bDgxOXh1c2JfcHJvY2Vzc19yZWNlaXZlZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzKQorc3RhdGljIHZvaWQgcnRsODE5eHVzYl9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzKQogewogCXU4CSpmcmFtZTsKIAl1MTYgICAgIGZyYW1lX2xlbiA9IDA7CkBAIC00OTMyLDcgKzQ4ODIsNyBAQAogfQogCiAKLXZvaWQgcnRsODE5Ml9yeF9jbWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcnhfY21kKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCmluZGV4IDQxZmI2N2IuLmQ5N2FkN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKQEAgLTUwLDM0ICs1MCw3IEBACiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBleHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuCXZvaWQJaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4Jdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi1leHRlcm4gdm9pZCBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLQotZXh0ZXJuCXZvaWQJaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotZXh0ZXJuCXZvaWQJZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLWV4dGVybgl2b2lkCWRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGJvb2wgIGJpbmNoMTQpOwotZXh0ZXJuCXZvaWQJZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybgl2b2lkCWRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybgl2b2lkCWRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCQl1MzIJCWRtX3R5cGUsCi0JCQkJCQkJCXUzMgkJZG1fdmFsdWUpOwotZXh0ZXJuCXZvaWQJRE1fQ2hhbmdlRnN5bmNTZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJCQkJCQlzMzIJCURNX1R5cGUsCi0JCQkJCQkJCQkJCQlzMzIJCURNX1ZhbHVlKTsKLWV4dGVybgl2b2lkIGRtX2ZvcmNlX3R4X2Z3X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCQkJCQl1MzIJCWZvcmNlX3R5cGUsCi0JCQkJCQkJCQkJdTMyCQlmb3JjZV92YWx1ZSk7Ci1leHRlcm4Jdm9pZAlkbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4Jdm9pZAlkbV9yZl9vcGVyYXRpb25fdGVzdF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOwotZXh0ZXJuCXZvaWQJZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLWV4dGVybgl2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4Jdm9pZCBkbV9jaGVja19mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybgl2b2lkCWRtX3NoYWRvd19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTU1LDggKzEyOCw3IEBACiAvLwkJVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGludm9rZWQgYXQgZHJpdmVyIGludGlhbGl6YXRpb24gb25jZS4KIC8vCiAvLwotZXh0ZXJuCXZvaWQKLWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCkBAIC0xNzYsNyArMTQ4LDcgQEAKIAogfQkvLyBJbml0SGFsRG0KIAotZXh0ZXJuIHZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKIAlkbV9kZUluaXRfZnN5bmMoZGV2KTsKQEAgLTI0Miw3ICsyMTQsNyBAQAogCiAKIAotZXh0ZXJuICB2b2lkICAgIGhhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAkvL3N0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIApAQCAtMjc1LDcgKzI0Nyw3IEBACiAgICoJMDEvMTYvMjAwOAlNSEMJCVJGX1R5cGUgaXMgYXNzaWduZWQgaW4gUmVhZEFkYXB0ZXJJbmZvKCkuIFdlIG11c3QgY2FsbAogICAqCQkJCQkJdGhlIGZ1bmN0aW9uIGFmdGVyIG1ha2luZyBzdXJlIFJGX1R5cGUuCiAgICovCi1leHRlcm4gdm9pZCBpbml0X3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC04NzUsNyArODQ3LDcgQEAKIAlwcml2LT50eHBvd2VyX2NvdW50ID0gMDsKIH0KIAotZXh0ZXJuCXZvaWQJZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3ZvaWQgZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CiAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsdHhwb3dlcl90cmFja2luZ193cSk7CkBAIC0xNjA2LDEwICsxNTc4LDcgQEAKIAogCiAKLWV4dGVybiB2b2lkIGRtX2Nja190eHBvd2VyX2FkanVzdCgKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCWJvb2wgIGJpbmNoMTQKLSkKK3ZvaWQgZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgYmluY2gxNCkKIHsJLy8gZG1fQ0NLVHhQb3dlckFkanVzdAogCiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMTY0Miw3ICsxNjExLDcgQEAKIAogfQkvLyBkbV9UWFBvd2VyUmVzZXRSZWNvdmVyeQogCi1leHRlcm4gdm9pZCBkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTMyCXJlZ19yYXRyID0gcHJpdi0+cmF0ZV9hZGFwdGl2ZS5sYXN0X3JhdHI7CkBAIC0xNzE4LDcgKzE2ODcsNyBAQAogfQkvLyBkbV9CQkluaXRpYWxHYWluUmVzdG9yZQogCiAKLWV4dGVybiB2b2lkIGRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTE3NzMsOSArMTc0Miw5IEBACiAgKgkwNS8yOS8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybiB2b2lkIGRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCQl1MzIJCWRtX3R5cGUsCi0JCQkJCQkJCXUzMgkJZG1fdmFsdWUpCisKK3ZvaWQgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkbV90eXBlLAorCQkJCSAgICAgICB1MzIgZG1fdmFsdWUpCiB7CiAJaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0gpCiAJewpAQCAtMTg0MiwyNCArMTgxMSw4IEBACiAJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4ID0gKHU4KWRtX3ZhbHVlOwogCX0KIH0JLyogRE1fQ2hhbmdlRHluYW1pY0luaXRHYWluVGhyZXNoICovCi1leHRlcm4Jdm9pZAotZG1fY2hhbmdlX2ZzeW5jX3NldHRpbmcoCi0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQlzMzIJCURNX1R5cGUsCi0JczMyCQlETV9WYWx1ZSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKLQlpZiAoRE1fVHlwZSA9PSAwKQkvLyBtb25pdG9yIDB4YzM4IHJlZ2lzdGVyCi0JewotCQlpZihETV9WYWx1ZSA+IDEpCi0JCQlETV9WYWx1ZSA9IDE7Ci0JCXByaXYtPmZyYW1lc3luY01vbml0b3IgPSAodTgpRE1fVmFsdWU7Ci0JCS8vRGJnUHJpbnQoInBIYWxEYXRhLT5mcmFtZXN5bmNNb25pdG9yID0gJWQiLCBwSGFsRGF0YS0+ZnJhbWVzeW5jTW9uaXRvcik7Ci0JfQotfQotCi1leHRlcm4gdm9pZAordm9pZAogZG1fY2hhbmdlX3J4cGF0aF9zZWxlY3Rpb25fc2V0dGluZygKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCXMzMgkJRE1fVHlwZSwKQEAgLTI1NDAsNyArMjQ5Myw3IEBACiAJfQogfQogCi1leHRlcm4gdm9pZCBkbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCkBAIC0yNjYwLDI2ICsyNjEzLDYgQEAKIAlsYXN0UnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OwogfQkvLyBkbV9DaGVja0VkY2FUdXJibwogCi1leHRlcm4gdm9pZCBETV9DVFNUb1NlbGZTZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIERNX1R5cGUsIHUzMiBETV9WYWx1ZSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7Ci0KLQlpZiAoRE1fVHlwZSA9PSAwKQkvLyBDVFMgdG8gc2VsZiBkaXNhYmxlL2VuYWJsZQotCXsKLQkJaWYoRE1fVmFsdWUgPiAxKQotCQkJRE1fVmFsdWUgPSAxOwotCQlwcml2LT5pZWVlODAyMTEtPmJDVFNUb1NlbGZFbmFibGUgPSAoYm9vbClETV9WYWx1ZTsKLQkJLy9EYmdQcmludCgicE1nbnRJbmZvLT5iQ1RTVG9TZWxmRW5hYmxlID0gJWRcbiIsIHBNZ250SW5mby0+YkNUU1RvU2VsZkVuYWJsZSk7Ci0JfQotCWVsc2UgaWYoRE1fVHlwZSA9PSAxKSAvL0NUUyB0byBzZWxmIFRoCi0JewotCQlpZihETV9WYWx1ZSA+PSA1MCkKLQkJCURNX1ZhbHVlID0gNTA7Ci0JCXByaXYtPmllZWU4MDIxMS0+Q1RTVG9TZWxmVEggPSAodTgpRE1fVmFsdWU7Ci0JCS8vRGJnUHJpbnQoInBNZ250SW5mby0+Q1RTVG9TZWxmVEggPSAlZFxuIiwgcE1nbnRJbmZvLT5DVFNUb1NlbGZUSCk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBkbV9pbml0X2N0c3Rvc2VsZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKQEAgLTI3NzksNyArMjcxMiw3IEBACiAgKgkwMS8zMC8yMDA4CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4Jdm9pZAlkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit2b2lkIGRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CiAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYscmZwYXRoX2NoZWNrX3dxKTsKQEAgLTMxMzksNyArMzA3Miw3IEBACiAJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKIH0KIAotZXh0ZXJuIHZvaWQgZG1fZnN5bmNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQordm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsKQEAgLTM0NzgsNyArMzQxMSw3IEBACiAgKgkwNS8yOS8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybiB2b2lkIGRtX3NoYWRvd19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGRtX3NoYWRvd19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTgJcGFnZTsKIAl1MTYJb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oCmluZGV4IGFlNTUwNTIuLjMwMDhmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKQEAgLTIwMCw5ICsyMDAsOSBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuCWRpZ190CWRtX2RpZ3RhYmxlOwotZXh0ZXJuCXU4CQlkbV9zaGFkb3dbMTZdWzI1Nl07Ci1leHRlcm4gRFJ4UGF0aFNlbCAgICAgIERNX1J4UGF0aFNlbFRhYmxlOworZXh0ZXJuIGRpZ190IGRtX2RpZ3RhYmxlOworZXh0ZXJuIHU4IGRtX3NoYWRvd1sxNl1bMjU2XTsKK2V4dGVybiBEUnhQYXRoU2VsIERNX1J4UGF0aFNlbFRhYmxlOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIApAQCAtMjEyLDI1ICsyMTIsMjMgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybiAgdm9pZCAgICBpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiAgdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCitleHRlcm4gdm9pZCBpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLWV4dGVybiAgdm9pZCAgICBpbml0X3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gIHZvaWQgICAgZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1leHRlcm4gIHZvaWQgICAgZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiAgdm9pZCAgICBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gIHZvaWQgICAgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQl1MzIgZG1fdHlwZSwgdTMyIGRtX3ZhbHVlKTsKLWV4dGVybiAgdm9pZCAgICBkbV9mb3JjZV90eF9md19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXUzMiBmb3JjZV90eXBlLCB1MzIgZm9yY2VfdmFsdWUpOwotZXh0ZXJuICB2b2lkICAgIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiAgdm9pZCAgICBkbV9yZl9vcGVyYXRpb25fdGVzdF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOwotZXh0ZXJuICB2b2lkICAgIGRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1leHRlcm4gIHZvaWQgZG1fZnN5bmNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKLWV4dGVybgl2b2lkCWRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sICBiaW5jaDE0KTsKLWV4dGVybiAgdm9pZCAgICBkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuIHZvaWQgZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICB1MzIgZG1fdHlwZSwgdTMyIGRtX3ZhbHVlKTsKK2V4dGVybiB2b2lkIGRtX2ZvcmNlX3R4X2Z3X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQl1MzIgZm9yY2VfdHlwZSwgdTMyIGZvcmNlX3ZhbHVlKTsKK2V4dGVybiB2b2lkIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRtX3JmX29wZXJhdGlvbl90ZXN0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuIHZvaWQgZG1fZnN5bmNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIGRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sICBiaW5jaDE0KTsKK2V4dGVybiB2b2lkIGRtX3NoYWRvd19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRHZW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRHZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0Njc4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUR2VuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLwotLy8gSU9UIEFjdGlvbiBmb3IgZGlmZmVyZW50IEFQCi0vLwotdHlwZWRlZiBlbnVtIF9IVF9JT1RfQUNUSU9OewotCUhUX0lPVF9BQ1RfVFhfVVNFX0FNU0RVXzRLID0gMHgwMDAwMDAwMSwKLQlIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV84SyA9IDB4MDAwMDAwMDIsCi0JSFRfSU9UX0FDVF9ERUNMQVJFX01DUzEzID0gMHgwMDAwMDAwNCwKLQlIVF9JT1RfQUNUX0RJU0FCTEVfRURDQV9UVVJCTyA9IDB4MDAwMDAwMDgsCi0JSFRfSU9UX0FDVF9NR05UX1VTRV9DQ0tfNk0gPSAweDAwMDAwMDEwLAotCUhUX0lPVF9BQ1RfQ0REX0ZTWU5DID0gMHgwMDAwMDAyMCwKLQlIVF9JT1RfQUNUX1BVUkVfTl9NT0RFID0gMHgwMDAwMDA0MCwKLX1IVF9JT1RfQUNUSU9OX0UsICpQSFRfSU9UX0FDVElPTl9FOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVFR5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRUeXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmI4ZTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVFR5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0jaWZuZGVmIF9SODE5WFVfSFRUWVBFX0hfCi0jZGVmaW5lIF9SODE5WFVfSFRUWVBFX0hfCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUaGUgSFQgQ2FwYWJpbGl0eSBlbGVtZW50IGlzIHByZXNlbnQgaW4gYmVhY29ucywgYXNzb2NpYXRpb24gcmVxdWVzdCwKLSAqIHJlYXNzb2NpYXRpb24gcmVxdWVzdCBhbmQgcHJvYmUgcmVzcG9uc2UgZnJhbWVzCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBPcGVyYXRpb24gbW9kZSB2YWx1ZSAqLwotI2RlZmluZSBIVF9PUE1PREVfTk9fUFJPVEVDVAkJMAotI2RlZmluZSBIVF9PUE1PREVfT1BUSU9OQUwJCTEKLSNkZWZpbmUgSFRfT1BNT0RFXzQwTUhaX1BST1RFQ1QJCTIKLSNkZWZpbmUgSFRfT1BNT0RFX01JWEVECQkJMwotCi0vKiBNSU1PIFBvd2VyIFNhdmUgU2V0dGluZ3MgKi8KLSNkZWZpbmUgTUlNT19QU19TVEFUSUMJCQkwCi0jZGVmaW5lIE1JTU9fUFNfRFlOQU1JQwkJCTEKLSNkZWZpbmUgTUlNT19QU19OT0xJTUlUCQkJMwotCi0KLS8qIFRoZXJlIHNob3VsZCBiZSAxMjggYml0cyB0byBjb3ZlciBhbGwgb2YgdGhlIE1DUyByYXRlcy4gSG93ZXZlciwgc2luY2UKLSAqIDgxOTAgZG9lcyBub3Qgc3VwcG9ydCB0b28gbXVjaCByYXRlcywgb25lIGludGVnZXIgaXMgcXVpdGUgZW5vdWdoLiAqLwotCi0jZGVmaW5lIHNIVENMbmcJCQkJNAotCi0KLSNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfQklUTUFQCTB4MDAwMDAwZmYKLSNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18yU1NfQklUTUFQCTB4MDAwMGZmMDAKLSNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfMlNTX0JJVE1BUAlcCi0JCShIVF9NQ1NfMVNTX0JJVE1BUCB8IEhUX01DU18xU1NfMlNTX0JJVE1BUCkKLQotCi10eXBlZGVmIGVudW0gX0hUX01DU19SQVRFIHsKLQlIVF9NQ1MwICAgPSAweDAwMDAwMDAxLAotCUhUX01DUzEgICA9IDB4MDAwMDAwMDIsCi0JSFRfTUNTMiAgID0gMHgwMDAwMDAwNCwKLQlIVF9NQ1MzICAgPSAweDAwMDAwMDA4LAotCUhUX01DUzQgICA9IDB4MDAwMDAwMTAsCi0JSFRfTUNTNSAgID0gMHgwMDAwMDAyMCwKLQlIVF9NQ1M2ICAgPSAweDAwMDAwMDQwLAotCUhUX01DUzcgICA9IDB4MDAwMDAwODAsCi0JSFRfTUNTOCAgID0gMHgwMDAwMDEwMCwKLQlIVF9NQ1M5ICAgPSAweDAwMDAwMjAwLAotCUhUX01DUzEwICA9IDB4MDAwMDA0MDAsCi0JSFRfTUNTMTEgID0gMHgwMDAwMDgwMCwKLQlIVF9NQ1MxMiAgPSAweDAwMDAxMDAwLAotCUhUX01DUzEzICA9IDB4MDAwMDIwMDAsCi0JSFRfTUNTMTQgID0gMHgwMDAwNDAwMCwKLQlIVF9NQ1MxNSAgPSAweDAwMDA4MDAwLAotCS8qIERvIG5vdCBkZWZpbmUgTUNTMzIgaGVyZSBhbHRob3VnaCA4MTkwIHN1cHBvcnQgTUNTMzIgKi8KLX0gSFRfTUNTX1JBVEUsICpQSFRfTUNTX1JBVEU7Ci0KLS8qIFJlcHJlc2VudCBDaGFubmVsIFdpZHRoIGluIEhUIENhcGFiaWxpdGllcyAqLwotdHlwZWRlZiBlbnVtIF9IVF9DSEFOTkVMX1dJRFRIIHsKLQlIVF9DSEFOTkVMX1dJRFRIXzIwICAgID0gMCwKLQlIVF9DSEFOTkVMX1dJRFRIXzIwXzQwID0gMSwKLX0gSFRfQ0hBTk5FTF9XSURUSCwgKlBIVF9DSEFOTkVMX1dJRFRIOwotCi0vKiBSZXByZXNlbnQgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IGluIEhUIENhcGFiaWxpdGllcwotICogVGhpcyBpcyBhdmFpbGFibGUgb25seSBpbiA0ME1oeiBtb2RlLiAqLwotdHlwZWRlZiBlbnVtIF9IVF9FWFRDSE5MX09GRlNFVCB7Ci0JSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUID0gMCwKLQlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUiAgPSAxLAotCUhUX0VYVENITkxfT0ZGU0VUX05PX0RFRiA9IDIsCi0JSFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIgID0gMywKLX0gSFRfRVhUQ0hOTF9PRkZTRVQsICpQSFRfRVhUQ0hOTF9PRkZTRVQ7Ci0KLXR5cGVkZWYgZW51bSBfQ0hOTE9QIHsKLQlDSE5MT1BfTk9ORSAgID0gMCwJLyogTm8gQWN0aW9uIG5vdyAqLwotCUNITkxPUF9TQ0FOICAgPSAxLAkvKiBTY2FuIGluIHByb2dyZXNzICovCi0JQ0hOTE9QX1NXQlcgICA9IDIsCS8qIEJhbmR3aWR0aCBzd2l0Y2hpbmcgaW4gcHJvZ3Jlc3MgKi8KLQlDSE5MT1BfU1dDSE5MID0gMywJLyogU29mdHdhcmUgQ2hhbm5lbCBzd2l0Y2hpbmcgaW4gcHJvZ3Jlc3MgKi8KLX0gQ0hOTE9QLCAqUENITkxPUDsKLQotLyogRGV0ZXJtaW5lIGlmIHRoZSBDaGFubmVsIE9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcyAqLwotI2RlZmluZSBDSEhMT1BfSU5fUFJPR1JFU1MoX3BIVEluZm8pCVwKLQkJKCgoX3BIVEluZm8pLT5DaG5sT3AgPiBDSE5MT1BfTk9ORSkgPyBUUlVFIDogRkFMU0UpCi0KLQotdHlwZWRlZiBlbnVtIF9IVF9BQ1RJT04gewotCUFDVF9SRUNPTU1BTkRfV0lEVEgJCT0gMCwKLQlBQ1RfTUlNT19QV1JfU0FWRQkJPSAxLAotCUFDVF9QU01QCQkJPSAyLAotCUFDVF9TRVRfUENPX1BIQVNFCQk9IDMsCi0JQUNUX01JTU9fQ0hMX01FQVNVUkUJCT0gNCwKLQlBQ1RfUkVDSVBST0NJVFlfQ09SUkVDVAkJPSA1LAotCUFDVF9NSU1PX0NTSV9NQVRSSUNTCQk9IDYsCi0JQUNUX01JTU9fTk9DT01QUl9TVEVFUgkJPSA3LAotCUFDVF9NSU1PX0NPTVBSX1NURUVSCQk9IDgsCi0JQUNUX0FOVEVOTkFfU0VMRUNUCQk9IDksCi19IEhUX0FDVElPTiwgKlBIVF9BQ1RJT047Ci0KLQotLyogRGVmaW5lIHN1Yi1jYXJyaWVyIG1vZGUgZm9yIDQwTUhaLiAqLwotdHlwZWRlZiBlbnVtIF9IVF9CYW5kd2lkdGhfNDBNSFpfU3ViX0NhcnJpZXIgewotCVNDX01PREVfRFVQTElDQVRFID0gMCwKLQlTQ19NT0RFX0xPV0VSICAgICA9IDEsCi0JU0NfTU9ERV9VUFBFUiAgICAgPSAyLAotCVNDX01PREVfRlVMTDQwTUhaID0gMywKLX0gSFRfQlc0MF9TQ19FOwotCi10eXBlZGVmCXN0cnVjdCBfSFRfQ0FQQUJJTElUWV9FTEUgewotCi0JLyogSFQgY2FwYWJpbGl0eSBpbmZvICovCi0JdTgJQWR2Q29kaW5nOjE7Ci0JdTgJQ2hsV2lkdGg6MTsKLQl1OAlNaW1vUHdyU2F2ZToyOwotCXU4CUdyZWVuRmllbGQ6MTsKLQl1OAlTaG9ydEdJMjBNaHo6MTsKLQl1OAlTaG9ydEdJNDBNaHo6MTsKLQl1OAlUeFNUQkM6MTsKLQl1OAlSeFNUQkM6MjsKLQl1OAlEZWxheUJBOjE7Ci0JdTgJTWF4QU1TRFVTaXplOjE7Ci0JdTgJRHNzQ0NrOjE7Ci0JdTgJUFNNUDoxOwotCXU4CVJzdmQxOjE7Ci0JdTgJTFNpZ1R4b3BQcm90ZWN0OjE7Ci0KLQkvKiBNQUMgSFQgcGFyYW1ldGVycyBpbmZvICovCi0JdTgJTWF4UnhBTVBEVUZhY3RvcjoyOwotCXU4CU1QRFVEZW5zaXR5OjM7Ci0JdTgJUnN2ZDI6MzsKLQotCS8qIFN1cHBvcnRlZCBNQ1Mgc2V0ICovCi0JdTgJTUNTWzE2XTsKLQotCi0JLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCi0JdTE2CUV4dEhUQ2FwSW5mbzsKLQotCS8qIFRYQkYgQ2FwYWJpbGl0aWVzICovCi0JdTgJVHhCRkNhcFs0XTsKLQotCS8qIEFudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdGllcyAqLwotCXU4CUFTQ2FwOwotCi19IF9fcGFja2VkIEhUX0NBUEFCSUxJVFlfRUxFLCAqUEhUX0NBUEFCSUxJVFlfRUxFOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVGhlIEhUIEluZm9ybWF0aW9uIGVsZW1lbnQgaXMgcHJlc2VudCBpbiBiZWFjb25zCi0gKiBPbmx5IEFQIGlzIHJlcXVpcmVkIHRvIGluY2x1ZGUgdGhpcyBlbGVtZW50Ci0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0IF9IVF9JTkZPUk1BVElPTl9FTEUgewotCXU4CUNvbnRyb2xDaGw7Ci0KLQl1OAlFeHRDaGxPZmZzZXQ6MjsKLQl1OAlSZWNvbW1lbWRlZFR4V2lkdGg6MTsKLQl1OAlSSUZTOjE7Ci0JdTgJUFNNUEFjY2Vzc09ubHk6MTsKLQl1OAlTcnZJbnRHcmFudWxhcml0eTozOwotCi0JdTgJT3B0TW9kZToyOwotCXU4CU5vbkdGRGV2UHJlc2VudDoxOwotCXU4CVJldmQxOjU7Ci0JdTgJUmV2ZDI6ODsKLQotCXU4CVJzdmQzOjY7Ci0JdTgJRHVhbEJlYWNvbjoxOwotCXU4CUR1YWxDVFNQcm90ZWN0OjE7Ci0KLQl1OAlTZWNvbmRhcnlCZWFjb246MTsKLQl1OAlMU2lnVHhvcFByb3RlY3RGdWxsOjE7Ci0JdTgJUGNvQWN0aXZlOjE7Ci0JdTgJUGNvUGhhc2U6MTsKLQl1OAlSc3ZkNDo0OwotCi0JdTgJQmFzaWNNU0NbMTZdOwotfSBfX3BhY2tlZCBIVF9JTkZPUk1BVElPTl9FTEUsICpQSFRfSU5GT1JNQVRJT05fRUxFOwotCi0vKiBNSU1PIFBvd2VyIFNhdmUgY29udHJvbCBmaWVsZC4KLSAqIFRoaXMgaXMgYXBwZWFyIGluIE1JTU8gUG93ZXIgU2F2ZSBBY3Rpb24gRnJhbWUgKi8KLXR5cGVkZWYgc3RydWN0IF9NSU1PUFNfQ1RSTCB7Ci0JdTgJTWltb1BzRW5hYmxlOjE7Ci0JdTgJTWltb1BzTW9kZToxOwotCXU4CVJlc2VydmVkOjY7Ci19IE1JTU9QU19DVFJMLCAqUE1JTU9QU19DVFJMOwotCi10eXBlZGVmIGVudW0gX0hUX1NQRUNfVkVSIHsKLQlIVF9TUEVDX1ZFUl9JRUVFID0gMCwKLQlIVF9TUEVDX1ZFUl9FV0MgPSAxLAotfSBIVF9TUEVDX1ZFUiwgKlBIVF9TUEVDX1ZFUjsKLQotdHlwZWRlZiBlbnVtIF9IVF9BR0dSRV9NT0RFX0UgewotCUhUX0FHR19BVVRPID0gMCwKLQlIVF9BR0dfRk9SQ0VfRU5BQkxFID0gMSwKLQlIVF9BR0dfRk9SQ0VfRElTQUJMRSA9IDIsCi19IEhUX0FHR1JFX01PREVfRSwgKlBIVF9BR0dSRV9NT0RFX0U7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIFRoZSBEYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgSFQgcmVsYXRlZCB2YXJpYWJsZXMgd2hlbiBjYXJkIGlzCi0gKiAgY29uZmlndXJlZCBhcyBub24tQVAgU1RBIG1vZGUuCi0gKiAgKipOb3RlKiogQ3VycmVudF94eHggc2hvdWxkIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlIGluIEhUSW5pdGlhbGl6ZUhUSW5mbygpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdCBfUlRfSElHSF9USFJPVUdIUFVUIHsKLQl1OAkJCWJFbmFibGVIVDsKLQl1OAkJCWJDdXJyZW50SFRTdXBwb3J0OwotCS8qIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJpbGl0eSAqLwotCXU4CQkJYlJlZ0JXNDBNSHo7Ci0JdTgJCQliQ3VyQlc0ME1IejsKLQkvKiBUeCBTaG9ydCBHSSBmb3IgNDBNaHogKi8KLQl1OAkJCWJSZWdTaG9ydEdJNDBNSHo7Ci0JdTgJCQliQ3VyU2hvcnRHSTQwTUh6OwotCS8qIFR4IFNob3J0IEdJIGZvciAyME1IeiAqLwotCXU4CQkJYlJlZ1Nob3J0R0kyME1IejsKLQl1OAkJCWJDdXJTaG9ydEdJMjBNSHo7Ci0JLyogVHggQ0NLIHJhdGUgY2FwYWJpbGl0eSAqLwotCXU4CQkJYlJlZ1N1cHBDQ0s7Ci0JdTgJCQliQ3VyU3VwcENDSzsKLQotCS8qIDgwMi4xMW4gc3BlYyB2ZXJzaW9uIGZvciAicGVlciIgKi8KLQlIVF9TUEVDX1ZFUgkJZVBlZXJIVFNwZWNWZXI7Ci0KLQotCS8qIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJTZWxmIiAqLwotCS8qIFRoaXMgaXMgSFQgY2FwIGVsZW1lbnQgc2VudCB0byBwZWVyIFNUQSwgd2hpY2ggYWxzbyBpbmRpY2F0ZQotCSAqIEhUIFJ4IGNhcGFiaWxpdGllcy4gKi8KLQlIVF9DQVBBQklMSVRZX0VMRQlTZWxmSFRDYXA7Ci0JSFRfSU5GT1JNQVRJT05fRUxFCVNlbGZIVEluZm87Ci0KLQkvKiBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciAiUGVlciIgKi8KLQl1OAkJCVBlZXJIVENhcEJ1ZlszMl07Ci0JdTgJCQlQZWVySFRJbmZvQnVmWzMyXTsKLQotCi0JLyogQS1NU0RVIHJlbGF0ZWQgKi8KLQkvKiBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eSAqLwotCXU4CQkJYkFNU0RVX1N1cHBvcnQ7Ci0JdTE2CQkJbkFNU0RVX01heFNpemU7Ci0JdTgJCQliQ3VycmVudF9BTVNEVV9TdXBwb3J0OwotCXUxNgkJCW5DdXJyZW50X0FNU0RVX01heFNpemU7Ci0KLQotCS8qIEEtTVBEVSByZWxhdGVkICovCi0JLyogVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eSAqLwotCXU4CQkJYkFNUERVRW5hYmxlOwotCXU4CQkJYkN1cnJlbnRBTVBEVUVuYWJsZTsKLQl1OAkJCUFNUERVX0ZhY3RvcjsKLQl1OAkJCUN1cnJlbnRBTVBEVUZhY3RvcjsKLQl1OAkJCU1QRFVfRGVuc2l0eTsKLQl1OAkJCUN1cnJlbnRNUERVRGVuc2l0eTsKLQotCS8qIEZvcmNlZCBBLU1QRFUgZW5hYmxlICovCi0JSFRfQUdHUkVfTU9ERV9FCQlGb3JjZWRBTVBEVU1vZGU7Ci0JdTgJCQlGb3JjZWRBTVBEVUZhY3RvcjsKLQl1OAkJCUZvcmNlZE1QRFVEZW5zaXR5OwotCi0JLyogRm9yY2VkIEEtTVNEVSBlbmFibGUgKi8KLQlIVF9BR0dSRV9NT0RFX0UJCUZvcmNlZEFNU0RVTW9kZTsKLQl1MTYJCQlGb3JjZWRBTVNEVU1heFNpemU7Ci0KLQl1OAkJCWJGb3JjZWRTaG9ydEdJOwotCi0JdTgJCQlDdXJyZW50T3BNb2RlOwotCi0JLyogTUlNTyBQUyByZWxhdGVkICovCi0JdTgJCQlTZWxmTWltb1BzOwotCXU4CQkJUGVlck1pbW9QczsKLQotCS8qIDQwTUh6IENoYW5uZWwgT2Zmc2V0IHNldHRpbmdzLiAqLwotCUhUX0VYVENITkxfT0ZGU0VUCUN1clNUQUV4dENobmxPZmZzZXQ7Ci0JdTgJCQliQ3VyVHhCVzQwTUh6OwkvKiBJZiB3ZSB1c2UgNDAgTUh6IHRvIFR4ICovCi0JdTgJCQlQZWVyQmFuZHdpZHRoOwotCi0JLyogRm9yIEJhbmR3aWR0aCBTd2l0Y2hpbmcgKi8KLQl1OAkJCWJTd0J3SW5Qcm9ncmVzczsKLQlDSE5MT1AJCQlDaG5sT3A7IC8qIHN3IHN3aXRjaGluZyBjaGFubmVsIGluIHByb2dyZXNzLiAqLwotCXU4CQkJU3dCd1N0ZXA7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJU3dCd1RpbWVyOwotCi0JLyogRm9yIFJlYWx0ZWsgcHJvcHJpZXRhcnkgQS1NUERVIGZhY3RvciBmb3IgYWdncmVnYXRpb24gKi8KLQl1OAkJCWJSZWdSVDJSVEFnZ3JlZ2F0aW9uOwotCXU4CQkJYkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uOwotCXU4CQkJYkN1cnJlbnRSVDJSVExvbmdTbG90VGltZTsKLQl1OAkJCXN6UlQyUlRBZ2dCdWZmZXJbMTBdOwotCi0JLyogUnggUmVvcmRlciBjb250cm9sICovCi0JdTgJCQliUmVnUnhSZW9yZGVyRW5hYmxlOwotCXU4CQkJYkN1clJ4UmVvcmRlckVuYWJsZTsKLQl1OAkJCVJ4UmVvcmRlcldpblNpemU7Ci0JdTgJCQlSeFJlb3JkZXJQZW5kaW5nVGltZTsKLQl1MTYJCQlSeFJlb3JkZXJEcm9wQ291bnRlcjsKLQotI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCi0JdTgJCQlVc2JUeEFnZ3JOdW07Ci0jZW5kaWYKLSNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAotCXU4CQkJVXNiUnhGd0FnZ3JFbjsKLQl1OAkJCVVzYlJ4RndBZ2dyUGFnZU51bTsKLQl1OAkJCVVzYlJ4RndBZ2dyUGFja2V0TnVtOwotCXU4CQkJVXNiUnhGd0FnZ3JUaW1lb3V0OwotI2VuZGlmCi0KLQkvKiBBZGQgZm9yIEJyb2FkY29tKExpbmtzeXMpIElPVC4gKi8KLQl1OAkJCWJJc1BlZXJCY207Ci0KLQkvKiBGb3IgSU9UIGlzc3VlLiAqLwotCXUzMgkJCUlPVEFjdGlvbjsKLX0gUlRfSElHSF9USFJPVUdIUFVULCAqUFJUX0hJR0hfVEhST1VHSFBVVDsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoZSBEYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgSFQgcmVsYXRlZCB2YXJpYWJsZSBmb3IgImVhY2ggU3RhIgotICogd2hlbiBjYXJkIGlzIGNvbmZpZ3VyZWQgYXMgIkFQIG1vZGUiCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdCBfUlRfSFRJTkZPX1NUQV9FTlRSWSB7Ci0JdTgJCQliRW5hYmxlSFQ7Ci0KLQl1OAkJCWJTdXBwb3J0Q2NrOwotCi0JdTE2CQkJQU1TRFVfTWF4U2l6ZTsKLQotCXU4CQkJQU1QRFVfRmFjdG9yOwotCXU4CQkJTVBEVV9EZW5zaXR5OwotCi0JdTgJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7Ci0KLQl1OAkJCWJCdzQwTUh6OwotCi0JdTgJCQlNaW1vUHM7Ci0KLQl1OAkJCU1jc1JhdGVTZXRbMTZdOwotCi0KLX0gUlRfSFRJTkZPX1NUQV9FTlRSWSwgKlBSVF9IVElORk9fU1RBX0VOVFJZOwotCi0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIEFQIgotICogd2hlbiBjYXJkIGlzIGNvbmZpZ3VyZWQgYXMgIlNUQSBtb2RlIgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdCBfQlNTX0hUIHsKLQotCXU4CQkJCWJkU3VwcG9ydEhUOwotCi0JLyogSFQgcmVsYXRlZCBlbGVtZW50cyAqLwotCXU4CQkJCWJkSFRDYXBCdWZbMzJdOwotCXUxNgkJCQliZEhUQ2FwTGVuOwotCXU4CQkJCWJkSFRJbmZvQnVmWzMyXTsKLQl1MTYJCQkJYmRIVEluZm9MZW47Ci0KLQlIVF9TUEVDX1ZFUgkJCWJkSFRTcGVjVmVyOwotCi0JdTgJCQkJYmRSVDJSVEFnZ3JlZ2F0aW9uOwotCXU4CQkJCWJkUlQyUlRMb25nU2xvdFRpbWU7Ci19IEJTU19IVCwgKlBCU1NfSFQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9NSU1PX1JTU0kgewotCXUzMglFbmFibGVBbnRlbm5hOwotCXUzMglBbnRlbm5hQTsKLQl1MzIJQW50ZW5uYUI7Ci0JdTMyCUFudGVubmFDOwotCXUzMglBbnRlbm5hRDsKLQl1MzIJQXZlcmFnZTsKLX0gTUlNT19SU1NJLCAqUE1JTU9fUlNTSTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01JTU9fRVZNIHsKLQl1MzIJRVZNMTsKLQl1MzIJRVZNMjsKLX0gTUlNT19FVk0sICpQTUlNT19FVk07Ci0KLXR5cGVkZWYgc3RydWN0IF9GQUxTRV9BTEFSTV9TVEFUSVNUSUNTIHsKLQl1MzIJQ250X1Bhcml0eV9GYWlsOwotCXUzMglDbnRfUmF0ZV9JbGxlZ2FsOwotCXUzMglDbnRfQ3JjOF9mYWlsOwotCXUzMglDbnRfYWxsOwotfSBGQUxTRV9BTEFSTV9TVEFUSVNUSUNTLCAqUEZBTFNFX0FMQVJNX1NUQVRJU1RJQ1M7Ci0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5jCmluZGV4IDdiZGNiZDMuLjcyM2M4NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAKIH0KIAotdm9pZCBjbWRwa3RfYmVhY29udGltZXJpbnRlcnJ1cHRfODE5eHVzYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgY21kcGt0X2JlYWNvbnRpbWVyaW50ZXJydXB0XzgxOXh1c2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTE2IHR4X3JhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKaW5kZXggZDZhNmRlMy4uZWNmYjY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYwpAQCAtMTcsNyArMTcsOCBAQAogI2luY2x1ZGUgInI4MTl4VV9maXJtd2FyZV9pbWcuaCIKICNpbmNsdWRlICJyODE5eFVfZmlybXdhcmUuaCIKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotdm9pZCBmaXJtd2FyZV9pbml0X3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisKK3N0YXRpYyB2b2lkIGZpcm13YXJlX2luaXRfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdgkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJcnRfZmlybXdhcmUJCSpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CkBAIC0yOSw3ICszMCw4IEBACiAgKiBzZWdtZW50IHRoZSBpbWcgYW5kIHVzZSB0aGUgcHRyIGFuZCBsZW5ndGggdG8gcmVtZW1iZXIgaW5mbyBvbiBlYWNoIHNlZ21lbnQKICAqCiAgKi8KLWJvb2wgZndfZG93bmxvYWRfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqY29kZV92aXJ0dWFsX2FkZHJlc3MsIHUzMiBidWZmZXJfbGVuKQorc3RhdGljIGJvb2wgZndfZG93bmxvYWRfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqY29kZV92aXJ0dWFsX2FkZHJlc3MsCisJCQkgICAgIHUzMiBidWZmZXJfbGVuKQogewogCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCWJvb2wJCSAgICBydF9zdGF0dXMgPSB0cnVlOwpAQCAtMTAzLDQ2ICsxMDUsNiBAQAogCiB9CiAKLWJvb2wKLWZ3U2VuZE51bGxQYWNrZXQoCi0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQl1MzIJCQlMZW5ndGgKLSkKLXsKLQlib29sCXJ0U3RhdHVzID0gdHJ1ZTsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAgICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgc2tfYnVmZgkgICAgKnNrYjsKLQljYl9kZXNjCQkgICAgKnRjYl9kZXNjOwotCXVuc2lnbmVkIGNoYXIJICAgICpwdHJfYnVmOwotCWJvb2wJYkxhc3RJbml0UGFja2V0ID0gZmFsc2U7Ci0KLQkvL1BsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKLQotCS8vR2V0IFRDQiBhbmQgbG9jYWwgYnVmZmVyIGZyb20gY29tbW9uIHBvb2wuIChJdCBpcyBzaGFyZWQgYnkgQ21kUSwgTWdudFEsIGFuZCBVU0IgY29hbGVzY2UgRGF0YVEpCi0Jc2tiICA9IGRldl9hbGxvY19za2IoTGVuZ3RoKyA0KTsKLQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksJmRldixzaXplb2YoZGV2KSk7Ci0JdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwotCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOwotCXRjYl9kZXNjLT5iQ21kT3JJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9JTklUOwotCXRjYl9kZXNjLT5iTGFzdEluaVBrdCA9IGJMYXN0SW5pdFBhY2tldDsKLQlwdHJfYnVmID0gc2tiX3B1dChza2IsIExlbmd0aCk7Ci0JbWVtc2V0KHB0cl9idWYsMCxMZW5ndGgpOwotCXRjYl9kZXNjLT50eGJ1Zl9zaXplPSAodTE2KUxlbmd0aDsKLQotCWlmICghcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCl8fAotCQkJKCFza2JfcXVldWVfZW1wdHkoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pKXx8XAotCQkJKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkgKSB7Ci0JCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCI9PT09PT09PT09PT09PT09PT09TlVMTCBwYWNrZXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7Ci0JCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKLQkJfSBlbHNlIHsKLQkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGRldik7Ci0JCX0KLQotCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOwotCXJldHVybiBydFN0YXR1czsKLX0KLQotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQcm9jZWR1cmU6ICAgIENoZWNrIHdoZXRoZXIgbWFpbiBjb2RlIGlzIGRvd25sb2FkIE9LLiBJZiBPSywgdHVybiBvbiBDUFUKIC8vCkBAIC0xNTYsNyArMTE4LDcgQEAKIC8vICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZCBiZSB0ZXJtaW5hdGVkCiAvLyAgICAgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyAtIGlmIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc3VjY2VzcwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYm9vbCBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGJvb2wgQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub25DUFUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlib29sCQlydF9zdGF0dXMgPSB0cnVlOwogCWludAkJY2hlY2tfcHV0Y29kZU9LX3RpbWUgPSAyMDAwMDAsIGNoZWNrX2Jvb3RPa190aW1lID0gMjAwMDAwOwpAQCAtMjA1LDcgKzE2Nyw3IEBACiAJcmV0dXJuIHJ0X3N0YXR1czsKIH0KIAotYm9vbCBDUFVjaGVja19maXJtd2FyZV9yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGJvb2wgQ1BVY2hlY2tfZmlybXdhcmVfcmVhZHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAogCWJvb2wJCXJ0X3N0YXR1cyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYwppbmRleCBkZjBmOWQxLi4wNzg1ZGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmMKQEAgLTEsNSArMSw2IEBACiAvKkNyZWF0ZWQgb24gIDIwMDgvIDcvMTYsICA1OjMxKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgInI4MTl4VV9maXJtd2FyZV9pbWcuaCIKIAogdTMyIFJ0bDgxOTJVc2JQSFlfUkVHQXJyYXlbXSA9IHsKIDB4MCwgfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCmluZGV4IDM5Y2Q0MjYuLmI5ZjM1MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYwpAQCAtNDQsNyArNDQsNyBAQAogICogb3V0cHV0OiAgIG5vbmUKICAqIHJldHVybjogICB1MzIJcmV0dXJuIHRoZSBzaGlmdCBiaXQgcG9zaXRpb24gb2YgdGhlIG1hc2sKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdCh1MzIgYml0bWFzaykKK3N0YXRpYyB1MzIgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdCh1MzIgYml0bWFzaykKIHsKIAl1MzIgaTsKIApAQCAtMTQ0LDggKzE0NCw4IEBACiAgKiAgICAgICAgICAgIERyaXZlciBoZXJlIG5lZWQgdG8gaW1wbGVtZW50ICgxKSBhbmQgKDIpCiAgKiAgICAgICAgICAgIC0tLW5lZWQgbW9yZSBzcGVjIGZvciB0aGlzIGluZm9ybWF0aW9uLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwKLQkJCSAgICAgdTMyIG9mZnNldCkKK3N0YXRpYyB1MzIgcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBvZmZzZXQpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUzMiByZXQgPSAwOwpAQCAtMjI5LDggKzIyOSw5IEBACiAgKiBSZWdfTW9kZTIJMQkJMQkJCVJlZyAzMSB+IDQ1KDB4MSB+IDB4ZikKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIG9mZnNldCwgdTMyIGRhdGEpCitzdGF0aWMgdm9pZCBydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIG9mZnNldCwKKwkJCQkgICAgICB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTMyIERhdGFBbmRBZGRyID0gMCwgbmV3X29mZnNldCA9IDA7CkBAIC01NzEsNyArNTcyLDcgQEAKICAqIG5vdGljZTogICAgSW5pdGlhbGl6YXRpb24gdmFsdWUgaGVyZSBpcyBjb25zdGFudCBhbmQgaXQgc2hvdWxkIG5ldmVyCiAgKiAgICAgICAgICAgIGJlIGNoYW5nZWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIApAQCAtNzgwLDcgKzc4MSw3IEBACiAgKiBub3RpY2U6ICAgIEluaXRpYWxpemF0aW9uIHZhbHVlIG1heSBjaGFuZ2UgYWxsIHRoZSB0aW1lLCBzbyBwbGVhc2UgbWFrZQogICogICAgICAgICAgICBzdXJlIGl0IGhhcyBiZWVuIHN5bmNlZCB3aXRoIHRoZSBuZXdlc3QuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX0JCX0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTggcmVnX3U4ID0gMCwgZUNoZWNrSXRlbSA9IDAsIHN0YXR1cyA9IDA7CkBAIC0xMDcwLDcgKzEwNzEsNyBAQAogICogcmV0dXJuOiAgICBub25lCiAgKiBub3RpY2U6CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX1NldFR4UG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQorc3RhdGljIHZvaWQgcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTgJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS1tjaGFubmVsLTFdOwpAQCAtMTIzOSw5ICsxMjQwLDkgQEAKICAqIHJldHVybjogICAgdHJ1ZSBpZiBmaW5pc2hlZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgKiBub3RpY2U6CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoU3dDaG5sQ21kICpDbWRUYWJsZSwgdTMyIENtZFRhYmxlSWR4LAotCQkJCSB1MzIgQ21kVGFibGVTeiwgU3dDaG5sQ21kSUQgQ21kSUQsIHUzMiBQYXJhMSwKLQkJCQkgdTMyIFBhcmEyLCB1MzIgbXNEZWxheSkKK3N0YXRpYyB1OCBydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShTd0NobmxDbWQgKkNtZFRhYmxlLCB1MzIgQ21kVGFibGVJZHgsCisJCQkJCXUzMiBDbWRUYWJsZVN6LCBTd0NobmxDbWRJRCBDbWRJRCwKKwkJCQkJdTMyIFBhcmExLCB1MzIgUGFyYTIsIHUzMiBtc0RlbGF5KQogewogCVN3Q2hubENtZCAqcENtZDsKIApAQCAtMTI3Niw4ICsxMjc3LDggQEAKICAqIHJldHVybjogICAgdHJ1ZSBpZiBmaW5pc2hlZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgKiBub3RpY2U6ICAgIFdhaXQgZm9yIHNpbXBsZXIgZnVuY3Rpb24gdG8gcmVwbGFjZSBpdAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggcnRsODE5Ml9waHlfU3dDaG5sU3RlcEJ5U3RlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsLCB1OCAqc3RhZ2UsCi0JCQkJdTggKnN0ZXAsIHUzMiAqZGVsYXkpCitzdGF0aWMgdTggcnRsODE5Ml9waHlfU3dDaG5sU3RlcEJ5U3RlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsLAorCQkJCSAgICAgICB1OCAqc3RhZ2UsIHU4ICpzdGVwLCB1MzIgKmRlbGF5KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlTd0NobmxDbWQJUHJlQ29tbW9uQ21kW01BWF9QUkVDTURfQ05UXTsKQEAgLTE0MzMsNyArMTQzNCw3IEBACiAgKiByZXR1cm46ICAgIG5vbmUKICAqIG5vdGljZTogICAgV2Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9waHlfRmluaXNoU3dDaG5sTm93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCitzdGF0aWMgdm9pZCBydGw4MTkyX3BoeV9GaW5pc2hTd0NobmxOb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTMyCWRlbGF5ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZHJ2X3R5cGVzLmgKaW5kZXggYTA3NGZlOC4uMzM2MmU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZHJ2X3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZHJ2X3R5cGVzLmgKQEAgLTE2OCw3ICsxNjgsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqeG1pdFRocmVhZDsKIAlwaWRfdCByZWN2VGhyZWFkOwogCXVpbnQoKmR2b2JqX2luaXQpKHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlcik7Ci0Jdm9pZCAgKCpkdm9ial9kZWluaXQpKHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlcik7CisJdm9pZCAoKmR2b2JqX2RlaW5pdCkoc3RydWN0IF9hZGFwdGVyICphZGFwdGVyKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKIAlpbnQgYnVwOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9pZWVlODAyMTEuYwppbmRleCBjYzY4ZDk3Li41N2ZlZjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9pZWVlODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9pZWVlODAyMTEuYwpAQCAtNzgsOSArNzgsOSBAQAogCQlpZiAoKCgocmF0ZVtpXSkgJiAweDdmKSA9PSAyKSB8fCAoKChyYXRlW2ldKSAmIDB4N2YpID09IDQpIHx8CiAJCSAgICAoKChyYXRlW2ldKSAmIDB4N2YpID09IDExKSB8fCAoKChyYXRlW2ldKSAmIDB4N2YpID09IDIyKSkKIAkJCXJldHVybiB0cnVlOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKKwkJaSsrOworCX0KKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHVpbnQgcjg3MTJfaXNfY2NrcmF0ZXNvbmx5X2luY2x1ZGVkKHU4ICpyYXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKaW5kZXggMzdmZTMzMC4uNmJkMDgyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCkBAIC0yMzksNyArMjM5LDcgQEAKIHsKIAlwYWRhcHRlci0+Y21kVGhyZWFkID0ga3RocmVhZF9ydW4ocjg3MTJfY21kX3RocmVhZCwgcGFkYXB0ZXIsICIlcyIsCiAJCQkgICAgICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JaWYgKElTX0VSUihwYWRhcHRlci0+Y21kVGhyZWFkKSA8IDApCisJaWYgKElTX0VSUihwYWRhcHRlci0+Y21kVGhyZWFkKSkKIAkJcmV0dXJuIF9GQUlMOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAppbmRleCBmMWNjYzdlLi41NjYyMzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCkBAIC0xNDcsNyArMTQ3LDggQEAKIAlyZXR1cm4gaXNfbGlzdF9lbXB0eSgmKHBxdWV1ZS0+cXVldWUpKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgZW5kX29mX3F1ZXVlX3NlYXJjaChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCkKK3N0YXRpYyBpbmxpbmUgdTMyIGVuZF9vZl9xdWV1ZV9zZWFyY2goc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKKwkJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QpCiB7CiAJaWYgKGhlYWQgPT0gcGxpc3QpCiAJCXJldHVybiB0cnVlOwpAQCAtMTY0LDcgKzE2NSw3IEBACiAJCWRlbHRhID0gMTsvKiAxIG1zICovCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlpZiAoc2NoZWR1bGVfdGltZW91dChkZWx0YSkgIT0gMCkKLQkJcmV0dXJuIDsKKwkJcmV0dXJuOwogfQogCiBzdGF0aWMgaW5saW5lIHU4ICpfbWFsbG9jKHUzMiBzeikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKaW5kZXggZWE5NjUzNy4uMDcyM2IyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKQEAgLTkwLDcgKzkwLDYgQEAKIAkJcHNrYiA9IG5ldGRldl9hbGxvY19za2IocGFkYXB0ZXItPnBuZXRkZXYsIE1BWF9SRUNWQlVGX1NaICsKIAkJICAgICAgIFJFQ1ZCVUZGX0FMSUdOX1NaKTsKIAkJaWYgKHBza2IpIHsKLQkJCXBza2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwogCQkJdG1wYWRkciA9IChhZGRyX3QpcHNrYi0+ZGF0YTsKIAkJCWFsaWdubWVudCA9IHRtcGFkZHIgJiAoUkVDVkJVRkZfQUxJR05fU1otMSk7CiAJCQlza2JfcmVzZXJ2ZShwc2tiLCAoUkVDVkJVRkZfQUxJR05fU1ogLSBhbGlnbm1lbnQpKTsKQEAgLTEwODMsNyArMTA4Miw2IEBACiAJCWFsbG9jX3N6ICs9IDY7CiAJCXBrdF9jb3B5ID0gbmV0ZGV2X2FsbG9jX3NrYihwYWRhcHRlci0+cG5ldGRldiwgYWxsb2Nfc3opOwogCQlpZiAocGt0X2NvcHkpIHsKLQkJCXBrdF9jb3B5LT5kZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKIAkJCXByZWN2ZnJhbWUtPnUuaGRyLnBrdCA9IHBrdF9jb3B5OwogCQkJc2tiX3Jlc2VydmUocGt0X2NvcHksIDQgLSAoKGFkZHJfdCkocGt0X2NvcHktPmRhdGEpCiAJCQkJICAgICUgNCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKaW5kZXggYzcxYzdlNS4uYTY3MTg1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCkBAIC00NjgsMTAgKzQ2OCw5IEBACiAJcGNtZC0+cnNwID0gTlVMTDsKIAlwY21kLT5yc3BzeiA9IDA7CiAJLyogbm90ZXM6IHRyYW5zbGF0ZSBJRUxlbmd0aCAmIExlbmd0aCBhZnRlciBhc3NpZ24gdG8gY21kc3o7ICovCi0JcGRldl9uZXR3b3JrLT5MZW5ndGggPSBjcHVfdG9fbGUzMihwY21kLT5jbWRzeik7Ci0JcGRldl9uZXR3b3JrLT5JRUxlbmd0aCA9IGNwdV90b19sZTMyKHBkZXZfbmV0d29yay0+SUVMZW5ndGgpOwotCXBkZXZfbmV0d29yay0+U3NpZC5Tc2lkTGVuZ3RoID0gY3B1X3RvX2xlMzIoCi0JCQkJCXBkZXZfbmV0d29yay0+U3NpZC5Tc2lkTGVuZ3RoKTsKKwlwZGV2X25ldHdvcmstPkxlbmd0aCA9IHBjbWQtPmNtZHN6OworCXBkZXZfbmV0d29yay0+SUVMZW5ndGggPSBwZGV2X25ldHdvcmstPklFTGVuZ3RoOworCXBkZXZfbmV0d29yay0+U3NpZC5Tc2lkTGVuZ3RoID0JcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWRMZW5ndGg7CiAJcjg3MTJfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBjbWQpOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTkxMSw3ICs5MTAsNyBAQAogewogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLQlpZiAoKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykpCisJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykKIAkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CiAJcjg3MTJfZnJlZV9jbWRfb2JqKHBjbWQpOwogfQpAQCAtOTI4LDcgKzkyNyw3IEBACiAJCQkJCSAgICAgIHBjbWQtPnBhcm1idWY7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmspOwogCi0JaWYgKChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpKQorCWlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpCiAJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIDEpOwogCV9jYW5jZWxfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsICZ0aW1lcl9jYW5jZWxsZWQpOwogI2lmZGVmIF9fQklHX0VORElBTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jCmluZGV4IGFhZTUxMjUuLjVmZmM0ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMKQEAgLTEyNDQsMTcgKzEyNDQsMTggQEAKIAkgICAgKGZydHlwZSA9PSBXSUZJX0RBVEFfQ0ZQT0xMKSB8fAogCSAgICAoZnJ0eXBlID09IFdJRklfREFUQV9DRkFDS1BPTEwpKSB7CiAJCXFjX2V4aXN0cyA9IDE7Ci0JCWlmIChoZHJsZW4gIT0gIFdMQU5fSERSX0EzX1FPU19MRU4pCisJCWlmIChoZHJsZW4gIT0gV0xBTl9IRFJfQTNfUU9TX0xFTikKIAkJCWhkcmxlbiArPSAyOwotCQl9ICBlbHNlIGlmICgoZnJzdWJ0eXBlID09IDB4MDgpIHx8CisJfSBlbHNlIGlmICgoZnJzdWJ0eXBlID09IDB4MDgpIHx8CiAJCSAgIChmcnN1YnR5cGUgPT0gMHgwOSkgfHwKIAkJICAgKGZyc3VidHlwZSA9PSAweDBhKSB8fAogCQkgICAoZnJzdWJ0eXBlID09IDB4MGIpKSB7Ci0JCQlpZiAoaGRybGVuICE9ICBXTEFOX0hEUl9BM19RT1NfTEVOKQotCQkJCWhkcmxlbiArPSAyOwotCQkJcWNfZXhpc3RzID0gMTsKLQl9IGVsc2UKKwkJaWYgKGhkcmxlbiAhPSBXTEFOX0hEUl9BM19RT1NfTEVOKQorCQkJaGRybGVuICs9IDI7CisJCXFjX2V4aXN0cyA9IDE7CisJfSBlbHNlIHsKIAkJcWNfZXhpc3RzID0gMDsKKwl9CiAJLyogbm93LCBkZWNyeXB0IHBmcmFtZSB3aXRoIGhkcmxlbiBvZmZzZXQgYW5kIHBsZW4gbG9uZyAqLwogCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OyAvKiA4IGlzIGZvciBleHRpdiAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYmFzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9iYXNlLmMKaW5kZXggMThjOTM2Zi4uZTUwNzNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9iYXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9iYXNlLmMKQEAgLTM5LDEwICszOSwxMCBAQAogI2luY2x1ZGUgInBjaS5oIgogCiAvKgotICpOT1RJQ0UhISE6IFRoaXMgZmlsZSB3aWxsIGJlIHZlcnkgYmlnLCB3ZSBoc291bGQKLSAqa2VlcCBpdCBjbGVhciB1bmRlciBmb2xsd2luZyByb2xlczoKKyAqTk9USUNFISEhOiBUaGlzIGZpbGUgd2lsbCBiZSB2ZXJ5IGJpZywgd2Ugc2hvdWxkCisgKmtlZXAgaXQgY2xlYXIgdW5kZXIgZm9sbG93aW5nIHJvbGVzOgogICoKLSAqVGhpcyBmaWxlIGluY2x1ZGUgZm9sbHdpbmcgcGFydCwgc28sIGlmIHlvdSBhZGQgbmV3CisgKlRoaXMgZmlsZSBpbmNsdWRlIGZvbGxvd2luZyBwYXJ0LCBzbywgaWYgeW91IGFkZCBuZXcKICAqZnVuY3Rpb25zIGludG8gdGhpcyBmaWxlLCBwbGVhc2UgY2hlY2sgd2hpY2ggcGFydCBpdAogICpzaG91bGQgaW5jbHVkZXMuIG9yIGNoZWNrIGlmIHlvdSBzaG91bGQgYWRkIG5ldyBwYXJ0CiAgKmZvciB0aGlzIGZpbGU6CkBAIC02NCw3MyArNjQsNzMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBydGxfY2hhbm5lbHRhYmxlXzJnW10gPSB7Ci0Jey5jZW50ZXJfZnJlcSA9IDI0MTIsLmh3X3ZhbHVlID0gMSx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDE3LC5od192YWx1ZSA9IDIsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQyMiwuaHdfdmFsdWUgPSAzLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0MjcsLmh3X3ZhbHVlID0gNCx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDMyLC5od192YWx1ZSA9IDUsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQzNywuaHdfdmFsdWUgPSA2LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0NDIsLmh3X3ZhbHVlID0gNyx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDQ3LC5od192YWx1ZSA9IDgsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ1MiwuaHdfdmFsdWUgPSA5LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0NTcsLmh3X3ZhbHVlID0gMTAsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ2MiwuaHdfdmFsdWUgPSAxMSx9LAotCXsuY2VudGVyX2ZyZXEgPSAyNDY3LC5od192YWx1ZSA9IDEyLH0sCi0Jey5jZW50ZXJfZnJlcSA9IDI0NzIsLmh3X3ZhbHVlID0gMTMsfSwKLQl7LmNlbnRlcl9mcmVxID0gMjQ4NCwuaHdfdmFsdWUgPSAxNCx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDEyLCAuaHdfdmFsdWUgPSAxLH0sCisJey5jZW50ZXJfZnJlcSA9IDI0MTcsIC5od192YWx1ZSA9IDIsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQyMiwgLmh3X3ZhbHVlID0gMyx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDI3LCAuaHdfdmFsdWUgPSA0LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1ZSA9IDUsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQzNywgLmh3X3ZhbHVlID0gNix9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDQyLCAuaHdfdmFsdWUgPSA3LH0sCisJey5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDgsfSwKKwl7LmNlbnRlcl9mcmVxID0gMjQ1MiwgLmh3X3ZhbHVlID0gOSx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDU3LCAuaHdfdmFsdWUgPSAxMCx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDY3LCAuaHdfdmFsdWUgPSAxMix9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDcyLCAuaHdfdmFsdWUgPSAxMyx9LAorCXsuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCx9LAogfTsKIAogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBydGxfY2hhbm5lbHRhYmxlXzVnW10gPSB7Ci0Jey5jZW50ZXJfZnJlcSA9IDUxODAsLmh3X3ZhbHVlID0gMzYsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTIwMCwuaHdfdmFsdWUgPSA0MCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1MjIwLC5od192YWx1ZSA9IDQ0LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDUyNDAsLmh3X3ZhbHVlID0gNDgsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTI2MCwuaHdfdmFsdWUgPSA1Mix9LAotCXsuY2VudGVyX2ZyZXEgPSA1MjgwLC5od192YWx1ZSA9IDU2LH0sCi0Jey5jZW50ZXJfZnJlcSA9IDUzMDAsLmh3X3ZhbHVlID0gNjAsfSwKLQl7LmNlbnRlcl9mcmVxID0gNTMyMCwuaHdfdmFsdWUgPSA2NCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NTAwLC5od192YWx1ZSA9IDEwMCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NTIwLC5od192YWx1ZSA9IDEwNCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NTQwLC5od192YWx1ZSA9IDEwOCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NTYwLC5od192YWx1ZSA9IDExMix9LAotCXsuY2VudGVyX2ZyZXEgPSA1NTgwLC5od192YWx1ZSA9IDExNix9LAotCXsuY2VudGVyX2ZyZXEgPSA1NjAwLC5od192YWx1ZSA9IDEyMCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NjIwLC5od192YWx1ZSA9IDEyNCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NjQwLC5od192YWx1ZSA9IDEyOCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NjYwLC5od192YWx1ZSA9IDEzMix9LAotCXsuY2VudGVyX2ZyZXEgPSA1NjgwLC5od192YWx1ZSA9IDEzNix9LAotCXsuY2VudGVyX2ZyZXEgPSA1NzAwLC5od192YWx1ZSA9IDE0MCx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NzQ1LC5od192YWx1ZSA9IDE0OSx9LAotCXsuY2VudGVyX2ZyZXEgPSA1NzY1LC5od192YWx1ZSA9IDE1Myx9LAotCXsuY2VudGVyX2ZyZXEgPSA1Nzg1LC5od192YWx1ZSA9IDE1Nyx9LAotCXsuY2VudGVyX2ZyZXEgPSA1ODA1LC5od192YWx1ZSA9IDE2MSx9LAotCXsuY2VudGVyX2ZyZXEgPSA1ODI1LC5od192YWx1ZSA9IDE2NSx9LAorCXsuY2VudGVyX2ZyZXEgPSA1MTgwLCAuaHdfdmFsdWUgPSAzNix9LAorCXsuY2VudGVyX2ZyZXEgPSA1MjAwLCAuaHdfdmFsdWUgPSA0MCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1MjIwLCAuaHdfdmFsdWUgPSA0NCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1MjQwLCAuaHdfdmFsdWUgPSA0OCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1MjYwLCAuaHdfdmFsdWUgPSA1Mix9LAorCXsuY2VudGVyX2ZyZXEgPSA1MjgwLCAuaHdfdmFsdWUgPSA1Nix9LAorCXsuY2VudGVyX2ZyZXEgPSA1MzAwLCAuaHdfdmFsdWUgPSA2MCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1MzIwLCAuaHdfdmFsdWUgPSA2NCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTAwLCAuaHdfdmFsdWUgPSAxMDAsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTUyMCwgLmh3X3ZhbHVlID0gMTA0LH0sCisJey5jZW50ZXJfZnJlcSA9IDU1NDAsIC5od192YWx1ZSA9IDEwOCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NTYwLCAuaHdfdmFsdWUgPSAxMTIsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTU4MCwgLmh3X3ZhbHVlID0gMTE2LH0sCisJey5jZW50ZXJfZnJlcSA9IDU2MDAsIC5od192YWx1ZSA9IDEyMCx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjIwLCAuaHdfdmFsdWUgPSAxMjQsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTY0MCwgLmh3X3ZhbHVlID0gMTI4LH0sCisJey5jZW50ZXJfZnJlcSA9IDU2NjAsIC5od192YWx1ZSA9IDEzMix9LAorCXsuY2VudGVyX2ZyZXEgPSA1NjgwLCAuaHdfdmFsdWUgPSAxMzYsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTcwMCwgLmh3X3ZhbHVlID0gMTQwLH0sCisJey5jZW50ZXJfZnJlcSA9IDU3NDUsIC5od192YWx1ZSA9IDE0OSx9LAorCXsuY2VudGVyX2ZyZXEgPSA1NzY1LCAuaHdfdmFsdWUgPSAxNTMsfSwKKwl7LmNlbnRlcl9mcmVxID0gNTc4NSwgLmh3X3ZhbHVlID0gMTU3LH0sCisJey5jZW50ZXJfZnJlcSA9IDU4MDUsIC5od192YWx1ZSA9IDE2MSx9LAorCXsuY2VudGVyX2ZyZXEgPSA1ODI1LCAuaHdfdmFsdWUgPSAxNjUsfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcnRsX3JhdGV0YWJsZV8yZ1tdID0gewotCXsuYml0cmF0ZSA9IDEwLC5od192YWx1ZSA9IDB4MDAsfSwKLQl7LmJpdHJhdGUgPSAyMCwuaHdfdmFsdWUgPSAweDAxLH0sCi0Jey5iaXRyYXRlID0gNTUsLmh3X3ZhbHVlID0gMHgwMix9LAotCXsuYml0cmF0ZSA9IDExMCwuaHdfdmFsdWUgPSAweDAzLH0sCi0Jey5iaXRyYXRlID0gNjAsLmh3X3ZhbHVlID0gMHgwNCx9LAotCXsuYml0cmF0ZSA9IDkwLC5od192YWx1ZSA9IDB4MDUsfSwKLQl7LmJpdHJhdGUgPSAxMjAsLmh3X3ZhbHVlID0gMHgwNix9LAotCXsuYml0cmF0ZSA9IDE4MCwuaHdfdmFsdWUgPSAweDA3LH0sCi0Jey5iaXRyYXRlID0gMjQwLC5od192YWx1ZSA9IDB4MDgsfSwKLQl7LmJpdHJhdGUgPSAzNjAsLmh3X3ZhbHVlID0gMHgwOSx9LAotCXsuYml0cmF0ZSA9IDQ4MCwuaHdfdmFsdWUgPSAweDBhLH0sCi0Jey5iaXRyYXRlID0gNTQwLC5od192YWx1ZSA9IDB4MGIsfSwKKwl7LmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMHgwMCx9LAorCXsuYml0cmF0ZSA9IDIwLCAuaHdfdmFsdWUgPSAweDAxLH0sCisJey5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDB4MDIsfSwKKwl7LmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDB4MDMsfSwKKwl7LmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gMHgwNCx9LAorCXsuYml0cmF0ZSA9IDkwLCAuaHdfdmFsdWUgPSAweDA1LH0sCisJey5iaXRyYXRlID0gMTIwLCAuaHdfdmFsdWUgPSAweDA2LH0sCisJey5iaXRyYXRlID0gMTgwLCAuaHdfdmFsdWUgPSAweDA3LH0sCisJey5iaXRyYXRlID0gMjQwLCAuaHdfdmFsdWUgPSAweDA4LH0sCisJey5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSAweDA5LH0sCisJey5iaXRyYXRlID0gNDgwLCAuaHdfdmFsdWUgPSAweDBhLH0sCisJey5iaXRyYXRlID0gNTQwLCAuaHdfdmFsdWUgPSAweDBiLH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHJ0bF9yYXRldGFibGVfNWdbXSA9IHsKLQl7LmJpdHJhdGUgPSA2MCwuaHdfdmFsdWUgPSAweDA0LH0sCi0Jey5iaXRyYXRlID0gOTAsLmh3X3ZhbHVlID0gMHgwNSx9LAotCXsuYml0cmF0ZSA9IDEyMCwuaHdfdmFsdWUgPSAweDA2LH0sCi0Jey5iaXRyYXRlID0gMTgwLC5od192YWx1ZSA9IDB4MDcsfSwKLQl7LmJpdHJhdGUgPSAyNDAsLmh3X3ZhbHVlID0gMHgwOCx9LAotCXsuYml0cmF0ZSA9IDM2MCwuaHdfdmFsdWUgPSAweDA5LH0sCi0Jey5iaXRyYXRlID0gNDgwLC5od192YWx1ZSA9IDB4MGEsfSwKLQl7LmJpdHJhdGUgPSA1NDAsLmh3X3ZhbHVlID0gMHgwYix9LAorCXsuYml0cmF0ZSA9IDYwLCAuaHdfdmFsdWUgPSAweDA0LH0sCisJey5iaXRyYXRlID0gOTAsIC5od192YWx1ZSA9IDB4MDUsfSwKKwl7LmJpdHJhdGUgPSAxMjAsIC5od192YWx1ZSA9IDB4MDYsfSwKKwl7LmJpdHJhdGUgPSAxODAsIC5od192YWx1ZSA9IDB4MDcsfSwKKwl7LmJpdHJhdGUgPSAyNDAsIC5od192YWx1ZSA9IDB4MDgsfSwKKwl7LmJpdHJhdGUgPSAzNjAsIC5od192YWx1ZSA9IDB4MDksfSwKKwl7LmJpdHJhdGUgPSA0ODAsIC5od192YWx1ZSA9IDB4MGEsfSwKKwl7LmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDB4MGIsfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIHJ0bF9iYW5kXzJnaHogPSB7CkBAIC0zMjAsNyArMzIwLDcgQEAKIAkvKiA8NT4gc2V0IGh3IGNhcHMgKi8KIAlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8CiAJICAgIElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1MgfAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDQsMCkpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDQsIDApKQogCSAgICBJRUVFODAyMTFfSFdfQkVBQ09OX0ZJTFRFUiB8CiAjZW5kaWYKIAkgICAgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKQEAgLTMzMiwxMSArMzMyLDExIEBACiAJLyogc3dscHMgb3IgaHdscHMgaGFzIGJlZW4gc2V0IGluIGRpZmYgY2hpcCBpbiBpbml0X3N3X3ZhcnMgKi8KIAlpZiAocnRscHJpdi0+cHNjLmJfc3djdHJsX2xwcykKIAkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8Ci0JICAgIAkJSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLIHwKLQkgICAgCQkvKiBJRUVFODAyMTFfSFdfU1VQUE9SVFNfRFlOQU1JQ19QUyB8ICovCisJCQlJRUVFODAyMTFfSFdfUFNfTlVMTEZVTkNfU1RBQ0sgfAorCQkJLyogSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfUFMgfCAqLwogCQkJMDsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzNykpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAzNykpCiAJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPQogCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfQVApIHwKIAkgICAgQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHwKQEAgLTM1NCwxMSArMzU0LDExIEBACiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjZW5kaWYKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwzOSkpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM5KSkKIAlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSUJTU19SU047CiAjZW5kaWYKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywzLDApKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywgMywgMCkpCiAJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTDsKICNlbmRpZgogCkBAIC00MDIsNyArNDAyLDcgQEAKIAkvKiA8Mj4gd29yayBxdWV1ZSAqLwogCXJ0bHByaXYtPndvcmtzLmh3ID0gaHc7CiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzcpKQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzcpKQogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KIAlydGxwcml2LT53b3Jrcy5ydGxfd3EgPSBhbGxvY193b3JrcXVldWUocnRscHJpdi0+Y2ZnLT5uYW1lLCAwLCAwKTsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KQEAgLTY2MiwzMCArNjYyLDI3IEBACiAKIAlpZiAocnRscHJpdi0+ZG0uYl91c2VyYW1hc2spIHsKIAkJdGNiX2Rlc2MtPnJhdHJfaW5kZXggPSByYXRyX2luZGV4OwotCQkvKiBUT0RPIHdlIHdpbGwgZGlmZmVyZW50aWF0ZSBhZGhvYyBhbmQgc3RhdGlvbiBmdXRydWUgICovCisJCS8qIFRPRE8gd2Ugd2lsbCBkaWZmZXJlbnRpYXRlIGFkaG9jIGFuZCBzdGF0aW9uIGZ1dHVyZSAgKi8KIAkJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKIAkJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKIAkJCXRjYl9kZXNjLT5tYWNfaWQgPSAwOwotCi0JCQlpZiAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpIHsKKwkJCWlmIChtYWMtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzI0RykKIAkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX05HQjsKLQkJCX0gZWxzZSBpZiAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl81RykgeworCQkJZWxzZSBpZiAobWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl81RykKIAkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX05HOwotCQkJfSBlbHNlIGlmIChtYWMtPm1vZGUgJiBXSVJFTEVTU19NT0RFX0cpIHsKKwkJCWVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfRykKIAkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0dCOwotCQkJfSBlbHNlIGlmIChtYWMtPm1vZGUgJiBXSVJFTEVTU19NT0RFX0IpIHsKKwkJCWVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfQikKIAkJCQl0Y2JfZGVzYy0+cmF0cl9pbmRleCA9IFJBVFJfSU5YX1dJUkVMRVNTX0I7Ci0JCQl9IGVsc2UgaWYgKG1hYy0+bW9kZSAmIFdJUkVMRVNTX01PREVfQSkgeworCQkJZWxzZSBpZiAobWFjLT5tb2RlICYgV0lSRUxFU1NfTU9ERV9BKQogCQkJCXRjYl9kZXNjLT5yYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfRzsKLQkJCX0KIAkJfSBlbHNlIGlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAogCQkJbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJCWlmIChOVUxMICE9IHN0YSkgewotCQkJCWlmIChzdGEtPmFpZCA+IDApIHsKKwkJCQlpZiAoc3RhLT5haWQgPiAwKQogCQkJCQl0Y2JfZGVzYy0+bWFjX2lkID0gc3RhLT5haWQgKyAxOwotCQkJCX0gZWxzZSB7CisJCQkJZWxzZQogCQkJCQl0Y2JfZGVzYy0+bWFjX2lkID0gMTsKLQkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXRjYl9kZXNjLT5tYWNfaWQgPSAwOwogCQkJfQpAQCAtNzExLDcgKzcwOCw3IEBACiAJCQlyZXR1cm47CiAJfSBlbHNlIGlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CiAJCWlmICghbWFjLT5id180MCB8fCAhKHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkpCi0JCXJldHVybjsKKwkJCXJldHVybjsKIAl9CiAJaWYgKHRjYl9kZXNjLT5iX211bHRpY2FzdCB8fCB0Y2JfZGVzYy0+Yl9icm9hZGNhc3QpCiAJCXJldHVybjsKQEAgLTczMCw3ICs3MjcsNyBAQAogCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CiAJdTggaHdfcmF0ZTsKIAotCWlmICgoZ2V0X3JmX3R5cGUocnRscGh5KSA9PSBSRl8yVDJSKSAmJiAoc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMV0hPTApKQorCWlmICgoZ2V0X3JmX3R5cGUocnRscGh5KSA9PSBSRl8yVDJSKSAmJiAoc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMV0gIT0gMCkpCiAJCWh3X3JhdGUgPSBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX0hUX1JBVEVNQ1MxNV07CiAJZWxzZQogCQlod19yYXRlID0gcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9SQ19IVF9SQVRFTUNTN107CkBAIC03NzIsMTYgKzc2OSwxNiBAQAogCQkJdGNiX2Rlc2MtPmRpc2FibGVfcmF0ZWZhbGxiYWNrID0gMTsKIAkJfSBlbHNlIHsKIAkJCS8qCi0JCQkgKmJlY2F1c2UgaHcgd2lsbCBuZXJ2ZXIgdXNlIGh3X3JhdGUKKwkJCSAqYmVjYXVzZSBodyB3aWxsIG5ldmVyIHVzZSBod19yYXRlCiAJCQkgKndoZW4gdGNiX2Rlc2MtPnVzZV9kcml2ZXJfcmF0ZSA9IGZhbHNlCiAJCQkgKnNvIHdlIG5ldmVyIHNldCBoaWdoZXN0IE4gcmF0ZSBoZXJlLAotCQkJICphbmQgTiByYXRlIHdpbGwgYWxsIGJlIGNvbnRyb2xlZCBieSBGVworCQkJICphbmQgTiByYXRlIHdpbGwgYWxsIGJlIGNvbnRyb2xsZWQgYnkgRlcKIAkJCSAqd2hlbiB0Y2JfZGVzYy0+dXNlX2RyaXZlcl9yYXRlID0gZmFsc2UKIAkJCSAqLwogCQkJaWYgKHN0YSAmJiAoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSkgewogCQkJCXRjYl9kZXNjLT5od19yYXRlID0gX3J0bF9nZXRfaGlnaGVzdF9uX3JhdGUoaHcsIHN0YSk7CiAJCQl9IGVsc2UgewotCQkJCWlmKHJ0bG1hYy0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpIHsKKwkJCQlpZiAocnRsbWFjLT5tb2RlID09IFdJUkVMRVNTX01PREVfQikgewogCQkJCQl0Y2JfZGVzYy0+aHdfcmF0ZSA9CiAJCQkJCSAgICBydGxwcml2LT5jZmctPm1hcHNbUlRMX1JDX0NDS19SQVRFMTFNXTsKIAkJCQl9IGVsc2UgewpAQCAtODA5LDcgKzgwNiw3IEBACiAJCXRjYl9kZXNjLT5iX3BhY2tldF9idyA9IGZhbHNlOwogCX0KIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfZ2V0X3RjYl9kZXNjKTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX2dldF90Y2JfZGVzYyk7ICovCiAKIGJvb2wgcnRsX3R4X21nbXRfcHJvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTg2Miw4ICs4NTksOCBAQAogCQkJUlRfVFJBQ0UoKENPTVBfU0VORCB8IENPTVBfUkVDViksIERCR19ETUVTRywKIAkJCQkgKCIlcyBBQ1RfQUREQkFSRVEgRnJvbSA6JXBNXG4iLAogCQkJCSAgaXNfdHggPyAiVHgiIDogIlJ4IiwgaGRyLT5hZGRyMikpOwotCQkJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0lOSVQsIERCR19ETUVTRywgKCJyZXEgXG4iKSwKLQkJICAgICAgCXNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0lOSVQsIERCR19ETUVTRywgKCJyZXFcbiIpLAorCQkJc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJCQlpZiAoIWlzX3R4KSB7CiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IE5VTEw7CiAJCQkJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKQEAgLTg5Nyw3ICs4OTQsNyBAQAogCQkJCQkJCQkgICAgaGRyLT5hZGRyMywKIAkJCQkJCQkJICAgIHRpZCk7CiAJCQkJCWlmIChza2JfZGVsYmEpIHsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLCAxMCwgMCkpCiAJCQkJCQlyeF9zdGF0dXMuZnJlcSA9IGh3LT5jb25mLmNoYW5kZWYuY2hhbi0+Y2VudGVyX2ZyZXE7CiAJCQkJCQlyeF9zdGF0dXMuYmFuZCA9IGh3LT5jb25mLmNoYW5kZWYuY2hhbi0+YmFuZDsKICNlbHNlCkBAIC0xMTg0LDcgKzExODEsNyBAQAogCWlmIChldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjMsIHJ0bHByaXYtPm1hYzgwMjExLmJzc2lkKSkKIAkJcmV0dXJuOwogCi0JcnRscHJpdi0+bGlua19pbmZvLmJjbl9yeF9pbnBlcmlvZCArKzsKKwlydGxwcml2LT5saW5rX2luZm8uYmNuX3J4X2lucGVyaW9kKys7CiB9CiAKIHZvaWQgcnRsX3dhdGNoZG9nX3dxX2NhbGxiYWNrKHZvaWQgKmRhdGEpCkBAIC0xMzYzLDcgKzEzNjAsNyBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3ByaXYgKmJ1ZGR5X3ByaXYgPSBydGxwcml2LT5idWRkeV9wcml2OwogCi0JaWYoYnVkZHlfcHJpdiA9PSBOVUxMKQorCWlmIChidWRkeV9wcml2ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXJ0bHByaXYtPmNmZy0+b3BzLT5kdWFsbWFjX2Vhc3lfY29uY3VycmVudChodyk7CkBAIC0xNDc4LDEzICsxNDc1LDEzIEBACiAJCS8qIHJ0bHByaXYtPmNmZy0+b3BzLT51cGRhdGVfcmF0ZV90YmwoaHcsIHN0YSwgMCk7ICovCiAKIAkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHggPSAwOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywxMCwwKSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsIDEwLCAwKSkKIAkJaW5mby0+YmFuZCA9IGh3LT5jb25mLmNoYW5kZWYuY2hhbi0+YmFuZDsKICNlbHNlCiAJCWluZm8tPmJhbmQgPSBody0+Y29uZi5jaGFubmVsLT5iYW5kOwogI2VuZGlmCiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMywgNywgMCkpCiAJCWluZm8tPmNvbnRyb2wuc3RhID0gc3RhOwogCQlydGxwcml2LT5pbnRmX29wcy0+YWRhcHRlcl90eChodywgc2tiLCAmdGNiX2Rlc2MpOwogI2Vsc2UKQEAgLTE0OTksNyArMTQ5Niw3IEBACiBlcnJfZnJlZToKIAlyZXR1cm4gMDsKIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfc2VuZF9zbXBzX2FjdGlvbik7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9zZW5kX3NtcHNfYWN0aW9uKTsgKi8KIAogLyogYmVjYXVzZSBtYWM4MDIxMSBoYXZlIGlzc3VlcyB3aGVuIGNhbiByZWNlaXZlIGRlbCBiYQogICogc28gaGVyZSB3ZSBqdXN0IG1ha2UgYSBmYWtlIGRlbF9iYSBpZiB3ZSByZWNlaXZlIGEgYmFfcmVxCkBAIC0xNTI4LDggKzE1MjUsOCBAQAogCQkJCQkJICBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKIAlhY3Rpb25fZnJhbWUtPnUuYWN0aW9uLmNhdGVnb3J5ID0gV0xBTl9DQVRFR09SWV9CQUNLOwogCWFjdGlvbl9mcmFtZS0+dS5hY3Rpb24udS5kZWxiYS5hY3Rpb25fY29kZSA9IFdMQU5fQUNUSU9OX0RFTEJBOwotCXBhcmFtcyA9ICh1MTYpKDEgPDwgMTEpOyAJLyogYml0IDExIGluaXRpYXRvciAqLwotCXBhcmFtcyB8PSAodTE2KSh0aWQgPDwgMTIpOyAJCS8qIGJpdCAxNToxMiBUSUQgbnVtYmVyICovCisJcGFyYW1zID0gKHUxNikoMSA8PCAxMSk7CS8qIGJpdCAxMSBpbml0aWF0b3IgKi8KKwlwYXJhbXMgfD0gKHUxNikodGlkIDw8IDEyKTsJLyogYml0IDE1OjEyIFRJRCBudW1iZXIgKi8KIAogCWFjdGlvbl9mcmFtZS0+dS5hY3Rpb24udS5kZWxiYS5wYXJhbXMgPSBjcHVfdG9fbGUxNihwYXJhbXMpOwogCWFjdGlvbl9mcmFtZS0+dS5hY3Rpb24udS5kZWxiYS5yZWFzb25fY29kZSA9CkBAIC0xNjUyLDkgKzE2NDksOCBAQAogCWlmIChldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjMsIHJ0bHByaXYtPm1hYzgwMjExLmJzc2lkKSkKIAkJcmV0dXJuOwogCi0JaWYgKHJ0bF9maW5kXzIyMV9pZShodywgZGF0YSwgbGVuKSkgeworCWlmIChydGxfZmluZF8yMjFfaWUoaHcsIGRhdGEsIGxlbikpCiAJCXZlbmRvciA9IG1hYy0+dmVuZG9yOwotCX0KIAogCWlmICgobWVtY21wKG1hYy0+YnNzaWQsIGFwNV8xLCAzKSA9PSAwKSB8fAogCQkobWVtY21wKG1hYy0+YnNzaWQsIGFwNV8yLCAzKSA9PSAwKSB8fApAQCAtMTY3MSw3ICsxNjY3LDcgQEAKIAkJKG1lbWNtcChtYWMtPmJzc2lkLCBhcDRfMiwgMykgPT0gMCkgfHwKIAkJKG1lbWNtcChtYWMtPmJzc2lkLCBhcDRfMywgMykgPT0gMCkgfHwKIAkJdmVuZG9yID09IFBFRVJfUkFMKSB7Ci0JCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19MT1VELCAoIj0+cmFsIGZpbmRuXG4iKSk7CisJCVJUX1RSQUNFKENPTVBfTUFDODAyMTEsIERCR19MT1VELCAoIj0+cmFsIGZpbmRcbiIpKTsKIAkJdmVuZG9yID0gUEVFUl9SQUw7CiAJfSBlbHNlIGlmIChtZW1jbXAobWFjLT5ic3NpZCwgYXA2XzEsIDMpID09IDAgfHwKIAkJdmVuZG9yID09IFBFRVJfQ0lTQ08pIHsKQEAgLTE3MTUsNyArMTcxMSw3IEBACiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJldDsKIAotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CiAJfSBlbHNlIHsKQEAgLTE4NDUsOCArMTg0MSw3IEBACiBpbnQgcnRsX2NvcmVfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpZiAocnRsX3JhdGVfY29udHJvbF9yZWdpc3RlcigpKQotCQlwcmludGsoS0VSTl9ERUJVRyAicnRsOiBVbmFibGUgdG8gcmVnaXN0ZXIgcnRsX3JjLCIKLQkJCSAgInVzZSBkZWZhdWx0IFJDICEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bDogVW5hYmxlIHRvIHJlZ2lzdGVyIHJ0bF9yYywgdXNlIGRlZmF1bHQgUkMgISFcbiIpOwogCiAJLyogYWRkIHByb2MgZm9yIGRlYnVnICovCiAJcnRsX3Byb2NfYWRkX3RvcGRpcigpOwpAQCAtMTg2MSw3ICsxODU2LDcgQEAKIHZvaWQgcnRsX2NvcmVfbW9kdWxlX2V4aXQodm9pZCkKIHsKIAkvKlJDKi8KLSAgIAlydGxfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKKwlydGxfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKIAogCS8qIGFkZCBwcm9jIGZvciBkZWJ1ZyAqLwogCXJ0bF9wcm9jX3JlbW92ZV90b3BkaXIoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L0hhbEJ0Yzg4MTJhMUFudC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvSGFsQnRjODgxMmExQW50LmMKaW5kZXggYjMwZjE3YS4uNWE1NGJiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvSGFsQnRjODgxMmExQW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvSGFsQnRjODgxMmExQW50LmMKQEAgLTE2NTMsNyArMTY1Myw3IEBACiAJfQogCWVsc2UKIAl7Ci0JCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKKwkJLy9hY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCiAJCXJldHJ5X2NvdW50ID0gY29leF9zdGEtPmJ0X3JldHJ5X2NudDsKIAkJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CiAJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHJldHJ5X2NvdW50ID0gJWRcbiIsIHJldHJ5X2NvdW50KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFidGM4NzIzYTFhbnQuYwppbmRleCBlNjE5OTIzLi44ZTQyOTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWJ0Yzg3MjNhMWFudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhYnRjODcyM2ExYW50LmMKQEAgLTYyOSw3ICs2MjksNyBAQAogCX0KIAllbHNlCiAJewotCQkvL2FjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCisJCS8vYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgogCQlyZXRyeUNvdW50ID0gcENvZXhTdGEtPmJ0UmV0cnlDbnQ7CiAJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgcmV0cnlDb3VudCA9ICVkXG4iLCByZXRyeUNvdW50KSk7CiAJCXJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTFhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMWFudC5jCmluZGV4IDk3M2QwZWEuLjFiMDQ1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMWFudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0YzgxOTJlMWFudC5jCkBAIC0xNzIxLDcgKzE3MjEsNyBAQAogCX0KIAllbHNlCiAJewotCQkvL2FjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCisJCS8vYWNxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMgogCQlyZXRyeUNvdW50ID0gcENvZXhTdGEtPmJ0UmV0cnlDbnQ7CiAJCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CiAJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODE5MmUyYW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTJhbnQuYwppbmRleCA0NGVjNzg1Li4xMTU5MDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTJhbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4MTkyZTJhbnQuYwpAQCAtMTgwMyw3ICsxODAzLDcgQEAKIAkJcmVzdWx0ID0gMDsKIAkJd2FpdF9jbnQgPSAwOwogCX0gZWxzZSB7Ci0JCS8qIGFjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCisJCS8qIGFjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIgKi8KIAkJcmV0cnlfY250ID0gY29leF9zdGEtPmJ0X3JldHJ5X2NudDsKIAkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwKIAkJCSAgIltCVENvZXhdLCByZXRyeV9jbnQgPSAlZFxuIiwgcmV0cnlfY250KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNhMmFudC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2EyYW50LmMKaW5kZXggMTgwZDZmMS4uM2Y1YzRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2EyYW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2EyYW50LmMKQEAgLTE2ODcsNyArMTY4Nyw3IEBACiAJfQogCWVsc2UKIAl7Ci0JCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKKwkJLy9hY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCiAJCXJldHJ5Q291bnQgPSBwQ29leFN0YS0+YnRSZXRyeUNudDsKIAkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcmV0cnlDb3VudCA9ICVkXG4iLCByZXRyeUNvdW50KSk7CiAJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHVwPSVkLCBkbj0lZCwgbT0lZCwgbj0lZCwgV2FpdENvdW50PSVkXG4iLCAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMWFudC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IxYW50LmMKaW5kZXggMzQxNGJhNy4uOTY3Nzk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IxYW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjODcyM2IxYW50LmMKQEAgLTE5NTAsNyArMTk1MCw3IEBACiAJCXJlc3VsdCA9IDA7CiAJCXdhaXRfY291bnQgPSAwOwogCX0gZWxzZSB7Ci0JCS8qYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIgKi8KKwkJLyphY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCiAJCXJldHJ5X2NvdW50ID0gY29leF9zdGEtPmJ0X3JldHJ5X2NudDsKIAkJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CiAJCXJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2J0Y29leGlzdC9oYWxidGM4NzIzYjJhbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMmFudC5jCmluZGV4IDgzYjFiNDIuLmQzMzdiZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMmFudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Yzg3MjNiMmFudC5jCkBAIC0xODMwLDcgKzE4MzAsNyBAQAogCQlyZXN1bHQgPSAwOwogCQl3YWl0X2NvdW50ID0gMDsKIAl9IGVsc2UgewotCQkvKmFjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyKi8KKwkJLyphY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyKi8KIAkJcmV0cnlDb3VudCA9IGNvZXhfc3RhLT5idF9yZXRyeV9jbnQ7CiAJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsCiAJCQkgICJbQlRDb2V4XSwgcmV0cnlDb3VudCA9ICVkXG4iLCByZXRyeUNvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvYnRjb2V4aXN0L2hhbGJ0Y291dHNyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjb3V0c3JjLmMKaW5kZXggOWQ5ZmE0ZC4uYzRlODM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjb3V0c3JjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9idGNvZXhpc3QvaGFsYnRjb3V0c3JjLmMKQEAgLTczMiwxNyArNzMyLDcgQEAKIAllbHNlCiAJCWJ0Y29leGlzdC0+YmluZGVkID0gdHJ1ZTsKIAotI2lmICggZGVmaW5lZChDT05GSUdfUENJX0hDSSkpCi0JYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9IEJUQ19JTlRGX1BDSTsKLSNlbGlmICggZGVmaW5lZChDT05GSUdfVVNCX0hDSSkpCi0JYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9IEJUQ19JTlRGX1VTQjsKLSNlbGlmICggZGVmaW5lZChDT05GSUdfU0RJT19IQ0kpKQotCWJ0Y29leGlzdC0+Y2hpcF9pbnRlcmZhY2UgPSBCVENfSU5URl9TRElPOwotI2VsaWYgKCBkZWZpbmVkKENPTkZJR19HU1BJX0hDSSkpCi0JYnRjb2V4aXN0LT5jaGlwX2ludGVyZmFjZSA9IEJUQ19JTlRGX0dTUEk7Ci0jZWxzZQogCWJ0Y29leGlzdC0+Y2hpcF9pbnRlcmZhY2UgPSBCVENfSU5URl9VTktOT1dOOwotI2VuZGlmCiAKIAlpZiAoTlVMTCA9PSBidGNvZXhpc3QtPmFkYXB0ZXIpCiAJCWJ0Y29leGlzdC0+YWRhcHRlciA9IGFkYXB0ZXI7CkBAIC0xMDg3LDcgKzEwNzcsNyBAQAogCWJ0Y29leGlzdC0+c3RhdGlzdGljcy5jbnRfZGJnX2N0cmwrKzsKIH0KIAotdm9pZCBleGhhbGJ0Y19zdGFja191cGRhdGVfcHJvZmlsZV9pbmZvKCkKK3ZvaWQgZXhoYWxidGNfc3RhY2tfdXBkYXRlX3Byb2ZpbGVfaW5mbyh2b2lkKQogewogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5jCmluZGV4IDQwZGU2MDguLmZmMzEzOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5jCkBAIC0zNzMsNyArMzczLDcgQEAKIAkJCS8qIHNsZWVwIGhlcmUgaXMgbXVzdCwgb3Igd2UgbWF5IHJlY3YgdGhlIGJlYWNvbiBhbmQKIAkJCSAqIGNhdXNlIG1hYzgwMjExIGludG8gd3JvbmcgcHMgc3RhdGUsIHRoaXMgd2lsbCBjYXVzZQogCQkJICogcG93ZXIgc2F2ZSBudWxsZnVuYyBzZW5kIGZhaWwsIGFuZCBmdXJ0aGVyIGNhdXNlCi0JCQkgKiBwa3QgbG9zcywgU28gc2xlZXAgbXVzdCBxdWlja2x5IGJ1dCBub3QgaW1tZWRpYXRseQorCQkJICogcGt0IGxvc3MsIFNvIHNsZWVwIG11c3QgcXVpY2tseSBidXQgbm90IGltbWVkaWF0ZWx5CiAJCQkgKiBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSBudWxsZnVuYyBzZW5kIGJ5IG1hYzgwMjExCiAJCQkgKiBmYWlsLCBhbmQgY2F1c2UgcGt0IGxvc3MsIHdlIGhhdmUgdGVzdGVkIHRoYXQgNW1BCiAJCQkgKiBpcyB3b3JrZWQgdmVyeSB3ZWxsICovCkBAIC0xMjAwLDggKzEyMDAsOCBAQAogCQlrZXlfdHlwZSA9IEFFU0NNQUNfRU5DUllQVElPTjsKIAkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhbGc6Q01BQ1xuIikpOwogCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAotCQkJCSgiSFcgZG9uJ3Qgc3VwcG9ydCBDTUFDIGVuY3J5cGl0b24sICIKLQkJCQkidXNlIHNvZnR3YXJlIENNQUMgZW5jcnlwaXRvblxuIikpOworCQkJCSgiSFcgZG9uJ3Qgc3VwcG9ydCBDTUFDIGVuY3J5cHRpb24sICIKKwkJCQkidXNlIHNvZnR3YXJlIENNQUMgZW5jcnlwdGlvblxuIikpOwogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXRfdW5sb2NrOwogCWRlZmF1bHQ6CkBAIC0xMjM1LDggKzEyMzUsOCBAQAogCQlrZXlfdHlwZSA9IEFFU0NNQUNfRU5DUllQVElPTjsKIAkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19ETUVTRywgKCJhbGc6Q01BQ1xuIikpOwogCQlSVF9UUkFDRShDT01QX1NFQywgREJHX0RNRVNHLAotCQkJICgiSFcgZG9uJ3Qgc3VwcG9ydCBDTUFDIGVuY3J5cGl0b24sICIKLQkJCSAgInVzZSBzb2Z0d2FyZSBDTUFDIGVuY3J5cGl0b25cbiIpKTsKKwkJCSAoIkhXIGRvbid0IHN1cHBvcnQgQ01BQyBlbmNyeXB0aW9uLCAiCisJCQkgICJ1c2Ugc29mdHdhcmUgQ01BQyBlbmNyeXB0aW9uXG4iKSk7CiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIG91dF91bmxvY2s7CiAJZGVmYXVsdDoKQEAgLTE0MTEsNyArMTQxMSw3IEBACiB9CiAKIC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG1hYzgwMjExIHRvIGZsdXNoIHR4IGJ1ZmZlcgotICogYmVmb3JlIHN3aXRjaCBjaGFubmxlIG9yIHBvd2VyIHNhdmUsIG9yIHR4IGJ1ZmZlciBwYWNrZXQKKyAqIGJlZm9yZSBzd2l0Y2ggY2hhbm5lbCBvciBwb3dlciBzYXZlLCBvciB0eCBidWZmZXIgcGFja2V0CiAgKiBtYXliZSBzZW5kIGFmdGVyIG9mZmNoYW5uZWwgb3IgcmYgc2xlZXAsIHRoaXMgbWF5IGNhdXNlCiAgKiBkaXMtYXNzb2NpYXRpb24gYnkgQVAgKi8KICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDMsMTAsMCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2NvcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5oCmluZGV4IDRiMjQ3ZGIuLmYwYzc0ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvY29yZS5oCkBAIC0yLDIwICsyLDIwIEBACiAgKgogICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdG1pcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQogICoKLSAqIFRtZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCiAgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmMKaW5kZXggY2IwNTEyMi4uOGE2Yzc5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuYwpAQCAtMiwyMCArMiwyMCBAQAogICoKICAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRtaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKICAqCi0gKiBUbWUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQogICogZmlsZSBjYWxsZWQgTElDRU5TRS4KICAqCiAgKiBDb250YWN0IEluZm9ybWF0aW9uOgpAQCAtOTg1LDQgKzk4NSw0IEBACiB7CiAJaWYgKHByb2NfdG9wZGlyKQogCQlyZW1vdmVfcHJvY19lbnRyeSgicnRsd2lmaSIsIGluaXRfbmV0LnByb2NfbmV0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2RlYnVnLmgKaW5kZXggNWViNjI1MS4uNmMwYTU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZGVidWcuaApAQCAtMiwyMCArMiwyMCBAQAogICoKICAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogVG1pcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRtaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKICAqCi0gKiBUbWUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQogICogZmlsZSBjYWxsZWQgTElDRU5TRS4KICAqCiAgKiBDb250YWN0IEluZm9ybWF0aW9uOgpAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBEQkdfRU1FUkcJCQkwCiAKIC8qCi0gKkFibm9ybWFsLCByYXJlLCBvciB1bmV4cGV0ZWQgY2FzZXMuCisgKkFibm9ybWFsLCByYXJlLCBvciB1bmV4cGVjdGVkIGNhc2VzLgogICpGb3IgZXhhbXBsZSwgUGFja2V0L0lPIEN0bCBjYW5jZWxlZCwKICAqZGV2aWNlIHN1cHJpc2VseSB1bnJlbW92ZWQgYW5kIHNvIG9uLgogICovCkBAIC01NCw3ICs1NCw3IEBACiAgKk5vcm1hbCBjYXNlIGRyaXZlciBkZXZlbG9wZXIgc2hvdWxkCiAgKm9wZW4sIHdlIGNhbiBzZWUgbGluayBzdGF0dXMgbGlrZQogICphc3NvYy9BZGRCQS9ESENQL2FkYXB0ZXIgc3RhcnQgYW5kCi0gKnNvIG9uIGJhc2ljIGFuZCB1c2VmdWwgaW5mcm9tYXRpb25zLgorICpzbyBvbiBiYXNpYyBhbmQgdXNlZnVsIGluZm9ybWF0aW9ucy4KICAqLwogI2RlZmluZSBEQkdfRE1FU0cJCQkzCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvZWZ1c2UuYwppbmRleCA3NGMxOWVjLi4yNTBhYWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL2VmdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9lZnVzZS5jCkBAIC0yLDIwICsyLDIwIEBACiAgKgogICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUbWlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAgKiBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdG1pcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQogICoKLSAqIFRtZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCiAgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246CkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJcmV0dXJuIDB4RkY7CiAKIH0KLS8vRVhQT1JUX1NZTUJPTChlZnVzZV9yZWFkXzFieXRlKTsKKy8qIEVYUE9SVF9TWU1CT0woZWZ1c2VfcmVhZF8xYnl0ZSk7ICovCiAKIHZvaWQgZWZ1c2Vfd3JpdGVfMWJ5dGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBhZGRyZXNzLCB1OCB2YWx1ZSkKIHsKQEAgLTUxNyw3ICs1MTcsNyBAQAogCQkJcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0hXU0VUX01BWF9TSVpFXSk7CiAKIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfZWZ1c2Vfc2hhZG93X21hcF91cGRhdGUpOworLyogRVhQT1JUX1NZTUJPTChydGxfZWZ1c2Vfc2hhZG93X21hcF91cGRhdGUpOyAqLwogCiB2b2lkIGVmdXNlX2ZvcmNlX3dyaXRlX3ZlbmRvcl9JZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKQEAgLTYyOCw3ICs2MjgsNyBAQAogCX0KIAlyZXR1cm4gYnJlc3VsdDsKIH0KLS8vRVhQT1JUX1NZTUJPTChlZnVzZV9vbmVfYnl0ZV9yZWFkKTsKKy8qIEVYUE9SVF9TWU1CT0woZWZ1c2Vfb25lX2J5dGVfcmVhZCk7ICovCiAKIHN0YXRpYyBpbnQgZWZ1c2Vfb25lX2J5dGVfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBhZGRyLCB1OCBkYXRhKQogewpAQCAtMTEyMCwxNiArMTEyMCwxNiBAQAogCQl7CiAJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQUNDRVNTXSwgMHg2OSk7CiAKLQkJCS8vIDEuMlYgUG93ZXI6IEZyb20gVkRET04gd2l0aCBQb3dlciBDdXQoMHgwMDAwaFsxNV0pLCBkZWZ1YWx0IHZhbGlkCisJCQkvKiAxLjJWIFBvd2VyOiBGcm9tIFZERE9OIHdpdGggUG93ZXIgQ3V0KDB4MDAwMGhbMTVdKSwgZGVmYXVsdCB2YWxpZCAqLwogCQkJdG1wVjE2ID0gcnRsX3JlYWRfd29yZChydGxwcml2LAogCQkJCQkgICAgICAgcnRscHJpdi0+Y2ZnLT5tYXBzW1NZU19JU09fQ1RSTF0pOwogCiAJCQlwcmludGsoIlNZU19JU09fQ1RSTD0lMDR4LlxuIix0bXBWMTYpOwogCQkJaWYoICEgKHRtcFYxNiAmIFBXQ19FVjEyViApICl7CiAJCQkJdG1wVjE2IHw9IFBXQ19FVjEyViA7Ci0JCQkJIC8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlcixSRUdfU1lTX0lTT19DVFJMLHRtcFYxNik7CisJCQkJIC8qIFBsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsUkVHX1NZU19JU09fQ1RSTCx0bXBWMTYpOyAqLwogCQkJfQotCQkJLy8gUmVzZXQ6IDB4MDAwMGhbMjhdLCBkZWZhdWx0IHZhbGlkCisJCQkvKiBSZXNldDogMHgwMDAwaFsyOF0sIGRlZmF1bHQgdmFsaWQgKi8KICAJCQl0bXBWMTYgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsICBydGxwcml2LT5jZmctPm1hcHNbU1lTX0ZVTkNfRU5dKTsKIAkJCXByaW50aygiU1lTX0ZVTkNfRU49JTA0eC5cbiIsdG1wVjE2KTsKIAkJCWlmKCAhKHRtcFYxNiAmIEZFTl9FTERSKSApewpAQCAtMTEzNyw3ICsxMTM3LDcgQEAKIAkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbU1lTX0ZVTkNfRU5dLCB0bXBWMTYpOwogCQkJfQogCi0JCQkvLyBDbG9jazogR2F0ZWQoMHgwMDA4aFs1XSkgOE0oMHgwMDA4aFsxXSkgY2xvY2sgZnJvbSBBTkEsIGRlZmF1bHQgdmFsaWQKKwkJCS8qIENsb2NrOiBHYXRlZCgweDAwMDhoWzVdKSA4TSgweDAwMDhoWzFdKSBjbG9jayBmcm9tIEFOQSwgZGVmYXVsdCB2YWxpZCAqLwogCQkJdG1wVjE2ID0gcnRsX3JlYWRfd29yZChydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW1NZU19DTEtdICk7CiAJCQlwcmludGsoIlNZU19DTEs9JTA0eC5cbiIsdG1wVjE2KTsKIAkJCWlmKCAoISh0bXBWMTYgJiBMT0FERVJfQ0xLX0VOKSApICB8fCghKHRtcFYxNiAmIEFOQThNKSApICkKQEAgLTExNDgsNyArMTE0OCw3IEBACiAKIAkJCWlmKGJ3cml0ZSA9PSB0cnVlKQogCQkJewotCQkJCS8vIEVuYWJsZSBMRE8gMi41ViBiZWZvcmUgcmVhZC93cml0ZSBhY3Rpb24KKwkJCQkvKiBFbmFibGUgTERPIDIuNVYgYmVmb3JlIHJlYWQvd3JpdGUgYWN0aW9uICovCiAJCQkJdGVtcHZhbCA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9URVNUXSArIDMpOwogCQkJCXByaW50aygiRUZVU0VfVEVTVD0lMDR4LlxuIix0bXBWMTYpOwogCQkJCXRlbXB2YWwgJj0gfihCSVQoMykgfCBCSVQoNCkgfEJJVCg1KSB8IEJJVCg2KSk7CkBAIC0xMTYxLDcgKzExNjEsNyBAQAogCQl7CiAJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbRUZVU0VfQUNDRVNTXSwgMHgwMCk7CiAJCQlpZihid3JpdGUgPT0gdHJ1ZSl7Ci0JCQkJLy8gRGlzYWJsZSBMRE8gMi41ViBhZnRlciByZWFkL3dyaXRlIGFjdGlvbgorCQkJCS8qIERpc2FibGUgTERPIDIuNVYgYWZ0ZXIgcmVhZC93cml0ZSBhY3Rpb24gKi8KIAkJCQl0ZW1wdmFsID0gcnRsX3JlYWRfd29yZChydGxwcml2LCAgcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX1RFU1RdICsgMyk7CiAJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgIHJ0bHByaXYtPmNmZy0+bWFwc1tFRlVTRV9URVNUXSArIDMsICh0ZW1wdmFsICYgMHg3RikpOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmMKaW5kZXggY2ZhNjUxZS4uYTU2MmFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5jCkBAIC0zODgsMTMgKzM4OCwxMyBAQAogCQkgKiBjYXBhYmlsaXR5IHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLCBmb2xsb3cgdGhlIGxpbmsgdG8KIAkJICogdGhlIG5leHQgY2FwYWJpbGl0eSBhbmQgY29udGludWUgbG9vcGluZy4KIAkJICovCi0JCXJ0bF9wY2lfcmF3X3dyaXRlX3BvcnRfdWxvbmcoUENJX0NPTkZfQUREUkVTUyAsIAotCQkJCQkgICAgIHBjaWNmZ19hZGRyX3BvcnQgKyAKKwkJcnRsX3BjaV9yYXdfd3JpdGVfcG9ydF91bG9uZyhQQ0lfQ09ORl9BRERSRVNTICwKKwkJCQkJICAgICBwY2ljZmdfYWRkcl9wb3J0ICsKIAkJCQkJICAgICAobnVtNGJ5dGVzIDw8IDIpKTsKIAkJcnRsX3BjaV9yYXdfcmVhZF9wb3J0X3VzaG9ydChQQ0lfQ09ORl9EQVRBLAogCQkJCQkgICAgICh1MTYqKSZjYXBhYmlsaXR5X2hkcik7CiAJCS8qIEZvdW5kIHRoZSBQQ0kgZXhwcmVzcyBjYXBhYmlsaXR5LiAqLwotCQlpZiAoY2FwYWJpbGl0eV9oZHIuY2FwYWJpbGl0eV9pZCA9PSAKKwkJaWYgKGNhcGFiaWxpdHlfaGRyLmNhcGFiaWxpdHlfaWQgPT0KIAkJICAgIFBDSV9DQVBBQklMSVRZX0lEX1BDSV9FWFBSRVNTKQogCQkJYnJlYWs7CiAJCWVsc2UKQEAgLTQxOCw3ICs0MTgsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlbXBfcHJpdiwgJnJ0bHByaXYtPmdsYl92YXItPmdsYl9wcml2X2xpc3QsCiAJCQlsaXN0KSB7CiAJCQlpZiAodGVtcF9wcml2KSB7Ci0JCQkJdGVtcF9wY2lwcml2ID0gCisJCQkJdGVtcF9wY2lwcml2ID0KIAkJCQkJKHN0cnVjdCBydGxfcGNpX3ByaXYgKil0ZW1wX3ByaXYtPnByaXY7CiAJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKIAkJCQkJKCgicGNpcHJpdi0+bmRpc19hZGFwdGVyLmZ1bmNudW1iZXIgJXggXG4iKSwKQEAgLTUyNiw4ICs1MjYsOCBAQAogfQogCiBzdGF0aWMgYm9vbCBfcnRsX3BjaV91cGRhdGVfZWFybHltb2RlX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIAotCQkJCQkgICBzdHJ1Y3QgcnRsX3RjYl9kZXNjICp0Y2JfZGVzYywgCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgIHN0cnVjdCBydGxfdGNiX2Rlc2MgKnRjYl9kZXNjLAogCQkJCQkgICB1OCB0aWQpCiB7CiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKIAl1OCBhZGRpdGlvbmxlbiA9IEZDU19MRU47CiAJc3RydWN0IHNrX2J1ZmYgKm5leHRfc2tiOwotCQkKKwogCS8qIGhlcmUgb3BlbiBpcyA0LCB3ZXAvdGtpcCBpcyA4LCBhZXMgaXMgMTIqLwogCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkKIAkJYWRkaXRpb25sZW4gKz0gaW5mby0+Y29udHJvbC5od19rZXktPmljdl9sZW47CkBAIC01NDQsNyArNTQ0LDcgQEAKIAl0Y2JfZGVzYy0+ZW1wa3RfbnVtID0gMDsKIAlzcGluX2xvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLndhaXRxX2xvY2spOwogCXNrYl9xdWV1ZV93YWxrKCZydGxwcml2LT5tYWM4MDIxMS5za2Jfd2FpdHFbdGlkXSwgbmV4dF9za2IpIHsKLQkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpuZXh0X2luZm8gPSAKKwkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpuZXh0X2luZm8gPQogCQkJCQlJRUVFODAyMTFfU0tCX0NCKG5leHRfc2tiKTsKIAkJaWYgKG5leHRfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7CiAJCQl0Y2JfZGVzYy0+ZW1wa3RfbGVuW3RjYl9kZXNjLT5lbXBrdF9udW1dID0KQEAgLTU1NCw3ICs1NTQsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoc2tiX3F1ZXVlX2lzX2xhc3QoJnJ0bHByaXYtPm1hYzgwMjExLnNrYl93YWl0cVt0aWRdLCAKKwkJaWYgKHNrYl9xdWV1ZV9pc19sYXN0KCZydGxwcml2LT5tYWM4MDIxMS5za2Jfd2FpdHFbdGlkXSwKIAkJCQkgICAgICBuZXh0X3NrYikpCiAJCQlicmVhazsKIApAQCAtNTc1LDI2ICs1NzUsMjYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBOVUxMOwogCWludCB0aWQ7IC8qIHNob3VsZCBiZSBpbnQgKi8KLQkKKwogCWlmICghcnRscHJpdi0+cnRsaGFsLmJfZWFybHltb2RlX2VuYWJsZSkKLQkJcmV0dXJuOwkKKwkJcmV0dXJuOwogCWlmIChydGxwcml2LT5kbS5zdXBwX3BoeW1vZGVfc3dpdGNoICYmCiAJCShydGxwcml2LT5lYXN5X2NvbmN1cnJlbnRfY3RsLmJzd2l0Y2hfaW5fcHJvY2VzcyB8fAotCQkocnRscHJpdi0+YnVkZHlfcHJpdiAmJiAKKwkJKHJ0bHByaXYtPmJ1ZGR5X3ByaXYgJiYKIAkJIHJ0bHByaXYtPmJ1ZGR5X3ByaXYtPmVhc3lfY29uY3VycmVudF9jdGwuYnN3aXRjaF9pbl9wcm9jZXNzKSkpCiAJCXJldHVybjsKLQkvKiB3ZSBqdXNlIHVzZSBlbSBmb3IgQkUvQksvVkkvVk8gKi8KKwkvKiB3ZSBqdXN0IHVzZSBlbSBmb3IgQkUvQksvVkkvVk8gKi8KIAlmb3IgKHRpZCA9IDc7IHRpZCA+PSAwOyB0aWQtLSkgewogCQl1OCBod19xdWV1ZSA9IGFjX3RvX2h3cVtydGxfdGlkX3RvX2FjKGh3LCB0aWQpXTsKIAkJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9ICZydGxwY2ktPnR4X3JpbmdbaHdfcXVldWVdOwotCQl3aGlsZSAoIW1hYy0+YWN0X3NjYW5uaW5nICYmIAorCQl3aGlsZSAoIW1hYy0+YWN0X3NjYW5uaW5nICYmCiAJCSAgICAgICBydGxwcml2LT5wc2MucmZwd3Jfc3RhdGUgPT0gRVJGT04pIHsKIAkJCXN0cnVjdCBydGxfdGNiX2Rlc2MgdGNiX2Rlc2M7Ci0JCQltZW1zZXQoJnRjYl9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IHJ0bF90Y2JfZGVzYykpOwkJCQorCQkJbWVtc2V0KCZ0Y2JfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBydGxfdGNiX2Rlc2MpKTsKIAogCQkJc3Bpbl9sb2NrX2JoKCZydGxwcml2LT5sb2Nrcy53YWl0cV9sb2NrKTsKIAkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZtYWMtPnNrYl93YWl0cVt0aWRdKSAmJgotCQkJICAgIChyaW5nLT5lbnRyaWVzIC0gc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpID4gCisJCQkgICAgKHJpbmctPmVudHJpZXMgLSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkgPgogCQkJICAgICBydGxoYWwtPm1heF9lYXJseW1vZGVfbnVtKSkgewogCQkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZtYWMtPnNrYl93YWl0cVt0aWRdKTsKIAkJCX0gZWxzZSB7CkBAIC02MDcsNyArNjA3LDcgQEAKIAkJCSAqIG11bHRpY2FzdC9icm9hZGNhc3Qvbm9fcW9zIGRhdGEgKi8KIAkJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKQotCQkJCV9ydGxfcGNpX3VwZGF0ZV9lYXJseW1vZGVfaW5mbyhodywgc2tiLCAKKwkJCQlfcnRsX3BjaV91cGRhdGVfZWFybHltb2RlX2luZm8oaHcsIHNrYiwKIAkJCQkJCQkgICAgICAgJnRjYl9kZXNjLCB0aWQpOwogCiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCkBAIC02MzUsNyArNjM1LDcgQEAKIAkJdTggdGlkOwogCQl1OCAqZW50cnk7CiAKLQkJCisKIAkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpCiAJCQllbnRyeSA9ICh1OCAqKSgmcmluZy0+YnVmZmVyX2Rlc2NbcmluZy0+aWR4XSk7CiAJCWVsc2UKQEAgLTY0MywxMSArNjQzLDExIEBACiAKIAkJaWYgKCFydGxwcml2LT5jZmctPm9wcy0+aXNfdHhfZGVzY19jbG9zZWQoaHcsIHByaW8sIHJpbmctPmlkeCkpCiAJCQlyZXR1cm47Ci0JCQkKKwogCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOwotCQkKKwogCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZyaW5nLT5xdWV1ZSk7Ci0JCQorCiAJCXBjaV91bm1hcF9zaW5nbGUocnRscGNpLT5wZGV2LAogCQkJCSBsZTMyX3RvX2NwdShydGxwcml2LT5jZmctPm9wcy0+CiAJCQkJCSAgICAgZ2V0X2Rlc2MoKHU4ICopIGVudHJ5LCB0cnVlLApAQCAtNjcyLDcgKzY3Miw3IEBACiAJCX0KIAogCQkvKiBmb3Igc3cgTFBTLCBqdXN0IGFmdGVyIE5VTEwgc2tiIHNlbmQgb3V0LCB3ZSBjYW4KLQkJICogc3VyZSBBUCBrb3duIHdlIGFyZSBzbGVlcGVkLCBvdXIgd2Ugc2hvdWxkIG5vdCBsZXQKKwkJICogc3VyZSBBUCBrbm93biB3ZSBhcmUgc2xlcHQsIG91ciB3ZSBzaG91bGQgbm90IGxldAogCQkgKiByZiB0byBzbGVlcCovCiAJCWZjID0gcnRsX2dldF9mYyhza2IpOwogCQlpZiAoaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSkgewpAQCAtNzQwLDcgKzc0MCw3IEBACiAJdTggdG1wX29uZSA9IDE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCXNrYiA9IGRldl9hbGxvY19za2IocnRscGNpLT5yeGJ1ZmZlcnNpemUpOwkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHJ0bHBjaS0+cnhidWZmZXJzaXplKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIDA7CiAJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLnJ4X2J1ZltkZXNjX2lkeF0gPSBza2I7CkBAIC03NTQsMjUgKzc1NCwyNSBAQAogCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocnRscGNpLT5wZGV2LCBidWZmZXJhZGRyZXNzKSkKIAkJcmV0dXJuIDA7CiAJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKLQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLCAKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLAogCQkJCQkgICAgSFdfREVTQ19SWF9QUkVQQVJFLAogCQkJCQkgICAgKHU4ICopICYgYnVmZmVyYWRkcmVzcyk7Ci0JfSBlbHNlIHsJCi0JCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfZGVzYyhodywgKHU4ICopIGVudHJ5LCBmYWxzZSwgCisJfSBlbHNlIHsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLAogCQkJCQkgICAgSFdfREVTQ19SWEJVRkZfQUREUiwKIAkJCQkJICAgICh1OCAqKSAmIGJ1ZmZlcmFkZHJlc3MpOwotCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsIAorCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgZmFsc2UsCiAJCQkJCSAgICBIV19ERVNDX1JYUEtUX0xFTiwKIAkJCQkJICAgICh1OCAqKSAmIHJ0bHBjaS0+cnhidWZmZXJzaXplKTsKLQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLCAKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksIGZhbHNlLAogCQkJCQkgICAgSFdfREVTQ19SWE9XTiwKIAkJCQkJICAgICh1OCAqKSAmIHRtcF9vbmUpOwogCX0KLQkKKwogCXJldHVybiAxOwogfQogCi0vKiBpbm9yZGVyIHRvIHJlY2VpdmUgOEsgQU1TRFUgd2UgaGF2ZSBzZXQgc2tiIHRvCisvKiBJbiBvcmRlciB0byByZWNlaXZlIDhLIEFNU0RVIHdlIGhhdmUgc2V0IHNrYiB0bwogICogOTEwMGJ5dGVzIGluIGluaXQgcnggcmluZywgYnV0IGlmIHRoaXMgcGFja2V0IGlzCiAgKiBub3QgYSBBTVNEVSwgdGhpcyBzbyBiaWcgcGFja2V0IHdpbGwgYmUgc2VudCB0bwogICogVENQL0lQIGRpcmVjdGx5LCB0aGlzIGNhdXNlIGJpZyBwYWNrZXQgcGluZyBmYWlsCkBAIC03ODMsNyArNzgzLDcgQEAKIC8qIGJ1dCBzb21lIHBsYXRmb3JtIHdpbGwgZmFpbCB3aGVuIGFsbG9jIHNrYiBzb21ldGltZXMuCiAgKiBpbiB0aGlzIGNvbmRpdGlvbiwgd2Ugd2lsbCBzZW5kIHRoZSBvbGQgc2tiIHRvCiAgKiBtYWM4MDIxMSBkaXJlY3RseSwgdGhpcyB3aWxsIG5vdCBjYXVzZSBhbnkgb3RoZXIKLSAqIGlzc3VlcywgYnV0IG9ubHkgYmUgbG9zdGVkIGJ5IFRDUC9JUCAqLworICogaXNzdWVzLCBidXQgb25seSBiZSBsb3N0IGJ5IFRDUC9JUCAqLwogc3RhdGljIHZvaWQgX3J0bF9wY2lfcnhfdG9fbWFjODAyMTEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzKQogewpAQCAtNzkyLDcgKzc5Miw3IEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnVza2IgPSBOVUxMOwogCQl1OCAqcGRhdGE7Ci0JCQorCiAJCXVza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYi0+bGVuICsgMTI4KTsKIAkJaWYgKGxpa2VseSh1c2tiKSkgewogCQkJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQih1c2tiKSwgJnJ4X3N0YXR1cywKQEAgLTgwNCw3ICs4MDQsNyBAQAogCQkJaWVlZTgwMjExX3J4X2lycXNhZmUoaHcsIHVza2IpOwogCQl9IGVsc2UgewogCQkJaWVlZTgwMjExX3J4X2lycXNhZmUoaHcsIHNrYik7Ci0JCX0JCisJCX0KIAl9CiB9CiAKQEAgLTgxNCwxMSArODE0LDExIEBACiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CiAKLQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hTSVNSXSwgCi0JCSAgICAgICBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSFNJU1JdKSB8IAorCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHJ0bHByaXYtPmNmZy0+bWFwc1tNQUNfSFNJU1JdLAorCQkgICAgICAgcnRsX3JlYWRfYnl0ZShydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hTSVNSXSkgfAogCQkgICAgICAgcnRscGNpLT5zeXNfaXJxX21hc2spOwogCi0JCisKIH0KIHN0YXRpYyB2b2lkIF9ydGxfcGNpX3J4X2ludGVycnVwdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKQEAgLTgzOSw3ICs4MzksNyBAQAogCQkubm9pc2UgPSAtOTgsCiAJCS5yYXRlID0gMCwKIAl9OwotCQorCiAJLypSWCBOT1JNQUwgUEtUICovCiAJd2hpbGUgKGNvdW50LS0pIHsKIAkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKQEAgLTg1Miw2NSArODUyLDY1IEBACiAJCS8qcnggcGt0ICovCiAJCXN0cnVjdCBza19idWZmICpza2IgPSBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0ucnhfYnVmWwogCQkJCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4XTsKLQkJCisKIAkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKLQkJCXJ4X3JlbWFpbmVkX2NudCA9IAorCQkJcnhfcmVtYWluZWRfY250ID0KIAkJCQlydGxwcml2LT5jZmctPm9wcy0+cnhfZGVzY19idWZmX3JlbWFpbmVkX2NudChodywKIAkJCQkJCQkJICAgICAgaHdfcXVldWUpOwotCQkJaWYgKHJ4X3JlbWFpbmVkX2NudCA8IDEpIAorCQkJaWYgKHJ4X3JlbWFpbmVkX2NudCA8IDEpCiAJCQkJcmV0dXJuOwotCQkJCisKIAkJfSBlbHNlIHsJLyogcnggZGVzY3JpcHRvciAqLwogCQkJcGRlc2MgPSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2NbCiAJCQkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeF07Ci0JCQkKKwogCQkJb3duID0gKHU4KSBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopIHBkZXNjLAotCQkJCQkJCSAgICAgICBmYWxzZSwgCisJCQkJCQkJICAgICAgIGZhbHNlLAogCQkJCQkJCSAgICAgICBIV19ERVNDX09XTik7CiAJCQlpZiAob3duKSAvKiB3YWl0IGRhdGEgdG8gYmUgZmlsbGVkIGJ5IGhhcmR3YXJlICovCiAJCQkJcmV0dXJuOwogCQl9Ci0JCQorCiAJCS8qIEdldCBoZXJlIG1lYW5zOiBkYXRhIGlzIGZpbGxlZCBhbHJlYWR5Ki8KIAkJLyogQUFBQUFBdHRlbnRpb24gISEhCiAJCSAqIFdlIGNhbiBOT1QgYWNjZXNzICdza2InIGJlZm9yZSAncGNpX3VubWFwX3NpbmdsZScgKi8KIAkJcGNpX3VubWFwX3NpbmdsZShydGxwY2ktPnBkZXYsICooKGRtYV9hZGRyX3QgKikgc2tiLT5jYiksCiAJCQkgCSBydGxwY2ktPnJ4YnVmZmVyc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCisKIAkJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKIAkJCWJ1ZmZlcl9kZXNjID0gJnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzY1sKIAkJCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4XTsKIAkJCS8qbWVhbnMgcnggd2lmaSBpbmZvKi8KIAkJCXBkZXNjID0gKHN0cnVjdCBydGxfcnhfZGVzYyAqKXNrYi0+ZGF0YTsKIAkJfQotCQkKKwogCQlydGxwcml2LT5jZmctPm9wcy0+cXVlcnlfcnhfZGVzYyhodywgJnN0YXR1cywKIAkJCQkJCSAmcnhfc3RhdHVzLCAodTggKikgcGRlc2MsIHNrYik7Ci0JCQkKKwogCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykKLQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5yeF9jaGVja19kbWFfb2soaHcsIAotCQkJCQkJCSAgICh1OCAqKWJ1ZmZlcl9kZXNjLCAKKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5yeF9jaGVja19kbWFfb2soaHcsCisJCQkJCQkJICAgKHU4ICopYnVmZmVyX2Rlc2MsCiAJCQkJCQkJICAgaHdfcXVldWUpOwogCi0JCQkKLQkJbGVuID0gcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKCh1OCAqKXBkZXNjLCBmYWxzZSwgCisKKwkJbGVuID0gcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKCh1OCAqKXBkZXNjLCBmYWxzZSwKIAkJCQkJCSAgSFdfREVTQ19SWFBLVF9MRU4pOwotCQkJCisKIAkJaWYgKHNrYi0+ZW5kIC0gc2tiLT50YWlsID4gbGVuKSB7CiAJCQlza2JfcHV0KHNrYiwgbGVuKTsKLQkJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQkKLQkJCQlza2JfcmVzZXJ2ZShza2IsIHN0YXR1cy5yeF9kcnZpbmZvX3NpemUgKyAKKwkJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQorCQkJCXNrYl9yZXNlcnZlKHNrYiwgc3RhdHVzLnJ4X2RydmluZm9fc2l6ZSArCiAJCQkJCQkgc3RhdHVzLnJ4X2J1ZnNoaWZ0ICsgMjQpOwogCQkJZWxzZQotCQkJCXNrYl9yZXNlcnZlKHNrYiwgc3RhdHVzLnJ4X2RydmluZm9fc2l6ZSArIAorCQkJCXNrYl9yZXNlcnZlKHNrYiwgc3RhdHVzLnJ4X2RydmluZm9fc2l6ZSArCiAJCQkJCQkgc3RhdHVzLnJ4X2J1ZnNoaWZ0KTsKIAogCQl9IGVsc2UgewotCQkJcHJpbnRrKCJza2ItPmVuZCAtIHNrYi0+dGFpbCA9ICVkLCBsZW4gaXMgJWRcbiIsIAorCQkJcHJpbnRrKCJza2ItPmVuZCAtIHNrYi0+dGFpbCA9ICVkLCBsZW4gaXMgJWRcbiIsCiAJCQkgICAgICAgc2tiLT5lbmQgLSBza2ItPnRhaWwsIGxlbik7CiAJCQlicmVhazsKIAkJfQotCQkJCisKIAkJcnRscHJpdi0+Y2ZnLT5vcHMtPnJ4X2NvbW1hbmRfcGFja2V0X2hhbmRsZXIoaHcsIHN0YXR1cywgc2tiKTsKIAogCQkvKgpAQCAtOTIyLDkgKzkyMiw5IEBACiAKIAkJaGRyID0gcnRsX2dldF9oZHIoc2tiKTsKIAkJZmMgPSBydGxfZ2V0X2ZjKHNrYik7Ci0JCQorCiAJCWlmICghc3RhdHVzLmJfY3JjICYmICFzdGF0dXMuYl9od2Vycm9yKSB7Ci0JCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksICZyeF9zdGF0dXMsIAorCQkJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCAmcnhfc3RhdHVzLAogCQkJICAgICAgIHNpemVvZihyeF9zdGF0dXMpKTsKIAogCQkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7CkBAIC05NDcsMTMgKzk0NywxMyBAQAogCiAJCQkvKiBzdGF0aWMgYmNuIGZvciByb2FtaW5nICovCiAJCQlydGxfYmVhY29uX3N0YXRpc3RpYyhodywgc2tiKTsKLQkJCXJ0bF9wMnBfaW5mbyhodywgKHZvaWQqKXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwkKKwkJCXJ0bF9wMnBfaW5mbyhodywgKHZvaWQqKXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQkJLyogZm9yIHN3IGxwcyAqLwogCQkJcnRsX3N3bHBzX2JlYWNvbihodywgKHZvaWQqKXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQkJcnRsX3JlY29nbml6ZV9wZWVyKGh3LCAodm9pZCopc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJCQlpZiAoKHJ0bHByaXYtPm1hYzgwMjExLm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgJiYKIAkJCSAgICAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSYmCi0JCQkgICAgKGllZWU4MDIxMV9pc19iZWFjb24oZmMpIHx8IAorCQkJICAgIChpZWVlODAyMTFfaXNfYmVhY29uKGZjKSB8fAogCQkJICAgICBpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpKSB7CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCX0gZWxzZSB7CkBAIC05NjQsMTMgKzk2NCwxMyBAQAogCQl9CiAJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7CiAJCQlydGxwY2ktPnJ4X3JpbmdbaHdfcXVldWVdLm5leHRfcnhfcnAgKz0gMTsKLQkJCXJ0bHBjaS0+cnhfcmluZ1tod19xdWV1ZV0ubmV4dF9yeF9ycCAlPSAKKwkJCXJ0bHBjaS0+cnhfcmluZ1tod19xdWV1ZV0ubmV4dF9yeF9ycCAlPQogCQkJCQkJCVJUTF9QQ0lfTUFYX1JYX0NPVU5UOwogCiAKIAkJCXJ4X3JlbWFpbmVkX2NudC0tOwogCQkJaWYgKDEvKnJ4X3JlbWFpbmVkX2NudCA9PSAwKi8pIHsKLQkJCQlydGxfd3JpdGVfd29yZChydGxwcml2LCAweDNCNCwgCisJCQkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgMHgzQjQsCiAJCQkJCXJ0bHBjaS0+cnhfcmluZ1tod19xdWV1ZV0ubmV4dF9yeF9ycCk7CiAJCQl9CiAJCX0KQEAgLTk4MSwyMiArOTgxLDIyIEBACiAJCX0KIAogCQlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykgewotCQkJX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKilidWZmZXJfZGVzYywgCisJCQlfcnRsX3BjaV9pbml0X29uZV9yeGRlc2MoaHcsICh1OCAqKWJ1ZmZlcl9kZXNjLAogCQkJCQkJIHJ4cmluZ19pZHgsCi0JCQkJCSAgICAgICBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4KTsJCQkKKwkJCQkJICAgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHgpOwogCQl9IGVsc2UgewogCQkJX3J0bF9wY2lfaW5pdF9vbmVfcnhkZXNjKGh3LCAodTggKilwZGVzYywgcnhyaW5nX2lkeCwKLQkJCQkJICAgICAgIHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHgpOwkJCQorCQkJCQkgICAgICAgcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCk7CiAKLQkJCWlmIChydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID09IAorCQkJaWYgKHJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPT0KIAkJCSAgICBydGxwY2ktPnJ4cmluZ2NvdW50IC0gMSkKLQkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBwZGVzYywgCi0JCQkJCQkJICAgIGZhbHNlLCAKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBwZGVzYywKKwkJCQkJCQkgICAgZmFsc2UsCiAJCQkJCQkJICAgIEhXX0RFU0NfUlhFUk8sCiAJCQkJCQkJICAgICh1OCAqKSAmIHRtcF9vbmUpOwogCQl9Ci0JCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPSAKLQkJCQkocnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCArIDEpICUgCisJCXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5pZHggPQorCQkJCShydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ICsgMSkgJQogCQkJCXJ0bHBjaS0+cnhyaW5nY291bnQ7CiAJfQogfQpAQCAtMTAxMSw3ICsxMDExLDcgQEAKIAl1MzIgaW50YSA9IDA7CiAJdTMyIGludGIgPSAwOwogCi0JCisKIAogCWlmIChydGxwY2ktPmlycV9lbmFibGVkID09IDApCiAJCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTEwMjAsNyArMTAyMCw3IEBACiAKIAogCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hJTVJdLCAweDApOwotCQorCiAKIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcnRscHJpdi0+Y2ZnLT5tYXBzW01BQ19ISU1SRV0sIDB4MCk7CiAKQEAgLTEwMjksNyArMTAyOSw3IEBACiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmludGVycnVwdF9yZWNvZ25pemVkKGh3LCAmaW50YSwgJmludGIpOwogCiAKLQkvKlNoYXJlZCBJUlEgb3IgSFcgZGlzYXBwYXJlZCAqLworCS8qU2hhcmVkIElSUSBvciBIVyBkaXNhcHBlYXJlZCAqLwogCWlmICghaW50YSB8fCBpbnRhID09IDB4ZmZmZikKIAkJZ290byBkb25lOwogCS8qPDE+IGJlYWNvbiByZWxhdGVkICovCkBAIC0xMTI3LDcgKzExMjcsNyBAQAogCS8qPDQ+IGZ3IHJlbGF0ZWQqLwogCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4NzIzQUUpIHsKIAkJaWYgKGludGEgJiBydGxwcml2LT5jZmctPm1hcHNbUlRMX0lNUl9DMkhDTURdKSB7Ci0JCQlSVF9UUkFDRShDT01QX0lOVFIsIERCR19UUkFDRSwgCisJCQlSVF9UUkFDRShDT01QX0lOVFIsIERCR19UUkFDRSwKIAkJCQkgKCJmaXJtd2FyZSBpbnRlcnJ1cHQhXG4iKSk7CiAJCQlxdWV1ZV9kZWxheWVkX3dvcmsocnRscHJpdi0+d29ya3MucnRsX3dxLAogCQkJCQkgICAmcnRscHJpdi0+d29ya3MuZndldnRfd3EsIDApOwpAQCAtMTE0MiwxMiArMTE0MiwxMiBAQAogCWlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTg4RUUgfHwKIAkgICAgcnRsaGFsLT5od190eXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODcyM0JFKSB7CiAJCWlmICh1bmxpa2VseShpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfSFNJU1JfSU5EXSkpIHsKLQkJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLCAKKwkJCVJUX1RSQUNFKENPTVBfSU5UUiwgREJHX1RSQUNFLAogCQkJCQkgKCJoc2lzciBpbnRlcnJ1cHQhXG4iKSk7CiAJCQlfcnRsX3BjaV9oc19pbnRlcnJ1cHQoaHcpOwogCQl9CiAJfQotCQorCiAKIAlpZihydGxwcml2LT5ydGxoYWwuYl9lYXJseW1vZGVfZW5hYmxlKQogCQl0YXNrbGV0X3NjaGVkdWxlKCZydGxwcml2LT53b3Jrcy5pcnFfdGFza2xldCk7CkBAIC0xMTU3LDcgKzExNTcsNyBAQAogCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBydGxwcml2LT5jZmctPm1hcHNbTUFDX0hJTVJFXSwKIAkJCXJ0bHBjaS0+aXJxX21hc2tbMV0pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7Ci0JCisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKIGRvbmU6CkBAIC0xMjAwLDE2ICsxMjAwLDE2IEBACiAJcGRlc2MgPSAmcmluZy0+ZGVzY1swXTsKIAlpZiAocnRscHJpdi0+dXNlX25ld190cnhfZmxvdykKIAkJcGJ1ZmZlcl9kZXNjID0gJnJpbmctPmJ1ZmZlcl9kZXNjWzBdOwotCQorCiAvKjxkZWxldGUgaW4ga2VybmVsIHN0YXJ0PiovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsNywwKSkKLQlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9kZXNjKGh3LCBoZHIsICh1OCAqKSBwZGVzYywgCi0JCQkJICAgICAgICAodTggKilwYnVmZmVyX2Rlc2MsIGluZm8sIHBza2IsIAorCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLAorCQkJCSAgICAgICAgKHU4ICopcGJ1ZmZlcl9kZXNjLCBpbmZvLCBwc2tiLAogCQkJCSAgICAgICAgQkVBQ09OX1FVRVVFLCAmdGNiX2Rlc2MpOwogI2Vsc2UKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsCi0JCQkJCSh1OCAqKXBidWZmZXJfZGVzYywgaW5mbywgTlVMTCwgcHNrYiwgCisJCQkJCSh1OCAqKXBidWZmZXJfZGVzYywgaW5mbywgTlVMTCwgcHNrYiwKIAkJCQkJQkVBQ09OX1FVRVVFLCAmdGNiX2Rlc2MpOwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2VuZGlmCkBAIC0xMjM1LDcgKzEyMzUsNyBAQAogCQlkZXNjX251bSA9IFRYX0RFU0NfTlVNXzkyRTsKIAllbHNlCiAJCWRlc2NfbnVtID0gUlRfVFhERVNDX05VTTsKLQkKKwogCWZvciAoaSA9IDA7IGkgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKSB7CiAJCXJ0bHBjaS0+dHhyaW5nY291bnRbaV0gPSBkZXNjX251bTsKIAl9CkBAIC0xMzA5LDEyICsxMzA5LDEyIEBACiAJLyogYWxsb2MgdHggYnVmZmVyIGRlc2MgZm9yIG5ldyB0cnggZmxvdyovCiAJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKIAkJYnVmZmVyX2Rlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChydGxwY2ktPnBkZXYsCi0JCQkJCSAgICBzaXplb2YoKmJ1ZmZlcl9kZXNjKSAqIGVudHJpZXMsIAorCQkJCQkgICAgc2l6ZW9mKCpidWZmZXJfZGVzYykgKiBlbnRyaWVzLAogCQkJCQkgICAgJmJ1ZmZlcl9kZXNjX2RtYSk7CiAKIAkJaWYgKCFidWZmZXJfZGVzYyB8fCAodW5zaWduZWQgbG9uZylidWZmZXJfZGVzYyAmIDB4RkYpIHsKIAkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICgiQ2Fubm90IGFsbG9jYXRlIFRYIHJpbmcgKHByaW8gPSAlZClcbiIsIAorCQkJCSAoIkNhbm5vdCBhbGxvY2F0ZSBUWCByaW5nIChwcmlvID0gJWQpXG4iLAogCQkJCSBwcmlvKSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTMyMiwxMyArMTMyMiwxMyBAQAogCQltZW1zZXQoYnVmZmVyX2Rlc2MsIDAsIHNpemVvZigqYnVmZmVyX2Rlc2MpICogZW50cmllcyk7CiAJCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5idWZmZXJfZGVzYyA9IGJ1ZmZlcl9kZXNjOwogCQlydGxwY2ktPnR4X3JpbmdbcHJpb10uYnVmZmVyX2Rlc2NfZG1hID0gYnVmZmVyX2Rlc2NfZG1hOwotCQkKKwogCQlydGxwY2ktPnR4X3JpbmdbcHJpb10uY3VyX3R4X3JwID0gMDsKIAkJcnRscGNpLT50eF9yaW5nW3ByaW9dLmN1cl90eF93cCA9IDA7CiAJCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5hdmxfZGVzYyA9IGVudHJpZXM7CiAKIAl9Ci0JCisKIAkvKiBhbGxvYyBkbWEgZm9yIHRoaXMgcmluZyAqLwogCWRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChydGxwY2ktPnBkZXYsCiAJCQkJICAgIHNpemVvZigqZGVzYykgKiBlbnRyaWVzLCAmZGVzY19kbWEpOwpAQCAtMTM0Miw3ICsxMzQyLDcgQEAKIAltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSAqIGVudHJpZXMpOwogCXJ0bHBjaS0+dHhfcmluZ1twcmlvXS5kZXNjID0gZGVzYzsKIAlydGxwY2ktPnR4X3JpbmdbcHJpb10uZG1hID0gZGVzY19kbWE7Ci0JCisKIAlydGxwY2ktPnR4X3JpbmdbcHJpb10uaWR4ID0gMDsKIAlydGxwY2ktPnR4X3JpbmdbcHJpb10uZW50cmllcyA9IGVudHJpZXM7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcnRscGNpLT50eF9yaW5nW3ByaW9dLnF1ZXVlKTsKQEAgLTEzNTcsNyArMTM1Nyw3IEBACiAJCQkJCQkgICAgICBzaXplb2YoKmRlc2MpKTsKIAogCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgJiAoZGVzY1tpXSksCi0JCQkJCQkgICAgdHJ1ZSwgCisJCQkJCQkgICAgdHJ1ZSwKIAkJCQkJCSAgICBIV19ERVNDX1RYX05FWFRERVNDX0FERFIsCiAJCQkJCQkgICAgKHU4ICopICYgbmV4dGRlc2NhZGRyZXNzKTsKIAkJfQpAQCAtMTM3MSwxNSArMTM3MSwxNSBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAogCWludCBpOwotCQorCiAJaWYgKHJ0bHByaXYtPnVzZV9uZXdfdHJ4X2Zsb3cpIHsKIAkJc3RydWN0IHJ0bF9yeF9idWZmZXJfZGVzYyAqZW50cnkgPSBOVUxMOwogCQkvKiBhbGxvYyBkbWEgZm9yIHRoaXMgcmluZyAqLwotCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MgPSAKKwkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmJ1ZmZlcl9kZXNjID0KIAkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHJ0bHBjaS0+cGRldiwKIAkJCQkJIHNpemVvZigqcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLgotCQkJCQkgICAgICAgIGJ1ZmZlcl9kZXNjKSAqIAotCQkJCQkgICAgICAgIHJ0bHBjaS0+cnhyaW5nY291bnQsIAorCQkJCQkgICAgICAgIGJ1ZmZlcl9kZXNjKSAqCisJCQkJCSAgICAgICAgcnRscGNpLT5yeHJpbmdjb3VudCwKIAkJCQkJICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZG1hKTsKIAkJaWYgKCFydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2MgfHwKIAkJICAgICh1bnNpZ25lZCBsb25nKXJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS5idWZmZXJfZGVzYyAmIDB4RkYpIHsKQEAgLTEzOTMsOSArMTM5Myw5IEBACiAKIAkJLyogaW5pdCBldmVyeSBkZXNjIGluIHRoaXMgcmluZyAqLwogCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uaWR4ID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IHJ0bHBjaS0+cnhyaW5nY291bnQ7IGkrKykgewkJCQorCQlmb3IgKGkgPSAwOyBpIDwgcnRscGNpLT5yeHJpbmdjb3VudDsgaSsrKSB7CiAJCQllbnRyeSA9ICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uYnVmZmVyX2Rlc2NbaV07Ci0JCQlpZiAoIV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopZW50cnksIAorCQkJaWYgKCFfcnRsX3BjaV9pbml0X29uZV9yeGRlc2MoaHcsICh1OCAqKWVudHJ5LAogCQkJCQkJICAgICAgcnhyaW5nX2lkeCwgaSkpCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTE0MDMsMTQgKzE0MDMsMTQgQEAKIAkJc3RydWN0IHJ0bF9yeF9kZXNjICplbnRyeSA9IE5VTEw7CiAJCXU4IHRtcF9vbmUgPSAxOwogCQkvKiBhbGxvYyBkbWEgZm9yIHRoaXMgcmluZyAqLwotCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzYyA9IAorCQlydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzYyA9CiAJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChydGxwY2ktPnBkZXYsCiAJCQkJCSBzaXplb2YoKnJ0bHBjaS0+cnhfcmluZ1tyeHJpbmdfaWR4XS4KLQkJCQkJICAgICAgICBkZXNjKSAqIHJ0bHBjaS0+cnhyaW5nY291bnQsIAorCQkJCQkgICAgICAgIGRlc2MpICogcnRscGNpLT5yeHJpbmdjb3VudCwKIAkJCQkJICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZG1hKTsKIAkJaWYgKCFydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzYyB8fAogCQkgICAgKHVuc2lnbmVkIGxvbmcpcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2MgJiAweEZGKSB7Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgREJHX0VNRVJHLCAKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfRU1FUkcsCiAJCQkJICgiQ2Fubm90IGFsbG9jYXRlIFJYIHJpbmdcbiIpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xNDIxLDkgKzE0MjEsOSBAQAogCiAJCS8qIGluaXQgZXZlcnkgZGVzYyBpbiB0aGlzIHJpbmcgKi8KIAkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsJCQkKKwkJZm9yIChpID0gMDsgaSA8IHJ0bHBjaS0+cnhyaW5nY291bnQ7IGkrKykgewogCQkJZW50cnkgPSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2NbaV07Ci0JCQlpZiAoIV9ydGxfcGNpX2luaXRfb25lX3J4ZGVzYyhodywgKHU4ICopZW50cnksIAorCQkJaWYgKCFfcnRsX3BjaV9pbml0X29uZV9yeGRlc2MoaHcsICh1OCAqKWVudHJ5LAogCQkJCQkJICAgICAgcnhyaW5nX2lkeCwgaSkpCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTE0NjcsNyArMTQ2Nyw3IEBACiAJCQkJICAgIHNpemVvZigqcmluZy0+YnVmZmVyX2Rlc2MpICogcmluZy0+ZW50cmllcywKIAkJCQkgICAgcmluZy0+YnVmZmVyX2Rlc2MsIHJpbmctPmJ1ZmZlcl9kZXNjX2RtYSk7CiAJCXJpbmctPmJ1ZmZlcl9kZXNjID0gTlVMTDsKLQl9CQorCX0KIH0KIAogc3RhdGljIHZvaWQgX3J0bF9wY2lfZnJlZV9yeF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgcnhyaW5nX2lkeCkKQEAgLTE1MzIsNyArMTUzMiw3IEBACiAJCV9ydGxfcGNpX2ZyZWVfcnhfcmluZyhodywgcnhyaW5nX2lkeCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7IGkrKykKLQkJaWYgKHJ0bHBjaS0+dHhfcmluZ1tpXS5kZXNjIHx8IAorCQlpZiAocnRscGNpLT50eF9yaW5nW2ldLmRlc2MgfHwKIAkJICAgIHJ0bHBjaS0+dHhfcmluZ1tpXS5idWZmZXJfZGVzYykKIAkJCV9ydGxfcGNpX2ZyZWVfdHhfcmluZyhodywgaSk7CiAKQEAgLTE1NjcsMTYgKzE1NjcsMTYgQEAKIAkJLyogZm9yY2UgdGhlIHJ4X3JpbmdbUlhfTVBEVV9RVUVVRS8KIAkJICogUlhfQ01EX1FVRVVFXS5pZHggdG8gdGhlIGZpcnN0IG9uZSAqLwogCQkvKm5ldyB0cnggZmxvdywgZG8gbm90aGluZyovCi0JCWlmICgocnRscHJpdi0+dXNlX25ld190cnhfZmxvdyA9PSBmYWxzZSkgJiYgCisJCWlmICgocnRscHJpdi0+dXNlX25ld190cnhfZmxvdyA9PSBmYWxzZSkgJiYKIAkJICAgICBydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzYykgewogCQkJc3RydWN0IHJ0bF9yeF9kZXNjICplbnRyeSA9IE5VTEw7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBydGxwY2ktPnJ4cmluZ2NvdW50OyBpKyspIHsKLQkJCQllbnRyeSA9ICZydGxwY2ktPnJ4X3JpbmdbcnhyaW5nX2lkeF0uZGVzY1tpXTsJCQkKLQkJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoaHcsICh1OCAqKSBlbnRyeSwgCisJCQkJZW50cnkgPSAmcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmRlc2NbaV07CisJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKGh3LCAodTggKikgZW50cnksCiAJCQkJCQkJICAgIGZhbHNlLAotCQkJCQkJCSAgICBIV19ERVNDX1JYT1dOLCAKLQkJCQkJCQkgICAgKHU4ICopICYgdG1wX29uZSk7CQkKKwkJCQkJCQkgICAgSFdfREVTQ19SWE9XTiwKKwkJCQkJCQkgICAgKHU4ICopICYgdG1wX29uZSk7CiAJCQl9CiAJCX0KIAkJcnRscGNpLT5yeF9yaW5nW3J4cmluZ19pZHhdLmlkeCA9IDA7CX0KQEAgLTE1ODUsMTMgKzE1ODUsMTMgQEAKIAkgKiBhbmQgZm9yY2UgdGhlICB0eCBpZHggdG8gdGhlIGZpcnN0IG9uZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKSB7Ci0JCWlmIChydGxwY2ktPnR4X3JpbmdbaV0uZGVzYyB8fCAKKwkJaWYgKHJ0bHBjaS0+dHhfcmluZ1tpXS5kZXNjIHx8CiAJCQlydGxwY2ktPnR4X3JpbmdbaV0uYnVmZmVyX2Rlc2MpIHsKIAkJCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSAmcnRscGNpLT50eF9yaW5nW2ldOwogCiAJCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSB7CiAJCQkJdTggKmVudHJ5OwotCQkJCXN0cnVjdCBza19idWZmICpza2IgPSAKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0KIAkJCQkJX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOwogCQkJCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQogCQkJCQllbnRyeSA9ICh1OCAqKSgmcmluZy0+YnVmZmVyX2Rlc2MKQEAgLTE2MTgsNyArMTYxOCw3IEBACiAKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQotc3RhdGljIGJvb2wgcnRsX3BjaV90eF9jaGtfd2FpdHFfaW5zZXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCAKK3N0YXRpYyBib29sIHJ0bF9wY2lfdHhfY2hrX3dhaXRxX2luc2VydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKICNlbHNlCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwpAQCAtMTc0MSwxMCArMTc0MSwxMCBAQAogCX0KIAogCXBkZXNjID0gJnJpbmctPmRlc2NbaWR4XTsKLQkKKwogCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KSB7CiAJCXB0eF9iZF9kZXNjID0gJnJpbmctPmJ1ZmZlcl9kZXNjW2lkeF07Ci0JfSBlbHNlIHsJCisJfSBlbHNlIHsKIAkJb3duID0gKHU4KSBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopIHBkZXNjLAogCQkJCXRydWUsIEhXX0RFU0NfT1dOKTsKIApAQCAtMTc1NSwxNyArMTc1NSwxNyBAQAogCQkJCSAgaHdfcXVldWUsIHJpbmctPmlkeCwgaWR4LAogCQkJCSAgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSk7CiAKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCAKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLAogCQkJCQkgICAgICAgZmxhZ3MpOwogCQkJcmV0dXJuIHNrYi0+bGVuOwogCQl9CiAJfQotCQorCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKIAkJdGlkID0gcnRsX2dldF90aWQoc2tiKTsKIAkJaWYgKHN0YSkgewogCQkJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKilzdGEtPmRydl9wcml2OwotCQkJc2VxX251bWJlciA9IChsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIAorCQkJc2VxX251bWJlciA9IChsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmCiAJCQkJICAgICAgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0OwogCQkJc2VxX251bWJlciArPSAxOwogCkBAIC0xNzc5LDEzICsxNzc5LDEzIEBACiAKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQotCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLCAKLQkJCQkJKHU4ICopcHR4X2JkX2Rlc2MsIGluZm8sIHNrYiwgCisJcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsCisJCQkJCSh1OCAqKXB0eF9iZF9kZXNjLCBpbmZvLCBza2IsCiAJCQkJCWh3X3F1ZXVlLCBwdGNiX2Rlc2MpOwogI2Vsc2UKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgZW5kPiovCi0JcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfZGVzYyhodywgaGRyLCAodTggKikgcGRlc2MsIAotCQkJCQkodTggKilwdHhfYmRfZGVzYywgaW5mbywgc3RhLCBza2IsIAorCXJ0bHByaXYtPmNmZy0+b3BzLT5maWxsX3R4X2Rlc2MoaHcsIGhkciwgKHU4ICopIHBkZXNjLAorCQkJCQkodTggKilwdHhfYmRfZGVzYywgaW5mbywgc3RhLCBza2IsCiAJCQkJCWh3X3F1ZXVlLCBwdGNiX2Rlc2MpOwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2VuZGlmCkBAIC0xODMyLDEwICsxODMyLDEwIEBACiAJdTE2IGkgPSAwOwogCWludCBxdWV1ZV9pZDsKIAlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nOwotCQorCiAJaWYgKG1hYy0+c2tpcF9zY2FuKQogCQlyZXR1cm47Ci0JCisKIAlmb3IgKHF1ZXVlX2lkID0gUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQgLSAxOyBxdWV1ZV9pZCA+PSAwOykgewogCQl1MzIgcXVldWVfbGVuOwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMywxMCwwKSkKQEAgLTE5MzYsNyArMTkzNiw3IEBACiAJdTggUkZJblByb2dyZXNzVGltZU91dCA9IDA7CiAKIAkvKgotCSAqc2hvdWxkIGJlZm9yZSBkaXNhYmxlIGludGVycnJ1cHQmYWRhcHRlcgorCSAqc2hvdWxkIGJlZm9yZSBkaXNhYmxlIGludGVycnVwdCZhZGFwdGVyCiAJICphbmQgd2lsbCBkbyBpdCBpbW1lZGlhdGVseS4KIAkgKi8KIAlzZXRfaGFsX3N0b3AocnRsaGFsKTsKQEAgLTIwODEsMTMgKzIwODEsMTMgQEAKIAkJCXJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPSAwOwogCQl9CiAJfQotCQorCiAJLyogOTJlZSB1c2UgbmV3IHRyeCBmbG93ICovCiAJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJFRSkKIAkJcnRscHJpdi0+dXNlX25ld190cnhfZmxvdyA9IHRydWU7CiAJZWxzZQogCQlydGxwcml2LT51c2VfbmV3X3RyeF9mbG93ID0gZmFsc2U7Ci0JCisKIAkvKmZpbmQgYnVzIGluZm8gKi8KIAlwY2lwcml2LT5uZGlzX2FkYXB0ZXIuYnVzbnVtYmVyID0gcGRldi0+YnVzLT5udW1iZXI7CiAJcGNpcHJpdi0+bmRpc19hZGFwdGVyLmRldm51bWJlciA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKQEAgLTIwOTUsNyArMjA5NSw3IEBACiAKIAkvKmZpbmQgYnJpZGdlIGluZm8gKi8KIAlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvciA9IFBDSV9CUklER0VfVkVORE9SX1VOS05PV047Ci0JLyogc29tZSBBUk0gaGF2ZSBubyBicmlkZ2VfcGRldiBhbmQgd2lsbCBjcmFzaCBoZXJlIAorCS8qIHNvbWUgQVJNIGhhdmUgbm8gYnJpZGdlX3BkZXYgYW5kIHdpbGwgY3Jhc2ggaGVyZQogCSAqIHNvIHdlIHNob3VsZCBjaGVjayBpZiBicmlkZ2VfcGRldiBpcyBOVUxMICovCiAJaWYgKGJyaWRnZV9wZGV2KSB7CiAJCXBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfdmVuZG9yaWQgPSBicmlkZ2VfcGRldi0+dmVuZG9yOwpAQCAtMjE4Nyw3ICsyMTg3LDcgQEAKIAl9CiAKIAlydGxwY2ktPnVzaW5nX21zaSA9IHRydWU7Ci0JCisKIAlSVF9UUkFDRShDT01QX0lOSVR8Q09NUF9JTlRSLCBEQkdfRE1FU0csICgiTVNJIEludGVycnVwdCBNb2RlIVxuIikpOwogCXJldHVybiAwOwogfQpAQCAtMjE5OCw3ICsyMTk4LDcgQEAKIAlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOwogCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHBjaXByaXYpOwogCWludCByZXQ7Ci0JCisKIAlyZXQgPSByZXF1ZXN0X2lycShydGxwY2ktPnBkZXYtPmlycSwgJl9ydGxfcGNpX2ludGVycnVwdCwKIAkJCSAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBodyk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTIyMDYsNyArMjIwNiw3IEBACiAJfQogCiAJcnRscGNpLT51c2luZ19tc2kgPSBmYWxzZTsKLQlSVF9UUkFDRShDT01QX0lOSVR8Q09NUF9JTlRSLCBEQkdfRE1FU0csIAorCVJUX1RSQUNFKENPTVBfSU5JVHxDT01QX0lOVFIsIERCR19ETUVTRywKIAkJICgiUGluLWJhc2VkIEludGVycnVwdCBNb2RlIVxuIikpOwogCXJldHVybiAwOwogfQpAQCAtMjI5Myw3ICsyMjkzLDcgQEAKIAkvKgogCSAqaW5pdCBkYmdwIGZsYWdzIGJlZm9yZSBhbGwKIAkgKm90aGVyIGZ1bmN0aW9ucywgYmVjYXVzZSB3ZSB3aWxsCi0JICp1c2UgaXQgaW4gb3RoZXIgZnVudGlvbnMgbGlrZQorCSAqdXNlIGl0IGluIG90aGVyIGZ1bmN0aW9ucyBsaWtlCiAJICpSVF9UUkFDRS9SVF9QUklOVC9SVExfUFJJTlRfREFUQQogCSAqeW91IGNhbiBub3QgdXNlIHRoZXNlIG1hY3JvCiAJICpiZWZvcmUgdGhpcwpAQCAtMjM3Nyw3ICsyMzc3LDcgQEAKIAl9IGVsc2UgewogCQlydGxwcml2LT5tYWM4MDIxMS5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKIAl9Ci0JLyogdGhlIHdpcGh5IG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVkIHRvIAorCS8qIHRoZSB3aXBoeSBtdXN0IGhhdmUgYmVlbiByZWdpc3RlZCB0bwogCSAqIGNmZzgwMjExIHByaW9yIHRvIHJlZ3VsYXRvcnlfaGludCAqLwogCWlmIChyZWd1bGF0b3J5X2hpbnQoaHctPndpcGh5LCBydGxwcml2LT5yZWdkLmFscGhhMikpIHsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsIERCR19XQVJOSU5HLCAoInJlZ3VsYXRvcnlfaGludCBmYWlsXG4iKSk7CkBAIC0yNDI4LDEzICsyNDI4LDEzIEBACiAJcmV0dXJuIC1FTk9ERVY7CiAKIH0KLS8vRVhQT1JUX1NZTUJPTChydGxfcGNpX3Byb2JlKTsKKy8qIEVYUE9SVF9TWU1CT0wocnRsX3BjaV9wcm9iZSk7ICovCiAKIHN0cnVjdCBpZWVlODAyMTFfaHcgKnJ0bF9wY2lfZ2V0X2h3X3BvaW50ZXIodm9pZCkKIHsKIAlyZXR1cm4gaHdfZXhwb3J0OwogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9wY2lfZ2V0X2h3X3BvaW50ZXIpOworLyogRVhQT1JUX1NZTUJPTChydGxfcGNpX2dldF9od19wb2ludGVyKTsgKi8KIAogdm9pZCBydGxfcGNpX2Rpc2Nvbm5lY3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CkBAIC0yNDUwLDcgKzI0NTAsNyBAQAogCiAJLyogYWRkIGZvciBwcm92ICovCiAJcnRsX3Byb2NfcmVtb3ZlX29uZShodyk7Ci0JCisKIAogCS8qaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgd2lsbCBjYWxsIG9wc19zdG9wICovCiAJaWYgKHJ0bG1hYy0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9PSAxKSB7CkBAIC0yNDkxLDcgKzI0OTEsNyBAQAogCiAJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOwogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9wY2lfZGlzY29ubmVjdCk7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9wY2lfZGlzY29ubmVjdCk7ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGtlcm5lbCBwY2kgcG93ZXIgc3RhdGUgZGVmaW5lOgpAQCAtMjUxOSw3ICsyNTE5LDcgQEAKIAogCXJldHVybiAwOwogfQotLy9FWFBPUlRfU1lNQk9MKHJ0bF9wY2lfc3VzcGVuZCk7CisvKiBFWFBPUlRfU1lNQk9MKHJ0bF9wY2lfc3VzcGVuZCk7ICovCiAKIGludCBydGxfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0yNTI5LDEwICsyNTI5LDEwIEBACiAKIAlydGxwcml2LT5jZmctPm9wcy0+aHdfcmVzdW1lKGh3KTsKIAlydGxfaW5pdF9yZmtpbGwoaHcpOwotCQorCiAJcmV0dXJuIDA7CiB9Ci0vL0VYUE9SVF9TWU1CT0wocnRsX3BjaV9yZXN1bWUpOworLyogRVhQT1JUX1NZTUJPTChydGxfcGNpX3Jlc3VtZSk7ICovCiAKIHN0cnVjdCBydGxfaW50Zl9vcHMgcnRsX3BjaV9vcHMgPSB7CiAJLnJlYWRfZWZ1c2VfYnl0ZSA9IHJlYWRfZWZ1c2VfYnl0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BjaS5oCmluZGV4IDlmMjA2NTUuLjA2ZWFhNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wY2kuaApAQCAtMTQ4LDExICsxNDgsMTEgQEAKICAgKiBSWCB3aWZpIGluZm8gPT0gUlggZGVzY3JpcHRvciBpbiBvbGQgZmxvdyAqLwogc3RydWN0IHJ0bF90eF9idWZmZXJfZGVzYyB7CiAjaWYgKFJUTDgxOTJFRV9TRUdfTlVNID09IDIpCi0JdTMyIGR3b3JkWzIqKERNQV9JU182NEJJVCArIDEpKjhdOyAvL3NlZyA9IDgKKwl1MzIgZHdvcmRbMiooRE1BX0lTXzY0QklUICsgMSkqOF07IC8qIHNlZyA9IDggKi8KICNlbGlmIChSVEw4MTkyRUVfU0VHX05VTSA9PSAxKQotCXUzMiBkd29yZFsyKihETUFfSVNfNjRCSVQgKyAxKSo0XTsgLy9zZWcgPSA0CisJdTMyIGR3b3JkWzIqKERNQV9JU182NEJJVCArIDEpKjRdOyAvKiBzZWcgPSA0ICovCiAjZWxpZiAoUlRMODE5MkVFX1NFR19OVU0gPT0gMCkKLQl1MzIgZHdvcmRbMiooRE1BX0lTXzY0QklUICsgMSkqMl07IC8vc2VnID0gMgorCXUzMiBkd29yZFsyKihETUFfSVNfNjRCSVQgKyAxKSoyXTsgLyogc2VnID0gMiAqLwogI2VuZGlmCiB9IF9fcGFja2VkOwogCkBAIC0xODcsNyArMTg3LDcgQEAKIH07CiAKIHN0cnVjdCBydGw4MTkyX3J4X3JpbmcgewotCXN0cnVjdCBydGxfcnhfZGVzYyAqZGVzYzsvKmZvciBvbGQgdHJ4IGZsb3csIG5vdCB1ZXNkIGluIG5ldyB0cngqLworCXN0cnVjdCBydGxfcnhfZGVzYyAqZGVzYzsvKmZvciBvbGQgdHJ4IGZsb3csIG5vdCB1c2VkIGluIG5ldyB0cngqLwogCS8qZG1hIG1hdGNoZXMgZWl0aGVyICdkZXNjJyBvciAnYnVmZmVyX2Rlc2MnKi8KIAlkbWFfYWRkcl90IGRtYTsKIAl1bnNpZ25lZCBpbnQgaWR4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9wcy5jCmluZGV4IGYxMmZmYTguLjc4NzY0NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3BzLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkgKkRvIG5vdCBlbnRlciBJUFMgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCQkgKigxKSBSRiBpcyBhbHJlYWR5IE9GRiBvciBTbGVlcAogCQkgKigyKSBiX3N3cmZfcHJvY2Vzc2luZyAoaW5kaWNhdGVzIHRoZSBJUFMgaXMgc3RpbGwgdW5kZXIgZ29pbmcpCi0JCSAqKDMpIENvbm5lY3R0ZWQgKG9ubHkgZGlzY29ubmVjdGVkIGNhbiB0cmlnZ2VyIElQUykKKwkJICooMykgQ29ubmVjdGVkIChvbmx5IGRpc2Nvbm5lY3RlZCBjYW4gdHJpZ2dlciBJUFMpCiAJCSAqKDQpIElCU1MgKHNlbmQgQmVhY29uKQogCQkgKig1KSBBUCBtb2RlIChzZW5kIEJlYWNvbikKIAkJICooNikgbW9uaXRvciBtb2RlIChyY3YgcGFja2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9yZWdkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuYwppbmRleCBkODlmMTVjLi4wYTRiMzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJfQogCiAJLyoKLQkgKklmIGEgY291bnRyeSBJRSBoYXMgYmVlbiByZWNpZXZlZCBjaGVjayBpdHMgcnVsZSBmb3IgdGhpcworCSAqSWYgYSBjb3VudHJ5IElFIGhhcyBiZWVuIHJlY2VpdmVkIGNoZWNrIGl0cyBydWxlIGZvciB0aGlzCiAJICpjaGFubmVsIGZpcnN0IGJlZm9yZSBlbmFibGluZyBhY3RpdmUgc2Nhbi4gVGhlIHBhc3NpdmUgc2NhbgogCSAqd291bGQgaGF2ZSBiZWVuIGVuZm9yY2VkIGJ5IHRoZSBpbml0aWFsIHByb2Nlc3Npbmcgb2Ygb3VyCiAJICpjdXN0b20gcmVndWxhdG9yeSBkb21haW4uCkBAIC00NTUsNyArNDU1LDcgQEAKIAogCWlmIChydGxwcml2LT5yZWdkLmNvdW50cnlfY29kZSA+PSBDT1VOVFJZX0NPREVfTUFYKSB7CiAJCVJUX1RSQUNFKENPTVBfUkVHRCwgREJHX0RNRVNHLAotCQkJIChLRVJOX0RFQlVHICJydGw6IEVFUFJPTSBpbmRpY2F0ZXMgaW52YWxpZCBjb250cnkgY29kZSIKKwkJCSAoS0VSTl9ERUJVRyAicnRsOiBFRVBST00gaW5kaWNhdGVzIGludmFsaWQgY291bnRyeSBjb2RlIgogCQkJICAid29ybGQgd2lkZSAxMyBzaG91bGQgYmUgdXNlZFxuIikpOwogCiAJCXJ0bHByaXYtPnJlZ2QuY291bnRyeV9jb2RlID0gQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3JlZ2QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5oCmluZGV4IGFiYzYwYWIuLmRjZWIzZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcmVnZC5oCkBAIC0zMCw4ICszMCw4IEBACiAjaWZuZGVmIF9fUlRMX1JFR0RfSF9fCiAjZGVmaW5lIF9fUlRMX1JFR0RfSF9fCiAKLSNkZWZpbmUgSUVFRTgwMjExX0NIQU5fTk9fSUJTUwkJMTw8MgotI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4JMTw8MQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9OT19JQlNTCQkoMSA8PCAyKQorI2RlZmluZSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4JKDEgPDwgMSkKICNkZWZpbmUgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWQlCSVQoMCkKICNkZWZpbmUgV0lQSFlfRkxBR19TVFJJQ1RfUkVHVUxBVE9SWQlCSVQoMSkKICNkZWZpbmUgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUwlCSVQoMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9kbS5jCmluZGV4IDg2MzQyMDYuLmUwZWZjZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZG0uYwpAQCAtNzMxLDcgKzczMSw3IEBACiAJCXJ0bF9kbV9kaWctPm1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSA9CiAJCSAgICBydGxwcml2LT5kbS5lbnRyeV9taW5fdW5kZWNvcmF0ZWRzbW9vdGhlZF9wd2RiOwogCQlSVF9UUkFDRShDT01QX0JCX1BPV0VSU0FWSU5HLCBEQkdfTE9VRCwKLQkJCSAoIkFQIEV4dCBQb3J0IG9yIGRpc2Nvbm5ldCBQV0RCID0gMHgleCBcbiIsCisJCQkgKCJBUCBFeHQgUG9ydCBvciBkaXNjb25uZWN0IFBXREIgPSAweCV4IFxuIiwKIAkJCSAgcnRsX2RtX2RpZy0+bWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtKSk7CiAJfQogCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgKCJNaW5VbmRlY29yYXRlZFBXREJGb3JETSA9JWRcbiIsCkBAIC05MjUsNyArOTI1LDcgQEAKIAogCWlmIChydGxwcml2LT5mYWxzZWFsbV9jbnQuY250X2FsbCA+IDEwMDAwKSB7CiAJCVJUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwKLQkJCSgicnRsODgyMWFlX2RtX2RpZygpOiBBYm5vcm5hbGx5IGZhbHNlIGFsYXJtIGNhc2UuIFxuIikpOworCQkJKCJydGw4ODIxYWVfZG1fZGlnKCk6IEFibm9ybWFsbHkgZmFsc2UgYWxhcm0gY2FzZS4gXG4iKSk7CiAKIAkJaWYgKGRtX2RpZ3RhYmxlLmxhcmdlX2ZhX2hpdCAhPSAzKQogCQkgICAgICAgIGRtX2RpZ3RhYmxlLmxhcmdlX2ZhX2hpdCsrOwpAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKIAllbHNlCiAJCWZhbHNlYWxtX2NudC0+Y250X2FsbCA9IGZhbHNlYWxtX2NudC0+Y250X29mZG1fZmFpbDsKIAotCS8qcmVzZXQgT0ZETSBGQSBjb3V0bmVyKi8KKwkvKnJlc2V0IE9GRE0gRkEgY291bnRlciovCiAJcnRsX3NldF9iYnJlZyhodywgT0RNX1JFR19PRkRNX0ZBX1JTVF8xMUFDLCBCSVQoMTcpLCAxKTsKIAlydGxfc2V0X2JicmVnKGh3LCBPRE1fUkVHX09GRE1fRkFfUlNUXzExQUMsIEJJVCgxNyksIDApOwogCS8qIHJlc2V0IENDSyBGQSBjb3VudGVyKi8KQEAgLTEzMTYsNyArMTMxNiw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbjoJb2RtX1R4UHdyVHJhY2tTZXRQd3I4OEUoKQogICoKLSAqIE92ZXJ2aWV3Ogk4OEUgY2hhbmdlIGFsbCBjaGFubmVsIHR4IHBvd2VyIGFjY29yZGlnbiB0byBmbGFnLgorICogT3ZlcnZpZXc6CTg4RSBjaGFuZ2UgYWxsIGNoYW5uZWwgdHggcG93ZXIgYWNjb3JkaW5nIHRvIGZsYWcuCiAgKgkJCQlPRkRNICYgQ0NLIGFyZSBhbGwgZGlmZmVyZW50LgogICoKICAqIElucHV0OgkJTk9ORQpAQCAtMTUzNyw3ICsxNTM3LDcgQEAKIAkJCQkJcnRsZG0tPm1vZGlmeV90eGFnY19mbGFnX3BhdGhfYiA9IGZhbHNlOwogCiAJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAotCQkJCQkJKCIqKioqKipQYXRoX0IgcERNX09kbS0+TW9kaWZ5X1R4QUdDX0ZsYWcgPSBGQUxTRSBcbiIpKTsKKwkJCQkJCSgiKioqKioqUGF0aF9CIGRtX09kbS0+TW9kaWZ5X1R4QUdDX0ZsYWcgPSBGQUxTRSBcbiIpKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTE2NTQsNyArMTY1NCw3IEBACiAKIAlpZiAoZGVsdGEgPiAwICYmIHJ0bGRtLT50eHBvd2VyX3RyYWNrX2NvbnRyb2wpCiAJewotCQkvKiJkZWx0YSIgaGVyZSBpcyB1c2VkIHRvIHJlY29yZCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgZGlmZmVycmVuY2UuKi8KKwkJLyoiZGVsdGEiIGhlcmUgaXMgdXNlZCB0byByZWNvcmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGRpZmZlcmVuY2UuKi8KIAkgICAgCWRlbHRhID0gdGhlcm1hbF92YWx1ZSA+IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyID8gXAogCQkgICAgCSh0aGVybWFsX3ZhbHVlIC0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpIDogXAogCQkgICAgCShydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciAtIHRoZXJtYWxfdmFsdWUpOwpAQCAtMTk3Niw3ICsxOTc2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9uOglvZG1fVHhQd3JUcmFja1NldFB3cjg4RSgpCiAgKgotICogT3ZlcnZpZXc6CTg4RSBjaGFuZ2UgYWxsIGNoYW5uZWwgdHggcG93ZXIgYWNjb3JkaWduIHRvIGZsYWcuCisgKiBPdmVydmlldzoJODhFIGNoYW5nZSBhbGwgY2hhbm5lbCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gZmxhZy4KICAqCQkJCU9GRE0gJiBDQ0sgYXJlIGFsbCBkaWZmZXJlbnQuCiAgKgogICogSW5wdXQ6CQlOT05FCkBAIC0yMTU5LDcgKzIxNTksNyBAQAogCXU4ICpkZWx0YV9zd2luZ190YWJsZV9pZHhfdHVwX2I7CiAJdTggKmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90ZG93bl9iOwogCi0JLyoyLiBJbml0aWxpemF0aW9uICggNyBzdGVwcyBpbiB0b3RhbCApKi8KKwkvKjIuIEluaXRpYWxpemF0aW9uICggNyBzdGVwcyBpbiB0b3RhbCApKi8KIAlydGw4ODIxYWVfZ2V0X2RlbHRhX3N3aW5nX3RhYmxlKGh3LCAodTgqKikmZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9hLAogCQkJCQkJCQkJKHU4KiopJmRlbHRhX3N3aW5nX3RhYmxlX2lkeF90ZG93bl9hLAogCQkJCQkJCQkJICAodTgqKikmZGVsdGFfc3dpbmdfdGFibGVfaWR4X3R1cF9iLApAQCAtMjI0NCw3ICsyMjQ0LDcgQEAKIAogCWlmIChkZWx0YSA+IDAgJiYgcnRsZG0tPnR4cG93ZXJfdHJhY2tfY29udHJvbCkKIAl7Ci0JCS8qImRlbHRhIiBoZXJlIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBkaWZmZXJyZW5jZS4qLworCQkvKiJkZWx0YSIgaGVyZSBpcyB1c2VkIHRvIHJlY29yZCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgZGlmZmVyZW5jZS4qLwogCSAgICAJZGVsdGEgPSB0aGVybWFsX3ZhbHVlID4gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPyBcCiAJCSAgICAJKHRoZXJtYWxfdmFsdWUgLSBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikgOiBcCiAJCSAgICAJKHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyIC0gdGhlcm1hbF92YWx1ZSk7CkBAIC0yNjEzLDExICsyNjEzLDExIEBACiAJUlRfVFJBQ0UoQ09NUF9UVVJCTywgREJHX0xPVUQsCiAJCSgicnRsODgyMWFlX2RtX2NoZWNrX2VkY2FfdHVyYm89PT09PT4iKSk7CiAJUlRfVFJBQ0UoQ09NUF9UVVJCTywgREJHX0xPVUQsCi0JCSgiT3JnaW5pYWwgQkUgUEFSQU06IDB4JXhcbiIsCisJCSgiT3JpZ2luYWwgQkUgUEFSQU06IDB4JXhcbiIsCiAJCXJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIERNX1JFR19FRENBX0JFXzExTikpKTsKIAogCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCWxpc3QgcGFyYW10ZXIgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybQorCWxpc3QgcGFyYW1ldGVyIGZvciBkaWZmZXJlbnQgcGxhdGZvcm0KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAliX2xhc3RfaXNfY3VyX3JkbF9zdGF0ZSA9IHJ0bHByaXYtPmRtLmJpc19jdXJfcmRsc3RhdGU7CiAJcGJfaXNfY3VyX3JkbF9zdGF0ZSA9ICYoIHJ0bHByaXYtPmRtLmJpc19jdXJfcmRsc3RhdGUpOwpAQCAtMjk2Myw3ICsyOTYzLDcgQEAKIAkJCSJDcnlzdGFsIGNhcCA9IDB4JXgsIENyeXN0YWwgY2FwIG9mZnNldCA9ICVkXG4iLAogCQkJcnRsZG0tPmNyeXN0YWxfY2FwLCBhZGp1c3RfeHRhbCkpOwogCi0JCS8qMy5BZGp1ZHQgQ3J5c3RhbCBDYXAuKi8KKwkJLyozLkFkanVzdCBDcnlzdGFsIENhcC4qLwogCQlpZiAoYWRqdXN0X3h0YWwgIT0gMCl7CiAJCQlydGxkbS0+aXNfZnJlZXplID0gMDsKIAkJCXJ0bGRtLT5jcnlzdGFsX2NhcCArPSBhZGp1c3RfeHRhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2Z3LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9mdy5jCmluZGV4IDQwODNjYWIuLjQ2ZWI0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2Z3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvZncuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIAlpZiAoY291bnRlciA+PSBGV184ODIxQUVfUE9MTElOR19USU1FT1VUX0NPVU5UKSB7CiAJCVJUX1RSQUNFKENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAoImNoa3N1bSByZXBvcnQgZmFpbGwgISBSRUdfTUNVRldETDoweCUwOHggLlxuIiwKKwkJCSAoImNoa3N1bSByZXBvcnQgZmFpbCAhIFJFR19NQ1VGV0RMOjB4JTA4eCAuXG4iLAogCQkJICB2YWx1ZTMyKSk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0zNjgsNyArMzY4LDcgQEAKIAkJCQl3YWl0X2gyY19saW1taXQtLTsKIAkJCQlpZiAod2FpdF9oMmNfbGltbWl0ID09IDApIHsKIAkJCQkJUlRfVFJBQ0UoQ09NUF9DTUQsIERCR19MT1VELAotCQkJCQkJICgiV2F0aW5nIHRvbyBsb25nIGZvciBGVyByZWFkICIKKwkJCQkJCSAoIldhaXRpbmcgdG9vIGxvbmcgZm9yIEZXIHJlYWQgIgogCQkJCQkJICAiY2xlYXIgSE1FQm94KCVkKSFcbiIsIGJveG51bSkpOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJCQlpc2Z3X3JlYWQgPSBfcnRsODgyMWFlX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoaHcsIGJveG51bSk7CiAJCQkJdTFiX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgMHgxMzApOwogCQkJCVJUX1RSQUNFKENPTVBfQ01ELCBEQkdfTE9VRCwKLQkJCQkJICgiV2F0aW5nIGZvciBGVyByZWFkIGNsZWFyIEhNRUJveCglZCkhISEgIgorCQkJCQkgKCJXYWl0aW5nIGZvciBGVyByZWFkIGNsZWFyIEhNRUJveCglZCkhISEgIgogCQkJCQkgICIweDEzMCA9ICUyeFxuIiwgYm94bnVtLCB1MWJfdG1wKSk7CiAJCQl9CiAJCX0KQEAgLTExNzksNyArMTE3OSw3IEBACiAJCQkgKCJTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3IEZBSUwhISEhISEuXG4iKSk7CiB9CiAKLS8qU2hvdWQgY2hlY2sgRlcgc3VwcG9ydCBwMnAgb3Igbm90LiovCisvKlNob3VsZCBjaGVjayBGVyBzdXBwb3J0IHAycCBvciBub3QuKi8KIHZvaWQgcnRsODgyMWFlX3NldF9wMnBfY3R3X3BlcmlvZF9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGN0d2luZG93KQogewogCXU4IHUxX2N0d2luZG93X3BlcmlvZFsxXSA9eyBjdHdpbmRvd307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRfY29leGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0X2NvZXhpc3QuaAppbmRleCA3OTljYzZmLi5iMzY1ZjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRfY29leGlzdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idF9jb2V4aXN0LmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogbG9uZyBydGw4ODIxYWVfZG1fYnRfZ2V0X3J4X3NzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHZvaWQgcnRsODgyMWFlX2RtX2J0X2JhbGFuY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQlib29sIGJfYmFsYW5jZV9vbiwgdTggbXMwLCB1OCBtczEpOwotdm9pZCBydGw4ODIxYWVfZG1fYnRfYWdjX3RhYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eWVwKTsKK3ZvaWQgcnRsODgyMWFlX2RtX2J0X2FnY190YWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHlwZSk7CiB2b2lkIHJ0bDg4MjFhZV9kbV9idF9iYl9iYWNrX29mZl9sZXZlbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggdHlwZSk7CiB1OCBydGw4ODIxYWVfZG1fYnRfY2hlY2tfY29leF9yc3NpX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCQkJdTgJbGV2ZWxfbnVtLCB1OAlyc3NpX3RocmVzaCwgdTggcnNzaV90aHJlc2gxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2hhbF9idGMuYwppbmRleCA3OTM4NmVlLi43YjFkMTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9oYWxfYnRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaGFsX2J0Yy5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkJJiYocnRscGNpcHJpdi0+YnRjb2V4aXN0LnByZXZpb3VzX3N0YXRlX2gKIAkJPT0gcnRscGNpcHJpdi0+YnRjb2V4aXN0LmN1cnJlbnRfc3RhdGVfaCkpIHsKIAkJUlRfVFJBQ0UoQ09NUF9CVF9DT0VYSVNULCBEQkdfRE1FU0csCi0JCQkJKCJbRE1dW0JUXSwgQ29leGlzdCBzdGF0ZSBkbyBub3QgY2hhbmchIVxuIikpOworCQkJCSgiW0RNXVtCVF0sIENvZXhpc3Qgc3RhdGUgZG8gbm90IGNoYW5nZSEhXG4iKSk7CiAJCXJldHVybiB0cnVlOwogCX0gZWxzZSB7CiAJCVJUX1RSQUNFKENPTVBfQlRfQ09FWElTVCwgREJHX0RNRVNHLApAQCAtOTAyLDcgKzkwMiw3IEBACiAKIAkvKgogCSAqIE5vdGU6Ci0JICogV2Ugc2hvdWxkIGFkZCBkZWxheSBmb3IgbWFraW5nIHN1cmUgc3cgRGFjU3dpbmcgY2FuIGJlIHNldCBzdWNlc3NmdWxseS4KKwkgKiBXZSBzaG91bGQgYWRkIGRlbGF5IGZvciBtYWtpbmcgc3VyZSBzdyBEYWNTd2luZyBjYW4gYmUgc2V0IHN1Y2Nlc3NmdWxseS4KIAkgKiBiZWNhdXNlIG9mIHRoYXQgcnRsODgyMWFlX2RtX2J0X3NldF9md18yX2FudF9oaWQoKSBhbmQgcnRsODgyMWFlX2RtX2J0X3NldF9md190ZG1hX2N0cmwoKQogCSAqIHdpbGwgb3ZlcndyaXRlIHRoZSByZWcgMHg4ODAuCiAJKi8KQEAgLTIwMjUsNyArMjAyNSw3IEBACiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4MUFGLCAweDAwKTsKIAkJcmV0dXJuOwogCX0KLQlwdG1wX2J1ZiA9ICh1OCAqKSBrbWFsbG9jKGMyaF9ldmVudC5jbWRfbGVuLCBHRlBfS0VSTkVMKTsKKwlwdG1wX2J1ZiA9IGttYWxsb2MoYzJoX2V2ZW50LmNtZF9sZW4sIEdGUF9LRVJORUwpOwogCWlmKHB0bXBfYnVmID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoQ09NUF9GVywgREJHX1RSQUNFLCAoIm1hbGxvYyBjbWQgYnVmIGZhaWxlZFxuIikpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9ody5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvaHcuYwppbmRleCA1ZWQ3YTExLi4xYjg1ODNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL2h3LmMKQEAgLTE0Nyw2ICsxNDcsNyBAQAogCQl9IGVsc2UgewogCQkJcnRsaGFsLT5iZndfY2xrX2NoYW5nZV9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCQkJc3Bpbl91bmxvY2tfYmgoJnJ0bHByaXYtPmxvY2tzLmZ3X3BzX2xvY2spOworCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTEwMTYsNyArMTAxNyw3IEBACiAJLyogQVJGQiB0YWJsZSAxMiBmb3IgMTFhYyAyNEcgMVNTICovCiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19BUkZSMywgMHgwMDAwMDAxNSk7CiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19BUkZSMyArIDQsIDB4ZmZjZmYwMDApOwotCS8qIDB4NDIwWzddID0gMCAsIGVuYWJsZSByZXRyeSBBTVBEVSBpbiBuZXcgQU1QRCBub3Qgc2luZ2FsIE1QRFUuICovCisJLyogMHg0MjBbN10gPSAwICwgZW5hYmxlIHJldHJ5IEFNUERVIGluIG5ldyBBTVBEIG5vdCBzaWduYWwgTVBEVS4gKi8KIAlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfRldIV19UWFFfQ1RSTCwgMHgxRjAwKTsKIAlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQU1QRFVfTUFYX1RJTUUsIDB4NzApOwogCkBAIC0xNDA2LDcgKzE0MDcsNyBAQAogCXJ0bDg4MjFhZV9waHlfbWFjX2NvbmZpZyhodyk7CiAJLyogYmVjYXVzZSBsYXN0IGZ1bmN0aW9uIG1vZGlmeSBSQ1IsIHNvIHdlIHVwZGF0ZQogCSAqIHJjciB2YXIgaGVyZSwgb3IgVFAgd2lsbCB1bnN0YWJsZSBmb3IgcmVjZWl2ZV9jb25maWcKLQkgKiBpcyB3cm9uZywgUlggUkNSX0FDUkMzMiB3aWxsIGNhdXNlIFRQIHVuc3RhYmVsICYgUngKKwkgKiBpcyB3cm9uZywgUlggUkNSX0FDUkMzMiB3aWxsIGNhdXNlIFRQIHVuc3RhYmxlICYgUngKIAkgKiBSQ1JfQVBQX0lDViB3aWxsIGNhdXNlIG1hYzgwMjExIHVuYXNzb2MgZm9yIGNpc2NvIDEyNTIKIAlydGxwY2ktPnJlY2VpdmVfY29uZmlnID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX1JDUik7CiAJcnRscGNpLT5yZWNlaXZlX2NvbmZpZyAmPSB+KFJDUl9BQ1JDMzIgfCBSQ1JfQUlDVik7CkBAIC0xNTYyLDcgKzE1NjMsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAotCQkJCSgiQ2hpcCBWZXJzaW9uIElEOiBVbmtub3cgKDB4JVgpLlxuIiwgdmVyc2lvbikpOworCQkJCSgiQ2hpcCBWZXJzaW9uIElEOiBVbmtub3duICgweCVYKS5cbiIsIHZlcnNpb24pKTsKIAkJCWJyZWFrOwogCX0KIApAQCAtMTYyMiw3ICsxNjIzLDcgQEAKIAogCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChNU1IpLCBidF9tc3IpOwogCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKLQlpZiAoKGJ0X21zciAmIDB4ZmMpID09IE1TUl9BUCkKKwlpZiAoKGJ0X21zciAmIH4weGZjKSA9PSBNU1JfQVApCiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHgwMCk7CiAJZWxzZQogCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQkNOVENGRyArIDEsIDB4NjYpOwpAQCAtMjM3MSw3ICsyMzcyLDcgQEAKIAlpZiAocnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbiA9PSAweGZmKQogCQlydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID0gMHg3RjsKIAotCS8qIHNldCBjaGFubmVsIHBhbG4gdG8gd29ybGQgd2lkZSAxMyAqLworCS8qIHNldCBjaGFubmVsIHBsYW4gdG8gd29ybGQgd2lkZSAxMyAqLwogCS8vcnRsZWZ1c2UtPmNoYW5uZWxfcGxhbiA9ICh1OCkgcnRsZWZ1c2UtPmVlcHJvbV9jaGFubmVscGxhbjsKIAogCS8qcGFyc2UgeHRhbCovCkBAIC0yNTM0LDcgKzI1MzUsNyBAQAogCWlmIChydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID09IDB4ZmYpCiAJCXJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW4gPSAweDdGOwogCi0JLyogc2V0IGNoYW5uZWwgcGFsbiB0byB3b3JsZCB3aWRlIDEzICovCisJLyogc2V0IGNoYW5uZWwgcGxhbiB0byB3b3JsZCB3aWRlIDEzICovCiAJLy9ydGxlZnVzZS0+Y2hhbm5lbF9wbGFuID0gKHU4KSBydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuOwogCiAJLypwYXJzZSB4dGFsKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmMKaW5kZXggZDAyZmNhMy4uMWRkMzMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcGh5LmMKQEAgLTg2LDcgKzg2LDcgQEAKIAkJCS8qIDB4OEFDWzExOjEwXSA9IDInYjEwKi8KIAogCi0JCS8qIDwyMDEyMDkxNCwgS29yZGFuPiBBIHdvcmthcm91bGQgdG8gcmVzb2x2ZQorCQkvKiA8MjAxMjA5MTQsIEtvcmRhbj4gQSB3b3JrYXJvdW5kIHRvIHJlc29sdmUKIAkJMjQ4ME1oeiBzcHVyIGJ5IHNldHRpbmcgQURDIGNsb2NrIGFzIDE2ME0uIChBc2tlZCBieSBCaW5zb24pKi8KIAkJaWYgKGJhbmRfd2lkdGggPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCAmJgogCQkJKGNoYW5uZWwgPT0gMTMgfHwgY2hhbm5lbCA9PSAxNCkpIHsKQEAgLTEwNyw3ICsxMDcsNyBAQAogCX0KIAllbHNlIGlmIChydGxoYWwtPmh3X3R5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4ODEyQUUpCiAJewotCQkvKiA8MjAxMjA5MTQsIEtvcmRhbj4gQSB3b3JrYXJvdWxkIHRvIHJlc29sdmUKKwkJLyogPDIwMTIwOTE0LCBLb3JkYW4+IEEgd29ya2Fyb3VuZCB0byByZXNvbHZlCiAJCTI0ODBNaHogc3B1ciBieSBzZXR0aW5nIEFEQyBjbG9jayBhcyAxNjBNLiAoQXNrZWQgYnkgQmluc29uKSovCiAJCWlmIChiYW5kX3dpZHRoID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgJiYKIAkJCShjaGFubmVsID09IDEzIHx8IGNoYW5uZWwgPT0gMTQpKQpAQCAtNDQxLDggKzQ0MSw4IEBACiAJc3RydWN0IHJ0bF9kbSAqcnRsZG0gPSBydGxfZG0ocnRscHJpdik7CiAJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKIAotCWNoYXIgYmJfc3dpbmdfMmcgPSAoY2hhcikgKC0xICogMHhGRik7Ci0JY2hhciBiYl9zd2luZ181ZyA9IChjaGFyKSAoLTEgKiAweEZGKTsKKwljaGFyIGJiX3N3aW5nXzJnID0gKGNoYXIpICgoLTEgKiAweEZGKSAmIDB4RkYpOworCWNoYXIgYmJfc3dpbmdfNWcgPSAoY2hhcikgKCgtMSAqIDB4RkYpICYgMHhGRik7CiAJdTMyICBvdXQgPSAweDIwMDsKIAljb25zdCBjaGFyIGF1dG9fdGVtcCA9IC0xOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5oCmluZGV4IGE5MzJkOGMuLmE4MGJmNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3BoeS5oCkBAIC0zMCw3ICszMCw3IEBACiAjaWZuZGVmIF9fUlRMODgyMUFFX1BIWV9IX18KICNkZWZpbmUgX19SVEw4ODIxQUVfUEhZX0hfXwogCi0vKkl0IG11c3QgYWx3YXlzIHNldCB0byA0LCBvdGhlcndpc2UgcmVhZCBlZnVzZSB0YWJsZSBzZWNxdWVuY2Ugd2lsbCBiZSB3cm9uZy4qLworLypJdCBtdXN0IGFsd2F5cyBzZXQgdG8gNCwgb3RoZXJ3aXNlIHJlYWQgZWZ1c2UgdGFibGUgc2VxdWVuY2Ugd2lsbCBiZSB3cm9uZy4qLwogI2RlZmluZSBNQVhfVFhfQ09VTlQJNAogI2RlZmluZQlUWF8xUwkJCTAKICNkZWZpbmUJVFhfMlMJCQkxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcS5oCmluZGV4IDhiMzljMDQuLjQ4MGE2YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3B3cnNlcS5oCkBAIC04MSw3ICs4MSw3IEBACiAJezB4MDA0NywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKiAweDQ3Wzc6MF0gPSAwMCBncGlvIG1vZGUgKi8JXAogCXsweDAwMDcsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMH0sLyogc3VzcGVuZCBvcHRpb24gYWxsIG9mZiAqLwlcCiAJezB4MDAxNCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDgwLCBCSVQ3fSwvKjB4MTRbN10gPSAxIHR1cm4gb24gWkNEICovCVwKLQl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIEJJVDB9LC8qIDB4MTVbMF0gPTEgdHJ1biBvbiBaQ0QgKi8JXAorCXsweDAwMTUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgQklUMH0sLyogMHgxNVswXSA9MSB0dXJuIG9uIFpDRCAqLwlcCiAJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDEwLCBCSVQ0fSwvKjB4MjNbNF0gPSAxIGhwb24gTERPIHNsZWVwIG1vZGUgKi8JXAogCXsweDAwMDgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMiwgMH0sLyoweDhbMV0gPSAwIEFOQSBjbGsgPTUwMGsgKi8JXAogCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgQklUMywgQklUM30sIC8qMHgwNFsxMV0gPSAyYicxMSBlbmFibGUgV0wgc3VzcGVuZCBmb3IgUENJZSovCkBAIC05MSw3ICs5MSw3IEBACiAJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovCQkJCQkJCQlcCiAJezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQzLCAwfSwgLyoweDA0WzExXSA9IDJiJzAxZW5hYmxlIFdMIHN1c3BlbmQqLyAgIFwKIAl7MHgwMDIzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MTAsIDB9LC8qMHgyM1s0XSA9IDAgaHBvbiBMRE8gc2xlZXAgbW9kZSBsZWF2ZSAqLwlcCi0JezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCAwfSwvKiAweDE1WzBdID0wIHRydW4gb2ZmIFpDRCAqLwlcCisJezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCAwfSwvKiAweDE1WzBdID0wIHR1cm4gb2ZmIFpDRCAqLwlcCiAJezB4MDAxNCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDgwLCAwfSwvKjB4MTRbN10gPSAwIHR1cm4gb2ZmIFpDRCAqLwlcCiAJezB4MDA0NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAwfSwvKiBncGlvMH43IGlucHV0IG1vZGUgKi8JXAogCXsweDAwNDMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwMH0sLyogZ3BpbzExIGlucHV0IG1vZGUsIGdwaW8xMH44IGlucHV0IG1vZGUgKi8KQEAgLTExMCw3ICsxMTAsNyBAQAogCXsweDAwNDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHhmZn0sLyogZ3BpbzB+NyBvdXRwdXQgbW9kZSAqLwlcCiAJezB4MDA0NywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKiAweDQ3Wzc6MF0gPSAwMCBncGlvIG1vZGUgKi8JXAogCXsweDAwMTQsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHg4MCwgQklUN30sLyoweDE0WzddID0gMSB0dXJuIG9uIFpDRCAqLwlcCi0JezB4MDAxNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDAxLCBCSVQwfSwvKiAweDE1WzBdID0xIHRydW4gb24gWkNEICovCVwKKwl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIEJJVDB9LC8qIDB4MTVbMF0gPTEgdHVybiBvbiBaQ0QgKi8JXAogCXsweDAwMTIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMSwgMH0sLyoweDEyWzBdID0gMCBmb3JjZSBQRk0gbW9kZSAqLwlcCiAJezB4MDAyMywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweDEwLCBCSVQ0fSwvKjB4MjNbNF0gPSAxIGhwb24gTERPIHNsZWVwIG1vZGUgKi8JXAogCXsweDAwMDgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHgwMiwgMH0sLyoweDhbMV0gPSAwIEFOQSBjbGsgPTUwMGsgKi8JXApAQCAtMTI0LDcgKzEyNCw3IEBACiAJLyogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgLy8gY29tbWVudHMgaGVyZSovICAgICAgICAgICAgICAgICAgICAgICBcCiAJezB4MDAxMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCBCSVQwLCBCSVQwfSwvKjB4MTJbMF0gPSAxIGZvcmNlIFBXTSBtb2RlICovCVwKIAl7MHgwMDE0LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4ODAsIDB9LC8qMHgxNFs3XSA9IDAgdHVybiBvZmYgWkNEICovCVwKLQl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIDB9LC8qIDB4MTVbMF0gPTAgdHJ1biBvZmYgWkNEICovCVwKKwl7MHgwMDE1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MDEsIDB9LC8qIDB4MTVbMF0gPTAgdHVybiBvZmYgWkNEICovCVwKIAl7MHgwMDIzLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSyxQV1JfQkFTRUFERFJfTUFDLFBXUl9DTURfV1JJVEUsIDB4MTAsIDB9LC8qMHgyM1s0XSA9IDAgaHBvbiBMRE8gbGVhdmUgc2xlZXAgbW9kZSAqLwlcCiAJezB4MDA0NiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssUFdSX0JBU0VBRERSX01BQyxQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAwfSwvKiBncGlvMH43IGlucHV0IG1vZGUgKi8JXAogCXsweDAwNDMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLFBXUl9CQVNFQUREUl9NQUMsUFdSX0NNRF9XUklURSwgMHhGRiwgMHgwMH0sLyogZ3BpbzExIGlucHV0IG1vZGUsIGdwaW8xMH44IGlucHV0IG1vZGUgKi8gXApAQCAtMjA0LDcgKzIwNCw3IEBACiAJNDogTFBTLS1Mb3cgUG93ZXIgU3RhdGUKIAk1OiBTVVMtLVN1c3BlbmQKIAotCVRoZSB0cmFuc2lzaW9uIGZyb20gZGlmZmVyZW50IHN0YXRlcyBhcmUgZGVmaW5lZCBiZWxvdworCVRoZSB0cmFuc2l0aW9uIGZyb20gZGlmZmVyZW50IHN0YXRlcyBhcmUgZGVmaW5lZCBiZWxvdwogCVRSQU5TX0NBUkRFTVVfVE9fQUNUCiAJVFJBTlNfQUNUX1RPX0NBUkRFTVUKIAlUUkFOU19DQVJERU1VX1RPX1NVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcHdyc2VxY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXFjbWQuYwppbmRleCA3MTBiYzAxLi5mZjE4ODcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXFjbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9wd3JzZXFjbWQuYwpAQCAtODIsNyArODIsNyBAQAogCQkJCQl2YWx1ZSA9IHZhbHVlIHwgKEdFVF9QV1JfQ0ZHX1ZBTFVFKHB3cl9jZmdfY21kKQogCQkJCQkJCSYgR0VUX1BXUl9DRkdfTUFTSyhwd3JfY2ZnX2NtZCkpOwogCi0JCQkJCS8qV3JpdGUgdGhlIHZhbHVlIGJhY2sgdG8gc3l0ZW0gcmVnaXN0ZXIqLworCQkJCQkvKldyaXRlIHRoZSB2YWx1ZSBiYWNrIHRvIHN5c3RlbSByZWdpc3RlciovCiAJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG9mZnNldCwgdmFsdWUpOwogCQkJCX0KIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcmVnLmgKaW5kZXggMDljNWYwMC4uYmVmZmI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcmVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvcmVnLmgKQEAgLTU5NiwxMyArNTk2LDEzIEBACiAjZGVmaW5lCUlNUl9CQ05ETUFJTlQzCQkJQklUKDIzKQkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMwkJKi8KICNkZWZpbmUJSU1SX0JDTkRNQUlOVDIJCQlCSVQoMjIpCQkvKiBCZWFjb24gRE1BIEludGVycnVwdCAyCQkqLwogI2RlZmluZQlJTVJfQkNORE1BSU5UMQkJCUJJVCgyMSkJCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDEJCSovCi0jZGVmaW5lCUlNUl9CQ05ET0s3CQkJCUJJVCgyMCkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNyAqLwotI2RlZmluZQlJTVJfQkNORE9LNgkJCQlCSVQoMTkpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDYgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzUJCQkJQklUKDE4KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA1ICovCi0jZGVmaW5lCUlNUl9CQ05ET0s0CQkJCUJJVCgxNykJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNCAqLwotI2RlZmluZQlJTVJfQkNORE9LMwkJCQlCSVQoMTYpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDMgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzIJCQkJQklUKDE1KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAyICovCi0jZGVmaW5lCUlNUl9CQ05ET0sxCQkJCUJJVCgxNCkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMSAqLworI2RlZmluZQlJTVJfQkNORE9LNwkJCQlCSVQoMjApCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA3ICovCisjZGVmaW5lCUlNUl9CQ05ET0s2CQkJCUJJVCgxOSkJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDYgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzUJCQkJQklUKDE4KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNSAqLworI2RlZmluZQlJTVJfQkNORE9LNAkJCQlCSVQoMTcpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA0ICovCisjZGVmaW5lCUlNUl9CQ05ET0szCQkJCUJJVCgxNikJCS8qIEJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDMgKi8KKyNkZWZpbmUJSU1SX0JDTkRPSzIJCQkJQklUKDE1KQkJLyogQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgMiAqLworI2RlZmluZQlJTVJfQkNORE9LMQkJCQlCSVQoMTQpCQkvKiBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCAxICovCiAjZGVmaW5lCUlNUl9BVElNRU5EX0UJCUJJVCgxMykJCS8qIEFUSU0gV2luZG93IEVuZCBFeHRlbnNpb24gZm9yIFdpbjcgKi8KICNkZWZpbmUJSU1SX1RYRVJSCQkJCUJJVCgxMSkJCS8qIFR4IEVycm9yIEZsYWcgSW50ZXJydXB0IFN0YXR1cywgd3JpdGUgMSBjbGVhci4gKi8KICNkZWZpbmUJSU1SX1JYRVJSCQkJCUJJVCgxMCkJCS8qIFJ4IEVycm9yIEZsYWcgSU5UIFN0YXR1cywgV3JpdGUgMSBjbGVhciAqLwpAQCAtNjEzLDcgKzYxMyw3IEBACiAjZGVmaW5lCUhXU0VUX01BWF9TSVpFCQkJCTUxMgogI2RlZmluZSAgIEVGVVNFX01BWF9TRUNUSU9OCQkJNjQKICNkZWZpbmUgICBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOCQkJMjU2Ci0jZGVmaW5lIAlFRlVTRV9PT0JfUFJPVEVDVF9CWVRFUyAgICAJMTggCS8qIFBHIGRhdGEgZXhjbHVkZSBoZWFkZXIsIGR1bW15IDcgYnl0ZXMgZnJvbWUgQ1AgdGVzdCBhbmQgcmVzZXJ2ZWQgMWJ5dGUuKi8KKyNkZWZpbmUgCUVGVVNFX09PQl9QUk9URUNUX0JZVEVTICAgIAkxOCAJLyogUEcgZGF0YSBleGNsdWRlIGhlYWRlciwgZHVtbXkgNyBieXRlcyBmcm9tIENQIHRlc3QgYW5kIHJlc2VydmVkIDFieXRlLiovCiAKIAogI2RlZmluZQlFRVBST01fREVGQVVMVF9UU1NJCQkJCQkweDAKQEAgLTE1MTEsNyArMTUxMSw3IEBACiAjZGVmaW5lCVJPRkRNMF9UWENPRUZGNQkJCQkweGNiNAogI2RlZmluZQlST0ZETTBfVFhDT0VGRjYJCQkJMHhjYjgKIAotLypQYXRoX0EgUkZFIGNvdHJvbCAqLworLypQYXRoX0EgUkZFIGNvbnRyb2wgKi8KICNkZWZpbmUJUkFfUkZFX0NUUkxfODgxMgkJCQkweGNiOAogLypQYXRoX0IgUkZFIGNvbnRyb2wqLwogI2RlZmluZQlSQl9SRkVfQ1RSTF84ODEyCQkJCTB4ZWI4CkBAIC0yMzM2LDE5ICsyMzM2LDE5IEBACiAjZGVmaW5lCQlXT0xfUkVBU09OX0RFQVVUSAkJCUJJVCgzKQogI2RlZmluZQkJV09MX1JFQVNPTl9GV19ESVNDT05ORUNUCUJJVCg0KQogCi0jZGVmaW5lCQlSQV9SRkVfUElOTVVYCTB4Y2IwICAvKiBQYXRoX0EgUkZFIGNvdHJvbCBwaW5tdXgqLworI2RlZmluZQkJUkFfUkZFX1BJTk1VWAkweGNiMCAgLyogUGF0aF9BIFJGRSBjb250cm9sIHBpbm11eCovCiAjZGVmaW5lCQlSQl9SRkVfUElOTVVYCTB4ZWIwIC8qIFBhdGhfQiBSRkUgY29udHJvbCBwaW5tdXgqLwogCiAjZGVmaW5lCQlSQV9SRkVfSU5WIDB4Y2I0CiAjZGVmaW5lCQlSQl9SRkVfSU5WIDB4ZWI0CiAKIC8qIFJYSVFDICovCi0jZGVmaW5lCQlSQV9SWElRQ19BQiAgICAJMHhjMTAgIC8qUnhJUSBpbWJsYW5jZSBtYXRyaXggY29lZmYuIEEgJiBCKi8KLSNkZWZpbmUJCVJBX1JYSVFDX0NEICAgIAkweGMxNCAgLypSeElRIGltYmxhbmNlIG1hdHJpeCBjb2VmZi4gQyAmIEQqLworI2RlZmluZQkJUkFfUlhJUUNfQUIgICAgCTB4YzEwICAvKlJ4SVEgaW1iYWxhbmNlIG1hdHJpeCBjb2VmZi4gQSAmIEIqLworI2RlZmluZQkJUkFfUlhJUUNfQ0QgICAgCTB4YzE0ICAvKlJ4SVEgaW1iYWxhbmNlIG1hdHJpeCBjb2VmZi4gQyAmIEQqLwogI2RlZmluZQkgCVJBX1RYU0NBTEUgCQkweGMxYyAgLyogUGFoX0EgVFggc2NhbGluZyBmYWN0b3IqLwogI2RlZmluZQkJUkJfVFhTQ0FMRSAJCTB4ZTFjICAvKiBQYXRoX0IgVFggc2NhbGluZyBmYWN0b3IqLwotI2RlZmluZQkJUkJfUlhJUUNfQUIgICAgCTB4ZTEwICAvKlJ4SVEgaW1ibGFuY2UgbWF0cml4IGNvZWZmLiBBICYgQiovCi0jZGVmaW5lCQlSQl9SWElRQ19DRCAgICAJMHhlMTQgIC8qUnhJUSBpbWJsYW5jZSBtYXRyaXggY29lZmYuIEMgJiBEKi8KKyNkZWZpbmUJCVJCX1JYSVFDX0FCICAgIAkweGUxMCAgLypSeElRIGltYmFsYW5jZSBtYXRyaXggY29lZmYuIEEgJiBCKi8KKyNkZWZpbmUJCVJCX1JYSVFDX0NEICAgIAkweGUxNCAgLypSeElRIGltYmFsYW5jZSBtYXRyaXggY29lZmYuIEMgJiBEKi8KICNkZWZpbmUJCVJYSVFDX0FDCQkweDAyZmYgIC8qYml0IG1hc2sgZm9yIElRQyBtYXRyaXggZWxlbWVudCBBICYgQyovCiAjZGVmaW5lCQlSWElRQ19CRAkJMHgwMmZmMDAwMCAvKmJpdCBtYXNrIGZvciBJUUMgbWF0cml4IGVsZW1lbnQgQSAmIEMqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9zdy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvc3cuYwppbmRleCA4NWEzNDc0Li5hOGQxNzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODgyMWFlL3J0bDg4MjFhZS9zdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3N3LmMKQEAgLTU3LDkgKzU3LDkgQEAKIAkgKiAwIC0gRGlzYWJsZSBBU1BNLAogCSAqIDEgLSBFbmFibGUgQVNQTSB3aXRob3V0IENsb2NrIFJlcSwKIAkgKiAyIC0gRW5hYmxlIEFTUE0gd2l0aCBDbG9jayBSZXEsCi0JICogMyAtIEFsd3lhcyBFbmFibGUgQVNQTSB3aXRoIENsb2NrIFJlcSwKKwkgKiAzIC0gQWx3YXlzIEVuYWJsZSBBU1BNIHdpdGggQ2xvY2sgUmVxLAogCSAqIDQgLSBBbHdheXMgRW5hYmxlIEFTUE0gd2l0aG91dCBDbG9jayBSZXEuCi0JICogc2V0IGRlZnVsdCB0byBSVEw4MTkyQ0U6MyBSVEw4MTkyRToyCisJICogc2V0IGRlZmF1bHQgdG8gUlRMODE5MkNFOjMgUlRMODE5MkU6MgogCSAqICovCiAJcnRscGNpLT5jb25zdF9wY2lfYXNwbSA9IDM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvcnRsODgyMWFlL3RyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdHJ4LmMKaW5kZXggNzVhZTQzOC4uZGQwZjZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdHJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS9ydGw4ODIxYWUvdHJ4LmMKQEAgLTM3LDggKzM3LDggQEAKICNpbmNsdWRlICJ0cnguaCIKICNpbmNsdWRlICJsZWQuaCIKICNpbmNsdWRlICJkbS5oIgotI2luY2x1ZGUgInBoeS5oIgotdTggX3J0bDg4MjFhZV9tYXBfaHdxdWV1ZV90b19md3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHU4IGh3X3F1ZXVlKQorCitzdGF0aWMgdTggX3J0bDg4MjFhZV9tYXBfaHdxdWV1ZV90b19md3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHU4IGh3X3F1ZXVlKQogewogCXUxNiBmYyA9IHJ0bF9nZXRfZmMoc2tiKTsKIApAQCAtMjQ0LDcgKzI0NCw3IEBACiAJCWNja19hZ2NfcnB0ID0gY2NrX2J1Zi0+Y2NrX2FnY19ycHQ7CiAKIAkJLyogKDEpSGFyZHdhcmUgZG9lcyBub3QgcHJvdmlkZSBSU1NJIGZvciBDQ0sgKi8KLQkJLyogKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieQorCQkvKiAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FsY3VsYXRlZCBieQogCQkgKiBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpICovCiAJCWlmIChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPTikKIAkJCWNja19oaWdocHdyID0gKHU4KSBydGxfZ2V0X2JicmVnKGh3LCBSRlBHQTBfWEFfSFNTSVBBUkFNRVRFUjIsCkBAIC0zNjMsNyArMzYzLDcgQEAKIAkJCQlwc3RhdHVzLT5yeF9taW1vX3NpZ25hbHN0cmVuZ3RoW2ldID0gKHU4KSByc3NpOwogCQl9CiAKLQkJLyogKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieQorCQkvKiAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FsY3VsYXRlZCBieQogCQkgKiBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpICovCiAJCXJ4X3B3cl9hbGwgPSAoKHBfZHJ2aW5mby0+cHdkYl9hbGwgPj4gMSkgJiAweDdmKSAtIDExMDsKIApAQCAtNjAzLDcgKzYwMyw3IEBACiAKIAkvKiBodyB3aWxsIHNldCBzdGF0dXMtPmRlY3J5cHRlZCB0cnVlLCBpZiBpdCBmaW5kcyB0aGUKIAkgKiBmcmFtZSBpcyBvcGVuIGRhdGEgZnJhbWUgb3IgbWdtdCBmcmFtZS4gKi8KLQkvKiBTbyBodyB3aWxsIG5vdCBkZWNyeXB0aW9uIHJvYnVzdCBtYW5hZ21lbnQgZnJhbWUKKwkvKiBTbyBodyB3aWxsIG5vdCBkZWNyeXB0aW9uIHJvYnVzdCBtYW5hZ2VtZW50IGZyYW1lCiAJICogZm9yIElFRUU4MDIxMXcgYnV0IHN0aWxsIHNldCBzdGF0dXMtPmRlY3J5cHRlZAogCSAqIHRydWUsIHNvIGhlcmUgd2Ugc2hvdWxkIHNldCBpdCBiYWNrIHRvIHVuZGVjcnlwdGVkCiAJICogZm9yIElFRUU4MDIxMXcgZnJhbWUsIGFuZCBtYWM4MDIxMSBzdyB3aWxsIGhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4ODIxYWUvd2lmaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS93aWZpLmgKaW5kZXggNzZiZWY5My4uMTdhOWQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS93aWZpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg4MjFhZS93aWZpLmgKQEAgLTQwLDEwICs0MCwxMCBAQAogCiAKICNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lOSVQJCTAKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyAJCUJJVCgyOCkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTIAkJQklUKDI5KQotI2RlZmluZSBSRl9DSEFOR0VfQllfSFcgCQlCSVQoMzApCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9TVyAJCUJJVCgzMSkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUwkJQklUKDI4KQorI2RlZmluZSBSRl9DSEFOR0VfQllfUFMJCQlCSVQoMjkpCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9IVwkJCUJJVCgzMCkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXCQkJQklUKDMxKQogCiAjZGVmaW5lIElRS19BRERBX1JFR19OVU0JCTE2CiAjZGVmaW5lIElRS19NQUNfUkVHX05VTQkJCTQKQEAgLTY5LDM1ICs2OSwzNSBAQAogI2RlZmluZSBRQlNTX0xPQURfU0laRQkJCTUKICNkZWZpbmUgTUFYX1dNTUVMRV9MRU5HVEgJCTY0CiAKLSNkZWZpbmUgVE9UQUxfQ0FNX0VOVFJZIAkJMzIKKyNkZWZpbmUgVE9UQUxfQ0FNX0VOVFJZCQkJMzIKIAogLypzbG90IHRpbWUgZm9yIDExZy4gKi8KICNkZWZpbmUgUlRMX1NMT1RfVElNRV85CQkJOQogI2RlZmluZSBSVExfU0xPVF9USU1FXzIwCQkyMAogCiAvKnJlbGF0ZWQgd2l0aCB0Y3AvaXAuICovCi0vKmlmX2VodGhlci5oKi8KLSNkZWZpbmUgRVRIX1BfUEFFIAkJCTB4ODg4RQkvKlBvcnQgQWNjZXNzIEVudGl0eQorLyppZl9ldGhlci5oKi8KKyNkZWZpbmUgRVRIX1BfUEFFCQkJMHg4ODhFCS8qUG9ydCBBY2Nlc3MgRW50aXR5CiAJCQkJCQkgKihJRUVFIDgwMi4xWCkgKi8KLSNkZWZpbmUgRVRIX1BfSVAgICAgICAgIAkJMHgwODAwCS8qSW50ZXJuZXQgUHJvdG9jb2wgcGFja2V0ICovCi0jZGVmaW5lIEVUSF9QX0FSUCAgICAgICAJCTB4MDgwNgkvKkFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQgKi8KLSNkZWZpbmUgU05BUF9TSVpFIAkJCTYKKyNkZWZpbmUgRVRIX1BfSVAJCQkweDA4MDAJLypJbnRlcm5ldCBQcm90b2NvbCBwYWNrZXQgKi8KKyNkZWZpbmUgRVRIX1BfQVJQCQkJMHgwODA2CS8qQWRkcmVzcyBSZXNvbHV0aW9uIHBhY2tldCAqLworI2RlZmluZSBTTkFQX1NJWkUJCQk2CiAjZGVmaW5lIFBST1RPQ19UWVBFX1NJWkUJCTIKIAogLypyZWxhdGVkIHdpdGggODAyLjExIGZyYW1lKi8KLSNkZWZpbmUgTUFDODAyMTFfM0FERFJfTEVOIAkJMjQKLSNkZWZpbmUgTUFDODAyMTFfNEFERFJfTEVOIAkJMzAKKyNkZWZpbmUgTUFDODAyMTFfM0FERFJfTEVOCQkyNAorI2RlZmluZSBNQUM4MDIxMV80QUREUl9MRU4JCTMwCiAKICNkZWZpbmUgQ0hBTk5FTF9NQVhfTlVNQkVSCQkoMTQgKyAyNCArIDIxKQkvKiAxNCBpcyB0aGUgbWF4CiAJCQkJCQkJICogY2hhbm5lbCBudW1iZXIgKi8KICNkZWZpbmUgQ0hBTk5FTF9NQVhfTlVNQkVSXzJHCQkxNAotI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVJfNUcJICAgIAk1NCAvKiBQbGVhc2UgcmVmZXIgdG8KKyNkZWZpbmUgQ0hBTk5FTF9NQVhfTlVNQkVSXzVHCQk1NCAvKiBQbGVhc2UgcmVmZXIgdG8KIAkJCQkJICAgICoicGh5X0dldENobmxHcm91cDg4MTJBIiBhbmQKIAkJCQkJICAgICogIkhhbF9SZWFkVHhQb3dlckluZm84ODEyQSIqLwogI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVJfNUdfODBNCTcKICNkZWZpbmUgQ0hBTk5FTF9HUk9VUF9NQVgJCSgzICsgOSkJLyogY2gxfjMsIGNoNH45LCBjaDEwfjE0CiAJCQkJCQkgKiB0b3RhbCB0aHJlZSBncm91cHMgKi8KLSNkZWZpbmUgTUFYX1BHX0dST1VQIAkJCTEzCisjZGVmaW5lIE1BWF9QR19HUk9VUAkJCTEzCiAjZGVmaW5lCUNIQU5ORUxfR1JPVVBfTUFYXzJHCQkzCiAjZGVmaW5lCUNIQU5ORUxfR1JPVVBfSURYXzVHTAkJMwogI2RlZmluZQlDSEFOTkVMX0dST1VQX0lEWF81R00JCTYKQEAgLTExMiwxNCArMTEyLDE0IEBACiAjZGVmaW5lIE1BWF9OVU1fUkFURVMJCQkyNjQKIAogLypmb3IgODhFIHVzZSovCi0vKkl0IG11c3QgYWx3YXlzIHNldCB0byA0LCBvdGhlcndpc2UgcmVhZCBlZnVzZSB0YWJsZSBzZWNxdWVuY2Ugd2lsbCBiZSB3cm9uZy4qLworLypJdCBtdXN0IGFsd2F5cyBzZXQgdG8gNCwgb3RoZXJ3aXNlIHJlYWQgZWZ1c2UgdGFibGUgc2VxdWVuY2Ugd2lsbCBiZSB3cm9uZy4qLwogI2RlZmluZSBNQVhfVFhfQ09VTlQJCQk0CiAjZGVmaW5lCU1BWF9SRl9QQVRICQkJNAogI2RlZmluZQlNQVhfQ0hOTF9HUk9VUF8yNEcJCTYKICNkZWZpbmUJTUFYX0NITkxfR1JPVVBfNUcJCTE0CiAKIC8qIEJLLCBCRSwgVkksIFZPLCBIQ0NBLCBNQU5BR0VNRU5ULCBDT01NQU5ELCBISUdILCBCRUFDT04uICovCi0jZGVmaW5lIE1BWF9UWF9RVUVVRSAJCQk5CisjZGVmaW5lIE1BWF9UWF9RVUVVRQkJCTkKIAogI2RlZmluZSBUWF9QV1JfQllfUkFURV9OVU1fQkFORAkJMgogI2RlZmluZSBUWF9QV1JfQllfUkFURV9OVU1fUkYJCTQKQEAgLTEyNywxMSArMTI3LDExIEBACiAjZGVmaW5lIE1BWF9CQVNFX05VTV9JTl9QSFlfUkVHX1BHXzI0RyAgNgogI2RlZmluZSBNQVhfQkFTRV9OVU1fSU5fUEhZX1JFR19QR181Rwk1CiAKLSNkZWZpbmUgREVMVEFfU1dJTkdJRFhfU0laRQkzMAotI2RlZmluZSBCQU5EX05VTSAJCQkJMworI2RlZmluZSBERUxUQV9TV0lOR0lEWF9TSVpFCQkzMAorI2RlZmluZSBCQU5EX05VTQkJCTMKIC8qTm93LCBpdCdzIGp1c3QgZm9yIDgxOTJlZQogICpub3QgT0sgeWV0LCBrZWVwIGl0IDAqLwotI2RlZmluZSBETUFfSVNfNjRCSVQgMAorI2RlZmluZSBETUFfSVNfNjRCSVQJCQkwCiAjZGVmaW5lIFJUTDgxOTJFRV9TRUdfTlVNCQkxIC8qIDA6MiBzZWcsIDE6IDQgc2VnLCAyOiA4IHNlZyAqLwogCiBzdHJ1Y3QgdHhwb3dlcl9pbmZvXzJnIHsKQEAgLTIxOSw3ICsyMTksNyBAQAogfTsKIAogZW51bSBzY2FuX29wZXJhdGlvbl9iYWNrdXBfb3B0IHsKLQlTQ0FOX09QVF9CQUNLVVBfQkFORDA9MCwKKwlTQ0FOX09QVF9CQUNLVVBfQkFORDAgPSAwLAogCVNDQU5fT1BUX0JBQ0tVUF9CQU5EMSwKIAlTQ0FOX09QVF9SRVNUT1JFLAogCVNDQU5fT1BUX01BWApAQCAtNDM1LDcgKzQzNSw3IEBACiAJSFRfQ0hBTk5FTF9XSURUSF84MCA9IDIsCiB9OwogCi0vKiBSZWY6IDgwMi4xMWkgc2VwYyBEMTAuMCA3LjMuMi4yNS4xCisvKiBSZWY6IDgwMi4xMWkgc3BlYyBEMTAuMCA3LjMuMi4yNS4xCiBDaXBoZXIgU3VpdGVzIEVuY3J5cHRpb24gQWxnb3JpdGhtcyAqLwogZW51bSBydF9lbmNfYWxnIHsKIAlOT19FTkNSWVBUSU9OID0gMCwKQEAgLTQ5OSwxNCArNDk5LDE0IEBACiAJUlRMX0lNUl9CQ05ETUFJTlQzLAkvKkJlYWNvbiBETUEgSW50ZXJydXB0IDMgKi8KIAlSVExfSU1SX0JDTkRNQUlOVDIsCS8qQmVhY29uIERNQSBJbnRlcnJ1cHQgMiAqLwogCVJUTF9JTVJfQkNORE1BSU5UMSwJLypCZWFjb24gRE1BIEludGVycnVwdCAxICovCi0JUlRMX0lNUl9CQ05ET0s4LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgOCAqLwotCVJUTF9JTVJfQkNORE9LNywJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDcgKi8KLQlSVExfSU1SX0JDTkRPSzYsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCA2ICovCi0JUlRMX0lNUl9CQ05ET0s1LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgNSAqLwotCVJUTF9JTVJfQkNORE9LNCwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDQgKi8KLQlSVExfSU1SX0JDTkRPSzMsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cCAzICovCi0JUlRMX0lNUl9CQ05ET0syLAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXAgMiAqLwotCVJUTF9JTVJfQkNORE9LMSwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwIDEgKi8KKwlSVExfSU1SX0JDTkRPSzgsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgOCAqLworCVJUTF9JTVJfQkNORE9LNywJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA3ICovCisJUlRMX0lNUl9CQ05ET0s2LAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDYgKi8KKwlSVExfSU1SX0JDTkRPSzUsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgNSAqLworCVJUTF9JTVJfQkNORE9LNCwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCA0ICovCisJUlRMX0lNUl9CQ05ET0szLAkvKkJlYWNvbiBRdWV1ZSBETUEgT0sgSW50ZXJydXB0IDMgKi8KKwlSVExfSU1SX0JDTkRPSzIsCS8qQmVhY29uIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgMiAqLworCVJUTF9JTVJfQkNORE9LMSwJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCAxICovCiAJUlRMX0lNUl9USU1FT1VUMiwJLypUaW1lb3V0IGludGVycnVwdCAyICovCiAJUlRMX0lNUl9USU1FT1VUMSwJLypUaW1lb3V0IGludGVycnVwdCAxICovCiAJUlRMX0lNUl9UWEZPVlcsCQkvKlRyYW5zbWl0IEZJRk8gT3ZlcmZsb3cgKi8KQEAgLTUxNSwxMCArNTE1LDEwIEBACiAJUlRMX0lNUl9SWEZPVlcsCQkvKlJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLwogCVJUTF9JTVJfUkRVLAkJLypSZWNlaXZlIERlc2NyaXB0b3IgVW5hdmFpbGFibGUgKi8KIAlSVExfSU1SX0FUSU1FTkQsCS8qRm9yIDkyQyxBVElNIFdpbmRvdyBFbmQgSW50ZXJydXB0ICovCi0JUlRMX0lNUl9CRE9LLAkJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwICovCisJUlRMX0lNUl9CRE9LLAkJLypCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwdCAqLwogCVJUTF9JTVJfSElHSERPSywJLypIaWdoIFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQgKi8KIAlSVExfSU1SX0NPTURPSywJCS8qQ29tbWFuZCBRdWV1ZSBETUEgT0sgSW50ZXJydXB0Ki8KLQlSVExfSU1SX1RCRE9LLAkJLypUcmFuc21pdCBCZWFjb24gT0sgaW50ZXJydXAgKi8KKwlSVExfSU1SX1RCRE9LLAkJLypUcmFuc21pdCBCZWFjb24gT0sgaW50ZXJydXB0ICovCiAJUlRMX0lNUl9NR05URE9LLAkvKk1hbmFnZW1lbnQgUXVldWUgRE1BIE9LIEludGVycnVwdCAqLwogCVJUTF9JTVJfVEJERVIsCQkvKkZvciA5MkMsVHJhbnNtaXQgQmVhY29uIEVycm9yIEludGVycnVwdCAqLwogCVJUTF9JTVJfQktET0ssCQkvKkFDX0JLIERNQSBPSyBJbnRlcnJ1cHQgKi8KQEAgLTY0NSw5ICs2NDUsOSBAQAogfTsKIAogZW51bSByYXRyX3RhYmxlX21vZGUgewotCVJBVFJfSU5YX1dJUkVMRVNTX05HQiA9IDAsCQkvLyBCR04gNDAgTWh6IDJTUyAxU1MKLQlSQVRSX0lOWF9XSVJFTEVTU19ORyA9IDEsCQkvLyBHTiBvciBOCi0JUkFUUl9JTlhfV0lSRUxFU1NfTkIgPSAyLAkJLy8gQkdOIDIwIE1oeiAyU1MgMVNTICBvciBCTgorCVJBVFJfSU5YX1dJUkVMRVNTX05HQiA9IDAsCQkvKiBCR04gNDAgTWh6IDJTUyAxU1MgKi8KKwlSQVRSX0lOWF9XSVJFTEVTU19ORyA9IDEsCQkvKiBHTiBvciBOICovCisJUkFUUl9JTlhfV0lSRUxFU1NfTkIgPSAyLAkJLyogQkdOIDIwIE1oeiAyU1MgMVNTICBvciBCTiAqLwogCVJBVFJfSU5YX1dJUkVMRVNTX04gPSAzLAogCVJBVFJfSU5YX1dJUkVMRVNTX0dCID0gNCwKIAlSQVRSX0lOWF9XSVJFTEVTU19HID0gNSwKQEAgLTc1OSw3ICs3NTksNyBAQAogCXN0cnVjdCBydGxfaHRfYWdnIGFnZzsKIH07CiAKLXN0cnVjdCByc3NpX3N0YXsKK3N0cnVjdCByc3NpX3N0YSB7CiAJbG9uZyB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOwogfTsKIApAQCAtODk5LDcgKzg5OSw3IEBACiAJdTE2IHJlZ18yZ2h6X2N0bDsKIH07CiAKLXN0cnVjdCBkeW5hbWljX3ByaW1hcnlfY2Nheworc3RydWN0IGR5bmFtaWNfcHJpbWFyeV9jY2EgewogCXU4IHByaWNjYV9mbGFnOwogCXU4IGludGZfZmxhZzsKIAl1OCBpbnRmX3R5cGU7CkBAIC05MzksMTQgKzkzOSwxNCBAQAogCVAyUF9QU19FTkFCTEUgPSAxLAogCVAyUF9QU19TQ0FOID0gMiwKIAlQMlBfUFNfU0NBTl9ET05FID0gMywKLQlQMlBfUFNfQUxMU1RBU0xFRVAgPSA0LCAvLyBmb3IgUDJQIEdPCisJUDJQX1BTX0FMTFNUQVNMRUVQID0gNCwgLyogZm9yIFAyUCBHTyAqLwogfTsKIAogZW51bSBwMnBfcHNfbW9kZSB7CiAJUDJQX1BTX05PTkUgPSAwLAogCVAyUF9QU19DVFdJTkRPVyA9IDEsCiAJUDJQX1BTX05PQSA9IDIsCi0JUDJQX1BTX01JWCA9IDMsIC8vIENUV2luZG93IGFuZCBOb0EKKwlQMlBfUFNfTUlYID0gMywgLyogQ1RXaW5kb3cgYW5kIE5vQSAqLwogfTsKIAogc3RydWN0IHJ0bF9wMnBfcHNfaW5mbyB7CkBAIC05NjksNyArOTY5LDcgQEAKIAl1MzIgbm9hX3N0YXJ0X3RpbWVbUDJQX01BWF9OT0FfTlVNXTsKIH07CiAKLSBzdHJ1Y3QgcDJwX3BzX29mZmxvYWRfdCB7CitzdHJ1Y3QgcDJwX3BzX29mZmxvYWRfdCB7CiAJdTggT2ZmbG9hZF9FbjoxOwogCXU4IHJvbGU6MTsgLyogMTogT3duZXIsIDA6IENsaWVudCAqLwogCXU4IENUV2luZG93X0VuOjE7CkBAIC05ODEsNyArOTgxLDcgQEAKIH07CiAKICNkZWZpbmUgSVFLX01BVFJJWF9SRUdfTlVNCTgKLSNkZWZpbmUgSVFLX01BVFJJWF9TRVRUSU5HU19OVU0JICgxNCsyNCsyMSkgLy8gQ2hhbm5lbHNfMl80R19OVU0gKyBDaGFubmVsc181R18yME1fTlVNICsgQ2hhbm5lbHNfNUcKKyNkZWZpbmUgSVFLX01BVFJJWF9TRVRUSU5HU19OVU0JICgxNCsyNCsyMSkgLyogQ2hhbm5lbHNfMl80R19OVU0gKyBDaGFubmVsc181R18yME1fTlVNICsgQ2hhbm5lbHNfNUcgKi8KIHN0cnVjdCBpcWtfbWF0cml4X3JlZ3MgewogCWJvb2wgYl9pcWtfZG9uZTsKIAlsb25nIHZhbHVlWzFdW0lRS19NQVRSSVhfUkVHX05VTV07CkBAIC0xMDc0LDEyICsxMDc0LDEyIEBACiAJZW51bSBydF9wb2xhcml0eV9jdGwgcG9sYXJpdHlfY3RsOwogfTsKIAotI2RlZmluZSBSVExfQUdHX1NUT1AgCQkJCQkJMAorI2RlZmluZSBSVExfQUdHX1NUT1AJCQkJCQkwCiAjZGVmaW5lIFJUTF9BR0dfUFJPR1JFU1MJCQkJCTEKLSNkZWZpbmUgUlRMX0FHR19TVEFSVCAJCQkJCQkyCisjZGVmaW5lIFJUTF9BR0dfU1RBUlQJCQkJCQkyCiAjZGVmaW5lIFJUTF9BR0dfT1BFUkFUSU9OQUwJCQkJCTMKLSNkZWZpbmUgUlRMX1JYX0FHR19TVEFSVCAJCQkJCTEKLSNkZWZpbmUgUlRMX1JYX0FHR19TVE9QIAkJCQkJMAorI2RlZmluZSBSVExfUlhfQUdHX1NUQVJUCQkJCQkxCisjZGVmaW5lIFJUTF9SWF9BR0dfU1RPUAkJCQkJCTAKIAogc3RydWN0IHJ0bF9wcml2Owogc3RydWN0IHJ0bF9pbyB7CkBAIC0xMDkyLDEzICsxMDkyLDEzIEBACiAJLypQQ0kgSU8gbWFwICovCiAJdW5zaWduZWQgbG9uZyBwY2lfYmFzZV9hZGRyOwkvKmRldmljZSBJL08gYWRkcmVzcyAqLwogCi0Jdm9pZCAoKndyaXRlOF9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHUzMiBhZGRyLCB1OCB2YWwpOwotCXZvaWQgKCp3cml0ZTE2X2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpOwotCXZvaWQgKCp3cml0ZTMyX2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIsIHUzMiB2YWwpOworCXZvaWQgKCp3cml0ZThfYXN5bmMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHU4IHZhbCk7CisJdm9pZCAoKndyaXRlMTZfYXN5bmMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpOworCXZvaWQgKCp3cml0ZTMyX2FzeW5jKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1MzIgdmFsKTsKIAotCXU4KCpyZWFkOF9zeW5jKSAoc3RydWN0IHJ0bF9wcml2ICogcnRscHJpdiwgdTMyIGFkZHIpOwotCXUxNigqcmVhZDE2X3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKiBydGxwcml2LCB1MzIgYWRkcik7Ci0JdTMyKCpyZWFkMzJfc3luYykgKHN0cnVjdCBydGxfcHJpdiAqIHJ0bHByaXYsIHUzMiBhZGRyKTsKKwl1OCAoKnJlYWQ4X3N5bmMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIpOworCXUxNiAoKnJlYWQxNl9zeW5jKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKTsKKwl1MzIgKCpyZWFkMzJfc3luYykoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcik7CiAKIH07CiAKQEAgLTEyNTYsNyArMTI1Niw3IEBACiAJYm9vbCB1c2VfZGVmYXVsdGtleTsKIAkvKkVuY3J5cHRpb24gQWxnb3JpdGhtIGZvciBVbmljYXN0IFBhY2tldCAqLwogCWVudW0gcnRfZW5jX2FsZyBwYWlyd2lzZV9lbmNfYWxnb3JpdGhtOwotCS8qRW5jcnlwdGlvbiBBbGdvcml0aG0gZm9yIEJyb2Nhc3QvTXVsdGljYXN0ICovCisJLypFbmNyeXB0aW9uIEFsZ29yaXRobSBmb3IgQnJvYWRjYXN0L011bHRpY2FzdCAqLwogCWVudW0gcnRfZW5jX2FsZyBncm91cF9lbmNfYWxnb3JpdGhtOwogCS8qQ2FtIEVudHJ5IEJpdG1hcCAqLwogCXUzMiBod3NlY19jYW1fYml0bWFwOwpAQCAtMTMxNyw5ICsxMzE3LDkgQEAKIAogfTsKIAotI2RlZmluZSBBU1NPQ0lBVEVfRU5UUllfTlVNCTMyKzEKKyNkZWZpbmUgQVNTT0NJQVRFX0VOVFJZX05VTQkoMzIrMSkKIAotc3RydWN0IGZhc3RfYW50X3RyYWlubmluZ3sKK3N0cnVjdCBmYXN0X2FudF90cmFpbm5pbmcgewogCXU4IGJzc2lkWzZdOwogCXU4IGFudHNlbF9yeF9rZWVwXzA7CiAJdTggYW50c2VsX3J4X2tlZXBfMTsKQEAgLTE0MjcsMTkgKzE0MjcsMTkgQEAKIAljaGFyIGJiX3N3aW5nX2RpZmZfNWc7CiAKIAl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2thX25bREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2JfcFtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnY2NrYV9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdjY2tiX3BbREVMVEFfU1dJTkdJRFhfU0laRV07CiAJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2Nja2JfbltERUxUQV9TV0lOR0lEWF9TSVpFXTsKIAl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9wW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX25bREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfcFtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgIAl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfcFtCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9uW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX3BbQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOwotICAgIHU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfbltCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07Ci0gICAgdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfcF84MTg4ZVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKLSAgICB1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uXzgxODhlW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF8yNGdhX25bREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2JfcFtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYl9uW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2FfcFtCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzVnYV9uW0JBTkRfTlVNXVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfNWdiX3BbQkFORF9OVU1dW0RFTFRBX1NXSU5HSURYX1NJWkVdOworCXU4IGRlbHRhX3N3aW5nX3RhYmxlX2lkeF81Z2JfbltCQU5EX05VTV1bREVMVEFfU1dJTkdJRFhfU0laRV07CisJdTggZGVsdGFfc3dpbmdfdGFibGVfaWR4XzI0Z2FfcF84MTg4ZVtERUxUQV9TV0lOR0lEWF9TSVpFXTsKKwl1OCBkZWx0YV9zd2luZ190YWJsZV9pZHhfMjRnYV9uXzgxODhlW0RFTFRBX1NXSU5HSURYX1NJWkVdOwogCiAKIAkvKiBETVNQICovCkBAIC0xNDUxLDcgKzE0NTEsNyBAQAogCXN0cnVjdCBmYXN0X2FudF90cmFpbm5pbmcgZmF0X3RhYmxlOwogCiAJdTgJcmVzcF90eF9wYXRoOwotCXU4IAlwYXRoX3NlbDsKKwl1OAlwYXRoX3NlbDsKIAl1MzIJcGF0aGFfc3VtOwogCXUzMglwYXRoYl9zdW07CiAJdTMyCXBhdGhhX2NudDsKQEAgLTE2NzEsNyArMTY3MSw2IEBACiAJdTggcnhfbWltb19ldm1fZGJtWzRdOwogCXUxNiBjZm9fc2hvcnRbNF07IAkJLyogcGVyLXBhdGgncyBDZm9fc2hvcnQgKi8KIAl1MTYgY2ZvX3RhaWxbNF07Ci0KIAl1OCByeF9wd3JbNF07IC8qIHBlci1wYXRoJ3MgcHdkYiAqLwogCXU4IHJ4X3Nucls0XTsgLyogcGVyLXBhdGgncyBTTlIgKi8KIAl1OCBiYW5kd2lkdGg7CkBAIC0xNjkyLDcgKzE2OTEsNyBAQAogfTsKIAogc3RydWN0IHJ0X2xpbmtfZGV0ZWN0IHsKLQkvKiBjb3VudCBmb3IgcmFvbWluZyAqLworCS8qIGNvdW50IGZvciByb2FtaW5nICovCiAJdTMyIGJjbl9yeF9pbnBlcmlvZDsKIAl1MzIgcm9hbV90aW1lczsKIApAQCAtMTc1Niw0OCArMTc1NSw0OCBAQAogCXZvaWQgKnByb3hpbWl0eV9wcml2OwogCWludCAoKnByb3hpbV9yeCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfc3RhdHMgKnN0YXR1cywKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQl1OCAgKCpwcm94aW1fZ2V0X3Zhcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHR5cGUpOworCXU4ICgqcHJveGltX2dldF92YXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB0eXBlKTsKIH07CiAKIHN0cnVjdCBydGxfaGFsX29wcyB7Ci0JaW50ICgqaW5pdF9zd192YXJzKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqZGVpbml0X3N3X3ZhcnMpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpyZWFkX2VlcHJvbV9pbmZvKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqaW50ZXJydXB0X3JlY29nbml6ZWQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkJICAgICAgdTMyICogcF9pbnRhLCB1MzIgKiBwX2ludGIpOwotCWludCAoKmh3X2luaXQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpod19kaXNhYmxlKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqaHdfc3VzcGVuZCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmh3X3Jlc3VtZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmVuYWJsZV9pbnRlcnJ1cHQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpkaXNhYmxlX2ludGVycnVwdCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0JaW50ICgqc2V0X25ldHdvcmtfdHlwZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCQkgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKTsKKwlpbnQgKCppbml0X3N3X3ZhcnMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZGVpbml0X3N3X3ZhcnMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqcmVhZF9lZXByb21faW5mbykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCppbnRlcnJ1cHRfcmVjb2duaXplZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICB1MzIgKnBfaW50YSwgdTMyICpwX2ludGIpOworCWludCAoKmh3X2luaXQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqaHdfZGlzYWJsZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpod19zdXNwZW5kKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmh3X3Jlc3VtZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCplbmFibGVfaW50ZXJydXB0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmRpc2FibGVfaW50ZXJydXB0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJaW50ICgqc2V0X25ldHdvcmtfdHlwZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKTsKIAl2b2lkICgqc2V0X2Noa19ic3NpZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgICBib29sIGNoZWNrX2Jzc2lkKTsKLQl2b2lkICgqc2V0X2J3X21vZGUpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hfdHlwZSk7Ci0JIHU4KCpzd2l0Y2hfY2hhbm5lbCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKnNldF9xb3MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIGludCBhY2kpOwotCXZvaWQgKCpzZXRfYmNuX3JlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKnNldF9iY25faW50dikgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKnVwZGF0ZV9pbnRlcnJ1cHRfbWFzaykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCQkgICAgICAgdTMyIGFkZF9tc3IsIHUzMiBybV9tc3IpOwotCXZvaWQgKCpnZXRfaHdfcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCB2YXJpYWJsZSwgdTggKiB2YWwpOwotCXZvaWQgKCpzZXRfaHdfcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCB2YXJpYWJsZSwgdTggKiB2YWwpOwotCXZvaWQgKCp1cGRhdGVfcmF0ZV90YmwpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHJzc2lfbGV2ZWwpOwotCXZvaWQgKCpwcmVfZmlsbF90eF9iZF9kZXNjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICp0eF9iZF9kZXNjLAotCQkJCSAgICAgdTggKmRlc2MsIHU4IHF1ZXVlX2luZGV4LAotCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZG1hX2FkZHJfdCBhZGRyKTsKLQl1MTYgKCpyeF9kZXNjX2J1ZmZfcmVtYWluZWRfY250KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJCSAgdTggcXVldWVfaW5kZXgpOwotCXZvaWQgKCpyeF9jaGVja19kbWFfb2spIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKmhlYWRlcl9kZXNjLAotCQkJCSB1OCBxdWV1ZV9pbmRleCk7Ci0Jdm9pZCAoKmZpbGxfdHhfZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICogaGRyLAotCQkJICAgICAgdTggKiBwZGVzY190eCwgdTggKiBwYmRfZGVzYywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqIGluZm8sCisJdm9pZCAoKnNldF9id19tb2RlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoX3R5cGUpOworCXU4ICgqc3dpdGNoX2NoYW5uZWwpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqc2V0X3Fvcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBhY2kpOworCXZvaWQgKCpzZXRfYmNuX3JlZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpzZXRfYmNuX2ludHYpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqdXBkYXRlX2ludGVycnVwdF9tYXNrKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICB1MzIgYWRkX21zciwgdTMyIHJtX21zcik7CisJdm9pZCAoKmdldF9od19yZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB2YXJpYWJsZSwgdTggKnZhbCk7CisJdm9pZCAoKnNldF9od19yZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB2YXJpYWJsZSwgdTggKnZhbCk7CisJdm9pZCAoKnVwZGF0ZV9yYXRlX3RibCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggcnNzaV9sZXZlbCk7CisJdm9pZCAoKnByZV9maWxsX3R4X2JkX2Rlc2MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqdHhfYmRfZGVzYywKKwkJCQkgICAgdTggKmRlc2MsIHU4IHF1ZXVlX2luZGV4LAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBkbWFfYWRkcl90IGFkZHIpOworCXUxNiAoKnJ4X2Rlc2NfYnVmZl9yZW1haW5lZF9jbnQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgdTggcXVldWVfaW5kZXgpOworCXZvaWQgKCpyeF9jaGVja19kbWFfb2spKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqaGVhZGVyX2Rlc2MsCisJCQkJdTggcXVldWVfaW5kZXgpOworCXZvaWQgKCpmaWxsX3R4X2Rlc2MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICB1OCAqcGRlc2NfdHgsIHU4ICpwYmRfZGVzYywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMyw3LDApKQogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KQEAgLTE4MDUsNzQgKzE4MDQsNzcgQEAKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNlbmRpZgogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KLQkJCSAgICAgIHN0cnVjdCBza19idWZmICogc2tiLCB1OCBod19xdWV1ZSwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHU4IGh3X3F1ZXVlLAogCQkJICAgICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKTsKLQl2b2lkICgqZmlsbF90eF9jbWRkZXNjKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCAqIHBkZXNjLAotCQkJCSBib29sIGJfZmlyc3RzZWcsIGJvb2wgYl9sYXN0c2VnLAotCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYik7Ci0JIGJvb2woKnF1ZXJ5X3J4X2Rlc2MpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsCi0JCQkgICAgICAgc3RydWN0IHJ0bF9zdGF0cyAqIHN0YXR1cywKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqIHJ4X3N0YXR1cywKLQkJCSAgICAgICB1OCAqIHBkZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYik7Ci0Jdm9pZCAoKnNldF9jaGFubmVsX2FjY2VzcykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0JIGJvb2woKnJhZGlvX29ub2ZmX2NoZWNraW5nKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCAqIHZhbGlkKTsKLQl2b2lkICgqZG1fd2F0Y2hkb2cpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpzY2FuX29wZXJhdGlvbl9iYWNrdXApIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHU4IG9wZXJhdGlvbik7Ci0JIGJvb2woKnNldF9yZl9wb3dlcl9zdGF0ZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywKLQkJCQkgICAgZW51bSByZl9wd3JzdGF0ZSByZnB3cl9zdGF0ZSk7Ci0Jdm9pZCAoKmxlZF9jb250cm9sKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LAotCQkJICAgICBlbnVtIGxlZF9jdGxfbW9kZSBsZWRhY3Rpb24pOwotCXZvaWQgKCpzZXRfZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqIHBkZXNjLCBib29sIGlzdHgsCi0JCQkgIHU4IGRlc2NfbmFtZSwgdTggKiB2YWwpOwotCSB1MzIoKmdldF9kZXNjKSAodTggKiBwZGVzYywgYm9vbCBpc3R4LCB1OCBkZXNjX25hbWUpOwotCWJvb2wgKCppc190eF9kZXNjX2Nsb3NlZCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgIHU4IGh3X3F1ZXVlLCB1MTYgaW5kZXgpOwotCXZvaWQgKCp0eF9wb2xsaW5nKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1OCBod19xdWV1ZSk7Ci0Jdm9pZCAoKmVuYWJsZV9od19zZWMpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCXZvaWQgKCpzZXRfa2V5KSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1MzIga2V5X2luZGV4LAotCQkJIHU4ICogcF9tYWNhZGRyLCBib29sIGlzX2dyb3VwLCB1OCBlbmNfYWxnbywKLQkJCSBib29sIGlzX3dlcGtleSwgYm9vbCBjbGVhcl9hbGwpOwotCXZvaWQgKCppbml0X3N3X2xlZHMpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOwotCSB1MzIoKmdldF9iYnJlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodywgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKLQl2b2lkICgqc2V0X2JicmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssCi0JCQkgICB1MzIgZGF0YSk7Ci0JIHUzMigqZ2V0X3JmcmVnKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3LCBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLAotCQkJICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spOwotCXZvaWQgKCpzZXRfcmZyZWcpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIGVudW0gcmFkaW9fcGF0aCByZnBhdGgsCi0JCQkgICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKTsKKwl2b2lkICgqZmlsbF90eF9jbWRkZXNjKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnBkZXNjLAorCQkJCWJvb2wgYl9maXJzdHNlZywgYm9vbCBiX2xhc3RzZWcsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJYm9vbCAoKnF1ZXJ5X3J4X2Rlc2MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgc3RydWN0IHJ0bF9zdGF0cyAqc3RhdHVzLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cywKKwkJCSAgICAgIHU4ICpwZGVzYywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZCAoKnNldF9jaGFubmVsX2FjY2Vzcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCWJvb2wgKCpyYWRpb19vbm9mZl9jaGVja2luZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICp2YWxpZCk7CisJdm9pZCAoKmRtX3dhdGNoZG9nKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKnNjYW5fb3BlcmF0aW9uX2JhY2t1cCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG9wZXJhdGlvbik7CisJYm9vbCAoKnNldF9yZl9wb3dlcl9zdGF0ZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgZW51bSByZl9wd3JzdGF0ZSByZnB3cl9zdGF0ZSk7CisJdm9pZCAoKmxlZF9jb250cm9sKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICBlbnVtIGxlZF9jdGxfbW9kZSBsZWRhY3Rpb24pOworCXZvaWQgKCpzZXRfZGVzYykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpwZGVzYywgYm9vbCBpc3R4LAorCQkJIHU4IGRlc2NfbmFtZSwgdTggKnZhbCk7CisJdTMyICgqZ2V0X2Rlc2MpKHU4ICpwZGVzYywgYm9vbCBpc3R4LCB1OCBkZXNjX25hbWUpOworCWJvb2wgKCppc190eF9kZXNjX2Nsb3NlZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICB1OCBod19xdWV1ZSwgdTE2IGluZGV4KTsKKwl2b2lkICgqdHhfcG9sbGluZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGh3X3F1ZXVlKTsKKwl2b2lkICgqZW5hYmxlX2h3X3NlYykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpzZXRfa2V5KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGtleV9pbmRleCwKKwkJCXU4ICpwX21hY2FkZHIsIGJvb2wgaXNfZ3JvdXAsIHU4IGVuY19hbGdvLAorCQkJYm9vbCBpc193ZXBrZXksIGJvb2wgY2xlYXJfYWxsKTsKKwl2b2lkICgqaW5pdF9zd19sZWRzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdTMyICgqZ2V0X2JicmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKKwl2b2lkICgqc2V0X2JicmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLAorCQkJICB1MzIgZGF0YSk7CisJdTMyICgqZ2V0X3JmcmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSByYWRpb19wYXRoIHJmcGF0aCwKKwkJCSB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spOworCXZvaWQgKCpzZXRfcmZyZWcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLAorCQkJICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKTsKIAl2b2lkICgqYWxsb3dfYWxsX2Rlc3RhZGRyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJYm9vbCBhbGxvd19hbGxfZGEsIGJvb2wgd3JpdGVfaW50b19yZWcpOwotCXZvaWQgKCpsaW5rZWRfc2V0X3JlZykgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmNoZWNrX3N3aXRjaF90b19kbWRwKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqZHVhbG1hY19lYXN5X2NvbmN1cnJlbnQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci0Jdm9pZCAoKmR1YWxtYWNfc3dpdGNoX3RvX2RtZHApIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci0Jdm9pZCAoKmMyaF9jb21tYW5kX2hhbmRsZSkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLQl2b2lkICgqYnRfd2lmaV9tZWRpYV9zdGF0dXNfbm90aWZ5KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgbXN0YXRlKTsKLQl2b2lkICgqYnRfdHVybl9vZmZfYnRfY29leGlzdF9iZWZvcmVfZW50ZXJfbHBzKSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotCXZvaWQgKCpmaWxsX2gyY19jbWQpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggZWxlbWVudF9pZCwKLQkJCSAgICAgIHUzMiBjbWRfbGVuLCB1OCAqcF9jbWRidWZmZXIpOwotCWJvb2wgKCpnZXRfYnRjX3N0YXR1cykgKHZvaWQpOwotICAJdTMyICgqcnhfY29tbWFuZF9wYWNrZXRfaGFuZGxlcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfc3RhdHMgc3RhdHVzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwkJCQkgICBib29sIGFsbG93X2FsbF9kYSwgYm9vbCB3cml0ZV9pbnRvX3JlZyk7CisJdm9pZCAoKmxpbmtlZF9zZXRfcmVnKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmNoZWNrX3N3aXRjaF90b19kbWRwKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmR1YWxtYWNfZWFzeV9jb25jdXJyZW50KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmR1YWxtYWNfc3dpdGNoX3RvX2RtZHApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqYzJoX2NvbW1hbmRfaGFuZGxlKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisJdm9pZCAoKmJ0X3dpZmlfbWVkaWFfc3RhdHVzX25vdGlmeSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICBib29sIG1zdGF0ZSk7CisJdm9pZCAoKmJ0X3R1cm5fb2ZmX2J0X2NvZXhpc3RfYmVmb3JlX2VudGVyX2xwcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCpmaWxsX2gyY19jbWQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBlbGVtZW50X2lkLAorCQkJICAgICB1MzIgY21kX2xlbiwgdTggKnBfY21kYnVmZmVyKTsKKwlib29sICgqZ2V0X2J0Y19zdGF0dXMpKHZvaWQpOworCXUzMiAoKnJ4X2NvbW1hbmRfcGFja2V0X2hhbmRsZXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgc3RydWN0IHJ0bF9zdGF0cyBzdGF0dXMsCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIH07CiAKIHN0cnVjdCBydGxfaW50Zl9vcHMgewogCS8qY29tICovCiAJdm9pZCAoKnJlYWRfZWZ1c2VfYnl0ZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBfb2Zmc2V0LCB1OCAqcGJ1Zik7Ci0JaW50ICgqYWRhcHRlcl9zdGFydCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7Ci0Jdm9pZCAoKmFkYXB0ZXJfc3RvcCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKiBodyk7CisJaW50ICgqYWRhcHRlcl9zdGFydCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCXZvaWQgKCphZGFwdGVyX3N0b3ApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIAlib29sICgqY2hlY2tfYnVkZHlfcHJpdikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQlzdHJ1Y3QgcnRsX3ByaXYgKipidWRkeV9wcml2KTsKKwkJCQkgc3RydWN0IHJ0bF9wcml2ICoqYnVkZHlfcHJpdik7CiAKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMyw3LDApKQotCWludCAoKmFkYXB0ZXJfdHgpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcsIHN0cnVjdCBza19idWZmICogc2tiLAotCQkJICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKTsKKwlpbnQgKCphZGFwdGVyX3R4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKTsKICNlbHNlCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwotCWludCAoKmFkYXB0ZXJfdHgpIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKTsKKwlpbnQgKCphZGFwdGVyX3R4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKTsKIC8qPGRlbGV0ZSBpbiBrZXJuZWwgc3RhcnQ+Ki8KICNlbmRpZgogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KQEAgLTE4ODEsMjIgKzE4ODMsMjIgQEAKICNlbHNlCiAJdm9pZCAoKmZsdXNoKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBkcm9wKTsKICNlbmRpZgotCWludCAoKnJlc2V0X3RyeF9yaW5nKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKKwlpbnQgKCpyZXNldF90cnhfcmluZykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDcsMCkpCi0JYm9vbCAoKndhaXRxX2luc2VydCkgKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlib29sICgqd2FpdHFfaW5zZXJ0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAjZWxzZQogLyo8ZGVsZXRlIGluIGtlcm5lbCBlbmQ+Ki8KLQlib29sICgqd2FpdHFfaW5zZXJ0KSAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJYm9vbCAoKndhaXRxX2luc2VydCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogLyo8ZGVsZXRlIGluIGtlcm5lbCBzdGFydD4qLwogI2VuZGlmCiAvKjxkZWxldGUgaW4ga2VybmVsIGVuZD4qLwogCiAJLypwY2kgKi8KLQl2b2lkICgqZGlzYWJsZV9hc3BtKSAoc3RydWN0IGllZWU4MDIxMV9odyAqIGh3KTsKLQl2b2lkICgqZW5hYmxlX2FzcG0pIChzdHJ1Y3QgaWVlZTgwMjExX2h3ICogaHcpOworCXZvaWQgKCpkaXNhYmxlX2FzcG0pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKwl2b2lkICgqZW5hYmxlX2FzcG0pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIAogCS8qdXNiICovCiB9OwpAQCAtMjAyNywyMSArMjAyOSwyMSBAQAogfTsKIAogc3RydWN0IHJ0bF9idGNfb3BzIHsKLQl2b2lkICgqYnRjX2luaXRfdmFyaWFibGVzKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2KTsKLQl2b2lkICgqYnRjX2luaXRfaGFsX3ZhcnMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwotCXZvaWQgKCpidGNfaW5pdF9od19jb25maWcpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwotCXZvaWQgKCpidGNfaXBzX25vdGlmeSkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggdHlwZSk7Ci0Jdm9pZCAoKmJ0Y19zY2FuX25vdGlmeSkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggc2NhbnR5cGUpOwotCXZvaWQgKCpidGNfY29ubmVjdF9ub3RpZnkpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IGFjdGlvbik7Ci0Jdm9pZCAoKmJ0Y19tZWRpYXN0YXR1c19ub3RpZnkpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsCi0JCQkJCWVudW0gcnRfbWVkaWFfc3RhdHVzIG1zdGF0dXMpOwotCXZvaWQgKCpidGNfcGVyaW9kaWNhbCkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Ci0Jdm9pZCAoKmJ0Y19oYWx0X25vdGlmeSkgKHZvaWQpOwotCXZvaWQgKCpidGNfYnRpbmZvX25vdGlmeSkgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwKLQkJCQkgICB1OCAqIHRtcF9idWYsIHU4IGxlbmd0aCk7Ci0JYm9vbCAoKmJ0Y19pc19saW1pdGVkX2RpZykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7Ci0JYm9vbCAoKmJ0Y19pc19kaXNhYmxlX2VkY2FfdHVyYm8pIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOwotCWJvb2wgKCpidGNfaXNfYnRfZGlzYWJsZWQpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCXZvaWQgKCpidGNfaW5pdF92YXJpYWJsZXMpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJdm9pZCAoKmJ0Y19pbml0X2hhbF92YXJzKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCXZvaWQgKCpidGNfaW5pdF9od19jb25maWcpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJdm9pZCAoKmJ0Y19pcHNfbm90aWZ5KShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHU4IHR5cGUpOworCXZvaWQgKCpidGNfc2Nhbl9ub3RpZnkpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggc2NhbnR5cGUpOworCXZvaWQgKCpidGNfY29ubmVjdF9ub3RpZnkpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTggYWN0aW9uKTsKKwl2b2lkICgqYnRjX21lZGlhc3RhdHVzX25vdGlmeSkoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LAorCQkJCSAgICAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKKwl2b2lkICgqYnRjX3BlcmlvZGljYWwpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CisJdm9pZCAoKmJ0Y19oYWx0X25vdGlmeSkodm9pZCk7CisJdm9pZCAoKmJ0Y19idGluZm9fbm90aWZ5KShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsCisJCQkJICB1OCAqdG1wX2J1ZiwgdTggbGVuZ3RoKTsKKwlib29sICgqYnRjX2lzX2xpbWl0ZWRfZGlnKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCWJvb2wgKCpidGNfaXNfZGlzYWJsZV9lZGNhX3R1cmJvKShzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpOworCWJvb2wgKCpidGNfaXNfYnRfZGlzYWJsZWQpKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdik7CiB9OwogCiBzdHJ1Y3QgcnRsX2J0X2NvZXhpc3QgewpAQCAtMjA4Nyw3ICsyMDg5LDcgQEAKIAogCS8qCiAJICpoYWxfY2ZnIDogZm9yIGRpZmYgY2FyZHMKLQkgKmludGZfb3BzIDogZm9yIGRpZmYgaW50ZXJyZmFjZSB1c2IvcGNpZQorCSAqaW50Zl9vcHMgOiBmb3IgZGlmZiBpbnRlcmZhY2UgdXNiL3BjaWUKIAkgKi8KIAlzdHJ1Y3QgcnRsX2hhbF9jZmcgKmNmZzsKIAlzdHJ1Y3QgcnRsX2ludGZfb3BzICppbnRmX29wczsKQEAgLTIxMDUsNyArMjEwNyw3IEBACiAJLypmb3IgYnQgY29leGlzdCB1c2UqLwogCXN0cnVjdCBydGxfYnRfY29leGlzdCBidGNvZXhpc3Q7CiAKLQkvKiBzZXBlcmF0ZSA5MmVlIGZyb20gb3RoZXIgSUNzLAorCS8qIHNlcGFyYXRlIDkyZWUgZnJvbSBvdGhlciBJQ3MsCiAJICAqIDkyZWUgdXNlIG5ldyB0cnggZmxvdy4gKi8KIAlib29sIHVzZV9uZXdfdHJ4X2Zsb3c7CiAJLypUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbwpAQCAtMjEyMCw1NyArMjEyMiw1NyBAQAogI2RlZmluZSBydGxfaGFsKHJ0bHByaXYpCSgmKChydGxwcml2KS0+cnRsaGFsKSkKICNkZWZpbmUgcnRsX2VmdXNlKHJ0bHByaXYpCSgmKChydGxwcml2KS0+ZWZ1c2UpKQogI2RlZmluZSBydGxfcHNjKHJ0bHByaXYpCSgmKChydGxwcml2KS0+cHNjKSkKLSNkZWZpbmUgcnRsX3NlYyhydGxwcml2KSAJKCYoKHJ0bHByaXYpLT5zZWMpKQotI2RlZmluZSBydGxfZG0ocnRscHJpdikJKCYoKHJ0bHByaXYpLT5kbSkpCisjZGVmaW5lIHJ0bF9zZWMocnRscHJpdikJKCYoKHJ0bHByaXYpLT5zZWMpKQorI2RlZmluZSBydGxfZG0ocnRscHJpdikJCSgmKChydGxwcml2KS0+ZG0pKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIEJsdWV0b290aCBDby1leGlzdGFuY2UgUmVsYXRlZAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogZW51bSBidF9hbnRfbnVtIHsKLSAgICAgICAgQU5UX1gyID0gMCwKLSAgICAgICAgQU5UX1gxID0gMSwKKwlBTlRfWDIgPSAwLAorCUFOVF9YMSA9IDEsCiB9OwogCiBlbnVtIGJ0X2NvX3R5cGUgewotICAgICAgICBCVF8yV0lSRSA9IDAsCi0gICAgICAgIEJUX0lTU0NfM1dJUkUgPSAxLAotICAgICAgICBCVF9BQ0NFTCA9IDIsCi0gICAgICAgIEJUX0NTUl9CQzQgPSAzLAotICAgICAgICBCVF9DU1JfQkM4ID0gNCwKLSAgICAgICAgQlRfUlRMODc1NiA9IDUsCi0gICAgICAgIEJUX1JUTDg3MjNBID0gNiwKLSAgICAgICAgQlRfUlRMODgyMUEgPSA3LAotICAgICAgICBCVF9SVEw4NzIzQiA9IDgsCi0gICAgICAgIEJUX1JUTDgxOTJFID0gOSwKLSAgICAgICAgQlRfUlRMODgxMkEgPSAxMSwKKwlCVF8yV0lSRSA9IDAsCisJQlRfSVNTQ18zV0lSRSA9IDEsCisJQlRfQUNDRUwgPSAyLAorCUJUX0NTUl9CQzQgPSAzLAorCUJUX0NTUl9CQzggPSA0LAorCUJUX1JUTDg3NTYgPSA1LAorCUJUX1JUTDg3MjNBID0gNiwKKwlCVF9SVEw4ODIxQSA9IDcsCisJQlRfUlRMODcyM0IgPSA4LAorCUJUX1JUTDgxOTJFID0gOSwKKwlCVF9SVEw4ODEyQSA9IDExLAogfTsKIAotZW51bSBidF90b3RhbF9hbnRfbnVteworZW51bSBidF90b3RhbF9hbnRfbnVtIHsKIAlBTlRfVE9UQUxfWDIgPSAwLAogCUFOVF9UT1RBTF9YMSA9IDEKIH07CiAKIGVudW0gYnRfY3VyX3N0YXRlIHsKLSAgICAgICAgQlRfT0ZGID0gMCwKLSAgICAgICAgQlRfT04gPSAxLAorCUJUX09GRiA9IDAsCisJQlRfT04gPSAxLAogfTsKIAogZW51bSBidF9zZXJ2aWNlX3R5cGUgewotICAgICAgICBCVF9TQ08gPSAwLAotICAgICAgICBCVF9BMkRQID0gMSwKLSAgICAgICAgQlRfSElEID0gMiwKLSAgICAgICAgQlRfSElEX0lETEUgPSAzLAotICAgICAgICBCVF9TQ0FOID0gNCwKLSAgICAgICAgQlRfSURMRSA9IDUsCi0gICAgICAgIEJUX09USEVSX0FDVElPTiA9IDYsCi0gICAgICAgIEJUX0JVU1kgPSA3LAotICAgICAgICBCVF9PVEhFUkJVU1kgPSA4LAotICAgICAgICBCVF9QQU4gPSA5LAorCUJUX1NDTyA9IDAsCisJQlRfQTJEUCA9IDEsCisJQlRfSElEID0gMiwKKwlCVF9ISURfSURMRSA9IDMsCisJQlRfU0NBTiA9IDQsCisJQlRfSURMRSA9IDUsCisJQlRfT1RIRVJfQUNUSU9OID0gNiwKKwlCVF9CVVNZID0gNywKKwlCVF9PVEhFUkJVU1kgPSA4LAorCUJUX1BBTiA9IDksCiB9OwogCiBlbnVtIGJ0X3JhZGlvX3NoYXJlZCB7Ci0gICAgICAgIEJUX1JBRElPX1NIQVJFRCA9IDAsCi0gICAgICAgIEJUX1JBRElPX0lORElWSURVQUwgPSAxLAorCUJUX1JBRElPX1NIQVJFRCA9IDAsCisJQlRfUkFESU9fSU5ESVZJRFVBTCA9IDEsCiB9OwogCiBzdHJ1Y3QgYnRfY29leGlzdF9pbmZvIHsKQEAgLTIyNTUsMTEgKzIyNTcsMTEgQEAKIAogLyogV3JpdGUgZGF0YSB0byBtZW1vcnkgKi8KICNkZWZpbmUgV1JJVEVFRjFCWVRFKF9wdHIsIF92YWwpCVwKLQkoKigodTggKikoX3B0cikpKT1FRjFCWVRFKF92YWwpCisJKCgqKCh1OCAqKShfcHRyKSkpID0gRUYxQllURShfdmFsKSkKICNkZWZpbmUgV1JJVEVFRjJCWVRFKF9wdHIsIF92YWwpCVwKLQkoKigodTE2ICopKF9wdHIpKSk9RUYyQllURShfdmFsKQorCSgoKigodTE2ICopKF9wdHIpKSkgPSBFRjJCWVRFKF92YWwpKQogI2RlZmluZSBXUklURUVGNEJZVEUoX3B0ciwgX3ZhbCkJXAotCSgqKCh1MzIgKikoX3B0cikpKT1FRjRCWVRFKF92YWwpCisJKCgqKCh1MzIgKikoX3B0cikpKSA9IEVGNEJZVEUoX3ZhbCkpCiAKIC8qRXhhbXBsZToKIEJJVF9MRU5fTUFTS18zMigwKSA9PiAweDAwMDAwMDAwCkBAIC0yMjk4LDE3ICsyMzAwLDE3IEBACiB2YWx1ZSB0byBob3N0IGJ5dGUgb3JkZXJpbmcuKi8KICNkZWZpbmUgTEVfQklUU19UT180QllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCiAJKCBcCi0JCSggTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wc3RhcnQpID4+IChfX2JpdG9mZnNldCkgKSAgJiBcCisJCShMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BzdGFydCkgPj4gKF9fYml0b2Zmc2V0KSkgICYgXAogCQlCSVRfTEVOX01BU0tfMzIoX19iaXRsZW4pIFwKIAkpCiAjZGVmaW5lIExFX0JJVFNfVE9fMkJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAogCSggXAotCQkoIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpICkgJiBcCisJCShMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BzdGFydCkgPj4gKF9fYml0b2Zmc2V0KSkgJiBcCiAJCUJJVF9MRU5fTUFTS18xNihfX2JpdGxlbikgXAogCSkKICNkZWZpbmUgTEVfQklUU19UT18xQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSBcCiAJKCBcCi0JCSggTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wc3RhcnQpID4+IChfX2JpdG9mZnNldCkgKSAmIFwKKwkJKExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcHN0YXJ0KSA+PiAoX19iaXRvZmZzZXQpKSAmIFwKIAkJQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pIFwKIAkpCiAKQEAgLTIzMTgsMTcgKzIzMjAsMTcgQEAKICNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzRCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIFwKIAkoIFwKIAkJTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wc3RhcnQpICAmIFwKLQkJKCB+QklUX09GRlNFVF9MRU5fTUFTS18zMihfX2JpdG9mZnNldCwgX19iaXRsZW4pICkgXAorCQkofkJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19iaXRvZmZzZXQsIF9fYml0bGVuKSkgXAogCSkKICNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIFwKIAkoIFwKIAkJTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wc3RhcnQpICYgXAotCQkoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgKSBcCisJCSh+QklUX09GRlNFVF9MRU5fTUFTS18xNihfX2JpdG9mZnNldCwgX19iaXRsZW4pKSBcCiAJKQogI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbikgXAogCSggXAogCQlMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BzdGFydCkgJiBcCi0JCSggfkJJVF9PRkZTRVRfTEVOX01BU0tfOChfX2JpdG9mZnNldCwgX19iaXRsZW4pICkgXAorCQkofkJJVF9PRkZTRVRfTEVOX01BU0tfOChfX2JpdG9mZnNldCwgX19iaXRsZW4pKSBcCiAJKQogCiAvKkRlc2NyaXB0aW9uOgpAQCAtMjMzNywxOSArMjMzOSwxOSBAQAogCSooKHUzMiAqKShfX3BzdGFydCkpID0gRUY0QllURSBcCiAJKCBcCiAJCUxFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSB8IFwKLQkJKCAoKCh1MzIpX192YWwpICYgQklUX0xFTl9NQVNLXzMyKF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSApXAorCQkoKCgodTMyKV9fdmFsKSAmIEJJVF9MRU5fTUFTS18zMihfX2JpdGxlbikpIDw8IChfX2JpdG9mZnNldCkpXAogICAgICAgICk7CiAjZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzJCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4sIF9fdmFsKSBcCiAJKigodTE2ICopKF9fcHN0YXJ0KSkgPSBFRjJCWVRFIFwKIAkoIFwKIAkJTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcHN0YXJ0LCBfX2JpdG9mZnNldCwgX19iaXRsZW4pIHwgXAotCQkoICgoKHUxNilfX3ZhbCkgJiBCSVRfTEVOX01BU0tfMTYoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpIClcCisJCSgoKCh1MTYpX192YWwpICYgQklUX0xFTl9NQVNLXzE2KF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSlcCiAgICAgICAgKTsKICNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wc3RhcnQsIF9fYml0b2Zmc2V0LCBfX2JpdGxlbiwgX192YWwpIFwKIAkqKCh1OCAqKShfX3BzdGFydCkpID0gRUYxQllURSBcCiAJKCBcCiAJCUxFX0JJVFNfQ0xFQVJFRF9UT18xQllURShfX3BzdGFydCwgX19iaXRvZmZzZXQsIF9fYml0bGVuKSB8IFwKLQkJKCAoKCh1OClfX3ZhbCkgJiBCSVRfTEVOX01BU0tfOChfX2JpdGxlbikpIDw8IChfX2JpdG9mZnNldCkgKSBcCisJCSgoKCh1OClfX3ZhbCkgJiBCSVRfTEVOX01BU0tfOChfX2JpdGxlbikpIDw8IChfX2JpdG9mZnNldCkpIFwKICAgICAgICApOwogCiAjZGVmaW5lCU5fQllURV9BTElHTUVOVChfX3ZhbHVlLCBfX2FsaWdtZW50KSAoKF9fYWxpZ21lbnQgPT0gMSkgPyBcCkBAIC0yMzU5LDE4ICsyMzYxLDE4IEBACiAJbWVtIGFjY2VzcyBtYWNybyBkZWZpbmUgZW5kCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIGJ5dGUoeCxuKSAoKHggPj4gKDggKiBuKSkgJiAweGZmKQorI2RlZmluZSBieXRlKHgsIG4pICgoeCA+PiAoOCAqIG4pKSAmIDB4ZmYpCiAKICNkZWZpbmUgcGFja2V0X2dldF90eXBlKF9wYWNrZXQpIChFRjFCWVRFKChfcGFja2V0KS5vY3RldFswXSkgJiAweEZDKQotI2RlZmluZSBSVExfV0FUQ0hfRE9HX1RJTUUgICAgCTIwMDAKKyNkZWZpbmUgUlRMX1dBVENIX0RPR19USU1FCTIwMDAKICNkZWZpbmUgTVNFQ1ModCkJCW1zZWNzX3RvX2ppZmZpZXModCkKLSNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfVkVSUykKLSNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCi0jZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAJKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKLSNkZWZpbmUgV0xBTl9GQ19NT1JFX0RBVEEoZmMpIAkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKQotI2RlZmluZSBTRVFfVE9fU04oc2VxKSAJCSgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCi0jZGVmaW5lIFNOX1RPX1NFUShzc24pIAkJKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKLSNkZWZpbmUgTUFYX1NOIAkJCSgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorI2RlZmluZSBXTEFOX0ZDX0dFVF9WRVJTKGZjKQkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1ZFUlMpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpCSgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKQkoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQorI2RlZmluZSBXTEFOX0ZDX01PUkVfREFUQShmYykJKChmYykgJiBJRUVFODAyMTFfRkNUTF9NT1JFREFUQSkKKyNkZWZpbmUgU0VRX1RPX1NOKHNlcSkJCSgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCisjZGVmaW5lIFNOX1RPX1NFUShzc24pCQkoKChzc24pIDw8IDQpICYgSUVFRTgwMjExX1NDVExfU0VRKQorI2RlZmluZSBNQVhfU04JCQkoKElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKIAogI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9BU1BNCQlCSVQoMCkJLypQQ0kgQVNQTSAqLwogI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9DTEtfUkVRCQlCSVQoMSkJLypQQ0kgY2xvY2sgcmVxdWVzdCAqLwpAQCAtMjM4Myw3ICsyMzg1LDcgQEAKICNkZWZpbmUJUlRfUkZfUFNfTEVWRUxfQUxXQVlTX0FTUE0JQklUKDYpCiAvKiBubyBtYXR0ZXIgUkZPRkYgb3IgU0xFRVAgd2Ugc2V0IFBTX0FTUE1fTEVWTCovCiAjZGVmaW5lCVJUX1BTX0xFVkVMX0FTUE0JCUJJVCg3KQotLypXaGVuIExQUyBpcyBvbiwgZGlzYWJsZSAyUiBpZiBubyBwYWNrZXQgaXMgcmVjZWl2ZWQgb3IgdHJhbnNtaXR0ZC4qLworLypXaGVuIExQUyBpcyBvbiwgZGlzYWJsZSAyUiBpZiBubyBwYWNrZXQgaXMgcmVjZWl2ZWQgb3IgdHJhbnNtaXR0ZWQuKi8KICNkZWZpbmUJUlRfUkZfTFBTX0RJU0FMQkVfMlIJCUJJVCgzMCkKICNkZWZpbmUJUlRfUkZfTFBTX0xFVkVMX0FTUE0JCUJJVCgzMSkJLypMUFMgd2l0aCBBU1BNICovCiAjZGVmaW5lCVJUX0lOX1BTX0xFVkVMKHBwc2MsIF9wc19mbGcpCQlcCkBAIC0yMzk3LDEzICsyMzk5LDEzIEBACiAJY29udGFpbmVyX29mKGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKSwgeSwgeikKIAogI2RlZmluZSBGSUxMX09DVEVUX1NUUklORyhfb3MsX29jdGV0LF9sZW4pCVwKLQkJKF9vcykub2N0ZXQ9KHU4KikoX29jdGV0KTsJCVwKLQkJKF9vcykubGVuZ3RoPShfbGVuKTsKKwkJKF9vcykub2N0ZXQgPSAodTggKikoX29jdGV0KTsJCVwKKwkJKF9vcykubGVuZ3RoID0gKF9sZW4pOwogCiAjZGVmaW5lIENQX01BQ0FERFIoZGVzLHNyYykJXAotCSgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSxcCi0JKGRlcylbMl09KHNyYylbMl0sKGRlcylbM109KHNyYylbM10sXAotCShkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQorCSgoZGVzKVswXSA9IChzcmMpWzBdLChkZXMpWzFdID0gKHNyYylbMV0sXAorCShkZXMpWzJdID0gKHNyYylbMl0sKGRlcylbM10gPSAoc3JjKVszXSxcCisJKGRlcylbNF0gPSAoc3JjKVs0XSwoZGVzKVs1XSA9IChzcmMpWzVdKQogCiBzdGF0aWMgaW5saW5lIHU4IHJ0bF9yZWFkX2J5dGUoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tcy5jCmluZGV4IDkyNTNmNmEuLjM5MDI5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXMuYwpAQCAtMTAzMyw4ICsxMDMzLDcgQEAKIAkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDVdIDw8IDE2KSB8CiAJCQkgICAgKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyA2XSA8PCA4KSB8CiAJCQkgICAgYnVmW2N1cl9hZGRyX29mZiArIDddOwotCQkJUlRTNTFYX0RFQlVHUCgic3lzX2luZm9fYWRkciA9IDB4JXgsIgotCQkJCQkic3lzX2luZm9fc2l6ZSA9IDB4JXhcbiIsCisJCQlSVFM1MVhfREVCVUdQKCJzeXNfaW5mb19hZGRyID0gMHgleCwgc3lzX2luZm9fc2l6ZSA9IDB4JXhcbiIsCiAJCQkJCQlzeXNfaW5mb19hZGRyLCBzeXNfaW5mb19zaXplKTsKIAkJCWlmIChzeXNfaW5mb19zaXplICE9IDk2KSB7CiAJCQkJa2ZyZWUoYnVmKTsKQEAgLTEwNjksOCArMTA2OCw3IEBACiAJCQkgICAgKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyA1XSA8PCAxNikgfAogCQkJICAgICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgNl0gPDwgOCkgfAogCQkJICAgIGJ1ZltjdXJfYWRkcl9vZmYgKyA3XTsKLQkJCVJUUzUxWF9ERUJVR1AoIm1vZGVsX25hbWVfYWRkciA9IDB4JXgsIgotCQkJCQkibW9kZWxfbmFtZV9zaXplID0gMHgleFxuIiwKKwkJCVJUUzUxWF9ERUJVR1AoIm1vZGVsX25hbWVfYWRkciA9IDB4JXgsIG1vZGVsX25hbWVfc2l6ZSA9IDB4JXhcbiIsCiAJCQkJCW1vZGVsX25hbWVfYWRkciwgbW9kZWxfbmFtZV9zaXplKTsKIAkJCWlmIChtb2RlbF9uYW1lX3NpemUgIT0gNDgpIHsKIAkJCQlrZnJlZShidWYpOwpAQCAtMTc1MSw4ICsxNzQ5LDcgQEAKIAkJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CiAJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCQl1bmNvcnJlY3RfZmxhZyA9IDE7Ci0JCQkJCVJUUzUxWF9ERUJVR1AoIlVuY29ycmVjdGFibGUiCi0JCQkJCQkJCSJlcnJvclxuIik7CisJCQkJCVJUUzUxWF9ERUJVR1AoIlVuY29ycmVjdGFibGUgZXJyb3JcbiIpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXVuY29ycmVjdF9mbGFnID0gMDsKIAkJCQl9CkBAIC0xNzcwLDggKzE3NjcsNyBAQAogCQkJCQltc193cml0ZV9leHRyYV9kYXRhKGNoaXAsIG9sZF9ibGssIGksCiAJCQkJCQkJICAgIGV4dHJhLAogCQkJCQkJCSAgICBNU19FWFRSQV9TSVpFKTsKLQkJCQkJUlRTNTFYX0RFQlVHUCgicGFnZSAlZCA6IgotCQkJCQkJCSJleHRyYVswXSA9IDB4JXhcbiIsCisJCQkJCVJUUzUxWF9ERUJVR1AoInBhZ2UgJWQgOiBleHRyYVswXSA9IDB4JXhcbiIsCiAJCQkJCQkJaSwgZXh0cmFbMF0pOwogCQkJCQlNU19TRVRfQkFEX0JMT0NLX0ZMRyhtc19jYXJkKTsKIApAQCAtMTkzMiw4ICsxOTI4LDcgQEAKIAl1OCBwYWdlX2xlbiwgYnVzX3dpZHRoLCB2YWwgPSAwOwogCXU4IGV4dHJhW01TX0VYVFJBX1NJWkVdOwogCi0JUlRTNTFYX0RFQlVHUCgiQXV0byBjb3B5IHBhZ2UgZnJvbSAweCV4IHRvIDB4JXgsIgotCQkJCSJsb2dpY2FsIGJsb2NrIGlzIDB4JXhcbiIsCisJUlRTNTFYX0RFQlVHUCgiQXV0byBjb3B5IHBhZ2UgZnJvbSAweCV4IHRvIDB4JXgsIGxvZ2ljYWwgYmxvY2sgaXMgMHgleFxuIiwKIAkJCQlvbGRfYmxrLCBuZXdfYmxrLCBsb2dfYmxrKTsKIAlSVFM1MVhfREVCVUdQKCJzdGFydF9wYWdlID0gJWQsIGVuZF9wYWdlID0gJWRcbiIsIHN0YXJ0X3BhZ2UsCiAJCSAgICAgICBlbmRfcGFnZSk7CkBAIC0yNTU1LDggKzI1NTAsNyBAQAogCQlmb3IgKGxvZ19ibGsgPSAwOyBsb2dfYmxrIDwgNDk0OyBsb2dfYmxrKyspIHsKIAkJCXRtcF9ibGsgPSBzZWdtZW50LT5sMnBfdGFibGVbbG9nX2Jsa107CiAJCQlpZiAodG1wX2JsayA8IG1zX2NhcmQtPmJvb3RfYmxvY2spIHsKLQkJCQlSVFM1MVhfREVCVUdQKCJCb290IGJsb2NrIGlzIG5vdCB0aGUgZmlyc3QiCi0JCQkJCQkJIm5vcm1hbCBibG9jay5cbiIpOworCQkJCVJUUzUxWF9ERUJVR1AoIkJvb3QgYmxvY2sgaXMgbm90IHRoZSBmaXJzdCBub3JtYWwgYmxvY2suXG4iKTsKIAogCQkJCWlmIChjaGlwLT5jYXJkX3dwICYgTVNfQ0FSRCkKIAkJCQkJYnJlYWs7CkBAIC0zOTc2LDggKzM5NzAsNyBAQAogCQkJZW5kX3BhZ2UgPSBzdGFydF9wYWdlICsgKHU4KSB0b3RhbF9zZWNfY250OwogCQlwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsKIAotCQlSVFM1MVhfREVCVUdQKCJzdGFydF9wYWdlID0gJWQsIGVuZF9wYWdlID0gJWQsIgotCQkJCQkicGFnZV9jbnQgPSAlZFxuIiwKKwkJUlRTNTFYX0RFQlVHUCgic3RhcnRfcGFnZSA9ICVkLCBlbmRfcGFnZSA9ICVkLCBwYWdlX2NudCA9ICVkXG4iLAogCQkJCQlzdGFydF9wYWdlLCBlbmRfcGFnZSwgcGFnZV9jbnQpOwogCiAJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zX21nLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tc19tZy5jCmluZGV4IDU0Y2ZkODUuLjAwODYyYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zX21nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXNfbWcuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgInJ0czUxeF9zY3NpLmgiCiAjaW5jbHVkZSAicnRzNTF4X2NhcmQuaCIKICNpbmNsdWRlICJtcy5oIgorI2luY2x1ZGUgIm1zX21nLmgiCiAKICNpZmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXguYwppbmRleCBhOGQyZDA0Li5jOGQwNmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXguYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAgKiBhIFVTQiBwb3J0IHJlc2V0LCB3aGV0aGVyIGZyb20gdGhpcyBkcml2ZXIgb3IgYSBkaWZmZXJlbnQgb25lLgogICovCiAKLWludCBydHM1MXhfcHJlX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKK3N0YXRpYyBpbnQgcnRzNTF4X3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCiB7CiAJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CiAKQEAgLTIyNiw3ICsyMjYsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcnRzNTF4X3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQorc3RhdGljIGludCBydHM1MXhfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCiB7CiAJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CiAKQEAgLTgzMiw3ICs4MzIsNyBAQAogICogSW5pdGlhbGl6YXRpb24gYW5kIHJlZ2lzdHJhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgdXNiX2RldmljZV9pZCBydHM1MTM5X3VzYl9pZHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBydHM1MTM5X3VzYl9pZHNbXSA9IHsKIAl7VVNCX0RFVklDRSgweDBCREEsIDB4MDEzOSl9LAogCXtVU0JfREVWSUNFKDB4MEJEQSwgMHgwMTI5KX0sCiAJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5jCmluZGV4IGRlZTdkOGEuLjY3N2QxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmMKQEAgLTkzLDcgKzkzLDcgQEAKIAkJfQogCiAJCXJldHZhbCA9Ci0JCSAgICBjb3B5X3RvX3VzZXIoKHZvaWQgKiljbW5kLT5idWYsICh2b2lkICopYnVmLCBjbW5kLT5idWZfbGVuKTsKKwkJICAgIGNvcHlfdG9fdXNlcihjbW5kLT5idWYsICh2b2lkICopYnVmLCBjbW5kLT5idWZfbGVuKTsKIAkJaWYgKHJldHZhbCkgewogCQkJa2ZyZWUoYnVmKTsKIAkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKIAogCQlyZXR2YWwgPQotCQkgICAgY29weV9mcm9tX3VzZXIoKHZvaWQgKilidWYsICh2b2lkICopY21uZC0+YnVmLAorCQkgICAgY29weV9mcm9tX3VzZXIoKHZvaWQgKilidWYsIGNtbmQtPmJ1ZiwKIAkJCQkgICBjbW5kLT5idWZfbGVuKTsKIAkJaWYgKHJldHZhbCkgewogCQkJa2ZyZWUoYnVmKTsKQEAgLTE1NCw3ICsxNTQsNyBAQAogCWVsc2UKIAkJY291bnQgPSAocnNwLT5yc3BfbGVuIDwgNikgPyByc3AtPnJzcF9sZW4gOiA2OwogCi0JcmV0dmFsID0gY29weV90b191c2VyKCh2b2lkICopcnNwLT5yc3AsICh2b2lkICopc2RfY2FyZC0+cnNwLCBjb3VudCk7CisJcmV0dmFsID0gY29weV90b191c2VyKHJzcC0+cnNwLCAodm9pZCAqKXNkX2NhcmQtPnJzcCwgY291bnQpOwogCWlmIChyZXR2YWwpCiAJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOwogCkBAIC0yNTAsNyArMjUwLDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRTNTEzOV9JT0NfU0RfRElSRUNUOgogCQlyZXR2YWwgPQotCQkgICAgY29weV9mcm9tX3VzZXIoKHZvaWQgKikmY21uZCwgKHZvaWQgKilhcmcsCisJCSAgICBjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZjbW5kLCAodm9pZCBfX3VzZXIgKilhcmcsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCBzZF9kaXJlY3RfY21uZCkpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlyZXR2YWwgPSAtRU5PTUVNOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAKIAljYXNlIFJUUzUxMzlfSU9DX1NEX0dFVF9SU1A6CiAJCXJldHZhbCA9Ci0JCSAgICBjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZyc3AsICh2b2lkICopYXJnLAorCQkgICAgY29weV9mcm9tX3VzZXIoJnJzcCwgKHZvaWQgX191c2VyICopYXJnLAogCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2RfcnNwKSk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCXJldHZhbCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmgKaW5kZXggZWI0NWFjZi4uYzY5MWVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuaApAQCAtMzUsMTIgKzM1LDEyIEBACiAKIHN0cnVjdCBzZF9kaXJlY3RfY21uZCB7CiAJdTggY21uZFsxMl07Ci0Jdm9pZCAqYnVmOworCXZvaWQgX191c2VyICpidWY7CiAJaW50IGJ1Zl9sZW47CiB9OwogCiBzdHJ1Y3Qgc2RfcnNwIHsKLQl2b2lkICpyc3A7CisJdm9pZCBfX3VzZXIgKnJzcDsKIAlpbnQgcnNwX2xlbjsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zY3NpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jCmluZGV4IDNhOTkwMjUuLjc1MjgyZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zY3NpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYwpAQCAtNDQxLDcgKzQ0MSw3IEBACiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwogfQogCi11bnNpZ25lZCBjaGFyIGZvcm1hdHRlcl9pbnF1aXJ5X3N0clsyMF0gPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBmb3JtYXR0ZXJfaW5xdWlyeV9zdHJbMjBdID0gewogCSdNJywgJ0UnLCAnTScsICdPJywgJ1InLCAnWScsICdTJywgJ1QnLCAnSScsICdDJywgJ0snLAogCSctJywgJ00nLCAnRycsCQkvKiBCeXRlWzQ3OjQ5XSAqLwogCTB4MEIsCQkJLyogQnl0ZVs1MF06IE1HLCBNUywgTVNQcm8sIE1TWEMgKi8KQEAgLTE5OTAsNyArMTk5MCw3IEBACiAKIC8qIHF1ZXVlIGEgY29tbWFuZCAqLwogLyogVGhpcyBpcyBhbHdheXMgY2FsbGVkIHdpdGggc2NzaV9sb2NrKGhvc3QpIGhlbGQgKi8KLWludCBxdWV1ZWNvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQorc3RhdGljIGludCBxdWV1ZWNvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IGhvc3RfdG9fcnRzNTF4KHNyYi0+ZGV2aWNlLT5ob3N0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3RyYW5zcG9ydC5jCmluZGV4IGMxNzJmNGFlLi43NDU4OGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3RyYW5zcG9ydC5jCkBAIC02NDYsOSArNjQ2LDkgQEAKIAkJCQkgICAgY2hpcC0+dXNiLT5pbnRyX3VyYi0+YWN0dWFsX2xlbmd0aCk7CiB9CiAKLXU4IG1lZGlhX25vdF9wcmVzZW50W10gPSB7CitzdGF0aWMgdTggbWVkaWFfbm90X3ByZXNlbnRbXSA9IHsKIAkweDcwLCAwLCAweDAyLCAwLCAwLCAwLCAwLCAxMCwgMCwgMCwgMCwgMCwgMHgzQSwgMCwgMCwgMCwgMCwgMCB9OwotdTggaW52YWxpZF9jbWRfZmllbGRbXSA9IHsKK3N0YXRpYyB1OCBpbnZhbGlkX2NtZF9maWVsZFtdID0gewogCTB4NzAsIDAsIDB4MDUsIDAsIDAsIDAsIDAsIDEwLCAwLCAwLCAwLCAwLCAweDI0LCAwLCAwLCAwLCAwLCAwIH07CiAKIHZvaWQgcnRzNTF4X2ludm9rZV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2QuYwppbmRleCA0MjgzYjA5Li5kYTVhOWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmMKQEAgLTE1MjksNyArMTUyOSw3IEBACiAJaW50IGksIGo7CiAJdTMyIHJhd19waGFzZV9tYXBbM10sIHBoYXNlX21hcDsKIAl1OCBmaW5hbF9waGFzZTsKLQlpbnQgKCp0dW5pbmdfY21kKSAoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBzYW1wbGVfcG9pbnQpOworCWludCAoKnR1bmluZ19jbWQpKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggc2FtcGxlX3BvaW50KTsKIAogCWlmIChDSEtfU0Qoc2RfY2FyZCkpIHsKIAkJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkKQEAgLTE2MjcsNyArMTYyNyw3IEBACiAJaW50IGksIGo7CiAJdTMyIHJhd19waGFzZV9tYXBbM10sIHBoYXNlX21hcDsKIAl1OCBmaW5hbF9waGFzZTsKLQlpbnQgKCp0dW5pbmdfY21kKSAoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBzYW1wbGVfcG9pbnQpOworCWludCAoKnR1bmluZ19jbWQpKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggc2FtcGxlX3BvaW50KTsKIAogCWlmIChDSEtfU0Qoc2RfY2FyZCkpIHsKIAkJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uYwppbmRleCBkNDY4OTgzLi5jZWRlNmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9zZF9jcHJtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2RfY3BybS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAicnRzNTF4X3Njc2kuaCIKICNpbmNsdWRlICJydHM1MXhfY2FyZC5oIgogI2luY2x1ZGUgInJ0czUxeF9jaGlwLmgiCisjaW5jbHVkZSAic2RfY3BybS5oIgogI2luY2x1ZGUgInNkLmgiCiAKICNpZmRlZiBTVVBQT1JUX0NQUk0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3hkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS94ZC5jCmluZGV4IDEwZmVhN2UuLmJlNDMyMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3hkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkveGQuYwpAQCAtNDczLDcgKzQ3Myw4IEBACiAJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0RUQ1RMLCAweEZGLAogCQkJWERfVElNRV9TRVRVUF9TVEVQICogMyArIFhEX1RJTUVfUldfU1RFUCAqCiAJCQkoMiArIGkgKyBjaGlwLT5vcHRpb24ucnRzNTF4X3hkX3J3X3N0ZXApCi0JCQkrIFhEX1RJTUVfUldOX1NURVAgKiAoaSArIGNoaXAtPm9wdGlvbi5ydHM1MXhfeGRfcnduX3N0ZXApKTsKKwkJCSsgWERfVElNRV9SV05fU1RFUCAqCisJCQkoaSArIGNoaXAtPm9wdGlvbi5ydHM1MXhfeGRfcnduX3N0ZXApKTsKIAkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0FUQ1RMLCAweEZGLAogCQkJWERfVElNRV9TRVRVUF9TVEVQICogMyArIFhEX1RJTUVfUldfU1RFUCAqICg0ICsKIAkJCWkpICsgWERfVElNRV9SV05fU1RFUCAqICgzICsgaSkpOwpAQCAtMTUyNiw4ICsxNTI3LDggQEAKIAlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DSEtfREFUQV9TVEFUVVMsCiAJCSAgICAgICBYRF9BVVRPX0NIS19EQVRBX1NUQVRVUywgWERfQVVUT19DSEtfREFUQV9TVEFUVVMpOwogCi0JcnRzNTF4X3RyYW5zX2RtYV9lbmFibGUoY2hpcC0+c3JiLT5zY19kYXRhX2RpcmVjdGlvbiwgY2hpcCwgcGFnZV9jbnQgKiA1MTIsCi0JCQkgRE1BXzUxMik7CisJcnRzNTF4X3RyYW5zX2RtYV9lbmFibGUoY2hpcC0+c3JiLT5zY19kYXRhX2RpcmVjdGlvbiwgY2hpcCwKKwkJCXBhZ2VfY250ICogNTEyLCBETUFfNTEyKTsKIAogCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1RSQU5TRkVSLCAweEZGLAogCQkgICAgICAgWERfVFJBTlNGRVJfU1RBUlQgfCBYRF9SRUFEX1BBR0VTKTsKQEAgLTE3NDUsOCArMTc0Niw4IEBACiAJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwgMHgwMSwKIAkJICAgICAgIFJJTkdfQlVGRkVSKTsKIAotCXJ0czUxeF90cmFuc19kbWFfZW5hYmxlKGNoaXAtPnNyYi0+c2NfZGF0YV9kaXJlY3Rpb24sIGNoaXAsIHBhZ2VfY250ICogNTEyLAotCQkJIERNQV81MTIpOworCXJ0czUxeF90cmFuc19kbWFfZW5hYmxlKGNoaXAtPnNyYi0+c2NfZGF0YV9kaXJlY3Rpb24sIGNoaXAsCisJCQlwYWdlX2NudCAqIDUxMiwgRE1BXzUxMik7CiAKIAlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKIAkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfV1JJVEVfUEFHRVMpOwpAQCAtMTg0Miw4ICsxODQzLDggQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLWludCBydHM1MXhfeGRfcncoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUzMiBzdGFydF9zZWN0b3IsCi0JICB1MTYgc2VjdG9yX2NudCkKK2ludCBydHM1MXhfeGRfcncoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJdTMyIHN0YXJ0X3NlY3RvciwgdTE2IHNlY3Rvcl9jbnQpCiB7CiAJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOwogCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwpAQCAtMTg4Myw3ICsxODg0LDggQEAKIAkJcmV0dmFsID0geGRfYnVpbGRfbDJwX3RibChjaGlwLCB6b25lX25vKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IFhEX0NBUkQ7Ci0JCQlydHM1MXhfc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJCXJ0czUxeF9zZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCmluZGV4IGVkZjk3OWYuLmQyMjkxNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJCU1TX1RSQU5TRkVSX0VORCwgTVNfVFJBTlNGRVJfRU5EKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbiAtIDE7IGkrKykKLQkgICAgICAgcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgUFBCVUZfQkFTRTIgKyBpLCAwLCAwKTsKKwkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgUFBCVUZfQkFTRTIgKyBpLCAwLCAwKTsKIAogCWlmIChkYXRhX2xlbiAlIDIpCiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgZGF0YV9sZW4sIDAsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCmluZGV4IDg1ODZhYzUuLmQyZDEzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKQEAgLTEwMzEsOCArMTAzMSwxMCBAQAogCiAvKiBQQ0kgSURzICovCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocnRzeF9pZHMpID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssIDB4NTIwOCksIFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywgMHg1Mjg4KSwgUENJX0NMQVNTX09USEVSUyA8PCAxNiwgMHhGRjAwMDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDUyMDgpLAorCQlQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssIDB4NTI4OCksCisJCVBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCiAJeyAwLCB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwppbmRleCAzMDU1ZWIxLi4wMWFlYjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwpAQCAtMTA1LDggKzEwNSwxMCBAQAogCVJUU1hfREVCVUdQKCJyZWcgMHhGRjM0OiAweCV4LCByZWcgMHhGRjM4OiAweCV4XG4iLCByZWcxLCByZWcyKTsKIAlpZiAoKHJlZzEgJiAweEMwKSAmJiAocmVnMiAmIDB4QzApKSB7CiAJCWNoaXAtPnNkX2ludCA9IDE7Ci0JCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RJT19DVFJMLCAweEZGLCBTRElPX0JVU19DVFJMIHwgU0RJT19DRF9DVFJMKTsKLQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQV1JfR0FURV9DVFJMLCBMRE8zMzE4X1BXUl9NQVNLLCBMRE9fT04pOworCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNESU9fQ1RSTCwgMHhGRiwKKwkJCQlTRElPX0JVU19DVFJMIHwgU0RJT19DRF9DVFJMKTsKKwkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQV1JfR0FURV9DVFJMLAorCQkJCUxETzMzMThfUFdSX01BU0ssIExET19PTik7CiAJfQogfQogCkBAIC00NTIsNyArNDU0LDggQEAKIH0KIAogI2lmZGVmIERJU0FCTEVfQ0FSRF9JTlQKLXZvaWQgY2FyZF9jZF9kZWJvdW5jZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBsb25nICpuZWVkX3Jlc2V0LCB1bnNpZ25lZCBsb25nICpuZWVkX3JlbGVhc2UpCit2b2lkIGNhcmRfY2RfZGVib3VuY2Uoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyAqbmVlZF9yZXNldCwKKwkJdW5zaWduZWQgbG9uZyAqbmVlZF9yZWxlYXNlKQogewogCXU4IHJlbGVhc2VfbWFwID0gMCwgcmVzZXRfbWFwID0gMDsKIApAQCAtNTA0LDExICs1MDcsMTQgQEAKIAkJfQogCiAJCXJlc2V0X21hcCA9IDA7Ci0JCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBYRF9DQVJEKSAmJiAoeGRfY250ID4gKERFQk9VTkNFX0NOVC0xKSkpCisJCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBYRF9DQVJEKSAmJgorCQkJCSh4ZF9jbnQgPiAoREVCT1VOQ0VfQ05ULTEpKSkKIAkJCXJlc2V0X21hcCB8PSBYRF9DQVJEOwotCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgU0RfQ0FSRCkgJiYgKHNkX2NudCA+IChERUJPVU5DRV9DTlQtMSkpKQorCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgU0RfQ0FSRCkgJiYKKwkJCQkoc2RfY250ID4gKERFQk9VTkNFX0NOVC0xKSkpCiAJCQlyZXNldF9tYXAgfD0gU0RfQ0FSRDsKLQkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIE1TX0NBUkQpICYmIChtc19jbnQgPiAoREVCT1VOQ0VfQ05ULTEpKSkKKwkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIE1TX0NBUkQpICYmCisJCQkJKG1zX2NudCA+IChERUJPVU5DRV9DTlQtMSkpKQogCQkJcmVzZXRfbWFwIHw9IE1TX0NBUkQ7CiAJfQogCkBAIC01NDksNyArNTU1LDggQEAKIAkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIE1TX0NBUkQpKQogCQkJY2xlYXJfYml0KE1TX05SLCAmKGNoaXAtPm5lZWRfcmVsZWFzZSkpOwogCi0JCVJUU1hfREVCVUdQKCJjaGlwLT5uZWVkX3JlbGVhc2UgPSAweCV4XG4iLCAodW5zaWduZWQgaW50KShjaGlwLT5uZWVkX3JlbGVhc2UpKTsKKwkJUlRTWF9ERUJVR1AoImNoaXAtPm5lZWRfcmVsZWFzZSA9IDB4JXhcbiIsCisJCQkJKHVuc2lnbmVkIGludCkoY2hpcC0+bmVlZF9yZWxlYXNlKSk7CiAKICNpZmRlZiBTVVBQT1JUX09DUAogCQlpZiAoY2hpcC0+bmVlZF9yZWxlYXNlKSB7CkBAIC01ODgsOCArNTk1LDEwIEBACiAKIAkJCXJlbGVhc2VfeGRfY2FyZChjaGlwKTsKIAotCQkJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpICYmIENIRUNLX0JBUk9fUEtHKGNoaXAsIFFGTikpCi0JCQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBIT1NUX1NMRUVQX1NUQVRFLCAweEMwLCAweEMwKTsKKwkJCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSAmJgorCQkJCQlDSEVDS19CQVJPX1BLRyhjaGlwLCBRRk4pKQorCQkJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgSE9TVF9TTEVFUF9TVEFURSwKKwkJCQkJCTB4QzAsIDB4QzApOwogCQl9CiAKIAkJaWYgKGNoaXAtPm5lZWRfcmVsZWFzZSAmIE1TX0NBUkQpIHsKQEAgLTYxMCwxMyArNjE5LDE1IEBACiAJfQogCiAJaWYgKGNoaXAtPm5lZWRfcmVzZXQpIHsKLQkJUlRTWF9ERUJVR1AoImNoaXAtPm5lZWRfcmVzZXQgPSAweCV4XG4iLCAodW5zaWduZWQgaW50KShjaGlwLT5uZWVkX3Jlc2V0KSk7CisJCVJUU1hfREVCVUdQKCJjaGlwLT5uZWVkX3Jlc2V0ID0gMHgleFxuIiwKKwkJCQkodW5zaWduZWQgaW50KShjaGlwLT5uZWVkX3Jlc2V0KSk7CiAKIAkJcnRzeF9yZXNldF9jYXJkcyhjaGlwKTsKIAl9CiAKIAlpZiAoY2hpcC0+bmVlZF9yZWluaXQpIHsKLQkJUlRTWF9ERUJVR1AoImNoaXAtPm5lZWRfcmVpbml0ID0gMHgleFxuIiwgKHVuc2lnbmVkIGludCkoY2hpcC0+bmVlZF9yZWluaXQpKTsKKwkJUlRTWF9ERUJVR1AoImNoaXAtPm5lZWRfcmVpbml0ID0gMHgleFxuIiwKKwkJCQkodW5zaWduZWQgaW50KShjaGlwLT5uZWVkX3JlaW5pdCkpOwogCiAJCXJ0c3hfcmVpbml0X2NhcmRzKGNoaXAsIDApOwogCX0KQEAgLTYyNCw3ICs2MzUsNyBAQAogCiBzdGF0aWMgaW5saW5lIHU4IGRvdWJsZV9kZXB0aCh1OCBkZXB0aCkKIHsKLQlyZXR1cm4gKChkZXB0aCA+IDEpID8gKGRlcHRoIC0gMSkgOiBkZXB0aCk7CisJcmV0dXJuIChkZXB0aCA+IDEpID8gKGRlcHRoIC0gMSkgOiBkZXB0aDsKIH0KIAogaW50IHN3aXRjaF9zc2NfY2xvY2soc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgaW50IGNsaykKQEAgLTY0MSw3ICs2NTIsOCBAQAogCW1heF9OID0gMTIwOwogCW1heF9kaXYgPSBDTEtfRElWXzQ7CiAKLQlSVFNYX0RFQlVHUCgiU3dpdGNoIFNTQyBjbG9jayB0byAlZE1IeiAoY3VyX2NsayA9ICVkKVxuIiwgY2xrLCBjaGlwLT5jdXJfY2xrKTsKKwlSVFNYX0RFQlVHUCgiU3dpdGNoIFNTQyBjbG9jayB0byAlZE1IeiAoY3VyX2NsayA9ICVkKVxuIiwKKwkJCWNsaywgY2hpcC0+Y3VyX2Nsayk7CiAKIAlpZiAoKGNsayA8PSAyKSB8fCAoTiA+IG1heF9OKSkKIAkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKQEAgLTY3Niw4ICs2ODgsMTAgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0RJVl9OXzAsIDB4RkYsIE4pOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTU0NfQ1RMMSwgU1NDX1JTVEIsIFNTQ19SU1RCKTsKIAlpZiAoc2RfdnBjbGtfcGhhc2VfcmVzZXQpIHsKLQkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1ZQQ0xLMF9DVEwsIFBIQVNFX05PVF9SRVNFVCwgMCk7Ci0JCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsIFBIQVNFX05PVF9SRVNFVCk7CisJCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLAorCQkJUEhBU0VfTk9UX1JFU0VULCAwKTsKKwkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1ZQQ0xLMF9DVEwsCisJCQlQSEFTRV9OT1RfUkVTRVQsIFBIQVNFX05PVF9SRVNFVCk7CiAJfQogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCBXQUlUX1RJTUUpOwpAQCAtNzg2LDggKzgwMCwxMCBAQAogCiAJaWYgKHNkX3ZwY2xrX3BoYXNlX3Jlc2V0KSB7CiAJCXVkZWxheSgyMDApOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsIFBIQVNFX05PVF9SRVNFVCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQQ0xLMV9DVEwsIFBIQVNFX05PVF9SRVNFVCwgUEhBU0VfTk9UX1JFU0VUKTsKKwkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEswX0NUTCwgUEhBU0VfTk9UX1JFU0VULAorCQkJCVBIQVNFX05PVF9SRVNFVCk7CisJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQQ0xLMV9DVEwsIFBIQVNFX05PVF9SRVNFVCwKKwkJCQlQSEFTRV9OT1RfUkVTRVQpOwogCQl1ZGVsYXkoMjAwKTsKIAl9CiAJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX0NUTCwgMHhGRiwgMCk7CkBAIC03OTcsNyArODEzLDggQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLXZvaWQgdHJhbnNfZG1hX2VuYWJsZShlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUzMiBieXRlX2NudCwgdTggcGFja19zaXplKQordm9pZCB0cmFuc19kbWFfZW5hYmxlKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKKwkJdTMyIGJ5dGVfY250LCB1OCBwYWNrX3NpemUpCiB7CiAJaWYgKHBhY2tfc2l6ZSA+IERNQV8xMDI0KQogCQlwYWNrX3NpemUgPSBETUFfNTEyOwpAQCAtODEwLDEwICs4MjcsMTIgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgRE1BVEMwLCAweEZGLCAodTgpYnl0ZV9jbnQpOwogCiAJaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKLQkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIERNQUNUTCwgMHgwMyB8IERNQV9QQUNLX1NJWkVfTUFTSywKKwkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIERNQUNUTCwKKwkJCTB4MDMgfCBETUFfUEFDS19TSVpFX01BU0ssCiAJCQkgICAgIERNQV9ESVJfRlJPTV9DQVJEIHwgRE1BX0VOIHwgcGFja19zaXplKTsKIAl9IGVsc2UgewotCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgRE1BQ1RMLCAweDAzIHwgRE1BX1BBQ0tfU0laRV9NQVNLLAorCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgRE1BQ1RMLAorCQkJMHgwMyB8IERNQV9QQUNLX1NJWkVfTUFTSywKIAkJCSAgICAgRE1BX0RJUl9UT19DQVJEIHwgRE1BX0VOIHwgcGFja19zaXplKTsKIAl9CiAKQEAgLTkwMyw3ICs5MjIsOCBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotaW50IGNhcmRfcncoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MzIgc2VjX2FkZHIsIHUxNiBzZWNfY250KQoraW50IGNhcmRfcncoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLAorCXUzMiBzZWNfYWRkciwgdTE2IHNlY19jbnQpCiB7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKQEAgLTkyMSw3ICs5NDEsOCBAQAogCQkJCXJ0c3hfcmVsZWFzZV9jaGlwKGNoaXApOwogCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CiAJCQl9Ci0JCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgY2hpcC0+Y3VyX2NhcmQpICE9IFNUQVRVU19TVUNDRVNTKQorCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIGNoaXAtPmN1cl9jYXJkKSAhPQorCQkJCQkJCVNUQVRVU19TVUNDRVNTKQogCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CiAKIAkJCWlmICghY2hpcC0+cndfbmVlZF9yZXRyeSkgewpAQCAtMTAxNiw3ICsxMDM3LDggQEAKIHZvaWQgdHVybl9vbl9sZWQoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggZ3BpbykKIHsKIAlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpCi0JCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAodTgpKDEgPDwgZ3BpbyksICh1OCkoMSA8PCBncGlvKSk7CisJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAodTgpKDEgPDwgZ3BpbyksCisJCQkJKHU4KSgxIDw8IGdwaW8pKTsKIAllbHNlCiAJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAodTgpKDEgPDwgZ3BpbyksIDApOwogfQpAQCAtMTAyNiw3ICsxMDQ4LDggQEAKIAlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpCiAJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAodTgpKDEgPDwgZ3BpbyksIDApOwogCWVsc2UKLQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sICh1OCkoMSA8PCBncGlvKSwgKHU4KSgxIDw8IGdwaW8pKTsKKwkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sICh1OCkoMSA8PCBncGlvKSwKKwkJCQkodTgpKDEgPDwgZ3BpbykpOwogfQogCiBpbnQgZGV0ZWN0X2NhcmRfY2Qoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgaW50IGNhcmQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCmluZGV4IDM4MmU3M2EuLmJiZmE2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCkBAIC0yODY3LDcgKzI4NjcsNyBAQAogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQotCWlmICgoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkpIHsKKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KQEAgLTI5ODMsNyArMjk4Myw3IEBACiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9Ci0JaWYgKChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBTRF9DQVJEKSkgeworCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBTRF9DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQpAQCAtMzA0Niw3ICszMDQ2LDcgQEAKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOwogCX0KLQlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpKSB7CisJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9CkBAIC0zMTUxLDcgKzMxNTEsNyBAQAogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfUFJPVEVDVCk7CiAJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKIAl9Ci0JaWYgKChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSkgeworCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwogCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmMKaW5kZXggOTdiN2IwMS4uNjk0ZDM4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5jCkBAIC02MjUsOCArNjI1LDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJ0c3hfdHJhbnNmZXJfYnVmKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGNhcmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpciwgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHJ0c3hfdHJhbnNmZXJfYnVmKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGNhcmQsIHZvaWQgKmJ1ZiwKKwkJc2l6ZV90IGxlbiwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpciwgaW50IHRpbWVvdXQpCiB7CiAJc3RydWN0IHJ0c3hfZGV2ICpydHN4ID0gY2hpcC0+cnRzeDsKIAlzdHJ1Y3QgY29tcGxldGlvbiB0cmFuc19kb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDVlNzg0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotY29uZmlnIFNCMTA1WAotCXRyaXN0YXRlICJTeXN0ZW1CYXNlIFBDSSBNdWx0aXBvcnQgVUFSVCIKLQlzZWxlY3QgU0VSSUFMX0NPUkUKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgVFRZICYmIEJST0tFTgotCWhlbHAKLQkgIEEgZHJpdmVyIGZvciB0aGUgU3lzdGVtQmFzZSBNdWx0aS0yL1BDSSBzZXJpYWwgY2FyZAotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCAic2IxMDV4Ii4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWJmMzc3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW9iai0kKENPTkZJR19TQjEwNVgpICs9CXNiMTA1eC5vCi0KLXNiMTA1eC15IDo9ICBzYl9wY2lfbXAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9tcF9yZWdpc3Rlci5oIGIvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9tcF9yZWdpc3Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzZjMWJiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYjEwNXgvc2JfbXBfcmVnaXN0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0KLS8qCi0gKiBTQjEwNVhfVUFSVC5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IHN5c3RlbWJhc2UKLSAqCi0gKiBVQVJUIHJlZ2lzdGVycy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgVUFSVF9TQjEwNVhfSAotI2RlZmluZSBVQVJUX1NCMTA1WF9ICi0KLS8qCi0gKiBvcHRpb24gcmVnaXN0ZXIKLSAqLwotCi0vKiBEZXZpY2UgSW5mb3JtYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVBfT1BUUl9ESVIwCQkweDA0IAkvKiBwb3J0MCB+IHBvcnQ4ICovCi0jZGVmaW5lIE1QX09QVFJfRElSMQkJMHgwNSAJLyogcG9ydDggfiBwb3J0MTUgKi8KLSNkZWZpbmUgTVBfT1BUUl9ESVIyCQkweDA2IAkvKiBwb3J0MTYgfiBwb3J0MjMgKi8KLSNkZWZpbmUgTVBfT1BUUl9ESVIzCQkweDA3IAkvKiBwb3J0MjQgfiBwb3J0MzEgKi8KLQotI2RlZmluZSBESVJfVUFSVF8xNkM1NTAgCTAKLSNkZWZpbmUgRElSX1VBUlRfMTZDMTA1MAkxCi0jZGVmaW5lIERJUl9VQVJUXzE2QzEwNTBBCTIKLQotI2RlZmluZQlESVJfQ0xLXzE4NDMyMDAJCTB4MAkJLyogaW5wdXQgY2xvY2sgMTg0MzIwMCBIeiAqLwotI2RlZmluZQlESVJfQ0xLXzM2ODY0MDAJCTB4MQkJLyogaW5wdXQgY2xvY2sgMzY4NjQwMCBIeiAqLwotI2RlZmluZQlESVJfQ0xLXzczNzI4MDAJCTB4MgkJLyogaW5wdXQgY2xvY2sgNzM3MjgwMCBIeiAqLwotI2RlZmluZQlESVJfQ0xLXzE0NzQ1NjAwCTB4MwkJLyogaW5wdXQgY2xvY2sgMTQ3NDU2MDAgSHogKi8KLSNkZWZpbmUJRElSX0NMS18yOTQ5MTIwMAkweDQJCS8qIGlucHV0IGNsb2NrIDI5NDkxMjAwIEh6ICovCi0jZGVmaW5lCURJUl9DTEtfNTg5ODU0MDAJMHg1CQkvKiBpbnB1dCBjbG9jayA1ODk4NTQwMCBIeiAqLwotCi0vKiBJbnRlcmZhY2UgSW5mb3JtYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVBfT1BUUl9JSVIwCQkweDA4IAkvKiBwb3J0MCB+IHBvcnQ4ICovCi0jZGVmaW5lIE1QX09QVFJfSUlSMQkJMHgwOSAJLyogcG9ydDggfiBwb3J0MTUgKi8KLSNkZWZpbmUgTVBfT1BUUl9JSVIyCQkweDBBIAkvKiBwb3J0MTYgfiBwb3J0MjMgKi8KLSNkZWZpbmUgTVBfT1BUUl9JSVIzCQkweDBCIAkvKiBwb3J0MjQgfiBwb3J0MzEgKi8KLQotI2RlZmluZSBJSVJfUlMyMzIJCTB4MDAJCS8qIFJTMjMyIHR5cGUgKi8KLSNkZWZpbmUgSUlSX1JTNDIyCQkweDEwCQkvKiBSUzQyMiB0eXBlICovCi0jZGVmaW5lIElJUl9SUzQ4NQkJMHgyMAkJLyogUlM0ODUgdHlwZSAqLwotI2RlZmluZSBJSVJfVFlQRV9NQVNLCQkweDMwCi0KLS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1QX09QVFJfSU1SMAkJMHgwQyAJLyogcG9ydDAgfiBwb3J0OCAqLwotI2RlZmluZSBNUF9PUFRSX0lNUjEJCTB4MEQgCS8qIHBvcnQ4IH4gcG9ydDE1ICovCi0jZGVmaW5lIE1QX09QVFJfSU1SMgkJMHgwRSAJLyogcG9ydDE2IH4gcG9ydDIzICovCi0jZGVmaW5lIE1QX09QVFJfSU1SMwkJMHgwRiAJLyogcG9ydDI0IH4gcG9ydDMxICovCi0KLS8qIEludGVycnVwdCBQb2xsIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1QX09QVFJfSVBSMAkJMHgxMCAJLyogcG9ydDAgfiBwb3J0OCAqLwotI2RlZmluZSBNUF9PUFRSX0lQUjEJCTB4MTEgCS8qIHBvcnQ4IH4gcG9ydDE1ICovCi0jZGVmaW5lIE1QX09QVFJfSVBSMgkJMHgxMiAJLyogcG9ydDE2IH4gcG9ydDIzICovCi0jZGVmaW5lIE1QX09QVFJfSVBSMwkJMHgxMyAJLyogcG9ydDI0IH4gcG9ydDMxICovCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBPdXRwdXQgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBNUF9PUFRSX0dQT0NSCQkweDIwCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBPdXRwdXQgRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZSBNUF9PUFRSX0dQT0RSCQkweDIxCi0KLS8qIFBhcmFsbGVsIEFkZGl0aW9uYWwgRnVuY3Rpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVBfT1BUUl9QQUZSCQkweDIzCi0KLS8qCi0gKiBzeXN0ZW1iYXNlIDE2YzEwNXggVUFSVCByZWdpc3RlcgotICovCi0KLSNkZWZpbmUgUEFHRV8wIDAKLSNkZWZpbmUgUEFHRV8xIDEKLSNkZWZpbmUgUEFHRV8yIDIKLSNkZWZpbmUgUEFHRV8zIDMKLSNkZWZpbmUgUEFHRV80IDQKLQotLyoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAqIERMQUI9MCAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PSAgICAgICBQYWdlIDAgUmVnaXN0ZXJzICoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jZGVmaW5lIFNCMTA1WF9SWAkJMAkvKiBJbjogIFJlY2VpdmUgYnVmZmVyICovCi0jZGVmaW5lIFNCMTA1WF9UWAkJMAkvKiBPdXQ6IFRyYW5zbWl0IGJ1ZmZlciAqLwotCi0jZGVmaW5lIFNCMTA1WF9JRVIJCTEJLyogT3V0OiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgU0IxMDVYX0lFUl9DVFNJCSAgCTB4ODAJLyogQ1RTIyBJbnRlcnJ1cHQgRW5hYmxlIChSZXF1aXJlcyBFRlJbNF0gPSAxKSAqLwotI2RlZmluZSBTQjEwNVhfSUVSX1JUU0kJICAJMHg0MAkvKiBSVFMjIEludGVycnVwdCBFbmFibGUgKFJlcXVpcmVzIEVGUls0XSA9IDEpICovCi0jZGVmaW5lIFNCMTA1WF9JRVJfWE9JCSAgCTB4MjAJLyogWG9mZiBJbnRlcnJ1cHQgRW5hYmxlIChSZXF1aXJlcyBFRlJbNF0gPSAxKSAqLwotI2RlZmluZSBTQjEwNVhfSUVSX1NNRQkgIAkweDEwCS8qIFNsZWVwIE1vZGUgRW5hYmxlIChSZXF1aXJlcyBFRlJbNF0gPSAxKSAqLwotI2RlZmluZSBTQjEwNVhfSUVSX01TSQkgIAkweDA4CS8qIEVuYWJsZSBNb2RlbSBzdGF0dXMgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNCMTA1WF9JRVJfUkxTSQkgIAkweDA0CS8qIEVuYWJsZSByZWNlaXZlciBsaW5lIHN0YXR1cyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0IxMDVYX0lFUl9USFJJCSAgCTB4MDIJLyogRW5hYmxlIFRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgaW50LiAqLwotI2RlZmluZSBTQjEwNVhfSUVSX1JESQkgIAkweDAxCS8qIEVuYWJsZSByZWNlaXZlciBkYXRhIGludGVycnVwdCAqLwotCi0jZGVmaW5lIFNCMTA1WF9JU1IJCTIJLyogSW46ICBJbnRlcnJ1cHQgSUQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBTQjEwNVhfSVNSX05PSU5UCTB4MDEJLyogTm8gaW50ZXJydXB0cyBwZW5kaW5nICovCi0jZGVmaW5lIFNCMTA1WF9JU1JfUkxTSQkgIAkweDA2CS8qIFJlY2VpdmVyIGxpbmUgc3RhdHVzIGludGVycnVwdCAoUHJpb3JpdHkgPSAxKSovCi0jZGVmaW5lIFNCMTA1WF9JU1JfUkRBSQkgIAkweDBjCS8qIFJlY2VpdmUgRGF0YSBBdmFpbGFibGUgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNCMTA1WF9JU1JfQ1RJSQkgIAkweDA0CS8qIENoYXJhY3RlciBUaW1lb3V0IEluZGljYXRpb24gaW50ZXJydXB0ICovCi0jZGVmaW5lIFNCMTA1WF9JU1JfVEhSSQkgIAkweDAyCS8qIFRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKi8KLSNkZWZpbmUgU0IxMDVYX0lTUl9NU0kJICAJMHgwMAkvKiBNb2RlbSBzdGF0dXMgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNCMTA1WF9JU1JfUlhDSQkgIAkweDEwCS8qIFJlY2VpdmUgWG9mZiBvciBTcGVjaWFsIENoYXJhY3RlciBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0IxMDVYX0lTUl9SQ1NJCSAgCTB4MjAJLyogUlRTIywgQ1RTIyBzdGF0dXMgaW50ZXJydXB0IGR1cmluZyBBdXRvIFJUUy9DVFMgZmxvdyBjb250cm9sICovCi0KLSNkZWZpbmUgU0IxMDVYX0ZDUgkJMgkvKiBPdXQ6IEZJRk8gQ29udHJvbCBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFNCMTA1WF9GQ1JfRkVOICAgIAkweDAxCS8qIEZJRk8gRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfUlhGUgkgIAkweDAyCS8qIFJYIEZJRk8gUmVzZXQgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9UWEZSCSAgCTB4MDQJLyogVFggRklGTyBSZXNldCAqLwotI2RlZmluZSBTQjEwNVhfRkNSX0RNUwkgIAkweDA4CS8qIERNQSBNb2RlIFNlbGVjdCAqLwotCi0jZGVmaW5lIFNCMTA1WF9GQ1JfUlRSMDggIAkweDAwICAvKiBSZWNlaXZlIFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDggKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9SVFIxNiAgCTB4NDAgIC8qIFJlY2VpdmUgVHJpZ2dlciBMZXZlbCBzZXQgYXQgMTYgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9SVFI1NiAgCTB4ODAgIC8qIFJlY2VpdmUgVHJpZ2dlciBMZXZlbCBzZXQgYXQgNTYgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9SVFI2MCAgCTB4YzAgIC8qIFJlY2VpdmUgVHJpZ2dlciBMZXZlbCBzZXQgYXQgNjAgKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9UVFIwOCAgCTB4MDAgIC8qIFRyYW5zbWl0IFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDggKi8KLSNkZWZpbmUgU0IxMDVYX0ZDUl9UVFIxNgkweDEwICAvKiBUcmFuc21pdCBUcmlnZ2VyIExldmVsIHNldCBhdCAxNiAqLwotI2RlZmluZSBTQjEwNVhfRkNSX1RUUjMyCTB4MjAgIC8qIFRyYW5zbWl0IFRyaWdnZXIgTGV2ZWwgc2V0IGF0IDMyICovCi0jZGVmaW5lIFNCMTA1WF9GQ1JfVFRSNTYJMHgzMCAgLyogVHJhbnNtaXQgVHJpZ2dlciBMZXZlbCBzZXQgYXQgNTYgKi8KLQotI2RlZmluZSBTQjEwNVhfTENSCQkzCS8qIE91dDogTGluZSBDb250cm9sIFJlZ2lzdGVyICovCi0vKgotICogICogTm90ZTogaWYgdGhlIHdvcmQgbGVuZ3RoIGlzIDUgYml0cyAoU0IxMDVYX0xDUl9XTEVONSksIHRoZW4gc2V0dGluZyAKLSAqICAqIFNCMTA1WF9MQ1JfU1RPUCB3aWxsIHNlbGVjdCAxLjUgc3RvcCBiaXRzLCBub3QgMiBzdG9wIGJpdHMuCi0gKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9ETEFCICAgCTB4ODAgIC8qIERpdmlzb3IgTGF0Y2ggRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfU0JDICAgIAkweDQwICAvKiBCcmVhayBFbmFibGUqLwotI2RlZmluZSBTQjEwNVhfTENSX1NQQVIgICAJMHgyMCAgLyogU2V0IFN0aWNrIHBhcml0eSAqLwotI2RlZmluZSBTQjEwNVhfTENSX0VQQVIgICAJMHgxMCAgLyogRXZlbiBwYXJpdHkgc2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfUEFSRU4gIAkweDA4ICAvKiBQYXJpdHkgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfU1RPUCAgIAkweDA0ICAvKiBTdG9wIGJpdHM6IDAtPjEgYml0LCAxLT4yIGJpdHMsIDEgYW5kIFNCMTA1WF9MQ1JfV0xFTjUgLT4gMS41IGJpdCAqLwotI2RlZmluZSBTQjEwNVhfTENSX1dMRU41ICAJMHgwMCAgLyogV29yZGxlbmd0aDogNSBiaXRzICovCi0jZGVmaW5lIFNCMTA1WF9MQ1JfV0xFTjYgIAkweDAxICAvKiBXb3JkbGVuZ3RoOiA2IGJpdHMgKi8KLSNkZWZpbmUgU0IxMDVYX0xDUl9XTEVONyAgCTB4MDIgIC8qIFdvcmRsZW5ndGg6IDcgYml0cyAqLwotI2RlZmluZSBTQjEwNVhfTENSX1dMRU44ICAJMHgwMyAgLyogV29yZGxlbmd0aDogOCBiaXRzICovCi0KLSNkZWZpbmUgU0IxMDVYX0xDUl9CRgkJMHhCRgotCi0jZGVmaW5lIFNCMTA1WF9NQ1IJCTQJLyogT3V0OiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfQ1BTICAgIAkweDgwICAvKiBDbG9jayBQcmVzY2FsZXIgU2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfUDJTICAgIAkweDQwICAvKiBQYWdlIDIgU2VsZWN0IC9Yb2ZmIFJlLVRyYW5zbWl0IEFjY2VzcyBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9YT0EgICAgCTB4MjAgIC8qIFhvbiBBbnkgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfSUxCCQkweDEwICAvKiBJbnRlcm5hbCBMb29wYmFjayBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9PVVQyCQkweDA4ICAvKiBPdXQyL0ludGVycnVwdCBPdXRwdXQgRW5hYmxlKi8KLSNkZWZpbmUgU0IxMDVYX01DUl9PVVQxCQkweDA0ICAvKiBPdXQxL0ludGVycnVwdCBPdXRwdXQgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9NQ1JfUlRTICAgIAkweDAyICAvKiBSVFMjIE91dHB1dCAqLwotI2RlZmluZSBTQjEwNVhfTUNSX0RUUiAgICAJMHgwMSAgLyogRFRSIyBPdXRwdXQgKi8KLQotI2RlZmluZSBTQjEwNVhfTFNSCQk1CS8qIEluOiAgTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0xTUl9SRkVJICAgCTB4ODAgIC8qIFJlY2VpdmUgRklGTyBkYXRhIGVycm9yIEluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX1RFTUkgICAJMHg0MCAgLyogVEhSIGFuZCBUU1IgRW1wdHkgSW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfVEhSRQkJMHgyMCAgLyogVEhSIEVtcHR5IEluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX0JJSQkJMHgxMCAgLyogQnJlYWsgaW50ZXJydXB0IGluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX0ZFSQkJMHgwOCAgLyogRnJhbWUgZXJyb3IgaW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfUEVJCQkweDA0ICAvKiBQYXJpdHkgZXJyb3IgaW5kaWNhdG9yICovCi0jZGVmaW5lIFNCMTA1WF9MU1JfT0VJCQkweDAyICAvKiBPdmVycnVuIGVycm9yIGluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTFNSX1JEUkkJCTB4MDEgIC8qIFJlY2VpdmUgZGF0YSByZWFkeSBJbmRpY2F0b3IqLwotCi0jZGVmaW5lIFNCMTA1WF9NU1IJCTYJLyogSW46ICBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9EQ0QJCTB4ODAgIC8qIERhdGEgQ2FycmllciBEZXRlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9SSQkJMHg0MCAgLyogUmluZyBJbmRpY2F0b3IgKi8KLSNkZWZpbmUgU0IxMDVYX01TUl9EU1IJCTB4MjAgIC8qIERhdGEgU2V0IFJlYWR5ICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfQ1RTCQkweDEwICAvKiBDbGVhciB0byBTZW5kICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfRERDRAkJMHgwOCAgLyogRGVsdGEgRENEICovCi0jZGVmaW5lIFNCMTA1WF9NU1JfRFJJCQkweDA0ICAvKiBEZWx0YSByaW5nIGluZGljYXRvciAqLwotI2RlZmluZSBTQjEwNVhfTVNSX0REU1IJCTB4MDIgIC8qIERlbHRhIERTUiAqLwotI2RlZmluZSBTQjEwNVhfTVNSX0RDVFMJCTB4MDEgIC8qIERlbHRhIENUUyAqLwotCi0jZGVmaW5lIFNCMTA1WEFfTURSCQk2CS8qIE91dDogTXVsdGkgRHJvcCBtb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WEFfTURSX05QUwkJMHgwOCAgLyogOXRoIEJpdCBQb2xhcml0eSBTZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYQV9NRFJfQU1FCQkweDAyICAvKiBBdXRvIE11bHRpLWRyb3AgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WEFfTURSX01ERQkJMHgwMSAgLyogTXVsdGkgRHJvcCBFbmFibGUgKi8KLQotI2RlZmluZSBTQjEwNVhfU1BSCQk3CS8qIEkvTzogU2NyYXRjaCBSZWdpc3RlciAqLwotCi0vKgotICogRExBQj0xCi0gKi8KLSNkZWZpbmUgU0IxMDVYX0RMTAkJMAkvKiBPdXQ6IERpdmlzb3IgTGF0Y2ggTG93ICovCi0jZGVmaW5lIFNCMTA1WF9ETE0JCTEJLyogT3V0OiBEaXZpc29yIExhdGNoIEhpZ2ggKi8KLQotLyoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAqIERMQUIoTENSWzddKSA9IDAgLCBNQ1JbNl0gPSAxICA9PT09PT09PT09PT09ICBQYWdlIDIgUmVnaXN0ZXJzICoKLSAqICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBTQjEwNVhfR0lDUgkJMQkvKiBHbG9iYWwgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX0dJQ1JfR0lNICAgCTB4MDEgIC8qIEdsb2JhbCBJbnRlcnJ1cHQgTWFzayAqLwotCi0jZGVmaW5lIFNCMTA1WF9HSVNSCQkyCS8qIEdsb2JhbCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9HSVNSX01HSUNSMCAgCTB4ODAgIC8qIE1pcnJvciB0aGUgY29udGVudCBvZiBHSUNSWzBdICovCi0jZGVmaW5lIFNCMTA1WF9HSVNSX0NTM0lTICAgCTB4MDggIC8qIFNCMTA1WCBvZiBDUzMjIEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX0dJU1JfQ1MySVMgICAJMHgwNCAgLyogU0IxMDVYIG9mIENTMiMgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfR0lTUl9DUzFJUyAgIAkweDAyICAvKiBTQjEwNVggb2YgQ1MxIyBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9HSVNSX0NTMElTICAgCTB4MDEgIC8qIFNCMTA1WCBvZiBDUzAjIEludGVycnVwdCBTdGF0dXMgKi8KLQotI2RlZmluZSBTQjEwNVhfVEZDUgkJNQkvKiBUcmFuc21pdCBGSUZPIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgU0IxMDVYX1JGQ1IJCTYJLyogUmVjZWl2ZSBGSUZPIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJU0IxMDVYX0ZTUgkJNwkvKiBGbG93IENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9GU1JfVEhGUyAgICAgCTB4MjAgIC8qIFRyYW5zbWl0IEhhcmR3YXJlIEZsb3cgQ29udHJvbCBTdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX0ZTUl9UU0ZTICAgICAJMHgxMCAgLyogVHJhbnNtaXQgU29mdHdhcmUgRmxvdyBDb250cm9sIFN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfRlNSX1JIRlMgICAgIAkweDAyICAvKiBSZWNlaXZlIEhhcmR3YXJlIEZsb3cgQ29udHJvbCBTdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX0ZTUl9SU0ZTICAgICAJMHgwMSAgLyogUmVjZWl2ZSBTb2Z0d2FyZSBGbG93IENvbnRyb2wgU3RhdHVzICovCi0KLS8qCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgKiBMQ1IgPSAweEJGLCBQU1JbMF0gPSAwICAgICAgID09PT09PT09PT09PT0gICAgUGFnZSAzIFJlZ2lzdGVycyAqCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2RlZmluZSBTQjEwNVhfUFNSCQkwCS8qIFBhZ2UgU2VsZWN0IFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9QU1JfUDNLRVkgICAgCTB4QTQgLyogUGFnZSAzIFNlbGVjdCBLZXkgKi8KLSNkZWZpbmUgU0IxMDVYX1BTUl9QNEtFWSAgICAJMHhBNSAvKiBQYWdlIDUgU2VsZWN0IEtleSAqLwotCi0jZGVmaW5lIFNCMTA1WF9BVFIJCTEJLyogQXV0byBUb2dnbGUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfQVRSX1JQUyAgICAgIAkweDgwICAvKiBSWEVOIFBvbGFyaXR5IFNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhfQVRSX1JDTVMgICAgIAkweDQwICAvKiBSWEVOIENvbnRyb2wgTW9kZSBTZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9UUFMgICAgICAJMHgyMCAgLyogVFhFTiBQb2xhcml0eSBTZWxlY3QgKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9UQ01TICAgICAJMHgxMCAgLyogVFhFTiBDb250cm9sIE1vZGUgU2VsZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfQVRESVMgICAgCTB4MDAgIC8qIEF1dG8gVG9nZ2xlIGlzIGRpc2FibGVkICovCi0jZGVmaW5lIFNCMTA1WF9BVFJfQVJUICAgICAgCTB4MDEgIC8qIFJUUyMvVFhFTiBwaW4gb3BlcmF0ZXMgYXMgVFhFTiAqLwotI2RlZmluZSBTQjEwNVhfQVRSX0FEVCAgICAgIAkweDAyICAvKiBEVFIjL1RYRU4gcGluIG9wZXJhdGVzIGFzIFRYRU4gKi8KLSNkZWZpbmUgU0IxMDVYX0FUUl9BODAgICAgICAJMHgwMyAgLyogb25seSBpbiA4MCBwaW4gdXNlICovCi0KLSNkZWZpbmUgU0IxMDVYX0VGUgkJMgkvKiAoQXV0bykgRW5oYW5jZWQgRmVhdHVyZSBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfRUZSX0FDVFMgICAgIAkweDgwICAvKiBBdXRvLUNUUyBGbG93IENvbnRyb2wgRW5hYmxlICovCi0jZGVmaW5lIFNCMTA1WF9FRlJfQVJUUyAgICAgCTB4NDAgIC8qIEF1dG8tUlRTIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KLSNkZWZpbmUgU0IxMDVYX0VGUl9TQ0QgICAgICAJMHgyMCAgLyogU3BlY2lhbCBDaGFyYWN0ZXIgRGV0ZWN0ICovCi0jZGVmaW5lIFNCMTA1WF9FRlJfRUZCRU4gICAgCTB4MTAgIC8qIEVuaGFuY2VkIEZ1bmN0aW9uIEJpdHMgRW5hYmxlICovCi0KLSNkZWZpbmUgU0IxMDVYX1hPTjEJCTQJLyogWG9uMSBDaGFyYWN0ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX1hPTjIJCTUJLyogWG9uMiBDaGFyYWN0ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX1hPRkYxCQk2CS8qIFhvZmYxIENoYXJhY3RlciBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfWE9GRjIJCTcJLyogWG9mZjIgQ2hhcmFjdGVyIFJlZ2lzdGVyICovCi0KLS8qCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgKiBMQ1IgPSAweEJGLCBQU1JbMF0gPSAxICAgICAgID09PT09PT09PT09PSAgICAgUGFnZSA0IFJlZ2lzdGVycyAqCi0gKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2RlZmluZSBTQjEwNVhfQUZSCQkxCS8qIEFkZGl0aW9uYWwgRmVhdHVyZSBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfQUZSX0dJUFMgICAgIAkweDIwICAvKiBHbG9iYWwgSW50ZXJydXB0IFBvbGFyaXR5IFNlbGVjdCAqLwotI2RlZmluZSBTQjEwNVhfQUZSX0dJRU4gICAgIAkweDEwICAvKiBHbG9iYWwgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBTQjEwNVhfQUZSX0FGRU4gICAgIAkweDAxICAvKiAyNTYtYnl0ZSBGSUZPIEVuYWJsZSAqLwotCi0jZGVmaW5lIFNCMTA1WF9YUkNSCQkyCS8qIFhvZmYgUmUtdHJhbnNtaXQgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0IxMDVYX1hSQ1JfTlJDMSAgICAJMHgwMCAgLyogVHJhbnNtaXRzIFhvZmYgQ2hhcmFjdGVyIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZGF0YSBpcyAxIGR1cmluZyBYT0ZGIHN0YXR1cyAqLwotI2RlZmluZSBTQjEwNVhfWFJDUl9OUkM0ICAgIAkweDAxICAvKiBUcmFuc21pdHMgWG9mZiBDaGFyYWN0ZXIgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiByZWNlaXZlZCBkYXRhIGlzIDQgZHVyaW5nIFhPRkYgc3RhdHVzICovCi0jZGVmaW5lIFNCMTA1WF9YUkNSX05SQzggICAgCTB4MDIgIC8qIFRyYW5zbWl0cyBYb2ZmIENoYXJhY3RlciB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGRhdGEgaXMgOCBkdXJpbmcgWE9GRiBzdGF0dXMgKi8KLSNkZWZpbmUgU0IxMDVYX1hSQ1JfTlJDMTYgICAJMHgwMyAgLyogVHJhbnNtaXRzIFhvZmYgQ2hhcmFjdGVyIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZGF0YSBpcyAxNiBkdXJpbmcgWE9GRiBzdGF0dXMgKi8KLQotI2RlZmluZSBTQjEwNVhfVFRSCQk0CS8qIFRyYW5zbWl0IEZJRk8gVHJpZ2dlciBMZXZlbCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfUlRSCQk1CS8qIFJlY2VpdmUgRklGTyBUcmlnZ2VyIExldmVsIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNCMTA1WF9GVVIJCTYJLyogRmxvdyBDb250cm9sIFVwcGVyIFRocmVzaG9sZCBSZWdpc3RlciAqLwotI2RlZmluZSBTQjEwNVhfRkxSCQk3CS8qIEZsb3cgQ29udHJvbCBMb3dlciBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KLQotCi0vKiBwYWdlIDAgKi8KLQotI2RlZmluZSBTQjEwNVhfR0VUX0NIQVIocG9ydCkJaW5iKChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX1JYKQotI2RlZmluZSBTQjEwNVhfR0VUX0lFUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfSUVSKQotI2RlZmluZSBTQjEwNVhfR0VUX0lTUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfSVNSKQotI2RlZmluZSBTQjEwNVhfR0VUX0xDUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfTENSKQotI2RlZmluZSBTQjEwNVhfR0VUX01DUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfTUNSKQotI2RlZmluZSBTQjEwNVhfR0VUX0xTUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfTFNSKQotI2RlZmluZSBTQjEwNVhfR0VUX01TUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfTVNSKQotI2RlZmluZSBTQjEwNVhfR0VUX1NQUihwb3J0KQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfU1BSKQotCi0jZGVmaW5lIFNCMTA1WF9QVVRfQ0hBUihwb3J0LHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX1RYICkKLSNkZWZpbmUgU0IxMDVYX1BVVF9JRVIocG9ydCx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIFNCMTA1WF9JRVIgKQotI2RlZmluZSBTQjEwNVhfUFVUX0ZDUihwb3J0LHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX0ZDUiApCi0jZGVmaW5lIFNCMTA1WF9QVVRfTENSKHBvcnQsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyBTQjEwNVhfTENSICkKLSNkZWZpbmUgU0IxMDVYX1BVVF9NQ1IocG9ydCx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIFNCMTA1WF9NQ1IgKQotI2RlZmluZSBTQjEwNVhfUFVUX1NQUihwb3J0LHYpCW91dGIoKHYpLChwb3J0KS0+aW9iYXNlICsgU0IxMDVYX1NQUiApCi0KLQotLyogcGFnZSAxICovCi0jZGVmaW5lIFNCMTA1WF9HRVRfUkVHKHBvcnQscmVnKQlpbmIoKHBvcnQpLT5pb2Jhc2UgKyAocmVnKSkKLSNkZWZpbmUgU0IxMDVYX1BVVF9SRUcocG9ydCxyZWcsdikJb3V0YigodiksKHBvcnQpLT5pb2Jhc2UgKyAocmVnKSkKLQotLyogcGFnZSAyICovCi0KLSNkZWZpbmUgU0IxMDVYX1BVVF9QU1IocG9ydCx2KQlvdXRiKCh2KSwocG9ydCktPmlvYmFzZSArIFNCMTA1WF9QU1IgKQotCi0jZW5kaWYgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3BjaV9tcC5jIGIvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9wY2lfbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkNmVlMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3BjaV9tcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE4OSArMCwwIEBACi0jaW5jbHVkZSAic2JfcGNpX21wLmgiCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgotCi1leHRlcm4gc3RydWN0IHBhcnBvcnQgKnBhcnBvcnRfcGNfcHJvYmVfcG9ydCh1bnNpZ25lZCBsb25nIGJhc2VfbG8sCi0JCXVuc2lnbmVkIGxvbmcgYmFzZV9oaSwKLQkJaW50IGlycSwgaW50IGRtYSwKLQkJc3RydWN0IGRldmljZSAqZGV2LAotCQlpbnQgaXJxZmxhZ3MpOwotCi1zdGF0aWMgc3RydWN0IG1wX2RldmljZV90IG1wX2RldnNbTUFYX01QX0RFVl07Ci1zdGF0aWMgaW50IG1wX25ycGNpYnJkcyA9IHNpemVvZihtcF9wY2lib2FyZHMpL3NpemVvZihtcHBjaWJyZF90KTsKLXN0YXRpYyBpbnQgTlJfQk9BUkQ9MDsKLXN0YXRpYyBpbnQgTlJfUE9SVFM9MDsKLXN0YXRpYyBzdHJ1Y3QgbXBfcG9ydCBtdWx0aV9wb3J0c1tNQVhfTVBfUE9SVF07Ci1zdGF0aWMgc3RydWN0IGlycV9pbmZvIGlycV9saXN0c1tOUl9JUlFTXTsKLQotc3RhdGljIF9JTkxJTkVfIHVuc2lnbmVkIGludCBzZXJpYWxfaW4oc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCBvZmZzZXQpOwotc3RhdGljIF9JTkxJTkVfIHZvaWQgc2VyaWFsX291dChzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50IG9mZnNldCwgaW50IHZhbHVlKTsKLXN0YXRpYyBfSU5MSU5FXyB1bnNpZ25lZCBpbnQgcmVhZF9vcHRpb25fcmVnaXN0ZXIoc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCBvZmZzZXQpOwotc3RhdGljIGludCBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBwYWdlLCBpbnQgcmVnKTsKLXN0YXRpYyBpbnQgc2IxMDU0X3NldF9yZWdpc3RlcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgcGFnZSwgaW50IHJlZywgaW50IHZhbHVlKTsKLXN0YXRpYyB2b2lkIFNlbmRBVENvbW1hbmQoc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIGludCBzZXRfZGVlcF9maWZvKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBzdGF0dXMpOwotc3RhdGljIGludCBnZXRfZGVlcF9maWZvKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIGludCBnZXRfZGV2aWNlX3R5cGUoaW50IGFyZyk7Ci1zdGF0aWMgaW50IHNldF9hdXRvX3J0cyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIG1wX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBfX21wX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgbXBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBtcF90YXNrbGV0X2FjdGlvbih1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIGlubGluZSB2b2lkIG1wX3VwZGF0ZV9tY3RybChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOwotc3RhdGljIGludCBtcF9zdGFydHVwKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgaW50IGluaXRfaHcpOwotc3RhdGljIHZvaWQgbXBfc2h1dGRvd24oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKTsKLXN0YXRpYyB2b2lkIG1wX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBNUF9URVJNSU9TICpvbGRfdGVybWlvcyk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9fbXBfcHV0X2NoYXIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGNpcmNfYnVmICpjaXJjLCB1bnNpZ25lZCBjaGFyIGMpOwotc3RhdGljIGludCBtcF9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKTsKLQotc3RhdGljIHZvaWQgbXBfcHV0X2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBtcF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7Ci1zdGF0aWMgaW50IG1wX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgaW50IG1wX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIG1wX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIG1wX3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7Ci1zdGF0aWMgdm9pZCBtcF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIG1wX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgaW50IG1wX2dldF9pbmZvKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJldGluZm8pOwotc3RhdGljIGludCBtcF9zZXRfaW5mbyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpuZXdpbmZvKTsKLXN0YXRpYyBpbnQgbXBfZ2V0X2xzcl9pbmZvKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50ICp2YWx1ZSk7Ci0KLXN0YXRpYyBpbnQgbXBfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgaW50IG1wX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7Ci1zdGF0aWMgaW50IG1wX2JyZWFrX2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpOwotc3RhdGljIGludCBtcF9kb19hdXRvY29uZmlnKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSk7Ci1zdGF0aWMgaW50IG1wX3dhaXRfbW9kZW1fc3RhdHVzKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIGludCBtcF9nZXRfY291bnQoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCAqaWNudCk7Ci1zdGF0aWMgaW50IG1wX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyB2b2lkIG1wX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBNUF9URVJNSU9TICpvbGRfdGVybWlvcyk7Ci1zdGF0aWMgdm9pZCBtcF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgdm9pZCBtcF93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwotc3RhdGljIHZvaWQgbXBfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgbXBfdXBkYXRlX3Rlcm1pb3Moc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlKTsKLXN0YXRpYyBpbnQgbXBfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpOwotc3RhdGljIHN0cnVjdCBzYl91YXJ0X3N0YXRlICp1YXJ0X2dldChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgaW50IGxpbmUpOwotc3RhdGljIGludCBtcF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyBjb25zdCBjaGFyICptcF90eXBlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXBfY2hhbmdlX3BtKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgaW50IHBtX3N0YXRlKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBtcF9yZXBvcnRfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtcF9jb25maWd1cmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG1wX3VuY29uZmlndXJlX3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSk7Ci1zdGF0aWMgaW50IG1wX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydik7Ci1zdGF0aWMgdm9pZCBtcF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydik7Ci1zdGF0aWMgaW50IG1wX2FkZF9vbmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgaW50IG1wX3JlbW92ZV9vbmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBhdXRvY29uZmlnKHN0cnVjdCBtcF9wb3J0ICptdHB0LCB1bnNpZ25lZCBpbnQgcHJvYmVmbGFncyk7Ci1zdGF0aWMgdm9pZCBhdXRvY29uZmlnX2lycShzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9zdG9wX3R4KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXVsdGlfc3RhcnRfdHgoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9zdG9wX3J4KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgbXVsdGlfZW5hYmxlX21zKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIF9JTkxJTkVfIHZvaWQgcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgaW50ICpzdGF0dXMgKTsKLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyBfSU5MSU5FXyB2b2lkIGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgbXVsdGlfaGFuZGxlX3BvcnQoc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIGlycXJldHVybl90IG11bHRpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotc3RhdGljIHZvaWQgc2VyaWFsX2RvX3VubGluayhzdHJ1Y3QgaXJxX2luZm8gKmksIHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyBpbnQgc2VyaWFsX2xpbmtfaXJxX2NoYWluKHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyB2b2lkIHNlcmlhbF91bmxpbmtfaXJxX2NoYWluKHN0cnVjdCBtcF9wb3J0ICptdHB0KTsKLXN0YXRpYyB2b2lkIG11bHRpX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXVsdGlfdHhfZW1wdHkoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG11bHRpX2dldF9tY3RybChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIG11bHRpX3NldF9tY3RybChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpOwotc3RhdGljIHZvaWQgbXVsdGlfYnJlYWtfY3RsKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSk7Ci1zdGF0aWMgaW50IG11bHRpX3N0YXJ0dXAoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9zaHV0ZG93bihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXVsdGlfZ2V0X2Rpdmlzb3Ioc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGJhdWQpOwotc3RhdGljIHZvaWQgbXVsdGlfc2V0X3Rlcm1pb3Moc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgc3RydWN0IE1QX1RFUk1JT1MgKnRlcm1pb3MsIHN0cnVjdCBNUF9URVJNSU9TICpvbGQpOwotc3RhdGljIHZvaWQgbXVsdGlfcG0oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgb2xkc3RhdGUpOwotc3RhdGljIHZvaWQgbXVsdGlfcmVsZWFzZV9zdGRfcmVzb3VyY2Uoc3RydWN0IG1wX3BvcnQgKm10cHQpOwotc3RhdGljIHZvaWQgbXVsdGlfcmVsZWFzZV9wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIGludCBtdWx0aV9yZXF1ZXN0X3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBtdWx0aV9jb25maWdfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpOwotc3RhdGljIGludCBtdWx0aV92ZXJpZnlfcG9ydChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKTsKLXN0YXRpYyBjb25zdCBjaGFyICptdWx0aV90eXBlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgX19pbml0IG11bHRpX2luaXRfcG9ydHModm9pZCk7Ci1zdGF0aWMgdm9pZCBfX2luaXQgbXVsdGlfcmVnaXN0ZXJfcG9ydHMoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYpOwotc3RhdGljIGludCBpbml0X21wX2RldihzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBtcHBjaWJyZF90IGJyZCk7Ci0KLXN0YXRpYyBpbnQgZGVlcFsyNTZdOwotc3RhdGljIGludCBkZWVwX2NvdW50Owotc3RhdGljIGludCBmY3JfYXJyWzI1Nl07Ci1zdGF0aWMgaW50IGZjcl9jb3VudDsKLXN0YXRpYyBpbnQgdHRyWzI1Nl07Ci1zdGF0aWMgaW50IHR0cl9jb3VudDsKLXN0YXRpYyBpbnQgcnRyWzI1Nl07Ci1zdGF0aWMgaW50IHJ0cl9jb3VudDsKLQotbW9kdWxlX3BhcmFtX2FycmF5KGRlZXAsaW50LCZkZWVwX2NvdW50LDApOwotbW9kdWxlX3BhcmFtX2FycmF5KGZjcl9hcnIsaW50LCZmY3JfY291bnQsMCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkodHRyLGludCwmdHRyX2NvdW50LDApOwotbW9kdWxlX3BhcmFtX2FycmF5KHJ0cixpbnQsJnJ0cl9jb3VudCwwKTsKLQotc3RhdGljIF9JTkxJTkVfIHVuc2lnbmVkIGludCBzZXJpYWxfaW4oc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCBvZmZzZXQpCi17Ci0JcmV0dXJuIGluYihtdHB0LT5wb3J0LmlvYmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHNlcmlhbF9vdXQoc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlvdXRiKHZhbHVlLCBtdHB0LT5wb3J0LmlvYmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBfSU5MSU5FXyB1bnNpZ25lZCBpbnQgcmVhZF9vcHRpb25fcmVnaXN0ZXIoc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCBvZmZzZXQpCi17Ci0JcmV0dXJuIGluYihtdHB0LT5vcHRpb25fYmFzZV9hZGRyICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGludCBzYjEwNTNhX2dldF9pbnRlcmZhY2Uoc3RydWN0IG1wX3BvcnQgKm10cHQsIGludCBwb3J0X251bSkKLXsKLQl1bnNpZ25lZCBsb25nIG9wdGlvbl9iYXNlX2FkZHIgPSBtdHB0LT5vcHRpb25fYmFzZV9hZGRyOwotCXVuc2lnbmVkIGludCAgaW50ZXJmYWNlID0gMDsKLQotCXN3aXRjaCAocG9ydF9udW0pCi0JewotCQljYXNlIDA6Ci0JCWNhc2UgMToKLQkJCS8qIHNldCBHUE9bMTowXSA9IDAwICovCi0JCQlvdXRiKDB4MDAsIG9wdGlvbl9iYXNlX2FkZHIgKyBNUF9PUFRSX0dQT0RSKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCWNhc2UgMzoKLQkJCS8qIHNldCBHUE9bMTowXSA9IDAxICovCi0JCQlvdXRiKDB4MDEsIG9wdGlvbl9iYXNlX2FkZHIgKyBNUF9PUFRSX0dQT0RSKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCS8qIHNldCBHUE9bMTowXSA9IDEwICovCi0JCQlvdXRiKDB4MDIsIG9wdGlvbl9iYXNlX2FkZHIgKyBNUF9PUFRSX0dQT0RSKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JcG9ydF9udW0gJj0gMHgxOwotCi0JLyogZ2V0IGludGVyZmFjZSAqLwotCWludGVyZmFjZSA9IGluYihvcHRpb25fYmFzZV9hZGRyICsgTVBfT1BUUl9JSVIwICsgcG9ydF9udW0pOwotCi0JLyogc2V0IEdQT1sxOjBdID0gMTEgKi8KLQlvdXRiKDB4MDMsIG9wdGlvbl9iYXNlX2FkZHIgKyBNUF9PUFRSX0dQT0RSKTsKLQotCXJldHVybiAoaW50ZXJmYWNlKTsKLX0KLQkJCi1zdGF0aWMgaW50IHNiMTA1NF9nZXRfcmVnaXN0ZXIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHBhZ2UsIGludCByZWcpCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgaW50IGxjciA9IDA7Ci0JdW5zaWduZWQgaW50IG1jciA9IDA7Ci0JdW5zaWduZWQgaW50IHRtcCA9IDA7Ci0KLQlpZiggcGFnZSA8PSAwKQotCXsKLQkJcHJpbnRrKCIgcGFnZSAwIGNhbiBub3QgdXNlIHRoaXMgZnVuY3Rpb25cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3dpdGNoKHBhZ2UpCi0JewotCQljYXNlIDE6Ci0JCQlsY3IgPSBTQjEwNVhfR0VUX0xDUihwb3J0KTsKLQkJCXRtcCA9IGxjciB8IFNCMTA1WF9MQ1JfRExBQjsKLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsIHRtcCk7Ci0KLQkJCXRtcCA9IFNCMTA1WF9HRVRfTENSKHBvcnQpOwotCi0JCQlyZXQgPSBTQjEwNVhfR0VUX1JFRyhwb3J0LHJlZyk7Ci0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LGxjcik7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbWNyID0gU0IxMDVYX0dFVF9NQ1IocG9ydCk7Ci0JCQl0bXAgPSBtY3IgfCBTQjEwNVhfTUNSX1AyUzsKLQkJCVNCMTA1WF9QVVRfTUNSKHBvcnQsdG1wKTsKLQotCQkJcmV0ID0gU0IxMDVYX0dFVF9SRUcocG9ydCxyZWcpOwotCi0JCQlTQjEwNVhfUFVUX01DUihwb3J0LG1jcik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJbGNyID0gU0IxMDVYX0dFVF9MQ1IocG9ydCk7Ci0JCQl0bXAgPSBsY3IgfCBTQjEwNVhfTENSX0JGOwotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCx0bXApOwotCQkJU0IxMDVYX1BVVF9SRUcocG9ydCxTQjEwNVhfUFNSLFNCMTA1WF9QU1JfUDNLRVkpOwotCi0JCQlyZXQgPSBTQjEwNVhfR0VUX1JFRyhwb3J0LHJlZyk7Ci0KLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsbGNyKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlsY3IgPSBTQjEwNVhfR0VUX0xDUihwb3J0KTsKLQkJCXRtcCA9IGxjciB8IFNCMTA1WF9MQ1JfQkY7Ci0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LHRtcCk7Ci0JCQlTQjEwNVhfUFVUX1JFRyhwb3J0LFNCMTA1WF9QU1IsU0IxMDVYX1BTUl9QNEtFWSk7Ci0KLQkJCXJldCA9IFNCMTA1WF9HRVRfUkVHKHBvcnQscmVnKTsKLQotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCxsY3IpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoIiBlcnJvciBpbnZhbGlkIHBhZ2UgbnVtYmVyIFxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzYjEwNTRfc2V0X3JlZ2lzdGVyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIGludCBwYWdlLCBpbnQgcmVnLCBpbnQgdmFsdWUpCi17ICAKLQlpbnQgbGNyID0gMDsKLQlpbnQgbWNyID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmKCBwYWdlIDw9IDApCi0JewotCQlwcmludGsoIiBwYWdlIDAgY2FuIG5vdCB1c2UgdGhpcyBmdW5jdGlvblxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc3dpdGNoKHBhZ2UpCi0JewotCQljYXNlIDE6Ci0JCQlsY3IgPSBTQjEwNVhfR0VUX0xDUihwb3J0KTsKLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsIGxjciB8IFNCMTA1WF9MQ1JfRExBQik7Ci0KLQkJCVNCMTA1WF9QVVRfUkVHKHBvcnQscmVnLHZhbHVlKTsKLQotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCwgbGNyKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbWNyID0gU0IxMDVYX0dFVF9NQ1IocG9ydCk7Ci0JCQlTQjEwNVhfUFVUX01DUihwb3J0LCBtY3IgfCBTQjEwNVhfTUNSX1AyUyk7Ci0KLQkJCVNCMTA1WF9QVVRfUkVHKHBvcnQscmVnLHZhbHVlKTsKLQotCQkJU0IxMDVYX1BVVF9NQ1IocG9ydCwgbWNyKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJbGNyID0gU0IxMDVYX0dFVF9MQ1IocG9ydCk7Ci0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LCBsY3IgfCBTQjEwNVhfTENSX0JGKTsKLQkJCVNCMTA1WF9QVVRfUFNSKHBvcnQsIFNCMTA1WF9QU1JfUDNLRVkpOwotCi0JCQlTQjEwNVhfUFVUX1JFRyhwb3J0LHJlZyx2YWx1ZSk7Ci0KLQkJCVNCMTA1WF9QVVRfTENSKHBvcnQsIGxjcik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWxjciA9IFNCMTA1WF9HRVRfTENSKHBvcnQpOwotCQkJU0IxMDVYX1BVVF9MQ1IocG9ydCwgbGNyIHwgU0IxMDVYX0xDUl9CRik7Ci0JCQlTQjEwNVhfUFVUX1BTUihwb3J0LCBTQjEwNVhfUFNSX1A0S0VZKTsKLQotCQkJU0IxMDVYX1BVVF9SRUcocG9ydCxyZWcsdmFsdWUpOwotCi0JCQlTQjEwNVhfUFVUX0xDUihwb3J0LCBsY3IpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCIgZXJyb3IgaW52YWxpZCBwYWdlIG51bWJlciBcbiIpOwotCQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X211bHRpZHJvcF9tb2RlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtb2RlKQotewotCWludCBtZHIgPSBTQjEwNVhBX01EUl9OUFM7Ci0KLQlpZiAobW9kZSAmIE1ETU9ERV9FTkFCTEUpCi0JewotCQltZHIgfD0gU0IxMDVYQV9NRFJfTURFOwotCX0KLQotCWlmICgxKSAvLyhtb2RlICYgTURNT0RFX0FVVE8pCi0JewotCQlpbnQgZWZyID0gMDsKLQkJbWRyIHw9IFNCMTA1WEFfTURSX0FNRTsKLQkJZWZyID0gc2IxMDU0X2dldF9yZWdpc3Rlcihwb3J0LCBQQUdFXzMsIFNCMTA1WF9FRlIpOwotCQllZnIgfD0gU0IxMDVYX0VGUl9TQ0Q7Ci0JCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfRUZSLCBlZnIpOwotCX0KLQotCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8xLCBTQjEwNVhBX01EUiwgbWRyKTsKLQlwb3J0LT5tZG1vZGUgJj0gfjB4NjsKLQlwb3J0LT5tZG1vZGUgfD0gbW9kZTsKLQlwcmludGsoIlslZF0gbXVsdGlkcm9wIGluaXQ6ICV4XG4iLCBwb3J0LT5saW5lLCBwb3J0LT5tZG1vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X211bHRpZHJvcF9hZGRyKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfWE9GRjIpOwotfQotCi1zdGF0aWMgaW50IHNldF9tdWx0aWRyb3BfYWRkcihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgYWRkcikKLXsKLQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsIFBBR0VfMywgU0IxMDVYX1hPRkYyLCBhZGRyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBTZW5kQVRDb21tYW5kKHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCS8vCQkgICAgICBhICAgIHQJY3IgICBsZgotCXVuc2lnbmVkIGNoYXIgY2hbXSA9IHsweDYxLDB4NzQsMHgwZCwweDBhLDB4MH07Ci0JdW5zaWduZWQgY2hhciBsaW5lQ29udHJvbDsKLQl1bnNpZ25lZCBjaGFyIGk9MDsKLQl1bnNpZ25lZCBjaGFyIERpdmlzb3IgPSAweGM7Ci0KLQlsaW5lQ29udHJvbCA9IHNlcmlhbF9pbnAobXRwdCxVQVJUX0xDUik7Ci0Jc2VyaWFsX291dHAobXRwdCxVQVJUX0xDUiwobGluZUNvbnRyb2wgfCBVQVJUX0xDUl9ETEFCKSk7Ci0Jc2VyaWFsX291dHAobXRwdCxVQVJUX0RMTCwoRGl2aXNvciAmIDB4ZmYpKTsKLQlzZXJpYWxfb3V0cChtdHB0LFVBUlRfRExNLChEaXZpc29yICYgMHhmZjAwKT4+OCk7IC8vYmF1ZHJhdGUgaXMgNDgwMAotCi0KLQlzZXJpYWxfb3V0cChtdHB0LFVBUlRfTENSLGxpbmVDb250cm9sKTsJCi0Jc2VyaWFsX291dHAobXRwdCxVQVJUX0xDUiwweDAzKTsgLy8gTi04LTEKLQlzZXJpYWxfb3V0cChtdHB0LFVBUlRfRkNSLDcpOyAKLQlzZXJpYWxfb3V0cChtdHB0LFVBUlRfTUNSLDB4Myk7Ci0Jd2hpbGUoY2hbaV0pewotCQl3aGlsZSgoc2VyaWFsX2lucChtdHB0LFVBUlRfTFNSKSAmIDB4NjApICE9MHg2MCl7Ci0JCQk7Ci0JCX0KLQkJc2VyaWFsX291dHAobXRwdCwwLGNoW2krK10pOwotCX0KLQotCi19Ly8gZW5kIG9mIFNlbmRBVENvbW1hbmQoKQotCi1zdGF0aWMgaW50IHNldF9kZWVwX2ZpZm8oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHN0YXR1cykKLXsKLQlpbnQgYWZyX3N0YXR1cyA9IDA7Ci0JYWZyX3N0YXR1cyA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV80LCBTQjEwNVhfQUZSKTsKLQotCWlmKHN0YXR1cyA9PSBFTkFCTEUpCi0JewotCQlhZnJfc3RhdHVzIHw9IFNCMTA1WF9BRlJfQUZFTjsKLQl9Ci0JZWxzZQotCXsKLQkJYWZyX3N0YXR1cyAmPSB+U0IxMDVYX0FGUl9BRkVOOwotCX0KLQkJCi0Jc2IxMDU0X3NldF9yZWdpc3Rlcihwb3J0LFBBR0VfNCxTQjEwNVhfQUZSLGFmcl9zdGF0dXMpOwotCXNiMTA1NF9zZXRfcmVnaXN0ZXIocG9ydCxQQUdFXzQsU0IxMDVYX1RUUix0dHJbcG9ydC0+bGluZV0pOyAKLQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsUEFHRV80LFNCMTA1WF9SVFIscnRyW3BvcnQtPmxpbmVdKTsgCi0JYWZyX3N0YXR1cyA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV80LCBTQjEwNVhfQUZSKTsKLQkJCi0JcmV0dXJuIGFmcl9zdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2RldmljZV90eXBlKGludCBhcmcpCi17Ci0JaW50IHJldDsKLSAgICAgICAgcmV0ID0gaW5iKG1wX2RldnNbYXJnXS5vcHRpb25fcmVnX2FkZHIrTVBfT1BUUl9ESVIwKTsKLSAgICAgICAgcmV0ID0gKHJldCAmIDB4ZjApID4+IDQ7Ci0gICAgICAgIHN3aXRjaCAocmV0KQotICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIERJUl9VQVJUXzE2QzU1MDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfMTZDNTVYOwotICAgICAgICAgICAgICAgY2FzZSBESVJfVUFSVF8xNkMxMDUwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF8xNkMxMDVYOwotICAgICAgICAgICAgICAgY2FzZSBESVJfVUFSVF8xNkMxMDUwQToKLSAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICBpZiAobXRwdC0+cG9ydC5saW5lIDwgMikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfMTZDMTA1WEE7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKG10cHQtPmRldmljZS0+ZGV2aWNlX2lkICYgMHg1MCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQT1JUXzE2QzU1WDsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfMTZDMTA1WDsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgICAgIHJldHVybiBQT1JUXzE2QzEwNVhBOwotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBPUlRfVU5LTk9XTjsKLSAgICAgICAgfQotCi19Ci1zdGF0aWMgaW50IGdldF9kZWVwX2ZpZm8oc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlpbnQgYWZyX3N0YXR1cyA9IDA7Ci0JYWZyX3N0YXR1cyA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV80LCBTQjEwNVhfQUZSKTsKLQlyZXR1cm4gYWZyX3N0YXR1czsKLX0KLQotc3RhdGljIGludCBzZXRfYXV0b19ydHMoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IHN0YXR1cykKLXsKLQlpbnQgYXRyX3N0YXR1cyA9IDA7Ci0KLSNpZiAwCi0JaW50IGVmcl9zdGF0dXMgPSAwOwotCi0JZWZyX3N0YXR1cyA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfRUZSKTsKLQlpZihzdGF0dXMgPT0gRU5BQkxFKQotCQllZnJfc3RhdHVzIHw9IFNCMTA1WF9FRlJfQVJUUzsKLQllbHNlCi0JCWVmcl9zdGF0dXMgJj0gflNCMTA1WF9FRlJfQVJUUzsKLQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsUEFHRV8zLFNCMTA1WF9FRlIsZWZyX3N0YXR1cyk7Ci0JZWZyX3N0YXR1cyA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfRUZSKTsKLSNlbmRpZgotCQkKLS8vQVRSCi0JYXRyX3N0YXR1cyA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfQVRSKTsKLQlzd2l0Y2goc3RhdHVzKQotCXsKLQkJY2FzZSBSUzQyMlBUUDoKLQkJCWF0cl9zdGF0dXMgPSAoU0IxMDVYX0FUUl9UUFMpIHwgKFNCMTA1WF9BVFJfQTgwKTsKLQkJCWJyZWFrOwotCQljYXNlIFJTNDIyTUQ6Ci0JCQlhdHJfc3RhdHVzID0gKFNCMTA1WF9BVFJfVFBTKSB8IChTQjEwNVhfQVRSX1RDTVMpIHwgKFNCMTA1WF9BVFJfQTgwKTsKLQkJCWJyZWFrOwotCQljYXNlIFJTNDg1TkU6Ci0JCQlhdHJfc3RhdHVzID0gKFNCMTA1WF9BVFJfUkNNUykgfCAoU0IxMDVYX0FUUl9UUFMpIHwgKFNCMTA1WF9BVFJfVENNUykgfCAoU0IxMDVYX0FUUl9BODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlM0ODVFQ0hPOgotCQkJYXRyX3N0YXR1cyA9IChTQjEwNVhfQVRSX1RQUykgfCAoU0IxMDVYX0FUUl9UQ01TKSB8IChTQjEwNVhfQVRSX0E4MCk7Ci0JCQlicmVhazsKLQl9Ci0KLQlzYjEwNTRfc2V0X3JlZ2lzdGVyKHBvcnQsUEFHRV8zLFNCMTA1WF9BVFIsYXRyX3N0YXR1cyk7Ci0JYXRyX3N0YXR1cyA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIocG9ydCwgUEFHRV8zLCBTQjEwNVhfQVRSKTsKLQotCXJldHVybiBhdHJfc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBtcF9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JcG9ydC0+b3BzLT5zdG9wX3R4KHBvcnQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgX19tcF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0JaWYgKCF1YXJ0X2NpcmNfZW1wdHkoJnN0YXRlLT5pbmZvLT54bWl0KSAmJiBzdGF0ZS0+aW5mby0+eG1pdC5idWYgJiYKLQkJCSF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkKLQkJcG9ydC0+b3BzLT5zdGFydF90eChwb3J0KTsKLX0KLQotc3RhdGljIHZvaWQgbXBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlfX21wX3N0YXJ0KHR0eSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3Rhc2tsZXRfYWN0aW9uKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHNiX3VhcnRfc3RhdGUgKilkYXRhOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0KLQlwcmludGsoInRhc2tsZXQgaXMgY2FsbGVkIVxuIik7Ci0JdHR5ID0gc3RhdGUtPmluZm8tPnR0eTsKLQl0dHlfd2FrZXVwKHR0eSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtcF91cGRhdGVfbWN0cmwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQotewotCXVuc2lnbmVkIGludCBvbGQ7Ci0KLQlvbGQgPSBwb3J0LT5tY3RybDsKLQlwb3J0LT5tY3RybCA9IChvbGQgJiB+Y2xlYXIpIHwgc2V0OwotCWlmIChvbGQgIT0gcG9ydC0+bWN0cmwpCi0JCXBvcnQtPm9wcy0+c2V0X21jdHJsKHBvcnQsIHBvcnQtPm1jdHJsKTsKLX0KLQotI2RlZmluZSB1YXJ0X3NldF9tY3RybChwb3J0LHNldCkJbXBfdXBkYXRlX21jdHJsKHBvcnQsc2V0LDApCi0jZGVmaW5lIHVhcnRfY2xlYXJfbWN0cmwocG9ydCxjbGVhcikJbXBfdXBkYXRlX21jdHJsKHBvcnQsMCxjbGVhcikKLQotc3RhdGljIGludCBtcF9zdGFydHVwKHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSwgaW50IGluaXRfaHcpCi17Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHN0YXRlLT5pbmZvOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBVSUZfSU5JVElBTElaRUQpCi0JCXJldHVybiAwOwotCi0JaWYgKGluZm8tPnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQotCWlmIChwb3J0LT50eXBlID09IFBPUlRfVU5LTk9XTikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWluZm8tPnhtaXQuYnVmKSB7Ci0JCXBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFnZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWluZm8tPnhtaXQuYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKLQkJCQotCQl1YXJ0X2NpcmNfY2xlYXIoJmluZm8tPnhtaXQpOwotCX0KLQotCXJldHZhbCA9IHBvcnQtPm9wcy0+c3RhcnR1cChwb3J0KTsKLQlpZiAocmV0dmFsID09IDApIHsKLQkJaWYgKGluaXRfaHcpIHsKLQkJCW1wX2NoYW5nZV9zcGVlZChzdGF0ZSwgTlVMTCk7Ci0KLQkJCWlmIChpbmZvLT50dHkgJiYgKGluZm8tPnR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ0JBVUQpKQotCQkJCXVhcnRfc2V0X21jdHJsKHBvcnQsIFRJT0NNX1JUUyB8IFRJT0NNX0RUUik7Ci0JCX0KLQotCQlpbmZvLT5mbGFncyB8PSBVSUZfSU5JVElBTElaRUQ7Ci0KLQkJaWYgKGluZm8tPnR0eSkKLQkJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQl9Ci0KLQlpZiAocmV0dmFsICYmIGNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHZhbCA9IDA7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBtcF9zaHV0ZG93bihzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHN0YXRlLT5pbmZvOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCWlmIChpbmZvLT50dHkpCi0JCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBVSUZfSU5JVElBTElaRUQpIHsKLQkJaW5mby0+ZmxhZ3MgJj0gflVJRl9JTklUSUFMSVpFRDsKLQotCQlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBIVVBDTCkpCi0JCQl1YXJ0X2NsZWFyX21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7Ci0KLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci0KLQkJcG9ydC0+b3BzLT5zaHV0ZG93bihwb3J0KTsKLQotCQlzeW5jaHJvbml6ZV9pcnEocG9ydC0+aXJxKTsKLQl9Ci0JdGFza2xldF9raWxsKCZpbmZvLT50bGV0KTsKLQotCWlmIChpbmZvLT54bWl0LmJ1ZikgewotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpaW5mby0+eG1pdC5idWYpOwotCQlpbmZvLT54bWl0LmJ1ZiA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtcF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkX3Rlcm1pb3MpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHN0YXRlLT5pbmZvLT50dHk7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0JaWYgKCF0dHkgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04pCi0JCXJldHVybjsKLQotCWlmICh0dHktPnRlcm1pb3MuY19jZmxhZyAmIENSVFNDVFMpCi0JCXN0YXRlLT5pbmZvLT5mbGFncyB8PSBVSUZfQ1RTX0ZMT1c7Ci0JZWxzZQotCQlzdGF0ZS0+aW5mby0+ZmxhZ3MgJj0gflVJRl9DVFNfRkxPVzsKLQotCWlmICh0dHktPnRlcm1pb3MuY19jZmxhZyAmIENMT0NBTCkKLQkJc3RhdGUtPmluZm8tPmZsYWdzICY9IH5VSUZfQ0hFQ0tfQ0Q7Ci0JZWxzZQotCQlzdGF0ZS0+aW5mby0+ZmxhZ3MgfD0gVUlGX0NIRUNLX0NEOwotCi0JcG9ydC0+b3BzLT5zZXRfdGVybWlvcyhwb3J0LCAmdHR5LT50ZXJtaW9zLCBvbGRfdGVybWlvcyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9fbXBfcHV0X2NoYXIoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGNpcmNfYnVmICpjaXJjLCB1bnNpZ25lZCBjaGFyIGMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghY2lyYy0+YnVmKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JaWYgKHVhcnRfY2lyY19jaGFyc19mcmVlKGNpcmMpICE9IDApIHsKLQkJY2lyYy0+YnVmW2NpcmMtPmhlYWRdID0gYzsKLQkJY2lyYy0+aGVhZCA9IChjaXJjLT5oZWFkICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQkJcmV0ID0gMTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JcmV0dXJuIF9fbXBfcHV0X2NoYXIoc3RhdGUtPnBvcnQsICZzdGF0ZS0+aW5mby0+eG1pdCwgY2gpOwotfQotCi1zdGF0aWMgdm9pZCBtcF9wdXRfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQltcF9zdGFydCh0dHkpOwotfQotCi1zdGF0aWMgaW50IG1wX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydDsKLQlzdHJ1Y3QgY2lyY19idWYgKmNpcmM7Ci0JaW50IGMsIHJldCA9IDA7Ci0KLQlpZiAoIXN0YXRlIHx8ICFzdGF0ZS0+aW5mbykgewotCQlyZXR1cm4gLUVMM0hMVDsKLQl9Ci0KLQlwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JY2lyYyA9ICZzdGF0ZS0+aW5mby0+eG1pdDsKLQotCWlmICghY2lyYy0+YnVmKQotCQlyZXR1cm4gMDsKLQkJCi0Jd2hpbGUgKDEpIHsKLQkJYyA9IENJUkNfU1BBQ0VfVE9fRU5EKGNpcmMtPmhlYWQsIGNpcmMtPnRhaWwsIFVBUlRfWE1JVF9TSVpFKTsKLQkJaWYgKGNvdW50IDwgYykKLQkJCWMgPSBjb3VudDsKLQkJaWYgKGMgPD0gMCkKLQkJCWJyZWFrOwotCW1lbWNweShjaXJjLT5idWYgKyBjaXJjLT5oZWFkLCBidWYsIGMpOwotCi0JCWNpcmMtPmhlYWQgPSAoY2lyYy0+aGVhZCArIGMpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JCWJ1ZiArPSBjOwotCQljb3VudCAtPSBjOwotCQlyZXQgKz0gYzsKLQl9Ci0JbXBfc3RhcnQodHR5KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1wX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JcmV0dXJuIHVhcnRfY2lyY19jaGFyc19mcmVlKCZzdGF0ZS0+aW5mby0+eG1pdCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCXJldHVybiB1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZygmc3RhdGUtPmluZm8tPnhtaXQpOwotfQotCi1zdGF0aWMgdm9pZCBtcF9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghc3RhdGUgfHwgIXN0YXRlLT5pbmZvKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQl1YXJ0X2NpcmNfY2xlYXIoJnN0YXRlLT5pbmZvLT54bWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOwotCXR0eV93YWtldXAodHR5KTsKLX0KLQotc3RhdGljIHZvaWQgbXBfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAocG9ydC0+b3BzLT5zZW5kX3hjaGFyKQotCQlwb3J0LT5vcHMtPnNlbmRfeGNoYXIocG9ydCwgY2gpOwotCWVsc2UgewotCQlwb3J0LT54X2NoYXIgPSBjaDsKLQkJaWYgKGNoKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCQkJcG9ydC0+b3BzLT5zdGFydF90eChwb3J0KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgbXBfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JaWYgKElfSVhPRkYodHR5KSkKLQkJbXBfc2VuZF94Y2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKLQotCWlmICh0dHktPnRlcm1pb3MuY19jZmxhZyAmIENSVFNDVFMpCi0JCXVhcnRfY2xlYXJfbWN0cmwoc3RhdGUtPnBvcnQsIFRJT0NNX1JUUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCWlmIChJX0lYT0ZGKHR0eSkpIHsKLQkJaWYgKHBvcnQtPnhfY2hhcikKLQkJCXBvcnQtPnhfY2hhciA9IDA7Ci0JCWVsc2UKLQkJCW1wX3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOwotCX0KLQotCWlmICh0dHktPnRlcm1pb3MuY19jZmxhZyAmIENSVFNDVFMpCi0JCXVhcnRfc2V0X21jdHJsKHBvcnQsIFRJT0NNX1JUUyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfZ2V0X2luZm8oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqcmV0aW5mbykKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOwotCi0JbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKLQl0bXAudHlwZQkgICAgPSBwb3J0LT50eXBlOwotCXRtcC5saW5lCSAgICA9IHBvcnQtPmxpbmU7Ci0JdG1wLnBvcnQJICAgID0gcG9ydC0+aW9iYXNlOwotCWlmIChISUdIX0JJVFNfT0ZGU0VUKQotCQl0bXAucG9ydF9oaWdoID0gKGxvbmcpIHBvcnQtPmlvYmFzZSA+PiBISUdIX0JJVFNfT0ZGU0VUOwotCXRtcC5pcnEJCSAgICA9IHBvcnQtPmlycTsKLQl0bXAuZmxhZ3MJICAgID0gcG9ydC0+ZmxhZ3M7Ci0JdG1wLnhtaXRfZmlmb19zaXplICA9IHBvcnQtPmZpZm9zaXplOwotCXRtcC5iYXVkX2Jhc2UJICAgID0gcG9ydC0+dWFydGNsayAvIDE2OwotCXRtcC5jbG9zZV9kZWxheQkgICAgPSBzdGF0ZS0+Y2xvc2VfZGVsYXk7Ci0JdG1wLmNsb3Npbmdfd2FpdCAgICA9IHN0YXRlLT5jbG9zaW5nX3dhaXQgPT0gVVNGX0NMT1NJTkdfV0FJVF9OT05FID8KLQkJQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUgOgotCQlzdGF0ZS0+Y2xvc2luZ193YWl0OwotCXRtcC5jdXN0b21fZGl2aXNvciAgPSBwb3J0LT5jdXN0b21fZGl2aXNvcjsKLQl0bXAuaHViNgkgICAgPSBwb3J0LT5odWI2OwotCXRtcC5pb190eXBlICAgICAgICAgPSBwb3J0LT5pb3R5cGU7Ci0JdG1wLmlvbWVtX3JlZ19zaGlmdCA9IHBvcnQtPnJlZ3NoaWZ0OwotCXRtcC5pb21lbV9iYXNlICAgICAgPSAodm9pZCAqKXBvcnQtPm1hcGJhc2U7Ci0KLQlpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtcF9zZXRfaW5mbyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpuZXdpbmZvKQotewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGxvbmcgbmV3X3BvcnQ7Ci0JdW5zaWduZWQgaW50IGNoYW5nZV9pcnEsIGNoYW5nZV9wb3J0LCBjbG9zaW5nX3dhaXQ7Ci0JdW5zaWduZWQgaW50IG9sZF9jdXN0b21fZGl2aXNvcjsKLQl1bnNpZ25lZCBpbnQgb2xkX2ZsYWdzLCBuZXdfZmxhZ3M7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbmV3X3BvcnQgPSBuZXdfc2VyaWFsLnBvcnQ7Ci0JaWYgKEhJR0hfQklUU19PRkZTRVQpCi0JCW5ld19wb3J0ICs9ICh1bnNpZ25lZCBsb25nKSBuZXdfc2VyaWFsLnBvcnRfaGlnaCA8PCBISUdIX0JJVFNfT0ZGU0VUOwotCi0JbmV3X3NlcmlhbC5pcnEgPSBpcnFfY2Fub25pY2FsaXplKG5ld19zZXJpYWwuaXJxKTsKLQotCWNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ID09IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FID8KLQkJVVNGX0NMT1NJTkdfV0FJVF9OT05FIDogbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQ7Ci0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0KLQljaGFuZ2VfaXJxICA9IG5ld19zZXJpYWwuaXJxICE9IHBvcnQtPmlycTsKLQljaGFuZ2VfcG9ydCA9IG5ld19wb3J0ICE9IHBvcnQtPmlvYmFzZSB8fAotCQkodW5zaWduZWQgbG9uZyluZXdfc2VyaWFsLmlvbWVtX2Jhc2UgIT0gcG9ydC0+bWFwYmFzZSB8fAotCQluZXdfc2VyaWFsLmh1YjYgIT0gcG9ydC0+aHViNiB8fAotCQluZXdfc2VyaWFsLmlvX3R5cGUgIT0gcG9ydC0+aW90eXBlIHx8Ci0JCW5ld19zZXJpYWwuaW9tZW1fcmVnX3NoaWZ0ICE9IHBvcnQtPnJlZ3NoaWZ0IHx8Ci0JCW5ld19zZXJpYWwudHlwZSAhPSBwb3J0LT50eXBlOwotCW9sZF9mbGFncyA9IHBvcnQtPmZsYWdzOwotCW5ld19mbGFncyA9IG5ld19zZXJpYWwuZmxhZ3M7Ci0Jb2xkX2N1c3RvbV9kaXZpc29yID0gcG9ydC0+Y3VzdG9tX2Rpdmlzb3I7Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJcmV0dmFsID0gLUVQRVJNOwotCQlpZiAoY2hhbmdlX2lycSB8fCBjaGFuZ2VfcG9ydCB8fAotCQkJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBwb3J0LT51YXJ0Y2xrIC8gMTYpIHx8Ci0JCQkJKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gc3RhdGUtPmNsb3NlX2RlbGF5KSB8fAotCQkJCShjbG9zaW5nX3dhaXQgIT0gc3RhdGUtPmNsb3Npbmdfd2FpdCkgfHwKLQkJCQkobmV3X3NlcmlhbC54bWl0X2ZpZm9fc2l6ZSAhPSBwb3J0LT5maWZvc2l6ZSkgfHwKLQkJCQkoKChuZXdfZmxhZ3MgXiBvbGRfZmxhZ3MpICYgflVQRl9VU1JfTUFTSykgIT0gMCkpCi0JCQlnb3RvIGV4aXQ7Ci0JCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH5VUEZfVVNSX01BU0spIHwKLQkJCQkobmV3X2ZsYWdzICYgVVBGX1VTUl9NQVNLKSk7Ci0JCXBvcnQtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKLQkJZ290byBjaGVja19hbmRfZXhpdDsKLQl9Ci0KLQlpZiAocG9ydC0+b3BzLT52ZXJpZnlfcG9ydCkKLQkJcmV0dmFsID0gcG9ydC0+b3BzLT52ZXJpZnlfcG9ydChwb3J0LCAmbmV3X3NlcmlhbCk7Ci0KLQlpZiAoKG5ld19zZXJpYWwuaXJxID49IE5SX0lSUVMpIHx8IChuZXdfc2VyaWFsLmlycSA8IDApIHx8Ci0JCQkobmV3X3NlcmlhbC5iYXVkX2Jhc2UgPCA5NjAwKSkKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdDsKLQotCWlmIChjaGFuZ2VfcG9ydCB8fCBjaGFuZ2VfaXJxKSB7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQotCQlpZiAodWFydF91c2VycyhzdGF0ZSkgPiAxKQotCQkJZ290byBleGl0OwotCi0JCW1wX3NodXRkb3duKHN0YXRlKTsKLQl9Ci0KLQlpZiAoY2hhbmdlX3BvcnQpIHsKLQkJdW5zaWduZWQgbG9uZyBvbGRfaW9iYXNlLCBvbGRfbWFwYmFzZTsKLQkJdW5zaWduZWQgaW50IG9sZF90eXBlLCBvbGRfaW90eXBlLCBvbGRfaHViNiwgb2xkX3NoaWZ0OwotCi0JCW9sZF9pb2Jhc2UgPSBwb3J0LT5pb2Jhc2U7Ci0JCW9sZF9tYXBiYXNlID0gcG9ydC0+bWFwYmFzZTsKLQkJb2xkX3R5cGUgPSBwb3J0LT50eXBlOwotCQlvbGRfaHViNiA9IHBvcnQtPmh1YjY7Ci0JCW9sZF9pb3R5cGUgPSBwb3J0LT5pb3R5cGU7Ci0JCW9sZF9zaGlmdCA9IHBvcnQtPnJlZ3NoaWZ0OwotCi0JCWlmIChvbGRfdHlwZSAhPSBQT1JUX1VOS05PV04pCi0JCQlwb3J0LT5vcHMtPnJlbGVhc2VfcG9ydChwb3J0KTsKLQotCQlwb3J0LT5pb2Jhc2UgPSBuZXdfcG9ydDsKLQkJcG9ydC0+dHlwZSA9IG5ld19zZXJpYWwudHlwZTsKLQkJcG9ydC0+aHViNiA9IG5ld19zZXJpYWwuaHViNjsKLQkJcG9ydC0+aW90eXBlID0gbmV3X3NlcmlhbC5pb190eXBlOwotCQlwb3J0LT5yZWdzaGlmdCA9IG5ld19zZXJpYWwuaW9tZW1fcmVnX3NoaWZ0OwotCQlwb3J0LT5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpbmV3X3NlcmlhbC5pb21lbV9iYXNlOwotCi0JCWlmIChwb3J0LT50eXBlICE9IFBPUlRfVU5LTk9XTikgewotCQkJcmV0dmFsID0gcG9ydC0+b3BzLT5yZXF1ZXN0X3BvcnQocG9ydCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR2YWwgPSAwOwotCQl9Ci0KLQkJaWYgKHJldHZhbCAmJiBvbGRfdHlwZSAhPSBQT1JUX1VOS05PV04pIHsKLQkJCXBvcnQtPmlvYmFzZSA9IG9sZF9pb2Jhc2U7Ci0JCQlwb3J0LT50eXBlID0gb2xkX3R5cGU7Ci0JCQlwb3J0LT5odWI2ID0gb2xkX2h1YjY7Ci0JCQlwb3J0LT5pb3R5cGUgPSBvbGRfaW90eXBlOwotCQkJcG9ydC0+cmVnc2hpZnQgPSBvbGRfc2hpZnQ7Ci0JCQlwb3J0LT5tYXBiYXNlID0gb2xkX21hcGJhc2U7Ci0JCQlyZXR2YWwgPSBwb3J0LT5vcHMtPnJlcXVlc3RfcG9ydChwb3J0KTsKLQkJCWlmIChyZXR2YWwpCi0JCQkJcG9ydC0+dHlwZSA9IFBPUlRfVU5LTk9XTjsKLQotCQkJcmV0dmFsID0gLUVCVVNZOwotCQl9Ci0JfQotCi0JcG9ydC0+aXJxICAgICAgICAgICAgICA9IG5ld19zZXJpYWwuaXJxOwotCXBvcnQtPnVhcnRjbGsgICAgICAgICAgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZSAqIDE2OwotCXBvcnQtPmZsYWdzICAgICAgICAgICAgPSAocG9ydC0+ZmxhZ3MgJiB+VVBGX0NIQU5HRV9NQVNLKSB8Ci0JCShuZXdfZmxhZ3MgJiBVUEZfQ0hBTkdFX01BU0spOwotCXBvcnQtPmN1c3RvbV9kaXZpc29yICAgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotCXN0YXRlLT5jbG9zZV9kZWxheSAgICAgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5OwotCXN0YXRlLT5jbG9zaW5nX3dhaXQgICAgPSBjbG9zaW5nX3dhaXQ7Ci0JcG9ydC0+Zmlmb3NpemUgICAgICAgICA9IG5ld19zZXJpYWwueG1pdF9maWZvX3NpemU7Ci0JaWYgKHN0YXRlLT5pbmZvLT50dHkpCi0JCXN0YXRlLT5pbmZvLT50dHktPmxvd19sYXRlbmN5ID0KLQkJCShwb3J0LT5mbGFncyAmIFVQRl9MT1dfTEFURU5DWSkgPyAxIDogMDsKLQotY2hlY2tfYW5kX2V4aXQ6Ci0JcmV0dmFsID0gMDsKLQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04pCi0JCWdvdG8gZXhpdDsKLQlpZiAoc3RhdGUtPmluZm8tPmZsYWdzICYgVUlGX0lOSVRJQUxJWkVEKSB7Ci0JCWlmICgoKG9sZF9mbGFncyBeIHBvcnQtPmZsYWdzKSAmIFVQRl9TUERfTUFTSykgfHwKLQkJCQlvbGRfY3VzdG9tX2Rpdmlzb3IgIT0gcG9ydC0+Y3VzdG9tX2Rpdmlzb3IpIHsKLQkJCWlmIChwb3J0LT5mbGFncyAmIFVQRl9TUERfTUFTSykgewotCQkJCXByaW50ayhLRVJOX05PVElDRQotCQkJCQkJIiVzIHNldHMgY3VzdG9tIHNwZWVkIG9uIHR0eU1QJWQuIFRoaXMgIgotCQkJCQkJImlzIGRlcHJlY2F0ZWQuXG4iLCBjdXJyZW50LT5jb21tLAotCQkJCQkJcG9ydC0+bGluZSk7Ci0JCQl9Ci0JCQltcF9jaGFuZ2Vfc3BlZWQoc3RhdGUsIE5VTEwpOwotCQl9Ci0JfSBlbHNlCi0JCXJldHZhbCA9IG1wX3N0YXJ0dXAoc3RhdGUsIDEpOwotZXhpdDoKLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotc3RhdGljIGludCBtcF9nZXRfbHNyX2luZm8oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQotewotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBpbnQgcmVzdWx0OwotCi0JcmVzdWx0ID0gcG9ydC0+b3BzLT50eF9lbXB0eShwb3J0KTsKLQotCWlmIChwb3J0LT54X2NoYXIgfHwKLQkJCSgodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoJnN0YXRlLT5pbmZvLT54bWl0KSA+IDApICYmCi0JCQkJIXN0YXRlLT5pbmZvLT50dHktPnN0b3BwZWQgJiYgIXN0YXRlLT5pbmZvLT50dHktPmh3X3N0b3BwZWQpKQotCQlyZXN1bHQgJj0gflRJT0NTRVJfVEVNVDsKLQotCXJldHVybiBwdXRfdXNlcihyZXN1bHQsIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBtcF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCWludCByZXN1bHQgPSAtRUlPOwotCi0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0JaWYgKCEodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCXJlc3VsdCA9IHBvcnQtPm1jdHJsOwotCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQkJcmVzdWx0IHw9IHBvcnQtPm9wcy0+Z2V0X21jdHJsKHBvcnQpOwotCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCX0KLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCWludCByZXQgPSAtRUlPOwotCi0KLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQlpZiAoISh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKLQkJbXBfdXBkYXRlX21jdHJsKHBvcnQsIHNldCwgY2xlYXIpOwotCQlyZXQgPSAwOwotCX0KLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtcF9icmVha19jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0KLQlpZiAocG9ydC0+dHlwZSAhPSBQT1JUX1VOS05PV04pCi0JCXBvcnQtPm9wcy0+YnJlYWtfY3RsKHBvcnQsIGJyZWFrX3N0YXRlKTsKLQotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfZG9fYXV0b2NvbmZpZyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCWludCBmbGFncywgcmV0OwotCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPm11dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlyZXQgPSAtRUJVU1k7Ci0JaWYgKHVhcnRfdXNlcnMoc3RhdGUpID09IDEpIHsKLQkJbXBfc2h1dGRvd24oc3RhdGUpOwotCi0JCWlmIChwb3J0LT50eXBlICE9IFBPUlRfVU5LTk9XTikKLQkJCXBvcnQtPm9wcy0+cmVsZWFzZV9wb3J0KHBvcnQpOwotCi0JCWZsYWdzID0gVUFSVF9DT05GSUdfVFlQRTsKLQkJaWYgKHBvcnQtPmZsYWdzICYgVVBGX0FVVE9fSVJRKQotCQkJZmxhZ3MgfD0gVUFSVF9DT05GSUdfSVJROwotCi0JCXBvcnQtPm9wcy0+Y29uZmlnX3BvcnQocG9ydCwgZmxhZ3MpOwotCi0JCXJldCA9IG1wX3N0YXJ0dXAoc3RhdGUsIDEpOwotCX0KLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfd2FpdF9tb2RlbV9zdGF0dXMoc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0Jc3RydWN0IHNiX3VhcnRfaWNvdW50IGNwcmV2LCBjbm93OwotCWludCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQltZW1jcHkoJmNwcmV2LCAmcG9ydC0+aWNvdW50LCBzaXplb2Yoc3RydWN0IHNiX3VhcnRfaWNvdW50KSk7Ci0KLQlwb3J0LT5vcHMtPmVuYWJsZV9tcyhwb3J0KTsKLQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCi0JYWRkX3dhaXRfcXVldWUoJnN0YXRlLT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCwgJndhaXQpOwotCWZvciAoOzspIHsKLQkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JCW1lbWNweSgmY25vdywgJnBvcnQtPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBzYl91YXJ0X2ljb3VudCkpOwotCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJaWYgKCgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKLQkJCQkoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8Ci0JCQkJKChhcmcgJiBUSU9DTV9DRCkgICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fAotCQkJCSgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkpIHsKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNjaGVkdWxlKCk7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNwcmV2ID0gY25vdzsKLQl9Ci0KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPmluZm8tPmRlbHRhX21zcl93YWl0LCAmd2FpdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1wX2dldF9jb3VudChzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0ICppY250KQotewotCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IGljb3VudCA9IHt9OwotCXN0cnVjdCBzYl91YXJ0X2ljb3VudCBjbm93OwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQotCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCW1lbWNweSgmY25vdywgJnBvcnQtPmljb3VudCwgc2l6ZW9mKHN0cnVjdCBzYl91YXJ0X2ljb3VudCkpOwotCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0KLQlpY291bnQuY3RzICAgICAgICAgPSBjbm93LmN0czsKLQlpY291bnQuZHNyICAgICAgICAgPSBjbm93LmRzcjsKLQlpY291bnQucm5nICAgICAgICAgPSBjbm93LnJuZzsKLQlpY291bnQuZGNkICAgICAgICAgPSBjbm93LmRjZDsKLQlpY291bnQucnggICAgICAgICAgPSBjbm93LnJ4OwotCWljb3VudC50eCAgICAgICAgICA9IGNub3cudHg7Ci0JaWNvdW50LmZyYW1lICAgICAgID0gY25vdy5mcmFtZTsKLQlpY291bnQub3ZlcnJ1biAgICAgPSBjbm93Lm92ZXJydW47Ci0JaWNvdW50LnBhcml0eSAgICAgID0gY25vdy5wYXJpdHk7Ci0JaWNvdW50LmJyayAgICAgICAgID0gY25vdy5icms7Ci0JaWNvdW50LmJ1Zl9vdmVycnVuID0gY25vdy5idWZfb3ZlcnJ1bjsKLQotCXJldHVybiBjb3B5X3RvX3VzZXIoaWNudCwgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpID8gLUVGQVVMVCA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgbXBfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgbXBfcG9ydCAqKXN0YXRlLT5wb3J0OwotCWludCByZXQgPSAtRU5PSU9DVExDTUQ7Ci0KLQotCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgVElPQ1NNVUxUSURST1A6Ci0JCQkvKiBzZXQgbXVsdGktZHJvcCBtb2RlIGVuYWJsZSBvciBkaXNhYmxlLCBhbmQgZGVmYXVsdCBvcGVyYXRpb24gbW9kZSBpcyBIL1cgbW9kZSAqLwotCQkJaWYgKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKQotCQkJewotCQkJCS8vYXJnICY9IH4weDY7Ci0JCQkJLy9zdGF0ZS0+cG9ydC0+bWRtb2RlID0gMDsKLQkJCQlyZXR1cm4gc2V0X211bHRpZHJvcF9tb2RlKChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopaW5mbywgKHVuc2lnbmVkIGludClhcmcpOwotCQkJfQotCQkJcmV0ID0gLUVOT1RTVVBQOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0VUREVFUEZJRk86Ci0JCQlyZXQgPSBnZXRfZGVlcF9maWZvKHN0YXRlLT5wb3J0KTsKLQkJCXJldHVybiByZXQ7Ci0JCWNhc2UgU0VUREVFUEZJRk86Ci0JCQlyZXQgPSBzZXRfZGVlcF9maWZvKHN0YXRlLT5wb3J0LGFyZyk7Ci0JCQlkZWVwW3N0YXRlLT5wb3J0LT5saW5lXSA9IGFyZzsKLQkJCXJldHVybiByZXQ7Ci0JCWNhc2UgU0VUVFRSOgotCQkJaWYgKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVggfHwgaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpewotCQkJCXJldCA9IHNiMTA1NF9zZXRfcmVnaXN0ZXIoc3RhdGUtPnBvcnQsUEFHRV80LFNCMTA1WF9UVFIsYXJnKTsKLQkJCQl0dHJbc3RhdGUtPnBvcnQtPmxpbmVdID0gYXJnOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSBTRVRSVFI6Ci0JCQlpZiAoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WCB8fCBpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSl7Ci0JCQkJcmV0ID0gc2IxMDU0X3NldF9yZWdpc3RlcihzdGF0ZS0+cG9ydCxQQUdFXzQsU0IxMDVYX1JUUixhcmcpOwotCQkJCXJ0cltzdGF0ZS0+cG9ydC0+bGluZV0gPSBhcmc7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQljYXNlIEdFVFRUUjoKLQkJCWlmIChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYIHx8IGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKXsKLQkJCQlyZXQgPSBzYjEwNTRfZ2V0X3JlZ2lzdGVyKHN0YXRlLT5wb3J0LFBBR0VfNCxTQjEwNVhfVFRSKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCWNhc2UgR0VUUlRSOgotCQkJaWYgKGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVggfHwgaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpewotCQkJCXJldCA9IHNiMTA1NF9nZXRfcmVnaXN0ZXIoc3RhdGUtPnBvcnQsUEFHRV80LFNCMTA1WF9SVFIpOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQotCQljYXNlIFNFVEZDUjoKLQkJCWlmIChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYIHx8IGluZm8tPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKXsKLQkJCQlyZXQgPSBzYjEwNTRfc2V0X3JlZ2lzdGVyKHN0YXRlLT5wb3J0LFBBR0VfMSxTQjEwNVhfRkNSLGFyZyk7Ci0JCQl9Ci0JCQllbHNlewotCQkJCXNlcmlhbF9vdXQoaW5mbywyLGFyZyk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXQ7Ci0JCWNhc2UgVElPQ1NNREFERFI6Ci0JCQkvKiBzZXQgbXVsdGktZHJvcCBhZGRyZXNzICovCi0JCQlpZiAoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpCi0JCQl7Ci0JCQkJc3RhdGUtPnBvcnQtPm1kbW9kZSB8PSBNRE1PREVfQUREUjsKLQkJCQlyZXR1cm4gc2V0X211bHRpZHJvcF9hZGRyKChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopaW5mbywgKHVuc2lnbmVkIGludClhcmcpOwotCQkJfQotCQkJcmV0ID0gLUVOT1RTVVBQOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUSU9DR01EQUREUjoKLQkJCS8qIHNldCBtdWx0aS1kcm9wIGFkZHJlc3MgKi8KLQkJCWlmICgoaW5mby0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpICYmIChzdGF0ZS0+cG9ydC0+bWRtb2RlICYgTURNT0RFX0FERFIpKQotCQkJewotCQkJCXJldHVybiBnZXRfbXVsdGlkcm9wX2FkZHIoKHN0cnVjdCBzYl91YXJ0X3BvcnQgKilpbmZvKTsKLQkJCX0KLQkJCXJldCA9IC1FTk9UU1VQUDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVElPQ1NFTkRBRERSOgotCQkJLyogc2VuZCBhZGRyZXNzIGluIG11bHRpLWRyb3AgbW9kZSAqLwotCQkJaWYgKChpbmZvLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYQSkgCi0JCQkJCSYmIChzdGF0ZS0+cG9ydC0+bWRtb2RlICYgKE1ETU9ERV9FTkFCTEUpKSkKLQkJCXsKLQkJCQlpZiAobXBfY2hhcnNfaW5fYnVmZmVyKHR0eSkgPiAwKQotCQkJCXsKLQkJCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwotCQkJCX0KLQkJCQkvL3doaWxlICgoc2VyaWFsX2luKGluZm8sIFVBUlRfTFNSKSAmIDB4NjApICE9IDB4NjApOwotCQkJCS8vd2hpbGUgKHNiMTA1NF9nZXRfcmVnaXN0ZXIoc3RhdGUtPnBvcnQsIFBBR0VfMiwgU0IxMDVYX1RGQ1IpICE9IDApOwotCQkJCXdoaWxlICgoc2VyaWFsX2luKGluZm8sIFVBUlRfTFNSKSAmIDB4NjApICE9IDB4NjApOwotCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9TQ1IsIChpbnQpYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCQlyZXQgPSBtcF9nZXRfaW5mbyhzdGF0ZSwgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopYXJnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCQlyZXQgPSBtcF9zZXRfaW5mbyhzdGF0ZSwgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopYXJnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVElPQ1NFUkNPTkZJRzoKLQkJCXJldCA9IG1wX2RvX2F1dG9jb25maWcoc3RhdGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUSU9DU0VSR1dJTEQ6IC8qIG9ic29sZXRlICovCi0JCWNhc2UgVElPQ1NFUlNXSUxEOiAvKiBvYnNvbGV0ZSAqLwotCQkJcmV0ID0gMDsKLQkJCWJyZWFrOwotCQkJLyogZm9yIE11bHRpcG9ydCAqLwotCQljYXNlIFRJT0NHTlVNT0ZQT1JUOiAvKiBHZXQgbnVtYmVyIG9mIHBvcnRzICovCi0JCQlyZXR1cm4gTlJfUE9SVFM7Ci0JCWNhc2UgVElPQ0dHRVRERVZJRDoKLQkJCXJldHVybiBtcF9kZXZzW2FyZ10uZGV2aWNlX2lkOwotCQljYXNlIFRJT0NHR0VUUkVWOgotCQkJcmV0dXJuIG1wX2RldnNbYXJnXS5yZXZpc2lvbjsKLQkJY2FzZSBUSU9DR0dFVE5SUE9SVFM6Ci0JCQlyZXR1cm4gbXBfZGV2c1thcmddLm5yX3BvcnRzOwotCQljYXNlIFRJT0NHR0VUQkROTzoKLQkJCXJldHVybiBOUl9CT0FSRDsKLQkJY2FzZSBUSU9DR0dFVElOVEVSRkFDRToKLQkJCWlmIChtcF9kZXZzW2FyZ10ucmV2aXNpb24gPT0gMHhjMCkKLQkJCXsKLQkJCQkvKiBmb3IgU0IxNkMxMDUzQVBDSSAqLwotCQkJCXJldHVybiAoc2IxMDUzYV9nZXRfaW50ZXJmYWNlKGluZm8sIGluZm8tPnBvcnQubGluZSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiAoaW5iKG1wX2RldnNbYXJnXS5vcHRpb25fcmVnX2FkZHIrTVBfT1BUUl9JSVIwKyhzdGF0ZS0+cG9ydC0+bGluZS84KSkpOwotCQkJfQotCQljYXNlIFRJT0NHR0VUUE9SVFRZUEU6Ci0JCQlyZXQgPSBnZXRfZGV2aWNlX3R5cGUoYXJnKTsKLQkJCXJldHVybiByZXQ7Ci0JCWNhc2UgVElPQ1NNVUxUSUVDSE86IC8qIHNldCB0byBtdWx0aS1kcm9wIG1vZGUoUlM0MjIpIG9yIGVjaG8gbW9kZShSUzQ4NSkqLwotCQkJb3V0YiggKCBpbmIoaW5mby0+aW50ZXJmYWNlX2NvbmZpZ19hZGRyKSAmIH4weDAzICkgfCAweDAxICwgIAotCQkJCQlpbmZvLT5pbnRlcmZhY2VfY29uZmlnX2FkZHIpOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVElPQ1NQVFBOT0VDSE86IC8qIHNldCB0byBtdWx0aS1kcm9wIG1vZGUoUlM0MjIpIG9yIGVjaG8gbW9kZShSUzQ4NSkgKi8KLQkJCW91dGIoICggaW5iKGluZm8tPmludGVyZmFjZV9jb25maWdfYWRkcikgJiB+MHgwMyApICAsICAgICAgICAgICAgIAotCQkJCQlpbmZvLT5pbnRlcmZhY2VfY29uZmlnX2FkZHIpOwotCQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgVElPQ01JV0FJVDoKLQkJCXJldCA9IG1wX3dhaXRfbW9kZW1fc3RhdHVzKHN0YXRlLCBhcmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBUSU9DR0lDT1VOVDoKLQkJCXJldCA9IG1wX2dldF9jb3VudChzdGF0ZSwgKHN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0ICopYXJnKTsKLQkJCWJyZWFrOwotCX0KLQotCWlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKQotCQlnb3RvIG91dDsKLQotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQlyZXQgPSBtcF9nZXRfbHNyX2luZm8oc3RhdGUsICh1bnNpZ25lZCBpbnQgKilhcmcpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDogewotCQkJCQlzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7Ci0JCQkJCWlmIChwb3J0LT5vcHMtPmlvY3RsKQotCQkJCQkJcmV0ID0gcG9ydC0+b3BzLT5pb2N0bChwb3J0LCBjbWQsIGFyZyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQl9Ci0KLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBNUF9URVJNSU9TICpvbGRfdGVybWlvcykKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLmNfY2ZsYWc7Ci0KLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpCSgoaWZsYWcpICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCi0KLQlpZiAoKGNmbGFnIF4gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpID09IDAgJiYKLQkJCVJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy5jX2lmbGFnIF4gb2xkX3Rlcm1pb3MtPmNfaWZsYWcpID09IDApCi0JCXJldHVybjsKLQotCW1wX2NoYW5nZV9zcGVlZChzdGF0ZSwgb2xkX3Rlcm1pb3MpOwotCi0JaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJiAhKGNmbGFnICYgQ0JBVUQpKQotCQl1YXJ0X2NsZWFyX21jdHJsKHN0YXRlLT5wb3J0LCBUSU9DTV9SVFMgfCBUSU9DTV9EVFIpOwotCi0JaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYgKGNmbGFnICYgQ0JBVUQpKSB7Ci0JCXVuc2lnbmVkIGludCBtYXNrID0gVElPQ01fRFRSOwotCQlpZiAoIShjZmxhZyAmIENSVFNDVFMpIHx8Ci0JCQkJIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkKLQkJCW1hc2sgfD0gVElPQ01fUlRTOwotCQl1YXJ0X3NldF9tY3RybChzdGF0ZS0+cG9ydCwgbWFzayk7Ci0JfQotCi0JaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmICEoY2ZsYWcgJiBDUlRTQ1RTKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJdHR5LT5od19zdG9wcGVkID0gMDsKLQkJX19tcF9zdGFydCh0dHkpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgKGNmbGFnICYgQ1JUU0NUUykpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5wb3J0LT5sb2NrLCBmbGFncyk7Ci0JCWlmICghKHN0YXRlLT5wb3J0LT5vcHMtPmdldF9tY3RybChzdGF0ZS0+cG9ydCkgJiBUSU9DTV9DVFMpKSB7Ci0JCQl0dHktPmh3X3N0b3BwZWQgPSAxOwotCQkJc3RhdGUtPnBvcnQtPm9wcy0+c3RvcF90eChzdGF0ZS0+cG9ydCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnBvcnQtPmxvY2ssIGZsYWdzKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydDsKLQotCXByaW50aygibXBfY2xvc2UhXG4iKTsKLQlpZiAoIXN0YXRlIHx8ICFzdGF0ZS0+cG9ydCkKLQkJcmV0dXJuOwotCi0JcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0JcHJpbnRrKCJjbG9zZTEgJWRcbiIsIF9fTElORV9fKTsKLQlNUF9TVEFURV9MT0NLKHN0YXRlKTsKLQotCXByaW50aygiY2xvc2UyICVkXG4iLCBfX0xJTkVfXyk7Ci0JaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCi0JCWdvdG8gZG9uZTsKLQotCXByaW50aygiY2xvc2UzICVkXG4iLCBfX0xJTkVfXyk7Ci0JaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChzdGF0ZS0+Y291bnQgIT0gMSkpIHsKLQkJcHJpbnRrKCJtcF9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKLQkJCQkic3RhdGUtPmNvdW50IGlzICVkXG4iLCBzdGF0ZS0+Y291bnQpOwotCQlzdGF0ZS0+Y291bnQgPSAxOwotCX0KLQlwcmludGsoImNsb3NlNCAlZFxuIiwgX19MSU5FX18pOwotCWlmICgtLXN0YXRlLT5jb3VudCA8IDApIHsKLQkJcHJpbnRrKCJyc19jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlNUCVkOiAlZFxuIiwKLQkJCQlwb3J0LT5saW5lLCBzdGF0ZS0+Y291bnQpOwotCQlzdGF0ZS0+Y291bnQgPSAwOwotCX0KLQlpZiAoc3RhdGUtPmNvdW50KQotCQlnb3RvIGRvbmU7Ci0KLQl0dHktPmNsb3NpbmcgPSAxOwotCi0JcHJpbnRrKCJjbG9zZTUgJWRcbiIsIF9fTElORV9fKTsKLQlpZiAoc3RhdGUtPmNsb3Npbmdfd2FpdCAhPSBVU0ZfQ0xPU0lOR19XQUlUX05PTkUpCi0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBzdGF0ZS0+Y2xvc2luZ193YWl0KTsKLQotCXByaW50aygiY2xvc2U2ICVkXG4iLCBfX0xJTkVfXyk7Ci0JaWYgKHN0YXRlLT5pbmZvLT5mbGFncyAmIFVJRl9JTklUSUFMSVpFRCkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCQlwb3J0LT5vcHMtPnN0b3BfcngocG9ydCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJbXBfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+dGltZW91dCk7Ci0JfQotCXByaW50aygiY2xvc2U3ICVkXG4iLCBfX0xJTkVfXyk7Ci0KLQltcF9zaHV0ZG93bihzdGF0ZSk7Ci0JcHJpbnRrKCJjbG9zZTggJWRcbiIsIF9fTElORV9fKTsKLQltcF9mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQl0dHktPmNsb3NpbmcgPSAwOwotCXN0YXRlLT5pbmZvLT50dHkgPSBOVUxMOwotCWlmIChzdGF0ZS0+aW5mby0+YmxvY2tlZF9vcGVuKSAKLQl7Ci0JCWlmIChzdGF0ZS0+Y2xvc2VfZGVsYXkpCi0JCXsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KHN0YXRlLT5jbG9zZV9kZWxheSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJbXBfY2hhbmdlX3BtKHN0YXRlLCAzKTsKLQl9Ci0JcHJpbnRrKCJjbG9zZTggJWRcbiIsIF9fTElORV9fKTsKLQotCXN0YXRlLT5pbmZvLT5mbGFncyAmPSB+VUlGX05PUk1BTF9BQ1RJVkU7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aW5mby0+b3Blbl93YWl0KTsKLQotZG9uZToKLQlwcmludGsoImNsb3NlIGRvbmVcbiIpOwotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKLQl1bnNpZ25lZCBsb25nIGNoYXJfdGltZSwgZXhwaXJlOwotCi0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9VTktOT1dOIHx8IHBvcnQtPmZpZm9zaXplID09IDApCi0JCXJldHVybjsKLQotCWNoYXJfdGltZSA9IChwb3J0LT50aW1lb3V0IC0gSFovNTApIC8gcG9ydC0+Zmlmb3NpemU7Ci0JY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKLQlpZiAoY2hhcl90aW1lID09IDApCi0JCWNoYXJfdGltZSA9IDE7Ci0JaWYgKHRpbWVvdXQgJiYgdGltZW91dCA8IGNoYXJfdGltZSkKLQkJY2hhcl90aW1lID0gdGltZW91dDsKLQotCWlmICh0aW1lb3V0ID09IDAgfHwgdGltZW91dCA+IDIgKiBwb3J0LT50aW1lb3V0KQotCQl0aW1lb3V0ID0gMiAqIHBvcnQtPnRpbWVvdXQ7Ci0KLQlleHBpcmUgPSBqaWZmaWVzICsgdGltZW91dDsKLQotCXdoaWxlICghcG9ydC0+b3BzLT50eF9lbXB0eShwb3J0KSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KGNoYXJfdGltZSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmUpKQotCQkJYnJlYWs7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7IC8qIG1pZ2h0IG5vdCBiZSBuZWVkZWQgKi8KLX0KLQotc3RhdGljIHZvaWQgbXBfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCWlmIChzdGF0ZS0+aW5mbyAmJiBzdGF0ZS0+aW5mby0+ZmxhZ3MgJiBVSUZfTk9STUFMX0FDVElWRSkgewotCQltcF9mbHVzaF9idWZmZXIodHR5KTsKLQkJbXBfc2h1dGRvd24oc3RhdGUpOwotCQlzdGF0ZS0+Y291bnQgPSAwOwotCQlzdGF0ZS0+aW5mby0+ZmxhZ3MgJj0gflVJRl9OT1JNQUxfQUNUSVZFOwotCQlzdGF0ZS0+aW5mby0+dHR5ID0gTlVMTDsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aW5mby0+b3Blbl93YWl0KTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aW5mby0+ZGVsdGFfbXNyX3dhaXQpOwotCX0KLQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotfQotCi1zdGF0aWMgdm9pZCBtcF91cGRhdGVfdGVybWlvcyhzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHN0YXRlLT5pbmZvLT50dHk7Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCi0JaWYgKCEodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCW1wX2NoYW5nZV9zcGVlZChzdGF0ZSwgTlVMTCk7Ci0KLQkJaWYgKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ0JBVUQpCi0JCQl1YXJ0X3NldF9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwotCX0KLX0KLQotc3RhdGljIGludCBtcF9ibG9ja190aWxfcmVhZHkoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZSkKLXsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gc3RhdGUtPmluZm87Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGludCBtY3RybDsKLQotCWluZm8tPmJsb2NrZWRfb3BlbisrOwotCXN0YXRlLT5jb3VudC0tOwotCi0JYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOwotCXdoaWxlICgxKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgaW5mby0+dHR5ID09IE5VTEwpCi0JCQlicmVhazsKLQotCQlpZiAoIShpbmZvLT5mbGFncyAmIFVJRl9JTklUSUFMSVpFRCkpCi0JCQlicmVhazsKLQotCQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAotCQkJCShpbmZvLT50dHktPnRlcm1pb3MuY19jZmxhZyAmIENMT0NBTCkgfHwKLQkJCQkoaW5mby0+dHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChpbmZvLT50dHktPnRlcm1pb3MuY19jZmxhZyAmIENCQVVEKQotCQkJdWFydF9zZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSKTsKLQotCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQkJcG9ydC0+b3BzLT5lbmFibGVfbXMocG9ydCk7Ci0JCW1jdHJsID0gcG9ydC0+b3BzLT5nZXRfbWN0cmwocG9ydCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JCWlmIChtY3RybCAmIFRJT0NNX0NBUikKLQkJCWJyZWFrOwotCi0JCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci0JCXNjaGVkdWxlKCk7Ci0JCU1QX1NUQVRFX0xPQ0soc3RhdGUpOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQotCXN0YXRlLT5jb3VudCsrOwotCWluZm8tPmJsb2NrZWRfb3Blbi0tOwotCi0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JaWYgKCFpbmZvLT50dHkgfHwgdHR5X2h1bmdfdXBfcChmaWxwKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzYl91YXJ0X3N0YXRlICp1YXJ0X2dldChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgaW50IGxpbmUpCi17Ci0Jc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlOwotCi0JTVBfTVVURVhfTE9DSyhtcF9tdXRleCk7Ci0Jc3RhdGUgPSBkcnYtPnN0YXRlICsgbGluZTsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+bXV0ZXgpKSB7Ci0JCXN0YXRlID0gRVJSX1BUUigtRVJFU1RBUlRTWVMpOwotCQlnb3RvIG91dDsKLQl9Ci0Jc3RhdGUtPmNvdW50Kys7Ci0JaWYgKCFzdGF0ZS0+cG9ydCkgewotCQlzdGF0ZS0+Y291bnQtLTsKLQkJTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQkJc3RhdGUgPSBFUlJfUFRSKC1FTlhJTyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghc3RhdGUtPmluZm8pIHsKLQkJc3RhdGUtPmluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JfdWFydF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChzdGF0ZS0+aW5mbykgewotCQkJbWVtc2V0KHN0YXRlLT5pbmZvLCAwLCBzaXplb2Yoc3RydWN0IHNiX3VhcnRfaW5mbykpOwotCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3RhdGUtPmluZm8tPm9wZW5fd2FpdCk7Ci0JCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdGF0ZS0+aW5mby0+ZGVsdGFfbXNyX3dhaXQpOwotCi0JCQlzdGF0ZS0+cG9ydC0+aW5mbyA9IHN0YXRlLT5pbmZvOwotCi0JCQl0YXNrbGV0X2luaXQoJnN0YXRlLT5pbmZvLT50bGV0LCBtcF90YXNrbGV0X2FjdGlvbiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpc3RhdGUpOwotCQl9IGVsc2UgewotCQkJc3RhdGUtPmNvdW50LS07Ci0JCQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCQkJc3RhdGUgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQl9Ci0JfQotCi1vdXQ6Ci0JTVBfTVVURVhfVU5MT0NLKG1wX211dGV4KTsKLQlyZXR1cm4gc3RhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgbXBfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiA9IChzdHJ1Y3QgdWFydF9kcml2ZXIgKil0dHktPmRyaXZlci0+ZHJpdmVyX3N0YXRlOwotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZTsKLQlpbnQgcmV0dmFsOwotCWludCAgbGluZSA9IHR0eS0+aW5kZXg7Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQ7Ci0KLQlyZXR2YWwgPSAtRU5PREVWOwotCWlmIChsaW5lID49IHR0eS0+ZHJpdmVyLT5udW0pCi0JCWdvdG8gZmFpbDsKLQotCXN0YXRlID0gdWFydF9nZXQoZHJ2LCBsaW5lKTsKLQotCWlmIChJU19FUlIoc3RhdGUpKSB7Ci0JCXJldHZhbCA9IFBUUl9FUlIoc3RhdGUpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JbXRwdCAgPSAoc3RydWN0IG1wX3BvcnQgKilzdGF0ZS0+cG9ydDsKLQotCXR0eS0+ZHJpdmVyX2RhdGEgPSBzdGF0ZTsKLQl0dHktPmxvd19sYXRlbmN5ID0gKHN0YXRlLT5wb3J0LT5mbGFncyAmIFVQRl9MT1dfTEFURU5DWSkgPyAxIDogMDsKLQl0dHktPmFsdF9zcGVlZCA9IDA7Ci0Jc3RhdGUtPmluZm8tPnR0eSA9IHR0eTsKLQotCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0JCXJldHZhbCA9IC1FQUdBSU47Ci0JCXN0YXRlLT5jb3VudC0tOwotCQlNUF9TVEFURV9VTkxPQ0soc3RhdGUpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKHN0YXRlLT5jb3VudCA9PSAxKQotCQltcF9jaGFuZ2VfcG0oc3RhdGUsIDApOwotCi0JcmV0dmFsID0gbXBfc3RhcnR1cChzdGF0ZSwgMCk7Ci0KLQlpZiAocmV0dmFsID09IDApCi0JCXJldHZhbCA9IG1wX2Jsb2NrX3RpbF9yZWFkeShmaWxwLCBzdGF0ZSk7Ci0JTVBfU1RBVEVfVU5MT0NLKHN0YXRlKTsKLQotCWlmIChyZXR2YWwgPT0gMCAmJiAhKHN0YXRlLT5pbmZvLT5mbGFncyAmIFVJRl9OT1JNQUxfQUNUSVZFKSkgewotCQlzdGF0ZS0+aW5mby0+ZmxhZ3MgfD0gVUlGX05PUk1BTF9BQ1RJVkU7Ci0KLQkJbXBfdXBkYXRlX3Rlcm1pb3Moc3RhdGUpOwotCX0KLQotCXVhcnRfY2xlYXJfbWN0cmwoc3RhdGUtPnBvcnQsIFRJT0NNX1JUUyk7Ci0JdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotZmFpbDoKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICptcF90eXBlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0JY29uc3QgY2hhciAqc3RyID0gTlVMTDsKLQotCWlmIChwb3J0LT5vcHMtPnR5cGUpCi0JCXN0ciA9IHBvcnQtPm9wcy0+dHlwZShwb3J0KTsKLQotCWlmICghc3RyKQotCQlzdHIgPSAidW5rbm93biI7Ci0KLQlyZXR1cm4gc3RyOwotfQotCi1zdGF0aWMgdm9pZCBtcF9jaGFuZ2VfcG0oc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBpbnQgcG1fc3RhdGUpCi17Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCWlmIChwb3J0LT5vcHMtPnBtKQotCQlwb3J0LT5vcHMtPnBtKHBvcnQsIHBtX3N0YXRlLCBzdGF0ZS0+cG1fc3RhdGUpOwotCXN0YXRlLT5wbV9zdGF0ZSA9IHBtX3N0YXRlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXBfcmVwb3J0X3BvcnQoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0JY2hhciBhZGRyZXNzWzY0XTsKLQotCXN3aXRjaCAocG9ydC0+aW90eXBlKSB7Ci0JCWNhc2UgVVBJT19QT1JUOgotCQkJc25wcmludGYoYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpLCJJL08gMHgleCIsIHBvcnQtPmlvYmFzZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVUElPX0hVQjY6Ci0JCQlzbnByaW50ZihhZGRyZXNzLCBzaXplb2YoYWRkcmVzcyksIkkvTyAweCV4IG9mZnNldCAweCV4IiwgcG9ydC0+aW9iYXNlLCBwb3J0LT5odWI2KTsKLQkJCWJyZWFrOwotCQljYXNlIFVQSU9fTUVNOgotCQkJc25wcmludGYoYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpLCJNTUlPIDB4JWx4IiwgcG9ydC0+bWFwYmFzZSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwiKnVua25vd24qIiApOwotCQkJc3RybGNweShhZGRyZXNzLCAiKnVua25vd24qIiwgc2l6ZW9mKGFkZHJlc3MpKTsKLQkJCWJyZWFrOwotCX0KLQotCXByaW50ayggIiVzJWQgYXQgJXMgKGlycSA9ICVkKSBpcyBhICVzXG4iLAotCQkJZHJ2LT5kZXZfbmFtZSwgcG9ydC0+bGluZSwgYWRkcmVzcywgcG9ydC0+aXJxLCBtcF90eXBlKHBvcnQpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBtcF9jb25maWd1cmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXVuc2lnbmVkIGludCBmbGFnczsKLQotCi0JaWYgKCFwb3J0LT5pb2Jhc2UgJiYgIXBvcnQtPm1hcGJhc2UgJiYgIXBvcnQtPm1lbWJhc2UpCi0JewotCQlEUFJJTlRLKCIlcyBlcnJvciBcbiIsX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KLQlmbGFncyA9IFVBUlRfQ09ORklHX1RZUEU7Ci0JaWYgKHBvcnQtPmZsYWdzICYgVVBGX0FVVE9fSVJRKQotCQlmbGFncyB8PSBVQVJUX0NPTkZJR19JUlE7Ci0JaWYgKHBvcnQtPmZsYWdzICYgVVBGX0JPT1RfQVVUT0NPTkYpIHsKLQkJcG9ydC0+dHlwZSA9IFBPUlRfVU5LTk9XTjsKLQkJcG9ydC0+b3BzLT5jb25maWdfcG9ydChwb3J0LCBmbGFncyk7Ci0JfQotCi0JaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9VTktOT1dOKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJbXBfcmVwb3J0X3BvcnQoZHJ2LCBwb3J0KTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCQlwb3J0LT5vcHMtPnNldF9tY3RybChwb3J0LCAwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCi0JCW1wX2NoYW5nZV9wbShzdGF0ZSwgMyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtcF91bmNvbmZpZ3VyZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBzdGF0ZS0+aW5mbzsKLQotCWlmIChpbmZvICYmIGluZm8tPnR0eSkKLQkJdHR5X2hhbmd1cChpbmZvLT50dHkpOwotCi0JTVBfU1RBVEVfTE9DSyhzdGF0ZSk7Ci0KLQlzdGF0ZS0+aW5mbyA9IE5VTEw7Ci0KLQlpZiAocG9ydC0+dHlwZSAhPSBQT1JUX1VOS05PV04pCi0JCXBvcnQtPm9wcy0+cmVsZWFzZV9wb3J0KHBvcnQpOwotCi0JcG9ydC0+dHlwZSA9IFBPUlRfVU5LTk9XTjsKLQotCWlmIChpbmZvKSB7Ci0JCXRhc2tsZXRfa2lsbCgmaW5mby0+dGxldCk7Ci0JCWtmcmVlKGluZm8pOwotCX0KLQotCU1QX1NUQVRFX1VOTE9DSyhzdGF0ZSk7Ci19Ci1zdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIG1wX29wcyA9IHsKLQkub3BlbgkJPSBtcF9vcGVuLAotCS5jbG9zZQkJPSBtcF9jbG9zZSwKLQkud3JpdGUJCT0gbXBfd3JpdGUsCi0JLnB1dF9jaGFyCT0gbXBfcHV0X2NoYXIsCi0JLmZsdXNoX2NoYXJzCT0gbXBfcHV0X2NoYXJzLAotCS53cml0ZV9yb29tCT0gbXBfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyPSBtcF9jaGFyc19pbl9idWZmZXIsCi0JLmZsdXNoX2J1ZmZlcgk9IG1wX2ZsdXNoX2J1ZmZlciwKLQkuaW9jdGwJCT0gbXBfaW9jdGwsCi0JLnRocm90dGxlCT0gbXBfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUJPSBtcF91bnRocm90dGxlLAotCS5zZW5kX3hjaGFyCT0gbXBfc2VuZF94Y2hhciwKLQkuc2V0X3Rlcm1pb3MJPSBtcF9zZXRfdGVybWlvcywKLQkuc3RvcAkJPSBtcF9zdG9wLAotCS5zdGFydAkJPSBtcF9zdGFydCwKLQkuaGFuZ3VwCQk9IG1wX2hhbmd1cCwKLQkuYnJlYWtfY3RsCT0gbXBfYnJlYWtfY3RsLAotCS53YWl0X3VudGlsX3NlbnQ9IG1wX3dhaXRfdW50aWxfc2VudCwKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCS5wcm9jX2ZvcHMJPSBOVUxMLAotI2VuZGlmCi0JLnRpb2NtZ2V0CT0gbXBfdGlvY21nZXQsCi0JLnRpb2Ntc2V0CT0gbXBfdGlvY21zZXQsCi19OwotCi1zdGF0aWMgaW50IG1wX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydikKLXsKLQlzdHJ1Y3QgdHR5X2RyaXZlciAqbm9ybWFsID0gTlVMTDsKLQlpbnQgaSwgcmV0dmFsOwotCi0JZHJ2LT5zdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYl91YXJ0X3N0YXRlKSAqIGRydi0+bnIsIEdGUF9LRVJORUwpOwotCXJldHZhbCA9IC1FTk9NRU07Ci0JaWYgKCFkcnYtPnN0YXRlKQotCXsKLQkJcHJpbnRrKCJTQiBQQ0kgRXJyb3I6IEtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciFcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JbWVtc2V0KGRydi0+c3RhdGUsIDAsIHNpemVvZihzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSkgKiBkcnYtPm5yKTsKLQotCW5vcm1hbCA9IGFsbG9jX3R0eV9kcml2ZXIoZHJ2LT5ucik7Ci0JaWYgKCFub3JtYWwpCi0JewotCQlwcmludGsoIlNCIFBDSSBFcnJvcjogdHR5IGFsbG9jYXRpb24gZXJyb3IhXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZHJ2LT50dHlfZHJpdmVyID0gbm9ybWFsOwotCi0Jbm9ybWFsLT5vd25lciAgICAgICAgICAgPSBkcnYtPm93bmVyOwotCW5vcm1hbC0+bWFnaWMJCT0gVFRZX0RSSVZFUl9NQUdJQzsKLQlub3JtYWwtPmRyaXZlcl9uYW1lICAgICA9IGRydi0+ZHJpdmVyX25hbWU7Ci0Jbm9ybWFsLT5uYW1lCQk9IGRydi0+ZGV2X25hbWU7Ci0Jbm9ybWFsLT5tYWpvcgkJPSBkcnYtPm1ham9yOwotCW5vcm1hbC0+bWlub3Jfc3RhcnQJPSBkcnYtPm1pbm9yOwotCi0Jbm9ybWFsLT5udW0JCT0gTUFYX01QX1BPUlQgOyAKLQotCW5vcm1hbC0+dHlwZQkJPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCW5vcm1hbC0+c3VidHlwZQkJPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0Jbm9ybWFsLT5pbml0X3Rlcm1pb3MJPSB0dHlfc3RkX3Rlcm1pb3M7Ci0Jbm9ybWFsLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKLQlub3JtYWwtPmZsYWdzCQk9IFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX0RZTkFNSUNfREVWOwotCW5vcm1hbC0+ZHJpdmVyX3N0YXRlICAgID0gZHJ2OwotCi0JdHR5X3NldF9vcGVyYXRpb25zKG5vcm1hbCwgJm1wX29wcyk7Ci0KLWZvciAoaSA9IDA7IGkgPCBkcnYtPm5yOyBpKyspIHsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSBkcnYtPnN0YXRlICsgaTsKLQotCXN0YXRlLT5jbG9zZV9kZWxheSAgICAgPSA1MDA7ICAgCi0Jc3RhdGUtPmNsb3Npbmdfd2FpdCAgICA9IDMwMDAwOyAKLQotCW11dGV4X2luaXQoJnN0YXRlLT5tdXRleCk7Ci0JfQotCi0JcmV0dmFsID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihub3JtYWwpOwotb3V0OgotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXByaW50aygiUmVnaXN0ZXIgdHR5IGRyaXZlciBGYWlsIVxuIik7Ci0JCXB1dF90dHlfZHJpdmVyKG5vcm1hbCk7Ci0JCWtmcmVlKGRydi0+c3RhdGUpOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXZvaWQgbXBfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVhcnRfZHJpdmVyICpkcnYpCi17Ci0gICAgc3RydWN0IHR0eV9kcml2ZXIgKm5vcm1hbCA9IE5VTEw7Ci0KLSAgICBub3JtYWwgPSBkcnYtPnR0eV9kcml2ZXI7Ci0KLSAgICBpZiAoIW5vcm1hbCkKLSAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIobm9ybWFsKTsKLSAgICBwdXRfdHR5X2RyaXZlcihub3JtYWwpOwotICAgIGRydi0+dHR5X2RyaXZlciA9IE5VTEw7Ci0KLQotICAgIGtmcmVlKGRydi0+c3RhdGUpOwotCi19Ci0KLXN0YXRpYyBpbnQgbXBfYWRkX29uZV9wb3J0KHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2LCBzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBzYl91YXJ0X3N0YXRlICpzdGF0ZTsKLQlpbnQgcmV0ID0gMDsKLQotCi0JaWYgKHBvcnQtPmxpbmUgPj0gZHJ2LT5ucikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdGF0ZSA9IGRydi0+c3RhdGUgKyBwb3J0LT5saW5lOwotCi0JTVBfTVVURVhfTE9DSyhtcF9tdXRleCk7Ci0JaWYgKHN0YXRlLT5wb3J0KSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXN0YXRlLT5wb3J0ID0gcG9ydDsKLQotCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKLQlwb3J0LT5jb25zID0gZHJ2LT5jb25zOwotCXBvcnQtPmluZm8gPSBzdGF0ZS0+aW5mbzsKLQotCW1wX2NvbmZpZ3VyZV9wb3J0KGRydiwgc3RhdGUsIHBvcnQpOwotCi0JdHR5X3JlZ2lzdGVyX2RldmljZShkcnYtPnR0eV9kcml2ZXIsIHBvcnQtPmxpbmUsIHBvcnQtPmRldik7Ci0KLW91dDoKLQlNUF9NVVRFWF9VTkxPQ0sobXBfbXV0ZXgpOwotCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1wX3JlbW92ZV9vbmVfcG9ydChzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiwgc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9zdGF0ZSAqc3RhdGUgPSBkcnYtPnN0YXRlICsgcG9ydC0+bGluZTsKLQotCWlmIChzdGF0ZS0+cG9ydCAhPSBwb3J0KQotCQlwcmludGsoS0VSTl9BTEVSVCAiUmVtb3Zpbmcgd3JvbmcgcG9ydDogJXAgIT0gJXBcbiIsCi0JCQkJc3RhdGUtPnBvcnQsIHBvcnQpOwotCi0JTVBfTVVURVhfTE9DSyhtcF9tdXRleCk7Ci0KLQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoZHJ2LT50dHlfZHJpdmVyLCBwb3J0LT5saW5lKTsKLQotCW1wX3VuY29uZmlndXJlX3BvcnQoZHJ2LCBzdGF0ZSk7Ci0Jc3RhdGUtPnBvcnQgPSBOVUxMOwotCU1QX01VVEVYX1VOTE9DSyhtcF9tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXV0b2NvbmZpZyhzdHJ1Y3QgbXBfcG9ydCAqbXRwdCwgdW5zaWduZWQgaW50IHByb2JlZmxhZ3MpCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXMxLCBzY3JhdGNoLCBzY3JhdGNoMiwgc2NyYXRjaDM7Ci0JdW5zaWduZWQgY2hhciBzYXZlX2xjciwgc2F2ZV9tY3I7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXVuc2lnbmVkIGNoYXIgdV90eXBlOwotCXVuc2lnbmVkIGNoYXIgYl9yZXQgPSAwOwotCi0JaWYgKCFtdHB0LT5wb3J0LmlvYmFzZSAmJiAhbXRwdC0+cG9ydC5tYXBiYXNlICYmICFtdHB0LT5wb3J0Lm1lbWJhc2UpCi0JCXJldHVybjsKLQotCURFQlVHX0FVVE9DT05GKCJ0dHlNUCVkOiBhdXRvY29uZiAoMHglMDR4LCAweCVwKTogIiwKLQkJCW10cHQtPnBvcnQubGluZSwgbXRwdC0+cG9ydC5pb2Jhc2UsIG10cHQtPnBvcnQubWVtYmFzZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIShtdHB0LT5wb3J0LmZsYWdzICYgVVBGX0JVR0dZX1VBUlQpKSB7Ci0JCXNjcmF0Y2ggPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfSUVSKTsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIDApOwotI2lmZGVmIF9faTM4Nl9fCi0JCW91dGIoMHhmZiwgMHgwODApOwotI2VuZGlmCi0JCXNjcmF0Y2gyID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX0lFUikgJiAweDBmOwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgMHgwRik7Ci0jaWZkZWYgX19pMzg2X18KLQkJb3V0YigwLCAweDA4MCk7Ci0jZW5kaWYKLQkJc2NyYXRjaDMgPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfSUVSKSAmIDB4MEY7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCBzY3JhdGNoKTsKLQkJaWYgKHNjcmF0Y2gyICE9IDAgfHwgc2NyYXRjaDMgIT0gMHgwRikgewotCQkJREVCVUdfQVVUT0NPTkYoIklFUiB0ZXN0IGZhaWxlZCAoJTAyeCwgJTAyeCkgIiwKLQkJCQkJc2NyYXRjaDIsIHNjcmF0Y2gzKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0Jc2F2ZV9tY3IgPSBzZXJpYWxfaW4obXRwdCwgVUFSVF9NQ1IpOwotCXNhdmVfbGNyID0gc2VyaWFsX2luKG10cHQsIFVBUlRfTENSKTsKLQotCWlmICghKG10cHQtPnBvcnQuZmxhZ3MgJiBVUEZfU0tJUF9URVNUKSkgewotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01DUiwgVUFSVF9NQ1JfTE9PUCB8IDB4MEEpOwotCQlzdGF0dXMxID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX01TUikgJiAweEYwOwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01DUiwgc2F2ZV9tY3IpOwotCQlpZiAoc3RhdHVzMSAhPSAweDkwKSB7Ci0JCQlERUJVR19BVVRPQ09ORigiTE9PUCB0ZXN0IGZhaWxlZCAoJTAyeCkgIiwKLQkJCQkJc3RhdHVzMSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAweEJGKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0VGUiwgMCk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDApOwotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKLQlzY3JhdGNoID0gc2VyaWFsX2luKG10cHQsIFVBUlRfSUlSKSA+PiA2OwotCi0JREVCVUdfQVVUT0NPTkYoImlpcj0lZCAiLCBzY3JhdGNoKTsKLQlpZihtdHB0LT5kZXZpY2UtPm5yX3BvcnRzID49IDgpCi0JCWJfcmV0ID0gcmVhZF9vcHRpb25fcmVnaXN0ZXIobXRwdCwoTVBfT1BUUl9ESVIwICsgKChtdHB0LT5wb3J0LmxpbmUpLzgpKSk7Ci0JZWxzZQkKLQkJYl9yZXQgPSByZWFkX29wdGlvbl9yZWdpc3RlcihtdHB0LE1QX09QVFJfRElSMCk7Ci0JdV90eXBlID0gKGJfcmV0ICYgMHhmMCkgPj4gNDsKLQlpZihtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF9VTktOT1dOICkKLQl7Ci0JCXN3aXRjaCAodV90eXBlKQotCQl7Ci0JCQljYXNlIERJUl9VQVJUXzE2QzU1MDoKLQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUXzE2QzU1WDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRElSX1VBUlRfMTZDMTA1MDoKLQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUXzE2QzEwNVg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERJUl9VQVJUXzE2QzEwNTBBOgotCQkJCWlmIChtdHB0LT5wb3J0LmxpbmUgPCAyKQotCQkJCXsKLQkJCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF8xNkMxMDVYQTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKG10cHQtPmRldmljZS0+ZGV2aWNlX2lkICYgMHg1MCkKLQkJCQkJewotCQkJCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF8xNkM1NVg7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUXzE2QzEwNVg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgkKLQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUX1VOS05PV047Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZihtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF9VTktOT1dOICkKLQl7Ci1wcmludGsoInVua25vdzJcbiIpOwotCQlzd2l0Y2ggKHNjcmF0Y2gpIHsKLQkJCWNhc2UgMDoKLQkJCWNhc2UgMToKLQkJCQltdHB0LT5wb3J0LnR5cGUgPSBQT1JUX1VOS05PV047Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQljYXNlIDM6Ci0JCQkJbXRwdC0+cG9ydC50eXBlID0gUE9SVF8xNkM1NVg7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgc2F2ZV9sY3IpOwotCi0JbXRwdC0+cG9ydC5maWZvc2l6ZSA9IHVhcnRfY29uZmlnW210cHQtPnBvcnQudHlwZV0uZGZsX3htaXRfZmlmb19zaXplOwotCW10cHQtPmNhcGFiaWxpdGllcyA9IHVhcnRfY29uZmlnW210cHQtPnBvcnQudHlwZV0uZmxhZ3M7Ci0KLQlpZiAobXRwdC0+cG9ydC50eXBlID09IFBPUlRfVU5LTk9XTikKLQkJZ290byBvdXQ7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9NQ1IsIHNhdmVfbWNyKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgKFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKLQkJCQlVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwKLQkJCQlVQVJUX0ZDUl9DTEVBUl9YTUlUKSk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIDApOwotCSh2b2lkKXNlcmlhbF9pbihtdHB0LCBVQVJUX1JYKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgMCk7Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQlERUJVR19BVVRPQ09ORigidHlwZT0lc1xuIiwgdWFydF9jb25maWdbbXRwdC0+cG9ydC50eXBlXS5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgYXV0b2NvbmZpZ19pcnEoc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0JdW5zaWduZWQgY2hhciBzYXZlX21jciwgc2F2ZV9pZXI7Ci0JdW5zaWduZWQgbG9uZyBpcnFzOwotCWludCBpcnE7Ci0KLQkvKiBmb3JnZXQgcG9zc2libGUgaW5pdGlhbGx5IG1hc2tlZCBhbmQgcGVuZGluZyBJUlEgKi8KLQlwcm9iZV9pcnFfb2ZmKHByb2JlX2lycV9vbigpKTsKLQlzYXZlX21jciA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9NQ1IpOwotCXNhdmVfaWVyID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX0lFUik7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9NQ1IsIFVBUlRfTUNSX09VVDEgfCBVQVJUX01DUl9PVVQyKTsKLQotCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01DUiwgMCk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9NQ1IsCi0JCVVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIpOwotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9JRVIsIDB4MGYpOyAgICAvKiBlbmFibGUgYWxsIGludHJzICovCi0JKHZvaWQpc2VyaWFsX2lucChtdHB0LCBVQVJUX0xTUik7Ci0JKHZvaWQpc2VyaWFsX2lucChtdHB0LCBVQVJUX1JYKTsKLQkodm9pZClzZXJpYWxfaW5wKG10cHQsIFVBUlRfSUlSKTsKLQkodm9pZClzZXJpYWxfaW5wKG10cHQsIFVBUlRfTVNSKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX1RYLCAweEZGKTsKLQlpcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOwotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9NQ1IsIHNhdmVfbWNyKTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgc2F2ZV9pZXIpOwotCi0JbXRwdC0+cG9ydC5pcnEgPSAoaXJxID4gMCkgPyBpcnEgOiAwOwotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9zdG9wX3R4KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IG1wX3BvcnQgKm10cHQgPSAoc3RydWN0IG1wX3BvcnQgKilwb3J0OwotCi0JaWYgKG10cHQtPmllciAmIFVBUlRfSUVSX1RIUkkpIHsKLQkJbXRwdC0+aWVyICY9IH5VQVJUX0lFUl9USFJJOwotCQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfSUVSLCBtdHB0LT5pZXIpOwotCX0KLQotCXRhc2tsZXRfc2NoZWR1bGUoJnBvcnQtPmluZm8tPnRsZXQpOwotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9zdGFydF90eChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQotCWlmICghKG10cHQtPmllciAmIFVBUlRfSUVSX1RIUkkpKSB7Ci0JCW10cHQtPmllciB8PSBVQVJUX0lFUl9USFJJOwotCQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfSUVSLCBtdHB0LT5pZXIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfc3RvcF9yeChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQotCW10cHQtPmllciAmPSB+VUFSVF9JRVJfUkxTSTsKLQltdHB0LT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOwotCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9JRVIsIG10cHQtPmllcik7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX2VuYWJsZV9tcyhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQotCW10cHQtPmllciB8PSBVQVJUX0lFUl9NU0k7Ci0Jc2VyaWFsX291dChtdHB0LCBVQVJUX0lFUiwgbXRwdC0+aWVyKTsKLX0KLQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX2NoYXJzKHN0cnVjdCBtcF9wb3J0ICptdHB0LCBpbnQgKnN0YXR1cyApCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IG10cHQtPnBvcnQuaW5mby0+dHR5OwotCXVuc2lnbmVkIGNoYXIgbHNyID0gKnN0YXR1czsKLQlpbnQgbWF4X2NvdW50ID0gMjU2OwotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JY2hhciBmbGFnOwotCi0JLy9sc3IgJj0gbXRwdC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrOwotCi0JZG8gewotCQlpZiAoKGxzciAmIFVBUlRfTFNSX1BFKSAmJiAobXRwdC0+cG9ydC5tZG1vZGUgJiBNRE1PREVfRU5BQkxFKSkKLQkJewotCQkJY2ggPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfUlgpOwotCQl9Ci0JCWVsc2UgaWYgKGxzciAmIFVBUlRfTFNSX1NQRUNJQUwpIAotCQl7Ci0JCQlmbGFnID0gMDsKLQkJCWNoID0gc2VyaWFsX2lucChtdHB0LCBVQVJUX1JYKTsKLQotCQkJaWYgKGxzciAmIFVBUlRfTFNSX0JJKSAKLQkJCXsKLQotCQkJCW10cHQtPnBvcnQuaWNvdW50LmJyaysrOwotCQkJCWZsYWcgPSBUVFlfQlJFQUs7Ci0KLQkJCQlpZiAoc2JfdWFydF9oYW5kbGVfYnJlYWsoJm10cHQtPnBvcnQpKQotCQkJCQlnb3RvIGlnbm9yZV9jaGFyOwotCQkJfSAKLQkJCWlmIChsc3IgJiBVQVJUX0xTUl9QRSkKLQkJCXsKLQkJCQltdHB0LT5wb3J0Lmljb3VudC5wYXJpdHkrKzsKLQkJCQlmbGFnID0gVFRZX1BBUklUWTsKLQkJCX0KLQkJCWlmIChsc3IgJiBVQVJUX0xTUl9GRSkKLQkJCXsKLQkJCQltdHB0LT5wb3J0Lmljb3VudC5mcmFtZSsrOwotCQkJCWZsYWcgPSBUVFlfRlJBTUU7Ci0JCQl9Ci0JCQlpZiAobHNyICYgVUFSVF9MU1JfT0UpCi0JCQl7Ci0JCQkJbXRwdC0+cG9ydC5pY291bnQub3ZlcnJ1bisrOwotCQkJCWZsYWcgPSBUVFlfT1ZFUlJVTjsKLQkJCX0KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY2ggPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfUlgpOwotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgMCk7Ci0JCX0KLWlnbm9yZV9jaGFyOgotCQlsc3IgPSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTFNSKTsKLQl9IHdoaWxlICgobHNyICYgVUFSVF9MU1JfRFIpICYmIChtYXhfY291bnQtLSA+IDApKTsKLQotCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci19Ci0KLQotCi0KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZtdHB0LT5wb3J0LmluZm8tPnhtaXQ7Ci0JaW50IGNvdW50OwotCi0JaWYgKG10cHQtPnBvcnQueF9jaGFyKSB7Ci0JCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfVFgsIG10cHQtPnBvcnQueF9jaGFyKTsKLQkJbXRwdC0+cG9ydC5pY291bnQudHgrKzsKLQkJbXRwdC0+cG9ydC54X2NoYXIgPSAwOwotCQlyZXR1cm47Ci0JfQotCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKCZtdHB0LT5wb3J0KSkgewotCQltdWx0aV9zdG9wX3R4KCZtdHB0LT5wb3J0KTsKLQkJcmV0dXJuOwotCX0KLQotCWNvdW50ID0gdWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCk7Ci0KLQlpZihjb3VudCA+IG10cHQtPnBvcnQuZmlmb3NpemUpCi0JewotCQljb3VudCA9IG10cHQtPnBvcnQuZmlmb3NpemU7Ci0JfQotCi0JcHJpbnRrKCJbJWRdIG1kbW9kZTogJXhcbiIsIG10cHQtPnBvcnQubGluZSwgbXRwdC0+cG9ydC5tZG1vZGUpOwotCWRvIHsKLSNpZiAwCi0JCS8qIGNoZWNrIG11bHRpLWRyb3AgbW9kZSAqLwotCQlpZiAoKG10cHQtPnBvcnQubWRtb2RlICYgKE1ETU9ERV9FTkFCTEUgfCBNRE1PREVfQUREUikpID09IChNRE1PREVfRU5BQkxFIHwgTURNT0RFX0FERFIpKQotCQl7Ci0JCQlwcmludGsoInNlbmQgYWRkcmVzc1xuIik7Ci0JCQkvKiBzZW5kIG11bHRpLWRyb3AgYWRkcmVzcyAqLwotCQkJc2VyaWFsX291dChtdHB0LCBVQVJUX1NDUiwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKLQkJfQotCQllbHNlCi0jZW5kaWYKLQkJewotCQkJc2VyaWFsX291dChtdHB0LCBVQVJUX1RYLCB4bWl0LT5idWZbeG1pdC0+dGFpbF0pOwotCQl9Ci0JCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JCW10cHQtPnBvcnQuaWNvdW50LnR4Kys7Ci0JfSB3aGlsZSAoLS1jb3VudCA+IDApOwotfQotCi0KLQotc3RhdGljIF9JTkxJTkVfIHZvaWQgY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBzZXJpYWxfaW4obXRwdCwgVUFSVF9NU1IpOwotCi0JaWYgKChzdGF0dXMgJiBVQVJUX01TUl9BTllfREVMVEEpID09IDApCi0JCXJldHVybjsKLQotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQotCQltdHB0LT5wb3J0Lmljb3VudC5ybmcrKzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKLQkJbXRwdC0+cG9ydC5pY291bnQuZHNyKys7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCi0JCXNiX3VhcnRfaGFuZGxlX2RjZF9jaGFuZ2UoJm10cHQtPnBvcnQsIHN0YXR1cyAmIFVBUlRfTVNSX0RDRCk7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCi0JCXNiX3VhcnRfaGFuZGxlX2N0c19jaGFuZ2UoJm10cHQtPnBvcnQsIHN0YXR1cyAmIFVBUlRfTVNSX0NUUyk7Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm10cHQtPnBvcnQuaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXVsdGlfaGFuZGxlX3BvcnQoc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0JdW5zaWduZWQgaW50IHN0YXR1cyA9IHNlcmlhbF9pbnAobXRwdCwgVUFSVF9MU1IpOwotCi0JLy9wcmludGsoImxzcjogJXhcbiIsIHN0YXR1cyk7Ci0KLQlpZiAoKHN0YXR1cyAmIFVBUlRfTFNSX0RSKSB8fCAoc3RhdHVzICYgVUFSVF9MU1JfU1BFQ0lBTCkpCi0JCXJlY2VpdmVfY2hhcnMobXRwdCwgJnN0YXR1cyk7Ci0JY2hlY2tfbW9kZW1fc3RhdHVzKG10cHQpOwotCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9USFJFKQotCXsKLQkJaWYgKChtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYKQotCQkJfHwgKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUXzE2QzEwNVhBKSkKLQkJCXRyYW5zbWl0X2NoYXJzKG10cHQpOwotCQllbHNlCi0JCXsKLQkJCWlmIChtdHB0LT5pbnRlcmZhY2UgPj0gUlM0ODVORSkKLQkJCQl1YXJ0X3NldF9tY3RybCgmbXRwdC0+cG9ydCwgVElPQ01fUlRTKTsKLQkJCQotCQkJdHJhbnNtaXRfY2hhcnMobXRwdCk7Ci0KLQotCQkJaWYgKG10cHQtPmludGVyZmFjZSA+PSBSUzQ4NU5FKQotCQkJewotCQkJCXdoaWxlKChzdGF0dXM9c2VyaWFsX2luKG10cHQsVUFSVF9MU1IpICYweDYwKSE9MHg2MCk7Ci0JCQkJdWFydF9jbGVhcl9tY3RybCgmbXRwdC0+cG9ydCwgVElPQ01fUlRTKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtdWx0aV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBpcnFfaW5mbyAqaWluZm8gPSBkZXZfaWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGhlYWQsICplbmQgPSBOVUxMOwotCWludCBwYXNzX2NvdW50ZXIgPSAwOwotCi0KLQlzcGluX2xvY2soJmlpbmZvLT5sb2NrKTsKLQotCWxoZWFkID0gaWluZm8tPmhlYWQ7Ci0JZG8gewotCQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdDsKLQkJdW5zaWduZWQgaW50IGlpcjsKLQotCQltdHB0ID0gbGlzdF9lbnRyeShsaGVhZCwgc3RydWN0IG1wX3BvcnQsIGxpc3QpOwotCQkKLQkJaWlyID0gc2VyaWFsX2luKG10cHQsIFVBUlRfSUlSKTsKLQkJcHJpbnRrKCJpbnRlcnJ1cHQhIHBvcnQgJWQsIGlpciAweCV4XG4iLCBtdHB0LT5wb3J0LmxpbmUsIGlpcik7IC8vd2xlZQotCQlpZiAoIShpaXIgJiBVQVJUX0lJUl9OT19JTlQpKSAKLQkJewotCQkJcHJpbnRrKCJpbnRlcnJ1cHQgaGFuZGxlXG4iKTsKLQkJCXNwaW5fbG9jaygmbXRwdC0+cG9ydC5sb2NrKTsKLQkJCW11bHRpX2hhbmRsZV9wb3J0KG10cHQpOwotCQkJc3Bpbl91bmxvY2soJm10cHQtPnBvcnQubG9jayk7Ci0KLQkJCWVuZCA9IE5VTEw7Ci0JCX0gZWxzZSBpZiAoZW5kID09IE5VTEwpCi0JCQllbmQgPSBsaGVhZDsKLQotCQlsaGVhZCA9IGxoZWFkLT5uZXh0OwotCQlpZiAobGhlYWQgPT0gaWluZm8tPmhlYWQgJiYgcGFzc19jb3VudGVyKysgPiBQQVNTX0xJTUlUKSAKLQkJewotCQkJcHJpbnRrKEtFUk5fRVJSICJtdWx0aTogdG9vIG11Y2ggd29yayBmb3IgIgotCQkJCQkiaXJxJWRcbiIsIGlycSk7Ci0JCQlwcmludGsoICJtdWx0aTogdG9vIG11Y2ggd29yayBmb3IgIgotCQkJCQkiaXJxJWRcbiIsIGlycSk7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUgKGxoZWFkICE9IGVuZCk7Ci0KLQlzcGluX3VubG9jaygmaWluZm8tPmxvY2spOwotCi0KLSAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgdm9pZCBzZXJpYWxfZG9fdW5saW5rKHN0cnVjdCBpcnFfaW5mbyAqaSwgc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0Jc3Bpbl9sb2NrX2lycSgmaS0+bG9jayk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoaS0+aGVhZCkpIHsKLQkJaWYgKGktPmhlYWQgPT0gJm10cHQtPmxpc3QpCi0JCQlpLT5oZWFkID0gaS0+aGVhZC0+bmV4dDsKLQkJbGlzdF9kZWwoJm10cHQtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWktPmhlYWQgPSBOVUxMOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycSgmaS0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgc2VyaWFsX2xpbmtfaXJxX2NoYWluKHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCXN0cnVjdCBpcnFfaW5mbyAqaSA9IGlycV9saXN0cyArIG10cHQtPnBvcnQuaXJxOwotCWludCByZXQsIGlycV9mbGFncyA9IG10cHQtPnBvcnQuZmxhZ3MgJiBVUEZfU0hBUkVfSVJRID8gSVJRRl9TSEFSRUQgOiAwOwotCXNwaW5fbG9ja19pcnEoJmktPmxvY2spOwotCi0JaWYgKGktPmhlYWQpIHsKLQkJbGlzdF9hZGQoJm10cHQtPmxpc3QsIGktPmhlYWQpOwotCQlzcGluX3VubG9ja19pcnEoJmktPmxvY2spOwotCi0JCXJldCA9IDA7Ci0JfSBlbHNlIHsKLQkJSU5JVF9MSVNUX0hFQUQoJm10cHQtPmxpc3QpOwotCQlpLT5oZWFkID0gJm10cHQtPmxpc3Q7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaS0+bG9jayk7Ci0KLQkJcmV0ID0gcmVxdWVzdF9pcnEobXRwdC0+cG9ydC5pcnEsIG11bHRpX2ludGVycnVwdCwKLQkJCQlpcnFfZmxhZ3MsICJzZXJpYWwiLCBpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlzZXJpYWxfZG9fdW5saW5rKGksIG10cHQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkIHNlcmlhbF91bmxpbmtfaXJxX2NoYWluKHN0cnVjdCBtcF9wb3J0ICptdHB0KQotewotCXN0cnVjdCBpcnFfaW5mbyAqaSA9IGlycV9saXN0cyArIG10cHQtPnBvcnQuaXJxOwotCi0JaWYgKGxpc3RfZW1wdHkoaS0+aGVhZCkpCi0JewotCQlmcmVlX2lycShtdHB0LT5wb3J0LmlycSwgaSk7Ci0JfQotCXNlcmlhbF9kb191bmxpbmsoaSwgbXRwdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopZGF0YTsKLQotCi0Jc3Bpbl9sb2NrKCZtdHB0LT5wb3J0LmxvY2spOwotCW11bHRpX2hhbmRsZV9wb3J0KG10cHQpOwotCXNwaW5fdW5sb2NrKCZtdHB0LT5wb3J0LmxvY2spOwotCi0JbW9kX3RpbWVyKCZtdHB0LT50aW1lciwgamlmZmllcysxICk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXVsdGlfdHhfZW1wdHkoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCXJldCA9IHNlcmlhbF9pbihtdHB0LCBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UID8gVElPQ1NFUl9URU1UIDogMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtdWx0aV9nZXRfbWN0cmwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JdW5zaWduZWQgaW50IHJldDsKLQotCXN0YXR1cyA9IHNlcmlhbF9pbihtdHB0LCBVQVJUX01TUik7Ci0KLQlyZXQgPSAwOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCi0JCXJldCB8PSBUSU9DTV9DQVI7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1JJKQotCQlyZXQgfD0gVElPQ01fUk5HOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EU1IpCi0JCXJldCB8PSBUSU9DTV9EU1I7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykKLQkJcmV0IHw9IFRJT0NNX0NUUzsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9zZXRfbWN0cmwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBjaGFyIG1jciA9IDA7Ci0KLQltY3RybCAmPSAweGZmOwotCi0JaWYgKG1jdHJsICYgVElPQ01fUlRTKQotCQltY3IgfD0gVUFSVF9NQ1JfUlRTOwotCWlmIChtY3RybCAmIFRJT0NNX0RUUikKLQkJbWNyIHw9IFVBUlRfTUNSX0RUUjsKLQlpZiAobWN0cmwgJiBUSU9DTV9PVVQxKQotCQltY3IgfD0gVUFSVF9NQ1JfT1VUMTsKLQlpZiAobWN0cmwgJiBUSU9DTV9PVVQyKQotCQltY3IgfD0gVUFSVF9NQ1JfT1VUMjsKLQlpZiAobWN0cmwgJiBUSU9DTV9MT09QKQotCQltY3IgfD0gVUFSVF9NQ1JfTE9PUDsKLQotCi0Jc2VyaWFsX291dChtdHB0LCBVQVJUX01DUiwgbWNyKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBtdWx0aV9icmVha19jdGwoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCWlmIChicmVha19zdGF0ZSA9PSAtMSkKLQkJbXRwdC0+bGNyIHw9IFVBUlRfTENSX1NCQzsKLQllbHNlCi0JCW10cHQtPmxjciAmPSB+VUFSVF9MQ1JfU0JDOwotCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9MQ1IsIG10cHQtPmxjcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci19Ci0KLQotCi1zdGF0aWMgaW50IG11bHRpX3N0YXJ0dXAoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0dmFsOwotCi0JbXRwdC0+Y2FwYWJpbGl0aWVzID0gdWFydF9jb25maWdbbXRwdC0+cG9ydC50eXBlXS5mbGFnczsKLQltdHB0LT5tY3IgPSAwOwotCi0JaWYgKG10cHQtPmNhcGFiaWxpdGllcyAmIFVBUlRfQ0xFQVJfRklGTykgewotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8pOwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfAotCQkJCVVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKTsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIDApOwotCX0KLQotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTFNSKTsKLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX1JYKTsKLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX0lJUik7Ci0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9NU1IpOwotCS8vdGVzdC13bGVlIDktYml0IGRpc2FibGUKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX01TUiwgMCk7Ci0KLQotCWlmICghKG10cHQtPnBvcnQuZmxhZ3MgJiBVUEZfQlVHR1lfVUFSVCkgJiYKLQkJCShzZXJpYWxfaW5wKG10cHQsIFVBUlRfTFNSKSA9PSAweGZmKSkgewotCQlwcmludGsoInR0eVMlZDogTFNSIHNhZmV0eSBjaGVjayBlbmdhZ2VkIVxuIiwgbXRwdC0+cG9ydC5saW5lKTsKLQkJLy9yZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoKCFpc19yZWFsX2ludGVycnVwdChtdHB0LT5wb3J0LmlycSkpIHx8IChtdHB0LT5wb2xsX3R5cGU9PVRZUEVfUE9MTCkpIHsKLQkJdW5zaWduZWQgaW50IHRpbWVvdXQgPSBtdHB0LT5wb3J0LnRpbWVvdXQ7Ci0KLQkJdGltZW91dCA9IHRpbWVvdXQgPiA2ID8gKHRpbWVvdXQgLyAyIC0gMikgOiAxOwotCi0JCW10cHQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyltdHB0OwotCQltb2RfdGltZXIoJm10cHQtPnRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Ci0JfSAKLQllbHNlIAotCXsKLQkJcmV0dmFsID0gc2VyaWFsX2xpbmtfaXJxX2NoYWluKG10cHQpOwotCQlpZiAocmV0dmFsKQotCQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgVUFSVF9MQ1JfV0xFTjgpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCWlmICgoaXNfcmVhbF9pbnRlcnJ1cHQobXRwdC0+cG9ydC5pcnEpKXx8KG10cHQtPnBvbGxfdHlwZT09VFlQRV9JTlRFUlJVUFQpKQotCQltdHB0LT5wb3J0Lm1jdHJsIHw9IFRJT0NNX09VVDI7Ci0KLQltdWx0aV9zZXRfbWN0cmwoJm10cHQtPnBvcnQsIG10cHQtPnBvcnQubWN0cmwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0JCi0JbXRwdC0+aWVyID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgbXRwdC0+aWVyKTsKLQotCSh2b2lkKSBzZXJpYWxfaW5wKG10cHQsIFVBUlRfTFNSKTsKLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX1JYKTsKLQkodm9pZCkgc2VyaWFsX2lucChtdHB0LCBVQVJUX0lJUik7Ci0JKHZvaWQpIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9NU1IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBtdWx0aV9zaHV0ZG93bihzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0KLQltdHB0LT5pZXIgPSAwOwotCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQltdHB0LT5wb3J0Lm1jdHJsICY9IH5USU9DTV9PVVQyOwotCi0JbXVsdGlfc2V0X21jdHJsKCZtdHB0LT5wb3J0LCBtdHB0LT5wb3J0Lm1jdHJsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdHB0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCXNlcmlhbF9vdXQobXRwdCwgVUFSVF9MQ1IsIHNlcmlhbF9pbnAobXRwdCwgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQyk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwKLQkJCVVBUlRfRkNSX0NMRUFSX1JDVlIgfAotCQkJVUFSVF9GQ1JfQ0xFQVJfWE1JVCk7Ci0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIDApOwotCi0KLQkodm9pZCkgc2VyaWFsX2luKG10cHQsIFVBUlRfUlgpOwotCi0JaWYgKCghaXNfcmVhbF9pbnRlcnJ1cHQobXRwdC0+cG9ydC5pcnEpKXx8KG10cHQtPnBvbGxfdHlwZT09VFlQRV9QT0xMKSkKLQl7Ci0JCWRlbF90aW1lcl9zeW5jKCZtdHB0LT50aW1lcik7Ci0JfQotCWVsc2UKLQl7Ci0JCXNlcmlhbF91bmxpbmtfaXJxX2NoYWluKG10cHQpOwotCX0KLX0KLQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXVsdGlfZ2V0X2Rpdmlzb3Ioc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGJhdWQpCi17Ci0JdW5zaWduZWQgaW50IHF1b3Q7Ci0KLQlpZiAoKHBvcnQtPmZsYWdzICYgVVBGX01BR0lDX01VTFRJUExJRVIpICYmCi0JCQliYXVkID09IChwb3J0LT51YXJ0Y2xrLzQpKQotCQlxdW90ID0gMHg4MDAxOwotCWVsc2UgaWYgKChwb3J0LT5mbGFncyAmIFVQRl9NQUdJQ19NVUxUSVBMSUVSKSAmJgotCQkJYmF1ZCA9PSAocG9ydC0+dWFydGNsay84KSkKLQkJcXVvdCA9IDB4ODAwMjsKLQllbHNlCi0JCXF1b3QgPSBzYl91YXJ0X2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOwotCi0JcmV0dXJuIHF1b3Q7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkIG11bHRpX3NldF90ZXJtaW9zKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBNUF9URVJNSU9TICp0ZXJtaW9zLCBzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkKQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBjaGFyIGN2YWwsIGZjciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgYmF1ZCwgcXVvdDsKLQotCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7Ci0JCWNhc2UgQ1M1OgotCQkJY3ZhbCA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSBDUzY6Ci0JCQljdmFsID0gMHgwMTsKLQkJCWJyZWFrOwotCQljYXNlIENTNzoKLQkJCWN2YWwgPSAweDAyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgQ1M4OgotCQkJY3ZhbCA9IDB4MDM7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQikKLQkJY3ZhbCB8PSAweDA0OwotCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKQotCQljdmFsIHw9IFVBUlRfTENSX1BBUklUWTsKLQlpZiAoISh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKSkKLQkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOwotCi0jaWZkZWYgQ01TUEFSCi0JaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDTVNQQVIpCi0JCWN2YWwgfD0gVUFSVF9MQ1JfU1BBUjsKLSNlbmRpZgotCi0JYmF1ZCA9IHNiX3VhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsvMTYpOwotCXF1b3QgPSBtdWx0aV9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKTsKLQotCWlmIChtdHB0LT5jYXBhYmlsaXRpZXMgJiBVQVJUX1VTRV9GSUZPKSB7Ci0JCS8vaWYgKGJhdWQgPCAyNDAwKQotCQkvLwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX1RSSUdHRVJfMTsKLQkJLy9lbHNlCi0JCS8vCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfVFJJR0dFUl84OwotCi0JCS8vCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgMHg5MDsKLQkJCWZjciA9IGZjcl9hcnJbbXRwdC0+cG9ydC5saW5lXTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXRwdC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQlzYl91YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwotCi0JbXRwdC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfRFI7Ci0JaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJTlBDSykKLQkJbXRwdC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0ZFIHwgVUFSVF9MU1JfUEU7Ci0JaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiAoQlJLSU5UIHwgUEFSTVJLKSkKLQkJbXRwdC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwotCi0JbXRwdC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOwotCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQotCQltdHB0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOwotCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOQlJLKSB7Ci0JCW10cHQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwotCQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUikKLQkJCW10cHQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FOwotCX0KLQotCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSA9PSAwKQotCQltdHB0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9EUjsKLQotCW10cHQtPmllciAmPSB+VUFSVF9JRVJfTVNJOwotCWlmIChVQVJUX0VOQUJMRV9NUygmbXRwdC0+cG9ydCwgdGVybWlvcy0+Y19jZmxhZykpCi0JCW10cHQtPmllciB8PSBVQVJUX0lFUl9NU0k7Ci0KLQlzZXJpYWxfb3V0KG10cHQsIFVBUlRfSUVSLCBtdHB0LT5pZXIpOwotCi0JaWYgKG10cHQtPmNhcGFiaWxpdGllcyAmIFVBUlRfU1RBUlRFQ0gpIHsKLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDB4QkYpOwotCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0VGUiwKLQkJCQl0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUyA/IFVBUlRfRUZSX0NUUyA6MCk7Ci0JfQotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIGN2YWwgfCBVQVJUX0xDUl9ETEFCKTsvKiBzZXQgRExBQiAqLwotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9ETEwsIHF1b3QgJiAweGZmKTsgICAgIC8qIExTIG9mIGRpdmlzb3IgKi8KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0RMTSwgcXVvdCA+PiA4KTsgICAgICAgLyogTVMgb2YgZGl2aXNvciAqLwotCi0Jc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIGN2YWwpOyAgICAgICAgLyogcmVzZXQgRExBQiAqLwotCW10cHQtPmxjciA9IGN2YWw7ICAgICAgICAgICAgICAgICAvKiBTYXZlIExDUiAqLwotCi0JaWYgKGZjciAmIFVBUlRfRkNSX0VOQUJMRV9GSUZPKSB7Ci0JCS8qIGVtdWxhdGVkIFVBUlRzIChMdWNlbnQgVmVudXMgMTY3eCkgbmVlZCB0d28gc3RlcHMgKi8KLQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKLQl9Ci0KLQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0ZDUiwgZmNyKTsgICAgIC8qIHNldCBmY3IgKi8KLQotCi0JaWYgKChtdHB0LT5wb3J0LnR5cGUgPT0gUE9SVF8xNkMxMDVYKQotCQl8fCAobXRwdC0+cG9ydC50eXBlID09IFBPUlRfMTZDMTA1WEEpKQotCXsKLQkJaWYoZGVlcFttdHB0LT5wb3J0LmxpbmVdIT0wKQotCQkJc2V0X2RlZXBfZmlmbyhwb3J0LCBFTkFCTEUpOwotCi0JCWlmIChtdHB0LT5pbnRlcmZhY2UgIT0gUlMyMzIpCi0JCQlzZXRfYXV0b19ydHMocG9ydCxtdHB0LT5pbnRlcmZhY2UpOwotCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChtdHB0LT5pbnRlcmZhY2UgPj0gUlM0ODVORSkKLQkJewotCQkJdWFydF9jbGVhcl9tY3RybCgmbXRwdC0+cG9ydCwgVElPQ01fUlRTKTsKLQkJfQotCX0KLQotCWlmKG10cHQtPmRldmljZS0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTVA0TSkKLQl7Ci0JCVNlbmRBVENvbW1hbmQobXRwdCk7Ci0JCXByaW50aygiU2VuZEFUQ29tbWFuZFxuIik7Ci0JfQkKLQltdWx0aV9zZXRfbWN0cmwoJm10cHQtPnBvcnQsIG10cHQtPnBvcnQubWN0cmwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm10cHQtPnBvcnQubG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9wbShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc3RhdGUsIHVuc2lnbmVkIGludCBvbGRzdGF0ZSkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdCA9IChzdHJ1Y3QgbXBfcG9ydCAqKXBvcnQ7Ci0JaWYgKHN0YXRlKSB7Ci0JCWlmIChtdHB0LT5jYXBhYmlsaXRpZXMgJiBVQVJUX1NUQVJURUNIKSB7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMHhCRik7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0VGUiwgVUFSVF9FRlJfRUNCKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfTENSLCAwKTsKLQkJCXNlcmlhbF9vdXRwKG10cHQsIFVBUlRfSUVSLCBVQVJUX0lFUlhfU0xFRVApOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDB4QkYpOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9FRlIsIDApOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDApOwotCQl9Ci0KLQkJaWYgKG10cHQtPnBtKQotCQkJbXRwdC0+cG0ocG9ydCwgc3RhdGUsIG9sZHN0YXRlKTsKLQl9IAotCWVsc2UgCi0JewotCQlpZiAobXRwdC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9TVEFSVEVDSCkgewotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9MQ1IsIDB4QkYpOwotCQkJc2VyaWFsX291dHAobXRwdCwgVUFSVF9FRlIsIFVBUlRfRUZSX0VDQik7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMCk7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0lFUiwgMCk7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMHhCRik7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0VGUiwgMCk7Ci0JCQlzZXJpYWxfb3V0cChtdHB0LCBVQVJUX0xDUiwgMCk7Ci0JCX0KLQotCQlpZiAobXRwdC0+cG0pCi0JCQltdHB0LT5wbShwb3J0LCBzdGF0ZSwgb2xkc3RhdGUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfcmVsZWFzZV9zdGRfcmVzb3VyY2Uoc3RydWN0IG1wX3BvcnQgKm10cHQpCi17Ci0JdW5zaWduZWQgaW50IHNpemUgPSA4IDw8IG10cHQtPnBvcnQucmVnc2hpZnQ7Ci0KLQlzd2l0Y2ggKG10cHQtPnBvcnQuaW90eXBlKSB7Ci0JCWNhc2UgVVBJT19NRU06Ci0JCQlpZiAoIW10cHQtPnBvcnQubWFwYmFzZSkKLQkJCQlicmVhazsKLQotCQkJaWYgKG10cHQtPnBvcnQuZmxhZ3MgJiBVUEZfSU9SRU1BUCkgewotCQkJCWlvdW5tYXAobXRwdC0+cG9ydC5tZW1iYXNlKTsKLQkJCQltdHB0LT5wb3J0Lm1lbWJhc2UgPSBOVUxMOwotCQkJfQotCi0JCQlyZWxlYXNlX21lbV9yZWdpb24obXRwdC0+cG9ydC5tYXBiYXNlLCBzaXplKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVVBJT19IVUI2OgotCQljYXNlIFVQSU9fUE9SVDoKLQkJCXJlbGVhc2VfcmVnaW9uKG10cHQtPnBvcnQuaW9iYXNlLHNpemUpOwotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtdWx0aV9yZWxlYXNlX3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLX0KLQotc3RhdGljIGludCBtdWx0aV9yZXF1ZXN0X3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlfY29uZmlnX3BvcnQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gKHN0cnVjdCBtcF9wb3J0ICopcG9ydDsKLQlpbnQgcHJvYmVmbGFncyA9IFBST0JFX0FOWTsKLQotCWlmIChmbGFncyAmIFVBUlRfQ09ORklHX1RZUEUpCi0JCWF1dG9jb25maWcobXRwdCwgcHJvYmVmbGFncyk7Ci0JaWYgKG10cHQtPnBvcnQudHlwZSAhPSBQT1JUX1VOS05PV04gJiYgZmxhZ3MgJiBVQVJUX0NPTkZJR19JUlEpCi0JCWF1dG9jb25maWdfaXJxKG10cHQpOwotCi0JaWYgKG10cHQtPnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04pCi0JCW11bHRpX3JlbGVhc2Vfc3RkX3Jlc291cmNlKG10cHQpOwotfQotCi1zdGF0aWMgaW50IG11bHRpX3ZlcmlmeV9wb3J0KHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCi17Ci0JaWYgKHNlci0+aXJxID49IE5SX0lSUVMgfHwgc2VyLT5pcnEgPCAwIHx8Ci0JCQlzZXItPmJhdWRfYmFzZSA8IDk2MDAgfHwgc2VyLT50eXBlIDwgUE9SVF9VTktOT1dOIHx8Ci0JCQlzZXItPnR5cGUgPT0gUE9SVF9TVEFSVEVDSCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICptdWx0aV90eXBlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaW50IHR5cGUgPSBwb3J0LT50eXBlOwotCi0JaWYgKHR5cGUgPj0gQVJSQVlfU0laRSh1YXJ0X2NvbmZpZykpCi0JCXR5cGUgPSAwOwotCXJldHVybiB1YXJ0X2NvbmZpZ1t0eXBlXS5uYW1lOwotfQotCi1zdGF0aWMgc3RydWN0IHNiX3VhcnRfb3BzIG11bHRpX3BvcHMgPSB7Ci0JLnR4X2VtcHR5ICAgPSBtdWx0aV90eF9lbXB0eSwKLQkuc2V0X21jdHJsICA9IG11bHRpX3NldF9tY3RybCwKLQkuZ2V0X21jdHJsICA9IG11bHRpX2dldF9tY3RybCwKLQkuc3RvcF90eCAgICA9IG11bHRpX3N0b3BfdHgsCi0JLnN0YXJ0X3R4ICAgPSBtdWx0aV9zdGFydF90eCwKLQkuc3RvcF9yeCAgICA9IG11bHRpX3N0b3BfcngsCi0JLmVuYWJsZV9tcyAgPSBtdWx0aV9lbmFibGVfbXMsCi0JLmJyZWFrX2N0bCAgPSBtdWx0aV9icmVha19jdGwsCi0JLnN0YXJ0dXAgICAgPSBtdWx0aV9zdGFydHVwLAotCS5zaHV0ZG93biAgID0gbXVsdGlfc2h1dGRvd24sCi0JLnNldF90ZXJtaW9zICAgID0gbXVsdGlfc2V0X3Rlcm1pb3MsCi0JLnBtICAgICAJPSBtdWx0aV9wbSwKLQkudHlwZSAgICAgICAJPSBtdWx0aV90eXBlLAotCS5yZWxlYXNlX3BvcnQgICA9IG11bHRpX3JlbGVhc2VfcG9ydCwKLQkucmVxdWVzdF9wb3J0ICAgPSBtdWx0aV9yZXF1ZXN0X3BvcnQsCi0JLmNvbmZpZ19wb3J0ICAgID0gbXVsdGlfY29uZmlnX3BvcnQsCi0JLnZlcmlmeV9wb3J0ICAgID0gbXVsdGlfdmVyaWZ5X3BvcnQsCi19OwotCi1zdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIG11bHRpX3JlZyA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZHJpdmVyX25hbWUgICAgPSAiZ29sZGVsX3R1bGlwIiwKLQkuZGV2X25hbWUgICAgICAgPSAidHR5TVAiLAotCS5tYWpvciAgICAgICAgICA9IFNCX1RUWV9NUF9NQUpPUiwKLQkubWlub3IgICAgICAgICAgPSAwLAotCS5uciAgICAgICAgICAgICA9IE1BWF9NUF9QT1JULCAKLQkuY29ucyAgICAgICAgICAgPSBOVUxMLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG11bHRpX2luaXRfcG9ydHModm9pZCkKLXsKLQlzdHJ1Y3QgbXBfcG9ydCAqbXRwdDsKLQlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQlpbnQgaSxqLGs7Ci0JdW5zaWduZWQgY2hhciBvc2M7Ci0JdW5zaWduZWQgY2hhciBiX3JldCA9IDA7Ci0Jc3RhdGljIHN0cnVjdCBtcF9kZXZpY2VfdCAqc2JkZXY7IAotCi0JaWYgKCFmaXJzdCkKLQkJcmV0dXJuOwotCWZpcnN0ID0gMDsKLQotCW10cHQgPSBtdWx0aV9wb3J0czsgCi0KLQlmb3IgKGs9MDtrPE5SX0JPQVJEO2srKykKLQl7Ci0JCXNiZGV2ID0gJm1wX2RldnNba107Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNiZGV2LT5ucl9wb3J0czsgaSsrLCBtdHB0KyspIAotCQl7Ci0JCQltdHB0LT5kZXZpY2UgCQk9IHNiZGV2OwotCQkJbXRwdC0+cG9ydC5pb2Jhc2UgICA9IHNiZGV2LT51YXJ0X2FjY2Vzc19hZGRyICsgOCppOwotCQkJbXRwdC0+cG9ydC5pcnEgICAgICA9IHNiZGV2LT5pcnE7Ci0JCQlpZiAoICgoc2JkZXYtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX01QNCkmJihzYmRldi0+cmV2aXNpb249PTB4OTEpKSkKLQkJCQltdHB0LT5pbnRlcmZhY2VfY29uZmlnX2FkZHIgPSBzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgMHgwOCArIGk7Ci0JCQllbHNlIGlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQkJCQltdHB0LT5pbnRlcmZhY2VfY29uZmlnX2FkZHIgPSBzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgMHgwOCArIChpICYgMHgxKTsKLQkJCWVsc2UKLQkJCQltdHB0LT5pbnRlcmZhY2VfY29uZmlnX2FkZHIgPSBzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgMHgwOCArIGkvODsKLQotCQkJbXRwdC0+b3B0aW9uX2Jhc2VfYWRkciA9IHNiZGV2LT5vcHRpb25fcmVnX2FkZHI7Ci0KLQkJCW10cHQtPnBvbGxfdHlwZSA9IHNiZGV2LT5wb2xsX3R5cGU7Ci0KLQkJCW10cHQtPnBvcnQudWFydGNsayAgPSBCQVNFX0JBVUQgKiAxNjsKLQotCQkJLyogZ2V0IGlucHV0IGNsb2NrIGluZm9ybWF0aW9uICovCi0JCQlvc2MgPSBpbmIoc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIE1QX09QVFJfRElSMCArIGkvOCkgJiAweDBGOwotCQkJaWYgKG9zYz09MHgwZikKLQkJCQlvc2MgPSAwOwotCQkJZm9yKGo9MDtqPG9zYztqKyspCi0JCQkJbXRwdC0+cG9ydC51YXJ0Y2xrICo9IDI7Ci0JCQltdHB0LT5wb3J0LmZsYWdzICAgIHw9IFNURF9DT01fRkxBR1MgfCBVUEZfU0hBUkVfSVJRIDsKLQkJCW10cHQtPnBvcnQuaW90eXBlICAgPSBVUElPX1BPUlQ7Ci0JCQltdHB0LT5wb3J0Lm9wcyAgICAgID0gJm11bHRpX3BvcHM7Ci0KLQkJCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQkJCXsKLQkJCQkvKiBmb3IgU0IxNkMxMDUzQVBDSSAqLwotCQkJCWJfcmV0ID0gc2IxMDUzYV9nZXRfaW50ZXJmYWNlKG10cHQsIGkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWJfcmV0ID0gcmVhZF9vcHRpb25fcmVnaXN0ZXIobXRwdCwoTVBfT1BUUl9JSVIwICsgaS84KSk7Ci0JCQkJcHJpbnRrKCJJSVJfUkVUID0gJXhcbiIsYl9yZXQpOwotCQkJfQotCi0JCQkvKiBkZWZhdWx0IHRvIFJTMjMyICovCi0JCQltdHB0LT5pbnRlcmZhY2UgPSBSUzIzMjsKLQkJCWlmIChJSVJfUlM0MjIgPT0gKGJfcmV0ICYgSUlSX1RZUEVfTUFTSykpCi0JCQkJbXRwdC0+aW50ZXJmYWNlID0gUlM0MjJQVFA7Ci0JCQlpZiAoSUlSX1JTNDg1ID09IChiX3JldCAmIElJUl9UWVBFX01BU0spKQotCQkJCW10cHQtPmludGVyZmFjZSA9IFJTNDg1TkU7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBtdWx0aV9yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydikKLXsKLQlpbnQgaTsKLQotCW11bHRpX2luaXRfcG9ydHMoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7Ci0JCXN0cnVjdCBtcF9wb3J0ICptdHB0ID0gJm11bHRpX3BvcnRzW2ldOwotCi0JCW10cHQtPnBvcnQubGluZSA9IGk7Ci0JCW10cHQtPnBvcnQub3BzID0gJm11bHRpX3BvcHM7Ci0JCWluaXRfdGltZXIoJm10cHQtPnRpbWVyKTsKLQkJbXRwdC0+dGltZXIuZnVuY3Rpb24gPSBtdWx0aV90aW1lb3V0OwotCQltcF9hZGRfb25lX3BvcnQoZHJ2LCAmbXRwdC0+cG9ydCk7Ci0JfQotfQotCi0vKioKLSAqIHBjaV9yZW1hcF9iYXNlIC0gcmVtYXAgQkFSIHZhbHVlIG9mIHBjaSBkZXZpY2UKLSAqCi0gKiBQQVJBTUVURVJTCi0gKiAgcGNpZGV2ICAtIHBjaV9kZXYgc3RydWN0dXJlIGFkZHJlc3MKLSAqICBvZmZzZXQgIC0gQkFSIG9mZnNldCBQQ0lfQkFTRV9BRERSRVNTXzAgfiBQQ0lfQkFTRV9BRERSRVNTXzQKLSAqICBhZGRyZXNzIC0gYWRkcmVzcyB0byBiZSBjaGFuZ2VkIEJBUiB2YWx1ZQotICogIHNpemUJLSBzaXplIG9mIGFkZHJlc3Mgc3BhY2UgCi0gKgotICogUkVUVVJOUwotICogIElmIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyAwLiBPdGhlcndpc2UsIEl0IHJldHVybnMgLTEuCi0gKi8KLXN0YXRpYyBpbnQgcGNpX3JlbWFwX2Jhc2Uoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgdW5zaWduZWQgaW50IG9mZnNldCwgCi0JCXVuc2lnbmVkIGludCBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgc2l6ZSkgCi17Ci0jaWYgMAotCXN0cnVjdCByZXNvdXJjZSAqcm9vdDsKLQl1bnNpZ25lZCBpbmRleCA9IChvZmZzZXQgLSAweDEwKSA+PiAyOwotI2VuZGlmCi0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgb2Zmc2V0LCBhZGRyZXNzKTsKLSNpZiAwCi0Jcm9vdCA9IHBjaWRldi0+cmVzb3VyY2VbaW5kZXhdLnBhcmVudDsKLQlyZWxlYXNlX3Jlc291cmNlKCZwY2lkZXYtPnJlc291cmNlW2luZGV4XSk7Ci0JYWRkcmVzcyAmPSB+MHgxOwotCXBjaWRldi0+cmVzb3VyY2VbaW5kZXhdLnN0YXJ0ID0gYWRkcmVzczsKLQlwY2lkZXYtPnJlc291cmNlW2luZGV4XS5lbmQJICA9IGFkZHJlc3MgKyBzaXplIC0gMTsKLQotCWlmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsICZwY2lkZXYtPnJlc291cmNlW2luZGV4XSkgIT0gTlVMTCkKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAicGNpIHJlbWFwIGNvbmZsaWN0ISEgMHgleFxuIiwgYWRkcmVzcyk7Ci0JCXJldHVybiAoLTEpOwotCX0KLSNlbmRpZgotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludCBpbml0X21wX2RldihzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBtcHBjaWJyZF90IGJyZCkKLXsKLQlzdGF0aWMgc3RydWN0IG1wX2RldmljZV90ICpzYmRldiA9IG1wX2RldnM7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKLQlpbnQgajsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJldCA9IE5VTEw7Ci0KLQlzYmRldi0+ZGV2aWNlX2lkID0gYnJkLmRldmljZV9pZDsKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJihzYmRldi0+cmV2aXNpb24pKTsKLQlzYmRldi0+bmFtZSA9IGJyZC5uYW1lOwotCXNiZGV2LT51YXJ0X2FjY2Vzc19hZGRyID0gcGNpZGV2LT5yZXNvdXJjZVswXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQotCS8qIGNoZWNrIHJldmlzaW9uLiBUaGUgU0IxNkMxMDUzQVBDSSdzIG9wdGlvbiBpL28gYWRkcmVzcyBpcyBCQVI0ICovCi0JaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCXsKLQkJLyogU0IxNkMxMDUzQVBDSSAqLwotCQlzYmRldi0+b3B0aW9uX3JlZ19hZGRyID0gcGNpZGV2LT5yZXNvdXJjZVs0XS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQl9Ci0JZWxzZQotCXsKLQkJc2JkZXYtPm9wdGlvbl9yZWdfYWRkciA9IHBjaWRldi0+cmVzb3VyY2VbMV0uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JfQotI2lmIDEJCi0JaWYgKHNiZGV2LT5yZXZpc2lvbiA9PSAweGMwKQotCXsKLQkJb3V0YigweDAwLCBzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgTVBfT1BUUl9HUE9DUik7Ci0JCWluYihzYmRldi0+b3B0aW9uX3JlZ19hZGRyICsgTVBfT1BUUl9HUE9DUik7Ci0JCW91dGIoMHg4Mywgc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIE1QX09QVFJfR1BPQ1IpOwotCX0KLSNlbmRpZgotCi0Jc2JkZXYtPmlycSA9IHBjaWRldi0+aXJxOwotCi0JaWYgKChicmQuZGV2aWNlX2lkICYgMHgwODAwKSB8fCAhKGJyZC5kZXZpY2VfaWQgJjB4ZmYwMCkpCi0JewotCQlzYmRldi0+cG9sbF90eXBlID0gVFlQRV9JTlRFUlJVUFQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXNiZGV2LT5wb2xsX3R5cGUgPSBUWVBFX1BPTEw7Ci0JfQotCi0JLyogY29kZXMgd2hpY2ggaXMgc3BlY2lmaWMgdG8gZWFjaCBib2FyZCovCi0Jc3dpdGNoKGJyZC5kZXZpY2VfaWQpewotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVAxIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDEgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QMUUgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX0dUX01QMSA6Ci0JCQlzYmRldi0+bnJfcG9ydHMgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDIgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QMiA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfR1RfTVAyIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDJCIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDJFIDoKLQkJCXNiZGV2LT5ucl9wb3J0cyA9IDI7Ci0KLQkJCS8qIHNlcmlhbCBiYXNlIGFkZHJlc3MgcmVtYXAgKi8KLQkJCWlmIChzYmRldi0+cmV2aXNpb24gPT0gMHhjMCkKLQkJCXsKLQkJCQlpbnQgcHJldl9wb3J0X2FkZHIgPSAwOwotCi0JCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmcHJldl9wb3J0X2FkZHIpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18xLCBwcmV2X3BvcnRfYWRkciArIDgsIDgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDQgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVA0QSA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVA0IDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX0dUX01QNCA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9HVF9NUDRBIDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9HVF9NUDQgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVA0TSA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVA0QiA6Ci0JCQlzYmRldi0+bnJfcG9ydHMgPSA0OwotCi0JCQlpZihzYmRldi0+cmV2aXNpb24gPT0gMHg5MSl7Ci0JCQkJc2JkZXYtPnJlc2VydmVkX2FkZHJbMF0gPSBwY2lkZXYtPnJlc291cmNlWzBdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCQkJCW91dGIoMHgwMyAsIHNiZGV2LT5yZXNlcnZlZF9hZGRyWzBdICsgMHgwMSk7Ci0JCQkJb3V0YigweDAzICwgc2JkZXYtPnJlc2VydmVkX2FkZHJbMF0gKyAweDAyKTsKLQkJCQlvdXRiKDB4MDEgLCBzYmRldi0+cmVzZXJ2ZWRfYWRkclswXSArIDB4MjApOwotCQkJCW91dGIoMHgwMCAsIHNiZGV2LT5yZXNlcnZlZF9hZGRyWzBdICsgMHgyMSk7Ci0JCQkJcmVxdWVzdF9yZWdpb24oc2JkZXYtPnJlc2VydmVkX2FkZHJbMF0sIDMyLCBzYmRldi0+bmFtZSk7Ci0JCQkJc2JkZXYtPnVhcnRfYWNjZXNzX2FkZHIgPSBwY2lkZXYtPnJlc291cmNlWzFdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCQkJCXNiZGV2LT5vcHRpb25fcmVnX2FkZHIgPSBwY2lkZXYtPnJlc291cmNlWzJdLnN0YXJ0ICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCQkJfQotCi0JCQkvKiBTQjE2QzEwNTNBUENJICovCi0JCQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JCQl7Ci0JCQkJaW50IHByZXZfcG9ydF9hZGRyID0gMDsKLQotCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnByZXZfcG9ydF9hZGRyKTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgcHJldl9wb3J0X2FkZHIgKyA4LCA4KTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMiwgcHJldl9wb3J0X2FkZHIgKyAxNiwgOCk7Ci0JCQkJcGNpX3JlbWFwX2Jhc2UocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzMsIHByZXZfcG9ydF9hZGRyICsgMjQsIDgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9NUDYgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfTVA2QSA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9HVF9NUDYgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfR1RfTVA2QSA6Ci0JCQlzYmRldi0+bnJfcG9ydHMgPSA2OwotCi0JCQkvKiBTQjE2QzEwNTNBUENJICovCi0JCQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JCQl7Ci0JCQkJaW50IHByZXZfcG9ydF9hZGRyID0gMDsKLQotCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnByZXZfcG9ydF9hZGRyKTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgcHJldl9wb3J0X2FkZHIgKyA4LCA4KTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMiwgcHJldl9wb3J0X2FkZHIgKyAxNiwgMTYpOwotCQkJCXBjaV9yZW1hcF9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18zLCBwcmV2X3BvcnRfYWRkciArIDMyLCAxNik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QOCA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfTVA4IDoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX0dUX01QOCA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfR1RfTVA4IDoKLQkJY2FzZSBQQ0lFX0RFVklDRV9JRF9NUDhCIDoKLQkJCXNiZGV2LT5ucl9wb3J0cyA9IDg7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QMzIgOgotCQljYXNlIFBDSUVfREVWSUNFX0lEX01QMzIgOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfR1RfTVAzMiA6Ci0JCWNhc2UgUENJRV9ERVZJQ0VfSURfR1RfTVAzMiA6Ci0JCQl7Ci0JCQkJaW50IHBvcnRudW1faGV4PTA7Ci0JCQkJcG9ydG51bV9oZXggPSBpbmIoc2JkZXYtPm9wdGlvbl9yZWdfYWRkcik7Ci0JCQkJc2JkZXYtPm5yX3BvcnRzID0gKChwb3J0bnVtX2hleC8xNikqMTApICsgKHBvcnRudW1faGV4ICUgMTYpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX1BBUlBPUlRfUEMKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QMlMxUCA6Ci0JCQlzYmRldi0+bnJfcG9ydHMgPSAyOwotCi0JCQkvKiBTQjE2QzEwNTNBUENJICovCi0JCQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JCQl7Ci0JCQkJaW50IHByZXZfcG9ydF9hZGRyID0gMDsKLQotCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnByZXZfcG9ydF9hZGRyKTsKLQkJCQlwY2lfcmVtYXBfYmFzZShwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgcHJldl9wb3J0X2FkZHIgKyA4LCA4KTsKLQkJCX0KLQotCQkJLyogYWRkIFBDIGNvbXBhdGlibGUgcGFyYWxsZWwgcG9ydCAqLwotCQkJcGFycG9ydF9wY19wcm9iZV9wb3J0KHBjaWRldi0+cmVzb3VyY2VbMl0uc3RhcnQsIHBjaWRldi0+cmVzb3VyY2VbM10uc3RhcnQsIFBBUlBPUlRfSVJRX05PTkUsIFBBUlBPUlRfRE1BX05PTkUsICZwY2lkZXYtPmRldiwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX01QMVAgOgotCQkJLyogYWRkIFBDIGNvbXBhdGlibGUgcGFyYWxsZWwgcG9ydCAqLwotCQkJcGFycG9ydF9wY19wcm9iZV9wb3J0KHBjaWRldi0+cmVzb3VyY2VbMl0uc3RhcnQsIHBjaWRldi0+cmVzb3VyY2VbM10uc3RhcnQsIFBBUlBPUlRfSVJRX05PTkUsIFBBUlBPUlRfRE1BX05PTkUsICZwY2lkZXYtPmRldiwgMCk7Ci0JCQlicmVhazsKLSNlbmRpZgotCX0KLQotCXJldCA9IHJlcXVlc3RfcmVnaW9uKHNiZGV2LT51YXJ0X2FjY2Vzc19hZGRyLCAoOCpzYmRldi0+bnJfcG9ydHMpLCBzYmRldi0+bmFtZSk7Ci0KLQlpZiAoc2JkZXYtPnJldmlzaW9uID09IDB4YzApCi0JewotCQlyZXQgPSByZXF1ZXN0X3JlZ2lvbihzYmRldi0+b3B0aW9uX3JlZ19hZGRyLCAweDQwLCBzYmRldi0+bmFtZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldCA9IHJlcXVlc3RfcmVnaW9uKHNiZGV2LT5vcHRpb25fcmVnX2FkZHIsIDB4MjAsIHNiZGV2LT5uYW1lKTsKLQl9Ci0KLQotCU5SX0JPQVJEKys7Ci0JTlJfUE9SVFMgKz0gc2JkZXYtPm5yX3BvcnRzOwotCi0JLyogRW5hYmxlIFBDSSBpbnRlcnJ1cHQgKi8KLQlhZGRyID0gc2JkZXYtPm9wdGlvbl9yZWdfYWRkciArIE1QX09QVFJfSU1SMDsKLQlmb3Ioaj0wOyBqIDwgKHNiZGV2LT5ucl9wb3J0cy84KSsxOyBqKyspCi0JewotCQlpZiAoc2JkZXYtPnBvbGxfdHlwZSA9PSBUWVBFX0lOVEVSUlVQVCkKLQkJewotCQkJb3V0YigweGZmLGFkZHIgK2opOwotCQl9Ci0JfQotCXNiZGV2Kys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbXVsdGlfaW5pdCh2b2lkKQotewotCWludCByZXQsIGk7Ci0Jc3RydWN0IHBjaV9kZXYgICpkZXYgPSBOVUxMOwotCi0JaWYoZmNyX2NvdW50PT0wKQotCXsKLQkJZm9yKGk9MDtpPDI1NjtpKyspCi0JCXsKLQkJCWZjcl9hcnJbaV0gPSAweDAxOwotCQkJCi0JCX0KLQl9Ci0JaWYoZGVlcF9jb3VudD09MCkKLQl7Ci0JCWZvcihpPTA7aTwyNTY7aSsrKQotCQl7Ci0JCQlkZWVwW2ldID0gMTsKLQkJCQotCQl9Ci0JfQotCWlmKHJ0cl9jb3VudD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcihpPTA7aTwyNTY7aSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ0cltpXSA9IDB4MTA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0JaWYodHRyX2NvdW50PT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKGk9MDtpPDI1NjtpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHRyW2ldID0gMHgzODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi1wcmludGsoIk1VTFRJIElOSVRcbiIpOwotCWZvciggaT0wOyBpPCBtcF9ucnBjaWJyZHM7IGkrKykKLQl7Ci0KLQkJd2hpbGUoIChkZXYgPSBwY2lfZ2V0X2RldmljZShtcF9wY2lib2FyZHNbaV0udmVuZG9yX2lkLCBtcF9wY2lib2FyZHNbaV0uZGV2aWNlX2lkLCBkZXYpICkgKQotCi0JCXsKLXByaW50aygiRk9VTkR+fn5cbiIpOwotLy8JQ2VudCBPUyBidWcgZml4Ci0vLwkJCWlmIChtcF9wY2lib2FyZHNbaV0uZGV2aWNlX2lkICYgMHgwODAwKQotCQkJewotCQkJCWludCBzdGF0dXM7Ci0JICAgICAgICAJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCSAgICAgICAgCQlzdGF0dXMgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwotICAgICAgICAgICAgCi0JICAgCQkgICAgIAlpZiAoc3RhdHVzICE9IDApCi0gICAgICAgIAkJCXsgCi0gICAgICAgICAgICAgICAJCQkJcHJpbnRrKCJNdWx0aXBvcnQgQm9hcmQgRW5hYmxlIEZhaWwgIVxuXG4iKTsKLSAgICAgICAgICAgICAgIAkJCQlzdGF0dXMgPSAtRU5YSU87Ci0gICAgICAgICAgICAgICAgCQkJcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgCQkJfQotCQkJfQotCi0JCQlpbml0X21wX2RldihkZXYsIG1wX3BjaWJvYXJkc1tpXSk7CQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykKLQkJc3Bpbl9sb2NrX2luaXQoJmlycV9saXN0c1tpXS5sb2NrKTsKLQotCXJldCA9IG1wX3JlZ2lzdGVyX2RyaXZlcigmbXVsdGlfcmVnKTsKLQotCWlmIChyZXQgPj0gMCkKLQkJbXVsdGlfcmVnaXN0ZXJfcG9ydHMoJm11bHRpX3JlZyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXVsdGlfZXhpdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspCi0JCW1wX3JlbW92ZV9vbmVfcG9ydCgmbXVsdGlfcmVnLCAmbXVsdGlfcG9ydHNbaV0ucG9ydCk7Ci0KLQltcF91bnJlZ2lzdGVyX2RyaXZlcigmbXVsdGlfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQobXVsdGlfaW5pdCk7Ci1tb2R1bGVfZXhpdChtdWx0aV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTeXN0ZW1CYXNlIE11bHRpcG9ydCBQQ0kvUENJZSBDT1JFIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3BjaV9tcC5oIGIvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9wY2lfbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZTRhYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3BjaV9tcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vc2VyaWFsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLQotI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLQotCi0jZGVmaW5lIE1QX1RFUk1JT1MgIGt0ZXJtaW9zCi0KLSNpbmNsdWRlICJzYl9tcF9yZWdpc3Rlci5oIgotI2luY2x1ZGUgInNiX3Nlcl9jb3JlLmgiCi0KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gICIxLjEiCi0jZGVmaW5lIERSSVZFUl9EQVRFICAgICAiMjAxMi8wMS8wNSIKLSNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgIlNZU1RFTUJBU0U8dGVjaEBzeXNiYXMuY29tPiIKLSNkZWZpbmUgRFJJVkVSX0RFU0MgICJTeXN0ZW1CYXNlIFBDSS9QQ0llIE11bHRpcG9ydCBDb3JlIgotCi0jZGVmaW5lIFNCX1RUWV9NUF9NQUpPUgkJCTU0Ci0jZGVmaW5lIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUCQkweDE0QTEKLQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QMQkJMHg0ZDAxCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVAyCQkweDRkMDIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDQJCTB4NGQwNAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QNEEJCTB4NGQ1NAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QNgkJMHg0ZDA2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVA2QQkJMHg0ZDU2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVA4CQkweDRkMDgKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDMyCQkweDRkMzIKLS8qIFBhcmFsbGVsIHBvcnQgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDFQCQkweDQzMDEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9NUDJTMVAJCTB4NDMwMwotCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QMQkJMHg0NTAxCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QMgkJMHg0NTAyCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QNAkJMHg0NTA0Ci0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QOAkJMHg0NTA4Ci0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QMzIJCTB4NDUzMgotCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QMUUJCTB4NGUwMQotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDJFCQkweDRlMDIKLSNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTVAyQgkJMHg0YjAyCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX01QNEIJCTB4NGIwNAotI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9NUDhCCQkweDRiMDgKLQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dUX01QNAkJMHgwMDA0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfR1RfTVA0QQkJMHgwMDU0Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfR1RfTVA2CQkweDAwMDYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9HVF9NUDZBCQkweDAwNTYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9HVF9NUDgJCTB4MDAwOAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0dUX01QMzIJCTB4MDAzMgotCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX0dUX01QMQkJMHgxNTAxCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX0dUX01QMgkJMHgxNTAyCi0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX0dUX01QNAkJMHgxNTA0Ci0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX0dUX01QOAkJMHgxNTA4Ci0jZGVmaW5lIFBDSUVfREVWSUNFX0lEX0dUX01QMzIJCTB4MTUzMgotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVA0TQkJMHg0NjA0ICAvL21vZGVtCi0KLSNkZWZpbmUgTUFYX01QX0RFViAgOAotI2RlZmluZSBCRF9NQVhfUE9SVCAzMiAJLyogTWF4IHNlcmlhbCBwb3J0IGluIG9uZSBib2FyZCAqLwotI2RlZmluZSBNQVhfTVBfUE9SVCAyNTYgLyogTWF4IHNlcmlhbCBwb3J0IGluIG9uZSBQQyAqLwotCi0jZGVmaW5lIFBPUlRfMTZDMTA1WEEJMwotI2RlZmluZSBQT1JUXzE2QzEwNVgJMgotI2RlZmluZSBQT1JUXzE2QzU1WAkJMQotCi0jZGVmaW5lIEVOQUJMRQkJMQotI2RlZmluZSBESVNBQkxFCQkwCi0KLS8qIGlvY3RscyAqLwotI2RlZmluZSBUSU9DR05VTU9GUE9SVAkJMHg1NDVGCi0jZGVmaW5lIFRJT0NTTVVMVElFQ0hPCQkweDU0NDAKLSNkZWZpbmUgVElPQ1NQVFBOT0VDSE8JCTB4NTQ0MQotCi0jZGVmaW5lIFRJT0NHT1BUSU9OUkVHCQkweDU0NjEKLSNkZWZpbmUgVElPQ0dESVNBQkxFSVJRCQkweDU0NjIKLSNkZWZpbmUgVElPQ0dFTkFCTEVJUlEJCTB4NTQ2MwotI2RlZmluZSBUSU9DR1NPRlRSRVNFVAkJMHg1NDY0Ci0jZGVmaW5lIFRJT0NHU09GVFJFU0VUUgkJMHg1NDY1Ci0jZGVmaW5lIFRJT0NHUkVHSU5GTwkJMHg1NDY2Ci0jZGVmaW5lIFRJT0NHR0VUTFNSCQkweDU0NjcKLSNkZWZpbmUgVElPQ0dHRVRERVZJRAkJMHg1NDY4Ci0jZGVmaW5lIFRJT0NHR0VUQkROTwkJMHg1NDY5Ci0jZGVmaW5lIFRJT0NHR0VUSU5URVJGQUNFCTB4NTQ2QQotI2RlZmluZSBUSU9DR0dFVFJFVgkJMHg1NDZCCi0jZGVmaW5lIFRJT0NHR0VUTlJQT1JUUwkJMHg1NDZDCi0jZGVmaW5lIFRJT0NHR0VUUE9SVFRZUEUJMHg1NDZECi0jZGVmaW5lIEdFVERFRVBGSUZPCQkweDU0QUEKLSNkZWZpbmUgU0VUREVFUEZJRk8JCTB4NTRBQgotI2RlZmluZSBTRVRGQ1IJCQkweDU0QkEKLSNkZWZpbmUgU0VUVFRSCQkJMHg1NEIxCi0jZGVmaW5lIFNFVFJUUgkJCTB4NTRCMgotI2RlZmluZSBHRVRUVFIJCQkweDU0QjMKLSNkZWZpbmUgR0VUUlRSCQkJMHg1NEI0Ci0KLS8qIG11bHRpLWRyb3AgbW9kZSByZWxhdGVkIGlvY3RsIGNvbW1hbmRzICovCi0jZGVmaW5lIFRJT0NTTVVMVElEUk9QCQkweDU0NzAKLSNkZWZpbmUgVElPQ1NNREFERFIgICAJCTB4NTQ3MQotI2RlZmluZSBUSU9DR01EQUREUiAgIAkJMHg1NDcyCi0jZGVmaW5lIFRJT0NTRU5EQUREUgkJMHg1NDczCi0KLQotLyogc2VyaWFsIGludGVyZmFjZSAqLwotI2RlZmluZSBSUzIzMgkJMSAKLSNkZWZpbmUgUlM0MjJQVFAJMgotI2RlZmluZSBSUzQyMk1ECQkzCi0jZGVmaW5lIFJTNDg1TkUJCTQKLSNkZWZpbmUgUlM0ODVFQ0hPCTUKLQotI2RlZmluZSBzZXJpYWxfaW5wKHVwLCBvZmZzZXQpICAgICAgc2VyaWFsX2luKHVwLCBvZmZzZXQpCi0jZGVmaW5lIHNlcmlhbF9vdXRwKHVwLCBvZmZzZXQsIHZhbHVlKSAgc2VyaWFsX291dCh1cCwgb2Zmc2V0LCB2YWx1ZSkKLQkKLSNkZWZpbmUgUEFTU19MSU1JVCAgMjU2Ci0jZGVmaW5lIGlzX3JlYWxfaW50ZXJydXB0KGlycSkgICgoaXJxKSAhPSAwKQotCi0jZGVmaW5lIFBST0JFX0FOWSAgICh+MCkKLQotc3RhdGljIERFRklORV9NVVRFWChtcF9tdXRleCk7Ci0jZGVmaW5lIE1QX01VVEVYX0xPQ0soeCkgbXV0ZXhfbG9jaygmKHgpKSAKLSNkZWZpbmUgTVBfTVVURVhfVU5MT0NLKHgpIG11dGV4X3VubG9jaygmKHgpKSAKLSNkZWZpbmUgTVBfU1RBVEVfTE9DSyh4KSBtdXRleF9sb2NrKCYoKHgpLT5tdXRleCkpIAotI2RlZmluZSBNUF9TVEFURV9VTkxPQ0soeCkgbXV0ZXhfdW5sb2NrKCYoKHgpLT5tdXRleCkpIAotICAgICAgICAKLQotI2RlZmluZSBVQVJUX0xTUl9TUEVDSUFMICAgIDB4MUUKLSAgICAgICAgCi0jZGVmaW5lIEhJR0hfQklUU19PRkZTRVQgICAgICAgICgoc2l6ZW9mKGxvbmcpLXNpemVvZihpbnQpKSo4KQotI2RlZmluZSB1YXJ0X3VzZXJzKHN0YXRlKSAgICAgICAoKHN0YXRlKS0+Y291bnQgKyAoKHN0YXRlKS0+aW5mbyA/IChzdGF0ZSktPmluZm8tPmJsb2NrZWRfb3BlbiA6IDApKQotCi0KLS8vI2RlZmluZSBNUF9ERUJVRyAxCi0jdW5kZWYgTVBfREVCVUcKLQotI2lmZGVmIE1QX0RFQlVHCi0jZGVmaW5lIERQUklOVEsoeC4uLikgICBwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lIERQUklOVEsoeC4uLikgICBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmZGVmIE1QX0RFQlVHCi0jZGVmaW5lIERFQlVHX0FVVE9DT05GKGZtdC4uLikgIHByaW50ayhmbXQpCi0jZWxzZQotI2RlZmluZSBERUJVR19BVVRPQ09ORihmbXQuLi4pICBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmZGVmIE1QX0RFQlVHCi0jZGVmaW5lIERFQlVHX0lOVFIoZm10Li4uKSAgcHJpbnRrKGZtdCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX0lOVFIoZm10Li4uKSAgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKENPTkZJR19NNDg2KQotI2RlZmluZSBTRVJJQUxfSU5MSU5FCi0jZW5kaWYKLSNpZmRlZiBTRVJJQUxfSU5MSU5FCi0jZGVmaW5lIF9JTkxJTkVfIGlubGluZQotI2Vsc2UKLSNkZWZpbmUgX0lOTElORV8KLSNlbmRpZgotCi0jZGVmaW5lIFRZUEVfUE9MTAkxCi0jZGVmaW5lIFRZUEVfSU5URVJSVVBUCTIKLQotCi1zdHJ1Y3QgbXBfZGV2aWNlX3QgewotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgZGV2aWNlX2lkOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgcmV2aXNpb247Ci0gICAgICAgIGNoYXIgICAgICAgICAgICAqbmFtZTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgIHVhcnRfYWNjZXNzX2FkZHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICBvcHRpb25fcmVnX2FkZHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICByZXNlcnZlZF9hZGRyWzRdOwotICAgICAgICBpbnQgICAgICAgICAgICAgaXJxOwotICAgICAgICBpbnQgICAgICAgICAgICAgbnJfcG9ydHM7Ci0gICAgICAgIGludCAgICAgICAgICAgICBwb2xsX3R5cGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBtcHBjaWJyZCB7Ci0gICAgICAgIGNoYXIgICAgICAgICAgICAqbmFtZTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHZlbmRvcl9pZDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIGRldmljZV9pZDsKLX0gbXBwY2licmRfdDsKLQotc3RhdGljIG1wcGNpYnJkX3QgbXBfcGNpYm9hcmRzW10gPSB7Ci0KLSAgICAgICAgeyAiTXVsdGktMSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVAxfSAsCi0gICAgICAgIHsgIk11bHRpLTIgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QMn0gLAotICAgICAgICB7ICJNdWx0aS00IFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDR9ICwKLSAgICAgICAgeyAiTXVsdGktNCBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVA0QX0gLAotICAgICAgICB7ICJNdWx0aS02IFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDZ9ICwKLSAgICAgICAgeyAiTXVsdGktNiBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVA2QX0gLAotICAgICAgICB7ICJNdWx0aS04IFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDh9ICwKLSAgICAgICAgeyAiTXVsdGktMzIgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX01QMzJ9ICwKLQotICAgICAgICB7ICJNdWx0aS0xUCBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVAxUH0gLAotICAgICAgICB7ICJNdWx0aS0yUzFQIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9NUDJTMVB9ICwKLQotICAgICAgICB7ICJNdWx0aS00KEdUKSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfR1RfTVA0fSAsCi0gICAgICAgIHsgIk11bHRpLTQoR1QpIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9HVF9NUDRBfSAsCi0gICAgICAgIHsgIk11bHRpLTYoR1QpIFBDSSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJX0RFVklDRV9JRF9HVF9NUDZ9ICwKLSAgICAgICAgeyAiTXVsdGktNihHVCkgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX0dUX01QNkF9ICwKLSAgICAgICAgeyAiTXVsdGktOChHVCkgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX0dUX01QOH0gLAotICAgICAgICB7ICJNdWx0aS0zMihHVCkgUENJIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lfREVWSUNFX0lEX0dUX01QMzJ9ICwKLQotICAgICAgICB7ICJNdWx0aS0xIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QMX0gLAotICAgICAgICB7ICJNdWx0aS0yIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QMn0gLAotICAgICAgICB7ICJNdWx0aS00IFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QNH0gLAotICAgICAgICB7ICJNdWx0aS04IFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QOH0gLAotICAgICAgICB7ICJNdWx0aS0zMiBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9NUDMyfSAsCi0KLSAgICAgICAgeyAiTXVsdGktMSBQQ0llIEUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QMUV9ICwKLSAgICAgICAgeyAiTXVsdGktMiBQQ0llIEUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QMkV9ICwKLSAgICAgICAgeyAiTXVsdGktMiBQQ0llIEIiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QMkJ9ICwKLSAgICAgICAgeyAiTXVsdGktNCBQQ0llIEIiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QNEJ9ICwKLSAgICAgICAgeyAiTXVsdGktOCBQQ0llIEIiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX01QOEJ9ICwKLQotICAgICAgICB7ICJNdWx0aS0xKEdUKSBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9HVF9NUDF9ICwKLSAgICAgICAgeyAiTXVsdGktMihHVCkgUENJZSIsIFBDSV9WRU5ET1JfSURfTVVMVElQT1JUICwgUENJRV9ERVZJQ0VfSURfR1RfTVAyfSAsCi0gICAgICAgIHsgIk11bHRpLTQoR1QpIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX0dUX01QNH0gLAotICAgICAgICB7ICJNdWx0aS04KEdUKSBQQ0llIiwgUENJX1ZFTkRPUl9JRF9NVUxUSVBPUlQgLCBQQ0lFX0RFVklDRV9JRF9HVF9NUDh9ICwKLSAgICAgICAgeyAiTXVsdGktMzIoR1QpIFBDSWUiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSUVfREVWSUNFX0lEX0dUX01QMzJ9ICwKLQotICAgICAgICB7ICJNdWx0aS00TSBQQ0kiLCBQQ0lfVkVORE9SX0lEX01VTFRJUE9SVCAsIFBDSV9ERVZJQ0VfSURfTVA0TX0gLAotfTsKLQotc3RydWN0IG1wX3BvcnQgewotICAgICAgICBzdHJ1Y3Qgc2JfdWFydF9wb3J0IHBvcnQ7Ci0KLSAgICAgICAgc3RydWN0IHRpbWVyX2xpc3QgICB0aW1lcjsgICAgICAvKiAibm8gaXJxIiB0aW1lciAqLwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgIGxpc3Q7ICAgICAgIC8qIHBvcnRzIG9uIHRoaXMgSVJRICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgY2FwYWJpbGl0aWVzOyAgIC8qIHBvcnQgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgcmV2OwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgIGFjcjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICBpZXI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbGNyOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgIG1jcjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICBtY3JfbWFzazsgICAvKiBtYXNrIG9mIHVzZXIgYml0cyAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgIG1jcl9mb3JjZTsgIC8qIG1hc2sgb2YgZm9yY2VkIGJpdHMgKi8KLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICBsc3JfYnJlYWtfZmxhZzsKLQotICAgICAgICB2b2lkICAgICAgICAgICAgKCpwbSkoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdGF0ZSwgdW5zaWduZWQgaW50IG9sZCk7Ci0gICAgICAgIHN0cnVjdCBtcF9kZXZpY2VfdCAqZGV2aWNlOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgaW50ZXJmYWNlX2NvbmZpZ19hZGRyOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgb3B0aW9uX2Jhc2VfYWRkcjsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGludGVyZmFjZTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHBvbGxfdHlwZTsKLX07Ci0KLXN0cnVjdCBpcnFfaW5mbyB7Ci0gICAgICAgIHNwaW5sb2NrX3QgICAgICBsb2NrOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICpoZWFkOwotfTsKLQotc3RydWN0IHNiMTA1eF91YXJ0X2NvbmZpZyB7Ci0JY2hhciAgICAqbmFtZTsKLQlpbnQgICAgIGRmbF94bWl0X2ZpZm9fc2l6ZTsKLQlpbnQgICAgIGZsYWdzOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzYjEwNXhfdWFydF9jb25maWcgdWFydF9jb25maWdbXSA9IHsKLSAgICAgICAgeyAidW5rbm93biIsICAgIDEsICAwIH0sCi0gICAgICAgIHsgIjE2NTUwQSIsIDE2LCBVQVJUX0NMRUFSX0ZJRk8gfCBVQVJUX1VTRV9GSUZPIH0sCi0gICAgICAgIHsgIlNCMTZDMTA1MCIsICAgIDEyOCwgICAgVUFSVF9DTEVBUl9GSUZPIHwgVUFSVF9VU0VfRklGTyB8IFVBUlRfU1RBUlRFQ0ggfSwKLSAgICAgICAgeyAiU0IxNkMxMDUwQSIsICAgIDEyOCwgICAgVUFSVF9DTEVBUl9GSUZPIHwgVUFSVF9VU0VfRklGTyB8IFVBUlRfU1RBUlRFQ0ggfSwKLX07Ci0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3Nlcl9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvc2IxMDV4L3NiX3Nlcl9jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZmI5OTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiMTA1eC9zYl9zZXJfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNkZWZpbmUgVUFSVF9DT05GSUdfVFlQRQkoMSA8PCAwKQotI2RlZmluZSBVQVJUX0NPTkZJR19JUlEJCSgxIDw8IDEpCi0jZGVmaW5lIFVQSU9fUE9SVAkJKDApCi0jZGVmaW5lIFVQSU9fSFVCNgkJKDEpCi0jZGVmaW5lIFVQSU9fTUVNCQkoMikKLSNkZWZpbmUgVVBJT19NRU0zMgkJKDMpCi0jZGVmaW5lIFVQSU9fQVUJCQkoNCkJCQkvKiBBdTF4MDAgdHlwZSBJTyAqLwotI2RlZmluZSBVUElPX1RTSQkJKDUpCQkJLyogVHNpMTA4LzEwOSB0eXBlIElPICovCi0jZGVmaW5lIFVQRl9GT1VSUE9SVAkJKDEgPDwgMSkKLSNkZWZpbmUgVVBGX1NBSwkJCSgxIDw8IDIpCi0jZGVmaW5lIFVQRl9TUERfTUFTSwkJKDB4MTAzMCkKLSNkZWZpbmUgVVBGX1NQRF9ISQkJKDB4MDAxMCkKLSNkZWZpbmUgVVBGX1NQRF9WSEkJCSgweDAwMjApCi0jZGVmaW5lIFVQRl9TUERfQ1VTVAkJKDB4MDAzMCkKLSNkZWZpbmUgVVBGX1NQRF9TSEkJCSgweDEwMDApCi0jZGVmaW5lIFVQRl9TUERfV0FSUAkJKDB4MTAxMCkKLSNkZWZpbmUgVVBGX1NLSVBfVEVTVAkJKDEgPDwgNikKLSNkZWZpbmUgVVBGX0FVVE9fSVJRCQkoMSA8PCA3KQotI2RlZmluZSBVUEZfSEFSRFBQU19DRAkJKDEgPDwgMTEpCi0jZGVmaW5lIFVQRl9MT1dfTEFURU5DWQkJKDEgPDwgMTMpCi0jZGVmaW5lIFVQRl9CVUdHWV9VQVJUCQkoMSA8PCAxNCkKLSNkZWZpbmUgVVBGX01BR0lDX01VTFRJUExJRVIJKDEgPDwgMTYpCi0jZGVmaW5lIFVQRl9DT05TX0ZMT1cJCSgxIDw8IDIzKQotI2RlZmluZSBVUEZfU0hBUkVfSVJRCQkoMSA8PCAyNCkKLSNkZWZpbmUgVVBGX0JPT1RfQVVUT0NPTkYJKDEgPDwgMjgpCi0jZGVmaW5lIFVQRl9ERUFECQkoMSA8PCAzMCkKLSNkZWZpbmUgVVBGX0lPUkVNQVAJCSgxIDw8IDMxKQotI2RlZmluZSBVUEZfQ0hBTkdFX01BU0sJCSgweDE3ZmZmKQotI2RlZmluZSBVUEZfVVNSX01BU0sJCShVUEZfU1BEX01BU0t8VVBGX0xPV19MQVRFTkNZKQotI2RlZmluZSBVU0ZfQ0xPU0lOR19XQUlUX0lORgkoMCkKLSNkZWZpbmUgVVNGX0NMT1NJTkdfV0FJVF9OT05FCSh+MFUpCi0KLSNkZWZpbmUgVUFSVF9YTUlUX1NJWkUJUEFHRV9TSVpFCi0KLSNkZWZpbmUgVUlGX0NIRUNLX0NECQkoMSA8PCAyNSkKLSNkZWZpbmUgVUlGX0NUU19GTE9XCQkoMSA8PCAyNikKLSNkZWZpbmUgVUlGX05PUk1BTF9BQ1RJVkUJKDEgPDwgMjkpCi0jZGVmaW5lIFVJRl9JTklUSUFMSVpFRAkJKDEgPDwgMzEpCi0jZGVmaW5lIFVJRl9TVVNQRU5ERUQJCSgxIDw8IDMwKQotCi0jZGVmaW5lIFdBS0VVUF9DSEFSUwkJMjU2Ci0KLSNkZWZpbmUgdWFydF9jaXJjX2VtcHR5KGNpcmMpCQkoKGNpcmMpLT5oZWFkID09IChjaXJjKS0+dGFpbCkKLSNkZWZpbmUgdWFydF9jaXJjX2NsZWFyKGNpcmMpCQkoKGNpcmMpLT5oZWFkID0gKGNpcmMpLT50YWlsID0gMCkKLQotI2RlZmluZSB1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyhjaXJjKQlcCi0JKENJUkNfQ05UKChjaXJjKS0+aGVhZCwgKGNpcmMpLT50YWlsLCBVQVJUX1hNSVRfU0laRSkpCi0KLSNkZWZpbmUgdWFydF9jaXJjX2NoYXJzX2ZyZWUoY2lyYykJXAotCShDSVJDX1NQQUNFKChjaXJjKS0+aGVhZCwgKGNpcmMpLT50YWlsLCBVQVJUX1hNSVRfU0laRSkpCi0KLSNkZWZpbmUgdWFydF90eF9zdG9wcGVkKHBvcnQpCQlcCi0JKChwb3J0KS0+aW5mby0+dHR5LT5zdG9wcGVkIHx8IChwb3J0KS0+aW5mby0+dHR5LT5od19zdG9wcGVkKQotCi0jZGVmaW5lIFVBUlRfRU5BQkxFX01TKHBvcnQsY2ZsYWcpCSgocG9ydCktPmZsYWdzICYgVVBGX0hBUkRQUFNfQ0QgfHwgXAotCQkJCQkgKGNmbGFnKSAmIENSVFNDVFMgfHwgXAotCQkJCQkgISgoY2ZsYWcpICYgQ0xPQ0FMKSkKLQotCi1zdHJ1Y3Qgc2JfdWFydF9wb3J0Owotc3RydWN0IHNiX3VhcnRfaW5mbzsKLXN0cnVjdCBzZXJpYWxfc3RydWN0Owotc3RydWN0IGRldmljZTsKLQotc3RydWN0IHNiX3VhcnRfb3BzIHsKLQl1bnNpZ25lZCBpbnQJKCp0eF9lbXB0eSkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnNldF9tY3RybCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCB1bnNpZ25lZCBpbnQgbWN0cmwpOwotCXVuc2lnbmVkIGludAkoKmdldF9tY3RybCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnN0b3BfdHgpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpzdGFydF90eCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnNlbmRfeGNoYXIpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgY2hhciBjaCk7Ci0Jdm9pZAkJKCpzdG9wX3J4KShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqZW5hYmxlX21zKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqYnJlYWtfY3RsKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIGludCBjdGwpOwotCWludAkJKCpzdGFydHVwKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICopOwotCXZvaWQJCSgqc2h1dGRvd24pKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpzZXRfdGVybWlvcykoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCBzdHJ1Y3QgTVBfVEVSTUlPUyAqbmV3LAotCQkJCSAgICAgICBzdHJ1Y3QgTVBfVEVSTUlPUyAqb2xkKTsKLQl2b2lkCQkoKnBtKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCBzdGF0ZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBvbGRzdGF0ZSk7Ci0JaW50CQkoKnNldF93YWtlKShzdHJ1Y3Qgc2JfdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCBzdGF0ZSk7Ci0KLQljb25zdCBjaGFyICooKnR5cGUpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0KLQl2b2lkCQkoKnJlbGVhc2VfcG9ydCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqKTsKLQotCWludAkJKCpyZXF1ZXN0X3BvcnQpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKik7Ci0Jdm9pZAkJKCpjb25maWdfcG9ydCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCBpbnQpOwotCWludAkJKCp2ZXJpZnlfcG9ydCkoc3RydWN0IHNiX3VhcnRfcG9ydCAqLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKTsKLQlpbnQJCSgqaW9jdGwpKHN0cnVjdCBzYl91YXJ0X3BvcnQgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLX07Ci0KLQotc3RydWN0IHNiX3VhcnRfaWNvdW50IHsKLQlfX3UzMgljdHM7Ci0JX191MzIJZHNyOwotCV9fdTMyCXJuZzsKLQlfX3UzMglkY2Q7Ci0JX191MzIJcng7Ci0JX191MzIJdHg7Ci0JX191MzIJZnJhbWU7Ci0JX191MzIJb3ZlcnJ1bjsKLQlfX3UzMglwYXJpdHk7Ci0JX191MzIJYnJrOwotCV9fdTMyCWJ1Zl9vdmVycnVuOwotfTsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICB1cGZfdDsKLQotc3RydWN0IHNiX3VhcnRfcG9ydCB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsJCQkvKiBwb3J0IGxvY2sgKi8KLQl1bnNpZ25lZCBpbnQJCWlvYmFzZTsJCQkvKiBpbi9vdXRbYndsXSAqLwotCXVuc2lnbmVkIGNoYXIgX19pb21lbQkqbWVtYmFzZTsJCS8qIHJlYWQvd3JpdGVbYndsXSAqLwotCXVuc2lnbmVkIGludAkJaXJxOwkJCS8qIGlycSBudW1iZXIgKi8KLQl1bnNpZ25lZCBpbnQJCXVhcnRjbGs7CQkvKiBiYXNlIHVhcnQgY2xvY2sgKi8KLQl1bnNpZ25lZCBpbnQJCWZpZm9zaXplOwkJLyogdHggZmlmbyBzaXplICovCi0JdW5zaWduZWQgY2hhcgkJeF9jaGFyOwkJCS8qIHhvbi94b2ZmIGNoYXIgKi8KLQl1bnNpZ25lZCBjaGFyCQlyZWdzaGlmdDsJCS8qIHJlZyBvZmZzZXQgc2hpZnQgKi8KLQl1bnNpZ25lZCBjaGFyCQlpb3R5cGU7CQkJLyogaW8gYWNjZXNzIHN0eWxlICovCi0JdW5zaWduZWQgY2hhcgkJdW51c2VkMTsKLQotCi0JdW5zaWduZWQgaW50CQlyZWFkX3N0YXR1c19tYXNrOwkvKiBkcml2ZXIgc3BlY2lmaWMgKi8KLQl1bnNpZ25lZCBpbnQJCWlnbm9yZV9zdGF0dXNfbWFzazsJLyogZHJpdmVyIHNwZWNpZmljICovCi0Jc3RydWN0IHNiX3VhcnRfaW5mbwkqaW5mbzsJCQkvKiBwb2ludGVyIHRvIHBhcmVudCBpbmZvICovCi0Jc3RydWN0IHNiX3VhcnRfaWNvdW50CWljb3VudDsJCQkvKiBzdGF0aXN0aWNzICovCi0KLQlzdHJ1Y3QgY29uc29sZQkJKmNvbnM7CQkJLyogc3RydWN0IGNvbnNvbGUsIGlmIGFueSAqLwotI2lmZGVmIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFCi0JdW5zaWduZWQgbG9uZwkJc3lzcnE7CQkJLyogc3lzcnEgdGltZW91dCAqLwotI2VuZGlmCi0KLQl1cGZfdAkJCWZsYWdzOwotCi0JdW5zaWduZWQgaW50CQltY3RybDsJCQkvKiBjdXJyZW50IG1vZGVtIGN0cmwgc2V0dGluZ3MgKi8KLQl1bnNpZ25lZCBpbnQJCXRpbWVvdXQ7CQkvKiBjaGFyYWN0ZXItYmFzZWQgdGltZW91dCAqLwotCXVuc2lnbmVkIGludAkJdHlwZTsJCQkvKiBwb3J0IHR5cGUgKi8KLQljb25zdCBzdHJ1Y3Qgc2JfdWFydF9vcHMJKm9wczsKLQl1bnNpZ25lZCBpbnQJCWN1c3RvbV9kaXZpc29yOwotCXVuc2lnbmVkIGludAkJbGluZTsJCQkvKiBwb3J0IGluZGV4ICovCi0JdW5zaWduZWQgbG9uZwkJbWFwYmFzZTsJCS8qIGZvciBpb3JlbWFwICovCi0Jc3RydWN0IGRldmljZQkJKmRldjsJCQkvKiBwYXJlbnQgZGV2aWNlICovCi0JdW5zaWduZWQgY2hhcgkJaHViNjsJCQkvKiB0aGlzIHNob3VsZCBiZSBpbiB0aGUgODI1MCBkcml2ZXIgKi8KLQl1bnNpZ25lZCBjaGFyCQl1bnVzZWRbM107Ci19OwotCi0jZGVmaW5lIG1kbW9kZQkJCXVudXNlZFsyXQotI2RlZmluZSBNRE1PREVfQUREUgkJMHgxCi0jZGVmaW5lIE1ETU9ERV9FTkFCTEUJMHgyCi0jZGVmaW5lIE1ETU9ERV9BVVRPCQkweDQKLSNkZWZpbmUgTURNT0RFX0FERFJTRU5ECTB4OAotCi1zdHJ1Y3Qgc2JfdWFydF9zdGF0ZSB7Ci0JdW5zaWduZWQgaW50CQljbG9zZV9kZWxheTsJCS8qIG1zZWMgKi8KLQl1bnNpZ25lZCBpbnQJCWNsb3Npbmdfd2FpdDsJCS8qIG1zZWMgKi8KLQotCi0JaW50CQkJY291bnQ7Ci0JaW50CQkJcG1fc3RhdGU7Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbwkqaW5mbzsKLQlzdHJ1Y3Qgc2JfdWFydF9wb3J0CSpwb3J0OwotCi0Jc3RydWN0IG11dGV4CQltdXRleDsKLX07Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50ICB1aWZfdDsKLQotc3RydWN0IHNiX3VhcnRfaW5mbyB7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKLQlzdHJ1Y3QgY2lyY19idWYJCXhtaXQ7Ci0JdWlmX3QJCQlmbGFnczsKLQotCWludAkJCWJsb2NrZWRfb3BlbjsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0bGV0OwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90CWRlbHRhX21zcl93YWl0OwotfTsKLQotCi1zdHJ1Y3QgbW9kdWxlOwotc3RydWN0IHR0eV9kcml2ZXI7Ci0KLXN0cnVjdCB1YXJ0X2RyaXZlciB7Ci0Jc3RydWN0IG1vZHVsZQkJKm93bmVyOwotCWNvbnN0IGNoYXIJCSpkcml2ZXJfbmFtZTsKLQljb25zdCBjaGFyCQkqZGV2X25hbWU7Ci0JaW50CQkJIG1ham9yOwotCWludAkJCSBtaW5vcjsKLQlpbnQJCQkgbnI7Ci0Jc3RydWN0IGNvbnNvbGUJCSpjb25zOwotCi0Jc3RydWN0IHNiX3VhcnRfc3RhdGUJKnN0YXRlOwotICAgICAgICBzdHJ1Y3QgdHR5X2RyaXZlciAgICAgICAgICAgICAgICp0dHlfZHJpdmVyOwotfTsKLQotdm9pZCBzYl91YXJ0X3dyaXRlX3dha2V1cChzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotICAgIHN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBwb3J0LT5pbmZvOwotICAgIHRhc2tsZXRfc2NoZWR1bGUoJmluZm8tPnRsZXQpOwotfQotCi12b2lkIHNiX3VhcnRfdXBkYXRlX3RpbWVvdXQoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnLAotCQkJIHVuc2lnbmVkIGludCBiYXVkKQotewotICAgIHVuc2lnbmVkIGludCBiaXRzOwotCi0gICAgc3dpdGNoIChjZmxhZyAmIENTSVpFKQotICAgIHsKLSAgICAgICAgY2FzZSBDUzU6Ci0gICAgICAgICAgICBiaXRzID0gNzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ1M2OgotICAgICAgICAgICAgYml0cyA9IDg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENTNzoKLSAgICAgICAgICAgIGJpdHMgPSA5OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJpdHMgPSAxMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChjZmxhZyAmIENTVE9QQikKLSAgICB7Ci0gICAgICAgIGJpdHMrKzsKLSAgICB9Ci0KLSAgICBpZiAoY2ZsYWcgJiBQQVJFTkIpCi0gICAgewotICAgICAgICBiaXRzKys7Ci0gICAgfQotCi0gICAgYml0cyA9IGJpdHMgKiBwb3J0LT5maWZvc2l6ZTsKLQotICAgIHBvcnQtPnRpbWVvdXQgPSAoSFogKiBiaXRzKSAvIGJhdWQgKyBIWi81MDsKLX0KLXVuc2lnbmVkIGludCBzYl91YXJ0X2dldF9iYXVkX3JhdGUoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgc3RydWN0IE1QX1RFUk1JT1MgKnRlcm1pb3MsCi0JCQkJc3RydWN0IE1QX1RFUk1JT1MgKm9sZCwgdW5zaWduZWQgaW50IG1pbiwKLQkJCQl1bnNpZ25lZCBpbnQgbWF4KQotewotICAgICAgICB1bnNpZ25lZCBpbnQgdHJ5LCBiYXVkLCBhbHRiYXVkID0gMzg0MDA7Ci0gICAgICAgIHVwZl90IGZsYWdzID0gcG9ydC0+ZmxhZ3MgJiBVUEZfU1BEX01BU0s7Ci0KLSAgICAgICAgaWYgKGZsYWdzID09IFVQRl9TUERfSEkpCi0gICAgICAgICAgICAgICAgYWx0YmF1ZCA9IDU3NjAwOwotICAgICAgICBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9WSEkpCi0gICAgICAgICAgICAgICAgYWx0YmF1ZCA9IDExNTIwMDsKLSAgICAgICAgaWYgKGZsYWdzID09IFVQRl9TUERfU0hJKQotICAgICAgICAgICAgICAgIGFsdGJhdWQgPSAyMzA0MDA7Ci0gICAgICAgIGlmIChmbGFncyA9PSBVUEZfU1BEX1dBUlApCi0gICAgICAgICAgICAgICAgYWx0YmF1ZCA9IDQ2MDgwMDsKLQotICAgICAgICBmb3IgKHRyeSA9IDA7IHRyeSA8IDI7IHRyeSsrKSB7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiAoQ0JBVUQgfCBDQkFVREVYKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjkyMTYwMCAgICA6IGJhdWQgPSA5MjE2MDA7ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEI0NjA4MDAgICAgOiBiYXVkID0gNDYwODAwOyAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMjMwNDAwICAgIDogYmF1ZCA9IDIzMDQwMDsgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjExNTIwMCAgICA6IGJhdWQgPSAxMTUyMDA7ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEI1NzYwMCAgICAgOiBiYXVkID0gNTc2MDA7ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMzg0MDAgICAgIDogYmF1ZCA9IDM4NDAwOyAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjE5MjAwICAgICA6IGJhdWQgPSAxOTIwMDsgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEI5NjAwICAgICAgOiBiYXVkID0gOTYwMDsgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCNDgwMCAgICAgIDogYmF1ZCA9IDQ4MDA7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjI0MDAgICAgICA6IGJhdWQgPSAyNDAwOyAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIxODAwICAgICAgOiBiYXVkID0gMTgwMDsgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMTIwMCAgICAgIDogYmF1ZCA9IDEyMDA7ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjYwMCAgICAgICA6IGJhdWQgPSA2MDA7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIzMDAgICAgICAgOiBiYXVkID0gMzAwOyAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQjIwMCAgICAgICA6IGJhdWQgPSAyMDA7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEIxNTAgICAgICAgOiBiYXVkID0gMTUwOyAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCMTM0ICAgICAgIDogYmF1ZCA9IDEzNDsgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQjExMCAgICAgICA6IGJhdWQgPSAxMTA7ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAljYXNlIEI3NSAgICAgICAgOiBiYXVkID0gNzU7ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAJY2FzZSBCNTAgICAgICAgIDogYmF1ZCA9IDUwOyAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCWRlZmF1bHQgICAgICAgICA6IGJhdWQgPSA5NjAwOyAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChiYXVkID09IDM4NDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYmF1ZCA9IGFsdGJhdWQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmF1ZCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYmF1ZCA9IDk2MDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmF1ZCA+PSBtaW4gJiYgYmF1ZCA8PSBtYXgpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmF1ZDsKLQotICAgICAgICAgICAgICAgIHRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVEOwotICAgICAgICAgICAgICAgIGlmIChvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pb3MtPmNfY2ZsYWcgfD0gb2xkLT5jX2NmbGFnICYgQ0JBVUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGVybWlvcy0+Y19jZmxhZyB8PSBCOTYwMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotfQotdW5zaWduZWQgaW50IHNiX3VhcnRfZ2V0X2Rpdmlzb3Ioc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGJhdWQpCi17Ci0gICAgICAgIHVuc2lnbmVkIGludCBxdW90OwotCi0gICAgICAgIGlmIChiYXVkID09IDM4NDAwICYmIChwb3J0LT5mbGFncyAmIFVQRl9TUERfTUFTSykgPT0gVVBGX1NQRF9DVVNUKQotICAgICAgICAgICAgICAgIHF1b3QgPSBwb3J0LT5jdXN0b21fZGl2aXNvcjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHF1b3QgPSAocG9ydC0+dWFydGNsayArICg4ICogYmF1ZCkpIC8gKDE2ICogYmF1ZCk7Ci0KLSAgICAgICAgcmV0dXJuIHF1b3Q7Ci19Ci0KLQotCi1zdGF0aWMgaW5saW5lIGludCBzYl91YXJ0X2hhbmRsZV9icmVhayhzdHJ1Y3Qgc2JfdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBzYl91YXJ0X2luZm8gKmluZm8gPSBwb3J0LT5pbmZvOwotCi0JaWYgKHBvcnQtPmZsYWdzICYgVVBGX1NBSykKLQkJZG9fU0FLKGluZm8tPnR0eSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYl91YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKHN0cnVjdCBzYl91YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBzdGF0dXMpCi17Ci0Jc3RydWN0IHNiX3VhcnRfaW5mbyAqaW5mbyA9IHBvcnQtPmluZm87Ci0KLQlwb3J0LT5pY291bnQuZGNkKys7Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBVSUZfQ0hFQ0tfQ0QpIHsKLQkJaWYgKHN0YXR1cykKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKLQkJZWxzZSBpZiAoaW5mby0+dHR5KQotCQkJdHR5X2hhbmd1cChpbmZvLT50dHkpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNiX3VhcnRfaGFuZGxlX2N0c19jaGFuZ2Uoc3RydWN0IHNiX3VhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlzdHJ1Y3Qgc2JfdWFydF9pbmZvICppbmZvID0gcG9ydC0+aW5mbzsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OwotCi0JcG9ydC0+aWNvdW50LmN0cysrOwotCi0JaWYgKGluZm8tPmZsYWdzICYgVUlGX0NUU19GTE9XKSB7Ci0JCWlmICh0dHktPmh3X3N0b3BwZWQpIHsKLQkJCWlmIChzdGF0dXMpIHsKLQkJCQl0dHktPmh3X3N0b3BwZWQgPSAwOwotCQkJCXBvcnQtPm9wcy0+c3RhcnRfdHgocG9ydCk7Ci0JCQkJc2JfdWFydF93cml0ZV93YWtldXAocG9ydCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIXN0YXR1cykgewotCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7Ci0JCQkJcG9ydC0+b3BzLT5zdG9wX3R4KHBvcnQpOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy8ydDNlMy5oIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy8ydDNlMy5oCmluZGV4IGNjYWQwNDkuLmU3YmY3MjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzLzJ0M2UzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy8ydDNlMy5oCkBAIC02MTMsMTIgKzYxMywxMiBAQAogICogZGVzY3JpcHRvciBsaXN0IGFuZCBkYXRhIGJ1ZmZlcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IHQzZTNfcnhfZGVzYyB7CiAJdTMyIHJkZXMwOwogCXUzMiByZGVzMTsKIAl1MzIgcmRlczI7CiAJdTMyIHJkZXMzOwotfSB0M2UzX3J4X2Rlc2NfdDsKK307CiAKICNkZWZpbmUgU0JFXzJUM0UzX1JYX0RFU0NfUklOR19TSVpFCQkJNjQKIApAQCAtNjQ4LDEyICs2NDgsMTIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IHQzZTNfdHhfZGVzYyB7CiAJdTMyIHRkZXMwOwogCXUzMiB0ZGVzMTsKIAl1MzIgdGRlczI7CiAJdTMyIHRkZXMzOwotfSB0M2UzX3R4X2Rlc2NfdDsKK307CiAKICNkZWZpbmUgU0JFXzJUM0UzX1RYX0RFU0NfUklOR19TSVpFCQkJMjU2CiAKQEAgLTcwMSw3ICs3MDEsNyBAQAogCX0gaDsKIAogCS8qIHN0YXRpc3RpY3MgKi8KLQl0M2UzX3N0YXRzX3QgczsKKwlzdHJ1Y3QgdDNlM19zdGF0cyBzOwogCiAJLyogcnVubmluZyAqLwogCXN0cnVjdCB7CkBAIC03MDksNyArNzA5LDcgQEAKIAl9IHI7CiAKIAkvKiBwYXJhbWV0ZXJzICovCi0JdDNlM19wYXJhbV90IHA7CisJc3RydWN0IHQzZTNfcGFyYW0gcDsKIAogCXUzMiBsaXVfcmVnc1tTQkVfMlQzRTNfTElVX1JFR19NQVhdOwkgICAvKiBMSVUgcmVnaXN0ZXJzICovCiAJdTMyIGZyYW1lcl9yZWdzW1NCRV8yVDNFM19GUkFNRVJfUkVHX01BWF07IC8qIEZyYW1lciByZWdpc3RlcnMgKi8KQEAgLTcyMywxMiArNzIzLDEyIEBACiAJCXUzMiBpbnRlcnJ1cHRfZW5hYmxlX21hc2s7CiAKIAkJLyogcmVjZWl2ZSBjaGFpbi9yaW5nICovCi0JCXQzZTNfcnhfZGVzY190ICpyeF9yaW5nOworCQlzdHJ1Y3QgdDNlM19yeF9kZXNjICpyeF9yaW5nOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqcnhfZGF0YVtTQkVfMlQzRTNfUlhfREVTQ19SSU5HX1NJWkVdOwogCQl1MzIgcnhfcmluZ19jdXJyZW50X3JlYWQ7CiAKIAkJLyogdHJhbnNtaXQgY2hhaW4vcmluZyAqLwotCQl0M2UzX3R4X2Rlc2NfdCAqdHhfcmluZzsKKwkJc3RydWN0IHQzZTNfdHhfZGVzYyAqdHhfcmluZzsKIAkJc3RydWN0IHNrX2J1ZmYgKnR4X2RhdGFbU0JFXzJUM0UzX1RYX0RFU0NfUklOR19TSVpFXTsKIAkJdTMyIHR4X3JpbmdfY3VycmVudF9yZWFkOwogCQl1MzIgdHhfcmluZ19jdXJyZW50X3dyaXRlOwpAQCAtNzYwLDggKzc2MCw3IEBACiB2b2lkIHQzZTNfaWZfdXAoc3RydWN0IGNoYW5uZWwgKik7CiB2b2lkIHQzZTNfaWZfZG93bihzdHJ1Y3QgY2hhbm5lbCAqKTsKIGludCB0M2UzX2lmX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIHQzZTNfaWZfY29uZmlnKHN0cnVjdCBjaGFubmVsICosIHUzMiwgY2hhciAqLAotCQkgICAgdDNlM19yZXNwX3QgKiwgaW50ICopOwordm9pZCB0M2UzX2lmX2NvbmZpZyhzdHJ1Y3QgY2hhbm5lbCAqLCB1MzIsIGNoYXIgKiwgc3RydWN0IHQzZTNfcmVzcCAqLCBpbnQgKik7CiB2b2lkIHQzZTNfc2V0X2ZyYW1lX3R5cGUoc3RydWN0IGNoYW5uZWwgKiwgdTMyKTsKIHUzMiB0M2UzX2VlcHJvbV9yZWFkX3dvcmQoc3RydWN0IGNoYW5uZWwgKiwgdTMyKTsKIHZvaWQgdDNlM19yZWFkX2NhcmRfc2VyaWFsX251bWJlcihzdHJ1Y3QgY2hhbm5lbCAqKTsKQEAgLTgzOCw3ICs4MzcsNyBAQAogCXJldHVybiBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9TVUJERVZJQ0VfSURfU0JFXzJUM0UzX1AwOwogfQogCi0jZGVmaW5lIGRldl90b19wcml2KGRldikgKCooc3RydWN0IGNoYW5uZWwgKiopICgoaGRsY19kZXZpY2UqKShkZXYpICsgMSkpCisjZGVmaW5lIGRldl90b19wcml2KGRldikgKCooc3RydWN0IGNoYW5uZWwgKiopICgoaGRsY19kZXZpY2UgKikoZGV2KSArIDEpKQogCiBzdGF0aWMgaW5saW5lIHUzMiBkY19yZWFkKHVuc2lnbmVkIGxvbmcgYWRkciwgdTMyIHJlZykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5jIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmMKaW5kZXggZDI4MGJjZi4uZTA5NjRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmMKQEAgLTE2NCwxMiArMTY0LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0M2UzX3BvcnRfZ2V0KHN0cnVjdCBjaGFubmVsICpzYywgdDNlM19wYXJhbV90ICpwYXJhbSkKK3N0YXRpYyB2b2lkIHQzZTNfcG9ydF9nZXQoc3RydWN0IGNoYW5uZWwgKnNjLCBzdHJ1Y3QgdDNlM19wYXJhbSAqcGFyYW0pCiB7Ci0JbWVtY3B5KHBhcmFtLCAmKHNjLT5wKSwgc2l6ZW9mKHQzZTNfcGFyYW1fdCkpOworCW1lbWNweShwYXJhbSwgJihzYy0+cCksIHNpemVvZihzdHJ1Y3QgdDNlM19wYXJhbSkpOwogfQogCi1zdGF0aWMgdm9pZCB0M2UzX3BvcnRfc2V0KHN0cnVjdCBjaGFubmVsICpzYywgdDNlM19wYXJhbV90ICpwYXJhbSkKK3N0YXRpYyB2b2lkIHQzZTNfcG9ydF9zZXQoc3RydWN0IGNoYW5uZWwgKnNjLCBzdHJ1Y3QgdDNlM19wYXJhbSAqcGFyYW0pCiB7CiAJaWYgKHBhcmFtLT5mcmFtZV9tb2RlICE9IDB4ZmYpCiAJCWNwbGRfc2V0X2ZyYW1lX21vZGUoc2MsIHBhcmFtLT5mcmFtZV9tb2RlKTsKQEAgLTIxNiw4ICsyMTYsNyBAQAogCQljcGxkX3NldF9zY3JhbWJsZXIoc2MsIHBhcmFtLT5zY3JhbWJsZXIpOwogfQogCi1zdGF0aWMgdm9pZCB0M2UzX3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBjaGFubmVsICpzYywKLQkJCSB0M2UzX3N0YXRzX3QgKnN0YXRzKQorc3RhdGljIHZvaWQgdDNlM19wb3J0X2dldF9zdGF0cyhzdHJ1Y3QgY2hhbm5lbCAqc2MsIHN0cnVjdCB0M2UzX3N0YXRzICpzdGF0cykKIHsKIAl1MzIgcmVzdWx0OwogCkBAIC0yNzksMTggKzI3OCwxOCBAQAogCXJlc3VsdCArPSBleGFyNzI1MF9yZWFkKHNjLCBTQkVfMlQzRTNfRlJBTUVSX1JFR19QTU9OX0hPTERJTkdfUkVHSVNURVIpOwogCXNjLT5zLkNQX0JJVCArPSByZXN1bHQ7CiAKLQltZW1jcHkoc3RhdHMsICYoc2MtPnMpLCBzaXplb2YodDNlM19zdGF0c190KSk7CisJbWVtY3B5KHN0YXRzLCAmKHNjLT5zKSwgc2l6ZW9mKHN0cnVjdCB0M2UzX3N0YXRzKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHQzZTNfcG9ydF9kZWxfc3RhdHMoc3RydWN0IGNoYW5uZWwgKnNjKQogewotCW1lbXNldCgmKHNjLT5zKSwgMCwgc2l6ZW9mKHQzZTNfc3RhdHNfdCkpOworCW1lbXNldCgmKHNjLT5zKSwgMCwgc2l6ZW9mKHN0cnVjdCB0M2UzX3N0YXRzKSk7CiB9CiAKIHZvaWQgdDNlM19pZl9jb25maWcoc3RydWN0IGNoYW5uZWwgKnNjLCB1MzIgY21kLCBjaGFyICpzZXQsCi0JCSAgICB0M2UzX3Jlc3BfdCAqcmV0LCBpbnQgKnJsZW4pCisJCSAgICBzdHJ1Y3QgdDNlM19yZXNwICpyZXQsIGludCAqcmxlbikKIHsKLQl0M2UzX3BhcmFtX3QgKnBhcmFtID0gKHQzZTNfcGFyYW1fdCAqKXNldDsKKwlzdHJ1Y3QgdDNlM19wYXJhbSAqcGFyYW0gPSAoc3RydWN0IHQzZTNfcGFyYW0gKilzZXQ7CiAJdTMyICpkYXRhID0gKHUzMiAqKXNldDsKIAogCS8qIHR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmgKaW5kZXggYzExYTU4OC4uNDFmMTQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9jdHJsLmgKQEAgLTg0LDcgKzg0LDcgQEAKICNkZWZpbmUgTkdfU0JFXzJUM0UzX05PREVfVFlQRSAgInNiZTJUM0UzIgogI2RlZmluZSBOR19TQkVfMlQzRTNfQ09PS0lFICAgICAweDAzODAwODkxCiAKLXR5cGVkZWYgc3RydWN0IHQzZTNfcGFyYW0geworc3RydWN0IHQzZTNfcGFyYW0gewogCXVfaW50OF90IGZyYW1lX21vZGU7CQkvKiBGUkFNRV9NT0RFXyogKi8KIAl1X2ludDhfdCBjcmM7CQkJLyogQ1JDXyogKi8KIAl1X2ludDhfdCByZWNlaXZlcl9vbjsJCS8qIE9OL09GRiAqLwpAQCAtMTAyLDkgKzEwMiw5IEBACiAJdV9pbnQ4X3QgZnJhY3Rpb25hbF9tb2RlOwkvKiBGUkFDVElPTkFMX01PREVfKiAqLwogCXVfaW50OF90IGJhbmR3aWR0aF9zdGFydDsJLyogMC0yNTUgKi8KIAl1X2ludDhfdCBiYW5kd2lkdGhfc3RvcDsJLyogMC0yNTUgKi8KLX0gdDNlM19wYXJhbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgdDNlM19zdGF0cyB7CitzdHJ1Y3QgdDNlM19zdGF0cyB7CiAJdV9pbnQ2NF90IGluX2J5dGVzOwogCXUzMiBpbl9wYWNrZXRzLCBpbl9kcm9wcGVkOwogCXUzMiBpbl9lcnJvcnMsIGluX2Vycm9yX2Rlc2MsIGluX2Vycm9yX2NvbGwsIGluX2Vycm9yX2RyaWIsCkBAIC0xMTcsMTUgKzExNywxNSBAQAogCXVfaW50OF90IExPQywgTE9GLCBPT0YsIExPUywgQUlTLCBGRVJGLCBJRExFLCBBSUMsIEZFQUM7CiAJdV9pbnQxNl90IEZFQkVfY29kZTsKIAl1MzIgTENWLCBGUkFNSU5HX0JJVCwgUEFSSVRZX0VSUk9SLCBGRUJFX2NvdW50LCBDUF9CSVQ7Ci19IHQzZTNfc3RhdHNfdDsKK307CiAKIAotdHlwZWRlZiBzdHJ1Y3QgdDNlM19yZXNwIHsKK3N0cnVjdCB0M2UzX3Jlc3AgewogCXVuaW9uIHsKLQkJdDNlM19wYXJhbV90IHBhcmFtOwotCQl0M2UzX3N0YXRzX3Qgc3RhdHM7CisJCXN0cnVjdCB0M2UzX3BhcmFtIHBhcmFtOworCQlzdHJ1Y3QgdDNlM19zdGF0cyBzdGF0czsKIAkJdTMyIGRhdGE7CiAJfSB1OwotfSB0M2UzX3Jlc3BfdDsKK307CiAKICNlbmRpZiAvKiBDVFJMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvZGMuYwppbmRleCBmMjA3YjllLi4wMjUxMGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2RjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9kYy5jCkBAIC0zMTYsMTMgKzMxNiwxMyBAQAogCiAJaWYgKHNjLT5ldGhlci5yeF9yaW5nID09IE5VTEwpCiAJCXNjLT5ldGhlci5yeF9yaW5nID0ga2NhbGxvYyhTQkVfMlQzRTNfUlhfREVTQ19SSU5HX1NJWkUsCi0JCQkJCSAgICBzaXplb2YodDNlM19yeF9kZXNjX3QpLCBHRlBfS0VSTkVMKTsKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgdDNlM19yeF9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNjLT5ldGhlci5yeF9yaW5nID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKHNjLT5ldGhlci50eF9yaW5nID09IE5VTEwpCiAJCXNjLT5ldGhlci50eF9yaW5nID0ga2NhbGxvYyhTQkVfMlQzRTNfVFhfREVTQ19SSU5HX1NJWkUsCi0JCQkJCSAgICBzaXplb2YodDNlM190eF9kZXNjX3QpLCBHRlBfS0VSTkVMKTsKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgdDNlM190eF9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNjLT5ldGhlci50eF9yaW5nID09IE5VTEwpIHsKIAkJa2ZyZWUoc2MtPmV0aGVyLnJ4X3JpbmcpOwogCQlzYy0+ZXRoZXIucnhfcmluZyA9IE5VTEw7CkBAIC0zMzksNyArMzM5LDggQEAKIAkJCVNCRV8yVDNFM19SWF9ERVNDX1NFQ09ORF9BRERSRVNTX0NIQUlORUQgfCBTQkVfMlQzRTNfTVRVOwogCiAJCWlmIChzYy0+ZXRoZXIucnhfZGF0YVtpXSA9PSBOVUxMKSB7Ci0JCQlpZiAoIShtID0gZGV2X2FsbG9jX3NrYihNQ0xCWVRFUykpKSB7CisJCQltID0gZGV2X2FsbG9jX3NrYihNQ0xCWVRFUyk7CisJCQlpZiAoIW0pIHsKIAkJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CiAJCQkJCWRldl9rZnJlZV9za2JfYW55KHNjLT5ldGhlci5yeF9kYXRhW2pdKTsKIAkJCQkJc2MtPmV0aGVyLnJ4X2RhdGFbal0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9pbnRyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2ludHIuYwppbmRleCBlZmRlYjc1Li4xYmY3NGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2ludHIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL2ludHIuYwpAQCAtMTE4LDcgKzExOCw3IEBACiB7CiAJdTMyIGN1cnJlbnRfcmVhZDsKIAl1MzIgZXJyb3JfbWFzaywgZXJyb3I7Ci0JdDNlM19yeF9kZXNjX3QgKmN1cnJlbnRfZGVzYzsKKwlzdHJ1Y3QgdDNlM19yeF9kZXNjICpjdXJyZW50X2Rlc2M7CiAJc3RydWN0IHNrX2J1ZmYgKm0sICptMjsKIAl1bnNpZ25lZCByY3ZfbGVuOwogCkBAIC0yOTIsNyArMjkyLDcgQEAKIHsKIAl1MzIgY3VycmVudF9yZWFkLCBjdXJyZW50X3dyaXRlOwogCXUzMiBsYXN0X3NlZ21lbnQsIGVycm9yOwotCXQzZTNfdHhfZGVzY190ICpjdXJyZW50X2Rlc2M7CisJc3RydWN0IHQzZTNfdHhfZGVzYyAqY3VycmVudF9kZXNjOwogCiAJc3Bpbl9sb2NrKCZzYy0+ZXRoZXIudHhfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbWFwcy5jIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9tYXBzLmMKaW5kZXggNzA4NGZiZS4uZTU0OTQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9tYXBzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9tYXBzLmMKQEAgLTEzLDggKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlICIydDNlMy5oIgogCi1jb25zdCB1MzIgY3BsZF9yZWdfbWFwW11bMl0gPQoteworY29uc3QgdTMyIGNwbGRfcmVnX21hcFtdWzJdID0gewogCXsgMHgwMDAwLCAweDAwODAgfSwgLyogMCAtIFBvcnQgQ29udHJvbCBSZWdpc3RlciBBIChQQ1JBKSAqLwogCXsgMHgwMDA0LCAweDAwODQgfSwgLyogMSAtIFBvcnQgQ29udHJvbCBSZWdpc3RlciBCIChQQ1JCKSAqLwogCXsgMHgwMDA4LCAweDAwODggfSwgLyogMiAtIExDViBDb3VudCBSZWdpc3RlciAoUExDUikgKi8KQEAgLTM1LDggKzM0LDcgQEAKIAl7IDB4MDA3MCwgMHgwMGYwIH0sIC8qIDE3IC0gUG9ydCBCYW5kd2lkdGggU3RvcCAoUEJXTCkgKi8KIH07CiAKLWNvbnN0IHUzMiBjcGxkX3ZhbF9tYXBbXVsyXSA9Ci17Citjb25zdCB1MzIgY3BsZF92YWxfbWFwW11bMl0gPSB7CiAJeyAweDAxLCAweDAyIH0sIC8qIExJVTEgLyBMSVUyIHNlbGVjdCBmb3IgU2VyaWFsIENoaXAgU2VsZWN0ICovCiAJeyAweDA0LCAweDA4IH0sIC8qIERBQzEgLyBEQUMyIHNlbGVjdCBmb3IgU2VyaWFsIENoaXAgU2VsZWN0ICovCiAJeyAweDAwLCAweDA0IH0sIC8qIExPT1AxIC8gTE9PUDIgLSBzZWxlY3Qgb2YgbG9vcCB0aW1pbmcgc291cmNlICovCkBAIC05NCw4ICs5Miw3IEBACiAJMHg4MSAgLyogNDcgLSBMSU5FX0lOVEVSRkFDRV9TQ0FOICovCiB9OwogCi1jb25zdCB1MzIgdDNlM19saXVfcmVnX21hcFtdID0KLXsKK2NvbnN0IHUzMiB0M2UzX2xpdV9yZWdfbWFwW10gPSB7CiAJMHgwMCwgLyogUkVHMCAqLwogCTB4MDEsIC8qIFJFRzEgKi8KIAkweDAyLCAvKiBSRUcyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9tb2R1bGUuYwppbmRleCAwZTMyYmU1Li5hNmY5M2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbW9kdWxlLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXN0cnVjdCBjaGFubmVsICpjaGFubmVsMCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgY2FyZCAqY2FyZCA9IGNoYW5uZWwwLT5jYXJkOwogCi0JZGVsX3RpbWVyKCZjYXJkLT50aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPnRpbWVyKTsKIAlpZiAoaGFzX3R3b19wb3J0cyhjaGFubmVsMC0+cGRldikpIHsKIAkJdDNlM19yZW1vdmVfY2hhbm5lbCgmY2FyZC0+Y2hhbm5lbHNbMV0pOwogCQlwY2lfZGV2X3B1dChjYXJkLT5jaGFubmVsc1sxXS5wZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvc2JlLTJ0M2UzL25ldGRldi5jCmluZGV4IDFmNTA4OGIuLmZlNmM5NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYmUtMnQzZTMvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NiZS0ydDNlMy9uZXRkZXYuYwpAQCAtMjUsOCArMjUsOCBAQAogewogCXN0cnVjdCBjaGFubmVsICpzYyA9IGRldl90b19wcml2KGRldik7CiAJaW50IGNtZF8ydDNlMywgbGVuLCBybGVuOwotCXQzZTNfcGFyYW1fdCBwYXJhbTsKLQl0M2UzX3Jlc3BfdCAgcmVzcDsKKwlzdHJ1Y3QgdDNlM19wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgdDNlM19yZXNwIHJlc3A7CiAJdm9pZCBfX3VzZXIgKmRhdGEgPSBpZnItPmlmcl9kYXRhICsgc2l6ZW9mKGNtZF8ydDNlMykgKyBzaXplb2YobGVuKTsKIAogCWlmIChjbWQgPT0gU0lPQ1dBTkRFVikKQEAgLTYxLDcgKzYxLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXRzID0gJmRldi0+c3RhdHM7CiAJc3RydWN0IGNoYW5uZWwgKnNjID0gZGV2X3RvX3ByaXYoZGV2KTsKLQl0M2UzX3N0YXRzX3QgKnN0YXRzID0gJnNjLT5zOworCXN0cnVjdCB0M2UzX3N0YXRzICpzdGF0cyA9ICZzYy0+czsKIAogCW1lbXNldChuc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOwogCW5zdGF0cy0+cnhfcGFja2V0cyA9IHN0YXRzLT5pbl9wYWNrZXRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfY3J5cHRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9jcnlwdG8uYwppbmRleCA3ZmMyNjc1Li45NjU0ODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9jcnlwdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9jcnlwdG8uYwpAQCAtMTEyLDcgKzExMiw3IEBACiAgKglvbiB3aGF0IG9wZXJhdGlvbiBpcyB0byBiZSBkb25lCiAgKi8KIHN0YXRpYyBpbnQgc2VwX3N1Ym1pdF93b3JrKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrX3F1ZXVlLAotCXZvaWQoKmZ1bmN0KSh2b2lkICopLAorCXZvaWQgKCpmdW5jdCkodm9pZCAqKSwKIAl2b2lkICpkYXRhKQogewogCXN0cnVjdCBzZXBfd29ya19zdHJ1Y3QgKnNlcF93b3JrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfbWFpbi5jCmluZGV4IDEyMjYxNGMuLmUzMDEyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9tYWluLmMKQEAgLTEyNjYsOSArMTI2Niw4IEBACiAJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBwYWdlcyBsb2NrZWQgLSBpZiBub3QgYWxsIHRoZW4gZXhpdCB3aXRoIGVycm9yICovCiAJaWYgKHJlc3VsdCAhPSBudW1fcGFnZXMpIHsKIAkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbm90IGFsbCBwYWdlcyBsb2NrZWQgYnkgZ2V0X3VzZXJfcGFnZXMsICIKLQkJCSJyZXN1bHQgMHglWCwgbnVtX3BhZ2VzIDB4JVhcbiIsCi0JCQkJY3VycmVudC0+cGlkLCByZXN1bHQsIG51bV9wYWdlcyk7CisJCQkiW1BJRCVkXSBub3QgYWxsIHBhZ2VzIGxvY2tlZCBieSBnZXRfdXNlcl9wYWdlcywgcmVzdWx0IDB4JVgsIG51bV9wYWdlcyAweCVYXG4iLAorCQkJY3VycmVudC0+cGlkLCByZXN1bHQsIG51bV9wYWdlcyk7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjM7CiAJfQpAQCAtMTI5Myw5ICsxMjkyLDkgQEAKIAkJbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplID0gUEFHRV9TSVpFOwogCiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAlMDhseCwgIgotCQkJImxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwgY3VycmVudC0+cGlkLAotCQkJY291bnQsICh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtjb3VudF0uYnVzX2FkZHJlc3MsCisJCQkiW1BJRCVkXSBsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzICUwOGx4LCBsbGlfYXJyYXlbJXhdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCQljdXJyZW50LT5waWQsIGNvdW50LAorCQkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5W2NvdW50XS5idXNfYWRkcmVzcywKIAkJCWNvdW50LCBsbGlfYXJyYXlbY291bnRdLmJsb2NrX3NpemUpOwogCX0KIApAQCAtMTMxNCw4ICsxMzEzLDcgQEAKIAkJCSJbUElEJWRdIEFmdGVyIGNoZWNrIGlmIHBhZ2UgMCBoYXMgYWxsIGRhdGFcbiIsCiAJCQljdXJyZW50LT5waWQpOwogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIGxsaV9hcnJheVswXS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgIgotCQkJImxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAorCQkJIltQSUQlZF0gbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCBsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKIAkJCWN1cnJlbnQtPnBpZCwKIAkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVswXS5idXNfYWRkcmVzcywKIAkJCWxsaV9hcnJheVswXS5ibG9ja19zaXplKTsKQEAgLTEzMzIsOCArMTMzMCw3IEBACiAJCQkiW1BJRCVkXSBBZnRlciBsYXN0IHBhZ2Ugc2l6ZSBhZGp1c3RtZW50XG4iLAogCQkJY3VycmVudC0+cGlkKTsKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCAiCi0JCQkibGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAorCQkJIltQSUQlZF0gbGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgbGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJbnVtX3BhZ2VzIC0gMSwKIAkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtudW1fcGFnZXMgLSAxXS5idXNfYWRkcmVzcywKQEAgLTE0NDksOCArMTQ0Niw3IEBACiAJCXN0YXJ0X3BhZ2UgKz0gUEFHRV9TSVpFOwogCiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAlMDhseCwgIgotCQkJImxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKKwkJCSJbUElEJWRdIGxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKIAkJCWN1cnJlbnQtPnBpZCwKIAkJCWNvdW50LCAodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAogCQkJY291bnQsIGxsaV9hcnJheVtjb3VudF0uYmxvY2tfc2l6ZSk7CkBAIC0xNDY5LDggKzE0NjUsNyBAQAogCiAJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCiAJCSJbUElEJWRdIEFmdGVyIGNoZWNrIGlmIHBhZ2UgMCBoYXMgYWxsIGRhdGFcbiIKLQkJImxsaV9hcnJheVswXS5idXNfYWRkcmVzcyBpcyAoaGV4KSAlMDhseCwgIgotCQkibGxpX2FycmF5WzBdLmJsb2NrX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCSJsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgaXMgKGhleCkgJTA4bHgsIGxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQljdXJyZW50LT5waWQsCiAJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVswXS5idXNfYWRkcmVzcywKIAkJbGxpX2FycmF5WzBdLmJsb2NrX3NpemUpOwpAQCAtMTQ4NCw4ICsxNDc5LDcgQEAKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKIAkJCSJbUElEJWRdIEFmdGVyIGxhc3QgcGFnZSBzaXplIGFkanVzdG1lbnRcbiIKLQkJCSJsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzIChoZXgpICUwOGx4LCAiCi0JCQkibGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAorCQkJImxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgKGhleCkgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAoaGV4KSAleFxuIiwKIAkJCWN1cnJlbnQtPnBpZCwgbnVtX3BhZ2VzIC0gMSwKIAkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtudW1fcGFnZXMgLSAxXS5idXNfYWRkcmVzcywKIAkJCW51bV9wYWdlcyAtIDEsCkBAIC0xNzQ1LDkgKzE3MzksOCBAQAogCiAJd2hpbGUgKCh1bnNpZ25lZCBsb25nKSBsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyAhPSAweGZmZmZmZmZmKSB7CiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAotCQkJIltQSUQlZF0gbGxpIHRhYmxlICUwOGx4LCAiCi0JCQkidGFibGVfZGF0YV9zaXplIGlzIChoZXgpICVseFxuIiwKLQkJCQljdXJyZW50LT5waWQsIHRhYmxlX2NvdW50LCB0YWJsZV9kYXRhX3NpemUpOworCQkJIltQSUQlZF0gbGxpIHRhYmxlICUwOGx4LCB0YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJWx4XG4iLAorCQkJY3VycmVudC0+cGlkLCB0YWJsZV9jb3VudCwgdGFibGVfZGF0YV9zaXplKTsKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCiAJCQkiW1BJRCVkXSBudW1fdGFibGVfZW50cmllcyBpcyAoaGV4KSAlbHhcbiIsCiAJCQkJY3VycmVudC0+cGlkLCBudW1fdGFibGVfZW50cmllcyk7CkBAIC0xNzYyLDggKzE3NTUsOCBAQAogCQkJCSh1bnNpZ25lZCBsb25nKSBsbGlfdGFibGVfcHRyKTsKIAogCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkJIltQSUQlZF0gcGh5cyBhZGRyZXNzIGlzICUwOGx4ICIKLQkJCQkiYmxvY2sgc2l6ZSBpcyAoaGV4KSAleFxuIiwgY3VycmVudC0+cGlkLAorCQkJCSJbUElEJWRdIHBoeXMgYWRkcmVzcyBpcyAlMDhseCBibG9jayBzaXplIGlzIChoZXgpICV4XG4iLAorCQkJCWN1cnJlbnQtPnBpZCwKIAkJCQkodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcywKIAkJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKIAkJfQpAQCAtMTc3MiwxNCArMTc2NSwxMiBAQAogCQlsbGlfdGFibGVfcHRyLS07CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBwaHlzIGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgIgotCQkJImlzIChoZXgpICV4XG4iLAorCQkJIltQSUQlZF0gcGh5cyBsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIGlzIChoZXgpICV4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSk7CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBwaHlzIGxsaV90YWJsZV9wdHItPnBoeXNpY2FsX2FkZHJlc3MgIgotCQkJImlzICUwOGx4XG4iLAorCQkJIltQSUQlZF0gcGh5cyBsbGlfdGFibGVfcHRyLT5waHlzaWNhbF9hZGRyZXNzIGlzICUwOGx4XG4iLAogCQkJY3VycmVudC0+cGlkLAogCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOwogCkBAIC0xNzg4LDEzICsxNzc5LDExIEBACiAJCW51bV90YWJsZV9lbnRyaWVzID0gKGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgPj4gMjQpICYgMHhmZjsKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIHBoeXMgdGFibGVfZGF0YV9zaXplIGlzICIKLQkJCSIoaGV4KSAlbHggbnVtX3RhYmxlX2VudHJpZXMgaXMiCi0JCQkiICVseCBidXNfYWRkcmVzcyBpcyVseFxuIiwKLQkJCQljdXJyZW50LT5waWQsCi0JCQkJdGFibGVfZGF0YV9zaXplLAotCQkJCW51bV90YWJsZV9lbnRyaWVzLAotCQkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKKwkJCSJbUElEJWRdIHBoeXMgdGFibGVfZGF0YV9zaXplIGlzIChoZXgpICVseCBudW1fdGFibGVfZW50cmllcyBpcyAlbHggYnVzX2FkZHJlc3MgaXMlbHhcbiIsCisJCQljdXJyZW50LT5waWQsCisJCQl0YWJsZV9kYXRhX3NpemUsCisJCQludW1fdGFibGVfZW50cmllcywKKwkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKIAogCQlpZiAoKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgIT0gMHhmZmZmZmZmZikKIAkJCWxsaV90YWJsZV9wdHIgPSAoc3RydWN0IHNlcF9sbGlfZW50cnkgKikKQEAgLTIyNDQsMTQgKzIyMzMsMTIgQEAKIAkJCXRhYmxlX2RhdGFfc2l6ZSA9IG91dF90YWJsZV9kYXRhX3NpemU7CiAKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkiW1BJRCVkXSBjb25zdHJ1Y3QgdGFibGVzIGZyb20gbGxpIgotCQkJIiBpbl90YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJXhcbiIsIGN1cnJlbnQtPnBpZCwKLQkJCWluX3RhYmxlX2RhdGFfc2l6ZSk7CisJCQkiW1BJRCVkXSBjb25zdHJ1Y3QgdGFibGVzIGZyb20gbGxpIGluX3RhYmxlX2RhdGFfc2l6ZSBpcyAoaGV4KSAleFxuIiwKKwkJCWN1cnJlbnQtPnBpZCwgaW5fdGFibGVfZGF0YV9zaXplKTsKIAogCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKLQkJCSJbUElEJWRdIGNvbnN0cnVjdCB0YWJsZXMgZnJvbSBsbGkiCi0JCQkib3V0X3RhYmxlX2RhdGFfc2l6ZSBpcyAoaGV4KSAleFxuIiwgY3VycmVudC0+cGlkLAotCQkJb3V0X3RhYmxlX2RhdGFfc2l6ZSk7CisJCQkiW1BJRCVkXSBjb25zdHJ1Y3QgdGFibGVzIGZyb20gbGxpIG91dF90YWJsZV9kYXRhX3NpemUgaXMgKGhleCkgJXhcbiIsCisJCQljdXJyZW50LT5waWQsIG91dF90YWJsZV9kYXRhX3NpemUpOwogCiAJCS8qIENvbnN0cnVjdCBpbnB1dCBsbGkgdGFibGUgKi8KIAkJc2VwX2J1aWxkX2xsaV90YWJsZShzZXAsICZsbGlfaW5fYXJyYXlbY3VycmVudF9pbl9lbnRyeV0sCkBAIC0yMzE2LDggKzIzMDMsNyBAQAogCQkJCWluZm9faW5fZW50cnlfcHRyLT5ibG9ja19zaXplKTsKIAogCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCi0JCQkJIltQSUQlZF0gb3V0cHV0IGxsaV90YWJsZV9vdXRfcHRyOiIKLQkJCQkiJTA4bHggICUwOHhcbiIsCisJCQkJIltQSUQlZF0gb3V0cHV0IGxsaV90YWJsZV9vdXRfcHRyOiAlMDhseCAgJTA4eFxuIiwKIAkJCQljdXJyZW50LT5waWQsCiAJCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19vdXRfZW50cnlfcHRyLT5idXNfYWRkcmVzcywKIAkJCQlpbmZvX291dF9lbnRyeV9wdHItPmJsb2NrX3NpemUpOwpAQCAtMjQ0Niw4ICsyNDMyLDggQEAKIAkJCQlkbWFfY3R4KTsKIAkJaWYgKGVycm9yKSB7CiAJCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCi0JCQkJIltQSUQlZF0gc2VwX2xvY2tfa2VybmVsX3BhZ2VzIGZvciBpbnB1dCAiCi0JCQkJInZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwgY3VycmVudC0+cGlkKTsKKwkJCQkiW1BJRCVkXSBzZXBfbG9ja19rZXJuZWxfcGFnZXMgZm9yIGlucHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQljdXJyZW50LT5waWQpOwogCiAJCQlnb3RvIGVuZF9mdW5jdGlvbjsKIAkJfQpAQCAtMjQ2MCw4ICsyNDQ2LDggQEAKIAogCQlpZiAoZXJyb3IpIHsKIAkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkiW1BJRCVkXSBzZXBfbG9ja19rZXJuZWxfcGFnZXMgZm9yIG91dHB1dCAiCi0JCQkJInZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwgY3VycmVudC0+cGlkKTsKKwkJCQkiW1BJRCVkXSBzZXBfbG9ja19rZXJuZWxfcGFnZXMgZm9yIG91dHB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIsCisJCQkJY3VycmVudC0+cGlkKTsKIAogCQkJZ290byBlbmRfZnVuY3Rpb25fZnJlZV9sbGlfaW47CiAJCX0KQEAgLTI0NzYsOCArMjQ2Miw4IEBACiAJCQkJZG1hX2N0eCk7CiAJCWlmIChlcnJvcikgewogCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJCSJbUElEJWRdIHNlcF9sb2NrX3VzZXJfcGFnZXMgZm9yIGlucHV0ICIKLQkJCQkidmlydHVhbCBidWZmZXIgZmFpbGVkXG4iLCBjdXJyZW50LT5waWQpOworCQkJCSJbUElEJWRdIHNlcF9sb2NrX3VzZXJfcGFnZXMgZm9yIGlucHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQljdXJyZW50LT5waWQpOwogCiAJCQlnb3RvIGVuZF9mdW5jdGlvbjsKIAkJfQpAQCAtMjQ5MSw4ICsyNDc3LDcgQEAKIAkJCQlTRVBfRFJJVkVSX09VVF9GTEFHLCBkbWFfY3R4KTsKIAkJCWlmIChlcnJvcikgewogCQkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkJIltQSUQlZF0gc2VjdXJlIGRtYSB0YWJsZSBzZXR1cCAiCi0JCQkJCSIgZm9yIG91dHB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIsCisJCQkJCSJbUElEJWRdIHNlY3VyZSBkbWEgdGFibGUgc2V0dXAgZm9yIG91dHB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIsCiAJCQkJCWN1cnJlbnQtPnBpZCk7CiAKIAkJCQlnb3RvIGVuZF9mdW5jdGlvbl9mcmVlX2xsaV9pbjsKQEAgLTI1MTIsOCArMjQ5Nyw3IEBACiAKIAkJCWlmIChlcnJvcikgewogCQkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKLQkJCQkJIltQSUQlZF0gc2VwX2xvY2tfdXNlcl9wYWdlcyIKLQkJCQkJIiBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQkJIltQSUQlZF0gc2VwX2xvY2tfdXNlcl9wYWdlcyBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIiwKIAkJCQkJY3VycmVudC0+cGlkKTsKIAogCQkJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfbGxpX2luOwpAQCAtMjgyNiw4ICsyODEwLDcgQEAKIAogCWlmIChlcnJvcikgewogCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCi0JCQkicHJlcGFyZSBETUEgdGFibGUgY2FsbCBmYWlsZWQgIgotCQkJImZyb20gcHJlcGFyZSBEQ0IgY2FsbFxuIik7CisJCQkicHJlcGFyZSBETUEgdGFibGUgY2FsbCBmYWlsZWQgZnJvbSBwcmVwYXJlIERDQiBjYWxsXG4iKTsKIAkJZ290byBlbmRfZnVuY3Rpb25fZXJyb3I7CiAJfQogCkBAIC0yODg5LDcgKzI4NzIsOCBAQAogCQkgKiBHbyBvdmVyIGVhY2ggRENCIGFuZCBzZWUgaWYKIAkJICogdGFpbCBwb2ludGVyIG11c3QgYmUgdXBkYXRlZAogCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8ICgqZG1hX2N0eCktPm5yX2RjYl9jcmVhdDsgaSsrLCBkY2JfdGFibGVfcHRyKyspIHsKKwkJZm9yIChpID0gMDsgaSA8ICgqZG1hX2N0eCktPm5yX2RjYl9jcmVhdDsKKwkJICAgICBpKyssIGRjYl90YWJsZV9wdHIrKykgewogCQkJaWYgKGRjYl90YWJsZV9wdHItPm91dF92cl90YWlsX3B0KSB7CiAJCQkJcHRfaG9sZCA9ICh1bnNpZ25lZCBsb25nKWRjYl90YWJsZV9wdHItPgogCQkJCQlvdXRfdnJfdGFpbF9wdDsKQEAgLTMwODksNiArMzA3Myw3IEBACiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAogCQkJIltQSUQlZF0gU0VQX0lPQ1BSRVBBUkVEQ0Igc3RhcnRcbiIsCiAJCQljdXJyZW50LT5waWQpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIFNFUF9JT0NQUkVQQVJFRENCX1NFQ1VSRV9ETUE6CiAJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAogCQkJIltQSUQlZF0gU0VQX0lPQ1BSRVBBUkVEQ0JfU0VDVVJFX0RNQSBzdGFydFxuIiwKQEAgLTM3NjIsOCArMzc0Nyw3IEBACiAKIAlpZiAoYWN0dWFsX2NvdW50ICE9IGNvdW50X3VzZXIpIHsKIAkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAotCQkJICJbUElEJWRdIGluY29uc2lzdGVudCBtZXNzYWdlICIKLQkJCSAic2l6ZXMgMHglMDh6WCB2cyAweCUwOHpYXG4iLAorCQkJICJbUElEJWRdIGluY29uc2lzdGVudCBtZXNzYWdlIHNpemVzIDB4JTA4elggdnMgMHglMDh6WFxuIiwKIAkJCSBjdXJyZW50LT5waWQsIGFjdHVhbF9jb3VudCwgY291bnRfdXNlcik7CiAJCWVycm9yID0gLUVNU0dTSVpFOwogCQlnb3RvIGVuZF9mdW5jdGlvbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYwppbmRleCBmMGZjYmY3Li4wMjY3ZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jCkBAIC03MjQsNyArNzI0LDcgQEAKIAkJZ290byBzdGFydHVwX2Vycm9yOwogCX0KIAotCXN3aXRjaCAoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSB7CisJc3dpdGNoIChsZTE2X3RvX2NwdShzZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKSB7CiAJY2FzZSBRVUFURUNIX0RTVTEwMDoKIAljYXNlIFFVQVRFQ0hfUVNVMTAwOgogCWNhc2UgUVVBVEVDSF9FU1UxMDBBOgpAQCAtNzYyLDcgKzc2Miw5IEBACiAKIAl9CiAKLQlzdGF0dXMgPSBib3hfc2V0X3ByZWJ1ZmZlcl9sZXZlbChzZXJpYWwpOwkvKiBzZXRzIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlzdGF0dXMgPSBib3hfc2V0X3ByZWJ1ZmZlcl9sZXZlbChzZXJpYWwpOwkvKiBzZXRzIHRvCisJCQkJCQkJICogZGVmYXVsdCB2YWx1ZQorCQkJCQkJCSAqLwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRldl9kYmcoZGV2LCAiYm94X3NldF9wcmVidWZmZXJfbGV2ZWwgZmFpbGVkXG4iKTsKIAkJZ290byBzdGFydHVwX2Vycm9yOwpAQCAtODg3LDcgKzg4OSw4IEBACiAJICAgIChTRVJJQUxfTVNSX0NUUyB8IFNFUklBTF9NU1JfRFNSIHwgU0VSSUFMX01TUl9SSSB8IFNFUklBTF9NU1JfQ0QpOwogCiAJLyogU2V0IEJhdWQgcmF0ZSB0byBkZWZhdWx0IGFuZCB0dXJuIG9mZiAoZGVmYXVsdClmbG93IGNvbnRyb2wgaGVyZSAqLwotCXJlc3VsdCA9IHF0X3NldHVhcnQoc2VyaWFsLCBwb3J0LT5wb3J0X251bWJlciwgREVGQVVMVF9ESVZJU09SLCBERUZBVUxUX0xDUik7CisJcmVzdWx0ID0gcXRfc2V0dWFydChzZXJpYWwsIHBvcnQtPnBvcnRfbnVtYmVyLCBERUZBVUxUX0RJVklTT1IsCisJCQlERUZBVUxUX0xDUik7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJZGV2X2RiZygmcG9ydC0+ZGV2LCAicXRfc2V0dWFydCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtMTAxNCwxMSArMTAxNywxMyBAQAogCS8qIENsb3NlIHVhcnQgY2hhbm5lbCAqLwogCXN0YXR1cyA9IHF0X2Nsb3NlX2NoYW5uZWwoc2VyaWFsLCBpbmRleCk7CiAJaWYgKHN0YXR1cyA8IDApCi0JCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gcXRfY2xvc2VfY2hhbm5lbCBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gcXRfY2xvc2VfY2hhbm5lbCBmYWlsZWQuXG4iLAorCQkJX19mdW5jX18pOwogCiAJcG9ydDAtPm9wZW5fcG9ydHMtLTsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgInF0X251bV9vcGVuX3BvcnRzIGluIGNsb3NlJWRcbiIsIHBvcnQwLT5vcGVuX3BvcnRzKTsKKwlkZXZfZGJnKCZwb3J0LT5kZXYsICJxdF9udW1fb3Blbl9wb3J0cyBpbiBjbG9zZSVkXG4iLAorCQlwb3J0MC0+b3Blbl9wb3J0cyk7CiAKIAlpZiAocG9ydDAtPm9wZW5fcG9ydHMgPT0gMCkgewogCQlpZiAoc2VyaWFsLT5wb3J0WzBdLT5pbnRlcnJ1cHRfaW5fdXJiKSB7CkBAIC0xMjM1LDcgKzEyNDAsOCBAQAogCiAJLyogTm93IGRldGVybWluZSBmbG93IGNvbnRyb2wgKi8KIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gRW5hYmxpbmcgSFcgZmxvdyBjb250cm9sXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gRW5hYmxpbmcgSFcgZmxvdyBjb250cm9sXG4iLAorCQkJX19mdW5jX18pOwogCiAJCS8qIEVuYWJsZSBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLwogCQlzdGF0dXMgPSBib3hfc2V0X2h3X2Zsb3dfY3RybChwb3J0LT5zZXJpYWwsIGluZGV4LCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2JwX21vZC5oIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBfbW9kLmgKaW5kZXggODE1NGE3Yi4uODJiNDk2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBfbW9kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBfbW9kLmgKQEAgLTQ5NywxMSArNDk3LDE5IEBACiAjZGVmaW5lIEJQQ1RMSV9TVEFUVVMgICAweDAwMDA4CS8qIERldmljZSBTdGF0dXMgLSBSTyAqLwogCiAvKiBIVyByZWxhdGVkICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RBVEEgMHgwMDAwMDA0MAkvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA2ICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA3X0RBVEEgMHgwMDAwMDA4MAkvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA3ICovCisjZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RBVEEgMHgwMDAwMDA0MAkvKiBWYWx1ZSBvZiBTVworCQkJCQkJCQkJCSAgICAgKiBEZWZpbmVhYmxlIFBpbiA2CisJCQkJCQkJCQkJICAgICAqLworI2RlZmluZSBCUENUTElfQ1RSTF9FWFRfU0RQN19EQVRBIDB4MDAwMDAwODAJLyogVmFsdWUgb2YgU1cKKwkJCQkJCQkJCQkgICAgICogRGVmaW5lYWJsZSBQaW4gNworCQkJCQkJCQkJCSAgICAgKi8KICNkZWZpbmUgQlBDVExJX0NUUkxfU0RQMF9EQVRBICAgICAweDAwMDQwMDAwCS8qIFNXRFBJTiAwIHZhbHVlICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RJUiAgMHgwMDAwMDQwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNiAwPWluIDE9b3V0ICovCi0jZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA3X0RJUiAgMHgwMDAwMDgwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNyAwPWluIDE9b3V0ICovCisjZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA2X0RJUiAgMHgwMDAwMDQwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNgorCQkJCQkJCQkJCSAgICogMD1pbiAxPW91dAorCQkJCQkJCQkJCSAgICovCisjZGVmaW5lIEJQQ1RMSV9DVFJMX0VYVF9TRFA3X0RJUiAgMHgwMDAwMDgwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNworCQkJCQkJCQkJCSAgICogMD1pbiAxPW91dAorCQkJCQkJCQkJCSAgICovCiAjZGVmaW5lIEJQQ1RMSV9DVFJMX1NEUDBfRElSICAgICAgMHgwMDQwMDAwMAkvKiBTRFAwIElucHV0IG9yIG91dHB1dCAqLwogI2RlZmluZSBCUENUTElfQ1RSTF9TV0RQSU4xICAgICAgIDB4MDAwODAwMDAKICNkZWZpbmUgQlBDVExJX0NUUkxfU0RQMV9ESVIgICAgICAweDAwODAwMDAwCkBAIC01NjUsNyArNTczLDkgQEAKICNkZWZpbmUgQlBDVExJX1NXRldfUEhZMF9TTSAgMHgwMgogI2RlZmluZSBCUENUTElfU1dGV19QSFkxX1NNICAweDA0CiAKLSNkZWZpbmUgQlBDVExJX1NXX0ZXX1NZTkMgIDB4MDVCNUMJLyogU29mdHdhcmUtRmlybXdhcmUgU3luY2hyb25pemF0aW9uIC0gUlcgKi8KKyNkZWZpbmUgQlBDVExJX1NXX0ZXX1NZTkMgIDB4MDVCNUMJLyogU29mdHdhcmUtRmlybXdhcmUKKwkJCQkJCQkJICAgICAqIFN5bmNocm9uaXphdGlvbiAtIFJXCisJCQkJCQkJCSAgICAgKi8KIAogI2RlZmluZSBCUENUTElfU1dTTSAgICAgIDB4MDVCNTAJLyogU1cgU2VtYXBob3JlICovCiAjZGVmaW5lIEJQQ1RMSV9GV1NNICAgICAgMHgwNUI1NAkvKiBGVyBTZW1hcGhvcmUgKi8KQEAgLTYyMyw3ICs2MzMsOCBAQAogLyojZGVmaW5lIEJQMTBHX01DTEtfREFUQV9PVVQ5ICAgICAgIEJQMTBHX0kyQ19DTEtfT1VUCiAjZGVmaW5lIEJQMTBHX01ESU9fREFUQV9PVVQ5ICAgICAgIEJQMTBHX0kyQ19EQVRBX09VVCovCiAKLQkJCQkgICAgICAgLyojZGVmaW5lIEJQMTBHX01DTEtfREFUQV9PVVQ5Ki8vKkJQMTBHX0kyQ19EQVRBX09VVCAqLworCQkJCSAgICAgICAvKiNkZWZpbmUgQlAxMEdfTUNMS19EQVRBX09VVDkqLworCQkJCQkvKkJQMTBHX0kyQ19EQVRBX09VVCAqLwogI2RlZmluZSBCUDEwR19NRElPX0RBVEFfT1VUOSAgICAgICAgICAgQlAxMEdfSTJDX0RBVEFfT1VUCS8qQlAxMEdfSTJDX0NMS19PVVQgKi8KIAogLyogVklBIEVPU0RQICEgKi8KQEAgLTY5OCw1ICs3MDksMyBAQAogCXJlYWRsKCh2b2lkICopKChhKS0+bWVtX21hcCkgKyBCUDEwR0JfIyNyZWcpKQogCiAjZW5kaWYKLQotaW50IGJwX3Byb2NfY3JlYXRlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnBjdGxfbW9kLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icGN0bF9tb2QuYwppbmRleCAyMDMyNWY1Li42YjkzNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icGN0bF9tb2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9icGN0bF9tb2QuYwpAQCAtMTE3LDEyICsxMTcsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgYnBjdGxfZGV2ICpnZXRfc3RhdHVzX3BvcnRfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7CiBzdGF0aWMgdm9pZCBpZl9zY2FuX2luaXQodm9pZCk7CiAKLWludCBieXBhc3NfcHJvY19jcmVhdGVfZGV2X3NkKHN0cnVjdCBicGN0bF9kZXYgKnBicF9kZXZpY2VfYmxvY2spOwotaW50IGJ5cGFzc19wcm9jX3JlbW92ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jayk7Ci1pbnQgYnBfcHJvY19jcmVhdGUodm9pZCk7CitzdGF0aWMgaW50IGJ5cGFzc19wcm9jX2NyZWF0ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jayk7CitzdGF0aWMgaW50IGJ5cGFzc19wcm9jX3JlbW92ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jayk7CitzdGF0aWMgaW50IGJwX3Byb2NfY3JlYXRlKHZvaWQpOwogCi1pbnQgaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpOwotaW50IGdldF9kZXZfaWR4X2JzZihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMpOworc3RhdGljIGludCBpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7CitzdGF0aWMgaW50IGdldF9kZXZfaWR4X2JzZihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMpOwogCiBzdGF0aWMgaW50IGJwX2dldF9kZXZfaWR4X2JzZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmluZGV4KQogewpAQCAtMjYyLDcgKzI2Miw3IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBicF9kZXZpY2VfZXZlbnQsCiB9OwogCi1pbnQgaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpOworc3RhdGljIGludCBpc19ieXBhc3NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldik7CiBpbnQgd2R0X3RpbWVfbGVmdChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KTsKIAogc3RhdGljIHZvaWQgd3JpdGVfcHVsc2Uoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwKQEAgLTE1MDIsNyArMTUwMiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgc2VuZF9ieXBhc3NfY2xlYXJfcHVsc2Uoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHZhbHVlKQorc3RhdGljIHZvaWQgc2VuZF9ieXBhc3NfY2xlYXJfcHVsc2Uoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewogCXVpbnQzMl90IGN0cmxfZXh0ID0gMDsKIApAQCAtMTc1Nyw3ICsxNzU4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDTU5EX09OICAweDQgKDEwMCkqLwotaW50IGNtbmRfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgY21uZF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCkBAIC0xNzc0LDcgKzE3NzUsNyBAQAogfQogCiAvKiBDTU5EX09GRiAgMHgyICgxMCkqLwotaW50IGNtbmRfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGNtbmRfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTE3OTIsNyArMTc5Myw3IEBACiB9CiAKIC8qIEJZUEFTU19PTiAoMHhhKSovCi1pbnQgYnlwYXNzX29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCkBAIC0xODEzLDcgKzE4MTQsNyBAQAogfQogCiAvKiBCWVBBU1NfT0ZGICgweDggMTExKSovCi1pbnQgYnlwYXNzX29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTE4MzYsNyArMTgzNyw3IEBACiB9CiAKIC8qIFRBUF9PRkYgKDB4OSkqLwotaW50IHRhcF9vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9DQVApCkBAIC0xODQ5LDcgKzE4NTAsNyBAQAogfQogCiAvKiBUQVBfT04gKDB4YikqLwotaW50IHRhcF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0YXBfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIAlpZiAoKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfQ0FQKQpAQCAtMTg2Miw3ICsxODYzLDcgQEAKIH0KIAogLyogRElTQ19PRkYgKDB4OSkqLwotaW50IGRpc2Nfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2Nfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19DQVApICYmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkpIHsKQEAgLTE4NzQsNyArMTg3NSw3IEBACiB9CiAKIC8qIERJU0NfT04gKDB4YikqLwotaW50IGRpc2Nfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzY19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfQ0FQKSAmJiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSAweDgpKSB7CkBAIC0xODg1LDU4ICsxODg2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBESVNDX1BPUlRfT04gKi8KLWludCBkaXNjX3BvcnRfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0RJU0EpOwotCQllbHNlCi0JCQl3cml0ZV9kYXRhKHBicGN0bF9kZXZfbSwgVFhfRElTQik7Ci0KLQkJbXNlY19kZWxheV9icChMQVRDSF9ERUxBWSk7Ci0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogRElTQ19QT1JUX09GRiAqLwotaW50IGRpc2NfcG9ydF9vZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0VOQSk7Ci0JCWVsc2UKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9FTkIpOwotCi0JCW1zZWNfZGVsYXlfYnAoTEFUQ0hfREVMQVkpOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KIC8qVFdPX1BPUlRfTElOS19IV19FTiAoMHhlKSovCi1pbnQgdHBsX2h3X29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRwbF9od19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwLCBjdHJsID0gMDsKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X2IgPSBOVUxMOwpAQCAtMTk2NCw3ICsxOTE1LDcgQEAKIH0KIAogLypUV09fUE9SVF9MSU5LX0hXX0RJUyAoMHhjKSovCi1pbnQgdHBsX2h3X29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0cGxfaHdfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDAsIGN0cmwgPSAwOwogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC0xOTkwLDcgKzE5NDEsNyBAQAogfQogCiAvKiBXRFRfT0ZGICgweDYgMTEwKSovCi1pbnQgd2R0X29mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB3ZHRfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTIwMTMsNyArMTk2NCw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CiAgICAgd2R0X3ZhbF9hcnJheVtdID0geyAxMDAwLCAxNTAwLCAyMDAwLCAzMDAwLCA0MDAwLCA4MDAwLCAxNjAwMCwgMzIwMDAsIDAgfTsKIAotaW50IHdkdF9vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgd2R0X29uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBXRF9DVExfQ0FQKSB7CkBAIC0yMDY1LDcgKzIwMTYsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi12b2lkIGJwNzVfcHV0X2h3X3NlbWFwaG9yZV9nZW5lcmljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCBicDc1X3B1dF9od19zZW1hcGhvcmVfZ2VuZXJpYyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXUzMiBzd3NtOwogCkBAIC0yMDc2LDcgKzIwMjcsNyBAQAogCUJQQ1RMX1dSSVRFX1JFRyhwYnBjdGxfZGV2LCBTV1NNLCBzd3NtKTsKIH0KIAotczMyIGJwNzVfZ2V0X2h3X3NlbWFwaG9yZV9nZW5lcmljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgczMyIGJwNzVfZ2V0X2h3X3NlbWFwaG9yZV9nZW5lcmljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdTMyIHN3c207CiAJczMyIHJldF92YWwgPSAwOwpAQCAtMjE5MCw3ICsyMTQxLDggQEAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotczMyIGJwNzVfcmVhZF9waHlfcmVnX21kaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdTMyIG9mZnNldCwgdTE2ICpkYXRhKQorc3RhdGljIHMzMiBicDc1X3JlYWRfcGh5X3JlZ19tZGljKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHUzMiBvZmZzZXQsCisJCQkJICB1MTYgKmRhdGEpCiB7CiAJdTMyIGksIG1kaWMgPSAwOwogCXMzMiByZXRfdmFsID0gMDsKQEAgLTIyMjMsNyArMjE3NSw4IEBACiAJcmV0dXJuIHJldF92YWw7CiB9CiAKLXMzMiBicDc1X3dyaXRlX3BoeV9yZWdfbWRpYyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSkKK3N0YXRpYyBzMzIgYnA3NV93cml0ZV9waHlfcmVnX21kaWMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdTMyIG9mZnNldCwKKwkJCQkgICB1MTYgZGF0YSkKIHsKIAl1MzIgaSwgbWRpYyA9IDA7CiAJczMyIHJldF92YWwgPSAwOwpAQCAtMjM1MywxMSArMjMwNiwxMCBAQAogCQlpZiAoUEVHNV9JRl9TRVJJRVMocGJwY3RsX2Rldi0+c3ViZGV2aWNlKSkgewogCQkJaWYgKHR4X3N0YXRlKSB7CiAJCQkJdWludDE2X3QgbWlpX3JlZzsKLQkJCQlpZiAoIQotCQkJCSAgICAocmV0ID0KLQkJCQkgICAgIGJwNzVfcmVhZF9waHlfcmVnKHBicGN0bF9kZXYsCi0JCQkJCQkgICAgICAgQlBDVExJX1BIWV9DT05UUk9MLAotCQkJCQkJICAgICAgICZtaWlfcmVnKSkpIHsKKwkJCQlyZXQgPSBicDc1X3JlYWRfcGh5X3JlZyhwYnBjdGxfZGV2LAorCQkJCQkgICAgICBCUENUTElfUEhZX0NPTlRST0wsCisJCQkJCSAgICAgICZtaWlfcmVnKTsKKwkJCQlpZiAoIXJldCkgewogCQkJCQlpZiAobWlpX3JlZyAmIEJQQ1RMSV9NSUlfQ1JfUE9XRVJfRE9XTikgewogCQkJCQkJcmV0ID0KIAkJCQkJCSAgICBicDc1X3dyaXRlX3BoeV9yZWcKQEAgLTIzNjksMTcgKzIzMjEsMTUgQEAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXVpbnQxNl90IG1paV9yZWc7Ci0JCQkJaWYgKCEKLQkJCQkgICAgKHJldCA9Ci0JCQkJICAgICBicDc1X3JlYWRfcGh5X3JlZyhwYnBjdGxfZGV2LAotCQkJCQkJICAgICAgIEJQQ1RMSV9QSFlfQ09OVFJPTCwKLQkJCQkJCSAgICAgICAmbWlpX3JlZykpKSB7CisJCQkJcmV0ID0gYnA3NV9yZWFkX3BoeV9yZWcocGJwY3RsX2RldiwKKwkJCQkJICAgICAgQlBDVExJX1BIWV9DT05UUk9MLAorCQkJCQkgICAgICAmbWlpX3JlZyk7CisJCQkJaWYgKCFyZXQpIHsKIAogCQkJCQltaWlfcmVnIHw9IEJQQ1RMSV9NSUlfQ1JfUE9XRVJfRE9XTjsKLQkJCQkJcmV0ID0KLQkJCQkJICAgIGJwNzVfd3JpdGVfcGh5X3JlZyhwYnBjdGxfZGV2LAotCQkJCQkJCSAgICAgICBCUENUTElfUEhZX0NPTlRST0wsCi0JCQkJCQkJICAgICAgIG1paV9yZWcpOworCQkJCQlyZXQgPSBicDc1X3dyaXRlX3BoeV9yZWcocGJwY3RsX2RldiwKKwkJCQkJCSAgICAgICBCUENUTElfUEhZX0NPTlRST0wsCisJCQkJCQkgICAgICAgbWlpX3JlZyk7CiAJCQkJfQogCQkJfQogCkBAIC0yNTM0LDcgKzI0ODQsNyBAQAogfQogCiAvKlJFU0VUX0NPTlQgMHgyMCAqLwotaW50IHJlc2V0X2NvbnQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgcmVzZXRfY29udChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCkBAIC0yNTUxLDcgKzI1MDEsNyBAQAogfQogCiAvKkRJU19CWVBBU1NfQ0FQIDB4MjIgKi8KLWludCBkaXNfYnlwYXNzX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNfYnlwYXNzX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9ESVNfQ0FQKSB7CkBAIC0yNTcwLDcgKzI1MjAsNyBAQAogfQogCiAvKkVOX0JZUEFTU19DQVAgMHgyNCAqLwotaW50IGVuX2J5cGFzc19jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZW5fYnlwYXNzX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfRElTX0NBUCkgewogCQlpZiAoSU5URUxfSUZfU0VSSUVTKHBicGN0bF9kZXYtPnN1YmRldmljZSkpIHsKQEAgLTI1ODYsNyArMjUzNiw3IEBACiB9CiAKIC8qIEJZUEFTU19TVEFURV9QV1JPTiAweDI2Ki8KLWludCBieXBhc3Nfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX3N0YXRlX3B3cm9uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9QV1VQX0NUTF9DQVApIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBCWVBBU1NfU1RBVEVfUFdST04pOwpAQCAtMjYwMCw3ICsyNTUwLDcgQEAKIH0KIAogLyogTk9STUFMX1NUQVRFX1BXUk9OIDB4MjgqLwotaW50IG5vcm1hbF9zdGF0ZV9wd3JvbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBub3JtYWxfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9QV1VQX0NUTF9DQVApCiAJICAgIHx8IChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1BXVVBfQ1RMX0NBUCkpIHsKQEAgLTI2MTUsNyArMjU2NSw3IEBACiB9CiAKIC8qIEJZUEFTU19TVEFURV9QV1JPRkYgMHgyNyovCi1pbnQgYnlwYXNzX3N0YXRlX3B3cm9mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfc3RhdGVfcHdyb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBCUF9QV09GRl9DVExfQ0FQKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgQllQQVNTX1NUQVRFX1BXUk9GRik7CkBAIC0yNjI2LDcgKzI1NzYsNyBAQAogfQogCiAvKiBOT1JNQUxfU1RBVEVfUFdST0ZGIDB4MjkqLwotaW50IG5vcm1hbF9zdGF0ZV9wd3JvZmYoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgbm9ybWFsX3N0YXRlX3B3cm9mZihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX1BXT0ZGX0NUTF9DQVApKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgTk9STUFMX1NUQVRFX1BXUk9GRik7CkBAIC0yNjM3LDcgKzI1ODcsNyBAQAogfQogCiAvKlRBUF9TVEFURV9QV1JPTiAweDJhKi8KLWludCB0YXBfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX3N0YXRlX3B3cm9uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfUFdVUF9DVExfQ0FQKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgVEFQX1NUQVRFX1BXUk9OKTsKQEAgLTI2NDgsNyArMjU5OCw3IEBACiB9CiAKIC8qRElTX1RBUF9DQVAgMHgyYyovCi1pbnQgZGlzX3RhcF9jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGlzX3RhcF9jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9ESVNfQ0FQKSB7CiAJCXdyaXRlX2RhdGEocGJwY3RsX2RldiwgRElTX1RBUF9DQVApOwpAQCAtMjY1OSw3ICsyNjA5LDcgQEAKIH0KIAogLypFTl9UQVBfQ0FQIDB4MmUqLwotaW50IGVuX3RhcF9jYXAoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZW5fdGFwX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX0RJU19DQVApIHsKIAkJd3JpdGVfZGF0YShwYnBjdGxfZGV2LCBFTl9UQVBfQ0FQKTsKQEAgLTI2NzAsNyArMjYyMCw3IEBACiB9CiAKIC8qRElTQ19TVEFURV9QV1JPTiAweDJhKi8KLWludCBkaXNjX3N0YXRlX3B3cm9uKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2Nfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfUFdVUF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkgewpAQCAtMjY4Myw3ICsyNjMzLDcgQEAKIH0KIAogLypESVNfRElTQ19DQVAgMHgyYyovCi1pbnQgZGlzX2Rpc2NfY2FwKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc19kaXNjX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19ESVNfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkgewpAQCAtMjY5NSw2MCArMjY0NSw4IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLS8qRElTQ19TVEFURV9QV1JPTiAweDJhKi8KLWludCBkaXNjX3BvcnRfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlyZXR1cm4gQlBfTk9UX0NBUDsKLQotCWlmICgoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpKSA9PSAxKQotCQlwYnBjdGxfZGV2X20gPSBwYnBjdGxfZGV2OwotCWVsc2UKLQkJcGJwY3RsX2Rldl9tID0gZ2V0X21hc3Rlcl9wb3J0X2ZuKHBicGN0bF9kZXYpOwotCWlmIChwYnBjdGxfZGV2X20gPT0gTlVMTCkKLQkJcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAocGJwY3RsX2Rldl9tLT5icF9jYXBzX2V4ICYgRElTQ19QT1JUX0NBUF9FWCkgewotCQlpZiAoaXNfYnlwYXNzX2ZuKHBicGN0bF9kZXYpID09IDEpCi0JCQl3cml0ZV9kYXRhKHBicGN0bF9kZXZfbSwgVFhfRElTQV9QV1JVUCk7Ci0JCWVsc2UKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9ESVNCX1BXUlVQKTsKLQotCQltc2VjX2RlbGF5X2JwKExBVENIX0RFTEFZKTsKLQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbm9ybWFsX3BvcnRfc3RhdGVfcHdyb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJd3JpdGVfZGF0YShwYnBjdGxfZGV2X20sIFRYX0VOQV9QV1JVUCk7Ci0JCWVsc2UKLQkJCXdyaXRlX2RhdGEocGJwY3RsX2Rldl9tLCBUWF9FTkJfUFdSVVApOwotCi0JCW1zZWNfZGVsYXlfYnAoTEFUQ0hfREVMQVkpOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KIC8qRU5fVEFQX0NBUCAweDJlKi8KLWludCBlbl9kaXNjX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBlbl9kaXNjX2NhcChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgRElTQ19ESVNfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkgewpAQCAtMjc2MCw3ICsyNjU4LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IHN0ZF9uaWNfb24oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgc3RkX25pY19vbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTVERfTklDX0NBUCkgewpAQCAtMjgxNCw3ICsyNzEyLDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IHN0ZF9uaWNfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHN0ZF9uaWNfb2ZmKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNURF9OSUNfQ0FQKSB7CkBAIC0yOTc3LDcgKzI4NzUsNyBAQAogfQogCiAvKldBSVRfQVRfUFdSVVAgMHg4MCAgICovCi1pbnQgYnBfd2FpdF9hdF9wd3VwX2VuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJwX3dhaXRfYXRfcHd1cF9lbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CkBAIC0yOTkyLDcgKzI4OTAsNyBAQAogfQogCiAvKkRJU19XQUlUX0FUX1BXUlVQICAgICAgIDB4ODEgKi8KLWludCBicF93YWl0X2F0X3B3dXBfZGlzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJwX3dhaXRfYXRfcHd1cF9kaXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewpAQCAtMzAwOSw3ICsyOTA3LDcgQEAKIAogLypFTl9IV19SRVNFVCAgMHg4MiAgICovCiAKLWludCBicF9od19yZXNldF9lbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBicF9od19yZXNldF9lbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CkBAIC0zMDI1LDcgKzI5MjMsNyBAQAogCiAvKkRJU19IV19SRVNFVCAgICAgICAgICAgICAweDgzICAgKi8KIAotaW50IGJwX2h3X3Jlc2V0X2RpcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBicF9od19yZXNldF9kaXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewpAQCAtMzA0MCw3ICsyOTM4LDcgQEAKIH0KIAogCi1pbnQgd2R0X2V4cF9tb2RlKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBtb2RlKQorc3RhdGljIGludCB3ZHRfZXhwX21vZGUoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IG1vZGUpCiB7CiAJdWludDMyX3Qgc3RhdHVzX3JlZyA9IDAsIHN0YXR1c19yZWcxID0gMDsKIApAQCAtMzA5MSw3ICsyOTg5LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19md192ZXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX2Z3X3ZlcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChpc19ieXBhc3NfZm4ocGJwY3RsX2RldikpCiAJCXJldHVybiByZWFkX3JlZyhwYnBjdGxfZGV2LCBWRVJfUkVHX0FERFIpOwpAQCAtMzA5OSw3ICsyOTk3LDcgQEAKIAkJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBieXBhc3Nfc2lnbl9jaGVjayhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3Nfc2lnbl9jaGVjayhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkKQEAgLTMyMTAsNyArMzEwOCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBieXBhc3NfZnJvbV9sYXN0X3JlYWQoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX2Zyb21fbGFzdF9yZWFkKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdWludDMyX3QgY3RybF9leHQgPSAwOwogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC0zMjMwLDcgKzMxMjgsNyBAQAogCQlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19zdGF0dXNfY2xlYXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CiAKQEAgLTMyNDQsNyArMzE0Miw3IEBACiAJCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgYnlwYXNzX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGJ5cGFzc19mbGFnX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCiAJaWYgKChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfQ0FQKSkgewpAQCAtMzI1Nyw3ICszMTU1LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGJ5cGFzc19mbGFnX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBieXBhc3NfZmxhZ19zdGF0dXNfY2xlYXIoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfQ0FQKSB7CkBAIC0zMjcyLDcgKzMxNzAsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgYnlwYXNzX2NoYW5nZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnlwYXNzX2NoYW5nZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIApAQCAtMzI5MSwxOCArMzE4OSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ5cGFzc19vZmZfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0KLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX0NBUCkgewotCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSBQWEcyQlBJX1ZFUikgewotCQkJcmV0dXJuICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBTVEFUVVNfUkVHX0FERFIpKSAmCi0JCQkJICBCWVBBU1NfT0ZGX01BU0spID09IEJZUEFTU19PRkZfTUFTSykgPyAxIDogMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci19Ci0KIHN0YXRpYyBpbnQgYnlwYXNzX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXUzMiBjdHJsX2V4dCA9IDA7CkBAIC0zMzg2LDcgKzMyNzIsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGVmYXVsdF9wd3Jvbl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZGVmYXVsdF9wd3Jvbl9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgU1dfQ1RMX0NBUCkgewpAQCAtMzQxOCw3ICszMzA0LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRpc19ieXBhc3NfY2FwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNfYnlwYXNzX2NhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgQlBfRElTX0NBUCkgewpAQCAtMzQzMSwzMSArMzMxNyw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBjbWRfZW5fc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0KLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKLQkJaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPj0gUFhHMkJQSV9WRVIpIHsKLQkJCXJldHVybiAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgU1RBVFVTX1JFR19BRERSKSkgJgotCQkJCSAgQ01ORF9FTl9NQVNLKSA9PSBDTU5EX0VOX01BU0spID8gMSA6IDApOwotCQl9Ci0JfQotCXJldHVybiBCUF9OT1RfQ0FQOwotfQotCi1pbnQgd2R0X2VuX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCi0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBXRF9DVExfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJCUElfVkVSKSB7Ci0JCQlyZXR1cm4gKCgoKHJlYWRfcmVnKHBicGN0bF9kZXYsIFNUQVRVU19SRUdfQUREUikpICYKLQkJCQkgIFdEVF9FTl9NQVNLKSA9PSBXRFRfRU5fTUFTSykgPyAxIDogMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci19Ci0KLWludCB3ZHRfcHJvZ3JhbW1lZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgKnRpbWVvdXQpCitzdGF0aWMgaW50IHdkdF9wcm9ncmFtbWVkKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZW91dCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFdEX0NUTF9DQVApIHsKQEAgLTM0ODEsNDAgKzMzNDMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBieXBhc3Nfc3VwcG9ydChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikgewotCQkJcmV0ID0KLQkJCSAgICAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgUFJPRFVDVF9DQVBfUkVHX0FERFIpKSAmCi0JCQkgICAgICAgQllQQVNTX1NVUFBPUlRfTUFTSykgPT0KLQkJCSAgICAgIEJZUEFTU19TVVBQT1JUX01BU0spID8gMSA6IDApOwotCQl9IGVsc2UgaWYgKHBicGN0bF9kZXYtPmJwX2V4dF92ZXIgPT0gUFhHMkJQSV9WRVIpCi0JCQlyZXQgPSAxOwotCX0gZWxzZQotCQlyZXQgPSBCUF9OT1RfQ0FQOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB0YXBfc3VwcG9ydChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikgewotCQkJcmV0ID0KLQkJCSAgICAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgUFJPRFVDVF9DQVBfUkVHX0FERFIpKSAmCi0JCQkgICAgICAgVEFQX1NVUFBPUlRfTUFTSykgPT0gVEFQX1NVUFBPUlRfTUFTSykgPyAxIDogMCk7Ci0JCX0gZWxzZSBpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA9PSBQWEcyQlBJX1ZFUikKLQkJCXJldCA9IDA7Ci0JfSBlbHNlCi0JCXJldCA9IEJQX05PVF9DQVA7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IG5vcm1hbF9zdXBwb3J0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IG5vcm1hbF9zdXBwb3J0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAKQEAgLTM1MzAsNyArMzM1OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9icF9wcm9kX2NhcHMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2JwX3Byb2RfY2FwcyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICgocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApICYmCiAJICAgIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikpCkBAIC0zNTM5LDcgKzMzNjgsNyBAQAogCiB9CiAKLWludCB0YXBfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgdGFwX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9TVEFUVVNfQ0FQKSB7CkBAIC0zNTUxLDcgKzMzODAsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgdGFwX2ZsYWdfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRhcF9mbGFnX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXVpbnQzMl90IHN0YXR1c19yZWcgPSAwOwogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1NUQVRVU19DQVApIHsKQEAgLTM1NjUsNyArMzM5NCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCB0YXBfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCB0YXBfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSBCUF9OT1RfQ0FQOwogCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikgewpAQCAtMzU4MiwxNyArMzQxMSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHRhcF9vZmZfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUQVBfQ0FQKSB7Ci0JCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IFBYRzJUQlBJX1ZFUikKLQkJCXJldHVybiAoKCgocmVhZF9yZWcocGJwY3RsX2RldiwgU1RBVFVTX1RBUF9SRUdfQUREUikpICYKLQkJCQkgIFRBUF9PRkZfTUFTSykgPT0gVEFQX09GRl9NQVNLKSA/IDEgOiAwKTsKLQl9Ci0JcmV0dXJuIEJQX05PVF9DQVA7Ci19Ci0KLWludCB0YXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAl1MzIgY3RybF9leHQgPSAwOwogCkBAIC0zNjMxLDcgKzM0NTAsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGVmYXVsdF9wd3Jvbl90YXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRlZmF1bHRfcHdyb25fdGFwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1BXVVBfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSBQWEcyVEJQSV9WRVIpCkBAIC0zNjQyLDcgKzM0NjEsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzX3RhcF9jYXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc190YXBfY2FwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgVEFQX1BXVVBfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSBQWEcyVEJQSV9WRVIpCkBAIC0zNjUzLDcgKzM0NzIsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19mbGFnX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNjX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfQ0FQKSB7CkBAIC0zNjY1LDcgKzM0ODQsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19mbGFnX3N0YXR1c19jbGVhcihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNjX2ZsYWdfc3RhdHVzX2NsZWFyKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdWludDMyX3Qgc3RhdHVzX3JlZyA9IDA7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBESVNDX0NBUCkgewpAQCAtMzY3OSw3ICszNDk4LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRpc2NfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBkaXNjX2NoYW5nZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfQ0FQKSB7CkBAIC0zNjkwLDcgKzM1MDksNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZGlzY19vZmZfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc2Nfb2ZmX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CiAJdTMyIGN0cmxfZXh0ID0gMDsKQEAgLTM3ODYsNyArMzYwNSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkZWZhdWx0X3B3cm9uX2Rpc2Nfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRlZmF1bHRfcHdyb25fZGlzY19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU0NfUFdVUF9DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkKQEAgLTM3OTcsNyArMzYxNiw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBkaXNfZGlzY19jYXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGRpc19kaXNjX2NhcF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIERJU19ESVNDX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA+PSAweDgpCkBAIC0zODA4LDU1ICszNjI3LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGRpc2NfcG9ydF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKSB7Ci0JCQlyZXR1cm4gKCgoKHJlYWRfcmVnKHBicGN0bF9kZXYsIFNUQVRVU19UQVBfUkVHX0FERFIpKSAmCi0JCQkJICBUWF9ESVNBX01BU0spID09IFRYX0RJU0FfTUFTSykgPyAxIDogMCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuICgoKChyZWFkX3JlZyhwYnBjdGxfZGV2LCBTVEFUVVNfVEFQX1JFR19BRERSKSkgJgotCQkJCSAgVFhfRElTQl9NQVNLKSA9PSBUWF9ESVNCX01BU0spID8gMSA6IDApOwotCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBkZWZhdWx0X3B3cm9uX2Rpc2NfcG9ydF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKLQlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X207Ci0KLQlpZiAoKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSkgPT0gMSkKLQkJcGJwY3RsX2Rldl9tID0gcGJwY3RsX2RldjsKLQllbHNlCi0JCXBicGN0bF9kZXZfbSA9IGdldF9tYXN0ZXJfcG9ydF9mbihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldl9tID09IE5VTEwpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKHBicGN0bF9kZXZfbS0+YnBfY2Fwc19leCAmIERJU0NfUE9SVF9DQVBfRVgpIHsKLQkJaWYgKGlzX2J5cGFzc19mbihwYnBjdGxfZGV2KSA9PSAxKQotCQkJcmV0dXJuIHJldDsKLQkJLyogIHJldHVybigoKChyZWFkX3JlZyhwYnBjdGxfZGV2LFNUQVRVU19UQVBfUkVHX0FERFIpKSAmIFRYX0RJU0FfTUFTSyk9PVRYX0RJU0FfTUFTSyk/MTowKTsgKi8KLQkJZWxzZQotCQkJcmV0dXJuIHJldDsKLQkJLyogICByZXR1cm4oKCgocmVhZF9yZWcocGJwY3RsX2RldixTVEFUVVNfVEFQX1JFR19BRERSKSkgJiBUWF9ESVNBX01BU0spPT1UWF9ESVNBX01BU0spPzE6MCk7ICovCi0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHdkdF9leHBfbW9kZV9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgd2R0X2V4cF9tb2RlX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+YnBfZXh0X3ZlciA8PSBQWEcyQlBJX1ZFUikKQEAgLTM4NzksNyArMzY1MCw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCB0cGwyX2ZsYWdfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHRwbDJfZmxhZ19zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzX2V4ICYgVFBMMl9DQVBfRVgpIHsKQEAgLTM4OTAsMjIgKzM2NjEsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgdHBsX2h3X3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7Ci0KLQlwYnBjdGxfZGV2X2IgPSBnZXRfc3RhdHVzX3BvcnRfZm4ocGJwY3RsX2Rldik7Ci0JaWYgKCFwYnBjdGxfZGV2X2IpCi0JCXJldHVybiBCUF9OT1RfQ0FQOwotCi0JaWYgKFRQTF9JRl9TRVJJRVMocGJwY3RsX2Rldi0+c3ViZGV2aWNlKSkKLQkJcmV0dXJuICgoKEJQQ1RMX1JFQURfUkVHKHBicGN0bF9kZXYsIENUUkwpKSAmCi0JCQkgQlBDVExJX0NUUkxfU1dEUElOMCkgIT0gMCA/IDEgOiAwKTsKLQlyZXR1cm4gQlBfTk9UX0NBUDsKLX0KLQotCi1pbnQgYnBfd2FpdF9hdF9wd3VwX3N0YXR1cyhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBicF93YWl0X2F0X3B3dXBfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBTV19DVExfQ0FQKSB7CiAJCWlmIChwYnBjdGxfZGV2LT5icF9leHRfdmVyID49IDB4OCkKQEAgLTM5MTYsNyArMzY3Miw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBicF9od19yZXNldF9zdGF0dXMoc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgYnBfaHdfcmVzZXRfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFNXX0NUTF9DQVApIHsKQEAgLTM5MzAsNyArMzY4Niw3IEBACiB9CiAKIAotaW50IHN0ZF9uaWNfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IHN0ZF9uaWNfc3RhdHVzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHN0YXR1c192YWwgPSAwOwogCkBAIC0zOTc4LDcgKzM3MzQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKlNXX0lOSVQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBieXBhc3NfY2Fwc19pbml0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCBieXBhc3NfY2Fwc19pbml0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJdV9pbnQzMl90IGN0cmxfZXh0ID0gMDsKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X20gPSBOVUxMOwpAQCAtNDE5NiwyMyArMzk1Miw3IEBACiAJfQogfQogCi1pbnQgYnlwYXNzX29mZl9pbml0KHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaW50IHJldCA9IGNtbmRfb24ocGJwY3RsX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JaWYgKElOVEVMX0lGX1NFUklFUyhwYnBjdGxfZGV2LT5zdWJkZXZpY2UpKQotCQlyZXR1cm4gZGlzX2J5cGFzc19jYXAocGJwY3RsX2Rldik7Ci0Jd2R0X29mZihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIEJQX0NBUCkKLQkJYnlwYXNzX29mZihwYnBjdGxfZGV2KTsKLQlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFRBUF9DQVApCi0JCXRhcF9vZmYocGJwY3RsX2Rldik7Ci0JY21uZF9vZmYocGJwY3RsX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcmVtb3ZlX2J5cGFzc193ZF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCByZW1vdmVfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKICNpZmRlZiBCUF9TRUxGX1RFU1QKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X3NsID0gTlVMTDsKQEAgLTQyNDEsNyArMzk4MSw3IEBACiAKIH0KIAotaW50IGluaXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgaW5pdF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkgewogCQlpbml0X3RpbWVyKCZwYnBjdGxfZGV2LT5icF90aW1lcik7CkBAIC00Mjg4LDcgKzQwMjgsNyBAQAogfQogI2VuZGlmCiAKLWludCBzZXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHBhcmFtKQorc3RhdGljIGludCBzZXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHBhcmFtKQogewogCWlmIChwYnBjdGxfZGV2LT5icF9jYXBzICYgV0RfQ1RMX0NBUCkgewogCQlpZiAocGJwY3RsX2Rldi0+cmVzZXRfdGltZSAhPSBwYXJhbSkgewpAQCAtNDMwNyw3ICs0MDQ3LDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGdldF9ieXBhc3Nfd2RfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3dkX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAocGJwY3RsX2Rldi0+YnBfY2FwcyAmIFdEX0NUTF9DQVApCiAJCXJldHVybiBwYnBjdGxfZGV2LT5yZXNldF90aW1lOwpAQCAtNDM3OCw3ICs0MTE4LDcgQEAKIAlyZXR1cm4gKCgocGJwY3RsX2Rldi0+ZnVuYyA9PSAwKSB8fCAocGJwY3RsX2Rldi0+ZnVuYyA9PSAyKSkgPyAxIDogMCk7CiB9CiAKLWludCBzZXRfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBieXBhc3NfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgYnlwYXNzX21vZGUpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTQzOTYsMTIgKzQxMzYsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ2V0X2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJcmV0dXJuIGJ5cGFzc19zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBnZXRfYnlwYXNzX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDQwOSw3ICs0MTQ5LDcgQEAKIAlyZXR1cm4gYnlwYXNzX2NoYW5nZV9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfZGlzX2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQorc3RhdGljIGludCBzZXRfZGlzX2J5cGFzc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ0MjgsNyArNDE2OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9kaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9kaXNfYnlwYXNzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NDM2LDcgKzQxNzYsNyBAQAogCXJldHVybiBkaXNfYnlwYXNzX2NhcF9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfYnlwYXNzX3B3b2ZmX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBieXBhc3NfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2J5cGFzc19wd29mZl9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgYnlwYXNzX21vZGUpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDQ1NSw3ICs0MTk1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ2V0X2J5cGFzc19wd29mZl9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3B3b2ZmX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NDYzLDcgKzQyMDMsNyBAQAogCXJldHVybiBkZWZhdWx0X3B3cm9mZl9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfYnlwYXNzX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGJ5cGFzc19tb2RlKQorc3RhdGljIGludCBzZXRfYnlwYXNzX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGJ5cGFzc19tb2RlKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ0ODIsNyArNDIyMiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGdldF9ieXBhc3NfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfYnlwYXNzX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ0OTAsNyArNDIzMCw3IEBACiAJcmV0dXJuIGRlZmF1bHRfcHdyb25fc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgc2V0X2J5cGFzc193ZF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgc2V0X2J5cGFzc193ZF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGltZW91dCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NTEyLDcgKzQyNTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfYnlwYXNzX3dkX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZW91dCkKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc193ZF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgKnRpbWVvdXQpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NTIwLDcgKzQyNjAsNyBAQAogCXJldHVybiB3ZHRfcHJvZ3JhbW1lZChwYnBjdGxfZGV2LCB0aW1lb3V0KTsKIH0KIAotaW50IGdldF93ZF9leHBpcmVfdGltZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgKnRpbWVfbGVmdCkKK3N0YXRpYyBpbnQgZ2V0X3dkX2V4cGlyZV90aW1lX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCAqdGltZV9sZWZ0KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDUyOCw3ICs0MjY4LDcgQEAKIAlyZXR1cm4gd2R0X3RpbWVyKHBicGN0bF9kZXYsIHRpbWVfbGVmdCk7CiB9CiAKLWludCByZXNldF9ieXBhc3Nfd2RfdGltZXJfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgcmVzZXRfYnlwYXNzX3dkX3RpbWVyX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NTM2LDcgKzQyNzYsNyBAQAogCXJldHVybiB3ZHRfdGltZXJfcmVsb2FkKHBicGN0bF9kZXYpOwogfQogCi1pbnQgZ2V0X3dkX3NldF9jYXBzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF93ZF9zZXRfY2Fwc19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCBicF9zdGF0dXMgPSAwOwogCkBAIC00NTYwLDcgKzQzMDAsNyBAQAogCXJldHVybiBicF9zdGF0dXM7CiB9CiAKLWludCBzZXRfc3RkX25pY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgbmljX21vZGUpCitzdGF0aWMgaW50IHNldF9zdGRfbmljX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBuaWNfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NTgwLDcgKzQzMjAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfc3RkX25pY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfc3RkX25pY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDU4OCw3ICs0MzI4LDcgQEAKIAlyZXR1cm4gc3RkX25pY19zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NjA0LDcgKzQzNDQsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdGFwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NjEyLDcgKzQzNTIsNyBAQAogCXJldHVybiB0YXBfc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgc2V0X3RhcF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKK3N0YXRpYyBpbnQgc2V0X3RhcF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0YXBfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NjMwLDcgKzQzNzAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfdGFwX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X3RhcF9wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDY0Miw3ICs0MzgyLDcgQEAKIAlyZXR1cm4gKChyZXQgPT0gMCkgPyAxIDogMCk7CiB9CiAKLWludCBnZXRfdGFwX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdGFwX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDY1MCw3ICs0MzkwLDcgQEAKIAlyZXR1cm4gdGFwX2NoYW5nZV9zdGF0dXMocGJwY3RsX2Rldik7CiB9CiAKLWludCBzZXRfZGlzX3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQorc3RhdGljIGludCBzZXRfZGlzX3RhcF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ2NjcsNyArNDQwNyw3IEBACiAJCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2Rpc190YXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2Rpc190YXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ2NzUsNyArNDQxNSw3IEBACiAJcmV0dXJuIGRpc190YXBfY2FwX3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IHNldF9kaXNjX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNjX21vZGUpCitzdGF0aWMgaW50IHNldF9kaXNjX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNjX21vZGUpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00NjkyLDcgKzQ0MzIsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzAzLDcgKzQ0NDMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBzZXRfZGlzY19wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBkaXNjX21vZGUpCitzdGF0aWMgaW50IHNldF9kaXNjX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc2NfbW9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzIxLDcgKzQ0NjEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBnZXRfZGlzY19wd3VwX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9kaXNjX3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzMxLDcgKzQ0NzEsNyBAQAogCXJldHVybiAocmV0ID09IDAgPyAxIDogKHJldCA8IDAgPyBCUF9OT1RfQ0FQIDogMCkpOwogfQogCi1pbnQgZ2V0X2Rpc2NfY2hhbmdlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9kaXNjX2NoYW5nZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ3NDEsNyArNDQ4MSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHNldF9kaXNfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzX3BhcmFtKQorc3RhdGljIGludCBzZXRfZGlzX2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc19wYXJhbSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzU5LDcgKzQ0OTksNyBAQAogCQlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGdldF9kaXNfZGlzY19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfZGlzX2Rpc2NfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC00NzcwLDU1ICs0NTEwLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgc2V0X2Rpc2NfcG9ydF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgZGlzY19tb2RlKQotewotCWludCByZXQgPSBCUF9OT1RfQ0FQOwotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCFkaXNjX21vZGUpCi0JCXJldCA9IGRpc2NfcG9ydF9vZmYocGJwY3RsX2Rldik7Ci0JZWxzZQotCQlyZXQgPSBkaXNjX3BvcnRfb24ocGJwY3RsX2Rldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZ2V0X2Rpc2NfcG9ydF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIGRpc2NfcG9ydF9zdGF0dXMocGJwY3RsX2Rldik7Ci19Ci0KLWludCBzZXRfZGlzY19wb3J0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IGRpc2NfbW9kZSkKLXsKLQlpbnQgcmV0ID0gQlBfTk9UX0NBUDsKLQlpZiAoIXBicGN0bF9kZXYpCi0JCXJldHVybiAtMTsKLQotCWlmICghZGlzY19tb2RlKQotCQlyZXQgPSBub3JtYWxfcG9ydF9zdGF0ZV9wd3JvbihwYnBjdGxfZGV2KTsKLQllbHNlCi0JCXJldCA9IGRpc2NfcG9ydF9zdGF0ZV9wd3JvbihwYnBjdGxfZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBnZXRfZGlzY19wb3J0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpZiAoIXBicGN0bF9kZXYpCi0JCXJldHVybiAtMTsKLQotCXJldCA9IGRlZmF1bHRfcHdyb25fZGlzY19wb3J0X3N0YXR1cyhwYnBjdGxfZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gKChyZXQgPT0gMCkgPyAxIDogMCk7Ci19Ci0KLWludCBnZXRfd2RfZXhwX21vZGVfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X3dkX2V4cF9tb2RlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00ODI2LDcgKzQ1MTgsNyBAQAogCXJldHVybiB3ZHRfZXhwX21vZGVfc3RhdHVzKHBicGN0bF9kZXYpOwogfQogCi1pbnQgc2V0X3dkX2V4cF9tb2RlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBwYXJhbSkKK3N0YXRpYyBpbnQgc2V0X3dkX2V4cF9tb2RlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCBwYXJhbSkKIHsKIAlpZiAoIXBicGN0bF9kZXYpCiAJCXJldHVybiAtMTsKQEAgLTQ4MzQsMTkgKzQ1MjYsNyBAQAogCXJldHVybiB3ZHRfZXhwX21vZGUocGJwY3RsX2RldiwgcGFyYW0pOwogfQogCi1pbnQgcmVzZXRfY29udF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQotewotCWludCByZXQgPSAwOwotCWlmICghcGJwY3RsX2RldikKLQkJcmV0dXJuIC0xOwotCi0JcmV0ID0gY21uZF9vbihwYnBjdGxfZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gcmVzZXRfY29udChwYnBjdGxfZGV2KTsKLX0KLQotaW50IHNldF90eF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdHhfc3RhdGUpCitzdGF0aWMgaW50IHNldF90eF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdHhfc3RhdGUpCiB7CiAKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X2IgPSBOVUxMOwpAQCAtNDg2Nyw3ICs0NTQ3LDcgQEAKIAlyZXR1cm4gc2V0X3R4KHBicGN0bF9kZXYsIHR4X3N0YXRlKTsKIH0KIAotaW50IHNldF9icF9mb3JjZV9saW5rX2ZuKGludCBkZXZfbnVtLCBpbnQgdHhfc3RhdGUpCitzdGF0aWMgaW50IHNldF9icF9mb3JjZV9saW5rX2ZuKGludCBkZXZfbnVtLCBpbnQgdHhfc3RhdGUpCiB7CiAJc3RhdGljIHN0cnVjdCBicGN0bF9kZXYgKmJwY3RsX2Rldl9jdXJyOwogCkBAIC00ODc5LDcgKzQ1NTksNyBAQAogCXJldHVybiBzZXRfYnBfZm9yY2VfbGluayhicGN0bF9kZXZfY3VyciwgdHhfc3RhdGUpOwogfQogCi1pbnQgc2V0X3dkX2F1dG9yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgcGFyYW0pCitzdGF0aWMgaW50IHNldF93ZF9hdXRvcmVzZXRfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHBhcmFtKQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDg4Nyw3ICs0NTY3LDcgQEAKIAlyZXR1cm4gc2V0X2J5cGFzc193ZF9hdXRvKHBicGN0bF9kZXYsIHBhcmFtKTsKIH0KIAotaW50IGdldF93ZF9hdXRvcmVzZXRfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X3dkX2F1dG9yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNDkxNCw3ICs0NTk0LDcgQEAKIAogI2VuZGlmCiAKLWludCBnZXRfYnlwYXNzX2NhcHNfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc19jYXBzX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00OTIzLDcgKzQ2MDMsOCBAQAogCiB9CiAKLWludCBnZXRfYnlwYXNzX3NsYXZlX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIHN0cnVjdCBicGN0bF9kZXYgKipwYnBjdGxfZGV2X291dCkKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc19zbGF2ZV9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LAorCQkJICAgICAgIHN0cnVjdCBicGN0bF9kZXYgKipwYnBjdGxfZGV2X291dCkKIHsKIAlpbnQgaWR4X2RldiA9IDA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNDk1NSw3ICs0NjM2LDcgQEAKIAkJcmV0dXJuIDA7CiB9CiAKLWludCBpc19ieXBhc3Moc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgaXNfYnlwYXNzKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC00OTY2LDcgKzQ2NDcsNyBAQAogCQlyZXR1cm4gMDsKIH0KIAotaW50IGdldF90eF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdHhfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKIHsKIAlzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2X2IgPSBOVUxMOwogCWlmICghcGJwY3RsX2RldikKQEAgLTQ5ODYsNyArNDY2Nyw3IEBACiAJcmV0dXJuIHR4X3N0YXR1cyhwYnBjdGxfZGV2KTsKIH0KIAotaW50IGdldF9icF9mb3JjZV9saW5rX2ZuKGludCBkZXZfbnVtKQorc3RhdGljIGludCBnZXRfYnBfZm9yY2VfbGlua19mbihpbnQgZGV2X251bSkKIHsKIAlzdGF0aWMgc3RydWN0IGJwY3RsX2RldiAqYnBjdGxfZGV2X2N1cnI7CiAKQEAgLTUwNDksNyArNDczMCw3IEBACiAJbW9kX3RpbWVyKCZwYnBjdGxfZGV2LT5icF90cGxfdGltZXIsIGppZmZpZXMgKyBCUF9MSU5LX01PTl9ERUxBWSAqIEhaKTsKIH0KIAotdm9pZCByZW1vdmVfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgdm9pZCByZW1vdmVfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2Rldl9iID0gTlVMTDsKIAlpZiAoIXBicGN0bF9kZXYpCkBAIC01MDY3LDcgKzQ3NDgsNyBAQAogCXJldHVybjsKIH0KIAotaW50IGluaXRfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGluaXRfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC01MDgwLDcgKzQ3NjEsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgc2V0X2J5cGFzc190cGxfYXV0byhzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCB1bnNpZ25lZCBpbnQgcGFyYW0pCitzdGF0aWMgaW50IHNldF9ieXBhc3NfdHBsX2F1dG8oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgdW5zaWduZWQgaW50IHBhcmFtKQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNTA5OCwxNyArNDc3OSw3IEBACiAJcmV0dXJuIEJQX05PVF9DQVA7CiB9CiAKLWludCBnZXRfYnlwYXNzX3RwbF9hdXRvKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCi17Ci0JaWYgKCFwYnBjdGxfZGV2KQotCQlyZXR1cm4gLTE7Ci0JaWYgKHBicGN0bF9kZXYtPmJwX2NhcHMgJiBUUExfQ0FQKQotCQlyZXR1cm4gcGJwY3RsX2Rldi0+YnBfdHBsX2ZsYWc7Ci0KLQlyZXR1cm4gQlBfTk9UX0NBUDsKLX0KLQotaW50IHNldF90cGxfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRwbF9tb2RlKQorc3RhdGljIGludCBzZXRfdHBsX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGludCB0cGxfbW9kZSkKIHsKIAogCXN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXZfYiA9IE5VTEw7CkBAIC01MTM4LDcgKzQ4MDksNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X3RwbF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQorc3RhdGljIGludCBnZXRfdHBsX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCiB7CiAJaW50IHJldCA9IEJQX05PVF9DQVA7CiAJaWYgKCFwYnBjdGxfZGV2KQpAQCAtNTE1Miw3ICs0ODIzLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgc2V0X2JwX3dhaXRfYXRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCitzdGF0aWMgaW50IHNldF9icF93YWl0X2F0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldiwgaW50IHRhcF9tb2RlKQogewogCWlmICghcGJwY3RsX2RldikKIAkJcmV0dXJuIC0xOwpAQCAtNTE3Miw3ICs0ODQzLDcgQEAKIAlyZXR1cm4gQlBfTk9UX0NBUDsKIH0KIAotaW50IGdldF9icF93YWl0X2F0X3B3dXBfZm4oc3RydWN0IGJwY3RsX2RldiAqcGJwY3RsX2RldikKK3N0YXRpYyBpbnQgZ2V0X2JwX3dhaXRfYXRfcHd1cF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTUxODUsNyArNDg1Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHNldF9icF9od19yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCitzdGF0aWMgaW50IHNldF9icF9od19yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBpbnQgdGFwX21vZGUpCiB7CiAJaWYgKCFwYnBjdGxfZGV2KQogCQlyZXR1cm4gLTE7CkBAIC01MjA1LDcgKzQ4NzYsNyBAQAogCXJldHVybiBCUF9OT1RfQ0FQOwogfQogCi1pbnQgZ2V0X2JwX2h3X3Jlc2V0X2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYpCitzdGF0aWMgaW50IGdldF9icF9od19yZXNldF9mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2KQogewogCWludCByZXQgPSAwOwogCWlmICghcGJwY3RsX2RldikKQEAgLTUyMjAsNyArNDg5MSw3IEBACiB9CiAKIAotaW50IGdldF9ieXBhc3NfaW5mb19mbihzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBjdGxfZGV2LCBjaGFyICpkZXZfbmFtZSwKK3N0YXRpYyBpbnQgZ2V0X2J5cGFzc19pbmZvX2ZuKHN0cnVjdCBicGN0bF9kZXYgKnBicGN0bF9kZXYsIGNoYXIgKmRldl9uYW1lLAogCQkgICAgICAgY2hhciAqYWRkX3BhcmFtKQogewogCWlmICghcGJwY3RsX2RldikKQEAgLTUyMzIsNyArNDkwMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBnZXRfZGV2X2lkeF9ic2YoaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQorc3RhdGljIGludCBnZXRfZGV2X2lkeF9ic2YoaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQogewogCWludCBpZHhfZGV2ID0gMDsKIAlmb3IgKGlkeF9kZXYgPSAwOwpAQCAtNzAyMiwxMiArNjY5Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNldF93ZF9leHBfbW9kZV9zZCk7CiAKLWludCByZXNldF9jb250X3NkKGludCBpZmluZGV4KQotewotCXJldHVybiByZXNldF9jb250X2ZuKGdldF9kZXZfaWR4X3AoaWZpbmRleCkpOwotCi19Ci0KIGludCBzZXRfdHhfc2QoaW50IGlmaW5kZXgsIGludCB0eF9zdGF0ZSkKIHsKIAlyZXR1cm4gc2V0X3R4X2ZuKGdldF9kZXZfaWR4X3AoaWZpbmRleCksIHR4X3N0YXRlKTsKQEAgLTcxMTgsNyArNjc4Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJwX3Byb2Nmc19kaXI7CiAKLWludCBicF9wcm9jX2NyZWF0ZSh2b2lkKQorc3RhdGljIGludCBicF9wcm9jX2NyZWF0ZSh2b2lkKQogewogCWJwX3Byb2Nmc19kaXIgPSBwcm9jX21rZGlyKEJQX1BST0NfRElSLCBpbml0X25ldC5wcm9jX25ldCk7CiAJaWYgKGJwX3Byb2Nmc19kaXIgPT0gKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKTApIHsKQEAgLTc3NDYsNyArNzQxMSw3IEBACiB9CiBSV19GT1BTKHdkX2F1dG9yZXNldCkKIAotaW50IGJ5cGFzc19wcm9jX2NyZWF0ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jaykKK3N0YXRpYyBpbnQgYnlwYXNzX3Byb2NfY3JlYXRlX2Rldl9zZChzdHJ1Y3QgYnBjdGxfZGV2ICpwYnBfZGV2aWNlX2Jsb2NrKQogewogCXN0cnVjdCBieXBhc3NfcGZzX3NkICpjdXJyZW50X3BmcyA9ICYocGJwX2RldmljZV9ibG9jay0+YnlwYXNzX3Bmc19zZXQpOwogCXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nmc19kaXI7CkBAIC03ODE2LDcgKzc0ODEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBieXBhc3NfcHJvY19yZW1vdmVfZGV2X3NkKHN0cnVjdCBicGN0bF9kZXYgKnBicF9kZXZpY2VfYmxvY2spCitzdGF0aWMgaW50IGJ5cGFzc19wcm9jX3JlbW92ZV9kZXZfc2Qoc3RydWN0IGJwY3RsX2RldiAqcGJwX2RldmljZV9ibG9jaykKIHsKIAogCXN0cnVjdCBieXBhc3NfcGZzX3NkICpjdXJyZW50X3BmcyA9ICZwYnBfZGV2aWNlX2Jsb2NrLT5ieXBhc3NfcGZzX3NldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9icF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2JwX2lvY3RsLmgKaW5kZXggMmQxZWY1My4uYmY0N2Y3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2JwX2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NpbGljb20vYnlwYXNzbGliL2JwX2lvY3RsLmgKQEAgLTUxLDkgKzUxLDkgQEAKICNkZWZpbmUgV0RUX1NURVBfVElNRSAgICAgICAgICAgICAgMHgxMAkvKiBCSVRfNCAqLwogCiAjZGVmaW5lIFdEX01JTl9USU1FX0dFVChkZXNjKSAgIChkZXNjICYgMHhmKQotI2RlZmluZSBXRF9TVEVQX0NPVU5UX0dFVChkZXNjKSAoZGVzYz4+NSkgJiAweGYKKyNkZWZpbmUgV0RfU1RFUF9DT1VOVF9HRVQoZGVzYykgKChkZXNjPj41KSAmIDB4ZikKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gewogCUlTX0JZUEFTUyA9IDEsCiAJR0VUX0JZUEFTU19TTEFWRSwKIAlHRVRfQllQQVNTX0NBUFMsCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlTRVRfQlBfSFdfUkVTRVQsCiB9IENNTkRfVFlQRTsKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gewogCUlGX1NDQU5fU0QsCiAJR0VUX0RFVl9OVU1fU0QsCiAJSVNfQllQQVNTX1NELApAQCAtMTU2LDcgKzE1Niw3IEBACiAKIH0gQ01ORF9UWVBFX1NEOwogCi0jZGVmaW5lIFNJT0NHSUZCWVBBU1MgU0lPQ0RFVlBSSVZBVEUrMTAKKyNkZWZpbmUgU0lPQ0dJRkJZUEFTUyAoU0lPQ0RFVlBSSVZBVEUrMTApCiAKIHN0cnVjdCBicF9pbmZvIHsKIAljaGFyIHByb2RfbmFtZVsxNF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2lsaWNvbS9ieXBhc3NsaWIvbGliYnBfc2QuaCBiL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9saWJicF9zZC5oCmluZGV4IDNiNGY4MzYuLmNhYzRiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9saWJicF9zZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zaWxpY29tL2J5cGFzc2xpYi9saWJicF9zZC5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4CiAgKgogICogT3V0cHV0OgotICogIDEgLSAgaWYgZGV2aWNlIGlzIGJ5cGFzcyBjb250cm9sbGluZyBkZXZpY2UsIAorICogIDEgLSAgaWYgZGV2aWNlIGlzIGJ5cGFzcyBjb250cm9sbGluZyBkZXZpY2UsCiAgKiAgMCAtICBpZiBkZXZpY2UgaXMgYnlwYXNzIHNsYXZlIGRldmljZQogICogLTEgLSAgZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcwogICoqLwpAQCAtMzAsNyArMzAsNyBAQAogICoKICAqIE91dHB1dDoKICAqICBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgc2xhdmUgZGV2aWNlCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnlwYXNzX3NsYXZlX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTM5LDU1ICszOSw3MiBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleAogICoKICAqIE91dHB1dDoKLSAqIGZsYWdzIHdvcmQgb24gc3VjY2VzcztmbGFnIHdvcmQgaXMgYSAzMi1iaXQgbWFzayB3b3JkIHdpdGggZWFjaCBiaXQgZGVmaW5lcyBkaWZmZXJlbnQgCi0gKiBjYXBhYmlsaXR5IGFzIGRlc2NyaWJlZCBiZWxsb3cuCisgKiBmbGFncyB3b3JkIG9uIHN1Y2Nlc3M7ZmxhZyB3b3JkIGlzIGEgMzItYml0IG1hc2sgd29yZCB3aXRoIGVhY2ggYml0IGRlZmluZXMKKyAqIGRpZmZlcmVudCBjYXBhYmlsaXR5IGFzIGRlc2NyaWJlZCBiZWxsb3cuCiAgKiBWYWx1ZSBvZiAxIGZvciBzdXBwb3J0aW5nIHRoaXMgZmVhdHVyZS4gMCBmb3Igbm90IHN1cHBvcnRpbmcgdGhpcyBmZWF0dXJlLgotICogLTEgLSBvbiBmYWlsdXJlIChpZiB0aGUgZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3Igbm90IGEgQnlwYXNzIGRldmljZSkKLSAqIEJpdAlmZWF0dXJlCSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbgotICogCi0gKiAwCUJQX0NBUAkgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSBpcyBCeXBhc3MgY2FwYWJsZSBpbiBnZW5lcmFsCi0gKiAKLSAqIDEJQlBfU1RBVFVTX0NBUAkgICAgICAgIFRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvZiB0aGUgY3VycmVudCBCeXBhc3MgbW9kZQotICogCi0gKiAyCUJQX1NUQVRVU19DSEFOR0VfQ0FQCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvbiBhIGNoYW5nZSB0byBieXBhc3MgbW9kZSBmcm9tIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCB0aW1lIHRoZSBtb2RlIHdhcyBkZWZpbmVkCi0gKiAKLSAqIDMJU1dfQ1RMX0NBUAkgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIFNvZnR3YXJlIGNvbnRyb2xsZWQgY2FwYWJsZSBmb3IgYnlwYXNzL25vbiBieXBhc3MgbW9kZXMuCi0gKiAKLSAqIDQJQlBfRElTX0NBUAkgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGNhcGFibGUgb2YgZGlzYWJsaW5nIHRoZSBCeXBhc3MgbW9kZSBhdCBhbGwgdGltZXMuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgd2lsbCByZXRhaW4gaXRzIG1vZGUgZXZlbiBkdXJpbmcgcG93ZXIgbG9zcyBhbmQgYWxzbyBhZnRlciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXIgcmVjb3ZlcnkuIFRoaXMgd2lsbCBvdmVyY29tZSBvbiBhbnkgYnlwYXNzIG9wZXJhdGlvbiBkdWUgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nIHRpbWVvdXQgb3Igc2V0IGJ5cGFzcyBjb21tYW5kLgotICogCi0gKiA1CUJQX0RJU19TVEFUVVNfQ0FQCSAgICBUaGUgaW50ZXJmYWNlIGNhbiByZXBvcnQgb2YgdGhlIGN1cnJlbnQgRElTX0JQX0NBUAotICogCi0gKiA2CVNURF9OSUNfQ0FQCSAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgY2FwYWJsZSB0byBiZSBjb25maWd1cmVkIHRvIG9wZXJhdGUgYXMgc3RhbmRhcmQsIG5vbiBCeXBhc3MsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUMgaW50ZXJmYWNlIChoYXZlIGRpcmVjdCBjb25uZWN0aW9uIHRvIGludGVyZmFjZXMgYXQgYWxsIHBvd2VyIG1vZGVzKQotICogCi0gKiA3CUJQX1BXT0ZGX05PX0NBUAkgICAgICAgIFRoZSBpbnRlcmZhY2UgY2FuIGJlIGluIEJ5cGFzcyBtb2RlIGF0IHBvd2VyIG9mZiBzdGF0ZQotICogCi0gKiA4CUJQX1BXT0ZGX09GRl9DQVAJICAgIFRoZSBpbnRlcmZhY2UgY2FuIGRpc2Nvbm5lY3QgdGhlIEJ5cGFzcyBtb2RlIGF0IHBvd2VyIG9mZiBzdGF0ZSB3aXRob3V0IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpbmcgYWxsIHRoZSBvdGhlciBzdGF0ZXMgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqIDkJQlBfUFdPRkZfQ1RMX0NBUAkgICAgVGhlIGJlaGF2aW9yIG9mIHRoZSBCeXBhc3MgbW9kZSBhdCBQb3dlci1vZmYgc3RhdGUgY2FuIGJlIGNvbnRyb2xsZWQgYnkgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlIHdpdGhvdXQgZWZmZWN0aW5nIGFueSBvdGhlciBzdGF0ZQotICogCi0gKjEwICAgIEJQX1BXVVBfT05fQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gYmUgaW4gQnlwYXNzIG1vZGUgd2hlbiBwb3dlciBpcyB0dXJuZWQgb24gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnRpbCB0aGUgc3lzdGVtIHRha2UgY29udHJvbCBvZiB0aGUgYnlwYXNzIGZ1bmN0aW9uYWxpdHkpCi0gKiAKLSAqMTEJQlBfUFdVUF9PRkZfQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gZGlzY29ubmVjdCBmcm9tIEJ5cGFzcyBtb2RlIHdoZW4gcG93ZXIgaXMgdHVybmVkIG9uIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW50aWwgdGhlIHN5c3RlbSB0YWtlIGNvbnRyb2wgb2YgdGhlIGJ5cGFzcyBmdW5jdGlvbmFsaXR5KQotICogCi0gKjEyCUJQX1BXVVBfQ1RMX0NBUAkgICAgICAgIFRoZSBiZWhhdmlvciBvZiB0aGUgQnlwYXNzIG1vZGUgYXQgUG93ZXItdXAgY2FuIGJlIGNvbnRyb2xsZWQgYnkgc29mdHdhcmUKLSAqIAotICoxMwlXRF9DVExfQ0FQCSAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaGFzIHdhdGNoZG9nIGNhcGFiaWxpdGllcyB0byB0dXJuIHRvIEJ5cGFzcyBtb2RlIHdoZW4gbm90IHJlc2V0IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGVmaW5lZCBwZXJpb2Qgb2YgdGltZS4KLSAqIAotICoxNAlXRF9TVEFUVVNfQ0FQCSAgICAgICAgVGhlIGludGVyZmFjZSBjYW4gcmVwb3J0IG9uIHRoZSB3YXRjaGRvZyBzdGF0dXMgKEFjdGl2ZS9pbmFjdGl2ZSkKLSAqIAotICoxNQlXRF9USU1FT1VUX0NBUAkgICAgICAgIFRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCB0aGUgdGltZSBsZWZ0IHRpbGwgd2F0Y2hkb2cgdHJpZ2dlcnMgdG8gQnlwYXNzIG1vZGUuCi0gKiAKLSAqMTYtMzEgUkVTRVJWRUQJCisgKiAtMSAtIG9uIGZhaWx1cmUgKGlmIHRoZSBkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBub3QgYQorICogIEJ5cGFzcyBkZXZpY2UpCisgKiBCaXQJZmVhdHVyZQkJCWRlc2NyaXB0aW9uCisgKgorICogMAlCUF9DQVAJCQlUaGUgaW50ZXJmYWNlIGlzIEJ5cGFzcyBjYXBhYmxlIGluIGdlbmVyYWwKKyAqCisgKiAxCUJQX1NUQVRVU19DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvZiB0aGUgY3VycmVudCBCeXBhc3MKKyAqCQkJCW1vZGUKKyAqCisgKiAyCUJQX1NUQVRVU19DSEFOR0VfQ0FQCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvbiBhIGNoYW5nZSB0byBieXBhc3MKKyAqCQkJCW1vZGUgZnJvbSB0aGUgbGFzdCB0aW1lIHRoZSBtb2RlIHdhcyBkZWZpbmVkCisgKgorICogMwlTV19DVExfQ0FQCQlUaGUgaW50ZXJmYWNlIGlzIFNvZnR3YXJlIGNvbnRyb2xsZWQgY2FwYWJsZSBmb3IKKyAqCQkJCWJ5cGFzcy9ub24gYnlwYXNzIG1vZGVzLgorICoKKyAqIDQJQlBfRElTX0NBUAkJVGhlIGludGVyZmFjZSBpcyBjYXBhYmxlIG9mIGRpc2FibGluZyB0aGUgQnlwYXNzCisgKgkJCQltb2RlIGF0IGFsbCB0aW1lcy4gIFRoaXMgbW9kZSB3aWxsIHJldGFpbiBpdHMKKyAqCQkJCW1vZGUgZXZlbiBkdXJpbmcgcG93ZXIgbG9zcyBhbmQgYWxzbyBhZnRlciBwb3dlcgorICoJCQkJcmVjb3ZlcnkuIFRoaXMgd2lsbCBvdmVyY29tZSBvbiBhbnkgYnlwYXNzCisgKgkJCQlvcGVyYXRpb24gZHVlIHRvIHdhdGNoZG9nIHRpbWVvdXQgb3Igc2V0IGJ5cGFzcworICoJCQkJY29tbWFuZC4KKyAqCisgKiA1CUJQX0RJU19TVEFUVVNfQ0FQCVRoZSBpbnRlcmZhY2UgY2FuIHJlcG9ydCBvZiB0aGUgY3VycmVudAorICoJCQkJRElTX0JQX0NBUAorICoKKyAqIDYJU1REX05JQ19DQVAJCVRoZSBpbnRlcmZhY2UgaXMgY2FwYWJsZSB0byBiZSBjb25maWd1cmVkIHRvCisgKgkJCQlvcGVyYXRlIGFzIHN0YW5kYXJkLCBub24gQnlwYXNzLCBOSUMgaW50ZXJmYWNlCisgKgkJCQkoaGF2ZSBkaXJlY3QgY29ubmVjdGlvbiB0byBpbnRlcmZhY2VzIGF0IGFsbAorICoJCQkJcG93ZXIgbW9kZXMpCisgKgorICogNwlCUF9QV09GRl9OT19DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIGJlIGluIEJ5cGFzcyBtb2RlIGF0IHBvd2VyIG9mZgorICoJCQkJc3RhdGUKKyAqCisgKiA4CUJQX1BXT0ZGX09GRl9DQVAJVGhlIGludGVyZmFjZSBjYW4gZGlzY29ubmVjdCB0aGUgQnlwYXNzIG1vZGUgYXQKKyAqCQkJCXBvd2VyIG9mZiBzdGF0ZSB3aXRob3V0IGVmZmVjdGluZyBhbGwgdGhlIG90aGVyCisgKgkJCQlzdGF0ZXMgb2Ygb3BlcmF0aW9uCisgKgorICogOQlCUF9QV09GRl9DVExfQ0FQCVRoZSBiZWhhdmlvciBvZiB0aGUgQnlwYXNzIG1vZGUgYXQgUG93ZXItb2ZmCisgKgkJCQlzdGF0ZSBjYW4gYmUgY29udHJvbGxlZCBieSBzb2Z0d2FyZSB3aXRob3V0CisgKgkJCQllZmZlY3RpbmcgYW55IG90aGVyIHN0YXRlCisgKgorICoxMCAgQlBfUFdVUF9PTl9DQVAJCVRoZSBpbnRlcmZhY2UgY2FuIGJlIGluIEJ5cGFzcyBtb2RlIHdoZW4gcG93ZXIKKyAqCQkJCWlzIHR1cm5lZCBvbiAodW50aWwgdGhlIHN5c3RlbSB0YWtlIGNvbnRyb2wgb2YKKyAqCQkJCXRoZSBieXBhc3MgZnVuY3Rpb25hbGl0eSkKKyAqCisgKjExCUJQX1BXVVBfT0ZGX0NBUAkJVGhlIGludGVyZmFjZSBjYW4gZGlzY29ubmVjdCBmcm9tIEJ5cGFzcyBtb2RlCisgKgkJCQl3aGVuIHBvd2VyIGlzIHR1cm5lZCBvbiAodW50aWwgdGhlIHN5c3RlbSB0YWtlCisgKgkJCQljb250cm9sIG9mIHRoZSBieXBhc3MgZnVuY3Rpb25hbGl0eSkKKyAqCisgKjEyCUJQX1BXVVBfQ1RMX0NBUAkJVGhlIGJlaGF2aW9yIG9mIHRoZSBCeXBhc3MgbW9kZSBhdCBQb3dlci11cCBjYW4KKyAqCQkJCWJlIGNvbnRyb2xsZWQgYnkgc29mdHdhcmUKKyAqCisgKjEzCVdEX0NUTF9DQVAJCVRoZSBpbnRlcmZhY2UgaGFzIHdhdGNoZG9nIGNhcGFiaWxpdGllcyB0byB0dXJuCisgKgkJCQl0byBCeXBhc3MgbW9kZSB3aGVuIG5vdCByZXNldCBmb3IgZGVmaW5lZCBwZXJpb2QKKyAqCQkJCW9mIHRpbWUuCisgKgorICoxNAlXRF9TVEFUVVNfQ0FQCQlUaGUgaW50ZXJmYWNlIGNhbiByZXBvcnQgb24gdGhlIHdhdGNoZG9nIHN0YXR1cworICoJCQkJKEFjdGl2ZS9pbmFjdGl2ZSkKKyAqCisgKjE1CVdEX1RJTUVPVVRfQ0FQCQlUaGUgaW50ZXJmYWNlIGNhbiByZXBvcnQgdGhlIHRpbWUgbGVmdCB0aWxsCisgKgkJCQl3YXRjaGRvZyB0cmlnZ2VycyB0byBCeXBhc3MgbW9kZS4KKyAqCisgKjE2LTMxIFJFU0VSVkVECiAgKgogICogKiovCiBpbnQgZ2V0X2J5cGFzc19jYXBzX3NkKGludCBpZl9pbmRleCk7CkBAIC05NywzNCArMTE0LDM1IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4CiAgKgogICogT3V0cHV0OgotICogCi0gKiBTZXQgb2YgbnVtYmVycyBkZWZpbmluZyB0aGUgdmFyaW91cyBwYXJhbWV0ZXJzIG9mIHRoZSB3YXRjaGRvZyBjYXBhYmxlIAorICoKKyAqIFNldCBvZiBudW1iZXJzIGRlZmluaW5nIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMgb2YgdGhlIHdhdGNoZG9nIGNhcGFibGUKICAqIHRvIGJlIHNldCB0byBhcyBkZXNjcmliZWQgYmVsbG93LgogICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCi0gKiAKKyAqCiAgKiBCaXQJZmVhdHVyZQkgICAgICAgIGRlc2NyaXB0aW9uCi0gKiAKKyAqCiAgKiAwLTMJV0RfTUlOX1RJTUUJICAgIFRoZSBpbnRlcmZhY2UgV0QgbWluaW1hbCB0aW1lIHBlcmlvZCAgaW4gMTAwbVMgdW5pdHMKLSAqIAotICogNAlXRF9TVEVQX1RJTUUJVGhlIHN0ZXBzIG9mIHRoZSBXRCB0aW1lciBpbiAKKyAqCisgKiA0CVdEX1NURVBfVElNRQlUaGUgc3RlcHMgb2YgdGhlIFdEIHRpbWVyIGluCiAgKiAgICAgICAgICAgICAgICAgICAgICAwIC0gZm9yIGxpbmVhciBzdGVwcyAoV0RfTUlOX1RJTUUgKiBYKQotICogICAgICAgICAgICAgICAgICAgICAgMSAtIGZvciBtdWx0aXBseSBieSAyIGZyb20gcHJldmlvdXMgc3RlcCAoV0RfTUlOX1RJTUUgKiAyXlgpCi0gKiAKLSAqIDUtOAlXRF9TVEVQX0NPVU5UCU51bWJlciBvZiBzdGVwcyB0aGUgV0QgdGltZXIgc3VwcG9ydHMgaW4gMl5YIAorICogICAgICAgICAgICAgICAgICAgICAgMSAtIGZvciBtdWx0aXBseSBieSAyIGZyb20gcHJldmlvdXMgc3RlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChXRF9NSU5fVElNRSAqIDJeWCkKKyAqCisgKiA1LTgJV0RfU1RFUF9DT1VOVAlOdW1iZXIgb2Ygc3RlcHMgdGhlIFdEIHRpbWVyIHN1cHBvcnRzIGluIDJeWAogICogICAgICAgICAgICAgICAgICAgICAgKFggYml0IGF2YWlsYWJsZSBmb3IgZGVmaW5pbmcgdGhlIHZhbHVlKQotICogCi0gKiAKLSAqIAorICoKKyAqCisgKgogICoqLwogaW50IGdldF93ZF9zZXRfY2Fwc19zZChpbnQgaWZfaW5kZXgpOwogCiAvKioKICAqIHNldF9ieXBhc3MgLSBzZXQgQnlwYXNzIHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBieXBhc3NfbW9kZTogIGJ5cGFzcyBtb2RlICgxPW9uLCAwPW9mZikgCisgKiBAYnlwYXNzX21vZGU6ICBieXBhc3MgbW9kZSAoMT1vbiwgMD1vZmYpCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF9ieXBhc3Nfc2QoaW50IGlmX2luZGV4LCBpbnQgYnlwYXNzX21vZGUpOwogCkBAIC0xMzMsNyArMTUxLDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9ieXBhc3Nfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtMTQyLDcgKzE2MCw3IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSAob2ZmL29uKSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnlwYXNzX2NoYW5nZV9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0xNTIsOCArMTcwLDggQEAKICAqIEBkaXNfYnlwYXNzOiBkaXNhYmxlIGJ5cGFzcygxPWRpcywgMD1lbikKICAqIE91dHB1dDoKICAqICAwIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2Rpc19ieXBhc3Nfc2QoaW50IGlmX2luZGV4LCBpbnQgZGlzX2J5cGFzcyk7CiAKQEAgLTE2Miw4ICsxODAsOCBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gb24gc3VjY2VzcyAobm9ybWFsIEJ5cGFzcyBtb2RlLyBEaXNhYmxlIGJ5cGFzcykKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgIEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9kaXNfYnlwYXNzX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTE3Miw5ICsxOTAsOSBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBAYnlwYXNzX21vZGU6IGJ5cGFzcyBtb2RlIHNldHRpbmcgYXQgcG93ZXIgb2ZmIHN0YXRlICgxPUJQIGVuLCAwPUJQIERpcykKICAqIE91dHB1dDoKLSAqICAwIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqICAwIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2J5cGFzc19wd29mZl9zZChpbnQgaWZfaW5kZXgsIGludCBieXBhc3NfbW9kZSk7CiAKQEAgLTE4Myw4ICsyMDEsOCBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gb24gc3VjY2VzcyAoRGlzYWJsZSBieXBhc3MgYXQgcG93ZXIgb2ZmIHN0YXRlIC8gbm9ybWFsIEJ5cGFzcyBtb2RlKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2J5cGFzc19wd29mZl9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0xOTMsOSArMjExLDkgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogQGJ5cGFzc19tb2RlOiBieXBhc3MgbW9kZSBzZXR0aW5nIGF0IHBvd2VyIHVwIHN0YXRlICgxPUJQIGVuLCAwPUJQIERpcykKICAqIE91dHB1dDoKLSAqICAwIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqICAwIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2J5cGFzc19wd3VwX3NkKGludCBpZl9pbmRleCwgaW50IGJ5cGFzc19tb2RlKTsKIApAQCAtMjA0LDU5ICsyMjIsNjAgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIG9uIHN1Y2Nlc3MgKERpc2FibGUgYnlwYXNzIGF0IHBvd2VyIHVwIHN0YXRlIC8gbm9ybWFsIEJ5cGFzcyBtb2RlKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2J5cGFzc19wd3VwX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X2J5cGFzc193ZCAtIFNldCB3YXRjaGRvZyBzdGF0ZQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiBAbXNfdGltZW91dDogcmVxdWVzdGVkIHRpbWVvdXQgKGluIG1zIHVuaXRzKSwgMCBmb3IgZGlzYWJsaW5nIHRoZSB3YXRjaGRvZyB0aW1lcgotICogQG1zX3RpbWVvdXRfc2V0KG91dHB1dCk6IHJlcXVlc3RlZCB0aW1lb3V0IChpbiBtcyB1bml0cyksIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgd2F0Y2hkb2cKKyAqIEBtc190aW1lb3V0OiByZXF1ZXN0ZWQgdGltZW91dCAoaW4gbXMgdW5pdHMpLCAwIGZvciBkaXNhYmxpbmcgdGhlIHdhdGNoZG9nCisgKiAgICAgICAgICAgICAgdGltZXIKKyAqIEBtc190aW1lb3V0X3NldChvdXRwdXQpOiByZXF1ZXN0ZWQgdGltZW91dCAoaW4gbXMgdW5pdHMpLCB0aGF0IHRoZSBhZGFwdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgd2F0Y2hkb2cKICAqIE91dHB1dDoKLSAqIDAgIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIDAgIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2J5cGFzc193ZF9zZChpbnQgaWZfaW5kZXgsIGludCBtc190aW1lb3V0LCBpbnQgKm1zX3RpbWVvdXRfc2V0KTsKIAogLyoqCiAgKiBnZXRfYnlwYXNzX3dkIC0gR2V0IHdhdGNoZG9nIHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBtc190aW1lb3V0IChvdXRwdXQpOiBXRFQgdGltZW91dCAoaW4gbXMgdW5pdHMpLCAKKyAqIEBtc190aW1lb3V0IChvdXRwdXQpOiBXRFQgdGltZW91dCAoaW4gbXMgdW5pdHMpLAogICogICAgICAgICAgICAgICAgICAgICAgIC0xIGZvciB1bmtub3duIHdkdCBzdGF0dXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBXRFQgaXMgZGlzYWJsZWQKICAqIE91dHB1dDoKICAqIDAgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2J5cGFzc193ZF9zZChpbnQgaWZfaW5kZXgsIGludCAqbXNfdGltZW91dF9zZXQpOwogCiAvKioKICAqIGdldF93ZF9leHBpcmVfdGltZSAtIEdldCB3YXRjaGRvZyBleHBpcmUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQG1zX3RpbWVfbGVmdCAob3V0cHV0KTogdGltZSBsZWZ0IHRpbGwgd2F0Y2hkb2cgdGltZSBleHBpcmUsIAorICogQG1zX3RpbWVfbGVmdCAob3V0cHV0KTogdGltZSBsZWZ0IHRpbGwgd2F0Y2hkb2cgdGltZSBleHBpcmUsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgLTEgaWYgV0RUIGhhcyBleHBpcmVkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgMCAgaWYgV0RUIGlzIGRpc2FibGVkCiAgKiBPdXRwdXQ6CiAgKiAwICAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0IHN0YXR1cykgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdCBzdGF0dXMpCiAgKiovCiBpbnQgZ2V0X3dkX2V4cGlyZV90aW1lX3NkKGludCBpZl9pbmRleCwgaW50ICptc190aW1lX2xlZnQpOwogCiAvKioKICAqIHJlc2V0X2J5cGFzc193ZF90aW1lciAtIFJlc2V0IHdhdGNoZG9nIHRpbWVyCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIAorICoKICAqIE91dHB1dDoKICAqIDEgIC0gb24gc3VjY2VzcwogICogMCAtIHdhdGNoZG9nIGlzIG5vdCBjb25maWd1cmVkCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdCBzdGF0dXMpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2Ugb3IgdW5rbm93biB3ZHQgc3RhdHVzKQogICoqLwogaW50IHJlc2V0X2J5cGFzc193ZF90aW1lcl9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0yNjQsNTMgKzI4Myw1NCBAQAogICogc2V0X3N0ZF9uaWMgLSBTdGFuZGFyZCBOSUMgbW9kZSBvZiBvcGVyYXRpb24KICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogQG5pY19tb2RlOiAwLzEgKERlZmF1bHQgQnlwYXNzIG1vZGUgLyBTdGFuZGFyZCBOSUMgbW9kZSkKLSAqIAorICoKICAqIE91dHB1dDoKICAqIDAgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X3N0ZF9uaWNfc2QoaW50IGlmX2luZGV4LCBpbnQgbmljX21vZGUpOwogCiAvKioKICAqIGdldF9zdGRfbmljIC0gR2V0IFN0YW5kYXJkIE5JQyBtb2RlIHNldHRpbmcKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogCisgKgogICogT3V0cHV0OgogICogMC8xIChEZWZhdWx0IEJ5cGFzcyBtb2RlIC8gU3RhbmRhcmQgTklDIG1vZGUpIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgIEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF9zdGRfbmljX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgotICogc2V0X3R4IC0gc2V0IHRyYW5zbWl0dGVyIGVuYWJsZS9kaXNhYmxlIAorICogc2V0X3R4IC0gc2V0IHRyYW5zbWl0dGVyIGVuYWJsZS9kaXNhYmxlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIEB0eF9zdGF0ZTogMC8xIChUcmFuc21pdCBEaXNhYmxlIC8gVHJhbnNtaXQgRW5hYmxlKQotICogCisgKgogICogT3V0cHV0OgogICogMCAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uICkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uICkKICAqKi8KIGludCBzZXRfdHhfc2QoaW50IGlmX2luZGV4LCBpbnQgdHhfc3RhdGUpOwogCiAvKioKICAqIGdldF9zdGRfbmljIC0gZ2V0IHRyYW5zbWl0dGVyIHN0YXRlIChkaXNhYmxlIC8gZW5hYmxlKQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiAKKyAqCiAgKiBPdXRwdXQ6CiAgKiAwLzEgKHJhbnNtaXQgRGlzYWJsZSAvIFRyYW5zbWl0IEVuYWJsZSkgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgQnlwYXNzKQogICoqLwogaW50IGdldF90eF9zZChpbnQgaWZfaW5kZXgpOwogCiAvKioKICAqIHNldF90YXAgLSBzZXQgVEFQIHN0YXRlCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEB0YXBfbW9kZTogMSB0YXAgbW9kZSAsIDAgbm9ybWFsIG5pYyBtb2RlIAorICogQHRhcF9tb2RlOiAxIHRhcCBtb2RlICwgMCBub3JtYWwgbmljIG1vZGUKICAqIE91dHB1dDoKICAqICAwIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X3RhcF9zZChpbnQgaWZfaW5kZXgsIGludCB0YXBfbW9kZSk7CiAKQEAgLTMxOSw3ICszMzksNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3RhcF9zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0zMjgsNyArMzQ4LDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF90YXBfY2hhbmdlX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTMzOCw4ICszNTgsOCBAQAogICogQGRpc190YXA6IGRpc2FibGUgdGFwKDE9ZGlzLCAwPWVuKQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3Qgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICBUQVAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfZGlzX3RhcF9zZChpbnQgaWZfaW5kZXgsIGludCBkaXNfdGFwKTsKIApAQCAtMzQ4LDggKzM2OCw4IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSBvbiBzdWNjZXNzIChub3JtYWwgVEFQIG1vZGUvIERpc2FibGUgVEFQKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBUQVAgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2Rpc190YXBfc2QoaW50IGlmX2luZGV4KTsKIApAQCAtMzU4LDkgKzM3OCw5IEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIEBieXBhc3NfbW9kZTogdGFwIG1vZGUgc2V0dGluZyBhdCBwb3dlciB1cCBzdGF0ZSAoMT1UQVAgZW4sIDA9VEFQIERpcykKICAqIE91dHB1dDoKLSAqICAwIC0gb24gc3VjY2VzcyAKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgVEFQIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqICAwIC0gb24gc3VjY2VzcworICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X3RhcF9wd3VwX3NkKGludCBpZl9pbmRleCwgaW50IHRhcF9tb2RlKTsKIApAQCAtMzY5LDE4ICszODksMTggQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIG9uIHN1Y2Nlc3MgKERpc2FibGUgVEFQIGF0IHBvd2VyIHVwIHN0YXRlIC8gbm9ybWFsIFRBUCBtb2RlKQotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBUQVAgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3RhcF9wd3VwX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X2JwX2Rpc2MgLSBzZXQgRGlzY29ubmVjdCBzdGF0ZQogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCi0gKiBAdGFwX21vZGU6IDEgZGlzYyBtb2RlICwgMCBub24tZGlzYyBtb2RlIAorICogQHRhcF9tb2RlOiAxIGRpc2MgbW9kZSAsIDAgbm9uLWRpc2MgbW9kZQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF9icF9kaXNjX3NkKGludCBpZl9pbmRleCwgaW50IGRpc2NfbW9kZSk7CiAKQEAgLTM4OSw3ICs0MDksNyBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBPdXRwdXQ6CiAgKiAgMC8xIC0gKG9mZi9vbikgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBnZXRfYnBfZGlzY19zZChpbnQgaWZfaW5kZXgpOwogCkBAIC0zOTgsNyArNDE4LDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2JwX2Rpc2NfY2hhbmdlX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTQwOCw4ICs0MjgsOCBAQAogICogQGRpc190YXA6IGRpc2FibGUgdGFwKDE9ZGlzLCAwPWVuKQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZnRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZnRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdAorICogICAgICAgICAgICAgICAgICBzdXBwb3J0IERpc2Nvbm5lY3Qgb3IgaXQncyBhIHNsYXZlIGRldmljZSkKICAqKi8KIGludCBzZXRfYnBfZGlzX2Rpc2Nfc2QoaW50IGlmX2luZGV4LCBpbnQgZGlzX2Rpc2MpOwogCkBAIC00MTgsOCArNDM4LDggQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIG9uIHN1Y2Nlc3MgKG5vcm1hbCBEaXNjb25uZWN0IG1vZGUvIERpc2FibGUgRGlzY29ubmVjdCkKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgRGlzY29ubmVjdCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2JwX2Rpc19kaXNjX3NkKGludCBpZl9pbmRleCk7CiAKQEAgLTQyOCw5ICs0NDgsOSBAQAogICogQGlmX2luZGV4OiBuZXR3b3JrIGRldmljZSBpbmRleCBvZiB0aGUgY29udHJvbGxpbmcgZGV2aWNlCiAgKiBAZGlzY19tb2RlOiB0YXAgbW9kZSBzZXR0aW5nIGF0IHBvd2VyIHVwIHN0YXRlICgxPURpc2MgZW4sIDA9RGlzYyBEaXMpCiAgKiBPdXRwdXQ6Ci0gKiAgMCAtIG9uIHN1Y2Nlc3MgCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IERpc2Nvbm5lY3QgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogIDAgLSBvbiBzdWNjZXNzCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBEaXNjb25uZWN0IG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgc2V0X2JwX2Rpc2NfcHd1cF9zZChpbnQgaWZfaW5kZXgsIGludCBkaXNjX21vZGUpOwogCkBAIC00MzgsMTkgKzQ1OCwyMCBAQAogICogZ2V0X2JwX2Rpc2NfcHd1cCAtIEdldCBEaXNjb25uZWN0IG1vZGUgc3RhdGUgYXQgcG93ZXItdXAgc3RhdGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgotICogIDAvMSAtIG9uIHN1Y2Nlc3MgKERpc2FibGUgRGlzY29ubmVjdCBhdCBwb3dlciB1cCBzdGF0ZSAvIG5vcm1hbCBEaXNjb25uZWN0IG1vZGUpCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yZGV2aWNlIG5vdCBzdXBwb3J0IFRBUCAKLSAqICAgICAgICAgICAgICAgICAgb3IgaXQncyBhIHNsYXZlIGRldmljZSkgCisgKiAgMC8xIC0gb24gc3VjY2VzcyAoRGlzYWJsZSBEaXNjb25uZWN0IGF0IHBvd2VyIHVwIHN0YXRlIC8gbm9ybWFsIERpc2Nvbm5lY3QKKyAqICAgICAgICAgICAgICAgICAgICBtb2RlKQorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvciBkZXZpY2Ugbm90CisgKiAgICAgICAgICAgICAgICAgIHN1cHBvcnQgVEFQIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X2JwX2Rpc2NfcHd1cF9zZChpbnQgaWZfaW5kZXgpOwogCiAvKioKICAqIHNldF93ZF9leHBfbW9kZSAtIFNldCBhZGFwdGVyIHN0YXRlIHdoZW4gV0RUIGV4cGlyZWQuCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkgCisgKiBAYnlwYXNzX21vZGU6ICBhZGFwdGVyIG1vZGUgKDE9dGFwIG1vZGUsIDA9YnlwYXNzIG1vZGUpCiAgKiBPdXRwdXQ6CiAgKiAgMCAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IHNldF93ZF9leHBfbW9kZV9zZChpbnQgaWZfaW5kZXgsIGludCBieXBhc3NfbW9kZSk7CiAKQEAgLTQ1OSwzOSArNDgwLDQxIEBACiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKICAqIE91dHB1dDoKICAqICAwLzEgLSAoYnlwYXNzL3RhcCkgb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2UpCiAgKiovCiBpbnQgZ2V0X3dkX2V4cF9tb2RlX3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X3dkX2F1dG9yZXNldCAtIHJlc2V0IFdEVCBwZXJpb2RpY2FsbHkuCiAgKiBAaWZfaW5kZXg6IG5ldHdvcmsgZGV2aWNlIGluZGV4IG9mIHRoZSBjb250cm9sbGluZyBkZXZpY2UKLSAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkgCisgKiBAYnlwYXNzX21vZGU6ICBhZGFwdGVyIG1vZGUgKDE9dGFwIG1vZGUsIDA9YnlwYXNzIG1vZGUpCiAgKiBPdXRwdXQ6CiAgKiAxICAtIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3JkZXZpY2Ugbm90IHN1cHBvcnQgQnlwYXNzIAotICogICAgICAgICAgICAgICAgICBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0IHN0YXR1cykgCisgKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBpcyBub3QgY2FwYWJsZSBvZiB0aGUgb3BlcmF0aW9uIG9yIGRldmljZSBub3QKKyAqICAgICAgICAgICAgICAgICAgc3VwcG9ydCBCeXBhc3Mgb3IgaXQncyBhIHNsYXZlIGRldmljZSBvciB1bmtub3duIHdkdAorICogICAgICAgICAgICAgICAgICBzdGF0dXMpCiAgKiovCiBpbnQgc2V0X3dkX2F1dG9yZXNldF9zZChpbnQgaWZfaW5kZXgsIGludCB0aW1lKTsKIAogLyoqCiAgKiBzZXRfd2RfYXV0b3Jlc2V0IC0gcmVzZXQgV0RUIHBlcmlvZGljYWxseS4KICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQGJ5cGFzc19tb2RlOiAgYWRhcHRlciBtb2RlICgxPXRhcCBtb2RlLCAwPWJ5cGFzcyBtb2RlKSAKKyAqIEBieXBhc3NfbW9kZTogIGFkYXB0ZXIgbW9kZSAoMT10YXAgbW9kZSwgMD1ieXBhc3MgbW9kZSkKICAqIE91dHB1dDoKICAqIDEgIC0gb24gc3VjY2VzcwotICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2UgaXMgbm90IGNhcGFibGUgb2YgdGhlIG9wZXJhdGlvbiBvcmRldmljZSBub3Qgc3VwcG9ydCBCeXBhc3MgCi0gKiAgICAgICAgICAgICAgICAgIG9yIGl0J3MgYSBzbGF2ZSBkZXZpY2Ugb3IgdW5rbm93biB3ZHQgc3RhdHVzKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIGlzIG5vdCBjYXBhYmxlIG9mIHRoZSBvcGVyYXRpb24gb3IgZGV2aWNlIG5vdAorICogICAgICAgICAgICAgICAgICBzdXBwb3J0IEJ5cGFzcyBvciBpdCdzIGEgc2xhdmUgZGV2aWNlIG9yIHVua25vd24gd2R0CisgKiAgICAgICAgICAgICAgICAgIHN0YXR1cykKICAqKi8KIGludCBnZXRfd2RfYXV0b3Jlc2V0X3NkKGludCBpZl9pbmRleCk7CiAKIC8qKgogICogc2V0X3RwbCAtIHNldCBUUEwgc3RhdGUKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQotICogQHRwbF9tb2RlOiAxIHRwbCBtb2RlICwgMCBub3JtYWwgbmljIG1vZGUgCisgKiBAdHBsX21vZGU6IDEgdHBsIG1vZGUgLCAwIG5vcm1hbCBuaWMgbW9kZQogICogT3V0cHV0OgogICogIDAgLSBvbiBzdWNjZXNzCi0gKiAtMSAtIG9uIGZhaWx1cmUgKGRldmljZSBub3Qgc3VwcG9ydCBUUEwpIAorICogLTEgLSBvbiBmYWlsdXJlIChkZXZpY2Ugbm90IHN1cHBvcnQgVFBMKQogICoqLwogaW50IHNldF90cGxfc2QoaW50IGlmX2luZGV4LCBpbnQgdHBsX21vZGUpOwogCkBAIC01MDAsNyArNTIzLDcgQEAKICAqIEBpZl9pbmRleDogbmV0d29yayBkZXZpY2UgaW5kZXggb2YgdGhlIGNvbnRyb2xsaW5nIGRldmljZQogICogT3V0cHV0OgogICogIDAvMSAtIChvZmYvb24pIG9uIHN1Y2Nlc3MKLSAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRQTCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKSAKKyAqIC0xIC0gb24gZmFpbHVyZSAoZGV2aWNlIG5vdCBzdXBwb3J0IFRQTCBvciBpdCdzIGEgc2xhdmUgZGV2aWNlKQogICoqLwogaW50IGdldF90cGxfc2QoaW50IGlmX2luZGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvUkVBRE1FCmluZGV4IDUzMDUyYzQuLjRmYTUwZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9SRUFETUUKQEAgLTUsNDMgKzUsMyBAQAogCUthbGFoYXJpIGNhcmRzIChkdWFsIGFuZCBxdWFkIHBvcnQgUENJLWUgR2lnYWJpdCkgY29wcGVyIGFuZCBmaWJlcgogCiBUaGUgZHJpdmVyIHdhcyBhY3R1YWxseSB0ZXN0ZWQgb24gT2FzaXMgYW5kIEthbGFoYXJpIGNhcmRzLgotCi1UT0RPOgotCS0gbW92ZSBmaXJtd2FyZSBsb2FkaW5nIHRvIHJlcXVlc3RfZmlybXdhcmUoKQotCS0gcmVtb3ZlIGRpcmVjdCBtZW1vcnkgYWNjZXNzIG9mIHN0cnVjdHVyZXMKLQktIGFueSByZW1haW5pbmcgc3BhcnNlIGFuZCBjaGVja3BhdGNoLnBsIHdhcm5pbmdzCi0KLQktIHVzZSBuZXRfZGV2aWNlX29wcwotCS0gdXNlIGRldi0+c3RhdHMgcmF0aGVyIHRoYW4gYWRhcHRlci0+c3RhdHMKLQktIGRvbid0IGNhc3QgbmV0ZGV2X3ByaXYgaXQgaXMgYWxyZWFkeSB2b2lkCi0JLSBHRVQgUklEIE9GIE1BQ1JPUwotCS0gd29yayBvbiBhbGwgYXJjaGl0ZWN0dXJlcwotCSAgIC0gd2l0aG91dCBDT05GSUdfWDg2XzY0IGNvbmZ1c2lvbgotCSAgIC0gZG8gNjQgYml0IGNvcnJlY3RseQotCSAgIC0gZG9uJ3QgZGVwZW5kIG9uIG9yZGVyIG9mIHVuaW9uCi0JLSBnZXQgcmlkIG9mIEFTU0VSVCgpLCB1c2UgQlVHKCkgaW5zdGVhZCBidXQgb25seSB3aGVyZSBuZWNlc3NhcnkKLQkgIGxvb2tzIGxpa2UgbW9zdCBhcmVuJ3QgcmVhbGx5IHVzZWZ1bAotCS0gbm8gbmV3IFNJT0NERVZQUklWQVRFIGlvY3RsIGFsbG93ZWQKLQktIGRvbid0IHVzZSBtb2R1bGVfcGFyYW0gZm9yIGNvbmZpZ3VyaW5nIGludGVycnVwdCBtaXRpZ2F0aW9uCi0JICB1c2UgZXRodG9vbCBpbnN0ZWFkCi0JLSByZW9yZGVyIGNvZGUgdG8gZWxtaW5hdGUgdXNlIG9mIGZvcndhcmQgZGVjbGFyYXRpb25zCi0JLSBkb24ndCBrZWVwIHByaXZhdGUgbGlua2VkIGxpc3Qgb2YgZHJpdmVycy4KLQktIHJlbW92ZSBhbGwgdGhlIGdyYXRpdXRvdXMgZGVidWcgaW5mcmFzdHJ1Y3R1cmUKLQktIHVzZSBQQ0lfREVWSUNFKCkKLQktIGRvIGV0aHRvb2wgY29ycmVjdGx5IHVzaW5nIGV0aHRvb2xfb3BzCi0JLSBOQVBJPwotCS0gd2FzdGVkIG92ZXJoZWFkIG9mIGV4dHJhIHN0YXRzCi0JLSBzdGF0ZSB2YXJpYWJsZXMgZm9yIHRoaW5ncyB0aGF0IGFyZQotCSAgZWFzaWx5IGF2YWlsYWJsZSBhbmQgc2hvdWxkbid0IGJlIGtlcHQgaW4gY2FyZCBzdHJ1Y3R1cmUsIGNhcmRudW0sIC4uLgotCSAgc2xvdG51bWJlciwgZXZlbnRzLCAuLi4KLQktIGdldCByaWQgb2Ygc2xpY19zcGlubG9jayB3cmFwcGVyCi0JLSB2b2xhdGlsZSA9PSBiYWQgZGVzaWduID0+IGJhZCBjb2RlCi0JLSBsb2NraW5nIHRvbyBmaW5lIGdyYWluZWQsIG5vdCBkZXNpZ25lZCBqdXN0IHRocm93IG1vcmUgbG9ja3MKLQkgIGF0IHByb2JsZW0KLQotCi1QbGVhc2Ugc2VuZCBwYXRjaGVzIHRvOgotICAgICAgICBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPgotYW5kIENjOiBMaW9yIERvdGFuIDxsaW9kb3RAZ21haWwuY29tPiBhbmQgQ2hyaXN0b3BoZXIgSGFycmVyCi08Y2hhcnJlckBhbGFjcml0ZWNoLmNvbT4gYXMgd2VsbCBhcyB0aGV5IGFyZSBhbHNvIGFibGUgdG8gdGVzdCBvdXQgYW55Ci1jaGFuZ2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3MvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmZjEwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL1RPRE8KQEAgLTAsMCArMSwzOCBAQAorVE9ETzoKKwktIG1vdmUgZmlybXdhcmUgbG9hZGluZyB0byByZXF1ZXN0X2Zpcm13YXJlKCkKKwktIHJlbW92ZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBvZiBzdHJ1Y3R1cmVzCisJLSBhbnkgcmVtYWluaW5nIHNwYXJzZSBhbmQgY2hlY2twYXRjaC5wbCB3YXJuaW5ncworCisJLSB1c2UgbmV0X2RldmljZV9vcHMKKwktIHVzZSBkZXYtPnN0YXRzIHJhdGhlciB0aGFuIGFkYXB0ZXItPnN0YXRzCisJLSBkb24ndCBjYXN0IG5ldGRldl9wcml2IGl0IGlzIGFscmVhZHkgdm9pZAorCS0gR0VUIFJJRCBPRiBNQUNST1MKKwktIHdvcmsgb24gYWxsIGFyY2hpdGVjdHVyZXMKKwkgICAtIHdpdGhvdXQgQ09ORklHX1g4Nl82NCBjb25mdXNpb24KKwkgICAtIGRvIDY0IGJpdCBjb3JyZWN0bHkKKwkgICAtIGRvbid0IGRlcGVuZCBvbiBvcmRlciBvZiB1bmlvbgorCS0gZ2V0IHJpZCBvZiBBU1NFUlQoKSwgdXNlIEJVRygpIGluc3RlYWQgYnV0IG9ubHkgd2hlcmUgbmVjZXNzYXJ5CisJICBsb29rcyBsaWtlIG1vc3QgYXJlbid0IHJlYWxseSB1c2VmdWwKKwktIG5vIG5ldyBTSU9DREVWUFJJVkFURSBpb2N0bCBhbGxvd2VkCisJLSBkb24ndCB1c2UgbW9kdWxlX3BhcmFtIGZvciBjb25maWd1cmluZyBpbnRlcnJ1cHQgbWl0aWdhdGlvbgorCSAgdXNlIGV0aHRvb2wgaW5zdGVhZAorCS0gcmVvcmRlciBjb2RlIHRvIGVsbWluYXRlIHVzZSBvZiBmb3J3YXJkIGRlY2xhcmF0aW9ucworCS0gZG9uJ3Qga2VlcCBwcml2YXRlIGxpbmtlZCBsaXN0IG9mIGRyaXZlcnMuCisJLSByZW1vdmUgYWxsIHRoZSBncmF0aXV0b3VzIGRlYnVnIGluZnJhc3RydWN0dXJlCisJLSB1c2UgUENJX0RFVklDRSgpCisJLSBkbyBldGh0b29sIGNvcnJlY3RseSB1c2luZyBldGh0b29sX29wcworCS0gTkFQST8KKwktIHdhc3RlZCBvdmVyaGVhZCBvZiBleHRyYSBzdGF0cworCS0gc3RhdGUgdmFyaWFibGVzIGZvciB0aGluZ3MgdGhhdCBhcmUKKwkgIGVhc2lseSBhdmFpbGFibGUgYW5kIHNob3VsZG4ndCBiZSBrZXB0IGluIGNhcmQgc3RydWN0dXJlLCBjYXJkbnVtLCAuLi4KKwkgIHNsb3RudW1iZXIsIGV2ZW50cywgLi4uCisJLSBnZXQgcmlkIG9mIHNsaWNfc3BpbmxvY2sgd3JhcHBlcgorCS0gdm9sYXRpbGUgPT0gYmFkIGRlc2lnbiA9PiBiYWQgY29kZQorCS0gbG9ja2luZyB0b28gZmluZSBncmFpbmVkLCBub3QgZGVzaWduZWQganVzdCB0aHJvdyBtb3JlIGxvY2tzCisJICBhdCBwcm9ibGVtCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG86CisgICAgICAgIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+CithbmQgQ2M6IExpb3IgRG90YW4gPGxpb2RvdEBnbWFpbC5jb20+IGFuZCBDaHJpc3RvcGhlciBIYXJyZXIKKzxjaGFycmVyQGFsYWNyaXRlY2guY29tPiBhcyB3ZWxsIGFzIHRoZXkgYXJlIGFsc28gYWJsZSB0byB0ZXN0IG91dCBhbnkKK2NoYW5nZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmggYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKaW5kZXggNGM3ODIyYi4uNzAyOTAyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaApAQCAtNDY0LDkgKzQ2NCwxMiBAQAogCS8qCiAJKiAgU0xJQyBIYW5kbGVzCiAJKi8KLQlzdHJ1Y3Qgc2xpY19oYW5kbGUgc2xpY19oYW5kbGVzW1NMSUNfQ01EUV9NQVhDTURTKzFdOyAvKiBPYmplY3QgaGFuZGxlcyovCi0Jc3RydWN0IHNsaWNfaGFuZGxlICpwZnJlZV9zbGljX2hhbmRsZXM7ICAgICAgICAgIC8qIEZyZWUgb2JqZWN0IGhhbmRsZXMqLwotCXN0cnVjdCBzbGljX3NwaW5sb2NrICAgICBoYW5kbGVfbG9jazsgICAgICAgICAgIC8qIE9iamVjdCBoYW5kbGUgbGlzdCBsb2NrKi8KKwkvKiBPYmplY3QgaGFuZGxlcyovCisJc3RydWN0IHNsaWNfaGFuZGxlIHNsaWNfaGFuZGxlc1tTTElDX0NNRFFfTUFYQ01EUysxXTsKKwkvKiBGcmVlIG9iamVjdCBoYW5kbGVzKi8KKwlzdHJ1Y3Qgc2xpY19oYW5kbGUgKnBmcmVlX3NsaWNfaGFuZGxlczsKKwkvKiBPYmplY3QgaGFuZGxlIGxpc3QgbG9jayovCisJc3RydWN0IHNsaWNfc3BpbmxvY2sgICAgIGhhbmRsZV9sb2NrOwogCXVzaG9ydCAgICAgICAgICAgICAgc2xpY19oYW5kbGVfaXg7CiAKIAl1MzIgICAgICAgICAgICAgeG1pdHFfZnVsbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwppbmRleCAxNDI2Y2E0Li5lMjdiODhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCkBAIC0xMDAsMTEgKzEwMCwxMSBAQAogI2luY2x1ZGUgInNsaWMuaCIKIAogc3RhdGljIHVpbnQgc2xpY19maXJzdF9pbml0ID0gMTsKLXN0YXRpYyBjaGFyICpzbGljX2Jhbm5lciA9ICJBbGFjcml0ZWNoIFNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyICJcCitzdGF0aWMgY2hhciAqc2xpY19iYW5uZXIgPSAiQWxhY3JpdGVjaCBTTElDIFRlY2hub2xvZ3kodG0pIFNlcnZlciAiCiAJCSJhbmQgU3RvcmFnZSBBY2NlbGVyYXRvciAoTm9uLUFjY2VsZXJhdGVkKSI7CiAKIHN0YXRpYyBjaGFyICpzbGljX3Byb2NfdmVyc2lvbiA9ICIyLjAuMzUxICAyMDA2LzA3LzE0IDEyOjI2OjAwIjsKLXN0YXRpYyBjaGFyICpzbGljX3Byb2R1Y3RfbmFtZSA9ICJTTElDIFRlY2hub2xvZ3kodG0pIFNlcnZlciAiXAorc3RhdGljIGNoYXIgKnNsaWNfcHJvZHVjdF9uYW1lID0gIlNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyICIKIAkJImFuZCBTdG9yYWdlIEFjY2VsZXJhdG9yIChOb24tQWNjZWxlcmF0ZWQpIjsKIHN0YXRpYyBjaGFyICpzbGljX3ZlbmRvciA9ICJBbGFjcml0ZWNoLCBJbmMuIjsKIApAQCAtMTQ0LDI5ICsxNDQsNiBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2xpY19wY2lfdGJsKTsKIAotI2RlZmluZSBTTElDX0dFVF9TTElDX0hBTkRMRShfYWRhcHRlciwgX3BzbGljX2hhbmRsZSkgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fbG9ja19pcnFzYXZlKCZfYWRhcHRlci0+aGFuZGxlX2xvY2subG9jaywgICAgICAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi0JX3BzbGljX2hhbmRsZSAgPSAgX2FkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlczsgICAgICAgICAgICAgICAgIFwKLQlpZiAoX3BzbGljX2hhbmRsZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlfYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzID0gX3BzbGljX2hhbmRsZS0+bmV4dDsgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9hZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrLCAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgU0xJQ19GUkVFX1NMSUNfSEFORExFKF9hZGFwdGVyLCBfcHNsaWNfaGFuZGxlKSAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfcHNsaWNfaGFuZGxlLT50eXBlID0gU0xJQ19IQU5ETEVfRlJFRTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fbG9ja19pcnFzYXZlKCZfYWRhcHRlci0+aGFuZGxlX2xvY2subG9jaywgICAgICAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi0JX3BzbGljX2hhbmRsZS0+bmV4dCA9IF9hZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXM7ICAgICAgICAgICAgIFwKLQlfYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzID0gX3BzbGljX2hhbmRsZTsgICAgICAgICAgICAgICAgICAgXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9hZGFwdGVyLT5oYW5kbGVfbG9jay5sb2NrLCAgICAgICAgICAgICBcCi0JCQlfYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbGljX3JlZzMyX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgdmFsdWUsIGJvb2wgZmx1c2gpCiB7CiAJd3JpdGVsKHZhbHVlLCByZWcpOwpAQCAtMTQ0Miw3ICsxNDE5LDEzIEBACiAJd2hpbGUgKChjbWRjbnQgPCBTTElDX0NNRFFfQ01EU0lOUEFHRSkgJiYKIAkgICAgICAgKGFkYXB0ZXItPnNsaWNfaGFuZGxlX2l4IDwgMjU2KSkgewogCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFNMSUNfSEFORExFIGZvciB0aGlzIGNvbW1hbmQgKi8KLQkJU0xJQ19HRVRfU0xJQ19IQU5ETEUoYWRhcHRlciwgcHNsaWNfaGFuZGxlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmhhbmRsZV9sb2NrLmxvY2ssCisJCQkJYWRhcHRlci0+aGFuZGxlX2xvY2suZmxhZ3MpOworCQlwc2xpY19oYW5kbGUgID0gIGFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlczsKKwkJaWYgKHBzbGljX2hhbmRsZSkKKwkJCWFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlcyA9IHBzbGljX2hhbmRsZS0+bmV4dDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aGFuZGxlX2xvY2subG9jaywKKwkJCQlhZGFwdGVyLT5oYW5kbGVfbG9jay5mbGFncyk7CiAJCXBzbGljX2hhbmRsZS0+dHlwZSA9IFNMSUNfSEFORExFX0NNRDsKIAkJcHNsaWNfaGFuZGxlLT5hZGRyZXNzID0gKHZvaWQgKikgY21kOwogCQlwc2xpY19oYW5kbGUtPm9mZnNldCA9ICh1c2hvcnQpIGFkYXB0ZXItPnNsaWNfaGFuZGxlX2l4Kys7CkBAIC0xODMwLDcgKzE4MTMsNyBAQAogI2VuZGlmCiAKIAlzZXFfcHJpbnRmKHNlcSwgImRyaXZlcl92ZXJzaW9uICAgICAgICAgICA6ICVzXG4iLCBzbGljX3Byb2NfdmVyc2lvbik7Ci0Jc2VxX3B1dHMoc2VxLCAiTWljcm9jb2RlIHZlcnNpb25zOiAgICAgICAgICAgXG4iKTsKKwlzZXFfcHV0cyhzZXEsICJNaWNyb2NvZGUgdmVyc2lvbnM6XG4iKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgICBHaWdhYml0IChnYikgICAgICAgICA6ICVzICVzXG4iLAogCQkgICAgTU9KQVZFX1VDT0RFX1ZFUlNfU1RSSU5HLCBNT0pBVkVfVUNPREVfVkVSU19EQVRFKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgICBHaWdhYml0IFJlY2VpdmVyICAgICA6ICVzICVzXG4iLApAQCAtMTkxNywxNiArMTkwMCwxNCBAQAogCiAJCQlpZiAoY29uZmlnLT5PRU1GcnVGb3JtYXQgPT0gVkVORE9SNF9GUlVfRk9STUFUKSB7CiAJCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJCSAgICAiU2VyaWFsICAgIyAgICAgICAgICAgICAgIDogIgotCQkJCQkgICAgIiVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCQkJICAgICJTZXJpYWwgICAjICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJCSAgICBmcnVbOF0sIGZydVs5XSwgZnJ1WzEwXSwKIAkJCQkJICAgIGZydVsxMV0sIGZydVsxMl0sIGZydVsxM10sCiAJCQkJCSAgICBmcnVbMTZdLCBmcnVbMTddLCBmcnVbMThdLAogCQkJCQkgICAgZnJ1WzE5XSwgZnJ1WzIwXSwgZnJ1WzIxXSk7CiAJCQl9IGVsc2UgewogCQkJCXNlcV9wcmludGYoc2VxLAotCQkJCQkgICAgIlNlcmlhbCAgICMgICAgICAgICAgICAgICA6ICIKLQkJCQkJICAgICIlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJCQkgICAgIlNlcmlhbCAgICMgICAgICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJCSAgICBmcnVbOF0sIGZydVs5XSwgZnJ1WzEwXSwKIAkJCQkJICAgIGZydVsxMV0sIGZydVsxMl0sIGZydVsxM10sCiAJCQkJCSAgICBmcnVbMTRdLCBmcnVbMTVdLCBmcnVbMTZdLApAQCAtMTk3NCw4ICsxOTU1LDcgQEAKIAkJewogCQkJc2VxX3B1dHMoc2VxLCAiRlJVIEluZm9ybWF0aW9uOlxuIik7CiAJCQlzZXFfcHJpbnRmKHNlcSwKLQkJCQkgICAgIiAgICBQYXJ0ICAgICAjICAgICAgICAgICA6ICIKLQkJCQkgICAgIiVjJWMlYyVjJWMlYyVjJWNcbiIsCisJCQkJICAgICIgICAgUGFydCAgICAgIyAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjXG4iLAogCQkJCSAgICBvZW1mcnVbMF0sIG9lbWZydVsxXSwgb2VtZnJ1WzJdLAogCQkJCSAgICBvZW1mcnVbM10sIG9lbWZydVs0XSwgb2VtZnJ1WzVdLAogCQkJCSAgICBvZW1mcnVbNl0sIG9lbWZydVs3XSk7CkBAIC0yMDAyLDIwICsxOTgyLDE3IEBACiAJCXsKIAkJCXNlcV9wdXRzKHNlcSwgIkZSVSBJbmZvcm1hdGlvbjpcbiIpOwogCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJICAgICIgICAgRlJVIE51bWJlciAgICAgICAgICAgOiAiCi0JCQkJICAgICIlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkJCSAgICAiICAgIEZSVSBOdW1iZXIgICAgICAgICAgIDogJWMlYyVjJWMlYyVjJWMlY1xuIiwKIAkJCQkgICAgb2VtZnJ1WzBdLCBvZW1mcnVbMV0sIG9lbWZydVsyXSwKIAkJCQkgICAgb2VtZnJ1WzNdLCBvZW1mcnVbNF0sIG9lbWZydVs1XSwKIAkJCQkgICAgb2VtZnJ1WzZdLCBvZW1mcnVbN10pOwogCQkJc2VxX3NwcmludGYoc2VxLAotCQkJCSAgICAiICAgIFBhcnQgTnVtYmVyICAgICAgICAgIDogIgotCQkJCSAgICAiJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCQkgICAgIiAgICBQYXJ0IE51bWJlciAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJICAgIG9lbWZydVs4XSwgb2VtZnJ1WzldLCBvZW1mcnVbMTBdLAogCQkJCSAgICBvZW1mcnVbMTFdLCBvZW1mcnVbMTJdLCBvZW1mcnVbMTNdLAogCQkJCSAgICBvZW1mcnVbMTRdLCBvZW1mcnVbMTVdKTsKIAkJCXNlcV9wcmludGYoc2VxLAotCQkJCSAgICAiICAgIEVDIExldmVsICAgICAgICAgICAgIDogIgotCQkJCSAgICAiJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwkJCQkgICAgIiAgICBFQyBMZXZlbCAgICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWNcbiIsCiAJCQkJICAgIG9lbWZydVsxNl0sIG9lbWZydVsxN10sIG9lbWZydVsxOF0sCiAJCQkJICAgIG9lbWZydVsxOV0sIG9lbWZydVsyMF0sIG9lbWZydVsyMV0sCiAJCQkJICAgIG9lbWZydVsyMl0sIG9lbWZydVsyM10pOwpAQCAtMjQxMiw4ICsyMzg5LDcgQEAKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBYTUlUX0ZBSUxfTElOS19TVEFURToKIAkJCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAotCQkJCSJyZWplY3QgeG1pdCBza2JbJXA6ICV4XSBsaW5rc3RhdGVbJXNdICIKLQkJCQkiYWRhcHRlclslczolZF0gY2FyZFslczolZF1cbiIsCisJCQkJInJlamVjdCB4bWl0IHNrYlslcDogJXhdIGxpbmtzdGF0ZVslc10gYWRhcHRlclslczolZF0gY2FyZFslczolZF1cbiIsCiAJCQkJc2tiLCBza2ItPnBrdF90eXBlLAogCQkJCVNMSUNfTElOS1NUQVRFKGFkYXB0ZXItPmxpbmtzdGF0ZSksCiAJCQkJU0xJQ19BREFQVEVSX1NUQVRFKGFkYXB0ZXItPnN0YXRlKSwKQEAgLTI0MjgsOCArMjQwNCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBYTUlUX0ZBSUxfSE9TVENNRF9GQUlMOgogCQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCi0JCQkJInhtaXRfc3RhcnQgc2tiWyVwXSB0eXBlWyV4XSBObyBob3N0IGNvbW1hbmRzICIKLQkJCQkiYXZhaWxhYmxlXG4iLCBza2IsIHNrYi0+cGt0X3R5cGUpOworCQkJCSJ4bWl0X3N0YXJ0IHNrYlslcF0gdHlwZVsleF0gTm8gaG9zdCBjb21tYW5kcyBhdmFpbGFibGVcbiIsIHNrYiwgc2tiLT5wa3RfdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI2NDIsOCArMjYxNyw3IEBACiAJCQkJfQogCQkJfSBlbHNlIGlmIChpc3IgJiBJU1JfWERST1ApIHsKIAkJCQlkZXZfZXJyKCZkZXYtPmRldiwKLQkJCQkJCSJpc3IgJiBJU1JfRVJSIFsleF0gIgotCQkJCQkJIklTUl9YRFJPUCBcbiIsIGlzcik7CisJCQkJCQkiaXNyICYgSVNSX0VSUiBbJXhdIElTUl9YRFJPUFxuIiwgaXNyKTsKIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2VycigmZGV2LT5kZXYsCiAJCQkJCQkiaXNyICYgSVNSX0VSUiBbJXhdXG4iLApAQCAtMjk3MCw3ICsyOTQ0LDcgQEAKIHsKIAlpZiAoY2FyZC0+bG9hZHRpbWVyc2V0KSB7CiAJCWNhcmQtPmxvYWR0aW1lcnNldCA9IDA7Ci0JCWRlbF90aW1lcigmY2FyZC0+bG9hZHRpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPmxvYWR0aW1lcik7CiAJfQogCiAJc2xpY19kZWJ1Z19jYXJkX2Rlc3Ryb3koY2FyZCk7CkBAIC0zMjY5LDggKzMyNDMsNyBAQAogCiAJCWlmICghcGVlcHJvbSkgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCi0JCQkJImVlcHJvbSByZWFkIGZhaWxlZCB0byBnZXQgbWVtb3J5ICIKLQkJCQkiYnVzICVkIHNsb3QgJWRcbiIsIGFkYXB0ZXItPmJ1c251bWJlciwKKwkJCQkiZWVwcm9tIHJlYWQgZmFpbGVkIHRvIGdldCBtZW1vcnkgYnVzICVkIHNsb3QgJWRcbiIsIGFkYXB0ZXItPmJ1c251bWJlciwKIAkJCQlhZGFwdGVyLT5zbG90bnVtYmVyKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9IGVsc2UgewpAQCAtMzcwMyw3ICszNjc2LDcgQEAKIAllcnIgPSBzbGljX2NhcmRfbG9jYXRlKGFkYXB0ZXIpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJjYW5ub3QgbG9jYXRlIGNhcmRcbiIpOwotCQlnb3RvIGVycl9vdXRfZnJlZV9tbWlvX3JlZ2lvbjsKKwkJZ290byBlcnJfb3V0X3VubWFwOwogCX0KIAogCWNhcmQgPSBhZGFwdGVyLT5jYXJkOwpAQCAtMzc0Myw4ICszNzE2LDYgQEAKIAogZXJyX291dF91bm1hcDoKIAlpb3VubWFwKG1lbW1hcHBlZF9pb2FkZHIpOwotZXJyX291dF9mcmVlX21taW9fcmVnaW9uOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CiBlcnJfb3V0X2ZyZWVfbmV0ZGV2OgogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiBlcnJfb3V0X2V4aXRfc2xpY19wcm9iZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjkyMmFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1jb25maWcgRkJfU003WFgKLQl0cmlzdGF0ZSAiU2lsaWNvbiBNb3Rpb24gU003WFggZnJhbWVidWZmZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEZCICYmIFBDSQotCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKLQlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCi0Jc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKLQloZWxwCi0JICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciB0aGUgU2lsaWNvbiBNb3Rpb24gU003MTAsIFNNNzEyLCBTTTcyMQotCSAgYW5kIFNNNzIyIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgc203eHhmYi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0KLQkgIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNDcxY2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vYmotJChDT05GSUdfRkJfU003WFgpICs9IHNtN3h4ZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2VhZDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVE9ETzoKLS0gRHVhbCBoZWFkIHN1cHBvcnQKLS0gMkQgYWNjZWxlcmF0aW9uIHN1cHBvcnQKLS0gdXNlIGtlcm5lbCBjb2Rpbmcgc3R5bGUKLS0gcmVmaW5lIHRoZSBjb2RlIGFuZCByZW1vdmUgdW51c2VkIGNvZGUKLS0gbW92ZSBpdCB0byBkcml2ZXJzL3ZpZGVvL3NtN3h4ZmIuYwotCi1QbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQKLVRlZGR5IFdhbmcgPHRlZGR5LndhbmdAc2lsaWNvbm1vdGlvbi5jb20uY24+LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHguaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTk4NjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHguaAorKysgL2Rldi9udWxsCkBAIC0xLDc3OSArMCwwIEBACi0vKgotICogU2lsaWNvbiBNb3Rpb24gU003MTIgZnJhbWUgYnVmZmVyIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBTaWxpY29uIE1vdGlvbiBUZWNobm9sb2d5IENvcnAuCi0gKiBBdXRob3JzOglHZSBXYW5nLCBnZXdhbmdAc2lsaWNvbm1vdGlvbi5jb20KLSAqCQlCb3lvZCBib3lvZC55YW5nQHNpbGljb25tb3Rpb24uY29tLmNuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IExlbW90ZSwgSW5jLgotICogQXV0aG9yOiBXdSBaaGFuZ2ppbiwgd3V6aGFuZ2ppbkBnbWFpbC5jb20KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jZGVmaW5lIE5SX1BBTEVUVEUgICAgICAgIDI1NgotCi0jZGVmaW5lIEZCX0FDQ0VMX1NNSV9MWU5YIDg4Ci0KLSNkZWZpbmUgU0NSRUVOX1hfUkVTICAgICAgMTAyNAotI2RlZmluZSBTQ1JFRU5fWV9SRVMgICAgICA2MDAKLSNkZWZpbmUgU0NSRUVOX0JQUCAgICAgICAgMTYKLQotLypBc3N1bWUgU003MTIgZ3JhcGhpY3MgY2hpcCBoYXMgNE1CIFZSQU0gKi8KLSNkZWZpbmUgU003MTJfVklERU9NRU1PUllTSVpFCSAgMHgwMDQwMDAwMAotLypBc3N1bWUgU003MjIgZ3JhcGhpY3MgY2hpcCBoYXMgOE1CIFZSQU0gKi8KLSNkZWZpbmUgU003MjJfVklERU9NRU1PUllTSVpFCSAgMHgwMDgwMDAwMAotCi0jZGVmaW5lIGRhY19yZWcJKDB4M2M4KQotI2RlZmluZSBkYWNfdmFsCSgweDNjOSkKLQotZXh0ZXJuIHZvaWQgX19pb21lbSAqc210Y19SZWdCYXNlQWRkcmVzczsKLSNkZWZpbmUgc210Y19tbWlvd2IoZGF0LCByZWcpCXdyaXRlYihkYXQsIHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCi0jZGVmaW5lIHNtdGNfbW1pb3d3KGRhdCwgcmVnKQl3cml0ZXcoZGF0LCBzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQotI2RlZmluZSBzbXRjX21taW93bChkYXQsIHJlZykJd3JpdGVsKGRhdCwgc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKLQotI2RlZmluZSBzbXRjX21taW9yYihyZWcpCXJlYWRiKHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCi0jZGVmaW5lIHNtdGNfbW1pb3J3KHJlZykJcmVhZHcoc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKLSNkZWZpbmUgc210Y19tbWlvcmwocmVnKQlyZWFkbChzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQotCi0jZGVmaW5lIFNJWkVfU1IwMF9TUjA0ICAgICAgKDB4MDQgLSAweDAwICsgMSkKLSNkZWZpbmUgU0laRV9TUjEwX1NSMjQgICAgICAoMHgyNCAtIDB4MTAgKyAxKQotI2RlZmluZSBTSVpFX1NSMzBfU1I3NSAgICAgICgweDc1IC0gMHgzMCArIDEpCi0jZGVmaW5lIFNJWkVfU1I4MF9TUjkzICAgICAgKDB4OTMgLSAweDgwICsgMSkKLSNkZWZpbmUgU0laRV9TUkEwX1NSQUYgICAgICAoMHhBRiAtIDB4QTAgKyAxKQotI2RlZmluZSBTSVpFX0dSMDBfR1IwOCAgICAgICgweDA4IC0gMHgwMCArIDEpCi0jZGVmaW5lIFNJWkVfQVIwMF9BUjE0ICAgICAgKDB4MTQgLSAweDAwICsgMSkKLSNkZWZpbmUgU0laRV9DUjAwX0NSMTggICAgICAoMHgxOCAtIDB4MDAgKyAxKQotI2RlZmluZSBTSVpFX0NSMzBfQ1I0RCAgICAgICgweDREIC0gMHgzMCArIDEpCi0jZGVmaW5lIFNJWkVfQ1I5MF9DUkE3ICAgICAgKDB4QTcgLSAweDkwICsgMSkKLSNkZWZpbmUgU0laRV9WUFIJCSgweDZDICsgMSkKLSNkZWZpbmUgU0laRV9EUFIJCSgweDQ0ICsgMSkKLQotc3RhdGljIGlubGluZSB2b2lkIHNtdGNfY3J0Y3coaW50IHJlZywgaW50IHZhbCkKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2Q0KTsKLQlzbXRjX21taW93Yih2YWwsIDB4M2Q1KTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc210Y19jcnRjcihpbnQgcmVnKQotewotCXNtdGNfbW1pb3diKHJlZywgMHgzZDQpOwotCXJldHVybiBzbXRjX21taW9yYigweDNkNSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXRjX2dycGh3KGludCByZWcsIGludCB2YWwpCi17Ci0Jc210Y19tbWlvd2IocmVnLCAweDNjZSk7Ci0Jc210Y19tbWlvd2IodmFsLCAweDNjZik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNtdGNfZ3JwaHIoaW50IHJlZykKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2NlKTsKLQlyZXR1cm4gc210Y19tbWlvcmIoMHgzY2YpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc210Y19hdHRydyhpbnQgcmVnLCBpbnQgdmFsKQotewotCXNtdGNfbW1pb3JiKDB4M2RhKTsKLQlzbXRjX21taW93YihyZWcsIDB4M2MwKTsKLQlzbXRjX21taW9yYigweDNjMSk7Ci0Jc210Y19tbWlvd2IodmFsLCAweDNjMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXRjX3NlcXcoaW50IHJlZywgaW50IHZhbCkKLXsKLQlzbXRjX21taW93YihyZWcsIDB4M2M0KTsKLQlzbXRjX21taW93Yih2YWwsIDB4M2M1KTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc210Y19zZXFyKGludCByZWcpCi17Ci0Jc210Y19tbWlvd2IocmVnLCAweDNjNCk7Ci0JcmV0dXJuIHNtdGNfbW1pb3JiKDB4M2M1KTsKLX0KLQotLyogVGhlIG5leHQgc3RydWN0dXJlIGhvbGRzIGFsbCBpbmZvcm1hdGlvbiByZWxldmFudCBmb3IgYSBzcGVjaWZpYyB2aWRlbyBtb2RlLgotICovCi0KLXN0cnVjdCBNb2RlSW5pdCB7Ci0JaW50IG1tU2l6ZVg7Ci0JaW50IG1tU2l6ZVk7Ci0JaW50IGJwcDsKLQlpbnQgaHo7Ci0JdW5zaWduZWQgY2hhciBJbml0X01JU0M7Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSMDBfU1IwNFtTSVpFX1NSMDBfU1IwNF07Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSMTBfU1IyNFtTSVpFX1NSMTBfU1IyNF07Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSMzBfU1I3NVtTSVpFX1NSMzBfU1I3NV07Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSODBfU1I5M1tTSVpFX1NSODBfU1I5M107Ci0JdW5zaWduZWQgY2hhciBJbml0X1NSQTBfU1JBRltTSVpFX1NSQTBfU1JBRl07Ci0JdW5zaWduZWQgY2hhciBJbml0X0dSMDBfR1IwOFtTSVpFX0dSMDBfR1IwOF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0FSMDBfQVIxNFtTSVpFX0FSMDBfQVIxNF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0NSMDBfQ1IxOFtTSVpFX0NSMDBfQ1IxOF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0NSMzBfQ1I0RFtTSVpFX0NSMzBfQ1I0RF07Ci0JdW5zaWduZWQgY2hhciBJbml0X0NSOTBfQ1JBN1tTSVpFX0NSOTBfQ1JBN107Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkJIFNNNzEyIE1vZGUgdGFibGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBNb2RlSW5pdCBWR0FNb2RlW10gPSB7Ci0JewotCSAvKiAgbW9kZSMwOiA2NDAgeCA0ODAgIDE2QnBwICA2MEh6ICovCi0JIDY0MCwgNDgwLCAxNiwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHhFMywKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDAsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEZGLCAweEJFLCAweEVGLCAweEZGLCAweDAwLCAweDBFLCAweDE3LCAweDJDLAotCSAgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDMyLCAweDAzLCAweEEwLCAweDA5LCAweEMwLCAweDMyLCAweDMyLCAweDMyLAotCSAgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDMyLCAweDMyLCAweDMyLAotCSAgMHgwNCwgMHgyNCwgMHg2MywgMHg0RiwgMHg1MiwgMHgwQiwgMHhERiwgMHhFQSwKLQkgIDB4MDQsIDB4NTAsIDB4MTksIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MzIsCi0JICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgwNywgMHg4MiwgMHgwNywgMHgwNCwKLQkgIDB4MDAsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MzAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweEZGLCAweDA3LCAweDAwLCAweDZGLCAweDdGLCAweDdGLCAweEZGLCAweDMyLAotCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGRiwgMHgzMiwgMHgzMiwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhFRiwgMHhGRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHg1RiwgMHg0RiwgMHg0RiwgMHgwMCwgMHg1MywgMHgxRiwgMHgwQiwgMHgzRSwKLQkgIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEVBLCAweDBDLCAweERGLCAweDUwLCAweDQwLCAweERGLCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4MDMsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEU3LCAweEZGLCAweEZELAotCSAgMHg1RiwgMHg0RiwgMHgwMCwgMHg1NCwgMHgwMCwgMHgwQiwgMHhERiwgMHgwMCwKLQkgIDB4RUEsIDB4MEMsIDB4MkUsIDB4MDAsIDB4NEYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU2LCAweERELCAweDVFLCAweEVBLCAweDg3LCAweDQ0LCAweDhGLCAweDU1LAotCSAgMHgwQSwgMHg4RiwgMHg1NSwgMHgwQSwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MTEsIDB4MTAsIDB4MEIsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MDAsCi0JICB9LAotCSB9LAotCXsKLQkgLyogIG1vZGUjMTogNjQwIHggNDgwICAyNEJwcCAgNjBIeiAqLwotCSA2NDAsIDQ4MCwgMjQsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RTMsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAwLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGRiwgMHhCRSwgMHhFRiwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzMiwgMHgwMywgMHhBMCwgMHgwOSwgMHhDMCwgMHgzMiwgMHgzMiwgMHgzMiwKLQkgIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgzMiwgMHgzMiwgMHgzMiwKLQkgIDB4MDQsIDB4MjQsIDB4NjMsIDB4NEYsIDB4NTIsIDB4MEIsIDB4REYsIDB4RUEsCi0JICAweDA0LCAweDUwLCAweDE5LCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDMyLAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDcsIDB4ODIsIDB4MDcsIDB4MDQsCi0JICAweDAwLCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDMwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgzMiwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RkYsIDB4MzIsIDB4MzIsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4RkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4NUYsIDB4NEYsIDB4NEYsIDB4MDAsIDB4NTMsIDB4MUYsIDB4MEIsIDB4M0UsCi0JICAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhFQSwgMHgwQywgMHhERiwgMHg1MCwgMHg0MCwgMHhERiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDAzLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhGRiwgMHhGRCwKLQkgIDB4NUYsIDB4NEYsIDB4MDAsIDB4NTQsIDB4MDAsIDB4MEIsIDB4REYsIDB4MDAsCi0JICAweEVBLCAweDBDLCAweDJFLCAweDAwLCAweDRGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NiwgMHhERCwgMHg1RSwgMHhFQSwgMHg4NywgMHg0NCwgMHg4RiwgMHg1NSwKLQkgIDB4MEEsIDB4OEYsIDB4NTUsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDExLCAweDEwLCAweDBCLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDAwLAotCSAgfSwKLQkgfSwKLQl7Ci0JIC8qICBtb2RlIzA6IDY0MCB4IDQ4MCAgMzJCcHAgIDYwSHogKi8KLQkgNjQwLCA0ODAsIDMyLCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEUzLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMCwgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RkYsIDB4QkUsIDB4RUYsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzIsIDB4MDMsIDB4QTAsIDB4MDksIDB4QzAsIDB4MzIsIDB4MzIsIDB4MzIsCi0JICAweDMyLCAweDMyLCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MzIsIDB4MzIsIDB4MzIsCi0JICAweDA0LCAweDI0LCAweDYzLCAweDRGLCAweDUyLCAweDBCLCAweERGLCAweEVBLAotCSAgMHgwNCwgMHg1MCwgMHgxOSwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgzMiwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDA3LCAweDgyLCAweDA3LCAweDA0LAotCSAgMHgwMCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgzMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MzIsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZGLCAweDMyLCAweDMyLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEZGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweDVGLCAweDRGLCAweDRGLCAweDAwLCAweDUzLCAweDFGLCAweDBCLCAweDNFLAotCSAgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4RUEsIDB4MEMsIDB4REYsIDB4NTAsIDB4NDAsIDB4REYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHgwMywgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4RkYsIDB4RkQsCi0JICAweDVGLCAweDRGLCAweDAwLCAweDU0LCAweDAwLCAweDBCLCAweERGLCAweDAwLAotCSAgMHhFQSwgMHgwQywgMHgyRSwgMHgwMCwgMHg0RiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTYsIDB4REQsIDB4NUUsIDB4RUEsIDB4ODcsIDB4NDQsIDB4OEYsIDB4NTUsCi0JICAweDBBLCAweDhGLCAweDU1LCAweDBBLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgxMSwgMHgxMCwgMHgwQiwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwMCwKLQkgIH0sCi0JIH0sCi0KLQl7CQkJLyogIG1vZGUjMjogODAwIHggNjAwICAxNkJwcCAgNjBIeiAqLwotCSA4MDAsIDYwMCwgMTYsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4MkIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGRiwgMHhCRSwgMHhFRSwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzNCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgyNCwgMHgyNCwgMHgyNCwKLQkgIDB4MjQsIDB4MjQsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDM4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgyNCwKLQkgIDB4MDQsIDB4NDgsIDB4ODMsIDB4NjMsIDB4NjgsIDB4NzIsIDB4NTcsIDB4NTgsCi0JICAweDA0LCAweDU1LCAweDU5LCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDI0LAotCSAgMHgwMSwgMHg4MCwgMHg3QSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MUMsIDB4ODUsIDB4MzUsIDB4MTMsCi0JICAweDAyLCAweDQ1LCAweDMwLCAweDM1LCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgyNCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MjQsIDB4MjQsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4N0YsIDB4NjMsIDB4NjMsIDB4MDAsIDB4NjgsIDB4MTgsIDB4NzIsIDB4RjAsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHg1NywgMHg2NCwgMHg0MCwgMHg1NywgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMzLCAweDAzLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhCRiwgMHhGRCwKLQkgIDB4N0YsIDB4NjMsIDB4MDAsIDB4NjksIDB4MTgsIDB4NzIsIDB4NTcsIDB4MDAsCi0JICAweDU4LCAweDBDLCAweEUwLCAweDIwLCAweDYzLCAweDU3LAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NiwgMHg0QiwgMHg1RSwgMHg1NSwgMHg4NiwgMHg5RCwgMHg4RSwgMHhBQSwKLQkgIDB4REIsIDB4MkEsIDB4REYsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDIwLCAweDFGLCAweDFBLCAweDE5LCAweDBGLCAweDBGLCAweDBGLCAweDAwLAotCSAgfSwKLQkgfSwKLQl7CQkJLyogIG1vZGUjMzogODAwIHggNjAwICAyNEJwcCAgNjBIeiAqLwotCSA4MDAsIDYwMCwgMjQsIDYwLAotCSAweDJCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RkYsIDB4QkUsIDB4RUUsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzYsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4MzYsIDB4MzYsIDB4MzYsCi0JICAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MzYsIDB4MzYsIDB4MzYsCi0JICAweDA0LCAweDQ4LCAweDgzLCAweDYzLCAweDY4LCAweDcyLCAweDU3LCAweDU4LAotCSAgMHgwNCwgMHg1NSwgMHg1OSwgMHgzNiwgMHgzNiwgMHgwMCwgMHgwMCwgMHgzNiwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDFDLCAweDg1LCAweDM1LCAweDEzLAotCSAgMHgwMiwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MzYsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZGLCAweDM2LCAweDM2LAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweDdGLCAweDYzLCAweDYzLCAweDAwLCAweDY4LCAweDE4LCAweDcyLCAweEYwLAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTgsIDB4MEMsIDB4NTcsIDB4NjQsIDB4NDAsIDB4NTcsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMywgMHgwMywgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4QkYsIDB4RkQsCi0JICAweDdGLCAweDYzLCAweDAwLCAweDY5LCAweDE4LCAweDcyLCAweDU3LCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHhFMCwgMHgyMCwgMHg2MywgMHg1NywKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTYsIDB4NEIsIDB4NUUsIDB4NTUsIDB4ODYsIDB4OUQsIDB4OEUsIDB4QUEsCi0JICAweERCLCAweDJBLCAweERGLCAweDMzLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgyMCwgMHgxRiwgMHgxQSwgMHgxOSwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwMCwKLQkgIH0sCi0JIH0sCi0JewkJCS8qICBtb2RlIzc6IDgwMCB4IDYwMCAgMzJCcHAgIDYwSHogKi8KLQkgODAwLCA2MDAsIDMyLCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweDJCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RkYsIDB4QkUsIDB4RUUsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzQsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4MjQsIDB4MjQsIDB4MjQsCi0JICAweDI0LCAweDI0LCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgzOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MjQsCi0JICAweDA0LCAweDQ4LCAweDgzLCAweDYzLCAweDY4LCAweDcyLCAweDU3LCAweDU4LAotCSAgMHgwNCwgMHg1NSwgMHg1OSwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgyNCwKLQkgIDB4MDEsIDB4ODAsIDB4N0EsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDFDLCAweDg1LCAweDM1LCAweDEzLAotCSAgMHgwMiwgMHg0NSwgMHgzMCwgMHgzNSwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MjQsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDI0LCAweDI0LAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweDdGLCAweDYzLCAweDYzLCAweDAwLCAweDY4LCAweDE4LCAweDcyLCAweEYwLAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTgsIDB4MEMsIDB4NTcsIDB4NjQsIDB4NDAsIDB4NTcsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMywgMHgwMywgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4QkYsIDB4RkQsCi0JICAweDdGLCAweDYzLCAweDAwLCAweDY5LCAweDE4LCAweDcyLCAweDU3LCAweDAwLAotCSAgMHg1OCwgMHgwQywgMHhFMCwgMHgyMCwgMHg2MywgMHg1NywKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTYsIDB4NEIsIDB4NUUsIDB4NTUsIDB4ODYsIDB4OUQsIDB4OEUsIDB4QUEsCi0JICAweERCLCAweDJBLCAweERGLCAweDMzLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgyMCwgMHgxRiwgMHgxQSwgMHgxOSwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwMCwKLQkgIH0sCi0JIH0sCi0JLyogV2UgdXNlIDEwMjR4NzY4IHRhYmxlIHRvIGxpZ2h0IDEwMjR4NjAwIHBhbmVsIGZvciBsZW1vdGUgKi8KLQl7CQkJLyogIG1vZGUjNDogMTAyNCB4IDYwMCAgMTZCcHAgIDYwSHogICovCi0JIDEwMjQsIDYwMCwgMTYsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RUIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAwLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhDOCwgMHg0MCwgMHgxNCwgMHg2MCwgMHgwMCwgMHgwQSwgMHgxNywgMHgyMCwKLQkgIDB4NTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMwLCAweDAyLCAweDAwLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgyMiwgMHgwMywgMHgyNCwgMHgwOSwgMHhDMCwgMHgyMiwgMHgyMiwgMHgyMiwKLQkgIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgyMiwKLQkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCi0JICAweDAwLCAweDYwLCAweDU5LCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDIyLAotCSAgMHgwMSwgMHg4MCwgMHg3QSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4MTYsIDB4MDIsIDB4MEQsIDB4ODIsIDB4MDksIDB4MDIsCi0JICAweDA0LCAweDQ1LCAweDNGLCAweDMwLCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKLQkgIDB4QTMsIDB4N0YsIDB4MDAsIDB4ODIsIDB4MGIsIDB4NmYsIDB4NTcsIDB4MDAsCi0JICAweDVjLCAweDBmLCAweEUwLCAweGUwLCAweDdGLCAweDU3LAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKLQkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAotCSAgfSwKLQkgfSwKLQl7CQkJLyogIG1vZGUjNTogMTAyNCB4IDc2OCAgMjRCcHAgIDYwSHogKi8KLQkgMTAyNCwgNzY4LCAyNCwgNjAsCi0JIC8qICBJbml0X01JU0MgKi8KLQkgMHhFQiwKLQkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KLQkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDMsIDB4MEUsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCi0JICAweEYzLCAweEI2LCAweEMwLCAweERELCAweDAwLCAweDBFLCAweDE3LCAweDJDLAotCSAgMHg5OSwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCi0JICAweDM4LCAweDAzLCAweDIwLCAweDA5LCAweEMwLCAweDNBLCAweDNBLCAweDNBLAotCSAgMHgzQSwgMHgzQSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKLQkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCi0JICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDNBLAotCSAgMHgwNiwgMHg2OCwgMHhBNywgMHg3RiwgMHg4MywgMHgyNCwgMHhGRiwgMHgwMywKLQkgIDB4MDAsIDB4NjAsIDB4NTksIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgzQiwgMHgwRCwgMHgwOSwgMHgwMiwKLQkgIDB4MDQsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MjAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCi0JICAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDNBLAotCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzQSwgMHgzQSwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCi0JICAweDAwLCAweEZCLCAweDlGLCAweDAxLCAweDAwLCAweEVELCAweEVELCAweEVELAotCSAgMHg3QiwgMHhGQiwgMHhGRiwgMHhGRiwgMHg5NywgMHhFRiwgMHhCRiwgMHhERiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLwotCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLQkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0JICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLwotCSAgMHhBMywgMHg3RiwgMHg3RiwgMHgwMCwgMHg4NSwgMHgxNiwgMHgyNCwgMHhGNSwKLQkgIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDAzLCAweDA5LCAweEZGLCAweDgwLCAweDQwLCAweEZGLCAweDAwLCAweEUzLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MjAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEZGLCAweEJGLCAweEZGLAotCSAgMHhBMywgMHg3RiwgMHgwMCwgMHg4NiwgMHgxNSwgMHgyNCwgMHhGRiwgMHgwMCwKLQkgIDB4MDEsIDB4MDcsIDB4RTUsIDB4MjAsIDB4N0YsIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCi0JICAweDU1LCAweEQ5LCAweDVELCAweEUxLCAweDg2LCAweDFCLCAweDhFLCAweDI2LAotCSAgMHhEQSwgMHg4RCwgMHhERSwgMHg5NCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKLQkgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MTUsIDB4MDMsCi0JICB9LAotCSB9LAotCXsJCQkvKiAgbW9kZSM0OiAxMDI0IHggNzY4ICAzMkJwcCAgNjBIeiAqLwotCSAxMDI0LCA3NjgsIDMyLCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEVCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RjMsIDB4QjYsIDB4QzAsIDB4REQsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMiwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzgsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4M0EsIDB4M0EsIDB4M0EsCi0JICAweDNBLCAweDNBLCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDA2LCAweDY4LCAweEE3LCAweDdGLCAweDgzLCAweDI0LCAweEZGLCAweDAzLAotCSAgMHgwMCwgMHg2MCwgMHg1OSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDNCLCAweDBELCAweDA5LCAweDAyLAotCSAgMHgwNCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0EsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDNBLCAweDNBLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkIsIDB4OUYsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZCLCAweEZGLCAweEZGLCAweDk3LCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweEEzLCAweDdGLCAweDdGLCAweDAwLCAweDg1LCAweDE2LCAweDI0LCAweEY1LAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4MDMsIDB4MDksIDB4RkYsIDB4ODAsIDB4NDAsIDB4RkYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsCi0JICAweEEzLCAweDdGLCAweDAwLCAweDg2LCAweDE1LCAweDI0LCAweEZGLCAweDAwLAotCSAgMHgwMSwgMHgwNywgMHhFNSwgMHgyMCwgMHg3RiwgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTUsIDB4RDksIDB4NUQsIDB4RTEsIDB4ODYsIDB4MUIsIDB4OEUsIDB4MjYsCi0JICAweERBLCAweDhELCAweERFLCAweDk0LCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgxNSwgMHgwMywKLQkgIH0sCi0JIH0sCi0JewkJCS8qICBtb2RlIzY6IDMyMCB4IDI0MCAgMTZCcHAgIDYwSHogKi8KLQkgMzIwLCAyNDAsIDE2LCA2MCwKLQkgLyogIEluaXRfTUlTQyAqLwotCSAweEVCLAotCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLwotCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KLQkgIDB4RjMsIDB4QjYsIDB4QzAsIDB4REQsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCi0JICAweDk5LCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHhDNCwgMHgzMiwgMHgwMiwgMHgwMSwgMHgwMSwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KLQkgIDB4MzgsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4M0EsIDB4M0EsIDB4M0EsCi0JICAweDNBLCAweDNBLCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAotCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKLQkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0EsCi0JICAweDA2LCAweDY4LCAweEE3LCAweDdGLCAweDgzLCAweDI0LCAweEZGLCAweDAzLAotCSAgMHgwMCwgMHg2MCwgMHg1OSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDA4LCAweDQzLCAweDA4LCAweDQzLAotCSAgMHgwNCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KLQkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0EsCi0JICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDNBLCAweDNBLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KLQkgIDB4MDAsIDB4RkIsIDB4OUYsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RUQsCi0JICAweDdCLCAweEZCLCAweEZGLCAweEZGLCAweDk3LCAweEVGLCAweEJGLCAweERGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCi0JICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKLQkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCi0JICAweEEzLCAweDdGLCAweDdGLCAweDAwLCAweDg1LCAweDE2LCAweDI0LCAweEY1LAotCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4MDMsIDB4MDksIDB4RkYsIDB4ODAsIDB4NDAsIDB4RkYsIDB4MDAsIDB4RTMsCi0JICAweEZGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLwotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgyMCwKLQkgIDB4MDAsIDB4MDAsIDB4MzAsIDB4NDAsIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsCi0JICAweDJFLCAweDI3LCAweDAwLCAweDJiLCAweDBjLCAweDBGLCAweEVGLCAweDAwLAotCSAgMHhGZSwgMHgwZiwgMHgwMSwgMHhDMCwgMHgyNywgMHhFRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KLQkgIDB4NTUsIDB4RDksIDB4NUQsIDB4RTEsIDB4ODYsIDB4MUIsIDB4OEUsIDB4MjYsCi0JICAweERBLCAweDhELCAweERFLCAweDk0LCAweDAwLCAweDAwLCAweDE4LCAweDAwLAotCSAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgxNSwgMHgwMywKLQkgIH0sCi0JIH0sCi0KLQl7CQkJLyogIG1vZGUjODogMzIwIHggMjQwICAzMkJwcCAgNjBIeiAqLwotCSAzMjAsIDI0MCwgMzIsIDYwLAotCSAvKiAgSW5pdF9NSVNDICovCi0JIDB4RUIsCi0JIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCi0JICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLwotCSAgMHhGMywgMHhCNiwgMHhDMCwgMHhERCwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKLQkgIDB4OTksIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweEM0LCAweDMyLCAweDAyLCAweDAxLCAweDAxLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLwotCSAgMHgzOCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgzQSwgMHgzQSwgMHgzQSwKLQkgIDB4M0EsIDB4M0EsIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCi0JICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAotCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQSwKLQkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCi0JICAweDAwLCAweDYwLCAweDU5LCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDNBLAotCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDgsIDB4NDMsIDB4MDgsIDB4NDMsCi0JICAweDA0LCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDIwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLwotCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKLQkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgfSwKLQkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLwotCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKLQkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAotCSAgMHhGRiwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KLQkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0JICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAotCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKLQkgIH0sCi0JIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KLQkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCi0JICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKLQkgIDB4RkYsCi0JICB9LAotCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAotCSAgMHgwMCwgMHgwMCwgMHgzMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKLQkgIDB4MkUsIDB4MjcsIDB4MDAsIDB4MmIsIDB4MGMsIDB4MEYsIDB4RUYsIDB4MDAsCi0JICAweEZlLCAweDBmLCAweDAxLCAweEMwLCAweDI3LCAweEVGLAotCSAgfSwKLQkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLwotCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKLQkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCi0JICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAotCSAgfSwKLQkgfSwKLX07Ci0KLSNkZWZpbmUgbnVtVkdBTW9kZXMJCUFSUkFZX1NJWkUoVkdBTW9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3NmQ5OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eGZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI4ICswLDAgQEAKLS8qCi0gKiBTaWxpY29uIE1vdGlvbiBTTTdYWCBmcmFtZSBidWZmZXIgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gTW90aW9uIFRlY2hub2xvZ3kgQ29ycC4KLSAqIEF1dGhvcnM6ICBHZSBXYW5nLCBnZXdhbmdAc2lsaWNvbm1vdGlvbi5jb20KLSAqCSAgICAgQm95b2QgYm95b2QueWFuZ0BzaWxpY29ubW90aW9uLmNvbS5jbgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBMZW1vdGUsIEluYy4KLSAqIEF1dGhvcjogICBXdSBaaGFuZ2ppbiwgd3V6aGFuZ2ppbkBnbWFpbC5jb20KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSWdhbGlhLCBTLkwuCi0gKiBBdXRob3I6ICAgSmF2aWVyIE0uIE1lbGxpZCA8am11bmhvekBpZ2FsaWEuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIEZyYW1lYnVmZmVyIGRyaXZlciBmb3IgU2lsaWNvbiBNb3Rpb24gU003MTAsIFNNNzEyLCBTTTcyMSBhbmQgU003MjIgY2hpcHMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgotCi0jaWZkZWYgQ09ORklHX1BNCi0jaW5jbHVkZSA8bGludXgvcG0uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAic203eHguaCIKLQotLyoKLSogUHJpdmF0ZSBzdHJ1Y3R1cmUKLSovCi1zdHJ1Y3Qgc210Y2ZiX2luZm8gewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBmYl9pbmZvIGZiOwotCXUxNiBjaGlwX2lkOwotCXU4ICBjaGlwX3Jldl9pZDsKLQotCXZvaWQgX19pb21lbSAqbGZiOwkvKiBsaW5lYXIgZnJhbWUgYnVmZmVyICovCi0Jdm9pZCBfX2lvbWVtICpkcF9yZWdzOwkvKiBkcmF3aW5nIHByb2Nlc3NvciBjb250cm9sIHJlZ3MgKi8KLQl2b2lkIF9faW9tZW0gKnZwX3JlZ3M7CS8qIHZpZGVvIHByb2Nlc3NvciBjb250cm9sIHJlZ3MgKi8KLQl2b2lkIF9faW9tZW0gKmNwX3JlZ3M7CS8qIGNhcHR1cmUgcHJvY2Vzc29yIGNvbnRyb2wgcmVncyAqLwotCXZvaWQgX19pb21lbSAqbW1pbzsJLyogbWVtb3J5IG1hcCBJTyBwb3J0ICovCi0KLQl1X2ludCB3aWR0aDsKLQl1X2ludCBoZWlnaHQ7Ci0JdV9pbnQgaHo7Ci0KLQl1MzIgY29scmVnWzE3XTsKLX07Ci0KLXZvaWQgX19pb21lbSAqc210Y19SZWdCYXNlQWRkcmVzczsJLyogTWVtb3J5IE1hcCBJTyBzdGFydGluZyBhZGRyZXNzICovCi0KLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc210Y2ZiX3ZhciA9IHsKLQkueHJlcyAgICAgICAgICAgPSAxMDI0LAotCS55cmVzICAgICAgICAgICA9IDYwMCwKLQkueHJlc192aXJ0dWFsICAgPSAxMDI0LAotCS55cmVzX3ZpcnR1YWwgICA9IDYwMCwKLQkuYml0c19wZXJfcGl4ZWwgPSAxNiwKLQkucmVkICAgICAgICAgICAgPSB7MTYsIDgsIDB9LAotCS5ncmVlbiAgICAgICAgICA9IHs4LCA4LCAwfSwKLQkuYmx1ZSAgICAgICAgICAgPSB7MCwgOCwgMH0sCi0JLmFjdGl2YXRlICAgICAgID0gRkJfQUNUSVZBVEVfTk9XLAotCS5oZWlnaHQgICAgICAgICA9IC0xLAotCS53aWR0aCAgICAgICAgICA9IC0xLAotCS52bW9kZSAgICAgICAgICA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsCi0JLm5vbnN0ZCAgICAgICAgID0gMCwKLQkuYWNjZWxfZmxhZ3MgICAgPSBGQl9BQ0NFTEZfVEVYVCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gc210Y2ZiX2ZpeCA9IHsKLQkuaWQgICAgICAgICAgICAgPSAic21YWFhmYiIsCi0JLnR5cGUgICAgICAgICAgID0gRkJfVFlQRV9QQUNLRURfUElYRUxTLAotCS52aXN1YWwgICAgICAgICA9IEZCX1ZJU1VBTF9UUlVFQ09MT1IsCi0JLmxpbmVfbGVuZ3RoICAgID0gODAwICogMywKLQkuYWNjZWwgICAgICAgICAgPSBGQl9BQ0NFTF9TTUlfTFlOWCwKLQkudHlwZV9hdXggICAgICAgPSAwLAotCS54cGFuc3RlcCAgICAgICA9IDAsCi0JLnlwYW5zdGVwICAgICAgID0gMCwKLQkueXdyYXBzdGVwICAgICAgPSAwLAotfTsKLQotc3RydWN0IHZlc2FfbW9kZSB7Ci0JY2hhciBpbmRleFs2XTsKLQl1MTYgIGxmYl93aWR0aDsKLQl1MTYgIGxmYl9oZWlnaHQ7Ci0JdTE2ICBsZmJfZGVwdGg7Ci19OwotCi1zdGF0aWMgc3RydWN0IHZlc2FfbW9kZSB2ZXNhX21vZGVfdGFibGVbXSA9IHsKLQl7IjB4MzAxIiwgNjQwLCAgNDgwLCAgOH0sCi0JeyIweDMwMyIsIDgwMCwgIDYwMCwgIDh9LAotCXsiMHgzMDUiLCAxMDI0LCA3NjgsICA4fSwKLQl7IjB4MzA3IiwgMTI4MCwgMTAyNCwgOH0sCi0KLQl7IjB4MzExIiwgNjQwLCAgNDgwLCAgMTZ9LAotCXsiMHgzMTQiLCA4MDAsICA2MDAsICAxNn0sCi0JeyIweDMxNyIsIDEwMjQsIDc2OCwgIDE2fSwKLQl7IjB4MzFBIiwgMTI4MCwgMTAyNCwgMTZ9LAotCi0JeyIweDMxMiIsIDY0MCwgIDQ4MCwgIDI0fSwKLQl7IjB4MzE1IiwgODAwLCAgNjAwLCAgMjR9LAotCXsiMHgzMTgiLCAxMDI0LCA3NjgsICAyNH0sCi0JeyIweDMxQiIsIDEyODAsIDEwMjQsIDI0fSwKLX07Ci0KLXN0cnVjdCBzY3JlZW5faW5mbyBzbXRjX3Njcl9pbmZvOwotCi0vKiBwcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zLCBnZXQgdmdhIHBhcmFtZXRlciAqLwotc3RhdGljIGludCBfX2luaXQgc203eHhfdmdhX3NldHVwKGNoYXIgKm9wdGlvbnMpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNtdGNfc2NyX2luZm8ubGZiX3dpZHRoID0gMDsKLQlzbXRjX3Njcl9pbmZvLmxmYl9oZWlnaHQgPSAwOwotCXNtdGNfc2NyX2luZm8ubGZiX2RlcHRoID0gMDsKLQotCXByX2RlYnVnKCJzbTd4eF92Z2Ffc2V0dXAgPSAlc1xuIiwgb3B0aW9ucyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2ZXNhX21vZGVfdGFibGUpOyBpKyspIHsKLQkJaWYgKHN0cnN0cihvcHRpb25zLCB2ZXNhX21vZGVfdGFibGVbaV0uaW5kZXgpKSB7Ci0JCQlzbXRjX3Njcl9pbmZvLmxmYl93aWR0aCAgPSB2ZXNhX21vZGVfdGFibGVbaV0ubGZiX3dpZHRoOwotCQkJc210Y19zY3JfaW5mby5sZmJfaGVpZ2h0ID0KLQkJCQkJCXZlc2FfbW9kZV90YWJsZVtpXS5sZmJfaGVpZ2h0OwotCQkJc210Y19zY3JfaW5mby5sZmJfZGVwdGggID0gdmVzYV9tb2RlX3RhYmxlW2ldLmxmYl9kZXB0aDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotX19zZXR1cCgidmdhPSIsIHNtN3h4X3ZnYV9zZXR1cCk7Ci0KLXN0YXRpYyB2b2lkIHNtNzEyX3NldHBhbGV0dGUoaW50IHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAotCQkJICAgICB1bnNpZ25lZCBibHVlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQkvKiBzZXQgYml0IDU6NCA9IDAxICh3cml0ZSBMQ0QgUkFNIG9ubHkpICovCi0Jc210Y19zZXF3KDB4NjYsIChzbXRjX3NlcXIoMHg2NikgJiAweEMzKSB8IDB4MTApOwotCi0Jc210Y19tbWlvd2IocmVnbm8sIGRhY19yZWcpOwotCXNtdGNfbW1pb3diKHJlZCA+PiAxMCwgZGFjX3ZhbCk7Ci0Jc210Y19tbWlvd2IoZ3JlZW4gPj4gMTAsIGRhY192YWwpOwotCXNtdGNfbW1pb3diKGJsdWUgPj4gMTAsIGRhY192YWwpOwotfQotCi0vKiBjaGFuX3RvX2ZpZWxkCi0gKgotICogY29udmVydCBhIGNvbG91ciB2YWx1ZSBpbnRvIGEgZmllbGQgcG9zaXRpb24KLSAqCi0gKiBmcm9tIHB4YWZiLmMKLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjaGFuX3RvX2ZpZWxkKHVuc2lnbmVkIGludCBjaGFuLAotCQkJCQkgc3RydWN0IGZiX2JpdGZpZWxkICpiZikKLXsKLQljaGFuICY9IDB4ZmZmZjsKLQljaGFuID4+PSAxNiAtIGJmLT5sZW5ndGg7Ci0JcmV0dXJuIGNoYW4gPDwgYmYtPm9mZnNldDsKLX0KLQotc3RhdGljIGludCBzbXRjX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQkvKiBjbGVhciBEUE1TIHNldHRpbmcgKi8KLQlzd2l0Y2ggKGJsYW5rX21vZGUpIHsKLQljYXNlIEZCX0JMQU5LX1VOQkxBTks6Ci0JCS8qIFNjcmVlbiBPbjogSFN5bmM6IE9uLCBWU3luYyA6IE9uICovCi0JCXNtdGNfc2VxdygweDAxLCAoc210Y19zZXFyKDB4MDEpICYgKH4weDIwKSkpOwotCQlzbXRjX3NlcXcoMHg2YSwgMHgxNik7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJc210Y19zZXF3KDB4MjEsIChzbXRjX3NlcXIoMHgyMSkgJiAweDc3KSk7Ci0JCXNtdGNfc2VxdygweDIyLCAoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkpOwotCQlzbXRjX3NlcXcoMHgyMywgKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpKTsKLQkJc210Y19zZXF3KDB4MjQsIChzbXRjX3NlcXIoMHgyNCkgfCAweDAxKSk7Ci0JCXNtdGNfc2VxdygweDMxLCAoc210Y19zZXFyKDB4MzEpIHwgMHgwMykpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX05PUk1BTDoKLQkJLyogU2NyZWVuIE9mZjogSFN5bmM6IE9uLCBWU3luYyA6IE9uICAgU29mdCBibGFuayAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSAmICh+MHgyMCkpKTsKLQkJc210Y19zZXF3KDB4NmEsIDB4MTYpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCXNtdGNfc2VxdygweDIyLCAoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkpOwotCQlzbXRjX3NlcXcoMHgyMywgKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpKTsKLQkJc210Y19zZXF3KDB4MjQsIChzbXRjX3NlcXIoMHgyNCkgfCAweDAxKSk7Ci0JCXNtdGNfc2VxdygweDMxLCAoKHNtdGNfc2VxcigweDMxKSAmICh+MHgwNykpIHwgMHgwMCkpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6Ci0JCS8qIFNjcmVlbiBPbjogSFN5bmM6IE9uLCBWU3luYyA6IE9mZiAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSB8IDB4MjApKTsKLQkJc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgJiAofjB4QjApKSk7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBjKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHgyMSwgKHNtdGNfc2VxcigweDIxKSB8IDB4ODgpKTsKLQkJc210Y19zZXF3KDB4MjIsICgoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkgfCAweDIwKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpIHwgMHgyMCkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSAmICh+MHgwMSkpKTsKLQkJc210Y19zZXF3KDB4MzEsICgoc210Y19zZXFyKDB4MzEpICYgKH4weDA3KSkgfCAweDAwKSk7Ci0JCXNtdGNfc2VxdygweDM0LCAoc210Y19zZXFyKDB4MzQpIHwgMHg4MCkpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6Ci0JCS8qIFNjcmVlbiBPbjogSFN5bmM6IE9mZiwgVlN5bmMgOiBPbiAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSB8IDB4MjApKTsKLQkJc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgJiAofjB4QjApKSk7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBjKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHgyMSwgKHNtdGNfc2VxcigweDIxKSB8IDB4ODgpKTsKLQkJc210Y19zZXF3KDB4MjIsICgoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkgfCAweDEwKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpIHwgMHhEOCkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSAmICh+MHgwMSkpKTsKLQkJc210Y19zZXF3KDB4MzEsICgoc210Y19zZXFyKDB4MzEpICYgKH4weDA3KSkgfCAweDAwKSk7Ci0JCXNtdGNfc2VxdygweDM0LCAoc210Y19zZXFyKDB4MzQpIHwgMHg4MCkpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKLQkJLyogU2NyZWVuIE9uOiBIU3luYzogT2ZmLCBWU3luYyA6IE9mZiAqLwotCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSB8IDB4MjApKTsKLQkJc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgJiAofjB4QjApKSk7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBjKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlzbXRjX3NlcXcoMHgyMSwgKHNtdGNfc2VxcigweDIxKSB8IDB4ODgpKTsKLQkJc210Y19zZXF3KDB4MjIsICgoc210Y19zZXFyKDB4MjIpICYgKH4weDMwKSkgfCAweDMwKSk7Ci0JCXNtdGNfc2VxdygweDIzLCAoKHNtdGNfc2VxcigweDIzKSAmICh+MHhjMCkpIHwgMHhEOCkpOwotCQlzbXRjX3NlcXcoMHgyNCwgKHNtdGNfc2VxcigweDI0KSAmICh+MHgwMSkpKTsKLQkJc210Y19zZXF3KDB4MzEsICgoc210Y19zZXFyKDB4MzEpICYgKH4weDA3KSkgfCAweDAwKSk7Ci0JCXNtdGNfc2VxdygweDM0LCAoc210Y19zZXFyKDB4MzQpIHwgMHg4MCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbXRjX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKLQkJCSAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnMsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiOwotCXUzMiB2YWw7Ci0KLQlzZmIgPSBpbmZvLT5wYXI7Ci0KLQlpZiAocmVnbm8gPiAyNTUpCi0JCXJldHVybiAxOwotCi0Jc3dpdGNoIChzZmItPmZiLmZpeC52aXN1YWwpIHsKLQljYXNlIEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjoKLQljYXNlIEZCX1ZJU1VBTF9UUlVFQ09MT1I6Ci0JCS8qCi0JCSAqIDE2LzMyIGJpdCB0cnVlLWNvbG91ciwgdXNlIHBzZXVkby1wYWxldHRlIGZvciAxNiBiYXNlIGNvbG9yCi0JCSAqLwotCQlpZiAocmVnbm8gPCAxNikgewotCQkJaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDE2KSB7Ci0JCQkJdTMyICpwYWwgPSBzZmItPmZiLnBzZXVkb19wYWxldHRlOwotCQkJCXZhbCA9IGNoYW5fdG9fZmllbGQocmVkLCAmc2ZiLT5mYi52YXIucmVkKTsKLQkJCQl2YWwgfD0gY2hhbl90b19maWVsZChncmVlbiwgJnNmYi0+ZmIudmFyLmdyZWVuKTsKLQkJCQl2YWwgfD0gY2hhbl90b19maWVsZChibHVlLCAmc2ZiLT5mYi52YXIuYmx1ZSk7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCQkJcGFsW3JlZ25vXSA9Ci0JCQkJICAgICgocmVkICYgMHhmODAwKSA+PiA4KSB8Ci0JCQkJICAgICgoZ3JlZW4gJiAweGUwMDApID4+IDEzKSB8Ci0JCQkJICAgICgoZ3JlZW4gJiAweDFjMDApIDw8IDMpIHwKLQkJCQkgICAgKChibHVlICYgMHhmODAwKSA+PiAzKTsKLSNlbHNlCi0JCQkJcGFsW3JlZ25vXSA9IHZhbDsKLSNlbmRpZgotCQkJfSBlbHNlIHsKLQkJCQl1MzIgKnBhbCA9IHNmYi0+ZmIucHNldWRvX3BhbGV0dGU7Ci0JCQkJdmFsID0gY2hhbl90b19maWVsZChyZWQsICZzZmItPmZiLnZhci5yZWQpOwotCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGdyZWVuLCAmc2ZiLT5mYi52YXIuZ3JlZW4pOwotCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGJsdWUsICZzZmItPmZiLnZhci5ibHVlKTsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJCQl2YWwgPQotCQkJCSAgICAodmFsICYgMHhmZjAwZmYwMCA+PiA4KSB8Ci0JCQkJICAgICh2YWwgJiAweDAwZmYwMGZmIDw8IDgpOwotI2VuZGlmCi0JCQkJcGFsW3JlZ25vXSA9IHZhbDsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgotCQkvKiBjb2xvciBkZXB0aCA4IGJpdCAqLwotCQlzbTcxMl9zZXRwYWxldHRlKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCBpbmZvKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gMTsJLyogdW5rbm93biB0eXBlICovCi0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotI2lmZGVmIF9fQklHX0VORElBTgotc3RhdGljIHNzaXplX3Qgc210Y2ZiX3JlYWQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNoYXIgX191c2VyICpidWYsIHNpemVfdAotCQkJCWNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7Ci0KLQl1MzIgKmJ1ZmZlciwgKmRzdDsKLQl1MzIgX19pb21lbSAqc3JjOwotCWludCBjLCBpLCBjbnQgPSAwLCBlcnIgPSAwOwotCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKLQotCWlmICghaW5mbyB8fCAhaW5mby0+c2NyZWVuX2Jhc2UpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JdG90YWxfc2l6ZSA9IGluZm8tPnNjcmVlbl9zaXplOwotCi0JaWYgKHRvdGFsX3NpemUgPT0gMCkKLQkJdG90YWxfc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKLQotCWlmIChwID49IHRvdGFsX3NpemUpCi0JCXJldHVybiAwOwotCi0JaWYgKGNvdW50ID49IHRvdGFsX3NpemUpCi0JCWNvdW50ID0gdG90YWxfc2l6ZTsKLQotCWlmIChjb3VudCArIHAgPiB0b3RhbF9zaXplKQotCQljb3VudCA9IHRvdGFsX3NpemUgLSBwOwotCi0JYnVmZmVyID0ga21hbGxvYygoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNyYyA9ICh1MzIgX19pb21lbSAqKSAoaW5mby0+c2NyZWVuX2Jhc2UgKyBwKTsKLQotCWlmIChpbmZvLT5mYm9wcy0+ZmJfc3luYykKLQkJaW5mby0+ZmJvcHMtPmZiX3N5bmMoaW5mbyk7Ci0KLQl3aGlsZSAoY291bnQpIHsKLQkJYyA9IChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudDsKLQkJZHN0ID0gYnVmZmVyOwotCQlmb3IgKGkgPSBjID4+IDI7IGktLTspIHsKLQkJCSpkc3QgPSBmYl9yZWFkbChzcmMrKyk7Ci0JCQkqZHN0ID0KLQkJCSAgICAoKmRzdCAmIDB4ZmYwMGZmMDAgPj4gOCkgfAotCQkJICAgICgqZHN0ICYgMHgwMGZmMDBmZiA8PCA4KTsKLQkJCWRzdCsrOwotCQl9Ci0JCWlmIChjICYgMykgewotCQkJdTggKmRzdDggPSAodTggKikgZHN0OwotCQkJdTggX19pb21lbSAqc3JjOCA9ICh1OCBfX2lvbWVtICopIHNyYzsKLQotCQkJZm9yIChpID0gYyAmIDM7IGktLTspIHsKLQkJCQlpZiAoaSAmIDEpIHsKLQkJCQkJKmRzdDgrKyA9IGZiX3JlYWRiKCsrc3JjOCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKmRzdDgrKyA9IGZiX3JlYWRiKC0tc3JjOCk7Ci0JCQkJCXNyYzggKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCQlzcmMgPSAodTMyIF9faW9tZW0gKikgc3JjODsKLQkJfQotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIsIGMpKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJKnBwb3MgKz0gYzsKLQkJYnVmICs9IGM7Ci0JCWNudCArPSBjOwotCQljb3VudCAtPSBjOwotCX0KLQotCWtmcmVlKGJ1ZmZlcik7Ci0KLQlyZXR1cm4gKGVycikgPyBlcnIgOiBjbnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1zbXRjZmJfd3JpdGUoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkgICAgIGxvZmZfdCAqcHBvcykKLXsKLQl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKLQotCXUzMiAqYnVmZmVyLCAqc3JjOwotCXUzMiBfX2lvbWVtICpkc3Q7Ci0JaW50IGMsIGksIGNudCA9IDAsIGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwotCi0JaWYgKCFpbmZvIHx8ICFpbmZvLT5zY3JlZW5fYmFzZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCi0JCXJldHVybiAtRVBFUk07Ci0KLQl0b3RhbF9zaXplID0gaW5mby0+c2NyZWVuX3NpemU7Ci0KLQlpZiAodG90YWxfc2l6ZSA9PSAwKQotCQl0b3RhbF9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwotCi0JaWYgKHAgPiB0b3RhbF9zaXplKQotCQlyZXR1cm4gLUVGQklHOwotCi0JaWYgKGNvdW50ID4gdG90YWxfc2l6ZSkgewotCQllcnIgPSAtRUZCSUc7Ci0JCWNvdW50ID0gdG90YWxfc2l6ZTsKLQl9Ci0KLQlpZiAoY291bnQgKyBwID4gdG90YWxfc2l6ZSkgewotCQlpZiAoIWVycikKLQkJCWVyciA9IC1FTk9TUEM7Ci0KLQkJY291bnQgPSB0b3RhbF9zaXplIC0gcDsKLQl9Ci0KLQlidWZmZXIgPSBrbWFsbG9jKChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZHN0ID0gKHUzMiBfX2lvbWVtICopIChpbmZvLT5zY3JlZW5fYmFzZSArIHApOwotCi0JaWYgKGluZm8tPmZib3BzLT5mYl9zeW5jKQotCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyhpbmZvKTsKLQotCXdoaWxlIChjb3VudCkgewotCQljID0gKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50OwotCQlzcmMgPSBidWZmZXI7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHNyYywgYnVmLCBjKSkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZm9yIChpID0gYyA+PiAyOyBpLS07KSB7Ci0JCQlmYl93cml0ZWwoKCpzcmMgJiAweGZmMDBmZjAwID4+IDgpIHwKLQkJCQkgICgqc3JjICYgMHgwMGZmMDBmZiA8PCA4KSwgZHN0KyspOwotCQkJc3JjKys7Ci0JCX0KLQkJaWYgKGMgJiAzKSB7Ci0JCQl1OCAqc3JjOCA9ICh1OCAqKSBzcmM7Ci0JCQl1OCBfX2lvbWVtICpkc3Q4ID0gKHU4IF9faW9tZW0gKikgZHN0OwotCi0JCQlmb3IgKGkgPSBjICYgMzsgaS0tOykgewotCQkJCWlmIChpICYgMSkgewotCQkJCQlmYl93cml0ZWIoKnNyYzgrKywgKytkc3Q4KTsKLQkJCQl9IGVsc2UgewotCQkJCQlmYl93cml0ZWIoKnNyYzgrKywgLS1kc3Q4KTsKLQkJCQkJZHN0OCArPSAyOwotCQkJCX0KLQkJCX0KLQkJCWRzdCA9ICh1MzIgX19pb21lbSAqKSBkc3Q4OwotCQl9Ci0KLQkJKnBwb3MgKz0gYzsKLQkJYnVmICs9IGM7Ci0JCWNudCArPSBjOwotCQljb3VudCAtPSBjOwotCX0KLQotCWtmcmVlKGJ1ZmZlcik7Ci0KLQlyZXR1cm4gKGNudCkgPyBjbnQgOiBlcnI7Ci19Ci0jZW5kaWYJLyogISBfX0JJR19FTkRJQU4gKi8KLQotc3RhdGljIHZvaWQgc203eHhfc2V0X3RpbWluZyhzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYikKLXsKLQlpbnQgaSA9IDAsIGogPSAwOwotCXUzMiBtX25TY3JlZW5TdHJpZGU7Ci0KLQlkZXZfZGJnKCZzZmItPnBkZXYtPmRldiwKLQkJInNmYi0+d2lkdGg9JWQgc2ZiLT5oZWlnaHQ9JWQgIgotCQkic2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWw9JWQgc2ZiLT5oej0lZFxuIiwKLQkJc2ZiLT53aWR0aCwgc2ZiLT5oZWlnaHQsIHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsLCBzZmItPmh6KTsKLQotCWZvciAoaiA9IDA7IGogPCBudW1WR0FNb2RlczsgaisrKSB7Ci0JCWlmIChWR0FNb2RlW2pdLm1tU2l6ZVggPT0gc2ZiLT53aWR0aCAmJgotCQkgICAgVkdBTW9kZVtqXS5tbVNpemVZID09IHNmYi0+aGVpZ2h0ICYmCi0JCSAgICBWR0FNb2RlW2pdLmJwcCA9PSBzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCAmJgotCQkgICAgVkdBTW9kZVtqXS5oeiA9PSBzZmItPmh6KSB7Ci0KLQkJCWRldl9kYmcoJnNmYi0+cGRldi0+ZGV2LAotCQkJCSJWR0FNb2RlW2pdLm1tU2l6ZVg9JWQgVkdBTW9kZVtqXS5tbVNpemVZPSVkICIKLQkJCQkiVkdBTW9kZVtqXS5icHA9JWQgVkdBTW9kZVtqXS5oej0lZFxuIiwKLQkJCQlWR0FNb2RlW2pdLm1tU2l6ZVgsIFZHQU1vZGVbal0ubW1TaXplWSwKLQkJCQlWR0FNb2RlW2pdLmJwcCwgVkdBTW9kZVtqXS5oeik7Ci0KLQkJCWRldl9kYmcoJnNmYi0+cGRldi0+ZGV2LCAiVkdBTW9kZSBpbmRleD0lZFxuIiwgaik7Ci0KLQkJCXNtdGNfbW1pb3diKDB4MCwgMHgzYzYpOwotCi0JCQlzbXRjX3NlcXcoMCwgMHgxKTsKLQotCQkJc210Y19tbWlvd2IoVkdBTW9kZVtqXS5Jbml0X01JU0MsIDB4M2MyKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1IwMCAtIFNSMDQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSMDBfU1IwNDsgaSsrKQotCQkJCXNtdGNfc2VxdyhpLCBWR0FNb2RlW2pdLkluaXRfU1IwMF9TUjA0W2ldKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1IxMCAtIFNSMjQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSMTBfU1IyNDsgaSsrKQotCQkJCXNtdGNfc2VxdyhpICsgMHgxMCwKLQkJCQkJICBWR0FNb2RlW2pdLkluaXRfU1IxMF9TUjI0W2ldKTsKLQotCQkJLyogaW5pdCBTRVEgcmVnaXN0ZXIgU1IzMCAtIFNSNzUgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX1NSMzBfU1I3NTsgaSsrKQotCQkJCWlmICgoaSArIDB4MzApICE9IDB4NjIgJiYKLQkJCQkgICAgKGkgKyAweDMwKSAhPSAweDZhICYmCi0JCQkJICAgIChpICsgMHgzMCkgIT0gMHg2YikKLQkJCQkJc210Y19zZXF3KGkgKyAweDMwLAotCQkJCQkJVkdBTW9kZVtqXS5Jbml0X1NSMzBfU1I3NVtpXSk7Ci0KLQkJCS8qIGluaXQgU0VRIHJlZ2lzdGVyIFNSODAgLSBTUjkzICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9TUjgwX1NSOTM7IGkrKykKLQkJCQlzbXRjX3NlcXcoaSArIDB4ODAsCi0JCQkJCSAgVkdBTW9kZVtqXS5Jbml0X1NSODBfU1I5M1tpXSk7Ci0KLQkJCS8qIGluaXQgU0VRIHJlZ2lzdGVyIFNSQTAgLSBTUkFGICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9TUkEwX1NSQUY7IGkrKykKLQkJCQlzbXRjX3NlcXcoaSArIDB4YTAsCi0JCQkJCSAgVkdBTW9kZVtqXS5Jbml0X1NSQTBfU1JBRltpXSk7Ci0KLQkJCS8qIGluaXQgR3JhcGhpYyByZWdpc3RlciBHUjAwIC0gR1IwOCAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfR1IwMF9HUjA4OyBpKyspCi0JCQkJc210Y19ncnBodyhpLCBWR0FNb2RlW2pdLkluaXRfR1IwMF9HUjA4W2ldKTsKLQotCQkJLyogaW5pdCBBdHRyaWJ1dGUgcmVnaXN0ZXIgQVIwMCAtIEFSMTQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX0FSMDBfQVIxNDsgaSsrKQotCQkJCXNtdGNfYXR0cncoaSwgVkdBTW9kZVtqXS5Jbml0X0FSMDBfQVIxNFtpXSk7Ci0KLQkJCS8qIGluaXQgQ1JUQyByZWdpc3RlciBDUjAwIC0gQ1IxOCAqLwotCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfQ1IwMF9DUjE4OyBpKyspCi0JCQkJc210Y19jcnRjdyhpLCBWR0FNb2RlW2pdLkluaXRfQ1IwMF9DUjE4W2ldKTsKLQotCQkJLyogaW5pdCBDUlRDIHJlZ2lzdGVyIENSMzAgLSBDUjREICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9DUjMwX0NSNEQ7IGkrKykKLQkJCQlzbXRjX2NydGN3KGkgKyAweDMwLAotCQkJCQkgICBWR0FNb2RlW2pdLkluaXRfQ1IzMF9DUjREW2ldKTsKLQotCQkJLyogaW5pdCBDUlRDIHJlZ2lzdGVyIENSOTAgLSBDUkE3ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9DUjkwX0NSQTc7IGkrKykKLQkJCQlzbXRjX2NydGN3KGkgKyAweDkwLAotCQkJCQkgICBWR0FNb2RlW2pdLkluaXRfQ1I5MF9DUkE3W2ldKTsKLQkJfQotCX0KLQlzbXRjX21taW93YigweDY3LCAweDNjMik7Ci0KLQkvKiBzZXQgVlBSIHJlZ2lzdGVycyAqLwotCXdyaXRlbCgweDAsIHNmYi0+dnBfcmVncyArIDB4MEMpOwotCXdyaXRlbCgweDAsIHNmYi0+dnBfcmVncyArIDB4NDApOwotCi0JLyogc2V0IGRhdGEgd2lkdGggKi8KLQltX25TY3JlZW5TdHJpZGUgPQotCQkoc2ZiLT53aWR0aCAqIHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKSAvIDY0OwotCXN3aXRjaCAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwpIHsKLQljYXNlIDg6Ci0JCXdyaXRlbCgweDAsIHNmYi0+dnBfcmVncyArIDB4MCk7Ci0JCWJyZWFrOwotCWNhc2UgMTY6Ci0JCXdyaXRlbCgweDAwMDIwMDAwLCBzZmItPnZwX3JlZ3MgKyAweDApOwotCQlicmVhazsKLQljYXNlIDI0OgotCQl3cml0ZWwoMHgwMDA0MDAwMCwgc2ZiLT52cF9yZWdzICsgMHgwKTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJd3JpdGVsKDB4MDAwMzAwMDAsIHNmYi0+dnBfcmVncyArIDB4MCk7Ci0JCWJyZWFrOwotCX0KLQl3cml0ZWwoKHUzMikgKCgobV9uU2NyZWVuU3RyaWRlICsgMikgPDwgMTYpIHwgbV9uU2NyZWVuU3RyaWRlKSwKLQkgICAgICAgc2ZiLT52cF9yZWdzICsgMHgxMCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgc210Y19zZXRfdGltaW5nKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCXN3aXRjaCAoc2ZiLT5jaGlwX2lkKSB7Ci0JY2FzZSAweDcxMDoKLQljYXNlIDB4NzEyOgotCWNhc2UgMHg3MjA6Ci0JCXNtN3h4X3NldF90aW1pbmcoc2ZiKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzbXRjZmJfc2V0bW9kZShzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYikKLXsKLQlzd2l0Y2ggKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JY2FzZSAzMjoKLQkJc2ZiLT5mYi5maXgudmlzdWFsICAgICAgID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKLQkJc2ZiLT5mYi5maXgubGluZV9sZW5ndGggID0gc2ZiLT5mYi52YXIueHJlcyAqIDQ7Ci0JCXNmYi0+ZmIudmFyLnJlZC5sZW5ndGggICA9IDg7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLmxlbmd0aCA9IDg7Ci0JCXNmYi0+ZmIudmFyLmJsdWUubGVuZ3RoICA9IDg7Ci0JCXNmYi0+ZmIudmFyLnJlZC5vZmZzZXQgICA9IDE2OwotCQlzZmItPmZiLnZhci5ncmVlbi5vZmZzZXQgPSA4OwotCQlzZmItPmZiLnZhci5ibHVlLm9mZnNldCAgPSAwOwotCQlicmVhazsKLQljYXNlIDI0OgotCQlzZmItPmZiLmZpeC52aXN1YWwgICAgICAgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOwotCQlzZmItPmZiLmZpeC5saW5lX2xlbmd0aCAgPSBzZmItPmZiLnZhci54cmVzICogMzsKLQkJc2ZiLT5mYi52YXIucmVkLmxlbmd0aCAgID0gODsKLQkJc2ZiLT5mYi52YXIuZ3JlZW4ubGVuZ3RoID0gODsKLQkJc2ZiLT5mYi52YXIuYmx1ZS5sZW5ndGggID0gODsKLQkJc2ZiLT5mYi52YXIucmVkLm9mZnNldCAgID0gMTY7Ci0JCXNmYi0+ZmIudmFyLmdyZWVuLm9mZnNldCA9IDg7Ci0JCXNmYi0+ZmIudmFyLmJsdWUub2Zmc2V0ICA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJc2ZiLT5mYi5maXgudmlzdWFsICAgICAgID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOwotCQlzZmItPmZiLmZpeC5saW5lX2xlbmd0aCAgPSBzZmItPmZiLnZhci54cmVzOwotCQlzZmItPmZiLnZhci5yZWQubGVuZ3RoICAgPSAzOwotCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSAzOwotCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCAgPSAyOwotCQlzZmItPmZiLnZhci5yZWQub2Zmc2V0ICAgPSA1OwotCQlzZmItPmZiLnZhci5ncmVlbi5vZmZzZXQgPSAyOwotCQlzZmItPmZiLnZhci5ibHVlLm9mZnNldCAgPSAwOwotCQlicmVhazsKLQljYXNlIDE2OgotCWRlZmF1bHQ6Ci0JCXNmYi0+ZmIuZml4LnZpc3VhbCAgICAgICA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7Ci0JCXNmYi0+ZmIuZml4LmxpbmVfbGVuZ3RoICA9IHNmYi0+ZmIudmFyLnhyZXMgKiAyOwotCQlzZmItPmZiLnZhci5yZWQubGVuZ3RoICAgPSA1OwotCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSA2OwotCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCAgPSA1OwotCQlzZmItPmZiLnZhci5yZWQub2Zmc2V0ICAgPSAxMTsKLQkJc2ZiLT5mYi52YXIuZ3JlZW4ub2Zmc2V0ID0gNTsKLQkJc2ZiLT5mYi52YXIuYmx1ZS5vZmZzZXQgID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0Jc2ZiLT53aWR0aCAgPSBzZmItPmZiLnZhci54cmVzOwotCXNmYi0+aGVpZ2h0ID0gc2ZiLT5mYi52YXIueXJlczsKLQlzZmItPmh6ID0gNjA7Ci0Jc210Y19zZXRfdGltaW5nKHNmYik7Ci19Ci0KLXN0YXRpYyBpbnQgc210Y19jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCS8qIHNhbml0eSBjaGVja3MgKi8KLQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCi0JCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOwotCi0JaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQotCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKLQotCS8qIHNldCB2YWxpZCBkZWZhdWx0IGJwcCAqLwotCWlmICgodmFyLT5iaXRzX3Blcl9waXhlbCAhPSA4KSAgJiYgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gMTYpICYmCi0JICAgICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IDI0KSAmJiAodmFyLT5iaXRzX3Blcl9waXhlbCAhPSAzMikpCi0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNtdGNfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzbXRjZmJfc2V0bW9kZShpbmZvLT5wYXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNtdGNmYl9vcHMgPSB7Ci0JLm93bmVyICAgICAgICA9IFRISVNfTU9EVUxFLAotCS5mYl9jaGVja192YXIgPSBzbXRjX2NoZWNrX3ZhciwKLQkuZmJfc2V0X3BhciAgID0gc210Y19zZXRfcGFyLAotCS5mYl9zZXRjb2xyZWcgPSBzbXRjX3NldGNvbHJlZywKLQkuZmJfYmxhbmsgICAgID0gc210Y19ibGFuaywKLQkuZmJfZmlsbHJlY3QgID0gY2ZiX2ZpbGxyZWN0LAotCS5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0LAotCS5mYl9jb3B5YXJlYSAgPSBjZmJfY29weWFyZWEsCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0JLmZiX3JlYWQgICAgICA9IHNtdGNmYl9yZWFkLAotCS5mYl93cml0ZSAgICAgPSBzbXRjZmJfd3JpdGUsCi0jZW5kaWYKLX07Ci0KLS8qCi0gKiBhbGxvYyBzdHJ1Y3Qgc210Y2ZiX2luZm8gYW5kIGFzc2lnbiBkZWZhdWx0IHZhbHVlcwotICovCi1zdGF0aWMgc3RydWN0IHNtdGNmYl9pbmZvICpzbXRjX2FsbG9jX2ZiX2luZm8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IHNtdGNmYl9pbmZvICpzZmI7Ci0KLQlzZmIgPSBremFsbG9jKHNpemVvZigqc2ZiKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXNmYikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzZmItPnBkZXYgPSBwZGV2OwotCi0Jc2ZiLT5mYi5mbGFncyAgICAgICAgICA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7Ci0Jc2ZiLT5mYi5mYm9wcyAgICAgICAgICA9ICZzbXRjZmJfb3BzOwotCXNmYi0+ZmIuZml4ICAgICAgICAgICAgPSBzbXRjZmJfZml4OwotCXNmYi0+ZmIudmFyICAgICAgICAgICAgPSBzbXRjZmJfdmFyOwotCXNmYi0+ZmIucHNldWRvX3BhbGV0dGUgPSBzZmItPmNvbHJlZzsKLQlzZmItPmZiLnBhciAgICAgICAgICAgID0gc2ZiOwotCi0JcmV0dXJuIHNmYjsKLX0KLQotLyoKLSAqIGZyZWUgc3RydWN0IHNtdGNmYl9pbmZvCi0gKi8KLXN0YXRpYyB2b2lkIHNtdGNfZnJlZV9mYl9pbmZvKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCWtmcmVlKHNmYik7Ci19Ci0KLS8qCi0gKiBVbm1hcCBpbiB0aGUgbWVtb3J5IG1hcHBlZCBJTyByZWdpc3RlcnMKLSAqLwotCi1zdGF0aWMgdm9pZCBzbXRjX3VubWFwX21taW8oc3RydWN0IHNtdGNmYl9pbmZvICpzZmIpCi17Ci0JaWYgKHNmYiAmJiBzbXRjX1JlZ0Jhc2VBZGRyZXNzKQotCQlzbXRjX1JlZ0Jhc2VBZGRyZXNzID0gTlVMTDsKLX0KLQotLyoKLSAqIE1hcCBpbiB0aGUgc2NyZWVuIG1lbW9yeQotICovCi0KLXN0YXRpYyBpbnQgc210Y19tYXBfc21lbShzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYiwKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVfbG9uZyBzbWVtX2xlbikKLXsKLQotCXNmYi0+ZmIuZml4LnNtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0KLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpCi0JCXNmYi0+ZmIuZml4LnNtZW1fc3RhcnQgKz0gMHg4MDAwMDA7Ci0jZW5kaWYKLQotCXNmYi0+ZmIuZml4LnNtZW1fbGVuID0gc21lbV9sZW47Ci0KLQlzZmItPmZiLnNjcmVlbl9iYXNlID0gc2ZiLT5sZmI7Ci0KLQlpZiAoIXNmYi0+ZmIuc2NyZWVuX2Jhc2UpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiB1bmFibGUgdG8gbWFwIHNjcmVlbiBtZW1vcnlcbiIsIHNmYi0+ZmIuZml4LmlkKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBVbm1hcCBpbiB0aGUgc2NyZWVuIG1lbW9yeQotICoKLSAqLwotc3RhdGljIHZvaWQgc210Y191bm1hcF9zbWVtKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQotewotCWlmIChzZmIgJiYgc2ZiLT5mYi5zY3JlZW5fYmFzZSkgewotCQlpb3VubWFwKHNmYi0+ZmIuc2NyZWVuX2Jhc2UpOwotCQlzZmItPmZiLnNjcmVlbl9iYXNlID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiBXZSBuZWVkIHRvIHdha2UgdXAgdGhlIGRldmljZSBhbmQgbWFrZSBzdXJlIGl0cyBpbiBsaW5lYXIgbWVtb3J5IG1vZGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbTd4eF9pbml0X2h3KHZvaWQpCi17Ci0Jb3V0Yl9wKDB4MTgsIDB4M2M0KTsKLQlvdXRiX3AoMHgxMSwgMHgzYzUpOwotfQotCi1zdGF0aWMgaW50IHNtdGNmYl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQl1X2xvbmcgc21lbV9zaXplID0gMHgwMDgwMDAwMDsJLyogZGVmYXVsdCA4TUIgKi8KLQlpbnQgZXJyOwotCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOwotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIlNpbGljb24gTW90aW9uIGRpc3BsYXkgZHJpdmVyLiIpOwotCi0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CS8qIGVuYWJsZSBTTVRDIGNoaXAgKi8KLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0Jc3ByaW50ZihzbXRjZmJfZml4LmlkLCAic20lWGZiIiwgZW50LT5kZXZpY2UpOwotCi0Jc2ZiID0gc210Y19hbGxvY19mYl9pbmZvKHBkZXYpOwotCi0JaWYgKCFzZmIpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsZWRfZnJlZTsKLQl9Ci0KLQlzZmItPmNoaXBfaWQgPSBlbnQtPmRldmljZTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzZmIpOwotCi0Jc203eHhfaW5pdF9odygpOwotCi0JLyogZ2V0IG1vZGUgcGFyYW1ldGVyIGZyb20gc210Y19zY3JfaW5mbyAqLwotCWlmIChzbXRjX3Njcl9pbmZvLmxmYl93aWR0aCAhPSAwKSB7Ci0JCXNmYi0+ZmIudmFyLnhyZXMgPSBzbXRjX3Njcl9pbmZvLmxmYl93aWR0aDsKLQkJc2ZiLT5mYi52YXIueXJlcyA9IHNtdGNfc2NyX2luZm8ubGZiX2hlaWdodDsKLQkJc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPSBzbXRjX3Njcl9pbmZvLmxmYl9kZXB0aDsKLQl9IGVsc2UgewotCQkvKiBkZWZhdWx0IHJlc29sdXRpb24gMTAyNHg2MDAgMTZiaXQgbW9kZSAqLwotCQlzZmItPmZiLnZhci54cmVzID0gU0NSRUVOX1hfUkVTOwotCQlzZmItPmZiLnZhci55cmVzID0gU0NSRUVOX1lfUkVTOwotCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IFNDUkVFTl9CUFA7Ci0JfQotCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0JaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KQotCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IChzbXRjX3Njcl9pbmZvLmxmYl9kZXB0aCA9IDMyKTsKLSNlbmRpZgotCS8qIE1hcCBhZGRyZXNzIGFuZCBtZW1vcnkgZGV0ZWN0aW9uICovCi0JbW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnNmYi0+Y2hpcF9yZXZfaWQpOwotCi0Jc3dpdGNoIChzZmItPmNoaXBfaWQpIHsKLQljYXNlIDB4NzEwOgotCWNhc2UgMHg3MTI6Ci0JCXNmYi0+ZmIuZml4Lm1taW9fc3RhcnQgPSBtbWlvX2Jhc2UgKyAweDAwNDAwMDAwOwotCQlzZmItPmZiLmZpeC5tbWlvX2xlbiA9IDB4MDA0MDAwMDA7Ci0JCXNtZW1fc2l6ZSA9IFNNNzEyX1ZJREVPTUVNT1JZU0laRTsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJc2ZiLT5sZmIgPSBpb3JlbWFwKG1taW9fYmFzZSwgMHgwMGMwMDAwMCk7Ci0jZWxzZQotCQlzZmItPmxmYiA9IGlvcmVtYXAobW1pb19iYXNlLCAweDAwODAwMDAwKTsKLSNlbmRpZgotCQlzZmItPm1taW8gPSAoc210Y19SZWdCYXNlQWRkcmVzcyA9Ci0JCSAgICBzZmItPmxmYiArIDB4MDA3MDAwMDApOwotCQlzZmItPmRwX3JlZ3MgPSBzZmItPmxmYiArIDB4MDA0MDgwMDA7Ci0JCXNmYi0+dnBfcmVncyA9IHNmYi0+bGZiICsgMHgwMDQwYzAwMDsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDMyKSB7Ci0JCQlzZmItPmxmYiArPSAweDgwMDAwMDsKLQkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzZmItPmxmYj0lcCIsIHNmYi0+bGZiKTsKLQkJfQotI2VuZGlmCi0JCWlmICghc210Y19SZWdCYXNlQWRkcmVzcykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSIlczogdW5hYmxlIHRvIG1hcCBtZW1vcnkgbWFwcGVkIElPISIsCi0JCQkJc2ZiLT5mYi5maXguaWQpOwotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZmFpbGVkX2ZiOwotCQl9Ci0KLQkJLyogc2V0IE1DTEsgPSAxNC4zMTgxOCAqICgweDE2IC8gMHgyKSAqLwotCQlzbXRjX3NlcXcoMHg2YSwgMHgxNik7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJc210Y19zZXF3KDB4NjIsIDB4M2UpOwotCQkvKiBlbmFibGUgUENJIGJ1cnN0ICovCi0JCXNtdGNfc2VxdygweDE3LCAweDIwKTsKLQkJLyogZW5hYmxlIHdvcmQgc3dhcCAqLwotI2lmZGVmIF9fQklHX0VORElBTgotCQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpCi0JCQlzbXRjX3NlcXcoMHgxNywgMHgzMCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSAweDcyMDoKLQkJc2ZiLT5mYi5maXgubW1pb19zdGFydCA9IG1taW9fYmFzZTsKLQkJc2ZiLT5mYi5maXgubW1pb19sZW4gPSAweDAwMjAwMDAwOwotCQlzbWVtX3NpemUgPSBTTTcyMl9WSURFT01FTU9SWVNJWkU7Ci0JCXNmYi0+ZHBfcmVncyA9IGlvcmVtYXAobW1pb19iYXNlLCAweDAwYTAwMDAwKTsKLQkJc2ZiLT5sZmIgPSBzZmItPmRwX3JlZ3MgKyAweDAwMjAwMDAwOwotCQlzZmItPm1taW8gPSAoc210Y19SZWdCYXNlQWRkcmVzcyA9Ci0JCSAgICBzZmItPmRwX3JlZ3MgKyAweDAwMGMwMDAwKTsKLQkJc2ZiLT52cF9yZWdzID0gc2ZiLT5kcF9yZWdzICsgMHg4MDA7Ci0KLQkJc210Y19zZXF3KDB4NjIsIDB4ZmYpOwotCQlzbXRjX3NlcXcoMHg2YSwgMHgwZCk7Ci0JCXNtdGNfc2VxdygweDZiLCAweDAyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIk5vIHZhbGlkIFNpbGljb24gTW90aW9uIGRpc3BsYXkgY2hpcCB3YXMgZGV0ZWN0ZWQhIik7Ci0KLQkJZ290byBmYWlsZWRfZmI7Ci0JfQotCi0JLyogY2FuIHN1cHBvcnQgMzIgYnBwICovCi0JaWYgKDE1ID09IHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKQotCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IDE2OwotCi0Jc2ZiLT5mYi52YXIueHJlc192aXJ0dWFsID0gc2ZiLT5mYi52YXIueHJlczsKLQlzZmItPmZiLnZhci55cmVzX3ZpcnR1YWwgPSBzZmItPmZiLnZhci55cmVzOwotCWVyciA9IHNtdGNfbWFwX3NtZW0oc2ZiLCBwZGV2LCBzbWVtX3NpemUpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbGVkOwotCi0Jc210Y2ZiX3NldG1vZGUoc2ZiKTsKLQotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZzZmItPmZiKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBmYWlsZWQ7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LAotCQkgIlNpbGljb24gTW90aW9uIFNNJVggUmV2JVggcHJpbWFyeSBkaXNwbGF5IG1vZGUgJWR4JWQtJWQgSW5pdCBDb21wbGV0ZS4iLAotCQkgc2ZiLT5jaGlwX2lkLCBzZmItPmNoaXBfcmV2X2lkLCBzZmItPmZiLnZhci54cmVzLAotCQkgc2ZiLT5mYi52YXIueXJlcywgc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwpOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWxlZDoKLQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTaWxpY29uIE1vdGlvbiwgSW5jLiBwcmltYXJ5IGRpc3BsYXkgaW5pdCBmYWlsLiIpOwotCi0Jc210Y191bm1hcF9zbWVtKHNmYik7Ci0Jc210Y191bm1hcF9tbWlvKHNmYik7Ci1mYWlsZWRfZmI6Ci0Jc210Y19mcmVlX2ZiX2luZm8oc2ZiKTsKLQotZmFpbGVkX2ZyZWU6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIDB4NzEwIChMeW54RU0pCi0gKiAweDcxMiAoTHlueEVNKykKLSAqIDB4NzIwIChMeW54M0RNLCBMeW54M0RNKykKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNtdGNmYl9wY2lfdGFibGVbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoMHgxMjZmLCAweDcxMCksIH0sCi0JeyBQQ0lfREVWSUNFKDB4MTI2ZiwgMHg3MTIpLCB9LAotCXsgUENJX0RFVklDRSgweDEyNmYsIDB4NzIwKSwgfSwKLQl7MCx9Ci19OwotCi1zdGF0aWMgdm9pZCBzbXRjZmJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQotCXNmYiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzbXRjX3VubWFwX3NtZW0oc2ZiKTsKLQlzbXRjX3VubWFwX21taW8oc2ZiKTsKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZzZmItPmZiKTsKLQlzbXRjX2ZyZWVfZmJfaW5mbyhzZmIpOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNtdGNmYl9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IHNtdGNmYl9pbmZvICpzZmI7Ci0KLQlzZmIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQkvKiBzZXQgdGhlIGh3IGluIHNsZWVwIG1vZGUgdXNlIGV4dGVybmFsIGNsb2NrIGFuZCBzZWxmIG1lbW9yeSByZWZyZXNoCi0JICogc28gdGhhdCB3ZSBjYW4gdHVybiBvZmYgaW50ZXJuYWwgUExMcyBsYXRlciBvbgotCSAqLwotCXNtdGNfc2VxdygweDIwLCAoc210Y19zZXFyKDB4MjApIHwgMHhjMCkpOwotCXNtdGNfc2VxdygweDY5LCAoc210Y19zZXFyKDB4NjkpICYgMHhmNykpOwotCi0JY29uc29sZV9sb2NrKCk7Ci0JZmJfc2V0X3N1c3BlbmQoJnNmYi0+ZmIsIDEpOwotCWNvbnNvbGVfdW5sb2NrKCk7Ci0KLQkvKiBhZGRpdGlvbmFsbHkgdHVybiBvZmYgYWxsIGZ1bmN0aW9uIGJsb2NrcyBpbmNsdWRpbmcgaW50ZXJuYWwgUExMcyAqLwotCXNtdGNfc2VxdygweDIxLCAweGZmKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNtdGNmYl9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKLQotCXNmYiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qIHJlaW5pdCBoYXJkd2FyZSAqLwotCXNtN3h4X2luaXRfaHcoKTsKLQlzd2l0Y2ggKHNmYi0+Y2hpcF9pZCkgewotCWNhc2UgMHg3MTA6Ci0JY2FzZSAweDcxMjoKLQkJLyogc2V0IE1DTEsgPSAxNC4zMTgxOCAqICAoMHgxNiAvIDB4MikgKi8KLQkJc210Y19zZXF3KDB4NmEsIDB4MTYpOwotCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7Ci0JCXNtdGNfc2VxdygweDYyLCAweDNlKTsKLQkJLyogZW5hYmxlIFBDSSBidXJzdCAqLwotCQlzbXRjX3NlcXcoMHgxNywgMHgyMCk7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCWlmIChzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9PSAzMikKLQkJCXNtdGNfc2VxdygweDE3LCAweDMwKTsKLSNlbmRpZgotCQlicmVhazsKLQljYXNlIDB4NzIwOgotCQlzbXRjX3NlcXcoMHg2MiwgMHhmZik7Ci0JCXNtdGNfc2VxdygweDZhLCAweDBkKTsKLQkJc210Y19zZXF3KDB4NmIsIDB4MDIpOwotCQlicmVhazsKLQl9Ci0KLQlzbXRjX3NlcXcoMHgzNCwgKHNtdGNfc2VxcigweDM0KSB8IDB4YzApKTsKLQlzbXRjX3NlcXcoMHgzMywgKChzbXRjX3NlcXIoMHgzMykgfCAweDA4KSAmIDB4ZmIpKTsKLQotCXNtdGNmYl9zZXRtb2RlKHNmYik7Ci0KLQljb25zb2xlX2xvY2soKTsKLQlmYl9zZXRfc3VzcGVuZCgmc2ZiLT5mYiwgMCk7Ci0JY29uc29sZV91bmxvY2soKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoc203eHhfcG1fb3BzLCBzbXRjZmJfcGNpX3N1c3BlbmQsIHNtdGNmYl9wY2lfcmVzdW1lKTsKLSNkZWZpbmUgU003WFhfUE1fT1BTICgmc203eHhfcG1fb3BzKQotCi0jZWxzZSAgLyogIUNPTkZJR19QTSAqLwotCi0jZGVmaW5lIFNNN1hYX1BNX09QUyBOVUxMCi0KLSNlbmRpZiAvKiAhQ09ORklHX1BNICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzbXRjZmJfZHJpdmVyID0gewotCS5uYW1lID0gInNtdGNmYiIsCi0JLmlkX3RhYmxlID0gc210Y2ZiX3BjaV90YWJsZSwKLQkucHJvYmUgPSBzbXRjZmJfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBzbXRjZmJfcGNpX3JlbW92ZSwKLQkuZHJpdmVyLnBtICA9IFNNN1hYX1BNX09QUywKLX07Ci0KLW1vZHVsZV9wY2lfZHJpdmVyKHNtdGNmYl9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJTaWxpY29ubW90aW9uICIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIFNNSSBHcmFwaGljIENhcmRzIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc2VyaWFsaW8uYwppbmRleCA0ZTE4ZmI0Li5jNjJkNzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NlcmlhbGlvLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOwogCWlmIChzeW50aF9yZXF1ZXN0X3JlZ2lvbihzZXItPnBvcnQsIDgpKSB7CiAJCS8qIHRyeSB0byB0YWtlIGl0IGJhY2suICovCi0JCXByaW50ayhLRVJOX0lORk8gIlBvcnRzIG5vdCBhdmFpbGFibGUsIHRyeWluZyB0byBzdGVhbCB0aGVtXG4iKTsKKwkJcHJfaW5mbygiUG9ydHMgbm90IGF2YWlsYWJsZSwgdHJ5aW5nIHRvIHN0ZWFsIHRoZW1cbiIpOwogCQlfX3JlbGVhc2VfcmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIHNlci0+cG9ydCwgOCk7CiAJCWVyciA9IHN5bnRoX3JlcXVlc3RfcmVnaW9uKHNlci0+cG9ydCwgOCk7CiAJCWlmIChlcnIpIHsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQkJICJzZXJpYWwiLCAodm9pZCAqKSBzeW50aF9yZWFkYnVmX2hhbmRsZXIpOwogCiAJaWYgKHJ2KQotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZXF1ZXN0IFNwZWFrdXAgc2VyaWFsIEkgUiBRXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gcmVxdWVzdCBTcGVha3VwIHNlcmlhbCBJIFIgUVxuIik7CiAJLyogU2V0IE1DUiAqLwogCW91dGIoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMiwKIAkJCXNwZWFrdXBfaW5mby5wb3J0X3R0cyArIFVBUlRfTUNSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY3Rsay5jCmluZGV4IDE1ZmRlYzMuLjc1NmQwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWN0bGsuYwpAQCAtMjcwLDEwICsyNzAsMTIgQEAKIAkJCWlmIChqaWZmaWVzID49IGppZmZfbWF4KSB7CiAJCQkJaWYgKCFpbl9lc2NhcGUpCiAJCQkJCXNwa19zZXJpYWxfb3V0KFBST0NTUEVFQ0gpOwotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLAorCQkJCQkJZmxhZ3MpOwogCQkJCWppZmZ5X2RlbHRhX3ZhbCA9IGppZmZ5X2RlbHRhLT51Lm4udmFsdWU7CiAJCQkJZGVsYXlfdGltZV92YWwgPSBkZWxheV90aW1lLT51Lm4udmFsdWU7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLAorCQkJCQkJZmxhZ3MpOwogCQkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcwogCQkJCQkJIChkZWxheV90aW1lX3ZhbCkpOwogCQkJCWppZmZfbWF4ID0gamlmZmllcyArIGppZmZ5X2RlbHRhX3ZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcKaW5kZXggMWI2ZDU4MS4uYjVlNzRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL0tjb25maWcKQEAgLTE3LDcgKzE3LDcgQEAKIAogY29uZmlnIFRJRFNQQlJJREdFX0RWRlMKIAlib29sICJFbmFibGUgQnJpZGdlIER5bmFtaWMgVm9sdGFnZSBhbmQgRnJlcXVlbmN5IFNjYWxpbmcgKERWRlMpIgotCWRlcGVuZHMgb24gVElEU1BCUklER0UgJiYgT01BUF9QTV9TUkYgJiYgQ1BVX0ZSRVEKKwlkZXBlbmRzIG9uIFRJRFNQQlJJREdFICYmIENQVV9GUkVRCiAJaGVscAogCSAgRFZGUyBhbGxvd3MgRFNQIEJyaWRnZSB0byBpbml0aWF0ZSB0aGUgb3BlcmF0aW5nIHBvaW50IGNoYW5nZSB0bwogCSAgc2NhbGUgdGhlIGNoaXAgdm9sdGFnZSBhbmQgZnJlcXVlbmN5IGluIG9yZGVyIHRvIG1hdGNoIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvaW9fc20uYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL2lvX3NtLmMKaW5kZXggZTMyMmZiNy4uYzI4MjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvaW9fc20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9pb19zbS5jCkBAIC0yMTI3LDcgKzIxMjcsNyBAQAogCXUzMiBtb2R1bGVfc2l6ZTsKIAl1MzIgbW9kdWxlX3N0cnVjdF9zaXplID0gMDsKIAl1MzIgc2VjdF9uZHg7Ci0JY2hhciAqc2VjdF9zdHIgOworCWNoYXIgKnNlY3Rfc3RyOwogCWludCBzdGF0dXMgPSAwOwogCiAJc3RhdHVzID0gZGV2X2dldF9pbnRmX2Z4bnMoZGV2X29iamVjdCwgJmludGZfZnhucyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMKaW5kZXggYjc3MGIyMi4uODk0NWI0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYwpAQCAtMjgwLDkgKzI4MCw4IEBACiAJCQkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9DTV9DTEtTVENUUkwpOwogCiAJCS8qIFdhaXQgdW50aWwgdGhlIHN0YXRlIGhhcyBtb3ZlZCB0byBPTiAqLwotCQl3aGlsZSAoKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVFNUKSAmCi0JCQkJCQlPTUFQX0lOVFJBTlNJVElPTl9NQVNLKQotCQkJOworCQl3aGlsZSAoKnBkYXRhLT5kc3BfcHJtX3JlYWQoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX1BNX1BXU1RTVCkmCisJCQkJCU9NQVBfSU5UUkFOU0lUSU9OX01BU0spOwogCQkvKiBEaXNhYmxlIEF1dG9tYXRpYyB0cmFuc2l0aW9uICovCiAJCSgqcGRhdGEtPmRzcF9jbV93cml0ZSkoT01BUDM0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTywKIAkJCQkJT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAyX0NNX0NMS1NUQ1RSTCk7CkBAIC00MTksNyArNDE4LDggQEAKIAkJLyogQXNzZXJ0IFJTVDEgaS5lIG9ubHkgdGhlIFJTVCBvbmx5IGZvciBEU1AgbWVnYWNlbGwgKi8KIAkJaWYgKCFzdGF0dXMpIHsKIAkJCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLLAotCQkJCQlPTUFQMzQzMF9SU1QxX0lWQTJfTUFTSywgT01BUDM0MzBfSVZBMl9NT0QsCisJCQkJCU9NQVAzNDMwX1JTVDFfSVZBMl9NQVNLLAorCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwKIAkJCQkJT01BUDJfUk1fUlNUQ1RSTCk7CiAKIAkJCS8qIE1hc2sgYWRkcmVzcyB3aXRoIDFLIGZvciBjb21wYXRpYmlsaXR5ICovCkBAIC00MzIsNyArNDMyLDggQEAKIAkJLyogUmVzZXQgYW5kIFVucmVzZXQgdGhlIFJTVDIsIHNvIHRoYXQgQk9PVEFERFIgaXMgY29waWVkIHRvCiAJCSAqIElWQTIgU1lTQyByZWdpc3RlciAqLwogCQkoKnBkYXRhLT5kc3BfcHJtX3Jtd19iaXRzKShPTUFQMzQzMF9SU1QyX0lWQTJfTUFTSywKLQkJCU9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLCBPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CisJCQlPTUFQMzQzMF9SU1QyX0lWQTJfTUFTSywgT01BUDM0MzBfSVZBMl9NT0QsCisJCQlPTUFQMl9STV9SU1RDVFJMKTsKIAkJdWRlbGF5KDEwMCk7CiAJCSgqcGRhdGEtPmRzcF9wcm1fcm13X2JpdHMpKE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLLCAwLAogCQkJCQlPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CkBAIC00NDYsNyArNDQ3LDggQEAKIAkJLyogT25seSBtYWtlIFRMQiBlbnRyeSBpZiBib3RoIGFkZHJlc3NlcyBhcmUgbm9uLXplcm8gKi8KIAkJZm9yIChlbnRyeV9uZHggPSAwOyBlbnRyeV9uZHggPCBCUkRJT0NUTF9OVU1PRk1NVVRMQjsKIAkJICAgICBlbnRyeV9uZHgrKykgewotCQkJc3RydWN0IGJyaWRnZV9pb2N0bF9leHRwcm9jICplID0gJmRldl9jb250ZXh0LT5hdGxiX2VudHJ5W2VudHJ5X25keF07CisJCQlzdHJ1Y3QgYnJpZGdlX2lvY3RsX2V4dHByb2MgKmUgPQorCQkJCSZkZXZfY29udGV4dC0+YXRsYl9lbnRyeVtlbnRyeV9uZHhdOwogCQkJc3RydWN0IGh3X21tdV9tYXBfYXR0cnNfdCBtYXBfYXR0cnMgPSB7CiAJCQkJLmVuZGlhbmlzbSA9IGUtPmVuZGlhbmlzbSwKIAkJCQkuZWxlbWVudF9zaXplID0gZS0+ZWxlbV9zaXplLApAQCAtNjQxLDggKzY0Myw4IEBACiAJLyogYXMgcGVyIFRSTSwgaXQgaXMgYWR2aXNlZCB0byBmaXJzdCBkcml2ZSB0aGUgSVZBMiB0byAnU3RhbmRieScgbW9kZSwKIAkgKiBiZWZvcmUgdHVybmluZyBvZmYgdGhlIGNsb2Nrcy4uIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vCiAJICogcGVuZGluZyBMMyBvciBvdGhlciB0cmFuc2FjdG9ucyBmcm9tIElWQTIgKi8KLQlkc3BfcHdyX3N0YXRlID0gKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUE1fUFdTVFNUKSAmCi0JCQkJCU9NQVBfUE9XRVJTVEFURVNUX01BU0s7CisJZHNwX3B3cl9zdGF0ZSA9ICgqcGRhdGEtPmRzcF9wcm1fcmVhZCkKKwkJKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9QTV9QV1NUU1QpICYgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKIAlpZiAoZHNwX3B3cl9zdGF0ZSAhPSBQV1JETV9QT1dFUl9PRkYpIHsKIAkJKCpwZGF0YS0+ZHNwX3BybV9ybXdfYml0cykoT01BUDM0MzBfUlNUMl9JVkEyX01BU0ssIDAsCiAJCQkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKQEAgLTY4Miw4ICs2ODQsOSBAQAogCQlkZXZfY29udGV4dC0+bWJveCA9IE5VTEw7CiAJfQogCS8qIFJlc2V0IElWQTIgY2xvY2tzKi8KLQkoKnBkYXRhLT5kc3BfcHJtX3dyaXRlKShPTUFQMzQzMF9SU1QxX0lWQTJfTUFTSyB8IE9NQVAzNDMwX1JTVDJfSVZBMl9NQVNLIHwKLQkJCU9NQVAzNDMwX1JTVDNfSVZBMl9NQVNLLCBPTUFQMzQzMF9JVkEyX01PRCwgT01BUDJfUk1fUlNUQ1RSTCk7CisJKCpwZGF0YS0+ZHNwX3BybV93cml0ZSkoT01BUDM0MzBfUlNUMV9JVkEyX01BU0sgfAorCQkJT01BUDM0MzBfUlNUMl9JVkEyX01BU0sgfCBPTUFQMzQzMF9SU1QzX0lWQTJfTUFTSywKKwkJCU9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMl9STV9SU1RDVFJMKTsKIAogCWRzcF9jbG9ja19kaXNhYmxlX2FsbChkZXZfY29udGV4dC0+ZHNwX3Blcl9jbGtzKTsKIAlkc3BfY2xrX2Rpc2FibGUoRFNQX0NMS19JVkEyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzBfcHdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwX3B3ci5jCmluZGV4IDE4NjJhZmQuLjY1NzEwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzBfcHdyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMF9wd3IuYwpAQCAtOTksNyArOTksOCBAQAogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQogCQlwd3Jfc3RhdGUgPSAoKnBkYXRhLT5kc3BfcHJtX3JlYWQpKE9NQVAzNDMwX0lWQTJfTU9ELAotCQkJCQlPTUFQMl9QTV9QV1NUU1QpICYgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKKwkJCQkJCSAgIE9NQVAyX1BNX1BXU1RTVCkgJgorCQkJCQkJICAgT01BUF9QT1dFUlNUQVRFU1RfTUFTSzsKIAl9CiAJaWYgKHRpbWVvdXQgPT0gMCkgewogCQlwcl9lcnIoIiVzOiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgRFNQIG9mZiBtb2RlXG4iLCBfX2Z1bmNfXyk7CkBAIC0yMDksNyArMjEwLDggQEAKIAkJCXJldHVybiAtRVBFUk07CiAJCX0KIAkJcHdyX3N0YXRlID0gKCpwZGF0YS0+ZHNwX3BybV9yZWFkKShPTUFQMzQzMF9JVkEyX01PRCwKLQkJCQkJT01BUDJfUE1fUFdTVFNUKSAmIE9NQVBfUE9XRVJTVEFURVNUX01BU0s7CisJCQkJCQkgICBPTUFQMl9QTV9QV1NUU1QpICYKKwkJCQkJCSAgIE9NQVBfUE9XRVJTVEFURVNUX01BU0s7CiAJfQogCiAJaWYgKCF0aW1lb3V0KSB7CkBAIC0zNTUsNyArMzU3LDcgQEAKIAkgICAgKGRldl9jb250ZXh0LT5icmRfc3RhdGUgPT0gQlJEX0RTUF9ISUJFUk5BVElPTikpIHsKIAkJZGV2X2RiZyhicmlkZ2UsICJPUFA6ICVzIElWQSBpbiBzbGVlcC4gTm8gbWVzc2FnZSB0byBEU1BcbiIpOwogCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKChkZXZfY29udGV4dC0+YnJkX3N0YXRlID09IEJSRF9SVU5OSU5HKSkgeworCX0gZWxzZSBpZiAoZGV2X2NvbnRleHQtPmJyZF9zdGF0ZSA9PSBCUkRfUlVOTklORykgewogCQkvKiBTZW5kIGEgcHJlbm90aWZpY2F0aW9uIHRvIERTUCAqLwogCQlkZXZfZGJnKGJyaWRnZSwgIk9QUDogJXMgc2VudCBub3RpZmljYXRpb24gdG8gRFNQXG4iLCBfX2Z1bmNfXyk7CiAJCXNtX2ludGVycnVwdF9kc3AoZGV2X2NvbnRleHQsIE1CWF9QTV9TRVRQT0lOVF9QUkVOT1RJRlkpOwpAQCAtMzk2LDEzICszOTgsMTQgQEAKIAkJaW9fc2hfbXNldHRpbmcoaGlvX21nciwgU0hNX0NVUlJPUFAsICZsZXZlbCk7CiAJCWRldl9kYmcoYnJpZGdlLCAiT1BQOiAlcyBJVkEgaW4gc2xlZXAuIFdyb3RlIHRvIHNobVxuIiwKIAkJCV9fZnVuY19fKTsKLQl9IGVsc2UgaWYgKChkZXZfY29udGV4dC0+YnJkX3N0YXRlID09IEJSRF9SVU5OSU5HKSkgeworCX0gZWxzZSBpZiAoZGV2X2NvbnRleHQtPmJyZF9zdGF0ZSA9PSBCUkRfUlVOTklORykgewogCQkvKiBVcGRhdGUgdGhlIE9QUCB2YWx1ZSBpbiBzaGFyZWQgbWVtb3J5ICovCiAJCWlvX3NoX21zZXR0aW5nKGhpb19tZ3IsIFNITV9DVVJST1BQLCAmbGV2ZWwpOwogCQkvKiBTZW5kIGEgcG9zdCBub3RpZmljYXRpb24gdG8gRFNQICovCiAJCXNtX2ludGVycnVwdF9kc3AoZGV2X2NvbnRleHQsIE1CWF9QTV9TRVRQT0lOVF9QT1NUTk9USUZZKTsKLQkJZGV2X2RiZyhicmlkZ2UsICJPUFA6ICVzIHdyb3RlIHRvIHNobS4gU2VudCBwb3N0IG5vdGlmaWNhdGlvbiAiCi0JCQkidG8gRFNQXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoYnJpZGdlLAorCQkJIk9QUDogJXMgd3JvdGUgdG8gc2htLiBTZW50IHBvc3Qgbm90aWZpY2F0aW9uIHRvIERTUFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJc3RhdHVzID0gLUVQRVJNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZHlubG9hZC90cmFtcC5jCmluZGV4IDQwNGFmMTguLjVmMDQzMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9keW5sb2FkL3RyYW1wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2R5bmxvYWQvdHJhbXAuYwpAQCAtNTAzLDcgKzUwMyw3IEBACiAgKgkgIFRSQU1QT0xJTkVTIEFSRSBUUkVBVEVEIEFTIDJORCBQQVNTIGV2ZW4gdGhvdWdoIHRoaXMgaXMgcmVhbGx5CiAgKgkgIHRoZSBmaXJzdCAoYW5kIG9ubHkpIHJlbG9jYXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGVtLgogICovCi1zdGF0aWMgaW50IHByaXZfcGt0X3JlbG8oc3RydWN0IGRsb2FkX3N0YXRlICpkbHRoaXMsIHRndF9hdV90ICogZGF0YSwKK3N0YXRpYyBpbnQgcHJpdl9wa3RfcmVsbyhzdHJ1Y3QgZGxvYWRfc3RhdGUgKmRsdGhpcywgdGd0X2F1X3QgKmRhdGEsCiAJCQkgc3RydWN0IHJlbG9jX3JlY29yZF90ICpycFtdLCB1MzIgcmVsb19jb3VudCkKIHsKIAlpbnQgcmV0X3ZhbCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kYmRjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZGJkY2QuYwppbmRleCAxOTBjYTNmLi4yYWU0OGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kYmRjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2RiZGNkLmMKQEAgLTEwMSwxNCArMTAxLDE0IEBACiAJICogaWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBkb2Vzbid0IGZpdCBpbiB1MzIuIFNvLCBjb252ZXJ0IHRoZQogCSAqIGxhc3Qgc2l4IGJ5dGVzIHRvIHU2NCBhbmQgbWVtY3B5IHdoYXQgaXMgbmVlZGVkCiAJICovCi0JaWYoc3NjYW5mKHN6X3V1aWQsICIlOHglYyU0aHglYyU0aHglYyUyaGh4JTJoaHglYyVsbHgiLAorCWlmIChzc2NhbmYoc3pfdXVpZCwgIiU4eCVjJTRoeCVjJTRoeCVjJTJoaHglMmhoeCVjJWxseCIsCiAJICAgICAgICZ1dWlkX3RtcC5kYXRhMSwgJmMsICZ1dWlkX3RtcC5kYXRhMiwgJmMsCiAJICAgICAgICZ1dWlkX3RtcC5kYXRhMywgJmMsICZ1dWlkX3RtcC5kYXRhNCwKIAkgICAgICAgJnV1aWRfdG1wLmRhdGE1LCAmYywgJnQpICE9IDEwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXQgPSBjcHVfdG9fYmU2NCh0KTsKLQltZW1jcHkoJnV1aWRfdG1wLmRhdGE2WzBdLCAoKGNoYXIqKSZ0KSArIDIsIDYpOworCW1lbWNweSgmdXVpZF90bXAuZGF0YTZbMF0sICgoY2hhciAqKSZ0KSArIDIsIDYpOwogCSp1dWlkX29iaiA9IHV1aWRfdG1wOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jCmluZGV4IGJlMjY5MTcuLjc1N2FlMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydi5jCkBAIC03MzgsNyArNzM4LDcgQEAKICAqICAgICBBbGxvY2F0ZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMsIHVuY2FjaGVkIG1lbW9yeSBmcm9tIGV4dGVybmFsIG1lbW9yeSBwb29sCiAgKi8KIAotc3RhdGljIHZvaWQgKm1lbV9leHRfcGh5c19tZW1fYWxsb2ModTMyIGJ5dGVzLCB1MzIgYWxpZ24sIHUzMiAqIHBoeXNfYWRkcikKK3N0YXRpYyB2b2lkICptZW1fZXh0X3BoeXNfbWVtX2FsbG9jKHUzMiBieXRlcywgdTMyIGFsaWduLCB1MzIgKnBoeXNfYWRkcikKIHsKIAl1MzIgbmV3X2FsbG9jX3B0cjsKIAl1MzIgb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYwppbmRleCBiMzJiYTBhLi45M2U2MjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9tZ3IuYwpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKIAkJCSAqIHRoaXMgaXMgYSBjbHVtc3kgb3ZlcndyaXRlICovCiAJCQlwcm9jZXNzb3JfaW5mby0+cHJvY2Vzc29yX3R5cGUgPSBEU1BUWVBFNjQ7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gZ2V0IERDRCBwcm9jZXNzb3IgaW5mbyAiCi0JCQkJIiV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzMik7CisJCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gZ2V0IERDRCBwcm9jZXNzb3IgaW5mbyAleFxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1czIpOwogCQkJc3RhdHVzID0gLUVQRVJNOwogCQl9CiAJfQogCSpwdV9udW1fcHJvY3MgPSBwcm9jX2luZGV4OwogCWlmIChwcm9jX2RldGVjdCA9PSBmYWxzZSkgewotCQlkZXZfZGJnKGJyaWRnZSwgIiVzOiBGYWlsZWQgdG8gZ2V0IHByb2MgaW5mbyBmcm9tIERDRCwgc28gdXNlICIKLQkJCSJDRkcgcmVnaXN0cnlcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZyhicmlkZ2UsICIlczogRmFpbGVkIHRvIGdldCBwcm9jIGluZm8gZnJvbSBEQ0QsIHNvIHVzZSBDRkcgcmVnaXN0cnlcbiIsCisJCQkJX19mdW5jX18pOwogCQlwcm9jZXNzb3JfaW5mby0+cHJvY2Vzc29yX3R5cGUgPSBEU1BUWVBFNjQ7CiAJfQogZnVuY19lbmQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMKaW5kZXggY2EzODA1MC4uNWFjNTA3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYwpAQCAtNjIzLDcgKzYyMyw3IEBACiAgKiAgPT09PT09PT0gbmxkcl9nZXRfZnhuX2FkZHIgPT09PT09PT0KICAqLwogaW50IG5sZHJfZ2V0X2Z4bl9hZGRyKHN0cnVjdCBubGRyX25vZGVvYmplY3QgKm5sZHJfbm9kZV9vYmosCi0JCQkgICAgIGNoYXIgKnN0cl9meG4sIHUzMiAqIGFkZHIpCisJCQkgICAgIGNoYXIgKnN0cl9meG4sIHUzMiAqYWRkcikKIHsKIAlzdHJ1Y3QgZGJsbF9zeW1fdmFsICpkYmxsX3N5bTsKIAlzdHJ1Y3Qgbmxkcl9vYmplY3QgKm5sZHJfb2JqOwpAQCAtMTc1MSw5ICsxNzUxLDggQEAKIAl9CiAJaWYgKHJlZl9jb3VudCAmJiAoKnJlZl9jb3VudCA+IDApKSB7CiAJCSpyZWZfY291bnQgLT0gMTsKLQkJaWYgKG90aGVyX3JlZikgeworCQlpZiAob3RoZXJfcmVmKQogCQkJKm90aGVyX3JlZiAtPSAxOwotCQl9CiAJfQogCiAJaWYgKHJlZl9jb3VudCAmJiAqcmVmX2NvdW50ID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25vZGUuYwppbmRleCA4N2RmYTkyLi45ZDMwNDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ub2RlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbm9kZS5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAkJCSAgICBzdHJ1Y3Qgbm9kZV9zdHJtZGVmICpwc3RybV9kZWYsCiAJCQkgICAgc3RydWN0IGRzcF9zdHJtYXR0ciAqcGF0dHJzKTsKIHN0YXRpYyB2b2lkIGZyZWVfc3RyZWFtKHN0cnVjdCBub2RlX21nciAqaG5vZGVfbWdyLCBzdHJ1Y3Qgc3RyZWFtX2Nobmwgc3RyZWFtKTsKLXN0YXRpYyBpbnQgZ2V0X2Z4bl9hZGRyZXNzKHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsIHUzMiAqIGZ4bl9hZGRyLAorc3RhdGljIGludCBnZXRfZnhuX2FkZHJlc3Moc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyICpmeG5fYWRkciwKIAkJCQkgIHUzMiBwaGFzZSk7CiBzdGF0aWMgaW50IGdldF9ub2RlX3Byb3BzKHN0cnVjdCBkY2RfbWFuYWdlciAqaGRjZF9tZ3IsCiAJCQkJIHN0cnVjdCBub2RlX29iamVjdCAqaG5vZGUsCkBAIC00MDYsNyArNDA2LDcgQEAKIAogCS8qIGNoZWNrIGZvciBwYWdlIGFsaWduZWQgSGVhcCBzaXplICovCiAJaWYgKCgoYXR0cl9pbi0+aGVhcF9zaXplKSAmIChQR19TSVpFNEsgLSAxKSkpIHsKLQkJcHJfZXJyKCIlczogbm9kZSBoZWFwIHNpemUgbm90IGFsaWduZWQgdG8gNEssIHNpemUgPSAweCV4IFxuIiwKKwkJcHJfZXJyKCIlczogbm9kZSBoZWFwIHNpemUgbm90IGFsaWduZWQgdG8gNEssIHNpemUgPSAweCV4XG4iLAogCQkgICAgICAgX19mdW5jX18sIGF0dHJfaW4tPmhlYXBfc2l6ZSk7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJfSBlbHNlIHsKQEAgLTcwMyw5ICs3MDMsOSBAQAogCQlwYXR0ciA9ICZub2RlX2RmbHRidWZhdHRyczsJLyogc2V0IGRlZmF1bHRzICovCiAKIAlzdGF0dXMgPSBwcm9jX2dldF9wcm9jZXNzb3JfaWQocG5vZGUtPnByb2Nlc3NvciwgJnByb2NfaWQpOwotCWlmIChwcm9jX2lkICE9IERTUF9VTklUKSB7CisJaWYgKHByb2NfaWQgIT0gRFNQX1VOSVQpCiAJCWdvdG8gZnVuY19lbmQ7Ci0JfQorCiAJLyogIElmIHNlZ21lbnQgSUQgaW5jbHVkZXMgTUVNX1NFVFZJUlRVQUxTRUdJRCB0aGVuIHBidWZmZXIgaXMgYQogCSAqICB2aXJ0ICBhZGRyZXNzLCBzbyBzZXQgdGhpcyBpbmZvIGluIHRoaXMgbm9kZSdzIHRyYW5zbGF0b3IKIAkgKiAgb2JqZWN0IGZvciAgZnV0dXJlIHJlZi4gSWYgTUVNX0dFVFZJUlRVQUxTRUdJRCB0aGVuIHJldHJpZXZlCkBAIC04ODYsMTEgKzg4NiwxMCBAQAogCWlmIChwYXR0cnMgJiYgcGF0dHJzLT5zdHJtX21vZGUgIT0gU1RSTU1PREVfUFJPQ0NPUFkpCiAJCXJldHVybiAtRVBFUk07CS8qIGlsbGVnYWwgc3RyZWFtIG1vZGUgKi8KIAotCWlmIChub2RlMV90eXBlICE9IE5PREVfR1BQKSB7CisJaWYgKG5vZGUxX3R5cGUgIT0gTk9ERV9HUFApCiAJCWhub2RlX21nciA9IG5vZGUxLT5ub2RlX21ncjsKLQl9IGVsc2UgeworCWVsc2UKIAkJaG5vZGVfbWdyID0gbm9kZTItPm5vZGVfbWdyOwotCX0KIAogCS8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KIAltdXRleF9sb2NrKCZobm9kZV9tZ3ItPm5vZGVfbWdyX2xvY2spOwpAQCAtMTU3Niw3ICsxNTc1LDcgQEAKICAqICBQdXJwb3NlOgogICogICAgICBGcmVlcyB0aGUgbWVzc2FnZSBidWZmZXIuCiAgKi8KLWludCBub2RlX2ZyZWVfbXNnX2J1ZihzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1OCAqIHBidWZmZXIsCitpbnQgbm9kZV9mcmVlX21zZ19idWYoc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTggKnBidWZmZXIsCiAJCQkgICAgIHN0cnVjdCBkc3BfYnVmZmVyYXR0ciAqcGF0dHIpCiB7CiAJc3RydWN0IG5vZGVfb2JqZWN0ICpwbm9kZSA9IChzdHJ1Y3Qgbm9kZV9vYmplY3QgKilobm9kZTsKQEAgLTIzMjIsNyArMjMyMSw4IEBACiAJCQlpZiAoIWhkZWhfbWdyKQogCQkJCWdvdG8gZnVuY19jb250OwogCi0JCQlicmlkZ2VfZGVoX25vdGlmeShoZGVoX21nciwgRFNQX1NZU0VSUk9SLCBEU1BfRVhDRVBUSU9OQUJPUlQpOworCQkJYnJpZGdlX2RlaF9ub3RpZnkoaGRlaF9tZ3IsIERTUF9TWVNFUlJPUiwKKwkJCQkJICBEU1BfRVhDRVBUSU9OQUJPUlQpOwogCQl9CiAJfQogZnVuY19jb250OgpAQCAtMjY0MCw3ICsyNjQwLDcgQEAKICAqICBQdXJwb3NlOgogICogICAgICBSZXRyaWV2ZXMgdGhlIGFkZHJlc3MgZm9yIGNyZWF0ZSwgZXhlY3V0ZSBvciBkZWxldGUgcGhhc2UgZm9yIGEgbm9kZS4KICAqLwotc3RhdGljIGludCBnZXRfZnhuX2FkZHJlc3Moc3RydWN0IG5vZGVfb2JqZWN0ICpobm9kZSwgdTMyICogZnhuX2FkZHIsCitzdGF0aWMgaW50IGdldF9meG5fYWRkcmVzcyhzdHJ1Y3Qgbm9kZV9vYmplY3QgKmhub2RlLCB1MzIgKmZ4bl9hZGRyLAogCQkJCSAgdTMyIHBoYXNlKQogewogCWNoYXIgKnBzdHJfZnhuX25hbWUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwNzhlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKQEAgLTAsMCArMSwxNzQgQEAKKworT3ZlcnZpZXcKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGRyaXZlciBzZXQgZm9yIFVuaXN5cyBTZWN1cmUgUGFydGl0aW9uaW5nIChzLVBhcsKuKS4KKworcy1QYXIgaXMgZmlybXdhcmUgdGhhdCBwcm92aWRlcyBoYXJkd2FyZSBwYXJ0aXRpb25pbmcgY2FwYWJpbGl0aWVzIGZvcgorc3BsaXR0aW5nIGxhcmdlLXNjYWxlIEludGVsIHg4NiBzZXJ2ZXJzIGludG8gbXVsdGlwbGUgaXNvbGF0ZWQKK3BhcnRpdGlvbnMuIHMtUGFyIHByb3ZpZGVzIGEgc2V0IG9mIHBhcmEtdmlydHVhbGl6ZWQgZGV2aWNlIGRyaXZlcnMgdG8KK2FsbG93IGd1ZXN0IHBhcnRpdGlvbnMgb24gdGhlIHNhbWUgc2VydmVyIHRvIHNoYXJlIGRldmljZXMgdGhhdCB3b3VsZAorbm9ybWFsbHkgYmUgdW5zaGFyYWJsZTsgc3BlY2lmaWNhbGx5LCBQQ0kgbmV0d29yayBpbnRlcmZhY2VzIGFuZCBob3N0CitidXMgYWRhcHRlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgYWNjZXNzIHZpYSBTUi1JT1YuIFRoZSBzaGFyZWQKK2RldmljZSBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSBhIHNtYWxsLCBzaW5nbGUtcHVycG9zZSBzZXJ2aWNlCitwYXJ0aXRpb24sIHdoaWNoIGNvbW11bmljYXRlcyB3aXRoIGVhY2ggZ3Vlc3QgcGFydGl0aW9uIHNoYXJpbmcgdGhhdAorZGV2aWNlIHRocm91Z2ggYW4gYXJlYSBvZiBzaGFyZWQgbWVtb3J5IGNhbGxlZCBhIGNoYW5uZWwuIEFkZGl0aW9uYWwKK2RyaXZlcnMgcHJvdmlkZSBzdXBwb3J0IGludGVyZmFjZXMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBzLVBhcgorc2VydmljZXMsIGxvZ2dpbmcgYW5kIGRpYWdub3N0aWNzLCBhbmQgYWNjZXNzaW5nIHRoZSBMaW51eCBjb25zb2xlCitmcm9tIHRoZSBzLVBhciB1c2VyIGludGVyZmFjZS4KKworVGhlIGRyaXZlciBzdGFjayBjb25zaXN0cyBvZiBhIHNldCBvZiBzdXBwb3J0IG1vZHVsZXMsIGEgc2V0IG9mIGJ1cworbW9kdWxlcywgYW5kIGEgc2V0IG9mIGRldmljZSBkcml2ZXIgbW9kdWxlcy4gVGhlIHN1cHBvcnQgbW9kdWxlcworaGFuZGxlIGEgbnVtYmVyIG9mIGNvbW1vbiBmdW5jdGlvbnMgYWNyb3NzIGVhY2ggb2YgdGhlIG90aGVyCitkcml2ZXJzLiBUaGUgYnVzIG1vZHVsZXMgcHJvdmlkZSBvcmdhbml6YXRpb24gZm9yIHRoZSBkZXZpY2UgZHJpdmVyCittb2R1bGVzLCB3aGljaCBwcm92aWRlIHRoZSBzaGFyZWQgZGV2aWNlIGZ1bmN0aW9uYWxpdHkuCisKK1RoZXNlIGRyaXZlcnMgYXJlIGZvciB0aGUgVW5pc3lzIHZpcnR1YWwgUENJIGhhcmR3YXJlIG1vZGVsIHdoZXJlIHRoZQoraHlwZXJ2aXNvciBuZWVkIG5vdCBpbnRlcnZlbmUgKG90aGVyIHRoYW4gbm9ybWFsIGludGVycnVwdCBoYW5kbGluZykKK2luIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aGUgY2xpZW50IGRyaXZlcnMgYW5kIHRoZSB2aXJ0dWFsIGFkYXB0ZXIKK2Zpcm13YXJlIGluIHRoZSBhZGFwdGVyIHNlcnZpY2UgcGFydGl0aW9uLgorCitEcml2ZXIgRGVzY3JpcHRpb25zCisKK0RldmljZSBNb2R1bGVzCisKK1RoZSBtb2R1bGVzIGluIHRoaXMgc2VjdGlvbiBoYW5kbGUgc2hhcmVkIGRldmljZXMgYW5kIHRoZSB2aXJ0dWFsCitidXNlcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoZW0uIFRoZXNlIG1vZHVsZXMgdXNlIGZ1bmN0aW9ucyBpbiBhbmQKK2RlcGVuZCBvbiB0aGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhlIHN1cHBvcnQgbW9kdWxlcyBzZWN0aW9uLgorCit2aXNvcmNoaXBzZXQKKworVGhlIHZpc29yY2hpcHNldCBtb2R1bGUgcmVjZWl2ZXMgZGV2aWNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbgorZXZlbnRzIGZyb20gdGhlIENvbW1hbmQgc2VydmljZSBwYXJ0aXRpb24gb2Ygcy1QYXIsIGFzIHdlbGwgYXMKK2NvbnRyb2xsaW5nIHJlZ2lzdHJhdGlvbiBvZiBzaGFyZWQgZGV2aWNlIGRyaXZlcnMgd2l0aCB0aGUgcy1QYXIKK2RyaXZlciBjb3JlLiBUaGUgZXZlbnRzIHJlY2VpdmVkIGFyZSB1c2VkIHRvIHBvcHVsYXRlIG90aGVyIHMtUGFyCittb2R1bGVzIHdpdGggdGhlaXIgYXNzaWduZWQgc2hhcmVkIGRldmljZXMuIFZpc29yY2hpcHNldCBpcyByZXF1aXJlZAorZm9yIHNoYXJlZCBkZXZpY2UgZHJpdmVycyB0byBmdW5jdGlvbiBwcm9wZXJseS4gVmlzb3JjaGlwc2V0IGFsc28KK3N0b3JlcyBpbmZvcm1hdGlvbiBmb3IgaGFuZGxpbmcgZHVtcCBkaXNrIGRldmljZSBjcmVhdGlvbiBkdXJpbmcKK2tkdW1wLgorCitJbiBvcGVyYXRpb24sIHRoZSB2aXNvcmNoaXBzZXQgbW9kdWxlIHByb2Nlc3NlcyBkZXZpY2UgY3JlYXRpb24gYW5kCitkZXN0cnVjdGlvbiBtZXNzYWdlcyBzZW50IGJ5IHMtUGFyJ3MgQ29tbWFuZCBzZXJ2aWNlIHBhcnRpdGlvbiB0aHJvdWdoCithIGNoYW5uZWwuIFRoZXNlIG1lc3NhZ2VzIHJlc3VsdCBpbiBjcmVhdGlvbiAob3IgZGVzdHJ1Y3Rpb24pIG9mIGVhY2gKK3ZpcnR1YWwgYnVzIGFuZCB2aXJ0dWFsIGRldmljZS4gRWFjaCBidXMgYW5kIGRldmljZSBpcyBhbHNvIGFzc29jaWF0ZWQKK3dpdGggYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwsIHdoaWNoIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBvbmUgb3IKK21vcmUgSU8gc2VydmljZSBwYXJ0aXRpb25zIHRvIHBlcmZvcm0gZGV2aWNlIElPIG9uIGJlaGFsZiBvZiB0aGUKK2d1ZXN0LgorCit2aXJ0aGJhCisKK1RoZSB2aXJ0aGJhIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gYSBzaGFyZWQgU0NTSSBob3N0IGJ1cyBhZGFwdGVyCithbmQgb25lIG9yIG1vcmUgZGlzayBkZXZpY2VzLCBieSBwcm94eWluZyBTQ1NJIGNvbW1hbmRzIGJldHdlZW4gdGhlCitndWVzdCBhbmQgdGhlIHNlcnZpY2UgcGFydGl0aW9uIHRoYXQgb3ducyB0aGUgc2hhcmVkIFNDU0kgYWRhcHRlciwKK3VzaW5nIGEgY2hhbm5lbCBiZXR3ZWVuIHRoZSBndWVzdCBhbmQgdGhlIHNlcnZpY2UgcGFydGl0aW9uLiBUaGUgZGlza3MKK3RoYXQgYXBwZWFyIG9uIHRoZSBzaGFyZWQgYnVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBzLVBhciBjb25maWd1cmF0aW9uCithbmQgZW5mb3JjZWQgYnkgdGhlIHNlcnZpY2UgcGFydGl0aW9uLCB3aGlsZSB0aGUgZ3Vlc3QgZHJpdmVyIGhhbmRsZXMKK3NlbmRpbmcgY29tbWFuZHMgYW5kIGhhbmRsaW5nIHJlc3BvbnNlcy4gRWFjaCBkaXNrIGlzIHNoYXJlZCBhcyBhCit3aG9sZSB0byBhIGd1ZXN0LiBTaGFyaW5nIHRoZSBidXMgYWRhcHRlciBpbiB0aGlzIHdheSBwcm92aWRlcworcmVzaWxpZW5jeTsgc2hvdWxkIHRoZSBkZXZpY2UgZW5jb3VudGVyIGFuIGVycm9yLCBvbmx5IHRoZSBzZXJ2aWNlCitwYXJ0aXRpb24gaXMgcmVib290ZWQsIGFuZCB0aGUgZGV2aWNlIGlzIHJlaW5pdGlhbGl6ZWQuIFRoaXMgYWxsb3dzCitndWVzdHMgdG8gY29udGludWUgcnVubmluZyBhbmQgdG8gcmVjb3ZlciBmcm9tIHRoZSBlcnJvci4KKwordmlydG5pYworCitUaGUgdmlydG5pYyBtb2R1bGUgcHJvdmlkZXMgYSBwYXJhdmlydHVhbGl6ZWQgbmV0d29yayBpbnRlcmZhY2UgdG8gYQorZ3Vlc3QgYnkgcHJveHlpbmcgYnVmZmVyIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUgc2VydmljZQorcGFydGl0aW9uIHRoYXQgb3ducyB0aGUgc2hhcmVkIG5ldHdvcmsgaW50ZXJmYWNlLCB1c2luZyBhIGNoYW5uZWwKK2JldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUgc2VydmljZSBwYXJ0aXRpb24uIFRoZSBjb25uZWN0aXZpdHkgb2YgdGhpcworaW50ZXJmYWNlIHdpdGggdGhlIHNoYXJlZCBpbnRlcmZhY2UgYW5kIHBvc3NpYmx5IG90aGVyIGd1ZXN0CitwYXJ0aXRpb25zIGlzIGRlZmluZWQgYnkgdGhlIHMtUGFyIGNvbmZpZ3VyYXRpb24gYW5kIGVuZm9yY2VkIGJ5IHRoZQorc2VydmljZSBwYXJ0aXRpb247IHRoZSBndWVzdCBkcml2ZXIgaGFuZGxlcyBjb21tdW5pY2F0aW9uIGFuZCBsaW5rCitzdGF0dXMuCisKK3Zpc29yc2VyaWFsCisKK1RoZSB2aXNvcnNlcmlhbCBtb2R1bGUgYWxsb3dzIHRoZSBjb25zb2xlIG9mIHRoZSBsaW51eCBndWVzdCB0byBiZQorYWNjZXNzZWQgdmlhIHRoZSBzLVBhciBjb25zb2xlIHNlcmlhbCBjaGFubmVsLiBJdCBjcmVhdGVzIGRldmljZXMgaW4KKy9kZXYvdmlzb3JzZXJpYWxjbGllbnRYIHdoaWNoIGJlaGF2ZSBsaWtlIGEgc2VyaWFsIHRlcm1pbmFsIGFuZCBhcmUKK2Nvbm5lY3RlZCB0byB0aGUgZGlhZ25vc3RpY3Mgc3lzdGVtIGluIHMtUGFyLiBCeSBhc3NpZ25pbmcgYSBnZXR0eSB0bwordGhlIHRlcm1pbmFsIGluIHRoZSBndWVzdCwgYSB1c2VyIGNvdWxkIGxvZyBpbnRvIGFuZCBhY2Nlc3MgdGhlIGd1ZXN0Citmcm9tIHRoZSBzLVBhciBkaWFnbm9zdGljcyBTV0lUQ0ggUlVOIHRlcm1pbmFsLgorCit2aXNvcmJ1cworCitUaGUgdmlzb3JidXMgbW9kdWxlIGhhbmRsZXMgdGhlIGJ1cyBmdW5jdGlvbnMgZm9yIG1vc3QgZnVuY3Rpb25hbAorZHJpdmVycyBleGNlcHQgdmlzb3JzZXJpYWwsIHZpc29yZGlhZywgdmlydGhiYSwgYW5kIHZpcnRuaWMuIEl0CittYWludGFpbnMgdGhlIHN5c2ZzIHN1YnRyZWUgL3N5cy9kZXZpY2VzL3Zpc29yYnVzKi8uIEl0IGlzIHJlc3BvbnNpYmxlCitmb3IgZGV2aWNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiB0aGUgZGV2aWNlcyBvbiBpdHMgYnVzLgorCit2aXNvcmNsaWVudGJ1cworCitUaGUgdmlzb3JjbGllbnRidXMgbW9kdWxlIGZvcndhcmRzIHRoZSBidXMgZnVuY3Rpb25zIGZvciB2aXJ0aGJhLCBhbmQKK3ZpcnRuaWMgdG8gdGhlIHZpcnRwY2kgZHJpdmVyLgorCit2aXJ0cGNpCisKK1RoZSB2aXJ0cGNpIG1vZHVsZSBoYW5kbGVzIHRoZSBidXMgZnVuY3Rpb25zIGZvciB2aXJ0aGJhLCBhbmQgdmlydG5pYy4KKworcy1QYXIgSW50ZWdyYXRpb24gTW9kdWxlcworCitUaGUgbW9kdWxlcyBpbiB0aGlzIHNlY3Rpb24gcHJvdmlkZSBpbnRlZ3JhdGlvbiB3aXRoIHMtUGFyIGd1ZXN0CitwYXJ0aXRpb24gc2VydmljZXMgbGlrZSBkaWFnbm9zdGljcyBhbmQgcmVtb3RlIGRlc2t0b3AuIFRoZXNlIG1vZHVsZXMKK2RlcGVuZCBvbiBmdW5jdGlvbnMgaW4gdGhlIG1vZHVsZXMgZGVzY3JpYmVkIGluIHRoZSBzdXBwb3J0IG1vZHVsZXMKK3NlY3Rpb24uCisKK3Zpc29ydmlkZW9jbGllbnQKKworVGhlIHZpc29ydmlkZW9jbGllbnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHZpZGVvIHN1cHBvcnQKK2ZvciB0aGUgVW5pc3lzIHMtUGFyIFBhcnRpdGlvbiBEZXNrdG9wIGFwcGxpY2F0aW9uLiBUaGUgZ3Vlc3QgT1MgbXVzdAorYWxzbyBoYXZlIHRoZSBVRUZJIEdPUCBwcm90b2NvbCBlbmFibGVkIGZvciB0aGUgcGFydGl0aW9uIGRlc2t0b3AgdG8KK2Z1bmN0aW9uLiAgdmlzb3Jjb25pbmNsaWVudCBUaGUgdmlzb3Jjb25pbmNsaWVudCBtb2R1bGUgcHJvdmlkZXMKK2tleWJvYXJkIGFuZCBtb3VzZSBzdXBwb3J0IGZvciB0aGUgVW5pc3lzIHMtUGFyIFBhcnRpdGlvbiBEZXNrdG9wCithcHBsaWNhdGlvbi4KKworc3BhcnN0b3AKKworVGhlIHNwYXJzdG9wIG1vZHVsZSBoYW5kbGVzIHJlcXVlc3RzIGZyb20gdGhlIFVuaXN5cyBzLVBhciBwbGF0Zm9ybSB0bworc2h1dGRvd24gdGhlIGxpbnV4IGd1ZXN0LiBJdCBhbGxvd3MgYSBwcm9ncmFtIG9uIHRoZSBndWVzdCB0byBwZXJmb3JtCitjbGVhbi11cCBmdW5jdGlvbnMgb24gdGhlIGd1ZXN0IGJlZm9yZSB0aGUgZ3Vlc3QgaXMgc2h1dCBkb3duIG9yCityZWJvb3RlZCB1c2luZyBBQ1BJLgorCit2aXNvcmRpYWcKKworVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGFiaWxpdHkgZm9yIHRoZSBndWVzdCB0byB3cml0ZSBpbmZvcm1hdGlvbgoraW50byB0aGUgcy1QYXIgZGlhZ25vc3RpY3Mgc3Vic3lzdGVtLiBJdCBjcmVhdGVzIGEgc2V0IG9mIGRldmljZXMKK25hbWVkIC9kZXYvdmlzb3JkaWFnLlggd2hpY2ggY2FuIGJlIHdyaXR0ZW4gdG8gYnkgdGhlIGd1ZXN0IHRvIGFkZAordGV4dCB0byB0aGUgcy1QYXIgc3lzdGVtIGxvZy4KKworU3VwcG9ydCBNb2R1bGVzCisKK1RoZSBtb2R1bGVzIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gcHJvdmlkZSBmdW5jdGlvbnMgYW5kCithYnN0cmFjdGlvbnMgdG8gc3VwcG9ydCB0aGUgbW9kdWxlcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzCitzZWN0aW9ucywgdG8gYXZvaWQgaGF2aW5nIGR1cGxpY2F0ZWQgZnVuY3Rpb25hbGl0eS4KKwordmlzb3Jub29wCisKK1RoZSB2aXNvcm5vb3AgbW9kdWxlIGlzIGEgcGxhY2Vob2xkZXIgdGhhdCByZXNwb25kcyB0byBkZXZpY2UKK2NyZWF0ZS9kZXN0cm95IG1lc3NhZ2VzIHRoYXQgYXJlIGN1cnJlbnRseSBub3QgaW4gdXNlIGJ5IGxpbnV4IGd1ZXN0cy4KKwordmlzb3J1aXNsaWIKKworVGhlIHZpc29ydWlzbGliIG1vZHVsZSBpcyBhIHN1cHBvcnQgbGlicmFyeSwgdXNlZCB0byBoYW5kbGUgcmVxdWVzdHMKK2Zyb20gdmlydHBjaS4KKwordmlzb3JjaGFubmVsc3R1YgorCitUaGUgdmlzb3JjaGFubmVsc3R1YiBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCByb3V0aW5lcyBmb3Igc3RvcmluZyBhbmQKK3JldHJpZXZpbmcgZGF0YSBmcm9tIGEgY2hhbm5lbC4KKwordmlzb3JjaGFubmVsCisKK1RoZSB2aXNvcmNoYW5uZWwgbW9kdWxlIGlzIGEgc3VwcG9ydCBsaWJyYXJ5IHRoYXQgYWJzdHJhY3RzIHJlYWRpbmcKK2FuZCB3cml0aW5nIGEgY2hhbm5lbCBpbiBtZW1vcnkuCisKK3Zpc29ydXRpbAorCitUaGUgdmlzb3J1dGlsIG1vZHVsZSBpcyBhIHN1cHBvcnQgbGlicmFyeSByZXF1aXJlZCBieSBhbGwgb3RoZXIgcy1QYXIKK2RyaXZlciBtb2R1bGVzLiBBbW9uZyBpdHMgZmVhdHVyZXMgaXQgYWJzdHJhY3RzIHJlYWRpbmcsIHdyaXRpbmcsIGFuZAorbWFuaXB1bGF0aW5nIGEgYmxvY2sgb2YgbWVtb3J5LgorCitNaW5pbXVtIFJlcXVpcmVkIERyaXZlciBTZXQKKworVGhlIGRyaXZlcnMgcmVxdWlyZWQgdG8gYm9vdCBhIExpbnV4IGd1ZXN0IGFyZSB2aXNvcmNoaXBzZXQsIHZpc29yYnVzLAordmlzb3J2aWRlb2NsaWVudCwgdmlzb3Jjb25pbmNsaWVudCwgdmlzb3J1aXNsaWIsIHZpc29yY2hhbm5lbHN0dWIsCit2aXNvcmNoYW5uZWwsIGFuZCB2aXNvcnV0aWwuIFRoZSBvdGhlciBkcml2ZXJzIGFyZSByZXF1aXJlZCBieSB0aGUKK3Byb2R1Y3QgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIG1hcmtldGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL3Byb2MtZW50cmllcy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0RvY3VtZW50YXRpb24vcHJvYy1lbnRyaWVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjZmOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9Eb2N1bWVudGF0aW9uL3Byb2MtZW50cmllcy50eHQKQEAgLTAsMCArMSw5MyBAQAorIHMtUGFyIFByb2MgRW50cmllcworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHByb2MgZW50cmllcyBjcmVhdGVkIGJ5IHRoZSBVbmlzeXMgcy1QYXIgbW9kdWxlcy4KKworU3VwcG9ydCBNb2R1bGUgRW50cmllcworVGhlc2UgZW50cmllcyBhcmUgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBkZWJ1Z2dpbmcuCisKKy9wcm9jL3Vpc2xpYi9pbmZvOiBUaGlzIGVudHJ5IGNvbnRhaW5zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlCit1aXNsaWIgbW9kdWxlLCBpbmNsdWRpbmcgYnVzIGluZm9ybWF0aW9uIGFuZCBtZW1vcnkgdXNhZ2UuCisKKy9wcm9jL3Zpc29yY2hpcHNldC9jb250cm9sdm06IFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGRlYnVnZ2luZworZW50cmllcyBmb3IgdGhlIGNvbnRyb2x2bSBjaGFubmVsIHVzZWQgYnkgdmlzb3JjaGlwc2V0LgorCisvcHJvYy91aXNsaWIvcGxhdGZvcm06IFRoaXMgZW50cnkgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBwbGF0Zm9ybQorbnVtYmVyIHRoaXMgbm9kZSBpcyBpbiB0aGUgc3lzdGVtLiBGb3Igc29tZSBndWVzdHMsIHRoaXMgbWF5IGJlCitpbnZhbGlkLgorCisvcHJvYy92aXNvcmNoaXBzZXQvY2hpcHNldHJlYWR5OiBUaGlzIGVudHJ5IGlzIHdyaXR0ZW4gdG8gYnkgc2NyaXB0cwordG8gc2lnbmlmeSB0aGF0IGFueSB1c2VyIGxldmVsIGFjdGl2aXR5IGhhcyBiZWVuIGNvbXBsZXRlZCBiZWZvcmUgdGhlCitndWVzdCBjYW4gYmUgY29uc2lkZXJlZCBydW5uaW5nIGFuZCBpcyBzaG93biBhcyBydW5uaW5nIGluIHRoZSBzLVBhcgorVUkuCisKK0RldmljZSBFbnRyaWVzCitUaGVzZSBlbnRyaWVzIHByb3ZpZGUgc3RhdHVzIG9mIHRoZSBkZXZpY2VzIHNoYXJlZCBieSBhIHNlcnZpY2UgcGFydGl0aW9uLgorCisvcHJvYy91aXNsaWIvdmJ1czogdGhpcyBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIGVudHJpZXMgZm9yIGVhY2gKK3ZpcnR1YWwgYnVzLiBFYWNoIG51bWJlcmVkIHN1Yi1kaXJlY3RvcnkgY29udGFpbnMgYW4gaW5mbyBlbnRyeSwgd2hpY2gKK2Rlc2NyaWJlcyB0aGUgZGV2aWNlcyB0aGF0IGFwcGVhciBvbiB0aGF0IGJ1cy4KKworL3Byb2MvdWlzbGliL2N5Y2xlc19iZWZvcmVfd2FpdDogVGhpcyBlbnRyeSBpcyB1c2VkIHRvIHR1bmUKK3BlcmZvcm1hbmNlLCBieSBzZXR0aW5nIHRoZSBudW1iZXIgb2YgY3ljbGVzIHdlIHdhaXQgYmVmb3JlIGdvaW5nIGlkbGUKK3doZW4gaW4gcG9sbGluZyBtb2RlLiBBIGxvbmdlciB0aW1lIHdpbGwgcmVkdWNlIG1lc3NhZ2UgbGF0ZW5jeSBidXQKK3NwZW5kIG1vcmUgcHJvY2Vzc2luZyB0aW1lIHBvbGxpbmcuCisKKy9wcm9jL3Vpc2xpYi9zbWFydF93YWtldXA6IFRoaXMgZW50cnkgaXMgdXNlZCB0byB0dW5lIHBlcmZvcm1hbmNlLCBieQorZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHNtYXJ0IHdha2V1cC4KKworL3Byb2MvdmlydGhiYS9pbmZvOiBUaGlzIGVudHJ5IGNvbnRhaW5zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlCit2aXJ0aGJhIG1vZHVsZSwgaW5jbHVkaW5nIGludGVycnVwdCBpbmZvcm1hdGlvbiBhbmQgbWVtb3J5IHVzYWdlLgorCisvcHJvYy92aXJ0aGJhL2VuYWJsZV9pbnRzOiBUaGlzIGVudHJ5IGNvbnRyb2xzIGludGVycnVwdCB1c2UgYnkgdGhlCit2aXJ0aGJhIG1vZHVsZS4gV3JpdGluZyBhIDAgdG8gdGhpcyBlbnRyeSB3aWxsIGRpc2FibGUgaW50ZXJydXB0cy4KKworL3Byb2MvdmlydG5pYy9pbmZvOiBUaGlzIGVudHJ5IGNvbnRhaW5zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlCit2aXJ0bmljIG1vZHVsZSwgaW5jbHVkaW5nIGludGVycnVwdCBpbmZvcm1hdGlvbiwgc2VuZCBhbmQgcmVjZWl2ZQorY291bnRzLCBhbmQgb3RoZXIgZGV2aWNlIGluZm9ybWF0aW9uLgorCisvcHJvYy92aXJ0bmljL2V0aFg6IFRoaXMgaXMgYSBkaXJlY3RvcnkgY29udGFpbmluZyBlbnRyaWVzIGZvciBlYWNoCit2aXJ0dWFsIE5JQy4gRWFjaCBuYW1lZCBzdWJkaXJlY3RvcnkgY29udGFpbnMgdHdvIGVudHJpZXMsCitjbGllbnRzdHJpbmcgYW5kIHpvbmUuCisKKy9wcm9jL3ZpcnRwY2kvaW5mbzogVGhpcyBlbnRyeSBjb250YWlucyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZQordmlydHBjaSBtb2R1bGUsIGluY2x1ZGluZyB2aXJ0dWFsIFBDSSBidXMgaW5mb3JtYXRpb24gYW5kIGRldmljZQorbG9jYXRpb25zLgorCisvcHJvYy92aXJ0bmljL2VuYWJsZV9pbnRzOiBUaGlzIGVudHJ5IGNvbnRyb2xzIGludGVycnVwdCB1c2UgYnkgdGhlCit2aXJ0bmljIG1vZHVsZS4gV3JpdGluZyBhIDAgdG8gdGhpcyBlbnRyeSB3aWxsIGRpc2FibGUgaW50ZXJydXB0cy4KKworVmlzb3Jjb25pbmNsaWVudCwgdmlzb3JkaWFnLCB2aXNvcm5vb3AsIHZpc29yc2VyaWFsY2xpZW50LCBhbmQKK3Zpc29ydmlkZW9jbGllbnQgRW50cmllcworCitUaGUgZW50cmllcyBpbiBwcm9jIGZvciB0aGVzZSBtb2R1bGVzIGFsbCBmb2xsb3cgdGhlIHNhbWUKK3BhdHRlcm4uIEVhY2ggbW9kdWxlIGhhcyBpdHMgb3duIHByb2MgZGlyZWN0b3J5IHdpdGggdGhlIHNhbWUgbmFtZSwKK2UuZy4gdmlzb3JkaWFnIHByZXNlbnRzIGEgL3Byb2Mvdmlzb3JkaWFnIGRpcmVjdG9yeS4gSW5zaWRlIG9mIHRoZQorbW9kdWxlJ3MgZGlyZWN0b3J5IGFyZSBhIGRldmljZSBkaXJlY3RvcnksIHdoaWNoIGNvbnRhaW5zIG9uZSBudW1iZXJlZAorZGlyZWN0b3J5IGZvciBlYWNoIGRldmljZSBwcm92aWRlZCBieSB0aGF0IG1vZHVsZS4gRWFjaCBkZXZpY2UgaGFzIGEKK2RpYWcgZW50cnkgdGhhdCBwcmVzZW50cyB0aGUgZGV2aWNlIG51bWJlciBhbmQgdmlzb3JidXMgbmFtZSBmb3IgdGhhdAorZGV2aWNlLiBUaGUgbW9kdWxlIGRpcmVjdG9yeSBhbHNvIGhhcyBhIGRyaXZlci9kaWFnIGVudHJ5LCB3aGljaAorcmVwb3J0cyB0aGUgY29ycmVzcG9uZGluZyBzLVBhciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZHJpdmVyLgorCitBdXRvbWF0ZWQgSW5zdGFsbGF0aW9uIEVudHJpZXMKKworVGhlc2UgZW50cmllcyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIHMtUGFyIHBsYXRmb3JtCithbmQgdGhlIExpbnV4LWJhc2VkIGluc3RhbGxhdGlvbiBhbmQgcmVjb3ZlcnkgdG9vbC4gVGhlc2UgdmFsdWVzIGFyZQorcmVhZC93cml0ZSwgaG93ZXZlciwgdGhlIGd1ZXN0IGNhbiBvbmx5IHJlc2V0IHRoZW0gdG8gMCwgb3IgcmVwb3J0IGFuCitlcnJvciBzdGF0dXMgdGhyb3VnaCB0aGUgaW5zdGFsbGVyIGVudHJ5LiBUaGUgdmFsdWVzIGFyZSBvbmx5IHNldCB2aWEKK3MtUGFyJ3MgZmlybXdhcmUgaW50ZXJmYWNlLCB0byBoZWxwIHByZXZlbnQgYWNjaWRlbnRhbGx5IGJvb3RpbmcgaW50bwordGhlIHRvb2wuCisKKy9wcm9jL3Zpc29yY2hpcHNldC9ib290dG90b29sOiBUaGlzIGVudHJ5IGluc3RydWN0cyBzLVBhciB0aGF0IHRoZQorbmV4dCByZWJvb3Qgd2lsbCBsYXVuY2ggdGhlIGluc3RhbGxhdGlvbiBhbmQgcmVjb3ZlcnkgdG9vbC4gSWYgc2V0IHRvCiswLCB0aGUgbmV4dCBib290IHdpbGwgaGFwcGVuIGFjY29yZGluZyB0byB0aGUgVUVGSSBib290IG1hbmFnZXIKK3NldHRpbmdzLgorCisvcHJvYy92aXNvcmNoaXBzZXQvdG9vbGFjdGlvbjogVGhpcyBlbnRyeSBpbmRpY2F0ZXMgdGhlIGluc3RhbGxhdGlvbgorYW5kIHJlY292ZXJ5IHRvb2wgbW9kZSByZXF1ZXN0ZWQgZm9yIHRoZSBuZXh0IGJvb3QuCisKKy9wcm9jL3Zpc29yY2hpcHNldC9pbnN0YWxsZXI6IHRoaXMgZW50cnkgaXMgdXNlZCBieSB0aGUgaW5zdGFsbGF0aW9uCithbmQgcmVjb3ZlcnkgdG9vbCB0byBwYXNzIHN0YXR1cyBhbmQgcmVzdWx0IGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlCitzLVBhciBmaXJtd2FyZS4KKworL3Byb2Mvdmlzb3JjaGlwc2V0L3BhcnRpdGlvbjogVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGd1ZXN0CitwYXJ0aXRpb24gY29uZmlndXJhdGlvbiBkYXRhIGZvciBlYWNoIHZpcnR1YWwgYnVzLCBmb3IgdXNlIGR1cmluZworaW5zdGFsbGF0aW9uIGFuZCBhdCBydW50aW1lIGZvciBzLVBhciBzZXJ2aWNlIHBhcnRpdGlvbnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwODBjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvS2NvbmZpZwpAQCAtMCwwICsxLDIwIEBACisjCisjIFVuaXN5cyBTUEFSIGRyaXZlciBjb25maWd1cmF0aW9uCisjCittZW51Y29uZmlnIFVOSVNZU1NQQVIKKwlib29sICJVbmlzeXMgU1BBUiBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4Nl82NAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciB0aGUgVW5pc3lzIFNQQVIgZHJpdmVycworCitpZiBVTklTWVNTUEFSCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWciCisKK2VuZGlmICMgVU5JU1lTU1BBUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9NQUlOVEFJTkVSUyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTUFJTlRBSU5FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljZWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTUFJTlRBSU5FUlMKQEAgLTAsMCArMSw2IEBACitVbmlzeXMgcy1QYXIgZHJpdmVycworTToJQmVuIFJvbWVyIDxzcGFybWFpbnRhaW5lckB1bmlzeXMuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9zLVBhci9vdmVydmlldy50eHQKK0Y6CURvY3VtZW50YXRpb24vcy1QYXIvcHJvYy1lbnRyaWVzLnR4dAorRjoJZHJpdmVycy9zdGFnaW5nL3VuaXN5cy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ODhkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFVuaXN5cyBTUEFSIGRyaXZlcnMKKyMKK29iai0kKENPTkZJR19VTklTWVNfVklTT1JVVElMKQkJKz0gdmlzb3J1dGlsLworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUkNIQU5ORUwpCSs9IHZpc29yY2hhbm5lbC8KK29iai0kKENPTkZJR19VTklTWVNfVklTT1JDSElQU0VUKQkrPSB2aXNvcmNoaXBzZXQvCitvYmotJChDT05GSUdfVU5JU1lTX0NIQU5ORUxTVFVCKQkrPSBjaGFubmVscy8KK29iai0kKENPTkZJR19VTklTWVNfVUlTTElCKQkJKz0gdWlzbGliLworb2JqLSQoQ09ORklHX1VOSVNZU19WSVJUUENJKQkJKz0gdmlydHBjaS8KK29iai0kKENPTkZJR19VTklTWVNfVklSVEhCQSkJCSs9IHZpcnRoYmEvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0YWM2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvVE9ETwpAQCAtMCwwICsxLDIxIEBACitUT0RPOgorCS1jaGVja3BhdGNoIHdhcm5pbmdzCisJLW1vdmUgL3Byb2MgZW50cmllcyB0byAvc3lzCisJLXByb3BlciBtYWpvciBudW1iZXIocykKKwktYWRkIG90aGVyIGRyaXZlcnMgbmVlZGVkIGZvciBmdWxsIGZ1bmN0aW9uYWxpdHk6CisJCS12aXNvcmNsaWVudGJ1cworCQktdmlzb3JidXMKKwkJLXZpc29yZGlhZworCQktdmlydG5pYworCQktdmlzb3Jub29wCisJCS12aXNvcnNlcmlhbAorCQktdmlzb3J2aWRlb2NsaWVudAorCQktdmlzb3Jjb25pbmNsaWVudAorCQktc3BhcnN0b3AKKwktbW92ZSBpbmRpdmlkdWFsIGRyaXZlcnMgaW50byBwcm9wZXIgZHJpdmVyIHN1YnN5c3RlbXMKKwkJCisKK1BhdGNoZXMgdG86CisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4KKwlLZW4gQ294IDxqa2NAcmVkaGF0LmNvbT4KKwlVbmlzeXMgcy1QYXIgbWFpbnRhaW5lciBtYWlsaW5nIGxpc3QgPHNwYXJtYWludGFpbmVyQHVuaXN5cy5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhMjM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACisjCisjIFVuaXN5cyBjaGFubmVscyBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfQ0hBTk5FTFNUVUIKKwl0cmlzdGF0ZSAiVW5pc3lzIGNoYW5uZWxzdHViIGRyaXZlciIKKwlkZXBlbmRzIG9uIFVOSVNZU1NQQVIKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIGNoYW5uZWxzIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwYjBhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIGNoYW5uZWxzdHViCisjCisKK29iai0kKENPTkZJR19VTklTWVNfQ0hBTk5FTFNUVUIpCSs9IHZpc29yY2hhbm5lbHN0dWIubworCit2aXNvcmNoYW5uZWxzdHViLXkgOj0gY2hhbm5lbC5vIGNoYW5zdHViLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDUyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5uZWwuYwpAQCAtMCwwICsxLDIxOSBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TCisjaW5jbHVkZSA8Y29uZmlnL21vZHZlcnNpb25zLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBmb3IgbW9kdWxlX2luaXQgYW5kIG1vZHVsZV9leGl0ICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyogZm9yIG1lbWNweSAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEltcGxlbWVudGF0aW9uIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgU3VwZXJ2aXNvciBjaGFubmVscyAqLworI2luY2x1ZGUgImNoYW5uZWwuaCIKKworLyoKKyAqIFJvdXRpbmUgRGVzY3JpcHRpb246CisgKiBUcmllcyB0byBpbnNlcnQgdGhlIHByZWJ1aWx0IHNpZ25hbCBwb2ludGVkIHRvIGJ5IHBTaWduYWwgaW50byB0aGUgbnRoCisgKiBRdWV1ZSBvZiB0aGUgQ2hhbm5lbCBwb2ludGVkIHRvIGJ5IHBDaGFubmVsCisgKgorICogUGFyYW1ldGVyczoKKyAqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorICogUXVldWU6IChJTikgbnRoIFF1ZXVlIG9mIHRoZSBJTyBDaGFubmVsCisgKiBwU2lnbmFsOiAoSU4pIHBvaW50ZXIgdG8gdGhlIHNpZ25hbAorICoKKyAqIEFzc3VtcHRpb25zOgorICogLSBwQ2hhbm5lbCwgUXVldWUgYW5kIHBTaWduYWwgYXJlIHZhbGlkLgorICogLSBJZiBpbnNlcnRpb24gZmFpbHMgZHVlIHRvIGEgZnVsbCBxdWV1ZSwgdGhlIGNhbGxlciB3aWxsIGRldGVybWluZSB0aGUKKyAqIHJldHJ5IHBvbGljeSAoZS5nLiB3YWl0ICYgdHJ5IGFnYWluLCByZXBvcnQgYW4gZXJyb3IsIGV0Yy4pLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIDEgaWYgdGhlIGluc2VydGlvbiBzdWNjZWVkcywgMCBpZiB0aGUgcXVldWUgd2FzIGZ1bGwuCisgKi8KK3Vuc2lnbmVkIGNoYXIKK3Zpc29yX3NpZ25hbF9pbnNlcnQoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwgdm9pZCAqcFNpZ25hbCkKK3sKKwl2b2lkIF9faW9tZW0gKnBzaWduYWw7CisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWwsIG5vZjsKKworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHIgPQorCSAgICAoU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICopCisJCSgoY2hhciBfX2lvbWVtICopIHBDaGFubmVsICsgcmVhZHEoJnBDaGFubmVsLT5vQ2hhbm5lbFNwYWNlKSkKKwkJKyBRdWV1ZTsKKworCS8qIGNhcHR1cmUgY3VycmVudCBoZWFkIGFuZCB0YWlsICovCisJaGVhZCA9IHJlYWRsKCZwcWhkci0+SGVhZCk7CisJdGFpbCA9IHJlYWRsKCZwcWhkci0+VGFpbCk7CisKKwkvKiBxdWV1ZSBpcyBmdWxsIGlmIChoZWFkICsgMSkgJSBuIGVxdWFscyB0YWlsICovCisJaWYgKCgoaGVhZCArIDEpICUgcmVhZGwoJnBxaGRyLT5NYXhTaWduYWxTbG90cykpID09IHRhaWwpIHsKKwkJbm9mID0gcmVhZHEoJnBxaGRyLT5OdW1PdmVyZmxvd3MpICsgMTsKKwkJd3JpdGVxKG5vZiwgJnBxaGRyLT5OdW1PdmVyZmxvd3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBpbmNyZW1lbnQgdGhlIGhlYWQgaW5kZXggKi8KKwloZWFkID0gKGhlYWQgKyAxKSAlIHJlYWRsKCZwcWhkci0+TWF4U2lnbmFsU2xvdHMpOworCisJLyogY29weSBzaWduYWwgdG8gdGhlIGhlYWQgbG9jYXRpb24gZnJvbSB0aGUgYXJlYSBwb2ludGVkIHRvCisJICogYnkgcFNpZ25hbAorCSAqLworCXBzaWduYWwgPSAoY2hhciBfX2lvbWVtICopcHFoZHIgKyByZWFkcSgmcHFoZHItPm9TaWduYWxCYXNlKSArCisJCShoZWFkICogcmVhZGwoJnBxaGRyLT5TaWduYWxTaXplKSk7CisJTUVNQ1BZX1RPSU8ocHNpZ25hbCwgcFNpZ25hbCwgcmVhZGwoJnBxaGRyLT5TaWduYWxTaXplKSk7CisKKwlWb2xhdGlsZUJhcnJpZXIoKTsKKwl3cml0ZWwoaGVhZCwgJnBxaGRyLT5IZWFkKTsKKworCXdyaXRlcShyZWFkcSgmcHFoZHItPk51bVNpZ25hbHNTZW50KSArIDEsICZwcWhkci0+TnVtU2lnbmFsc1NlbnQpOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3Jfc2lnbmFsX2luc2VydCk7CisKKy8qCisgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgorICogUmVtb3ZlcyBvbmUgc2lnbmFsIGZyb20gQ2hhbm5lbCBwQ2hhbm5lbCdzIG50aCBRdWV1ZSBhdCB0aGUKKyAqIHRpbWUgb2YgdGhlIGNhbGwgYW5kIGNvcGllcyBpdCBpbnRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQorICogcFNpZ25hbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisgKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyAqIHBTaWduYWw6IChJTikgcG9pbnRlciB0byB3aGVyZSB0aGUgc2lnbmFscyBhcmUgdG8gYmUgY29waWVkCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAtIHBDaGFubmVsIGFuZCBRdWV1ZSBhcmUgdmFsaWQuCisgKiAtIHBTaWduYWwgcG9pbnRzIHRvIGEgbWVtb3J5IGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgcXVldWUncyBTaWduYWxTaXplCisgKgorICogUmV0dXJuIHZhbHVlOgorICogMSBpZiB0aGUgcmVtb3ZhbCBzdWNjZWVkcywgMCBpZiB0aGUgcXVldWUgd2FzIGVtcHR5LgorICovCit1bnNpZ25lZCBjaGFyCit2aXNvcl9zaWduYWxfcmVtb3ZlKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsIHZvaWQgKnBTaWduYWwpCit7CisJdm9pZCBfX2lvbWVtICpwc291cmNlOworCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHIgPQorCSAgICAoU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICopICgoY2hhciBfX2lvbWVtICopIHBDaGFubmVsICsKKwkJCQkgICAgcmVhZHEoJnBDaGFubmVsLT5vQ2hhbm5lbFNwYWNlKSkgKyBRdWV1ZTsKKworCS8qIGNhcHR1cmUgY3VycmVudCBoZWFkIGFuZCB0YWlsICovCisJaGVhZCA9IHJlYWRsKCZwcWhkci0+SGVhZCk7CisJdGFpbCA9IHJlYWRsKCZwcWhkci0+VGFpbCk7CisKKwkvKiBxdWV1ZSBpcyBlbXB0eSBpZiB0aGUgaGVhZCBpbmRleCBlcXVhbHMgdGhlIHRhaWwgaW5kZXggKi8KKwlpZiAoaGVhZCA9PSB0YWlsKSB7CisJCXdyaXRlcShyZWFkcSgmcHFoZHItPk51bUVtcHR5Q250KSArIDEsICZwcWhkci0+TnVtRW1wdHlDbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhZHZhbmNlIHBhc3QgdGhlICdlbXB0eScgZnJvbnQgc2xvdCAqLworCXRhaWwgPSAodGFpbCArIDEpICUgcmVhZGwoJnBxaGRyLT5NYXhTaWduYWxTbG90cyk7CisKKwkvKiBjb3B5IHNpZ25hbCBmcm9tIHRhaWwgbG9jYXRpb24gdG8gdGhlIGFyZWEgcG9pbnRlZCB0byBieSBwU2lnbmFsICovCisJcHNvdXJjZSA9IChjaGFyIF9faW9tZW0gKikgcHFoZHIgKyByZWFkcSgmcHFoZHItPm9TaWduYWxCYXNlKSArCisJCSh0YWlsICogcmVhZGwoJnBxaGRyLT5TaWduYWxTaXplKSk7CisJTUVNQ1BZX0ZST01JTyhwU2lnbmFsLCBwc291cmNlLCByZWFkbCgmcHFoZHItPlNpZ25hbFNpemUpKTsKKworCVZvbGF0aWxlQmFycmllcigpOworCXdyaXRlbCh0YWlsLCAmcHFoZHItPlRhaWwpOworCisJd3JpdGVxKHJlYWRxKCZwcWhkci0+TnVtU2lnbmFsc1JlY2VpdmVkKSArIDEsCisJICAgICAgICZwcWhkci0+TnVtU2lnbmFsc1JlY2VpdmVkKTsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NpZ25hbF9yZW1vdmUpOworCisvKgorICogUm91dGluZSBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZXMgYWxsIHNpZ25hbHMgcHJlc2VudCBpbiBDaGFubmVsIHBDaGFubmVsJ3MgbnRoIFF1ZXVlIGF0IHRoZQorICogdGltZSBvZiB0aGUgY2FsbCBhbmQgY29waWVzIHRoZW0gaW50byB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkKKyAqIHBTaWduYWwuICBSZXR1cm5zIHRoZSAjIG9mIHNpZ25hbHMgY29waWVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgcm91dGluZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisgKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyAqIHBTaWduYWw6IChJTikgcG9pbnRlciB0byB3aGVyZSB0aGUgc2lnbmFscyBhcmUgdG8gYmUgY29waWVkCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAtIHBDaGFubmVsIGFuZCBRdWV1ZSBhcmUgdmFsaWQuCisgKiAtIHBTaWduYWwgcG9pbnRzIHRvIGEgbWVtb3J5IGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgUXVldWUncyBNYXhTaWduYWxzCisgKiAjIG9mIHNpZ25hbHMsIGVhY2ggb2Ygd2hpY2ggaXMgUXVldWUncyBTaWduYWxTaXplLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICMgb2Ygc2lnbmFscyBjb3BpZWQuCisgKi8KK3Vuc2lnbmVkIGludAorU2lnbmFsUmVtb3ZlQWxsKHBDSEFOTkVMX0hFQURFUiBwQ2hhbm5lbCwgVTMyIFF1ZXVlLCB2b2lkICpwU2lnbmFsKQoreworCXZvaWQgKnBzb3VyY2U7CisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWwsIHNpZ25hbENvdW50ID0gMDsKKwlwU0lHTkFMX1FVRVVFX0hFQURFUiBwcWhkciA9CisJICAgIChwU0lHTkFMX1FVRVVFX0hFQURFUikgKChjaGFyICopIHBDaGFubmVsICsKKwkJCQkgICAgcENoYW5uZWwtPm9DaGFubmVsU3BhY2UpICsgUXVldWU7CisKKwkvKiBjYXB0dXJlIGN1cnJlbnQgaGVhZCBhbmQgdGFpbCAqLworCWhlYWQgPSBwcWhkci0+SGVhZDsKKwl0YWlsID0gcHFoZHItPlRhaWw7CisKKwkvKiBxdWV1ZSBpcyBlbXB0eSBpZiB0aGUgaGVhZCBpbmRleCBlcXVhbHMgdGhlIHRhaWwgaW5kZXggKi8KKwlpZiAoaGVhZCA9PSB0YWlsKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKKwkJLyogYWR2YW5jZSBwYXN0IHRoZSAnZW1wdHknIGZyb250IHNsb3QgKi8KKwkJdGFpbCA9ICh0YWlsICsgMSkgJSBwcWhkci0+TWF4U2lnbmFsU2xvdHM7CisKKwkJLyogY29weSBzaWduYWwgZnJvbSB0YWlsIGxvY2F0aW9uIHRvIHRoZSBhcmVhIHBvaW50ZWQKKwkJICogdG8gYnkgcFNpZ25hbAorCQkgKi8KKwkJcHNvdXJjZSA9CisJCSAgICAoY2hhciAqKSBwcWhkciArIHBxaGRyLT5vU2lnbmFsQmFzZSArCisJCSAgICAodGFpbCAqIHBxaGRyLT5TaWduYWxTaXplKTsKKwkJTUVNQ1BZKChjaGFyICopIHBTaWduYWwgKyAocHFoZHItPlNpZ25hbFNpemUgKiBzaWduYWxDb3VudCksCisJCSAgICAgICBwc291cmNlLCBwcWhkci0+U2lnbmFsU2l6ZSk7CisKKwkJVm9sYXRpbGVCYXJyaWVyKCk7CisJCXBxaGRyLT5UYWlsID0gdGFpbDsKKworCQlzaWduYWxDb3VudCsrOworCQlwcWhkci0+TnVtU2lnbmFsc1JlY2VpdmVkKys7CisJfQorCisJcmV0dXJuIHNpZ25hbENvdW50OworfQorCisvKgorICogUm91dGluZSBEZXNjcmlwdGlvbjoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKyAqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIDEgaWYgdGhlIHNpZ25hbCBxdWV1ZSBpcyBlbXB0eSwgMCBvdGhlcndpc2UuCisgKi8KK3Vuc2lnbmVkIGNoYXIKK3Zpc29yX3NpZ25hbHF1ZXVlX2VtcHR5KENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUpCit7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBfX2lvbWVtICpwcWhkciA9CisJICAgIChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikgKChjaGFyIF9faW9tZW0gKikgcENoYW5uZWwgKworCQkJCSAgICByZWFkcSgmcENoYW5uZWwtPm9DaGFubmVsU3BhY2UpKSArIFF1ZXVlOworCXJldHVybiByZWFkbCgmcHFoZHItPkhlYWQpID09IHJlYWRsKCZwcWhkci0+VGFpbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9zaWduYWxxdWV1ZV9lbXB0eSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTA0ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscy9jaGFuc3R1Yi5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBFWFBPUlRfU1lNVEFCCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TCisjaW5jbHVkZSA8Y29uZmlnL21vZHZlcnNpb25zLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBmb3IgbW9kdWxlX2luaXQgYW5kIG1vZHVsZV9leGl0ICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyogZm9yIG1lbWNweSAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAiY2hhbnN0dWIuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK3N0YXRpYyBfX2luaXQgaW50CitjaGFubmVsX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZAorY2hhbm5lbF9tb2RfZXhpdCh2b2lkKQoreworfQorCit1bnNpZ25lZCBjaGFyCitTaWduYWxJbnNlcnRfd2l0aExvY2soQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJICAgICAgdm9pZCAqcFNpZ25hbCwgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSB2aXNvcl9zaWduYWxfaW5zZXJ0KHBDaGFubmVsLCBRdWV1ZSwgcFNpZ25hbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordW5zaWduZWQgY2hhcgorU2lnbmFsUmVtb3ZlX3dpdGhMb2NrKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCSAgICAgIHZvaWQgKnBTaWduYWwsIHNwaW5sb2NrX3QgKmxvY2spCit7CisJdW5zaWduZWQgY2hhciByZXN1bHQ7CisJc3Bpbl9sb2NrKGxvY2spOworCXJlc3VsdCA9IHZpc29yX3NpZ25hbF9yZW1vdmUocENoYW5uZWwsIFF1ZXVlLCBwU2lnbmFsKTsKKwlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCittb2R1bGVfaW5pdChjaGFubmVsX21vZF9pbml0KTsKK21vZHVsZV9leGl0KGNoYW5uZWxfbW9kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCcnlhbiBHbGF1ZGVsIik7CitNT0RVTEVfQUxJQVMoInVpc2NoYW4iKTsKKwkvKiB0aGlzIGlzIGV4dHJhY3RlZCBkdXJpbmcgZGVwbW9kIGFuZCBrZXB0IGluIG1vZHVsZXMuZGVwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5zdHViLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NoYW5uZWxzL2NoYW5zdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MjdkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMvY2hhbnN0dWIuaApAQCAtMCwwICsxLDIzIEBACisvKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DSEFOU1RVQl9IX18KKyNkZWZpbmUgX19DSEFOU1RVQl9IX18KK3Vuc2lnbmVkIGNoYXIgU2lnbmFsSW5zZXJ0X3dpdGhMb2NrKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCQkJICAgICB2b2lkICpwU2lnbmFsLCBzcGlubG9ja190ICpsb2NrKTsKK3Vuc2lnbmVkIGNoYXIgU2lnbmFsUmVtb3ZlX3dpdGhMb2NrKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCQkJICAgICB2b2lkICpwU2lnbmFsLCBzcGlubG9ja190ICpsb2NrKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWUyMDQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWwuaApAQCAtMCwwICsxLDY2MSBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19DSEFOTkVMX0hfXworCisvKgorKiBXaGVuZXZlciB0aGlzIGZpbGUgaXMgY2hhbmdlZCBhIGNvcnJlc3BvbmRpbmcgY2hhbmdlIG11c3QgYmUgbWFkZSBpbgorKiB0aGUgQ29uc29sZS9TZXJ2aWNlUGFydC92aXNvcmRpYWdfZWFybHkvc3VwZXJ2aXNvcl9jaGFubmVsLmggZmlsZQorKiB3aGljaCBpcyBuZWVkZWQgZm9yIExpbnV4IGtlcm5lbCBjb21waWxlcy4gVGhlc2UgdHdvIGZpbGVzIG11c3QgYmUKKyogaW4gc3luYy4KKyovCisKKy8qIGRlZmluZSB0aGUgZm9sbG93aW5nIHRvIHByZXZlbnQgaW5jbHVkZSBuZXN0aW5nIGluIGtlcm5lbCBoZWFkZXIKKyAqIGZpbGVzIG9mIHNpbWlsYXIgYWJyZXZpYXRlZCBjb250ZW50CisgKi8KKyNkZWZpbmUgX19TVVBFUlZJU09SX0NIQU5ORUxfSF9fCisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorCisjZGVmaW5lIFNJR05BVFVSRV8xNihBLCBCKSAoKEEpIHwgKEI8PDgpKQorI2RlZmluZSBTSUdOQVRVUkVfMzIoQSwgQiwgQywgRCkgXAorCShTSUdOQVRVUkVfMTYoQSwgQikgfCAoU0lHTkFUVVJFXzE2KEMsIEQpIDw8IDE2KSkKKyNkZWZpbmUgU0lHTkFUVVJFXzY0KEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgpIFwKKwkoU0lHTkFUVVJFXzMyKEEsIEIsIEMsIEQpIHwgKChVNjQpKFNJR05BVFVSRV8zMihFLCBGLCBHLCBIKSkgPDwgMzIpKQorCisjaWZuZGVmIGxlbmd0aG9mCisjZGVmaW5lIGxlbmd0aG9mKFRZUEUsIE1FTUJFUikgKHNpemVvZigoKFRZUEUgKikwKS0+TUVNQkVSKSkKKyNlbmRpZgorI2lmbmRlZiBDT1ZFUlEKKyNkZWZpbmUgQ09WRVJRKHYsIGQpICAoKCh2KSsoZCktMSkgLyAoZCkpCisjZW5kaWYKKyNpZm5kZWYgQ09WRVIKKyNkZWZpbmUgQ09WRVIodiwgZCkgICAoKGQpKkNPVkVSUSh2LCBkKSkKKyNlbmRpZgorCisjaWZuZGVmIEdVSUQwCisjZGVmaW5lIEdVSUQwIHswLCAwLCAwLCB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0gfQorI2VuZGlmCisKKy8qICBUaGUgQyBsYW5ndWFnZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCByZXNwZWN0IHRvIHdoZXJlIGl0IGFsbG93cyBsaXRlcmFsCisgKiAgY29uc3RhbnRzLCBlc3BlY2lhbGx5IGxpdGVyYWwgY29uc3RhbnQgc3RydWN0cy4gIExpdGVyYWwgY29uc3RhbnQgc3RydWN0cworICogIGFyZSBhbGxvd2VkIGZvciBpbml0aWFsaXphdGlvbiBvbmx5LCB3aGVyZWFzIG90aGVyIHR5cGVzIG9mIGxpdGVyYWwKKyAqICBjb25zdGFudHMgYXJlIGFsbG93ZWQgYW55d2hlcmUuICBXZSBnZXQgYXJvdW5kIHRoaXMgaW5jb25zaXN0ZW5jeSBieQorICogIGRlY2xhcmluZyBhICJzdGF0aWMgY29uc3QiIHZhcmlhYmxlIGZvciBlYWNoIEdVSUQuICBUaGlzIHZhcmlhYmxlIGNhbiBiZQorICogIHVzZWQgaW4gZXhwcmVzc2lvbnMgd2hlcmUgdGhlIGxpdGVyYWwgY29uc3RhbnQgd291bGQgbm90IGJlIGFsbG93ZWQuCisgKi8KK3N0YXRpYyBjb25zdCBHVUlEIEd1aWQwID0gR1VJRDA7CisKKyNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgIFNJR05BVFVSRV8zMignRScsICdDJywgJ04nLCAnTCcpCisKK3R5cGVkZWYgZW51bSB7CisJQ0hBTk5FTFNSVl9VTklOSVRJQUxJWkVEID0gMCwJLyogY2hhbm5lbCBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUgKi8KKwlDSEFOTkVMU1JWX1JFQURZID0gMQkvKiBjaGFubmVsIGhhcyBiZWVuIGluaXRpYWxpemVkIGJ5IHNlcnZlciAqLworfSBDSEFOTkVMX1NFUlZFUlNUQVRFOworCit0eXBlZGVmIGVudW0geworCUNIQU5ORUxDTElfREVUQUNIRUQgPSAwLAorCUNIQU5ORUxDTElfRElTQUJMRUQgPSAxLAkvKiBjbGllbnQgY2FuIHNlZSBjaGFubmVsIGJ1dCBpcyBOT1QKKwkJCQkJICogYWxsb3dlZCB0byB1c2UgaXQgdW5sZXNzIGdpdmVuIFRCRAorCQkJCQkgKiBleHBsaWNpdCByZXF1ZXN0IChzaG91bGQgYWN0dWFsbHkgYmUKKwkJCQkJICogPCBERVRBQ0hFRCkgKi8KKwlDSEFOTkVMQ0xJX0FUVEFDSElORyA9IDIsCS8qIGxlZ2FjeSBFRkkgY2xpZW50IHJlcXVlc3QKKwkJCQkJICogZm9yIEVGSSBzZXJ2ZXIgdG8gYXR0YWNoICovCisJQ0hBTk5FTENMSV9BVFRBQ0hFRCA9IDMsCS8qIGlkbGUsIGJ1dCBjbGllbnQgbWF5IHdhbnQKKwkJCQkJICogdG8gdXNlIGNoYW5uZWwgYW55IHRpbWUgKi8KKwlDSEFOTkVMQ0xJX0JVU1kgPSA0LAkvKiBjbGllbnQgZWl0aGVyIHdhbnRzIHRvIHVzZSBvciBpcworCQkJCSAqIHVzaW5nIGNoYW5uZWwgKi8KKwlDSEFOTkVMQ0xJX09XTkVEID0gNQkvKiAibm8gd29ycmllcyIgc3RhdGUgLSBjbGllbnQgY2FuCisJCQkJICogYWNjZXNzIGNoYW5uZWwgYW55dGltZSAqLworfSBDSEFOTkVMX0NMSUVOVFNUQVRFOworc3RhdGljIGlubGluZSBjb25zdCBVOCAqCitVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhVMzIgdikKK3sKKwlzd2l0Y2ggKHYpIHsKKwljYXNlIENIQU5ORUxDTElfREVUQUNIRUQ6CisJCXJldHVybiAoY29uc3QgVTggKikgKCJERVRBQ0hFRCIpOworCWNhc2UgQ0hBTk5FTENMSV9ESVNBQkxFRDoKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkRJU0FCTEVEIik7CisJY2FzZSBDSEFOTkVMQ0xJX0FUVEFDSElORzoKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkFUVEFDSElORyIpOworCWNhc2UgQ0hBTk5FTENMSV9BVFRBQ0hFRDoKKwkJcmV0dXJuIChjb25zdCBVOCAqKSAoIkFUVEFDSEVEIik7CisJY2FzZSBDSEFOTkVMQ0xJX0JVU1k6CisJCXJldHVybiAoY29uc3QgVTggKikgKCJCVVNZIik7CisJY2FzZSBDSEFOTkVMQ0xJX09XTkVEOgorCQlyZXR1cm4gKGNvbnN0IFU4ICopICgiT1dORUQiKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIChjb25zdCBVOCAqKSAoIj8iKTsKK30KKworI2RlZmluZSBVTFRSQV9DSEFOTkVMU1JWX0lTX1JFQURZKHgpICAgICAoKHgpID09IENIQU5ORUxTUlZfUkVBRFkpCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxfU0VSVkVSX1JFQURZKHBDaGFubmVsKSBcCisJKFVMVFJBX0NIQU5ORUxTUlZfSVNfUkVBRFkocmVhZGwoJihwQ2hhbm5lbCktPlNydlN0YXRlKSkpCisKKyNkZWZpbmUgVUxUUkFfVkFMSURfQ0hBTk5FTENMSV9UUkFOU0lUSU9OKG8sIG4pCQkJCVwKKwkoKCgoKG8pID09IENIQU5ORUxDTElfREVUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSAmJiAoKG4pID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSElORykgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9ERVRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX0FUVEFDSElORykpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNISU5HKSAmJiAoKG4pID09IENIQU5ORUxDTElfQVRUQUNIRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0RFVEFDSEVEKSAmJiAoKG4pID09IENIQU5ORUxDTElfQVRUQUNIRUQpKSB8fCBcCisJICAoKChvKSA9PSBDSEFOTkVMQ0xJX0JVU1kpICYmICgobikgPT0gQ0hBTk5FTENMSV9BVFRBQ0hFRCkpIHx8CVwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9CVVNZKSkgfHwJXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9ERVRBQ0hFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgXAorCSAgKCgobykgPT0gQ0hBTk5FTENMSV9BVFRBQ0hJTkcpICYmICgobikgPT0gQ0hBTk5FTENMSV9PV05FRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQVRUQUNIRUQpICYmICgobikgPT0gQ0hBTk5FTENMSV9PV05FRCkpIHx8IFwKKwkgICgoKG8pID09IENIQU5ORUxDTElfQlVTWSkgJiYgKChuKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSkgfHwgKDApKSBcCisJID8gKDEpIDogKDApKQorCisjZGVmaW5lIFVMVFJBX0NIQU5ORUxfQ0xJRU5UX0NIS19UUkFOU0lUSU9OKG9sZCwgbmV3LCBjaGFuSWQsIGxvZ0N0eCwJXAorCQkJCQkgICAgZmlsZSwgbGluZSkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoIVVMVFJBX1ZBTElEX0NIQU5ORUxDTElfVFJBTlNJVElPTihvbGQsIG5ldykpCVwKKwkJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LAkJCQlcCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lURVJSLCBcCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksIFwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsCQlcCisJCQkJICAgICAgX19mdW5jX18sIF9fTElORV9fLAkJXAorCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAoJXMpICVzKCVkKS0tPiVzKCVkKSBAJXM6JWRcbiIsIFwKKwkJCQkgICAgICBjaGFuSWQsICJDbGlTdGF0ZTx4PiIsCQlcCisJCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcob2xkKSwJXAorCQkJCSAgICAgIG9sZCwJCQkJXAorCQkJCSAgICAgIFVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKG5ldyksCVwKKwkJCQkgICAgICBuZXcsCQkJCVwKKwkJCQkgICAgICBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopZmlsZSwgNCksIFwKKwkJCQkgICAgICBsaW5lKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVUxUUkFfQ0hBTk5FTF9DTElFTlRfVFJBTlNJVElPTihwQ2hhbiwgY2hhbklkLAkJCVwKKwkJCQkJbmV3c3RhdGUsIGxvZ0N0eCkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX0NIS19UUkFOU0lUSU9OKAkJCVwKKwkJCXJlYWRsKCYoKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIFwKKwkJCQkgKHBDaGFuKSktPkNsaVN0YXRlT1MpKSwJCVwKKwkJCW5ld3N0YXRlLAkJCQkJXAorCQkJY2hhbklkLCBsb2dDdHgsIF9fRklMRV9fLCBfX0xJTkVfXyk7CQlcCisJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LCBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRPSywgXAorCQkJQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksIFwKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywJCQlcCisJCQkgICAgICBfX2Z1bmNfXywgX19MSU5FX18sCQkJXAorCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uICglcykgJXMoJWQpLS0+JXMoJWQpIEAlczolZFxuIiwgXAorCQkJICAgICAgY2hhbklkLCAiQ2xpU3RhdGVPUyIsCQkJXAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoIFwKKwkJCQkgICAgICByZWFkbCgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopIFwKKwkJCQkJICAgICAgKHBDaGFuKSktPkNsaVN0YXRlT1MpKSwJXAorCQkJICAgICAgcmVhZGwoJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSBcCisJCQkJICAgICAgKHBDaGFuKSktPkNsaVN0YXRlT1MpLAkJXAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcobmV3c3RhdGUpLAlcCisJCQkgICAgICBuZXdzdGF0ZSwJCQkJCVwKKwkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcyhfX0ZJTEVfXywgNCksIF9fTElORV9fKTsgXAorCQl3cml0ZWwobmV3c3RhdGUsICYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgXAorCQkJCSAgIChwQ2hhbikpLT5DbGlTdGF0ZU9TKTsJCVwKKwkJTUVNT1JZQkFSUklFUjsJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVTFRSQV9DSEFOTkVMX0NMSUVOVF9BQ1FVSVJFX09TKHBDaGFuLCBjaGFuSWQsIGxvZ0N0eCkJXAorCVVMVFJBX2NoYW5uZWxfY2xpZW50X2FjcXVpcmVfb3MocENoYW4sIGNoYW5JZCwgbG9nQ3R4LAkJXAorCQkJCQkoY2hhciAqKV9fRklMRV9fLCBfX0xJTkVfXywJXAorCQkJCQkoY2hhciAqKV9fZnVuY19fKQorI2RlZmluZSBVTFRSQV9DSEFOTkVMX0NMSUVOVF9SRUxFQVNFX09TKHBDaGFuLCBjaGFuSWQsIGxvZ0N0eCkJXAorCVVMVFJBX2NoYW5uZWxfY2xpZW50X3JlbGVhc2Vfb3MocENoYW4sIGNoYW5JZCwgbG9nQ3R4LAlcCisJCShjaGFyICopX19GSUxFX18sIF9fTElORV9fLCAoY2hhciAqKV9fZnVuY19fKQorCisvKiBWYWx1ZXMgZm9yIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wuQ2xpRXJyb3JCb290OiAqLworLyogdGhyb3R0bGluZyBpbnZhbGlkIGJvb3QgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvIGNsaWVudAorICogZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JCT09UX1RIUk9UVExFTVNHX0RJU0FCTEVEICAgIDB4MDEKKworLyogdGhyb3R0bGluZyBpbnZhbGlkIGJvb3QgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvIGNsaWVudAorICogbm90IGF0dGFjaGVkICovCisjZGVmaW5lIFVMVFJBX0NMSUVSUk9SQk9PVF9USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCAweDAyCisKKy8qIHRocm90dGxpbmcgaW52YWxpZCBib290IGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0byBidXN5IGNoYW5uZWwgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JCT09UX1RIUk9UVExFTVNHX0JVU1kgICAgICAgIDB4MDQKKworLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkNsaUVycm9yT1M6ICovCisvKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCisgKiBjbGllbnQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19ESVNBQkxFRCAgICAgIDB4MDEKKworLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bworICogY2xpZW50IG5vdCBhdHRhY2hlZCAqLworI2RlZmluZSBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEICAgMHgwMgorCisvKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCisgKiBidXN5IGNoYW5uZWwgKi8KKyNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZICAgICAgICAgIDB4MDQKKworLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkZlYXR1cmVzOiBUaGlzIGRlZmluZSBleGlzdHMgc28KKyogdGhhdCB3aW5kb3dzIGd1ZXN0IGNhbiBsb29rIGF0IHRoZSBGZWF0dXJlRmxhZ3MgaW4gdGhlIGlvIGNoYW5uZWwsCisqIGFuZCBjb25maWd1cmUgdGhlIHdpbmRvd3MgZHJpdmVyIHRvIHVzZSBpbnRlcnJ1cHRzIG9yIG5vdCBiYXNlZCBvbgorKiB0aGlzIHNldHRpbmcuICBUaGlzIGZsYWcgaXMgc2V0IGluIHVpc2xpYiBhZnRlciB0aGUKKyogVUxUUkFfVkhCQV9pbml0X2NoYW5uZWwgaXMgY2FsbGVkLiAgQWxsIGZlYXR1cmUgYml0cyBmb3IgYWxsCisqIGNoYW5uZWxzIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUuICBUaGUgaW8gY2hhbm5lbCBmZWF0dXJlIGJpdHMgYXJlCisqIGRlZmluZWQgcmlnaHQgaGVyZSAqLworI2RlZmluZSBVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTICgweDFVTEwgPDwgMSkKKyNkZWZpbmUgVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HICgweDFVTEwgPDwgMykKKyNkZWZpbmUgVUxUUkFfSU9fSU9WTV9JU19PS19XSVRIX0RSSVZFUl9ESVNBQkxJTkdfSU5UUyAoMHgxVUxMIDw8IDQpCisjZGVmaW5lIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTICgweDFVTEwgPDwgNSkKKyNkZWZpbmUgVUxUUkFfSU9fRFJJVkVSX1NVUFBPUlRTX0VOSEFOQ0VEX1JDVkJVRl9DSEVDS0lORyAoMHgxVUxMIDw8IDYpCisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLworLyogQ29tbW9uIENoYW5uZWwgSGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9IRUFERVIgeworCVU2NCBTaWduYXR1cmU7CQkvKiBTaWduYXR1cmUgKi8KKwlVMzIgTGVnYWN5U3RhdGU7CS8qIERFUFJFQ0FURUQgLSBiZWluZyByZXBsYWNlZCBieSAqLworCS8qIC8gICAgICAgICAgICAgIFNydlN0YXRlLCBDbGlTdGF0ZUJvb3QsIGFuZCBDbGlTdGF0ZU9TIGJlbG93ICovCisJVTMyIEhlYWRlclNpemU7CQkvKiBzaXplb2YoQ0hBTk5FTF9IRUFERVIpICovCisJVTY0IFNpemU7CQkvKiBUb3RhbCBzaXplIG9mIHRoaXMgY2hhbm5lbCBpbiBieXRlcyAqLworCVU2NCBGZWF0dXJlczsJCS8qIEZsYWdzIHRvIG1vZGlmeSBiZWhhdmlvciAqLworCUdVSUQgVHlwZTsJCS8qIENoYW5uZWwgdHlwZTogZGF0YSwgYnVzLCBjb250cm9sLCBldGMuICovCisJVTY0IFBhcnRpdGlvbkhhbmRsZTsJLyogSUQgb2YgZ3Vlc3QgcGFydGl0aW9uICovCisJVTY0IEhhbmRsZTsJCS8qIERldmljZSBudW1iZXIgb2YgdGhpcyBjaGFubmVsIGluIGNsaWVudCAqLworCVU2NCBvQ2hhbm5lbFNwYWNlOwkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gY2hhbm5lbCBzcGVjaWZpYyBhcmVhICovCisJVTMyIFZlcnNpb25JZDsJCS8qIENIQU5ORUxfSEVBREVSIFZlcnNpb24gSUQgKi8KKwlVMzIgUGFydGl0aW9uSW5kZXg7CS8qIEluZGV4IG9mIGd1ZXN0IHBhcnRpdGlvbiAqLworCUdVSUQgWm9uZUd1aWQ7CQkvKiBHdWlkIG9mIENoYW5uZWwncyB6b25lICovCisJVTMyIG9DbGllbnRTdHJpbmc7CS8qIG9mZnNldCBmcm9tIGNoYW5uZWwgaGVhZGVyIHRvCisJCQkJICogbnVsLXRlcm1pbmF0ZWQgQ2xpZW50U3RyaW5nICgwIGlmCisJCQkJICogQ2xpZW50U3RyaW5nIG5vdCBwcmVzZW50KSAqLworCVUzMiBDbGlTdGF0ZUJvb3Q7CS8qIENIQU5ORUxfQ0xJRU5UU1RBVEUgb2YgcHJlLWJvb3QKKwkJCQkgKiBFRkkgY2xpZW50IG9mIHRoaXMgY2hhbm5lbCAqLworCVUzMiBDbWRTdGF0ZUNsaTsJLyogQ0hBTk5FTF9DT01NQU5EU1RBVEUgKG92ZXJsb2FkZWQgaW4KKwkJCQkgKiBXaW5kb3dzIGRyaXZlcnMsIHNlZSBTZXJ2ZXJTdGF0ZVVwLAorCQkJCSAqIFNlcnZlclN0YXRlRG93biwgZXRjKSAqLworCVUzMiBDbGlTdGF0ZU9TOwkJLyogQ0hBTk5FTF9DTElFTlRTVEFURSBvZiBHdWVzdCBPUworCQkJCSAqIGNsaWVudCBvZiB0aGlzIGNoYW5uZWwgKi8KKwlVMzIgQ2hhbm5lbENoYXJhY3RlcmlzdGljczsJLyogQ0hBTk5FTF9DSEFSQUNURVJJU1RJQ188eHh4PiAqLworCVUzMiBDbWRTdGF0ZVNydjsJLyogQ0hBTk5FTF9DT01NQU5EU1RBVEUgKG92ZXJsb2FkZWQgaW4KKwkJCQkgKiBXaW5kb3dzIGRyaXZlcnMsIHNlZSBTZXJ2ZXJTdGF0ZVVwLAorCQkJCSAqIFNlcnZlclN0YXRlRG93biwgZXRjKSAqLworCVUzMiBTcnZTdGF0ZTsJCS8qIENIQU5ORUxfU0VSVkVSU1RBVEUgKi8KKwlVOCBDbGlFcnJvckJvb3Q7CS8qIGJpdHMgdG8gaW5kaWNhdGUgZXJyIHN0YXRlcyBmb3IKKwkJCQkgKiBib290IGNsaWVudHMsIHNvIGVyciBtZXNzYWdlcyBjYW4KKwkJCQkgKiBiZSB0aHJvdHRsZWQgKi8KKwlVOCBDbGlFcnJvck9TOwkJLyogYml0cyB0byBpbmRpY2F0ZSBlcnIgc3RhdGVzIGZvciBPUworCQkJCSAqIGNsaWVudHMsIHNvIGVyciBtZXNzYWdlcyBjYW4gYmUKKwkJCQkgKiB0aHJvdHRsZWQgKi8KKwlVOCBGaWxsZXJbMV07CQkvKiBQYWQgb3V0IHRvIDEyOCBieXRlIGNhY2hlbGluZSAqLworCS8qIFBsZWFzZSBhZGQgYWxsIG5ldyBzaW5nbGUtYnl0ZSB2YWx1ZXMgYmVsb3cgaGVyZSAqLworCVU4IFJlY292ZXJDaGFubmVsOworfSBDSEFOTkVMX0hFQURFUiwgKnBDSEFOTkVMX0hFQURFUiwgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTDsKKworI2RlZmluZSBVTFRSQV9DSEFOTkVMX0VOQUJMRV9JTlRTICgweDFVTEwgPDwgMCkKKworLyogU3ViaGVhZGVyIGZvciB0aGUgU2lnbmFsIFR5cGUgdmFyaWF0aW9uIG9mIHRoZSBDb21tb24gQ2hhbm5lbCAqLwordHlwZWRlZiBzdHJ1Y3QgX1NJR05BTF9RVUVVRV9IRUFERVIgeworCS8qIDFzdCBjYWNoZSBsaW5lICovCisJVTMyIFZlcnNpb25JZDsJCS8qIFNJR05BTF9RVUVVRV9IRUFERVIgVmVyc2lvbiBJRCAqLworCVUzMiBUeXBlOwkJLyogUXVldWUgdHlwZTogc3RvcmFnZSwgbmV0d29yayAqLworCVU2NCBTaXplOwkJLyogVG90YWwgc2l6ZSBvZiB0aGlzIHF1ZXVlIGluIGJ5dGVzICovCisJVTY0IG9TaWduYWxCYXNlOwkvKiBPZmZzZXQgdG8gc2lnbmFsIHF1ZXVlIGFyZWEgKi8KKwlVNjQgRmVhdHVyZUZsYWdzOwkvKiBGbGFncyB0byBtb2RpZnkgYmVoYXZpb3IgKi8KKwlVNjQgTnVtU2lnbmFsc1NlbnQ7CS8qIFRvdGFsICMgb2Ygc2lnbmFscyBwbGFjZWQgaW4gdGhpcyBxdWV1ZSAqLworCVU2NCBOdW1PdmVyZmxvd3M7CS8qIFRvdGFsICMgb2YgaW5zZXJ0cyBmYWlsZWQgZHVlIHRvCisJCQkJICogZnVsbCBxdWV1ZSAqLworCVUzMiBTaWduYWxTaXplOwkJLyogVG90YWwgc2l6ZSBvZiBhIHNpZ25hbCBmb3IgdGhpcyBxdWV1ZSAqLworCVUzMiBNYXhTaWduYWxTbG90czsJLyogTWF4ICMgb2Ygc2xvdHMgaW4gcXVldWUsIDEgc2xvdCBpcworCQkJCSAqIGFsd2F5cyBlbXB0eSAqLworCVUzMiBNYXhTaWduYWxzOwkJLyogTWF4ICMgb2Ygc2lnbmFscyBpbiBxdWV1ZQorCQkJCSAqIChNYXhTaWduYWxTbG90cy0xKSAqLworCVUzMiBIZWFkOwkJLyogUXVldWUgaGVhZCBzaWduYWwgIyAqLworCS8qIDJuZCBjYWNoZSBsaW5lICovCisJVTY0IE51bVNpZ25hbHNSZWNlaXZlZDsJLyogVG90YWwgIyBvZiBzaWduYWxzIHJlbW92ZWQgZnJvbSB0aGlzIHF1ZXVlICovCisJVTMyIFRhaWw7CQkvKiBRdWV1ZSB0YWlsIHNpZ25hbCAjIChvbiBzZXBhcmF0ZQorCQkJCSAqIGNhY2hlIGxpbmUpICovCisJVTMyIFJlc2VydmVkMTsJCS8qIFJlc2VydmVkIGZpZWxkICovCisJVTY0IFJlc2VydmVkMjsJCS8qIFJlc3J2ZWQgZmllbGQgKi8KKwlVNjQgQ2xpZW50UXVldWU7CisJVTY0IE51bUludGVycnVwdHNSZWNlaXZlZDsJLyogVG90YWwgIyBvZiBJbnRlcnJ1cHRzIHJlY2VpdmVkLiAgVGhpcworCQkJCQkgKiBpcyBpbmNyZW1lbnRlZCBieSB0aGUgSVNSIGluIHRoZQorCQkJCQkgKiBndWVzdCB3aW5kb3dzIGRyaXZlciAqLworCVU2NCBOdW1FbXB0eUNudDsJLyogTnVtYmVyIG9mIHRpbWVzIHRoYXQgdmlzb3Jfc2lnbmFsX3JlbW92ZQorCQkJCSAqIGlzIGNhbGxlZCBhbmQgcmV0dXJuZWQgRW1wdHkKKwkJCQkgKiBTdGF0dXMuICovCisJVTMyIEVycm9yRmxhZ3M7CQkvKiBFcnJvciBiaXRzIHNldCBkdXJpbmcgU2lnbmFsUmVpbml0CisJCQkJICogdG8gZGVub3RlIHRyb3VibGUgd2l0aCBjbGllbnQncworCQkJCSAqIGZpZWxkcyAqLworCVU4IEZpbGxlclsxMl07CQkvKiBQYWQgb3V0IHRvIDY0IGJ5dGUgY2FjaGVsaW5lICovCit9IFNJR05BTF9RVUVVRV9IRUFERVIsICpwU0lHTkFMX1FVRVVFX0hFQURFUjsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBTaWduYWxJbml0KGNoYW4sIFFIRFJGTEQsIFFEQVRBRkxELCBRREFUQVRZUEUsIHZlciwgdHlwKQlcCisJZG8gewkJCQkJCQkJXAorCQlNRU1TRVQoJmNoYW4tPlFIRFJGTEQsIDAsIHNpemVvZihjaGFuLT5RSERSRkxEKSk7CVwKKwkJY2hhbi0+UUhEUkZMRC5WZXJzaW9uSWQgPSB2ZXI7CQkJCVwKKwkJY2hhbi0+UUhEUkZMRC5UeXBlID0gdHlwOwkJCQlcCisJCWNoYW4tPlFIRFJGTEQuU2l6ZSA9IHNpemVvZihjaGFuLT5RREFUQUZMRCk7CQlcCisJCWNoYW4tPlFIRFJGTEQuU2lnbmFsU2l6ZSA9IHNpemVvZihRREFUQVRZUEUpOwkJXAorCQljaGFuLT5RSERSRkxELm9TaWduYWxCYXNlID0gKFVJTlROKShjaGFuLT5RREFUQUZMRCktCVwKKwkJCShVSU5UTikoJmNoYW4tPlFIRFJGTEQpOwkJCVwKKwkJY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxTbG90cyA9CQkJCVwKKwkJCXNpemVvZihjaGFuLT5RREFUQUZMRCkvc2l6ZW9mKFFEQVRBVFlQRSk7CVwKKwkJY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxzID0gY2hhbi0+UUhEUkZMRC5NYXhTaWduYWxTbG90cy0xOyBcCisJfSB3aGlsZSAoMCkKKworLyogR2VuZXJpYyBmdW5jdGlvbiB1c2VmdWwgZm9yIHZhbGlkYXRpbmcgYW55IHR5cGUgb2YgY2hhbm5lbCB3aGVuIGl0IGlzCisgKiByZWNlaXZlZCBieSB0aGUgY2xpZW50IHRoYXQgd2lsbCBiZSBhY2Nlc3NpbmcgdGhlIGNoYW5uZWwuCisgKiBOb3RlIHRoYXQgPGxvZ0N0eD4gaXMgb25seSBuZWVkZWQgZm9yIGNhbGxlcnMgaW4gdGhlIEVGSSBlbnZpcm9ubWVudCwgYW5kCisgKiBpcyB1c2VkIHRvIHBhc3MgdGhlIEVGSV9ESUFHX0NBUFRVUkVfUFJPVE9DT0wgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1VMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHZvaWQgX19pb21lbSAqcENoYW5uZWwsCisJCQkgICBHVUlEIGV4cGVjdGVkVHlwZUd1aWQsCisJCQkgICBjaGFyICpjaGFubmVsTmFtZSwKKwkJCSAgIFU2NCBleHBlY3RlZE1pbkJ5dGVzLAorCQkJICAgVTMyIGV4cGVjdGVkVmVyc2lvbklkLAorCQkJICAgVTY0IGV4cGVjdGVkU2lnbmF0dXJlLAorCQkJICAgY2hhciAqZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCB2b2lkICpsb2dDdHgpCit7CisJaWYgKE1FTUNNUCgmZXhwZWN0ZWRUeXBlR3VpZCwgJkd1aWQwLCBzaXplb2YoR1VJRCkpICE9IDApCisJCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkgdHlwZSBHVUlEICovCisJCWlmIChNRU1DTVBfSU8oJigoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgKHBDaGFubmVsKSktPlR5cGUpLAorCQkJICAgJmV4cGVjdGVkVHlwZUd1aWQsIHNpemVvZihHVUlEKSkgIT0gMCkgeworCQkJQ0hBTk5FTF9HVUlEX01JU01BVENIKGV4cGVjdGVkVHlwZUd1aWQsIGNoYW5uZWxOYW1lLAorCQkJCQkgICAgICAidHlwZSIsIGV4cGVjdGVkVHlwZUd1aWQsCisJCQkJCSAgICAgICgoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKQorCQkJCQkgICAgICAgKHBDaGFubmVsKSktPlR5cGUsIGZpbGVOYW1lLAorCQkJCQkgICAgICBsaW5lTnVtYmVyLCBsb2dDdHgpOworCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZXhwZWN0ZWRNaW5CeXRlcyA+IDApCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkKKwkJCQkJICogY2hhbm5lbCBzaXplICovCisJCWlmIChyZWFkcSgmKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkgICAocENoYW5uZWwpKS0+U2l6ZSkgPCBleHBlY3RlZE1pbkJ5dGVzKSB7CisJCQlDSEFOTkVMX1U2NF9NSVNNQVRDSChleHBlY3RlZFR5cGVHdWlkLCBjaGFubmVsTmFtZSwKKwkJCQkJICAgICAic2l6ZSIsIGV4cGVjdGVkTWluQnl0ZXMsCisJCQkJCSAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkJCSAgICAgIChwQ2hhbm5lbCkpLT5TaXplLCBmaWxlTmFtZSwKKwkJCQkJICAgICBsaW5lTnVtYmVyLCBsb2dDdHgpOworCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZXhwZWN0ZWRWZXJzaW9uSWQgPiAwKQkvKiBjYWxsZXIgd2FudHMgdXMgdG8gdmVyaWZ5CisJCQkJCSAqIGNoYW5uZWwgdmVyc2lvbiAqLworCQlpZiAocmVhZGwoJigoQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqKSAocENoYW5uZWwpKS0+VmVyc2lvbklkKQorCQkgICAgIT0gZXhwZWN0ZWRWZXJzaW9uSWQpIHsKKwkJCUNIQU5ORUxfVTMyX01JU01BVENIKGV4cGVjdGVkVHlwZUd1aWQsIGNoYW5uZWxOYW1lLAorCQkJCQkgICAgICJ2ZXJzaW9uIiwgZXhwZWN0ZWRWZXJzaW9uSWQsCisJCQkJCSAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkJCSAgICAgIChwQ2hhbm5lbCkpLT5WZXJzaW9uSWQsIGZpbGVOYW1lLAorCQkJCQkgICAgIGxpbmVOdW1iZXIsIGxvZ0N0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWlmIChleHBlY3RlZFNpZ25hdHVyZSA+IDApCS8qIGNhbGxlciB3YW50cyB1cyB0byB2ZXJpZnkKKwkJCQkJICogY2hhbm5lbCBzaWduYXR1cmUgKi8KKwkJaWYgKHJlYWRxKCYoKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKikgKHBDaGFubmVsKSktPlNpZ25hdHVyZSkKKwkJICAgICE9IGV4cGVjdGVkU2lnbmF0dXJlKSB7CisJCQlDSEFOTkVMX1U2NF9NSVNNQVRDSChleHBlY3RlZFR5cGVHdWlkLCBjaGFubmVsTmFtZSwKKwkJCQkJICAgICAic2lnbmF0dXJlIiwgZXhwZWN0ZWRTaWduYXR1cmUsCisJCQkJCSAgICAgKChDSEFOTkVMX0hFQURFUiBfX2lvbWVtICopCisJCQkJCSAgICAgIChwQ2hhbm5lbCkpLT5TaWduYXR1cmUsIGZpbGVOYW1lLAorCQkJCQkgICAgIGxpbmVOdW1iZXIsIGxvZ0N0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworfQorCisvKiBHZW5lcmljIGZ1bmN0aW9uIHVzZWZ1bCBmb3IgdmFsaWRhdGluZyBhbnkgdHlwZSBvZiBjaGFubmVsIHdoZW4gaXQgaXMgYWJvdXQKKyAqIHRvIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBzZXJ2ZXIgb2YgdGhlIGNoYW5uZWwuCisgKiBOb3RlIHRoYXQgPGxvZ0N0eD4gaXMgb25seSBuZWVkZWQgZm9yIGNhbGxlcnMgaW4gdGhlIEVGSSBlbnZpcm9ubWVudCwgYW5kCisgKiBpcyB1c2VkIHRvIHBhc3MgdGhlIEVGSV9ESUFHX0NBUFRVUkVfUFJPVE9DT0wgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1VMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKEdVSUQgdHlwZUd1aWQsCisJCQkgICBjaGFyICpjaGFubmVsTmFtZSwKKwkJCSAgIFU2NCBleHBlY3RlZE1pbkJ5dGVzLAorCQkJICAgVTY0IGFjdHVhbEJ5dGVzLAorCQkJICAgY2hhciAqZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCB2b2lkICpsb2dDdHgpCit7CisJaWYgKGV4cGVjdGVkTWluQnl0ZXMgPiAwKQkvKiBjYWxsZXIgd2FudHMgdXMgdG8gdmVyaWZ5CisJCQkJCSAqIGNoYW5uZWwgc2l6ZSAqLworCQlpZiAoYWN0dWFsQnl0ZXMgPCBleHBlY3RlZE1pbkJ5dGVzKSB7CisJCQlDSEFOTkVMX1U2NF9NSVNNQVRDSCh0eXBlR3VpZCwgY2hhbm5lbE5hbWUsICJzaXplIiwKKwkJCQkJICAgICBleHBlY3RlZE1pbkJ5dGVzLCBhY3R1YWxCeXRlcywKKwkJCQkJICAgICBmaWxlTmFtZSwgbGluZU51bWJlciwgbG9nQ3R4KTsKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7Cit9CisKKy8qIEdpdmVuIGEgZmlsZSBwYXRobmFtZSA8cz4gKHdpdGggJy8nIG9yICdcJyBzZXBhcmF0aW5nIGRpcmVjdG9yeSBub2RlcyksCisgKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGEgbm9kZSB3aXRoaW4gdGhhdCBwYXRobmFtZSBzdWNoCisgKiB0aGF0IHRoZSBudW1iZXIgb2Ygbm9kZXMgZnJvbSB0aGF0IHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGlzCisgKiBOT1QgbW9yZSB0aGFuIDxuPi4gIE5vdGUgdGhhdCBpZiB0aGUgcGF0aG5hbWUgaGFzIGxlc3MgdGhhbiA8bj4gbm9kZXMKKyAqIGluIGl0LCB0aGUgcmV0dXJuIHBvaW50ZXIgd2lsbCBiZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgVTggKgorUGF0aE5hbWVfTGFzdF9OX05vZGVzKFU4ICpzLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlVOCAqcCA9IHM7CisJdW5zaWduZWQgaW50IG5vZGVfY291bnQgPSAwOworCXdoaWxlICgqcCAhPSAnXDAnKSB7CisJCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCisJCQlub2RlX2NvdW50Kys7CisJCXArKzsKKwl9CisJaWYgKG5vZGVfY291bnQgPD0gbikKKwkJcmV0dXJuIHM7CisJd2hpbGUgKG4gPiAwKSB7CisJCXAtLTsKKwkJaWYgKHAgPT0gcykKKwkJCWJyZWFrOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCB1bmxlc3Mgc29tZW9uZQorCQkJCSAqIGlzIGNoYW5naW5nIHRoZSBzdHJpbmcgd2hpbGUgd2UgYXJlCisJCQkJICogbG9va2luZyBhdCBpdCEhICovCisJCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCisJCQluLS07CisJfQorCXJldHVybiBwICsgMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK1VMVFJBX2NoYW5uZWxfY2xpZW50X2FjcXVpcmVfb3Modm9pZCBfX2lvbWVtICpwQ2hhbm5lbCwgVTggKmNoYW5JZCwKKwkJCQl2b2lkICpsb2dDdHgsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBjaGFyICpmdW5jKQoreworCUNIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFuID0gcENoYW5uZWw7CisKKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSB7CisJCWlmICgocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKQorCQkgICAgICYgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19ESVNBQkxFRCkgPT0gMCkgeworCQkJLyogd2UgYXJlIE5PVCB0aHJvdHRsaW5nIHRoaXMgbWVzc2FnZSAqLworCQkJd3JpdGViKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgfAorCQkJICAgICAgIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfRElTQUJMRUQsCisJCQkgICAgICAgJnBDaGFuLT5DbGlFcnJvck9TKTsKKwkJCS8qIHRocm90dGxlIHVudGlsIGFjcXVpcmUgc3VjY2Vzc2Z1bCAqLworCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRFUlIsCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IERJU0FCTEVEIEAlczolZFxuIiwKKwkJCQkgICAgICBjaGFuSWQsIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygKKwkJCQkJICAgICAgKFU4ICopIGZpbGUsIDQpLCBsaW5lKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpICE9IENIQU5ORUxDTElfT1dORUQpCisJICAgICYmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlQm9vdCkgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkpIHsKKwkJLyogT3VyIGNvbXBldGl0b3IgaXMgRElTQUJMRUQsIHNvIHdlIGNhbiB0cmFuc2l0aW9uIHRvIE9XTkVEICovCisJCVVsdHJhTG9nRXZlbnQobG9nQ3R4LCBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRPSywKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uICglcykgJXMoJWQpLS0+JXMoJWQpIEAlczolZFxuIiwKKwkJCSAgICAgIGNoYW5JZCwgIkNsaVN0YXRlT1MiLAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCisJCQkJICAgICAgcmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSksCisJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpLAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoQ0hBTk5FTENMSV9PV05FRCksCisJCQkgICAgICBDSEFOTkVMQ0xJX09XTkVELAorCQkJICAgICAgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwgbGluZSk7CisJCXdyaXRlbChDSEFOTkVMQ0xJX09XTkVELCAmcENoYW4tPkNsaVN0YXRlT1MpOworCQlNRU1PUllCQVJSSUVSOworCX0KKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSB7CisJCWlmIChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpICE9IDApIHsKKwkJCS8qIHdlIGFyZSBpbiBhbiBlcnJvciBtc2cgdGhyb3R0bGluZyBzdGF0ZTsKKwkJCSAqIGNvbWUgb3V0IG9mIGl0ICovCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRPSywKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkJICAgICAgIiVzIENoYW5uZWwgT1MgY2xpZW50IGFjcXVpcmUgbm93IHN1Y2Nlc3NmdWwgQCVzOiVkXG4iLAorCQkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLAorCQkJCQkJCQkgICAgNCksIGxpbmUpOworCQkJd3JpdGViKDAsICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJLyogV2UgaGF2ZSB0byBkbyBpdCB0aGUgImhhcmQgd2F5Ii4gIFdlIHRyYW5zaXRpb24gdG8gQlVTWSwKKwkqIGFuZCBjYW4gdXNlIHRoZSBjaGFubmVsIGlmZiBvdXIgY29tcGV0aXRvciBoYXMgbm90IGFsc28KKwkqIHRyYW5zaXRpb25lZCB0byBCVVNZLiAqLworCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpICE9IENIQU5ORUxDTElfQVRUQUNIRUQpIHsKKwkJaWYgKChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpCisJCSAgICAgJiBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEKSA9PSAwKSB7CisJCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCisJCQl3cml0ZWIocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKSB8CisJCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCwKKwkJCSAgICAgICAmcENoYW4tPkNsaUVycm9yT1MpOworCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRFUlIsCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJCSAgICAgICIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IE5PVCBBVFRBQ0hFRCAoc3RhdGU9JXMoJWQpKSBAJXM6JWRcbiIsCisJCQkJICAgICAgY2hhbklkLAorCQkJCSAgICAgIFVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKAorCQkJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpKSwKKwkJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpLAorCQkJCSAgICAgIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKikgZmlsZSwgNCksCisJCQkJICAgICAgbGluZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXdyaXRlbChDSEFOTkVMQ0xJX0JVU1ksICZwQ2hhbi0+Q2xpU3RhdGVPUyk7CisJTUVNT1JZQkFSUklFUjsKKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZUJvb3QpID09IENIQU5ORUxDTElfQlVTWSkgeworCQlpZiAoKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykKKwkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSkgPT0gMCkgeworCQkJLyogd2UgYXJlIE5PVCB0aHJvdHRsaW5nIHRoaXMgbWVzc2FnZSAqLworCQkJd3JpdGViKHJlYWRiKCZwQ2hhbi0+Q2xpRXJyb3JPUykgfAorCQkJICAgICAgIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSwKKwkJCSAgICAgICAmcENoYW4tPkNsaUVycm9yT1MpOworCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCisJCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwKKwkJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19FVkVOVElEX1RSQU5TSVRCVVNZLAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKKwkJCQkgICAgICAiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gZmFpbGVkIC0gaG9zdCBPUyBhY3F1aXJlIGZhaWxlZCBiZWNhdXNlIGJvb3QgQlVTWSBAJXM6JWRcbiIsCisJCQkJICAgICAgY2hhbklkLCBQYXRoTmFtZV9MYXN0X05fTm9kZXMoKFU4ICopIGZpbGUsCisJCQkJCQkJCSAgICA0KSwgbGluZSk7CisJCX0KKwkJLyogcmVzZXQgYnVzeSAqLworCQl3cml0ZWwoQ0hBTk5FTENMSV9BVFRBQ0hFRCwgJnBDaGFuLT5DbGlTdGF0ZU9TKTsKKwkJTUVNT1JZQkFSUklFUjsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyZWFkYigmcENoYW4tPkNsaUVycm9yT1MpICE9IDApIHsKKwkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOyBjb21lIG91dCBvZiBpdCAqLworCQlVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgQ0hBTk5FTFNUQVRFX0RJQUdfRVZFTlRJRF9UUkFOU0lUT0ssCisJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TRVZFUklUWSwKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NVQlNZUywgZnVuYywgbGluZSwKKwkJCSAgICAgICIlcyBDaGFubmVsIE9TIGNsaWVudCBhY3F1aXJlIG5vdyBzdWNjZXNzZnVsIEAlczolZFxuIiwKKwkJCSAgICAgIGNoYW5JZCwgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwKKwkJCSAgICAgIGxpbmUpOworCQl3cml0ZWIoMCwgJnBDaGFuLT5DbGlFcnJvck9TKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorVUxUUkFfY2hhbm5lbF9jbGllbnRfcmVsZWFzZV9vcyh2b2lkIF9faW9tZW0gKnBDaGFubmVsLCBVOCAqY2hhbklkLAorCQkJCXZvaWQgKmxvZ0N0eCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKmZ1bmMpCit7CisJQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW4gPSBwQ2hhbm5lbDsKKwlpZiAocmVhZGIoJnBDaGFuLT5DbGlFcnJvck9TKSAhPSAwKSB7CisJCS8qIHdlIGFyZSBpbiBhbiBlcnJvciBtc2cgdGhyb3R0bGluZyBzdGF0ZTsgY29tZSBvdXQgb2YgaXQgKi8KKwkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVE9LLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU0VWRVJJVFksCisJCQkgICAgICBDSEFOTkVMU1RBVEVfRElBR19TVUJTWVMsIGZ1bmMsIGxpbmUsCisJCQkgICAgICAiJXMgQ2hhbm5lbCBPUyBjbGllbnQgZXJyb3Igc3RhdGUgY2xlYXJlZCBAJXM6JWRcbiIsCisJCQkgICAgICBjaGFuSWQsIFBhdGhOYW1lX0xhc3RfTl9Ob2RlcygoVTggKikgZmlsZSwgNCksCisJCQkgICAgICBsaW5lKTsKKwkJd3JpdGViKDAsICZwQ2hhbi0+Q2xpRXJyb3JPUyk7CisJfQorCWlmIChyZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpID09IENIQU5ORUxDTElfT1dORUQpCisJCXJldHVybjsKKwlpZiAocmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSAhPSBDSEFOTkVMQ0xJX0JVU1kpIHsKKwkJVWx0cmFMb2dFdmVudChsb2dDdHgsIENIQU5ORUxTVEFURV9ESUFHX0VWRU5USURfVFJBTlNJVEVSUiwKKwkJCSAgICAgIENIQU5ORUxTVEFURV9ESUFHX1NFVkVSSVRZLAorCQkJICAgICAgQ0hBTk5FTFNUQVRFX0RJQUdfU1VCU1lTLCBmdW5jLCBsaW5lLAorCQkJICAgICAgIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gcmVsZWFzZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgTk9UIEJVU1kgKHN0YXRlPSVzKCVkKSkgQCVzOiVkXG4iLAorCQkJICAgICAgY2hhbklkLAorCQkJICAgICAgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCisJCQkJICAgICAgcmVhZGwoJnBDaGFuLT5DbGlTdGF0ZU9TKSksCisJCQkgICAgICByZWFkbCgmcENoYW4tPkNsaVN0YXRlT1MpLAorCQkJICAgICAgUGF0aE5hbWVfTGFzdF9OX05vZGVzKChVOCAqKSBmaWxlLCA0KSwgbGluZSk7CisJCS8qIHJldHVybjsgKi8KKwl9CisJd3JpdGVsKENIQU5ORUxDTElfQVRUQUNIRUQsICZwQ2hhbi0+Q2xpU3RhdGVPUyk7IC8qIHJlbGVhc2UgYnVzeSAqLworfQorCisvKgorKiBSb3V0aW5lIERlc2NyaXB0aW9uOgorKiBUcmllcyB0byBpbnNlcnQgdGhlIHByZWJ1aWx0IHNpZ25hbCBwb2ludGVkIHRvIGJ5IHBTaWduYWwgaW50byB0aGUgbnRoCisqIFF1ZXVlIG9mIHRoZSBDaGFubmVsIHBvaW50ZWQgdG8gYnkgcENoYW5uZWwKKyoKKyogUGFyYW1ldGVyczoKKyogcENoYW5uZWw6IChJTikgcG9pbnRzIHRvIHRoZSBJTyBDaGFubmVsCisqIFF1ZXVlOiAoSU4pIG50aCBRdWV1ZSBvZiB0aGUgSU8gQ2hhbm5lbAorKiBwU2lnbmFsOiAoSU4pIHBvaW50ZXIgdG8gdGhlIHNpZ25hbAorKgorKiBBc3N1bXB0aW9uczoKKyogLSBwQ2hhbm5lbCwgUXVldWUgYW5kIHBTaWduYWwgYXJlIHZhbGlkLgorKiAtIElmIGluc2VydGlvbiBmYWlscyBkdWUgdG8gYSBmdWxsIHF1ZXVlLCB0aGUgY2FsbGVyIHdpbGwgZGV0ZXJtaW5lIHRoZQorKiByZXRyeSBwb2xpY3kgKGUuZy4gd2FpdCAmIHRyeSBhZ2FpbiwgcmVwb3J0IGFuIGVycm9yLCBldGMuKS4KKyoKKyogUmV0dXJuIHZhbHVlOiAxIGlmIHRoZSBpbnNlcnRpb24gc3VjY2VlZHMsIDAgaWYgdGhlIHF1ZXVlIHdhcworKiBmdWxsLgorKi8KKwordW5zaWduZWQgY2hhciB2aXNvcl9zaWduYWxfaW5zZXJ0KENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCisJCQkJICB2b2lkICpwU2lnbmFsKTsKKworLyoKKyogUm91dGluZSBEZXNjcmlwdGlvbjoKKyogUmVtb3ZlcyBvbmUgc2lnbmFsIGZyb20gQ2hhbm5lbCBwQ2hhbm5lbCdzIG50aCBRdWV1ZSBhdCB0aGUKKyogdGltZSBvZiB0aGUgY2FsbCBhbmQgY29waWVzIGl0IGludG8gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5CisqIHBTaWduYWwuCisqCisqIFBhcmFtZXRlcnM6CisqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyogcFNpZ25hbDogKElOKSBwb2ludGVyIHRvIHdoZXJlIHRoZSBzaWduYWxzIGFyZSB0byBiZSBjb3BpZWQKKyoKKyogQXNzdW1wdGlvbnM6CisqIC0gcENoYW5uZWwgYW5kIFF1ZXVlIGFyZSB2YWxpZC4KKyogLSBwU2lnbmFsIHBvaW50cyB0byBhIG1lbW9yeSBhcmVhIGxhcmdlIGVub3VnaCB0byBob2xkIHF1ZXVlJ3MgU2lnbmFsU2l6ZQorKgorKiBSZXR1cm4gdmFsdWU6IDEgaWYgdGhlIHJlbW92YWwgc3VjY2VlZHMsIDAgaWYgdGhlIHF1ZXVlIHdhcworKiBlbXB0eS4KKyovCisKK3Vuc2lnbmVkIGNoYXIgdmlzb3Jfc2lnbmFsX3JlbW92ZShDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpwQ2hhbm5lbCwgVTMyIFF1ZXVlLAorCQkJCSAgdm9pZCAqcFNpZ25hbCk7CisKKy8qCisqIFJvdXRpbmUgRGVzY3JpcHRpb246CisqIFJlbW92ZXMgYWxsIHNpZ25hbHMgcHJlc2VudCBpbiBDaGFubmVsIHBDaGFubmVsJ3MgbnRoIFF1ZXVlIGF0IHRoZQorKiB0aW1lIG9mIHRoZSBjYWxsIGFuZCBjb3BpZXMgdGhlbSBpbnRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieQorKiBwU2lnbmFsLiAgUmV0dXJucyB0aGUgIyBvZiBzaWduYWxzIGNvcGllZCBhcyB0aGUgdmFsdWUgb2YgdGhlIHJvdXRpbmUuCisqCisqIFBhcmFtZXRlcnM6CisqIHBDaGFubmVsOiAoSU4pIHBvaW50cyB0byB0aGUgSU8gQ2hhbm5lbAorKiBRdWV1ZTogKElOKSBudGggUXVldWUgb2YgdGhlIElPIENoYW5uZWwKKyogcFNpZ25hbDogKElOKSBwb2ludGVyIHRvIHdoZXJlIHRoZSBzaWduYWxzIGFyZSB0byBiZSBjb3BpZWQKKyoKKyogQXNzdW1wdGlvbnM6CisqIC0gcENoYW5uZWwgYW5kIFF1ZXVlIGFyZSB2YWxpZC4KKyogLSBwU2lnbmFsIHBvaW50cyB0byBhIG1lbW9yeSBhcmVhIGxhcmdlIGVub3VnaCB0byBob2xkIFF1ZXVlJ3MgTWF4U2lnbmFscworKiAjIG9mIHNpZ25hbHMsIGVhY2ggb2Ygd2hpY2ggaXMgUXVldWUncyBTaWduYWxTaXplLgorKgorKiBSZXR1cm4gdmFsdWU6CisqICMgb2Ygc2lnbmFscyBjb3BpZWQuCisqLwordW5zaWduZWQgaW50IFNpZ25hbFJlbW92ZUFsbChwQ0hBTk5FTF9IRUFERVIgcENoYW5uZWwsIFUzMiBRdWV1ZSwKKwkJCSAgICAgdm9pZCAqcFNpZ25hbCk7CisKKy8qCisqIFJvdXRpbmUgRGVzY3JpcHRpb246CisqIERldGVybWluZSB3aGV0aGVyIGEgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LgorKgorKiBQYXJhbWV0ZXJzOgorKiBwQ2hhbm5lbDogKElOKSBwb2ludHMgdG8gdGhlIElPIENoYW5uZWwKKyogUXVldWU6IChJTikgbnRoIFF1ZXVlIG9mIHRoZSBJTyBDaGFubmVsCisqCisqIFJldHVybiB2YWx1ZToKKyogMSBpZiB0aGUgc2lnbmFsIHF1ZXVlIGlzIGVtcHR5LCAwIG90aGVyd2lzZS4KKyovCit1bnNpZ25lZCBjaGFyIHZpc29yX3NpZ25hbHF1ZXVlX2VtcHR5KENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLAorCQkJCSAgICAgIFUzMiBRdWV1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWxfZ3VpZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NoYW5uZWxfZ3VpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGRjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY2hhbm5lbF9ndWlkLmgKQEAgLTAsMCArMSw2NCBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogQ0hBTk5FTCBHdWlkcworICovCisKKy8qIFVzZWQgaW4gSU9DaGFubmVsCisgKiB7NDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmfQorICovCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEIFwKKwl7IDB4NDE0ODE1ZWQsIDB4YzU4YywgMHgxMWRhLCBcCisJCXsgMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmIH0gfQorc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFWaGJhQ2hhbm5lbFByb3RvY29sR3VpZCA9CisJVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKy8qIFVzZWQgaW4gSU9DaGFubmVsCisgKiB7OGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmfQorICovCisjZGVmaW5lIFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEIFwKKwl7IDB4OGNkNTk5NGQsIDB4YzU4ZSwgMHgxMWRhLCBcCisJCXsgMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmIH0gfQorc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZCA9CisJVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKy8qIFVzZWQgaW4gSU9DaGFubmVsCisgKiB7NzIxMjAwMDgtNEFBQi0xMURDLTg1MzAtNDQ0NTUzNTQ0MjAwfQorICovCisjZGVmaW5lIFVMVFJBX1NJT1ZNX0dVSUQgXAorCXsgMHg3MjEyMDAwOCwgMHg0QUFCLCAweDExREMsCQkJCQlcCisJCXsgMHg4NSwgMHgzMCwgMHg0NCwgMHg0NSwgMHg1MywgMHg1NCwgMHg0MiwgMHgwMCB9IH0KK3N0YXRpYyBjb25zdCBHVUlEIFVsdHJhU0lPVk1HdWlkID0gVUxUUkFfU0lPVk1fR1VJRDsKKworCisvKiBVc2VkIGluIHZpc29ybm9vcC92aXNvcm5vb3BfbWFpbi5jCisgKiB7NWI1MmM1YWMtZTVmNS00ZDQyLThkZmYtNDI5ZWFlY2QyMjFmfQorICovCisjZGVmaW5lIFVMVFJBX0NPTlRST0xESVJFQ1RPUl9DSEFOTkVMX1BST1RPQ09MX0dVSUQgIFwKKwl7IDB4NWI1MmM1YWMsIDB4ZTVmNSwgMHg0ZDQyLCBcCisJCXsgMHg4ZCwgMHhmZiwgMHg0MiwgMHg5ZSwgMHhhZSwgMHhjZCwgMHgyMiwgMHgxZiB9IH0KKworc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFDb250cm9sRGlyZWN0b3JDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9DT05UUk9MRElSRUNUT1JfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEOworCisvKiBVc2VkIGluIHZpc29yY2hpcHNldC92aXNvcmNoaXBzZXRfbWFpbi5jCisgKiB7QjRFNzk2MjUtQUVERS00RUFBLTlFMTEtRDNFRERDRDQ1MDRDfQorICovCisjZGVmaW5lIFVMVFJBX0RJQUdfUE9PTF9DSEFOTkVMX1BST1RPQ09MX0dVSUQJCQkJXAorCXsweGI0ZTc5NjI1LCAweGFlZGUsIDB4NGVhYSwJCQkJCVwKKwkJeyAweDllLCAweDExLCAweGQzLCAweGVkLCAweGRjLCAweGQ0LCAweDUwLCAweDRjIH0gfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sZnJhbWV3b3JrLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY29udHJvbGZyYW1ld29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjY0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvY29udHJvbGZyYW1ld29yay5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBNb2R1bGUgTmFtZToKKyAqICBjb250cm9sZnJhbWV3b3JrLmgKKyAqCisgKiBBYnN0cmFjdDogVGhpcyBmaWxlIGRlZmluZXMgY29tbW9uIHN0cnVjdHVyZXMgaW4gdGhlIHVubWFuYWdlZAorICoJICAgICBVbHRyYXZpc29yIChtb3N0bHkgRUZJKSBzcGFjZS4KKyAqCisgKi8KKworI2lmbmRlZiBfQ09OVFJPTF9GUkFNRVdPUktfSF8KKyNkZWZpbmUgX0NPTlRST0xfRlJBTUVXT1JLX0hfCisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKworI2RlZmluZSBVTFRSQV9NRU1PUllfQ09VTlRfS2kgMTAyNAorCisvKiBTY2FsZSBvcmRlciAwIGlzIG9uZSAzMi1iaXQgKDQtYnl0ZSkgd29yZCAoaW4gNjQgb3IgMTI4LWJpdAorICogYXJjaGl0ZWN0dXJlIHBvdGVudGlhbGx5IDY0IG9yIDEyOC1iaXQgd29yZCkgKi8KKyNkZWZpbmUgVUxUUkFfTUVNT1JZX1BBR0VfV09SRCA0CisKKy8qIERlZmluZSBLaSBzY2FsZSBwYWdlIHRvIGJlIHRyYWRpdGlvbmFsIDRLQiBwYWdlICovCisjZGVmaW5lIFVMVFJBX01FTU9SWV9QQUdFX0tpIChVTFRSQV9NRU1PUllfUEFHRV9XT1JEICogVUxUUkFfTUVNT1JZX0NPVU5UX0tpKQordHlwZWRlZiBzdHJ1Y3QgX1VMVFJBX1NFR01FTlRfU1RBVEUgIHsKKwlVMTYgRW5hYmxlZDoxOwkJLyogQml0IDA6IE1heSBlbnRlciBvdGhlciBzdGF0ZXMgKi8KKwlVMTYgQWN0aXZlOjE7CQkvKiBCaXQgMTogQXNzaWduZWQgdG8gYWN0aXZlIHBhcnRpdGlvbiAqLworCVUxNiBBbGl2ZToxOwkJLyogQml0IDI6IENvbmZpZ3VyZSBtZXNzYWdlIHNlbnQgdG8KKwkJCQkgKiBzZXJ2aWNlL3NlcnZlciAqLworCVUxNiBSZXZva2VkOjE7CQkvKiBCaXQgMzogc2ltaWxhciB0byBwYXJ0aXRpb24gc3RhdGUKKwkJCQkgKiBTaHV0dGluZ0Rvd24gKi8KKwlVMTYgQWxsb2NhdGVkOjE7CS8qIEJpdCA0OiBtZW1vcnkgKGRldmljZS9wb3J0IG51bWJlcikKKwkJCQkgKiBoYXMgYmVlbiBzZWxlY3RlZCBieSBDb21tYW5kICovCisJVTE2IEtub3duOjE7CQkvKiBCaXQgNTogaGFzIGJlZW4gaW50cm9kdWNlZCB0byB0aGUKKwkJCQkgKiBzZXJ2aWNlL2d1ZXN0IHBhcnRpdGlvbiAqLworCVUxNiBSZWFkeToxOwkJLyogQml0IDY6IHNlcnZpY2UvR3Vlc3QgcGFydGl0aW9uIGhhcworCQkJCSAqIHJlc3BvbmRlZCB0byBpbnRyb2R1Y3Rpb24gKi8KKwlVMTYgT3BlcmF0aW5nOjE7CS8qIEJpdCA3OiByZXNvdXJjZSBpcyBjb25maWd1cmVkIGFuZAorCQkJCSAqIG9wZXJhdGluZyAqLworCS8qIE5vdGU6IGRvbid0IHVzZSBoaWdoIGJpdCB1bmxlc3Mgd2UgbmVlZCB0byBzd2l0Y2ggdG8gdXNob3J0CisJICogd2hpY2ggaXMgbm9uLWNvbXBsaWFudCAqLworfSBVTFRSQV9TRUdNRU5UX1NUQVRFOworc3RhdGljIGNvbnN0IFVMVFJBX1NFR01FTlRfU1RBVEUgU2VnbWVudFN0YXRlUnVubmluZyA9IHsKKwkxLCAxLCAxLCAwLCAxLCAxLCAxLCAxCit9Oworc3RhdGljIGNvbnN0IFVMVFJBX1NFR01FTlRfU1RBVEUgU2VnbWVudFN0YXRlUGF1c2VkID0geworCTEsIDEsIDEsIDAsIDEsIDEsIDEsIDAKK307CitzdGF0aWMgY29uc3QgVUxUUkFfU0VHTUVOVF9TVEFURSBTZWdtZW50U3RhdGVTdGFuZGJ5ID0geworCTEsIDEsIDAsIDAsIDEsIDEsIDEsIDAKK307Cit0eXBlZGVmIHVuaW9uIHsKKwlVNjQgRnVsbDsKKwlzdHJ1Y3QgeworCQlVOCBNYWpvcjsJLyogd2lsbCBiZSAxIGZvciB0aGUgZmlyc3QgcmVsZWFzZSBhbmQKKwkJCQkgKiBpbmNyZW1lbnQgdGhlcmVhZnRlciAgKi8KKwkJVTggTWlub3I7CisJCVUxNiBNYWludGVuYW5jZTsKKwkJVTMyIFJldmlzaW9uOwkvKiBTdWJ2ZXJzaW9uIHJldmlzaW9uICovCisJfSBQYXJ0OworfSBVTFRSQV9DT01QT05FTlRfVkVSU0lPTjsKKworI2VuZGlmCQkJCS8qIF9DT05UUk9MX0ZSQU1FV09SS19IXyBub3QgZGVmaW5lZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2NvbnRyb2x2bWNoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sdm1jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmMWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9jb250cm9sdm1jaGFubmVsLmgKQEAgLTAsMCArMSw2MTkgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0NPTlRST0xWTUNIQU5ORUxfSF9fCisjZGVmaW5lIF9fQ09OVFJPTFZNQ0hBTk5FTF9IX18KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisjaW5jbHVkZSAiY2hhbm5lbC5oIgorI2luY2x1ZGUgImNvbnRyb2xmcmFtZXdvcmsuaCIKK2VudW0geyBJTlZBTElEX0dVRVNUX0ZJUk1XQVJFLCBTQU1QTEVfR1VFU1RfRklSTVdBUkUsCisJICAgIFRJQU5PMzJfR1VFU1RfRklSTVdBUkUsIFRJQU5PNjRfR1VFU1RfRklSTVdBUkUKK307CisKKy8qIHsyQjNDMkQxMC03RUY1LTRhZDgtQjk2Ni0zNDQ4QjczODZCM0R9ICovCisjZGVmaW5lIFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MX0dVSUQJXAorCXsweDJiM2MyZDEwLCAweDdlZjUsIDB4NGFkOCwgXAorCQl7MHhiOSwgMHg2NiwgMHgzNCwgMHg0OCwgMHhiNywgMHgzOCwgMHg2YiwgMHgzZH0gfQorCitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYUNvbnRyb2x2bUNoYW5uZWxQcm90b2NvbEd1aWQgPQorCVVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKyNkZWZpbmUgVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFwKKwlVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQorI2RlZmluZSBDT05UUk9MVk1fTUVTU0FHRV9NQVggICAgIDY0CisKKy8qIE11c3QgaW5jcmVtZW50IHRoaXMgd2hlbmV2ZXIgeW91IGluc2VydCBvciBkZWxldGUgZmllbGRzIHdpdGhpbgorKiB0aGlzIGNoYW5uZWwgc3RydWN0LiAgQWxzbyBpbmNyZW1lbnQgd2hlbmV2ZXIgeW91IGNoYW5nZSB0aGUgbWVhbmluZworKiBvZiBmaWVsZHMgd2l0aGluIHRoaXMgY2hhbm5lbCBzdHJ1Y3Qgc28gYXMgdG8gYnJlYWsgcHJlLWV4aXN0aW5nCisqIHNvZnR3YXJlLiAgTm90ZSB0aGF0IHlvdSBjYW4gdXN1YWxseSBhZGQgZmllbGRzIHRvIHRoZSBFTkQgb2YgdGhlCisqIGNoYW5uZWwgc3RydWN0IHdpdGhPVVQgbmVlZGluZyB0byBpbmNyZW1lbnQgdGhpcy4gKi8KKyNkZWZpbmUgVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEICAxCisKKyNkZWZpbmUgVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfT0tfQ0xJRU5UKHBDaGFubmVsLCBsb2dDdHgpICAgICAgICAgICBcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLCBcCisJCVVsdHJhQ29udHJvbHZtQ2hhbm5lbFByb3RvY29sR3VpZCwgXAorCQkiY29udHJvbHZtIiwgXAorCQlzaXplb2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCVVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCwgXAorCQlVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsIFwKKwkJX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9PS19TRVJWRVIoYWN0dWFsQnl0ZXMsIGxvZ0N0eCkgICAgICAgIFwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9zZXJ2ZXIoVWx0cmFDb250cm9sdm1DaGFubmVsUHJvdG9jb2xHdWlkLAlcCisJCQkJICAgICJjb250cm9sdm0iLAkJCVwKKwkJCQkgICAgc2l6ZW9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MKSwgXAorCQkJCSAgICBhY3R1YWxCeXRlcywgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorCisjZGVmaW5lIE1ZX0RFVklDRV9JTkRFWCAwCisjZGVmaW5lIE1BWF9NQUNEQVRBX0xFTiA4IC8qIG51bWJlciBvZiBieXRlcyBmb3IgTUFDIGFkZHJlc3MgaW4gY29uZmlnIHBhY2tldCAqLworI2RlZmluZSBNQVhfU0VSSUFMX05VTQkzMgorCisjZGVmaW5lIERJU0tfWkVST19QVU5fTlVNQkVSCTEgIC8qIFRhcmdldCBJRCBvbiB0aGUgU0NTSSBidXMgZm9yIExVTiAwICovCisjZGVmaW5lIERJU0tfWkVST19MVU5fTlVNQkVSCTMgIC8qIExvZ2ljYWwgVW5pdCBOdW1iZXIgKi8KKworLyogRGVmaW5lcyBmb3IgdmFyaW91cyBjaGFubmVsIHF1ZXVlcy4uLiAqLworI2RlZmluZSBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVAkJMAorI2RlZmluZSBDT05UUk9MVk1fUVVFVUVfUkVTUE9OU0UJMQorI2RlZmluZQlDT05UUk9MVk1fUVVFVUVfRVZFTlQJCTIKKyNkZWZpbmUgQ09OVFJPTFZNX1FVRVVFX0FDSwkJMworCisvKiBNYXggbnVtYmVyIG9mIG1lc3NhZ2VzIHN0b3JlZCBkdXJpbmcgSU9WTSBjcmVhdGlvbiB0byBiZSByZXVzZWQKKyAqIGFmdGVyIGNyYXNoICovCisjZGVmaW5lIENPTlRST0xWTV9DUkFTSE1TR19NQVgJCTIKKworLyoqIElkcyBmb3IgY29tbWFuZHMgdGhhdCBtYXkgYXBwZWFyIGluIGVpdGhlciBxdWV1ZSBvZiBhIENvbnRyb2xWbSBjaGFubmVsLgorICoKKyAqICBDb21tYW5kcyB0aGF0IGFyZSBpbml0aWF0ZWQgYnkgdGhlIGNvbW1hbmQgcGFydGl0aW9uIChDUCksIGJ5IGFuIElPIG9yCisgKiAgY29uc29sZSBzZXJ2aWNlIHBhcnRpdGlvbiAoU1ApLCBvciBieSBhIGd1ZXN0IHBhcnRpdGlvbiAoR1ApYXJlOgorICogIC0gaXNzdWVkIG9uIHRoZSBSZXF1ZXN0UXVldWUgcXVldWUgKHEgIzApIGluIHRoZSBDb250cm9sVm0gY2hhbm5lbAorICogIC0gcmVzcG9uZGVkIHRvIG9uIHRoZSBSZXNwb25zZVF1ZXVlIHF1ZXVlIChxICMxKSBpbiB0aGUgQ29udHJvbFZtIGNoYW5uZWwKKyAqCisgKiAgRXZlbnRzIHRoYXQgYXJlIGluaXRpYXRlZCBieSBhbiBJTyBvciBjb25zb2xlIHNlcnZpY2UgcGFydGl0aW9uIChTUCkgb3IKKyAqICBieSBhIGd1ZXN0IHBhcnRpdGlvbiAoR1ApIGFyZToKKyAqICAtIGlzc3VlZCBvbiB0aGUgRXZlbnRRdWV1ZSBxdWV1ZSAocSAjMikgaW4gdGhlIENvbnRyb2xWbSBjaGFubmVsCisgKiAgLSByZXNwb25kZWQgdG8gb24gdGhlIEV2ZW50QWNrUXVldWUgcXVldWUgKHEgIzMpIGluIHRoZSBDb250cm9sVm0gY2hhbm5lbAorICovCit0eXBlZGVmIGVudW0gIHsKKwlDT05UUk9MVk1fSU5WQUxJRCA9IDAsCisJLyogU1dJVENIIGNvbW1hbmRzIHJlcXVpcmVkIFBhcmFtZXRlcjogU3dpdGNoTnVtYmVyICAqLworCS8qIEJVUyBjb21tYW5kcyByZXF1aXJlZCBQYXJhbWV0ZXI6IEJ1c051bWJlciAgKi8KKwlDT05UUk9MVk1fQlVTX0NSRUFURSA9IDB4MTAxLAkvKiBDUCAtLT4gU1AsIEdQICovCisJQ09OVFJPTFZNX0JVU19ERVNUUk9ZID0gMHgxMDIsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSA9IDB4MTA0LAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fQlVTX0NIQU5HRVNUQVRFID0gMHgxMDUsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQlVTX0NIQU5HRVNUQVRFX0VWRU5UID0gMHgxMDYsIC8qIFNQLCBHUCAtLT4gQ1AgKi8KKy8qIERFVklDRSBjb21tYW5kcyByZXF1aXJlZCBQYXJhbWV0ZXI6IEJ1c051bWJlciwgRGV2aWNlTnVtYmVyICAqLworCisJQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgPSAweDIwMSwJLyogQ1AgLS0+IFNQLCBHUCAqLworCUNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSA9IDB4MjAyLAkvKiBDUCAtLT4gU1AsIEdQICovCisJQ09OVFJPTFZNX0RFVklDRV9DT05GSUdVUkUgPSAweDIwMywJLyogQ1AgLS0+IFNQICovCisJQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSA9IDB4MjA0LAkvKiBDUCAtLT4gU1AsIEdQICovCisJQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURV9FVkVOVCA9IDB4MjA1LCAvKiBTUCwgR1AgLS0+IENQICovCisJQ09OVFJPTFZNX0RFVklDRV9SRUNPTkZJR1VSRSA9IDB4MjA2LAkvKiBDUCAtLT4gQm9vdCAqLworLyogRElTSyBjb21tYW5kcyByZXF1aXJlZCBQYXJhbWV0ZXI6IEJ1c051bWJlciwgRGV2aWNlTnVtYmVyICAqLworCUNPTlRST0xWTV9ESVNLX0NSRUFURSA9IDB4MjIxLAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fRElTS19ERVNUUk9ZID0gMHgyMjIsCS8qIENQIC0tPiBTUCAqLworCUNPTlRST0xWTV9ESVNLX0NPTkZJR1VSRSA9IDB4MjIzLAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fRElTS19DSEFOR0VTVEFURSA9IDB4MjI0LAkvKiBDUCAtLT4gU1AgKi8KKy8qIENISVBTRVQgY29tbWFuZHMgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9JTklUID0gMHgzMDEsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9TVE9QID0gMHgzMDIsCS8qIENQIC0tPiBTUCwgR1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9TSFVURE9XTiA9IDB4MzAzLAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9SRUFEWSA9IDB4MzA0LAkvKiBDUCAtLT4gU1AgKi8KKwlDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVCA9IDB4MzA1LAkvKiBDUCAtLT4gU1AgKi8KKworfSBDT05UUk9MVk1fSUQ7CisKK3N0cnVjdCBJbnRlcnJ1cHRJbmZvIHsKKwkgLyoqPCBzcGVjaWZpZXMgaW50ZXJydXB0IGluZm8uIEl0IGlzIHVzZWQgdG8gc2VuZCBpbnRlcnJ1cHRzCisJICAqICAgZm9yIHRoaXMgY2hhbm5lbC4gVGhlIHBlZXIgYXQgdGhlIGVuZCBvZiB0aGlzIGNoYW5uZWwKKwkgICogICB3aG8gaGFzIHJlZ2lzdGVyZWQgYW4gaW50ZXJydXB0ICh1c2luZyByZWN2IGZpZWxkcworCSAgKiAgIGFib3ZlKSB3aWxsIHJlY2VpdmUgdGhlIGludGVycnVwdC4gUGFzc2VkIGFzIGEgcGFyYW1ldGVyCisJICAqICAgdG8gSXNzdWVfVk1DQUxMX0lPX1FVRVVFX1RSQU5TSVRJT04sIHdoaWNoIGdlbmVyYXRlcyB0aGUKKwkgICogICBpbnRlcnJ1cHQuICBDdXJyZW50bHkgdGhpcyBpcyB1c2VkIGJ5IElPUGFydC1TUCB0byB3YWtlCisJICAqICAgdXAgR1Agd2hlbiBEYXRhIENoYW5uZWwgdHJhbnNpdGlvbnMgZnJvbSBlbXB0eSB0bworCSAgKiAgIG5vbi1lbXB0eS4qLworCVU2NCBzZW5kSW50ZXJydXB0SGFuZGxlOworCisJIC8qKjwgc3BlY2lmaWVzIGludGVycnVwdCBoYW5kbGUuIEl0IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlCisJICAqICAgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQgcGluIGZyb20gTW9uaXRvcjsgYW5kIHRoZQorCSAgKiAgIGludGVycnVwdCBwaW4gaXMgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nCisJICAqICAgaW50cnJ1cHQuICBVc2VkIGJ5IElPUGFydC1HUCBvbmx5LiAqLworCVU2NCByZWN2SW50ZXJydXB0SGFuZGxlOworCisJIC8qKjwgc3BlY2lmaWVzIGludGVycnVwdCB2ZWN0b3IuIEl0LCBpbnRlcnJ1cHQgcGluLCBhbmQgc2hhcmVkIGFyZQorCSAgKiAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuICBVc2VkIGJ5CisJICAqICAgSU9QYXJ0LUdQIG9ubHkuICovCisJVTMyIHJlY3ZJbnRlcnJ1cHRWZWN0b3I7CisKKyAgICAvKio8IHNwZWNpZmllcyBpZiB0aGUgcmVjdkludGVycnVwdCBpcyBzaGFyZWQuICBJdCwgaW50ZXJydXB0IHBpbgorICAgICAqICAgYW5kIHZlY3RvciBhcmUgdXNlZCB0byBjb25uZWN0IHRvIDAgPSBub3Qgc2hhcmVkOyAxID0gc2hhcmVkLgorICAgICAqICAgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LiAgVXNlZCBieSBJT1BhcnQtR1Agb25seS4gKi8KKwlVOCByZWN2SW50ZXJydXB0U2hhcmVkOworCVU4IHJlc2VydmVkWzNdOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworfTsKKworc3RydWN0IFBjaUlkIHsKKwlVMTYgRG9tYWluOworCVU4IEJ1czsKKwlVOCBTbG90OworCVU4IEZ1bmM7CisJVTggUmVzZXJ2ZWRbM107CS8qIE5hdHVyYWwgYWxpZ25tZW50IHB1cnBvc2VzICovCit9OworCitzdHJ1Y3QgUGNpQ29uZmlnSGRyIHsKKwlVMTYgVmVuZG9ySWQ7CisJVTE2IFN1YlN5c1ZlbmRvcjsKKwlVMTYgRGV2aWNlSWQ7CisJVTE2IFN1YlN5c0RldmljZTsKKwlVMzIgQ2xhc3NDb2RlOworCVUzMiBSZXNlcnZlZDsJCS8qIE5hdHVyYWwgYWxpZ25tZW50IHB1cnBvc2VzICovCit9OworCitzdHJ1Y3QgU2NzaUlkIHsKKwlVMzIgQnVzOworCVUzMiBUYXJnZXQ7CisJVTMyIEx1bjsKKwlVMzIgSG9zdDsgLyogQ29tbWFuZCBzaG91bGQgaWdub3JlIHRoaXMgZm9yICoKKwkJICAgKiBEaXNrQXJyaXZhbC9SZW1vdmFsRXZlbnRzICovCit9OworCitzdHJ1Y3QgV1dJRCB7CisJVTMyIHd3aWQxOworCVUzMiB3d2lkMjsKK307CisKK3N0cnVjdCB2aXJ0RGlza0luZm8gIHsKKwlVMzIgc3dpdGNoTm87CQkvKiBkZWZpbmVkIGJ5IFNXSVRDSF9DUkVBVEUgKi8KKwlVMzIgZXh0ZXJuYWxQb3J0Tm87CS8qIDAgZm9yIFNBUyBSQUlEIHByb3ZpZGVkIChleHRlcm5hbCkKKwkJCQkgKiB2aXJ0dWFsIGRpc2tzLCAxIGZvciB2aXJ0dWFsIGRpc2sKKwkJCQkgKiBpbWFnZXMsIDIgZm9yIGdvbGQgZGlzayBpbWFnZXMgKi8KKwlVMTYgVmlydHVhbERpc2tJbmRleDsJLyogSW5kZXggb2YgZGlzayBkZXNjcmlwdG9yIGluIHRoZQorCQkJCSAqIFZpcnR1YWxEaXNrIHNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoCisJCQkJICogZXh0ZXJuYWxQb3J0Tm8gKi8KKwlVMTYgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7Cit9OworCit0eXBlZGVmIGVudW0geworCUNPTlRST0xWTV9BQ1RJT05fTk9ORSA9IDAsCisJQ09OVFJPTFZNX0FDVElPTl9TRVRfUkVTVE9SRSA9IDB4MDVFNywKKwlDT05UUk9MVk1fQUNUSU9OX0NMRUFSX1JFU1RPUkUgPSAweDBDMTgsCisJQ09OVFJPTFZNX0FDVElPTl9SRVNUT1JJTkcgPSAweDA4RTUsCisJQ09OVFJPTFZNX0FDVElPTl9SRVNUT1JFX0JVU1kgPSAweDA5OTksCisJQ09OVFJPTFZNX0FDVElPTl9DTEVBUl9OVlJBTSA9IDB4QjAxCit9IENPTlRST0xWTV9BQ1RJT047CisKK3R5cGVkZWYgZW51bSBfVUxUUkFfVE9PTF9BQ1RJT05TIHsKKwkgICAgLyogZW51bWVyYXRpb24gdGhhdCBkZWZpbmVzIGludGVuZGVkIGFjdGlvbiAgKi8KKwkgICAgVUxUUkFfVE9PTF9BQ1RJT05fTk9ORSA9IDAsCS8qIG5vcm1hbCBib290IG9mIGJvb3QgZGlzayAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0lOU1RBTEwgPSAxLAkvKiBpbnN0YWxsIHNvdXJjZSBkaXNrKHMpIHRvIGJvb3QKKwkJCQkJICogZGlzayAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0NBUFRVUkUgPSAyLAkvKiBjYXB0dXJlIGJvb3QgZGlzayB0byB0YXJnZXQgZGlzayhzKQorCQkJCQkgKiBhcyAnZ29sZCBpbWFnZScgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9SRVBBSVIgPSAzLAkvKiB1c2Ugc291cmNlIGRpc2socykgdG8gcmVwYWlyCisJCQkJCSAqIGluc3RhbGxhdGlvbiBvbiBib290IGRpc2sgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9DTEVBTiA9IDQsCS8qICdzY3J1YicgdmlydHVhbCBkaXNrIGJlZm9yZQorCQkJCQkgKiByZWxlYXNpbmcgYmFjayB0byBzdG9yYWdlIHBvb2wgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9VUEdSQURFID0gNSwJLyogdXBncmFkZSB0byB1c2UgY29udGVudCBvZiBpbWFnZXMKKwkJCQkJICogcmVmZXJlbmNlZCBmcm9tIG5ld2VyIGJsdWVwcmludCAqLworCVVMVFJBX1RPT0xfQUNUSU9OX0RJQUcgPSA2LAkvKiB1c2UgdG9vbCB0byBpbnZva2UgZGlhZ25vc3RpYyBzY3JpcHQKKwkJCQkJICogcHJvdmlkZWQgYnkgYmx1ZXByaW50ICovCisJVUxUUkFfVE9PTF9BQ1RJT05fRkFJTEVEID0gNywJLyogdXNlZCB3aGVuIHRvb2wgZmFpbHMgaW5zdGFsbGF0aW9uCisJCQkJCSAgIGFuZCBjYW5ub3QgY29udGludWUgKi8KKwlVTFRSQV9UT09MX0FDVElPTl9DT1VOVCA9IDgKK30gVUxUUkFfVE9PTF9BQ1RJT05TOworCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTiAgeworCVU2NCBCb290VG9GaXJtd2FyZVVJOjE7CS8qIEJpdCAwOiBTdG9wIGluIHVlZmkgdWkgKi8KKwlVNjQgQ2xlYXJOdnJhbToxOwkvKiBCaXQgMTogQ2xlYXIgTlZSQU0gKi8KKwlVNjQgQ2xlYXJDbW9zOjE7CS8qIEJpdCAyOiBDbGVhciBDTU9TICovCisJVTY0IEJvb3RUb1Rvb2w6MTsJLyogQml0IDM6IFJ1biBpbnN0YWxsIHRvb2wgKi8KKwkvKiByZW1haW5pbmcgYml0cyBhcmUgYXZhaWxhYmxlICovCit9IFVMVFJBX0VGSV9TUEFSX0lORElDQVRJT047CisKK3R5cGVkZWYgZW51bSB7CisJVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1JFUExZID0gMHgwMDAwMDAwMSwKKwlVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUEFSQV9IT1RQTFVHID0gMHgwMDAwMDAwMiwKKwlVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUENJVkJVUyA9IDB4MDAwMDAwMDQKK30gVUxUUkFfQ0hJUFNFVF9GRUFUVVJFOworCisvKiogVGhpcyBpcyB0aGUgY29tbW9uIHN0cnVjdHVyZSB0aGF0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkKKyAqICBDb250cm9sVm0gbWVzc2FnZSAoYm90aCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzKSBpbiBhbnkgQ29udHJvbFZtCisgKiAgcXVldWUuICBDb21tYW5kcyBhcmUgZWFzaWx5IGRpc3Rpbmd1aXNoZWQgZnJvbSByZXNwb25zZXMgYnkKKyAqICBsb29raW5nIGF0IHRoZSBmbGFncy5yZXNwb25zZSBmaWVsZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAgeworCVUzMiBJZDsJCS8qIFNlZSBDT05UUk9MVk1fSUQuICovCisJLyogRm9yIHJlcXVlc3RzLCBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgdHlwZS4gKi8KKwkvKiBGb3IgcmVzcG9uc2VzLCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgbWVzc2FnZSB3ZSBhcmUgcmVzcG9uZGluZyB0by4gKi8KKworCVUzMiBNZXNzYWdlU2l6ZTsJLyogSW5jbHVkZXMgc2l6ZSBvZiB0aGlzIHN0cnVjdCArIHNpemUKKwkJCQkgKiBvZiBtZXNzYWdlICovCisJVTMyIFNlZ21lbnRJbmRleDsJLyogSW5kZXggb2Ygc2VnbWVudCBjb250YWluaW5nIFZtCisJCQkJICogbWVzc2FnZS9pbmZvcm1hdGlvbiAqLworCVUzMiBDb21wbGV0aW9uU3RhdHVzOwkvKiBFcnJvciBzdGF0dXMgY29kZSBvciByZXN1bHQgb2YKKwkJCQkgKiBtZXNzYWdlIGNvbXBsZXRpb24gKi8KKwlzdHJ1Y3QgIHsKKwkJVTMyIGZhaWxlZDoxOwkJICAgLyoqPCA9MSBpbiBhIHJlc3BvbnNlIHRvICogc2lnbmlmeQorCQkJCQkgICAgKiBmYWlsdXJlICovCisJCVUzMiByZXNwb25zZUV4cGVjdGVkOjE7ICAgLyoqPCA9MSBpbiBhbGwgbWVzc2FnZXMgdGhhdCBleHBlY3QgYQorCQkJCQkgICAqIHJlc3BvbnNlIChDb250cm9sIGlnbm9yZXMgdGhpcworCQkJCQkgICAqIGJpdCkgKi8KKwkJVTMyIHNlcnZlcjoxOwkJICAgLyoqPCA9MSBpbiBhbGwgYnVzICYgZGV2aWNlLXJlbGF0ZWQKKwkJCQkJICAgICogbWVzc2FnZXMgd2hlcmUgdGhlIG1lc3NhZ2UKKwkJCQkJICAgICogcmVjZWl2ZXIgaXMgdG8gYWN0IGFzIHRoZSBidXMgb3IKKwkJCQkJICAgICogZGV2aWNlIHNlcnZlciAqLworCQlVMzIgdGVzdE1lc3NhZ2U6MTsJICAgLyoqPCA9MSBmb3IgdGVzdGluZyB1c2Ugb25seQorCQkJCQkgICAgKiAoQ29udHJvbCBhbmQgQ29tbWFuZCBpZ25vcmUgdGhpcworCQkJCQkgICAgKiBiaXQpICovCisJCVUzMiBwYXJ0aWFsQ29tcGxldGlvbjoxOyAgLyoqPCA9MSBpZiB0aGVyZSBhcmUgZm9ydGhjb21pbmcKKwkJCQkJICAgKiByZXNwb25zZXMvYWNrcyBhc3NvY2lhdGVkCisJCQkJCSAgICogd2l0aCB0aGlzIG1lc3NhZ2UgKi8KKwkJVTMyIHByZXNlcnZlOjE7CSAgICAgICAvKio8ID0xIHRoaXMgaXMgdG8gbGV0IHVzIGtub3cgdG8KKwkJCQkJKiBwcmVzZXJ2ZSBjaGFubmVsIGNvbnRlbnRzCisJCQkJCSogKGZvciBydW5uaW5nIGd1ZXN0cykqLworCQlVMzIgd3JpdGVySW5EaWFnOjE7CS8qKjwgPTEgdGhlIERpYWdXcml0ZXIgaXMgYWN0aXZlIGluIHRoZQorCQkJCQkgKiBEaWFnbm9zdGljIFBhcnRpdGlvbiovCisKKwkJICAgIC8qIHJlbWFpbmluZyBiaXRzIGluIHRoaXMgMzItYml0IHdvcmQgYXJlIGF2YWlsYWJsZSAqLworCX0gRmxhZ3M7CisJVTMyIFJlc2VydmVkOwkJLyogTmF0dXJhbCBhbGlnbm1lbnQgKi8KKwlVNjQgTWVzc2FnZUhhbmRsZTsJLyogSWRlbnRpZmllcyB0aGUgcGFydGljdWxhciBtZXNzYWdlIGluc3RhbmNlLAorCQkJCSAqIGFuZCBpcyB1c2VkIHRvIG1hdGNoIHBhcnRpY3VsYXIgKi8KKwkvKiByZXF1ZXN0IGluc3RhbmNlcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIGluc3RhbmNlLiAqLworCVU2NCBQYXlsb2FkVm1PZmZzZXQ7CS8qIE9mZnNldCBvZiBwYXlsb2FkIGFyZWEgZnJvbSBzdGFydCBvZiB0aGlzCisJCQkJICogaW5zdGFuY2Ugb2YgQ29udHJvbFZtIHNlZ21lbnQgKi8KKwlVMzIgUGF5bG9hZE1heEJ5dGVzOwkvKiBNYXhpbXVtIGJ5dGVzIGFsbG9jYXRlZCBpbiBwYXlsb2FkCisJCQkJICogYXJlYSBvZiBDb250cm9sVm0gc2VnbWVudCAqLworCVUzMiBQYXlsb2FkQnl0ZXM7CS8qIEFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgb2YgcGF5bG9hZAorCQkJCSAqIGFyZWEgdG8gY29weSBiZXR3ZWVuIElPL0NvbW1hbmQ7ICovCisJLyogaWYgbm9uLXplcm8sIHRoZXJlIGlzIGEgcGF5bG9hZCB0byBjb3B5LiAqLworfSBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9DT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DUkVBVEUgIHsKKwlVMzIgYnVzTm87CSAgIC8qKjwgYnVzICMgKDAuLm4tMSkgZnJvbSB0aGUgbXNnIHJlY2VpdmVyJ3MKKwkJCSAgICAqIHBlcnNwZWN0aXZlICovCisKKwkgICAgLyogQ29udHJvbCB1c2VzIGhlYWRlciBTZWdtZW50SW5kZXggZmllbGQgdG8gYWNjZXNzIGJ1cyBudW1iZXIuLi4gKi8KKwlVMzIgZGV2Tm87CSAgIC8qKjwgYnVzLXJlbGF0aXZlICgwLi5uLTEpIGRldmljZSBudW1iZXIgKi8KKwlVNjQgY2hhbm5lbEFkZHI7ICAvKio8IEd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNoYW5uZWwsIHdoaWNoCisJCQkqICAgY2FuIGJlIGRlcmVmZXJlbmNlZCBieSB0aGUgcmVjZWl2ZXIKKwkJCSogICBvZiB0aGlzIENvbnRyb2xWbSBjb21tYW5kICovCisJVTY0IGNoYW5uZWxCeXRlczsgLyoqPCBzcGVjaWZpZXMgc2l6ZSBvZiB0aGUgY2hhbm5lbCBpbiBieXRlcyAqLworCUdVSUQgZGF0YVR5cGVHdWlkOy8qKjwgc3BlY2lmaWVzIGZvcm1hdCBvZiBkYXRhIGluIGNoYW5uZWwgKi8KKwlHVUlEIGRldkluc3RHdWlkOyAvKio8IGluc3RhbmNlIGd1aWQgZm9yIHRoZSBkZXZpY2UgKi8KKwlzdHJ1Y3QgSW50ZXJydXB0SW5mbyBpbnRyOyAvKio8IHNwZWNpZmllcyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gKi8KK30gQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ1JFQVRFOwkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9QQUNLRVRfREVWSUNFX0NPTkZJR1VSRSAgeworCVUzMiBidXNObzsJICAgICAgLyoqPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cKKwkJCSAgICAgICAqIHJlY2VpdmVyJ3MgcGVyc3BlY3RpdmUgKi8KKworCSAgICAvKiBDb250cm9sIHVzZXMgaGVhZGVyIFNlZ21lbnRJbmRleCBmaWVsZCB0byBhY2Nlc3MgYnVzIG51bWJlci4uLiAqLworCVUzMiBkZXZObzsJICAgICAgLyoqPCBidXMtcmVsYXRpdmUgKDAuLm4tMSkgZGV2aWNlIG51bWJlciAqLworfSBDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DT05GSUdVUkU7CS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0NPTkZJR1VSRSAqLworCit0eXBlZGVmIHN0cnVjdCBfQ09OVFJPTFZNX01FU1NBR0VfREVWSUNFX0NSRUFURSAgeworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBIZWFkZXI7CisJQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ1JFQVRFIFBhY2tldDsKK30gQ09OVFJPTFZNX01FU1NBR0VfREVWSUNFX0NSRUFURTsJLyogdG90YWwgMTI4IGJ5dGVzICovCisKK3R5cGVkZWYgc3RydWN0IF9DT05UUk9MVk1fTUVTU0FHRV9ERVZJQ0VfQ09ORklHVVJFICB7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIEhlYWRlcjsKKwlDT05UUk9MVk1fUEFDS0VUX0RFVklDRV9DT05GSUdVUkUgUGFja2V0OworfSBDT05UUk9MVk1fTUVTU0FHRV9ERVZJQ0VfQ09ORklHVVJFOwkvKiB0b3RhbCA1NiBieXRlcyAqLworCisvKiBUaGlzIGlzIHRoZSBmb3JtYXQgZm9yIGEgbWVzc2FnZSBpbiBhbnkgQ29udHJvbFZtIHF1ZXVlLiAqLwordHlwZWRlZiBzdHJ1Y3QgX0NPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAgeworCXVuaW9uICB7CisKKwkJLyogQkVHSU4gUmVxdWVzdCBtZXNzYWdlcyAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsJICAgICAgLyo8IGJ1cyAjICgwLi5uLTEpIGZyb20gdGhlIG1zZworCQkJCQkgICAgICAgKiByZWNlaXZlcidzIHBlcnNwZWN0aXZlICovCisKKwkgICAgLyogQ29udHJvbCB1c2VzIGhlYWRlciBTZWdtZW50SW5kZXggZmllbGQgdG8gYWNjZXNzIGJ1cyBudW1iZXIuLi4gKi8KKwkJCVUzMiBkZXZpY2VDb3VudDsgICAgICAvKjwgaW5kaWNhdGVzIHRoZSBtYXggbnVtYmVyIG9mCisJCQkJCSAgICAgICAqIGRldmljZXMgb24gdGhpcyBidXMgKi8KKwkJCVU2NCBjaGFubmVsQWRkcjsgICAgIC8qPCBHdWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQorCQkJCQkgICAgICAqICAgY2hhbm5lbCwgd2hpY2ggY2FuIGJlCisJCQkJCSAgICAgICogICBkZXJlZmVyZW5jZWQgYnkgdGhlIHJlY2VpdmVyCisJCQkJCSAgICAgICogICBvZiB0aGlzIENvbnRyb2xWbSBjb21tYW5kICovCisJCQlVNjQgY2hhbm5lbEJ5dGVzOyAgICAvKjwgc2l6ZSBvZiB0aGUgY2hhbm5lbCBpbiBieXRlcyAqLworCQkJR1VJRCBidXNEYXRhVHlwZUd1aWQ7Lyo8IGluZGljYXRlcyBmb3JtYXQgb2YgZGF0YSBpbiBidXMKKwkJCQkJICAgICAgKiBjaGFubmVsICovCisJCQlHVUlEIGJ1c0luc3RHdWlkOyAgICAvKjwgaW5zdGFuY2UgZ3VpZCBmb3IgdGhlIGJ1cyAqLworCQl9IGNyZWF0ZUJ1czsJLyogZm9yIENPTlRST0xWTV9CVVNfQ1JFQVRFICovCisJCXN0cnVjdCAgeworCQkJVTMyIGJ1c05vOwkgICAgICAvKjwgYnVzICMgKDAuLm4tMSkgZnJvbSB0aGUgbXNnCisJCQkJCSAgICAgICAqIHJlY2VpdmVyJ3MgcGVyc3BlY3RpdmUgKi8KKworCSAgICAvKiBDb250cm9sIHVzZXMgaGVhZGVyIFNlZ21lbnRJbmRleCBmaWVsZCB0byBhY2Nlc3MgYnVzIG51bWJlci4uLiAqLworCQkJVTMyIHJlc2VydmVkOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworCQl9IGRlc3Ryb3lCdXM7CS8qIGZvciBDT05UUk9MVk1fQlVTX0RFU1RST1kgKi8KKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CQkgICAgLyo8IGJ1cyAjICgwLi5uLTEpIGZyb20gdGhlCisJCQkJCQkgICAgICogbXNnIHJlY2VpdmVyJ3MKKwkJCQkJCSAgICAgKiBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJCQlVMzIgcmVzZXJ2ZWQxOwkJICAgIC8qIGZvciBhbGlnbm1lbnQgcHVycG9zZXMgKi8KKwkJCVU2NCBndWVzdEhhbmRsZTsJICAgIC8qIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0CisJCQkJCSAqICBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHRvIHJlYWwKKwkJCQkJICogIHBoeXNpY2FsIGFkZHJlc3MgZm9yIERNQSwgZm9yIGV4LiAqLworCQkJVTY0IHJlY3ZCdXNJbnRlcnJ1cHRIYW5kbGU7Lyo8IHNwZWNpZmllcyBpbnRlcnJ1cHQKKwkJCQkJICogICBpbmZvLiBJdCBpcyB1c2VkIGJ5IFNQIHRvIHJlZ2lzdGVyCisJCQkJCSAqICAgdG8gcmVjZWl2ZSBpbnRlcnJ1cHRzIGZyb20gdGhlIENQLgorCQkJCQkgKiAgIFRoaXMgaW50ZXJydXB0IGlzIHVzZWQgZm9yIGJ1cworCQkJCQkgKiAgIGxldmVsIG5vdGlmaWNhdGlvbnMuICBUaGUKKwkJCQkJICogICBjb3JyZXNwb25kaW5nCisJCQkJCSAqICAgc2VuZEJ1c0ludGVycnVwdEhhbmRsZSBpcyBrZXB0IGluCisJCQkJCSAqICAgQ1AuICovCisJCX0gY29uZmlndXJlQnVzOwkvKiBmb3IgQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgKi8KKworCQkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgKi8KKwkJQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ1JFQVRFIGNyZWF0ZURldmljZTsKKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CSAgICAgIC8qPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cKKwkJCQkJICAgICAgICogcmVjZWl2ZXIncyBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJCQlVMzIgZGV2Tm87CSAgICAgIC8qPCBidXMtcmVsYXRpdmUgKDAuLm4tMSkgZGV2aWNlCisJCQkJCSAgICAgICAqIG51bWJlciAqLworCQl9IGRlc3Ryb3lEZXZpY2U7CS8qIGZvciBDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgKi8KKworCQkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DT05GSUdVUkUgKi8KKwkJQ09OVFJPTFZNX1BBQ0tFVF9ERVZJQ0VfQ09ORklHVVJFIGNvbmZpZ3VyZURldmljZTsKKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CSAgICAgIC8qPCBidXMgIyAoMC4ubi0xKSBmcm9tIHRoZSBtc2cKKwkJCQkJICAgICAgICogcmVjZWl2ZXIncyBwZXJzcGVjdGl2ZSAqLworCisJICAgIC8qIENvbnRyb2wgdXNlcyBoZWFkZXIgU2VnbWVudEluZGV4IGZpZWxkIHRvIGFjY2VzcyBidXMgbnVtYmVyLi4uICovCisJCQlVMzIgZGV2Tm87CSAgICAgIC8qPCBidXMtcmVsYXRpdmUgKDAuLm4tMSkgZGV2aWNlCisJCQkJCSAgICAgICAqIG51bWJlciAqLworCQl9IHJlY29uZmlndXJlRGV2aWNlOwkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9SRUNPTkZJR1VSRSAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsKKwkJCVVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGU7CisJCQlVOCByZXNlcnZlZFsyXTsJLyogTmF0dXJhbCBhbGlnbm1lbnQgcHVycG9zZXMgKi8KKwkJfSBidXNDaGFuZ2VTdGF0ZTsJLyogZm9yIENPTlRST0xWTV9CVVNfQ0hBTkdFU1RBVEUgKi8KKwkJc3RydWN0ICB7CisJCQlVMzIgYnVzTm87CisJCQlVMzIgZGV2Tm87CisJCQlVTFRSQV9TRUdNRU5UX1NUQVRFIHN0YXRlOworCQkJc3RydWN0ICB7CisJCQkJVTMyIHBoeXNpY2FsRGV2aWNlOjE7CS8qID0xIGlmIG1lc3NhZ2UgaXMgZm9yCisJCQkJCQkJICogYSBwaHlzaWNhbCBkZXZpY2UgKi8KKwkJCS8qIHJlbWFpbmluZyBiaXRzIGluIHRoaXMgMzItYml0IHdvcmQgYXJlIGF2YWlsYWJsZSAqLworCQkJfSBmbGFnczsKKwkJCVU4IHJlc2VydmVkWzJdOwkvKiBOYXR1cmFsIGFsaWdubWVudCBwdXJwb3NlcyAqLworCQl9IGRldmljZUNoYW5nZVN0YXRlOwkvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNObzsKKwkJCVUzMiBkZXZObzsKKwkJCVVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGU7CisJCQlVOCByZXNlcnZlZFs2XTsJLyogTmF0dXJhbCBhbGlnbm1lbnQgcHVycG9zZXMgKi8KKwkJfSBkZXZpY2VDaGFuZ2VTdGF0ZUV2ZW50OyAvKiBmb3IgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURV9FVkVOVCAqLworCQlzdHJ1Y3QgIHsKKwkJCVUzMiBidXNDb3VudDsgLyo8IGluZGljYXRlcyB0aGUgbWF4IG51bWJlciBvZiBidXNzZXMgKi8KKwkJCVUzMiBzd2l0Y2hDb3VudDsgLyo8IGluZGljYXRlcyB0aGUgbWF4IG51bWJlciBvZgorCQkJCQkgICogICBzd2l0Y2hlcyAoYXBwbGljYWJsZSBmb3Igc2VydmljZQorCQkJCQkgICogICBwYXJ0aXRpb24gb25seSkgKi8KKwkJCVVMVFJBX0NISVBTRVRfRkVBVFVSRSBmZWF0dXJlczsKKwkJCVUzMiBwbGF0Zm9ybU51bWJlcjsJLyogUGxhdGZvcm0gTnVtYmVyICovCisJCX0gaW5pdENoaXBzZXQ7CS8qIGZvciBDT05UUk9MVk1fQ0hJUFNFVF9JTklUICovCisJCXN0cnVjdCAgeworCQkJVTMyIE9wdGlvbnM7IC8qPCByZXNlcnZlZCAqLworCQkJVTMyIFRlc3Q7ICAgIC8qPCBiaXQgMCBzZXQgdG8gcnVuIGVtYmVkZGVkIHNlbGZ0ZXN0ICovCisJCX0gY2hpcHNldFNlbGZ0ZXN0OwkvKiBmb3IgQ09OVFJPTFZNX0NISVBTRVRfU0VMRlRFU1QgKi8KKworCQkgICAgLyogRU5EIFJlcXVlc3QgbWVzc2FnZXMgKi8KKworCQkgICAgLyogQkVHSU4gUmVzcG9uc2UgbWVzc2FnZXMgKi8KKworCQkgICAgLyogRU5EIFJlc3BvbnNlIG1lc3NhZ2VzICovCisKKwkJICAgIC8qIEJFR0lOIEV2ZW50IG1lc3NhZ2VzICovCisKKwkJICAgIC8qIEVORCBFdmVudCBtZXNzYWdlcyAqLworCisJCSAgICAvKiBCRUdJTiBBY2sgbWVzc2FnZXMgKi8KKworCQkgICAgLyogRU5EIEFjayBtZXNzYWdlcyAqLworCQlVNjQgYWRkcjsJICAgIC8qPCBhIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygc29tZXRoaW5nLCB0aGF0CisJCQkJICAgICAqICAgY2FuIGJlIGRlcmVmZXJlbmNlZCBieSB0aGUgcmVjZWl2ZXIgb2YKKwkJCQkgICAgICogICB0aGlzIENvbnRyb2xWbSBjb21tYW5kIChkZXBlbmRzIG9uCisJCQkJICAgICAqICAgY29tbWFuZCBpZCkgKi8KKwkJVTY0IGhhbmRsZTsJICAgIC8qPCBhIGhhbmRsZSBvZiBzb21ldGhpbmcgKGRlcGVuZHMgb24KKwkJCQkgICAgICogY29tbWFuZCBpZCkgKi8KKwl9OworfSBDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQ7CisKKy8qIEFsbCBtZXNzYWdlcyBpbiBhbnkgQ29udHJvbFZtIHF1ZXVlIGhhdmUgdGhpcyBsYXlvdXQuICovCit0eXBlZGVmIHN0cnVjdCBfQ09OVFJPTFZNX01FU1NBR0UgIHsKKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgaGRyOworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCBjbWQ7Cit9IENPTlRST0xWTV9NRVNTQUdFOworCit0eXBlZGVmIHN0cnVjdCBfREVWSUNFX01BUCAgeworCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgRGV2aWNlQ2hhbm5lbEFkZHJlc3M7CisJVTY0IERldmljZUNoYW5uZWxTaXplOworCVUzMiBDQV9JbmRleDsKKwlVMzIgUmVzZXJ2ZWQ7CQkvKiBuYXR1cmFsIGFsaWdubWVudCAqLworCVU2NCBSZXNlcnZlZDI7CQkvKiBBbGlnbiBzdHJ1Y3R1cmUgb24gMzItYnl0ZSBib3VuZGFyeSAqLworfSBERVZJQ0VfTUFQOworCit0eXBlZGVmIHN0cnVjdCBfR1VFU1RfREVWSUNFUyAgeworCURFVklDRV9NQVAgVmlkZW9DaGFubmVsOworCURFVklDRV9NQVAgS2V5Ym9hcmRDaGFubmVsOworCURFVklDRV9NQVAgTmV0d29ya0NoYW5uZWw7CisJREVWSUNFX01BUCBTdG9yYWdlQ2hhbm5lbDsKKwlERVZJQ0VfTUFQIENvbnNvbGVDaGFubmVsOworCVUzMiBQYXJ0aXRpb25JbmRleDsKKwlVMzIgUGFkOworfSBHVUVTVF9ERVZJQ0VTOworCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wgIHsKKwkgQ0hBTk5FTF9IRUFERVIgSGVhZGVyOworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwQ29udHJvbFZtOwkvKiBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCisJCQkJCQkgKiB0aGlzIGNoYW5uZWwgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncFBhcnRpdGlvblRhYmxlczsgLyogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZgorCQkJCQkJICAgICogcGFydGl0aW9uIHRhYmxlcyAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwRGlhZ0d1ZXN0OwkvKiBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCisJCQkJCQkgKiBkaWFnbm9zdGljIGNoYW5uZWwgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncEJvb3RSb21EaXNrOwkvKiBndWVzdCBwaHlzIGFkZHIgb2YgKHJlYWQKKwkJCQkJCSAqIG9ubHkpIEJvb3QgUk9NIGRpc2sgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncEJvb3RSYW1EaXNrOwkvKiBndWVzdCBwaHlzIGFkZHIgb2Ygd3JpdGFibGUKKwkJCQkJCSAqIEJvb3QgUkFNIGRpc2sgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncEFjcGlUYWJsZTsJLyogZ3Vlc3QgcGh5cyBhZGRyIG9mIGFjcGkKKwkJCQkJCSAqIHRhYmxlICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgZ3BDb250cm9sQ2hhbm5lbDsgLyogZ3Vlc3QgcGh5cyBhZGRyIG9mIGNvbnRyb2wKKwkJCQkJCSAgICogY2hhbm5lbCAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwRGlhZ1JvbURpc2s7CS8qIGd1ZXN0IHBoeXMgYWRkciBvZiBkaWFnbm9zdGljCisJCQkJCQkgKiBST00gZGlzayAqLworCSBHVUVTVF9QSFlTSUNBTF9BRERSRVNTIGdwTnZyYW07CS8qIGd1ZXN0IHBoeXMgYWRkciBvZiBOVlJBTQorCQkJCQkJICogY2hhbm5lbCAqLworCSBVNjQgUmVxdWVzdFBheWxvYWRPZmZzZXQ7CS8qIE9mZnNldCB0byByZXF1ZXN0IHBheWxvYWQgYXJlYSAqLworCSBVNjQgRXZlbnRQYXlsb2FkT2Zmc2V0OwkvKiBPZmZzZXQgdG8gZXZlbnQgcGF5bG9hZCBhcmVhICovCisJIFUzMiBSZXF1ZXN0UGF5bG9hZEJ5dGVzOwkvKiBCeXRlcyBhdmFpbGFibGUgaW4gcmVxdWVzdCBwYXlsb2FkCisJCQkJCSAqIGFyZWEgKi8KKwkgVTMyIEV2ZW50UGF5bG9hZEJ5dGVzOwkvKiBCeXRlcyBhdmFpbGFibGUgaW4gZXZlbnQgcGF5bG9hZCBhcmVhICovCisJIFUzMiBDb250cm9sQ2hhbm5lbEJ5dGVzOworCSBVMzIgTnZyYW1DaGFubmVsQnl0ZXM7CS8qIEJ5dGVzIGluIFBhcnRpdGlvbk52cmFtIHNlZ21lbnQgKi8KKwkgVTMyIE1lc3NhZ2VCeXRlczsJLyogc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSAqLworCSBVMzIgTWVzc2FnZUNvdW50OwkvKiBDT05UUk9MVk1fTUVTU0FHRV9NQVggKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncFNtYmlvc1RhYmxlOwkvKiBndWVzdCBwaHlzIGFkZHIgb2YgU01CSU9TCisJCQkJCQkgKiB0YWJsZXMgKi8KKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBncFBoeXNpY2FsU21iaW9zVGFibGU7CS8qIGd1ZXN0IHBoeXMgYWRkciBvZgorCQkJCQkJCSAqIFNNQklPUyB0YWJsZSAgKi8KKwkgLyogVUxUUkFfTUFYX0dVRVNUU19QRVJfU0VSVklDRSAqLworCSBHVUVTVF9ERVZJQ0VTIGdwT2Jzb2xldGVHdWVzdERldmljZXNbMTZdOworCisJIC8qIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRUZJIGZpcm13YXJlIGltYWdlIGJhc2UgICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0RmlybXdhcmVJbWFnZUJhc2U7CisKKwkgLyogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiBFRkkgZmlybXdhcmUgZW50cnkgcG9pbnQgICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0RmlybXdhcmVFbnRyeVBvaW50OworCisJIC8qIGd1ZXN0IEVGSSBmaXJtd2FyZSBpbWFnZSBzaXplICAqLworCSBVNjQgVmlydHVhbEd1ZXN0RmlybXdhcmVJbWFnZVNpemU7CisKKwkgLyogR1BBID0gMU1CIHdoZXJlIEVGSSBmaXJtd2FyZSBpbWFnZSBpcyBjb3BpZWQgdG8gICovCisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0RmlybXdhcmVCb290QmFzZTsKKwkgR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBWaXJ0dWFsR3Vlc3RJbWFnZUJhc2U7CisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0SW1hZ2VTaXplOworCSBVNjQgUHJvdG90eXBlQ29udHJvbENoYW5uZWxPZmZzZXQ7CisJIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgVmlydHVhbEd1ZXN0UGFydGl0aW9uSGFuZGxlOworCisJIFUxNiBSZXN0b3JlQWN0aW9uOwkvKiBSZXN0b3JlIEFjdGlvbiBmaWVsZCB0byByZXN0b3JlIHRoZSBndWVzdAorCQkJCSAqIHBhcnRpdGlvbiAqLworCVUxNiBEdW1wQWN0aW9uOwkJLyogRm9yIFdpbmRvd3MgZ3Vlc3RzIGl0IHNob3dzIGlmIHRoZSB2aXNvcmRpc2sKKwkJCQkgKiBpcyBydW5uaW5nIGluIGR1bXAgbW9kZSAqLworCVUxNiBOdnJhbUZhaWxDb3VudDsKKwlVMTYgU2F2ZWRDcmFzaE1zZ0NvdW50OwkvKiA9IENPTlRST0xWTV9DUkFTSE1TR19NQVggKi8KKwlVMzIgU2F2ZWRDcmFzaE1zZ09mZnNldDsJLyogT2Zmc2V0IHRvIHJlcXVlc3QgcGF5bG9hZCBhcmVhIG5lZWRlZAorCQkJCQkgKiBmb3IgY3Jhc2ggZHVtcCAqLworCVUzMiBJbnN0YWxsYXRpb25FcnJvcjsJLyogVHlwZSBvZiBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcKKwkJCQkgKiBpbnN0YWxsYXRpb24gKi8KKwlVMzIgSW5zdGFsbGF0aW9uVGV4dElkOwkvKiBJZCBvZiBzdHJpbmcgdG8gZGlzcGxheSAqLworCVUxNiBJbnN0YWxsYXRpb25SZW1haW5pbmdTdGVwczsJLyogTnVtYmVyIG9mIHJlbWFpbmluZyBpbnN0YWxsYXRpb24KKwkJCQkJICogc3RlcHMgKGZvciBwcm9ncmVzcyBiYXJzKSAqLworCVU4IFRvb2xBY3Rpb247CQkvKiBVTFRSQV9UT09MX0FDVElPTlMgSW5zdGFsbGF0aW9uIEFjdGlvbgorCQkJCSAqIGZpZWxkICovCisJVTggUmVzZXJ2ZWQ7CQkvKiBhbGlnbm1lbnQgKi8KKwlVTFRSQV9FRklfU1BBUl9JTkRJQ0FUSU9OIEVmaVNwYXJJbmRpY2F0aW9uOworCVVMVFJBX0VGSV9TUEFSX0lORElDQVRJT04gRWZpU3BhckluZGljYXRpb25TdXBwb3J0ZWQ7CisJVTMyIFNQUmVzZXJ2ZWQ7CisJVTggUmVzZXJ2ZWQyWzI4XTsJLyogRm9yY2Ugc2lnbmFscyB0byBiZWdpbiBvbiAxMjgtYnl0ZSBjYWNoZQorCQkJCSAqIGxpbmUgKi8KKwlTSUdOQUxfUVVFVUVfSEVBREVSIFJlcXVlc3RRdWV1ZTsJLyogU2VydmljZSBvciBndWVzdCBwYXJ0aXRpb24KKwkJCQkJCSAqIHVzZXMgdGhpcyBxdWV1ZSB0byBzZW5kCisJCQkJCQkgKiByZXF1ZXN0cyB0byBDb250cm9sICovCisJU0lHTkFMX1FVRVVFX0hFQURFUiBSZXNwb25zZVF1ZXVlOwkvKiBDb250cm9sIHVzZXMgdGhpcyBxdWV1ZSB0bworCQkJCQkJICogcmVzcG9uZCB0byBzZXJ2aWNlIG9yIGd1ZXN0CisJCQkJCQkgKiBwYXJ0aXRpb24gcmVxdWVzdHMgKi8KKwlTSUdOQUxfUVVFVUVfSEVBREVSIEV2ZW50UXVldWU7CQkvKiBDb250cm9sIHVzZXMgdGhpcyBxdWV1ZSB0bworCQkJCQkJICogc2VuZCBldmVudHMgdG8gc2VydmljZSBvcgorCQkJCQkJICogZ3Vlc3QgcGFydGl0aW9uICovCisJU0lHTkFMX1FVRVVFX0hFQURFUiBFdmVudEFja1F1ZXVlOwkvKiBTZXJ2aWNlIG9yIGd1ZXN0IHBhcnRpdGlvbgorCQkJCQkJICogdXNlcyB0aGlzIHF1ZXVlIHRvIGFjaworCQkJCQkJICogQ29udHJvbCBldmVudHMgKi8KKworCSAvKiBSZXF1ZXN0IGZpeGVkLXNpemUgbWVzc2FnZSBwb29sIC0gZG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkICovCisJIENPTlRST0xWTV9NRVNTQUdFIFJlcXVlc3RNc2dbQ09OVFJPTFZNX01FU1NBR0VfTUFYXTsKKworCSAvKiBSZXNwb25zZSBmaXhlZC1zaXplIG1lc3NhZ2UgcG9vbCAtIGRvZXMgbm90IGluY2x1ZGUgcGF5bG9hZCAqLworCSBDT05UUk9MVk1fTUVTU0FHRSBSZXNwb25zZU1zZ1tDT05UUk9MVk1fTUVTU0FHRV9NQVhdOworCisJIC8qIEV2ZW50IGZpeGVkLXNpemUgbWVzc2FnZSBwb29sIC0gZG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkICovCisJIENPTlRST0xWTV9NRVNTQUdFIEV2ZW50TXNnW0NPTlRST0xWTV9NRVNTQUdFX01BWF07CisKKwkgLyogQWNrIGZpeGVkLXNpemUgbWVzc2FnZSBwb29sIC0gZG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkICovCisJIENPTlRST0xWTV9NRVNTQUdFIEV2ZW50QWNrTXNnW0NPTlRST0xWTV9NRVNTQUdFX01BWF07CisKKwkgLyogTWVzc2FnZSBzdG9yZWQgZHVyaW5nIElPVk0gY3JlYXRpb24gdG8gYmUgcmV1c2VkIGFmdGVyIGNyYXNoICovCisJIENPTlRST0xWTV9NRVNTQUdFIFNhdmVkQ3Jhc2hNc2dbQ09OVFJPTFZNX0NSQVNITVNHX01BWF07Cit9IFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MOworCisvKiBPZmZzZXRzIGZvciBWTSBjaGFubmVsIGF0dHJpYnV0ZXMuLi4gKi8KKyNkZWZpbmUgVk1fQ0hfUkVRX1FVRVVFX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIFJlcXVlc3RRdWV1ZSkKKyNkZWZpbmUgVk1fQ0hfUkVTUF9RVUVVRV9PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBSZXNwb25zZVF1ZXVlKQorI2RlZmluZSBWTV9DSF9FVkVOVF9RVUVVRV9PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBFdmVudFF1ZXVlKQorI2RlZmluZSBWTV9DSF9BQ0tfUVVFVUVfT0ZGU0VUIFwKKwlvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgRXZlbnRBY2tRdWV1ZSkKKyNkZWZpbmUgVk1fQ0hfUkVRX01TR19PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBSZXF1ZXN0TXNnKQorI2RlZmluZSBWTV9DSF9SRVNQX01TR19PRkZTRVQgXAorCW9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLCBSZXNwb25zZU1zZykKKyNkZWZpbmUgVk1fQ0hfRVZFTlRfTVNHX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIEV2ZW50TXNnKQorI2RlZmluZSBWTV9DSF9BQ0tfTVNHX09GRlNFVCBcCisJb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsIEV2ZW50QWNrTXNnKQorI2RlZmluZSBWTV9DSF9DUkFTSF9NU0dfT0ZGU0VUIFwKKwlvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgU2F2ZWRDcmFzaE1zZykKKworLyogVGhlIGZvbGxvd2luZyBoZWFkZXIgd2lsbCBiZSBsb2NhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgUGF5bG9hZFZtT2Zmc2V0IGZvcgorICogIHZhcmlvdXMgQ29udHJvbFZtIGNvbW1hbmRzLiBUaGUgcmVjZWl2ZXIgb2YgYSBDb250cm9sVm0gY29tbWFuZCB3aXRoIGEKKyAqICBQYXlsb2FkVm1PZmZzZXQgd2lsbCBkZXJlZmVyZW5jZSB0aGlzIGFkZHJlc3MgYW5kIHRoZW4gdXNlIENvbm5lY3Rpb25PZmZzZXQsCisgKiAgSW5pdGlhdG9yT2Zmc2V0LCBhbmQgVGFyZ2V0T2Zmc2V0IHRvIGdldCB0aGUgbG9jYXRpb24gb2YgVVRGLTggZm9ybWF0dGVkCisgKiAgc3RyaW5ncyB0aGF0IGNhbiBiZSBwYXJzZWQgdG8gb2J0YWluIGNvbW1hbmQtc3BlY2lmaWMgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZQorICogIG9mIFRvdGFsTGVuZ3RoIHNob3VsZCBlcXVhbCBQYXlsb2FkQnl0ZXMuICBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmdzIGF0CisgKiAgUGF5bG9hZFZtT2Zmc2V0IHdpbGwgdGFrZSBkaWZmZXJlbnQgZm9ybXMgZGVwZW5kaW5nIG9uIHRoZSBtZXNzYWdlLiAgU2VlIHRoZQorICogIGZvbGxvd2luZyBXaWtpIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb246CisgKiAgaHR0cHM6Ly91c3RyLWxpbnV4LTEubmEudWlzLnVuaXN5cy5jb20vc3Bhci9pbmRleC5waHAvQ29udHJvbFZtX1BhcmFtZXRlcnNfQXJlYQorICovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSICB7CisJVTMyIFRvdGFsTGVuZ3RoOworCVUzMiBIZWFkZXJMZW5ndGg7CisJVTMyIENvbm5lY3Rpb25PZmZzZXQ7CisJVTMyIENvbm5lY3Rpb25MZW5ndGg7CisJVTMyIEluaXRpYXRvck9mZnNldDsKKwlVMzIgSW5pdGlhdG9yTGVuZ3RoOworCVUzMiBUYXJnZXRPZmZzZXQ7CisJVTMyIFRhcmdldExlbmd0aDsKKwlVMzIgQ2xpZW50T2Zmc2V0OworCVUzMiBDbGllbnRMZW5ndGg7CisJVTMyIE5hbWVPZmZzZXQ7CisJVTMyIE5hbWVMZW5ndGg7CisJR1VJRCBJZDsKKwlVMzIgUmV2aXNpb247CisJVTMyIFJlc2VydmVkOwkJLyogTmF0dXJhbCBhbGlnbm1lbnQgKi8KK30gVUxUUkFfQ09OVFJPTFZNX1BBUkFNRVRFUlNfSEVBREVSOworCisjZW5kaWYJCQkJLyogX19DT05UUk9MVk1DSEFOTkVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2RpYWdjaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvZGlhZ2NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM1MTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2RpYWdjaGFubmVsLmgKQEAgLTAsMCArMSw0MjcgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyorKworICoKKyAqIE1vZHVsZSBOYW1lOgorICoKKyAqIGRpYWdjaGFubmVsLmgKKyAqCisgKiBBYnN0cmFjdDoKKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGlhZ0NoYW5uZWwgcHJvdG9jb2wuICBUaGlzIHByb3RvY29sIGlzIHVzZWQgdG8gYWlkIGluCisgKiBwcmVzZXJ2aW5nIGV2ZW50IGRhdGEgc2VudCBieSBleHRlcm5hbCBhcHBsaWNhdGlvbnMuICBUaGlzIHByb3RvY29sIHByb3ZpZGVzCisgKiBhIHJlZ2lvbiBmb3IgZXZlbnQgZGF0YSB0byByZXNpZGUgaW4uICBUaGlzIGRhdGEgd2lsbCBldmVudHVhbGx5IGJlIHNlbnQgdG8KKyAqIHRoZSBCb290IFBhcnRpdGlvbiB3aGVyZSBpdCB3aWxsIGJlIGNvbW1pdHRlZCB0byBtZW1vcnkgYW5kL29yIGRpc2suICBUaGlzCisgKiBmaWxlIGNvbnRhaW5zIHBsYXRmb3JtLWluZGVwZW5kZW50IGRhdGEgdGhhdCBjYW4gYmUgYnVpbHQgdXNpbmcgYW55CisgKiBTdXBlcnZpc29yIGJ1aWxkIGVudmlyb25tZW50IChXaW5kb3dzLCBMaW51eCwgRUZJKS4KKyAqCisqLworCisjaWZuZGVmIF9ESUFHX0NIQU5ORUxfSF8KKyNkZWZpbmUgX0RJQUdfQ0hBTk5FTF9IXworCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisKKy8qIHtFRUE3QTU3My1EQjgyLTQ0N2MtODcxNi1FRkJFQUFBRTQ4NTh9ICovCisjZGVmaW5lIFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEIFwKKwl7MHhlZWE3YTU3MywgMHhkYjgyLCAweDQ0N2MsIFwKKwkJezB4ODcsIDB4MTYsIDB4ZWYsIDB4YmUsIDB4YWEsIDB4YWUsIDB4NDgsIDB4NTh9IH0KKworc3RhdGljIGNvbnN0IEdVSUQgVWx0cmFEaWFnQ2hhbm5lbFByb3RvY29sR3VpZCA9CisJVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX0dVSUQ7CisKKy8qIHtFODUwRjk2OC0zMjYzLTQ0ODQtOENBNS0yQTM1RDA4N0E1QTh9ICovCisjZGVmaW5lIFVMVFJBX0RJQUdfUk9PVF9DSEFOTkVMX1BST1RPQ09MX0dVSUQgXAorCXsweGU4NTBmOTY4LCAweDMyNjMsIDB4NDQ4NCwgXAorCQl7MHg4YywgMHhhNSwgMHgyYSwgMHgzNSwgMHhkMCwgMHg4NywgMHhhNSwgMHhhOH0gfQorCisjZGVmaW5lIFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCisKKy8qIE11c3QgaW5jcmVtZW50IHRoaXMgd2hlbmV2ZXIgeW91IGluc2VydCBvciBkZWxldGUgZmllbGRzIHdpdGhpbiB0aGlzIGNoYW5uZWwKKyogc3RydWN0LiAgQWxzbyBpbmNyZW1lbnQgd2hlbmV2ZXIgeW91IGNoYW5nZSB0aGUgbWVhbmluZyBvZiBmaWVsZHMgd2l0aGluIHRoaXMKKyogY2hhbm5lbCBzdHJ1Y3Qgc28gYXMgdG8gYnJlYWsgcHJlLWV4aXN0aW5nIHNvZnR3YXJlLiAgTm90ZSB0aGF0IHlvdSBjYW4KKyogdXN1YWxseSBhZGQgZmllbGRzIHRvIHRoZSBFTkQgb2YgdGhlIGNoYW5uZWwgc3RydWN0IHdpdGhPVVQgbmVlZGluZyB0bworKiBpbmNyZW1lbnQgdGhpcy4gKi8KKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCAyCisKKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX09LX0NMSUVOVChwQ2hhbm5lbCwgbG9nQ3R4KQkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsCQkJCVwKKwkJCQkgICAgVWx0cmFEaWFnQ2hhbm5lbFByb3RvY29sR3VpZCwJXAorCQkJCSAgICAiZGlhZyIsCQkJCVwKKwkJCQkgICAgc2l6ZW9mKFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTCksIFwKKwkJCQkgICAgVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCwgXAorCQkJCSAgICBVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFLCBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKyNkZWZpbmUgVUxUUkFfRElBR19DSEFOTkVMX09LX1NFUlZFUihhY3R1YWxCeXRlcywgbG9nQ3R4KQkJXAorCShVTFRSQV9jaGVja19jaGFubmVsX3NlcnZlcihVbHRyYURpYWdDaGFubmVsUHJvdG9jb2xHdWlkLAlcCisJCQkJICAgICJkaWFnIiwJCQkJXAorCQkJCSAgICBzaXplb2YoVUxUUkFfRElBR19DSEFOTkVMX1BST1RPQ09MKSwgXAorCQkJCSAgICBhY3R1YWxCeXRlcywgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBNQVhfTU9EVUxFX05BTUVfU0laRSAxMjgJLyogTWF4aW11bSBsZW5ndGggb2YgbW9kdWxlIG5hbWUuLi4gKi8KKyNkZWZpbmUgTUFYX0FERElUSU9OQUxfSU5GT19TSVpFIDI1NgkvKiBNYXhpbXVtIGxlbmd0aCBvZiBhbnkgYWRkaXRpb25hbCBpbmZvCisJCQkJCSAqIGFjY29tcGFueWluZyBldmVudC4uLiAqLworI2RlZmluZSBNQVhfU1VCU1lTVEVNUyA2NAkvKiBNYXhpbXVtIG51bWJlciBvZiBzdWJzeXN0ZW1zIGFsbG93ZWQgaW4KKwkJCQkgKiBEaWFnQ2hhbm5lbC4uLiAqLworI2RlZmluZSBMT1dfU1VCU1lTVEVNUyAzMgkvKiBIYWxmIG9mIE1BWF9TVUJTWVNURU1TIHRvIGFsbG93IDY0LWJpdAorCQkJCSAqIG1hdGggKi8KKyNkZWZpbmUgU1VCU1lTVEVNX0RFQlVHIDAJLyogU3RhbmRhcmQgc3Vic3lzdGVtIGZvciBkZWJ1ZyBldmVudHMgKi8KKyNkZWZpbmUgU1VCU1lTVEVNX0RFRkFVTFQgMQkvKiBEZWZhdWx0IHN1YnN5c3RlbSBmb3IgbGVnYWN5IGNhbGxzIHRvCisJCQkJICogUmVwb3J0RXZlbnQgKi8KKworLyogZmV3IHVzZWZ1bCBzdWJzeXN0ZW0gbWFzayB2YWx1ZXMgKi8KKyNkZWZpbmUgU1VCU1lTVEVNX01BU0tfREVCVUcJMHgwMQkvKiBTdGFuZGFyZCBzdWJzeXN0ZW0gZm9yIGRlYnVnCisJCQkJCSAqIGV2ZW50cyAqLworI2RlZmluZSBTVUJTWVNURU1fTUFTS19ERUZBVUxUICAweDAyCS8qIERlZmF1bHQgc3Vic3lzdGVtIGZvciBsZWdhY3kgY2FsbHMgdG8KKwkJCQkJICogUmVwb3J0RXZlbnRzICovCisKKy8qIEV2ZW50IHBhcmFtZXRlciAiU2V2ZXJpdHkiIGlzIG92ZXJsb2FkZWQgd2l0aCBDYXVzZSBpbiBieXRlIDIgYW5kIFNldmVyaXR5IGluCisgKiBieXRlIDAsIGJ5dGVzIDEgYW5kIDMgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFNFVkVSSVRZX01BU0sgMHgwRkYJLyogbWFzayBvdXQgYWxsIGJ1dCB0aGUgU2V2ZXJpdHkgaW4gYnl0ZSAwICovCisjZGVmaW5lIENBVVNFX01BU0sgMHgwRkYwMDAwCS8qIG1hc2sgb3V0IGFsbCBidXQgdGhlIGNhdXNlIGluIGJ5dGUgMiAqLworI2RlZmluZSBDQVVTRV9TSElGVF9BTVQgMTYJLyogc2hpZnQgMiBieXRlcyB0byBwbGFjZSBpdCBpbiBieXRlIDIgKi8KKworLyogU3Vic3lzdGVtU2V2ZXJpdHlGaWx0ZXIgKi8KKyNkZWZpbmUgU0VWRVJJVFlfRklMVEVSX01BU0sgMHgwRiAvKiBtYXNrIG91dCB0aGUgQ2F1c2UgaGFsZiwgU2V2ZXJpdHlGaWx0ZXIgaXMKKwkJCQkgICAqIGluIHRoZSBsb3dlciBuaWJibGUgKi8KKyNkZWZpbmUgQ0FVU0VfRklMVEVSX01BU0sgMHhGMAkvKiBtYXNrIG91dCB0aGUgU2V2ZXJpdHkgaGFsZiwgQ2F1c2VGaWx0ZXIgaXMgaW4KKwkJCQkgKiB0aGUgdXBwZXIgbmliYmxlICovCisjZGVmaW5lIENBVVNFX0ZJTFRFUl9TSElGVF9BTVQJNCAvKiBzaGlmdCBhbW91bnQgdG8gcGxhY2UgaXQgaW4gbG93ZXIgb3IgdXBwZXIKKwkJCQkgICAqIG5pYmJsZSAqLworCisvKiBDb3BpZWQgZnJvbSBFRkkncyBFRklfVElNRSBzdHJ1Y3QgaW4gZWZpZGVmLmguICBFRkkgaGVhZGVycyBhcmUgbm90IGFsbG93ZWQKKyogaW4gc29tZSBvZiB0aGUgU3VwZXJ2aXNvciBhcmVhcywgc3VjaCBhcyBNb25pdG9yLCBzbyBpdCBoYXMgYmVlbiAicG9ydGVkIiBoZXJlCisqIGZvciB1c2UgaW4gZGlhZ25vc3RpYyBldmVudCB0aW1lc3RhbXBzLi4uICovCit0eXBlZGVmIHN0cnVjdCBfRElBR19FRklfVElNRSAgeworCVUxNiBZZWFyOwkJLyogMTk5OCAtIDIwWFggKi8KKwlVOCBNb250aDsJCS8qIDEgLSAxMiAqLworCVU4IERheTsJCQkvKiAxIC0gMzEgKi8KKwlVOCBIb3VyOwkJLyogMCAtIDIzICovCisJVTggTWludXRlOwkJLyogMCAtIDU5ICovCisJVTggU2Vjb25kOwkJLyogMCAtIDU5ICovCisJVTggUGFkMTsKKwlVMzIgTmFub3NlY29uZDsJLyogMCAtIDk5OSwgOTk5LCA5OTkgKi8KKwlTMTYgVGltZVpvbmU7CQkvKiAtMTQ0MCB0byAxNDQwIG9yIDIwNDcgKi8KKwlVOCBEYXlsaWdodDsKKwlVOCBQYWQyOworfSBESUFHX0VGSV9USU1FOworCit0eXBlZGVmIGVudW0gIHsKKwkgVUxUUkFfQ09NUE9ORU5UX0dVRVNUID0gMCwKKwkgVUxUUkFfQ09NUE9ORU5UX01PTklUT1IgPSAweDAxLAorCSBVTFRSQV9DT01QT05FTlRfQ0NNID0gMHgwMiwJLyogQ29tbW9uIENvbnRyb2wgbW9kdWxlICovCisJIC8qIFJFU0VSVkVEIDB4MDMgLSAweDcgKi8KKworCSAvKiBVbHRyYXZpc29yIENvbXBvbmVudHMgKi8KKwkgVUxUUkFfQ09NUE9ORU5UX0JPT1QgPSAweDA4LAorCSBVTFRSQV9DT01QT05FTlRfSURMRSA9IDB4MDksCisJIFVMVFJBX0NPTVBPTkVOVF9DT05UUk9MID0gMHgwQSwKKwkgVUxUUkFfQ09NUE9ORU5UX0xPR0dFUiA9IDB4MEIsCisJIFVMVFJBX0NPTVBPTkVOVF9BQ1BJID0gMFgwQywKKwkgLyogUkVTRVJWRUQgMHgwRCAtIDB4MEYgKi8KKworCSAvKiBzUEFSIENvbXBvbmVudHMgKi8KKwkgVUxUUkFfQ09NUE9ORU5UX0NPTU1BTkQgPSAweDEwLAorCSBVTFRSQV9DT01QT05FTlRfSU9EUklWRVIgPSAweDExLAorCSBVTFRSQV9DT01QT05FTlRfQ09OU09MRSA9IDB4MTIsCisJIFVMVFJBX0NPTVBPTkVOVF9PUEVSQVRJT05TID0gMHgxMywKKwkgVUxUUkFfQ09NUE9ORU5UX01BTkFHRU1FTlQgPSAweDE0LAorCSBVTFRSQV9DT01QT05FTlRfRElBRyA9IDB4MTUsCisJIFVMVFJBX0NPTVBPTkVOVF9IV0RJQUcgPSAweDE2LAorCSBVTFRSQV9DT01QT05FTlRfUFNFUlZJQ0VTID0gMHgxNywKKwkgVUxUUkFfQ09NUE9ORU5UX1BESUFHID0gMHgxOAorCSAvKiBSRVNFUlZFRCAweDE4IC0gMHgxRiAqLworfSBVTFRSQV9DT01QT05FTlRfVFlQRVM7CisKKy8qIFN0cnVjdHVyZTogRElBR19DSEFOTkVMX0VWRU5UIFB1cnBvc2U6IENvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBtYWtlIHVwIGFuCisgKiBldmVudCB0byBiZSB3cml0dGVuIHRvIHRoZSBESUFHX0NIQU5ORUwgbWVtb3J5LiAgQXR0cmlidXRlczogRXZlbnRJZDogSWQgb2YKKyAqIHRoZSBkaWFnbm9zdGljIGV2ZW50IHRvIHdyaXRlIHRvIG1lbW9yeS4gIFNldmVyaXR5OiBTZXZlcml0eSBvZiB0aGUgZXZlbnQKKyAqIChFcnJvciwgSW5mbywgZXRjKS4gIE1vZHVsZU5hbWU6IE1vZHVsZS9maWxlIG5hbWUgd2hlcmUgZXZlbnQgb3JpZ2luYXRlZC4KKyAqIExpbmVOdW1iZXI6IExpbmUgbnVtYmVyIGluIG1vZHVsZSBuYW1lIHdoZXJlIGV2ZW50IG9yaWdpbmF0ZWQuICBUaW1lc3RhbXA6CisgKiBEYXRlL3RpbWUgd2hlbiBldmVudCB3YXMgcmVjZWl2ZWQgYnkgUmVwb3J0RXZlbnQsIGFuZCB3cml0dGVuIHRvIERpYWdDaGFubmVsLgorICogUmVzZXJ2ZWQ6IFBhZGRpbmcgdG8gYWxpZ24gc3RydWN0dXJlIG9uIGEgNjQtYnl0ZSBjYWNoZSBsaW5lIGJvdW5kYXJ5LgorICogQWRkaXRpb25hbEluZm86IEFycmF5IG9mIGNoYXJhY3RlcnMgZm9yIGFkZGl0aW9uYWwgZXZlbnQgaW5mbyAobWF5IGJlCisgKiBlbXB0eSkuICAqLwordHlwZWRlZiBzdHJ1Y3QgX0RJQUdfQ0hBTk5FTF9FVkVOVCAgeworCVUzMiBFdmVudElkOworCVUzMiBTZXZlcml0eTsKKwlVOCBNb2R1bGVOYW1lW01BWF9NT0RVTEVfTkFNRV9TSVpFXTsKKwlVMzIgTGluZU51bWJlcjsKKwlESUFHX0VGSV9USU1FIFRpbWVzdGFtcDsJLyogU2l6ZSA9IDE2IGJ5dGVzICovCisJVTMyIFBhcnRpdGlvbk51bWJlcjsJLyogRmlsbGVkIGluIGJ5IERpYWcgU3dpdGNoIGFzIHBvb2wgYmxvY2tzIGFyZQorCQkJCSAqIGZpbGxlZCAqLworCVUxNiBWaXJ0dWFsUHJvY2Vzc29yTnVtYmVyOworCVUxNiBMb2dpY2FsUHJvY2Vzc29yTnVtYmVyOworCVU4IENvbXBvbmVudFR5cGU7CS8qIFVMVFJBX0NPTVBPTkVOVF9UWVBFUyAqLworCVU4IFN1YnN5c3RlbTsKKwlVMTYgUmVzZXJ2ZWQwOwkJLyogcGFkIHRvIFU2NCBhbGlnbm1lbnQgKi8KKwlVMzIgQmxvY2tOdW1iZXI7CS8qIGZpbGxlZCBpbiBieSBEaWFnU3dpdGNoIGFzIHBvb2wgYmxvY2tzIGFyZQorCQkJCSAqIGZpbGxlZCAqLworCVUzMiBCbG9ja051bWJlckhpZ2g7CisJVTMyIEV2ZW50TnVtYmVyOwkvKiBmaWxsZWQgaW4gYnkgRGlhZ1N3aXRjaCBhcyBwb29sIGJsb2NrcyBhcmUKKwkJCQkgKiBmaWxsZWQgKi8KKwlVMzIgRXZlbnROdW1iZXJIaWdoOworCisJLyogVGhlIEJsb2NrTnVtYmVyIGFuZCBFdmVudE51bWJlciBmaWVsZHMgYXJlIHNldCBvbmx5IGJ5IERpYWdTd2l0Y2gKKwkgKiBhbmQgcmVmZXJlbmNlZCBvbmx5IGJ5IFdpbkRpYWdEaXNwbGF5IGZvcm1hdHRpbmcgdG9vbCBhcworCSAqIGFkZGl0aW9uYWwgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gIE90aGVyIHRvb2xzIGluY2x1ZGluZworCSAqIFdpbkRpYWdEaXNwbGF5IGN1cnJlbnRseSBpZ25vcmUgdGhlc2UgJ1Jlc2VydmVkJyBieXRlcy4gKi8KKwlVOCBSZXNlcnZlZFs4XTsKKwlVOCBBZGRpdGlvbmFsSW5mb1tNQVhfQURESVRJT05BTF9JTkZPX1NJWkVdOworCisJLyogTk9URTogQ2hhbmdlc3RvIERJQUdfQ0hBTk5FTF9FVkVOVCBnZW5lcmFsbHkgbmVlZCB0byBiZSByZWZsZWN0ZWQgaW4KKwkgKiBleGlzdGluZyBjb3BpZXMgKgorCSAqIC0gZm9yIEFwcE9TIGF0CisJICogR3Vlc3RMaW51eC92aXNvcmRpYWdfZWFybHkvc3VwZXJ2aXNvcl9kaWFnY2hhbm5lbC5oICoKKwkgKiAtIGZvciBXaW5EaWFnRGlzcGxheSBhdAorCSAqIEVGSS9VbHRyYS9Ub29scy9XaW5EaWFnRGlzcGxheS9XaW5EaWFnRGlzcGxheS9kaWFnc3RydWN0LmggKi8KK30gRElBR19DSEFOTkVMX0VWRU5UOworCisvKiBMZXZlbHMgb2Ygc2V2ZXJpdHkgZm9yIGRpYWdub3N0aWMgZXZlbnRzLCBpbiBvcmRlciBmcm9tIGxvd2VzdCBzZXZlcml0eSB0bworKiBoaWdoZXN0IChpLmUuIGZhdGFsIGVycm9ycyBhcmUgdGhlIG1vc3Qgc2V2ZXJlLCBhbmQgc2hvdWxkIGFsd2F5cyBiZSBsb2dnZWQsCisqIGJ1dCBpbmZvIGV2ZW50cyByYXJlbHkgbmVlZCB0byBiZSBsb2dnZWQgZXhjZXB0IGR1cmluZyBkZWJ1Z2dpbmcpLiAgVGhlIHZhbHVlcworKiBESUFHX1NFVkVSSVRZX0VOVU1fQkVHSU4gYW5kIERJQUdfU0VWRVJJVFlfRU5VTV9FTkQgYXJlIG5vdCB2YWxpZCBzZXZlcml0eQorKiB2YWx1ZXMuICBUaGV5IGV4aXN0IG1lcmVseSB0byBkaWxpbmVhdGUgdGhlIGxpc3QsIHNvIHRoYXQgZnV0dXJlIGFkZGl0aW9ucworKiB3b24ndCByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIGRyaXZlciAoaS5lLiB3aGVuIGNoZWNraW5nIGZvciBvdXQtb2YtcmFuZ2UKKyogc2V2ZXJpdGllcyBpbiBTZXRTZXZlcml0eSkuICBUaGUgdmFsdWVzIERJQUdfU0VWRVJJVFlfT1ZFUlJJREUgYW5kCisqIERJQUdfU0VWRVJJVFlfU0hVVE9GRiBhcmUgbm90IHZhbGlkIHNldmVyaXR5IHZhbHVlcyBmb3IgbG9nZ2luZyBldmVudHMgYnV0CisqIHRoZXkgYXJlIHZhbGlkIGZvciBjb250cm9sbGluZyB0aGUgYW1vdW50IG9mIGV2ZW50IGRhdGEuICBUaGlzIGVudW0gaXMgYWxzbworKiBkZWZpbmVkIGluIERvdE5ldFxzUGFyRnJhbWV3b3JrXENvbnRyb2xGcmFtZXdvcmtcQ29udHJvbEZyYW1ld29yay5jcy4gIElmIGEKKyogY2hhbmdlIGlzIG1hZGUgdG8gdGhpcyBlbnVtLCB0aGV5IHNob3VsZCBhbHNvIGJlIHJlZmxlY3RlZCBpbiB0aGF0IGZpbGUuICAqLwordHlwZWRlZiBlbnVtICB7IERJQUdfU0VWRVJJVFlfRU5VTV9CRUdJTiA9IDAsCisJCURJQUdfU0VWRVJJVFlfT1ZFUlJJREUgPSBESUFHX1NFVkVSSVRZX0VOVU1fQkVHSU4sCisJCURJQUdfU0VWRVJJVFlfVkVSQk9TRSA9IERJQUdfU0VWRVJJVFlfT1ZFUlJJREUsCS8qIDAgKi8KKwkJRElBR19TRVZFUklUWV9JTkZPID0gRElBR19TRVZFUklUWV9WRVJCT1NFICsgMSwJLyogMSAqLworCQlESUFHX1NFVkVSSVRZX1dBUk5JTkcgPSBESUFHX1NFVkVSSVRZX0lORk8gKyAxLAkvKiAyICovCisJCURJQUdfU0VWRVJJVFlfRVJSID0gRElBR19TRVZFUklUWV9XQVJOSU5HICsgMSwJLyogMyAqLworCQlESUFHX1NFVkVSSVRZX1BSSU5UID0gRElBR19TRVZFUklUWV9FUlIgKyAxLAkvKiA0ICovCisJCURJQUdfU0VWRVJJVFlfU0hVVE9GRiA9IERJQUdfU0VWRVJJVFlfUFJJTlQgKyAxLCAvKiA1ICovCisJCURJQUdfU0VWRVJJVFlfRU5VTV9FTkQgPSBESUFHX1NFVkVSSVRZX1NIVVRPRkYsCS8qIDUgKi8KKwkJRElBR19TRVZFUklUWV9OT05GQVRBTF9FUlIgPSBESUFHX1NFVkVSSVRZX0VSUiwKKwkJRElBR19TRVZFUklUWV9GQVRBTF9FUlIgPSBESUFHX1NFVkVSSVRZX1BSSU5UCit9IERJQUdfU0VWRVJJVFk7CisKKy8qIEV2ZW50IENhdXNlIGVudW1zCisqCisqIExldmVscyBvZiBjYXVzZSBmb3IgZGlhZ25vc3RpYyBldmVudHMsIGluIG9yZGVyIGZyb20gbGVhc3QgdG8gZ3JlYXRlc3QgY2F1c2UKKyogSW50ZXJuYWwgZXJyb3JzIGFyZSBtb3N0IHVyZ2VudCBzaW5jZSBpZGVhbGx5IHRoZXkgc2hvdWxkIG5ldmVyIGV4aXN0CisqIEludmFsaWQgcmVxdWVzdHMgYXJlIHByZXZlbnRhYmxlIGJ5IGF2b2lkaW5nIGludmFsaWQgaW5wdXRzCisqIE9wZXJhdGlvbnMgZXJyb3JzIGRlcGVuZCBvbiBlbnZpcm9ubWVudGFsIGZhY3RvcnMgd2hpY2ggbWF5IGltcGFjdCB3aGljaAorKiByZXF1ZXN0cyBhcmUgcG9zc2libGUKKyogTWFuaWZlc3QgcHJvdmlkZXMgaW50ZXJtZWRpYXRlIHZhbHVlIHRvIGNhcHR1cmUgZmlybXdhcmUgYW5kIGNvbmZpZ3VyYXRpb24KKyogdmVyc2lvbiBpbmZvcm1hdGlvbgorKiBUcmFjZSBwcm92aWRlcyBzdXBsaW1lbnRhbCBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiByZWxlYXNlIGZpcm13YXJlCisqIFVua25vd24gTG9nIGNhcHR1cmVzIHVuY2xhc2lmaWVkIExvZ0V2ZW50IGNhbGxzLgorKiBEZWJ1ZyBpcyB0aGUgbGVhc3QgdXJnZW50IHNpbmNlIGl0IHByb3ZpZGVzIHN1cGxpbWVudGFsIGRlYnVnIGluZm9ybWF0aW9uIG9ubHkKKyogaW4gZGVidWcgZmlybXdhcmUKKyogVW5rbm93biBEZWJ1ZyBjYXB0dXJlcyB1bmNsYXNzaWZpZWQgRGVidWdFdmVudCBjYWxscy4KKyogVGhpcyBlbnVtIGlzIGFsc28gZGVmaW5lZCBpbgorKiBEb3ROZXRcc1BhckZyYW1ld29ya1xDb250cm9sRnJhbWV3b3JrXENvbnRyb2xGcmFtZXdvcmsuY3MuCisqIElmIGEgY2hhbmdlIGlzIG1hZGUgdG8gdGhpcyBlbnVtLCB0aGV5IHNob3VsZCBhbHNvIGJlIHJlZmxlY3RlZCBpbiB0aGF0CisqIGZpbGUuICAqLworCisKKworLyogQSBjYXVzZSB2YWx1ZSAiRElBR19DQVVTRV9GSUxFX1hGRVIiIHRvZ2V0aGVyIHdpdGggYSBzZXZlcml0eSB2YWx1ZSBvZgorKiAiRElBR19TRVZFUklUWV9QUklOVCIgKD00KSwgaXMgdXNlZCBmb3IgdHJhbnNmZXJyaW5nIHRleHQgb3IgYmluYXJ5IGZpbGUgdG8KKyogdGhlIERpYWcgcGFydGl0aW9uLiBUaGlzIGNhdXNlLXNldmVyaXR5IGNvbWJpbmF0aW9uIHdpbGwgYmUgdXNlZCBieSBMb2dnZXIKKyogRGlhZ1N3aXRjaCB0byBzZWdyZWdhdGUgZXZlbnRzIGludG8gYmxvY2sgdHlwZXMuIFRoZSBmaWxlcyBhcmUgdHJhbnNmZXJyZWQgaW4KKyogMjU2IGJ5dGUgY2h1bmtzIG1heGltdW0sIGluIHRoZSBBZGRpdGlvbmFsSW5mbyBmaWVsZCBvZiB0aGUgRElBR19DSEFOTkVMX0VWRU5UCisqIHN0cnVjdHVyZS4gSW4gdGhlIGZpbGUgdHJhbnNmZXIgbW9kZSwgc29tZSBldmVudCBmaWVsZHMgd2lsbCBoYXZlIGRpZmZlcmVudAorKiBtZWFuaW5nOiBFdmVudElkIHNwZWNpZmllcyB0aGUgZmlsZSBvZmZzZXQsIHNldmVyaXR5IHNwZWNpZmllcyB0aGUgYmxvY2sgdHlwZSwKKyogTW9kdWxlTmFtZSBzcGVjaWZpZXMgdGhlIGZpbGVuYW1lLCBMaW5lTnVtYmVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZhbGlkCisqIGRhdGEgYnl0ZXMgaW4gYW4gZXZlbnQgYW5kIEFkZGl0aW9uYWxJbmZvIGNvbnRhaW5zIHVwIHRvIDI1NiBieXRlcyBvZiBkYXRhLiAqLworCisvKiBUaGUgRGlhZyBEaWFnV3JpdGVyIGFwcGVuZHMgZXZlbnQgYmxvY2tzIHRvIGV2ZW50cy5yYXcgYXMgdG9kYXksIGFuZCBmb3IgZGF0YQorICogYmxvY2tzIHVzZXMgRElBR19DSEFOTkVMX0VWRU5UCisgKiBQYXJ0aXRpb25OdW1iZXIgdG8gZXh0cmFjdCBhbmQgYXBwZW5kICdBZGRpdGlvbmFsSW5mbycgdG8gZmlsZW5hbWUgKHNwZWNpZmllZAorICogYnkgTW9kdWxlTmFtZSkuICovCisKKy8qIFRoZSBEZWxsIFBEaWFnIHVzZXMgdGhpcyBuZXcgbWVjaGFuaXNtIHRvIHN0YXNoIERTRVQgLnppcCBvbnRvIHRoZQorICogJ2RpYWdub3N0aWMnIHZpcnR1YWwgZGlzay4gICovCit0eXBlZGVmIGVudW0gIHsKKwlESUFHX0NBVVNFX1VOS05PV04gPSAwLAorCURJQUdfQ0FVU0VfVU5LTk9XTl9ERUJVRyA9IERJQUdfQ0FVU0VfVU5LTk9XTiArIDEsCS8qIDEgKi8KKwlESUFHX0NBVVNFX0RFQlVHID0gRElBR19DQVVTRV9VTktOT1dOX0RFQlVHICsgMSwJLyogMiAqLworCURJQUdfQ0FVU0VfVU5LTk9XTl9MT0cgPSBESUFHX0NBVVNFX0RFQlVHICsgMSwJLyogMyAqLworCURJQUdfQ0FVU0VfVFJBQ0UgPSBESUFHX0NBVVNFX1VOS05PV05fTE9HICsgMSwJLyogNCAqLworCURJQUdfQ0FVU0VfTUFOSUZFU1QgPSBESUFHX0NBVVNFX1RSQUNFICsgMSwJLyogNSAqLworCURJQUdfQ0FVU0VfT1BFUkFUSU9OU19FUlJPUiA9IERJQUdfQ0FVU0VfTUFOSUZFU1QgKyAxLAkvKiA2ICovCisJRElBR19DQVVTRV9JTlZBTElEX1JFUVVFU1QgPSBESUFHX0NBVVNFX09QRVJBVElPTlNfRVJST1IgKyAxLAkvKiA3ICovCisJRElBR19DQVVTRV9JTlRFUk5BTF9FUlJPUiA9IERJQUdfQ0FVU0VfSU5WQUxJRF9SRVFVRVNUICsgMSwgLyogOCAqLworCURJQUdfQ0FVU0VfRklMRV9YRkVSID0gRElBR19DQVVTRV9JTlRFUk5BTF9FUlJPUiArIDEsCS8qIDkgKi8KKwlESUFHX0NBVVNFX0VOVU1fRU5EID0gRElBR19DQVVTRV9GSUxFX1hGRVIJLyogOSAqLworfSBESUFHX0NBVVNFOworCisvKiBFdmVudCBDYXVzZSBjYXRlZ29yeSBkZWZpbmVkIGludG8gdGhlIGJ5dGUgMiBvZiBTZXZlcml0eSAqLworI2RlZmluZSBDQVVTRV9ERUJVRyAoRElBR19DQVVTRV9ERUJVRyA8PCBDQVVTRV9TSElGVF9BTVQpCisjZGVmaW5lIENBVVNFX1RSQUNFIChESUFHX0NBVVNFX1RSQUNFIDw8IENBVVNFX1NISUZUX0FNVCkKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1QgKERJQUdfQ0FVU0VfTUFOSUZFU1QgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX0VSUk9SIChESUFHX0NBVVNFX09QRVJBVElPTlNfRVJST1IgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1JFUVVFU1QgKERJQUdfQ0FVU0VfSU5WQUxJRF9SRVFVRVNUIDw8IENBVVNFX1NISUZUX0FNVCkKKyNkZWZpbmUgQ0FVU0VfSU5URVJOQUxfRVJST1IgKERJQUdfQ0FVU0VfSU5URVJOQUxfRVJST1IgPDwgQ0FVU0VfU0hJRlRfQU1UKQorI2RlZmluZSBDQVVTRV9GSUxFX1hGRVIgKERJQUdfQ0FVU0VfRklMRV9YRkVSIDw8IENBVVNFX1NISUZUX0FNVCkKKyNkZWZpbmUgQ0FVU0VfRU5VTV9FTkQgQ0FVU0VfRklMRV9YRkVSCisKKy8qIENvbWJpbmUgQ2F1c2UgYW5kIFNldmVyaXR5IGNhdGVnb3JpZXMgaW50byBvbmUgKi8KKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfVkVSQk9TRSBcCisJKENBVVNFX0RFQlVHIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9UUkFDRV9TRVZFUklUWV9WRVJCT1NFIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX1ZFUkJPU0UpCisjZGVmaW5lIENBVVNFX01BTklGRVNUX1NFVkVSSVRZX1ZFUkJPU0VcCisJKENBVVNFX01BTklGRVNUIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX1NFVkVSSVRZX1ZFUkJPU0UgXAorCShDQVVTRV9PUEVSQVRJT05TX0VSUk9SIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1NFVkVSSVRZX1ZFUkJPU0UgXAorCShDQVVTRV9JTlZBTElEX1JFUVVFU1QgIHwgRElBR19TRVZFUklUWV9WRVJCT1NFKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9WRVJCT1NFIFwKKwkoQ0FVU0VfSU5URVJOQUxfRVJST1IgICB8IERJQUdfU0VWRVJJVFlfVkVSQk9TRSkKKworI2RlZmluZSBDQVVTRV9ERUJVR19TRVZFUklUWV9JTkZPIFwKKwkoQ0FVU0VfREVCVUcgfCBESUFHX1NFVkVSSVRZX0lORk8pCisjZGVmaW5lIENBVVNFX1RSQUNFX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9UUkFDRSB8IERJQUdfU0VWRVJJVFlfSU5GTykKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1RfU0VWRVJJVFlfSU5GTyBcCisJKENBVVNFX01BTklGRVNUIHwgRElBR19TRVZFUklUWV9JTkZPKQorI2RlZmluZSBDQVVTRV9PUEVSQVRJT05TX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9PUEVSQVRJT05TX0VSUk9SIHwgRElBR19TRVZFUklUWV9JTkZPKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1NFVkVSSVRZX0lORk8gXAorCShDQVVTRV9JTlZBTElEX1JFUVVFU1QgIHwgRElBR19TRVZFUklUWV9JTkZPKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9JTkZPIFwKKwkoQ0FVU0VfSU5URVJOQUxfRVJST1IgfCBESUFHX1NFVkVSSVRZX0lORk8pCisKKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfV0FSTiBcCisJKENBVVNFX0RFQlVHIHwgRElBR19TRVZFUklUWV9XQVJOSU5HKQorI2RlZmluZSBDQVVTRV9UUkFDRV9TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX1dBUk5JTkcpCisjZGVmaW5lIENBVVNFX01BTklGRVNUX1NFVkVSSVRZX1dBUk4gXAorCShDQVVTRV9NQU5JRkVTVCB8IERJQUdfU0VWRVJJVFlfV0FSTklORykKKyNkZWZpbmUgQ0FVU0VfT1BFUkFUSU9OU19TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfT1BFUkFUSU9OU19FUlJPUiB8IERJQUdfU0VWRVJJVFlfV0FSTklORykKKyNkZWZpbmUgQ0FVU0VfSU5WQUxJRF9TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfSU5WQUxJRF9SRVFVRVNUIHwgRElBR19TRVZFUklUWV9XQVJOSU5HKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9XQVJOIFwKKwkoQ0FVU0VfSU5URVJOQUxfRVJST1IgfCBESUFHX1NFVkVSSVRZX1dBUk5JTkcpCisKKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfREVCVUcgfCBESUFHX1NFVkVSSVRZX0VSUikKKyNkZWZpbmUgQ0FVU0VfVFJBQ0VfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX0VSUikKKyNkZWZpbmUgQ0FVU0VfTUFOSUZFU1RfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfTUFOSUZFU1QgfCBESUFHX1NFVkVSSVRZX0VSUikKKyNkZWZpbmUgQ0FVU0VfT1BFUkFUSU9OU19TRVZFUklUWV9FUlIgXAorCShDQVVTRV9PUEVSQVRJT05TX0VSUk9SIHwgRElBR19TRVZFUklUWV9FUlIpCisjZGVmaW5lIENBVVNFX0lOVkFMSURfU0VWRVJJVFlfRVJSIFwKKwkoQ0FVU0VfSU5WQUxJRF9SRVFVRVNUICB8IERJQUdfU0VWRVJJVFlfRVJSKQorI2RlZmluZSBDQVVTRV9JTlRFUk5BTF9TRVZFUklUWV9FUlIgXAorCShDQVVTRV9JTlRFUk5BTF9FUlJPUiAgIHwgRElBR19TRVZFUklUWV9FUlIpCisKKyNkZWZpbmUgQ0FVU0VfREVCVUdfU0VWRVJJVFlfUFJJTlQgXAorCShDQVVTRV9ERUJVRyB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisjZGVmaW5lIENBVVNFX1RSQUNFX1NFVkVSSVRZX1BSSU5UIFwKKwkoQ0FVU0VfVFJBQ0UgfCBESUFHX1NFVkVSSVRZX1BSSU5UKQorI2RlZmluZSBDQVVTRV9NQU5JRkVTVF9TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX01BTklGRVNUIHwgRElBR19TRVZFUklUWV9QUklOVCkKKyNkZWZpbmUgQ0FVU0VfT1BFUkFUSU9OU19TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX09QRVJBVElPTlNfRVJST1IgfCBESUFHX1NFVkVSSVRZX1BSSU5UKQorI2RlZmluZSBDQVVTRV9JTlZBTElEX1NFVkVSSVRZX1BSSU5UIFwKKwkoQ0FVU0VfSU5WQUxJRF9SRVFVRVNUIHwgRElBR19TRVZFUklUWV9QUklOVCkKKyNkZWZpbmUgQ0FVU0VfSU5URVJOQUxfU0VWRVJJVFlfUFJJTlQgXAorCShDQVVTRV9JTlRFUk5BTF9FUlJPUiB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisjZGVmaW5lIENBVVNFX0ZJTEVfWEZFUl9TRVZFUklUWV9QUklOVCBcCisJKENBVVNFX0ZJTEVfWEZFUiB8IERJQUdfU0VWRVJJVFlfUFJJTlQpCisKKy8qIFN0cnVjdHVyZTogRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUgorICoKKyAqIFB1cnBvc2U6IENvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBtYWtlIHVwIHRoZSBoZWFkZXIgc3BlY2lmaWMgdG8gdGhlCisgKiBESUFHX0NIQU5ORUwgYXJlYS4KKyAqCisgKiBBdHRyaWJ1dGVzOgorICoKKyAqIERpYWdMb2NrOiBEaWFnIENoYW5uZWwgc3BpbmxvY2suCisgKgorICpJc0NoYW5uZWxJbml0aWFsaXplZDogMSBpZmYgU2lnbmFsSW5pdCB3YXMgY2FsbGVkIGZvciB0aGlzIGNoYW5uZWw7IG90aGVyd2lzZQorICoJCQkwLCBhbmQgYXNzdW1lIHRoZSBjaGFubmVsIGlzIG5vdCByZWFkeSBmb3IgdXNlIHlldC4KKyAqCisgKiBSZXNlcnZlZDogUGFkZGluZyB0byBhbGxpZ24gdGhlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdHVyZS4KKyAqCisgKlN1YnN5c3RlbVNldmVyaXR5RmlsdGVyOiBMZXZlbCBvZiBzZXZlcml0eSBvbiBhIHN1YnN5c3RlbSBiYXNpcyB0aGF0IGNvbnRyb2xzCisgKgkJCXdoZXRoZXIgZXZlbnRzIGFyZSBsb2dnZWQuICBBbnkgZXZlbnQncyBzZXZlcml0eSBmb3IgYQorICoJCQlwYXJ0aWN1bGFyIHN1YnN5c3RlbSBiZWxvdyB0aGlzIGxldmVsIHdpbGwgYmUgZGlzY2FyZGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBfRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUiAgeworCXZvbGF0aWxlIFUzMiBEaWFnTG9jazsKKwlVOCBJc0NoYW5uZWxJbml0aWFsaXplZDsKKwlVOCBSZXNlcnZlZFszXTsKKwlVOCBTdWJzeXN0ZW1TZXZlcml0eUZpbHRlcls2NF07Cit9IERJQUdfQ0hBTk5FTF9QUk9UT0NPTF9IRUFERVI7CisKKy8qIFRoZSBEaWFncmFtIGZvciB0aGUgRGlhZ25vc3RpYyBDaGFubmVsOiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHwgQ2hhbm5lbCBIZWFkZXIgICAgICAgIHwJRGVmaW5lZCBieSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogfCBTaWduYWwgUXVldWUgSGVhZGVyICAgfAlEZWZpbmVkIGJ5IFNJR05BTF9RVUVVRV9IRUFERVIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB8IERpYWdDaGFubmVsIEhlYWRlciAgICB8CURlZmluZWQgYnkgRElBR19DSEFOTkVMX1BST1RPQ09MX0hFQURFUiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHwgQ2hhbm5lbCBFdmVudCBJbmZvICAgIHwJRGVmaW5lZCBieSAoRElBR19DSEFOTkVMX0VWRU5UICogTUFYX0VWRU5UUykgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB8IFJlc2VydmVkICAgICAgICAgICAgICB8CVJlc2VydmVkIChwYWQgb3V0IHRvIDRNQikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE9mZnNldHMvc2l6ZXMgZm9yIGRpYWdub3N0aWMgY2hhbm5lbCBhdHRyaWJ1dGVzLi4uICovCisjZGVmaW5lIERJQUdfQ0hfUVVFVUVfSEVBREVSX09GRlNFVCAoc2l6ZW9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wpKQorI2RlZmluZSBESUFHX0NIX1FVRVVFX0hFQURFUl9TSVpFIChzaXplb2YoU0lHTkFMX1FVRVVFX0hFQURFUikpCisjZGVmaW5lIERJQUdfQ0hfUFJPVE9DT0xfSEVBREVSX09GRlNFVCBcCisJKERJQUdfQ0hfUVVFVUVfSEVBREVSX09GRlNFVCArIERJQUdfQ0hfUVVFVUVfSEVBREVSX1NJWkUpCisjZGVmaW5lIERJQUdfQ0hfUFJPVE9DT0xfSEVBREVSX1NJWkUgKHNpemVvZihESUFHX0NIQU5ORUxfUFJPVE9DT0xfSEVBREVSKSkKKyNkZWZpbmUgRElBR19DSF9FVkVOVF9PRkZTRVQgXAorCShESUFHX0NIX1BST1RPQ09MX0hFQURFUl9PRkZTRVQgKyBESUFHX0NIX1BST1RPQ09MX0hFQURFUl9TSVpFKQorI2RlZmluZSBESUFHX0NIX1NJWkUgKDQwOTYgKiAxMDI0KQorCisvKiBGb3IgQ29udHJvbCBhbmQgSWRsZSBQYXJ0aXRpb25zIHdpdGggbGFyZ2VyICg4IE1CKSBkaWFnbm9zdGljKHJvb3QpCisgKiBjaGFubmVscyAqLworI2RlZmluZSBESUFHX0NIX0xSR19TSVpFICgyICogRElBR19DSF9TSVpFKQkvKiA4IE1CICovCisKKy8qCisgKiBTdHJ1Y3R1cmU6IFVMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTAorICoKKyAqIFB1cnBvc2U6IENvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBtYWtlIHVwIHRoZSBESUFHX0NIQU5ORUwgbWVtb3J5LgorICoKKyAqIEF0dHJpYnV0ZXM6CisgKgorICogQ29tbW9uQ2hhbm5lbEhlYWRlcjoJSGVhZGVyIGluZm8gY29tbW9uIHRvIGFsbCBjaGFubmVscy4KKyAqCisgKiBRdWV1ZUhlYWRlcjogUXVldWUgaGVhZGVyIGNvbW1vbiB0byBhbGwgY2hhbm5lbHMgLSB1c2VkIHRvIGRldGVybWluZSB3aGVyZSB0bworICogc3RvcmUgZXZlbnQuCisgKgorICogRGlhZ0NoYW5uZWxIZWFkZXI6IERpYWdub3N0aWMgY2hhbm5lbCBoZWFkZXIgaW5mbyAoc2VlCisgKiBESUFHX0NIQU5ORUxfUFJPVE9DT0xfSEVBREVSIGNvbW1lbnRzKS4KKyAqCisgKiBFdmVudHM6IEFyZWEgd2hlcmUgZGlhZ25vc3RpYyBldmVudHMgKHVwIHRvIE1BWF9FVkVOVFMpIGFyZSB3cml0dGVuLgorICoKKyAqUmVzZXJ2ZWQ6IFJlc2VydmVkIGFyZWEgdG8gYWxsb3cgZm9yIGNvcnJlY3QgY2hhbm5lbCBzaXplIHBhZGRpbmcuCisqLwordHlwZWRlZiBzdHJ1Y3QgX1VMVFJBX0RJQUdfQ0hBTk5FTF9QUk9UT0NPTCAgeworCVVMVFJBX0NIQU5ORUxfUFJPVE9DT0wgQ29tbW9uQ2hhbm5lbEhlYWRlcjsKKwlTSUdOQUxfUVVFVUVfSEVBREVSIFF1ZXVlSGVhZGVyOworCURJQUdfQ0hBTk5FTF9QUk9UT0NPTF9IRUFERVIgRGlhZ0NoYW5uZWxIZWFkZXI7CisJRElBR19DSEFOTkVMX0VWRU5UIEV2ZW50c1soRElBR19DSF9TSVpFIC0gRElBR19DSF9FVkVOVF9PRkZTRVQpIC8KKwkJCQkgICBzaXplb2YoRElBR19DSEFOTkVMX0VWRU5UKV07Cit9CitVTFRSQV9ESUFHX0NIQU5ORUxfUFJPVE9DT0w7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2lvY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2lvY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTFkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvaW9jaGFubmVsLmgKQEAgLTAsMCArMSw5MzMgQEAKKy8qIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTiAqLworLyogQWxsIHJpZ2h0cyByZXNlcnZlZC4gKi8KKyNpZm5kZWYgX19JT0NIQU5ORUxfSF9fCisjZGVmaW5lIF9fSU9DSEFOTkVMX0hfXworCisvKgorKiBFdmVyeXRoaW5nIG5lZWRlZCBmb3IgSU9QYXJ0LUd1ZXN0UGFydCBjb21tdW5pY2F0aW9uIGlzIGRlZmluZSBpbgorKiB0aGlzIGZpbGUuICBOb3RlOiBFdmVyeXRoaW5nIGlzIE9TLWluZGVwZW5kZW50IGJlY2F1c2UgdGhpcyBmaWxlIGlzCisqIHVzZWQgYnkgV2luZG93cywgTGludXggYW5kIHBvc3NpYmxlIEVGSSBkcml2ZXJzLiAgKi8KKworCisvKgorKiBDb21tdW5pY2F0aW9uIGZsb3cgYmV0d2VlbiB0aGUgSU9QYXJ0IGFuZCBHdWVzdFBhcnQgdXNlcyB0aGUgY2hhbm5lbCBoZWFkZXJzCisqIGNoYW5uZWwgc3RhdGUuICBUaGUgZm9sbG93aW5nIHN0YXRlcyBhcmUgY3VycmVudGx5IGJlaW5nIHVzZWQ6CisqICAgICAgIFVOSU5JVChBbGwgWmVyb2VzKSwgQ0hBTk5FTF9BVFRBQ0hJTkcsIENIQU5ORUxfQVRUQUNIRUQsIENIQU5ORUxfT1BFTkVECisqCisqIGFkZGl0aW9uYWwgc3RhdGVzIHdpbGwgYmUgdXNlZCBsYXRlci4gIE5vIGxvY2tpbmcgaXMgbmVlZGVkIHRvIHN3aXRjaCBiZXR3ZWVuCisqIHN0YXRlcyBkdWUgdG8gdGhlIGZvbGxvd2luZyBydWxlczoKKyoKKyogICAgICAxLiAgSU9QYXJ0IGlzIG9ubHkgdGhlIG9ubHkgcGFydGl0aW9uIGFsbG93ZWQgdG8gY2hhbmdlIGZyb20gVU5JVAorKiAgICAgIDIuICBJT1BhcnQgaXMgb25seSB0aGUgb25seSBwYXJ0aXRpb24gYWxsb3dlZCB0byBjaGFuZ2UgZnJvbQorKgkJQ0hBTk5FTF9BVFRBQ0hJTkcKKyogICAgICAzLiAgR3Vlc3RQYXJ0IGlzIG9ubHkgdGhlIG9ubHkgcGFydGl0aW9uIGFsbG93ZWQgdG8gY2hhbmdlIGZyb20KKyoJCUNIQU5ORUxfQVRUQUNIRUQKKyoKKyogVGhlIHN0YXRlIGNoYW5nZXMgYXJlIHRoZSBmb2xsb3dpbmc6IElPUGFydCBzZWVzIHRoZSBjaGFubmVsIGlzIGluIFVOSU5JVCwKKyogICAgICAgIFVOSU5JVCAtPiBDSEFOTkVMX0FUVEFDSElORyAocGVyZm9ybWVkIG9ubHkgYnkgSU9QYXJ0KQorKiAgICAgICAgQ0hBTk5FTF9BVFRBQ0hJTkcgLT4gQ0hBTk5FTF9BVFRBQ0hFRCAocGVyZm9ybWVkIG9ubHkgYnkgSU9QYXJ0KQorKiAgICAgICAgQ0hBTk5FTF9BVFRBQ0hFRCAtPiBDSEFOTkVMX09QRU5FRCAocGVyZm9ybWVkIG9ubHkgYnkgR3Vlc3RQYXJ0KQorKi8KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisjaW5jbHVkZSAidm1jYWxsaW50ZXJmYWNlLmgiCisKKyNkZWZpbmUgX1VMVFJBX0NPTlRST0xWTV9DSEFOTkVMX0lOTElORV8KKyNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCisjdW5kZWYgX1VMVFJBX0NPTlRST0xWTV9DSEFOTkVMX0lOTElORV8KKyNpbmNsdWRlICJjaGFubmVsLmgiCisKKy8qCisgKiBDSEFOTkVMIEd1aWRzCisgKi8KKworI2luY2x1ZGUgImNoYW5uZWxfZ3VpZC5oIgorCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUKKyNkZWZpbmUgVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQorI2RlZmluZSBVTFRSQV9WU1dJVENIX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFwKKwlVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQorCisvKiBNdXN0IGluY3JlbWVudCB0aGVzZSB3aGVuZXZlciB5b3UgaW5zZXJ0IG9yIGRlbGV0ZSBmaWVsZHMgd2l0aGluIHRoaXMgY2hhbm5lbAorKiBzdHJ1Y3QuICBBbHNvIGluY3JlbWVudCB3aGVuZXZlciB5b3UgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGZpZWxkcyB3aXRoaW4gdGhpcworKiBjaGFubmVsIHN0cnVjdCBzbyBhcyB0byBicmVhayBwcmUtZXhpc3Rpbmcgc29mdHdhcmUuICBOb3RlIHRoYXQgeW91IGNhbgorKiB1c3VhbGx5IGFkZCBmaWVsZHMgdG8gdGhlIEVORCBvZiB0aGUgY2hhbm5lbCBzdHJ1Y3Qgd2l0aE9VVCBuZWVkaW5nIHRvCisqIGluY3JlbWVudCB0aGlzLiAqLworI2RlZmluZSBVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklEIDIKKyNkZWZpbmUgVUxUUkFfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCAyCisjZGVmaW5lIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQgMQorCisjZGVmaW5lIFVMVFJBX1ZIQkFfQ0hBTk5FTF9PS19DTElFTlQocENoYW5uZWwsIGxvZ0N0eCkJCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLCBVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLCBcCisJCQkJICAgICJ2aGJhIiwgTUlOX0lPX0NIQU5ORUxfU0laRSwJXAorCQkJCSAgICBVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklELCBcCisJCQkJICAgIFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsIFwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBVTFRSQV9WSEJBX0NIQU5ORUxfT0tfU0VSVkVSKGFjdHVhbEJ5dGVzLCBsb2dDdHgpCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZoYmEiLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLCBhY3R1YWxCeXRlcywgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZOSUNfQ0hBTk5FTF9PS19DTElFTlQocENoYW5uZWwsIGxvZ0N0eCkJCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLCBVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkLCBcCisJCQkJICAgICJ2bmljIiwgTUlOX0lPX0NIQU5ORUxfU0laRSwJXAorCQkJCSAgICBVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVkVSU0lPTklELCBcCisJCQkJICAgIFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsIFwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorI2RlZmluZSBVTFRSQV9WTklDX0NIQU5ORUxfT0tfU0VSVkVSKGFjdHVhbEJ5dGVzLCBsb2dDdHgpCQlcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZuaWMiLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLCBhY3R1YWxCeXRlcywgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9PS19DTElFTlQocENoYW5uZWwsIGxvZ0N0eCkJCVwKKwkoVUxUUkFfY2hlY2tfY2hhbm5lbF9jbGllbnQocENoYW5uZWwsIFVsdHJhVnN3aXRjaENoYW5uZWxQcm90b2NvbEd1aWQsIFwKKwkJCQkgICAgInZzd2l0Y2giLCBNSU5fSU9fQ0hBTk5FTF9TSVpFLAlcCisJCQkJICAgIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsIFwKKwkJCQkgICAgVUxUUkFfVlNXSVRDSF9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisjZGVmaW5lIFVMVFJBX1ZTV0lUQ0hfQ0hBTk5FTF9PS19TRVJWRVIoYWN0dWFsQnl0ZXMsIGxvZ0N0eCkgICAgICAgICAgXAorCShVTFRSQV9jaGVja19jaGFubmVsX3NlcnZlcihVbHRyYVZzd2l0Y2hDaGFubmVsUHJvdG9jb2xHdWlkLAlcCisJCQkJICAgICJ2c3dpdGNoIiwgTUlOX0lPX0NIQU5ORUxfU0laRSwJXAorCQkJCSAgICBhY3R1YWxCeXRlcywJCSAgICBcCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nQ3R4KSkKKy8qCisqIEV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGhhbmRsZSBTQ1NJICYgTklDIHRyYWZmaWMgYmV0d2VlbiBHdWVzdCBQYXJ0aXRpb24gYW5kCisqIElPIFBhcnRpdGlvbiBpcyBkZWZpbmVkIGJlbG93LiAgKi8KKworCisvKgorKiBEZWZpbmVzIGFuZCBlbnVtcy4KKyovCisKKyNkZWZpbmUgTUlOTlVNKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUFYTlVNKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworLyogdGhlc2UgZGVmaW5lIHRoZSB0d28gcXVldWVzIHBlciBkYXRhIGNoYW5uZWwgYmV0d2VlbiBpb3BhcnQgYW5kCisgKiBpb2d1ZXN0cGFydHMgKi8KKyNkZWZpbmUgSU9DSEFOX1RPX0lPUEFSVCAwIC8qIHVzZWQgYnkgaW9ndWVzdHBhcnQgdG8gJ2luc2VydCcgc2lnbmFscyB0bworCQkJICAgICogaW9wYXJ0ICovCisjZGVmaW5lIElPQ0hBTl9GUk9NX0dVRVNUUEFSVCAwIC8qIHVzZWQgYnkgaW9wYXJ0IHRvICdyZW1vdmUnIHNpZ25hbHMgZnJvbQorCQkJCSAqIGlvZ3Vlc3RwYXJ0IC0gc2FtZSBxdWV1ZSBhcyBwcmV2aW91cyBxdWV1ZSAqLworCisjZGVmaW5lIElPQ0hBTl9UT19HVUVTVFBBUlQgMSAvKiB1c2VkIGJ5IGlvcGFydCB0byAnaW5zZXJ0JyBzaWduYWxzIHRvCisJCQkgICAgICAgKiBpb2d1ZXN0cGFydCAqLworI2RlZmluZSBJT0NIQU5fRlJPTV9JT1BBUlQgMSAvKiB1c2VkIGJ5IGlvZ3Vlc3RwYXJ0IHRvICdyZW1vdmUnIHNpZ25hbHMgZnJvbQorCQkJICAgICAgKiBpb3BhcnQgLSBzYW1lIHF1ZXVlIGFzIHByZXZpb3VzIHF1ZXVlICovCisKKy8qIHRoZXNlIGRlZmluZSB0aGUgdHdvIHF1ZXVlcyBwZXIgY29udHJvbCBjaGFubmVsIGJldHdlZW4gY29udHJvbHBhcnQgYW5kICJpdHMiCisgKiBndWVzdHMsIHdoaWNoIGluY2x1ZGVzIHRoZSBpb3BhcnQgICovCisjZGVmaW5lIENUUkxDSEFOX1RPX0NUUkxHVUVTVFBBUlQgMCAvKiB1c2VkIGJ5IGN0cmxndWVzdHBhcnQgdG8gJ2luc2VydCcgc2lnbmFscworCQkJCSAgICAgKiB0byBjdHJscGFydCAqLworI2RlZmluZSBDVExSQ0hBTl9GUk9NX0NUUkxQQVJUIDAgLyogdXNlZCBieSBjdHJscGFydCB0byAncmVtb3ZlJyBzaWduYWxzIGZyb20KKwkJCQkgICogY3RybHF1ZXN0cGFydCAtIHNhbWUgcXVldWUgYXMgcHJldmlvdXMKKwkJCQkgICogcXVldWUgKi8KKworI2RlZmluZSBDVFJMQ0hBTl9UT19DVFJMUEFSVCAxIC8qIHVzZWQgYnkgY3RybHBhcnQgdG8gJ2luc2VydCcgc2lnbmFscyB0bworCQkJCSogY3RybGd1ZXN0cGFydCAqLworI2RlZmluZSBDVFJMQ0hBTl9GUk9NX0NUUkxHVUVTVFBBUlQgMSAvKiB1c2VkIGJ5IGN0cmd1ZXN0cGFydCB0byAncmVtb3ZlJworCQkJCSAgICAgICAqIHNpZ25hbHMgZnJvbSBjdHJscGFydCAtIHNhbWUgcXVldWUgYXMKKwkJCQkgICAgICAgKiBwcmV2aW91cyBxdWV1ZSAqLworCisvKiB0aGVzZSBkZWZpbmUgdGhlIEV2ZW50ICYgQWNrIHF1ZXVlcyBwZXIgY29udHJvbCBjaGFubmVsIEV2ZW50cyBhcmUgZ2VuZXJhdGVkCisqIGJ5IENUUkxHVUVTVFBBUlQgYW5kIHNlbnQgdG8gQ1RSTFBBUlQ7IEFja3MgYXJlIGdlbmVyYXRlZCBieSBDVFJMUEFSVCBhbmQgc2VudAorKiB0byBDVFJMR1VFU1RQQVJULiAqLworI2RlZmluZSBDVFJMQ0hBTl9FVkVOVF9UT19DVFJMUEFSVCAyIC8qIHVzZWQgYnkgY3RybGd1ZXN0cGFydCB0byAnaW5zZXJ0JyBFdmVudHMKKwkJCQkgICAgICAqIHRvIGN0cmxwYXJ0ICovCisjZGVmaW5lIENUUkxDSEFOX0VWRU5UX0ZST01fQ1RSTEdVRVNUUEFSVCAyIC8qIHVzZWQgYnkgY3RybHBhcnQgdG8gJ3JlbW92ZScKKwkJCQkJICAgICAqIEV2ZW50cyBmcm9tIGN0cmxndWVzdHBhcnQgKi8KKworI2RlZmluZSBDVFJMQ0hBTl9BQ0tfVE9fQ1RSTEdVRVNUUEFSVCAzCS8qIHVzZWQgYnkgY3RybHBhcnQgdG8gJ2luc2VydCcgQWNrcyB0bworCQkJCQkgKiBjdHJsZ3Vlc3RwYXJ0ICovCisjZGVmaW5lIENUUkxDSEFOX0FDS19GUk9NX0NUUkxQQVJUIDMgLyogdXNlZCBieSBjdHJsZ3Vlc3RwYXJ0IHRvICdyZW1vdmUnIEV2ZW50cworCQkJCSAgICAgICogZnJvbSBjdHJscGFydCAqLworCisvKiBzaXplIG9mIGNkYiAtIGkuZS4sIHNjc2kgY21uZCAqLworI2RlZmluZSBNQVhfQ01ORF9TSVpFIDE2CisKKyNkZWZpbmUgTUFYX1NFTlNFX1NJWkUgNjQKKworI2RlZmluZSBNQVhfUEhZU19JTkZPIDY0CisKKy8qIEJlY2F1c2UgR3Vlc3RUb0d1ZXN0Q29weSBpcyBsaW1pdGVkIHRvIDRLaUIgc2VnbWVudHMsIGFuZCB3ZSBoYXZlIGxpbWl0ZWQgdGhlCisqIEVtdWxleCBEcml2ZXIgdG8gMjU2IHNjYXR0ZXIgbGlzdCBzZWdtZW50cyB2aWEgdGhlIGxwZmNfc2dfc2VnX2NudCBwYXJhbWV0ZXIKKyogdG8gMjU2LCB0aGUgbWF4aW11bSBJL08gc2l6ZSBpcyBsaW1pdGVkIHRvIDI1NiAqIDQgS2lCID0gMSBNQiAqLworI2RlZmluZSBNQVhfSU9fU0laRSAgICgxMDI0KjEwMjQpCS8qIDEgTUIgKi8KKworLyogTk9URSAxOiBscGZjIGRlZmluZXMgaXRzIHN1cHBvcnQgZm9yIHNlZ21lbnRzIGluCisqICNkZWZpbmUgTFBGQ19TR19TRUdfQ05UIDY0CisqCisqIE5PVEUgMjogSW4gTGludXgsIGZyYWdzIGFycmF5IGluIHNrYiBpcyBjdXJyZW50bHkgYWxsb2NhdGVkIHRvIGJlCisqIE1BWF9TS0JfRlJBR1Mgc2l6ZSwgd2hpY2ggaXMgMTggd2hpY2ggaXMgc21hbGxlciB0aGFuIE1BWF9QSFlTX0lORk8gZm9yCisqIG5vdy4gICovCisKKyNpZm5kZWYgTUFYX1NFUklBTF9OVU0KKyNkZWZpbmUgTUFYX1NFUklBTF9OVU0JCTMyCisjZW5kaWYJCQkJLyogTUFYX1NFUklBTF9OVU0gKi8KKworI2RlZmluZSBNQVhfU0NTSV9CVVNFUwkJMQorI2RlZmluZSBNQVhfU0NTSV9UQVJHRVRTCTgKKyNkZWZpbmUgTUFYX1NDU0lfTFVOUwkJMTYKKyNkZWZpbmUgTUFYX1NDU0lfRlJPTV9IT1NUCTB4RkZGRkZGRkYJLyogSW5kaWNhdG9yIHRvIHVzZSBQaHlzaWNhbCBIQkEKKwkJCQkJCSAqIFNDU0kgSG9zdCB2YWx1ZSAqLworCisvKiB2YXJpb3VzIHR5cGVzIG9mIG5ldHdvcmsgcGFja2V0cyB0aGF0IGNhbiBiZSBzZW50IGluIGNtZHJzcCAqLwordHlwZWRlZiBlbnVtIHsgTkVUX1JDVl9QT1NUID0gMCwJLyogc3VibWl0IGJ1ZmZlciB0byBob2xkIHJlY2VpdmluZworCQkJCQkgKiBpbmNvbWluZyBwYWNrZXQgKi8KKwkvKiB2aXJ0bmljIC0+IHVpc25pYyAqLworCU5FVF9SQ1YsCQkvKiBpbmNvbWluZyBwYWNrZXQgcmVjZWl2ZWQgKi8KKwkvKiB1aXNuaWMgLT4gdmlydHBjaSAqLworCU5FVF9YTUlULAkJLyogZm9yIG91dGdvaW5nIG5ldCBwYWNrZXRzICAgICAgKi8KKwkvKiB2aXJ0bmljIC0+IHVpc25pYyAqLworCU5FVF9YTUlUX0RPTkUsCQkvKiBvdXRnb2luZyBwYWNrZXQgeG1pdHRlZCAqLworCS8qIHVpc25pYyAtPiB2aXJ0cGNpICovCisJTkVUX1JDVl9FTkJESVMsCQkvKiBlbmFibGUvZGlzYWJsZSBwYWNrZXQgcmVjZXB0aW9uICovCisJLyogdmlydG5pYyAtPiB1aXNuaWMgKi8KKwlORVRfUkNWX0VOQkRJU19BQ0ssCS8qIGFja25vd2xlZGdlIGVuYWJsZS9kaXNhYmxlIHBhY2tldAorCQkJCSAqIHJlY2VwdGlvbiAqLworCS8qIHVpc25pYyAtPiB2aXJ0bmljICovCisJTkVUX1JDVl9QUk9NSVNDLAkvKiBlbmFibGUvZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJLyogdmlydG5pYyAtPiB1aXNuaWMgKi8KKwlORVRfQ09OTkVDVF9TVEFUVVMsCS8qIGluZGljYXRlIHRoZSBsb3NzIG9yIHJlc3RvcmF0aW9uIG9mIGEgbmV0d29yaworCQkJCSAqIGNvbm5lY3Rpb24gKi8KKwkvKiB1aXNuaWMgLT4gdmlydG5pYyAqLworCU5FVF9NQUNBRERSLAkJLyogaW5kaWNhdGVzIHRoZSBjbGllbnQgaGFzIHJlcXVlc3RlZCB0byB1cGRhdGUKKwkJCQkgKiBpdHMgTUFDIGFkZHIgKi8KKwlORVRfTUFDQUREUl9BQ0ssCS8qIE1hYyBhZGRyZXMgICovCisKK30gTkVUX1RZUEVTOworCisjZGVmaW5lCQlFVEhfSEVBREVSX1NJWkUgMTQJLyogc2l6ZSBvZiBldGhlcm5ldCBoZWFkZXIgKi8KKworI2RlZmluZQkJRVRIX01JTl9EQVRBX1NJWkUgNDYJLyogbWluaW11bSBldGggZGF0YSBzaXplICovCisjZGVmaW5lCQlFVEhfTUlOX1BBQ0tFVF9TSVpFIChFVEhfSEVBREVSX1NJWkUgKyBFVEhfTUlOX0RBVEFfU0laRSkKKworI2RlZmluZSAgICAgRVRIX0RFRl9EQVRBX1NJWkUgMTUwMAkvKiBkZWZhdWx0IGRhdGEgc2l6ZSAqLworI2RlZmluZSAgICAgRVRIX0RFRl9QQUNLRVRfU0laRSAoRVRIX0hFQURFUl9TSVpFICsgRVRIX0RFRl9EQVRBX1NJWkUpCisKKyNkZWZpbmUJCUVUSF9NQVhfTVRVIDE2Mzg0CS8qIG1heGltdW0gZGF0YSBzaXplICovCisKKyNpZm5kZWYgTUFYX01BQ0FERFJfTEVOCisjZGVmaW5lIE1BWF9NQUNBRERSX0xFTiA2CS8qIG51bWJlciBvZiBieXRlcyBpbiBNQUMgYWRkcmVzcyAqLworI2VuZGlmCQkJCS8qIE1BWF9NQUNBRERSX0xFTiAqLworCisjZGVmaW5lIEVUSF9JU19MT0NBTExZX0FETUlOSVNURVJFRChBZGRyZXNzKSBcCisJKCgoVTggKikgKEFkZHJlc3MpKVswXSAmICgoVTgpIDB4MDIpKQorI2RlZmluZSBOSUNfVkVORE9SX0lEIDB4MDAwODAwMEIKKworLyogdmFyaW91cyB0eXBlcyBvZiBzY3NpIHRhc2sgbWdtdCBjb21tYW5kcyAgKi8KK3R5cGVkZWYgZW51bSB7IFRBU0tfTUdNVF9BQk9SVF9UQVNLID0KKwkgICAgMSwgVEFTS19NR01UX0JVU19SRVNFVCwgVEFTS19NR01UX0xVTl9SRVNFVCwKKwkgICAgVEFTS19NR01UX1RBUkdFVF9SRVNFVCwKK30gVEFTS19NR01UX1RZUEVTOworCisvKiB2YXJpb3VzIHR5cGVzIG9mIHZkaXNrIG1nbXQgY29tbWFuZHMgICovCit0eXBlZGVmIGVudW0geyBWRElTS19NR01UX0FDUVVJUkUgPSAxLCBWRElTS19NR01UX1JFTEVBU0UsCit9IFZESVNLX01HTVRfVFlQRVM7CisKKy8qIHRoaXMgaXMgdXNlZCBpbiB0aGUgdmRlc3QgZmllbGQgICovCisjZGVmaW5lIFZERVNUX0FMTCAweEZGRkYKKworI2RlZmluZSBNSU5fTlVNU0lHTkFMUyA2NAorI2RlZmluZSBNQVhfTlVNU0lHTkFMUyA0MDk2CisKKy8qIE1BWF9ORVRfUkNWX0JVRiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByY3YgYnVmZmVycyB0aGF0IGFyZSBjcmVhdGVkIGJ5IGVhY2gKKyogZ3Vlc3QncyB2aXJ0bmljIGFuZCBwb3N0ZWQgdG8gdWlzbmljLiAgVWlzbmljLCBmb3IgZWFjaCBjaGFubmVsLCBrZWVwcyB0aGUgcmN2CisqIGJ1ZmZlcnMgcG9zdGVkIGFuZCB1c2VzIHRoZW0gdG8gcmVjZWl2ZSBkYXRhIG9uIGJlaGFsZiBvZiB0aGUgZ3Vlc3QncyB2aXJ0bmljLgorKiBOT1RFOiB0aGUgbnVtX3Jjdl9idWZzIGlzIGNvbmZpZ3VyYWJsZSBmb3IgZWFjaCBWTklDLiBTbyB0aGUgZm9sbG93aW5nIGlzCisqIHNpbXBseSBhbiB1cHBlcmxpbWl0IG9uIHdoYXQgZWFjaCBWTklDIGNhbiBwcm92aWRlLiAgU2V0dGluZyBpdCB0byBoYWxmIG9mIHRoZQorKiBOVU1TSUdOQUxTIHRvIHByZXZlbnQgcXVldWUgZnVsbCBkZWFkbG9ja3MgKi8KKyNkZWZpbmUgTUFYX05FVF9SQ1ZfQlVGUyAoTUlOX05VTVNJR05BTFMgLyAyKQorCisvKgorICogc3RydWN0cyB3aXRoIHByYWdtYSBwYWNrICAqLworCisKKy8qIC8vLy8vLy8vLy8vLy8gQkVHSU4gUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vLy8vLy8vLy8vLy8gT05MWSBTVFJVQ1QgVFlQRSBTSE9VTEQgQkUgQkVMT1cgKi8KKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisKK3N0cnVjdCBndWVzdF9waHlzX2luZm8geworCVU2NCBhZGRyZXNzOworCVU2NCBsZW5ndGg7Cit9OworCisjZGVmaW5lIEdQSV9FTlRSSUVTX1BFUl9QQUdFIChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGd1ZXN0X3BoeXNfaW5mbykpCisKK3N0cnVjdCB1aXNzY3NpX2Rlc3QgeworCVUzMiBjaGFubmVsOwkJLyogY2hhbm5lbCA9PSBidXMgbnVtYmVyICovCisJVTMyIGlkOwkJCS8qIGlkID09IHRhcmdldCBudW1iZXIgKi8KKwlVMzIgbHVuOwkJLyogbHVuID09IGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KK307CisKK3N0cnVjdCB2aGJhX3d3bm4geworCVUzMiB3d25uMTsKKwlVMzIgd3dubjI7Cit9OworCisvKiBXQVJOSU5HOiBWYWx1ZXMgc3RpcmVkIGluIHRoaXMgc3RydWN0dXJlIG11c3QgY29udGFpbiBtYXhpbXVtIGNvdW50cyAobm90CisgKiBtYXhpbXVtIHZhbHVlcykuICovCitzdHJ1Y3QgdmhiYV9jb25maWdfbWF4IHsJLyogMjAgYnl0ZXMgKi8KKwlVMzIgbWF4X2NoYW5uZWw7CS8qIG1heGltdW0gY2hhbm5lbCBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGlzCisJCQkJICogYnVzICovCisJVTMyIG1heF9pZDsJCS8qIG1heGltdW0gU0NTSSBJRCBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGlzCisJCQkJICogYnVzICovCisJVTMyIG1heF9sdW47CQkvKiBtYXhpbXVtIFNDU0kgTFVOIGZvciBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoaXMKKwkJCQkgKiBidXMgKi8KKwlVMzIgY21kX3Blcl9sdW47CS8qIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIGNvbW1hbmRzIHBlcgorCQkJCSAqIGx1biB0aGF0IGFyZSBhbGxvd2VkIGF0IG9uZSB0aW1lICovCisJVTMyIG1heF9pb19zaXplOwkvKiBtYXhpbXVtIGlvIHNpemUgZm9yIGRldmljZXMgYXR0YWNoZWQgdG8gdGhpcworCQkJCSAqIGJ1cyAqLworCS8qIG1heCBpbyBzaXplIGlzIG9mdGVuIGRldGVybWluZWQgYnkgdGhlIHJlc291cmNlIG9mIHRoZSBoYmEuIGUuZyAqLworCS8qIG1heCBzY2F0dGVyIGdhdGhlciBsaXN0IGxlbmd0aCAqIHBhZ2Ugc2l6ZSAvIHNlY3RvciBzaXplICovCit9OworCitzdHJ1Y3QgdWlzY21kcnNwX3Njc2kgeworCXZvaWQgKnNjc2ljbWQ7CQkvKiB0aGUgaGFuZGxlIHRvIHRoZSBjbWQgdGhhdCB3YXMgcmVjZWl2ZWQgLQorCQkJCSAqIHNlbmQgaXQgYmFjayBhcyBpcyBpbiB0aGUgcnNwIHBhY2tldC4gICovCisJVTggY21uZFtNQVhfQ01ORF9TSVpFXTsJLyogdGhlIGNkYiBmb3IgdGhlIGNvbW1hbmQgKi8KKwlVMzIgYnVmZmxlbjsJCS8qIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIG91dCBvciBpbiAqLworCVUxNiBndWVzdF9waHlzX2VudHJpZXM7CS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHNjYXR0ZXItZ2F0aGVyIChzZykKKwkJCQkgKiBsaXN0ICovCisJc3RydWN0IGd1ZXN0X3BoeXNfaW5mbyBncGlfbGlzdFtNQVhfUEhZU19JTkZPXTsJLyogcGh5c2ljYWwgYWRkcmVzcworCQkJCQkJCSAqIGluZm9ybWF0aW9uIGZvciBlYWNoCisJCQkJCQkJICogZnJhZ21lbnQgKi8KKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiAgZGF0YV9kaXI7IC8qIGRpcmVjdGlvbiBvZiB0aGUgZGF0YSwgaWYgYW55ICovCisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsJLyogaWRlbnRpZmllcyB0aGUgdmlydHVhbCBoYmEsIGlkLAorCQkJCQkgKiBjaGFubmVsLCBsdW4gdG8gd2hpY2ggY21kIHdhcyBzZW50ICovCisKKwkgICAgLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5lZWRlZCB0byBxdWV1ZSB0aGUgcnNwIGJhY2sgdG8gY21kCisJICAgICAqIG9yaWdpbmF0b3IgKi8KKwlpbnQgbGludXhzdGF0OwkJLyogdGhlIG9yaWdpbmFsIExpbnV4IHN0YXR1cyAtIGZvciB1c2UgYnkgbGludXgKKwkJCQkgKiB2ZGlzayBjb2RlICovCisJVTggc2NzaXN0YXQ7CQkvKiB0aGUgc2NzaSBzdGF0dXMgKi8KKwlVOCBhZGRsc3RhdDsJCS8qIG5vbi1zY3NpIHN0YXR1cyAtIGNvdmVycyBjYXNlcyBsaWtlIHRpbWVvdXQKKwkJCQkgKiBuZWVkZWQgYnkgd2luZG93cyBndWVzdHMgKi8KKyNkZWZpbmUgQURETF9SRVNFVAkJMQorI2RlZmluZSBBRERMX1RJTUVPVVQJCTIKKyNkZWZpbmUgQURETF9JTlRFUk5BTF9FUlJPUgkzCisjZGVmaW5lIEFERExfU0VMX1RJTUVPVVQJNAorI2RlZmluZSBBRERMX0NNRF9USU1FT1VUCTUKKyNkZWZpbmUgQURETF9CQURfVEFSR0VUCQk2CisjZGVmaW5lIEFERExfUkVUUlkJCTcKKworCS8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBuZWVkIHRvIGRldGVybWluZSB0aGUgcmVzdWx0IG9mIGNvbW1hbmQgKi8KKwkgVTggc2Vuc2VidWZbTUFYX1NFTlNFX1NJWkVdOwkvKiBzZW5zZSBpbmZvIGluIGNhc2UgY21kIGZhaWxlZDsgKi8KKwkvKiBpdCBob2xkcyB0aGUgc2Vuc2VfZGF0YSBzdHJ1Y3Q7ICovCisJLyogc2VlIHRoYXQgc3RydWN0IGZvciBkZXRhaWxzLiAqLworCXZvaWQgKnZkaXNrOyAvKiBjb250YWlucyBwb2ludGVyIHRvIHRoZSB2ZGlzayBzbyB0aGF0IHdlIGNhbiBjbGVhbiB1cAorCQkgICAgICAqIHdoZW4gdGhlIElPIGNvbXBsZXRlcy4gKi8KKwlpbnQgbm9fZGlza19yZXN1bHQ7CS8qIHVzZWQgdG8gcmV0dXJuIG5vIGRpc2sgaW5xdWlyeSByZXN1bHQgKi8KKwkvKiB3aGVuIG5vX2Rpc2tfcmVzdWx0IGlzIHNldCB0byAxLCAgKi8KKwkvKiBzY3NpLnNjc2lzdGF0IGlzIFNBTV9TVEFUX0dPT0QgKi8KKwkvKiBzY3NpLmFkZGxzdGF0IGlzIDAgKi8KKwkvKiBzY3NpLmxpbnV4c3RhdCBpcyBTQU1fU1RBVF9HT09EICovCisJLyogVGhhdCBpcywgdGhlcmUgaXMgTk8gZXJyb3IuICovCit9OworCisvKgorKiBEZWZpbmVzIHRvIHN1cHBvcnQgc2VuZGluZyBjb3JyZWN0IGlucXVpcnkgcmVzdWx0IHdoZW4gbm8gZGlzayBpcworKiBjb25maWd1cmVkLiAgKi8KKworLyogRnJvbSBTQ1NJIFNQQzIgLQorICoKKyAqIElmIHRoZSB0YXJnZXQgaXMgbm90IGNhcGFibGUgb2Ygc3VwcG9ydGluZyBhIGRldmljZSBvbiB0aGlzIGxvZ2ljYWwgdW5pdCwgdGhlCisgKiBkZXZpY2Ugc2VydmVyIHNoYWxsIHNldCB0aGlzIGZpZWxkIHRvIDdGaCAoUEVSSVBIRVJBTCBRVUFMSUZJRVIgc2V0IHRvIDAxMWIKKyAqIGFuZCBQRVJJUEhFUkFMIERFVklDRSBUWVBFIHNldCB0byAxRmgpLgorICoKKyAqVGhlIGRldmljZSBzZXJ2ZXIgaXMgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBzcGVjaWZpZWQgcGVyaXBoZXJhbCBkZXZpY2UKKyAqdHlwZSBvbiB0aGlzIGxvZ2ljYWwgdW5pdC4gSG93ZXZlciwgdGhlIHBoeXNpY2FsIGRldmljZSBpcyBub3QgY3VycmVudGx5CisgKmNvbm5lY3RlZCB0byB0aGlzIGxvZ2ljYWwgdW5pdC4KKyAqLworCisjZGVmaW5lIERFVl9OT1RfUFJFU0VOVCAweDdmCS8qIG9sZCBuYW1lIC0gY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBERVZfTk9UX0NBUEFCTEUgMHg3ZgkvKiBwZXJpcGhlcmFsIHF1YWxpZmllciBvZiAweDMgICovCisgICAgLyogcGVyaXBoZXJhbCB0eXBlIG9mIDB4MWYgKi8KKyAgICAvKiBzcGVjaWZpZXMgbm8gZGV2aWNlIGJ1dCB0YXJnZXQgcHJlc2VudCAqLworCisjZGVmaW5lIERFVl9ESVNLX0NBUEFCTEVfTk9UX1BSRVNFTlQgMHgyMCAvKiBwZXJpcGhlcmFsIHF1YWxpZmllciBvZiAweDEgKi8KKyAgICAvKiBwZXJpcGhlcmFsIHR5cGUgb2YgMCAtIGRpc2sgKi8KKyAgICAvKiBzcGVjaWZpZXMgZGV2aWNlIGNhcGFibGUsIGJ1dCBub3QgcHJlc2VudCAqLworCisjZGVmaW5lIERFVl9QUk9DX0NBUEFCTEVfTk9UX1BSRVNFTlQgMHgyMyAvKiBwZXJpcGhlcmFsIHF1YWxpZmllciBvZiAweDEgKi8KKyAgICAvKiBwZXJpcGhlcmFsIHR5cGUgb2YgMyAtIHByb2Nlc3NvciAqLworICAgIC8qIHNwZWNpZmllcyBkZXZpY2UgY2FwYWJsZSwgYnV0IG5vdCBwcmVzZW50ICovCisKKyNkZWZpbmUgREVWX0hJU1VQUE9SVCAweDEwOwkvKiBIaVN1cCA9IDE7IHNob3dzIHN1cHBvcnQgZm9yIHJlcG9ydCBsdW5zICovCisgICAgLyogbXVzdCBiZSByZXR1cm5lZCBmb3IgbHVuIDAuICovCisKKy8qIE5PVEU6IExpbnV4IGNvZGUgYXNzdW1lcyBpbnF1aXJ5IGNvbnRhaW5zIDM2IGJ5dGVzLiBXaXRob3V0IGNoZWNraW5nIGxlbmd0aAorKiBpbiBidWZbNF0gc29tZSBsaW51eCBjb2RlIGFjY2Vzc2VzIGJ5dGVzIGJleW9uZCA1IHRvIHJldHJpZXZlIHZlbmRvciwgcHJvZHVjdAorKiAmIHJldmlzaW9uLiAgWWlrZXMhIFNvIGxldCB1cyBhbHdheXMgc2VuZCBiYWNrIDM2IGJ5dGVzLCB0aGUgbWluaW11bSBmb3IKKyogaW5xdWlyeSByZXN1bHQuICovCisjZGVmaW5lIE5PX0RJU0tfSU5RVUlSWV9SRVNVTFRfTEVOIDM2CisKKyNkZWZpbmUgTUlOX0lOUVVJUllfUkVTVUxUX0xFTiA1IC8qIHdlIG5lZWQgYXQgbGVhc3QgNSBieXRlcyBtaW5pbXVtIGZvciBpbnF1aXJ5CisJCQkJICAqIHJlc3VsdCAqLworCisvKiBTQ1NJIGRldmljZSB2ZXJzaW9uIGZvciBubyBkaXNrIGlucXVpcnkgcmVzdWx0ICovCisjZGVmaW5lIFNDU0lfU1BDMl9WRVIgNAkJLyogaW5kaWNhdGVzIFNDU0kgU1BDMiAoU1BDMyBpcyA1KSAqLworCisvKiBXaW5kb3dzIGFuZCBMaW51eCB3YW50IGRpZmZlcmVudCB0aGluZ3MgZm9yIGEgbm9uLWV4aXN0ZW50IGx1bi4gU28sIHdlJ2xsIGxldAorICogY2FsbGVyIHBhc3MgaW4gdGhlIHBlcmlwaGVyYWwgcXVhbGlmaWVyIGFuZCB0eXBlLgorICogTk9URTpbNF0gU0NTSSByZXR1cm5zIChuLTQpOyBzbyB3ZSByZXR1cm4gbGVuZ3RoLTEtNCBvciBsZW5ndGgtNS4gKi8KKworI2RlZmluZSBTRVRfTk9fRElTS19JTlFVSVJZX1JFU1VMVChidWYsIGxlbiwgbHVuLCBsdW4wbm90cHJlc2VudCwgbm90cHJlc2VudCkgXAorCWRvIHsJCQkJCQkJCVwKKwkJTUVNU0VUKGJ1ZiwgMCwJCQkJCQlcCisJCSAgICAgICBNSU5OVU0obGVuLAkJCQkJXAorCQkJICAgICAgKHVuc2lnbmVkIGludCkgTk9fRElTS19JTlFVSVJZX1JFU1VMVF9MRU4pKTsgXAorCQlidWZbMl0gPSAoVTgpIFNDU0lfU1BDMl9WRVI7CQkJCVwKKwkJaWYgKGx1biA9PSAwKSB7CQkJCQkJXAorCQkJYnVmWzBdID0gKFU4KSBsdW4wbm90cHJlc2VudDsJCQlcCisJCQlidWZbM10gPSAoVTgpIERFVl9ISVNVUFBPUlQ7CQkJXAorCQl9IGVsc2UJCQkJCQkJXAorCQkJYnVmWzBdID0gKFU4KSBub3RwcmVzZW50OwkJCVwKKwkJYnVmWzRdID0gKFU4KSAoCQkJCQkJXAorCQkJTUlOTlVNKGxlbiwJCQkJCVwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KSBOT19ESVNLX0lOUVVJUllfUkVTVUxUX0xFTikgLSA1KTsJXAorCQlpZiAobGVuID49IE5PX0RJU0tfSU5RVUlSWV9SRVNVTFRfTEVOKSB7CQlcCisJCQlidWZbOF0gPSAnRCc7CQkJCQlcCisJCQlidWZbOV0gPSAnRSc7CQkJCQlcCisJCQlidWZbMTBdID0gJ0wnOwkJCQkJXAorCQkJYnVmWzExXSA9ICdMJzsJCQkJCVwKKwkJCWJ1ZlsxNl0gPSAnUCc7CQkJCQlcCisJCQlidWZbMTddID0gJ1MnOwkJCQkJXAorCQkJYnVmWzE4XSA9ICdFJzsJCQkJCVwKKwkJCWJ1ZlsxOV0gPSAnVSc7CQkJCQlcCisJCQlidWZbMjBdID0gJ0QnOwkJCQkJXAorCQkJYnVmWzIxXSA9ICdPJzsJCQkJCVwKKwkJCWJ1ZlsyMl0gPSAnICc7CQkJCQlcCisJCQlidWZbMjNdID0gJ0QnOwkJCQkJXAorCQkJYnVmWzI0XSA9ICdFJzsJCQkJCVwKKwkJCWJ1ZlsyNV0gPSAnVic7CQkJCQlcCisJCQlidWZbMjZdID0gJ0knOwkJCQkJXAorCQkJYnVmWzI3XSA9ICdDJzsJCQkJCVwKKwkJCWJ1ZlsyOF0gPSAnRSc7CQkJCQlcCisJCQlidWZbMzBdID0gJyAnOwkJCQkJXAorCQkJYnVmWzMxXSA9ICcuJzsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworCisvKgorKiBTdHJ1Y3QgJiBEZWZpbmVzIHRvIHN1cHBvcnQgc2Vuc2UgaW5mb3JtYXRpb24uCisqLworCisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0IGlzIHJldHVybmVkIGluIHNlbnNlYnVmIGZpZWxkIGluIHVpc2NtZHJzcF9zY3NpLiAgSXQgaXMKKyogaW5pdGlhbGl6ZWQgaW4gZXhhY3RseSB0aGUgbWFubmVyIHRoYXQgaXMgcmVjb21tZW5kZWQgaW4gV2luZG93cyAoaGVuY2UgdGhlCisqIG9kZCB2YWx1ZXMpLgorKiBXaGVuIHNldCwgdGhlc2UgZmllbGRzIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyogRXJyb3JDb2RlID0gMHg3MAkJaW5kaWNhdGVzIGN1cnJlbnQgZXJyb3IKKyogVmFsaWQgPSAxCQkJaW5kaWNhdGVzIHNlbnNlIGluZm8gaXMgdmFsaWQKKyogU2Vuc2VLZXkJCQljb250YWlucyBzZW5zZSBrZXkgYXMgZGVmaW5lZCBieSBTQ1NJIHNwZWNzLgorKiBBZGRpdGlvbmFsU2Vuc2VDb2RlCQljb250YWlucyBzZW5zZSBrZXkgYXMgZGVmaW5lZCBieSBTQ1NJIHNwZWNzLgorKiBBZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyCWNvbnRhaW5zIHF1YWxpZmllciB0byBzZW5zZSBjb2RlIGFzIGRlZmluZWQgYnkKKyoJCQkJc2NzaSBkb2NzLgorKiBBZGRpdGlvbmFsU2Vuc2VMZW5ndGgJCWNvbnRhaW5zIHdpbGwgYmUgc2l6ZW9mKHNlbnNlX2RhdGEpLTg9MTAuCisqLworc3RydWN0IHNlbnNlX2RhdGEgeworCVU4IEVycm9yQ29kZTo3OworCVU4IFZhbGlkOjE7CisJVTggU2VnbWVudE51bWJlcjsKKwlVOCBTZW5zZUtleTo0OworCVU4IFJlc2VydmVkOjE7CisJVTggSW5jb3JyZWN0TGVuZ3RoOjE7CisJVTggRW5kT2ZNZWRpYToxOworCVU4IEZpbGVNYXJrOjE7CisJVTggSW5mb3JtYXRpb25bNF07CisJVTggQWRkaXRpb25hbFNlbnNlTGVuZ3RoOworCVU4IENvbW1hbmRTcGVjaWZpY0luZm9ybWF0aW9uWzRdOworCVU4IEFkZGl0aW9uYWxTZW5zZUNvZGU7CisJVTggQWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllcjsKKwlVOCBGaWVsZFJlcGxhY2VhYmxlVW5pdENvZGU7CisJVTggU2Vuc2VLZXlTcGVjaWZpY1szXTsKK307CisKKy8qIHNvbWUgU0NTSSBBRFNFTlNFIGNvZGVzICovCisjaWZuZGVmIFNDU0lfQURTRU5TRV9MVU5fTk9UX1JFQURZCisjZGVmaW5lIFNDU0lfQURTRU5TRV9MVU5fTk9UX1JFQURZIDB4MDQKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQ09NTUFORAorI2RlZmluZSBTQ1NJX0FEU0VOU0VfSUxMRUdBTF9DT01NQU5EIDB4MjAKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQkxPQ0sKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQkxPQ0sKKyNkZWZpbmUgU0NTSV9BRFNFTlNFX0lMTEVHQUxfQkxPQ0sgIDB4MjEKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0lOVkFMSURfQ0RCCisjZGVmaW5lIFNDU0lfQURTRU5TRV9JTlZBTElEX0NEQiAgICAweDI0CisjZW5kaWYJLyogICovCisjaWZuZGVmIFNDU0lfQURTRU5TRV9JTlZBTElEX0xVTgorI2RlZmluZSBTQ1NJX0FEU0VOU0VfSU5WQUxJRF9MVU4gICAgMHgyNQorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEV1JJVEVfUFJPVEVDVAorI2RlZmluZSBTQ1NJX0FEV1JJVEVfUFJPVEVDVCAgICAgICAgMHgyNworI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfTUVESVVNX0NIQU5HRUQKKyNkZWZpbmUgU0NTSV9BRFNFTlNFX01FRElVTV9DSEFOR0VEIDB4MjgKKyNlbmRpZgkvKiAgKi8KKyNpZm5kZWYgU0NTSV9BRFNFTlNFX0JVU19SRVNFVAorI2RlZmluZSBTQ1NJX0FEU0VOU0VfQlVTX1JFU0VUICAgICAgMHgyOQorI2VuZGlmCS8qICAqLworI2lmbmRlZiBTQ1NJX0FEU0VOU0VfTk9fTUVESUFfSU5fREVWSUNFCisjZGVmaW5lIFNDU0lfQURTRU5TRV9OT19NRURJQV9JTl9ERVZJQ0UgMHgzYQorI2VuZGlmCS8qICAqLworCitzdHJ1Y3QgbmV0X3BrdF94bXQgeworCWludCBsZW47CS8qIGZ1bGwgbGVuZ3RoIG9mIGRhdGEgaW4gdGhlIHBhY2tldCAqLworCWludCBudW1fZnJhZ3M7CS8qIG51bWJlciBvZiBmcmFnbWVudHMgaW4gZnJhZ3MgY29udGFpbmluZyBkYXRhICovCisJc3RydWN0IHBoeXNfaW5mbyBmcmFnc1tNQVhfUEhZU19JTkZPXTsJLyogcGh5c2ljYWwgcGFnZSBpbmZvcm1hdGlvbiBmb3IKKwkJCQkJCSAqIGVhY2ggZnJhZ21lbnQgKi8KKwljaGFyIGV0aGhkcltFVEhfSEVBREVSX1NJWkVdOwkvKiB0aGUgZXRoZXJuZXQgaGVhZGVyICAqLworCXN0cnVjdCB7CisKKwkJICAgIC8qIHRoZXNlIGFyZSBuZWVkZWQgZm9yIGNzdW0gYXQgdWlzbmljIGVuZCAqLworCQlVOCB2YWxpZDsJLyogMSA9IHJlc3Qgb2YgdGhpcyBzdHJ1Y3QgaXMgdmFsaWQgLSBlbHNlCisJCQkJICogaWdub3JlICovCisJCVU4IGhyYXdvZmZ2OwkvKiAxID0gaHdyYWZvZmYgaXMgdmFsaWQgKi8KKwkJVTggbmhyYXdvZmZ2OwkvKiAxID0gbmh3cmFmb2ZmIGlzIHZhbGlkICovCisJCVUxNiBwcm90b2NvbDsJLyogc3BlY2lmaWVzIHBhY2tldCBwcm90b2NvbCAqLworCQlVMzIgY3N1bTsJLyogdmFsdWUgdXNlZCB0byBzZXQgc2tiLT5jc3VtIGF0IElPUGFydCAqLworCQlVMzIgaHJhd29mZjsJLyogdmFsdWUgdXNlZCB0byBzZXQgc2tiLT5oLnJhdyBhdCBJT1BhcnQgKi8KKwkJLyogaHJhd29mZiBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBUUkFOU1BPUlQgTEFZRVIgSEVBREVSICovCisJCVUzMiBuaHJhd29mZjsJLyogdmFsdWUgdXNlZCB0byBzZXQgc2tiLT5uaC5yYXcgYXQgSU9QYXJ0ICovCisJCS8qIG5ocmF3b2ZmIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIE5FVFdPUksgTEFZRVIgSEVBREVSICovCisJfSBsaW5jc3VtOworCisJICAgIC8qICoqKiogTk9URSAqKioqCisJICAgICAqIFRoZSBmdWxsIHBhY2tldCBpcyBkZXNjcmliZWQgaW4gZnJhZ3MgYnV0IHRoZSBldGhlcm5ldCBoZWFkZXIgaXMKKwkgICAgICogc2VwYXJhdGVseSBrZXB0IGluIGV0aGhkciBzbyB0aGF0IHVpc25pYyBkb2Vzbid0IGhhdmUgIk1BUCIgdGhlCisJICAgICAqIGd1ZXN0IG1lbW9yeSB0byBnZXQgdG8gdGhlIGhlYWRlci4gdWlzbmljIG5lZWRzIGV0aGhkciB0bworCSAgICAgKiBkZXRlcm1pbmUgaG93IHRvIHJvdXRlIHRoZSBwYWNrZXQuCisJICAgICAqLworfTsKKworc3RydWN0IG5ldF9wa3RfeG10ZG9uZSB7CisJVTMyIHhtdF9kb25lX3Jlc3VsdDsJLyogcmVzdWx0IG9mIE5FVF9YTUlUICovCisjZGVmaW5lIFhNSVRfU1VDQ0VTUyAwCisjZGVmaW5lIFhNSVRfRkFJTEVEIDEKK307CisKKy8qIFJDVlBPU1RfQlVGX1NJWmUgbXVzdCBiZSBhdCBtb3N0IHBhZ2Vfc2l6ZSg0MDk2KSAtIGNhY2hlX2xpbmVfc2l6ZSAoNjQpIFRoZQorKiByZWFzb24gaXMgYmVjYXVzZSBkZXZfc2tiX2FsbG9jIHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgUkNWX1BPU1Qgc2ticyBpbgorKiB2aXJ0bmljIHJlcXVpcmVzIHRoYXQgdGhlcmUgaXMgIm92ZXJoZWFkIiBpbiB0aGUgYnVmZmVyLCBhbmQgcGFkcyAxNiBieXRlcy4gIEkKKyogcHJlZmVyIHRvIHVzZSAxIGZ1bGwgY2FjaGUgbGluZSBzaXplIGZvciAib3ZlcmhlYWQiIHNvIHRoYXQgdHJhbnNmZXJzIGFyZQorKiBiZXR0ZXIuICBJT1ZNIHJlcXVpcmVzIHRoYXQgYSBidWZmZXIgYmUgcmVwcmVzZW50ZWQgYnkgMSBwaHlzX2luZm8gc3RydWN0dXJlCisqIHdoaWNoIGNhbiBvbmx5IGNvdmVyIHBhZ2Vfc2l6ZS4gKi8KKyNkZWZpbmUgUkNWUE9TVF9CVUZfU0laRSA0MDMyCisjZGVmaW5lIE1BWF9ORVRfUkNWX0NIQUlOIFwKKwkoKEVUSF9NQVhfTVRVK0VUSF9IRUFERVJfU0laRSArIFJDVlBPU1RfQlVGX1NJWkUtMSkgLyBSQ1ZQT1NUX0JVRl9TSVpFKQorCitzdHJ1Y3QgbmV0X3BrdF9yY3Zwb3N0IHsKKwkgICAgLyogcmN2IGJ1ZiBzaXplIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGluY2x1ZGUgZXRoZXJuZXQgZGF0YSBsZW4gKworCSAgICAqIGV0aGVybmV0IGhlYWRlciBsZW4gLSB3ZSBhcmUgY2hvb3NpbmcgMksgYmVjYXVzZSBpdCBpcyBndWFyYW50ZWVkCisJICAgICogdG8gYmUgZGVzY3JpYmFibGUgKi8KKwkgICAgc3RydWN0IHBoeXNfaW5mbyBmcmFnOwkvKiBwaHlzaWNhbCBwYWdlIGluZm9ybWF0aW9uIGZvciB0aGUKKwkJCQkJICogc2luZ2xlIGZyYWdtZW50IDJLIHJjdiBidWYgKi8KKwkgICAgVTY0IFVuaXF1ZU51bTsJCS8qIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdAorCQkJCQkgKiByZWNlaXZlIHBvc3RzIGFyZSByZXR1cm5lZCB0byAgKi8KKwkgICAgLyogdGhlIEFkYXB0ZXIgd2hpY2ggc2VudCB0aGVtIG9yaWdvbmFsbHkuICovCit9OworCitzdHJ1Y3QgbmV0X3BrdF9yY3YgeworCisJLyogdGhlIG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgY2hhaW5lZCAgKi8KKwkvKiBpcyBiYXNlZCBvbiBtYXggbXR1IGFuZCBzaXplIG9mIGVhY2ggcmN2IGJ1ZiAqLworCVUzMiByY3ZfZG9uZV9sZW47CS8qIGxlbmd0aCBvZiByZWNlaXZlZCBkYXRhICovCisJVTggbnVtcmN2YnVmczsJCS8qIG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgdGhhdCBjb250YWluIHRoZSAqLworCS8qIGluY29taW5nIGRhdGE7IGd1ZXN0IGVuZCBNVVNUIGNoYWluIHRoZXNlIHRvZ2V0aGVyLiAqLworCXZvaWQgKnJjdmJ1ZltNQVhfTkVUX1JDVl9DSEFJTl07CS8qIHRoZSBsaXN0IG9mIHJlY2VpdmUgYnVmZmVycworCQkJCQkJICogdGhhdCBtdXN0IGJlIGNoYWluZWQ7ICovCisJLyogZWFjaCBlbnRyeSBpcyBhIHJlY2VpdmUgYnVmZmVyIHByb3ZpZGVkIGJ5IE5FVF9SQ1ZfUE9TVC4gKi8KKwkvKiBOT1RFOiBmaXJzdCByY3ZidWYgaW4gdGhlIGNoYWluIHdpbGwgYWxzbyBiZSBwcm92aWRlZCBpbiBuZXQuYnVmLiAqLworCVU2NCBVbmlxdWVOdW07CisJVTMyIFJjdnNEcm9wcGVkRGVsdGE7Cit9OworCitzdHJ1Y3QgbmV0X3BrdF9lbmJkaXMgeworCXZvaWQgKmNvbnRleHQ7CisJVTE2IGVuYWJsZTsJCS8qIDEgPSBlbmFibGUsIDAgPSBkaXNhYmxlICovCit9OworCitzdHJ1Y3QgbmV0X3BrdF9tYWNhZGRyIHsKKwl2b2lkICpjb250ZXh0OworCVU4IG1hY2FkZHJbTUFYX01BQ0FERFJfTEVOXTsJLyogNiBieXRlcyAqLworfTsKKworLyogY21kIHJzcCBwYWNrZXQgdXNlZCBmb3IgVk5JQyBuZXR3b3JrIHRyYWZmaWMgICovCitzdHJ1Y3QgdWlzY21kcnNwX25ldCB7CisJTkVUX1RZUEVTIHR5cGU7CisJdm9pZCAqYnVmOworCXVuaW9uIHsKKwkJc3RydWN0IG5ldF9wa3RfeG10IHhtdDsJLyogdXNlZCBmb3IgTkVUX1hNSVQgKi8KKwkJc3RydWN0IG5ldF9wa3RfeG10ZG9uZSB4bXRkb25lOwkvKiB1c2VkIGZvciBORVRfWE1JVF9ET05FICovCisJCXN0cnVjdCBuZXRfcGt0X3JjdnBvc3QgcmN2cG9zdDsJLyogdXNlZCBmb3IgTkVUX1JDVl9QT1NUICovCisJCXN0cnVjdCBuZXRfcGt0X3JjdiByY3Y7CS8qIHVzZWQgZm9yIE5FVF9SQ1YgKi8KKwkJc3RydWN0IG5ldF9wa3RfZW5iZGlzIGVuYmRpczsJLyogdXNlZCBmb3IgTkVUX1JDVl9FTkJESVMsICovCisJCS8qIE5FVF9SQ1ZfRU5CRElTX0FDSywgICovCisJCS8qIE5FVF9SQ1ZfUFJPTVNJQywgKi8KKwkJLyogYW5kIE5FVF9DT05ORUNUX1NUQVRVUyAqLworCQlzdHJ1Y3QgbmV0X3BrdF9tYWNhZGRyIG1hY2FkZHI7CisJfTsKK307CisKK3N0cnVjdCB1aXNjbWRyc3Bfc2NzaXRhc2ttZ210IHsKKwlUQVNLX01HTVRfVFlQRVMgdGFza3R5cGU7CisKKwkgICAgLyogdGhlIHR5cGUgb2YgdGFzayAqLworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7CisKKwkgICAgLyogdGhlIHZkaXNrIGZvciB3aGljaCB0aGlzIHRhc2sgbWdtdCBpcyBnZW5lcmF0ZWQgKi8KKwl2b2lkICpzY3NpY21kOworCisJICAgIC8qIFRoaXMgaXMgc29tZSBoYW5kbGUgdGhhdCB0aGUgZ3Vlc3QgaGFzIHNhdmVkIG9mZiBmb3IgaXRzIG93biB1c2UuCisJICAgICogSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbiB0aGUgdGFzayBtZ210CisJICAgICogcnNwLiAqLworCXZvaWQgKm5vdGlmeTsKKworCSAgICAvKiBGb3IgbGludXggZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byB3YWl0X3F1ZXVlX2hlYWQgdGhhdCBhCisJICAgICogdGhyZWFkIGlzIHdhaXRpbmcgb24gdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogRm9yIHdpbmRvd3MgZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byBhIGxvY2F0aW9uIHRoYXQgYSB3YWl0aW5nCisJICAgICogdGhyZWFkIGlzIHRlc3RpbmcgdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogV2hlbiB0aGUgcnNwIGlzIHJlY2VpdmVkIGJ5IGd1ZXN0LCB0aGUgdGhyZWFkIHJlY2VpdmluZyB0aGUKKwkgICAgKiByZXNwb25zZSB1c2VzIHRoaXMgdG8gbm90aWZ5IHRoZSB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRhc2ttZ210CisJICAgICogY29tbWFuZCBjb21wbGV0aW9uLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZAorCSAgICAqIGFzIGlzIGluIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCXZvaWQgKm5vdGlmeXJlc3VsdDsKKworCSAgICAvKiB0aGlzIGlzIGEgaGFuZGxlIHRvIGxvY2F0aW9uIGluIGd1ZXN0IHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlCisJICAgICogdGFza21nbXQgY29tbWFuZCAocmVzdWx0IGZpZWxkKSBpcyB0byBzYXZlZCBvZmYgd2hlbiB0aGUgcmVzcG9uc2UKKwkgICAgKiBpcyBoYW5kbGVkLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbgorCSAgICAqIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCWNoYXIgcmVzdWx0OworCisJICAgIC8qIHJlc3VsdCBvZiB0YXNrbWdtdCBjb21tYW5kIC0gc2V0IGJ5IElPUGFydCAtIHZhbHVlcyBhcmU6ICovCisjZGVmaW5lIFRBU0tfTUdNVF9GQUlMRUQgIDAKKyNkZWZpbmUgVEFTS19NR01UX1NVQ0NFU1MgMQorfTsKKworLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIGJ5IHVpc3NkIHRvIHNlbmQgZGlzayBhZGQvcmVtb3ZlIG5vdGlmaWNhdGlvbnMgdG8KKyAqIEd1ZXN0ICovCisvKiBOb3RlIHRoYXQgdGhlIHZIYmEgcG9pbnRlciBpcyBub3QgdXNlZCBieSB0aGUgQ2xpZW50L0d1ZXN0IHNpZGUuICovCitzdHJ1Y3QgdWlzY21kcnNwX2Rpc2tub3RpZnkgeworCVU4IGFkZDsJCS8qIDAtcmVtb3ZlLCAxLWFkZCAqLworCXZvaWQgKnZIYmE7CQkvKiBQb2ludGVyIHRvIHZoYmFfaW5mbyBmb3IgY2hhbm5lbCBpbmZvIHRvCisJCQkJICogcm91dGUgbXNnICovCisJVTMyIGNoYW5uZWwsIGlkLCBsdW47CS8qIFNDU0kgUGF0aCBvZiBEaXNrIHRvIGFkZGVkIG9yIHJlbW92ZWQgKi8KK307CisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCBieSB2aXJ0aGJhL3ZTQ1NJIHRvIHNlbmQgdGhlIEFjcXVpcmUvUmVsZWFzZSBjb21tYW5kcworKiB0byB0aGUgSU9WTS4gICovCitzdHJ1Y3QgdWlzY21kcnNwX3ZkaXNrbWdtdCB7CisJVkRJU0tfTUdNVF9UWVBFUyB2ZGlza3R5cGU7CisKKwkgICAgLyogdGhlIHR5cGUgb2YgdGFzayAqLworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7CisKKwkgICAgLyogdGhlIHZkaXNrIGZvciB3aGljaCB0aGlzIHRhc2sgbWdtdCBpcyBnZW5lcmF0ZWQgKi8KKwl2b2lkICpzY3NpY21kOworCisJICAgIC8qIFRoaXMgaXMgc29tZSBoYW5kbGUgdGhhdCB0aGUgZ3Vlc3QgaGFzIHNhdmVkIG9mZiBmb3IgaXRzIG93biB1c2UuCisJICAgICogSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbiB0aGUgdGFzayBtZ210CisJICAgICogcnNwLiAqLworCXZvaWQgKm5vdGlmeTsKKworCSAgICAvKiBGb3IgbGludXggZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byB3YWl0X3F1ZXVlX2hlYWQgdGhhdCBhCisJICAgICogdGhyZWFkIGlzIHdhaXRpbmcgb24gdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogRm9yIHdpbmRvd3MgZ3Vlc3RzLCB0aGlzIGlzIGEgcG9pbnRlciB0byBhIGxvY2F0aW9uIHRoYXQgYSB3YWl0aW5nCisJICAgICogdGhyZWFkIGlzIHRlc3RpbmcgdG8gc2VlIGlmIHRoZSB0YXNrbWdtdCBjb21tYW5kIGhhcyBjb21wbGV0ZWQuCisJICAgICogV2hlbiB0aGUgcnNwIGlzIHJlY2VpdmVkIGJ5IGd1ZXN0LCB0aGUgdGhyZWFkIHJlY2VpdmluZyB0aGUKKwkgICAgKiByZXNwb25zZSB1c2VzIHRoaXMgdG8gbm90aWZ5IHRoZSB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRhc2ttZ210CisJICAgICogY29tbWFuZCBjb21wbGV0aW9uLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZAorCSAgICAqIGFzIGlzIGluIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCXZvaWQgKm5vdGlmeXJlc3VsdDsKKworCSAgICAvKiB0aGlzIGlzIGEgaGFuZGxlIHRvIGxvY2F0aW9uIGluIGd1ZXN0IHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlCisJICAgICogdGFza21nbXQgY29tbWFuZCAocmVzdWx0IGZpZWxkKSBpcyB0byBzYXZlZCBvZmYgd2hlbiB0aGUgcmVzcG9uc2UKKwkgICAgKiBpcyBoYW5kbGVkLiAgSXRzIHZhbHVlIGlzIHByZXNlcnZlZCBieSBpb3BhcnQgJiByZXR1cm5lZCBhcyBpcyBpbgorCSAgICAqIHRoZSB0YXNrIG1nbXQgcnNwLiAqLworCWNoYXIgcmVzdWx0OworCisJICAgIC8qIHJlc3VsdCBvZiB0YXNrbWdtdCBjb21tYW5kIC0gc2V0IGJ5IElPUGFydCAtIHZhbHVlcyBhcmU6ICovCisjZGVmaW5lIFZESVNLX01HTVRfRkFJTEVEICAwCisjZGVmaW5lIFZESVNLX01HTVRfU1VDQ0VTUyAxCit9OworCisvKiBrZWVwaW5nIGNtZCAmIHJzcCBpbmZvIGluIG9uZSBzdHJ1Y3R1cmUgZm9yIG5vdyBjbWQgcnNwIHBhY2tldCBmb3Igc2NzaSAqLworc3RydWN0IHVpc2NtZHJzcCB7CisJY2hhciBjbWR0eXBlOworCisJICAgIC8qIGRlc2NyaWJlcyB3aGF0IHR5cGUgb2YgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHN0cnVjdCAqLworI2RlZmluZSBDTURfU0NTSV9UWVBFCQkxCisjZGVmaW5lIENNRF9ORVRfVFlQRQkJMgorI2RlZmluZSBDTURfU0NTSVRBU0tNR01UX1RZUEUJMworI2RlZmluZSBDTURfTk9USUZZR1VFU1RfVFlQRQk0CisjZGVmaW5lIENNRF9WRElTS01HTVRfVFlQRQk1CisJdW5pb24geworCQlzdHJ1Y3QgdWlzY21kcnNwX3Njc2kgc2NzaTsKKwkJc3RydWN0IHVpc2NtZHJzcF9uZXQgbmV0OworCQlzdHJ1Y3QgdWlzY21kcnNwX3Njc2l0YXNrbWdtdCBzY3NpdGFza21nbXQ7CisJCXN0cnVjdCB1aXNjbWRyc3BfZGlza25vdGlmeSBkaXNrbm90aWZ5OworCQlzdHJ1Y3QgdWlzY21kcnNwX3ZkaXNrbWdtdCB2ZGlza21nbXQ7CisJfTsKKwl2b2lkICpwcml2YXRlX2RhdGE7CS8qIHVzZWQgdG8gc2VuZCB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgY21kIGlzCisJCQkJICogZG9uZSAoc2NzaSAmIHNjc2l0dGFza21nbXQpLiAgKi8KKwlzdHJ1Y3QgdWlzY21kcnNwICpuZXh0OwkvKiBHZW5lcmFsIFB1cnBvc2UgUXVldWUgTGluayAqLworCXN0cnVjdCB1aXNjbWRyc3AgKmFjdGl2ZVFfbmV4dDsJLyogVXNlZCB0byB0cmFjayBhY3RpdmUgY29tbWFuZHMgKi8KKwlzdHJ1Y3QgdWlzY21kcnNwICphY3RpdmVRX3ByZXY7CS8qIFVzZWQgdG8gdHJhY2sgYWN0aXZlIGNvbW1hbmRzICAqLworfTsKKworLyogVGhpcyBpcyBqdXN0IHRoZSBoZWFkZXIgb2YgdGhlIElPIGNoYW5uZWwuICBJdCBpcyBhc3N1bWVkIHRoYXQgZGlyZWN0bHkgYWZ0ZXIKKyogdGhpcyBoZWFkZXIgdGhlcmUgaXMgYSBsYXJnZSByZWdpb24gb2YgbWVtb3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBjb21tYW5kIGFuZAorKiByZXNwb25zZSBxdWV1ZXMgYXMgc3BlY2lmaWVkIGluIGNtZFEgYW5kIHJzcFEgU0lHTkFMX1FVRVVFX0hFQURFUlMuICovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCB7CisJQ0hBTk5FTF9IRUFERVIgQ2hhbm5lbEhlYWRlcjsKKwlTSUdOQUxfUVVFVUVfSEVBREVSIGNtZFE7CisJU0lHTkFMX1FVRVVFX0hFQURFUiByc3BROworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB2aGJhX3d3bm4gd3dubjsJLyogOCBieXRlcyAqLworCQkJc3RydWN0IHZoYmFfY29uZmlnX21heCBtYXg7CS8qIDIwIGJ5dGVzICovCisJCX0gdmhiYTsJCS8qIDI4ICovCisJCXN0cnVjdCB7CisJCQlVOCBtYWNhZGRyW01BWF9NQUNBRERSX0xFTl07CS8qIDYgYnl0ZXMgKi8KKwkJCVUzMiBudW1fcmN2X2J1ZnM7CS8qIDQgKi8KKwkJCVUzMiBtdHU7CS8qIDQgKi8KKwkJCUdVSUQgem9uZUd1aWQ7CS8qIDE2ICovCisJCX0gdm5pYzsJCS8qIHRvdGFsICAgICAzMCAqLworCX07CisKKyNkZWZpbmUgTUFYX0NMSUVOVFNUUklOR19MRU4gMTAyNAorCSBVOCBjbGllbnRTdHJpbmdbTUFYX0NMSUVOVFNUUklOR19MRU5dOwkvKiBOVUxMIHRlcm1pbmF0ZWQgLSBzbyBob2xkcworCQkJCQkJICogbWF4IC0gMSBieXRlcyAqLworfSBVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MOworCisjcHJhZ21hIHBhY2socG9wKQorLyogLy8vLy8vLy8vLy8vLyBFTkQgUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisvKiBkZWZpbmUgb2Zmc2V0cyB0byBtZW1iZXJzIG9mIHN0cnVjdCB1aXNjbWRyc3AgKi8KKyNkZWZpbmUgT0ZGU0VUX0NNRFRZUEUgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcCwgY21kdHlwZSkKKyNkZWZpbmUgT0ZGU0VUX1NDU0kgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcCwgc2NzaSkKKyNkZWZpbmUgT0ZGU0VUX05FVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwLCBuZXQpCisjZGVmaW5lIE9GRlNFVF9TQ1NJVEFTS01HTVQgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcCwgc2NzaXRhc2ttZ210KQorI2RlZmluZSBPRkZTRVRfTkVYVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwLCBuZXh0KQorCisvKiBkZWZpbmUgb2Zmc2V0cyB0byBtZW1iZXJzIG9mIHN0cnVjdCB1aXNjbWRyc3BfbmV0ICovCisjZGVmaW5lIE9GRlNFVF9UWVBFIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3BfbmV0LCB0eXBlKQorI2RlZmluZSBPRkZTRVRfQlVGIE9GRlNFVE9GKHN0cnVjdCB1aXNjbWRyc3BfbmV0LCBidWYpCisjZGVmaW5lIE9GRlNFVF9YTVQgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIHhtdCkKKyNkZWZpbmUgT0ZGU0VUX1hNVF9ET05FX1JFU1VMVCBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwX25ldCwgeG10ZG9uZSkKKyNkZWZpbmUgT0ZGU0VUX1JDVlBPU1QgT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIHJjdnBvc3QpCisjZGVmaW5lIE9GRlNFVF9SQ1ZfRE9ORV9MRU4gT0ZGU0VUT0Yoc3RydWN0IHVpc2NtZHJzcF9uZXQsIHJjdikKKyNkZWZpbmUgT0ZGU0VUX0VOQkRJUyBPRkZTRVRPRihzdHJ1Y3QgdWlzY21kcnNwX25ldCwgZW5iZGlzKQorCisvKiBkZWZpbmUgb2Zmc2V0cyB0byBtZW1iZXJzIG9mIHN0cnVjdCBuZXRfcGt0X3JjdnBvc3QgKi8KKyNkZWZpbmUgT0ZGU0VUX1RPVEFMTEVOIE9GRlNFVE9GKHN0cnVjdCBuZXRfcGt0X3JjdnBvc3QsIHRvdGFsbGVuKQorI2RlZmluZQlPRkZTRVRfRlJBRyBPRkZTRVRPRihzdHJ1Y3QgbmV0X3BrdF9yY3Zwb3N0LCBmcmFnKQorCisvKgorKiBJTkxJTkUgZnVuY3Rpb25zIGZvciBpbml0aWFsaXppbmcgYW5kIGFjY2Vzc2luZyBJL08gZGF0YSBjaGFubmVscworKi8KKworCisjZGVmaW5lIE5VTVNJR05BTFMoeCwgcSkgKCgoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCAqKSh4KSktPnEuTWF4U2lnbmFsU2xvdHMpCisjZGVmaW5lIFNJWkVPRl9QUk9UT0NPTCAoQ09WRVIoc2l6ZW9mKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wpLCA2NCkpCisjZGVmaW5lIFNJWkVPRl9DTURSU1AgKENPVkVSKHNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKSwgNjQpKQorCisjZGVmaW5lIElPX0NIQU5ORUxfU0laRSh4KSBDT1ZFUihTSVpFT0ZfUFJPVE9DT0wgKyBcCisJCQkJIChOVU1TSUdOQUxTKHgsIGNtZFEpICsgXAorCQkJCSAgTlVNU0lHTkFMUyh4LCByc3BRKSkgKiBTSVpFT0ZfQ01EUlNQLCA0MDk2KQorI2RlZmluZSBNSU5fSU9fQ0hBTk5FTF9TSVpFIENPVkVSKFNJWkVPRl9QUk9UT0NPTCArIFwKKwkJCQkgIDIgKiBNSU5fTlVNU0lHTkFMUyAqIFNJWkVPRl9DTURSU1AsIDQwOTYpCisjaWZkZWYgX19HTlVDX18KKy8qIFRoZXNlIGRlZmluZXMgc2hvdWxkIG9ubHkgZXZlciBiZSB1c2VkIGluIHNlcnZpY2UgcGFydGl0b25zICovCisvKiBiZWNhdXNlIHRoZXkgcmVseSBvbiB0aGUgc2l6ZSBvZiB1aXNjbWRyc3AgKi8KKyNkZWZpbmUgUVNMT1RTRlJPTUJZVEVTKGJ5dGVzKSAoKChieXRlcy1TSVpFT0ZfUFJPVE9DT0wpLzIpL1NJWkVPRl9DTURSU1ApCisjZGVmaW5lIFFTSVpFRlJPTUJZVEVTKGJ5dGVzKSAoUVNMT1RTRlJPTUJZVEVTKGJ5dGVzKSpTSVpFT0ZfQ01EUlNQKQorI2RlZmluZSBTaWduYWxRSW5pdCh4KQkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJeC0+Y21kUS5TaXplID0gUVNJWkVGUk9NQllURVMoeC0+Q2hhbm5lbEhlYWRlci5TaXplKTsJXAorCQl4LT5jbWRRLm9TaWduYWxCYXNlID0gU0laRU9GX1BST1RPQ09MIC0JCQlcCisJCQlPRkZTRVRPRihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbWRRKTsJXAorCQl4LT5jbWRRLlNpZ25hbFNpemUgPSBTSVpFT0ZfQ01EUlNQOwkJCVwKKwkJeC0+Y21kUS5NYXhTaWduYWxTbG90cyA9CQkJCVwKKwkJCVFTTE9UU0ZST01CWVRFUyh4LT5DaGFubmVsSGVhZGVyLlNpemUpOwkJXAorCQl4LT5jbWRRLk1heFNpZ25hbHMgPSB4LT5jbWRRLk1heFNpZ25hbFNsb3RzIC0gMTsJXAorCQl4LT5yc3BRLlNpemUgPSBRU0laRUZST01CWVRFUyh4LT5DaGFubmVsSGVhZGVyLlNpemUpOwlcCisJCXgtPnJzcFEub1NpZ25hbEJhc2UgPQkJCQkJXAorCQkJKFNJWkVPRl9QUk9UT0NPTCArIHgtPmNtZFEuU2l6ZSkgLQkJXAorCQkJT0ZGU0VUT0YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCwgcnNwUSk7CVwKKwkJeC0+cnNwUS5TaWduYWxTaXplID0gU0laRU9GX0NNRFJTUDsJCQlcCisJCXgtPnJzcFEuTWF4U2lnbmFsU2xvdHMgPQkJCQlcCisJCQlRU0xPVFNGUk9NQllURVMoeC0+Q2hhbm5lbEhlYWRlci5TaXplKTsJCVwKKwkJeC0+cnNwUS5NYXhTaWduYWxzID0geC0+cnNwUS5NYXhTaWduYWxTbG90cyAtIDE7CVwKKwkJeC0+Q2hhbm5lbEhlYWRlci5vQ2hhbm5lbFNwYWNlID0JCQlcCisJCQlPRkZTRVRPRihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbWRRKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSU5JVF9DTElFTlRTVFJJTkcoY2hhbiwgdHlwZSwgY2xpZW50U3RyLCBjbGllbnRTdHJMZW4pCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChjbGllbnRTdHIpIHsJCQkJCVwKKwkJCWNoYW4tPkNoYW5uZWxIZWFkZXIub0NsaWVudFN0cmluZyA9CQlcCisJCQkJT0ZGU0VUT0YodHlwZSwgY2xpZW50U3RyaW5nKTsJCVwKKwkJCU1FTUNQWShjaGFuLT5jbGllbnRTdHJpbmcsIGNsaWVudFN0ciwJCVwKKwkJCSAgICAgICBNSU5OVU0oY2xpZW50U3RyTGVuLAkJCVwKKwkJCQkgICAgICAoVTMyKSAoTUFYX0NMSUVOVFNUUklOR19MRU4gLSAxKSkpOyBcCisJCQljaGFuLT5jbGllbnRTdHJpbmdbTUlOTlVNKGNsaWVudFN0ckxlbiwJCVwKKwkJCQkJCSAgKFUzMikgKE1BWF9DTElFTlRTVFJJTkdfTEVOIFwKKwkJCQkJCQkgLSAxKSldCQlcCisJCQkJPSAnXDAnOwkJCQkJXAorCQl9CQkJCQkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlpZiAoY2xpZW50U3RyTGVuID4gMCkJCQkJXAorCQkJCXJldHVybiAwOwkJCQlcCisJfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIFVMVFJBX0lPX0NIQU5ORUxfU0VSVkVSX1JFQURZKHgsIGNoYW5JZCwgbG9nQ3R4KSBcCisJVUxUUkFfQ0hBTk5FTF9TRVJWRVJfVFJBTlNJVElPTih4LCBjaGFuSWQsIFNydlN0YXRlLCBDSEFOTkVMU1JWX1JFQURZLCBcCisJCQkJCWxvZ0N0eCk7CisKKyNkZWZpbmUgVUxUUkFfSU9fQ0hBTk5FTF9TRVJWRVJfTk9UUkVBRFkoeCwgY2hhbklkLCBsb2dDdHgpCVwKKwlVTFRSQV9DSEFOTkVMX1NFUlZFUl9UUkFOU0lUSU9OKHgsIGNoYW5JZCwgU3J2U3RhdGUsIFwKKwkJCQkJQ0hBTk5FTFNSVl9VTklOSVRJQUxJWkVELCBsb2dDdHgpOworCitzdGF0aWMgaW5saW5lIGludCBVTFRSQV9WSEJBX2luaXRfY2hhbm5lbChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MICp4LAorCQkJCQkgICAgICBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJCQkgICAgICBzdHJ1Y3QgdmhiYV9jb25maWdfbWF4ICptYXgsCisJCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKKwkJCQkJICAgICAgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSAgeworCU1FTVNFVCh4LCAwLCBzaXplb2YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCkpOworCXgtPkNoYW5uZWxIZWFkZXIuVmVyc2lvbklkID0gVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRDsKKwl4LT5DaGFubmVsSGVhZGVyLlNpZ25hdHVyZSA9IFVMVFJBX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkU7CisJeC0+Q2hhbm5lbEhlYWRlci5TcnZTdGF0ZSA9IENIQU5ORUxTUlZfVU5JTklUSUFMSVpFRDsKKwl4LT5DaGFubmVsSGVhZGVyLkhlYWRlclNpemUgPSBzaXplb2YoeC0+Q2hhbm5lbEhlYWRlcik7CisJeC0+Q2hhbm5lbEhlYWRlci5TaXplID0gQ09WRVIoYnl0ZXMsIDQwOTYpOworCXgtPkNoYW5uZWxIZWFkZXIuVHlwZSA9IFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQ7CisJeC0+Q2hhbm5lbEhlYWRlci5ab25lR3VpZCA9IEd1aWQwOworCXgtPnZoYmEud3dubiA9ICp3d25uOworCXgtPnZoYmEubWF4ID0gKm1heDsKKwlJTklUX0NMSUVOVFNUUklORyh4LCBVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbGllbnRTdHIsCisJCQkgIGNsaWVudFN0ckxlbik7CisJU2lnbmFsUUluaXQoeCk7CisJaWYgKCh4LT5jbWRRLk1heFNpZ25hbFNsb3RzID4gTUFYX05VTVNJR05BTFMpIHx8CisJICAgICAoeC0+cnNwUS5NYXhTaWduYWxTbG90cyA+IE1BWF9OVU1TSUdOQUxTKSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCh4LT5jbWRRLk1heFNpZ25hbFNsb3RzIDwgTUlOX05VTVNJR05BTFMpIHx8CisJICAgICAoeC0+cnNwUS5NYXhTaWduYWxTbG90cyA8IE1JTl9OVU1TSUdOQUxTKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVTFRSQV9WSEJBX3NldF9tYXgoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCAqeCwKKwkJCQkgICAgICBzdHJ1Y3QgdmhiYV9jb25maWdfbWF4ICptYXgpICB7CisJeC0+dmhiYS5tYXggPSAqbWF4OworfQorCitzdGF0aWMgaW5saW5lIGludCBVTFRSQV9WTklDX2luaXRfY2hhbm5lbChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MICp4LAorCQkJCQkJIHVuc2lnbmVkIGNoYXIgKm1hY2FkZHIsCisJCQkJCQkgVTMyIG51bV9yY3ZfYnVmcywgVTMyIG10dSwKKwkJCQkJCSBHVUlEIHpvbmVHdWlkLAorCQkJCQkJIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKKwkJCQkJCSBVMzIgY2xpZW50U3RyTGVuLAorCQkJCQkJIFU2NCBieXRlcykgIHsKKwlNRU1TRVQoeCwgMCwgc2l6ZW9mKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wpKTsKKwl4LT5DaGFubmVsSGVhZGVyLlZlcnNpb25JZCA9IFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQ7CisJeC0+Q2hhbm5lbEhlYWRlci5TaWduYXR1cmUgPSBVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFOworCXgtPkNoYW5uZWxIZWFkZXIuU3J2U3RhdGUgPSBDSEFOTkVMU1JWX1VOSU5JVElBTElaRUQ7CisJeC0+Q2hhbm5lbEhlYWRlci5IZWFkZXJTaXplID0gc2l6ZW9mKHgtPkNoYW5uZWxIZWFkZXIpOworCXgtPkNoYW5uZWxIZWFkZXIuU2l6ZSA9IENPVkVSKGJ5dGVzLCA0MDk2KTsKKwl4LT5DaGFubmVsSGVhZGVyLlR5cGUgPSBVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkOworCXgtPkNoYW5uZWxIZWFkZXIuWm9uZUd1aWQgPSBHdWlkMDsKKwlNRU1DUFkoeC0+dm5pYy5tYWNhZGRyLCBtYWNhZGRyLCBNQVhfTUFDQUREUl9MRU4pOworCXgtPnZuaWMubnVtX3Jjdl9idWZzID0gbnVtX3Jjdl9idWZzOworCXgtPnZuaWMubXR1ID0gbXR1OworCXgtPnZuaWMuem9uZUd1aWQgPSB6b25lR3VpZDsKKwlJTklUX0NMSUVOVFNUUklORyh4LCBVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MLCBjbGllbnRTdHIsCisJCQkgICBjbGllbnRTdHJMZW4pOworCVNpZ25hbFFJbml0KHgpOworCWlmICgoeC0+Y21kUS5NYXhTaWduYWxTbG90cyA+IE1BWF9OVU1TSUdOQUxTKSB8fAorCSAgICAgKHgtPnJzcFEuTWF4U2lnbmFsU2xvdHMgPiBNQVhfTlVNU0lHTkFMUykpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoeC0+Y21kUS5NYXhTaWduYWxTbG90cyA8IE1JTl9OVU1TSUdOQUxTKSB8fAorCSAgICAgKHgtPnJzcFEuTWF4U2lnbmFsU2xvdHMgPCBNSU5fTlVNU0lHTkFMUykpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisjZW5kaWYJLyogX19HTlVDX18gKi8KKworLyoKKyogSU5MSU5FIGZ1bmN0aW9uIGZvciBleHBhbmRpbmcgYSBndWVzdCdzIHBmbi1vZmYtc2l6ZSBpbnRvIG11bHRpcGxlIDRLIHBhZ2UKKyogcGZuLW9mZi1zaXplIGVudGlyZXMuCisqLworCisKKy8qIHdlIGRlYWwgd2l0aCA0SyBwYWdlIHNpemVzIHdoZW4gd2UgaXQgY29tZXMgdG8gcGFzc2luZyBwYWdlIGluZm9ybWF0aW9uCisgKiBiZXR3ZWVuICovCisvKiBHdWVzdCBhbmQgSU9QYXJ0aXRpb24uICovCisjZGVmaW5lIFBJX1BBR0VfU0laRSAgMHgxMDAwCisjZGVmaW5lIFBJX1BBR0VfTUFTSyAgMHgwRkZGCisjZGVmaW5lIFBJX1BBR0VfU0hJRlQgMTIKKworLyogcmV0dXJucyBuZXh0IG5vbi16ZXJvIGluZGV4IG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBmYWlsdXJlIChpLmUuIG91dCBvZgorICogcm9vbSkKKyAqLworc3RhdGljIElOTElORSAgVTE2CithZGRfcGh5c2luZm9fZW50cmllcyhVMzIgaW5wX3BmbiwJLyogaW5wdXQgLSBzcGVjaWZpZXMgdGhlIHBmbiB0byBiZSB1c2VkCisJCQkJCSAqIHRvIGFkZCBlbnRyaWVzICovCisJCSAgICAgVTE2IGlucF9vZmYsCS8qIGlucHV0IC0gc3BlY2lmaWVzIHRoZSBvZmYgdG8gYmUgdXNlZAorCQkJCQkgKiB0byBhZGQgZW50cmllcyAqLworCQkgICAgIFUzMiBpbnBfbGVuLAkvKiBpbnB1dCAtIHNwZWNpZmllcyB0aGUgbGVuIHRvIGJlIHVzZWQKKwkJCQkJICogdG8gYWRkIGVudHJpZXMgKi8KKwkJICAgICBVMTYgaW5kZXgsCQkvKiBpbnB1dCAtIGluZGV4IGluIGFycmF5IGF0IHdoaWNoIG5ldworCQkJCQkgKiBlbnRyaWVzIGFyZSBhZGRlZCAqLworCQkgICAgIFUxNiBtYXhfcGlfYXJyX2VudHJpZXMsCS8qIGlucHV0IC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtCisJCQkJCQkgKiBlbnRyaWVzIHBpX2FyciBjYW4gaG9sZCAqLworCQkgICAgIHN0cnVjdCBwaHlzX2luZm8gcGlfYXJyW10pIC8qIGlucHV0ICYgb3V0cHV0IC0gYXJyYXkgdG8KKwkJCQkJCSAgKiB3aGljaCBlbnRyaWVzIGFyZSBhZGRlZCAqLworeworCVUzMiBsZW47CisJVTE2IGksIGZpcnN0bGVuOworCisJZmlyc3RsZW4gPSBQSV9QQUdFX1NJWkUgLSBpbnBfb2ZmOworCWlmIChpbnBfbGVuIDw9IGZpcnN0bGVuKSB7CisKKwkJLyogdGhlIGlucHV0IGVudHJ5IHNwYW5zIG9ubHkgb25lIHBhZ2UgLSBhZGQgYXMgaXMgKi8KKwkJaWYgKGluZGV4ID49IG1heF9waV9hcnJfZW50cmllcykKKwkJCXJldHVybiAwOworCQlwaV9hcnJbaW5kZXhdLnBpX3BmbiA9IGlucF9wZm47CisJCXBpX2FycltpbmRleF0ucGlfb2ZmID0gKFUxNikgaW5wX29mZjsKKwkJcGlfYXJyW2luZGV4XS5waV9sZW4gPSAoVTE2KSBpbnBfbGVuOworCQkgICAgcmV0dXJuIGluZGV4ICsgMTsKKwl9CisKKwkgICAgLyogdGhpcyBlbnRyeSBzcGFucyBtdWx0aXBsZSBwYWdlcyAqLworCSAgICBmb3IgKGxlbiA9IGlucF9sZW4sIGkgPSAwOyBsZW47CisJCSBsZW4gLT0gcGlfYXJyW2luZGV4ICsgaV0ucGlfbGVuLCBpKyspIHsKKwkJaWYgKGluZGV4ICsgaSA+PSBtYXhfcGlfYXJyX2VudHJpZXMpCisJCQlyZXR1cm4gMDsKKwkJcGlfYXJyW2luZGV4ICsgaV0ucGlfcGZuID0gaW5wX3BmbiArIGk7CisJCWlmIChpID09IDApIHsKKwkJCXBpX2FycltpbmRleF0ucGlfb2ZmID0gaW5wX29mZjsKKwkJCXBpX2FycltpbmRleF0ucGlfbGVuID0gZmlyc3RsZW47CisJCX0KKworCQllbHNlIHsKKwkJCXBpX2FycltpbmRleCArIGldLnBpX29mZiA9IDA7CisJCQlwaV9hcnJbaW5kZXggKyBpXS5waV9sZW4gPQorCQkJICAgIChVMTYpIE1JTk5VTShsZW4sIChVMzIpIFBJX1BBR0VfU0laRSk7CisJCX0KKworCX0KKwlyZXR1cm4gaW5kZXggKyBpOworfQorCisjZW5kaWYJCQkJLyogX19JT0NIQU5ORUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvdmJ1c2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy92YnVzY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGJiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvdmJ1c2NoYW5uZWwuaApAQCAtMCwwICsxLDEzNSBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVkJVU0NIQU5ORUxfSF9fCisjZGVmaW5lIF9fVkJVU0NIQU5ORUxfSF9fCisKKy8qICBUaGUgdmJ1cyBjaGFubmVsIGlzIHRoZSBjaGFubmVsIGFyZWEgcHJvdmlkZWQgdmlhIHRoZSBCVVNfQ1JFQVRFIGNvbnRyb2x2bQorICogIG1lc3NhZ2UgZm9yIGVhY2ggdmlydHVhbCBidXMuICBUaGlzIGNoYW5uZWwgYXJlYSBpcyBwcm92aWRlZCB0byBib3RoIHNlcnZlcgorICogIGFuZCBjbGllbnQgZW5kcyBvZiB0aGUgYnVzLiAgVGhlIGNoYW5uZWwgaGVhZGVyIGFyZWEgaXMgaW5pdGlhbGl6ZWQgYnkKKyAqICB0aGUgc2VydmVyLCBhbmQgdGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4gYnkgdGhlIGNsaWVudC4KKyAqICBXZSBjdXJyZW50bHkgdXNlIHRoaXMgZm9yIHRoZSBjbGllbnQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0CisgKiAgdGhlIGNsaWVudCBkZXZpY2VzIGFuZCBjbGllbnQgZHJpdmVycyBmb3IgdGhlIHNlcnZlciBlbmQgdG8gc2VlLgorICovCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKworLyogezE5M2IzMzFiLWM1OGYtMTFkYS05NWE5LTAwZTA4MTYxMTY1Zn0gKi8KKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX0dVSUQgXAorCXsweDE5M2IzMzFiLCAweGM1OGYsIDB4MTFkYSwgXAorCQl7MHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmfSB9CitzdGF0aWMgY29uc3QgR1VJRCBVbHRyYVZidXNDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0xfR1VJRDsKKworI2RlZmluZSBVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCisKKy8qIE11c3QgaW5jcmVtZW50IHRoaXMgd2hlbmV2ZXIgeW91IGluc2VydCBvciBkZWxldGUgZmllbGRzIHdpdGhpbiB0aGlzIGNoYW5uZWwKKyogc3RydWN0LiAgQWxzbyBpbmNyZW1lbnQgd2hlbmV2ZXIgeW91IGNoYW5nZSB0aGUgbWVhbmluZyBvZiBmaWVsZHMgd2l0aGluIHRoaXMKKyogY2hhbm5lbCBzdHJ1Y3Qgc28gYXMgdG8gYnJlYWsgcHJlLWV4aXN0aW5nIHNvZnR3YXJlLiAgTm90ZSB0aGF0IHlvdSBjYW4KKyogdXN1YWxseSBhZGQgZmllbGRzIHRvIHRoZSBFTkQgb2YgdGhlIGNoYW5uZWwgc3RydWN0IHdpdGhPVVQgbmVlZGluZyB0bworKiBpbmNyZW1lbnQgdGhpcy4gKi8KKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX1ZFUlNJT05JRCAxCisKKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX09LX0NMSUVOVChwQ2hhbm5lbCwgbG9nQ3R4KSAgICAgICBcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfY2xpZW50KHBDaGFubmVsLAkJCQlcCisJCQkJICAgIFVsdHJhVmJ1c0NoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZidXMiLAkJCQlcCisJCQkJICAgIHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCQkJICAgIFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsIFwKKwkJCQkgICAgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSwgXAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGxvZ0N0eCkpCisKKyNkZWZpbmUgVUxUUkFfVkJVU19DSEFOTkVMX09LX1NFUlZFUihhY3R1YWxCeXRlcywgbG9nQ3R4KSAgICBcCisJKFVMVFJBX2NoZWNrX2NoYW5uZWxfc2VydmVyKFVsdHJhVmJ1c0NoYW5uZWxQcm90b2NvbEd1aWQsCVwKKwkJCQkgICAgInZidXMiLAkJCQlcCisJCQkJICAgIHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpLCBcCisJCQkJICAgIGFjdHVhbEJ5dGVzLAkJCVwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBsb2dDdHgpKQorCisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLwordHlwZWRlZiBzdHJ1Y3QgX1VMVFJBX1ZCVVNfSEVBREVSSU5GTyB7CisJVTMyIHN0cnVjdEJ5dGVzOwkvKiBzaXplIG9mIHRoaXMgc3RydWN0IGluIGJ5dGVzICovCisJVTMyIGRldmljZUluZm9TdHJ1Y3RCeXRlczsJLyogc2l6ZW9mKFVMVFJBX1ZCVVNfREVWSUNFSU5GTykgKi8KKwlVMzIgZGV2SW5mb0NvdW50OwkvKiBudW0gb2YgaXRlbXMgaW4gRGV2SW5mbyBtZW1iZXIgKi8KKwkvKiAodGhpcyBpcyB0aGUgYWxsb2NhdGVkIHNpemUpICovCisJVTMyIGNocEluZm9CeXRlT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0aGlzIHN0cnVjdCAqLworCS8qIHRvIHRoZSB0aGUgQ2hwSW5mbyBzdHJ1Y3QgKGJlbG93KSAqLworCVUzMiBidXNJbmZvQnl0ZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgdGhpcyBzdHJ1Y3QgKi8KKwkvKiB0byB0aGUgdGhlIEJ1c0luZm8gc3RydWN0IChiZWxvdykgKi8KKwlVMzIgZGV2SW5mb0J5dGVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoaXMgc3RydWN0ICovCisJLyogdG8gdGhlIHRoZSBEZXZJbmZvIGFycmF5IChiZWxvdykgKi8KKwlVOCByZXNlcnZlZFsxMDRdOworfSBVTFRSQV9WQlVTX0hFQURFUklORk87CisKK3R5cGVkZWYgc3RydWN0IF9VTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgeworCVVMVFJBX0NIQU5ORUxfUFJPVE9DT0wgQ2hhbm5lbEhlYWRlcjsJLyogaW5pdGlhbGl6ZWQgYnkgc2VydmVyICovCisJVUxUUkFfVkJVU19IRUFERVJJTkZPIEhkckluZm87CS8qIGluaXRpYWxpemVkIGJ5IHNlcnZlciAqLworCS8qIHRoZSByZW1haW5kZXIgb2YgdGhpcyBjaGFubmVsIGlzIGZpbGxlZCBpbiBieSB0aGUgY2xpZW50ICovCisJVUxUUkFfVkJVU19ERVZJQ0VJTkZPIENocEluZm87CS8qIGRlc2NyaWJlcyBjbGllbnQgY2hpcHNldCBkZXZpY2UgYW5kCisJCQkJCSAqIGRyaXZlciAqLworCVVMVFJBX1ZCVVNfREVWSUNFSU5GTyBCdXNJbmZvOwkvKiBkZXNjcmliZXMgY2xpZW50IGJ1cyBkZXZpY2UgYW5kCisJCQkJCSAqIGRyaXZlciAqLworCVVMVFJBX1ZCVVNfREVWSUNFSU5GTyBEZXZJbmZvWzBdOwkvKiBkZXNjcmliZXMgY2xpZW50IGRldmljZSBhbmQKKwkJCQkJCSAqIGRyaXZlciBmb3IgKi8KKwkvKiBlYWNoIGRldmljZSBvbiB0aGUgYnVzICovCit9IFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTDsKKworI2RlZmluZSBWQlVTX0NIX1NJWkVfRVhBQ1QoTUFYREVWSUNFUykgXAorCShzaXplb2YoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MKSArICgoTUFYREVWSUNFUykgKiBcCisJCQkJCQlzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSkpCisjZGVmaW5lIFZCVVNfQ0hfU0laRShNQVhERVZJQ0VTKSBDT1ZFUihWQlVTX0NIX1NJWkVfRVhBQ1QoTUFYREVWSUNFUyksIDQwOTYpCisKK3N0YXRpYyBJTkxJTkUgdm9pZAorVUxUUkFfVkJVU19pbml0X2NoYW5uZWwoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKngsCisJCQlpbnQgYnl0ZXNBbGxvY2F0ZWQpCit7CisJLyogUGxlYXNlIG5vdGUgdGhhdCB0aGUgbWVtb3J5IGF0IDx4PiBkb2VzIE5PVCBuZWNlc3NhcmlseSBoYXZlIHNwYWNlCisJKiBmb3IgRGV2SW5mbyBzdHJ1Y3RzIGFsbG9jYXRlZCBhdCB0aGUgZW5kLCB3aGljaCBpcyB3aHkgd2UgZG8gTk9UIHVzZQorCSogPGJ5dGVzQWxsb2NhdGVkPiB0byBjbGVhci4gKi8KKwltZW1zZXRfaW8oeCwgMCwgc2l6ZW9mKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTCkpOworCWlmIChieXRlc0FsbG9jYXRlZCA8IChpbnQpIHNpemVvZihVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wpKQorCQlyZXR1cm47CisJd3JpdGVsKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9WRVJTSU9OSUQsCisJICAgICAgICZ4LT5DaGFubmVsSGVhZGVyLlZlcnNpb25JZCk7CisJd3JpdGVxKFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUsCisJICAgICAgICZ4LT5DaGFubmVsSGVhZGVyLlNpZ25hdHVyZSk7CisJd3JpdGVsKENIQU5ORUxTUlZfUkVBRFksICZ4LT5DaGFubmVsSGVhZGVyLlNydlN0YXRlKTsKKwl3cml0ZWwoc2l6ZW9mKHgtPkNoYW5uZWxIZWFkZXIpLCAmeC0+Q2hhbm5lbEhlYWRlci5IZWFkZXJTaXplKTsKKwl3cml0ZXEoYnl0ZXNBbGxvY2F0ZWQsICZ4LT5DaGFubmVsSGVhZGVyLlNpemUpOworCW1lbWNweV90b2lvKCZ4LT5DaGFubmVsSGVhZGVyLlR5cGUsICZVbHRyYVZidXNDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkgICAgc2l6ZW9mKHgtPkNoYW5uZWxIZWFkZXIuVHlwZSkpOworCW1lbWNweV90b2lvKCZ4LT5DaGFubmVsSGVhZGVyLlpvbmVHdWlkLCAmR3VpZDAsCisJCSAgICBzaXplb2YoeC0+Q2hhbm5lbEhlYWRlci5ab25lR3VpZCkpOworCXdyaXRlbChzaXplb2YoVUxUUkFfVkJVU19IRUFERVJJTkZPKSwgJngtPkhkckluZm8uc3RydWN0Qnl0ZXMpOworCXdyaXRlbChzaXplb2YoVUxUUkFfVkJVU19IRUFERVJJTkZPKSwgJngtPkhkckluZm8uY2hwSW5mb0J5dGVPZmZzZXQpOworCXdyaXRlbChyZWFkbCgmeC0+SGRySW5mby5jaHBJbmZvQnl0ZU9mZnNldCkgKworCSAgICAgICBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSwKKwkgICAgICAgJngtPkhkckluZm8uYnVzSW5mb0J5dGVPZmZzZXQpOworCXdyaXRlbChyZWFkbCgmeC0+SGRySW5mby5idXNJbmZvQnl0ZU9mZnNldCkKKwkgICAgICAgKyBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSwKKwkgICAgICAgJngtPkhkckluZm8uZGV2SW5mb0J5dGVPZmZzZXQpOworCXdyaXRlbChzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSwKKwkgICAgICAgJngtPkhkckluZm8uZGV2aWNlSW5mb1N0cnVjdEJ5dGVzKTsKKwlieXRlc0FsbG9jYXRlZCAtPSAoc2l6ZW9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wpCisJCQkgICArIHJlYWRsKCZ4LT5IZHJJbmZvLmRldkluZm9CeXRlT2Zmc2V0KSk7CisJd3JpdGVsKGJ5dGVzQWxsb2NhdGVkIC8gcmVhZGwoJngtPkhkckluZm8uZGV2aWNlSW5mb1N0cnVjdEJ5dGVzKSwKKwkgICAgICAgJngtPkhkckluZm8uZGV2SW5mb0NvdW50KTsKK30KKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMwZDMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaApAQCAtMCwwICsxLDkyIEBACisvKiBjb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qICBEZWZpbmVzIGZvciBhbGwgdmFsaWQgdmFsdWVzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIGhlYWRlcgorICogIGNvbXBsZXRpb25TdGF0dXMgZmllbGQuICBTZWUgY29udHJvbHZtY2hhbm5lbC5oIGZvciBkZXNjcmlwdGlvbiBvZgorICogIHRoZSBoZWFkZXI6IF9DT05UUk9MVk1fTUVTU0FHRV9IRUFERVIuCisgKi8KKworI2lmbmRlZiBfX0NPTlRST0xWTUNPTVBMRVRJT05TVEFUVVNfSF9fCisjZGVmaW5lIF9fQ09OVFJPTFZNQ09NUExFVElPTlNUQVRVU19IX18KKworLyogR2VuZXJhbCBFcnJvcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMC05OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JT1JFTUFQX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTiAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVCAgICAgIDUKKworLyogQ09OVFJPTFZNX0lOSVRfQ0hJUFNFVC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTAwLTE5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0xJRU5UX1NXSVRDSENPVU5UX05PTlpFUk8gICAgICAgICAxMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfRVhQRUNURURfQ0hJUFNFVF9JTklUICAgICAgICAgICAgICAxMDEKKworLyogTWF4aW11bSBMaW1pdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMjAwLTI5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0JVU0VTCQkyMDEJLyogQlVTX0NSRUFURSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfREVWSUNFUyAgICAgICAgMjAyCS8qIERFVklDRV9DUkVBVEUgKi8KKy8qIFBheWxvYWQgYW5kIFBhcmFtZXRlciBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzQwMC00OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1BBWUxPQURfSU5WQUxJRAk0MDAJLyogU1dJVENIX0FUVEFDSEVYVFBPUlQsCisJCQkJCQkJICogREVWSUNFX0NPTkZJR1VSRSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JTklUSUFUT1JfUEFSQU1FVEVSX0lOVkFMSUQgNDAxCS8qIE11bHRpcGxlICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1RBUkdFVF9QQVJBTUVURVJfSU5WQUxJRCA0MDIgLyogREVWSUNFX0NPTkZJR1VSRSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DTElFTlRfUEFSQU1FVEVSX0lOVkFMSUQgNDAzIC8qIERFVklDRV9DT05GSUdVUkUgKi8KKy8qIFNwZWNpZmllZFtQYWNrZXQgU3RydWN0dXJlXSBWYWx1ZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNTAwLTU5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQJNTAwCS8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JULAorCQkJCQkJCSAqIEJVU19DT05GSUdVUkUsCisJCQkJCQkJICogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkgKiBERVZJQ0VfQ09ORklHCisJCQkJCQkJICogREVWSUNFX0RFU1RST1kgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQJNTAxIC8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JUICovCisJCQkJCQkgICAgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFLAorCQkJCQkJICAgICAqIERFVklDRV9ERVNUUk9ZICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfSU5WQUxJRAk1MDIgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFICovCisvKiBQYXJ0aXRpb24gRHJpdmVyIENhbGxiYWNrIEludGVyZmFjZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNjAwLTY5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRSA2MDQJLyogQlVTX0NSRUFURSwKKwkJCQkJCQkgKiBCVVNfREVTVFJPWSwKKwkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZICovCisvKiBVbmFibGUgdG8gaW52b2tlIFZJUlRQQ0kgY2FsbGJhY2sgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1IgNjA1IC8qIEJVU19DUkVBVEUsCisJCQkJCQkJCSogQlVTX0RFU1RST1ksCisJCQkJCQkJCSogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkJKiBERVZJQ0VfREVTVFJPWSAqLworLyogVklSVFBDSSBDYWxsYmFjayByZXR1cm5lZCBlcnJvciAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9HRU5FUklDX0RSSVZFUl9DQUxMQkFDS19FUlJPUiA2MDYgLyogU1dJVENIX0FUVEFDSEVYVFBPUlQsCisJCQkJCQkJCSogU1dJVENIX0RFVEFDSEVYVFBPUlQKKwkJCQkJCQkJKiBERVZJQ0VfQ09ORklHVVJFICovCisKKy8qIGdlbmVyaWMgZGV2aWNlIGNhbGxiYWNrIHJldHVybmVkIGVycm9yICovCisvKiBCdXMgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs3MDAtNzk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfREVWSUNFX0FUVEFDSEVEIDcwMAkvKiBCVVNfREVTVFJPWSAqLworLyogQ2hhbm5lbCBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bODAwLTg5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV04gODAwCS8qIEdFVF9DSEFOTkVMSU5GTywKKwkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1NJWkVfVE9PX1NNQUxMIDgwMQkvKiBERVZJQ0VfQ1JFQVRFICovCisvKiBDaGlwc2V0IFNodXRkb3duIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTAwMC0xMDk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NIVVRET1dOX0ZBSUxFRCAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TSFVURE9XTl9BTFJFQURZX0FDVElWRSAgICAxMDAxCisKKy8qIENoaXBzZXQgU3RvcCBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMTAwLTExOTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfQlVTICAgICAgICAgICAgMTEwMAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX1NXSVRDSCAgICAgICAgIDExMDEKKworLyogRGV2aWNlIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzE0MDAtMTQ5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCAgICAgICAgICAgICAgICAxNDAwCisKKyNlbmRpZiAvKiBfX0NPTlRST0xWTUNPTVBMRVRJT05TVEFUVVNfSF9fIG5vdCBkZWZpbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2RpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzYyOTRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2RpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaApAQCAtMCwwICsxLDMxMCBAQAorLyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZmlsZSBpcyB0byBiZSB1c2VkIE9OTFkgZm9yIGRlZmluaW5nIGRpYWdub3N0aWMKKyAqIHN1YnN5c3RlbSB2YWx1ZXMgZm9yIHRoZSBhcHBvcyAoc1BBUiBMaW51eCBzZXJ2aWNlIHBhcnRpdGlvbnMpIGNvbXBvbmVudC4KKyAqLworI2lmbmRlZiBfX0FQUE9TX1NVQlNZU1RFTVNfSF9fCisjZGVmaW5lIF9fQVBQT1NfU1VCU1lTVEVNU19IX18KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3Vic3lzX3Vua25vd25fdG9fcyhpbnQgc3Vic3lzLCBjaGFyICpzLCBpbnQgbikKK3sKKwlzbnByaW50ZihzLCBuLCAiU1VCU1lTLSUtMi4yZCIsIHN1YnN5cyk7CisJc1tuIC0gMV0gPSAnXDAnOworCXJldHVybiBzOworfQorCisjZGVmaW5lIFNVQlNZU19UT19NQVNLKHN1YnN5cykgICAgICAoMVVMTCA8PCAoc3Vic3lzKSkKKworLyogVGhlIGZpcnN0IFNVQlNZU19BUFBPU19NQVggc3Vic3lzdGVtcyBhcmUgdGhlIHNhbWUgZm9yIGVhY2ggQXBwT1MgdHlwZQorICogKElPVk0sIFNNUywgZXRjLikgVGhlIHJlc3QgaGF2ZSB1bmlxdWUgdmFsdWVzIGZvciBlYWNoIEFwcE9TIHR5cGUuCisgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX01BWCAxNgorCisjZGVmaW5lCVNVQlNZU19BUFBPU19ERUZBVUxUICAgICAgICAgMQkvKiBvciAib3RoZXIiICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19DSElQU0VUICAgICAgICAgMgkvKiBjb250cm9sdm0gYW5kIG90aGVyICovCisJCQkJCS8qIGxvdy1sZXZlbCBzUEFSIGFjdGl2aXR5ICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19CVVMgICAgICAgICAgICAgMwkvKiBzUEFSIGJ1cyAqLworLyogREFLICNkZWZpbmUgU1VCU1lTX0FQUE9TX0RJQUcgICAgICAgICAgICA0ICAvLyBkaWFnbm9zdGljcyBhbmQgZHVtcCAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfQ0hBTk5FTEFDQ0VTUyAgIDUJLyogZ2VuZXJpYyBjaGFubmVsIGFjY2VzcyAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfTklDQ0xJRU5UICAgICAgIDYJLyogdmlydHVhbCBOSUMgY2xpZW50ICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19IQkFDTElFTlQgICAgICAgNwkvKiB2aXJ0dWFsIEhCQSBjbGllbnQgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX0NPTlNPTEVTRVJJQUwgICA4CS8qIHNQQVIgdmlydHVhbCBzZXJpYWwgY29uc29sZSAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfVUlTTElCICAgICAgICAgIDkJLyogICovCisjZGVmaW5lIFNVQlNZU19BUFBPU19WUlRDVVBERCAgICAgICAxMAkvKiAgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TX1dBVENIRE9HICAgICAgIDExCS8qIHdhdGNoZG9nIHRpbWVyIGFuZCBoZWFsdGhjaGVjayAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfMTMgICAgICAgICAgICAgMTMJLyogYXZhaWxhYmxlICovCisjZGVmaW5lIFNVQlNZU19BUFBPU18xNCAgICAgICAgICAgICAxNAkvKiBhdmFpbGFibGUgKi8KKyNkZWZpbmUgU1VCU1lTX0FQUE9TXzE1ICAgICAgICAgICAgIDE1CS8qIGF2YWlsYWJsZSAqLworI2RlZmluZSBTVUJTWVNfQVBQT1NfMTYgICAgICAgICAgICAgMTYJLyogYXZhaWxhYmxlICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3Vic3lzX2dlbmVyaWNfdG9fcyhpbnQgc3Vic3lzLCBjaGFyICpzLCBpbnQgbikKK3sKKwlzd2l0Y2ggKHN1YnN5cykgeworCWNhc2UgU1VCU1lTX0FQUE9TX0RFRkFVTFQ6CisJCXN0cm5jcHkocywgIkFQUE9TX0RFRkFVTFQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfQ0hJUFNFVDoKKwkJc3RybmNweShzLCAiQVBQT1NfQ0hJUFNFVCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU19CVVM6CisJCXN0cm5jcHkocywgIkFQUE9TX0JVUyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU19DSEFOTkVMQUNDRVNTOgorCQlzdHJuY3B5KHMsICJBUFBPU19DSEFOTkVMQUNDRVNTIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX05JQ0NMSUVOVDoKKwkJc3RybmNweShzLCAiQVBQT1NfTklDQ0xJRU5UIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX0hCQUNMSUVOVDoKKwkJc3RybmNweShzLCAiQVBQT1NfSEJBQ0xJRU5UIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX0NPTlNPTEVTRVJJQUw6CisJCXN0cm5jcHkocywgIkFQUE9TX0NPTlNPTEVTRVJJQUwiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfVUlTTElCOgorCQlzdHJuY3B5KHMsICJBUFBPU19VSVNMSUIiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfVlJUQ1VQREQ6CisJCXN0cm5jcHkocywgIkFQUE9TX1ZSVENVUEREIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TX1dBVENIRE9HOgorCQlzdHJuY3B5KHMsICJBUFBPU19XQVRDSERPRyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU18xMzoKKwkJc3RybmNweShzLCAiQVBQT1NfMTMiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQVBQT1NfMTQ6CisJCXN0cm5jcHkocywgIkFQUE9TXzE0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0FQUE9TXzE1OgorCQlzdHJuY3B5KHMsICJBUFBPU18xNSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19BUFBPU18xNjoKKwkJc3RybmNweShzLCAiQVBQT1NfMTYiLCBuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3Vic3lzX3Vua25vd25fdG9fcyhzdWJzeXMsIHMsIG4pOworCQlicmVhazsKKwl9CisJc1tuIC0gMV0gPSAnXDAnOworCXJldHVybiBzOworfQorCisvKiBDT05TT0xFICovCisKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfVklERU8gICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMSkJLyogMTcgKi8KKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfS0JETU9VICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMikJLyogMTggKi8KKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDQgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDUgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDYgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDcgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDggICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgOCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMDkgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgOSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTAgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTApCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzExICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDExKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xMiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxMikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTMgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTMpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzE0ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDE0KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xNSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxNSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTYgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTYpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzE3ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDE3KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8xOCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAxOCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMTkgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMTkpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzIwICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDIwKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yMSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyMSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjIgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjIpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzIzICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDIzKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yNCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyNCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjUgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjUpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzI2ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDI2KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8yNyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAyNykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMjggICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMjgpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzI5ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDI5KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zMCAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzMCkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzEgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzEpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzMyICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDMyKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zMyAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzMykKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzQgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzQpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzM1ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDM1KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zNiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzNikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfMzcgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgMzcpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzM4ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDM4KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV8zOSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyAzOSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDAgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDApCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzQxICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDQxKQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV80MiAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0MikKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDMgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDMpCisjZGVmaW5lIFNVQlNZU19DT05TT0xFXzQ0ICAgICAgICAgICAoU1VCU1lTX0FQUE9TX01BWCArIDQ0KQorI2RlZmluZSBTVUJTWVNfQ09OU09MRV80NSAgICAgICAgICAgKFNVQlNZU19BUFBPU19NQVggKyA0NSkKKyNkZWZpbmUgU1VCU1lTX0NPTlNPTEVfNDYgICAgICAgICAgIChTVUJTWVNfQVBQT1NfTUFYICsgNDYpCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitzdWJzeXNfY29uc29sZV90b19zKGludCBzdWJzeXMsIGNoYXIgKnMsIGludCBuKQoreworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTVUJTWVNfQ09OU09MRV9WSURFTzoKKwkJc3RybmNweShzLCAiQ09OU09MRV9WSURFTyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFX0tCRE1PVToKKwkJc3RybmNweShzLCAiQ09OU09MRV9LQkRNT1UiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8wNDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8wNCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzA1OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzA1Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMDY6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMDYiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8wNzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8wNyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzA4OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzA4Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMDk6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMDkiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xMDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xMCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzExOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzExIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTI6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTIiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xMzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xMyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzE0OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzE0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTU6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTUiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xNjoKKwkJc3RybmNweShzLCAiQ09OU09MRV8xNiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzE3OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzE3Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMTg6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMTgiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8xOToKKwkJc3RybmNweShzLCAiQ09OU09MRV8xOSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzIwOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzIwIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjE6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjEiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yMjoKKwkJc3RybmNweShzLCAiQ09OU09MRV8yMiIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzIzOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzIzIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjQ6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjQiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yNToKKwkJc3RybmNweShzLCAiQ09OU09MRV8yNSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzI2OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzI2Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMjc6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMjciLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8yODoKKwkJc3RybmNweShzLCAiQ09OU09MRV8yOCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzI5OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzI5Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzA6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzAiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zMToKKwkJc3RybmNweShzLCAiQ09OU09MRV8zMSIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzMyOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzMyIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzM6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzMiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zNDoKKwkJc3RybmNweShzLCAiQ09OU09MRV8zNCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzM1OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzM1Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzY6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzYiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV8zNzoKKwkJc3RybmNweShzLCAiQ09OU09MRV8zNyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzM4OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzM4Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfMzk6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfMzkiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80MDoKKwkJc3RybmNweShzLCAiQ09OU09MRV80MCIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzQxOgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzQxIiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfNDI6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfNDIiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80MzoKKwkJc3RybmNweShzLCAiQ09OU09MRV80MyIsIG4pOworCQlicmVhazsKKwljYXNlIFNVQlNZU19DT05TT0xFXzQ0OgorCQlzdHJuY3B5KHMsICJDT05TT0xFXzQ0Iiwgbik7CisJCWJyZWFrOworCWNhc2UgU1VCU1lTX0NPTlNPTEVfNDU6CisJCXN0cm5jcHkocywgIkNPTlNPTEVfNDUiLCBuKTsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQ09OU09MRV80NjoKKwkJc3RybmNweShzLCAiQ09OU09MRV80NiIsIG4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdWJzeXNfdW5rbm93bl90b19zKHN1YnN5cywgcywgbik7CisJCWJyZWFrOworCX0KKwlzW24gLSAxXSA9ICdcMCc7CisJcmV0dXJuIHM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2lvdm1jYWxsX2dudWMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9pb3ZtY2FsbF9nbnVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwNGU5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvaW92bWNhbGxfZ251Yy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIExpbnV4IEdDQyBWZXJzaW9uICgzMi1iaXQgYW5kIDY0LWJpdCkgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworX191bmlzeXNfdm1jYWxsX2dudWModW5zaWduZWQgbG9uZyB0dXBsZSwgdW5zaWduZWQgbG9uZyByZWdfZWJ4LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVnX2VjeCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisKKwl1bnNpZ25lZCBpbnQgY3B1aWRfZWF4LCBjcHVpZF9lYngsIGNwdWlkX2VjeCwgY3B1aWRfZWR4OworCWNwdWlkKDB4MDAwMDAwMDEsICZjcHVpZF9lYXgsICZjcHVpZF9lYngsICZjcHVpZF9lY3gsICZjcHVpZF9lZHgpOworCWlmIChjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSB7CisJICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5ieXRlIDB4MDBmLCAweDAwMSwgMHgwYzEiIDogIj1hIihyZXN1bHQpIDoKKwkJCQkgICAiYSIodHVwbGUpLCAiYiIocmVnX2VieCksICJjIihyZWdfZWN4KQorCQkJCSAgICAgICk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLTE7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworX191bmlzeXNfZXh0ZW5kZWRfdm1jYWxsX2dudWModW5zaWduZWQgbG9uZyBsb25nIHR1cGxlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lYngsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VjeCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWR4KQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKworCXVuc2lnbmVkIGludCBjcHVpZF9lYXgsIGNwdWlkX2VieCwgY3B1aWRfZWN4LCBjcHVpZF9lZHg7CisJY3B1aWQoMHgwMDAwMDAwMSwgJmNwdWlkX2VheCwgJmNwdWlkX2VieCwgJmNwdWlkX2VjeCwgJmNwdWlkX2VkeCk7CisJaWYgKGNwdWlkX2VjeCAmIDB4ODAwMDAwMDApIHsKKwkgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmJ5dGUgMHgwMGYsIDB4MDAxLCAweDBjMSIgOiAiPWEiKHJlc3VsdCkgOgorCQkJCSAgICJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpLAorCQkJCSAgICJkIihyZWdfZWR4KSk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLTE7CisJfQorCXJldHVybiByZXN1bHQ7CisJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZidXNkZXZpY2VpbmZvLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmJ1c2RldmljZWluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTcwOGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZidXNkZXZpY2VpbmZvLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WQlVTREVWSUNFSU5GT19IX18KKyNkZWZpbmUgX19WQlVTREVWSUNFSU5GT19IX18KKworI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLworCisvKiBBbiBhcnJheSBvZiB0aGlzIHN0cnVjdCBpcyBwcmVzZW50IGluIHRoZSBjaGFubmVsIGFyZWEgZm9yIGVhY2ggdmJ1cy4KKyAqIChTZWUgdmJ1c2NoYW5uZWwuaC4pCisgKiBJdCBpcyBmaWxsZWQgaW4gYnkgdGhlIGNsaWVudCBzaWRlIHRvIHByb3ZpZGUgaW5mbyBhYm91dCB0aGUgZGV2aWNlCisgKiBhbmQgZHJpdmVyIGZyb20gdGhlIGNsaWVudCdzIHBlcnNwZWN0aXZlLgorICovCit0eXBlZGVmIHN0cnVjdCBfVUxUUkFfVkJVU19ERVZJQ0VJTkZPIHsKKwlVOCBkZXZUeXBlWzE2XTsJCS8qIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGUgZGV2aWNlIHR5cGUgKi8KKwlVOCBkcnZOYW1lWzE2XTsJCS8qIGRyaXZlciAuc3lzIGZpbGUgbmFtZSAqLworCVU4IGluZm9TdHJpbmdzWzk2XTsJLyogc2VxdWVuY2Ugb2YgdGFiLWRlbGltaXRlZCBpZCBzdHJpbmdzOiAqLworCS8qIDxEUklWRVJfUkVWPiA8RFJJVkVSX1ZFUlRBRz4gPERSSVZFUl9DT01QSUxFVElNRT4gKi8KKwlVOCByZXNlcnZlZFsxMjhdOwkvKiBwYWQgc2l6ZSB0byAyNTYgYnl0ZXMgKi8KK30gVUxUUkFfVkJVU19ERVZJQ0VJTkZPOworCisjcHJhZ21hIHBhY2socG9wKQorCisvKiBSZWFkcyBjaGFycyBmcm9tIHRoZSBidWZmZXIgYXQgPHNyYz4gZm9yIDxzcmNtYXg+IGJ5dGVzLCBhbmQgd3JpdGVzIHRvCisgKiB0aGUgYnVmZmVyIGF0IDxwPiwgd2hpY2ggaXMgPHJlbWFpbj4gYnl0ZXMgbG9uZywgZW5zdXJpbmcgbmV2ZXIgdG8KKyAqIG92ZXJmbG93IHRoZSBidWZmZXIgYXQgPHA+LCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICogLSBwcmludGFibGUgY2hhcmFjdGVycyBhcmUgc2ltcGx5IGNvcGllZCBmcm9tIHRoZSBidWZmZXIgYXQgPHNyYz4gdG8gdGhlCisgKiAgIGJ1ZmZlciBhdCA8cD4KKyAqIC0gaW50ZXJ2ZW5pbmcgc3RyZWFrcyBvZiBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBhdCA8c3JjPgorICogICBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBpbiB0aGUgYnVmZmVyIGF0IDxwPgorICogTm90ZSB0aGF0IHdlIHBheSBubyBhdHRlbnRpb24gdG8gJ1wwJy10ZXJtaW5hdGlvbi4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KKyAqCisgKiBQYXNzIDxwPiA9PSBOVUxMIGFuZCA8cmVtYWluPiA9PSAwIGZvciB0aGlzIHNwZWNpYWwgYmVoYXZpb3IuICBJbiB0aGlzCisgKiBjYXNlLCB3ZSBzaW1wbHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBXT1VMRCBIQVZFIGJlZW4gd3JpdHRlbgorICogdG8gYSBidWZmZXIgYXQgPHA+LCBoYWQgaXQgYmVlbiBpbmZpbml0ZWx5IGJpZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1ZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihjaGFyICpwLCBpbnQgcmVtYWluLCBjaGFyIF9faW9tZW0gKnNyYywgaW50IHNyY21heCkKK3sKKwlpbnQgY2hhcnMgPSAwOworCWludCBub25wcmludGFibGVfc3RyZWFrID0gMDsKKwl3aGlsZSAoc3JjbWF4ID4gMCkgeworCQlpZiAoKHJlYWRiKHNyYykgPj0gJyAnKSAmJiAocmVhZGIoc3JjKSA8IDB4N2YpKSB7CisJCQlpZiAobm9ucHJpbnRhYmxlX3N0cmVhaykgeworCQkJCWlmIChyZW1haW4gPiAwKSB7CisJCQkJCSpwID0gJyAnOworCQkJCQlwKys7CisJCQkJCXJlbWFpbi0tOworCQkJCQljaGFycysrOworCQkJCX0gZWxzZSBpZiAocCA9PSBOVUxMKQorCQkJCQljaGFycysrOworCQkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAwOworCQkJfQorCQkJaWYgKHJlbWFpbiA+IDApIHsKKwkJCQkqcCA9IHJlYWRiKHNyYyk7CisJCQkJcCsrOworCQkJCXJlbWFpbi0tOworCQkJCWNoYXJzKys7CisJCQl9IGVsc2UgaWYgKHAgPT0gTlVMTCkKKwkJCQljaGFycysrOworCQl9IGVsc2UKKwkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAxOworCQlzcmMrKzsKKwkJc3JjbWF4LS07CisJfQorCXJldHVybiBjaGFyczsKK30KKworI2RlZmluZSBWQlVTQ0hBTk5FTF9BRERBQ0hBUihjaCwgcCwgcmVtYWluLCBjaGFycykgXAorCWRvIHsJCQkJCSAgIFwKKwkJaWYgKHJlbWFpbiA8PSAwKQkJICAgXAorCQkJYnJlYWs7CQkJICAgXAorCQkqcCA9IGNoOwkJCSAgIFwKKwkJcCsrOyAgY2hhcnMrKzsgIHJlbWFpbi0tOwkgICBcCisJfSB3aGlsZSAoMCkKKworLyogQ29udmVydHMgdGhlIG5vbi1uZWdhdGl2ZSB2YWx1ZSBhdCA8bnVtPiB0byBhbiBhc2NpaSBkZWNpbWFsIHN0cmluZworICogYXQgPHA+LCB3cml0aW5nIGF0IG1vc3QgPHJlbWFpbj4gYnl0ZXMuICBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KKyAqIHdyaXR0ZW4gdG8gPHA+LgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KKyAqCisgKiBOb3RlIHRoYXQgd2UgY3JlYXRlIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIHRoaXMgb3BlcmF0aW9uIGluCisgKiBhbiBlbnZpcm9ubWVudC1pbmRlcGVuZGVudCB3YXkgKHNpbmNlIHdlIGFyZSBpbiBhIGNvbW1vbiBoZWFkZXIgZmlsZSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitWQlVTQ0hBTk5FTF9pdG9hKGNoYXIgKnAsIGludCByZW1haW4sIGludCBudW0pCit7CisJaW50IGRpZ2l0cyA9IDA7CisJY2hhciBzWzMyXTsKKwlpbnQgaTsKKworCWlmIChudW0gPT0gMCkgeworCQkvKiAnMCcgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwkJaWYgKHJlbWFpbiA8PSAwKQorCQkJcmV0dXJuIDA7CisJCSpwID0gJzAnOworCQlyZXR1cm4gMTsKKwl9CisJLyogZm9ybSBhIGJhY2t3YXJkcyBkZWNpbWFsIGFzY2lpIHN0cmluZyBpbiA8cz4gKi8KKwl3aGlsZSAobnVtID4gMCkgeworCQlpZiAoZGlnaXRzID49IChpbnQpIHNpemVvZihzKSkKKwkJCXJldHVybiAwOworCQlzW2RpZ2l0cysrXSA9IChudW0gJSAxMCkgKyAnMCc7CisJCW51bSA9IG51bSAvIDEwOworCX0KKwlpZiAocmVtYWluIDwgZGlnaXRzKSB7CisJCS8qIG5vdCBlbm91Z2ggcm9vbSBsZWZ0IGF0IDxwPiB0byBob2xkIG51bWJlciwgc28gZmlsbCB3aXRoCisJCSAqICc/JyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcmVtYWluOyBpKyssIHArKykKKwkJCSpwID0gJz8nOworCQlyZXR1cm4gcmVtYWluOworCX0KKwkvKiBwbHVnIGluIHRoZSBkZWNpbWFsIGFzY2lpIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG51bWJlciwgYnkgKi8KKwkvKiByZXZlcnNpbmcgdGhlIHN0cmluZyB3ZSBqdXN0IGJ1aWx0IGluIDxzPiAqLworCWkgPSBkaWdpdHM7CisJd2hpbGUgKGkgPiAwKSB7CisJCWktLTsKKwkJKnAgPSBzW2ldOworCQlwKys7CisJfQorCXJldHVybiBkaWdpdHM7Cit9CisKKy8qIFJlYWRzIDxkZXZJbmZvPiwgYW5kIGNvbnZlcnRzIGl0cyBjb250ZW50cyB0byBhIHByaW50YWJsZSBzdHJpbmcgYXQgPHA+LAorICogd3JpdGluZyBhdCBtb3N0IDxyZW1haW4+IGJ5dGVzLiAgTm90ZSB0aGVyZSBpcyBOTyAnXDAnIHRlcm1pbmF0aW9uCisgKiB3cml0dGVuIHRvIDxwPi4KKyAqCisgKiBQYXNzIDxkZXZpeD4gPj0gMCBpZiB5b3Ugd2FudCBhIGRldmljZSBpbmRleCBwcmVzZW50ZWQuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgorICovCitzdGF0aWMgaW5saW5lIGludAorVkJVU0NIQU5ORUxfZGV2SW5mb1RvU3RyaW5nQnVmZmVyKFVMVFJBX1ZCVVNfREVWSUNFSU5GTyBfX2lvbWVtICpkZXZJbmZvLAorCQkJCSAgY2hhciAqcCwgaW50IHJlbWFpbiwgaW50IGRldml4KQoreworCWNoYXIgX19pb21lbSAqcHNyYzsKKwlpbnQgbnNyYywgeCwgaSwgcGFkOworCWludCBjaGFycyA9IDA7CisKKwlwc3JjID0gJihkZXZJbmZvLT5kZXZUeXBlWzBdKTsKKwluc3JjID0gc2l6ZW9mKGRldkluZm8tPmRldlR5cGUpOworCWlmIChWQlVTQ0hBTk5FTF9zYW5pdGl6ZV9idWZmZXIoTlVMTCwgMCwgcHNyYywgbnNyYykgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBlbWl0IGRldmljZSBpbmRleCAqLworCWlmIChkZXZpeCA+PSAwKSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdbJywgcCwgcmVtYWluLCBjaGFycyk7CisJCXggPSBWQlVTQ0hBTk5FTF9pdG9hKHAsIHJlbWFpbiwgZGV2aXgpOworCQlwICs9IHg7CisJCXJlbWFpbiAtPSB4OworCQljaGFycyArPSB4OworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignXScsIHAsIHJlbWFpbiwgY2hhcnMpOworCX0gZWxzZSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJfQorCisJLyogZW1pdCBkZXZpY2UgdHlwZSAqLworCXggPSBWQlVTQ0hBTk5FTF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKKwlwICs9IHg7CisJcmVtYWluIC09IHg7CisJY2hhcnMgKz0geDsKKwlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZGV2aWNlIHR5cGUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLworCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJLyogZW1pdCBkcml2ZXIgbmFtZSAqLworCXBzcmMgPSAmKGRldkluZm8tPmRydk5hbWVbMF0pOworCW5zcmMgPSBzaXplb2YoZGV2SW5mby0+ZHJ2TmFtZSk7CisJeCA9IFZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihwLCByZW1haW4sIHBzcmMsIG5zcmMpOworCXAgKz0geDsKKwlyZW1haW4gLT0geDsKKwljaGFycyArPSB4OworCXBhZCA9IDE1IC0geDsJCS8qIHBhZCBkcml2ZXIgbmFtZSB0byBiZSBleGFjdGx5IDE1IGNoYXJzICovCisJZm9yIChpID0gMDsgaSA8IHBhZDsgaSsrKQorCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisKKwkvKiBlbWl0IHN0cmluZ3MgKi8KKwlwc3JjID0gJihkZXZJbmZvLT5pbmZvU3RyaW5nc1swXSk7CisJbnNyYyA9IHNpemVvZihkZXZJbmZvLT5pbmZvU3RyaW5ncyk7CisJeCA9IFZCVVNDSEFOTkVMX3Nhbml0aXplX2J1ZmZlcihwLCByZW1haW4sIHBzcmMsIG5zcmMpOworCXAgKz0geDsKKwlyZW1haW4gLT0geDsKKwljaGFycyArPSB4OworCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdcbicsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJcmV0dXJuIGNoYXJzOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92ZXJzaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjBlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIHZlcnNpb24uaCAqLworCisvKiAgQ29tbW9uIHZlcnNpb24vcmVsZWFzZSBpbmZvIG5lZWRlZCBieSBhbGwgY29tcG9uZW50cyBnb2VzIGhlcmUuCisgKiAgKFRoaXMgZmlsZSBtdXN0IGNvbXBpbGUgY2xlYW5seSBpbiBhbGwgZW52aXJvbm1lbnRzLikKKyAqICBVbHRpbWF0ZWx5LCB0aGlzIHdpbGwgYmUgY29tYmluZWQgd2l0aCBkZWZpbmVzIGdlbmVyYXRlZCBkeW5hbWljYWxseSBhcworICogIHBhcnQgb2YgdGhlIHN5c2dlbiwgYW5kIHNvbWUgb2YgdGhlIGRlZmluZXMgYmVsb3cgbWF5IGluIGZhY3QgZW5kIHVwCisgKiAgYmVpbmcgcmVwbGFjZWQgd2l0aCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgb25lcy4KKyAqLworI2lmbmRlZiBfX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fVkVSU0lPTl9IX18KKworI2RlZmluZSBTUEFSVkVSMSAiMSIKKyNkZWZpbmUgU1BBUlZFUjIgIjAiCisjZGVmaW5lIFNQQVJWRVIzICIwIgorI2RlZmluZSBTUEFSVkVSNCAiMCIKKworI2RlZmluZSAgVkVSU0lPTiAgICAgICAgU1BBUlZFUjEgIi4iIFNQQVJWRVIyICIuIiBTUEFSVkVSMyAiLiIgU1BBUlZFUjQKKyNkZWZpbmUgIFZFUlNJT05EQVRFICAgIF9fREFURV9fCisKKy8qIEhlcmUgYXJlIHZhcmlvdXMgdmVyc2lvbiBmb3JtcyBuZWVkZWQgaW4gV2luZG93cyBlbnZpcm9ubWVudHMuCisgKi8KKyNkZWZpbmUgVklTT1JfUFJPRFVDVFZFUlNJT04gICAgICBTUEFSVkVSQ09NTUEKKyNkZWZpbmUgVklTT1JfUFJPRFVDVFZFUlNJT05fU1RSICBTUEFSVkVSMSAiLiIgU1BBUlZFUjIgIi4iIFNQQVJWRVIzICIuIiBcCisJU1BBUlZFUjQKKyNkZWZpbmUgVklTT1JfT0JKRUNUVkVSU0lPTl9TVFIgICBTUEFSVkVSMSAiLCIgU1BBUlZFUjIgIiwiIFNQQVJWRVIzICIsIiBcCisJU1BBUlZFUjQKKworI2RlZmluZSAgQ09QWVJJR0hUICAgICAgIlVuaXN5cyBDb3Jwb3JhdGlvbiIKKyNkZWZpbmUgIENPUFlSSUdIVERBVEUgICIyMDEwIC0gMjAxMyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdm1jYWxsaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdm1jYWxsaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjNDA0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92bWNhbGxpbnRlcmZhY2UuaApAQCAtMCwwICsxLDE2NyBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0lPTU9OSU5URl9IX18KKyNkZWZpbmUgX19JT01PTklOVEZfSF9fCisKKy8qCisqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgc3RydWN0dXJlcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgVk1DQUxMcyBmb3IgSU8KKyogVmlydHVhbGl6YXRpb24uICBUaGUgVk1DQUxMcyBhcmUgcHJvdmlkZWQgYnkgTW9uaXRvciBhbmQgdXNlZCBieSBJTyBjb2RlCisqIHJ1bm5pbmcgb24gSU8gUGFydGl0aW9ucy4KKyovCisKKyNpZmRlZiBfX0dOVUNfXworI2luY2x1ZGUgImlvdm1jYWxsX2dudWMuaCIKKyNlbmRpZgkvKiAgKi8KKyNpbmNsdWRlICJkaWFnY2hhbm5lbC5oIgorCisjaWZkZWYgVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSCisjdW5kZWYgVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSCisjZW5kaWYJLyogICovCisKKy8qIGRlZmluZSBzdWJzeXN0ZW0gbnVtYmVyIGZvciBBcHBPUywgdXNlZCBpbiB1aXNsaWIgZHJpdmVyICAqLworI2RlZmluZSBNRFNfQVBQT1MgMHg0MDAwMDAwMDAwMDAwMDAwTAkvKiBzdWJzeXN0ZW0gPSA2MiAtIEFwcE9TICovCit0eXBlZGVmIGVudW0gewkJLyogVk1DQUxMIGlkZW50aWZpY2F0aW9uIHR1cGxlcyAgKi8KKwkgICAgLyogTm90ZTogd2hlbiBhIG5ldyBWTUNBTEwgaXMgYWRkZWQ6CisJICAgICAqIC0gdGhlIDFzdCAyIGhleCBkaWdpdHMgY29ycmVzcG9uZCB0byBvbmUgb2YgdGhlCisJICAgICAqICAgVk1DQUxMX01PTklUT1JfSU5URVJGQUNFIHR5cGVzIGFuZAorCSAgICAgKiAtIHRoZSBuZXh0IDIgaGV4IGRpZ2l0cyBhcmUgdGhlIG50aCByZWxhdGl2ZSBpbnN0YW5jZSBvZiB3aXRoaW4gYQorCSAgICAgKiAgIHR5cGUKKwkgICAgICogRS5HLiBmb3IgVk1DQUxMX1ZJUlRQQVJUX1JFQ1lDTEVfUEFSVCwKKwkgICAgICogLSB0aGUgMHgwMiBpZGVudGlmaWVzIGl0IGFzIGEgVk1DQUxMX1ZJUlRQQVJUIHR5cGUgYW5kCisJICAgICAqIC0gdGhlIDB4MDEgaWRlbnRpZmllcyBpdCBhcyB0aGUgMXN0IGluc3RhbmNlIG9mIGEgVk1DQUxMX1ZJUlRQQVJUCisJICAgICAqICAgdHlwZSBvZiBWTUNBTEwKKwkgICAgICovCisKKwlWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIgPSAweDA1MDEsCS8qIHVzZWQgYnkgYWxsIEd1ZXN0cywgbm90IGp1c3QKKwkJCQkJCSAqIElPICovCisJVk1DQUxMX0lPX0RJQUdfQUREUiA9IDB4MDUwOCwKKwlWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUiA9IDB4MDUwOSwKKwlWTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCA9IDB4MDcwOCwgLyogQWxsb3cgY2FsbGVyIHRvCisJCQkJCQkJICAqIHF1ZXJ5IHZpcnR1YWwgdGltZQorCQkJCQkJCSAgKiBvZmZzZXQgKi8KKwlWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIID0gMHgwNzA5LAorCVZNQ0FMTF9QT1NUX0NPREVfTE9HRVZFTlQgPSAweDA3MEIsCS8qIExPR0VWRU5UIFBvc3QgQ29kZSAoUkRYKSB3aXRoCisJCQkJCQkgKiBzcGVjaWZpZWQgc3Vic3lzdGVtIG1hc2sgKFJDWAorCQkJCQkJICogLSBtb25pdG9yX3N1YnN5c3RlbXMuaCkgYW5kCisJCQkJCQkgKiBzZXZlcml0eSAoUkRYKSAqLworCVZNQ0FMTF9HRU5FUklDX1NVUlJFTkRFUl9RVUFOVFVNX0ZPUkVWRVIgPSAweDA4MDIsIC8qIFlpZWxkIHRoZQorCQkJCQkJCSAgICAqIHJlbWFpbmRlciAmIGFsbAorCQkJCQkJCSAgICAqIGZ1dHVyZSBxdWFudHVtcyBvZgorCQkJCQkJCSAgICAqIHRoZSBjYWxsZXIgKi8KKwlWTUNBTExfTUVBU1VSRU1FTlRfRE9fTk9USElORyA9IDB4MDkwMSwKKwlWTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUUgPSAweDBhMDIJLyogQWxsb3cKKwkJCQkJCSAqIFVMVFJBX1NFUlZJQ0VfQ0FQQUJJTElUWV9USU1FCisJCQkJCQkgKiBjYXBhYmxlIGd1ZXN0IHRvIG1ha2UKKwkJCQkJCSAqIFZNQ0FMTCAqLworfSBWTUNBTExfTU9OSVRPUl9JTlRFUkZBQ0VfTUVUSE9EX1RVUExFOworCisjZGVmaW5lIFZNQ0FMTF9TVUNDRVNTIDAKKyNkZWZpbmUgVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KQkocmVzdWx0ID09IDApCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSB1bmlzeXNfdm1jYWxsKHR1cGxlLCByZWdfZWJ4LCByZWdfZWN4KSBcCisJX191bmlzeXNfdm1jYWxsX2dudWModHVwbGUsIHJlZ19lYngsIHJlZ19lY3gpCisjZGVmaW5lIHVuaXN5c19leHRlbmRlZF92bWNhbGwodHVwbGUsIHJlZ19lYngsIHJlZ19lY3gsIHJlZ19lZHgpIFwKKwlfX3VuaXN5c19leHRlbmRlZF92bWNhbGxfZ251Yyh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCwgcmVnX2VkeCkKKyNkZWZpbmUgSVNTVUVfSU9fVk1DQUxMKEludGVyZmFjZU1ldGhvZCwgcGFyYW0sIHJlc3VsdCkgXAorCShyZXN1bHQgPSB1bmlzeXNfdm1jYWxsKEludGVyZmFjZU1ldGhvZCwgKHBhcmFtKSAmIDB4RkZGRkZGRkYsCVwKKwkJCQkocGFyYW0pID4+IDMyKSkKKyNkZWZpbmUgSVNTVUVfSU9fRVhURU5ERURfVk1DQUxMKEludGVyZmFjZU1ldGhvZCwgcGFyYW0xLCBwYXJhbTIsCVwKKwkJCQkgcGFyYW0zLCByZXN1bHQpCQkJXAorCShyZXN1bHQgPSB1bmlzeXNfZXh0ZW5kZWRfdm1jYWxsKEludGVyZmFjZU1ldGhvZCwgcGFyYW0xLAlcCisJCQkJCSBwYXJhbTIsIHBhcmFtMykpCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHVzZXMgVk1DQUxMX1BPU1RfQ09ERV9MT0dFVkVOVCBpbnRlcmZhY2UgYnV0IGlzIGN1cnJlbnRseQorICAgICAqIG5vdCB1c2VkIG11Y2ggKi8KKyNkZWZpbmUgSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3Rjb2RlLCBzZXZlcml0eSkJCVwKK2RvIHsJCQkJCQkJCQlcCisJVTMyIF90ZW1wcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CQkJCVwKKwlJU1NVRV9JT19FWFRFTkRFRF9WTUNBTEwoVk1DQUxMX1BPU1RfQ09ERV9MT0dFVkVOVCwgc2V2ZXJpdHksCVwKKwkJCQkgTURTX0FQUE9TLCBwb3N0Y29kZSwgX3RlbXByZXN1bHQpOwlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIFN0cnVjdHVyZXMgZm9yIElPIFZNQ0FMTHMgKi8KKworLyogLy8vLy8vLy8vLy8vLyBCRUdJTiBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8vLy8vLy8vLy8vLyBPTkxZIFNUUlVDVCBUWVBFIFNIT1VMRCBCRSBCRUxPVyAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCitzdHJ1Y3QgcGh5c19pbmZvIHsKKwlVNjQgcGlfcGZuOworCVUxNiBwaV9vZmY7CisJVTE2IHBpX2xlbjsKK307CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCit0eXBlZGVmIHN0cnVjdCBwaHlzX2luZm8gSU9fREFUQV9TVFJVQ1RVUkU7CisKKy8qIC8vLy8vLy8vLy8vLy8gQkVHSU4gUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vLy8vLy8vLy8vLy8gT05MWSBTVFJVQ1QgVFlQRSBTSE9VTEQgQkUgQkVMT1cgKi8KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorLyogUGFyYW1ldGVycyB0byBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIgaW50ZXJmYWNlICovCit0eXBlZGVmIHN0cnVjdCBfVk1DQUxMX0lPX0NPTlRST0xWTV9BRERSX1BBUkFNUyB7CisJICAgIC8qIFRoZSBHdWVzdC1yZWxhdGl2ZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBDb250cm9sVm0gY2hhbm5lbC4KKwkgICAgKiBUaGlzIFZNQ2FsbCBmaWxscyB0aGlzIGluIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MuICovCisJVTY0IENoYW5uZWxBZGRyZXNzOwkvKiBjb250ZW50cyBwcm92aWRlZCBieSB0aGlzIFZNQ0FMTCAoT1VUKSAqLworCSAgICAvKiB0aGUgc2l6ZSBvZiB0aGUgQ29udHJvbFZtIGNoYW5uZWwgaW4gYnl0ZXMgVGhpcyBWTUNhbGwgZmlsbHMgdGhpcworCSAgICAqIGluIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MuICovCisJVTMyIENoYW5uZWxCeXRlczsJLyogY29udGVudHMgcHJvdmlkZWQgYnkgdGhpcyBWTUNBTEwgKE9VVCkgKi8KKwlVOCBVbnVzZWRbNF07CQkvKiBVbnVzZWQgQnl0ZXMgaW4gdGhlIDY0LUJpdCBBbGlnbmVkIFN0cnVjdCAqLworfSBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFJfUEFSQU1TOworCisjcHJhZ21hIHBhY2socG9wKQorLyogLy8vLy8vLy8vLy8vLyBFTkQgUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisvKiAvLy8vLy8vLy8vLy8vIEJFR0lOIFBSQUdNQSBQQUNLIFBVU0ggMSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiAvLy8vLy8vLy8vLy8vIE9OTFkgU1RSVUNUIFRZUEUgU0hPVUxEIEJFIEJFTE9XICovCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKy8qIFBhcmFtZXRlcnMgdG8gVk1DQUxMX0lPX0RJQUdfQUREUiBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IF9WTUNBTExfSU9fRElBR19BRERSX1BBUkFNUyB7CisJICAgIC8qIFRoZSBHdWVzdC1yZWxhdGl2ZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBkaWFnbm9zdGljIGNoYW5uZWwuCisJICAgICogVGhpcyBWTUNhbGwgZmlsbHMgdGhpcyBpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzLiAqLworCVU2NCBDaGFubmVsQWRkcmVzczsJLyogY29udGVudHMgcHJvdmlkZWQgYnkgdGhpcyBWTUNBTEwgKE9VVCkgKi8KK30gVk1DQUxMX0lPX0RJQUdfQUREUl9QQVJBTVM7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKy8qIC8vLy8vLy8vLy8vLy8gQkVHSU4gUFJBR01BIFBBQ0sgUFVTSCAxIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vLy8vLy8vLy8vLy8gT05MWSBTVFJVQ1QgVFlQRSBTSE9VTEQgQkUgQkVMT1cgKi8KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorLyogUGFyYW1ldGVycyB0byBWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUiBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IF9WTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUl9QQVJBTVMgeworCSAgICAvKiBUaGUgR3Vlc3QtcmVsYXRpdmUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc2VyaWFsIGNvbnNvbGUKKwkgICAgKiBjaGFubmVsLiAgVGhpcyBWTUNhbGwgZmlsbHMgdGhpcyBpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZQorCSAgICAqIGFkZHJlc3MuICovCisJVTY0IENoYW5uZWxBZGRyZXNzOwkvKiBjb250ZW50cyBwcm92aWRlZCBieSB0aGlzIFZNQ0FMTCAoT1VUKSAqLworfSBWTUNBTExfSU9fVklTT1JTRVJJQUxfQUREUl9QQVJBTVM7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiAvLy8vLy8vLy8vLy8vIEVORCBQUkFHTUEgUEFDSyBQVVNIIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKy8qIFBhcmFtZXRlcnMgdG8gVk1DQUxMX0NIQU5ORUxfTUlTTUFUQ0ggaW50ZXJmYWNlICovCit0eXBlZGVmIHN0cnVjdCBfVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMgeworCVU4IENoYW5uZWxOYW1lWzMyXTsJLyogTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBnaXZpbmcgbmFtZSBvZiBjaGFubmVsCisJCQkJICogKElOKSAqLworCVU4IEl0ZW1OYW1lWzMyXTsJLyogTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBnaXZpbmcgbmFtZSBvZgorCQkJCSAqIG1pc21hdGNoZWQgaXRlbSAoSU4pICovCisJVTMyIFNvdXJjZUxpbmVOdW1iZXI7CS8qIGxpbmUjIHdoZXJlIGludm9rZWQuIChJTikgKi8KKwlVOCBTb3VyY2VGaWxlTmFtZVszNl07CS8qIHNvdXJjZSBjb2RlIHdoZXJlIGludm9rZWQgLSBOdWxsIHRlcm1pbmF0ZWQKKwkJCQkgKiBzdHJpbmcgKElOKSAqLworfSBWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUzsKKworI2VuZGlmIC8qIF9fSU9NT05JTlRGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NvbW1vbnR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY29tbW9udHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjEyYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NvbW1vbnR5cGVzLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0NPTU1PTlRZUEVTX0hfCisjZGVmaW5lIF9DT01NT05UWVBFU19IXworCisvKiBkZWZpbmUgdGhlIGZvbGxvd2luZyB0byBwcmV2ZW50IGluY2x1ZGUgbmVzdGluZyBpbiBrZXJuZWwgaGVhZGVyIGZpbGVzIG9mCisgKiBzaW1pbGFyIGFicmV2aWF0ZWQgY29udGVudCAqLworI2RlZmluZSBfU1VQRVJWSVNPUl9DT01NT05UWVBFU19IXworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgVTggIHVpbnQ4X3QKKyNkZWZpbmUgVTE2IHVpbnQxNl90CisjZGVmaW5lIFUzMiB1aW50MzJfdAorI2RlZmluZSBVNjQgdWludDY0X3QKKyNkZWZpbmUgUzggIGludDhfdAorI2RlZmluZSBTMTYgaW50MTZfdAorI2RlZmluZSBTMzIgaW50MzJfdAorI2RlZmluZSBTNjQgaW50NjRfdAorCisjaWZkZWYgX19LRVJORUxfXworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorI2RlZmluZSBVSU5UTiBVMzIKKyNlbHNlCisjZGVmaW5lIFVJTlROIFU2NAorI2VuZGlmCisKKyNlbHNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBfX1dPUkRTSVpFID09IDMyCisjZGVmaW5lIFVJTlROIFUzMgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorI2RlZmluZSBVSU5UTiBVNjQKKyNlbHNlCisjZXJyb3IgVW5zdXBwb3J0ZWQgX19XT1JEU0laRQorI2VuZGlmCisKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIGRhdGExOworCVUxNiBkYXRhMjsKKwlVMTYgZGF0YTM7CisJVTggZGF0YTRbOF07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgR1VJRDsKKworI2lmbmRlZiBHVUlEMAorI2RlZmluZSBHVUlEMCB7MCwgMCwgMCwgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9IH0KKyNlbmRpZgordHlwZWRlZiBVNjQgR1VFU1RfUEhZU0lDQUxfQUREUkVTUzsKKworI2RlZmluZSBNRU1TRVQocHRyLCB2YWwsIGxlbikgbWVtc2V0KHB0ciwgdmFsLCBsZW4pCisjZGVmaW5lIE1FTUNNUChtMSwgbTIsIGxlbikgbWVtY21wKG0xLCBtMiwgbGVuKQorI2RlZmluZSBNRU1DTVBfSU8obTEsIG0yLCBsZW4pIG1lbWNtcCgodm9pZCBfX2ZvcmNlICopbTEsIG0yLCBsZW4pCisjZGVmaW5lIFNUUkxFTihzKSAoKFVJTlROKXN0cmxlbigoY29uc3QgY2hhciAqKXMpKQorI2RlZmluZSBTVFJDUFkoZCwgcykgKHN0cmNweSgoY2hhciAqKWQsIChjb25zdCBjaGFyICopcykpCisKKyNkZWZpbmUgSU5MSU5FIGlubGluZQorI2RlZmluZSBPRkZTRVRPRiBvZmZzZXRvZgorCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBNRU1PUllCQVJSSUVSIG1iKCkKKyNkZWZpbmUgTUVNQ1BZKGRlc3QsIHNyYywgbGVuKSBtZW1jcHkoZGVzdCwgc3JjLCBsZW4pCisjZGVmaW5lIE1FTUNQWV9UT0lPKGRlc3QsIHNyYywgbGVuKSBtZW1jcHlfdG9pbyhkZXN0LCBzcmMsIGxlbikKKyNkZWZpbmUgTUVNQ1BZX0ZST01JTyhkZXN0LCBzcmMsIGxlbikgbWVtY3B5X2Zyb21pbyhkZXN0LCBzcmMsIGxlbikKKworI2RlZmluZSBDSEFOTkVMX0dVSURfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXSwgczJbNTBdLCBzM1s1MF07CQkJCVwKKwkJcHJfZXJyKCJDaGFubmVsIG1pc21hdGNoIG9uIGNoYW5uZWw9JXMoJXMpIGZpZWxkPSVzIGV4cGVjdGVkPSVzIGFjdHVhbD0lcyBAJXM6JWRcbiIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgIEdVSURfZm9ybWF0MigmZXhwZWN0ZWQsIHMyKSwgR1VJRF9mb3JtYXQyKCZhY3R1YWwsIHMzKSwgXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIENIQU5ORUxfVTMyX01JU01BVENIKGNoVHlwZSwgY2hOYW1lLCBmaWVsZCwgZXhwZWN0ZWQsIGFjdHVhbCwgZmlsLCBcCisJCQkgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXTsJCQkJCQlcCisJCXByX2VycigiQ2hhbm5lbCBtaXNtYXRjaCBvbiBjaGFubmVsPSVzKCVzKSBmaWVsZD0lcyBleHBlY3RlZD0weCUtOC44bHggYWN0dWFsPTB4JS04LjhseCBAJXM6JWRcbiIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWV4cGVjdGVkLCAodW5zaWduZWQgbG9uZylhY3R1YWwsCVwKKwkJICAgICAgIGZpbCwgbGluKTsJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIENIQU5ORUxfVTY0X01JU01BVENIKGNoVHlwZSwgY2hOYW1lLCBmaWVsZCwgZXhwZWN0ZWQsIGFjdHVhbCwgZmlsLCBcCisJCQkgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXTsJCQkJCQlcCisJCXByX2VycigiQ2hhbm5lbCBtaXNtYXRjaCBvbiBjaGFubmVsPSVzKCVzKSBmaWVsZD0lcyBleHBlY3RlZD0weCUtOC44THggYWN0dWFsPTB4JS04LjhMeCBAJXM6JWRcbiIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZXhwZWN0ZWQsCQkJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhY3R1YWwsCQkJXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVWx0cmFMb2dFdmVudChsb2dDdHgsIEV2ZW50SWQsIFNldmVyaXR5LCBTdWJzeXN0ZW1NYXNrLCBwRnVuY3Rpb25OYW1lLCBcCisJCSAgICAgIExpbmVOdW1iZXIsIFN0ciwgYXJncy4uLikJCQkJXAorCXByX2luZm8oU3RyLCAjIyBhcmdzKQorCisjZWxzZQorI2RlZmluZSBNRU1DUFkoZGVzdCwgc3JjLCBsZW4pIG1lbWNweShkZXN0LCBzcmMsIGxlbikKKworI2RlZmluZSBNRU1PUllCQVJSSUVSIG1iKCkKKworI2RlZmluZSBDSEFOTkVMX0dVSURfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgIGxpbiwgbG9nQ3R4KQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyIHMxWzUwXSwgczJbNTBdLCBzM1s1MF07CQkJCVwKKwkJc3lzbG9nKExPR19VU0VSIHwgTE9HX0VSUiwJCQkJXAorCQkgICAgICAgIkNoYW5uZWwgbWlzbWF0Y2ggb24gY2hhbm5lbD0lcyglcykgZmllbGQ9JXMgZXhwZWN0ZWQ9JXMgYWN0dWFsPSVzIEAlczolZCIsIFwKKwkJICAgICAgIGNoTmFtZSwgR1VJRF9mb3JtYXQyKCZjaFR5cGUsIHMxKSwgZmllbGQsCVwKKwkJICAgICAgIEdVSURfZm9ybWF0MigmZXhwZWN0ZWQsIHMyKSwgR1VJRF9mb3JtYXQyKCZhY3R1YWwsIHMzKSwgXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hBTk5FTF9VMzJfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdOwkJCQkJCVwKKwkJc3lzbG9nKExPR19VU0VSIHwgTE9HX0VSUiwJCQkJXAorCQkgICAgICAgIkNoYW5uZWwgbWlzbWF0Y2ggb24gY2hhbm5lbD0lcyglcykgZmllbGQ9JXMgZXhwZWN0ZWQ9MHglLTguOGx4IGFjdHVhbD0weCUtOC44bHggQCVzOiVkIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpZXhwZWN0ZWQsICh1bnNpZ25lZCBsb25nKWFjdHVhbCwJXAorCQkgICAgICAgZmlsLCBsaW4pOwkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hBTk5FTF9VNjRfTUlTTUFUQ0goY2hUeXBlLCBjaE5hbWUsIGZpZWxkLCBleHBlY3RlZCwgYWN0dWFsLCBmaWwsIFwKKwkJCSAgICAgbGluLCBsb2dDdHgpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgczFbNTBdOwkJCQkJCVwKKwkJc3lzbG9nKExPR19VU0VSIHwgTE9HX0VSUiwJCQkJXAorCQkgICAgICAgIkNoYW5uZWwgbWlzbWF0Y2ggb24gY2hhbm5lbD0lcyglcykgZmllbGQ9JXMgZXhwZWN0ZWQ9MHglLTguOEx4IGFjdHVhbD0weCUtOC44THggQCVzOiVkIiwgXAorCQkgICAgICAgY2hOYW1lLCBHVUlEX2Zvcm1hdDIoJmNoVHlwZSwgczEpLCBmaWVsZCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylleHBlY3RlZCwJCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFjdHVhbCwJCQlcCisJCSAgICAgICBmaWwsIGxpbik7CQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVbHRyYUxvZ0V2ZW50KGxvZ0N0eCwgRXZlbnRJZCwgU2V2ZXJpdHksIFN1YnN5c3RlbU1hc2ssIHBGdW5jdGlvbk5hbWUsIFwKKwkJICAgICAgTGluZU51bWJlciwgU3RyLCBhcmdzLi4uKQkJCQlcCisJc3lzbG9nKExPR19VU0VSIHwgTE9HX0lORk8sIFN0ciwgIyMgYXJncykKKyNlbmRpZgorCisjZGVmaW5lIFZvbGF0aWxlQmFycmllcigpIE1FTU9SWUJBUlJJRVIKKworI2VuZGlmCisjaW5jbHVkZSAiZ3VpZHV0aWxzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3Vlc3RsaW51eGRlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3Vlc3RsaW51eGRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkZTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaApAQCAtMCwwICsxLDE4MiBAQAorLyogQ29weXJpZ2h0IMKpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0dVRVNUTElOVVhERUJVR19IX18KKyNkZWZpbmUgX19HVUVTVExJTlVYREVCVUdfSF9fCisKKy8qCisqIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0aW5nIGludGVyZmFjZSBmb3IgInZtY2FsbGludGVyZmFjZS5oIiwgcGFydGljdWFybHkKKyogcmVnYXJkaW5nIGFkZGluZyBhZGRpdGlvbmFsIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25hbGl0eSB0byBsaW51eAorKiBJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkgKi8KKworCisvKioqKioqKiBJTkZPIE9OIElTU1VFX1BPU1RDT0RFX0xJTlVYKCkgQkVMT1cgKioqKioqKi8KKyNpbmNsdWRlICJ2bWNhbGxpbnRlcmZhY2UuaCIKK3R5cGVkZWYgZW51bSB7CQkvKiBQT1NUQ09ERSBkcml2ZXIgaWRlbnRpZmllciB0dXBsZXMgKi8KKwkvKiB2aXNvcmNoaXBzZXQgZHJpdmVyIGZpbGVzICovCisJVklTT1JfQ0hJUFNFVF9QQyA9IDB4QTAsCisJVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fYyA9IDB4QTEsCisJVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fY20yID0gMHhBMiwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9kaXJlY3RfYyA9IDB4QTMsCisJVklTT1JfQ0hJUFNFVF9QQ19maWxlX2MgPSAweEE0LAorCVZJU09SX0NISVBTRVRfUENfcGFyc2VyX2MgPSAweEE1LAorCVZJU09SX0NISVBTRVRfUENfdGVzdGluZ19jID0gMHhBNiwKKwlWSVNPUl9DSElQU0VUX1BDX3Zpc29yY2hpcHNldF9tYWluX2MgPSAweEE3LAorCVZJU09SX0NISVBTRVRfUENfdmlzb3Jzd2l0Y2hidXNfYyA9IDB4QTgsCisJLyogdmlzb3JidXMgZHJpdmVyIGZpbGVzICovCisJVklTT1JfQlVTX1BDID0gMHhCMCwKKwlWSVNPUl9CVVNfUENfYnVzaW5zdF9hdHRyX2MgPSAweEIxLAorCVZJU09SX0JVU19QQ19jaGFubmVsX2F0dHJfYyA9IDB4QjIsCisJVklTT1JfQlVTX1BDX2Rldm1ham9ybWlub3JfYXR0cl9jID0gMHhCMywKKwlWSVNPUl9CVVNfUENfdmlzb3JidXNfbWFpbl9jID0gMHhCNCwKKwkvKiB2aXNvcmNsaWVudGJ1cyBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9DTElFTlRfQlVTX1BDID0gMHhDMCwKKwlWSVNPUl9DTElFTlRfQlVTX1BDX3Zpc29yY2xpZW50YnVzX21haW5fYyA9IDB4QzEsCisJLyogdmlydCBoYmEgZHJpdmVyIGZpbGVzICovCisJVklSVF9IQkFfUEMgPSAweEMyLAorCVZJUlRfSEJBX1BDX3ZpcnRoYmFfYyA9IDB4QzMsCisJLyogdmlydHBjaSBkcml2ZXIgZmlsZXMgKi8KKwlWSVJUX1BDSV9QQyA9IDB4QzQsCisJVklSVF9QQ0lfUENfdmlydHBjaV9jID0gMHhDNSwKKwkvKiB2aXJ0bmljIGRyaXZlciBmaWxlcyAqLworCVZJUlRfTklDX1BDID0gMHhDNiwKKwlWSVJUX05JQ19QX3ZpcnRuaWNfYyA9IDB4QzcsCisJLyogdWlzbGliIGRyaXZlciBmaWxlcyAqLworCVVJU0xJQl9QQyA9IDB4RDAsCisJVUlTTElCX1BDX3Vpc2xpYl9jID0gMHhEMSwKKwlVSVNMSUJfUENfdWlzcXVldWVfYyA9IDB4RDIsCisJVUlTTElCX1BDX3Vpc3RocmVhZF9jID0gMHhEMywKKwlVSVNMSUJfUENfdWlzdXRpbHNfYyA9IDB4RDQsCit9IERSSVZFUl9QQzsKKwordHlwZWRlZiBlbnVtIHsJCQkvKiBQT1NUQ09ERSBldmVudCBpZGVudGlmaWVyIHR1cGxlcyAqLworCUFUVEFDSF9QT1JUX0VOVFJZX1BDID0gMHgwMDEsCisJQVRUQUNIX1BPUlRfRkFJTFVSRV9QQyA9IDB4MDAyLAorCUFUVEFDSF9QT1JUX1NVQ0NFU1NfUEMgPSAweDAwMywKKwlCVVNfRkFJTFVSRV9QQyA9IDB4MDA0LAorCUJVU19DUkVBVEVfRU5UUllfUEMgPSAweDAwNSwKKwlCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDAwNiwKKwlCVVNfQ1JFQVRFX0VYSVRfUEMgPSAweDAwNywKKwlCVVNfQ09ORklHVVJFX0VOVFJZX1BDID0gMHgwMDgsCisJQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDID0gMHgwMDksCisJQlVTX0NPTkZJR1VSRV9FWElUX1BDID0gMHgwMEEsCisJQ0hJUFNFVF9JTklUX0VOVFJZX1BDID0gMHgwMEIsCisJQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMgPSAweDAwQywKKwlDSElQU0VUX0lOSVRfRkFJTFVSRV9QQyA9IDB4MDBELAorCUNISVBTRVRfSU5JVF9FWElUX1BDID0gMHgwMEUsCisJQ1JFQVRFX1dPUktRVUVVRV9QQyA9IDB4MDBGLAorCUNSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDID0gMHgwQTAsCisJQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQyA9IDB4MEExLAorCURFVklDRV9DUkVBVEVfRU5UUllfUEMgPSAweDBBMiwKKwlERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBBMywKKwlERVZJQ0VfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBBNCwKKwlERVZJQ0VfQ1JFQVRFX0VYSVRfUEMgPSAweDBBNSwKKwlERVZJQ0VfQUREX1BDID0gMHgwQTYsCisJREVWSUNFX1JFR0lTVEVSX0ZBSUxVUkVfUEMgPSAweDBBNywKKwlERVZJQ0VfQ0hBTkdFU1RBVEVfRU5UUllfUEMgPSAweDBBOCwKKwlERVZJQ0VfQ0hBTkdFU1RBVEVfRkFJTFVSRV9QQyA9IDB4MEE5LAorCURFVklDRV9DSEFOR0VTVEFURV9FWElUX1BDID0gMHgwQUEsCisJRFJJVkVSX0VOVFJZX1BDID0gMHgwQUIsCisJRFJJVkVSX0VYSVRfUEMgPSAweDBBQywKKwlNQUxMT0NfRkFJTFVSRV9QQyA9IDB4MEFELAorCVFVRVVFX0RFTEFZRURfV09SS19QQyA9IDB4MEFFLAorCVVJU0xJQl9USFJFQURfRkFJTFVSRV9QQyA9IDB4MEI3LAorCVZCVVNfQ0hBTk5FTF9FTlRSWV9QQyA9IDB4MEI4LAorCVZCVVNfQ0hBTk5FTF9GQUlMVVJFX1BDID0gMHgwQjksCisJVkJVU19DSEFOTkVMX0VYSVRfUEMgPSAweDBCQSwKKwlWSEJBX0NSRUFURV9FTlRSWV9QQyA9IDB4MEJCLAorCVZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBCQywKKwlWSEJBX0NSRUFURV9FWElUX1BDID0gMHgwQkQsCisJVkhCQV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEJFLAorCVZIQkFfQ09NTUFORF9IQU5ETEVSX1BDID0gMHgwQkYsCisJVkhCQV9QUk9CRV9FTlRSWV9QQyA9IDB4MEMwLAorCVZIQkFfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEMxLAorCVZIQkFfUFJPQkVfRVhJVF9QQyA9IDB4MEMyLAorCVZOSUNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzMsCisJVk5JQ19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEM0LAorCVZOSUNfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBDNSwKKwlWTklDX1BST0JFX0VOVFJZX1BDID0gMHgwQzYsCisJVk5JQ19QUk9CRV9GQUlMVVJFX1BDID0gMHgwQzcsCisJVk5JQ19QUk9CRV9FWElUX1BDID0gMHgwQzgsCisJVlBDSV9DUkVBVEVfRU5UUllfUEMgPSAweDBDOSwKKwlWUENJX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQ0EsCisJVlBDSV9DUkVBVEVfRVhJVF9QQyA9IDB4MENCLAorCVZQQ0lfUFJPQkVfRU5UUllfUEMgPSAweDBDQywKKwlWUENJX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDRCwKKwlWUENJX1BST0JFX0VYSVRfUEMgPSAweDBDRSwKKwlDUkFTSF9ERVZfRU5UUllfUEMgPSAweDBDRiwKKwlDUkFTSF9ERVZfRVhJVF9QQyA9IDB4MEQwLAorCUNSQVNIX0RFVl9IQUREUl9OVUxMID0gMHgwRDEsCisJQ1JBU0hfREVWX0NPTlRST0xWTV9OVUxMID0gMHgwRDIsCisJQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFX1BDID0gMHgwRDMsCisJQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDID0gMHgwRDQsCisJQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMgPSAweDBENSwKKwlDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQyA9IDB4MEQ2LAorCUNSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMgPSAweDBENywKKwlDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQyA9IDB4MEQ4LAorCVNBVkVfTVNHX0JVU19GQUlMVVJFX1BDID0gMHgwRDksCisJU0FWRV9NU0dfREVWX0ZBSUxVUkVfUEMgPSAweDBEQSwKKwlDQUxMSE9NRV9JTklUX0ZBSUxVUkVfUEMgPSAweDBEQgorfSBFVkVOVF9QQzsKKworI2lmZGVmIF9fR05VQ19fCisKKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfRVJSIERJQUdfU0VWRVJJVFlfRVJSCisjZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX1dBUk5JTkcgRElBR19TRVZFUklUWV9XQVJOSU5HCisjZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8gRElBR19TRVZFUklUWV9QUklOVAkvKiBUT0RPLT4gSW5mbyBjdXJyZW50bHkKKwkJCQkJCQkgKiBkb2VzbnQgc2hvdywgc28gd2UKKwkJCQkJCQkgKiBzZXQgaW5mbz13YXJuaW5nICovCisvKiBleGFtcGxlIGNhbGwgb2YgUE9TVENPREVfTElOVVhfMihWSVNPUl9DSElQU0VUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworICogUGxlYXNlIGFsc28gbm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgcG9zdGNvZGUgaXMgaW4gaGV4LCBzbyBpZiB5b3UgYXJlCisgKiBzZWFyY2hpbmcgZm9yIHRoZSBfX0xJTkVfXyBudW1iZXIsIGNvbnZlcnQgaXQgZmlyc3QgdG8gZGVjaW1hbC4gIFRoZSBsaW5lCisgKiBudW1iZXIgY29tYmluZWQgd2l0aCBkcml2ZXIgYW5kIHR5cGUgb2YgY2FsbCwgd2lsbCBhbGxvdyB5b3UgdG8gdHJhY2sgZG93bgorICogZXhhY3RseSB3aGF0IGxpbmUgYW4gZXJyb3Igb2NjdXJlZCBvbiwgb3Igd2hlcmUgdGhlIGxhc3QgZHJpdmVyCisgKiBlbnRlcmVkL2V4aXRlZCBmcm9tLgorICovCisKKy8qIEJBU0UgRlVOQ1RJT05TICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYX0EoRFJJVkVSX1BDLCBFVkVOVF9QQywgcGMzMmJpdCwgc2V2ZXJpdHkpCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHBvc3RfY29kZV90ZW1wOwkJCQlcCisJcG9zdF9jb2RlX3RlbXAgPSAoKChVNjQpRFJJVkVSX1BDKSA8PCA1NikgfCAoKChVNjQpRVZFTlRfUEMpIDw8IDQ0KSB8IFwKKwkJKCgoKFU2NClfX0xJTkVfXykgJiAweEZGRikgPDwgMzIpIHwJCQlcCisJCSgoKFU2NClwYzMyYml0KSAmIDB4RkZGRkZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUE9TVENPREVfTElOVVhfQihEUklWRVJfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KSBcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyBwb3N0X2NvZGVfdGVtcDsJCQkJXAorCXBvc3RfY29kZV90ZW1wID0gKCgoVTY0KURSSVZFUl9QQykgPDwgNTYpIHwgKCgoVTY0KUVWRU5UX1BDKSA8PCA0NCkgfCBcCisJCSgoKChVNjQpX19MSU5FX18pICYgMHhGRkYpIDw8IDMyKSB8CQkJXAorCQkoKCgoVTY0KXBjMTZiaXQxKSAmIDB4RkZGRikgPDwgMTYpIHwJCQlcCisJCSgoKFU2NClwYzE2Yml0MikgJiAweEZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKy8qIE1PU1QgQ09NTU9OICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzIoRVZFTlRfUEMsIHNldmVyaXR5KQkJCQlcCisJUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCAweDAwMDAsIHNldmVyaXR5KTsKKworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8zKEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkJCQlcCisJUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSk7CisKKworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF80KEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KQlcCisJUE9TVENPREVfTElOVVhfQihDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwJCVwKKwkJCSBwYzE2Yml0Miwgc2V2ZXJpdHkpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1aWR1dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1aWR1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2FmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3VpZHV0aWxzLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qIENvcHlyaWdodCDCqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIGd1aWR1dGlscy5oCisgKgorICogVGhlc2UgYXJlIEdVSUQgbWFuaXB1bGF0aW9uIGlubGluZXMgdGhhdCBjYW4gYmUgdXNlZCBmcm9tIGVpdGhlcgorICoga2VybmVsLW1vZGUgb3IgdXNlci1tb2RlLgorICoKKyAqLworI2lmbmRlZiBfX0dVSURVVElMU19IX18KKyNkZWZpbmUgX19HVUlEVVRJTFNfSF9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNkZWZpbmUgR1VJRF9TVFJUT1VMIGtzdHJ0b3VsCisjZWxzZQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBHVUlEX1NUUlRPVUwgc3RydG91bAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitHVUlEX2Zvcm1hdDEoY29uc3QgR1VJRCAqZ3VpZCwgY2hhciAqcykKK3sKKwlzcHJpbnRmKHMsICJ7JS04LjhseC0lLTQuNHgtJS00LjR4LSUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeCUtMi4yeH0iLAorCQkodWxvbmcpIGd1aWQtPmRhdGExLAorCQlndWlkLT5kYXRhMiwKKwkJZ3VpZC0+ZGF0YTMsCisJCWd1aWQtPmRhdGE0WzBdLAorCQlndWlkLT5kYXRhNFsxXSwKKwkJZ3VpZC0+ZGF0YTRbMl0sCisJCWd1aWQtPmRhdGE0WzNdLAorCQlndWlkLT5kYXRhNFs0XSwgZ3VpZC0+ZGF0YTRbNV0sIGd1aWQtPmRhdGE0WzZdLCBndWlkLT5kYXRhNFs3XSk7CisJcmV0dXJuIHM7Cit9CisKKy8qKiBGb3JtYXQgYSBHVUlEIGluIE1pY3Jvc29mdCdzICd3aGF0IGluIHRoZSB3b3JsZCB3ZXJlIHRoZXkgdGhpbmtpbmcnCisgKiAgZm9ybWF0LgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorR1VJRF9mb3JtYXQyKGNvbnN0IEdVSUQgKmd1aWQsIGNoYXIgKnMpCit7CisJc3ByaW50ZihzLCAieyUtOC44bHgtJS00LjR4LSUtNC40eC0lLTIuMnglLTIuMngtJS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4fSIsCisJCSh1bG9uZykgZ3VpZC0+ZGF0YTEsCisJCWd1aWQtPmRhdGEyLAorCQlndWlkLT5kYXRhMywKKwkJZ3VpZC0+ZGF0YTRbMF0sCisJCWd1aWQtPmRhdGE0WzFdLAorCQlndWlkLT5kYXRhNFsyXSwKKwkJZ3VpZC0+ZGF0YTRbM10sCisJCWd1aWQtPmRhdGE0WzRdLCBndWlkLT5kYXRhNFs1XSwgZ3VpZC0+ZGF0YTRbNl0sIGd1aWQtPmRhdGE0WzddKTsKKwlyZXR1cm4gczsKK30KKworLyoqCisgKiBMaWtlIEdVSURfZm9ybWF0MiBidXQgd2l0aG91dCB0aGUgY3VybHkgYnJhY2VzIGFuZCB0aGUKKyAqIGhleCBkaWdpdHMgaW4gdXBwZXIgY2FzZQorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorR1VJRF9mb3JtYXQzKGNvbnN0IEdVSUQgKmd1aWQsIGNoYXIgKnMpCit7CisJc3ByaW50ZihzLCAiJS04LjhsWC0lLTQuNFgtJS00LjRYLSUtMi4yWCUtMi4yWC0lLTIuMlglLTIuMlglLTIuMlglLTIuMlglLTIuMlglLTIuMlgiLAorCQkodWxvbmcpIGd1aWQtPmRhdGExLAorCQlndWlkLT5kYXRhMiwKKwkJZ3VpZC0+ZGF0YTMsCisJCWd1aWQtPmRhdGE0WzBdLAorCQlndWlkLT5kYXRhNFsxXSwKKwkJZ3VpZC0+ZGF0YTRbMl0sCisJCWd1aWQtPmRhdGE0WzNdLAorCQlndWlkLT5kYXRhNFs0XSwgZ3VpZC0+ZGF0YTRbNV0sIGd1aWQtPmRhdGE0WzZdLCBndWlkLT5kYXRhNFs3XSk7CisJcmV0dXJuIHM7Cit9CisKKy8qKiBQYXJzZSBhIGd1aWQgc3RyaW5nIGluIGFueSBvZiB0aGVzZSBmb3JtczoKKyAqICAgICAgezExMTExMTExLTIyMjItMzMzMy00NDU1LTY2Nzc4ODk5YWFiYn0KKyAqICAgICAgezExMTExMTExLTIyMjItMzMzMy00NDU1NjY3Nzg4OTlhYWJifQorICogICAgICAxMTExMTExMS0yMjIyLTMzMzMtNDQ1NS02Njc3ODg5OWFhYmIKKyAqICAgICAgMTExMTExMTEtMjIyMi0zMzMzLTQ0NTU2Njc3ODg5OWFhYmIKKyAqLworc3RhdGljIGlubGluZSBHVUlECitHVUlEX3NjYW4oVTggKnApCit7CisJR1VJRCBndWlkID0gR1VJRDA7CisJVTggeFszM107CisJaW50IGNvdW50ID0gMDsKKwlpbnQgYywgaSA9IDA7CisJVTggY2RhdGExWzldOworCVU4IGNkYXRhMls1XTsKKwlVOCBjZGF0YTNbNV07CisJVTggY2RhdGE0WzNdOworCWludCBkYXNoY291bnQgPSAwOworCWludCBicmFjZSA9IDA7CisJdW5zaWduZWQgbG9uZyB1bGRhdGE7CisKKwlpZiAoIXApCisJCXJldHVybiBndWlkOworCWlmICgqcCA9PSAneycpIHsKKwkJcCsrOworCQlicmFjZSA9IDE7CisJfQorCXdoaWxlIChjb3VudCA8IDMyKSB7CisJCWlmICgqcCA9PSAnfScpCisJCQlyZXR1cm4gZ3VpZDsKKwkJaWYgKCpwID09ICdcMCcpCisJCQlyZXR1cm4gZ3VpZDsKKwkJYyA9IHRvdXBwZXIoKnApOworCQlwKys7CisJCWlmIChjID09ICctJykgeworCQkJc3dpdGNoIChkYXNoY291bnQpIHsKKwkJCWNhc2UgMDoKKwkJCQlpZiAoaSAhPSA4KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlpZiAoaSAhPSA0KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpZiAoaSAhPSA0KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlpZiAoaSAhPSA0KQorCQkJCQlyZXR1cm4gZ3VpZDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGd1aWQ7CisJCQl9CisJCQlkYXNoY291bnQrKzsKKwkJCWkgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSkKKwkJCWkrKzsKKwkJZWxzZQorCQkJcmV0dXJuIGd1aWQ7CisJCXhbY291bnQrK10gPSBjOworCX0KKwl4W2NvdW50XSA9ICdcMCc7CisJaWYgKGJyYWNlKSB7CisJCWlmICgqcCA9PSAnfScpCisJCQlwKys7CisJCWVsc2UKKwkJCXJldHVybiBndWlkOworCX0KKwlpZiAoZGFzaGNvdW50ID09IDMgfHwgZGFzaGNvdW50ID09IDQpCisJCTsKKwllbHNlCisJCXJldHVybiBndWlkOworCW1lbXNldChjZGF0YTEsIDAsIHNpemVvZihjZGF0YTEpKTsKKwltZW1zZXQoY2RhdGEyLCAwLCBzaXplb2YoY2RhdGEyKSk7CisJbWVtc2V0KGNkYXRhMywgMCwgc2l6ZW9mKGNkYXRhMykpOworCW1lbXNldChjZGF0YTQsIDAsIHNpemVvZihjZGF0YTQpKTsKKwltZW1jcHkoY2RhdGExLCB4ICsgMCwgOCk7CisJbWVtY3B5KGNkYXRhMiwgeCArIDgsIDQpOworCW1lbWNweShjZGF0YTMsIHggKyAxMiwgNCk7CisKKwlpZiAoR1VJRF9TVFJUT1VMKChjaGFyICopIGNkYXRhMSwgMTYsICZ1bGRhdGEpID09IDApCisJCWd1aWQuZGF0YTEgPSAoVTMyKXVsZGF0YTsKKwlpZiAoR1VJRF9TVFJUT1VMKChjaGFyICopIGNkYXRhMiwgMTYsICZ1bGRhdGEpID09IDApCisJCWd1aWQuZGF0YTIgPSAoVTE2KXVsZGF0YTsKKwlpZiAoR1VJRF9TVFJUT1VMKChjaGFyICopIGNkYXRhMywgMTYsICZ1bGRhdGEpID09IDApCisJCWd1aWQuZGF0YTMgPSAoVTE2KXVsZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbWVtY3B5KGNkYXRhNCwgeCArIDE2ICsgKGkgKiAyKSwgMik7CisJCWlmIChHVUlEX1NUUlRPVUwoKGNoYXIgKikgY2RhdGE0LCAxNiwgJnVsZGF0YSkgPT0gMCkKKwkJCWd1aWQuZGF0YTRbaV0gPSAoVTgpIHVsZGF0YTsKKwl9CisKKwlyZXR1cm4gZ3VpZDsKK30KKworc3RhdGljIGlubGluZSBjaGFyICoKK0dVSURfc2FuaXRpemUoY2hhciAqaW5wdXRHdWlkU3RyLCBjaGFyICpvdXRwdXRHdWlkU3RyKQoreworCUdVSUQgZzsKKwlHVUlEIGd1aWQwID0gR1VJRDA7CisJKm91dHB1dEd1aWRTdHIgPSAnXDAnOworCWcgPSBHVUlEX3NjYW4oKFU4ICopIGlucHV0R3VpZFN0cik7CisJaWYgKG1lbWNtcCgmZywgJmd1aWQwLCBzaXplb2YoR1VJRCkpID09IDApCisJCXJldHVybiBvdXRwdXRHdWlkU3RyOwkvKiBiYWQgR1VJRCBmb3JtYXQgKi8KKwlyZXR1cm4gR1VJRF9mb3JtYXQxKCZnLCBvdXRwdXRHdWlkU3RyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3BlcmlvZGljX3dvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzcxOTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3BlcmlvZGljX3dvcmsuaApAQCAtMCwwICsxLDQwIEBACisvKiBwZXJpb2RpY193b3JrLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19QRVJJT0RJQ19XT1JLX0hfXworI2RlZmluZSBfX1BFUklPRElDX1dPUktfSF9fCisKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorCisKKworLyogUEVSSU9ESUNfV09SSyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgorICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUEVSSU9ESUNfV09SS19UYWcgUEVSSU9ESUNfV09SSzsKKworUEVSSU9ESUNfV09SSyAqdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCisJCQkJCSAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZSwKKwkJCQkJICB2b2lkICgqd29ya2Z1bmMpKHZvaWQgKiksCisJCQkJCSAgdm9pZCAqd29ya2Z1bmNhcmcsCisJCQkJCSAgY29uc3QgY2hhciAqZGV2bmFtKTsKK3ZvaWQgICAgICAgICAgICB2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3koUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayk7CitCT09MICAgICAgICAgICAgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspOworQk9PTCAgICAgICAgICAgIHZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayk7CitCT09MICAgICAgICAgICAgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wcm9jb2JqZWN0dHJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxZDExMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wcm9jb2JqZWN0dHJlZS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIHByb2NvYmplY3R0cmVlLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgVGhpcyBkZXNjcmliZXMgdGhlIGludGVyZmFjZXMgbmVjZXNzYXJ5IGZvciBjcmVhdGluZyBhIHRyZWUgb2YgdHlwZXMsCisgKiAgb2JqZWN0cywgYW5kIHByb3BlcnRpZXMgaW4gL3Byb2MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19QUk9DT0JKRUNUVFJFRV9IX18KKyNkZWZpbmUgX19QUk9DT0JKRUNUVFJFRV9IX18KKworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorCisvKiBUaGVzZSBhcmUgb3BhcXVlIHN0cnVjdHVyZXMgdG8gdXNlcnMuCisgKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBNWVBST0NPQkpFQ1RfVGFnIE1ZUFJPQ09CSkVDVDsKK3R5cGVkZWYgc3RydWN0IE1ZUFJPQ1RZUEVfVGFnICAgTVlQUk9DVFlQRTsKKworTVlQUk9DT0JKRUNUICp2aXNvcl9wcm9jX0NyZWF0ZU9iamVjdChNWVBST0NUWVBFICp0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIHZvaWQgKmNvbnRleHQpOwordm9pZCAgICAgICAgICB2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QoTVlQUk9DT0JKRUNUICpvYmopOworTVlQUk9DVFlQRSAgICp2aXNvcl9wcm9jX0NyZWF0ZVR5cGUoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jUm9vdERpciwKKwkJCQkgICAgY29uc3QgY2hhciAqKm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eU5hbWVzLAorCQkJCSAgICB2b2lkICgqc2hvd19wcm9wZXJ0eSkoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJICB2b2lkICosIGludCkpOwordm9pZCAgICAgICAgICB2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKE1ZUFJPQ1RZUEUgKnR5cGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9zcGFyc3RvcC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3NwYXJzdG9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwM2FjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9zcGFyc3RvcC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHNwYXJzdG9wLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19TUEFSU1RPUF9IX18KKyNkZWZpbmUgX19TUEFSU1RPUF9IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKK3R5cGVkZWYgdm9pZCAoKlNQQVJTVE9QX0NPTVBMRVRFX0ZVTkMpICh2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKTsKKworaW50IHNwX3N0b3Aodm9pZCAqY29udGV4dCwgU1BBUlNUT1BfQ09NUExFVEVfRlVOQyBnZXRfY29tcGxldGVfZnVuYyk7Cit2b2lkIHRlc3RfcmVtb3ZlX3N0b3BfZGV2aWNlKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkNWFkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCkBAIC0wLDAgKzEsMzI0IEBACisvKiB0aW1za21vZC5oCisgKgorICogQ29weXJpZ2h0IO+/vSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19USU1TS01PRF9IX18KKyNkZWZpbmUgX19USU1TS01PRF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisvKiAjZGVmaW5lIEVYUE9SVF9TWU1UQUIgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworLyogI2RlZmluZSBERUJVRyAqLworI2lmbmRlZiBCT09MCisjZGVmaW5lIEJPT0wgICAgaW50CisjZW5kaWYKKyNkZWZpbmUgRkFMU0UgICAwCisjZGVmaW5lIFRSVUUgICAgMQorI2lmICFkZWZpbmVkIFNVQ0NFU1MKKyNkZWZpbmUgU1VDQ0VTUyAwCisjZW5kaWYKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisjZGVmaW5lIERSSVZFUk5BTUVNQVggNTAKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIE1BWChhLCBiKSAgICAgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBTVFJVQ1RTRVFVQUwoeCwgeSkgKG1lbWNtcCgmeCwgJnksIHNpemVvZih4KSkgPT0gMCkKKyNpZm5kZWYgSE9TVEFERFJFU1MKKyNkZWZpbmUgSE9TVEFERFJFU1MgdW5zaWduZWQgbG9uZyBsb25nCisjZW5kaWYKKwordHlwZWRlZiBsb25nIFZNTUlPOyAgLyoqPCBWaXJ0dWFsIE1NSU8gYWRkcmVzcyAocmV0dXJuZWQgZnJvbSBpb3JlbWFwKSwgd2hpY2gKKyAgICAqICAgaXMgYSB2aXJ0dWFsIGFkZHJlc3MgcG9pbnRlciB0byBhIG1lbW9yeS1tYXBwZWQgcmVnaW9uLgorICAgICogICBUaGVzZSBhcmUgZGVjbGFyZWQgYXMgImxvbmciIGluc3RlYWQgb2YgdTMyKiB0byBmb3JjZSB5b3UgdG8KKyAgICAqICAgdXNlIHJlYWRiKCkvd3JpdGViKCkvbWVtY3B5X2Zyb21pbygpL2V0YyB0byBhY2Nlc3MgdGhlbS4KKyAgICAqICAgKE9uIHg4NiB3ZSBjb3VsZCBwcm9iYWJseSBnZXQgYXdheSB3aXRoIHRyZWF0aW5nIHRoZW0gYXMKKyAgICAqICAgcG9pbnRlcnMuKQorICAgICovCit0eXBlZGVmIGxvbmcgVk1NSU84OyAvKio8ICNWTU1JTyBwb2ludGluZyB0byAgOC1iaXQgZGF0YSAqLwordHlwZWRlZiBsb25nIFZNTUlPMTY7LyoqPCAjVk1NSU8gcG9pbnRpbmcgdG8gMTYtYml0IGRhdGEgKi8KK3R5cGVkZWYgbG9uZyBWTU1JTzMyOy8qKjwgI1ZNTUlPIHBvaW50aW5nIHRvIDMyLWJpdCBkYXRhICovCisKKyNkZWZpbmUgTE9DS1NFTShzZW0pICAgICAgICAgICAgICAgICAgIGRvd25faW50ZXJydXB0aWJsZShzZW0pCisjZGVmaW5lIExPQ0tTRU1fVU5JTlRFUlJVUFRJQkxFKHNlbSkgICBkb3duKHNlbSkKKyNkZWZpbmUgVU5MT0NLU0VNKHNlbSkgICAgICAgICAgICAgICAgIHVwKHNlbSkKKworLyoqIGxvY2sgcmVhZC93cml0ZSBzZW1hcGhvcmUgZm9yIHJlYWRpbmcuCisgICAgTm90ZSB0aGF0IGFsbCByZWFkL3dyaXRlIHNlbWFwaG9yZXMgYXJlIG9mIHRoZSAidW5pbnRlcnJ1cHRpYmxlIiB2YXJpZXR5LgorICAgIEBwYXJhbSBzZW0gKHJ3X3NlbWFwaG9yZSAqKSBwb2ludHMgdG8gc2VtYXBob3JlIHRvIGxvY2sKKyAqLworI2RlZmluZSBMT0NLUkVBRFNFTShzZW0pICAgICAgICAgICAgICAgZG93bl9yZWFkKHNlbSkKKworLyoqIHVubG9jayByZWFkL3dyaXRlIHNlbWFwaG9yZSBmb3IgcmVhZGluZy4KKyAgICBOb3RlIHRoYXQgYWxsIHJlYWQvd3JpdGUgc2VtYXBob3JlcyBhcmUgb2YgdGhlICJ1bmludGVycnVwdGlibGUiIHZhcmlldHkuCisgICAgQHBhcmFtIHNlbSAocndfc2VtYXBob3JlICopIHBvaW50cyB0byBzZW1hcGhvcmUgdG8gdW5sb2NrCisgKi8KKyNkZWZpbmUgVU5MT0NLUkVBRFNFTShzZW0pICAgICAgICAgICAgIHVwX3JlYWQoc2VtKQorCisvKiogbG9jayByZWFkL3dyaXRlIHNlbWFwaG9yZSBmb3Igd3JpdGluZy4KKyAgICBOb3RlIHRoYXQgYWxsIHJlYWQvd3JpdGUgc2VtYXBob3JlcyBhcmUgb2YgdGhlICJ1bmludGVycnVwdGlibGUiIHZhcmlldHkuCisgICAgQHBhcmFtIHNlbSAocndfc2VtYXBob3JlICopIHBvaW50cyB0byBzZW1hcGhvcmUgdG8gbG9jaworICovCisjZGVmaW5lIExPQ0tXUklURVNFTShzZW0pICAgICAgICAgICAgICBkb3duX3dyaXRlKHNlbSkKKworLyoqIHVubG9jayByZWFkL3dyaXRlIHNlbWFwaG9yZSBmb3Igd3JpdGluZy4KKyAgICBOb3RlIHRoYXQgYWxsIHJlYWQvd3JpdGUgc2VtYXBob3JlcyBhcmUgb2YgdGhlICJ1bmludGVycnVwdGlibGUiIHZhcmlldHkuCisgICAgQHBhcmFtIHNlbSAocndfc2VtYXBob3JlICopIHBvaW50cyB0byBzZW1hcGhvcmUgdG8gdW5sb2NrCisgKi8KKyNkZWZpbmUgVU5MT0NLV1JJVEVTRU0oc2VtKSAgICAgICAgICAgIHVwX3dyaXRlKHNlbSkKKworI2lmZGVmIEVOQUJMRV9SRVRVUk5fVFJBQ0UKKyNkZWZpbmUgUkVUVFJBQ0UoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7CQkJCQkJICAgICAgIFwKKwkJaWYgKDEpIHsJCQkJICAgICAgIFwKKwkJCUlORk9EUlYoIlJFVCAweCVseCBpbiAlcyIsCSAgICAgICBcCisJCQkJKHVsb25nKSh4KSwgX19mdW5jX18pOyAgICAgXAorCQl9CQkJCQkgICBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFJFVFRSQUNFKHgpCisjZW5kaWYKKworLyoqIFRyeSB0byBldmF1bGF0ZSB0aGUgcHJvdmlkZWQgZXhwcmVzc2lvbiwgYW5kIGRvIGEgUkVUSU5UKHgpIGlmZgorICogIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byA8IDAuCisgKiAgQHBhcmFtIHggdGhlIGV4cHJlc3Npb24gdG8gdHJ5CisgKi8KKyNkZWZpbmUgQVNTRVJUKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7IGlmICghKGNvbmQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJSFVIRFJWKCJBU1NFUlQgZmFpbGVkIC0gJXMiLAkgICAgICAgXAorCQkJICAgICAgIF9fc3RyaW5naWZ5KGNvbmQpKTsJICAgICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHNpemVvZm1lbWJlcihUWVBFLCBNRU1CRVIpIChzaXplb2YoKChUWVBFICopMCktPk1FTUJFUikpCisvKiogIkNvdmVyZWQgcXVvdGllbnQiIGZ1bmN0aW9uICovCisjZGVmaW5lIENPVlEodiwgZCkgICgoKHYpICsgKGQpIC0gMSkgLyAoZCkpCisjZGVmaW5lIFNXQVBQT0lOVEVSUyhwMSwgcDIpCQkJCVwKKwlkbyB7CQkJCQkJXAorCQl2b2lkICpTV0FQUE9JTlRFUlNfVEVNUCA9ICh2b2lkICopcDE7CVwKKwkJKHZvaWQgKikocDEpID0gKHZvaWQgKikocDIpOyAgICAgICAgICAgIFwKKwkJKHZvaWQgKikocDIpID0gU1dBUFBPSU5URVJTX1RFTVA7CVwKKwl9IHdoaWxlICgwKQorCisvKioKKyAqICBAYWRkdG9ncm91cCBkcml2ZXJsb2dnaW5nCisgKiAgQHsKKyAqLworCisjZGVmaW5lIFBSSU5US0RSVihmbXQsIGFyZ3MuLi4pIExPR0lORihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFRCRERSVihmbXQsIGFyZ3MuLi4pICAgIExPR0VSUihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIEhVSERSVihmbXQsIGFyZ3MuLi4pICAgIExPR0VSUihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIEVSUkRSVihmbXQsIGFyZ3MuLi4pICAgIExPR0VSUihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFdBUk5EUlYoZm10LCBhcmdzLi4uKSAgIExPR1dSTihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNFQ1VSRURSVihmbXQsIGFyZ3MuLi4pIExPR1dSTihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIElORk9EUlYoZm10LCBhcmdzLi4uKSAgIExPR0lORihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIERFQlVHRFJWKGZtdCwgYXJncy4uLikgIERCR0lORihmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgUFJJTlRLREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgIExPR0lORkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFRCRERFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICBMT0dFUlJERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBIVUhERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgTE9HRVJSREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgRVJSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgIExPR0VSUkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIEVSUkRFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikJICBMT0dFUlJERVZYKGRldm5vLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFdBUk5ERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICBMT0dXUk5ERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBTRUNVUkVERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgTE9HV1JOREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgSU5GT0RFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgIExPR0lORkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIElORk9ERVZYKGRldm5vLCBmbXQsIGFyZ3MuLi4pICAgICBMT0dJTkZERVZYKGRldm5vLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIERFQlVHREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICBEQkdJTkZERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQorCisKKy8qIEB9ICovCisKKy8qKiBWZXJpZmllcyB0aGUgY29uc2lzdGVuY3kgb2YgeW91ciBQUklWQVRFREVWSUNFREFUQSBzdHJ1Y3R1cmUgdXNpbmcKKyAqICBjb252ZW50aW9uYWwgInNpZ25hdHVyZSIgZmllbGRzOgorICogIDxwPgorICogIC0gc2lnMSBzaG91bGQgY29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCisgKiAgLSBzaWcyIHNob3VsZCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSBERExPT0tTVkFMSUQoZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoKGRkICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJglcCisJCSAoKGRkKS0+c2lnMSA9PSBzaXplb2YoUFJJVkFURURFVklDRURBVEEpKSAmJglcCisJCSAoKGRkKS0+c2lnMiA9PSBkZCkpCisKKy8qKiBWZXJpZmllcyB0aGUgY29uc2lzdGVuY3kgb2YgeW91ciBQUklWQVRFRklMRURBVEEgc3RydWN0dXJlIHVzaW5nCisgKiAgY29udmVudGlvbmFsICJzaWduYXR1cmUiIGZpZWxkczoKKyAqICA8cD4KKyAqICAtIHNpZzEgc2hvdWxkIGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZQorICogIC0gc2lnMiBzaG91bGQgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgRkRMT09LU1ZBTElEKGZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKChmZCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICAgICBcCisJICgoZmQpLT5zaWcxID09IHNpemVvZihQUklWQVRFRklMRURBVEEpKSAmJiAgICBcCisJICgoZmQpLT5zaWcyID09IGZkKSkKKworLyoqIExvY2tzIGRkLT5sb2NrRGV2IGlmIHlvdSBoYXZuJ3QgYWxyZWFkeSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgTE9DS0RFVihkZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKCFsb2NrZWREZXYpIHsJCQkJICAgICAgIFwKKwkJCXNwaW5fbG9jaygmZGQtPmxvY2tEZXYpOwkJICAgICAgIFwKKwkJCWxvY2tlZERldiA9IFRSVUU7CQkJICAgICAgIFwKKwkJfQkJCQkJCSAgICAgICBcCisJfQorCisvKiogVW5sb2NrcyBkZC0+bG9ja0RldiBpZiB5b3UgcHJldmlvdXNseSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgVU5MT0NLREVWKGRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKGxvY2tlZERldikgewkJCQkgICAgICAgXAorCQkJc3Bpbl91bmxvY2soJmRkLT5sb2NrRGV2KTsJCSAgICAgICBcCisJCQlsb2NrZWREZXYgPSBGQUxTRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBMb2NrcyBkZC0+bG9ja0RldklTUiBpZiB5b3UgaGF2bid0IGFscmVhZHkgbG9ja2VkIGl0ICovCisjZGVmaW5lIExPQ0tERVZJU1IoZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmICghbG9ja2VkRGV2SVNSKSB7CQkJCSAgICAgICBcCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGQtPmxvY2tEZXZJU1IsIGZsYWdzKTsgICAgIFwKKwkJCWxvY2tlZERldklTUiA9IFRSVUU7CQkJICAgICAgIFwKKwkJfQkJCQkJCSAgICAgICBcCisJfQorCisvKiogVW5sb2NrcyBkZC0+bG9ja0RldklTUiBpZiB5b3UgcHJldmlvdXNseSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgVU5MT0NLREVWSVNSKGRkKQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCWlmIChsb2NrZWREZXZJU1IpIHsJCQkJCVwKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRkLT5sb2NrRGV2SVNSLCBmbGFncyk7IFwKKwkJCWxvY2tlZERldklTUiA9IEZBTFNFOwkJCQlcCisJCX0JCQkJCQkJXAorCX0KKworLyoqIExvY2tzIExvY2tHbG9iYWxJU1IgaWYgeW91IGhhdm4ndCBhbHJlYWR5IGxvY2tlZCBpdCAqLworI2RlZmluZSBMT0NLR0xPQkFMSVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoIWxvY2tlZEdsb2JhbElTUikgewkJCQkgICAgICAgXAorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJkxvY2tHbG9iYWxJU1IsIGZsYWdzKTsgICAgICBcCisJCQlsb2NrZWRHbG9iYWxJU1IgPSBUUlVFOwkJCSAgICAgICBcCisJCX0JCQkJCQkgICAgICAgXAorCX0KKworLyoqIFVubG9ja3MgTG9ja0dsb2JhbElTUiBpZiB5b3UgcHJldmlvdXNseSBsb2NrZWQgaXQgKi8KKyNkZWZpbmUgVU5MT0NLR0xPQkFMSVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKGxvY2tlZEdsb2JhbElTUikgewkJCQkgICAgICAgXAorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmTG9ja0dsb2JhbElTUiwgZmxhZ3MpOyBcCisJCQlsb2NrZWRHbG9iYWxJU1IgPSBGQUxTRTsJCSAgICAgICBcCisJCX0JCQkJCQkgICAgICAgXAorCX0KKworLyoqIExvY2tzIExvY2tHbG9iYWwgaWYgeW91IGhhdm4ndCBhbHJlYWR5IGxvY2tlZCBpdCAqLworI2RlZmluZSBMT0NLR0xPQkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoIWxvY2tlZEdsb2JhbCkgewkJCQkgICAgICAgXAorCQkJc3Bpbl9sb2NrKCZMb2NrR2xvYmFsKTsJCQkgICAgICAgXAorCQkJbG9ja2VkR2xvYmFsID0gVFJVRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBVbmxvY2tzIExvY2tHbG9iYWwgaWYgeW91IHByZXZpb3VzbHkgbG9ja2VkIGl0ICovCisjZGVmaW5lIFVOTE9DS0dMT0JBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChsb2NrZWRHbG9iYWwpIHsJCQkJICAgICAgIFwKKwkJCXNwaW5fdW5sb2NrKCZMb2NrR2xvYmFsKTsJCSAgICAgICBcCisJCQlsb2NrZWRHbG9iYWwgPSBGQUxTRTsJCQkgICAgICAgXAorCQl9CQkJCQkJICAgICAgIFwKKwl9CisKKy8qKiBVc2UgdGhpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9ucyB3aGVyZSB5b3UgaW50ZW5kIHRvCisgKiAgdXNlICNMT0NLREVWLyNVTkxPQ0tERVYsICNMT0NLREVWSVNSLyNVTkxPQ0tERVZJU1IsCisgKiAgI0xPQ0tHTE9CQUwvI1VOTE9DS0dMT0JBTCwgI0xPQ0tHTE9CQUxJU1IvI1VOTE9DS0dMT0JBTElTUi4KKyAqCisgKiAgTm90ZSB0aGF0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGlzIGhvdyB5b3UgdGVsbCBHTlUgQyB0byBzdXBwcmVzcworICogIGFueSB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IHRoZSB2YXJpYWJsZSBiZWluZyB1bnVzZWQuCisgKi8KKyNkZWZpbmUgTE9DS1BSRUFNQkxFCQkJCQkJCVwKKwl1bG9uZyBmbGFncyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IDA7CQkJXAorCUJPT0wgbG9ja2VkRGV2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gRkFMU0U7CQkJXAorCUJPT0wgbG9ja2VkRGV2SVNSIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gRkFMU0U7CQlcCisJQk9PTCBsb2NrZWRHbG9iYWwgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSBGQUxTRTsJCVwKKwlCT09MIGxvY2tlZEdsb2JhbElTUiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IEZBTFNFCisKKworCisvKiogU2xlZXAgZm9yIGFuIGluZGljYXRlZCBudW1iZXIgb2Ygc2Vjb25kcyAoZm9yIHVzZSBpbiBrZXJuZWwgbW9kZSkuCisgKiAgQHBhcmFtIHggdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwLgorICovCisjZGVmaW5lIFNMRUVQKHgpCQkJCQkgICAgIFwKKwlkbyB7IGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwkgICAgIFwKKwkJc2NoZWR1bGVfdGltZW91dCgoeCkqSFopOwkJICAgICBcCisJfSB3aGlsZSAoMCkKKworLyoqIFNsZWVwIGZvciBhbiBpbmRpY2F0ZWQgbnVtYmVyIG9mIGppZmZpZXMgKGZvciB1c2UgaW4ga2VybmVsIG1vZGUpLgorICogIEBwYXJhbSB4IHRoZSBudW1iZXIgb2YgamlmZmllcyB0byBzbGVlcC4KKyAqLworI2RlZmluZSBTTEVFUEpJRkZJRVMoeCkJCQkJCQkgICAgXAorCWRvIHsgY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CQkgICAgXAorCQlzY2hlZHVsZV90aW1lb3V0KHgpOwkJCQkgICAgXAorCX0gd2hpbGUgKDApCisKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLCBiKSAoKChhKSA+IChiKSkgPyAoYSk6KGIpKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNkZXYgKmNkZXZfYWxsb2NfaW5pdChzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCQkJICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKK3sKKwlzdHJ1Y3QgY2RldiAqY2RldiA9IE5VTEw7CisJY2RldiA9IGNkZXZfYWxsb2MoKTsKKwlpZiAoIWNkZXYpCisJCXJldHVybiBOVUxMOworCWNkZXYtPm9wcyA9IGZvcHM7CisJY2Rldi0+b3duZXIgPSBvd25lcjsKKworCS8qIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgY2RldiB3aWxsIGJlIGRlYWxsb2NhdGVkCisJICogd2hlbiB0aGUgdXNhZ2UgY291bnQgZHJvcHMgdG8gMCwgYmVjYXVzZSBpdCBpcyBjb250cm9sbGVkCisJICogYnkgYSBrb2JqZWN0IG9mIHR5cGUga3R5cGVfY2Rldl9keW5hbWljLiAgKFRoaXMKKwkgKiBkZWFsbG9jYXRpb24gY291bGQgdmVyeSB3ZWxsIGhhcHBlbiBvdXRzaWRlIG9mIG91ciBrZXJuZWwKKwkgKiBtb2R1bGUsIGxpa2UgdmlhIHRoZSBjZGV2X3B1dCBpbiBfX2ZwdXQoKSBmb3IgZXhhbXBsZS4pCisJICovCisJcmV0dXJuIGNkZXY7Cit9CisKKyNpbmNsdWRlICJ0aW1za21vZHV0aWxzLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3RpbXNrbW9kdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4MWQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZHV0aWxzLmgKQEAgLTAsMCArMSw3NSBAQAorLyogdGltc2ttb2R1dGlscy5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVElNU0tNT0RVVElMU19IX18KKyNkZWZpbmUgX19USU1TS01PRFVUSUxTX0hfXworCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKwordm9pZCAqa21hbGxvY19rZXJuZWwoc2l6ZV90IHNpeik7Cit2b2lkICBteXByaW50ayhjb25zdCBjaGFyICpteURydk5hbWUsIGNvbnN0IGNoYXIgKmRldm5hbWUsCisJCWNvbnN0IGNoYXIgKnRlbXBsYXRlLCAuLi4pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICotLS0gIEdFTkVSQUwgTUVTU0FHRVEgU1RVRkYgIC0tLSoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgTWVzc2FnZVFFbnRyeTsKKworLyoqIHRoZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYW4gYXJiaXRyYXJ5IGRhdGEgaXRlbSB0aGF0IHlvdSB3YW50CisgKiAgdG8gcGxhY2Ugb24gYSAjTUVTU0FHRVEuICBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGFzIGZvbGxvd3M6CisgKgorICogIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBjb25zaWRlcmVkIG9wYXF1ZTsgdGhlIGNsaWVudCB1c2luZyBpdCBzaG91bGQKKyAqICBuZXZlciBhY2Nlc3MgdGhlIGZpZWxkcyBkaXJlY3RseS4KKyAqICBSZWZlciB0byB0aGVzZSBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mbzoKKyAqCisgKiAgQGluZ3JvdXAgbWVzc2FnZXEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTWVzc2FnZVFFbnRyeSB7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgTWVzc2FnZVFFbnRyeSAqcU5leHQ7CisJc3RydWN0IE1lc3NhZ2VRRW50cnkgKnFQcmV2OworfSBNRVNTQUdFUUVOVFJZOworCisvKiogdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIEZJRk8gcXVldWUgb2YgI01FU1NBR0VRRU5UUlk8Yj48L2I+cy4KKyAqICBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGFzIGZvbGxvd3M6CisgKiAgQGNvZGUKKyAqICAgICAgTUVTU0FHRVEgbXlRdWV1ZTsKKyAqICBAZW5kY29kZQorICogIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBjb25zaWRlcmVkIG9wYXF1ZTsgdGhlIGNsaWVudCB1c2luZyBpdCBzaG91bGQKKyAqICBuZXZlciBhY2Nlc3MgdGhlIGZpZWxkcyBkaXJlY3RseS4KKyAqICBSZWZlciB0byB0aGVzZSBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mbzoKKyAqCisgKiAgQGluZ3JvdXAgbWVzc2FnZXEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTWVzc2FnZVEgeworCU1FU1NBR0VRRU5UUlkgKnFIZWFkOworCU1FU1NBR0VRRU5UUlkgKnFUYWlsOworCXN0cnVjdCBzZW1hcGhvcmUgblFFbnRyaWVzOworCXNwaW5sb2NrX3QgICAgICAgcXVldWVMb2NrOworfSBNRVNTQUdFUTsKKworY2hhciAqY3ljbGVzVG9TZWNvbmRzKHU2NCBjeWNsZXMsIHU2NCBjeWNsZXNQZXJTZWNvbmQsCisJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworY2hhciAqY3ljbGVzVG9JdGVyYXRpb25TZWNvbmRzKHU2NCBjeWNsZXMsIHU2NCBjeWNsZXNQZXJTZWNvbmQsCisJCQkgICAgICAgdTY0IGl0ZXJhdGlvbnMsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworY2hhciAqY3ljbGVzVG9Tb21ldGhpbmdzUGVyU2Vjb25kKHU2NCBjeWNsZXMsIHU2NCBjeWNsZXNQZXJTZWNvbmQsCisJCQkJICB1NjQgc29tZXRoaW5ncywgY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSk7CitzdHJ1Y3Qgc2VxX2ZpbGUgKnZpc29yX3NlcV9maWxlX25ld19idWZmZXIodm9pZCAqYnVmLCBzaXplX3QgYnVmX3NpemUpOwordm9pZCB2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXNxdWV1ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhYjM5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXNxdWV1ZS5oCkBAIC0wLDAgKzEsNDQwIEBACisvKiB1aXNxdWV1ZS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogVW5pc3lzIElPIFZpcnR1YWxpemF0aW9uIGhlYWRlciBOT1RFOiBUaGlzIGZpbGUgY29udGFpbnMgb25seSBMaW51eAorICogc3BlY2lmaWMgc3RydWN0cy4gIEFsbCBPUy1pbmRlcGVuZGVudCBzdHJ1Y3RzIGFyZSBpbiBpb2NoYW5uZWwuaC54eAorICovCisKKyNpZm5kZWYgX19VSVNRVUVVRV9IX18KKyNkZWZpbmUgX19VSVNRVUVVRV9IX18KKworI2luY2x1ZGUgImxpbnV4L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJpb2NoYW5uZWwuaCIKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIgorCitzdHJ1Y3QgdWlzcXVldWVfaW5mbyB7CisKKwlDSEFOTkVMX0hFQURFUiBfX2lvbWVtICpjaGFuOworCS8qIGNoYW5uZWwgY29udGFpbmluZyBxdWV1ZXMgaW4gd2hpY2ggc2NzaSBjb21tYW5kcyAmCisJICogcmVzcG9uc2VzIGFyZSBxdWV1ZWQKKwkgKi8KKwlVNjQgcGFja2V0c19zZW50OworCVU2NCBwYWNrZXRzX3JlY2VpdmVkOworCVU2NCBpbnRlcnJ1cHRzX3NlbnQ7CisJVTY0IGludGVycnVwdHNfcmVjZWl2ZWQ7CisJVTY0IG1heF9ub3RfZW1wdHlfY250OworCVU2NCB0b3RhbF93YWtldXBfY250OworCVU2NCBub25fZW1wdHlfd2FrZXVwX2NudDsKKworCXN0cnVjdCB7CisJCVNJR05BTF9RVUVVRV9IRUFERVIgUmVzZXJ2ZWQxOwkvKiAgKi8KKwkJU0lHTkFMX1FVRVVFX0hFQURFUiBSZXNlcnZlZDI7CS8qICAqLworCX0gc2FmZV91aXNfcXVldWU7CisJdW5zaWduZWQgaW50ICgqc2VuZF9pbnRfaWZfbmVlZGVkKShzdHJ1Y3QgdWlzcXVldWVfaW5mbyAqaW5mbywKKwkJCQkJICAgdW5zaWduZWQgaW50IHdoaWNoY3F1ZXVlLAorCQkJCQkgICB1bnNpZ25lZCBjaGFyIGlzc3VlSW50ZXJydXB0SWZFbXB0eSwKKwkJCQkJICAgVTY0IGludGVycnVwdEhhbmRsZSwKKwkJCQkJICAgdW5zaWduZWQgY2hhciBpb190ZXJtaW5hdGlvbik7Cit9OworCisvKiB1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQgcXVldWVzIGEgY29tbW1hbmQgb3IgcmVzcG9uc2UKKyAqIHRvIHRoZSBzcGVjaWZpZWQgcXVldWUsIGF0IHRoZSB0YWlsIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dAorICogb2t0b3dhaXQgPT0gMCwgdGhlbiBpdCByZXR1cm4gMCBpbmRpY2F0aW5nIGZhaWx1cmUuICBvdGhlcndpc2UgaXQKKyAqIHdhaXQgZm9yIHRoZSBxdWV1ZSB0byBiZWNvbWUgbm9uLWZ1bGwuIElmIGNvbW1hbmQgaXMgcXVldWVkLCByZXR1cm4KKyAqIDEgZm9yIHN1Y2Nlc3MuCisgKi8KKyNkZWZpbmUgRE9OVF9JU1NVRV9JTlRFUlJVUFQgMAorI2RlZmluZSBJU1NVRV9JTlRFUlJVUFQJCSAxCisKKyNkZWZpbmUgRE9OVF9XQUlUCQkJIDAKKyNkZWZpbmUgT0tfVE9fV0FJVAkJCSAxCisjZGVmaW5lIFVJU0xJQl9MT0NLX1BSRUZJWCBcCisJCSIuc2VjdGlvbiAuc21wX2xvY2tzLFwiYVwiXG4iICAgXAorCQlfQVNNX0FMSUdOICJcbiIgICAgICAgICAgICAgICAgIFwKKwkJX0FTTV9QVFIgIjY2MWZcbiIgLyogYWRkcmVzcyAqLyBcCisJCSIucHJldmlvdXNcbiIgICAgICAgICAgICAgICAgICAgXAorCQkiNjYxOlxuXHRsb2NrOyAiCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyB1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKHVuc2lnbmVkIGxvbmcgbG9uZyBfX2lvbWVtICpUYXJnZXQsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nIFNldCk7Cit1bnNpZ25lZCBsb25nIGxvbmcgdWlzcXVldWVfSW50ZXJsb2NrZWRBbmQodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBsb25nIFNldCk7CisKK3Vuc2lnbmVkIGludCB1aXNxdWV1ZV9zZW5kX2ludF9pZl9uZWVkZWQoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnBxdWV1ZWluZm8sCisJCQkJCSB1bnNpZ25lZCBpbnQgd2hpY2hxdWV1ZSwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgaXNzdWVJbnRlcnJ1cHRJZkVtcHR5LAorCQkJCQkgVTY0IGludGVycnVwdEhhbmRsZSwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgaW9fdGVybWluYXRpb24pOworCitpbnQgdWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2tfY2xpZW50KHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sCisJCQkJCSBzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgcXVldWUsCisJCQkJCSB2b2lkICppbnNlcnRsb2NrLAorCQkJCQkgdW5zaWduZWQgY2hhciBpc3N1ZUludGVycnVwdElmRW1wdHksCisJCQkJCSBVNjQgaW50ZXJydXB0SGFuZGxlLAorCQkJCQkgY2hhciBva3Rvd2FpdCwKKwkJCQkJIFU4ICpjaGFubmVsSWQpOworCisvKiB1aXNxdWV1ZV9nZXRfY21kcnNwIGdldHMgdGhlIGNtZHJzcCBlbnRyeSBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUKKyAqIGFuZCBjb3BpZXMgaXQgdG8gdGhlIGFyZWEgcG9pbnRlZCBieSBjbWRyc3AgcGFyYW0uCisgKiByZXR1cm5zIDAgaWYgcXVldWUgaXMgZW1wdHksIDEgb3RoZXJ3aXNlCisgKi8KK2ludAorCit1aXNxdWV1ZV9nZXRfY21kcnNwKHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sIHZvaWQgKmNtZHJzcCwKKwkJICAgIHVuc2lnbmVkIGludCBxdWV1ZSk7CisKKyNkZWZpbmUgTUFYX05BTUVfU0laRV9VSVNRVUVVRSA2NAorCitzdHJ1Y3QgZXh0cG9ydF9pbmZvIHsKKwlVOCB2YWxpZDoxOworCS8qIGlmIDEsIGluZGljYXRlcyB0aGlzIGV4dHBvcnQgc2xvdCBpcyBvY2N1cGllZAorCSAqIGlmIDAsIGluZGljYXRlcyB0aGF0IGV4dHBvcnQgc2xvdCBpcyB1bm9jY3VwaWVkICovCisKKwlVMzIgbnVtX2RldnNfdXNpbmc7CisJLyogV2hlbiBleHRwb3J0IGlzIGFkZGVkLCB0aGlzIGlzIHNldCB0byAwLiAgRm9yIGV4cG9ydHMKKwkqIGxvY2F0ZWQgaW4gTkVUV09SSyBzd2l0Y2hlczoKKwkqIEVhY2ggdGltZSBhIFZOSUMsIGkuZS4sIGludHBvcnQsIGlzIGFkZGVkIHRvIHRoZSBzd2l0Y2ggdGhpcworCSogaXMgdXNlZCB0byBhc3NpZ24gYSBwcmVmX3BuaWMgZm9yIHRoZSBWTklDIGFuZCB3aGVuIGFzc2lnbmVkCisJKiB0byBhIFZOSUMgdGhpcyBjb3VudGVyIGlzIGluY3JlbWVudGVkLiBXaGVuIGEgVk5JQyBpcworCSogZGVsZXRlZCwgdGhlIGV4dHBvcnQgY29ycmVzcG9uZGluZyB0byB0aGUgVk5JQydzIHByZWZfcG5pYworCSogaXMgbG9jYXRlZCBhbmQgaXRzIG51bV9kZXZzX3VzaW5nIGlzIGRlY3JlbWVudGVkLiBGb3IgVk5JQ3MsCisJKiBudW1fZGV2c191c2luZyBpcyBiYXNpY2FsbHkgdXNlZCB0byBsb2FkLWJhbGFuY2UgdHJhbnNtaXQKKwkqIHRyYWZmaWMgZnJvbSBWTklDcy4KKwkqLworCisJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsKKwlzdHJ1Y3QgUGNpSWQgcGNpX2lkOworCWNoYXIgbmFtZVtNQVhfTkFNRV9TSVpFX1VJU1FVRVVFXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2aGJhX3d3bm4gd3dubjsKKwkJdW5zaWduZWQgY2hhciBtYWNhZGRyW01BWF9NQUNBRERSX0xFTl07CisJfTsKK307CisKK3N0cnVjdCBkZXZpY2VfaW5mbyB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOworCVU2NCBjaGFubmVsQWRkcjsKKwlVNjQgY2hhbm5lbEJ5dGVzOworCUdVSUQgY2hhbm5lbFR5cGVHdWlkOworCUdVSUQgZGV2SW5zdEd1aWQ7CisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsKKwlzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOworCWNoYXIgZGV2aWRbMzBdOwkJLyogInZidXM8YnVzbm8+OmRldjxkZXZubz4iICovCisJVTE2IHBvbGxpbmc7CisJc3RydWN0IHNlbWFwaG9yZSBpbnRlcnJ1cHRfY2FsbGJhY2tfbG9jazsKKwlVMzIgYnVzTm87CisJVTMyIGRldk5vOworCWludCAoKmludGVycnVwdCkodm9pZCAqKTsKKwl2b2lkICppbnRlcnJ1cHRfY29udGV4dDsKKwl2b2lkICpwcml2YXRlX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtb3ZlZF90b190YWlsX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZmlyc3RfYnVzeV9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb25fbGlzdF9jbnQ7Cit9OworCit0eXBlZGVmIGVudW0geworCVJFQ09WRVJZX0xBTiA9IDEsCisJSUJfTEFOID0gMgorfSBTV0lUQ0hfVFlQRTsKKworc3RydWN0IGJ1c19pbmZvIHsKKwlVMzIgYnVzTm8sIGRldmljZUNvdW50OworCXN0cnVjdCBkZXZpY2VfaW5mbyAqKmRldmljZTsKKwlVNjQgZ3Vlc3RIYW5kbGUsIHJlY3ZCdXNJbnRlcnJ1cHRIYW5kbGU7CisJR1VJRCBidXNJbnN0R3VpZDsKKwlVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqcEJ1c0NoYW5uZWw7CisJaW50IGJ1c0NoYW5uZWxCeXRlczsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyOwkvKiBwcm9jL3Vpc2xpYi92YnVzLzx4PiAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pbmZvOwkvKiBwcm9jL3Vpc2xpYi92YnVzLzx4Pi9pbmZvICovCisJY2hhciBuYW1lWzI1XTsKKwljaGFyIHBhcnRpdGlvbk5hbWVbOTldOworCXN0cnVjdCBidXNfaW5mbyAqbmV4dDsKKwlVOCBsb2NhbFZuaWM7CQkvKiAxIGlmIGxvY2FsIHZuaWMgY3JlYXRlZCBpbnRlcm5hbGx5CisJCQkJICogYnkgSU9WTTsgMCBvdGhlcndpc2UuLi4gKi8KK307CisKKyNkZWZpbmUgREVESUNBVEVEX1NXSVRDSChwU3dpdGNoKSAoKHBTd2l0Y2gtPmV4dFBvcnRDb3VudCA9PSAxKSAmJglcCisJCQkJICAgKHBTd2l0Y2gtPmludFBvcnRDb3VudCA9PSAxKSkKKworc3RydWN0IHNuX2xpc3RfZW50cnkgeworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgcGRlc3Q7CS8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IKKwkJCQkJICogcGh5cyBkaXNrICovCisJVTggc2VybnVtW01BWF9TRVJJQUxfTlVNXTsJLyogc2VyaWFsIG51bSBvZiBwaHlzaWNhbAorCQkJCQkgKiBkaXNrLi4gVGhlIGxlbmd0aCBpcyBhbHdheXMKKwkJCQkJICogTUFYX1NFUklBTF9OVU0sIHBhZGRlZCB3aXRoCisJCQkJCSAqIHNwYWNlcyAqLworCXN0cnVjdCBzbl9saXN0X2VudHJ5ICpuZXh0OworfTsKKworc3RydWN0IG5ldHdvcmtQb2xpY3kgeworCVUzMiBwcm9taXNjdW91czoxOworCVUzMiBtYWNhc3NpZ246MTsKKwlVMzIgcGVlcmZvcndhcmRpbmc6MTsKKwlVMzIgbm9ub3RpZnk6MTsKKwlVMzIgc3RhbmRieToxOworCVUzMiBjYWxsaG9tZToyOworCWNoYXIgaXBfYWRkclszMF07Cit9OworCisvKgorICogSU8gbWVzc2FnZXMgc2VudCB0byBVaXNuaWNDb250cm9sQ2hhbkZ1bmMgJiBVaXNzZENvbnRyb2xDaGFuRnVuYyBieQorICogY29kZSB0aGF0IHByb2Nlc3NlcyB0aGUgQ29udHJvbFZtIGNoYW5uZWwgbWVzc2FnZXMuCisgKi8KKworCit0eXBlZGVmIGVudW0geworCUlPUEFSVF9BRERfVk5JQywKKwlJT1BBUlRfREVMX1ZOSUMsCisJSU9QQVJUX0RFTF9BTExfVk5JQ1MsCisJSU9QQVJUX0FERF9WSEJBLAorCUlPUEFSVF9BRERfVkRJU0ssCisJSU9QQVJUX0RFTF9WSEJBLAorCUlPUEFSVF9ERUxfVkRJU0ssCisJSU9QQVJUX0RFTF9BTExfVkRJU0tTX0ZPUl9WSEJBLAorCUlPUEFSVF9ERUxfQUxMX1ZIQkFTLAorCUlPUEFSVF9BVFRBQ0hfUEhCQSwKKwlJT1BBUlRfREVUQUNIX1BIQkEsCS8qIDEwICovCisJSU9QQVJUX0FUVEFDSF9QTklDLAorCUlPUEFSVF9ERVRBQ0hfUE5JQywKKwlJT1BBUlRfREVUQUNIX1ZIQkEsCisJSU9QQVJUX0RFVEFDSF9WTklDLAorCUlPUEFSVF9QQVVTRV9WRElTSywKKwlJT1BBUlRfUkVTVU1FX1ZESVNLLAorCUlPUEFSVF9BRERfREVWSUNFLAkvKiBhZGQgZ2VuZXJpYyBkZXZpY2UgKi8KKwlJT1BBUlRfREVMX0RFVklDRSwJLyogZGVsIGdlbmVyaWMgZGV2aWNlICovCit9IElPUEFSVF9NU0dfVFlQRTsKKworc3RydWN0IGFkZF92aXJ0X2lvcGFydCB7CisJdm9pZCAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJVTY0IGd1ZXN0SGFuZGxlOwkvKiB1c2VkIHRvIGNvbnZlcnQgZ3Vlc3QgcGh5c2ljYWwKKwkJCQkgKiBhZGRyZXNzIHRvIHJlYWwgcGh5c2ljYWwgYWRkcmVzcworCQkJCSAqIGZvciBETUEsIGZvciBleC4gKi8KKwlVNjQgcmVjdkJ1c0ludGVycnVwdEhhbmRsZTsJLyogdXNlZCB0byByZWdpc3RlciB0byByZWNlaXZlCisJCQkJCSAqIGJ1cyBsZXZlbCBpbnRlcnJ1cHRzLiAqLworCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7CS8qIGNvbnRhaW5zIHJlY3YgJiBzZW5kCisJCQkJCSAqIGludGVycnVwdCBpbmZvICovCisJLyogcmVjdkludGVycnVwdEhhbmRsZSBpcyB1c2VkIHRvIHJlZ2lzdGVyIHRvIHJlY2VpdmUKKwkqIGludGVycnVwdHMgb24gdGhlIGRhdGEgY2hhbm5lbC4gVXNlZCBieSBHdWVzdExpbnV4L1dpbmRvd3MKKwkqIElPIGRyaXZlcnMgdG8gY29ubmVjdCB0byBpbnRlcnJ1cHQuICBzZW5kSW50ZXJydXB0SGFuZGxlIGlzCisJKiB1c2VkIGJ5IElPUGFydCBkcml2ZXJzIGFzIHBhcmFtZXRlciB0bworCSogSXNzdWVfVk1DQUxMX0lPX1FVRVVFX1RSQU5TSVRJT04gdG8gaW50ZXJydXB0IHRocmVhZCBpbgorCSogZ3Vlc3QgbGludXgvd2luZG93cyBJTyBkcml2ZXJzIHdoZW4gZGF0YSBjaGFubmVsIHF1ZXVlIGZvcgorCSogdmhiYS92bmljIGdvZXMgZnJvbSBFTVBUWSB0byBOT04tRU1QVFkuICovCisJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsJLyogcG9pbnRlciB0byB0aGUgdmlydHVhbAorCQkJCQkgKiBzd2l0Y2ggdG8gd2hpY2ggdGhlIHZuaWMgaXMKKwkJCQkJICogY29ubmVjdGVkICovCisKKwlVOCB1c2VHMkdDb3B5OwkJLyogVXNlZCB0byBkZXRlcm1pbmUgaWYgYSB2aXJ0dWFsIEhCQQorCQkJCSAqIG5lZWRzIHRvIHVzZSBHMkcgY29weS4gKi8KKwlVOCBGaWxsZXJbN107CisKKwlVMzIgYnVzTm87CisJVTMyIGRldk5vOworCWNoYXIgKnBhcmFtczsKKwl1bG9uZyBwYXJhbXNfYnl0ZXM7CisKK307CisKK3N0cnVjdCBhZGRfdmRpc2tfaW9wYXJ0IHsKKwl2b2lkICpjaGFucHRyOwkJICAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlpbnQgaW1wbGljaXQ7CisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsgICAgLyogc2NzaSBidXMsIHRhcmdldCwgbHVuIGZvciB2aXJ0IGRpc2sgKi8KKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHBkZXN0OyAgICAvKiBzY3NpIGJ1cywgdGFyZ2V0LCBsdW4gZm9yIHBoeXMgZGlzayAqLworCVU4IHNlcm51bVtNQVhfU0VSSUFMX05VTV07ICAgIC8qIHNlcmlhbCBudW0gb2YgcGh5c2ljYWwgZGlzayAqLworCVUzMiBzZXJsZW47CQkgICAgICAvKiBsZW5ndGggb2Ygc2VyaWFsIG51bSAqLworCVUzMiBidXNObzsKKwlVMzIgZGV2Tm87Cit9OworCitzdHJ1Y3QgZGVsX3ZkaXNrX2lvcGFydCB7CisJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OyAgIC8qIHNjc2kgYnVzLCB0YXJnZXQsIGx1biBmb3IgdmlydCBkaXNrICovCisJVTMyIGJ1c05vOworCVUzMiBkZXZObzsKK307CisKK3N0cnVjdCBkZWxfdmlydF9pb3BhcnQgeworCXZvaWQgKmNoYW5wdHI7CQkgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJVTMyIGJ1c05vOworCVUzMiBkZXZObzsKK307CisKK3N0cnVjdCBkZXRfdmlydF9pb3BhcnQgewkgICAgIC8qIGRldGFjaCBpbnRlcm5hbCBwb3J0ICovCisJdm9pZCAqY2hhbnB0cjsJCSAgICAgLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KKwlzdHJ1Y3Qgc3dpdGNoX2luZm8gKnN3dGNoOworfTsKKworc3RydWN0IHBhdXJlc192ZGlza19pb3BhcnQgeworCXZvaWQgKmNoYW5wdHI7CQkgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJc3RydWN0IHVpc3Njc2lfZGVzdCB2ZGVzdDsgICAvKiBzY3NpIGJ1cywgdGFyZ2V0LCBsdW4gZm9yIHZpcnQgZGlzayAqLworfTsKKworc3RydWN0IGFkZF9zd2l0Y2hfaW9wYXJ0IHsJICAgICAvKiBhZGQgc3dpdGNoICovCisJc3RydWN0IHN3aXRjaF9pbmZvICpzd3RjaDsKKwljaGFyICpwYXJhbXM7CisJdWxvbmcgcGFyYW1zX2J5dGVzOworfTsKKworc3RydWN0IGRlbF9zd2l0Y2hfaW9wYXJ0IHsJICAgICAvKiBkZXN0cm95IHN3aXRjaCAqLworCXN0cnVjdCBzd2l0Y2hfaW5mbyAqc3d0Y2g7Cit9OworCitzdHJ1Y3QgaW9fbXNncyB7CisKKwlJT1BBUlRfTVNHX1RZUEUgbXNndHlwZTsKKworCS8qIGFkZGl0aW9uYWwgcGFyYW1zIG5lZWRlZCBieSBzb21lIG1lc3NhZ2VzICovCisJdW5pb24geworCQlzdHJ1Y3QgYWRkX3ZpcnRfaW9wYXJ0IGFkZF92aGJhOworCQlzdHJ1Y3QgYWRkX3ZpcnRfaW9wYXJ0IGFkZF92bmljOworCQlzdHJ1Y3QgYWRkX3ZkaXNrX2lvcGFydCBhZGRfdmRpc2s7CisJCXN0cnVjdCBkZWxfdmlydF9pb3BhcnQgZGVsX3ZoYmE7CisJCXN0cnVjdCBkZWxfdmlydF9pb3BhcnQgZGVsX3ZuaWM7CisJCXN0cnVjdCBkZXRfdmlydF9pb3BhcnQgZGV0X3ZoYmE7CisJCXN0cnVjdCBkZXRfdmlydF9pb3BhcnQgZGV0X3ZuaWM7CisJCXN0cnVjdCBkZWxfdmRpc2tfaW9wYXJ0IGRlbF92ZGlzazsKKwkJc3RydWN0IGRlbF92aXJ0X2lvcGFydCBkZWxfYWxsX3ZkaXNrc19mb3JfdmhiYTsKKwkJc3RydWN0IGFkZF92aXJ0X2lvcGFydCBhZGRfZGV2aWNlOworCQlzdHJ1Y3QgZGVsX3ZpcnRfaW9wYXJ0IGRlbF9kZXZpY2U7CisJCXN0cnVjdCBkZXRfdmlydF9pb3BhcnQgZGV0X2ludHBvcnQ7CisJCXN0cnVjdCBhZGRfc3dpdGNoX2lvcGFydCBhZGRfc3dpdGNoOworCQlzdHJ1Y3QgZGVsX3N3aXRjaF9pb3BhcnQgZGVsX3N3aXRjaDsKKwkJc3RydWN0IGV4dHBvcnRfaW5mbyAqZXh0UG9ydDsJLyogZm9yIGF0dGFjaCBvciBkZXRhY2gKKwkJCQkJCSAqIHBuaWMvZ2VuZXJpYyBkZWxldGUgYWxsCisJCQkJCQkgKiB2aGJhcy9hbGx2bmljcyBuZWVkIG5vCisJCQkJCQkgKiBwYXJhbWV0ZXJzICovCisJCXN0cnVjdCBwYXVyZXNfdmRpc2tfaW9wYXJ0IHBhdXJlc192ZGlzazsKKwl9OworfTsKKworLyoKKyogR3Vlc3QgbWVzc2FnZXMgc2VudCB0byBWaXJ0Q29udHJvbENoYW5GdW5jIGJ5IGNvZGUgdGhhdCBwcm9jZXNzZXMKKyogdGhlIENvbnRyb2xWbSBjaGFubmVsIG1lc3NhZ2VzLgorKi8KKwordHlwZWRlZiBlbnVtIHsKKwlHVUVTVF9BRERfVkJVUywKKwlHVUVTVF9BRERfVkhCQSwKKwlHVUVTVF9BRERfVk5JQywKKwlHVUVTVF9ERUxfVkJVUywKKwlHVUVTVF9ERUxfVkhCQSwKKwlHVUVTVF9ERUxfVk5JQywKKwlHVUVTVF9ERUxfQUxMX1ZIQkFTLAorCUdVRVNUX0RFTF9BTExfVk5JQ1MsCisJR1VFU1RfREVMX0FMTF9WQlVTRVMsCS8qIGRlbGV0ZXMgYWxsIHZoYmFzICYgdm5pY3Mgb24gYWxsCisJCQkJICogYnVzZXMgYW5kIGRlbGV0ZXMgYWxsIGJ1c2VzICovCisJR1VFU1RfUEFVU0VfVkhCQSwKKwlHVUVTVF9QQVVTRV9WTklDLAorCUdVRVNUX1JFU1VNRV9WSEJBLAorCUdVRVNUX1JFU1VNRV9WTklDCit9IEdVRVNUUEFSVF9NU0dfVFlQRTsKKworc3RydWN0IGFkZF92YnVzX2d1ZXN0cGFydCB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOwkJLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgZm9yIGJ1cyAtCisJCQkJCSAqIE5PVCBZRVQgVVNFRCAqLworCVUzMiBidXNObzsJCS8qIGJ1cyBudW1iZXIgdG8gYmUgY3JlYXRlZC9kZWxldGVkICovCisJVTMyIGRldmljZUNvdW50OwkvKiBtYXggbnVtIG9mIGRldmljZXMgb24gYnVzICovCisJR1VJRCBidXNUeXBlR3VpZDsJLyogaW5kaWNhdGVzIHR5cGUgb2YgYnVzICovCisJR1VJRCBidXNJbnN0R3VpZDsJLyogaW5zdGFuY2UgZ3VpZCBmb3IgZGV2aWNlICovCit9OworCitzdHJ1Y3QgZGVsX3ZidXNfZ3Vlc3RwYXJ0IHsKKwlVMzIgYnVzTm87CQkvKiBidXMgbnVtYmVyIHRvIGJlIGRlbGV0ZWQgKi8KKwkvKiBvbmNlIHdlIHN0YXJ0IHVzaW5nIHRoZSBidXMncyBjaGFubmVsLCBhZGQgY2FuIGR1bXAgYnVzTm8KKwkqIGludG8gdGhlIGNoYW5uZWwgaGVhZGVyIGFuZCB0aGVuIGRlbGV0ZSB3aWxsIG5lZWQgb25seSBvbmUKKwkqIHBhcmFtZXRlciwgY2hhbnB0ci4gKi8KK307CisKK3N0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgeworCXZvaWQgX19pb21lbSAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCisJVTMyIGJ1c05vOwkJLyogYnVzIG51bWJlciBmb3IgdGhlIG9wZXJhdGlvbiAqLworCVUzMiBkZXZpY2VObzsJCS8qIG51bWJlciBvZiBkZXZpY2Ugb24gdGhlIGJ1cyAqLworCUdVSUQgZGV2SW5zdEd1aWQ7CS8qIGluc3RhbmNlIGd1aWQgZm9yIGRldmljZSAqLworCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7CS8qIHJlY3Yvc2VuZCBpbnRlcnJ1cHQgaW5mbyAqLworCS8qIHJlY3ZJbnRlcnJ1cHRIYW5kbGUgY29udGFpbnMgaW5mbyBuZWVkZWQgaW4gb3JkZXIgdG8KKwkgKiByZWdpc3RlciB0byByZWNlaXZlIGludGVycnVwdHMgb24gdGhlIGRhdGEgY2hhbm5lbC4KKwkgKiBzZW5kSW50ZXJydXB0SGFuZGxlIGNvbnRhaW5zIGhhbmRsZSB3aGljaCBpcyBwcm92aWRlZCB0bworCSAqIG1vbml0b3IgVk1DQUxMIHRoYXQgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgdG8gYmUgZ2VuZXJhdGVkCisJICogZm9yIHRoZSBvdGhlciBlbmQuCisJICovCit9OworCitzdHJ1Y3QgcGF1c2VfdmlydF9ndWVzdHBhcnQgeworCXZvaWQgX19pb21lbSAqY2hhbnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSBjaGFubmVsICovCit9OworCitzdHJ1Y3QgcmVzdW1lX3ZpcnRfZ3Vlc3RwYXJ0IHsKKwl2b2lkIF9faW9tZW0gKmNoYW5wdHI7CQkvKiBwb2ludGVyIHRvIGRhdGEgY2hhbm5lbCAqLworfTsKKworc3RydWN0IGRlbF92aXJ0X2d1ZXN0cGFydCB7CisJdm9pZCBfX2lvbWVtICpjaGFucHRyOwkJLyogcG9pbnRlciB0byBkYXRhIGNoYW5uZWwgKi8KK307CisKK3N0cnVjdCBpbml0X2NoaXBzZXRfZ3Vlc3RwYXJ0IHsKKwlVMzIgYnVzQ291bnQ7CQkvKiBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2YgYnVzc2VzICovCisJVTMyIHN3aXRjaENvdW50OwkvKiBpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2Ygc3dpdGNoZXMgKi8KK307CisKK3N0cnVjdCBndWVzdF9tc2dzIHsKKworCUdVRVNUUEFSVF9NU0dfVFlQRSBtc2d0eXBlOworCisJLyogYWRkaXRpb25hbCBwYXJhbXMgbmVlZGVkIGJ5IG1lc3NhZ2VzICovCisJdW5pb24geworCQlzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0IGFkZF92YnVzOworCQlzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0IGFkZF92aGJhOworCQlzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0IGFkZF92bmljOworCQlzdHJ1Y3QgcGF1c2VfdmlydF9ndWVzdHBhcnQgcGF1c2VfdmhiYTsKKwkJc3RydWN0IHBhdXNlX3ZpcnRfZ3Vlc3RwYXJ0IHBhdXNlX3ZuaWM7CisJCXN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgcmVzdW1lX3ZoYmE7CisJCXN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgcmVzdW1lX3ZuaWM7CisJCXN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgZGVsX3ZidXM7CisJCXN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgZGVsX3ZoYmE7CisJCXN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgZGVsX3ZuaWM7CisJCXN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgZGVsX2FsbF92aGJhczsKKwkJc3RydWN0IGRlbF92YnVzX2d1ZXN0cGFydCBkZWxfYWxsX3ZuaWNzOworCQkvKiBkZWxfYWxsX3ZidXNlcyBuZWVkcyBubyBwYXJhbWV0ZXJzICovCisJfTsKKwlzdHJ1Y3QgaW5pdF9jaGlwc2V0X2d1ZXN0cGFydCBpbml0X2NoaXBzZXQ7CisKK307CisKKyNpZm5kZWYgX194ZworI2RlZmluZSBfX3hnKHgpICgodm9sYXRpbGUgbG9uZyAqKSh4KSkKKyNlbmRpZgorCisvKgorKiAgQmVsb3cgY29kZSBpcyBhIGNvcHkgb2YgTGludXgga2VybmVsJ3MgY21weGNoZyBmdW5jdGlvbiBsb2NhdGVkIGF0CisqICB0aGlzIHBsYWNlCisqICBodHRwOi8vdGNzeGVvbjo4MDgwL3NvdXJjZS94cmVmLzAwdHJ1bmstQXBwT1MtbGludXgvaW5jbHVkZS9hc20teDg2L2NtcHhjaGdfNjQuaCM4NAorKiAgUmVhc29uIGZvciBjcmVhdGluZyBvdXIgb3duIHZlcnNpb24gb2YgY21weGNoZyBhbG9uZyB3aXRoCisqICBVSVNMSUJfTE9DS19QUkVGSVggaXMgdG8gbWFrZSB0aGUgb3BlcmF0aW9uIGF0b21pYyBldmVuIGZvciBub24gU01QCisqICBndWVzdHMuCisqLworCisjZGVmaW5lIHVpc2xpYmNtcHhjaGc2NChwLCBvLCBuLCBzKSBjbXB4Y2hnKHAsIG8sIG4pCisKKyNlbmRpZgkJCQkvKiBfX1VJU1FVRVVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3RocmVhZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWZiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmgKQEAgLTAsMCArMSw0NiBAQAorLyogdWlzdGhyZWFkLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFVuaXN5cyB0aHJlYWQgdXRpbGl0aWVzIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fVUlTVEhSRUFEX0hfXworI2RlZmluZSBfX1VJU1RIUkVBRF9IX18KKworCisjaW5jbHVkZSAibGludXgvY29tcGxldGlvbi5oIgorCitzdHJ1Y3QgdWlzdGhyZWFkX2luZm8geworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlpbnQgaWQ7CisJaW50IHNob3VsZF9zdG9wOworCXN0cnVjdCBjb21wbGV0aW9uIGhhc19zdG9wcGVkOworfTsKKworCisvKiByZXR1cm5zIDAgZm9yIGZhaWx1cmUsIDEgZm9yIHN1Y2Nlc3MgKi8KK2ludCB1aXN0aHJlYWRfc3RhcnQoCisJc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvLAorCWludCAoKnRocmVhZGZuKSh2b2lkICopLAorCXZvaWQgKnRocmNvbnRleHQsCisJY2hhciAqbmFtZSk7CisKK3ZvaWQgdWlzdGhyZWFkX3N0b3Aoc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvKTsKKworI2VuZGlmIC8qIF9fVUlTVEhSRUFEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3V0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmRhYjNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3V0aWxzLmgKQEAgLTAsMCArMSwzNDggQEAKKy8qIHVpc3V0aWxzLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiBVbmlzeXMgVmlydHVhbCBIQkEgdXRpbGl0aWVzIGhlYWRlcgorICovCisKKyNpZm5kZWYgX19VSVNVVElMU19fSF9fCisjZGVmaW5lIF9fVUlTVVRJTFNfX0hfXworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworI2luY2x1ZGUgInZtY2FsbGludGVyZmFjZS5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJ1aXN0aHJlYWQuaCIKKyNpbmNsdWRlICJ1aXNxdWV1ZS5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorCisvKiBUaGlzIGlzIHRoZSBNQUdJQyBudW1iZXIgc3R1ZmZlZCBieSB2aXJ0aGJhIGluIGhvc3QtPnRoaXNfaWQuIFVzZWQgdG8KKyAqIGlkZW50aWZ5IHZpcnR1YWwgaGJhcy4KKyAqLworI2RlZmluZSBVSVNfTUFHSUNfVkhCQSA3MDcKKworLyogZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWN0IGFzIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbnRvCisgKiB1aXNuaWNtb2QsIHVpc3NkbW9kLCBhbmQgdmlydHBjaW1vZAorICovCitleHRlcm4gaW50ICgqVWlzbmljQ29udHJvbENoYW5GdW5jKShzdHJ1Y3QgaW9fbXNncyAqKTsKK2V4dGVybiBpbnQgKCpVaXNzZENvbnRyb2xDaGFuRnVuYykoc3RydWN0IGlvX21zZ3MgKik7CitleHRlcm4gaW50ICgqVmlydENvbnRyb2xDaGFuRnVuYykoc3RydWN0IGd1ZXN0X21zZ3MgKik7CisKKy8qIFJldHVybiB2YWx1ZXMgb2YgYWJvdmUgY2FsbGJhY2sgZnVuY3Rpb25zOiAqLworI2RlZmluZSBDQ0ZfRVJST1IgICAgICAgIDAJLyogY29tcGxldGVkIGFuZCBmYWlsZWQgKi8KKyNkZWZpbmUgQ0NGX09LICAgICAgICAgICAxCS8qIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKyNkZWZpbmUgQ0NGX1BFTkRJTkcgICAgICAyCS8qIG9wZXJhdGlvbiBzdGlsbCBwZW5kaW5nICovCitleHRlcm4gYXRvbWljX3QgVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlczsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgTUFDQVJSQVlbTUFYX01BQ0FERFJfTEVOXTsKK3R5cGVkZWYgc3RydWN0IFJlcUhhbmRsZXJJbmZvX3N0cnVjdCB7CisJR1VJRCBzd2l0Y2hUeXBlR3VpZDsKKwlpbnQgKCpjb250cm9sZnVuYykoc3RydWN0IGlvX21zZ3MgKik7CisJdW5zaWduZWQgbG9uZyBtaW5fY2hhbm5lbF9ieXRlczsKKwlpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9PaykodW5zaWduZWQgbG9uZyBjaGFubmVsQnl0ZXMpOworCWludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCisJICh2b2lkICp4LCB1bnNpZ25lZCBjaGFyICpjbGllbnRTdHIsIFUzMiBjbGllbnRTdHJMZW4sIFU2NCBieXRlcyk7CisJY2hhciBzd2l0Y2hfdHlwZV9uYW1lWzk5XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfbGluazsJLyogbGlua3MgaW50byBSZXFIYW5kbGVySW5mb19saXN0ICovCit9IFJlcUhhbmRsZXJJbmZvX3Q7CisKK1JlcUhhbmRsZXJJbmZvX3QgKlJlcUhhbmRsZXJBZGQoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkJCQljb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAorCQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKKwkJCQl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAorCQkJCWludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nCisJCQkJCQkJIGNoYW5uZWxCeXRlcyksCisJCQkJaW50ICgqU2VydmVyX0NoYW5uZWxfSW5pdCkKKwkJCQkgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwKKwkJCQkgIFUzMiBjbGllbnRTdHJMZW4sIFU2NCBieXRlcykpOworUmVxSGFuZGxlckluZm9fdCAqUmVxSGFuZGxlckZpbmQoR1VJRCBzd2l0Y2hUeXBlR3VpZCk7CitpbnQgUmVxSGFuZGxlckRlbChHVUlEIHN3aXRjaFR5cGVHdWlkKTsKKworI2RlZmluZSB1aXNsaWJfaW9yZW1hcF9jYWNoZShhZGRyLCBzaXplKSBcCisJZGJnX2lvcmVtYXBfY2FjaGUoYWRkciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqCitkYmdfaW9yZW1hcF9jYWNoZShVNjQgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwl2b2lkIF9faW9tZW0gKm5ldzsKKwluZXcgPSBpb3JlbWFwX2NhY2hlKGFkZHIsIHNpemUpOworCXJldHVybiBuZXc7Cit9CisKKyNkZWZpbmUgdWlzbGliX2lvcmVtYXAoYWRkciwgc2l6ZSkgZGJnX2lvcmVtYXAoYWRkciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorZGJnX2lvcmVtYXAoVTY0IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJdm9pZCAqbmV3OworCW5ldyA9IGlvcmVtYXAoYWRkciwgc2l6ZSk7CisJcmV0dXJuIG5ldzsKK30KKworI2RlZmluZSB1aXNsaWJfaW91bm1hcChhZGRyKSBkYmdfaW91bm1hcChhZGRyLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGJnX2lvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKwlpb3VubWFwKGFkZHIpOworfQorCisjZGVmaW5lIFBST0NfUkVBRF9CVUZGRVJfU0laRSAxMzEwNzIJLyogc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIHRvCisJCQkJCSAqIGhvbGQgYWxsIG9mIC9wcm9jL1hYWC9pbmZvICovCitpbnQgdWlzdXRpbF9hZGRfcHJvY19saW5lX2V4KGludCAqdG90YWwsIGNoYXIgKipidWZmZXIsIGludCAqYnVmZmVyX3JlbWFpbmluZywKKwkJCSAgICAgY2hhciAqZm9ybWF0LCAuLi4pOworCitpbnQgdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcihpbnQgdHlwZSwgdm9pZCAqZnB0ciwKKwkJCQkgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pOworaW50IHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkJCQkgICAgY29uc3QgY2hhciAqc3dpdGNoX3R5cGVfbmFtZSwKKwkJCQkgICAgaW50ICgqZnB0cikoc3RydWN0IGlvX21zZ3MgKiksCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCisJCQkJICAgIGludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nCisJCQkJCQkJICAgICBjaGFubmVsQnl0ZXMpLAorCQkJCSAgICBpbnQgKCpTZXJ2ZXJfQ2hhbm5lbF9Jbml0KQorCQkJCSAgICAodm9pZCAqeCwgdW5zaWduZWQgY2hhciAqY2xpZW50U3RyLAorCQkJCSAgICAgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSwKKwkJCQkgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pOworCitpbnQgdWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KEdVSUQgc3dpdGNoVHlwZUd1aWQpOwordW5zaWduZWQgY2hhciAqdXRpbF9tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7Cit2b2lkIHV0aWxfdW5tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7Cit1bnNpZ25lZCBjaGFyICp1dGlsX21hcF92aXJ0X2F0b21pYyhzdHJ1Y3QgcGh5c19pbmZvICpzZyk7Cit2b2lkIHV0aWxfdW5tYXBfdmlydF9hdG9taWModm9pZCAqYnVmKTsKK2ludCB1aXNsaWJfc2VydmVyX2luamVjdF9hZGRfdm5pYyhVMzIgc3dpdGNoTm8sIFUzMiBCdXNObywgVTMyIG51bUludFBvcnRzLAorCQkJCSAgVTMyIG51bUV4dFBvcnRzLCBNQUNBUlJBWSBwbWFjW10sCisJCQkJICBwQ0hBTk5FTF9IRUFERVIgKipjaGFuKTsKK3ZvaWQgdWlzbGliX3NlcnZlcl9pbmplY3RfZGVsX3ZuaWMoVTMyIHN3aXRjaE5vLCBVMzIgYnVzTm8sIFUzMiBudW1JbnRQb3J0cywKKwkJCQkgICBVMzIgbnVtRXh0UG9ydHMpOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF9idXMoVTMyIGJ1c05vLCBHVUlEIGluc3RHdWlkLAorCQkJCSBVNjQgY2hhbm5lbEFkZHIsIHVsb25nIG5DaGFubmVsQnl0ZXMpOworaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfYnVzKFUzMiBidXNObyk7CisKK2ludCB1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCQkgIFU2NCBwaHlzX2NoYW5fYWRkciwgVTMyIGNoYW5fYnl0ZXMsCisJCQkJICBpbnQgaXNfdGVzdF9hZGRyLCBHVUlEIGluc3RHdWlkLAorCQkJCSAgc3RydWN0IEludGVycnVwdEluZm8gKmludHIpOworaW50ICB1aXNsaWJfY2xpZW50X2luamVjdF9wYXVzZV92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKTsKK2ludCAgdWlzbGliX2NsaWVudF9pbmplY3RfcmVzdW1lX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X2RlbF92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKTsKK2ludCB1aXNsaWJfY2xpZW50X2luamVjdF9hZGRfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObywKKwkJCQkgIFU2NCBwaHlzX2NoYW5fYWRkciwgVTMyIGNoYW5fYnl0ZXMsCisJCQkJICBpbnQgaXNfdGVzdF9hZGRyLCBHVUlEIGluc3RHdWlkLAorCQkJCSAgc3RydWN0IEludGVycnVwdEluZm8gKmludHIpOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pOworaW50IHVpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92bmljKFUzMiBidXNObywgVTMyIGRldk5vKTsKK2ludCB1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObyk7CisjaWZkZWYgU1RPUkFHRV9DSEFOTkVMCitVNjQgdWlzbGliX3N0b3JhZ2VfY2hhbm5lbChpbnQgY2xpZW50X2lkKTsKKyNlbmRpZgoraW50IHVpc2xpYl9nZXRfb3duZWRfcGRlc3Qoc3RydWN0IHVpc3Njc2lfZGVzdCAqcGRlc3QpOworCitpbnQgdWlzbGliX3NlbmRfZXZlbnQoQ09OVFJPTFZNX0lEIGlkLCBDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmV2ZW50KTsKKworLyogc3RydWN0dXJlIHVzZWQgYnkgdmhiYSAmIHZuaWMgdG8ga2VlcCB0cmFjayBvZiBxdWV1ZSAmIHRocmVhZCBpbmZvICovCitzdHJ1Y3QgY2hhbmluZm8geworCXN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm87CisJLyogdGhpcyBzcGVjaWZpZXMgdGhlIHF1ZXVlIHN0cnVjdHVyZXMgZm9yIGEgY2hhbm5lbCAqLworCS8qIEFMTE9DQVRFRCBCWSBUSEUgT1RIRVIgRU5EIC0gV0UgSlVTVCBHRVQgQSBQT0lOVEVSIFRPIFRIRSBNRU1PUlkgKi8KKwlzcGlubG9ja190IGluc2VydGxvY2s7CisJLyogY3VycmVudGx5IHVzZWQgb25seSBpbiB2aXJ0bmljIHdoZW4gc2VuZGluZyBkYXRhIHRvIHVpc25pYyAqLworCS8qIHRvIHN5bmNocm9uaXplIHRoZSBpbnNlcnRzIGludG8gdGhlIHNpZ25hbCBxdWV1ZSAqLworCXN0cnVjdCB1aXN0aHJlYWRfaW5mbyB0aHJlYWRpbmZvOworCS8qIHRoaXMgc3BlY2lmaWVzIHRoZSB0aHJlYWQgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSB0aHJlYWQgdGhhdCAqLworCS8qIGhhbmRsZXMgdGhpcyBjaGFubmVsICovCit9OworCisvKiB0aGlzIGlzIHRoZSB3YWl0IGNvZGUgZm9yIGFsbCB0aGUgdGhyZWFkcyAtIGl0IGlzIHVzZWQgdG8gZ2V0CisqIHNvbWV0aGluZyBmcm9tIGEgcXVldWUgY2hvaWNlczogd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlLAorKiBfdGltZW91dCwgaW50ZXJydXB0aWJsZV90aW1lb3V0CisqLworI2RlZmluZSBVSVNfVEhSRUFEX1dBSVRfTVNFQyh4KSB7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKHgpKTsgXAorfQorI2RlZmluZSBVSVNfVEhSRUFEX1dBSVRfVVNFQyh4KSB7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisJc2NoZWR1bGVfdGltZW91dCh1c2Vjc190b19qaWZmaWVzKHgpKTsgXAorfQorI2RlZmluZSBVSVNfVEhSRUFEX1dBSVQgVUlTX1RIUkVBRF9XQUlUX01TRUMoNSkKKyNkZWZpbmUgVUlTX1RIUkVBRF9XQUlUX1NFQyh4KSB7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisJc2NoZWR1bGVfdGltZW91dCgoeCkqSFopOyBcCit9CisKKy8qIFRoaXMgaXMgYSBoYWNrIHVudGlsIHdlIGZpeCBJT1ZNIHRvIGluaXRpYWxpemUgdGhlIGNoYW5uZWwgaGVhZGVyCisgKiBjb3JyZWN0bHkgYXQgREVWSUNFX0NSRUFURSB0aW1lLCBJTlNURUFEIE9GIHdhaXRpbmcgdW50aWwKKyAqIERFVklDRV9DT05GSUdVUkUgdGltZS4KKyAqLworI2RlZmluZSBXQUlUX0ZPUl9WQUxJRF9HVUlEKGd1aWQpIFwKKwlkbyB7CQkJCQkJICAgXAorCQl3aGlsZSAoTUVNQ01QX0lPKCZndWlkLCAmR3VpZDAsIHNpemVvZihHdWlkMCkpID09IDApIHsJXAorCQkJTE9HRVJSKCJXYWl0aW5nIGZvciBub24tMCBHVUlEICh3aHk/Pz8pLi4uXG4iKTsgXAorCQkJVUlTX1RIUkVBRF9XQUlUX1NFQyg1KTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJTE9HRVJSKCJPSy4uLiBHVUlEIGlzIG5vbi0wIG5vd1xuIik7CQkJXAorCX0gd2hpbGUgKDApCisKKy8qIENvcHlGcmFnc0luZm9Gcm9tU2tiIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFkZGVkIHRvIGZyYWdzIGFycmF5CisgKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuCisgKi8KK3Vuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAorCQkJCQkgICAgIHZvaWQgKnNrYl9pbiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBmcmFnc19tYXgsCisJCQkJCSAgICAgc3RydWN0IHBoeXNfaW5mbyBmcmFnc1tdKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK0lzc3VlX1ZNQ0FMTF9JT19DT05UUk9MVk1fQUREUihVNjQgKkNvbnRyb2xBZGRyZXNzLCBVMzIgKkNvbnRyb2xCeXRlcykKK3sKKwlWTUNBTExfSU9fQ09OVFJPTFZNX0FERFJfUEFSQU1TIHBhcmFtczsKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyOworCisJcGh5c2FkZHIgPSB2aXJ0X3RvX3BoeXMoJnBhcmFtcyk7CisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUiwgcGh5c2FkZHIsIHJlc3VsdCk7CisJaWYgKFZNQ0FMTF9TVUNDRVNTRlVMKHJlc3VsdCkpIHsKKwkJKkNvbnRyb2xBZGRyZXNzID0gcGFyYW1zLkNoYW5uZWxBZGRyZXNzOworCQkqQ29udHJvbEJ5dGVzID0gcGFyYW1zLkNoYW5uZWxCeXRlczsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgSXNzdWVfVk1DQUxMX0lPX0RJQUdfQUREUihVNjQgKkRpYWdDaGFubmVsQWRkcmVzcykKK3sKKwlWTUNBTExfSU9fRElBR19BRERSX1BBUkFNUyBwYXJhbXM7CisJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOworCVU2NCBwaHlzYWRkcjsKKworCXBoeXNhZGRyID0gdmlydF90b19waHlzKCZwYXJhbXMpOworCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfSU9fRElBR19BRERSLCBwaHlzYWRkciwgcmVzdWx0KTsKKwlpZiAoVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KSkKKwkJKkRpYWdDaGFubmVsQWRkcmVzcyA9IHBhcmFtcy5DaGFubmVsQWRkcmVzczsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorSXNzdWVfVk1DQUxMX0lPX1ZJU09SU0VSSUFMX0FERFIoVTY0ICpEaWFnQ2hhbm5lbEFkZHJlc3MpCit7CisJVk1DQUxMX0lPX1ZJU09SU0VSSUFMX0FERFJfUEFSQU1TIHBhcmFtczsKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyOworCisJcGh5c2FkZHIgPSB2aXJ0X3RvX3BoeXMoJnBhcmFtcyk7CisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9JT19WSVNPUlNFUklBTF9BRERSLCBwaHlzYWRkciwgcmVzdWx0KTsKKwlpZiAoVk1DQUxMX1NVQ0NFU1NGVUwocmVzdWx0KSkKKwkJKkRpYWdDaGFubmVsQWRkcmVzcyA9IHBhcmFtcy5DaGFubmVsQWRkcmVzczsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIFM2NCBJc3N1ZV9WTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCh2b2lkKQoreworCVU2NCByZXN1bHQgPSBWTUNBTExfU1VDQ0VTUzsKKwlVNjQgcGh5c2FkZHIgPSAwOworCisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VULCBwaHlzYWRkciwKKwkJCXJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBTNjQgSXNzdWVfVk1DQUxMX01FQVNVUkVNRU5UX0RPX05PVEhJTkcodm9pZCkKK3sKKwlVNjQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisJVTY0IHBoeXNhZGRyID0gMDsKKworCUlTU1VFX0lPX1ZNQ0FMTChWTUNBTExfTUVBU1VSRU1FTlRfRE9fTk9USElORywgcGh5c2FkZHIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGxvZ19pbmZvX3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X2N5Y2xlczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGFfc3VtWzY0XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGFfY250WzY0XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWF4X2RlbHRhWzY0XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWluX2RlbHRhWzY0XTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IElzc3VlX1ZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRShVNjQgYWRqdXN0bWVudCkKK3sKKwlpbnQgcmVzdWx0ID0gVk1DQUxMX1NVQ0NFU1M7CisKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FLCBhZGp1c3RtZW50LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitJc3N1ZV9WTUNBTExfQ0hBTk5FTF9NSVNNQVRDSChjb25zdCBjaGFyICpDaGFubmVsTmFtZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKkl0ZW1OYW1lLAorCQkJICAgICAgVTMyIFNvdXJjZUxpbmVOdW1iZXIsIGNvbnN0IGNoYXIgKnBhdGhfbl9mbikKK3sKKwlWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUyBwYXJhbXM7CisJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOworCVU2NCBwaHlzYWRkcjsKKwljaGFyICpsYXN0X3NsYXNoID0gTlVMTDsKKworCXN0cm5jcHkocGFyYW1zLkNoYW5uZWxOYW1lLCBDaGFubmVsTmFtZSwKKwkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsIENoYW5uZWxOYW1lKSk7CisJc3RybmNweShwYXJhbXMuSXRlbU5hbWUsIEl0ZW1OYW1lLAorCQlsZW5ndGhvZihWTUNBTExfQ0hBTk5FTF9WRVJTSU9OX01JU01BVENIX1BBUkFNUywgSXRlbU5hbWUpKTsKKwlwYXJhbXMuU291cmNlTGluZU51bWJlciA9IFNvdXJjZUxpbmVOdW1iZXI7CisKKwlsYXN0X3NsYXNoID0gc3RycmNocihwYXRoX25fZm4sICcvJyk7CisJaWYgKGxhc3Rfc2xhc2ggIT0gTlVMTCkgeworCQlsYXN0X3NsYXNoKys7CisJCXN0cm5jcHkocGFyYW1zLlNvdXJjZUZpbGVOYW1lLCBsYXN0X3NsYXNoLAorCQkJbGVuZ3Rob2YoVk1DQUxMX0NIQU5ORUxfVkVSU0lPTl9NSVNNQVRDSF9QQVJBTVMsCisJCQkJIFNvdXJjZUZpbGVOYW1lKSk7CisJfSBlbHNlCisJCXN0cm5jcHkocGFyYW1zLlNvdXJjZUZpbGVOYW1lLAorCQkJIkNhbm5vdCBkZXRlcm1pbmUgc291cmNlIGZpbGVuYW1lIiwKKwkJCWxlbmd0aG9mKFZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0hfUEFSQU1TLAorCQkJCSBTb3VyY2VGaWxlTmFtZSkpOworCisJcGh5c2FkZHIgPSB2aXJ0X3RvX3BoeXMoJnBhcmFtcyk7CisJSVNTVUVfSU9fVk1DQUxMKFZNQ0FMTF9DSEFOTkVMX1ZFUlNJT05fTUlTTUFUQ0gsIHBoeXNhZGRyLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IElzc3VlX1ZNQ0FMTF9GQVRBTF9CWUVfQllFKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOworCVU2NCBwaHlzYWRkciA9IDA7CisKKwlJU1NVRV9JT19WTUNBTEwoVk1DQUxMX0dFTkVSSUNfU1VSUkVOREVSX1FVQU5UVU1fRk9SRVZFUiwgcGh5c2FkZHIsCisJCQlyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgVUlTX0RBRU1PTklaRShuYW0pCit2b2lkICp1aXNsaWJfY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmN1cl9wb29sLCBjaGFyICpmbiwgaW50IGxuKTsKKyNkZWZpbmUgVUlTQ0FDSEVBTExPQyhjdXJfcG9vbCkgdWlzbGliX2NhY2hlX2FsbG9jKGN1cl9wb29sLCBfX0ZJTEVfXywgX19MSU5FX18pCit2b2lkIHVpc2xpYl9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpjdXJfcG9vbCwgdm9pZCAqcCwgY2hhciAqZm4sIGludCBsbik7CisjZGVmaW5lIFVJU0NBQ0hFRlJFRShjdXJfcG9vbCwgcCkgXAorCXVpc2xpYl9jYWNoZV9mcmVlKGN1cl9wb29sLCBwLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK3ZvaWQgdWlzbGliX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkJICAgICAgaW50ICgqaW50ZXJydXB0KSh2b2lkICopLAorCQkJCSAgICAgIHZvaWQgKmludGVycnVwdF9jb250ZXh0KTsKK3ZvaWQgdWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKFUzMiBidXNObywgVTMyIGRldk5vKTsKK3ZvaWQgdWlzbGliX2ZvcmNlX2NoYW5uZWxfaW50ZXJydXB0KFUzMiBidXNObywgVTMyIGRldk5vKTsKKworI2VuZGlmIC8qIF9fVUlTVVRJTFNfX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91bmlrbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3Yjg3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91bmlrbG9nLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qIHVuaWtsb2cuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogVGhpcyBtb2R1bGUgY29udGFpbnMgbWFjcm9zIHRvIGFpZCBkZXZlbG9wZXJzIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgKgorICogVGhpcyBtb2R1bGUgaXMgYWZmZWN0ZWQgYnkgdGhlIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbi4KKyAqCisgKi8KKyNpZm5kZWYgX19VTklLTE9HX0hfXworI2RlZmluZSBfX1VOSUtMT0dfSF9fCisKKworI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorCisvKgorICogIyBEQkdJTkYKKyAqCisgKiBcYnJpZWYgTG9nIGRlYnVnIGluZm9ybWF0aW9uYWwgbWVzc2FnZSAtIGxvZyBhIExPR19JTkZPIG1lc3NhZ2Ugb25seQorICogICAgICAgIGlmIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbiBlbmFibGVkCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlCisgKiAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLgorICogXHJldHVybiBub3RoaW5nCisgKgorICogTG9nIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0lORk8gbGV2ZWwsIGJ1dCBvbmx5IGlmIERFQlVHIGlzIGVuYWJsZWQuICBJZgorICogREVCVUcgaXMgZGlzYWJsZWQsIHRoaXMgZXhwYW5kcyB0byBhIG5vLW9wLgorICovCisKKy8qCisgKiAjIERCR1ZFUgorICoKKyAqIFxicmllZiBMb2cgZGVidWcgdmVyYm9zZSBtZXNzYWdlIC0gbG9nIGEgTE9HX0RFQlVHIG1lc3NhZ2Ugb25seSBpZgorICogICAgICAgIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbiBlbmFibGVkCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlCisgKiAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLgorICogXHJldHVybiBub3RoaW5nCisgKgorICogTG9nIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0RFQlVHIGxldmVsLCBidXQgb25seSBpZiBERUJVRyBpcyBlbmFibGVkLiAgSWYKKyAqIERFQlVHIGlzIGRpc2FibGVkLCB0aGlzIGV4cGFuZHMgdG8gYSBuby1vcC4gIE5vdGUgYWxzbyB0aGF0IExPR19ERUJVRworICogbWVzc2FnZXMgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgYXQgcnVudGltZSBhcyB3ZWxsLgorICovCisjZGVmaW5lIERCR0lORkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIERCR1ZFUkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIERCR0lORihmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIERCR1ZFUihmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiAjIExPR0lORgorICoKKyAqIFxicmllZiBMb2cgaW5mb3JtYXRpb25hbCBtZXNzYWdlIC0gbG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19JTkZPIGxldmVsCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlCisgKiAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLgorICogXHJldHVybiBub3RoaW5nCisgKgorICogTG9ncyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXQgdGhlIExPR19JTkZPIGxldmVsLgorICovCisKKyNkZWZpbmUgTE9HSU5GKGZtdCwgYXJncy4uLikgcHJfaW5mbyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR0lORkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcl9pbmZvKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKKyNkZWZpbmUgTE9HSU5GREVWWChkZXZubywgZm10LCBhcmdzLi4uKSBcCisJcHJfaW5mbygiZGV2JWQgIiBmbXQsIGRldm5vLCAjIyBhcmdzKQorI2RlZmluZSBMT0dJTkZOQU1FKHZuaWMsIGZtdCwgYXJncy4uLikJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAorCQkJcHJfaW5mbygiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJcHJfaW5mbyhmbXQsICMjIGFyZ3MpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiAjIExPR1ZFUgorICoKKyAqIFxicmllZiBMb2cgdmVyYm9zZSBtZXNzYWdlIC0gbG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbCwKKyAqICAgICAgICB3aGljaCBjYW4gYmUgZGlzYWJsZWQgYXQgcnVudGltZQorICoKKyAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCisgKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCisgKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCisgKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBmb3JtYXQKKyAqIFxwYXJhbSBzdHJpbmcuCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKiBMb2dzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhdCB0aGUgTE9HX0RFQlVHIGxldmVsLiAgTm90ZSBhbHNvIHRoYXQKKyAqIExPR19ERUJVRyBtZXNzYWdlcyBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBhdCBydW50aW1lIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgTE9HVkVSKGZtdCwgYXJncy4uLikgcHJfZGVidWcoZm10LCAjIyBhcmdzKQorI2RlZmluZSBMT0dWRVJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCisJcHJfZGVidWcoIiVzICIgZm10LCBkZXZuYW1lLCAjIyBhcmdzKQorI2RlZmluZSBMT0dWRVJOQU1FKHZuaWMsIGZtdCwgYXJncy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICh2bmljICE9IE5VTEwpIHsJCQkJCVwKKwkJCXByX2RlYnVnKCIlcyAiIGZtdCwgdm5pYy0+bmFtZSwgIyMgYXJncyk7CVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlwcl9kZWJ1ZyhmbXQsICMjIGFyZ3MpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKworLyoKKyAqICMgTE9HRVJSCisgKgorICogXGJyaWVmIExvZyBlcnJvciBtZXNzYWdlIC0gbG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19FUlIgbGV2ZWwsCisgKiAgICAgICAgaW5jbHVkaW5nIHNvdXJjZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbgorICoKKyAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCisgKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCisgKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCisgKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBmb3JtYXQKKyAqIFxwYXJhbSBzdHJpbmcuCisgKiBccmV0dXJuIG5vdGhpbmcKKyAqCisgKiBMb2dzIHRoZSBzcGVjaWZpZWQgZXJyb3IgbWVzc2FnZSBhdCB0aGUgTE9HX0VSUiBsZXZlbC4gIEl0IHdpbGwgYWxzbworICogaW5jbHVkZSB0aGUgZmlsZSwgbGluZSBudW1iZXIsIGFuZCBmdW5jdGlvbiBuYW1lIG9mIHdoZXJlIHRoZSBlcnJvcgorICogb3JpZ2luYXRlZCBpbiB0aGUgbG9nIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgTE9HRVJSKGZtdCwgYXJncy4uLikgcHJfZXJyKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgTE9HRVJSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAorCXByX2VycigiJXMgIiBmbXQsIGRldm5hbWUsICMjIGFyZ3MpCisjZGVmaW5lIExPR0VSUkRFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikgXAorCXByX2VycigiZGV2JWQgIiBmbXQsIGRldm5vLCAjIyBhcmdzKQorI2RlZmluZSBMT0dFUlJOQU1FKHZuaWMsIGZtdCwgYXJncy4uLikJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAorCQkJcHJfZXJyKCIlcyAiIGZtdCwgdm5pYy0+bmFtZSwgIyMgYXJncyk7CVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlwcl9lcnIoZm10LCAjIyBhcmdzKTsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBMT0dPUkRVTVBFUlIoc2VxZmlsZSwgZm10LCBhcmdzLi4uKSBkbyB7CQlcCisJCWlmIChzZXFmaWxlKSB7CQkJCQlcCisJCQlzZXFfcHJpbnRmKHNlcWZpbGUsIGZtdCwgIyMgYXJncyk7CVwKKwkJfSBlbHNlIHsJCQkJCVwKKwkJCUxPR0VSUihmbXQsICMjIGFyZ3MpOwkJCVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKgorICogIyBMT0dXUk4KKyAqCisgKiBcYnJpZWYgTG9nIHdhcm5pbmcgbWVzc2FnZSAtIExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBMT0dfV0FSTklORyBsZXZlbCwKKyAqICAgICAgICBpbmNsdWRpbmcgc291cmNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCisgKgorICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKKyAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KKyAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KKyAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIGZvcm1hdAorICogXHBhcmFtIHN0cmluZy4KKyAqIFxyZXR1cm4gbm90aGluZworICoKKyAqIExvZ3MgdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlIGF0IHRoZSBMT0dfV0FSTklORyBsZXZlbC4gIEl0IHdpbGwgYWxzbworICogaW5jbHVkZSB0aGUgZmlsZSwgbGluZSBudW1iZXIsIGFuZCBmdW5jdGlvbiBuYW1lIG9mIHdoZXJlIHRoZSBlcnJvcgorICogb3JpZ2luYXRlZCBpbiB0aGUgbG9nIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgTE9HV1JOKGZtdCwgYXJncy4uLikgcHJfd2FybihmbXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR1dSTkRFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcl93YXJuKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKKyNkZWZpbmUgTE9HV1JOTkFNRSh2bmljLCBmbXQsIGFyZ3MuLi4pIFwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICh2bmljICE9IE5VTEwpIHsJCQkJCVwKKwkJCXByX3dhcm4oIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCXByX3dhcm4oZm10LCAjIyBhcmdzKTsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX19VTklLTE9HX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlMzVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyogdmJ1c2hlbHBlci5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMSAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVkJVU0hFTFBFUl9IX18KKyNkZWZpbmUgX19WQlVTSEVMUEVSX0hfXworCisjaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKKworLyogVEFSR0VUX0hPU1ROQU1FIHNwZWNpZmllZCBhcyAtRFRBUkdFVF9IT1NUTkFNRT1cInRoZW5hbWVcIiBvbiB0aGUKKyAqIGNvbW1hbmQgbGluZSAqLworCisjZGVmaW5lIFRBUkdFVF9IT1NUTkFNRSAibGludXhndWVzdCIKKworc3RhdGljIGlubGluZSB2b2lkCitCdXNEZXZpY2VJbmZvX0luaXQoVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpwQnVzRGV2aWNlSW5mbywKKwkJICAgY29uc3QgY2hhciAqZGV2aWNlVHlwZSwgY29uc3QgY2hhciAqZHJpdmVyTmFtZSwKKwkJICAgY29uc3QgY2hhciAqdmVyLCBjb25zdCBjaGFyICp2ZXJUYWcsCisJCSAgIGNvbnN0IGNoYXIgKmJ1aWxkRGF0ZSwgY29uc3QgY2hhciAqYnVpbGRUaW1lKQoreworCW1lbXNldChwQnVzRGV2aWNlSW5mbywgMCwgc2l6ZW9mKFVMVFJBX1ZCVVNfREVWSUNFSU5GTykpOworCXNucHJpbnRmKHBCdXNEZXZpY2VJbmZvLT5kZXZUeXBlLCBzaXplb2YocEJ1c0RldmljZUluZm8tPmRldlR5cGUpLAorCQkgIiVzIiwgKGRldmljZVR5cGUpID8gZGV2aWNlVHlwZSA6ICJ1bmtub3duVHlwZSIpOworCXNucHJpbnRmKHBCdXNEZXZpY2VJbmZvLT5kcnZOYW1lLCBzaXplb2YocEJ1c0RldmljZUluZm8tPmRydk5hbWUpLAorCQkgIiVzIiwgKGRyaXZlck5hbWUpID8gZHJpdmVyTmFtZSA6ICJ1bmtub3duRHJpdmVyIik7CisJc25wcmludGYocEJ1c0RldmljZUluZm8tPmluZm9TdHJpbmdzLAorCQkgc2l6ZW9mKHBCdXNEZXZpY2VJbmZvLT5pbmZvU3RyaW5ncyksICIlc1x0JXNcdCVzICVzXHQlcyIsCisJCSAodmVyKSA/IHZlciA6ICJ1bmtub3duVmVyIiwKKwkJICh2ZXJUYWcpID8gdmVyVGFnIDogInVua25vd25WZXJUYWciLAorCQkgKGJ1aWxkRGF0ZSkgPyBidWlsZERhdGUgOiAibm9CdWlsZERhdGUiLAorCQkgKGJ1aWxkVGltZSkgPyBidWlsZFRpbWUgOiAibm9idWlsZFRpbWUiLCBUQVJHRVRfSE9TVE5BTUUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODdkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHVpc2xpYiBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVUlTTElCCisJdHJpc3RhdGUgIlVuaXN5cyB1aXNsaWIgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIFVOSVNZU19DSEFOTkVMU1RVQgorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdWlzbGliIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ0ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHVpc2xpYgorIworCitvYmotJChDT05GSUdfVU5JU1lTX1VJU0xJQikJKz0gdmlzb3J1aXNsaWIubworCit2aXNvcnVpc2xpYi15IDo9IHVpc2xpYi5vIHVpc3F1ZXVlLm8gIHVpc3RocmVhZC5vICB1aXN1dGlscy5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jaGFubmVscworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvc3BhcnN0b3Bkcml2ZXIKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzCisKK2NjZmxhZ3MteSArPSAtRENPTkZJR19TUEFSX0dVRVNUIC1ER1VFU1REUklWRVJCVUlMRCAtRE5PQVVUT1ZFUlNJT04KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWE5YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzbGliLmMKQEAgLTAsMCArMSwyNDIxIEBACisvKiB1aXNsaWIuYworICoKKyAqIENvcHlyaWdodCDvv70gMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBAQUxMX0lOU1BFQ1RFRCAqLworI2RlZmluZSBFWFBPUlRfU1lNVEFCCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2lmZGVmIENPTkZJR19NT0RWRVJTSU9OUworI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJkaWFnbm9zdGljcy9hcHBvc19zdWJzeXN0ZW1zLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJ2YnVzY2hhbm5lbC5oIgorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4JLyogZm9yIGNvcHlfZnJvbV91c2VyICovCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4JLyogZm9yIHRvdXBwZXIgKi8KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJzcGFyc3RvcC5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldC5oIgorI2luY2x1ZGUgImNoYW5zdHViLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgorCisjZGVmaW5lIFNFVF9QUk9DX09XTkVSKHgsIHkpCisKKyNkZWZpbmUgVUlTTElCX1RFU1RfUFJPQworI2RlZmluZSBQT0xMSklGRklFU19OT1JNQUwgMQorLyogQ2hvb3NlIHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRvIHdha2V1cCB0aGUgcmVxdWVzdC1wb2xsaW5nIHRocmVhZAorICogYWZ0ZXIgYW4gSU8gdGVybWluYXRpb246CisgKiB0aGlzIGlzIHNob3J0ZXIgdGhhbiB1c2luZyBfX0ZJTEVfXyAoZnVsbCBwYXRoIG5hbWUpIGluCisgKiBkZWJ1Zy9pbmZvL2Vycm9yIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFVJU0xJQl9QQ191aXNsaWJfYworI2RlZmluZSBfX01ZRklMRV9fICJ1aXNsaWIuYyIKKworLyogZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWN0IGFzIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbnRvIHZpcnRwY2ltb2QgKi8KK2ludCAoKlZpcnRDb250cm9sQ2hhbkZ1bmMpKHN0cnVjdCBndWVzdF9tc2dzICopOworCitzdGF0aWMgaW50IFByb2NSZWFkQnVmZmVyVmFsaWQ7CitzdGF0aWMgY2hhciAqUHJvY1JlYWRCdWZmZXI7CS8qIE5vdGUgdGhpcyBNVVNUIGJlIGdsb2JhbCwKKwkJCQkJICogYmVjYXVzZSB0aGUgY29udGVudHMgbXVzdCAqLworc3RhdGljIHVuc2lnbmVkIGludCBjaGlwc2V0X2luaXRlZDsKKworI2RlZmluZSBXQUlUX09OX0NBTExCQUNLKGhhbmRsZSkJXAorCWRvIHsJCQlcCisJCWlmIChoYW5kbGUpCQlcCisJCQlicmVhazsJCVwKKwkJVUlTX1RIUkVBRF9XQUlUOwlcCisJfSB3aGlsZSAoMSkKKworc3RhdGljIHN0cnVjdCBidXNfaW5mbyAqQnVzTGlzdEhlYWQ7CitzdGF0aWMgcndsb2NrX3QgQnVzTGlzdExvY2s7CitzdGF0aWMgaW50IEJ1c0xpc3RDb3VudDsJLyogbnVtYmVyIG9mIGJ1c2VzIGluIHRoZSBsaXN0ICovCitzdGF0aWMgaW50IE1heEJ1c0NvdW50OwkJLyogbWF4aW11bSBudW1iZXIgb2YgYnVzZXMgZXhwZWN0ZWQgKi8KK3N0YXRpYyBVNjQgUGh5c2ljYWxEYXRhQ2hhbjsKK3N0YXRpYyBpbnQgUGxhdGZvcm1OdW1iZXI7CisKK3N0YXRpYyBzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gSW5jb21pbmdfVGhyZWFkSW5mbzsKK3N0YXRpYyBCT09MIEluY29taW5nX1RocmVhZF9TdGFydGVkID0gRkFMU0U7CitzdGF0aWMgTElTVF9IRUFEKExpc3RfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RfbW92ZWRfdG9fdGFpbF9jbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRvdF93YWl0X2NudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdG90X3dha2V1cF9jbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRvdF9zY2hlZHVsZV9jbnQ7CitzdGF0aWMgaW50IGVuX3NtYXJ0X3dha2V1cCA9IDE7CitzdGF0aWMgREVGSU5FX1NFTUFQSE9SRShMb2NrX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsJLyogdW5sb2NrZWQgKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChXYWtldXBfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworc3RhdGljIGludCBHb19Qb2xsaW5nX0RldmljZV9DaGFubmVsczsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdWlzbGliX3Byb2NfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdWlzbGliX3Byb2NfdmJ1c19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2bmljX3Byb2NfZW50cnk7CS8qIFVzZWQgdG8gYmUgImRhdGFjaGFuIiAqLworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqY3RybGNoYW5fcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBtZW1fcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmluZm9fcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnN3aXRjaF9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZXh0cG9ydF9wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGxhdGZvcm1udW1iZXJfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJ1c19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2X3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjaGlwc2V0X3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjeWNsZXNfYmVmb3JlX3dhaXRfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlc2V0X2NvdW50c19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc21hcnRfd2FrZXVwX3Byb2NfZW50cnk7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXNhYmxlX3Byb2NfZW50cnk7CisKKyNkZWZpbmUgRElSX1BST0NfRU5UUlkgInVpc2xpYiIKKyNkZWZpbmUgRElSX1ZCVVNfUFJPQ19FTlRSWSAidmJ1cyIKKyNkZWZpbmUgVk5JQ19QUk9DX0VOVFJZX0ZOICJ2bmljIgkvKiBVc2VkIHRvIGJlICJkYXRhY2hhbiIgKi8KKyNkZWZpbmUgQ1RSTENIQU5fUFJPQ19FTlRSWV9GTiAiY3RybGNoYW4iCisjZGVmaW5lIFBNRU1fUFJPQ19FTlRSWV9GTiAicGh5c190b192aXJ0IgorI2RlZmluZSBJTkZPX1BST0NfRU5UUllfRk4gImluZm8iCisjZGVmaW5lIFNXSVRDSF9QUk9DX0VOVFJZX0ZOICJzd2l0Y2giCisjZGVmaW5lIFNXSVRDSF9DT1VOVF9QUk9DX0VOVFJZX0ZOICJzd2l0Y2hfY291bnQiCisjZGVmaW5lIEVYVFBPUlRfUFJPQ19FTlRSWV9GTiAiZXh0cG9ydCIKKyNkZWZpbmUgUExBVEZPUk1OVU1CRVJfUFJPQ19FTlRSWV9GTiAicGxhdGZvcm0iCisjZGVmaW5lIEJVU19QUk9DX0VOVFJZX0ZOICJidXMiCisjZGVmaW5lIERFVl9QUk9DX0VOVFJZX0ZOICJkZXZpY2UiCisjZGVmaW5lIENISVBTRVRfUFJPQ19FTlRSWV9GTiAiY2hpcHNldCIKKyNkZWZpbmUgQ1lDTEVTX0JFRk9SRV9XQUlUX1BST0NfRU5UUllfRk4gImN5Y2xlc19iZWZvcmVfd2FpdCIKKyNkZWZpbmUgUkVTRVRfQ09VTlRTX1BST0NfRU5UUllfRk4gInJlc2V0X2NvdW50cyIKKyNkZWZpbmUgU01BUlRfV0FLRVVQX1BST0NfRU5UUllfRk4gInNtYXJ0X3dha2V1cCIKKyNkZWZpbmUgQ0FMTEhPTUVfUFJPQ19FTlRSWV9GTiAiY2FsbGhvbWUiCisjZGVmaW5lIENBTExIT01FX1RIUk9UVExFRF9QUk9DX0VOVFJZX0ZOICJjYWxsaG9tZV90aHJvdHRsZWQiCisjZGVmaW5lIERJU0FCTEVfUFJPQ19FTlRSWV9GTiAic3dpdGNoX3N0YXRlIgorI2lmZGVmIFVJU0xJQl9URVNUX1BST0MKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnRlc3RfcHJvY19lbnRyeTsKKyNkZWZpbmUgVEVTVF9QUk9DX0VOVFJZX0ZOICJ0ZXN0IgorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc19iZWZvcmVfd2FpdCwgd2FpdF9jeWNsZXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGxvY2FsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBwcm9jX2luZm9fdmJ1c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CitzdGF0aWMgaW50Citwcm9jX2luZm9fdmJ1c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCS8qIHByb2NfaW5mb192YnVzX3Nob3cgd2lsbCBncmFiIHRoaXMgZnJvbSBzZXFfZmlsZS5wcml2YXRlOiAqLworCXN0cnVjdCBidXNfaW5mbyAqYnVzID0gUERFX0RBVEEoaW5vZGUpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxwLCBwcm9jX2luZm9fdmJ1c19zaG93LCBidXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2luZm9fdmJ1c19mb3BzID0geworCS5vcGVuID0gcHJvY19pbmZvX3ZidXNfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5KHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgc3NpemVfdCB2bmljX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3ZuaWNfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IHZuaWNfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGNoaXBzZXRfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jaGlwc2V0X2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSBjaGlwc2V0X3Byb2Nfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCBpbmZvX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW5mb19mb3BzID0geworCS5yZWFkID0gaW5mb19wcm9jX3JlYWQsCit9OworCitzdGF0aWMgc3NpemVfdCBwbGF0Zm9ybW51bWJlcl9wcm9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcGxhdGZvcm1udW1iZXJfZm9wcyA9IHsKKwkucmVhZCA9IHBsYXRmb3JtbnVtYmVyX3Byb2NfcmVhZCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGN5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jeWNsZXNfYmVmb3JlX3dhaXRfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IGN5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX3dyaXRlLAorfTsKKworc3RhdGljIHNzaXplX3QgcmVzZXRfY291bnRzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcmVzZXRfY291bnRzX2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSByZXNldF9jb3VudHNfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNtYXJ0X3dha2V1cF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NtYXJ0X3dha2V1cF9mb3BzID0geworCS5yZWFkID0gdWlzbGliX3Byb2NfcmVhZF93cml0ZW9ubHksCisJLndyaXRlID0gc21hcnRfd2FrZXVwX3Byb2Nfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCB0ZXN0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Rlc3RfZm9wcyA9IHsKKwkucmVhZCA9IHVpc2xpYl9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IHRlc3RfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGJ1c19wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfYnVzX2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSBidXNfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRldl9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZGV2X2ZvcHMgPSB7CisJLnJlYWQgPSB1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seSwKKwkud3JpdGUgPSBkZXZfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyB2b2lkCitpbml0X21zZ19oZWFkZXIoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgVTMyIGlkLCB1aW50IHJzcCwgdWludCBzdnIpCit7CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSk7CisJbXNnLT5oZHIuSWQgPSBpZDsKKwltc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID0gcnNwOworCW1zZy0+aGRyLkZsYWdzLnNlcnZlciA9IHN2cjsKK30KKworc3RhdGljIHZvaWQKK2NyZWF0ZV9idXNfcHJvY19lbnRyaWVzKHN0cnVjdCBidXNfaW5mbyAqYnVzKQoreworCWJ1cy0+cHJvY19kaXIgPSBwcm9jX21rZGlyKGJ1cy0+bmFtZSwgdWlzbGliX3Byb2NfdmJ1c19kaXIpOworCWlmICghYnVzLT5wcm9jX2RpcikgeworCQlMT0dFUlIoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MvdWlzbGliL3ZidXMvJXMgZGlyZWN0b3J5IiwKKwkJICAgICAgIGJ1cy0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJYnVzLT5wcm9jX2luZm8gPSBwcm9jX2NyZWF0ZV9kYXRhKCJpbmZvIiwgMCwgYnVzLT5wcm9jX2RpciwKKwkJCQkJICAmcHJvY19pbmZvX3ZidXNfZm9wcywgYnVzKTsKKwlpZiAoIWJ1cy0+cHJvY19pbmZvKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYy91aXNsaWIvdmJ1cy8lcy9pbmZvIiwgYnVzLT5uYW1lKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYnVzLT5uYW1lLCB1aXNsaWJfcHJvY192YnVzX2Rpcik7CisJCWJ1cy0+cHJvY19kaXIgPSBOVUxMOworCQlyZXR1cm47CisJfQorCVNFVF9QUk9DX09XTkVSKGJ1cy0+cHJvY19pbmZvLCBUSElTX01PRFVMRSk7CisKK30KKworc3RhdGljIF9faW9tZW0gdm9pZCAqCitpbml0X3ZidXNfY2hhbm5lbChVNjQgY2hhbm5lbEFkZHIsIFUzMiBjaGFubmVsQnl0ZXMsIGludCBpc1NlcnZlcikKK3sKKwl2b2lkICpyYyA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICpwQ2hhbiA9IHVpc2xpYl9pb3JlbWFwX2NhY2hlKGNoYW5uZWxBZGRyLCBjaGFubmVsQnl0ZXMpOworCWlmICghcENoYW4pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBlcnJvcjogaW9yZW1hcF9jYWNoZSBvZiBjaGFubmVsQWRkcjolTHggZm9yIGNoYW5uZWxCeXRlczolbGx1IGZhaWxlZCIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2hhbm5lbEFkZHIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2hhbm5lbEJ5dGVzKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChpc1NlcnZlcikgeworCQltZW1zZXRfaW8ocENoYW4sIDAsIGNoYW5uZWxCeXRlcyk7CisJCWlmICghVUxUUkFfVkJVU19DSEFOTkVMX09LX1NFUlZFUihjaGFubmVsQnl0ZXMsIE5VTEwpKSB7CisJCQlFUlJEUlYoIiVzIGNoYW5uZWwgY2Fubm90IGJlIHVzZWQiLCBfX2Z1bmNfXyk7CisJCQl1aXNsaWJfaW91bm1hcChwQ2hhbik7CisJCQlyYyA9IE5VTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJVUxUUkFfVkJVU19pbml0X2NoYW5uZWwocENoYW4sIGNoYW5uZWxCeXRlcyk7CisJfSBlbHNlIHsKKwkJaWYgKCFVTFRSQV9WQlVTX0NIQU5ORUxfT0tfQ0xJRU5UKHBDaGFuLCBOVUxMKSkgeworCQkJRVJSRFJWKCIlcyBjaGFubmVsIGNhbm5vdCBiZSB1c2VkIiwgX19mdW5jX18pOworCQkJdWlzbGliX2lvdW5tYXAocENoYW4pOworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJfQorCXJjID0gcENoYW47CitBd2F5OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY3JlYXRlX2J1cyhDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBjaGFyICpidWYpCit7CisJVTMyIGJ1c05vLCBkZXZpY2VDb3VudDsKKwlzdHJ1Y3QgYnVzX2luZm8gKnRtcCwgKmJ1czsKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChNYXhCdXNDb3VudCA9PSBCdXNMaXN0Q291bnQpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IG1heCBidXNlczolZCBhbHJlYWR5IGNyZWF0ZWRcbiIsCisJCSAgICAgTWF4QnVzQ291bnQpOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgTWF4QnVzQ291bnQsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfQlVTRVM7CisJfQorCisJYnVzTm8gPSBtc2ctPmNtZC5jcmVhdGVCdXMuYnVzTm87CisJZGV2aWNlQ291bnQgPSBtc2ctPmNtZC5jcmVhdGVCdXMuZGV2aWNlQ291bnQ7CisKKwlQT1NUQ09ERV9MSU5VWF80KEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c05vLCBkZXZpY2VDb3VudCwKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXNpemUgPQorCSAgICBzaXplb2Yoc3RydWN0IGJ1c19pbmZvKSArCisJICAgIChkZXZpY2VDb3VudCAqIHNpemVvZihzdHJ1Y3QgZGV2aWNlX2luZm8gKikpOworCWJ1cyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidXMpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGttYWxsb2MgZm9yIGJ1cyBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7CisJfQorCisJLyogQ3VycmVudGx5IGJ5IGRlZmF1bHQsIHRoZSBidXMgTnVtYmVyIGlzIHRoZSBHdWVzdEhhbmRsZS4KKwkgKiBDb25maWd1cmUgQnVzIG1lc3NhZ2UgY2FuIG92ZXJyaWRlIHRoaXMuCisJICovCisJaWYgKG1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlKSB7CisJCS8qIFRoaXMgaW1wbGllcyB3ZSdyZSB0aGUgSU9WTSBzbyBzZXQgZ3Vlc3QgaGFuZGxlIHRvIDAuLi4gKi8KKwkJYnVzLT5ndWVzdEhhbmRsZSA9IDA7CisJCWJ1cy0+YnVzTm8gPSBidXNObzsKKwkJYnVzLT5sb2NhbFZuaWMgPSAxOworCX0gZWxzZQorCQlidXMtPmJ1c05vID0gYnVzLT5ndWVzdEhhbmRsZSA9IGJ1c05vOworCXNwcmludGYoYnVzLT5uYW1lLCAiJWQiLCAoaW50KSBidXMtPmJ1c05vKTsKKwlidXMtPmRldmljZUNvdW50ID0gZGV2aWNlQ291bnQ7CisJYnVzLT5kZXZpY2UgPQorCSAgICAoc3RydWN0IGRldmljZV9pbmZvICoqKSAoKGNoYXIgKikgYnVzICsgc2l6ZW9mKHN0cnVjdCBidXNfaW5mbykpOworCWJ1cy0+YnVzSW5zdEd1aWQgPSBtc2ctPmNtZC5jcmVhdGVCdXMuYnVzSW5zdEd1aWQ7CisJYnVzLT5idXNDaGFubmVsQnl0ZXMgPSAwOworCWJ1cy0+cEJ1c0NoYW5uZWwgPSBOVUxMOworCisJLyogYWRkIGJ1cyB0byBvdXIgYnVzIGxpc3QgLSBidXQgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgZmlyc3QgKi8KKwlyZWFkX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwlmb3IgKHRtcCA9IEJ1c0xpc3RIZWFkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworCQlpZiAodG1wLT5idXNObyA9PSBidXMtPmJ1c05vKQorCQkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJaWYgKHRtcCkgeworCQkvKiBmb3VuZCBhIGJ1cyBhbHJlYWR5IGluIHRoZSBsaXN0IHdpdGggc2FtZSBidXNObyAtCisJCSAqIHJlamVjdCBhZGQKKwkJICovCisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWQgYWxyZWFkeSBleGlzdHMuXG4iLAorCQkgICAgICAgYnVzLT5idXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXMtPmJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlrZnJlZShidXMpOworCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCX0KKwlpZiAoKG1zZy0+Y21kLmNyZWF0ZUJ1cy5jaGFubmVsQWRkciAhPSAwKQorCSAgICAmJiAobXNnLT5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlcyAhPSAwKSkgeworCQlidXMtPmJ1c0NoYW5uZWxCeXRlcyA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5jaGFubmVsQnl0ZXM7CisJCWJ1cy0+cEJ1c0NoYW5uZWwgPQorCQkgICAgaW5pdF92YnVzX2NoYW5uZWwobXNnLT5jbWQuY3JlYXRlQnVzLmNoYW5uZWxBZGRyLAorCQkJCSAgICAgIG1zZy0+Y21kLmNyZWF0ZUJ1cy5jaGFubmVsQnl0ZXMsCisJCQkJICAgICAgbXNnLT5oZHIuRmxhZ3Muc2VydmVyKTsKKwl9CisJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZCBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjayAqLworCWlmICghbXNnLT5oZHIuRmxhZ3Muc2VydmVyKSB7CisJCXN0cnVjdCBndWVzdF9tc2dzIGNtZDsKKwkJY21kLm1zZ3R5cGUgPSBHVUVTVF9BRERfVkJVUzsKKwkJY21kLmFkZF92YnVzLmJ1c05vID0gYnVzTm87CisJCWNtZC5hZGRfdmJ1cy5jaGFucHRyID0gYnVzLT5wQnVzQ2hhbm5lbDsKKwkJY21kLmFkZF92YnVzLmRldmljZUNvdW50ID0gZGV2aWNlQ291bnQ7CisJCWNtZC5hZGRfdmJ1cy5idXNUeXBlR3VpZCA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5idXNEYXRhVHlwZUd1aWQ7CisJCWNtZC5hZGRfdmJ1cy5idXNJbnN0R3VpZCA9IG1zZy0+Y21kLmNyZWF0ZUJ1cy5idXNJbnN0R3VpZDsKKwkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKSB7CisJCQlrZnJlZShidXMpOworCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNObywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJfQorCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMoJmNtZCkpIHsKKwkJCWtmcmVlKGJ1cyk7CisJCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBHVUVTVF9BRERfVkJVUyByZXR1cm5lZCBlcnJvci4iKTsKKwkJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXMtPmJ1c05vLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCXJldHVybgorCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQl9CisJfQorCWNyZWF0ZV9idXNfcHJvY19lbnRyaWVzKGJ1cyk7CisKKwkvKiBhZGQgYnVzIGF0IHRoZSBoZWFkIG9mIG91ciBsaXN0ICovCisJd3JpdGVfbG9jaygmQnVzTGlzdExvY2spOworCWlmICghQnVzTGlzdEhlYWQpCisJCUJ1c0xpc3RIZWFkID0gYnVzOworCWVsc2UgeworCQlidXMtPm5leHQgPSBCdXNMaXN0SGVhZDsKKwkJQnVzTGlzdEhlYWQgPSBidXM7CisJfQorCUJ1c0xpc3RDb3VudCsrOworCXdyaXRlX3VubG9jaygmQnVzTGlzdExvY2spOworCisJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VYSVRfUEMsIGJ1cy0+YnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQKK2Rlc3Ryb3lfYnVzKENPTlRST0xWTV9NRVNTQUdFICptc2csIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnVzX2luZm8gKmJ1cywgKnByZXYgPSBOVUxMOworCVUzMiBidXNObzsKKworCWJ1c05vID0gbXNnLT5jbWQuZGVzdHJveUJ1cy5idXNObzsKKworCS8qIGZpbmQgYW5kIGRlbGV0ZSB0aGUgYnVzICovCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBwcmV2ID0gYnVzLCBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIGZvdW5kIHRoZSBidXMgLSBlbnN1cmUgdGhhdCBhbGwgZGV2aWNlCisJCQkgKiBzbG90cyBhcmUgTlVMTAorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgYnVzLT5kZXZpY2VDb3VudDsgaSsrKSB7CisJCQkJaWYgKGJ1cy0+ZGV2aWNlW2ldICE9IE5VTEwpIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBkZXZpY2UgJWkgYXR0YWNoZWQgdG8gYnVzICVkLiIsCisJCQkJCSAgICAgaSwgYnVzTm8pOworCQkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0RFVklDRV9BVFRBQ0hFRDsKKwkJCQl9CisJCQl9CisJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZAorCQkJICogZ3Vlc3RfbXNncyBzdHJ1Y3QgdG8gY2FsbGJhY2sKKwkJCSAqLworCQkJaWYgKCFtc2ctPmhkci5GbGFncy5zZXJ2ZXIpIHsKKwkJCQlzdHJ1Y3QgZ3Vlc3RfbXNncyBjbWQ7CisJCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9ERUxfVkJVUzsKKwkJCQljbWQuZGVsX3ZidXMuYnVzTm8gPSBidXNObzsKKwkJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiB2aXJ0cGNpIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkLiIpOworCQkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKKwkJCQl9CisJCQkJaWYgKCFWaXJ0Q29udHJvbENoYW5GdW5jKCZjbWQpKSB7CisJCQkJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfVkJVUyByZXR1cm5lZCBlcnJvci4iKTsKKwkJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJCX0KKwkJCX0KKwkJCS8qIHJlbW92ZSB0aGUgYnVzIGZyb20gdGhlIGxpc3QgKi8KKwkJCXdyaXRlX2xvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCWlmIChwcmV2KQkvKiBub3QgYXQgaGVhZCAqLworCQkJCXByZXYtPm5leHQgPSBidXMtPm5leHQ7CisJCQllbHNlCisJCQkJQnVzTGlzdEhlYWQgPSBidXMtPm5leHQ7CisJCQlCdXNMaXN0Q291bnQtLTsKKwkJCXdyaXRlX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJ1cykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IGZhaWxlZCB0byBmaW5kIGJ1cyAlZC5cbiIsCisJCSAgICAgICBidXNObyk7CisJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJfQorCWlmIChidXMtPnByb2NfaW5mbykgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiaW5mbyIsIGJ1cy0+cHJvY19kaXIpOworCQlidXMtPnByb2NfaW5mbyA9IE5VTEw7CisJfQorCWlmIChidXMtPnByb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KGJ1cy0+bmFtZSwgdWlzbGliX3Byb2NfdmJ1c19kaXIpOworCQlidXMtPnByb2NfZGlyID0gTlVMTDsKKwl9CisJaWYgKGJ1cy0+cEJ1c0NoYW5uZWwpIHsKKwkJdWlzbGliX2lvdW5tYXAoYnVzLT5wQnVzQ2hhbm5lbCk7CisJCWJ1cy0+cEJ1c0NoYW5uZWwgPSBOVUxMOworCX0KKworCWtmcmVlKGJ1cyk7CisJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9kZXZpY2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCXN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2OworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCVUzMiBidXNObywgZGV2Tm87CisJaW50IHJlc3VsdCA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisJVTY0IG1pblNpemUgPSBNSU5fSU9fQ0hBTk5FTF9TSVpFOworCVJlcUhhbmRsZXJJbmZvX3QgKnBSZXFIYW5kbGVyOworCisJYnVzTm8gPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuYnVzTm87CisJZGV2Tm8gPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm87CisKKwlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRU5UUllfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2VfaW5mbyksIEdGUF9BVE9NSUMpOworCWlmICghZGV2KSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBrbWFsbG9jIGZvciBkZXYgZmFpbGVkLlxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRDsKKwl9CisKKwlkZXYtPmNoYW5uZWxUeXBlR3VpZCA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5kYXRhVHlwZUd1aWQ7CisJZGV2LT5pbnRyID0gbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmludHI7CisJZGV2LT5jaGFubmVsQWRkciA9IG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQWRkcjsKKwlkZXYtPmJ1c05vID0gYnVzTm87CisJZGV2LT5kZXZObyA9IGRldk5vOworCXNlbWFfaW5pdCgmZGV2LT5pbnRlcnJ1cHRfY2FsbGJhY2tfbG9jaywgMSk7CS8qIHVubG9ja2VkICovCisJc3ByaW50ZihkZXYtPmRldmlkLCAidmJ1cyV1OmRldiV1IiwgKHVuc2lnbmVkKSBidXNObywgKHVuc2lnbmVkKSBkZXZObyk7CisJLyogbWFwIHRoZSBjaGFubmVsIG1lbW9yeSBmb3IgdGhlIGRldmljZS4gKi8KKwlpZiAobXNnLT5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UpCisJCWRldi0+Y2hhbnB0ciA9ICh2b2lkIF9faW9tZW0gKilfX3ZhKGRldi0+Y2hhbm5lbEFkZHIpOworCWVsc2UgeworCQlwUmVxSGFuZGxlciA9IFJlcUhhbmRsZXJGaW5kKGRldi0+Y2hhbm5lbFR5cGVHdWlkKTsKKwkJaWYgKHBSZXFIYW5kbGVyKQorCQkJLyogZ2VuZXJpYyBzZXJ2aWNlIGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcworCQkJICogY2hhbm5lbAorCQkJICovCisJCQltaW5TaXplID0gcFJlcUhhbmRsZXItPm1pbl9jaGFubmVsX2J5dGVzOworCQlpZiAobWluU2l6ZSA+IG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMpIHsKKwkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBjaGFubmVsIHNpemUgaXMgdG9vIHNtYWxsLCBjaGFubmVsIHNpemU6MHglbHgsIHJlcXVpcmVkIHNpemU6MHglbHgiLAorCQkJICAgICAodWxvbmcpIG1zZy0+Y21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMsCisJCQkgICAgICh1bG9uZykgbWluU2l6ZSk7CisJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfU0laRV9UT09fU01BTEw7CisJCQlnb3RvIEF3YXk7CisJCX0KKwkJZGV2LT5jaGFucHRyID0KKwkJICAgIHVpc2xpYl9pb3JlbWFwX2NhY2hlKGRldi0+Y2hhbm5lbEFkZHIsCisJCQkJCSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEJ5dGVzKTsKKwkJaWYgKCFkZXYtPmNoYW5wdHIpIHsKKwkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBpb3JlbWFwX2NhY2hlIG9mIGNoYW5uZWxBZGRyOiVMeCBmb3IgY2hhbm5lbEJ5dGVzOiVsbHUgZmFpbGVkIiwKKwkJCSAgICAgZGV2LT5jaGFubmVsQWRkciwKKwkJCSAgICAgbXNnLT5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxCeXRlcyk7CisJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JT1JFTUFQX0ZBSUxFRDsKKwkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJZ290byBBd2F5OworCQl9CisJfQorCWRldi0+ZGV2SW5zdEd1aWQgPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQ7CisJZGV2LT5jaGFubmVsQnl0ZXMgPSBtc2ctPmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEJ5dGVzOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLworCQkJaWYgKGRldk5vID49IGJ1cy0+ZGV2aWNlQ291bnQpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogZGV2aWNlICglZCkgPj0gZGV2aWNlQ291bnQgKCVkKS4iLAorCQkJCSAgICAgZGV2Tm8sIGJ1cy0+ZGV2aWNlQ291bnQpOworCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9ERVZJQ0VTOworCQkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLAorCQkJCQkJIGRldk5vLCBidXNObywKKwkJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJZ290byBBd2F5OworCQkJfQorCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGlzIG5vdCBhbHJlYWR5IHNldCAqLworCQkJaWYgKGJ1cy0+ZGV2aWNlW2Rldk5vXSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBkZXZpY2UgJWQgaXMgYWxyZWFkeSBleGlzdHMuIiwKKwkJCQkgICAgIGRldk5vKTsKKwkJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywKKwkJCQkJCSBkZXZObywgYnVzTm8sCisJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlnb3RvIEF3YXk7CisJCQl9CisJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZAorCQkJICogZ3Vlc3RfbXNncyBzdHJ1Y3QgdG8gY2FsbGJhY2sKKwkJCSAqLworCQkJaWYgKCFtc2ctPmhkci5GbGFncy5zZXJ2ZXIpIHsKKwkJCQlzdHJ1Y3QgZ3Vlc3RfbXNncyBjbWQ7CisJCQkJaWYgKCFtZW1jbXAKKwkJCQkgICAgKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkgICAgICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkJCSAgICAgc2l6ZW9mKEdVSUQpKSkgeworCQkJCQlXQUlUX0ZPUl9WQUxJRF9HVUlEKCgoQ0hBTk5FTF9IRUFERVIKKwkJCQkJCQkgICAgICBfX2lvbWVtICopIChkZXYtPgorCQkJCQkJCQkgIGNoYW5wdHIpKS0+CisJCQkJCQkJICAgIFR5cGUpOworCQkJCQlpZiAoIVVMVFJBX1ZIQkFfQ0hBTk5FTF9PS19DTElFTlQKKwkJCQkJICAgIChkZXYtPmNoYW5wdHIsIE5VTEwpKSB7CisJCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDpbQ0xJRU5UXVZIQkEgZGV2ICVkIGNoYW4gaW52YWxpZC4iLAorCQkJCQkJICAgICBkZXZObyk7CisJCQkJCQlQT1NUQ09ERV9MSU5VWF80CisJCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywKKwkJCQkJCSAgICAgZGV2Tm8sIGJ1c05vLAorCQkJCQkJICAgICBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9JTlZBTElEOworCQkJCQkJZ290byBBd2F5OworCQkJCQl9CisJCQkJCWNtZC5tc2d0eXBlID0gR1VFU1RfQUREX1ZIQkE7CisJCQkJCWNtZC5hZGRfdmhiYS5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJCQljbWQuYWRkX3ZoYmEuYnVzTm8gPSBidXNObzsKKwkJCQkJY21kLmFkZF92aGJhLmRldmljZU5vID0gZGV2Tm87CisJCQkJCWNtZC5hZGRfdmhiYS5kZXZJbnN0R3VpZCA9CisJCQkJCSAgICBkZXYtPmRldkluc3RHdWlkOworCQkJCQljbWQuYWRkX3ZoYmEuaW50ciA9IGRldi0+aW50cjsKKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKCFtZW1jbXAKKwkJCQkJKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkJICZVbHRyYVZuaWNDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkJCQkgc2l6ZW9mKEdVSUQpKSkgeworCQkJCQlXQUlUX0ZPUl9WQUxJRF9HVUlEKCgoQ0hBTk5FTF9IRUFERVIKKwkJCQkJCQkgICAgICBfX2lvbWVtICopIChkZXYtPgorCQkJCQkJCQkgIGNoYW5wdHIpKS0+CisJCQkJCQkJICAgIFR5cGUpOworCQkJCQlpZiAoIVVMVFJBX1ZOSUNfQ0hBTk5FTF9PS19DTElFTlQKKwkJCQkJICAgIChkZXYtPmNoYW5wdHIsIE5VTEwpKSB7CisJCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogVk5JQ1tDTElFTlRdIGRldiAlZCBjaGFuIGludmFsaWQuIiwKKwkJCQkJCSAgICAgZGV2Tm8pOworCQkJCQkJUE9TVENPREVfTElOVVhfNAorCQkJCQkJICAgIChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsCisJCQkJCQkgICAgIGRldk5vLCBidXNObywKKwkJCQkJCSAgICAgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfSU5WQUxJRDsKKwkJCQkJCWdvdG8gQXdheTsKKwkJCQkJfQorCQkJCQljbWQubXNndHlwZSA9IEdVRVNUX0FERF9WTklDOworCQkJCQljbWQuYWRkX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCQkJY21kLmFkZF92bmljLmJ1c05vID0gYnVzTm87CisJCQkJCWNtZC5hZGRfdm5pYy5kZXZpY2VObyA9IGRldk5vOworCQkJCQljbWQuYWRkX3ZuaWMuZGV2SW5zdEd1aWQgPQorCQkJCQkgICAgZGV2LT5kZXZJbnN0R3VpZDsKKwkJCQkJY21kLmFkZF92aGJhLmludHIgPSBkZXYtPmludHI7CisJCQkJfSBlbHNlIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IHVua25vd24gY2hhbm5lbFR5cGVHdWlkLlxuIik7CisJCQkJCVBPU1RDT0RFX0xJTlVYXzQKKwkJCQkJICAgIChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLAorCQkJCQkgICAgIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTjsKKwkJCQkJZ290byBBd2F5OworCQkJCX0KKworCQkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJCQkJUE9TVENPREVfTElOVVhfNAorCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sCisJCQkJCSAgICAgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQkJCWdvdG8gQXdheTsKKwkJCQl9CisKKwkJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMoJmNtZCkpIHsKKwkJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfQUREX1tWSEJBfHxWTklDXSByZXR1cm5lZCBlcnJvci4iKTsKKwkJCQkJUE9TVENPREVfTElOVVhfNAorCQkJCQkgICAgKERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sCisJCQkJCSAgICAgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJCQlnb3RvIEF3YXk7CisJCQkJfQorCQkJfQorCQkJYnVzLT5kZXZpY2VbZGV2Tm9dID0gZGV2OworCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX1NVQ0NFU1NfUEMsIGRldk5vLCBidXNObywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKworCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBmYWlsZWQgdG8gZmluZCBidXMgJWQuIiwgYnVzTm8pOworCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKworQXdheToKKwlpZiAoIW1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlKSB7CisJCXVpc2xpYl9pb3VubWFwKGRldi0+Y2hhbnB0cik7CisJCWRldi0+Y2hhbnB0ciA9IE5VTEw7CisJfQorCisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitwYXVzZV9kZXZpY2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZykKK3sKKwlVMzIgYnVzTm8sIGRldk5vOworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCXN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2OworCXN0cnVjdCBndWVzdF9tc2dzIGNtZDsKKworCWJ1c05vID0gbXNnLT5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm87CisJZGV2Tm8gPSBtc2ctPmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObzsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisJCWlmIChidXMtPmJ1c05vID09IGJ1c05vKSB7CisJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KKwkJCWlmIChkZXZObyA+PSBidXMtPmRldmljZUNvdW50KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VDb3VudCglZCkuIiwKKwkJCQkgICAgIGRldk5vLCBidXMtPmRldmljZUNvdW50KTsKKwkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwkJCX0KKwkJCS8qIG1ha2Ugc3VyZSB0aGlzIGRldmljZSBleGlzdHMgKi8KKwkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldk5vXTsKKwkJCWlmICghZGV2KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogZGV2aWNlICVkIGRvZXMgbm90IGV4aXN0LiIsCisJCQkJICAgICBkZXZObyk7CisJCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCQkJfQorCQkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJCS8qIHRoZSBtc2cgaXMgYm91bmQgZm9yIHZpcnRwY2k7IHNlbmQKKwkJCSAqIGd1ZXN0X21zZ3Mgc3RydWN0IHRvIGNhbGxiYWNrCisJCQkgKi8KKwkJCWlmICghbWVtY21wCisJCQkgICAgKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCSAgICAgJlVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQsIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX1BBVVNFX1ZIQkE7CisJCQkJY21kLnBhdXNlX3ZoYmEuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICghbWVtY21wCisJCQkJKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkgJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX1BBVVNFX1ZOSUM7CisJCQkJY21kLnBhdXNlX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV047CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpwYXVzZSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfUEFVU0VfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9DQUxMQkFDS19FUlJPUjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFidXMpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogYnVzICVkIGRvZXMgbm90IGV4aXN0IiwKKwkJICAgICBidXNObyk7CisJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorcmVzdW1lX2RldmljZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnKQoreworCVUzMiBidXNObywgZGV2Tm87CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJc3RydWN0IGd1ZXN0X21zZ3MgY21kOworCisJYnVzTm8gPSBtc2ctPmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObzsKKwlkZXZObyA9IG1zZy0+Y21kLmRldmljZUNoYW5nZVN0YXRlLmRldk5vOworCisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKwkJaWYgKGJ1cy0+YnVzTm8gPT0gYnVzTm8pIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLworCQkJaWYgKGRldk5vID49IGJ1cy0+ZGV2aWNlQ291bnQpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VDb3VudCglZCkuIiwKKwkJCQkgICAgIGRldk5vLCBidXMtPmRldmljZUNvdW50KTsKKwkJCQlyZWFkX3VubG9jaygmQnVzTGlzdExvY2spOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwkJCX0KKwkJCS8qIG1ha2Ugc3VyZSB0aGlzIGRldmljZSBleGlzdHMgKi8KKwkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldk5vXTsKKwkJCWlmICghZGV2KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnJlc3VtZSBGYWlsZWQ6IGRldmljZSAlZCBkb2VzIG5vdCBleGlzdC4iLAorCQkJCSAgICAgZGV2Tm8pOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCisJCQkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjaworCQkJICovCisJCQlpZiAoIW1lbWNtcCgmZGV2LT5jaGFubmVsVHlwZUd1aWQsCisJCQkJICAgICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLAorCQkJCSAgICBzaXplb2YoR1VJRCkpKSB7CisJCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9SRVNVTUVfVkhCQTsKKwkJCQljbWQucmVzdW1lX3ZoYmEuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICghbWVtY21wKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkJJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJCXNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX1JFU1VNRV9WTklDOworCQkJCWNtZC5yZXN1bWVfdm5pYy5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKKwkJCQlyZXR1cm4KKwkJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV047CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYykgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiB2aXJ0cGNpIEdVRVNUX1JFU1VNRV9bVkhCQXx8Vk5JQ10gcmV0dXJuZWQgZXJyb3IuIik7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJ1cykgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogYnVzICVkIGRvZXMgbm90IGV4aXN0IiwKKwkJICAgICBidXNObyk7CisJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorZGVzdHJveV9kZXZpY2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCVUzMiBidXNObywgZGV2Tm87CisJc3RydWN0IGJ1c19pbmZvICpidXM7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJc3RydWN0IGd1ZXN0X21zZ3MgY21kOworCisJYnVzTm8gPSBtc2ctPmNtZC5kZXN0cm95RGV2aWNlLmJ1c05vOworCWRldk5vID0gbXNnLT5jbWQuZGVzdHJveURldmljZS5kZXZObzsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCUxPR0lORigiZGVzdHJveV9kZXZpY2UgY2FsbGVkIGZvciBidXNObz0ldSwgZGV2Tm89JXUiLCBidXNObywgZGV2Tm8pOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisJCWlmIChidXMtPmJ1c05vID09IGJ1c05vKSB7CisJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KKwkJCWlmIChkZXZObyA+PSBidXMtPmRldmljZUNvdW50KSB7CisJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RPUlkgRmFpbGVkOiBkZXZpY2UoJWQpID49IGRldmljZUNvdW50KCVkKS4iLAorCQkJCSAgICAgZGV2Tm8sIGJ1cy0+ZGV2aWNlQ291bnQpOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCQkJfQorCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGV4aXN0cyAqLworCQkJZGV2ID0gYnVzLT5kZXZpY2VbZGV2Tm9dOworCQkJaWYgKCFkZXYpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IGRldmljZSAlZCBkb2VzIG5vdCBleGlzdC4iLAorCQkJCSAgICAgZGV2Tm8pOworCQkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCisJCQkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjaworCQkJICovCisJCQlpZiAoIW1lbWNtcAorCQkJICAgICgmZGV2LT5jaGFubmVsVHlwZUd1aWQsCisJCQkgICAgICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLCBzaXplb2YoR1VJRCkpKSB7CisJCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9ERUxfVkhCQTsKKwkJCQljbWQuZGVsX3ZoYmEuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICghbWVtY21wCisJCQkJKCZkZXYtPmNoYW5uZWxUeXBlR3VpZCwKKwkJCQkgJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsCisJCQkJIHNpemVvZihHVUlEKSkpIHsKKwkJCQljbWQubXNndHlwZSA9IEdVRVNUX0RFTF9WTklDOworCQkJCWNtZC5kZWxfdm5pYy5jaGFucHRyID0gZGV2LT5jaGFucHRyOworCQkJfSBlbHNlIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IHVua25vd24gY2hhbm5lbFR5cGVHdWlkLlxuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOOworCQkJfQorCisJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpIHsKKwkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVE9SWSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJCQkJcmV0dXJuCisJCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7CisJCQl9CisKKwkJCWlmICghVmlydENvbnRyb2xDaGFuRnVuYygmY21kKSkgeworCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOworCQkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9DQUxMQkFDS19FUlJPUjsKKwkJCX0KKy8qIHlvdSBtdXN0IGRpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHRzIEJFRk9SRSB5b3UgdW5tYXAgdGhlIGNoYW5uZWwsCisgKiBiZWNhdXNlIGlmIHlvdSB1bm1hcCBmaXJzdCwgdGhlcmUgbWF5IHN0aWxsIGJlIHNvbWUgYWN0aXZpdHkgZ29pbmcKKyAqIG9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjaGFubmVsIGFuZCB5b3Ugd2lsbCBnZXQgYSAidW5hYmxlIHRvIGhhbmRsZQorICoga2VybmVsIHBhZ2luZyByZXF1ZXN0IgorICovCisJCQlpZiAoZGV2LT5wb2xsaW5nKSB7CisJCQkJTE9HSU5GKCJjYWxsaW5nIHVpc2xpYl9kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyIpOworCQkJCXVpc2xpYl9kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhidXNObywgZGV2Tm8pOworCQkJfQorCQkJLyogdW5tYXAgdGhlIGNoYW5uZWwgbWVtb3J5IGZvciB0aGUgZGV2aWNlLiAqLworCQkJaWYgKCFtc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSkgeworCQkJCUxPR0lORigiZGVzdHJveV9kZXZpY2UsIGRvaW5nIGlvdW5tYXAiKTsKKwkJCQl1aXNsaWJfaW91bm1hcChkZXYtPmNoYW5wdHIpOworCQkJfQorCQkJa2ZyZWUoZGV2KTsKKwkJCWJ1cy0+ZGV2aWNlW2Rldk5vXSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYnVzKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogYnVzICVkIGRvZXMgbm90IGV4aXN0IiwKKwkJICAgICAgIGJ1c05vKTsKKwkJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCX0KKworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50Citpbml0X2NoaXBzZXQoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgY2hhciAqYnVmKQoreworCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCU1heEJ1c0NvdW50ID0gbXNnLT5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQ7CisJUGxhdGZvcm1OdW1iZXIgPSBtc2ctPmNtZC5pbml0Q2hpcHNldC5wbGF0Zm9ybU51bWJlcjsKKwlQaHlzaWNhbERhdGFDaGFuID0gMDsKKworCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgb3VyIGZ1bmN0aW9ucyByZWdpc3RlcmVkCisJKiBiZWZvcmUgcHJvY2Vzc2luZyBtZXNzYWdlcy4gIElmIHdlIGFyZSBhIHRlc3QgdmVoaWNsZSB0aGUKKwkqIHRlc3RNZXNzYWdlIGZvciBpbml0X2NoaXBzZXQgd2lsbCBiZSBzZXQuICBXZSBjYW4gaWdub3JlIHRoZQorCSogd2FpdHMgZm9yIHRoZSBjYWxsYmFja3MsIHNpbmNlIHRoaXMgd2lsbCBiZSBtYW51YWxseSBlbnRlcmVkCisJKiBmcm9tIGEgdXNlci4gIElmIG5vIHRlc3RNZXNzYWdlIGlzIHNldCwgd2Ugd2lsbCB3YWl0IGZvciB0aGUKKwkqIGZ1bmN0aW9ucy4KKwkqLworCWlmICghbXNnLT5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UpCisJCVdBSVRfT05fQ0FMTEJBQ0soVmlydENvbnRyb2xDaGFuRnVuYyk7CisKKwljaGlwc2V0X2luaXRlZCA9IDE7CisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorc3RvcF9jaGlwc2V0KENPTlRST0xWTV9NRVNTQUdFICptc2csIGNoYXIgKmJ1ZikKK3sKKwkvKiBDaGVjayB0aGF0IGFsbCBidXNlcyBhbmQgc3dpdGNoZXMgaGF2ZSBiZWVuIHRvcm4gZG93biBhbmQKKwkgKiBkZXN0cm95ZWQuCisJICovCisJaWYgKEJ1c0xpc3RIZWFkKSB7CisJCS8qIEJ1c2VzIHN0aWxsIGV4aXN0LiAqLworCQlMT0dFUlIoIkNPTlRST0xWTV9DSElQU0VUX1NUT1A6IEJ1c0xpc3RIZWFkIGlzIG5vdCBOVUxMIik7CisJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX0JVUzsKKwl9CisJaWYgKEJ1c0xpc3RDb3VudCkgeworCQkvKiBCdXNMaXN0SGVhZCBpcyBOVUxMLCBidXQgQnVzTGlzdENvdW50ICE9IDAgKi8KKwkJTE9HRVJSKCJDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOiBCdXNMaXN0Q291bnQgIT0gMCIpOworCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9CVVM7CisJfQorCisJLyogQnVzZXMgYXJlIHNodXQgZG93bi4gKi8KKwlyZXR1cm4gdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkoKTsKK30KKworc3RhdGljIGludAorZGVsZXRlX2J1c19nbHVlKFUzMiBidXNObykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAwLCAwKTsKKwltc2cuY21kLmRlc3Ryb3lCdXMuYnVzTm8gPSBidXNObzsKKwlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImRlc3Ryb3lfYnVzIGZhaWxlZC4gYnVzTm89MHgleFxuIiwgYnVzTm8pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2RlbGV0ZV9kZXZpY2VfZ2x1ZShVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCAwLCAwKTsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwlpZiAoZGVzdHJveV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImRlc3Ryb3lfZGV2aWNlIGZhaWxlZC4gYnVzTm89MHgleCBkZXZObz0weCV4XG4iLCBidXNObywKKwkJICAgICAgIGRldk5vKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF9idXMoVTMyIGJ1c05vLCBHVUlEIGluc3RHdWlkLAorCQkJICAgICBVNjQgY2hhbm5lbEFkZHIsIHVsb25nIG5DaGFubmVsQnl0ZXMpCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCisJTE9HSU5GKCJlbnRlciBidXNObz0weCV4XG4iLCBidXNObyk7CisJLyogc3RlcCAwOiBpbml0IHRoZSBjaGlwc2V0ICovCisJUE9TVENPREVfTElOVVhfMyhDSElQU0VUX0lOSVRfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWlmICghY2hpcHNldF9pbml0ZWQpIHsKKwkJLyogc3RlcDogaW5pdGlhbGl6ZSB0aGUgY2hpcHNldCAqLworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0NISVBTRVRfSU5JVCwgMCwgMCk7CisJCS8qIHRoaXMgY2hhbmdlIGlzIG5lZWRlZCBzbyB0aGF0IGNvbnNvbGUgd2lsbCBjb21lIHVwCisJCSogT0sgZXZlbiB3aGVuIHRoZSBidXMgMCBjcmVhdGUgY29tZXMgaW4gbGF0ZS4gIElmIHRoZQorCQkqIGJ1cyAwIGNyZWF0ZSBpcyB0aGUgZmlyc3QgY3JlYXRlLCB0aGVuIHRoZSBhZGRfdm5pYworCQkqIHdpbGwgd29yayBmaW5lLCBidXQgaWYgdGhlIGJ1cyAwIGNyZWF0ZSBhcnJpdmVzCisJCSogYWZ0ZXIgbnVtYmVyIDQsIHRoZW4gdGhlIGFkZF92bmljIHdpbGwgZmFpbCwgYW5kIHRoZQorCQkqIHVsdHJhYm9vdCB3aWxsIGZhaWwuCisJCSovCisJCW1zZy5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQgPSAyMzsKKwkJbXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCA9IDA7CisJCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkJTE9HRVJSKCJpbml0X2NoaXBzZXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlMT0dJTkYoImNoaXBzZXQgaW5pdGlhbGl6ZWRcbiIpOworCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9FWElUX1BDLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJfQorCisJLyogc3RlcCAxOiBjcmVhdGUgYSBidXMgKi8KKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9XQVJOSU5HKTsKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19DUkVBVEUsIDAsIDApOworCW1zZy5jbWQuY3JlYXRlQnVzLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5jcmVhdGVCdXMuZGV2aWNlQ291bnQgPSAyMzsJLyogZGV2Tm8rMTsgKi8KKwltc2cuY21kLmNyZWF0ZUJ1cy5jaGFubmVsQWRkciA9IGNoYW5uZWxBZGRyOworCW1zZy5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlcyA9IG5DaGFubmVsQnl0ZXM7CisJaWYgKGNyZWF0ZV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImNyZWF0ZV9idXMgZmFpbGVkLlxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXNObywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF9idXMpOworCisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfZGVsX2J1cyhVMzIgYnVzTm8pCit7CisJcmV0dXJuIGRlbGV0ZV9idXNfZ2x1ZShidXNObyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfYnVzKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9wYXVzZV92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlpbnQgcmM7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwgMCwgMCk7CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlID0gU2VnbWVudFN0YXRlU3RhbmRieTsKKwlyYyA9IHBhdXNlX2RldmljZSgmbXNnKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZIQkEgcGF1c2VfZGV2aWNlIGZhaWxlZC4gYnVzTm89MHgleCBkZXZObz0weCV4XG4iLAorCQkgICAgICAgYnVzTm8sIGRldk5vKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZoYmEpOworCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92aGJhKFUzMiBidXNObywgVTMyIGRldk5vKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlpbnQgcmM7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwgMCwgMCk7CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlID0gU2VnbWVudFN0YXRlUnVubmluZzsKKwlyYyA9IHJlc3VtZV9kZXZpY2UoJm1zZyk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJTE9HRVJSKCJWSEJBIHJlc3VtZV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsCisJCSAgICAgICBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworCit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdmhiYSk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZoYmEoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkgICAgICBVNjQgcGh5c19jaGFuX2FkZHIsIFUzMiBjaGFuX2J5dGVzLAorCQkJICAgICAgaW50IGlzX3Rlc3RfYWRkciwgR1VJRCBpbnN0R3VpZCwKKwkJCSAgICAgIHN0cnVjdCBJbnRlcnJ1cHRJbmZvICppbnRyKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCUxPR0lORigiIGVudGVyIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwgYnVzTm8sIGRldk5vKTsKKwkvKiBjaGlwc2V0IGluaXQnZWQgd2l0aCBidXMgYnVzIGhhcyBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCAtCisJKiBWZXJpZnkgaXQgc3RpbGwgZXhpc3RzIHN0ZXAgMjogY3JlYXRlIHRoZSBWSEJBIGRldmljZSBvbiB0aGUKKwkqIGJ1cworCSovCisJUE9TVENPREVfTElOVVhfNChWSEJBX0NSRUFURV9FTlRSWV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFLCAwLCAwKTsKKwlpZiAoaXNfdGVzdF9hZGRyKQorCQkvKiBzaWduaWZ5IHRoYXQgdGhlIHBoeXNpY2FsIGNoYW5uZWwgYWRkcmVzcyBkb2VzIE5PVAorCQkgKiBuZWVkIHRvIGJlIGlvcmVtYXAoKWVkCisJCSAqLworCQltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmNyZWF0ZURldmljZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRldk5vID0gZGV2Tm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQgPSBpbnN0R3VpZDsKKwlpZiAoaW50cikKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuaW50ciA9ICppbnRyOworCWVsc2UKKwkJbWVtc2V0KCZtc2cuY21kLmNyZWF0ZURldmljZS5pbnRyLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBJbnRlcnJ1cHRJbmZvKSk7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHIgPSBwaHlzX2NoYW5fYWRkcjsKKwlpZiAoY2hhbl9ieXRlcyA8IE1JTl9JT19DSEFOTkVMX1NJWkUpIHsKKwkJTE9HRVJSKCJ3cm9uZyBjaGFubmVsIHNpemUuY2hhbl9ieXRlcyA9IDB4JXggSU9fQ0hBTk5FTF9TSVpFPSAweCV4XG4iLAorCQkgICAgIGNoYW5fYnl0ZXMsICh1bnNpZ25lZCBpbnQpIE1JTl9JT19DSEFOTkVMX1NJWkUpOworCQlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoYW5fYnl0ZXMsCisJCQkJIE1JTl9JT19DSEFOTkVMX1NJWkUsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBjaGFuX2J5dGVzOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9IFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQ7CisJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZIQkEgY3JlYXRlX2RldmljZSBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfNChWSEJBX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX1NVQ0NFU1NfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X2FkZF92aGJhKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdmhiYShVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlyZXR1cm4gZGVsZXRlX2RldmljZV9nbHVlKGJ1c05vLCBkZXZObyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdmhiYSk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkgICAgICBVNjQgcGh5c19jaGFuX2FkZHIsIFUzMiBjaGFuX2J5dGVzLAorCQkJICAgICAgaW50IGlzX3Rlc3RfYWRkciwgR1VJRCBpbnN0R3VpZCwKKwkJCSAgICAgIHN0cnVjdCBJbnRlcnJ1cHRJbmZvICppbnRyKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCUxPR0lORigiIGVudGVyIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwgYnVzTm8sIGRldk5vKTsKKwkvKiBjaGlwc2V0IGluaXQnZWQgd2l0aCBidXMgYnVzIGhhcyBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCAtCisJKiBWZXJpZnkgaXQgc3RpbGwgZXhpc3RzIHN0ZXAgMjogY3JlYXRlIHRoZSBWTklDIGRldmljZSBvbiB0aGUKKwkqIGJ1cworCSovCisJUE9TVENPREVfTElOVVhfNChWTklDX0NSRUFURV9FTlRSWV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFLCAwLCAwKTsKKwlpZiAoaXNfdGVzdF9hZGRyKQorCQkvKiBzaWduaWZ5IHRoYXQgdGhlIHBoeXNpY2FsIGNoYW5uZWwgYWRkcmVzcyBkb2VzIE5PVAorCQkgKiBuZWVkIHRvIGJlIGlvcmVtYXAoKWVkCisJCSAqLworCQltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmNyZWF0ZURldmljZS5idXNObyA9IGJ1c05vOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRldk5vID0gZGV2Tm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQgPSBpbnN0R3VpZDsKKwlpZiAoaW50cikKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuaW50ciA9ICppbnRyOworCWVsc2UKKwkJbWVtc2V0KCZtc2cuY21kLmNyZWF0ZURldmljZS5pbnRyLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBJbnRlcnJ1cHRJbmZvKSk7CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHIgPSBwaHlzX2NoYW5fYWRkcjsKKwlpZiAoY2hhbl9ieXRlcyA8IE1JTl9JT19DSEFOTkVMX1NJWkUpIHsKKwkJTE9HRVJSKCJ3cm9uZyBjaGFubmVsIHNpemUuY2hhbl9ieXRlcyA9IDB4JXggSU9fQ0hBTk5FTF9TSVpFPSAweCV4XG4iLAorCQkgICAgIGNoYW5fYnl0ZXMsICh1bnNpZ25lZCBpbnQpIE1JTl9JT19DSEFOTkVMX1NJWkUpOworCQlQT1NUQ09ERV9MSU5VWF80KFZOSUNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoYW5fYnl0ZXMsCisJCQkJIE1JTl9JT19DSEFOTkVMX1NJWkUsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBjaGFuX2J5dGVzOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9IFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQ7CisJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZOSUMgY3JlYXRlX2RldmljZSBmYWlsZWQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfNChWTklDX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCVBPU1RDT0RFX0xJTlVYXzQoVk5JQ19DUkVBVEVfU1VDQ0VTU19QQywgZGV2Tm8sIGJ1c05vLAorCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZuaWMpOworCitpbnQKK3Vpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCWludCByYzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLCAwLCAwKTsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyA9IGRldk5vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUgPSBTZWdtZW50U3RhdGVTdGFuZGJ5OworCXJjID0gcGF1c2VfZGV2aWNlKCZtc2cpOworCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCUxPR0VSUigiVk5JQyBwYXVzZV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsCisJCSAgICAgICBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9pbmplY3RfcGF1c2Vfdm5pYyk7CisKK2ludAordWlzbGliX2NsaWVudF9pbmplY3RfcmVzdW1lX3ZuaWMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworCWludCByYzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLCAwLCAwKTsKKwltc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyA9IGRldk5vOworCW1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUgPSBTZWdtZW50U3RhdGVSdW5uaW5nOworCXJjID0gcmVzdW1lX2RldmljZSgmbXNnKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoIlZOSUMgcmVzdW1lX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKKwkJICAgICAgIGJ1c05vLCBkZXZObyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92bmljKTsKKworaW50Cit1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyhVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlyZXR1cm4gZGVsZXRlX2RldmljZV9nbHVlKGJ1c05vLCBkZXZObyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyk7CisKK3N0YXRpYyBpbnQKK3Vpc2xpYl9jbGllbnRfYWRkX3ZuaWMoVTMyIGJ1c05vKQoreworCUJPT0wgYnVzQ3JlYXRlZCA9IEZBTFNFOworCWludCBkZXZObyA9IDA7CQkvKiBEZWZhdWx0IHRvIDAsIHNpbmNlIG9ubHkgb25lIGRldmljZQorCQkJCSAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBidXMuLi4gKi8KKwlHVUlEIGR1bW15R3VpZCA9IEdVSUQwOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0NSRUFURSwgMCwgMCk7CisJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDE7CisJbXNnLmNtZC5jcmVhdGVCdXMuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmNyZWF0ZUJ1cy5kZXZpY2VDb3VudCA9IDQ7CisJbXNnLmNtZC5jcmVhdGVCdXMuY2hhbm5lbEFkZHIgPSAwOworCW1zZy5jbWQuY3JlYXRlQnVzLmNoYW5uZWxCeXRlcyA9IDA7CisJaWYgKGNyZWF0ZV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImNsaWVudCBjcmVhdGVfYnVzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisJYnVzQ3JlYXRlZCA9IFRSVUU7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIDAsIDApOworCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAxOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmJ1c05vID0gYnVzTm87CisJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwltc2cuY21kLmNyZWF0ZURldmljZS5kZXZJbnN0R3VpZCA9IGR1bW15R3VpZDsKKwltZW1zZXQoJm1zZy5jbWQuY3JlYXRlRGV2aWNlLmludHIsIDAsIHNpemVvZihzdHJ1Y3QgSW50ZXJydXB0SW5mbykpOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmNoYW5uZWxBZGRyID0gUGh5c2ljYWxEYXRhQ2hhbjsKKwltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBNSU5fSU9fQ0hBTk5FTF9TSVpFOworCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9IFVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQ7CisJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQlMT0dFUlIoImNsaWVudCBjcmVhdGVfZGV2aWNlIGZhaWxlZCIpOworCQlnb3RvIEF3YXlDbGVhbnVwOworCX0KKworCXJldHVybiAxOworCitBd2F5Q2xlYW51cDoKKwlpZiAoYnVzQ3JlYXRlZCkgeworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAwLCAwKTsKKwkJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDE7CisJCW1zZy5jbWQuZGVzdHJveUJ1cy5idXNObyA9IGJ1c05vOworCQlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKKwkJCUxPR0VSUigiY2xpZW50IGRlc3Ryb3lfYnVzIGZhaWxlZC5cbiIpOworCX0KKworCXJldHVybiAwOworfQkJCQkvKiBlbmQgdWlzbGliX2NsaWVudF9hZGRfdm5pYyAqLworRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2NsaWVudF9hZGRfdm5pYyk7CisKK3N0YXRpYyBpbnQKK3Vpc2xpYl9jbGllbnRfZGVsZXRlX3ZuaWMoVTMyIGJ1c05vKQoreworCWludCBkZXZObyA9IDA7CQkvKiBEZWZhdWx0IHRvIDAsIHNpbmNlIG9ubHkgb25lIGRldmljZQorCQkJCSAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBidXMuLi4gKi8KKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCAwLCAwKTsKKwltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuYnVzTm8gPSBidXNObzsKKwltc2cuY21kLmRlc3Ryb3lEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwlpZiAoZGVzdHJveV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkvKiBEb24ndCBlcnJvciBleGl0IC0gdHJ5IHRvIHNlZSBpZiBidXMgY2FuIGJlIGRlc3Ryb3llZC4uLiAqLworCQlMT0dFUlIoImNsaWVudCBkZXN0cm95X2RldmljZSBmYWlsZWQuXG4iKTsKKwl9CisKKwlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAwLCAwKTsKKwltc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID0gMTsKKwltc2cuY21kLmRlc3Ryb3lCdXMuYnVzTm8gPSBidXNObzsKKwlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKKwkJTE9HRVJSKCJjbGllbnQgZGVzdHJveV9idXMgZmFpbGVkLlxuIik7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfZGVsZXRlX3ZuaWMpOworLyogZW5kIGNsaWVudF9kZWxldGVfdm5pYyAqLworCit2b2lkICoKK3Vpc2xpYl9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY3VyX3Bvb2wsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJLyogX19HRlBfTk9SRVRSWSBtZWFucyAib2sgdG8gZmFpbCIsIG1lYW5pbmcga21hbGxvYygpIGNhbgorCSogcmV0dXJuIE5VTEwuICBJZiB5b3UgZG8gTk9UIHNwZWNpZnkgX19HRlBfTk9SRVRSWSwgTGludXgKKwkqIHdpbGwgZ28gdG8gZXh0cmVtZSBtZWFzdXJlcyB0byBnZXQgbWVtb3J5IGZvciB5b3UgKGxpa2UsCisJKiBpbnZva2Ugb29tIGtpbGxlciksIHdoaWNoIHdpbGwgcHJvYmFibHkgY3JpcHBsZSB0aGUgc3lzdGVtLgorCSovCisJdm9pZCAqcCA9IGttZW1fY2FjaGVfYWxsb2MoY3VyX3Bvb2wsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCUxPR0VSUigidWlzbGliX21hbGxvYyBmYWlsZWQgdG8gYWxsb2MgdWlzY21kcnNwIEAlczolZCIsCisJCSAgICAgICBmbiwgbG4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfYWxsb2MpOworCit2b2lkCit1aXNsaWJfY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqY3VyX3Bvb2wsIHZvaWQgKnAsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJaWYgKHAgPT0gTlVMTCkgeworCQlMT0dFUlIoInVpc2xpYl9mcmVlIE5VTEwgcG9pbnRlciBAJXM6JWQiLCBmbiwgbG4pOworCQlyZXR1cm47CisJfQorCWttZW1fY2FjaGVfZnJlZShjdXJfcG9vbCwgcCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfZnJlZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2MgZmlsZXN5c3RlbSBjYWxsYmFjayBmdW5jdGlvbnMgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QKK3ZuaWNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGFjdGlvbiA9IDB4ZmZmZiwgYnVzTm8gPSAwLCBpLCByZXN1bHQgPSAwOworCWNoYXIgYnVmWzRdOworCWNoYXIgZGlyZWN0aW9uOworLyogR1VJRCBndWlkOyAqLworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJlY2hvID4gL3Byb2MvdWlzbGliL3ZuaWMgY29weV9mcm9tX3VzZXIgKioqKkZBSUxFRC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkJWMiLCAmYWN0aW9uLCAmZGlyZWN0aW9uKTsKKwlpZiAoaSAhPSAyKSB7CisJCUxPR0VSUigidW5hYmxlIHRvIHBhcnNlIHZuaWMgcHJvYyBwYXJhbWV0ZXJzLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICgoZGlyZWN0aW9uICE9ICctJykgJiYgKGRpcmVjdGlvbiAhPSAnKycpKSB7CisJCUxPR0VSUigidW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGFkZCBvciBkZWxldGUgdm5pY1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIGlmIChpIDwgMSksIGkuZS4sIGlmIHdlIGRpZG4ndCBldmVuIHJlYWQgdGhlIGFjdGlvbiBmaWVsZCwKKwkqIHRoZW4gYWN0aW9uIHdpbGwgZGVmYXVsdCB0byAweGZmZmYgYW5kIHRoZSBjb2RlIGJlbG93IHdpbGwKKwkqIGZhbGwgdGhyb3VnaCB0aGUgc3dpdGNoIGFuZCBwcmludCB1c2FnZS4KKwkqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAwOgorCQkvKiBjYWxsIGNsaWVudCBtZXRob2QuLi4gKi8KKwkJYnVzTm8gPSAwOwkvKiBBbGwgY2xpZW50IGRyaXZlcnMgdXNlIGJ1cyB2YWx1ZSBvZiAwLi4uICovCisJCWlmIChkaXJlY3Rpb24gPT0gJysnKQorCQkJcmVzdWx0ID0gdWlzbGliX2NsaWVudF9hZGRfdm5pYyhidXNObyk7CisJCWVsc2UKKwkJCXJlc3VsdCA9IHVpc2xpYl9jbGllbnRfZGVsZXRlX3ZuaWMoYnVzTm8pOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HRVJSKCJlY2hvIDAlYyA+IC9wcm9jL3Vpc2xpYi92bmljIGZhaWxlZCAoY2xpZW50IGVuZCkiLAorCQkJICAgICBkaXJlY3Rpb24pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJTE9HRVJSKCJVU0FHRTogZWNobyA8YWN0aW9uPjxkaXJlY3Rpb24gKHVwL2Rvd24pPiA+IC9wcm9jL3Vpc2xpYi92bmljIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJDbGllbnQgU3ludGF4Iik7CisJTE9HRVJSKCItLS0tLS0tLS0tLS0tIik7CisJTE9HRVJSKCIwKyAgICA9PT4gYWRkIHZuaWMiKTsKKwlMT0dFUlIoIjAtICAgID09PiBkZWxldGUgdm5pYyIpOworCUxPR0VSUigiICIpOworCXJldHVybiBjb3VudDsKK30JCQkJLyogZW5kIHZuaWNfcHJvY193cml0ZSAqLworCitzdGF0aWMgc3NpemVfdAorY2hpcHNldF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaSwgYWN0aW9uID0gMHhmZmZmOworCWNoYXIgYnVmWzRdOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJjb3B5X2Zyb21fdXNlciAqKioqRkFJTEVELlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjaGlwc2V0X2luaXRlZCkgeworCQlMT0dJTkYoIkNoaXBzZXQgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpID0gc3NjYW5mKGJ1ZiwgIiV4IiwgJmFjdGlvbik7CisKKwkvKiBpZiAoaSA8IDEpLCBpLmUuLCBpZiB3ZSBkaWRuJ3QgZXZlbiByZWFkIHRoZSBhY3Rpb24gZmllbGQsCisJKiB0aGVuIGFjdGlvbiB3aWxsIGRlZmF1bHQgdG8gMHhmZmZmIGFuZCB0aGUgY29kZSBiZWxvdyB3aWxsCisJKiBmYWxsIHRocm91Z2ggdGhlIHN3aXRjaCBhbmQgcHJpbnQgdXNhZ2UuCisJKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgMToKKwkJLyogR1VFU1QgKi8KKwkJLyogc3RlcDogaW5pdGlhbGl6ZSB0aGUgY2hpcHNldCAqLworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0NISVBTRVRfSU5JVCwgMCwgMCk7CisJCW1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPSAwOworCQltc2cuY21kLmluaXRDaGlwc2V0LmJ1c0NvdW50ID0gMjM7CisJCW1zZy5jbWQuaW5pdENoaXBzZXQuc3dpdGNoQ291bnQgPSAyMzsKKworCQlpZiAoaW5pdF9jaGlwc2V0KCZtc2csIE5VTEwpICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCUxPR0VSUigiaW5pdF9jaGlwc2V0IGZhaWxlZC5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJY2FzZSAyOgorCQkvKiBCT1RIICovCisJCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQ0hJUFNFVF9JTklULCAwLCAwKTsKKwkJbXNnLmhkci5GbGFncy50ZXN0TWVzc2FnZSA9IDE7CisJCW1zZy5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQgPSAyMzsKKwkJbXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCA9IDIzOworCisJCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgeworCQkJTE9HRVJSKCJpbml0X2NoaXBzZXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUxPR0VSUigidXNhZ2U6IDEgPT0+IGluaXRfY2hpcHNldCBjbGllbnRcbiIpOworCUxPR0VSUigidXNhZ2U6IDIgPT0+IGluaXRfY2hpcHNldCB0ZXN0XG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworI2RlZmluZSBQTElORSguLi4pIHVpc3V0aWxfYWRkX3Byb2NfbGluZV9leCgmdG90LCBidWZmLCBcCisJCQkJCSAgICAgICBidWZmX2xlbiwgX19WQV9BUkdTX18pCisKK3N0YXRpYyBpbnQKK2luZm9fcHJvY19yZWFkX2hlbHBlcihjaGFyICoqYnVmZiwgaW50ICpidWZmX2xlbikKK3sKKwlpbnQgaSwgdG90ID0gMDsKKwlzdHJ1Y3QgYnVzX2luZm8gKmJ1czsKKworCWlmIChQTElORSgiXG5CdXNlczpcbiIpIDwgMCkKKwkJZ290byBlcnJfZG9uZTsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisKKwkJaWYgKFBMSU5FKCIgICAgYnVzPTB4JXAsIGJ1c05vPSVkLCBkZXZpY2VDb3VudD0lZFxuIiwKKwkJCSAgYnVzLCBidXMtPmJ1c05vLCBidXMtPmRldmljZUNvdW50KSA8IDApCisJCQlnb3RvIGVycl9kb25lX3VubG9jazsKKworCisJCWlmIChQTElORSgiICAgICAgICBEZXZpY2VzOlxuIikgPCAwKQorCQkJZ290byBlcnJfZG9uZV91bmxvY2s7CisKKwkJZm9yIChpID0gMDsgaSA8IGJ1cy0+ZGV2aWNlQ291bnQ7IGkrKykgeworCQkJaWYgKGJ1cy0+ZGV2aWNlW2ldKSB7CisJCQkJaWYgKFBMSU5FKCIgICAgICAgICAgICBidXNObyAlZCwgZGV2aWNlWyVpXTogMHglcCwgY2hhbnB0cj0weCVwLCBzd3RjaD0weCVwXG4iLAorCQkJCQkgIGJ1cy0+YnVzTm8sIGksIGJ1cy0+ZGV2aWNlW2ldLAorCQkJCQkgIGJ1cy0+ZGV2aWNlW2ldLT5jaGFucHRyLAorCQkJCQkgIGJ1cy0+ZGV2aWNlW2ldLT5zd3RjaCkgPCAwKQorCQkJCQlnb3RvIGVycl9kb25lX3VubG9jazsKKworCQkJCWlmIChQTElORSgiICAgICAgICAgICAgZmlyc3RfYnVzeV9jbnQ9JWxsdSwgbW92ZWRfdG9fdGFpbF9jbnQ9JWxsdSwgbGFzdF9vbl9saXN0X2NudD0lbGx1XG4iLAorCQkJCQkgIGJ1cy0+ZGV2aWNlW2ldLT5maXJzdF9idXN5X2NudCwKKwkJCQkJICBidXMtPmRldmljZVtpXS0+bW92ZWRfdG9fdGFpbF9jbnQsCisJCQkJCSAgYnVzLT5kZXZpY2VbaV0tPmxhc3Rfb25fbGlzdF9jbnQpIDwgMCkKKwkJCQkJZ290byBlcnJfZG9uZV91bmxvY2s7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKworCWlmIChQTElORSgiVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlczogJWRcbiIsCisJCSAgYXRvbWljX3JlYWQoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpKSA8IDApCisJCWdvdG8gZXJyX2RvbmU7CisJaWYgKFBMSU5FKCJjeWNsZXNfYmVmb3JlX3dhaXQgJWxsdSB3YWl0X2N5Y2xlczolbGx1XG4iLAorCQkgIGN5Y2xlc19iZWZvcmVfd2FpdCwgd2FpdF9jeWNsZXMpIDwgMCkKKwkJCWdvdG8gZXJyX2RvbmU7CisJaWYgKFBMSU5FKCJ0b3Rfd2FrZXVwX2NudCAlbGx1OnRvdF93YWl0X2NudCAlbGx1OnRvdF9zY2hlZHVsZV9jbnQgJWxsdVxuIiwKKwkJICB0b3Rfd2FrZXVwX2NudCwgdG90X3dhaXRfY250LCB0b3Rfc2NoZWR1bGVfY250KSA8IDApCisJCQlnb3RvIGVycl9kb25lOworCWlmIChQTElORSgiZW5fc21hcnRfd2FrZXVwICVkXG4iLCBlbl9zbWFydF93YWtldXApIDwgMCkKKwkJCWdvdG8gZXJyX2RvbmU7CisJaWYgKFBMSU5FKCJ0b3RfbW92ZWRfdG9fdGFpbF9jbnQgJWxsdVxuIiwgdG90X21vdmVkX3RvX3RhaWxfY250KSA8IDApCisJCQlnb3RvIGVycl9kb25lOworCisJcmV0dXJuIHRvdDsKKworZXJyX2RvbmVfdW5sb2NrOgorCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CitlcnJfZG9uZToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbmZvX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJY2hhciAqdGVtcDsKKwlpbnQgdG90YWxCeXRlcyA9IDA7CisJaW50IHJlbWFpbmluZ19ieXRlcyA9IFBST0NfUkVBRF9CVUZGRVJfU0laRTsKKworLyogKnN0YXJ0ID0gYnVmOyAqLworCWlmIChQcm9jUmVhZEJ1ZmZlciA9PSBOVUxMKSB7CisJCURCR0lORigiUHJvY1JlYWRCdWZmZXIgPT0gTlVMTDsgYWxsb2NhdGluZyBidWZmZXIuXG4uIik7CisJCVByb2NSZWFkQnVmZmVyID0gdm1hbGxvYyhQUk9DX1JFQURfQlVGRkVSX1NJWkUpOworCisJCWlmIChQcm9jUmVhZEJ1ZmZlciA9PSBOVUxMKSB7CisJCQlMT0dFUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgdG8gcHJvdmlkZSBwcm9jIGRhdGEuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJdGVtcCA9IFByb2NSZWFkQnVmZmVyOworCisJaWYgKCgqb2Zmc2V0ID09IDApIHx8ICghUHJvY1JlYWRCdWZmZXJWYWxpZCkpIHsKKwkJREJHSU5GKCJjYWxsaW5nIGluZm9fcHJvY19yZWFkX2hlbHBlci5cbiIpOworCQkvKiBpZiB0aGUgcmVhZCBmYWlscywgdGhlbiAtMSB3aWxsIGJlIHJldHVybmVkICovCisJCXRvdGFsQnl0ZXMgPSBpbmZvX3Byb2NfcmVhZF9oZWxwZXIoJnRlbXAsICZyZW1haW5pbmdfYnl0ZXMpOworCQlQcm9jUmVhZEJ1ZmZlclZhbGlkID0gMTsKKwl9IGVsc2UKKwkJdG90YWxCeXRlcyA9IHN0cmxlbihQcm9jUmVhZEJ1ZmZlcik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIG9mZnNldCwKKwkJCQkgICAgICAgUHJvY1JlYWRCdWZmZXIsIHRvdGFsQnl0ZXMpOworfQorCitzdGF0aWMgc3NpemVfdAorcGxhdGZvcm1udW1iZXJfcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCBsZW5ndGggPSAwOworCWNoYXIgKnZidWY7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zID4gMCB8fCAhbGVuKQorCQlyZXR1cm4gMDsKKworCXZidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbmd0aCA9IHNwcmludGYodmJ1ZiwgIiVkXG4iLCBQbGF0Zm9ybU51bWJlcik7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmJ1ZiwgbGVuZ3RoKSkgeworCQlrZnJlZSh2YnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUodmJ1Zik7CisJKm9mZnNldCArPSBsZW5ndGg7CisJcmV0dXJuIGxlbmd0aDsKK30KKworI2lmZGVmIFVJU0xJQl9URVNUX1BST0MKKworLyogcHJvYy91aXNsaWIvdmJ1cy88eD4vaW5mbyAqLworc3RhdGljIGludAorcHJvY19pbmZvX3ZidXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGJ1c19pbmZvICpidXMgPSBtLT5wcml2YXRlOworCWludCBpLCBkZXZJbmZvQ291bnQsIHg7CisJY2hhciBidWZbOTk5XTsKKworCWlmIChidXMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJc2VxX3ByaW50ZihtLCAiQ2xpZW50IGRldmljZSAvIGNsaWVudCBkcml2ZXIgaW5mbyBmb3IgJXMgcGFydGl0aW9uICh2YnVzICMlZCk6XG4iLAorCQkgICBidXMtPnBhcnRpdGlvbk5hbWUsIGJ1cy0+YnVzTm8pOworCWlmICgoYnVzLT5idXNDaGFubmVsQnl0ZXMgPT0gMCkgfHwgKGJ1cy0+cEJ1c0NoYW5uZWwgPT0gTlVMTCkpCisJCXJldHVybiAwOworCWRldkluZm9Db3VudCA9CisJICAgIChidXMtPmJ1c0NoYW5uZWxCeXRlcyAtCisJICAgICBzaXplb2YoVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MKSkgLworCSAgICBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKTsKKwl4ID0gVkJVU0NIQU5ORUxfZGV2SW5mb1RvU3RyaW5nQnVmZmVyKCZidXMtPnBCdXNDaGFubmVsLT5DaHBJbmZvLCBidWYsCisJCQkJCSAgICAgIHNpemVvZihidWYpIC0gMSwgLTEpOworCWJ1Zlt4XSA9ICdcMCc7CisJc2VxX3ByaW50ZihtLCAiJXMiLCBidWYpOworCXggPSBWQlVTQ0hBTk5FTF9kZXZJbmZvVG9TdHJpbmdCdWZmZXIoJmJ1cy0+cEJ1c0NoYW5uZWwtPkJ1c0luZm8sCisJCQkJCSAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAtMSk7CisJYnVmW3hdID0gJ1wwJzsKKwlzZXFfcHJpbnRmKG0sICIlcyIsIGJ1Zik7CisJZm9yIChpID0gMDsgaSA8IGRldkluZm9Db3VudDsgaSsrKSB7CisJCXggPSBWQlVTQ0hBTk5FTF9kZXZJbmZvVG9TdHJpbmdCdWZmZXIoJmJ1cy0+cEJ1c0NoYW5uZWwtPgorCQkJCQkJICAgICAgRGV2SW5mb1tpXSwgYnVmLAorCQkJCQkJICAgICAgc2l6ZW9mKGJ1ZikgLSAxLCBpKTsKKwkJaWYgKHggPiAwKSB7CisJCQlidWZbeF0gPSAnXDAnOworCQkJc2VxX3ByaW50ZihtLCAiJXMiLCBidWYpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorYnVzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBzZXJ2ZXJfZmxhZyA9IDA7CisJaW50IGksIGFjdGlvbiA9IDB4ZmZmZiwgcmVzdWx0OworCWNoYXIgYnVmWzE2XTsKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJVTMyIGJ1c05vLCBkZXZpY2VDb3VudDsKKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJlY2hvID4gL3Byb2MvdWlzbGliL2J1czogY29weV9mcm9tX3VzZXIgKioqKkZBSUxFRC4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaSA9IHNzY2FuZihidWYsICIleC0lZC0lZCIsICZhY3Rpb24sICZidXNObywgJmRldmljZUNvdW50KTsKKworCS8qIGlmIChpIDwgMSksIGkuZS4sIGlmIHdlIGRpZG4ndCBldmVuIHJlYWQgdGhlIGFjdGlvbiBmaWVsZCwKKwkqIHRoZW4gYWN0aW9uIHdpbGwgZGVmYXVsdCB0byAweGZmZmYgYW5kIHRoZSBjb2RlIGJlbG93IHdpbGwKKwkqIGZhbGwgdGhyb3VnaCB0aGUgc3dpdGNoIGFuZCBwcmludCB1c2FnZS4KKwkqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAwOgorCQkvKiBkZXN0cm95IGEgYnVzICovCisJCWlmIChpICE9IDIpCisJCQlicmVhazsKKwkJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9CVVNfREVTVFJPWSwgMCwgc2VydmVyX2ZsYWcpOworCQltc2cuY21kLmRlc3Ryb3lCdXMuYnVzTm8gPSBidXNObzsKKworCQlyZXN1bHQgPSBkZXN0cm95X2J1cygmbXNnLCBOVUxMKTsKKworCQlpZiAocmVzdWx0ICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCUxPR0VSUigiZWNobyAwLSVkID4gL3Byb2MvdWlzbGliL2J1cyB7Q09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZH0gUmVzdWx0KCVkKSIsCisJCQkgICAgIGJ1c05vLCByZXN1bHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCWNhc2UgMToKKwkJLyogY3JlYXRlIGEgYnVzICovCisJCWlmIChpICE9IDMpCisJCQlicmVhazsKKwkJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9CVVNfQ1JFQVRFLCAwLCBzZXJ2ZXJfZmxhZyk7CisJCW1zZy5jbWQuY3JlYXRlQnVzLmJ1c05vID0gYnVzTm87CisJCW1zZy5jbWQuY3JlYXRlQnVzLmRldmljZUNvdW50ID0gZGV2aWNlQ291bnQ7CisKKwkJcmVzdWx0ID0gY3JlYXRlX2J1cygmbXNnLCBOVUxMKTsKKworCQlpZiAocmVzdWx0ICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJCUxPR0VSUigiZWNobyAxLSVkLSVkID4gL3Byb2MvdWlzbGliL2J1cyB7Q09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkfSBSZXN1bHQoJWQpIiwKKwkJCSAgICAgYnVzTm8sIGRldmljZUNvdW50LCByZXN1bHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyZXR1cm4gY291bnQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJTE9HRVJSKCJVU0FHRTogZWNobyA8YWN0aW9uPi08YnVzTm8+Li4uID4gL3Byb2MvdWlzbGliL2J1cyIpOworCUxPR0VSUigiICIpOworCUxPR0VSUigiRGVzdHJ1Y3QgU3ludGF4ICAgICBDb250cm9sVk0gTWVzc2FnZSBJZCIpOworCUxPR0VSUigiLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlMT0dFUlIoIjAtPGJ1c05vPiAgICAgICA9PT4gQ09OVFJPTFZNX0JVU19ERVNUUk9ZIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJDb25zdHJ1Y3QgU3ludGF4ICAgICAgICAgICAgQ29udHJvbFZNIE1lc3NhZ2UgSWQiKTsKKwlMT0dFUlIoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAiKTsKKwlMT0dFUlIoIjEtPGJ1c05vPi08ZGV2aWNlQ291bnQ+ID09PiBDT05UUk9MVk1fQlVTX0NSRUFURSIpOworCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit1aXNsaWJfcHJvY19yZWFkX3dyaXRlb25seShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitkZXZfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHNlcnZlcl9mbGFnID0gMDsKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJVTMyIGJ1c05vLCBkZXZObzsKKwljaGFyIGJ1ZlszMl07CisJdW5zaWduZWQgaW50IGNoYW5wdHI7CisJaW50IHR5cGUsIGksIGFjdGlvbiA9IDB4ZmZmZiwgcmVzdWx0OworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImVjaG8gPiAvcHJvYy91aXNsaWIvZGV2aWNlOiBjb3B5X2Zyb21fdXNlciAqKioqRkFJTEVELiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiV4LSVkLSVkLSV4LSVkIiwKKwkJICAgJmFjdGlvbiwgJmJ1c05vLCAmZGV2Tm8sICZjaGFucHRyLCAmdHlwZSk7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgMDoKKwkJaWYgKGkgIT0gMykKKwkJCWJyZWFrOworCisJCS8qIGRlc3Ryb3kgYSBkZXZpY2UgKi8KKwkJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgMCwgc2VydmVyX2ZsYWcpOworCQltc2cuY21kLmRlc3Ryb3lEZXZpY2UuYnVzTm8gPSBidXNObzsKKwkJbXNnLmNtZC5kZXN0cm95RGV2aWNlLmRldk5vID0gZGV2Tm87CisKKwkJcmVzdWx0ID0gZGVzdHJveV9kZXZpY2UoJm1zZywgTlVMTCk7CisKKwkJaWYgKHJlc3VsdCAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCQlMT0dFUlIoImVjaG8gMC0lZC0lZCA+IC9wcm9jL3Vpc2xpYi9kZXZpY2Uge0NPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWR9IFJlc3VsdCglZCkiLAorCQkJICAgICBidXNObywgZGV2Tm8sIHJlc3VsdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldHVybiBjb3VudDsKKworCWNhc2UgMToKKwkJaWYgKGkgIT0gNSkKKwkJCWJyZWFrOworCisJCS8qIGNyZWF0ZSBhIGRldmljZSAqLworCQlpbml0X21zZ19oZWFkZXIoJm1zZywgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIDAsIHNlcnZlcl9mbGFnKTsKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuYnVzTm8gPSBidXNObzsKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuZGV2Tm8gPSBkZXZObzsKKwkJbXNnLmNtZC5jcmVhdGVEZXZpY2UuY2hhbm5lbEFkZHIgPSBfX3BhKGNoYW5wdHIpOworCQltc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQnl0ZXMgPSBNSU5fSU9fQ0hBTk5FTF9TSVpFOworCisJCWlmICh0eXBlID09IDApCisJCQltc2cuY21kLmNyZWF0ZURldmljZS5kYXRhVHlwZUd1aWQgPQorCQkJICAgIFVsdHJhVmhiYUNoYW5uZWxQcm90b2NvbEd1aWQ7CisJCWVsc2UgaWYgKHR5cGUgPT0gMSkKKwkJCW1zZy5jbWQuY3JlYXRlRGV2aWNlLmRhdGFUeXBlR3VpZCA9CisJCQkgICAgVWx0cmFWbmljQ2hhbm5lbFByb3RvY29sR3VpZDsKKwkJZWxzZSB7CisJCQlMT0dFUlIoImVjaG8gMS0lZC0lZC0leC08dHlwZT4gPiAvcHJvYy91aXNsaWIvZGV2Y2UgZmFpbGVkOiBpbnZhbGlkIGRldmljZSB0eXBlICVkLiIsCisJCQkgICAgIGJ1c05vLCBkZXZObywgY2hhbnB0ciwgdHlwZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJlc3VsdCA9IGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCk7CisKKwkJaWYgKHJlc3VsdCAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CisJCQlpZiAodHlwZSA9PSAwKQorCQkJCUxPR0VSUigiZWNobyAxLSVkLSVkLSV4LTAgPiAvcHJvYy91aXNsaWIvZGV2aWNlIHtDT05UUk9MVk1fREVWSUNFX0NSRUFURVt2SEJBXSBGYWlsZWR9IFJlc3VsdCglZCkiLAorCQkJCSAgICAgYnVzTm8sIGRldk5vLCBjaGFucHRyLCByZXN1bHQpOworCQkJZWxzZQorCQkJCUxPR0VSUigiZWNobyAxLSVkLSVkLSV4LTEgPiAvcHJvYy91aXNsaWIvZGV2aWNlIHtDT05UUk9MVk1fREVWSUNFX0NSRUFURVt2TklDXSBGYWlsZWR9IFJlc3VsdCglZCkiLAorCQkJCSAgICAgYnVzTm8sIGRldk5vLCBjaGFucHRyLCByZXN1bHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUxPR0VSUigiVVNBR0U6IGVjaG8gPGFjdGlvbj4tPGJ1c05vPi08ZGV2Tm8+Li4uID4gL3Byb2MvdWlzbGliL2RldmljZSIpOworCUxPR0VSUigiICIpOworCUxPR0VSUigiRGVzdHJ1Y3QgU3ludGF4ICAgICAgIENvbnRyb2xWTSBNZXNzYWdlIElkIik7CisJTE9HRVJSKCItLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJTE9HRVJSKCIwLTxidXNObz4tPGRldk5vPiA9PT4gQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIik7CisJTE9HRVJSKCIgIik7CisJTE9HRVJSKCJDb25zdHJ1Y3QgU3ludGF4ICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sVk0gTWVzc2FnZSBJZCIpOworCUxPR0VSUgorCSAgICAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworCUxPR0VSUgorCSAgICAoIjEtPGJ1c05vPi08ZGV2Tm8+LTxjaGFucHRyPi08dHlwZT4gPT0+IENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIik7CisJTE9HRVJSKCIgICAgICA8dHlwZSA9IDA+OiB2SEJBIik7CisJTE9HRVJSKCIgICAgICA8dHlwZSA9IDE+OiB2TklDIik7CisJTE9HRVJSKCIgIik7CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIHNzaXplX3QKK2N5Y2xlc19iZWZvcmVfd2FpdF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbMTZdOworCisjZGVmaW5lIENZQ0xFU19CRUZPUkVfV0FJVF9VU0VfRVJST1IgIHsgXAorCUxPR0VSUigiSW5jb3JyZWN0IENhbGwgSG9tZSBJbnB1dC5cbiIpOyBcCisJcHJfaW5mbygiUGxlYXNlIHBhc3MgQ2FsbCBIb21lIEV2ZW50IFBhcmFtZXRlcnMgaW4gdGhlIGZvcm06XG4iKTsgXAorCXByX2luZm8oIkV2ZW50SUQgQ2F0ZWdvcnkgVHlwZVtwYXJhbWV0ZXIxXVtwYXJhbWV0ZXIyXVtwYXJhbWV0ZXIzXVtwYXJhbWV0ZXI0XVtwYXJhbWV0ZXI1XVtwYXJhbWV0ZXI2XVxuIik7IFwKKwlyZXR1cm4gLUVGQVVMVDsgXAorfQorCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvdW50ID09IDApCisJCUNZQ0xFU19CRUZPUkVfV0FJVF9VU0VfRVJST1I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50IC0gMV0gPSAnXDAnOwkvKiBSZXBsYWNlIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZQorCQkJCSAqIGlucHV0IHdpdGggYSBOVUxMICovCisJLyogUHVsbCBvdXQgdGhlIGN5Y2xlc19iZWZvcmVfd2FpdCBtdXN0IGJlIGRlY2ltYWwgaW50ZWdlciAqLworCWlmIChzc2NhbmYoYnVmLCAiJWxsZCIsICZjeWNsZXNfYmVmb3JlX3dhaXQpICE9IDEpCisJCUNZQ0xFU19CRUZPUkVfV0FJVF9VU0VfRVJST1I7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CityZXNldF9jb3VudHNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzE2XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbmV3X3ZhbHVlOworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCWludCBpOworCisjZGVmaW5lIFJFU0VUX0NPVU5UU19VU0VfRVJST1IgIHsgXAorCUxPR0VSUigiSW5jb3JyZWN0IHJlc2V0X2NvdW50cyBJbnB1dC5cbiIpOyBcCisJcHJfaW5mbygiUGxlYXNlIHBhc3MgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvdW50ZXJzOlxuIik7IFwKKwlwcl9pbmZvKCJlLmcuIGVjaG8gMCA+IHJlc2V0X2NvdW50c1xuIik7IFwKKwlyZXR1cm4gLUVGQVVMVDsgXAorCX0KKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvdW50ID09IDApCisJCVJFU0VUX0NPVU5UU19VU0VfRVJST1I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50IC0gMV0gPSAnXDAnOwkvKiBSZXBsYWNlIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZQorCQkJCSAqIGlucHV0IHdpdGggYSBOVUxMICovCisJLyogUHVsbCBvdXQgdGhlIHJlc2V0X2NvdW50cyBtdXN0IGJlIGRlY2ltYWwgaW50ZWdlciAqLworCWlmIChzc2NhbmYoYnVmLCAiJWxsdSIsICZuZXdfdmFsdWUpICE9IDEpCisJCVJFU0VUX0NPVU5UU19VU0VfRVJST1I7CisJcmVhZF9sb2NrKCZCdXNMaXN0TG9jayk7CisJZm9yIChidXMgPSBCdXNMaXN0SGVhZDsgYnVzOyBidXMgPSBidXMtPm5leHQpIHsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnVzLT5kZXZpY2VDb3VudDsgaSsrKSB7CisJCQlpZiAoYnVzLT5kZXZpY2VbaV0pIHsKKwkJCQlidXMtPmRldmljZVtpXS0+Zmlyc3RfYnVzeV9jbnQgPSBuZXdfdmFsdWU7CisJCQkJYnVzLT5kZXZpY2VbaV0tPm1vdmVkX3RvX3RhaWxfY250ID0gbmV3X3ZhbHVlOworCQkJCWJ1cy0+ZGV2aWNlW2ldLT5sYXN0X29uX2xpc3RfY250ID0gbmV3X3ZhbHVlOworCQkJfQorCQl9CisJfQorCXJlYWRfdW5sb2NrKCZCdXNMaXN0TG9jayk7CisJdG90X21vdmVkX3RvX3RhaWxfY250ID0gbmV3X3ZhbHVlOworCXRvdF93YWl0X2NudCA9IG5ld192YWx1ZTsKKwl0b3Rfd2FrZXVwX2NudCA9IG5ld192YWx1ZTsKKwl0b3Rfc2NoZWR1bGVfY250ID0gbmV3X3ZhbHVlOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3NtYXJ0X3dha2V1cF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbMTZdOworCWludCBuZXdfdmFsdWU7CisKKyNkZWZpbmUgU01BUlRfV0FLRVVQX1VTRV9FUlJPUiAgeyBcCisJTE9HRVJSKCJJbmNvcnJlY3Qgc21hcnRfd2FrZXVwIElucHV0IDAgZGlzYWJsZXMgc21hcnRfd2FrZXVwLCBhbmQgMSBlbmFibGVzIHNtYXJ0X3dha2V1cC5cbiIpOyBcCisJcHJfaW5mbygiZWNobyAwID4gc21hcnRfd2FrZXVwXG4iKTsgXAorCXByX2luZm8oImVjaG8gMSA+IHNtYXJ0X3dha2V1cFxuIik7IFwKKwlyZXR1cm4gLUVGQVVMVDsgXAorCX0KKworCWlmIChjb3VudCA+PSBBUlJBWV9TSVpFKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvdW50ID09IDApCisJCVNNQVJUX1dBS0VVUF9VU0VfRVJST1I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2NvdW50IC0gMV0gPSAnXDAnOwkvKiBSZXBsYWNlIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZQorCQkJCSAqIGlucHV0IHdpdGggYSBOVUxMICovCisJLyogUHVsbCBvdXQgdGhlIHNtYXJ0X3dha2V1cCBtdXN0IGJlIGRlY2ltYWwgaW50ZWdlciAqLworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmbmV3X3ZhbHVlKSAhPSAxKQorCQlTTUFSVF9XQUtFVVBfVVNFX0VSUk9SOworCWVuX3NtYXJ0X3dha2V1cCA9IG5ld192YWx1ZTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0ZXN0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBpLCBhY3Rpb24gPSAweGZmZmY7CisJY2hhciBidWZbMTZdOworCUNPTlRST0xWTV9NRVNTQUdFIG1zZzsKKwlTNjQgdnJ0Y19vZmZzZXQ7CisKKwlpZiAoY291bnQgPj0gQVJSQVlfU0laRShidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY29weV9mcm9tX3VzZXIgKioqKkZBSUxFRC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiV4IiwgJmFjdGlvbik7CisKKwkvKiBpZiAoaSA8IDEpLCBpLmUuLCBpZiB3ZSBkaWRuJ3QgZXZlbiByZWFkIHRoZSBhY3Rpb24gZmllbGQsCisJKiB0aGVuIGFjdGlvbiB3aWxsIGRlZmF1bHQgdG8gMHhmZmZmIGFuZCB0aGUgY29kZSBiZWxvdyB3aWxsCisJKiBmYWxsIHRocm91Z2ggdGhlIHN3aXRjaCBhbmQgcHJpbnQgdXNhZ2UuICovCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIDY6CisJCW1zZy5oZHIuSWQgPSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOworCQltc2cuaGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgPSAxOworCQlzdG9wX2NoaXBzZXQoJm1zZywgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJdnJ0Y19vZmZzZXQgPSAwOworCQlMT0dFUlIoImFib3V0IHRvIGlzc3VlIFFVRVJZIHZydGNfb2Zmc2V0PSVMWCIsIHZydGNfb2Zmc2V0KTsKKwkJdnJ0Y19vZmZzZXQgPSBJc3N1ZV9WTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCgpOworCQlMT0dFUlIoInJlc3VsdCBpcyB2cnRjX29mZnNldD0lTFgiLCB2cnRjX29mZnNldCk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJdnJ0Y19vZmZzZXQgPSA2MDsKKwkJTE9HRVJSKCJhYm91dCB0byBpbmNyZWFzZSBwaHlzaWNhbCB0aW1lIGJ5IDB4JUxYIHNlY29uZHMiLAorCQkgICAgICAgdnJ0Y19vZmZzZXQpOworCQl2cnRjX29mZnNldCA9IElzc3VlX1ZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRSh2cnRjX29mZnNldCk7CisJCWJyZWFrOworCWNhc2UgOToKKwkJdnJ0Y19vZmZzZXQgPSAtNjA7CisJCUxPR0VSUigiYWJvdXQgdG8gZGVjcmVhc2UgcGh5c2ljYWwgdGltZSBieSAweCVMWCBzZWNvbmRzIiwKKwkJICAgICAgIHZydGNfb2Zmc2V0KTsKKwkJdnJ0Y19vZmZzZXQgPSBJc3N1ZV9WTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUUodnJ0Y19vZmZzZXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dFUlIoInVzYWdlOiA2IGZvciBDSElQU0VUX1NUT1BcbiIpOworCQlMT0dFUlIoIiAgICAgICA3IGZvciBWTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVCgpXG4iKTsKKwkJTE9HRVJSKCIgICAgICAgOCBmb3IgVk1DQUxMX1VQREFURV9QSFlTSUNBTF9USU1FKDYwKVxuIik7CisJCUxPR0VSUigiICAgICAgIDkgZm9yIFZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRSgtNjApXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKyNlbmRpZgkJCQkvKiBVSVNMSUJfVEVTVF9QUk9DICovCitzdGF0aWMgc3RydWN0IGRldmljZV9pbmZvICoKK2ZpbmRfZGV2KFUzMiBidXNObywgVTMyIGRldk5vKQoreworCXN0cnVjdCBidXNfaW5mbyAqYnVzOworCXN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2ID0gTlVMTDsKKworCXJlYWRfbG9jaygmQnVzTGlzdExvY2spOworCWZvciAoYnVzID0gQnVzTGlzdEhlYWQ7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CisJCWlmIChidXMtPmJ1c05vID09IGJ1c05vKSB7CisJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KKwkJCWlmIChkZXZObyA+PSBidXMtPmRldmljZUNvdW50KSB7CisJCQkJTE9HRVJSKCIlcyBiYWQgYnVzTm8sIGRldk5vPSVkLCVkIiwKKwkJCQkgICAgICAgX19mdW5jX18sCisJCQkJICAgICAgIChpbnQpIChidXNObyksIChpbnQpIChkZXZObykpOworCQkJCWdvdG8gQXdheTsKKwkJCX0KKwkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldk5vXTsKKwkJCWlmICghZGV2KQorCQkJCUxPR0VSUigiJXMgYmFkIGJ1c05vLCBkZXZObz0lZCwlZCIsCisJCQkJICAgICAgIF9fZnVuY19fLAorCQkJCSAgICAgICAoaW50KSAoYnVzTm8pLCAoaW50KSAoZGV2Tm8pKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCX0KK0F3YXk6CisJcmVhZF91bmxvY2soJkJ1c0xpc3RMb2NrKTsKKwlyZXR1cm4gZGV2OworfQorCisvKiAgVGhpcyB0aHJlYWQgY2FsbHMgdGhlICJpbnRlcnJ1cHQiIGZ1bmN0aW9uIGZvciBlYWNoIGRldmljZSB0aGF0IGhhcworICogIGVuYWJsZWQgc3VjaCB1c2luZyB1aXNsaWJfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cygpLiAgVGhlICJpbnRlcnJ1cHQiCisgKiAgZnVuY3Rpb24gdHlwaWNhbGx5IHJlYWRzIGFuZCBwcm9jZXNzZXMgdGhlIGRldmljZXMncyBjaGFubmVsIGlucHV0CisgKiAgcXVldWUuICBUaGlzIHRocmVhZCByZXBlYXRlZGx5IGRvZXMgdGhpcywgdW50aWwgdGhlIHRocmVhZCBpcyB0b2xkIHRvIHN0b3AKKyAqICAodmlhIHVpc3RocmVhZF9zdG9wKCkpLiAgU2xlZXBpbmcgcnVsZXM6CisgKiAgLSBJZiB3ZSBoYXZlIGNhbGxlZCB0aGUgImludGVycnVwdCIgZnVuY3Rpb24gZm9yIGFsbCBkZXZpY2VzLCBhbmQgYWxsIG9mCisgKiAgICB0aGVtIGhhdmUgcmVwb3J0ZWQgIm5vdGhpbmcgcHJvY2Vzc2VkIiAocmV0dXJuZWQgMCksIHRoZW4gd2Ugd2lsbCBnbyB0bworICogICAgc2xlZXAgZm9yIGEgbWF4aW11bSBvZiBQT0xMSklGRklFU19OT1JNQUwgamlmZmllcy4KKyAqICAtIElmIGFueW9uZSBjYWxscyB1aXNsaWJfZm9yY2VfY2hhbm5lbF9pbnRlcnJ1cHQoKSwgdGhlIGFib3ZlIGppZmZ5CisgKiAgICBzbGVlcCB3aWxsIGJlIGludGVycnVwdGVkLCBhbmQgd2Ugd2lsbCByZXN1bWUgY2FsbGluZyB0aGUgImludGVycnVwdCIKKyAqICAgIGZ1bmN0aW9uIGZvciBhbGwgZGV2aWNlcy4KKyAqICAtIFRoZSBsaXN0IG9mIGRldmljZXMgaXMgZHluYW1pY2FsbHkgcmUtb3JkZXJlZCBpbiBvcmRlciB0bworICogICAgYXR0ZW1wdCB0byBwcmVzZXJ2ZSBmYWlybmVzcy4gIFdoZW5ldmVyIHdlIHNwaW4gdGhydSB0aGUgbGlzdCBvZgorICogICAgZGV2aWNlcyBhbmQgY2FsbCB0aGUgZGV2LT5pbnRlcnJ1cHQoKSBmdW5jdGlvbiwgaWYgd2UgZmluZAorICogICAgZGV2aWNlcyB3aGljaCByZXBvcnQgdGhhdCB0aGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8sIHRoZQorICogICAgdGhlIGZpcnN0IHN1Y2ggZGV2aWNlIHdlIGZpbmQgaXMgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZGV2aWNlCisgKiAgICBsaXN0LiAgVGhpcyBlbnN1cmVzIHRoYXQgZXh0cmVtZWx5IGJ1c3kgZGV2aWNlcyBkb24ndCBzdGFydmUgb3V0CisgKiAgICBsZXNzLWJ1c3kgb25lcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK1Byb2Nlc3NfSW5jb21pbmcodm9pZCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3VyX2N5Y2xlcywgb2xkX2N5Y2xlcywgaWRsZV9jeWNsZXMsIGRlbHRhX2N5Y2xlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXdfdGFpbCA9IE5VTEw7CisJaW50IGk7CisJVUlTX0RBRU1PTklaRSgiZGV2X2luY29taW5nIik7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJb2xkX2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsKKwkJd2FpdF9ldmVudF90aW1lb3V0KFdha2V1cF9Qb2xsaW5nX0RldmljZV9DaGFubmVscywKKwkJCQkgICAwLCBQT0xMSklGRklFU19OT1JNQUwpOworCQljdXJfY3ljbGVzID0gZ2V0X2N5Y2xlcygpOworCQlpZiAod2FpdF9jeWNsZXMgPT0gMCkgeworCQkJd2FpdF9jeWNsZXMgPSAoY3VyX2N5Y2xlcyAtIG9sZF9jeWNsZXMpOworCQl9IGVsc2UgeworCQkJaWYgKHdhaXRfY3ljbGVzIDwgKGN1cl9jeWNsZXMgLSBvbGRfY3ljbGVzKSkKKwkJCQl3YWl0X2N5Y2xlcyA9IChjdXJfY3ljbGVzIC0gb2xkX2N5Y2xlcyk7CisJCX0KKwl9CisJTE9HSU5GKCJ3YWl0X2N5Y2xlcz0lbGx1Iiwgd2FpdF9jeWNsZXMpOworCWN5Y2xlc19iZWZvcmVfd2FpdCA9IHdhaXRfY3ljbGVzOworCWlkbGVfY3ljbGVzID0gMDsKKwlHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGVsdCwgKnRtcDsKKwkJc3RydWN0IGRldmljZV9pbmZvICpkZXYgPSBOVUxMOworCisJCS8qIHBvbGwgZWFjaCBjaGFubmVsIGZvciBpbnB1dCAqLworCQlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJCW5ld190YWlsID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxlbHQsIHRtcCwgJkxpc3RfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpIHsKKwkJCWludCByYyA9IDA7CisJCQlkZXYgPSBsaXN0X2VudHJ5KGxlbHQsIHN0cnVjdCBkZXZpY2VfaW5mbywKKwkJCQkJIGxpc3RfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMpOworCQkJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJmRldi0+aW50ZXJydXB0X2NhbGxiYWNrX2xvY2spOworCQkJaWYgKGRldi0+aW50ZXJydXB0KQorCQkJCXJjID0gZGV2LT5pbnRlcnJ1cHQoZGV2LT5pbnRlcnJ1cHRfY29udGV4dCk7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCQlVTkxPQ0tTRU0oJmRldi0+aW50ZXJydXB0X2NhbGxiYWNrX2xvY2spOworCQkJaWYgKHJjKSB7CisJCQkJLyogZGV2LT5pbnRlcnJ1cHQgcmV0dXJuZWQsIGJ1dCB0aGVyZQorCQkJCSogaXMgc3RpbGwgbW9yZSB3b3JrIHRvIGRvLgorCQkJCSogUmVzY2hlZHVsZSB3b3JrIHRvIG9jY3VyIGFzIHNvb24gYXMKKwkJCQkqIHBvc3NpYmxlLiAqLworCQkJCWlkbGVfY3ljbGVzID0gMDsKKwkJCQlpZiAobmV3X3RhaWwgPT0gTlVMTCkgeworCQkJCQlkZXYtPmZpcnN0X2J1c3lfY250Kys7CisJCQkJCWlmICghCisJCQkJCSAgICAobGlzdF9pc19sYXN0CisJCQkJCSAgICAgKGxlbHQsCisJCQkJCSAgICAgICZMaXN0X1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKSkpIHsKKwkJCQkJCW5ld190YWlsID0gbGVsdDsKKwkJCQkJCWRldi0+bW92ZWRfdG9fdGFpbF9jbnQrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQlkZXYtPmxhc3Rfb25fbGlzdF9jbnQrKzsKKwkJCQl9CisKKwkJCX0KKwkJCWlmIChJbmNvbWluZ19UaHJlYWRJbmZvLnNob3VsZF9zdG9wKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChuZXdfdGFpbCAhPSBOVUxMKSB7CisJCQl0b3RfbW92ZWRfdG9fdGFpbF9jbnQrKzsKKwkJCWxpc3RfbW92ZV90YWlsKG5ld190YWlsLCAmTGlzdF9Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJCX0KKwkJVU5MT0NLU0VNKCZMb2NrX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwkJY3VyX2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsKKwkJZGVsdGFfY3ljbGVzID0gY3VyX2N5Y2xlcyAtIG9sZF9jeWNsZXM7CisJCW9sZF9jeWNsZXMgPSBjdXJfY3ljbGVzOworCisJCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgc2Nhbm5lZCB0aHJ1IGFsbCBvZiB0aGUKKwkJKiBjaGFubmVscywgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisJCSogLSB0aGVyZSBpcyBubyBpbnB1dCB3YWl0aW5nIG9uIGFueSBvZiB0aGUgY2hhbm5lbHMKKwkJKiAtIHdlIGhhdmUgcmVjZWl2ZWQgYSBzaWduYWwgdG8gc3RvcCB0aGlzIHRocmVhZAorCQkqLworCQlpZiAoSW5jb21pbmdfVGhyZWFkSW5mby5zaG91bGRfc3RvcCkKKwkJCWJyZWFrOworCQlpZiAoZW5fc21hcnRfd2FrZXVwID09IDB4RkYpIHsKKwkJCUxPR0lORigiZW5fc21hcnRfd2FrZXVwIHNldCB0byAweGZmLCB0byBmb3JjZSBleGl0aW5nIHByb2Nlc3NfaW5jb21pbmciKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIHdhaXQgZm9yIFBPTExKSUZGSUVTX05PUk1BTCBqaWZmaWVzLCBvciB1bnRpbAorCQkqIHNvbWVvbmUgd2FrZXMgdXAgV2FrZXVwX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzLAorCQkqIHdoaWNoZXZlciBjb21lcyBmaXJzdCBvbmx5IGRvIGEgd2FpdCB3aGVuIHdlIGhhdmUKKwkJKiBiZWVuIGlkbGUgZm9yIGN5Y2xlc19iZWZvcmVfd2FpdCBjeWNsZXMuCisJCSovCisJCWlmIChpZGxlX2N5Y2xlcyA+IGN5Y2xlc19iZWZvcmVfd2FpdCkgeworCQkJR29fUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMgPSAwOworCQkJdG90X3dhaXRfY250Kys7CisJCQl3YWl0X2V2ZW50X3RpbWVvdXQoV2FrZXVwX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzLAorCQkJCQkgICBHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscywKKwkJCQkJICAgUE9MTEpJRkZJRVNfTk9STUFMKTsKKwkJCUdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzID0gMTsKKwkJfSBlbHNlIHsKKwkJCXRvdF9zY2hlZHVsZV9jbnQrKzsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZGxlX2N5Y2xlcyA9IGlkbGVfY3ljbGVzICsgZGVsdGFfY3ljbGVzOworCQl9CisJfQorCURCR0lORigiZXhpdGluZy5cbiIpOworCWNvbXBsZXRlX2FuZF9leGl0KCZJbmNvbWluZ19UaHJlYWRJbmZvLmhhc19zdG9wcGVkLCAwKTsKK30KKworc3RhdGljIEJPT0wKK0luaXRpYWxpemVfaW5jb21pbmdfdGhyZWFkKHZvaWQpCit7CisJaWYgKEluY29taW5nX1RocmVhZF9TdGFydGVkKQorCQlyZXR1cm4gVFJVRTsKKwlpZiAoIXVpc3RocmVhZF9zdGFydCgmSW5jb21pbmdfVGhyZWFkSW5mbywKKwkJCSAgICAgJlByb2Nlc3NfSW5jb21pbmcsIE5VTEwsICJkZXZfaW5jb21pbmciKSkgeworCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCBJbml0aWFsaXplX2luY29taW5nX3RocmVhZCAqKioqRkFJTEVEIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJSW5jb21pbmdfVGhyZWFkX1N0YXJ0ZWQgPSBUUlVFOworCXJldHVybiBUUlVFOworfQorCisvKiAgQWRkIGEgbmV3IGRldmljZS9jaGFubmVsIHRvIHRoZSBsaXN0IGJlaW5nIHByb2Nlc3NlZCBieQorICogIFByb2Nlc3NfSW5jb21pbmcoKS4KKyAqICA8aW50ZXJydXB0PiAtIGluZGljYXRlcyB0aGUgZnVuY3Rpb24gdG8gY2FsbCBwZXJpb2RpY2FsbHkuCisgKiAgPGludGVycnVwdF9jb250ZXh0PiAtIGluZGljYXRlcyB0aGUgZGF0YSB0byBwYXNzIHRvIHRoZSA8aW50ZXJydXB0PgorICogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqLwordm9pZAordWlzbGliX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoVTMyIGJ1c05vLCBVMzIgZGV2Tm8sCisJCQkJIGludCAoKmludGVycnVwdCkodm9pZCAqKSwKKwkJCQkgdm9pZCAqaW50ZXJydXB0X2NvbnRleHQpCit7CisJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CisJZGV2ID0gZmluZF9kZXYoYnVzTm8sIGRldk5vKTsKKwlpZiAoIWRldikgeworCQlMT0dFUlIoIiVzIGJ1c05vPSVkLCBkZXZObz0lZCIsIF9fZnVuY19fLCAoaW50KSAoYnVzTm8pLAorCQkgICAgICAgKGludCkgKGRldk5vKSk7CisJCXJldHVybjsKKwl9CisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJkxvY2tfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworCUluaXRpYWxpemVfaW5jb21pbmdfdGhyZWFkKCk7CisJZGV2LT5pbnRlcnJ1cHQgPSBpbnRlcnJ1cHQ7CisJZGV2LT5pbnRlcnJ1cHRfY29udGV4dCA9IGludGVycnVwdF9jb250ZXh0OworCWRldi0+cG9sbGluZyA9IFRSVUU7CisJbGlzdF9hZGRfdGFpbCgmKGRldi0+bGlzdF9wb2xsaW5nX2RldmljZV9jaGFubmVscyksCisJCSAgICAgICZMaXN0X1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKTsKKwlVTkxPQ0tTRU0oJkxvY2tfUG9sbGluZ19EZXZpY2VfQ2hhbm5lbHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMpOworCisvKiAgUmVtb3ZlIGEgZGV2aWNlL2NoYW5uZWwgZnJvbSB0aGUgbGlzdCBiZWluZyBwcm9jZXNzZWQgYnkKKyAqICBQcm9jZXNzX0luY29taW5nKCkuCisgKi8KK3ZvaWQKK3Vpc2xpYl9kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhVMzIgYnVzTm8sIFUzMiBkZXZObykKK3sKKwlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldjsKKwlkZXYgPSBmaW5kX2RldihidXNObywgZGV2Tm8pOworCWlmICghZGV2KSB7CisJCUxPR0VSUigiJXMgYnVzTm89JWQsIGRldk5vPSVkIiwgX19mdW5jX18sIChpbnQpIChidXNObyksCisJCSAgICAgICAoaW50KSAoZGV2Tm8pKTsKKwkJcmV0dXJuOworCX0KKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJbGlzdF9kZWwoJmRldi0+bGlzdF9wb2xsaW5nX2RldmljZV9jaGFubmVscyk7CisJZGV2LT5wb2xsaW5nID0gRkFMU0U7CisJZGV2LT5pbnRlcnJ1cHQgPSBOVUxMOworCVVOTE9DS1NFTSgmTG9ja19Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMpOworCitzdGF0aWMgdm9pZAorZG9fd2FrZXVwX3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCit7CisJaWYgKCFHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscykgeworCQlHb19Qb2xsaW5nX0RldmljZV9DaGFubmVscyA9IDE7CisJCXdha2VfdXAoJldha2V1cF9Qb2xsaW5nX0RldmljZV9DaGFubmVscyk7CisJfQorfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKFdvcmtfd2FrZXVwX3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzLAorCQkgICAgZG9fd2FrZXVwX3BvbGxpbmdfZGV2aWNlX2NoYW5uZWxzKTsKKworLyogIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHlvdSB3YW50IHRvIHNlbmQgYSBoaW50IHRvIFByb2Nlc3NfSW5jb21pbmcoKSB0aGF0CisgKiAgeW91ciBkZXZpY2UgbWlnaHQgaGF2ZSBtb3JlIHJlcXVlc3RzLgorICovCit2b2lkCit1aXNsaWJfZm9yY2VfY2hhbm5lbF9pbnRlcnJ1cHQoVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJaWYgKGVuX3NtYXJ0X3dha2V1cCA9PSAwKQorCQlyZXR1cm47CisJaWYgKEdvX1BvbGxpbmdfRGV2aWNlX0NoYW5uZWxzKQorCQlyZXR1cm47CisJLyogVGhlIHBvaW50IG9mIHVzaW5nIHNjaGVkdWxlX3dvcmsoKSBpbnN0ZWFkIG9mIGp1c3QgZG9pbmcKKwkgKiB0aGUgd29yayBpbmxpbmUgaXMgdG8gZm9yY2UgYSBzbGlnaHQgZGVsYXkgYmVmb3JlIHdha2luZyB1cAorCSAqIHRoZSBQcm9jZXNzX0luY29taW5nKCkgdGhyZWFkLgorCSAqLworCXRvdF93YWtldXBfY250Kys7CisJc2NoZWR1bGVfd29yaygmV29ya193YWtldXBfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzbGliX2ZvcmNlX2NoYW5uZWxfaW50ZXJydXB0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIEluaXQgJiBFeGl0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdAordWlzbGliX21vZF9pbml0KHZvaWQpCit7CisKKwlMT0dJTkYoIk1PTklUT1JBUElTIik7CisKKwlMT0dJTkYoInNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKTolbHUgYnl0ZXNcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3ApKTsKKwlMT0dJTkYoInNpemVvZihzdHJ1Y3QgcGh5c19pbmZvKTolbHVcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKHN0cnVjdCBwaHlzX2luZm8pKTsKKwlMT0dJTkYoInNpemVvZih1aXNjbWRyc3Bfc2NzaSk6JWx1XG4iLAorCSAgICAgICAodWxvbmcpIHNpemVvZihzdHJ1Y3QgdWlzY21kcnNwX3Njc2kpKTsKKwlMT0dJTkYoInNpemVvZih1aXNjbWRyc3BfbmV0KTolbHVcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKHN0cnVjdCB1aXNjbWRyc3BfbmV0KSk7CisJTE9HSU5GKCJzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpOiVsdSBieXRlc1xuIiwKKwkgICAgICAgKHVsb25nKSBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpKTsKKwlMT0dJTkYoInNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCk6JWx1IGJ5dGVzXG4iLAorCSAgICAgICAodWxvbmcpIHNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCkpOworCUxPR0lORigic2l6ZW9mKENIQU5ORUxfSEVBREVSKTolbHUgYnl0ZXNcbiIsCisJICAgICAgICh1bG9uZykgc2l6ZW9mKENIQU5ORUxfSEVBREVSKSk7CisJTE9HSU5GKCJzaXplb2YoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCk6JWx1IGJ5dGVzXG4iLAorCSAgICAgICAodWxvbmcpIHNpemVvZihVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MKSk7CisJTE9HSU5GKCJTSVpFT0ZfQ01EUlNQOiVsdSBieXRlc1xuIiwgU0laRU9GX0NNRFJTUCk7CisJTE9HSU5GKCJTSVpFT0ZfUFJPVE9DT0w6JWx1IGJ5dGVzXG4iLCBTSVpFT0ZfUFJPVE9DT0wpOworCisJLyogaW5pdGlhbGl6ZSBnbG9iYWwgcG9pbnRlcnMgdG8gTlVMTCAqLworCUJ1c0xpc3RIZWFkID0gTlVMTDsKKwlCdXNMaXN0Q291bnQgPSBNYXhCdXNDb3VudCA9IDA7CisJcndsb2NrX2luaXQoJkJ1c0xpc3RMb2NrKTsKKwlWaXJ0Q29udHJvbENoYW5GdW5jID0gTlVMTDsKKworCS8qIElzc3VlIFZNQ0FMTF9HRVRfQ09OVFJPTFZNX0FERFIgdG8gZ2V0IEN0cmxDaGFuUGh5c0FkZHIgYW5kCisJICogdGhlbiBtYXAgdGhpcyBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgdmlydHVhbCBhZGRyZXNzLiAqLworCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCS8qIGNyZWF0ZSB0aGUgcHJvYyBlbnRyaWVzIGZvciB0aGUgY2hhbm5lbHMgKi8KKwl1aXNsaWJfcHJvY19kaXIgPSBwcm9jX21rZGlyKERJUl9QUk9DX0VOVFJZLCBOVUxMKTsKKwkvKiAoZS5nLiwgZm9yIC9wcm9jL3Vpc2xpYi92YnVzLzx4Pi9pbmZvKSAqLworCXVpc2xpYl9wcm9jX3ZidXNfZGlyID0gcHJvY19ta2RpcihESVJfVkJVU19QUk9DX0VOVFJZLCB1aXNsaWJfcHJvY19kaXIpOworCisJdm5pY19wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoVk5JQ19QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkJICAgICAgJnByb2Nfdm5pY19mb3BzKTsKKwlTRVRfUFJPQ19PV05FUih2bmljX3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCS8qIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHksIGNyZWF0ZSB0aGUgcHJvYyBlbnRyaWVzIGZvcgorCSAqIGVucXVldWluZyBDb250cm9sIENoYW5uZWwgbWVzc2FnZXMgKi8KKwljaGlwc2V0X3Byb2NfZW50cnkgPQorCSAgICBwcm9jX2NyZWF0ZShDSElQU0VUX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCSZwcm9jX2NoaXBzZXRfZm9wcyk7CisJU0VUX1BST0NfT1dORVIoY2hpcHNldF9wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKwlpbmZvX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShJTkZPX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCQkgICAgICAmcHJvY19pbmZvX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKGluZm9fcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJcGxhdGZvcm1udW1iZXJfcHJvY19lbnRyeSA9CisJICAgIHByb2NfY3JlYXRlKFBMQVRGT1JNTlVNQkVSX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCSZwcm9jX3BsYXRmb3JtbnVtYmVyX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKHBsYXRmb3JtbnVtYmVyaW5mb19wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKwljeWNsZXNfYmVmb3JlX3dhaXRfcHJvY19lbnRyeSA9CisJICAgIHByb2NfY3JlYXRlKENZQ0xFU19CRUZPUkVfV0FJVF9QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkmcHJvY19jeWNsZXNfYmVmb3JlX3dhaXRfZm9wcyk7CisJU0VUX1BST0NfT1dORVIoY3ljbGVzX2JlZm9yZV93YWl0X3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCXJlc2V0X2NvdW50c19wcm9jX2VudHJ5ID0KKwkgICAgcHJvY19jcmVhdGUoUkVTRVRfQ09VTlRTX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCSZwcm9jX3Jlc2V0X2NvdW50c19mb3BzKTsKKwlTRVRfUFJPQ19PV05FUihyZXNldF9jb3VudHNfcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJc21hcnRfd2FrZXVwX3Byb2NfZW50cnkgPQorCSAgICBwcm9jX2NyZWF0ZShTTUFSVF9XQUtFVVBfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJJnByb2Nfc21hcnRfd2FrZXVwX2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKHNtYXJ0X3dha2V1cF9wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisKKyNpZmRlZiBVSVNMSUJfVEVTVF9QUk9DCisJdGVzdF9wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoVEVTVF9QUk9DX0VOVFJZX0ZOLCAwLCB1aXNsaWJfcHJvY19kaXIsCisJCQkJICAgICAgJnByb2NfdGVzdF9mb3BzKTsKKwlTRVRfUFJPQ19PV05FUih0ZXN0X3Byb2NfZW50cnksIFRISVNfTU9EVUxFKTsKKworCWJ1c19wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoQlVTX1BST0NfRU5UUllfRk4sIDAsIHVpc2xpYl9wcm9jX2RpciwKKwkJCQkgICAgICZwcm9jX2J1c19mb3BzKTsKKwlTRVRfUFJPQ19PV05FUihidXNfcHJvY19lbnRyeSwgVEhJU19NT0RVTEUpOworCisJZGV2X3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShERVZfUFJPQ19FTlRSWV9GTiwgMCwgdWlzbGliX3Byb2NfZGlyLAorCQkJCSAgICAgJnByb2NfZGV2X2ZvcHMpOworCVNFVF9QUk9DX09XTkVSKGRldl9wcm9jX2VudHJ5LCBUSElTX01PRFVMRSk7CisjZW5kaWYJCQkJLyogVUlTTElCX1RFU1RfUFJPQyAqLworCVBPU1RDT0RFX0xJTlVYXzMoRFJJVkVSX0VYSVRfUEMsIDAsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3Vpc2xpYl9tb2RfZXhpdCh2b2lkKQoreworCWlmIChkaXNhYmxlX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERJU0FCTEVfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoY3ljbGVzX2JlZm9yZV93YWl0X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KENZQ0xFU19CRUZPUkVfV0FJVF9QUk9DX0VOVFJZX0ZOLAorCQkJCSAgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAocmVzZXRfY291bnRzX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFJFU0VUX0NPVU5UU19QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChzbWFydF93YWtldXBfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoU01BUlRfV0FLRVVQX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKGN0cmxjaGFuX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KENUUkxDSEFOX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKHBtZW1fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUE1FTV9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChpbmZvX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KElORk9fUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoc3dpdGNoX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFNXSVRDSF9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmIChleHRwb3J0X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KEVYVFBPUlRfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAocGxhdGZvcm1udW1iZXJfcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUExBVEZPUk1OVU1CRVJfUFJPQ19FTlRSWV9GTiwKKwkJCQkgIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKGJ1c19wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShCVVNfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoZGV2X3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERFVl9QUk9DX0VOVFJZX0ZOLCB1aXNsaWJfcHJvY19kaXIpOworCWlmICh2bmljX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFZOSUNfUFJPQ19FTlRSWV9GTiwgdWlzbGliX3Byb2NfZGlyKTsKKwlpZiAoY2hpcHNldF9wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShDSElQU0VUX1BST0NfRU5UUllfRk4sIHVpc2xpYl9wcm9jX2Rpcik7CisJaWYgKHVpc2xpYl9wcm9jX3ZidXNfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShESVJfVkJVU19QUk9DX0VOVFJZLCB1aXNsaWJfcHJvY19kaXIpOworCWlmICh1aXNsaWJfcHJvY19kaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KERJUl9QUk9DX0VOVFJZLCBOVUxMKTsKKworCWlmIChQcm9jUmVhZEJ1ZmZlcikgeworCQl2ZnJlZShQcm9jUmVhZEJ1ZmZlcik7CisJCVByb2NSZWFkQnVmZmVyID0gTlVMTDsKKwl9CisKKwlEQkdJTkYoImdvb2RieWUuXG4iKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KHVpc2xpYl9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdCh1aXNsaWJfbW9kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJVc2hhIFNyaW5pdmFzYW4iKTsKK01PRFVMRV9BTElBUygidWlzbGliIik7CisgIC8qIHRoaXMgaXMgZXh0cmFjdGVkIGR1cmluZyBkZXBtb2QgYW5kIGtlcHQgaW4gbW9kdWxlcy5kZXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3F1ZXVlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTk4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKiB1aXNxdWV1ZS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiBAQUxMX0lOU1BFQ1RFRCAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKworI2luY2x1ZGUgImNoYW5zdHViLmgiCisKKy8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFVJU0xJQl9QQ191aXNxdWV1ZV9jCisjZGVmaW5lIF9fTVlGSUxFX18gInVpc3F1ZXVlLmMiCisKKyNkZWZpbmUgQ0hFQ0tfQ0FDSEVfQUxJR04gMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBsb25nIGxvbmcKK3Vpc3F1ZXVlX0ludGVybG9ja2VkT3IodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBTZXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBsb25nIGo7CisKKwlqID0gcmVhZHEoVGFyZ2V0KTsKKwlkbyB7CisJCWkgPSBqOworCQlqID0gdWlzbGliY21weGNoZzY0KChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZyAqKVRhcmdldCwKKwkJCQkgICAgaSwgaSB8IFNldCwgc2l6ZW9mKCooVGFyZ2V0KSkpOworCisJfSB3aGlsZSAoaSAhPSBqKTsKKworCXJldHVybiBqOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzcXVldWVfSW50ZXJsb2NrZWRPcik7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZwordWlzcXVldWVfSW50ZXJsb2NrZWRBbmQodW5zaWduZWQgbG9uZyBsb25nIF9faW9tZW0gKlRhcmdldCwKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBTZXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBsb25nIGo7CisKKwlqID0gcmVhZHEoVGFyZ2V0KTsKKwlkbyB7CisJCWkgPSBqOworCQlqID0gdWlzbGliY21weGNoZzY0KChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZyAqKVRhcmdldCwKKwkJCQkgICAgaSwgaSAmIFNldCwgc2l6ZW9mKCooVGFyZ2V0KSkpOworCisJfSB3aGlsZSAoaSAhPSBqKTsKKworCXJldHVybiBqOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzcXVldWVfSW50ZXJsb2NrZWRBbmQpOworCitzdGF0aWMgVTgKK2RvX2xvY2tlZF9jbGllbnRfaW5zZXJ0KHN0cnVjdCB1aXNxdWV1ZV9pbmZvICpxdWV1ZWluZm8sCisJCQl1bnNpZ25lZCBpbnQgd2hpY2hxdWV1ZSwKKwkJCXZvaWQgKnBTaWduYWwsCisJCQlzcGlubG9ja190ICpsb2NrLAorCQkJdW5zaWduZWQgY2hhciBpc3N1ZUludGVycnVwdElmRW1wdHksCisJCQlVNjQgaW50ZXJydXB0SGFuZGxlLCBVOCAqY2hhbm5lbElkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBxdWV1ZVdhc0VtcHR5OworCXVuc2lnbmVkIGludCBsb2NrZWQgPSAwOworCXVuc2lnbmVkIGludCBhY3F1aXJlZCA9IDA7CisJVTggcmMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOworCWxvY2tlZCA9IDE7CisKKwlpZiAoIVVMVFJBX0NIQU5ORUxfQ0xJRU5UX0FDUVVJUkVfT1MocXVldWVpbmZvLT5jaGFuLCBjaGFubmVsSWQsIE5VTEwpKQorCQlnb3RvIEF3YXk7CisKKwlhY3F1aXJlZCA9IDE7CisKKwlxdWV1ZVdhc0VtcHR5ID0gdmlzb3Jfc2lnbmFscXVldWVfZW1wdHkocXVldWVpbmZvLT5jaGFuLCB3aGljaHF1ZXVlKTsKKwlpZiAoIXZpc29yX3NpZ25hbF9pbnNlcnQocXVldWVpbmZvLT5jaGFuLCB3aGljaHF1ZXVlLCBwU2lnbmFsKSkKKwkJZ290byBBd2F5OworCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1JFTEVBU0VfT1MocXVldWVpbmZvLT5jaGFuLCBjaGFubmVsSWQsIE5VTEwpOworCWFjcXVpcmVkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKKwlsb2NrZWQgPSAwOworCisJcXVldWVpbmZvLT5wYWNrZXRzX3NlbnQrKzsKKworCXJjID0gMTsKK0F3YXk6CisJaWYgKGFjcXVpcmVkKSB7CisJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1JFTEVBU0VfT1MocXVldWVpbmZvLT5jaGFuLCBjaGFubmVsSWQsCisJCQkJCQlOVUxMKTsKKwkJYWNxdWlyZWQgPSAwOworCX0KKwlpZiAobG9ja2VkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikgbG9jaywgZmxhZ3MpOworCQlsb2NrZWQgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworaW50Cit1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbywKKwkJCQkgICAgIHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB3aGljaHF1ZXVlLAorCQkJCSAgICAgdm9pZCAqaW5zZXJ0bG9jaywKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgaXNzdWVJbnRlcnJ1cHRJZkVtcHR5LAorCQkJCSAgICAgVTY0IGludGVycnVwdEhhbmRsZSwKKwkJCQkgICAgIGNoYXIgb2t0b3dhaXQsIFU4ICpjaGFubmVsSWQpCit7CisJd2hpbGUgKCFkb19sb2NrZWRfY2xpZW50X2luc2VydChxdWV1ZWluZm8sIHdoaWNocXVldWUsIGNtZHJzcCwKKwkJCQkJKHNwaW5sb2NrX3QgKikgaW5zZXJ0bG9jaywKKwkJCQkJaXNzdWVJbnRlcnJ1cHRJZkVtcHR5LAorCQkJCQlpbnRlcnJ1cHRIYW5kbGUsIGNoYW5uZWxJZCkpIHsKKwkJaWYgKG9rdG93YWl0ICE9IE9LX1RPX1dBSVQpIHsKKwkJCUxPR0VSUigiKioqKkZBSUxFRCB2aXNvcl9zaWduYWxfaW5zZXJ0IGZhaWxlZDsgY2Fubm90IHdhaXQ7IGluc2VydCBhYm9ydGVkXG4iKTsKKwkJCXJldHVybiAwOwkvKiBmYWlsZWQgdG8gcXVldWUgKi8KKwkJfQorCQkvKiB0cnkgYWdhaW4gKi8KKwkJTE9HRVJSKCIqKioqRkFJTEVEIHZpc29yX3NpZ25hbF9pbnNlcnQgZmFpbGVkOyB3YWl0aW5nIHRvIHRyeSBhZ2FpblxuIik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcygxMCkpOworCX0KKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudCk7CisKKy8qIHVpc3F1ZXVlX2dldF9jbWRyc3AgZ2V0cyB0aGUgY21kcnNwIGVudHJ5IGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZQorICogcmV0dXJucyBOVUxMIGlmIHF1ZXVlIGlzIGVtcHR5ICovCitpbnQKK3Vpc3F1ZXVlX2dldF9jbWRyc3Aoc3RydWN0IHVpc3F1ZXVlX2luZm8gKnF1ZXVlaW5mbywKKwkJICAgIHZvaWQgKmNtZHJzcCwgdW5zaWduZWQgaW50IHdoaWNocXVldWUpCit7CisJaWYgKCF2aXNvcl9zaWduYWxfcmVtb3ZlKHF1ZXVlaW5mby0+Y2hhbiwgd2hpY2hxdWV1ZSwgY21kcnNwKSkKKwkJcmV0dXJuIDA7CisKKwlxdWV1ZWluZm8tPnBhY2tldHNfcmVjZWl2ZWQrKzsKKworCXJldHVybiAxOwkJLyogU3VjY2VzcyAqLworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzcXVldWVfZ2V0X2NtZHJzcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYwpAQCAtMCwwICsxLDg1IEBACisvKiB1aXN0aHJlYWQuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogQEFMTF9JTlNQRUNURUQgKi8KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInVpc3V0aWxzLmgiCisjaW5jbHVkZSAidWlzdGhyZWFkLmgiCisKKyNkZWZpbmUgS0lMTChhLCBiLCBjKSBraWxsX3BpZChmaW5kX3ZwaWQoYSksIGIsIGMpCisKKy8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMKKyAqLworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVUlTTElCX1BDX3Vpc3RocmVhZF9jCisjZGVmaW5lIF9fTVlGSUxFX18gInVpc3RocmVhZC5jIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHJldHVybnMgMCBmb3IgZmFpbHVyZSwgMSBmb3Igc3VjY2VzcyAqLworaW50Cit1aXN0aHJlYWRfc3RhcnQoc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvLAorCQlpbnQgKCp0aHJlYWRmbikodm9pZCAqKSwgdm9pZCAqdGhyY29udGV4dCwgY2hhciAqbmFtZSkKK3sKKwl0aHJpbmZvLT5zaG91bGRfc3RvcCA9IDA7CisJLyogdXNlZCB0byBzdG9wIHRoZSB0aHJlYWQgKi8KKwlpbml0X2NvbXBsZXRpb24oJnRocmluZm8tPmhhc19zdG9wcGVkKTsKKwl0aHJpbmZvLT50YXNrID0ga3RocmVhZF9jcmVhdGUodGhyZWFkZm4sIHRocmNvbnRleHQsIG5hbWUsIE5VTEwpOworCWlmIChJU19FUlIodGhyaW5mby0+dGFzaykpIHsKKwkJdGhyaW5mby0+aWQgPSAwOworCQlyZXR1cm4gMDsJLyogZmFpbHVyZSAqLworCX0KKwl0aHJpbmZvLT5pZCA9IHRocmluZm8tPnRhc2stPnBpZDsKKwl3YWtlX3VwX3Byb2Nlc3ModGhyaW5mby0+dGFzayk7CisJTE9HSU5GKCJzdGFydGVkIHRocmVhZCBwaWQ6JWRcbiIsIHRocmluZm8tPmlkKTsKKwlyZXR1cm4gMTsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzdGhyZWFkX3N0YXJ0KTsKKwordm9pZAordWlzdGhyZWFkX3N0b3Aoc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvKQoreworCWludCByZXQ7CisJaW50IHN0b3BwZWQgPSAwOworCWlmICh0aHJpbmZvLT5pZCA9PSAwKQorCQlyZXR1cm47CQkvKiB0aHJlYWQgbm90IHJ1bm5pbmcgKi8KKworCUxPR0lORigidWlzdGhyZWFkX3N0b3Agc3RvcHBpbmcgaWQ6JWRcbiIsIHRocmluZm8tPmlkKTsKKwl0aHJpbmZvLT5zaG91bGRfc3RvcCA9IDE7CisJcmV0ID0gS0lMTCh0aHJpbmZvLT5pZCwgU0lHSFVQLCAxKTsKKwlpZiAocmV0KSB7CisJCUxPR0VSUigidW5hYmxlIHRvIHNpZ25hbCB0aHJlYWQgJWRcbiIsIHJldCk7CisJfSBlbHNlIHsKKwkJLyogZ2l2ZSB1cCBpZiB0aGUgdGhyZWFkIGhhcyBOT1QgZGllZCBpbiAxIG1pbnV0ZSAqLworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0aHJpbmZvLT5oYXNfc3RvcHBlZCwgNjAgKiBIWikpCisJCQlzdG9wcGVkID0gMTsKKwkJZWxzZQorCQkJTE9HRVJSKCJ0aW1lZCBvdXQgdHJ5aW5nIHRvIHNpZ25hbCB0aHJlYWRcbiIpOworCX0KKwlpZiAoc3RvcHBlZCkgeworCQlMT0dJTkYoInVpc3RocmVhZF9zdG9wIHN0b3BwZWQgaWQ6JWRcbiIsIHRocmluZm8tPmlkKTsKKwkJdGhyaW5mby0+aWQgPSAwOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc3RocmVhZF9zdG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3V0aWxzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNzhmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jCkBAIC0wLDAgKzEsMzUwIEBACisvKiB1aXN1dGlscy5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGNvbW1vbnR5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInVpc3V0aWxzLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgInZidXNoZWxwZXIuaCIKKyNpbmNsdWRlICJndWlkdXRpbHMuaCIKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpZmRlZiBDT05GSUdfSElHSE1FTQorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNlbmRpZgorCisvKiB0aGlzIGlzIHNob3J0ZXIgdGhhbiB1c2luZyBfX0ZJTEVfXyAoZnVsbCBwYXRoIG5hbWUpIGluCisgKiBkZWJ1Zy9pbmZvL2Vycm9yIG1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFVJU0xJQl9QQ191aXN1dGlsc19jCisjZGVmaW5lIF9fTVlGSUxFX18gInVpc3V0aWxzLmMiCisKKy8qIGV4cG9ydHMgKi8KK2F0b21pY190IFVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMgPSBBVE9NSUNfSU5JVCgwKTsKKwkJCQkJLyogbnVtIHJlZ2lzdHJhdGlvbnMgdmlhCisJCQkJCSAqIHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIoKSBvcgorCQkJCQkgKiB1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KCkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAordWlzdXRpbF9hZGRfcHJvY19saW5lX2V4KGludCAqdG90YWwsIGNoYXIgKipidWZmZXIsIGludCAqYnVmZmVyX3JlbWFpbmluZywKKwkJICAgICAgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisKKwlEQkdJTkYoImJ1ZmZlciA9IDB4JXAgOiAqYnVmZmVyID0gMHglcC5cbiIsIGJ1ZmZlciwgKmJ1ZmZlcik7CisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlsZW4gPSB2c25wcmludGYoKmJ1ZmZlciwgKmJ1ZmZlcl9yZW1haW5pbmcsIGZvcm1hdCwgYXJncyk7CisJaWYgKGxlbiA+PSAqYnVmZmVyX3JlbWFpbmluZykgeworCQkqYnVmZmVyICs9ICpidWZmZXJfcmVtYWluaW5nOworCQkqdG90YWwgKz0gKmJ1ZmZlcl9yZW1haW5pbmc7CisJCSpidWZmZXJfcmVtYWluaW5nID0gMDsKKwkJTE9HRVJSKCJieXRlcyByZW1haW5pbmcgaXMgdG9vIHNtYWxsIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJKmJ1ZmZlcl9yZW1haW5pbmcgLT0gbGVuOworCSpidWZmZXIgKz0gbGVuOworCSp0b3RhbCArPSBsZW47CisJcmV0dXJuIGxlbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc3V0aWxfYWRkX3Byb2NfbGluZV9leCk7CisKK2ludAordWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcihpbnQgdHlwZSwgdm9pZCAqZnB0ciwKKwkJCSAgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpjaGlwc2V0X0RyaXZlckluZm8pCit7CisJTE9HSU5GKCJ0eXBlID0gJWQsIGZwdHIgPSAweCVwLlxuIiwgdHlwZSwgZnB0cik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDI6CisJCWlmIChmcHRyKSB7CisJCQlpZiAoIVZpcnRDb250cm9sQ2hhbkZ1bmMpCisJCQkJYXRvbWljX2luYygmVWlzVXRpbHNfUmVnaXN0ZXJlZF9TZXJ2aWNlcyk7CisJCQlWaXJ0Q29udHJvbENoYW5GdW5jID0gZnB0cjsKKwkJfSBlbHNlIHsKKwkJCWlmIChWaXJ0Q29udHJvbENoYW5GdW5jKQorCQkJCWF0b21pY19kZWMoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpOworCQkJVmlydENvbnRyb2xDaGFuRnVuYyA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlMT0dFUlIoImludmFsaWQgdHlwZSAlZC5cbiIsIHR5cGUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNoaXBzZXRfRHJpdmVySW5mbykKKwkJQnVzRGV2aWNlSW5mb19Jbml0KGNoaXBzZXRfRHJpdmVySW5mbywKKwkJCQkgICAiY2hpcHNldCIsICJ1aXNsaWIiLAorCQkJCSAgIFZFUlNJT04sIE5VTEwsIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIpOworCitpbnQKK3Vpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkJCQljb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAorCQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKKwkJCQl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAorCQkJCWludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nCisJCQkJCQkJICBjaGFubmVsQnl0ZXMpLAorCQkJCWludCAoKlNlcnZlcl9DaGFubmVsX0luaXQpCisJCQkJICh2b2lkICp4LCB1bnNpZ25lZCBjaGFyICpjbGllbnRTdHIsCisJCQkJICBVMzIgY2xpZW50U3RyTGVuLCBVNjQgYnl0ZXMpLAorCQkJCVVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqY2hpcHNldF9Ecml2ZXJJbmZvKQoreworCWNoYXIgc1s5OV07CisJUmVxSGFuZGxlckluZm9fdCAqcFJlcUhhbmRsZXJJbmZvOworCWludCByYyA9IDA7CQkvKiBhc3N1bWUgZmFpbHVyZSAqLworCUxPR0lORigidHlwZT0lcywgY29udHJvbGZ1bmM9MHglcC5cbiIsCisJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpLCBjb250cm9sZnVuYyk7CisJaWYgKCFjb250cm9sZnVuYykgeworCQlMT0dFUlIoIiVzOiBjb250cm9sZnVuYyBtdXN0IGJlIHN1cHBsaWVkXG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCWlmICghU2VydmVyX0NoYW5uZWxfT2spIHsKKwkJTE9HRVJSKCIlczogU2VydmVyX0NoYW5uZWxfT2sgbXVzdCBiZSBzdXBwbGllZFxuIiwKKwkJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoIVNlcnZlcl9DaGFubmVsX0luaXQpIHsKKwkJTE9HRVJSKCIlczogU2VydmVyX0NoYW5uZWxfSW5pdCBtdXN0IGJlIHN1cHBsaWVkXG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCXBSZXFIYW5kbGVySW5mbyA9IFJlcUhhbmRsZXJBZGQoc3dpdGNoVHlwZUd1aWQsCisJCQkJCXN3aXRjaF90eXBlX25hbWUsCisJCQkJCWNvbnRyb2xmdW5jLAorCQkJCQltaW5fY2hhbm5lbF9ieXRlcywKKwkJCQkJU2VydmVyX0NoYW5uZWxfT2ssIFNlcnZlcl9DaGFubmVsX0luaXQpOworCWlmICghcFJlcUhhbmRsZXJJbmZvKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGFkZCAlcyB0byBzZXJ2ZXIgbGlzdFxuIiwKKwkJICAgICAgIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKwkJZ290byBBd2F5OworCX0KKworCWF0b21pY19pbmMoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpOworCXJjID0gMTsJCQkvKiBzdWNjZXNzICovCitBd2F5OgorCWlmIChyYykgeworCQlpZiAoY2hpcHNldF9Ecml2ZXJJbmZvKQorCQkJQnVzRGV2aWNlSW5mb19Jbml0KGNoaXBzZXRfRHJpdmVySW5mbywKKwkJCQkJICAgImNoaXBzZXQiLCAidWlzbGliIiwKKwkJCQkJICAgVkVSU0lPTiwgTlVMTCwKKwkJCQkJICAgX19EQVRFX18sIF9fVElNRV9fKTsKKwl9IGVsc2UKKwkJTE9HRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgdHlwZSAlcy5cbiIsCisJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKKworaW50Cit1aXNjdHJsX3VucmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgoR1VJRCBzd2l0Y2hUeXBlR3VpZCkKK3sKKwljaGFyIHNbOTldOworCWludCByYyA9IDA7CQkvKiBhc3N1bWUgZmFpbHVyZSAqLworCUxPR0lORigidHlwZT0lcy5cbiIsIEdVSURfZm9ybWF0MSgmc3dpdGNoVHlwZUd1aWQsIHMpKTsKKwlpZiAoUmVxSGFuZGxlckRlbChzd2l0Y2hUeXBlR3VpZCkgPCAwKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIHJlbW92ZSAlcyBmcm9tIHNlcnZlciBsaXN0XG4iLAorCQkgICAgICAgR1VJRF9mb3JtYXQxKCZzd2l0Y2hUeXBlR3VpZCwgcykpOworCQlnb3RvIEF3YXk7CisJfQorCWF0b21pY19kZWMoJlVpc1V0aWxzX1JlZ2lzdGVyZWRfU2VydmljZXMpOworCXJjID0gMTsJCQkvKiBzdWNjZXNzICovCitBd2F5OgorCWlmICghcmMpCisJCUxPR0VSUigiZmFpbGVkIHRvIHVucmVnaXN0ZXIgdHlwZSAlcy5cbiIsCisJCSAgICAgICBHVUlEX2Zvcm1hdDEoJnN3aXRjaFR5cGVHdWlkLCBzKSk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKKworLyoKKyAqIHVuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAorICoJCQkJCSAgICAgdm9pZCAqc2tiX2luLAorICoJCQkJCSAgICAgdW5zaWduZWQgaW50IGZpcnN0ZnJhZ2xlbiwKKyAqCQkJCQkgICAgIHVuc2lnbmVkIGludCBmcmFnc19tYXgsCisgKgkJCQkJICAgICBzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pCisgKgorICoJY2FsbGluZ19jdHggLSBpbnB1dCAtICAgYSBzdHJpbmcgdGhhdCBpcyBkaXNwbGF5ZWQgdG8gc2hvdworICoJCQkJd2hvIGNhbGxlZCAqIHRoaXMgZnVuYworICoJdm9pZCAqc2tiX2luIC0gIHNrYiB3aG9zZSBmcmFnIGluZm8gd2UncmUgY29weWluZyB0eXBlIGlzIGhpZGRlbiBzbyB3ZQorICoJCQlkb24ndCBuZWVkIHRvIGluY2x1ZGUgc2tiYnVmZiBpbiB1aXN1dGlscy5oIHdoaWNoIGlzCisgKgkJCWluY2x1ZGVkIGluIG5vbi1uZXR3b3JraW5nIGNvZGUuCisgKgl1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuIC0gaW5wdXQgLSBsZW5ndGggb2YgZmlyc3QgZnJhZ21lbnQgaW4gc2tiCisgKgl1bnNpZ25lZCBpbnQgZnJhZ3NfbWF4IC0gaW5wdXQgLSBtYXggbGVuIG9mIGZyYWdzIGFycmF5CisgKglzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10gLSBvdXRwdXQgLSBmcmFncyBhcnJheSBmaWxsZWQgaW4gb24gb3V0cHV0CisgKgkJCQkJICAgIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgbnVtYmVyIG9mCisgKgkJCQkJICAgIGVudHJpZXMgZmlsbGVkIGluIGZyYWdzCisgKi8KK3Vuc2lnbmVkIGludAordWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYih1bnNpZ25lZCBjaGFyICpjYWxsaW5nX2N0eCwgdm9pZCAqc2tiX2luLAorCQkJCXVuc2lnbmVkIGludCBmaXJzdGZyYWdsZW4sCisJCQkJdW5zaWduZWQgaW50IGZyYWdzX21heCwKKwkJCQlzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgaWksIHNpemUsIG9mZnNldCA9IDAsIG51bWZyYWdzOworCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfaW47CisKKwludW1mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwl3aGlsZSAoZmlyc3RmcmFnbGVuKSB7CisJCWlmIChjb3VudCA9PSBmcmFnc19tYXgpIHsKKwkJCUxPR0VSUigiJXMgZnJhZ3MgYXJyYXkgdG9vIHNtYWxsOiBtYXg6JWQgY291bnQ6JWRcbiIsCisJCQkgICAgICAgY2FsbGluZ19jdHgsIGZyYWdzX21heCwgY291bnQpOworCQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCisJCX0KKwkJZnJhZ3NbY291bnRdLnBpX3BmbiA9CisJCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhICsgb2Zmc2V0KSk7CisJCWZyYWdzW2NvdW50XS5waV9vZmYgPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpIChza2ItPmRhdGEgKyBvZmZzZXQpICYgUElfUEFHRV9NQVNLOworCQlzaXplID0KKwkJICAgIG1pbihmaXJzdGZyYWdsZW4sCisJCQkodW5zaWduZWQgaW50KSAoUElfUEFHRV9TSVpFIC0gZnJhZ3NbY291bnRdLnBpX29mZikpOworCQkvKiBjYW4gdGFrZSBzbWFsbGVzdCBvZiBmaXJzdGZyYWdsZW4od2hhdCdzIGxlZnQpIE9SCisJCSogYnl0ZXMgbGVmdCBpbiB0aGUgcGFnZQorCQkqLworCQlmcmFnc1tjb3VudF0ucGlfbGVuID0gc2l6ZTsKKwkJZmlyc3RmcmFnbGVuIC09IHNpemU7CisJCW9mZnNldCArPSBzaXplOworCQljb3VudCsrOworCX0KKwlpZiAobnVtZnJhZ3MpIHsKKwkJaWYgKChjb3VudCArIG51bWZyYWdzKSA+IGZyYWdzX21heCkgeworCQkJTE9HRVJSKCIqKioqIEZBSUxFRCAlcyBmcmFncyBhcnJheSB0b28gc21hbGw6IG1heDolZCBjb3VudCtucl9mcmFnczolZFxuIiwKKwkJCSAgICAgY2FsbGluZ19jdHgsIGZyYWdzX21heCwgY291bnQgKyBudW1mcmFncyk7CisJCQlyZXR1cm4gLTE7CS8qIGZhaWx1cmUgKi8KKwkJfQorCisJCWZvciAoaWkgPSAwOyBpaSA8IG51bWZyYWdzOyBpaSsrKSB7CisJCQljb3VudCA9IGFkZF9waHlzaW5mb19lbnRyaWVzKHBhZ2VfdG9fcGZuKHNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldKSksCS8qIHBmbiAqLworCQkJCQkJICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2lpXS4KKwkJCQkJCSAgICAgcGFnZV9vZmZzZXQsCisJCQkJCQkgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldLgorCQkJCQkJICAgICBzaXplLCBjb3VudCwgZnJhZ3NfbWF4LAorCQkJCQkJICAgICBmcmFncyk7CisJCQlpZiAoY291bnQgPT0gMCkgeworCQkJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gYWRkIHBoeXNpbmZvIGVudHJpZXNcbiIpOworCQkJCXJldHVybiAtMTsJLyogZmFpbHVyZSAqLworCQkJfQorCQl9CisJfQorCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiaW5saXN0OworCQlpbnQgYzsKKwkJZm9yIChza2Jpbmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsgc2tiaW5saXN0OworCQkgICAgIHNrYmlubGlzdCA9IHNrYmlubGlzdC0+bmV4dCkgeworCisJCQljID0gdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYigicmVjdXJzaXZlIiwKKwkJCQkJCQkgICAgc2tiaW5saXN0LAorCQkJCQkJCSAgICBza2Jpbmxpc3QtPmxlbiAtCisJCQkJCQkJICAgIHNrYmlubGlzdC0+ZGF0YV9sZW4sCisJCQkJCQkJICAgIGZyYWdzX21heCAtIGNvdW50LAorCQkJCQkJCSAgICAmZnJhZ3NbY291bnRdKTsKKwkJCWlmIChjID09IC0xKSB7CisJCQkJTE9HRVJSKCIqKioqIEZBSUxFRCByZWN1cnNpdmUgY2FsbCBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvdW50ICs9IGM7CisJCX0KKwl9CisJcmV0dXJuIGNvdW50OworfQorRVhQT1JUX1NZTUJPTF9HUEwodWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYik7CisKK3N0YXRpYyBMSVNUX0hFQUQoUmVxSGFuZGxlckluZm9fbGlzdCk7CS8qIGxpc3Qgb2YgUmVxSGFuZGxlckluZm9fdCAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCitSZXFIYW5kbGVySW5mb190ICoKK1JlcUhhbmRsZXJBZGQoR1VJRCBzd2l0Y2hUeXBlR3VpZCwKKwkgICAgICBjb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAorCSAgICAgIGludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKKwkgICAgICB1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAorCSAgICAgIGludCAoKlNlcnZlcl9DaGFubmVsX09rKSh1bnNpZ25lZCBsb25nIGNoYW5uZWxCeXRlcyksCisJICAgICAgaW50ICgqU2VydmVyX0NoYW5uZWxfSW5pdCkKKwkgICAgICAgKHZvaWQgKngsIHVuc2lnbmVkIGNoYXIgKmNsaWVudFN0ciwgVTMyIGNsaWVudFN0ckxlbiwgVTY0IGJ5dGVzKSkKK3sKKwlSZXFIYW5kbGVySW5mb190ICpyYyA9IE5VTEw7CisKKwlyYyA9IGt6YWxsb2Moc2l6ZW9mKCpyYyksIEdGUF9BVE9NSUMpOworCWlmICghcmMpCisJCXJldHVybiBOVUxMOworCXJjLT5zd2l0Y2hUeXBlR3VpZCA9IHN3aXRjaFR5cGVHdWlkOworCXJjLT5jb250cm9sZnVuYyA9IGNvbnRyb2xmdW5jOworCXJjLT5taW5fY2hhbm5lbF9ieXRlcyA9IG1pbl9jaGFubmVsX2J5dGVzOworCXJjLT5TZXJ2ZXJfQ2hhbm5lbF9PayA9IFNlcnZlcl9DaGFubmVsX09rOworCXJjLT5TZXJ2ZXJfQ2hhbm5lbF9Jbml0ID0gU2VydmVyX0NoYW5uZWxfSW5pdDsKKwlpZiAoc3dpdGNoX3R5cGVfbmFtZSkKKwkJc3RybmNweShyYy0+c3dpdGNoX3R5cGVfbmFtZSwgc3dpdGNoX3R5cGVfbmFtZSwKKwkJCXNpemVvZihyYy0+c3dpdGNoX3R5cGVfbmFtZSkgLSAxKTsKKwlzcGluX2xvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmKHJjLT5saXN0X2xpbmspLCAmUmVxSGFuZGxlckluZm9fbGlzdCk7CisJc3Bpbl91bmxvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK1JlcUhhbmRsZXJJbmZvX3QgKgorUmVxSGFuZGxlckZpbmQoR1VJRCBzd2l0Y2hUeXBlR3VpZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsZWx0LCAqdG1wOworCVJlcUhhbmRsZXJJbmZvX3QgKmVudHJ5ID0gTlVMTDsKKwlzcGluX2xvY2soJlJlcUhhbmRsZXJJbmZvX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxlbHQsIHRtcCwgJlJlcUhhbmRsZXJJbmZvX2xpc3QpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGxlbHQsIFJlcUhhbmRsZXJJbmZvX3QsIGxpc3RfbGluayk7CisJCWlmIChtZW1jbXAKKwkJICAgICgmZW50cnktPnN3aXRjaFR5cGVHdWlkLCAmc3dpdGNoVHlwZUd1aWQsCisJCSAgICAgc2l6ZW9mKEdVSUQpKSA9PSAwKSB7CisJCQlzcGluX3VubG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmUmVxSGFuZGxlckluZm9fbGlzdF9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50CitSZXFIYW5kbGVyRGVsKEdVSUQgc3dpdGNoVHlwZUd1aWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGVsdCwgKnRtcDsKKwlSZXFIYW5kbGVySW5mb190ICplbnRyeSA9IE5VTEw7CisJaW50IHJjID0gLTE7CisJc3Bpbl9sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsZWx0LCB0bXAsICZSZXFIYW5kbGVySW5mb19saXN0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShsZWx0LCBSZXFIYW5kbGVySW5mb190LCBsaXN0X2xpbmspOworCQlpZiAobWVtY21wCisJCSAgICAoJmVudHJ5LT5zd2l0Y2hUeXBlR3VpZCwgJnN3aXRjaFR5cGVHdWlkLAorCQkgICAgIHNpemVvZihHVUlEKSkgPT0gMCkgeworCQkJbGlzdF9kZWwobGVsdCk7CisJCQlrZnJlZShlbnRyeSk7CisJCQlyYysrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZSZXFIYW5kbGVySW5mb19saXN0X2xvY2spOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNzk4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHZpcnRoYmEgY29uZmlndXJhdGlvbgorIworCitjb25maWcgVU5JU1lTX1ZJUlRIQkEKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpcnRoYmEgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIFVOSVNZU19DSEFOTkVMU1RVQiAmJiBVTklTWVNfVUlTTElCICYmIFVOSVNZU19WSVJUUENJICYmIFNDU0kKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpcnRoYmEgZHJpdmVyLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyYjFjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjCisjIE1ha2VmaWxlIGZvciBVbmlzeXMgdmlydGhiYQorIworCitvYmotJChDT05GSUdfVU5JU1lTX1ZJUlRIQkEpCSs9IHZpcnRoYmEubworCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3RpbXNrbW9kCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldAorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworCitjY2ZsYWdzLXkgKz0gLURDT05GSUdfU1BBUl9HVUVTVCAtREdVRVNURFJJVkVSQlVJTEQgLUROT0FVVE9WRVJTSU9OCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2IxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jCkBAIC0wLDAgKzEsMTgyMyBAQAorLyogdmlydGhiYS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKworLyogaWYgeW91IHdhbnQgdG8gdHVybiBvbiBzb21lIGRlYnVnZ2luZyBvZiB3cml0ZSBkZXZpY2UgZGF0YSBvciByZWFkCisgKiBkZXZpY2UgZGF0YSwgZGVmaW5lIHRoZXNlIHR3byB1bmRlZnMuICBZb3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvCisgKiBjdXN0b21pemUgdGhlIGNvZGUgd2hpY2ggaXMgaGVyZSBzaW5jZSBpdCB3YXMgd3JpdHRlbiBhc3N1bWluZworICogcmVhZGluZyBhbmQgd3JpdGluZyBhIHNwZWNpZmljIGRhdGEgZmlsZSBkZi42NE0udHh0IHdoaWNoIGlzIGEKKyAqIDY0TWVnYWJ5dGUgZmlsZSBjcmVhdGVkIGJ5IEFydCBOaWxzb24gdXNpbmcgYSBzY3JpdHAgSSB3cm90ZSBjYWxsZWQKKyAqIGNyX3Rlc3RfZGF0YS5wbC4gIFRoZSBkYXRhIGZpbGUgY29uc2lzdHMgb2YgMjU2IGJ5dGUgbGluZXMgb2YgdGV4dAorICogd2hpY2ggc3RhcnQgd2l0aCBhbiA4IGRpZ2l0IHNlcXVlbmNlIG51bWJlciwgYSBjb2xvbiwgYW5kIHRoZW4KKyAqIGxldHRlcnMgYWZ0ZXIgdGhhdCAqLworCisjdW5kZWYgREJHSU5GCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgInVpc3F1ZXVlLmgiCisjaW5jbHVkZSAidWlzdGhyZWFkLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgInZpcnRoYmEuaCIKKyNpbmNsdWRlICJ2aXJ0cGNpLmgiCisjaW5jbHVkZSAidmlzb3JjaGlwc2V0LmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgorLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdXNpbmcgX19GSUxFX18gKGZ1bGwgcGF0aCBuYW1lKSBpbgorICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcworICovCisjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVJUX0hCQV9QQ192aXJ0aGJhX2MKKyNkZWZpbmUgX19NWUZJTEVfXyAidmlydGhiYS5jIgorCisvKiBOT1RFOiAgTDFfQ0FDSEVfQllURVMgPj0xMjggKi8KKyNkZWZpbmUgREVWSUNFX0FUVFJJQlVURSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZpcnRoYmFfcHJvYmUoc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYsCisJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHZpcnRoYmFfcmVtb3ZlKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgdmlydGhiYV9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpOworc3RhdGljIGludCB2aXJ0aGJhX2J1c19yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpOworc3RhdGljIGludCB2aXJ0aGJhX2RldmljZV9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpOworc3RhdGljIGludCB2aXJ0aGJhX2hvc3RfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKTsKK3N0YXRpYyBjb25zdCBjaGFyICp2aXJ0aGJhX2dldF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCk7CitzdGF0aWMgaW50IHZpcnRoYmFfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOworc3RhdGljIGludCB2aXJ0aGJhX3F1ZXVlX2NvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQsCisJCQkJICAgICB2b2lkICgqdmlydGhiYV9jbW5kX2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCisjaWZkZWYgREVGX1NDU0lfUUNNRAorREVGX1NDU0lfUUNNRCh2aXJ0aGJhX3F1ZXVlX2NvbW1hbmQpCisjZWxzZQorI2RlZmluZSB2aXJ0aGJhX3F1ZXVlX2NvbW1hbmQgdmlydGhiYV9xdWV1ZV9jb21tYW5kX2xjaworI2VuZGlmCisKKworc3RhdGljIGludCB2aXJ0aGJhX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldik7CitzdGF0aWMgaW50IHZpcnRoYmFfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldik7CitzdGF0aWMgdm9pZCB2aXJ0aGJhX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19pbmNvbWluZ19yc3BzKHZvaWQgKik7CitzdGF0aWMgaW50IHZpcnRoYmFfc2VydmVydXAoc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2KTsKK3N0YXRpYyBpbnQgdmlydGhiYV9zZXJ2ZXJkb3duKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiwgdTMyIHN0YXRlKTsKK3N0YXRpYyB2b2lkIGRvRGlza0FkZFJlbW92ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgdmlydGhiYV9zZXJ2ZXJkb3duX2NvbXBsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3N0YXRpYyBzc2l6ZV90IGluZm9fcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIHNzaXplX3QgcnF3dV9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGVuYWJsZV9pbnRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgZW5hYmxlX2ludHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR2xvYmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHJzbHRxX3dhaXRfdXNlY3MgPSA0MDAwOwkvKiBEZWZhdWx0IDRtcyAqLworc3RhdGljIHVuc2lnbmVkIGludCBNYXhCdWZmTGVuOworCisvKiBNb2R1bGUgb3B0aW9ucyAqLworc3RhdGljIGNoYXIgKnZpcnRoYmFfb3B0aW9ucyA9ICJOT05FIjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpcnRoYmFfaWRfdGFibGVbXSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1VOSVNZUywgUENJX0RFVklDRV9JRF9WSVJUSEJBKX0sCisJezB9LAorfTsKKworLyogZXhwb3J0IHZpcnRoYmFfaWRfdGFibGUgKi8KK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aXJ0aGJhX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlOworCitzdGF0aWMgc3RydWN0IHZpcnRwY2lfZHJpdmVyIHZpcnRoYmFfZHJpdmVyID0geworCS5uYW1lID0gInVpc3ZpcnRoYmEiLAorCS52ZXJzaW9uID0gVkVSU0lPTiwKKwkudmVydGFnID0gTlVMTCwKKwkuYnVpbGRfZGF0ZSA9IF9fREFURV9fLAorCS5idWlsZF90aW1lID0gX19USU1FX18sCisJLmlkX3RhYmxlID0gdmlydGhiYV9pZF90YWJsZSwKKwkucHJvYmUgPSB2aXJ0aGJhX3Byb2JlLAorCS5yZW1vdmUgPSB2aXJ0aGJhX3JlbW92ZSwKKwkucmVzdW1lID0gdmlydGhiYV9zZXJ2ZXJ1cCwKKwkuc3VzcGVuZCA9IHZpcnRoYmFfc2VydmVyZG93bgorfTsKKworLyogVGhlIFNlbmQgYW5kIFJlY2l2ZSBCdWZmZXJzIG9mIHRoZSBJTyBRdWV1ZSBtYXkgYm90aCBiZSBmdWxsICovCisjZGVmaW5lIE1BWF9QRU5ESU5HX1JFUVVFU1RTIChNSU5fTlVNU0lHTkFMUyoyKQorI2RlZmluZSBJTlRFUlJVUFRfVkVDVE9SX01BU0sgMHgzRgorCitzdHJ1Y3Qgc2NzaXBlbmRpbmcgeworCWNoYXIgY21kdHlwZTsJCS8qIFR5cGUgb2YgcG9pbnRlciB0aGF0IGlzIGJlaW5nIHN0b3JlZCAqLworCXZvaWQgKnNlbnQ7CQkvKiBUaGUgRGF0YSBiZWluZyB0cmFja2VkICovCisJLyogc3RydWN0IHNjc2lfY21uZCAqdHlwZSBmb3IgdmlydGhiYV9xdWV1ZV9jb21tYW5kICovCisJLyogc3RydWN0IHVpc2NtZHJzcCAqdHlwZSBmb3IgbWFuYWdlbWVudCBjb21tYW5kcyAqLworfTsKKworI2RlZmluZSBWSVJUSEJBX0VSUk9SX0NPVU5UIDMwCisjZGVmaW5lIElPU19FUlJPUl9USFJFU0hPTEQgMTAwMAorc3RydWN0IHZpcnRkaXNrX2luZm8geworCVUzMiB2YWxpZDsKKwlVMzIgY2hhbm5lbCwgaWQsIGx1bjsJLyogRGlzayBQYXRoICovCisJYXRvbWljX3QgaW9zX3RocmVzaG9sZDsKKwlhdG9taWNfdCBlcnJvcl9jb3VudDsKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqbmV4dDsKK307CisvKiBFYWNoIFNjc2lfSG9zdCBoYXMgYSBob3N0X2RhdGEgYXJlYSB0aGF0IGNvbnRhaW5zIHRoaXMgc3RydWN0LiAqLworc3RydWN0IHZpcnRoYmFfaW5mbyB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3Q7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2luZm9fbGlzdDsKKwlzdHJ1Y3QgY2hhbmluZm8gY2hpbmZvOworCXN0cnVjdCBJbnRlcnJ1cHRJbmZvIGludHI7CS8qIHVzZSByZWN2SW50ZXJydXB0IGluZm8gdG8gcmVjZWl2ZQorCQkJCQkgICBpbnRlcnJ1cHRzIHdoZW4gSU9zIGNvbXBsZXRlICovCisJaW50IGludGVycnVwdF92ZWN0b3I7CisJc3RydWN0IHNjc2lwZW5kaW5nIHBlbmRpbmdbTUFYX1BFTkRJTkdfUkVRVUVTVFNdOyAvKiBUcmFja3MgdGhlIHJlcXVlc3RzCisJCQkJCQkJICAgICB0aGF0IGhhdmUgYmVlbiAqLworCS8qIGZvcndhcmRlZCB0byB0aGUgSU9WTSBhbmQgaGF2ZW4ndCByZXR1cm5lZCB5ZXQgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dGluc2VydDsJLyogU3RhcnQgc2VhcmNoIGZvciBuZXh0IHBlbmRpbmcKKwkJCQkJICAgZnJlZSBzbG90IGhlcmUgKi8KKwlzcGlubG9ja190IHByaXZsb2NrOworCWJvb2wgc2VydmVyZG93bjsKKwlib29sIHNlcnZlcmNoYW5naW5nc3RhdGU7CisJdW5zaWduZWQgbG9uZyBsb25nIGFjcXVpcmVfZmFpbGVkX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW50ZXJydXB0c19yY3ZkOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlcnJ1cHRzX25vdG1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlcnJ1cHRzX2Rpc2FibGVkOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXJ2ZXJkb3duX2NvbXBsZXRpb247CisJVTY0IF9faW9tZW0gKmZsYWdzX2FkZHI7CisJYXRvbWljX3QgaW50ZXJydXB0X3JjdmQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcnNwX3F1ZXVlOworCXN0cnVjdCB2aXJ0ZGlza19pbmZvIGhlYWQ7Cit9OworCisvKiBXb3JrIERhdGEgZm9yIERBUldvcmtRICovCitzdHJ1Y3QgZGlza2FkZHJlbW92ZSB7CisJVTggYWRkOwkJCS8qIDAtcmVtb3ZlLCAxLWFkZCAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OyAvKiBTY3NpIEhvc3QgZm9yIHRoaXMgdmlydGhiYSBpbnN0YW5jZSAqLworCVUzMiBjaGFubmVsLCBpZCwgbHVuOwkvKiBEaXNrIFBhdGggKi8KKwlzdHJ1Y3QgZGlza2FkZHJlbW92ZSAqbmV4dDsKK307CisKKyNkZWZpbmUgdmlydHBjaV9kZXZfdG9fdmlydGhiYV92aXJ0aGJhX2dldF9pbmZvKGQpIFwKKwljb250YWluZXJfb2YoZCwgc3RydWN0IHZpcnRoYmFfaW5mbywgdmlydHBjaWRldikKKworc3RhdGljIERFVklDRV9BVFRSSUJVVEUgKnZpcnRoYmFfc2hvc3RfYXR0cnNbXTsKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHZpcnRoYmFfZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lID0gIlVuaXN5cyBWaXJ0dWFsIEhCQSIsCisJLnByb2NfbmFtZSA9ICJ1aXN2aXJ0aGJhIiwKKwkuaW5mbyA9IHZpcnRoYmFfZ2V0X2luZm8sCisJLmlvY3RsID0gdmlydGhiYV9pb2N0bCwKKwkucXVldWVjb21tYW5kID0gdmlydGhiYV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0gdmlydGhiYV9hYm9ydF9oYW5kbGVyLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHZpcnRoYmFfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gdmlydGhiYV9idXNfcmVzZXRfaGFuZGxlciwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gdmlydGhiYV9ob3N0X3Jlc2V0X2hhbmRsZXIsCisJLnNob3N0X2F0dHJzID0gdmlydGhiYV9zaG9zdF9hdHRycywKKworI2RlZmluZSBWSVJUSEJBX01BWF9DTU5EUyAxMjgKKwkuY2FuX3F1ZXVlID0gVklSVEhCQV9NQVhfQ01ORFMsCisJLnNnX3RhYmxlc2l6ZSA9IDY0LAkvKiBsYXJnZXN0IG51bWJlciBvZiBhZGRyZXNzL2xlbmd0aCBwYWlycyAqLworCS50aGlzX2lkID0gLTEsCisJLnNsYXZlX2FsbG9jID0gdmlydGhiYV9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlID0gdmlydGhiYV9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kgPSB2aXJ0aGJhX3NsYXZlX2Rlc3Ryb3ksCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworCitzdHJ1Y3QgdmlydGhiYV9kZXZpY2VzX29wZW4geworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19pbmZvX2ZvcHMgPSB7CisJLnJlYWQgPSBpbmZvX3Byb2NfcmVhZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcnF3dV9mb3BzID0geworCS53cml0ZSA9IHJxd3VfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZW5hYmxlX2ludHNfZm9wcyA9IHsKKwkucmVhZCA9IGVuYWJsZV9pbnRzX3JlYWQsCisJLndyaXRlID0gZW5hYmxlX2ludHNfd3JpdGUsCit9OworCisKKyNkZWZpbmUgVklSVEhCQVNPUEVOTUFYIDEKKy8qIGFycmF5IG9mIG9wZW4gZGV2aWNlcyBtYWludGFpbmVkIGJ5IG9wZW4oKSBhbmQgY2xvc2UoKTsgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlydGhiYV9kZXZpY2VzX29wZW4gVmlydEhiYXNPcGVuW1ZJUlRIQkFTT1BFTk1BWF07CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aXJ0aGJhX3Byb2NfZGlyOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaW5mb19wcm9jX2VudHJ5Oworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcnF3YWl0dXNfcHJvY19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVuYWJsZV9pbnRzX3Byb2NfZW50cnk7CisjZGVmaW5lIElORk9fUFJPQ19FTlRSWV9GTiAiaW5mbyIKKyNkZWZpbmUgRU5BQkxFX0lOVFNfRU5UUllfRk4gImVuYWJsZV9pbnRzIgorI2RlZmluZSBSUVdVX1BST0NfRU5UUllfRk4gInJxd2FpdF91c2VjcyIKKyNkZWZpbmUgRElSX1BST0NfRU5UUlkgInZpcnRoYmEiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExvY2FsIEZ1bmN0aW9ucwkJCQkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithZGRfc2NzaXBlbmRpbmdfZW50cnkoc3RydWN0IHZpcnRoYmFfaW5mbyAqdmhiYWluZm8sIGNoYXIgY21kdHlwZSwgdm9pZCAqbmV3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluc2VydF9sb2NhdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKwlpbnNlcnRfbG9jYXRpb24gPSB2aGJhaW5mby0+bmV4dGluc2VydDsKKwl3aGlsZSAodmhiYWluZm8tPnBlbmRpbmdbaW5zZXJ0X2xvY2F0aW9uXS5zZW50ICE9IE5VTEwpIHsKKwkJaW5zZXJ0X2xvY2F0aW9uID0gKGluc2VydF9sb2NhdGlvbiArIDEpICUgTUFYX1BFTkRJTkdfUkVRVUVTVFM7CisJCWlmIChpbnNlcnRfbG9jYXRpb24gPT0gKGludCkgdmhiYWluZm8tPm5leHRpbnNlcnQpIHsKKwkJCUxPR0VSUigiUXVldWUgc2hvdWxkIGJlIGZ1bGwuIGluc2VydF9sb2NhdGlvbjw8JWQ+PiAgVW5hYmxlIHRvIGZpbmQgb3BlbiBzbG90IGZvciBwZW5kaW5nIGNvbW1hbmRzLlxuIiwKKwkJCSAgICAgaW5zZXJ0X2xvY2F0aW9uKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJdmhiYWluZm8tPnBlbmRpbmdbaW5zZXJ0X2xvY2F0aW9uXS5jbWR0eXBlID0gY21kdHlwZTsKKwl2aGJhaW5mby0+cGVuZGluZ1tpbnNlcnRfbG9jYXRpb25dLnNlbnQgPSBuZXc7CisJdmhiYWluZm8tPm5leHRpbnNlcnQgPSAoaW5zZXJ0X2xvY2F0aW9uICsgMSkgJSBNQVhfUEVORElOR19SRVFVRVNUUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbnNlcnRfbG9jYXRpb247Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2FkZF9zY3NpcGVuZGluZ19lbnRyeV93aXRoX3dhaXQoc3RydWN0IHZpcnRoYmFfaW5mbyAqdmhiYWluZm8sIGNoYXIgY21kdHlwZSwKKwkJCQl2b2lkICpuZXcpCit7CisJaW50IGluc2VydF9sb2NhdGlvbiA9IGFkZF9zY3NpcGVuZGluZ19lbnRyeSh2aGJhaW5mbywgY21kdHlwZSwgbmV3KTsKKworCXdoaWxlIChpbnNlcnRfbG9jYXRpb24gPT0gLTEpIHsKKwkJTE9HRVJSKCJGYWlsZWQgdG8gZmluZCBlbXB0eSBxdWV1ZSBzbG90LiAgV2FpdGluZyB0byB0cnkgYWdhaW5cbiIpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwkJaW5zZXJ0X2xvY2F0aW9uID0gYWRkX3Njc2lwZW5kaW5nX2VudHJ5KHZoYmFpbmZvLCBjbWR0eXBlLCBuZXcpOworCX0KKworCXJldHVybiAodW5zaWduZWQgaW50KSBpbnNlcnRfbG9jYXRpb247Cit9CisKK3N0YXRpYyB2b2lkICoKK2RlbF9zY3NpcGVuZGluZ19lbnRyeShzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aGJhaW5mbywgdWludHB0cl90IGRlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKnNlbnQgPSBOVUxMOworCisJaWYgKGRlbCA+PSBNQVhfUEVORElOR19SRVFVRVNUUykgeworCQlMT0dFUlIoIkludmFsaWQgcXVldWUgcG9zaXRpb24gPDwlbHU+PiBnaXZlbiB0byBkZWxldGUuIE1BWF9QRU5ESU5HX1JFUVVFU1RTIDw8JWQ+PlxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZykgZGVsLCBNQVhfUEVORElOR19SRVFVRVNUUyk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCisJCWlmICh2aGJhaW5mby0+cGVuZGluZ1tkZWxdLnNlbnQgPT0gTlVMTCkKKwkJCUxPR0VSUigiRGVsZXRpbmcgYWxyZWFkeSBjbGVhcmVkIHF1ZXVlIGVudHJ5IGF0IDw8JWx1Pj4uXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZykgZGVsKTsKKworCQlzZW50ID0gdmhiYWluZm8tPnBlbmRpbmdbZGVsXS5zZW50OworCisJCXZoYmFpbmZvLT5wZW5kaW5nW2RlbF0uY21kdHlwZSA9IDA7CisJCXZoYmFpbmZvLT5wZW5kaW5nW2RlbF0uc2VudCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoYmFpbmZvLT5wcml2bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBzZW50OworfQorCisvKiBEQVJXb3JrUSAoRGlzayBBZGQvUmVtb3ZlKSAqLworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBEQVJXb3JrUTsKK3N0YXRpYyBzdHJ1Y3QgZGlza2FkZHJlbW92ZSAqREFSV29ya1FIZWFkOworc3RhdGljIHNwaW5sb2NrX3QgREFSV29ya1FMb2NrOworc3RhdGljIHVuc2lnbmVkIHNob3J0IERBUldvcmtRU2NoZWQ7CisjZGVmaW5lIFFVRVVFX0RJU0tBRERSRU1PVkUoZGFyKSB7IFwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmREFSV29ya1FMb2NrLCBmbGFncyk7IFwKKwlpZiAoIURBUldvcmtRSGVhZCkgeyBcCisJCURBUldvcmtRSGVhZCA9IGRhcjsgXAorCQlkYXItPm5leHQgPSBOVUxMOyBcCisJfSBcCisJZWxzZSB7IFwKKwkJZGFyLT5uZXh0ID0gREFSV29ya1FIZWFkOyBcCisJCURBUldvcmtRSGVhZCA9IGRhcjsgXAorCX0gXAorCWlmICghREFSV29ya1FTY2hlZCkgeyBcCisJCXNjaGVkdWxlX3dvcmsoJkRBUldvcmtRKTsgXAorCQlEQVJXb3JrUVNjaGVkID0gMTsgXAorCX0gXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkRBUldvcmtRTG9jaywgZmxhZ3MpOyBcCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorU2VuZERpc2tBZGRSZW1vdmUoc3RydWN0IGRpc2thZGRyZW1vdmUgKmRhcikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJaW50IGVycm9yOworCisJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cChkYXItPnNob3N0LCBkYXItPmNoYW5uZWwsIGRhci0+aWQsIGRhci0+bHVuKTsKKwlpZiAoc2RldikgeworCQlpZiAoIShkYXItPmFkZCkpCisJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2Rldik7CisJfSBlbHNlIGlmIChkYXItPmFkZCkgeworCQllcnJvciA9CisJCSAgICBzY3NpX2FkZF9kZXZpY2UoZGFyLT5zaG9zdCwgZGFyLT5jaGFubmVsLCBkYXItPmlkLAorCQkJCSAgICBkYXItPmx1bik7CisJCWlmIChlcnJvcikKKwkJCUxPR0VSUigiRmFpbGVkIHNjc2lfYWRkX2RldmljZTogaG9zdF9ubz0lZFtjaGFuPSVkOmlkPSVkOmx1bj0lZF1cbiIsCisJCQkgICAgIGRhci0+c2hvc3QtPmhvc3Rfbm8sIGRhci0+Y2hhbm5lbCwgZGFyLT5pZCwKKwkJCSAgICAgZGFyLT5sdW4pOworCX0gZWxzZQorCQlMT0dFUlIoIkZhaWxlZCBzY3NpX2RldmljZV9sb29rdXA6W2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKKwkJICAgICAgIGRhci0+Y2hhbm5lbCwgZGFyLT5pZCwgZGFyLT5sdW4pOworCWtmcmVlKGRhcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERBUldvcmtRIEhhbmRsZXIgVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkb0Rpc2tBZGRSZW1vdmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkaXNrYWRkcmVtb3ZlICpkYXI7CisJc3RydWN0IGRpc2thZGRyZW1vdmUgKnRtcGhlYWQ7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmREFSV29ya1FMb2NrLCBmbGFncyk7CisJdG1waGVhZCA9IERBUldvcmtRSGVhZDsKKwlEQVJXb3JrUUhlYWQgPSBOVUxMOworCURBUldvcmtRU2NoZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkRBUldvcmtRTG9jaywgZmxhZ3MpOworCXdoaWxlICh0bXBoZWFkKSB7CisJCWRhciA9IHRtcGhlYWQ7CisJCXRtcGhlYWQgPSBkYXItPm5leHQ7CisJCVNlbmREaXNrQWRkUmVtb3ZlKGRhcik7CisJCWkrKzsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJvdXRpbmUgdG8gYWRkIGVudHJ5IHRvIERBUldvcmtRICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2Rpc2tfbm90aWZ5KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3ApCit7CisJc3RydWN0IGRpc2thZGRyZW1vdmUgKmRhcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGFyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRpc2thZGRyZW1vdmUpLCBHRlBfQVRPTUlDKTsKKwlpZiAoZGFyKSB7CisJCWRhci0+YWRkID0gY21kcnNwLT5kaXNrbm90aWZ5LmFkZDsKKwkJZGFyLT5zaG9zdCA9IHNob3N0OworCQlkYXItPmNoYW5uZWwgPSBjbWRyc3AtPmRpc2tub3RpZnkuY2hhbm5lbDsKKwkJZGFyLT5pZCA9IGNtZHJzcC0+ZGlza25vdGlmeS5pZDsKKwkJZGFyLT5sdW4gPSBjbWRyc3AtPmRpc2tub3RpZnkubHVuOworCQlRVUVVRV9ESVNLQUREUkVNT1ZFKGRhcik7CisJfSBlbHNlIHsKKwkJTE9HRVJSKCJrbWFsbG9jIGZhaWxlZCBmb3IgZGFyLiBob3N0X25vPSVkW2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKKwkJICAgICBzaG9zdC0+aG9zdF9ubywgY21kcnNwLT5kaXNrbm90aWZ5LmNoYW5uZWwsCisJCSAgICAgY21kcnNwLT5kaXNrbm90aWZ5LmlkLCBjbWRyc3AtPmRpc2tub3RpZnkubHVuKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByb2JlIFJlbW92ZSBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAordmlydGhiYV9JU1IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgZGV2X2lkOworCUNIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsSGVhZGVyOworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHI7CisJVTY0IG1hc2s7CisJdW5zaWduZWQgbG9uZyBsb25nIHJjMTsKKworCWlmICh2aXJ0aGJhaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gSVJRX05PTkU7CisJdmlydGhiYWluZm8tPmludGVycnVwdHNfcmN2ZCsrOworCXBDaGFubmVsSGVhZGVyID0gdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW47CisJaWYgKCgocmVhZHEoJnBDaGFubmVsSGVhZGVyLT5GZWF0dXJlcykKKwkgICAgICAmIFVMVFJBX0lPX0lPVk1fSVNfT0tfV0lUSF9EUklWRVJfRElTQUJMSU5HX0lOVFMpICE9IDApCisJICAgICYmICgocmVhZHEoJnBDaGFubmVsSGVhZGVyLT5GZWF0dXJlcykgJgorCQkgVUxUUkFfSU9fRFJJVkVSX0RJU0FCTEVTX0lOVFMpICE9CisJCTApKSB7CisJCXZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRzX2Rpc2FibGVkKys7CisJCW1hc2sgPSB+VUxUUkFfQ0hBTk5FTF9FTkFCTEVfSU5UUzsKKwkJcmMxID0gdWlzcXVldWVfSW50ZXJsb2NrZWRBbmQodmlydGhiYWluZm8tPmZsYWdzX2FkZHIsIG1hc2spOworCX0KKwlpZiAodmlzb3Jfc2lnbmFscXVldWVfZW1wdHkocENoYW5uZWxIZWFkZXIsIElPQ0hBTl9GUk9NX0lPUEFSVCkpIHsKKwkJdmlydGhiYWluZm8tPmludGVycnVwdHNfbm90bWUrKzsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlwcWhkciA9IChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikKKwkJKChjaGFyIF9faW9tZW0gKikgcENoYW5uZWxIZWFkZXIgKworCQkgcmVhZHEoJnBDaGFubmVsSGVhZGVyLT5vQ2hhbm5lbFNwYWNlKSkgKyBJT0NIQU5fRlJPTV9JT1BBUlQ7CisJd3JpdGVxKHJlYWRxKCZwcWhkci0+TnVtSW50ZXJydXB0c1JlY2VpdmVkKSArIDEsCisJICAgICAgICZwcWhkci0+TnVtSW50ZXJydXB0c1JlY2VpdmVkKTsKKwlhdG9taWNfc2V0KCZ2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3JjdmQsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmlydGhiYWluZm8tPnJzcF9xdWV1ZSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50Cit2aXJ0aGJhX3Byb2JlKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdDsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlpbnQgcnNwOworCWludCBpOworCWlycV9oYW5kbGVyX3QgaGFuZGxlciA9IHZpcnRoYmFfSVNSOworCUNIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsSGVhZGVyOworCVNJR05BTF9RVUVVRV9IRUFERVIgX19pb21lbSAqcHFoZHI7CisJVTY0IG1hc2s7CisKKwlMT0dWRVIoImVudGVyaW5nIHZpcnRoYmFfcHJvYmUuLi5cbiIpOworCUxPR1ZFUigidmlydHBjaWRldiBidXNObzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzTm8sCisJICAgICAgIHZpcnRwY2lkZXYtPmRldmljZU5vKTsKKworCUxPR0lORigiZW50ZXJpbmcgdmlydGhiYV9wcm9iZS4uLlxuIik7CisJTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c05vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNObywKKwkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlTm8pOworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9QUk9CRV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJLyogY2FsbCBzY3NpX2hvc3RfYWxsb2MgdG8gcmVnaXN0ZXIgYSBzY3NpIGhvc3QgYWRhcHRlcgorCSAqIGluc3RhbmNlIC0gdGhpcyB2aXJ0aGJhIHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkIGlzIGFuCisJICogaW5zdGFuY2Ugb2YgYSBzY3NpIGhvc3QgYWRhcHRlci4gVGhpcyBzY3NpX2hvc3RfYWxsb2MKKwkgKiBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgU2NzaV9Ib3N0IHN0cnVjdCAmIHBlcmZvcm1zIGJhc2ljCisJICogaW5pdGlhbGl6YXRvaW4uICBUaGUgaG9zdCBpcyBub3QgcHVibGlzaGVkIHRvIHRoZSBzY3NpCisJICogbWlkbGF5ZXIgdW50aWwgc2NzaV9hZGRfaG9zdCBpcyBjYWxsZWQuCisJICovCisJREJHSU5GKCJjYWxsaW5nIHNjc2lfaG9zdF9hbGxvYy5cbiIpOworCisJLyogYXJnIDIgcGFzc2VkIGluIGxlbmd0aCBvZiBleHRyYSBzcGFjZSB3ZSB3YW50IGFsbG9jYXRlZAorCSAqIHdpdGggc2NzaV9ob3N0IHN0cnVjdCBmb3Igb3VyIG93biB1c2Ugc2NzaV9ob3N0X2FsbG9jCisJICogYXNzaWduIGhvc3Rfbm8KKwkgKi8KKwlzY3NpaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdmlydGhiYV9kcml2ZXJfdGVtcGxhdGUsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB2aXJ0aGJhX2luZm8pKTsKKwlpZiAoc2NzaWhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlEQkdJTkYoInNjc2lob3N0OiAweCVwLCBzY3NpaG9zdC0+dGhpc19pZDogJWQsIGhvc3Rfbm86ICVkLlxuIiwKKwkgICAgICAgc2NzaWhvc3QsIHNjc2lob3N0LT50aGlzX2lkLCBzY3NpaG9zdC0+aG9zdF9ubyk7CisKKwlzY3NpaG9zdC0+dGhpc19pZCA9IFVJU19NQUdJQ19WSEJBOworCS8qIGxpbnV4IHRyZWF0cyBtYXgtY2hhbm5lbCBkaWZmZXJlbnRseSB0aGFuIG1heC1pZCAmIG1heC1sdW4uCisJICogSW4gdGhlIGxhdHRlciBjYXNlcywgdGhvc2UgdHdvIHZhbHVlcyByZXN1bHQgaW4gMCB0byBtYXgtMQorCSAqIChpbmNsdXNpdmUpIGJlaW5nIHNjYW5uZWQuIEJ1dCBpbiB0aGUgY2FzZSBvZiBjaGFubmVscywgdGhlCisJICogc2NhbiBpcyAwIHRvIG1heCAoaW5jbHVzaXZlKTsgc28gd2Ugd2lsbCBzdWJ0cmFjdCBvbmUgZnJvbQorCSAqIHRoZSBtYXgtY2hhbm5lbCB2YWx1ZS4KKwkgKi8KKwlMT0dJTkYoInZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9jaGFubmVsPSV1LCBtYXhfaWQ9JXUsIG1heF9sdW49JXUsIGNtZF9wZXJfbHVuPSV1LCBtYXhfaW9fc2l6ZT0ldVxuIiwKKwkgICAgICh1bnNpZ25lZCkgdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2NoYW5uZWwgLSAxLAorCSAgICAgKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaWQsCisJICAgICAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9sdW4sCisJICAgICAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4LmNtZF9wZXJfbHVuLAorCSAgICAgKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaW9fc2l6ZSk7CisJc2NzaWhvc3QtPm1heF9jaGFubmVsID0gKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbDsKKwlzY3NpaG9zdC0+bWF4X2lkID0gKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaWQ7CisJc2NzaWhvc3QtPm1heF9sdW4gPSAodW5zaWduZWQpIHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9sdW47CisJc2NzaWhvc3QtPmNtZF9wZXJfbHVuID0gKHVuc2lnbmVkKSB2aXJ0cGNpZGV2LT5zY3NpLm1heC5jbWRfcGVyX2x1bjsKKwlzY3NpaG9zdC0+bWF4X3NlY3RvcnMgPQorCSAgICAodW5zaWduZWQgc2hvcnQpICh2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfaW9fc2l6ZSA+PiA5KTsKKwlzY3NpaG9zdC0+c2dfdGFibGVzaXplID0KKwkgICAgKHVuc2lnbmVkIHNob3J0KSAodmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2lvX3NpemUgLyBQQUdFX1NJWkUpOworCWlmIChzY3NpaG9zdC0+c2dfdGFibGVzaXplID4gTUFYX1BIWVNfSU5GTykKKwkJc2NzaWhvc3QtPnNnX3RhYmxlc2l6ZSA9IE1BWF9QSFlTX0lORk87CisJTE9HSU5GKCJzY3NpaG9zdC0+bWF4X2NoYW5uZWw9JXUsIG1heF9pZD0ldSwgbWF4X2x1bj0ldSwgY21kX3Blcl9sdW49JXUsIG1heF9zZWN0b3JzPSVodSwgc2dfdGFibGVzaXplPSVodVxuIiwKKwkgICAgIHNjc2lob3N0LT5tYXhfY2hhbm5lbCwgc2NzaWhvc3QtPm1heF9pZCwgc2NzaWhvc3QtPm1heF9sdW4sCisJICAgICBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKKwkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOworCUxPR0lORigic2NzaWhvc3QtPmNhbl9xdWV1ZT0ldSwgc2NzaWhvc3QtPmNtZF9wZXJfbHVuPSV1LCBtYXhfc2VjdG9ycz0laHUsIHNnX3RhYmxlc2l6ZT0laHVcbiIsCisJICAgICBzY3NpaG9zdC0+Y2FuX3F1ZXVlLCBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKKwkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOworCisJREJHSU5GKCJjYWxsaW5nIHNjc2lfYWRkX2hvc3RcbiIpOworCisJLyogdGhpcyBjcmVhdGVzICJob3N0JWQiIGluIHN5c2ZzLiAgSWYgMm5kIGFyZ3VtZW50IGlzIE5VTEwsCisJICogdGhlbiB0aGlzIGdlbmVyaWMgL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2hvc3Q/ICBkZXZpY2UgaXMKKwkgKiBjcmVhdGVkIGFuZCAvc3lzL3Njc2lfaG9zdC9ob3N0PyAtPgorCSAqIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9ob3N0PyAgSWYgMm5kIGFyZ3VtZW50IGlzIG5vdCBOVUxMLAorCSAqIHRoZW4gdGhpcyBnZW5lcmljIC9zeXMvZGV2aWNlcy88cGF0aD4vaG9zdD8gaXMgY3JlYXRlZCBhbmQKKwkgKiBob3N0PyBwb2ludHMgdG8gdGhhdCBkZXZpY2UgaW5zdGVhZC4KKwkgKi8KKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2NzaWhvc3QsICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldik7CisJaWYgKGVycm9yKSB7CisJCUxPR0VSUigic2NzaV9hZGRfaG9zdCAqKioqRkFJTEVEIDB4JXggIFRCRCAtIFJFQ09WRVJcbiIsIGVycm9yKTsKKwkJUE9TVENPREVfTElOVVhfMihWSEJBX1BST0JFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCS8qIGRlY3IgcmVmY291bnQgb24gc2NzaWhvc3Qgd2hpY2ggd2FzIGluY3JlbWVudGVkIGJ5CisJCSAqIHNjc2lfYWRkX2hvc3Qgc28gdGhlIHNjc2lfaG9zdCBnZXRzIGRlbGV0ZWQKKwkJICovCisJCXNjc2lfaG9zdF9wdXQoc2NzaWhvc3QpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2aXJ0aGJhaW5mbyA9IChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lob3N0LT5ob3N0ZGF0YTsKKwltZW1zZXQodmlydGhiYWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdmlydGhiYV9pbmZvKSk7CisJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7CisJCWlmIChWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm8gPT0gTlVMTCkgeworCQkJVmlydEhiYXNPcGVuW2ldLnZpcnRoYmFpbmZvID0gdmlydGhiYWluZm87CisJCQlicmVhazsKKwkJfQorCX0KKwl2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciA9IC0xOworCXZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvID0gJnZpcnRwY2lkZXYtPnF1ZXVlaW5mbzsKKwl2aXJ0aGJhaW5mby0+dmlydHBjaWRldiA9IHZpcnRwY2lkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jayk7CisKKwlEQkdJTkYoImdlbmVyaWNfZGV2OiAweCVwLCBxdWV1ZWluZm86IDB4JXAuXG4iLAorCSAgICAgICAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYsICZ2aXJ0cGNpZGV2LT5xdWV1ZWluZm8pOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdmlydGhiYWluZm8tPnJzcF9xdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJnZpcnRoYmFpbmZvLT5wcml2bG9jayk7CisJbWVtc2V0KCZ2aXJ0aGJhaW5mby0+cGVuZGluZywgMCwgc2l6ZW9mKHZpcnRoYmFpbmZvLT5wZW5kaW5nKSk7CisJdmlydGhiYWluZm8tPnNlcnZlcmRvd24gPSBmYWxzZTsKKwl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IGZhbHNlOworCisJdmlydGhiYWluZm8tPmludHIgPSB2aXJ0cGNpZGV2LT5pbnRyOworCS8qIHNhdmUgb2YgaG9zdCB3aXRoaW4gdmlydGhiYV9pbmZvICovCisJdmlydGhiYWluZm8tPnNjc2lob3N0ID0gc2NzaWhvc3Q7CisKKwkvKiBzYXZlIG9mIGhvc3Qgd2l0aGluIHZpcnRwY2lfZGV2ICovCisJdmlydHBjaWRldi0+c2NzaS5zY3NpaG9zdCA9IHNjc2lob3N0OworCisJLyogU2V0dXAgd29ya3F1ZXVlIGZvciBzZXJ2ZXJkb3duIG1lc3NhZ2VzICovCisJSU5JVF9XT1JLKCZ2aXJ0aGJhaW5mby0+c2VydmVyZG93bl9jb21wbGV0aW9uLAorCQkgIHZpcnRoYmFfc2VydmVyZG93bl9jb21wbGV0ZSk7CisKKwl3cml0ZXEocmVhZHEoJnZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLT5GZWF0dXJlcykgfAorCSAgICAgICBVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkcsCisJICAgICAgICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbi0+RmVhdHVyZXMpOworCS8qIHN0YXJ0IHRocmVhZCB0aGF0IHdpbGwgcmVjZWl2ZSBzY3NpY21uZCByZXNwb25zZXMgKi8KKwlEQkdJTkYoInN0YXJ0aW5nIHJzcCB0aHJlYWQgLS0gcXVldWVpbmZvOiAweCVwLCB0aHJlYWRpbmZvOiAweCVwLlxuIiwKKwkgICAgICAgdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8sICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8pOworCisJcENoYW5uZWxIZWFkZXIgPSB2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbjsKKwlwcWhkciA9IChTSUdOQUxfUVVFVUVfSEVBREVSIF9faW9tZW0gKikKKwkJKChjaGFyIF9faW9tZW0gKilwQ2hhbm5lbEhlYWRlciArCisJCSByZWFkcSgmcENoYW5uZWxIZWFkZXItPm9DaGFubmVsU3BhY2UpKSArIElPQ0hBTl9GUk9NX0lPUEFSVDsKKwl2aXJ0aGJhaW5mby0+ZmxhZ3NfYWRkciA9ICZwcWhkci0+RmVhdHVyZUZsYWdzOworCisJaWYgKCF1aXN0aHJlYWRfc3RhcnQoJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbywKKwkJCSAgICAgcHJvY2Vzc19pbmNvbWluZ19yc3BzLAorCQkJICAgICB2aXJ0aGJhaW5mbywgInZoYmFfaW5jb21pbmciKSkgeworCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCByc3AgKioqKkZBSUxFRFxuIik7CisJCS8qIGRlY3IgcmVmY291bnQgb24gc2NzaWhvc3Qgd2hpY2ggd2FzIGluY3JlbWVudGVkIGJ5CisJCSAqIHNjc2lfYWRkX2hvc3Qgc28gdGhlIHNjc2lfaG9zdCBnZXRzIGRlbGV0ZWQKKwkJICovCisJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9QUk9CRV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlzY3NpX2hvc3RfcHV0KHNjc2lob3N0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCUxPR0lORigic2VuZEludGVycnVwdEhhbmRsZT0weCUxNmxsWCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnNlbmRJbnRlcnJ1cHRIYW5kbGUpOworCUxPR0lORigicmVjdkludGVycnVwdEhhbmRsZT0weCUxNmxsWCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZJbnRlcnJ1cHRIYW5kbGUpOworCUxPR0lORigicmVjdkludGVycnVwdFZlY3Rvcj0weCU4WCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZJbnRlcnJ1cHRWZWN0b3IpOworCUxPR0lORigicmVjdkludGVycnVwdFNoYXJlZD0weCUyWCIsCisJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZJbnRlcnJ1cHRTaGFyZWQpOworCUxPR0lORigic2NzaWhvc3QuaG9zdHQtPm5hbWU9JXMiLCBzY3NpaG9zdC0+aG9zdHQtPm5hbWUpOworCXZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yID0KKwkgICAgdmlydGhiYWluZm8tPmludHIucmVjdkludGVycnVwdEhhbmRsZSAmIElOVEVSUlVQVF9WRUNUT1JfTUFTSzsKKwlyc3AgPSByZXF1ZXN0X2lycSh2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciwgaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkgIHNjc2lob3N0LT5ob3N0dC0+bmFtZSwgdmlydGhiYWluZm8pOworCWlmIChyc3AgIT0gMCkgeworCQlMT0dFUlIoInJlcXVlc3RfaXJxKCVkKSB1aXNsaWJfdmlydGhiYV9JU1IgcmVxdWVzdCBmYWlsZWQgd2l0aCByc3A9JWRcbiIsCisJCSAgICAgICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciwgcnNwKTsKKwkJdmlydGhiYWluZm8tPmludGVycnVwdF92ZWN0b3IgPSAtMTsKKwkJUE9TVENPREVfTElOVVhfMihWSEJBX1BST0JFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJfSBlbHNlIHsKKwkJVTY0IF9faW9tZW0gKkZlYXR1cmVzX2FkZHIgPQorCQkgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLT5GZWF0dXJlczsKKwkJTE9HRVJSKCJyZXF1ZXN0X2lycSglZCkgdWlzbGliX3ZpcnRoYmFfSVNSIHJlcXVlc3Qgc3VjY2VlZGVkXG4iLAorCQkgICAgICAgdmlydGhiYWluZm8tPmludGVycnVwdF92ZWN0b3IpOworCQltYXNrID0gfihVTFRSQV9JT19DSEFOTkVMX0lTX1BPTExJTkcgfAorCQkJIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTKTsKKwkJdWlzcXVldWVfSW50ZXJsb2NrZWRBbmQoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCW1hc2sgPSBVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTOworCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKEZlYXR1cmVzX2FkZHIsIG1hc2spOworCQlyc2x0cV93YWl0X3VzZWNzID0gNDAwMDAwMDsKKwl9CisKKwlEQkdJTkYoImNhbGxpbmcgc2NzaV9zY2FuX2hvc3QuXG4iKTsKKwlzY3NpX3NjYW5faG9zdChzY3NpaG9zdCk7CisJREJHSU5GKCJyZXR1cm4gZnJvbSBzY3NpX3NjYW5faG9zdC5cbiIpOworCisJTE9HSU5GKCJ2aXJ0aGJhIGFkZGVkIHNjc2lob3N0OjB4JXBcbiIsIHNjc2lob3N0KTsKKwlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit2aXJ0aGJhX3JlbW92ZShzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm87CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3QgPQorCSAgICAoc3RydWN0IFNjc2lfSG9zdCAqKSB2aXJ0cGNpZGV2LT5zY3NpLnNjc2lob3N0OworCisJTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c05vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNObywKKwkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlTm8pOworCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgc2NzaWhvc3QtPmhvc3RkYXRhOworCWlmICh2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciAhPSAtMSkKKwkJZnJlZV9pcnEodmlydGhiYWluZm8tPmludGVycnVwdF92ZWN0b3IsIHZpcnRoYmFpbmZvKTsKKwlMT0dJTkYoIlJlbW92aW5nIHZpcnRwY2lkZXY6IDB4JXAsIHZpcnRoYmFpbmZvOiAweCVwXG4iLCB2aXJ0cGNpZGV2LAorCSAgICAgICB2aXJ0aGJhaW5mbyk7CisKKwlEQkdJTkYoInJlbW92aW5nIHNjc2lob3N0OiAweCVwLCBzY3NpaG9zdC0+dGhpc19pZDogJWRcbiIsIHNjc2lob3N0LAorCSAgICAgICBzY3NpaG9zdC0+dGhpc19pZCk7CisJc2NzaV9yZW1vdmVfaG9zdChzY3NpaG9zdCk7CisKKwlEQkdJTkYoInN0b3BwaW5nIHRocmVhZC5cbiIpOworCXVpc3RocmVhZF9zdG9wKCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8pOworCisJREJHSU5GKCJjYWxsaW5nIHNjc2lfaG9zdF9wdXRcbiIpOworCisJLyogZGVjciByZWZjb3VudCBvbiBzY3NpaG9zdCB3aGljaCB3YXMgaW5jcmVtZW50ZWQgYnkKKwkgKiBzY3NpX2FkZF9ob3N0IHNvIHRoZSBzY3NpX2hvc3QgZ2V0cyBkZWxldGVkCisJICovCisJc2NzaV9ob3N0X3B1dChzY3NpaG9zdCk7CisJTE9HSU5GKCJ2aXJ0aGJhIHJlbW92ZWQgc2NzaV9ob3N0LlxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2ZvcndhcmRfdmRpc2ttZ210X2NvbW1hbmQoVkRJU0tfTUdNVF9UWVBFUyB2ZGlza2NtZHR5cGUsCisJCQkgIHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0LAorCQkJICBzdHJ1Y3QgdWlzc2NzaV9kZXN0ICp2ZGVzdCkKK3sKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3A7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPQorCSAgICAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpaG9zdC0+aG9zdGRhdGE7CisJaW50IG5vdGlmeXJlc3VsdCA9IDB4ZmZmZjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBub3RpZnlldmVudDsKKworCUxPR0lORigidkRpc2tNZ210OiVkICVkOiVkOiVkXG4iLCB2ZGlza2NtZHR5cGUsCisJICAgICAgIHZkZXN0LT5jaGFubmVsLCB2ZGVzdC0+aWQsIHZkZXN0LT5sdW4pOworCisJaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duIHx8IHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCURCR0lORigiU2VydmVyIGlzIGRvd24vY2hhbmdpbmcgc3RhdGUuIFJldHVybmluZyBGYWlsdXJlLlxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKKwlpZiAoY21kcnNwID09IE5VTEwpIHsKKwkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsJLyogcmVqZWN0ICovCisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbm90aWZ5ZXZlbnQpOworCisJLyogaXNzdWUgVkRJU0tfTUdNVF9DTUQKKwkgKiBzZXQgdHlwZSB0byBjb21tYW5kIC0gYXMgb3Bwb3NlZCB0byB0YXNrIG1nbXQKKwkgKi8KKwljbWRyc3AtPmNtZHR5cGUgPSBDTURfVkRJU0tNR01UX1RZUEU7CisJLyogc3BlY2lmeSB0aGUgZXZlbnQgdGhhdCBoYXMgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhpcyBjbWQgaXMKKwkgKiBjb21wbGV0ZQorCSAqLworCWNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeSA9ICh2b2lkICopICZub3RpZnlldmVudDsKKwljbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnlyZXN1bHQgPSAodm9pZCAqKSAmbm90aWZ5cmVzdWx0OworCisJLyogc2F2ZSBkZXN0aW5hdGlvbiAqLworCWNtZHJzcC0+dmRpc2ttZ210LnZkaXNrdHlwZSA9IHZkaXNrY21kdHlwZTsKKwljbWRyc3AtPnZkaXNrbWdtdC52ZGVzdC5jaGFubmVsID0gdmRlc3QtPmNoYW5uZWw7CisJY21kcnNwLT52ZGlza21nbXQudmRlc3QuaWQgPSB2ZGVzdC0+aWQ7CisJY21kcnNwLT52ZGlza21nbXQudmRlc3QubHVuID0gdmRlc3QtPmx1bjsKKwljbWRyc3AtPnZkaXNrbWdtdC5zY3NpY21kID0KKwkgICAgKHZvaWQgKikgKHVpbnRwdHJfdCkKKwkJYWRkX3Njc2lwZW5kaW5nX2VudHJ5X3dpdGhfd2FpdCh2aXJ0aGJhaW5mbywgQ01EX1ZESVNLTUdNVF9UWVBFLAorCQkJCQkJKHZvaWQgKikgY21kcnNwKTsKKworCXVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrX2NsaWVudCh2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mbywKKwkJCQkJICAgICBjbWRyc3AsIElPQ0hBTl9UT19JT1BBUlQsCisJCQkJCSAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywKKwkJCQkJICAgICBET05UX0lTU1VFX0lOVEVSUlVQVCwgKFU2NCkgTlVMTCwKKwkJCQkJICAgICBPS19UT19XQUlULCAidmhiYSIpOworCUxPR0lORigiVmRpc2tNZ210IHdhaXRpbmcgb24gZXZlbnQgbm90aWZ5ZXZlbnQ9MHglcFxuIiwKKwkgICAgICAgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5KTsKKwl3YWl0X2V2ZW50KG5vdGlmeWV2ZW50LCBub3RpZnlyZXN1bHQgIT0gMHhmZmZmKTsKKwlMT0dJTkYoIlZkaXNrTWdtdCBjb21wbGV0ZTsgcmVzdWx0OiVkXG4iLCBjbWRyc3AtPnZkaXNrbWdtdC5yZXN1bHQpOworCWtmcmVlKGNtZHJzcCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNjc2kgSG9zdCBzdXBwb3J0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorZm9yd2FyZF90YXNrbWdtdF9jb21tYW5kKFRBU0tfTUdNVF9UWVBFUyB0YXNrdHlwZSwgc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KQoreworCXN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcDsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbyA9CisJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhOworCWludCBub3RpZnlyZXN1bHQgPSAweGZmZmY7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgbm90aWZ5ZXZlbnQ7CisKKwlMT0dJTkYoIlRhc2tNZ210OiVkICVkOiVkOiVkXG4iLCB0YXNrdHlwZSwKKwkgICAgICAgc2NzaWRldi0+Y2hhbm5lbCwgc2NzaWRldi0+aWQsIHNjc2lkZXYtPmx1bik7CisKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKKwkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIEZhaWx1cmUuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwljbWRyc3AgPSBremFsbG9jKFNJWkVPRl9DTURSU1AsIEdGUF9BVE9NSUMpOworCWlmIChjbWRyc3AgPT0gTlVMTCkgeworCQlMT0dFUlIoImttYWxsb2Mgb2YgY21kcnNwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gRkFJTEVEOwkvKiByZWplY3QgKi8KKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZub3RpZnlldmVudCk7CisKKwkvKiBpc3N1ZSBUQVNLX01HTVRfQUJPUlRfVEFTSyAqLworCS8qIHNldCB0eXBlIHRvIGNvbW1hbmQgLSBhcyBvcHBvc2VkIHRvIHRhc2sgbWdtdCAqLworCWNtZHJzcC0+Y21kdHlwZSA9IENNRF9TQ1NJVEFTS01HTVRfVFlQRTsKKwkvKiBzcGVjaWZ5IHRoZSBldmVudCB0aGF0IGhhcyB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGlzICovCisJLyogY21kIGlzIGNvbXBsZXRlICovCisJY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5ID0gKHZvaWQgKikgJm5vdGlmeWV2ZW50OworCWNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeXJlc3VsdCA9ICh2b2lkICopICZub3RpZnlyZXN1bHQ7CisKKwkvKiBzYXZlIGRlc3RpbmF0aW9uICovCisJY21kcnNwLT5zY3NpdGFza21nbXQudGFza3R5cGUgPSB0YXNrdHlwZTsKKwljbWRyc3AtPnNjc2l0YXNrbWdtdC52ZGVzdC5jaGFubmVsID0gc2NzaWRldi0+Y2hhbm5lbDsKKwljbWRyc3AtPnNjc2l0YXNrbWdtdC52ZGVzdC5pZCA9IHNjc2lkZXYtPmlkOworCWNtZHJzcC0+c2NzaXRhc2ttZ210LnZkZXN0Lmx1biA9IHNjc2lkZXYtPmx1bjsKKwljbWRyc3AtPnNjc2l0YXNrbWdtdC5zY3NpY21kID0KKwkgICAgKHZvaWQgKikgKHVpbnRwdHJfdCkKKwkJYWRkX3Njc2lwZW5kaW5nX2VudHJ5X3dpdGhfd2FpdCh2aXJ0aGJhaW5mbywKKwkJCQkJCUNNRF9TQ1NJVEFTS01HTVRfVFlQRSwKKwkJCQkJCSh2b2lkICopIGNtZHJzcCk7CisKKwl1aXNxdWV1ZV9wdXRfY21kcnNwX3dpdGhfbG9ja19jbGllbnQodmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8sCisJCQkJCSAgICAgY21kcnNwLCBJT0NIQU5fVE9fSU9QQVJULAorCQkJCQkgICAgICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLmluc2VydGxvY2ssCisJCQkJCSAgICAgRE9OVF9JU1NVRV9JTlRFUlJVUFQsIChVNjQpIE5VTEwsCisJCQkJCSAgICAgT0tfVE9fV0FJVCwgInZoYmEiKTsKKwlMT0dJTkYoIlRhc2tNZ210IHdhaXRpbmcgb24gZXZlbnQgbm90aWZ5ZXZlbnQ9MHglcFxuIiwKKwkgICAgICAgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5KTsKKwl3YWl0X2V2ZW50KG5vdGlmeWV2ZW50LCBub3RpZnlyZXN1bHQgIT0gMHhmZmZmKTsKKwlMT0dJTkYoIlRhc2tNZ210IGNvbXBsZXRlOyByZXN1bHQ6JWRcbiIsIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdCk7CisJa2ZyZWUoY21kcnNwKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogVGhlIGFib3J0IGhhbmRsZXIgcmV0dXJucyBTVUNDRVNTIGlmIGl0IGhhcyBzdWNjZWVkZWQgdG8gbWFrZSBMTERECisgKiBhbmQgYWxsIHJlbGF0ZWQgaGFyZHdhcmUgZm9yZ2V0IGFib3V0IHRoZSBzY21kLgorICovCitzdGF0aWMgaW50Cit2aXJ0aGJhX2Fib3J0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCkKK3sKKwkvKiBpc3N1ZSBUQVNLX01HTVRfQUJPUlRfVEFTSyAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldjsKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2s7CisKKwlzY3NpZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWZvciAodmRpc2sgPSAmKChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhKS0+aGVhZDsKKwkgICAgIHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCA9PSB2ZGlzay0+Y2hhbm5lbCkKKwkJICAgICYmIChzY3NpZGV2LT5pZCA9PSB2ZGlzay0+aWQpCisJCSAgICAmJiAoc2NzaWRldi0+bHVuID09IHZkaXNrLT5sdW4pKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPAorCQkJICAgIFZJUlRIQkFfRVJST1JfQ09VTlQpIHsKKwkJCQlhdG9taWNfaW5jKCZ2ZGlzay0+ZXJyb3JfY291bnQpOworCQkJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DT01NQU5EX0hBTkRMRVJfUEMsCisJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCQl9IGVsc2UKKwkJCQlhdG9taWNfc2V0KCZ2ZGlzay0+aW9zX3RocmVzaG9sZCwKKwkJCQkJICAgSU9TX0VSUk9SX1RIUkVTSE9MRCk7CisJCX0KKwl9CisJcmV0dXJuIGZvcndhcmRfdGFza21nbXRfY29tbWFuZChUQVNLX01HTVRfQUJPUlRfVEFTSywgc2NzaWNtZC0+ZGV2aWNlKTsKK30KKworc3RhdGljIGludAordmlydGhiYV9idXNfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCS8qIGlzc3VlIFRBU0tfTUdNVF9UQVJHRVRfUkVTRVQgZm9yIGVhY2ggdGFyZ2V0IG9uIHRoZSBidXMgKi8KKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXY7CisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrOworCisJc2NzaWRldiA9IHNjc2ljbWQtPmRldmljZTsKKwlmb3IgKHZkaXNrID0gJigoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpZGV2LT5ob3N0LT5ob3N0ZGF0YSktPmhlYWQ7CisJICAgICB2ZGlzay0+bmV4dDsgdmRpc2sgPSB2ZGlzay0+bmV4dCkgeworCQlpZiAoKHNjc2lkZXYtPmNoYW5uZWwgPT0gdmRpc2stPmNoYW5uZWwpCisJCSAgICAmJiAoc2NzaWRldi0+aWQgPT0gdmRpc2stPmlkKQorCQkgICAgJiYgKHNjc2lkZXYtPmx1biA9PSB2ZGlzay0+bHVuKSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwKKwkJCSAgICBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7CisJCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKKwkJCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ09NTUFORF9IQU5ETEVSX1BDLAorCQkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCQkJfSBlbHNlCisJCQkJYXRvbWljX3NldCgmdmRpc2stPmlvc190aHJlc2hvbGQsCisJCQkJCSAgIElPU19FUlJPUl9USFJFU0hPTEQpOworCQl9CisJfQorCXJldHVybiBmb3J3YXJkX3Rhc2ttZ210X2NvbW1hbmQoVEFTS19NR01UX0JVU19SRVNFVCwgc2NzaWNtZC0+ZGV2aWNlKTsKK30KKworc3RhdGljIGludAordmlydGhiYV9kZXZpY2VfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCS8qIGlzc3VlIFRBU0tfTUdNVF9MVU5fUkVTRVQgKi8KKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXY7CisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrOworCisJc2NzaWRldiA9IHNjc2ljbWQtPmRldmljZTsKKwlmb3IgKHZkaXNrID0gJigoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpZGV2LT5ob3N0LT5ob3N0ZGF0YSktPmhlYWQ7CisJICAgICB2ZGlzay0+bmV4dDsgdmRpc2sgPSB2ZGlzay0+bmV4dCkgeworCQlpZiAoKHNjc2lkZXYtPmNoYW5uZWwgPT0gdmRpc2stPmNoYW5uZWwpCisJCSAgICAmJiAoc2NzaWRldi0+aWQgPT0gdmRpc2stPmlkKQorCQkgICAgJiYgKHNjc2lkZXYtPmx1biA9PSB2ZGlzay0+bHVuKSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwKKwkJCSAgICBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7CisJCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKKwkJCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ09NTUFORF9IQU5ETEVSX1BDLAorCQkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCQkJfSBlbHNlCisJCQkJYXRvbWljX3NldCgmdmRpc2stPmlvc190aHJlc2hvbGQsCisJCQkJCSAgIElPU19FUlJPUl9USFJFU0hPTEQpOworCQl9CisJfQorCXJldHVybiBmb3J3YXJkX3Rhc2ttZ210X2NvbW1hbmQoVEFTS19NR01UX0xVTl9SRVNFVCwgc2NzaWNtZC0+ZGV2aWNlKTsKK30KKworc3RhdGljIGludAordmlydGhiYV9ob3N0X3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCkKK3sKKwkvKiBpc3N1ZSBUQVNLX01HTVRfVEFSR0VUX1JFU0VUIGZvciBlYWNoIHRhcmdldCBvbiBlYWNoIGJ1cyBmb3IgaG9zdCAqLworCUxPR0VSUigidmlydGhiYV9ob3N0X3Jlc2V0X2hhbmRsZXIgTm90IHlldCBpbXBsZW1lbnRlZFxuIik7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBjaGFyIHZpcnRoYmFfZ2V0X2luZm9fc3RyWzI1Nl07CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3ZpcnRoYmFfZ2V0X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwKQoreworCS8qIFJldHVybiB2ZXJzaW9uIHN0cmluZyAqLworCXNwcmludGYodmlydGhiYV9nZXRfaW5mb19zdHIsICJ2aXJ0aGJhLCB2ZXJzaW9uICVzXG4iLCBWSVJUSEJBX1ZFUlNJT04pOworCXJldHVybiB2aXJ0aGJhX2dldF9pbmZvX3N0cjsKK30KKworc3RhdGljIGludAordmlydGhiYV9pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlEQkdJTkYoIkluIHZpcnRoYmFfaW9jdGw6IGlvY3RsOiBjbWQ9MHgleFxuIiwgY21kKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogVGhpcyByZXR1cm5zIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWSBpZiB0aGUgc2lnbmFsIHF1ZXVlIHRvIElPcGFydAorICogaXMgZnVsbC4KKyAqLworc3RhdGljIGludAordmlydGhiYV9xdWV1ZV9jb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kLAorCQkJICB2b2lkICgqdmlydGhiYV9jbW5kX2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWludCBpbnNlcnRfbG9jYXRpb247CisJdW5zaWduZWQgY2hhciBvcDsKKwl1bnNpZ25lZCBjaGFyICpjZGIgPSBzY3NpY21kLT5jbW5kOworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0ID0gc2NzaWRldi0+aG9zdDsKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3A7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPQorCSAgICAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSBOVUxMOworCWludCBzZ19mYWlsZWQgPSAwOworCisJaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duIHx8IHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCURCR0lORigiU2VydmVyIGlzIGRvd24vY2hhbmdpbmcgc3RhdGUuIFJldHVybmluZyBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kuXG4iKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKKwl9CisKKwljbWRyc3AgPSBremFsbG9jKFNJWkVPRl9DTURSU1AsIEdGUF9BVE9NSUMpOworCWlmIChjbWRyc3AgPT0gTlVMTCkgeworCQlMT0dFUlIoImttYWxsb2Mgb2YgY21kcnNwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMTsJLyogcmVqZWN0IHRoZSBjb21tYW5kICovCisJfQorCisJLyogbm93IHNhdmluZyBldmVyeXRoaW5nIHdlIG5lZWQgZnJvbSBzY3NpX2NtZCBpbnRvIGNtZHJzcAorCSAqIGJlZm9yZSB3ZSBxdWV1ZSBjbWRyc3Agc2V0IHR5cGUgdG8gY29tbWFuZCAtIGFzIG9wcG9zZWQgdG8KKwkgKiB0YXNrIG1nbXQKKwkgKi8KKwljbWRyc3AtPmNtZHR5cGUgPSBDTURfU0NTSV9UWVBFOworCS8qIHNhdmUgdGhlIHBlbmRpbmcgaW5zZXJ0aW9uIGxvY2F0aW9uLiAgRGVsZXRpb24gZnJvbSBwZW5kaW5nCisJICogd2lsbCByZXR1cm4gdGhlIHNjc2ljbWQgcG9pbnRlciBmb3IgY29tcGxldGlvbgorCSAqLworCWluc2VydF9sb2NhdGlvbiA9CisJICAgIGFkZF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywgQ01EX1NDU0lfVFlQRSwgKHZvaWQgKikgc2NzaWNtZCk7CisJaWYgKGluc2VydF9sb2NhdGlvbiAhPSAtMSkgeworCQljbWRyc3AtPnNjc2kuc2NzaWNtZCA9ICh2b2lkICopICh1aW50cHRyX3QpIGluc2VydF9sb2NhdGlvbjsKKwl9IGVsc2UgeworCQlMT0dFUlIoIlF1ZXVlIGlzIGZ1bGwuIFJldHVybmluZyBidXN5LlxuIik7CisJCWtmcmVlKGNtZHJzcCk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisJfQorCS8qIHNhdmUgZG9uZSBmdW5jdGlvbiB0aGF0IHdlIGhhdmUgY2FsbCB3aGVuIGNtZCBpcyBjb21wbGV0ZSAqLworCXNjc2ljbWQtPnNjc2lfZG9uZSA9IHZpcnRoYmFfY21uZF9kb25lOworCS8qIHNhdmUgZGVzdGluYXRpb24gKi8KKwljbWRyc3AtPnNjc2kudmRlc3QuY2hhbm5lbCA9IHNjc2lkZXYtPmNoYW5uZWw7CisJY21kcnNwLT5zY3NpLnZkZXN0LmlkID0gc2NzaWRldi0+aWQ7CisJY21kcnNwLT5zY3NpLnZkZXN0Lmx1biA9IHNjc2lkZXYtPmx1bjsKKwkvKiBzYXZlIGRhdGFkaXIgKi8KKwljbWRyc3AtPnNjc2kuZGF0YV9kaXIgPSBzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwltZW1jcHkoY21kcnNwLT5zY3NpLmNtbmQsIGNkYiwgTUFYX0NNTkRfU0laRSk7CisKKwljbWRyc3AtPnNjc2kuYnVmZmxlbiA9IHNjc2lfYnVmZmxlbihzY3NpY21kKTsKKworCS8qIGtlZXAgdHJhY2sgb2YgdGhlIG1heCBidWZmZXIgbGVuZ3RoIHNvIGZhci4gKi8KKwlpZiAoY21kcnNwLT5zY3NpLmJ1ZmZsZW4gPiBNYXhCdWZmTGVuKQorCQlNYXhCdWZmTGVuID0gY21kcnNwLT5zY3NpLmJ1ZmZsZW47CisKKwlpZiAoc2NzaV9zZ19jb3VudChzY3NpY21kKSA+IE1BWF9QSFlTX0lORk8pIHsKKwkJTE9HRVJSKCJzY3NpY21kIHVzZV9zZzolZCBncmVhdGVyIHRoYW4gTUFYOiVkXG4iLAorCQkgICAgICAgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgTUFYX1BIWVNfSU5GTyk7CisJCWRlbF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywgKHVpbnRwdHJfdCkgaW5zZXJ0X2xvY2F0aW9uKTsKKwkJa2ZyZWUoY21kcnNwKTsKKwkJcmV0dXJuIDE7CS8qIHJlamVjdCB0aGUgY29tbWFuZCAqLworCX0KKworCS8qIFRoaXMgaXMgd2hhdCB3ZSBVU0VEIHRvIGRvIHdoZW4gd2UgYXNzdW1lZCB3ZSB3ZXJlIHJ1bm5pbmcgKi8KKwkvKiB1aXNzZCAmIHZpcnRoYmEgb24gdGhlIHNhbWUgTGludXggc3lzdGVtLiAqLworCS8qIGNtZHJzcC0+c2NzaS5idWZmZXIgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlcjsgKi8KKwkvKiBUaGUgZm9sbG93aW5nIGNvZGUgZG9lcyBOT1QgbWFrZSB0aGF0IGFzc3VtcHRpb24uICovCisJLyogY29udmVydCBidWZmZXIgdG8gcGh5cyBpbmZvcm1hdGlvbiAqLworCWlmIChzY3NpX3NnX2NvdW50KHNjc2ljbWQpID09IDApIHsKKwkJaWYgKHNjc2lfYnVmZmxlbihzY3NpY21kKSA+IDApIHsKKwkJCUxPR0VSUigiKioqKiBGQUlMRUQgTm8gc2NhdHRlciBsaXN0IGZvciBidWZmbGVuID4gMFxuIik7CisJCQlCVUdfT04oc2NzaV9zZ19jb3VudChzY3NpY21kKSA9PSAwKTsKKwkJfQorCQlEQkdJTkYoIk5vIHNnOyBidWZmZXI6MHglcCBidWZmbGVuOiVkXG4iLAorCQkgICAgICAgc2NzaV9zZ2xpc3Qoc2NzaWNtZCksIHNjc2lfYnVmZmxlbihzY3NpY21kKSk7CisJfSBlbHNlIHsKKwkJLyogYnVmZmVyIGlzIHNjYXR0ZXJsaXN0IC0gY29weSBpdCBvdXQgKi8KKwkJc2dsID0gc2NzaV9zZ2xpc3Qoc2NzaWNtZCk7CisKKwkJZm9yX2VhY2hfc2coc2dsLCBzZywgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgaSkgeworCisJCQljbWRyc3AtPnNjc2kuZ3BpX2xpc3RbaV0uYWRkcmVzcyA9IHNnX3BoeXMoc2cpOworCQkJY21kcnNwLT5zY3NpLmdwaV9saXN0W2ldLmxlbmd0aCA9IHNnLT5sZW5ndGg7CisJCQlpZiAoKGkgIT0gMCkgJiYgKHNnLT5vZmZzZXQgIT0gMCkpCisJCQkJTE9HSU5GKCJPZmZzZXQgb24gYSBzZ19lbnRyeSBvdGhlciB0aGFuIHplcm8gPTw8JWQ+Pi5cbiIsCisJCQkJICAgICBzZy0+b2Zmc2V0KTsKKwkJfQorCisJCWlmIChzZ19mYWlsZWQpIHsKKwkJCUxPR0VSUigiU3RhcnQgc2dfbGlzdCBkdW1wIChlbnRyaWVzICVkLCBidWZmbGVuICVkKS4uLlxuIiwKKwkJCSAgICAgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgY21kcnNwLT5zY3NpLmJ1ZmZsZW4pOworCQkJZm9yX2VhY2hfc2coc2dsLCBzZywgc2NzaV9zZ19jb3VudChzY3NpY21kKSwgaSkgeworCQkJCUxPR0VSUigiICAgRW50cnkoJWQpOiBwYWdlLT5bMHglcF0sIHBoeXMtPlsweCVMeF0sIG9mZiglZCksIGxlbiglZClcbiIsCisJCQkJICAgICBpLCBzZ19wYWdlKHNnKSwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNnX3BoeXMoc2cpLAorCQkJCSAgICAgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCk7CisJCQl9CisJCQlMT0dFUlIoIkRvbmUgc2dfbGlzdCBkdW1wLlxuIik7CisJCQkvKiBCVUcoKTsgKioqKiogRm9yIG5vdywgbGV0IGl0IGZhaWwgaW4gdWlzc2QKKwkJCSAqIGlmIGl0IGlzIGEgcHJvYmxlbSwgYXMgaXQgbWlnaHQganVzdAorCQkJICogd29yaworCQkJICovCisJCX0KKworCQljbWRyc3AtPnNjc2kuZ3Vlc3RfcGh5c19lbnRyaWVzID0gc2NzaV9zZ19jb3VudChzY3NpY21kKTsKKwl9CisKKwlvcCA9IGNkYlswXTsKKwlpID0gdWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2tfY2xpZW50KHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLAorCQkJCQkJIGNtZHJzcCwgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkJCSAmdmlydGhiYWluZm8tPmNoaW5mby4KKwkJCQkJCSBpbnNlcnRsb2NrLAorCQkJCQkJIERPTlRfSVNTVUVfSU5URVJSVVBULAorCQkJCQkJIChVNjQpIE5VTEwsIERPTlRfV0FJVCwgInZoYmEiKTsKKwlpZiAoaSA9PSAwKSB7CisJCS8qIHF1ZXVlIG11c3QgYmUgZnVsbCAtIGFuZCB3ZSBzYWlkIGRvbid0IHdhaXQgLSByZXR1cm4gYnVzeSAqLworCQlMT0dFUlIoInVpc3F1ZXVlX3B1dF9jbWRyc3Bfd2l0aF9sb2NrICoqKipGQUlMRURcbiIpOworCQlrZnJlZShjbWRyc3ApOworCQlkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sICh1aW50cHRyX3QpIGluc2VydF9sb2NhdGlvbik7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisJfQorCisJLyogd2UncmUgZG9uZSB3aXRoIGNtZHJzcCBzcGFjZSAtIGRhdGEgZnJvbSBpdCBoYXMgYmVlbiBjb3BpZWQKKwkgKiBpbnRvIGNoYW5uZWwgLSBmcmVlIGl0IG5vdy4KKwkgKi8KKwlrZnJlZShjbWRyc3ApOworCXJldHVybiAwOwkJLyogbm9uLXplcm8gaW1wbGllcyBob3N0L2RldmljZSBpcyBidXN5ICovCit9CisKK3N0YXRpYyBpbnQKK3ZpcnRoYmFfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KQoreworCS8qIHRoaXMgY2FsbGVkIGJ5IHRoZSBtaWRsYXllciBiZWZvcmUgc2NhbiBmb3IgbmV3IGRldmljZXMgLQorCSAqIExMRCBjYW4gYWxsb2MgYW55IHN0cnVjICYgZG8gaW5pdCBpZiBuZWVkZWQuCisJICovCisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrOworCXN0cnVjdCB2aXJ0ZGlza19pbmZvICp0bXB2ZGlzazsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopIHNjc2lkZXYtPmhvc3Q7CisKKwl2aXJ0aGJhaW5mbyA9IChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lob3N0LT5ob3N0ZGF0YTsKKwlpZiAoIXZpcnRoYmFpbmZvKSB7CisJCUxPR0VSUigiQ291bGQgbm90IGZpbmQgdmlydGhiYV9pbmZvIGZvciBzY3NpaG9zdFxuIik7CisJCXJldHVybiAwOwkvKiBldmVuIHRob3VnaCB3ZSBlcnJvcmVkLCB0cmVhdCBhcyBzdWNjZXNzICovCisJfQorCWZvciAodmRpc2sgPSAmdmlydGhiYWluZm8tPmhlYWQ7IHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICh2ZGlzay0+bmV4dC0+dmFsaWQgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+Y2hhbm5lbCA9PSBzY3NpZGV2LT5jaGFubmVsKSAmJgorCQkgICAgKHZkaXNrLT5uZXh0LT5pZCA9PSBzY3NpZGV2LT5pZCkgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+bHVuID09IHNjc2lkZXYtPmx1bikpCisJCQlyZXR1cm4gMDsKKwl9CisJdG1wdmRpc2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlydGRpc2tfaW5mbyksIEdGUF9BVE9NSUMpOworCWlmICghdG1wdmRpc2spIHsJLyogZXJyb3IgYWxsb2NhdGluZyAqLworCQlMT0dFUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRpc2tcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0bXB2ZGlzay0+Y2hhbm5lbCA9IHNjc2lkZXYtPmNoYW5uZWw7CisJdG1wdmRpc2stPmlkID0gc2NzaWRldi0+aWQ7CisJdG1wdmRpc2stPmx1biA9IHNjc2lkZXYtPmx1bjsKKwl0bXB2ZGlzay0+dmFsaWQgPSAxOworCXZkaXNrLT5uZXh0ID0gdG1wdmRpc2s7CisJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCit9CisKK3N0YXRpYyBpbnQKK3ZpcnRoYmFfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldikKK3sKKwlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KK30KKworc3RhdGljIHZvaWQKK3ZpcnRoYmFfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpCit7CisJLyogbWlkbGV2ZWwgY2FsbHMgdGhpcyBhZnRlciBkZXZpY2UgaGFzIGJlZW4gcXVpZXNjZWQgYW5kCisJICogYmVmb3JlIGl0IGlzIHRvIGJlIGRlbGV0ZWQuCisJICovCisJc3RydWN0IHZpcnRkaXNrX2luZm8gKnZkaXNrLCAqZGVsdmRpc2s7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm87CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaWhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKSBzY3NpZGV2LT5ob3N0OworCisJdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSBzY3NpaG9zdC0+aG9zdGRhdGE7CisJaWYgKCF2aXJ0aGJhaW5mbykKKwkJTE9HRVJSKCJDb3VsZCBub3QgZmluZCB2aXJ0aGJhX2luZm8gZm9yIHNjc2lob3N0XG4iKTsKKwlmb3IgKHZkaXNrID0gJnZpcnRoYmFpbmZvLT5oZWFkOyB2ZGlzay0+bmV4dDsgdmRpc2sgPSB2ZGlzay0+bmV4dCkgeworCQlpZiAodmRpc2stPm5leHQtPnZhbGlkICYmCisJCSAgICAodmRpc2stPm5leHQtPmNoYW5uZWwgPT0gc2NzaWRldi0+Y2hhbm5lbCkgJiYKKwkJICAgICh2ZGlzay0+bmV4dC0+aWQgPT0gc2NzaWRldi0+aWQpICYmCisJCSAgICAodmRpc2stPm5leHQtPmx1biA9PSBzY3NpZGV2LT5sdW4pKSB7CisJCQlkZWx2ZGlzayA9IHZkaXNrLT5uZXh0OworCQkJdmRpc2stPm5leHQgPSB2ZGlzay0+bmV4dC0+bmV4dDsKKwkJCWtmcmVlKGRlbHZkaXNrKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNjc2kgQ21uZCBzdXBwb3J0IHRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2RvX3Njc2lfbGludXhzdGF0KHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCwgc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCkKK3sKKwlzdHJ1Y3QgdmlydGRpc2tfaW5mbyAqdmRpc2s7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2OworCXN0cnVjdCBzZW5zZV9kYXRhICpzZDsKKworCXNjc2lkZXYgPSBzY3NpY21kLT5kZXZpY2U7CisJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgY21kcnNwLT5zY3NpLnNlbnNlYnVmLCBNQVhfU0VOU0VfU0laRSk7CisJc2QgPSAoc3RydWN0IHNlbnNlX2RhdGEgKikgc2NzaWNtZC0+c2Vuc2VfYnVmZmVyOworCisJLyogRG8gbm90IGxvZyBlcnJvcnMgZm9yIGRpc2stbm90LXByZXNlbnQgaW5xdWlyaWVzICovCisJaWYgKChjbWRyc3AtPnNjc2kuY21uZFswXSA9PSBJTlFVSVJZKSAmJgorCSAgICAoaG9zdF9ieXRlKGNtZHJzcC0+c2NzaS5saW51eHN0YXQpID09IERJRF9OT19DT05ORUNUKSAmJgorCSAgICAoY21kcnNwLT5zY3NpLmFkZGxzdGF0ID09IEFERExfU0VMX1RJTUVPVVQpKQorCQlyZXR1cm47CisKKwkvKiBPa2F5IHNlZSB3aGF0IG91ciBlcnJvcl9jb3VudCBpcyBoZXJlLi4uLiAqLworCWZvciAodmRpc2sgPSAmKChzdHJ1Y3QgdmlydGhiYV9pbmZvICopIHNjc2lkZXYtPmhvc3QtPmhvc3RkYXRhKS0+aGVhZDsKKwkgICAgIHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CisJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCAhPSB2ZGlzay0+Y2hhbm5lbCkKKwkJICAgIHx8IChzY3NpZGV2LT5pZCAhPSB2ZGlzay0+aWQpCisJCSAgICB8fCAoc2NzaWRldi0+bHVuICE9IHZkaXNrLT5sdW4pKQorCQkJY29udGludWU7CisKKwkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwgVklSVEhCQV9FUlJPUl9DT1VOVCkgeworCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKKwkJCUxPR0VSUigiU0NTSUNNRCAqKioqRkFJTEVEIHNjc2ljbWQ6MHglcCBvcDoweCV4IDwlZDolZDolZDolZD4gMHgleC0weCV4LTB4JXgtMHgleC0weCV4LlxuIiwKKwkJCSAgICAgICBzY3NpY21kLCBjbWRyc3AtPnNjc2kuY21uZFswXSwKKwkJCSAgICAgICBzY3NpZGV2LT5ob3N0LT5ob3N0X25vLCBzY3NpZGV2LT5pZCwKKwkJCSAgICAgICBzY3NpZGV2LT5jaGFubmVsLCBzY3NpZGV2LT5sdW4sCisJCQkgICAgICAgY21kcnNwLT5zY3NpLmxpbnV4c3RhdCwgc2QtPlZhbGlkLCBzZC0+U2Vuc2VLZXksCisJCQkgICAgICAgc2QtPkFkZGl0aW9uYWxTZW5zZUNvZGUsCisJCQkgICAgICAgc2QtPkFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXIpOworCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpID09CisJCQkgICAgVklSVEhCQV9FUlJPUl9DT1VOVCkgeworCQkJCUxPR0VSUigiVGhyb3RsaW5nIFNDU0lDTUQgZXJyb3JzIGRpc2sgPCVkOiVkOiVkOiVkPlxuIiwKKwkJCQkgICAgIHNjc2lkZXYtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkZXYtPmlkLAorCQkJCSAgICAgc2NzaWRldi0+Y2hhbm5lbCwgc2NzaWRldi0+bHVuKTsKKwkJCX0KKwkJCWF0b21pY19zZXQoJnZkaXNrLT5pb3NfdGhyZXNob2xkLCBJT1NfRVJST1JfVEhSRVNIT0xEKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2RvX3Njc2lfbm9saW51eHN0YXQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszNl07CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICp0aGlzcGFnZTsKKwljaGFyICp0aGlzcGFnZV9vcmlnOworCWludCBidWZpbmQgPSAwOworCXN0cnVjdCB2aXJ0ZGlza19pbmZvICp2ZGlzazsKKworCXNjc2lkZXYgPSBzY3NpY21kLT5kZXZpY2U7CisJaWYgKChjbWRyc3AtPnNjc2kuY21uZFswXSA9PSBJTlFVSVJZKQorCSAgICAmJiAoY21kcnNwLT5zY3NpLmJ1ZmZsZW4gPj0gTUlOX0lOUVVJUllfUkVTVUxUX0xFTikpIHsKKwkJaWYgKGNtZHJzcC0+c2NzaS5ub19kaXNrX3Jlc3VsdCA9PSAwKQorCQkJcmV0dXJuOworCisJCS8qIExpbnV4IHNjc2kgY29kZSBpcyB3ZWlyZDsgaXQgd2FudHMKKwkJICogYSBkZXZpY2UgYXQgTHVuIDAgdG8gaXNzdWUgcmVwb3J0CisJCSAqIGx1bnMsIGJ1dCB3ZSBkb24ndCB3YW50IGEgZGlzaworCQkgKiB0aGVyZSBzbyB3ZSdsbCBwcmVzZW50IGEgcHJvY2Vzc29yCisJCSAqIHRoZXJlLiAqLworCQlTRVRfTk9fRElTS19JTlFVSVJZX1JFU1VMVChidWYsIGNtZHJzcC0+c2NzaS5idWZmbGVuLAorCQkJCQkgICBzY3NpZGV2LT5sdW4sCisJCQkJCSAgIERFVl9ESVNLX0NBUEFCTEVfTk9UX1BSRVNFTlQsCisJCQkJCSAgIERFVl9OT1RfQ0FQQUJMRSk7CisKKwkJaWYgKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0gMCkgeworCQkJaWYgKHNjc2lfYnVmZmxlbihzY3NpY21kKSA+IDApIHsKKwkJCQlMT0dFUlIoIioqKiogRkFJTEVEIE5vIHNjYXR0ZXIgbGlzdCBmb3IgYnVmZmxlbiA+IDBcbiIpOworCQkJCUJVR19PTihzY3NpX3NnX2NvdW50KHNjc2ljbWQpID09CisJCQkJICAgICAgIDApOworCQkJfQorCQkJbWVtY3B5KHNjc2lfc2dsaXN0KHNjc2ljbWQpLCBidWYsCisJCQkgICAgICAgY21kcnNwLT5zY3NpLmJ1ZmZsZW4pOworCQkJcmV0dXJuOworCQl9CisKKwkJc2cgPSBzY3NpX3NnbGlzdChzY3NpY21kKTsKKwkJZm9yIChpID0gMDsgaSA8IHNjc2lfc2dfY291bnQoc2NzaWNtZCk7IGkrKykgeworCQkJREJHVkVSKCJjb3B5aW5nIE9VVCBPRiBidWYgaW50byAweCVwICVkXG4iLAorCQkJICAgICBzZ19wYWdlKHNnICsgaSksIHNnW2ldLmxlbmd0aCk7CisJCQl0aGlzcGFnZV9vcmlnID0ga21hcF9hdG9taWMoc2dfcGFnZShzZyArIGkpKTsKKwkJCXRoaXNwYWdlID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKXRoaXNwYWdlX29yaWcgfAorCQkJCQkgICAgIHNnW2ldLm9mZnNldCk7CisJCQltZW1jcHkodGhpc3BhZ2UsIGJ1ZiArIGJ1ZmluZCwgc2dbaV0ubGVuZ3RoKTsKKwkJCWt1bm1hcF9hdG9taWModGhpc3BhZ2Vfb3JpZyk7CisJCQlidWZpbmQgKz0gc2dbaV0ubGVuZ3RoOworCQl9CisJfSBlbHNlIHsKKworCQl2ZGlzayA9ICYoKHN0cnVjdCB2aXJ0aGJhX2luZm8gKilzY3NpZGV2LT5ob3N0LT5ob3N0ZGF0YSktPmhlYWQ7CisJCWZvciAoIDsgdmRpc2stPm5leHQ7IHZkaXNrID0gdmRpc2stPm5leHQpIHsKKwkJCWlmICgoc2NzaWRldi0+Y2hhbm5lbCAhPSB2ZGlzay0+Y2hhbm5lbCkKKwkJCSAgICB8fCAoc2NzaWRldi0+aWQgIT0gdmRpc2stPmlkKQorCQkJICAgIHx8IChzY3NpZGV2LT5sdW4gIT0gdmRpc2stPmx1bikpCisJCQkJY29udGludWU7CisKKwkJCWlmIChhdG9taWNfcmVhZCgmdmRpc2stPmlvc190aHJlc2hvbGQpID4gMCkgeworCQkJCWF0b21pY19kZWMoJnZkaXNrLT5pb3NfdGhyZXNob2xkKTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5pb3NfdGhyZXNob2xkKSA9PSAwKSB7CisJCQkJCUxPR0VSUigiUmVzZXR0aW5nIGVycm9yIGNvdW50IGZvciBkaXNrXG4iKTsKKwkJCQkJYXRvbWljX3NldCgmdmRpc2stPmVycm9yX2NvdW50LCAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjb21wbGV0ZV9zY3NpX2NvbW1hbmQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQoreworCURCR0lORigiY21kcnNwOiAweCVwLCBzY3Npc3RhdDoweCV4LlxuIiwgY21kcnNwLCBjbWRyc3AtPnNjc2kuc2NzaXN0YXQpOworCisJLyogdGFrZSB3aGF0IHdlIG5lZWQgb3V0IG9mIGNtZHJzcCBhbmQgY29tcGxldGUgdGhlIHNjc2ljbWQgKi8KKwlzY3NpY21kLT5yZXN1bHQgPSBjbWRyc3AtPnNjc2kubGludXhzdGF0OworCWlmIChjbWRyc3AtPnNjc2kubGludXhzdGF0KQorCQlkb19zY3NpX2xpbnV4c3RhdChjbWRyc3AsIHNjc2ljbWQpOworCWVsc2UKKwkJZG9fc2NzaV9ub2xpbnV4c3RhdChjbWRyc3AsIHNjc2ljbWQpOworCisJaWYgKHNjc2ljbWQtPnNjc2lfZG9uZSkgeworCQlEQkdWRVIoIlNjc2lfRE9ORVxuIik7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY29tcGxldGVfdmRpc2ttZ210X2NvbW1hbmQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwKQoreworCS8qIGNvcHkgdGhlIHJlc3VsdCBvZiB0aGUgdGFza21nbXQgYW5kICovCisJLyogd2FrZSB1cCB0aGUgZXJyb3IgaGFuZGxlciB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoaXMgKi8KKwkqKGludCAqKSBjbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnlyZXN1bHQgPSBjbWRyc3AtPnZkaXNrbWdtdC5yZXN1bHQ7CisJd2FrZV91cF9hbGwoKHdhaXRfcXVldWVfaGVhZF90ICopIGNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeSk7CisJTE9HSU5GKCJzZXQgbm90aWZ5IHJlc3VsdCB0byAlZFxuIiwgY21kcnNwLT52ZGlza21nbXQucmVzdWx0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjb21wbGV0ZV90YXNrbWdtdF9jb21tYW5kKHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCkKK3sKKwkvKiBjb3B5IHRoZSByZXN1bHQgb2YgdGhlIHRhc2ttZ210IGFuZCAqLworCS8qIHdha2UgdXAgdGhlIGVycm9yIGhhbmRsZXIgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGlzICovCisJKihpbnQgKikgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5cmVzdWx0ID0KKwkgICAgY21kcnNwLT5zY3NpdGFza21nbXQucmVzdWx0OworCXdha2VfdXBfYWxsKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKSBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCUxPR0lORigic2V0IG5vdGlmeSByZXN1bHQgdG8gJWRcbiIsIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdCk7Cit9CisKK3N0YXRpYyB2b2lkCitkcmFpbl9xdWV1ZShzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbywgc3RydWN0IGNoYW5pbmZvICpkYywKKwkJc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHFyc2x0ID0gMDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdmlydGhiYWluZm8tPnNjc2lob3N0OworCisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywgZmxhZ3MpOworCQlpZiAoIVVMVFJBX0NIQU5ORUxfQ0xJRU5UX0FDUVVJUkVfT1MoZGMtPnF1ZXVlaW5mby0+Y2hhbiwKKwkJCQkJCSAgICAgInZoYmEiLCBOVUxMKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrLAorCQkJCQkgICAgICAgZmxhZ3MpOworCQkJdmlydGhiYWluZm8tPmFjcXVpcmVfZmFpbGVkX2NudCsrOworCQkJYnJlYWs7CisJCX0KKwkJcXJzbHQgPSB1aXNxdWV1ZV9nZXRfY21kcnNwKGRjLT5xdWV1ZWluZm8sIGNtZHJzcCwKKwkJCQkJICAgIElPQ0hBTl9GUk9NX0lPUEFSVCk7CisJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1JFTEVBU0VfT1MoZGMtPnF1ZXVlaW5mby0+Y2hhbiwKKwkJCQkJCSJ2aGJhIiwgTlVMTCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywgZmxhZ3MpOworCQlpZiAocXJzbHQgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoY21kcnNwLT5jbWR0eXBlID09IENNRF9TQ1NJX1RZUEUpIHsKKwkJCS8qIHNjc2ljbWQgbG9jYXRpb24gaXMgcmV0dXJuZWQgYnkgdGhlCisJCQkgKiBkZWxldGlvbgorCQkJICovCisJCQlzY3NpY21kID0gZGVsX3Njc2lwZW5kaW5nX2VudHJ5KHZpcnRoYmFpbmZvLAorCQkJCQkodWludHB0cl90KSBjbWRyc3AtPnNjc2kuc2NzaWNtZCk7CisJCQlpZiAoIXNjc2ljbWQpCisJCQkJYnJlYWs7CisJCQkvKiBjb21wbGV0ZSB0aGUgb3JpZyBjbWQgKi8KKwkJCWNvbXBsZXRlX3Njc2lfY29tbWFuZChjbWRyc3AsIHNjc2ljbWQpOworCQl9IGVsc2UgaWYgKGNtZHJzcC0+Y21kdHlwZSA9PSBDTURfU0NTSVRBU0tNR01UX1RZUEUpIHsKKwkJCWlmICghZGVsX3Njc2lwZW5kaW5nX2VudHJ5KHZpcnRoYmFpbmZvLAorCQkJCSAgICh1aW50cHRyX3QpIGNtZHJzcC0+c2NzaXRhc2ttZ210LnNjc2ljbWQpKQorCQkJCWJyZWFrOworCQkJY29tcGxldGVfdGFza21nbXRfY29tbWFuZChjbWRyc3ApOworCQl9IGVsc2UgaWYgKGNtZHJzcC0+Y21kdHlwZSA9PSBDTURfTk9USUZZR1VFU1RfVFlQRSkgeworCQkJLyogVGhlIHZIYmEgcG9pbnRlciBoYXMgbm8gbWVhbmluZyBpbgorCQkJICogYSBDbGllbnQvR3Vlc3QgUGFydGl0aW9uLiBMZXQncyBiZQorCQkJICogc2FmZSBhbmQgc2V0IGl0IHRvIE5VTEwgbm93LiAgRG8KKwkJCSAqIG5vdCB1c2UgaXQgaGVyZSEgKi8KKwkJCWNtZHJzcC0+ZGlza25vdGlmeS52SGJhID0gTlVMTDsKKwkJCXByb2Nlc3NfZGlza19ub3RpZnkoc2hvc3QsIGNtZHJzcCk7CisJCX0gZWxzZSBpZiAoY21kcnNwLT5jbWR0eXBlID09IENNRF9WRElTS01HTVRfVFlQRSkgeworCQkJaWYgKCFkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sCisJCQkJICAgKHVpbnRwdHJfdCkgY21kcnNwLT52ZGlza21nbXQuc2NzaWNtZCkpCisJCQkJYnJlYWs7CisJCQljb21wbGV0ZV92ZGlza21nbXRfY29tbWFuZChjbWRyc3ApOworCQl9IGVsc2UKKwkJCUxPR0VSUigiSW52YWxpZCBjbWR0eXBlICVkXG4iLCBjbWRyc3AtPmNtZHR5cGUpOworCQkvKiBjbWRyc3AgaXMgbm93IGF2YWlsYWJsZSBmb3IgcmV1c2UgKi8KKwl9Cit9CisKKworLyogbWFpbiBmdW5jdGlvbiBmb3IgdGhlIHRocmVhZCB0aGF0IHdhaXRzIGZvciBzY3NpIGNvbW1hbmRzIHRvIGFycml2ZQorICogaW4gYSBzcGVjaWZpZWQgcXVldWUKKyAqLworc3RhdGljIGludAorcHJvY2Vzc19pbmNvbWluZ19yc3BzKHZvaWQgKnYpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPSB2OworCXN0cnVjdCBjaGFuaW5mbyAqZGMgPSAmdmlydGhiYWluZm8tPmNoaW5mbzsKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AgPSBOVUxMOworCWNvbnN0IGludCBTWiA9IHNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKTsKKwlVNjQgbWFzazsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmMxOworCisJVUlTX0RBRU1PTklaRSgidmhiYV9pbmNvbWluZyIpOworCS8qIGFsbG9jIG9uY2UgYW5kIHJldXNlICovCisJY21kcnNwID0ga21hbGxvYyhTWiwgR0ZQX0FUT01JQyk7CisJaWYgKGNtZHJzcCA9PSBOVUxMKSB7CisJCUxPR0VSUigicHJvY2Vzc19pbmNvbWluZ19yc3BzICoqKipGQUlMRUQgdG8gbWFsbG9jIC0gdGhyZWFkIGV4aXRpbmdcbiIpOworCQljb21wbGV0ZV9hbmRfZXhpdCgmZGMtPnRocmVhZGluZm8uaGFzX3N0b3BwZWQsIDApOworCQlyZXR1cm4gMDsKKwl9CisJbWFzayA9IFVMVFJBX0NIQU5ORUxfRU5BQkxFX0lOVFM7CisJd2hpbGUgKDEpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodmlydGhiYWluZm8tPnJzcF9xdWV1ZSwKKwkJCSAoYXRvbWljX3JlYWQoJnZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfcmN2ZCkgPT0gMSksCisJCQkJCSB1c2Vjc190b19qaWZmaWVzKHJzbHRxX3dhaXRfdXNlY3MpKTsKKwkJYXRvbWljX3NldCgmdmlydGhiYWluZm8tPmludGVycnVwdF9yY3ZkLCAwKTsKKwkJLyogZHJhaW4gcXVldWUgKi8KKwkJZHJhaW5fcXVldWUodmlydGhiYWluZm8sIGRjLCBjbWRyc3ApOworCQlyYzEgPSB1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKHZpcnRoYmFpbmZvLT5mbGFnc19hZGRyLCBtYXNrKTsKKwkJaWYgKGRjLT50aHJlYWRpbmZvLnNob3VsZF9zdG9wKQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWUoY21kcnNwKTsKKworCURCR0lORigiZXhpdGluZyBwcm9jZXNzaW5nIGluY29taW5nIHJzcHMuXG4iKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmZGMtPnRocmVhZGluZm8uaGFzX3N0b3BwZWQsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwcm9jIGZpbGVzeXN0ZW0gZnVuY3Rpb25zCQkJCQkJICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90CitpbmZvX3Byb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IGxlbmd0aCA9IDA7CisJVTY0IHBoeXNfZmxhZ3NfYWRkcjsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwljaGFyICp2YnVmOworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA+IDAgfHwgIWxlbikKKwkJcmV0dXJuIDA7CisKKwl2YnVmID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghdmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgVklSVEhCQVNPUEVOTUFYOyBpKyspIHsKKwkJaWYgKFZpcnRIYmFzT3BlbltpXS52aXJ0aGJhaW5mbyA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJdmlydGhiYWluZm8gPSBWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm87CisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJDSEFOU09DSyBpcyBub3QgZGVmaW5lZC5cbiIpOworCisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJNYXhCdWZmTGVuOiVkXG4iLCBNYXhCdWZmTGVuKTsKKworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG52aXJ0aGJhIHJlc3VsdCBxdWV1ZSBwb2xsIHdhaXQ6JWQgdXNlY3MuXG4iLAorCQkJCSAgcnNsdHFfd2FpdF91c2Vjcyk7CisKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwKKwkJCQkgICJcbk1vZHVsZSBidWlsZDogRGF0ZTolcyBUaW1lOiVzXG4iLAorCQkJCSAgX19EQVRFX18sIF9fVElNRV9fKTsKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuaW50ZXJydXB0c19yY3ZkID0gJWxsdSwgaW50ZXJydXB0c19kaXNhYmxlZCA9ICVsbHVcbiIsCisJCQkJICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0c19yY3ZkLAorCQkJCSAgdmlydGhiYWluZm8tPmludGVycnVwdHNfZGlzYWJsZWQpOworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG5pbnRlcnJ1cHRzX25vdG1lID0gJWxsdSxcbiIsCisJCQkJICB2aXJ0aGJhaW5mby0+aW50ZXJydXB0c19ub3RtZSk7CisJCXBoeXNfZmxhZ3NfYWRkciA9IHZpcnRfdG9fcGh5cygoX19mb3JjZSAgdm9pZCAqKQorCQkJCQkgICAgICAgdmlydGhiYWluZm8tPmZsYWdzX2FkZHIpOworCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiZmxhZ3NfYWRkciA9ICVwLCBwaHlzX2ZsYWdzX2FkZHI9MHglMDE2bGx4LCBGZWF0dXJlRmxhZ3M9JWxsdVxuIiwKKwkJCSAgdmlydGhiYWluZm8tPmZsYWdzX2FkZHIsIHBoeXNfZmxhZ3NfYWRkciwKKwkJCQkgIChfX2xlNjQpcmVhZHEodmlydGhiYWluZm8tPmZsYWdzX2FkZHIpKTsKKwkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgImFjcXVpcmVfZmFpbGVkX2NudDolbGx1XG4iLAorCQkJCSAgdmlydGhiYWluZm8tPmFjcXVpcmVfZmFpbGVkX2NudCk7CisJCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJcbiIpOworCX0KKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmJ1ZiwgbGVuZ3RoKSkgeworCQlrZnJlZSh2YnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUodmJ1Zik7CisJKm9mZnNldCArPSBsZW5ndGg7CisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHNzaXplX3QKK2VuYWJsZV9pbnRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitlbmFibGVfaW50c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1Zls0XTsKKwlpbnQgaSwgbmV3X3ZhbHVlOworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvOworCVU2NCBfX2lvbWVtICpGZWF0dXJlc19hZGRyOworCVU2NCBtYXNrOworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWZbY291bnRdID0gJ1wwJzsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC4gYnVmPDwlLipzPj4gY291bnQ8PCVsdT4+XG4iLAorCQkgICAgICAgKGludCkgY291bnQsIGJ1ZiwgY291bnQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJm5ld192YWx1ZSk7CisKKwlpZiAoaSA8IDEpIHsKKwkJTE9HRVJSKCJGYWlsZWQgdG8gc2NhbiB2YWx1ZSBmb3IgZW5hYmxlX2ludHMsIGJ1Zjw8JS4qcz4+IiwKKwkJICAgICAgIChpbnQpIGNvdW50LCBidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBzZXQgYWxsIGNvdW50cyB0byBuZXdfdmFsdWUgdXN1YWxseSAwICovCisJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7CisJCWlmIChWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm8gIT0gTlVMTCkgeworCQkJdmlydGhiYWluZm8gPSBWaXJ0SGJhc09wZW5baV0udmlydGhiYWluZm87CisJCQlGZWF0dXJlc19hZGRyID0KKwkJCQkmdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW4tPkZlYXR1cmVzOworCQkJaWYgKG5ld192YWx1ZSA9PSAxKSB7CisJCQkJbWFzayA9IH4oVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HIHwKKwkJCQkJIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTKTsKKwkJCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZChGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJCQltYXNrID0gVUxUUkFfSU9fRFJJVkVSX0VOQUJMRVNfSU5UUzsKKwkJCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZE9yKEZlYXR1cmVzX2FkZHIsIG1hc2spOworCQkJCXJzbHRxX3dhaXRfdXNlY3MgPSA0MDAwMDAwOworCQkJfSBlbHNlIHsKKwkJCQltYXNrID0gfihVTFRSQV9JT19EUklWRVJfRU5BQkxFU19JTlRTIHwKKwkJCQkJIFVMVFJBX0lPX0RSSVZFUl9ESVNBQkxFU19JTlRTKTsKKwkJCQl1aXNxdWV1ZV9JbnRlcmxvY2tlZEFuZChGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJCQltYXNrID0gVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HOworCQkJCXVpc3F1ZXVlX0ludGVybG9ja2VkT3IoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCQkJcnNsdHFfd2FpdF91c2VjcyA9IDQwMDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorcnF3dV9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlsxNl07CisJaW50IGksIHVzZWNzOworCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC4gYnVmPDwlLipzPj4gY291bnQ8PCVsdT4+XG4iLAorCQkgICAgICAgKGludCkgY291bnQsIGJ1ZiwgY291bnQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnVzZWNzKTsKKworCWlmIChpIDwgMSkgeworCQlMT0dFUlIoIkZhaWxlZCB0byBzY2FuIHZhbHVlIGZvciBycXdhaXRfdXNlY3MgYnVmPDwlLipzPj4iLAorCQkgICAgICAgKGludCkgY291bnQsIGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIHNldCBnbG9iYWwgd2FpdCB0aW1lICovCisJcnNsdHFfd2FpdF91c2VjcyA9IHVzZWNzOworCXJldHVybiBjb3VudDsKK30KKworLyogQXMgcGVyIFZpcnRwY2lGdW5jIHJldHVybnMgMSBmb3Igc3VjY2VzcyBhbmQgMCBmb3IgZmFpbHVyZSAqLworc3RhdGljIGludAordmlydGhiYV9zZXJ2ZXJ1cChzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYpCit7CisJc3RydWN0IHZpcnRoYmFfaW5mbyAqdmlydGhiYWluZm8gPQorCSAgICAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKSAoKHN0cnVjdCBTY3NpX0hvc3QgKikgdmlydHBjaWRldi0+c2NzaS4KKwkJCQkgICAgIHNjc2lob3N0KS0+aG9zdGRhdGE7CisKKwlEQkdJTkYoInZpcnRwY2lkZXYgYnVzTm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c05vLAorCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2VObyk7CisKKwlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duKSB7CisJCURCR0lORigiU2VydmVyIHVwIG1lc3NhZ2UgcmVjaWV2ZWQgd2hpbGUgc2VydmVyIGlzIGFscmVhZHkgdXAuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSkgeworCQlMT0dFUlIoIlNlcnZlciBhbHJlYWR5IHByb2Nlc3NpbmcgY2hhbmdlIHN0YXRlIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IHRydWU7CisJLyogTXVzdCB0cmFuc2l0aW9uIGNoYW5uZWwgdG8gQVRUQUNIRUQgc3RhdGUgQkVGT1JFIHdlCisJICogY2FuIHN0YXJ0IHVzaW5nIHRoZSBkZXZpY2UgYWdhaW4KKwkgKi8KKwlVTFRSQV9DSEFOTkVMX0NMSUVOVF9UUkFOU0lUSU9OKHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLAorCQkJCQlkZXZfbmFtZSgmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYpLAorCQkJCQlDSEFOTkVMQ0xJX0FUVEFDSEVELCBOVUxMKTsKKworCS8qIFN0YXJ0IFByb2Nlc3NpbmcgdGhlIElPVk0gUmVzcG9uc2UgUXVldWUgQWdhaW4gKi8KKwlpZiAoIXVpc3RocmVhZF9zdGFydCgmdmlydGhiYWluZm8tPmNoaW5mby50aHJlYWRpbmZvLAorCQkJICAgICBwcm9jZXNzX2luY29taW5nX3JzcHMsCisJCQkgICAgIHZpcnRoYmFpbmZvLCAidmhiYV9pbmNvbWluZyIpKSB7CisJCUxPR0VSUigidWlzdGhyZWFkX3N0YXJ0IHJzcCAqKioqRkFJTEVEXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duID0gZmFsc2U7CisJdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUgPSBmYWxzZTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAordmlydGhiYV9zZXJ2ZXJkb3duX2NvbXBsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmlydGhiYV9pbmZvICp2aXJ0aGJhaW5mbzsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXY7CisJaW50IGk7CisJc3RydWN0IHNjc2lwZW5kaW5nICpwZW5kaW5nZGVsID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kID0gTlVMTDsKKwlzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXZpcnRoYmFpbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2aXJ0aGJhX2luZm8sCisJCQkJICAgc2VydmVyZG93bl9jb21wbGV0aW9uKTsKKworCS8qIFN0b3AgVXNpbmcgdGhlIElPVk0gUmVzcG9uc2UgUXVldWUgKHF1ZXVlIHNob3VsZCBiZSBkcmFpbmVkCisJICogYnkgdGhlIGVuZCkKKwkgKi8KKwl1aXN0aHJlYWRfc3RvcCgmdmlydGhiYWluZm8tPmNoaW5mby50aHJlYWRpbmZvKTsKKworCS8qIEZhaWwgQ29tbWFuZHMgdGhhdCB3ZXJlbid0IGNvbXBsZXRlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXJ0aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BFTkRJTkdfUkVRVUVTVFM7IGkrKykgeworCQlwZW5kaW5nZGVsID0gJih2aXJ0aGJhaW5mby0+cGVuZGluZ1tpXSk7CisJCXN3aXRjaCAocGVuZGluZ2RlbC0+Y21kdHlwZSkgeworCQljYXNlIENNRF9TQ1NJX1RZUEU6CisJCQlzY3NpY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgcGVuZGluZ2RlbC0+c2VudDsKKwkJCXNjc2ljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJaWYgKHNjc2ljbWQtPnNjc2lfZG9uZSkKKwkJCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfU0NTSVRBU0tNR01UX1RZUEU6CisJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKSBwZW5kaW5nZGVsLT5zZW50OworCQkJREJHSU5GKCJjbWRyc3A9MHgleCwgbm90aWZ5PTB4JXhcbiIsIGNtZHJzcCwKKwkJCSAgICAgICBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCQkJKihpbnQgKikgY21kcnNwLT5zY3NpdGFza21nbXQubm90aWZ5cmVzdWx0ID0KKwkJCSAgICBUQVNLX01HTVRfRkFJTEVEOworCQkJd2FrZV91cF9hbGwoKHdhaXRfcXVldWVfaGVhZF90ICopCisJCQkJICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfVkRJU0tNR01UX1RZUEU6CisJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKSBwZW5kaW5nZGVsLT5zZW50OworCQkJKihpbnQgKikgY21kcnNwLT52ZGlza21nbXQubm90aWZ5cmVzdWx0ID0KKwkJCSAgICBWRElTS19NR01UX0ZBSUxFRDsKKwkJCXdha2VfdXBfYWxsKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKQorCQkJCSAgICBjbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAocGVuZGluZ2RlbC0+c2VudCAhPSBOVUxMKQorCQkJCUxPR0VSUigiVW5rbm93biBjb21tYW5kIHR5cGU6IDB4JXguICBPbmx5IGZyZWVpbmcgbGlzdCBzdHJ1Y3R1cmUuXG4iLAorCQkJCSAgICAgcGVuZGluZ2RlbC0+Y21kdHlwZSk7CisJCX0KKwkJcGVuZGluZ2RlbC0+Y21kdHlwZSA9IDA7CisJCXBlbmRpbmdkZWwtPnNlbnQgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aXJ0aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKKworCXZpcnRwY2lkZXYgPSB2aXJ0aGJhaW5mby0+dmlydHBjaWRldjsKKworCURCR0lORigidmlydHBjaWRldiBidXNObzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzTm8sCisJICAgICAgIHZpcnRwY2lkZXYtPmRldmljZU5vKTsKKwl2aXJ0aGJhaW5mby0+c2VydmVyZG93biA9IHRydWU7CisJdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUgPSBmYWxzZTsKKwkvKiBSZXR1cm4gdGhlIFNlcnZlckRvd24gcmVzcG9uc2UgdG8gQ29tbWFuZCAqLworCXZpc29yY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzcG9uc2UodmlydHBjaWRldi0+YnVzTm8sCisJCQkJCSAgIHZpcnRwY2lkZXYtPmRldmljZU5vLCAwKTsKK30KKworLyogQXMgcGVyIFZpcnRwY2lGdW5jIHJldHVybnMgMSBmb3Igc3VjY2VzcyBhbmQgMCBmb3IgZmFpbHVyZSAqLworc3RhdGljIGludAordmlydGhiYV9zZXJ2ZXJkb3duKHN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCB2aXJ0aGJhX2luZm8gKnZpcnRoYmFpbmZvID0KKwkgICAgKHN0cnVjdCB2aXJ0aGJhX2luZm8gKikgKChzdHJ1Y3QgU2NzaV9Ib3N0ICopIHZpcnRwY2lkZXYtPnNjc2kuCisJCQkJICAgICBzY3NpaG9zdCktPmhvc3RkYXRhOworCisJREJHSU5GKCJ2aXJ0aGJhX3NlcnZlcmRvd24iKTsKKwlEQkdJTkYoInZpcnRwY2lkZXYgYnVzTm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c05vLAorCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2VObyk7CisKKwlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duICYmICF2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSkgeworCQl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IHRydWU7CisJCXF1ZXVlX3dvcmsodmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSwKKwkJCSAgICZ2aXJ0aGJhaW5mby0+c2VydmVyZG93bl9jb21wbGV0aW9uKTsKKwl9IGVsc2UgaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CisJCUxPR0VSUigiU2VydmVyIGFscmVhZHkgcHJvY2Vzc2luZyBjaGFuZ2Ugc3RhdGUgbWVzc2FnZVxuIik7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlMT0dFUlIoIlNlcnZlciBhbHJlYWR5IGRvd24sIGJ1dCBhbm90aGVyIHNlcnZlciBkb3duIG1lc3NhZ2UgcmVjZWl2ZWQuIik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIEluaXQgJiBFeGl0IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdAordmlydGhiYV9wYXJzZV9saW5lKGNoYXIgKnN0cikKK3sKKwlEQkdJTkYoIkluIHZpcnRoYmFfcGFyc2VfbGluZSAlc1xuIiwgc3RyKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19pbml0Cit2aXJ0aGJhX3BhcnNlX29wdGlvbnMoY2hhciAqbGluZSkKK3sKKwljaGFyICpuZXh0ID0gbGluZTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmIChsaW5lID09IE5VTEwgfHwgISpsaW5lKQorCQlyZXR1cm47CisJd2hpbGUgKChsaW5lID0gbmV4dCkgIT0gTlVMTCkgeworCQluZXh0ID0gc3RyY2hyKGxpbmUsICcgJyk7CisJCWlmIChuZXh0ICE9IE5VTEwpCisJCQkqbmV4dCsrID0gMDsKKwkJaWYgKCF2aXJ0aGJhX3BhcnNlX2xpbmUobGluZSkpCisJCQlEQkdJTkYoIlVua25vd24gb3B0aW9uICclcydcbiIsIGxpbmUpOworCX0KKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0Cit2aXJ0aGJhX21vZF9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCWludCBpOworCisJTE9HSU5GKCJFbnRlcmluZyB2aXJ0aGJhX21vZF9pbml0Li4uXG4iKTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXZpcnRoYmFfcGFyc2Vfb3B0aW9ucyh2aXJ0aGJhX29wdGlvbnMpOworCisJZXJyb3IgPSB2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlydGhiYV9kcml2ZXIpOworCWlmIChlcnJvciA8IDApIHsKKwkJTE9HRVJSKCJyZWdpc3RlciAqKioqRkFJTEVEIDB4JXhcbiIsIGVycm9yKTsKKwkJUE9TVENPREVfTElOVVhfMyhWSEJBX0NSRUFURV9GQUlMVVJFX1BDLCBlcnJvciwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwl9IGVsc2UgeworCQkvKiBjcmVhdGUgdGhlIHByb2MgZGlyZWN0b3JpZXMgKi8KKwkJdmlydGhiYV9wcm9jX2RpciA9IHByb2NfbWtkaXIoRElSX1BST0NfRU5UUlksIE5VTEwpOworCQlpbmZvX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShJTkZPX1BST0NfRU5UUllfRk4sIDAsCisJCQkJCSAgICAgIHZpcnRoYmFfcHJvY19kaXIsCisJCQkJCSAgICAgICZwcm9jX2luZm9fZm9wcyk7CisJCXJxd2FpdHVzX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShSUVdVX1BST0NfRU5UUllfRk4sIDAsCisJCQkJCQkgIHZpcnRoYmFfcHJvY19kaXIsCisJCQkJCQkgICZwcm9jX3Jxd3VfZm9wcyk7CisJCWVuYWJsZV9pbnRzX3Byb2NfZW50cnkgPSBwcm9jX2NyZWF0ZShFTkFCTEVfSU5UU19FTlRSWV9GTiwgMCwKKwkJCQkJCSAgICAgdmlydGhiYV9wcm9jX2RpciwKKwkJCQkJCSAgICAgJnByb2NfZW5hYmxlX2ludHNfZm9wcyk7CisKKwkJLyogSW5pdGlhbGl6ZSBEQVJXb3JrUSAqLworCQlJTklUX1dPUksoJkRBUldvcmtRLCBkb0Rpc2tBZGRSZW1vdmUpOworCQlzcGluX2xvY2tfaW5pdCgmREFSV29ya1FMb2NrKTsKKworCQkvKiBjbGVhciBvdXQgYXJyYXkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKQorCQkJVmlydEhiYXNPcGVuW2ldLnZpcnRoYmFpbmZvID0gTlVMTDsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgc2VydmVyZG93biB3b3JrcXVldWUgKi8KKwkJdmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSA9CisJCSAgICBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidmlydGhiYV9zZXJ2ZXJkb3duIik7CisJCWlmICh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlID09IE5VTEwpIHsKKwkJCUxPR0VSUigiKioqKiBGQUlMRUQgdmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSBjcmVhdGlvblxuIik7CisJCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsCisJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQkJZXJyb3IgPSAtMTsKKwkJfQorCX0KKworCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJTE9HSU5GKCJMZWF2aW5nIHZpcnRoYmFfbW9kX2luaXRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHNzaXplX3QKK3ZpcnRoYmFfYWNxdWlyZV9sdW4oc3RydWN0IGRldmljZSAqY2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdWlzc2NzaV9kZXN0IHZkZXN0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJaW50IGk7CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkLSVkLSVkIiwgJnZkZXN0LmNoYW5uZWwsICZ2ZGVzdC5pZCwgJnZkZXN0Lmx1bik7CisJaWYgKGkgIT0gMykKKwkJcmV0dXJuIGk7CisKKwlyZXR1cm4gZm9yd2FyZF92ZGlza21nbXRfY29tbWFuZChWRElTS19NR01UX0FDUVVJUkUsIHNob3N0LCAmdmRlc3QpOworfQorCitzdGF0aWMgc3NpemVfdAordmlydGhiYV9yZWxlYXNlX2x1bihzdHJ1Y3QgZGV2aWNlICpjZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB1aXNzY3NpX2Rlc3QgdmRlc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlpbnQgaTsKKworCWkgPSBzc2NhbmYoYnVmLCAiJWQtJWQtJWQiLCAmdmRlc3QuY2hhbm5lbCwgJnZkZXN0LmlkLCAmdmRlc3QubHVuKTsKKwlpZiAoaSAhPSAzKQorCQlyZXR1cm4gaTsKKworCXJldHVybiBmb3J3YXJkX3ZkaXNrbWdtdF9jb21tYW5kKFZESVNLX01HTVRfUkVMRUFTRSwgc2hvc3QsICZ2ZGVzdCk7Cit9CisKKyNkZWZpbmUgQ0xBU1NfREVWSUNFX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgIFwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cl8jI19uYW1lID0gICBcCisJCV9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhY3F1aXJlX2x1biwgU19JV1VTUiwgTlVMTCwgdmlydGhiYV9hY3F1aXJlX2x1bik7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocmVsZWFzZV9sdW4sIFNfSVdVU1IsIE5VTEwsIHZpcnRoYmFfcmVsZWFzZV9sdW4pOworCitzdGF0aWMgREVWSUNFX0FUVFJJQlVURSAqdmlydGhiYV9zaG9zdF9hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9hY3F1aXJlX2x1biwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcmVsZWFzZV9sdW4sCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgX19leGl0Cit2aXJ0aGJhX21vZF9leGl0KHZvaWQpCit7CisJTE9HSU5GKCJlbnRlcmluZyB2aXJ0aGJhX21vZF9leGl0Li4uXG4iKTsKKworCXZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpcnRoYmFfZHJpdmVyKTsKKwkvKiB1bnJlZ2lzdGVyIGlzIGdvaW5nIHRvIGNhbGwgdmlydGhiYV9yZW1vdmUgKi8KKwkvKiBkZXN0cm95IHNlcnZlcmRvd24gY29tcGxldGlvbiB3b3JrcXVldWUgKi8KKwlpZiAodmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZSh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlKTsKKwkJdmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSA9IE5VTEw7CisJfQorCisJaWYgKGluZm9fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSU5GT19QUk9DX0VOVFJZX0ZOLCB2aXJ0aGJhX3Byb2NfZGlyKTsKKworCWlmIChycXdhaXR1c19wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShSUVdVX1BST0NfRU5UUllfRk4sIE5VTEwpOworCisJaWYgKGVuYWJsZV9pbnRzX3Byb2NfZW50cnkpCisJCXJlbW92ZV9wcm9jX2VudHJ5KEVOQUJMRV9JTlRTX0VOVFJZX0ZOLCBOVUxMKTsKKworCWlmICh2aXJ0aGJhX3Byb2NfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShESVJfUFJPQ19FTlRSWSwgTlVMTCk7CisKKwlMT0dJTkYoIkxlYXZpbmcgdmlydGhiYV9tb2RfZXhpdFxuIik7CisKK30KKworLyogc3BlY2lmeSBmdW5jdGlvbiB0byBiZSBydW4gYXQgbW9kdWxlIGluc2VydGlvbiB0aW1lICovCittb2R1bGVfaW5pdCh2aXJ0aGJhX21vZF9pbml0KTsKKworLyogc3BlY2lmeSBmdW5jdGlvbiB0byBiZSBydW4gd2hlbiBtb2R1bGUgaXMgcmVtb3ZlZCAqLworbW9kdWxlX2V4aXQodmlydGhiYV9tb2RfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlVzaGEgU3Jpbml2YXNhbiIpOworTU9EVUxFX0FMSUFTKCJ1aXN2aXJ0aGJhIik7CisJLyogdGhpcyBpcyBleHRyYWN0ZWQgZHVyaW5nIGRlcG1vZCBhbmQga2VwdCBpbiBtb2R1bGVzLmRlcCAqLworLyogbW9kdWxlIHBhcmFtZXRlciAqLworbW9kdWxlX3BhcmFtKHZpcnRoYmFfb3B0aW9ucywgY2hhcnAsIFNfSVJVR08pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL3ZpcnRoYmEuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNzk3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmgKQEAgLTAsMCArMSwzMSBAQAorLyogdmlydGhiYS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogVW5pc3lzIFZpcnR1YWwgSEJBIGRyaXZlciBoZWFkZXIKKyAqLworCisKKworI2lmbmRlZiBfX1ZJUlRIQkFfSF9fCisjZGVmaW5lIF9fVklSVEhCQV9IX18KKworCisjZGVmaW5lIFZJUlRIQkFfVkVSU0lPTiAiMDEuMDAiCisKKworI2VuZGlmIC8qIF9fVklSVEhCQV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5ZWZjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHZpcnRwY2kgY29uZmlndXJhdGlvbgorIworCitjb25maWcgVU5JU1lTX1ZJUlRQQ0kKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpcnRwY2kgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVUlTTElCCisJLS0taGVscC0tLQorCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB2aXJ0cGNpIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Mzk5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHZpcnRwY2kKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19WSVJUUENJKQkrPSB2aXJ0cGNpLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMKKworY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM0NjUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuYwpAQCAtMCwwICsxLDE3NzEgQEAKKy8qIHZpcnRwY2kuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBFWFBPUlRfU1lNVEFCCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJkaWFnbm9zdGljcy9hcHBvc19zdWJzeXN0ZW1zLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJjb21tb250eXBlcy5oIgorI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCisjaW5jbHVkZSAidmJ1c2hlbHBlci5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAiZ3Vlc3RsaW51eGRlYnVnLmgiCisKK3N0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwlzdHJ1Y3Qga2xpc3Qga2xpc3RfZGV2aWNlczsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSBrbm9kZV9idXM7CisJc3RydWN0IG1vZHVsZV9rb2JqZWN0ICpta29iajsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOworfTsKKyNkZWZpbmUgdG9fZHJpdmVyKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRyaXZlcl9wcml2YXRlLCBrb2JqKQorCisvKiBidXNfaWQgd2VudCBhd2F5IGluIDIuNi4zMCAtIHRoZSBzaXplIHdhcyAyMCBieXRlcywgc28gd2UnbGwgZGVmaW5lCisgKiBpdCBvdXJzZWx2ZXMsIGFuZCBhIG1hY3JvIHRvIG1ha2UgZ2V0dGluZyB0aGUgZmllbGQgYSBiaXQgc2ltcGxlci4KKyAqLworI2lmbmRlZiBCVVNfSURfU0laRQorI2RlZmluZSBCVVNfSURfU0laRSAyMAorI2VuZGlmCisKKyNkZWZpbmUgQlVTX0lEKHgpIGRldl9uYW1lKHgpCisKKyNpbmNsdWRlICJ2aXJ0cGNpLmgiCisKKy8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KKyAqIGRlYnVnL2luZm8vZXJyb3IgbWVzc2FnZXMKKyAqLworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklSVF9QQ0lfUENfdmlydHBjaV9jCisjZGVmaW5lIF9fTVlGSUxFX18gInZpcnRwY2kuYyIKKworI2RlZmluZSBWSVJUUENJX1ZFUlNJT04gIjAxLjAwIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZGVsZXRlX3ZidXNfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnZidXMsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBtYXRjaF9idXNpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgdmlydHBjaV9idXNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdmlydHBjaV9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9hZGQoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLCBpbnQgZGV2dHlwZSwKKwkJCSAgICAgIHN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgKmFkZHBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBzY3NpX2FkYXBfaW5mbyAqc2NzaSwKKwkJCSAgICAgIHN0cnVjdCBuZXRfYWRhcF9pbmZvICpuZXQpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9kZWwoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLCBpbnQgZGV2dHlwZSwKKwkJCSAgICAgIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihzdHJ1Y3QgZGV2aWNlICpwYXJlbnRidXMsIGludCBkZXZ0eXBlLAorCQkJCSAgICAgc3RydWN0IHZoYmFfd3dubiAqd3dubiwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoc3RydWN0IGRldmljZSAqcGFyZW50YnVzLCBpbnQgZGV2dHlwZSwKKwkJCQkgICBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKTsKK3N0YXRpYyBzc2l6ZV90IHZpcnRwY2lfZHJpdmVyX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHZpcnRwY2lfZHJpdmVyX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIGludCB2aXJ0cGNpX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpOworc3RhdGljIGludCB2aXJ0cGNpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudik7CitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgc3NpemVfdCB2aXJ0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgaW5mb19wcm9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdmlydF9mb3BzID0geworCS53cml0ZSA9IHZpcnRfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW5mb19mb3BzID0geworCS5yZWFkID0gaW5mb19wcm9jX3JlYWQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHbG9iYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG1ldGhvZHMgaW4gYnVzX3R5cGUgc3RydWN0IGFsbG93IHRoZSBidXMgY29kZSB0byBzZXJ2ZSBhcyBhbgorICogaW50ZXJtZWRpYXJ5IGJldHdlZW4gdGhlIGRldmljZSBjb3JlIGFuZCBpbmRpdmlkdWFsIGRldmljZSBjb3JlIGFuZAorICogaW5kaXZpZHVhbCBkcml2ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgdmlydHBjaV9idXNfdHlwZSA9IHsKKwkubmFtZSA9ICJ1aXN2aXJ0cGNpIiwKKwkubWF0Y2ggPSB2aXJ0cGNpX2J1c19tYXRjaCwKKwkudWV2ZW50ID0gdmlydHBjaV91ZXZlbnQsCisJLnN1c3BlbmQgPSB2aXJ0cGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUgPSB2aXJ0cGNpX2RldmljZV9yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZSB2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlID0geworCS5pbml0X25hbWUgPSAidmJ1c3Jvb3QiLAkvKiByb290IGJ1cyAqLworCS5yZWxlYXNlID0gdmlydHBjaV9idXNfcmVsZWFzZQorfTsKKworLyogZmlsbGVkIGluIHdpdGggaW5mbyBhYm91dCBwYXJlbnQgY2hpcHNldCBkcml2ZXIgd2hlbiB3ZSByZWdpc3RlciB3aXRoIGl0ICovCitzdGF0aWMgVUxUUkFfVkJVU19ERVZJQ0VJTkZPIENoaXBzZXRfRHJpdmVySW5mbzsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgdmlydHBjaV9kcml2ZXJfc3lzZnNfb3BzID0geworCS5zaG93ID0gdmlydHBjaV9kcml2ZXJfYXR0cl9zaG93LAorCS5zdG9yZSA9IHZpcnRwY2lfZHJpdmVyX2F0dHJfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSB2aXJ0cGNpX2RyaXZlcl9rb2JqX3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZ2aXJ0cGNpX2RyaXZlcl9zeXNmc19vcHMsCit9OworCitzdGF0aWMgc3RydWN0IHZpcnRwY2lfZGV2ICpWcGNpZGV2TGlzdEhlYWQ7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhWcGNpZGV2TGlzdExvY2spOworCisvKiBmaWxsZWQgaW4gd2l0aCBpbmZvIGFib3V0IHRoaXMgZHJpdmVyLCB3cnQgaXQgc2VydmljaW5nIGNsaWVudCBidXNzZXMgKi8KK3N0YXRpYyBVTFRSQV9WQlVTX0RFVklDRUlORk8gQnVzX0RyaXZlckluZm87CisKKy8qIHZpcnRwY2lfcHJvY19kaXJfZW50cnkgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHByb2MgZW50cnkgZGlyZWN0b3J5CisgKiBmb3IgdmlydHBjaQorICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aXJ0cGNpX3Byb2NfZGlyOworLyogdmlydF9wcm9jX2VudHJ5IGlzIHVzZWQgdG8gdGVsbCB2aXJ0cGNpIHRvIGFkZC9kZWxldGUgdmhiYXMvdm5pY3MvdmJ1c2VzICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aXJ0X3Byb2NfZW50cnk7CisvKiBpbmZvX3Byb2NfZW50cnkgaXMgdXNlZCB0byB0ZWxsIHZpcnRwY2kgdG8gZGlzcGxheSBjdXJyZW50IGluZm8KKyAqIGtlcHQgaW4gdGhlIGRyaXZlcgorICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppbmZvX3Byb2NfZW50cnk7CisjZGVmaW5lIFZJUlRfUFJPQ19FTlRSWV9GTiAidmlydCIKKyNkZWZpbmUgSU5GT19QUk9DX0VOVFJZX0ZOICJpbmZvIgorI2RlZmluZSBESVJfUFJPQ19FTlRSWSAidmlydHBjaSIKKworc3RydWN0IHZpcnRwY2lfYnVzZGV2IHsKKwlzdHJ1Y3QgZGV2aWNlIHZpcnRwY2lfYnVzX2RldmljZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExvY2FsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZQoraW50IFdBSVRfRk9SX0lPX0NIQU5ORUwoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICAqY2hhbnB0cikKK3sKKwlpbnQgY291bnQgPSAxMjA7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCisJCWlmIChVTFRSQV9DSEFOTkVMX1NFUlZFUl9SRUFEWSgmY2hhbnB0ci0+Q2hhbm5lbEhlYWRlcikpCisJCQlyZXR1cm4gMTsKKwkJVUlTX1RIUkVBRF9XQUlUX1NFQygxKTsKKwkJY291bnQtLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIFVMVFJBX1ZCVVNfQ0hBTk5FTF9QUk9UT0NPTC5DaHBJbmZvLiAqLworc3RhdGljIGludCB3cml0ZV92YnVzX2NocEluZm8oVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MICpjaGFuLAorCQkJICAgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICppbmZvKQoreworCWludCBvZmY7CisJaWYgKCFjaGFuKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCBwcmVzZW50Iik7CisJCXJldHVybiAtMTsKKwl9CisJb2ZmID0gc2l6ZW9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wpICsgY2hhbi0+SGRySW5mby5jaHBJbmZvQnl0ZU9mZnNldDsKKwlpZiAoY2hhbi0+SGRySW5mby5jaHBJbmZvQnl0ZU9mZnNldCA9PSAwKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGNocEluZm9CeXRlT2Zmc2V0ID09IDAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoKChVOCAqKSAoY2hhbikpICsgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIDxpbmZvPiB0byB0aGUgVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MLkJ1c0luZm8uICovCitzdGF0aWMgaW50IHdyaXRlX3ZidXNfYnVzSW5mbyhVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgKmNoYW4sCisJCQkgICAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmluZm8pCit7CisJaW50IG9mZjsKKwlpZiAoIWNoYW4pIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvZmYgPSBzaXplb2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCkgKyBjaGFuLT5IZHJJbmZvLmJ1c0luZm9CeXRlT2Zmc2V0OworCWlmIChjaGFuLT5IZHJJbmZvLmJ1c0luZm9CeXRlT2Zmc2V0ID09IDApIHsKKwkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHVzZWQsIGJlY2F1c2UgYnVzSW5mb0J5dGVPZmZzZXQgPT0gMCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweSgoKFU4ICopIChjaGFuKSkgKyBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpOworCXJldHVybiAwOworfQorCisvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgPGluZm8+IHRvIHRoZQorICogVUxUUkFfVkJVU19DSEFOTkVMX1BST1RPQ09MLkRldkluZm9bPGRldml4Pl0uCisgKi8KK3N0YXRpYyBpbnQKK3dyaXRlX3ZidXNfZGV2SW5mbyhVTFRSQV9WQlVTX0NIQU5ORUxfUFJPVE9DT0wgKmNoYW4sCisJCSAgIFVMVFJBX1ZCVVNfREVWSUNFSU5GTyAqaW5mbywgaW50IGRldml4KQoreworCWludCBvZmY7CisJaWYgKCFjaGFuKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCBwcmVzZW50Iik7CisJCXJldHVybiAtMTsKKwl9CisJb2ZmID0KKwkgICAgKHNpemVvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MKSArCisJICAgICBjaGFuLT5IZHJJbmZvLmRldkluZm9CeXRlT2Zmc2V0KSArCisJICAgIChjaGFuLT5IZHJJbmZvLmRldmljZUluZm9TdHJ1Y3RCeXRlcyAqIGRldml4KTsKKwlpZiAoY2hhbi0+SGRySW5mby5kZXZJbmZvQnl0ZU9mZnNldCA9PSAwKSB7CisJCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGRldkluZm9CeXRlT2Zmc2V0ID09IDAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoKChVOCAqKSAoY2hhbikpICsgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKKwlyZXR1cm4gMDsKK30KKworLyogYWRkcyBhIHZidXMKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQgYWRkX3ZidXMoc3RydWN0IGFkZF92YnVzX2d1ZXN0cGFydCAqYWRkcGFyYW1zKQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqdmJ1czsKKwl2YnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZSksIEdGUF9BVE9NSUMpOworCisJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJaWYgKCF2YnVzKQorCQlyZXR1cm4gMDsKKworCWRldl9zZXRfbmFtZSh2YnVzLCAidmJ1cyVkIiwgYWRkcGFyYW1zLT5idXNObyk7CisJdmJ1cy0+cmVsZWFzZSA9IHZpcnRwY2lfYnVzX3JlbGVhc2U7CisJdmJ1cy0+cGFyZW50ID0gJnZpcnRwY2lfcm9vdGJ1c19kZXZpY2U7CS8qIHJvb3QgYnVzIGlzIHBhcmVudCAqLworCXZidXMtPmJ1cyA9ICZ2aXJ0cGNpX2J1c190eXBlOwkvKiBidXMgdHlwZSAqLworCXZidXMtPnBsYXRmb3JtX2RhdGEgPSAoX19mb3JjZSB2b2lkICopYWRkcGFyYW1zLT5jaGFucHRyOworCisJLyogcmVnaXN0ZXIgYSB2aXJ0IGJ1cyBkZXZpY2UgLQorCSAqIHRoaXMgYnVzIHNob3dzIHVwIHVuZGVyIC9zeXMvZGV2aWNlcyB3aXRoIC5uYW1lIHZhbHVlCisJICogInZpcnRwY2klZCIgYW55IGRldmljZXMgYWRkZWQgdG8gdGhpcyBidXMgdGhlbiBzaG93IHVwIHVuZGVyCisJICogL3N5cy9kZXZpY2VzL3ZpcnRwY2kwCisJICovCisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKHZidXMpOworCWlmIChyZXQpIHsKKwkJTE9HRVJSKCJkZXZpY2VfcmVnaXN0ZXIgRkFJTEVEOiVkXG4iLCByZXQpOworCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKwl3cml0ZV92YnVzX2NocEluZm8odmJ1cy0+cGxhdGZvcm1fZGF0YSAvKiBjaGFucHRyICovICwKKwkJCSAgICZDaGlwc2V0X0RyaXZlckluZm8pOworCXdyaXRlX3ZidXNfYnVzSW5mbyh2YnVzLT5wbGF0Zm9ybV9kYXRhIC8qIGNoYW5wdHIgKi8gLCAmQnVzX0RyaXZlckluZm8pOworCUxPR0lORigiQWRkZWQgdmJ1cyAlZDsgZGV2aWNlICVzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iLAorCSAgICAgICBhZGRwYXJhbXMtPmJ1c05vLCBCVVNfSUQodmJ1cykpOworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDE7Cit9CisKKy8qIGZvciBDSEFOU09DSyB3d3dubi9tYXggYXJlIEFVVE8tR0VORVJBVEVEOyBmb3Igbm9ybWFsIGNoYW5uZWxzLAorICogd3dubi9tYXggYXJlIGluIHRoZSBjaGFubmVsIGhlYWRlci4KKyAqLworI2RlZmluZSBHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihjaGFucHRyKSB7CQkJXAorCW1lbWNweV9mcm9taW8oJnNjc2kud3dubiwJCQkJCVwKKwkJICAgICAgJigoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICopCQlcCisJCQljaGFucHRyKS0+dmhiYS53d25uLAkJCQlcCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgdmhiYV93d25uKSk7CQkJXAorCW1lbWNweV9mcm9taW8oJnNjc2kubWF4LAkJCQkJXAorCQkgICAgICAmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJCVwKKwkJCWNoYW5wdHIpLT52aGJhLm1heCwJCQkJXAorCQkgICAgICBzaXplb2Yoc3RydWN0IHZoYmFfY29uZmlnX21heCkpOwkJCVwKKwl9CisKKy8qIGZpbmQgYnVzIGRldmljZSB3aXRoIHRoZSBidXNpZCB0aGF0IG1hdGNoZXMgLSBtYXRjaF9idXNpZCBtYXRjaGVzIGJ1c19pZCAqLworI2RlZmluZSBHRVRfQlVTX0RFVihidXNubykgeyBcCisJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGJ1c25vKTsgXAorCXZidXMgPSBidXNfZmluZF9kZXZpY2UoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsIFwKKwkJCSAgICAgICAodm9pZCAqKWJ1c2lkLCBtYXRjaF9idXNpZCk7CVwKKwlpZiAoIXZidXMpIHsgXAorCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGZpbmQgdmJ1cyAlc1xuIiwgYnVzaWQpOyBcCisJCXJldHVybiAwOyBcCisJfSBcCit9CisKKy8qIGFkZHMgYSB2aGJhCisgKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorICovCitzdGF0aWMgaW50IGFkZF92aGJhKHN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgKmFkZHBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCXVuc2lnbmVkIGNoYXIgYnVzaWRbQlVTX0lEX1NJWkVdOworCisJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJaWYgKCFXQUlUX0ZPUl9JT19DSEFOTkVMCisJICAgICgoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICopIGFkZHBhcmFtcy0+Y2hhbnB0cikpIHsKKwkJTE9HRVJSKCJUaW1lZCBvdXQuICBDaGFubmVsIG5vdCByZWFkeVxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJR0VUX1NDU0lBREFQSU5GT19GUk9NX0NIQU5QVFIoYWRkcGFyYW1zLT5jaGFucHRyKTsKKworCUdFVF9CVVNfREVWKGFkZHBhcmFtcy0+YnVzTm8pOworCisJTE9HSU5GKCJBZGRpbmcgdmhiYSB3d25uOiV4OiV4IGNvbmZpZzolZC0lZC0lZC0lZCBjaGFucHRyOiVwXG4iLAorCSAgICAgICBzY3NpLnd3bm4ud3dubjEsIHNjc2kud3dubi53d25uMiwKKwkgICAgICAgc2NzaS5tYXgubWF4X2NoYW5uZWwsIHNjc2kubWF4Lm1heF9pZCwgc2NzaS5tYXgubWF4X2x1biwKKwkgICAgICAgc2NzaS5tYXguY21kX3Blcl9sdW4sIGFkZHBhcmFtcy0+Y2hhbnB0cik7CisJaSA9IHZpcnRwY2lfZGV2aWNlX2FkZCh2YnVzLCBWSVJUSEJBX1RZUEUsIGFkZHBhcmFtcywgJnNjc2ksIE5VTEwpOworCWlmIChpKSB7CisJCUxPR0lORigiQWRkZWQgdmhiYSB3d25uOiV4OiV4IGNoYW5wdHI6JXBcbiIsIHNjc2kud3dubi53d25uMSwKKwkJICAgICAgIHNjc2kud3dubi53d25uMiwgYWRkcGFyYW1zLT5jaGFucHRyKTsKKwkJUE9TVENPREVfTElOVVhfMyhWUENJX0NSRUFURV9FWElUX1BDLCBpLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwl9CisJcmV0dXJuIGk7CisKK30KKworLyogZm9yIENIQU5TT0NLIG1hY2FkZHIgaXMgQVVUTy1HRU5FUkFURUQ7IGZvciBub3JtYWwgY2hhbm5lbHMsCisgKiBtYWNhZGRyIGlzIGluIHRoZSBjaGFubmVsIGhlYWRlci4KKyAqLworI2RlZmluZSBHRVRfTkVUQURBUElORk9fRlJPTV9DSEFOUFRSKGNoYW5wdHIpIHsJCQkJXAorCQltZW1jcHlfZnJvbWlvKG5ldC5tYWNfYWRkciwJCQkJXAorCQkgICAgICAgKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJCVwKKwkJCWNoYW5wdHIpLT52bmljLm1hY2FkZHIsCQkJCVwKKwkJICAgICAgIE1BWF9NQUNBRERSX0xFTik7CQkJCVwKKwkJbmV0Lm51bV9yY3ZfYnVmcyA9CQkJCQlcCisJCQlyZWFkbCgmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikJXAorCQkJCWNoYW5wdHIpLT52bmljLm51bV9yY3ZfYnVmcyk7CQlcCisJCW5ldC5tdHUgPSByZWFkbCgmKChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikgXAorCQkJCSAgY2hhbnB0ciktPnZuaWMubXR1KTsJCQlcCisJCW1lbWNweV9mcm9taW8oJm5ldC56b25lR3VpZCwgXAorCQkJICAgICAgJigoVUxUUkFfSU9fQ0hBTk5FTF9QUk9UT0NPTCBfX2lvbWVtICopCVwKKwkJCQljaGFucHRyKS0+dm5pYy56b25lR3VpZCwJCVwKKwkJCSAgICAgIHNpemVvZihHVUlEKSk7CQkJCVwKK30KKworLyogYWRkcyBhIHZuaWMKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQKK2FkZF92bmljKHN0cnVjdCBhZGRfdmlydF9ndWVzdHBhcnQgKmFkZHBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2FkYXBfaW5mbyBuZXQ7CisJc3RydWN0IGRldmljZSAqdmJ1czsKKwl1bnNpZ25lZCBjaGFyIGJ1c2lkW0JVU19JRF9TSVpFXTsKKworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmICghV0FJVF9GT1JfSU9fQ0hBTk5FTAorCSAgICAoKFVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqKSBhZGRwYXJhbXMtPmNoYW5wdHIpKSB7CisJCUxPR0VSUigiVGltZWQgb3V0LCBjaGFubmVsIG5vdCByZWFkeVxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIDA7CisJfQorCisJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihhZGRwYXJhbXMtPmNoYW5wdHIpOworCisJR0VUX0JVU19ERVYoYWRkcGFyYW1zLT5idXNObyk7CisKKwlMT0dJTkYoIkFkZGluZyB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggcmN2YnVmczolZCBtdHU6JWQgY2hhbnB0cjolcHslLTguOGx4LSUtNC40eC0lLTQuNHgtJS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4JS0yLjJ4fVxuIiwKKwkgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sIG5ldC5tYWNfYWRkclszXSwKKwkgICAgIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdLCBuZXQubnVtX3Jjdl9idWZzLCBuZXQubXR1LAorCSAgICAgYWRkcGFyYW1zLT5jaGFucHRyLCAodWxvbmcpIG5ldC56b25lR3VpZC5kYXRhMSwgbmV0LnpvbmVHdWlkLmRhdGEyLAorCSAgICAgbmV0LnpvbmVHdWlkLmRhdGEzLCBuZXQuem9uZUd1aWQuZGF0YTRbMF0sIG5ldC56b25lR3VpZC5kYXRhNFsxXSwKKwkgICAgIG5ldC56b25lR3VpZC5kYXRhNFsyXSwgbmV0LnpvbmVHdWlkLmRhdGE0WzNdLAorCSAgICAgbmV0LnpvbmVHdWlkLmRhdGE0WzRdLCBuZXQuem9uZUd1aWQuZGF0YTRbNV0sCisJICAgICBuZXQuem9uZUd1aWQuZGF0YTRbNl0sIG5ldC56b25lR3VpZC5kYXRhNFs3XSk7CisJaSA9IHZpcnRwY2lfZGV2aWNlX2FkZCh2YnVzLCBWSVJUTklDX1RZUEUsIGFkZHBhcmFtcywgTlVMTCwgJm5ldCk7CisJaWYgKGkpIHsKKwkJTE9HSU5GKCJBZGRlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRVhJVF9QQywgaSwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogZGVsZXRlIHZidXMKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyBpbnQKK2RlbGV0ZV92YnVzKHN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgKmRlbHBhcmFtcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCXVuc2lnbmVkIGNoYXIgYnVzaWRbQlVTX0lEX1NJWkVdOworCisJR0VUX0JVU19ERVYoZGVscGFyYW1zLT5idXNObyk7CisJLyogZW5zdXJlIHRoYXQgYnVzIGhhcyBubyBkZXZpY2VzPyAtLSBUQkQgKi8KKwlMT0dJTkYoIkRlbGV0aW5nICVzXG4iLCBCVVNfSUQodmJ1cykpOworCWlmIChkZWxldGVfdmJ1c19kZXZpY2UodmJ1cywgTlVMTCkpCisJCXJldHVybiAwOwkvKiBmYWlsdXJlICovCisJTE9HSU5GKCJEZWxldGVkIHZidXMgJWRcbiIsIGRlbHBhcmFtcy0+YnVzTm8pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkZWxldGVfdmJ1c19kZXZpY2Uoc3RydWN0IGRldmljZSAqdmJ1cywgdm9pZCAqZGF0YSkKK3sKKwlpbnQgY2hlY2tmb3Jyb290ID0gKGRhdGEgIT0gTlVMTCk7CisJc3RydWN0IGRldmljZSAqcERldiA9ICZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlOworCisJaWYgKChjaGVja2ZvcnJvb3QpICYmIG1hdGNoX2J1c2lkKHZidXMsICh2b2lkICopIEJVU19JRChwRGV2KSkpIHsKKwkJLyogc2tpcCBpdCAtIGRvbid0IGRlbGV0ZSByb290IGJ1cyAqLworCQlMT0dJTkYoInNraXBwaW5nIHJvb3QgYnVzXG4iKTsKKwkJcmV0dXJuIDA7CS8qIHByZXRlbmQgbm8gZXJyb3IgKi8KKwl9CisJTE9HSU5GKCJDYWxsaW5nIHVucmVnaXN0ZXIgZm9yICVzXG4iLCBCVVNfSUQodmJ1cykpOworCWRldmljZV91bnJlZ2lzdGVyKHZidXMpOworCWtmcmVlKHZidXMpOworCUxPR0lORigiVkJ1cyB1bnJlZ2lzdGVyIGFuZCBmcmVlZFxuIik7CisJcmV0dXJuIDA7CQkvKiBubyBlcnJvciAqLworfQorCisvKiBwYXVzZSB2aGJhCisqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisqLworc3RhdGljIGludCBwYXVzZV92aGJhKHN0cnVjdCBwYXVzZV92aXJ0X2d1ZXN0cGFydCAqcGF1c2VwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IHNjc2lfYWRhcF9pbmZvIHNjc2k7CisKKwlHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihwYXVzZXBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIlBhdXNpbmcgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsIHNjc2kud3dubi53d25uMik7CisJaSA9IHZpcnRwY2lfZGV2aWNlX3NlcnZlcmRvd24oTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUSEJBX1RZUEUsCisJCQkJICAgICAgJnNjc2kud3dubiwgTlVMTCk7CisJaWYgKGkpCisJCUxPR0lORigiUGF1c2VkIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLAorCQkgICAgICAgc2NzaS53d25uLnd3bm4yKTsKKwlyZXR1cm4gaTsKK30KKworLyogcGF1c2Ugdm5pYworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludCBwYXVzZV92bmljKHN0cnVjdCBwYXVzZV92aXJ0X2d1ZXN0cGFydCAqcGF1c2VwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IG5ldF9hZGFwX2luZm8gbmV0OworCisJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihwYXVzZXBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIlBhdXNpbmcgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKKwlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLyAsIFZJUlROSUNfVFlQRSwKKwkJCQkgICAgICBOVUxMLCBuZXQubWFjX2FkZHIpOworCWlmIChpKSB7CisJCUxPR0lORigiIFBhdXNlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJfQorCXJldHVybiBpOworfQorCisvKiByZXN1bWUgdmhiYQorICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludCByZXN1bWVfdmhiYShzdHJ1Y3QgcmVzdW1lX3ZpcnRfZ3Vlc3RwYXJ0ICpyZXN1bWVwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IHNjc2lfYWRhcF9pbmZvIHNjc2k7CisKKwlHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihyZXN1bWVwYXJhbXMtPmNoYW5wdHIpOworCisJTE9HSU5GKCJSZXN1bWluZyB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yKTsKKwlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUSEJBX1RZUEUsCisJCQkJICAgICZzY3NpLnd3bm4sIE5VTEwpOworCWlmIChpKQorCQlMT0dJTkYoIlJlc3VtZWQgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsCisJCSAgICAgICBzY3NpLnd3bm4ud3dubjIpOworCXJldHVybiBpOworfQorCisvKiByZXN1bWUgdm5pYworKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorKi8KK3N0YXRpYyBpbnQKK3Jlc3VtZV92bmljKHN0cnVjdCByZXN1bWVfdmlydF9ndWVzdHBhcnQgKnJlc3VtZXBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2FkYXBfaW5mbyBuZXQ7CisKKwlHRVRfTkVUQURBUElORk9fRlJPTV9DSEFOUFRSKHJlc3VtZXBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIlJlc3VtaW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKKwkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CisJaSA9IHZpcnRwY2lfZGV2aWNlX3NlcnZlcnVwKE5VTEwgLypubyBwYXJlbnQgYnVzICovICwgVklSVE5JQ19UWVBFLAorCQkJCSAgICBOVUxMLCBuZXQubWFjX2FkZHIpOworCWlmIChpKSB7CisJCUxPR0lORigiIFJlc3VtZWQgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKKwkJICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogZGVsZXRlIHZoYmEKKyogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyovCitzdGF0aWMgaW50IGRlbGV0ZV92aGJhKHN0cnVjdCBkZWxfdmlydF9ndWVzdHBhcnQgKmRlbHBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKKworCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKGRlbHBhcmFtcy0+Y2hhbnB0cik7CisKKwlMT0dJTkYoIkRlbGV0aW5nIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLCBzY3NpLnd3bm4ud3dubjIpOworCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUSEJBX1RZUEUsCisJCQkgICAgICAgJnNjc2kud3dubiwgTlVMTCk7CisJaWYgKGkpIHsKKwkJTE9HSU5GKCJEZWxldGVkIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLAorCQkgICAgICAgc2NzaS53d25uLnd3bm4yKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBkZWxldGVzIGEgdm5pYworICogcmV0dXJucyAwIGZhaWx1cmUsIDEgc3VjY2VzcywKKyAqLworc3RhdGljIGludCBkZWxldGVfdm5pYyhzdHJ1Y3QgZGVsX3ZpcnRfZ3Vlc3RwYXJ0ICpkZWxwYXJhbXMpCit7CisJaW50IGk7CisJc3RydWN0IG5ldF9hZGFwX2luZm8gbmV0OworCisJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihkZWxwYXJhbXMtPmNoYW5wdHIpOworCisJTE9HSU5GKCJEZWxldGluZyB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCisJICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOworCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8gLCBWSVJUTklDX1RZUEUsIE5VTEwsCisJCQkgICAgICAgbmV0Lm1hY19hZGRyKTsKKwlpZiAoaSkgeworCQlMT0dJTkYoIkRlbGV0ZWQgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKKwkJICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOworCX0KKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBERUxFVEVfT05FX1ZQQ0lERVYodnBjaWRldikgeyBcCisJTE9HSU5GKCJjYWxsaW5nIGRldmljZV91bnJlZ2lzdGVyOiVwXG4iLCAmdnBjaWRldi0+Z2VuZXJpY19kZXYpOyBcCisJZGV2aWNlX3VucmVnaXN0ZXIoJnZwY2lkZXYtPmdlbmVyaWNfZGV2KTsgXAorCUxPR0lORigiRGVsZXRlZCAlcFxuIiwgdnBjaWRldik7IFwKKwlrZnJlZSh2cGNpZGV2KTsgXAorfQorCisvKiBkZWxldGVzIGFsbCB2aGJhcyBhbmQgdm5pY3MKKyAqIHJldHVybnMgMCBmYWlsdXJlLCAxIHN1Y2Nlc3MsCisgKi8KK3N0YXRpYyB2b2lkIGRlbGV0ZV9hbGwodm9pZCkKK3sKKwlpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2LCAqbmV4dHZwY2lkZXY7CisKKwkvKiBkZWxldGUgdGhlIGVudGlyZSB2aGJhL3ZuaWMgbGlzdCBpbiBvbmUgc2hvdCAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJdG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZDsKKwlWcGNpZGV2TGlzdEhlYWQgPSBOVUxMOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKworCS8qIGRlbGV0ZSBvbmUgdmhiYS92bmljIGF0IGEgdGltZSAqLworCXdoaWxlICh0bXB2cGNpZGV2KSB7CisJCW5leHR2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dDsKKwkJLyogZGVsZXRlIHRoZSB2aGJhL3ZuaWMgYXQgdG1wdnBjaWRldiAqLworCQlERUxFVEVfT05FX1ZQQ0lERVYodG1wdnBjaWRldik7CisJCXRtcHZwY2lkZXYgPSBuZXh0dnBjaWRldjsKKwkJY291bnQrKzsKKwl9CisJTE9HSU5GKCJEZWxldGVkICVkIHZoYmFzL3ZuaWNzLlxuIiwgY291bnQpOworCisJLyogbm93IGRlbGV0ZSBlYWNoIHZidXMgKi8KKwlpZiAoYnVzX2Zvcl9lYWNoX2RldgorCSAgICAoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsICh2b2lkICopIDEsIGRlbGV0ZV92YnVzX2RldmljZSkpCisJCUxPR0VSUigiZGVsZXRlIG9mIGFsbCB2YnVzIGZhaWxlZFxuIik7Cit9CisKKy8qIGRlbGV0ZXMgYWxsIHZuaWNzIG9yIHZoYmFzCisgKiByZXR1cm5zIDAgZmFpbHVyZSwgMSBzdWNjZXNzLAorICovCitzdGF0aWMgaW50IGRlbGV0ZV9hbGxfdmlydChWSVJUUENJX0RFVl9UWVBFIGRldnR5cGUsIHN0cnVjdCBkZWxfdmJ1c19ndWVzdHBhcnQgKmRlbHBhcmFtcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGJ1c2lkW0JVU19JRF9TSVpFXTsKKwlzdHJ1Y3QgZGV2aWNlICp2YnVzOworCisJR0VUX0JVU19ERVYoZGVscGFyYW1zLT5idXNObyk7CisKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7CisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZGVsZXRlIGFsbCBkZXZpY2VzOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCisJCSAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlMT0dJTkYoIkRlbGV0aW5nIGFsbCAlcyBpbiB2YnVzICVzXG4iLAorCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiLCBidXNpZCk7CisJLyogZGVsZXRlIGFsbCB2aGJhcy92bmljcyAqLworCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwodmJ1cywgZGV2dHlwZSwgTlVMTCwgTlVMTCk7CisJaWYgKGkgPiAwKQorCQlMT0dJTkYoIkRlbGV0ZWQgJWQgJXNcbiIsIGksCisJCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMoc3RydWN0IGd1ZXN0X21zZ3MgKm1zZykKK3sKKwlzd2l0Y2ggKG1zZy0+bXNndHlwZSkgeworCWNhc2UgR1VFU1RfQUREX1ZCVVM6CisJCXJldHVybiBhZGRfdmJ1cygmbXNnLT5hZGRfdmJ1cyk7CisJY2FzZSBHVUVTVF9BRERfVkhCQToKKwkJcmV0dXJuIGFkZF92aGJhKCZtc2ctPmFkZF92aGJhKTsKKwljYXNlIEdVRVNUX0FERF9WTklDOgorCQlyZXR1cm4gYWRkX3ZuaWMoJm1zZy0+YWRkX3ZuaWMpOworCWNhc2UgR1VFU1RfREVMX1ZCVVM6CisJCXJldHVybiBkZWxldGVfdmJ1cygmbXNnLT5kZWxfdmJ1cyk7CisJY2FzZSBHVUVTVF9ERUxfVkhCQToKKwkJcmV0dXJuIGRlbGV0ZV92aGJhKCZtc2ctPmRlbF92aGJhKTsKKwljYXNlIEdVRVNUX0RFTF9WTklDOgorCQlyZXR1cm4gZGVsZXRlX3ZuaWMoJm1zZy0+ZGVsX3ZoYmEpOworCWNhc2UgR1VFU1RfREVMX0FMTF9WSEJBUzoKKwkJcmV0dXJuIGRlbGV0ZV9hbGxfdmlydChWSVJUSEJBX1RZUEUsICZtc2ctPmRlbF9hbGxfdmhiYXMpOworCWNhc2UgR1VFU1RfREVMX0FMTF9WTklDUzoKKwkJcmV0dXJuIGRlbGV0ZV9hbGxfdmlydChWSVJUTklDX1RZUEUsICZtc2ctPmRlbF9hbGxfdm5pY3MpOworCWNhc2UgR1VFU1RfREVMX0FMTF9WQlVTRVM6CisJCWRlbGV0ZV9hbGwoKTsKKwkJcmV0dXJuIDE7CisJY2FzZSBHVUVTVF9QQVVTRV9WSEJBOgorCQlyZXR1cm4gcGF1c2VfdmhiYSgmbXNnLT5wYXVzZV92aGJhKTsKKwljYXNlIEdVRVNUX1BBVVNFX1ZOSUM6CisJCXJldHVybiBwYXVzZV92bmljKCZtc2ctPnBhdXNlX3ZuaWMpOworCWNhc2UgR1VFU1RfUkVTVU1FX1ZIQkE6CisJCXJldHVybiByZXN1bWVfdmhiYSgmbXNnLT5yZXN1bWVfdmhiYSk7CisJY2FzZSBHVUVTVF9SRVNVTUVfVk5JQzoKKwkJcmV0dXJuIHJlc3VtZV92bmljKCZtc2ctPnJlc3VtZV92bmljKTsKKwlkZWZhdWx0OgorCQlMT0dFUlIoImludmFsaWQgbWVzc2FnZSB0eXBlICVkLlxuIiwgbXNnLT5tc2d0eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBzYW1lIGFzIGRyaXZlcl9oZWxwZXIgaW4gYnVzLmMgbGludXggKi8KK3N0YXRpYyBpbnQgbWF0Y2hfYnVzaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOworCisJaWYgKHN0cmNtcChuYW1lLCBCVVNfSUQoZGV2KSkgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBCdXMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICoKK3ZpcnRwY2lfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsCisJCSAgICAgY29uc3Qgc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYpCit7CisJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgeworCQlEQkdJTkYoImlkcy0+dmVuZG9yOiV4IGRldi0+dmVuZG9yOiV4IGlkcy0+ZGV2aWNlOiV4IGRldi0+ZGV2aWNlOiV4XG4iLAorCQkgICAgIGlkcy0+dmVuZG9yLCBkZXYtPnZlbmRvciwgaWRzLT5kZXZpY2UsIGRldi0+ZGV2aWNlKTsKKworCQlpZiAoKGlkcy0+dmVuZG9yID09IGRldi0+dmVuZG9yKQorCQkgICAgJiYgKGlkcy0+ZGV2aWNlID09IGRldi0+ZGV2aWNlKSkKKwkJCXJldHVybiBpZHM7CisKKwkJaWRzKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBOT1RFOiAhISEhISEgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGFkZGVkCisqIGZvciB0aGlzIGJ1cy4gIE9yLCBpdCBpcyBjYWxsZWQgZm9yIGV4aXN0aW5nIGRldmljZXMgd2hlbiBhIG5ldworKiBkcml2ZXIgaXMgYWRkZWQgZm9yIHRoaXMgYnVzLiAgSXQgcmV0dXJucyBub256ZXJvIGlmIGEgZ2l2ZW4gZGV2aWNlCisqIGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBnaXZlbiBkcml2ZXIuCisqLworc3RhdGljIGludCB2aXJ0cGNpX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp2aXJ0cGNpZGV2ID0gZGV2aWNlX3RvX3ZpcnRwY2lfZGV2KGRldik7CisJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2ID0gZHJpdmVyX3RvX3ZpcnRwY2lfZHJpdmVyKGRydik7CisJaW50IG1hdGNoID0gMDsKKworCURCR0lORigiSW4gdmlydHBjaV9idXNfbWF0Y2ggZGV2LT5idXNfaWQ6JXMgZHJ2LT5uYW1lOiVzXG4iLAorCSAgICAgICBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKKworCS8qIGNoZWNrIGlkcyBsaXN0IGZvciBhIG1hdGNoICovCisJaWYgKHZpcnRwY2lfbWF0Y2hfZGV2aWNlKHZpcnRwY2lkcnYtPmlkX3RhYmxlLCB2aXJ0cGNpZGV2KSkKKwkJbWF0Y2ggPSAxOworCisJREJHSU5GKCJyZXR1cm5pbmcgbWF0Y2g6JWRcbiIsIG1hdGNoKTsKKwlyZXR1cm4gbWF0Y2g7CQkvKiAwIC0gbm8gbWF0Y2g7IDEgLSB5ZXMgaXQgbWF0Y2hlcyAqLworfQorCitzdGF0aWMgaW50IHZpcnRwY2lfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCURCR0lORigiSW4gdmlydHBjaV9ob3RwbHVnXG4iKTsKKwkvKiBhZGQgdmFyaWFibGVzIHRvIHRoZSBlbnZpcm9ubWVudCBwcmlvciB0byB0aGUgZ2VuZXJhdGlvbiBvZgorCSAqIGhvdHBsdWcgZXZlbnRzIHRvIHVzZXIgc3BhY2UKKwkgKi8KKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiVklSVFBDSV9WRVJTSU9OPSVzIiwgVklSVFBDSV9WRVJTSU9OKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlEQkdJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3N1c3BlbmQgLU5ZSSAqKioqXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aXJ0cGNpX2RldmljZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCURCR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcmVzdW1lIC1OWUkgKioqKlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZvciBhIGNoaWxkIGRldmljZSBqdXN0IGNyZWF0ZWQgb24gYSBjbGllbnQgYnVzLCBmaWxsIGluCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyIHRoYXQgaXMgY29udHJvbGxpbmcgdGhpcyBkZXZpY2UgaW50bworICogdGhlIHRoZSBhcHByb3ByaWF0ZSBzbG90IHdpdGhpbiB0aGUgdmJ1cyBjaGFubmVsIG9mIHRoZSBidXMKKyAqIGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZCBmaXhfdmJ1c19kZXZJbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGRldk5vLCBpbnQgZGV2VHlwZSwKKwkJCSAgICAgc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2KQoreworCXN0cnVjdCBkZXZpY2UgKnZidXM7CisJdm9pZCAqcENoYW47CisJVUxUUkFfVkJVU19ERVZJQ0VJTkZPIGRldkluZm87CisJY29uc3QgY2hhciAqc3R5cGU7CisKKwlpZiAoIWRldikgeworCQlMT0dFUlIoIiVzIGRldiBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmICghdmlydHBjaWRydikgeworCQlMT0dFUlIoIiVzIGRyaXZlciBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXZidXMgPSBkZXYtPnBhcmVudDsKKwlpZiAoIXZidXMpIHsKKwkJTE9HRVJSKCIlcyBkZXYgaGFzIG5vIHBhcmVudCBidXMiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJcENoYW4gPSB2YnVzLT5wbGF0Zm9ybV9kYXRhOworCWlmICghcENoYW4pIHsKKwkJTE9HRVJSKCIlcyBkZXYgYnVzIGhhcyBubyBjaGFubmVsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoZGV2VHlwZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9WSVJUSEJBOgorCQlzdHlwZSA9ICJ2SEJBIjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJUlROSUM6CisJCXN0eXBlID0gInZOSUMiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdHlwZSA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCUJ1c0RldmljZUluZm9fSW5pdCgmZGV2SW5mbywgc3R5cGUsCisJCQkgICB2aXJ0cGNpZHJ2LT5uYW1lLAorCQkJICAgdmlydHBjaWRydi0+dmVyc2lvbiwKKwkJCSAgIHZpcnRwY2lkcnYtPnZlcnRhZywKKwkJCSAgIHZpcnRwY2lkcnYtPmJ1aWxkX2RhdGUsIHZpcnRwY2lkcnYtPmJ1aWxkX3RpbWUpOworCXdyaXRlX3ZidXNfZGV2SW5mbyhwQ2hhbiwgJmRldkluZm8sIGRldk5vKTsKKworCS8qIFJlLXdyaXRlIGJ1cytjaGlwc2V0IGluZm8sIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzCisJKiB3YXMgcHJldmlvdXNseSB3cml0dGVuIGJ5IG91ciBnb29kIGNvdW50ZXJwYXJ0LCB2aXNvcmJ1cy4KKwkqLworCXdyaXRlX3ZidXNfY2hwSW5mbyhwQ2hhbiwgJkNoaXBzZXRfRHJpdmVySW5mbyk7CisJd3JpdGVfdmJ1c19idXNJbmZvKHBDaGFuLCAmQnVzX0RyaXZlckluZm8pOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBxdWVyeSB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lmaWMgZGV2aWNlCisqIGFuZCB3aGV0aGVyIHRoaXMgZHJpdmVyIGNhbiB3b3JrIHdpdGggaXQuICBJdCBzaG91bGQgcmV0dXJuIC1FTk9ERVYKKyogaW4gY2FzZSBvZiBmYWlsdXJlLgorKi8KK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiA9IGRldmljZV90b192aXJ0cGNpX2RldihkZXYpOworCXN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqdmlydHBjaWRydiA9CisJICAgIGRyaXZlcl90b192aXJ0cGNpX2RyaXZlcihkZXYtPmRyaXZlcik7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkOworCWludCBlcnJvciA9IDA7CisKKwlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3Byb2JlIGRldjolcCB2aXJ0cGNpZGV2OiVwIHZpcnRwY2lkcnY6JXBcbiIsCisJICAgICAgIGRldiwgdmlydHBjaWRldiwgdmlydHBjaWRydik7CS8qIFZFUkJPU0UvREVCVUcgPyAqLworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9QUk9CRV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJLyogc3RhdGljIG1hdGNoIGFuZCBzdGF0aWMgcHJvYmUgdnMgZHluYW1pYyBtYXRjaCAmIGR5bmFtaWMKKwkgKiBwcm9iZSAtIGRvIHdlIGNhcmU/LgorCSAqLworCWlmICghdmlydHBjaWRydi0+aWRfdGFibGUpCisJCXJldHVybiAtRU5PREVWOworCisJaWQgPSB2aXJ0cGNpX21hdGNoX2RldmljZSh2aXJ0cGNpZHJ2LT5pZF90YWJsZSwgdmlydHBjaWRldik7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50ICovCisJZ2V0X2RldmljZShkZXYpOworCisJLyogaWYgdmlydHBjaWRldiBpcyBub3QgYWxyZWFkeSBjbGFpbWVkICYgcHJvYmUgZnVuY3Rpb24gaXMKKwkgKiB2YWxpZCwgcHJvYmUgaXQKKwkgKi8KKwlpZiAoIXZpcnRwY2lkZXYtPm15ZHJpdmVyICYmIHZpcnRwY2lkcnYtPnByb2JlKSB7CisJCS8qIGNhbGwgdGhlIHByb2JlIGZ1bmN0aW9uIC0gdmlydGhiYSBvciB2aXJ0bmljIHByb2JlCisJCSAqIGlzIHdoYXQgaXQgc2hvdWxkIGJlCisJCSAqLworCQllcnJvciA9IHZpcnRwY2lkcnYtPnByb2JlKHZpcnRwY2lkZXYsIGlkKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZml4X3ZidXNfZGV2SW5mbyhkZXYsIHZpcnRwY2lkZXYtPmRldmljZU5vLAorCQkJCQkgdmlydHBjaWRldi0+ZGV2aWNlLCB2aXJ0cGNpZHJ2KTsKKwkJCXZpcnRwY2lkZXYtPm15ZHJpdmVyID0gdmlydHBjaWRydjsKKwkJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9QUk9CRV9FWElUX1BDLAorCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJCX0gZWxzZQorCQkJcHV0X2RldmljZShkZXYpOworCX0KKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwlyZXR1cm4gZXJyb3I7CQkvKiAtRU5PREVWIGZvciBwcm9iZSBmYWlsdXJlICovCit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldl8pCit7CisJLyogZGV2XyBwYXNzZWQgaW4gaXMgdGhlIEhCQSBkZXZpY2Ugd2hpY2ggd2UgY2FsbGVkCisJKiBnZW5lcmljX2RldiBpbiBvdXIgdmlydHBjaWRldiBzdHJ1Y3QKKwkqLworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiA9IGRldmljZV90b192aXJ0cGNpX2RldihkZXZfKTsKKwlzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKnZpcnRwY2lkcnYgPSB2aXJ0cGNpZGV2LT5teWRyaXZlcjsKKwlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3JlbW92ZSBidXNfaWQ6JXMgZGV2XzolcCB2aXJ0cGNpZGV2OiVwIGRldi0+ZHJpdmVyOiVwIGRyaXZlcm5hbWU6JXNcbiIsCisJICAgICAgIEJVU19JRChkZXZfKSwgZGV2XywgdmlydHBjaWRldiwgZGV2Xy0+ZHJpdmVyLAorCSAgICAgICBkZXZfLT5kcml2ZXItPm5hbWUpOwkvKiBWRVJCT1NFL0RFQlVHICovCisJaWYgKHZpcnRwY2lkcnYpIHsKKwkJLyogVEVNUDogYXNzdW1pbmcgd2UgaGF2ZSBvbmx5IG9uZSBzdWNoIGRyaXZlciBmb3Igbm93ICovCisJCWlmICh2aXJ0cGNpZHJ2LT5yZW1vdmUpCisJCQl2aXJ0cGNpZHJ2LT5yZW1vdmUodmlydHBjaWRldik7CisJCXZpcnRwY2lkZXYtPm15ZHJpdmVyID0gTlVMTDsKKwl9CisKKwlEQkdJTkYoImNhbGxpbmcgcHV0ZGV2aWNlXG4iKTsKKwlwdXRfZGV2aWNlKGRldl8pOworCisJREJHSU5GKCJMZWF2aW5nXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQnVzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB2aXJ0cGNpX2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUKKwkgKiBkZXZpY2UgaXMgcmVtb3ZlZAorCSAqLworCURCR0lORigiSW4gdmlydHBjaV9idXNfcmVsZWFzZVxuIik7CisJLyogd2hhdCBlbHNlIGlzIHN1cHBvc2VkIHRvIGhhcHBlbiBoZXJlPyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBZGFwdGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfYWRkKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywgaW50IGRldnR5cGUsCisJCQkgICAgICBzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0ICphZGRwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gKnNjc2ksIC8qIE5VTEwgZm9yIFZOSUMgYWRkICovCisJCQkgICAgICBzdHJ1Y3QgbmV0X2FkYXBfaW5mbyAqbmV0CS8qIE5VTEwgZm9yIFZIQkEgYWRkICovKQoreworCXN0cnVjdCB2aXJ0cGNpX2RldiAqdmlydHBjaWRldiA9IE5VTEw7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2ID0gTlVMTCwgKnByZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCVVMVFJBX0lPX0NIQU5ORUxfUFJPVE9DT0wgX19pb21lbSAqcElvQ2hhbiA9IE5VTEw7CisJc3RydWN0IGRldmljZSAqcERldjsKKworCUxPR0lORigidmlydHBjaV9kZXZpY2VfYWRkIHBhcmVudGJ1czolcCBjaGFucHRyOiVwXG4iLCBwYXJlbnRidXMsCisJICAgICAgIGFkZHBhcmFtcy0+Y2hhbnB0cik7CisKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBhZGQgZGV2aWNlOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCisJCSAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldnR5cGUsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCS8qIGFkZCBhIFZpcnR1YWwgRGV2aWNlICovCisJdmlydHBjaWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXJ0cGNpX2RldiksIEdGUF9BVE9NSUMpOworCWlmICh2aXJ0cGNpZGV2ID09IE5VTEwpIHsKKwkJTE9HRVJSKCJjYW4ndCBhZGQgZGV2aWNlIC0gbWFsbG9jIEZBTExFRFxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoTUFMTE9DX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCS8qIGluaXRpYWxpemUgc3R1ZmYgdW5pcXVlIHRvIHZpcnRwY2lfZGV2IHN0cnVjdCAqLworCXZpcnRwY2lkZXYtPmRldnR5cGUgPSBkZXZ0eXBlOworCWlmIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQl2aXJ0cGNpZGV2LT5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1ZJUlRIQkE7CisJCXZpcnRwY2lkZXYtPnNjc2kgPSAqc2NzaTsKKwl9IGVsc2UgeworCQl2aXJ0cGNpZGV2LT5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX1ZJUlROSUM7CisJCXZpcnRwY2lkZXYtPm5ldCA9ICpuZXQ7CisJfQorCXZpcnRwY2lkZXYtPnZlbmRvciA9IFBDSV9WRU5ET1JfSURfVU5JU1lTOworCXZpcnRwY2lkZXYtPmJ1c05vID0gYWRkcGFyYW1zLT5idXNObzsKKwl2aXJ0cGNpZGV2LT5kZXZpY2VObyA9IGFkZHBhcmFtcy0+ZGV2aWNlTm87CisKKwl2aXJ0cGNpZGV2LT5xdWV1ZWluZm8uY2hhbiA9IGFkZHBhcmFtcy0+Y2hhbnB0cjsKKwl2aXJ0cGNpZGV2LT5xdWV1ZWluZm8uc2VuZF9pbnRfaWZfbmVlZGVkID0gTlVMTDsKKworCS8qIFNldCB1cCBzYWZlIHF1ZXVlLi4uICovCisJcElvQ2hhbiA9IChVTFRSQV9JT19DSEFOTkVMX1BST1RPQ09MIF9faW9tZW0gKikKKwkJdmlydHBjaWRldi0+cXVldWVpbmZvLmNoYW47CisKKwl2aXJ0cGNpZGV2LT5pbnRyID0gYWRkcGFyYW1zLT5pbnRyOworCisJLyogaW5pdGlhbGl6ZSBzdHVmZiBpbiB0aGUgZGV2aWNlIHBvcnRpb24gb2YgdGhlIHN0cnVjdCAqLworCXZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LmJ1cyA9ICZ2aXJ0cGNpX2J1c190eXBlOworCXZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LnBhcmVudCA9IHBhcmVudGJ1czsKKwl2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldi5yZWxlYXNlID0gdmlydHBjaV9kZXZpY2VfcmVsZWFzZTsKKworCWRldl9zZXRfbmFtZSgmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYsICIleDoleCIsCisJCSAgICAgYWRkcGFyYW1zLT5idXNObywgYWRkcGFyYW1zLT5kZXZpY2VObyk7CisKKwkvKiBhZGQgdGhlIHZoYmEvdm5pYyB0byB2aXJ0cGNpIGRldmljZSBsaXN0IC0gYnV0IGNoZWNrIGZvcgorCSAqIGR1cGxpY2F0ZSB3d25uL21hY2FkZHIgZmlyc3QKKwkgKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCWZvciAodG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZDsgdG1wdnBjaWRldjsKKwkgICAgIHRtcHZwY2lkZXYgPSB0bXB2cGNpZGV2LT5uZXh0KSB7CisJCWlmIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQkJaWYgKCh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjEgPT0gc2NzaS0+d3dubi53d25uMSkgJiYKKwkJCSAgICAodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4yID09IHNjc2ktPnd3bm4ud3dubjIpKSB7CisJCQkJLyogZHVwbGljYXRlIC0gYWxyZWFkeSBoYXZlIHZwY2lkZXYKKwkJCQkgICB3aXRoIHRoaXMgd3dubiAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJICAgIGlmIChtZW1jbXAKKwkJCSh0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHIsIG5ldC0+bWFjX2FkZHIsCisJCQkgTUFYX01BQ0FERFJfTEVOKSA9PSAwKSB7CisJCQkvKiBkdXBsaWNhdGUgLSBhbHJlYWR5IGhhdmUgdm5pYyB3aXRoIHRoaXMgd3dubiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHRtcHZwY2lkZXYpIHsKKwkJLyogZm91bmQgYSB2aGJhL3ZuaWMgYWxyZWFkeSBpbiB0aGUgbGlzdCB3aXRoIHNhbWUKKwkJICogd3dubiBvciBtYWNhZGRyIC0gcmVqZWN0IGFkZAorCQkgKi8KKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCQlrZnJlZSh2aXJ0cGNpZGV2KTsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB2aGJhL3ZuaWMgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGxpc3RcbiIpOworCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiAwOworCX0KKworCS8qIGFkZCBpdCBhdCB0aGUgaGVhZCAqLworCWlmICghVnBjaWRldkxpc3RIZWFkKQorCQlWcGNpZGV2TGlzdEhlYWQgPSB2aXJ0cGNpZGV2OworCWVsc2UgeworCQkvKiBpbnNlcnQgdmlydHBjaWRldiBhdCB0aGUgaGVhZCBvZiBvdXIgbGlua2VkIGxpc3Qgb2YKKwkJICogdnBjaWRldnMKKwkJICovCisJCXZpcnRwY2lkZXYtPm5leHQgPSBWcGNpZGV2TGlzdEhlYWQ7CisJCVZwY2lkZXZMaXN0SGVhZCA9IHZpcnRwY2lkZXY7CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJLyogTXVzdCB0cmFuc2l0aW9uIGNoYW5uZWwgdG8gQVRUQUNIRUQgc3RhdGUgQkVGT1JFCisJICogcmVnaXN0ZXJpbmcgdGhlIGRldmljZSwgYmVjYXVzZSBwb2xsaW5nIG9mIHRoZSBjaGFubmVsCisJICogcXVldWVzIGNhbiBiZWdpbiBhdCBhbnkgdGltZSBhZnRlciBkZXZpY2VfcmVnaXN0ZXIoKS4KKwkgKi8KKwlwRGV2ID0gJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2OworCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1RSQU5TSVRJT04oYWRkcGFyYW1zLT5jaGFucHRyLAorCQkJCQlCVVNfSUQocERldiksCisJCQkJCUNIQU5ORUxDTElfQVRUQUNIRUQsIE5VTEwpOworCisJLyogZG9uJ3QgcmVnaXN0ZXIgdW50aWwgZGV2aWNlIGhhcyBiZWVuIGFkZGVkIHRvCisJKiBsaXN0LiBPdGhlcndpc2UsIGEgZGV2aWNlX3VucmVnaXN0ZXIgZnJvbSB0aGlzIGZ1bmN0aW9uIGNhbgorCSogY2F1c2UgYSAic2NoZWR1bGluZyB3aGlsZSBhdG9taWMiLgorCSovCisJREJHSU5GKCJyZWdpc3RlcmluZyBkZXZpY2U6JXAgd2l0aCBidXNfaWQ6JXNcbiIsCisJICAgICAgICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2RldiwgdmlydHBjaWRldi0+Z2VuZXJpY19kZXYuYnVzX2lkKTsKKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2KTsKKwkvKiBOT1RFOiBUSElTIElTIENBTExJTkcgSE9UUExVRyB2aXJ0cGNpX2hvdHBsdWchISEKKwkgKiBUaGlzIGNhbGwgdG8gZGV2aWNlX3JlZ2lzdGVyIHJlc3VsdHMgaW4gdmlydHBjaV9idXNfbWF0Y2gKKwkgKiBiZWluZyBjYWxsZWQgISEhISEgIEFuZCwgaWYgbWF0Y2ggcmV0dXJucyBzdWNjZXNzLCB0aGVuCisJICogdmlydHBjaWRldi0+Z2VuZXJpY19kZXYuZHJpdmVyIGlzIHNldHVwIHRvIGNvcmVfZHJpdmVyLAorCSAqIGkuZS4sIHZpcnRwY2kgYW5kIHRoZSBwcm9iZSBmdW5jdGlvbgorCSAqIHZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LmRyaXZlci0+cHJvYmUgaXMgY2FsbGVkIHdoaWNoCisJICogcmVzdWx0cyBpbiB2aXJ0cGNpX2RldmljZV9wcm9iZSBiZWluZyBjYWxsZWQuIEFuZCBpZgorCSAqIHZpcnRwY2lfZGV2aWNlX3Byb2JlIGlzIHN1Y2Nlc3NmdWwKKwkgKi8KKwlpZiAocmV0KSB7CisJCUxPR0VSUigiZGV2aWNlX3JlZ2lzdGVyIHJldHVybmVkICVkXG4iLCByZXQpOworCQlwRGV2ID0gJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2OworCQlVTFRSQV9DSEFOTkVMX0NMSUVOVF9UUkFOU0lUSU9OKGFkZHBhcmFtcy0+Y2hhbnB0ciwKKwkJCQkJCUJVU19JRChwRGV2KSwKKwkJCQkJCUNIQU5ORUxDTElfREVUQUNIRUQsIE5VTEwpOworCQkvKiByZW1vdmUgdmlydHBjaWRldiwgdGhlIG9uZSB3ZSBqdXN0IGFkZGVkLCBmcm9tIHRoZSBsaXN0ICovCisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJCWZvciAodG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZCwgcHJldiA9IE5VTEw7CisJCSAgICAgdG1wdnBjaWRldjsKKwkJICAgICBwcmV2ID0gdG1wdnBjaWRldiwgdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQpIHsKKwkJCWlmICh0bXB2cGNpZGV2ID09IHZpcnRwY2lkZXYpIHsKKwkJCQlpZiAocHJldikKKwkJCQkJcHJldi0+bmV4dCA9IHRtcHZwY2lkZXYtPm5leHQ7CisJCQkJZWxzZQorCQkJCQlWcGNpZGV2TGlzdEhlYWQgPSB0bXB2cGNpZGV2LT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKwkJa2ZyZWUodmlydHBjaWRldik7CisJCXJldHVybiAwOworCX0KKworCUxPR0lORigiQWRkZWQgJXM6JWQ6JWQgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2OiVwXG4iLAorCSAgICAgICAoZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpID8gInZpcnRoYmEiIDogInZpcnRuaWMiLAorCSAgICAgICBhZGRwYXJhbXMtPmJ1c05vLCBhZGRwYXJhbXMtPmRldmljZU5vLCAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYpOworCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihzdHJ1Y3QgZGV2aWNlICpwYXJlbnRidXMsCisJCQkJICAgICBpbnQgZGV2dHlwZSwKKwkJCQkgICAgIHN0cnVjdCB2aGJhX3d3bm4gKnd3bm4sCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIG1hY2FkZHJbXSkKK3sKKwlpbnQgcGF1c2V0aGlzb25lID0gMDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2LCAqcHJldnZwY2lkZXY7CisJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2cGNpZHJpdmVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBwYXVzZSBkZXZpY2U7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKKwkJICAgICAgIGRldnR5cGUsIFZJUlRIQkFfVFlQRSwgVklSVE5JQ19UWVBFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmluZCB0aGUgdmhiYSBvciB2bmljIGluIHZpcnRwY2kgZGV2aWNlIGxpc3QgKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJZm9yICh0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkLCBwcmV2dnBjaWRldiA9IE5VTEw7CisJICAgICAodG1wdnBjaWRldiAmJiAhZm91bmQpOworCSAgICAgcHJldnZwY2lkZXYgPSB0bXB2cGNpZGV2LCB0bXB2cGNpZGV2ID0gdG1wdnBjaWRldi0+bmV4dCkgeworCQlpZiAodG1wdnBjaWRldi0+ZGV2dHlwZSAhPSBkZXZ0eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlwYXVzZXRoaXNvbmUgPQorCQkJICAgICgodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4xID09IHd3bm4tPnd3bm4xKSAmJgorCQkJICAgICAodG1wdnBjaWRldi0+c2NzaS53d25uLnd3bm4yID09IHd3bm4tPnd3bm4yKSk7CisJCQkvKiBkZXZ0eXBlIGlzIHZoYmEsIHdlJ3JlIHBhdXNpbmcgdmhiYSB3aG9zZQorCQkJKiB3d25uIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3Mgd3dubgorCQkJKi8KKwkJfSBlbHNlIHsJLyogVklSVE5JQ19UWVBFICovCisJCQlwYXVzZXRoaXNvbmUgPQorCQkJICAgIG1lbWNtcCh0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHIsIG1hY2FkZHIsCisJCQkJICAgTUFYX01BQ0FERFJfTEVOKSA9PSAwOworCQkJLyogZGV2dHlwZSBpcyB2bmljLCB3ZSdyZSBwYXVzaW5nIHZuaWMgd2hvc2UKKwkJCSogbWFjYWRkciBtYXRjaGVzIHRoZSBjdXJyZW50IGRldmljZSdzIG1hY2FkZHIgKi8KKwkJfQorCisJCWlmICghcGF1c2V0aGlzb25lKQorCQkJY29udGludWU7CisKKwkJZm91bmQgPSB0cnVlOworCQl2cGNpZHJpdmVyID0gdG1wdnBjaWRldi0+bXlkcml2ZXI7CisJCXJjID0gdnBjaWRyaXZlci0+c3VzcGVuZCh0bXB2cGNpZGV2LCAwKTsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJaWYgKCFmb3VuZCkgeworCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGZpbmQgdmhiYS92bmljIGluIHRoZSBsaXN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZpcnRwY2lfZGV2aWNlX3NlcnZlcnVwKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywKKwkJCQkgICBpbnQgZGV2dHlwZSwKKwkJCQkgICBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltdKQoreworCWludCByZXN1bWV0aGlzb25lID0gMDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2LCAqcHJldnZwY2lkZXY7CisJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2cGNpZHJpdmVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byByZXN1bWUgZGV2aWNlOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCisJCSAgICAgICBkZXZ0eXBlLCBWSVJUSEJBX1RZUEUsIFZJUlROSUNfVFlQRSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpbmQgdGhlIHZoYmEgb3Igdm5pYyBpbiB2aXJ0cGNpIGRldmljZSBsaXN0ICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZWcGNpZGV2TGlzdExvY2ssIGZsYWdzKTsKKworCWZvciAodG1wdnBjaWRldiA9IFZwY2lkZXZMaXN0SGVhZCwgcHJldnZwY2lkZXYgPSBOVUxMOworCSAgICAgKHRtcHZwY2lkZXYgJiYgIWZvdW5kKTsKKwkgICAgIHByZXZ2cGNpZGV2ID0gdG1wdnBjaWRldiwgdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQpIHsKKwkJaWYgKHRtcHZwY2lkZXYtPmRldnR5cGUgIT0gZGV2dHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQkJcmVzdW1ldGhpc29uZSA9CisJCQkgICAgKCh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjEgPT0gd3dubi0+d3dubjEpICYmCisJCQkgICAgICh0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjIgPT0gd3dubi0+d3dubjIpKTsKKwkJCS8qIGRldnR5cGUgaXMgdmhiYSwgd2UncmUgcmVzdW1pbmcgdmhiYSB3aG9zZQorCQkJKiB3d25uIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3Mgd3dubiAqLworCQl9IGVsc2UgewkvKiBWSVJUTklDX1RZUEUgKi8KKwkJCXJlc3VtZXRoaXNvbmUgPQorCQkJICAgIG1lbWNtcCh0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHIsIG1hY2FkZHIsCisJCQkJICAgTUFYX01BQ0FERFJfTEVOKSA9PSAwOworCQkJLyogZGV2dHlwZSBpcyB2bmljLCB3ZSdyZSByZXN1bWluZyB2bmljIHdob3NlCisJCQkqIG1hY2FkZHIgbWF0Y2hlcyB0aGUgY3VycmVudCBkZXZpY2UncyBtYWNhZGRyICovCisJCX0KKworCQlpZiAoIXJlc3VtZXRoaXNvbmUpCisJCQljb250aW51ZTsKKworCQlmb3VuZCA9IHRydWU7CisJCXZwY2lkcml2ZXIgPSB0bXB2cGNpZGV2LT5teWRyaXZlcjsKKwkJLyogVGhpcyBzaG91bGQgYmUgZG9uZSBhdCBCVVMgcmVzdW1lIHRpbWUsIGJ1dCBhbgorCQkqIGV4aXN0aW5nIHByb2JsZW0gcHJldmVudHMgdXMgZnJvbSBldmVyIGdldHRpbmcgYSBidXMKKwkJKiByZXN1bWUuLi4gIFRoaXMgaGFjayB3b3VsZCBmYWlsIHRvIHdvcmsgc2hvdWxkIHdlCisJCSogZXZlciBoYXZlIGEgYnVzIHRoYXQgY29udGFpbnMgTk8gZGV2aWNlcywgc2luY2Ugd2UKKwkJKiB3b3VsZCBuZXZlciBldmVuIGdldCBoZXJlIGluIHRoYXQgY2FzZS4KKwkJKi8KKwkJZml4X3ZidXNfZGV2SW5mbygmdG1wdnBjaWRldi0+Z2VuZXJpY19kZXYsIHRtcHZwY2lkZXYtPmRldmljZU5vLAorCQkJCSB0bXB2cGNpZGV2LT5kZXZpY2UsIHZwY2lkcml2ZXIpOworCQlyYyA9IHZwY2lkcml2ZXItPnJlc3VtZSh0bXB2cGNpZGV2KTsKKwl9CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwlpZiAoIWZvdW5kKSB7CisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZmluZCB2aGJhL3ZuaWMgaW4gdGhlIGxpc3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdmlydHBjaV9kZXZpY2VfZGVsKHN0cnVjdCBkZXZpY2UgKnBhcmVudGJ1cywKKwkJCSAgICAgIGludCBkZXZ0eXBlLCBzdHJ1Y3QgdmhiYV93d25uICp3d25uLAorCQkJICAgICAgdW5zaWduZWQgY2hhciBtYWNhZGRyW10pCit7CisJaW50IGNvdW50ID0gMCwgYWxsID0gMCwgZGVsdGhpc29uZTsKKwlzdHJ1Y3QgdmlydHBjaV9kZXYgKnRtcHZwY2lkZXYsICpwcmV2dnBjaWRldiwgKmRlbGxpc3QgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNkZWZpbmUgREVMX0NPTlRJTlVFIHsgXAorCXByZXZ2cGNpZGV2ID0gdG1wdnBjaWRldjtcCisJdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQ7XAorCWNvbnRpbnVlOyBcCit9CisKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7CisJCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZGVsZXRlIGRldmljZTsgZGV2dHlwZTolZCBub3QgdmhiYTolZCBvciB2bmljOiVkXG4iLAorCQkgICAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzZWUgaWYgd2UgYXJlIHRvIGRlbGV0ZSBhbGwgLSBOT1RFOiBhbGwgaW1wbGllcyB3ZSBoYXZlIGEKKwkgKiB2YWxpZCBwYXJlbnRidXMKKwkgKi8KKwlhbGwgPSAoKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSAmJiAod3dubiA9PSBOVUxMKSkgfHwKKwkgICAgKChkZXZ0eXBlID09IFZJUlROSUNfVFlQRSkgJiYgKG1hY2FkZHIgPT0gTlVMTCkpOworCisJLyogZmluZCBhbGwgdGhlIHZoYmEgb3Igdm5pYyBvciBib3RoIGluIHZpcnRwY2kgZGV2aWNlIGxpc3QKKwkqIGtlZXAgbGlzdCBvZiBvbmVzIHdlIGFyZSBkZWxldGluZyBzbyB3ZSBjYW4gY2FsbAorCSogZGV2aWNlX3VucmVnaXN0ZXIgYWZ0ZXIgd2UgcmVsZWFzZSB0aGUgbG9jazsgb3RoZXJ3aXNlIHdlCisJKiBlbmNvdW50ZXIgInNjaGVkdWxlIHdoaWxlIGF0b21pYyIKKwkqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisJZm9yICh0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkLCBwcmV2dnBjaWRldiA9IE5VTEw7IHRtcHZwY2lkZXY7KSB7CisJCWlmICh0bXB2cGNpZGV2LT5kZXZ0eXBlICE9IGRldnR5cGUpCisJCQlERUxfQ09OVElOVUU7CisKKwkJaWYgKGFsbCkgeworCQkJZGVsdGhpc29uZSA9CisJCQkgICAgKHRtcHZwY2lkZXYtPmdlbmVyaWNfZGV2LnBhcmVudCA9PSBwYXJlbnRidXMpOworCQkJLyogd2UncmUgZGVsZXRpbmcgYWxsIHZoYmFzIG9yIHZuaWNzIG9uIHRoZQorCQkJICogc3BlY2lmaWVkIHBhcmVudCBidXMKKwkJCSAqLworCQl9IGVsc2UgaWYgKGRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlkZWx0aGlzb25lID0KKwkJCSAgICAoKHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMSA9PSB3d25uLT53d25uMSkgJiYKKwkJCSAgICAgKHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMiA9PSB3d25uLT53d25uMikpOworCQkJLyogZGV2dHlwZSBpcyB2aGJhLCB3ZSdyZSBkZWxldGluZyB2aGJhIHdob3NlCisJCQkgKiB3d25uIG1hdGNoZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3Mgd3dubgorCQkJICovCisJCX0gZWxzZSB7CS8qIFZJUlROSUNfVFlQRSAqLworCQkJZGVsdGhpc29uZSA9CisJCQkgICAgbWVtY21wKHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkciwgbWFjYWRkciwKKwkJCQkgICBNQVhfTUFDQUREUl9MRU4pID09IDA7CisJCQkvKiBkZXZ0eXBlIGlzIHZuaWMsIHdlJ3JlIGRlbGV0aW5nIHZuaWMgd2hvc2UKKwkJCSogbWFjYWRkciBtYXRjaGVzIHRoZSBjdXJyZW50IGRldmljZSdzIG1hY2FkZHIKKwkJCSovCisJCX0KKworCQlpZiAoIWRlbHRoaXNvbmUpCisJCQlERUxfQ09OVElOVUU7CisKKwkJLyogdGFrZSB2aGJhL3ZuaWMgb3V0IG9mIHRoZSBsaXN0ICovCisJCWlmIChwcmV2dnBjaWRldikKKwkJCS8qIG5vdCBhdCBoZWFkICovCisJCQlwcmV2dnBjaWRldi0+bmV4dCA9IHRtcHZwY2lkZXYtPm5leHQ7CisJCWVsc2UKKwkJCVZwY2lkZXZMaXN0SGVhZCA9IHRtcHZwY2lkZXYtPm5leHQ7CisKKwkJLyogYWRkIGl0IHRvIG91ciBkZWxldGVsaXN0ICovCisJCXRtcHZwY2lkZXYtPm5leHQgPSBkZWxsaXN0OworCQlkZWxsaXN0ID0gdG1wdnBjaWRldjsKKworCQljb3VudCsrOworCQlpZiAoIWFsbCkKKwkJCWJyZWFrOwkvKiBkb25lICovCisJCS8qIGdvaW5nIHRvIHRvcCBvZiBsb29wIGFnYWluIC0gc2V0IHRtcHZwY2lkZXYgdG8gbmV4dAorCQkgKiBvbmUgd2UncmUgdG8gcHJvY2VzcworCQkgKi8KKwkJaWYgKHByZXZ2cGNpZGV2KQorCQkJdG1wdnBjaWRldiA9IHByZXZ2cGNpZGV2LT5uZXh0OworCQllbHNlCisJCQl0bXB2cGNpZGV2ID0gVnBjaWRldkxpc3RIZWFkOworCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmVnBjaWRldkxpc3RMb2NrLCBmbGFncyk7CisKKwlpZiAoIWFsbCAmJiAoY291bnQgPT0gMCkpIHsKKwkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIG5vdyBkZWxldGUgZWFjaCBvbmUgZnJvbSBkZWxldGUgbGlzdCAqLworCXdoaWxlIChkZWxsaXN0KSB7CisJCS8qIHNhdmUgbmV4dCAqLworCQl0bXB2cGNpZGV2ID0gZGVsbGlzdC0+bmV4dDsKKwkJLyogZGVsZXRlIHRoZSB2aGJhL3ZuaWMgYXQgZGVsbGlzdCAqLworCQlERUxFVEVfT05FX1ZQQ0lERVYoZGVsbGlzdCk7CisJCS8qIGRvIG5leHQgKi8KKwkJZGVsbGlzdCA9IHRtcHZwY2lkZXY7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCB2aXJ0cGNpX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldl8pCit7CisJLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlCisJICogZGV2aWNlIGlzIHJlbW92ZWQKKwkgKi8KKwlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3JlbGVhc2U6JXAgLSBOT1QgWUVUIElNUExFTUVOVEVEXG4iLCBkZXZfKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRHJpdmVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGtvYmpfdG9fZGV2aWNlX2RyaXZlcihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfZHJpdmVyLCBrb2JqKQorI2RlZmluZSBhdHRyaWJ1dGVfdG9fZHJpdmVyX2F0dHJpYnV0ZShvYmopIFwKKwljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSwgYXR0cikKKworc3RhdGljIHNzaXplX3QgdmlydHBjaV9kcml2ZXJfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKmRhdHRyID0gYXR0cmlidXRlX3RvX2RyaXZlcl9hdHRyaWJ1dGUoYXR0cik7CisJc3NpemVfdCByZXQgPSAwOworCisJc3RydWN0IGRyaXZlcl9wcml2YXRlICpkcHJpdmF0ZSA9IHRvX2RyaXZlcihrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOworCWlmIChkcHJpdmF0ZSAhPSBOVUxMKQorCQlkcml2ZXIgPSBkcHJpdmF0ZS0+ZHJpdmVyOworCWVsc2UKKwkJZHJpdmVyID0gTlVMTDsKKworCURCR0lORigiSW4gdmlydHBjaV9kcml2ZXJfYXR0cl9zaG93IGRyaXZlci0+bmFtZTolc1xuIiwgZHJpdmVyLT5uYW1lKTsKKwlpZiAoZHJpdmVyKSB7CisJCWlmIChkYXR0ci0+c2hvdykKKwkJCXJldCA9IGRhdHRyLT5zaG93KGRyaXZlciwgYnVmKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdmlydHBjaV9kcml2ZXJfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqZGF0dHIgPSBhdHRyaWJ1dGVfdG9fZHJpdmVyX2F0dHJpYnV0ZShhdHRyKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlzdHJ1Y3QgZHJpdmVyX3ByaXZhdGUgKmRwcml2YXRlID0gdG9fZHJpdmVyKGtvYmopOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7CisJaWYgKGRwcml2YXRlICE9IE5VTEwpCisJCWRyaXZlciA9IGRwcml2YXRlLT5kcml2ZXI7CisJZWxzZQorCQlkcml2ZXIgPSBOVUxMOworCisJREJHSU5GKCJJbiB2aXJ0cGNpX2RyaXZlcl9hdHRyX3N0b3JlIGRyaXZlci0+bmFtZTolc1xuIiwgZHJpdmVyLT5uYW1lKTsKKworCWlmIChkcml2ZXIpIHsKKwkJaWYgKGRhdHRyLT5zdG9yZSkKKwkJCXJldCA9IGRhdHRyLT5zdG9yZShkcml2ZXIsIGJ1ZiwgY291bnQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiByZWdpc3RlciBhIG5ldyB2aXJ0cGNpIGRyaXZlciAqLworaW50IHZpcnRwY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqZHJ2KQoreworCWludCByZXN1bHQgPSAwOworCisJREJHSU5GKCJJbiB2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlclxuIik7CisKKwlpZiAoZHJ2LT5pZF90YWJsZSA9PSBOVUxMKSB7CisJCUxPR0VSUigiaWRfdGFibGUgbWlzc2luZ1xuIik7CisJCXJldHVybiAxOworCX0KKwkvKiBpbml0aWFsaXplIGNvcmUgZHJpdmVyIGZpZWxkcyBuZWVkZWQgdG8gY2FsbCBkcml2ZXJfcmVnaXN0ZXIgKi8KKwlkcnYtPmNvcmVfZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CS8qIG5hbWUgb2YgZHJpdmVyIGluIHN5c2ZzICovCisJZHJ2LT5jb3JlX2RyaXZlci5idXMgPSAmdmlydHBjaV9idXNfdHlwZTsJLyogdHlwZSBvZiBidXMgdGhpcworCQkJCQkJCSAqIGRyaXZlciB3b3JrcyB3aXRoICovCisJZHJ2LT5jb3JlX2RyaXZlci5wcm9iZSA9IHZpcnRwY2lfZGV2aWNlX3Byb2JlOwkvKiBjYWxsZWQgdG8gcXVlcnkgdGhlCisJCQkJCQkJICogZXhpc3RlbmNlIG9mIGEKKwkJCQkJCQkgKiBzcGVjaWZpYyBkZXZpY2UgYW5kCisJCQkJCQkJICogd2hldGhlciB0aGlzIGRyaXZlcgorCQkJCQkJCSAqY2FuIHdvcmsgd2l0aCBpdCAqLworCWRydi0+Y29yZV9kcml2ZXIucmVtb3ZlID0gdmlydHBjaV9kZXZpY2VfcmVtb3ZlOyAvKiBjYWxsZWQgd2hlbiB0aGUKKwkJCQkJCQkgICogZGV2aWNlIGlzIHJlbW92ZWQKKwkJCQkJCQkgICogZnJvbSB0aGUgc3lzdGVtICovCisJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCisJcmVzdWx0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmVfZHJpdmVyKTsKKwkvKiBjYWxscyBidXNfYWRkX2RyaXZlciB3aGljaCBjYWxscyBkcml2ZXJfYXR0YWNoIGFuZAorCSAqIG1vZHVsZV9hZGRfZHJpdmVyCisJICovCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsJLyogZmFpbGVkICovCisKKwlkcnYtPmNvcmVfZHJpdmVyLnAtPmtvYmoua3R5cGUgPSAmdmlydHBjaV9kcml2ZXJfa29ial90eXBlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlcik7CisKK3ZvaWQgdmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKmRydikKK3sKKwlEQkdJTkYoIkluIHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgZHJ2OiVwXG4iLCBkcnYpOworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmNvcmVfZHJpdmVyKTsKKwkvKiBkcml2ZXJfdW5yZWdpc3RlciBjYWxscyBidXNfcmVtb3ZlX2RyaXZlcgorCSAqIGJ1c19yZW1vdmVfZHJpdmVyIGNhbGxzIGRldmljZV9kZXRhY2gKKwkgKiBkZXZpY2VfZGV0YWNoIGNhbGxzIGRldmljZV9yZWxlYXNlX2RyaXZlciBmb3IgZWFjaCBvZiB0aGUKKwkgKiBkcml2ZXIncyBkZXZpY2VzCisJICogZGV2aWNlX3JlbGVhc2UgZHJpdmVyIGNhbGxzIGRydi0+cmVtb3ZlIHdoaWNoIGlzCisJICogdmlydHBjaV9kZXZpY2VfcmVtb3ZlCisJICogdmlydHBjaV9kZXZpY2VfcmVtb3ZlIGNhbGxzIHZpcnRoYmFfcmVtb3ZlCisJICovCisJREJHSU5GKCJMZWF2aW5nXG4iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwcm9jIGZpbGVzeXN0ZW0gZnVuY3Rpb25zCQkJCQkJICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcHJpbnRfdmJ1c19pbmZvIHsKKwlpbnQgKmxlbmd0aDsKKwljaGFyICpidWY7Cit9OworCitzdGF0aWMgaW50IHByaW50X3ZidXMoc3RydWN0IGRldmljZSAqdmJ1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJpbnRfdmJ1c19pbmZvICpwID0gKHN0cnVjdCBwcmludF92YnVzX2luZm8gKikgZGF0YTsKKwlpbnQgbCA9ICoocC0+bGVuZ3RoKTsKKworCSoocC0+bGVuZ3RoKSA9IGwgKyBzcHJpbnRmKHAtPmJ1ZiArIGwsICJidXNfaWQ6JXNcbiIsIGRldl9uYW1lKHZidXMpKTsKKwlyZXR1cm4gMDsJCS8qIG5vIGVycm9yICovCit9CisKK3N0YXRpYyBzc2l6ZV90IGluZm9fcHJvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJaW50IGxlbmd0aCA9IDA7CisJc3RydWN0IHZpcnRwY2lfZGV2ICp0bXB2cGNpZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHByaW50X3ZidXNfaW5mbyBwcmludHBhcmFtOworCWNoYXIgKnZidWY7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zID4gMCB8fCAhbGVuKQorCQlyZXR1cm4gMDsKKworCXZidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbmd0aCArPSBzcHJpbnRmKHZidWYgKyBsZW5ndGgsICJDSEFOU09DSyBpcyBub3QgZGVmaW5lZC5cbiIpOworCisJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuIFZpcnR1YWwgUENJIEJ1cyBkZXZpY2VzXG4iKTsKKwlwcmludHBhcmFtLmxlbmd0aCA9ICZsZW5ndGg7CisJcHJpbnRwYXJhbS5idWYgPSB2YnVmOworCWlmIChidXNfZm9yX2VhY2hfZGV2KCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAorCQkJICAgICAodm9pZCAqKSAmcHJpbnRwYXJhbSwgcHJpbnRfdmJ1cykpCisJCUxPR0VSUigiZGVsZXRlIG9mIGFsbCB2YnVzIGZhaWxlZFxuIik7CisKKwlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiXG4gVmlydHVhbCBQQ0kgZGV2aWNlc1xuIik7CisJcmVhZF9sb2NrX2lycXNhdmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCXRtcHZwY2lkZXYgPSBWcGNpZGV2TGlzdEhlYWQ7CisJd2hpbGUgKHRtcHZwY2lkZXYpIHsKKwkJaWYgKHRtcHZwY2lkZXYtPmRldnR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlsZW5ndGggKz0gc3ByaW50Zih2YnVmICsgbGVuZ3RoLCAiWyVkOiVkXSBWSGJhOiUwOHg6JTA4eCBtYXgtY29uZmlnOiVkLSVkLSVkLSVkIiwKKwkJCQkgICAgdG1wdnBjaWRldi0+YnVzTm8sIHRtcHZwY2lkZXYtPmRldmljZU5vLAorCQkJCSAgICB0bXB2cGNpZGV2LT5zY3NpLnd3bm4ud3dubjEsCisJCQkJICAgIHRtcHZwY2lkZXYtPnNjc2kud3dubi53d25uMiwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS5tYXgubWF4X2NoYW5uZWwsCisJCQkJICAgIHRtcHZwY2lkZXYtPnNjc2kubWF4Lm1heF9pZCwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS5tYXgubWF4X2x1biwKKwkJCQkgICAgdG1wdnBjaWRldi0+c2NzaS5tYXguY21kX3Blcl9sdW4pOworCQl9IGVsc2UgeworCQkJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlslZDolZF0gVk5pYzolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBudW1fcmN2X2J1ZnM6JWQgbXR1OiVkIiwKKwkJCQkgICAgdG1wdnBjaWRldi0+YnVzTm8sIHRtcHZwY2lkZXYtPmRldmljZU5vLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbMF0sCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkclsxXSwKKwkJCQkgICAgdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzJdLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbM10sCisJCQkJICAgIHRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkcls0XSwKKwkJCQkgICAgdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzVdLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubnVtX3Jjdl9idWZzLAorCQkJCSAgICB0bXB2cGNpZGV2LT5uZXQubXR1KTsKKwkJfQorCQlsZW5ndGggKz0KKwkJICAgIHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIiBjaGFucHRyOiVwXG4iLAorCQkJICAgIHRtcHZwY2lkZXYtPnF1ZXVlaW5mby5jaGFuKTsKKwkJdG1wdnBjaWRldiA9IHRtcHZwY2lkZXYtPm5leHQ7CisJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJlZwY2lkZXZMaXN0TG9jaywgZmxhZ3MpOworCisJbGVuZ3RoICs9CisJICAgIHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuTW9kdWxlIGJ1aWxkOiBEYXRlOiVzIFRpbWU6JXNcbiIsIF9fREFURV9fLAorCQkgICAgX19USU1FX18pOworCisJbGVuZ3RoICs9IHNwcmludGYodmJ1ZiArIGxlbmd0aCwgIlxuIik7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZidWYsIGxlbmd0aCkpIHsKKwkJa2ZyZWUodmJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKHZidWYpOworCSpvZmZzZXQgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZpcnRfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlsxNl07CisJaW50IHR5cGUsIGksIGFjdGlvbiA9IDB4ZmZmZjsKKwl1bnNpZ25lZCBpbnQgYnVzbm8sIGRldmljZW5vOworCXZvaWQgX19pb21lbSAqY2hhbnB0cjsKKwlzdHJ1Y3QgYWRkX3ZidXNfZ3Vlc3RwYXJ0IGJ1c2FkZHBhcmFtczsKKwlzdHJ1Y3QgYWRkX3ZpcnRfZ3Vlc3RwYXJ0IGFkZHBhcmFtczsKKwlzdHJ1Y3QgZGVsX3ZidXNfZ3Vlc3RwYXJ0IGJ1c2RlbHBhcmFtczsKKwlzdHJ1Y3QgZGVsX3ZpcnRfZ3Vlc3RwYXJ0IGRlbHBhcmFtczsKKwlHVUlEIGR1bW15R3VpZCA9IEdVSUQwOworI2lmZGVmIFNUT1JBR0VfQ0hBTk5FTAorCVU2NCBzdG9yYWdlY2hhbm5lbDsKKyNlbmRpZgorCisjZGVmaW5lIFBSSU5UX1VTQUdFX1JFVFVSTiB7XAorCUxPR0VSUigidXNhZ2U6IDAtMC08Y2hhbnB0cj4JCQkJCT09PiBkZWxldGUgdmhiYVxuIik7IFwKKwlMT0dFUlIoInVzYWdlOiAwLTEtPGNoYW5wdHI+LTxidXNObz4tPGRldmljZU5vPgk9PT4gYWRkIHZoYmFcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogMC1mLTxidXNObz4JCQkJCQk9PT4gZGVsZXRlIGFsbCB2aGJhc1xuIik7IFwKKwlMT0dFUlIoIlxuIik7IFwKKwlMT0dFUlIoInVzYWdlOiAxLTAtPGNoYW5wdHI+CQkJCQk9PT4gZGVsZXRlIHZuaWNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogMS0xLTxjaGFucHRyPi08YnVzTm8+LTxkZXZpY2VObz4JPT0+IGFkZCB2bmljXG4iKTsgXAorCUxPR0VSUigidXNhZ2U6IDEtZi08YnVzTm8+CQkJCQkJPT0+IGRlbGV0ZSBhbGwgdm5pY3NcbiIpOyBcCisJTE9HRVJSKCJcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogNi0wLTxidXNObz4JCQkJCQk9PT4gZGVsZXRlIHZidXNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogNi0xLTxidXNObz4JCQkJCQk9PT4gYWRkIHZidXNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogNi1mCQkJCQkJCQk9PT4gZGVsZXRlIGFsbCB2YnVzZXNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogOTgtPGJ1c05vPi08ZGV2aWNlTm8+CQkJPT0+IElOSkVDVCBDbGllbnQgZGVsZXRlIHZuaWNcbiIpOyBcCisJTE9HRVJSKCJ1c2FnZTogOTktPGNoYW5wdHI+LTxidXNObz4tPGRldmljZU5vPgk9PT4gSU5KRUNUIENsaWVudCBhZGQgdm5pY1xuIik7IFwKKwlyZXR1cm4gLUVJTlZBTDsgXAorfQorCisJaWYgKGNvdW50ID49IEFSUkFZX1NJWkUoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlMT0dFUlIoImNvcHlfZnJvbV91c2VyIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiV4LSV4IiwgJnR5cGUsICZhY3Rpb24pOworCWlmIChpIDwgMikKKwkJUFJJTlRfVVNBR0VfUkVUVVJOOworCisJaWYgKHR5cGUgPT0gMHg5OCkgeworCQkvKiBjbGllbnQgaW5qZWN0IGRlbGV0ZSB2bmljICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJWQtJWQiLCAmdHlwZSwgJmJ1c25vLCAmZGV2aWNlbm8pOworCQlpZiAoaSAhPSAzKQorCQkJUFJJTlRfVVNBR0VfUkVUVVJOOworCQl1aXNsaWJfY2xpZW50X2luamVjdF9kZWxfdm5pYyhidXNubywgZGV2aWNlbm8pOworCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwl9IGVsc2UgaWYgKHR5cGUgPT0gMHg5OSkgeworCQkvKiBjbGllbnQgaW5qZWN0IGFkZCB2bmljICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXAtJWQtJWQiLCAmdHlwZSwgJmNoYW5wdHIsICZidXNubywKKwkJCSAgICZkZXZpY2Vubyk7CisJCWlmIChpICE9IDQpCisJCQlQUklOVF9VU0FHRV9SRVRVUk47CisJCWlmICghdWlzbGliX2NsaWVudF9pbmplY3RfYWRkX3ZuaWMoYnVzbm8sIGRldmljZW5vLAorCQkJCQkJICAgX19wYShjaGFucHRyKSwKKwkJCQkJCSAgIE1JTl9JT19DSEFOTkVMX1NJWkUsCisJCQkJCQkgICAxLCAvKiB0ZXN0IG1zZyAqLworCQkJCQkJICAgZHVtbXlHdWlkLCAvKiBpbnN0IGd1aWQgKi8KKwkJCQkJCSAgIE5VTEwpKSB7IC8qaW50ZXJydXB0IGluZm8gKi8KKwkJCUxPR0VSUigiRkFJTEVEIHRvIGluamVjdCBhZGQgdm5pY1xuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwl9CisKKwlpZiAoKHR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAodHlwZSAhPSBWSVJUTklDX1RZUEUpCisJICAgICYmICh0eXBlICE9IFZJUlRCVVNfVFlQRSkpCisJCVBSSU5UX1VTQUdFX1JFVFVSTjsKKworCWlmICh0eXBlID09IFZJUlRCVVNfVFlQRSkgeworCQlpID0gc3NjYW5mKGJ1ZiwgIiV4LSV4LSVkIiwgJnR5cGUsICZhY3Rpb24sICZidXNubyk7CisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgMDoKKwkJCS8qIGRlbGV0ZSB2YnVzICovCisJCQlpZiAoaSAhPSAzKQorCQkJCWJyZWFrOworCQkJYnVzZGVscGFyYW1zLmJ1c05vID0gYnVzbm87CisJCQlpZiAoZGVsZXRlX3ZidXMoJmJ1c2RlbHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQljYXNlIDE6CisJCQkvKiBhZGQgdmJ1cyAqLworCQkJaWYgKGkgIT0gMykKKwkJCQlicmVhazsKKwkJCWJ1c2FkZHBhcmFtcy5jaGFucHRyID0gTlVMTDsJLyogTk9UIFlFVCBVU0VEICovCisJCQlidXNhZGRwYXJhbXMuYnVzTm8gPSBidXNubzsKKwkJCWlmIChhZGRfdmJ1cygmYnVzYWRkcGFyYW1zKSkKKwkJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJCXJldHVybiAtRUZBVUxUOworCisJCWNhc2UgMHhmOgorCQkJLyogZGVsZXRlIGFsbCB2YnVzZXMgYW5kIGFsbCB2aGJhcy92bmljcyBvbiB0aGUgYnVzZXMgKi8KKwkJCWlmIChpICE9IDIpCisJCQkJYnJlYWs7CisJCQlkZWxldGVfYWxsKCk7CisJCQlyZXR1cm4gY291bnQ7CS8qIHN1Y2Nlc3MgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCVBSSU5UX1VTQUdFX1JFVFVSTjsKKwl9CisKKwkvKiBpZiAodHlwZSA9PSBWSVJUTklDX1RZUEUpIG9yICAgICAgICAgaWYgKHR5cGUgPT0gVklSVEhCQV9UWVBFKSAqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSAwOgorCQkvKiBkZWxldGUgdmhiYS92bmljICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXgtJXAiLCAmdHlwZSwgJmFjdGlvbiwgJmNoYW5wdHIpOworCQlpZiAoaSAhPSAzKQorCQkJYnJlYWs7CisJCWRlbHBhcmFtcy5jaGFucHRyID0gY2hhbnB0cjsKKwkJaWYgKHR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlpZiAoZGVsZXRlX3ZoYmEoJmRlbHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0gZWxzZSB7CisJCQlpZiAoZGVsZXRlX3ZuaWMoJmRlbHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0KKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljYXNlIDE6CisJCS8qIGFkZCB2aGJhL3ZuaWMgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0leC0lcC0lZC0lZCIsICZ0eXBlLCAmYWN0aW9uLCAmY2hhbnB0ciwKKwkJCSAgICZidXNubywgJmRldmljZW5vKTsKKwkJaWYgKGkgIT0gNSkKKwkJCWJyZWFrOworCQlhZGRwYXJhbXMuY2hhbnB0ciA9IGNoYW5wdHI7CisJCWFkZHBhcmFtcy5idXNObyA9IGJ1c25vOworCQlhZGRwYXJhbXMuZGV2aWNlTm8gPSBkZXZpY2VubzsKKwkJaWYgKHR5cGUgPT0gVklSVEhCQV9UWVBFKSB7CisJCQlpZiAoYWRkX3ZoYmEoJmFkZHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0gZWxzZSB7CisJCQlpZiAoYWRkX3ZuaWMoJmFkZHBhcmFtcykpCisJCQkJcmV0dXJuIGNvdW50OwkvKiBzdWNjZXNzICovCisJCX0KKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyNpZmRlZiBTVE9SQUdFX0NIQU5ORUwKKwljYXNlIDI6CisJCS8qIGFkZCB2aGJhICovCisJCWkgPSBzc2NhbmYoYnVmLCAiJXgtJXgtJWQtJWQiLCAmdHlwZSwgJmFjdGlvbiwgJmJ1c25vLAorCQkJICAgJmRldmljZW5vKTsKKwkJaWYgKGkgIT0gNCkKKwkJCWJyZWFrOworCQlzdG9yYWdlY2hhbm5lbCA9IHVpc2xpYl9zdG9yYWdlX2NoYW5uZWwoMCk7CS8qIEdldCBteSBzdG9yYWdlIGNoYW5uZWwgKi8KKwkJLyogaW9yZW1hcF9jYWNoZSBpdCBub3cgKi8KKwkJYWRkcGFyYW1zLmNoYW5wdHIgPQorCQkgICAgKHZvaWQgKikgaW9yZW1hcF9jYWNoZShzdG9yYWdlY2hhbm5lbCwgSU9fQ0hBTk5FTF9TSVpFKTsKKwkJaWYgKGFkZHBhcmFtcy5jaGFucHRyID09IE5VTEwpIHsKKwkJCUxPR0VSUigiRmFpbHVyZSB0byBnZXQgcmVtYXAgc3RvcmFnZSBjaGFubmVsLlxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlhZGRwYXJhbXMuYnVzTm8gPSBidXNubzsKKwkJYWRkcGFyYW1zLmRldmljZU5vID0gZGV2aWNlbm87CisJCWlmICh0eXBlID09IFZJUlRIQkFfVFlQRSkgeworCQkJaWYgKGFkZF92aGJhKCZhZGRwYXJhbXMpKQorCQkJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCQl9CisJCXJldHVybiAtRUZBVUxUOworI2VuZGlmCisJY2FzZSAweGY6CisJCS8qIGRlbGV0ZSBhbGwgdmhiYXMvdm5pY3MgKi8KKwkJaSA9IHNzY2FuZihidWYsICIleC0leC0lZCIsICZ0eXBlLCAmYWN0aW9uLCAmYnVzbm8pOworCQlpZiAoaSAhPSAzKQorCQkJYnJlYWs7CisJCWJ1c2RlbHBhcmFtcy5idXNObyA9IGJ1c25vOworCQlkZWxldGVfYWxsX3ZpcnQodHlwZSwgJmJ1c2RlbHBhcmFtcyk7CisJCXJldHVybiBjb3VudDsJLyogc3VjY2VzcyAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlQUklOVF9VU0FHRV9SRVRVUk47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBJbml0ICYgRXhpdCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgdmlydHBjaV9tb2RfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKworCUxPR0lORigiTW9kdWxlIGJ1aWxkOiBEYXRlOiVzIFRpbWU6JXMuLi5cbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXJldCA9IGJ1c19yZWdpc3RlcigmdmlydHBjaV9idXNfdHlwZSk7CisJLyogY3JlYXRlcyAvc3lzL2J1cy91aXN2aXJ0cGNpIHdoaWNoIGNvbnRhaW5zIGRldmljZXMgJgorCSAqIGRyaXZlcnMgZGlyZWN0b3J5CisJICovCisJaWYgKHJldCkgeworCQlMT0dFUlIoImJ1c19yZWdpc3RlciAqKioqRkFJTEVEOiVkXG4iLCByZXQpOworCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIHJldCwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJREJHSU5GKCJidXNfcmVnaXN0ZXIgc3VjY2Vzc2Z1bFxuIik7CisJQnVzRGV2aWNlSW5mb19Jbml0KCZCdXNfRHJpdmVySW5mbywKKwkJCSAgICJjbGllbnRidXMiLCAidmlydHBjaSIsCisJCQkgICBWRVJTSU9OLCBOVUxMLCBfX0RBVEVfXywgX19USU1FX18pOworCisJLyogY3JlYXRlIGEgcm9vdCBidXMgdXNlZCB0byBwYXJlbnQgYWxsIHRoZSB2aXJ0cGNpIGJ1c2VzLiAqLworCXJldCA9IGRldmljZV9yZWdpc3RlcigmdmlydHBjaV9yb290YnVzX2RldmljZSk7CisJaWYgKHJldCkgeworCQlMT0dFUlIoImRldmljZV9yZWdpc3RlciBGQUlMRUQ6JWRcbiIsIHJldCk7CisJCWJ1c191bnJlZ2lzdGVyKCZ2aXJ0cGNpX2J1c190eXBlKTsKKwkJUE9TVENPREVfTElOVVhfMyhWUENJX0NSRUFURV9GQUlMVVJFX1BDLCByZXQsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybiByZXQ7CisJfQorCURCR0lORigiZGV2aWNlX3JlZ2lzdGVyIHN1Y2Nlc3NmdWwgcmV0OiV4XG4iLCByZXQpOworCisJaWYgKCF1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKDIsICh2b2lkICopICZ2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMsCisJCQkJCSAgJkNoaXBzZXRfRHJpdmVySW5mbykpIHsKKwkJTE9HRVJSKCJ1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyICoqKipGQUlMRUQuXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlkZXZpY2VfdW5yZWdpc3RlcigmdmlydHBjaV9yb290YnVzX2RldmljZSk7CisJCWJ1c191bnJlZ2lzdGVyKCZ2aXJ0cGNpX2J1c190eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUxPR0lORigic3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgdmlydHBjaV9jdHJsY2hhbl9mdW5jICgweCVwKSBhcyBjYWxsYmFjay5cbiIsCisJICAgICAodm9pZCAqKSAmdmlydHBjaV9jdHJsY2hhbl9mdW5jKTsKKwkvKiBjcmVhdGUgdGhlIHByb2MgZGlyZWN0b3JpZXMgKi8KKwl2aXJ0cGNpX3Byb2NfZGlyID0gcHJvY19ta2RpcihESVJfUFJPQ19FTlRSWSwgTlVMTCk7CisJdmlydF9wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoVklSVF9QUk9DX0VOVFJZX0ZOLCAwLCB2aXJ0cGNpX3Byb2NfZGlyLAorCQkJCSAgICAgICZwcm9jX3ZpcnRfZm9wcyk7CisJaW5mb19wcm9jX2VudHJ5ID0gcHJvY19jcmVhdGUoSU5GT19QUk9DX0VOVFJZX0ZOLCAwLCB2aXJ0cGNpX3Byb2NfZGlyLAorCQkJCSAgICAgICZwcm9jX2luZm9fZm9wcyk7CisJTE9HSU5GKCJMZWF2aW5nXG4iKTsKKwlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlydHBjaV9tb2RfZXhpdCh2b2lkKQoreworCUxPR0lORigidmlydHBjaV9tb2RfZXhpdC4uLlxuIik7CisKKwkvKiB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworCWlmICghdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcigyLCBOVUxMLCBOVUxMKSkKKwkJTE9HRVJSKCJ1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyICoqKipGQUlMRUQuXG4iKTsKKworCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKKwlidXNfdW5yZWdpc3RlcigmdmlydHBjaV9idXNfdHlwZSk7CisKKwlpZiAodmlydF9wcm9jX2VudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShWSVJUX1BST0NfRU5UUllfRk4sIHZpcnRwY2lfcHJvY19kaXIpOworCisJaWYgKGluZm9fcHJvY19lbnRyeSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSU5GT19QUk9DX0VOVFJZX0ZOLCB2aXJ0cGNpX3Byb2NfZGlyKTsKKworCWlmICh2aXJ0cGNpX3Byb2NfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShESVJfUFJPQ19FTlRSWSwgTlVMTCk7CisKKwlMT0dJTkYoIkxlYXZpbmdcbiIpOworCit9CisKK21vZHVsZV9pbml0KHZpcnRwY2lfbW9kX2luaXQpOworbW9kdWxlX2V4aXQodmlydHBjaV9tb2RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJVc2hhIFNyaW5pdmFzYW4iKTsKK01PRFVMRV9BTElBUygidWlzdmlydHBjaSIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGZkMDdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuaApAQCAtMCwwICsxLDEwNCBAQAorLyogdmlydHBjaS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogVW5pc3lzIFZpcnR1YWwgUENJIGRyaXZlciBoZWFkZXIKKyAqLworCisjaWZuZGVmIF9fVklSVFBDSV9IX18KKyNkZWZpbmUgX19WSVJUUENJX0hfXworCisjaW5jbHVkZSAidWlzcXVldWUuaCIKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVJUSEJBIDB4QUEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJUlROSUMgMHhBQjAwCisKK3N0cnVjdCBzY3NpX2FkYXBfaW5mbyB7CisJdm9pZCAqc2NzaWhvc3Q7CQkvKiBzY3NpIGhvc3QgaWYgdGhpcyBkZXZpY2UgaXMgYSBzY3NpIGhiYSAqLworCXN0cnVjdCB2aGJhX3d3bm4gd3dubjsJLyogdGhlIHdvcmxkIHdpZGUgbm9kZSBuYW1lIG9mIHZoYmEgKi8KKwlzdHJ1Y3QgdmhiYV9jb25maWdfbWF4IG1heDsJLyogdmFyaW91cyBtYXggc3BlY2lmaWNhdGlvbnMgdXNlZAorCQkJCQkgKiB0byBjb25maWcgdmhiYSAqLworfTsKKworc3RydWN0IG5ldF9hZGFwX2luZm8geworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIG5ldHdvcmsgZGV2aWNlIGlmIHRoaXMKKwkJCQkJICogZGV2aWNlIGlzIGEgTklDICovCisJdTggbWFjX2FkZHJbTUFYX01BQ0FERFJfTEVOXTsKKwlpbnQgbnVtX3Jjdl9idWZzOworCXVuc2lnbmVkIG10dTsKKwlHVUlEIHpvbmVHdWlkOworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlWSVJUSEJBX1RZUEUgPSAwLAorCVZJUlROSUNfVFlQRSA9IDEsCisJVklSVEJVU19UWVBFID0gNiwKK30gVklSVFBDSV9ERVZfVFlQRTsKKworc3RydWN0IHZpcnRwY2lfZGV2IHsKKwlWSVJUUENJX0RFVl9UWVBFIGRldnR5cGU7CS8qIGluZGljYXRlcyB0eXBlIG9mIHRoZQorCQkJCQkgKiB2aXJ0dWFsIHBjaSBkZXZpY2UgKi8KKwlzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKm15ZHJpdmVyOwkvKiB3aGljaCBkcml2ZXIgaGFzIGFsbG9jYXRlZAorCQkJCQkJICogdGhpcyBkZXZpY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CS8qIHZlbmRvciBpZCBmb3IgZGV2aWNlICovCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlOwkvKiBkZXZpY2UgaWQgZm9yIGRldmljZSAqLworCVUzMiBidXNObzsJCS8qIG51bWJlciBvZiBidXMgb24gd2hpY2ggZGV2aWNlIGV4aXN0cyAqLworCVUzMiBkZXZpY2VObzsJCS8qIGRldmljZSdzIG51bWJlciBvbiB0aGUgYnVzICovCisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsJLyogaW50ZXJydXB0IGluZm8gKi8KKwlzdHJ1Y3QgZGV2aWNlIGdlbmVyaWNfZGV2OwkvKiBnZW5lcmljIGRldmljZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHNjc2lfYWRhcF9pbmZvIHNjc2k7CisJCXN0cnVjdCBuZXRfYWRhcF9pbmZvIG5ldDsKKwl9OworCisJc3RydWN0IHVpc3F1ZXVlX2luZm8gcXVldWVpbmZvOwkvKiBob2xkcyBwdHIgdG8gY2hhbm5lbCB3aGVyZSBjbWRzICYKKwkJCQkJICogcnNwcyBhcmUgcXVldWVkICYgcmV0cmlldmVkICovCisJc3RydWN0IHZpcnRwY2lfZGV2ICpuZXh0OwkvKiBwb2ludHMgdG8gbmV4dCB2aXJ0cGNpIGRldmljZSAqLworfTsKKworc3RydWN0IHZpcnRwY2lfZHJpdmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJY29uc3QgY2hhciAqbmFtZTsJLyogdGhlIG5hbWUgb2YgdGhlIGRyaXZlciBpbiBzeXNmcyAqLworCWNvbnN0IGNoYXIgKnZlcnNpb247CisJY29uc3QgY2hhciAqdmVydGFnOworCWNvbnN0IGNoYXIgKmJ1aWxkX2RhdGU7CisJY29uc3QgY2hhciAqYnVpbGRfdGltZTsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWRfdGFibGU7CS8qIG11c3QgYmUgbm9uLU5VTEwgZm9yIHByb2JlCisJCQkJCQkgKiB0byBiZSBjYWxsZWQgKi8KKwlpbnQgKCpwcm9iZSkoc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7IC8qIGRldmljZSBpbnNlcnRlZCAqLworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2KTsgLyogRGV2aWNlIHJlbW92ZWQgKE5VTEwgaWYKKwkJCQkJCSAgICAqIG5vdCBhIGhvdC1wbHVnIGNhcGFibGUKKwkJCQkJCSAgICAqIGRyaXZlcikgKi8KKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKKwkJCXUzMiBzdGF0ZSk7CQkgICAvKiBEZXZpY2Ugc3VzcGVuZGVkICovCisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldik7CS8qIERldmljZSB3b2tlbiB1cCAqLworCWludCAoKmVuYWJsZV93YWtlKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKKwkJCSAgICB1MzIgc3RhdGUsIGludCBlbmFibGUpOwkvKiBFbmFibGUgd2FrZSBldmVudCAqLworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGNvcmVfZHJpdmVyOwkvKiBWSVJUUENJIGNvcmUgZmlsbHMgdGhpcyBpbiAqLworfTsKKworI2RlZmluZQlkcml2ZXJfdG9fdmlydHBjaV9kcml2ZXIoaW5fZHJ2KSBcCisJY29udGFpbmVyX29mKGluX2Rydiwgc3RydWN0IHZpcnRwY2lfZHJpdmVyLCBjb3JlX2RyaXZlcikKKyNkZWZpbmUgZGV2aWNlX3RvX3ZpcnRwY2lfZGV2KGluX2RldikgXAorCWNvbnRhaW5lcl9vZihpbl9kZXYsIHN0cnVjdCB2aXJ0cGNpX2RldiwgZ2VuZXJpY19kZXYpCisKK2ludCB2aXJ0cGNpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgKik7Cit2b2lkIHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpcnRwY2lfZHJpdmVyICopOworCisjZW5kaWYgLyogX19WSVJUUENJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjM2I0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorIworIyBVbmlzeXMgdmlzb3JjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFVOSVNZU19WSVNPUkNIQU5ORUwKKwl0cmlzdGF0ZSAiVW5pc3lzIHZpc29yY2hhbm5lbCBkcml2ZXIiCisJZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19WSVNPUlVUSUwKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpc29yY2hhbm5lbCBkcml2ZXIuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNjBiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFVuaXN5cyB2aXNvcmNoYW5uZWwKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUkNIQU5ORUwpCSs9IHZpc29yY2hhbm5lbC5vCisKK3Zpc29yY2hhbm5lbC15IDo9IHZpc29yY2hhbm5lbF9tYWluLm8gdmlzb3JjaGFubmVsX2Z1bmNzLm8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwKK2NjZmxhZ3MteSArPSAtRENPTkZJR19TUEFSX0dVRVNUIC1ER1VFU1REUklWRVJCVUlMRCAtRE5PQVVUT1ZFUlNJT04KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvZ2xvYmFscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvZ2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OGY4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmgKQEAgLTAsMCArMSwyOSBAQAorLyogZ2xvYmFscy5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVklTT1JDSEFOTkVMX0dMT0JBTFNfSF9fCisjZGVmaW5lIF9fVklTT1JDSEFOTkVMX0dMT0JBTFNfSF9fCisKKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJtZW1yZWdpb24uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJ2aXNvcmNoYW5uZWwiCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDI5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWwuaApAQCAtMCwwICsxLDEwNiBAQAorLyogdmlzb3JjaGFubmVsLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WSVNPUkNIQU5ORUxfSF9fCisjZGVmaW5lIF9fVklTT1JDSEFOTkVMX0hfXworCisjaW5jbHVkZSAiY29tbW9udHlwZXMuaCIKKyNpbmNsdWRlICJtZW1yZWdpb24uaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaWZuZGVmIEhPU1RBRERSRVNTCisjZGVmaW5lIEhPU1RBRERSRVNTIFU2NAorI2VuZGlmCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCBpbnQKKyNlbmRpZgorCisvKiBWSVNPUkNIQU5ORUwgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0byB1c2Vycy4KKyAqIEZpZWxkcyBhcmUgZGVjbGFyZWQgb25seSBpbiB0aGUgaW1wbGVtZW50YXRpb24gLmMgZmlsZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IFZJU09SQ0hBTk5FTF9UYWcgVklTT1JDSEFOTkVMOworCisvKiBOb3RlIHRoYXQgZm9yIHZpc29yY2hhbm5lbF9jcmVhdGUoKSBhbmQgdmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKCksCisgKiA8Y2hhbm5lbEJ5dGVzPiBhbmQgPGd1aWQ+IGFyZ3VtZW50cyBtYXkgYmUgMCBpZiB3ZSBhcmUgYSBjaGFubmVsIENMSUVOVC4KKyAqIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlcyBjYW4gc2ltcGx5IGJlIHJlYWQgZnJvbSB0aGUgY2hhbm5lbCBoZWFkZXIuCisgKi8KK1ZJU09SQ0hBTk5FTCAqdmlzb3JjaGFubmVsX2NyZWF0ZShIT1NUQUREUkVTUyBwaHlzYWRkciwKKwkJCQkgIHVsb25nIGNoYW5uZWxCeXRlcywgR1VJRCBndWlkKTsKK1ZJU09SQ0hBTk5FTCAqdmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCQkJICAgICBWSVNPUkNIQU5ORUwgKnBhcmVudCwgdWxvbmcgb2ZmLAorCQkJCQkgICAgIEdVSUQgZ3VpZCk7CitWSVNPUkNIQU5ORUwgKnZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKEhPU1RBRERSRVNTIHBoeXNhZGRyLAorCQkJCQkgICAgdWxvbmcgY2hhbm5lbEJ5dGVzLCBHVUlEIGd1aWQpOworVklTT1JDSEFOTkVMICp2aXNvcmNoYW5uZWxfY3JlYXRlX292ZXJsYXBwZWRfd2l0aF9sb2NrKHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCQkJCSAgICAgICBWSVNPUkNIQU5ORUwgKnBhcmVudCwKKwkJCQkJCSAgICAgICB1bG9uZyBvZmYsIEdVSUQgZ3VpZCk7Cit2b2lkIHZpc29yY2hhbm5lbF9kZXN0cm95KFZJU09SQ0hBTk5FTCAqY2hhbm5lbCk7CitpbnQgdmlzb3JjaGFubmVsX3JlYWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCisJCSAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOworaW50IHZpc29yY2hhbm5lbF93cml0ZShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOworaW50IHZpc29yY2hhbm5lbF9jbGVhcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgICAgIFU4IGNoLCB1bG9uZyBuYnl0ZXMpOworQk9PTCB2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpOworQk9PTCB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpOworaW50IHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSk7CitpbnQgdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX21heF9zbG90cyhWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSk7CisKK0hPU1RBRERSRVNTIHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK3Vsb25nIHZpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCk7CitjaGFyICp2aXNvcmNoYW5uZWxfaWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKTsKK2NoYXIgKnZpc29yY2hhbm5lbF96b25laWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKTsKK1U2NCB2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOworR1VJRCB2aXNvcmNoYW5uZWxfZ2V0X0dVSUQoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK01FTVJFR0lPTiAqdmlzb3JjaGFubmVsX2dldF9tZW1yZWdpb24oVklTT1JDSEFOTkVMICpjaGFubmVsKTsKK2NoYXIgKnZpc29yY2hhbm5lbF9HVUlEX2lkKEdVSUQgKmd1aWQsIGNoYXIgKnMpOwordm9pZCB2aXNvcmNoYW5uZWxfZGVidWcoVklTT1JDSEFOTkVMICpjaGFubmVsLCBpbnQgblF1ZXVlcywKKwkJCXN0cnVjdCBzZXFfZmlsZSAqc2VxLCBVMzIgb2ZmKTsKK3ZvaWQgdmlzb3JjaGFubmVsX2R1bXBfc2VjdGlvbihWSVNPUkNIQU5ORUwgKmNoYW4sIGNoYXIgKnMsCisJCQkgICAgICAgaW50IG9mZiwgaW50IGxlbiwgc3RydWN0IHNlcV9maWxlICpzZXEpOwordm9pZCAqdmlzb3JjaGFubmVsX2dldF9oZWFkZXIoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKKworI2RlZmluZQlWSVNPUkNIQU5ORUxfQ0hBTkdFX1NFUlZFUl9TVEFURShjaGFuLCBjaGFuSWQsIG5ld3N0YXRlKQlcCisJZG8gewkJCQkJCQkJXAorCQlVOCAqcCA9IChVOCAqKXZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKGNoYW4pOwkJXAorCQlpZiAocCkgewkJCQkJCVwKKwkJCVVMVFJBX0NIQU5ORUxfU0VSVkVSX1RSQU5TSVRJT04ocCwgY2hhbklkLCBTcnZTdGF0ZSwgXAorCQkJCQkJCW5ld3N0YXRlLCBsb2dDdHgpOyBcCisJCQl2aXNvcmNoYW5uZWxfd3JpdGUJCQkJXAorCQkJCShjaGFuLAkJCQkJXAorCQkJCSBvZmZzZXRvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MLCBTcnZTdGF0ZSksIFwKKwkJCQkgcCArCQkJCQlcCisJCQkJIG9mZnNldG9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wsIFNydlN0YXRlKSwgXAorCQkJCSBzaXplb2YoVTMyKSk7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZQlWSVNPUkNIQU5ORUxfQ0hBTkdFX0NMSUVOVF9TVEFURShjaGFuLCBjaGFuSWQsIG5ld3N0YXRlKQlcCisJZG8gewkJCQkJCQkJXAorCQlVOCAqcCA9IChVOCAqKXZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKGNoYW4pOwkJXAorCQlpZiAocCkgewkJCQkJCVwKKwkJCVVMVFJBX0NIQU5ORUxfQ0xJRU5UX1RSQU5TSVRJT04ocCwgY2hhbklkLAlcCisJCQkJCQkJbmV3c3RhdGUsIGxvZ0N0eCk7IFwKKwkJCXZpc29yY2hhbm5lbF93cml0ZQkJCQlcCisJCQkJKGNoYW4sCQkJCQlcCisJCQkJIG9mZnNldG9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wsIENsaVN0YXRlT1MpLCBcCisJCQkJIHAgKwkJCQkJXAorCQkJCSBvZmZzZXRvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MLCBDbGlTdGF0ZU9TKSwgXAorCQkJCSBzaXplb2YoVTMyKSk7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9mdW5jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzY4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYwpAQCAtMCwwICsxLDY3NCBAQAorLyogdmlzb3JjaGFubmVsX2Z1bmNzLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgVGhpcyBwcm92aWRlcyBTdXBlcnZpc29yIGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwcmltaXRpdmVzLCB3aGljaCBhcmUKKyAqICBpbmRlcGVuZGVudCBvZiB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gYWNjZXNzIHRoZSBjaGFubmVsIGRhdGEuICBBbGwgY2hhbm5lbAorICogIGRhdGEgaXMgYWNjZXNzZWQgdXNpbmcgdGhlIG1lbXJlZ2lvbiBhYnN0cmFjdGlvbi4gIChtZW1yZWdpb24gaGFzIGJvdGgKKyAqICBhIENNMiBpbXBsZW1lbnRhdGlvbiBhbmQgYSBkaXJlY3QgbWVtb3J5IGltcGxlbWVudGF0aW9uLikKKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgInZpc29yY2hhbm5lbC5oIgorI2luY2x1ZGUgImd1aWR1dGlscy5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAidmlzb3JjaGFubmVsIgorCitzdHJ1Y3QgVklTT1JDSEFOTkVMX1RhZyB7CisJTUVNUkVHSU9OICptZW1yZWdpb247CS8qIGZyb20gdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZSgpICovCisJQ0hBTk5FTF9IRUFERVIgY2hhbl9oZHI7CisJR1VJRCBndWlkOworCXVsb25nIHNpemU7CisJQk9PTCBuZWVkc19sb2NrOworCXNwaW5sb2NrX3QgaW5zZXJ0X2xvY2s7CisJc3BpbmxvY2tfdCByZW1vdmVfbG9jazsKKworCXN0cnVjdCB7CisJCVNJR05BTF9RVUVVRV9IRUFERVIgcmVxX3F1ZXVlOworCQlTSUdOQUxfUVVFVUVfSEVBREVSIHJzcF9xdWV1ZTsKKwkJU0lHTkFMX1FVRVVFX0hFQURFUiBldmVudF9xdWV1ZTsKKwkJU0lHTkFMX1FVRVVFX0hFQURFUiBhY2tfcXVldWU7CisJfSBzYWZlX3Vpc19xdWV1ZTsKK307CisKKy8qIENyZWF0ZXMgdGhlIFZJU09SQ0hBTk5FTCBhYnN0cmFjdGlvbiBmb3IgYSBkYXRhIGFyZWEgaW4gbWVtb3J5LCBidXQgZG9lcworICogTk9UIG1vZGlmeSB0aGlzIGRhdGEgYXJlYS4KKyAqLworc3RhdGljIFZJU09SQ0hBTk5FTCAqCit2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMoSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIGNoYW5uZWxCeXRlcywKKwkJCSBWSVNPUkNIQU5ORUwgKnBhcmVudCwgdWxvbmcgb2ZmLCBHVUlEIGd1aWQsCisJCQkgQk9PTCBuZWVkc19sb2NrKQoreworCVZJU09SQ0hBTk5FTCAqcCA9IE5VTEw7CisJdm9pZCAqcmMgPSBOVUxMOworCisJcCA9IGttYWxsb2Moc2l6ZW9mKFZJU09SQ0hBTk5FTCksIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlFUlJEUlYoImFsbG9jYXRpb24gZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCXAtPm1lbXJlZ2lvbiA9IE5VTEw7CisJcC0+bmVlZHNfbG9jayA9IG5lZWRzX2xvY2s7CisJc3Bpbl9sb2NrX2luaXQoJnAtPmluc2VydF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcC0+cmVtb3ZlX2xvY2spOworCisJLyogcHJlcGFyZSBjaGFuX2hkciAoYWJzdHJhY3Rpb24gdG8gcmVhZC93cml0ZSBjaGFubmVsIG1lbW9yeSkgKi8KKwlpZiAocGFyZW50ID09IE5VTEwpCisJCXAtPm1lbXJlZ2lvbiA9CisJCSAgICB2aXNvcl9tZW1yZWdpb25fY3JlYXRlKHBoeXNhZGRyLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwllbHNlCisJCXAtPm1lbXJlZ2lvbiA9CisJCSAgICB2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQocGFyZW50LT5tZW1yZWdpb24sCisJCQkJCQkgICAgICBvZmYsCisJCQkJCQkgICAgICBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlpZiAocC0+bWVtcmVnaW9uID09IE5VTEwpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fY3JlYXRlIGZhaWxlZCBmYWlsZWQ6IChzdGF0dXM9MClcbiIpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHZpc29yX21lbXJlZ2lvbl9yZWFkKHAtPm1lbXJlZ2lvbiwgMCwgJnAtPmNoYW5faGRyLAorCQkJCSBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKSA8IDApIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBmYWlsZWQ6IChzdGF0dXM9MClcbiIpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKGNoYW5uZWxCeXRlcyA9PSAwKQorCQkvKiB3ZSBoYWQgYmV0dGVyIGJlIGEgQ0xJRU5UIG9mIHRoaXMgY2hhbm5lbCAqLworCQljaGFubmVsQnl0ZXMgPSAodWxvbmcpIHAtPmNoYW5faGRyLlNpemU7CisJaWYgKFNUUlVDVFNFUVVBTChndWlkLCBHdWlkMCkpCisJCS8qIHdlIGhhZCBiZXR0ZXIgYmUgYSBDTElFTlQgb2YgdGhpcyBjaGFubmVsICovCisJCWd1aWQgPSBwLT5jaGFuX2hkci5UeXBlOworCWlmICh2aXNvcl9tZW1yZWdpb25fcmVzaXplKHAtPm1lbXJlZ2lvbiwgY2hhbm5lbEJ5dGVzKSA8IDApIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVzaXplIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwlwLT5zaXplID0gY2hhbm5lbEJ5dGVzOworCXAtPmd1aWQgPSBndWlkOworCisJcmMgPSBwOworQXdheToKKworCWlmIChyYyA9PSBOVUxMKSB7CisJCWlmIChwICE9IE5VTEwpIHsKKwkJCXZpc29yY2hhbm5lbF9kZXN0cm95KHApOworCQkJcCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitWSVNPUkNIQU5ORUwgKgordmlzb3JjaGFubmVsX2NyZWF0ZShIT1NUQUREUkVTUyBwaHlzYWRkciwgdWxvbmcgY2hhbm5lbEJ5dGVzLCBHVUlEIGd1aWQpCit7CisJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhwaHlzYWRkciwgY2hhbm5lbEJ5dGVzLCBOVUxMLCAwLCBndWlkLAorCQkJCQlGQUxTRSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlKTsKKworVklTT1JDSEFOTkVMICoKK3Zpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKEhPU1RBRERSRVNTIHBoeXNhZGRyLCB1bG9uZyBjaGFubmVsQnl0ZXMsCisJCQkgICAgICBHVUlEIGd1aWQpCit7CisJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhwaHlzYWRkciwgY2hhbm5lbEJ5dGVzLCBOVUxMLCAwLCBndWlkLAorCQkJCQlUUlVFKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKTsKKworVklTT1JDSEFOTkVMICoKK3Zpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZCh1bG9uZyBjaGFubmVsQnl0ZXMsCisJCQkgICAgICAgVklTT1JDSEFOTkVMICpwYXJlbnQsIHVsb25nIG9mZiwgR1VJRCBndWlkKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMoMCwgY2hhbm5lbEJ5dGVzLCBwYXJlbnQsIG9mZiwgZ3VpZCwKKwkJCQkJRkFMU0UpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkKTsKKworVklTT1JDSEFOTkVMICoKK3Zpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZF93aXRoX2xvY2sodWxvbmcgY2hhbm5lbEJ5dGVzLAorCQkJCQkgVklTT1JDSEFOTkVMICpwYXJlbnQsIHVsb25nIG9mZiwKKwkJCQkJIEdVSUQgZ3VpZCkKK3sKKwlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKDAsIGNoYW5uZWxCeXRlcywgcGFyZW50LCBvZmYsIGd1aWQsCisJCQkJCVRSVUUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NyZWF0ZV9vdmVybGFwcGVkX3dpdGhfbG9jayk7CisKK3ZvaWQKK3Zpc29yY2hhbm5lbF9kZXN0cm95KFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGNoYW5uZWwtPm1lbXJlZ2lvbiAhPSBOVUxMKSB7CisJCXZpc29yX21lbXJlZ2lvbl9kZXN0cm95KGNoYW5uZWwtPm1lbXJlZ2lvbik7CisJCWNoYW5uZWwtPm1lbXJlZ2lvbiA9IE5VTEw7CisJfQorCWtmcmVlKGNoYW5uZWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2Rlc3Ryb3kpOworCitIT1NUQUREUkVTUwordmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuIHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIoY2hhbm5lbC0+bWVtcmVnaW9uKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIpOworCit1bG9uZwordmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoVklTT1JDSEFOTkVMICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5zaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9uYnl0ZXMpOworCitjaGFyICoKK3Zpc29yY2hhbm5lbF9HVUlEX2lkKEdVSUQgKmd1aWQsIGNoYXIgKnMpCit7CisJcmV0dXJuIEdVSURfZm9ybWF0MShndWlkLCBzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9HVUlEX2lkKTsKKworY2hhciAqCit2aXNvcmNoYW5uZWxfaWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfR1VJRF9pZCgmY2hhbm5lbC0+Z3VpZCwgcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfaWQpOworCitjaGFyICoKK3Zpc29yY2hhbm5lbF96b25laWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfR1VJRF9pZCgmY2hhbm5lbC0+Y2hhbl9oZHIuWm9uZUd1aWQsIHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3pvbmVpZCk7CisKK0hPU1RBRERSRVNTCit2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPmNoYW5faGRyLlBhcnRpdGlvbkhhbmRsZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKTsKKworR1VJRAordmlzb3JjaGFubmVsX2dldF9HVUlEKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+Z3VpZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfR1VJRCk7CisKK01FTVJFR0lPTiAqCit2aXNvcmNoYW5uZWxfZ2V0X21lbXJlZ2lvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPm1lbXJlZ2lvbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfbWVtcmVnaW9uKTsKKworaW50Cit2aXNvcmNoYW5uZWxfcmVhZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKQoreworCWludCByYyA9IHZpc29yX21lbXJlZ2lvbl9yZWFkKGNoYW5uZWwtPm1lbXJlZ2lvbiwgb2Zmc2V0LAorCQkJCSAgICAgIGxvY2FsLCBuYnl0ZXMpOworCWlmICgocmMgPj0gMCkgJiYgKG9mZnNldCA9PSAwKSAmJiAobmJ5dGVzID49IHNpemVvZihDSEFOTkVMX0hFQURFUikpKQorCQltZW1jcHkoJmNoYW5uZWwtPmNoYW5faGRyLCBsb2NhbCwgc2l6ZW9mKENIQU5ORUxfSEVBREVSKSk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3JlYWQpOworCitpbnQKK3Zpc29yY2hhbm5lbF93cml0ZShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKK3sKKwlpZiAob2Zmc2V0ID09IDAgJiYgbmJ5dGVzID49IHNpemVvZihDSEFOTkVMX0hFQURFUikpCisJCW1lbWNweSgmY2hhbm5lbC0+Y2hhbl9oZHIsIGxvY2FsLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlyZXR1cm4gdmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwgb2Zmc2V0LCBsb2NhbCwgbmJ5dGVzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF93cml0ZSk7CisKK2ludAordmlzb3JjaGFubmVsX2NsZWFyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LCBVOCBjaCwgdWxvbmcgbmJ5dGVzKQoreworCWludCByYyA9IC0xOworCWludCBidWZzaXplID0gNjU1MzY7CisJaW50IHdyaXR0ZW4gPSAwOworCVU4ICpidWYgPSB2bWFsbG9jKGJ1ZnNpemUpOworCisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgZmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIiwgX19mdW5jX18pOworCQlnb3RvIEF3YXk7CisJfQorCW1lbXNldChidWYsIGNoLCBidWZzaXplKTsKKwl3aGlsZSAobmJ5dGVzID4gMCkgeworCQl1bG9uZyB0aGlzYnl0ZXMgPSBidWZzaXplOworCQlpbnQgeCA9IC0xOworCQlpZiAobmJ5dGVzIDwgdGhpc2J5dGVzKQorCQkJdGhpc2J5dGVzID0gbmJ5dGVzOworCQl4ID0gdmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwgb2Zmc2V0ICsgd3JpdHRlbiwKKwkJCQkJICBidWYsIHRoaXNieXRlcyk7CisJCWlmICh4IDwgMCkgeworCQkJcmMgPSB4OworCQkJZ290byBBd2F5OworCQl9CisJCXdyaXR0ZW4gKz0gdGhpc2J5dGVzOworCQluYnl0ZXMgLT0gdGhpc2J5dGVzOworCX0KKwlyYyA9IDA7CisKK0F3YXk6CisJaWYgKGJ1ZiAhPSBOVUxMKSB7CisJCXZmcmVlKGJ1Zik7CisJCWJ1ZiA9IE5VTEw7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jbGVhcik7CisKK3ZvaWQgKgordmlzb3JjaGFubmVsX2dldF9oZWFkZXIoVklTT1JDSEFOTkVMICpjaGFubmVsKQoreworCXJldHVybiAodm9pZCAqKSAmKGNoYW5uZWwtPmNoYW5faGRyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKTsKKworLyoqIFJldHVybiBvZmZzZXQgb2YgYSBzcGVjaWZpYyBTSUdOQUxfUVVFVUVfSEVBREVSIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCisgKiAgY2hhbm5lbCBoZWFkZXIKKyAqLworI2RlZmluZSBTSUdfUVVFVUVfT0ZGU0VUKGNoYW5faGRyLCBxKSBcCisJKChjaGFuX2hkciktPm9DaGFubmVsU3BhY2UgKyAoKHEpICogc2l6ZW9mKFNJR05BTF9RVUVVRV9IRUFERVIpKSkKKworLyoqIFJldHVybiBvZmZzZXQgb2YgYSBzcGVjaWZpYyBxdWV1ZSBlbnRyeSAoZGF0YSkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqICBjaGFubmVsIGhlYWRlcgorICovCisjZGVmaW5lIFNJR19EQVRBX09GRlNFVChjaGFuX2hkciwgcSwgc2lnX2hkciwgc2xvdCkgXAorCShTSUdfUVVFVUVfT0ZGU0VUKGNoYW5faGRyLCBxKSArIChzaWdfaGRyKS0+b1NpZ25hbEJhc2UgKyBcCisJICAgICgoc2xvdCkgKiAoc2lnX2hkciktPlNpZ25hbFNpemUpKQorCisvKiogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgZmllbGQgd2l0aGluIGEgU0lHTkFMX1FVRVVFX0hFQURFUiBiYWNrCisgKiAgaW50byBob3N0IG1lbW9yeQorICovCisjZGVmaW5lIFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgRklFTEQpCQkJXAorCSh2aXNvcl9tZW1yZWdpb25fd3JpdGUoY2hhbm5lbC0+bWVtcmVnaW9uLAkJCVwKKwkJCSAgICAgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpKyBcCisJCQkgICAgICAgb2Zmc2V0b2YoU0lHTkFMX1FVRVVFX0hFQURFUiwgRklFTEQpLAlcCisJCQkgICAgICAgJigoc2lnX2hkciktPkZJRUxEKSwJCQlcCisJCQkgICAgICAgc2l6ZW9mKChzaWdfaGRyKS0+RklFTEQpKSA+PSAwKQorCitzdGF0aWMgQk9PTAorc2lnX3JlYWRfaGVhZGVyKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLAorCQlTSUdOQUxfUVVFVUVfSEVBREVSICpzaWdfaGRyKQoreworCUJPT0wgcmMgPSBGQUxTRTsKKworCWlmIChjaGFubmVsLT5jaGFuX2hkci5vQ2hhbm5lbFNwYWNlIDwgc2l6ZW9mKENIQU5ORUxfSEVBREVSKSkgeworCQlFUlJEUlYoIm9DaGFubmVsU3BhY2UgdG9vIHNtYWxsOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCisJLyogUmVhZCB0aGUgYXBwcm9wcmlhdGUgU0lHTkFMX1FVRVVFX0hFQURFUiBpbnRvIGxvY2FsIG1lbW9yeS4gKi8KKworCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChjaGFubmVsLT5tZW1yZWdpb24sCisJCQkJIFNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSksCisJCQkJIHNpZ19oZHIsIHNpemVvZihTSUdOQUxfUVVFVUVfSEVBREVSKSkgPCAwKSB7CisJCUVSUkRSVigicXVldWU9JWQgU0lHX1FVRVVFX09GRlNFVD0lZCIsCisJCSAgICAgICBxdWV1ZSwgKGludClTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpKTsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBvZiBzaWduYWwgcXVldWUgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gVFJVRTsKK0F3YXk6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgQk9PTAorc2lnX2RvX2RhdGEoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsCisJICAgIFNJR05BTF9RVUVVRV9IRUFERVIgKnNpZ19oZHIsIFUzMiBzbG90LCB2b2lkICpkYXRhLCBCT09MIGlzX3dyaXRlKQoreworCUJPT0wgcmMgPSBGQUxTRTsKKwlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCisJCQkJCQkgc2lnX2hkciwgc2xvdCk7CisJaWYgKGlzX3dyaXRlKSB7CisJCWlmICh2aXNvcl9tZW1yZWdpb25fd3JpdGUoY2hhbm5lbC0+bWVtcmVnaW9uLAorCQkJCQkgIHNpZ25hbF9kYXRhX29mZnNldCwKKwkJCQkJICBkYXRhLCBzaWdfaGRyLT5TaWduYWxTaXplKSA8IDApIHsKKwkJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIHNpZ25hbCBkYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChjaGFubmVsLT5tZW1yZWdpb24sIHNpZ25hbF9kYXRhX29mZnNldCwKKwkJCQkJIGRhdGEsIHNpZ19oZHItPlNpZ25hbFNpemUpIDwgMCkgeworCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBvZiBzaWduYWwgZGF0YSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CisJCQlnb3RvIEF3YXk7CisJCX0KKwl9CisJcmMgPSBUUlVFOworQXdheToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgQk9PTAorc2lnX3JlYWRfZGF0YShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKKwkgICAgICBTSUdOQUxfUVVFVUVfSEVBREVSICpzaWdfaGRyLCBVMzIgc2xvdCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gc2lnX2RvX2RhdGEoY2hhbm5lbCwgcXVldWUsIHNpZ19oZHIsIHNsb3QsIGRhdGEsIEZBTFNFKTsKK30KKworc3RhdGljIGlubGluZSBCT09MCitzaWdfd3JpdGVfZGF0YShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwKKwkgICAgICAgU0lHTkFMX1FVRVVFX0hFQURFUiAqc2lnX2hkciwgVTMyIHNsb3QsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHNpZ19kb19kYXRhKGNoYW5uZWwsIHF1ZXVlLCBzaWdfaGRyLCBzbG90LCBkYXRhLCBUUlVFKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitzYWZlX3NpZ19xdWV1ZV92YWxpZGF0ZShwU0lHTkFMX1FVRVVFX0hFQURFUiBwc2FmZV9zcWgsCisJCQlwU0lHTkFMX1FVRVVFX0hFQURFUiBwdW5zYWZlX3NxaCwKKwkJCVUzMiAqcGhlYWQsIFUzMiAqcHRhaWwpCit7CisJaWYgKCgqcGhlYWQgPj0gcHNhZmVfc3FoLT5NYXhTaWduYWxTbG90cykKKwkgICAgfHwgKCpwdGFpbCA+PSBwc2FmZV9zcWgtPk1heFNpZ25hbFNsb3RzKSkgeworCQkvKiBDaG9vc2UgMCBvciBtYXgsIG1heWJlIGJhc2VkIG9uIGN1cnJlbnQgdGFpbCB2YWx1ZSAqLworCQkqcGhlYWQgPSAwOworCQkqcHRhaWwgPSAwOworCisJCS8qIFN5bmMgd2l0aCBjbGllbnQgYXMgbmVjZXNzYXJ5ICovCisJCXB1bnNhZmVfc3FoLT5IZWFkID0gKnBoZWFkOworCQlwdW5zYWZlX3NxaC0+VGFpbCA9ICpwdGFpbDsKKworCQlFUlJEUlYoInNhZmVfc2lnX3F1ZXVlX3ZhbGlkYXRlOiBoZWFkID0gMHgleCwgdGFpbCA9IDB4JXgsIE1heFNsb3RzID0gMHgleCIsCisJCSAgICAgKnBoZWFkLCAqcHRhaWwsIHBzYWZlX3NxaC0+TWF4U2lnbmFsU2xvdHMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CQkJCS8qIGVuZCBzYWZlX3NpZ19xdWV1ZV92YWxpZGF0ZSAqLworCitCT09MCit2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpCit7CisJQk9PTCByYyA9IEZBTFNFOworCVNJR05BTF9RVUVVRV9IRUFERVIgc2lnX2hkcjsKKworCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQorCQlzcGluX2xvY2soJmNoYW5uZWwtPnJlbW92ZV9sb2NrKTsKKworCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpIHsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoc2lnX2hkci5IZWFkID09IHNpZ19oZHIuVGFpbCkgeworCQlyYyA9IEZBTFNFOwkvKiBubyBzaWduYWxzIHRvIHJlbW92ZSAqLworCQlnb3RvIEF3YXk7CisJfQorCXNpZ19oZHIuVGFpbCA9IChzaWdfaGRyLlRhaWwgKyAxKSAlIHNpZ19oZHIuTWF4U2lnbmFsU2xvdHM7CisJaWYgKCFzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci5UYWlsLCBtc2cpKSB7CisJCUVSUkRSVigic2lnX3JlYWRfZGF0YSBmYWlsZWQ6IChzdGF0dXM9JWQpXG4iLCByYyk7CisJCWdvdG8gQXdheTsKKwl9CisJc2lnX2hkci5OdW1TaWduYWxzUmVjZWl2ZWQrKzsKKworCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKKwkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCisJICovCisJTUVNT1JZQkFSUklFUjsKKwlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIFRhaWwpKSB7CisJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIFRhaWwgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIE51bVNpZ25hbHNSZWNlaXZlZCkpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtU2lnbmFsc1JlY2VpdmVkIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlyYyA9IFRSVUU7CitBd2F5OgorCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQorCQlzcGluX3VubG9jaygmY2hhbm5lbC0+cmVtb3ZlX2xvY2spOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZSk7CisKK0JPT0wKK3Zpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUsIHZvaWQgKm1zZykKK3sKKwlCT09MIHJjID0gRkFMU0U7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBzaWdfaGRyOworCisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCisJCXNwaW5fbG9jaygmY2hhbm5lbC0+aW5zZXJ0X2xvY2spOworCisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkgeworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCisJc2lnX2hkci5IZWFkID0gKChzaWdfaGRyLkhlYWQgKyAxKSAlIHNpZ19oZHIuTWF4U2lnbmFsU2xvdHMpOworCWlmIChzaWdfaGRyLkhlYWQgPT0gc2lnX2hkci5UYWlsKSB7CisJCXNpZ19oZHIuTnVtT3ZlcmZsb3dzKys7CisJCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgTnVtT3ZlcmZsb3dzKSkgeworCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtT3ZlcmZsb3dzIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCisJaWYgKCFzaWdfd3JpdGVfZGF0YShjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHNpZ19oZHIuSGVhZCwgbXNnKSkgeworCQlFUlJEUlYoInNpZ193cml0ZV9kYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlzaWdfaGRyLk51bVNpZ25hbHNTZW50Kys7CisKKwkvKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCisJICogdXBkYXRlIGhvc3QgbWVtb3J5LgorCSAqLworCU1FTU9SWUJBUlJJRVI7CisJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBIZWFkKSkgeworCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBIZWFkIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsCisJCSAgICAgICByYyk7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBOdW1TaWduYWxzU2VudCkpIHsKKwkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtU2lnbmFsc1NlbnQgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gVFJVRTsKK0F3YXk6CisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCisJCXNwaW5fdW5sb2NrKCZjaGFubmVsLT5pbnNlcnRfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KTsKKworCitpbnQKK3Zpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSkKK3sKKwlTSUdOQUxfUVVFVUVfSEVBREVSIHNpZ19oZHI7CisJVTMyIHNsb3RzX2F2YWlsLCBzbG90c191c2VkOworCVUzMiBoZWFkLCB0YWlsOworCisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKKwkJcmV0dXJuIDA7CisJaGVhZCA9IHNpZ19oZHIuSGVhZDsKKwl0YWlsID0gc2lnX2hkci5UYWlsOworCWlmIChoZWFkIDwgdGFpbCkKKwkJaGVhZCA9IGhlYWQgKyBzaWdfaGRyLk1heFNpZ25hbFNsb3RzOworCXNsb3RzX3VzZWQgPSAoaGVhZCAtIHRhaWwpOworCXNsb3RzX2F2YWlsID0gc2lnX2hkci5NYXhTaWduYWxzIC0gc2xvdHNfdXNlZDsKKwlyZXR1cm4gKGludCkgc2xvdHNfYXZhaWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfc2xvdHNfYXZhaWwpOworCitpbnQKK3Zpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUpCit7CisJU0lHTkFMX1FVRVVFX0hFQURFUiBzaWdfaGRyOworCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCisJCXJldHVybiAwOworCXJldHVybiAoaW50KSBzaWdfaGRyLk1heFNpZ25hbHM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKTsKKworc3RhdGljIHZvaWQKK3NpZ3F1ZXVlX2RlYnVnKFNJR05BTF9RVUVVRV9IRUFERVIgKnEsIGludCB3aGljaCwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc2VxX3ByaW50ZihzZXEsICJTaWduYWwgUXVldWUgIyVkXG4iLCB3aGljaCk7CisJc2VxX3ByaW50ZihzZXEsICIgICBWZXJzaW9uSWQgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcS0+VmVyc2lvbklkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFR5cGUgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5UeXBlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIG9TaWduYWxCYXNlICAgICAgICA9ICVsbHVcbiIsCisJCSAgIChsb25nIGxvbmcpIHEtPm9TaWduYWxCYXNlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFNpZ25hbFNpemUgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5TaWduYWxTaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIE1heFNpZ25hbFNsb3RzICAgICA9ICVsdVxuIiwKKwkJICAgKHVsb25nKSBxLT5NYXhTaWduYWxTbG90cyk7CisJc2VxX3ByaW50ZihzZXEsICIgICBNYXhTaWduYWxzICAgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcS0+TWF4U2lnbmFscyk7CisJc2VxX3ByaW50ZihzZXEsICIgICBGZWF0dXJlRmxhZ3MgICAgICAgPSAlLTE2LjE2THhcbiIsCisJCSAgIChsb25nIGxvbmcpIHEtPkZlYXR1cmVGbGFncyk7CisJc2VxX3ByaW50ZihzZXEsICIgICBOdW1TaWduYWxzU2VudCAgICAgPSAlbGx1XG4iLAorCQkgICAobG9uZyBsb25nKSBxLT5OdW1TaWduYWxzU2VudCk7CisJc2VxX3ByaW50ZihzZXEsICIgICBOdW1TaWduYWxzUmVjZWl2ZWQgPSAlbGx1XG4iLAorCQkgICAobG9uZyBsb25nKSBxLT5OdW1TaWduYWxzUmVjZWl2ZWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgTnVtT3ZlcmZsb3dzICAgICAgID0gJWxsdVxuIiwKKwkJICAgKGxvbmcgbG9uZykgcS0+TnVtT3ZlcmZsb3dzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIEhlYWQgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5IZWFkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFRhaWwgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBxLT5UYWlsKTsKK30KKwordm9pZAordmlzb3JjaGFubmVsX2RlYnVnKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgaW50IG5RdWV1ZXMsCisJCSAgIHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBVMzIgb2ZmKQoreworCUhPU1RBRERSRVNTIGFkZHIgPSAwOworCXVsb25nIG5ieXRlcyA9IDAsIG5ieXRlc19yZWdpb24gPSAwOworCU1FTVJFR0lPTiAqbWVtcmVnaW9uID0gTlVMTDsKKwlDSEFOTkVMX0hFQURFUiBoZHI7CisJQ0hBTk5FTF9IRUFERVIgKnBoZHIgPSAmaGRyOworCWNoYXIgc1s5OV07CisJaW50IGkgPSAwOworCWludCBlcnJjb2RlID0gMDsKKworCWlmIChjaGFubmVsID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyBubyBjaGFubmVsIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCW1lbXJlZ2lvbiA9IGNoYW5uZWwtPm1lbXJlZ2lvbjsKKwlpZiAobWVtcmVnaW9uID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyBubyBtZW1yZWdpb24iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJYWRkciA9IHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIobWVtcmVnaW9uKTsKKwluYnl0ZXNfcmVnaW9uID0gdmlzb3JfbWVtcmVnaW9uX2dldF9uYnl0ZXMobWVtcmVnaW9uKTsKKwllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwgb2ZmLAorCQkJCSAgICBwaGRyLCBzaXplb2YoQ0hBTk5FTF9IRUFERVIpKTsKKwlpZiAoZXJyY29kZSA8IDApIHsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiUmVhZCBvZiBjaGFubmVsIGhlYWRlciBmYWlsZWQgd2l0aCBlcnJjb2RlPSVkKVxuIiwKKwkJCSAgIGVycmNvZGUpOworCQlpZiAob2ZmID09IDApIHsKKwkJCXBoZHIgPSAmY2hhbm5lbC0+Y2hhbl9oZHI7CisJCQlzZXFfcHV0cyhzZXEsICIoZm9sbG93aW5nIGRhdGEgbWF5IGJlIHN0YWxlKVxuIik7CisJCX0gZWxzZQorCQkJcmV0dXJuOworCX0KKwluYnl0ZXMgPSAodWxvbmcpIChwaGRyLT5TaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgIi0tLSBCZWdpbiBjaGFubmVsIEAweCUtMTYuMTZMeCBmb3IgMHglbHggYnl0ZXMgKHJlZ2lvbj0weCVseCBieXRlcykgLS0tXG4iLAorCQkgICBhZGRyICsgb2ZmLCBuYnl0ZXMsIG5ieXRlc19yZWdpb24pOworCXNlcV9wcmludGYoc2VxLCAiVHlwZSAgICAgICAgICAgID0gJXNcbiIsIEdVSURfZm9ybWF0MigmcGhkci0+VHlwZSwgcykpOworCXNlcV9wcmludGYoc2VxLCAiWm9uZUd1aWQgICAgICAgID0gJXNcbiIsCisJCSAgIEdVSURfZm9ybWF0MigmcGhkci0+Wm9uZUd1aWQsIHMpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNpZ25hdHVyZSAgICAgICA9IDB4JS0xNi4xNkx4XG4iLAorCQkgICAobG9uZyBsb25nKSBwaGRyLT5TaWduYXR1cmUpOworCXNlcV9wcmludGYoc2VxLCAiTGVnYWN5U3RhdGUgICAgID0gJWx1XG4iLCAodWxvbmcpIHBoZHItPkxlZ2FjeVN0YXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNydlN0YXRlICAgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5TcnZTdGF0ZSk7CisJc2VxX3ByaW50ZihzZXEsICJDbGlTdGF0ZUJvb3QgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+Q2xpU3RhdGVCb290KTsKKwlzZXFfcHJpbnRmKHNlcSwgIkNsaVN0YXRlT1MgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5DbGlTdGF0ZU9TKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkhlYWRlclNpemUgICAgICA9ICVsdVxuIiwgKHVsb25nKSBwaGRyLT5IZWFkZXJTaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNpemUgICAgICAgICAgICA9ICVsbHVcbiIsIChsb25nIGxvbmcpIHBoZHItPlNpemUpOworCXNlcV9wcmludGYoc2VxLCAiRmVhdHVyZXMgICAgICAgID0gMHglLTE2LjE2bGx4XG4iLAorCQkgICAobG9uZyBsb25nKSBwaGRyLT5GZWF0dXJlcyk7CisJc2VxX3ByaW50ZihzZXEsICJQYXJ0aXRpb25IYW5kbGUgPSAweCUtMTYuMTZsbHhcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPlBhcnRpdGlvbkhhbmRsZSk7CisJc2VxX3ByaW50ZihzZXEsICJIYW5kbGUgICAgICAgICAgPSAweCUtMTYuMTZsbHhcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPkhhbmRsZSk7CisJc2VxX3ByaW50ZihzZXEsICJWZXJzaW9uSWQgICAgICAgPSAlbHVcbiIsICh1bG9uZykgcGhkci0+VmVyc2lvbklkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIm9DaGFubmVsU3BhY2UgICA9ICVsbHVcbiIsCisJCSAgIChsb25nIGxvbmcpIHBoZHItPm9DaGFubmVsU3BhY2UpOworCWlmICgocGhkci0+b0NoYW5uZWxTcGFjZSA9PSAwKSB8fCAoZXJyY29kZSA8IDApKQorCQk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgblF1ZXVlczsgaSsrKSB7CisJCQlTSUdOQUxfUVVFVUVfSEVBREVSIHE7CisJCQllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKKwkJCQkJCSAgICBvZmYgKyBwaGRyLT5vQ2hhbm5lbFNwYWNlICsKKwkJCQkJCSAgICAoaSAqIHNpemVvZihxKSksCisJCQkJCQkgICAgJnEsIHNpemVvZihxKSk7CisJCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkJICAgImZhaWxlZCB0byByZWFkIHNpZ25hbCBxdWV1ZSAjJWQgZnJvbSBjaGFubmVsIEAweCUtMTYuMTZMeCBlcnJjb2RlPSVkXG4iLAorCQkJCQkgICBpLCBhZGRyLCBlcnJjb2RlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNpZ3F1ZXVlX2RlYnVnKCZxLCBpLCBzZXEpOworCQl9CisJc2VxX3ByaW50ZihzZXEsICItLS0gRW5kICAgY2hhbm5lbCBAMHglLTE2LjE2THggZm9yIDB4JWx4IGJ5dGVzIC0tLVxuIiwKKwkJICAgYWRkciArIG9mZiwgbmJ5dGVzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9kZWJ1Zyk7CisKK3ZvaWQKK3Zpc29yY2hhbm5lbF9kdW1wX3NlY3Rpb24oVklTT1JDSEFOTkVMICpjaGFuLCBjaGFyICpzLAorCQkJICBpbnQgb2ZmLCBpbnQgbGVuLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwljaGFyICpidWYsICp0YnVmLCAqZm10YnVmOworCWludCBmbXRidWZzaXplID0gMDsKKwlpbnQgaTsKKwlpbnQgZXJyY29kZSA9IDA7CisKKwlmbXRidWZzaXplID0gMTAwICogQ09WUShsZW4sIDE2KTsKKwlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlmbXRidWYgPSBrbWFsbG9jKGZtdGJ1ZnNpemUsIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKGJ1ZiA9PSBOVUxMIHx8IGZtdGJ1ZiA9PSBOVUxMKQorCQlnb3RvIEF3YXk7CisKKwllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbiwgb2ZmLCBidWYsIGxlbik7CisJaWYgKGVycmNvZGUgPCAwKSB7CisJCUVSUkRSVigiJXMgZmFpbGVkIHRvIHJlYWQgJXMgZnJvbSBjaGFubmVsIGVycmNvZGU9JWQiLAorCQkgICAgICAgcywgX19mdW5jX18sIGVycmNvZGUpOworCQlnb3RvIEF3YXk7CisJfQorCXNlcV9wcmludGYoc2VxLCAiY2hhbm5lbCAlczpcbiIsIHMpOworCXRidWYgPSBidWY7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaSA9IChsZW4gPCAxNikgPyBsZW4gOiAxNjsKKwkJaGV4X2R1bXBfdG9fYnVmZmVyKHRidWYsIGksIDE2LCAxLCBmbXRidWYsIGZtdGJ1ZnNpemUsIFRSVUUpOworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBmbXRidWYpOworCQl0YnVmICs9IDE2OworCQlsZW4gLT0gMTY7CisJfQorCitBd2F5OgorCWlmIChidWYgIT0gTlVMTCkgeworCQlrZnJlZShidWYpOworCQlidWYgPSBOVUxMOworCX0KKwlpZiAoZm10YnVmICE9IE5VTEwpIHsKKwkJa2ZyZWUoZm10YnVmKTsKKwkJZm10YnVmID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZHVtcF9zZWN0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfbWFpbi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIHZpc29yY2hhbm5lbF9tYWluLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgVGhpcyBpcyBhIG1vZHVsZSAid3JhcHBlciIgYXJvdW5kIHZpc29yY2hhbm5lbF9mdW5jcy4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKyNpbmNsdWRlICJ2aXNvcmNoYW5uZWwuaCIKKyNpbmNsdWRlICJndWlkdXRpbHMuaCIKKworI2RlZmluZSBNWURSVk5BTUUgInZpc29yY2hhbm5lbCIKKworc3RhdGljIGludCBfX2luaXQKK3Zpc29yY2hhbm5lbF9pbml0KHZvaWQpCit7CisJSU5GT0RSVigiZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkIiwgVkVSU0lPTik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit2aXNvcmNoYW5uZWxfZXhpdCh2b2lkKQoreworCUlORk9EUlYoImRyaXZlciB1bmxvYWRlZCIpOworfQorCittb2R1bGVfaW5pdCh2aXNvcmNoYW5uZWxfaW5pdCk7Cittb2R1bGVfZXhpdCh2aXNvcmNoYW5uZWxfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlVuaXN5cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlcnZpc29yIGNoYW5uZWwgZHJpdmVyIGZvciBzZXJ2aWNlIHBhcnRpdGlvbjogdmVyICIKKwkJICAgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTJmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgVW5pc3lzIHZpc29yY2hpcHNldCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVklTT1JDSElQU0VUCisJdHJpc3RhdGUgIlVuaXN5cyB2aXNvcmNoaXBzZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JVVElMICYmIFVOSVNZU19WSVNPUkNIQU5ORUwKKwktLS1oZWxwLS0tCisJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpc29yY2hpcHNldCBkcml2ZXIuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlODY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFVuaXN5cyB2aXNvcmNoaXBzZXQKKyMKKworb2JqLSQoQ09ORklHX1VOSVNZU19WSVNPUkNISVBTRVQpCSs9IHZpc29yY2hpcHNldC5vCisKK3Zpc29yY2hpcHNldC15IDo9IHZpc29yY2hpcHNldF9tYWluLm8gY29udHJvbHZtX2RpcmVjdC5vIGZpbGUubyBmaWxleGZlci5vIFwKKwkJCXBhcnNlci5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscworY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwKK2NjZmxhZ3MteSArPSAtSWluY2x1ZGUvZ2VuZXJhdGVkCitjY2ZsYWdzLXkgKz0gLURDT05GSUdfU1BBUl9HVUVTVCAtREdVRVNURFJJVkVSQlVJTEQgLUROT0FVVE9WRVJTSU9OCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczZmExMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIGNvbnRyb2x2bS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ09OVFJPTFZNX0hfXworI2RlZmluZSBfX0NPTlRST0xWTV9IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKK2ludCAgICAgICAgIGNvbnRyb2x2bV9pbml0KHZvaWQpOwordm9pZCAgICAgICAgY29udHJvbHZtX2RlaW5pdCh2b2lkKTsKK0hPU1RBRERSRVNTIGNvbnRyb2x2bV9nZXRfY2hhbm5lbF9hZGRyZXNzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bV9kaXJlY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2NvbnRyb2x2bV9kaXJlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTExZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvY29udHJvbHZtX2RpcmVjdC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIGNvbnRyb2x2bV9kaXJlY3QuYworICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworLyogVGhpcyBpcyBhIGNvbnRyb2x2bS1yZWxhdGVkIGNvZGUgdGhhdCBpcyBkZXBlbmRlbnQgdXBvbiBmaXJtd2FyZSBydW5uaW5nCisgKiBvbiBhIHZpcnR1YWwgcGFydGl0aW9uLgorICovCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAidWlzdXRpbHMuaCIKKyNpbmNsdWRlICJjb250cm9sdm0uaCIKKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFZJU09SX0NISVBTRVRfUENfY29udHJvbHZtX2RpcmVjdF9jCisKKworLyogV2UgY2FuIGZpbGwgaW4gdGhpcyBjb2RlIHdoZW4gd2UgbGVhcm4gaG93IHRvIG1ha2Ugdm1jYWxscy4uLiAqLworCisKKworaW50IGNvbnRyb2x2bV9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKworCit2b2lkIGNvbnRyb2x2bV9kZWluaXQodm9pZCkKK3sKK30KKworCisKK0hPU1RBRERSRVNTIGNvbnRyb2x2bV9nZXRfY2hhbm5lbF9hZGRyZXNzKHZvaWQpCit7CisJc3RhdGljIEJPT0wgd2FybmVkID0gRkFMU0U7CisJVTY0IGFkZHIgPSAwOworCisJVTMyIHNpemUgPSAwOworCisJaWYgKCFWTUNBTExfU1VDQ0VTU0ZVTChJc3N1ZV9WTUNBTExfSU9fQ09OVFJPTFZNX0FERFIoJmFkZHIsICZzaXplKSkpIHsKKwkJaWYgKCF3YXJuZWQpIHsKKwkJCUVSUkRSVigiJXMgLSB2bWNhbGwgdG8gZGV0ZXJtaW5lIGNvbnRyb2x2bSBjaGFubmVsIGFkZHIgZmFpbGVkIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQl3YXJuZWQgPSBUUlVFOworCQl9CisJCXJldHVybiAwOworCX0KKwlJTkZPRFJWKCJjb250cm9sdm0gYWRkcj0lTHgiLCBhZGRyKTsKKwlyZXR1cm4gYWRkcjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE0YTExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBmaWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIFRoaXMgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzIGEgdXNlcm1vZGUgcHJvZ3JhbSB0bworICogY29tbXVuaWNhdGUgd2l0aCB0aGUgdmlzb3JjaGlwc2V0IGRyaXZlciB1c2luZyBhIGRldmljZS9maWxlIGludGVyZmFjZS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgInZpc29yY2hhbm5lbC5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgImZpbGUuaCIKKworI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklTT1JfQ0hJUFNFVF9QQ19maWxlX2MKKworc3RhdGljIHN0cnVjdCBjZGV2IENkZXY7CitzdGF0aWMgVklTT1JDSEFOTkVMICoqUENvbnRyb2xWbV9jaGFubmVsOworc3RhdGljIGRldl90IE1ham9yRGV2ID0gLTE7IC8qKjwgaW5kaWNhdGVzIG1ham9yIG51bSBmb3IgZGV2aWNlICovCitzdGF0aWMgQk9PTCBSZWdpc3RlcmVkID0gRkFMU0U7CisKK3N0YXRpYyBpbnQgdmlzb3JjaGlwc2V0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCB2aXNvcmNoaXBzZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHZpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorbG9uZyB2aXNvcmNoaXBzZXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbHNlCitpbnQgdmlzb3JjaGlwc2V0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpc29yY2hpcHNldF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gdmlzb3JjaGlwc2V0X29wZW4sCisJLnJlYWQgPSBOVUxMLAorCS53cml0ZSA9IE5VTEwsCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorCS51bmxvY2tlZF9pb2N0bCA9IHZpc29yY2hpcHNldF9pb2N0bCwKKyNlbHNlCisJLmlvY3RsID0gdmlzb3JjaGlwc2V0X2lvY3RsLAorI2VuZGlmCisJLnJlbGVhc2UgPSB2aXNvcmNoaXBzZXRfcmVsZWFzZSwKKwkubW1hcCA9IHZpc29yY2hpcHNldF9tbWFwLAorfTsKKworaW50Cit2aXNvcmNoaXBzZXRfZmlsZV9pbml0KGRldl90IG1ham9yRGV2LCBWSVNPUkNIQU5ORUwgKipwQ29udHJvbFZtX2NoYW5uZWwpCit7CisJaW50IHJjID0gLTE7CisKKwlQQ29udHJvbFZtX2NoYW5uZWwgPSBwQ29udHJvbFZtX2NoYW5uZWw7CisJTWFqb3JEZXYgPSBtYWpvckRldjsKKwljZGV2X2luaXQoJkNkZXYsICZ2aXNvcmNoaXBzZXRfZm9wcyk7CisJQ2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCWlmIChNQUpPUihNYWpvckRldikgPT0gMCkgeworCQkvKiBkeW5hbWljIG1ham9yIGRldmljZSBudW1iZXIgcmVnaXN0cmF0aW9uIHJlcXVpcmVkICovCisJCWlmIChhbGxvY19jaHJkZXZfcmVnaW9uKCZNYWpvckRldiwgMCwgMSwgTVlEUlZOQU1FKSA8IDApIHsKKwkJCUVSUkRSVigiVW5hYmxlIHRvIGFsbG9jYXRlK3JlZ2lzdGVyIGNoYXIgZGV2aWNlICVzIiwKKwkJCSAgICAgICBNWURSVk5BTUUpOworCQkJZ290byBBd2F5OworCQl9CisJCVJlZ2lzdGVyZWQgPSBUUlVFOworCQlJTkZPRFJWKCJOZXcgbWFqb3IgbnVtYmVyICVkIHJlZ2lzdGVyZWRcbiIsIE1BSk9SKE1ham9yRGV2KSk7CisJfSBlbHNlIHsKKwkJLyogc3RhdGljIG1ham9yIGRldmljZSBudW1iZXIgcmVnaXN0cmF0aW9uIHJlcXVpcmVkICovCisJCWlmIChyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1ham9yRGV2LCAxLCBNWURSVk5BTUUpIDwgMCkgeworCQkJRVJSRFJWKCJVbmFibGUgdG8gcmVnaXN0ZXIgY2hhciBkZXZpY2UgJXMiLCBNWURSVk5BTUUpOworCQkJZ290byBBd2F5OworCQl9CisJCVJlZ2lzdGVyZWQgPSBUUlVFOworCQlJTkZPRFJWKCJTdGF0aWMgbWFqb3IgbnVtYmVyICVkIHJlZ2lzdGVyZWRcbiIsIE1BSk9SKE1ham9yRGV2KSk7CisJfQorCWlmIChjZGV2X2FkZCgmQ2RldiwgTUtERVYoTUFKT1IoTWFqb3JEZXYpLCAwKSwgMSkgPCAwKSB7CisJCUVSUkRSVigiZmFpbGVkIHRvIGNyZWF0ZSBjaGFyIGRldmljZTogKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJZ290byBBd2F5OworCX0KKwlJTkZPRFJWKCJSZWdpc3RlcmVkIGNoYXIgZGV2aWNlIGZvciAlcyAobWFqb3I9JWQpIiwKKwkJTVlEUlZOQU1FLCBNQUpPUihNYWpvckRldikpOworCXJjID0gMDsKK0F3YXk6CisJcmV0dXJuIHJjOworfQorCit2b2lkCit2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKHZvaWQpCit7CisJaWYgKENkZXYub3BzICE9IE5VTEwpCisJCWNkZXZfZGVsKCZDZGV2KTsKKwlDZGV2Lm9wcyA9IE5VTEw7CisJaWYgKFJlZ2lzdGVyZWQpIHsKKwkJaWYgKE1BSk9SKE1ham9yRGV2KSA+PSAwKSB7CisJCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTWFqb3JEZXYsIDEpOworCQkJTWFqb3JEZXYgPSBNS0RFVigwLCAwKTsKKwkJfQorCQlSZWdpc3RlcmVkID0gRkFMU0U7CisJfQorfQorCitzdGF0aWMgaW50Cit2aXNvcmNoaXBzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBtaW5vcl9udW1iZXIgPSBpbWlub3IoaW5vZGUpOworCWludCByYyA9IC1FTk9ERVY7CisKKwlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7CisJaWYgKG1pbm9yX251bWJlciAhPSAwKQorCQlnb3RvIEF3YXk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyYyA9IDA7CitBd2F5OgorCWlmIChyYyA8IDApCisJCUVSUkRSVigiJXMgbWlub3I9JWQgZmFpbGVkIiwgX19mdW5jX18sIG1pbm9yX251bWJlcik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50Cit2aXNvcmNoaXBzZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Zpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bG9uZyBwaHlzQWRkciA9IDA7CisJdWxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgYWRkciA9IDA7CisKKwkvKiBzdl9lbmFibGVfZGZwKCk7ICovCisJREVCVUdEUlYoIiVzIiwgX19mdW5jX18pOworCWlmIChvZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSkpIHsKKwkJRVJSRFJWKCIlcyB2aXJ0dWFsIGFkZHJlc3MgTk9UIHBhZ2UtYWxpZ25lZCEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5YSU87CS8qIG5lZWQgYWxpZ25lZCBvZmZzZXRzICovCisJfQorCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSBWSVNPUkNISVBTRVRfTU1BUF9DT05UUk9MQ0hBTk9GRlNFVDoKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwkJaWYgKCpQQ29udHJvbFZtX2NoYW5uZWwgPT0gTlVMTCkgeworCQkJRVJSRFJWKCIlcyBubyBjb250cm9sdm0gY2hhbm5lbCB5ZXQiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXZpc29yY2hhbm5lbF9yZWFkKCpQQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkJICAgZ3BDb250cm9sQ2hhbm5lbCksICZhZGRyLAorCQkJCSAgc2l6ZW9mKGFkZHIpKTsKKwkJaWYgKGFkZHIgPT0gMCkgeworCQkJRVJSRFJWKCIlcyBjb250cm9sIGNoYW5uZWwgYWRkcmVzcyBpcyAwIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlwaHlzQWRkciA9ICh1bG9uZykgKGFkZHIpOworCQlERUJVR0RSVigibWFwcGluZyBwaHlzaWNhbCBhZGRyZXNzID0gMHglbHgiLCBwaHlzQWRkcik7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICBwaHlzQWRkciA+PiBQQUdFX1NISUZULAorCQkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgIC8qcGdwcm90X25vbmNhY2hlZCAqLworCQkJCSAgICAodm1hLT52bV9wYWdlX3Byb3QpKSkgeworCQkJRVJSRFJWKCIlcyByZW1hcF9wZm5fcmFuZ2UgZmFpbGVkIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCURFQlVHRFJWKCIlcyBzdWNjZXNzISIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKK2xvbmcKK3Zpc29yY2hpcHNldF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZWxzZQoraW50Cit2aXNvcmNoaXBzZXRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorI2VuZGlmCit7CisJaW50IHJjID0gU1VDQ0VTUzsKKwlTNjQgYWRqdXN0bWVudDsKKwlTNjQgdnJ0Y19vZmZzZXQ7CisJREJHSU5GKCJlbnRlcmVkIHZpc29yY2hpcHNldF9pb2N0bCwgY21kPSVkIiwgY21kKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVk1DQUxMX1FVRVJZX0dVRVNUX1ZJUlRVQUxfVElNRV9PRkZTRVQ6CisJCS8qIGdldCB0aGUgcGh5c2ljYWwgcnRjIG9mZnNldCAqLworCQl2cnRjX29mZnNldCA9IElzc3VlX1ZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUKCk7CisJCWlmIChjb3B5X3RvX3VzZXIKKwkJICAgICgodm9pZCBfX3VzZXIgKilhcmcsICZ2cnRjX29mZnNldCwgc2l6ZW9mKHZydGNfb2Zmc2V0KSkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlEQkdJTkYoImluc2RlIHZpc29yY2hpcHNldF9pb2N0bCwgY21kPSVkLCB2cnRjX29mZnNldD0lbGxkIiwKKwkJICAgICAgIGNtZCwgdnJ0Y19vZmZzZXQpOworCQlicmVhazsKKwljYXNlIFZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmFkanVzdG1lbnQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGFkanVzdG1lbnQpKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBBd2F5OworCQl9CisJCURCR0lORigiaW5zZGUgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQsIGFkanVzdG1lbnQ9JWxsZCIsIGNtZCwKKwkJICAgICAgIGFkanVzdG1lbnQpOworCQlyYyA9IElzc3VlX1ZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRShhZGp1c3RtZW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HRVJSKCJ2aXNvcmNoaXBzZXRfaW9jdGwgcmVjZWl2ZWQgaW52YWxpZCBjb21tYW5kIik7CisJCXJjID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorQXdheToKKwlEQkdJTkYoImV4aXRpbmcgJWQhIiwgcmMpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTcyODJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIGZpbGUuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0ZJTEVfSF9fCisjZGVmaW5lIF9fRklMRV9IX18KKworI2luY2x1ZGUgImdsb2JhbHMuaCIKKworaW50IHZpc29yY2hpcHNldF9maWxlX2luaXQoZGV2X3QgbWFqb3JEZXYsIFZJU09SQ0hBTk5FTCAqKnBDb250cm9sVm1fY2hhbm5lbCk7Cit2b2lkIHZpc29yY2hpcHNldF9maWxlX2NsZWFudXAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxY2ZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmMKQEAgLTAsMCArMSw1MDYgQEAKKy8qIGZpbGV4ZmVyLmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEzIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIENvZGUgaGVyZS1pbiBpcyB0aGUgImdsdWUiIHRoYXQgY29ubmVjdHMgY29udHJvbHZtIG1lc3NhZ2VzIHdpdGggdGhlCisgKiBzcGFyZmlsZXhmZXIgZHJpdmVyLCB3aGljaCBpcyB1c2VkIHRvIHRyYW5zZmVyIGZpbGUgY29udGVudHMgYXMgcGF5bG9hZAorICogYWNyb3NzIHRoZSBjb250cm9sdm0gY2hhbm5lbC4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2luY2x1ZGUgImNvbnRyb2x2bS5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldC5oIgorI2luY2x1ZGUgImZpbGV4ZmVyLmgiCisKKyNpZmRlZiBFTkFCTEVfU1BBUkZJTEVYRkVSIC8qIHNwYXJmaWxleGZlciBrZXJuZWwgbW9kdWxlIGVuYWJsZWQgaW4gYnVpbGQgKi8KKyNpbmNsdWRlICJzcGFyZmlsZXhmZXIuaCIKKworLyogRHJpdmVyLWdsb2JhbCBtZW1vcnkgKi8KK3N0YXRpYyBMSVNUX0hFQUQoUmVxdWVzdF9saXN0KTsJLyogbGlzdCBvZiBzdHJ1Y3QgYW55X3JlcXVlc3QgKiwgdmlhCisJCQkJICogcmVxX2xpc3QgbWVtYiAqLworCisvKiBsb2NrIGZvciBhYm92ZSBwb29sIGZvciBhbGxvY2F0aW9uIG9mIGFueV9yZXF1ZXN0IHN0cnVjdHMsIGFuZCBwb29sCisqIG5hbWU7IG5vdGUgdGhhdCBrbWVtX2NhY2hlX2NyZWF0ZSByZXF1aXJlcyB0aGF0IHdlIGtlZXAgdGhlIHN0b3JhZ2UKKyogZm9yIHRoZSBwb29sIG5hbWUgZm9yIHRoZSBsaWZlIG9mIHRoZSBwb29sCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soUmVxdWVzdF9saXN0X2xvY2spOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKlJlcXVlc3RfbWVtb3J5X3Bvb2w7CitzdGF0aWMgY29uc3QgY2hhciBSZXF1ZXN0X21lbW9yeV9wb29sX25hbWVbXSA9ICJmaWxleGZlcl9yZXF1ZXN0X3Bvb2wiOworc2l6ZV90IENhbGxlcl9yZXFfY29udGV4dF9ieXRlcyA9IDA7CS8qIHBhc3NlZCB0byBmaWxleGZlcl9jb25zdHJ1Y3RvcigpICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBzaW5nbGUgY29udHJvbHZtIEdFVEZJTEUgY29udmVyc2F0aW9uLCB3aGljaAorICogY29uc2lzdHMgb2YgYSBzaW5nbGUgY29udHJvbHZtIHJlcXVlc3QgbWVzc2FnZSBhbmQgMSBvciBtb3JlIGNvbnRyb2x2bQorICogcmVzcG9uc2UgbWVzc2FnZXMuCisgKi8KK3N0cnVjdCBnZXRmaWxlX3JlcXVlc3QgeworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBjb250cm9sdm1faGVhZGVyOworCWF0b21pY190IGJ1ZmZlcnNfaW5fdXNlOworCUdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMgZ2V0X2NvbnRpZ3VvdXNfY29udHJvbHZtX3BheWxvYWQ7CisJQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMgY29udHJvbHZtX3Jlc3BvbmRfd2l0aF9wYXlsb2FkOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIHNpbmdsZSBjb250cm9sdm0gUFVURklMRSBjb252ZXJzYXRpb24sIHdoaWNoCisgKiBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb250cm9sdm0gcmVxdWVzdCB3aXRoIGEgZmlsZW5hbWUsIGFuZCBhZGRpdGlvbmFsCisgKiBjb250cm9sdm0gbWVzc2FnZXMgd2l0aCBmaWxlIGRhdGEuCisgKi8KK3N0cnVjdCBwdXRmaWxlX3JlcXVlc3QgeworCUdFVF9DT05UUk9MVk1fRklMRURBVEFfRlVOQyBnZXRfY29udHJvbHZtX2ZpbGVkYXRhOworCUNPTlRST0xWTV9SRVNQT05EX0ZVTkMgY29udHJvbHZtX2VuZF9wdXRGaWxlOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIHNpbmdsZSBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiwgd2hpY2ggY2FuIGVpdGhlcgorICogYmUgYSBHRVRGSUxFIG9yIFBVVEZJTEUuCisgKi8KK3N0cnVjdCBhbnlfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCByZXFfbGlzdDsKKwl1bG9uZzIgZmlsZV9yZXF1ZXN0X251bWJlcjsKKwl1bG9uZzIgZGF0YV9zZXF1ZW5jZV9udW1iZXI7CisJVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmM7CisJQk9PTCBpc19nZXQ7CisJdW5pb24geworCQlzdHJ1Y3QgZ2V0ZmlsZV9yZXF1ZXN0IGdldDsKKwkJc3RydWN0IHB1dGZpbGVfcmVxdWVzdCBwdXQ7CisJfTsKKwkvKiBTaXplIG9mIGNhbGxlcl9jb250ZXh0X2RhdGEgd2lsbCBiZQorCSAqIDxDYWxsZXJfcmVxX2NvbnRleHRfYnl0ZXM+IGJ5dGVzLiAgSSBhbGlnbmVkIHRoaXMgYmVjYXVzZSBJCisJICogYW0gcGFyYW5vaWQgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gYW4gYXJiaXRyYXJ5IGRhdGEKKwkgKiBzdHJ1Y3R1cmUgd2l0aCB1bmtub3duIGFsaWdubWVudCByZXF1aXJlbWVudHMgZ2V0cyBjb3BpZWQKKwkgKiBoZXJlLiAgSSB3YW50IGNhbGxlcl9jb250ZXh0X2RhdGEgdG8gYmUgYWxpZ25lZCB0byB0aGUKKwkgKiBjb2Fyc2VzdCBwb3NzaWJsZSBhbGlnbm1lbnQgYm91bmRhcnkgdGhhdCBjb3VsZCBiZSByZXF1aXJlZAorCSAqIGZvciBhbnkgdXNlciBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwl1OCBjYWxsZXJfY29udGV4dF9kYXRhWzFdIF9fYWxpZ25lZChzaXplb2YodWxvbmcyKTsKK307CisKKy8qCisgKiBMaW5rcyB0aGUgYW55X3JlcXVlc3QgaW50byB0aGUgZ2xvYmFsIGxpc3Qgb2YgYWxsb2NhdGVkIHJlcXVlc3RzCisgKiAoPFJlcXVlc3RfbGlzdD4pLgorICovCitzdGF0aWMgdm9pZAordW5pdF90cmFja2luZ19jcmVhdGUoc3RydWN0IGxpc3RfaGVhZCAqZGV2X2xpc3RfbGluaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKGRldl9saXN0X2xpbmssICZSZXF1ZXN0X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIFVubGlua3MgYSBhbnlfcmVxdWVzdCBmcm9tIHRoZSBnbG9iYWwgbGlzdCAoPFJlcXVlc3RfbGlzdD4pLgorICovCitzdGF0aWMgdm9pZAordW5pdF90cmFja2luZ19kZXN0cm95KHN0cnVjdCBsaXN0X2hlYWQgKmRldl9saXN0X2xpbmspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmUmVxdWVzdF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbChkZXZfbGlzdF9saW5rKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOworfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuZCByZXR1cm4gYSBuZXcgYW55X3JlcXVlc3Qgc3RydWN0LCBhbmQKKyAqIGxpbmsgaXQgdG8gdGhlIGdsb2JhbCBsaXN0IG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzLgorICovCitzdGF0aWMgc3RydWN0IGFueV9yZXF1ZXN0ICoKK2FsbG9jX3JlcXVlc3QoY2hhciAqZm4sIGludCBsbikKK3sKKwlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYW55X3JlcXVlc3QgKikKKwkgICAgKHZpc29yY2hpcHNldF9jYWNoZV9hbGxvYyhSZXF1ZXN0X21lbW9yeV9wb29sLAorCQkJCSAgICAgIEZBTFNFLAorCQkJCSAgICAgIGZuLCBsbikpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQocmVxLCAwLCBzaXplb2Yoc3RydWN0IGFueV9yZXF1ZXN0KSArIENhbGxlcl9yZXFfY29udGV4dF9ieXRlcyk7CisJdW5pdF90cmFja2luZ19jcmVhdGUoJnJlcS0+cmVxX2xpc3QpOworCXJldHVybiByZXE7Cit9CisKKy8qIEJvb2stZW5kIGZvciBhbGxvY19yZXF1ZXN0KCkuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3JlcXVlc3Qoc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJdW5pdF90cmFja2luZ19kZXN0cm95KCZyZXEtPnJlcV9saXN0KTsKKwl2aXNvcmNoaXBzZXRfY2FjaGVfZnJlZShSZXF1ZXN0X21lbW9yeV9wb29sLCByZXEsIGZuLCBsbik7Cit9CisKKy8qIENvbnN0cnVjdG9yIGZvciBmaWxleGZlci5vLgorICovCitpbnQKK2ZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVfdCByZXFfY29udGV4dF9ieXRlcykKK3sKKwlpbnQgcmMgPSAtMTsKKworCUNhbGxlcl9yZXFfY29udGV4dF9ieXRlcyA9IHJlcV9jb250ZXh0X2J5dGVzOworCVJlcXVlc3RfbWVtb3J5X3Bvb2wgPQorCSAgICBrbWVtX2NhY2hlX2NyZWF0ZShSZXF1ZXN0X21lbW9yeV9wb29sX25hbWUsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGFueV9yZXF1ZXN0KSArCisJCQkgICAgICBDYWxsZXJfcmVxX2NvbnRleHRfYnl0ZXMsCisJCQkgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghUmVxdWVzdF9tZW1vcnlfcG9vbCkgeworCQlMT0dFUlIoImZhaWxlZCB0byBhbGxvYyBSZXF1ZXN0X21lbW9yeV9wb29sIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBBd2F5OworCX0KKwlyYyA9IDA7CitBd2F5OgorCWlmIChyYyA8IDApIHsKKwkJaWYgKFJlcXVlc3RfbWVtb3J5X3Bvb2wpIHsKKwkJCWttZW1fY2FjaGVfZGVzdHJveShSZXF1ZXN0X21lbW9yeV9wb29sKTsKKwkJCVJlcXVlc3RfbWVtb3J5X3Bvb2wgPSBOVUxMOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgZmlsZXhmZXIuby4KKyAqLwordm9pZAorZmlsZXhmZXJfZGVzdHJ1Y3Rvcih2b2lkKQoreworCWlmIChSZXF1ZXN0X21lbW9yeV9wb29sKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShSZXF1ZXN0X21lbW9yeV9wb29sKTsKKwkJUmVxdWVzdF9tZW1vcnlfcG9vbCA9IE5VTEw7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb2J0YWluIGFuIGF2YWlsYWJsZSBjaHVuayBmcm9tIHRoZSBjb250cm9sdm0gcGF5bG9hZCBhcmVhLAorICogc3RvcmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNodW5rIGluIDxhY3R1YWxfc2l6ZT4sIGFuZCByZXR1cm4gYSBwb2ludGVyCisgKiB0byB0aGUgY2h1bmsuICBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLCB3aGljaCBjYWxscworICogaXQgd2hlbmV2ZXIgcGF5bG9hZCBzcGFjZSBpcyByZXF1aXJlZCB0byBjb3B5IGZpbGUgZGF0YSBpbnRvLgorICovCitzdGF0aWMgdm9pZCAqCitnZXRfZW1wdHlfYnVja2V0X2Zvcl9nZXRmaWxlX2RhdGEodm9pZCAqY29udGV4dCwKKwkJCQkgIHVsb25nIG1pbl9zaXplLCB1bG9uZyBtYXhfc2l6ZSwKKwkJCQkgIHVsb25nICphY3R1YWxfc2l6ZSkKK3sKKwl2b2lkICpidWNrZXQ7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CisKKwlpZiAoIXJlcS0+aXNfZ2V0KSB7CisJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlidWNrZXQgPSAoKnJlcS0+Z2V0LmdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkKQorCSAgICAobWluX3NpemUsIG1heF9zaXplLCBhY3R1YWxfc2l6ZSk7CisJaWYgKGJ1Y2tldCAhPSBOVUxMKSB7CisJCWF0b21pY19pbmMoJnJlcS0+Z2V0LmJ1ZmZlcnNfaW5fdXNlKTsKKwkJREJHSU5GKCIlcyAtIHNlbnQgJWx1LWJ5dGUgYnVmZmVyIiwgX19mdW5jX18sICphY3R1YWxfc2l6ZSk7CisJfQorCXJldHVybiBidWNrZXQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgY29udHJvbHZtIHJlc3BvbnNlIHdpdGggZGF0YSBpbiB0aGUgcGF5bG9hZAorICogKHdob3NlIHNwYWNlIHdhcyBvYnRhaW5lZCB3aXRoIGdldF9lbXB0eV9idWNrZXRfZm9yX2dldGZpbGVfZGF0YSkuICBUaGUKKyAqIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlciwgd2hpY2ggY2FsbHMgaXQgd2hlbmV2ZXIgaXQKKyAqIHdhbnRzIHRvIHNlbmQgZmlsZSBkYXRhIGJhY2sgYWNyb3NzIHRoZSBjb250cm9sdm0gY2hhbm5lbC4KKyAqLworc3RhdGljIGludAorc2VuZF9mdWxsX2dldGZpbGVfZGF0YV9idWNrZXQodm9pZCAqY29udGV4dCwgdm9pZCAqYnVja2V0LAorCQkJICAgICAgdWxvbmcgYnVja2V0X2FjdHVhbF9zaXplLCB1bG9uZyBidWNrZXRfdXNlZF9zaXplKQoreworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKSBjb250ZXh0OworCisJaWYgKCFyZXEtPmlzX2dldCkgeworCQlMT0dFUlIoIiVzIC0gdW5leHBlY3RlZCBjYWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJREJHSU5GKCJzZW5kaW5nIGJ1ZmZlciBmb3IgJWx1LyVsdSIsCisJICAgICAgIGJ1Y2tldF91c2VkX3NpemUsIGJ1Y2tldF9hY3R1YWxfc2l6ZSk7CisJaWYgKCEoKnJlcS0+Z2V0LmNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCkKKwkgICAgKCZyZXEtPmdldC5jb250cm9sdm1faGVhZGVyLAorCSAgICAgcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyLAorCSAgICAgcmVxLT5kYXRhX3NlcXVlbmNlX251bWJlcisrLAorCSAgICAgMCwgYnVja2V0LCBidWNrZXRfYWN0dWFsX3NpemUsIGJ1Y2tldF91c2VkX3NpemUsIFRSVUUpKQorCQlhdG9taWNfZGVjKCZyZXEtPmdldC5idWZmZXJzX2luX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgY29udHJvbHZtIHJlc3BvbnNlIGluZGljYXRpbmcgdGhlIGVuZCBvZiBhCisgKiBHRVRGSUxFIHRyYW5zZmVyLiAgVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlci4KKyAqLworc3RhdGljIHZvaWQKK3NlbmRfZW5kX29mX2dldGZpbGVfZGF0YSh2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKSBjb250ZXh0OworCWlmICghcmVxLT5pc19nZXQpIHsKKwkJTE9HRVJSKCIlcyAtIHVuZXhwZWN0ZWQgY2FsbCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlMT0dJTkYoInN0YXR1cz0lZCIsIHN0YXR1cyk7CisJKCpyZXEtPmdldC5jb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQpCisJICAgICgmcmVxLT5nZXQuY29udHJvbHZtX2hlYWRlciwKKwkgICAgIHJlcS0+ZmlsZV9yZXF1ZXN0X251bWJlciwKKwkgICAgIHJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIrKywgc3RhdHVzLCBOVUxMLCAwLCAwLCBGQUxTRSk7CisJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzdXBwbGllcyBkYXRhIGZvciBhIFBVVEZJTEUgdHJhbnNmZXIuCisgKiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBzcGFyZmlsZXhmZXIgZHJpdmVyLgorICovCitzdGF0aWMgaW50CitnZXRfcHV0ZmlsZV9kYXRhKHZvaWQgKmNvbnRleHQsIHZvaWQgKnBidWYsIHNpemVfdCBidWZzaXplLAorCQkgQk9PTCBidWZfaXNfdXNlcnNwYWNlLCBzaXplX3QgKmJ5dGVzX3RyYW5zZmVycmVkKQoreworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhbnlfcmVxdWVzdCAqKSBjb250ZXh0OworCWlmIChyZXEtPmlzX2dldCkgeworCQlMT0dFUlIoIiVzIC0gdW5leHBlY3RlZCBjYWxsIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAoKnJlcS0+cHV0LmdldF9jb250cm9sdm1fZmlsZWRhdGEpICgmcmVxLT5jYWxsZXJfY29udGV4dF9kYXRhWzBdLAorCQkJCQkJICAgcGJ1ZiwgYnVmc2l6ZSwKKwkJCQkJCSAgIGJ1Zl9pc191c2Vyc3BhY2UsCisJCQkJCQkgICBieXRlc190cmFuc2ZlcnJlZCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBQVVRGSUxFIHRyYW5zZmVyLgorICogVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgc3BhcmZpbGV4ZmVyIGRyaXZlci4KKyAqLworc3RhdGljIHZvaWQKK2VuZF9wdXRmaWxlKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGFueV9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGFueV9yZXF1ZXN0ICopIGNvbnRleHQ7CisJaWYgKHJlcS0+aXNfZ2V0KSB7CisJCUxPR0VSUigiJXMgLSB1bmV4cGVjdGVkIGNhbGwiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJKCpyZXEtPnB1dC5jb250cm9sdm1fZW5kX3B1dEZpbGUpICgmcmVxLT5jYWxsZXJfY29udGV4dF9kYXRhWzBdLAorCQkJCQkgICBzdGF0dXMpOworCWZyZWVfcmVxdWVzdChyZXEsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKKy8qIFJlZmVyIHRvIGZpbGV4ZmVyLmggZm9yIGRlc2NyaXB0aW9uLiAqLworQk9PTAorZmlsZXhmZXJfZ2V0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJIHVsb25nMiBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgdWludCB1cGxpbmtfaW5kZXgsCisJCSB1aW50IGRpc2tfaW5kZXgsCisJCSBjaGFyICpmaWxlX25hbWUsCisJCSBHRVRfQ09OVElHVU9VU19DT05UUk9MVk1fUEFZTE9BRF9GVU5DCisJCSBnZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCwKKwkJIENPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DCisJCSBjb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQsCisJCSBUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYykKK3sKKwlCT09MIHVzZV9jb3VudF91cCA9IEZBTFNFOworCUJPT0wgZmFpbGVkID0gVFJVRTsKKwlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcSA9IGFsbG9jX3JlcXVlc3QoX19GSUxFX18sIF9fTElORV9fKTsKKworCWlmICghcmVxKSB7CisJCUxPR0VSUigiYWxsb2NhdGlvbiBvZiBhbnlfcmVxdWVzdCBmYWlsZWQiKTsKKwkJZ290byBBd2F5OworCX0KKwkvKiBXZSBuZWVkIHRvIGluY3JlbWVudCB0aGlzIG1vZHVsZSdzIHVzZSBjb3VudCBiZWNhdXNlIHdlJ3JlIGhhbmRpbmcKKwkgKiBvZmYgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdpdGhpbiB0aGlzIG1vZHVsZSB0byBiZSB1c2VkIGJ5CisJICogYW5vdGhlciBtb2R1bGUuCisJICovCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwl1c2VfY291bnRfdXAgPSBUUlVFOworCXJlcS0+aXNfZ2V0ID0gVFJVRTsKKwlyZXEtPmZpbGVfcmVxdWVzdF9udW1iZXIgPSBmaWxlX3JlcXVlc3RfbnVtYmVyOworCXJlcS0+ZGF0YV9zZXF1ZW5jZV9udW1iZXIgPSAwOworCXJlcS0+ZHVtcF9mdW5jID0gZHVtcF9mdW5jOworCXJlcS0+Z2V0LmNvbnRyb2x2bV9oZWFkZXIgPSAqbXNnSGRyOworCWF0b21pY19zZXQoJnJlcS0+Z2V0LmJ1ZmZlcnNfaW5fdXNlLCAwKTsKKwlyZXEtPmdldC5nZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCA9CisJICAgIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkOworCXJlcS0+Z2V0LmNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCA9CisJICAgIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZDsKKwlpZiAoc3BhcmZpbGV4ZmVyX2xvY2FsMnJlbW90ZShyZXEsCS8qIGNvbnRleHQsIHBhc3NlZCB0bworCQkJCQkJICogY2FsbGJhY2sgZnVuY3MgKi8KKwkJCQkgICAgICBmaWxlX25hbWUsCisJCQkJICAgICAgZmlsZV9yZXF1ZXN0X251bWJlciwKKwkJCQkgICAgICB1cGxpbmtfaW5kZXgsCisJCQkJICAgICAgZGlza19pbmRleCwKKwkJCQkgICAgICBnZXRfZW1wdHlfYnVja2V0X2Zvcl9nZXRmaWxlX2RhdGEsCisJCQkJICAgICAgc2VuZF9mdWxsX2dldGZpbGVfZGF0YV9idWNrZXQsCisJCQkJICAgICAgc2VuZF9lbmRfb2ZfZ2V0ZmlsZV9kYXRhKSA8IDApIHsKKwkJTE9HRVJSKCJzcGFyZmlsZXhmZXJfbG9jYWwycmVtb3RlIGZhaWxlZCIpOworCQlnb3RvIEF3YXk7CisJfQorCWZhaWxlZCA9IEZBTFNFOworQXdheToKKwlpZiAoZmFpbGVkKSB7CisJCWlmICh1c2VfY291bnRfdXApIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJdXNlX2NvdW50X3VwID0gRkFMU0U7CisJCX0KKwkJaWYgKHJlcSkgeworCQkJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXJlcSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZSB7CisJCXJldHVybiBUUlVFOworCQkvKiBzdWNjZXNzOyBzZW5kIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBmb3IgcmVzcG9uc2VzICovCisJfQorfQorCisvKiBSZWZlciB0byBmaWxleGZlci5oIGZvciBkZXNjcmlwdGlvbi4gKi8KK3ZvaWQgKgorZmlsZXhmZXJfcHV0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJIHVsb25nMiBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgdWludCB1cGxpbmtfaW5kZXgsCisJCSB1aW50IGRpc2tfaW5kZXgsCisJCSBjaGFyICpmaWxlX25hbWUsCisJCSBUUkFOU01JVEZJTEVfSU5JVF9DT05URVhUX0ZVTkMgaW5pdF9jb250ZXh0LAorCQkgR0VUX0NPTlRST0xWTV9GSUxFREFUQV9GVU5DIGdldF9jb250cm9sdm1fZmlsZWRhdGEsCisJCSBDT05UUk9MVk1fUkVTUE9ORF9GVU5DIGNvbnRyb2x2bV9lbmRfcHV0RmlsZSwKKwkJIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKQoreworCUJPT0wgdXNlX2NvdW50X3VwID0gRkFMU0U7CisJQk9PTCBmYWlsZWQgPSBUUlVFOworCXN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxID0gYWxsb2NfcmVxdWVzdChfX0ZJTEVfXywgX19MSU5FX18pOworCXZvaWQgKmNhbGxlcl9jdHggPSBOVUxMOworCisJaWYgKCFyZXEpIHsKKwkJTE9HRVJSKCJhbGxvY2F0aW9uIG9mIGFueV9yZXF1ZXN0IGZhaWxlZCIpOworCQlnb3RvIEF3YXk7CisJfQorCWNhbGxlcl9jdHggPSAodm9pZCAqKSAoJihyZXEtPmNhbGxlcl9jb250ZXh0X2RhdGFbMF0pKTsKKwkvKiBXZSBuZWVkIHRvIGluY3JlbWVudCB0aGlzIG1vZHVsZSdzIHVzZSBjb3VudCBiZWNhdXNlIHdlJ3JlIGhhbmRpbmcKKwkgKiBvZmYgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdpdGhpbiB0aGlzIG1vZHVsZSB0byBiZSB1c2VkIGJ5CisJICogYW5vdGhlciBtb2R1bGUuCisJICovCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwl1c2VfY291bnRfdXAgPSBUUlVFOworCXJlcS0+aXNfZ2V0ID0gRkFMU0U7CisJcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyID0gZmlsZV9yZXF1ZXN0X251bWJlcjsKKwlyZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyID0gMDsKKwlyZXEtPmR1bXBfZnVuYyA9IGR1bXBfZnVuYzsKKwlyZXEtPnB1dC5nZXRfY29udHJvbHZtX2ZpbGVkYXRhID0gZ2V0X2NvbnRyb2x2bV9maWxlZGF0YTsKKwlyZXEtPnB1dC5jb250cm9sdm1fZW5kX3B1dEZpbGUgPSBjb250cm9sdm1fZW5kX3B1dEZpbGU7CisJKCppbml0X2NvbnRleHQpIChjYWxsZXJfY3R4LCBtc2dIZHIsIGZpbGVfcmVxdWVzdF9udW1iZXIpOworCWlmIChzcGFyZmlsZXhmZXJfcmVtb3RlMmxvY2FsKHJlcSwJLyogY29udGV4dCwgcGFzc2VkIHRvCisJCQkJCQkgKiBjYWxsYmFjayBmdW5jcyAqLworCQkJCSAgICAgIGZpbGVfbmFtZSwKKwkJCQkgICAgICBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkJCSAgICAgIHVwbGlua19pbmRleCwKKwkJCQkgICAgICBkaXNrX2luZGV4LAorCQkJCSAgICAgIGdldF9wdXRmaWxlX2RhdGEsIGVuZF9wdXRmaWxlKSA8IDApIHsKKwkJTE9HRVJSKCJzcGFyZmlsZXhmZXJfcmVtb3RlMmxvY2FsIGZhaWxlZCIpOworCQlnb3RvIEF3YXk7CisJfQorCWZhaWxlZCA9IEZBTFNFOworQXdheToKKwlpZiAoZmFpbGVkKSB7CisJCWlmICh1c2VfY291bnRfdXApIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJdXNlX2NvdW50X3VwID0gRkFMU0U7CisJCX0KKwkJaWYgKHJlcSkgeworCQkJZnJlZV9yZXF1ZXN0KHJlcSwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXJlcSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGNhbGxlcl9jdHg7CisJCS8qIHN1Y2Nlc3M7IGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBmb3IgcmVzcG9uc2VzICovCisJfQorfQorCitzdGF0aWMgdm9pZAorZHVtcF9nZXRfcmVxdWVzdChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBnZXRmaWxlX3JlcXVlc3QgKmdldHJlcSkKK3sKKwlzZXFfcHJpbnRmKGYsICIgIGJ1ZmZlcnNfaW5fdXNlPSVkXG4iLAorCQkgICBhdG9taWNfcmVhZCgmZ2V0cmVxLT5idWZmZXJzX2luX3VzZSkpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9wdXRfcmVxdWVzdChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKnB1dHJlcSkKK3sKK30KKworc3RhdGljIHZvaWQKK2R1bXBfcmVxdWVzdChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBhbnlfcmVxdWVzdCAqcmVxKQoreworCXNlcV9wcmludGYoZiwgIiogJXMgaWQ9JWxsdSBzZXE9JWxsdVxuIiwKKwkJICAgKChyZXEtPmlzX2dldCkgPyAiR2V0IiA6ICJQdXQiKSwKKwkJICAgcmVxLT5maWxlX3JlcXVlc3RfbnVtYmVyLCByZXEtPmRhdGFfc2VxdWVuY2VfbnVtYmVyKTsKKwlpZiAocmVxLT5pc19nZXQpCisJCWR1bXBfZ2V0X3JlcXVlc3QoZiwgJnJlcS0+Z2V0KTsKKwllbHNlCisJCWR1bXBfcHV0X3JlcXVlc3QoZiwgJnJlcS0+cHV0KTsKKwlpZiAocmVxLT5kdW1wX2Z1bmMpCisJCSgqcmVxLT5kdW1wX2Z1bmMpIChmLCAmKHJlcS0+Y2FsbGVyX2NvbnRleHRfZGF0YVswXSksICIgICIpOworfQorCit2b2lkCitmaWxleGZlcl9kdW1wKHN0cnVjdCBzZXFfZmlsZSAqZikKK3sKKwl1bG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCXNlcV9wdXRzKGYsICJPdXRzdGFuZGluZyBUUkFOU01JVF9GSUxFIHJlcXVlc3RzOlxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJlJlcXVlc3RfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJlJlcXVlc3RfbGlzdCkgeworCQlzdHJ1Y3QgYW55X3JlcXVlc3QgKnJlcTsKKwkJcmVxID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGFueV9yZXF1ZXN0LCByZXFfbGlzdCk7CisJCWR1bXBfcmVxdWVzdChmLCByZXEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZSZXF1ZXN0X2xpc3RfbG9jaywgZmxhZ3MpOworfQorCisjZWxzZQkJCQkvKiBpZmRlZiBFTkFCTEVfU1BBUkZJTEVYRkVSICovCitpbnQKK2ZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVfdCByZXFfY29udGV4dF9ieXRlcykKK3sKKwlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KK30KKwordm9pZAorZmlsZXhmZXJfZGVzdHJ1Y3Rvcih2b2lkKQoreworfQorCitCT09MCitmaWxleGZlcl9nZXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSB1aW50IHVwbGlua19pbmRleCwKKwkJIHVpbnQgZGlza19pbmRleCwKKwkJIGNoYXIgKmZpbGVfbmFtZSwKKwkJIEdFVF9DT05USUdVT1VTX0NPTlRST0xWTV9QQVlMT0FEX0ZVTkMKKwkJIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkLAorCQkgQ09OVFJPTFZNX1JFU1BPTkRfV0lUSF9QQVlMT0FEX0ZVTkMKKwkJIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCwKKwkJIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKQoreworCS8qIHNpbmNlIG5vIHNwYXJmaWxleGZlciBtb2R1bGUgZXhpc3RzIHRvIGNhbGwsIHdlIGp1c3QgZmFpbCAqLworCXJldHVybiBGQUxTRTsKK30KKwordm9pZCAqCitmaWxleGZlcl9wdXRGaWxlKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLAorCQkgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIsCisJCSB1aW50IHVwbGlua19pbmRleCwKKwkJIHVpbnQgZGlza19pbmRleCwKKwkJIGNoYXIgKmZpbGVfbmFtZSwKKwkJIFRSQU5TTUlURklMRV9JTklUX0NPTlRFWFRfRlVOQyBpbml0X2NvbnRleHQsCisJCSBHRVRfQ09OVFJPTFZNX0ZJTEVEQVRBX0ZVTkMgZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSwKKwkJIENPTlRST0xWTV9SRVNQT05EX0ZVTkMgY29udHJvbHZtX2VuZF9wdXRGaWxlLAorCQkgVFJBTlNNSVRGSUxFX0RVTVBfRlVOQyBkdW1wX2Z1bmMpCit7CisJLyogc2luY2Ugbm8gc3BhcmZpbGV4ZmVyIG1vZHVsZSBleGlzdHMgdG8gY2FsbCwgd2UganVzdCBmYWlsICovCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2ZpbGV4ZmVyX2R1bXAoc3RydWN0IHNlcV9maWxlICpmKQoreworfQorCisjZW5kaWYJCQkJLyogaWZkZWYgRU5BQkxFX1NQQVJGSUxFWEZFUiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZXhmZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiZmNhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGV4ZmVyLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qIGZpbGV4ZmVyLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEzIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRoYXQgZmlsZXhmZXIuYyBwcm92aWRlcyB0byBvdGhlcgorICogY29kZSBpbiB0aGUgdmlzb3JjaGlwc2V0IGRyaXZlci4KKyAqLworCisjaWZuZGVmIF9fRklMRVhGRVJfSF9fCisjZGVmaW5lIF9fRklMRVhGRVJfSF9fCisKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKK3R5cGVkZWYgdm9pZCAqKCpHRVRfQ09OVElHVU9VU19DT05UUk9MVk1fUEFZTE9BRF9GVU5DKSAodWxvbmcgbWluX3NpemUsCisJCQkJCQkJdWxvbmcgbWF4X3NpemUsCisJCQkJCQkJdWxvbmcgKmFjdHVhbF9zaXplKTsKKwordHlwZWRlZiBCT09MCisoKkNPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DKSAoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsCisJCQkJCXU2NCBmaWxlUmVxdWVzdE51bWJlciwKKwkJCQkJdTY0IGRhdGFTZXF1ZW5jZU51bWJlciwKKwkJCQkJaW50IHJlc3BvbnNlLAorCQkJCQl2b2lkICpidWNrZXQsIHVsb25nIHBheWxvYWRDaHVua1NpemUsCisJCQkJCXVsb25nIHBheWxvYWRVc2VkQnl0ZXMsIEJPT0wgcGFydGlhbCk7CisKK3R5cGVkZWYgdm9pZAorKCpUUkFOU01JVEZJTEVfSU5JVF9DT05URVhUX0ZVTkMpKHZvaWQgKmN0eCwKKwkJCQkgIGNvbnN0IENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqaGRyLAorCQkJCSAgdTY0IGZpbGVfcmVxdWVzdF9udW1iZXIpOwordHlwZWRlZiB2b2lkICgqVFJBTlNNSVRGSUxFX0RVTVBfRlVOQykgKHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqY3R4LAorCQkJCQljb25zdCBjaGFyICpwZngpOwordHlwZWRlZiBpbnQgKCpHRVRfQ09OVFJPTFZNX0ZJTEVEQVRBX0ZVTkMpICh2b2lkICpjdHgsCisJCQkJCSAgICB2b2lkICpidWYsIHNpemVfdCBidWZzaXplLAorCQkJCQkgICAgQk9PTCBidWZfaXNfdXNlcnNwYWNlLAorCQkJCQkgICAgc2l6ZV90ICpieXRlc190cmFuc2ZlcnJlZCk7Cit0eXBlZGVmIHZvaWQgKCpDT05UUk9MVk1fUkVTUE9ORF9GVU5DKSAodm9pZCAqY3R4LCBpbnQgcmVzcG9uc2UpOworCisvKiBDYWxsIG9uY2UgdG8gaW5pdGlhbGl6ZSBmaWxleGZlci5vLgorICogcmVxX2NvbnRleHRfYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRoZSBjYWxsZXIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiBlYWNoIGZpbGUKKyAqIHRyYW5zZmVyIGNvbnZlcnNhdGlvbi4gIFRoZSA8Y3R4X2luaXRfdmFsdWU+IHBhc3NlZCB0byBmaWxleGZlcl9wdXRGaWxlKCkgaXMKKyAqIGFzc3VtZWQgdG8gYmUgdGhpcyBtYW55IGJ5dGVzIGluIHNpemUuICBDb2RlIHdpdGhpbiBmaWxleGZlci5vIHdpbGwgY29weSB0aGlzCisgKiBpbnRvIGEgZHluYW1pY2FsbHktYWxsb2NhdGVkIGFyZWEsIGFuZCBwYXNzIGJhY2sgYSBwb2ludGVyIHRvIHRoYXQgYXJlYSBpbgorICogY2FsbGJhY2sgZnVuY3Rpb25zLgorICovCitpbnQgZmlsZXhmZXJfY29uc3RydWN0b3Ioc2l6ZV90IHJlcV9jb250ZXh0X2J5dGVzKTsKKworLyogQ2FsbCBvbmNlIHRvIGNsZWFuIHVwIGZpbGV4ZmVyLm8gKi8KK3ZvaWQgZmlsZXhmZXJfZGVzdHJ1Y3Rvcih2b2lkKTsKKworLyogQ2FsbCB0aGlzIHRvIGR1bXAgZGlhZ25vc3RpYyBpbmZvIGFib3V0IGFsbCBvdXRzdGFuZGluZyBnZXRGaWxlcy9wdXRGaWxlcyAqLwordm9pZCBmaWxleGZlcl9kdW1wKHN0cnVjdCBzZXFfZmlsZSAqZik7CisKKy8qIENhbGwgdG8gdHJhbnNmZXIgYSBmaWxlIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gKGkuZS4sIGZyb20gdGhlIGVudmlyb25tZW50CisgKiB3aGVyZSB0aGlzIGRyaXZlciBpcyBydW5uaW5nKSBhY3Jvc3MgdGhlIGNvbnRyb2x2bSBjaGFubmVsIHRvIGEgcmVtb3RlCisgKiBlbnZpcm9ubWVudC4gIDEgb3IgbW9yZSBjb250cm9sdm0gcmVzcG9uc2VzIHdpbGwgYmUgc2VudCBhcyBhIHJlc3VsdCwgZWFjaAorICogb2Ygd2hpY2ggd2hvc2UgcGF5bG9hZCBjb250YWlucyBmaWxlIGRhdGEuICBPbmx5IHRoZSBsYXN0IGNvbnRyb2x2bSBtZXNzYWdlCisgKiB3aWxsIGhhdmUgRmxhZ3MucGFydGlhbENvbXBsZXRpb249PTAuCisgKgorICogICBtc2dIZHIgICAgICB0aGUgY29udHJvbHZtIG1lc3NhZ2UgaGVhZGVyIG9mIHRoZSBHRVRGSUxFIHJlcXVlc3Qgd2hpY2gKKyAqICAgICAgICAgICAgICAgd2UganVzdCByZWNlaXZlZAorICogICBmaWxlX3JlcXVlc3RfbnVtYmVyICB0aGlzIGlzIGFsbCBkYXRhIGZyb20gdGhlIEdFVEZJTEUgcmVxdWVzdCB0aGF0CisgKiAgIHVwbGlua19pbmRleCAgICAgICAgIGRlZmluZSB3aGljaCBmaWxlIGlzIHRvIGJlIHRyYW5zZmVycmVkCisgKiAgIGRpc2tfaW5kZXgKKyAqICAgZmlsZV9uYW1lCisgKiAgIGdldF9jb250aWd1b3VzX2NvbnRyb2x2bV9wYXlsb2FkICBmdW5jdGlvbiB0byBjYWxsIHdoZW4gc3BhY2UgaXMgbmVlZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcGF5bG9hZCBhcmVhCisgKiAgIGNvbnRyb2x2bV9yZXNwb25kX3dpdGhfcGF5bG9hZCAgICBmdW5jdGlvbiB0byBjYWxsIHRvIHNlbmQgZWFjaCBjb250cm9sdm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIGNvbnRhaW5pbmcgZmlsZSBkYXRhIGFzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgcmV0dXJucyBGQUxTRSBvbmx5IGlmIHRoZQorICoJCQkJICAgICAgIHBheWxvYWQgYnVmZmVyIHdhcyBmcmVlZCBpbmxpbmUKKyAqICAgZHVtcF9mdW5jICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGR1bXAgY29udGV4dCBkYXRhIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1hbi1yZWFkYWJsZSBmb3JtYXQKKyAqCisgKiAgUmV0dXJucyBUUlVFIGlmZiB0aGUgZmlsZSB0cmFuc2ZlciByZXF1ZXN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQsCisgKiAgb3IgRkFMU0UgdG8gaW5kaWNhdGUgZmFpbHVyZS4KKyAqLworQk9PTAorZmlsZXhmZXJfZ2V0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJIHU2NCBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgdWludCB1cGxpbmtfaW5kZXgsCisJCSB1aW50IGRpc2tfaW5kZXgsCisJCSBjaGFyICpmaWxlX25hbWUsCisJCSBHRVRfQ09OVElHVU9VU19DT05UUk9MVk1fUEFZTE9BRF9GVU5DCisJCSBnZXRfY29udGlndW91c19jb250cm9sdm1fcGF5bG9hZCwKKwkJIENPTlRST0xWTV9SRVNQT05EX1dJVEhfUEFZTE9BRF9GVU5DCisJCSBjb250cm9sdm1fcmVzcG9uZF93aXRoX3BheWxvYWQsCisJCSBUUkFOU01JVEZJTEVfRFVNUF9GVU5DIGR1bXBfZnVuYyk7CisKKy8qIENhbGwgdG8gY3JlYXRlIGEgZmlsZSBpbiB0aGUgbG9jYWwgZmlsZXN5c3RlbSAoaS5lLiwgaW4gdGhlIGVudmlyb25tZW50CisgKiB3aGVyZSB0aGlzIGRyaXZlciBpcyBydW5uaW5nKSBmcm9tIGRhdGEgcmVjZWl2ZWQgYXMgcGF5bG9hZCBpbgorICogY29udHJvbHZtIGNoYW5uZWwgbWVzc2FnZXMgZnJvbSBhIHJlbW90ZSBlbnZpcm9ubWVudC4gIDEgb3IgbW9yZSBjb250cm9sdm0KKyAqIG1lc3NhZ2VzIHdpbGwgYmUgcmVjZWl2ZWQgZm9yIHRoaXMgdHJhbnNmZXIsIGFuZCBvbmx5IHRoZSBsYXN0IHdpbGwgaGF2ZQorICogRmxhZ3MucGFydGlhbENvbXBsZXRpb249PTAuCisgKgorICogICBtc2dIZHIgICAgICB0aGUgY29udHJvbHZtIG1lc3NhZ2UgaGVhZGVyIG9mIHRoZSBQVVRGSUxFIHJlcXVlc3Qgd2hpY2gKKyAqICAgICAgICAgICAgICAgd2UganVzdCByZWNlaXZlZAorICogICBmaWxlX3JlcXVlc3RfbnVtYmVyICB0aGlzIGlzIGFsbCBkYXRhIGZyb20gdGhlIFBVVEZJTEUgcmVxdWVzdCB0aGF0CisgKiAgIHVwbGlua19pbmRleCAgICAgICAgIGRlZmluZSB3aGljaCBmaWxlIGlzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIGxvY2FsCisgKiAgIGRpc2tfaW5kZXggICAgICAgICAgIGZpbGVzeXN0ZW0KKyAqICAgZmlsZV9uYW1lCisgKiAgIGluaXRfY29udGV4dCAgICAgICAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gaW5pdGlhbGl6ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgPHJlcV9jb250ZXh0X2J5dGVzPi1zaXplZCBzdG9yYWdlIGFyZWEgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jOyBub3RlIHRoYXQgaXQgd291bGQgTk9UIGJlIHN1ZmZpY2llbnQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgdGhlIGNhbGxlciB0byBpbml0aWFsaXplIHRoaXMgdXBvbiByZXR1cm4sIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aGUgb3RoZXIgdXNlci1zdXBwbGllZCBjYWxsYmFja3MgbWlnaHQgaGF2ZQorICogICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gY2FsbGVkIGJ5IHRoZW4KKyAqICAgZ2V0X2NvbnRyb2x2bV9maWxlZGF0YSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gb2J0YWluIG1vcmUgZGF0YSBmb3IgdGhlIGZpbGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHdyaXR0ZW47IHJlZmVyIHRvIGdldF9jb250cm9sdm1fZmlsZWRhdGEoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdmlzb3JjaGlwc2V0X21haW4uYyBmb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgcGFyYW1ldGVycworICogICBjb250cm9sdm1fZW5kX3B1dEZpbGUgICAgZnVuY3Rpb24gdG8gY2FsbCB0byBpbmRpY2F0ZSB0aGF0IGNyZWF0aW9uIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgZmlsZSBoYXMgY29tcGxldGVkOyAgc2V0IDxyZXNwb25zZT4gdG8gYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUgdG8gaW5kaWNhdGUgYW4gZXJyb3IKKyAqICAgZHVtcF9mdW5jICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGR1bXAgY29udGV4dCBkYXRhIGluIGh1bWFuLXJlYWRhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQKKyAqCisgKiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBkeW5hbWljYWxseS1hbGxvY2F0ZWQgc3RvcmFnZSBhcmVhIG9mIHNpemUKKyAqICA8cmVxX2NvbnRleHRfYnl0ZXM+IHdoaWNoIHRoZSBjYWxsZXIgY2FuIHVzZSwgb3IgTlVMTCBmb3IgZXJyb3IuICBUaGUKKyAqICBjYWxsZXIgc2hvdWxkIE5FVkVSIGZyZWUgdGhlIHJldHVybmVkIHBvaW50ZXIsIGJ1dCBzaG91bGQgZXhwZWN0IHRvIHJlY2VpdmUKKyAqICBpdCBhcyB0aGUgPGN0eD4gYXJndW1lbnQgd2hlbiBjYWxsYmFjayBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KKyAqLwordm9pZCAqZmlsZXhmZXJfcHV0RmlsZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJICAgICAgIHU2NCBmaWxlX3JlcXVlc3RfbnVtYmVyLAorCQkgICAgICAgdWludCB1cGxpbmtfaW5kZXgsCisJCSAgICAgICB1aW50IGRpc2tfaW5kZXgsCisJCSAgICAgICBjaGFyICpmaWxlX25hbWUsCisJCSAgICAgICBUUkFOU01JVEZJTEVfSU5JVF9DT05URVhUX0ZVTkMgaW5pdF9jb250ZXh0LAorCQkgICAgICAgR0VUX0NPTlRST0xWTV9GSUxFREFUQV9GVU5DIGdldF9jb250cm9sdm1fZmlsZWRhdGEsCisJCSAgICAgICBDT05UUk9MVk1fUkVTUE9ORF9GVU5DIGNvbnRyb2x2bV9lbmRfcHV0RmlsZSwKKwkJICAgICAgIFRSQU5TTUlURklMRV9EVU1QX0ZVTkMgZHVtcF9mdW5jKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9nbG9iYWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlNmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2dsb2JhbHMuaApAQCAtMCwwICsxLDQ1IEBACisvKiBnbG9iYWxzLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKworI2lmbmRlZiBfX1ZJU09SQ0hJUFNFVF9HTE9CQUxTX0hfXworI2RlZmluZSBfX1ZJU09SQ0hJUFNFVF9HTE9CQUxTX0hfXworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldC5oIgorI2luY2x1ZGUgInZpc29yY2hpcHNldF91bW9kZS5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2RlZmluZSBNWURSVk5BTUUgInZpc29yY2hpcHNldCIKKworCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworCitleHRlcm4gaW50IHZpc29yY2hpcHNldF90ZXN0dm5pYzsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50OworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfdGVzdG1zZzsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X21ham9yOworZXh0ZXJuIGludCB2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdDsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQ7CitleHRlcm4gaW50IHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd247CitleHRlcm4gaW50IHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bTsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbDsKK2V4dGVybiBpbnQgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDA4ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qIHBhcnNlci5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAibWVtcmVnaW9uLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2RlZmluZSBNWURSVk5BTUUgInZpc29yY2hpcHNldF9wYXJzZXIiCisjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVNPUl9DSElQU0VUX1BDX3BhcnNlcl9jCisKKy8qIFdlIHdpbGwgcmVmdXNlIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzIG1hbnkgYnl0ZXMgdG8gY29weSBkYXRhIGZyb20KKyAqIGluY29taW5nIHBheWxvYWRzLiAgVGhpcyBzZXJ2ZXMgYXMgYSB0aHJvdHRsaW5nIG1lY2hhbmlzbS4KKyAqLworI2RlZmluZSBNQVhfQ09OVFJPTFZNX1BBWUxPQURfQllURVMgKDEwMjQqMTI4KQorc3RhdGljIHVsb25nIENvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkOworCitzdHJ1Y3QgUEFSU0VSX0NPTlRFWFRfVGFnIHsKKwl1bG9uZyBhbGxvY2J5dGVzOworCXVsb25nIHBhcmFtX2J5dGVzOworCXU4ICpjdXJyOworCXVsb25nIGJ5dGVzX3JlbWFpbmluZzsKKwlCT09MIGJ5dGVfc3RyZWFtOworCWNoYXIgZGF0YVswXTsKK307CisKK3N0YXRpYyBQQVJTRVJfQ09OVEVYVCAqCitwYXJzZXJfaW5pdF9ndXRzKFU2NCBhZGRyLCBVMzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwKKwkJIEJPT0wgaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyLCBCT09MICp0cnlBZ2FpbikKK3sKKwlpbnQgYWxsb2NieXRlcyA9IHNpemVvZihQQVJTRVJfQ09OVEVYVCkgKyBieXRlczsKKwlQQVJTRVJfQ09OVEVYVCAqcmMgPSBOVUxMOworCVBBUlNFUl9DT05URVhUICpjdHggPSBOVUxMOworCU1FTVJFR0lPTiAqcmduID0gTlVMTDsKKwlVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIgKnBoZHIgPSBOVUxMOworCisJaWYgKHRyeUFnYWluKQorCQkqdHJ5QWdhaW4gPSBGQUxTRTsKKwlpZiAoIWhhc1N0YW5kYXJkUGF5bG9hZEhlYWRlcikKKwkJLyogYWxsb2MgYW5kIDAgZXh0cmEgYnl0ZSB0byBlbnN1cmUgcGF5bG9hZCBpcworCQkgKiAnXDAnLXRlcm1pbmF0ZWQKKwkJICovCisJCWFsbG9jYnl0ZXMrKzsKKwlpZiAoKENvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkICsgYnl0ZXMpCisJICAgID4gTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKSB7CisJCUVSUkRSVigiJXMgKCVzOiVkKSAtIHByZXZlbnRlZCBhbGxvY2F0aW9uIG9mICVkIGJ5dGVzIHRvIHByZXZlbnQgZXhjZWVkaW5nIHRocm90dGxpbmcgbWF4ICglZCkiLAorCQkgICAgICAgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXywgYWxsb2NieXRlcywKKwkJICAgICAgIE1BWF9DT05UUk9MVk1fUEFZTE9BRF9CWVRFUyk7CisJCWlmICh0cnlBZ2FpbikKKwkJCSp0cnlBZ2FpbiA9IFRSVUU7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwljdHggPSBremFsbG9jKGFsbG9jYnl0ZXMsIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKGN0eCA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgKCVzOiVkKSAtIGZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyIsCisJCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fLCBhbGxvY2J5dGVzKTsKKwkJaWYgKHRyeUFnYWluKQorCQkJKnRyeUFnYWluID0gVFJVRTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCisJY3R4LT5hbGxvY2J5dGVzID0gYWxsb2NieXRlczsKKwljdHgtPnBhcmFtX2J5dGVzID0gYnl0ZXM7CisJY3R4LT5jdXJyID0gTlVMTDsKKwljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IDA7CisJY3R4LT5ieXRlX3N0cmVhbSA9IEZBTFNFOworCWlmIChpc0xvY2FsKSB7CisJCXZvaWQgKnA7CisJCWlmIChhZGRyID4gdmlydF90b19waHlzKGhpZ2hfbWVtb3J5IC0gMSkpIHsKKwkJCUVSUkRSVigiJXMgLSBiYWQgbG9jYWwgYWRkcmVzcyAoMHglLTE2LjE2THggZm9yICVsdSkiLAorCQkJICAgICAgIF9fZnVuY19fLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHIsICh1bG9uZykgYnl0ZXMpOworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJCXAgPSBfX3ZhKCh1bG9uZykgKGFkZHIpKTsKKwkJbWVtY3B5KGN0eC0+ZGF0YSwgcCwgYnl0ZXMpOworCX0gZWxzZSB7CisJCXJnbiA9IHZpc29yX21lbXJlZ2lvbl9jcmVhdGUoYWRkciwgYnl0ZXMpOworCQlpZiAoIXJnbikgeworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChyZ24sIDAsIGN0eC0+ZGF0YSwgYnl0ZXMpIDwgMCkgeworCQkJcmMgPSBOVUxMOworCQkJZ290byBBd2F5OworCQl9CisJfQorCWlmICghaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyKSB7CisJCWN0eC0+Ynl0ZV9zdHJlYW0gPSBUUlVFOworCQlyYyA9IGN0eDsKKwkJZ290byBBd2F5OworCX0KKwlwaGRyID0gKFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqKSAoY3R4LT5kYXRhKTsKKwlpZiAocGhkci0+VG90YWxMZW5ndGggIT0gYnl0ZXMpIHsKKwkJRVJSRFJWKCIlcyAtIGJhZCB0b3RhbCBsZW5ndGggJWx1IChzaG91bGQgYmUgJWx1KSIsCisJCSAgICAgICBfX2Z1bmNfXywKKwkJICAgICAgICh1bG9uZykgKHBoZHItPlRvdGFsTGVuZ3RoKSwgKHVsb25nKSAoYnl0ZXMpKTsKKwkJcmMgPSBOVUxMOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwaGRyLT5Ub3RhbExlbmd0aCA8IHBoZHItPkhlYWRlckxlbmd0aCkgeworCQlFUlJEUlYoIiVzIC0gdG90YWwgbGVuZ3RoIDwgaGVhZGVyIGxlbmd0aCAoJWx1IDwgJWx1KSIsCisJCSAgICAgICBfX2Z1bmNfXywKKwkJICAgICAgICh1bG9uZykgKHBoZHItPlRvdGFsTGVuZ3RoKSwKKwkJICAgICAgICh1bG9uZykgKHBoZHItPkhlYWRlckxlbmd0aCkpOworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJaWYgKHBoZHItPkhlYWRlckxlbmd0aCA8IHNpemVvZihVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIpKSB7CisJCUVSUkRSVigiJXMgLSBoZWFkZXIgaXMgdG9vIHNtYWxsICglbHUgPCAlbHUpIiwKKwkJICAgICAgIF9fZnVuY19fLAorCQkgICAgICAgKHVsb25nKSAocGhkci0+SGVhZGVyTGVuZ3RoKSwKKwkJICAgICAgICh1bG9uZykgKHNpemVvZihVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIpKSk7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKworCXJjID0gY3R4OworQXdheToKKwlpZiAocmduKSB7CisJCXZpc29yX21lbXJlZ2lvbl9kZXN0cm95KHJnbik7CisJCXJnbiA9IE5VTEw7CisJfQorCWlmIChyYykKKwkJQ29udHJvbHZtX1BheWxvYWRfQnl0ZXNfQnVmZmVyZWQgKz0gY3R4LT5wYXJhbV9ieXRlczsKKwllbHNlIHsKKwkJaWYgKGN0eCkgeworCQkJcGFyc2VyX2RvbmUoY3R4KTsKKwkJCWN0eCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitQQVJTRVJfQ09OVEVYVCAqCitwYXJzZXJfaW5pdChVNjQgYWRkciwgVTMyIGJ5dGVzLCBCT09MIGlzTG9jYWwsIEJPT0wgKnRyeUFnYWluKQoreworCXJldHVybiBwYXJzZXJfaW5pdF9ndXRzKGFkZHIsIGJ5dGVzLCBpc0xvY2FsLCBUUlVFLCB0cnlBZ2Fpbik7Cit9CisKKy8qIENhbGwgdGhpcyBpbnN0ZWFkIG9mIHBhcnNlcl9pbml0KCkgaWYgdGhlIHBheWxvYWQgYXJlYSBjb25zaXN0cyBvZiBqdXN0CisgKiBhIHNlcXVlbmNlIG9mIGJ5dGVzLCByYXRoZXIgdGhhbiBhIFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUgorICogc3RydWN0dXJlcy4gIEFmdGVyd2FyZHMsIHlvdSBjYW4gY2FsbCBwYXJzZXJfc2ltcGxlU3RyaW5nX2dldCgpIG9yCisgKiBwYXJzZXJfYnl0ZVN0cmVhbV9nZXQoKSB0byBvYnRhaW4gdGhlIGRhdGEuCisgKi8KK1BBUlNFUl9DT05URVhUICoKK3BhcnNlcl9pbml0X2J5dGVTdHJlYW0oVTY0IGFkZHIsIFUzMiBieXRlcywgQk9PTCBpc0xvY2FsLCBCT09MICp0cnlBZ2FpbikKK3sKKwlyZXR1cm4gcGFyc2VyX2luaXRfZ3V0cyhhZGRyLCBieXRlcywgaXNMb2NhbCwgRkFMU0UsIHRyeUFnYWluKTsKK30KKworLyogT2J0YWluICdcMCctdGVybWluYXRlZCBjb3B5IG9mIHN0cmluZyBpbiBwYXlsb2FkIGFyZWEuCisgKi8KK2NoYXIgKgorcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCkKK3sKKwlpZiAoIWN0eC0+Ynl0ZV9zdHJlYW0pCisJCXJldHVybiBOVUxMOworCXJldHVybiBjdHgtPmRhdGE7CS8qIG5vdGUgdGhpcyBJUyAnXDAnLXRlcm1pbmF0ZWQsIGJlY2F1c2Ugb2YKKwkJCQkgKiB0aGUgbnVtIG9mIGJ5dGVzIHdlIGFsbG9jK2NsZWFyIGluCisJCQkJICogcGFyc2VyX2luaXRfYnl0ZVN0cmVhbSgpICovCit9CisKKy8qIE9idGFpbiBhIGNvcHkgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcGF5bG9hZCBhcmVhLgorICovCit2b2lkICoKK3BhcnNlcl9ieXRlU3RyZWFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCB1bG9uZyAqbmJ5dGVzKQoreworCWlmICghY3R4LT5ieXRlX3N0cmVhbSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG5ieXRlcykKKwkJKm5ieXRlcyA9IGN0eC0+cGFyYW1fYnl0ZXM7CisJcmV0dXJuICh2b2lkICopIGN0eC0+ZGF0YTsKK30KKworR1VJRAorcGFyc2VyX2lkX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KQoreworCVVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqcGhkciA9IE5VTEw7CisKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gbm8gY29udGV4dCIsCisJCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIEd1aWQwOworCX0KKwlwaGRyID0gKFVMVFJBX0NPTlRST0xWTV9QQVJBTUVURVJTX0hFQURFUiAqKSAoY3R4LT5kYXRhKTsKKwlyZXR1cm4gcGhkci0+SWQ7Cit9CisKK3ZvaWQKK3BhcnNlcl9wYXJhbV9zdGFydChQQVJTRVJfQ09OVEVYVCAqY3R4LCBQQVJTRVJfV0hJQ0hfU1RSSU5HIHdoaWNoX3N0cmluZykKK3sKKwlVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIgKnBoZHIgPSBOVUxMOworCisJaWYgKGN0eCA9PSBOVUxMKSB7CisJCUVSUkRSVigiJXMgKCVzOiVkKSAtIG5vIGNvbnRleHQiLAorCQkgICAgICAgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCWdvdG8gQXdheTsKKwl9CisJcGhkciA9IChVTFRSQV9DT05UUk9MVk1fUEFSQU1FVEVSU19IRUFERVIgKikgKGN0eC0+ZGF0YSk7CisJc3dpdGNoICh3aGljaF9zdHJpbmcpIHsKKwljYXNlIFBBUlNFUlNUUklOR19JTklUSUFUT1I6CisJCWN0eC0+Y3VyciA9IGN0eC0+ZGF0YSArIHBoZHItPkluaXRpYXRvck9mZnNldDsKKwkJY3R4LT5ieXRlc19yZW1haW5pbmcgPSBwaGRyLT5Jbml0aWF0b3JMZW5ndGg7CisJCWJyZWFrOworCWNhc2UgUEFSU0VSU1RSSU5HX1RBUkdFVDoKKwkJY3R4LT5jdXJyID0gY3R4LT5kYXRhICsgcGhkci0+VGFyZ2V0T2Zmc2V0OworCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPlRhcmdldExlbmd0aDsKKwkJYnJlYWs7CisJY2FzZSBQQVJTRVJTVFJJTkdfQ09OTkVDVElPTjoKKwkJY3R4LT5jdXJyID0gY3R4LT5kYXRhICsgcGhkci0+Q29ubmVjdGlvbk9mZnNldDsKKwkJY3R4LT5ieXRlc19yZW1haW5pbmcgPSBwaGRyLT5Db25uZWN0aW9uTGVuZ3RoOworCQlicmVhazsKKwljYXNlIFBBUlNFUlNUUklOR19OQU1FOgorCQljdHgtPmN1cnIgPSBjdHgtPmRhdGEgKyBwaGRyLT5OYW1lT2Zmc2V0OworCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPk5hbWVMZW5ndGg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUVSUkRSVigiJXMgLSBiYWQgd2hpY2hfc3RyaW5nICVkIiwgX19mdW5jX18sIHdoaWNoX3N0cmluZyk7CisJCWJyZWFrOworCX0KKworQXdheToKKwlyZXR1cm47Cit9CisKK3ZvaWQKK3BhcnNlcl9kb25lKFBBUlNFUl9DT05URVhUICpjdHgpCit7CisJaWYgKCFjdHgpCisJCXJldHVybjsKKwlDb250cm9sdm1fUGF5bG9hZF9CeXRlc19CdWZmZXJlZCAtPSBjdHgtPnBhcmFtX2J5dGVzOworCWtmcmVlKGN0eCk7Cit9CisKKy8qKiBSZXR1cm4gbGVuZ3RoIG9mIHN0cmluZyBub3QgY291bnRpbmcgdHJhaWxpbmcgc3BhY2VzLiAqLworc3RhdGljIGludAorc3RyaW5nX2xlbmd0aF9ub190cmFpbChjaGFyICpzLCBpbnQgbGVuKQoreworCWludCBpID0gbGVuIC0gMTsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWlmICghaXNzcGFjZShzW2ldKSkKKwkJCXJldHVybiBpICsgMTsKKwkJaS0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqIEdyYWIgdGhlIG5leHQgbmFtZSBhbmQgdmFsdWUgb3V0IG9mIHRoZSBwYXJhbWV0ZXIgYnVmZmVyLgorICogIFRoZSBlbnRpcmUgcGFyYW1ldGVyIGJ1ZmZlciBsb29rcyBsaWtlIHRoaXM6CisgKiAgICAgIDxuYW1lPj08dmFsdWU+XDAKKyAqICAgICAgPG5hbWU+PTx2YWx1ZT5cMAorICogICAgICAuLi4KKyAqICAgICAgXDAKKyAqICBJZiBzdWNjZXNzZnVsLCB0aGUgbmV4dCA8bmFtZT4gdmFsdWUgaXMgcmV0dXJuZWQgd2l0aGluIHRoZSBzdXBwbGllZAorICogIDxuYW0+IGJ1ZmZlciAodGhlIHZhbHVlIGlzIGFsd2F5cyB1cHBlci1jYXNlZCksIGFuZCB0aGUgY29ycmVzcG9uZGluZworICogIDx2YWx1ZT4gaXMgcmV0dXJuZWQgd2l0aGluIGEga21hbGxvYygpZWQgYnVmZmVyLCB3aG9zZSBwb2ludGVyIGlzCisgKiAgcHJvdmlkZWQgYXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uLgorICogIChUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpcyBzdHJsZW4oPHZhbHVlPikrMS4pCisgKgorICogIE5VTEwgaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSwgd2hpY2ggY2FuIG9jY3VyIGZvciBzZXZlcmFsIHJlYXNvbnM6CisgKiAgLSBhbGwgPG5hbWU+PTx2YWx1ZT4gcGFpcnMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkCisgKiAgLSBiYWQgcGFyYW1ldGVyCisgKiAgLSBwYXJhbWV0ZXIgYnVmZmVyIGVuZHMgcHJlbWF0dXJlbHkgKGNvdWxkbid0IGZpbmQgYW4gJz0nIG9yICdcMCcgd2l0aGluCisgKiAgICB0aGUgY29uZmluZXMgb2YgdGhlIHBhcmFtZXRlciBidWZmZXIpCisgKiAgLSB0aGUgPG5hbT4gYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgPG5hbWU+IG9mIHRoZSBuZXh0CisgKiAgICBwYXJhbWV0ZXIKKyAqLwordm9pZCAqCitwYXJzZXJfcGFyYW1fZ2V0KFBBUlNFUl9DT05URVhUICpjdHgsIGNoYXIgKm5hbSwgaW50IG5hbWVzaXplKQoreworCXU4ICpwc2NhbiwgKnBuYW0gPSBuYW07CisJdWxvbmcgbnNjYW47CisJaW50IHZhbHVlX2xlbmd0aCA9IC0xLCBvcmlnX3ZhbHVlX2xlbmd0aCA9IC0xOworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwlpbnQgaTsKKwlpbnQgY2xvc2luZ19xdW90ZSA9IDA7CisKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJcHNjYW4gPSBjdHgtPmN1cnI7CisJbnNjYW4gPSBjdHgtPmJ5dGVzX3JlbWFpbmluZzsKKwlpZiAobnNjYW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpwc2NhbiA9PSAnXDAnKQorCQkvKiAgVGhpcyBpcyB0aGUgbm9ybWFsIHJldHVybiBwb2ludCBhZnRlciB5b3UgaGF2ZSBwcm9jZXNzZWQKKwkJICogIGFsbCBvZiB0aGUgPG5hbWU+PTx2YWx1ZT4gcGFpcnMgaW4gYSBzeW50YWN0aWNhbGx5LXZhbGlkCisJCSAqICBwYXJhbWV0ZXIgYnVmZmVyLgorCQkgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBza2lwIHdoaXRlc3BhY2UgKi8KKwl3aGlsZSAoaXNzcGFjZSgqcHNjYW4pKSB7CisJCXBzY2FuKys7CisJCW5zY2FuLS07CisJCWlmIChuc2NhbiA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJd2hpbGUgKCpwc2NhbiAhPSAnOicpIHsKKwkJaWYgKG5hbWVzaXplIDw9IDApIHsKKwkJCUVSUkRSVigiJXMgLSBuYW1lIHRvbyBiaWciLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkqcG5hbSA9IHRvdXBwZXIoKnBzY2FuKTsKKwkJcG5hbSsrOworCQluYW1lc2l6ZS0tOworCQlwc2NhbisrOworCQluc2Nhbi0tOworCQlpZiAobnNjYW4gPT0gMCkgeworCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgbmFtZSIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKG5hbWVzaXplIDw9IDApIHsKKwkJRVJSRFJWKCIlcyAtIG5hbWUgdG9vIGJpZyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpwbmFtID0gJ1wwJzsKKwluYW1bc3RyaW5nX2xlbmd0aF9ub190cmFpbChuYW0sIHN0cmxlbihuYW0pKV0gPSAnXDAnOworCisJLyogcG9pbnQgdG8gY2hhciBpbW1lZGlhdGVseSBhZnRlciAiOiIgaW4gIjxuYW1lPjo8dmFsdWU+IiAqLworCXBzY2FuKys7CisJbnNjYW4tLTsKKwkvKiBza2lwIHdoaXRlc3BhY2UgKi8KKwl3aGlsZSAoaXNzcGFjZSgqcHNjYW4pKSB7CisJCXBzY2FuKys7CisJCW5zY2FuLS07CisJCWlmIChuc2NhbiA9PSAwKSB7CisJCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgbG9va2luZyBmb3IgdmFsdWUiLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWlmIChuc2NhbiA9PSAwKSB7CisJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBsb29raW5nIGZvciB2YWx1ZSIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKnBzY2FuID09ICdcJycgfHwgKnBzY2FuID09ICciJykgeworCQljbG9zaW5nX3F1b3RlID0gKnBzY2FuOworCQlwc2NhbisrOworCQluc2Nhbi0tOworCQlpZiAobnNjYW4gPT0gMCkgeworCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGFmdGVyICVjIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2xvc2luZ19xdW90ZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qIGxvb2sgZm9yIGEgc2VwYXJhdG9yIGNoYXJhY3RlciwgdGVybWluYXRvciBjaGFyYWN0ZXIsIG9yCisJICogZW5kIG9mIGRhdGEKKwkgKi8KKwlmb3IgKGkgPSAwLCB2YWx1ZV9sZW5ndGggPSAtMTsgaSA8IG5zY2FuOyBpKyspIHsKKwkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKKwkJCWlmIChwc2NhbltpXSA9PSAnXDAnKSB7CisJCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgcXVvdGVkIHZhbHVlIiwgX19mdW5jX18pOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKHBzY2FuW2ldID09IGNsb3NpbmdfcXVvdGUpIHsKKwkJCQl2YWx1ZV9sZW5ndGggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJICAgIGlmIChwc2NhbltpXSA9PSAnLCcgfHwgcHNjYW5baV0gPT0gJzsnCisJCQl8fCBwc2NhbltpXSA9PSAnXDAnKSB7CisJCQl2YWx1ZV9sZW5ndGggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHZhbHVlX2xlbmd0aCA8IDApIHsKKwkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKKwkJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBwYXJzaW5nIHF1b3RlZCB2YWx1ZSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXZhbHVlX2xlbmd0aCA9IG5zY2FuOworCX0KKwlvcmlnX3ZhbHVlX2xlbmd0aCA9IHZhbHVlX2xlbmd0aDsKKwlpZiAoY2xvc2luZ19xdW90ZSA9PSAwKQorCQl2YWx1ZV9sZW5ndGggPSBzdHJpbmdfbGVuZ3RoX25vX3RyYWlsKHBzY2FuLCBvcmlnX3ZhbHVlX2xlbmd0aCk7CisJdmFsdWUgPSBrbWFsbG9jKHZhbHVlX2xlbmd0aCArIDEsIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7CisJaWYgKHZhbHVlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbWNweSh2YWx1ZSwgcHNjYW4sIHZhbHVlX2xlbmd0aCk7CisJKCh1OCAqKSAodmFsdWUpKVt2YWx1ZV9sZW5ndGhdID0gJ1wwJzsKKworCXBzY2FuICs9IG9yaWdfdmFsdWVfbGVuZ3RoOworCW5zY2FuIC09IG9yaWdfdmFsdWVfbGVuZ3RoOworCisJLyogc2tpcCBwYXN0IHNlcGFyYXRvciBvciBjbG9zaW5nIHF1b3RlICovCisJaWYgKG5zY2FuID4gMCkgeworCQlpZiAoKnBzY2FuICE9ICdcMCcpIHsKKwkJCXBzY2FuKys7CisJCQluc2Nhbi0tOworCQl9CisJfQorCisJaWYgKGNsb3NpbmdfcXVvdGUgJiYgKG5zY2FuID4gMCkpIHsKKwkJLyogd2Ugc3RpbGwgbmVlZCB0byBza2lwIGFyb3VuZCB0aGUgcmVhbCBzZXBhcmF0b3IgaWYgcHJlc2VudCAqLworCQkvKiBmaXJzdCwgc2tpcCB3aGl0ZXNwYWNlICovCisJCXdoaWxlIChpc3NwYWNlKCpwc2NhbikpIHsKKwkJCXBzY2FuKys7CisJCQluc2Nhbi0tOworCQkJaWYgKG5zY2FuID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKG5zY2FuID4gMCkgeworCQkJaWYgKCpwc2NhbiA9PSAnLCcgfHwgKnBzY2FuID09ICc7JykgeworCQkJCXBzY2FuKys7CisJCQkJbnNjYW4tLTsKKwkJCX0gZWxzZSBpZiAoKnBzY2FuICE9ICdcMCcpIHsKKwkJCQlFUlJEUlYoIiVzIC0gbWlzc2luZyBzZXBhcmF0b3IgYWZ0ZXIgcXVvdGVkIHN0cmluZyIsIF9fZnVuY19fKTsKKwkJCQlrZnJlZSh2YWx1ZSk7CisJCQkJdmFsdWUgPSBOVUxMOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJfQorCWN0eC0+Y3VyciA9IHBzY2FuOworCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gbnNjYW47CisJcmV0dXJuIHZhbHVlOworfQorCit2b2lkICoKK3BhcnNlcl9zdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpCit7CisJdTggKnBzY2FuOworCXVsb25nIG5zY2FuOworCWludCB2YWx1ZV9sZW5ndGggPSAtMTsKKwl2b2lkICp2YWx1ZSA9IE5VTEw7CisJaW50IGk7CisKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJcHNjYW4gPSBjdHgtPmN1cnI7CisJbnNjYW4gPSBjdHgtPmJ5dGVzX3JlbWFpbmluZzsKKwlpZiAobnNjYW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFwc2NhbikKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMCwgdmFsdWVfbGVuZ3RoID0gLTE7IGkgPCBuc2NhbjsgaSsrKQorCQlpZiAocHNjYW5baV0gPT0gJ1wwJykgeworCQkJdmFsdWVfbGVuZ3RoID0gaTsKKwkJCWJyZWFrOworCQl9CisJaWYgKHZhbHVlX2xlbmd0aCA8IDApCS8qICdcMCcgd2FzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoICovCisJCXZhbHVlX2xlbmd0aCA9IG5zY2FuOworCXZhbHVlID0ga21hbGxvYyh2YWx1ZV9sZW5ndGggKyAxLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWlmICh2YWx1ZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAodmFsdWVfbGVuZ3RoID4gMCkKKwkJbWVtY3B5KHZhbHVlLCBwc2NhbiwgdmFsdWVfbGVuZ3RoKTsKKwkoKHU4ICopICh2YWx1ZSkpW3ZhbHVlX2xlbmd0aF0gPSAnXDAnOworCXJldHVybiB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjYzUwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIHBhcnNlci5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUEFSU0VSX0hfXworI2RlZmluZSBfX1BBUlNFUl9IX18KKworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgImNoYW5uZWwuaCIKKwordHlwZWRlZiBlbnVtIHsKKwlQQVJTRVJTVFJJTkdfSU5JVElBVE9SLAorCVBBUlNFUlNUUklOR19UQVJHRVQsCisJUEFSU0VSU1RSSU5HX0NPTk5FQ1RJT04sCisJUEFSU0VSU1RSSU5HX05BTUUsCit9IFBBUlNFUl9XSElDSF9TVFJJTkc7CisKK3R5cGVkZWYgc3RydWN0IFBBUlNFUl9DT05URVhUX1RhZyBQQVJTRVJfQ09OVEVYVDsKKworUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9pbml0KFU2NCBhZGRyLCBVMzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwgQk9PTCAqdHJ5QWdhaW4pOworUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9pbml0X2J5dGVTdHJlYW0oVTY0IGFkZHIsIFUzMiBieXRlcywgQk9PTCBpc0xvY2FsLAorCQkJCSAgICAgICBCT09MICp0cnlBZ2Fpbik7Cit2b2lkIHBhcnNlcl9wYXJhbV9zdGFydChQQVJTRVJfQ09OVEVYVCAqY3R4LCBQQVJTRVJfV0hJQ0hfU1RSSU5HIHdoaWNoX3N0cmluZyk7Cit2b2lkICpwYXJzZXJfcGFyYW1fZ2V0KFBBUlNFUl9DT05URVhUICpjdHgsIGNoYXIgKm5hbSwgaW50IG5hbWVzaXplKTsKK3ZvaWQgKnBhcnNlcl9zdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOworR1VJRCBwYXJzZXJfaWRfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOworY2hhciAqcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCk7Cit2b2lkICpwYXJzZXJfYnl0ZVN0cmVhbV9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgdWxvbmcgKm5ieXRlcyk7Cit2b2lkIHBhcnNlcl9kb25lKFBBUlNFUl9DT05URVhUICpjdHgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Rlc3RpbmcuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Rlc3RpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRmNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdGVzdGluZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHRlc3RpbmcuaAorICoKKyAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1ZJU09SQ0hJUFNFVF9URVNUSU5HX0hfXworI2RlZmluZSBfX1ZJU09SQ0hJUFNFVF9URVNUSU5HX0hfXworCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9URVNUX1BST0MKKyNpbmNsdWRlICJnbG9iYWxzLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorCit2b2lkIHRlc3RfcHJvZHVjZV90ZXN0X21lc3NhZ2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgaW50IGlzTG9jYWxUZXN0QWRkcik7CitCT09MIHRlc3RfY29uc3VtZV90ZXN0X21lc3NhZ2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZyk7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfdm5pY19jbGllbnRfYWRkKHZvaWQgKnApOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX3ZuaWNfY2xpZW50X2FkZF9waHlzKEhPU1RBRERSRVNTIGFkZHIpOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX3ByZWFtYmxlX21lc3NhZ2VzKHZvaWQpOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldmljZV9hdHRhY2godWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV9kZXZpY2VfYWRkKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgR1VJRCBkYXRhVHlwZUd1aWQsCisJCQkJIHZvaWQgKnBDaGFubmVsKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV9hZGRfYnVzKHVsb25nIGJ1c05vLCB1bG9uZyBtYXhEZXZpY2VzLAorCQkJICAgICAgR1VJRCBpZCwgdTggKm5hbWUsIEJPT0wgaXNTZXJ2ZXIpOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldmljZV9kZXN0cm95KHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObyk7Cit2b2lkIHRlc3RfbWFudWZhY3R1cmVfYnVzX2Rlc3Ryb3kodWxvbmcgYnVzTm8pOwordm9pZCB0ZXN0X21hbnVmYWN0dXJlX2RldGFjaF9leHRlcm5hbFBvcnQodWxvbmcgc3dpdGNoTm8sIHVsb25nIGV4dGVybmFsUG9ydE5vKTsKK3ZvaWQgdGVzdF9tYW51ZmFjdHVyZV9kZXRhY2hfaW50ZXJuYWxQb3J0KHVsb25nIHN3aXRjaE5vLCB1bG9uZyBpbnRlcm5hbFBvcnRObyk7Cit2b2lkIHRlc3RfY2xlYW51cCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmYyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXQuaApAQCAtMCwwICsxLDMwNyBAQAorLyogdmlzb3JjaGlwc2V0LmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19WSVNPUkNISVBTRVRfSF9fCisjZGVmaW5lIF9fVklTT1JDSElQU0VUX0hfXworCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInByb2NvYmplY3R0cmVlLmgiCisjaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKKyNpbmNsdWRlICJ2YnVzaGVscGVyLmgiCisKKy8qKiBEZXNjcmliZXMgdGhlIHN0YXRlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHdoaWNoIGNvbnRyb2x2bSBtZXNzYWdlcyBoYXZlCisgKiAgYmVlbiByZWNlaXZlZCBmb3IgYSBidXMgb3IgZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIGNyZWF0ZWQ6MTsKKwlVMzIgYXR0YWNoZWQ6MTsKKwlVMzIgY29uZmlndXJlZDoxOworCVUzMiBydW5uaW5nOjE7CisJLyogQWRkIG5ldyBmaWVsZHMgYWJvdmUuICovCisJLyogUmVtYWluaW5nIGJpdHMgaW4gdGhpcyAzMi1iaXQgd29yZCBhcmUgdW51c2VkLiAqLworfSBWSVNPUkNISVBTRVRfU1RBVEU7CisKK3R5cGVkZWYgZW51bSB7CisJLyoqIGFkZHJlc3MgaXMgZ3Vlc3QgcGh5c2ljYWwsIGJ1dCBvdXRzaWRlIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkKKwkgKiAgcmVnaW9uIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUyAodGhpcyBpcyB0aGUgbm9ybWFsCisJICogIGFkZHJlc3MgdHlwZSBmb3IgU3VwZXJ2aXNvciBjaGFubmVscykKKwkgKi8KKwlBRERSVFlQRV9sb2NhbFBoeXNpY2FsLAorCisJLyoqIGFkZHJlc3MgaXMgZ3Vlc3QgcGh5c2ljYWwsIGFuZCB3aXRoSU4gdGhlIGNvbmZpbmVzIG9mIHRoZQorCSAqICBwaHlzaWNhbCBtZW1vcnkgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUy4KKwkgKi8KKwlBRERSVFlQRV9sb2NhbFRlc3QsCit9IFZJU09SQ0hJUFNFVF9BRERSRVNTVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKwlDUkFTSF9kZXYsCisJQ1JBU0hfYnVzLAorfSBDUkFTSF9PQkpfVFlQRTsKKworLyoqIEF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBTdXBlcnZpc29yIGNoYW5uZWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlWSVNPUkNISVBTRVRfQUREUkVTU1RZUEUgYWRkclR5cGU7CisJSE9TVEFERFJFU1MgY2hhbm5lbEFkZHI7CisJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsKKwlVNjQgbkNoYW5uZWxCeXRlczsKKwlHVUlEIGNoYW5uZWxUeXBlR3VpZDsKKwlHVUlEIGNoYW5uZWxJbnN0R3VpZDsKKworfSBWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPOworCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgZGV2aWNlLgorICogIEFueSB2aXNvcmNoaXBzZXQgY2xpZW50IGNhbiBxdWVyeSB0aGVzZSBhdHRyaWJ1dGVzIHVzaW5nCisgKiAgdmlzb3JjaGlwc2V0X2dldF9jbGllbnRfZGV2aWNlX2luZm8oKSBvcgorICogIHZpc29yY2hpcHNldF9nZXRfc2VydmVyX2RldmljZV9pbmZvKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCVUzMiBidXNObzsKKwlVMzIgZGV2Tm87CisJR1VJRCBkZXZJbnN0R3VpZDsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTyBjaGFuSW5mbzsKKwlVMzIgUmVzZXJ2ZWQxOwkJLyogQ09OVFJPTFZNX0lEICovCisJVTY0IFJlc2VydmVkMjsKKwlVMzIgc3dpdGNoTm87CQkvKiB3aGVuIGRldlN0YXRlLmF0dGFjaGVkPT0xICovCisJVTMyIGludGVybmFsUG9ydE5vOwkvKiB3aGVuIGRldlN0YXRlLmF0dGFjaGVkPT0xICovCisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CS8qIENPTlRST0xWTV9NRVNTQUdFICovCisJLyoqIEZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciAqLworCXZvaWQgKmJ1c19kcml2ZXJfY29udGV4dDsKKworfSBWSVNPUkNISVBTRVRfREVWSUNFX0lORk87CisKK3N0YXRpYyBpbmxpbmUgVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICoKK2ZpbmRkZXZpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCit7CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCBsaXN0LCBlbnRyeSkgeworCQlpZiAocC0+YnVzTm8gPT0gYnVzTm8gJiYgcC0+ZGV2Tm8gPT0gZGV2Tm8pCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxidXNkZXZpY2VzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIFUzMiBidXNObykKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CisJCWlmIChwLT5idXNObyA9PSBidXNObykgeworCQkJbGlzdF9kZWwoJnAtPmVudHJ5KTsKKwkJCWtmcmVlKHApOworCQl9CisJfQorfQorCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgYnVzLgorICogIChGb3IgYSBzZXJ2aWNlIHBhcnRpdGlvbiBhY3RpbmcgYXMgdGhlIHNlcnZlciBmb3IgYnVzZXMvZGV2aWNlcywgdGhlcmUKKyAqICBpcyBhIDEtdG8tMSByZWxhdGlvbnNoaXAgYmV0d2VlbiBidXNzZXMgYW5kIGd1ZXN0IHBhcnRpdGlvbnMuKQorICogIEFueSB2aXNvcmNoaXBzZXQgY2xpZW50IGNhbiBxdWVyeSB0aGVzZSBhdHRyaWJ1dGVzIHVzaW5nCisgKiAgdmlzb3JjaGlwc2V0X2dldF9jbGllbnRfYnVzX2luZm8oKSBvciB2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCVUzMiBidXNObzsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTyBjaGFuSW5mbzsKKwlHVUlEIHBhcnRpdGlvbkd1aWQ7CisJVTY0IHBhcnRpdGlvbkhhbmRsZTsKKwlVOCAqbmFtZTsJCS8qIFVURjggKi8KKwlVOCAqZGVzY3JpcHRpb247CS8qIFVURjggKi8KKwlVNjQgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7CisJTVlQUk9DT0JKRUNUICpwcm9jT2JqZWN0OworCXN0cnVjdCB7CisJCVUzMiBzZXJ2ZXI6MTsKKwkJLyogQWRkIG5ldyBmaWVsZHMgYWJvdmUuICovCisJCS8qIFJlbWFpbmluZyBiaXRzIGluIHRoaXMgMzItYml0IHdvcmQgYXJlIHVudXNlZC4gKi8KKwl9IGZsYWdzOworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOwkvKiBDT05UUk9MVk0gTXNnSGRyICovCisJLyoqIEZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciAqLworCXZvaWQgKmJ1c19kcml2ZXJfY29udGV4dDsKKwlVNjQgZGV2Tm87CisKK30gVklTT1JDSElQU0VUX0JVU19JTkZPOworCitzdGF0aWMgaW5saW5lIFZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqCitmaW5kYnVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIFUzMiBidXNObykKK3sKKwlWSVNPUkNISVBTRVRfQlVTX0lORk8gKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CisJCWlmIChwLT5idXNObyA9PSBidXNObykKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqIEF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBTdXBlcnZpc29yIHN3aXRjaC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVUzMiBzd2l0Y2hObzsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJR1VJRCBzd2l0Y2hUeXBlR3VpZDsKKwlVOCAqYXV0aFNlcnZpY2UxOworCVU4ICphdXRoU2VydmljZTI7CisJVTggKmF1dGhTZXJ2aWNlMzsKKwlVOCAqc2VjdXJpdHlDb250ZXh0OworCVU2NCBSZXNlcnZlZDsKKwlVMzIgUmVzZXJ2ZWQyOwkJLyogQ09OVFJPTFZNX0lEICovCisJc3RydWN0IGRldmljZSBkZXY7CisJQk9PTCBkZXZfZXhpc3RzOworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOworCit9IFZJU09SQ0hJUFNFVF9TV0lUQ0hfSU5GTzsKKworLyoqIEF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBTdXBlcnZpc29yIGV4dGVybmFsIHBvcnQsIHdoaWNoIGlzIGNvbm5lY3RlZAorICogIHRvIGEgc3BlY2lmaWMgc3dpdGNoLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIHN3aXRjaE5vOworCVUzMiBleHRlcm5hbFBvcnRObzsKKwlWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CisJR1VJRCBuZXR3b3JrWm9uZUd1aWQ7CisJaW50IHBkUG9ydDsKKwlVOCAqaXA7CisJVTggKmlwTmV0bWFzazsKKwlVOCAqaXBCcm9hZGNhc3Q7CisJVTggKmlwTmV0d29yazsKKwlVOCAqaXBHYXRld2F5OworCVU4ICppcEROUzsKKwlVNjQgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7CQkvKiBDT05UUk9MVk1fSUQgKi8KKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlCT09MIGRldl9leGlzdHM7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CisKK30gVklTT1JDSElQU0VUX0VYVEVSTkFMUE9SVF9JTkZPOworCisvKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgaW50ZXJuYWwgcG9ydCwgd2hpY2ggaXMgaG93IGEKKyAqICBkZXZpY2UgY29ubmVjdHMgdG8gYSBwYXJ0aWN1bGFyIHN3aXRjaC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVUzMiBzd2l0Y2hObzsKKwlVMzIgaW50ZXJuYWxQb3J0Tm87CisJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOworCVUzMiBidXNObzsJCS8qIHZhbGlkIG9ubHkgd2hlbiBzdGF0ZS5hdHRhY2hlZCA9PSAxICovCisJVTMyIGRldk5vOwkJLyogdmFsaWQgb25seSB3aGVuIHN0YXRlLmF0dGFjaGVkID09IDEgKi8KKwlVNjQgUmVzZXJ2ZWQxOworCVUzMiBSZXNlcnZlZDI7CQkvKiBDT05UUk9MVk1fSUQgKi8KKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgcGVuZGluZ01zZ0hkcjsKKwlNWVBST0NPQkpFQ1QgKnByb2NPYmplY3Q7CisKK30gVklTT1JDSElQU0VUX0lOVEVSTkFMUE9SVF9JTkZPOworCisvKiAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHZpc29yY2hpcHNldCB3aGVuIGNlcnRhaW4KKyAqICBldmVudHMgaGFwcGVuLiAgKFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgb3V0c2lkZSBvZgorICogIHZpc29yY2hpcHNldC4pCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICgqYnVzX2NyZWF0ZSkodWxvbmcgYnVzTm8pOworCXZvaWQgKCpidXNfZGVzdHJveSkodWxvbmcgYnVzTm8pOworCXZvaWQgKCpkZXZpY2VfY3JlYXRlKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOworCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKKwl2b2lkICgqZGV2aWNlX3BhdXNlKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOworCXZvaWQgKCpkZXZpY2VfcmVzdW1lKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOworCWludCAoKmdldF9jaGFubmVsX2luZm8pKEdVSUQgdHlwZUd1aWQsIHVsb25nICptaW5TaXplLAorCQkJCSB1bG9uZyAqbWF4U2l6ZSk7Cit9IFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTOworCisvKiAgVGhlc2UgZnVuY3Rpb25zIGxpdmUgaW5zaWRlIHZpc29yY2hpcHNldCwgYW5kIHdpbGwgYmUgY2FsbGVkIHRvIGluZGljYXRlCisgKiAgcmVzcG9uc2VzIHRvIHNwZWNpZmljIGV2ZW50cyAoYnkgY29kZSBvdXRzaWRlIG9mIHZpc29yY2hpcHNldCkuCisgKiAgRm9yIG5vdywgdGhlIHZhbHVlIGZvciBlYWNoIHJlc3BvbnNlIGlzIHNpbXBseSBlaXRoZXI6CisgKiAgICAgICAwID0gaXQgd29ya2VkCisgKiAgICAgIC0xID0gaXQgZmFpbGVkCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICgqYnVzX2NyZWF0ZSkodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7CisJdm9pZCAoKmJ1c19kZXN0cm95KSh1bG9uZyBidXNObywgaW50IHJlc3BvbnNlKTsKKwl2b2lkICgqZGV2aWNlX2NyZWF0ZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworCXZvaWQgKCpkZXZpY2VfcGF1c2UpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKKwl2b2lkICgqZGV2aWNlX3Jlc3VtZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworfSBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlM7CisKKy8qKiBSZWdpc3RlciBmdW5jdGlvbnMgKGluIHRoZSBidXMgZHJpdmVyKSB0byBnZXQgY2FsbGVkIGJ5IHZpc29yY2hpcHNldAorICogIHdoZW5ldmVyIGEgYnVzIG9yIGRldmljZSBhcHBlYXJzIGZvciB3aGljaCB0aGlzIHNlcnZpY2UgcGFydGl0aW9uIGlzCisgKiAgdG8gYmUgdGhlIHNlcnZlciBmb3IuICB2aXNvcmNoaXBzZXQgd2lsbCBmaWxsIGluIDxyZXNwb25kZXJzPiwgdG8KKyAqICBpbmRpY2F0ZSBmdW5jdGlvbnMgdGhlIGJ1cyBkcml2ZXIgc2hvdWxkIGNhbGwgdG8gaW5kaWNhdGUgbWVzc2FnZQorICogIHJlc3BvbnNlcy4KKyAqLwordm9pZAordmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKKwkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pOworCisvKiogUmVnaXN0ZXIgZnVuY3Rpb25zIChpbiB0aGUgYnVzIGRyaXZlcikgdG8gZ2V0IGNhbGxlZCBieSB2aXNvcmNoaXBzZXQKKyAqICB3aGVuZXZlciBhIGJ1cyBvciBkZXZpY2UgYXBwZWFycyBmb3Igd2hpY2ggdGhpcyBzZXJ2aWNlIHBhcnRpdGlvbiBpcworICogIHRvIGJlIHRoZSBjbGllbnQgZm9yLiAgdmlzb3JjaGlwc2V0IHdpbGwgZmlsbCBpbiA8cmVzcG9uZGVycz4sIHRvCisgKiAgaW5kaWNhdGUgZnVuY3Rpb25zIHRoZSBidXMgZHJpdmVyIHNob3VsZCBjYWxsIHRvIGluZGljYXRlIG1lc3NhZ2UKKyAqICByZXNwb25zZXMuCisgKi8KK3ZvaWQKK3Zpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXZfc2VydmVyKFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTICpub3RpZmllcnMsCisJCQkJICAgIFZJU09SQ0hJUFNFVF9CVVNERVZfUkVTUE9OREVSUyAqcmVzcG9uZGVycywKKwkJCQkgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpkcml2ZXJJbmZvKTsKKwordHlwZWRlZiB2b2lkICgqU1BBUlJFUE9SVEVWRU5UX0NPTVBMRVRFX0ZVTkMpIChDT05UUk9MVk1fTUVTU0FHRSAqbXNnLAorCQkJCQkgICAgICAgaW50IHN0YXR1cyk7CisKK3ZvaWQgdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7CisKK0JPT0wgdmlzb3JjaGlwc2V0X2dldF9idXNfaW5mbyh1bG9uZyBidXNObywgVklTT1JDSElQU0VUX0JVU19JTkZPICpidXNJbmZvKTsKK0JPT0wgdmlzb3JjaGlwc2V0X2dldF9kZXZpY2VfaW5mbyh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sCisJCQkJICBWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKmRldkluZm8pOworQk9PTCB2aXNvcmNoaXBzZXRfZ2V0X3N3aXRjaF9pbmZvKHVsb25nIHN3aXRjaE5vLAorCQkJCSAgVklTT1JDSElQU0VUX1NXSVRDSF9JTkZPICpzd2l0Y2hJbmZvKTsKK0JPT0wgdmlzb3JjaGlwc2V0X2dldF9leHRlcm5hbHBvcnRfaW5mbyh1bG9uZyBzd2l0Y2hObywgdWxvbmcgZXh0ZXJuYWxQb3J0Tm8sCisJCQkJCVZJU09SQ0hJUFNFVF9FWFRFUk5BTFBPUlRfSU5GTworCQkJCQkqZXh0ZXJuYWxQb3J0SW5mbyk7CitCT09MIHZpc29yY2hpcHNldF9zZXRfYnVzX2NvbnRleHQodWxvbmcgYnVzTm8sIHZvaWQgKmNvbnRleHQpOworQk9PTCB2aXNvcmNoaXBzZXRfc2V0X2RldmljZV9jb250ZXh0KHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgdm9pZCAqY29udGV4dCk7CitpbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkodm9pZCk7CitpbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfc2VsZnRlc3Qodm9pZCk7CitpbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkodm9pZCk7Cit2b2lkIHZpc29yY2hpcHNldF9jb250cm9sdm1fcmVzcG9uZF9yZXBvcnRFdmVudChDT05UUk9MVk1fTUVTU0FHRSAqbXNnLAorCQkJCQkJdm9pZCAqcGF5bG9hZCk7Cit2b2lkIHZpc29yY2hpcHNldF9zYXZlX21lc3NhZ2UoQ09OVFJPTFZNX01FU1NBR0UgKm1zZywgQ1JBU0hfT0JKX1RZUEUgdHlwZSk7Cit2b2lkICp2aXNvcmNoaXBzZXRfY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKnBvb2wsCisJCQkgICAgICAgQk9PTCBva190b19ibG9jaywgY2hhciAqZm4sIGludCBsbik7Cit2b2lkIHZpc29yY2hpcHNldF9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpwb29sLCB2b2lkICpwLAorCQkJICAgICBjaGFyICpmbiwgaW50IGxuKTsKKworI2lmIGRlZmluZWQoVFJBTlNNSVRGSUxFX0RFQlVHKSB8fCBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBEQkdfR0VURklMRV9QQVlMT0FEKG1zZywgY29udHJvbHZtX2hlYWRlcikgICAgICBcCisJTE9HSU5GKG1zZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAodWxvbmcpY29udHJvbHZtX2hlYWRlci5QYXlsb2FkVm1PZmZzZXQsIFwKKwkgICAgICAgKHVsb25nKWNvbnRyb2x2bV9oZWFkZXIuUGF5bG9hZE1heEJ5dGVzKQorI2RlZmluZSBEQkdfR0VURklMRShmbXQsIC4uLikgIExPR0lORihmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIERCR19QVVRGSUxFKGZtdCwgLi4uKSAgTE9HSU5GKGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIERCR19HRVRGSUxFX1BBWUxPQUQobXNnLCBjb250cm9sdm1faGVhZGVyKQorI2RlZmluZSBEQkdfR0VURklMRShmbXQsIC4uLikKKyNkZWZpbmUgREJHX1BVVEZJTEUoZm10LCAuLi4pCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXRfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUyY2ExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYwpAQCAtMCwwICsxLDI5NDUgQEAKKy8qIHZpc29yY2hpcHNldF9tYWluLmMKKyAqCisgKiBDb3B5cmlnaHQg77+9IDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImdsb2JhbHMuaCIKKyNpbmNsdWRlICJjb250cm9sdm0uaCIKKyNpbmNsdWRlICJ2aXNvcmNoaXBzZXQuaCIKKyNpbmNsdWRlICJwcm9jb2JqZWN0dHJlZS5oIgorI2luY2x1ZGUgInZpc29yY2hhbm5lbC5oIgorI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ1aXN1dGlscy5oIgorI2luY2x1ZGUgImd1aWR1dGlscy5oIgorI2luY2x1ZGUgImNvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaCIKKyNpbmNsdWRlICJndWVzdGxpbnV4ZGVidWcuaCIKKyNpbmNsdWRlICJmaWxleGZlci5oIgorCisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFZJU09SX0NISVBTRVRfUENfdmlzb3JjaGlwc2V0X21haW5fYworI2RlZmluZSBURVNUX1ZOSUNfUEhZU0lURiAiZXRoMCIJLyogcGh5c2ljYWwgbmV0d29yayBpdGYgZm9yCisJCQkJCSAqIHZuaWMgbG9vcGJhY2sgdGVzdCAqLworI2RlZmluZSBURVNUX1ZOSUNfU1dJVENITk8gMQorI2RlZmluZSBURVNUX1ZOSUNfQlVTTk8gOQorCisjZGVmaW5lIE1BWF9OQU1FX1NJWkUgMTI4CisjZGVmaW5lIE1BWF9JUF9TSVpFICAgNTAKKyNkZWZpbmUgTUFYT1VUU1RBTkRJTkdDSEFOTkVMQ09NTUFORCAyNTYKKyNkZWZpbmUgUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUICAgMQorI2RlZmluZSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1cgMTAwCisKKy8qIFdoZW4gdGhlIGNvbnRyb2x2bSBjaGFubmVsIGlzIGlkbGUgZm9yIGF0IGxlYXN0IE1JTl9JRExFX1NFQ09ORFMsCisqIHdlIHN3aXRjaCB0byBzbG93IHBvbGxpbmcgbW9kZS4gIEFzIHNvb24gYXMgd2UgZ2V0IGEgY29udHJvbHZtCisqIG1lc3NhZ2UsIHdlIHN3aXRjaCBiYWNrIHRvIGZhc3QgcG9sbGluZyBtb2RlLgorKi8KKyNkZWZpbmUgTUlOX0lETEVfU0VDT05EUyAxMAorc3RhdGljIHVsb25nIFBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKK3N0YXRpYyB1bG9uZyBNb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXM7CS8qIHdoZW4gd2UgZ290IG91ciBsYXN0CisJCQkJCQkgKiBjb250cm9sdm0gbWVzc2FnZSAqLworc3RhdGljIGlubGluZSBjaGFyICoKK05PTlVMTFNUUihjaGFyICpzKQoreworCWlmIChzKQorCQlyZXR1cm4gczsKKwllbHNlCisJCXJldHVybiAiIjsKK30KKworc3RhdGljIGludCBzZXJ2ZXJyZWdpc3RlcmVkOworc3RhdGljIGludCBjbGllbnRyZWdpc3RlcmVkOworCisjZGVmaW5lIE1BWF9DSElQU0VUX0VWRU5UUyAyCitzdGF0aWMgVTggY2hpcHNldF9ldmVudHNbTUFYX0NISVBTRVRfRVZFTlRTXSA9IHsgMCwgMCB9OworCitzdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayBQZXJpb2RpY19jb250cm9sdm1fd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZTsKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKE5vdGlmaWVyTG9jayk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlDT05UUk9MVk1fTUVTU0FHRSBtZXNzYWdlOworCXVuc2lnbmVkIGludCBjcmM7Cit9IE1FU1NBR0VfRU5WRUxPUEU7CisKK3N0YXRpYyBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgZ19EaWFnTXNnSGRyOworc3RhdGljIENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBnX0NoaXBTZXRNc2dIZHI7CitzdGF0aWMgQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIGdfRGVsRHVtcE1zZ0hkcjsKK3N0YXRpYyBjb25zdCBHVUlEIFVsdHJhRGlhZ1Bvb2xDaGFubmVsUHJvdG9jb2xHdWlkID0KKwlVTFRSQV9ESUFHX1BPT0xfQ0hBTk5FTF9QUk9UT0NPTF9HVUlEOworLyogMHhmZmZmZmYgaXMgYW4gaW52YWxpZCBCdXMvRGV2aWNlIG51bWJlciAqLworc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xCdXNObyA9IDB4ZmZmZmZmOworc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xEZXZObyA9IDB4ZmZmZmZmOworc3RhdGljIENPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0OworCisvKiBPbmx5IFZOSUMgYW5kIFZIQkEgY2hhbm5lbHMgYXJlIHNlbnQgdG8gdmlzb3JjbGllbnRidXMgKGFrYQorICogInZpc29yaGFja2J1cyIpCisgKi8KKyNkZWZpbmUgRk9SX1ZJU09SSEFDS0JVUyhjaGFubmVsX3R5cGVfZ3VpZCkgXAorCSgobWVtY21wKCZjaGFubmVsX3R5cGVfZ3VpZCwgJlVsdHJhVm5pY0NoYW5uZWxQcm90b2NvbEd1aWQsIFwKKwkJIHNpemVvZihHVUlEKSkgPT0gMCkgfHwJCQkJICAgIFwKKwkgKG1lbWNtcCgmY2hhbm5lbF90eXBlX2d1aWQsICZVbHRyYVZoYmFDaGFubmVsUHJvdG9jb2xHdWlkLCBcCisJCSBzaXplb2YoR1VJRCkpID09IDApKQorI2RlZmluZSBGT1JfVklTT1JCVVMoY2hhbm5lbF90eXBlX2d1aWQpICghKEZPUl9WSVNPUkhBQ0tCVVMoY2hhbm5lbF90eXBlX2d1aWQpKSkKKworI2RlZmluZSBpc19kaWFncG9vbF9jaGFubmVsKGNoYW5uZWxfdHlwZV9ndWlkKSBcCisJIChtZW1jbXAoJmNoYW5uZWxfdHlwZV9ndWlkLCBcCisJCSAmVWx0cmFEaWFnUG9vbENoYW5uZWxQcm90b2NvbEd1aWQsIHNpemVvZihHVUlEKSkgPT0gMCkKKwordHlwZWRlZiBlbnVtIHsKKwlQQVJUUFJPUF9pbnZhbGlkLAorCVBBUlRQUk9QX25hbWUsCisJUEFSVFBST1BfZGVzY3JpcHRpb24sCisJUEFSVFBST1BfaGFuZGxlLAorCVBBUlRQUk9QX2J1c051bWJlciwKKwkvKiBhZGQgbmV3IHByb3BlcnRpZXMgYWJvdmUsIGJ1dCBkb24ndCBmb3JnZXQgdG8gY2hhbmdlCisJICogSW5pdFBhcnRpdGlvblByb3BlcnRpZXMoKSBhbmQgc2hvd19wYXJ0aXRpb25fcHJvcGVydHkoKSBhbHNvLi4uCisJICovCisJUEFSVFBST1BfbGFzdAorfSBQQVJUSVRJT05fcHJvcGVydHk7CitzdGF0aWMgY29uc3QgY2hhciAqUGFydGl0aW9uVHlwZU5hbWVzW10gPSB7ICJwYXJ0aXRpb24iLCBOVUxMIH07CisKK3N0YXRpYyBjaGFyICpQYXJ0aXRpb25Qcm9wZXJ0eU5hbWVzW1BBUlRQUk9QX2xhc3QgKyAxXTsKK3N0YXRpYyB2b2lkCitJbml0UGFydGl0aW9uUHJvcGVydGllcyh2b2lkKQoreworCWNoYXIgKipwID0gUGFydGl0aW9uUHJvcGVydHlOYW1lczsKKwlwW1BBUlRQUk9QX2ludmFsaWRdID0gIiI7CisJcFtQQVJUUFJPUF9uYW1lXSA9ICJuYW1lIjsKKwlwW1BBUlRQUk9QX2Rlc2NyaXB0aW9uXSA9ICJkZXNjcmlwdGlvbiI7CisJcFtQQVJUUFJPUF9oYW5kbGVdID0gImhhbmRsZSI7CisJcFtQQVJUUFJPUF9idXNOdW1iZXJdID0gImJ1c051bWJlciI7CisJcFtQQVJUUFJPUF9sYXN0XSA9IE5VTEw7Cit9CisKK3R5cGVkZWYgZW51bSB7CisJQ1RMVk1QUk9QX2ludmFsaWQsCisJQ1RMVk1QUk9QX3BoeXNBZGRyLAorCUNUTFZNUFJPUF9jb250cm9sQ2hhbm5lbEFkZHIsCisJQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQnl0ZXMsCisJQ1RMVk1QUk9QX3NwYXJCb290UGFydCwKKwlDVExWTVBST1Bfc3BhclN0b3JhZ2VQYXJ0LAorCUNUTFZNUFJPUF9saXZlZHVtcExlbmd0aCwKKwlDVExWTVBST1BfbGl2ZWR1bXBDcmMzMiwKKwkvKiBhZGQgbmV3IHByb3BlcnRpZXMgYWJvdmUsIGJ1dCBkb24ndCBmb3JnZXQgdG8gY2hhbmdlCisJICogSW5pdENvbnRyb2xWbVByb3BlcnRpZXMoKSBzaG93X2NvbnRyb2x2bV9wcm9wZXJ0eSgpIGFsc28uLi4KKwkgKi8KKwlDVExWTVBST1BfbGFzdAorfSBDT05UUk9MVk1fcHJvcGVydHk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpDb250cm9sVm1UeXBlTmFtZXNbXSA9IHsgImNvbnRyb2x2bSIsIE5VTEwgfTsKKworc3RhdGljIGNoYXIgKkNvbnRyb2xWbVByb3BlcnR5TmFtZXNbQ1RMVk1QUk9QX2xhc3QgKyAxXTsKK3N0YXRpYyB2b2lkCitJbml0Q29udHJvbFZtUHJvcGVydGllcyh2b2lkKQoreworCWNoYXIgKipwID0gQ29udHJvbFZtUHJvcGVydHlOYW1lczsKKwlwW0NUTFZNUFJPUF9pbnZhbGlkXSA9ICIiOworCXBbQ1RMVk1QUk9QX3BoeXNBZGRyXSA9ICJwaHlzQWRkciI7CisJcFtDVExWTVBST1BfY29udHJvbENoYW5uZWxBZGRyXSA9ICJjb250cm9sQ2hhbm5lbEFkZHIiOworCXBbQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQnl0ZXNdID0gImNvbnRyb2xDaGFubmVsQnl0ZXMiOworCXBbQ1RMVk1QUk9QX3NwYXJCb290UGFydF0gPSAic3Bhcl9ib290X3BhcnQiOworCXBbQ1RMVk1QUk9QX3NwYXJTdG9yYWdlUGFydF0gPSAic3Bhcl9zdG9yYWdlX3BhcnQiOworCXBbQ1RMVk1QUk9QX2xpdmVkdW1wTGVuZ3RoXSA9ICJsaXZlZHVtcExlbmd0aCI7CisJcFtDVExWTVBST1BfbGl2ZWR1bXBDcmMzMl0gPSAibGl2ZWR1bXBDcmMzMiI7CisJcFtDVExWTVBST1BfbGFzdF0gPSBOVUxMOworfQorCitzdGF0aWMgTVlQUk9DT0JKRUNUICpDb250cm9sVm1PYmplY3Q7CitzdGF0aWMgTVlQUk9DVFlQRSAqUGFydGl0aW9uVHlwZTsKK3N0YXRpYyBNWVBST0NUWVBFICpDb250cm9sVm1UeXBlOworCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9ESUFHX1BST0NfRU5UUllfRk4gImRpYWdkdW1wIgorc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlhZ19wcm9jX2RpcjsKKworI2RlZmluZSBWSVNPUkNISVBTRVRfQ0hJUFNFVF9QUk9DX0VOVFJZX0ZOICJjaGlwc2V0cmVhZHkiCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjaGlwc2V0X3Byb2NfZGlyOworCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9QQVJBSE9UUExVR19QUk9DX0VOVFJZX0ZOICJwYXJhaG90cGx1ZyIKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmFob3RwbHVnX3Byb2NfZGlyOworCitzdGF0aWMgTElTVF9IRUFEKEJ1c0luZm9MaXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQoRGV2SW5mb0xpc3QpOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRGlyOworc3RhdGljIFZJU09SQ0hBTk5FTCAqQ29udHJvbFZtX2NoYW5uZWw7CisKK3N0YXRpYyBzc2l6ZV90IHZpc29yY2hpcHNldF9wcm9jX3JlYWRfd3JpdGVvbmx5KHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZF9pbnN0YWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpOworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZV9pbnN0YWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZF90b29sYWN0aW9uKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCk7CitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX3Rvb2xhY3Rpb24oc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgcHJvY19yZWFkX2Jvb3RUb1Rvb2woc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfYm9vdFRvVG9vbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2luc3RhbGxlcl9mb3BzID0geworCS5yZWFkID0gcHJvY19yZWFkX2luc3RhbGxlciwKKwkud3JpdGUgPSBwcm9jX3dyaXRlX2luc3RhbGxlciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdG9vbGFjdGlvbl9mb3BzID0geworCS5yZWFkID0gcHJvY19yZWFkX3Rvb2xhY3Rpb24sCisJLndyaXRlID0gcHJvY193cml0ZV90b29sYWN0aW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19ib290VG9Ub29sX2ZvcHMgPSB7CisJLnJlYWQgPSBwcm9jX3JlYWRfYm9vdFRvVG9vbCwKKwkud3JpdGUgPSBwcm9jX3dyaXRlX2Jvb3RUb1Rvb2wsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJVTggX19pb21lbSAqcHRyOwkvKiBwb2ludGVyIHRvIGJhc2UgYWRkcmVzcyBvZiBwYXlsb2FkIHBvb2wgKi8KKwlVNjQgb2Zmc2V0OwkJLyogb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGNvbnRyb2x2bQorCQkJCSAqIGNoYW5uZWwgdG8gYmVnaW5uaW5nIG9mIHBheWxvYWQgKiBwb29sICovCisJVTMyIGJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHBheWxvYWQgcG9vbCAqLworfSBDT05UUk9MVk1fUEFZTE9BRF9JTkZPOworCisvKiBNYW5hZ2VzIHRoZSByZXF1ZXN0IHBheWxvYWQgaW4gdGhlIGNvbnRyb2x2bSBjaGFubmVsICovCitzdGF0aWMgQ09OVFJPTFZNX1BBWUxPQURfSU5GTyBDb250cm9sVm1fcGF5bG9hZF9pbmZvOworCitzdGF0aWMgcENIQU5ORUxfSEVBREVSIFRlc3RfVm5pY19jaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCB7CisJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIER1bXBjYXB0dXJlX2hlYWRlcjsKKwlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgR2V0dGV4dGR1bXBfaGVhZGVyOworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBEdW1wY29tcGxldGVfaGVhZGVyOworCUJPT0wgR2V0dGV4dGR1bXBfb3V0c3RhbmRpbmc7CisJdTMyIGNyYzMyOworCXVsb25nIGxlbmd0aDsKKwlhdG9taWNfdCBidWZmZXJzX2luX3VzZTsKKwl1bG9uZyBkZXN0aW5hdGlvbjsKK30gTElWRURVTVBfSU5GTzsKKy8qIE1hbmFnZXMgdGhlIGluZm8gZm9yIGEgQ09OVFJPTFZNX0RVTVBfQ0FQVFVSRVNUQVRFIC8KKyAqIENPTlRST0xWTV9EVU1QX0dFVFRFWFREVU1QIC8gQ09OVFJPTFZNX0RVTVBfQ09NUExFVEUgY29udmVyc2F0aW9uLgorICovCitzdGF0aWMgTElWRURVTVBfSU5GTyBMaXZlRHVtcF9pbmZvOworCisvKiBUaGUgZm9sbG93aW5nIGdsb2JhbHMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzY2VuYXJpbyB3aGVyZSB3ZSBhcmUgdW5hYmxlIHRvCisgKiBvZmZsb2FkIHRoZSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSBkdWUgdG8gbWVtb3J5IHJlcXVpcmVtZW50cy4gIEluCisgKiB0aGlzIHNjZW5hcmlvLCB3ZSBzaW1wbHkgc3Rhc2ggdGhlIGNvbnRyb2x2bSBtZXNzYWdlLCB0aGVuIGF0dGVtcHQgdG8KKyAqIHByb2Nlc3MgaXQgYWdhaW4gdGhlIG5leHQgdGltZSBjb250cm9sdm1fcGVyaW9kaWNfd29yaygpIHJ1bnMuCisgKi8KK3N0YXRpYyBDT05UUk9MVk1fTUVTU0FHRSBDb250cm9sVm1fUGVuZGluZ19Nc2c7CitzdGF0aWMgQk9PTCBDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQgPSBGQUxTRTsKKworLyogUG9vbCBvZiBzdHJ1Y3QgcHV0ZmlsZV9idWZmZXJfZW50cnksIGZvciBrZWVwaW5nIHRyYWNrIG9mIHBlbmRpbmcgKGluY29taW5nKQorICogVFJBTlNNSVRfRklMRSBQdXRGaWxlIHBheWxvYWRzLgorICovCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKlB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbDsKK3N0YXRpYyBjb25zdCBjaGFyIFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbF9uYW1lW10gPQorCSJjb250cm9sdm1fcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sIjsKKworLyogVGhpcyBpZGVudGlmaWVzIGEgZGF0YSBidWZmZXIgdGhhdCBoYXMgYmVlbiByZWNlaXZlZCB2aWEgYSBjb250cm9sdm0gbWVzc2FnZXMKKyAqIGluIGEgcmVtb3RlIC0tPiBsb2NhbCBDT05UUk9MVk1fVFJBTlNNSVRfRklMRSBjb252ZXJzYXRpb24uCisgKi8KK3N0cnVjdCBwdXRmaWxlX2J1ZmZlcl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OwkvKiBwdXRmaWxlX2J1ZmZlcl9lbnRyeSBsaXN0ICovCisJUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9jdHg7IC8qIHBvaW50cyB0byBidWZmZXIgY29udGFpbmluZyBpbnB1dCBkYXRhICovCit9OworCisvKiBMaXN0IG9mIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKiwgdmlhIG5leHRfcHV0ZmlsZV9yZXF1ZXN0IG1lbWJlci4KKyAqIEVhY2ggZW50cnkgaW4gdGhpcyBsaXN0IGlkZW50aWZpZXMgYW4gb3V0c3RhbmRpbmcgVFJBTlNNSVRfRklMRQorICogY29udmVyc2F0aW9uLgorICovCitzdGF0aWMgTElTVF9IRUFEKFB1dGZpbGVfcmVxdWVzdF9saXN0KTsKKworLyogVGhpcyBkZXNjcmliZXMgYSBidWZmZXIgYW5kIGl0cyBjdXJyZW50IHN0YXRlIG9mIHRyYW5zZmVyIChlLmcuLCBob3cgbWFueQorICogYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3VwcGxpZWQgYXMgcHV0ZmlsZSBkYXRhLCBhbmQgaG93IG1hbnkgYnl0ZXMgYXJlCisgKiByZW1haW5pbmcpIGZvciBhIHB1dGZpbGVfcmVxdWVzdC4KKyAqLworc3RydWN0IHB1dGZpbGVfYWN0aXZlX2J1ZmZlciB7CisJLyogYSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSwgY29udGFpbmluZyBhIGZpbGUgZGF0YSBidWZmZXIgKi8KKwlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eDsKKwkvKiBwb2ludHMgd2l0aGluIGRhdGEgYXJlYSBvZiBwYXJzZXJfY3R4IHRvIG5leHQgYnl0ZSBvZiBkYXRhICovCisJdTggKnBuZXh0OworCS8qICMgYnl0ZXMgbGVmdCBmcm9tIDxwbmV4dD4gdG8gdGhlIGVuZCBvZiB0aGlzIGRhdGEgYnVmZmVyICovCisJc2l6ZV90IGJ5dGVzX3JlbWFpbmluZzsKK307CisKKyNkZWZpbmUgUFVURklMRV9SRVFVRVNUX1NJRyAweDA5MDYxMDEzMDIyODEyMTEKKy8qIFRoaXMgaWRlbnRpZmllcyBhIHNpbmdsZSByZW1vdGUgLS0+IGxvY2FsIENPTlRST0xWTV9UUkFOU01JVF9GSUxFCisgKiBjb252ZXJzYXRpb24uICBTdHJ1Y3RzIG9mIHRoaXMgdHlwZSBhcmUgZHluYW1pY2FsbHkgbGlua2VkIGludG8KKyAqIDxQdXRmaWxlX3JlcXVlc3RfbGlzdD4uCisgKi8KK3N0cnVjdCBwdXRmaWxlX3JlcXVlc3QgeworCXU2NCBzaWc7CQkvKiBQVVRGSUxFX1JFUVVFU1RfU0lHICovCisKKwkvKiBoZWFkZXIgZnJvbSBvcmlnaW5hbCBUcmFuc21pdEZpbGUgcmVxdWVzdCAqLworCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBjb250cm9sdm1faGVhZGVyOworCXU2NCBmaWxlX3JlcXVlc3RfbnVtYmVyOwkvKiBmcm9tIG9yaWdpbmFsIFRyYW5zbWl0RmlsZSByZXF1ZXN0ICovCisKKwkvKiBsaW5rIHRvIG5leHQgc3RydWN0IHB1dGZpbGVfcmVxdWVzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9wdXRmaWxlX3JlcXVlc3Q7CisKKwkvKiBtb3N0LXJlY2VudCBzZXF1ZW5jZSBudW1iZXIgc3VwcGxpZWQgdmlhIGEgY29udHJvbHZtIG1lc3NhZ2UgKi8KKwl1NjQgZGF0YV9zZXF1ZW5jZV9udW1iZXI7CisKKwkvKiBoZWFkIG9mIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QsIHdoaWNoIGRlc2NyaWJlcyB0aGUgZGF0YSB0byBiZQorCSAqIHN1cHBsaWVkIGFzIHB1dGZpbGUgZGF0YTsKKwkgKiAtIHRoaXMgbGlzdCBpcyBhZGRlZCB0byB3aGVuIGNvbnRyb2x2bSBtZXNzYWdlcyBjb21lIGluIHRoYXQgc3VwcGx5CisJICogZmlsZSBkYXRhCisJICogLSB0aGlzIGxpc3QgaXMgcmVtb3ZlZCBmcm9tIHZpYSB0aGUgaG90cGx1ZyBwcm9ncmFtIHRoYXQgaXMgYWN0dWFsbHkKKwkgKiBjb25zdW1pbmcgdGhlc2UgYnVmZmVycyB0byB3cml0ZSBhcyBmaWxlIGRhdGEgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlucHV0X2J1ZmZlcl9saXN0OworCXNwaW5sb2NrX3QgcmVxX2xpc3RfbG9jazsJLyogbG9jayBmb3IgaW5wdXRfYnVmZmVyX2xpc3QgKi8KKworCS8qIHdhaXRlcnMgZm9yIGlucHV0X2J1ZmZlcl9saXN0IHRvIGdvIG5vbi1lbXB0eSAqLworCXdhaXRfcXVldWVfaGVhZF90IGlucHV0X2J1ZmZlcl93cTsKKworCS8qIGRhdGEgbm90IHlldCByZWFkIHdpdGhpbiBjdXJyZW50IHB1dGZpbGVfYnVmZmVyX2VudHJ5ICovCisJc3RydWN0IHB1dGZpbGVfYWN0aXZlX2J1ZmZlciBhY3RpdmVfYnVmOworCisJLyogPDAgPSBmYWlsZWQsIDAgPSBpbi1wcm9ncmVzcywgPjAgPSBzdWNjZXNzZnVsOyAqLworCS8qIG5vdGUgdGhhdCB0aGlzIG11c3QgYmUgc2V0IHdpdGggcmVxX2xpc3RfbG9jaywgYW5kIGlmIHlvdSBzZXQgPDAsICovCisJLyogaXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBhbHNvIGZyZWUgdXAgYWxsIG9mIHRoZSBvdGhlciBvYmplY3RzICovCisJLyogaW4gdGhpcyBzdHJ1Y3QgKGxpa2UgaW5wdXRfYnVmZmVyX2xpc3QsIGFjdGl2ZV9idWYucGFyc2VyX2N0eCkgKi8KKwkvKiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBsb2NrICovCisJaW50IGNvbXBsZXRpb25fc3RhdHVzOworfTsKKworc3RhdGljIGF0b21pY190IFZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSA9IEFUT01JQ19JTklUKDApOworCitzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBpZDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyYXRpb247CisJQ09OVFJPTFZNX01FU1NBR0UgbXNnOworfTsKKworc3RhdGljIExJU1RfSEVBRChQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CS8qIGxvY2sgZm9yIGFib3ZlICovCitzdGF0aWMgdm9pZCBwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3Qodm9pZCk7CisKKy8qIE1hbmFnZXMgdGhlIGluZm8gZm9yIGEgQ09OVFJPTFZNX0RVTVBfQ0FQVFVSRVNUQVRFIC8KKyAqIENPTlRST0xWTV9SRVBPUlRFVkVOVC4KKyAqLworc3RhdGljIFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTIEJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzOworc3RhdGljIFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTIEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzOworCitzdGF0aWMgdm9pZCBidXNfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgYnVzX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKK3N0YXRpYyB2b2lkIGRldmljZV9kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKK3N0YXRpYyB2b2lkIGRldmljZV9yZXN1bWVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworCitzdGF0aWMgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTIEJ1c0Rldl9SZXNwb25kZXJzID0geworCS5idXNfY3JlYXRlID0gYnVzX2NyZWF0ZV9yZXNwb25zZSwKKwkuYnVzX2Rlc3Ryb3kgPSBidXNfZGVzdHJveV9yZXNwb25zZSwKKwkuZGV2aWNlX2NyZWF0ZSA9IGRldmljZV9jcmVhdGVfcmVzcG9uc2UsCisJLmRldmljZV9kZXN0cm95ID0gZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UsCisJLmRldmljZV9wYXVzZSA9IHZpc29yY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzcG9uc2UsCisJLmRldmljZV9yZXN1bWUgPSBkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlLAorfTsKKworLyogaW5mbyBmb3IgL2Rldi92aXNvcmNoaXBzZXQgKi8KK3N0YXRpYyBkZXZfdCBNYWpvckRldiA9IC0xOyAvKio8IGluZGljYXRlcyBtYWpvciBudW0gZm9yIGRldmljZSAqLworCisvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0ICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlID0geworCS5uYW1lID0gInZpc29yY2hpcHNldCIsCisJLmlkID0gLTEsCit9OworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwgaW50IHJlc3BvbnNlKTsKK3N0YXRpYyB2b2lkIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdChDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkJCQkJICAgaW50IHJlc3BvbnNlLAorCQkJCQkgICBVTFRSQV9DSElQU0VUX0ZFQVRVUkUgZmVhdHVyZXMpOworc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKgorCQkJCQkJICBtc2dIZHIsIGludCByZXNwb25zZSwKKwkJCQkJCSAgVUxUUkFfU0VHTUVOVF9TVEFURSBzdGF0ZSk7CisKK3N0YXRpYyB2b2lkCitzaG93X3BhcnRpdGlvbl9wcm9wZXJ0eShzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKmN0eCwgaW50IHByb3BlcnR5KQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqaW5mbyA9IChWSVNPUkNISVBTRVRfQlVTX0lORk8gKikgKGN0eCk7CisKKwlzd2l0Y2ggKHByb3BlcnR5KSB7CisJY2FzZSBQQVJUUFJPUF9uYW1lOgorCQlzZXFfcHJpbnRmKGYsICIlc1xuIiwgTk9OVUxMU1RSKGluZm8tPm5hbWUpKTsKKwkJYnJlYWs7CisJY2FzZSBQQVJUUFJPUF9kZXNjcmlwdGlvbjoKKwkJc2VxX3ByaW50ZihmLCAiJXNcbiIsIE5PTlVMTFNUUihpbmZvLT5kZXNjcmlwdGlvbikpOworCQlicmVhazsKKwljYXNlIFBBUlRQUk9QX2hhbmRsZToKKwkJc2VxX3ByaW50ZihmLCAiMHglLTE2LjE2THhcbiIsIGluZm8tPnBhcnRpdGlvbkhhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgUEFSVFBST1BfYnVzTnVtYmVyOgorCQlzZXFfcHJpbnRmKGYsICIlZFxuIiwgaW5mby0+YnVzTm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKGYsICIoJWQ/PylcbiIsIHByb3BlcnR5KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2hvd19jb250cm9sdm1fcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpjdHgsIGludCBwcm9wZXJ0eSkKK3sKKwkvKiBOb3RlOiBjdHggaXMgbm90IG5lZWRlZCBzaW5jZSB3ZSBvbmx5IGhhdmUgMSBjb250cm9sdm0gY2hhbm5lbCAqLworCXN3aXRjaCAocHJvcGVydHkpIHsKKwljYXNlIENUTFZNUFJPUF9waHlzQWRkcjoKKwkJaWYgKENvbnRyb2xWbV9jaGFubmVsID09IE5VTEwpCisJCQlzZXFfcHV0cyhmLCAiMHgwXG4iKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihmLCAiMHglLTE2LjE2THhcbiIsCisJCQkJICAgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcgorCQkJCSAgIChDb250cm9sVm1fY2hhbm5lbCkpOworCQlicmVhazsKKwljYXNlIENUTFZNUFJPUF9jb250cm9sQ2hhbm5lbEFkZHI6CisJCWlmIChDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKQorCQkJc2VxX3B1dHMoZiwgIjB4MFxuIik7CisJCWVsc2UgeworCQkJR1VFU1RfUEhZU0lDQUxfQUREUkVTUyBhZGRyID0gMDsKKwkJCXZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCQkgIG9mZnNldG9mCisJCQkJCSAgKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCQkgICBncENvbnRyb2xDaGFubmVsKSwgJmFkZHIsCisJCQkJCSAgc2l6ZW9mKGFkZHIpKTsKKwkJCXNlcV9wcmludGYoZiwgIjB4JS0xNi4xNkx4XG4iLCAodTY0KSAoYWRkcikpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX2NvbnRyb2xDaGFubmVsQnl0ZXM6CisJCWlmIChDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKQorCQkJc2VxX3B1dHMoZiwgIjB4MFxuIik7CisJCWVsc2UgeworCQkJVTMyIGJ5dGVzID0gMDsKKwkJCXZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCQkgIG9mZnNldG9mCisJCQkJCSAgKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCQkgICBDb250cm9sQ2hhbm5lbEJ5dGVzKSwgJmJ5dGVzLAorCQkJCQkgIHNpemVvZihieXRlcykpOworCQkJc2VxX3ByaW50ZihmLCAiJWx1XG4iLCAodWxvbmcpIChieXRlcykpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX3NwYXJCb290UGFydDoKKwkJc2VxX3B1dHMoZiwgIjA6MDowOjAvMVxuIik7CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX3NwYXJTdG9yYWdlUGFydDoKKwkJc2VxX3B1dHMoZiwgIjA6MDowOjAvMlxuIik7CisJCWJyZWFrOworCWNhc2UgQ1RMVk1QUk9QX2xpdmVkdW1wTGVuZ3RoOgorCQlzZXFfcHJpbnRmKGYsICIlbHVcbiIsIExpdmVEdW1wX2luZm8ubGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBDVExWTVBST1BfbGl2ZWR1bXBDcmMzMjoKKwkJc2VxX3ByaW50ZihmLCAiJWx1XG4iLCAodWxvbmcpIExpdmVEdW1wX2luZm8uY3JjMzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKGYsICIoJWQ/PylcbiIsIHByb3BlcnR5KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJvY19Jbml0KHZvaWQpCit7CisJaWYgKFByb2NEaXIgPT0gTlVMTCkgeworCQlQcm9jRGlyID0gcHJvY19ta2RpcihNWURSVk5BTUUsIE5VTEwpOworCQlpZiAoUHJvY0RpciA9PSBOVUxMKSB7CisJCQlMT0dFUlIoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwKKwkJCSAgICAgICBNWURSVk5BTUUpOworCQkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jX0RlSW5pdCh2b2lkKQoreworCWlmIChQcm9jRGlyICE9IE5VTEwpCisJCXJlbW92ZV9wcm9jX2VudHJ5KE1ZRFJWTkFNRSwgTlVMTCk7CisJUHJvY0RpciA9IE5VTEw7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAordGVzdFVuaWNvZGUodm9pZCkKK3sKKwl3Y2hhcl90IHVuaWNvZGVTdHJpbmdbXSA9IHsgJ2EnLCAnYicsICdjJywgMCB9OworCWNoYXIgc1tzaXplb2YodW5pY29kZVN0cmluZykgKiBOTFNfTUFYX0NIQVJTRVRfU0laRV07CisJd2NoYXJfdCB1bmljb2RlMls5OV07CisKKwkvKiBOT1RFOiBFaXRoZXIgZHVlIHRvIGEgYnVnLCBvciBmZWF0dXJlIEkgZG9uJ3QgdW5kZXJzdGFuZCwgdGhlCisJICogICAgICAga2VybmVsIHV0ZjhfbWJzdG93Y3MoKSBhbmQgdXRmX3djc3RvbWJzKCkgZG8gTk9UIGNvcHkgdGhlCisJICogICAgICAgdHJhaWxlZCBOVUwgYnl0ZSEhICAgUkVBTExZISEhISEgICAgQXJycnJnZ2dnaGhoaGgKKwkgKi8KKworCUxPR0lORigic2l6ZW9mKHdjaGFyX3QpID0gJWQiLCBzaXplb2Yod2NoYXJfdCkpOworCUxPR0lORigidXRmOF93Y3N0b21icz0lZCIsCisJICAgICAgIGNocnMgPSB1dGY4X3djc3RvbWJzKHMsIHVuaWNvZGVTdHJpbmcsIHNpemVvZihzKSkpOworCWlmIChjaHJzID49IDApCisJCXNbY2hyc10gPSAnXDAnOwkvKiBHUlJSUlJSUlIgKi8KKwlMT0dJTkYoInM9JyVzJyIsIHMpOworCUxPR0lORigidXRmOF9tYnN0b3djcz0lZCIsIGNocnMgPSB1dGY4X21ic3Rvd2NzKHVuaWNvZGUyLCBzLCAxMDApKTsKKwlpZiAoY2hycyA+PSAwKQorCQl1bmljb2RlMltjaHJzXSA9IDA7CS8qIEdSUlJSUlJSUiAqLworCWlmIChtZW1jbXAodW5pY29kZVN0cmluZywgdW5pY29kZTIsIHNpemVvZih1bmljb2RlU3RyaW5nKSkgPT0gMCkKKwkJTE9HSU5GKCJzdHJpbmdzIG1hdGNoLi4uIGdvb2QiKTsKKwllbHNlCisJCUxPR0lORigic3RyaW5ncyBkaWQgbm90IG1hdGNoISEiKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorYnVzSW5mb19jbGVhcih2b2lkICp2KQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcCA9IChWSVNPUkNISVBTRVRfQlVTX0lORk8gKikgKHYpOworCisJaWYgKHAtPnByb2NPYmplY3QpIHsKKwkJdmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KHAtPnByb2NPYmplY3QpOworCQlwLT5wcm9jT2JqZWN0ID0gTlVMTDsKKwl9CisJa2ZyZWUocC0+bmFtZSk7CisJcC0+bmFtZSA9IE5VTEw7CisKKwlrZnJlZShwLT5kZXNjcmlwdGlvbik7CisJcC0+ZGVzY3JpcHRpb24gPSBOVUxMOworCisJcC0+c3RhdGUuY3JlYXRlZCA9IDA7CisJbWVtc2V0KHAsIDAsIHNpemVvZihWSVNPUkNISVBTRVRfQlVTX0lORk8pKTsKK30KKworc3RhdGljIHZvaWQKK2RldkluZm9fY2xlYXIodm9pZCAqdikKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnAgPSAoVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICopICh2KTsKKwlwLT5zdGF0ZS5jcmVhdGVkID0gMDsKKwltZW1zZXQocCwgMCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTykpOworfQorCitzdGF0aWMgVTgKK2NoZWNrX2NoaXBzZXRfZXZlbnRzKHZvaWQpCit7CisJaW50IGk7CisJVTggc2VuZF9tc2cgPSAxOworCS8qIENoZWNrIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgcmVzcG9uc2Ugc2hvdWxkIGJlIHNlbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NISVBTRVRfRVZFTlRTOyBpKyspCisJCXNlbmRfbXNnICY9IGNoaXBzZXRfZXZlbnRzW2ldOworCXJldHVybiBzZW5kX21zZzsKK30KKworc3RhdGljIHZvaWQKK2NsZWFyX2NoaXBzZXRfZXZlbnRzKHZvaWQpCit7CisJaW50IGk7CisJLyogQ2xlYXIgY2hpcHNldF9ldmVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NISVBTRVRfRVZFTlRTOyBpKyspCisJCWNoaXBzZXRfZXZlbnRzW2ldID0gMDsKK30KKwordm9pZAordmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9zZXJ2ZXIoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKKwkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pCit7CisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJk5vdGlmaWVyTG9jayk7CisJaWYgKG5vdGlmaWVycyA9PSBOVUxMKSB7CisJCW1lbXNldCgmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMsIDAsCisJCSAgICAgICBzaXplb2YoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMpKTsKKwkJc2VydmVycmVnaXN0ZXJlZCA9IDA7CS8qIGNsZWFyIGZsYWcgKi8KKwl9IGVsc2UgeworCQlCdXNEZXZfU2VydmVyX05vdGlmaWVycyA9ICpub3RpZmllcnM7CisJCXNlcnZlcnJlZ2lzdGVyZWQgPSAxOwkvKiBzZXQgZmxhZyAqLworCX0KKwlpZiAocmVzcG9uZGVycykKKwkJKnJlc3BvbmRlcnMgPSBCdXNEZXZfUmVzcG9uZGVyczsKKwlpZiAoZHJpdmVySW5mbykKKwkJQnVzRGV2aWNlSW5mb19Jbml0KGRyaXZlckluZm8sICJjaGlwc2V0IiwgInZpc29yY2hpcHNldCIsCisJCQkJICAgVkVSU0lPTiwgTlVMTCwgX19EQVRFX18sIF9fVElNRV9fKTsKKworCVVOTE9DS1NFTSgmTm90aWZpZXJMb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXZfc2VydmVyKTsKKwordm9pZAordmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKKwkJCQkgICAgVklTT1JDSElQU0VUX0JVU0RFVl9SRVNQT05ERVJTICpyZXNwb25kZXJzLAorCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pCit7CisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJk5vdGlmaWVyTG9jayk7CisJaWYgKG5vdGlmaWVycyA9PSBOVUxMKSB7CisJCW1lbXNldCgmQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMsIDAsCisJCSAgICAgICBzaXplb2YoQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMpKTsKKwkJY2xpZW50cmVnaXN0ZXJlZCA9IDA7CS8qIGNsZWFyIGZsYWcgKi8KKwl9IGVsc2UgeworCQlCdXNEZXZfQ2xpZW50X05vdGlmaWVycyA9ICpub3RpZmllcnM7CisJCWNsaWVudHJlZ2lzdGVyZWQgPSAxOwkvKiBzZXQgZmxhZyAqLworCX0KKwlpZiAocmVzcG9uZGVycykKKwkJKnJlc3BvbmRlcnMgPSBCdXNEZXZfUmVzcG9uZGVyczsKKwlpZiAoZHJpdmVySW5mbykKKwkJQnVzRGV2aWNlSW5mb19Jbml0KGRyaXZlckluZm8sICJjaGlwc2V0KGJvbHRzKSIsICJ2aXNvcmNoaXBzZXQiLAorCQkJCSAgIFZFUlNJT04sIE5VTEwsIF9fREFURV9fLCBfX1RJTUVfXyk7CisJVU5MT0NLU0VNKCZOb3RpZmllckxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQpOworCitzdGF0aWMgdm9pZAorY2xlYW51cF9jb250cm9sdm1fc3RydWN0dXJlcyh2b2lkKQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqYmk7CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpkaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmksICZCdXNJbmZvTGlzdCwgZW50cnkpIHsKKwkJYnVzSW5mb19jbGVhcihiaSk7CisJCWxpc3RfZGVsKCZiaS0+ZW50cnkpOworCQlrZnJlZShiaSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkaSwgJkRldkluZm9MaXN0LCBlbnRyeSkgeworCQlkZXZJbmZvX2NsZWFyKGRpKTsKKwkJbGlzdF9kZWwoJmRpLT5lbnRyeSk7CisJCWtmcmVlKGRpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGlwc2V0X2luaXQoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCXN0YXRpYyBpbnQgY2hpcHNldF9pbml0ZWQ7CisJVUxUUkFfQ0hJUFNFVF9GRUFUVVJFIGZlYXR1cmVzID0gMDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmIChjaGlwc2V0X2luaXRlZCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9DSElQU0VUX0lOSVQgRmFpbGVkOiBBbHJlYWR5IERvbmUuIik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJZ290byBBd2F5OworCX0KKwljaGlwc2V0X2luaXRlZCA9IDE7CisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwkvKiBTZXQgZmVhdHVyZXMgdG8gaW5kaWNhdGUgd2Ugc3VwcG9ydCBwYXJhaG90cGx1ZyAoaWYgQ29tbWFuZAorCSAqIGFsc28gc3VwcG9ydHMgaXQpLiAqLworCWZlYXR1cmVzID0KKwkgICAgaW5tc2ctPmNtZC5pbml0Q2hpcHNldC4KKwkgICAgZmVhdHVyZXMgJiBVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUEFSQV9IT1RQTFVHOworCisJLyogU2V0IHRoZSAicmVwbHkiIGJpdCBzbyBDb21tYW5kIGtub3dzIHRoaXMgaXMgYQorCSAqIGZlYXR1cmVzLWF3YXJlIGRyaXZlci4gKi8KKwlmZWF0dXJlcyB8PSBVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUkVQTFk7CisKK0F3YXk6CisJaWYgKHJjIDwgMCkKKwkJY2xlYW51cF9jb250cm9sdm1fc3RydWN0dXJlcygpOworCWlmIChpbm1zZy0+aGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQpCisJCWNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgmaW5tc2ctPmhkciwgcmMsIGZlYXR1cmVzKTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKENPTlRST0xWTV9NRVNTQUdFICptc2csCisJCQlDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwgaW50IHJlc3BvbnNlKQoreworCW1lbXNldChtc2csIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpOworCW1lbWNweSgmbXNnLT5oZHIsIG1zZ0hkciwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCW1zZy0+aGRyLlBheWxvYWRCeXRlcyA9IDA7CisJbXNnLT5oZHIuUGF5bG9hZFZtT2Zmc2V0ID0gMDsKKwltc2ctPmhkci5QYXlsb2FkTWF4Qnl0ZXMgPSAwOworCWlmIChyZXNwb25zZSA8IDApIHsKKwkJbXNnLT5oZHIuRmxhZ3MuZmFpbGVkID0gMTsKKwkJbXNnLT5oZHIuQ29tcGxldGlvblN0YXR1cyA9IChVMzIpICgtcmVzcG9uc2UpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9yZXNwb25kKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpCit7CisJQ09OVFJPTFZNX01FU1NBR0Ugb3V0bXNnOworCWlmICghQ29udHJvbFZtX2NoYW5uZWwpCisJCXJldHVybjsKKwljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dIZHIsIHJlc3BvbnNlKTsKKwkvKiBGb3IgRGlhZ1Bvb2wgY2hhbm5lbCBERVZJQ0VfQ0hBTkdFU1RBVEUsIHdlIG5lZWQgdG8gc2VuZAorCSogYmFjayB0aGUgZGV2aWNlQ2hhbmdlU3RhdGUgc3RydWN0dXJlIGluIHRoZSBwYWNrZXQuICovCisJaWYgKG1zZ0hkci0+SWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURQorCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZUNoYW5nZVN0YXRlLmJ1c05vID09CisJICAgIGdfZGlhZ3Bvb2xCdXNObworCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZUNoYW5nZVN0YXRlLmRldk5vID09CisJICAgIGdfZGlhZ3Bvb2xEZXZObykKKwkJb3V0bXNnLmNtZCA9IGdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQ7CisJaWYgKG91dG1zZy5oZHIuRmxhZ3MudGVzdE1lc3NhZ2UgPT0gMSkgeworCQlMT0dJTkYoIiVzIGNvbnRyb2x2bV9tc2c9MHgleCByZXNwb25zZT0lZCBmb3IgdGVzdCBtZXNzYWdlIiwKKwkJICAgICAgIF9fZnVuY19fLCBvdXRtc2cuaGRyLklkLCByZXNwb25zZSk7CisJCXJldHVybjsKKwl9CisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKKwkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCQkgICAgICAgVUxUUkFfQ0hJUFNFVF9GRUFUVVJFIGZlYXR1cmVzKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG91dG1zZzsKKwlpZiAoIUNvbnRyb2xWbV9jaGFubmVsKQorCQlyZXR1cm47CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJb3V0bXNnLmNtZC5pbml0Q2hpcHNldC5mZWF0dXJlcyA9IGZlYXR1cmVzOworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsCisJCQkJICAgICAgaW50IHJlc3BvbnNlLCBVTFRSQV9TRUdNRU5UX1NUQVRFIHN0YXRlKQoreworCUNPTlRST0xWTV9NRVNTQUdFIG91dG1zZzsKKwlpZiAoIUNvbnRyb2xWbV9jaGFubmVsKQorCQlyZXR1cm47CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJb3V0bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSA9IHN0YXRlOworCW91dG1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuZmxhZ3MucGh5c2ljYWxEZXZpY2UgPSAxOworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKKwkJcmV0dXJuOworCX0KK30KKwordm9pZAordmlzb3JjaGlwc2V0X3NhdmVfbWVzc2FnZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnLCBDUkFTSF9PQkpfVFlQRSB0eXBlKQoreworCVUzMiBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQ7CisJVTE2IGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50OworCisJLyogZ2V0IHNhdmVkIG1lc3NhZ2UgY291bnQgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkgICAgICAgU2F2ZWRDcmFzaE1zZ0NvdW50KSwKKwkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwgc2l6ZW9mKFUxNikpIDwgMCkgeworCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBDb3VudCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobG9jYWxTYXZlZENyYXNoTXNnQ291bnQgIT0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCkgeworCQlMT0dFUlIoIlNhdmVkIE1lc3NhZ2UgQ291bnQgaW5jb3JyZWN0ICVkIiwKKwkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50KTsKKwkJUE9TVENPREVfTElOVVhfMyhDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQywKKwkJCQkgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgc2F2ZWQgY3Jhc2ggbWVzc2FnZSBvZmZzZXQgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCQkgICAgICAgU2F2ZWRDcmFzaE1zZ09mZnNldCksCisJCQkgICAgICAmbG9jYWxTYXZlZENyYXNoTXNnT2Zmc2V0LCBzaXplb2YoVTMyKSkgPCAwKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGdldCBTYXZlZCBNZXNzYWdlIE9mZnNldCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHlwZSA9PSBDUkFTSF9idXMpIHsKKwkJaWYgKHZpc29yY2hhbm5lbF93cml0ZShDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkgICAgICAgbG9jYWxTYXZlZENyYXNoTXNnT2Zmc2V0LAorCQkJCSAgICAgICBtc2csIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpIDwgMCkgeworCQkJTE9HRVJSKCJTQVZFX01TR19CVVNfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlQnVzTXNnISIpOworCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19CVVNfRkFJTFVSRV9QQywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAorCQkJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCQkJCSAgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0UpLCBtc2csCisJCQkJICAgICAgIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRSkpIDwgMCkgeworCQkJTE9HRVJSKCJTQVZFX01TR19ERVZfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlRGV2TXNnISIpOworCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19ERVZfRkFJTFVSRV9QQywKKwkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKTsKKworc3RhdGljIHZvaWQKK2J1c19yZXNwb25kZXIoQ09OVFJPTFZNX0lEIGNtZElkLCB1bG9uZyBidXNObywgaW50IHJlc3BvbnNlKQoreworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcCA9IE5VTEw7CisJQk9PTCBuZWVkX2NsZWFyID0gRkFMU0U7CisKKwlwID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvciBidXNObz0lbHUiLCBidXNObyk7CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3BvbnNlIDwgMCkgeworCQlpZiAoKGNtZElkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKSAmJgorCQkgICAgKHJlc3BvbnNlICE9ICgtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FKSkpCisJCQkvKiB1bmRvIHRoZSByb3cgd2UganVzdCBjcmVhdGVkLi4uICovCisJCQlkZWxidXNkZXZpY2VzKCZEZXZJbmZvTGlzdCwgYnVzTm8pOworCX0gZWxzZSB7CisJCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fQlVTX0NSRUFURSkKKwkJCXAtPnN0YXRlLmNyZWF0ZWQgPSAxOworCQlpZiAoY21kSWQgPT0gQ09OVFJPTFZNX0JVU19ERVNUUk9ZKQorCQkJbmVlZF9jbGVhciA9IFRSVUU7CisJfQorCisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJTE9HRVJSKCJidXNfcmVzcG9uZGVyIG5vIHBlbmRpbmcgbXNnIik7CisJCXJldHVybjsJCS8qIG5vIGNvbnRyb2x2bSByZXNwb25zZSBuZWVkZWQgKi8KKwl9CisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgIT0gKFUzMikgY21kSWQpIHsKKwkJTE9HRVJSKCJleHBlY3RlZD0lZCwgZm91bmQ9JWQiLCBjbWRJZCwgcC0+cGVuZGluZ01zZ0hkci5JZCk7CisJCXJldHVybjsKKwl9CisJY29udHJvbHZtX3Jlc3BvbmQoJnAtPnBlbmRpbmdNc2dIZHIsIHJlc3BvbnNlKTsKKwlwLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisJaWYgKG5lZWRfY2xlYXIpIHsKKwkJYnVzSW5mb19jbGVhcihwKTsKKwkJZGVsYnVzZGV2aWNlcygmRGV2SW5mb0xpc3QsIGJ1c05vKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKENPTlRST0xWTV9JRCBjbWRJZCwKKwkJCSAgICAgdWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UsCisJCQkgICAgIFVMVFJBX1NFR01FTlRfU1RBVEUgcmVzcG9uc2VTdGF0ZSkKK3sKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnAgPSBOVUxMOworCUNPTlRST0xWTV9NRVNTQUdFIG91dG1zZzsKKworCWlmICghQ29udHJvbFZtX2NoYW5uZWwpCisJCXJldHVybjsKKworCXAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvcjsgYnVzTm89JWx1LCBkZXZObz0lbHUiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm47CisJfQorCWlmIChwLT5wZW5kaW5nTXNnSGRyLklkID09IENPTlRST0xWTV9JTlZBTElEKSB7CisJCUxPR0VSUigiZGV2aWNlX3Jlc3BvbmRlciBubyBwZW5kaW5nIG1zZyIpOworCQlyZXR1cm47CQkvKiBubyBjb250cm9sdm0gcmVzcG9uc2UgbmVlZGVkICovCisJfQorCWlmIChwLT5wZW5kaW5nTXNnSGRyLklkICE9IGNtZElkKSB7CisJCUxPR0VSUigiZXhwZWN0ZWQ9JWQsIGZvdW5kPSVkIiwgY21kSWQsIHAtPnBlbmRpbmdNc2dIZHIuSWQpOworCQlyZXR1cm47CisJfQorCisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgJnAtPnBlbmRpbmdNc2dIZHIsIHJlc3BvbnNlKTsKKworCW91dG1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8gPSBidXNObzsKKwlvdXRtc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLmRldk5vID0gZGV2Tm87CisJb3V0bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSA9IHJlc3BvbnNlU3RhdGU7CisKKwlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkgeworCQlMT0dFUlIoInNpZ25hbGluc2VydCBmYWlsZWQhIik7CisJCXJldHVybjsKKwl9CisKKwlwLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfcmVzcG9uZGVyKENPTlRST0xWTV9JRCBjbWRJZCwgdWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpCit7CisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwID0gTlVMTDsKKwlCT09MIG5lZWRfY2xlYXIgPSBGQUxTRTsKKworCXAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvcjsgYnVzTm89JWx1LCBkZXZObz0lbHUiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm47CisJfQorCWlmIChyZXNwb25zZSA+PSAwKSB7CisJCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fREVWSUNFX0NSRUFURSkKKwkJCXAtPnN0YXRlLmNyZWF0ZWQgPSAxOworCQlpZiAoY21kSWQgPT0gQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZKQorCQkJbmVlZF9jbGVhciA9IFRSVUU7CisJfQorCisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJTE9HRVJSKCJkZXZpY2VfcmVzcG9uZGVyIG5vIHBlbmRpbmcgbXNnIik7CisJCXJldHVybjsJCS8qIG5vIGNvbnRyb2x2bSByZXNwb25zZSBuZWVkZWQgKi8KKwl9CisJaWYgKHAtPnBlbmRpbmdNc2dIZHIuSWQgIT0gKFUzMikgY21kSWQpIHsKKwkJTE9HRVJSKCJleHBlY3RlZD0lZCwgZm91bmQ9JWQiLCBjbWRJZCwgcC0+cGVuZGluZ01zZ0hkci5JZCk7CisJCXJldHVybjsKKwl9CisJY29udHJvbHZtX3Jlc3BvbmQoJnAtPnBlbmRpbmdNc2dIZHIsIHJlc3BvbnNlKTsKKwlwLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisJaWYgKG5lZWRfY2xlYXIpCisJCWRldkluZm9fY2xlYXIocCk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZXBpbG9nKFUzMiBidXNObywKKwkgICBVMzIgY21kLCBDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkciwKKwkgICBpbnQgcmVzcG9uc2UsIEJPT0wgbmVlZFJlc3BvbnNlKQoreworCUJPT0wgbm90aWZpZWQgPSBGQUxTRTsKKworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCisJaWYgKCFwQnVzSW5mbykgeworCQlMT0dFUlIoIkhVSD8gYmFkIGJ1c05vPSVkIiwgYnVzTm8pOworCQlyZXR1cm47CisJfQorCWlmIChuZWVkUmVzcG9uc2UpIHsKKwkJbWVtY3B5KCZwQnVzSW5mby0+cGVuZGluZ01zZ0hkciwgbXNnSGRyLAorCQkgICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCX0gZWxzZQorCQlwQnVzSW5mby0+cGVuZGluZ01zZ0hkci5JZCA9IENPTlRST0xWTV9JTlZBTElEOworCisJTE9DS1NFTV9VTklOVEVSUlVQVElCTEUoJk5vdGlmaWVyTG9jayk7CisJaWYgKHJlc3BvbnNlID09IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKKwkJCS8qIFdlIGNhbid0IHRlbGwgZnJvbSB0aGUgYnVzX2NyZWF0ZQorCQkJKiBpbmZvcm1hdGlvbiB3aGljaCBvZiBvdXIgMiBidXMgZmxhdm9ycyB0aGUKKwkJCSogZGV2aWNlcyBvbiB0aGlzIGJ1cyB3aWxsIHVsdGltYXRlbHkgZW5kIHVwLgorCQkJKiBGT1JUVU5BVEVMWSwgaXQgdHVybnMgb3V0IGl0IGlzIGhhcm1sZXNzIHRvCisJCQkqIHNlbmQgdGhlIGJ1c19jcmVhdGUgdG8gYm90aCBvZiB0aGVtLiAgV2UgY2FuCisJCQkqIG5hcnJvdyB0aGluZ3MgZG93biBhIGxpdHRsZSBiaXQsIHRob3VnaCwKKwkJCSogYmVjYXVzZSB3ZSBrbm93OiAtIEJ1c0Rldl9TZXJ2ZXIgY2FuIGhhbmRsZQorCQkJKiBlaXRoZXIgc2VydmVyIG9yIGNsaWVudCBkZXZpY2VzCisJCQkqIC0gQnVzRGV2X0NsaWVudCBjYW4gaGFuZGxlIE9OTFkgY2xpZW50CisJCQkqIGRldmljZXMgKi8KKwkJCWlmIChCdXNEZXZfU2VydmVyX05vdGlmaWVycy5idXNfY3JlYXRlKSB7CisJCQkJKCpCdXNEZXZfU2VydmVyX05vdGlmaWVycy5idXNfY3JlYXRlKSAoYnVzTm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWlmICgoIXBCdXNJbmZvLT5mbGFncy5zZXJ2ZXIpIC8qY2xpZW50ICovICYmCisJCQkgICAgQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgeworCQkJCSgqQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgKGJ1c05vKTsKKwkJCQlub3RpZmllZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6CisJCQlpZiAoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKkJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzTm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWlmICgoIXBCdXNJbmZvLT5mbGFncy5zZXJ2ZXIpIC8qY2xpZW50ICovICYmCisJCQkgICAgQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKkJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzTm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChub3RpZmllZCkKKwkJLyogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGp1c3QgY2FsbGVkIGFib3ZlIGlzIHJlc3BvbnNpYmxlCisJCSAqIGZvciBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMKKwkJICogZnVuY3Rpb24sIHdoaWNoIHdpbGwgY2FsbCBidXNfcmVzcG9uZGVyKCkKKwkJICovCisJCTsKKwllbHNlCisJCWJ1c19yZXNwb25kZXIoY21kLCBidXNObywgcmVzcG9uc2UpOworCVVOTE9DS1NFTSgmTm90aWZpZXJMb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2RldmljZV9lcGlsb2coVTMyIGJ1c05vLCBVMzIgZGV2Tm8sIFVMVFJBX1NFR01FTlRfU1RBVEUgc3RhdGUsIFUzMiBjbWQsCisJICAgICAgQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIsIGludCByZXNwb25zZSwKKwkgICAgICBCT09MIG5lZWRSZXNwb25zZSwgQk9PTCBmb3Jfdmlzb3JidXMpCit7CisJVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycyA9IE5VTEw7CisJQk9PTCBub3RpZmllZCA9IEZBTFNFOworCisJVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpwRGV2SW5mbyA9CisJCWZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWNoYXIgKmVudnBbXSA9IHsKKwkJIlNQQVJTUF9ESUFHUE9PTF9QQVVTRURfU1RBVEUgPSAxIiwKKwkJTlVMTAorCX07CisKKwlpZiAoIXBEZXZJbmZvKSB7CisJCUxPR0VSUigiSFVIPyBiYWQgYnVzTm89JWQsIGRldk5vPSVkIiwgYnVzTm8sIGRldk5vKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZm9yX3Zpc29yYnVzKQorCQlub3RpZmllcnMgPSAmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnM7CisJZWxzZQorCQlub3RpZmllcnMgPSAmQnVzRGV2X0NsaWVudF9Ob3RpZmllcnM7CisJaWYgKG5lZWRSZXNwb25zZSkgeworCQltZW1jcHkoJnBEZXZJbmZvLT5wZW5kaW5nTXNnSGRyLCBtc2dIZHIsCisJCSAgICAgICBzaXplb2YoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSKSk7CisJfSBlbHNlCisJCXBEZXZJbmZvLT5wZW5kaW5nTXNnSGRyLklkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisKKwlMT0NLU0VNX1VOSU5URVJSVVBUSUJMRSgmTm90aWZpZXJMb2NrKTsKKwlpZiAocmVzcG9uc2UgPj0gMCkgeworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFOgorCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX2NyZWF0ZSkgeworCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfY3JlYXRlKSAoYnVzTm8sIGRldk5vKTsKKwkJCQlub3RpZmllZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOgorCQkJLyogU2VydmVyUmVhZHkgLyBTZXJ2ZXJSdW5uaW5nIC8gU2VnbWVudFN0YXRlUnVubmluZyAqLworCQkJaWYgKHN0YXRlLkFsaXZlID09IFNlZ21lbnRTdGF0ZVJ1bm5pbmcuQWxpdmUgJiYKKwkJCSAgICBzdGF0ZS5PcGVyYXRpbmcgPT0gU2VnbWVudFN0YXRlUnVubmluZy5PcGVyYXRpbmcpIHsKKwkJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfcmVzdW1lKSB7CisJCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfcmVzdW1lKSAoYnVzTm8sCisJCQkJCQkJCSAgICAgZGV2Tm8pOworCQkJCQlub3RpZmllZCA9IFRSVUU7CisJCQkJfQorCQkJfQorCQkJLyogU2VydmVyTm90UmVhZHkgLyBTZXJ2ZXJMb3N0IC8gU2VnbWVudFN0YXRlU3RhbmRieSAqLworCQkJZWxzZSBpZiAoc3RhdGUuQWxpdmUgPT0gU2VnbWVudFN0YXRlU3RhbmRieS5BbGl2ZSAmJgorCQkJCSBzdGF0ZS5PcGVyYXRpbmcgPT0KKwkJCQkgU2VnbWVudFN0YXRlU3RhbmRieS5PcGVyYXRpbmcpIHsKKwkJCQkvKiB0ZWNobmljYWxseSB0aGlzIGlzIHN0YW5kYnkgY2FzZQorCQkJCSAqIHdoZXJlIHNlcnZlciBpcyBsb3N0CisJCQkJICovCisJCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX3BhdXNlKSB7CisJCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIChidXNObywKKwkJCQkJCQkJICAgIGRldk5vKTsKKwkJCQkJbm90aWZpZWQgPSBUUlVFOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RhdGUuQWxpdmUgPT0gU2VnbWVudFN0YXRlUGF1c2VkLkFsaXZlICYmCisJCQkJICAgc3RhdGUuT3BlcmF0aW5nID09CisJCQkJICAgU2VnbWVudFN0YXRlUGF1c2VkLk9wZXJhdGluZykgeworCQkJCS8qIHRoaXMgaXMgbGl0ZSBwYXVzZSB3aGVyZSBjaGFubmVsIGlzCisJCQkJICogc3RpbGwgdmFsaWQganVzdCAncGF1c2UnIG9mIGl0CisJCQkJICovCisJCQkJaWYgKGJ1c05vID09IGdfZGlhZ3Bvb2xCdXNObworCQkJCSAgICAmJiBkZXZObyA9PSBnX2RpYWdwb29sRGV2Tm8pIHsKKwkJCQkJTE9HSU5GKCJERVZJQ0VfQ0hBTkdFU1RBVEUoRGlhZ3Bvb2xDaGFubmVsIGJ1c05vPSVkIGRldk5vPSVkIGlzIHBhdXNpbmcuLi4pIiwKKwkJCQkJICAgICBidXNObywgZGV2Tm8pOworCQkJCQkvKiB0aGlzIHdpbGwgdHJpZ2dlciB0aGUKKwkJCQkJICogZGlhZ19zaHV0ZG93bi5zaCBzY3JpcHQgaW4KKwkJCQkJICogdGhlIHZpc29yY2hpcHNldCBob3RwbHVnICovCisJCQkJCWtvYmplY3RfdWV2ZW50X2VudgorCQkJCQkgICAgKCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi4KKwkJCQkJICAgICBrb2JqLCBLT0JKX09OTElORSwgZW52cCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgorCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIHsKKwkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIChidXNObywgZGV2Tm8pOworCQkJCW5vdGlmaWVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChub3RpZmllZCkKKwkJLyogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGp1c3QgY2FsbGVkIGFib3ZlIGlzIHJlc3BvbnNpYmxlCisJCSAqIGZvciBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMKKwkJICogZnVuY3Rpb24sIHdoaWNoIHdpbGwgY2FsbCBkZXZpY2VfcmVzcG9uZGVyKCkKKwkJICovCisJCTsKKwllbHNlCisJCWRldmljZV9yZXNwb25kZXIoY21kLCBidXNObywgZGV2Tm8sIHJlc3BvbnNlKTsKKwlVTkxPQ0tTRU0oJk5vdGlmaWVyTG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfY3JlYXRlKENPTlRST0xWTV9NRVNTQUdFICppbm1zZykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy0+Y21kOworCXVsb25nIGJ1c05vID0gY21kLT5jcmVhdGVCdXMuYnVzTm87CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKwlWSVNPUkNISVBTRVRfQlVTX0lORk8gKnBCdXNJbmZvID0gTlVMTDsKKworCisJcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmIChwQnVzSW5mbyAmJiAocEJ1c0luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGJ1cyAlbHUgYWxyZWFkeSBleGlzdHMiLAorCQkgICAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKKwkJZ290byBBd2F5OworCX0KKwlwQnVzSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKFZJU09SQ0hJUFNFVF9CVVNfSU5GTyksIEdGUF9LRVJORUwpOworCWlmIChwQnVzSW5mbyA9PSBOVUxMKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWx1IGt6YWxsb2MgZmFpbGVkIiwKKwkJICAgICAgIGJ1c05vKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRDsKKwkJZ290byBBd2F5OworCX0KKworCUlOSVRfTElTVF9IRUFEKCZwQnVzSW5mby0+ZW50cnkpOworCXBCdXNJbmZvLT5idXNObyA9IGJ1c05vOworCXBCdXNJbmZvLT5kZXZObyA9IGNtZC0+Y3JlYXRlQnVzLmRldmljZUNvdW50OworCisJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VOVFJZX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlpZiAoaW5tc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSA9PSAxKQorCQlwQnVzSW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFRlc3Q7CisJZWxzZQorCQlwQnVzSW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFBoeXNpY2FsOworCisJcEJ1c0luZm8tPmZsYWdzLnNlcnZlciA9IGlubXNnLT5oZHIuRmxhZ3Muc2VydmVyOworCXBCdXNJbmZvLT5jaGFuSW5mby5jaGFubmVsQWRkciA9IGNtZC0+Y3JlYXRlQnVzLmNoYW5uZWxBZGRyOworCXBCdXNJbmZvLT5jaGFuSW5mby5uQ2hhbm5lbEJ5dGVzID0gY21kLT5jcmVhdGVCdXMuY2hhbm5lbEJ5dGVzOworCXBCdXNJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQgPSBjbWQtPmNyZWF0ZUJ1cy5idXNEYXRhVHlwZUd1aWQ7CisJcEJ1c0luZm8tPmNoYW5JbmZvLmNoYW5uZWxJbnN0R3VpZCA9IGNtZC0+Y3JlYXRlQnVzLmJ1c0luc3RHdWlkOworCisJbGlzdF9hZGQoJnBCdXNJbmZvLT5lbnRyeSwgJkJ1c0luZm9MaXN0KTsKKworCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKK0F3YXk6CisJYnVzX2VwaWxvZyhidXNObywgQ09OVFJPTFZNX0JVU19DUkVBVEUsICZpbm1zZy0+aGRyLAorCQkgICByYywgaW5tc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID09IDEpOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Rlc3Ryb3koQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmRlc3Ryb3lCdXMuYnVzTm87CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwQnVzSW5mbzsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcEJ1c0luZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBidXMgJWx1IGludmFsaWQiLCBidXNObyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogYnVzICVsdSBhbHJlYWR5IGRlc3Ryb3llZCIsCisJCSAgICAgYnVzTm8pOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCWdvdG8gQXdheTsKKwl9CisKK0F3YXk6CisJYnVzX2VwaWxvZyhidXNObywgQ09OVFJPTFZNX0JVU19ERVNUUk9ZLCAmaW5tc2ctPmhkciwKKwkJICAgcmMsIGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9PSAxKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19jb25maWd1cmUoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnLCBQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eCkKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy0+Y21kOworCXVsb25nIGJ1c05vID0gY21kLT5jb25maWd1cmVCdXMuYnVzTm87CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwQnVzSW5mbyA9IE5VTEw7CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKwljaGFyIHNbOTldOworCisJYnVzTm8gPSBjbWQtPmNvbmZpZ3VyZUJ1cy5idXNObzsKKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCXBCdXNJbmZvID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlpZiAoIXBCdXNJbmZvKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBidXMgJWx1IGludmFsaWQiLAorCQkgICAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBJbnZhbGlkIGJ1cyAlbHUgLSBub3QgY3JlYXRlZCB5ZXQiLAorCQkgICAgIGJ1c05vKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwkvKiBUQkQgLSBhZGQgdGhpcyBjaGVjayB0byBvdGhlciBjb21tYW5kcyBhbHNvLi4uICovCisJaWYgKHBCdXNJbmZvLT5wZW5kaW5nTXNnSGRyLklkICE9IENPTlRST0xWTV9JTlZBTElEKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBidXMgJWx1IE1zZ0lkPSV1IG91dHN0YW5kaW5nIiwKKwkJICAgICBidXNObywgKHVpbnQpIHBCdXNJbmZvLT5wZW5kaW5nTXNnSGRyLklkKTsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVDsKKwkJZ290byBBd2F5OworCX0KKworCXBCdXNJbmZvLT5wYXJ0aXRpb25IYW5kbGUgPSBjbWQtPmNvbmZpZ3VyZUJ1cy5ndWVzdEhhbmRsZTsKKwlwQnVzSW5mby0+cGFydGl0aW9uR3VpZCA9IHBhcnNlcl9pZF9nZXQocGFyc2VyX2N0eCk7CisJcGFyc2VyX3BhcmFtX3N0YXJ0KHBhcnNlcl9jdHgsIFBBUlNFUlNUUklOR19OQU1FKTsKKwlwQnVzSW5mby0+bmFtZSA9IHBhcnNlcl9zdHJpbmdfZ2V0KHBhcnNlcl9jdHgpOworCisJdmlzb3JjaGFubmVsX0dVSURfaWQoJnBCdXNJbmZvLT5wYXJ0aXRpb25HdWlkLCBzKTsKKwlwQnVzSW5mby0+cHJvY09iamVjdCA9CisJICAgIHZpc29yX3Byb2NfQ3JlYXRlT2JqZWN0KFBhcnRpdGlvblR5cGUsIHMsICh2b2lkICopIChwQnVzSW5mbykpOworCWlmIChwQnVzSW5mby0+cHJvY09iamVjdCA9PSBOVUxMKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBidXNObz0lbHUgZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeSIsCisJCSAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOworCQlnb3RvIEF3YXk7CisJfQorCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CitBd2F5OgorCWJ1c19lcGlsb2coYnVzTm8sIENPTlRST0xWTV9CVVNfQ09ORklHVVJFLCAmaW5tc2ctPmhkciwKKwkJICAgcmMsIGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9PSAxKTsKK30KKworc3RhdGljIHZvaWQKK215X2RldmljZV9jcmVhdGUoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmNyZWF0ZURldmljZS5idXNObzsKKwl1bG9uZyBkZXZObyA9IGNtZC0+Y3JlYXRlRGV2aWNlLmRldk5vOworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcERldkluZm8gPSBOVUxMOworCVZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqcEJ1c0luZm8gPSBOVUxMOworCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisKKwlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmIChwRGV2SW5mbyAmJiAocERldkluZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGFscmVhZHkgZXhpc3RzIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCWdvdG8gQXdheTsKKwl9CisJcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcEJ1c0luZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IEludmFsaWQgYnVzICVsdSAtIG91dCBvZiByYW5nZSIsCisJCSAgICAgYnVzTm8pOworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwlpZiAocEJ1c0luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogSW52YWxpZCBidXMgJWx1IC0gbm90IGNyZWF0ZWQgeWV0IiwKKwkJICAgICBidXNObyk7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCXBEZXZJbmZvID0ga3phbGxvYyhzaXplb2YoVklTT1JDSElQU0VUX0RFVklDRV9JTkZPKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBEZXZJbmZvID09IE5VTEwpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGttYWxvYyBmYWlsZWQiLAorCQkgICAgIGJ1c05vLCBkZXZObyk7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOworCQlnb3RvIEF3YXk7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnBEZXZJbmZvLT5lbnRyeSk7CisJcERldkluZm8tPmJ1c05vID0gYnVzTm87CisJcERldkluZm8tPmRldk5vID0gZGV2Tm87CisJcERldkluZm8tPmRldkluc3RHdWlkID0gY21kLT5jcmVhdGVEZXZpY2UuZGV2SW5zdEd1aWQ7CisJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VOVFJZX1BDLCBkZXZObywgYnVzTm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwlpZiAoaW5tc2ctPmhkci5GbGFncy50ZXN0TWVzc2FnZSA9PSAxKQorCQlwRGV2SW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFRlc3Q7CisJZWxzZQorCQlwRGV2SW5mby0+Y2hhbkluZm8uYWRkclR5cGUgPSBBRERSVFlQRV9sb2NhbFBoeXNpY2FsOworCXBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsQWRkciA9IGNtZC0+Y3JlYXRlRGV2aWNlLmNoYW5uZWxBZGRyOworCXBEZXZJbmZvLT5jaGFuSW5mby5uQ2hhbm5lbEJ5dGVzID0gY21kLT5jcmVhdGVEZXZpY2UuY2hhbm5lbEJ5dGVzOworCXBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQgPSBjbWQtPmNyZWF0ZURldmljZS5kYXRhVHlwZUd1aWQ7CisJcERldkluZm8tPmNoYW5JbmZvLmludHIgPSBjbWQtPmNyZWF0ZURldmljZS5pbnRyOworCWxpc3RfYWRkKCZwRGV2SW5mby0+ZW50cnksICZEZXZJbmZvTGlzdCk7CisJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VYSVRfUEMsIGRldk5vLCBidXNObywKKwkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKK0F3YXk6CisJLyogZ2V0IHRoZSBidXMgYW5kIGRldk5vIGZvciBEaWFnUG9vbCBjaGFubmVsICovCisJaWYgKGlzX2RpYWdwb29sX2NoYW5uZWwocERldkluZm8tPmNoYW5JbmZvLmNoYW5uZWxUeXBlR3VpZCkpIHsKKwkJZ19kaWFncG9vbEJ1c05vID0gYnVzTm87CisJCWdfZGlhZ3Bvb2xEZXZObyA9IGRldk5vOworCQlMT0dJTkYoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIGZvciBEaWFnUG9vbCBjaGFubmVsOiBidXNObz0lbHUsIGRldk5vPSVsdSIsCisJCSAgICAgZ19kaWFncG9vbEJ1c05vLCBnX2RpYWdwb29sRGV2Tm8pOworCX0KKwlkZXZpY2VfZXBpbG9nKGJ1c05vLCBkZXZObywgU2VnbWVudFN0YXRlUnVubmluZywKKwkJICAgICAgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsICZpbm1zZy0+aGRyLCByYywKKwkJICAgICAgaW5tc2ctPmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkID09IDEsCisJCSAgICAgIEZPUl9WSVNPUkJVUyhwRGV2SW5mby0+Y2hhbkluZm8uY2hhbm5lbFR5cGVHdWlkKSk7Cit9CisKK3N0YXRpYyB2b2lkCitteV9kZXZpY2VfY2hhbmdlc3RhdGUoQ09OVFJPTFZNX01FU1NBR0UgKmlubXNnKQoreworCUNPTlRST0xWTV9NRVNTQUdFX1BBQ0tFVCAqY21kID0gJmlubXNnLT5jbWQ7CisJdWxvbmcgYnVzTm8gPSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmJ1c05vOworCXVsb25nIGRldk5vID0gY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObzsKKwlVTFRSQV9TRUdNRU5UX1NUQVRFIHN0YXRlID0gY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZTsKKwlWSVNPUkNISVBTRVRfREVWSUNFX0lORk8gKnBEZXZJbmZvID0gTlVMTDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJcERldkluZm8gPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXBEZXZJbmZvKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGludmFsaWQgKGRvZXNuJ3QgZXhpc3QpIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCWlmIChwRGV2SW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGludmFsaWQgKG5vdCBjcmVhdGVkKSIsCisJCSAgICAgYnVzTm8sIGRldk5vKTsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ0hBTkdFU1RBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwl9CitBd2F5OgorCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgcERldkluZm8pCisJCWRldmljZV9lcGlsb2coYnVzTm8sIGRldk5vLCBzdGF0ZSwgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKKwkJCSAgICAgICZpbm1zZy0+aGRyLCByYywKKwkJCSAgICAgIGlubXNnLT5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCA9PSAxLAorCQkJICAgICAgRk9SX1ZJU09SQlVTKHBEZXZJbmZvLT5jaGFuSW5mby5jaGFubmVsVHlwZUd1aWQpKTsKK30KKworc3RhdGljIHZvaWQKK215X2RldmljZV9kZXN0cm95KENPTlRST0xWTV9NRVNTQUdFICppbm1zZykKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy0+Y21kOworCXVsb25nIGJ1c05vID0gY21kLT5kZXN0cm95RGV2aWNlLmJ1c05vOworCXVsb25nIGRldk5vID0gY21kLT5kZXN0cm95RGV2aWNlLmRldk5vOworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcERldkluZm8gPSBOVUxMOworCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CisKKwlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcERldkluZm8pIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiBidXNObz0lbHUsIGRldk5vPSVsdSBpbnZhbGlkIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwlpZiAocERldkluZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGFscmVhZHkgZGVzdHJveWVkIiwKKwkJICAgICBidXNObywgZGV2Tm8pOworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJfQorCitBd2F5OgorCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgcERldkluZm8pCisJCWRldmljZV9lcGlsb2coYnVzTm8sIGRldk5vLCBTZWdtZW50U3RhdGVSdW5uaW5nLAorCQkJICAgICAgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCAmaW5tc2ctPmhkciwgcmMsCisJCQkgICAgICBpbm1zZy0+aGRyLkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgPT0gMSwKKwkJCSAgICAgIEZPUl9WSVNPUkJVUyhwRGV2SW5mby0+Y2hhbkluZm8uY2hhbm5lbFR5cGVHdWlkKSk7Cit9CisKKy8qIFdoZW4gcHJvdmlkZWQgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29udHJvbHZtIGNoYW5uZWwKKyAqIChwaHlzX2FkZHIpLCB0aGUgb2Zmc2V0IHRvIHRoZSBwYXlsb2FkIGFyZWEgd2UgbmVlZCB0byBtYW5hZ2UKKyAqIChvZmZzZXQpLCBhbmQgdGhlIHNpemUgb2YgdGhpcyBwYXlsb2FkIGFyZWEgKGJ5dGVzKSwgZmlsbHMgaW4gdGhlCisgKiBDT05UUk9MVk1fUEFZTE9BRF9JTkZPIHN0cnVjdC4gIFJldHVybnMgVFJVRSBmb3Igc3VjY2VzcyBvciBGQUxTRQorICogZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK2luaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWRfaW5mbyhIT1NUQUREUkVTUyBwaHlzX2FkZHIsIFU2NCBvZmZzZXQsIFUzMiBieXRlcywKKwkJCQkgIENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCit7CisJVTggX19pb21lbSAqcGF5bG9hZCA9IE5VTEw7CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKworCWlmIChpbmZvID09IE5VTEwpIHsKKwkJTE9HRVJSKCJIVUggPyBDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZCA6IFByb2dyYW1tZXIgY2hlY2sgYXQgJXM6JWQiLAorCQkgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX1BBWUxPQURfSU5WQUxJRDsKKwkJZ290byBBd2F5OworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKENPTlRST0xWTV9QQVlMT0FEX0lORk8pKTsKKwlpZiAoKG9mZnNldCA9PSAwKSB8fCAoYnl0ZXMgPT0gMCkpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZDogUmVxdWVzdFBheWxvYWRPZmZzZXQ9JWxsdSBSZXF1ZXN0UGF5bG9hZEJ5dGVzPSVsbHUhIiwKKwkJICAgICAodTY0KSBvZmZzZXQsICh1NjQpIGJ5dGVzKTsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElEOworCQlnb3RvIEF3YXk7CisJfQorCXBheWxvYWQgPSBpb3JlbWFwX2NhY2hlKHBoeXNfYWRkciArIG9mZnNldCwgYnl0ZXMpOworCWlmIChwYXlsb2FkID09IE5VTEwpIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZDogaW9yZW1hcF9jYWNoZSAlbGx1IGZvciAlbGx1IGJ5dGVzIGZhaWxlZCIsCisJCSAgICAgKHU2NCkgb2Zmc2V0LCAodTY0KSBieXRlcyk7CisJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0lPUkVNQVBfRkFJTEVEOworCQlnb3RvIEF3YXk7CisJfQorCisJaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OworCWluZm8tPmJ5dGVzID0gYnl0ZXM7CisJaW5mby0+cHRyID0gcGF5bG9hZDsKKwlMT0dJTkYoIm9mZnNldD0lbGx1LCBieXRlcz0lbHUsIHB0cj0lcCIsCisJICAgICAgICh1NjQpIChpbmZvLT5vZmZzZXQpLCAodWxvbmcpIChpbmZvLT5ieXRlcyksIGluZm8tPnB0cik7CisKK0F3YXk6CisJaWYgKHJjIDwgMCkgeworCQlpZiAocGF5bG9hZCAhPSBOVUxMKSB7CisJCQlpb3VubWFwKHBheWxvYWQpOworCQkJcGF5bG9hZCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCit7CisJaWYgKGluZm8tPnB0ciAhPSBOVUxMKSB7CisJCWlvdW5tYXAoaW5mby0+cHRyKTsKKwkJaW5mby0+cHRyID0gTlVMTDsKKwl9CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihDT05UUk9MVk1fUEFZTE9BRF9JTkZPKSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0aWFsaXplX2NvbnRyb2x2bV9wYXlsb2FkKHZvaWQpCit7CisJSE9TVEFERFJFU1MgcGh5c19hZGRyID0gdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihDb250cm9sVm1fY2hhbm5lbCk7CisJVTY0IHBheWxvYWRPZmZzZXQgPSAwOworCVUzMiBwYXlsb2FkQnl0ZXMgPSAwOworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgICAgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgICAgICBSZXF1ZXN0UGF5bG9hZE9mZnNldCksCisJCQkgICAgICAmcGF5bG9hZE9mZnNldCwgc2l6ZW9mKHBheWxvYWRPZmZzZXQpKSA8IDApIHsKKwkJTE9HRVJSKCJDT05UUk9MVk1fUEFZTE9BRF9JTklUIEZhaWxlZCB0byByZWFkIGNvbnRyb2x2bSBjaGFubmVsISIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENPTlRST0xWTV9JTklUX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgICAgIFJlcXVlc3RQYXlsb2FkQnl0ZXMpLAorCQkJICAgICAgJnBheWxvYWRCeXRlcywgc2l6ZW9mKHBheWxvYWRCeXRlcykpIDwgMCkgeworCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkIHRvIHJlYWQgY29udHJvbHZtIGNoYW5uZWwhIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKwlpbml0aWFsaXplX2NvbnRyb2x2bV9wYXlsb2FkX2luZm8ocGh5c19hZGRyLAorCQkJCQkgIHBheWxvYWRPZmZzZXQsIHBheWxvYWRCeXRlcywKKwkJCQkJICAmQ29udHJvbFZtX3BheWxvYWRfaW5mbyk7Cit9CisKKy8qICBTZW5kIEFDVElPTj1vbmxpbmUgZm9yIERFVlBBVEg9L3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldC4KKyAqICBSZXR1cm5zIENPTlRST0xWTV9SRVNQX3h4eCBjb2RlLgorICovCitpbnQKK3Zpc29yY2hpcHNldF9jaGlwc2V0X3JlYWR5KHZvaWQpCit7CisJa29iamVjdF91ZXZlbnQoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfT05MSU5FKTsKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9jaGlwc2V0X3JlYWR5KTsKKworaW50Cit2aXNvcmNoaXBzZXRfY2hpcHNldF9zZWxmdGVzdCh2b2lkKQoreworCWNoYXIgZW52X3NlbGZ0ZXN0WzIwXTsKKwljaGFyICplbnZwW10gPSB7IGVudl9zZWxmdGVzdCwgTlVMTCB9OworCXNwcmludGYoZW52X3NlbGZ0ZXN0LCAiU1BBUlNQX1NFTEZURVNUPSVkIiwgMSk7CisJa29iamVjdF91ZXZlbnRfZW52KCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX0NIQU5HRSwKKwkJCSAgIGVudnApOworCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2NoaXBzZXRfc2VsZnRlc3QpOworCisvKiAgU2VuZCBBQ1RJT049b2ZmbGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgorICogIFJldHVybnMgQ09OVFJPTFZNX1JFU1BfeHh4IGNvZGUuCisgKi8KK2ludAordmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkodm9pZCkKK3sKKwlrb2JqZWN0X3VldmVudCgmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9PRkZMSU5FKTsKKwlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9jaGlwc2V0X25vdHJlYWR5KTsKKworc3RhdGljIHZvaWQKK2NoaXBzZXRfcmVhZHkoQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSICptc2dIZHIpCit7CisJaW50IHJjID0gdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkoKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKKwkJcmMgPSAtcmM7CisJaWYgKG1zZ0hkci0+RmxhZ3MucmVzcG9uc2VFeHBlY3RlZCAmJiAhdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpCisJCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOworCWlmIChtc2dIZHItPkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQgJiYgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpIHsKKwkJLyogU2VuZCBDSElQU0VUX1JFQURZIHJlc3BvbnNlIHdoZW4gYWxsIG1vZHVsZXMgaGF2ZSBiZWVuIGxvYWRlZAorCQkgKiBhbmQgZGlza3MgbW91bnRlZCBmb3IgdGhlIHBhcnRpdGlvbgorCQkgKi8KKwkJZ19DaGlwU2V0TXNnSGRyID0gKm1zZ0hkcjsKKwkJTE9HSU5GKCJIb2xkaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGlwc2V0X3NlbGZ0ZXN0KENPTlRST0xWTV9NRVNTQUdFX0hFQURFUiAqbXNnSGRyKQoreworCWludCByYyA9IHZpc29yY2hpcHNldF9jaGlwc2V0X3NlbGZ0ZXN0KCk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpCisJCXJjID0gLXJjOworCWlmIChtc2dIZHItPkZsYWdzLnJlc3BvbnNlRXhwZWN0ZWQpCisJCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOworfQorCitzdGF0aWMgdm9pZAorY2hpcHNldF9ub3RyZWFkeShDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgKm1zZ0hkcikKK3sKKwlpbnQgcmMgPSB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSgpOworCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQorCQlyYyA9IC1yYzsKKwlpZiAobXNnSGRyLT5GbGFncy5yZXNwb25zZUV4cGVjdGVkKQorCQljb250cm9sdm1fcmVzcG9uZChtc2dIZHIsIHJjKTsKK30KKworLyogVGhpcyBpcyB5b3VyICJvbmUtc3RvcCIgc2hvcCBmb3IgZ3JhYmJpbmcgdGhlIG5leHQgbWVzc2FnZSBmcm9tIHRoZQorICogQ09OVFJPTFZNX1FVRVVFX0VWRU5UIHF1ZXVlIGluIHRoZSBjb250cm9sdm0gY2hhbm5lbC4KKyAqLworc3RhdGljIEJPT0wKK3JlYWRfY29udHJvbHZtX2V2ZW50KENPTlRST0xWTV9NRVNTQUdFICptc2cpCit7CisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkJICAgICAgQ09OVFJPTFZNX1FVRVVFX0VWRU5ULCBtc2cpKSB7CisJCS8qIGdvdCBhIG1lc3NhZ2UgKi8KKwkJaWYgKG1zZy0+aGRyLkZsYWdzLnRlc3RNZXNzYWdlID09IDEpIHsKKwkJCUxPR0VSUigiaWdub3JpbmcgYmFkIENPTlRST0xWTV9RVUVVRV9FVkVOVCBtc2cgd2l0aCBjb250cm9sdm1fbXNnX2lkPTB4JXggYmVjYXVzZSBGbGFncy50ZXN0TWVzc2FnZSBpcyBub25zZW5zaWNhbCAoPTEpIiwgbXNnLT5oZHIuSWQpOworCQkJcmV0dXJuIEZBTFNFOworCQl9IGVsc2UKKwkJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBUaGUgZ2VuZXJhbCBwYXJhaG90cGx1ZyBmbG93IHdvcmtzIGFzIGZvbGxvd3MuICBUaGUgdmlzb3JjaGlwc2V0CisgKiBkcml2ZXIgcmVjZWl2ZXMgYSBERVZJQ0VfQ0hBTkdFU1RBVEUgbWVzc2FnZSBmcm9tIENvbW1hbmQKKyAqIHNwZWNpZnlpbmcgYSBwaHlzaWNhbCBkZXZpY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuICBUaGUgQ09OVFJPTFZNCisgKiBtZXNzYWdlIGhhbmRsZXIgY2FsbHMgcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlLCB3aGljaCB0aGVuIGFkZHMKKyAqIHRoZSBtZXNzYWdlIHRvIGEgZ2xvYmFsIGxpc3QgYW5kIGtpY2tzIG9mZiBhIHVkZXYgZXZlbnQgd2hpY2gKKyAqIGNhdXNlcyBhIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQKKyAqIGRldmljZS4gIFRoZSB1ZGV2IHNjcmlwdCB0aGVuIHdyaXRlcyB0bworICogL3Byb2Mvdmlzb3JjaGlwc2V0L3BhcmFob3RwbHVnLCB3aGljaCBjYXVzZXMgcGFyYWhvdHBsdWdfcHJvY193cml0ZQorICogdG8gZ2V0IGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGFwcHJvcHJpYXRlIENPTlRST0xWTSBtZXNzYWdlIGlzCisgKiByZXRyaWV2ZWQgZnJvbSB0aGUgbGlzdCBhbmQgcmVzcG9uZGVkIHRvLgorICovCisKKyNkZWZpbmUgUEFSQUhPVFBMVUdfVElNRU9VVF9NUyAyMDAwCisKKy8qCisgKiBHZW5lcmF0ZSB1bmlxdWUgaW50IHRvIG1hdGNoIGFuIG91dHN0YW5kaW5nIENPTlRST0xWTSBtZXNzYWdlIHdpdGggYQorICogdWRldiBzY3JpcHQgL3Byb2MgcmVzcG9uc2UKKyAqLworc3RhdGljIGludAorcGFyYWhvdHBsdWdfbmV4dF9pZCh2b2lkKQoreworCXN0YXRpYyBhdG9taWNfdCBpZCA9IEFUT01JQ19JTklUKDApOworCXJldHVybiBhdG9taWNfaW5jX3JldHVybigmaWQpOworfQorCisvKgorICogUmV0dXJucyB0aGUgdGltZSAoaW4gamlmZmllcykgd2hlbiBhIENPTlRST0xWTSBtZXNzYWdlIG9uIHRoZSBsaXN0CisgKiBzaG91bGQgZXhwaXJlIC0tIFBBUkFIT1RQTFVHX1RJTUVPVVRfTVMgaW4gdGhlIGZ1dHVyZQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKHZvaWQpCit7CisJcmV0dXJuIGppZmZpZXMgKyBQQVJBSE9UUExVR19USU1FT1VUX01TICogSFogLyAxMDAwOworfQorCisvKgorICogQ3JlYXRlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdCwgd2hpY2ggaXMgYmFzaWNhbGx5IGEgd3JhcHBlciBmb3IgYQorICogQ09OVFJPTFZNX01FU1NBR0UgdGhhdCB3ZSBjYW4gc3RpY2sgb24gYSBsaXN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqCitwYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZShDT05UUk9MVk1fTUVTU0FHRSAqbXNnKQoreworCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQorCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCksCisJCSAgICBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWlmIChyZXEgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEtPmlkID0gcGFyYWhvdHBsdWdfbmV4dF9pZCgpOworCXJlcS0+ZXhwaXJhdGlvbiA9IHBhcmFob3RwbHVnX25leHRfZXhwaXJhdGlvbigpOworCXJlcS0+bXNnID0gKm1zZzsKKworCXJldHVybiByZXE7Cit9CisKKy8qCisgKiBGcmVlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQKK3BhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxKQoreworCWtmcmVlKHJlcSk7Cit9CisKKy8qCisgKiBDYXVzZSB1ZXZlbnQgdG8gcnVuIHRoZSB1c2VyIGxldmVsIHNjcmlwdCB0byBkbyB0aGUgZGlzYWJsZS9lbmFibGUKKyAqIHNwZWNpZmllZCBpbiAodGhlIENPTlRST0xWTSBtZXNzYWdlIGluKSB0aGUgc3BlY2lmaWVkCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYoc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSkKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZyZXEtPm1zZy5jbWQ7CisJY2hhciBlbnZfY21kWzQwXSwgZW52X2lkWzQwXSwgZW52X3N0YXRlWzQwXSwgZW52X2J1c1s0MF0sIGVudl9kZXZbNDBdLAorCSAgICBlbnZfZnVuY1s0MF07CisJY2hhciAqZW52cFtdID0geworCQllbnZfY21kLCBlbnZfaWQsIGVudl9zdGF0ZSwgZW52X2J1cywgZW52X2RldiwgZW52X2Z1bmMsIE5VTEwKKwl9OworCisJc3ByaW50ZihlbnZfY21kLCAiU1BBUl9QQVJBSE9UUExVRz0xIik7CisJc3ByaW50ZihlbnZfaWQsICJTUEFSX1BBUkFIT1RQTFVHX0lEPSVkIiwgcmVxLT5pZCk7CisJc3ByaW50ZihlbnZfc3RhdGUsICJTUEFSX1BBUkFIT1RQTFVHX1NUQVRFPSVkIiwKKwkJY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZS5BY3RpdmUpOworCXNwcmludGYoZW52X2J1cywgIlNQQVJfUEFSQUhPVFBMVUdfQlVTPSVkIiwKKwkJY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObyk7CisJc3ByaW50ZihlbnZfZGV2LCAiU1BBUl9QQVJBSE9UUExVR19ERVZJQ0U9JWQiLAorCQljbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vID4+IDMpOworCXNwcmludGYoZW52X2Z1bmMsICJTUEFSX1BBUkFIT1RQTFVHX0ZVTkNUSU9OPSVkIiwKKwkJY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObyAmIDB4Nyk7CisKKwlMT0dJTkYoInBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZjogc3RhdGU9JWQsIGJkZj0lZC8lZC8lZCwgaWQ9JXVcbiIsCisJICAgICAgIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUuQWN0aXZlLAorCSAgICAgICBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmJ1c05vLCBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vID4+IDMsCisJICAgICAgIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuZGV2Tm8gJiA3LCByZXEtPmlkKTsKKworCWtvYmplY3RfdWV2ZW50X2VudigmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCisJCQkgICBlbnZwKTsKK30KKworLyoKKyAqIFJlbW92ZSBhbnkgcmVxdWVzdCBmcm9tIHRoZSBsaXN0IHRoYXQncyBiZWVuIG9uIHRoZXJlIHRvbyBsb25nIGFuZAorICogcmVzcG9uZCB3aXRoIGFuIGVycm9yLgorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpIHsKKwkJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSA9CisJCSAgICBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QsIGxpc3QpOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCByZXEtPmV4cGlyYXRpb24pKSB7CisJCQlsaXN0X2RlbChwb3MpOworCQkJaWYgKHJlcS0+bXNnLmhkci5GbGFncy5yZXNwb25zZUV4cGVjdGVkKQorCQkJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoCisJCQkJCSZyZXEtPm1zZy5oZHIsCisJCQkJCUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9VREVWX1RJTUVPVVQsCisJCQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZSk7CisJCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSB0aGUgL3Byb2MgaGFuZGxlciwgd2hpY2ggbWVhbnMgdGhlIHVzZXIgc2NyaXB0IGhhcworICogZmluaXNoZWQgdGhlIGVuYWJsZS9kaXNhYmxlLiAgRmluZCB0aGUgbWF0Y2hpbmcgaWRlbnRpZmllciwgYW5kCisgKiByZXNwb25kIHRvIHRoZSBDT05UUk9MVk0gbWVzc2FnZSB3aXRoIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3BhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaW50IGlkLCBVMTYgYWN0aXZlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gTlVMTDsKKworCXNwaW5fbG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCisJLyogTG9vayBmb3IgYSByZXF1ZXN0IG1hdGNoaW5nICJpZCIuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CisJCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQorCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKKwkJaWYgKHJlcS0+aWQgPT0gaWQpIHsKKwkJCS8qIEZvdW5kIGEgbWF0Y2guICBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBhbmQKKwkJCSAqIHJlc3BvbmQuCisJCQkgKi8KKwkJCWxpc3RfZGVsKHBvcyk7CisJCQlzcGluX3VubG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQkJcmVxLT5tc2cuY21kLmRldmljZUNoYW5nZVN0YXRlLnN0YXRlLkFjdGl2ZSA9IGFjdGl2ZTsKKwkJCWlmIChyZXEtPm1zZy5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAorCQkJCQkmcmVxLT5tc2cuaGRyLCBDT05UUk9MVk1fUkVTUF9TVUNDRVNTLAorCQkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUpOworCQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIFBDSSBkZXZpY2UgYnkga2lja2luZyBvZmYgYSB1ZGV2IHNjcmlwdAorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKENPTlRST0xWTV9NRVNTQUdFICppbm1zZykKK3sKKwlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOworCisJcmVxID0gcGFyYWhvdHBsdWdfcmVxdWVzdF9jcmVhdGUoaW5tc2cpOworCisJaWYgKHJlcSA9PSBOVUxMKSB7CisJCUxPR0VSUigicGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlOiBjb3VsZG4ndCBhbGxvY2F0ZSByZXF1ZXN0Iik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5tc2ctPmNtZC5kZXZpY2VDaGFuZ2VTdGF0ZS5zdGF0ZS5BY3RpdmUpIHsKKwkJLyogRm9yIGVuYWJsZSBtZXNzYWdlcywganVzdCByZXNwb25kIHdpdGggc3VjY2VzcworCQkqIHJpZ2h0IGF3YXkuICBUaGlzIGlzIGEgYml0IG9mIGEgaGFjaywgYnV0IHRoZXJlIGFyZQorCQkqIGlzc3VlcyB3aXRoIHRoZSBlYXJseSBlbmFibGUgbWVzc2FnZXMgd2UgZ2V0ICh3aXRoCisJCSogZWl0aGVyIHRoZSB1ZGV2IHNjcmlwdCBub3QgZGV0ZWN0aW5nIHRoYXQgdGhlIGRldmljZQorCQkqIGlzIHVwLCBvciBub3QgZ2V0dGluZyBjYWxsZWQgYXQgYWxsKS4gIEZvcnR1bmF0ZWx5CisJCSogdGhlIG1lc3NhZ2VzIHRoYXQgZ2V0IGxvc3QgZG9uJ3QgbWF0dGVyIGFueXdheSwgYXMKKwkJKiBkZXZpY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgYXQKKwkJKiBpbml0aWFsaXphdGlvbi4KKwkJKi8KKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7CisJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoJmlubXNnLT5oZHIsCisJCQkJCQkgICAgICBDT05UUk9MVk1fUkVTUF9TVUNDRVNTLAorCQkJCQkJICAgICAgaW5tc2ctPmNtZC4KKwkJCQkJCSAgICAgIGRldmljZUNoYW5nZVN0YXRlLnN0YXRlKTsKKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7CisJfSBlbHNlIHsKKwkJLyogRm9yIGRpc2FibGUgbWVzc2FnZXMsIGFkZCB0aGUgcmVxdWVzdCB0byB0aGUKKwkJKiByZXF1ZXN0IGxpc3QgYmVmb3JlIGtpY2tpbmcgb2ZmIHRoZSB1ZGV2IHNjcmlwdC4gIEl0CisJCSogd29uJ3QgZ2V0IHJlc3BvbmRlZCB0byB1bnRpbCB0aGUgc2NyaXB0IGhhcworCQkqIGluZGljYXRlZCBpdCdzIGRvbmUuCisJCSovCisJCXNwaW5fbG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQlsaXN0X2FkZF90YWlsKCYocmVxLT5saXN0KSwgJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7CisJfQorfQorCisvKgorICogR2V0cyBjYWxsZWQgd2hlbiB0aGUgdWRldiBzY3JpcHQgd3JpdGVzIHRvCisgKiAvcHJvYy92aXNvcmNoaXBzZXQvcGFyYWhvdHBsdWcuICBFeHBlY3RzIGlucHV0IGluIHRoZSBmb3JtIG9mICI8aWQ+CisgKiA8YWN0aXZlPiIgd2hlcmUgPGlkPiBpcyB0aGUgaWRlbnRpZmllciBwYXNzZWQgdG8gdGhlIHNjcmlwdCB0aGF0CisgKiBtYXRjaGVzIGEgcmVxdWVzdCBvbiB0aGUgcmVxdWVzdCBsaXN0LCBhbmQgPGFjdGl2ZT4gaXMgMCBvciAxCisgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRldmljZSBpcyBub3cgZW5hYmxlZCBvciBub3QuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitwYXJhaG90cGx1Z19wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbNjRdOworCXVpbnQgaWQ7CisJdXNob3J0IGFjdGl2ZTsKKworCWlmIChjb3VudCA+IHNpemVvZihidWYpIC0gMSkgeworCQlMT0dFUlIoInBhcmFob3RwbHVnX3Byb2Nfd3JpdGU6IGNvdW50ICglZCkgZXhjZWVkcyBzaXplIG9mIGJ1ZmZlciAoJWQpIiwKKwkJICAgICAoaW50KSBjb3VudCwgKGludCkgc2l6ZW9mKGJ1ZikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKKwkJTE9HRVJSKCJwYXJhaG90cGx1Z19wcm9jX3dyaXRlOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJ1Zltjb3VudF0gPSAnXDAnOworCisJaWYgKHNzY2FuZihidWYsICIldSAlaHUiLCAmaWQsICZhY3RpdmUpICE9IDIpIHsKKwkJaWQgPSAwOworCQlhY3RpdmUgPSAwOworCX0KKworCWlmIChhY3RpdmUgIT0gMSAmJiBhY3RpdmUgIT0gMCkgeworCQlMT0dFUlIoInBhcmFob3RwbHVnX3Byb2Nfd3JpdGU6IGludmFsaWQgYWN0aXZlIGZpZWxkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoKGludCkgaWQsIChVMTYpIGFjdGl2ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhcmFob3RwbHVnX3Byb2NfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHZpc29yY2hpcHNldF9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IHBhcmFob3RwbHVnX3Byb2Nfd3JpdGUsCit9OworCisvKiBQcm9jZXNzIGEgY29udHJvbHZtIG1lc3NhZ2UuCisgKiBSZXR1cm4gcmVzdWx0OgorICogICAgRkFMU0UgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEZBTFNFIG9ubHkgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlCisgKiAgICAgICAgICAgIGNvbnRyb2x2bSBtZXNzYWdlIHdhcyBOT1QgcHJvY2Vzc2VkLCBidXQgcHJvY2Vzc2luZyBtdXN0IGJlCisgKiAgICAgICAgICAgIHJldHJpZWQgYmVmb3JlIHJlYWRpbmcgdGhlIG5leHQgY29udHJvbHZtIG1lc3NhZ2U7IGEKKyAqICAgICAgICAgICAgc2NlbmFyaW8gd2hlcmUgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiB3ZSBuZWVkIHRvIHRocm90dGxlCisgKiAgICAgICAgICAgIHRoZSBhbGxvY2F0aW9uIG9mIG1lbW9yeSBpbiB3aGljaCB0byBjb3B5IG91dCBjb250cm9sdm0KKyAqICAgICAgICAgICAgcGF5bG9hZCBkYXRhCisgKiAgICBUUlVFICAtIHByb2Nlc3Npbmcgb2YgdGhlIGNvbnRyb2x2bSBtZXNzYWdlIGNvbXBsZXRlZCwKKyAqICAgICAgICAgICAgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLgorICovCitzdGF0aWMgQk9PTAoraGFuZGxlX2NvbW1hbmQoQ09OVFJPTFZNX01FU1NBR0UgaW5tc2csIEhPU1RBRERSRVNTIGNoYW5uZWxfYWRkcikKK3sKKwlDT05UUk9MVk1fTUVTU0FHRV9QQUNLRVQgKmNtZCA9ICZpbm1zZy5jbWQ7CisJVTY0IHBhcmFtZXRlcnNBZGRyID0gMDsKKwlVMzIgcGFyYW1ldGVyc0J5dGVzID0gMDsKKwlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eCA9IE5VTEw7CisJQk9PTCBpc0xvY2FsQWRkciA9IEZBTFNFOworCUNPTlRST0xWTV9NRVNTQUdFIGFja21zZzsKKworCS8qIGNyZWF0ZSBwYXJzaW5nIGNvbnRleHQgaWYgbmVjZXNzYXJ5ICovCisJaXNMb2NhbEFkZHIgPSAoaW5tc2cuaGRyLkZsYWdzLnRlc3RNZXNzYWdlID09IDEpOworCWlmIChjaGFubmVsX2FkZHIgPT0gMCkgeworCQlMT0dFUlIoIkhVSD8gY2hhbm5lbF9hZGRyIGlzIDAhIik7CisJCXJldHVybiBUUlVFOworCX0KKwlwYXJhbWV0ZXJzQWRkciA9IGNoYW5uZWxfYWRkciArIGlubXNnLmhkci5QYXlsb2FkVm1PZmZzZXQ7CisJcGFyYW1ldGVyc0J5dGVzID0gaW5tc2cuaGRyLlBheWxvYWRCeXRlczsKKworCS8qIFBhcmFtZXRlciBhbmQgY2hhbm5lbCBhZGRyZXNzZXMgd2l0aGluIHRlc3QgbWVzc2FnZXMgYWN0dWFsbHkgbGllCisJICogd2l0aGluIG91ciBPUy1jb250cm9sbGVkIG1lbW9yeS4gIFdlIG5lZWQgdG8ga25vdyB0aGF0LCBiZWNhdXNlIGl0CisJICogbWFrZXMgYSBkaWZmZXJlbmNlIGluIGhvdyB3ZSBjb21wdXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJaWYgKHBhcmFtZXRlcnNBZGRyICE9IDAgJiYgcGFyYW1ldGVyc0J5dGVzICE9IDApIHsKKwkJQk9PTCByZXRyeSA9IEZBTFNFOworCQlwYXJzZXJfY3R4ID0KKwkJICAgIHBhcnNlcl9pbml0X2J5dGVTdHJlYW0ocGFyYW1ldGVyc0FkZHIsIHBhcmFtZXRlcnNCeXRlcywKKwkJCQkJICAgaXNMb2NhbEFkZHIsICZyZXRyeSk7CisJCWlmICghcGFyc2VyX2N0eCkgeworCQkJaWYgKHJldHJ5KSB7CisJCQkJTE9HV1JOKCJ0aHJvdHRsaW5nIHRvIGNvcHkgcGF5bG9hZCIpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCUxPR1dSTigicGFyc2luZyBmYWlsZWQiKTsKKwkJCUxPR1dSTigiaW5tc2cuaGRyLklkPTB4JWx4IiwgKHVsb25nKSBpbm1zZy5oZHIuSWQpOworCQkJTE9HV1JOKCJwYXJhbWV0ZXJzQWRkcj0weCVsbHgiLCAodTY0KSBwYXJhbWV0ZXJzQWRkcik7CisJCQlMT0dXUk4oInBhcmFtZXRlcnNCeXRlcz0lbHUiLCAodWxvbmcpIHBhcmFtZXRlcnNCeXRlcyk7CisJCQlMT0dXUk4oImlzTG9jYWxBZGRyPSVkIiwgaXNMb2NhbEFkZHIpOworCQl9CisJfQorCisJaWYgKCFpc0xvY2FsQWRkcikgeworCQljb250cm9sdm1faW5pdF9yZXNwb25zZSgmYWNrbXNnLCAmaW5tc2cuaGRyLAorCQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKKwkJaWYgKChDb250cm9sVm1fY2hhbm5lbCkKKwkJICAgICYmCisJCSAgICAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQKKwkJICAgICAoQ29udHJvbFZtX2NoYW5uZWwsIENPTlRST0xWTV9RVUVVRV9BQ0ssICZhY2ttc2cpKSkKKwkJCUxPR1dSTigiZmFpbGVkIHRvIHNlbmQgQUNLIGZhaWxlZCIpOworCX0KKwlzd2l0Y2ggKGlubXNnLmhkci5JZCkgeworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfSU5JVDoKKwkJTE9HSU5GKCJDSElQU0VUX0lOSVQoI2J1c3Nlcz0lbHUsI3N3aXRjaGVzPSVsdSkiLAorCQkgICAgICAgKHVsb25nKSBpbm1zZy5jbWQuaW5pdENoaXBzZXQuYnVzQ291bnQsCisJCSAgICAgICAodWxvbmcpIGlubXNnLmNtZC5pbml0Q2hpcHNldC5zd2l0Y2hDb3VudCk7CisJCWNoaXBzZXRfaW5pdCgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9CVVNfQ1JFQVRFOgorCQlMT0dJTkYoIkJVU19DUkVBVEUoJWx1LCNkZXZzPSVsdSkiLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmNyZWF0ZUJ1cy5idXNObywKKwkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVCdXMuZGV2aWNlQ291bnQpOworCQlidXNfY3JlYXRlKCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0JVU19ERVNUUk9ZOgorCQlMT0dJTkYoIkJVU19ERVNUUk9ZKCVsdSkiLCAodWxvbmcpIGNtZC0+ZGVzdHJveUJ1cy5idXNObyk7CisJCWJ1c19kZXN0cm95KCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0JVU19DT05GSUdVUkU6CisJCUxPR0lORigiQlVTX0NPTkZJR1VSRSglbHUpIiwgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZUJ1cy5idXNObyk7CisJCWJ1c19jb25maWd1cmUoJmlubXNnLCBwYXJzZXJfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKKwkJTE9HSU5GKCJERVZJQ0VfQ1JFQVRFKCVsdSwlbHUpIiwKKwkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVEZXZpY2UuYnVzTm8sCisJCSAgICAgICAodWxvbmcpIGNtZC0+Y3JlYXRlRGV2aWNlLmRldk5vKTsKKwkJbXlfZGV2aWNlX2NyZWF0ZSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6CisJCWlmIChjbWQtPmRldmljZUNoYW5nZVN0YXRlLmZsYWdzLnBoeXNpY2FsRGV2aWNlKSB7CisJCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURSBmb3IgcGh5c2ljYWwgZGV2aWNlICglbHUsJWx1LCBhY3RpdmU9JWx1KSIsCisJCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5idXNObywKKwkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLmRldk5vLAorCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuc3RhdGUuQWN0aXZlKTsKKwkJCXBhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZSgmaW5tc2cpOworCQl9IGVsc2UgeworCQkJTE9HSU5GKCJERVZJQ0VfQ0hBTkdFU1RBVEUgZm9yIHZpcnR1YWwgZGV2aWNlICglbHUsJWx1LCBzdGF0ZS5BbGl2ZT0weCVseCkiLAorCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlQ2hhbmdlU3RhdGUuYnVzTm8sCisJCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VDaGFuZ2VTdGF0ZS5kZXZObywKKwkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZUNoYW5nZVN0YXRlLnN0YXRlLkFsaXZlKTsKKwkJCS8qIHNhdmUgdGhlIGhkciBhbmQgY21kIHN0cnVjdHVyZXMgZm9yIGxhdGVyIHVzZSAqLworCQkJLyogd2hlbiBzZW5kaW5nIGJhY2sgdGhlIHJlc3BvbnNlIHRvIENvbW1hbmQgKi8KKwkJCW15X2RldmljZV9jaGFuZ2VzdGF0ZSgmaW5tc2cpOworCQkJZ19EaWFnTXNnSGRyID0gaW5tc2cuaGRyOworCQkJZ19EZXZpY2VDaGFuZ2VTdGF0ZVBhY2tldCA9IGlubXNnLmNtZDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgorCQlMT0dJTkYoIkRFVklDRV9ERVNUUk9ZKCVsdSwlbHUpIiwKKwkJICAgICAgICh1bG9uZykgY21kLT5kZXN0cm95RGV2aWNlLmJ1c05vLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmRlc3Ryb3lEZXZpY2UuZGV2Tm8pOworCQlteV9kZXZpY2VfZGVzdHJveSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFOgorCQlMT0dJTkYoIkRFVklDRV9DT05GSUdVUkUoJWx1LCVsdSkiLAorCQkgICAgICAgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZURldmljZS5idXNObywKKwkJICAgICAgICh1bG9uZykgY21kLT5jb25maWd1cmVEZXZpY2UuZGV2Tm8pOworCQkvKiBubyBvcCBmb3Igbm93LCBqdXN0IHNlbmQgYSByZXNwb25kIHRoYXQgd2UgcGFzc2VkICovCisJCWlmIChpbm1zZy5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9DSElQU0VUX1JFQURZOgorCQlMT0dJTkYoIkNISVBTRVRfUkVBRFkiKTsKKwkJY2hpcHNldF9yZWFkeSgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVDoKKwkJTE9HSU5GKCJDSElQU0VUX1NFTEZURVNUIik7CisJCWNoaXBzZXRfc2VsZnRlc3QoJmlubXNnLmhkcik7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfU1RPUDoKKwkJTE9HSU5GKCJDSElQU0VUX1NUT1AiKTsKKwkJY2hpcHNldF9ub3RyZWFkeSgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HRVJSKCJ1bnJlY29nbml6ZWQgY29udHJvbHZtIGNtZD0lZCIsIChpbnQpIGlubXNnLmhkci5JZCk7CisJCWlmIChpbm1zZy5oZHIuRmxhZ3MucmVzcG9uc2VFeHBlY3RlZCkKKwkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsCisJCQkJCSAgLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CisJCWJyZWFrOworCX0KKworCWlmIChwYXJzZXJfY3R4ICE9IE5VTEwpIHsKKwkJcGFyc2VyX2RvbmUocGFyc2VyX2N0eCk7CisJCXBhcnNlcl9jdHggPSBOVUxMOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9wZXJpb2RpY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPIGNoYW5JbmZvOworCUNPTlRST0xWTV9NRVNTQUdFIGlubXNnOworCWNoYXIgc1s5OV07CisJQk9PTCBnb3RBQ29tbWFuZCA9IEZBTFNFOworCUJPT0wgaGFuZGxlX2NvbW1hbmRfZmFpbGVkID0gRkFMU0U7CisJc3RhdGljIFU2NCBQb2xsX0NvdW50OworCisJLyogbWFrZSBzdXJlIHZpc29yYnVzIHNlcnZlciBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCisJaWYgKHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0ICYmICFzZXJ2ZXJyZWdpc3RlcmVkKQorCQlnb3RvIEF3YXk7CisJLyogbWFrZSBzdXJlIHZpc29yY2xpZW50YnVzIHNlcnZlciBpcyByZWdzaXRlcmVkIGZvciBjb250cm9sdm0KKwkgKiBjYWxsYmFja3MKKwkgKi8KKwlpZiAodmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQgJiYgIWNsaWVudHJlZ2lzdGVyZWQpCisJCWdvdG8gQXdheTsKKworCW1lbXNldCgmY2hhbkluZm8sIDAsIHNpemVvZihWSVNPUkNISVBTRVRfQ0hBTk5FTF9JTkZPKSk7CisJaWYgKCFDb250cm9sVm1fY2hhbm5lbCkgeworCQlIT1NUQUREUkVTUyBhZGRyID0gY29udHJvbHZtX2dldF9jaGFubmVsX2FkZHJlc3MoKTsKKwkJaWYgKGFkZHIgIT0gMCkgeworCQkJQ29udHJvbFZtX2NoYW5uZWwgPQorCQkJICAgIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrCisJCQkgICAgKGFkZHIsCisJCQkgICAgIHNpemVvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCksCisJCQkgICAgIFVsdHJhQ29udHJvbHZtQ2hhbm5lbFByb3RvY29sR3VpZCk7CisJCQlpZiAoQ29udHJvbFZtX2NoYW5uZWwgPT0gTlVMTCkKKwkJCQlMT0dFUlIoImZhaWxlZCB0byBjcmVhdGUgY29udHJvbHZtIGNoYW5uZWwiKTsKKwkJCWVsc2UgaWYgKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX09LX0NMSUVOVAorCQkJCSAodmlzb3JjaGFubmVsX2dldF9oZWFkZXIoQ29udHJvbFZtX2NoYW5uZWwpLAorCQkJCSAgTlVMTCkpIHsKKwkJCQlMT0dJTkYoIkNoYW5uZWwgJXMgKENvbnRyb2xWbSkgZGlzY292ZXJlZCIsCisJCQkJICAgICAgIHZpc29yY2hhbm5lbF9pZChDb250cm9sVm1fY2hhbm5lbCwgcykpOworCQkJCWluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWQoKTsKKwkJCX0gZWxzZSB7CisJCQkJTE9HRVJSKCJjb250cm9sdm0gY2hhbm5lbCBpcyBpbnZhbGlkIik7CisJCQkJdmlzb3JjaGFubmVsX2Rlc3Ryb3koQ29udHJvbFZtX2NoYW5uZWwpOworCQkJCUNvbnRyb2xWbV9jaGFubmVsID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCVBvbGxfQ291bnQrKzsKKwlpZiAoKENvbnRyb2xWbV9jaGFubmVsICE9IE5VTEwpIHx8IChQb2xsX0NvdW50ID49IDI1MCkpCisJCTsJLyoga2VlcCBnb2luZyAqLworCWVsc2UKKwkJZ290byBBd2F5OworCisJLyogQ2hlY2sgZXZlbnRzIHRvIGRldGVybWluZSBpZiByZXNwb25zZSB0byBDSElQU0VUX1JFQURZCisJICogc2hvdWxkIGJlIHNlbnQKKwkgKi8KKwlpZiAodmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkKKwkgICAgJiYgKGdfQ2hpcFNldE1zZ0hkci5JZCAhPSBDT05UUk9MVk1fSU5WQUxJRCkpIHsKKwkJaWYgKGNoZWNrX2NoaXBzZXRfZXZlbnRzKCkgPT0gMSkgeworCQkJTE9HSU5GKCJTZW5kaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiKTsKKwkJCWNvbnRyb2x2bV9yZXNwb25kKCZnX0NoaXBTZXRNc2dIZHIsIDApOworCQkJY2xlYXJfY2hpcHNldF9ldmVudHMoKTsKKwkJCW1lbXNldCgmZ19DaGlwU2V0TXNnSGRyLCAwLAorCQkJICAgICAgIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKwkJfQorCX0KKworCWlmIChDb250cm9sVm1fY2hhbm5lbCkgeworCQl3aGlsZSAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShDb250cm9sVm1fY2hhbm5lbCwKKwkJCQkJCSBDT05UUk9MVk1fUVVFVUVfUkVTUE9OU0UsCisJCQkJCQkgJmlubXNnKSkgeworCQkJaWYgKGlubXNnLmhkci5QYXlsb2FkTWF4Qnl0ZXMgIT0gMCkgeworCQkJCUxPR0VSUigiUGF5bG9hZCBvZiBzaXplICVsdSByZXR1cm5lZCBAJWx1IHdpdGggdW5leHBlY3RlZCBtZXNzYWdlIGlkICVkLiIsCisJCQkJICAgICAodWxvbmcpIGlubXNnLmhkci5QYXlsb2FkTWF4Qnl0ZXMsCisJCQkJICAgICAodWxvbmcpIGlubXNnLmhkci5QYXlsb2FkVm1PZmZzZXQsCisJCQkJICAgICBpbm1zZy5oZHIuSWQpOworCQkJfQorCQl9CisJCWlmICghZ290QUNvbW1hbmQpIHsKKwkJCWlmIChDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQpIHsKKwkJCQkvKiB3ZSB0aHJvdHRsZWQgcHJvY2Vzc2luZyBvZiBhIHByaW9yCisJCQkJKiBtc2csIHNvIHRyeSB0byBwcm9jZXNzIGl0IGFnYWluCisJCQkJKiByYXRoZXIgdGhhbiByZWFkaW5nIGEgbmV3IG9uZQorCQkJCSovCisJCQkJaW5tc2cgPSBDb250cm9sVm1fUGVuZGluZ19Nc2c7CisJCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnX1ZhbGlkID0gRkFMU0U7CisJCQkJZ290QUNvbW1hbmQgPSBUUlVFOworCQkJfSBlbHNlCisJCQkJZ290QUNvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOworCQl9CisJfQorCisJaGFuZGxlX2NvbW1hbmRfZmFpbGVkID0gRkFMU0U7CisJd2hpbGUgKGdvdEFDb21tYW5kICYmICghaGFuZGxlX2NvbW1hbmRfZmFpbGVkKSkgeworCQlNb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgPSBqaWZmaWVzOworCQlpZiAoQ29udHJvbFZtX2NoYW5uZWwpIHsKKwkJCWlmIChoYW5kbGVfY29tbWFuZChpbm1zZywKKwkJCQkJICAgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcgorCQkJCQkgICAoQ29udHJvbFZtX2NoYW5uZWwpKSkKKwkJCQlnb3RBQ29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CisJCQllbHNlIHsKKwkJCQkvKiB0aGlzIGlzIGEgc2NlbmFyaW8gd2hlcmUgdGhyb3R0bGluZworCQkJCSogaXMgcmVxdWlyZWQsIGJ1dCBwcm9iYWJseSBOT1QgYW4KKwkJCQkqIGVycm9yLi4uOyB3ZSBzdGFzaCB0aGUgY3VycmVudAorCQkJCSogY29udHJvbHZtIG1zZyBzbyB3ZSB3aWxsIGF0dGVtcHQgdG8KKwkJCQkqIHJlcHJvY2VzcyBpdCBvbiBvdXIgbmV4dCBsb29wCisJCQkJKi8KKwkJCQloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBUUlVFOworCQkJCUNvbnRyb2xWbV9QZW5kaW5nX01zZyA9IGlubXNnOworCQkJCUNvbnRyb2xWbV9QZW5kaW5nX01zZ19WYWxpZCA9IFRSVUU7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWhhbmRsZV9jb21tYW5kKGlubXNnLCAwKTsKKwkJCWdvdEFDb21tYW5kID0gRkFMU0U7CisJCX0KKwl9CisKKwkvKiBwYXJhaG90cGx1Z193b3JrZXIgKi8KKwlwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3QoKTsKKworQXdheToKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCisJCSAgICAgICBNb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgKyAoSFogKiBNSU5fSURMRV9TRUNPTkRTKSkpIHsKKwkJLyogaXQncyBiZWVuIGxvbmdlciB0aGFuIE1JTl9JRExFX1NFQ09ORFMgc2luY2Ugd2UKKwkJKiBwcm9jZXNzZWQgb3VyIGxhc3QgY29udHJvbHZtIG1lc3NhZ2U7IHNsb3cgZG93biB0aGUKKwkJKiBwb2xsaW5nCisJCSovCisJCWlmIChQb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XKSB7CisJCQlMT0dJTkYoInN3aXRjaGVkIHRvIHNsb3cgY29udHJvbHZtIHBvbGxpbmciKTsKKwkJCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChQb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUKSB7CisJCQlQb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7CisJCQlMT0dJTkYoInN3aXRjaGVkIHRvIGZhc3QgY29udHJvbHZtIHBvbGxpbmciKTsKKwkJfQorCX0KKworCXF1ZXVlX2RlbGF5ZWRfd29yayhQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLAorCQkJICAgJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXBfY3Jhc2hfZGV2aWNlc193b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKworCUNPTlRST0xWTV9NRVNTQUdFIGxvY2FsQ3Jhc2hDcmVhdGVCdXNNc2c7CisJQ09OVFJPTFZNX01FU1NBR0UgbG9jYWxDcmFzaENyZWF0ZURldk1zZzsKKwlDT05UUk9MVk1fTUVTU0FHRSBtc2c7CisJSE9TVEFERFJFU1MgaG9zdF9hZGRyOworCVUzMiBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQ7CisJVTE2IGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50OworCisJLyogbWFrZSBzdXJlIHZpc29yYnVzIHNlcnZlciBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCisJaWYgKHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0ICYmICFzZXJ2ZXJyZWdpc3RlcmVkKQorCQlnb3RvIEF3YXk7CisKKwkvKiBtYWtlIHN1cmUgdmlzb3JjbGllbnRidXMgc2VydmVyIGlzIHJlZ3NpdGVyZWQgZm9yIGNvbnRyb2x2bQorCSAqIGNhbGxiYWNrcworCSAqLworCWlmICh2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCAmJiAhY2xpZW50cmVnaXN0ZXJlZCkKKwkJZ290byBBd2F5OworCisJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJLyogc2VuZCBpbml0IGNoaXBzZXQgbXNnICovCisJbXNnLmhkci5JZCA9IENPTlRST0xWTV9DSElQU0VUX0lOSVQ7CisJbXNnLmNtZC5pbml0Q2hpcHNldC5idXNDb3VudCA9IDIzOworCW1zZy5jbWQuaW5pdENoaXBzZXQuc3dpdGNoQ291bnQgPSAwOworCisJY2hpcHNldF9pbml0KCZtc2cpOworCisJaG9zdF9hZGRyID0gY29udHJvbHZtX2dldF9jaGFubmVsX2FkZHJlc3MoKTsKKwlpZiAoIWhvc3RfYWRkcikgeworCQlMT0dFUlIoIkh1aD8gIEhvc3QgYWRkcmVzcyBpcyBOVUxMIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0hBRERSX05VTEwsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwlDb250cm9sVm1fY2hhbm5lbCA9CisJICAgIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrCisJICAgIChob3N0X2FkZHIsCisJICAgICBzaXplb2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wpLAorCSAgICAgVWx0cmFDb250cm9sdm1DaGFubmVsUHJvdG9jb2xHdWlkKTsKKworCWlmIChDb250cm9sVm1fY2hhbm5lbCA9PSBOVUxMKSB7CisJCUxPR0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBjb250cm9sdm0gY2hhbm5lbCIpOworCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DT05UUk9MVk1fTlVMTCwKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGdldCBzYXZlZCBtZXNzYWdlIGNvdW50ICovCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgICAgIFNhdmVkQ3Jhc2hNc2dDb3VudCksCisJCQkgICAgICAmbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsIHNpemVvZihVMTYpKSA8IDApIHsKKwkJTE9HRVJSKCJmYWlsZWQgdG8gZ2V0IFNhdmVkIE1lc3NhZ2UgQ291bnQiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfQ1RSTF9SRF9GQUlMVVJFX1BDLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50ICE9IENPTlRST0xWTV9DUkFTSE1TR19NQVgpIHsKKwkJTE9HRVJSKCJTYXZlZCBNZXNzYWdlIENvdW50IGluY29ycmVjdCAlZCIsCisJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQ1JBU0hfREVWX0NPVU5UX0ZBSUxVUkVfUEMsCisJCQkJIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50LAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IHNhdmVkIGNyYXNoIG1lc3NhZ2Ugb2Zmc2V0ICovCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCQkJICAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkJICAgICAgIFNhdmVkQ3Jhc2hNc2dPZmZzZXQpLAorCQkJICAgICAgJmxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwgc2l6ZW9mKFUzMikpIDwgMCkgeworCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBPZmZzZXQiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfQ1RSTF9SRF9GQUlMVVJFX1BDLAorCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworCQlyZXR1cm47CisJfQorCisJLyogcmVhZCBjcmVhdGUgZGV2aWNlIG1lc3NhZ2UgZm9yIHN0b3JhZ2UgYnVzIG9mZnNldCAqLworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwkJCSAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwKKwkJCSAgICAgICZsb2NhbENyYXNoQ3JlYXRlQnVzTXNnLAorCQkJICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSkgPCAwKSB7CisJCUxPR0VSUigiQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFOiBGYWlsZWQgdG8gcmVhZCBDcmFzaENyZWF0ZUJ1c01zZyEiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfUkRfQlVTX0ZBSVVMUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiByZWFkIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCQkJICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSwKKwkJCSAgICAgICZsb2NhbENyYXNoQ3JlYXRlRGV2TXNnLAorCQkJICAgICAgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFKSkgPCAwKSB7CisJCUxPR0VSUigiQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFOiBGYWlsZWQgdG8gcmVhZCBDcmFzaENyZWF0ZURldk1zZyEiKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfUkRfREVWX0ZBSVVMUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXVzZSBJT1ZNIGNyZWF0ZSBidXMgbWVzc2FnZSAqLworCWlmIChsb2NhbENyYXNoQ3JlYXRlQnVzTXNnLmNtZC5jcmVhdGVCdXMuY2hhbm5lbEFkZHIgIT0gMCkKKwkJYnVzX2NyZWF0ZSgmbG9jYWxDcmFzaENyZWF0ZUJ1c01zZyk7CisJZWxzZSB7CisJCUxPR0VSUigiQ3Jhc2hDcmVhdGVCdXNNc2cgaXMgbnVsbCwgbm8gZHVtcCB3aWxsIGJlIHRha2VuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMsCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXVzZSBjcmVhdGUgZGV2aWNlIG1lc3NhZ2UgZm9yIHN0b3JhZ2UgZGV2aWNlICovCisJaWYgKGxvY2FsQ3Jhc2hDcmVhdGVEZXZNc2cuY21kLmNyZWF0ZURldmljZS5jaGFubmVsQWRkciAhPSAwKQorCQlteV9kZXZpY2VfY3JlYXRlKCZsb2NhbENyYXNoQ3JlYXRlRGV2TXNnKTsKKwllbHNlIHsKKwkJTE9HRVJSKCJDcmFzaENyZWF0ZURldk1zZyBpcyBudWxsLCBubyBkdW1wIHdpbGwgYmUgdGFrZW4iKTsKKwkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwkJcmV0dXJuOworCX0KKwlMT0dJTkYoIkJ1cyBhbmQgZGV2aWNlIHJlYWR5IGZvciBkdW1waW5nIik7CisJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJcmV0dXJuOworCitBd2F5OgorCisJUG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XOworCisJcXVldWVfZGVsYXllZF93b3JrKFBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUsCisJCQkgICAmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssIFBvbGxfamlmZmllcyk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCit7CisJYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fQlVTX0NSRUFURSwgYnVzTm8sIHJlc3BvbnNlKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCit7CisJYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fQlVTX0RFU1RST1ksIGJ1c05vLCByZXNwb25zZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQoreworCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworfQorCitzdGF0aWMgdm9pZAorZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpCit7CisJZGV2aWNlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworfQorCit2b2lkCit2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQoreworCisJZGV2aWNlX2NoYW5nZXN0YXRlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLAorCQkJCSAgICAgYnVzTm8sIGRldk5vLCByZXNwb25zZSwKKwkJCQkgICAgIFNlZ21lbnRTdGF0ZVN0YW5kYnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSk7CisKK3N0YXRpYyB2b2lkCitkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQoreworCWRldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKKwkJCQkgICAgIGJ1c05vLCBkZXZObywgcmVzcG9uc2UsCisJCQkJICAgICBTZWdtZW50U3RhdGVSdW5uaW5nKTsKK30KKworQk9PTAordmlzb3JjaGlwc2V0X2dldF9idXNfaW5mbyh1bG9uZyBidXNObywgVklTT1JDSElQU0VUX0JVU19JTkZPICpidXNJbmZvKQoreworCXZvaWQgKnAgPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOworCWlmICghcCkgeworCQlMT0dFUlIoIiglbHUpIGZhaWxlZCIsIGJ1c05vKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwltZW1jcHkoYnVzSW5mbywgcCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9CVVNfSU5GTykpOworCXJldHVybiBUUlVFOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2dldF9idXNfaW5mbyk7CisKK0JPT0wKK3Zpc29yY2hpcHNldF9zZXRfYnVzX2NvbnRleHQodWxvbmcgYnVzTm8sIHZvaWQgKmNvbnRleHQpCit7CisJVklTT1JDSElQU0VUX0JVU19JTkZPICpwID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCIoJWx1KSBmYWlsZWQiLCBidXNObyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcC0+YnVzX2RyaXZlcl9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gVFJVRTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9zZXRfYnVzX2NvbnRleHQpOworCitCT09MCit2aXNvcmNoaXBzZXRfZ2V0X2RldmljZV9pbmZvKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywKKwkJCSAgICAgVklTT1JDSElQU0VUX0RFVklDRV9JTkZPICpkZXZJbmZvKQoreworCXZvaWQgKnAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIXApIHsKKwkJTE9HRVJSKCIoJWx1LCVsdSkgZmFpbGVkIiwgYnVzTm8sIGRldk5vKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwltZW1jcHkoZGV2SW5mbywgcCwgc2l6ZW9mKFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTykpOworCXJldHVybiBUUlVFOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2dldF9kZXZpY2VfaW5mbyk7CisKK0JPT0wKK3Zpc29yY2hpcHNldF9zZXRfZGV2aWNlX2NvbnRleHQodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCB2b2lkICpjb250ZXh0KQoreworCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcCA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCWlmICghcCkgeworCQlMT0dFUlIoIiglbHUsJWx1KSBmYWlsZWQiLCBidXNObywgZGV2Tm8pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXAtPmJ1c19kcml2ZXJfY29udGV4dCA9IGNvbnRleHQ7CisJcmV0dXJuIFRSVUU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfc2V0X2RldmljZV9jb250ZXh0KTsKKworLyogR2VuZXJpYyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBmcm9tIGEga21lbV9jYWNoZSBwb29sLgorICovCit2b2lkICoKK3Zpc29yY2hpcHNldF9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqcG9vbCwgQk9PTCBva190b19ibG9jaywKKwkJCSBjaGFyICpmbiwgaW50IGxuKQoreworCWdmcF90IGdmcDsKKwl2b2lkICpwOworCisJaWYgKG9rX3RvX2Jsb2NrKQorCQlnZnAgPSBHRlBfS0VSTkVMOworCWVsc2UKKwkJZ2ZwID0gR0ZQX0FUT01JQzsKKwkvKiBfX0dGUF9OT1JFVFJZIG1lYW5zICJvayB0byBmYWlsIiwgbWVhbmluZworCSAqIGttZW1fY2FjaGVfYWxsb2MoKSBjYW4gcmV0dXJuIE5VTEwsIGltcGx5aW5nIHRoZSBjYWxsZXIgQ0FOCisJICogY29wZSB3aXRoIGZhaWx1cmUuICBJZiB5b3UgZG8gTk9UIHNwZWNpZnkgX19HRlBfTk9SRVRSWSwKKwkgKiBMaW51eCB3aWxsIGdvIHRvIGV4dHJlbWUgbWVhc3VyZXMgdG8gZ2V0IG1lbW9yeSBmb3IgeW91CisJICogKGxpa2UsIGludm9rZSBvb20ga2lsbGVyKSwgd2hpY2ggd2lsbCBwcm9iYWJseSBjcmlwcGxlIHRoZQorCSAqIHN5c3RlbS4KKwkgKi8KKwlnZnAgfD0gX19HRlBfTk9SRVRSWTsKKwlwID0ga21lbV9jYWNoZV9hbGxvYyhwb29sLCBnZnApOworCWlmICghcCkgeworCQlMT0dFUlIoImttZW1fY2FjaGVfYWxsb2MgZmFpbGVkIGVhcmx5IEAlczolZFxuIiwgZm4sIGxuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWF0b21pY19pbmMoJlZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSk7CisJcmV0dXJuIHA7Cit9CisKKy8qIEdlbmVyaWMgd3JhcHBlciBmdW5jdGlvbiBmb3IgZnJlZWluZyBtZW1vcnkgZnJvbSBhIGttZW1fY2FjaGUgcG9vbC4KKyAqLwordm9pZAordmlzb3JjaGlwc2V0X2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKnBvb2wsIHZvaWQgKnAsIGNoYXIgKmZuLCBpbnQgbG4pCit7CisJaWYgKCFwKSB7CisJCUxPR0VSUigiTlVMTCBwb2ludGVyIEAlczolZFxuIiwgZm4sIGxuKTsKKwkJcmV0dXJuOworCX0KKwlhdG9taWNfZGVjKCZWaXNvcmNoaXBzZXRfY2FjaGVfYnVmZmVyc19pbl91c2UpOworCWttZW1fY2FjaGVfZnJlZShwb29sLCBwKTsKK30KKworI2RlZmluZSBnZXR0b2tlbihidWZwKSBzdHJzZXAoYnVmcCwgIiAtXHRcbiIpCisKK3N0YXRpYyBzc2l6ZV90CitjaGlwc2V0X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzUxMl07CisJY2hhciAqdG9rZW4sICpwOworCisJaWYgKGNvdW50ID4gc2l6ZW9mKGJ1ZikgLSAxKSB7CisJCUxPR0VSUigiY2hpcHNldF9wcm9jX3dyaXRlOiBjb3VudCAoJWQpIGV4Y2VlZHMgc2l6ZSBvZiBidWZmZXIgKCVkKSIsCisJCSAgICAgKGludCkgY291bnQsIChpbnQpIHNpemVvZihidWZmZXIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCUxPR0VSUigiY2hpcHNldF9wcm9jX3dyaXRlOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJ1Zltjb3VudF0gPSAnXDAnOworCisJcCA9IGJ1ZjsKKwl0b2tlbiA9IGdldHRva2VuKCZwKTsKKworCWlmIChzdHJjbXAodG9rZW4sICJDQUxMSE9NRURJU0tfTU9VTlRFRCIpID09IDApIHsKKwkJdG9rZW4gPSBnZXR0b2tlbigmcCk7CisJCS8qIFRoZSBDYWxsIEhvbWUgRGlzayBoYXMgYmVlbiBtb3VudGVkICovCisJCWlmIChzdHJjbXAodG9rZW4sICIwIikgPT0gMCkKKwkJCWNoaXBzZXRfZXZlbnRzWzBdID0gMTsKKwl9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIk1PRFVMRVNfTE9BREVEIikgPT0gMCkgeworCQl0b2tlbiA9IGdldHRva2VuKCZwKTsKKwkJLyogQWxsIG1vZHVsZXMgZm9yIHRoZSBwYXJ0aXRpb24gaGF2ZSBiZWVuIGxvYWRlZCAqLworCQlpZiAoc3RyY21wKHRva2VuLCAiMCIpID09IDApCisJCQljaGlwc2V0X2V2ZW50c1sxXSA9IDE7CisJfSBlbHNlIGlmICh0b2tlbiA9PSBOVUxMKSB7CisJCS8qIE5vIGV2ZW50IHNwZWNpZmllZCAqLworCQlMT0dFUlIoIk5vIGV2ZW50IHdhcyBzcGVjaWZpZWQgdG8gc2VuZCBDSElQU0VUX1JFQURZIHJlc3BvbnNlIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQkvKiBVbnN1cHBvcnRlZCBldmVudCBzcGVjaWZpZWQgKi8KKwkJTE9HRVJSKCIlcyBpcyBhbiBpbnZhbGlkIGV2ZW50IGZvciBzZW5kaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiLAkJICAgICB0b2tlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit2aXNvcmNoaXBzZXRfcHJvY19yZWFkX3dyaXRlb25seShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogUmVhZHMgdGhlIEluc3RhbGxhdGlvbkVycm9yLCBJbnN0YWxsYXRpb25UZXh0SWQsCisgKiBJbnN0YWxsYXRpb25SZW1haW5pbmdTdGVwcyBmaWVsZHMgb2YgQ29udHJvbFZNQ2hhbm5lbC4KKyAqLworc3RhdGljIHNzaXplX3QKK3Byb2NfcmVhZF9pbnN0YWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCSAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlpbnQgbGVuZ3RoID0gMDsKKwlVMTYgcmVtYWluaW5nU3RlcHM7CisJVTMyIGVycm9yLCB0ZXh0SWQ7CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEluc3RhbGxhdGlvblJlbWFpbmluZ1N0ZXBzKSwgJnJlbWFpbmluZ1N0ZXBzLAorCQkJICBzaXplb2YoVTE2KSk7CisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEluc3RhbGxhdGlvbkVycm9yKSwgJmVycm9yLCBzaXplb2YoVTMyKSk7CisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEluc3RhbGxhdGlvblRleHRJZCksICZ0ZXh0SWQsIHNpemVvZihVMzIpKTsKKworCWxlbmd0aCA9IHNwcmludGYodmJ1ZiwgIiV1ICV1ICV1XG4iLCByZW1haW5pbmdTdGVwcywgZXJyb3IsIHRleHRJZCk7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZidWYsIGxlbmd0aCkpIHsKKwkJa2ZyZWUodmJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKHZidWYpOworCSpvZmZzZXQgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qKgorICogV3JpdGVzIHRvIHRoZSBJbnN0YWxsYXRpb25FcnJvciwgSW5zdGFsbGF0aW9uVGV4dElkLAorICogSW5zdGFsbGF0aW9uUmVtYWluaW5nU3RlcHMgZmllbGRzIG9mCisgKiBDb250cm9sVk1DaGFubmVsLgorICogSW5wdXQ6IFJlbWFpbmluZ1N0ZXBzIEVycm9yIFRleHRJZAorICogTGltaXQgMzIgY2hhcmFjdGVycyBpbnB1dAorICovCisjZGVmaW5lIFVJTlQxNl9NQVgJCSg2NTUzNVUpCisjZGVmaW5lIFVJTlQzMl9NQVgJCSg0Mjk0OTY3Mjk1VSkKK3N0YXRpYyBzc2l6ZV90Citwcm9jX3dyaXRlX2luc3RhbGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZlszMl07CisJVTE2IHJlbWFpbmluZ1N0ZXBzOworCVUzMiBlcnJvciwgdGV4dElkOworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGJ1ZmZlciBvdmVyZmxvdyAqLworCWlmIChjb3VudCA+IChzaXplb2YoYnVmKSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCVdBUk4oMSwgIkVycm9yIGNvcHlpbmcgZnJvbSB1c2VyIHNwYWNlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlaHUgJWkgJWkiLCAmcmVtYWluaW5nU3RlcHMsICZlcnJvciwgJnRleHRJZCkgIT0gMykgeworCQlyZW1haW5pbmdTdGVwcyA9IFVJTlQxNl9NQVg7CisJCWVycm9yID0gVUlOVDMyX01BWDsKKwkJdGV4dElkID0gVUlOVDMyX01BWDsKKwl9CisKKwlpZiAocmVtYWluaW5nU3RlcHMgIT0gVUlOVDE2X01BWCkgeworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlCisJCSAgICAoQ29udHJvbFZtX2NoYW5uZWwsCisJCSAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkgICAgICBJbnN0YWxsYXRpb25SZW1haW5pbmdTdGVwcyksICZyZW1haW5pbmdTdGVwcywKKwkJICAgICBzaXplb2YoVTE2KSkgPCAwKQorCQkJV0FSTigxLCAiSW5zdGFsbGF0aW9uIFN0YXR1cyBXcml0ZSBGYWlsZWQgLSBXcml0ZSBmdW5jdGlvbiBlcnJvciAtIFJlbWFpbmluZ1N0ZXBzID0gJWRcbiIsCisJCQkgICAgIHJlbWFpbmluZ1N0ZXBzKTsKKwl9CisKKwlpZiAoZXJyb3IgIT0gVUlOVDMyX01BWCkgeworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlCisJCSAgICAoQ29udHJvbFZtX2NoYW5uZWwsCisJCSAgICAgb2Zmc2V0b2YoVUxUUkFfQ09OVFJPTFZNX0NIQU5ORUxfUFJPVE9DT0wsCisJCQkgICAgICBJbnN0YWxsYXRpb25FcnJvciksICZlcnJvciwgc2l6ZW9mKFUzMikpIDwgMCkKKwkJCVdBUk4oMSwgIkluc3RhbGxhdGlvbiBTdGF0dXMgV3JpdGUgRmFpbGVkIC0gV3JpdGUgZnVuY3Rpb24gZXJyb3IgLSBFcnJvciA9ICVkXG4iLAorCQkJICAgICBlcnJvcik7CisJfQorCisJaWYgKHRleHRJZCAhPSBVSU5UMzJfTUFYKSB7CisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUKKwkJICAgIChDb250cm9sVm1fY2hhbm5lbCwKKwkJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwKKwkJCSAgICAgIEluc3RhbGxhdGlvblRleHRJZCksICZ0ZXh0SWQsIHNpemVvZihVMzIpKSA8IDApCisJCQlXQVJOKDEsICJJbnN0YWxsYXRpb24gU3RhdHVzIFdyaXRlIEZhaWxlZCAtIFdyaXRlIGZ1bmN0aW9uIGVycm9yIC0gVGV4dElkID0gJWRcbiIsCisJCQkgICAgIHRleHRJZCk7CisJfQorCisJLyogU28gdGhpcyBmdW5jdGlvbiBpc24ndCBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIG11c3QgcmV0dXJuCisJICogc2l6ZSBvZiBidWZmZXIKKwkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogUmVhZHMgdGhlIFRvb2xBY3Rpb24gZmllbGQgb2YgQ29udHJvbFZNQ2hhbm5lbC4KKyAqLworc3RhdGljIHNzaXplX3QKK3Byb2NfcmVhZF90b29sYWN0aW9uKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCBsZW5ndGggPSAwOworCVU4IHRvb2xBY3Rpb247CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIFRvb2xBY3Rpb24pLCAmdG9vbEFjdGlvbiwgc2l6ZW9mKFU4KSk7CisKKwlsZW5ndGggPSBzcHJpbnRmKHZidWYsICIldVxuIiwgdG9vbEFjdGlvbik7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZidWYsIGxlbmd0aCkpIHsKKwkJa2ZyZWUodmJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKHZidWYpOworCSpvZmZzZXQgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qKgorICogV3JpdGVzIHRvIHRoZSBUb29sQWN0aW9uIGZpZWxkIG9mIENvbnRyb2xWTUNoYW5uZWwuCisgKiBJbnB1dDogVG9vbEFjdGlvbgorICogTGltaXQgMyBjaGFyYWN0ZXJzIGlucHV0CisgKi8KKyNkZWZpbmUgVUlOVDhfTUFYICgyNTVVKQorc3RhdGljIHNzaXplX3QKK3Byb2Nfd3JpdGVfdG9vbGFjdGlvbihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbM107CisJVTggdG9vbEFjdGlvbjsKKworCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBidWZmZXIgb3ZlcmZsb3cgKi8KKwlpZiAoY291bnQgPiAoc2l6ZW9mKGJ1ZikgLSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQlXQVJOKDEsICJFcnJvciBjb3B5aW5nIGZyb20gdXNlciBzcGFjZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChzc2NhbmYoYnVmLCAiJWhoZCIsICZ0b29sQWN0aW9uKSAhPSAxKQorCQl0b29sQWN0aW9uID0gVUlOVDhfTUFYOworCisJaWYgKHRvb2xBY3Rpb24gIT0gVUlOVDhfTUFYKSB7CisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUKKwkJICAgIChDb250cm9sVm1fY2hhbm5lbCwKKwkJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgVG9vbEFjdGlvbiksCisJCSAgICAgJnRvb2xBY3Rpb24sIHNpemVvZihVOCkpIDwgMCkKKwkJCVdBUk4oMSwgIkluc3RhbGxhdGlvbiBUb29sQWN0aW9uIFdyaXRlIEZhaWxlZCAtIFRvb2xBY3Rpb24gPSAlZFxuIiwKKwkJCSAgICAgdG9vbEFjdGlvbik7CisJfQorCisJLyogU28gdGhpcyBmdW5jdGlvbiBpc24ndCBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIG11c3QgcmV0dXJuCisJICogc2l6ZSBvZiBidWZmZXIKKwkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogUmVhZHMgdGhlIEVmaVNwYXJJbmRpY2F0aW9uLkJvb3RUb1Rvb2wgZmllbGQgb2YgQ29udHJvbFZNQ2hhbm5lbC4KKyAqLworc3RhdGljIHNzaXplX3QKK3Byb2NfcmVhZF9ib290VG9Ub29sKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWludCBsZW5ndGggPSAwOworCVVMVFJBX0VGSV9TUEFSX0lORElDQVRJT04gZWZpU3BhckluZGljYXRpb247CisJY2hhciAqdmJ1ZjsKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPiAwIHx8ICFsZW4pCisJCXJldHVybiAwOworCisJdmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKFVMVFJBX0NPTlRST0xWTV9DSEFOTkVMX1BST1RPQ09MLAorCQkJCSAgIEVmaVNwYXJJbmRpY2F0aW9uKSwgJmVmaVNwYXJJbmRpY2F0aW9uLAorCQkJICBzaXplb2YoVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTikpOworCisJbGVuZ3RoID0gc3ByaW50Zih2YnVmLCAiJWRcbiIsIChpbnQpIGVmaVNwYXJJbmRpY2F0aW9uLkJvb3RUb1Rvb2wpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB2YnVmLCBsZW5ndGgpKSB7CisJCWtmcmVlKHZidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZSh2YnVmKTsKKwkqb2Zmc2V0ICs9IGxlbmd0aDsKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKioKKyAqIFdyaXRlcyB0byB0aGUgRWZpU3BhckluZGljYXRpb24uQm9vdFRvVG9vbCBmaWVsZCBvZiBDb250cm9sVk1DaGFubmVsLgorICogSW5wdXQ6IDEgb3IgMCAoMSBiZWluZyBvbiwgMCBiZWluZyBvZmYpCisgKi8KK3N0YXRpYyBzc2l6ZV90Citwcm9jX3dyaXRlX2Jvb3RUb1Rvb2woc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzNdOworCWludCBpbnB1dFZhbDsKKwlVTFRSQV9FRklfU1BBUl9JTkRJQ0FUSU9OIGVmaVNwYXJJbmRpY2F0aW9uOworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGJ1ZmZlciBvdmVyZmxvdyAqLworCWlmIChjb3VudCA+IChzaXplb2YoYnVmKSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCVdBUk4oMSwgIkVycm9yIGNvcHlpbmcgZnJvbSB1c2VyIHNwYWNlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZpbnB1dFZhbCkgIT0gMSkKKwkJaW5wdXRWYWwgPSAwOworCisJZWZpU3BhckluZGljYXRpb24uQm9vdFRvVG9vbCA9IChpbnB1dFZhbCA9PSAxID8gMSA6IDApOworCisJaWYgKHZpc29yY2hhbm5lbF93cml0ZQorCSAgICAoQ29udHJvbFZtX2NoYW5uZWwsCisJICAgICBvZmZzZXRvZihVTFRSQV9DT05UUk9MVk1fQ0hBTk5FTF9QUk9UT0NPTCwgRWZpU3BhckluZGljYXRpb24pLAorCSAgICAgJmVmaVNwYXJJbmRpY2F0aW9uLCBzaXplb2YoVUxUUkFfRUZJX1NQQVJfSU5ESUNBVElPTikpIDwgMCkKKwkJcHJpbnRrCisJCSAgICAoIkluc3RhbGxhdGlvbiBCb290VG9Ub29sIFdyaXRlIEZhaWxlZCAtIEJvb3RUb1Rvb2wgPSAlZFxuIiwKKwkJICAgICAoaW50KSBlZmlTcGFySW5kaWNhdGlvbi5Cb290VG9Ub29sKTsKKworCS8qIFNvIHRoaXMgZnVuY3Rpb24gaXNuJ3QgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBtdXN0IHJldHVybgorCSAqIHNpemUgb2YgYnVmZmVyCisJICovCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaGlwc2V0X3Byb2NfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHZpc29yY2hpcHNldF9wcm9jX3JlYWRfd3JpdGVvbmx5LAorCS53cml0ZSA9IGNoaXBzZXRfcHJvY193cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit2aXNvcmNoaXBzZXRfaW5pdCh2b2lkKQoreworCWludCByYyA9IDAsIHggPSAwOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaW5zdGFsbGVyX2ZpbGU7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0b29sYWN0aW9uX2ZpbGU7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpib290VG9Ub29sX2ZpbGU7CisKKwlMT0dJTkYoImNoaXBzZXQgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkIiwgVkVSU0lPTik7CisJLyogcHJvY2VzcyBtb2R1bGUgb3B0aW9ucyAqLworCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCUxPR0lORigib3B0aW9uIC0gdGVzdHZuaWM9JWQiLCB2aXNvcmNoaXBzZXRfdGVzdHZuaWMpOworCUxPR0lORigib3B0aW9uIC0gdGVzdHZuaWNjbGllbnQ9JWQiLCB2aXNvcmNoaXBzZXRfdGVzdHZuaWNjbGllbnQpOworCUxPR0lORigib3B0aW9uIC0gdGVzdG1zZz0lZCIsIHZpc29yY2hpcHNldF90ZXN0bXNnKTsKKwlMT0dJTkYoIm9wdGlvbiAtIHRlc3R0ZWFyZG93bj0lZCIsIHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd24pOworCUxPR0lORigib3B0aW9uIC0gbWFqb3I9JWQiLCB2aXNvcmNoaXBzZXRfbWFqb3IpOworCUxPR0lORigib3B0aW9uIC0gc2VydmVycmVnd2FpdD0lZCIsIHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0KTsKKwlMT0dJTkYoIm9wdGlvbiAtIGNsaWVudHJlZ3dhaXQ9JWQiLCB2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCk7CisJTE9HSU5GKCJvcHRpb24gLSBob2xkY2hpcHNldHJlYWR5PSVkIiwgdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpOworCisJbWVtc2V0KCZCdXNEZXZfU2VydmVyX05vdGlmaWVycywgMCwgc2l6ZW9mKEJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzKSk7CisJbWVtc2V0KCZCdXNEZXZfQ2xpZW50X05vdGlmaWVycywgMCwgc2l6ZW9mKEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzKSk7CisJbWVtc2V0KCZDb250cm9sVm1fcGF5bG9hZF9pbmZvLCAwLCBzaXplb2YoQ29udHJvbFZtX3BheWxvYWRfaW5mbykpOworCW1lbXNldCgmTGl2ZUR1bXBfaW5mbywgMCwgc2l6ZW9mKExpdmVEdW1wX2luZm8pKTsKKwlhdG9taWNfc2V0KCZMaXZlRHVtcF9pbmZvLmJ1ZmZlcnNfaW5fdXNlLCAwKTsKKworCWlmICh2aXNvcmNoaXBzZXRfdGVzdHZuaWMpIHsKKwkJRVJSRFJWKCJ0ZXN0dm5pYyBvcHRpb24gbm8gbG9uZ2VyIHN1cHBvcnRlZDogKHN0YXR1cyA9ICVkKVxuIiwKKwkJICAgICAgIHgpOworCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCB4LCBESUFHX1NFVkVSSVRZX0VSUik7CisJCXJjID0geDsKKwkJZ290byBBd2F5OworCX0KKworCWNvbnRyb2x2bV9pbml0KCk7CisJTWFqb3JEZXYgPSBNS0RFVih2aXNvcmNoaXBzZXRfbWFqb3IsIDApOworCXJjID0gdmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChNYWpvckRldiwgJkNvbnRyb2xWbV9jaGFubmVsKTsKKwlpZiAocmMgPCAwKSB7CisJCUVSUkRSVigidmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChNYWpvckRldiwgJkNvbnRyb2xWbV9jaGFubmVsKTogZXJyb3IgKHN0YXR1cz0lZClcbiIsIHJjKTsKKwkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOworCQlnb3RvIEF3YXk7CisJfQorCisJcHJvY19Jbml0KCk7CisJbWVtc2V0KFBhcnRpdGlvblByb3BlcnR5TmFtZXMsIDAsIHNpemVvZihQYXJ0aXRpb25Qcm9wZXJ0eU5hbWVzKSk7CisJbWVtc2V0KENvbnRyb2xWbVByb3BlcnR5TmFtZXMsIDAsIHNpemVvZihDb250cm9sVm1Qcm9wZXJ0eU5hbWVzKSk7CisJSW5pdFBhcnRpdGlvblByb3BlcnRpZXMoKTsKKwlJbml0Q29udHJvbFZtUHJvcGVydGllcygpOworCisJUGFydGl0aW9uVHlwZSA9IHZpc29yX3Byb2NfQ3JlYXRlVHlwZShQcm9jRGlyLCBQYXJ0aXRpb25UeXBlTmFtZXMsCisJCQkJCSAgICAgIChjb25zdCBjaGFyICoqKQorCQkJCQkgICAgICBQYXJ0aXRpb25Qcm9wZXJ0eU5hbWVzLAorCQkJCQkgICAgICAmc2hvd19wYXJ0aXRpb25fcHJvcGVydHkpOworCUNvbnRyb2xWbVR5cGUgPQorCSAgICB2aXNvcl9wcm9jX0NyZWF0ZVR5cGUoUHJvY0RpciwgQ29udHJvbFZtVHlwZU5hbWVzLAorCQkJCSAgKGNvbnN0IGNoYXIgKiopIENvbnRyb2xWbVByb3BlcnR5TmFtZXMsCisJCQkJICAmc2hvd19jb250cm9sdm1fcHJvcGVydHkpOworCisJQ29udHJvbFZtT2JqZWN0ID0gdmlzb3JfcHJvY19DcmVhdGVPYmplY3QoQ29udHJvbFZtVHlwZSwgTlVMTCwgTlVMTCk7CisKKwkvKiBTZXR1cCBJbnN0YWxsYXRpb24gZmllbGRzICovCisJaW5zdGFsbGVyX2ZpbGUgPSBwcm9jX2NyZWF0ZSgiaW5zdGFsbGVyIiwgMDY0NCwgUHJvY0RpciwKKwkJCQkgICAgICZwcm9jX2luc3RhbGxlcl9mb3BzKTsKKwkvKiBTZXR1cCB0aGUgVG9vbEFjdGlvbiBmaWVsZCAqLworCXRvb2xhY3Rpb25fZmlsZSA9IHByb2NfY3JlYXRlKCJ0b29sYWN0aW9uIiwgMDY0NCwgUHJvY0RpciwKKwkJCQkgICAgICAmcHJvY190b29sYWN0aW9uX2ZvcHMpOworCS8qIFNldHVwIHRoZSBCb290VG9Ub29sIGZpZWxkICovCisJYm9vdFRvVG9vbF9maWxlID0gcHJvY19jcmVhdGUoImJvb3R0b3Rvb2wiLCAwNjQ0LCBQcm9jRGlyLAorCQkJCSAgICAgICZwcm9jX2Jvb3RUb1Rvb2xfZm9wcyk7CisKKwltZW1zZXQoJmdfRGlhZ01zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJY2hpcHNldF9wcm9jX2RpciA9IHByb2NfY3JlYXRlKFZJU09SQ0hJUFNFVF9DSElQU0VUX1BST0NfRU5UUllfRk4sCisJCQkJICAgICAgIDA2NDQsIFByb2NEaXIsICZjaGlwc2V0X3Byb2NfZm9wcyk7CisJbWVtc2V0KCZnX0NoaXBTZXRNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCXBhcmFob3RwbHVnX3Byb2NfZGlyID0KKwkgICAgcHJvY19jcmVhdGUoVklTT1JDSElQU0VUX1BBUkFIT1RQTFVHX1BST0NfRU5UUllfRk4sIDAyMDAsCisJCQlQcm9jRGlyLCAmcGFyYWhvdHBsdWdfcHJvY19mb3BzKTsKKwltZW1zZXQoJmdfRGVsRHVtcE1zZ0hkciwgMCwgc2l6ZW9mKENPTlRST0xWTV9NRVNTQUdFX0hFQURFUikpOworCisJaWYgKGZpbGV4ZmVyX2NvbnN0cnVjdG9yKHNpemVvZihzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0KSkgPCAwKSB7CisJCUVSUkRSVigiZmlsZXhmZXJfY29uc3RydWN0b3IgZmFpbGVkOiAoc3RhdHVzPS0xKVxuIik7CisJCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0ZBSUxVUkVfUEMsIERJQUdfU0VWRVJJVFlfRVJSKTsKKwkJcmMgPSAtMTsKKwkJZ290byBBd2F5OworCX0KKwlQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wgPQorCSAgICBrbWVtX2NhY2hlX2NyZWF0ZShQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2xfbmFtZSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgcHV0ZmlsZV9idWZmZXJfZW50cnkpLAorCQkJICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIVB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCkgeworCQlFUlJEUlYoImZhaWxlZCB0byBhbGxvYyBQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2w6IChzdGF0dXM9LTEpXG4iKTsKKwkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOworCQlyYyA9IC0xOworCQlnb3RvIEF3YXk7CisJfQorCWlmICh2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0pIHsKKwkJTE9HSU5GKCJ2aXNvcmNoaXBzZXRfaW5pdDpjb250cm9sdm0gZGlzYWJsZWQiKTsKKwl9IGVsc2UgeworCQkvKiBpZiBib290aW5nIGluIGEgY3Jhc2gga2VybmVsICovCisJCWlmICh2aXNvcmNoaXBzZXRfY3Jhc2hfa2VybmVsKQorCQkJSU5JVF9ERUxBWUVEX1dPUksoJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLAorCQkJCQkgIHNldHVwX2NyYXNoX2RldmljZXNfd29ya19xdWV1ZSk7CisJCWVsc2UKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZQZXJpb2RpY19jb250cm9sdm1fd29yaywKKwkJCQkJICBjb250cm9sdm1fcGVyaW9kaWNfd29yayk7CisJCVBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUgPQorCQkgICAgY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInZpc29yY2hpcHNldF9jb250cm9sdm0iKTsKKworCQlpZiAoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSA9PSBOVUxMKSB7CisJCQlFUlJEUlYoImNhbm5vdCBjcmVhdGUgY29udHJvbHZtIHdvcmtxdWV1ZTogKHN0YXR1cz0lZClcbiIsCisJCQkgICAgICAgLUVOT01FTSk7CisJCQlQT1NUQ09ERV9MSU5VWF8yKENSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDLAorCQkJCQkgRElBR19TRVZFUklUWV9FUlIpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBBd2F5OworCQl9CisJCU1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7CisJCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKKwkJcmMgPSBxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKKwkJCQkJJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworCQlpZiAocmMgPCAwKSB7CisJCQlFUlJEUlYoInF1ZXVlX2RlbGF5ZWRfd29yayhQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLCAmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssIFBvbGxfamlmZmllcyk6IGVycm9yIChzdGF0dXM9JWQpXG4iLCByYyk7CisJCQlQT1NUQ09ERV9MSU5VWF8yKFFVRVVFX0RFTEFZRURfV09SS19QQywKKwkJCQkJIERJQUdfU0VWRVJJVFlfRVJSKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCisJfQorCisJVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYuZGV2dCA9IE1ham9yRGV2OworCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UpIDwgMCkgeworCQlFUlJEUlYoInBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcih2aXNvcmNoaXBzZXQpIGZhaWxlZDogKHN0YXR1cz0tMSlcbiIpOworCQlQT1NUQ09ERV9MSU5VWF8yKERFVklDRV9SRUdJU1RFUl9GQUlMVVJFX1BDLCBESUFHX1NFVkVSSVRZX0VSUik7CisJCXJjID0gLTE7CisJCWdvdG8gQXdheTsKKwl9CisJTE9HSU5GKCJ2aXNvcmNoaXBzZXQgZGV2aWNlIGNyZWF0ZWQiKTsKKwlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9TVUNDRVNTX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlyYyA9IDA7CitBd2F5OgorCWlmIChyYykgeworCQlMT0dFUlIoInZpc29yY2hpcHNldF9pbml0IGZhaWxlZCIpOworCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCByYywKKwkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAordmlzb3JjaGlwc2V0X2V4aXQodm9pZCkKK3sKKwljaGFyIHNbOTldOworCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCisJaWYgKHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bSkgeworCQk7CisJfSBlbHNlIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmUGVyaW9kaWNfY29udHJvbHZtX3dvcmspOworCQlmbHVzaF93b3JrcXVldWUoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKFBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUpOworCQlQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlID0gTlVMTDsKKwkJZGVzdHJveV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKCZDb250cm9sVm1fcGF5bG9hZF9pbmZvKTsKKwl9CisJVGVzdF9WbmljX2NoYW5uZWwgPSBOVUxMOworCWlmIChQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCk7CisJCVB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCA9IE5VTEw7CisJfQorCWZpbGV4ZmVyX2Rlc3RydWN0b3IoKTsKKwlpZiAoQ29udHJvbFZtT2JqZWN0KSB7CisJCXZpc29yX3Byb2NfRGVzdHJveU9iamVjdChDb250cm9sVm1PYmplY3QpOworCQlDb250cm9sVm1PYmplY3QgPSBOVUxMOworCX0KKwljbGVhbnVwX2NvbnRyb2x2bV9zdHJ1Y3R1cmVzKCk7CisKKwlpZiAoQ29udHJvbFZtVHlwZSkgeworCQl2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKENvbnRyb2xWbVR5cGUpOworCQlDb250cm9sVm1UeXBlID0gTlVMTDsKKwl9CisJaWYgKFBhcnRpdGlvblR5cGUpIHsKKwkJdmlzb3JfcHJvY19EZXN0cm95VHlwZShQYXJ0aXRpb25UeXBlKTsKKwkJUGFydGl0aW9uVHlwZSA9IE5VTEw7CisJfQorCWlmIChkaWFnX3Byb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFZJU09SQ0hJUFNFVF9ESUFHX1BST0NfRU5UUllfRk4sIFByb2NEaXIpOworCQlkaWFnX3Byb2NfZGlyID0gTlVMTDsKKwl9CisJbWVtc2V0KCZnX0RpYWdNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCWlmIChjaGlwc2V0X3Byb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFZJU09SQ0hJUFNFVF9DSElQU0VUX1BST0NfRU5UUllfRk4sIFByb2NEaXIpOworCQljaGlwc2V0X3Byb2NfZGlyID0gTlVMTDsKKwl9CisJbWVtc2V0KCZnX0NoaXBTZXRNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCWlmIChwYXJhaG90cGx1Z19wcm9jX2RpcikgeworCQlyZW1vdmVfcHJvY19lbnRyeShWSVNPUkNISVBTRVRfUEFSQUhPVFBMVUdfUFJPQ19FTlRSWV9GTiwKKwkJCQkgIFByb2NEaXIpOworCQlwYXJhaG90cGx1Z19wcm9jX2RpciA9IE5VTEw7CisJfQorCisJbWVtc2V0KCZnX0RlbER1bXBNc2dIZHIsIDAsIHNpemVvZihDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIpKTsKKworCXByb2NfRGVJbml0KCk7CisJaWYgKENvbnRyb2xWbV9jaGFubmVsICE9IE5VTEwpIHsKKwkJTE9HSU5GKCJDaGFubmVsICVzIChDb250cm9sVm0pIGRpc2Nvbm5lY3RlZCIsCisJCSAgICAgICB2aXNvcmNoYW5uZWxfaWQoQ29udHJvbFZtX2NoYW5uZWwsIHMpKTsKKwkJdmlzb3JjaGFubmVsX2Rlc3Ryb3koQ29udHJvbFZtX2NoYW5uZWwpOworCQlDb250cm9sVm1fY2hhbm5lbCA9IE5VTEw7CisJfQorCWNvbnRyb2x2bV9kZWluaXQoKTsKKwl2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKCk7CisJUE9TVENPREVfTElOVVhfMihEUklWRVJfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisJTE9HSU5GKCJjaGlwc2V0IGRyaXZlciB1bmxvYWRlZCIpOworfQorCittb2R1bGVfcGFyYW1fbmFtZWQodGVzdHZuaWMsIHZpc29yY2hpcHNldF90ZXN0dm5pYywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Rlc3R2bmljLCAiMSB0byB0ZXN0IHZuaWMsIHVzaW5nIGR1bW15IFZOSUMgY29ubmVjdGVkIHZpYSBhIGxvb3BiYWNrIHRvIGEgcGh5c2ljYWwgZXRoZXJuZXQiKTsKK2ludCB2aXNvcmNoaXBzZXRfdGVzdHZuaWMgPSAwOworCittb2R1bGVfcGFyYW1fbmFtZWQodGVzdHZuaWNjbGllbnQsIHZpc29yY2hpcHNldF90ZXN0dm5pY2NsaWVudCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50LCAiMSB0byB0ZXN0IHZuaWMsIHVzaW5nIHJlYWwgVk5JQyBjaGFubmVsIGF0dGFjaGVkIHRvIGEgc2VwYXJhdGUgSU9WTSBndWVzdCIpOworaW50IHZpc29yY2hpcHNldF90ZXN0dm5pY2NsaWVudCA9IDA7CisKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0bXNnLCB2aXNvcmNoaXBzZXRfdGVzdG1zZywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Rlc3Rtc2csCisJCSAiMSB0byBtYW51ZmFjdHVyZSB0aGUgY2hpcHNldCwgYnVzLCBhbmQgc3dpdGNoIG1lc3NhZ2VzIik7CitpbnQgdmlzb3JjaGlwc2V0X3Rlc3Rtc2cgPSAwOworCittb2R1bGVfcGFyYW1fbmFtZWQobWFqb3IsIHZpc29yY2hpcHNldF9tYWpvciwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X21ham9yLCAibWFqb3IgZGV2aWNlIG51bWJlciB0byB1c2UgZm9yIHRoZSBkZXZpY2Ugbm9kZSIpOworaW50IHZpc29yY2hpcHNldF9tYWpvciA9IDA7CisKK21vZHVsZV9wYXJhbV9uYW1lZChzZXJ2ZXJyZWd3YWl0LCB2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3NlcnZlcnJlcXdhaXQsCisJCSAiMSB0byBoYXZlIHRoZSBtb2R1bGUgd2FpdCBmb3IgdGhlIHZpc29yIGJ1cyB0byByZWdpc3RlciIpOworaW50IHZpc29yY2hpcHNldF9zZXJ2ZXJyZWd3YWl0ID0gMDsJLyogZGVmYXVsdCBpcyBvZmYgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChjbGllbnRyZWd3YWl0LCB2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQsICIxIHRvIGhhdmUgdGhlIG1vZHVsZSB3YWl0IGZvciB0aGUgdmlzb3JjbGllbnRidXMgdG8gcmVnaXN0ZXIiKTsKK2ludCB2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCA9IDE7CS8qIGRlZmF1bHQgaXMgb24gKi8KK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0dGVhcmRvd24sIHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd24sIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHZpc29yY2hpcHNldF90ZXN0dGVhcmRvd24sCisJCSAiMSB0byB0ZXN0IHRlYXJkb3duIG9mIHRoZSBjaGlwc2V0LCBidXMsIGFuZCBzd2l0Y2giKTsKK2ludCB2aXNvcmNoaXBzZXRfdGVzdHRlYXJkb3duID0gMDsJLyogZGVmYXVsdCBpcyBvZmYgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX2NvbnRyb2x2bSwgdmlzb3JjaGlwc2V0X2Rpc2FibGVfY29udHJvbHZtLCBpbnQsCisJCSAgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0sCisJCSAiMSB0byBkaXNhYmxlIHBvbGxpbmcgb2YgY29udHJvbFZtIGNoYW5uZWwiKTsKK2ludCB2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0gPSAwOwkvKiBkZWZhdWx0IGlzIG9mZiAqLworbW9kdWxlX3BhcmFtX25hbWVkKGNyYXNoX2tlcm5lbCwgdmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbCwKKwkJICIxIG1lYW5zIHdlIGFyZSBydW5uaW5nIGluIGNyYXNoIGtlcm5lbCIpOworaW50IHZpc29yY2hpcHNldF9jcmFzaF9rZXJuZWwgPSAwOyAvKiBkZWZhdWx0IGlzIHJ1bm5pbmcgaW4gbm9uLWNyYXNoIGtlcm5lbCAqLworbW9kdWxlX3BhcmFtX25hbWVkKGhvbGRjaGlwc2V0cmVhZHksIHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5LAorCQkgICBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSwKKwkJICIxIHRvIGhvbGQgcmVzcG9uc2UgdG8gQ0hJUFNFVF9SRUFEWSIpOworaW50IHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5ID0gMDsgLyogZGVmYXVsdCBpcyB0byBzZW5kIENISVBTRVRfUkVBRFkKKwkJCQkgICAgICAqIHJlc3BvbnNlIGltbWVkaWF0ZWx5ICovCittb2R1bGVfaW5pdCh2aXNvcmNoaXBzZXRfaW5pdCk7Cittb2R1bGVfZXhpdCh2aXNvcmNoaXBzZXRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlVuaXN5cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlcnZpc29yIGNoaXBzZXQgZHJpdmVyIGZvciBzZXJ2aWNlIHBhcnRpdGlvbjogdmVyICIKKwkJICAgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF91bW9kZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X3Vtb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5ZTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF91bW9kZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIHZpc29yY2hpcHNldF91bW9kZS5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiogQGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFRoaXMgZGVzY3JpYmVzIHN0cnVjdHVyZXMgbmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlCisgKiAgdmlzb3JjaGlwc2V0IGRyaXZlciBhbmQgYSB1c2VyLW1vZGUgY29tcG9uZW50IHRoYXQgb3BlbnMgdGhlIGRldmljZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1ZJU09SQ0hJUFNFVF9VTU9ERV9ICisjZGVmaW5lIF9fVklTT1JDSElQU0VUX1VNT0RFX0gKKworCisKKy8qKiBUaGUgdXNlci1tb2RlIHByb2dyYW0gY2FuIGFjY2VzcyB0aGUgY29udHJvbCBjaGFubmVsIGJ1ZmZlciBkaXJlY3RseQorICogIHZpYSB0aGlzIG1lbW9yeSBtYXAuCisgKi8KKyNkZWZpbmUgVklTT1JDSElQU0VUX01NQVBfQ09OVFJPTENIQU5PRkZTRVQgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIFZJU09SQ0hJUFNFVF9NTUFQX0NPTlRST0xDSEFOU0laRSAgICAgICgweDAwNDAwMDAwKSAgLyogNE1CICovCisKKyNlbmRpZiAvKiBfX1ZJU09SQ0hJUFNFVF9VTU9ERV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmY2MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACisjCisjIFVuaXN5cyB0aW1za21vZCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBVTklTWVNfVklTT1JVVElMCisJdHJpc3RhdGUgIlVuaXN5cyB2aXNvcnV0aWwgZHJpdmVyIgorCWRlcGVuZHMgb24gVU5JU1lTU1BBUgorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdmlzb3J1dGlsIGRyaXZlci4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ2Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgVW5pc3lzIHRpbXNrbW9kCisjCisKK29iai0kKENPTkZJR19VTklTWVNfVklTT1JVVElMKQkrPSB2aXNvcnV0aWwubworCit2aXNvcnV0aWwteSA6PSBjaGFycXVldWUubyAgZWFzeXByb2MubyAgcGVyaW9kaWNfd29yay5vICBwcm9jb2JqZWN0dHJlZS5vICBcCisJCW1lbXJlZ2lvbl9kaXJlY3QubyB2aXNvcmttb2R1dGlscy5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZQorY2NmbGFncy15ICs9IC1EQ09ORklHX1NQQVJfR1VFU1QgLURHVUVTVERSSVZFUkJVSUxEIC1ETk9BVVRPVkVSU0lPTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2VlZGUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIGNoYXJxdWV1ZS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogIFNpbXBsZSBjaGFyYWN0ZXIgcXVldWUgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IGtlcm5lbCBtb2RlLgorICovCisKKyNpbmNsdWRlICJjaGFycXVldWUuaCIKKworI2RlZmluZSBNWURSVk5BTUUgImNoYXJxdWV1ZSIKKworI2RlZmluZSBJU19FTVBUWShjaGFycXVldWUpIChjaGFycXVldWUtPmhlYWQgPT0gY2hhcnF1ZXVlLT50YWlsKQorCisKKworc3RydWN0IENIQVJRVUVVRV9UYWcgeworCWludCBhbGxvY19zaXplOworCWludCBuc2xvdHM7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCBoZWFkLCB0YWlsOworCXVuc2lnbmVkIGNoYXIgYnVmWzBdOworfTsKKworCisKK0NIQVJRVUVVRSAqdmlzb3JfY2hhcnF1ZXVlX2NyZWF0ZSh1bG9uZyBuc2xvdHMpCit7CisJaW50IGFsbG9jX3NpemUgPSBzaXplb2YoQ0hBUlFVRVVFKSArIG5zbG90cyArIDE7CisJQ0hBUlFVRVVFICpjcSA9IGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAoY3EgPT0gTlVMTCkgeworCQlFUlJEUlYoInZpc29yX2NoYXJxdWV1ZV9jcmVhdGUgYWxsb2NhdGlvbiBmYWlsZWQgKGFsbG9jX3NpemU9JWQpIiwKKwkJICAgICAgIGFsbG9jX3NpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3EtPmFsbG9jX3NpemUgPSBhbGxvY19zaXplOworCWNxLT5uc2xvdHMgPSBuc2xvdHM7CisJY3EtPmhlYWQgPSBjcS0+dGFpbCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmNxLT5sb2NrKTsKKwlyZXR1cm4gY3E7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9jaGFycXVldWVfY3JlYXRlKTsKKworCisKK3ZvaWQgdmlzb3JfY2hhcnF1ZXVlX2VucXVldWUoQ0hBUlFVRVVFICpjaGFycXVldWUsIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpbnQgYWxsb2Nfc2xvdHMgPSBjaGFycXVldWUtPm5zbG90cysxOyAgLyogMSBzbG90IGlzIGFsd2F5cyBlbXB0eSAqLworCisJc3Bpbl9sb2NrKCZjaGFycXVldWUtPmxvY2spOworCWNoYXJxdWV1ZS0+aGVhZCA9IChjaGFycXVldWUtPmhlYWQrMSkgJSBhbGxvY19zbG90czsKKwlpZiAoY2hhcnF1ZXVlLT5oZWFkID09IGNoYXJxdWV1ZS0+dGFpbCkKKwkJLyogb3ZlcmZsb3c7IG92ZXJ3cml0ZSB0aGUgb2xkZXN0IGVudHJ5ICovCisJCWNoYXJxdWV1ZS0+dGFpbCA9IChjaGFycXVldWUtPnRhaWwrMSkgJSBhbGxvY19zbG90czsKKwljaGFycXVldWUtPmJ1ZltjaGFycXVldWUtPmhlYWRdID0gYzsKKwlzcGluX3VubG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2NoYXJxdWV1ZV9lbnF1ZXVlKTsKKworCisKK0JPT0wgdmlzb3JfY2hhcnF1ZXVlX2lzX2VtcHR5KENIQVJRVUVVRSAqY2hhcnF1ZXVlKQoreworCUJPT0wgYjsKKwlzcGluX2xvY2soJmNoYXJxdWV1ZS0+bG9jayk7CisJYiA9IElTX0VNUFRZKGNoYXJxdWV1ZSk7CisJc3Bpbl91bmxvY2soJmNoYXJxdWV1ZS0+bG9jayk7CisJcmV0dXJuIGI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9jaGFycXVldWVfaXNfZW1wdHkpOworCisKKworc3RhdGljIGludCBjaGFycXVldWVfZGVxdWV1ZV8xKENIQVJRVUVVRSAqY2hhcnF1ZXVlKQoreworCWludCBhbGxvY19zbG90cyA9IGNoYXJxdWV1ZS0+bnNsb3RzICsgMTsgIC8qIDEgc2xvdCBpcyBhbHdheXMgZW1wdHkgKi8KKworCWlmIChJU19FTVBUWShjaGFycXVldWUpKQorCQlyZXR1cm4gLTE7CisJY2hhcnF1ZXVlLT50YWlsID0gKGNoYXJxdWV1ZS0+dGFpbCsxKSAlIGFsbG9jX3Nsb3RzOworCXJldHVybiBjaGFycXVldWUtPmJ1ZltjaGFycXVldWUtPnRhaWxdOworfQorCisKKworaW50IGNoYXJxdWV1ZV9kZXF1ZXVlKENIQVJRVUVVRSAqY2hhcnF1ZXVlKQoreworCWludCByYzsKKworCXNwaW5fbG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKKwlyYyA9IGNoYXJxdWV1ZV9kZXF1ZXVlXzEoY2hhcnF1ZXVlKTsKKwlzcGluX3VubG9jaygmY2hhcnF1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKworCitpbnQgdmlzb3JfY2hhcnF1ZXVlX2RlcXVldWVfbihDSEFSUVVFVUUgKmNoYXJxdWV1ZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbikKK3sKKwlpbnQgcmMsIGNvdW50ZXIgPSAwLCBjOworCisJc3Bpbl9sb2NrKCZjaGFycXVldWUtPmxvY2spOworCWZvciAoOzspIHsKKwkJaWYgKG4gPD0gMCkKKwkJCWJyZWFrOyAgLyogbm8gbW9yZSBidWZmZXIgc3BhY2UgKi8KKwkJYyA9IGNoYXJxdWV1ZV9kZXF1ZXVlXzEoY2hhcnF1ZXVlKTsKKwkJaWYgKGMgPCAwKQorCQkJYnJlYWs7ICAvKiBubyBtb3JlIGlucHV0ICovCisJCSpidWYgPSAodW5zaWduZWQgY2hhcikoYyk7CisJCWJ1ZisrOworCQluLS07CisJCWNvdW50ZXIrKzsKKwl9CisJcmMgPSBjb3VudGVyOworCXNwaW5fdW5sb2NrKCZjaGFycXVldWUtPmxvY2spOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2NoYXJxdWV1ZV9kZXF1ZXVlX24pOworCisKKwordm9pZCB2aXNvcl9jaGFycXVldWVfZGVzdHJveShDSEFSUVVFVUUgKmNoYXJxdWV1ZSkKK3sKKwlpZiAoY2hhcnF1ZXVlID09IE5VTEwpCisJCXJldHVybjsKKwlrZnJlZShjaGFycXVldWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfY2hhcnF1ZXVlX2Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9jaGFycXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJhZTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKQEAgLTAsMCArMSwzNyBAQAorLyogY2hhcnF1ZXVlLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DSEFSUVVFVUVfSF9fCisjZGVmaW5lIF9fQ0hBUlFVRVVFX0hfXworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKy8qIENIQVJRVUVVRSBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgorICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ0hBUlFVRVVFX1RhZyBDSEFSUVVFVUU7CisKK0NIQVJRVUVVRSAqdmlzb3JfY2hhcnF1ZXVlX2NyZWF0ZSh1bG9uZyBuc2xvdHMpOwordm9pZCB2aXNvcl9jaGFycXVldWVfZW5xdWV1ZShDSEFSUVVFVUUgKmNoYXJxdWV1ZSwgdW5zaWduZWQgY2hhciBjKTsKK2ludCBjaGFycXVldWVfZGVxdWV1ZShDSEFSUVVFVUUgKmNoYXJxdWV1ZSk7CitpbnQgdmlzb3JfY2hhcnF1ZXVlX2RlcXVldWVfbihDSEFSUVVFVUUgKmNoYXJxdWV1ZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbik7CitCT09MIHZpc29yX2NoYXJxdWV1ZV9pc19lbXB0eShDSEFSUVVFVUUgKmNoYXJxdWV1ZSk7Cit2b2lkIHZpc29yX2NoYXJxdWV1ZV9kZXN0cm95KENIQVJRVUVVRSAqY2hhcnF1ZXVlKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjZiODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5jCkBAIC0wLDAgKzEsMzcxIEBACisvKiBDb3B5cmlnaHQgwqkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKiogQGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEhhbmRsZSBwcm9jZnMtc3BlY2lmaWMgdGFza3MuCisgKiAgTm90ZSB0aGF0IHRoaXMgZmlsZSBkb2VzIG5vdCBrbm93IGFib3V0IGFueSBtb2R1bGUtc3BlY2lmaWMgdGhpbmdzLCBub3IKKyAqICBkb2VzIGl0IGtub3cgYW55dGhpbmcgYWJvdXQgd2hhdCBpbmZvcm1hdGlvbiB0byByZXZlYWwgYXMgcGFydCBvZiB0aGUgcHJvYworICogIGVudHJpZXMuICBUaGUgMiBmdW5jdGlvbnMgdGhhdCB0YWtlIGNhcmUgb2YgZGlzcGxheWluZyBkZXZpY2UgYW5kCisgKiAgZHJpdmVyIHNwZWNpZmljIGluZm9ybWF0aW9uIGFyZSBwYXNzZWQgYXMgcGFyYW1ldGVycyB0bworICogIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXIoKS4KKyAqCisgKiAgICAgIHZvaWQgc2hvd19kZXZpY2VfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqcCk7CisgKiAgICAgIHZvaWQgc2hvd19kcml2ZXJfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7CisgKgorICogIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHNob3dfZGV2aWNlX2luZm8gaXMgYWN0dWFsbHkgYSBwb2ludGVyIHRvIHRoZQorICogIGRldmljZS1zcGVjaWZpYyBpbmZvIHRvIHNob3cuICBJdCBpcyB0aGUgY29udGV4dCB0aGF0IHdhcyBvcmlnaW5hbGx5CisgKiAgcGFzc2VkIHRvIHZpc29yX2Vhc3lwcm9jX0luaXREZXZpY2UoKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgInVuaWtsb2cuaCIKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorI2luY2x1ZGUgImVhc3lwcm9jLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJlYXN5cHJvYyIKKworCisKKy8qCisgKiAgIC9wcm9jLzxQcm9jSWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY0RpcgorICogICAvcHJvYy88UHJvY0lkPi9kcml2ZXIgICAgICAgICAgICAgICAgICAgICAgIFByb2NEcml2ZXJEaXIKKyAqICAgL3Byb2MvPFByb2NJZD4vZHJpdmVyL2RpYWcgICAgICAgICAgICAgICAgICBQcm9jRHJpdmVyRGlhZ0ZpbGUKKyAqICAgL3Byb2MvPFByb2NJZD4vZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICBQcm9jRGV2aWNlRGlyCisgKiAgIC9wcm9jLzxQcm9jSWQ+L2RldmljZS8wICAgICAgICAgICAgICAgICAgICAgcHJvY0RldmljZXhEaXIKKyAqICAgL3Byb2MvPFByb2NJZD4vZGV2aWNlLzAvZGlhZyAgICAgICAgICAgICAgICBwcm9jRGV2aWNleERpYWdGaWxlCisgKi8KKworCitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZV9kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCisJY3JlYXRlUHJvY0RpcihjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnAgPSBwcm9jX21rZGlyX21vZGUobmFtZSwgU19JRkRJUiwgcGFyZW50KTsKKwlpZiAocCA9PSBOVUxMKQorCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwgbmFtZSk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQgc2VxX3Nob3dfZHJpdmVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworc3RhdGljIGludCBwcm9jX29wZW5fZHJpdmVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvd19kcml2ZXIsIFBERV9EQVRBKGlub2RlKSk7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZvcHNfZHJpdmVyID0geworCS5vcGVuID0gcHJvY19vcGVuX2RyaXZlciwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS53cml0ZSA9IHByb2Nfd3JpdGVfZHJpdmVyLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc2VxX3Nob3dfZGV2aWNlKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworc3RhdGljIGludCBzZXFfc2hvd19kZXZpY2VfcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitzdGF0aWMgaW50IHByb2Nfb3Blbl9kZXZpY2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNlcV9zaG93X2RldmljZSwgUERFX0RBVEEoaW5vZGUpKTsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZm9wc19kZXZpY2UgPSB7CisJLm9wZW4gPSBwcm9jX29wZW5fZGV2aWNlLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gcHJvY193cml0ZV9kZXZpY2UsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKK3N0YXRpYyBpbnQgcHJvY19vcGVuX2RldmljZV9wcm9wZXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2VxX3Nob3dfZGV2aWNlX3Byb3BlcnR5LCBQREVfREFUQShpbm9kZSkpOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzX2RldmljZV9wcm9wZXJ0eSA9IHsKKwkub3BlbiA9IHByb2Nfb3Blbl9kZXZpY2VfcHJvcGVydHksCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisKKwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBjaGFyICpwcm9jSWQsCisJCQkgICAgICAgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKKwkJCSAgICAgICB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJdm9pZCAqKSkKK3sKKwltZW1zZXQocGRyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbykpOworCXBkcml2ZXItPlByb2NJZCA9IHByb2NJZDsKKwlpZiAocGRyaXZlci0+UHJvY0lkID09IE5VTEwpCisJCUVSUkRSVigiUHJvY0lkIGNhbm5vdCBiZSBOVUxMICh0cm91YmxlIGFoZWFkKSEiKTsKKwlwZHJpdmVyLT5TaG93X2RyaXZlcl9pbmZvID0gc2hvd19kcml2ZXJfaW5mbzsKKwlwZHJpdmVyLT5TaG93X2RldmljZV9pbmZvID0gc2hvd19kZXZpY2VfaW5mbzsKKwlpZiAocGRyaXZlci0+UHJvY0RpciA9PSBOVUxMKQorCQlwZHJpdmVyLT5Qcm9jRGlyID0gY3JlYXRlUHJvY0RpcihwZHJpdmVyLT5Qcm9jSWQsIE5VTEwpOworCWlmICgocGRyaXZlci0+UHJvY0RpciAhPSBOVUxMKSAmJiAocGRyaXZlci0+UHJvY0RyaXZlckRpciA9PSBOVUxMKSkKKwkJcGRyaXZlci0+UHJvY0RyaXZlckRpciA9IGNyZWF0ZVByb2NEaXIoImRyaXZlciIsCisJCQkJCQkgICAgICAgcGRyaXZlci0+UHJvY0Rpcik7CisJaWYgKChwZHJpdmVyLT5Qcm9jRGlyICE9IE5VTEwpICYmIChwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyID09IE5VTEwpKQorCQlwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyID0gY3JlYXRlUHJvY0RpcigiZGV2aWNlIiwKKwkJCQkJCSAgICAgICBwZHJpdmVyLT5Qcm9jRGlyKTsKKwlpZiAoKHBkcml2ZXItPlByb2NEcml2ZXJEaXIgIT0gTlVMTCkgJiYKKwkgICAgKHBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSA9PSBOVUxMKSkgeworCQlwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgPQorCQkJcHJvY19jcmVhdGVfZGF0YSgiZGlhZyIsIDAsCisJCQkJCSBwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyLAorCQkJCQkgJnByb2NfZm9wc19kcml2ZXIsIHBkcml2ZXIpOworCQlpZiAocGRyaXZlci0+UHJvY0RyaXZlckRpYWdGaWxlID09IE5VTEwpCisJCQlFUlJEUlYoImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kcml2ZXIvZGlhZyBlbnRyeSIsCisJCQkgICAgICAgcGRyaXZlci0+UHJvY0lkKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKTsKKworCisKK3ZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlckV4KHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCQkgY2hhciAqcHJvY0lkLAorCQkJCSB2b2lkICgqc2hvd19kcml2ZXJfaW5mbykoc3RydWN0IHNlcV9maWxlICopLAorCQkJCSB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJICB2b2lkICopLAorCQkJCSB2b2lkICgqd3JpdGVfZHJpdmVyX2luZm8pKGNoYXIgKmJ1ZiwKKwkJCQkJCQkgICBzaXplX3QgY291bnQsCisJCQkJCQkJICAgbG9mZl90ICpwcG9zKSwKKwkJCQkgdm9pZCAoKndyaXRlX2RldmljZV9pbmZvKShjaGFyICpidWYsCisJCQkJCQkJICAgc2l6ZV90IGNvdW50LAorCQkJCQkJCSAgIGxvZmZfdCAqcHBvcywKKwkJCQkJCQkgICB2b2lkICpwKSkKK3sKKwl2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKHBkcml2ZXIsIHByb2NJZCwKKwkJCQkgIHNob3dfZHJpdmVyX2luZm8sIHNob3dfZGV2aWNlX2luZm8pOworCXBkcml2ZXItPldyaXRlX2RyaXZlcl9pbmZvID0gd3JpdGVfZHJpdmVyX2luZm87CisJcGRyaXZlci0+V3JpdGVfZGV2aWNlX2luZm8gPSB3cml0ZV9kZXZpY2VfaW5mbzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXJFeCk7CisKKworCit2b2lkIHZpc29yX2Vhc3lwcm9jX0RlSW5pdERyaXZlcihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIpCit7CisJaWYgKHBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaWFnIiwgcGRyaXZlci0+UHJvY0RyaXZlckRpcik7CisJCXBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSA9IE5VTEw7CisJfQorCWlmIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyICE9IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlciIsIHBkcml2ZXItPlByb2NEaXIpOworCQlwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyID0gTlVMTDsKKwl9CisJaWYgKHBkcml2ZXItPlByb2NEZXZpY2VEaXIgIT0gTlVMTCkgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiZGV2aWNlIiwgcGRyaXZlci0+UHJvY0Rpcik7CisJCXBkcml2ZXItPlByb2NEZXZpY2VEaXIgPSBOVUxMOworCX0KKwlpZiAocGRyaXZlci0+UHJvY0RpciAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHBkcml2ZXItPlByb2NJZCwgTlVMTCk7CisJCXBkcml2ZXItPlByb2NEaXIgPSBOVUxMOworCX0KKwlwZHJpdmVyLT5Qcm9jSWQgPSBOVUxMOworCXBkcml2ZXItPlNob3dfZHJpdmVyX2luZm8gPSBOVUxMOworCXBkcml2ZXItPlNob3dfZGV2aWNlX2luZm8gPSBOVUxMOworCXBkcml2ZXItPldyaXRlX2RyaXZlcl9pbmZvID0gTlVMTDsKKwlwZHJpdmVyLT5Xcml0ZV9kZXZpY2VfaW5mbyA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19EZUluaXREcml2ZXIpOworCisKKwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubywKKwkJCSAgICAgICB2b2lkICpkZXZkYXRhKQoreworCWlmICgocGRyaXZlci0+UHJvY0RldmljZURpciAhPSBOVUxMKSAmJiAocC0+cHJvY0RldmljZXhEaXIgPT0gTlVMTCkpIHsKKwkJY2hhciBzWzI5XTsKKwkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7CisJCXAtPnByb2NEZXZpY2V4RGlyID0gY3JlYXRlUHJvY0RpcihzLCBwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyKTsKKwkJcC0+ZGV2bm8gPSBkZXZubzsKKwl9CisJcC0+ZGV2ZGF0YSA9IGRldmRhdGE7CisJcC0+cGRyaXZlciA9IHBkcml2ZXI7CisJcC0+ZGV2bm8gPSBkZXZubzsKKwlpZiAoKHAtPnByb2NEZXZpY2V4RGlyICE9IE5VTEwpICYmIChwLT5wcm9jRGV2aWNleERpYWdGaWxlID09IE5VTEwpKSB7CisJCXAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgPQorCQkJcHJvY19jcmVhdGVfZGF0YSgiZGlhZyIsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAorCQkJCQkgJnByb2NfZm9wc19kZXZpY2UsIHApOworCQlpZiAocC0+cHJvY0RldmljZXhEaWFnRmlsZSA9PSBOVUxMKQorCQkJRVJSREVWWChkZXZubywgImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kZXZpY2UvJWQvZGlhZyBlbnRyeSIsCisJCQkJcGRyaXZlci0+UHJvY0lkLCBkZXZubworCQkJICAgICAgICk7CisJfQorCW1lbXNldCgmKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvWzBdKSwgMCwKKwkgICAgICAgc2l6ZW9mKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKTsKKworCisKK3ZvaWQgdmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLAorCQkJCQkgdm9pZCAoKnNob3dfcHJvcGVydHlfaW5mbykKKwkJCQkJIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSwKKwkJCQkJIGNoYXIgKnByb3BlcnR5X25hbWUpCit7CisJc2l6ZV90IGk7CisJc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICpweCA9IE5VTEw7CisKKwlpZiAocC0+cHJvY0RldmljZXhEaXIgPT0gTlVMTCkgeworCQlFUlJEUlYoInN0YXRlIGVycm9yIik7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm8pOyBpKyspIHsKKwkJaWYgKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldLnByb2NFbnRyeSA9PSBOVUxMKSB7CisJCQlweCA9ICYocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9baV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFweCkgeworCQlFUlJERVZYKHAtPmRldm5vLCAidG9vIG1hbnkgZGV2aWNlIHByb3BlcnRpZXMiKTsKKwkJcmV0dXJuOworCX0KKwlweC0+ZGV2ZGF0YSA9IHAtPmRldmRhdGE7CisJcHgtPnBkcml2ZXIgPSBwLT5wZHJpdmVyOworCXB4LT5wcm9jRW50cnkgPSBwcm9jX2NyZWF0ZV9kYXRhKHByb3BlcnR5X25hbWUsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAorCQkJCQkgJnByb2NfZm9wc19kZXZpY2VfcHJvcGVydHksIHB4KTsKKwlpZiAoc3RybGVuKHByb3BlcnR5X25hbWUpKzEgPiBzaXplb2YocHgtPnByb3BlcnR5X25hbWUpKSB7CisJCUVSUkRFVlgocC0+ZGV2bm8sICJkZXZpY2UgcHJvcGVydHkgbmFtZSAlcyB0b28gbG9uZyIsCisJCQlwcm9wZXJ0eV9uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlzdHJjcHkocHgtPnByb3BlcnR5X25hbWUsIHByb3BlcnR5X25hbWUpOworCWlmIChweC0+cHJvY0VudHJ5ID09IE5VTEwpIHsKKwkJRVJSREVWWChwLT5kZXZubywgImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kZXZpY2UvJWQvJXMgZW50cnkiLAorCQkJcC0+cGRyaXZlci0+UHJvY0lkLCBwLT5kZXZubywgcHJvcGVydHlfbmFtZQorCQkgICAgICAgKTsKKwkJcmV0dXJuOworCX0KKwlweC0+c2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbyA9IHNob3dfcHJvcGVydHlfaW5mbzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX2Vhc3lwcm9jX0NyZWF0ZURldmljZVByb3BlcnR5KTsKKworCisKK3ZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCQkgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8pCit7CisJc2l6ZV90IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm8pOyBpKyspIHsKKwkJaWYgKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldLnByb2NFbnRyeSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKnB4ID0KKwkJCQkmKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldKTsKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KHB4LT5wcm9wZXJ0eV9uYW1lLCBwLT5wcm9jRGV2aWNleERpcik7CisJCQlweC0+cHJvY0VudHJ5ID0gTlVMTDsKKwkJfQorCX0KKwlpZiAocC0+cHJvY0RldmljZXhEaWFnRmlsZSAhPSBOVUxMKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkaWFnIiwgcC0+cHJvY0RldmljZXhEaXIpOworCQlwLT5wcm9jRGV2aWNleERpYWdGaWxlID0gTlVMTDsKKwl9CisJaWYgKHAtPnByb2NEZXZpY2V4RGlyICE9IE5VTEwpIHsKKwkJY2hhciBzWzI5XTsKKwkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHMsIHBkcml2ZXItPlByb2NEZXZpY2VEaXIpOworCQlwLT5wcm9jRGV2aWNleERpciA9IE5VTEw7CisJfQorCXAtPmRldmRhdGEgPSBOVUxMOworCXAtPnBkcml2ZXIgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKTsKKworCisKK3N0YXRpYyBpbnQgc2VxX3Nob3dfZHJpdmVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0KKwkJKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqKShzZXEtPnByaXZhdGUpOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisJKCoocC0+U2hvd19kcml2ZXJfaW5mbykpKHNlcSk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHNlcV9zaG93X2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCA9CisJCShzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoKCFwKSB8fCAoIShwLT5wZHJpdmVyKSkpCisJCXJldHVybiAwOworCSgqKHAtPnBkcml2ZXItPlNob3dfZGV2aWNlX2luZm8pKShzZXEsIHAtPmRldmRhdGEpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBzZXFfc2hvd19kZXZpY2VfcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKnAgPQorCQkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICopKHNlcS0+cHJpdmF0ZSk7CisJaWYgKCghcCkgfHwgKCEocC0+c2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbykpKQorCQlyZXR1cm4gMDsKKwkoKihwLT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKSkoc2VxLCBwLT5kZXZkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0gTlVMTDsKKwljaGFyIGxvY2FsX2J1ZlsyNTZdOworCWlmIChzZXEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcCA9IChzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoKCFwKSB8fCAoIShwLT5Xcml0ZV9kcml2ZXJfaW5mbykpKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPj0gc2l6ZW9mKGxvY2FsX2J1ZikpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChjb3B5X2Zyb21fdXNlcihsb2NhbF9idWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsb2NhbF9idWZbY291bnRdID0gJ1wwJzsgIC8qIGJlIGZyaWVuZGx5ICovCisJKCoocC0+V3JpdGVfZHJpdmVyX2luZm8pKShsb2NhbF9idWYsIGNvdW50LCBwcG9zKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworCitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXEgPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCA9IE5VTEw7CisJY2hhciBsb2NhbF9idWZbMjU2XTsKKwlpZiAoc2VxID09IE5VTEwpCisJCXJldHVybiAwOworCXAgPSAoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICopKHNlcS0+cHJpdmF0ZSk7CisJaWYgKCghcCkgfHwgKCEocC0+cGRyaXZlcikpIHx8ICghKHAtPnBkcml2ZXItPldyaXRlX2RldmljZV9pbmZvKSkpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+PSBzaXplb2YobG9jYWxfYnVmKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKGxvY2FsX2J1ZiwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWxvY2FsX2J1Zltjb3VudF0gPSAnXDAnOyAgLyogYmUgZnJpZW5kbHkgKi8KKwkoKihwLT5wZHJpdmVyLT5Xcml0ZV9kZXZpY2VfaW5mbykpKGxvY2FsX2J1ZiwgY291bnQsIHBwb3MsIHAtPmRldmRhdGEpOworCXJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWYxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIGVhc3lwcm9jLmgKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgVGhpcyBkZXNjcmliZXMgdGhlIGludGVyZmFjZXMgbmVjZXNzYXJ5IGZvciBhIHNpbXBsZSAvcHJvYyBmaWxlCisgKiAgaW1wbGVtZW50YXRpb24gZm9yIGEgZHJpdmVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fRUFTWVBST0NfSF9fCisjZGVmaW5lIF9fRUFTWVBST0NfSF9fCisKKyNpbmNsdWRlICJ0aW1za21vZC5oIgorCisKK3N0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyB7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRGlyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqUHJvY0RyaXZlckRpcjsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEcml2ZXJEaWFnRmlsZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEZXZpY2VEaXI7CisJY2hhciAqUHJvY0lkOworCXZvaWQgKCpTaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqcCk7CisJdm9pZCAoKlNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKKwl2b2lkICgqV3JpdGVfZGV2aWNlX2luZm8pKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgbG9mZl90ICpwcG9zLCB2b2lkICpwKTsKKwl2b2lkICgqV3JpdGVfZHJpdmVyX2luZm8pKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworfTsKKworLyogcHJvcGVydHkgaXMgYSBmaWxlIHVuZGVyIC9wcm9jLzx4Pi9kZXZpY2UvPHg+Lzxwcm9wZXJ0eV9uYW1lPiAqLworc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvIHsKKwljaGFyIHByb3BlcnR5X25hbWVbMjVdOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0VudHJ5OworCXN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcjsKKwl2b2lkICpkZXZkYXRhOworCXZvaWQgKCpzaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqcCk7Cit9OworCitzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8geworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RldmljZXhEaXI7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRGV2aWNleERpYWdGaWxlOworCXN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcjsKKwl2b2lkICpkZXZkYXRhOworCWludCBkZXZubzsKKwkvKiAgYWxsb3cgZm9yIGEgbnVtYmVyIG9mIGN1c3RvbSBwcm9wZXJ0aWVzIGZvciBlYWNoIGRldmljZTogKi8KKwlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gZGV2aWNlX3Byb3BlcnR5X2luZm9bMTBdOworfTsKKwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubywKKwkJCSAgICAgICB2b2lkICpkZXZkYXRhKTsKK3ZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCQkgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8pOwordm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKKwkJCSAgICAgICBjaGFyICpwcm9jSWQsCisJCQkgICAgICAgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKKwkJCSAgICAgICB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCisJCQkJCQkJdm9pZCAqKSk7Cit2b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXJFeChzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCisJCQkJIGNoYXIgKnByb2NJZCwKKwkJCQkgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKKwkJCQkgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAorCQkJCQkJCSAgdm9pZCAqKSwKKwkJCQkgdm9pZCAoKldyaXRlX2RyaXZlcl9pbmZvKShjaGFyICpidWYsCisJCQkJCQkJICAgc2l6ZV90IGNvdW50LAorCQkJCQkJCSAgIGxvZmZfdCAqcHBvcyksCisJCQkJIHZvaWQgKCpXcml0ZV9kZXZpY2VfaW5mbykoY2hhciAqYnVmLAorCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKKwkJCQkJCQkgICBsb2ZmX3QgKnBwb3MsCisJCQkJCQkJICAgdm9pZCAqcCkpOwordm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREcml2ZXIoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyKTsKK3ZvaWQgdmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLAorCQkJCQkgdm9pZCAoKnNob3dfcHJvcGVydHlfaW5mbykKKwkJCQkJIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSwKKwkJCQkJIGNoYXIgKnByb3BlcnR5X25hbWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxMjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIG1lbXJlZ2lvbi5oCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fTUVNUkVHSU9OX0hfXworI2RlZmluZSBfX01FTVJFR0lPTl9IX18KKworI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKy8qIE1FTVJFR0lPTiBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgorICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTUVNUkVHSU9OX1RhZyBNRU1SRUdJT047CisKK01FTVJFR0lPTiAqdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZShIT1NUQUREUkVTUyBwaHlzYWRkciwgdWxvbmcgbmJ5dGVzKTsKK01FTVJFR0lPTiAqdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZV9vdmVybGFwcGVkKE1FTVJFR0lPTiAqcGFyZW50LAorCQkJCQkgICAgIHVsb25nIG9mZnNldCwgdWxvbmcgbmJ5dGVzKTsKK2ludCB2aXNvcl9tZW1yZWdpb25fcmVzaXplKE1FTVJFR0lPTiAqbWVtcmVnaW9uLCB1bG9uZyBuZXdzaXplKTsKK2ludCB2aXNvcl9tZW1yZWdpb25fcmVhZChNRU1SRUdJT04gKm1lbXJlZ2lvbiwKKwkJICAgdWxvbmcgb2Zmc2V0LCB2b2lkICpkZXN0LCB1bG9uZyBuYnl0ZXMpOworaW50IHZpc29yX21lbXJlZ2lvbl93cml0ZShNRU1SRUdJT04gKm1lbXJlZ2lvbiwKKwkJCSAgdWxvbmcgb2Zmc2V0LCB2b2lkICpzcmMsIHVsb25nIG5ieXRlcyk7Cit2b2lkIHZpc29yX21lbXJlZ2lvbl9kZXN0cm95KE1FTVJFR0lPTiAqbWVtcmVnaW9uKTsKK0hPU1RBRERSRVNTIHZpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIoTUVNUkVHSU9OICptZW1yZWdpb24pOwordWxvbmcgdmlzb3JfbWVtcmVnaW9uX2dldF9uYnl0ZXMoTUVNUkVHSU9OICptZW1yZWdpb24pOwordm9pZCBtZW1yZWdpb25fZHVtcChNRU1SRUdJT04gKm1lbXJlZ2lvbiwgY2hhciAqcywKKwkJICAgIHVsb25nIG9mZiwgdWxvbmcgbGVuLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7Cit2b2lkICp2aXNvcl9tZW1yZWdpb25fZ2V0X3BvaW50ZXIoTUVNUkVHSU9OICptZW1yZWdpb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbl9kaXJlY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbl9kaXJlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzEwNjFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uX2RpcmVjdC5jCkBAIC0wLDAgKzEsMjIzIEBACisvKiBtZW1yZWdpb25fZGlyZWN0LmMKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICovCisKKy8qCisgKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBtZW1vcnkgcmVnaW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlYWQvd3JpdGUKKyAqICBjaGFubmVsIG1lbW9yeSAoaW4gbWFpbiBtZW1vcnkgb2YgdGhlIGhvc3Qgc3lzdGVtKSBmcm9tIGNvZGUgcnVubmluZyBpbgorICogIGEgdmlydHVhbCBwYXJ0aXRpb24uCisgKi8KKyNpbmNsdWRlICJ1bmlrbG9nLmgiCisjaW5jbHVkZSAidGltc2ttb2QuaCIKKyNpbmNsdWRlICJtZW1yZWdpb24uaCIKKworI2RlZmluZSBNWURSVk5BTUUgIm1lbXJlZ2lvbiIKKworc3RydWN0IE1FTVJFR0lPTl9UYWcgeworCUhPU1RBRERSRVNTIHBoeXNhZGRyOworCXVsb25nIG5ieXRlczsKKwl2b2lkICptYXBwZWQ7CisJQk9PTCByZXF1ZXN0ZWQ7CisJQk9PTCBvdmVybGFwcGVkOworfTsKKworc3RhdGljIEJPT0wgbWFwaXQoTUVNUkVHSU9OICptZW1yZWdpb24pOworc3RhdGljIHZvaWQgdW5tYXBpdChNRU1SRUdJT04gKm1lbXJlZ2lvbik7CisKK01FTVJFR0lPTiAqCit2aXNvcl9tZW1yZWdpb25fY3JlYXRlKEhPU1RBRERSRVNTIHBoeXNhZGRyLCB1bG9uZyBuYnl0ZXMpCit7CisJTUVNUkVHSU9OICpyYyA9IE5VTEw7CisJTUVNUkVHSU9OICptZW1yZWdpb24gPSBremFsbG9jKHNpemVvZihNRU1SRUdJT04pLAorCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKG1lbXJlZ2lvbiA9PSBOVUxMKSB7CisJCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX2NyZWF0ZSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtcmVnaW9uLT5waHlzYWRkciA9IHBoeXNhZGRyOworCW1lbXJlZ2lvbi0+bmJ5dGVzID0gbmJ5dGVzOworCW1lbXJlZ2lvbi0+b3ZlcmxhcHBlZCA9IEZBTFNFOworCWlmICghbWFwaXQobWVtcmVnaW9uKSkgeworCQlyYyA9IE5VTEw7CisJCWdvdG8gQXdheTsKKwl9CisJcmMgPSBtZW1yZWdpb247CitBd2F5OgorCWlmIChyYyA9PSBOVUxMKSB7CisJCWlmIChtZW1yZWdpb24gIT0gTlVMTCkgeworCQkJdmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3kobWVtcmVnaW9uKTsKKwkJCW1lbXJlZ2lvbiA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX2NyZWF0ZSk7CisKK01FTVJFR0lPTiAqCit2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQoTUVNUkVHSU9OICpwYXJlbnQsIHVsb25nIG9mZnNldCwgdWxvbmcgbmJ5dGVzKQoreworCU1FTVJFR0lPTiAqbWVtcmVnaW9uID0gTlVMTDsKKworCWlmIChwYXJlbnQgPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzIHBhcmVudCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHBhcmVudC0+bWFwcGVkID09IE5VTEwpIHsKKwkJRVJSRFJWKCIlcyBwYXJlbnQgaXMgbm90IG1hcHBlZCEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKG9mZnNldCA+PSBwYXJlbnQtPm5ieXRlcykgfHwKKwkgICAgKChvZmZzZXQgKyBuYnl0ZXMpID49IHBhcmVudC0+bmJ5dGVzKSkgeworCQlFUlJEUlYoIiVzIHJhbmdlICglbHUsJWx1KSBvdXQgb2YgcGFyZW50IHJhbmdlIiwKKwkJICAgICAgIF9fZnVuY19fLCBvZmZzZXQsIG5ieXRlcyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1yZWdpb24gPSBremFsbG9jKHNpemVvZihNRU1SRUdJT04pLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCWlmIChtZW1yZWdpb24gPT0gTlVMTCkgeworCQlFUlJEUlYoIiVzIGFsbG9jYXRpb24gZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1yZWdpb24tPnBoeXNhZGRyID0gcGFyZW50LT5waHlzYWRkciArIG9mZnNldDsKKwltZW1yZWdpb24tPm5ieXRlcyA9IG5ieXRlczsKKwltZW1yZWdpb24tPm1hcHBlZCA9ICgodTggKikgKHBhcmVudC0+bWFwcGVkKSkgKyBvZmZzZXQ7CisJbWVtcmVnaW9uLT5yZXF1ZXN0ZWQgPSBGQUxTRTsKKwltZW1yZWdpb24tPm92ZXJsYXBwZWQgPSBUUlVFOworCXJldHVybiBtZW1yZWdpb247Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fY3JlYXRlX292ZXJsYXBwZWQpOworCisKK3N0YXRpYyBCT09MCittYXBpdChNRU1SRUdJT04gKm1lbXJlZ2lvbikKK3sKKwl1bG9uZyBwaHlzYWRkciA9ICh1bG9uZykgKG1lbXJlZ2lvbi0+cGh5c2FkZHIpOworCXVsb25nIG5ieXRlcyA9IG1lbXJlZ2lvbi0+bmJ5dGVzOworCisJbWVtcmVnaW9uLT5yZXF1ZXN0ZWQgPSBGQUxTRTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwaHlzYWRkciwgbmJ5dGVzLCBNWURSVk5BTUUpKQorCQlFUlJEUlYoImNhbm5vdCByZXNlcnZlIGNoYW5uZWwgbWVtb3J5IEAweCVseCBmb3IgMHglbHgtLSBubyBiaWcgZGVhbCIsIHBoeXNhZGRyLCBuYnl0ZXMpOworCWVsc2UKKwkJbWVtcmVnaW9uLT5yZXF1ZXN0ZWQgPSBUUlVFOworCW1lbXJlZ2lvbi0+bWFwcGVkID0gaW9yZW1hcF9jYWNoZShwaHlzYWRkciwgbmJ5dGVzKTsKKwlpZiAobWVtcmVnaW9uLT5tYXBwZWQgPT0gTlVMTCkgeworCQlFUlJEUlYoImNhbm5vdCBpb3JlbWFwX2NhY2hlIGNoYW5uZWwgbWVtb3J5IEAweCVseCBmb3IgMHglbHgiLAorCQkgICAgICAgcGh5c2FkZHIsIG5ieXRlcyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit1bm1hcGl0KE1FTVJFR0lPTiAqbWVtcmVnaW9uKQoreworCWlmIChtZW1yZWdpb24tPm1hcHBlZCAhPSBOVUxMKSB7CisJCWlvdW5tYXAobWVtcmVnaW9uLT5tYXBwZWQpOworCQltZW1yZWdpb24tPm1hcHBlZCA9IE5VTEw7CisJfQorCWlmIChtZW1yZWdpb24tPnJlcXVlc3RlZCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oKHVsb25nKSAobWVtcmVnaW9uLT5waHlzYWRkciksCisJCQkJICAgbWVtcmVnaW9uLT5uYnl0ZXMpOworCQltZW1yZWdpb24tPnJlcXVlc3RlZCA9IEZBTFNFOworCX0KK30KKworSE9TVEFERFJFU1MKK3Zpc29yX21lbXJlZ2lvbl9nZXRfcGh5c2FkZHIoTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJcmV0dXJuIG1lbXJlZ2lvbi0+cGh5c2FkZHI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9tZW1yZWdpb25fZ2V0X3BoeXNhZGRyKTsKKwordWxvbmcKK3Zpc29yX21lbXJlZ2lvbl9nZXRfbmJ5dGVzKE1FTVJFR0lPTiAqbWVtcmVnaW9uKQoreworCXJldHVybiBtZW1yZWdpb24tPm5ieXRlczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX21lbXJlZ2lvbl9nZXRfbmJ5dGVzKTsKKwordm9pZCAqCit2aXNvcl9tZW1yZWdpb25fZ2V0X3BvaW50ZXIoTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJcmV0dXJuIG1lbXJlZ2lvbi0+bWFwcGVkOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX2dldF9wb2ludGVyKTsKKworaW50Cit2aXNvcl9tZW1yZWdpb25fcmVzaXplKE1FTVJFR0lPTiAqbWVtcmVnaW9uLCB1bG9uZyBuZXdzaXplKQoreworCWlmIChuZXdzaXplID09IG1lbXJlZ2lvbi0+bmJ5dGVzKQorCQlyZXR1cm4gMDsKKwlpZiAobWVtcmVnaW9uLT5vdmVybGFwcGVkKQorCQkvKiBubyBlcnJvciBjaGVjayBoZXJlIC0gd2Ugbm8gbG9uZ2VyIGtub3cgdGhlCisJCSAqIHBhcmVudCdzIHJhbmdlIQorCQkgKi8KKwkJbWVtcmVnaW9uLT5uYnl0ZXMgPSBuZXdzaXplOworCWVsc2UgeworCQl1bm1hcGl0KG1lbXJlZ2lvbik7CisJCW1lbXJlZ2lvbi0+bmJ5dGVzID0gbmV3c2l6ZTsKKwkJaWYgKCFtYXBpdChtZW1yZWdpb24pKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX21lbXJlZ2lvbl9yZXNpemUpOworCisKK3N0YXRpYyBpbnQKK21lbXJlZ2lvbl9yZWFkd3JpdGUoQk9PTCBpc193cml0ZSwKKwkJICAgIE1FTVJFR0lPTiAqbWVtcmVnaW9uLCB1bG9uZyBvZmZzZXQsCisJCSAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKQoreworCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBtZW1yZWdpb24tPm5ieXRlcykgeworCQlFUlJEUlYoIm1lbXJlZ2lvbl9yZWFkd3JpdGUgb2Zmc2V0IG91dCBvZiByYW5nZSEhIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoaXNfd3JpdGUpCisJCW1lbWNweV90b2lvKG1lbXJlZ2lvbi0+bWFwcGVkICsgb2Zmc2V0LCBsb2NhbCwgbmJ5dGVzKTsKKwllbHNlCisJCW1lbWNweV9mcm9taW8obG9jYWwsIG1lbXJlZ2lvbi0+bWFwcGVkICsgb2Zmc2V0LCBuYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAordmlzb3JfbWVtcmVnaW9uX3JlYWQoTUVNUkVHSU9OICptZW1yZWdpb24sIHVsb25nIG9mZnNldCwgdm9pZCAqZGVzdCwKKwkJICAgICB1bG9uZyBuYnl0ZXMpCit7CisJcmV0dXJuIG1lbXJlZ2lvbl9yZWFkd3JpdGUoRkFMU0UsIG1lbXJlZ2lvbiwgb2Zmc2V0LCBkZXN0LCBuYnl0ZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX3JlYWQpOworCitpbnQKK3Zpc29yX21lbXJlZ2lvbl93cml0ZShNRU1SRUdJT04gKm1lbXJlZ2lvbiwgdWxvbmcgb2Zmc2V0LCB2b2lkICpzcmMsCisJCSAgICAgIHVsb25nIG5ieXRlcykKK3sKKwlyZXR1cm4gbWVtcmVnaW9uX3JlYWR3cml0ZShUUlVFLCBtZW1yZWdpb24sIG9mZnNldCwgc3JjLCBuYnl0ZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX3dyaXRlKTsKKwordm9pZAordmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3koTUVNUkVHSU9OICptZW1yZWdpb24pCit7CisJaWYgKG1lbXJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKCFtZW1yZWdpb24tPm92ZXJsYXBwZWQpCisJCXVubWFwaXQobWVtcmVnaW9uKTsKKwlrZnJlZShtZW1yZWdpb24pOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfbWVtcmVnaW9uX2Rlc3Ryb3kpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wZXJpb2RpY193b3JrLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wZXJpb2RpY193b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MGEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3BlcmlvZGljX3dvcmsuYwpAQCAtMCwwICsxLDIzNiBAQAorLyogcGVyaW9kaWNfd29yay5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisvKgorICogIEhlbHBlciBmdW5jdGlvbnMgdG8gc2NoZWR1bGUgcGVyaW9kaWMgd29yayBpbiBMaW51eCBrZXJuZWwgbW9kZS4KKyAqLworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisjaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgorCisjZGVmaW5lIE1ZRFJWTkFNRSAicGVyaW9kaWNfd29yayIKKworCisKK3N0cnVjdCBQRVJJT0RJQ19XT1JLX1RhZyB7CisJcndsb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisJdm9pZCAoKndvcmtmdW5jKSh2b2lkICopOworCXZvaWQgKndvcmtmdW5jYXJnOworCUJPT0wgaXNfc2NoZWR1bGVkOworCUJPT0wgd2FudF90b19zdG9wOworCXVsb25nIGppZmZ5X2ludGVydmFsOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisJY29uc3QgY2hhciAqZGV2bmFtOworfTsKKworCisKK3N0YXRpYyB2b2lkIHBlcmlvZGljX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yayA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgUEVSSU9ESUNfV09SS19UYWcsIHdvcmsud29yayk7CisJKCpwZXJpb2RpY193b3JrLT53b3JrZnVuYykocGVyaW9kaWNfd29yay0+d29ya2Z1bmNhcmcpOworfQorCisKKworUEVSSU9ESUNfV09SSyAqdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCisJCQkJCSAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZSwKKwkJCQkJICB2b2lkICgqd29ya2Z1bmMpKHZvaWQgKiksCisJCQkJCSAgdm9pZCAqd29ya2Z1bmNhcmcsCisJCQkJCSAgY29uc3QgY2hhciAqZGV2bmFtKQoreworCVBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmsgPSBremFsbG9jKHNpemVvZihQRVJJT0RJQ19XT1JLKSwKKwkJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAocGVyaW9kaWNfd29yayA9PSBOVUxMKSB7CisJCUVSUkRSVigicGVyaW9kaWNfd29yayBhbGxvY2F0aW9uIGZhaWxlZCAiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJ3bG9ja19pbml0KCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwlwZXJpb2RpY193b3JrLT5qaWZmeV9pbnRlcnZhbCA9IGppZmZ5X2ludGVydmFsOworCXBlcmlvZGljX3dvcmstPndvcmtxdWV1ZSA9IHdvcmtxdWV1ZTsKKwlwZXJpb2RpY193b3JrLT53b3JrZnVuYyA9IHdvcmtmdW5jOworCXBlcmlvZGljX3dvcmstPndvcmtmdW5jYXJnID0gd29ya2Z1bmNhcmc7CisJcGVyaW9kaWNfd29yay0+ZGV2bmFtID0gZGV2bmFtOworCXJldHVybiBwZXJpb2RpY193b3JrOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUpOworCisKKwordm9pZCB2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3koUEVSSU9ESUNfV09SSyAqcGVyaW9kaWNfd29yaykKK3sKKwlpZiAocGVyaW9kaWNfd29yayA9PSBOVUxMKQorCQlyZXR1cm47CisJa2ZyZWUocGVyaW9kaWNfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3kpOworCisKKworLyoqIENhbGwgdGhpcyBmcm9tIHlvdXIgcGVyaW9kaWMgd29yayB3b3JrZXIgZnVuY3Rpb24gdG8gc2NoZWR1bGUgdGhlIG5leHQKKyAqICBjYWxsLgorICogIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBGQUxTRSwgdGhlcmUgd2FzIGEgZmFpbHVyZSBhbmQgdGhlCisgKiAgcGVyaW9kaWMgd29yayBpcyBubyBsb25nZXIgc2NoZWR1bGVkCisgKi8KK0JPT0wgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspCit7CisJQk9PTCByYyA9IEZBTFNFOworCXdyaXRlX2xvY2soJnBlcmlvZGljX3dvcmstPmxvY2spOworCWlmIChwZXJpb2RpY193b3JrLT53YW50X3RvX3N0b3ApIHsKKwkJcGVyaW9kaWNfd29yay0+aXNfc2NoZWR1bGVkID0gRkFMU0U7CisJCXBlcmlvZGljX3dvcmstPndhbnRfdG9fc3RvcCA9IEZBTFNFOworCQlyYyA9IFRSVUU7ICAvKiB5ZXMsIFRSVUU7IHNlZSB2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoKSAqLworCQlnb3RvIEF3YXk7CisJfSBlbHNlIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsocGVyaW9kaWNfd29yay0+d29ya3F1ZXVlLAorCQkJCSAgICAgICZwZXJpb2RpY193b3JrLT53b3JrLAorCQkJCSAgICAgIHBlcmlvZGljX3dvcmstPmppZmZ5X2ludGVydmFsKSA8IDApIHsKKwkJRVJSREVWKHBlcmlvZGljX3dvcmstPmRldm5hbSwgInF1ZXVlX2RlbGF5ZWRfd29yayBmYWlsZWQhIik7CisJCXBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCA9IEZBTFNFOworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCXJjID0gVFJVRTsKK0F3YXk6CisJd3JpdGVfdW5sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QpOworCisKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmZiBuZXcgcGVyaW9kaWMgd29yayB3YXMgYWN0dWFsbHkgc3RhcnRlZC4KKyAqICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgRkFMU0UsIHRoZW4gbm8gd29yayB3YXMgc3RhcnRlZAorICogIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgYWxyZWFkeSBzdGFydGVkLCBvciBiZWNhdXNlIG9mIGEgZmFpbHVyZSkuCisgKi8KK0JPT0wgdmlzb3JfcGVyaW9kaWNfd29ya19zdGFydChQRVJJT0RJQ19XT1JLICpwZXJpb2RpY193b3JrKQoreworCUJPT0wgcmMgPSBGQUxTRTsKKworCXdyaXRlX2xvY2soJnBlcmlvZGljX3dvcmstPmxvY2spOworCWlmIChwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQpIHsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAocGVyaW9kaWNfd29yay0+d2FudF90b19zdG9wKSB7CisJCUVSUkRFVihwZXJpb2RpY193b3JrLT5kZXZuYW0sCisJCSAgICAgICAiZGV2X3N0YXJ0X3BlcmlvZGljX3dvcmsgZmFpbGVkISIpOworCQlyYyA9IEZBTFNFOworCQlnb3RvIEF3YXk7CisJfQorCUlOSVRfREVMQVlFRF9XT1JLKCZwZXJpb2RpY193b3JrLT53b3JrLCAmcGVyaW9kaWNfd29ya19mdW5jKTsKKwlpZiAocXVldWVfZGVsYXllZF93b3JrKHBlcmlvZGljX3dvcmstPndvcmtxdWV1ZSwKKwkJCSAgICAgICAmcGVyaW9kaWNfd29yay0+d29yaywKKwkJCSAgICAgICBwZXJpb2RpY193b3JrLT5qaWZmeV9pbnRlcnZhbCkgPCAwKSB7CisJCUVSUkRFVihwZXJpb2RpY193b3JrLT5kZXZuYW0sCisJCSAgICAgICAiJXMgcXVldWVfZGVsYXllZF93b3JrIGZhaWxlZCEiLCBfX2Z1bmNfXyk7CisJCXJjID0gRkFMU0U7CisJCWdvdG8gQXdheTsKKwl9CisJcGVyaW9kaWNfd29yay0+aXNfc2NoZWR1bGVkID0gVFJVRTsKKwlyYyA9IFRSVUU7CitBd2F5OgorCXdyaXRlX3VubG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJcmV0dXJuIHJjOworCit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KTsKKworCisKKworLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmZiB5b3VyIGNhbGwgYWN0dWFsbHkgc3RvcHBlZCB0aGUgcGVyaW9kaWMKKyAqICB3b3JrLgorICoKKyAqICAtLSBQQVkgQVRURU5USU9OLi4uIHRoaXMgaXMgaW1wb3J0YW50IC0tCisgKgorICogIE5PIE5PICMxCisgKgorICogICAgIERvIE5PVCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBzb21lIGZ1bmN0aW9uIHRoYXQgaXMgcnVubmluZyBvbiB0aGUKKyAqICAgICBzYW1lIHdvcmtxdWV1ZSBhcyB0aGUgd29yayB5b3UgYXJlIHRyeWluZyB0byBzdG9wIG1pZ2h0IGJlIHJ1bm5pbmcKKyAqICAgICBvbiEgIElmIHlvdSB2aW9sYXRlIHRoaXMgcnVsZSwgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKCkgTUlHSFQgd29yaywKKyAqICAgICBidXQgaXQgYWxzbyBNSUdIVCBnZXQgaHVuZyB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIHNheWluZworICogICAgICJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iLiAgVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgZGVsYXllZCB3b3JrCisgKiAgICAgeW91IGFyZSB0cnlpbmcgdG8gY2FuY2VsIGhhcyBiZWVuIHB1dCBpbiB0aGUgd29ya3F1ZXVlIGxpc3QsIGJ1dCBjYW4ndAorICogICAgIHJ1biB5ZXQgYmVjYXVzZSB3ZSBhcmUgcnVubmluZyB0aGF0IHNhbWUgd29ya3F1ZXVlIHRocmVhZCByaWdodCBub3cuCisgKgorICogICAgIEJvdHRvbSBsaW5lOiBJZiB5b3UgbmVlZCB0byBjYWxsIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpIGZyb20gYQorICogICAgIHdvcmtpdGVtLCBiZSBzdXJlIHRoZSB3b3JraXRlbSBpcyBvbiBhIERJRkZFUkVOVCB3b3JrcXVldWUgdGhhbiB0aGUKKyAqICAgICB3b3JraXRlbSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGNhbmNlbC4KKyAqCisgKiAgICAgSWYgSSBjb3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGNoZWNrIGZvciB0aGlzICJubyBubyIgY29uZGl0aW9uIGluCisgKiAgICAgdGhlIGNvZGUsIEkgd291bGQuICBJdCB3b3VsZCBoYXZlIHNhdmVkIG1lIHRoZSB0cm91YmxlIG9mIHdyaXRpbmcgdGhpcworICogICAgIGxvbmcgY29tbWVudC4gIEFuZCBhbHNvLCBkb24ndCB0aGluayB0aGlzIGlzIHNvbWUgInRoZW9yZXRpY2FsIiByYWNlCisgKiAgICAgY29uZGl0aW9uLiAgSXQgaXMgUkVBTCwgYXMgSSBoYXZlIHNwZW50IHRoZSBkYXkgY2hhc2luZyBpdC4KKyAqCisgKiAgTk8gTk8gIzIKKyAqCisgKiAgICAgVGFrZSBjbG9zZSBub3RlIG9mIHRoZSBsb2NrcyB0aGF0IHlvdSBvd24gd2hlbiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICogICAgIFlvdSBtdXN0IE5PVCBvd24gYW55IGxvY2tzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgcGVyaW9kaWMgd29yaworICogICAgIGZ1bmN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4gIElmIHlvdSBETywgYSBkZWFkbG9jayBtYXkgcmVzdWx0LAorICogICAgIGJlY2F1c2Ugc3RvcHBpbmcgdGhlIHBlcmlvZGljIHdvcmsgb2Z0ZW4gaW52b2x2ZXMgd2FpdGluZyBmb3IgdGhlIGxhc3QKKyAqICAgICBpdGVyYXRpb24gb2YgdGhlIHBlcmlvZGljIHdvcmsgZnVuY3Rpb24gdG8gY29tcGxldGUuICBBZ2FpbiwgaWYgeW91IGhpdAorICogICAgIHRoaXMgZGVhZGxvY2ssIHlvdSB3aWxsIGdldCBodW5nIHVwIGluIGFuIGluZmluaXRlIGxvb3Agc2F5aW5nCisgKiAgICAgIndhaXRpbmcgZm9yIGRlbGF5ZWQgd29yay4uLiIuCisgKi8KK0JPT0wgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKFBFUklPRElDX1dPUksgKnBlcmlvZGljX3dvcmspCit7CisJQk9PTCBzdG9wcGVkX3NvbWV0aGluZyA9IEZBTFNFOworCisJd3JpdGVfbG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJc3RvcHBlZF9zb21ldGhpbmcgPSBwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQgJiYKKwkJKCFwZXJpb2RpY193b3JrLT53YW50X3RvX3N0b3ApOworCXdoaWxlIChwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQpIHsKKwkJcGVyaW9kaWNfd29yay0+d2FudF90b19zdG9wID0gVFJVRTsKKwkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnBlcmlvZGljX3dvcmstPndvcmspKSB7CisJCQkvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZGVsYXllZCB3b3JrIHdhcyBwZW5kaW5nIGFzCisJCQkgKiBkZWxheWVkIHdvcmssIGJ1dCB3YXMgTk9UIHJ1bi4KKwkJCSAqLworCQkJQVNTRVJUKHBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCk7CisJCQlwZXJpb2RpY193b3JrLT5pc19zY2hlZHVsZWQgPSBGQUxTRTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHdlIGdldCBoZXJlLCBlaXRoZXIgdGhlIGRlbGF5ZWQgd29yazoKKwkJCSAqIC0gd2FzIHJ1biwgT1IsCisJCQkgKiAtIGlzIHJ1bm5pbmcgUklHSFQgTk9XIG9uIGFub3RoZXIgcHJvY2Vzc29yLCBPUiwKKwkJCSAqIC0gd2Fzbid0IGV2ZW4gc2NoZWR1bGVkICh0aGVyZSBpcyBhIG1pbmlzY3VsZQorCQkJICogICB0aW1pbmcgd2luZG93IHdoZXJlIHRoaXMgY291bGQgYmUgdGhlIGNhc2UpCisJCQkgKiBmbHVzaF93b3JrcXVldWUoKSB3b3VsZCBtYWtlIHN1cmUgaXQgaXMgZmluaXNoZWQKKwkJCSAqIGV4ZWN1dGluZywgYnV0IHRoYXQgc3RpbGwgaXNuJ3QgdmVyeSB1c2VmdWwsIHdoaWNoCisJCQkgKiBleHBsYWlucyB0aGUgbG9vcC4uLgorCQkJICovCisJCX0KKwkJaWYgKHBlcmlvZGljX3dvcmstPmlzX3NjaGVkdWxlZCkgeworCQkJd3JpdGVfdW5sb2NrKCZwZXJpb2RpY193b3JrLT5sb2NrKTsKKwkJCVdBUk5ERVYocGVyaW9kaWNfd29yay0+ZGV2bmFtLAorCQkJCSJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iKTsKKwkJCS8qIFdlIHJlbHkgb24gdGhlIGRlbGF5ZWQgd29yayBmdW5jdGlvbiBydW5uaW5nIGhlcmUsCisJCQkgKiBhbmQgZXZlbnR1YWxseSBjYWxsaW5nCisJCQkgKiB2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QoKSwKKwkJCSAqIHdoaWNoIHdpbGwgc2VlIHRoYXQgd2FudF90b19zdG9wIGlzIHNldCwgYW5kCisJCQkgKiBzdWJzZXF1ZW50bHkgY2xlYXIgaXNfc2NoZWR1bGVkLgorCQkJICovCisJCQlTTEVFUEpJRkZJRVMoMTApOworCQkJd3JpdGVfbG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJCX0gZWxzZQorCQkJcGVyaW9kaWNfd29yay0+d2FudF90b19zdG9wID0gRkFMU0U7CisJfQorCXdyaXRlX3VubG9jaygmcGVyaW9kaWNfd29yay0+bG9jayk7CisJcmV0dXJuIHN0b3BwZWRfc29tZXRoaW5nOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Byb2NvYmplY3R0cmVlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wcm9jb2JqZWN0dHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YTE5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wcm9jb2JqZWN0dHJlZS5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKiBwcm9jb2JqZWN0dHJlZS5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAicHJvY29iamVjdHRyZWUuaCIKKworI2RlZmluZSBNWURSVk5BTUUgInByb2NvYmplY3R0cmVlIgorCisKKworLyoqIFRoaXMgaXMgY29udGV4dCBpbmZvIHRoYXQgd2Ugc3Rhc2ggaW4gZWFjaCAvcHJvYyBmaWxlIGVudHJ5LCB3aGljaCB3ZQorICogIG5lZWQgaW4gb3JkZXIgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBzdXBwbGllcyB0aGUgL3Byb2MgcmVhZAorICogIGluZm8gZm9yIHRoYXQgZmlsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqLCBpbnQpOworCU1ZUFJPQ09CSkVDVCAqcHJvY09iamVjdDsKKwlpbnQgcHJvcGVydHlJbmRleDsKKworfSBQUk9DRElSRU5UUllDT05URVhUOworCisvKiogVGhpcyBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSB0cmVlIHJvb3RlZCBhdAorICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4KKyAqICBQcm9wZXJ0aWVzIGZvciBlYWNoIG9iamVjdCBvZiB0aGlzIHR5cGUgd2lsbCBiZSBsb2NhdGVkIHVuZGVyCisgKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLi88b2JqZWN0TmFtZT4vPHByb3BlcnR5TmFtZT4uCisgKi8KK3N0cnVjdCBNWVBST0NUWVBFX1RhZyB7CisJY29uc3QgY2hhciAqKm5hbWU7ICAvKio8IG5vZGUgbmFtZXMgZm9yIHRoaXMgdHlwZSwgZW5kaW5nIHdpdGggTlVMTCAqLworCWludCBuTmFtZXM7ICAgICAgICAgLyoqPCBudW0gb2Ygbm9kZSBuYW1lcyBpbiA8bmFtZT4gKi8KKworCS8qKiByb290IGRpciBmb3IgdGhpcyB0eXBlIHRyZWUgaW4gL3Byb2MgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290OworCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpcnM7ICAvKio8IGZvciBlYWNoIG5vZGUgaW4gPG5hbWU+ICovCisKKwkvKiogYm90dG9tIGRpciB3aGVyZSBvYmplY3RzIHdpbGwgYmUgcm9vdGVkOyBpLmUuLCB0aGlzIGlzCisJICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4vLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUKKwkgKiAgbGFzdCBlbnRyeSBpbiB0aGUgPHByb2NEaXJzPiBhcnJheS4gKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXI7CisKKwkvKiogbmFtZSBmb3IgZWFjaCBwcm9wZXJ0eSB0aGF0IG9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBoYXZlICovCisJY29uc3QgY2hhciAqKnByb3BlcnR5TmFtZXM7CisKKwlpbnQgblByb3BlcnRpZXM7ICAgICAgIC8qKjwgbnVtIG9mIG5hbWVzIGluIDxwcm9wZXJ0eU5hbWVzPiAqLworCisJLyoqIENhbGwgdGhpcywgcGFzc2luZyBNWVBST0NPQkpFQ1QuY29udGV4dCBhbmQgdGhlIHByb3BlcnR5IGluZGV4CisJICogIHdoZW5ldmVyIHNvbWVvbmUgcmVhZHMgdGhlIHByb2MgZW50cnkgKi8KKwl2b2lkICgqc2hvd19wcm9wZXJ0eSkoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiwgaW50KTsKK307CisKKworCitzdHJ1Y3QgTVlQUk9DT0JKRUNUX1RhZyB7CisJTVlQUk9DVFlQRSAqdHlwZTsKKworCS8qKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXIgbm9kZSBpbiAvcHJvYyB1bmRlciB3aGljaCB0aGUKKwkgKiAgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdCB3aWxsIGFwcGVhciBhcyBmaWxlcy4gKi8KKwljaGFyICpuYW1lOworCisJaW50IG5hbWVzaXplOyAgIC8qKjwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgbmFtZSAqLworCXZvaWQgKmNvbnRleHQ7ICAvKio8IHBhc3NlZCB0byBNWVBST0NUWVBFLnNob3dfcHJvcGVydHkgKi8KKworCS8qKiA8dHlwZS5wcm9jRGlyUm9vdD4vPHR5cGUubmFtZVswXT4vPHR5cGUubmFtZVsxXT4vLi4uLzxuYW1lPiAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpcjsKKworCS8qKiBhIHByb2MgZGlyIGVudHJ5IGZvciBlYWNoIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3Q7CisJICogIHByb3BlcnRpZXMgYXJlIGlkZW50aWZpZWQgaW4gTVlQUk9DVFlQRS5wcm9wZXJ0eU5hbWVzLCBzbyBlYWNoIG9mCisJICogIHRoZSA8cHJvY0RpclByb3BlcnRpZXM+IGRlc2NyaWJlcyBhIHNpbmdsZSBmaWxlIGxpa2UKKwkgKiAgPHR5cGUucHJvY0RpclJvb3Q+Lzx0eXBlLm5hbWVbMF0+Lzx0eXBlLm5hbWVbMV0+Ly4uLgorCSAqICAgICAgICAgICAvPG5hbWU+Lzxwcm9wZXJ0eU5hbWU+CisJICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpclByb3BlcnRpZXM7CisKKwkvKiogdGhpcyBpcyBhIGhvbGRpbmcgYXJlYSBmb3IgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQKKwkgKiAgdG8gcnVuIHRoZSAvcHJvYyBjYWxsYmFjayBmdW5jdGlvbiAqLworCVBST0NESVJFTlRSWUNPTlRFWFQgKnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzOworfTsKKworCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKgorY3JlYXRlUHJvY0Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnAgPSBwcm9jX21rZGlyX21vZGUobmFtZSwgU19JRkRJUiwgcGFyZW50KTsKKwlpZiAocCA9PSBOVUxMKQorCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwgbmFtZSk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKgorY3JlYXRlUHJvY0ZpbGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQsCisJICAgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCAwLCBwYXJlbnQsCisJCQkJCQkgICAgZm9wcywgZGF0YSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGZpbGUgJXMiLCBuYW1lKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBzZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK3N0YXRpYyBpbnQgcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvdywgUERFX0RBVEEoaW5vZGUpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzID0geworCS5vcGVuID0gcHJvY19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworCisKK01ZUFJPQ1RZUEUgKnZpc29yX3Byb2NfQ3JlYXRlVHlwZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290LAorCQkJCSAgY29uc3QgY2hhciAqKm5hbWUsCisJCQkJICBjb25zdCBjaGFyICoqcHJvcGVydHlOYW1lcywKKwkJCQkgIHZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKKwkJCQkJCQl2b2lkICosIGludCkpCit7CisJaW50IGkgPSAwOworCU1ZUFJPQ1RZUEUgKnJjID0gTlVMTCwgKnR5cGUgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50ID0gTlVMTDsKKworCWlmIChwcm9jRGlyUm9vdCA9PSBOVUxMKSB7CisJCUVSUkRSVigicHJvY0RpclJvb3QgY2Fubm90IGJlIE5VTEwhXG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gTlVMTCkgeworCQlFUlJEUlYoIm5hbWUgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgbm9kZSBuYW1lIVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJdHlwZSA9IGt6YWxsb2Moc2l6ZW9mKE1ZUFJPQ1RZUEUpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKHR5cGUgPT0gTlVMTCkgeworCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIEF3YXk7CisJfQorCXR5cGUtPm5hbWUgPSBuYW1lOworCXR5cGUtPnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOworCXR5cGUtPm5Qcm9wZXJ0aWVzID0gMDsKKwl0eXBlLT5uTmFtZXMgPSAwOworCXR5cGUtPnNob3dfcHJvcGVydHkgPSBzaG93X3Byb3BlcnR5OworCXR5cGUtPnByb2NEaXJSb290ID0gcHJvY0RpclJvb3Q7CisJaWYgKHR5cGUtPnByb3BlcnR5TmFtZXMgIT0gTlVMTCkKKwkJd2hpbGUgKHR5cGUtPnByb3BlcnR5TmFtZXNbdHlwZS0+blByb3BlcnRpZXNdICE9IE5VTEwpCisJCQl0eXBlLT5uUHJvcGVydGllcysrOworCXdoaWxlICh0eXBlLT5uYW1lW3R5cGUtPm5OYW1lc10gIT0gTlVMTCkKKwkJdHlwZS0+bk5hbWVzKys7CisJdHlwZS0+cHJvY0RpcnMgPSBremFsbG9jKCh0eXBlLT5uTmFtZXMgKyAxKSAqCisJCQkJIHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiksCisJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAodHlwZS0+cHJvY0RpcnMgPT0gTlVMTCkgeworCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIEF3YXk7CisJfQorCXBhcmVudCA9IHByb2NEaXJSb290OworCWZvciAoaSA9IDA7IGkgPCB0eXBlLT5uTmFtZXM7IGkrKykgeworCQl0eXBlLT5wcm9jRGlyc1tpXSA9IGNyZWF0ZVByb2NEaXIodHlwZS0+bmFtZVtpXSwgcGFyZW50KTsKKwkJaWYgKHR5cGUtPnByb2NEaXJzW2ldID09IE5VTEwpIHsKKwkJCXJjID0gTlVMTDsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlwYXJlbnQgPSB0eXBlLT5wcm9jRGlyc1tpXTsKKwl9CisJdHlwZS0+cHJvY0RpciA9IHR5cGUtPnByb2NEaXJzW3R5cGUtPm5OYW1lcy0xXTsKKwlyYyA9IHR5cGU7CitBd2F5OgorCWlmIChyYyA9PSBOVUxMKSB7CisJCWlmICh0eXBlICE9IE5VTEwpIHsKKwkJCXZpc29yX3Byb2NfRGVzdHJveVR5cGUodHlwZSk7CisJCQl0eXBlID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0NyZWF0ZVR5cGUpOworCisKKwordm9pZCB2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKE1ZUFJPQ1RZUEUgKnR5cGUpCit7CisJaWYgKHR5cGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmICh0eXBlLT5wcm9jRGlycyAhPSBOVUxMKSB7CisJCWludCBpID0gdHlwZS0+bk5hbWVzLTE7CisJCXdoaWxlIChpID49IDApIHsKKwkJCWlmICh0eXBlLT5wcm9jRGlyc1tpXSAhPSBOVUxMKSB7CisJCQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQgPSBOVUxMOworCQkJCWlmIChpID09IDApCisJCQkJCXBhcmVudCA9IHR5cGUtPnByb2NEaXJSb290OworCQkJCWVsc2UKKwkJCQkJcGFyZW50ID0gdHlwZS0+cHJvY0RpcnNbaS0xXTsKKwkJCQlyZW1vdmVfcHJvY19lbnRyeSh0eXBlLT5uYW1lW2ldLCBwYXJlbnQpOworCQkJfQorCQkJaS0tOworCQl9CisJCWtmcmVlKHR5cGUtPnByb2NEaXJzKTsKKwkJdHlwZS0+cHJvY0RpcnMgPSBOVUxMOworCX0KKwlrZnJlZSh0eXBlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3Byb2NfRGVzdHJveVR5cGUpOworCisKKworTVlQUk9DT0JKRUNUICp2aXNvcl9wcm9jX0NyZWF0ZU9iamVjdChNWVBST0NUWVBFICp0eXBlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmNvbnRleHQpCit7CisJTVlQUk9DT0JKRUNUICpvYmogPSBOVUxMLCAqcmMgPSBOVUxMOworCWludCBpID0gMDsKKworCWlmICh0eXBlID09IE5VTEwpIHsKKwkJRVJSRFJWKCJ0eXBlIGNhbm5vdCBiZSBOVUxMXG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlvYmogPSBremFsbG9jKHNpemVvZihNWVBST0NPQkpFQ1QpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKG9iaiA9PSBOVUxMKSB7CisJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJb2JqLT50eXBlID0gdHlwZTsKKwlvYmotPmNvbnRleHQgPSBjb250ZXh0OworCWlmIChuYW1lID09IE5VTEwpIHsKKwkJb2JqLT5uYW1lID0gTlVMTDsKKwkJb2JqLT5wcm9jRGlyID0gdHlwZS0+cHJvY0RpcjsKKwl9IGVsc2UgeworCQlvYmotPm5hbWVzaXplID0gc3RybGVuKG5hbWUpKzE7CisJCW9iai0+bmFtZSA9IGttYWxsb2Mob2JqLT5uYW1lc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCQlpZiAob2JqLT5uYW1lID09IE5VTEwpIHsKKwkJCW9iai0+bmFtZXNpemUgPSAwOworCQkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWdvdG8gQXdheTsKKwkJfQorCQlzdHJjcHkob2JqLT5uYW1lLCBuYW1lKTsKKwkJb2JqLT5wcm9jRGlyID0gY3JlYXRlUHJvY0RpcihvYmotPm5hbWUsIHR5cGUtPnByb2NEaXIpOworCQlpZiAob2JqLT5wcm9jRGlyID09IE5VTEwpIHsKKwkJCWdvdG8gQXdheTsKKwkJfQorCX0KKwlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID0KKwkJa3phbGxvYygodHlwZS0+blByb3BlcnRpZXMgKyAxKSAqIHNpemVvZihQUk9DRElSRU5UUllDT05URVhUKSwKKwkJCUdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAob2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0cyA9PSBOVUxMKSB7CisJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gQXdheTsKKwl9CisJb2JqLT5wcm9jRGlyUHJvcGVydGllcyA9CisJCWt6YWxsb2MoKHR5cGUtPm5Qcm9wZXJ0aWVzICsgMSkgKiBzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopLAorCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzID09IE5VTEwpIHsKKwkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBBd2F5OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgeworCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldLnByb2NPYmplY3QgPSBvYmo7CisJCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0ucHJvcGVydHlJbmRleCA9IGk7CisJCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0uc2hvd19wcm9wZXJ0eSA9CisJCQl0eXBlLT5zaG93X3Byb3BlcnR5OworCQlpZiAodHlwZS0+cHJvcGVydHlOYW1lc1tpXVswXSAhPSAnXDAnKSB7CisJCQkvKiBvbmx5IGNyZWF0ZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBuYW1lcyAqLworCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9CisJCQkJY3JlYXRlUHJvY0ZpbGUodHlwZS0+cHJvcGVydHlOYW1lc1tpXSwKKwkJCQkJICAgICAgIG9iai0+cHJvY0RpciwgJnByb2NfZm9wcywKKwkJCQkJICAgICAgICZvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldKTsKKwkJCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzW2ldID09IE5VTEwpIHsKKwkJCQlyYyA9IE5VTEw7CisJCQkJZ290byBBd2F5OworCQkJfQorCQl9CisJfQorCXJjID0gb2JqOworQXdheToKKwlpZiAocmMgPT0gTlVMTCkgeworCQlpZiAob2JqICE9IE5VTEwpIHsKKwkJCXZpc29yX3Byb2NfRGVzdHJveU9iamVjdChvYmopOworCQkJb2JqID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0NyZWF0ZU9iamVjdCk7CisKKworCit2b2lkIHZpc29yX3Byb2NfRGVzdHJveU9iamVjdChNWVBST0NPQkpFQ1QgKm9iaikKK3sKKwlNWVBST0NUWVBFICp0eXBlID0gTlVMTDsKKwlpZiAob2JqID09IE5VTEwpCisJCXJldHVybjsKKwl0eXBlID0gb2JqLT50eXBlOworCWlmICh0eXBlID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAob2JqLT5wcm9jRGlyUHJvcGVydGllcyAhPSBOVUxMKSB7CisJCWludCBpID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHR5cGUtPm5Qcm9wZXJ0aWVzOyBpKyspIHsKKwkJCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzW2ldICE9IE5VTEwpIHsKKwkJCQlyZW1vdmVfcHJvY19lbnRyeSh0eXBlLT5wcm9wZXJ0eU5hbWVzW2ldLAorCQkJCQkJICBvYmotPnByb2NEaXIpOworCQkJCW9iai0+cHJvY0RpclByb3BlcnRpZXNbaV0gPSBOVUxMOworCQkJfQorCQl9CisJCWtmcmVlKG9iai0+cHJvY0RpclByb3BlcnRpZXMpOworCQlvYmotPnByb2NEaXJQcm9wZXJ0aWVzID0gTlVMTDsKKwl9CisJaWYgKG9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMgIT0gTlVMTCkgeworCQlrZnJlZShvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzKTsKKwkJb2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0cyA9IE5VTEw7CisJfQorCWlmIChvYmotPnByb2NEaXIgIT0gTlVMTCkgeworCQlpZiAob2JqLT5uYW1lICE9IE5VTEwpCisJCQlyZW1vdmVfcHJvY19lbnRyeShvYmotPm5hbWUsIHR5cGUtPnByb2NEaXIpOworCQlvYmotPnByb2NEaXIgPSBOVUxMOworCX0KKwlpZiAob2JqLT5uYW1lICE9IE5VTEwpIHsKKwkJa2ZyZWUob2JqLT5uYW1lKTsKKwkJb2JqLT5uYW1lID0gTlVMTDsKKwl9CisJa2ZyZWUob2JqKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3Byb2NfRGVzdHJveU9iamVjdCk7CisKKworCitzdGF0aWMgaW50IHNlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJUFJPQ0RJUkVOVFJZQ09OVEVYVCAqY3R4ID0gKFBST0NESVJFTlRSWUNPTlRFWFQgKikoc2VxLT5wcml2YXRlKTsKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJRVJSRFJWKCJJIGRvbid0IGhhdmUgYSBmcmVha2luJyBjbHVlLi4uIik7CisJCXJldHVybiAwOworCX0KKwkoKmN0eC0+c2hvd19wcm9wZXJ0eSkoc2VxLCBjdHgtPnByb2NPYmplY3QtPmNvbnRleHQsCisJCQkgICAgICBjdHgtPnByb3BlcnR5SW5kZXgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Zpc29ya21vZHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkMWU5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Zpc29ya21vZHV0aWxzLmMKQEAgLTAsMCArMSw3MSBAQAorLyogdGltc2ttb2R1dGlscy5jCisgKgorICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAidW5pa2xvZy5oIgorI2luY2x1ZGUgInRpbXNrbW9kLmgiCisKKyNkZWZpbmUgTVlEUlZOQU1FICJ0aW1za21vZHV0aWxzIgorCisvKiogQ2FsbGVycyB0byBpbnRlcmZhY2VzIHRoYXQgc2V0IF9fR0ZQX05PUkVUUlkgZmxhZyBiZWxvdworICogIG11c3QgY2hlY2sgZm9yIGEgTlVMTCAoZXJyb3IpIHJlc3VsdCBhcyB3ZSBhcmUgdGVsbGluZyB0aGUKKyAqICBrZXJuZWwgaW50ZXJmYWNlIHRoYXQgaXQgaXMgb2theSB0byBmYWlsLgorICovCisKK3ZvaWQgKmttYWxsb2Nfa2VybmVsKHNpemVfdCBzaXopCit7CisJcmV0dXJuIGttYWxsb2Moc2l6LCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7Cit9CisKKy8qICBVc2UgdGhlc2UgaGFuZHktZGFuZHkgc2VxX2ZpbGVfeHh4IGZ1bmN0aW9ucyBpZiB5b3Ugd2FudCB0byBjYWxsIHNvbWUKKyAqICBmdW5jdGlvbnMgdGhhdCB3cml0ZSBzdHVmZiBpbnRvIGEgc2VxX2ZpbGUsIGJ1dCB5b3UgYWN0dWFsbHkganVzdCB3YW50CisgKiAgdG8gZHVtcCB0aGF0IG91dHB1dCBpbnRvIGEgYnVmZmVyLiAgVXNlIHRoZW0gYXMgZm9sbG93czoKKyAqICAtIGNhbGwgdmlzb3Jfc2VxX2ZpbGVfbmV3X2J1ZmZlciB0byBjcmVhdGUgdGhlIHNlcV9maWxlICh5b3Ugc3VwcGx5IHRoZSBidWYpCisgKiAgLSBjYWxsIHdoYXRldmVyIGZ1bmN0aW9ucyB5b3Ugd2FudCB0aGF0IHRha2UgYSBzZXFfZmlsZSBhcyBhbiBhcmd1bWVudAorICogICAgKHRoZSBidWYgeW91IHN1cHBsaWVkIHdpbGwgZ2V0IHRoZSBvdXRwdXQgZGF0YSkKKyAqICAtIGNhbGwgdmlzb3Jfc2VxX2ZpbGVfZG9uZV9idWZmZXIgdG8gZGlzcG9zZSBvZiB5b3VyIHNlcV9maWxlCisgKi8KK3N0cnVjdCBzZXFfZmlsZSAqdmlzb3Jfc2VxX2ZpbGVfbmV3X2J1ZmZlcih2b2lkICpidWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnJjID0gTlVMTDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBrbWFsbG9jX2tlcm5lbChzaXplb2Yoc3RydWN0IHNlcV9maWxlKSk7CisKKwlpZiAobSA9PSBOVUxMKSB7CisJCXJjID0gTlVMTDsKKwkJZ290byBBd2F5OworCX0KKwltZW1zZXQobSwgMCwgc2l6ZW9mKHN0cnVjdCBzZXFfZmlsZSkpOworCW0tPmJ1ZiA9IGJ1ZjsKKwltLT5zaXplID0gYnVmX3NpemU7CisJcmMgPSBtOworQXdheToKKwlpZiAocmMgPT0gTlVMTCkgeworCQl2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcihtKTsKKwkJbSA9IE5VTEw7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NlcV9maWxlX25ld19idWZmZXIpOworCisKKwordm9pZCB2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJaWYgKCFtKQorCQlyZXR1cm47CisJa2ZyZWUobSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9zZXFfZmlsZV9kb25lX2J1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAppbmRleCBhNzNlNDM3Li4yNjZlMmIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCkBAIC04Niw2ICs4Niw3IEBACiAJY2hhciBzdGF0dXM7CiAJaW50IGludGVyZl9jb3VudDsKIAlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJY2hhciBzaHV0ZG93bl9idXNpZDsKIH07CiAKQEAgLTkzLDcgKzk0LDcgQEAKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc3R1Yl9wcml2X2NhY2hlOwogCiAvKiBzdHViX2Rldi5jICovCi1leHRlcm4gc3RydWN0IHVzYl9kcml2ZXIgc3R1Yl9kcml2ZXI7CitleHRlcm4gc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyIHN0dWJfZHJpdmVyOwogCiAvKiBzdHViX21haW4uYyAqLwogc3RydWN0IGJ1c19pZF9wcml2ICpnZXRfYnVzaWRfcHJpdihjb25zdCBjaGFyICpidXNpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCmluZGV4IDc2YTFmZjAuLjc3M2Q4Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCkBAIC04NywxMyArODcsMTYgQEAKIAlpbnQgc29ja2ZkID0gMDsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQ7CiAJc3NpemVfdCBlcnIgPSAtRUlOVkFMOworCWludCBydjsKIAogCWlmICghc2RldikgewogCQlkZXZfZXJyKGRldiwgInNkZXYgaXMgbnVsbFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNzY2FuZihidWYsICIlZCIsICZzb2NrZmQpOworCXJ2ID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnNvY2tmZCk7CisJaWYgKHJ2ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHNvY2tmZCAhPSAtMSkgewogCQlkZXZfaW5mbyhkZXYsICJzdHViIHVwXG4iKTsKQEAgLTI3OSwyMSArMjgyLDE5IEBACiAgKgogICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5ldyBzdHViX2RldmljZSBzdHJ1Y3QuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnN0dWJfZGV2aWNlX2FsbG9jKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCQkgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCitzdGF0aWMgc3RydWN0IHN0dWJfZGV2aWNlICpzdHViX2RldmljZV9hbGxvYyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXY7Ci0JaW50IGJ1c251bSA9IGludGVyZmFjZV90b19idXNudW0oaW50ZXJmYWNlKTsKLQlpbnQgZGV2bnVtID0gaW50ZXJmYWNlX3RvX2Rldm51bShpbnRlcmZhY2UpOworCWludCBidXNudW0gPSB1ZGV2LT5idXMtPmJ1c251bTsKKwlpbnQgZGV2bnVtID0gdWRldi0+ZGV2bnVtOwogCi0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJhbGxvY2F0aW5nIHN0dWIgZGV2aWNlIik7CisJZGV2X2RiZygmdWRldi0+ZGV2LCAiYWxsb2NhdGluZyBzdHViIGRldmljZSIpOwogCiAJLyogeWVzLCBpdCdzIGEgbmV3IGRldmljZSAqLwogCXNkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3R1Yl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNkZXYpCiAJCXJldHVybiBOVUxMOwogCi0Jc2Rldi0+aW50ZXJmYWNlID0gdXNiX2dldF9pbnRmKGludGVyZmFjZSk7CiAJc2Rldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCiAJLyoKQEAgLTMyMiw3ICszMjMsNyBAQAogCiAJdXNiaXBfc3RhcnRfZWgoJnNkZXYtPnVkKTsKIAotCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAicmVnaXN0ZXIgbmV3IGludGVyZmFjZVxuIik7CisJZGV2X2RiZygmdWRldi0+ZGV2LCAicmVnaXN0ZXIgbmV3IGRldmljZVxuIik7CiAKIAlyZXR1cm4gc2RldjsKIH0KQEAgLTMzMiwzMiArMzMzLDIxIEBACiAJa2ZyZWUoc2Rldik7CiB9CiAKLS8qCi0gKiBJZiBhIHVzYiBkZXZpY2UgaGFzIG11bHRpcGxlIGFjdGl2ZSBpbnRlcmZhY2VzLCB0aGlzIGRyaXZlciBpcyBib3VuZCB0byBhbGwKLSAqIHRoZSBhY3RpdmUgaW50ZXJmYWNlcy4gSG93ZXZlciwgdXNiaXAgZXhwb3J0cyAqYSogdXNiIGRldmljZSAoaS5lLiwgbm90ICphbioKLSAqIGFjdGl2ZSBpbnRlcmZhY2UpLiBDdXJyZW50bHksIGEgdXNlcmxhbmQgcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0IGl0Ci0gKiBsb29rcyBhdCB0aGUgdXNiaXAncyBzeXNmcyBlbnRyaWVzIG9mIG9ubHkgdGhlIGZpcnN0IGFjdGl2ZSBpbnRlcmZhY2UuCi0gKgotICogVE9ETzogdXNlICJzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIiIHRvIGJpbmQgYSB1c2IgZGV2aWNlLgotICogSG93ZXZlciwgaXQgc2VlbXMgaXQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBpbiBtYWlubGluZSBrZXJuZWwgeWV0Ci0gKiAoMi42LjE5LjIpLgotICovCi1zdGF0aWMgaW50IHN0dWJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKLQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBzdHViX3Byb2JlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCXN0cnVjdCBzdHViX2RldmljZSAqc2RldiA9IE5VTEw7Ci0JY29uc3QgY2hhciAqdWRldl9idXNpZCA9IGRldl9uYW1lKGludGVyZmFjZS0+ZGV2LnBhcmVudCk7CisJY29uc3QgY2hhciAqdWRldl9idXNpZCA9IGRldl9uYW1lKCZ1ZGV2LT5kZXYpOwogCWludCBlcnIgPSAwOwogCXN0cnVjdCBidXNfaWRfcHJpdiAqYnVzaWRfcHJpdjsKKwlpbnQgcmM7CiAKLQlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgIkVudGVyXG4iKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJFbnRlclxuIik7CiAKIAkvKiBjaGVjayB3ZSBzaG91bGQgY2xhaW0gb3Igbm90IGJ5IGJ1c2lkX3RhYmxlICovCiAJYnVzaWRfcHJpdiA9IGdldF9idXNpZF9wcml2KHVkZXZfYnVzaWQpOwogCWlmICghYnVzaWRfcHJpdiB8fCAoYnVzaWRfcHJpdi0+c3RhdHVzID09IFNUVUJfQlVTSURfUkVNT1YpIHx8CiAJICAgIChidXNpZF9wcml2LT5zdGF0dXMgPT0gU1RVQl9CVVNJRF9PVEhFUikpIHsKLQkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LAorCQlkZXZfaW5mbygmdWRldi0+ZGV2LAogCQkJIiVzIGlzIG5vdCBpbiBtYXRjaF9idXNpZCB0YWJsZS4uLiBza2lwIVxuIiwKIAkJCXVkZXZfYnVzaWQpOwogCkBAIC0zODMsNjAgKzM3Myw0MSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoYnVzaWRfcHJpdi0+c3RhdHVzID09IFNUVUJfQlVTSURfQUxMT0MpIHsKLQkJc2RldiA9IGJ1c2lkX3ByaXYtPnNkZXY7Ci0JCWlmICghc2RldikKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCsrOwotCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsCi0JCQkidXNiaXAtaG9zdDogcmVnaXN0ZXIgbmV3IGludGVyZmFjZSAoYnVzICV1IGRldiAldSBpZm4gJXUpXG4iLAotCQkJdWRldi0+YnVzLT5idXNudW0sIHVkZXYtPmRldm51bSwKLQkJCWludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7Ci0KLQkJLyogc2V0IHByaXZhdGUgZGF0YSB0byB1c2JfaW50ZXJmYWNlICovCi0JCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBzZGV2KTsKLQotCQllcnIgPSBzdHViX2FkZF9maWxlcygmaW50ZXJmYWNlLT5kZXYpOwotCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgInN0dWJfYWRkX2ZpbGVzIGZvciAlc1xuIiwKLQkJCQl1ZGV2X2J1c2lkKTsKLQkJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQkJCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudC0tOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCi0JCXVzYl9nZXRfaW50ZihpbnRlcmZhY2UpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAkvKiBvaywgdGhpcyBpcyBteSBkZXZpY2UgKi8KLQlzZGV2ID0gc3R1Yl9kZXZpY2VfYWxsb2ModWRldiwgaW50ZXJmYWNlKTsKKwlzZGV2ID0gc3R1Yl9kZXZpY2VfYWxsb2ModWRldik7CiAJaWYgKCFzZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwKLQkJInVzYmlwLWhvc3Q6IHJlZ2lzdGVyIG5ldyBkZXZpY2UgKGJ1cyAldSBkZXYgJXUgaWZuICV1KVxuIiwKLQkJdWRldi0+YnVzLT5idXNudW0sIHVkZXYtPmRldm51bSwKLQkJaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwlkZXZfaW5mbygmdWRldi0+ZGV2LAorCQkidXNiaXAtaG9zdDogcmVnaXN0ZXIgbmV3IGRldmljZSAoYnVzICV1IGRldiAldSlcbiIsCisJCXVkZXYtPmJ1cy0+YnVzbnVtLCB1ZGV2LT5kZXZudW0pOwogCi0JYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50ID0gMDsKIAlidXNpZF9wcml2LT5zaHV0ZG93bl9idXNpZCA9IDA7CiAKLQkvKiBzZXQgcHJpdmF0ZSBkYXRhIHRvIHVzYl9pbnRlcmZhY2UgKi8KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgc2Rldik7Ci0JYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50Kys7CisJLyogc2V0IHByaXZhdGUgZGF0YSB0byB1c2JfZGV2aWNlICovCisJZGV2X3NldF9kcnZkYXRhKCZ1ZGV2LT5kZXYsIHNkZXYpOwogCWJ1c2lkX3ByaXYtPnNkZXYgPSBzZGV2OworCWJ1c2lkX3ByaXYtPnVkZXYgPSB1ZGV2OwogCi0JZXJyID0gc3R1Yl9hZGRfZmlsZXMoJmludGVyZmFjZS0+ZGV2KTsKKwkvKgorCSAqIENsYWltIHRoaXMgaHViIHBvcnQuCisJICogSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSB3ZSBwYXNzIGFzIG93bmVyCisJICogKHN0cnVjdCBkZXZfc3RhdGUpIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlLgorCSAqLworCXJjID0gdXNiX2h1Yl9jbGFpbV9wb3J0KHVkZXYtPnBhcmVudCwgdWRldi0+cG9ydG51bSwKKwkJCShzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqKSB1ZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2RiZygmdWRldi0+ZGV2LCAidW5hYmxlIHRvIGNsYWltIHBvcnRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZXJyID0gc3R1Yl9hZGRfZmlsZXMoJnVkZXYtPmRldik7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgInN0dWJfYWRkX2ZpbGVzIGZvciAlc1xuIiwgdWRldl9idXNpZCk7Ci0JCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQkJdXNiX3B1dF9pbnRmKGludGVyZmFjZSk7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgInN0dWJfYWRkX2ZpbGVzIGZvciAlc1xuIiwgdWRldl9idXNpZCk7CisJCWRldl9zZXRfZHJ2ZGF0YSgmdWRldi0+ZGV2LCBOVUxMKTsKIAkJdXNiX3B1dF9kZXYodWRldik7CiAJCWt0aHJlYWRfc3RvcF9wdXQoc2Rldi0+dWQuZWgpOwogCi0JCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCA9IDA7CiAJCWJ1c2lkX3ByaXYtPnNkZXYgPSBOVUxMOwogCQlzdHViX2RldmljZV9mcmVlKHNkZXYpOwogCQlyZXR1cm4gZXJyOwpAQCAtNDYxLDEzICs0MzIsMTQgQEAKICAqIGNhbGxlZCBpbiB1c2JfZGlzY29ubmVjdCgpIG9yIHVzYl9kZXJlZ2lzdGVyKCkKICAqIGJ1dCBvbmx5IGlmIGFjdGNvbmZpZyhhY3RpdmUgY29uZmlndXJhdGlvbikgZXhpc3RzCiAgKi8KLXN0YXRpYyB2b2lkIHN0dWJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQorc3RhdGljIHZvaWQgc3R1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCXN0cnVjdCBzdHViX2RldmljZSAqc2RldjsKLQljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoaW50ZXJmYWNlLT5kZXYucGFyZW50KTsKKwljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoJnVkZXYtPmRldik7CiAJc3RydWN0IGJ1c19pZF9wcml2ICpidXNpZF9wcml2OworCWludCByYzsKIAotCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiRW50ZXJcbiIpOworCWRldl9kYmcoJnVkZXYtPmRldiwgIkVudGVyXG4iKTsKIAogCWJ1c2lkX3ByaXYgPSBnZXRfYnVzaWRfcHJpdih1ZGV2X2J1c2lkKTsKIAlpZiAoIWJ1c2lkX3ByaXYpIHsKQEAgLTQ3NSw0MSArNDQ3LDM3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnVkZXYtPmRldik7CiAKIAkvKiBnZXQgc3R1Yl9kZXZpY2UgKi8KIAlpZiAoIXNkZXYpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJjb3VsZCBub3QgZ2V0IGRldmljZSIpOworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGRldmljZSIpOwogCQlyZXR1cm47CiAJfQogCi0JdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCWRldl9zZXRfZHJ2ZGF0YSgmdWRldi0+ZGV2LCBOVUxMKTsKIAogCS8qCiAJICogTk9URTogcngvdHggdGhyZWFkcyBhcmUgaW52b2tlZCBmb3IgZWFjaCB1c2JfZGV2aWNlLgogCSAqLwotCXN0dWJfcmVtb3ZlX2ZpbGVzKCZpbnRlcmZhY2UtPmRldik7CisJc3R1Yl9yZW1vdmVfZmlsZXMoJnVkZXYtPmRldik7CisKKwkvKiByZWxlYXNlIHBvcnQgKi8KKwlyYyA9IHVzYl9odWJfcmVsZWFzZV9wb3J0KHVkZXYtPnBhcmVudCwgdWRldi0+cG9ydG51bSwKKwkJCQkgIChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqKSB1ZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2RiZygmdWRldi0+ZGV2LCAidW5hYmxlIHRvIHJlbGVhc2UgcG9ydFxuIik7CisJCXJldHVybjsKKwl9CiAKIAkvKiBJZiB1c2IgcmVzZXQgaXMgY2FsbGVkIGZyb20gZXZlbnQgaGFuZGxlciAqLwotCWlmIChidXNpZF9wcml2LT5zZGV2LT51ZC5laCA9PSBjdXJyZW50KSB7Ci0JCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudC0tOworCWlmIChidXNpZF9wcml2LT5zZGV2LT51ZC5laCA9PSBjdXJyZW50KQogCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCA+IDEpIHsKLQkJYnVzaWRfcHJpdi0+aW50ZXJmX2NvdW50LS07Ci0JCXNodXRkb3duX2J1c2lkKGJ1c2lkX3ByaXYpOwotCQl1c2JfcHV0X2ludGYoaW50ZXJmYWNlKTsKLQkJcmV0dXJuOwotCX0KLQotCWJ1c2lkX3ByaXYtPmludGVyZl9jb3VudCA9IDA7CiAKIAkvKiBzaHV0ZG93biB0aGUgY3VycmVudCBjb25uZWN0aW9uICovCiAJc2h1dGRvd25fYnVzaWQoYnVzaWRfcHJpdik7CiAKIAl1c2JfcHV0X2RldihzZGV2LT51ZGV2KTsKLQl1c2JfcHV0X2ludGYoaW50ZXJmYWNlKTsKIAogCS8qIGZyZWUgc2RldiAqLwogCWJ1c2lkX3ByaXYtPnNkZXYgPSBOVUxMOwpAQCAtNTIzLDI4ICs0OTEsMzQgQEAKIAl9CiB9CiAKLS8qCi0gKiBQcmVzZW5jZSBvZiBwcmVfcmVzZXQgYW5kIHBvc3RfcmVzZXQgcHJldmVudHMgdGhlIGRyaXZlciBmcm9tIGJlaW5nIHVuYm91bmQKLSAqIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyByZXNldAotICovCisjaWZkZWYgQ09ORklHX1BNCiAKLXN0YXRpYyBpbnQgc3R1Yl9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKKy8qIFRoZXNlIGZ1bmN0aW9ucyBuZWVkIHVzYl9wb3J0X3N1c3BlbmQgYW5kIHVzYl9wb3J0X3Jlc3VtZSwKKyAqIHdoaWNoIHJlc2lkZSBpbiBkcml2ZXJzL3VzYi9jb3JlL3VzYi5oLiBTa2lwIGZvciBub3cuICovCisKK3N0YXRpYyBpbnQgc3R1Yl9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKLQlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgInByZV9yZXNldFxuIik7CisJZGV2X2RiZygmdWRldi0+ZGV2LCAic3R1Yl9zdXNwZW5kXG4iKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0dWJfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQorc3RhdGljIGludCBzdHViX3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7Ci0JZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJwb3N0X3Jlc2V0XG4iKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJzdHViX3Jlc3VtZVxuIik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHVzYl9kcml2ZXIgc3R1Yl9kcml2ZXIgPSB7CisjZW5kaWYJLyogQ09ORklHX1BNICovCisKK3N0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciBzdHViX2RyaXZlciA9IHsKIAkubmFtZQkJPSAidXNiaXAtaG9zdCIsCiAJLnByb2JlCQk9IHN0dWJfcHJvYmUsCiAJLmRpc2Nvbm5lY3QJPSBzdHViX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlCT0gc3R1Yl90YWJsZSwKLQkucHJlX3Jlc2V0CT0gc3R1Yl9wcmVfcmVzZXQsCi0JLnBvc3RfcmVzZXQJPSBzdHViX3Bvc3RfcmVzZXQsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBzdHViX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzdHViX3Jlc3VtZSwKKyNlbmRpZgorCS5zdXBwb3J0c19hdXRvc3VzcGVuZAk9CTAsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCmluZGV4IGJhZjg1N2YuLjljNTgzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAic3R1Yi5oIgpAQCAtMTg3LDYgKzE4OCwzNCBAQAogc3RhdGljIERSSVZFUl9BVFRSKG1hdGNoX2J1c2lkLCBTX0lSVVNSIHwgU19JV1VTUiwgc2hvd19tYXRjaF9idXNpZCwKIAkJICAgc3RvcmVfbWF0Y2hfYnVzaWQpOwogCitzdGF0aWMgc3NpemVfdCByZWJpbmRfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKwlpbnQgbGVuOworCXN0cnVjdCBidXNfaWRfcHJpdiAqYmlkOworCisJLyogYnVmIGxlbmd0aCBzaG91bGQgYmUgbGVzcyB0aGF0IEJVU0lEX1NJWkUgKi8KKwlsZW4gPSBzdHJubGVuKGJ1ZiwgQlVTSURfU0laRSk7CisKKwlpZiAoIShsZW4gPCBCVVNJRF9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliaWQgPSBnZXRfYnVzaWRfcHJpdihidWYpOworCWlmICghYmlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGRldmljZV9hdHRhY2goJmJpZC0+dWRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZiaWQtPnVkZXYtPmRldiwgInJlYmluZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERSSVZFUl9BVFRSX1dPKHJlYmluZCk7CisKIHN0YXRpYyBzdHJ1Y3Qgc3R1Yl9wcml2ICpzdHViX3ByaXZfcG9wX2Zyb21fbGlzdGhlYWQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdGhlYWQpCiB7CiAJc3RydWN0IHN0dWJfcHJpdiAqcHJpdiwgKnRtcDsKQEAgLTI1NCw3ICsyODMsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXQgPSB1c2JfcmVnaXN0ZXIoJnN0dWJfZHJpdmVyKTsKKwlyZXQgPSB1c2JfcmVnaXN0ZXJfZGV2aWNlX2RyaXZlcigmc3R1Yl9kcml2ZXIsIFRISVNfTU9EVUxFKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigidXNiX3JlZ2lzdGVyIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJfdXNiX3JlZ2lzdGVyOwpAQCAtMjY3LDExICsyOTYsMTggQEAKIAkJZ290byBlcnJfY3JlYXRlX2ZpbGU7CiAJfQogCisJcmV0ID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZzdHViX2RyaXZlci5kcnZ3cmFwLmRyaXZlciwKKwkJCQkgJmRyaXZlcl9hdHRyX3JlYmluZCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImRyaXZlcl9jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9jcmVhdGVfZmlsZTsKKwl9CisKIAlwcl9pbmZvKERSSVZFUl9ERVNDICIgdiIgVVNCSVBfVkVSU0lPTiAiXG4iKTsKIAlyZXR1cm4gcmV0OwogCiBlcnJfY3JlYXRlX2ZpbGU6Ci0JdXNiX2RlcmVnaXN0ZXIoJnN0dWJfZHJpdmVyKTsKKwl1c2JfZGVyZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKCZzdHViX2RyaXZlcik7CiBlcnJfdXNiX3JlZ2lzdGVyOgogCWttZW1fY2FjaGVfZGVzdHJveShzdHViX3ByaXZfY2FjaGUpOwogCXJldHVybiByZXQ7CkBAIC0yODIsMTEgKzMxOCwxNCBAQAogCWRyaXZlcl9yZW1vdmVfZmlsZSgmc3R1Yl9kcml2ZXIuZHJ2d3JhcC5kcml2ZXIsCiAJCQkgICAmZHJpdmVyX2F0dHJfbWF0Y2hfYnVzaWQpOwogCisJZHJpdmVyX3JlbW92ZV9maWxlKCZzdHViX2RyaXZlci5kcnZ3cmFwLmRyaXZlciwKKwkJCSAgICZkcml2ZXJfYXR0cl9yZWJpbmQpOworCiAJLyoKIAkgKiBkZXJlZ2lzdGVyKCkgY2FsbHMgc3R1Yl9kaXNjb25uZWN0KCkgZm9yIGFsbCBkZXZpY2VzLiBEZXZpY2UKIAkgKiBzcGVjaWZpYyBkYXRhIGlzIGNsZWFyZWQgaW4gc3R1Yl9kaXNjb25uZWN0KCkuCiAJICovCi0JdXNiX2RlcmVnaXN0ZXIoJnN0dWJfZHJpdmVyKTsKKwl1c2JfZGVyZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKCZzdHViX2RyaXZlcik7CiAKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc3R1Yl9wcml2X2NhY2hlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCmluZGV4IDVkMWQ0YTEuLmUwYjZkNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwpAQCAtMTQyLDMxICsxNDIsMTkgQEAKIAogc3RhdGljIGludCB0d2Vha19zZXRfY29uZmlndXJhdGlvbl9jbWQoc3RydWN0IHVyYiAqdXJiKQogeworCXN0cnVjdCBzdHViX3ByaXYgKnByaXYgPSAoc3RydWN0IHN0dWJfcHJpdiAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2ID0gcHJpdi0+c2RldjsKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXE7CiAJX191MTYgY29uZmlnOworCWludCBlcnI7CiAKIAlyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSB1cmItPnNldHVwX3BhY2tldDsKIAljb25maWcgPSBsZTE2X3RvX2NwdShyZXEtPndWYWx1ZSk7CiAKLQkvKgotCSAqIEkgaGF2ZSBuZXZlciBzZWVuIGEgbXVsdGktY29uZmlnIGRldmljZS4gVmVyeSByYXJlLgotCSAqIEZvciBtb3N0IGRldmljZXMsIHRoaXMgd2lsbCBiZSBjYWxsZWQgdG8gY2hvb3NlIGEgZGVmYXVsdAotCSAqIGNvbmZpZ3VyYXRpb24gb25seSBvbmNlIGluIGFuIGluaXRpYWxpemF0aW9uIHBoYXNlLgotCSAqCi0JICogc2V0X2NvbmZpZ3VyYXRpb24gbWF5IGNoYW5nZSBhIGRldmljZSBjb25maWd1cmF0aW9uIGFuZCBpdHMgZGV2aWNlCi0JICogZHJpdmVycyB3aWxsIGJlIHVuYm91bmQgYW5kIGFzc2lnbmVkIGZvciBhIG5ldyBkZXZpY2UgY29uZmlndXJhdGlvbi4KLQkgKiBUaGlzIG1lYW5zIHRoaXMgdXNiaXAgZHJpdmVyIHdpbGwgYmUgYWxzbyB1bmJvdW5kIHdoZW4gY2FsbGVkLCB0aGVuCi0JICogZXZlbnR1YWxseSByZWFzc2lnbmVkIHRvIHRoZSBkZXZpY2UgYXMgZmFyIGFzIGRyaXZlciBtYXRjaGluZwotCSAqIGNvbmRpdGlvbiBpcyBrZXB0LgotCSAqCi0JICogVW5mb3J0dW5hdGVseSwgYW4gZXhpc3RpbmcgdXNiaXAgY29ubmVjdGlvbiB3aWxsIGJlIGRyb3BwZWQKLQkgKiBkdWUgdG8gdGhpcyBkcml2ZXIgdW5iaW5kaW5nLiBTbywgc2tpcCBoZXJlLgotCSAqIEEgdXNlciBtYXkgbmVlZCB0byBzZXQgYSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gdmFsdWUgYmVmb3JlCi0JICogZXhwb3J0aW5nIHRoZSBkZXZpY2UuCi0JICovCi0JZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJ1c2Jfc2V0X2NvbmZpZ3VyYXRpb24gJWQgdG8gJXMuLi4gc2tpcCFcbiIsCi0JCSBjb25maWcsIGRldl9uYW1lKCZ1cmItPmRldi0+ZGV2KSk7Ci0KKwllcnIgPSB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oc2Rldi0+dWRldiwgY29uZmlnKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRU5PREVWKQorCQlkZXZfZXJyKCZzZGV2LT51ZGV2LT5kZXYsICJjYW4ndCBzZXQgY29uZmlnICMlZCwgZXJyb3IgJWRcbiIsCisJCQljb25maWcsIGVycik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU1MCw3ICs1MzgsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHVzYmlwX2hlYWRlciBwZHU7CiAJc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2ID0gY29udGFpbmVyX29mKHVkLCBzdHJ1Y3Qgc3R1Yl9kZXZpY2UsIHVkKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2Rldi0+aW50ZXJmYWNlLT5kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZXYtPnVkZXYtPmRldjsKIAogCXVzYmlwX2RiZ19zdHViX3J4KCJFbnRlclxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jCmluZGV4IGNkNTMyNmEuLjE2MjI1NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYwpAQCAtNzQsMTIgKzc0LDEyIEBACiAJCS8qIE9LICovCiAJCWJyZWFrOwogCWNhc2UgLUVOT0VOVDoKLQkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJzdG9wcGVkIGJ5IGEgY2FsbCB0byB1c2Jfa2lsbF91cmIoKSAiCi0JCQkgImJlY2F1c2Ugb2YgY2xlYW5pbmcgdXAgYSB2aXJ0dWFsIGNvbm5lY3Rpb25cbiIpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCSAic3RvcHBlZCBieSBhIGNhbGwgdG8gdXNiX2tpbGxfdXJiKCkgYmVjYXVzZSBvZiBjbGVhbmluZyB1cCBhIHZpcnR1YWwgY29ubmVjdGlvblxuIik7CiAJCXJldHVybjsKIAljYXNlIC1FQ09OTlJFU0VUOgotCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgInVubGlua2VkIGJ5IGEgY2FsbCB0byAiCi0JCQkgInVzYl91bmxpbmtfdXJiKClcbiIpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCSAidW5saW5rZWQgYnkgYSBjYWxsIHRvIHVzYl91bmxpbmtfdXJiKClcbiIpOwogCQlicmVhazsKIAljYXNlIC1FUElQRToKIAkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJlbmRwb2ludCAlZCBpcyBzdGFsbGVkXG4iLApAQCAtODksOCArODksOSBAQAogCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgImRldmljZSByZW1vdmVkP1xuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAidXJiIGNvbXBsZXRpb24gd2l0aCBub24temVybyBzdGF0dXMgIgotCQkJICIlZFxuIiwgdXJiLT5zdGF0dXMpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCSAidXJiIGNvbXBsZXRpb24gd2l0aCBub24temVybyBzdGF0dXMgJWRcbiIsCisJCQkgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAl9CiAKQEAgLTIyOCw4ICsyMjksNyBAQAogCiAJCQlpZiAodHhzaXplICE9IHNpemVvZihwZHVfaGVhZGVyKSArIHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQkJCWRldl9lcnIoJnNkZXYtPmludGVyZmFjZS0+ZGV2LAotCQkJCQkiYWN0dWFsIGxlbmd0aCBvZiB1cmIgJWQgZG9lcyBub3QgIgotCQkJCQkibWF0Y2ggaXNvIHBhY2tldCBzaXplcyAlenVcbiIsCisJCQkJCSJhY3R1YWwgbGVuZ3RoIG9mIHVyYiAlZCBkb2VzIG5vdCBtYXRjaCBpc28gcGFja2V0IHNpemVzICV6dVxuIiwKIAkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLAogCQkJCQl0eHNpemUtc2l6ZW9mKHBkdV9oZWFkZXIpKTsKIAkJCQlrZnJlZShpb3YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VhcGkvdXNiaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91YXBpL3VzYmlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1ZGIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91YXBpL3VzYmlwLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqCXVzYmlwLmgKKyAqCisgKglVU0JJUCB1YXBpIGRlZmluZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZXRjLgorKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9VU0JJUF9ICisjZGVmaW5lIF9VQVBJX0xJTlVYX1VTQklQX0gKKworLyogdXNiaXAgZGV2aWNlIHN0YXR1cyAtIGV4cG9ydGVkIGluIHVzYmlwIGRldmljZSBzeXNmcyBzdGF0dXMgKi8KK2VudW0gdXNiaXBfZGV2aWNlX3N0YXR1cyB7CisJLyogc2RldiBpcyBhdmFpbGFibGUuICovCisJU0RFVl9TVF9BVkFJTEFCTEUgPSAweDAxLAorCS8qIHNkZXYgaXMgbm93IHVzZWQuICovCisJU0RFVl9TVF9VU0VELAorCS8qIHNkZXYgaXMgdW51c2FibGUgYmVjYXVzZSBvZiBhIGZhdGFsIGVycm9yLiAqLworCVNERVZfU1RfRVJST1IsCisKKwkvKiB2ZGV2IGRvZXMgbm90IGNvbm5lY3QgYSByZW1vdGUgZGV2aWNlLiAqLworCVZERVZfU1RfTlVMTCwKKwkvKiB2ZGV2IGlzIHVzZWQsIGJ1dCB0aGUgVVNCIGFkZHJlc3MgaXMgbm90IGFzc2lnbmVkIHlldCAqLworCVZERVZfU1RfTk9UQVNTSUdORUQsCisJVkRFVl9TVF9VU0VELAorCVZERVZfU1RfRVJST1IKK307CisjZW5kaWYgLyogX1VBUElfTElOVVhfVVNCSVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jCmluZGV4IDk2NTUyZTMuLjE4NGZhNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMKQEAgLTU1LDcgKzU1LDggQEAKIAkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCQkgc2l6ZV90IGNvdW50KQogewotCXNzY2FuZihidWYsICIlbHgiLCAmdXNiaXBfZGVidWdfZmxhZyk7CisJaWYgKHNzY2FuZihidWYsICIlbHgiLCAmdXNiaXBfZGVidWdfZmxhZykgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIGNvdW50OwogfQogREVWSUNFX0FUVFJfUlcodXNiaXBfZGVidWcpOwpAQCAtOTksMjYgKzEwMCw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnVkZXYtPmRldjsKIAlpbnQgaTsKIAotCWRldl9kYmcoZGV2LCAiICAgICAgIGRldm51bSglZCkgZGV2cGF0aCglcykgIiwKLQkJdWRldi0+ZGV2bnVtLCB1ZGV2LT5kZXZwYXRoKTsKLQotCXN3aXRjaCAodWRldi0+c3BlZWQpIHsKLQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQlwcl9kZWJ1ZygiU1BEX0hJR0ggIik7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NQRUVEX0ZVTEw6Ci0JCXByX2RlYnVnKCJTUERfRlVMTCAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1BFRURfTE9XOgotCQlwcl9kZWJ1ZygiU1BEX0xPVyAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1BFRURfVU5LTk9XTjoKLQkJcHJfZGVidWcoIlNQRF9VTktOT1dOICIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiU1BEX0VSUk9SICIpOwotCQlicmVhazsKLQl9CisJZGV2X2RiZyhkZXYsICIgICAgICAgZGV2bnVtKCVkKSBkZXZwYXRoKCVzKSB1c2Igc3BlZWQoJXMpIiwKKwkJdWRldi0+ZGV2bnVtLCB1ZGV2LT5kZXZwYXRoLCB1c2Jfc3BlZWRfc3RyaW5nKHVkZXYtPnNwZWVkKSk7CiAKIAlwcl9kZWJ1ZygidHQgJXAsIHR0cG9ydCAlZFxuIiwgdWRldi0+dHQsIHVkZXYtPnR0cG9ydCk7CiAKQEAgLTE5NSw4ICsxNzgsOCBAQAogCX0KIAogCXByX2RlYnVnKCIgICAgICAgIik7Ci0JcHJfZGVidWcoImJSZXF1ZXN0VHlwZSglMDJYKSBiUmVxdWVzdCglMDJYKSB3VmFsdWUoJTA0WCkgd0luZGV4KCUwNFgpICIKLQkJICJ3TGVuZ3RoKCUwNFgpICIsIGNtZC0+YlJlcXVlc3RUeXBlLCBjbWQtPmJSZXF1ZXN0LAorCXByX2RlYnVnKCJiUmVxdWVzdFR5cGUoJTAyWCkgYlJlcXVlc3QoJTAyWCkgd1ZhbHVlKCUwNFgpIHdJbmRleCglMDRYKSB3TGVuZ3RoKCUwNFgpICIsCisJCSBjbWQtPmJSZXF1ZXN0VHlwZSwgY21kLT5iUmVxdWVzdCwKIAkJIGNtZC0+d1ZhbHVlLCBjbWQtPndJbmRleCwgY21kLT53TGVuZ3RoKTsKIAlwcl9kZWJ1ZygiXG4gICAgICAgIik7CiAKQEAgLTMwNyw4ICsyOTAsNyBAQAogCiAJc3dpdGNoIChwZHUtPmJhc2UuY29tbWFuZCkgewogCWNhc2UgVVNCSVBfQ01EX1NVQk1JVDoKLQkJcHJfZGVidWcoIlVTQklQX0NNRF9TVUJNSVQ6ICIKLQkJCSAieF9mbGFncyAldSB4X2xlbiAldSBzZiAldSAjcCAlZCBpdiAlZFxuIiwKKwkJcHJfZGVidWcoIlVTQklQX0NNRF9TVUJNSVQ6IHhfZmxhZ3MgJXUgeF9sZW4gJXUgc2YgJXUgI3AgJWQgaXYgJWRcbiIsCiAJCQkgcGR1LT51LmNtZF9zdWJtaXQudHJhbnNmZXJfZmxhZ3MsCiAJCQkgcGR1LT51LmNtZF9zdWJtaXQudHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCSBwZHUtPnUuY21kX3N1Ym1pdC5zdGFydF9mcmFtZSwKQEAgLTcwNSw4ICs2ODcsNyBAQAogCiAJaWYgKHRvdGFsX2xlbmd0aCAhPSB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKLQkJCSJ0b3RhbCBsZW5ndGggb2YgaXNvIHBhY2tldHMgJWQgbm90IGVxdWFsIHRvIGFjdHVhbCAiCi0JCQkibGVuZ3RoIG9mIGJ1ZmZlciAlZFxuIiwKKwkJCSJ0b3RhbCBsZW5ndGggb2YgaXNvIHBhY2tldHMgJWQgbm90IGVxdWFsIHRvIGFjdHVhbCBsZW5ndGggb2YgYnVmZmVyICVkXG4iLAogCQkJdG90YWxfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCiAJCWlmICh1ZC0+c2lkZSA9PSBVU0JJUF9TVFVCKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5oCmluZGV4IDdlNmM1NDMuLjczMmZiNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlICJ1YXBpL3VzYmlwLmgiCiAKICNkZWZpbmUgVVNCSVBfVkVSU0lPTiAiMS4wLjAiCiAKQEAgLTIzNSwyMiArMjM2LDYgQEAKIAlVU0JJUF9TVFVCLAogfTsKIAotZW51bSB1c2JpcF9zdGF0dXMgewotCS8qIHNkZXYgaXMgYXZhaWxhYmxlLiAqLwotCVNERVZfU1RfQVZBSUxBQkxFID0gMHgwMSwKLQkvKiBzZGV2IGlzIG5vdyB1c2VkLiAqLwotCVNERVZfU1RfVVNFRCwKLQkvKiBzZGV2IGlzIHVudXNhYmxlIGJlY2F1c2Ugb2YgYSBmYXRhbCBlcnJvci4gKi8KLQlTREVWX1NUX0VSUk9SLAotCi0JLyogdmRldiBkb2VzIG5vdCBjb25uZWN0IGEgcmVtb3RlIGRldmljZS4gKi8KLQlWREVWX1NUX05VTEwsCi0JLyogdmRldiBpcyB1c2VkLCBidXQgdGhlIFVTQiBhZGRyZXNzIGlzIG5vdCBhc3NpZ25lZCB5ZXQgKi8KLQlWREVWX1NUX05PVEFTU0lHTkVELAotCVZERVZfU1RfVVNFRCwKLQlWREVWX1NUX0VSUk9SCi19OwotCiAvKiBldmVudCBoYW5kbGVyICovCiAjZGVmaW5lIFVTQklQX0VIX1NIVVRET1dOCSgxIDw8IDApCiAjZGVmaW5lIFVTQklQX0VIX0JZRQkJKDEgPDwgMSkKQEAgLTI3MSw3ICsyNTYsNyBAQAogLyogYSBjb21tb24gc3RydWN0dXJlIGZvciBzdHViX2RldmljZSBhbmQgdmhjaV9kZXZpY2UgKi8KIHN0cnVjdCB1c2JpcF9kZXZpY2UgewogCWVudW0gdXNiaXBfc2lkZSBzaWRlOwotCWVudW0gdXNiaXBfc3RhdHVzIHN0YXR1czsKKwllbnVtIHVzYmlwX2RldmljZV9zdGF0dXMgc3RhdHVzOwogCiAJLyogbG9jayBmb3Igc3RhdHVzICovCiAJc3BpbmxvY2tfdCBsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL1JFQURNRQppbmRleCAwMGExNjU4Li5mNTI4YmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL1JFQURNRQpAQCAtOSw4ICs5LDggQEAKICAgICAtIFVTQi9JUCBkZXZpY2UgZHJpdmVycwogCUZvdW5kIGluIHRoZSBzdGFnaW5nIGRpcmVjdG9yeSBvZiB0aGUgTGludXgga2VybmVsLgogCi0gICAgLSBzeXNmc3V0aWxzID49IDIuMC4wCi0Jc3lzZnN1dGlscyBsaWJyYXJ5CisgICAgLSBsaWJ1ZGV2ID49IDIuMAorCWxpYnVkZXYgbGlicmFyeQogCiAgICAgLSBsaWJ3cmFwMC1kZXYKIAl0Y3Agd3JhcHBlciBsaWJyYXJ5CkBAIC0xOSw2ICsxOSwxMCBAQAogCiAgICAgLSBsaWJ0b29sLCBhdXRvbWFrZSA+PSAxLjksIGF1dG9jb25mID49IDIuNS4wLCBwa2ctY29uZmlnCiAKK1tPcHRpb25hbF0KKyAgICAtIGh3ZGF0YQorICAgICAgICBDb250YWlucyBVU0IgZGV2aWNlIGlkZW50aWZpY2F0aW9uIGRhdGEuCisKIAogW0luc3RhbGxdCiAgICAgMC4gR2VuZXJhdGUgY29uZmlndXJhdGlvbiBzY3JpcHRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9jb25maWd1cmUuYWMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2NvbmZpZ3VyZS5hYwppbmRleCAwZWU1ZDkyLi42MDdkMDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2NvbmZpZ3VyZS5hYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2NvbmZpZ3VyZS5hYwpAQCAtMSw3ICsxLDcgQEAKIGRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgogCiBBQ19QUkVSRVEoMi41OSkKLUFDX0lOSVQoW3VzYmlwLXV0aWxzXSwgWzEuMS4xXSwgW2xpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmddKQorQUNfSU5JVChbdXNiaXAtdXRpbHNdLCBbMi4wXSwgW2xpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmddKQogQUNfREVGSU5FKFtVU0JJUF9WRVJTSU9OXSwgWzB4MDAwMDAxMTFdLCBbYmluYXJ5LWNvZGVkIGRlY2ltYWwgdmVyc2lvbiBudW1iZXJdKQogCiBDVVJSRU5UPTAKQEAgLTQ0LDExICs0NCwxMSBAQAogQUNfQ0hFQ0tfRlVOQ1MoW21lbXNldCBta2RpciByZWdjb21wIHNvY2tldCBzdHJjaHIgc3RyZXJyb3Igc3Ryc3RyIGRubAogCQlzdHJ0b3VsXSkKIAotQUNfQ0hFQ0tfSEVBREVSKFtzeXNmcy9saWJzeXNmcy5oXSwKLQkJW0FDX0NIRUNLX0xJQihbc3lzZnNdLCBbc3lzZnNfb3Blbl9kaXJlY3RvcnlfbGlzdF0sCi0JCQkgICAgICBbTElCUz0iJExJQlMgLWxzeXNmcyJdLAotCQkJICAgICAgW0FDX01TR19FUlJPUihbTWlzc2luZyBzeXNmczIgbGlicmFyeSFdKV0pXSwKLQkJW0FDX01TR19FUlJPUihbTWlzc2luZyAvdXNyL2luY2x1ZGUvc3lzZnMvbGlic3lzZnMuaF0pXSkKK0FDX0NIRUNLX0hFQURFUihbbGlidWRldi5oXSwKKwkJW0FDX0NIRUNLX0xJQihbdWRldl0sIFt1ZGV2X25ld10sCisJCQkgICAgICBbTElCUz0iJExJQlMgLWx1ZGV2Il0sCisJCQkgICAgICBbQUNfTVNHX0VSUk9SKFtNaXNzaW5nIHVkZXYgbGlicmFyeSFdKV0pXSwKKwkJW0FDX01TR19FUlJPUihbTWlzc2luZyAvdXNyL2luY2x1ZGUvbGlidWRldi5oXSldKQogCiAjIENoZWNrcyBmb3IgbGlid3JhcCBsaWJyYXJ5LgogQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHVzZSB0aGUgbGlid3JhcCAoVENQIHdyYXBwZXJzKSBsaWJyYXJ5XSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL01ha2VmaWxlLmFtIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvTWFrZWZpbGUuYW0KaW5kZXggNDkyMTE4OS4uN2M4ZjhhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvTWFrZWZpbGUuYW0KKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvTWFrZWZpbGUuYW0KQEAgLTQsNCArNCw1IEBACiAKIGxpYl9MVExJQlJBUklFUyA6PSBsaWJ1c2JpcC5sYQogbGlidXNiaXBfbGFfU09VUkNFUyA6PSBuYW1lcy5jIG5hbWVzLmggdXNiaXBfaG9zdF9kcml2ZXIuYyB1c2JpcF9ob3N0X2RyaXZlci5oIFwKLQkJICAgICAgIHVzYmlwX2NvbW1vbi5jIHVzYmlwX2NvbW1vbi5oIHZoY2lfZHJpdmVyLmMgdmhjaV9kcml2ZXIuaAorCQkgICAgICAgdXNiaXBfY29tbW9uLmMgdXNiaXBfY29tbW9uLmggdmhjaV9kcml2ZXIuYyB2aGNpX2RyaXZlci5oIFwKKwkJICAgICAgIHN5c2ZzX3V0aWxzLmMgc3lzZnNfdXRpbHMuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGM5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9saXN0LmgKQEAgLTAsMCArMSwxMzYgQEAKKyNpZm5kZWYgX0xJU1RfSAorI2RlZmluZSBfTElTVF9ICisKKy8qIFN0cmlwcGVkIGRvd24gaW1wbGVtZW50YXRpb24gb2YgbGlua2VkIGxpc3QgdGFrZW4KKyAqIGZyb20gdGhlIExpbnV4IEtlcm5lbC4KKyAqLworCisvKgorICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgorICogbWFuaXB1bGF0aW5nIHdob2xlIGxpc3RzIHJhdGhlciB0aGFuIHNpbmdsZSBlbnRyaWVzLCBhcworICogc29tZXRpbWVzIHdlIGFscmVhZHkga25vdyB0aGUgbmV4dC9wcmV2IGVudHJpZXMgYW5kIHdlIGNhbgorICogZ2VuZXJhdGUgYmV0dGVyIGNvZGUgYnkgdXNpbmcgdGhlbSBkaXJlY3RseSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhlIGdlbmVyaWMgc2luZ2xlLWVudHJ5IHJvdXRpbmVzLgorICovCisKK3N0cnVjdCBsaXN0X2hlYWQgeworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQsICpwcmV2OworfTsKKworI2RlZmluZSBMSVNUX0hFQURfSU5JVChuYW1lKSB7ICYobmFtZSksICYobmFtZSkgfQorCisjZGVmaW5lIExJU1RfSEVBRChuYW1lKSBcCisJc3RydWN0IGxpc3RfaGVhZCBuYW1lID0gTElTVF9IRUFEX0lOSVQobmFtZSkKKworc3RhdGljIGlubGluZSB2b2lkIElOSVRfTElTVF9IRUFEKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJbGlzdC0+bmV4dCA9IGxpc3Q7CisJbGlzdC0+cHJldiA9IGxpc3Q7Cit9CisKKy8qCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYmV0d2VlbiB0d28ga25vd24gY29uc2VjdXRpdmUgZW50cmllcy4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gbmV3OworCW5ldy0+bmV4dCA9IG5leHQ7CisJbmV3LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV3OworfQorCisvKioKKyAqIGxpc3RfYWRkIC0gYWRkIGEgbmV3IGVudHJ5CisgKiBAbmV3OiBuZXcgZW50cnkgdG8gYmUgYWRkZWQKKyAqIEBoZWFkOiBsaXN0IGhlYWQgdG8gYWRkIGl0IGFmdGVyCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGFmdGVyIHRoZSBzcGVjaWZpZWQgaGVhZC4KKyAqIFRoaXMgaXMgZ29vZCBmb3IgaW1wbGVtZW50aW5nIHN0YWNrcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKm5ldywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKG5ldywgaGVhZCwgaGVhZC0+bmV4dCk7Cit9CisKKy8qCisgKiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsIHN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXh0OworfQorCisjZGVmaW5lIFBPSVNPTl9QT0lOVEVSX0RFTFRBIDAKKyNkZWZpbmUgTElTVF9QT0lTT04xICAoKHZvaWQgKikgMHgwMDEwMDEwMCArIFBPSVNPTl9QT0lOVEVSX0RFTFRBKQorI2RlZmluZSBMSVNUX1BPSVNPTjIgICgodm9pZCAqKSAweDAwMjAwMjAwICsgUE9JU09OX1BPSU5URVJfREVMVEEpCisKKy8qKgorICogbGlzdF9kZWwgLSBkZWxldGVzIGVudHJ5IGZyb20gbGlzdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKiBOb3RlOiBsaXN0X2VtcHR5KCkgb24gZW50cnkgZG9lcyBub3QgcmV0dXJuIHRydWUgYWZ0ZXIgdGhpcywgdGhlIGVudHJ5IGlzCisgKiBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3RfZGVsX2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKKwllbnRyeS0+bmV4dCA9IExJU1RfUE9JU09OMTsKKwllbnRyeS0+cHJldiA9IExJU1RfUE9JU09OMjsKK30KKworLyoqCisgKiBsaXN0X2VudHJ5IC0gZ2V0IHRoZSBzdHJ1Y3QgZm9yIHRoaXMgZW50cnkKKyAqIEBwdHI6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCBwb2ludGVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKQorLyoqCisgKiBsaXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfc2FmZSAtIGl0ZXJhdGUgb3ZlciBhIGxpc3Qgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0LCBuID0gcG9zLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBcCisJCXBvcyA9IG4sIG4gPSBwb3MtPm5leHQpCisKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisKKy8qKgorICogY29udGFpbmVyX29mIC0gY2FzdCBhIG1lbWJlciBvZiBhIHN0cnVjdHVyZSBvdXQgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3N5c2ZzX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3N5c2ZzX3V0aWxzLmMKQEAgLTAsMCArMSwzMSBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAic3lzZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKKworaW50IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShjb25zdCBjaGFyICphdHRyX3BhdGgsIGNvbnN0IGNoYXIgKm5ld192YWx1ZSwKKwkJCSAgc2l6ZV90IGxlbikKK3sKKwlpbnQgZmQ7CisJaW50IGxlbmd0aDsKKworCWZkID0gb3BlbihhdHRyX3BhdGgsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWRiZygiZXJyb3Igb3BlbmluZyBhdHRyaWJ1dGUgJXMiLCBhdHRyX3BhdGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJbGVuZ3RoID0gd3JpdGUoZmQsIG5ld192YWx1ZSwgbGVuKTsKKwlpZiAobGVuZ3RoIDwgMCkgeworCQlkYmcoImVycm9yIHdyaXRpbmcgdG8gYXR0cmlidXRlICVzIiwgYXR0cl9wYXRoKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy9zeXNmc191dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvc3lzZnNfdXRpbHMuaApAQCAtMCwwICsxLDggQEAKKworI2lmbmRlZiBfX1NZU0ZTX1VUSUxTX0gKKyNkZWZpbmUgX19TWVNGU19VVElMU19ICisKK2ludCB3cml0ZV9zeXNmc19hdHRyaWJ1dGUoY29uc3QgY2hhciAqYXR0cl9wYXRoLCBjb25zdCBjaGFyICpuZXdfdmFsdWUsCisJCQkgIHNpemVfdCBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmMKaW5kZXggNjZmMDNjYy4uMjM4YmY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmMKQEAgLTIsNiArMiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBUYWthaGlybyBIaXJvZnVjaGkKICAqLwogCisjaW5jbHVkZSA8bGlidWRldi5oPgogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgIm5hbWVzLmgiCiAKQEAgLTEyLDYgKzEzLDggQEAKIGludCB1c2JpcF91c2Vfc3RkZXJyOwogaW50IHVzYmlwX3VzZV9kZWJ1ZzsKIAorZXh0ZXJuIHN0cnVjdCB1ZGV2ICp1ZGV2X2NvbnRleHQ7CisKIHN0cnVjdCBzcGVlZF9zdHJpbmcgewogCWludCBudW07CiAJY2hhciAqc3BlZWQ7CkBAIC0yMyw2ICsyNiw4IEBACiAJeyBVU0JfU1BFRURfTE9XLCAgIjEuNSIsICJMb3cgU3BlZWQoMS41TWJwcykiICB9LAogCXsgVVNCX1NQRUVEX0ZVTEwsICIxMiIsICAiRnVsbCBTcGVlZCgxMk1icHMpIiB9LAogCXsgVVNCX1NQRUVEX0hJR0gsICI0ODAiLCAiSGlnaCBTcGVlZCg0ODBNYnBzKSIgfSwKKwl7IFVTQl9TUEVFRF9XSVJFTEVTUywgIjUzLjMtNDgwIiwgIldpcmVsZXNzIn0sCisJeyBVU0JfU1BFRURfU1VQRVIsICI1MDAwIiwgIlN1cGVyIFNwZWVkKDUwMDBNYnBzKSIgfSwKIAl7IDAsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMTA5LDc1ICsxMTQsNjEgQEAKIH0KIAogCi1pbnQgcmVhZF9hdHRyX3ZhbHVlKHN0cnVjdCBzeXNmc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKK2ludCByZWFkX2F0dHJfdmFsdWUoc3RydWN0IHVkZXZfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICBjb25zdCBjaGFyICpmb3JtYXQpCiB7Ci0JY2hhciBhdHRycGF0aFtTWVNGU19QQVRIX01BWF07Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cjsKKwljb25zdCBjaGFyICphdHRyOwogCWludCBudW0gPSAwOwogCWludCByZXQ7CiAKLQlzbnByaW50ZihhdHRycGF0aCwgc2l6ZW9mKGF0dHJwYXRoKSwgIiVzLyVzIiwgZGV2LT5wYXRoLCBuYW1lKTsKLQotCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShhdHRycGF0aCk7CisJYXR0ciA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKGRldiwgbmFtZSk7CiAJaWYgKCFhdHRyKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9hdHRyaWJ1dGUgZmFpbGVkOiAlcyIsIGF0dHJwYXRoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0ID0gc3lzZnNfcmVhZF9hdHRyaWJ1dGUoYXR0cik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc19yZWFkX2F0dHJpYnV0ZSBmYWlsZWQiKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSBmYWlsZWQiKTsKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gc3NjYW5mKGF0dHItPnZhbHVlLCBmb3JtYXQsICZudW0pOworCS8qIFRoZSBjbGllbnQgY2hvb3NlcyB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKwkgKiB3aGVuIGF0dGFjaGluZyBpdCBzbyByaWdodCBhZnRlciBiZWluZyBib3VuZAorCSAqIHRvIHVzYmlwLWhvc3Qgb24gdGhlIHNlcnZlciB0aGUgZGV2aWNlIHdpbGwKKwkgKiBoYXZlIG5vIGNvbmZpZ3VyYXRpb24uCisJICogVGhlcmVmb3JlLCBhdHRyaWJ1dGVzIHN1Y2ggYXMgYkNvbmZpZ3VyYXRpb25WYWx1ZQorCSAqIGFuZCBiTnVtSW50ZXJmYWNlcyB3aWxsIG5vdCBleGlzdCBhbmQgc3NjYW5mIHdpbGwKKwkgKiBmYWlsLiBDaGVjayBmb3IgdGhlc2UgY2FzZXMgYW5kIGRvbid0IHRyZWF0IHRoZW0KKwkgKiBhcyBlcnJvcnMuCisJICovCisKKwlyZXQgPSBzc2NhbmYoYXR0ciwgZm9ybWF0LCAmbnVtKTsKIAlpZiAocmV0IDwgMSkgewotCQlkYmcoInNzY2FuZiBmYWlsZWQiKTsKLQkJZ290byBlcnI7CisJCWlmIChzdHJjbXAobmFtZSwgImJDb25maWd1cmF0aW9uVmFsdWUiKSAmJgorCQkJCXN0cmNtcChuYW1lLCAiYk51bUludGVyZmFjZXMiKSkgeworCQkJZXJyKCJzc2NhbmYgZmFpbGVkIGZvciBhdHRyaWJ1dGUgJXMiLCBuYW1lKTsKKwkJCWdvdG8gZXJyOworCQl9CiAJfQogCiBlcnI6Ci0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOwogCiAJcmV0dXJuIG51bTsKIH0KIAogCi1pbnQgcmVhZF9hdHRyX3NwZWVkKHN0cnVjdCBzeXNmc19kZXZpY2UgKmRldikKK2ludCByZWFkX2F0dHJfc3BlZWQoc3RydWN0IHVkZXZfZGV2aWNlICpkZXYpCiB7Ci0JY2hhciBhdHRycGF0aFtTWVNGU19QQVRIX01BWF07Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cjsKLQljaGFyIHNwZWVkWzEwMF07Ci0JaW50IHJldDsKKwljb25zdCBjaGFyICpzcGVlZDsKIAotCXNucHJpbnRmKGF0dHJwYXRoLCBzaXplb2YoYXR0cnBhdGgpLCAiJXMvJXMiLCBkZXYtPnBhdGgsICJzcGVlZCIpOwotCi0JYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKGF0dHJwYXRoKTsKLQlpZiAoIWF0dHIpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2F0dHJpYnV0ZSBmYWlsZWQ6ICVzIiwgYXR0cnBhdGgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXQgPSBzeXNmc19yZWFkX2F0dHJpYnV0ZShhdHRyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoInN5c2ZzX3JlYWRfYXR0cmlidXRlIGZhaWxlZCIpOworCXNwZWVkID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAic3BlZWQiKTsKKwlpZiAoIXNwZWVkKSB7CisJCWVycigidWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUgZmFpbGVkIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IHNzY2FuZihhdHRyLT52YWx1ZSwgIiU5OXNcbiIsIHNwZWVkKTsKLQlpZiAocmV0IDwgMSkgewotCQlkYmcoInNzY2FuZiBmYWlsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotZXJyOgotCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKLQogCWZvciAoaW50IGkgPSAwOyBzcGVlZF9zdHJpbmdzW2ldLnNwZWVkICE9IE5VTEw7IGkrKykgewogCQlpZiAoIXN0cmNtcChzcGVlZCwgc3BlZWRfc3RyaW5nc1tpXS5zcGVlZCkpCiAJCQlyZXR1cm4gc3BlZWRfc3RyaW5nc1tpXS5udW07CiAJfQogCitlcnI6CisKIAlyZXR1cm4gVVNCX1NQRUVEX1VOS05PV047CiB9CiAKQEAgLTE4OCw5ICsxNzksMTAgQEAKIAl9IHdoaWxlICgwKQogCiAKLWludCByZWFkX3VzYl9kZXZpY2Uoc3RydWN0IHN5c2ZzX2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpCitpbnQgcmVhZF91c2JfZGV2aWNlKHN0cnVjdCB1ZGV2X2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpCiB7CiAJdWludDMyX3QgYnVzbnVtLCBkZXZudW07CisJY29uc3QgY2hhciAqcGF0aCwgKm5hbWU7CiAKIAlSRUFEX0FUVFIodWRldiwgdWludDhfdCwgIHNkZXYsIGJEZXZpY2VDbGFzcywJCSIlMDJ4XG4iKTsKIAlSRUFEX0FUVFIodWRldiwgdWludDhfdCwgIHNkZXYsIGJEZXZpY2VTdWJDbGFzcywJIiUwMnhcbiIpOwpAQCAtMjA3LDEwICsxOTksMTMgQEAKIAlSRUFEX0FUVFIodWRldiwgdWludDhfdCwgIHNkZXYsIGRldm51bSwJCQkiJWRcbiIpOwogCXVkZXYtPnNwZWVkID0gcmVhZF9hdHRyX3NwZWVkKHNkZXYpOwogCi0Jc3RybmNweSh1ZGV2LT5wYXRoLCAgc2Rldi0+cGF0aCwgIFNZU0ZTX1BBVEhfTUFYKTsKLQlzdHJuY3B5KHVkZXYtPmJ1c2lkLCBzZGV2LT5uYW1lLCBTWVNGU19CVVNfSURfU0laRSk7CisJcGF0aCA9IHVkZXZfZGV2aWNlX2dldF9zeXNwYXRoKHNkZXYpOworCW5hbWUgPSB1ZGV2X2RldmljZV9nZXRfc3lzbmFtZShzZGV2KTsKIAotCXNzY2FuZihzZGV2LT5uYW1lLCAiJXUtJXUiLCAmYnVzbnVtLCAmZGV2bnVtKTsKKwlzdHJuY3B5KHVkZXYtPnBhdGgsICBwYXRoLCAgU1lTRlNfUEFUSF9NQVgpOworCXN0cm5jcHkodWRldi0+YnVzaWQsIG5hbWUsIFNZU0ZTX0JVU19JRF9TSVpFKTsKKworCXNzY2FuZihuYW1lLCAiJXUtJXUiLCAmYnVzbnVtLCAmZGV2bnVtKTsKIAl1ZGV2LT5idXNudW0gPSBidXNudW07CiAKIAlyZXR1cm4gMDsKQEAgLTIyMCwxMyArMjE1LDEzIEBACiAJCSAgICAgICBzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSAqdWluZikKIHsKIAljaGFyIGJ1c2lkW1NZU0ZTX0JVU19JRF9TSVpFXTsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpzaWY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpzaWY7CiAKIAlzcHJpbnRmKGJ1c2lkLCAiJXM6JWQuJWQiLCB1ZGV2LT5idXNpZCwgdWRldi0+YkNvbmZpZ3VyYXRpb25WYWx1ZSwgaSk7CiAKLQlzaWYgPSBzeXNmc19vcGVuX2RldmljZSgidXNiIiwgYnVzaWQpOworCXNpZiA9IHVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lKHVkZXZfY29udGV4dCwgInVzYiIsIGJ1c2lkKTsKIAlpZiAoIXNpZikgewotCQlkYmcoInN5c2ZzX29wZW5fZGV2aWNlKFwidXNiXCIsIFwiJXNcIikgZmFpbGVkIiwgYnVzaWQpOworCQllcnIoInVkZXZfZGV2aWNlX25ld19mcm9tX3N1YnN5c3RlbV9zeXNuYW1lICVzIGZhaWxlZCIsIGJ1c2lkKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMjM0LDggKzIyOSw2IEBACiAJUkVBRF9BVFRSKHVpbmYsIHVpbnQ4X3QsICBzaWYsIGJJbnRlcmZhY2VTdWJDbGFzcywJIiUwMnhcbiIpOwogCVJFQURfQVRUUih1aW5mLCB1aW50OF90LCAgc2lmLCBiSW50ZXJmYWNlUHJvdG9jb2wsCSIlMDJ4XG4iKTsKIAotCXN5c2ZzX2Nsb3NlX2RldmljZShzaWYpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmgKaW5kZXggOTM4YWQxYy4uMjNiZTg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfY29tbW9uLmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIF9fVVNCSVBfQ09NTU9OX0gKICNkZWZpbmUgX19VU0JJUF9DT01NT05fSAogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMTQsNiArMTQsOCBAQAogCiAjaW5jbHVkZSA8c3lzbG9nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgIi4uLy4uL3VhcGkvdXNiaXAuaCIKIAogI2lmbmRlZiBVU0JJRFNfRklMRQogI2RlZmluZSBVU0JJRFNfRklMRSAiL3Vzci9zaGFyZS9od2RhdGEvdXNiLmlkcyIKQEAgLTI4LDYgKzMwLDE1IEBACiAjZGVmaW5lIFVTQklQX0hPU1RfRFJWX05BTUUJInVzYmlwLWhvc3QiCiAjZGVmaW5lIFVTQklQX1ZIQ0lfRFJWX05BTUUJInZoY2lfaGNkIgogCisvKiBzeXNmcyBjb25zdGFudHMgKi8KKyNkZWZpbmUgU1lTRlNfTU5UX1BBVEggICAgICAgICAiL3N5cyIKKyNkZWZpbmUgU1lTRlNfQlVTX05BTUUgICAgICAgICAiYnVzIgorI2RlZmluZSBTWVNGU19CVVNfVFlQRSAgICAgICAgICJ1c2IiCisjZGVmaW5lIFNZU0ZTX0RSSVZFUlNfTkFNRSAgICAgImRyaXZlcnMiCisKKyNkZWZpbmUgU1lTRlNfUEFUSF9NQVgJCTI1NgorI2RlZmluZSBTWVNGU19CVVNfSURfU0laRQkzMgorCiBleHRlcm4gaW50IHVzYmlwX3VzZV9zeXNsb2c7CiBleHRlcm4gaW50IHVzYmlwX3VzZV9zdGRlcnI7CiBleHRlcm4gaW50IHVzYmlwX3VzZV9kZWJ1ZyA7CkBAIC03NiwzMCArODcsNiBAQAogCQlhYm9ydCgpOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAotZW51bSB1c2JfZGV2aWNlX3NwZWVkIHsKLQlVU0JfU1BFRURfVU5LTk9XTiA9IDAsICAgICAgICAgICAgICAgICAgLyogZW51bWVyYXRpbmcgKi8KLQlVU0JfU1BFRURfTE9XLCBVU0JfU1BFRURfRlVMTCwgICAgICAgICAgLyogdXNiIDEuMSAqLwotCVVTQl9TUEVFRF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2IgMi4wICovCi0JVVNCX1NQRUVEX1ZBUklBQkxFICAgICAgICAgICAgICAgICAgICAgIC8qIHdpcmVsZXNzICh1c2IgMi41KSAqLwotfTsKLQotLyogRklYTUU6IGhvdyB0byBzeW5jIHdpdGggZHJpdmVycy91c2JpcF9jb21tb24uaCA/ICovCi1lbnVtIHVzYmlwX2RldmljZV9zdGF0dXMgewotCS8qIHNkZXYgaXMgYXZhaWxhYmxlLiAqLwotCVNERVZfU1RfQVZBSUxBQkxFID0gMHgwMSwKLQkvKiBzZGV2IGlzIG5vdyB1c2VkLiAqLwotCVNERVZfU1RfVVNFRCwKLQkvKiBzZGV2IGlzIHVudXNhYmxlIGJlY2F1c2Ugb2YgYSBmYXRhbCBlcnJvci4gKi8KLQlTREVWX1NUX0VSUk9SLAotCi0JLyogdmRldiBkb2VzIG5vdCBjb25uZWN0IGEgcmVtb3RlIGRldmljZS4gKi8KLQlWREVWX1NUX05VTEwsCi0JLyogdmRldiBpcyB1c2VkLCBidXQgdGhlIFVTQiBhZGRyZXNzIGlzIG5vdCBhc3NpZ25lZCB5ZXQgKi8KLQlWREVWX1NUX05PVEFTU0lHTkVELAotCVZERVZfU1RfVVNFRCwKLQlWREVWX1NUX0VSUk9SCi19OwotCiBzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSB7CiAJdWludDhfdCBiSW50ZXJmYWNlQ2xhc3M7CiAJdWludDhfdCBiSW50ZXJmYWNlU3ViQ2xhc3M7CkBAIC0xMzEsOCArMTE4LDggQEAKIAogdm9pZCBkdW1wX3VzYl9pbnRlcmZhY2Uoc3RydWN0IHVzYmlwX3VzYl9pbnRlcmZhY2UgKik7CiB2b2lkIGR1bXBfdXNiX2RldmljZShzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqKTsKLWludCByZWFkX3VzYl9kZXZpY2Uoc3RydWN0IHN5c2ZzX2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpOwotaW50IHJlYWRfYXR0cl92YWx1ZShzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCitpbnQgcmVhZF91c2JfZGV2aWNlKHN0cnVjdCB1ZGV2X2RldmljZSAqc2Rldiwgc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgKnVkZXYpOworaW50IHJlYWRfYXR0cl92YWx1ZShzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdCk7CiBpbnQgcmVhZF91c2JfaW50ZXJmYWNlKHN0cnVjdCB1c2JpcF91c2JfZGV2aWNlICp1ZGV2LCBpbnQgaSwKIAkJICAgICAgIHN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlICp1aW5mKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5jCmluZGV4IDcxYTQ0OWMuLmM1YmY2MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfaG9zdF9kcml2ZXIuYwpAQCAtMTgsMTAyICsxOCw2NSBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKwogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInVzYmlwX2hvc3RfZHJpdmVyLmgiCisjaW5jbHVkZSAibGlzdC5oIgorI2luY2x1ZGUgInN5c2ZzX3V0aWxzLmgiCiAKICN1bmRlZiAgUFJPR05BTUUKICNkZWZpbmUgUFJPR05BTUUgImxpYnVzYmlwIgogCiBzdHJ1Y3QgdXNiaXBfaG9zdF9kcml2ZXIgKmhvc3RfZHJpdmVyOworc3RydWN0IHVkZXYgKnVkZXZfY29udGV4dDsKIAotI2RlZmluZSBTWVNGU19PUEVOX1JFVFJJRVMgMTAwCi0KLS8qIG9ubHkgdGhlIGZpcnN0IGludGVyZmFjZSB2YWx1ZSBpcyB0cnVlISAqLwogc3RhdGljIGludDMyX3QgcmVhZF9hdHRyX3VzYmlwX3N0YXR1cyhzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSAqdWRldikKIHsKLQljaGFyIGF0dHJwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyOworCWNoYXIgc3RhdHVzX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07CisJaW50IGZkOworCWludCBsZW5ndGg7CisJY2hhciBzdGF0dXM7CiAJaW50IHZhbHVlID0gMDsKLQlpbnQgcmM7Ci0Jc3RydWN0IHN0YXQgczsKLQlpbnQgcmV0cmllcyA9IFNZU0ZTX09QRU5fUkVUUklFUzsKIAotCS8qIFRoaXMgYWNjZXNzIGlzIHJhY3khCi0JICoKLQkgKiBKdXN0IGFmdGVyIGRldGFjaCwgb3VyIGRyaXZlciByZW1vdmVzIHRoZSBzeXNmcwotCSAqIGZpbGVzIGFuZCByZWNyZWF0ZXMgdGhlbS4KLQkgKgotCSAqIFdlIG1heSB0cnkgYW5kIGZhaWwgdG8gb3BlbiB0aGUgdXNiaXBfc3RhdHVzIG9mCi0JICogYW4gZXhwb3J0ZWQgZGV2aWNlIGluIHRoZSAoc2hvcnQpIHdpbmRvdyB3aGVyZQotCSAqIGl0IGhhcyBiZWVuIHJlbW92ZWQgYW5kIG5vdCB5ZXQgcmVjcmVhdGVkLgotCSAqCi0JICogVGhpcyBpcyBhIGJ1ZyBpbiB0aGUgaW50ZXJmYWNlLiBOb3RoaW5nIHdlIGNhbiBkbwotCSAqIGV4Y2VwdCB3b3JrIGFyb3VuZCBpdCBoZXJlIGJ5IHBvbGxpbmcgZm9yIHRoZSBzeXNmcwotCSAqIHVzYmlwX3N0YXR1cyB0byByZWFwcGVhci4KLQkgKi8KKwlzbnByaW50ZihzdGF0dXNfYXR0cl9wYXRoLCBTWVNGU19QQVRIX01BWCwgIiVzL3VzYmlwX3N0YXR1cyIsCisJCSB1ZGV2LT5wYXRoKTsKIAotCXNucHJpbnRmKGF0dHJwYXRoLCBTWVNGU19QQVRIX01BWCwgIiVzLyVzOiVkLiVkL3VzYmlwX3N0YXR1cyIsCi0JCSB1ZGV2LT5wYXRoLCB1ZGV2LT5idXNpZCwgdWRldi0+YkNvbmZpZ3VyYXRpb25WYWx1ZSwgMCk7Ci0KLQl3aGlsZSAocmV0cmllcyA+IDApIHsKLQkJaWYgKHN0YXQoYXR0cnBhdGgsICZzKSA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGVycm5vICE9IEVOT0VOVCkgewotCQkJZGJnKCJzdGF0IGZhaWxlZDogJXMiLCBhdHRycGF0aCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQl1c2xlZXAoMTAwMDApOyAvKiAxMG1zICovCi0JCXJldHJpZXMtLTsKLQl9Ci0KLQlpZiAocmV0cmllcyA9PSAwKQotCQlkYmcoInVzYmlwX3N0YXR1cyBub3QgcmVhZHkgYWZ0ZXIgJWQgcmV0cmllcyIsCi0JCSAgICBTWVNGU19PUEVOX1JFVFJJRVMpOwotCWVsc2UgaWYgKHJldHJpZXMgPCBTWVNGU19PUEVOX1JFVFJJRVMpCi0JCWRiZygid2FybmluZzogdXNiaXBfc3RhdHVzIHJlYWR5IGFmdGVyICVkIHJldHJpZXMiLAotCQkgICAgU1lTRlNfT1BFTl9SRVRSSUVTIC0gcmV0cmllcyk7Ci0KLQlhdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUoYXR0cnBhdGgpOwotCWlmICghYXR0cikgewotCQlkYmcoInN5c2ZzX29wZW5fYXR0cmlidXRlIGZhaWxlZDogJXMiLCBhdHRycGF0aCk7CisJaWYgKChmZCA9IG9wZW4oc3RhdHVzX2F0dHJfcGF0aCwgT19SRE9OTFkpKSA8IDApIHsKKwkJZXJyKCJlcnJvciBvcGVuaW5nIGF0dHJpYnV0ZSAlcyIsIHN0YXR1c19hdHRyX3BhdGgpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmMgPSBzeXNmc19yZWFkX2F0dHJpYnV0ZShhdHRyKTsKLQlpZiAocmMpIHsKLQkJZGJnKCJzeXNmc19yZWFkX2F0dHJpYnV0ZSBmYWlsZWQ6ICVzIiwgYXR0cnBhdGgpOwotCQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CisJbGVuZ3RoID0gcmVhZChmZCwgJnN0YXR1cywgMSk7CisJaWYgKGxlbmd0aCA8IDApIHsKKwkJZXJyKCJlcnJvciByZWFkaW5nIGF0dHJpYnV0ZSAlcyIsIHN0YXR1c19hdHRyX3BhdGgpOworCQljbG9zZShmZCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQl2YWx1ZSA9IGF0b2koYXR0ci0+dmFsdWUpOwotCi0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOworCXZhbHVlID0gYXRvaSgmc3RhdHVzKTsKIAogCXJldHVybiB2YWx1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKnVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcoY2hhciAqc2RldnBhdGgpCitzdGF0aWMKK3N0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKnVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcoY29uc3QgY2hhciAqc2RldnBhdGgpCiB7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldiA9IE5VTEw7CisJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldl9vbGQ7CiAJc2l6ZV90IHNpemU7CiAJaW50IGk7CiAKLQllZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqZWRldikpOwotCWlmICghZWRldikgewotCQlkYmcoImNhbGxvYyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWVkZXYgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpKTsKIAotCWVkZXYtPnN1ZGV2ID0gc3lzZnNfb3Blbl9kZXZpY2VfcGF0aChzZGV2cGF0aCk7CisJZWRldi0+c3VkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zeXNwYXRoKHVkZXZfY29udGV4dCwgc2RldnBhdGgpOwogCWlmICghZWRldi0+c3VkZXYpIHsKLQkJZGJnKCJzeXNmc19vcGVuX2RldmljZV9wYXRoIGZhaWxlZDogJXMiLCBzZGV2cGF0aCk7CisJCWVycigidWRldl9kZXZpY2VfbmV3X2Zyb21fc3lzcGF0aDogJXMiLCBzZGV2cGF0aCk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTI0LDExICs4NywxMyBAQAogCQlnb3RvIGVycjsKIAogCS8qIHJlYWxsb2NhdGUgYnVmZmVyIHRvIGluY2x1ZGUgdXNiIGludGVyZmFjZSBkYXRhICovCi0Jc2l6ZSA9IHNpemVvZigqZWRldikgKyBlZGV2LT51ZGV2LmJOdW1JbnRlcmZhY2VzICoKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpICsgZWRldi0+dWRldi5iTnVtSW50ZXJmYWNlcyAqCiAJCXNpemVvZihzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSk7CiAKKwllZGV2X29sZCA9IGVkZXY7CiAJZWRldiA9IHJlYWxsb2MoZWRldiwgc2l6ZSk7CiAJaWYgKCFlZGV2KSB7CisJCWVkZXYgPSBlZGV2X29sZDsKIAkJZGJnKCJyZWFsbG9jIGZhaWxlZCIpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0xMzgsMTYwICsxMDMsODggQEAKIAogCXJldHVybiBlZGV2OwogZXJyOgotCWlmIChlZGV2ICYmIGVkZXYtPnN1ZGV2KQotCQlzeXNmc19jbG9zZV9kZXZpY2UoZWRldi0+c3VkZXYpOworCWlmIChlZGV2LT5zdWRldikKKwkJdWRldl9kZXZpY2VfdW5yZWYoZWRldi0+c3VkZXYpOwogCWlmIChlZGV2KQogCQlmcmVlKGVkZXYpOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfbmV3KHN0cnVjdCBkbGlzdCAqZGxpc3QsIHN0cnVjdCBzeXNmc19kZXZpY2UgKnRhcmdldCkKLXsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpkZXY7Ci0KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGRsaXN0LCBkZXYsIHN0cnVjdCBzeXNmc19kZXZpY2UpIHsKLQkJaWYgKCFzdHJuY21wKGRldi0+YnVzX2lkLCB0YXJnZXQtPmJ1c19pZCwgU1lTRlNfQlVTX0lEX1NJWkUpKQotCQkJLyogZGV2aWNlIGZvdW5kIGFuZCBpcyBub3QgbmV3ICovCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZV9ub3RoaW5nKHZvaWQgKnVudXNlZF9kYXRhKQotewotCS8qCi0JICogTk9URTogRG8gbm90IGRlbGV0ZSBhbnl0aGluZywgYnV0IHRoZSBjb250YWluZXIgd2lsbCBiZSBkZWxldGVkLgotCSAqLwotCSh2b2lkKSB1bnVzZWRfZGF0YTsKLX0KLQogc3RhdGljIGludCByZWZyZXNoX2V4cG9ydGVkX2RldmljZXModm9pZCkKIHsKLQkvKiBzeXNmc19kZXZpY2Ugb2YgdXNiX2ludGVyZmFjZSAqLwotCXN0cnVjdCBzeXNmc19kZXZpY2UJKnN1aW50ZjsKLQlzdHJ1Y3QgZGxpc3QJCSpzdWludGZfbGlzdDsKLQkvKiBzeXNmc19kZXZpY2Ugb2YgdXNiX2RldmljZSAqLwotCXN0cnVjdCBzeXNmc19kZXZpY2UJKnN1ZGV2OwotCXN0cnVjdCBkbGlzdAkJKnN1ZGV2X2xpc3Q7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldjsKKwlzdHJ1Y3QgdWRldl9lbnVtZXJhdGUgKmVudW1lcmF0ZTsKKwlzdHJ1Y3QgdWRldl9saXN0X2VudHJ5ICpkZXZpY2VzLCAqZGV2X2xpc3RfZW50cnk7CisJc3RydWN0IHVkZXZfZGV2aWNlICpkZXY7CisJY29uc3QgY2hhciAqcGF0aDsKIAotCXN1ZGV2X2xpc3QgPSBkbGlzdF9uZXdfd2l0aF9kZWxldGUoc2l6ZW9mKHN0cnVjdCBzeXNmc19kZXZpY2UpLAotCQkJCQkgICBkZWxldGVfbm90aGluZyk7CisJZW51bWVyYXRlID0gdWRldl9lbnVtZXJhdGVfbmV3KHVkZXZfY29udGV4dCk7CisJdWRldl9lbnVtZXJhdGVfYWRkX21hdGNoX3N1YnN5c3RlbShlbnVtZXJhdGUsICJ1c2IiKTsKKwl1ZGV2X2VudW1lcmF0ZV9zY2FuX2RldmljZXMoZW51bWVyYXRlKTsKIAotCXN1aW50Zl9saXN0ID0gc3lzZnNfZ2V0X2RyaXZlcl9kZXZpY2VzKGhvc3RfZHJpdmVyLT5zeXNmc19kcml2ZXIpOwotCWlmICghc3VpbnRmX2xpc3QpIHsKLQkJLyoKLQkJICogTm90IGFuIGVycm9yIGNvbmRpdGlvbi4gVGhlcmUgYXJlIHNpbXBseSBubyBkZXZpY2VzIGJvdW5kIHRvCi0JCSAqIHRoZSBkcml2ZXIgeWV0LgotCQkgKi8KLQkJZGJnKCJiaW5kICIgVVNCSVBfSE9TVF9EUlZfTkFNRSAiLmtvIHRvIGEgdXNiIGRldmljZSB0byBiZSAiCi0JCSAgICAiZXhwb3J0YWJsZSEiKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWRldmljZXMgPSB1ZGV2X2VudW1lcmF0ZV9nZXRfbGlzdF9lbnRyeShlbnVtZXJhdGUpOwogCi0JLyogY29sbGVjdCB1bmlxdWUgVVNCIGRldmljZXMgKG5vdCBpbnRlcmZhY2VzKSAqLwotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoc3VpbnRmX2xpc3QsIHN1aW50Ziwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQkvKiBnZXQgdXNiIGRldmljZSBvZiB0aGlzIHVzYiBpbnRlcmZhY2UgKi8KLQkJc3VkZXYgPSBzeXNmc19nZXRfZGV2aWNlX3BhcmVudChzdWludGYpOwotCQlpZiAoIXN1ZGV2KSB7Ci0JCQlkYmcoInN5c2ZzX2dldF9kZXZpY2VfcGFyZW50IGZhaWxlZDogJXMiLCBzdWludGYtPm5hbWUpOwotCQkJY29udGludWU7Ci0JCX0KKwl1ZGV2X2xpc3RfZW50cnlfZm9yZWFjaChkZXZfbGlzdF9lbnRyeSwgZGV2aWNlcykgeworCQlwYXRoID0gdWRldl9saXN0X2VudHJ5X2dldF9uYW1lKGRldl9saXN0X2VudHJ5KTsKKwkJZGV2ID0gdWRldl9kZXZpY2VfbmV3X2Zyb21fc3lzcGF0aCh1ZGV2X2NvbnRleHQsIHBhdGgpOwogCi0JCWlmIChjaGVja19uZXcoc3VkZXZfbGlzdCwgc3VkZXYpKSB7Ci0JCQkvKiBpbnNlcnQgaXRlbSBhdCBoZWFkIG9mIGxpc3QgKi8KLQkJCWRsaXN0X3Vuc2hpZnQoc3VkZXZfbGlzdCwgc3VkZXYpOworCQkvKiBDaGVjayB3aGV0aGVyIGRldmljZSB1c2VzIHVzYmlwLWhvc3QgZHJpdmVyLiAqLworCQlpZiAoIXN0cmNtcCh1ZGV2X2RldmljZV9nZXRfZHJpdmVyKGRldiksCisJCQkgICAgVVNCSVBfSE9TVF9EUlZfTkFNRSkpIHsKKwkJCWVkZXYgPSB1c2JpcF9leHBvcnRlZF9kZXZpY2VfbmV3KHBhdGgpOworCQkJaWYgKCFlZGV2KSB7CisJCQkJZGJnKCJ1c2JpcF9leHBvcnRlZF9kZXZpY2VfbmV3IGZhaWxlZCIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlsaXN0X2FkZCgmZWRldi0+bm9kZSwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOworCQkJaG9zdF9kcml2ZXItPm5kZXZzKys7CiAJCX0KIAl9CiAKLQlkbGlzdF9mb3JfZWFjaF9kYXRhKHN1ZGV2X2xpc3QsIHN1ZGV2LCBzdHJ1Y3Qgc3lzZnNfZGV2aWNlKSB7Ci0JCWVkZXYgPSB1c2JpcF9leHBvcnRlZF9kZXZpY2VfbmV3KHN1ZGV2LT5wYXRoKTsKLQkJaWYgKCFlZGV2KSB7Ci0JCQlkYmcoInVzYmlwX2V4cG9ydGVkX2RldmljZV9uZXcgZmFpbGVkIik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWRsaXN0X3Vuc2hpZnQoaG9zdF9kcml2ZXItPmVkZXZfbGlzdCwgZWRldik7Ci0JCWhvc3RfZHJpdmVyLT5uZGV2cysrOwotCX0KLQotCWRsaXN0X2Rlc3Ryb3koc3VkZXZfbGlzdCk7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNmc19kcml2ZXIgKm9wZW5fc3lzZnNfaG9zdF9kcml2ZXIodm9pZCkKK3N0YXRpYyB2b2lkIHVzYmlwX2V4cG9ydGVkX2RldmljZV9kZXN0cm95KHZvaWQpCiB7Ci0JY2hhciBidXNfdHlwZVtdID0gInVzYiI7Ci0JY2hhciBzeXNmc19tbnRwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQljaGFyIGhvc3RfZHJ2X3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19kcml2ZXIgKmhvc3RfZHJ2OwotCWludCByYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppLCAqdG1wOworCXN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKmVkZXY7CiAKLQlyYyA9IHN5c2ZzX2dldF9tbnRfcGF0aChzeXNmc19tbnRwYXRoLCBTWVNGU19QQVRIX01BWCk7Ci0JaWYgKHJjIDwgMCkgewotCQlkYmcoInN5c2ZzX2dldF9tbnRfcGF0aCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGksIHRtcCwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpIHsKKwkJZWRldiA9IGxpc3RfZW50cnkoaSwgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSwgbm9kZSk7CisJCWxpc3RfZGVsKGkpOworCQlmcmVlKGVkZXYpOwogCX0KLQotCXNucHJpbnRmKGhvc3RfZHJ2X3BhdGgsIFNZU0ZTX1BBVEhfTUFYLCAiJXMvJXMvJXMvJXMvJXMiLAotCQkgc3lzZnNfbW50cGF0aCwgU1lTRlNfQlVTX05BTUUsIGJ1c190eXBlLCBTWVNGU19EUklWRVJTX05BTUUsCi0JCSBVU0JJUF9IT1NUX0RSVl9OQU1FKTsKLQotCWhvc3RfZHJ2ID0gc3lzZnNfb3Blbl9kcml2ZXJfcGF0aChob3N0X2Rydl9wYXRoKTsKLQlpZiAoIWhvc3RfZHJ2KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kcml2ZXJfcGF0aCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGhvc3RfZHJ2OwotfQotCi1zdGF0aWMgdm9pZCB1c2JpcF9leHBvcnRlZF9kZXZpY2VfZGVsZXRlKHZvaWQgKmRldikKLXsKLQlzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlICplZGV2ID0gZGV2OwotCXN5c2ZzX2Nsb3NlX2RldmljZShlZGV2LT5zdWRldik7Ci0JZnJlZShkZXYpOwogfQogCiBpbnQgdXNiaXBfaG9zdF9kcml2ZXJfb3Blbih2b2lkKQogewogCWludCByYzsKIAotCWhvc3RfZHJpdmVyID0gY2FsbG9jKDEsIHNpemVvZigqaG9zdF9kcml2ZXIpKTsKLQlpZiAoIWhvc3RfZHJpdmVyKSB7Ci0JCWRiZygiY2FsbG9jIGZhaWxlZCIpOworCXVkZXZfY29udGV4dCA9IHVkZXZfbmV3KCk7CisJaWYgKCF1ZGV2X2NvbnRleHQpIHsKKwkJZXJyKCJ1ZGV2X25ldyBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWhvc3RfZHJpdmVyLT5uZGV2cyA9IDA7Ci0JaG9zdF9kcml2ZXItPmVkZXZfbGlzdCA9Ci0JCWRsaXN0X25ld193aXRoX2RlbGV0ZShzaXplb2Yoc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSksCi0JCQkJICAgICAgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX2RlbGV0ZSk7Ci0JaWYgKCFob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7Ci0JCWRiZygiZGxpc3RfbmV3X3dpdGhfZGVsZXRlIGZhaWxlZCIpOwotCQlnb3RvIGVycl9mcmVlX2hvc3RfZHJpdmVyOwotCX0KKwlob3N0X2RyaXZlciA9IGNhbGxvYygxLCBzaXplb2YoKmhvc3RfZHJpdmVyKSk7CiAKLQlob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyID0gb3Blbl9zeXNmc19ob3N0X2RyaXZlcigpOwotCWlmICghaG9zdF9kcml2ZXItPnN5c2ZzX2RyaXZlcikKLQkJZ290byBlcnJfZGVzdHJveV9lZGV2X2xpc3Q7CisJaG9zdF9kcml2ZXItPm5kZXZzID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7CiAKIAlyYyA9IHJlZnJlc2hfZXhwb3J0ZWRfZGV2aWNlcygpOwogCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyX2Nsb3NlX3N5c2ZzX2RyaXZlcjsKKwkJZ290byBlcnJfZnJlZV9ob3N0X2RyaXZlcjsKIAogCXJldHVybiAwOwogCi1lcnJfY2xvc2Vfc3lzZnNfZHJpdmVyOgotCXN5c2ZzX2Nsb3NlX2RyaXZlcihob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyKTsKLWVycl9kZXN0cm95X2VkZXZfbGlzdDoKLQlkbGlzdF9kZXN0cm95KGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOwogZXJyX2ZyZWVfaG9zdF9kcml2ZXI6CiAJZnJlZShob3N0X2RyaXZlcik7CiAJaG9zdF9kcml2ZXIgPSBOVUxMOwogCisJdWRldl91bnJlZih1ZGV2X2NvbnRleHQpOworCiAJcmV0dXJuIC0xOwogfQogCkBAIC0zMDAsMzAgKzE5MywyMiBAQAogCWlmICghaG9zdF9kcml2ZXIpCiAJCXJldHVybjsKIAotCWlmIChob3N0X2RyaXZlci0+ZWRldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOwotCWlmIChob3N0X2RyaXZlci0+c3lzZnNfZHJpdmVyKQotCQlzeXNmc19jbG9zZV9kcml2ZXIoaG9zdF9kcml2ZXItPnN5c2ZzX2RyaXZlcik7CisJdXNiaXBfZXhwb3J0ZWRfZGV2aWNlX2Rlc3Ryb3koKTsKIAogCWZyZWUoaG9zdF9kcml2ZXIpOwogCWhvc3RfZHJpdmVyID0gTlVMTDsKKworCXVkZXZfdW5yZWYodWRldl9jb250ZXh0KTsKIH0KIAogaW50IHVzYmlwX2hvc3RfcmVmcmVzaF9kZXZpY2VfbGlzdCh2b2lkKQogewogCWludCByYzsKIAotCWlmIChob3N0X2RyaXZlci0+ZWRldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpOworCXVzYmlwX2V4cG9ydGVkX2RldmljZV9kZXN0cm95KCk7CiAKIAlob3N0X2RyaXZlci0+bmRldnMgPSAwOwotCWhvc3RfZHJpdmVyLT5lZGV2X2xpc3QgPQotCQlkbGlzdF9uZXdfd2l0aF9kZWxldGUoc2l6ZW9mKHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpLAotCQkJCSAgICAgIHVzYmlwX2V4cG9ydGVkX2RldmljZV9kZWxldGUpOwotCWlmICghaG9zdF9kcml2ZXItPmVkZXZfbGlzdCkgewotCQlkYmcoImRsaXN0X25ld193aXRoX2RlbGV0ZSBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlJTklUX0xJU1RfSEVBRCgmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCk7CiAKIAlyYyA9IHJlZnJlc2hfZXhwb3J0ZWRfZGV2aWNlcygpOwogCWlmIChyYyA8IDApCkBAIC0zMzUsOCArMjIwLDcgQEAKIGludCB1c2JpcF9ob3N0X2V4cG9ydF9kZXZpY2Uoc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldiwgaW50IHNvY2tmZCkKIHsKIAljaGFyIGF0dHJfbmFtZVtdID0gInVzYmlwX3NvY2tmZCI7Ci0JY2hhciBhdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmF0dHI7CisJY2hhciBzb2NrZmRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKIAljaGFyIHNvY2tmZF9idWZmWzMwXTsKIAlpbnQgcmV0OwogCkBAIC0zNTYsNDEgKzI0MCwzMiBAQAogCX0KIAogCS8qIG9ubHkgdGhlIGZpcnN0IGludGVyZmFjZSBpcyB0cnVlICovCi0Jc25wcmludGYoYXR0cl9wYXRoLCBzaXplb2YoYXR0cl9wYXRoKSwgIiVzLyVzOiVkLiVkLyVzIiwKLQkJIGVkZXYtPnVkZXYucGF0aCwgZWRldi0+dWRldi5idXNpZCwKLQkJIGVkZXYtPnVkZXYuYkNvbmZpZ3VyYXRpb25WYWx1ZSwgMCwgYXR0cl9uYW1lKTsKLQotCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShhdHRyX3BhdGgpOwotCWlmICghYXR0cikgewotCQlkYmcoInN5c2ZzX29wZW5fYXR0cmlidXRlIGZhaWxlZDogJXMiLCBhdHRyX3BhdGgpOwotCQlyZXR1cm4gLTE7Ci0JfQorCXNucHJpbnRmKHNvY2tmZF9hdHRyX3BhdGgsIHNpemVvZihzb2NrZmRfYXR0cl9wYXRoKSwgIiVzLyVzIiwKKwkJIGVkZXYtPnVkZXYucGF0aCwgYXR0cl9uYW1lKTsKIAogCXNucHJpbnRmKHNvY2tmZF9idWZmLCBzaXplb2Yoc29ja2ZkX2J1ZmYpLCAiJWRcbiIsIHNvY2tmZCk7Ci0JZGJnKCJ3cml0ZTogJXMiLCBzb2NrZmRfYnVmZik7CiAKLQlyZXQgPSBzeXNmc193cml0ZV9hdHRyaWJ1dGUoYXR0ciwgc29ja2ZkX2J1ZmYsIHN0cmxlbihzb2NrZmRfYnVmZikpOworCXJldCA9IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShzb2NrZmRfYXR0cl9wYXRoLCBzb2NrZmRfYnVmZiwKKwkJCQkgICAgc3RybGVuKHNvY2tmZF9idWZmKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc193cml0ZV9hdHRyaWJ1dGUgZmFpbGVkOiBzb2NrZmQgJXMgdG8gJXMiLAotCQkgICAgc29ja2ZkX2J1ZmYsIGF0dHJfcGF0aCk7Ci0JCWdvdG8gZXJyX3dyaXRlX3NvY2tmZDsKKwkJZXJyKCJ3cml0ZV9zeXNmc19hdHRyaWJ1dGUgZmFpbGVkOiBzb2NrZmQgJXMgdG8gJXMiLAorCQkgICAgc29ja2ZkX2J1ZmYsIHNvY2tmZF9hdHRyX3BhdGgpOworCQlyZXR1cm4gcmV0OwogCX0KIAotCWRiZygiY29ubmVjdDogJXMiLCBlZGV2LT51ZGV2LmJ1c2lkKTsKLQotZXJyX3dyaXRlX3NvY2tmZDoKLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CisJaW5mbygiY29ubmVjdDogJXMiLCBlZGV2LT51ZGV2LmJ1c2lkKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgKnVzYmlwX2hvc3RfZ2V0X2RldmljZShpbnQgbnVtKQogeworCXN0cnVjdCBsaXN0X2hlYWQgKmk7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldjsKLQlzdHJ1Y3QgZGxpc3QgKmRsaXN0ID0gaG9zdF9kcml2ZXItPmVkZXZfbGlzdDsKIAlpbnQgY250ID0gMDsKIAotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoZGxpc3QsIGVkZXYsIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpIHsKKwlsaXN0X2Zvcl9lYWNoKGksICZob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7CisJCWVkZXYgPSBsaXN0X2VudHJ5KGksIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UsIG5vZGUpOwogCQlpZiAobnVtID09IGNudCkKIAkJCXJldHVybiBlZGV2OwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdXNiaXBfaG9zdF9kcml2ZXIuaAppbmRleCAzNGZkMTRjLi4yYTMxZjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy91c2JpcF9ob3N0X2RyaXZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3VzYmlwX2hvc3RfZHJpdmVyLmgKQEAgLTIxLDE4ICsyMSwxOSBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCisjaW5jbHVkZSAibGlzdC5oIgogCiBzdHJ1Y3QgdXNiaXBfaG9zdF9kcml2ZXIgewogCWludCBuZGV2czsKLQlzdHJ1Y3Qgc3lzZnNfZHJpdmVyICpzeXNmc19kcml2ZXI7CiAJLyogbGlzdCBvZiBleHBvcnRlZCBkZXZpY2UgKi8KLQlzdHJ1Y3QgZGxpc3QgKmVkZXZfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVkZXZfbGlzdDsKIH07CiAKIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UgewotCXN0cnVjdCBzeXNmc19kZXZpY2UgKnN1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqc3VkZXY7CiAJaW50MzJfdCBzdGF0dXM7CiAJc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgdWRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJc3RydWN0IHVzYmlwX3VzYl9pbnRlcmZhY2UgdWluZltdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmMKaW5kZXggMjA5ZGY5Yi4uODkwMWZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5jCkBAIC02LDQ0ICs2LDI4IEBACiAjaW5jbHVkZSAidmhjaV9kcml2ZXIuaCIKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPGxpYnVkZXYuaD4KKyNpbmNsdWRlICJzeXNmc191dGlscy5oIgogCiAjdW5kZWYgIFBST0dOQU1FCiAjZGVmaW5lIFBST0dOQU1FICJsaWJ1c2JpcCIKIAogc3RydWN0IHVzYmlwX3ZoY2lfZHJpdmVyICp2aGNpX2RyaXZlcjsKK3N0cnVjdCB1ZGV2ICp1ZGV2X2NvbnRleHQ7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiaXBfaW1wb3J0ZWRfZGV2aWNlICoKIGltcG9ydGVkX2RldmljZV9pbml0KHN0cnVjdCB1c2JpcF9pbXBvcnRlZF9kZXZpY2UgKmlkZXYsIGNoYXIgKmJ1c2lkKQogewotCXN0cnVjdCBzeXNmc19kZXZpY2UgKnN1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqc3VkZXY7CiAKLQlzdWRldiA9IHN5c2ZzX29wZW5fZGV2aWNlKCJ1c2IiLCBidXNpZCk7CisJc3VkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2X2NvbnRleHQsCisJCQkJCQkgICAgICAgInVzYiIsIGJ1c2lkKTsKIAlpZiAoIXN1ZGV2KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UgZmFpbGVkOiAlcyIsIGJ1c2lkKTsKKwkJZGJnKCJ1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSBmYWlsZWQ6ICVzIiwgYnVzaWQpOwogCQlnb3RvIGVycjsKIAl9CiAJcmVhZF91c2JfZGV2aWNlKHN1ZGV2LCAmaWRldi0+dWRldik7Ci0Jc3lzZnNfY2xvc2VfZGV2aWNlKHN1ZGV2KTsKLQotCS8qIGFkZCBjbGFzcyBkZXZpY2VzIG9mIHRoaXMgaW1wb3J0ZWQgZGV2aWNlICovCi0Jc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSAqY2RldjsKLQlkbGlzdF9mb3JfZWFjaF9kYXRhKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QsIGNkZXYsCi0JCQkgICAgc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSkgewotCQlpZiAoIXN0cm5jbXAoY2Rldi0+ZGV2X3BhdGgsIGlkZXYtPnVkZXYucGF0aCwKLQkJCSAgICAgc3RybGVuKGlkZXYtPnVkZXYucGF0aCkpKSB7Ci0JCQlzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlICpuZXdfY2RldjsKLQkJCS8qCi0JCQkgKiBhbGxvYyBhbmQgY29weSBiZWNhdXNlIGRsaXN0IGlzIGxpbmtlZAotCQkJICogZnJvbSBvbmx5IG9uZSBsaXN0Ci0JCQkgKi8KLQkJCW5ld19jZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqbmV3X2NkZXYpKTsKLQkJCWlmICghbmV3X2NkZXYpCi0JCQkJZ290byBlcnI7Ci0KLQkJCW1lbWNweShuZXdfY2RldiwgY2Rldiwgc2l6ZW9mKCpuZXdfY2RldikpOwotCQkJZGxpc3RfdW5zaGlmdChpZGV2LT5jZGV2X2xpc3QsICh2b2lkICopIG5ld19jZGV2KTsKLQkJfQotCX0KKwl1ZGV2X2RldmljZV91bnJlZihzdWRldik7CiAKIAlyZXR1cm4gaWRldjsKIApAQCAtNTMsNyArMzcsNyBAQAogCiAKIAotc3RhdGljIGludCBwYXJzZV9zdGF0dXMoY2hhciAqdmFsdWUpCitzdGF0aWMgaW50IHBhcnNlX3N0YXR1cyhjb25zdCBjaGFyICp2YWx1ZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAljaGFyICpjOwpAQCAtMTAwLDEyICs4NCw2IEBACiAJCQlpZGV2LT5idXNudW0JPSAoZGV2aWQgPj4gMTYpOwogCQkJaWRldi0+ZGV2bnVtCT0gKGRldmlkICYgMHgwMDAwZmZmZik7CiAKLQkJCWlkZXYtPmNkZXZfbGlzdCA9IGRsaXN0X25ldyhzaXplb2Yoc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSkpOwotCQkJaWYgKCFpZGV2LT5jZGV2X2xpc3QpIHsKLQkJCQlkYmcoImRsaXN0X25ldyBmYWlsZWQiKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KIAkJCWlmIChpZGV2LT5zdGF0dXMgIT0gVkRFVl9TVF9OVUxMCiAJCQkgICAgJiYgaWRldi0+c3RhdHVzICE9IFZERVZfU1RfTk9UQVNTSUdORUQpIHsKIAkJCQlpZGV2ID0gaW1wb3J0ZWRfZGV2aWNlX2luaXQoaWRldiwgbGJ1c2lkKTsKQEAgLTEyOSwxNTYgKzEwNywzNSBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgY2hlY2tfdXNiaXBfZGV2aWNlKHN0cnVjdCBzeXNmc19jbGFzc19kZXZpY2UgKmNkZXYpCi17Ci0JLyogL3N5cy9jbGFzcy92aWRlbzRsaW51eC92aWRlbzAvZGV2aWNlICovCi0JY2hhciBjbGFzc19wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQkvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmhjaV9oY2QvdXNiNi82LTE6MS4xICovCi0JY2hhciBkZXZfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0JaW50IHJldDsKLQlzdHJ1Y3QgdXNiaXBfY2xhc3NfZGV2aWNlICp1c2JpcF9jZGV2OwotCi0Jc25wcmludGYoY2xhc3NfcGF0aCwgc2l6ZW9mKGNsYXNzX3BhdGgpLCAiJXMvZGV2aWNlIiwgY2Rldi0+cGF0aCk7Ci0KLQlyZXQgPSBzeXNmc19nZXRfbGluayhjbGFzc19wYXRoLCBkZXZfcGF0aCwgc2l6ZW9mKGRldl9wYXRoKSk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWlmICghc3RybmNtcChkZXZfcGF0aCwgdmhjaV9kcml2ZXItPmhjX2RldmljZS0+cGF0aCwKLQkJCSAgICAgc3RybGVuKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UtPnBhdGgpKSkgewotCQkJLyogZm91bmQgdXNiaXAgZGV2aWNlICovCi0JCQl1c2JpcF9jZGV2ID0gY2FsbG9jKDEsIHNpemVvZigqdXNiaXBfY2RldikpOwotCQkJaWYgKCF1c2JpcF9jZGV2KSB7Ci0JCQkJZGJnKCJjYWxsb2MgZmFpbGVkIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZGxpc3RfdW5zaGlmdCh2aGNpX2RyaXZlci0+Y2Rldl9saXN0LCB1c2JpcF9jZGV2KTsKLQkJCXN0cm5jcHkodXNiaXBfY2Rldi0+Y2xhc3NfcGF0aCwgY2xhc3NfcGF0aCwKLQkJCQlzaXplb2YodXNiaXBfY2Rldi0+Y2xhc3NfcGF0aCkpOwotCQkJc3RybmNweSh1c2JpcF9jZGV2LT5kZXZfcGF0aCwgZGV2X3BhdGgsCi0JCQkJc2l6ZW9mKHVzYmlwX2NkZXYtPmRldl9wYXRoKSk7Ci0JCQlkYmcoImZvdW5kOiAlcyAlcyIsIGNsYXNzX3BhdGgsIGRldl9wYXRoKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgc2VhcmNoX2NsYXNzX2Zvcl91c2JpcF9kZXZpY2UoY2hhciAqY25hbWUpCi17Ci0Jc3RydWN0IHN5c2ZzX2NsYXNzICpjbGFzczsKLQlzdHJ1Y3QgZGxpc3QgKmNkZXZfbGlzdDsKLQlzdHJ1Y3Qgc3lzZnNfY2xhc3NfZGV2aWNlICpjZGV2OwotCWludCByZXQgPSAwOwotCi0JY2xhc3MgPSBzeXNmc19vcGVuX2NsYXNzKGNuYW1lKTsKLQlpZiAoIWNsYXNzKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9jbGFzcyBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWRiZygiY2xhc3M6ICVzIiwgY2xhc3MtPm5hbWUpOwotCi0JY2Rldl9saXN0ID0gc3lzZnNfZ2V0X2NsYXNzX2RldmljZXMoY2xhc3MpOwotCWlmICghY2Rldl9saXN0KQotCQkvKiBub3RoaW5nICovCi0JCWdvdG8gb3V0OwotCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShjZGV2X2xpc3QsIGNkZXYsIHN0cnVjdCBzeXNmc19jbGFzc19kZXZpY2UpIHsKLQkJZGJnKCJjZGV2OiAlcyIsIGNkZXYtPm5hbWUpOwotCQlyZXQgPSBjaGVja191c2JpcF9kZXZpY2UoY2Rldik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi1vdXQ6Ci0Jc3lzZnNfY2xvc2VfY2xhc3MoY2xhc3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IHJlZnJlc2hfY2xhc3NfZGV2aWNlX2xpc3Qodm9pZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBkbGlzdCAqY25hbWVfbGlzdDsKLQljaGFyICpjbmFtZTsKLQljaGFyIHN5c2ZzX21udHBhdGhbU1lTRlNfUEFUSF9NQVhdOwotCWNoYXIgY2xhc3NfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0KLQlyZXQgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygic3lzZnNfZ2V0X21udF9wYXRoIGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc25wcmludGYoY2xhc3NfcGF0aCwgc2l6ZW9mKGNsYXNzX3BhdGgpLCAiJXMvJXMiLCBzeXNmc19tbnRwYXRoLAotCQkgU1lTRlNfQ0xBU1NfTkFNRSk7Ci0KLQkvKiBzZWFyY2ggdW5kZXIgL3N5cy9jbGFzcyAqLwotCWNuYW1lX2xpc3QgPSBzeXNmc19vcGVuX2RpcmVjdG9yeV9saXN0KGNsYXNzX3BhdGgpOwotCWlmICghY25hbWVfbGlzdCkgewotCQlkYmcoInN5c2ZzX29wZW5fZGlyZWN0b3J5IGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShjbmFtZV9saXN0LCBjbmFtZSwgY2hhcikgewotCQlyZXQgPSBzZWFyY2hfY2xhc3NfZm9yX3VzYmlwX2RldmljZShjbmFtZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlzeXNmc19jbG9zZV9saXN0KGNuYW1lX2xpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0Jc3lzZnNfY2xvc2VfbGlzdChjbmFtZV9saXN0KTsKLQotCS8qIHNlYXJjaCB1bmRlciAvc3lzL2Jsb2NrICovCi0JcmV0ID0gc2VhcmNoX2NsYXNzX2Zvcl91c2JpcF9kZXZpY2UoU1lTRlNfQkxPQ0tfTkFNRSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyBpbnQgcmVmcmVzaF9pbXBvcnRlZF9kZXZpY2VfbGlzdCh2b2lkKQogewotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmF0dHJfc3RhdHVzOworCWNvbnN0IGNoYXIgKmF0dHJfc3RhdHVzOwogCi0KLQlhdHRyX3N0YXR1cyA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cih2aGNpX2RyaXZlci0+aGNfZGV2aWNlLCAic3RhdHVzIik7CisJYXR0cl9zdGF0dXMgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSh2aGNpX2RyaXZlci0+aGNfZGV2aWNlLAorCQkJCQkgICAgICAgInN0YXR1cyIpOwogCWlmICghYXR0cl9zdGF0dXMpIHsKLQkJZGJnKCJzeXNmc19nZXRfZGV2aWNlX2F0dHIoXCJzdGF0dXNcIikgZmFpbGVkOiAlcyIsCi0JCSAgICB2aGNpX2RyaXZlci0+aGNfZGV2aWNlLT5uYW1lKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRiZygibmFtZTogJXMgIHBhdGg6ICVzICBsZW46ICVkICBtZXRob2Q6ICVkICB2YWx1ZTogJXMiLAotCSAgICBhdHRyX3N0YXR1cy0+bmFtZSwgYXR0cl9zdGF0dXMtPnBhdGgsIGF0dHJfc3RhdHVzLT5sZW4sCi0JICAgIGF0dHJfc3RhdHVzLT5tZXRob2QsIGF0dHJfc3RhdHVzLT52YWx1ZSk7Ci0KLQlyZXR1cm4gcGFyc2Vfc3RhdHVzKGF0dHJfc3RhdHVzLT52YWx1ZSk7CisJcmV0dXJuIHBhcnNlX3N0YXR1cyhhdHRyX3N0YXR1cyk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X25wb3J0cyh2b2lkKQogewogCWNoYXIgKmM7CiAJaW50IG5wb3J0cyA9IDA7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cl9zdGF0dXM7CisJY29uc3QgY2hhciAqYXR0cl9zdGF0dXM7CiAKLQlhdHRyX3N0YXR1cyA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cih2aGNpX2RyaXZlci0+aGNfZGV2aWNlLCAic3RhdHVzIik7CisJYXR0cl9zdGF0dXMgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSh2aGNpX2RyaXZlci0+aGNfZGV2aWNlLAorCQkJCQkgICAgICAgInN0YXR1cyIpOwogCWlmICghYXR0cl9zdGF0dXMpIHsKLQkJZGJnKCJzeXNmc19nZXRfZGV2aWNlX2F0dHIoXCJzdGF0dXNcIikgZmFpbGVkOiAlcyIsCi0JCSAgICB2aGNpX2RyaXZlci0+aGNfZGV2aWNlLT5uYW1lKTsKKwkJZXJyKCJ1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZSBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRiZygibmFtZTogJXMgIHBhdGg6ICVzICBsZW46ICVkICBtZXRob2Q6ICVkICB2YWx1ZTogJXMiLAotCSAgICBhdHRyX3N0YXR1cy0+bmFtZSwgYXR0cl9zdGF0dXMtPnBhdGgsIGF0dHJfc3RhdHVzLT5sZW4sCi0JICAgIGF0dHJfc3RhdHVzLT5tZXRob2QsIGF0dHJfc3RhdHVzLT52YWx1ZSk7Ci0KIAkvKiBza2lwIGEgaGVhZGVyIGxpbmUgKi8KLQljID0gc3RyY2hyKGF0dHJfc3RhdHVzLT52YWx1ZSwgJ1xuJyk7CisJYyA9IHN0cmNocihhdHRyX3N0YXR1cywgJ1xuJyk7CiAJaWYgKCFjKQogCQlyZXR1cm4gMDsKIAljKys7CkBAIC0yOTUsNzEgKzE1Miw2NiBAQAogCXJldHVybiBucG9ydHM7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2hjX2J1c2lkKGNoYXIgKnN5c2ZzX21udHBhdGgsIGNoYXIgKmhjX2J1c2lkKQorLyoKKyAqIFJlYWQgdGhlIGdpdmVuIHBvcnQncyByZWNvcmQuCisgKgorICogVG8gYXZvaWQgYnVmZmVyIG92ZXJmbG93IHdlIHdpbGwgcmVhZCB0aGUgZW50aXJlIGxpbmUgYW5kCisgKiB2YWxpZGF0ZSBlYWNoIHBhcnQncyBzaXplLiBUaGUgaW5pdGlhbCBidWZmZXIgaXMgcGFkZGVkIGJ5IDQgdG8KKyAqIGFjY29tbW9kYXRlIHRoZSAyIHNwYWNlcywgMSBuZXdsaW5lIGFuZCBhbiBhZGRpdGlvbmFsIGNoYXJhY3RlcgorICogd2hpY2ggaXMgbmVlZGVkIHRvIHByb3Blcmx5IHZhbGlkYXRlIHRoZSAzcmQgcGFydCB3aXRob3V0IGl0IGJlaW5nCisgKiB0cnVuY2F0ZWQgdG8gYW4gYWNjZXB0YWJsZSBsZW5ndGguCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9yZWNvcmQoaW50IHJocG9ydCwgY2hhciAqaG9zdCwgdW5zaWduZWQgbG9uZyBob3N0X2xlbiwKKwkJY2hhciAqcG9ydCwgdW5zaWduZWQgbG9uZyBwb3J0X2xlbiwgY2hhciAqYnVzaWQpCiB7Ci0Jc3RydWN0IHN5c2ZzX2RyaXZlciAqc2RyaXZlcjsKLQljaGFyIHNkcml2ZXJfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0KLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpoY19kZXY7Ci0Jc3RydWN0IGRsaXN0ICpoY19kZXZzOwotCi0JaW50IGZvdW5kID0gMDsKLQotCXNucHJpbnRmKHNkcml2ZXJfcGF0aCwgU1lTRlNfUEFUSF9NQVgsICIlcy8lcy8lcy8lcy8lcyIsIHN5c2ZzX21udHBhdGgsCi0JU1lTRlNfQlVTX05BTUUsIFVTQklQX1ZIQ0lfQlVTX1RZUEUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwKLQlVU0JJUF9WSENJX0RSVl9OQU1FKTsKLQotCXNkcml2ZXIgPSBzeXNmc19vcGVuX2RyaXZlcl9wYXRoKHNkcml2ZXJfcGF0aCk7Ci0JaWYgKCFzZHJpdmVyKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kcml2ZXJfcGF0aCBmYWlsZWQ6ICVzIiwgc2RyaXZlcl9wYXRoKTsKLQkJZGJnKCJtYWtlIHN1cmUgIiBVU0JJUF9DT1JFX01PRF9OQU1FICIua28gYW5kICIKLQkJICAgIFVTQklQX1ZIQ0lfRFJWX05BTUUgIi5rbyBhcmUgbG9hZGVkISIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaGNfZGV2cyA9IHN5c2ZzX2dldF9kcml2ZXJfZGV2aWNlcyhzZHJpdmVyKTsKLQlpZiAoIWhjX2RldnMpIHsKLQkJZGJnKCJzeXNmc19nZXRfZHJpdmVyIGZhaWxlZCIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBhc3N1bWUgb25seSBvbmUgdmhjaV9oY2QgKi8KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGhjX2RldnMsIGhjX2Rldiwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQlzdHJuY3B5KGhjX2J1c2lkLCBoY19kZXYtPmJ1c19pZCwgU1lTRlNfQlVTX0lEX1NJWkUpOwotCQlmb3VuZCA9IDE7Ci0JfQotCi1lcnI6Ci0Jc3lzZnNfY2xvc2VfZHJpdmVyKHNkcml2ZXIpOwotCi0JaWYgKGZvdW5kKQotCQlyZXR1cm4gMDsKLQotCWRiZygiJXMgbm90IGZvdW5kIiwgaGNfYnVzaWQpOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCByZWFkX3JlY29yZChpbnQgcmhwb3J0LCBjaGFyICpob3N0LCBjaGFyICpwb3J0LCBjaGFyICpidXNpZCkKLXsKKwlpbnQgcGFydDsKIAlGSUxFICpmaWxlOwogCWNoYXIgcGF0aFtQQVRIX01BWCsxXTsKKwljaGFyICpidWZmZXIsICpzdGFydCwgKmVuZDsKKwljaGFyIGRlbGltW10gPSB7JyAnLCAnICcsICdcbid9OworCWludCBtYXhfbGVuW10gPSB7KGludClob3N0X2xlbiwgKGludClwb3J0X2xlbiwgU1lTRlNfQlVTX0lEX1NJWkV9OworCXNpemVfdCBidWZmZXJfbGVuID0gaG9zdF9sZW4gKyBwb3J0X2xlbiArIFNZU0ZTX0JVU19JRF9TSVpFICsgNDsKKworCWJ1ZmZlciA9IG1hbGxvYyhidWZmZXJfbGVuKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC0xOwogCiAJc25wcmludGYocGF0aCwgUEFUSF9NQVgsIFZIQ0lfU1RBVEVfUEFUSCIvcG9ydCVkIiwgcmhwb3J0KTsKIAogCWZpbGUgPSBmb3BlbihwYXRoLCAiciIpOwogCWlmICghZmlsZSkgewogCQllcnIoImZvcGVuIik7CisJCWZyZWUoYnVmZmVyKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChmc2NhbmYoZmlsZSwgIiVzICVzICVzXG4iLCBob3N0LCBwb3J0LCBidXNpZCkgIT0gMykgewotCQllcnIoImZzY2FuZiIpOworCWlmIChmZ2V0cyhidWZmZXIsIGJ1ZmZlcl9sZW4sIGZpbGUpID09IE5VTEwpIHsKKwkJZXJyKCJmZ2V0cyIpOworCQlmcmVlKGJ1ZmZlcik7CiAJCWZjbG9zZShmaWxlKTsKIAkJcmV0dXJuIC0xOwogCX0KLQogCWZjbG9zZShmaWxlKTsKIAorCS8qIHZhbGlkYXRlIHRoZSBsZW5ndGggb2YgZWFjaCBvZiB0aGUgMyBwYXJ0cyAqLworCXN0YXJ0ID0gYnVmZmVyOworCWZvciAocGFydCA9IDA7IHBhcnQgPCAzOyBwYXJ0KyspIHsKKwkJZW5kID0gc3RyY2hyKHN0YXJ0LCBkZWxpbVtwYXJ0XSk7CisJCWlmIChlbmQgPT0gTlVMTCB8fCAoZW5kIC0gc3RhcnQpID4gbWF4X2xlbltwYXJ0XSkgeworCQkJZnJlZShidWZmZXIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0YXJ0ID0gZW5kICsgMTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZmZlciwgIiVzICVzICVzXG4iLCBob3N0LCBwb3J0LCBidXNpZCkgIT0gMykgeworCQllcnIoInNzY2FuZiIpOworCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmcmVlKGJ1ZmZlcik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY3LDMwICsyMTksMjEgQEAKIAogaW50IHVzYmlwX3ZoY2lfZHJpdmVyX29wZW4odm9pZCkKIHsKLQlpbnQgcmV0OwotCWNoYXIgaGNfYnVzaWRbU1lTRlNfQlVTX0lEX1NJWkVdOwotCi0JdmhjaV9kcml2ZXIgPSAoc3RydWN0IHVzYmlwX3ZoY2lfZHJpdmVyICopIGNhbGxvYygxLCBzaXplb2YoKnZoY2lfZHJpdmVyKSk7Ci0JaWYgKCF2aGNpX2RyaXZlcikgewotCQlkYmcoImNhbGxvYyBmYWlsZWQiKTsKKwl1ZGV2X2NvbnRleHQgPSB1ZGV2X25ldygpOworCWlmICghdWRldl9jb250ZXh0KSB7CisJCWVycigidWRldl9uZXcgZmFpbGVkIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXQgPSBzeXNmc19nZXRfbW50X3BhdGgodmhjaV9kcml2ZXItPnN5c2ZzX21udHBhdGgsIFNZU0ZTX1BBVEhfTUFYKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoInN5c2ZzX2dldF9tbnRfcGF0aCBmYWlsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gZ2V0X2hjX2J1c2lkKHZoY2lfZHJpdmVyLT5zeXNmc19tbnRwYXRoLCBoY19idXNpZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOworCXZoY2lfZHJpdmVyID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdXNiaXBfdmhjaV9kcml2ZXIpKTsKIAogCS8qIHdpbGwgYmUgZnJlZWQgaW4gdXNiaXBfZHJpdmVyX2Nsb3NlKCkgKi8KLQl2aGNpX2RyaXZlci0+aGNfZGV2aWNlID0gc3lzZnNfb3Blbl9kZXZpY2UoVVNCSVBfVkhDSV9CVVNfVFlQRSwKLQkJCQkJCSAgIGhjX2J1c2lkKTsKKwl2aGNpX2RyaXZlci0+aGNfZGV2aWNlID0KKwkJdWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUodWRldl9jb250ZXh0LAorCQkJCQkJICAgICAgIFVTQklQX1ZIQ0lfQlVTX1RZUEUsCisJCQkJCQkgICAgICAgVVNCSVBfVkhDSV9EUlZfTkFNRSk7CiAJaWYgKCF2aGNpX2RyaXZlci0+aGNfZGV2aWNlKSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UgZmFpbGVkIik7CisJCWVycigidWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUgZmFpbGVkIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMzk4LDI5ICsyNDEsMjEgQEAKIAogCWRiZygiYXZhaWxhYmxlIHBvcnRzOiAlZCIsIHZoY2lfZHJpdmVyLT5ucG9ydHMpOwogCi0JdmhjaV9kcml2ZXItPmNkZXZfbGlzdCA9IGRsaXN0X25ldyhzaXplb2Yoc3RydWN0IHVzYmlwX2NsYXNzX2RldmljZSkpOwotCWlmICghdmhjaV9kcml2ZXItPmNkZXZfbGlzdCkKLQkJZ290byBlcnI7Ci0KLQlpZiAocmVmcmVzaF9jbGFzc19kZXZpY2VfbGlzdCgpKQotCQlnb3RvIGVycjsKLQogCWlmIChyZWZyZXNoX2ltcG9ydGVkX2RldmljZV9saXN0KCkpCiAJCWdvdG8gZXJyOwogCi0KIAlyZXR1cm4gMDsKIAotCiBlcnI6Ci0JaWYgKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmNkZXZfbGlzdCk7Ci0JaWYgKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UpCi0JCXN5c2ZzX2Nsb3NlX2RldmljZSh2aGNpX2RyaXZlci0+aGNfZGV2aWNlKTsKKwl1ZGV2X2RldmljZV91bnJlZih2aGNpX2RyaXZlci0+aGNfZGV2aWNlKTsKKwogCWlmICh2aGNpX2RyaXZlcikKIAkJZnJlZSh2aGNpX2RyaXZlcik7CiAKIAl2aGNpX2RyaXZlciA9IE5VTEw7CisKKwl1ZGV2X3VucmVmKHVkZXZfY29udGV4dCk7CisKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTQzMCw1MyArMjY1LDI0IEBACiAJaWYgKCF2aGNpX2RyaXZlcikKIAkJcmV0dXJuOwogCi0JaWYgKHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmNkZXZfbGlzdCk7CisJdWRldl9kZXZpY2VfdW5yZWYodmhjaV9kcml2ZXItPmhjX2RldmljZSk7CiAKLQlmb3IgKGludCBpID0gMDsgaSA8IHZoY2lfZHJpdmVyLT5ucG9ydHM7IGkrKykgewotCQlpZiAodmhjaV9kcml2ZXItPmlkZXZbaV0uY2Rldl9saXN0KQotCQkJZGxpc3RfZGVzdHJveSh2aGNpX2RyaXZlci0+aWRldltpXS5jZGV2X2xpc3QpOwotCX0KLQotCWlmICh2aGNpX2RyaXZlci0+aGNfZGV2aWNlKQotCQlzeXNmc19jbG9zZV9kZXZpY2UodmhjaV9kcml2ZXItPmhjX2RldmljZSk7CiAJZnJlZSh2aGNpX2RyaXZlcik7CiAKIAl2aGNpX2RyaXZlciA9IE5VTEw7CisKKwl1ZGV2X3VucmVmKHVkZXZfY29udGV4dCk7CiB9CiAKIAogaW50IHVzYmlwX3ZoY2lfcmVmcmVzaF9kZXZpY2VfbGlzdCh2b2lkKQogewotCWlmICh2aGNpX2RyaXZlci0+Y2Rldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpOwotCi0KLQlmb3IgKGludCBpID0gMDsgaSA8IHZoY2lfZHJpdmVyLT5ucG9ydHM7IGkrKykgewotCQlpZiAodmhjaV9kcml2ZXItPmlkZXZbaV0uY2Rldl9saXN0KQotCQkJZGxpc3RfZGVzdHJveSh2aGNpX2RyaXZlci0+aWRldltpXS5jZGV2X2xpc3QpOwotCX0KLQotCXZoY2lfZHJpdmVyLT5jZGV2X2xpc3QgPSBkbGlzdF9uZXcoc2l6ZW9mKHN0cnVjdCB1c2JpcF9jbGFzc19kZXZpY2UpKTsKLQlpZiAoIXZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpCi0JCWdvdG8gZXJyOwotCi0JaWYgKHJlZnJlc2hfY2xhc3NfZGV2aWNlX2xpc3QoKSkKLQkJZ290byBlcnI7CiAKIAlpZiAocmVmcmVzaF9pbXBvcnRlZF9kZXZpY2VfbGlzdCgpKQogCQlnb3RvIGVycjsKIAogCXJldHVybiAwOwogZXJyOgotCWlmICh2aGNpX2RyaXZlci0+Y2Rldl9saXN0KQotCQlkbGlzdF9kZXN0cm95KHZoY2lfZHJpdmVyLT5jZGV2X2xpc3QpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB2aGNpX2RyaXZlci0+bnBvcnRzOyBpKyspIHsKLQkJaWYgKHZoY2lfZHJpdmVyLT5pZGV2W2ldLmNkZXZfbGlzdCkKLQkJCWRsaXN0X2Rlc3Ryb3kodmhjaV9kcml2ZXItPmlkZXZbaV0uY2Rldl9saXN0KTsKLQl9Ci0KIAlkYmcoImZhaWxlZCB0byByZWZyZXNoIGRldmljZSBsaXN0Iik7CiAJcmV0dXJuIC0xOwogfQpAQCAtNDk0LDI0ICszMDAsMjQgQEAKIAogaW50IHVzYmlwX3ZoY2lfYXR0YWNoX2RldmljZTIodWludDhfdCBwb3J0LCBpbnQgc29ja2ZkLCB1aW50MzJfdCBkZXZpZCwKIAkJdWludDMyX3Qgc3BlZWQpIHsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyX2F0dGFjaDsKIAljaGFyIGJ1ZmZbMjAwXTsgLyogd2hhdCBzaXplIHNob3VsZCBiZSA/ICovCisJY2hhciBhdHRhY2hfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIGF0dHJfYXR0YWNoW10gPSAiYXR0YWNoIjsKKwljb25zdCBjaGFyICpwYXRoOwogCWludCByZXQ7CiAKLQlhdHRyX2F0dGFjaCA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cih2aGNpX2RyaXZlci0+aGNfZGV2aWNlLCAiYXR0YWNoIik7Ci0JaWYgKCFhdHRyX2F0dGFjaCkgewotCQlkYmcoInN5c2ZzX2dldF9kZXZpY2VfYXR0cihcImF0dGFjaFwiKSBmYWlsZWQ6ICVzIiwKLQkJICAgIHZoY2lfZHJpdmVyLT5oY19kZXZpY2UtPm5hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiJXUgJXUgJXUgJXUiLAorCXNucHJpbnRmKGJ1ZmYsIHNpemVvZihidWZmKSwgIiV1ICVkICV1ICV1IiwKIAkJCXBvcnQsIHNvY2tmZCwgZGV2aWQsIHNwZWVkKTsKIAlkYmcoIndyaXRpbmc6ICVzIiwgYnVmZik7CiAKLQlyZXQgPSBzeXNmc193cml0ZV9hdHRyaWJ1dGUoYXR0cl9hdHRhY2gsIGJ1ZmYsIHN0cmxlbihidWZmKSk7CisJcGF0aCA9IHVkZXZfZGV2aWNlX2dldF9zeXNwYXRoKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UpOworCXNucHJpbnRmKGF0dGFjaF9hdHRyX3BhdGgsIHNpemVvZihhdHRhY2hfYXR0cl9wYXRoKSwgIiVzLyVzIiwKKwkJIHBhdGgsIGF0dHJfYXR0YWNoKTsKKwlkYmcoImF0dGFjaCBhdHRyaWJ1dGUgcGF0aDogJXMiLCBhdHRhY2hfYXR0cl9wYXRoKTsKKworCXJldCA9IHdyaXRlX3N5c2ZzX2F0dHJpYnV0ZShhdHRhY2hfYXR0cl9wYXRoLCBidWZmLCBzdHJsZW4oYnVmZikpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygic3lzZnNfd3JpdGVfYXR0cmlidXRlIGZhaWxlZCIpOworCQlkYmcoIndyaXRlX3N5c2ZzX2F0dHJpYnV0ZSBmYWlsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNTM2LDIzICszNDIsMjMgQEAKIAogaW50IHVzYmlwX3ZoY2lfZGV0YWNoX2RldmljZSh1aW50OF90IHBvcnQpCiB7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAgKmF0dHJfZGV0YWNoOworCWNoYXIgZGV0YWNoX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07CisJY2hhciBhdHRyX2RldGFjaFtdID0gImRldGFjaCI7CiAJY2hhciBidWZmWzIwMF07IC8qIHdoYXQgc2l6ZSBzaG91bGQgYmUgPyAqLworCWNvbnN0IGNoYXIgKnBhdGg7CiAJaW50IHJldDsKIAotCWF0dHJfZGV0YWNoID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKHZoY2lfZHJpdmVyLT5oY19kZXZpY2UsICJkZXRhY2giKTsKLQlpZiAoIWF0dHJfZGV0YWNoKSB7Ci0JCWRiZygic3lzZnNfZ2V0X2RldmljZV9hdHRyKFwiZGV0YWNoXCIpIGZhaWxlZDogJXMiLAotCQkgICAgdmhjaV9kcml2ZXItPmhjX2RldmljZS0+bmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KIAlzbnByaW50ZihidWZmLCBzaXplb2YoYnVmZiksICIldSIsIHBvcnQpOwogCWRiZygid3JpdGluZzogJXMiLCBidWZmKTsKIAotCXJldCA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShhdHRyX2RldGFjaCwgYnVmZiwgc3RybGVuKGJ1ZmYpKTsKKwlwYXRoID0gdWRldl9kZXZpY2VfZ2V0X3N5c3BhdGgodmhjaV9kcml2ZXItPmhjX2RldmljZSk7CisJc25wcmludGYoZGV0YWNoX2F0dHJfcGF0aCwgc2l6ZW9mKGRldGFjaF9hdHRyX3BhdGgpLCAiJXMvJXMiLAorCQkgcGF0aCwgYXR0cl9kZXRhY2gpOworCWRiZygiZGV0YWNoIGF0dHJpYnV0ZSBwYXRoOiAlcyIsIGRldGFjaF9hdHRyX3BhdGgpOworCisJcmV0ID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKGRldGFjaF9hdHRyX3BhdGgsIGJ1ZmYsIHN0cmxlbihidWZmKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzeXNmc193cml0ZV9hdHRyaWJ1dGUgZmFpbGVkIik7CisJCWRiZygid3JpdGVfc3lzZnNfYXR0cmlidXRlIGZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC01NzMsNyArMzc5LDggQEAKIAlpZiAoaWRldi0+c3RhdHVzID09IFZERVZfU1RfTlVMTCB8fCBpZGV2LT5zdGF0dXMgPT0gVkRFVl9TVF9OT1RBU1NJR05FRCkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSByZWFkX3JlY29yZChpZGV2LT5wb3J0LCBob3N0LCBzZXJ2LCByZW1vdGVfYnVzaWQpOworCXJldCA9IHJlYWRfcmVjb3JkKGlkZXYtPnBvcnQsIGhvc3QsIHNpemVvZihob3N0KSwgc2Vydiwgc2l6ZW9mKHNlcnYpLAorCQkJICByZW1vdGVfYnVzaWQpOwogCWlmIChyZXQpIHsKIAkJZXJyKCJyZWFkX3JlY29yZCIpOwogCQlyZWFkX3JlY29yZF9lcnJvciA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuaAppbmRleCBlMDcxZjgwLi5mYTIzMTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmgKQEAgLTUsNyArNSw3IEBACiAjaWZuZGVmIF9fVkhDSV9EUklWRVJfSAogI2RlZmluZSBfX1ZIQ0lfRFJJVkVSX0gKIAotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CisjaW5jbHVkZSA8bGlidWRldi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCkBAIC0xMywxMSArMTMsNiBAQAogI2RlZmluZSBVU0JJUF9WSENJX0JVU19UWVBFICJwbGF0Zm9ybSIKICNkZWZpbmUgTUFYTlBPUlQgMTI4CiAKLXN0cnVjdCB1c2JpcF9jbGFzc19kZXZpY2UgewotCWNoYXIgY2xhc3NfcGF0aFtTWVNGU19QQVRIX01BWF07Ci0JY2hhciBkZXZfcGF0aFtTWVNGU19QQVRIX01BWF07Ci19OwotCiBzdHJ1Y3QgdXNiaXBfaW1wb3J0ZWRfZGV2aWNlIHsKIAl1aW50OF90IHBvcnQ7CiAJdWludDMyX3Qgc3RhdHVzOwpAQCAtMjgsMTggKzIzLDEzIEBACiAJdWludDhfdCBkZXZudW07CiAKIAkvKiB1c2JpcF9jbGFzc19kZXZpY2UgbGlzdCAqLwotCXN0cnVjdCBkbGlzdCAqY2Rldl9saXN0OwogCXN0cnVjdCB1c2JpcF91c2JfZGV2aWNlIHVkZXY7CiB9OwogCiBzdHJ1Y3QgdXNiaXBfdmhjaV9kcml2ZXIgewotCWNoYXIgc3lzZnNfbW50cGF0aFtTWVNGU19QQVRIX01BWF07CiAKIAkvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmhjaV9oY2QgKi8KLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpoY19kZXZpY2U7Ci0KLQkvKiB1c2JpcF9jbGFzc19kZXZpY2UgbGlzdCAqLwotCXN0cnVjdCBkbGlzdCAqY2Rldl9saXN0OworCXN0cnVjdCB1ZGV2X2RldmljZSAqaGNfZGV2aWNlOwogCiAJaW50IG5wb3J0czsKIAlzdHJ1Y3QgdXNiaXBfaW1wb3J0ZWRfZGV2aWNlIGlkZXZbTUFYTlBPUlRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvTWFrZWZpbGUuYW0gYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy9NYWtlZmlsZS5hbQppbmRleCBiNGY4YzRiMC4uZTgxYTRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvTWFrZWZpbGUuYW0KKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvTWFrZWZpbGUuYW0KQEAgLTgsNSArOCw0IEBACiAJCSB1c2JpcF9hdHRhY2guYyB1c2JpcF9kZXRhY2guYyB1c2JpcF9saXN0LmMgXAogCQkgdXNiaXBfYmluZC5jIHVzYmlwX3VuYmluZC5jIHVzYmlwX3BvcnQuYwogCi0KIHVzYmlwZF9TT1VSQ0VTIDo9IHVzYmlwX25ldHdvcmsuaCB1c2JpcGQuYyB1c2JpcF9uZXR3b3JrLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2F0dGFjaC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKaW5kZXggMDg1ODQxMS4uNzE2YTc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgogCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9iaW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9iaW5kLmMKaW5kZXggOWVjYWY2ZS4uZmE0NjE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYmluZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2JpbmQuYwpAQCAtMTYsNyArMTYsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+CiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlICJ1c2JpcC5oIgorI2luY2x1ZGUgInN5c2ZzX3V0aWxzLmgiCiAKIGVudW0gdW5iaW5kX3N0YXR1cyB7CiAJVU5CSU5EX1NUX09LLApAQCAtNDgsMTY3ICs0OSw5MiBAQAogLyogY2FsbCBhdCB1bmJvdW5kIHN0YXRlICovCiBzdGF0aWMgaW50IGJpbmRfdXNiaXAoY2hhciAqYnVzaWQpCiB7Ci0JY2hhciBidXNfdHlwZVtdID0gInVzYiI7CiAJY2hhciBhdHRyX25hbWVbXSA9ICJiaW5kIjsKLQljaGFyIHN5c2ZzX21udHBhdGhbU1lTRlNfUEFUSF9NQVhdOwogCWNoYXIgYmluZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCWNoYXIgaW50Zl9idXNpZFtTWVNGU19CVVNfSURfU0laRV07Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqYnVzaWRfZGV2OwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJpbmRfYXR0cjsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpiQ29uZlZhbHVlOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJOdW1JbnRmczsKLQlpbnQgaSwgZmFpbGVkID0gMDsKLQlpbnQgcmMsIHJldCA9IC0xOwotCi0JcmMgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOwotCWlmIChyYyA8IDApIHsKLQkJZXJyKCJzeXNmcyBtdXN0IGJlIG1vdW50ZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpbnQgcmMgPSAtMTsKIAogCXNucHJpbnRmKGJpbmRfYXR0cl9wYXRoLCBzaXplb2YoYmluZF9hdHRyX3BhdGgpLCAiJXMvJXMvJXMvJXMvJXMvJXMiLAotCQkgc3lzZnNfbW50cGF0aCwgU1lTRlNfQlVTX05BTUUsIGJ1c190eXBlLCBTWVNGU19EUklWRVJTX05BTUUsCi0JCSBVU0JJUF9IT1NUX0RSVl9OQU1FLCBhdHRyX25hbWUpOworCQkgU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLCBTWVNGU19CVVNfVFlQRSwKKwkJIFNZU0ZTX0RSSVZFUlNfTkFNRSwgVVNCSVBfSE9TVF9EUlZfTkFNRSwgYXR0cl9uYW1lKTsKIAotCWJpbmRfYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKGJpbmRfYXR0cl9wYXRoKTsKLQlpZiAoIWJpbmRfYXR0cikgewotCQlkYmcoInByb2JsZW0gZ2V0dGluZyBiaW5kIGF0dHJpYnV0ZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKGJpbmRfYXR0cl9wYXRoLCBidXNpZCwgc3RybGVuKGJ1c2lkKSk7CisJaWYgKHJjIDwgMCkgeworCQllcnIoImVycm9yIGJpbmRpbmcgZGV2aWNlICVzIHRvIGRyaXZlcjogJXMiLCBidXNpZCwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlidXNpZF9kZXYgPSBzeXNmc19vcGVuX2RldmljZShidXNfdHlwZSwgYnVzaWQpOwotCWlmICghYnVzaWRfZGV2KSB7Ci0JCWRiZygic3lzZnNfb3Blbl9kZXZpY2UgJXMgZmFpbGVkOiAlcyIsIGJ1c2lkLCBzdHJlcnJvcihlcnJubykpOwotCQlnb3RvIGVycl9jbG9zZV9iaW5kX2F0dHI7Ci0JfQotCi0JYkNvbmZWYWx1ZSA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiQ29uZmlndXJhdGlvblZhbHVlIik7Ci0JYk51bUludGZzICA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiTnVtSW50ZXJmYWNlcyIpOwotCi0JaWYgKCFiQ29uZlZhbHVlIHx8ICFiTnVtSW50ZnMpIHsKLQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgZGV2aWNlIGF0dHJpYnV0ZXM6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZXJyX2Nsb3NlX2J1c2lkX2RldjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYXRvaShiTnVtSW50ZnMtPnZhbHVlKTsgaSsrKSB7Ci0JCXNucHJpbnRmKGludGZfYnVzaWQsIFNZU0ZTX0JVU19JRF9TSVpFLCAiJXM6JS4xcy4lZCIsIGJ1c2lkLAotCQkJIGJDb25mVmFsdWUtPnZhbHVlLCBpKTsKLQotCQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShiaW5kX2F0dHIsIGludGZfYnVzaWQsCi0JCQkJCSAgIFNZU0ZTX0JVU19JRF9TSVpFKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZGJnKCJiaW5kIGRyaXZlciBhdCAlcyBmYWlsZWQiLCBpbnRmX2J1c2lkKTsKLQkJCWZhaWxlZCA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoIWZhaWxlZCkKLQkJcmV0ID0gMDsKLQotZXJyX2Nsb3NlX2J1c2lkX2RldjoKLQlzeXNmc19jbG9zZV9kZXZpY2UoYnVzaWRfZGV2KTsKLWVycl9jbG9zZV9iaW5kX2F0dHI6Ci0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGJpbmRfYXR0cik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKiBidWdneSBkcml2ZXIgbWF5IGNhdXNlIGRlYWQgbG9jayAqLwogc3RhdGljIGludCB1bmJpbmRfb3RoZXIoY2hhciAqYnVzaWQpCiB7Ci0JY2hhciBidXNfdHlwZVtdID0gInVzYiI7Ci0JY2hhciBpbnRmX2J1c2lkW1NZU0ZTX0JVU19JRF9TSVpFXTsKLQlzdHJ1Y3Qgc3lzZnNfZGV2aWNlICpidXNpZF9kZXY7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqaW50Zl9kZXY7Ci0Jc3RydWN0IHN5c2ZzX2RyaXZlciAqaW50Zl9kcnY7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqdW5iaW5kX2F0dHI7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYkNvbmZWYWx1ZTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpiRGV2Q2xhc3M7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYk51bUludGZzOwotCWludCBpLCByYzsKIAllbnVtIHVuYmluZF9zdGF0dXMgc3RhdHVzID0gVU5CSU5EX1NUX09LOwogCi0JYnVzaWRfZGV2ID0gc3lzZnNfb3Blbl9kZXZpY2UoYnVzX3R5cGUsIGJ1c2lkKTsKLQlpZiAoIWJ1c2lkX2RldikgewotCQlkYmcoInN5c2ZzX29wZW5fZGV2aWNlICVzIGZhaWxlZDogJXMiLCBidXNpZCwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwljaGFyIGF0dHJfbmFtZVtdID0gInVuYmluZCI7CisJY2hhciB1bmJpbmRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwlpbnQgcmMgPSAtMTsKIAotCWJDb25mVmFsdWUgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoYnVzaWRfZGV2LCAiYkNvbmZpZ3VyYXRpb25WYWx1ZSIpOwotCWJEZXZDbGFzcyAgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoYnVzaWRfZGV2LCAiYkRldmljZUNsYXNzIik7Ci0JYk51bUludGZzICA9IHN5c2ZzX2dldF9kZXZpY2VfYXR0cihidXNpZF9kZXYsICJiTnVtSW50ZXJmYWNlcyIpOwotCWlmICghYkNvbmZWYWx1ZSB8fCAhYkRldkNsYXNzIHx8ICFiTnVtSW50ZnMpIHsKLQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgZGV2aWNlIGF0dHJpYnV0ZXM6ICVzIiwKLQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJc3RydWN0IHVkZXYgKnVkZXY7CisJc3RydWN0IHVkZXZfZGV2aWNlICpkZXY7CisJY29uc3QgY2hhciAqZHJpdmVyOworCWNvbnN0IGNoYXIgKmJEZXZDbGFzczsKKworCS8qIENyZWF0ZSBsaWJ1ZGV2IGNvbnRleHQuICovCisJdWRldiA9IHVkZXZfbmV3KCk7CisKKwkvKiBHZXQgdGhlIGRldmljZS4gKi8KKwlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2LCAidXNiIiwgYnVzaWQpOworCWlmICghZGV2KSB7CisJCWRiZygidW5hYmxlIHRvIGZpbmQgZGV2aWNlIHdpdGggYnVzIElEICVzIiwgYnVzaWQpOwogCQlnb3RvIGVycl9jbG9zZV9idXNpZF9kZXY7CiAJfQogCi0JaWYgKCFzdHJuY21wKGJEZXZDbGFzcy0+dmFsdWUsICIwOSIsIGJEZXZDbGFzcy0+bGVuKSkgeworCS8qIENoZWNrIHdoYXQga2luZCBvZiBkZXZpY2UgaXQgaXMuICovCisJYkRldkNsYXNzICA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKGRldiwgImJEZXZpY2VDbGFzcyIpOworCWlmICghYkRldkNsYXNzKSB7CisJCWRiZygidW5hYmxlIHRvIGdldCBiRGV2Q2xhc3MgZGV2aWNlIGF0dHJpYnV0ZSIpOworCQlnb3RvIGVycl9jbG9zZV9idXNpZF9kZXY7CisJfQorCisJaWYgKCFzdHJuY21wKGJEZXZDbGFzcywgIjA5Iiwgc3RybGVuKGJEZXZDbGFzcykpKSB7CiAJCWRiZygic2tpcCB1bmJpbmRpbmcgb2YgaHViIik7CiAJCWdvdG8gZXJyX2Nsb3NlX2J1c2lkX2RldjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgYXRvaShiTnVtSW50ZnMtPnZhbHVlKTsgaSsrKSB7Ci0JCXNucHJpbnRmKGludGZfYnVzaWQsIFNZU0ZTX0JVU19JRF9TSVpFLCAiJXM6JS4xcy4lZCIsIGJ1c2lkLAotCQkJIGJDb25mVmFsdWUtPnZhbHVlLCBpKTsKLQkJaW50Zl9kZXYgPSBzeXNmc19vcGVuX2RldmljZShidXNfdHlwZSwgaW50Zl9idXNpZCk7Ci0JCWlmICghaW50Zl9kZXYpIHsKLQkJCWRiZygiY291bGQgbm90IG9wZW4gaW50ZXJmYWNlIGRldmljZTogJXMiLAotCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlnb3RvIGVycl9jbG9zZV9idXNpZF9kZXY7Ci0JCX0KKwkvKiBHZXQgdGhlIGRldmljZSBkcml2ZXIuICovCisJZHJpdmVyID0gdWRldl9kZXZpY2VfZ2V0X2RyaXZlcihkZXYpOworCWlmICghZHJpdmVyKSB7CisJCS8qIE5vIGRyaXZlciBib3VuZCB0byB0aGlzIGRldmljZS4gKi8KKwkJZ290byBvdXQ7CisJfQogCi0JCWRiZygiJXMgLT4gJXMiLCBpbnRmX2Rldi0+bmFtZSwgIGludGZfZGV2LT5kcml2ZXJfbmFtZSk7CisJaWYgKCFzdHJuY21wKFVTQklQX0hPU1RfRFJWX05BTUUsIGRyaXZlciwKKwkJCQlzdHJsZW4oVVNCSVBfSE9TVF9EUlZfTkFNRSkpKSB7CisJCS8qIEFscmVhZHkgYm91bmQgdG8gdXNiaXAtaG9zdC4gKi8KKwkJc3RhdHVzID0gVU5CSU5EX1NUX1VTQklQX0hPU1Q7CisJCWdvdG8gb3V0OworCX0KIAotCQlpZiAoIXN0cm5jbXAoInVua25vd24iLCBpbnRmX2Rldi0+ZHJpdmVyX25hbWUsIFNZU0ZTX05BTUVfTEVOKSkKLQkJCS8qIHVuYm91bmQgaW50ZXJmYWNlICovCi0JCQljb250aW51ZTsKKwkvKiBVbmJpbmQgZGV2aWNlIGZyb20gZHJpdmVyLiAqLworCXNucHJpbnRmKHVuYmluZF9hdHRyX3BhdGgsIHNpemVvZih1bmJpbmRfYXR0cl9wYXRoKSwgIiVzLyVzLyVzLyVzLyVzLyVzIiwKKwkJIFNZU0ZTX01OVF9QQVRILCBTWVNGU19CVVNfTkFNRSwgU1lTRlNfQlVTX1RZUEUsCisJCSBTWVNGU19EUklWRVJTX05BTUUsIGRyaXZlciwgYXR0cl9uYW1lKTsKIAotCQlpZiAoIXN0cm5jbXAoVVNCSVBfSE9TVF9EUlZfTkFNRSwgaW50Zl9kZXYtPmRyaXZlcl9uYW1lLAotCQkJICAgICBTWVNGU19OQU1FX0xFTikpIHsKLQkJCS8qIGFscmVhZHkgYm91bmQgdG8gdXNiaXAtaG9zdCAqLwotCQkJc3RhdHVzID0gVU5CSU5EX1NUX1VTQklQX0hPU1Q7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHVuYmluZGluZyAqLwotCQlpbnRmX2RydiA9IHN5c2ZzX29wZW5fZHJpdmVyKGJ1c190eXBlLCBpbnRmX2Rldi0+ZHJpdmVyX25hbWUpOwotCQlpZiAoIWludGZfZHJ2KSB7Ci0JCQlkYmcoImNvdWxkIG5vdCBvcGVuIGludGVyZmFjZSBkcml2ZXIgb24gJXM6ICVzIiwKLQkJCSAgICBpbnRmX2Rldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCWdvdG8gZXJyX2Nsb3NlX2ludGZfZGV2OwotCQl9Ci0KLQkJdW5iaW5kX2F0dHIgPSBzeXNmc19nZXRfZHJpdmVyX2F0dHIoaW50Zl9kcnYsICJ1bmJpbmQiKTsKLQkJaWYgKCF1bmJpbmRfYXR0cikgewotCQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgaW50ZXJmYWNlIGRyaXZlciBhdHRyaWJ1dGU6ICVzIiwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQkJZ290byBlcnJfY2xvc2VfaW50Zl9kcnY7Ci0JCX0KLQotCQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZSh1bmJpbmRfYXR0ciwgaW50Zl9kZXYtPmJ1c19pZCwKLQkJCQkJICAgU1lTRlNfQlVTX0lEX1NJWkUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQkvKiBOT1RFOiB3aHkga2VlcCB1bmJpbmRpbmcgb3RoZXIgaW50ZXJmYWNlcz8gKi8KLQkJCWRiZygidW5iaW5kIGRyaXZlciBhdCAlcyBmYWlsZWQiLCBpbnRmX2Rldi0+YnVzX2lkKTsKLQkJCXN0YXR1cyA9IFVOQklORF9TVF9GQUlMRUQ7Ci0JCX0KLQotCQlzeXNmc19jbG9zZV9kcml2ZXIoaW50Zl9kcnYpOwotCQlzeXNmc19jbG9zZV9kZXZpY2UoaW50Zl9kZXYpOworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKHVuYmluZF9hdHRyX3BhdGgsIGJ1c2lkLCBzdHJsZW4oYnVzaWQpKTsKKwlpZiAocmMgPCAwKSB7CisJCWVycigiZXJyb3IgdW5iaW5kaW5nIGRldmljZSAlcyBmcm9tIGRyaXZlciIsIGJ1c2lkKTsKKwkJZ290byBlcnJfY2xvc2VfYnVzaWRfZGV2OwogCX0KIAogCWdvdG8gb3V0OwogCi1lcnJfY2xvc2VfaW50Zl9kcnY6Ci0Jc3lzZnNfY2xvc2VfZHJpdmVyKGludGZfZHJ2KTsKLWVycl9jbG9zZV9pbnRmX2RldjoKLQlzeXNmc19jbG9zZV9kZXZpY2UoaW50Zl9kZXYpOwogZXJyX2Nsb3NlX2J1c2lkX2RldjoKIAlzdGF0dXMgPSBVTkJJTkRfU1RfRkFJTEVEOwogb3V0OgotCXN5c2ZzX2Nsb3NlX2RldmljZShidXNpZF9kZXYpOworCXVkZXZfZGV2aWNlX3VucmVmKGRldik7CisJdWRldl91bnJlZih1ZGV2KTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMTYsNiArMTQyLDE3IEBACiBzdGF0aWMgaW50IGJpbmRfZGV2aWNlKGNoYXIgKmJ1c2lkKQogewogCWludCByYzsKKwlzdHJ1Y3QgdWRldiAqdWRldjsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB3aXRoIHRoaXMgYnVzIElEIGV4aXN0cy4gKi8KKwl1ZGV2ID0gdWRldl9uZXcoKTsKKwlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zdWJzeXN0ZW1fc3lzbmFtZSh1ZGV2LCAidXNiIiwgYnVzaWQpOworCWlmICghZGV2KSB7CisJCWVycigiZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBidXMgSUQgZG9lcyBub3QgZXhpc3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1ZGV2X3VucmVmKHVkZXYpOwogCiAJcmMgPSB1bmJpbmRfb3RoZXIoYnVzaWQpOwogCWlmIChyYyA9PSBVTkJJTkRfU1RfRkFJTEVEKSB7CkBAIC0yNDAsNyArMTc3LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXByaW50ZigiYmluZCBkZXZpY2Ugb24gYnVzaWQgJXM6IGNvbXBsZXRlXG4iLCBidXNpZCk7CisJaW5mbygiYmluZCBkZXZpY2Ugb24gYnVzaWQgJXM6IGNvbXBsZXRlIiwgYnVzaWQpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9kZXRhY2guYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2RldGFjaC5jCmluZGV4IDEzMzA4ZGYuLjA1YzZkMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2RldGFjaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2RldGFjaC5jCkBAIC0xNiw4ICsxNiw2IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgotCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2xpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2xpc3QuYwppbmRleCAyMzdlMDk5Li5kNWNlMzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9saXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfbGlzdC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CisjaW5jbHVkZSA8bGlidWRldi5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CkBAIC01NCw3ICs1NCw3IEBACiAJc3RydWN0IHVzYmlwX3VzYl9kZXZpY2UgdWRldjsKIAlzdHJ1Y3QgdXNiaXBfdXNiX2ludGVyZmFjZSB1aW50ZjsKIAl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgaiwgcmM7CisJaW50IHJjLCBqOwogCiAJcmMgPSB1c2JpcF9uZXRfc2VuZF9vcF9jb21tb24oc29ja2ZkLCBPUF9SRVFfREVWTElTVCwgMCk7CiAJaWYgKHJjIDwgMCkgewpAQCAtMTA3LDE5ICsxMDcsMjAgQEAKIAkJZm9yIChqID0gMDsgaiA8IHVkZXYuYk51bUludGVyZmFjZXM7IGorKykgewogCQkJcmMgPSB1c2JpcF9uZXRfcmVjdihzb2NrZmQsICZ1aW50Ziwgc2l6ZW9mKHVpbnRmKSk7CiAJCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGJnKCJ1c2JpcF9uZXRfcmVjdiBmYWlsZWQ6IHVzYmlwX3VzYl9pbnRmWyVkXSIsCi0JCQkJICAgIGopOworCQkJCWVycigidXNiaXBfbmV0X3JlY3YgZmFpbGVkOiB1c2JpcF91c2JfaW50ZlslZF0iLAorCQkJCQkJaik7CiAKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCQl1c2JpcF9uZXRfcGFja191c2JfaW50ZXJmYWNlKDAsICZ1aW50Zik7CiAKIAkJCXVzYmlwX25hbWVzX2dldF9jbGFzcyhjbGFzc19uYW1lLCBzaXplb2YoY2xhc3NfbmFtZSksCi0JCQkJCSAgICAgIHVpbnRmLmJJbnRlcmZhY2VDbGFzcywKLQkJCQkJICAgICAgdWludGYuYkludGVyZmFjZVN1YkNsYXNzLAotCQkJCQkgICAgICB1aW50Zi5iSW50ZXJmYWNlUHJvdG9jb2wpOworCQkJCQl1aW50Zi5iSW50ZXJmYWNlQ2xhc3MsCisJCQkJCXVpbnRmLmJJbnRlcmZhY2VTdWJDbGFzcywKKwkJCQkJdWludGYuYkludGVyZmFjZVByb3RvY29sKTsKIAkJCXByaW50ZigiJTExczogJTJkIC0gJXNcbiIsICIiLCBqLCBjbGFzc19uYW1lKTsKIAkJfQorCiAJCXByaW50ZigiXG4iKTsKIAl9CiAKQEAgLTE1MCw4ICsxNTEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9kZXZpY2UoY2hhciAqYnVzaWQsIGNoYXIgKnZlbmRvciwgY2hhciAqcHJvZHVjdCwKLQkJCSBib29sIHBhcnNhYmxlKQorc3RhdGljIHZvaWQgcHJpbnRfZGV2aWNlKGNvbnN0IGNoYXIgKmJ1c2lkLCBjb25zdCBjaGFyICp2ZW5kb3IsCisJCQkgY29uc3QgY2hhciAqcHJvZHVjdCwgYm9vbCBwYXJzYWJsZSkKIHsKIAlpZiAocGFyc2FibGUpCiAJCXByaW50ZigiYnVzaWQ9JXMjdXNiaWQ9JS40czolLjRzIyIsIGJ1c2lkLCB2ZW5kb3IsIHByb2R1Y3QpOwpAQCAtMTY1LDEwNiArMTY2LDczIEBACiAJCXByaW50ZigiICAgJXNcbiIsIHByb2R1Y3RfbmFtZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2ludGVyZmFjZShjaGFyICpidXNpZCwgY2hhciAqZHJpdmVyLCBib29sIHBhcnNhYmxlKQotewotCWlmIChwYXJzYWJsZSkKLQkJcHJpbnRmKCIlcz0lcyMiLCBidXNpZCwgZHJpdmVyKTsKLQllbHNlCi0JCXByaW50ZigiJTlzJXMgLT4gJXNcbiIsICIiLCBidXNpZCwgZHJpdmVyKTsKLX0KLQotc3RhdGljIGludCBpc19kZXZpY2Uodm9pZCAqeCkKLXsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICpkZXZwYXRoOwotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmRldiA9IHg7Ci0JaW50IHJldCA9IDA7Ci0KLQlkZXZwYXRoID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGRldiwgImRldnBhdGgiKTsKLQlpZiAoZGV2cGF0aCAmJiAqZGV2cGF0aC0+dmFsdWUgIT0gJzAnKQotCQlyZXQgPSAxOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBkZXZjbXAodm9pZCAqYSwgdm9pZCAqYikKLXsKLQlyZXR1cm4gc3RyY21wKGEsIGIpOwotfQotCiBzdGF0aWMgaW50IGxpc3RfZGV2aWNlcyhib29sIHBhcnNhYmxlKQogewotCWNoYXIgYnVzX3R5cGVbXSA9ICJ1c2IiOwotCWNoYXIgYnVzaWRbU1lTRlNfQlVTX0lEX1NJWkVdOworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X2VudW1lcmF0ZSAqZW51bWVyYXRlOworCXN0cnVjdCB1ZGV2X2xpc3RfZW50cnkgKmRldmljZXMsICpkZXZfbGlzdF9lbnRyeTsKKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKKwljb25zdCBjaGFyICpwYXRoOworCWNvbnN0IGNoYXIgKmlkVmVuZG9yOworCWNvbnN0IGNoYXIgKmlkUHJvZHVjdDsKKwljb25zdCBjaGFyICpiQ29uZlZhbHVlOworCWNvbnN0IGNoYXIgKmJOdW1JbnRmczsKKwljb25zdCBjaGFyICpidXNpZDsKIAljaGFyIHByb2R1Y3RfbmFtZVsxMjhdOwotCXN0cnVjdCBzeXNmc19idXMgKnVidXM7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqZGV2OwotCXN0cnVjdCBzeXNmc19kZXZpY2UgKmludGY7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqaWRWZW5kb3I7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqaWRQcm9kdWN0OwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJDb25mVmFsdWU7Ci0Jc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYk51bUludGZzOwotCXN0cnVjdCBkbGlzdCAqZGV2bGlzdDsKLQlpbnQgaTsKIAlpbnQgcmV0ID0gLTE7CiAKLQl1YnVzID0gc3lzZnNfb3Blbl9idXMoYnVzX3R5cGUpOwotCWlmICghdWJ1cykgewotCQllcnIoImNvdWxkIG5vdCBvcGVuICVzIGJ1czogJXMiLCBidXNfdHlwZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwkvKiBDcmVhdGUgbGlidWRldiBjb250ZXh0LiAqLworCXVkZXYgPSB1ZGV2X25ldygpOwogCi0JZGV2bGlzdCA9IHN5c2ZzX2dldF9idXNfZGV2aWNlcyh1YnVzKTsKLQlpZiAoIWRldmxpc3QpIHsKLQkJZXJyKCJjb3VsZCBub3QgZ2V0ICVzIGJ1cyBkZXZpY2VzOiAlcyIsIGJ1c190eXBlLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJZ290byBlcnJfb3V0OwotCX0KKwkvKiBDcmVhdGUgbGlidWRldiBkZXZpY2UgZW51bWVyYXRpb24uICovCisJZW51bWVyYXRlID0gdWRldl9lbnVtZXJhdGVfbmV3KHVkZXYpOwogCi0JLyogcmVtb3ZlIGludGVyZmFjZXMgYW5kIHJvb3QgaHVicyBmcm9tIGRldmljZSBsaXN0ICovCi0JZGxpc3RfZmlsdGVyX3NvcnQoZGV2bGlzdCwgaXNfZGV2aWNlLCBkZXZjbXApOworCS8qIFRha2Ugb25seSBVU0IgZGV2aWNlcyB0aGF0IGFyZSBub3QgaHVicyBhbmQgZG8gbm90IGhhdmUKKwkgKiB0aGUgYkludGVyZmFjZU51bWJlciBhdHRyaWJ1dGUsIGkuZS4gYXJlIG5vdCBpbnRlcmZhY2VzLgorCSAqLworCXVkZXZfZW51bWVyYXRlX2FkZF9tYXRjaF9zdWJzeXN0ZW0oZW51bWVyYXRlLCAidXNiIik7CisJdWRldl9lbnVtZXJhdGVfYWRkX25vbWF0Y2hfc3lzYXR0cihlbnVtZXJhdGUsICJiRGV2aWNlQ2xhc3MiLCAiMDkiKTsKKwl1ZGV2X2VudW1lcmF0ZV9hZGRfbm9tYXRjaF9zeXNhdHRyKGVudW1lcmF0ZSwgImJJbnRlcmZhY2VOdW1iZXIiLCBOVUxMKTsKKwl1ZGV2X2VudW1lcmF0ZV9zY2FuX2RldmljZXMoZW51bWVyYXRlKTsKIAotCWlmICghcGFyc2FibGUpIHsKLQkJcHJpbnRmKCJMb2NhbCBVU0IgZGV2aWNlc1xuIik7Ci0JCXByaW50ZigiPT09PT09PT09PT09PT09PT1cbiIpOwotCX0KLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGRldmxpc3QsIGRldiwgc3RydWN0IHN5c2ZzX2RldmljZSkgewotCQlpZFZlbmRvciAgID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGRldiwgImlkVmVuZG9yIik7Ci0JCWlkUHJvZHVjdCAgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoZGV2LCAiaWRQcm9kdWN0Iik7Ci0JCWJDb25mVmFsdWUgPSBzeXNmc19nZXRfZGV2aWNlX2F0dHIoZGV2LCAiYkNvbmZpZ3VyYXRpb25WYWx1ZSIpOwotCQliTnVtSW50ZnMgID0gc3lzZnNfZ2V0X2RldmljZV9hdHRyKGRldiwgImJOdW1JbnRlcmZhY2VzIik7CisJZGV2aWNlcyA9IHVkZXZfZW51bWVyYXRlX2dldF9saXN0X2VudHJ5KGVudW1lcmF0ZSk7CisKKwkvKiBTaG93IGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZGV2aWNlLiAqLworCXVkZXZfbGlzdF9lbnRyeV9mb3JlYWNoKGRldl9saXN0X2VudHJ5LCBkZXZpY2VzKSB7CisJCXBhdGggPSB1ZGV2X2xpc3RfZW50cnlfZ2V0X25hbWUoZGV2X2xpc3RfZW50cnkpOworCQlkZXYgPSB1ZGV2X2RldmljZV9uZXdfZnJvbV9zeXNwYXRoKHVkZXYsIHBhdGgpOworCisJCS8qIEdldCBkZXZpY2UgaW5mb3JtYXRpb24uICovCisJCWlkVmVuZG9yID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAiaWRWZW5kb3IiKTsKKwkJaWRQcm9kdWN0ID0gdWRldl9kZXZpY2VfZ2V0X3N5c2F0dHJfdmFsdWUoZGV2LCAiaWRQcm9kdWN0Iik7CisJCWJDb25mVmFsdWUgPSB1ZGV2X2RldmljZV9nZXRfc3lzYXR0cl92YWx1ZShkZXYsICJiQ29uZmlndXJhdGlvblZhbHVlIik7CisJCWJOdW1JbnRmcyA9IHVkZXZfZGV2aWNlX2dldF9zeXNhdHRyX3ZhbHVlKGRldiwgImJOdW1JbnRlcmZhY2VzIik7CisJCWJ1c2lkID0gdWRldl9kZXZpY2VfZ2V0X3N5c25hbWUoZGV2KTsKIAkJaWYgKCFpZFZlbmRvciB8fCAhaWRQcm9kdWN0IHx8ICFiQ29uZlZhbHVlIHx8ICFiTnVtSW50ZnMpIHsKIAkJCWVycigicHJvYmxlbSBnZXR0aW5nIGRldmljZSBhdHRyaWJ1dGVzOiAlcyIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCi0JCS8qIGdldCBwcm9kdWN0IG5hbWUgKi8KKwkJLyogR2V0IHByb2R1Y3QgbmFtZS4gKi8KIAkJdXNiaXBfbmFtZXNfZ2V0X3Byb2R1Y3QocHJvZHVjdF9uYW1lLCBzaXplb2YocHJvZHVjdF9uYW1lKSwKLQkJCQkJc3RydG9sKGlkVmVuZG9yLT52YWx1ZSwgTlVMTCwgMTYpLAotCQkJCQlzdHJ0b2woaWRQcm9kdWN0LT52YWx1ZSwgTlVMTCwgMTYpKTsKLQkJcHJpbnRfZGV2aWNlKGRldi0+YnVzX2lkLCBpZFZlbmRvci0+dmFsdWUsIGlkUHJvZHVjdC0+dmFsdWUsCi0JCQkgICAgIHBhcnNhYmxlKTsKKwkJCQkJc3RydG9sKGlkVmVuZG9yLCBOVUxMLCAxNiksCisJCQkJCXN0cnRvbChpZFByb2R1Y3QsIE5VTEwsIDE2KSk7CisKKwkJLyogUHJpbnQgaW5mb3JtYXRpb24uICovCisJCXByaW50X2RldmljZShidXNpZCwgaWRWZW5kb3IsIGlkUHJvZHVjdCwgcGFyc2FibGUpOwogCQlwcmludF9wcm9kdWN0X25hbWUocHJvZHVjdF9uYW1lLCBwYXJzYWJsZSk7CiAKLQkJZm9yIChpID0gMDsgaSA8IGF0b2koYk51bUludGZzLT52YWx1ZSk7IGkrKykgewotCQkJc25wcmludGYoYnVzaWQsIHNpemVvZihidXNpZCksICIlczolLjFzLiVkIiwKLQkJCQkgZGV2LT5idXNfaWQsIGJDb25mVmFsdWUtPnZhbHVlLCBpKTsKLQkJCWludGYgPSBzeXNmc19vcGVuX2RldmljZShidXNfdHlwZSwgYnVzaWQpOwotCQkJaWYgKCFpbnRmKSB7Ci0JCQkJZXJyKCJjb3VsZCBub3Qgb3BlbiBkZXZpY2UgaW50ZXJmYWNlOiAlcyIsCi0JCQkJICAgIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJcHJpbnRfaW50ZXJmYWNlKGJ1c2lkLCBpbnRmLT5kcml2ZXJfbmFtZSwgcGFyc2FibGUpOwotCQkJc3lzZnNfY2xvc2VfZGV2aWNlKGludGYpOwotCQl9CiAJCXByaW50ZigiXG4iKTsKKworCQl1ZGV2X2RldmljZV91bnJlZihkZXYpOwogCX0KIAogCXJldCA9IDA7CiAKIGVycl9vdXQ6Ci0Jc3lzZnNfY2xvc2VfYnVzKHVidXMpOworCXVkZXZfZW51bWVyYXRlX3VucmVmKGVudW1lcmF0ZSk7CisJdWRldl91bnJlZih1ZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9uZXR3b3JrLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcF9uZXR3b3JrLmgKaW5kZXggZjE5YWUxOS4uYzFlODc1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfbmV0d29yay5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX25ldHdvcmsuaApAQCAtMTAsNyArMTAsNiBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX3VuYmluZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfdW5iaW5kLmMKaW5kZXggZDVhOWFiNi4uYTRhNDk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfdW5iaW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfdW5iaW5kLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAotI2luY2x1ZGUgPHN5c2ZzL2xpYnN5c2ZzLmg+CisjaW5jbHVkZSA8bGlidWRldi5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInV0aWxzLmgiCiAjaW5jbHVkZSAidXNiaXAuaCIKKyNpbmNsdWRlICJzeXNmc191dGlscy5oIgogCiBzdGF0aWMgY29uc3QgY2hhciB1c2JpcF91bmJpbmRfdXNhZ2Vfc3RyaW5nW10gPQogCSJ1c2JpcCB1bmJpbmQgPGFyZ3M+XG4iCkBAIC00MSwxMTUgKzQyLDY5IEBACiBzdGF0aWMgaW50IHVuYmluZF9kZXZpY2UoY2hhciAqYnVzaWQpCiB7CiAJY2hhciBidXNfdHlwZVtdID0gInVzYiI7Ci0Jc3RydWN0IHN5c2ZzX2RyaXZlciAqdXNiaXBfaG9zdF9kcnY7Ci0Jc3RydWN0IHN5c2ZzX2RldmljZSAqZGV2OwotCXN0cnVjdCBkbGlzdCAqZGV2bGlzdDsKLQlpbnQgdmVyaWZpZWQgPSAwOwogCWludCByYywgcmV0ID0gLTE7CiAKLQljaGFyIGF0dHJfbmFtZVtdID0gImJDb25maWd1cmF0aW9uVmFsdWUiOwotCWNoYXIgc3lzZnNfbW50cGF0aFtTWVNGU19QQVRIX01BWF07Ci0JY2hhciBidXNpZF9hdHRyX3BhdGhbU1lTRlNfUEFUSF9NQVhdOwotCXN0cnVjdCBzeXNmc19hdHRyaWJ1dGUgKmJ1c2lkX2F0dHI7Ci0JY2hhciAqdmFsID0gTlVMTDsKLQlpbnQgbGVuOworCWNoYXIgdW5iaW5kX2F0dHJfbmFtZVtdID0gInVuYmluZCI7CisJY2hhciB1bmJpbmRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIHJlYmluZF9hdHRyX25hbWVbXSA9ICJyZWJpbmQiOworCWNoYXIgcmViaW5kX2F0dHJfcGF0aFtTWVNGU19QQVRIX01BWF07CiAKLQkvKiB2ZXJpZnkgdGhlIGJ1c2lkIGRldmljZSBpcyB1c2luZyB1c2JpcC1ob3N0ICovCi0JdXNiaXBfaG9zdF9kcnYgPSBzeXNmc19vcGVuX2RyaXZlcihidXNfdHlwZSwgVVNCSVBfSE9TVF9EUlZfTkFNRSk7Ci0JaWYgKCF1c2JpcF9ob3N0X2RydikgewotCQllcnIoImNvdWxkIG5vdCBvcGVuICVzIGRyaXZlcjogJXMiLCBVU0JJUF9IT1NUX0RSVl9OQU1FLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOworCXN0cnVjdCB1ZGV2ICp1ZGV2OworCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2OworCWNvbnN0IGNoYXIgKmRyaXZlcjsKKworCS8qIENyZWF0ZSBsaWJ1ZGV2IGNvbnRleHQuICovCisJdWRldiA9IHVkZXZfbmV3KCk7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2Ugd2l0aCB0aGlzIGJ1cyBJRCBleGlzdHMuICovCisJZGV2ID0gdWRldl9kZXZpY2VfbmV3X2Zyb21fc3Vic3lzdGVtX3N5c25hbWUodWRldiwgInVzYiIsIGJ1c2lkKTsKKwlpZiAoIWRldikgeworCQllcnIoImRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgYnVzIElEIGRvZXMgbm90IGV4aXN0Iik7CisJCWdvdG8gZXJyX2Nsb3NlX3VkZXY7CiAJfQogCi0JZGV2bGlzdCA9IHN5c2ZzX2dldF9kcml2ZXJfZGV2aWNlcyh1c2JpcF9ob3N0X2Rydik7Ci0JaWYgKCFkZXZsaXN0KSB7Ci0JCWVycigiJXMgaXMgbm90IGluIHVzZSBieSBhbnkgZGV2aWNlcyIsIFVTQklQX0hPU1RfRFJWX05BTUUpOwotCQlnb3RvIGVycl9jbG9zZV91c2JpcF9ob3N0X2RydjsKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgdXNpbmcgdXNiaXAtaG9zdCBkcml2ZXIuICovCisJZHJpdmVyID0gdWRldl9kZXZpY2VfZ2V0X2RyaXZlcihkZXYpOworCWlmICghZHJpdmVyIHx8IHN0cmNtcChkcml2ZXIsICJ1c2JpcC1ob3N0IikpIHsKKwkJZXJyKCJkZXZpY2UgaXMgbm90IGJvdW5kIHRvIHVzYmlwLWhvc3QgZHJpdmVyIik7CisJCWdvdG8gZXJyX2Nsb3NlX3VkZXY7CiAJfQogCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShkZXZsaXN0LCBkZXYsIHN0cnVjdCBzeXNmc19kZXZpY2UpIHsKLQkJaWYgKCFzdHJuY21wKGJ1c2lkLCBkZXYtPm5hbWUsIHN0cmxlbihidXNpZCkpICYmCi0JCSAgICAhc3RybmNtcChkZXYtPmRyaXZlcl9uYW1lLCBVU0JJUF9IT1NUX0RSVl9OQU1FLAotCQkJICAgICBzdHJsZW4oVVNCSVBfSE9TVF9EUlZfTkFNRSkpKSB7Ci0JCQl2ZXJpZmllZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KKwkvKiBVbmJpbmQgZGV2aWNlIGZyb20gZHJpdmVyLiAqLworCXNucHJpbnRmKHVuYmluZF9hdHRyX3BhdGgsIHNpemVvZih1bmJpbmRfYXR0cl9wYXRoKSwgIiVzLyVzLyVzLyVzLyVzLyVzIiwKKwkJIFNZU0ZTX01OVF9QQVRILCBTWVNGU19CVVNfTkFNRSwgYnVzX3R5cGUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwKKwkJIFVTQklQX0hPU1RfRFJWX05BTUUsIHVuYmluZF9hdHRyX25hbWUpOwogCi0JaWYgKCF2ZXJpZmllZCkgewotCQllcnIoImRldmljZSBvbiBidXNpZCAlcyBpcyBub3QgdXNpbmcgJXMiLCBidXNpZCwKLQkJICAgIFVTQklQX0hPU1RfRFJWX05BTUUpOwotCQlnb3RvIGVycl9jbG9zZV91c2JpcF9ob3N0X2RydjsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IEEgcmVhZCBhbmQgd3JpdGUgb2YgYW4gYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkZXZpY2UgYnVzaWQKLQkgKiByZWZlcnMgdG8gbXVzdCBiZSBkb25lIHRvIHN0YXJ0IHByb2JpbmcuIFRoYXQgd2F5IGEgcmViaW5kIG9mIHRoZQotCSAqIGRlZmF1bHQgZHJpdmVyIGZvciB0aGUgZGV2aWNlIG9jY3Vycy4KLQkgKgotCSAqIFRoaXMgc2VlbXMgdmVyeSBoYWNraXNoIGFuZCBhZGRzIGEgbG90IG9mIHBvaW50bGVzcyBjb2RlLiBJIHRoaW5rIGl0Ci0JICogc2hvdWxkIGJlIGRvbmUgaW4gdGhlIGtlcm5lbCBieSB0aGUgZHJpdmVyIGFmdGVyIGRlbF9tYXRjaF9idXNpZCBpcwotCSAqIGZpbmlzaGVkIQotCSAqLwotCi0JcmMgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKHVuYmluZF9hdHRyX3BhdGgsIGJ1c2lkLCBzdHJsZW4oYnVzaWQpKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWVycigic3lzZnMgbXVzdCBiZSBtb3VudGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKKwkJZXJyKCJlcnJvciB1bmJpbmRpbmcgZGV2aWNlICVzIGZyb20gZHJpdmVyIiwgYnVzaWQpOworCQlnb3RvIGVycl9jbG9zZV91ZGV2OwogCX0KIAotCXNucHJpbnRmKGJ1c2lkX2F0dHJfcGF0aCwgc2l6ZW9mKGJ1c2lkX2F0dHJfcGF0aCksICIlcy8lcy8lcy8lcy8lcy8lcyIsCi0JCSBzeXNmc19tbnRwYXRoLCBTWVNGU19CVVNfTkFNRSwgYnVzX3R5cGUsIFNZU0ZTX0RFVklDRVNfTkFNRSwKLQkJIGJ1c2lkLCBhdHRyX25hbWUpOwotCi0JLyogcmVhZCBhIGRldmljZSBhdHRyaWJ1dGUgKi8KLQlidXNpZF9hdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUoYnVzaWRfYXR0cl9wYXRoKTsKLQlpZiAoIWJ1c2lkX2F0dHIpIHsKLQkJZXJyKCJjb3VsZCBub3Qgb3BlbiAlcy8lczogJXMiLCBidXNpZCwgYXR0cl9uYW1lLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChzeXNmc19yZWFkX2F0dHJpYnV0ZShidXNpZF9hdHRyKSA8IDApIHsKLQkJZXJyKCJwcm9ibGVtIHJlYWRpbmcgYXR0cmlidXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlsZW4gPSBidXNpZF9hdHRyLT5sZW47Ci0JdmFsID0gbWFsbG9jKGxlbik7Ci0JKnZhbCA9ICpidXNpZF9hdHRyLT52YWx1ZTsKLQlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYnVzaWRfYXR0cik7Ci0KLQkvKiBub3RpZnkgZHJpdmVyIG9mIHVuYmluZCAqLworCS8qIE5vdGlmeSBkcml2ZXIgb2YgdW5iaW5kLiAqLwogCXJjID0gbW9kaWZ5X21hdGNoX2J1c2lkKGJ1c2lkLCAwKTsKIAlpZiAocmMgPCAwKSB7CiAJCWVycigidW5hYmxlIHRvIHVuYmluZCBkZXZpY2Ugb24gJXMiLCBidXNpZCk7Ci0JCWdvdG8gZXJyX291dDsKKwkJZ290byBlcnJfY2xvc2VfdWRldjsKIAl9CiAKLQkvKiB3cml0ZSB0aGUgZGV2aWNlIGF0dHJpYnV0ZSAqLwotCWJ1c2lkX2F0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShidXNpZF9hdHRyX3BhdGgpOwotCWlmICghYnVzaWRfYXR0cikgewotCQllcnIoImNvdWxkIG5vdCBvcGVuICVzLyVzOiAlcyIsIGJ1c2lkLCBhdHRyX25hbWUsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQorCS8qIFRyaWdnZXIgbmV3IHByb2JpbmcuICovCisJc25wcmludGYocmViaW5kX2F0dHJfcGF0aCwgc2l6ZW9mKHVuYmluZF9hdHRyX3BhdGgpLCAiJXMvJXMvJXMvJXMvJXMvJXMiLAorCQkJU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLCBidXNfdHlwZSwgU1lTRlNfRFJJVkVSU19OQU1FLAorCQkJVVNCSVBfSE9TVF9EUlZfTkFNRSwgcmViaW5kX2F0dHJfbmFtZSk7CiAKLQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShidXNpZF9hdHRyLCB2YWwsIGxlbik7CisJcmMgPSB3cml0ZV9zeXNmc19hdHRyaWJ1dGUocmViaW5kX2F0dHJfcGF0aCwgYnVzaWQsIHN0cmxlbihidXNpZCkpOwogCWlmIChyYyA8IDApIHsKLQkJZXJyKCJwcm9ibGVtIHdyaXRpbmcgYXR0cmlidXRlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCWdvdG8gZXJyX291dDsKKwkJZXJyKCJlcnJvciByZWJpbmRpbmciKTsKKwkJZ290byBlcnJfY2xvc2VfdWRldjsKIAl9Ci0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKGJ1c2lkX2F0dHIpOwogCiAJcmV0ID0gMDsKLQlwcmludGYoInVuYmluZCBkZXZpY2Ugb24gYnVzaWQgJXM6IGNvbXBsZXRlXG4iLCBidXNpZCk7CisJaW5mbygidW5iaW5kIGRldmljZSBvbiBidXNpZCAlczogY29tcGxldGUiLCBidXNpZCk7CiAKLWVycl9vdXQ6Ci0JZnJlZSh2YWwpOwotZXJyX2Nsb3NlX3VzYmlwX2hvc3RfZHJ2OgotCXN5c2ZzX2Nsb3NlX2RyaXZlcih1c2JpcF9ob3N0X2Rydik7CitlcnJfY2xvc2VfdWRldjoKKwl1ZGV2X2RldmljZV91bnJlZihkZXYpOworCXVkZXZfdW5yZWYodWRldik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcGQuYwppbmRleCA3OTgwZjhiLi4yY2FlNGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91c2JpcGQuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgInVzYmlwX2hvc3RfZHJpdmVyLmgiCiAjaW5jbHVkZSAidXNiaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAidXNiaXBfbmV0d29yay5oIgorI2luY2x1ZGUgImxpc3QuaCIKIAogI3VuZGVmICBQUk9HTkFNRQogI2RlZmluZSBQUk9HTkFNRSAidXNiaXBkIgpAQCAtOTMsNiArOTQsNyBAQAogCXN0cnVjdCBvcF9jb21tb24gcmVwbHk7CiAJc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSAqZWRldjsKIAlzdHJ1Y3QgdXNiaXBfdXNiX2RldmljZSBwZHVfdWRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppOwogCWludCBmb3VuZCA9IDA7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgcmM7CkBAIC0xMDcsOCArMTA5LDggQEAKIAl9CiAJUEFDS19PUF9JTVBPUlRfUkVRVUVTVCgwLCAmcmVxKTsKIAotCWRsaXN0X2Zvcl9lYWNoX2RhdGEoaG9zdF9kcml2ZXItPmVkZXZfbGlzdCwgZWRldiwKLQkJCSAgICBzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlKSB7CisJbGlzdF9mb3JfZWFjaChpLCAmaG9zdF9kcml2ZXItPmVkZXZfbGlzdCkgeworCQllZGV2ID0gbGlzdF9lbnRyeShpLCBzdHJ1Y3QgdXNiaXBfZXhwb3J0ZWRfZGV2aWNlLCBub2RlKTsKIAkJaWYgKCFzdHJuY21wKHJlcS5idXNpZCwgZWRldi0+dWRldi5idXNpZCwgU1lTRlNfQlVTX0lEX1NJWkUpKSB7CiAJCQlpbmZvKCJmb3VuZCByZXF1ZXN0ZWQgZGV2aWNlOiAlcyIsIHJlcS5idXNpZCk7CiAJCQlmb3VuZCA9IDE7CkBAIC0xNjEsMTMgKzE2MywxMiBAQAogCXN0cnVjdCB1c2JpcF91c2JfZGV2aWNlIHBkdV91ZGV2OwogCXN0cnVjdCB1c2JpcF91c2JfaW50ZXJmYWNlIHBkdV91aW5mOwogCXN0cnVjdCBvcF9kZXZsaXN0X3JlcGx5IHJlcGx5OwotCWludCBpOwotCWludCByYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpqOworCWludCByYywgaTsKIAogCXJlcGx5Lm5kZXYgPSAwOwogCS8qIG51bWJlciBvZiBleHBvcnRlZCBkZXZpY2VzICovCi0JZGxpc3RfZm9yX2VhY2hfZGF0YShob3N0X2RyaXZlci0+ZWRldl9saXN0LCBlZGV2LAotCQkJICAgIHN0cnVjdCB1c2JpcF9leHBvcnRlZF9kZXZpY2UpIHsKKwlsaXN0X2Zvcl9lYWNoKGosICZob3N0X2RyaXZlci0+ZWRldl9saXN0KSB7CiAJCXJlcGx5Lm5kZXYgKz0gMTsKIAl9CiAJaW5mbygiZXhwb3J0YWJsZSBkZXZpY2VzOiAlZCIsIHJlcGx5Lm5kZXYpOwpAQCAtMTg1LDggKzE4Niw4IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlkbGlzdF9mb3JfZWFjaF9kYXRhKGhvc3RfZHJpdmVyLT5lZGV2X2xpc3QsIGVkZXYsCi0JCQkgICAgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSkgeworCWxpc3RfZm9yX2VhY2goaiwgJmhvc3RfZHJpdmVyLT5lZGV2X2xpc3QpIHsKKwkJZWRldiA9IGxpc3RfZW50cnkoaiwgc3RydWN0IHVzYmlwX2V4cG9ydGVkX2RldmljZSwgbm9kZSk7CiAJCWR1bXBfdXNiX2RldmljZSgmZWRldi0+dWRldik7CiAJCW1lbWNweSgmcGR1X3VkZXYsICZlZGV2LT51ZGV2LCBzaXplb2YocGR1X3VkZXYpKTsKIAkJdXNiaXBfbmV0X3BhY2tfdXNiX2RldmljZSgxLCAmcGR1X3VkZXYpOwpAQCAtMjAzLDkgKzIwNCw5IEBACiAJCQl1c2JpcF9uZXRfcGFja191c2JfaW50ZXJmYWNlKDEsICZwZHVfdWluZik7CiAKIAkJCXJjID0gdXNiaXBfbmV0X3NlbmQoY29ubmZkLCAmcGR1X3VpbmYsCi0JCQkJCSAgICBzaXplb2YocGR1X3VpbmYpKTsKKwkJCQkJc2l6ZW9mKHBkdV91aW5mKSk7CiAJCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGJnKCJ1c2JpcF9uZXRfc2VuZCBmYWlsZWQ6IHBkdV91aW5mIik7CisJCQkJZXJyKCJ1c2JpcF9uZXRfc2VuZCBmYWlsZWQ6IHBkdV91aW5mIik7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXRpbHMuYwppbmRleCAyZDQ5NjZlLi4yYjNkNmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3V0aWxzLmMKQEAgLTE2LDYxICsxNiwzNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCi0jaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KLQogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAic3lzZnNfdXRpbHMuaCIKIAogaW50IG1vZGlmeV9tYXRjaF9idXNpZChjaGFyICpidXNpZCwgaW50IGFkZCkKIHsKLQljaGFyIGJ1c190eXBlW10gPSAidXNiIjsKIAljaGFyIGF0dHJfbmFtZVtdID0gIm1hdGNoX2J1c2lkIjsKLQljaGFyIGJ1ZmZbU1lTRlNfQlVTX0lEX1NJWkUgKyA0XTsKLQljaGFyIHN5c2ZzX21udHBhdGhbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgY29tbWFuZFtTWVNGU19CVVNfSURfU0laRSArIDRdOwogCWNoYXIgbWF0Y2hfYnVzaWRfYXR0cl9wYXRoW1NZU0ZTX1BBVEhfTUFYXTsKLQlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICptYXRjaF9idXNpZF9hdHRyOwotCWludCByYywgcmV0ID0gMDsKLQotCWlmIChzdHJubGVuKGJ1c2lkLCBTWVNGU19CVVNfSURfU0laRSkgPiBTWVNGU19CVVNfSURfU0laRSAtIDEpIHsKLQkJZGJnKCJidXNpZCBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmMgPSBzeXNmc19nZXRfbW50X3BhdGgoc3lzZnNfbW50cGF0aCwgU1lTRlNfUEFUSF9NQVgpOwotCWlmIChyYyA8IDApIHsKLQkJZXJyKCJzeXNmcyBtdXN0IGJlIG1vdW50ZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpbnQgcmM7CiAKIAlzbnByaW50ZihtYXRjaF9idXNpZF9hdHRyX3BhdGgsIHNpemVvZihtYXRjaF9idXNpZF9hdHRyX3BhdGgpLAotCQkgIiVzLyVzLyVzLyVzLyVzLyVzIiwgc3lzZnNfbW50cGF0aCwgU1lTRlNfQlVTX05BTUUsIGJ1c190eXBlLAotCQkgU1lTRlNfRFJJVkVSU19OQU1FLCBVU0JJUF9IT1NUX0RSVl9OQU1FLCBhdHRyX25hbWUpOworCQkgIiVzLyVzLyVzLyVzLyVzLyVzIiwgU1lTRlNfTU5UX1BBVEgsIFNZU0ZTX0JVU19OQU1FLAorCQkgU1lTRlNfQlVTX1RZUEUsIFNZU0ZTX0RSSVZFUlNfTkFNRSwgVVNCSVBfSE9TVF9EUlZfTkFNRSwKKwkJIGF0dHJfbmFtZSk7CiAKLQltYXRjaF9idXNpZF9hdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUobWF0Y2hfYnVzaWRfYXR0cl9wYXRoKTsKLQlpZiAoIW1hdGNoX2J1c2lkX2F0dHIpIHsKLQkJZGJnKCJwcm9ibGVtIGdldHRpbmcgbWF0Y2hfYnVzaWQgYXR0cmlidXRlOiAlcyIsCi0JCSAgICBzdHJlcnJvcihlcnJubykpOworCWlmIChhZGQpCisJCXNucHJpbnRmKGNvbW1hbmQsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImFkZCAlcyIsIGJ1c2lkKTsKKwllbHNlCisJCXNucHJpbnRmKGNvbW1hbmQsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImRlbCAlcyIsIGJ1c2lkKTsKKworCXJjID0gd3JpdGVfc3lzZnNfYXR0cmlidXRlKG1hdGNoX2J1c2lkX2F0dHJfcGF0aCwgY29tbWFuZCwKKwkJCQkgICBzaXplb2YoY29tbWFuZCkpOworCWlmIChyYyA8IDApIHsKKwkJZGJnKCJmYWlsZWQgdG8gd3JpdGUgbWF0Y2hfYnVzaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChhZGQpCi0JCXNucHJpbnRmKGJ1ZmYsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImFkZCAlcyIsIGJ1c2lkKTsKLQllbHNlCi0JCXNucHJpbnRmKGJ1ZmYsIFNZU0ZTX0JVU19JRF9TSVpFICsgNCwgImRlbCAlcyIsIGJ1c2lkKTsKLQotCWRiZygid3JpdGUgXCIlc1wiIHRvICVzIiwgYnVmZiwgbWF0Y2hfYnVzaWRfYXR0ci0+cGF0aCk7Ci0KLQlyYyA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShtYXRjaF9idXNpZF9hdHRyLCBidWZmLCBzaXplb2YoYnVmZikpOwotCWlmIChyYyA8IDApIHsKLQkJZGJnKCJmYWlsZWQgdG8gd3JpdGUgbWF0Y2hfYnVzaWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0ID0gLTE7Ci0JfQotCi0Jc3lzZnNfY2xvc2VfYXR0cmlidXRlKG1hdGNoX2J1c2lkX2F0dHIpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKaW5kZXggNzIzOTFlZi4uMWU4NDU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTIwNSw4ICsyMDUsNiBAQAogCQl9CiAJfQogCi0JcHJfaW5mbygiY2hhbmdlZCAlZFxuIiwgY2hhbmdlZCk7Ci0KIAlpZiAoKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfU1VTUEVOREVEKSAmJiAoY2hhbmdlZCA9PSAxKSkKIAkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoaGNkKTsKIApAQCAtMjczLDE0ICsyNzEsMTQgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6Ci0JCQl1c2JpcF9kYmdfdmhjaV9yaCgiIENsZWFyUG9ydEZlYXR1cmU6ICIKLQkJCQkJICAiVVNCX1BPUlRfRkVBVF9QT1dFUlxuIik7CisJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkiIENsZWFyUG9ydEZlYXR1cmU6IFVTQl9QT1JUX0ZFQVRfUE9XRVJcbiIpOwogCQkJZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdID0gMDsKIAkJCWR1bS0+cmVzdW1pbmcgPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgotCQkJdXNiaXBfZGJnX3ZoY2lfcmgoIiBDbGVhclBvcnRGZWF0dXJlOiAiCi0JCQkJCSAgIlVTQl9QT1JUX0ZFQVRfQ19SRVNFVFxuIik7CisJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkiIENsZWFyUG9ydEZlYXR1cmU6IFVTQl9QT1JUX0ZFQVRfQ19SRVNFVFxuIik7CiAJCQlzd2l0Y2ggKGR1bS0+dmRldltyaHBvcnRdLnNwZWVkKSB7CiAJCQljYXNlIFVTQl9TUEVFRF9ISUdIOgogCQkJCWR1bS0+cG9ydF9zdGF0dXNbcmhwb3J0XSB8PQpAQCAtMzM5LDE2ICszMzcsMTcgQEAKIAogCQkJaWYgKGR1bS0+dmRldltyaHBvcnRdLnVkLnN0YXR1cyA9PQogCQkJICAgIFZERVZfU1RfTk9UQVNTSUdORUQpIHsKLQkJCQl1c2JpcF9kYmdfdmhjaV9yaCgiIGVuYWJsZSByaHBvcnQgJWQgIgotCQkJCQkJICAiKHN0YXR1cyAldSlcbiIsCi0JCQkJCQkgIHJocG9ydCwKLQkJCQkJCSAgZHVtLT52ZGV2W3JocG9ydF0udWQuc3RhdHVzKTsKKwkJCQl1c2JpcF9kYmdfdmhjaV9yaCgKKwkJCQkJIiBlbmFibGUgcmhwb3J0ICVkIChzdGF0dXMgJXUpXG4iLAorCQkJCQlyaHBvcnQsCisJCQkJCWR1bS0+dmRldltyaHBvcnRdLnVkLnN0YXR1cyk7CiAJCQkJZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdIHw9CiAJCQkJCVVTQl9QT1JUX1NUQVRfRU5BQkxFOwogCQkJfQogCQl9CiAJCSgoX19sZTE2ICopIGJ1ZilbMF0gPSBjcHVfdG9fbGUxNihkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0pOwotCQkoKF9fbGUxNiAqKSBidWYpWzFdID0gY3B1X3RvX2xlMTYoZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdID4+IDE2KTsKKwkJKChfX2xlMTYgKikgYnVmKVsxXSA9CisJCQljcHVfdG9fbGUxNihkdW0tPnBvcnRfc3RhdHVzW3JocG9ydF0gPj4gMTYpOwogCiAJCXVzYmlwX2RiZ192aGNpX3JoKCIgR2V0UG9ydFN0YXR1cyBieWUgJXggJXhcbiIsICgodTE2ICopYnVmKVswXSwKIAkJCQkgICgodTE2ICopYnVmKVsxXSk7CkBAIC0zNjAsMTIgKzM1OSwxMiBAQAogCWNhc2UgU2V0UG9ydEZlYXR1cmU6CiAJCXN3aXRjaCAod1ZhbHVlKSB7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgotCQkJdXNiaXBfZGJnX3ZoY2lfcmgoIiBTZXRQb3J0RmVhdHVyZTogIgotCQkJCQkgICJVU0JfUE9SVF9GRUFUX1NVU1BFTkRcbiIpOworCQkJdXNiaXBfZGJnX3ZoY2lfcmgoCisJCQkJIiBTZXRQb3J0RmVhdHVyZTogVVNCX1BPUlRfRkVBVF9TVVNQRU5EXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6Ci0JCQl1c2JpcF9kYmdfdmhjaV9yaCgiIFNldFBvcnRGZWF0dXJlOiAiCi0JCQkJCSAgIlVTQl9QT1JUX0ZFQVRfUkVTRVRcbiIpOworCQkJdXNiaXBfZGJnX3ZoY2lfcmgoCisJCQkJIiBTZXRQb3J0RmVhdHVyZTogVVNCX1BPUlRfRkVBVF9SRVNFVFxuIik7CiAJCQkvKiBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgZGlzY29ubmVjdCBmaXJzdCAqLwogCQkJaWYgKGR1bS0+cG9ydF9zdGF0dXNbcmhwb3J0XSAmIFVTQl9QT1JUX1NUQVRfRU5BQkxFKSB7CiAJCQkJZHVtLT5wb3J0X3N0YXR1c1tyaHBvcnRdICY9CkBAIC01MzcsOSArNTM2LDggQEAKIAogCQljYXNlIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I6CiAJCQlpZiAoY3RybHJlcS0+d1ZhbHVlID09IGNwdV90b19sZTE2KFVTQl9EVF9ERVZJQ0UgPDwgOCkpCi0JCQkJdXNiaXBfZGJnX3ZoY2lfaGMoIk5vdCB5ZXQ/OiAiCi0JCQkJCQkgICJHZXRfRGVzY3JpcHRvciB0byBkZXZpY2UgMCAiCi0JCQkJCQkgICIoZ2V0IG1heCBwaXBlIHNpemUpXG4iKTsKKwkJCQl1c2JpcF9kYmdfdmhjaV9oYygKKwkJCQkJIk5vdCB5ZXQ/OkdldF9EZXNjcmlwdG9yIHRvIGRldmljZSAwIChnZXQgbWF4IHBpcGUgc2l6ZSlcbiIpOwogCiAJCQlpZiAodmRldi0+dWRldikKIAkJCQl1c2JfcHV0X2Rldih2ZGV2LT51ZGV2KTsKQEAgLTU0OCw4ICs1NDYsOSBAQAogCiAJCWRlZmF1bHQ6CiAJCQkvKiBOT1QgUkVBQ0hFRCAqLwotCQkJZGV2X2VycihkZXYsICJpbnZhbGlkIHJlcXVlc3QgdG8gZGV2bnVtIDAgYlJlcXVlc3QgJXUsICIKLQkJCQkid1ZhbHVlICV1XG4iLCBjdHJscmVxLT5iUmVxdWVzdCwKKwkJCWRldl9lcnIoZGV2LAorCQkJCSJpbnZhbGlkIHJlcXVlc3QgdG8gZGV2bnVtIDAgYlJlcXVlc3QgJXUsIHdWYWx1ZSAldVxuIiwKKwkJCQljdHJscmVxLT5iUmVxdWVzdCwKIAkJCQljdHJscmVxLT53VmFsdWUpOwogCQkJcmV0ID0gIC1FSU5WQUw7CiAJCQlnb3RvIG5vX25lZWRfeG1pdDsKQEAgLTEwNzAsOCArMTA2OSw5IEBACiAJc3Bpbl91bmxvY2soJnRoZV9jb250cm9sbGVyLT5sb2NrKTsKIAogCWlmIChjb25uZWN0ZWQgPiAwKSB7Ci0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJXZSBoYXZlICVkIGFjdGl2ZSBjb25uZWN0aW9uJXMuIERvIG5vdCAiCi0JCQkgInN1c3BlbmQuXG4iLCBjb25uZWN0ZWQsIChjb25uZWN0ZWQgPT0gMSA/ICIiIDogInMiKSk7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIldlIGhhdmUgJWQgYWN0aXZlIGNvbm5lY3Rpb24lcy4gRG8gbm90IHN1c3BlbmQuXG4iLAorCQkJIGNvbm5lY3RlZCwgKGNvbm5lY3RlZCA9PSAxID8gIiIgOiAicyIpKTsKIAkJcmV0ID0gIC1FQlVTWTsKIAl9IGVsc2UgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAic3VzcGVuZCB2aGNpX2hjZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMKaW5kZXggMDE0MWJjMy4uZTA5ODAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jCkBAIC00Nyw4ICs0Nyw4IEBACiAJICogdXAgL3Byb2MvbmV0L3t0Y3AsdGNwNn0uIEFsc28sIGEgdXNlcmxhbmQgcHJvZ3JhbSBtYXkgcmVtZW1iZXIgYQogCSAqIHBvcnQgbnVtYmVyIGFuZCBpdHMgcGVlciBJUCBhZGRyZXNzLgogCSAqLwotCW91dCArPSBzcHJpbnRmKG91dCwgInBydCBzdGEgc3BkIGJ1cyBkZXYgc29ja2V0ICAgICAgICAgICAiCi0JCSAgICAgICAibG9jYWxfYnVzaWRcbiIpOworCW91dCArPSBzcHJpbnRmKG91dCwKKwkJICAgICAgICJwcnQgc3RhIHNwZCBidXMgZGV2IHNvY2tldCAgICAgICAgICAgbG9jYWxfYnVzaWRcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IFZIQ0lfTlBPUlRTOyBpKyspIHsKIAkJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2ID0gcG9ydF90b192ZGV2KGkpOwpAQCAtMTE0LDcgKzExNCw4IEBACiAJaW50IGVycjsKIAlfX3UzMiByaHBvcnQgPSAwOwogCi0Jc3NjYW5mKGJ1ZiwgIiV1IiwgJnJocG9ydCk7CisJaWYgKHNzY2FuZihidWYsICIldSIsICZyaHBvcnQpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogY2hlY2sgcmhwb3J0ICovCiAJaWYgKHJocG9ydCA+PSBWSENJX05QT1JUUykgewpAQCAtMTgyLDcgKzE4Myw4IEBACiAJICogQGRldmlkOiB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgaW4gYSByZW1vdGUgaG9zdAogCSAqIEBzcGVlZDogdXNiIGRldmljZSBzcGVlZCBpbiBhIHJlbW90ZSBob3N0CiAJICovCi0Jc3NjYW5mKGJ1ZiwgIiV1ICV1ICV1ICV1IiwgJnJocG9ydCwgJnNvY2tmZCwgJmRldmlkLCAmc3BlZWQpOworCWlmIChzc2NhbmYoYnVmLCAiJXUgJXUgJXUgJXUiLCAmcmhwb3J0LCAmc29ja2ZkLCAmZGV2aWQsICZzcGVlZCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAl1c2JpcF9kYmdfdmhjaV9zeXNmcygicmhwb3J0KCV1KSBzb2NrZmQoJXUpIGRldmlkKCV1KSBzcGVlZCgldSlcbiIsCiAJCQkgICAgIHJocG9ydCwgc29ja2ZkLCBkZXZpZCwgc3BlZWQpOwpAQCAtMjE1LDggKzIxNyw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldl9pbmZvKGRldiwgInJocG9ydCgldSkgc29ja2ZkKCVkKSBkZXZpZCgldSkgc3BlZWQoJXUpXG4iLAotCQkgcmhwb3J0LCBzb2NrZmQsIGRldmlkLCBzcGVlZCk7CisJZGV2X2luZm8oZGV2LAorCQkgInJocG9ydCgldSkgc29ja2ZkKCVkKSBkZXZpZCgldSkgc3BlZWQoJXUpIHNwZWVkX3N0ciglcylcbiIsCisJCSByaHBvcnQsIHNvY2tmZCwgZGV2aWQsIHNwZWVkLCB1c2Jfc3BlZWRfc3RyaW5nKHNwZWVkKSk7CiAKIAl2ZGV2LT5kZXZpZCAgICAgICAgID0gZGV2aWQ7CiAJdmRldi0+c3BlZWQgICAgICAgICA9IHNwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMW1nci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS84MDIxMW1nci5jCmluZGV4IDc5NDlkNTguLjlhYTJlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvODAyMTFtZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1LzgwMjExbWdyLmMKQEAgLTkxLDEyICs5MSwxNSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJKyBXTEFOX0JFQUNPTl9PRkZfVFMpOwotCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9CRUFDT05fT0ZGX0JDTl9JTlQpOwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX0JFQUNPTl9PRkZfQ0FQSU5GTyk7CisJcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKQorCQkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSBXTEFOX0JFQUNPTl9PRkZfVFMpOworCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSBXTEFOX0JFQUNPTl9PRkZfQkNOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9CRUFDT05fT0ZGX0NBUElORk8pOwogCiAJcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0JFQUNPTl9PRkZfU1NJRDsKIApAQCAtMTI0LDE2ICsxMjcsMjAgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSsgV0xBTl9CRUFDT05fT0ZGX1RTKTsKLQlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgICArIFdMQU5fQkVBQ09OX09GRl9CQ05fSU5UKTsKLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9CRUFDT05fT0ZGX0NBUElORk8pOworCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkKKwkJCQkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgV0xBTl9CRUFDT05fT0ZGX1RTKTsKKwlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICAgV0xBTl9CRUFDT05fT0ZGX0JDTl9JTlQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fQkVBQ09OX09GRl9DQVBJTkZPKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCi0JcEl0ZW0gPSAoUFdMQU5fSUUpKCh1bnNpZ25lZCBjaGFyICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSkKLQkJCSAgICsgV0xBTl9CRUFDT05fT0ZGX1NTSUQpOworCXBJdGVtID0gKFBXTEFOX0lFKSgodW5zaWduZWQgY2hhciAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSkgKworCQkJICAgIFdMQU5fQkVBQ09OX09GRl9TU0lEKTsKIAl3aGlsZSAoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgewogCQlzd2l0Y2ggKHBJdGVtLT5ieUVsZW1lbnRJRCkgewogCQljYXNlIFdMQU5fRUlEX1NTSUQ6CkBAIC0xNzEsNyArMTc4LDggQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCkBAIC0xODEsNyArMTg5LDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0VYVFNVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0KKwkJCQkJCSAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfQ09VTlRSWTogICAgICAvKiA3ICovCkBAIC0xOTEsNyArMjAwLDggQEAKIAogCQljYXNlIFdMQU5fRUlEX1BXUl9DT05TVFJBSU5UOiAgIC8qIDMyICovCiAJCQlpZiAocEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID0gKFBXTEFOX0lFX1BXX0NPTlNUKXBJdGVtOworCQkJCXBGcmFtZS0+cElFX1Bvd2VyQ29uc3RyYWludCA9CisJCQkJCQkgICAgICAoUFdMQU5fSUVfUFdfQ09OU1QpcEl0ZW07CiAJCQlicmVhazsKIAogCQljYXNlIFdMQU5fRUlEX0NIX1NXSVRDSDogICAgLyogMzcgKi8KQEAgLTIxMCw3ICsyMjAsOSBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIGJlYWNvbiBkZWNvZGUuXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiBiZWFjb24gZGVjb2RlLlxuIiwKKwkJCQlwSXRlbS0+YnlFbGVtZW50SUQpOwogCQkJYnJlYWs7CiAKIAkJfQpAQCAtMjgyLDkgKzI5NCwxMSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd1JlYXNvbiA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04pOwotCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OICsgc2l6ZW9mKCoocEZyYW1lLT5wd1JlYXNvbikpOworCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTik7CisJcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04gKworCQkgICAgICBzaXplb2YoKihwRnJhbWUtPnB3UmVhc29uKSk7CiAKIAlyZXR1cm47CiB9CkBAIC0zMDgsOCArMzIyLDkgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OKTsKKwlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0RJU0FTU09DX09GRl9SRUFTT04pOwogCiAJcmV0dXJuOwogfQpAQCAtMzMyLDExICszNDcsMTQgQEAKIHsKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7Ci0JcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UICsgc2l6ZW9mKCoocEZyYW1lLT5wd0xpc3RlbkludGVydmFsKSk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQgKworCQkgICAgICBzaXplb2YoKihwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwpKTsKIAlyZXR1cm47CiB9CiAKQEAgLTM2MCwxMCArMzc4LDEyIEBACiAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAJcEl0ZW0gPSAoUFdMQU5fSUUpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtMzc3LDcgKzM5Nyw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9CisJCQkJCQkgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfUlNOOgpAQCAtMzg3LDE2ICs0MDgsMTkgQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0VYVFNVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wRXh0U3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0KKwkJCQkJCSAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiBhc3NvY3JlcSBkZWNvZGUuXG4iLAorCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiBhc3NvY3JlcSBkZWNvZGUuXG4iLAogCQkJCXBJdGVtLT5ieUVsZW1lbnRJRCk7CiAJCQlicmVhazsKIAkJfQpAQCAtNDI0LDE0ICs0NDgsMTcgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfQUlEKTsKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQKLQkJKyBzaXplb2YoKihwRnJhbWUtPnB3QWlkKSk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9BU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0FTU09DUkVTUF9PRkZfU1RBVFVTKTsKKwlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSBXTEFOX0FTU09DUkVTUF9PRkZfQUlEKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQgKworCQkgICAgICBzaXplb2YoKihwRnJhbWUtPnB3QWlkKSk7CiAKIAlyZXR1cm47CiB9CkBAIC00NTcsMTYgKzQ4NCwyMCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfU1RBVFVTKTsKLQlwRnJhbWUtPnB3QWlkID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICArIFdMQU5fQVNTT0NSRVNQX09GRl9BSUQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fQVNTT0NSRVNQX09GRl9DQVBfSU5GTyk7CisJcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7CisJcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgV0xBTl9BU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKIAkvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwotCXBGcmFtZS0+cFN1cHBSYXRlcyAgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUykoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgKyBXTEFOX0FTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CisJcEZyYW1lLT5wU3VwcFJhdGVzICA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKQorCQkJICAgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgICAgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NVUFBfUkFURVMpOwogCiAJcEl0ZW0gPSAoUFdMQU5fSUUpKHBGcmFtZS0+cFN1cHBSYXRlcyk7CiAJcEl0ZW0gPSAoUFdMQU5fSUUpKCgodW5zaWduZWQgY2hhciAqKXBJdGVtKSArIDIgKyBwSXRlbS0+bGVuKTsKQEAgLTQ3NCw3ICs1MDUsOSBAQAogCWlmICgoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pIDwgKHBGcmFtZS0+cEJ1ZiArIHBGcmFtZS0+bGVuKSkgJiYKIAkgICAgKHBJdGVtLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9FWFRTVVBQX1JBVEVTKSkgewogCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicEZyYW1lLT5wRXh0U3VwcFJhdGVzPVslcF0uXG4iLCBwSXRlbSk7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLAorCQkJS0VSTl9JTkZPICJwRnJhbWUtPnBFeHRTdXBwUmF0ZXM9WyVwXS5cbiIsCisJCQlwSXRlbSk7CiAJfSBlbHNlIHsKIAkJcEZyYW1lLT5wRXh0U3VwcFJhdGVzID0gTlVMTDsKIAl9CkBAIC01MDAsMTMgKzUzMywxNyBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ0FQX0lORk8pOwotCXBGcmFtZS0+cHdMaXN0ZW5JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKLQlwRnJhbWUtPnBBZGRyQ3VyckFQID0gKFBJRUVFX0FERFIpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUCk7Ci0JcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NVUlJfQVAgKyBzaXplb2YoKihwRnJhbWUtPnBBZGRyQ3VyckFQKSk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTyk7CisJcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICAgIFdMQU5fUkVBU1NPQ1JFUV9PRkZfTElTVEVOX0lOVCk7CisJcEZyYW1lLT5wQWRkckN1cnJBUCA9IChQSUVFRV9BRERSKQorCQkJICAgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgICAgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUCArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cEFkZHJDdXJyQVApKTsKIAogCXJldHVybjsKIH0KQEAgLTUzMSwxMiArNTY4LDE1IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTyk7Ci0JcEZyYW1lLT5wd0xpc3RlbkludGVydmFsID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkJICAgICAgKyBXTEFOX1JFQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQpOwotCXBGcmFtZS0+cEFkZHJDdXJyQVAgPSAoUElFRUVfQUREUikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICsgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQKTsKKwlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3TGlzdGVuSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICAgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5fSU5UKTsKKwlwRnJhbWUtPnBBZGRyQ3VyckFQID0gKFBJRUVFX0FERFIpCisJCQkgICAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgICBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NVUlJfQVApOwogCiAJLyogSW5mb3JtYXRpb24gZWxlbWVudHMgKi8KIAlwSXRlbSA9IChQV0xBTl9JRSkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCkBAIC01NTAsNyArNTkwLDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CiAJCQlpZiAocEZyYW1lLT5wU3VwcFJhdGVzID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wU3VwcFJhdGVzID0KKwkJCQkJCSAgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfUlNOOgpAQCAtNTYwLDE2ICs2MDEsMTkgQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgRUlEPSVkZCBpbiByZWFzc29jcmVxIGRlY29kZS5cbiIsCisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywKKwkJCQlLRVJOX0lORk8gIlVucmVjb2duaXplZCBFSUQ9JWRkIGluIHJlYXNzb2NyZXEgZGVjb2RlLlxuIiwKIAkJCQlwSXRlbS0+YnlFbGVtZW50SUQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTYzMSwxNiArNjc1LDIwIEBACiAKIAkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9CisJCQkJCQkgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJhZCBFSUQ9JWRkIGluIHByb2JlcmVxXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJCYWQgRUlEPSVkZCBpbiBwcm9iZXJlcVxuIiwKKwkJCQlwSXRlbS0+YnlFbGVtZW50SUQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNjY4LDE1ICs3MTYsMTggQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSsgV0xBTl9QUk9CRVJFU1BfT0ZGX1RTKTsKLQlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgICArIFdMQU5fUFJPQkVSRVNQX09GRl9CQ05fSU5UKTsKLQlwRnJhbWUtPnB3Q2FwSW5mbyA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnBxd1RpbWVzdGFtcCA9IChQUVdPUkQpCisJCQkgICAgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJV0xBTl9QUk9CRVJFU1BfT0ZGX1RTKTsKKwlwRnJhbWUtPnB3QmVhY29uSW50ZXJ2YWwgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICAgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fUFJPQkVSRVNQX09GRl9DQVBfSU5GTyk7CiAKIAlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUFJPQkVSRVNQX09GRl9DQVBfSU5GTyArCi0JCXNpemVvZigqKHBGcmFtZS0+cHdDYXBJbmZvKSk7CisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdDYXBJbmZvKSk7CiAKIAlyZXR1cm47CiB9CkBAIC03MDIsMTIgKzc1MywxNSBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wcXdUaW1lc3RhbXAgPSAoUFFXT1JEKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJKyBXTEFOX1BST0JFUkVTUF9PRkZfVFMpOwotCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgICsgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQpOwotCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICAgKyBXTEFOX1BST0JFUkVTUF9PRkZfQ0FQX0lORk8pOworCXBGcmFtZS0+cHF3VGltZXN0YW1wID0gKFBRV09SRCkKKwkJCSAgICAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQlXTEFOX1BST0JFUkVTUF9PRkZfVFMpOworCXBGcmFtZS0+cHdCZWFjb25JbnRlcnZhbCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgICBXTEFOX1BST0JFUkVTUF9PRkZfQkNOX0lOVCk7CisJcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICAgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPKTsKIAogCS8qIEluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAJcEl0ZW0gPSAoUFdMQU5fSUUpKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQpAQCAtNzIxLDcgKzc3NSw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgogCQkJaWYgKHBGcmFtZS0+cFN1cHBSYXRlcyA9PSBOVUxMKQotCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOworCQkJCXBGcmFtZS0+cFN1cHBSYXRlcyA9CisJCQkJCQkgICAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0ZIX1BBUk1TOgogCQkJYnJlYWs7CkBAIC03MzUsNyArNzkwLDggQEAKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0lCU1NfUEFSTVM6CiAJCQlpZiAocEZyYW1lLT5wSUJTU1Bhcm1zID09IE5VTEwpCi0JCQkJcEZyYW1lLT5wSUJTU1Bhcm1zID0gKFBXTEFOX0lFX0lCU1NfUEFSTVMpcEl0ZW07CisJCQkJcEZyYW1lLT5wSUJTU1Bhcm1zID0KKwkJCQkJCSAgIChQV0xBTl9JRV9JQlNTX1BBUk1TKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9SU046CkBAIC03NDUsNyArODAxLDggQEAKIAkJY2FzZSBXTEFOX0VJRF9SU05fV1BBOgogCQkJaWYgKHBGcmFtZS0+cFJTTldQQSA9PSBOVUxMKSB7CiAJCQkJaWYgKFdQQWJfSXNfUlNOKChQV0xBTl9JRV9SU05fRVhUKXBJdGVtKSA9PSB0cnVlKQotCQkJCQlwRnJhbWUtPnBSU05XUEEgPSAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKKwkJCQkJcEZyYW1lLT5wUlNOV1BBID0KKwkJCQkJCSAgICAgICAoUFdMQU5fSUVfUlNOX0VYVClwSXRlbTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fRUlEX0VSUDoKQEAgLTc1NCw3ICs4MTEsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfRVhUU1VQUF9SQVRFUzoKIAkJCWlmIChwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPSAoUFdMQU5fSUVfU1VQUF9SQVRFUylwSXRlbTsKKwkJCQlwRnJhbWUtPnBFeHRTdXBwUmF0ZXMgPQorCQkJCQkJICAgIChQV0xBTl9JRV9TVVBQX1JBVEVTKXBJdGVtOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBXTEFOX0VJRF9DT1VOVFJZOiAgICAgIC8qIDcgKi8KQEAgLTc2NCw3ICs4MjIsOCBAQAogCiAJCWNhc2UgV0xBTl9FSURfUFdSX0NPTlNUUkFJTlQ6ICAgLyogMzIgKi8KIAkJCWlmIChwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPT0gTlVMTCkKLQkJCQlwRnJhbWUtPnBJRV9Qb3dlckNvbnN0cmFpbnQgPSAoUFdMQU5fSUVfUFdfQ09OU1QpcEl0ZW07CisJCQkJcEZyYW1lLT5wSUVfUG93ZXJDb25zdHJhaW50ID0KKwkJCQkJCSAgICAgIChQV0xBTl9JRV9QV19DT05TVClwSXRlbTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0xBTl9FSURfQ0hfU1dJVENIOiAgICAvKiAzNyAqLwpAQCAtNzgzLDcgKzg0Miw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiQmFkIEVJRD0lZGQgaW4gcHJvYmVyZXNwXG4iLCBwSXRlbS0+YnlFbGVtZW50SUQpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPICJCYWQgRUlEPSVkZCBpbiBwcm9iZXJlc3BcbiIsCisJCQkJcEl0ZW0tPmJ5RWxlbWVudElEKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTgxMSwxMyArODcyLDE3IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3QXV0aEFsZ29yaXRobSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOwotCXBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9TRVEpOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5sZW4gPSBXTEFOX0hEUl9BRERSM19MRU4gKyBXTEFOX0FVVEhFTl9PRkZfU1RBVFVTICsgc2l6ZW9mKCoocEZyYW1lLT5wd1N0YXR1cykpOworCXBGcmFtZS0+cHdBdXRoQWxnb3JpdGhtID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkJICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgICBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOworCXBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkJICBXTEFOX0FVVEhFTl9PRkZfQVVUSF9TRVEpOworCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCSAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgIFdMQU5fQVVUSEVOX09GRl9TVEFUVVMpOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdTdGF0dXMpKTsKIAogCXJldHVybjsKIH0KQEAgLTg0MywxMiArOTA4LDE1IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3QXV0aEFsZ29yaXRobSA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9BTEcpOwotCXBGcmFtZS0+cHdBdXRoU2VxdWVuY2UgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCQkgICAgKyBXTEFOX0FVVEhFTl9PRkZfQVVUSF9TRVEpOwotCXBGcmFtZS0+cHdTdGF0dXMgPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyk7CisJcEZyYW1lLT5wd0F1dGhBbGdvcml0aG0gPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCQkgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJCSAgIFdMQU5fQVVUSEVOX09GRl9BVVRIX0FMRyk7CisJcEZyYW1lLT5wd0F1dGhTZXF1ZW5jZSA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCQkgIFdMQU5fQVVUSEVOX09GRl9BVVRIX1NFUSk7CisJcEZyYW1lLT5wd1N0YXR1cyA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9BVVRIRU5fT0ZGX1NUQVRVUyk7CiAKIAkvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwogCXBJdGVtID0gKFBXTEFOX0lFKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKQEAgLTg4MCw5ICs5NDgsMTEgQEAKIAlwRnJhbWUtPnBIZHIgPSAoUFVXTEFOXzgwMjExSERSKXBGcmFtZS0+cEJ1ZjsKIAogCS8qIEZpeGVkIEZpZWxkcyAqLwotCXBGcmFtZS0+cHdSZWFzb24gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OKTsKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fREVBVVRIRU5fT0ZGX1JFQVNPTiArIHNpemVvZigqKHBGcmFtZS0+cHdSZWFzb24pKTsKKwlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX0RFQVVUSEVOX09GRl9SRUFTT04pOworCXBGcmFtZS0+bGVuID0gV0xBTl9IRFJfQUREUjNfTEVOICsgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OICsKKwkJICAgICAgc2l6ZW9mKCoocEZyYW1lLT5wd1JlYXNvbikpOwogCiAJcmV0dXJuOwogfQpAQCAtOTA2LDggKzk3Niw5IEBACiAJcEZyYW1lLT5wSGRyID0gKFBVV0xBTl84MDIxMUhEUilwRnJhbWUtPnBCdWY7CiAKIAkvKiBGaXhlZCBGaWVsZHMgKi8KLQlwRnJhbWUtPnB3UmVhc29uID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fREVBVVRIRU5fT0ZGX1JFQVNPTik7CisJcEZyYW1lLT5wd1JlYXNvbiA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkJICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgV0xBTl9ERUFVVEhFTl9PRkZfUkVBU09OKTsKIAogCXJldHVybjsKIH0KQEAgLTkzMSwxNCArMTAwMiwxOCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKLQlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9BSUQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVEFUVVMpOworCXBGcmFtZS0+cHdBaWQgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKLQlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCArIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKKwlwRnJhbWUtPmxlbiA9IFdMQU5fSERSX0FERFIzX0xFTiArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCArCisJCSAgICAgIHNpemVvZigqKHBGcmFtZS0+cHdBaWQpKTsKIAogCXJldHVybjsKIH0KQEAgLTk2NCwxNiArMTAzOSwyMCBAQAogCXBGcmFtZS0+cEhkciA9IChQVVdMQU5fODAyMTFIRFIpcEZyYW1lLT5wQnVmOwogCiAJLyogRml4ZWQgRmllbGRzICovCi0JcEZyYW1lLT5wd0NhcEluZm8gPSAodW5zaWduZWQgc2hvcnQgKikoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpCi0JCQkJCSAgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKLQlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKQotCQkJCQkgICAgICArIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX1NUQVRVUyk7Ci0JcEZyYW1lLT5wd0FpZCA9ICh1bnNpZ25lZCBzaG9ydCAqKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJICAgKyBXTEFOX1JFQVNTT0NSRVNQX09GRl9BSUQpOworCXBGcmFtZS0+cHdDYXBJbmZvID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAgKFdMQU5fSERSX0EzX0RBVEFfUFRSKCYocEZyYW1lLT5wSGRyLT5zQTMpKSArCisJCQkgICAgIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPKTsKKwlwRnJhbWUtPnB3U3RhdHVzID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkgICAoV0xBTl9IRFJfQTNfREFUQV9QVFIoJihwRnJhbWUtPnBIZHItPnNBMykpICsKKwkJCSAgICBXTEFOX1JFQVNTT0NSRVNQX09GRl9TVEFUVVMpOworCXBGcmFtZS0+cHdBaWQgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJIFdMQU5fUkVBU1NPQ1JFU1BfT0ZGX0FJRCk7CiAKIAkvKiBJbmZvcm1hdGlvbiBlbGVtZW50cyAqLwotCXBGcmFtZS0+cFN1cHBSYXRlcyA9IChQV0xBTl9JRV9TVVBQX1JBVEVTKShXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkKLQkJCQkJCSAgICsgV0xBTl9SRUFTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CisJcEZyYW1lLT5wU3VwcFJhdGVzID0gKFBXTEFOX0lFX1NVUFBfUkFURVMpCisJCQkgICAgIChXTEFOX0hEUl9BM19EQVRBX1BUUigmKHBGcmFtZS0+cEhkci0+c0EzKSkgKworCQkJICAgICAgV0xBTl9SRUFTU09DUkVTUF9PRkZfU1VQUF9SQVRFUyk7CiAKIAlwSXRlbSA9IChQV0xBTl9JRSkocEZyYW1lLT5wU3VwcFJhdGVzKTsKIAlwSXRlbSA9IChQV0xBTl9JRSkoKCh1bnNpZ25lZCBjaGFyICopcEl0ZW0pICsgMiArIHBJdGVtLT5sZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9hZXNfY2NtcC5jCmluZGV4IDgyYjBiZDEuLjRjY2ZlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYWVzX2NjbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Flc19jY21wLmMKQEAgLTQ2LDggKzQ2LDcgQEAKICAqIFNCT1ggVGFibGUKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzYm94X3RhYmxlWzI1Nl0gPQoteworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2JveF90YWJsZVsyNTZdID0gewogCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCiAJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKIAkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLCAweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LApAQCAtMTUzLDkgKzE1Miw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlvdXRbaV0gPSBzYm94X3RhYmxlW2luW2ldXTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIFNoaWZ0Um93cyh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0KQpAQCAtMjA1LDggKzIwMyw3IEBACiAJCQlTdWJCeXRlcyhjaXBoZXJ0ZXh0LCBUbXBkYXRhQSk7CiAJCQlTaGlmdFJvd3MoVG1wZGF0YUEsIFRtcGRhdGFCKTsKIAkJCXhvcl8xMjgoVG1wZGF0YUIsIGFieVJvdW5kS2V5LCBjaXBoZXJ0ZXh0KTsKLQkJfSBlbHNlIC8qIHJvdW5kIDEgfiA5ICovCi0JCXsKKwkJfSBlbHNlIC8qIHJvdW5kIDEgfiA5ICovewogCQkJU3ViQnl0ZXMoY2lwaGVydGV4dCwgVG1wZGF0YUEpOwogCQkJU2hpZnRSb3dzKFRtcGRhdGFBLCBUbXBkYXRhQik7CiAJCQlNaXhDb2x1bW5zKCZUbXBkYXRhQlswXSwgJlRtcGRhdGFBWzBdKTsKQEAgLTMxMSwxMyArMzA4LDExIEBACiAKIAkvKiBDQ01QICovCiAJQUVTdjEyOChwYnlSeEtleSwgTUlDX0lWLCBhYnlNSUMpOwotCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKSB7CisJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspCiAJCWFieVRtcFtra10gPSBNSUNfSERSMVtra10gXiBhYnlNSUNba2tdOwotCX0KIAlBRVN2MTI4KHBieVJ4S2V5LCBhYnlUbXAsIGFieU1JQyk7Ci0JZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJYWJ5VG1wW2trXSA9IE1JQ19IRFIyW2trXSBeIGFieU1JQ1tra107Ci0JfQogCUFFU3YxMjgocGJ5UnhLZXksIGFieVRtcCwgYWJ5TUlDKTsKIAogCXdDbnQgPSAxOwpAQCAtMzMwLDEyICszMjUsMTAgQEAKIAogCQlBRVN2MTI4KHBieVJ4S2V5LCBhYnlDVFJQTEQsIGFieVRtcCk7CiAKLQkJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwkJZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspCiAJCQlhYnlQbGFpblRleHRba2tdID0gYWJ5VG1wW2trXSBeIHBieVBheWxvYWRba2tdOwotCQl9Ci0JCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKSB7CisJCWZvciAoa2sgPSAwOyBrayA8IDE2OyBraysrKQogCQkJYWJ5VG1wW2trXSA9IGFieU1JQ1tra10gXiBhYnlQbGFpblRleHRba2tdOwotCQl9CiAJCUFFU3YxMjgocGJ5UnhLZXksIGFieVRtcCwgYWJ5TUlDKTsKIAogCQltZW1jcHkocGJ5UGF5bG9hZCwgYWJ5UGxhaW5UZXh0LCAxNik7CkBAIC0zNDUsMjcgKzMzOCwyMyBAQAogCiAJLyogbGFzdCBwYXlsb2FkICovCiAJbWVtY3B5KCYoYWJ5TGFzdENpcGhlclswXSksIHBieVBheWxvYWQsIGpqKTsKLQlmb3IgKGlpID0gamo7IGlpIDwgMTY7IGlpKyspIHsKKwlmb3IgKGlpID0gamo7IGlpIDwgMTY7IGlpKyspCiAJCWFieUxhc3RDaXBoZXJbaWldID0gMHgwMDsKLQl9CiAKIAlhYnlDVFJQTERbMTRdID0gKHVuc2lnbmVkIGNoYXIpKHdDbnQgPj4gOCk7CiAJYWJ5Q1RSUExEWzE1XSA9ICh1bnNpZ25lZCBjaGFyKSh3Q250ICYgMHhmZik7CiAKIAlBRVN2MTI4KHBieVJ4S2V5LCBhYnlDVFJQTEQsIGFieVRtcCk7Ci0JZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJYWJ5UGxhaW5UZXh0W2trXSA9IGFieVRtcFtra10gXiBhYnlMYXN0Q2lwaGVyW2trXTsKLQl9CiAJbWVtY3B5KHBieVBheWxvYWQsIGFieVBsYWluVGV4dCwgamopOwogCXBieVBheWxvYWQgKz0gamo7CiAKIAkvKiBmb3IgTUlDIGNhbGN1bGF0aW9uICovCi0JZm9yIChpaSA9IGpqOyBpaSA8IDE2OyBpaSsrKSB7CisJZm9yIChpaSA9IGpqOyBpaSA8IDE2OyBpaSsrKQogCQlhYnlQbGFpblRleHRbaWldID0gMHgwMDsKLQl9Ci0JZm9yIChrayA9IDA7IGtrIDwgMTY7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCAxNjsga2srKykKIAkJYWJ5VG1wW2trXSA9IGFieU1JQ1tra10gXiBhYnlQbGFpblRleHRba2tdOwotCX0KIAlBRVN2MTI4KHBieVJ4S2V5LCBhYnlUbXAsIGFieU1JQyk7CiAKIAkvKiA9PmFib3ZlIGlzIHRoZSBjYWxjdWxhdGUgTUlDICovCkBAIC0zNzUsOSArMzY0LDggQEAKIAlhYnlDVFJQTERbMTRdID0gKHVuc2lnbmVkIGNoYXIpKHdDbnQgPj4gOCk7CiAJYWJ5Q1RSUExEWzE1XSA9ICh1bnNpZ25lZCBjaGFyKSh3Q250ICYgMHhmZik7CiAJQUVTdjEyOChwYnlSeEtleSwgYWJ5Q1RSUExELCBhYnlUbXApOwotCWZvciAoa2sgPSAwOyBrayA8IDg7IGtrKyspIHsKKwlmb3IgKGtrID0gMDsga2sgPCA4OyBraysrKQogCQlhYnlUbXBba2tdID0gYWJ5VG1wW2trXSBeIHBieVBheWxvYWRba2tdOwotCX0KIAkvKiA9PmFib3ZlIGlzIHRoZSBkZWMtTUlDIGZyb20gcGFja2V0ICovCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXNjLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Rlc2MuaAppbmRleCAzMmQ4MDhlLi5mOGU0MTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Rlc2MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Rlc2MuaApAQCAtMjc2LDkgKzI3Niw4IEBACiAJdm9sYXRpbGUgU1JERVMxIG1fcmQxUkQxOwogCXZvbGF0aWxlIHUzMiAgICBidWZmX2FkZHI7CiAJdm9sYXRpbGUgdTMyICAgIG5leHRfZGVzYzsKLQlzdHJ1Y3QgdGFnU1J4RGVzYyAgICpuZXh0Oy8vNCBieXRlcwotCXZvbGF0aWxlIFBERVZJQ0VfUkRfSU5GTyAgICBwUkRJbmZvOy8vNCBieXRlcwotCXZvbGF0aWxlIHUzMiAgICBSZXNlcnZlZFsyXTsvLzggYnl0ZXMKKwlzdHJ1Y3QgdGFnU1J4RGVzYyAqbmV4dCBfX2FsaWduZWQoOCk7CisJdm9sYXRpbGUgUERFVklDRV9SRF9JTkZPIHBSREluZm8gX19hbGlnbmVkKDgpOwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCiBTUnhEZXNjLCAqUFNSeERlc2M7CiB0eXBlZGVmIGNvbnN0IFNSeERlc2MgKlBDU1J4RGVzYzsKQEAgLTM2MSw5ICszNjAsOCBAQAogCXZvbGF0aWxlICAgIFNUREVTMSAgbV90ZDFURDE7CiAJdm9sYXRpbGUgICAgdTMyICAgIGJ1ZmZfYWRkcjsKIAl2b2xhdGlsZSAgICB1MzIgICAgbmV4dF9kZXNjOwotCXN0cnVjdCB0YWdTVHhEZXNjICpuZXh0OyAvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICBQREVWSUNFX1REX0lORk8gcFRESW5mbzsvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICB1MzIgICAgUmVzZXJ2ZWRbMl07Ly84IGJ5dGVzCisJc3RydWN0IHRhZ1NUeERlc2MgKm5leHQgX19hbGlnbmVkKDgpOworCXZvbGF0aWxlICAgIFBERVZJQ0VfVERfSU5GTyBwVERJbmZvIF9fYWxpZ25lZCg4KTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1R4RGVzYywgKlBTVHhEZXNjOwogdHlwZWRlZiBjb25zdCBTVHhEZXNjICpQQ1NUeERlc2M7CkBAIC0zNzUsOSArMzczLDggQEAKIAl2b2xhdGlsZSAgICB1MzIgbmV4dF9kZXNjOyAvLyBwb2ludGVyIHRvIG5leHQgbG9naWNhbCBkZXNjcmlwdG9yCiAJdm9sYXRpbGUgICAgdW5zaWduZWQgc2hvcnQgbV93RklGT0N0bDsKIAl2b2xhdGlsZSAgICB1bnNpZ25lZCBzaG9ydCBtX3dUaW1lU3RhbXA7Ci0Jc3RydWN0IHRhZ1NUeFN5bmNEZXNjICpuZXh0OyAvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICBQREVWSUNFX1REX0lORk8gcFRESW5mbzsvLzQgYnl0ZXMKLQl2b2xhdGlsZSAgICB1MzIgbV9kd1Jlc2VydmVkMjsKKwlzdHJ1Y3QgdGFnU1R4U3luY0Rlc2MgKm5leHQgX19hbGlnbmVkKDgpOworCXZvbGF0aWxlICAgIFBERVZJQ0VfVERfSU5GTyBwVERJbmZvIF9fYWxpZ25lZCg4KTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQogU1R4U3luY0Rlc2MsICpQU1R4U3luY0Rlc2M7CiB0eXBlZGVmIGNvbnN0IFNUeFN5bmNEZXNjICpQQ1NUeFN5bmNEZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMKaW5kZXggMGEyOWM5MC4uNzcxYmYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jCkBAIC03MjksMjcgKzcyOSwyNyBAQAogCS8vIFNvZnQgTUlDCiAJaWYgKChwS2V5ICE9IE5VTEwpICYmIChwS2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkpIHsKIAkJaWYgKGJJc1dFUCkgewotCQkJdW5zaWduZWQgbG9uZyAqcGR3TUlDX0w7Ci0JCQl1bnNpZ25lZCBsb25nICpwZHdNSUNfUjsKLQkJCXVuc2lnbmVkIGxvbmcgZHdNSUNfUHJpb3JpdHk7Ci0JCQl1bnNpZ25lZCBsb25nIGR3TUlDS2V5MCA9IDAsIGR3TUlDS2V5MSA9IDA7Ci0JCQl1bnNpZ25lZCBsb25nIGR3TG9jYWxNSUNfTCA9IDA7Ci0JCQl1bnNpZ25lZCBsb25nIGR3TG9jYWxNSUNfUiA9IDA7CisJCQlfX2xlMzIgKnBkd01JQ19MOworCQkJX19sZTMyICpwZHdNSUNfUjsKKwkJCV9fbGUzMiBkd01JQ19Qcmlvcml0eTsKKwkJCV9fbGUzMiBkd01JQ0tleTAgPSAwLCBkd01JQ0tleTEgPSAwOworCQkJdTMyIGR3TG9jYWxNSUNfTCA9IDA7CisJCQl1MzIgZHdMb2NhbE1JQ19SID0gMDsKIAkJCXZpYXdnZXRfd3BhX2hlYWRlciAqd3BhaGRyOwogCiAJCQlpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSB7Ci0JCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjRdKSk7Ci0JCQkJZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMjhdKSk7CisJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyNF0pKTsKKwkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzI4XSkpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAocERldmljZS0+cE1nbXQtPmVBdXRoZW5Nb2RlID09IFdNQUNfQVVUSF9XUEFOT05FKSB7Ci0JCQkJCWR3TUlDS2V5MCA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzE2XSkpOwotCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyMF0pKTsKKwkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsxNl0pKTsKKwkJCQkJZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyMF0pKTsKIAkJCQl9IGVsc2UgaWYgKChwS2V5LT5kd0tleUluZGV4ICYgQklUMjgpID09IDApIHsKLQkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1bnNpZ25lZCBsb25nICopKCZwS2V5LT5hYnlLZXlbMTZdKSk7Ci0JCQkJCWR3TUlDS2V5MSA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzIwXSkpOworCQkJCQlkd01JQ0tleTAgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzE2XSkpOworCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSgmcEtleS0+YWJ5S2V5WzIwXSkpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWR3TUlDS2V5MCA9IGNwdV90b19sZTMyKCoodW5zaWduZWQgbG9uZyAqKSgmcEtleS0+YWJ5S2V5WzI0XSkpOwotCQkJCQlkd01JQ0tleTEgPSBjcHVfdG9fbGUzMigqKHVuc2lnbmVkIGxvbmcgKikoJnBLZXktPmFieUtleVsyOF0pKTsKKwkJCQkJZHdNSUNLZXkwID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyNF0pKTsKKwkJCQkJZHdNSUNLZXkxID0gY3B1X3RvX2xlMzIoKih1MzIgKikoJnBLZXktPmFieUtleVsyOF0pKTsKIAkJCQl9CiAJCQl9CiAKQEAgLTc2MywxNCArNzYzLDE0IEBACiAJCQlNSUNfdkdldE1JQygmZHdMb2NhbE1JQ19MLCAmZHdMb2NhbE1JQ19SKTsKIAkJCU1JQ192VW5Jbml0KCk7CiAKLQkJCXBkd01JQ19MID0gKHVuc2lnbmVkIGxvbmcgKikoc2tiLT5kYXRhICsgNCArIEZyYW1lU2l6ZSk7Ci0JCQlwZHdNSUNfUiA9ICh1bnNpZ25lZCBsb25nICopKHNrYi0+ZGF0YSArIDQgKyBGcmFtZVNpemUgKyA0KTsKKwkJCXBkd01JQ19MID0gKF9fbGUzMiAqKShza2ItPmRhdGEgKyA0ICsgRnJhbWVTaXplKTsKKwkJCXBkd01JQ19SID0gKF9fbGUzMiAqKShza2ItPmRhdGEgKyA0ICsgRnJhbWVTaXplICsgNCk7CiAJCQkvL0RCR19QUk5fR1JQMTIoKCJSeEw6ICVseCwgUnhSOiAlbHhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKSk7CiAJCQkvL0RCR19QUk5fR1JQMTIoKCJMb2NhbEw6ICVseCwgTG9jYWxSOiAlbHhcbiIsIGR3TG9jYWxNSUNfTCwgZHdMb2NhbE1JQ19SKSk7CiAJCQkvL0RCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImR3TUlDS2V5MD0gJWx4LGR3TUlDS2V5MT0gJWx4IFxuIiwgZHdNSUNLZXkwLCBkd01JQ0tleTEpOwogCi0JCQlpZiAoKGNwdV90b19sZTMyKCpwZHdNSUNfTCkgIT0gZHdMb2NhbE1JQ19MKSB8fAotCQkJICAgIChjcHVfdG9fbGUzMigqcGR3TUlDX1IpICE9IGR3TG9jYWxNSUNfUikgfHwKKwkJCWlmICgobGUzMl90b19jcHUoKnBkd01JQ19MKSAhPSBkd0xvY2FsTUlDX0wpIHx8CisJCQkgICAgKGxlMzJfdG9fY3B1KCpwZHdNSUNfUikgIT0gZHdMb2NhbE1JQ19SKSB8fAogCQkJICAgIHBEZXZpY2UtPmJSeE1JQ0ZhaWwpIHsKIAkJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUMgY29tcGFyaXNvbiBpcyBmYWlsIVxuIik7CiAJCQkJcERldmljZS0+YlJ4TUlDRmFpbCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmMKaW5kZXggZWFiM2I0MS4uNzhiNTgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jCkBAIC0yNDIsNyArMjQyLDcgQEAKIAkJCQlpZiAodUtleUxlbmd0aCA9PSBXTEFOX1dFUDEwNF9LRVlMRU4pCiAJCQkJCXBLZXktPmFieUtleVsxNV0gfD0gMHg4MDsKIAkJCX0KLQkJCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtpXS53S2V5Q3RsLCBpLCB1S2V5SWR4LCBwYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisJCQlNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcGJ5QlNTSUQsICh1MzIgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CiAKIAkJCWlmICgoZHdLZXlJbmRleCAmIFVTRV9LRVlSU0MpID09IDApIHsKIAkJCQkvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQlpZiAodUtleUxlbmd0aCA9PSBXTEFOX1dFUDEwNF9LRVlMRU4pCiAJCQkJcEtleS0+YWJ5S2V5WzE1XSB8PSAweDgwOwogCQl9Ci0JCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtqXS53S2V5Q3RsLCBqLCB1S2V5SWR4LCBwYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisJCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtqXS53S2V5Q3RsLCBqLCB1S2V5SWR4LCBwYnlCU1NJRCwgKHUzMiAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKIAogCQlpZiAoKGR3S2V5SW5kZXggJiBVU0VfS0VZUlNDKSA9PSAwKSB7CiAJCQkvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJCWlmICh1S2V5TGVuZ3RoID09IFdMQU5fV0VQMTA0X0tFWUxFTikKIAkJCXBLZXktPmFieUtleVsxNV0gfD0gMHg4MDsKIAl9Ci0JTUFDdlNldEtleUVudHJ5KGR3SW9CYXNlLCBwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0ud0tleUN0bCwgTUFYX0tFWV9UQUJMRS0xLCB1S2V5SWR4LCBwVGFibGUtPktleVRhYmxlW01BWF9LRVlfVEFCTEUtMV0uYWJ5QlNTSUQsICh1bnNpZ25lZCBsb25nICopcEtleS0+YWJ5S2V5LCBieUxvY2FsSUQpOworCU1BQ3ZTZXRLZXlFbnRyeShkd0lvQmFzZSwgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLndLZXlDdGwsIE1BWF9LRVlfVEFCTEUtMSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtNQVhfS0VZX1RBQkxFLTFdLmFieUJTU0lELCAodTMyICopcEtleS0+YWJ5S2V5LCBieUxvY2FsSUQpOwogCiAJaWYgKChkd0tleUluZGV4ICYgVVNFX0tFWVJTQykgPT0gMCkgewogCQkvLyBSU0Mgc2V0IGJ5IE5JQwpAQCAtNzY2LDcgKzc2Niw3IEBACiAJCQkJaWYgKHVLZXlMZW5ndGggPT0gV0xBTl9XRVAxMDRfS0VZTEVOKQogCQkJCQlwS2V5LT5hYnlLZXlbMTVdIHw9IDB4ODA7CiAJCQl9Ci0JCQlNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgKHVuc2lnbmVkIGxvbmcgKilwS2V5LT5hYnlLZXksIGJ5TG9jYWxJRCk7CisJCQlNQUN2U2V0S2V5RW50cnkoZHdJb0Jhc2UsIHBUYWJsZS0+S2V5VGFibGVbaV0ud0tleUN0bCwgaSwgdUtleUlkeCwgcFRhYmxlLT5LZXlUYWJsZVtpXS5hYnlCU1NJRCwgKHUzMiAqKXBLZXktPmFieUtleSwgYnlMb2NhbElEKTsKIAogCQkJaWYgKChkd0tleUluZGV4ICYgVVNFX0tFWVJTQykgPT0gMCkgewogCQkJCS8vIFJTQyBzZXQgYnkgTklDCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYwppbmRleCAyMWJkOGExLi4wZWMwNzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMKQEAgLTE0MjgsMTAgKzE0MjgsMTAgQEAKICAqLwogCiB2b2lkIE1BQ3ZTZXRLZXlFbnRyeSh1bnNpZ25lZCBsb25nIGR3SW9CYXNlLCB1bnNpZ25lZCBzaG9ydCB3S2V5Q3RsLCB1bnNpZ25lZCBpbnQgdUVudHJ5SWR4LAotCQkgICAgIHVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBjaGFyICpwYnlBZGRyLCB1bnNpZ25lZCBsb25nICpwZHdLZXksIHVuc2lnbmVkIGNoYXIgYnlMb2NhbElEKQorCQkgICAgIHVuc2lnbmVkIGludCB1S2V5SWR4LCB1bnNpZ25lZCBjaGFyICpwYnlBZGRyLCB1MzIgKnBkd0tleSwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpCiB7CiAJdW5zaWduZWQgc2hvcnQgd09mZnNldDsKLQl1bnNpZ25lZCBsb25nIGR3RGF0YTsKKwl1MzIgZHdEYXRhOwogCWludCAgICAgaWk7CiAKIAlpZiAoYnlMb2NhbElEIDw9IDEpCkBAIC0xNDQ1LDcgKzE0NDUsNyBAQAogCWR3RGF0YSB8PSB3S2V5Q3RsOwogCWR3RGF0YSA8PD0gMTY7CiAJZHdEYXRhIHw9IE1BS0VXT1JEKCoocGJ5QWRkcis0KSwgKihwYnlBZGRyKzUpKTsKLQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIxLiB3T2Zmc2V0OiAlZCwgRGF0YTogJWxYLCBLZXlDdGw6JVhcbiIsIHdPZmZzZXQsIGR3RGF0YSwgd0tleUN0bCk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiMS4gd09mZnNldDogJWQsIERhdGE6ICVYLCBLZXlDdGw6JVhcbiIsIHdPZmZzZXQsIGR3RGF0YSwgd0tleUN0bCk7CiAKIAlWTlN2T3V0UG9ydFcoZHdJb0Jhc2UgKyBNQUNfUkVHX01JU0NGRk5ERVgsIHdPZmZzZXQpOwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGREFUQSwgZHdEYXRhKTsKQEAgLTE0NjAsNyArMTQ2MCw3IEBACiAJZHdEYXRhIHw9ICoocGJ5QWRkcisxKTsKIAlkd0RhdGEgPDw9IDg7CiAJZHdEYXRhIHw9ICoocGJ5QWRkciswKTsKLQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIyLiB3T2Zmc2V0OiAlZCwgRGF0YTogJWxYXG4iLCB3T2Zmc2V0LCBkd0RhdGEpOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIjIuIHdPZmZzZXQ6ICVkLCBEYXRhOiAlWFxuIiwgd09mZnNldCwgZHdEYXRhKTsKIAogCVZOU3ZPdXRQb3J0Vyhkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGTkRFWCwgd09mZnNldCk7CiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZEQVRBLCBkd0RhdGEpOwpAQCAtMTQ3MCw3ICsxNDcwLDcgQEAKIAl3T2Zmc2V0ICs9ICh1S2V5SWR4ICogNCk7CiAJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgewogCQkvLyBhbHdheXMgcHVzaCAxMjggYml0cwotCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIzLiglZCkgd09mZnNldDogJWQsIERhdGE6ICVsWFxuIiwgaWksIHdPZmZzZXQraWksICpwZHdLZXkpOworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICIzLiglZCkgd09mZnNldDogJWQsIERhdGE6ICVYXG4iLCBpaSwgd09mZnNldCtpaSwgKnBkd0tleSk7CiAJCVZOU3ZPdXRQb3J0Vyhkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGTkRFWCwgd09mZnNldCtpaSk7CiAJCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGREFUQSwgKnBkd0tleSsrKTsKIAkJVk5Tdk91dFBvcnRXKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZDVEwsIE1JU0NGRkNUTF9XUklURSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuaAppbmRleCAzZjE3N2Y3Li40NjE1ZGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmgKQEAgLTEwMzgsNyArMTAzOCw3IEBACiBib29sIE1BQ2JQU1dha2V1cCh1bnNpZ25lZCBsb25nIGR3SW9CYXNlKTsKIAogdm9pZCBNQUN2U2V0S2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgc2hvcnQgd0tleUN0bCwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCwKLQkJICAgICB1bnNpZ25lZCBpbnQgdUtleUlkeCwgdW5zaWduZWQgY2hhciAqcGJ5QWRkciwgdW5zaWduZWQgbG9uZyAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCk7CisJCSAgICAgdW5zaWduZWQgaW50IHVLZXlJZHgsIHVuc2lnbmVkIGNoYXIgKnBieUFkZHIsIHUzMiAqcGR3S2V5LCB1bnNpZ25lZCBjaGFyIGJ5TG9jYWxJRCk7CiB2b2lkIE1BQ3ZEaXNhYmxlS2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVFbnRyeUlkeCk7CiB2b2lkIE1BQ3ZTZXREZWZhdWx0S2V5RW50cnkodW5zaWduZWQgbG9uZyBkd0lvQmFzZSwgdW5zaWduZWQgaW50IHVLZXlMZW4sCiAJCQkgICAgdW5zaWduZWQgaW50IHVLZXlJZHgsIHVuc2lnbmVkIGxvbmcgKnBkd0tleSwgdW5zaWduZWQgY2hhciBieUxvY2FsSUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYwppbmRleCA3ZWE1ZjdmLi5hZGU0Yzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pY2hhZWwuYwpAQCAtNTMsMTQgKzUzLDE0IEBACiAqLwogc3RhdGljIHZvaWQgc192Q2xlYXIodm9pZCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgaW50ZXJuYWwgbWVzc2FnZSwKIC8vIHJlc2V0cyB0aGUgb2JqZWN0IHRvIHRoZSBzdGF0ZSBqdXN0IGFmdGVyIGNvbnN0cnVjdGlvbi4KLXN0YXRpYyB2b2lkIHNfdlNldEtleSh1bnNpZ25lZCBsb25nIGR3SzAsIHVuc2lnbmVkIGxvbmcgZHdLMSk7CitzdGF0aWMgdm9pZCBzX3ZTZXRLZXkodTMyICBkd0swLCB1MzIgIGR3SzEpOwogc3RhdGljIHZvaWQgc192QXBwZW5kQnl0ZSh1bnNpZ25lZCBjaGFyIGIpOyAgICAgICAgICAgIC8vIEFkZCBhIHNpbmdsZSBieXRlIHRvIHRoZSBpbnRlcm5hbCBtZXNzYWdlCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBMLCBSOyAgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZQorc3RhdGljIHUzMiBMLCBSOwkvKiBDdXJyZW50IHN0YXRlICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIEswLCBLMTsgICAgICAgICAvLyBLZXkKLXN0YXRpYyB1bnNpZ25lZCBsb25nIE07ICAgICAgICAgICAgICAvLyBNZXNzYWdlIGFjY3VtdWxhdG9yIChzaW5nbGUgd29yZCkKK3N0YXRpYyB1MzIgSzAsIEsxOwkvKiBLZXkgKi8KK3N0YXRpYyB1MzIgTTsJCS8qIE1lc3NhZ2UgYWNjdW11bGF0b3IgKHNpbmdsZSB3b3JkKSAqLwogc3RhdGljIHVuc2lnbmVkIGludCBuQnl0ZXNJbk07ICAgICAgLy8gIyBieXRlcyBpbiBNCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC05OCw3ICs5OCw3IEBACiAJTSA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNfdlNldEtleSh1bnNpZ25lZCBsb25nIGR3SzAsIHVuc2lnbmVkIGxvbmcgZHdLMSkKK3N0YXRpYyB2b2lkIHNfdlNldEtleSh1MzIgZHdLMCwgdTMyIGR3SzEpCiB7CiAJLy8gU2V0IHRoZSBrZXkKIAlLMCA9IGR3SzA7CkBAIC0xMjksNyArMTI5LDcgQEAKIAl9CiB9CiAKLXZvaWQgTUlDX3ZJbml0KHVuc2lnbmVkIGxvbmcgZHdLMCwgdW5zaWduZWQgbG9uZyBkd0sxKQordm9pZCBNSUNfdkluaXQodTMyIGR3SzAsIHUzMiBkd0sxKQogewogCS8vIFNldCB0aGUga2V5CiAJc192U2V0S2V5KGR3SzAsIGR3SzEpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJfQogfQogCi12b2lkIE1JQ192R2V0TUlDKHVuc2lnbmVkIGxvbmcgKnBkd0wsIHVuc2lnbmVkIGxvbmcgKnBkd1IpCit2b2lkIE1JQ192R2V0TUlDKHUzMiAqcGR3TCwgdTMyICpwZHdSKQogewogCS8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCiAJc192QXBwZW5kQnl0ZSgweDVhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWljaGFlbC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmgKaW5kZXggMzg3ZDIwNi4uZjZjMmMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWNoYWVsLmgKQEAgLTMxLDExICszMSwxMyBAQAogI2lmbmRlZiBfX01JQ0hBRUxfSF9fCiAjZGVmaW5lIF9fTUlDSEFFTF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVHlwZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgTUlDX3ZJbml0KHVuc2lnbmVkIGxvbmcgZHdLMCwgdW5zaWduZWQgbG9uZyBkd0sxKTsKK3ZvaWQgTUlDX3ZJbml0KHUzMiBkd0swLCB1MzIgZHdLMSk7CiAKIHZvaWQgTUlDX3ZVbkluaXQodm9pZCk7CiAKQEAgLTQ0LDcgKzQ2LDcgQEAKIAogLyogR2V0IHRoZSBNSUMgcmVzdWx0LiBEZXN0aW5hdGlvbiBzaG91bGQgYWNjZXB0IDggYnl0ZXMgb2YgcmVzdWx0LiAqLwogLyogVGhpcyBhbHNvIHJlc2V0cyB0aGUgbWVzc2FnZSB0byBlbXB0eS4gKi8KLXZvaWQgTUlDX3ZHZXRNSUModW5zaWduZWQgbG9uZyAqcGR3TCwgdW5zaWduZWQgbG9uZyAqcGR3Uik7Cit2b2lkIE1JQ192R2V0TUlDKHUzMiAqcGR3TCwgdTMyICpwZHdSKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwppbmRleCA2YWZmZDZlLi5jMjY1M2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwpAQCAtMTI1NywxMSArMTI1NywxMSBAQAogLy8gICAgdW5zaWduZWQgY2hhciBhYnlUbXBbOF07CiAvLyAgICB1bnNpZ25lZCBsb25nIGR3Q1JDOwogCXVuc2lnbmVkIGludCBjYk1JQ0hEUiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBkd01JQ0tleTAsIGR3TUlDS2V5MTsKLQl1bnNpZ25lZCBsb25nIGR3TUlDX1ByaW9yaXR5OwotCXVuc2lnbmVkIGxvbmcgKnBkd01JQ19MOwotCXVuc2lnbmVkIGxvbmcgKnBkd01JQ19SOwotCXVuc2lnbmVkIGxvbmcgZHdTYWZlTUlDX0wsIGR3U2FmZU1JQ19SOyAvL0ZpeCAiTGFzdCBGcmFnIFNpemUiIDwgIk1JQyBsZW5ndGgiLgorCXUzMiBkd01JQ0tleTAsIGR3TUlDS2V5MTsKKwl1MzIgZHdNSUNfUHJpb3JpdHk7CisJdTMyICpwZHdNSUNfTDsKKwl1MzIgKnBkd01JQ19SOworCXUzMiBkd1NhZmVNSUNfTCwgZHdTYWZlTUlDX1I7IC8qIEZpeCAiTGFzdCBGcmFnIFNpemUiIDwgIk1JQyBsZW5ndGgiLiAqLwogCWJvb2wgYk1JQzJGcmFnID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHVNSUNGcmFnTGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgdU1BQ2ZyYWdOdW0gPSAxOwpAQCAtMTQzNCwyMSArMTQzNCwyMSBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAJaWYgKChiTmVlZEVuY3J5cHQgPT0gdHJ1ZSkgJiYgKHBUcmFuc21pdEtleSAhPSBOVUxMKSAmJiAocFRyYW5zbWl0S2V5LT5ieUNpcGhlclN1aXRlID09IEtFWV9DVExfVEtJUCkpIHsKIAkJaWYgKHBEZXZpY2UtPnBNZ210LT5lQXV0aGVuTW9kZSA9PSBXTUFDX0FVVEhfV1BBTk9ORSkgewotCQkJZHdNSUNLZXkwID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsxNl0pOwotCQkJZHdNSUNLZXkxID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyMF0pOworCQkJZHdNSUNLZXkwID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisJCQlkd01JQ0tleTEgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjBdKTsKIAkJfSBlbHNlIGlmICgocFRyYW5zbWl0S2V5LT5kd0tleUluZGV4ICYgQVVUSEVOVElDQVRPUl9LRVkpICE9IDApIHsKLQkJCWR3TUlDS2V5MCA9ICoodW5zaWduZWQgbG9uZyAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMTZdKTsKLQkJCWR3TUlDS2V5MSA9ICoodW5zaWduZWQgbG9uZyAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjBdKTsKKwkJCWR3TUlDS2V5MCA9ICoodTMyICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsxNl0pOworCQkJZHdNSUNLZXkxID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzIwXSk7CiAJCX0gZWxzZSB7Ci0JCQlkd01JQ0tleTAgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI0XSk7Ci0JCQlkd01JQ0tleTEgPSAqKHVuc2lnbmVkIGxvbmcgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzI4XSk7CisJCQlkd01JQ0tleTAgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjRdKTsKKwkJCWR3TUlDS2V5MSA9ICoodTMyICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyOF0pOwogCQl9CiAJCS8vIERPIFNvZnR3YXJlIE1pY2hhZWwKIAkJTUlDX3ZJbml0KGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKIAkJTUlDX3ZBcHBlbmQoKHVuc2lnbmVkIGNoYXIgKikmKHBzRXRoSGVhZGVyLT5hYnlEc3RBZGRyWzBdKSwgMTIpOwogCQlkd01JQ19Qcmlvcml0eSA9IDA7CiAJCU1JQ192QXBwZW5kKCh1bnNpZ25lZCBjaGFyICopJmR3TUlDX1ByaW9yaXR5LCA0KTsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDIEtFWTogJWxYLCAlbFhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDIEtFWTogJVgsICVYXG4iLCBkd01JQ0tleTAsIGR3TUlDS2V5MSk7CiAJfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNjI0LDEwICsxNjI0LDEwIEBACiAJCQkJCWlmIChiTUlDMkZyYWcgPT0gZmFsc2UpIHsKIAkJCQkJCWlmICh1VG1wTGVuICE9IDApCiAJCQkJCQkJTUlDX3ZBcHBlbmQoKHBieUJ1ZmZlciArIHVMZW5ndGgpLCB1VG1wTGVuKTsKLQkJCQkJCXBkd01JQ19MID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4pOwotCQkJCQkJcGR3TUlDX1IgPSAodW5zaWduZWQgbG9uZyAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbiArIDQpOworCQkJCQkJcGR3TUlDX0wgPSAodTMyICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuKTsKKwkJCQkJCXBkd01JQ19SID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbiArIDQpOwogCQkJCQkJTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKLQkJCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkxhc3QgTUlDOiVsWCwgJWxYXG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CisJCQkJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJMYXN0IE1JQzolWCwgJVhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWlmICh1TUlDRnJhZ0xlbiA+PSA0KSB7CiAJCQkJCQkJbWVtY3B5KChwYnlCdWZmZXIgKyB1TGVuZ3RoKSwgKCh1bnNpZ25lZCBjaGFyICopJmR3U2FmZU1JQ19SICsgKHVNSUNGcmFnTGVuIC0gNCkpLApAQCAtMTc0NCw4ICsxNzQ0LDggQEAKIAkJCQkJCXVNSUNGcmFnTGVuID0gY2JGcmFnUGF5bG9hZFNpemUgLSB1VG1wTGVuOwogCQkJCQkJQVNTRVJUKHVNSUNGcmFnTGVuIDwgY2JNSUNsZW4pOwogCi0JCQkJCQlwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggKyB1VG1wTGVuKTsKLQkJCQkJCXBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4gKyA0KTsKKwkJCQkJCXBkd01JQ19MID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoICsgdVRtcExlbik7CisJCQkJCQlwZHdNSUNfUiA9ICh1MzIgKikocGJ5QnVmZmVyICsgdUxlbmd0aCArIHVUbXBMZW4gKyA0KTsKIAkJCQkJCU1JQ192R2V0TUlDKHBkd01JQ19MLCBwZHdNSUNfUik7CiAJCQkJCQlkd1NhZmVNSUNfTCA9ICpwZHdNSUNfTDsKIAkJCQkJCWR3U2FmZU1JQ19SID0gKnBkd01JQ19SOwpAQCAtMTc1OSw3ICsxNzU5LDcgQEAKIAkJCQkJCSAgfQogCQkJCQkJICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJcbiIpOwogCQkJCQkJKi8KLQkJCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkdldCBNSUM6JWxYLCAlbFhcbiIsICpwZHdNSUNfTCwgKnBkd01JQ19SKTsKKwkJCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkdldCBNSUM6JVgsICVYXG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CiAJCQkJCX0KIAkJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTWlkZGxlIGZyYWcgbGVuOiAlZFxuIiwgdVRtcExlbik7CiAJCQkJCS8qCkBAIC0xODczLDggKzE4NzMsOCBAQAogCiAJCQlNSUNfdkFwcGVuZCgocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4pLCBjYkZyYW1lQm9keVNpemUpOwogCi0JCQlwZHdNSUNfTCA9ICh1bnNpZ25lZCBsb25nICopKHBieUJ1ZmZlciArIHVMZW5ndGggLSBjYjgwMl8xX0hfbGVuICsgY2JGcmFtZUJvZHlTaXplKTsKLQkJCXBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4gKyBjYkZyYW1lQm9keVNpemUgKyA0KTsKKwkJCXBkd01JQ19MID0gKHUzMiAqKShwYnlCdWZmZXIgKyB1TGVuZ3RoIC0gY2I4MDJfMV9IX2xlbiArIGNiRnJhbWVCb2R5U2l6ZSk7CisJCQlwZHdNSUNfUiA9ICh1MzIgKikocGJ5QnVmZmVyICsgdUxlbmd0aCAtIGNiODAyXzFfSF9sZW4gKyBjYkZyYW1lQm9keVNpemUgKyA0KTsKIAogCQkJTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKIAkJCU1JQ192VW5Jbml0KCk7CkBAIC0xODg3LDcgKzE4ODcsNyBAQAogCiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJ1TGVuZ3RoOiAlZCwgJWRcbiIsIHVMZW5ndGgsIGNiRnJhbWVCb2R5U2l6ZSk7CiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJjYlJlcUNvdW50OiVkLCAlZCwgJWQsICVkXG4iLCBjYlJlcUNvdW50LCBjYkhlYWRlckxlbmd0aCwgdVBhZGRpbmcsIGNiSVZsZW4pOwotCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDOiVseCwgJWx4XG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJNSUM6JXgsICV4XG4iLCAqcGR3TUlDX0wsICpwZHdNSUNfUik7CiAvKgogICBmb3IgKGlpID0gMDsgaWkgPCA4OyBpaSsrKSB7CiAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIiUwMnggIiwgKigoKHVuc2lnbmVkIGNoYXIgKikocGR3TUlDX0wpICsgaWkpKSk7CkBAIC0yNTkyLDEwICsyNTkyLDEwIEBACiAJdW5zaWduZWQgaW50IHVQYWRkaW5nID0gMDsKIAl1bnNpZ25lZCBpbnQgY2JNSUNIRFIgPSAwOwogCXVuc2lnbmVkIGludCB1TGVuZ3RoID0gMDsKLQl1bnNpZ25lZCBsb25nIGR3TUlDS2V5MCwgZHdNSUNLZXkxOwotCXVuc2lnbmVkIGxvbmcgZHdNSUNfUHJpb3JpdHk7Ci0JdW5zaWduZWQgbG9uZyAqcGR3TUlDX0w7Ci0JdW5zaWduZWQgbG9uZyAqcGR3TUlDX1I7CisJdTMyIGR3TUlDS2V5MCwgZHdNSUNLZXkxOworCXUzMiBkd01JQ19Qcmlvcml0eTsKKwl1MzIgKnBkd01JQ19MOworCXUzMiAqcGR3TUlDX1I7CiAJdW5zaWduZWQgc2hvcnQgd1R4QnVmU2l6ZTsKIAl1bnNpZ25lZCBpbnQgY2JNYWNIZExlbjsKIAlTRXRoZXJuZXRIZWFkZXIgc0V0aEhlYWRlcjsKQEAgLTI4NDEsMjIgKzI4NDEsMjIgQEAKIAkJfQogCiAJCWlmICgocFRyYW5zbWl0S2V5ICE9IE5VTEwpICYmIChwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPT0gS0VZX0NUTF9US0lQKSkgewotCQkJZHdNSUNLZXkwID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsxNl0pOwotCQkJZHdNSUNLZXkxID0gKih1bnNpZ25lZCBsb25nICopKCZwVHJhbnNtaXRLZXktPmFieUtleVsyMF0pOworCQkJZHdNSUNLZXkwID0gKih1MzIgKikoJnBUcmFuc21pdEtleS0+YWJ5S2V5WzE2XSk7CisJCQlkd01JQ0tleTEgPSAqKHUzMiAqKSgmcFRyYW5zbWl0S2V5LT5hYnlLZXlbMjBdKTsKIAogCQkJLy8gRE8gU29mdHdhcmUgTWljaGFlbAogCQkJTUlDX3ZJbml0KGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKIAkJCU1JQ192QXBwZW5kKCh1bnNpZ25lZCBjaGFyICopJihzRXRoSGVhZGVyLmFieURzdEFkZHJbMF0pLCAxMik7CiAJCQlkd01JQ19Qcmlvcml0eSA9IDA7CiAJCQlNSUNfdkFwcGVuZCgodW5zaWduZWQgY2hhciAqKSZkd01JQ19Qcmlvcml0eSwgNCk7Ci0JCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJETUEwX3R4XzgwMjE6TUlDIEtFWTogJWxYLCAlbFhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRNQTBfdHhfODAyMTpNSUMgS0VZOiAlWCwgJVhcbiIsIGR3TUlDS2V5MCwgZHdNSUNLZXkxKTsKIAogCQkJdUxlbmd0aCA9IGNiSGVhZGVyU2l6ZSArIGNiTWFjSGRMZW4gKyB1UGFkZGluZyArIGNiSVZsZW47CiAKIAkJCU1JQ192QXBwZW5kKChwYnlUeEJ1ZmZlckFkZHIgKyB1TGVuZ3RoKSwgY2JGcmFtZUJvZHlTaXplKTsKIAotCQkJcGR3TUlDX0wgPSAodW5zaWduZWQgbG9uZyAqKShwYnlUeEJ1ZmZlckFkZHIgKyB1TGVuZ3RoICsgY2JGcmFtZUJvZHlTaXplKTsKLQkJCXBkd01JQ19SID0gKHVuc2lnbmVkIGxvbmcgKikocGJ5VHhCdWZmZXJBZGRyICsgdUxlbmd0aCArIGNiRnJhbWVCb2R5U2l6ZSArIDQpOworCQkJcGR3TUlDX0wgPSAodTMyICopKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGggKyBjYkZyYW1lQm9keVNpemUpOworCQkJcGR3TUlDX1IgPSAodTMyICopKHBieVR4QnVmZmVyQWRkciArIHVMZW5ndGggKyBjYkZyYW1lQm9keVNpemUgKyA0KTsKIAogCQkJTUlDX3ZHZXRNSUMocGR3TUlDX0wsIHBkd01JQ19SKTsKIAkJCU1JQ192VW5Jbml0KCk7CkBAIC0yODY5LDcgKzI4NjksNyBAQAogCiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJ1TGVuZ3RoOiAlZCwgJWRcbiIsIHVMZW5ndGgsIGNiRnJhbWVCb2R5U2l6ZSk7CiAJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJjYlJlcUNvdW50OiVkLCAlZCwgJWQsICVkXG4iLCBjYlJlcUNvdW50LCBjYkhlYWRlclNpemUsIHVQYWRkaW5nLCBjYklWbGVuKTsKLQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIk1JQzolbHgsICVseFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiTUlDOiV4LCAleFxuIiwgKnBkd01JQ19MLCAqcGR3TUlDX1IpOwogCiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93bWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwppbmRleCA1MjAwYTJhLi5iNjczYmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwpAQCAtOTY3LDEwICs5NjcsMTAgQEAKIAkJc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogCQkvLyBkZWNvZGUgdGhlIGZyYW1lCiAJCXZNZ3JEZWNvZGVBc3NvY1Jlc3BvbnNlKCZzRnJhbWUpOwotCQlpZiAoKHNGcmFtZS5wd0NhcEluZm8gPT0gMCkgfHwKLQkJICAgIChzRnJhbWUucHdTdGF0dXMgPT0gMCkgfHwKLQkJICAgIChzRnJhbWUucHdBaWQgPT0gMCkgfHwKLQkJICAgIChzRnJhbWUucFN1cHBSYXRlcyA9PSAwKSkgeworCQlpZiAoKHNGcmFtZS5wd0NhcEluZm8gPT0gTlVMTCkgfHwKKwkJICAgIChzRnJhbWUucHdTdGF0dXMgPT0gTlVMTCkgfHwKKwkJICAgIChzRnJhbWUucHdBaWQgPT0gTlVMTCkgfHwKKwkJICAgIChzRnJhbWUucFN1cHBSYXRlcyA9PSBOVUxMKSkgewogCQkJREJHX1BPUlQ4MCgweENDKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTgxMiwxMCArMTgxMiwxMCBAQAogCS8vIGRlY29kZSB0aGUgYmVhY29uIGZyYW1lCiAJdk1nckRlY29kZUJlYWNvbigmc0ZyYW1lKTsKIAotCWlmICgoc0ZyYW1lLnB3QmVhY29uSW50ZXJ2YWwgPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wd0NhcEluZm8gPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wU1NJRCA9PSAwKSB8fAotCSAgICAoc0ZyYW1lLnBTdXBwUmF0ZXMgPT0gMCkpIHsKKwlpZiAoKHNGcmFtZS5wd0JlYWNvbkludGVydmFsID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucHdDYXBJbmZvID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucFNTSUQgPT0gTlVMTCkgfHwKKwkgICAgKHNGcmFtZS5wU3VwcFJhdGVzID09IE5VTEwpKSB7CiAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlJ4IGJlYWNvbiBmcmFtZSBlcnJvclxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0yMDcyLDcgKzIwNzIsNyBAQAogCQlpZiAoYlRTRkxhcmdlRGlmZikKIAkJCWJVcGRhdGVUU0YgPSB0cnVlOwogCi0JCWlmIChwRGV2aWNlLT5iRW5hYmxlUFNNb2RlICYmIChzRnJhbWUucFRJTSAhPSAwKSkgeworCQlpZiAocERldmljZS0+YkVuYWJsZVBTTW9kZSAmJiAoc0ZyYW1lLnBUSU0gIT0gTlVMTCkpIHsKIAkJCS8vIGRlYWwgd2l0aCBEVElNLCBhbmFseXNpcyBUSU0KIAkJCXBNZ210LT5iTXVsdGljYXN0VElNID0gV0xBTl9NR01UX0lTX01VTFRJQ0FTVF9USU0oc0ZyYW1lLnBUSU0tPmJ5Qml0TWFwQ3RsKSA/IHRydWUgOiBmYWxzZTsKIAkJCXBNZ210LT5ieURUSU1Db3VudCA9IHNGcmFtZS5wVElNLT5ieURUSU1Db3VudDsKQEAgLTQxMDcsMTEgKzQxMDcsMTEgQEAKIAlzRnJhbWUucEJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAJdk1nckRlY29kZVByb2JlUmVzcG9uc2UoJnNGcmFtZSk7CiAKLQlpZiAoKHNGcmFtZS5wcXdUaW1lc3RhbXAgPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wd0JlYWNvbkludGVydmFsID09IDApIHx8Ci0JICAgIChzRnJhbWUucHdDYXBJbmZvID09IDApIHx8Ci0JICAgIChzRnJhbWUucFNTSUQgPT0gMCkgfHwKLQkgICAgKHNGcmFtZS5wU3VwcFJhdGVzID09IDApKSB7CisJaWYgKChzRnJhbWUucHF3VGltZXN0YW1wID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucHdCZWFjb25JbnRlcnZhbCA9PSBOVUxMKSB8fAorCSAgICAoc0ZyYW1lLnB3Q2FwSW5mbyA9PSBOVUxMKSB8fAorCSAgICAoc0ZyYW1lLnBTU0lEID09IE5VTEwpIHx8CisJICAgIChzRnJhbWUucFN1cHBSYXRlcyA9PSBOVUxMKSkgewogCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQcm9iZSByZXNwOkZhaWwgYWRkcjpbJXBdIFxuIiwgcFJ4UGFja2V0LT5wODAyMTFIZWFkZXIpOwogCQlEQkdfUE9SVDgwKDB4Q0MpOwogCQlyZXR1cm47CkBAIC00MTIwLDcgKzQxMjAsNyBAQAogCWlmIChzRnJhbWUucFNTSUQtPmxlbiA9PSAwKQogCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJSeCBQcm9iZSByZXNwOiBTU0lEIGxlbiA9IDAgXG4iKTsKIAotCWlmIChzRnJhbWUucERTUGFybXMgIT0gMCkgeworCWlmIChzRnJhbWUucERTUGFybXMgIT0gTlVMTCkgewogCQlpZiAoYnlDdXJyQ2hhbm5lbCA+IENCX01BWF9DSEFOTkVMXzI0RykgewogCQkJLy8gY2hhbm5lbCByZW1hcHBpbmcgdG8KIAkJCWJ5SUVDaGFubmVsID0gZ2V0X2NoYW5uZWxfbWFwcGluZyhwTWdtdC0+cEFkYXB0ZXIsIHNGcmFtZS5wRFNQYXJtcy0+YnlDdXJyQ2hhbm5lbCwgUEhZX1RZUEVfMTFBKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFoZHIuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvODAyMTFoZHIuaAppbmRleCAwMDAzMDRmLi4xZTc3OGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2LzgwMjExaGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni84MDIxMWhkci5oCkBAIC0xNTEsNyArMTUxLDcgQEAKICNpZmRlZiBfX0JJR19FTkRJQU4KIAogLyogR0VUICYgU0VUIEZyYW1lIENvbnRyb2wgYml0ICovCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1BSVkVSKG4pICAgICgoKCh1MTYpKG4pID4+IDgpICYgKEJJVDAgfCBCSVQxKSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfUFJWRVIobikgICAgKCgodTE2KShuKSA+PiA4KSAmIChCSVQwIHwgQklUMSkpCiAjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZUWVBFKG4pICAgICgoKCh1MTYpKG4pID4+IDgpICYgKEJJVDIgfCBCSVQzKSkgPj4gMikKICNkZWZpbmUgV0xBTl9HRVRfRkNfRlNUWVBFKG4pICAgKCgoKHUxNikobikgPj4gOCkgXAogCQkJCSAgJiAoQklUNHxCSVQ1fEJJVDZ8QklUNykpID4+IDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Flc19jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Flc19jY21wLmMKaW5kZXggNjFiOWY3Yi4uZTJiZmE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9hZXNfY2NtcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYWVzX2NjbXAuYwpAQCAtMjY5LDkgKzI2OSw5IEBACiAJLyogTUlDX0hEUjEgKi8KIAlNSUNfSERSMVswXSA9ICh1OCkod0hMZW4gPj4gOCk7CiAJTUlDX0hEUjFbMV0gPSAodTgpKHdITGVuICYgMHhmZik7Ci0JYnlUbXAgPSAodTgpKHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgJiAweGZmKTsKKwlieVRtcCA9ICh1OCkobGUxNl90b19jcHUocE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCkgPj4gOCk7CiAJTUlDX0hEUjFbMl0gPSBieVRtcCAmIDB4OGY7Ci0JYnlUbXAgPSAodTgpKHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgPj4gOCk7CisJYnlUbXAgPSAodTgpKGxlMTZfdG9fY3B1KHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wpICYgMHhmZik7CiAJYnlUbXAgJj0gMHg4NzsKIAlNSUNfSERSMVszXSA9IGJ5VG1wIHwgMHg0MDsKIAltZW1jcHkoJihNSUNfSERSMVs0XSksIHBNQUNIZWFkZXItPmFkZHIxLCBFVEhfQUxFTik7CkBAIC0yNzksNyArMjc5LDcgQEAKIAogCS8qIE1JQ19IRFIyICovCiAJbWVtY3B5KCYoTUlDX0hEUjJbMF0pLCBwTUFDSGVhZGVyLT5hZGRyMywgRVRIX0FMRU4pOwotCWJ5VG1wID0gKHU4KShwTUFDSGVhZGVyLT5zZXFfY3RybCAmIDB4ZmYpOworCWJ5VG1wID0gKHU4KShsZTE2X3RvX2NwdShwTUFDSGVhZGVyLT5zZXFfY3RybCkgPj4gOCk7CiAJTUlDX0hEUjJbNl0gPSBieVRtcCAmIDB4MGY7CiAJTUlDX0hEUjJbN10gPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5oCmluZGV4IGMzMDE3YTcuLmY4NDNlNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5oCkBAIC0zOSwxMyArMzksNiBAQAogICAgIFBIWV9UWVBFXzExQQogfSBDQVJEX1BIWV9UWVBFLCAqUENBUkRfUEhZX1RZUEU7CiAKLXR5cGVkZWYgZW51bSBfQ0FSRF9PUF9NT0RFIHsKLSAgICBPUF9NT0RFX0lORlJBU1RSVUNUVVJFID0gMCwKLSAgICBPUF9NT0RFX0FESE9DLAotICAgIE9QX01PREVfQVAsCi0gICAgT1BfTU9ERV9VTktOT1dOCi19IENBUkRfT1BfTU9ERSwgKlBDQVJEX09QX01PREU7Ci0KICNkZWZpbmUgQ0JfTUFYX0NIQU5ORUxfMjRHICAxNAogI2RlZmluZSBDQl9NQVhfQ0hBTk5FTF81RyAgICAgICA0MiAvKiBhZGQgY2hhbm5lbDkoNTA0NU1IeiksIDQxPT0+NDIgKi8KICNkZWZpbmUgQ0JfTUFYX0NIQU5ORUwgICAgICAoQ0JfTUFYX0NIQU5ORUxfMjRHK0NCX01BWF9DSEFOTkVMXzVHKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlLmgKaW5kZXggMWY0MjI1Ny4uZTJhYmUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oCkBAIC0xNTgsMTAgKzE1OCwxMCBAQAogLyoKICAqIEVudW0gb2YgY29udGV4dCB0eXBlcyBmb3IgU2VuZFBhY2tldAogICovCi10eXBlZGVmIGVudW0gX0NPTlRFWFRfVFlQRSB7Ci0gICAgQ09OVEVYVF9EQVRBX1BBQ0tFVCA9IDEsCi0gICAgQ09OVEVYVF9NR01UX1BBQ0tFVAotfSBDT05URVhUX1RZUEU7CitlbnVtIHsKKwlDT05URVhUX0RBVEFfUEFDS0VUID0gMSwKKwlDT05URVhUX01HTVRfUEFDS0VUCit9OwogCiAvKiBSQ0IgKFJlY2VpdmUgQ29udHJvbCBCbG9jaykgKi8KIHN0cnVjdCB2bnRfcmNiIHsKQEAgLTE4MCw5ICsxODAsNyBAQAogCXN0cnVjdCBza19idWZmICpwUGFja2V0OwogCXN0cnVjdCB1cmIgKnBVcmI7CiAJdW5zaWduZWQgaW50IHVCdWZMZW47Ci0JQ09OVEVYVF9UWVBFIFR5cGU7Ci0Jc3RydWN0IGV0aGhkciBzRXRoSGVhZGVyOwotCXZvaWQgKk5leHQ7CisJdTggdHlwZTsKIAlib29sIGJCb29sSW5Vc2U7CiAJdW5zaWduZWQgY2hhciBEYXRhW01BWF9UT1RBTF9TSVpFX1dJVEhfQUxMX0hFQURFUlNdOwogfTsKQEAgLTIwNiwyOSArMjA0LDEwIEBACiAvKgogICogU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgVVNCIGludGVycnVwdCBwYWNrZXRzCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICB1RGF0YUxlbjsKLSAgICB1OCAqICAgICAgICAgICBwRGF0YUJ1ZjsKLSAgLyogc3RydWN0IHVyYiAqcFVyYjsgKi8KLSAgICBib29sICAgICAgICAgICAgYkluVXNlOwotfSBJTlRfQlVGRkVSLCAqUElOVF9CVUZGRVI7Ci0KLS8qIDA6MTFBIDE6MTFCIDI6MTFHICovCi10eXBlZGVmIGVudW0gX1ZJQV9CQl9UWVBFCi17Ci0gICAgQkJfVFlQRV8xMUEgPSAwLAotICAgIEJCX1RZUEVfMTFCLAotICAgIEJCX1RZUEVfMTFHCi19IFZJQV9CQl9UWVBFLCAqUFZJQV9CQl9UWVBFOwotCi0vKiAwOjExYSwgMToxMWIsIDI6MTFnYiAob25seSBDQ0sgaW4gQmFzaWNSYXRlKSwgMzoxMWdhKE9GRE0gaW4gQmFzaWNSYXRlKSAqLwotdHlwZWRlZiBlbnVtIF9WSUFfUEtUX1RZUEUKLXsKLSAgICBQS19UWVBFXzExQSA9IDAsCi0gICAgUEtfVFlQRV8xMUIsCi0gICAgUEtfVFlQRV8xMUdCLAotICAgIFBLX1RZUEVfMTFHQQotfSBWSUFfUEtUX1RZUEUsICpQVklBX1BLVF9UWVBFOworc3RydWN0IHZudF9pbnRlcnJ1cHRfYnVmZmVyIHsKKwl1OCAqZGF0YV9idWY7CisJYm9vbCBpbl91c2U7Cit9OwogCiAvKisrIE5ESVMgcmVsYXRlZCAqLwogCkBAIC0yOTcsMTYgKzI3Niw2IEBACiAgICAgUE1LSURfQ0FORElEQVRFIENhbmRpZGF0ZUxpc3RbTUFYX1BNS0lETElTVF07CiB9IFNQTUtJRENhbmRpZGF0ZUV2ZW50LCAqUFNQTUtJRENhbmRpZGF0ZUV2ZW50OwogCi0vKisrIDgwMi4xMWggcmVsYXRlZCAqLwotI2RlZmluZSBNQVhfUVVJRVRfQ09VTlQgICAgIDgKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnU1F1aWV0Q29udHJvbCB7Ci0gICAgYm9vbCAgICAgICAgYkVuYWJsZTsKLSAgICB1MzIgICAgICAgZHdTdGFydFRpbWU7Ci0gICAgdTggICAgICAgIGJ5UGVyaW9kOwotICAgIHUxNiAgICAgICAgd0R1cmF0aW9uOwotfSBTUXVpZXRDb250cm9sLCAqUFNRdWlldENvbnRyb2w7Ci0KIC8qIFRoZSByZWNlaXZlIGR1cGxpY2F0ZSBkZXRlY3Rpb24gY2FjaGUgZW50cnkgKi8KIHR5cGVkZWYgc3RydWN0IHRhZ1NDYWNoZUVudHJ5ewogICAgIHUxNiAgICAgICAgd0ZtU2VxdWVuY2U7CkBAIC0zODYsOCArMzU1LDYgQEAKIAogCU9QVElPTlMgc09wdHM7CiAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgQ21kV29ya0l0ZW07Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IEV2ZW50V29ya0l0ZW07CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlYWRfd29ya19pdGVtOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByeF9tbmdfd29ya19pdGVtOwogCkBAIC00MzcsMjkgKzQwNCwxMSBAQAogCXN0cnVjdCB2bnRfdHhfcGt0X2luZm8gcGt0X2luZm9bMTZdOwogCiAJLyogVmFyaWFibGVzIHRvIHRyYWNrIHJlc291cmNlcyBmb3IgdGhlIEludGVycnVwdCBJbiBQaXBlICovCi0JSU5UX0JVRkZFUiBpbnRCdWY7Ci0JaW50IGZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkOwotCWludCBiRXZlbnRBdmFpbGFibGU7CisJc3RydWN0IHZudF9pbnRlcnJ1cHRfYnVmZmVyIGludF9idWY7CiAKIAkvKiBkZWZhdWx0IGNvbmZpZyBmcm9tIGZpbGUgYnkgdXNlciBzZXR0aW5nICovCiAJREVGQVVMVF9DT05GSUcgY29uZmlnX2ZpbGU7CiAKLQkvKiBTdGF0aXN0aWMgZm9yIFVTQiAqLwotCXVuc2lnbmVkIGxvbmcgdWxCdWxrSW5Qb3N0ZWQ7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtJbkVycm9yOwotCXVuc2lnbmVkIGxvbmcgdWxCdWxrSW5Db250Q1JDRXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtJbkJ5dGVzUmVhZDsKLQotCXVuc2lnbmVkIGxvbmcgdWxCdWxrT3V0UG9zdGVkOwotCXVuc2lnbmVkIGxvbmcgdWxCdWxrT3V0RXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtPdXRDb250Q1JDRXJyb3I7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1bGtPdXRCeXRlc1dyaXRlOwotCi0JdW5zaWduZWQgbG9uZyB1bEludEluUG9zdGVkOwotCXVuc2lnbmVkIGxvbmcgdWxJbnRJbkVycm9yOwotCXVuc2lnbmVkIGxvbmcgdWxJbnRJbkNvbnRDUkNFcnJvcjsKLQl1bnNpZ25lZCBsb25nIHVsSW50SW5CeXRlc1JlYWQ7Ci0KIAkvKiBWZXJzaW9uIGNvbnRyb2wgKi8KIAl1MTYgd0Zpcm13YXJlVmVyc2lvbjsKIAl1OCBieUxvY2FsSUQ7CkBAIC00ODAsMTEgKzQyOSw2IEBACiAJaW50IGJFeGlzdFNXTmV0QWRkcjsKIAogCS8qIE1haW50YWluIHN0YXRpc3RpY2FsIGRlYnVnIGluZm8uICovCi0JdW5zaWduZWQgbG9uZyBwYWNrZXRzUmVjZWl2ZWQ7Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRzUmVjZWl2ZWREcm9wcGVkOwotCXVuc2lnbmVkIGxvbmcgcGFja2V0c1JlY2VpdmVkT3ZlcmZsb3c7Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRzU2VudDsKLQl1bnNpZ25lZCBsb25nIHBhY2tldHNTZW50RHJvcHBlZDsKIAl1bnNpZ25lZCBsb25nIFNlbmRDb250ZXh0c0luVXNlOwogCXVuc2lnbmVkIGxvbmcgUmN2QnVmZmVyc0luVXNlOwogCkBAIC01NDksOCArNDkzLDggQEAKIAl1OCAgYnlDV01heE1pbjsKIAogCS8qIFJhdGUgKi8KLQlWSUFfQkJfVFlQRSBieUJCVHlwZTsgLyogMDogMTFBLCAxOjExQiwgMjoxMUcgKi8KLQlWSUFfUEtUX1RZUEUgYnlQYWNrZXRUeXBlOyAvKiAwOjExYSAxOjExYiAyOjExZ2IgMzoxMWdhICovCisJdTggYnlCQlR5cGU7IC8qIDA6IDExQSwgMToxMUIsIDI6MTFHICovCisJdTggYnlQYWNrZXRUeXBlOyAvKiAwOjExYSAxOjExYiAyOjExZ2IgMzoxMWdhICovCiAJdTE2IHdCYXNpY1JhdGU7CiAJdTggYnlBQ0tSYXRlOwogCXU4IGJ5VG9wT0ZETUJhc2ljUmF0ZTsKQEAgLTU4OCw3ICs1MzIsOSBAQAogCXUxNiB3RnJhZ21lbnRhdGlvblRocmVzaG9sZDsKIAl1OCBieVNob3J0UmV0cnlMaW1pdDsKIAl1OCBieUxvbmdSZXRyeUxpbWl0OwotCUNBUkRfT1BfTU9ERSBlT1BNb2RlOworCisJZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlOworCiAJaW50IGJCU1NJREZpbHRlcjsKIAl1MTYgd01heFRyYW5zbWl0TVNEVUxpZmV0aW1lOwogCXU4IGFieUJTU0lEW0VUSF9BTEVOXTsKQEAgLTgwNyw1ICs3NTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZNUF9ESVNDT05ORUNURUQgfCBmTVBfUkVTRVRfSU5fUFJPR1JFU1MgfCBmTVBfSEFMVF9JTl9QUk9HUkVTUyB8IGZNUF9JTklUX0lOX1BST0dSRVNTIHwgZk1QX1NVUlBSSVNFX1JFTU9WRUQpKSA9PSAwKQogCiBpbnQgZGV2aWNlX2FsbG9jX2ZyYWdfYnVmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCBQU0RlRnJhZ0NvbnRyb2xCbG9jayBwRGVGKTsKK3ZvaWQgdm50X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IHZudF9wcml2YXRlICopOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCmluZGV4IGVjYTA0YzAuLjRjY2FhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYwpAQCAtNjI3LDcgKzYyNyw3IEBACiAKICAgICAvLyBOb3cgaXQgb25seSBzdXBwb3J0cyA4MDIuMTFnIEluZnJhc3RydWN0dXJlIE1vZGUsIGFuZCBzdXBwb3J0IHJhdGUgbXVzdCB1cCB0byA1NCBNYnBzCiAgICAgaWYgKHBEZXZpY2UtPmJEaXZlcnNpdHlFbmFibGUgJiYgKEZyYW1lU2l6ZT41MCkgJiYKLSAgICAgICAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKSAmJgorCXBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogICAgICAgIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkpIHsKICAgICAgICAgQkJ2QW50ZW5uYURpdmVyc2l0eShwRGV2aWNlLCBzX2J5R2V0UmF0ZUlkeCgqcGJ5UnhSYXRlKSwgMCk7CiAgICAgfQpAQCAtMTIyNywxNCArMTIyNywxMyBAQAogICAgIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcigodTggKikoc2tiLT5kYXRhK2NiSGVhZGVyT2Zmc2V0KSkpIHsKICAgICAgICBpZiAocE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUpIHsKIAotICAgICAgICAgICBza2JjcHkgPSBkZXZfYWxsb2Nfc2tiKChpbnQpcERldmljZS0+cnhfYnVmX3N6KTsKKwkgICAgc2tiY3B5ID0gbmV0ZGV2X2FsbG9jX3NrYihwRGV2aWNlLT5kZXYsIHBEZXZpY2UtPnJ4X2J1Zl9zeik7CiAKICAgICAgICAgLy8gaWYgYW55IG5vZGUgaW4gUFMgbW9kZSwgYnVmZmVyIHBhY2tldCB1bnRpbCBEVElNLgogICAgICAgICAgICBpZiAoc2tiY3B5ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX05PVElDRSwgS0VSTl9JTkZPICJyZWxheSBtdWx0aWNhc3Qgbm8gc2tiIGF2YWlsYWJsZSBcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgc2tiY3B5LT5kZXYgPSBwRGV2aWNlLT5kZXY7CiAgICAgICAgICAgICAgICBza2JjcHktPmxlbiA9IEZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgIG1lbWNweShza2JjcHktPmRhdGEsIHNrYi0+ZGF0YStjYkhlYWRlck9mZnNldCwgRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCYocE1nbXQtPnNOb2RlREJUYWJsZVswXS5zVHhQU1F1ZXVlKSwgc2tiY3B5KTsKQEAgLTEyOTUsNjMgKzEyOTQsNjYgQEAKIAogdm9pZCBSWHZXb3JrSXRlbShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlID0KKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZudF9wcml2YXRlLCByZWFkX3dvcmtfaXRlbSk7Ci0JaW50IG50U3RhdHVzOwotCXN0cnVjdCB2bnRfcmNiICpwUkNCID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCB2bnRfcmNiICpyY2IgPSBOVUxMOwogCi0JaWYgKHBEZXZpY2UtPkZsYWdzICYgZk1QX0RJU0NPTk5FQ1RFRCkKKwlpZiAocHJpdi0+RmxhZ3MgJiBmTVBfRElTQ09OTkVDVEVEKQogCQlyZXR1cm47CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+UnggUG9sbGluZyBUaHJlYWRcbiIpOwotICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5SeCBQb2xsaW5nIFRocmVhZFxuIik7CiAKLSAgICB3aGlsZSAoKHBEZXZpY2UtPkZsYWdzICYgZk1QX1BPU1RfUkVBRFMpICYmCi0gICAgICAgICAgICBNUF9JU19SRUFEWShwRGV2aWNlKSAmJgotICAgICAgICAgICAgKHBEZXZpY2UtPk51bVJlY3ZGcmVlTGlzdCAhPSAwKSApIHsKLSAgICAgICAgcFJDQiA9IHBEZXZpY2UtPkZpcnN0UmVjdkZyZWVMaXN0OwotICAgICAgICBwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QtLTsKLSAgICAgICAgRGVxdWV1ZVJDQihwRGV2aWNlLT5GaXJzdFJlY3ZGcmVlTGlzdCwgcERldmljZS0+TGFzdFJlY3ZGcmVlTGlzdCk7Ci0gICAgICAgIG50U3RhdHVzID0gUElQRW5zQnVsa0luVXNiUmVhZChwRGV2aWNlLCBwUkNCKTsKLSAgICB9Ci0gICAgcERldmljZS0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IGZhbHNlOwotICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAKLX0KKwl3aGlsZSAoKHByaXYtPkZsYWdzICYgZk1QX1BPU1RfUkVBRFMpICYmIE1QX0lTX1JFQURZKHByaXYpICYmCisJCQkocHJpdi0+TnVtUmVjdkZyZWVMaXN0ICE9IDApKSB7CisJCXJjYiA9IHByaXYtPkZpcnN0UmVjdkZyZWVMaXN0OwogCi12b2lkIFJYdkZyZWVSQ0Ioc3RydWN0IHZudF9yY2IgKnBSQ0IsIGludCBiUmVBbGxvY1NrYikKLXsKLQlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UgPSBwUkNCLT5wRGV2aWNlOworCQlwcml2LT5OdW1SZWN2RnJlZUxpc3QtLTsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5SWHZGcmVlUkNCXG4iKTsKKwkJRGVxdWV1ZVJDQihwcml2LT5GaXJzdFJlY3ZGcmVlTGlzdCwgcHJpdi0+TGFzdFJlY3ZGcmVlTGlzdCk7CiAKLQlpZiAoYlJlQWxsb2NTa2IgPT0gZmFsc2UpIHsKLQkJa2ZyZWVfc2tiKHBSQ0ItPnNrYik7Ci0JCWJSZUFsbG9jU2tiID0gdHJ1ZTsKKwkJc3RhdHVzID0gUElQRW5zQnVsa0luVXNiUmVhZChwcml2LCByY2IpOwogCX0KIAotICAgIGlmIChiUmVBbGxvY1NrYiA9PSB0cnVlKSB7Ci0gICAgICAgIHBSQ0ItPnNrYiA9IGRldl9hbGxvY19za2IoKGludClwRGV2aWNlLT5yeF9idWZfc3opOwotICAgICAgICAvLyB0b2RvIGVycm9yIGhhbmRsaW5nCi0gICAgICAgIGlmIChwUkNCLT5za2IgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSIiBGYWlsZWQgdG8gcmUtYWxsb2Mgcnggc2tiXG4iKTsKLSAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgcFJDQi0+c2tiLT5kZXYgPSBwRGV2aWNlLT5kZXY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8KLSAgICAvLyBJbnNlcnQgdGhlIFJDQiBiYWNrIGluIHRoZSBSZWN2IGZyZWUgbGlzdAotICAgIC8vCi0gICAgRW5xdWV1ZVJDQihwRGV2aWNlLT5GaXJzdFJlY3ZGcmVlTGlzdCwgcERldmljZS0+TGFzdFJlY3ZGcmVlTGlzdCwgcFJDQik7Ci0gICAgcERldmljZS0+TnVtUmVjdkZyZWVMaXN0Kys7CisJcHJpdi0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IGZhbHNlOwogCi0gICAgaWYgKChwRGV2aWNlLT5GbGFncyAmIGZNUF9QT1NUX1JFQURTKSAmJiBNUF9JU19SRUFEWShwRGV2aWNlKSAmJgotICAgICAgICAocERldmljZS0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9PSBmYWxzZSkgKSB7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKK30KIAotICAgICAgICBwRGV2aWNlLT5iSXNSeFdvcmtJdGVtUXVldWVkID0gdHJ1ZTsKLQlzY2hlZHVsZV93b3JrKCZwRGV2aWNlLT5yZWFkX3dvcmtfaXRlbSk7Ci0gICAgfQotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iPC0tLS1SWEZyZWVSQ0IgJWQgJWRcbiIscERldmljZS0+TnVtUmVjdkZyZWVMaXN0LCBwRGV2aWNlLT5OdW1SZWN2TW5nTGlzdCk7Cit2b2lkIFJYdkZyZWVSQ0Ioc3RydWN0IHZudF9yY2IgKnJjYiwgaW50IHJlX2FsbG9jX3NrYikKK3sKKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPSByY2ItPnBEZXZpY2U7CisKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+Ulh2RnJlZVJDQlxuIik7CisKKwlpZiAocmVfYWxsb2Nfc2tiID09IGZhbHNlKSB7CisJCWtmcmVlX3NrYihyY2ItPnNrYik7CisJCXJlX2FsbG9jX3NrYiA9IHRydWU7CisJfQorCisJaWYgKHJlX2FsbG9jX3NrYiA9PSB0cnVlKSB7CisJCXJjYi0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwcml2LT5kZXYsIHByaXYtPnJ4X2J1Zl9zeik7CisJCS8qIFRPRE8gZXJyb3IgaGFuZGxpbmcgKi8KKwkJaWYgKCFyY2ItPnNrYikgeworCQkJREJHX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX0VSUgorCQkJCSIgRmFpbGVkIHRvIHJlLWFsbG9jIHJ4IHNrYlxuIik7CisJCX0KKwl9CisKKwkvKiBJbnNlcnQgdGhlIFJDQiBiYWNrIGluIHRoZSBSZWN2IGZyZWUgbGlzdCAqLworCUVucXVldWVSQ0IocHJpdi0+Rmlyc3RSZWN2RnJlZUxpc3QsIHByaXYtPkxhc3RSZWN2RnJlZUxpc3QsIHJjYik7CisJcHJpdi0+TnVtUmVjdkZyZWVMaXN0Kys7CisKKwlpZiAoKHByaXYtPkZsYWdzICYgZk1QX1BPU1RfUkVBRFMpICYmIE1QX0lTX1JFQURZKHByaXYpICYmCisJCQkocHJpdi0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9PSBmYWxzZSkpIHsKKwkJcHJpdi0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IHRydWU7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlYWRfd29ya19pdGVtKTsKKwl9CisKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIjwtLS0tUlhGcmVlUkNCICVkICVkXG4iLAorCQkJcHJpdi0+TnVtUmVjdkZyZWVMaXN0LCBwcml2LT5OdW1SZWN2TW5nTGlzdCk7CiB9CiAKIHZvaWQgUlh2TW5nV29ya0l0ZW0oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmMKaW5kZXggZTBlOTM4Ni4uY2NhNTZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5jCkBAIC03MCwxMTkgKzcwLDExNyBAQAogCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5JbnRlcnJ1cHQgUG9sbGluZyBUaHJlYWRcbiIpOwogCiAJc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JaWYgKHBEZXZpY2UtPmZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkICE9IHRydWUpCi0JCW50U3RhdHVzID0gUElQRW5zSW50ZXJydXB0UmVhZChwRGV2aWNlKTsKKworCW50U3RhdHVzID0gUElQRW5zSW50ZXJydXB0UmVhZChwRGV2aWNlKTsKKwogCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiB9CiAKLXZvaWQgSU5UbnNQcm9jZXNzRGF0YShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCit2b2lkIElOVG5zUHJvY2Vzc0RhdGEoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotCVBTSU5URGF0YSBwSU5URGF0YTsKLQlzdHJ1Y3Qgdm50X21hbmFnZXIgKnBNZ210ID0gJnBEZXZpY2UtPnZudF9tZ210OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSAmcERldmljZS0+c3RhdHM7CisJc3RydWN0IHZudF9pbnRlcnJ1cHRfZGF0YSAqaW50X2RhdGE7CisJc3RydWN0IHZudF9tYW5hZ2VyICptZ210ID0gJnByaXYtPnZudF9tZ210OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKIAogCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zSW50ZXJydXB0UHJvY2Vzc0RhdGFcbiIpOwogCi0JcElOVERhdGEgPSAoUFNJTlREYXRhKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWY7Ci0JaWYgKHBJTlREYXRhLT5ieVRTUjAgJiBUU1JfVkFMSUQpIHsKLQkJaWYgKHBJTlREYXRhLT5ieVRTUjAgJiAoVFNSX1RNTyB8IFRTUl9SRVRSWVRNTykpCi0JCQlwRGV2aWNlLT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzKys7CisJaW50X2RhdGEgPSAoc3RydWN0IHZudF9pbnRlcnJ1cHRfZGF0YSAqKXByaXYtPmludF9idWYuZGF0YV9idWY7CisKKwlpZiAoaW50X2RhdGEtPnRzcjAgJiBUU1JfVkFMSUQpIHsKKwkJaWYgKGludF9kYXRhLT50c3IwICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQorCQkJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOwogCQllbHNlCi0JCQlwU3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJCXN0YXRzLT50eF9wYWNrZXRzKys7CiAKLQkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocERldmljZSwKLQkJCQkJcElOVERhdGEtPmJ5VFNSMCwKLQkJCQkJcElOVERhdGEtPmJ5UGt0MCk7Ci0JCS8qREJHX1BSTl9HUlAwMSgoIlRTUjAgJTAyeFxuIiwgcElOVERhdGEtPmJ5VFNSMCkpOyovCisJCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHByaXYsCisJCQkJCWludF9kYXRhLT50c3IwLAorCQkJCQlpbnRfZGF0YS0+cGt0MCk7CiAJfQotCWlmIChwSU5URGF0YS0+YnlUU1IxICYgVFNSX1ZBTElEKSB7Ci0JCWlmIChwSU5URGF0YS0+YnlUU1IxICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQotCQkJcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOworCisJaWYgKGludF9kYXRhLT50c3IxICYgVFNSX1ZBTElEKSB7CisJCWlmIChpbnRfZGF0YS0+dHNyMSAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKKwkJCXByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKIAkJZWxzZQotCQkJcFN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCiAKLQkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocERldmljZSwKLQkJCQkJcElOVERhdGEtPmJ5VFNSMSwKLQkJCQkJcElOVERhdGEtPmJ5UGt0MSk7Ci0JCS8qREJHX1BSTl9HUlAwMSgoIlRTUjEgJTAyeFxuIiwgcElOVERhdGEtPmJ5VFNSMSkpOyovCisJCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHByaXYsCisJCQkJCWludF9kYXRhLT50c3IxLAorCQkJCQlpbnRfZGF0YS0+cGt0MSk7CiAJfQotCWlmIChwSU5URGF0YS0+YnlUU1IyICYgVFNSX1ZBTElEKSB7Ci0JCWlmIChwSU5URGF0YS0+YnlUU1IyICYgKFRTUl9UTU8gfCBUU1JfUkVUUllUTU8pKQotCQkJcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllcysrOworCisJaWYgKGludF9kYXRhLT50c3IyICYgVFNSX1ZBTElEKSB7CisJCWlmIChpbnRfZGF0YS0+dHNyMiAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKKwkJCXByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKIAkJZWxzZQotCQkJcFN0YXRzLT50eF9wYWNrZXRzKys7CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCi0JCUJTU3ZVcGRhdGVOb2RlVHhDb3VudGVyKHBEZXZpY2UsCi0JCQkJCXBJTlREYXRhLT5ieVRTUjIsCi0JCQkJCXBJTlREYXRhLT5ieVBrdDIpOwotCQkvKkRCR19QUk5fR1JQMDEoKCJUU1IyICUwMnhcbiIsIHBJTlREYXRhLT5ieVRTUjIpKTsqLworCQlCU1N2VXBkYXRlTm9kZVR4Q291bnRlcihwcml2LAorCQkJCQlpbnRfZGF0YS0+dHNyMiwKKwkJCQkJaW50X2RhdGEtPnBrdDIpOwogCX0KLQlpZiAocElOVERhdGEtPmJ5VFNSMyAmIFRTUl9WQUxJRCkgewotCQlpZiAocElOVERhdGEtPmJ5VFNSMyAmIChUU1JfVE1PIHwgVFNSX1JFVFJZVE1PKSkKLQkJCXBEZXZpY2UtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMrKzsKKworCWlmIChpbnRfZGF0YS0+dHNyMyAmIFRTUl9WQUxJRCkgeworCQlpZiAoaW50X2RhdGEtPnRzcjMgJiAoVFNSX1RNTyB8IFRTUl9SRVRSWVRNTykpCisJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzKys7CiAJCWVsc2UKLQkJCXBTdGF0cy0+dHhfcGFja2V0cysrOworCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAotCQlCU1N2VXBkYXRlTm9kZVR4Q291bnRlcihwRGV2aWNlLAotCQkJCQlwSU5URGF0YS0+YnlUU1IzLAotCQkJCQlwSU5URGF0YS0+YnlQa3QzKTsKLQkJLypEQkdfUFJOX0dSUDAxKCgiVFNSMyAlMDJ4XG4iLCBwSU5URGF0YS0+YnlUU1IzKSk7Ki8KKwkJQlNTdlVwZGF0ZU5vZGVUeENvdW50ZXIocHJpdiwKKwkJCQkJaW50X2RhdGEtPnRzcjMsCisJCQkJCWludF9kYXRhLT5wa3QzKTsKIAl9Ci0JaWYgKHBJTlREYXRhLT5ieUlTUjAgIT0gMCkgewotCQlpZiAocElOVERhdGEtPmJ5SVNSMCAmIElTUl9CTlRYKSB7Ci0JCQlpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FQKSB7Ci0JCQkJaWYgKHBNZ210LT5ieURUSU1Db3VudCA+IDApIHsKLQkJCQkJcE1nbXQtPmJ5RFRJTUNvdW50LS07Ci0JCQkJCXBNZ210LT5zTm9kZURCVGFibGVbMF0uYlJ4UFNQb2xsID0KKworCWlmIChpbnRfZGF0YS0+aXNyMCAhPSAwKSB7CisJCWlmIChpbnRfZGF0YS0+aXNyMCAmIElTUl9CTlRYKSB7CisJCQlpZiAocHJpdi0+b3BfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgeworCQkJCWlmIChtZ210LT5ieURUSU1Db3VudCA+IDApIHsKKwkJCQkJbWdtdC0+YnlEVElNQ291bnQtLTsKKwkJCQkJbWdtdC0+c05vZGVEQlRhYmxlWzBdLmJSeFBTUG9sbCA9CiAJCQkJCQlmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKHBNZ210LT5ieURUSU1Db3VudCA9PSAwKSB7CisJCQkJfSBlbHNlIGlmIChtZ210LT5ieURUSU1Db3VudCA9PSAwKSB7CiAJCQkJCS8qIGNoZWNrIGlmIG11bHRpY2FzdCB0eCBidWZmZXJpbmcgKi8KLQkJCQkJcE1nbXQtPmJ5RFRJTUNvdW50ID0KLQkJCQkJCXBNZ210LT5ieURUSU1QZXJpb2QtMTsKLQkJCQkJcE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUnhQU1BvbGwgPSB0cnVlOwotCQkJCQlpZiAocE1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUpCi0JCQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisJCQkJCW1nbXQtPmJ5RFRJTUNvdW50ID0KKwkJCQkJCW1nbXQtPmJ5RFRJTVBlcmlvZC0xOworCQkJCQltZ210LT5zTm9kZURCVGFibGVbMF0uYlJ4UFNQb2xsID0gdHJ1ZTsKKwkJCQkJaWYgKG1nbXQtPnNOb2RlREJUYWJsZVswXS5iUFNFbmFibGUpCisJCQkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHByaXYsCiAJCQkJCQkJCSBXTEFOX0NNRF9SWF9QU1BPTEwsCiAJCQkJCQkJCSBOVUxMKTsKIAkJCQl9Ci0JCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLAorCQkJCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcHJpdiwKIAkJCQkJCVdMQU5fQ01EX0JFQ09OX1NFTkQsCiAJCQkJCQlOVUxMKTsKLQkJCX0gLyogaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BUCkgKi8KLQkJcERldmljZS0+YkJlYWNvblNlbnQgPSB0cnVlOworCQkJfQorCQkJcHJpdi0+YkJlYWNvblNlbnQgPSB0cnVlOwogCQl9IGVsc2UgewotCQkJcERldmljZS0+YkJlYWNvblNlbnQgPSBmYWxzZTsKKwkJCXByaXYtPmJCZWFjb25TZW50ID0gZmFsc2U7CiAJCX0KLQkJaWYgKHBJTlREYXRhLT5ieUlTUjAgJiBJU1JfVEJUVCkgewotCQkJaWYgKHBEZXZpY2UtPmJFbmFibGVQU01vZGUpCi0JCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLAorCisJCWlmIChpbnRfZGF0YS0+aXNyMCAmIElTUl9UQlRUKSB7CisJCQlpZiAocHJpdi0+YkVuYWJsZVBTTW9kZSkKKwkJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHByaXYsCiAJCQkJCQlXTEFOX0NNRF9UQlRUX1dBS0VVUCwKIAkJCQkJCU5VTEwpOwotCQkJaWYgKHBEZXZpY2UtPmJDaGFubmVsU3dpdGNoKSB7Ci0JCQkJcERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQtLTsKLQkJCQlpZiAocERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQgPT0gMCkKLQkJCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLAorCQkJaWYgKHByaXYtPmJDaGFubmVsU3dpdGNoKSB7CisJCQkJcHJpdi0+YnlDaGFubmVsU3dpdGNoQ291bnQtLTsKKwkJCQlpZiAocHJpdi0+YnlDaGFubmVsU3dpdGNoQ291bnQgPT0gMCkKKwkJCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwcml2LAogCQkJCQkJCVdMQU5fQ01EXzExSF9DSFNXLAogCQkJCQkJCU5VTEwpOwogCQkJfQogCQl9Ci0JCXBEZXZpY2UtPnF3Q3VyclRTRiA9IGNwdV90b19sZTY0KHBJTlREYXRhLT5xd1RTRik7Ci0JCS8qREJHX1BSTl9HUlAwMSgoIklTUjAgPSAlMDJ4ICwKLQkJICBMb1RzZiA9ICAlMDh4LAotCQkgIEhpVHNmID0gICUwOHhcbiIsCi0JCSAgcElOVERhdGEtPmJ5SVNSMCwKLQkJICBwSU5URGF0YS0+ZHdMb1RTRiwKLQkJICBwSU5URGF0YS0+ZHdIaVRTRikpOyAqLworCQlwcml2LT5xd0N1cnJUU0YgPSBsZTY0X3RvX2NwdShpbnRfZGF0YS0+dHNmKTsKIAl9Ci0JaWYgKHBJTlREYXRhLT5ieUlTUjEgIT0gMCkKLQkJaWYgKHBJTlREYXRhLT5ieUlTUjEgJiBJU1JfR1BJTzMpCi0JCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisKKwlpZiAoaW50X2RhdGEtPmlzcjEgIT0gMCkKKwkJaWYgKGludF9kYXRhLT5pc3IxICYgSVNSX0dQSU8zKQorCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwcml2LAogCQkJCQlXTEFOX0NNRF9SQURJTywKIAkJCQkJTlVMTCk7Ci0JcERldmljZS0+aW50QnVmLnVEYXRhTGVuID0gMDsKLQlwRGV2aWNlLT5pbnRCdWYuYkluVXNlID0gZmFsc2U7CiAKLQlwU3RhdHMtPnR4X2Vycm9ycyA9IHBEZXZpY2UtPndzdGF0cy5kaXNjYXJkLnJldHJpZXM7Ci0JcFN0YXRzLT50eF9kcm9wcGVkID0gcERldmljZS0+d3N0YXRzLmRpc2NhcmQucmV0cmllczsKKwlwcml2LT5pbnRfYnVmLmluX3VzZSA9IGZhbHNlOworCisJc3RhdHMtPnR4X2Vycm9ycyA9IHByaXYtPndzdGF0cy5kaXNjYXJkLnJldHJpZXM7CisJc3RhdHMtPnR4X2Ryb3BwZWQgPSBwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW50LmgKaW5kZXggOGU2ZTIxNy4uMDhkYjg2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2ludC5oCkBAIC0zMiwyOSArMzIsMjggQEAKIAogI2luY2x1ZGUgImRldmljZS5oIgogCi10eXBlZGVmIHN0cnVjdCB0YWdTSU5URGF0YSB7Ci0JdTggYnlUU1IwOwotCXU4IGJ5UGt0MDsKLQl1MTYgd1RpbWUwOwotCXU4IGJ5VFNSMTsKLQl1OCBieVBrdDE7Ci0JdTE2IHdUaW1lMTsKLQl1OCBieVRTUjI7Ci0JdTggYnlQa3QyOwotCXUxNiB3VGltZTI7Ci0JdTggYnlUU1IzOwotCXU4IGJ5UGt0MzsKLQl1MTYgd1RpbWUzOwotCXU2NCBxd1RTRjsKLQl1OCBieUlTUjA7Ci0JdTggYnlJU1IxOwotCXU4IGJ5UlRTU3VjY2VzczsKLQl1OCBieVJUU0ZhaWw7Ci0JdTggYnlBQ0tGYWlsOwotCXU4IGJ5RkNTRXJyOwotCXU4IGFieVNXWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCi1TSU5URGF0YSwgKlBTSU5URGF0YTsKK3N0cnVjdCB2bnRfaW50ZXJydXB0X2RhdGEgeworCXU4IHRzcjA7CisJdTggcGt0MDsKKwl1MTYgdGltZTA7CisJdTggdHNyMTsKKwl1OCBwa3QxOworCXUxNiB0aW1lMTsKKwl1OCB0c3IyOworCXU4IHBrdDI7CisJdTE2IHRpbWUyOworCXU4IHRzcjM7CisJdTggcGt0MzsKKwl1MTYgdGltZTM7CisJX19sZTY0IHRzZjsKKwl1OCBpc3IwOworCXU4IGlzcjE7CisJdTggcnRzX3N1Y2Nlc3M7CisJdTggcnRzX2ZhaWw7CisJdTggYWNrX2ZhaWw7CisJdTggZmNzX2VycjsKKwl1OCBzd1syXTsKK30gX19wYWNrZWQ7CiAKIHZvaWQgSU5UdldvcmtJdGVtKHN0cnVjdCB2bnRfcHJpdmF0ZSAqKTsKIHZvaWQgSU5UbnNQcm9jZXNzRGF0YShzdHJ1Y3Qgdm50X3ByaXZhdGUgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKaW5kZXggM2E2OGRmYS4uY2Y0YzA2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIndwYWN0bC5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKICNpbmNsdWRlICJybmRpcy5oIgorI2luY2x1ZGUgImJhc2ViYW5kLmgiCiAKIHN0YXRpYyBjb25zdCBsb25nIGZyZXF1ZW5jeV9saXN0W10gPSB7CiAJMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwgMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NCwKQEAgLTU3LDcgKzU4LDcgQEAKIAlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCWxvbmcgbGRCbTsKIAotCXBEZXZpY2UtPndzdGF0cy5zdGF0dXMgPSBwRGV2aWNlLT5lT1BNb2RlOworCXBEZXZpY2UtPndzdGF0cy5zdGF0dXMgPSBwRGV2aWNlLT5vcF9tb2RlOwogCVJGdlJTU0lUb2RCbShwRGV2aWNlLCAodTgpKHBEZXZpY2UtPnVDdXJyUlNTSSksICZsZEJtKTsKIAlwRGV2aWNlLT53c3RhdHMucXVhbC5sZXZlbCA9IGxkQm07CiAJcERldmljZS0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOwpAQCAtNzI0LDEwICs3MjUsMTAgQEAKIAlpZiAoIXdycS0+cG9pbnRlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzb2NrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIElXX01BWF9BUCwgR0ZQX0tFUk5FTCk7CisJc29jayA9IGtjYWxsb2MoSVdfTUFYX0FQLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNvY2sgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcXVhbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIElXX01BWF9BUCwgR0ZQX0tFUk5FTCk7CisJcXVhbCA9IGtjYWxsb2MoSVdfTUFYX0FQLCBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpLCBHRlBfS0VSTkVMKTsKIAlpZiAocXVhbCA9PSBOVUxMKSB7CiAJCWtmcmVlKHNvY2spOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEzOTQsNyArMTM5NSw4IEBACiAJaWYgKHBNZ210ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKCh3cnEtPmRpc2FibGVkID0gKG1vZGUgPT0gV01BQ19QT1dFUl9DQU0pKSkKKwl3cnEtPmRpc2FibGVkID0gKG1vZGUgPT0gV01BQ19QT1dFUl9DQU0pOworCWlmICh3cnEtPmRpc2FibGVkKQogCQlyZXR1cm4gMDsKIAogCWlmICgod3JxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCmluZGV4IDU0NDE0ZWQyNy4uM2NlMTlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCkBAIC00NywyNSArNDcsMTkgQEAKICAqCiAgKiBQYXJhbWV0ZXJzOgogICogIEluOgotICogICAgICB1Qnl0ZWlkeCAgICAtIEluZGV4IG9mIE1hc2sKLSAqICAgICAgYnlEYXRhICAgICAgLSBNYXNrIFZhbHVlIHRvIHdyaXRlCisgKgltY19maWx0ZXIgKG1hYyBmaWx0ZXIpCiAgKiAgT3V0OgogICogICAgICBub25lCiAgKgogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi12b2lkIE1BQ3ZXcml0ZU11bHRpQWRkcihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHUzMiB1Qnl0ZUlkeCwgdTggYnlEYXRhKQordm9pZCBNQUN2V3JpdGVNdWx0aUFkZHIoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1NjQgbWNfZmlsdGVyKQogewotCXU4IGJ5RGF0YTE7CisJX19sZTY0IGxlX21jID0gY3B1X3RvX2xlNjQobWNfZmlsdGVyKTsKIAotICAgIGJ5RGF0YTEgPSBieURhdGE7Ci0gICAgQ09OVFJPTG5zUmVxdWVzdE91dChwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9UWVBFX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHUxNikgKE1BQ19SRUdfTUFSMCArIHVCeXRlSWR4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJmJ5RGF0YTEpOworCUNPTlRST0xuc1JlcXVlc3RPdXQocERldmljZSwgTUVTU0FHRV9UWVBFX1dSSVRFLCBNQUNfUkVHX01BUjAsCisJCU1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIHNpemVvZihsZV9tYyksICh1OCAqKSZsZV9tYyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuaAppbmRleCAwZGIxYmU1Li40MDUzZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmgKQEAgLTQwMyw3ICs0MDMsNyBAQAogI2RlZmluZSBNQUNfUkVWSVNJT05fQTAgICAgIDB4MDAKICNkZWZpbmUgTUFDX1JFVklTSU9OX0ExICAgICAweDAxCiAKLXZvaWQgTUFDdldyaXRlTXVsdGlBZGRyKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1MzIsIHU4KTsKK3ZvaWQgTUFDdldyaXRlTXVsdGlBZGRyKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1NjQpOwogdm9pZCBNQUNiU2h1dGRvd24oc3RydWN0IHZudF9wcml2YXRlICopOwogdm9pZCBNQUN2U2V0QkJUeXBlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1OCk7CiB2b2lkIE1BQ3ZEaXNhYmxlS2V5RW50cnkoc3RydWN0IHZudF9wcml2YXRlICosIHUzMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggNThlZGNhZS4uM2M5MzIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgcERldmljZS0+YnlTaG9ydFByZWFtYmxlID0gUFJFQU1CTEVfVFlQRV9ERUY7CiAgICAgcERldmljZS0+ZVBTTW9kZSA9IFBTX01PREVfREVGOwogICAgIHBEZXZpY2UtPmIxMWhFbmFibGUgPSBYODAyMTFoX01PREVfREVGOwotICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0RFRjsKKyAgICBwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CiAgICAgcERldmljZS0+dUNvbm5lY3Rpb25SYXRlID0gREFUQV9SQVRFX0RFRjsKICAgICBpZiAocERldmljZS0+dUNvbm5lY3Rpb25SYXRlIDwgUkFURV9BVVRPKSBwRGV2aWNlLT5iRml4UmF0ZSA9IHRydWU7CiAgICAgcERldmljZS0+YnlCQlR5cGUgPSBCQlBfVFlQRV9ERUY7CkBAIC00MDksNyArNDA5LDcgQEAKIAogCQlpZiAocERldmljZS0+YWJ5Q0NLUHdyVGJsW2lpXSA9PSAwKQogCQkJcERldmljZS0+YWJ5Q0NLUHdyVGJsW2lpXSA9IHBEZXZpY2UtPmJ5Q0NLUHdyOwotCQkJcERldmljZS0+YWJ5T0ZETVB3clRibFtpaV0gPQorCQlwRGV2aWNlLT5hYnlPRkRNUHdyVGJsW2lpXSA9CiAJCQkJcERldmljZS0+YWJ5RUVQUk9NW2lpICsgRUVQX09GU19PRkRNX1BXUl9UQkxdOwogCQlpZiAocERldmljZS0+YWJ5T0ZETVB3clRibFtpaV0gPT0gMCkKIAkJCXBEZXZpY2UtPmFieU9GRE1Qd3JUYmxbaWldID0gcERldmljZS0+YnlPRkRNUHdyRzsKQEAgLTc0OSw0NCArNzQ5LDQ3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV90eF9idWZzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSkKK3N0YXRpYyB2b2lkIGRldmljZV9mcmVlX3R4X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqcFR4Q29udGV4dDsKLSAgICBpbnQgaWk7Ci0KLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwRGV2aWNlLT5jYlREOyBpaSsrKSB7Ci0KLSAgICAgICAgcFR4Q29udGV4dCA9IHBEZXZpY2UtPmFwVERbaWldOwotCS8qIGRlYWxsb2NhdGUgVVJCcyAqLwotICAgICAgICBpZiAocFR4Q29udGV4dC0+cFVyYikgewotICAgICAgICAgICAgdXNiX2tpbGxfdXJiKHBUeENvbnRleHQtPnBVcmIpOwotICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKHBUeENvbnRleHQtPnBVcmIpOwotICAgICAgICB9Ci0gICAgICAgIGtmcmVlKHBUeENvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGRldmljZV9mcmVlX3J4X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQotewotCXN0cnVjdCB2bnRfcmNiICpwUkNCOworCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqdHhfY29udGV4dDsKIAlpbnQgaWk7CiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwRGV2aWNlLT5jYlJEOyBpaSsrKSB7CisJZm9yIChpaSA9IDA7IGlpIDwgcHJpdi0+Y2JURDsgaWkrKykgeworCQl0eF9jb250ZXh0ID0gcHJpdi0+YXBURFtpaV07CisJCS8qIGRlYWxsb2NhdGUgVVJCcyAqLworCQlpZiAodHhfY29udGV4dC0+cFVyYikgeworCQkJdXNiX2tpbGxfdXJiKHR4X2NvbnRleHQtPnBVcmIpOworCQkJdXNiX2ZyZWVfdXJiKHR4X2NvbnRleHQtPnBVcmIpOworCQl9CiAKLSAgICAgICAgcFJDQiA9IHBEZXZpY2UtPmFwUkNCW2lpXTsKLQkvKiBkZWFsbG9jYXRlIFVSQnMgKi8KLSAgICAgICAgaWYgKHBSQ0ItPnBVcmIpIHsKLSAgICAgICAgICAgIHVzYl9raWxsX3VyYihwUkNCLT5wVXJiKTsKLSAgICAgICAgICAgIHVzYl9mcmVlX3VyYihwUkNCLT5wVXJiKTsKLSAgICAgICAgfQotCS8qIGRlYWxsb2NhdGUgc2tiICovCi0gICAgICAgIGlmIChwUkNCLT5za2IpCi0gICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHBSQ0ItPnNrYik7Ci0gICAgfQotICAgIGtmcmVlKHBEZXZpY2UtPnBSQ0JNZW0pOworCQlrZnJlZSh0eF9jb250ZXh0KTsKKwl9CiAKLSAgICByZXR1cm47CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV9yeF9idWZzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3Qgdm50X3JjYiAqcmNiOworCWludCBpaTsKKworCWZvciAoaWkgPSAwOyBpaSA8IHByaXYtPmNiUkQ7IGlpKyspIHsKKwkJcmNiID0gcHJpdi0+YXBSQ0JbaWldOworCisJCS8qIGRlYWxsb2NhdGUgVVJCcyAqLworCQlpZiAocmNiLT5wVXJiKSB7CisJCQl1c2Jfa2lsbF91cmIocmNiLT5wVXJiKTsKKwkJCXVzYl9mcmVlX3VyYihyY2ItPnBVcmIpOworCQl9CisKKwkJLyogZGVhbGxvY2F0ZSBza2IgKi8KKwkJaWYgKHJjYi0+c2tiKQorCQkJZGV2X2tmcmVlX3NrYihyY2ItPnNrYik7CisJfQorCisJa2ZyZWUocHJpdi0+cFJDQk1lbSk7CisKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHVzYl9kZXZpY2VfcmVzZXQoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQpAQCAtNzk4LDk1ICs4MDEsMTA5IEBACiAJcmV0dXJuIDsKIH0KIAotc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfaW50X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQorc3RhdGljIHZvaWQgZGV2aWNlX2ZyZWVfaW50X2J1ZnMoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotICAgIGtmcmVlKHBEZXZpY2UtPmludEJ1Zi5wRGF0YUJ1Zik7Ci0gICAgcmV0dXJuOworCWtmcmVlKHByaXYtPmludF9idWYuZGF0YV9idWYpOworCisJcmV0dXJuOwogfQogCi1zdGF0aWMgYm9vbCBkZXZpY2VfYWxsb2NfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCitzdGF0aWMgYm9vbCBkZXZpY2VfYWxsb2NfYnVmcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYpCiB7Ci0Jc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpwVHhDb250ZXh0OwotCXN0cnVjdCB2bnRfcmNiICpwUkNCOworCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqdHhfY29udGV4dDsKKwlzdHJ1Y3Qgdm50X3JjYiAqcmNiOwogCWludCBpaTsKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmNiVEQ7IGlpKyspIHsKLQotCXBUeENvbnRleHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKHBUeENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSICIlcyA6IGFsbG9jYXRlIHR4IHVzYiBjb250ZXh0IGZhaWxlZFxuIiwgcERldmljZS0+ZGV2LT5uYW1lKTsKLSAgICAgICAgICAgIGdvdG8gZnJlZV90eDsKLSAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5hcFREW2lpXSA9IHBUeENvbnRleHQ7Ci0JcFR4Q29udGV4dC0+cERldmljZSA9ICh2b2lkICopIHBEZXZpY2U7Ci0JLyogYWxsb2NhdGUgVVJCcyAqLwotICAgICAgICBwVHhDb250ZXh0LT5wVXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgaWYgKHBUeENvbnRleHQtPnBVcmIgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSICJhbGxvYyB0eCB1cmIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gZnJlZV90eDsKLSAgICAgICAgfQotICAgICAgICBwVHhDb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgUkNCIG1lbSAqLwotCXBEZXZpY2UtPnBSQ0JNZW0gPSBremFsbG9jKChzaXplb2Yoc3RydWN0IHZudF9yY2IpICogcERldmljZS0+Y2JSRCksCisJZm9yIChpaSA9IDA7IGlpIDwgcHJpdi0+Y2JURDsgaWkrKykgeworCQl0eF9jb250ZXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0KSwKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKHBEZXZpY2UtPnBSQ0JNZW0gPT0gTlVMTCkgewotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIgIiVzIDogYWxsb2MgcnggdXNiIGNvbnRleHQgZmFpbGVkXG4iLCBwRGV2aWNlLT5kZXYtPm5hbWUpOwotICAgICAgICBnb3RvIGZyZWVfdHg7Ci0gICAgfQorCQlpZiAodHhfY29udGV4dCA9PSBOVUxMKSB7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSCisJCQkJIiVzIDogYWxsb2NhdGUgdHggdXNiIGNvbnRleHQgZmFpbGVkXG4iLAorCQkJCQlwcml2LT5kZXYtPm5hbWUpOworCQkJZ290byBmcmVlX3R4OworCQl9CiAKLSAgICBwRGV2aWNlLT5GaXJzdFJlY3ZGcmVlTGlzdCA9IE5VTEw7Ci0gICAgcERldmljZS0+TGFzdFJlY3ZGcmVlTGlzdCA9IE5VTEw7Ci0gICAgcERldmljZS0+Rmlyc3RSZWN2TW5nTGlzdCA9IE5VTEw7Ci0gICAgcERldmljZS0+TGFzdFJlY3ZNbmdMaXN0ID0gTlVMTDsKLSAgICBwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QgPSAwOworCQlwcml2LT5hcFREW2lpXSA9IHR4X2NvbnRleHQ7CisJCXR4X2NvbnRleHQtPnBEZXZpY2UgPSBwcml2OwogCi0JcFJDQiA9IChzdHJ1Y3Qgdm50X3JjYiAqKXBEZXZpY2UtPnBSQ0JNZW07CisJCS8qIGFsbG9jYXRlIFVSQnMgKi8KKwkJdHhfY29udGV4dC0+cFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJCWlmICh0eF9jb250ZXh0LT5wVXJiID09IE5VTEwpIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwKKwkJCQlLRVJOX0VSUiAiYWxsb2MgdHggdXJiIGZhaWxlZFxuIik7CisJCQlnb3RvIGZyZWVfdHg7CisJCX0KIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBEZXZpY2UtPmNiUkQ7IGlpKyspIHsKLQotICAgICAgICBwRGV2aWNlLT5hcFJDQltpaV0gPSBwUkNCOwotCXBSQ0ItPnBEZXZpY2UgPSAodm9pZCAqKSBwRGV2aWNlOwotCS8qIGFsbG9jYXRlIFVSQnMgKi8KLSAgICAgICAgcFJDQi0+cFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0KLSAgICAgICAgaWYgKHBSQ0ItPnBVcmIgPT0gTlVMTCkgewotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSIiBGYWlsZWQgdG8gYWxsb2MgcnggdXJiXG4iKTsKLSAgICAgICAgICAgIGdvdG8gZnJlZV9yeF90eDsKLSAgICAgICAgfQotICAgICAgICBwUkNCLT5za2IgPSBkZXZfYWxsb2Nfc2tiKChpbnQpcERldmljZS0+cnhfYnVmX3N6KTsKLSAgICAgICAgaWYgKHBSQ0ItPnNrYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIiIEZhaWxlZCB0byBhbGxvYyByeCBza2JcbiIpOwotICAgICAgICAgICAgZ290byBmcmVlX3J4X3R4OwotICAgICAgICB9Ci0gICAgICAgIHBSQ0ItPnNrYi0+ZGV2ID0gcERldmljZS0+ZGV2OwotICAgICAgICBwUkNCLT5iQm9vbEluVXNlID0gZmFsc2U7Ci0gICAgICAgIEVucXVldWVSQ0IocERldmljZS0+Rmlyc3RSZWN2RnJlZUxpc3QsIHBEZXZpY2UtPkxhc3RSZWN2RnJlZUxpc3QsIHBSQ0IpOwotICAgICAgICBwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QrKzsKLSAgICAgICAgcFJDQisrOwotICAgIH0KLQotCXBEZXZpY2UtPnBJbnRlcnJ1cHRVUkIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmIChwRGV2aWNlLT5wSW50ZXJydXB0VVJCID09IE5VTEwpIHsKLQkgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fRVJSIkZhaWxlZCB0byBhbGxvYyBpbnQgdXJiXG4iKTsKLQkgICAgZ290byBmcmVlX3J4X3R4OworCQl0eF9jb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7CiAJfQogCi0gICAgcERldmljZS0+aW50QnVmLnBEYXRhQnVmID0ga21hbGxvYyhNQVhfSU5URVJSVVBUX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmIChwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYgPT0gTlVMTCkgewotCSAgICBEQkdfUFJUKE1TR19MRVZFTF9FUlIsS0VSTl9FUlIiRmFpbGVkIHRvIGFsbG9jIGludCBidWZcbiIpOwotCSAgICB1c2JfZnJlZV91cmIocERldmljZS0+cEludGVycnVwdFVSQik7Ci0JICAgIGdvdG8gZnJlZV9yeF90eDsKKwkvKiBhbGxvY2F0ZSBSQ0IgbWVtICovCisJcHJpdi0+cFJDQk1lbSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3Qgdm50X3JjYikgKiBwcml2LT5jYlJEKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPnBSQ0JNZW0gPT0gTlVMTCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSCisJCQkiJXMgOiBhbGxvYyByeCB1c2IgY29udGV4dCBmYWlsZWRcbiIsCisJCQkJcHJpdi0+ZGV2LT5uYW1lKTsKKwkJZ290byBmcmVlX3R4OwogCX0KIAotICAgIHJldHVybiB0cnVlOworCXByaXYtPkZpcnN0UmVjdkZyZWVMaXN0ID0gTlVMTDsKKwlwcml2LT5MYXN0UmVjdkZyZWVMaXN0ID0gTlVMTDsKKwlwcml2LT5GaXJzdFJlY3ZNbmdMaXN0ID0gTlVMTDsKKwlwcml2LT5MYXN0UmVjdk1uZ0xpc3QgPSBOVUxMOworCXByaXYtPk51bVJlY3ZGcmVlTGlzdCA9IDA7CisKKwlyY2IgPSAoc3RydWN0IHZudF9yY2IgKilwcml2LT5wUkNCTWVtOworCisJZm9yIChpaSA9IDA7IGlpIDwgcHJpdi0+Y2JSRDsgaWkrKykgeworCQlwcml2LT5hcFJDQltpaV0gPSByY2I7CisJCXJjYi0+cERldmljZSA9IHByaXY7CisKKwkJLyogYWxsb2NhdGUgVVJCcyAqLworCQlyY2ItPnBVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCQlpZiAocmNiLT5wVXJiID09IE5VTEwpIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCQkiIEZhaWxlZCB0byBhbGxvYyByeCB1cmJcbiIpOworCQkJZ290byBmcmVlX3J4X3R4OworCQl9CisKKwkJcmNiLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHByaXYtPmRldiwgcHJpdi0+cnhfYnVmX3N6KTsKKwkJaWYgKHJjYi0+c2tiID09IE5VTEwpIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCQkJCSIgRmFpbGVkIHRvIGFsbG9jIHJ4IHNrYlxuIik7CisJCQlnb3RvIGZyZWVfcnhfdHg7CisJCX0KKworCQlyY2ItPmJCb29sSW5Vc2UgPSBmYWxzZTsKKworCQlFbnF1ZXVlUkNCKHByaXYtPkZpcnN0UmVjdkZyZWVMaXN0LAorCQkJCQkJcHJpdi0+TGFzdFJlY3ZGcmVlTGlzdCwgcmNiKTsKKworCQlwcml2LT5OdW1SZWN2RnJlZUxpc3QrKzsKKwkJcmNiKys7CisJfQorCisJcHJpdi0+cEludGVycnVwdFVSQiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYtPnBJbnRlcnJ1cHRVUkIgPT0gTlVMTCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSIkZhaWxlZCB0byBhbGxvYyBpbnQgdXJiXG4iKTsKKwkJZ290byBmcmVlX3J4X3R4OworCX0KKworCXByaXYtPmludF9idWYuZGF0YV9idWYgPSBrbWFsbG9jKE1BWF9JTlRFUlJVUFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPmludF9idWYuZGF0YV9idWYgPT0gTlVMTCkgeworCQlEQkdfUFJUKE1TR19MRVZFTF9FUlIsIEtFUk5fRVJSIkZhaWxlZCB0byBhbGxvYyBpbnQgYnVmXG4iKTsKKwkJdXNiX2ZyZWVfdXJiKHByaXYtPnBJbnRlcnJ1cHRVUkIpOworCQlnb3RvIGZyZWVfcnhfdHg7CisJfQorCisJcmV0dXJuIHRydWU7CiAKIGZyZWVfcnhfdHg6Ci0gICAgZGV2aWNlX2ZyZWVfcnhfYnVmcyhwRGV2aWNlKTsKKwlkZXZpY2VfZnJlZV9yeF9idWZzKHByaXYpOwogCiBmcmVlX3R4OgotICAgIGRldmljZV9mcmVlX3R4X2J1ZnMocERldmljZSk7CisJZGV2aWNlX2ZyZWVfdHhfYnVmcyhwcml2KTsKIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTkzMSwxMyArOTQ4LDExIEBACiBpbnQgZGV2aWNlX2FsbG9jX2ZyYWdfYnVmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKIAkJUFNEZUZyYWdDb250cm9sQmxvY2sgcERlRikKIHsKKwlwRGVGLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHBEZXZpY2UtPmRldiwgcERldmljZS0+cnhfYnVmX3N6KTsKKwlpZiAoIXBEZUYtPnNrYikKKwkJcmV0dXJuIGZhbHNlOwogCi0gICAgcERlRi0+c2tiID0gZGV2X2FsbG9jX3NrYigoaW50KXBEZXZpY2UtPnJ4X2J1Zl9zeik7Ci0gICAgaWYgKHBEZUYtPnNrYiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcERlRi0+c2tiLT5kZXYgPSBwRGV2aWNlLT5kZXY7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCAgZGV2aWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTk3NCw4ICs5ODksNiBAQAogCQlnb3RvIGZyZWVfYWxsOwogCX0KIAotICAgIGRldmljZV9zZXRfbXVsdGkocERldmljZS0+ZGV2KTsKLQogICAgIC8qIGluaXQgZm9yIGtleSBtYW5hZ2VtZW50ICovCiAgICAgS2V5dkluaXRUYWJsZShwRGV2aWNlLCZwRGV2aWNlLT5zS2V5KTsKIAltZW1jcHkocERldmljZS0+dm50X21nbXQuYWJ5TUFDQWRkciwKQEAgLTk5MiwxNiArMTAwNSwxMiBAQAogCiAgICAgdk1nck9iamVjdEluaXQocERldmljZSk7CiAKLSAgICB0YXNrbGV0X2luaXQoJnBEZXZpY2UtPkV2ZW50V29ya0l0ZW0sICh2b2lkICopSU5UdldvcmtJdGVtLCAodW5zaWduZWQgbG9uZylwRGV2aWNlKTsKLQogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcERldmljZS0+c2Vjb25kX2NhbGxiYWNrX3dvcmssIEhaKTsKIAotCXBEZXZpY2UtPmludF9pbnRlcnZhbCA9IDEwMDsgIC8qIG1heCAxMDAgbWljcm9mcmFtZXMgKi8KKwlwRGV2aWNlLT5pbnRfaW50ZXJ2YWwgPSAxOyAgLyogYkludGVydmFsIGlzIHNldCB0byAxICovCiAgICAgcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwogCiAgICAgcERldmljZS0+YklzUnhXb3JrSXRlbVF1ZXVlZCA9IHRydWU7Ci0gICAgcERldmljZS0+ZktpbGxFdmVudFBvbGxpbmdUaHJlYWQgPSBmYWxzZTsKLSAgICBwRGV2aWNlLT5iRXZlbnRBdmFpbGFibGUgPSBmYWxzZTsKIAogICAgcERldmljZS0+YldQQURFVlVwID0gZmFsc2U7CiAgICAgIHBEZXZpY2UtPmJ3ZXh0c3RlcDAgPSBmYWxzZTsKQEAgLTEwODQsNyArMTA5Myw2IEBACiAgICAgTVBfU0VUX0ZMQUcocERldmljZSwgZk1QX0RJU0NPTk5FQ1RFRCk7CiAgICAgTVBfQ0xFQVJfRkxBRyhwRGV2aWNlLCBmTVBfUE9TVF9XUklURVMpOwogICAgIE1QX0NMRUFSX0ZMQUcocERldmljZSwgZk1QX1BPU1RfUkVBRFMpOwotICAgIHBEZXZpY2UtPmZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkID0gdHJ1ZTsKIAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcERldmljZS0+cnVuX2NvbW1hbmRfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwRGV2aWNlLT5zZWNvbmRfY2FsbGJhY2tfd29yayk7CkBAIC0xMDk4LDggKzExMDYsNiBAQAogCWNhbmNlbF93b3JrX3N5bmMoJnBEZXZpY2UtPnJ4X21uZ193b3JrX2l0ZW0pOwogCWNhbmNlbF93b3JrX3N5bmMoJnBEZXZpY2UtPnJlYWRfd29ya19pdGVtKTsKIAotICAgIHRhc2tsZXRfa2lsbCgmcERldmljZS0+RXZlbnRXb3JrSXRlbSk7Ci0KICAgIHBEZXZpY2UtPmJSb2FtaW5nID0gZmFsc2U7CiAgICBwRGV2aWNlLT5iSXNSb2FtaW5nID0gZmFsc2U7CiAgICBwRGV2aWNlLT5iRW5hYmxlUm9hbWluZyA9IGZhbHNlOwpAQCAtMTM1MCw2OSArMTM1Niw3MyBAQAogCiBzdGF0aWMgdm9pZCBkZXZpY2Vfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgdm50X21hbmFnZXIgKnBNZ210ID0gJnBEZXZpY2UtPnZudF9tZ210OworCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChwcml2LT5mbGFncyAmIERFVklDRV9GTEFHU19PUEVORUQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCQliU2NoZWR1bGVDb21tYW5kKHByaXYsIFdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVIsIE5VTEwpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3ZvaWQgdm50X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CisJc3RydWN0IHZudF9tYW5hZ2VyICptZ210ID0gJnByaXYtPnZudF9tZ210OwogCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0JdTMyIG1jX2ZpbHRlclsyXTsKLQlpbnQgaWk7Ci0JdTggcGJ5RGF0YVs4XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQl1OCBieVRtcE1vZGUgPSAwOworCXU2NCBtY19maWx0ZXIgPSAwOworCXU4IHRtcCA9IDA7CiAJaW50IHJjOwogCi0Jc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgcmMgPSBDT05UUk9MbnNSZXF1ZXN0SW4ocERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX1RZUEVfUkVBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNfUkVHX1JDUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5VG1wTW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgaWYgKHJjID09IDApIHBEZXZpY2UtPmJ5UnhNb2RlID0gYnlUbXBNb2RlOworCXJjID0gQ09OVFJPTG5zUmVxdWVzdEluKHByaXYsIE1FU1NBR0VfVFlQRV9SRUFELAorCQlNQUNfUkVHX1JDUiwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgMSwgJnRtcCk7CisJaWYgKHJjID09IDApCisJCXByaXYtPmJ5UnhNb2RlID0gdG1wOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicERldmljZS0+YnlSeE1vZGUgaW49ICV4XG4iLCBwRGV2aWNlLT5ieVJ4TW9kZSk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAicHJpdi0+YnlSeE1vZGUgaW49ICV4XG4iLAorCQkJCQkJCXByaXYtPmJ5UnhNb2RlKTsKIAotICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsgLyogc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfRVJSLEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKLQkvKiB1bmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzICovCi0gICAgICAgIHBEZXZpY2UtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1R8UkNSX1VOSUNBU1QpOwotICAgIH0KLSAgICBlbHNlIGlmICgobmV0ZGV2X21jX2NvdW50KGRldikgPiBwRGV2aWNlLT5tdWx0aWNhc3RfbGltaXQpIHx8Ci0JICAgICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKLSAgICAgICAgQ09OVFJPTG5zUmVxdWVzdE91dChwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfVFlQRV9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNfUkVHX01BUjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBieURhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBwRGV2aWNlLT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKLQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0gICAgICAgICAgICBpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBoYS0+YWRkcikgPj4gMjY7Ci0gICAgICAgICAgICBtY19maWx0ZXJbYml0X25yID4+IDVdIHw9IGNwdV90b19sZTMyKDEgPDwgKGJpdF9uciAmIDMxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgewotICAgICAgICAgICAgIE1BQ3ZXcml0ZU11bHRpQWRkcihwRGV2aWNlLCBpaSwgKigodTggKikmbWNfZmlsdGVyWzBdICsgaWkpKTsKLSAgICAgICAgICAgICBNQUN2V3JpdGVNdWx0aUFkZHIocERldmljZSwgaWkrIDQsICooKHU4ICopJm1jX2ZpbHRlclsxXSArIGlpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcERldmljZS0+YnlSeE1vZGUgJj0gfihSQ1JfVU5JQ0FTVCk7Ci0gICAgICAgIHBEZXZpY2UtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1QpOwotICAgIH0KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7IC8qIHNldCBwcm9taXNjdW91cyBtb2RlICovCisJCURCR19QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9OT1RJQ0UKKwkJCSIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJLyogdW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcyAqLworCQlwcml2LT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUfFJDUl9VTklDQVNUKTsKKwl9IGVsc2UgaWYgKChuZXRkZXZfbWNfY291bnQoZGV2KSA+IHByaXYtPm11bHRpY2FzdF9saW1pdCkgfHwKKwkJCShkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQltY19maWx0ZXIgPSB+MHgwOworCQlNQUN2V3JpdGVNdWx0aUFkZHIocHJpdiwgbWNfZmlsdGVyKTsKIAotICAgIGlmIChwTWdtdC0+ZUNvbmZpZ01vZGUgPT0gV01BQ19DT05GSUdfQVApIHsKLQkvKgotCSAqIElmIEFQIG1vZGUsIGRvbid0IGVuYWJsZSBSQ1JfVU5JQ0FTVCBzaW5jZSBIVyBvbmx5IGNvbXBhcmVzCi0JICogYWRkcjEgd2l0aCBsb2NhbCBNQUMKLQkgKi8KLSAgICAgICAgcERldmljZS0+YnlSeE1vZGUgfD0gKFJDUl9NVUxUSUNBU1R8UkNSX0JST0FEQ0FTVCk7Ci0gICAgICAgIHBEZXZpY2UtPmJ5UnhNb2RlICY9IH4oUkNSX1VOSUNBU1QpOwotICAgIH0KLSAgICBDb250cm9sdldyaXRlQnl0ZShwRGV2aWNlLCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCBNQUNfUkVHX1JDUiwgcERldmljZS0+YnlSeE1vZGUpOwotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInBEZXZpY2UtPmJ5UnhNb2RlIG91dD0gJXhcbiIsIHBEZXZpY2UtPmJ5UnhNb2RlKTsKLQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQlwcml2LT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUKTsKKwl9IGVsc2UgeworCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CisJCQlpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBoYS0+YWRkcikgPj4gMjY7CiAKKwkJCW1jX2ZpbHRlciB8PSAxVUxMIDw8IChiaXRfbnIgJiAweDNmKTsKKwkJfQorCisJCU1BQ3ZXcml0ZU11bHRpQWRkcihwcml2LCBtY19maWx0ZXIpOworCisJCXByaXYtPmJ5UnhNb2RlICY9IH4oUkNSX1VOSUNBU1QpOworCQlwcml2LT5ieVJ4TW9kZSB8PSAoUkNSX01VTFRJQ0FTVHxSQ1JfQlJPQURDQVNUKTsKKwl9CisKKwlpZiAobWdtdC0+ZUNvbmZpZ01vZGUgPT0gV01BQ19DT05GSUdfQVApIHsKKwkJLyoKKwkJICogSWYgQVAgbW9kZSwgZG9uJ3QgZW5hYmxlIFJDUl9VTklDQVNUIHNpbmNlIEhXIG9ubHkgY29tcGFyZXMKKwkJICogYWRkcjEgd2l0aCBsb2NhbCBNQUMKKwkJICovCisJCXByaXYtPmJ5UnhNb2RlIHw9IChSQ1JfTVVMVElDQVNUfFJDUl9CUk9BRENBU1QpOworCQlwcml2LT5ieVJ4TW9kZSAmPSB+KFJDUl9VTklDQVNUKTsKKwl9CisKKwlDb250cm9sdldyaXRlQnl0ZShwcml2LCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLAorCQkJCQlNQUNfUkVHX1JDUiwgcHJpdi0+YnlSeE1vZGUpOworCisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkJCSJwcml2LT5ieVJ4TW9kZSBvdXQ9ICV4XG4iLCBwcml2LT5ieVJ4TW9kZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGV2aWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jCmluZGV4IGU3ZDU0ODcuLjQzZGE1ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMKQEAgLTY3LDIyICs2NywyMyBAQAogCS8qIHNldCBwZXJpb2Qgb2YgcG93ZXIgdXAgYmVmb3JlIFRCVFQgKi8KIAlNQUN2V3JpdGVXb3JkKHBEZXZpY2UsIE1BQ19SRUdfUFdCVCwgQ19QV0JUKTsKIAotCWlmIChwRGV2aWNlLT5lT1BNb2RlICE9IE9QX01PREVfQURIT0MpIHsKKwlpZiAocERldmljZS0+b3BfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQkvKiBzZXQgQUlEICovCiAJCU1BQ3ZXcml0ZVdvcmQocERldmljZSwgTUFDX1JFR19BSURBVElNLCB3QUlEKTsKLQl9IGVsc2UgewotCQkvKiBzZXQgQVRJTSBXaW5kb3cgKi8KLQkJLyogTUFDdldyaXRlQVRJTVcocERldmljZS0+UG9ydE9mZnNldCwgcE1nbXQtPndDdXJyQVRJTVdpbmRvdyk7ICovCiAJfQogCi0JLyogV2FycmVuOjA2LTE4LTIwMDQsdGhlIHNlcXVlbmNlIG11c3QgZm9sbG93IFBTRU4tPkFVVE9TTEVFUC0+R08yRE9aRSAqLworCS8qIFdhcnJlbjowNi0xOC0yMDA0LHRoZSBzZXF1ZW5jZSBtdXN0IGZvbGxvdworCSAqIFBTRU4tPkFVVE9TTEVFUC0+R08yRE9aRQorCSAqLwogCS8qIGVuYWJsZSBwb3dlciBzYXZpbmcgaHcgZnVuY3Rpb24gKi8KIAlNQUN2UmVnQml0c09uKHBEZXZpY2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX1BTRU4pOwogCiAJLyogU2V0IEF1dG9TbGVlcCAqLwogCU1BQ3ZSZWdCaXRzT24ocERldmljZSwgTUFDX1JFR19QU0NGRywgUFNDRkdfQVVUT1NMRUVQKTsKIAotCS8qIFdhcnJlbjpNVVNUIHR1cm4gb24gdGhpcyBvbmNlIGJlZm9yZSB0dXJuIG9uIEFVVE9TTEVFUCAsb3IgdGhlIEFVVE9TTEVFUCBkb2Vzbid0IHdvcmsgKi8KKwkvKiBXYXJyZW46TVVTVCB0dXJuIG9uIHRoaXMgb25jZSBiZWZvcmUgdHVybiBvbiBBVVRPU0xFRVAgLG9yIHRoZQorCSAqIEFVVE9TTEVFUCBkb2Vzbid0IHdvcmsKKwkgKi8KIAlNQUN2UmVnQml0c09uKHBEZXZpY2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX0dPMkRPWkUpOwogCiAJaWYgKHdMaXN0ZW5JbnRlcnZhbCA+PSAyKSB7CkBAIC0xMDUsOCArMTA2LDEwIEBACiAKIAlwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID0gdHJ1ZTsKIAotCS8qIFdlIGRvbid0IHNlbmQgbnVsbCBwa3QgaW4gYWQgaG9jIG1vZGUgc2luY2UgYmVhY29uIHdpbGwgaGFuZGxlIHRoaXMuICovCi0JaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSkKKwkvKiBXZSBkb24ndCBzZW5kIG51bGwgcGt0IGluIGFkIGhvYyBtb2RlCisJICogc2luY2UgYmVhY29uIHdpbGwgaGFuZGxlIHRoaXMuCisJICovCisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKIAkJUFNiU2VuZE51bGxQYWNrZXQocERldmljZSk7CiAKIAlwRGV2aWNlLT5iUFdCaXRPbiA9IHRydWU7CkBAIC0xMzcsNyArMTQwLDcgQEAKIAlNQUN2UmVnQml0c09uKHBEZXZpY2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX0FMQkNOKTsKIAlwRGV2aWNlLT5iRW5hYmxlUFNNb2RlID0gZmFsc2U7CiAKLQlpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKQorCWlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCVBTYlNlbmROdWxsUGFja2V0KHBEZXZpY2UpOwogCiAJcERldmljZS0+YlBXQml0T24gPSBmYWxzZTsKQEAgLTIyNiwxNSArMjI5LDE5IEBACiAJCQlXTEFOX1NFVF9GQ19QV1JNR1QoMCkKIAkJKSk7CiAKLQlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEID0gcE1nbXQtPndDdXJyQUlEIHwgQklUMTQgfCBCSVQxNTsKLQltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9BRERSX0xFTik7Ci0JbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIuYWJ5QWRkcjIsIHBNZ210LT5hYnlNQUNBZGRyLCBXTEFOX0FERFJfTEVOKTsKKwlwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEID0KKwkJcE1nbXQtPndDdXJyQUlEIHwgQklUMTQgfCBCSVQxNTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwKKwkJV0xBTl9BRERSX0xFTik7CisJbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIuYWJ5QWRkcjIsIHBNZ210LT5hYnlNQUNBZGRyLAorCQlXTEFOX0FERFJfTEVOKTsKIAlwVHhQYWNrZXQtPmNiTVBEVUxlbiA9IFdMQU5fSERSX0FERFIyX0xFTjsKIAlwVHhQYWNrZXQtPmNiUGF5bG9hZExlbiA9IDA7CiAKIAkvKiBsb2cgZmFpbHVyZSBpZiBzZW5kaW5nIGZhaWxlZCAqLwogCWlmIChjc01nbXRfeG1pdChwRGV2aWNlLCBwVHhQYWNrZXQpICE9IENNRF9TVEFUVVNfUEVORElORykKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2VuZCBQUy1Qb2xsIHBhY2tldCBmYWlsZWQuLlxuIik7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLAorCQkJS0VSTl9JTkZPICJTZW5kIFBTLVBvbGwgcGFja2V0IGZhaWxlZC4uXG4iKTsKIH0KIAogLyoKQEAgLTI3NiwxNiArMjgzLDIxIEBACiAJcFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy53RnJhbWVDdGwgPSBjcHVfdG9fbGUxNihmbGFncyk7CiAKIAlpZiAocE1nbXQtPmVDdXJyTW9kZSAhPSBXTUFDX01PREVfSUJTU19TVEEpCi0JCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMud0ZyYW1lQ3RsIHw9IGNwdV90b19sZTE2KCh1MTYpV0xBTl9TRVRfRkNfVE9EUygxKSk7CisJCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMud0ZyYW1lQ3RsIHw9CisJCQljcHVfdG9fbGUxNigodTE2KVdMQU5fU0VUX0ZDX1RPRFMoMSkpOwogCi0JbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjEsIHBNZ210LT5hYnlDdXJyQlNTSUQsIFdMQU5fQUREUl9MRU4pOwotCW1lbWNweShwVHhQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EzLmFieUFkZHIyLCBwTWdtdC0+YWJ5TUFDQWRkciwgV0xBTl9BRERSX0xFTik7Ci0JbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjMsIHBNZ210LT5hYnlDdXJyQlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMSwgcE1nbXQtPmFieUN1cnJCU1NJRCwKKwkJV0xBTl9BRERSX0xFTik7CisJbWVtY3B5KHBUeFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTMuYWJ5QWRkcjIsIHBNZ210LT5hYnlNQUNBZGRyLAorCQlXTEFOX0FERFJfTEVOKTsKKwltZW1jcHkocFR4UGFja2V0LT5wODAyMTFIZWFkZXItPnNBMy5hYnlBZGRyMywgcE1nbXQtPmFieUN1cnJCU1NJRCwKKwkJV0xBTl9CU1NJRF9MRU4pOwogCXBUeFBhY2tldC0+Y2JNUERVTGVuID0gV0xBTl9IRFJfQUREUjNfTEVOOwogCXBUeFBhY2tldC0+Y2JQYXlsb2FkTGVuID0gMDsKIAkvKiBsb2cgZXJyb3IgaWYgc2VuZGluZyBmYWlsZWQgKi8KIAlpZiAoY3NNZ210X3htaXQocERldmljZSwgcFR4UGFja2V0KSAhPSBDTURfU1RBVFVTX1BFTkRJTkcpIHsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2VuZCBOdWxsIFBhY2tldCBmYWlsZWQgIVxuIik7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLAorCQkJS0VSTl9JTkZPICJTZW5kIE51bGwgUGFja2V0IGZhaWxlZCAhXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKaW5kZXggNTFmZmY4OS4uMzg0MDMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKQEAgLTExOCw3ICsxMTgsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzX3VHZXRUeFJzdlRpbWUoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieVBrdFR5cGUsCiAJdTMyIGNiRnJhbWVMZW5ndGgsIHUxNiB3UmF0ZSwgaW50IGJOZWVkQWNrKTsKIAotc3RhdGljIHUxNiBzX3VHZXRSVFNDVFNSc3ZUaW1lKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKK3N0YXRpYyBfX2xlMTYgc191R2V0UlRTQ1RTUnN2VGltZShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCiAJdTggcnN2X3R5cGUsIHU4IHBrdF90eXBlLCB1MzIgZnJhbWVfbGVuZ2h0LCB1MTYgY3VycmVudF9yYXRlKTsKIAogc3RhdGljIHUxNiBzX3ZGaWxsQ1RTSGVhZChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHUzMiB1RE1BSWR4LApAQCAtMTI5LDEwICsxMjksMTAgQEAKIAl1bmlvbiB2bnRfdHhfZGF0YV9oZWFkICpoZWFkLCB1MzIgY2JGcmFtZUxlbmd0aCwgaW50IGJOZWVkQWNrLAogCXN0cnVjdCBldGhoZHIgKnBzRXRoSGVhZGVyLCB1MTYgd0N1cnJlbnRSYXRlLCB1OCBieUZCT3B0aW9uKTsKIAotc3RhdGljIHUxNiBzX3VHZXREYXRhRHVyYXRpb24oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAorc3RhdGljIF9fbGUxNiBzX3VHZXREYXRhRHVyYXRpb24oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAogCXU4IGJ5UGt0VHlwZSwgaW50IGJOZWVkQWNrKTsKIAotc3RhdGljIHUxNiBzX3VHZXRSVFNDVFNEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCitzdGF0aWMgX19sZTE2IHNfdUdldFJUU0NUU0R1cmF0aW9uKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwKIAl1OCBieUR1clR5cGUsIHUzMiBjYkZyYW1lTGVuZ3RoLCB1OCBieVBrdFR5cGUsIHUxNiB3UmF0ZSwKIAlpbnQgYk5lZWRBY2ssIHU4IGJ5RkJPcHRpb24pOwogCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB1MTYgdm50X3RpbWVfc3RhbXBfb2ZmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTE2IHJhdGUpCitzdGF0aWMgX19sZTE2IHZudF90aW1lX3N0YW1wX29mZihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHUxNiByYXRlKQogewogCXJldHVybiBjcHVfdG9fbGUxNih3VGltZVN0YW1wT2ZmW3ByaXYtPmJ5UHJlYW1ibGVUeXBlICUgMl0KIAkJCQkJCQlbcmF0ZSAlIE1BWF9SQVRFXSk7CkBAIC0zNTksNyArMzU5LDcgQEAKIAlyZXR1cm4gZGF0YV90aW1lOwogfQogCi1zdGF0aWMgdTE2IHZudF9yeHR4X3JzdnRpbWVfbGUxNihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU4IHBrdF90eXBlLAorc3RhdGljIF9fbGUxNiB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1OCBwa3RfdHlwZSwKIAl1MzIgZnJhbWVfbGVuZ3RoLCB1MTYgcmF0ZSwgaW50IG5lZWRfYWNrKQogewogCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXNfdUdldFR4UnN2VGltZShwcml2LCBwa3RfdHlwZSwKQEAgLTM2Nyw3ICszNjcsNyBAQAogfQogCiAvL2J5RnJlcVR5cGU6IDA9PjVHSFogMT0+Mi40R0haCi1zdGF0aWMgdTE2IHNfdUdldFJUU0NUU1JzdlRpbWUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LAorc3RhdGljIF9fbGUxNiBzX3VHZXRSVFNDVFNSc3ZUaW1lKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAl1OCByc3ZfdHlwZSwgdTggcGt0X3R5cGUsIHUzMiBmcmFtZV9sZW5naHQsIHUxNiBjdXJyZW50X3JhdGUpCiB7CiAJdTMyIHJydl90aW1lLCBydHNfdGltZSwgY3RzX3RpbWUsIGFja190aW1lLCBkYXRhX3RpbWU7CkBAIC00MDIsNyArNDAyLDcgQEAKIAogCQlycnZfdGltZSA9IGN0c190aW1lICsgYWNrX3RpbWUgKyBkYXRhX3RpbWUgKyAyICogcHJpdi0+dVNJRlM7CiAKLQkJcmV0dXJuIHJydl90aW1lOworCQlyZXR1cm4gY3B1X3RvX2xlMTYoKHUxNilycnZfdGltZSk7CiAJfQogCiAJcnJ2X3RpbWUgPSBydHNfdGltZSArIGN0c190aW1lICsgYWNrX3RpbWUgKyBkYXRhX3RpbWUgKyAzICogcHJpdi0+dVNJRlM7CkBAIC00MTEsNyArNDExLDcgQEAKIH0KIAogLy9ieUZyZXFUeXBlIDA6IDVHSHosIDE6Mi40R2h6Ci1zdGF0aWMgdTE2IHNfdUdldERhdGFEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCitzdGF0aWMgX19sZTE2IHNfdUdldERhdGFEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCiAJCQkJCXU4IGJ5UGt0VHlwZSwgaW50IGJOZWVkQWNrKQogewogCXUzMiB1QWNrVGltZSA9IDA7CkBAIC00MzAsNyArNDMwLDcgQEAKIH0KIAogLy9ieUZyZXFUeXBlOiAwPT41R0haIDE9PjIuNEdIWgotc3RhdGljIHUxNiBzX3VHZXRSVFNDVFNEdXJhdGlvbihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsIHU4IGJ5RHVyVHlwZSwKK3N0YXRpYyBfX2xlMTYgc191R2V0UlRTQ1RTRHVyYXRpb24oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieUR1clR5cGUsCiAJdTMyIGNiRnJhbWVMZW5ndGgsIHU4IGJ5UGt0VHlwZSwgdTE2IHdSYXRlLCBpbnQgYk5lZWRBY2ssCiAJdTggYnlGQk9wdGlvbikKIHsKQEAgLTQ4MSwxNCArNDgxLDE0IEBACiAJCQkJCQkJUEtfVFlQRV8xMUIsICZidWYtPmIpOwogCiAJLyogR2V0IER1cmF0aW9uIGFuZCBUaW1lU3RhbXAgKi8KLQlidWYtPndEdXJhdGlvbl9hID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7Ci0JYnVmLT53RHVyYXRpb25fYiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBQS19UWVBFXzExQiwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBQS19UWVBFXzExQiwgbmVlZF9hY2spOwogCi0JYnVmLT53VGltZVN0YW1wT2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7Ci0JYnVmLT53VGltZVN0YW1wT2ZmX2IgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwKKwlidWYtPnRpbWVfc3RhbXBfb2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7CisJYnVmLT50aW1lX3N0YW1wX29mZl9iID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsCiAJCQkJCXByaXYtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAotCXJldHVybiBidWYtPndEdXJhdGlvbl9hOworCXJldHVybiBsZTE2X3RvX2NwdShidWYtPmR1cmF0aW9uX2EpOwogfQogCiBzdGF0aWMgdTE2IHZudF9yeHR4X2RhdGFoZWFkX2dfZmIoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1OCBwa3RfdHlwZSwKQEAgLTUwMiwxNyArNTAyLDE3IEBACiAJCQkJCQlQS19UWVBFXzExQiwgJmJ1Zi0+Yik7CiAKIAkvKiBHZXQgRHVyYXRpb24gYW5kIFRpbWVTdGFtcCAqLwotCWJ1Zi0+d0R1cmF0aW9uX2EgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKLQlidWYtPndEdXJhdGlvbl9iID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIFBLX1RZUEVfMTFCLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9hID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9iID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIFBLX1RZUEVfMTFCLCBuZWVkX2Fjayk7CiAKLQlidWYtPndEdXJhdGlvbl9hX2YwID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7Ci0JYnVmLT53RHVyYXRpb25fYV9mMSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYV9mMCA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fYV9mMSA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOwogCi0JYnVmLT53VGltZVN0YW1wT2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7Ci0JYnVmLT53VGltZVN0YW1wT2ZmX2IgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwKKwlidWYtPnRpbWVfc3RhbXBfb2ZmX2EgPSB2bnRfdGltZV9zdGFtcF9vZmYocHJpdiwgcmF0ZSk7CisJYnVmLT50aW1lX3N0YW1wX29mZl9iID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsCiAJCQkJCQlwcml2LT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAKLQlyZXR1cm4gYnVmLT53RHVyYXRpb25fYTsKKwlyZXR1cm4gbGUxNl90b19jcHUoYnVmLT5kdXJhdGlvbl9hKTsKIH0KIAogc3RhdGljIHUxNiB2bnRfcnh0eF9kYXRhaGVhZF9hX2ZiKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTggcGt0X3R5cGUsCkBAIC01MjIsMTQgKzUyMiwxNCBAQAogCS8qIEdldCBTaWduYWxGaWVsZCxTZXJ2aWNlRmllbGQsTGVuZ3RoICovCiAJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHByaXYsIGZyYW1lX2xlbiwgcmF0ZSwgcGt0X3R5cGUsICZidWYtPmEpOwogCS8qIEdldCBEdXJhdGlvbiBhbmQgVGltZVN0YW1wT2ZmICovCi0JYnVmLT53RHVyYXRpb24gPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKKwlidWYtPmR1cmF0aW9uID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CiAKLQlidWYtPndEdXJhdGlvbl9mMCA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOwotCWJ1Zi0+d0R1cmF0aW9uX2YxID0gc191R2V0RGF0YUR1cmF0aW9uKHByaXYsIHBrdF90eXBlLCBuZWVkX2Fjayk7CisJYnVmLT5kdXJhdGlvbl9mMCA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb25fZjEgPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKIAotCWJ1Zi0+d1RpbWVTdGFtcE9mZiA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKKwlidWYtPnRpbWVfc3RhbXBfb2ZmID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsIHJhdGUpOwogCi0JcmV0dXJuIGJ1Zi0+d0R1cmF0aW9uOworCXJldHVybiBsZTE2X3RvX2NwdShidWYtPmR1cmF0aW9uKTsKIH0KIAogc3RhdGljIHUxNiB2bnRfcnh0eF9kYXRhaGVhZF9hYihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU4IHBrdF90eXBlLApAQCAtNTM5LDI2ICs1MzksMjcgQEAKIAkvKiBHZXQgU2lnbmFsRmllbGQsU2VydmljZUZpZWxkLExlbmd0aCAqLwogCUJCdkNhbGN1bGF0ZVBhcmFtZXRlcihwcml2LCBmcmFtZV9sZW4sIHJhdGUsIHBrdF90eXBlLCAmYnVmLT5hYik7CiAJLyogR2V0IER1cmF0aW9uIGFuZCBUaW1lU3RhbXBPZmYgKi8KLQlidWYtPndEdXJhdGlvbiA9IHNfdUdldERhdGFEdXJhdGlvbihwcml2LCBwa3RfdHlwZSwgbmVlZF9hY2spOworCWJ1Zi0+ZHVyYXRpb24gPSBzX3VHZXREYXRhRHVyYXRpb24ocHJpdiwgcGt0X3R5cGUsIG5lZWRfYWNrKTsKIAotCWJ1Zi0+d1RpbWVTdGFtcE9mZiA9IHZudF90aW1lX3N0YW1wX29mZihwcml2LCByYXRlKTsKKwlidWYtPnRpbWVfc3RhbXBfb2ZmID0gdm50X3RpbWVfc3RhbXBfb2ZmKHByaXYsIHJhdGUpOwogCi0JcmV0dXJuIGJ1Zi0+d0R1cmF0aW9uOworCXJldHVybiBsZTE2X3RvX2NwdShidWYtPmR1cmF0aW9uKTsKIH0KIAogc3RhdGljIGludCB2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyAqcnRzLCBzdHJ1Y3QgZXRoaGRyICpldGhfaGRyLAotCQl1MTYgZHVyYXRpb24pCisJCV9fbGUxNiBkdXJhdGlvbikKIHsKIAlydHMtPmR1cmF0aW9uID0gZHVyYXRpb247CiAJcnRzLT5mcmFtZV9jb250cm9sID0gVFlQRV9DVExfUlRTOwogCi0JaWYgKHByaXYtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQyB8fCBwcml2LT5lT1BNb2RlID09IE9QX01PREVfQVApCisJaWYgKHByaXYtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJCQlwcml2LT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKQogCQltZW1jcHkocnRzLT5yYSwgZXRoX2hkci0+aF9kZXN0LCBFVEhfQUxFTik7CiAJZWxzZQogCQltZW1jcHkocnRzLT5yYSwgcHJpdi0+YWJ5QlNTSUQsIEVUSF9BTEVOKTsKIAotCWlmIChwcml2LT5lT1BNb2RlID09IE9QX01PREVfQVApCisJaWYgKHByaXYtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCW1lbWNweShydHMtPnRhLCBwcml2LT5hYnlCU1NJRCwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtY3B5KHJ0cy0+dGEsIGV0aF9oZHItPmhfc291cmNlLCBFVEhfQUxFTik7CkBAIC01NzgsMTQgKzU3OSwxNCBAQAogCUJCdkNhbGN1bGF0ZVBhcmFtZXRlcihwcml2LCBydHNfZnJhbWVfbGVuLAogCQlwcml2LT5ieVRvcE9GRE1CYXNpY1JhdGUsIHBrdF90eXBlLCAmYnVmLT5hKTsKIAotCWJ1Zi0+d0R1cmF0aW9uX2JiID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JCLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbl9iYiA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQiwgZnJhbWVfbGVuLAogCQlQS19UWVBFXzExQiwgcHJpdi0+YnlUb3BDQ0tCYXNpY1JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d0R1cmF0aW9uX2FhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbl9hYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKLQlidWYtPndEdXJhdGlvbl9iYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQSwgZnJhbWVfbGVuLAorCWJ1Zi0+ZHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkEsIGZyYW1lX2xlbiwKIAkJcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwgbmVlZF9hY2ssIGZiX29wdGlvbik7CiAKLQl2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHByaXYsICZidWYtPmRhdGEsIGV0aF9oZHIsIGJ1Zi0+d0R1cmF0aW9uX2FhKTsKKwl2bnRfZmlsbF9pZWVlODAyMTFfcnRzKHByaXYsICZidWYtPmRhdGEsIGV0aF9oZHIsIGJ1Zi0+ZHVyYXRpb25fYWEpOwogCiAJcmV0dXJuIHZudF9yeHR4X2RhdGFoZWFkX2cocHJpdiwgcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwKIAkJCSZidWYtPmRhdGFfaGVhZCwgZnJhbWVfbGVuLCBuZWVkX2Fjayk7CkBAIC02MDQsMjQgKzYwNSwyNCBAQAogCQlwcml2LT5ieVRvcE9GRE1CYXNpY1JhdGUsIHBrdF90eXBlLCAmYnVmLT5hKTsKIAogCi0JYnVmLT53RHVyYXRpb25fYmIgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkIsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uX2JiID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JCLCBmcmFtZV9sZW4sCiAJCVBLX1RZUEVfMTFCLCBwcml2LT5ieVRvcENDS0Jhc2ljUmF0ZSwgbmVlZF9hY2ssIGZiX29wdGlvbik7Ci0JYnVmLT53RHVyYXRpb25fYWEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUEsIGZyYW1lX2xlbiwKKwlidWYtPmR1cmF0aW9uX2FhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCiAJCXBrdF90eXBlLCBjdXJyZW50X3JhdGUsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d0R1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbl9iYSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9CQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAogCi0JYnVmLT53UlRTRHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkFfRjAsCisJYnVmLT5ydHNfZHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQkFfRjAsCiAJCWZyYW1lX2xlbiwgcGt0X3R5cGUsIHByaXYtPnR4X3JhdGVfZmIwLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKLQlidWYtPndSVFNEdXJhdGlvbl9hYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMCwKKwlidWYtPnJ0c19kdXJhdGlvbl9hYV9mMCA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMCwKIAkJZnJhbWVfbGVuLCBwa3RfdHlwZSwgcHJpdi0+dHhfcmF0ZV9mYjAsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwotCWJ1Zi0+d1JUU0R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBX0YxLAorCWJ1Zi0+cnRzX2R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0JBX0YxLAogCQlmcmFtZV9sZW4sIHBrdF90eXBlLCBwcml2LT50eF9yYXRlX2ZiMSwgbmVlZF9hY2ssIGZiX29wdGlvbik7Ci0JYnVmLT53UlRTRHVyYXRpb25fYWFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUFfRjEsCisJYnVmLT5ydHNfZHVyYXRpb25fYWFfZjEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwcml2LCBSVFNEVVJfQUFfRjEsCiAJCWZyYW1lX2xlbiwgcGt0X3R5cGUsIHByaXYtPnR4X3JhdGVfZmIxLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT53RHVyYXRpb25fYWEpOworCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT5kdXJhdGlvbl9hYSk7CiAKIAlyZXR1cm4gdm50X3J4dHhfZGF0YWhlYWRfZ19mYihwcml2LCBwa3RfdHlwZSwgY3VycmVudF9yYXRlLAogCQkJJmJ1Zi0+ZGF0YV9oZWFkLCBmcmFtZV9sZW4sIG5lZWRfYWNrKTsKQEAgLTYzNywxMCArNjM4LDEwIEBACiAJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHByaXYsIHJ0c19mcmFtZV9sZW4sCiAJCXByaXYtPmJ5VG9wT0ZETUJhc2ljUmF0ZSwgcGt0X3R5cGUsICZidWYtPmFiKTsKIAotCWJ1Zi0+d0R1cmF0aW9uID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbiA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT53RHVyYXRpb24pOworCXZudF9maWxsX2llZWU4MDIxMV9ydHMocHJpdiwgJmJ1Zi0+ZGF0YSwgZXRoX2hkciwgYnVmLT5kdXJhdGlvbik7CiAKIAlyZXR1cm4gdm50X3J4dHhfZGF0YWhlYWRfYWIocHJpdiwgcGt0X3R5cGUsIGN1cnJlbnRfcmF0ZSwKIAkJCSZidWYtPmRhdGFfaGVhZCwgZnJhbWVfbGVuLCBuZWVkX2Fjayk7CkBAIC02NTYsMTYgKzY1NywxNiBAQAogCUJCdkNhbGN1bGF0ZVBhcmFtZXRlcihwcml2LCBydHNfZnJhbWVfbGVuLAogCQlwcml2LT5ieVRvcE9GRE1CYXNpY1JhdGUsIHBrdF90eXBlLCAmYnVmLT5hKTsKIAotCWJ1Zi0+d0R1cmF0aW9uID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBLCBmcmFtZV9sZW4sCisJYnVmLT5kdXJhdGlvbiA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQSwgZnJhbWVfbGVuLAogCQlwa3RfdHlwZSwgY3VycmVudF9yYXRlLCBuZWVkX2FjaywgZmJfb3B0aW9uKTsKIAotCWJ1Zi0+d1JUU0R1cmF0aW9uX2YwID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YwLAorCWJ1Zi0+cnRzX2R1cmF0aW9uX2YwID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocHJpdiwgUlRTRFVSX0FBX0YwLAogCQlmcmFtZV9sZW4sIHBrdF90eXBlLCBwcml2LT50eF9yYXRlX2ZiMCwgbmVlZF9hY2ssIGZiX29wdGlvbik7CiAKLQlidWYtPndSVFNEdXJhdGlvbl9mMSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMSwKKwlidWYtPnJ0c19kdXJhdGlvbl9mMSA9IHNfdUdldFJUU0NUU0R1cmF0aW9uKHByaXYsIFJUU0RVUl9BQV9GMSwKIAkJZnJhbWVfbGVuLCBwa3RfdHlwZSwgcHJpdi0+dHhfcmF0ZV9mYjEsIG5lZWRfYWNrLCBmYl9vcHRpb24pOwogCi0Jdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPndEdXJhdGlvbik7CisJdm50X2ZpbGxfaWVlZTgwMjExX3J0cyhwcml2LCAmYnVmLT5kYXRhLCBldGhfaGRyLCBidWYtPmR1cmF0aW9uKTsKIAogCXJldHVybiB2bnRfcnh0eF9kYXRhaGVhZF9hX2ZiKHByaXYsIHBrdF90eXBlLCBjdXJyZW50X3JhdGUsCiAJCQkmYnVmLT5kYXRhX2hlYWQsIGZyYW1lX2xlbiwgbmVlZF9hY2spOwpAQCAtNzI3LDE5ICs3MjgsMTkgQEAKIAkJLyogR2V0IFNpZ25hbEZpZWxkLFNlcnZpY2VGaWVsZCxMZW5ndGggKi8KIAkJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVDVFNGcmFtZUxlbiwKIAkJCXBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBQS19UWVBFXzExQiwgJnBCdWYtPmIpOwotCQlwQnVmLT53RHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLCBDVFNEVVJfQkEsCisJCXBCdWYtPmR1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwgQ1RTRFVSX0JBLAogCQkJY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAogCQkJd0N1cnJlbnRSYXRlLCBiTmVlZEFjaywgYnlGQk9wdGlvbik7CiAJCS8qIEdldCBDVFNEdXJhdGlvbl9iYV9mMCAqLwotCQlwQnVmLT53Q1RTRHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAorCQlwQnVmLT5jdHNfZHVyYXRpb25fYmFfZjAgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAogCQkJQ1RTRFVSX0JBX0YwLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAJCQlwRGV2aWNlLT50eF9yYXRlX2ZiMCwgYk5lZWRBY2ssIGJ5RkJPcHRpb24pOwogCQkvKiBHZXQgQ1RTRHVyYXRpb25fYmFfZjEgKi8KLQkJcEJ1Zi0+d0NUU0R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwKKwkJcEJ1Zi0+Y3RzX2R1cmF0aW9uX2JhX2YxID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwKIAkJCUNUU0RVUl9CQV9GMSwgY2JGcmFtZUxlbmd0aCwgYnlQa3RUeXBlLAogCQkJcERldmljZS0+dHhfcmF0ZV9mYjEsIGJOZWVkQWNrLCBieUZCT3B0aW9uKTsKIAkJLyogR2V0IENUUyBGcmFtZSBib2R5ICovCi0JCXBCdWYtPmRhdGEuZHVyYXRpb24gPSBwQnVmLT53RHVyYXRpb25fYmE7CisJCXBCdWYtPmRhdGEuZHVyYXRpb24gPSBwQnVmLT5kdXJhdGlvbl9iYTsKIAkJcEJ1Zi0+ZGF0YS5mcmFtZV9jb250cm9sID0gVFlQRV9DVExfQ1RTOwogCQltZW1jcHkocEJ1Zi0+ZGF0YS5yYSwgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIsIEVUSF9BTEVOKTsKIApAQCAtNzUxLDExICs3NTIsMTEgQEAKIAkJQkJ2Q2FsY3VsYXRlUGFyYW1ldGVyKHBEZXZpY2UsIHVDVFNGcmFtZUxlbiwKIAkJCXBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlLCBQS19UWVBFXzExQiwgJnBCdWYtPmIpOwogCQkvKiBHZXQgQ1RTRHVyYXRpb25fYmEgKi8KLQkJcEJ1Zi0+d0R1cmF0aW9uX2JhID0gc191R2V0UlRTQ1RTRHVyYXRpb24ocERldmljZSwKKwkJcEJ1Zi0+ZHVyYXRpb25fYmEgPSBzX3VHZXRSVFNDVFNEdXJhdGlvbihwRGV2aWNlLAogCQkJQ1RTRFVSX0JBLCBjYkZyYW1lTGVuZ3RoLCBieVBrdFR5cGUsCiAJCQl3Q3VycmVudFJhdGUsIGJOZWVkQWNrLCBieUZCT3B0aW9uKTsKIAkJLypHZXQgQ1RTIEZyYW1lIGJvZHkqLwotCQlwQnVmLT5kYXRhLmR1cmF0aW9uID0gcEJ1Zi0+d0R1cmF0aW9uX2JhOworCQlwQnVmLT5kYXRhLmR1cmF0aW9uID0gcEJ1Zi0+ZHVyYXRpb25fYmE7CiAJCXBCdWYtPmRhdGEuZnJhbWVfY29udHJvbCA9IFRZUEVfQ1RMX0NUUzsKIAkJbWVtY3B5KHBCdWYtPmRhdGEucmEsIHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyLCBFVEhfQUxFTik7CiAKQEAgLTgxNSwxNiArODE2LDE2IEBACiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX3J0cyAqcEJ1ZiA9CiAJCQkJCSZ0eF9idWZmZXItPnR4X2hlYWQudHhfcnRzLnJ0czsKIAotCQkJcEJ1Zi0+d1JUU1R4UnJ2VGltZV9hYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwKKwkJCXBCdWYtPnJ0c19ycnZfdGltZV9hYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwKIAkJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKLQkJCXBCdWYtPndSVFNUeFJydlRpbWVfYmEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDEsCisJCQlwQnVmLT5ydHNfcnJ2X3RpbWVfYmEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDEsCiAJCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7Ci0JCQlwQnVmLT53UlRTVHhScnZUaW1lX2JiID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAorCQkJcEJ1Zi0+cnRzX3Jydl90aW1lX2JiID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAKLQkJCXBCdWYtPndUeFJydlRpbWVfYSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWVfYSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwotCQkJcEJ1Zi0+d1R4UnJ2VGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCisJCQlwQnVmLT5ycnZfdGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJCVBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwKIAkJCQkJcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKTsKIApAQCAtODQ1LDEzICs4NDYsMTMgQEAKIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfY3RzICpwQnVmID0gJnR4X2J1ZmZlci0+CiAJCQkJCQkJdHhfaGVhZC50eF9jdHMuY3RzOwogCi0JCQlwQnVmLT53VHhScnZUaW1lX2EgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKKwkJCXBCdWYtPnJydl90aW1lX2EgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKLQkJCXBCdWYtPndUeFJydlRpbWVfYiA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWVfYiA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAogCQkJCVBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwKIAkJCQkJcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKTsKIAotCQkJcEJ1Zi0+d0NUU1R4UnJ2VGltZV9iYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMywKKwkJCXBCdWYtPmN0c19ycnZfdGltZV9iYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMywKIAkJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKIAogCQkJaWYgKG5lZWRfbWljKSB7CkBAIC04NzksMTAgKzg4MCwxMCBAQAogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqcEJ1ZiA9ICZ0eF9idWZmZXItPgogCQkJCQkJCXR4X2hlYWQudHhfYWIuYWI7CiAKLQkJCXBCdWYtPndSVFNUeFJydlRpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsCisJCQlwQnVmLT5ydHNfcnJ2X3RpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsCiAJCQkJYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKIAotCQkJcEJ1Zi0+d1R4UnJ2VGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKIAogCQkJLyogRmlsbCBSVFMgKi8KQEAgLTg5Myw3ICs4OTQsNyBAQAogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqcEJ1ZiA9ICZ0eF9idWZmZXItPgogCQkJCQkJCXR4X2hlYWQudHhfYWIuYWI7CiAKLQkJCXBCdWYtPndUeFJydlRpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKKwkJCXBCdWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJUEtfVFlQRV8xMUEsIGNiRnJhbWVTaXplLAogCQkJCQl3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKIApAQCAtOTEzLDEwICs5MTQsMTAgQEAKIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIgKnBCdWYgPSAmdHhfYnVmZmVyLT4KIAkJCQkJCQl0eF9oZWFkLnR4X2FiLmFiOwogCi0JCQlwQnVmLT53UlRTVHhScnZUaW1lID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAorCQkJcEJ1Zi0+cnRzX3Jydl90aW1lID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLAogCQkJCWJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAKLQkJCXBCdWYtPndUeFJydlRpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKKwkJCXBCdWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsCiAJCQkJUEtfVFlQRV8xMUIsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsCiAJCQkJCQkJCWJOZWVkQUNLKTsKIApAQCAtOTI4LDcgKzkyOSw3IEBACiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpwQnVmID0gJnR4X2J1ZmZlci0+CiAJCQkJCQkJdHhfaGVhZC50eF9hYi5hYjsKIAotCQkJcEJ1Zi0+d1R4UnJ2VGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLAorCQkJcEJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwKIAkJCQlQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsCiAJCQkJCXdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCkBAIC05OTEsOCArOTkyLDggQEAKICAgICAvL1NldCBwYWNrZXQgdHlwZQogICAgIHBUeEJ1ZkhlYWQtPndGSUZPQ3RsIHw9ICh1MTYpKGJ5UGt0VHlwZTw8OCk7CiAKLQlpZiAoKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQykgfHwKLQkJCShwRGV2aWNlLT5lT1BNb2RlID09IE9QX01PREVfQVApKSB7CisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJCXBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBzRXRoSGVhZGVyLT5oX2Rlc3QpKSB7CiAJCQliTmVlZEFDSyA9IGZhbHNlOwogCQkJcFR4QnVmSGVhZC0+d0ZJRk9DdGwgPQpAQCAtMTI5Miw3ICsxMjkzLDcgQEAKIAogCXBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgPSBUWVBFXzgwMl8xMV9EQVRBOwogCi0gICAgaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BUCkgeworICAgIGlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJbWVtY3B5KCYocE1BQ0hlYWRlci0+YWRkcjFbMF0pLAogCSAgICAgICAmKHBzRXRoSGVhZGVyLT5oX2Rlc3RbMF0pLAogCSAgICAgICBFVEhfQUxFTik7CkBAIC0xMzAyLDcgKzEzMDMsNyBAQAogCSAgICAgICBFVEhfQUxFTik7CiAgICAgICAgIHBNQUNIZWFkZXItPmZyYW1lX2NvbnRyb2wgfD0gRkNfRlJPTURTOwogICAgIH0gZWxzZSB7Ci0JaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9BREhPQykgeworCWlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCW1lbWNweSgmKHBNQUNIZWFkZXItPmFkZHIxWzBdKSwKIAkJICAgICAgICYocHNFdGhIZWFkZXItPmhfZGVzdFswXSksCiAJCSAgICAgICBFVEhfQUxFTik7CkBAIC0xNTQxLDggKzE1NDIsOCBAQAogICAgICAgICBwYnlJVkhlYWQgPSAodTggKikocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nKTsKICAgICAgICAgcGJ5UGF5bG9hZEhlYWQgPSAodTggKikocGJ5VHhCdWZmZXJBZGRyICsgY2JIZWFkZXJTaXplICsgY2JNYWNIZExlbiArIHVQYWRkaW5nICsgY2JJVmxlbik7CiAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICgocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFKSAmJgotICAgICAgICAgICAgICAgIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkpIHsKKwkgICAgaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkJCQlwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIHBieUJTU0lEID0gcERldmljZS0+YWJ5QlNTSUQ7CiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBhaXJ3aXNlIGtleQogICAgICAgICAgICAgICAgIGlmIChLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcGJ5QlNTSUQsIFBBSVJXSVNFX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gZmFsc2UpIHsKQEAgLTE1NjAsNyArMTU2MSw3IEBACiAgICAgICAgICAgICBwYnlCU1NJRCA9IHBEZXZpY2UtPmFieUJyb2FkY2FzdEFkZHI7CiAgICAgICAgICAgICBpZihLZXliR2V0VHJhbnNtaXRLZXkoJihwRGV2aWNlLT5zS2V5KSwgcGJ5QlNTSUQsIEdST1VQX0tFWSwgJnBUcmFuc21pdEtleSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICBwVHJhbnNtaXRLZXkgPSBOVUxMOwotICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iS0VZIGlzIE5VTEwuIE9QIE1vZGVbJWRdXG4iLCBwRGV2aWNlLT5lT1BNb2RlKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJLRVkgaXMgTlVMTC4gT1AgTW9kZVslZF1cbiIsIHBEZXZpY2UtPm9wX21vZGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkdldCBHVEsuXG4iKTsKICAgICAgICAgICAgIH0KQEAgLTE1OTIsMTQgKzE1OTMsMTQgQEAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyAqZGF0YV9oZWFkID0gJnBUWF9CdWZmZXItPnR4X2hlYWQuCiAJCQkJCQl0eF9jdHMudHguaGVhZC5jdHNfZy5kYXRhX2hlYWQ7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uX2EgPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uX2EgPQogCQkJY3B1X3RvX2xlMTYocFBhY2tldC0+cDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQpOwotCQlkYXRhX2hlYWQtPndEdXJhdGlvbl9iID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbl9iID0KIAkJCWNwdV90b19sZTE2KHBQYWNrZXQtPnA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FiICpkYXRhX2hlYWQgPSAmcFRYX0J1ZmZlci0+dHhfaGVhZC4KIAkJCQkJdHhfYWIudHguaGVhZC5kYXRhX2hlYWRfYWI7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbiA9CiAJCQljcHVfdG9fbGUxNihwUGFja2V0LT5wODAyMTFIZWFkZXItPnNBMi53RHVyYXRpb25JRCk7CiAJfQogICAgIH0KQEAgLTE2MDksNyArMTYxMCw3IEBACiAgICAgcFRYX0J1ZmZlci0+YnlUeXBlID0gMHgwMDsKIAogICAgIHBDb250ZXh0LT5wUGFja2V0ID0gTlVMTDsKLSAgICBwQ29udGV4dC0+VHlwZSA9IENPTlRFWFRfTUdNVF9QQUNLRVQ7CisgICAgcENvbnRleHQtPnR5cGUgPSBDT05URVhUX01HTVRfUEFDS0VUOwogICAgIHBDb250ZXh0LT51QnVmTGVuID0gKHUxNiljYlJlcUNvdW50ICsgNDsgIC8vVVNCIGhlYWRlcgogCiAgICAgaWYgKFdMQU5fR0VUX0ZDX1RPRFMocE1BQ0hlYWRlci0+ZnJhbWVfY29udHJvbCkgPT0gMCkgewpAQCAtMTcwMSw3ICsxNzAyLDcgQEAKICAgICBwVFhfQnVmZmVyLT5ieVR5cGUgPSAweDAxOwogCiAgICAgcENvbnRleHQtPnBQYWNrZXQgPSBOVUxMOwotICAgIHBDb250ZXh0LT5UeXBlID0gQ09OVEVYVF9NR01UX1BBQ0tFVDsKKyAgICBwQ29udGV4dC0+dHlwZSA9IENPTlRFWFRfTUdNVF9QQUNLRVQ7CiAgICAgcENvbnRleHQtPnVCdWZMZW4gPSAodTE2KWNiUmVxQ291bnQgKyA0OyAgLy9VU0IgaGVhZGVyCiAKICAgICBQSVBFbnNTZW5kQnVsa091dChwRGV2aWNlLHBDb250ZXh0KTsKQEAgLTIwMzIsMTQgKzIwMzMsMTQgQEAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyAqZGF0YV9oZWFkID0gJnBUWF9CdWZmZXItPnR4X2hlYWQuCiAJCQkJCQl0eF9jdHMudHguaGVhZC5jdHNfZy5kYXRhX2hlYWQ7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uX2EgPQorCQlkYXRhX2hlYWQtPmR1cmF0aW9uX2EgPQogCQkJY3B1X3RvX2xlMTYocDgwMjExSGVhZGVyLT5zQTIud0R1cmF0aW9uSUQpOwotCQlkYXRhX2hlYWQtPndEdXJhdGlvbl9iID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbl9iID0KIAkJCWNwdV90b19sZTE2KHA4MDIxMUhlYWRlci0+c0EyLndEdXJhdGlvbklEKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FiICpkYXRhX2hlYWQgPSAmcFRYX0J1ZmZlci0+dHhfaGVhZC4KIAkJCQkJdHhfYWIudHguaGVhZC5kYXRhX2hlYWRfYWI7Ci0JCWRhdGFfaGVhZC0+d0R1cmF0aW9uID0KKwkJZGF0YV9oZWFkLT5kdXJhdGlvbiA9CiAJCQljcHVfdG9fbGUxNihwODAyMTFIZWFkZXItPnNBMi53RHVyYXRpb25JRCk7CiAJfQogICAgIH0KQEAgLTIwNDksNyArMjA1MCw3IEBACiAgICAgcFRYX0J1ZmZlci0+YnlUeXBlID0gMHgwMDsKIAogICAgIHBDb250ZXh0LT5wUGFja2V0ID0gc2tiOwotICAgIHBDb250ZXh0LT5UeXBlID0gQ09OVEVYVF9NR01UX1BBQ0tFVDsKKyAgICBwQ29udGV4dC0+dHlwZSA9IENPTlRFWFRfTUdNVF9QQUNLRVQ7CiAgICAgcENvbnRleHQtPnVCdWZMZW4gPSAodTE2KWNiUmVxQ291bnQgKyA0OyAgLy9VU0IgaGVhZGVyCiAKICAgICBpZiAoV0xBTl9HRVRfRkNfVE9EUyhwTUFDSGVhZGVyLT5mcmFtZV9jb250cm9sKSA9PSAwKSB7CkBAIC0yMzA1LDcgKzIzMDYsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBpZiAocERldmljZS0+ZU9QTW9kZSA9PSBPUF9NT0RFX0FESE9DKSB7CisJaWYgKHBEZXZpY2UtPm9wX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKICAgICAgICAgICAgIC8vIEFkaG9jIFR4IHJhdGUgZGVjaWRlZCBmcm9tIG5vZGUgREIKIAkgICAgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBEZXZpY2UtPnNUeEV0aEhlYWRlci5oX2Rlc3QpKSB7CiAgICAgICAgICAgICAgICAgLy8gTXVsdGljYXN0IHVzZSBoaWdoZXN0IGRhdGEgcmF0ZQpAQCAtMjMzNiw3ICsyMzM3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBEZXZpY2UtPmVPUE1vZGUgPT0gT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSkgeworCWlmIChwRGV2aWNlLT5vcF9tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKICAgICAgICAgICAgIC8vIEluZnJhIFNUQSByYXRlIGRlY2lkZWQgZnJvbSBBUCBOb2RlLCBpbmRleCA9IDAKICAgICAgICAgICAgIHBEZXZpY2UtPndDdXJyZW50UmF0ZSA9IHBNZ210LT5zTm9kZURCVGFibGVbMF0ud1R4RGF0YVJhdGU7CiAgICAgICAgIH0KQEAgLTI0MzksMTEgKzI0NDAsMTEgQEAKICAgICBwVFhfQnVmZmVyLT53VHhCeXRlQ291bnQgPSAodTE2KUJ5dGVzVG9Xcml0ZTsKIAogICAgIHBDb250ZXh0LT5wUGFja2V0ID0gc2tiOwotICAgIHBDb250ZXh0LT5UeXBlID0gQ09OVEVYVF9EQVRBX1BBQ0tFVDsKKyAgICBwQ29udGV4dC0+dHlwZSA9IENPTlRFWFRfREFUQV9QQUNLRVQ7CiAgICAgcENvbnRleHQtPnVCdWZMZW4gPSAodTE2KUJ5dGVzVG9Xcml0ZSArIDQgOyAvL1VTQiBoZWFkZXIKIAogICAgIHNfdlNhdmVUeFBrdEluZm8ocERldmljZSwgKHU4KShwVFhfQnVmZmVyLT5ieVBLVE5PICYgMHgwRiksCi0JCQkmcENvbnRleHQtPnNFdGhIZWFkZXIuaF9kZXN0WzBdLAorCQkJJnBEZXZpY2UtPnNUeEV0aEhlYWRlci5oX2Rlc3RbMF0sCiAJCQkodTE2KShCeXRlc1RvV3JpdGUtdUhlYWRlckxlbiksCiAJCQlwVFhfQnVmZmVyLT5maWZvX2hlYWQud0ZJRk9DdGwpOwogCkBAIC0yNTkzLDExICsyNTk0LDExIEBACiAgICAgcFRYX0J1ZmZlci0+d1R4Qnl0ZUNvdW50ID0gKHUxNilCeXRlc1RvV3JpdGU7CiAKICAgICBwQ29udGV4dC0+cFBhY2tldCA9IE5VTEw7Ci0gICAgcENvbnRleHQtPlR5cGUgPSBDT05URVhUX0RBVEFfUEFDS0VUOworICAgIHBDb250ZXh0LT50eXBlID0gQ09OVEVYVF9EQVRBX1BBQ0tFVDsKICAgICBwQ29udGV4dC0+dUJ1ZkxlbiA9ICh1MTYpQnl0ZXNUb1dyaXRlICsgNCA7IC8vVVNCIGhlYWRlcgogCiAgICAgc192U2F2ZVR4UGt0SW5mbyhwRGV2aWNlLCAodTgpKHBUWF9CdWZmZXItPmJ5UEtUTk8gJiAweDBGKSwKLQkJJnBDb250ZXh0LT5zRXRoSGVhZGVyLmhfZGVzdFswXSwKKwkJJnBEZXZpY2UtPnNUeEV0aEhlYWRlci5oX2Rlc3RbMF0sCiAJCSh1MTYpKEJ5dGVzVG9Xcml0ZSAtIHVIZWFkZXJMZW4pLAogCQlwVFhfQnVmZmVyLT5maWZvX2hlYWQud0ZJRk9DdGwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCmluZGV4IGIzZWU2ZDAuLjZkNjUzOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5oCkBAIC01Myw2OCArNTMsNjggQEAKIAogLyogUnN2VGltZSBidWZmZXIgaGVhZGVyICovCiBzdHJ1Y3Qgdm50X3Jydl90aW1lX3J0cyB7Ci0JdTE2IHdSVFNUeFJydlRpbWVfYmE7Ci0JdTE2IHdSVFNUeFJydlRpbWVfYWE7Ci0JdTE2IHdSVFNUeFJydlRpbWVfYmI7CisJX19sZTE2IHJ0c19ycnZfdGltZV9iYTsKKwlfX2xlMTYgcnRzX3Jydl90aW1lX2FhOworCV9fbGUxNiBydHNfcnJ2X3RpbWVfYmI7CiAJdTE2IHdSZXNlcnZlZDsKLQl1MTYgd1R4UnJ2VGltZV9iOwotCXUxNiB3VHhScnZUaW1lX2E7CisJX19sZTE2IHJydl90aW1lX2I7CisJX19sZTE2IHJydl90aW1lX2E7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgdm50X3Jydl90aW1lX2N0cyB7Ci0JdTE2IHdDVFNUeFJydlRpbWVfYmE7CisJX19sZTE2IGN0c19ycnZfdGltZV9iYTsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3VHhScnZUaW1lX2I7Ci0JdTE2IHdUeFJydlRpbWVfYTsKKwlfX2xlMTYgcnJ2X3RpbWVfYjsKKwlfX2xlMTYgcnJ2X3RpbWVfYTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIgewotCXUxNiB3UlRTVHhScnZUaW1lOwotCXUxNiB3VHhScnZUaW1lOworCV9fbGUxNiBydHNfcnJ2X3RpbWU7CisJX19sZTE2IHJydl90aW1lOwogfSBfX3BhY2tlZDsKIAogLyogVFggZGF0YSBoZWFkZXIgKi8KIHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYjsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhOwotCXUxNiB3RHVyYXRpb25fYjsKLQl1MTYgd0R1cmF0aW9uX2E7Ci0JdTE2IHdUaW1lU3RhbXBPZmZfYjsKLQl1MTYgd1RpbWVTdGFtcE9mZl9hOworCV9fbGUxNiBkdXJhdGlvbl9iOworCV9fbGUxNiBkdXJhdGlvbl9hOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZl9iOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZl9hOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHZudF90eF9kYXRhaGVhZF9nX2ZiIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBiOwogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGE7Ci0JdTE2IHdEdXJhdGlvbl9iOwotCXUxNiB3RHVyYXRpb25fYTsKLQl1MTYgd0R1cmF0aW9uX2FfZjA7Ci0JdTE2IHdEdXJhdGlvbl9hX2YxOwotCXUxNiB3VGltZVN0YW1wT2ZmX2I7Ci0JdTE2IHdUaW1lU3RhbXBPZmZfYTsKKwlfX2xlMTYgZHVyYXRpb25fYjsKKwlfX2xlMTYgZHVyYXRpb25fYTsKKwlfX2xlMTYgZHVyYXRpb25fYV9mMDsKKwlfX2xlMTYgZHVyYXRpb25fYV9mMTsKKwlfX2xlMTYgdGltZV9zdGFtcF9vZmZfYjsKKwlfX2xlMTYgdGltZV9zdGFtcF9vZmZfYTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYWIgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGFiOwotCXUxNiB3RHVyYXRpb247Ci0JdTE2IHdUaW1lU3RhbXBPZmY7CisJX19sZTE2IGR1cmF0aW9uOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZjsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYV9mYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYTsKLQl1MTYgd0R1cmF0aW9uOwotCXUxNiB3VGltZVN0YW1wT2ZmOwotCXUxNiB3RHVyYXRpb25fZjA7Ci0JdTE2IHdEdXJhdGlvbl9mMTsKKwlfX2xlMTYgZHVyYXRpb247CisJX19sZTE2IHRpbWVfc3RhbXBfb2ZmOworCV9fbGUxNiBkdXJhdGlvbl9mMDsKKwlfX2xlMTYgZHVyYXRpb25fZjE7CiB9IF9fcGFja2VkOwogCiAvKiBSVFMgYnVmZmVyIGhlYWRlciAqLwogc3RydWN0IHZudF9ydHNfZyB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYjsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBhOwotCXUxNiB3RHVyYXRpb25fYmE7Ci0JdTE2IHdEdXJhdGlvbl9hYTsKLQl1MTYgd0R1cmF0aW9uX2JiOworCV9fbGUxNiBkdXJhdGlvbl9iYTsKKwlfX2xlMTYgZHVyYXRpb25fYWE7CisJX19sZTE2IGR1cmF0aW9uX2JiOwogCXUxNiB3UmVzZXJ2ZWQ7CiAJc3RydWN0IGllZWU4MDIxMV9ydHMgZGF0YTsKIAlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2cgZGF0YV9oZWFkOwpAQCAtMTIzLDIxICsxMjMsMjEgQEAKIHN0cnVjdCB2bnRfcnRzX2dfZmIgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGI7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYTsKLQl1MTYgd0R1cmF0aW9uX2JhOwotCXUxNiB3RHVyYXRpb25fYWE7Ci0JdTE2IHdEdXJhdGlvbl9iYjsKKwlfX2xlMTYgZHVyYXRpb25fYmE7CisJX19sZTE2IGR1cmF0aW9uX2FhOworCV9fbGUxNiBkdXJhdGlvbl9iYjsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3UlRTRHVyYXRpb25fYmFfZjA7Ci0JdTE2IHdSVFNEdXJhdGlvbl9hYV9mMDsKLQl1MTYgd1JUU0R1cmF0aW9uX2JhX2YxOwotCXUxNiB3UlRTRHVyYXRpb25fYWFfZjE7CisJX19sZTE2IHJ0c19kdXJhdGlvbl9iYV9mMDsKKwlfX2xlMTYgcnRzX2R1cmF0aW9uX2FhX2YwOworCV9fbGUxNiBydHNfZHVyYXRpb25fYmFfZjE7CisJX19sZTE2IHJ0c19kdXJhdGlvbl9hYV9mMTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyBkYXRhOwogCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZ19mYiBkYXRhX2hlYWQ7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgdm50X3J0c19hYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYWI7Ci0JdTE2IHdEdXJhdGlvbjsKKwlfX2xlMTYgZHVyYXRpb247CiAJdTE2IHdSZXNlcnZlZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyBkYXRhOwogCXN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfYWIgZGF0YV9oZWFkOwpAQCAtMTQ1LDEwICsxNDUsMTAgQEAKIAogc3RydWN0IHZudF9ydHNfYV9mYiB7CiAJc3RydWN0IHZudF9waHlfZmllbGQgYTsKLQl1MTYgd0R1cmF0aW9uOworCV9fbGUxNiBkdXJhdGlvbjsKIAl1MTYgd1Jlc2VydmVkOwotCXUxNiB3UlRTRHVyYXRpb25fZjA7Ci0JdTE2IHdSVFNEdXJhdGlvbl9mMTsKKwlfX2xlMTYgcnRzX2R1cmF0aW9uX2YwOworCV9fbGUxNiBydHNfZHVyYXRpb25fZjE7CiAJc3RydWN0IGllZWU4MDIxMV9ydHMgZGF0YTsKIAlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FfZmIgZGF0YV9oZWFkOwogfSBfX3BhY2tlZDsKQEAgLTE1Niw3ICsxNTYsNyBAQAogLyogQ1RTIGJ1ZmZlciBoZWFkZXIgKi8KIHN0cnVjdCB2bnRfY3RzIHsKIAlzdHJ1Y3Qgdm50X3BoeV9maWVsZCBiOwotCXUxNiB3RHVyYXRpb25fYmE7CisJX19sZTE2IGR1cmF0aW9uX2JhOwogCXUxNiB3UmVzZXJ2ZWQ7CiAJc3RydWN0IGllZWU4MDIxMV9jdHMgZGF0YTsKIAl1MTYgcmVzZXJ2ZWQyOwpAQCAtMTY1LDEwICsxNjUsMTAgQEAKIAogc3RydWN0IHZudF9jdHNfZmIgewogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGI7Ci0JdTE2IHdEdXJhdGlvbl9iYTsKKwlfX2xlMTYgZHVyYXRpb25fYmE7CiAJdTE2IHdSZXNlcnZlZDsKLQl1MTYgd0NUU0R1cmF0aW9uX2JhX2YwOwotCXUxNiB3Q1RTRHVyYXRpb25fYmFfZjE7CisJX19sZTE2IGN0c19kdXJhdGlvbl9iYV9mMDsKKwlfX2xlMTYgY3RzX2R1cmF0aW9uX2JhX2YxOwogCXN0cnVjdCBpZWVlODAyMTFfY3RzIGRhdGE7CiAJdTE2IHJlc2VydmVkMjsKIAlzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2dfZmIgZGF0YV9oZWFkOwpAQCAtMjM0LDggKzIzNCw4IEBACiAJdTE2IGZpZm9fY3RsOwogCXUxNiB0aW1lX3N0YW1wOwogCXN0cnVjdCB2bnRfcGh5X2ZpZWxkIGFiOwotCXUxNiBkdXJhdGlvbjsKLQl1MTYgdGltZV9zdGFtcF9vZmY7CisJX19sZTE2IGR1cmF0aW9uOworCV9fbGUxNiB0aW1lX3N0YW1wX29mZjsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2bnRfYmVhY29uX2J1ZmZlciB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3VzYnBpcGUuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCmluZGV4IDAxY2YwOTkuLmM1ODM4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCkBAIC0xMDUsNiArMTA1LDggQEAKIAogaW50IFBJUEVuc0NvbnRyb2xPdXQoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieVJlcXVlc3QsIHUxNiB3VmFsdWUsCiAJCXUxNiB3SW5kZXgsIHUxNiB3TGVuZ3RoLCB1OCAqcGJ5QnVmZmVyKQorCQlfX3JlbGVhc2VzKCZwRGV2aWNlLT5sb2NrKQorCQlfX2FjcXVpcmVzKCZwRGV2aWNlLT5sb2NrKQogewogCWludCBudFN0YXR1cyA9IDA7CiAJaW50IGlpOwpAQCAtMTY3LDYgKzE2OSw4IEBACiAKIGludCBQSVBFbnNDb250cm9sSW4oc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLCB1OCBieVJlcXVlc3QsIHUxNiB3VmFsdWUsCiAJdTE2IHdJbmRleCwgdTE2IHdMZW5ndGgsICB1OCAqcGJ5QnVmZmVyKQorCV9fcmVsZWFzZXMoJnBEZXZpY2UtPmxvY2spCisJX19hY3F1aXJlcygmcERldmljZS0+bG9jaykKIHsKIAlpbnQgbnRTdGF0dXMgPSAwOwogCWludCBpaTsKQEAgLTI5NSw0MCArMjk5LDM4IEBACiAgKgogICovCiAKLWludCBQSVBFbnNJbnRlcnJ1cHRSZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSkKK2ludCBQSVBFbnNJbnRlcnJ1cHRSZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKIHsKLQlpbnQgbnRTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwlpbnQgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc1N0YXJ0SW50ZXJydXB0VXNiUmVhZCgpXG4iKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkiLS0tLT5zX25zU3RhcnRJbnRlcnJ1cHRVc2JSZWFkKClcbiIpOwogCi0gICAgaWYocERldmljZS0+aW50QnVmLmJJblVzZSA9PSB0cnVlKXsKLSAgICAgICAgcmV0dXJuIChTVEFUVVNfRkFJTFVSRSk7Ci0gICAgfQotICAgIHBEZXZpY2UtPmludEJ1Zi5iSW5Vc2UgPSB0cnVlOwotLy8gICAgcERldmljZS0+YkV2ZW50QXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgcERldmljZS0+dWxJbnRJblBvc3RlZCsrOworCWlmIChwcml2LT5pbnRfYnVmLmluX3VzZSA9PSB0cnVlKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAKLSAgICAvLwotICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgY3JlYXRlZCB0aGUgdXJiLCB3ZSB3aWxsIHNlbmQgYQotICAgIC8vIHJlcXVlc3QgdG8gdGhlIFVTQiBkZXZpY2Ugb2JqZWN0LgotICAgIC8vCi0gICAgcERldmljZS0+cEludGVycnVwdFVSQi0+aW50ZXJ2YWwgPSBwRGV2aWNlLT5pbnRfaW50ZXJ2YWw7CisJcHJpdi0+aW50X2J1Zi5pbl91c2UgPSB0cnVlOwogCi11c2JfZmlsbF9idWxrX3VyYihwRGV2aWNlLT5wSW50ZXJydXB0VVJCLAotCQlwRGV2aWNlLT51c2IsCi0JCXVzYl9yY3ZidWxrcGlwZShwRGV2aWNlLT51c2IsIDEpLAotCQkodm9pZCAqKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYsCisJdXNiX2ZpbGxfaW50X3VyYihwcml2LT5wSW50ZXJydXB0VVJCLAorCQlwcml2LT51c2IsCisJCXVzYl9yY3ZpbnRwaXBlKHByaXYtPnVzYiwgMSksCisJCXByaXYtPmludF9idWYuZGF0YV9idWYsCiAJCU1BWF9JTlRFUlJVUFRfU0laRSwKIAkJc19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkLAotCQlwRGV2aWNlKTsKKwkJcHJpdiwKKwkJcHJpdi0+aW50X2ludGVydmFsKTsKIAotCW50U3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocERldmljZS0+cEludGVycnVwdFVSQiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG50U3RhdHVzICE9IDApIHsKLQkgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTdWJtaXQgaW50IFVSQiBmYWlsZWQgJWRcbiIsIG50U3RhdHVzKTsKLSAgICB9CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+cEludGVycnVwdFVSQiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cykgeworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkiU3VibWl0IGludCBVUkIgZmFpbGVkICVkXG4iLCBzdGF0dXMpOworCQlwcml2LT5pbnRfYnVmLmluX3VzZSA9IGZhbHNlOworCX0KIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iPC0tLS1zX25zU3RhcnRJbnRlcnJ1cHRVc2JSZWFkIFJldHVybigleClcbiIsbnRTdGF0dXMpOwotICAgIHJldHVybiBudFN0YXR1czsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCSI8LS0tLXNfbnNTdGFydEludGVycnVwdFVzYlJlYWQgUmV0dXJuKCV4KVxuIiwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC0zNDgsNjcgKzM1MCw0OCBAQAogCiBzdGF0aWMgdm9pZCBzX25zSW50ZXJydXB0VXNiSW9Db21wbGV0ZVJlYWQoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSA9IChzdHJ1Y3Qgdm50X3ByaXZhdGUgKil1cmItPmNvbnRleHQ7Ci0JaW50IG50U3RhdHVzOworCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPnNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZFxuIik7Ci0gICAgLy8KLSAgICAvLyBUaGUgY29udGV4dCBnaXZlbiB0byBJb1NldENvbXBsZXRpb25Sb3V0aW5lIGlzIHRoZSByZWNlaXZlIGJ1ZmZlciBvYmplY3QKLSAgICAvLworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSItLS0tPnNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZFxuIik7CiAKLSAgICAvLwotICAgIC8vIFdlIGhhdmUgYSBudW1iZXIgb2YgY2FzZXM6Ci0gICAgLy8gICAgICAxKSBUaGUgVVNCIHJlYWQgdGltZWQgb3V0IGFuZCB3ZSByZWNlaXZlZCBubyBkYXRhLgotICAgIC8vICAgICAgMikgVGhlIFVTQiByZWFkIHRpbWVkIG91dCBhbmQgd2UgcmVjZWl2ZWQgc29tZSBkYXRhLgotICAgIC8vICAgICAgMykgVGhlIFVTQiByZWFkIHdhcyBzdWNjZXNzZnVsIGFuZCBmdWxseSBmaWxsZWQgb3VyIGlycCBidWZmZXIuCi0gICAgLy8gICAgICA0KSBUaGUgaXJwIHdhcyBjYW5jZWxsZWQuCi0gICAgLy8gICAgICA1KSBTb21lIG90aGVyIGZhaWx1cmUgZnJvbSB0aGUgVVNCIGRldmljZSBvYmplY3QuCi0gICAgLy8KLSAgICBudFN0YXR1cyA9IHVyYi0+c3RhdHVzOworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJY2FzZSAtRVRJTUVET1VUOgorCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXByaXYtPmludF9idWYuaW5fdXNlID0gZmFsc2U7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZCBTdGF0dXMgJWRcbiIsIG50U3RhdHVzKTsKKwlzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotICAgIC8vIGlmIHdlIHdlcmUgbm90IHN1Y2Nlc3NmdWwsIHdlIG5lZWQgdG8gZnJlZSB0aGUgaW50IGJ1ZmZlciBmb3IgZnV0dXJlIHVzZSByaWdodCBoZXJlCi0gICAgLy8gb3RoZXJ3aXNlIGludGVycnVwdCBkYXRhIGhhbmRsZXIgd2lsbCBmcmVlIGludCBidWZmZXIgYWZ0ZXIgaXQgaGFuZGxlIGl0LgotICAgIGlmICgoIG50U3RhdHVzICE9IFNUQVRVU19TVUNDRVNTICkpIHsKLSAgICAgICAgcERldmljZS0+dWxCdWxrSW5FcnJvcisrOwotICAgICAgICBwRGV2aWNlLT5pbnRCdWYuYkluVXNlID0gZmFsc2U7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTworCQkic19uc0ludGVycnVwdFVzYklvQ29tcGxldGVSZWFkIFN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKIAotLy8gICAgICAgIGlmIChudFN0YXR1cyA9PSBVU0JEX1NUQVRVU19DUkMpIHsKLS8vICAgICAgICAgICAgcERldmljZS0+dWxJbnRJbkNvbnRDUkNFcnJvcisrOwotLy8gICAgICAgIH0KKwlpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXByaXYtPmludF9idWYuaW5fdXNlID0gZmFsc2U7CiAKLS8vICAgICAgICBpZiAobnRTdGF0dXMgPT0gU1RBVFVTX05PVF9DT05ORUNURUQgKQotLy8gICAgICAgIHsKLSAgICAgICAgICAgIHBEZXZpY2UtPmZLaWxsRXZlbnRQb2xsaW5nVGhyZWFkID0gdHJ1ZTsKLS8vICAgICAgICB9Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iSW50VVNCSW9Db21wbGV0ZUNvbnRyb2wgU1RBVFVTID0gJWRcbiIsIG50U3RhdHVzICk7Ci0gICAgfSBlbHNlIHsKLQkgICAgcERldmljZS0+dWxJbnRJbkJ5dGVzUmVhZCArPSAodW5zaWduZWQgbG9uZykgdXJiLT5hY3R1YWxfbGVuZ3RoOwotCSAgICBwRGV2aWNlLT51bEludEluQ29udENSQ0Vycm9yID0gMDsKLQkgICAgcERldmljZS0+YkV2ZW50QXZhaWxhYmxlID0gdHJ1ZTsKLQkgICAgSU5UbnNQcm9jZXNzRGF0YShwRGV2aWNlKTsKLSAgICB9CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSJJbnRVU0JJb0NvbXBsZXRlQ29udHJvbCBTVEFUVVMgPSAlZFxuIiwgc3RhdHVzKTsKKwl9IGVsc2UgeworCQlJTlRuc1Byb2Nlc3NEYXRhKHByaXYpOworCX0KIAotICAgIGlmIChwRGV2aWNlLT5mS2lsbEV2ZW50UG9sbGluZ1RocmVhZCAhPSB0cnVlKSB7Ci0gICAgICAgdXNiX2ZpbGxfYnVsa191cmIocERldmljZS0+cEludGVycnVwdFVSQiwKLQkJICAgICAgcERldmljZS0+dXNiLAotCQkgICAgICB1c2JfcmN2YnVsa3BpcGUocERldmljZS0+dXNiLCAxKSwKLQkJICAgICAodm9pZCAqKSBwRGV2aWNlLT5pbnRCdWYucERhdGFCdWYsCi0JCSAgICAgTUFYX0lOVEVSUlVQVF9TSVpFLAotCQkgICAgIHNfbnNJbnRlcnJ1cHRVc2JJb0NvbXBsZXRlUmVhZCwKLQkJICAgICBwRGV2aWNlKTsKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5wSW50ZXJydXB0VVJCLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCSJTdWJtaXQgaW50IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJcHJpdi0+aW50X2J1Zi5pbl91c2UgPSB0cnVlOworCX0KIAotCW50U3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocERldmljZS0+cEludGVycnVwdFVSQiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG50U3RhdHVzICE9IDApIHsKLQkgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTdWJtaXQgaW50IFVSQiBmYWlsZWQgJWRcbiIsIG50U3RhdHVzKTsKLSAgICAgICAgICAgfQotICAgIH0KLSAgICAvLwotICAgIC8vIFdlIHJldHVybiBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEIHNvIHRoYXQgdGhlIGNvbXBsZXRpb24KLSAgICAvLyByb3V0aW5lIChJb2ZDb21wbGV0ZVJlcXVlc3QpIHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBpcnAuCi0gICAgLy8KLSAgICByZXR1cm4gOworCXJldHVybjsKIH0KIAogLyoKQEAgLTQyNSw0NSArNDA4LDQxIEBACiAgKgogICovCiAKLWludCBQSVBFbnNCdWxrSW5Vc2JSZWFkKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSwgc3RydWN0IHZudF9yY2IgKnBSQ0IpCitpbnQgUElQRW5zQnVsa0luVXNiUmVhZChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHN0cnVjdCB2bnRfcmNiICpyY2IpCiB7Ci0JaW50IG50U3RhdHVzID0gMDsKLQlzdHJ1Y3QgdXJiICpwVXJiOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCB1cmIgKnVyYjsKIAotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zU3RhcnRCdWxrSW5Vc2JSZWFkXG4iKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc1N0YXJ0QnVsa0luVXNiUmVhZFxuIik7CiAKLSAgICBpZiAocERldmljZS0+RmxhZ3MgJiBmTVBfRElTQ09OTkVDVEVEKQotICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisJaWYgKHByaXYtPkZsYWdzICYgZk1QX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCi0gICAgcERldmljZS0+dWxCdWxrSW5Qb3N0ZWQrKzsKKwl1cmIgPSByY2ItPnBVcmI7CisJaWYgKHJjYi0+c2tiID09IE5VTEwpIHsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJyY2ItPnNrYiBpcyBudWxsXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLQlwVXJiID0gcFJDQi0+cFVyYjsKLSAgICAvLwotICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgY3JlYXRlZCB0aGUgdXJiLCB3ZSB3aWxsIHNlbmQgYQotICAgIC8vIHJlcXVlc3QgdG8gdGhlIFVTQiBkZXZpY2Ugb2JqZWN0LgotICAgIC8vCi0gICAgaWYgKHBSQ0ItPnNrYiA9PSBOVUxMKSB7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8icFJDQi0+c2tiIGlzIG51bGwgXG4iKTsKLSAgICAgICAgcmV0dXJuIG50U3RhdHVzOwotICAgIH0KLQotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsCi0JCXBEZXZpY2UtPnVzYiwKLQkJdXNiX3JjdmJ1bGtwaXBlKHBEZXZpY2UtPnVzYiwgMiksCi0JCSh2b2lkICopIChwUkNCLT5za2ItPmRhdGEpLAorCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKKwkJcHJpdi0+dXNiLAorCQl1c2JfcmN2YnVsa3BpcGUocHJpdi0+dXNiLCAyKSwKKwkJKHZvaWQgKikgKHJjYi0+c2tiLT5kYXRhKSwKIAkJTUFYX1RPVEFMX1NJWkVfV0lUSF9BTExfSEVBREVSUywKIAkJc19uc0J1bGtJblVzYklvQ29tcGxldGVSZWFkLAotCQlwUkNCKTsKKwkJcmNiKTsKIAotCW50U3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG50U3RhdHVzICE9IDApIHsKLQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgbnRTdGF0dXMpOworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkiU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CiAJCXJldHVybiBTVEFUVVNfRkFJTFVSRSA7CiAJfQotICAgIHBSQ0ItPlJlZiA9IDE7Ci0gICAgcFJDQi0+YkJvb2xJblVzZT0gdHJ1ZTsKIAotICAgIHJldHVybiBudFN0YXR1czsKKwlyY2ItPlJlZiA9IDE7CisJcmNiLT5iQm9vbEluVXNlID0gdHJ1ZTsKKworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC00ODMsNTEgKzQ2Miw0NyBAQAogCiBzdGF0aWMgdm9pZCBzX25zQnVsa0luVXNiSW9Db21wbGV0ZVJlYWQoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCB2bnRfcmNiICpwUkNCID0gKHN0cnVjdCB2bnRfcmNiICopdXJiLT5jb250ZXh0OwotCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSA9IHBSQ0ItPnBEZXZpY2U7Ci0JdW5zaWduZWQgbG9uZyAgIGJ5dGVzUmVhZDsKLQlpbnQgYkluZGljYXRlUmVjZWl2ZSA9IGZhbHNlOwotCWludCBiUmVBbGxvY1NrYiA9IGZhbHNlOwotCWludCBzdGF0dXM7CisJc3RydWN0IHZudF9yY2IgKnJjYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPSByY2ItPnBEZXZpY2U7CisJaW50IHJlX2FsbG9jX3NrYiA9IGZhbHNlOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyItLS0tPnNfbnNCdWxrSW5Vc2JJb0NvbXBsZXRlUmVhZFxuIik7Ci0gICAgc3RhdHVzID0gdXJiLT5zdGF0dXM7Ci0gICAgYnl0ZXNSZWFkID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iLS0tLT5zX25zQnVsa0luVXNiSW9Db21wbGV0ZVJlYWRcbiIpOwogCi0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkVycm9yKys7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQlVMSyBJbiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7Ci0vL3RvZG8uLi54eHh4eHgKLS8vICAgICAgICBpZiAoc3RhdHVzID09IFVTQkRfU1RBVFVTX0NSQykgewotLy8gICAgICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkNvbnRDUkNFcnJvcisrOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAoc3RhdHVzID09IFNUQVRVU19ERVZJQ0VfTk9UX0NPTk5FQ1RFRCApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBNUF9TRVRfRkxBRyhwRGV2aWNlLCBmTVBfRElTQ09OTkVDVEVEKTsKLS8vICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLQlpZiAoYnl0ZXNSZWFkKQotCQliSW5kaWNhdGVSZWNlaXZlID0gdHJ1ZTsKLSAgICAgICAgcERldmljZS0+dWxCdWxrSW5Db250Q1JDRXJyb3IgPSAwOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtJbkJ5dGVzUmVhZCArPSBieXRlc1JlYWQ7Ci0gICAgfQorCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuOworCWNhc2UgLUVUSU1FRE9VVDoKKwlkZWZhdWx0OgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkJIkJVTEsgSW4gZmFpbGVkICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWJyZWFrOworCX0KIAotICAgIGlmIChiSW5kaWNhdGVSZWNlaXZlKSB7Ci0gICAgICAgIHNwaW5fbG9jaygmcERldmljZS0+bG9jayk7Ci0gICAgICAgIGlmIChSWGJCdWxrSW5Qcm9jZXNzRGF0YShwRGV2aWNlLCBwUkNCLCBieXRlc1JlYWQpID09IHRydWUpCi0gICAgICAgICAgICBiUmVBbGxvY1NrYiA9IHRydWU7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZwRGV2aWNlLT5sb2NrKTsKLSAgICB9Ci0gICAgcFJDQi0+UmVmLS07Ci0gICAgaWYgKHBSQ0ItPlJlZiA9PSAwKQotICAgIHsKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJSeHZGcmVlTm9ybWFsICVkIFxuIixwRGV2aWNlLT5OdW1SZWN2RnJlZUxpc3QpOwotICAgICAgICBzcGluX2xvY2soJnBEZXZpY2UtPmxvY2spOwotICAgICAgICBSWHZGcmVlUkNCKHBSQ0IsIGJSZUFsbG9jU2tiKTsKLSAgICAgICAgc3Bpbl91bmxvY2soJnBEZXZpY2UtPmxvY2spOwotICAgIH0KKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAKLSAgICByZXR1cm47CisJCWlmIChSWGJCdWxrSW5Qcm9jZXNzRGF0YShwcml2LCByY2IsIHVyYi0+YWN0dWFsX2xlbmd0aCkgPT0gdHJ1ZSkKKwkJCXJlX2FsbG9jX3NrYiA9IHRydWU7CisKKwkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCX0KKworCXJjYi0+UmVmLS07CisJaWYgKHJjYi0+UmVmID09IDApIHsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJSeHZGcmVlTm9ybWFsICVkXG4iLAorCQkJCQkJCXByaXYtPk51bVJlY3ZGcmVlTGlzdCk7CisJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwkJUlh2RnJlZVJDQihyY2IsIHJlX2FsbG9jX3NrYik7CisKKwkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCX0KKworCXJldHVybjsKIH0KIAogLyoKQEAgLTU0NCw1MyArNTE5LDQwIEBACiAgKgogICovCiAKLWludCBQSVBFbnNTZW5kQnVsa091dChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCi0JCQkJc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpwQ29udGV4dCkKK2ludCBQSVBFbnNTZW5kQnVsa091dChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCisJCQkJc3RydWN0IHZudF91c2Jfc2VuZF9jb250ZXh0ICpjb250ZXh0KQogewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IHVyYiAgICAgICAgICAqcFVyYjsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAKLSAgICBwRGV2aWNlLT5iUFdCaXRPbiA9IGZhbHNlOworCXByaXYtPmJQV0JpdE9uID0gZmFsc2U7CiAKLS8qCi0gICAgaWYgKHBEZXZpY2UtPnBQZW5kaW5nQnVsa091dENvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBwRGV2aWNlLT5OdW1Db250ZXh0c1F1ZXVlZCsrOwotICAgICAgICBFbnF1ZXVlQ29udGV4dChwRGV2aWNlLT5GaXJzdFR4Q29udGV4dFF1ZXVlLCBwRGV2aWNlLT5MYXN0VHhDb250ZXh0UXVldWUsIHBDb250ZXh0KTsKLSAgICAgICAgc3RhdHVzID0gU1RBVFVTX1BFTkRJTkc7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU2VuZCBwZW5kaW5nIVxuIik7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotKi8KKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfbnNTZW5kQnVsa091dFxuIik7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPInNfbnNTZW5kQnVsa091dFxuIik7CisJaWYgKCEoTVBfSVNfUkVBRFkocHJpdikgJiYgcHJpdi0+RmxhZ3MgJiBmTVBfUE9TVF9XUklURVMpKSB7CisJCWNvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKKwkJcmV0dXJuIFNUQVRVU19SRVNPVVJDRVM7CisJfQogCi0gICAgaWYgKE1QX0lTX1JFQURZKHBEZXZpY2UpICYmIChwRGV2aWNlLT5GbGFncyAmIGZNUF9QT1NUX1dSSVRFUykpIHsKKwl1cmIgPSBjb250ZXh0LT5wVXJiOwogCi0gICAgICAgIHBVcmIgPSBwQ29udGV4dC0+cFVyYjsKLSAgICAgICAgcERldmljZS0+dWxCdWxrT3V0UG9zdGVkKys7Ci0vLyAgICAgICAgcERldmljZS0+cFBlbmRpbmdCdWxrT3V0Q29udGV4dCA9IHBDb250ZXh0OwotICAgICAgICB1c2JfZmlsbF9idWxrX3VyYigKLSAgICAgICAgCSAgICBwVXJiLAotICAgICAgICAJCXBEZXZpY2UtPnVzYiwKLQkJICAgIHVzYl9zbmRidWxrcGlwZShwRGV2aWNlLT51c2IsIDMpLAotCQkgICAgKHZvaWQgKikgJihwQ29udGV4dC0+RGF0YVswXSksCi0gICAgICAgIAkJcENvbnRleHQtPnVCdWZMZW4sCi0gICAgICAgIAkJc19uc0J1bGtPdXRJb0NvbXBsZXRlV3JpdGUsCi0gICAgICAgIAkJcENvbnRleHQpOworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKKwkJCXByaXYtPnVzYiwKKwkJCXVzYl9zbmRidWxrcGlwZShwcml2LT51c2IsIDMpLAorCQkJY29udGV4dC0+RGF0YSwKKwkJCWNvbnRleHQtPnVCdWZMZW4sCisJCQlzX25zQnVsa091dElvQ29tcGxldGVXcml0ZSwKKwkJCWNvbnRleHQpOwogCi0gICAgCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpOwotICAgIAlpZiAoc3RhdHVzICE9IDApCi0gICAgCXsKLSAgICAJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7Ci0JCXBDb250ZXh0LT5iQm9vbEluVXNlID0gZmFsc2U7Ci0gICAgCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIFNUQVRVU19QRU5ESU5HOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcENvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19SRVNPVVJDRVM7Ci0gICAgfQorCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkiU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CisJCWNvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBTVEFUVVNfUEVORElORzsKIH0KIAogLyoKQEAgLTYyMyw2OCArNTg1LDQ5IEBACiAKIHN0YXRpYyB2b2lkIHNfbnNCdWxrT3V0SW9Db21wbGV0ZVdyaXRlKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2U7Ci0JaW50IHN0YXR1czsKLQlDT05URVhUX1RZUEUgQ29udGV4dFR5cGU7Ci0JdW5zaWduZWQgbG9uZyB1bEJ1ZkxlbjsKLQlzdHJ1Y3Qgdm50X3VzYl9zZW5kX2NvbnRleHQgKnBDb250ZXh0OworCXN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqY29udGV4dCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYgPSBjb250ZXh0LT5wRGV2aWNlOworCXU4IGNvbnRleHRfdHlwZSA9IGNvbnRleHQtPnR5cGU7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc0J1bGtPdXRJb0NvbXBsZXRlV3JpdGVcbiIpOwotICAgIC8vCi0gICAgLy8gVGhlIGNvbnRleHQgZ2l2ZW4gdG8gSW9TZXRDb21wbGV0aW9uUm91dGluZSBpcyBhbiBVU0JfQ09OVEVYVCBzdHJ1Y3QKLSAgICAvLwotCXBDb250ZXh0ID0gKHN0cnVjdCB2bnRfdXNiX3NlbmRfY29udGV4dCAqKXVyYi0+Y29udGV4dDsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIi0tLS0+c19uc0J1bGtPdXRJb0NvbXBsZXRlV3JpdGVcbiIpOwogCi0gICAgcERldmljZSA9IHBDb250ZXh0LT5wRGV2aWNlOwotICAgIENvbnRleHRUeXBlID0gcENvbnRleHQtPlR5cGU7Ci0gICAgdWxCdWZMZW4gPSBwQ29udGV4dC0+dUJ1ZkxlbjsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkiV3JpdGUgJWQgYnl0ZXNcbiIsIGNvbnRleHQtPnVCdWZMZW4pOworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCWNvbnRleHQtPmJCb29sSW5Vc2UgPSBmYWxzZTsKKwkJcmV0dXJuOworCWNhc2UgLUVUSU1FRE9VVDoKKwlkZWZhdWx0OgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPCisJCQkJIkJVTEsgT3V0IGZhaWxlZCAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQlicmVhazsKKwl9CiAKLSAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KHBEZXZpY2UtPmRldikpCi0JICAgIHJldHVybjsKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KHByaXYtPmRldikpCisJCXJldHVybjsKIAotICAgLy8KLSAgICAvLyBQZXJmb3JtIHZhcmlvdXMgSVJQLCBVUkIsIGFuZCBidWZmZXIgJ3Nhbml0eSBjaGVja3MnCi0gICAgLy8KKwlpZiAoQ09OVEVYVF9EQVRBX1BBQ0tFVCA9PSBjb250ZXh0X3R5cGUpIHsKKwkJaWYgKGNvbnRleHQtPnBQYWNrZXQgIT0gTlVMTCkgeworCQkJZGV2X2tmcmVlX3NrYl9pcnEoY29udGV4dC0+cFBhY2tldCk7CisJCQljb250ZXh0LT5wUGFja2V0ID0gTlVMTDsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8KKwkJCQkidHggICVkIGJ5dGVzXG4iLCBjb250ZXh0LT51QnVmTGVuKTsKKwkJfQogCi0gICAgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJCXByaXYtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KIAotICAgIGlmKHN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIldyaXRlICVkIGJ5dGVzXG4iLChpbnQpdWxCdWZMZW4pOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtPdXRCeXRlc1dyaXRlICs9IHVsQnVmTGVuOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtPdXRDb250Q1JDRXJyb3IgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iQlVMSyBPdXQgZmFpbGVkICVkXG4iLCBzdGF0dXMpOwotICAgICAgICBwRGV2aWNlLT51bEJ1bGtPdXRFcnJvcisrOwotICAgIH0KKwlpZiAocHJpdi0+YkxpbmtQYXNzID09IHRydWUpIHsKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+ZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKKwl9CiAKLS8vICAgIHBEZXZpY2UtPnVsQ2hlY2tGb3JIYW5nQ291bnQgPSAwOwotLy8gICAgcERldmljZS0+cFBlbmRpbmdCdWxrT3V0Q29udGV4dCA9IE5VTEw7CisJY29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOwogCi0gICAgaWYgKCBDT05URVhUX0RBVEFfUEFDS0VUID09IENvbnRleHRUeXBlICkgewotICAgICAgICAvLyBJbmRpY2F0ZSB0byB0aGUgcHJvdG9jb2wgdGhlIHN0YXR1cyBvZiB0aGUgc2VudCBwYWNrZXQgYW5kIHJldHVybgotICAgICAgICAvLyBvd25lcnNoaXAgb2YgdGhlIHBhY2tldC4KLQkgICAgaWYgKHBDb250ZXh0LT5wUGFja2V0ICE9IE5VTEwpIHsKLQkgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHBDb250ZXh0LT5wUGFja2V0KTsKLQkgICAgICAgIHBDb250ZXh0LT5wUGFja2V0ID0gTlVMTDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8idHggICVkIGJ5dGVzXG4iLChpbnQpdWxCdWZMZW4pOwotCSAgICB9Ci0KLSAgICAgICAgcERldmljZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgewotICAgICAgICAgICAgcERldmljZS0+cGFja2V0c1NlbnQrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iU2VuZCBVU0IgZXJyb3IhIFslMDh4aF1cbiIsIHN0YXR1cyk7Ci0gICAgICAgICAgICBwRGV2aWNlLT5wYWNrZXRzU2VudERyb3BwZWQrKzsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgewotICAgICAgICBpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwRGV2aWNlLT5kZXYpKQotICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZShwRGV2aWNlLT5kZXYpOwotICAgIH0KLSAgICBwQ29udGV4dC0+YkJvb2xJblVzZSA9IGZhbHNlOwotCi0gICAgcmV0dXJuOworCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKaW5kZXggNmI5NTIyOS4uM2NmM2YyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKQEAgLTI5MywxNyArMjkzLDExIEBACiAJY2FzZSBXTEFOX0NNRF9TQ0FOX1NUQVJUOgogCiAJCXBEZXZpY2UtPmJ5UmVBc3NvY0NvdW50ID0gMDsKLQkJaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKSB7Ci0JCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJcmV0dXJuOwotCQl9CisJCWlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkKKwkJCWJyZWFrOwogCi0JCWlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9FU1NfQVApIHsKLQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkKKwkJCWJyZWFrOwogCiAJCXBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlTY2FuU1NJRDsKIApAQCAtMzExLDE2ICszMDUsMTIgQEAKIAkJCXBNZ210LT51U2NhbkNoYW5uZWwgPSBwRGV2aWNlLT5ieU1pbkNoYW5uZWw7CiAJCWlmIChwTWdtdC0+dVNjYW5DaGFubmVsID4gcERldmljZS0+YnlNYXhDaGFubmVsKSB7CiAJCQlwRGV2aWNlLT5lQ29tbWFuZFN0YXRlID0gV0xBTl9DTURfU0NBTl9FTkQ7Ci0JCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlpZiAoIUNoYW5uZWxWYWxpZChwRGV2aWNlLT5ieVpvbmVUeXBlLCBwTWdtdC0+dVNjYW5DaGFubmVsKSkgewogCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkludmFsaWQgY2hhbm5lbCBwTWdtdC0+dVNjYW5DaGFubmVsID0gJWRcbiIsIHBNZ210LT51U2NhbkNoYW5uZWwpOwogCQkJCXBNZ210LT51U2NhbkNoYW5uZWwrKzsKLQkJCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAocE1nbXQtPnVTY2FuQ2hhbm5lbCA9PSBwRGV2aWNlLT5ieU1pbkNoYW5uZWwpIHsKIAkJCQkvLyBwTWdtdC0+ZVNjYW5UeXBlID0gV01BQ19TQ0FOX0FDVElWRTsgICAgICAgICAgLy9taWtlIG1hcmsKQEAgLTQyMCwxNiArNDEwLDEzIEBACiAJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKIAkJd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7CiAKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfRElTQVNTT0NJQVRFX1NUQVJUOgogCQlwRGV2aWNlLT5ieVJlQXNzb2NDb3VudCA9IDA7CiAJCWlmICgocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX1NUQSkgJiYKIAkJICAgIChwTWdtdC0+ZUN1cnJTdGF0ZSAhPSBXTUFDX1NUQVRFX0FTU09DKSkgewotCQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCXJldHVybjsKKwkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJcERldmljZS0+YndleHRzdGVwMCA9IGZhbHNlOwogCQkJcERldmljZS0+YndleHRzdGVwMSA9IGZhbHNlOwpAQCAtNDU4LDE3ICs0NDUsMTQgQEAKIAkJbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOwogCQlpZiAocERldmljZS0+Yk5lZWRSYWRpb09GRiA9PSB0cnVlKQogCQkJQ0FSRGJSYWRpb1Bvd2VyT2ZmKHBEZXZpY2UpOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CisKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX1NTSURfU1RBUlQ6CiAKIAkJcERldmljZS0+YnlSZUFzc29jQ291bnQgPSAwOwotCQlpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKLQkJCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKQorCQkJYnJlYWs7CiAKIAkJbWVtY3B5KHBNZ210LT5hYnlBZEhvY1NTSUQsIHBNZ210LT5hYnlEZXNpcmVTU0lELAogCQkgICAgICAgKChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlEZXNpcmVTU0lEKS0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwpAQCAtNDg5LDExICs0NzMsOSBAQAogCQlpZiAoKHBNZ210LT5lQ3VyclN0YXRlID09IFdNQUNfU1RBVEVfQVNTT0MpIHx8CiAJCSAgICAoKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0lCU1NfU1RBKSAmJiAocE1nbXQtPmVDdXJyU3RhdGUgPT0gV01BQ19TVEFURV9KT0lOVEVEKSkpIHsKIAkJCWlmIChwSXRlbVNTSUQtPmxlbiA9PSBwSXRlbVNTSURDdXJyLT5sZW4pIHsKLQkJCQlpZiAobWVtY21wKHBJdGVtU1NJRC0+YWJ5U1NJRCwgcEl0ZW1TU0lEQ3Vyci0+YWJ5U1NJRCwgcEl0ZW1TU0lELT5sZW4pID09IDApIHsKLQkJCQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwotCQkJCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCQkJCQlyZXR1cm47Ci0JCQkJfQorCQkJCWlmICghbWVtY21wKHBJdGVtU1NJRC0+YWJ5U1NJRCwKKwkJCQkJcEl0ZW1TU0lEQ3Vyci0+YWJ5U1NJRCwgcEl0ZW1TU0lELT5sZW4pKQorCQkJCQlicmVhazsKIAkJCX0KIAkJCW5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKIAkJCXBEZXZpY2UtPmJMaW5rUGFzcyA9IGZhbHNlOwpAQCAtNTgyLDcgKzU2NCw2IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQVVUSEVOVElDQVRFX1dBSVQ6CkBAIC02MTIsNyArNTkzLDYgQEAKIAkJfQogCQlwRGV2aWNlLT5ieUxpbmtXYWl0Q291bnQgPSAwOwogCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQVNTT0NJQVRFX1dBSVQ6CkBAIC02NDcsNyArNjI3LDYgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX0FQX01PREVfU1RBUlQ6CkBAIC02ODMsNyArNjYyLDYgQEAKIAkJCUNvbnRyb2x2TWFza0J5dGUocERldmljZSwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgTUFDX1JFR19QQVBFREVMQVksIExFRFNUU19TVFMsIExFRFNUU19JTlRFUik7CiAJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBEZXZpY2UtPnNlY29uZF9jYWxsYmFja193b3JrLCBIWik7CiAJCX0KLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfVFhfUFNQQUNLRVRfU1RBUlQ6CkBAIC03MzgsOCArNzE2LDYgQEAKIAkJCQlwTWdtdC0+c05vZGVEQlRhYmxlW2lpXS5iUnhQU1BvbGwgPSBmYWxzZTsKIAkJCX0KIAkJfQotCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX1JBRElPX1NUQVJUOgpAQCAtNzYwLDExICs3MzYsOCBAQAogCQkJCQkxLAogCQkJCQkmYnlUbXApOwogCi0JCQlpZiAobnRTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCQlpZiAobnRTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJYnJlYWs7CiAJCQlpZiAoKGJ5VG1wICYgR1BJTzNfREFUQSkgPT0gMCkgewogCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iIFdMQU5fQ01EX1JBRElPX1NUQVJUX09GRi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuIik7CiAJCQkJLy8gT2xkIGNvbW1hbmRzIGFyZSB1c2VsZXNzLgpAQCAtODMzLDcgKzgwNiw2IEBACiAJCQl9CiAJCX0KIAotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9DSEFOR0VfQkJTRU5TSVRJVklUWV9TVEFSVDoKQEAgLTg0MywyNCArODE1LDIwIEBACiAJCUJCdlNldFZHQUdhaW5PZmZzZXQocERldmljZSwgcERldmljZS0+YnlCQlZHQUN1cnJlbnQpOwogCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIkNoYW5nZSBzZW5zaXRpdml0eSBwRGV2aWNlLT5ieUJCVkdBQ3VycmVudCA9ICV4XG4iLCBwRGV2aWNlLT5ieUJCVkdBQ3VycmVudCk7CiAJCXBEZXZpY2UtPmJTdG9wRGF0YVBrdCA9IGZhbHNlOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9UQlRUX1dBS0VVUF9TVEFSVDoKIAkJUFNiSXNOZXh0VEJUVFdha2VVcChwRGV2aWNlKTsKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfQkVDT05fU0VORF9TVEFSVDoKIAkJYk1nclByZXBhcmVCZWFjb25Ub1NlbmQocERldmljZSwgcE1nbXQpOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9TRVRQT1dFUl9TVEFSVDoKIAogCQlSRmJTZXRQb3dlcihwRGV2aWNlLCBwRGV2aWNlLT53Q3VycmVudFJhdGUsIHBNZ210LT51Q3VyckNoYW5uZWwpOwogCi0JCXNfYkNvbW1hbmRDb21wbGV0ZShwRGV2aWNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fQ01EX0NIQU5HRV9BTlRFTk5BX1NUQVJUOgpAQCAtODc4LDEyICs4NDYsMTAgQEAKIAkJCWVsc2UKIAkJCQlCQnZTZXRBbnRlbm5hTW9kZShwRGV2aWNlLCBBTlRfUlhBKTsKIAkJfQotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF9SRU1PVkVfQUxMS0VZX1NUQVJUOgogCQlLZXliUmVtb3ZlQWxsS2V5KHBEZXZpY2UsICYocERldmljZS0+c0tleSksIHBEZXZpY2UtPmFieUJTU0lEKTsKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9DTURfTUFDX0RJU1BPV0VSU0FWSU5HX1NUQVJUOgpAQCAtODk4LDcgKzg2NCw2IEBACiAJCQkJCU5VTEwKIAkJCQkJKTsKIAkJfQotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX0NNRF8xMUhfQ0hTV19TVEFSVDoKQEAgLTkwNiwxNCArODcxLDE3IEBACiAJCXBEZXZpY2UtPmJDaGFubmVsU3dpdGNoID0gZmFsc2U7CiAJCXBNZ210LT51Q3VyckNoYW5uZWwgPSBwRGV2aWNlLT5ieU5ld0NoYW5uZWw7CiAJCXBEZXZpY2UtPmJTdG9wRGF0YVBrdCA9IGZhbHNlOwotCQlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CiAJCWJyZWFrOwogCisJY2FzZSBXTEFOX0NNRF9DT05GSUdVUkVfRklMVEVSX1NUQVJUOgorCQl2bnRfY29uZmlndXJlX2ZpbHRlcihwRGV2aWNlKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc19iQ29tbWFuZENvbXBsZXRlKHBEZXZpY2UpOwogCQlicmVhazsKIAl9IC8vc3dpdGNoCiAKKwlzX2JDb21tYW5kQ29tcGxldGUocERldmljZSk7CisKIAlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwogCXJldHVybjsKIH0KQEAgLTEwMDksNiArOTc3LDExIEBACiAJCQlwRGV2aWNlLT5lQ29tbWFuZFN0YXRlID0gV0xBTl9DTURfMTFIX0NIU1dfU1RBUlQ7CiAJCQlicmVhazsKIAorCQljYXNlIFdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVI6CisJCQlwRGV2aWNlLT5lQ29tbWFuZFN0YXRlID0KKwkJCQkJCVdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVJfU1RBUlQ7CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmgKaW5kZXggY2FmMjY4NC4uNzM2NTcyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmgKQEAgLTUxLDcgKzUxLDggQEAKICAgICBXTEFOX0NNRF9SRU1PVkVfQUxMS0VZLAogICAgIFdMQU5fQ01EX01BQ19ESVNQT1dFUlNBVklORywKICAgICBXTEFOX0NNRF8xMUhfQ0hTVywKLSAgICBXTEFOX0NNRF9SVU5fQVAKKyAgICBXTEFOX0NNRF9SVU5fQVAsCisgICAgV0xBTl9DTURfQ09ORklHVVJFX0ZJTFRFUgogfSBDTURfQ09ERSwgKlBDTURfQ09ERTsKIAogI2RlZmluZSBDTURfUV9TSVpFICAgICAgICAgICAgICAzMgpAQCAtOTYsNiArOTcsNyBAQAogICAgIFdMQU5fQ01EX1JFTU9WRV9BTExLRVlfU1RBUlQsCiAgICAgV0xBTl9DTURfTUFDX0RJU1BPV0VSU0FWSU5HX1NUQVJULAogICAgIFdMQU5fQ01EXzExSF9DSFNXX1NUQVJULAorICAgIFdMQU5fQ01EX0NPTkZJR1VSRV9GSUxURVJfU1RBUlQsCiAgICAgV0xBTl9DTURfSURMRQogfSBDTURfU1RBVEUsICpQQ01EX1NUQVRFOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dtZ3IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCmluZGV4IGQ3NGIwZTcuLjBkNjk3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCkBAIC0yMTY0LDEyICsyMTY0LDEyIEBACiAgICAgICAgIHBNZ210LT53Q3VyckNhcEluZm8gfD0gV0xBTl9TRVRfQ0FQX0lORk9fRVNTKDEpOwogICAgICAgICBwTWdtdC0+YnlEVElNUGVyaW9kID0gREVGQVVMVF9EVElNX1BFUklPRDsKICAgICAgICAgcE1nbXQtPmJ5RFRJTUNvdW50ID0gcE1nbXQtPmJ5RFRJTVBlcmlvZCAtIDE7Ci0gICAgICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0FQOworCXBEZXZpY2UtPm9wX21vZGUgPSBOTDgwMjExX0lGVFlQRV9BUDsKICAgICB9CiAKICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpIHsKICAgICAgICAgcE1nbXQtPndDdXJyQ2FwSW5mbyB8PSBXTEFOX1NFVF9DQVBfSU5GT19JQlNTKDEpOwotICAgICAgICBwRGV2aWNlLT5lT1BNb2RlID0gT1BfTU9ERV9BREhPQzsKKwlwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfQURIT0M7CiAgICAgfQogCiAgICAgaWYgKHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlKSB7CkBAIC0yMzU5LDcgKzIzNTksNyBAQAogCiAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSk9JTlRFRDsKICAgICAgICAgICAgIC8vIEFkb3B0IEJTUyBzdGF0ZSBpbiBBZGFwdGVyIERldmljZSBPYmplY3QKLSAgICAgICAgICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0lORlJBU1RSVUNUVVJFOworCSAgICBwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKICAgICAgICAgICAgIG1lbWNweShwRGV2aWNlLT5hYnlCU1NJRCwgcEN1cnItPmFieUJTU0lELCBXTEFOX0JTU0lEX0xFTik7CiAKICAgICAgICAgICAgIC8vIEFkZCBjdXJyZW50IEJTUyB0byBDYW5kaWRhdGUgbGlzdApAQCAtMjUwMCw3ICsyNTAwLDcgQEAKICAgICAgICAgICAgIHBNZ210LT5lQ3Vyck1vZGUgPSBXTUFDX01PREVfSUJTU19TVEE7CiAgICAgICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfU1RBUlRFRDsKICAgICAgICAgICAgIC8vIEFkb3B0IEJTUyBzdGF0ZSBpbiBBZGFwdGVyIERldmljZSBPYmplY3QKLSAgICAgICAgICAgIHBEZXZpY2UtPmVPUE1vZGUgPSBPUF9NT0RFX0FESE9DOworCSAgICBwRGV2aWNlLT5vcF9tb2RlID0gTkw4MDIxMV9JRlRZUEVfQURIT0M7CiAgICAgICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSB0cnVlOwogICAgICAgICAgICAgQ29udHJvbHZNYXNrQnl0ZShwRGV2aWNlLE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsTUFDX1JFR19QQVBFREVMQVksTEVEU1RTX1NUUyxMRURTVFNfSU5URVIpOwogICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPmFieUJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xvY2FscGFyYS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKaW5kZXggODRlZmZjNC4uOGNhODBkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKQEAgLTU4LDkgKzU4LDEzIEBACiAjZGVmaW5lIExPQ0FMXzExQl9CQVNJQ19SQVRFX0JJVE1BUAkJMHg4MjYKICNkZWZpbmUgTE9DQUxfMTFCX09QRVJBVElPTl9SQVRFX0JJVE1BUAkJMHg4MjYKICNkZWZpbmUgTE9DQUxfMTFHX0JBU0lDX1JBVEVfQklUTUFQCQkweDgyNgkgICAvKiAxLCAyLCA1LjUsIDExICovCi0jZGVmaW5lIExPQ0FMXzExR19PUEVSQVRJT05fUkFURV9CSVRNQVAJCTB4MTMwYzEyNDAgLyogNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCAqLworI2RlZmluZSBMT0NBTF8xMUdfT1BFUkFUSU9OX1JBVEVfQklUTUFQCQkweDEzMGMxMjQwIC8qIDYsIDksIDEyLCAxOCwKKwkJCQkJCQkJICAgICogMjQsIDM2LCA0OCwgNTQKKwkJCQkJCQkJICAgICovCiAjZGVmaW5lIExPQ0FMXzExQV9CQVNJQ19SQVRFX0JJVE1BUAkJMHgwMTAwMTA0MCAvKiA2LCAxMiwgMjQgKi8KLSNkZWZpbmUgTE9DQUxfMTFBX09QRVJBVElPTl9SQVRFX0JJVE1BUAkJMHgxMjBjMDIwMCAvKiA5LCAxOCwgMzYsIDQ4LCA1NCAqLworI2RlZmluZSBMT0NBTF8xMUFfT1BFUkFUSU9OX1JBVEVfQklUTUFQCQkweDEyMGMwMjAwIC8qIDksIDE4LCAzNiwKKwkJCQkJCQkJICAgICogNDgsIDU0CisJCQkJCQkJCSAgICAqLwogCiAKICNkZWZpbmUgUFdSX0FDVElWRQkJCQkwCkBAIC0xNDAsNyArMTQ0LDkgQEAKIAkvKiBVbml0IHRpbWUgY291bnQgZm9yIHRoZSBkZWNpc2lvbiB0byBlbnRlciBQUyBtb2RlICovCiAJdTE2CUNoZWNrQ291bnRGb3JQUzsKIAl1OAlib0hhc1R4QWN0aXZpdHk7LyogdHggYWN0aXZpdHkgaGFzIG9jY3VycmVkICovCi0JdTgJYm9NYWNQc1ZhbGlkOwkvKiBQb3dlciBzYXZlIG1vZGUgb2J0YWluZWQgZnJvbSBIL1cgaXMgdmFsaWQgb3Igbm90ICovCisJdTgJYm9NYWNQc1ZhbGlkOwkvKiBQb3dlciBzYXZlIG1vZGUgb2J0YWluZWQKKwkJCQkgKiBmcm9tIEgvVyBpcyB2YWxpZCBvciBub3QKKwkJCQkgKi8KIAogCS8qIFJhdGUgKi8KIAl1OAlUeFJhdGVNb2RlOyAvKgpAQCAtMTYyLDM1ICsxNjgsNTcgQEAKIAogCXU4CU51bU9mQlJhdGU7CiAJdTgJTnVtT2ZTUmF0ZTsKLQl1OAlOdW1PZkRzc3NSYXRlSW5TUmF0ZTsJLyogbnVtYmVyIG9mIERTU1MgcmF0ZXMgaW4gc3VwcG9ydGVkIHJhdGUgc2V0ICovCisJdTgJTnVtT2ZEc3NzUmF0ZUluU1JhdGU7CS8qIG51bWJlciBvZiBEU1NTIHJhdGVzIGluCisJCQkJCSAqIHN1cHBvcnRlZCByYXRlIHNldAorCQkJCQkgKi8KIAl1OAlyZXNlcnZlZDE7CiAKIAl1MzIJZHdCYXNpY1JhdGVCaXRtYXA7CS8qIGJpdCBtYXAgb2YgYmFzaWMgcmF0ZXMgKi8KIAotCXUzMglkd1N1cHBvcnRSYXRlQml0bWFwOwkvKiBiaXQgbWFwIG9mIGFsbCBzdXBwb3J0IHJhdGVzIGluY2x1ZGluZyBiYXNpYyBhbmQgb3BlcmF0aW9uYWwgcmF0ZXMgKi8KKwl1MzIJZHdTdXBwb3J0UmF0ZUJpdG1hcDsJLyogYml0IG1hcCBvZiBhbGwgc3VwcG9ydCByYXRlcworCQkJCQkgKiBpbmNsdWRpbmcgYmFzaWMgYW5kIG9wZXJhdGlvbmFsCisJCQkJCSAqIHJhdGVzCisJCQkJCSAqLwogCiAKIAkvKiBGb3IgU01FL01MTUUgaGFuZGxlciAqLwogCi0JdTE2CXdPbGRTVEFpbmRleDsJCS8qIHZhbGlkIHdoZW4gYm9IYW5kb3Zlcj1UUlVFLCBzdG9yZSBvbGQgY29ubmVjdGVkIFNUQSBpbmRleCAqLwotCXUxNgl3Q29ubmVjdGVkU1RBaW5kZXg7CS8qIEluZGV4IG9mIHBlZXJseSBjb25uZWN0ZWQgQVAgb3IgSUJTUyBpbiB0aGUgZGVzY3JpcHRpb25zZXQuICovCi0JdTE2CUFzc29jaWF0aW9uX0lEOwkJLyogVGhlIEFzc29jaWF0aW9uIElEIGluIHRoZSAoUmUpQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWUuICovCi0JdTE2CUxpc3RlbkludGVydmFsOwkJLyogVGhlIGxpc3RlbiBpbnRlcnZhbCB3aGVuIFNNRSBpbnZva2luZyBNTE1FXyAoUmUpQXNzb2NpYXRlX1JlcXVlc3QoKS4gKi8KKwl1MTYJd09sZFNUQWluZGV4OwkJLyogdmFsaWQgd2hlbiBib0hhbmRvdmVyPVRSVUUsCisJCQkJCSAqIHN0b3JlIG9sZCBjb25uZWN0ZWQgU1RBIGluZGV4CisJCQkJCSAqLworCXUxNgl3Q29ubmVjdGVkU1RBaW5kZXg7CS8qIEluZGV4IG9mIHBlZXJseSBjb25uZWN0ZWQgQVAgb3IKKwkJCQkJICogSUJTUyBpbiB0aGUgZGVzY3JpcHRpb25zZXQuCisJCQkJCSAqLworCXUxNglBc3NvY2lhdGlvbl9JRDsJCS8qIFRoZSBBc3NvY2lhdGlvbiBJRCBpbiB0aGUKKwkJCQkJICogKFJlKUFzc29jaWF0aW9uIFJlc3BvbnNlIGZyYW1lLgorCQkJCQkgKi8KKwl1MTYJTGlzdGVuSW50ZXJ2YWw7CQkvKiBUaGUgbGlzdGVuIGludGVydmFsIHdoZW4gU01FIGludm9raW5nCisJCQkJCSAqIE1MTUVfIChSZSlBc3NvY2lhdGVfUmVxdWVzdCgpLgorCQkJCQkgKi8KIAogCXN0cnVjdAlyYWRpb19vZmYgUmFkaW9PZmZTdGF0dXM7CiAJdTgJUmVzZXJ2ZWQwWzJdOwotCXU4CWJvTXNSYWRpb09mZjsJCS8qIE5kaXMgZGVtYW5kcyB0byBiZSB0cnVlIHdoZW4gc2V0IERpc2Fzc29jLiBPSUQgYW5kIGJlIGZhbHNlIHdoZW4gc2V0IFNTSUQgT0lELiAqLworCXU4CWJvTXNSYWRpb09mZjsJCS8qIE5kaXMgZGVtYW5kcyB0byBiZSB0cnVlIHdoZW4gc2V0CisJCQkJCSAqIERpc2Fzc29jLiBPSUQgYW5kIGJlIGZhbHNlIHdoZW4KKwkJCQkJICogc2V0IFNTSUQgT0lELgorCQkJCQkgKi8KIAl1OAliQW50ZW5uYU5vOwkJLyogd2hpY2ggYW50ZW5uYSAqLwotCXU4CWJDb25uZWN0RmxhZzsJCS8qIHRoZSBjb25uZWN0IHN0YXR1cyBmbGFnIGZvciByb2FtaW5nIHRhc2sgKi8KKwl1OAliQ29ubmVjdEZsYWc7CQkvKiB0aGUgY29ubmVjdCBzdGF0dXMgZmxhZyBmb3IKKwkJCQkJICogcm9hbWluZyB0YXNrCisJCQkJCSAqLwogCiAJdTgJUm9hbVN0YXR1czsKIAl1OAlyZXNlcnZlZDdbM107CiAKLQlzdHJ1Y3QJY2hhbl9pbmZvIEN1cnJlbnRDaGFuOwkvKiBDdXJyZW50IGNoYW5uZWwgbm8uIGFuZCBjaGFubmVsIGJhbmQuIEl0IG1heSBiZSBjaGFuZ2VkIGJ5IHNjYW5uaW5nLiAqLworCXN0cnVjdAljaGFuX2luZm8gQ3VycmVudENoYW47CS8qIEN1cnJlbnQgY2hhbm5lbCBuby4gYW5kIGNoYW5uZWwgYmFuZC4KKwkJCQkJICogSXQgbWF5IGJlIGNoYW5nZWQgYnkgc2Nhbm5pbmcuCisJCQkJCSAqLwogCXU4CWJvSGFuZG92ZXI7CQkvKiBSb2FtaW5nLCBIYW5kb3ZlciB0byBvdGhlciBBUC4gKi8KIAl1OAlib0NDQWJ1c3k7CiAKLQl1MTYJQ1dNYXg7CQkJLyogSXQgbWF5IG5vdCBiZSB0aGUgcmVhbCB2YWx1ZSB0aGF0IEgvVyB1c2VkICovCisJdTE2CUNXTWF4OwkJCS8qIEl0IG1heSBub3QgYmUgdGhlIHJlYWwgdmFsdWUKKwkJCQkJICogdGhhdCBIL1cgdXNlZAorCQkJCQkgKi8KIAl1OAlDV01pbjsJCQkvKiAyNTU6IHNldCBhY2NvcmRpbmcgdG8gODAyLjExIHNwZWMuICovCiAJdTgJcmVzZXJ2ZWQyOwogCkBAIC0yMDAsNyArMjI4LDkgQEAKIAl1OAliUHJlYW1ibGVNb2RlOwkJLyogQVVUTywgczMyICovCiAJdTgJYm9Ob25FUlBwcmVzZW50OwogCi0JdTgJYm9Qcm90ZWN0TWVjaGFuaXNtOwkvKiBIL1cgd2lsbCB0YWtlIHRoZSBuZWNlc3NhcnkgYWN0aW9uIGJhc2VkIG9uIHRoaXMgdmFyaWFibGUgKi8KKwl1OAlib1Byb3RlY3RNZWNoYW5pc207CS8qIEgvVyB3aWxsIHRha2UgdGhlIG5lY2Vzc2FyeSBhY3Rpb24KKwkJCQkJICogYmFzZWQgb24gdGhpcyB2YXJpYWJsZQorCQkJCQkgKi8KIAl1OAlib1Nob3J0UHJlYW1ibGU7CS8qIFNhbWUgaGVyZSAqLwogCXU4CWJvU2hvcnRTbG90VGltZTsJLyogU2FtZSBoZXJlICovCiAJdTgJcmVzZXJ2ZWRfMzsKQEAgLTIxMyw4ICsyNDMsMTIgQEAKIAl1MzIJSHdCc3NpZFZhbGlkOwogCiAJLyogRm9yIHNjYW4gbGlzdCAqLwotCXU4CUJzc0xpc3RDb3VudDsJCS8qIFRvdGFsIGNvdW50IG9mIHZhbGlkIGRlc2NyaXB0b3IgaW5kZXhlcyAqLwotCXU4CWJvUmVjZWl2ZVVuY29ycmVjdEluZm87CS8qIGltcG9ydGFudCBzZXR0aW5ncyBpbiBiZWFjb24vcHJvYmUgcmVzcC4gaGF2ZSBiZWVuIGNoYW5nZWQgKi8KKwl1OAlCc3NMaXN0Q291bnQ7CQkvKiBUb3RhbCBjb3VudCBvZiB2YWxpZAorCQkJCQkgKiBkZXNjcmlwdG9yIGluZGV4ZXMKKwkJCQkJICovCisJdTgJYm9SZWNlaXZlVW5jb3JyZWN0SW5mbzsJLyogaW1wb3J0YW50IHNldHRpbmdzIGluIGJlYWNvbi9wcm9iZQorCQkJCQkgKiByZXNwLiBoYXZlIGJlZW4gY2hhbmdlZAorCQkJCQkgKi8KIAl1OAlOb09mSm9pbmVySW5JYnNzOwogCXU4CXJlc2VydmVkXzQ7CiAKQEAgLTIyOCw3ICsyNjIsOSBAQAogCSAqLwogCXU4CUpvaW5lckluSWJzc1soTUFYX0JTU19ERVNDUklQVF9FTEVNRU5UICsgMykgJiB+MHgwM107CiAKLQkvKiBHZW5lcmFsIFN0YXRpc3RpY3MsIGNvdW50IGF0IFJ4X2hhbmRsZXIgb3IgVHhfY2FsbGJhY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkvKiBHZW5lcmFsIFN0YXRpc3RpY3MsIGNvdW50IGF0IFJ4X2hhbmRsZXIgb3IKKwkgKiBUeF9jYWxsYmFjayBpbnRlcnJ1cHQgaGFuZGxlcgorCSAqLwogCXU2NAlHU19YTUlUX09LOwkJLyogR29vZCBGcmFtZXMgVHJhbnNtaXR0ZWQgKi8KIAl1NjQJR1NfUkNWX09LOwkJLyogR29vZCBGcmFtZXMgUmVjZWl2ZWQgKi8KIAl1MzIJR1NfUkNWX0VSUk9SOwkJLyogRnJhbWVzIHJlY2VpdmVkIHdpdGggY3JjIGVycm9yICovCkBAIC0yNDgsMTAgKzI4NCwxOCBAQAogCXUzMglfZG90MTFXRVBVbmRlY3J5cHRhYmxlQ291bnQ7CiAJdTMyCV9kb3QxMUZyYW1lRHVwbGljYXRlQ291bnQ7CiAKLQlzdHJ1Y3QJY2hhbl9pbmZvIElic3NDaGFuU2V0dGluZzsJLyogMkIuIFN0YXJ0IElCU1MgQ2hhbm5lbCBzZXR0aW5nIGJ5IHJlZ2lzdHJ5IG9yIFdXVS4gKi8KLQl1OAlyZXNlcnZlZF81WzJdOwkJLyogSXQgbWF5IG5vdCBiZSB1c2VkIGFmdGVyIGNvbnNpZGVyaW5nIFJGIHR5cGUsIHJlZ2lvbiBhbmQgbW9kdWxhdGlvbiB0eXBlLiAqLworCXN0cnVjdAljaGFuX2luZm8gSWJzc0NoYW5TZXR0aW5nOwkvKiAyQi4gU3RhcnQgSUJTUyBDaGFubmVsCisJCQkJCQkgKiBzZXR0aW5nIGJ5IHJlZ2lzdHJ5IG9yCisJCQkJCQkgKiBXV1UuCisJCQkJCQkgKi8KKwl1OAlyZXNlcnZlZF81WzJdOwkJLyogSXQgbWF5IG5vdCBiZSB1c2VkIGFmdGVyCisJCQkJCSAqIGNvbnNpZGVyaW5nIFJGIHR5cGUsIHJlZ2lvbgorCQkJCQkgKiBhbmQgbW9kdWxhdGlvbiB0eXBlLgorCQkJCQkgKi8KIAotCXU4CXJlc2VydmVkXzZbMl07CQkvKiB0d28gdmFyaWFibGVzIGFyZSBmb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24gKi8KKwl1OAlyZXNlcnZlZF82WzJdOwkJLyogdHdvIHZhcmlhYmxlcyBhcmUgZm9yIHdlcAorCQkJCQkgKiBrZXkgZXJyb3IgZGV0ZWN0aW9uCisJCQkJCSAqLwogCXUzMgliV2VwS2V5RXJyb3I7CiAJdTMyCWJUb1NlbGZQYWNrZXRSZWNlaXZlZDsKIAl1MzIJV2VwS2V5RGV0ZWN0VGltZXJDb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwppbmRleCBhNWUyNTViLi5iYmM1ZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCkBAIC03Niw0MSArNzYsMTExIEBACiB7CiAJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXN3aXRjaCAoUmVnaXN0ZXJObykgewotCWNhc2UgMHgzYjA6IHJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgzYmM6IHJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4NDAwOiByZWctPkQwMF9EbWFDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwMDogcmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MDQ6IHJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwODogcmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODI0OiByZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyODogcmVnLT5NMjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MmM6IHJlZy0+TTJDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODM4OiByZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0MDogcmVnLT5NNDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NDQ6IHJlZy0+TTQ0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODQ4OiByZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0YzogcmVnLT5NNENfTWFjU3RhdHVzID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg2MDogcmVnLT5NNjBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Njg6IHJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODcwOiByZWctPk03MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3NDogcmVnLT5NNzRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Nzg6IHJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3QzogcmVnLT5NN0NfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4ODA6IHJlZy0+TTgwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODg0OiByZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4ODogcmVnLT5NODhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4OTg6IHJlZy0+TTk4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAwYzogcmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMmM6IHJlZy0+QkIyQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDMwOiByZWctPkJCMzAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTAzYzogcmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNDg6IHJlZy0+QkI0OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDRjOiByZWctPkJCNEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1MDogcmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTQ6IHJlZy0+QkI1NCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDU4OiByZWctPkJCNTggPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4MTA1YzogcmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNjA6IHJlZy0+QkI2MCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgzYjA6CisJCXJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgzYmM6CisJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4NDAwOgorCQlyZWctPkQwMF9EbWFDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgwMDoKKwkJcmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4MDQ6CisJCXJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgwODoKKwkJcmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODI0OgorCQlyZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDgyODoKKwkJcmVnLT5NMjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4MmM6CisJCXJlZy0+TTJDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODM4OgorCQlyZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg0MDoKKwkJcmVnLT5NNDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4NDQ6CisJCXJlZy0+TTQ0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODQ4OgorCQlyZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg0YzoKKwkJcmVnLT5NNENfTWFjU3RhdHVzID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg2MDoKKwkJcmVnLT5NNjBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4Njg6CisJCXJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODcwOgorCQlyZWctPk03MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg3NDoKKwkJcmVnLT5NNzRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4Nzg6CisJCXJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg3QzoKKwkJcmVnLT5NN0NfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4ODA6CisJCXJlZy0+TTgwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4ODg0OgorCQlyZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDg4ODoKKwkJcmVnLT5NODhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHg4OTg6CisJCXJlZy0+TTk4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTAwYzoKKwkJcmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwMmM6CisJCXJlZy0+QkIyQyA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDMwOgorCQlyZWctPkJCMzAgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTAzYzoKKwkJcmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNDg6CisJCXJlZy0+QkI0OCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDRjOgorCQlyZWctPkJCNEMgPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTA1MDoKKwkJcmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNTQ6CisJCXJlZy0+QkI1NCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOworCWNhc2UgMHgxMDU4OgorCQlyZWctPkJCNTggPSBSZWdpc3RlclZhbHVlOworCQlicmVhazsKKwljYXNlIDB4MTA1YzoKKwkJcmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsKKwkJYnJlYWs7CisJY2FzZSAweDEwNjA6CisJCXJlZy0+QkI2MCA9IFJlZ2lzdGVyVmFsdWU7CisJCWJyZWFrOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYwppbmRleCA4ZDcxYmMyLi5mMDA2YjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYwpAQCAtMTYsNyArMTYsOCBAQAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJ3YjM1cnhfZi5oIgogCi1zdGF0aWMgdm9pZCBwYWNrZXRfY2FtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgY2hhciAqcFJ4QnVmZmVyQWRkcmVzcywgaW50IFBhY2tldFNpemUpCitzdGF0aWMgdm9pZCBwYWNrZXRfY2FtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgY2hhciAqcFJ4QnVmZmVyQWRkcmVzcywKKwlpbnQgUGFja2V0U2l6ZSkKIHsKIAlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNjQsNyArNjUsOCBAQAogCX0gZWxzZSBpZiAoRGVjcnlwdGlvbk1ldGhvZCkgeyAvKiBGb3IgVEtJUCBhbmQgQ0NNUCAqLwogCQlmb3IgKGkgPSA3OyBpID4gMTsgaS0tKQogCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaSAtIDJdOwotCQlwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzcyArIDI7IC8qIFVwZGF0ZSB0aGUgZGVzY3JpcHRvciwgc2hpZnQgOCBieXRlICovCisJCS8qIFVwZGF0ZSB0aGUgZGVzY3JpcHRvciwgc2hpZnQgOCBieXRlICovCisJCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMjsKIAkJQnVmZmVyU2l6ZSAtPSA4OyAvKiA4IGJ5dGUgZm9yIElWICsgSUNWICovCiAJfQogCXBSeERlcy0+YnVmZmVyX3NpemVbMF0gPSBCdWZmZXJTaXplOwpAQCAtOTUsNyArOTcsOSBAQAogCiAJCS8qIFBhcnNlIHRoZSBidWxraW4gYnVmZmVyICovCiAJCXdoaWxlIChCdWZmZXJTaXplID49IDQpIHsKLQkJCWlmICgoY3B1X3RvX2xlMzIoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKSAmIDB4MGZmZmZmZmYpID09IFJYX0VORF9UQUcpIC8qIElzIGVuZGluZz8gKi8KKwkJCS8qIElzIGVuZGluZz8gKi8KKwkJCWlmICgoY3B1X3RvX2xlMzIoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKSAmIDB4MGZmZmZmZmYpID09CisJCQkJUlhfRU5EX1RBRykKIAkJCQlicmVhazsKIAogCQkJLyogR2V0IHRoZSBSMDAgUjAxIGZpcnN0ICovCkBAIC0xMDgsNyArMTEyLDggQEAKIAogCQkJLyogQmFzaWMgY2hlY2sgZm9yIFJ4IGxlbmd0aC4gSXMgbGVuZ3RoIHZhbGlkPyAqLwogCQkJaWYgKFBhY2tldFNpemUgPiBNQVhfUEFDS0VUX1NJWkUpIHsKLQkJCQlwcl9kZWJ1ZygiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpOworCQkJCXByX2RlYnVnKCJTZXJpb3VzIEVSUk9SIDogUnggZGF0YSBzaXplIHRvbyBsb25nLCBzaXplID0lZFxuIiwKKwkJCQkJUGFja2V0U2l6ZSk7CiAJCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwogCQkJCXBXYjM1UngtPkVwM0Vycm9yQ291bnQyKys7CiAJCQkJYnJlYWs7CkBAIC0xMTgsNyArMTIzLDggQEAKIAkJCSAqIFdiMzVSeF9pbmRpY2F0ZSgpIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IHNvIGl0IGlzbid0CiAJCQkgKiBuZWNlc3NhcnkgdG8gc2V0ICJSeERlcy5EZXNjdHJpcHRvcl9JRCA9IFJ4QnVmZmVySUQ7IgogCQkJICovCi0JCQlCdWZmZXJTaXplIC09IDg7IC8qIHN1YnRyYWN0IDggYnl0ZSBmb3IgMzUncyBVU0IgaGVhZGVyIGxlbmd0aCAqLworCQkJLyogc3VidHJhY3QgOCBieXRlIGZvciAzNSdzIFVTQiBoZWFkZXIgbGVuZ3RoICovCisJCQlCdWZmZXJTaXplIC09IDg7CiAJCQlwUnhCdWZmZXJBZGRyZXNzICs9IDg7CiAKIAkJCVJ4RGVzLmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzczsKQEAgLTI1NSw3ICsyNjEsNyBAQAogCiAJcFdiMzVSeC0+cERSeCA9IGt6YWxsb2MoTUFYX1VTQl9SWF9CVUZGRVIsIEdGUF9BVE9NSUMpOwogCWlmICghcFdiMzVSeC0+cERSeCkgewotCQlwcmludGsoInczNXVuZDogUnggbWVtb3J5IGFsbG9jIGZhaWxlZFxuIik7CisJCWRldl9pbmZvKCZody0+d2lwaHktPmRldiwgInczNXVuZDogUnggbWVtb3J5IGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwpAQCAtMjcwLDcgKzI3Niw3IEBACiAJcmV0diA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0diAhPSAwKSB7Ci0JCXByaW50aygiUnggVVJCIHNlbmRpbmcgZXJyb3JcbiIpOworCQlkZXZfaW5mbygmaHctPndpcGh5LT5kZXYsICJSeCBVUkIgc2VuZGluZyBlcnJvclxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXJldHVybjsKQEAgLTMwNiw3ICszMTIsOSBAQAogCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKIAlwV2IzNVJ4LT5yeF9oYWx0ID0gMDsKIAotCS8qIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQgaWYgdGhlIFJ4IHJlc291cmNlIGlzIHVuYXZhaWxhYmxlLiAqLworCS8qIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQKKwkgKiBpZiB0aGUgUnggcmVzb3VyY2UgaXMgdW5hdmFpbGFibGUuCisJICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsgaSsrKQogCQlwV2IzNVJ4LT5SeE93bmVyW2ldID0gMTsKIH0KQEAgLTMyOCw3ICszMzYsOCBAQAogCiAJLyogQ2FuY2VsaW5nIHRoZSBJcnAgaWYgYWxyZWFkeSBzZW5kcyBpdCBvdXQuICovCiAJaWYgKHBXYjM1UngtPkVQM3ZtX3N0YXRlID09IFZNX1JVTk5JTkcpIHsKLQkJdXNiX3VubGlua191cmIocFdiMzVSeC0+UnhVcmIpOyAvKiBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1UnhfZGVzdHJveSB0byBmcmVlIHRoZW0gKi8KKwkJLyogT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVJ4X2Rlc3Ryb3kgdG8gZnJlZSB0aGVtICovCisJCXVzYl91bmxpbmtfdXJiKHBXYjM1UngtPlJ4VXJiKTsKIAkJcHJfZGVidWcoIkVQMyBSeCBzdG9wXG4iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCmluZGV4IDEzZDM2MGYuLjQ4Nzc0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCkBAIC0xMDYsNyArMTA2LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0ICovCi1jaGFyIHNpZ25hdHVyZVsxNF0gPSAiRlVQVTdEMzdkaGZ3Y2kiOworc3RhdGljIGNoYXIgc2lnbmF0dXJlWzE0XSA9ICJGVVBVN0QzN2RoZndjaSI7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCkBAIC0xMjMsOCArMTIzLDggQEAKICNkZWZpbmUgRExfU0laRSAyMDAwCiAKIC8qIENGR19JREVOVElUWV9TVFJDVCAgIAlwcmlfaWRlbnRpdHkJPSB7IExPRihDRkdfSURFTlRJVFlfU1RSQ1QpLCBDRkdfUFJJX0lERU5USVRZIH07ICovCi1DRkdfU1VQX1JBTkdFX1NUUkNUIAltZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19NRklfU1VQX1JBTkdFIH07Ci1DRkdfU1VQX1JBTkdFX1NUUkNUIAljZmlfc3VwICAgICAgICAJPSB7IExPRihDRkdfU1VQX1JBTkdFX1NUUkNUKSwgQ0ZHX05JQ19DRklfU1VQX1JBTkdFIH07CitzdGF0aWMgQ0ZHX1NVUF9SQU5HRV9TVFJDVCAJbWZpX3N1cCAgICAgICAgCT0geyBMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCksIENGR19OSUNfTUZJX1NVUF9SQU5HRSB9Oworc3RhdGljIENGR19TVVBfUkFOR0VfU1RSQ1QgCWNmaV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX0NGSV9TVVBfUkFOR0UgfTsKIC8qIE5vdGU6IGNvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhlIGFib3ZlIGV4cGxhaW5lZCBhbmQgZGVmaW5lZCBETF9TSVpFIGlmIG5lZWQgYXJpc2VzCiAgKiBDRkdfRExfQlVGX1NUUkNUICAgIAlkbF9idWYgICAgICAgICAJPSB7IExPRihDRkdfRExfQlVGX1NUUkNUKSwgQ0ZHX0RMX0JVRiB9OwogKi8KQEAgLTEzOSw3ICsxMzksNyBAQAogICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGlmIHRoZSBESEYgdXNlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgZHJpdmVyL3V0aWxpdHkuCiAgKi8KIAotTFRWX0lORk9fU1RSVUNUIGx0dl9pbmZvW10gPSB7CitzdGF0aWMgTFRWX0lORk9fU1RSVUNUIGx0dl9pbmZvW10gPSB7CiAJeyAoTFRWUCkmbWZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCiAJeyAoTFRWUCkmY2ZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCiAJeyAoTFRWUCkgTlVMTCwgCQkJCTAgfQpAQCAtMTY5LDcgKzE2OSw3IEBACiAqICAgc3RhdGlvbiBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGlzIGNvbXBhdGlibGUuCiAqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAorc3RhdGljIGludAogY2hlY2tfY29tcF9mdyhtZW1pbWFnZSAqZncpCiB7CiBDRkdfUkFOR0UyMF9TVFJDVCAgCQkqcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKaW5kZXggNGFhYzI2ZC4uZjQ0ZDg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQogCiAjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECi1DRkdfSURFTlRJVFlfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9pZGVudGl0eSA9IHsKK3N0YXRpYyBDRkdfSURFTlRJVFlfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9pZGVudGl0eSA9IHsKIAlzaXplb2YoY2ZnX2Rydl9pZGVudGl0eSkvc2l6ZW9mKGhjZl8xNikgLSAxLCAgICAvL2xlbmd0aCBvZiBSSUQKIAlDRkdfRFJWX0lERU5USVRZLCAgICAgICAgICAgLy8gKDB4MDgyNikKIAlNU0ZfQ09NUE9ORU5UX0lELApAQCAtMjU5LDcgKzI1OSw3IEBACiAJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIKIH0gOwogCi1DRkdfUkFOR0VTX1NUUkNUIEJBU0VEIGNmZ19kcnZfc3VwX3JhbmdlID0geworc3RhdGljIENGR19SQU5HRVNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9zdXBfcmFuZ2UgPSB7CiAJc2l6ZW9mKGNmZ19kcnZfc3VwX3JhbmdlKS9zaXplb2YoaGNmXzE2KSAtIDEsICAgLy9sZW5ndGggb2YgUklECiAJQ0ZHX0RSVl9TVVBfUkFOR0UsICAgICAgICAgIC8vICgweDA4MjcpCiAKQEAgLTI3MSw3ICsyNzEsNyBAQAogCX19CiB9IDsKIAotc3RydWN0IENGR19SQU5HRTNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSA9IHsKK3N0YXRpYyBzdHJ1Y3QgQ0ZHX1JBTkdFM19TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpID0gewogCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKIAlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJLCAgICAgLy8gKDB4MDgyOCkKIApAQCAtMjg4LDcgKzI4OCw3IEBACiB9IDsKIAogCi1zdHJ1Y3QgQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhID0geworc3RhdGljIHN0cnVjdCBDRkdfUkFOR0U0X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19zdGEgPSB7CiAJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19zdGEpL3NpemVvZihoY2ZfMTYpIC0gMSwgIC8vbGVuZ3RoIG9mIFJJRAogCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsICAgICAvLyAoMHgwODI5KQogCkBAIC0zMzMsNyArMzMzLDcgQEAKIH0gOwogCiAKLXN0cnVjdCBDRkdfUkFOR0U2X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19oc2kgPSB7CitzdGF0aWMgc3RydWN0IENGR19SQU5HRTZfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSA9IHsKIAlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSkvc2l6ZW9mKGhjZl8xNikgLSAxLCAgLy9sZW5ndGggb2YgUklECiAJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSSwgICAgIC8vICgweDA4MkEpCiAJQ09NUF9ST0xFX0FDVCwKQEAgLTM3MCw3ICszNzAsNyBAQAogfSA7CiAKIAotQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmID0geworc3RhdGljIENGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiA9IHsKIAlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZikvc2l6ZW9mKGhjZl8xNikgLSAxLCAgLy9sZW5ndGggb2YgUklECiAJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRiwgICAgIC8vICgweDA4MkIpCiAKQEAgLTMwOTksNyArMzA5OSw3IEBACiAjZGVmaW5lIEwgICAqcAogI2RlZmluZSBSICAgKihwKzEpCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCiB7CiAjaWYgSENGX0JJR19FTkRJQU4KQEAgLTM0MTUsNyArMzQxNSw3IEBACiAgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50CitzdGF0aWMgaW50CiBjaGVja19taWMoIElGQlAgaWZicCApCiB7CiAJaW50ICAgICByYyA9IEhDRl9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYwppbmRleCAyNWFjNzZmLi4wYmE4ZGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYwpAQCAtNDQzNSw3ICs0NDM1LDcgQEAKIAkJMDAwMCwKIAkweDAwMEYzNjhFLAkvKiBTdGFydCBleGVjdXRpb24gYWRkcmVzcyAqLwogCX0sCi0JeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9CisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgTlVMTH0KIH07CiAKIHN0YXRpYyBjb25zdCBDRkdfUkFOR0UyMF9TVFJDVCBmd19pbWFnZV9pbmZvY29tcGF0W10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMKaW5kZXggNjUwZGVmOC4uZmM5OGI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYwpAQCAtNzYsMzggKzc2LDIzIEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLS8vICNpbmNsdWRlIDxhc20vaW8uaD4KLS8vIC8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiAjZGVmaW5lIEJJTl9ETCAwCiAjaWYgQklOX0RMCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2VuZGlmIC8vIEJJTl9ETAorI2VuZGlmIC8qIEJJTl9ETCAqLwogCiAKICNpbmNsdWRlIDxkZWJ1Zy5oPgogCiAjaW5jbHVkZSA8aGNmLmg+CiAjaW5jbHVkZSA8ZGhmLmg+Ci0vL2luIG9yZGVyIHRvIGdldCBhcm91bmQ6OiB3bF9tYWluLmM6MjIyOTogYEhSRUdfRVZfUkRNQUQnIHVuZGVjbGFyZWQgKGZpcnN0IHVzZSBpbiB0aGlzIGZ1bmN0aW9uKQorLyogaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZDo6IHdsX21haW4uYzoyMjI5OiBgSFJFR19FVl9SRE1BRCcgdW5kZWNsYXJlZCAoZmlyc3QgdXNlIGluIHRoaXMgZnVuY3Rpb24pICovCiAjaW5jbHVkZSA8aGNmZGVmLmg+CiAKICNpbmNsdWRlIDx3bF9pZi5oPgpAQCAtMTMzLDggKzExOCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBWQUxJRF9QQVJBTShDKSBcCiAJeyBcCi0JCWlmICghKEMpKSBcCi0JCXsgXAorCQlpZiAoIShDKSkgeyBcCiAJCQlwcmludGsoS0VSTl9JTkZPICJXaXJlbGVzcywgcGFyYW1ldGVyIGVycm9yOiBcIiVzXCJcbiIsICNDKTsgXAogCQkJZ290byBmYWlsZWQ7IFwKIAkJfSBcCkBAIC0xNDIsNyArMTI2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglsb2NhbCBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX2lzcl9oYW5kbGVyKCB1bnNpZ25lZCBsb25nIHAgKTsKK3ZvaWQgd2xfaXNyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBwKTsKIAogI2lmIDAgLy9TQ1VMTF9VU0VfUFJPQyAvKiBkb24ndCB3YXN0ZSBzcGFjZSBpZiB1bnVzZWQgKi8KIHN0YXRpYyBpbnQgc2N1bGxfcmVhZF9wcm9jbWVtKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CkBAIC0xNjgsNyArMTUyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtb2R1bGUgcGFyYW1ldGVyIGRlZmluaXRpb25zIC0gc2V0IHdpdGggJ2luc21vZCcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgcF91MTYgICAgaXJxX21hc2sgICAgICAgICAgICAgICAgPSAweGRlYjg7IC8vIElSUTMsNCw1LDcsOSwxMCwxMSwxMiwxNCwxNQorc3RhdGljIHBfdTE2ICAgIGlycV9tYXNrICAgICAgICAgICAgICAgID0gMHhkZWI4OyAvKiBJUlEzLDQsNSw3LDksMTAsMTEsMTIsMTQsMTUgKi8KIHN0YXRpYyBwX3M4ICAgICBpcnFfbGlzdFs0XSAgICAgICAgICAgICA9IHsgLTEgfTsKIAogI2lmIDAKQEAgLTE4Myw3ICsxNjcsNyBAQAogc3RhdGljIHBfdTE2ICAgIFBBUk1fQlJTQ18yR0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9CUlNDXzJHSFo7CiBzdGF0aWMgcF91MTYgICAgUEFSTV9CUlNDXzVHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0JSU0NfNUdIWjsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX0NPRVhJU1RFTkNFICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQ09FWElTVEVOQ0U7Ci1zdGF0aWMgcF91MTYgICAgUEFSTV9DT05ORUNUSU9OX0NPTlRST0wgICAgCT0gUEFSTV9ERUZBVUxUX0NPTk5FQ1RJT05fQ09OVFJPTDsgIC8vOz9yZW5hbWUgYW5kIG1vdmUKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCAgIAk9IFBBUk1fREVGQVVMVF9DT05ORUNUSU9OX0NPTlRST0w7ICAvKiA7P3JlbmFtZSBhbmQgbW92ZSAqLwogc3RhdGljIHBfY2hhciAgKlBBUk1fQ1JFQVRFX0lCU1MgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9DUkVBVEVfSUJTU19TVFI7CiBzdGF0aWMgcF9jaGFyICAqUEFSTV9ERVNJUkVEX1NTSUQgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NTSUQ7CiBzdGF0aWMgcF9jaGFyICAqUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSAgICAgID0gIiI7CkBAIC0yMjAsNyArMjA0LDcgQEAKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ0ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ1ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ2ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKLSNlbmRpZiAvLyBVU0VfV0RTCisjZW5kaWYgLyogVVNFX1dEUyAqLwogc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRCAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOwogc3RhdGljIHBfdTE2ICAgIFBBUk1fU1JTQ18yR0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TUlNDXzJHSFo7CiBzdGF0aWMgcF91MTYgICAgUEFSTV9TUlNDXzVHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NSU0NfNUdIWjsKQEAgLTIzNCw3ICsyMTgsNyBAQAogc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTQgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CiBzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFNSAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKIHN0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEU2ICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOwotI2VuZGlmIC8vIFVTRV9XRFMKKyNlbmRpZiAvKiBVU0VfV0RTICovCiBzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFICAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKICNpZmRlZiBVU0VfV0RTCiBzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzFbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKQEAgLTI0Myw3ICsyMjcsNyBAQAogc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1M0W0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CiBzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzVbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKIHN0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTNltFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOwotI2VuZGlmIC8vIFVTRV9XRFMKKyNlbmRpZiAvKiBVU0VfV0RTICovCiAKIAogI2lmIDAKQEAgLTI5OSwzOSArMjgzLDQxIEBACiBNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQlJTQ18yR0haLCAgICAgICAgICAgICAgICAiQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCAyLjQgR0h6Iik7CiBNT0RVTEVfUEFSTShQQVJNX0JSU0NfNUdIWiwgICAgICAgICAgICAgImIiKTsKIE1PRFVMRV9QQVJNX0RFU0MoUEFSTV9CUlNDXzVHSFosICAgICAgICAgICAgICAgICJCYXNpYyBSYXRlIFNldCBDb250cm9sIDUuMCBHSHoiKTsKLSNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQotLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CisjaWYgMSAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBICovCisvKiA7P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50ICovCiBNT0RVTEVfUEFSTShQQVJNX1BNX0VOQUJMRUQsICAgICAgICAgICAgImgiKTsKIE1PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9FTkFCTEVELCAgICAgICAgICAgICAgICJQb3dlciBNYW5hZ2VtZW50IFN0YXRlICgwIC0gMiwgODAwMSAtIDgwMDIpIFswXSIpOwogTU9EVUxFX1BBUk0oUEFSTV9QT1JUX1RZUEUsICAgICAgICAgICAgICJiIik7CiBNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUE9SVF9UWVBFLCAgICAgICAgICAgICAgICAiUG9ydCBUeXBlICgxIC0gMykgWzFdIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICJzIik7Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0NSRUFURV9JQlNTLCAgICAgICAgICAgICAgIkNyZWF0ZSBJQlNTICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIpOwotLy87P01PRFVMRV9QQVJNKFBBUk1fTVVMVElDQVNUX1JYLCAgICAgICAgICAicyIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUlgsICAgICAgICAgICAgICJNdWx0aWNhc3QgUmVjZWl2ZSBFbmFibGUgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICJoIik7Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX01BWF9TTEVFUCwgICAgICAgICAgICAgICAgIk1heGltdW0gUG93ZXIgTWFuYWdlbWVudCBTbGVlcCBEdXJhdGlvbiAoMCAtIDY1NTM1KSBbMTAwXSIpOwotLy87P01PRFVMRV9QQVJNKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAiNmIiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAgICAiSGFyZHdhcmUgRXRoZXJuZXQgQWRkcmVzcyAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFs8ZmFjdG9yeSB2YWx1ZT5dIik7Ci0vLzs/TU9EVUxFX1BBUk0oUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICJiIik7Ci0vLwotLy90cmFja2VyIDEyNDQ4Ci0vLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0FVVEhFTlRJQ0FUSU9OLCAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIFR5cGUgKDAtMikgWzBdIDA9T3BlbiAxPVNoYXJlZEtleSAyPUxFQVAiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKGF1dGhlbnRpY2F0aW9uLCAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgxLTIpIFsxXSAxPU9wZW4gMj1TaGFyZWRLZXkiKTsKLS8vdHJhY2tlciAxMjQ0OAotLy8KLS8vOz9NT0RVTEVfUEFSTShQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgImIiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0FUSU1fV0lORE9XLCAgICAgICAgICAiQVRJTSBXaW5kb3cgdGltZSBpbiBUVSBmb3IgSUJTUyBjcmVhdGlvbiAoMC0xMDApIFswXSIpOwotLy87P01PRFVMRV9QQVJNKFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04sICAiYiIpOwotLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgICAgICJUaW1lIHN0YXRpb24gcmVtYWlucyBhd2FrZSBhZnRlciBNQUMgZnJhbWUgdHJhbnNmZXIgd2hlbiBQTSBpcyBvbiAoMC02NTUzNSkgWzEwMF0iKTsKLS8vOz9NT0RVTEVfUEFSTShQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgInMiKTsKLS8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSwgICAgICAgICAiUHJvbWlzY3VvdXMgTW9kZSBFbmFibGUgKDxzdHJpbmc+IFkgb3IgTiApIFtOXSIgKTsKLS8vOz8KKy8qCisgKiA7P01PRFVMRV9QQVJNKFBBUk1fQ1JFQVRFX0lCU1MsICAgICAgICAgICAicyIpOworICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICAgICJDcmVhdGUgSUJTUyAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKKyAqOz9NT0RVTEVfUEFSTShQQVJNX01VTFRJQ0FTVF9SWCwgICAgICAgICAgInMiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTVVMVElDQVNUX1JYLCAgICAgICAgICAgICAiTXVsdGljYXN0IFJlY2VpdmUgRW5hYmxlICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOworICo7P01PRFVMRV9QQVJNKFBBUk1fTUFYX1NMRUVQLCAgICAgICAgICAgICAiaCIpOworICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICAgICJNYXhpbXVtIFBvd2VyIE1hbmFnZW1lbnQgU2xlZXAgRHVyYXRpb24gKDAgLSA2NTUzNSkgWzEwMF0iKTsKKyAqOz9NT0RVTEVfUEFSTShQQVJNX05FVFdPUktfQUREUiwgICAgICAgICAgIjZiIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX05FVFdPUktfQUREUiwgICAgICAgICAgICAgIkhhcmR3YXJlIEV0aGVybmV0IEFkZHJlc3MgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbPGZhY3RvcnkgdmFsdWU+XSIpOworICo7P01PRFVMRV9QQVJNKFBBUk1fQVVUSEVOVElDQVRJT04sICAgICAgICAiYiIpOworICoKKyAqdHJhY2tlciAxMjQ0OAorICo7P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgwLTIpIFswXSAwPU9wZW4gMT1TaGFyZWRLZXkgMj1MRUFQIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhhdXRoZW50aWNhdGlvbiwgICAgICAgICAiQXV0aGVudGljYXRpb24gVHlwZSAoMS0yKSBbMV0gMT1PcGVuIDI9U2hhcmVkS2V5Iik7CisgKnRyYWNrZXIgMTI0NDgKKyAqCisgKjs/TU9EVUxFX1BBUk0oUEFSTV9PV05fQVRJTV9XSU5ET1csICAgICAgICJiIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgICAgIkFUSU0gV2luZG93IHRpbWUgaW4gVFUgZm9yIElCU1MgY3JlYXRpb24gKDAtMTAwKSBbMF0iKTsKKyAqOz9NT0RVTEVfUEFSTShQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OLCAgImIiKTsKKyAqOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04sICAgICAiVGltZSBzdGF0aW9uIHJlbWFpbnMgYXdha2UgYWZ0ZXIgTUFDIGZyYW1lIHRyYW5zZmVyIHdoZW4gUE0gaXMgb24gKDAtNjU1MzUpIFsxMDBdIik7CisgKjs/TU9EVUxFX1BBUk0oUEFSTV9QUk9NSVNDVU9VU19NT0RFLCAgICAgICJzIik7CisgKjs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgICAgIlByb21pc2N1b3VzIE1vZGUgRW5hYmxlICg8c3RyaW5nPiBZIG9yIE4gKSBbTl0iICk7CisgKjs/CisgKi8KIE1PRFVMRV9QQVJNKFBBUk1fQ09OTkVDVElPTl9DT05UUk9MLCAgICAiYiIpOwogTU9EVUxFX1BBUk1fREVTQyhQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCwgICAgICAgIkNvbm5lY3Rpb24gQ29udHJvbCAoMCAtIDMpIFsyXSIpOwogI2VuZGlmIC8qIEhDRl9TVEEgKi8KLSNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCi0JCQkJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorI2lmIDEgLyogOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisJCQkJCS8qIDs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQgKi8KIE1PRFVMRV9QQVJNKFBBUk1fT1dOX0RUSU1fUEVSSU9ELCAgICAgICAiYiIpOwogTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9EVElNX1BFUklPRCwgICAgICAgICAgIkRUSU0gUGVyaW9kICgwIC0gMjU1KSBbMV0iKTsKIE1PRFVMRV9QQVJNKFBBUk1fUkVKRUNUX0FOWSwgICAgICAgICAgICAicyIpOwpAQCAtMzk0LDExICszODAsMTIgQEAKICNpZiBEQkcKIAogc3RhdGljIHBfdTMyICAgIHBjX2RlYnVnID0gREJHX0xWTDsKLS8vTU9EVUxFX1BBUk0ocGNfZGVidWcsICJpIik7Ci0vKnN0YXRpYyA7P2NvbmZsaWN0cyB3aXRoIG15IHVuZGVyc3RhbmRpbmcgb2YgQ0wgcGFyYW1ldGVycyBhbmQgYnJlYWtzIG5vdyBJIG1vdmVkCisvKgorICogTU9EVUxFX1BBUk0ocGNfZGVidWcsICJpIik7CisgKnN0YXRpYyA7P2NvbmZsaWN0cyB3aXRoIG15IHVuZGVyc3RhbmRpbmcgb2YgQ0wgcGFyYW1ldGVycyBhbmQgYnJlYWtzIG5vdyBJIG1vdmVkCiAgKiB0aGUgY29ycmVzcG9uZGlnIGxvZ2ljIHRvIHdsX3Byb2ZpbGUKLSAqLyBwX3UzMiAgICBEZWJ1Z0ZsYWcgPSB+MDsgLy9yZWNvZ25pemFibGUgInVuZGVmaW5lZCB2YWx1ZSIgcmF0aGVyIHRoZW4gREJHX0RFRkFVTFRTOwotLy9NT0RVTEVfUEFSTShEZWJ1Z0ZsYWcsICJsIik7CisgKi8gcF91MzIgICAgRGVidWdGbGFnID0gfjA7IC8qIHJlY29nbml6YWJsZSAidW5kZWZpbmVkIHZhbHVlIiByYXRoZXIgdGhlbiBEQkdfREVGQVVMVFM7ICovCisvKiBNT0RVTEVfUEFSTShEZWJ1Z0ZsYWcsICJsIik7ICovCiAKIHN0YXRpYyBzdHJ1Y3QgZGJnX2luZm8gd2xfaW5mbyA9IHsgS0JVSUxEX01PRE5BTUUsIDAsIDAgfTsKIHN0cnVjdCBkYmdfaW5mbyAqRGJnSW5mbyA9ICZ3bF9pbmZvOwpAQCAtNDA3LDggKzM5NCw4IEBACiAjaWZkZWYgVVNFX1JUUwogCiBzdGF0aWMgcF9jaGFyICAqdXNlUlRTID0gIk4iOwotTU9EVUxFX1BBUk0oIHVzZVJUUywgInMiICk7Ci1NT0RVTEVfUEFSTV9ERVNDKCB1c2VSVFMsICJVc2UgUlRTIHRlc3QgaW50ZXJmYWNlICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIgKTsKK01PRFVMRV9QQVJNKHVzZVJUUywgInMiKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlUlRTLCAiVXNlIFJUUyB0ZXN0IGludGVyZmFjZSAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKIAogI2VuZGlmICAvKiBVU0VfUlRTICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDI3LDcgKzQxNCw3IEBACiAjZW5kaWYgLyogSENGX1NUQSAqLwogCiAKLWludCB3bF9pbnNlcnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX2luc2VydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwpAQCAtNDM2LDEwICs0MjMsMTAgQEAKIAlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIGhhcmR3YXJlLiAqLwotCW1lbXNldCggJiggbHAtPmhjZkN0eCApLCAwLCBzaXplb2YoIElGQl9TVFJDVCApKTsKKwltZW1zZXQoJihscC0+aGNmQ3R4KSwgMCwgc2l6ZW9mKElGQl9TVFJDVCkpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzLiAqLwotCXNwaW5fbG9ja19pbml0KCAmKCBscC0+c2xvY2sgKSk7CisJc3Bpbl9sb2NrX2luaXQoJihscC0+c2xvY2spKTsKIAogCS8qIEluaXRpYWxpemUgc3RhdGVzICovCiAJLy9scC0+bG9ja2NvdW50ID0gMDsgLy9QRTFETk4KQEAgLTQ0OCwzMSArNDM1LDMxIEBACiAKIAlscC0+ZGV2ID0gZGV2OwogCi0JREJHX1BBUkFNKCBEYmdJbmZvLCAiaXJxX21hc2siLCAiMHglMDR4IiwgaXJxX21hc2sgJiAweDBGRkZGICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCAiaXJxX2xpc3QiLCAiMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4IiwKKwlEQkdfUEFSQU0oRGJnSW5mbywgImlycV9tYXNrIiwgIjB4JTA0eCIsIGlycV9tYXNrICYgMHgwRkZGRik7CisJREJHX1BBUkFNKERiZ0luZm8sICJpcnFfbGlzdCIsICIweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMngiLAogCQkJICAgaXJxX2xpc3RbMF0gJiAweDBGRiwgaXJxX2xpc3RbMV0gJiAweDBGRiwKLQkJCSAgIGlycV9saXN0WzJdICYgMHgwRkYsIGlycV9saXN0WzNdICYgMHgwRkYgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9ERVNJUkVEX1NTSUQsICJcIiVzXCIiLCBQQVJNX0RFU0lSRURfU1NJRCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9TU0lELCAiXCIlc1wiIiwgUEFSTV9PV05fU1NJRCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9DSEFOTkVMLCAiJWQiLCBQQVJNX09XTl9DSEFOTkVMKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUsICIlZCIsIFBBUk1fU1lTVEVNX1NDQUxFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURSwgIiVkIiwgUEFSTV9UWF9SQVRFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MsICJcIiVzXCIiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX05BTUUsICJcIiVzXCIiLCBQQVJNX09XTl9OQU1FICk7CisJCQkgICBpcnFfbGlzdFsyXSAmIDB4MEZGLCBpcnFfbGlzdFszXSAmIDB4MEZGKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0RFU0lSRURfU1NJRCwgIlwiJXNcIiIsIFBBUk1fREVTSVJFRF9TU0lEKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX09XTl9TU0lELCAiXCIlc1wiIiwgUEFSTV9PV05fU1NJRCk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCwgIiVkIiwgUEFSTV9PV05fQ0hBTk5FTCk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUsICIlZCIsIFBBUk1fU1lTVEVNX1NDQUxFKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUsICIlZCIsIFBBUk1fVFhfUkFURSk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xELCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MsICJcIiVzXCIiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX09XTl9OQU1FLCAiXCIlc1wiIiwgUEFSTV9PV05fTkFNRSk7CiAvLzs/CQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiwgIlwiJXNcIiIsIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkxLCAiXCIlc1wiIiwgUEFSTV9LRVkxICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfS0VZMiwgIlwiJXNcIiIsIFBBUk1fS0VZMiApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTMsICJcIiVzXCIiLCBQQVJNX0tFWTMgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVk0LCAiXCIlc1wiIiwgUEFSTV9LRVk0ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfS0VZLCAiJWQiLCBQQVJNX1RYX0tFWSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFLCAiJWQiLCBQQVJNX01VTFRJQ0FTVF9SQVRFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUsICJcIiVzXCIiLCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSwgIiVkIiwgUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFICk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9LRVkxLCAiXCIlc1wiIiwgUEFSTV9LRVkxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0tFWTIsICJcIiVzXCIiLCBQQVJNX0tFWTIpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfS0VZMywgIlwiJXNcIiIsIFBBUk1fS0VZMyk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9LRVk0LCAiXCIlc1wiIiwgUEFSTV9LRVk0KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX0tFWSwgIiVkIiwgUEFSTV9UWF9LRVkpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUsICIlZCIsIFBBUk1fTVVMVElDQVNUX1JBVEUpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUsICJcIiVzXCIiLCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUsICIlZCIsIFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSk7CiAvLzs/I2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKIAkJCQkJLy87P3Nob3VsZCB3ZSBtYWtlIHRoaXMgY29kZSBjb25kaXRpb25hbCBkZXBlbmRpbmcgb24gaW4gU1RBIG1vZGUKIC8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1BPUlRfVFlQRSwgIiVkIiwgUEFSTV9QT1JUX1RZUEUgKTsKLQkJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE1fRU5BQkxFRCwgIiUwNHgiLCBQQVJNX1BNX0VOQUJMRUQgKTsKKwkJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9QTV9FTkFCTEVELCAiJTA0eCIsIFBBUk1fUE1fRU5BQkxFRCk7CiAvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9DUkVBVEVfSUJTUywgIlwiJXNcIiIsIFBBUk1fQ1JFQVRFX0lCU1MgKTsKIC8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCwgIlwiJXNcIiIsIFBBUk1fTVVMVElDQVNUX1JYICk7CiAvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NQVhfU0xFRVAsICIlZCIsIFBBUk1fTUFYX1NMRUVQICk7CkBAIC00ODgsMjQgKzQ3NSwyNCBAQAogI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKIAkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CiAJCS8vOz9JIGd1ZXNzOiBubywgc2luY2UgdGhpcyBpcyBEZWJ1ZyBtb2RlIG9ubHkKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QsICIlZCIsIFBBUk1fT1dOX0RUSU1fUEVSSU9EICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUkVKRUNUX0FOWSwgIlwiJXNcIiIsIFBBUk1fUkVKRUNUX0FOWSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsICJcIiVzXCIiLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCAiXCIlc1wiIiwgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCAiXCIlc1wiIiwgUEFSTV9JTlRSQV9CU1NfUkVMQVkgKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCwgIiVkIiwgUEFSTV9PV05fRFRJTV9QRVJJT0QpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfUkVKRUNUX0FOWSwgIlwiJXNcIiIsIFBBUk1fUkVKRUNUX0FOWSk7CisJREJHX1BBUkFNKERiZ0luZm8sIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVELCAiXCIlc1wiIiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsICJcIiVzXCIiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcpOworCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCAiXCIlc1wiIiwgUEFSTV9JTlRSQV9CU1NfUkVMQVkpOwogI2lmZGVmIFVTRV9XRFMKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEMSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQyICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDMgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xENCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ1ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDYgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFMSwgIiVkIiwgUEFSTV9UWF9SQVRFMSApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUyLCAiJWQiLCBQQVJNX1RYX1JBVEUyICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTMsICIlZCIsIFBBUk1fVFhfUkFURTMgKTsKLQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFNCwgIiVkIiwgUEFSTV9UWF9SQVRFNCApOwotCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU1LCAiJWQiLCBQQVJNX1RYX1JBVEU1ICk7Ci0JREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTYsICIlZCIsIFBBUk1fVFhfUkFURTYgKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQyKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQzKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ0KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ1KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUxLCAiJWQiLCBQQVJNX1RYX1JBVEUxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUyLCAiJWQiLCBQQVJNX1RYX1JBVEUyKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUzLCAiJWQiLCBQQVJNX1RYX1JBVEUzKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU0LCAiJWQiLCBQQVJNX1RYX1JBVEU0KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU1LCAiJWQiLCBQQVJNX1RYX1JBVEU1KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU2LCAiJWQiLCBQQVJNX1RYX1JBVEU2KTsKIAlEQkdfUEFSQU0oRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTMSwgIlwiJXBNXCIiLAogCQkJUEFSTV9XRFNfQUREUkVTUzEpOwogCURCR19QQVJBTShEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyLCAiXCIlcE1cIiIsCkBAIC01MjEsMjggKzUwOCwyOCBAQAogI2VuZGlmIC8qIFVTRV9XRFMgKi8KICNlbmRpZiAvKiBIQ0ZfQVAgKi8KIAotCVZBTElEX1BBUkFNKCAhUEFSTV9ERVNJUkVEX1NTSUQgfHwgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7Ci0JVkFMSURfUEFSQU0oICFQQVJNX09XTl9TU0lEIHx8ICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX09XTl9DSEFOTkVMIDw9IFBBUk1fTUFYX09XTl9DSEFOTkVMICkpOwotCVZBTElEX1BBUkFNKCggUEFSTV9TWVNURU1fU0NBTEUgPj0gUEFSTV9NSU5fU1lTVEVNX1NDQUxFICkgJiYgKCBQQVJNX1NZU1RFTV9TQ0FMRSA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUgKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEUgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggUEFSTV9UWF9SQVRFIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7Ci0JVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKLQlWQUxJRF9QQVJBTSggIVBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0gKSAhPSBOVUxMICk7Ci0JVkFMSURfUEFSQU0oICFQQVJNX09XTl9OQU1FIHx8ICggc3RybGVuKCBQQVJNX05BTUVfT1dOX05BTUUgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKLQlWQUxJRF9QQVJBTSgoIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gKSk7Ci0JVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZMSApKTsKLQlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVkyICkpOwotCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTMgKSk7Ci0JVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZNCApKTsKLQlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfS0VZID49IFBBUk1fTUlOX1RYX0tFWSApICYmICggUEFSTV9UWF9LRVkgPD0gUEFSTV9NQVhfVFhfS0VZICkpOworCVZBTElEX1BBUkFNKCFQQVJNX0RFU0lSRURfU1NJRCB8fCAoc3RybGVuKFBBUk1fREVTSVJFRF9TU0lEKSA8PSBQQVJNX01BWF9OQU1FX0xFTikpOworCVZBTElEX1BBUkFNKCFQQVJNX09XTl9TU0lEIHx8IChzdHJsZW4oUEFSTV9PV05fU1NJRCkgPD0gUEFSTV9NQVhfTkFNRV9MRU4pKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9PV05fQ0hBTk5FTCA8PSBQQVJNX01BWF9PV05fQ0hBTk5FTCkpOworCVZBTElEX1BBUkFNKChQQVJNX1NZU1RFTV9TQ0FMRSA+PSBQQVJNX01JTl9TWVNURU1fU0NBTEUpICYmIChQQVJNX1NZU1RFTV9TQ0FMRSA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUpKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9UWF9SQVRFID49IFBBUk1fTUlOX1RYX1JBVEUpICYmIChQQVJNX1RYX1JBVEUgPD0gUEFSTV9NQVhfVFhfUkFURSkpOworCVZBTElEX1BBUkFNKChQQVJNX1JUU19USFJFU0hPTEQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCkpOworCVZBTElEX1BBUkFNKCFQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTIHx8IHN0cmNocigiTm5ZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0pICE9IE5VTEwpOworCVZBTElEX1BBUkFNKCFQQVJNX09XTl9OQU1FIHx8IChzdHJsZW4oUEFSTV9OQU1FX09XTl9OQU1FKSA8PSBQQVJNX01BWF9OQU1FX0xFTikpOworCVZBTElEX1BBUkFNKChQQVJNX0VOQUJMRV9FTkNSWVBUSU9OIDw9IFBBUk1fTUFYX0VOQUJMRV9FTkNSWVBUSU9OKSk7CisJVkFMSURfUEFSQU0oaXNfdmFsaWRfa2V5X3N0cmluZyhQQVJNX0tFWTEpKTsKKwlWQUxJRF9QQVJBTShpc192YWxpZF9rZXlfc3RyaW5nKFBBUk1fS0VZMikpOworCVZBTElEX1BBUkFNKGlzX3ZhbGlkX2tleV9zdHJpbmcoUEFSTV9LRVkzKSk7CisJVkFMSURfUEFSQU0oaXNfdmFsaWRfa2V5X3N0cmluZyhQQVJNX0tFWTQpKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9UWF9LRVkgPj0gUEFSTV9NSU5fVFhfS0VZKSAmJiAoUEFSTV9UWF9LRVkgPD0gUEFSTV9NQVhfVFhfS0VZKSk7CiAKLQlWQUxJRF9QQVJBTSgoIFBBUk1fTVVMVElDQVNUX1JBVEUgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUgKSAmJgotCQkJCQkoIFBBUk1fTVVMVElDQVNUX1JBVEUgPD0gUEFSTV9NQVhfTVVMVElDQVNUX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKFBBUk1fTVVMVElDQVNUX1JBVEUgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUpICYmCisJCQkJCShQQVJNX01VTFRJQ0FTVF9SQVRFIDw9IFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFKSk7CiAKLQlWQUxJRF9QQVJBTSggIVBBUk1fRE9XTkxPQURfRklSTVdBUkUgfHwgKCBzdHJsZW4oIFBBUk1fRE9XTkxPQURfRklSTVdBUkUgKSA8PSAyNTUgLyo7PyovICkpOwotCVZBTElEX1BBUkFNKCggUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFIDwgUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSApKTsKKwlWQUxJRF9QQVJBTSghUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSB8fCAoc3RybGVuKFBBUk1fRE9XTkxPQURfRklSTVdBUkUpIDw9IDI1NSAvKjs/Ki8pKTsKKwlWQUxJRF9QQVJBTSgoUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFIDwgUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSkpOwogCi0JVkFMSURfUEFSQU0oICFQQVJNX0xPQURfQkFMQU5DSU5HIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0xPQURfQkFMQU5DSU5HWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCFQQVJNX0xPQURfQkFMQU5DSU5HIHx8IHN0cmNocigiTm5ZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0pICE9IE5VTEwpOwogCVZBTElEX1BBUkFNKCAhUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICk7CiAJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1BPV19MRVZFTCA8PSBQQVJNX01BWF9UWF9QT1dfTEVWRUwgKSk7CiAKQEAgLTYwMSwzMyArNTg4LDI1IEBACiAJbHAtPk11bHRpY2FzdFJhdGVbMF0gICAgPSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfMkdIWjsKIAlscC0+TXVsdGljYXN0UmF0ZVsxXSAgICA9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV81R0haOwogCi0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTWzBdICkgIT0gTlVMTCApCiAJCWxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgPSAwOwotCX0KLQlpZiAoIFBBUk1fREVTSVJFRF9TU0lEICYmICggc3RybGVuKCBQQVJNX0RFU0lSRURfU1NJRCApIDw9IEhDRl9NQVhfTkFNRV9MRU4gKSkgeworCWlmICggUEFSTV9ERVNJUkVEX1NTSUQgJiYgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKQogCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9ERVNJUkVEX1NTSUQgKTsKLQl9Ci0JaWYgKCBQQVJNX09XTl9TU0lEICYmICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CisJaWYgKCBQQVJNX09XTl9TU0lEICYmICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKQogCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9PV05fU1NJRCApOwotCX0KLQlpZiAoIFBBUk1fT1dOX05BTUUgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX05BTUUgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpIHsKKwlpZiAoIFBBUk1fT1dOX05BTUUgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX05BTUUgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpCiAJCXN0cmNweSggbHAtPlN0YXRpb25OYW1lLCBQQVJNX09XTl9OQU1FICk7Ci0JfQogCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gUEFSTV9FTkFCTEVfRU5DUllQVElPTjsKLQlpZiAoIFBBUk1fS0VZMSAmJiAoIHN0cmxlbiggUEFSTV9LRVkxICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCWlmICggUEFSTV9LRVkxICYmICggc3RybGVuKCBQQVJNX0tFWTEgKSA8PSBNQVhfS0VZX0xFTiApKQogCQlzdHJjcHkoIGxwLT5LZXkxLCBQQVJNX0tFWTEgKTsKLQl9Ci0JaWYgKCBQQVJNX0tFWTIgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMiApIDw9IE1BWF9LRVlfTEVOICkpIHsKKwlpZiAoIFBBUk1fS0VZMiAmJiAoIHN0cmxlbiggUEFSTV9LRVkyICkgPD0gTUFYX0tFWV9MRU4gKSkKIAkJc3RyY3B5KCBscC0+S2V5MiwgUEFSTV9LRVkyICk7Ci0JfQotCWlmICggUEFSTV9LRVkzICYmICggc3RybGVuKCBQQVJNX0tFWTMgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJaWYgKCBQQVJNX0tFWTMgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMyApIDw9IE1BWF9LRVlfTEVOICkpCiAJCXN0cmNweSggbHAtPktleTMsIFBBUk1fS0VZMyApOwotCX0KLQlpZiAoIFBBUk1fS0VZNCAmJiAoIHN0cmxlbiggUEFSTV9LRVk0ICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCWlmICggUEFSTV9LRVk0ICYmICggc3RybGVuKCBQQVJNX0tFWTQgKSA8PSBNQVhfS0VZX0xFTiApKQogCQlzdHJjcHkoIGxwLT5LZXk0LCBQQVJNX0tFWTQgKTsKLQl9CiAKIAlscC0+VHJhbnNtaXRLZXlJRCA9IFBBUk1fVFhfS0VZOwogCkBAIC02MzksMTcgKzYxOCwxNSBAQAogCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gMSA7IC8vOz90byBiZSB1cGdyYWRlZCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFOwogCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFOwogCi0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0xPQURfQkFMQU5DSU5HWzBdICkgIT0gTlVMTCApCiAJCWxwLT5sb2FkQmFsYW5jaW5nID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPmxvYWRCYWxhbmNpbmcgPSAwOwotCX0KIAotCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICkKIAkJbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiA9IDE7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxwLT5tZWRpdW1EaXN0cmlidXRpb24gPSAwOwotCX0KIAogCWxwLT50eFBvd0xldmVsID0gUEFSTV9UWF9QT1dfTEVWRUw7CiAKQEAgLTY2NSwyNCArNjQyLDIwIEBACiAJbHAtPmF0aW1XaW5kb3cgICAgICAgICAgPSBQQVJNX09XTl9BVElNX1dJTkRPVzsKIAlscC0+aG9sZG92ZXJEdXJhdGlvbiAgICA9IFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT047CiAJbHAtPlBNRW5hYmxlZCAgICAgICAgICAgPSBQQVJNX1BNX0VOQUJMRUQ7ICAvLzs/Ci0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fQ1JFQVRFX0lCU1NbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0NSRUFURV9JQlNTWzBdICkgIT0gTlVMTCApCiAJCWxwLT5DcmVhdGVJQlNTID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPkNyZWF0ZUlCU1MgPSAwOwotCX0KLQlpZiAoIHN0cmNociggIk5uIiwgUEFSTV9NVUxUSUNBU1RfUlhbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiTm4iLCBQQVJNX01VTFRJQ0FTVF9SWFswXSApICE9IE5VTEwgKQogCQlscC0+TXVsdGljYXN0UmVjZWl2ZSA9IDA7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gMTsKLQl9Ci0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERVswXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERVswXSApICE9IE5VTEwgKQogCQlscC0+cHJvbWlzY3VvdXNNb2RlID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPnByb21pc2N1b3VzTW9kZSA9IDA7Ci0JfQotCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgewotCSAgIGxwLT5NQUNBZGRyZXNzW2ldID0gUEFSTV9ORVRXT1JLX0FERFJbaV07Ci0JfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkKKwkJbHAtPk1BQ0FkZHJlc3NbaV0gPSBQQVJNX05FVFdPUktfQUREUltpXTsKIAogCWxwLT5jb25uZWN0aW9uQ29udHJvbCA9IFBBUk1fQ09OTkVDVElPTl9DT05UUk9MOwogCkBAIC02OTEsMjYgKzY2NCwyMiBAQAogCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAogCWxwLT5EVElNUGVyaW9kID0gUEFSTV9PV05fRFRJTV9QRVJJT0Q7CiAKLQlpZiAoIHN0cmNociggIll5IiwgUEFSTV9SRUpFQ1RfQU5ZWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9SRUpFQ1RfQU5ZWzBdICkgIT0gTlVMTCApCiAJCWxwLT5SZWplY3RBbnkgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+UmVqZWN0QW55ID0gMDsKLQl9Ci0JaWYgKCBzdHJjaHIoICJObiIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRFswXSApICE9IE5VTEwgKSB7CisJaWYgKCBzdHJjaHIoICJObiIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRFswXSApICE9IE5VTEwgKQogCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gMDsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IDE7Ci0JfQotCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdbMF0gKSAhPSBOVUxMICkgeworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdbMF0gKSAhPSBOVUxMICkKIAkJbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nID0gMTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nID0gMDsKLQl9Ci0JaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fSU5UUkFfQlNTX1JFTEFZWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9JTlRSQV9CU1NfUkVMQVlbMF0gKSAhPSBOVUxMICkKIAkJbHAtPmludHJhQlNTUmVsYXkgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+aW50cmFCU1NSZWxheSA9IDA7Ci0JfQogCiAJbHAtPm93bkJlYWNvbkludGVydmFsID0gUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMOwogCWxwLT5jb2V4aXN0ZW5jZSAgICAgICA9IFBBUk1fQ09FWElTVEVOQ0U7CkBAIC03NTAsMTEgKzcxOSwxMCBAQAogI2VuZGlmICAvKiBVU0VfV0RTICovCiAjZW5kaWYgIC8qIEhDRl9BUCAqLwogI2lmZGVmIFVTRV9SVFMKLQlpZiAoIHN0cmNociggIll5IiwgdXNlUlRTWzBdICkgIT0gTlVMTCApIHsKKwlpZiAoIHN0cmNociggIll5IiwgdXNlUlRTWzBdICkgIT0gTlVMTCApCiAJCWxwLT51c2VSVFMgPSAxOwotCX0gZWxzZSB7CisJZWxzZQogCQlscC0+dXNlUlRTID0gMDsKLQl9CiAjZW5kaWYgIC8qIFVTRV9SVFMgKi8KIAogCkBAIC0xNTYwLDcgKzE1MjgsOCBAQAogCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwogCiAJLyogT3duIE5hbWUgKFN0YXRpb24gTmlja25hbWUpICovCi0JaWYgKCggbGVuID0gKCBzdHJsZW4oIGxwLT5TdGF0aW9uTmFtZSApICsgMSApICYgfjB4MDEgKSAhPSAwICkgeworCWxlbiA9IChzdHJsZW4obHAtPlN0YXRpb25OYW1lKSArIDEpICYgfjB4MDE7CisJaWYgKGxlbiAhPSAwKSB7CiAJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fTkFNRSAgICAgICAgICAgICAgICAgIDogJXNcbiIsCiAJCS8vICAgICAgICAgICBscC0+U3RhdGlvbk5hbWUgKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwppbmRleCA5NjViMWMwLi43N2U0YmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwpAQCAtNjgsMzEgKzY4LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvaW4uaD4KLS8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotLy8gI2luY2x1ZGUgPGFzbS9pby5oPgotLy8gLy8gI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KLQogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiAjaW5jbHVkZSA8ZGVidWcuaD4KIAogI2luY2x1ZGUgPGhjZi5oPgogI2luY2x1ZGUgPGRoZi5oPgotLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgogCiAjaW5jbHVkZSA8d2xfaWYuaD4KICNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgpAQCAtMTA0LDE2ICs4NywxNSBAQAogCiAjaWZkZWYgVVNFX1BST0ZJTEUKICNpbmNsdWRlIDx3bF9wcm9maWxlLmg+Ci0jZW5kaWYgIC8qIFVTRV9QUk9GSUxFICovCisjZW5kaWYgLyogVVNFX1BST0ZJTEUgKi8KIAogI2lmZGVmIEJVU19QQ01DSUEKICNpbmNsdWRlIDx3bF9jcy5oPgotI2VuZGlmICAvKiBCVVNfUENNQ0lBICovCisjZW5kaWYgLyogQlVTX1BDTUNJQSAqLwogCiAjaWZkZWYgQlVTX1BDSQogI2luY2x1ZGUgPHdsX3BjaS5oPgotI2VuZGlmICAvKiBCVVNfUENJICovCi0KKyNlbmRpZiAvKiBCVVNfUENJICovCiAKICNpZiBIQ0ZfRU5DQVAKICNkZWZpbmUgTVRVX01BWCAoSENGX01BWF9NU0cgLSBFVEhfSExFTiAtIDgpCkBAIC0xMjEsMTcgKzEwMywxNSBAQAogI2RlZmluZSBNVFVfTUFYIChIQ0ZfTUFYX01TRyAtIEVUSF9ITEVOKQogI2VuZGlmCiAKLS8vc3RhdGljIGludCBtdHUgPSBNVFVfTUFYOwotLy9NT0RVTEVfUEFSTShtdHUsICJpIik7Ci0vL01PRFVMRV9QQVJNX0RFU0MobXR1LCAiTVRVIik7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtYWNyb3MKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEJMT0NLX0lOUFVUKGJ1ZiwgbGVuKSBcCi0gICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKLSAgICBkZXNjLT5CVUZfU0laRSA9IGxlbjsgXAotICAgIHN0YXR1cyA9IGhjZl9yY3ZfbXNnKCYobHAtPmhjZkN0eCksIGRlc2MsIDApCisJZG8geyBcCisJCWRlc2MtPmJ1Zl9hZGRyID0gYnVmOyBcCisJCWRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCisJCXN0YXR1cyA9IGhjZl9yY3ZfbXNnKCYobHAtPmhjZkN0eCksIGRlc2MsIDApOyBcCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBCTE9DS19JTlBVVF9ETUEoYnVmLCBsZW4pIG1lbWNweSggYnVmLCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBwa3RsZW4gKQogCkBAIC0xNTgsMjAgKzEzOCwxMiBAQAogICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX2luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLS8vICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7Ci0vLyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJcmV0dXJuIDA7Cit9CQkJCS8qIHdsX2luaXQgKi8KIAotICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwotCi0gICAgLyogTm90aGluZyB0byBkbywgYnV0IGdyYWIgdGhlIHNwaW5sb2NrIGFueXdheSBqdXN0IGluIGNhc2Ugd2UgZXZlciBuZWVkCi0gICAgICAgdGhpcyByb3V0aW5lICovCi0vLyAgd2xfbG9jayggbHAsICZmbGFncyApOwotLy8gIHdsX3VubG9jayggbHAsICZmbGFncyApOwotCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX2luaXQKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOTMsMTcgKzE2NSwyMCBAQAogICogICAgICBlcnJubyBvdGhlcndpc2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX2NvbmZpZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXAgKQoraW50IHdsX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKIHsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKLSAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJtYXAiLCAiMHglcCIsIG1hcCApOworCURCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgIm1hcCIsICIweCVwIiwgbWFwKTsKIAotICAgIC8qIFRoZSBvbmx5IHRoaW5nIHdlIGNhcmUgYWJvdXQgaGVyZSBpcyBhIHBvcnQgY2hhbmdlLiBTaW5jZSB0aGlzIG5vdCBuZWVkZWQsCi0gICAgICAgaWdub3JlIHRoZSByZXF1ZXN0LiAqLwotICAgIERCR19UUkFDRShEYmdJbmZvLCAiJXM6ICVzIGNhbGxlZC5cbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOworCS8qCisJICogVGhlIG9ubHkgdGhpbmcgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGEgcG9ydCBjaGFuZ2UuCisJICogU2luY2UgdGhpcyBub3QgbmVlZGVkLCBpZ25vcmUgdGhlIHJlcXVlc3QuIAorCSAqLworCURCR19UUkFDRShEYmdJbmZvLCAiJXM6ICVzIGNhbGxlZC5cbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX2NvbmZpZworCXJldHVybiAwOworfQkJCQkvKiB3bF9jb25maWcgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIyNCw0OCArMTk5LDQ3IEBACiAgKiAgICAgIHN0YXRpc3RpY3MuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqd2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICNpZmRlZiBVU0VfV0RTCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotI2VuZGlmICAvKiBVU0VfV0RTICovCi0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGZsYWdzOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICAqcFN0YXRzOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisJaW50IGNvdW50OworI2VuZGlmIC8qIFVTRV9XRFMgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHM7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogCi0gICAgLy9EQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKwkvKkRCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOyAqLwogCi0gICAgcFN0YXRzID0gTlVMTDsKKwlwU3RhdHMgPSBOVUxMOwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgIC8qIFJldHVybiB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGRldmljZSAqLworCS8qIFJldHVybiB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGRldmljZSAqLwogI2lmZGVmIFVTRV9XRFMKIAotICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7Ci0JaWYoIGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldiApIHsKLQkgICAgcFN0YXRzID0gJiggbHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyApOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJaWYgKGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldikKKwkJCXBTdGF0cyA9ICYobHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyk7CiAJfQotICAgIH0KIAotI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLwotICAgIGlmKCBwU3RhdHMgPT0gTlVMTCApIHsKLSAgICAgICAgcFN0YXRzID0gJiggbHAtPnN0YXRzICk7Ci0gICAgfQorCS8qIElmIHBTdGF0cyBpcyBzdGlsbCBOVUxMLCB0aGVuIHRoZSBkZXZpY2UgaXMgbm90IGEgV0RTIHBvcnQgKi8KKwlpZiAocFN0YXRzID09IE5VTEwpCisJCXBTdGF0cyA9ICYobHAtPnN0YXRzKTsKIAotICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKIAotICAgIHJldHVybiBwU3RhdHM7Ci19IC8vIHdsX3N0YXRzCisJcmV0dXJuIHBTdGF0czsKK30JCQkJLyogd2xfc3RhdHMgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4OCw3NSArMjYyLDc3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IHdsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhDRl9TVUNDRVNTOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7CisJaW50IHN0YXR1cyA9IEhDRl9TVUNDRVNTOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2Ugb3BlbiwgaW4gUlRTIG1vZGVcbiIgKTsKLQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIG9wZW4sIGluIFJUUyBtb2RlXG4iKTsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisjZW5kaWYgLyogVVNFX1JUUyAqLwogCiAjaWZkZWYgVVNFX1BST0ZJTEUKLSAgICBwYXJzZV9jb25maWcoIGRldiApOworCXBhcnNlX2NvbmZpZyhkZXYpOwogI2VuZGlmCiAKLSAgICBpZiggbHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEICkgewotCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFBvcnQgMFxuIiApOwotCXN0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKKwlpZiAobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAiRW5hYmxpbmcgUG9ydCAwXG4iKTsKKwkJc3RhdHVzID0gd2xfZW5hYmxlKGxwKTsKIAotICAgICAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewotICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIHN0YXR1cyApOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAoc3RhdHVzICE9IEhDRl9TVUNDRVNTKSB7CisJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIkVuYWJsZSBwb3J0IDAgZmFpbGVkOiAweCV4XG4iLAorCQkJCSAgc3RhdHVzKTsKKwkJfQorCX0KIAotICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCi0gICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwkvKiBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcyAqLworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgaWYgKCBzdHJsZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSApICkgewotCURCR19UUkFDRSggRGJnSW5mbywgIjs/Pz8/IEtsdWRneSB3YXkgdG8gZm9yY2UgYSBkb3dubG9hZFxuIiApOwotCXN0YXR1cyA9IHdsX2dvKCBscCApOwotICAgIH0gZWxzZSB7Ci0Jc3RhdHVzID0gd2xfYXBwbHkoIGxwICk7Ci0gICAgfQorCWlmIChzdHJsZW4obHAtPmZ3X2ltYWdlX2ZpbGVuYW1lKSkgeworCQlEQkdfVFJBQ0UoRGJnSW5mbywgIjs/Pz8/IEtsdWRneSB3YXkgdG8gZm9yY2UgYSBkb3dubG9hZFxuIik7CisJCXN0YXR1cyA9IHdsX2dvKGxwKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSB3bF9hcHBseShscCk7CisJfQogCi0gICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKLSAgICB3bF91bmxvY2sobHAsICZmbGFncyk7Ci0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewotCS8vIFVuc3VjY2Vzc2Z1bCwgdHJ5IHJlc2V0IG9mIHRoZSBjYXJkIHRvIHJlY292ZXIKLQlzdGF0dXMgPSB3bF9yZXNldCggZGV2ICk7Ci0gICAgfQorCS8qIFVuc3VjY2Vzc2Z1bCwgdHJ5IHJlc2V0IG9mIHRoZSBjYXJkIHRvIHJlY292ZXIgKi8KKwlpZiAoc3RhdHVzICE9IEhDRl9TVUNDRVNTKQorCQlzdGF0dXMgPSB3bF9yZXNldChkZXYpOwogCi0gICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKLSAgICB3bF91bmxvY2sobHAsICZmbGFncyk7Ci0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewotCW5ldGlmX2NhcnJpZXJfb24oIGRldiApOwotCVdMX1dEU19ORVRJRl9DQVJSSUVSX09OKCBscCApOworCWlmIChzdGF0dXMgPT0gSENGX1NVQ0NFU1MpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQlXTF9XRFNfTkVUSUZfQ0FSUklFUl9PTihscCk7CiAKLQlscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfSEFORExJTkdfSU5UOyAvLyBTdGFydCBoYW5kbGluZyBpbnRlcnJ1cHRzCi0gICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CisJCS8qIFN0YXJ0IGhhbmRsaW5nIGludGVycnVwdHMgKi8KKwkJbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX0hBTkRMSU5HX0lOVDsKKwkJd2xfYWN0X2ludF9vbihscCk7CiAKLQluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7Ci0JV0xfV0RTX05FVElGX1NUQVJUX1FVRVVFKCBscCApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdsX2hjZl9lcnJvciggZGV2LCBzdGF0dXMgKTsJCS8qIFJlcG9ydCB0aGUgZXJyb3IgKi8KLSAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaCggZGV2ICk7CQkvKiBTdG9wIHRoZSBkZXZpY2UgYW5kIHF1ZXVlICovCi0gICAgfQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUobHApOworCX0gZWxzZSB7CisJCXdsX2hjZl9lcnJvcihkZXYsIHN0YXR1cyk7CS8qIFJlcG9ydCB0aGUgZXJyb3IgKi8KKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwkvKiBTdG9wIHRoZSBkZXZpY2UgYW5kIHF1ZXVlICovCisJfQogCi0gICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgcmV0dXJuIHN0YXR1czsKLX0gLy8gd2xfb3BlbgorCXJldHVybiBzdGF0dXM7Cit9CQkJCS8qIHdsX29wZW4gKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM3Nyw3MyArMzUzLDcwIEBACiAgKiAgICAgIGVycm5vIG90aGVyd2lzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKIAotICAgIC8qIE1hcmsgdGhlIGFkYXB0ZXIgYXMgYnVzeSAqLwotICAgIG5ldGlmX3N0b3BfcXVldWUoIGRldiApOwotICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOworCS8qIE1hcmsgdGhlIGFkYXB0ZXIgYXMgYnVzeSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRShscCk7CiAKLSAgICBuZXRpZl9jYXJyaWVyX29mZiggZGV2ICk7Ci0gICAgV0xfV0RTX05FVElGX0NBUlJJRVJfT0ZGKCBscCApOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJV0xfV0RTX05FVElGX0NBUlJJRVJfT0ZGKGxwKTsKIAotICAgIC8qIFNodXRkb3duIHRoZSBhZGFwdGVyOgotICAgICAgICAgICAgRGlzYWJsZSBhZGFwdGVyIGludGVycnVwdHMKLSAgICAgICAgICAgIFN0b3AgVHgvUngKLSAgICAgICAgICAgIFVwZGF0ZSBzdGF0aXN0aWNzCi0gICAgICAgICAgICBTZXQgbG93IHBvd2VyIG1vZGUKLSAgICAqLworCS8qCisJICogU2h1dGRvd24gdGhlIGFkYXB0ZXI6CisJICogRGlzYWJsZSBhZGFwdGVyIGludGVycnVwdHMKKwkgKiBTdG9wIFR4L1J4CisJICogVXBkYXRlIHN0YXRpc3RpY3MKKwkgKiBTZXQgbG93IHBvd2VyIG1vZGUKKwkgKi8KIAotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgd2xfYWN0X2ludF9vZmYoIGxwICk7Ci0gICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7IC8vIFN0b3AgaGFuZGxpbmcgaW50ZXJydXB0cworCXdsX2FjdF9pbnRfb2ZmKGxwKTsKKwkvKiBTdG9wIGhhbmRsaW5nIGludGVycnVwdHMgKi8KKwlscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIGRldmljZSBjbG9zZSwgaW4gUlRTIG1vZGVcbiIgKTsKLQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIGNsb3NlLCBpbiBSVFMgbW9kZVxuIik7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorI2VuZGlmIC8qIFVTRV9SVFMgKi8KIAotICAgIC8qIERpc2FibGUgdGhlIHBvcnRzICovCi0gICAgd2xfZGlzYWJsZSggbHAgKTsKKwkvKiBEaXNhYmxlIHRoZSBwb3J0cyAqLworCXdsX2Rpc2FibGUobHApOwogCi0gICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgcmV0dXJuIDA7Ci19IC8vIHdsX2Nsb3NlCisJcmV0dXJuIDA7Cit9CQkJCS8qIHdsX2Nsb3NlICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0gICAgc3RybGNweShpbmZvLT5kcml2ZXIsIERSSVZFUl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7Ci0gICAgc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTl9TVFIsIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7Ci0vLwlzdHJsY3B5KGluZm8uZndfdmVyc2lvbiwgcHJpdi0+ZndfbmFtZSwKLS8vCXNpemVvZihpbmZvLmZ3X3ZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OX1NUUiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIAotICAgIGlmIChkZXYtPmRldi5wYXJlbnQpIHsKLSAgICAJZGV2X3NldF9uYW1lKGRldi0+ZGV2LnBhcmVudCwgIiVzIiwgaW5mby0+YnVzX2luZm8pOwotCS8vc3RybGNweShpbmZvLT5idXNfaW5mbywgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsCi0JLy8Jc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Ci0gICAgfSBlbHNlIHsKLQlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSwKLQkJIlBDTUNJQSBGSVhNRSIpOwotLy8JCSAgICAiUENNQ0lBIDB4JWx4IiwgcHJpdi0+aHcuaW9iYXNlKTsKLSAgICB9Ci19IC8vIHdsX2dldF9kcnZpbmZvCisJaWYgKGRldi0+ZGV2LnBhcmVudCkgeworCQlkZXZfc2V0X25hbWUoZGV2LT5kZXYucGFyZW50LCAiJXMiLCBpbmZvLT5idXNfaW5mbyk7CisJfSBlbHNlIHsKKwkJc25wcmludGYoaW5mby0+YnVzX2luZm8sIHNpemVvZihpbmZvLT5idXNfaW5mbyksCisJCQkgIlBDTUNJQSBGSVhNRSIpOworCX0KK30JCQkJLyogd2xfZ2V0X2RydmluZm8gKi8KIAogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB3bF9ldGh0b29sX29wcyA9IHsKLSAgICAuZ2V0X2RydmluZm8gPSB3bF9nZXRfZHJ2aW5mbywKLSAgICAuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgl3bF9pb2N0bCgpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDY0LDgxICs0MzcsODYgQEAKICAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9pb2N0bCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCApCitpbnQgd2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CiAKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7Ci0gICAgREJHX1BBUkFNKERiZ0luZm8sICJycSIsICIweCVwIiwgcnEpOwotICAgIERCR19QQVJBTShEYmdJbmZvLCAiY21kIiwgIjB4JTA0eCIsIGNtZCk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAicnEiLCAiMHglcCIsIHJxKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImNtZCIsICIweCUwNHgiLCBjbWQpOwogCi0gICAgd2xfbG9jayggbHAsICZmbGFncyApOworCXdsX2xvY2sobHAsICZmbGFncyk7CiAKLSAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKwl3bF9hY3RfaW50X29mZihscCk7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLQkvKiBIYW5kbGUgYW55IFJUUyBJT0NUTCBoZXJlICovCi0JaWYoIGNtZCA9PSBXTF9JT0NUTF9SVFMgKSB7Ci0JICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXTF9JT0NUTF9SVFNcbiIgKTsKLQkgICAgcmV0ID0gd3ZsYW5fcnRzKCAoc3RydWN0IHJ0c3JlcSAqKXJxLCBkZXYtPmJhc2VfYWRkciApOwotCX0gZWxzZSB7Ci0JICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMIG5vdCBzdXBwb3J0ZWQgaW4gUlRTIG1vZGU6IDB4JVhcbiIsIGNtZCApOwotCSAgICByZXQgPSAtRU9QTk9UU1VQUDsKKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCS8qIEhhbmRsZSBhbnkgUlRTIElPQ1RMIGhlcmUgKi8KKwkJaWYgKGNtZCA9PSBXTF9JT0NUTF9SVFMpIHsKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdMX0lPQ1RMX1JUU1xuIik7CisJCQlyZXQgPSB3dmxhbl9ydHMoKHN0cnVjdCBydHNyZXEgKilycSwgZGV2LT5iYXNlX2FkZHIpOworCQl9IGVsc2UgeworCQkJREJHX1RSQUNFKERiZ0luZm8sCisJCQkJICAiSU9DVEwgbm90IHN1cHBvcnRlZCBpbiBSVFMgbW9kZTogMHglWFxuIiwKKwkJCQkgIGNtZCk7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJfQorCisJCWdvdG8gb3V0X2FjdF9pbnRfb25fdW5sb2NrOwogCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLQlnb3RvIG91dF9hY3RfaW50X29uX3VubG9jazsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KLQotICAgIC8qIE9ubHkgaGFuZGxlIFVJTCBJT0NUTCByZXF1ZXN0cyB3aGVuIHRoZSBVSUwgaGFzIHRoZSBzeXN0ZW0gYmxvY2tlZC4gKi8KLSAgICBpZiggISgoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApICYmICggY21kICE9IFdWTEFOMl9JT0NUTF9VSUwgKSkpIHsKKwkvKiBPbmx5IGhhbmRsZSBVSUwgSU9DVEwgcmVxdWVzdHMgd2hlbiB0aGUgVUlMIGhhcyB0aGUgc3lzdGVtIGJsb2NrZWQuICovCisJaWYgKCEoKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkgJiYgKGNtZCAhPSBXVkxBTjJfSU9DVExfVUlMKSkpIHsKICNpZmRlZiBVU0VfVUlMCi0Jc3RydWN0IHVpbHJlcSAgKnVycSA9IChzdHJ1Y3QgdWlscmVxICopcnE7CisJCXN0cnVjdCB1aWxyZXEgKnVycSA9IChzdHJ1Y3QgdWlscmVxICopcnE7CiAjZW5kaWYgLyogVVNFX1VJTCAqLwogCi0Jc3dpdGNoKCBjbWQgKSB7Ci0JCS8vID09PT09PT09PT09PT09PT09PSBQcml2YXRlIElPQ1RMcyAodXAgdG8gMTYpID09PT09PT09PT09PT09PT09PQorCQlzd2l0Y2ggKGNtZCkgeworCQkJLyogPT09PT09PT09PT09PT09PT09IFByaXZhdGUgSU9DVExzICh1cCB0byAxNikgPT09PT09PT09PT09PT09PT09ICovCiAjaWZkZWYgVVNFX1VJTAotCWNhc2UgV1ZMQU4yX0lPQ1RMX1VJTDoKLQkgICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMXG4iICk7Ci0JICAgICByZXQgPSB3dmxhbl91aWwoIHVycSwgbHAgKTsKLQkgICAgIGJyZWFrOwotI2VuZGlmICAvKiBVU0VfVUlMICovCisJCWNhc2UgV1ZMQU4yX0lPQ1RMX1VJTDoKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUxcbiIpOworCQkJcmV0ID0gd3ZsYW5fdWlsKHVycSwgbHApOworCQkJYnJlYWs7CisjZW5kaWYgLyogVVNFX1VJTCAqLwogCi0JZGVmYXVsdDoKLQkgICAgIERCR19UUkFDRShEYmdJbmZvLCAiSU9DVEwgQ09ERSBOT1QgU1VQUE9SVEVEOiAweCVYXG4iLCBjbWQgKTsKLQkgICAgIHJldCA9IC1FT1BOT1RTVVBQOwotCSAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMIENPREUgTk9UIFNVUFBPUlRFRDogMHglWFxuIiwKKwkJCQkgIGNtZCk7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJREJHX1dBUk5JTkcoRGJnSW5mbywKKwkJCSAgICAiREVWSUNFIElTIEJVU1ksIENBTk5PVCBQUk9DRVNTIFJFUVVFU1RcbiIpOworCQlyZXQgPSAtRUJVU1k7CiAJfQotICAgIH0gZWxzZSB7Ci0JREJHX1dBUk5JTkcoIERiZ0luZm8sICJERVZJQ0UgSVMgQlVTWSwgQ0FOTk9UIFBST0NFU1MgUkVRVUVTVFxuIiApOwotCXJldCA9IC1FQlVTWTsKLSAgICB9CiAKICNpZmRlZiBVU0VfUlRTCiBvdXRfYWN0X2ludF9vbl91bmxvY2s6Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KLSAgICB3bF9hY3RfaW50X29uKCBscCApOworI2VuZGlmIC8qIFVTRV9SVFMgKi8KKwl3bF9hY3RfaW50X29uKGxwKTsKIAotICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKIAotICAgIHJldHVybiByZXQ7Ci19IC8vIHdsX2lvY3RsCisJcmV0dXJuIHJldDsKK30JCQkJLyogd2xfaW9jdGwgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi12b2lkIHdsX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHdsX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICBzdHJ1Y3QgcHRfcmVncyByZWdzOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAKLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgd2xfaXNyKGRldi0+aXJxLCBkZXYsICZyZWdzKTsKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2lzcihkZXYtPmlycSwgZGV2LCAmcmVncyk7CisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogfQogI2VuZGlmCiAKQEAgLTU1OSw1MyArNTM3LDU0IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3R4X3RpbWVvdXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQordm9pZCB3bF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAjaWZkZWYgVVNFX1dEUwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGNvdW50OwotI2VuZGlmICAvKiBVU0VfV0RTICovCi0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBOVUxMOworCWludCBjb3VudDsKKyNlbmRpZiAvKiBVU0VfV0RTICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0cyA9IE5VTEw7CiAKLSAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzOiBUcmFuc21pdCB0aW1lb3V0LlxuIiwgZGV2LT5uYW1lICk7CisJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzOiBUcmFuc21pdCB0aW1lb3V0LlxuIiwgZGV2LT5uYW1lKTsKIAotICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCiAjaWZkZWYgVVNFX1JUUwotICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0JREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgdHhfdGltZW91dCBoYW5kbGVyLCBpbiBSVFMgbW9kZVxuIiApOwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotCXJldHVybjsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19UUkFDRShEYmdJbmZvLAorCQkJICAiU2tpcHBpbmcgdHhfdGltZW91dCBoYW5kbGVyLCBpbiBSVFMgbW9kZVxuIik7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIGRldmljZSAodGhlICJyb290IiBkZXZpY2Ugb3IgV0RTIHBvcnQpIHRoaXMgdGltZW91dAotICAgICAgIGlzIGZvciAqLworCS8qIEZpZ3VyZSBvdXQgd2hpY2ggZGV2aWNlICh0aGUgInJvb3QiIGRldmljZSBvciBXRFMgcG9ydCkgdGhpcyB0aW1lb3V0CisJICAgaXMgZm9yICovCiAjaWZkZWYgVVNFX1dEUwogCi0gICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLQlpZiggZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICkgewotCSAgICBwU3RhdHMgPSAmKCBscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzICk7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKykgeworCQlpZiAoZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2KSB7CisJCQlwU3RhdHMgPSAmKGxwLT53ZHNfcG9ydFtjb3VudF0uc3RhdHMpOwogCi0JICAgIC8qIEJyZWFrIHRoZSBsb29wIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGUgY291bnRlciB0byBhY2Nlc3MgV0RTCi0JICAgICAgIGluZm9ybWF0aW9uIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLwotCSAgICBicmVhazsKKwkJCS8qIEJyZWFrIHRoZSBsb29wIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGUgY291bnRlciB0byBhY2Nlc3MgV0RTCisJCQkgICBpbmZvcm1hdGlvbiBpbiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwkJCWJyZWFrOworCQl9CiAJfQotICAgIH0KIAotI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLwotICAgIGlmKCBwU3RhdHMgPT0gTlVMTCApIHsKLQlwU3RhdHMgPSAmKCBscC0+c3RhdHMgKTsKLSAgICB9CisJLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLworCWlmIChwU3RhdHMgPT0gTlVMTCkKKwkJcFN0YXRzID0gJihscC0+c3RhdHMpOwogCi0gICAgLyogQWNjdW11bGF0ZSB0aGUgdGltZW91dCBlcnJvciAqLwotICAgIHBTdGF0cy0+dHhfZXJyb3JzKys7CisJLyogQWNjdW11bGF0ZSB0aGUgdGltZW91dCBlcnJvciAqLworCXBTdGF0cy0+dHhfZXJyb3JzKys7CiAKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLX0gLy8gd2xfdHhfdGltZW91dAorCXdsX3VubG9jayhscCwgJmZsYWdzKTsKK30JCQkJLyogd2xfdHhfdGltZW91dCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjI2LDEwMyArNjA1LDEwNSBAQAogICogICAgICAxIG9uIGVycm9yCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF9zZW5kKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoraW50IHdsX3NlbmQoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQogewogCi0gICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgREVTQ19TVFJDVCAgICAgICAgICAqZGVzYzsKLSAgICBXVkxBTl9MRlJBTUUgICAgICAgICp0eEYgPSBOVUxMOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgKmVsZW1lbnQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBsZW47CisJaW50IHN0YXR1czsKKwlERVNDX1NUUkNUICpkZXNjOworCVdWTEFOX0xGUkFNRSAqdHhGID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCWludCBsZW47CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgaWYoIGxwID09IE5VTEwgKSB7Ci0gICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgaXMgTlVMTFxuIiApOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKCBscC0+ZGV2ID09IE5VTEwgKSB7Ci0gICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIm5ldF9kZXZpY2Ugc3RydWN0IGluIHdsX3ByaXZhdGUgaXMgTlVMTFxuIiApOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmIChscCA9PSBOVUxMKSB7CisJCURCR19FUlJPUihEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAobHAtPmRldiA9PSBOVUxMKSB7CisJCURCR19FUlJPUihEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIAotICAgIC8qIENoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIEZJRHM7IGlmIG5vbmUgYXJlIGF2YWlsYWJsZSwgZG9uJ3QgdGFrZSBhbnkKLSAgICAgICBmcmFtZXMgb2ZmIHRoZSB0eFEgKi8KLSAgICBpZiggbHAtPmhjZkN0eC5JRkJfUnNjSW5kID09IDAgKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBGSURzOyBpZiBub25lIGFyZSBhdmFpbGFibGUsCisJICogZG9uJ3QgdGFrZSBhbnkgZnJhbWVzIG9mZiB0aGUgdHhRCisJICovCisJaWYgKGxwLT5oY2ZDdHguSUZCX1JzY0luZCA9PSAwKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgICAvKiBSZWNsYWltIHRoZSBUeFEgRWxlbWVudHMgYW5kIHBsYWNlIHRoZW0gYmFjayBvbiB0aGUgZnJlZSBxdWV1ZSAqLwotICAgIGlmKCAhbGlzdF9lbXB0eSggJiggbHAtPnR4UVswXSApKSkgewotICAgICAgICBlbGVtZW50ID0gbHAtPnR4UVswXS5uZXh0OworCS8qIFJlY2xhaW0gdGhlIFR4USBFbGVtZW50cyBhbmQgcGxhY2UgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIHF1ZXVlICovCisJaWYgKCFsaXN0X2VtcHR5KCYobHAtPnR4UVswXSkpKSB7CisJCWVsZW1lbnQgPSBscC0+dHhRWzBdLm5leHQ7CiAKLSAgICAgICAgdHhGID0gKFdWTEFOX0xGUkFNRSAqIClsaXN0X2VudHJ5KCBlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUgKTsKLSAgICAgICAgaWYoIHR4RiAhPSBOVUxMICkgewotICAgICAgICAgICAgbHAtPnR4Ri5za2IgID0gdHhGLT5mcmFtZS5za2I7Ci0gICAgICAgICAgICBscC0+dHhGLnBvcnQgPSB0eEYtPmZyYW1lLnBvcnQ7CisJCXR4RiA9IChXVkxBTl9MRlJBTUUgKikgbGlzdF9lbnRyeShlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUpOworCQlpZiAodHhGICE9IE5VTEwpIHsKKwkJCWxwLT50eEYuc2tiID0gdHhGLT5mcmFtZS5za2I7CisJCQlscC0+dHhGLnBvcnQgPSB0eEYtPmZyYW1lLnBvcnQ7CiAKLSAgICAgICAgICAgIHR4Ri0+ZnJhbWUuc2tiICA9IE5VTEw7Ci0gICAgICAgICAgICB0eEYtPmZyYW1lLnBvcnQgPSAwOworCQkJdHhGLT5mcmFtZS5za2IgPSBOVUxMOworCQkJdHhGLT5mcmFtZS5wb3J0ID0gMDsKIAotICAgICAgICAgICAgbGlzdF9kZWwoICYoIHR4Ri0+bm9kZSApKTsKLSAgICAgICAgICAgIGxpc3RfYWRkKCBlbGVtZW50LCAmKCBscC0+dHhGcmVlICkpOworCQkJbGlzdF9kZWwoJih0eEYtPm5vZGUpKTsKKwkJCWxpc3RfYWRkKGVsZW1lbnQsICYobHAtPnR4RnJlZSkpOwogCi0gICAgICAgICAgICBscC0+dHhRX2NvdW50LS07CisJCQlscC0+dHhRX2NvdW50LS07CiAKLSAgICAgICAgICAgIGlmKCBscC0+dHhRX2NvdW50IDwgVFhfUV9MT1dfV0FURVJfTUFSSyApIHsKLSAgICAgICAgICAgICAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgewotICAgICAgICAgICAgICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJLaWNrc3RhcnRpbmcgUTogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKLSAgICAgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPmRldiApOwotICAgICAgICAgICAgICAgICAgICBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKLSAgICAgICAgICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJCQlpZiAobHAtPnR4UV9jb3VudCA8IFRYX1FfTE9XX1dBVEVSX01BUkspIHsKKwkJCQlpZiAobHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFKSB7CisJCQkJCURCR19UWChEYmdJbmZvLCAiS2lja3N0YXJ0aW5nIFE6ICVkXG4iLAorCQkJCQkgICAgICAgbHAtPnR4UV9jb3VudCk7CisJCQkJCW5ldGlmX3dha2VfcXVldWUobHAtPmRldik7CisJCQkJCVdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKGxwKTsKKwkJCQkJbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CiAKLSAgICBpZiggbHAtPnR4Ri5za2IgPT0gTlVMTCApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwlpZiAobHAtPnR4Ri5za2IgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOwogCi0gICAgLyogSWYgdGhlIGRldmljZSBoYXMgcmVzb3VyY2VzIChGSURzKSBhdmFpbGFibGUsIHRoZW4gVHggdGhlIHBhY2tldCAqLwotICAgIC8qIEZvcm1hdCB0aGUgVHhSZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHRoZSBhZGFwdGVyICovCi0gICAgbGVuID0gbHAtPnR4Ri5za2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBscC0+dHhGLnNrYi0+bGVuOworCS8qIElmIHRoZSBkZXZpY2UgaGFzIHJlc291cmNlcyAoRklEcykgYXZhaWxhYmxlLCB0aGVuIFR4IHRoZSBwYWNrZXQgKi8KKwkvKiBGb3JtYXQgdGhlIFR4UmVxdWVzdCBhbmQgc2VuZCBpdCB0byB0aGUgYWRhcHRlciAqLworCWxlbiA9IGxwLT50eEYuc2tiLT5sZW4gPCBFVEhfWkxFTiA/IEVUSF9aTEVOIDogbHAtPnR4Ri5za2ItPmxlbjsKIAotICAgIGRlc2MgICAgICAgICAgICAgICAgICAgID0gJiggbHAtPmRlc2NfdHggKTsKLSAgICBkZXNjLT5idWZfYWRkciAgICAgICAgICA9IGxwLT50eEYuc2tiLT5kYXRhOwotICAgIGRlc2MtPkJVRl9DTlQgICAgICAgICAgID0gbGVuOwotICAgIGRlc2MtPm5leHRfZGVzY19hZGRyICAgID0gTlVMTDsKKwlkZXNjID0gJihscC0+ZGVzY190eCk7CisJZGVzYy0+YnVmX2FkZHIgPSBscC0+dHhGLnNrYi0+ZGF0YTsKKwlkZXNjLT5CVUZfQ05UID0gbGVuOworCWRlc2MtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKIAotICAgIHN0YXR1cyA9IGhjZl9zZW5kX21zZyggJiggbHAtPmhjZkN0eCApLCBkZXNjLCBscC0+dHhGLnBvcnQgKTsKKwlzdGF0dXMgPSBoY2Zfc2VuZF9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgbHAtPnR4Ri5wb3J0KTsKIAotICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7Ci0gICAgICAgIGxwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpZiAoc3RhdHVzID09IEhDRl9TVUNDRVNTKSB7CisJCWxwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAotICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJUcmFuc21pdC4uLlxuIiApOworCQlEQkdfVFgoRGJnSW5mbywgIlRyYW5zbWl0Li4uXG4iKTsKIAotICAgICAgICBpZiggbHAtPnR4Ri5wb3J0ID09IEhDRl9QT1JUXzAgKSB7Ci0gICAgICAgICAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOwotICAgICAgICAgICAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eEYuc2tiLT5sZW47Ci0gICAgICAgIH0KLQorCQlpZiAobHAtPnR4Ri5wb3J0ID09IEhDRl9QT1JUXzApIHsKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKKwkJfQogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBscC0+d2RzX3BvcnRbKCggbHAtPnR4Ri5wb3J0ID4+IDggKSAtIDEpXS5zdGF0cy50eF9wYWNrZXRzKys7Ci0gICAgICAgICAgICBscC0+d2RzX3BvcnRbKCggbHAtPnR4Ri5wb3J0ID4+IDggKSAtIDEpXS5zdGF0cy50eF9ieXRlcyArPSBscC0+dHhGLnNrYi0+bGVuOwotICAgICAgICB9CisJCWVsc2UgeworCQkJbHAtPndkc19wb3J0WygobHAtPnR4Ri5wb3J0ID4+IDgpIC0KKwkJCQkgICAgICAxKV0uc3RhdHMudHhfcGFja2V0cysrOworCQkJbHAtPndkc19wb3J0WygobHAtPnR4Ri5wb3J0ID4+IDgpIC0KKwkJCQkgICAgICAxKV0uc3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKKwkJfQogCi0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAvKiBVU0VfV0RTICovCiAKLSAgICAgICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCi0gICAgICAgICAgICB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICAgICAgZGV2X2tmcmVlX3NrYiggbHAtPnR4Ri5za2IgKTsKKwkJLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCisJCSAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLworCQlkZXZfa2ZyZWVfc2tiKGxwLT50eEYuc2tiKTsKIAotICAgICAgICBscC0+dHhGLnNrYiA9IE5VTEw7Ci0gICAgICAgIGxwLT50eEYucG9ydCA9IDA7Ci0gICAgfQorCQlscC0+dHhGLnNrYiA9IE5VTEw7CisJCWxwLT50eEYucG9ydCA9IDA7CisJfQogCi0gICAgcmV0dXJuIFRSVUU7Ci19IC8vIHdsX3NlbmQKKwlyZXR1cm4gVFJVRTsKK30JCQkJLyogd2xfc2VuZCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzQ0LDc1ICs3MjUsNzQgQEAKICAqICAgICAgMSBvbiBlcnJvcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHgoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0ICkKK2ludCB3bF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydCkKIHsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgV1ZMQU5fTEZSQU1FICAgICAgICAgICAgKnR4RiA9IE5VTEw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKmVsZW1lbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJV1ZMQU5fTEZSQU1FICp0eEYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgLyogR3JhYiB0aGUgc3BpbmxvY2sgKi8KLSAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisJLyogR3JhYiB0aGUgc3BpbmxvY2sgKi8KKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCi0gICAgaWYoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApIHsKLSAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJVSUwgaGFzIGRldmljZSBibG9ja2VkXG4iICk7Ci0gICAgICAgIC8qIFN0YXJ0IGRyb3BwaW5nIHBhY2tldHMgaGVyZT8/PyAqLwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KKwlpZiAobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSB7CisJCURCR19XQVJOSU5HKERiZ0luZm8sICJVSUwgaGFzIGRldmljZSBibG9ja2VkXG4iKTsKKwkJLyogU3RhcnQgZHJvcHBpbmcgcGFja2V0cyBoZXJlPz8/ICovCisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQogI2lmZGVmIFVTRV9SVFMKLSAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewotICAgICAgICBEQkdfUFJJTlQoICJSVFM6IHdlJ3JlIGdldHRpbmcgYSBUeC4uLlxuIiApOwotCXdsX3VubG9jayggbHAsICZmbGFncyApOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwlpZiAobHAtPnVzZVJUUyA9PSAxKSB7CisJCURCR19QUklOVCgiUlRTOiB3ZSdyZSBnZXR0aW5nIGEgVHguLi5cbiIpOworCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICBpZiggIWxwLT51c2VfZG1hICkgewotICAgICAgICAvKiBHZXQgYW4gZWxlbWVudCBmcm9tIHRoZSBxdWV1ZSAqLwotICAgICAgICBlbGVtZW50ID0gbHAtPnR4RnJlZS5uZXh0OwotICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICopbGlzdF9lbnRyeSggZWxlbWVudCwgV1ZMQU5fTEZSQU1FLCBub2RlICk7Ci0gICAgICAgIGlmKCB0eEYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByb2JsZW0gd2l0aCBsaXN0X2VudHJ5XG4iICk7Ci0JICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmlsbCBvdXQgdGhlIGZyYW1lICovCi0gICAgICAgIHR4Ri0+ZnJhbWUuc2tiID0gc2tiOwotICAgICAgICB0eEYtPmZyYW1lLnBvcnQgPSBwb3J0OwotICAgICAgICAvKiBNb3ZlIHRoZSBmcmFtZSB0byB0aGUgdHhRICovCi0gICAgICAgIC8qIE5PVEU6IEhlcmUncyB3aGVyZSB3ZSB3b3VsZCBkbyBwcmlvcml0eSBxdWV1ZWluZyAqLwotICAgICAgICBsaXN0X21vdmUoJih0eEYtPm5vZGUpLCAmKGxwLT50eFFbMF0pKTsKKwlpZiAoIWxwLT51c2VfZG1hKSB7CisJCS8qIEdldCBhbiBlbGVtZW50IGZyb20gdGhlIHF1ZXVlICovCisJCWVsZW1lbnQgPSBscC0+dHhGcmVlLm5leHQ7CisJCXR4RiA9IChXVkxBTl9MRlJBTUUgKikgbGlzdF9lbnRyeShlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUpOworCQlpZiAodHhGID09IE5VTEwpIHsKKwkJCURCR19FUlJPUihEYmdJbmZvLCAiUHJvYmxlbSB3aXRoIGxpc3RfZW50cnlcbiIpOworCQkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogRmlsbCBvdXQgdGhlIGZyYW1lICovCisJCXR4Ri0+ZnJhbWUuc2tiID0gc2tiOworCQl0eEYtPmZyYW1lLnBvcnQgPSBwb3J0OworCQkvKiBNb3ZlIHRoZSBmcmFtZSB0byB0aGUgdHhRICovCisJCS8qIE5PVEU6IEhlcmUncyB3aGVyZSB3ZSB3b3VsZCBkbyBwcmlvcml0eSBxdWV1ZWluZyAqLworCQlsaXN0X21vdmUoJih0eEYtPm5vZGUpLCAmKGxwLT50eFFbMF0pKTsKIAotICAgICAgICBscC0+dHhRX2NvdW50Kys7Ci0gICAgICAgIGlmKCBscC0+dHhRX2NvdW50ID49IERFRkFVTFRfTlVNX1RYX0ZSQU1FUyApIHsKLSAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIlEgRnVsbDogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKLSAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+ZGV2ICk7Ci0gICAgICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7Ci0gICAgICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2xfYWN0X2ludF9vZmYoIGxwICk7IC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworCQlscC0+dHhRX2NvdW50Kys7CisJCWlmIChscC0+dHhRX2NvdW50ID49IERFRkFVTFRfTlVNX1RYX0ZSQU1FUykgeworCQkJREJHX1RYKERiZ0luZm8sICJRIEZ1bGw6ICVkXG4iLCBscC0+dHhRX2NvdW50KTsKKwkJCWlmIChscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSkgeworCQkJCW5ldGlmX3N0b3BfcXVldWUobHAtPmRldik7CisJCQkJV0xfV0RTX05FVElGX1NUT1BfUVVFVUUobHApOworCQkJCWxwLT5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOworCQkJfQorCQl9CisJfQorCXdsX2FjdF9pbnRfb2ZmKGxwKTsJLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCiAKLSAgICAvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kICovCisJLyogU2VuZCB0aGUgZGF0YSB0byB0aGUgaGFyZHdhcmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCAqLwogI2lmZGVmIEVOQUJMRV9ETUEKLSAgICBpZiggbHAtPnVzZV9kbWEgKSB7Ci0gICAgICAgIHdsX3NlbmRfZG1hKCBscCwgc2tiLCBwb3J0ICk7Ci0gICAgfQotICAgIGVsc2UKKwlpZiAobHAtPnVzZV9kbWEpIHsKKwkJd2xfc2VuZF9kbWEobHAsIHNrYiwgcG9ydCk7CisJfSBlbHNlCiAjZW5kaWYKLSAgICB7Ci0gICAgICAgIHdsX3NlbmQoIGxwICk7Ci0gICAgfQotICAgIC8qIFJlLWVuYWJsZSBJbnRlcnJ1cHRzLCByZWxlYXNlIHRoZSBzcGlubG9jayBhbmQgcmV0dXJuICovCi0gICAgd2xfYWN0X2ludF9vbiggbHAgKTsKLSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKLSAgICByZXR1cm4gMDsKLX0gLy8gd2xfdHgKKwl7CisJCXdsX3NlbmQobHApOworCX0KKwkvKiBSZS1lbmFibGUgSW50ZXJydXB0cywgcmVsZWFzZSB0aGUgc3BpbmxvY2sgYW5kIHJldHVybiAqLworCXdsX2FjdF9pbnRfb24obHApOworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwlyZXR1cm4gMDsKK30JCQkJLyogd2xfdHggKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgzNSw2NyArODE1LDY4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IHdsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgcG9ydDsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgcGt0bGVuOwotICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgIGhmc19zdGF0OwotICAgIERFU0NfU1RSQ1QgICAgICAgICAgICAgICpkZXNjOworCWludCBwb3J0OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCWludCBzdGF0dXM7CisJaGNmXzE2IHBrdGxlbjsKKwloY2ZfMTYgaGZzX3N0YXQ7CisJREVTQ19TVFJDVCAqZGVzYzsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgaWYoISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKKwlpZiAoIShscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kpKSB7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0gICAgICAgICAgICBEQkdfUFJJTlQoICJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIgKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwkJaWYgKGxwLT51c2VSVFMgPT0gMSkgeworCQkJREJHX1BSSU5UKCJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAgICAgLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICAgICAgICBoZnNfc3RhdCA9IChoY2ZfMTYpKCggbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVF0gKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUICsgMV0gPDwgOCApKTsKKwkJLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLworCQloZnNfc3RhdCA9IChoY2ZfMTYpICgobHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVF0pIHwKKwkJCQkgICAgIChscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUICsgMV0gPDwgOCkpOwogCi0gICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXNuJ3QgYmFkICovCi0gICAgICAgIGlmKCggaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIgKSAhPSBIQ0ZfU1VDQ0VTUyApIHsKLSAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSApOwotICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KKwkJLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KKwkJaWYgKChoZnNfc3RhdCAmIEhGU19TVEFUX0VSUikgIT0gSENGX1NVQ0NFU1MpIHsKKwkJCURCR19XQVJOSU5HKERiZ0luZm8sCisJCQkJICAgICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAorCQkJCSAgICBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCi0gICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCi0gICAgICAgIHBvcnQgPSAoIGhmc19zdGF0ID4+IDggKSAmIDB4MDAwNzsKLSAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKKwkJLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KKwkJcG9ydCA9IChoZnNfc3RhdCA+PiA4KSAmIDB4MDAwNzsKKwkJREJHX1JYKERiZ0luZm8sICJSeCBmcmFtZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7CiAKLSAgICAgICAgcGt0bGVuID0gbHAtPmhjZkN0eC5JRkJfUnhMZW47Ci0gICAgICAgIGlmIChwa3RsZW4gIT0gMCkgewotICAgICAgICAgICAgc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7Ci0gICAgICAgICAgICBpZiAoc2tiICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG5ldGRldiBiYXNlZCBvbiB0aGUgcG9ydCAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCggcG9ydCApIHsKKwkJcGt0bGVuID0gbHAtPmhjZkN0eC5JRkJfUnhMZW47CisJCWlmIChwa3RsZW4gIT0gMCkgeworCQkJc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7CisJCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCQkvKiBTZXQgdGhlIG5ldGRldiBiYXNlZCBvbiB0aGUgcG9ydCAqLworCQkJCXN3aXRjaCAocG9ydCkgewogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmICAvKiBVU0VfV0RTICovCisJCQkJY2FzZSAxOgorCQkJCWNhc2UgMjoKKwkJCQljYXNlIDM6CisJCQkJY2FzZSA0OgorCQkJCWNhc2UgNToKKwkJCQljYXNlIDY6CisJCQkJCXNrYi0+ZGV2ID0gbHAtPndkc19wb3J0W3BvcnQgLSAxXS5kZXY7CisJCQkJCWJyZWFrOworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorCQkJCWNhc2UgMDoKKwkJCQlkZWZhdWx0OgorCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJYnJlYWs7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgZGVzYyA9ICYoIGxwLT5kZXNjX3J4ICk7CisJCQkJZGVzYyA9ICYobHAtPmRlc2NfcngpOwogCi0gICAgICAgICAgICAgICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOworCQkJCWRlc2MtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKIAogLyoKICNkZWZpbmUgQkxPQ0tfSU5QVVQoYnVmLCBsZW4pIFwKQEAgLTkwNCw2NyArODg1LDczIEBACiAgICAgc3RhdHVzID0gaGNmX3Jjdl9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgMCkKICovCiAKLSAgICAgICAgICAgICAgICBHRVRfUEFDS0VUKCBza2ItPmRldiwgc2tiLCBwa3RsZW4gKTsKKwkJCQlHRVRfUEFDS0VUKHNrYi0+ZGV2LCBza2IsIHBrdGxlbik7CiAKLSAgICAgICAgICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewotICAgICAgICAgICAgICAgICAgICBuZXRpZl9yeCggc2tiICk7CisJCQkJaWYgKHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUykgeworCQkJCQluZXRpZl9yeChza2IpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOwotICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKLSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlpZiAocG9ydCA9PSAwKSB7CisJCQkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKwkJCQkJfQogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1dEUyAqLworCQkJCQllbHNlIHsKKwkJCQkJCWxwLT53ZHNfcG9ydFtwb3J0IC0KKwkJCQkJCQkgICAgIDFdLnN0YXRzLgorCQkJCQkJICAgIHJ4X3BhY2tldHMrKzsKKwkJCQkJCWxwLT53ZHNfcG9ydFtwb3J0IC0KKwkJCQkJCQkgICAgIDFdLnN0YXRzLgorCQkJCQkJICAgIHJ4X2J5dGVzICs9IHBrdGxlbjsKKwkJCQkJfQorI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCiAjaWZkZWYgV0lSRUxFU1NfRVhUCiAjaWZkZWYgV0lSRUxFU1NfU1BZCi0gICAgICAgICAgICAgICAgICAgIGlmKCBscC0+c3B5ZGF0YS5zcHlfbnVtYmVyID4gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNyY2FkZHIgPSBza2ItPm1hYy5yYXcgKyBNQUNfQUREUl9TSVpFOworCQkJCQlpZiAobHAtPnNweWRhdGEuc3B5X251bWJlciA+IDApIHsKKwkJCQkJCWNoYXIgKnNyY2FkZHIgPQorCQkJCQkJICAgIHNrYi0+bWFjLnJhdyArCisJCQkJCQkgICAgTUFDX0FERFJfU0laRTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgd2xfc3B5X2dhdGhlciggZGV2LCBzcmNhZGRyICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJCXdsX3NweV9nYXRoZXIoZGV2LCBzcmNhZGRyKTsKKwkJCQkJfQogI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLwogI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlJ4IHJlcXVlc3QgdG8gY2FyZCBGQUlMRURcbiIgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlEQkdfRVJST1IoRGJnSW5mbywKKwkJCQkJCSAgIlJ4IHJlcXVlc3QgdG8gY2FyZCBGQUlMRURcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOwotICAgICAgICAgICAgICAgICAgICB9CisJCQkJCWlmIChwb3J0ID09IDApCisJCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1dEUyAqLworCQkJCQllbHNlIHsKKwkJCQkJCWxwLT53ZHNfcG9ydFtwb3J0IC0KKwkJCQkJCQkgICAgIDFdLnN0YXRzLgorCQkJCQkJICAgIHJ4X2Ryb3BwZWQrKzsKKwkJCQkJfQorI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIgKTsKKwkJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJREJHX0VSUk9SKERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iKTsKIAotICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0gICAgICAgICAgICAgICAgfQorCQkJCWlmIChwb3J0ID09IDApCisJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkJCQllbHNlIHsKKwkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJICAgICAxXS5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJfQorI2VuZGlmIC8qIFVTRV9XRFMgKi8KKwkJCX0KKwkJfQorCX0KIAotICAgIHJldHVybiAwOwotfSAvLyB3bF9yeAorCXJldHVybiAwOworfQkJCQkvKiB3bF9yeCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTg2LDE0MiArOTczLDE1OSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBORVdfTVVMVElDQVNUCiAKLXZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgd2xfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0jaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKLS8vOz9zZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlciBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorI2lmIDEJCQkJLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAqLworCS8qCisJICogc2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZSA/CisJICogc2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIKKwkgKiBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorCSAqLwogCi0gICAgaW50ICAgICAgICAgICAgICAgICB4OwotICAgIHN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKwlpbnQgeDsKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgaWYoICF3bF9hZGFwdGVyX2lzX29wZW4oIGRldiApKQotICAgICAgICByZXR1cm47CisJaWYgKCF3bF9hZGFwdGVyX2lzX29wZW4oZGV2KSkKKwkJcmV0dXJuOwogCiAjaWYgREJHCi0gICAgaWYoIERCR19GTEFHUyggRGJnSW5mbyApICYgREJHX1BBUkFNX09OICkgewotICAgICAgICBEQkdfUFJJTlQoIiAgZmxhZ3M6ICVzJXMlc1xuIiwKLSAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgPyAiUHJvbWlzY3VvdXMgIiA6ICIiLAotICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCApID8gIk11bHRpY2FzdCAiIDogIiIsCi0gICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSA/ICJBbGwtTXVsdGljYXN0IiA6ICIiICk7CisJaWYgKERCR19GTEFHUyhEYmdJbmZvKSAmIERCR19QQVJBTV9PTikgeworCQlEQkdfUFJJTlQoIiAgZmxhZ3M6ICVzJXMlc1xuIiwKKwkJCSAgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAiUHJvbWlzY3VvdXMgIiA6ICIiLAorCQkJICAoZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QpID8gIk11bHRpY2FzdCAiIDogIiIsCisJCQkgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSA/ICJBbGwtTXVsdGljYXN0IiA6ICIiKTsKIAotICAgICAgICBEQkdfUFJJTlQoICIgIG1jX2NvdW50OiAlZFxuIiwgbmV0ZGV2X21jX2NvdW50KGRldikpOworCQlEQkdfUFJJTlQoIiAgbWNfY291bnQ6ICVkXG4iLCBuZXRkZXZfbWNfY291bnQoZGV2KSk7CiAKLQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KQotCURCR19QUklOVCgiICAgICVwTSAoJWQpXG4iLCBoYS0+YWRkciwgZGV2LT5hZGRyX2xlbik7Ci0gICAgfQorCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KQorCQkgICAgREJHX1BSSU5UKCIgICAgJXBNICglZClcbiIsIGhhLT5hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwl9CiAjZW5kaWYgLyogREJHICovCiAKLSAgICBpZighKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCWlmICghKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkpIHsKIAogI2lmZGVmIFVTRV9SVFMKLSAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKLSAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIG11bHRpY2FzdCwgaW4gUlRTIG1vZGVcbiIgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotI2VuZGlmICAvKiBVU0VfUlRTICovCisJCWlmIChscC0+dXNlUlRTID09IDEpIHsKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiU2tpcHBpbmcgbXVsdGljYXN0LCBpbiBSVFMgbW9kZVxuIik7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOwotICAgICAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKwkJd2xfbG9jayhscCwgJmZsYWdzKTsKKwkJd2xfYWN0X2ludF9vZmYobHApOwogCi0JCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKLSAgICAgICAgICAgIGlmKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSB7Ci0gICAgICAgICAgICAgICAgLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7Ci0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7Ci0gICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgUHJvbWlzY3VvdXMgbW9kZSAoSUZGX1BST01JU0MpXG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobmV0ZGV2X21jX2NvdW50KGRldikgPiBIQ0ZfTUFYX01VTFRJQ0FTVCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJICkpIHsKLSAgICAgICAgICAgICAgICAvKiBTaHV0dGluZyBvZmYgdGhpcyBmaWx0ZXIgd2lsbCBlbmFibGUgYWxsIG11bHRpY2FzdCBmcmFtZXMgdG8KLSAgICAgICAgICAgICAgICAgICBiZSBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsIHNvCi0gICAgICAgICAgICAgICAgICAgYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7Ci0gICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7Ci0gICAgICAgICAgICAgICAgd2xfYXBwbHkoIGxwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghbmV0ZGV2X21jX2VtcHR5KGRldikpIHsKLSAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9ICggbmV0ZGV2X21jX2NvdW50KGRldikgKiAzICkgKyAxOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CisJCWlmIChDTlZfSU5UX1RPX0xJVFRMRShscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQpID09CisJCSAgICBDT01QX0lEX0ZXX1NUQSkgeworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCQkJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCQkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKDEpOworCQkJCURCR19QUklOVAorCQkJCSAgICAoIkVuYWJsaW5nIFByb21pc2N1b3VzIG1vZGUgKElGRl9QUk9NSVNDKVxuIik7CisJCQkJaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksCisJCQkJCSAgICAgKExUVlApICYgKGxwLT5sdHZSZWNvcmQpKTsKKwkJCX0gZWxzZSBpZiAoKG5ldGRldl9tY19jb3VudChkZXYpID4gSENGX01BWF9NVUxUSUNBU1QpCisJCQkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCQkJLyogU2h1dHRpbmcgb2ZmIHRoaXMgZmlsdGVyIHdpbGwgZW5hYmxlIGFsbCBtdWx0aWNhc3QgZnJhbWVzIHRvCisJCQkJICAgYmUgc2VudCB1cCBmcm9tIHRoZSBkZXZpY2U7IGhvd2V2ZXIsIHRoaXMgaXMgYSBzdGF0aWMgUklELCBzbworCQkJCSAgIGEgY2FsbCB0byB3bF9hcHBseSgpIGlzIG5lZWRlZCAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwkJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfUlhfQUxMX0dST1VQX0FERFI7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKDApOworCQkJCURCR19QUklOVAorCQkJCSAgICAoIkVuYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIik7CisJCQkJaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksCisJCQkJCSAgICAgKExUVlApICYgKGxwLT5sdHZSZWNvcmQpKTsKKwkJCQl3bF9hcHBseShscCk7CisJCQl9IGVsc2UgaWYgKCFuZXRkZXZfbWNfZW1wdHkoZGV2KSkgeworCQkJCS8qIFNldCB0aGUgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0KKwkJCQkgICAgKG5ldGRldl9tY19jb3VudChkZXYpICogMykgKyAxOworCQkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CiAKLQkJeCA9IDA7Ci0JCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmKGxwLT5sdHZSZWNvcmQudS51OFt4KysgKiBFVEhfQUxFTl0pLAotCQkJICAgaGEtPmFkZHIsIEVUSF9BTEVOKTsKLSAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJTZXR0aW5nIG11bHRpY2FzdCBsaXN0XG4iICk7Ci0gICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKLSAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgUHJvbWlzY3VvdXMgbW9kZVxuIiApOwotICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCQkJCXggPSAwOworCQkJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCisJCQkJICAgIG1lbWNweSgmCisJCQkJCSAgIChscC0+bHR2UmVjb3JkLnUudThbeCsrICogRVRIX0FMRU5dKSwKKwkJCQkJICAgaGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJCQlEQkdfUFJJTlQoIlNldHRpbmcgbXVsdGljYXN0IGxpc3RcbiIpOworCQkJCWhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLAorCQkJCQkgICAgIChMVFZQKSAmIChscC0+bHR2UmVjb3JkKSk7CisJCQl9IGVsc2UgeworCQkJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQkJCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwkJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19QUk9NSVNDVU9VU19NT0RFOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSgwKTsKKwkJCQlEQkdfUFJJTlQoIkRpc2FibGluZyBQcm9taXNjdW91cyBtb2RlXG4iKTsKKwkJCQloY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwKKwkJCQkJICAgICAoTFRWUCkgJiAobHAtPmx0dlJlY29yZCkpOwogCi0gICAgICAgICAgICAgICAgLyogRGlzYWJsZSBtdWx0aWNhc3QgbW9kZSAqLwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19HUk9VUF9BRERSOwotICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBNdWx0aWNhc3QgbW9kZVxuIiApOwotICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCQkJCS8qIERpc2FibGUgbXVsdGljYXN0IG1vZGUgKi8KKwkJCQlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKKwkJCQlEQkdfUFJJTlQoIkRpc2FibGluZyBNdWx0aWNhc3QgbW9kZVxuIik7CisJCQkJaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksCisJCQkJCSAgICAgKExUVlApICYgKGxwLT5sdHZSZWNvcmQpKTsKIAotICAgICAgICAgICAgICAgIC8qIFR1cm5pbmcgb24gdGhpcyBmaWx0ZXIgd2lsbCBwcmV2ZW50IGFsbCBtdWx0aWNhc3QgZnJhbWVzIGZyb20KLSAgICAgICAgICAgICAgICAgICBiZWluZyBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsCi0gICAgICAgICAgICAgICAgICAgc28gYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwotICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKLSAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7Ci0gICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIiApOwotICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwotICAgICAgICAgICAgICAgIHdsX2FwcGx5KCBscCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7Ci0Jd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Ci0gICAgfQorCQkJCS8qCisJCQkJICogVHVybmluZyBvbiB0aGlzIGZpbHRlciB3aWxsIHByZXZlbnQgYWxsIG11bHRpY2FzdCBmcmFtZXMgZnJvbQorCQkJCSAqIGJlaW5nIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwKKwkJCQkgKiBzbyBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQKKwkJCQkgKi8KKwkJCQlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSgxKTsKKwkJCQlEQkdfUFJJTlQKKwkJCQkgICAgKCJEaXNhYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iKTsKKwkJCQloY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwKKwkJCQkJICAgICAoTFRWUCkgJiAobHAtPmx0dlJlY29yZCkpOworCQkJCXdsX2FwcGx5KGxwKTsKKwkJCX0KKwkJfQorCQl3bF9hY3RfaW50X29uKGxwKTsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCX0KICNlbmRpZiAvKiBIQ0ZfU1RBICovCi19IC8vIHdsX211bHRpY2FzdAorfQkJCQkvKiB3bF9tdWx0aWNhc3QgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogI2Vsc2UgLyogTkVXX01VTFRJQ0FTVCAqLwogCi12b2lkIHdsX211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgdm9pZCAqYWRkcnMgKQordm9pZCB3bF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgdm9pZCAqYWRkcnMpCiB7Ci0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7Ci0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibnVtX2FkZHJzIiwgIiVkIiwgbnVtX2FkZHJzICk7Ci0gICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiYWRkcnMiLCAiMHglcCIsIGFkZHJzICk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCURCR19QQVJBTShEYmdJbmZvLCAibnVtX2FkZHJzIiwgIiVkIiwgbnVtX2FkZHJzKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImFkZHJzIiwgIjB4JXAiLCBhZGRycyk7CiAKICNlcnJvciBPYnNvbGV0ZSBzZXQgbXVsdGljYXN0IGludGVyZmFjZSEKLX0gLy8gd2xfbXVsdGljYXN0Cit9CQkJCS8qIHdsX211bHRpY2FzdCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAjZW5kaWYgLyogTkVXX01VTFRJQ0FTVCAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHdsX25ldGRldl9vcHMgPQotewotICAgIC5uZG9fc3RhcnRfeG1pdCAgICAgICAgID0gJndsX3R4X3BvcnQwLAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB3bF9uZXRkZXZfb3BzID0geworCS5uZG9fc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MCwKIAotICAgIC5uZG9fc2V0X2NvbmZpZyAgICAgICAgID0gJndsX2NvbmZpZywKLSAgICAubmRvX2dldF9zdGF0cyAgICAgICAgICA9ICZ3bF9zdGF0cywKLSAgICAubmRvX3NldF9yeF9tb2RlICAgICAgICA9ICZ3bF9tdWx0aWNhc3QsCisJLm5kb19zZXRfY29uZmlnID0gJndsX2NvbmZpZywKKwkubmRvX2dldF9zdGF0cyA9ICZ3bF9zdGF0cywKKwkubmRvX3NldF9yeF9tb2RlID0gJndsX211bHRpY2FzdCwKIAotICAgIC5uZG9faW5pdCAgICAgICAgICAgICAgID0gJndsX2luc2VydCwKLSAgICAubmRvX29wZW4gICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX29wZW4sCi0gICAgLm5kb19zdG9wICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9jbG9zZSwKLSAgICAubmRvX2RvX2lvY3RsICAgICAgICAgICA9ICZ3bF9pb2N0bCwKKwkubmRvX2luaXQgPSAmd2xfaW5zZXJ0LAorCS5uZG9fb3BlbiA9ICZ3bF9hZGFwdGVyX29wZW4sCisJLm5kb19zdG9wID0gJndsX2FkYXB0ZXJfY2xvc2UsCisJLm5kb19kb19pb2N0bCA9ICZ3bF9pb2N0bCwKIAotICAgIC5uZG9fdHhfdGltZW91dCAgICAgICAgID0gJndsX3R4X3RpbWVvdXQsCisJLm5kb190eF90aW1lb3V0ID0gJndsX3R4X3RpbWVvdXQsCiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotICAgIC5uZG9fcG9sbF9jb250cm9sbGVyICAgID0gd2xfcG9sbCwKKwkubmRvX3BvbGxfY29udHJvbGxlciA9IHdsX3BvbGwsCiAjZW5kaWYKIH07CiAKQEAgLTExNDQsNDggKzExNDgsNTEgQEAKICAqICAgICAgZGV2aWNlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbmV0X2RldmljZSAqIHdsX2RldmljZV9hbGxvYyggdm9pZCApCitzdHJ1Y3QgbmV0X2RldmljZSAqd2xfZGV2aWNlX2FsbG9jKHZvaWQpCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gTlVMTDsKLSAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gTlVMTDsKIAotICAgIC8qIEFsbG9jIGEgbmV0X2RldmljZSBzdHJ1Y3QgKi8KLSAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHdsX3ByaXZhdGUpKTsKLSAgICBpZiAoIWRldikKLSAgICAgICAgcmV0dXJuIE5VTEw7CisJLyogQWxsb2MgYSBuZXRfZGV2aWNlIHN0cnVjdCAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgd2xfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKIAotICAgIC8qIEluaXRpYWxpemUgdGhlICduZXh0JyBwb2ludGVyIGluIHRoZSBzdHJ1Y3QuIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIFBDSSwKLSAgICAgICBidXQgZG8gaXQgaGVyZSBqdXN0IGluIGNhc2UgaXQncyB1c2VkIGZvciBvdGhlciBidXNlcyBpbiB0aGUgZnV0dXJlICovCi0gICAgbHAgPSB3bF9wcml2KGRldik7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSAnbmV4dCcgcG9pbnRlciBpbiB0aGUgc3RydWN0LgorCSAqIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIFBDSSwKKwkgKiBidXQgZG8gaXQgaGVyZSBqdXN0IGluIGNhc2UgaXQncyB1c2VkCisJICogZm9yIG90aGVyIGJ1c2VzIGluIHRoZSBmdXR1cmUKKwkgKi8KKwlscCA9IHdsX3ByaXYoZGV2KTsKIAorCS8qIENoZWNrIE1UVSAqLworCWlmIChkZXYtPm10dSA+IE1UVV9NQVgpIHsKKwkJREJHX1dBUk5JTkcoRGJnSW5mbywgIiVzOiBNVFUgc2V0IHRvbyBoaWdoLCBsaW1pdGluZyB0byAlZC5cbiIsCisJCQkgICAgZGV2LT5uYW1lLCBNVFVfTUFYKTsKKwkJZGV2LT5tdHUgPSBNVFVfTUFYOworCX0KIAotICAgIC8qIENoZWNrIE1UVSAqLwotICAgIGlmKCBkZXYtPm10dSA+IE1UVV9NQVggKQotICAgIHsKLQkgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlczogTVRVIHNldCB0b28gaGlnaCwgbGltaXRpbmcgdG8gJWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBNVFVfTUFYICk7Ci0gICAgCWRldi0+bXR1ID0gTVRVX01BWDsKLSAgICB9CisJLyogU2V0dXAgdGhlIGZ1bmN0aW9uIHRhYmxlIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogCi0gICAgLyogU2V0dXAgdGhlIGZ1bmN0aW9uIHRhYmxlIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsX2l3X2hhbmRsZXJfZGVmOworCWxwLT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJmxwLT5zcHlfZGF0YTsKKwlkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CiAKLSAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZ3bF9pd19oYW5kbGVyX2RlZjsKLSAgICBscC0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZscC0+c3B5X2RhdGE7Ci0gICAgZGV2LT53aXJlbGVzc19kYXRhID0gJmxwLT53aXJlbGVzc19kYXRhOworCWRldi0+bmV0ZGV2X29wcyA9ICZ3bF9uZXRkZXZfb3BzOwogCi0gICAgZGV2LT5uZXRkZXZfb3BzID0gJndsX25ldGRldl9vcHM7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKLSAgICBkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7CisJZGV2LT5ldGh0b29sX29wcyA9ICZ3bF9ldGh0b29sX29wczsKIAotICAgIGRldi0+ZXRodG9vbF9vcHMJICAgID0gJndsX2V0aHRvb2xfb3BzOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAotICAgIG5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCS8qIEFsbG9jYXRlIHZpcnR1YWwgZGV2aWNlcyBmb3IgV0RTIHN1cHBvcnQgaWYgbmVlZGVkICovCisJV0xfV0RTX0RFVklDRV9BTExPQyhscCk7CiAKLSAgICAvKiBBbGxvY2F0ZSB2aXJ0dWFsIGRldmljZXMgZm9yIFdEUyBzdXBwb3J0IGlmIG5lZWRlZCAqLwotICAgIFdMX1dEU19ERVZJQ0VfQUxMT0MoIGxwICk7CisJcmV0dXJuIGRldjsKK30JCQkJLyogd2xfZGV2aWNlX2FsbG9jICovCiAKLSAgICByZXR1cm4gZGV2OwotfSAvLyB3bF9kZXZpY2VfYWxsb2MKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjA2LDE1ICsxMjEzLDE0IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3ZvaWQgd2xfZGV2aWNlX2RlYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLS8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworCS8qIERlYWxsb2MgdGhlIFdEUyBwb3J0cyAqLworCVdMX1dEU19ERVZJQ0VfREVBTExPQyhscCk7CiAKLSAgICAvKiBEZWFsbG9jIHRoZSBXRFMgcG9ydHMgKi8KLSAgICBXTF9XRFNfREVWSUNFX0RFQUxMT0MoIGxwICk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30JCQkJLyogd2xfZGV2aWNlX2RlYWxsb2MgKi8KIAotICAgIGZyZWVfbmV0ZGV2KCBkZXYgKTsKLX0gLy8gd2xfZGV2aWNlX2RlYWxsb2MKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjM1LDE1ICsxMjQxLDE2IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDAoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAwXG4iICk7CisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDBcbiIpOwogCi0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMCApOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfMCk7CiAjaWZkZWYgRU5BQkxFX0RNQQotICAgIHJldHVybiB3bF90eF9kbWEoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8wICk7CisJcmV0dXJuIHdsX3R4X2RtYShza2IsIGRldiwgSENGX1BPUlRfMCk7CiAjZW5kaWYKLX0gLy8gd2xfdHhfcG9ydDAKK30JCQkJLyogd2xfdHhfcG9ydDBpICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKICNpZmRlZiBVU0VfV0RTCkBAIC0xMjY2LDExICsxMjczLDEyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDEoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQxKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAxXG4iICk7Ci0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMSApOwotfSAvLyB3bF90eF9wb3J0MQorCURCR19UWChEYmdJbmZvLCAiVHggb24gUG9ydCAxXG4iKTsKKwlyZXR1cm4gd2xfdHgoc2tiLCBkZXYsIEhDRl9QT1JUXzEpOworfQkJCQkvKiB3bF90eF9wb3J0MSAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTI5MSwxMSArMTI5OSwxMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3R4X3BvcnQyKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF90eF9wb3J0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMlxuIiApOwotICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzIgKTsKLX0gLy8gd2xfdHhfcG9ydDIKKwlEQkdfVFgoRGJnSW5mbywgIlR4IG9uIFBvcnQgMlxuIik7CisJcmV0dXJuIHdsX3R4KHNrYiwgZGV2LCBIQ0ZfUE9SVF8yKTsKK30JCQkJLyogd2xfdHhfcG9ydDIgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzMTYsMTEgKzEzMjUsMTIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eF9wb3J0Myggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfdHhfcG9ydDMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDNcbiIgKTsKLSAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8zICk7Ci19IC8vIHdsX3R4X3BvcnQzCisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDNcbiIpOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfMyk7Cit9CQkJCS8qIHdsX3R4X3BvcnQzICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzQxLDExICsxMzUxLDEyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfdHhfcG9ydDQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoraW50IHdsX3R4X3BvcnQ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA0XG4iICk7Ci0gICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNCApOwotfSAvLyB3bF90eF9wb3J0NAorCURCR19UWChEYmdJbmZvLCAiVHggb24gUG9ydCA0XG4iKTsKKwlyZXR1cm4gd2xfdHgoc2tiLCBkZXYsIEhDRl9QT1JUXzQpOworfQkJCQkvKiB3bF90eF9wb3J0NCAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTM2NiwxMSArMTM3NywxMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3R4X3BvcnQ1KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF90eF9wb3J0NShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNVxuIiApOwotICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzUgKTsKLX0gLy8gd2xfdHhfcG9ydDUKKwlEQkdfVFgoRGJnSW5mbywgIlR4IG9uIFBvcnQgNVxuIik7CisJcmV0dXJuIHdsX3R4KHNrYiwgZGV2LCBIQ0ZfUE9SVF81KTsKK30JCQkJLyogd2xfdHhfcG9ydDUgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzOTEsMTEgKzE0MDMsMTIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB3bF90eF9wb3J0Niggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitpbnQgd2xfdHhfcG9ydDYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDZcbiIgKTsKLSAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF82ICk7Ci19IC8vIHdsX3R4X3BvcnQ2CisJREJHX1RYKERiZ0luZm8sICJUeCBvbiBQb3J0IDZcbiIpOworCXJldHVybiB3bF90eChza2IsIGRldiwgSENGX1BPUlRfNik7Cit9CQkJCS8qIHdsX3R4X3BvcnQ2ICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDE3LDUwICsxNDMwLDUyIEBACiAgKiAgICAgIHN0cnVjdHMgaW4gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfd2RzX2RldmljZV9hbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX2RldmljZV9hbGxvYyhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7Ci0gICAgaW50IGNvdW50OworCWludCBjb3VudDsKIAotICAgIC8qIFdEUyBzdXBwb3J0IHJlcXVpcmVzIGFkZGl0aW9uYWwgbmV0X2RldmljZSBzdHJ1Y3RzIHRvIGJlIGFsbG9jYXRlZCwKLSAgICAgICBzbyB0aGF0IHVzZXIgc3BhY2UgYXBwcyBjYW4gdXNlIHRoZXNlIHZpcnR1YWwgZGV2aWNlcyB0byBzcGVjaWZ5IHRoZQotICAgICAgIHBvcnQgb24gd2hpY2ggdG8gVHgvUnggKi8KLSAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CisJLyogV0RTIHN1cHBvcnQgcmVxdWlyZXMgYWRkaXRpb25hbCBuZXRfZGV2aWNlIHN0cnVjdHMgdG8gYmUgYWxsb2NhdGVkLAorCSAgIHNvIHRoYXQgdXNlciBzcGFjZSBhcHBzIGNhbiB1c2UgdGhlc2UgdmlydHVhbCBkZXZpY2VzIHRvIHNwZWNpZnkgdGhlCisJICAgcG9ydCBvbiB3aGljaCB0byBUeC9SeCAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOwogCi0JZGV2X3dkcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXZfd2RzKQotCQlyZXR1cm47CisJCWRldl93ZHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWRldl93ZHMpCisJCQlyZXR1cm47CiAKLSAgICAgICAgZXRoZXJfc2V0dXAoIGRldl93ZHMgKTsKKwkJZXRoZXJfc2V0dXAoZGV2X3dkcyk7CiAKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBkZXZfd2RzOworCQlscC0+d2RzX3BvcnRbY291bnRdLmRldiA9IGRldl93ZHM7CiAKLSAgICAgICAgLyogUmUtdXNlIHdsX2luaXQgZm9yIGFsbCB0aGUgZGV2aWNlcywgYXMgaXQgY3VycmVudGx5IGRvZXMgbm90aGluZywgYnV0Ci0gICAgICAgICAgIGlzIHJlcXVpcmVkLiBSZS11c2UgdGhlIHN0YXRzL3R4X3RpbWVvdXQgaGFuZGxlciBmb3IgYWxsIGFzIHdlbGw7IHRoZQotICAgICAgICAgICBXRFMgcG9ydCB3aGljaCBpcyByZXF1ZXN0aW5nIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGRldGVybWluZWQgYnkKLSAgICAgICAgICAgdGhlIG5ldF9kZXZpY2UgcG9pbnRlci4gU2V0IHRoZSBwcml2YXRlIG1lbWJlciBvZiBhbGwgZGV2aWNlcyB0byBwb2ludAotICAgICAgICAgICB0byB0aGUgc2FtZSBuZXRfZGV2aWNlIHN0cnVjdDsgdGhhdCB3YXksIGFsbCBpbmZvcm1hdGlvbiBnZXRzCi0gICAgICAgICAgIGZ1bm5lbGxlZCB0aHJvdWdoIHRoZSBvbmUgInJlYWwiIG5ldF9kZXZpY2UuIE5hbWUgdGhlIFdEUyBwb3J0cwotICAgICAgICAgICAid2RzPG4+IiAqLwotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+aW5pdCAgICAgICAgICAgPSAmd2xfaW5pdDsKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmdldF9zdGF0cyAgICAgID0gJndsX3N0YXRzOwotICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+dHhfdGltZW91dCAgICAgPSAmd2xfdHhfdGltZW91dDsKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLSAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnByaXYgICAgICAgICAgID0gbHA7CisJCS8qIFJlLXVzZSB3bF9pbml0IGZvciBhbGwgdGhlIGRldmljZXMsIGFzIGl0IGN1cnJlbnRseSBkb2VzIG5vdGhpbmcsIGJ1dAorCQkgKiBpcyByZXF1aXJlZC4gUmUtdXNlIHRoZSBzdGF0cy90eF90aW1lb3V0IGhhbmRsZXIgZm9yIGFsbCBhcyB3ZWxsOyB0aGUKKwkJICogV0RTIHBvcnQgd2hpY2ggaXMgcmVxdWVzdGluZyB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBkZXRlcm1pbmVkIGJ5CisJCSAqIHRoZSBuZXRfZGV2aWNlIHBvaW50ZXIuIFNldCB0aGUgcHJpdmF0ZSBtZW1iZXIgb2YgYWxsIGRldmljZXMgdG8gcG9pbnQKKwkJICogdG8gdGhlIHNhbWUgbmV0X2RldmljZSBzdHJ1Y3Q7IHRoYXQgd2F5LCBhbGwgaW5mb3JtYXRpb24gZ2V0cworCQkgKiBmdW5uZWxsZWQgdGhyb3VnaCB0aGUgb25lICJyZWFsIiBuZXRfZGV2aWNlLiBOYW1lIHRoZSBXRFMgcG9ydHMKKwkJICogIndkczxuPiIKKwkJICogKi8KKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmluaXQgPSAmd2xfaW5pdDsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmdldF9zdGF0cyA9ICZ3bF9zdGF0czsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnR4X3RpbWVvdXQgPSAmd2xfdHhfdGltZW91dDsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwkJbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnByaXYgPSBscDsKIAotICAgICAgICBzcHJpbnRmKCBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+bmFtZSwgIndkcyVkIiwgY291bnQgKTsKLSAgICB9CisJCXNwcmludGYobHAtPndkc19wb3J0W2NvdW50XS5kZXYtPm5hbWUsICJ3ZHMlZCIsIGNvdW50KTsKKwl9CiAKLSAgICAvKiBSZWdpc3RlciB0aGUgVHggaGFuZGxlcnMgKi8KLSAgICBscC0+d2RzX3BvcnRbMF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDE7Ci0gICAgbHAtPndkc19wb3J0WzFdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQyOwotICAgIGxwLT53ZHNfcG9ydFsyXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MzsKLSAgICBscC0+d2RzX3BvcnRbM10uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDQ7Ci0gICAgbHAtPndkc19wb3J0WzRdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ1OwotICAgIGxwLT53ZHNfcG9ydFs1XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NjsKKwkvKiBSZWdpc3RlciB0aGUgVHggaGFuZGxlcnMgKi8KKwlscC0+d2RzX3BvcnRbMF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDE7CisJbHAtPndkc19wb3J0WzFdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQyOworCWxwLT53ZHNfcG9ydFsyXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MzsKKwlscC0+d2RzX3BvcnRbM10uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDQ7CisJbHAtPndkc19wb3J0WzRdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ1OworCWxwLT53ZHNfcG9ydFs1XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NjsKIAotICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwotfSAvLyB3bF93ZHNfZGV2aWNlX2FsbG9jCisJV0xfV0RTX05FVElGX1NUT1BfUVVFVUUobHApOworfQkJCQkvKiB3bF93ZHNfZGV2aWNlX2FsbG9jICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDgwLDI2ICsxNDk1LDI3IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19kZXZpY2VfZGVhbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX2RldmljZV9kZWFsbG9jKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogCi0gICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLSAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOwogCi0gICAgICAgIGRldl93ZHMgPSBscC0+d2RzX3BvcnRbY291bnRdLmRldjsKKwkJZGV2X3dkcyA9IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2OwogCi0gICAgICAgIGlmKCBkZXZfd2RzICE9IE5VTEwgKSB7Ci0gICAgICAgICAgICBpZiggZGV2X3dkcy0+ZmxhZ3MgJiBJRkZfVVAgKSB7Ci0gICAgICAgICAgICAgICAgZGV2X2Nsb3NlKCBkZXZfd2RzICk7Ci0gICAgICAgICAgICAgICAgZGV2X3dkcy0+ZmxhZ3MgJj0gfiggSUZGX1VQIHwgSUZGX1JVTk5JTkcgKTsKLSAgICAgICAgICAgIH0KKwkJaWYgKGRldl93ZHMgIT0gTlVMTCkgeworCQkJaWYgKGRldl93ZHMtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJZGV2X2Nsb3NlKGRldl93ZHMpOworCQkJCWRldl93ZHMtPmZsYWdzICY9IH4oSUZGX1VQIHwgSUZGX1JVTk5JTkcpOworCQkJfQogCi0gICAgICAgICAgICBmcmVlX25ldGRldihkZXZfd2RzKTsKLSAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLX0gLy8gd2xfd2RzX2RldmljZV9kZWFsbG9jCisJCQlmcmVlX25ldGRldihkZXZfd2RzKTsKKwkJCWxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gTlVMTDsKKwkJfQorCX0KK30JCQkJLyogd2xfd2RzX2RldmljZV9kZWFsbG9jICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTIwLDIxICsxNTM2LDIyIEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIGlmKCBscCAhPSBOVUxMICkgewotICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7Ci0gICAgICAgICAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7Ci0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19IC8vIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZQorCWlmIChscCAhPSBOVUxMKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJCWlmIChscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKwkJCSAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFKSB7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUobHAtPndkc19wb3J0W2NvdW50XS5kZXYpOworCQkJCWxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOworCQkJfQorCQl9CisJfQorfQkJCQkvKiB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUgKi8KKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1NTUsMjEgKzE1NzIsMjIgQEAKICAqICAgICAgTi9BCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit2b2lkIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKHN0cnVjdCB3bF9wcml2YXRlICpscCkKIHsKLSAgICBpbnQgY291bnQ7CisJaW50IGNvdW50OwogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotICAgIGlmKCBscCAhPSBOVUxMICkgewotICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewotICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gLy8gd2xfd2RzX25ldGlmX3N0b3BfcXVldWUKKwlpZiAobHAgIT0gTlVMTCkgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrKSB7CisJCQlpZiAobHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCisJCQkgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFKSB7CisJCQkJbmV0aWZfc3RvcF9xdWV1ZShscC0+d2RzX3BvcnRbY291bnRdLmRldik7CisJCQkJbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOworCQkJfQorCQl9CisJfQorfQkJCQkvKiB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU5MCwyMSArMTYwOCwyMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3ZvaWQgd2xfd2RzX25ldGlmX3dha2VfcXVldWUoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQogewotICAgIGludCBjb3VudDsKKwlpbnQgY291bnQ7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgaWYoIGxwICE9IE5VTEwgKSB7Ci0gICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7Ci0gICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCi0gICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKLSAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOwotICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSAvLyB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZQorCWlmIChscCAhPSBOVUxMKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKKwkJCWlmIChscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKwkJCSAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFKSB7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShscC0+d2RzX3BvcnRbY291bnRdLmRldik7CisJCQkJbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisJCQl9CisJCX0KKwl9Cit9CQkJCS8qIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjI1LDE5ICsxNjQ0LDE5IEBACiAgKiAgICAgIE4vQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQordm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbihzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7Ci0gICAgaW50IGNvdW50OworCWludCBjb3VudDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBpZiggbHAgIT0gTlVMTCApIHsKLSAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKLSAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgKSB7Ci0gICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vbiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gLy8gd2xfd2RzX25ldGlmX2NhcnJpZXJfb24KKwlpZiAobHAgIT0gTlVMTCkgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrKSB7CisJCQlpZiAobHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkKQorCQkJCW5ldGlmX2NhcnJpZXJfb24obHAtPndkc19wb3J0W2NvdW50XS5kZXYpOworCQl9CisJfQorfQkJCQkvKiB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbiAqLworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTY1OCwyMSArMTY3NywyMiBAQAogICogICAgICBOL0EKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZihzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7CiAJaW50IGNvdW50OwogCi0JaWYobHAgIT0gTlVMTCkgewotCQlmb3IoY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KyspIHsKLQkJCWlmKGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCkKKwlpZiAobHAgIT0gTlVMTCkgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrKSB7CisJCQlpZiAobHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkKQogCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2KTsKIAkJfQogCX0KIAotfSAvLyB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYKK30JCQkJLyogd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLSNlbmRpZiAgLyogVVNFX1dEUyAqLworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAogI2lmZGVmIEVOQUJMRV9ETUEKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjk1LDcwICsxNzE1LDcxIEBACiAgKiAgICAgIDEgb24gZXJyb3IKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHdsX3NlbmRfZG1hKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb3J0ICkKK2ludCB3bF9zZW5kX2RtYShzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb3J0KQogewotICAgIGludCAgICAgICAgIGxlbjsKLSAgICBERVNDX1NUUkNUICpkZXNjID0gTlVMTDsKLSAgICBERVNDX1NUUkNUICpkZXNjX25leHQgPSBOVUxMOworCWludCBsZW47CisJREVTQ19TVFJDVCAqZGVzYyA9IE5VTEw7CisJREVTQ19TVFJDVCAqZGVzY19uZXh0ID0gTlVMTDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBpZiggbHAgPT0gTlVMTCApIHsKLSAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKGxwID09IE5VTEwpIHsKKwkJREJHX0VSUk9SKERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApIHsKLSAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKGxwLT5kZXYgPT0gTlVMTCkgeworCQlEQkdfRVJST1IoRGJnSW5mbywgIm5ldF9kZXZpY2Ugc3RydWN0IGluIHdsX3ByaXZhdGUgaXMgTlVMTFxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CiAKLSAgICAvKiBBR0FJTiwgQUxMIFRIRSBRVUVVRUlORyBET05FIEhFUkUgSU4gSS9PIE1PREUgSVMgTk9UIFBFUkZPUk1FRCAqLworCS8qIEFHQUlOLCBBTEwgVEhFIFFVRVVFSU5HIERPTkUgSEVSRSBJTiBJL08gTU9ERSBJUyBOT1QgUEVSRk9STUVEICovCiAKLSAgICBpZiggc2tiID09IE5VTEwgKSB7Ci0gICAgICAgIERCR19XQVJOSU5HIChEYmdJbmZvLCAiTm90aGluZyB0byBzZW5kLlxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCURCR19XQVJOSU5HKERiZ0luZm8sICJOb3RoaW5nIHRvIHNlbmQuXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIAotICAgIGxlbiA9IHNrYi0+bGVuOworCWxlbiA9IHNrYi0+bGVuOwogCi0gICAgLyogR2V0IGEgZnJlZSBkZXNjcmlwdG9yICovCi0gICAgZGVzYyA9IHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldCggbHAgKTsKKwkvKiBHZXQgYSBmcmVlIGRlc2NyaXB0b3IgKi8KKwlkZXNjID0gd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KGxwKTsKIAotICAgIGlmKCBkZXNjID09IE5VTEwgKSB7Ci0gICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKLSAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT5kZXYgKTsKLSAgICAgICAgICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwotICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CisJaWYgKGRlc2MgPT0gTlVMTCkgeworCQlpZiAobHAtPm5ldGlmX3F1ZXVlX29uID09IFRSVUUpIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUobHAtPmRldik7CisJCQlXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRShscCk7CisJCQlscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKIAotICAgICAgICAgICAgZGV2X2tmcmVlX3NrYiggc2tiICk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQogCi0gICAgU0VUX0JVRl9DTlQoIGRlc2MsIC8qSENGX0RNQV9GRF9DTlQqL0hGU19BRERSX0RFU1QgKTsKLSAgICBTRVRfQlVGX1NJWkUoIGRlc2MsIEhDRl9ETUFfVFhfQlVGMV9TSVpFICk7CisJU0VUX0JVRl9DTlQoZGVzYywgLypIQ0ZfRE1BX0ZEX0NOVCAqLyBIRlNfQUREUl9ERVNUKTsKKwlTRVRfQlVGX1NJWkUoZGVzYywgSENGX0RNQV9UWF9CVUYxX1NJWkUpOwogCi0gICAgZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CisJZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CiAKLSAgICBpZiggZGVzY19uZXh0LT5idWZfYWRkciA9PSBOVUxMICkgewotICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJETUEgZGVzY3JpcHRvciBidWZfYWRkciBpcyBOVUxMXG4iICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKGRlc2NfbmV4dC0+YnVmX2FkZHIgPT0gTlVMTCkgeworCQlEQkdfRVJST1IoRGJnSW5mbywgIkRNQSBkZXNjcmlwdG9yIGJ1Zl9hZGRyIGlzIE5VTExcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgLyogQ29weSB0aGUgcGF5bG9hZCBpbnRvIHRoZSBETUEgcGFja2V0ICovCi0gICAgbWVtY3B5KCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIGxlbiApOworCS8qIENvcHkgdGhlIHBheWxvYWQgaW50byB0aGUgRE1BIHBhY2tldCAqLworCW1lbWNweShkZXNjX25leHQtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIGxlbik7CiAKLSAgICBTRVRfQlVGX0NOVCggZGVzY19uZXh0LCBsZW4gKTsKLSAgICBTRVRfQlVGX1NJWkUoIGRlc2NfbmV4dCwgSENGX01BWF9QQUNLRVRfU0laRSApOworCVNFVF9CVUZfQ05UKGRlc2NfbmV4dCwgbGVuKTsKKwlTRVRfQlVGX1NJWkUoZGVzY19uZXh0LCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFKTsKIAotICAgIGhjZl9kbWFfdHhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MsIDAgKTsKKwloY2ZfZG1hX3R4X3B1dCgmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKTsKIAotICAgIC8qIEZyZWUgdGhlIHNrYiBhbmQgcGVyZm9ybSBxdWV1ZSBjbGVhbnVwLCBhcyB0aGUgYnVmZmVyIHdhcwotICAgICAgICAgICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCi0gICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CisJLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCisJICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJZGV2X2tmcmVlX3NrYihza2IpOwogCi0gICAgcmV0dXJuIFRSVUU7Ci19IC8vIHdsX3NlbmRfZG1hCisJcmV0dXJuIFRSVUU7Cit9CQkJCS8qIHdsX3NlbmRfZG1hICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNzc5LDE0NyArMTgwMCwxNTIgQEAKICAqICAgICAgMSBvbiBlcnJvcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgd2xfcnhfZG1hKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK2ludCB3bF9yeF9kbWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcG9ydDsKLSAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICAgcGt0bGVuOwotICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgICBoZnNfc3RhdDsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IE5VTEw7Ci0gICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2MsICpkZXNjX25leHQ7Ci0gICAgLy9DRkdfTUJfSU5GT19SQU5HRTJfU1RSQ1QgeDsKKwlpbnQgcG9ydDsKKwloY2ZfMTYgcGt0bGVuOworCWhjZl8xNiBoZnNfc3RhdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IE5VTEw7CisJREVTQ19TVFJDVCAqZGVzYywgKmRlc2NfbmV4dDsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogCi0gICAgaWYoKCggbHAgPSBkZXYtPnByaXYgKSAhPSBOVUxMICkgJiYKLQkhKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCWxwID0gZGV2LT5wcml2OworCWlmICgobHAgIT0gTlVMTCkgJiYgIShscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kpKSB7CiAKICNpZmRlZiBVU0VfUlRTCi0gICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7Ci0gICAgICAgICAgICBEQkdfUFJJTlQoICJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIgKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgICB9Ci0jZW5kaWYgIC8qIFVTRV9SVFMgKi8KKwkJaWYgKGxwLT51c2VSVFMgPT0gMSkgeworCQkJREJHX1BSSU5UKCJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKyNlbmRpZiAvKiBVU0VfUlRTICovCiAKLSAgICAgICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCi0gICAgICAgIC8vewotICAgICAgICAgICAgZGVzYyA9IGhjZl9kbWFfcnhfZ2V0KCAmKCBscC0+aGNmQ3R4ICkpOworCQkvKgorCQkgKmlmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKKwkJICp7CisJCSAqLworCQlkZXNjID0gaGNmX2RtYV9yeF9nZXQoJihscC0+aGNmQ3R4KSk7CiAKLSAgICAgICAgICAgIGlmKCBkZXNjICE9IE5VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENoZWNrIGFuZCBzZWUgaWYgd2UgcmN2ZC4gYSBXTVAgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIGlmKCgoICooaGNmXzggKikmZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVRdICkgJgotICAgICAgICAgICAgICAgICAgICAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICkpID09IEhGU19TVEFUX1dNUF9NU0cgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiR290IGEgV01QIGZyYW1lXG4iICk7CisJCWlmIChkZXNjICE9IE5VTEwpIHsKKwkJCS8qIENoZWNrIGFuZCBzZWUgaWYgd2UgcmN2ZC4gYSBXTVAgZnJhbWUgKi8KKwkJCS8qCisJCQkgICBpZigoKCAqKGhjZl84ICopJmRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFUXSApICYKKwkJCSAgICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKSkgPT0gSEZTX1NUQVRfV01QX01TRyApCisJCQkgICB7CisJCQkgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJHb3QgYSBXTVAgZnJhbWVcbiIgKTsKIAotICAgICAgICAgICAgICAgICAgICB4LmxlbiA9IHNpemVvZiggQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApOwotCQkJCSAgICB4LnR5cCA9IENGR19NQl9JTkZPOwotCQkJCSAgICB4LmJhc2VfdHlwID0gQ0ZHX1dNUDsKLQkJCQkgICAgeC5mcmFnX2NudCA9IDI7Ci0JCQkJICAgIHguZnJhZ19idWZbMF0uZnJhZ19sZW4gID0gR0VUX0JVRl9DTlQoIGRlc2NwICkgLyBzaXplb2YoIGhjZl8xNiApOwotCQkJCSAgICB4LmZyYWdfYnVmWzBdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+YnVmX2FkZHIgOwotCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfbGVuICA9ICggR0VUX0JVRl9DTlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICsgMSApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKLQkJCQkgICAgeC5mcmFnX2J1ZlsxXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkciA7CisJCQkgICB4LmxlbiA9IHNpemVvZiggQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApOworCQkJICAgeC50eXAgPSBDRkdfTUJfSU5GTzsKKwkJCSAgIHguYmFzZV90eXAgPSBDRkdfV01QOworCQkJICAgeC5mcmFnX2NudCA9IDI7CisJCQkgICB4LmZyYWdfYnVmWzBdLmZyYWdfbGVuICA9IEdFVF9CVUZfQ05UKCBkZXNjcCApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKKwkJCSAgIHguZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5idWZfYWRkciA7CisJCQkgICB4LmZyYWdfYnVmWzFdLmZyYWdfbGVuICA9ICggR0VUX0JVRl9DTlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICsgMSApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKKwkJCSAgIHguZnJhZ19idWZbMV0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHIgOwogCi0gICAgICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmeCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqLworCQkJICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSZ4ICk7CisJCQkgICB9CisJCQkgKi8KIAotICAgICAgICAgICAgICAgIGRlc2NfbmV4dCA9IGRlc2MtPm5leHRfZGVzY19hZGRyOworCQkJZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CiAKLSAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpc24ndCBlbXB0eSAqLwotICAgICAgICAgICAgICAgIGlmKCBHRVRfQlVGX0NOVCggZGVzYyApID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiQnVmZmVyIGlzIGVtcHR5IVxuIiApOworCQkJLyogTWFrZSBzdXJlIHRoZSBidWZmZXIgaXNuJ3QgZW1wdHkgKi8KKwkJCWlmIChHRVRfQlVGX0NOVChkZXNjKSA9PSAwKSB7CisJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywgIkJ1ZmZlciBpcyBlbXB0eSFcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCi0gICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgICAgICAgICAgfQorCQkJCS8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCisJCQkJaGNmX2RtYV9yeF9wdXQoJihscC0+aGNmQ3R4KSwgZGVzYyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CiAKLSAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgaGZzX3N0YXQgPSAoaGNmXzE2KSggZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVQvMl0gKTsKKwkJCS8qIFJlYWQgdGhlIEhGU19TVEFUIHJlZ2lzdGVyIGZyb20gdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KKwkJCWhmc19zdGF0ID0gKGhjZl8xNikgKGRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFUIC8gMl0pOwogCi0gICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KLSAgICAgICAgICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOworCQkJLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KKwkJCWlmICgoaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIpICE9IEhDRl9TVUNDRVNTKSB7CisJCQkJREJHX1dBUk5JTkcoRGJnSW5mbywKKwkJCQkJICAgICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAorCQkJCQkgICAgZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVQgLyAyXSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KLSAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgICAgICAgICAgICB9CisJCQkJLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KKwkJCQloY2ZfZG1hX3J4X3B1dCgmKGxwLT5oY2ZDdHgpLCBkZXNjKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KIAotICAgICAgICAgICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCi0gICAgICAgICAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OwotICAgICAgICAgICAgICAgIERCR19SWCggRGJnSW5mbywgIlJ4IGZyYW1lIGZvciBwb3J0ICVkXG4iLCBwb3J0ICk7CisJCQkvKiBEZXRlcm1pbmUgd2hhdCBwb3J0IHRoaXMgcGFja2V0IGlzIGZvciAqLworCQkJcG9ydCA9IChoZnNfc3RhdCA+PiA4KSAmIDB4MDAwNzsKKwkJCURCR19SWChEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQpOwogCi0gICAgICAgICAgICAgICAgcGt0bGVuID0gR0VUX0JVRl9DTlQoZGVzY19uZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocGt0bGVuICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChza2IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwb3J0ICkgeworCQkJcGt0bGVuID0gR0VUX0JVRl9DTlQoZGVzY19uZXh0KTsKKwkJCWlmIChwa3RsZW4gIT0gMCkgeworCQkJCXNrYiA9IEFMTE9DX1NLQihwa3RsZW4pOworCQkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCQlzd2l0Y2ggKHBvcnQpIHsKICNpZmRlZiBVU0VfV0RTCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgIC8qIFVTRV9XRFMgKi8KKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDI6CisJCQkJCWNhc2UgMzoKKwkJCQkJY2FzZSA0OgorCQkJCQljYXNlIDU6CisJCQkJCWNhc2UgNjoKKwkJCQkJCXNrYi0+ZGV2ID0KKwkJCQkJCSAgICBscC0+d2RzX3BvcnRbcG9ydCAtIDFdLmRldjsKKwkJCQkJCWJyZWFrOworI2VuZGlmIC8qIFVTRV9XRFMgKi8KIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJY2FzZSAwOgorCQkJCQlkZWZhdWx0OgorCQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCQlicmVhazsKKwkJCQkJfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUEFDS0VUX0RNQSggc2tiLT5kZXYsIHNrYiwgcGt0bGVuICk7CisJCQkJCUdFVF9QQUNLRVRfRE1BKHNrYi0+ZGV2LCBza2IsIHBrdGxlbik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjICk7CisJCQkJCS8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCisJCQkJCWhjZl9kbWFfcnhfcHV0KCYobHAtPmhjZkN0eCksIGRlc2MpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9yeCggc2tiICk7CisJCQkJCW5ldGlmX3J4KHNrYik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlpZiAocG9ydCA9PSAwKSB7CisJCQkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKwkJCQkJfQogI2lmZGVmIFVTRV9XRFMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmICAvKiBVU0VfV0RTICovCisJCQkJCWVsc2UgeworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfcGFja2V0cysrOworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfYnl0ZXMgKz0gcGt0bGVuOworCQkJCQl9CisjZW5kaWYgLyogVVNFX1dEUyAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJREJHX0VSUk9SKERiZ0luZm8sCisJCQkJCQkgICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApCi0JICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJaWYgKHBvcnQgPT0gMCkKKwkJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAjaWZkZWYgVVNFX1dEUwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAgLyogVVNFX1dEUyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvL30KLSAgICB9CisJCQkJCWVsc2UgeworCQkJCQkJbHAtPndkc19wb3J0W3BvcnQgLQorCQkJCQkJCSAgICAgMV0uc3RhdHMuCisJCQkJCQkgICAgcnhfZHJvcHBlZCsrOworCQkJCQl9CisjZW5kaWYgLyogVVNFX1dEUyAqLworCQkJCX0KKwkJCX0KKwkJfQorCQkvKn0qLworCX0KIAotICAgIHJldHVybiAwOwotfSAvLyB3bF9yeF9kbWEKKwlyZXR1cm4gMDsKK30JCQkJLyogd2xfcnhfZG1hICovCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jZW5kaWYgIC8vIEVOQUJMRV9ETUEKKyNlbmRpZiAvKiBFTkFCTEVfRE1BICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMKaW5kZXggNGNhNmU0Mi4uNzUwMTljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYwpAQCAtMTYxLDQzICsxNjEsNiBAQAogCiAKIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJcGVyY2VudCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBERVNDUklQVElPTjoKLSAqCi0gKiAgICAgIFJldHVybiBhIHZhbHVlIGFzIGEgcGVyY2VudGFnZSBvZiBtaW4gdG8gbWF4LgotICoKLSAqICBQQVJBTUVURVJTOgotICoKLSAqICAgICAgdmFsdWUgICAtIHRoZSB2YWx1ZSBpbiBxdWVzdGlvbgotICogICAgICBtaW4gICAgIC0gdGhlIG1pbmltdW0gcmFuZ2UgdmFsdWUKLSAqICAgICAgbWF4ICAgICAtIHRoZSBtYXhpbXVtIHJhbmdlIHZhbHVlCi0gKgotICogIFJFVFVSTlM6Ci0gKgotICogICAgICB0aGUgcGVyY2VudGFnZSB2YWx1ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcGVyY2VudCggaW50IHZhbHVlLCBpbnQgbWluLCBpbnQgbWF4ICkKLXsKLSAgICAvKiBUcnVuY2F0ZSB0aGUgdmFsdWUgdG8gYmUgYmV0d2VlbiBtaW4gYW5kIG1heC4gKi8KLSAgICBpZiggdmFsdWUgPCBtaW4gKQotICAgICAgICB2YWx1ZSA9IG1pbjsKLQotICAgIGlmKCB2YWx1ZSA+IG1heCApCi0gICAgICAgIHZhbHVlID0gbWF4OwotCi0gICAgLyogUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4gKi8KLSAgICByZXR1cm4gKCgoIHZhbHVlIC0gbWluICkgKiAxMDAgKSAvICggbWF4IC0gbWluICkpOwotfSAvLyBwZXJjZW50Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJaXNfdmFsaWRfa2V5X3N0cmluZygpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jCmluZGV4IDE4N2ZjMDYuLjQ5ZWVlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMKQEAgLTMzNTQsNyArMzM1NCw3IEBACiAJICAgdGhlIGNhbGwgdG8gd2lyZWxlc3Nfc2VuZF9ldmVudCgpIG11c3QgYWxzbyBwb2ludCB0byB3aGVyZSB0aGUgRVNTSUQKIAkgICBsaXZlcyAqLwogCXdycXUuZXNzaWQubGVuZ3RoICA9IHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICk7Ci0Jd3JxdS5lc3NpZC5wb2ludGVyID0gKGNhZGRyX3QpbHAtPk5ldHdvcmtOYW1lOworCXdycXUuZXNzaWQucG9pbnRlciA9ICh2b2lkIF9fdXNlciAqKWxwLT5OZXR3b3JrTmFtZTsKIAl3cnF1LmVzc2lkLmZsYWdzICAgPSAxOwogCiAJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXRVNTSUQsICZ3cnF1LCBscC0+TmV0d29ya05hbWUgKTsKQEAgLTM0MTksNyArMzQxOSw3IEBACiAKIAkJLyogT25seSBwcm92aWRlIHRoZSBrZXkgaWYgcGVybWlzc2lvbnMgYWxsb3cgKi8KIAkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgewotCQkJd3JxdS5lbmNvZGluZy5wb2ludGVyID0gKGNhZGRyX3QpbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5OworCQkJd3JxdS5lbmNvZGluZy5wb2ludGVyID0gKHZvaWQgX191c2VyICopbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5OwogCQkJd3JxdS5lbmNvZGluZy5sZW5ndGggID0gbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuOwogCQl9IGVsc2UgewogCQkJd3JxdS5lbmNvZGluZy5mbGFncyB8PSBJV19FTkNPREVfTk9LRVk7CkBAIC0zNzc4LDcgKzM3NzgsNyBAQAogI2VuZGlmCiB9OwogCi1zdHJ1Y3QgaXdfcHJpdl9hcmdzIHdsX3ByaXZfYXJnc1tdID0geworc3RhdGljIHN0cnVjdCBpd19wcml2X2FyZ3Mgd2xfcHJpdl9hcmdzW10gPSB7CiAgICAgICAgIHtTSU9DU0lXTkVUTkFNRSwgICAgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAwLCAic25ldHdvcmtfbmFtZSIgfSwKICAgICAgICAge1NJT0NHSVdORVROQU1FLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sICAgICJnbmV0d29ya19uYW1lIiB9LAogICAgICAgICB7U0lPQ1NJV1NUQU5BTUUsICAgIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgMCwgInNzdGF0aW9uX25hbWUiIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYwppbmRleCBhN2QyNGM5Li5mNzZmOTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKQEAgLTQwMCw2ICs0MDAsOCBAQAogCW51bWJzcyA9IG1zZzEubnVtYnNzLmRhdGE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtYnNzOyBpKyspIHsKKwkJaW50IGZyZXE7CisKIAkJbWVtc2V0KCZtc2cyLCAwLCBzaXplb2YobXNnMikpOwogCQltc2cyLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzOwogCQltc2cyLmJzc2luZGV4LmRhdGEgPSBpOwpAQCAtNDE0LDkgKzQxNiwxMCBAQAogCQlpZV9idWZbMV0gPSBtc2cyLnNzaWQuZGF0YS5sZW47CiAJCWllX2xlbiA9IGllX2J1ZlsxXSArIDI7CiAJCW1lbWNweSgmaWVfYnVmWzJdLCAmKG1zZzIuc3NpZC5kYXRhLmRhdGEpLCBtc2cyLnNzaWQuZGF0YS5sZW4pOworCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KG1zZzIuZHNjaGFubmVsLmRhdGEsCisJCQkJCQkgICAgICBJRUVFODAyMTFfQkFORF8yR0haKTsKIAkJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwKLQkJCWllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwKLQkJCSAgICAgIGllZWU4MDIxMV9kc3NzX2NoYW5fdG9fZnJlcShtc2cyLmRzY2hhbm5lbC5kYXRhKSksCisJCQlpZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpLAogCQkJKGNvbnN0IHU4ICopICYobXNnMi5ic3NpZC5kYXRhLmRhdGEpLAogCQkJbXNnMi50aW1lc3RhbXAuZGF0YSwgbXNnMi5jYXBpbmZvLmRhdGEsCiAJCQltc2cyLmJlYWNvbnBlcmlvZC5kYXRhLApAQCAtNzQ2LDcgKzc0OSw3IEBACiAKIAogLyogRnVuY3Rpb25zIHRvIGNyZWF0ZS9mcmVlIHdpcGh5IGludGVyZmFjZSAqLwotc3RydWN0IHdpcGh5ICp3bGFuX2NyZWF0ZV93aXBoeShzdHJ1Y3QgZGV2aWNlICpkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBzdHJ1Y3Qgd2lwaHkgKndsYW5fY3JlYXRlX3dpcGh5KHN0cnVjdCBkZXZpY2UgKmRldiwgd2xhbmRldmljZV90ICp3bGFuZGV2KQogewogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2OwpAQCAtNzgzLDcgKzc4Niw3IEBACiB9CiAKIAotdm9pZCB3bGFuX2ZyZWVfd2lwaHkoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3N0YXRpYyB2b2lkIHdsYW5fZnJlZV93aXBoeShzdHJ1Y3Qgd2lwaHkgKndpcGh5KQogewogCXdpcGh5X3VucmVnaXN0ZXIod2lwaHkpOwogCXdpcGh5X2ZyZWUod2lwaHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCmluZGV4IDMzM2EyZjYuLjFmMmM3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKQEAgLTUzMSwxNCArNTMxLDE0IEBACiAJdTE2IHJlc2VydmVkMjsKIAogCS8qLS0gODAyLjExIEhlYWRlciBJbmZvcm1hdGlvbiAoODAyLjExIGJ5dGUgb3JkZXIpIC0tKi8KLQl1MTYgZnJhbWVfY29udHJvbDsKKwlfX2xlMTYgZnJhbWVfY29udHJvbDsKIAl1MTYgZHVyYXRpb25faWQ7CiAJdTggYWRkcmVzczFbNl07CiAJdTggYWRkcmVzczJbNl07CiAJdTggYWRkcmVzczNbNl07CiAJdTE2IHNlcXVlbmNlX2NvbnRyb2w7CiAJdTggYWRkcmVzczRbNl07Ci0JdTE2IGRhdGFfbGVuOwkJLyogaGZhMzg0eCAobGl0dGxlIGVuZGlhbikgZm9ybWF0ICovCisJX19sZTE2IGRhdGFfbGVuOwkJLyogaGZhMzg0eCAobGl0dGxlIGVuZGlhbikgZm9ybWF0ICovCiAKIAkvKi0tIDgwMi4zIEhlYWRlciBJbmZvcm1hdGlvbiAtLSovCiAJdTggZGVzdF9hZGRyWzZdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCmluZGV4IDI2MTA4MjQuLjNkZDA2NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmgKQEAgLTkxLDcgKzkxLDcgQEAKICogICAgZmFsbCBhdCB0aGUgZW5kIG9mIHRoZWlyIHJlc3BlY3RpdmUgZnJhbWVzKS4KICogNWEpIFRoZSBsZW5ndGggZmllbGQgaXMgc2V0IHRvIGluY2x1ZGUgdGhlIGxhc3Qgb2YgdGhlIGZpeGVkIGFuZCBmaXhlZAogKiAgICAgbGVuZ3RoIGZpZWxkcy4gIEl0IG1heSBoYXZlIHRvIGJlIHVwZGF0ZWQgZm9yIG9wdGlvbmFsIG9yIHZhcmlhYmxlCi0qIAlsZW5ndGggaW5mb3JtYXRpb24gZWxlbWVudHMuCisqCWxlbmd0aCBpbmZvcm1hdGlvbiBlbGVtZW50cy4KICogNikgT3B0aW9uYWwgYW5kIHZhcmlhYmxlIGxlbmd0aCBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcmUgc3BlY2lhbCBjYXNlcwogKiAgICBhbmQgbXVzdCBiZSBoYW5kbGVkIGluZGl2aWR1YWxseSBieSB0aGUgY2xpZW50IGNvZGUuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTksODIgKzIxOSw4MiBAQAogLyotLSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIHByb3RvdHlwZSBzdHJ1Y3R1cmUsIGFsbCBJRXMgc3RhcnQgd2l0aCB0aGVzZSBtZW1iZXJzICovCiAKLXR5cGVkZWYgc3RydWN0IHdsYW5faWUgeworc3RydWN0IHdsYW5faWUgewogCXU4IGVpZDsKIAl1OCBsZW47Ci19IF9fcGFja2VkIHdsYW5faWVfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gU2VydmljZSBTZXQgSWRlbnRpdHkgKFNTSUQpICAtLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX3NzaWQgeworc3RydWN0IHdsYW5faWVfc3NpZCB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1OCBzc2lkWzFdOwkJLyogbWF5IGJlIHplcm8sIHB0cnMgbWF5IG92ZXJsYXAgKi8KLX0gX19wYWNrZWQgd2xhbl9pZV9zc2lkX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIFN1cHBvcnRlZCBSYXRlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzIHsKK3N0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgewogCXU4IGVpZDsKIAl1OCBsZW47CiAJdTggcmF0ZXNbMV07CQkvKiBoYWQgYmV0dGVyIGJlIGF0IExFQVNUIG9uZSEgKi8KLX0gX19wYWNrZWQgd2xhbl9pZV9zdXBwX3JhdGVzX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIEZIIFBhcmFtZXRlciBTZXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcyB7CitzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcyB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1MTYgZHdlbGw7CiAJdTggaG9wc2V0OwogCXU4IGhvcHBhdHRlcm47CiAJdTggaG9waW5kZXg7Ci19IF9fcGFja2VkIHdsYW5faWVfZmhfcGFybXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gRFMgUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX2RzX3Bhcm1zIHsKK3N0cnVjdCB3bGFuX2llX2RzX3Bhcm1zIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXU4IGN1cnJfY2g7Ci19IF9fcGFja2VkIHdsYW5faWVfZHNfcGFybXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ0YgUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXR5cGVkZWYgc3RydWN0IHdsYW5faWVfY2ZfcGFybXMgeworc3RydWN0IHdsYW5faWVfY2ZfcGFybXMgewogCXU4IGVpZDsKIAl1OCBsZW47CiAJdTggY2ZwX2NudDsKIAl1OCBjZnBfcGVyaW9kOwogCXUxNiBjZnBfbWF4ZHVyOwogCXUxNiBjZnBfZHVycmVtYWluaW5nOwotfSBfX3BhY2tlZCB3bGFuX2llX2NmX3Bhcm1zX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIFRJTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV90aW0geworc3RydWN0IHdsYW5faWVfdGltIHsKIAl1OCBlaWQ7CiAJdTggbGVuOwogCXU4IGR0aW1fY250OwogCXU4IGR0aW1fcGVyaW9kOwogCXU4IGJpdG1hcF9jdGw7CiAJdTggdmlydF9ibVsxXTsKLX0gX19wYWNrZWQgd2xhbl9pZV90aW1fdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gSUJTUyBQYXJhbWV0ZXIgU2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2llX2lic3NfcGFybXMgeworc3RydWN0IHdsYW5faWVfaWJzc19wYXJtcyB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1MTYgYXRpbV93aW47Ci19IF9fcGFja2VkIHdsYW5faWVfaWJzc19wYXJtc190OworfSBfX3BhY2tlZDsKIAogLyotLSBDaGFsbGVuZ2UgVGV4dCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5faWVfY2hhbGxlbmdlIHsKK3N0cnVjdCB3bGFuX2llX2NoYWxsZW5nZSB7CiAJdTggZWlkOwogCXU4IGxlbjsKIAl1OCBjaGFsbGVuZ2VbMV07Ci19IF9fcGFja2VkIHdsYW5faWVfY2hhbGxlbmdlX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogIEZyYW1lIFR5cGVzICAqLwogCiAvKiBwcm90b3R5cGUgc3RydWN0dXJlLCBhbGwgbWdtdCBmcmFtZSB0eXBlcyB3aWxsIHN0YXJ0IHdpdGggdGhlc2UgbWVtYmVycyAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9tZ210IHsKK3N0cnVjdCB3bGFuX2ZyX21nbXQgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CQkvKiBET0VTIE5PVCBpbmNsdWRlIENSQyAhISEhICovCiAJdTggKmJ1ZjsKQEAgLTMwMywxMCArMzAzLDEwIEBACiAJdm9pZCAqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotfSB3bGFuX2ZyX21nbXRfdDsKK307CiAKIC8qLS0gQmVhY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2JlYWNvbiB7CitzdHJ1Y3Qgd2xhbl9mcl9iZWFjb24gewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTMxOCwxOCArMzE4LDE4IEBACiAJdTE2ICpiY25faW50OwogCXUxNiAqY2FwX2luZm87CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3NpZF90ICpzc2lkOwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOwotCXdsYW5faWVfZmhfcGFybXNfdCAqZmhfcGFybXM7Ci0Jd2xhbl9pZV9kc19wYXJtc190ICpkc19wYXJtczsKLQl3bGFuX2llX2NmX3Bhcm1zX3QgKmNmX3Bhcm1zOwotCXdsYW5faWVfaWJzc19wYXJtc190ICppYnNzX3Bhcm1zOwotCXdsYW5faWVfdGltX3QgKnRpbTsKKwlzdHJ1Y3Qgd2xhbl9pZV9zc2lkICpzc2lkOworCXN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgKnN1cHBfcmF0ZXM7CisJc3RydWN0IHdsYW5faWVfZmhfcGFybXMgKmZoX3Bhcm1zOworCXN0cnVjdCB3bGFuX2llX2RzX3Bhcm1zICpkc19wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV9jZl9wYXJtcyAqY2ZfcGFybXM7CisJc3RydWN0IHdsYW5faWVfaWJzc19wYXJtcyAqaWJzc19wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV90aW0gKnRpbTsKIAotfSB3bGFuX2ZyX2JlYWNvbl90OworfTsKIAogLyotLSBJQlNTIEFUSU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfaWJzc2F0aW0geworc3RydWN0IHdsYW5fZnJfaWJzc2F0aW0gewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTM0MiwxMCArMzQyLDEwIEBACiAKIAkvKiB0aGlzIGZyYW1lIHR5cGUgaGFzIGEgbnVsbCBib2R5ICovCiAKLX0gd2xhbl9mcl9pYnNzYXRpbV90OworfTsKIAogLyotLSBEaXNhc3NvY2lhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfZGlzYXNzb2Mgeworc3RydWN0IHdsYW5fZnJfZGlzYXNzb2MgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTM1NywxMCArMzU3LDEwIEBACiAKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKLX0gd2xhbl9mcl9kaXNhc3NvY190OworfTsKIAogLyotLSBBc3NvY2lhdGlvbiBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXNzb2NyZXEgeworc3RydWN0IHdsYW5fZnJfYXNzb2NyZXEgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTM3MSwxMyArMzcxLDEzIEBACiAJdTE2ICpjYXBfaW5mbzsKIAl1MTYgKmxpc3Rlbl9pbnQ7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3NpZF90ICpzc2lkOwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOworCXN0cnVjdCB3bGFuX2llX3NzaWQgKnNzaWQ7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKIAotfSB3bGFuX2ZyX2Fzc29jcmVxX3Q7Cit9OwogCiAvKi0tIEFzc29jaWF0aW9uIFJlc3BvbnNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3Jlc3Ageworc3RydWN0IHdsYW5fZnJfYXNzb2NyZXNwIHsKIAl1MTYgdHlwZTsKIAl1MTYgbGVuOwogCXU4ICpidWY7CkBAIC0zODksMTIgKzM4OSwxMiBAQAogCXUxNiAqc3RhdHVzOwogCXUxNiAqYWlkOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX3N1cHBfcmF0ZXNfdCAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzICpzdXBwX3JhdGVzOwogCi19IHdsYW5fZnJfYXNzb2NyZXNwX3Q7Cit9OwogCiAvKi0tIFJlYXNzb2NpYXRpb24gUmVxdWVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVxIHsKK3N0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTQwNiwxMyArNDA2LDEzIEBACiAJdTE2ICpsaXN0ZW5faW50OwogCXU4ICpjdXJyX2FwOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX3NzaWRfdCAqc3NpZDsKLQl3bGFuX2llX3N1cHBfcmF0ZXNfdCAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9zc2lkICpzc2lkOworCXN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMgKnN1cHBfcmF0ZXM7CiAKLX0gd2xhbl9mcl9yZWFzc29jcmVxX3Q7Cit9OwogCiAvKi0tIFJlYXNzb2NpYXRpb24gUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVzcCB7CitzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDI0LDEyICs0MjQsMTIgQEAKIAl1MTYgKnN0YXR1czsKIAl1MTYgKmFpZDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi0Jd2xhbl9pZV9zdXBwX3JhdGVzX3QgKnN1cHBfcmF0ZXM7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKIAotfSB3bGFuX2ZyX3JlYXNzb2NyZXNwX3Q7Cit9OwogCiAvKi0tIFByb2JlIFJlcXVlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlcSB7CitzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlcSB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDM4LDEzICs0MzgsMTMgQEAKIAl2b2lkICpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCi0Jd2xhbl9pZV9zc2lkX3QgKnNzaWQ7Ci0Jd2xhbl9pZV9zdXBwX3JhdGVzX3QgKnN1cHBfcmF0ZXM7CisJc3RydWN0IHdsYW5faWVfc3NpZCAqc3NpZDsKKwlzdHJ1Y3Qgd2xhbl9pZV9zdXBwX3JhdGVzICpzdXBwX3JhdGVzOwogCi19IHdsYW5fZnJfcHJvYmVyZXFfdDsKK307CiAKIC8qLS0gUHJvYmUgUmVzcG9uc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3Byb2JlcmVzcCB7CitzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlc3AgewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTQ1NiwxNiArNDU2LDE2IEBACiAJdTE2ICpiY25faW50OwogCXUxNiAqY2FwX2luZm87CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwotCXdsYW5faWVfc3NpZF90ICpzc2lkOwotCXdsYW5faWVfc3VwcF9yYXRlc190ICpzdXBwX3JhdGVzOwotCXdsYW5faWVfZmhfcGFybXNfdCAqZmhfcGFybXM7Ci0Jd2xhbl9pZV9kc19wYXJtc190ICpkc19wYXJtczsKLQl3bGFuX2llX2NmX3Bhcm1zX3QgKmNmX3Bhcm1zOwotCXdsYW5faWVfaWJzc19wYXJtc190ICppYnNzX3Bhcm1zOwotfSB3bGFuX2ZyX3Byb2JlcmVzcF90OworCXN0cnVjdCB3bGFuX2llX3NzaWQgKnNzaWQ7CisJc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcyAqc3VwcF9yYXRlczsKKwlzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcyAqZmhfcGFybXM7CisJc3RydWN0IHdsYW5faWVfZHNfcGFybXMgKmRzX3Bhcm1zOworCXN0cnVjdCB3bGFuX2llX2NmX3Bhcm1zICpjZl9wYXJtczsKKwlzdHJ1Y3Qgd2xhbl9pZV9pYnNzX3Bhcm1zICppYnNzX3Bhcm1zOworfTsKIAogLyotLSBBdXRoZW50aWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXV0aGVuIHsKK3N0cnVjdCB3bGFuX2ZyX2F1dGhlbiB7CiAJdTE2IHR5cGU7CiAJdTE2IGxlbjsKIAl1OCAqYnVmOwpAQCAtNDc3LDEyICs0NzcsMTIgQEAKIAl1MTYgKmF1dGhfc2VxOwogCXUxNiAqc3RhdHVzOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KLQl3bGFuX2llX2NoYWxsZW5nZV90ICpjaGFsbGVuZ2U7CisJc3RydWN0IHdsYW5faWVfY2hhbGxlbmdlICpjaGFsbGVuZ2U7CiAKLX0gd2xhbl9mcl9hdXRoZW5fdDsKK307CiAKIC8qLS0gRGVhdXRoZW5pY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5fZnJfZGVhdXRoZW4geworc3RydWN0IHdsYW5fZnJfZGVhdXRoZW4gewogCXUxNiB0eXBlOwogCXUxNiBsZW47CiAJdTggKmJ1ZjsKQEAgLTQ5NCwyNyArNDk0LDI3IEBACiAKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKLX0gd2xhbl9mcl9kZWF1dGhlbl90OworfTsKIAotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2JlYWNvbih3bGFuX2ZyX2JlYWNvbl90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9iZWFjb24od2xhbl9mcl9iZWFjb25fdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfZGlzYXNzb2Mod2xhbl9mcl9kaXNhc3NvY190ICpmKTsKLXZvaWQgd2xhbl9tZ210X2RlY29kZV9kaXNhc3NvYyh3bGFuX2ZyX2Rpc2Fzc29jX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2Fzc29jcmVxKHdsYW5fZnJfYXNzb2NyZXFfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXNzb2NyZXEod2xhbl9mcl9hc3NvY3JlcV90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9hc3NvY3Jlc3Aod2xhbl9mcl9hc3NvY3Jlc3BfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXNzb2NyZXNwKHdsYW5fZnJfYXNzb2NyZXNwX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX3JlYXNzb2NyZXEod2xhbl9mcl9yZWFzc29jcmVxX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX3JlYXNzb2NyZXEod2xhbl9mcl9yZWFzc29jcmVxX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX3JlYXNzb2NyZXNwKHdsYW5fZnJfcmVhc3NvY3Jlc3BfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfcmVhc3NvY3Jlc3Aod2xhbl9mcl9yZWFzc29jcmVzcF90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9wcm9iZXJlcSh3bGFuX2ZyX3Byb2JlcmVxX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX3Byb2JlcmVxKHdsYW5fZnJfcHJvYmVyZXFfdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9lbmNvZGVfcHJvYmVyZXNwKHdsYW5fZnJfcHJvYmVyZXNwX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZGVjb2RlX3Byb2JlcmVzcCh3bGFuX2ZyX3Byb2JlcmVzcF90ICpmKTsKLXZvaWQgd2xhbl9tZ210X2VuY29kZV9hdXRoZW4od2xhbl9mcl9hdXRoZW5fdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXV0aGVuKHdsYW5fZnJfYXV0aGVuX3QgKmYpOwotdm9pZCB3bGFuX21nbXRfZW5jb2RlX2RlYXV0aGVuKHdsYW5fZnJfZGVhdXRoZW5fdCAqZik7Ci12b2lkIHdsYW5fbWdtdF9kZWNvZGVfZGVhdXRoZW4od2xhbl9mcl9kZWF1dGhlbl90ICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9iZWFjb24oc3RydWN0IHdsYW5fZnJfYmVhY29uICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9iZWFjb24oc3RydWN0IHdsYW5fZnJfYmVhY29uICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9kaXNhc3NvYyhzdHJ1Y3Qgd2xhbl9mcl9kaXNhc3NvYyAqZik7Cit2b2lkIHdsYW5fbWdtdF9kZWNvZGVfZGlzYXNzb2Moc3RydWN0IHdsYW5fZnJfZGlzYXNzb2MgKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX2Fzc29jcmVxKHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVxICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9hc3NvY3JlcShzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3JlcSAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfYXNzb2NyZXNwKHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVzcCAqZik7Cit2b2lkIHdsYW5fbWdtdF9kZWNvZGVfYXNzb2NyZXNwKHN0cnVjdCB3bGFuX2ZyX2Fzc29jcmVzcCAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfcmVhc3NvY3JlcShzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVxICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9yZWFzc29jcmVxKHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEgKmYpOwordm9pZCB3bGFuX21nbXRfZW5jb2RlX3JlYXNzb2NyZXNwKHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9yZWFzc29jcmVzcChzdHJ1Y3Qgd2xhbl9mcl9yZWFzc29jcmVzcCAqZik7Cit2b2lkIHdsYW5fbWdtdF9lbmNvZGVfcHJvYmVyZXEoc3RydWN0IHdsYW5fZnJfcHJvYmVyZXEgKmYpOwordm9pZCB3bGFuX21nbXRfZGVjb2RlX3Byb2JlcmVxKHN0cnVjdCB3bGFuX2ZyX3Byb2JlcmVxICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9wcm9iZXJlc3Aoc3RydWN0IHdsYW5fZnJfcHJvYmVyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9wcm9iZXJlc3Aoc3RydWN0IHdsYW5fZnJfcHJvYmVyZXNwICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9hdXRoZW4oc3RydWN0IHdsYW5fZnJfYXV0aGVuICpmKTsKK3ZvaWQgd2xhbl9tZ210X2RlY29kZV9hdXRoZW4oc3RydWN0IHdsYW5fZnJfYXV0aGVuICpmKTsKK3ZvaWQgd2xhbl9tZ210X2VuY29kZV9kZWF1dGhlbihzdHJ1Y3Qgd2xhbl9mcl9kZWF1dGhlbiAqZik7Cit2b2lkIHdsYW5fbWdtdF9kZWNvZGVfZGVhdXRoZW4oc3RydWN0IHdsYW5fZnJfZGVhdXRoZW4gKmYpOwogCiAjZW5kaWYgLyogX1A4MDIxMU1HTVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwppbmRleCAwMDM5ZTA4Li5lM2FlODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwpAQCAtMjYyLDcgKzI2Miw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJbmV0ZGV2aWNlX3QgKmRldiA9IHdsYW5kZXYtPm5ldGRldjsKIAlzdHJ1Y3QgcDgwMjExX2hkcl9hMyAqaGRyOwotCXUxNiBmYzsKIAogCS8qIExldCdzIGVtcHR5IG91ciBvdXIgcXVldWUgKi8KIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ3bGFuZGV2LT5uc2RfcnhxKSkpIHsKQEAgLTI4Niw4ICsyODUsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIHsKIAkJCQloZHIgPSAoc3RydWN0IHA4MDIxMV9oZHJfYTMgKikgc2tiLT5kYXRhOwotCQkJCWZjID0gbGUxNl90b19jcHUoaGRyLT5mYyk7Ci0JCQkJaWYgKHA4MDIxMV9yeF90eXBlZHJvcCh3bGFuZGV2LCBmYykpIHsKKwkJCQlpZiAocDgwMjExX3J4X3R5cGVkcm9wKHdsYW5kZXYsIGhkci0+ZmMpKSB7CiAJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKaW5kZXggMGRmZDJhNC4uMmIwYzIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCkBAIC0yMDEsNyArMjAxLDcgQEAKICoJMAktIHN1Y2Nlc3MKICoJfjAJLSBmYWlsdXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJfZnd0cnkoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yX2Z3dHJ5KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpCiB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKaW5kZXggMjE5OWY1YS4uZjljY2YyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKQEAgLTQ1NCw5ICs0NTQsOCBAQAogCQkJICovCiAJCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc3RhcnQoaHcpOwogCQkJaWYgKHJlc3VsdCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiaGZhMzg0eF9kcnZyX3N0YXJ0KCkgZmFpbGVkLCIKLQkJCQkgICAgICAgInJlc3VsdD0lZFxuIiwgKGludClyZXN1bHQpOworCQkJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LAorCQkJCSAgICAgICAiaGZhMzg0eF9kcnZyX3N0YXJ0KCkgZmFpbGVkLHJlc3VsdD0lZFxuIiwgKGludClyZXN1bHQpOwogCQkJCXJlc3VsdCA9CiAJCQkJIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwogCQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwpAQCAtNDk5LDkgKzQ5OCw4IEBACiAJCQkgKi8KIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zdGFydChodyk7CiAJCQlpZiAocmVzdWx0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJoZmEzODR4X2RydnJfc3RhcnQoKSBmYWlsZWQsIgotCQkJCSAgICAgICAicmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CisJCQkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsCisJCQkJICAgICAgICJoZmEzODR4X2RydnJfc3RhcnQoKSBmYWlsZWQscmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CiAJCQkJcmVzdWx0ID0KIAkJCQkgIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwogCQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwpAQCAtNTEwLDkgKzUwOCw4IEBACiAKIAkJCXJlc3VsdCA9IHByaXNtMnN0YV9nZXRjYXJkaW5mbyh3bGFuZGV2KTsKIAkJCWlmIChyZXN1bHQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgInByaXNtMnN0YV9nZXRjYXJkaW5mbygpIGZhaWxlZCwiCi0JCQkJICAgICAgICJyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKKwkJCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKKwkJCQkgICAgICAgInByaXNtMnN0YV9nZXRjYXJkaW5mbygpIGZhaWxlZCxyZXN1bHQ9JWRcbiIsIChpbnQpcmVzdWx0KTsKIAkJCQlyZXN1bHQgPQogCQkJCSAgUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CiAJCQkJaGZhMzg0eF9kcnZyX3N0b3AoaHcpOwpAQCAtNTIxLDkgKzUxOCw4IEBACiAJCQl9CiAJCQlyZXN1bHQgPSBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAod2xhbmRldik7CiAJCQlpZiAocmVzdWx0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoKSBmYWlsZWQsIgotCQkJCSAgICAgICAicmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CisJCQkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsCisJCQkJICAgICAgICJwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoKSBmYWlsZWQscmVzdWx0PSVkXG4iLCAoaW50KXJlc3VsdCk7CiAJCQkJcmVzdWx0ID0KIAkJCQkgIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwogCQkJCWhmYTM4NHhfZHJ2cl9zdG9wKGh3KTsKQEAgLTYyMyw3ICs2MTksNyBAQAogCQkJCQkmaHctPmlkZW50X25pYywKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIE5JQ0lERU5USVRZXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgTklDSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTYzMyw3ICs2MjksNyBAQAogCWh3LT5pZGVudF9uaWMubWFqb3IgPSBsZTE2X3RvX2NwdShody0+aWRlbnRfbmljLm1ham9yKTsKIAlody0+aWRlbnRfbmljLm1pbm9yID0gbGUxNl90b19jcHUoaHctPmlkZW50X25pYy5taW5vcik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpZGVudDogbmljIGgvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAorCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImlkZW50OiBuaWMgaC93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJICAgICAgIGh3LT5pZGVudF9uaWMuaWQsIGh3LT5pZGVudF9uaWMubWFqb3IsCiAJICAgICAgIGh3LT5pZGVudF9uaWMubWlub3IsIGh3LT5pZGVudF9uaWMudmFyaWFudCk7CiAKQEAgLTY0Miw3ICs2MzgsNyBAQAogCQkJCQkmaHctPmlkZW50X3ByaV9mdywKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSUlERU5USVRZXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTY1Miw3ICs2NDgsNyBAQAogCWh3LT5pZGVudF9wcmlfZncubWFqb3IgPSBsZTE2X3RvX2NwdShody0+aWRlbnRfcHJpX2Z3Lm1ham9yKTsKIAlody0+aWRlbnRfcHJpX2Z3Lm1pbm9yID0gbGUxNl90b19jcHUoaHctPmlkZW50X3ByaV9mdy5taW5vcik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpZGVudDogcHJpIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAorCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImlkZW50OiBwcmkgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJICAgICAgIGh3LT5pZGVudF9wcmlfZncuaWQsIGh3LT5pZGVudF9wcmlfZncubWFqb3IsCiAJICAgICAgIGh3LT5pZGVudF9wcmlfZncubWlub3IsIGh3LT5pZGVudF9wcmlfZncudmFyaWFudCk7CiAKQEAgLTY2MSwxMiArNjU3LDEyIEBACiAJCQkJCSZody0+aWRlbnRfc3RhX2Z3LAogCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBSURFTlRJVFlcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCWlmIChody0+aWRlbnRfbmljLmlkIDwgMHg4MDAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUgorCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJGQVRBTDogQ2FyZCBpcyBub3QgYW4gSW50ZXJzaWwgUHJpc20yLzIuNS8zXG4iKTsKIAkJcmVzdWx0ID0gLTE7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjgzLDE2ICs2NzksMTYgQEAKIAlody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQgJj0gfigodTE2KSAoQklUKDE0KSB8IEJJVCgxNSkpKTsKIAogCWlmIChody0+aWRlbnRfc3RhX2Z3LmlkID09IDB4MWYpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJCSAgICAgICAiaWRlbnQ6IHN0YSBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKIAkJICAgICAgIGh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCiAJCSAgICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLCBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8KKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LAogCQkgICAgICAgImlkZW50OiAgYXAgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJCSAgICAgICBody0+aWRlbnRfc3RhX2Z3LmlkLCBody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAogCQkgICAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbnN1cHBvcnRlZCBUZXJ0aWFyeSBBUCBmaXJtZWFyZSBsb2FkZWQhXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJVbnN1cHBvcnRlZCBUZXJ0aWFyeSBBUCBmaXJtZWFyZSBsb2FkZWQhXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC03MDEsNyArNjk3LDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX21maSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgTUZJU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBNRklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzEzLDcgKzcwOSw3IEBACiAJaHctPmNhcF9zdXBfbWZpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX21maS5ib3R0b20pOwogCWh3LT5jYXBfc3VwX21maS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX3N1cF9tZmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJNRkk6U1VQOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9zdXBfbWZpLnJvbGUsIGh3LT5jYXBfc3VwX21maS5pZCwKIAkgICAgICAgaHctPmNhcF9zdXBfbWZpLnZhcmlhbnQsIGh3LT5jYXBfc3VwX21maS5ib3R0b20sCkBAIC03MjQsNyArNzIwLDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX2NmaSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgQ0ZJU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBDRklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzM2LDcgKzczMiw3IEBACiAJaHctPmNhcF9zdXBfY2ZpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX2NmaS5ib3R0b20pOwogCWh3LT5jYXBfc3VwX2NmaS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX3N1cF9jZmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJDRkk6U1VQOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9zdXBfY2ZpLnJvbGUsIGh3LT5jYXBfc3VwX2NmaS5pZCwKIAkgICAgICAgaHctPmNhcF9zdXBfY2ZpLnZhcmlhbnQsIGh3LT5jYXBfc3VwX2NmaS5ib3R0b20sCkBAIC03NDcsNyArNzQzLDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX3ByaSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzU5LDcgKzc1NSw3IEBACiAJaHctPmNhcF9zdXBfcHJpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfc3VwX3ByaS5ib3R0b20pOwogCWh3LT5jYXBfc3VwX3ByaS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX3N1cF9wcmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJQUkk6U1VQOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9zdXBfcHJpLnJvbGUsIGh3LT5jYXBfc3VwX3ByaS5pZCwKIAkgICAgICAgaHctPmNhcF9zdXBfcHJpLnZhcmlhbnQsIGh3LT5jYXBfc3VwX3ByaS5ib3R0b20sCkBAIC03NzAsNyArNzY2LDcgQEAKIAkJCQkJJmh3LT5jYXBfc3VwX3N0YSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBU1VQUkFOR0VcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzgzLDEzICs3NzksMTMgQEAKIAlody0+Y2FwX3N1cF9zdGEudG9wID0gbGUxNl90b19jcHUoaHctPmNhcF9zdXBfc3RhLnRvcCk7CiAKIAlpZiAoaHctPmNhcF9zdXBfc3RhLmlkID09IDB4MDQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJCSAgICAgICAiU1RBOlNVUDpyb2xlPTB4JTAyeDppZD0weCUwMng6dmFyPTB4JTAyeDpiL3Q9JWQvJWRcbiIsCiAJCSAgICAgICBody0+Y2FwX3N1cF9zdGEucm9sZSwgaHctPmNhcF9zdXBfc3RhLmlkLAogCQkgICAgICAgaHctPmNhcF9zdXBfc3RhLnZhcmlhbnQsIGh3LT5jYXBfc3VwX3N0YS5ib3R0b20sCiAJCSAgICAgICBody0+Y2FwX3N1cF9zdGEudG9wKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPCisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJBUDpTVVA6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCQkgICAgICAgaHctPmNhcF9zdXBfc3RhLnJvbGUsIGh3LT5jYXBfc3VwX3N0YS5pZCwKIAkJICAgICAgIGh3LT5jYXBfc3VwX3N0YS52YXJpYW50LCBody0+Y2FwX3N1cF9zdGEuYm90dG9tLApAQCAtODAxLDcgKzc5Nyw3IEBACiAJCQkJCSZody0+Y2FwX2FjdF9wcmlfY2ZpLAogCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklfQ0ZJQUNUUkFOR0VTXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJX0NGSUFDVFJBTkdFU1xuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtODEzLDcgKzgwOSw3IEBACiAJaHctPmNhcF9hY3RfcHJpX2NmaS5ib3R0b20gPSBsZTE2X3RvX2NwdShody0+Y2FwX2FjdF9wcmlfY2ZpLmJvdHRvbSk7CiAJaHctPmNhcF9hY3RfcHJpX2NmaS50b3AgPSBsZTE2X3RvX2NwdShody0+Y2FwX2FjdF9wcmlfY2ZpLnRvcCk7CiAKLQlwcmludGsoS0VSTl9JTkZPCisJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LAogCSAgICAgICAiUFJJLUNGSTpBQ1Q6cm9sZT0weCUwMng6aWQ9MHglMDJ4OnZhcj0weCUwMng6Yi90PSVkLyVkXG4iLAogCSAgICAgICBody0+Y2FwX2FjdF9wcmlfY2ZpLnJvbGUsIGh3LT5jYXBfYWN0X3ByaV9jZmkuaWQsCiAJICAgICAgIGh3LT5jYXBfYWN0X3ByaV9jZmkudmFyaWFudCwgaHctPmNhcF9hY3RfcHJpX2NmaS5ib3R0b20sCkBAIC04MjQsNyArODIwLDcgQEAKIAkJCQkJJmh3LT5jYXBfYWN0X3N0YV9jZmksCiAJCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQV9DRklBQ1RSQU5HRVNcbiIpOworCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFfQ0ZJQUNUUkFOR0VTXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC04MzYsNyArODMyLDcgQEAKIAlody0+Y2FwX2FjdF9zdGFfY2ZpLmJvdHRvbSA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfYWN0X3N0YV9jZmkuYm90dG9tKTsKIAlody0+Y2FwX2FjdF9zdGFfY2ZpLnRvcCA9IGxlMTZfdG9fY3B1KGh3LT5jYXBfYWN0X3N0YV9jZmkudG9wKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJICAgICAgICJTVEEtQ0ZJOkFDVDpyb2xlPTB4JTAyeDppZD0weCUwMng6dmFyPTB4JTAyeDpiL3Q9JWQvJWRcbiIsCiAJICAgICAgIGh3LT5jYXBfYWN0X3N0YV9jZmkucm9sZSwgaHctPmNhcF9hY3Rfc3RhX2NmaS5pZCwKIAkgICAgICAgaHctPmNhcF9hY3Rfc3RhX2NmaS52YXJpYW50LCBody0+Y2FwX2FjdF9zdGFfY2ZpLmJvdHRvbSwKQEAgLTg0Nyw3ICs4NDMsNyBAQAogCQkJCQkmaHctPmNhcF9hY3Rfc3RhX21maSwKIAkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBX01GSUFDVFJBTkdFU1xuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQV9NRklBQ1RSQU5HRVNcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTg1OSw3ICs4NTUsNyBAQAogCWh3LT5jYXBfYWN0X3N0YV9tZmkuYm90dG9tID0gbGUxNl90b19jcHUoaHctPmNhcF9hY3Rfc3RhX21maS5ib3R0b20pOwogCWh3LT5jYXBfYWN0X3N0YV9tZmkudG9wID0gbGUxNl90b19jcHUoaHctPmNhcF9hY3Rfc3RhX21maS50b3ApOwogCi0JcHJpbnRrKEtFUk5fSU5GTworCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkgICAgICAgIlNUQS1NRkk6QUNUOnJvbGU9MHglMDJ4OmlkPTB4JTAyeDp2YXI9MHglMDJ4OmIvdD0lZC8lZFxuIiwKIAkgICAgICAgaHctPmNhcF9hY3Rfc3RhX21maS5yb2xlLCBody0+Y2FwX2FjdF9zdGFfbWZpLmlkLAogCSAgICAgICBody0+Y2FwX2FjdF9zdGFfbWZpLnZhcmlhbnQsIGh3LT5jYXBfYWN0X3N0YV9tZmkuYm90dG9tLApAQCAtODcxLDkgKzg2Nyw5IEBACiAJaWYgKCFyZXN1bHQpIHsKIAkJd2xhbl9ta3ByaW50c3RyKHNudW0sIEhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4sCiAJCQkJcHN0ciwgc2l6ZW9mKHBzdHIpKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJpc20yIGNhcmQgU046ICVzXG4iLCBwc3RyKTsKKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAiUHJpc20yIGNhcmQgU046ICVzXG4iLCBwc3RyKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXRyaWV2ZSBQcmlzbTIgQ2FyZCBTTlxuIik7CisJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFByaXNtMiBDYXJkIFNOXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC04ODEsNyArODc3LDcgQEAKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSLAogCQkJCQl3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJldHJpZXZlIG1hYyBhZGRyZXNzXG4iKTsKKwkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgbWFjIGFkZHJlc3NcbiIpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTkwOSw3ICs5MDUsNyBAQAogCiAJZ290byBkb25lOwogZmFpbGVkOgotCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkLCByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7CisJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQsIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKIGRvbmU6CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTEwODUsNyArMTA4MSw3IEBACiAJCQkJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNULAogCQkJCQkmam9pbnJlcSwgSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2V0Y29uZmlnKGpvaW5yZXEpIGZhaWxlZCwgcmVzdWx0PSVkXG4iLAorCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgInNldGNvbmZpZyhqb2lucmVxKSBmYWlsZWQsIHJlc3VsdD0lZFxuIiwKIAkJICAgICAgIHJlc3VsdCk7CiAJfQogfQpAQCAtMTIyNiw3ICsxMjIyLDcgQEAKIAkJICovCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHdsYW5kZXYtPm5ldGRldik7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAibGlua3N0YXR1cz1OT1RDT05ORUNURUQgKHVuaGFuZGxlZClcbiIpOworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPU5PVENPTk5FQ1RFRCAodW5oYW5kbGVkKVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBIRkEzODR4X0xJTktfQ09OTkVDVEVEOgpAQCAtMTI1Myw3ICsxMjQ5LDcgQEAKIAkJaWYgKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpIHsKIAkJCXUxNiBwb3J0c3RhdHVzOwogCi0JCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUNPTk5FQ1RFRFxuIik7CisJCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPUNPTk5FQ1RFRFxuIik7CiAKIAkJCS8qIEZvciBub24tdXNiIGRldmljZXMsIHdlIGNhbiB1c2UgdGhlIHN5bmMgdmVyc2lvbnMgKi8KIAkJCS8qIENvbGxlY3QgdGhlIEJTU0lELCBhbmQgc2V0IHN0YXRlIHRvIGFsbG93IHR4ICovCkBAIC0xMzE1LDcgKzEzMTEsNyBAQAogCQkgKiBCbG9jayBUcmFuc21pdHMsIElnbm9yZSByZWNlaXZlcyBvZiBkYXRhIGZyYW1lcwogCQkgKi8KIAkJaWYgKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpCi0JCQlwcmludGsoS0VSTl9JTkZPCisJCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsCiAJCQkgICAgICAgImxpbmtzdGF0dXM9RElTQ09OTkVDVEVEICh1bmhhbmRsZWQpXG4iKTsKIAkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9OT05FOwogCkBAIC0xMzQxLDcgKzEzMzcsNyBAQAogCQkgKiBJbmRpY2F0ZSBSZWFzc29jaWF0aW9uCiAJCSAqIEVuYWJsZSBUcmFuc21pdHMsIFJlY2VpdmVzIGFuZCBwYXNzIHVwIGRhdGEgZnJhbWVzCiAJCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUFQX0NIQU5HRVxuIik7CisJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwgImxpbmtzdGF0dXM9QVBfQ0hBTkdFXG4iKTsKIAogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LAogCQkJCQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lELApAQCAtMTM4Myw3ICsxMzc5LDcgQEAKIAkJICogUmVzcG9uc2U6CiAJCSAqIEJsb2NrIFRyYW5zbWl0cywgSWdub3JlIHJlY2VpdmVzIG9mIGRhdGEgZnJhbWVzCiAJCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICJsaW5rc3RhdHVzPUFQX09VVE9GUkFOR0UgKHVuaGFuZGxlZClcbiIpOworCQluZXRkZXZfaW5mbyh3bGFuZGV2LT5uZXRkZXYsICJsaW5rc3RhdHVzPUFQX09VVE9GUkFOR0UgKHVuaGFuZGxlZClcbiIpOwogCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHdsYW5kZXYtPm5ldGRldik7CiAKQEAgLTEzOTYsNyArMTM5Miw3IEBACiAJCSAqIFJlc3BvbnNlOgogCQkgKiBFbmFibGUgVHJhbnNtaXRzLCBSZWNlaXZlcyBhbmQgcGFzcyB1cCBkYXRhIGZyYW1lcwogCQkgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAibGlua3N0YXR1cz1BUF9JTlJBTkdFXG4iKTsKKwkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAibGlua3N0YXR1cz1BUF9JTlJBTkdFXG4iKTsKIAogCQlody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfQ09OTkVDVEVEOwogCQluZXRpZl9jYXJyaWVyX29uKHdsYW5kZXYtPm5ldGRldik7CkBAIC0xNDIwLDEwICsxNDE2LDEwIEBACiAJCQkJCSAgICAgICBIRkEzODR4X1JJRF9KT0lOUkVRVUVTVCwKIAkJCQkJICAgICAgICZqb2lucmVxLAogCQkJCQkgICAgICAgSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOKTsKLQkJCXByaW50ayhLRVJOX0lORk8KKwkJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKIAkJCSAgICAgICAibGlua3N0YXR1cz1BU1NPQ0ZBSUwgKHJlLXN1Ym1pdHRpbmcgam9pbilcbiIpOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAibGlua3N0YXR1cz1BU1NPQ0ZBSUwgKHVuaGFuZGxlZClcbiIpOworCQkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LCAibGlua3N0YXR1cz1BU1NPQ0ZBSUwgKHVuaGFuZGxlZClcbiIpOwogCQl9CiAKIAkJbmV0aWZfY2Fycmllcl9vZmYod2xhbmRldi0+bmV0ZGV2KTsKQEAgLTE3MTMsNyArMTcwOSw3IEBACiAJaWYgKHJlc3VsdCkgewogCQlpZiAoYWRkZWQpCiAJCQlody0+YXV0aGxpc3QuY250LS07Ci0JCXByaW50ayhLRVJOX0VSUgorCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwKIAkJICAgICAgICJzZXRjb25maWcoYXV0aGVudGljYXRlc3RhdGlvbikgZmFpbGVkLCByZXN1bHQ9JWRcbiIsCiAJCSAgICAgICByZXN1bHQpOwogCX0KQEAgLTE5MjgsNyArMTkyNCw3IEBACiAJaHcgPSBremFsbG9jKHNpemVvZihoZmEzODR4X3QpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghd2xhbmRldiB8fCAhaHcpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKKwkJcHJfZXJyKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKIAkJa2ZyZWUod2xhbmRldik7CiAJCWtmcmVlKGh3KTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xOTgwLDcgKzE5NzYsNyBAQAogCQkJCSZody0+cXVhbCwgSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTik7CiAKIAkJaWYgKHJlc3VsdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBmZXRjaGluZyBjb21tc3F1YWxcbiIpOworCQkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJlcnJvciBmZXRjaGluZyBjb21tc3F1YWxcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKaW5kZXggYjNmZjYwMy4uNDY2ODA0NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCkBAIC0xNzU0LDggKzE3NTQsNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgcmVxdWVzdCBtZW1vcnkgc2l6ZSAleFxuIiwKIAkJICAgICAgIHhnaWZiX2luZm8tPnZpZGVvX3NpemUpOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiRmF0YWwgZXJyb3I6IFVuYWJsZSB0byByZXNlcnZlIGZyYW1lIGJ1ZmZlciBtZW1vcnkuICIKLQkJCSJJcyB0aGVyZSBhbm90aGVyIGZyYW1lYnVmZmVyIGRyaXZlciBhY3RpdmU/XG4iKTsKKwkJCSJGYXRhbCBlcnJvcjogVW5hYmxlIHRvIHJlc2VydmUgZnJhbWUgYnVmZmVyIG1lbW9yeS4gSXMgdGhlcmUgYW5vdGhlciBmcmFtZWJ1ZmZlciBkcml2ZXIgYWN0aXZlP1xuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3JfZGlzYWJsZTsKIAl9CkBAIC0yMDg3LDIzICsyMDg2LDE5IEBACiAKIG1vZHVsZV9wYXJhbShtb2RlLCBjaGFycCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1vZGUsCi0JIlNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgaW4gdGhlIGZvcm1hdCBYeFl4RGVwdGggIgotCSIoZWcuIDEwMjR4NzY4eDE2KS4iKTsKKwkiU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBpbiB0aGUgZm9ybWF0IFh4WXhEZXB0aCAoZWcuIDEwMjR4NzY4eDE2KS4iKTsKIAogbW9kdWxlX3BhcmFtKGZvcmNlY3J0MnR5cGUsIGNoYXJwLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VjcnQydHlwZSwKLQkiRm9yY2UgdGhlIHNlY29uZCBkaXNwbGF5IG91dHB1dCB0eXBlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIE5PTkUsICIKLQkiTENELCBUViwgVkdBLCBTVklERU8gb3IgQ09NUE9TSVRFLiIpOworCSJGb3JjZSB0aGUgc2Vjb25kIGRpc3BsYXkgb3V0cHV0IHR5cGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgTk9ORSwgTENELCBUViwgVkdBLCBTVklERU8gb3IgQ09NUE9TSVRFLiIpOwogCiBtb2R1bGVfcGFyYW0odmVzYSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModmVzYSwKLQkiU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBieSBWRVNBIG1vZGUgbnVtYmVyICIKLQkiKGVnLiAweDExNykuIik7CisJIlNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBtb2RlIG51bWJlciAoZWcuIDB4MTE3KS4iKTsKIAogbW9kdWxlX3BhcmFtKGZpbHRlciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmlsdGVyLAotCSJTZWxlY3RzIFRWIGZsaWNrZXIgZmlsdGVyIHR5cGUgKG9ubHkgZm9yIHN5c3RlbXMgd2l0aCBhIFNpUzMwMSB2aWRlbyBicmlkZ2UpLiAiCi0JIlBvc3NpYmxlIHZhbHVlcyAwLTcuIERlZmF1bHQ6IFtubyBmaWx0ZXJdKS4iKTsKKwkiU2VsZWN0cyBUViBmbGlja2VyIGZpbHRlciB0eXBlIChvbmx5IGZvciBzeXN0ZW1zIHdpdGggYSBTaVMzMDEgdmlkZW8gYnJpZGdlKS4gUG9zc2libGUgdmFsdWVzIDAtNy4gRGVmYXVsdDogW25vIGZpbHRlcl0pLiIpOwogCiBzdGF0aWMgaW50IF9faW5pdCB4Z2lmYl9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGlsbHlidXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy9LY29uZmlnCmluZGV4IDc1YzM4YzguLmI1M2JkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy9LY29uZmlnCkBAIC01LDYgKzUsNyBAQAogY29uZmlnIFhJTExZQlVTCiAJdHJpc3RhdGUgIlhpbGx5YnVzIGdlbmVyaWMgRlBHQSBpbnRlcmZhY2UiCiAJZGVwZW5kcyBvbiBQQ0kgfHwgKE9GX0FERFJFU1MgJiYgT0ZfSVJRKQorCXNlbGVjdCBDUkMzMgogCWhlbHAKIAkgIFhpbGx5YnVzIGlzIGEgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIHBlcmlwaGVyYWxzIGRlc2lnbmVkIG9uCiAJICBwcm9ncmFtbWFibGUgbG9naWMgKEZQR0EpLiBUaGUgZHJpdmVyIHByb2JlcyB0aGUgaGFyZHdhcmUgZm9yCkBAIC0xNiw3ICsxNyw3IEBACiAKIGNvbmZpZyBYSUxMWUJVU19QQ0lFCiAJdHJpc3RhdGUgIlhpbGx5YnVzIG92ZXIgUENJZSIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJX01TSQogCWhlbHAKIAkgIFNldCB0byBNIGlmIHlvdSB3YW50IFhpbGx5YnVzIHRvIHVzZSBQQ0kgRXhwcmVzcyBmb3IgY29tbXVuaWNhdGluZwogCSAgd2l0aCB0aGUgRlBHQS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcveGlsbHlidXMveGlsbHlidXNfY29yZS5jCmluZGV4IDJlYmFmMTYuLmIwYTY2OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hpbGx5YnVzL3hpbGx5YnVzX2NvcmUuYwpAQCAtMjMxOCw4ICsyMzE4LDEyIEBACiAJfQogCiAJeGlsbHlidXNfd3EgPSBhbGxvY193b3JrcXVldWUoeGlsbHluYW1lLCAwLCAwKTsKKwlpZiAoIXhpbGx5YnVzX3dxKSB7CisJCWNsYXNzX2Rlc3Ryb3koeGlsbHlidXNfY2xhc3MpOworCQlyYyA9IC1FTk9NRU07CisJfQogCi0JcmV0dXJuIDA7IC8qIFN1Y2Nlc3MgKi8KKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB4aWxseWJ1c19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jCmluZGV4IDUwYjQ2ODguLjk0ZjllM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgpAQCAtNzAsNiArNzEsOSBAQAogLyogUGlja3MgdXAgbGF0ZSBraWNrcyBhZnRlciBsaXN0IHdhbGsgYnV0IGJlZm9yZSBzY2hlZHVsZSgpICovCiBzdGF0aWMgaW50IGh2Y19raWNrZWQ7CiAKKy8qIGh2Y19pbml0IGlzIHRyaWdnZXJlZCBmcm9tIGh2Y19hbGxvYywgaS5lLiBvbmx5IHdoZW4gYWN0dWFsbHkgdXNlZCAqLworc3RhdGljIGF0b21pY190IGh2Y19uZWVkc19pbml0IF9fcmVhZF9tb3N0bHkgPSBBVE9NSUNfSU5JVCgtMSk7CisKIHN0YXRpYyBpbnQgaHZjX2luaXQodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKQEAgLTg1MSw3ICs4NTUsNyBAQAogCWludCBpOwogCiAJLyogV2Ugd2FpdCB1bnRpbCBhIGRyaXZlciBhY3R1YWxseSBjb21lcyBhbG9uZyAqLwotCWlmICghaHZjX2RyaXZlcikgeworCWlmIChhdG9taWNfaW5jX25vdF96ZXJvKCZodmNfbmVlZHNfaW5pdCkpIHsKIAkJaW50IGVyciA9IGh2Y19pbml0KCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gRVJSX1BUUihlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaXB3aXJlbGVzcy90dHkuYyBiL2RyaXZlcnMvdHR5L2lwd2lyZWxlc3MvdHR5LmMKaW5kZXggZWJkNWJmZi4uMTdlZTNiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaXB3aXJlbGVzcy90dHkuYworKysgYi9kcml2ZXJzL3R0eS9pcHdpcmVsZXNzL3R0eS5jCkBAIC0xNzYsOSArMTc2LDYgQEAKIAkJCQkiOiAlZCBjaGFycyBub3QgaW5zZXJ0ZWQgdG8gZmxpcCBidWZmZXIhXG4iLAogCQkJCWxlbmd0aCAtIHdvcmspOwogCi0JLyoKLQkgKiBUaGlzIG1heSBzbGVlcCBpZiAtPmxvd19sYXRlbmN5IGlzIHNldAotCSAqLwogCWlmICh3b3JrKQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCgmdHR5LT5wb3J0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L25fdHR5LmMgYi9kcml2ZXJzL3R0eS9uX3R0eS5jCmluZGV4IGQxNTYyNGMuLjQxZmU4YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L25fdHR5LmMKKysrIGIvZHJpdmVycy90dHkvbl90dHkuYwpAQCAtMTkwMCwxMyArMTkwMCwxMCBAQAogCXN0cnVjdCBuX3R0eV9kYXRhICpsZGF0YSA9IHR0eS0+ZGlzY19kYXRhOwogCWludCBhbXQgPSBwb2xsICYmICFUSU1FX0NIQVIodHR5KSAmJiBNSU5fQ0hBUih0dHkpID8gTUlOX0NIQVIodHR5KSA6IDE7CiAKLQlpZiAobGRhdGEtPmljYW5vbiAmJiAhTF9FWFRQUk9DKHR0eSkpIHsKLQkJaWYgKGxkYXRhLT5jYW5vbl9oZWFkICE9IGxkYXRhLT5yZWFkX3RhaWwpCi0JCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKHJlYWRfY250KGxkYXRhKSA+PSBhbXQpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7CisJaWYgKGxkYXRhLT5pY2Fub24gJiYgIUxfRVhUUFJPQyh0dHkpKQorCQlyZXR1cm4gbGRhdGEtPmNhbm9uX2hlYWQgIT0gbGRhdGEtPnJlYWRfdGFpbDsKKwllbHNlCisJCXJldHVybiByZWFkX2NudChsZGF0YSkgPj0gYW10OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKaW5kZXggNjk5MzJiNy4uODFmOTA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKQEAgLTE2OTQsNiArMTY5NCwxMCBAQAogCiBzdGF0aWMgdm9pZCBzZXJpYWxfdW5saW5rX2lycV9jaGFpbihzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogeworCS8qCisJICogeWVzLCBzb21lIGJyb2tlbiBnY2MgZW1pdCAid2FybmluZzogJ2knIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQiCisJICogYnV0IG5vLCB3ZSBhcmUgbm90IGdvaW5nIHRvIHRha2UgYSBwYXRjaCB0aGF0IGFzc2lnbnMgTlVMTCBiZWxvdy4KKwkgKi8KIAlzdHJ1Y3QgaXJxX2luZm8gKmk7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJc3RydWN0IGhsaXN0X2hlYWQgKmg7CkBAIC0yODgyLDE0ICsyODg2LDEwIEBACiAKIAl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAocG9ydC0+c3lzcnEpIHsKLQkJLyogc2VyaWFsODI1MF9oYW5kbGVfaXJxKCkgYWxyZWFkeSB0b29rIHRoZSBsb2NrICovCi0JCWxvY2tlZCA9IDA7Ci0JfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7Ci0JCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcG9ydC0+bG9jayk7Ci0JfSBlbHNlCi0JCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisJaWYgKHBvcnQtPnN5c3JxIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKglGaXJzdCBzYXZlIHRoZSBJRVIgdGhlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzCkBAIC0yOTIxLDggKzI5MjEsNyBAQAogCQlzZXJpYWw4MjUwX21vZGVtX3N0YXR1cyh1cCk7CiAKIAlpZiAobG9ja2VkKQotCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNlcmlhbDgyNTBfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wY2kuYwppbmRleCAwZmYzZTM2Li5iMTRiY2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMKQEAgLTEzNjYsMjMgKzEzNjYsNDQgQEAKIAkJc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJdW5zaWduZWQgaW50IGJhdWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodGVybWlvcyk7Ci0JdW5zaWduZWQgaW50IG0gPSA2OTEyOwotCXVuc2lnbmVkIGludCBuID0gMTU2MjU7CisJdW5zaWduZWQgaW50IG0sIG47CiAJdTMyIHJlZzsKIAotCS8qIEZvciBiYXVkIHJhdGVzIDFNLCAyTSwgM00gYW5kIDRNIHRoZSBkaXZpZGVycyBtdXN0IGJlIGFkanVzdGVkLiAqLwotCWlmIChiYXVkID09IDEwMDAwMDAgfHwgYmF1ZCA9PSAyMDAwMDAwIHx8IGJhdWQgPT0gNDAwMDAwMCkgeworCS8qCisJICogRm9yIGJhdWQgcmF0ZXMgMC41TSwgMU0sIDEuNU0sIDJNLCAyLjVNLCAzTSwgMy41TSBhbmQgNE0gdGhlCisJICogZGl2aWRlcnMgbXVzdCBiZSBhZGp1c3RlZC4KKwkgKgorCSAqIHVhcnRjbGsgPSAobSAvIG4pICogMTAwIE1Ieiwgd2hlcmUgbSA8PSBuCisJICovCisJc3dpdGNoIChiYXVkKSB7CisJY2FzZSA1MDAwMDA6CisJY2FzZSAxMDAwMDAwOgorCWNhc2UgMjAwMDAwMDoKKwljYXNlIDQwMDAwMDA6CiAJCW0gPSA2NDsKIAkJbiA9IDEwMDsKLQogCQlwLT51YXJ0Y2xrID0gNjQwMDAwMDA7Ci0JfSBlbHNlIGlmIChiYXVkID09IDMwMDAwMDApIHsKKwkJYnJlYWs7CisJY2FzZSAzNTAwMDAwOgorCQltID0gNTY7CisJCW4gPSAxMDA7CisJCXAtPnVhcnRjbGsgPSA1NjAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAxNTAwMDAwOgorCWNhc2UgMzAwMDAwMDoKIAkJbSA9IDQ4OwogCQluID0gMTAwOwotCiAJCXAtPnVhcnRjbGsgPSA0ODAwMDAwMDsKLQl9IGVsc2UgewotCQlwLT51YXJ0Y2xrID0gNDQyMzY4MDA7CisJCWJyZWFrOworCWNhc2UgMjUwMDAwMDoKKwkJbSA9IDQwOworCQluID0gMTAwOworCQlwLT51YXJ0Y2xrID0gNDAwMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW0gPSAyMzA0OworCQluID0gMzEyNTsKKwkJcC0+dWFydGNsayA9IDczNzI4MDAwOwogCX0KIAogCS8qIFJlc2V0IHRoZSBjbG9jayAqLwpAQCAtMzQ0OSw2ICszNDcwLDEwIEBACiAJCS5iYXNlX2JhdWQJPSA5MjE2MDAsCiAJCS5yZWdfc2hpZnQgICAgICA9IDIsCiAJfSwKKwkvKgorCSAqIEludGVsIEJheVRyYWlsIEhTVUFSVCByZWZlcmVuY2UgY2xvY2sgaXMgNDQuMjM2OCBNSHogYXQgcG93ZXItb24sCisJICogYnV0IGlzIG92ZXJyaWRkZW4gYnkgYnl0X3NldF90ZXJtaW9zLgorCSAqLwogCVtwYm5fYnl0XSA9IHsKIAkJLmZsYWdzCQk9IEZMX0JBU0UwLAogCQkubnVtX3BvcnRzCT0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKaW5kZXggYTM4MTVlYS4uMjU3N2Q2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKQEAgLTI4OSw3ICsyODksNyBAQAogCSAgTUFYMzEwMCBjaGlwIHN1cHBvcnQKIAogY29uZmlnIFNFUklBTF9NQVgzMTBYCi0JYm9vbCAiTUFYMzEwWCBzdXBwb3J0IgorCXRyaXN0YXRlICJNQVgzMTBYIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSCiAJc2VsZWN0IFNFUklBTF9DT1JFCiAJc2VsZWN0IFJFR01BUF9TUEkgaWYgU1BJX01BU1RFUgpAQCAtNzA4LDcgKzcwOCw3IEBACiAKIGNvbmZpZyBTRVJJQUxfU0hfU0NJCiAJdHJpc3RhdGUgIlN1cGVySCBTQ0koRikgc2VyaWFsIHBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhBVkVfQ0xLICYmIChTVVBFUkggfHwgQVJNIHx8IENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIFNVUEVSSCB8fCBBUkNIX1NITU9CSUxFIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTRVJJQUxfQ09SRQogCiBjb25maWcgU0VSSUFMX1NIX1NDSV9OUl9VQVJUUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKaW5kZXggZDU4NzgzZC4uZDRlZGEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCkBAIC0yMTU0LDkgKzIxNTQsMTkgQEAKIAlhbWJhX3BvcnRzW2ldID0gdWFwOwogCiAJYW1iYV9zZXRfZHJ2ZGF0YShkZXYsIHVhcCk7CisKKwlpZiAoIWFtYmFfcmVnLnN0YXRlKSB7CisJCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZhbWJhX3JlZyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBBTUJBLVBMMDExIGRyaXZlclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJcmV0ID0gdWFydF9hZGRfb25lX3BvcnQoJmFtYmFfcmVnLCAmdWFwLT5wb3J0KTsKIAlpZiAocmV0KSB7CiAJCWFtYmFfcG9ydHNbaV0gPSBOVUxMOworCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZhbWJhX3JlZyk7CiAJCXBsMDExX2RtYV9yZW1vdmUodWFwKTsKIAl9CiAgb3V0OgpAQCAtMjE3NSw2ICsyMTg1LDcgQEAKIAkJCWFtYmFfcG9ydHNbaV0gPSBOVUxMOwogCiAJcGwwMTFfZG1hX3JlbW92ZSh1YXApOworCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtYmFfcmVnKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIzMCwyMiArMjI0MSwxNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwbDAxMV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKIAlwcmludGsoS0VSTl9JTkZPICJTZXJpYWw6IEFNQkEgUEwwMTEgVUFSVCBkcml2ZXJcbiIpOwogCi0JcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmFtYmFfcmVnKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gYW1iYV9kcml2ZXJfcmVnaXN0ZXIoJnBsMDExX2RyaXZlcik7Ci0JCWlmIChyZXQpCi0JCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZhbWJhX3JlZyk7Ci0JfQotCXJldHVybiByZXQ7CisJcmV0dXJuIGFtYmFfZHJpdmVyX3JlZ2lzdGVyKCZwbDAxMV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGwwMTFfZXhpdCh2b2lkKQogewogCWFtYmFfZHJpdmVyX3VucmVnaXN0ZXIoJnBsMDExX2RyaXZlcik7Ci0JdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmYW1iYV9yZWcpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IGE0OWYxMGQuLmIwNjAzZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKQEAgLTExNSw5ICsxMTUsNiBAQAogI2RlZmluZSBVQVJUX1BVVF9UQ1IocG9ydCx2KQlfX3Jhd193cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVRNRUxfUERDX1RDUikKICNkZWZpbmUgVUFSVF9HRVRfVENSKHBvcnQpCV9fcmF3X3JlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUTUVMX1BEQ19UQ1IpCiAKLXN0YXRpYyBpbnQgKCphdG1lbF9vcGVuX2hvb2spKHN0cnVjdCB1YXJ0X3BvcnQgKik7Ci1zdGF0aWMgdm9pZCAoKmF0bWVsX2Nsb3NlX2hvb2spKHN0cnVjdCB1YXJ0X3BvcnQgKik7Ci0KIHN0cnVjdCBhdG1lbF9kbWFfYnVmZmVyIHsKIAl1bnNpZ25lZCBjaGFyCSpidWY7CiAJZG1hX2FkZHJfdAlkbWFfYWRkcjsKQEAgLTE1NTUsNyArMTU1Miw3IEBACiAJcmV0dmFsID0gcmVxdWVzdF9pcnEocG9ydC0+aXJxLCBhdG1lbF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJdHR5ID8gdHR5LT5uYW1lIDogImF0bWVsX3NlcmlhbCIsIHBvcnQpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKCJhdG1lbF9zZXJpYWw6IGF0bWVsX3N0YXJ0dXAgLSBDYW4ndCBnZXQgaXJxXG4iKTsKKwkJZGV2X2Vycihwb3J0LT5kZXYsICJhdG1lbF9zdGFydHVwIC0gQ2FuJ3QgZ2V0IGlycVxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC0xNTc1LDE3ICsxNTcyLDYgQEAKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlhdG1lbF9zZXRfb3BzKHBvcnQpOwogCX0KLQkvKgotCSAqIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgIm9wZW4iIGZ1bmN0aW9uICh0byByZWdpc3RlcgotCSAqIGNvbnRyb2wgbGluZSBpbnRlcnJ1cHRzKQotCSAqLwotCWlmIChhdG1lbF9vcGVuX2hvb2spIHsKLQkJcmV0dmFsID0gYXRtZWxfb3Blbl9ob29rKHBvcnQpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCX0KIAogCS8qIFNhdmUgY3VycmVudCBDU1IgZm9yIGNvbXBhcmlzb24gaW4gYXRtZWxfdGFza2xldF9mdW5jKCkgKi8KIAlhdG1lbF9wb3J0LT5pcnFfc3RhdHVzX3ByZXYgPSBVQVJUX0dFVF9DU1IocG9ydCk7CkBAIC0xNjg0LDEzICsxNjcwLDYgQEAKIAkgKiBGcmVlIHRoZSBpbnRlcnJ1cHQKIAkgKi8KIAlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmljICJjbG9zZSIgZnVuY3Rpb24gKHRvIHVucmVnaXN0ZXIKLQkgKiBjb250cm9sIGxpbmUgaW50ZXJydXB0cykKLQkgKi8KLQlpZiAoYXRtZWxfY2xvc2VfaG9vaykKLQkJYXRtZWxfY2xvc2VfaG9vayhwb3J0KTsKIH0KIAogLyoKQEAgLTE3MzgsNyArMTcxNyw3IEBACiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShhdG1lbF9wb3J0LT5jbGspOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX3NlcmlhbDogdW5rbm93biBwbSAlZFxuIiwgc3RhdGUpOworCQlkZXZfZXJyKHBvcnQtPmRldiwgImF0bWVsX3NlcmlhbDogdW5rbm93biBwbSAlZFxuIiwgc3RhdGUpOwogCX0KIH0KIApAQCAtMTg1MywxMyArMTgzMiwxMCBAQAogCW1vZGUgJj0gfkFUTUVMX1VTX1VTTU9ERTsKIAogCWlmIChhdG1lbF9wb3J0LT5yczQ4NS5mbGFncyAmIFNFUl9SUzQ4NV9FTkFCTEVEKSB7Ci0JCWRldl9kYmcocG9ydC0+ZGV2LCAiU2V0dGluZyBVQVJUIHRvIFJTNDg1XG4iKTsKIAkJaWYgKChhdG1lbF9wb3J0LT5yczQ4NS5kZWxheV9ydHNfYWZ0ZXJfc2VuZCkgPiAwKQogCQkJVUFSVF9QVVRfVFRHUihwb3J0LAogCQkJCQlhdG1lbF9wb3J0LT5yczQ4NS5kZWxheV9ydHNfYWZ0ZXJfc2VuZCk7CiAJCW1vZGUgfD0gQVRNRUxfVVNfVVNNT0RFX1JTNDg1OwotCX0gZWxzZSB7Ci0JCWRldl9kYmcocG9ydC0+ZGV2LCAiU2V0dGluZyBVQVJUIHRvIFJTMjMyXG4iKTsKIAl9CiAKIAkvKiBzZXQgdGhlIHBhcml0eSwgc3RvcCBiaXRzIGFuZCBkYXRhIHNpemUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYwppbmRleCA3OGU4MmIwLi5hNDc0MjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfYmNtNjN4eC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2RlZmluZSBCQ002M1hYX05SX1VBUlRTCTIKIApAQCAtNTg4LDcgKzU5MCw3IEBACiB7CiAJdW5zaWduZWQgaW50IHNpemU7CiAKLQlzaXplID0gUlNFVF9VQVJUX1NJWkU7CisJc2l6ZSA9IFVBUlRfUkVHX1NJWkU7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgc2l6ZSwgImJjbTYzeHgiKSkgewogCQlkZXZfZXJyKHBvcnQtPmRldiwgIk1lbW9yeSByZWdpb24gYnVzeVxuIik7CiAJCXJldHVybiAtRUJVU1k7CkBAIC02MDgsNyArNjEwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgYmNtX3VhcnRfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIFJTRVRfVUFSVF9TSVpFKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgVUFSVF9SRUdfU0laRSk7CiAJaW91bm1hcChwb3J0LT5tZW1iYXNlKTsKIH0KIApAQCAtODA1LDYgKzgwNyw5IEBACiAJc3RydWN0IGNsayAqY2xrOwogCWludCByZXQ7CiAKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCXBkZXYtPmlkID0gb2ZfYWxpYXNfZ2V0X2lkKHBkZXYtPmRldi5vZl9ub2RlLCAidWFydCIpOworCiAJaWYgKHBkZXYtPmlkIDwgMCB8fCBwZGV2LT5pZCA+PSBCQ002M1hYX05SX1VBUlRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtODU2LDYgKzg2MSwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY202M3h4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtdWFydCIgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY202M3h4X29mX21hdGNoKTsKKwogLyoKICAqIHBsYXRmb3JtIGRyaXZlciBzdHVmZgogICovCkBAIC04NjUsNiArODc2LDcgQEAKIAkuZHJpdmVyCT0gewogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm5hbWUgID0gImJjbTYzeHhfdWFydCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbTYzeHhfb2ZfbWF0Y2gsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9jbHBzNzExeC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2NscHM3MTF4LmMKaW5kZXggYjBlYWNiOC4uNWU2ZmRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2NscHM3MTF4LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2NscHM3MTF4LmMKQEAgLTM2OCwxMSArMzY4LDE2IEBACiBzdGF0aWMgdm9pZCB1YXJ0X2NscHM3MTF4X2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY2gpCiB7CiAJc3RydWN0IGNscHM3MTF4X3BvcnQgKnMgPSBkZXZfZ2V0X2RydmRhdGEocG9ydC0+ZGV2KTsKLQl1MzIgc3lzZmxnID0gMDsKIAotCWRvIHsKKwkvKiBXYWl0IGZvciBGSUZPIGlzIG5vdCBmdWxsICovCisJd2hpbGUgKDEpIHsKKwkJdTMyIHN5c2ZsZyA9IDA7CisKIAkJcmVnbWFwX3JlYWQocy0+c3lzY29uLCBTWVNGTEdfT0ZGU0VULCAmc3lzZmxnKTsKLQl9IHdoaWxlIChzeXNmbGcgJiBTWVNGTEdfVVRYRkYpOworCQlpZiAoIShzeXNmbGcgJiBTWVNGTEdfVVRYRkYpKQorCQkJYnJlYWs7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KIAogCXdyaXRldyhjaCwgcG9ydC0+bWVtYmFzZSArIFVBUlREUl9PRkZTRVQpOwogfQpAQCAtMzgyLDE0ICszODcsMTggQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gY2xwczcxMXhfdWFydC5zdGF0ZVtjby0+aW5kZXhdLnVhcnRfcG9ydDsKIAlzdHJ1Y3QgY2xwczcxMXhfcG9ydCAqcyA9IGRldl9nZXRfZHJ2ZGF0YShwb3J0LT5kZXYpOwotCXUzMiBzeXNmbGcgPSAwOwogCiAJdWFydF9jb25zb2xlX3dyaXRlKHBvcnQsIGMsIG4sIHVhcnRfY2xwczcxMXhfY29uc29sZV9wdXRjaGFyKTsKIAogCS8qIFdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXB0eSAqLwotCWRvIHsKKwl3aGlsZSAoMSkgeworCQl1MzIgc3lzZmxnID0gMDsKKwogCQlyZWdtYXBfcmVhZChzLT5zeXNjb24sIFNZU0ZMR19PRkZTRVQsICZzeXNmbGcpOwotCX0gd2hpbGUgKHN5c2ZsZyAmIFNZU0ZMR19VQlVTWSk7CisJCWlmICghKHN5c2ZsZyAmIFNZU0ZMR19VQlVTWSkpCisJCQlicmVhazsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQogfQogCiBzdGF0aWMgaW50IHVhcnRfY2xwczcxMXhfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvY3Jpc3YxMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2NyaXN2MTAuYwppbmRleCA2OTBiZGVhLi5kNTY3YWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9jcmlzdjEwLmMKQEAgLTI4Niw3ICsyODYsNiBAQAogI2VuZGlmCiAKIH0sICAvKiB0dHlTMCAqLwotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCXsgLmJhdWQgICAgICAgID0gREVGX0JBVUQsCiAJICAuaW9wb3J0ICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopUl9TRVJJQUwxX0NUUkwsCiAJICAuaXJxICAgICAgICAgPSAxVSA8PCAxNiwgLyogdXNlcyBETUEgOCBhbmQgOSAqLwpAQCAtNDQ3LDcgKzQ0Niw2IEBACiAJICAuZG1hX2luX2VuYWJsZWQgPSAwCiAjZW5kaWYKICB9ICAgLyogdHR5UzMgKi8KLSNlbmRpZgogfTsKIAogCkBAIC0xMDM1LDcgKzEwMzMsNiBAQAogc3RhdGljIGlubGluZSB2b2lkCiBlMTAwX2R0cihzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8sIGludCBzZXQpCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJdW5zaWduZWQgY2hhciBtYXNrID0gZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmR0cl9tYXNrOwogCiAjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCkBAIC0xMDYwLDcgKzEwNTcsNiBAQAogCSAgICAgICBpbmZvLT5saW5lLCAqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmR0cl9zaGFkb3csCiAJICAgICAgIEUxMDBfRFRSX0dFVChpbmZvKSk7CiAjZW5kaWYKLSNlbmRpZgogfQogCiAvKiBzZXQgPSAwIG1lYW5zIDMuM1Ygb24gdGhlIHBpbiwgYml0dmFsdWU6IDA9YWN0aXZlLCAxPWluYWN0aXZlCkBAIC0xMDY5LDcgKzEwNjUsNiBAQAogc3RhdGljIGlubGluZSB2b2lkCiBlMTAwX3J0cyhzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8sIGludCBzZXQpCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaW5mby0+cnhfY3RybCAmPSB+RTEwMF9SVFNfTUFTSzsKQEAgLTEwNzksNyArMTA3NCw2IEBACiAjaWZkZWYgU0VSSUFMX0RFQlVHX0lPCiAJcHJpbnRrKCJzZXIlaSBydHMgJWlcbiIsIGluZm8tPmxpbmUsIHNldCk7CiAjZW5kaWYKLSNlbmRpZgogfQogCiAKQEAgLTEwODcsNyArMTA4MSw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDBfcmlfb3V0KHN0cnVjdCBlMTAwX3NlcmlhbCAqaW5mbywgaW50IHNldCkKIHsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAkvKiBSSSBpcyBhY3RpdmUgbG93ICovCiAJewogCQl1bnNpZ25lZCBjaGFyIG1hc2sgPSBlMTAwX21vZGVtX3BpbnNbaW5mby0+bGluZV0ucmlfbWFzazsKQEAgLTEwOTksMTIgKzEwOTIsMTAgQEAKIAkJKmUxMDBfbW9kZW1fcGluc1tpbmZvLT5saW5lXS5yaV9wb3J0ID0gKmUxMDBfbW9kZW1fcGluc1tpbmZvLT5saW5lXS5yaV9zaGFkb3c7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9Ci0jZW5kaWYKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZAogZTEwMF9jZF9vdXQoc3RydWN0IGUxMDBfc2VyaWFsICppbmZvLCBpbnQgc2V0KQogewotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCS8qIENEIGlzIGFjdGl2ZSBsb3cgKi8KIAl7CiAJCXVuc2lnbmVkIGNoYXIgbWFzayA9IGUxMDBfbW9kZW1fcGluc1tpbmZvLT5saW5lXS5jZF9tYXNrOwpAQCAtMTExNiwyNyArMTEwNywyMiBAQAogCQkqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmNkX3BvcnQgPSAqZTEwMF9tb2RlbV9waW5zW2luZm8tPmxpbmVdLmNkX3NoYWRvdzsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KLSNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDBfZGlzYWJsZV9yeChzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8pCiB7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJLyogZGlzYWJsZSB0aGUgcmVjZWl2ZXIgKi8KIAlpbmZvLT5pb3BvcnRbUkVHX1JFQ19DVFJMXSA9CiAJCShpbmZvLT5yeF9jdHJsICY9IH5JT19NQVNLKFJfU0VSSUFMMF9SRUNfQ1RSTCwgcmVjX2VuYWJsZSkpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZTEwMF9lbmFibGVfcngoc3RydWN0IGUxMDBfc2VyaWFsICppbmZvKQogewotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCS8qIGVuYWJsZSB0aGUgcmVjZWl2ZXIgKi8KIAlpbmZvLT5pb3BvcnRbUkVHX1JFQ19DVFJMXSA9CiAJCShpbmZvLT5yeF9jdHJsIHw9IElPX01BU0soUl9TRVJJQUwwX1JFQ19DVFJMLCByZWNfZW5hYmxlKSk7Ci0jZW5kaWYKIH0KIAogLyogdGhlIHJ4IERNQSB1c2VzIGJvdGggdGhlIGRtYV9kZXNjciBhbmQgdGhlIGRtYV9lb3AgaW50ZXJydXB0cyAqLwpAQCAtMTU1NCwyNCArMTU0MCw2IEBACiAJdW5zaWduZWQgaW50IGMsIHNlbnRsOwogCXN0cnVjdCBldHJheF9kbWFfZGVzY3IgKmRlc2NyOwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBUaGlzIHdpbGwgb3V0cHV0IHRvbyBsaXR0bGUgaWYgdGFpbCBpcyBub3QgMCBhbHdheXMgc2luY2UKLQkgKiB3ZSBkb24ndCByZWxvb3AgdG8gc2VuZCB0aGUgb3RoZXIgcGFydC4gQW55d2F5IHRoaXMgU0hPVUxEIGJlIGEKLQkgKiBuby1vcCAtIHRyYW5zbWl0X2NoYXJzX2RtYSB3b3VsZCBuZXZlciByZWFsbHkgYmUgY2FsbGVkIGR1cmluZyBzaW0KLQkgKiBzaW5jZSByc193cml0ZSBkb2VzIG5vdCB3cml0ZSBpbnRvIHRoZSB4bWl0IGJ1ZmZlciB0aGVuLgotCSAqLwotCWlmIChpbmZvLT54bWl0LnRhaWwpCi0JCXByaW50aygiRXJyb3IgaW4gc2VyaWFsLmM6dHJhbnNtaXRfY2hhcnMtZG1hKCksIHRhaWwhPTBcbiIpOwotCWlmIChpbmZvLT54bWl0LmhlYWQgIT0gaW5mby0+eG1pdC50YWlsKSB7Ci0JCVNJTUNPVVQoaW5mby0+eG1pdC5idWYgKyBpbmZvLT54bWl0LnRhaWwsCi0JCQlDSVJDX0NOVChpbmZvLT54bWl0LmhlYWQsCi0JCQkJIGluZm8tPnhtaXQudGFpbCwKLQkJCQkgU0VSSUFMX1hNSVRfU0laRSkpOwotCQlpbmZvLT54bWl0LmhlYWQgPSBpbmZvLT54bWl0LnRhaWw7ICAvKiBtb3ZlIGJhY2sgaGVhZCAqLwotCQlpbmZvLT50cl9ydW5uaW5nID0gMDsKLQl9Ci0JcmV0dXJuOwotI2VuZGlmCiAJLyogYWNrbm93bGVkZ2UgYm90aCBkbWFfZGVzY3IgYW5kIGRtYV9lb3AgaXJxIGluIFJfRE1BX0NIeF9DTFJfSU5UUiAqLwogCSppbmZvLT5vY2xyaW50cmFkciA9CiAJCUlPX1NUQVRFKFJfRE1BX0NINl9DTFJfSU5UUiwgY2xyX2Rlc2NyLCBkbykgfApAQCAtMTg0MiwxMyArMTgxMCw2IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyIHJzdGF0OwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBObyByZWNlaXZlIGluIHRoZSBzaW11bGF0b3IuICBXaWxsIHByb2JhYmx5IGJlIHdoZW4gdGhlIHJlc3Qgb2YKLQkgKiB0aGUgc2VyaWFsIGludGVyZmFjZSB3b3JrcywgYW5kIHRoaXMgcGllY2Ugd2lsbCBqdXN0IGJlIHJlbW92ZWQuCi0JICovCi0JcmV0dXJuOwotI2VuZGlmCi0KIAkvKiBBY2tub3dsZWRnZSBib3RoIGRtYV9kZXNjciBhbmQgZG1hX2VvcCBpcnEgaW4gUl9ETUFfQ0h4X0NMUl9JTlRSICovCiAJKmluZm8tPmljbHJpbnRyYWRyID0KIAkJSU9fU1RBVEUoUl9ETUFfQ0g2X0NMUl9JTlRSLCBjbHJfZGVzY3IsIGRvKSB8CkBAIC0xOTM0LDEyICsxODk1LDYgQEAKIHN0YXRpYyB2b2lkCiBzdGFydF9yZWNlaXZlKHN0cnVjdCBlMTAwX3NlcmlhbCAqaW5mbykKIHsKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIE5vIHJlY2VpdmUgaW4gdGhlIHNpbXVsYXRvci4gIFdpbGwgcHJvYmFibHkgYmUgd2hlbiB0aGUgcmVzdCBvZgotCSAqIHRoZSBzZXJpYWwgaW50ZXJmYWNlIHdvcmtzLCBhbmQgdGhpcyBwaWVjZSB3aWxsIGp1c3QgYmUgcmVtb3ZlZC4KLQkgKi8KLQlyZXR1cm47Ci0jZW5kaWYKIAlpZiAoaW5mby0+dXNlc19kbWFfaW4pIHsKIAkJLyogcmVzZXQgdGhlIGlucHV0IGRtYSBjaGFubmVsIHRvIGJlIHN1cmUgaXQgd29ya3MgKi8KIApAQCAtMTk3MiwxNyArMTkyNyw2IEBACiAJaW50IGk7CiAJaW50IGhhbmRsZWQgPSAwOwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBObyByZWNlaXZlIGluIHRoZSBzaW11bGF0b3IuICBXaWxsIHByb2JhYmx5IGJlIHdoZW4gdGhlIHJlc3Qgb2YKLQkgKiB0aGUgc2VyaWFsIGludGVyZmFjZSB3b3JrcywgYW5kIHRoaXMgcGllY2Ugd2lsbCBqdXN0IGJlIHJlbW92ZWQuCi0JICovCi0JewotCQljb25zdCBjaGFyICpzID0gIldoYXQ/IHRyX2ludGVycnVwdCBpbiBzaW11bGF0b3I/P1xuIjsKLQkJU0lNQ09VVChzLHN0cmxlbihzKSk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLSNlbmRpZgotCiAJLyogZmluZCBvdXQgdGhlIGxpbmUgdGhhdCBjYXVzZWQgdGhpcyBpcnEgYW5kIGdldCBpdCBmcm9tIHJzX3RhYmxlICovCiAKIAlpcmVnID0gKlJfSVJRX01BU0syX1JEOyAgLyogZ2V0IHRoZSBhY3RpdmUgaXJxIGJpdHMgZm9yIHRoZSBkbWEgY2hhbm5lbHMgKi8KQEAgLTIwMjEsMTcgKzE5NjUsNiBAQAogCWludCBpOwogCWludCBoYW5kbGVkID0gMDsKIAotI2lmZGVmIENPTkZJR19TVklOVE9fU0lNCi0JLyogTm8gcmVjZWl2ZSBpbiB0aGUgc2ltdWxhdG9yLiAgV2lsbCBwcm9iYWJseSBiZSB3aGVuIHRoZSByZXN0IG9mCi0JICogdGhlIHNlcmlhbCBpbnRlcmZhY2Ugd29ya3MsIGFuZCB0aGlzIHBpZWNlIHdpbGwganVzdCBiZSByZW1vdmVkLgotCSAqLwotCXsKLQkJY29uc3QgY2hhciAqcyA9ICJXaGF0PyByZWNfaW50ZXJydXB0IGluIHNpbXVsYXRvcj8/XG4iOwotCQlTSU1DT1VUKHMsc3RybGVuKHMpKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotI2VuZGlmCi0KIAkvKiBmaW5kIG91dCB0aGUgbGluZSB0aGF0IGNhdXNlZCB0aGlzIGlycSBhbmQgZ2V0IGl0IGZyb20gcnNfdGFibGUgKi8KIAogCWlyZWcgPSAqUl9JUlFfTUFTSzJfUkQ7ICAvKiBnZXQgdGhlIGFjdGl2ZSBpcnEgYml0cyBmb3IgdGhlIGRtYSBjaGFubmVscyAqLwpAQCAtMjE3MywxMCArMjEwNiw2IEBACiAJc3RydWN0IGUxMDBfc2VyaWFsICppbmZvOwogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQlyZXR1cm47Ci0jZW5kaWYKLQogCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CiAJCWluZm8gPSByc190YWJsZSArIGk7CiAJCWlmIChpbmZvLT51c2VzX2RtYV9pbikKQEAgLTI3MjksMjUgKzI2NTgsNiBAQAogCXByaW50aygic3RhcnRpbmcgdXAgdHR5UyVkICh4bWl0X2J1ZiAweCVwKS4uLlxuIiwgaW5mby0+bGluZSwgaW5mby0+eG1pdC5idWYpOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU1ZJTlRPX1NJTQotCS8qIEJpdHMgYW5kIHBpZWNlcyBjb2xsZWN0ZWQgZnJvbSBiZWxvdy4gIEJldHRlciB0byBoYXZlIHRoZW0KLQkgICBpbiBvbmUgaWZkZWY6ZWQgY2xhdXNlIHRoYW4gdG8gbWl4IGluIGEgbG90IG9mIGlmZGVmcywKLQkgICByaWdodD8gKi8KLQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT5wb3J0LnR0eS0+ZmxhZ3MpOwotCi0JaW5mby0+eG1pdC5oZWFkID0gaW5mby0+eG1pdC50YWlsID0gMDsKLQlpbmZvLT5maXJzdF9yZWN2X2J1ZmZlciA9IGluZm8tPmxhc3RfcmVjdl9idWZmZXIgPSBOVUxMOwotCWluZm8tPnJlY3ZfY250ID0gaW5mby0+bWF4X3JlY3ZfY250ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBTRVJJQUxfUkVDVl9ERVNDUklQVE9SUzsgaSsrKQotCQlpbmZvLT5yZWNfZGVzY3JbaV0uYnVmID0gTlVMTDsKLQotCS8qIE5vIHJlYWwgYWN0aW9uIGluIHRoZSBzaW11bGF0b3IsIGJ1dCBtYXkgc2V0IGluZm8gaW1wb3J0YW50Ci0JICAgdG8gaW9jdGwuICovCi0JY2hhbmdlX3NwZWVkKGluZm8pOwotI2Vsc2UKLQogCS8qCiAJICogQ2xlYXIgdGhlIEZJRk8gYnVmZmVycyBhbmQgZGlzYWJsZSB0aGVtCiAJICogKHRoZXkgd2lsbCBiZSByZWVuYWJsZWQgaW4gY2hhbmdlX3NwZWVkKCkpCkBAIC0yODM3LDggKzI3NDcsNiBAQAogCWUxMDBfcnRzKGluZm8sIDEpOwogCWUxMDBfZHRyKGluZm8sIDEpOwogCi0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KLQogCWluZm8tPnBvcnQuZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0yODU3LDcgKzI3NjUsNiBAQAogCXN0cnVjdCBldHJheF9yZWN2X2J1ZmZlciAqYnVmZmVyOwogCWludCBpOwogCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJLyogc2h1dCBkb3duIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgKi8KIAlERkxPVyhERUJVR19MT0coaW5mby0+bGluZSwgInNodXRkb3duICVpXG4iLCBpbmZvLT5saW5lKSk7CiAJZTEwMF9kaXNhYmxlX3J4KGluZm8pOwpAQCAtMjg4Miw4ICsyNzg5LDYgQEAKIAkJaW5mby0+dHJfcnVubmluZyA9IDA7CiAJfQogCi0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KLQogCWlmICghKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCiAJCXJldHVybjsKIApAQCAtMjk5NSwxNyArMjkwMCwxMiBAQAogCQkJSU9fU1RBVEUoUl9BTFRfU0VSX0JBVURSQVRFLCBzZXIwX3RyLCBub3JtYWwpOwogCQlyX2FsdF9zZXJfYmF1ZHJhdGVfc2hhZG93ICY9IH5tYXNrOwogCQlyX2FsdF9zZXJfYmF1ZHJhdGVfc2hhZG93IHw9IChhbHRfc291cmNlIDw8IChpbmZvLT5saW5lKjgpKTsKLSNpZm5kZWYgQ09ORklHX1NWSU5UT19TSU0KIAkJKlJfQUxUX1NFUl9CQVVEUkFURSA9IHJfYWx0X3Nlcl9iYXVkcmF0ZV9zaGFkb3c7Ci0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KIAogCQlpbmZvLT5iYXVkID0gY2ZsYWdfdG9fYmF1ZChjZmxhZyk7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJCWluZm8tPmlvcG9ydFtSRUdfQkFVRF0gPSBjZmxhZ190b19ldHJheF9iYXVkKGNmbGFnKTsKLSNlbmRpZiAvKiBDT05GSUdfU1ZJTlRPX1NJTSAqLwogCX0KIAotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCS8qIHN0YXJ0IHdpdGggZGVmYXVsdCBzZXR0aW5ncyBhbmQgdGhlbiBmaWxsIGluIGNoYW5nZXMgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJLyogOCBiaXQsIG5vL2V2ZW4gcGFyaXR5ICovCkBAIC0zMDczLDcgKzI5NzMsNiBAQAogCiAJKigodW5zaWduZWQgbG9uZyAqKSZpbmZvLT5pb3BvcnRbUkVHX1hPRkZdKSA9IHhvZmY7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotI2VuZGlmIC8qICFDT05GSUdfU1ZJTlRPX1NJTSAqLwogCiAJdXBkYXRlX2NoYXJfdGltZShpbmZvKTsKIApAQCAtMzEyMiwxMSArMzAyMSw2IEBACiAJCSAgICAgICBjb3VudCwgaW5mby0+aW9wb3J0W1JFR19TVEFUVVNdKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NWSU5UT19TSU0KLQkvKiBSZWFsbHkgc2ltcGxlLiAgVGhlIG91dHB1dCBpcyBoZXJlIGFuZCBub3cuICovCi0JU0lNQ09VVChidWYsIGNvdW50KTsKLQlyZXR1cm4gY291bnQ7Ci0jZW5kaWYKIAlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKIAlERkxPVyhERUJVR19MT0coaW5mby0+bGluZSwgIndyaXRlIGNvdW50ICVpICIsIGNvdW50KSk7CiAJREZMT1coREVCVUdfTE9HKGluZm8tPmxpbmUsICJsZGlzYyAlaVxuIiwgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSkpOwpAQCAtMzQ2Myw3ICszMzU3LDYgQEAKIGdldF9sc3JfaW5mbyhzdHJ1Y3QgZTEwMF9zZXJpYWwgKiBpbmZvLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQogewogCXVuc2lnbmVkIGludCByZXN1bHQgPSBUSU9DU0VSX1RFTVQ7Ci0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJdW5zaWduZWQgbG9uZyBjdXJyX3RpbWUgPSBqaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcgY3Vycl90aW1lX3VzZWMgPSBHRVRfSklGRklFU19VU0VDKCk7CiAJdW5zaWduZWQgbG9uZyBlbGFwc2VkX3VzZWMgPQpAQCAtMzQ3NCw3ICszMzY3LDYgQEAKIAkgICAgZWxhcHNlZF91c2VjIDwgMippbmZvLT5jaGFyX3RpbWVfdXNlYykgewogCQlyZXN1bHQgPSAwOwogCX0KLSNlbmRpZgogCiAJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTM4MDQsNyArMzY5Niw2IEBACiAJZTEwMF9kaXNhYmxlX3NlcmlhbF9kYXRhX2lycShpbmZvKTsKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCiAJZTEwMF9kaXNhYmxlX3J4KGluZm8pOwogCWUxMDBfZGlzYWJsZV9yeF9pcnEoaW5mbyk7CiAKQEAgLTM4MTYsNyArMzcwNyw2IEBACiAJCSAqLwogCQlyc193YWl0X3VudGlsX3NlbnQodHR5LCBIWik7CiAJfQotI2VuZGlmCiAKIAlzaHV0ZG93bihpbmZvKTsKIAlyc19mbHVzaF9idWZmZXIodHR5KTsKQEAgLTQ0NzksNyArNDM2OSw2IEBACiAJZmFzdF90aW1lcl9pbml0KCk7CiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogI2lmbmRlZiBDT05GSUdfRVRSQVhfS0dEQgogCS8qIE5vdCBuZWVkZWQgaW4gc2ltdWxhdG9yLiAgTWF5IG9ubHkgY29tcGxpY2F0ZSBzdHVmZi4gKi8KIAkvKiBob29rIHRoZSBpcnEncyBmb3IgRE1BIGNoYW5uZWwgNiBhbmQgNywgc2VyaWFsIG91dHB1dCBhbmQgaW5wdXQsIGFuZCBzb21lIG1vcmUuLi4gKi8KQEAgLTQ0ODksNyArNDM3OCw2IEBACiAJCXBhbmljKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxOCIsIF9fZnVuY19fKTsKIAogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX1NWSU5UT19TSU0gKi8KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2VmbTMyLXVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9lZm0zMi11YXJ0LmMKaW5kZXggMGViNWI1Ni4uMDI4NTgyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2VmbTMyLXVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZWZtMzItdWFydC5jCkBAIC02NzEsNyArNjcxLDEwIEBACiAJaWYgKCFucCkKIAkJcmV0dXJuIDE7CiAKLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImxvY2F0aW9uIiwgJmxvY2F0aW9uKTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImVmbTMyLGxvY2F0aW9uIiwgJmxvY2F0aW9uKTsKKwlpZiAocmV0KQorCQkvKiBmYWxsIGJhY2sgdG8gb2xkIGFuZCAod3JvbmdseSkgZ2VuZXJpYyBwcm9wZXJ0eSAibG9jYXRpb24iICovCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibG9jYXRpb24iLCAmbG9jYXRpb24pOwogCWlmICghcmV0KSB7CiAJCWlmIChsb2NhdGlvbiA+IDUpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgbG9jYXRpb25cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKaW5kZXggODk3OGRjOWEuLmM1ZWI4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYwpAQCAtMTMsMTQgKzEzLDE5IEBACiAjZGVmaW5lIFNVUFBPUlRfU1lTUlEKICNlbmRpZgogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KIAogLyogQWxsIHJlZ2lzdGVycyBhcmUgOC1iaXQgd2lkdGggKi8KQEAgLTExMiw2ICsxMTcsMTAgQEAKICNkZWZpbmUgVUFSVFNGSUZPX1RYT0YJCTB4MDIKICNkZWZpbmUgVUFSVFNGSUZPX1JYVUYJCTB4MDEKIAorI2RlZmluZSBETUFfTUFYQlVSU1QJCTE2CisjZGVmaW5lIERNQV9NQVhCVVJTVF9NQVNLCShETUFfTUFYQlVSU1QgLSAxKQorI2RlZmluZSBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUJNjQKKwogI2RlZmluZSBEUklWRVJfTkFNRQkiZnNsLWxwdWFydCIKICNkZWZpbmUgREVWX05BTUUJInR0eUxQIgogI2RlZmluZSBVQVJUX05SCQk2CkBAIC0xMjEsNiArMTMwLDI0IEBACiAJc3RydWN0IGNsawkJKmNsazsKIAl1bnNpZ25lZCBpbnQJCXR4Zmlmb19zaXplOwogCXVuc2lnbmVkIGludAkJcnhmaWZvX3NpemU7CisKKwlib29sCQkJbHB1YXJ0X2RtYV91c2U7CisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3R4X2NoYW47CisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3J4X2NoYW47CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAqZG1hX3R4X2Rlc2M7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAqZG1hX3J4X2Rlc2M7CisJZG1hX2FkZHJfdAkJZG1hX3R4X2J1Zl9idXM7CisJZG1hX2FkZHJfdAkJZG1hX3J4X2J1Zl9idXM7CisJZG1hX2Nvb2tpZV90CQlkbWFfdHhfY29va2llOworCWRtYV9jb29raWVfdAkJZG1hX3J4X2Nvb2tpZTsKKwl1bnNpZ25lZCBjaGFyCQkqZG1hX3R4X2J1Zl92aXJ0OworCXVuc2lnbmVkIGNoYXIJCSpkbWFfcnhfYnVmX3ZpcnQ7CisJdW5zaWduZWQgaW50CQlkbWFfdHhfYnl0ZXM7CisJdW5zaWduZWQgaW50CQlkbWFfcnhfYnl0ZXM7CisJaW50CQkJZG1hX3R4X2luX3Byb2dyZXNzOworCWludAkJCWRtYV9yeF9pbl9wcm9ncmVzczsKKwl1bnNpZ25lZCBpbnQJCWRtYV9yeF90aW1lb3V0OworCXN0cnVjdCB0aW1lcl9saXN0CWxwdWFydF90aW1lcjsKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGxwdWFydF9kdF9pZHNbXSA9IHsKQEAgLTEzMSw2ICsxNTgsMTAgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBscHVhcnRfZHRfaWRzKTsKIAorLyogRm9yd2FyZCBkZWNsYXJlIHRoaXMgZm9yIHRoZSBkbWEgY2FsbGJhY2tzKi8KK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHhfY29tcGxldGUodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfY29tcGxldGUodm9pZCAqYXJnKTsKKwogc3RhdGljIHZvaWQgbHB1YXJ0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAl1bnNpZ25lZCBjaGFyIHRlbXA7CkBAIC0xNTIsNiArMTgzLDIxMCBAQAogewogfQogCitzdGF0aWMgdm9pZCBscHVhcnRfY29weV9yeF90b190dHkoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCwKKwkJc3RydWN0IHR0eV9wb3J0ICp0dHksIGludCBjb3VudCkKK3sKKwlpbnQgY29waWVkOworCisJc3BvcnQtPnBvcnQuaWNvdW50LnJ4ICs9IGNvdW50OworCisJaWYgKCF0dHkpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJObyB0dHkgcG9ydFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKKwkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwljb3BpZWQgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwKKwkJCSgodW5zaWduZWQgY2hhciAqKShzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0KSksIGNvdW50KTsKKworCWlmIChjb3BpZWQgIT0gY291bnQpIHsKKwkJV0FSTl9PTigxKTsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJSeERhdGEgY29weSB0byB0dHkgbGF5ZXIgZmFpbGVkXG4iKTsKKwl9CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKKwkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9waW9fdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJgorCQlyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFRDRklGTykgPCBzcG9ydC0+dHhmaWZvX3NpemUpIHsKKwkJd3JpdGViKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlREUik7CisJCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJCXNwb3J0LT5wb3J0Lmljb3VudC50eCsrOworCX0KKworCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKKworCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfCBVQVJUQ1I1X1RETUFTLAorCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGxwdWFydF9kbWFfdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CisJZG1hX2FkZHJfdCB0eF9idXNfYWRkcjsKKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV90eF9idWZfYnVzLAorCQkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwlzcG9ydC0+ZG1hX3R4X2J5dGVzID0gY291bnQgJiB+KERNQV9NQVhCVVJTVF9NQVNLKTsKKwl0eF9idXNfYWRkciA9IHNwb3J0LT5kbWFfdHhfYnVmX2J1cyArIHhtaXQtPnRhaWw7CisJc3BvcnQtPmRtYV90eF9kZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2luZ2xlKHNwb3J0LT5kbWFfdHhfY2hhbiwKKwkJCQkJdHhfYnVzX2FkZHIsIHNwb3J0LT5kbWFfdHhfYnl0ZXMsCisJCQkJCURNQV9NRU1fVE9fREVWLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCisJaWYgKCFzcG9ydC0+ZG1hX3R4X2Rlc2MpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJOb3QgYWJsZSB0byBnZXQgZGVzYyBmb3IgdHhcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcG9ydC0+ZG1hX3R4X2Rlc2MtPmNhbGxiYWNrID0gbHB1YXJ0X2RtYV90eF9jb21wbGV0ZTsKKwlzcG9ydC0+ZG1hX3R4X2Rlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3BvcnQ7CisJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDE7CisJc3BvcnQtPmRtYV90eF9jb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KHNwb3J0LT5kbWFfdHhfZGVzYyk7CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3BvcnQtPmRtYV90eF9jaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBscHVhcnRfcHJlcGFyZV90eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gIENJUkNfQ05UX1RPX0VORCh4bWl0LT5oZWFkLAorCQkJCQl4bWl0LT50YWlsLCBVQVJUX1hNSVRfU0laRSk7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm47CisKKwlpZiAoY291bnQgPCBETUFfTUFYQlVSU1QpCisJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgJiB+VUFSVENSNV9URE1BUywKKwkJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisJZWxzZSB7CisJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfCBVQVJUQ1I1X1RETUFTLAorCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwkJbHB1YXJ0X2RtYV90eChzcG9ydCwgY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eF9jb21wbGV0ZSh2b2lkICphcmcpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3R4X2Rlc2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIHNwb3J0LT5kbWFfdHhfYnl0ZXMpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDA7CisKKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKCZzcG9ydC0+cG9ydCk7CisKKwlscHVhcnRfcHJlcGFyZV90eChzcG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbHB1YXJ0X2RtYV9yeChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQoreworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAorCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwlzcG9ydC0+ZG1hX3J4X2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoc3BvcnQtPmRtYV9yeF9jaGFuLAorCQkJc3BvcnQtPmRtYV9yeF9idWZfYnVzLCBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsCisJCQlETUFfREVWX1RPX01FTSwgRE1BX1BSRVBfSU5URVJSVVBUKTsKKworCWlmICghc3BvcnQtPmRtYV9yeF9kZXNjKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiTm90IGFibGUgdG8gZ2V0IGRlc2MgZm9yIHJ4XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFjayA9IGxwdWFydF9kbWFfcnhfY29tcGxldGU7CisJc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFja19wYXJhbSA9IHNwb3J0OworCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAxOworCXNwb3J0LT5kbWFfcnhfY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHNwb3J0LT5kbWFfcnhfY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZSh2b2lkICphcmcpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAwOworCWxwdWFydF9jb3B5X3J4X3RvX3R0eShzcG9ydCwgcG9ydCwgRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFKTsKKwl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKKwlscHVhcnRfZG1hX3J4KHNwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X3RpbWVyX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGxwdWFydF9wb3J0ICopZGF0YTsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7CisJc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdGVtcDsKKwlpbnQgY291bnQ7CisKKwlkZWxfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIpOworCWRtYWVuZ2luZV9wYXVzZShzcG9ydC0+ZG1hX3J4X2NoYW4pOworCWRtYWVuZ2luZV90eF9zdGF0dXMoc3BvcnQtPmRtYV9yeF9jaGFuLCBzcG9ydC0+ZG1hX3J4X2Nvb2tpZSwgJnN0YXRlKTsKKwlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX3J4X2NoYW4pOworCWNvdW50ID0gRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFIC0gc3RhdGUucmVzaWR1ZTsKKwlhc3luY190eF9hY2soc3BvcnQtPmRtYV9yeF9kZXNjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMDsKKwlscHVhcnRfY29weV9yeF90b190dHkoc3BvcnQsIHBvcnQsIGNvdW50KTsKKwl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKKwl0ZW1wID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCXdyaXRlYih0ZW1wICYgflVBUlRDUjVfUkRNQVMsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxwdWFydF9wcmVwYXJlX3J4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHRlbXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCisJaW5pdF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lcik7CisJc3BvcnQtPmxwdWFydF90aW1lci5mdW5jdGlvbiA9IGxwdWFydF90aW1lcl9mdW5jOworCXNwb3J0LT5scHVhcnRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNwb3J0OworCXNwb3J0LT5scHVhcnRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzcG9ydC0+ZG1hX3J4X3RpbWVvdXQ7CisJYWRkX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKKworCWxwdWFydF9kbWFfcngoc3BvcnQpOworCXRlbXAgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisJd3JpdGViKHRlbXAgfCBVQVJUQ1I1X1JETUFTLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBscHVhcnRfdHJhbnNtaXRfYnVmZmVyKHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCiB7CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwpAQCAtMTcyLDE0ICs0MDcsMjEgQEAKIAogc3RhdGljIHZvaWQgbHB1YXJ0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT54bWl0OwogCXVuc2lnbmVkIGNoYXIgdGVtcDsKIAogCXRlbXAgPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVENSMik7CiAJd3JpdGViKHRlbXAgfCBVQVJUQ1IyX1RJRSwgcG9ydC0+bWVtYmFzZSArIFVBUlRDUjIpOwogCi0JaWYgKHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUU1IxKSAmIFVBUlRTUjFfVERSRSkKLQkJbHB1YXJ0X3RyYW5zbWl0X2J1ZmZlcihzcG9ydCk7CisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3VzZSkgeworCQlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJiAhc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcykKKwkJCWxwdWFydF9wcmVwYXJlX3R4KHNwb3J0KTsKKwl9IGVsc2UgeworCQlpZiAocmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRTUjEpICYgVUFSVFNSMV9URFJFKQorCQkJbHB1YXJ0X3RyYW5zbWl0X2J1ZmZlcihzcG9ydCk7CisJfQogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbHB1YXJ0X3R4aW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTI3OSwxMiArNTIxLDE5IEBACiAKIAlzdHMgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNSMSk7CiAKLQlpZiAoc3RzICYgVUFSVFNSMV9SRFJGKQotCQlscHVhcnRfcnhpbnQoaXJxLCBkZXZfaWQpOwotCisJaWYgKHN0cyAmIFVBUlRTUjFfUkRSRikgeworCQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdXNlKQorCQkJbHB1YXJ0X3ByZXBhcmVfcngoc3BvcnQpOworCQllbHNlCisJCQlscHVhcnRfcnhpbnQoaXJxLCBkZXZfaWQpOworCX0KIAlpZiAoc3RzICYgVUFSVFNSMV9URFJFICYmCi0JCSEocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpICYgVUFSVENSNV9URE1BUykpCi0JCWxwdWFydF90eGludChpcnEsIGRldl9pZCk7CisJCSEocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpICYgVUFSVENSNV9URE1BUykpIHsKKwkJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3VzZSkKKwkJCWxwdWFydF9waW9fdHgoc3BvcnQpOworCQllbHNlCisJCQlscHVhcnRfdHhpbnQoaXJxLCBkZXZfaWQpOworCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTM2NiwxMyArNjE1LDE1NiBAQAogCXdyaXRlYihVQVJUQ0ZJRk9fVFhGTFVTSCB8IFVBUlRDRklGT19SWEZMVVNILAogCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDRklGTyk7CiAKLQl3cml0ZWIoMiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRUV0ZJRk8pOworCXdyaXRlYigwLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFRXRklGTyk7CiAJd3JpdGViKDEsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUUldGSUZPKTsKIAogCS8qIFJlc3RvcmUgY3IyICovCiAJd3JpdGViKGNyMl9zYXZlZCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjIpOwogfQogCitzdGF0aWMgaW50IGxwdWFydF9kbWFfdHhfcmVxdWVzdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKnR4X2NoYW47CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3R4X3Njb25maWc7CisJZG1hX2FkZHJfdCBkbWFfYnVzOworCXVuc2lnbmVkIGNoYXIgKmRtYV9idWY7CisJaW50IHJldDsKKworCXR4X2NoYW4gID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChzcG9ydC0+cG9ydC5kZXYsICJ0eCIpOworCisJaWYgKCF0eF9jaGFuKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRG1hIHR4IGNoYW5uZWwgcmVxdWVzdCBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG1hX2J1cyA9IGRtYV9tYXBfc2luZ2xlKHR4X2NoYW4tPmRldmljZS0+ZGV2LAorCQkJCXNwb3J0LT5wb3J0LnN0YXRlLT54bWl0LmJ1ZiwKKwkJCQlVQVJUX1hNSVRfU0laRSwgRE1BX1RPX0RFVklDRSk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IodHhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idXMpKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiZG1hX21hcF9zaW5nbGUgdHggZmFpbGVkXG4iKTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbCh0eF9jaGFuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZG1hX2J1ZiA9IHNwb3J0LT5wb3J0LnN0YXRlLT54bWl0LmJ1ZjsKKwlkbWFfdHhfc2NvbmZpZy5kc3RfYWRkciA9IHNwb3J0LT5wb3J0Lm1hcGJhc2UgKyBVQVJURFI7CisJZG1hX3R4X3Njb25maWcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOworCWRtYV90eF9zY29uZmlnLmRzdF9tYXhidXJzdCA9IERNQV9NQVhCVVJTVDsKKwlkbWFfdHhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfTUVNX1RPX0RFVjsKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHR4X2NoYW4sICZkbWFfdHhfc2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKKwkJCQkiRG1hIHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHR4X2NoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXNwb3J0LT5kbWFfdHhfY2hhbiA9IHR4X2NoYW47CisJc3BvcnQtPmRtYV90eF9idWZfdmlydCA9IGRtYV9idWY7CisJc3BvcnQtPmRtYV90eF9idWZfYnVzID0gZG1hX2J1czsKKwlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwdWFydF9kbWFfcnhfcmVxdWVzdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKnJ4X2NoYW47CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3J4X3Njb25maWc7CisJZG1hX2FkZHJfdCBkbWFfYnVzOworCXVuc2lnbmVkIGNoYXIgKmRtYV9idWY7CisJaW50IHJldDsKKworCXJ4X2NoYW4gID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChzcG9ydC0+cG9ydC5kZXYsICJyeCIpOworCisJaWYgKCFyeF9jaGFuKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRG1hIHJ4IGNoYW5uZWwgcmVxdWVzdCBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG1hX2J1ZiA9IGRldm1fa3phbGxvYyhzcG9ydC0+cG9ydC5kZXYsCisJCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghZG1hX2J1ZikgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIkRtYSByeCBhbGxvYyBmYWlsZWRcbiIpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHJ4X2NoYW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbWFfYnVzID0gZG1hX21hcF9zaW5nbGUocnhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idWYsCisJCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHJ4X2NoYW4tPmRldmljZS0+ZGV2LCBkbWFfYnVzKSkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgImRtYV9tYXBfc2luZ2xlIHJ4IGZhaWxlZFxuIik7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwocnhfY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRtYV9yeF9zY29uZmlnLnNyY19hZGRyID0gc3BvcnQtPnBvcnQubWFwYmFzZSArIFVBUlREUjsKKwlkbWFfcnhfc2NvbmZpZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisJZG1hX3J4X3Njb25maWcuc3JjX21heGJ1cnN0ID0gMTsKKwlkbWFfcnhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfREVWX1RPX01FTTsKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHJ4X2NoYW4sICZkbWFfcnhfc2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKKwkJCQkiRG1hIHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKHJ4X2NoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXNwb3J0LT5kbWFfcnhfY2hhbiA9IHJ4X2NoYW47CisJc3BvcnQtPmRtYV9yeF9idWZfdmlydCA9IGRtYV9idWY7CisJc3BvcnQtPmRtYV9yeF9idWZfYnVzID0gZG1hX2J1czsKKwlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMDsKKworCXNwb3J0LT5kbWFfcnhfdGltZW91dCA9IChzcG9ydC0+cG9ydC50aW1lb3V0IC0gSFogLyA1MCkgKgorCQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSAqIDMgLworCQkJCXNwb3J0LT5yeGZpZm9fc2l6ZSAvIDI7CisKKwlpZiAoc3BvcnQtPmRtYV9yeF90aW1lb3V0IDwgbXNlY3NfdG9famlmZmllcygyMCkpCisJCXNwb3J0LT5kbWFfcnhfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHhfZnJlZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOworCisJZG1hX3VubWFwX3NpbmdsZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfdHhfYnVmX2J1cywKKwkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwlkbWFfY2hhbiA9IHNwb3J0LT5kbWFfdHhfY2hhbjsKKwlzcG9ydC0+ZG1hX3R4X2NoYW4gPSBOVUxMOworCXNwb3J0LT5kbWFfdHhfYnVmX2J1cyA9IDA7CisJc3BvcnQtPmRtYV90eF9idWZfdmlydCA9IE5VTEw7CisJZG1hX3JlbGVhc2VfY2hhbm5lbChkbWFfY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfZnJlZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOworCisJZG1hX3VubWFwX3NpbmdsZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKKwkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKworCWRtYV9jaGFuID0gc3BvcnQtPmRtYV9yeF9jaGFuOworCXNwb3J0LT5kbWFfcnhfY2hhbiA9IE5VTEw7CisJc3BvcnQtPmRtYV9yeF9idWZfYnVzID0gMDsKKwlzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0ID0gTlVMTDsKKwlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYV9jaGFuKTsKK30KKwogc3RhdGljIGludCBscHVhcnRfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKQEAgLTM4MCw2ICs3NzIsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgdGVtcDsKIAorCS8qd2hldGhlciB1c2UgZG1hIHN1cHBvcnQgYnkgZG1hIHJlcXVlc3QgcmVzdWx0cyovCisJaWYgKGxwdWFydF9kbWFfdHhfcmVxdWVzdChwb3J0KSB8fCBscHVhcnRfZG1hX3J4X3JlcXVlc3QocG9ydCkpIHsKKwkJc3BvcnQtPmxwdWFydF9kbWFfdXNlID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJc3BvcnQtPmxwdWFydF9kbWFfdXNlID0gdHJ1ZTsKKwkJdGVtcCA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwkJd3JpdGViKHRlbXAgfCBVQVJUQ1I1X1RETUFTLCBwb3J0LT5tZW1iYXNlICsgVUFSVENSNSk7CisJfQorCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShwb3J0LT5kZXYsIHBvcnQtPmlycSwgbHB1YXJ0X2ludCwgMCwKIAkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOwogCWlmIChyZXQpCkBAIC00MTQsNiArODE1LDExIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJZGV2bV9mcmVlX2lycShwb3J0LT5kZXYsIHBvcnQtPmlycSwgc3BvcnQpOworCisJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3VzZSkgeworCQlscHVhcnRfZG1hX3R4X2ZyZWUocG9ydCk7CisJCWxwdWFydF9kbWFfcnhfZnJlZShwb3J0KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKaW5kZXggZDc5OTE0MC4uM2I2YzFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwpAQCAtNDk2LDggKzQ5Niw3IEBACiAKIAlkZXZfZGJnKHNwb3J0LT5wb3J0LmRldiwgIndlIGZpbmlzaCB0aGUgVFggRE1BLlxuIik7CiAKLQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCi0JCXVhcnRfd3JpdGVfd2FrZXVwKCZzcG9ydC0+cG9ydCk7CisJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKIAogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZzcG9ydC0+ZG1hX3dhaXQpKSB7CiAJCXdha2VfdXAoJnNwb3J0LT5kbWFfd2FpdCk7CkBAIC0xMTE3LDI1ICsxMTE2LDI1IEBACiAJICovCiAJaWYgKHNwb3J0LT50eGlycSA+IDApIHsKIAkJcmV0dmFsID0gcmVxdWVzdF9pcnEoc3BvcnQtPnJ4aXJxLCBpbXhfcnhpbnQsIDAsCi0JCQkJRFJJVkVSX05BTUUsIHNwb3J0KTsKKwkJCQkgICAgIGRldl9uYW1lKHBvcnQtPmRldiksIHNwb3J0KTsKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gZXJyb3Jfb3V0MTsKIAogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzcG9ydC0+dHhpcnEsIGlteF90eGludCwgMCwKLQkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOworCQkJCSAgICAgZGV2X25hbWUocG9ydC0+ZGV2KSwgc3BvcnQpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBlcnJvcl9vdXQyOwogCiAJCS8qIGRvIG5vdCB1c2UgUlRTIElSUSBvbiBJckRBICovCiAJCWlmICghVVNFX0lSREEoc3BvcnQpKSB7CiAJCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzcG9ydC0+cnRzaXJxLCBpbXhfcnRzaW50LCAwLAotCQkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOworCQkJCQkgICAgIGRldl9uYW1lKHBvcnQtPmRldiksIHNwb3J0KTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBlcnJvcl9vdXQzOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gcmVxdWVzdF9pcnEoc3BvcnQtPnBvcnQuaXJxLCBpbXhfaW50LCAwLAotCQkJCURSSVZFUl9OQU1FLCBzcG9ydCk7CisJCQkJICAgICBkZXZfbmFtZShwb3J0LT5kZXYpLCBzcG9ydCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWZyZWVfaXJxKHNwb3J0LT5wb3J0LmlycSwgc3BvcnQpOwogCQkJZ290byBlcnJvcl9vdXQxOwpAQCAtMTQ3MCw0NCArMTQ2OSwxMyBAQAogfQogCiAvKgotICogUmVsZWFzZSB0aGUgbWVtb3J5IHJlZ2lvbihzKSBiZWluZyB1c2VkIGJ5ICdwb3J0Jy4KLSAqLwotc3RhdGljIHZvaWQgaW14X3JlbGVhc2VfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocG9ydC0+ZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1tcmVzOwotCi0JbW1yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtbXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobW1yZXMpKTsKLX0KLQotLyoKLSAqIFJlcXVlc3QgdGhlIG1lbW9yeSByZWdpb24ocykgYmVpbmcgdXNlZCBieSAncG9ydCcuCi0gKi8KLXN0YXRpYyBpbnQgaW14X3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocG9ydC0+ZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1tcmVzOwotCXZvaWQgKnJldDsKLQotCW1tcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIW1tcmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldCA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtbXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobW1yZXMpLCAiaW14LXVhcnQiKTsKLQotCXJldHVybiAgcmV0ID8gMCA6IC1FQlVTWTsKLX0KLQotLyoKICAqIENvbmZpZ3VyZS9hdXRvY29uZmlndXJlIHRoZSBwb3J0LgogICovCiBzdGF0aWMgdm9pZCBpbXhfY29uZmlnX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBpbXhfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGlteF9wb3J0ICopcG9ydDsKIAotCWlmIChmbGFncyAmIFVBUlRfQ09ORklHX1RZUEUgJiYKLQkgICAgaW14X3JlcXVlc3RfcG9ydCgmc3BvcnQtPnBvcnQpID09IDApCisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkKIAkJc3BvcnQtPnBvcnQudHlwZSA9IFBPUlRfSU1YOwogfQogCkBAIC0xNjE3LDggKzE1ODUsNiBAQAogCS5mbHVzaF9idWZmZXIJPSBpbXhfZmx1c2hfYnVmZmVyLAogCS5zZXRfdGVybWlvcwk9IGlteF9zZXRfdGVybWlvcywKIAkudHlwZQkJPSBpbXhfdHlwZSwKLQkucmVsZWFzZV9wb3J0CT0gaW14X3JlbGVhc2VfcG9ydCwKLQkucmVxdWVzdF9wb3J0CT0gaW14X3JlcXVlc3RfcG9ydCwKIAkuY29uZmlnX3BvcnQJPSBpbXhfY29uZmlnX3BvcnQsCiAJLnZlcmlmeV9wb3J0CT0gaW14X3ZlcmlmeV9wb3J0LAogI2lmIGRlZmluZWQoQ09ORklHX0NPTlNPTEVfUE9MTCkKQEAgLTE5MzUsNyArMTkwMSw2IEBACiBzdGF0aWMgaW50IHNlcmlhbF9pbXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0OwotCXN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTE5NTEsMTIgKzE5MTYsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQliYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIFBBR0VfU0laRSk7Ci0JaWYgKCFiYXNlKQotCQlyZXR1cm4gLUVOT01FTTsKKwliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihiYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CiAKIAlzcG9ydC0+cG9ydC5kZXYgPSAmcGRldi0+ZGV2OwogCXNwb3J0LT5wb3J0Lm1hcGJhc2UgPSByZXMtPnN0YXJ0OwpAQCAtMTk5MiwzOCArMTk1NCwxNiBAQAogCiAJaW14X3BvcnRzW3Nwb3J0LT5wb3J0LmxpbmVdID0gc3BvcnQ7CiAKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5pbml0KSB7Ci0JCXJldCA9IHBkYXRhLT5pbml0KHBkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmaW14X3JlZywgJnNwb3J0LT5wb3J0KTsKLQlpZiAocmV0KQotCQlnb3RvIGRlaW5pdDsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzcG9ydCk7CiAKLQlyZXR1cm4gMDsKLWRlaW5pdDoKLQlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCi0JCXBkYXRhLT5leGl0KHBkZXYpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHVhcnRfYWRkX29uZV9wb3J0KCZpbXhfcmVnLCAmc3BvcnQtPnBvcnQpOwogfQogCiBzdGF0aWMgaW50IHNlcmlhbF9pbXhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCi0JdWFydF9yZW1vdmVfb25lX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7Ci0KLQlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCi0JCXBkYXRhLT5leGl0KHBkZXYpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHVhcnRfcmVtb3ZlX29uZV9wb3J0KCZpbXhfcmVnLCAmc3BvcnQtPnBvcnQpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZXJpYWxfaW14X2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEweC5jCmluZGV4IDhkNzFlNDAuLjJhOTlkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgTWF4aW0gKERhbGxhcykgTUFYMzEwNy84LzksIE1BWDE0ODMwIHNlcmlhbCBkcml2ZXIKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgQWxleGFuZGVyIFNoaXlhbiA8c2hjX3dvcmtAbWFpbC5ydT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBBbGV4YW5kZXIgU2hpeWFuIDxzaGNfd29ya0BtYWlsLnJ1PgogICoKICAqICBCYXNlZCBvbiBtYXgzMTAwLmMsIGJ5IENocmlzdGlhbiBQZWxsZWdyaW4gPGNocmlwZWxsQGV2b2x3YXJlLm9yZz4KICAqICBCYXNlZCBvbiBtYXgzMTEwLmMsIGJ5IEZlbmcgVGFuZyA8ZmVuZy50YW5nQGludGVsLmNvbT4KQEAgLTEzLDE5ICsxMywyMSBAQAogICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL21heDMxMHguaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNkZWZpbmUgTUFYMzEwWF9OQU1FCQkJIm1heDMxMHgiCiAjZGVmaW5lIE1BWDMxMFhfTUFKT1IJCQkyMDQKQEAgLTE2MSwxMCArMTYzLDYgQEAKIC8qIElSREEgcmVnaXN0ZXIgYml0cyAqLwogI2RlZmluZSBNQVgzMTBYX0lSREFfSVJEQUVOX0JJVAkJKDEgPDwgMCkgLyogSVJEQSBtb2RlIGVuYWJsZSAqLwogI2RlZmluZSBNQVgzMTBYX0lSREFfU0lSX0JJVAkJKDEgPDwgMSkgLyogU0lSIG1vZGUgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfSVJEQV9TSE9SVElSX0JJVAkoMSA8PCAyKSAvKiBTaG9ydCBTSVIgbW9kZSBlbmFibGUgKi8KLSNkZWZpbmUgTUFYMzEwWF9JUkRBX01JUl9CSVQJCSgxIDw8IDMpIC8qIE1JUiBtb2RlIGVuYWJsZSAqLwotI2RlZmluZSBNQVgzMTBYX0lSREFfUlhJTlZfQklUCQkoMSA8PCA0KSAvKiBSWCBsb2dpYyBpbnZlcnNpb24gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfSVJEQV9UWElOVl9CSVQJCSgxIDw8IDUpIC8qIFRYIGxvZ2ljIGludmVyc2lvbiBlbmFibGUgKi8KIAogLyogRmxvdyBjb250cm9sIHRyaWdnZXIgbGV2ZWwgcmVnaXN0ZXIgbWFza3MgKi8KICNkZWZpbmUgTUFYMzEwWF9GTE9XTFZMX0hBTFRfTUFTSwkoMHgwMDBmKSAvKiBGbG93IGNvbnRyb2wgaGFsdCBsZXZlbCAqLwpAQCAtMjIwLDI2ICsyMTgsNiBAQAogCQkJCQkJICAqICAgICAgIFhPRkYyCiAJCQkJCQkgICovCiAKLS8qIEdQSU8gY29uZmlndXJhdGlvbiByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDBPVVRfQklUCSgxIDw8IDApIC8qIEdQSU8gMCBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDFPVVRfQklUCSgxIDw8IDEpIC8qIEdQSU8gMSBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDJPVVRfQklUCSgxIDw8IDIpIC8qIEdQSU8gMiBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDNPVVRfQklUCSgxIDw8IDMpIC8qIEdQSU8gMyBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDBPRF9CSVQJKDEgPDwgNCkgLyogR1BJTyAwIG9wZW4tZHJhaW4gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDFPRF9CSVQJKDEgPDwgNSkgLyogR1BJTyAxIG9wZW4tZHJhaW4gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDJPRF9CSVQJKDEgPDwgNikgLyogR1BJTyAyIG9wZW4tZHJhaW4gZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0NGR19HUDNPRF9CSVQJKDEgPDwgNykgLyogR1BJTyAzIG9wZW4tZHJhaW4gZW5hYmxlICovCi0KLS8qIEdQSU8gREFUQSByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AwT1VUX0JJVAkoMSA8PCAwKSAvKiBHUElPIDAgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AxT1VUX0JJVAkoMSA8PCAxKSAvKiBHUElPIDEgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AyT1VUX0JJVAkoMSA8PCAyKSAvKiBHUElPIDIgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AzT1VUX0JJVAkoMSA8PCAzKSAvKiBHUElPIDMgb3V0cHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AwSU5fQklUCSgxIDw8IDQpIC8qIEdQSU8gMCBpbnB1dCB2YWx1ZSAqLwotI2RlZmluZSBNQVgzMTBYX0dQSU9EQVRBX0dQMUlOX0JJVAkoMSA8PCA1KSAvKiBHUElPIDEgaW5wdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUFYMzEwWF9HUElPREFUQV9HUDJJTl9CSVQJKDEgPDwgNikgLyogR1BJTyAyIGlucHV0IHZhbHVlICovCi0jZGVmaW5lIE1BWDMxMFhfR1BJT0RBVEFfR1AzSU5fQklUCSgxIDw8IDcpIC8qIEdQSU8gMyBpbnB1dCB2YWx1ZSAqLwotCiAvKiBQTEwgY29uZmlndXJhdGlvbiByZWdpc3RlciBtYXNrcyAqLwogI2RlZmluZSBNQVgzMTBYX1BMTENGR19QUkVESVZfTUFTSwkoMHgzZikgLyogUExMIHByZWRpdmlzaW9uIHZhbHVlICovCiAjZGVmaW5lIE1BWDMxMFhfUExMQ0ZHX1BMTEZBQ1RPUl9NQVNLCSgweGMwKSAvKiBQTEwgbXVsdGlwbGljYXRpb24gZmFjdG9yICovCkBAIC0yODMsMTYgKzI2MSwxNSBAQAogc3RydWN0IG1heDMxMHhfb25lIHsKIAlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CiAJc3RydWN0IHdvcmtfc3RydWN0CXR4X3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CW1kX3dvcms7CiB9OwogCiBzdHJ1Y3QgbWF4MzEweF9wb3J0IHsKIAlzdHJ1Y3QgdWFydF9kcml2ZXIJdWFydDsKIAlzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlCSpkZXZ0eXBlOwogCXN0cnVjdCByZWdtYXAJCSpyZWdtYXA7Ci0Jc3RydWN0IHJlZ21hcF9jb25maWcJcmVnY2ZnOwogCXN0cnVjdCBtdXRleAkJbXV0ZXg7Ci0Jc3RydWN0IG1heDMxMHhfcGRhdGEJKnBkYXRhOwotCWludAkJCWdwaW9fdXNlZDsKKwlzdHJ1Y3QgY2xrCQkqY2xrOwogI2lmZGVmIENPTkZJR19HUElPTElCCiAJc3RydWN0IGdwaW9fY2hpcAlncGlvOwogI2VuZGlmCkBAIC01MDQsMjUgKzQ4MSwzMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgbWF4MzEweF9zZXRfYmF1ZChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYmF1ZCkKK3N0YXRpYyBpbnQgbWF4MzEweF9zZXRfYmF1ZChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYmF1ZCkKIHsKLQl1bnNpZ25lZCBpbnQgbW9kZSA9IDAsIGRpdiA9IHBvcnQtPnVhcnRjbGsgLyBiYXVkOworCXVuc2lnbmVkIGludCBtb2RlID0gMCwgY2xrID0gcG9ydC0+dWFydGNsaywgZGl2ID0gY2xrIC8gYmF1ZDsKIAotCWlmICghKGRpdiAvIDE2KSkgeworCS8qIENoZWNrIGZvciBtaW5pbWFsIHZhbHVlIGZvciBkaXZpZGVyICovCisJaWYgKGRpdiA8IDE2KQorCQlkaXYgPSAxNjsKKworCWlmIChjbGsgJSBiYXVkICYmIChkaXYgLyAxNikgPCAweDgwMDApIHsKIAkJLyogTW9kZSB4MiAqLwogCQltb2RlID0gTUFYMzEwWF9CUkdDRkdfMlhNT0RFX0JJVDsKLQkJZGl2ID0gKHBvcnQtPnVhcnRjbGsgKiAyKSAvIGJhdWQ7Ci0JfQorCQljbGsgPSBwb3J0LT51YXJ0Y2xrICogMjsKKwkJZGl2ID0gY2xrIC8gYmF1ZDsKIAotCWlmICghKGRpdiAvIDE2KSkgewotCQkvKiBNb2RlIHg0ICovCi0JCW1vZGUgPSBNQVgzMTBYX0JSR0NGR180WE1PREVfQklUOwotCQlkaXYgPSAocG9ydC0+dWFydGNsayAqIDQpIC8gYmF1ZDsKKwkJaWYgKGNsayAlIGJhdWQgJiYgKGRpdiAvIDE2KSA8IDB4ODAwMCkgeworCQkJLyogTW9kZSB4NCAqLworCQkJbW9kZSA9IE1BWDMxMFhfQlJHQ0ZHXzRYTU9ERV9CSVQ7CisJCQljbGsgPSBwb3J0LT51YXJ0Y2xrICogNDsKKwkJCWRpdiA9IGNsayAvIGJhdWQ7CisJCX0KIAl9CiAKIAltYXgzMTB4X3BvcnRfd3JpdGUocG9ydCwgTUFYMzEwWF9CUkdESVZNU0JfUkVHLCAoZGl2IC8gMTYpID4+IDgpOwogCW1heDMxMHhfcG9ydF93cml0ZShwb3J0LCBNQVgzMTBYX0JSR0RJVkxTQl9SRUcsIGRpdiAvIDE2KTsKIAltYXgzMTB4X3BvcnRfd3JpdGUocG9ydCwgTUFYMzEwWF9CUkdDRkdfUkVHLCAoZGl2ICUgMTYpIHwgbW9kZSk7CisKKwlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QoY2xrLCBkaXYpOwogfQogCiBzdGF0aWMgaW50IG1heDMxMHhfdXBkYXRlX2Jlc3RfZXJyKHVuc2lnbmVkIGxvbmcgZiwgbG9uZyAqYmVzdGVycikKQEAgLTUzOCwxOCArNTIzLDE5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgbWF4MzEweF9zZXRfcmVmX2NsayhzdHJ1Y3QgbWF4MzEweF9wb3J0ICpzKQorc3RhdGljIGludCBtYXgzMTB4X3NldF9yZWZfY2xrKHN0cnVjdCBtYXgzMTB4X3BvcnQgKnMsIHVuc2lnbmVkIGxvbmcgZnJlcSwKKwkJCSAgICAgICBib29sIHh0YWwpCiB7CiAJdW5zaWduZWQgaW50IGRpdiwgY2xrc3JjLCBwbGxjZmcgPSAwOwogCWxvbmcgYmVzdGVyciA9IC0xOwotCXVuc2lnbmVkIGxvbmcgZmRpdiwgZm11bCwgYmVzdGZyZXEgPSBzLT5wZGF0YS0+ZnJlcXVlbmN5OworCXVuc2lnbmVkIGxvbmcgZmRpdiwgZm11bCwgYmVzdGZyZXEgPSBmcmVxOwogCiAJLyogRmlyc3QsIHVwZGF0ZSBlcnJvciB3aXRob3V0IFBMTCAqLwotCW1heDMxMHhfdXBkYXRlX2Jlc3RfZXJyKHMtPnBkYXRhLT5mcmVxdWVuY3ksICZiZXN0ZXJyKTsKKwltYXgzMTB4X3VwZGF0ZV9iZXN0X2VycihmcmVxLCAmYmVzdGVycik7CiAKIAkvKiBUcnkgYWxsIHBvc3NpYmxlIFBMTCBkaXZpZGVycyAqLwogCWZvciAoZGl2ID0gMTsgKGRpdiA8PSA2MykgJiYgYmVzdGVycjsgZGl2KyspIHsKLQkJZmRpdiA9IERJVl9ST1VORF9DTE9TRVNUKHMtPnBkYXRhLT5mcmVxdWVuY3ksIGRpdik7CisJCWZkaXYgPSBESVZfUk9VTkRfQ0xPU0VTVChmcmVxLCBkaXYpOwogCiAJCS8qIFRyeSBtdWx0aXBsaWVyIDYgKi8KIAkJZm11bCA9IGZkaXYgKiA2OwpAQCAtNTgyLDEwICs1NjgsNyBAQAogCX0KIAogCS8qIENvbmZpZ3VyZSBjbG9jayBzb3VyY2UgKi8KLQlpZiAocy0+cGRhdGEtPmRyaXZlcl9mbGFncyAmIE1BWDMxMFhfRVhUX0NMSykKLQkJY2xrc3JjID0gTUFYMzEwWF9DTEtTUkNfRVhUQ0xLX0JJVDsKLQllbHNlCi0JCWNsa3NyYyA9IE1BWDMxMFhfQ0xLU1JDX0NSWVNUX0JJVDsKKwljbGtzcmMgPSB4dGFsID8gTUFYMzEwWF9DTEtTUkNfQ1JZU1RfQklUIDogTUFYMzEwWF9DTEtTUkNfRVhUQ0xLX0JJVDsKIAogCS8qIENvbmZpZ3VyZSBQTEwgKi8KIAlpZiAocGxsY2ZnKSB7CkBAIC01OTcsNyArNTgwLDcgQEAKIAlyZWdtYXBfd3JpdGUocy0+cmVnbWFwLCBNQVgzMTBYX0NMS1NSQ19SRUcsIGNsa3NyYyk7CiAKIAkvKiBXYWl0IGZvciBjcnlzdGFsICovCi0JaWYgKHBsbGNmZyAmJiAhKHMtPnBkYXRhLT5kcml2ZXJfZmxhZ3MgJiBNQVgzMTBYX0VYVF9DTEspKQorCWlmIChwbGxjZmcgJiYgeHRhbCkKIAkJbXNsZWVwKDEwKTsKIAogCXJldHVybiAoaW50KWJlc3RmcmVxOwpAQCAtNzgyLDExICs3NjUsMjEgQEAKIAlyZXR1cm4gVElPQ01fRFNSIHwgVElPQ01fQ0FSOwogfQogCitzdGF0aWMgdm9pZCBtYXgzMTB4X21kX3Byb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlzdHJ1Y3QgbWF4MzEweF9vbmUgKm9uZSA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IG1heDMxMHhfb25lLCBtZF93b3JrKTsKKworCW1heDMxMHhfcG9ydF91cGRhdGUoJm9uZS0+cG9ydCwgTUFYMzEwWF9NT0RFMl9SRUcsCisJCQkgICAgTUFYMzEwWF9NT0RFMl9MT09QQkFDS19CSVQsCisJCQkgICAgKG9uZS0+cG9ydC5tY3RybCAmIFRJT0NNX0xPT1ApID8KKwkJCSAgICBNQVgzMTBYX01PREUyX0xPT1BCQUNLX0JJVCA6IDApOworfQorCiBzdGF0aWMgdm9pZCBtYXgzMTB4X3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCiB7Ci0JLyogRENEIGFuZCBEU1IgYXJlIG5vdCB3aXJlZCBhbmQgQ1RTL1JUUyBpcyBoYWRubGVkIGF1dG9tYXRpY2FsbHkKLQkgKiBzbyBkbyBub3RoaW5nCi0JICovCisJc3RydWN0IG1heDMxMHhfb25lICpvbmUgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG1heDMxMHhfb25lLCBwb3J0KTsKKworCXNjaGVkdWxlX3dvcmsoJm9uZS0+bWRfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIG1heDMxMHhfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKQEAgLTg3NSw0MCArODY4LDc2IEBACiAJCQkJICBwb3J0LT51YXJ0Y2xrIC8gNCk7CiAKIAkvKiBTZXR1cCBiYXVkcmF0ZSBnZW5lcmF0b3IgKi8KLQltYXgzMTB4X3NldF9iYXVkKHBvcnQsIGJhdWQpOworCWJhdWQgPSBtYXgzMTB4X3NldF9iYXVkKHBvcnQsIGJhdWQpOwogCiAJLyogVXBkYXRlIHRpbWVvdXQgYWNjb3JkaW5nIHRvIG5ldyBiYXVkIHJhdGUgKi8KIAl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwogfQogCitzdGF0aWMgaW50IG1heDMxMHhfaW9jdGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyNpZiBkZWZpbmVkKFRJT0NTUlM0ODUpICYmIGRlZmluZWQoVElPQ0dSUzQ4NSkKKwlzdHJ1Y3Qgc2VyaWFsX3JzNDg1IHJzNDg1OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ1NSUzQ4NToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyczQ4NSwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YocnM0ODUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocnM0ODUuZGVsYXlfcnRzX2JlZm9yZV9zZW5kID4gMHgwZiB8fAorCQkgICAgcnM0ODUuZGVsYXlfcnRzX2FmdGVyX3NlbmQgPiAweDBmKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCXZhbCA9IChyczQ4NS5kZWxheV9ydHNfYmVmb3JlX3NlbmQgPDwgNCkgfAorCQkgICAgICByczQ4NS5kZWxheV9ydHNfYWZ0ZXJfc2VuZDsKKwkJbWF4MzEweF9wb3J0X3dyaXRlKHBvcnQsIE1BWDMxMFhfSERQSVhERUxBWV9SRUcsIHZhbCk7CisJCWlmIChyczQ4NS5mbGFncyAmIFNFUl9SUzQ4NV9FTkFCTEVEKSB7CisJCQltYXgzMTB4X3BvcnRfdXBkYXRlKHBvcnQsIE1BWDMxMFhfTU9ERTFfUkVHLAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMV9UUk5TQ1ZDVFJMX0JJVCwKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQpOworCQkJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUyX1JFRywKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTJfRUNIT1NVUFJfQklULAorCQkJCQkgICAgTUFYMzEwWF9NT0RFMl9FQ0hPU1VQUl9CSVQpOworCQl9IGVsc2UgeworCQkJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUxX1JFRywKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQsIDApOworCQkJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUyX1JFRywKKwkJCQkJICAgIE1BWDMxMFhfTU9ERTJfRUNIT1NVUFJfQklULCAwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIFRJT0NHUlM0ODU6CisJCW1lbXNldCgmcnM0ODUsIDAsIHNpemVvZihyczQ4NSkpOworCQl2YWwgPSBtYXgzMTB4X3BvcnRfcmVhZChwb3J0LCBNQVgzMTBYX01PREUxX1JFRyk7CisJCXJzNDg1LmZsYWdzID0gKHZhbCAmIE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQpID8KKwkJCSAgICAgIFNFUl9SUzQ4NV9FTkFCTEVEIDogMDsKKwkJcnM0ODUuZmxhZ3MgfD0gU0VSX1JTNDg1X1JUU19PTl9TRU5EOworCQl2YWwgPSBtYXgzMTB4X3BvcnRfcmVhZChwb3J0LCBNQVgzMTBYX0hEUElYREVMQVlfUkVHKTsKKwkJcnM0ODUuZGVsYXlfcnRzX2JlZm9yZV9zZW5kID0gdmFsID4+IDQ7CisJCXJzNDg1LmRlbGF5X3J0c19hZnRlcl9zZW5kID0gdmFsICYgMHgwZjsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZyczQ4NSwgc2l6ZW9mKHJzNDg1KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCiBzdGF0aWMgaW50IG1heDMxMHhfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXVuc2lnbmVkIGludCB2YWwsIGxpbmUgPSBwb3J0LT5saW5lOwogCXN0cnVjdCBtYXgzMTB4X3BvcnQgKnMgPSBkZXZfZ2V0X2RydmRhdGEocG9ydC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmFsOwogCiAJcy0+ZGV2dHlwZS0+cG93ZXIocG9ydCwgMSk7CiAKLQkvKiBDb25maWd1cmUgYmF1ZCByYXRlLCA5NjAwIGFzIGRlZmF1bHQgKi8KLQltYXgzMTB4X3NldF9iYXVkKHBvcnQsIDk2MDApOwotCi0JLyogQ29uZmlndXJlIExDUiByZWdpc3RlciwgOE4xIG1vZGUgYnkgZGVmYXVsdCAqLwotCW1heDMxMHhfcG9ydF93cml0ZShwb3J0LCBNQVgzMTBYX0xDUl9SRUcsIE1BWDMxMFhfTENSX1dPUkRfTEVOXzgpOwotCiAJLyogQ29uZmlndXJlIE1PREUxIHJlZ2lzdGVyICovCiAJbWF4MzEweF9wb3J0X3VwZGF0ZShwb3J0LCBNQVgzMTBYX01PREUxX1JFRywKLQkJCSAgICBNQVgzMTBYX01PREUxX1RSTlNDVkNUUkxfQklULAotCQkJICAgIChzLT5wZGF0YS0+dWFydF9mbGFnc1tsaW5lXSAmIE1BWDMxMFhfQVVUT19ESVJfQ1RSTCkKLQkJCSAgICA/IE1BWDMxMFhfTU9ERTFfVFJOU0NWQ1RSTF9CSVQgOiAwKTsKKwkJCSAgICBNQVgzMTBYX01PREUxX1RSTlNDVkNUUkxfQklULCAwKTsKIAotCS8qIENvbmZpZ3VyZSBNT0RFMiByZWdpc3RlciAqLwotCXZhbCA9IE1BWDMxMFhfTU9ERTJfUlhFTVBUSU5WX0JJVDsKLQlpZiAocy0+cGRhdGEtPnVhcnRfZmxhZ3NbbGluZV0gJiBNQVgzMTBYX0xPT1BCQUNLKQotCQl2YWwgfD0gTUFYMzEwWF9NT0RFMl9MT09QQkFDS19CSVQ7Ci0JaWYgKHMtPnBkYXRhLT51YXJ0X2ZsYWdzW2xpbmVdICYgTUFYMzEwWF9FQ0hPX1NVUFJFU1MpCi0JCXZhbCB8PSBNQVgzMTBYX01PREUyX0VDSE9TVVBSX0JJVDsKLQotCS8qIFJlc2V0IEZJRk9zICovCi0JdmFsIHw9IE1BWDMxMFhfTU9ERTJfRklGT1JTVF9CSVQ7CisJLyogQ29uZmlndXJlIE1PREUyIHJlZ2lzdGVyICYgUmVzZXQgRklGT3MqLworCXZhbCA9IE1BWDMxMFhfTU9ERTJfUlhFTVBUSU5WX0JJVCB8IE1BWDMxMFhfTU9ERTJfRklGT1JTVF9CSVQ7CiAJbWF4MzEweF9wb3J0X3dyaXRlKHBvcnQsIE1BWDMxMFhfTU9ERTJfUkVHLCB2YWwpOwogCW1heDMxMHhfcG9ydF91cGRhdGUocG9ydCwgTUFYMzEwWF9NT0RFMl9SRUcsCiAJCQkgICAgTUFYMzEwWF9NT0RFMl9GSUZPUlNUX0JJVCwgMCk7CkBAIC05ODksNiArMTAxOCw3IEBACiAJLnJlbGVhc2VfcG9ydAk9IG1heDMxMHhfbnVsbF92b2lkLAogCS5jb25maWdfcG9ydAk9IG1heDMxMHhfY29uZmlnX3BvcnQsCiAJLnZlcmlmeV9wb3J0CT0gbWF4MzEweF92ZXJpZnlfcG9ydCwKKwkuaW9jdGwJCT0gbWF4MzEweF9pb2N0bCwKIH07CiAKIHN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbWF4MzEweF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTEwMTcsNiArMTA0Nyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtYXgzMTB4X3BtX29wcywgbWF4MzEweF9zdXNwZW5kLCBtYXgzMTB4X3Jlc3VtZSk7CisKICNpZmRlZiBDT05GSUdfR1BJT0xJQgogc3RhdGljIGludCBtYXgzMTB4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKQEAgLTEwNjMsMjMgKzEwOTUsMTYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG1heDMxMHhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaXNfc3BpLAotCQkJIHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKmRldnR5cGUsIGludCBpcnEpCitzdGF0aWMgaW50IG1heDMxMHhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICpkZXZ0eXBlLAorCQkJIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50IGlycSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKKwlpbnQgaSwgcmV0LCBmbWluLCBmbWF4LCBmcmVxLCB1YXJ0Y2xrOworCXN0cnVjdCBjbGsgKmNsa19vc2MsICpjbGtfeHRhbDsKIAlzdHJ1Y3QgbWF4MzEweF9wb3J0ICpzOwotCXN0cnVjdCBtYXgzMTB4X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKLQlpbnQgaSwgcmV0LCB1YXJ0Y2xrOworCWJvb2wgeHRhbCA9IGZhbHNlOwogCi0JLyogQ2hlY2sgZm9yIElSUSAqLwotCWlmIChpcnEgPD0gMCkgewotCQlkZXZfZXJyKGRldiwgIk5vIElSUSBzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCX0KLQotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycihkZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKIAogCS8qIEFsbG9jIHBvcnQgc3RydWN0dXJlICovCiAJcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcykgKwpAQCAtMTA4OSw1MiArMTExNCw0NCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiBDaGVjayBpbnB1dCBmcmVxdWVuY3kgKi8KLQlpZiAoKHBkYXRhLT5kcml2ZXJfZmxhZ3MgJiBNQVgzMTBYX0VYVF9DTEspICYmCi0JICAgKChwZGF0YS0+ZnJlcXVlbmN5IDwgNTAwMDAwKSB8fCAocGRhdGEtPmZyZXF1ZW5jeSA+IDM1MDAwMDAwKSkpCi0JCWdvdG8gZXJyX2ZyZXE7Ci0JLyogQ2hlY2sgZnJlcXVlbmN5IGZvciBxdWFydHogKi8KLQlpZiAoIShwZGF0YS0+ZHJpdmVyX2ZsYWdzICYgTUFYMzEwWF9FWFRfQ0xLKSAmJgotCSAgICgocGRhdGEtPmZyZXF1ZW5jeSA8IDEwMDAwMDApIHx8IChwZGF0YS0+ZnJlcXVlbmN5ID4gNDAwMDAwMCkpKQotCQlnb3RvIGVycl9mcmVxOwotCi0Jcy0+cGRhdGEgPSBwZGF0YTsKLQlzLT5kZXZ0eXBlID0gZGV2dHlwZTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBzKTsKLQotCW11dGV4X2luaXQoJnMtPm11dGV4KTsKLQotCS8qIFNldHVwIHJlZ21hcCAqLwotCXMtPnJlZ2NmZy5yZWdfYml0cwkJPSA4OwotCXMtPnJlZ2NmZy52YWxfYml0cwkJPSA4OwotCXMtPnJlZ2NmZy5yZWFkX2ZsYWdfbWFzawk9IDB4MDA7Ci0Jcy0+cmVnY2ZnLndyaXRlX2ZsYWdfbWFzawk9IDB4ODA7Ci0Jcy0+cmVnY2ZnLmNhY2hlX3R5cGUJCT0gUkVHQ0FDSEVfUkJUUkVFOwotCXMtPnJlZ2NmZy53cml0ZWFibGVfcmVnCQk9IG1heDMxMHhfcmVnX3dyaXRlYWJsZTsKLQlzLT5yZWdjZmcudm9sYXRpbGVfcmVnCQk9IG1heDMxMHhfcmVnX3ZvbGF0aWxlOwotCXMtPnJlZ2NmZy5wcmVjaW91c19yZWcJCT0gbWF4MzEweF9yZWdfcHJlY2lvdXM7Ci0Jcy0+cmVnY2ZnLm1heF9yZWdpc3RlcgkJPSBkZXZ0eXBlLT5uciAqIDB4MjAgLSAxOwotCi0JaWYgKElTX0VOQUJMRUQoQ09ORklHX1NQSV9NQVNURVIpICYmIGlzX3NwaSkgewotCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCi0JCXMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJnMtPnJlZ2NmZyk7Ci0JfSBlbHNlCi0JCXJldHVybiAtRU5PVFNVUFA7Ci0KLQlpZiAoSVNfRVJSKHMtPnJlZ21hcCkpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZWdpc3RlciBtYXBcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihzLT5yZWdtYXApOworCWNsa19vc2MgPSBkZXZtX2Nsa19nZXQoZGV2LCAib3NjIik7CisJY2xrX3h0YWwgPSBkZXZtX2Nsa19nZXQoZGV2LCAieHRhbCIpOworCWlmICghSVNfRVJSKGNsa19vc2MpKSB7CisJCXMtPmNsayA9IGNsa19vc2M7CisJCWZtaW4gPSA1MDAwMDA7CisJCWZtYXggPSAzNTAwMDAwMDsKKwl9IGVsc2UgaWYgKCFJU19FUlIoY2xrX3h0YWwpKSB7CisJCXMtPmNsayA9IGNsa194dGFsOworCQlmbWluID0gMTAwMDAwMDsKKwkJZm1heCA9IDQwMDAwMDA7CisJCXh0YWwgPSB0cnVlOworCX0gZWxzZSBpZiAoUFRSX0VSUihjbGtfb3NjKSA9PSAtRVBST0JFX0RFRkVSIHx8CisJCSAgIFBUUl9FUlIoY2xrX3h0YWwpID09IC1FUFJPQkVfREVGRVIpIHsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogQm9hcmQgc3BlY2lmaWMgY29uZmlndXJlICovCi0JaWYgKHMtPnBkYXRhLT5pbml0KQotCQlzLT5wZGF0YS0+aW5pdCgpOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmcmVxID0gY2xrX2dldF9yYXRlKHMtPmNsayk7CisJLyogQ2hlY2sgZnJlcXVlbmN5IGxpbWl0cyAqLworCWlmIChmcmVxIDwgZm1pbiB8fCBmcmVxID4gZm1heCkgeworCQlyZXQgPSAtRVJBTkdFOworCQlnb3RvIG91dF9jbGs7CisJfQorCisJcy0+cmVnbWFwID0gcmVnbWFwOworCXMtPmRldnR5cGUgPSBkZXZ0eXBlOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHMpOwogCiAJLyogQ2hlY2sgZGV2aWNlIHRvIGVuc3VyZSB3ZSBhcmUgdGFsa2luZyB0byB3aGF0IHdlIGV4cGVjdCAqLwogCXJldCA9IGRldnR5cGUtPmRldGVjdChkZXYpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2NsazsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXZ0eXBlLT5ucjsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCBvZmZzID0gaSA8PCA1OwpAQCAtMTE1Niw3ICsxMTczLDcgQEAKIAkJCQkgICBNQVgzMTBYX01PREUxX0FVVE9TTEVFUF9CSVQpOwogCX0KIAotCXVhcnRjbGsgPSBtYXgzMTB4X3NldF9yZWZfY2xrKHMpOworCXVhcnRjbGsgPSBtYXgzMTB4X3NldF9yZWZfY2xrKHMsIGZyZXEsIHh0YWwpOwogCWRldl9kYmcoZGV2LCAiUmVmZXJlbmNlIGNsb2NrIHNldCB0byAlaSBIelxuIiwgdWFydGNsayk7CiAKIAkvKiBSZWdpc3RlciBVQVJUIGRyaXZlciAqLwpAQCAtMTE2OCw5ICsxMTg1LDI4IEBACiAJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnMtPnVhcnQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJSZWdpc3RlcmluZyBVQVJUIGRyaXZlciBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dF9jbGs7CiAJfQogCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKwkvKiBTZXR1cCBHUElPIGNvdHJvbGxlciAqLworCXMtPmdwaW8ub3duZXIJCT0gVEhJU19NT0RVTEU7CisJcy0+Z3Bpby5kZXYJCT0gZGV2OworCXMtPmdwaW8ubGFiZWwJCT0gZGV2X25hbWUoZGV2KTsKKwlzLT5ncGlvLmRpcmVjdGlvbl9pbnB1dAk9IG1heDMxMHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJcy0+Z3Bpby5nZXQJCT0gbWF4MzEweF9ncGlvX2dldDsKKwlzLT5ncGlvLmRpcmVjdGlvbl9vdXRwdXQ9IG1heDMxMHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCXMtPmdwaW8uc2V0CQk9IG1heDMxMHhfZ3Bpb19zZXQ7CisJcy0+Z3Bpby5iYXNlCQk9IC0xOworCXMtPmdwaW8ubmdwaW8JCT0gZGV2dHlwZS0+bnIgKiA0OworCXMtPmdwaW8uY2FuX3NsZWVwCT0gMTsKKwlyZXQgPSBncGlvY2hpcF9hZGQoJnMtPmdwaW8pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VhcnQ7CisjZW5kaWYKKworCW11dGV4X2luaXQoJnMtPm11dGV4KTsKKwogCWZvciAoaSA9IDA7IGkgPCBkZXZ0eXBlLT5ucjsgaSsrKSB7CiAJCS8qIEluaXRpYWxpemUgcG9ydCBkYXRhICovCiAJCXMtPnBbaV0ucG9ydC5saW5lCT0gaTsKQEAgLTExNzgsOCArMTIxNCw3IEBACiAJCXMtPnBbaV0ucG9ydC5pcnEJPSBpcnE7CiAJCXMtPnBbaV0ucG9ydC50eXBlCT0gUE9SVF9NQVgzMTBYOwogCQlzLT5wW2ldLnBvcnQuZmlmb3NpemUJPSBNQVgzMTBYX0ZJRk9fU0laRTsKLQkJcy0+cFtpXS5wb3J0LmZsYWdzCT0gVVBGX1NLSVBfVEVTVCB8IFVQRl9GSVhFRF9UWVBFIHwKLQkJCQkJICBVUEZfTE9XX0xBVEVOQ1k7CisJCXMtPnBbaV0ucG9ydC5mbGFncwk9IFVQRl9GSVhFRF9UWVBFIHwgVVBGX0xPV19MQVRFTkNZOwogCQlzLT5wW2ldLnBvcnQuaW90eXBlCT0gVVBJT19QT1JUOwogCQlzLT5wW2ldLnBvcnQuaW9iYXNlCT0gaSAqIDB4MjA7CiAJCXMtPnBbaV0ucG9ydC5tZW1iYXNlCT0gKHZvaWQgX19pb21lbSAqKX4wOwpAQCAtMTE5NSw0OCArMTIzMCwzNSBAQAogCQkJCSAgICBNQVgzMTBYX01PREUxX0lSUVNFTF9CSVQpOwogCQkvKiBJbml0aWFsaXplIHF1ZXVlIGZvciBzdGFydCBUWCAqLwogCQlJTklUX1dPUksoJnMtPnBbaV0udHhfd29yaywgbWF4MzEweF93cV9wcm9jKTsKKwkJLyogSW5pdGlhbGl6ZSBxdWV1ZSBmb3IgY2hhbmdpbmcgbW9kZSAqLworCQlJTklUX1dPUksoJnMtPnBbaV0ubWRfd29yaywgbWF4MzEweF9tZF9wcm9jKTsKIAkJLyogUmVnaXN0ZXIgcG9ydCAqLwogCQl1YXJ0X2FkZF9vbmVfcG9ydCgmcy0+dWFydCwgJnMtPnBbaV0ucG9ydCk7CiAJCS8qIEdvIHRvIHN1c3BlbmQgbW9kZSAqLwogCQlkZXZ0eXBlLT5wb3dlcigmcy0+cFtpXS5wb3J0LCAwKTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfR1BJT0xJQgotCS8qIFNldHVwIEdQSU8gY290cm9sbGVyICovCi0JaWYgKHMtPnBkYXRhLT5ncGlvX2Jhc2UpIHsKLQkJcy0+Z3Bpby5vd25lcgkJPSBUSElTX01PRFVMRTsKLQkJcy0+Z3Bpby5kZXYJCT0gZGV2OwotCQlzLT5ncGlvLmxhYmVsCQk9IGRldl9uYW1lKGRldik7Ci0JCXMtPmdwaW8uZGlyZWN0aW9uX2lucHV0CT0gbWF4MzEweF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQkJcy0+Z3Bpby5nZXQJCT0gbWF4MzEweF9ncGlvX2dldDsKLQkJcy0+Z3Bpby5kaXJlY3Rpb25fb3V0cHV0PSBtYXgzMTB4X2dwaW9fZGlyZWN0aW9uX291dHB1dDsKLQkJcy0+Z3Bpby5zZXQJCT0gbWF4MzEweF9ncGlvX3NldDsKLQkJcy0+Z3Bpby5iYXNlCQk9IHMtPnBkYXRhLT5ncGlvX2Jhc2U7Ci0JCXMtPmdwaW8ubmdwaW8JCT0gZGV2dHlwZS0+bnIgKiA0OwotCQlzLT5ncGlvLmNhbl9zbGVlcAk9IDE7Ci0JCWlmICghZ3Bpb2NoaXBfYWRkKCZzLT5ncGlvKSkKLQkJCXMtPmdwaW9fdXNlZCA9IDE7Ci0JfSBlbHNlCi0JCWRldl9pbmZvKGRldiwgIkdQSU8gc3VwcG9ydCBub3QgZW5hYmxlZFxuIik7Ci0jZW5kaWYKLQogCS8qIFNldHVwIGludGVycnVwdCAqLwogCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBpcnEsIE5VTEwsIG1heDMxMHhfaXN0LAotCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKLQkJCQkJZGV2X25hbWUoZGV2KSwgcyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZWd1ZXN0IElSUSAlaVxuIiwgaXJxKTsKKwkJCQkJSVJRRl9PTkVTSE9UIHwgZmxhZ3MsIGRldl9uYW1lKGRldiksIHMpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHJlZ3Vlc3QgSVJRICVpXG4iLCBpcnEpOworCisJbXV0ZXhfZGVzdHJveSgmcy0+bXV0ZXgpOworCiAjaWZkZWYgQ09ORklHX0dQSU9MSUIKLQkJaWYgKHMtPmdwaW9fdXNlZCkKLQkJCVdBUk5fT04oZ3Bpb2NoaXBfcmVtb3ZlKCZzLT5ncGlvKSk7CisJV0FSTl9PTihncGlvY2hpcF9yZW1vdmUoJnMtPmdwaW8pKTsKKworb3V0X3VhcnQ6CiAjZW5kaWYKLQl9CisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmcy0+dWFydCk7CisKK291dF9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHMtPmNsayk7CiAKIAlyZXR1cm4gcmV0OwotCi1lcnJfZnJlcToKLQlkZXZfZXJyKGRldiwgIkZyZXF1ZW5jeSBwYXJhbWV0ZXIgaW5jb3JyZWN0XG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBtYXgzMTB4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0xMjQ0LDMwICsxMjY2LDUxIEBACiAJc3RydWN0IG1heDMxMHhfcG9ydCAqcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpLCByZXQgPSAwOwogCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJnMtPmdwaW8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisjZW5kaWYKKwogCWZvciAoaSA9IDA7IGkgPCBzLT51YXJ0Lm5yOyBpKyspIHsKIAkJY2FuY2VsX3dvcmtfc3luYygmcy0+cFtpXS50eF93b3JrKTsKKwkJY2FuY2VsX3dvcmtfc3luYygmcy0+cFtpXS5tZF93b3JrKTsKIAkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnMtPnVhcnQsICZzLT5wW2ldLnBvcnQpOwogCQlzLT5kZXZ0eXBlLT5wb3dlcigmcy0+cFtpXS5wb3J0LCAwKTsKIAl9CiAKKwltdXRleF9kZXN0cm95KCZzLT5tdXRleCk7CiAJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmcy0+dWFydCk7Ci0KLSNpZmRlZiBDT05GSUdfR1BJT0xJQgotCWlmIChzLT5ncGlvX3VzZWQpCi0JCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmcy0+Z3Bpbyk7Ci0jZW5kaWYKLQotCWlmIChzLT5wZGF0YS0+ZXhpdCkKLQkJcy0+cGRhdGEtPmV4aXQoKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocy0+Y2xrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9fbWF5YmVfdW51c2VkIG1heDMxMHhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgzMTA3IiwJLmRhdGEgPSAmbWF4MzEwN19kZXZ0eXBlLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4MzEwOCIsCS5kYXRhID0gJm1heDMxMDhfZGV2dHlwZSwgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1heGltLG1heDMxMDkiLAkuZGF0YSA9ICZtYXgzMTA5X2RldnR5cGUsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgxNDgzMCIsCS5kYXRhID0gJm1heDE0ODMwX2RldnR5cGUgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtYXgzMTB4X2R0X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyByZWdjZmcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS53cml0ZV9mbGFnX21hc2sgPSAweDgwLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS53cml0ZWFibGVfcmVnID0gbWF4MzEweF9yZWdfd3JpdGVhYmxlLAorCS52b2xhdGlsZV9yZWcgPSBtYXgzMTB4X3JlZ192b2xhdGlsZSwKKwkucHJlY2lvdXNfcmVnID0gbWF4MzEweF9yZWdfcHJlY2lvdXMsCit9OworCiAjaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKIHN0YXRpYyBpbnQgbWF4MzEweF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICpkZXZ0eXBlID0KLQkJKHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKilzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICpkZXZ0eXBlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlpbnQgcmV0OwogCiAJLyogU2V0dXAgU1BJIGJ1cyAqLwpAQCAtMTI3NSwxMiArMTMxOCwyNSBAQAogCXNwaS0+bW9kZQkJPSBzcGktPm1vZGUgPyA6IFNQSV9NT0RFXzA7CiAJc3BpLT5tYXhfc3BlZWRfaHoJPSBzcGktPm1heF9zcGVlZF9oeiA/IDogMjYwMDAwMDA7CiAJcmV0ID0gc3BpX3NldHVwKHNwaSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIlNQSSBzZXR1cCBmYWlsZWRcbiIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisKKwlpZiAoc3BpLT5kZXYub2Zfbm9kZSkgeworCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9CisJCQlvZl9tYXRjaF9kZXZpY2UobWF4MzEweF9kdF9pZHMsICZzcGktPmRldik7CisKKwkJZGV2dHlwZSA9IChzdHJ1Y3QgbWF4MzEweF9kZXZ0eXBlICopb2ZfaWQtPmRhdGE7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgKmlkX2VudHJ5ID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKTsKKworCQlkZXZ0eXBlID0gKHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKilpZF9lbnRyeS0+ZHJpdmVyX2RhdGE7CisJCWZsYWdzID0gSVJRRl9UUklHR0VSX0ZBTExJTkc7CiAJfQogCi0JcmV0dXJuIG1heDMxMHhfcHJvYmUoJnNwaS0+ZGV2LCAxLCBkZXZ0eXBlLCBzcGktPmlycSk7CisJcmVnY2ZnLm1heF9yZWdpc3RlciA9IGRldnR5cGUtPm5yICogMHgyMCAtIDE7CisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmcmVnY2ZnKTsKKworCXJldHVybiBtYXgzMTB4X3Byb2JlKCZzcGktPmRldiwgZGV2dHlwZSwgcmVnbWFwLCBzcGktPmlycSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IG1heDMxMHhfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQpAQCAtMTI4OCw4ICsxMzQ0LDYgQEAKIAlyZXR1cm4gbWF4MzEweF9yZW1vdmUoJnNwaS0+ZGV2KTsKIH0KIAotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1heDMxMHhfcG1fb3BzLCBtYXgzMTB4X3N1c3BlbmQsIG1heDMxMHhfcmVzdW1lKTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIG1heDMxMHhfaWRfdGFibGVbXSA9IHsKIAl7ICJtYXgzMTA3IiwJKGtlcm5lbF91bG9uZ190KSZtYXgzMTA3X2RldnR5cGUsIH0sCiAJeyAibWF4MzEwOCIsCShrZXJuZWxfdWxvbmdfdCkmbWF4MzEwOF9kZXZ0eXBlLCB9LApAQCAtMTMwMSw5ICsxMzU1LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtYXgzMTB4X3VhcnRfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gTUFYMzEwWF9OQU1FLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLnBtCT0gJm1heDMxMHhfcG1fb3BzLAorCQkubmFtZQkJPSBNQVgzMTBYX05BTUUsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKG1heDMxMHhfZHRfaWRzKSwKKwkJLnBtCQk9ICZtYXgzMTB4X3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSBtYXgzMTB4X3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IG1heDMxMHhfc3BpX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5jCmluZGV4IGI1ZDc3OWMuLjA1M2I5OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuYwpAQCAtMzksNiArMzksMTMgQEAKIAogI2luY2x1ZGUgIm1zbV9zZXJpYWwuaCIKIAorZW51bSB7CisJVUFSVERNXzFQMSA9IDEsCisJVUFSVERNXzFQMiwKKwlVQVJURE1fMVAzLAorCVVBUlRETV8xUDQsCit9OworCiBzdHJ1Y3QgbXNtX3BvcnQgewogCXN0cnVjdCB1YXJ0X3BvcnQJdWFydDsKIAljaGFyCQkJbmFtZVsxNl07CkBAIC0zMDksNiArMzE2LDggQEAKIAogc3RhdGljIHZvaWQgbXNtX3Jlc2V0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IG1zbV9wb3J0ICptc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOworCiAJLyogcmVzZXQgZXZlcnl0aGluZyAqLwogCW1zbV93cml0ZShwb3J0LCBVQVJUX0NSX0NNRF9SRVNFVF9SWCwgVUFSVF9DUik7CiAJbXNtX3dyaXRlKHBvcnQsIFVBUlRfQ1JfQ01EX1JFU0VUX1RYLCBVQVJUX0NSKTsKQEAgLTMxNiw2ICszMjUsMTAgQEAKIAltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfUkVTRVRfQlJFQUtfSU5ULCBVQVJUX0NSKTsKIAltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfUkVTRVRfQ1RTLCBVQVJUX0NSKTsKIAltc21fd3JpdGUocG9ydCwgVUFSVF9DUl9DTURfU0VUX1JGUiwgVUFSVF9DUik7CisKKwkvKiBEaXNhYmxlIERNIG1vZGVzICovCisJaWYgKG1zbV9wb3J0LT5pc191YXJ0ZG0pCisJCW1zbV93cml0ZShwb3J0LCAwLCBVQVJURE1fRE1FTik7CiB9CiAKIHN0YXRpYyB2b2lkIG1zbV9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQpAQCAtNzExLDYgKzcyNCwxMTcgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09OU09MRV9QT0xMCitzdGF0aWMgaW50IG1zbV9wb2xsX2luaXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0ID0gVUFSVF9UT19NU00ocG9ydCk7CisKKwkvKiBFbmFibGUgc2luZ2xlIGNoYXJhY3RlciBtb2RlIG9uIFJYIEZJRk8gKi8KKwlpZiAobXNtX3BvcnQtPmlzX3VhcnRkbSA+PSBVQVJURE1fMVA0KQorCQltc21fd3JpdGUocG9ydCwgVUFSVERNX0RNRU5fUlhfU0NfRU5BQkxFLCBVQVJURE1fRE1FTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcG9sbF9nZXRfY2hhcl9zaW5nbGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0ID0gVUFSVF9UT19NU00ocG9ydCk7CisJdW5zaWduZWQgaW50IHJmX3JlZyA9IG1zbV9wb3J0LT5pc191YXJ0ZG0gPyBVQVJURE1fUkYgOiBVQVJUX1JGOworCisJaWYgKCEobXNtX3JlYWQocG9ydCwgVUFSVF9TUikgJiBVQVJUX1NSX1JYX1JFQURZKSkKKwkJcmV0dXJuIE5PX1BPTExfQ0hBUjsKKwllbHNlCisJCXJldHVybiBtc21fcmVhZChwb3J0LCByZl9yZWcpICYgMHhmZjsKK30KKworc3RhdGljIGludCBtc21fcG9sbF9nZXRfY2hhcl9kbV8xcDMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpbnQgYzsKKwlzdGF0aWMgdTMyIHNsb3A7CisJc3RhdGljIGludCBjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpzcCA9ICh1bnNpZ25lZCBjaGFyICopJnNsb3A7CisKKwkvKiBDaGVjayBpZiBhIHByZXZpb3VzIHJlYWQgaGFkIG1vcmUgdGhhbiBvbmUgY2hhciAqLworCWlmIChjb3VudCkgeworCQljID0gc3Bbc2l6ZW9mKHNsb3ApIC0gY291bnRdOworCQljb3VudC0tOworCS8qIE9yIGlmIEZJRk8gaXMgZW1wdHkgKi8KKwl9IGVsc2UgaWYgKCEobXNtX3JlYWQocG9ydCwgVUFSVF9TUikgJiBVQVJUX1NSX1JYX1JFQURZKSkgeworCQkvKgorCQkgKiBJZiBSWCBwYWNraW5nIGJ1ZmZlciBoYXMgbGVzcyB0aGFuIGEgd29yZCwgZm9yY2Ugc3RhbGUgdG8KKwkJICogcHVzaCBjb250ZW50cyBpbnRvIFJYIEZJRk8KKwkJICovCisJCWNvdW50ID0gbXNtX3JlYWQocG9ydCwgVUFSVERNX1JYRlMpOworCQljb3VudCA9IChjb3VudCA+PiBVQVJURE1fUlhGU19CVUZfU0hJRlQpICYgVUFSVERNX1JYRlNfQlVGX01BU0s7CisJCWlmIChjb3VudCkgeworCQkJbXNtX3dyaXRlKHBvcnQsIFVBUlRfQ1JfQ01EX0ZPUkNFX1NUQUxFLCBVQVJUX0NSKTsKKwkJCXNsb3AgPSBtc21fcmVhZChwb3J0LCBVQVJURE1fUkYpOworCQkJYyA9IHNwWzBdOworCQkJY291bnQtLTsKKwkJfSBlbHNlIHsKKwkJCWMgPSBOT19QT0xMX0NIQVI7CisJCX0KKwkvKiBGSUZPIGhhcyBhIHdvcmQgKi8KKwl9IGVsc2UgeworCQlzbG9wID0gbXNtX3JlYWQocG9ydCwgVUFSVERNX1JGKTsKKwkJYyA9IHNwWzBdOworCQljb3VudCA9IHNpemVvZihzbG9wKSAtIDE7CisJfQorCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BvbGxfZ2V0X2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1MzIgaW1yOworCWludCBjOworCXN0cnVjdCBtc21fcG9ydCAqbXNtX3BvcnQgPSBVQVJUX1RPX01TTShwb3J0KTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpbXIgPSBtc21fcmVhZChwb3J0LCBVQVJUX0lNUik7CisJbXNtX3dyaXRlKHBvcnQsIDAsIFVBUlRfSU1SKTsKKworCWlmIChtc21fcG9ydC0+aXNfdWFydGRtID09IFVBUlRETV8xUDMpCisJCWMgPSBtc21fcG9sbF9nZXRfY2hhcl9kbV8xcDMocG9ydCk7CisJZWxzZQorCQljID0gbXNtX3BvbGxfZ2V0X2NoYXJfc2luZ2xlKHBvcnQpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwltc21fd3JpdGUocG9ydCwgaW1yLCBVQVJUX0lNUik7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgbXNtX3BvbGxfcHV0X2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgY2hhciBjKQoreworCXUzMiBpbXI7CisJc3RydWN0IG1zbV9wb3J0ICptc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWltciA9IG1zbV9yZWFkKHBvcnQsIFVBUlRfSU1SKTsKKwltc21fd3JpdGUocG9ydCwgMCwgVUFSVF9JTVIpOworCisJaWYgKG1zbV9wb3J0LT5pc191YXJ0ZG0pCisJCXJlc2V0X2RtX2NvdW50KHBvcnQsIDEpOworCisJLyogV2FpdCB1bnRpbCBGSUZPIGlzIGVtcHR5ICovCisJd2hpbGUgKCEobXNtX3JlYWQocG9ydCwgVUFSVF9TUikgJiBVQVJUX1NSX1RYX1JFQURZKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBXcml0ZSBhIGNoYXJhY3RlciAqLworCW1zbV93cml0ZShwb3J0LCBjLCBtc21fcG9ydC0+aXNfdWFydGRtID8gVUFSVERNX1RGIDogVUFSVF9URik7CisKKwkvKiBXYWl0IHVudGlsIEZJRk8gaXMgZW1wdHkgKi8KKwl3aGlsZSAoIShtc21fcmVhZChwb3J0LCBVQVJUX1NSKSAmIFVBUlRfU1JfVFhfUkVBRFkpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJbXNtX3dyaXRlKHBvcnQsIGltciwgVUFSVF9JTVIpOworCisJcmV0dXJuOworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgbXNtX3VhcnRfcG9wcyA9IHsKIAkudHhfZW1wdHkgPSBtc21fdHhfZW1wdHksCiAJLnNldF9tY3RybCA9IG1zbV9zZXRfbWN0cmwsCkBAIC03MjksNiArODUzLDExIEBACiAJLmNvbmZpZ19wb3J0ID0gbXNtX2NvbmZpZ19wb3J0LAogCS52ZXJpZnlfcG9ydCA9IG1zbV92ZXJpZnlfcG9ydCwKIAkucG0gPSBtc21fcG93ZXIsCisjaWZkZWYgQ09ORklHX0NPTlNPTEVfUE9MTAorCS5wb2xsX2luaXQgPSBtc21fcG9sbF9pbml0LAorCS5wb2xsX2dldF9jaGFyCT0gbXNtX3BvbGxfZ2V0X2NoYXIsCisJLnBvbGxfcHV0X2NoYXIJPSBtc21fcG9sbF9wdXRfY2hhciwKKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBtc21fcG9ydCBtc21fdWFydF9wb3J0c1tdID0gewpAQCAtOTAwLDcgKzEwMjksMTAgQEAKIHN0YXRpYyBhdG9taWNfdCBtc21fdWFydF9uZXh0X2lkID0gQVRPTUlDX0lOSVQoMCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV91YXJ0ZG1fdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbSIgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS4xIiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDEgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS4yIiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDIgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS4zIiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDMgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnRkbS12MS40IiwgLmRhdGEgPSAodm9pZCAqKVVBUlRETV8xUDQgfSwKIAl7IH0KIH07CiAKQEAgLTkwOSw2ICsxMDQxLDcgQEAKIAlzdHJ1Y3QgbXNtX3BvcnQgKm1zbV9wb3J0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzb3VyY2U7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKIAlpbnQgaXJxOwogCiAJaWYgKHBkZXYtPmlkID09IC0xKQpAQCAtOTIzLDggKzEwNTYsOSBAQAogCXBvcnQtPmRldiA9ICZwZGV2LT5kZXY7CiAJbXNtX3BvcnQgPSBVQVJUX1RPX01TTShwb3J0KTsKIAotCWlmIChvZl9tYXRjaF9kZXZpY2UobXNtX3VhcnRkbV90YWJsZSwgJnBkZXYtPmRldikpCi0JCW1zbV9wb3J0LT5pc191YXJ0ZG0gPSAxOworCWlkID0gb2ZfbWF0Y2hfZGV2aWNlKG1zbV91YXJ0ZG1fdGFibGUsICZwZGV2LT5kZXYpOworCWlmIChpZCkKKwkJbXNtX3BvcnQtPmlzX3VhcnRkbSA9ICh1bnNpZ25lZCBsb25nKWlkLT5kYXRhOwogCWVsc2UKIAkJbXNtX3BvcnQtPmlzX3VhcnRkbSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmggYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5oCmluZGV4IDQ2OWZkYTUuLjFlOWI2OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmgKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuaApAQCAtNTksNiArNTksNyBAQAogI2RlZmluZSBVQVJUX0NSX0NNRF9SRVNFVF9SRlIJCSgxNCA8PCA0KQogI2RlZmluZSBVQVJUX0NSX0NNRF9QUk9URUNUSU9OX0VOCSgxNiA8PCA0KQogI2RlZmluZSBVQVJUX0NSX0NNRF9TVEFMRV9FVkVOVF9FTkFCTEUJKDgwIDw8IDQpCisjZGVmaW5lIFVBUlRfQ1JfQ01EX0ZPUkNFX1NUQUxFCQkoNCA8PCA4KQogI2RlZmluZSBVQVJUX0NSX0NNRF9SRVNFVF9UWF9SRUFEWQkoMyA8PCA4KQogI2RlZmluZSBVQVJUX0NSX1RYX0RJU0FCTEUJCSgxIDw8IDMpCiAjZGVmaW5lIFVBUlRfQ1JfVFhfRU5BQkxFCQkoMSA8PCAyKQpAQCAtMTEzLDYgKzExNCwxNCBAQAogI2RlZmluZSBHU0JJX1BST1RPQ09MX1VBUlQJMHg0MAogI2RlZmluZSBHU0JJX1BST1RPQ09MX0lETEUJMHgwCiAKKyNkZWZpbmUgVUFSVERNX1JYRlMJCTB4NTAKKyNkZWZpbmUgVUFSVERNX1JYRlNfQlVGX1NISUZUCTB4NworI2RlZmluZSBVQVJURE1fUlhGU19CVUZfTUFTSwkweDcKKworI2RlZmluZSBVQVJURE1fRE1FTgkJMHgzQworI2RlZmluZSBVQVJURE1fRE1FTl9SWF9TQ19FTkFCTEUgQklUKDUpCisjZGVmaW5lIFVBUlRETV9ETUVOX1RYX1NDX0VOQUJMRSBCSVQoNCkKKwogI2RlZmluZSBVQVJURE1fRE1SWAkJMHgzNAogI2RlZmluZSBVQVJURE1fTkNGX1RYCQkweDQwCiAjZGVmaW5lIFVBUlRETV9SWF9UT1RBTF9TTkFQCTB4MzgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9vbWFwLXNlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMKaW5kZXggNzdmMDM1MS4uZGQ4YjFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMKQEAgLTM0Miw3ICszNDIsMTQgQEAKIAogCWlmICgodXAtPnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X0VOQUJMRUQpICYmCiAJICAgICEodXAtPnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X1JYX0RVUklOR19UWCkpIHsKLQkJdXAtPmllciA9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisJCS8qCisJCSAqIEVtcHR5IHRoZSBSWCBGSUZPLCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW55dGhpbmcKKwkJICogcmVjZWl2ZWQgZHVyaW5nIHRoZSBoYWxmLWR1cGxleCB0cmFuc21pc3Npb24uCisJCSAqLworCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0ZDUiwgdXAtPmZjciB8IFVBUlRfRkNSX0NMRUFSX1JDVlIpOworCQkvKiBSZS1lbmFibGUgUlggaW50ZXJydXB0cyAqLworCQl1cC0+aWVyIHw9IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisJCXVwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRFI7CiAJCXNlcmlhbF9vdXQodXAsIFVBUlRfSUVSLCB1cC0+aWVyKTsKIAl9CiAKQEAgLTM1NSw3ICszNjIsNyBAQAogCXN0cnVjdCB1YXJ0X29tYXBfcG9ydCAqdXAgPSB0b191YXJ0X29tYXBfcG9ydChwb3J0KTsKIAogCXBtX3J1bnRpbWVfZ2V0X3N5bmModXAtPmRldik7Ci0JdXAtPmllciAmPSB+VUFSVF9JRVJfUkxTSTsKKwl1cC0+aWVyICY9IH4oVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESSk7CiAJdXAtPnBvcnQucmVhZF9zdGF0dXNfbWFzayAmPSB+VUFSVF9MU1JfRFI7CiAJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kodXAtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCmluZGV4IDhmYTExMzQuLjA5MzFiM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCkBAIC0xNzYyLDcgKzE3NjIsOSBAQAogCWludCBmaWZvc2l6ZTsKIAlpbnQgcG9ydF90eXBlOwogCXN0cnVjdCBwY2hfdWFydF9kcml2ZXJfZGF0YSAqYm9hcmQ7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiAJY2hhciBuYW1lWzMyXTsJLyogZm9yIGRlYnVnZnMgZmlsZSBuYW1lICovCisjZW5kaWYKIAogCWJvYXJkID0gJmRydl9kYXRbaWQtPmRyaXZlcl9kYXRhXTsKIAlwb3J0X3R5cGUgPSBib2FyZC0+cG9ydF90eXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKaW5kZXggOWNkNzA2ZC4uMjNmNDU5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCkBAIC0xMjgyLDYgKzEyODIsMTQgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBwcm9iZV9lcnI7CiAKKwlpZiAoIXMzYzI0eHhfdWFydF9kcnYuc3RhdGUpIHsKKwkJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnMzYzI0eHhfdWFydF9kcnYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgU2Ftc3VuZyBVQVJUIGRyaXZlclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJZGJnKCIlczogYWRkaW5nIHBvcnRcbiIsIF9fZnVuY19fKTsKIAl1YXJ0X2FkZF9vbmVfcG9ydCgmczNjMjR4eF91YXJ0X2RydiwgJm91cnBvcnQtPnBvcnQpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZvdXJwb3J0LT5wb3J0KTsKQEAgLTEzMjEsNiArMTMyOSw4IEBACiAJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzM2MyNHh4X3VhcnRfZHJ2LCBwb3J0KTsKIAl9CiAKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzM2MyNHh4X3VhcnRfZHJ2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODIwLDM1ICsxODMwLDcgQEAKIAl9LAogfTsKIAotLyogbW9kdWxlIGluaXRpYWxpc2F0aW9uIGNvZGUgKi8KLQotc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zZXJpYWxfbW9kaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmczNjMjR4eF91YXJ0X2Rydik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgU2Ftc3VuZyBVQVJUIGRyaXZlclxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzYW1zdW5nX3NlcmlhbF9kcml2ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlclxuIik7Ci0JCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnMzYzI0eHhfdWFydF9kcnYpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNHh4X3NlcmlhbF9tb2RleGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNhbXN1bmdfc2VyaWFsX2RyaXZlcik7Ci0JdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmczNjMjR4eF91YXJ0X2Rydik7Ci19Ci0KLW1vZHVsZV9pbml0KHMzYzI0eHhfc2VyaWFsX21vZGluaXQpOwotbW9kdWxlX2V4aXQoczNjMjR4eF9zZXJpYWxfbW9kZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNhbXN1bmdfc2VyaWFsX2RyaXZlcik7CiAKIE1PRFVMRV9BTElBUygicGxhdGZvcm06c2Ftc3VuZy11YXJ0Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIFNlcmlhbCBwb3J0IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCBlY2UyMDQ5Li4yY2Y1NjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMTMxOSw5ICsxMzE5LDkgQEAKIAl1cG9ydCA9IHN0YXRlLT51YXJ0X3BvcnQ7CiAJcG9ydCA9ICZzdGF0ZS0+cG9ydDsKIAotCXByX2RlYnVnKCJ1YXJ0X2Nsb3NlKCVkKSBjYWxsZWRcbiIsIHVwb3J0LT5saW5lKTsKKwlwcl9kZWJ1ZygidWFydF9jbG9zZSglZCkgY2FsbGVkXG4iLCB1cG9ydCA/IHVwb3J0LT5saW5lIDogLTEpOwogCi0JaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKKwlpZiAoIXBvcnQtPmNvdW50IHx8IHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTE3NjIsNyArMTc2Miw3IEBACiB9CiAKIC8qKgotICoJdWFydF9wYXJzZV9vcHRpb25zIC0gUGFyc2Ugc2VyaWFsIHBvcnQgYmF1ZC9wYXJpdHkvYml0cy9mbG93IGNvbnRyby4KKyAqCXVhcnRfcGFyc2Vfb3B0aW9ucyAtIFBhcnNlIHNlcmlhbCBwb3J0IGJhdWQvcGFyaXR5L2JpdHMvZmxvdyBjb250cm9sLgogICoJQG9wdGlvbnM6IHBvaW50ZXIgdG8gb3B0aW9uIHN0cmluZwogICoJQGJhdWQ6IHBvaW50ZXIgdG8gYW4gJ2ludCcgdmFyaWFibGUgZm9yIHRoZSBiYXVkIHJhdGUuCiAgKglAcGFyaXR5OiBwb2ludGVyIHRvIGFuICdpbnQnIHZhcmlhYmxlIGZvciB0aGUgcGFyaXR5LgpAQCAtMjYwOSw3ICsyNjA5LDcgQEAKIAogCS8qCiAJICogUmVnaXN0ZXIgdGhlIHBvcnQgd2hldGhlciBpdCdzIGRldGVjdGVkIG9yIG5vdC4gIFRoaXMgYWxsb3dzCi0JICogc2V0c2VyaWFsIHRvIGJlIHVzZWQgdG8gYWx0ZXIgdGhpcyBwb3J0cyBwYXJhbWV0ZXJzLgorCSAqIHNldHNlcmlhbCB0byBiZSB1c2VkIHRvIGFsdGVyIHRoaXMgcG9ydCdzIHBhcmFtZXRlcnMuCiAJICovCiAJdHR5X2RldiA9IHR0eV9wb3J0X3JlZ2lzdGVyX2RldmljZV9hdHRyKHBvcnQsIGRydi0+dHR5X2RyaXZlciwKIAkJCXVwb3J0LT5saW5lLCB1cG9ydC0+ZGV2LCBwb3J0LCB0dHlfZGV2X2F0dHJfZ3JvdXBzKTsKQEAgLTI2NDUsNiArMjY0NSw3IEBACiB7CiAJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gZHJ2LT5zdGF0ZSArIHVwb3J0LT5saW5lOwogCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzdGF0ZS0+cG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCByZXQgPSAwOwogCiAJQlVHX09OKGluX2ludGVycnVwdCgpKTsKQEAgLTI2NzMsOCArMjY3NCwxNyBAQAogCSAqLwogCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcnYtPnR0eV9kcml2ZXIsIHVwb3J0LT5saW5lKTsKIAotCWlmIChwb3J0LT50dHkpCisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldChwb3J0KTsKKwlpZiAodHR5KSB7CiAJCXR0eV92aGFuZ3VwKHBvcnQtPnR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOworCX0KKworCS8qCisJICogSWYgdGhlIHBvcnQgaXMgdXNlZCBhcyBhIGNvbnNvbGUsIHVucmVnaXN0ZXIgaXQKKwkgKi8KKwlpZiAodWFydF9jb25zb2xlKHVwb3J0KSkKKwkJdW5yZWdpc3Rlcl9jb25zb2xlKHVwb3J0LT5jb25zKTsKIAogCS8qCiAJICogRnJlZSB0aGUgcG9ydCBJTyBhbmQgbWVtb3J5IHJlc291cmNlcywgaWYgYW55LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCmluZGV4IDdlMGI2MjYuLjg4MjM2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKQEAgLTQyOCw3ICs0MjgsNyBAQAogCQljZmctPnJlZ3R5cGUgPSBTQ0l4X0hTQ0lGX1JFR1RZUEU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcHJvYmUgcmVnaXN0ZXIgbWFwIGZvciBnaXZlbiBwb3J0XG4iKTsKKwkJcHJfZXJyKCJDYW4ndCBwcm9iZSByZWdpc3RlciBtYXAgZm9yIGdpdmVuIHBvcnRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTc4OCw3ICs3ODgsNyBAQAogCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHBvcnQsIDAsIFRUWV9PVkVSUlVOKSkKIAkJCWNvcGllZCsrOwogCi0JCWRldl9ub3RpY2UocG9ydC0+ZGV2LCAib3ZlcnJ1biBlcnJvciIpOworCQlkZXZfbm90aWNlKHBvcnQtPmRldiwgIm92ZXJydW4gZXJyb3JcbiIpOwogCX0KIAogCWlmIChzdGF0dXMgJiBTQ3hTUl9GRVIocG9ydCkpIHsKQEAgLTgzMCw3ICs4MzAsNyBAQAogCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHBvcnQsIDAsIFRUWV9QQVJJVFkpKQogCQkJY29waWVkKys7CiAKLQkJZGV2X25vdGljZShwb3J0LT5kZXYsICJwYXJpdHkgZXJyb3IiKTsKKwkJZGV2X25vdGljZShwb3J0LT5kZXYsICJwYXJpdHkgZXJyb3JcbiIpOwogCX0KIAogCWlmIChjb3BpZWQpCkBAIC05MTEsNyArOTExLDcgQEAKIAkJLyogRGlzYWJsZSBmdXR1cmUgUnggaW50ZXJydXB0cyAqLwogCQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikgewogCQkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JCQlzY3IgfD0gMHg0MDAwOworCQkJc2NyIHw9IFNDU0NSX1JEUlFFOwogCQl9IGVsc2UgewogCQkJc2NyICY9IH5TQ1NDUl9SSUU7CiAJCX0KQEAgLTExOTksNyArMTE5OSw5IEBACiAJCSAqLwogCQlyZWcgPSBzY2lfZ2V0cmVnKHBvcnQsIFNDRkNSKTsKIAkJaWYgKHJlZy0+c2l6ZSkKLQkJCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ0ZDUiwgc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NGQ1IpIHwgMSk7CisJCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgU0NGQ1IsCisJCQkJCXNlcmlhbF9wb3J0X2luKHBvcnQsIFNDRkNSKSB8CisJCQkJCVNDRkNSX0xPT1ApOwogCX0KIH0KIApAQCAtMTI4OSw3ICsxMjkxLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjb3VudDsKIAotCWRldl9kYmcocG9ydC0+ZGV2LCAiJXMoJWQpIGFjdGl2ZSAjJWRcbiIsIF9fZnVuY19fLCBwb3J0LT5saW5lLCBzLT5hY3RpdmVfcngpOworCWRldl9kYmcocG9ydC0+ZGV2LCAiJXMoJWQpIGFjdGl2ZSAjJWRcbiIsCisJCV9fZnVuY19fLCBwb3J0LT5saW5lLCBzLT5hY3RpdmVfcngpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTM2NSw4ICsxMzY4LDggQEAKIAkJCXNjaV9yeF9kbWFfcmVsZWFzZShzLCB0cnVlKTsKIAkJCXJldHVybjsKIAkJfQotCQlkZXZfZGJnKHMtPnBvcnQuZGV2LCAiJXMoKTogY29va2llICVkIHRvICMlZFxuIiwgX19mdW5jX18sCi0JCQlzLT5jb29raWVfcnhbaV0sIGkpOworCQlkZXZfZGJnKHMtPnBvcnQuZGV2LCAiJXMoKTogY29va2llICVkIHRvICMlZFxuIiwKKwkJCV9fZnVuY19fLCBzLT5jb29raWVfcnhbaV0sIGkpOwogCX0KIAogCXMtPmFjdGl2ZV9yeCA9IHMtPmNvb2tpZV9yeFswXTsKQEAgLTE0MjUsOCArMTQyOCw4IEBACiAKIAlzLT5hY3RpdmVfcnggPSBzLT5jb29raWVfcnhbIW5ld107CiAKLQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBjb29raWUgJWQgIyVkLCBuZXcgYWN0aXZlICMlZFxuIiwgX19mdW5jX18sCi0JCXMtPmNvb2tpZV9yeFtuZXddLCBuZXcsIHMtPmFjdGl2ZV9yeCk7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogY29va2llICVkICMlZCwgbmV3IGFjdGl2ZSAjJWRcbiIsCisJCV9fZnVuY19fLCBzLT5jb29raWVfcnhbbmV3XSwgbmV3LCBzLT5hY3RpdmVfcngpOwogfQogCiBzdGF0aWMgdm9pZCB3b3JrX2ZuX3R4KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTE0NzksOCArMTQ4Miw4IEBACiAJCXJldHVybjsKIAl9CiAKLQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiAlcDogJWQuLi4lZCwgY29va2llICVkXG4iLCBfX2Z1bmNfXywKLQkJeG1pdC0+YnVmLCB4bWl0LT50YWlsLCB4bWl0LT5oZWFkLCBzLT5jb29raWVfdHgpOworCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6ICVwOiAlZC4uLiVkLCBjb29raWUgJWRcbiIsCisJCV9fZnVuY19fLCB4bWl0LT5idWYsIHhtaXQtPnRhaWwsIHhtaXQtPmhlYWQsIHMtPmNvb2tpZV90eCk7CiAKIAlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKIH0KQEAgLTE0OTUsOSArMTQ5OCw5IEBACiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpIHsKIAkJdTE2IG5ldywgc2NyID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NTQ1IpOwogCQlpZiAocy0+Y2hhbl90eCkKLQkJCW5ldyA9IHNjciB8IDB4ODAwMDsKKwkJCW5ldyA9IHNjciB8IFNDU0NSX1REUlFFOwogCQllbHNlCi0JCQluZXcgPSBzY3IgJiB+MHg4MDAwOworCQkJbmV3ID0gc2NyICYgflNDU0NSX1REUlFFOwogCQlpZiAobmV3ICE9IHNjcikKIAkJCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ1NDUiwgbmV3KTsKIAl9CkBAIC0xNTI0LDcgKzE1MjcsNyBAQAogCWN0cmwgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ1NDUik7CiAKIAlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikKLQkJY3RybCAmPSB+MHg4MDAwOworCQljdHJsICY9IH5TQ1NDUl9URFJRRTsKIAogCWN0cmwgJj0gflNDU0NSX1RJRTsKIApAQCAtMTUzOCw3ICsxNTQxLDcgQEAKIAljdHJsID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgU0NTQ1IpIHwgcG9ydF9yeF9pcnFfbWFzayhwb3J0KTsKIAogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKQotCQljdHJsICY9IH4weDQwMDA7CisJCWN0cmwgJj0gflNDU0NSX1JEUlFFOwogCiAJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDU0NSLCBjdHJsKTsKIH0KQEAgLTE1NTAsNyArMTU1Myw3IEBACiAJY3RybCA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFNDU0NSKTsKIAogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKQotCQljdHJsICY9IH4weDQwMDA7CisJCWN0cmwgJj0gflNDU0NSX1JEUlFFOwogCiAJY3RybCAmPSB+cG9ydF9yeF9pcnFfbWFzayhwb3J0KTsKIApAQCAtMTU5OSw4ICsxNjAyLDggQEAKIHsKIAlzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZSAqcGFyYW0gPSBzbGF2ZTsKIAotCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICIlczogc2xhdmUgSUQgJWRcbiIsIF9fZnVuY19fLAotCQlwYXJhbS0+c2hkbWFfc2xhdmUuc2xhdmVfaWQpOworCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICIlczogc2xhdmUgSUQgJWRcbiIsCisJCV9fZnVuY19fLCBwYXJhbS0+c2hkbWFfc2xhdmUuc2xhdmVfaWQpOwogCiAJY2hhbi0+cHJpdmF0ZSA9ICZwYXJhbS0+c2hkbWFfc2xhdmU7CiAJcmV0dXJuIHRydWU7CkBAIC0xNjEzLDcgKzE2MTYsNyBAQAogCXUxNiBzY3IgPSBzZXJpYWxfcG9ydF9pbihwb3J0LCBTQ1NDUik7CiAKIAlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikgewotCQlzY3IgJj0gfjB4NDAwMDsKKwkJc2NyICY9IH5TQ1NDUl9SRFJRRTsKIAkJZW5hYmxlX2lycShzLT5pcnFzW1NDSXhfUlhJX0lSUV0pOwogCX0KIAlzZXJpYWxfcG9ydF9vdXQocG9ydCwgU0NTQ1IsIHNjciB8IFNDU0NSX1JJRSk7CkBAIC0xNjI5LDggKzE2MzIsNyBAQAogCWRtYV9jYXBfbWFza190IG1hc2s7CiAJaW50IG5lbnQ7CiAKLQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBwb3J0ICVkXG4iLCBfX2Z1bmNfXywKLQkJcG9ydC0+bGluZSk7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogcG9ydCAlZFxuIiwgX19mdW5jX18sIHBvcnQtPmxpbmUpOwogCiAJaWYgKHMtPmNmZy0+ZG1hX3NsYXZlX3R4IDw9IDAgfHwgcy0+Y2ZnLT5kbWFfc2xhdmVfcnggPD0gMCkKIAkJcmV0dXJuOwpAQCAtMTY1OCw3ICsxNjYwLDggQEAKIAkJaWYgKCFuZW50KQogCQkJc2NpX3R4X2RtYV9yZWxlYXNlKHMsIGZhbHNlKTsKIAkJZWxzZQotCQkJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogbWFwcGVkICVkQCVwIHRvICVwYWRcbiIsIF9fZnVuY19fLAorCQkJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogbWFwcGVkICVkQCVwIHRvICVwYWRcbiIsCisJCQkJX19mdW5jX18sCiAJCQkJc2dfZG1hX2xlbigmcy0+c2dfdHgpLCBwb3J0LT5zdGF0ZS0+eG1pdC5idWYsCiAJCQkJJnNnX2RtYV9hZGRyZXNzKCZzLT5zZ190eCkpOwogCkBAIC0xODcwLDEzICsxODczLDEzIEBACiAJc21yX3ZhbCA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFNDU01SKSAmIDM7CiAKIAlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgPT0gQ1M3KQotCQlzbXJfdmFsIHw9IDB4NDA7CisJCXNtcl92YWwgfD0gU0NTTVJfQ0hSOwogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKQotCQlzbXJfdmFsIHw9IDB4MjA7CisJCXNtcl92YWwgfD0gU0NTTVJfUEU7CiAJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpCi0JCXNtcl92YWwgfD0gMHgzMDsKKwkJc21yX3ZhbCB8PSBTQ1NNUl9QRSB8IFNDU01SX09ERDsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQikKLQkJc21yX3ZhbCB8PSAweDA4OworCQlzbXJfdmFsIHw9IFNDU01SX1NUT1A7CiAKIAl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwogCkBAIC0xODg0LDcgKzE4ODcsNyBAQAogCQlfX2Z1bmNfXywgc21yX3ZhbCwgY2tzLCB0LCBzLT5jZmctPnNjc2NyKTsKIAogCWlmICh0ID49IDApIHsKLQkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFNDU01SLCAoc21yX3ZhbCAmIH4zKSB8IGNrcyk7CisJCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ1NNUiwgKHNtcl92YWwgJiB+U0NTTVJfQ0tTKSB8IGNrcyk7CiAJCXNlcmlhbF9wb3J0X291dChwb3J0LCBTQ0JSUiwgdCk7CiAJCXJlZyA9IHNjaV9nZXRyZWcocG9ydCwgSFNTUlIpOwogCQlpZiAocmVnLT5zaXplKQpAQCAtMTkzMiw4ICsxOTM1LDcgQEAKIAlpZiAocy0+Y2hhbl9yeCkgewogCQlzLT5yeF90aW1lb3V0ID0gKHBvcnQtPnRpbWVvdXQgLSBIWiAvIDUwKSAqIHMtPmJ1Zl9sZW5fcnggKiAzIC8KIAkJCXBvcnQtPmZpZm9zaXplIC8gMjsKLQkJZGV2X2RiZyhwb3J0LT5kZXYsCi0JCQkiRE1BIFJ4IHQtb3V0ICV1bXMsIHR0eSB0LW91dCAldSBqaWZmaWVzXG4iLAorCQlkZXZfZGJnKHBvcnQtPmRldiwgIkRNQSBSeCB0LW91dCAldW1zLCB0dHkgdC1vdXQgJXUgamlmZmllc1xuIiwKIAkJCXMtPnJ4X3RpbWVvdXQgKiAxMDAwIC8gSFosIHBvcnQtPnRpbWVvdXQpOwogCQlpZiAocy0+cnhfdGltZW91dCA8IG1zZWNzX3RvX2ppZmZpZXMoMjApKQogCQkJcy0+cnhfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOwpAQCAtMTk1Miw3ICsxOTU0LDcgQEAKIAlzdHJ1Y3Qgc2NpX3BvcnQgKnNjaV9wb3J0ID0gdG9fc2NpX3BvcnQocG9ydCk7CiAKIAlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSAzOgorCWNhc2UgVUFSVF9QTV9TVEFURV9PRkY6CiAJCXNjaV9wb3J0X2Rpc2FibGUoc2NpX3BvcnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjAxNyw3ICsyMDE5LDcgQEAKIAkJICogbmVlZCB0byBkbyBhbnkgcmVtYXBwaW5nLCBqdXN0IGNhc3QgdGhlIGNvb2tpZQogCQkgKiBkaXJlY3RseS4KIAkJICovCi0JCXBvcnQtPm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtICopcG9ydC0+bWFwYmFzZTsKKwkJcG9ydC0+bWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKikodWludHB0cl90KXBvcnQtPm1hcGJhc2U7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMzg4LDggKzIzOTAsNyBAQAogCiAjZW5kaWYgLyogQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRSAqLwogCi1zdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0KLQlLRVJOX0lORk8gIlN1cGVySCAoSClTQ0koRikgZHJpdmVyIGluaXRpYWxpemVkXG4iOworc3RhdGljIGNvbnN0IGNoYXIgYmFubmVyW10gX19pbml0Y29uc3QgPSAiU3VwZXJIIChIKVNDSShGKSBkcml2ZXIgaW5pdGlhbGl6ZWQiOwogCiBzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHNjaV91YXJ0X2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCkBAIC0yNDIzLDI1ICsyNDI0LDI1IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9zY2lfbWF0Y2hbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsc2NpZiIsCi0JCS5kYXRhID0gKHZvaWQgKikmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CisJCS5kYXRhID0gJihjb25zdCBzdHJ1Y3Qgc2NpX3BvcnRfaW5mbykgewogCQkJLnR5cGUgPSBQT1JUX1NDSUYsCiAJCQkucmVndHlwZSA9IFNDSXhfU0g0X1NDSUZfUkVHVFlQRSwKIAkJfSwKIAl9LCB7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsc2NpZmEiLAotCQkuZGF0YSA9ICh2b2lkICopJihjb25zdCBzdHJ1Y3Qgc2NpX3BvcnRfaW5mbykgeworCQkuZGF0YSA9ICYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKIAkJCS50eXBlID0gUE9SVF9TQ0lGQSwKIAkJCS5yZWd0eXBlID0gU0NJeF9TQ0lGQV9SRUdUWVBFLAogCQl9LAogCX0sIHsKIAkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzY2lmYiIsCi0JCS5kYXRhID0gKHZvaWQgKikmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CisJCS5kYXRhID0gJihjb25zdCBzdHJ1Y3Qgc2NpX3BvcnRfaW5mbykgewogCQkJLnR5cGUgPSBQT1JUX1NDSUZCLAogCQkJLnJlZ3R5cGUgPSBTQ0l4X1NDSUZCX1JFR1RZUEUsCiAJCX0sCiAJfSwgewogCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGhzY2lmIiwKLQkJLmRhdGEgPSAodm9pZCAqKSYoY29uc3Qgc3RydWN0IHNjaV9wb3J0X2luZm8pIHsKKwkJLmRhdGEgPSAmKGNvbnN0IHN0cnVjdCBzY2lfcG9ydF9pbmZvKSB7CiAJCQkudHlwZSA9IFBPUlRfSFNDSUYsCiAJCQkucmVndHlwZSA9IFNDSXhfSFNDSUZfUkVHVFlQRSwKIAkJfSwKQEAgLTI1MDEsMTEgKzI1MDIsOSBAQAogCiAJLyogU2FuaXR5IGNoZWNrICovCiAJaWYgKHVubGlrZWx5KGluZGV4ID49IFNDSV9OUE9SVFMpKSB7Ci0JCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiQXR0ZW1wdGluZyB0byByZWdpc3RlciBwb3J0ICIKLQkJCSAgICIlZCB3aGVuIG9ubHkgJWQgYXJlIGF2YWlsYWJsZS5cbiIsCisJCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiQXR0ZW1wdGluZyB0byByZWdpc3RlciBwb3J0ICVkIHdoZW4gb25seSAlZCBhcmUgYXZhaWxhYmxlXG4iLAogCQkJICAgaW5kZXgrMSwgU0NJX05QT1JUUyk7Ci0JCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiQ29uc2lkZXIgYnVtcGluZyAiCi0JCQkgICAiQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFMhXG4iKTsKKwkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJDb25zaWRlciBidW1waW5nIENPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjU2Myw2ICsyNTYyLDcgQEAKIAlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZzcC0+ZnJlcV90cmFuc2l0aW9uLAogCQkJCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOwogCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2NpX3VhcnRfZHJpdmVyLCAmc3AtPnBvcnQpOwogCQlzY2lfY2xlYW51cF9zaW5nbGUoc3ApOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTI2MTQsNyArMjYxNCw3IEBACiB7CiAJaW50IHJldDsKIAotCXByaW50ayhiYW5uZXIpOworCXByX2luZm8oIiVzXG4iLCBiYW5uZXIpOwogCiAJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnNjaV91YXJ0X2RyaXZlcik7CiAJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuYwppbmRleCBiN2JmZTI0Li42OGIwZmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2lyZnNvY191YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRpcmVjdGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lyZnNvY19kbWEuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKQEAgLTE3Myw3ICsxNzIsNyBAQAogCXN0cnVjdCBzaXJmc29jX3JlZ2lzdGVyICp1cmVnID0gJnNpcmZwb3J0LT51YXJ0X3JlZy0+dWFydF9yZWc7CiAJc3RydWN0IHNpcmZzb2NfaW50X2VuICp1aW50X2VuID0gJnNpcmZwb3J0LT51YXJ0X3JlZy0+dWFydF9pbnRfZW47CiAKLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnR4X2RtYV9ubykpIHsKKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKSB7CiAJCWlmIChzaXJmcG9ydC0+dHhfZG1hX3N0YXRlID09IFRYX0RNQV9SVU5OSU5HKSB7CiAJCQlkbWFlbmdpbmVfcGF1c2Uoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKTsKIAkJCXNpcmZwb3J0LT50eF9kbWFfc3RhdGUgPSBUWF9ETUFfUEFVU0U7CkBAIC0yODgsNyArMjg3LDcgQEAKIAlzdHJ1Y3Qgc2lyZnNvY191YXJ0X3BvcnQgKnNpcmZwb3J0ID0gdG9fc2lyZnBvcnQocG9ydCk7CiAJc3RydWN0IHNpcmZzb2NfcmVnaXN0ZXIgKnVyZWcgPSAmc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X3JlZzsKIAlzdHJ1Y3Qgc2lyZnNvY19pbnRfZW4gKnVpbnRfZW4gPSAmc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X2ludF9lbjsKLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnR4X2RtYV9ubykpCisJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikKIAkJc2lyZnNvY191YXJ0X3R4X3dpdGhfZG1hKHNpcmZwb3J0KTsKIAllbHNlIHsKIAkJc2lyZnNvY191YXJ0X3Bpb190eF9jaGFycyhzaXJmcG9ydCwgMSk7CkBAIC0zMTAsNyArMzA5LDcgQEAKIAlzdHJ1Y3Qgc2lyZnNvY19pbnRfZW4gKnVpbnRfZW4gPSAmc2lyZnBvcnQtPnVhcnRfcmVnLT51YXJ0X2ludF9lbjsKIAogCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9maWZvX29wLCAwKTsKLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnJ4X2RtYV9ubykpIHsKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKSB7CiAJCWlmICghc2lyZnBvcnQtPmlzX21hcmNvKQogCQkJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX2ludF9lbl9yZWcsCiAJCQkJcmRfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX2ludF9lbl9yZWcpICYKQEAgLTY3NSw3ICs2NzQsNyBAQAogCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHBvcnQsIGN0c19zdGF0dXMpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnN0YXRlLT5wb3J0LmRlbHRhX21zcl93YWl0KTsKIAl9Ci0JaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT5yeF9kbWFfbm8pKSB7CisJaWYgKHNpcmZwb3J0LT5yeF9kbWFfY2hhbikgewogCQlpZiAoaW50cl9zdGF0dXMgJiB1aW50X3N0LT5zaXJmc29jX3J4X3RpbWVvdXQpCiAJCQlzaXJmc29jX3VhcnRfaGFuZGxlX3J4X3RtbyhzaXJmcG9ydCk7CiAJCWlmIChpbnRyX3N0YXR1cyAmIHVpbnRfc3QtPnNpcmZzb2NfcnhfZG9uZSkKQEAgLTY4Niw3ICs2ODUsNyBAQAogCQkJCQlTSVJGU09DX1VBUlRfSU9fUlhfTUFYX0NOVCk7CiAJfQogCWlmIChpbnRyX3N0YXR1cyAmIHVpbnRfc3QtPnNpcmZzb2NfdHhmaWZvX2VtcHR5KSB7Ci0JCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+dHhfZG1hX25vKSkKKwkJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikKIAkJCXNpcmZzb2NfdWFydF90eF93aXRoX2RtYShzaXJmcG9ydCk7CiAJCWVsc2UgewogCQkJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKQEAgLTc3OCw3ICs3NzcsNyBAQAogCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9maWZvX29wLCBTSVJGVUFSVF9GSUZPX1JFU0VUKTsKIAl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZmlmb19vcCwgMCk7CiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fb3AsIFNJUkZVQVJUX0ZJRk9fU1RBUlQpOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+cnhfZG1hX25vKSkKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKQogCQlzaXJmc29jX3VhcnRfc3RhcnRfbmV4dF9yeF9kbWEocG9ydCk7CiAJZWxzZSB7CiAJCWlmICghc2lyZnBvcnQtPmlzX21hcmNvKQpAQCAtMTAxNCwxMSArMTAxMywxMSBAQAogCQkJKHNhbXBsZV9kaXZfcmVnICYgU0lSRlNPQ19VU1BfQVNZTkNfRElWMl9NQVNLKSA8PAogCQkJU0lSRlNPQ19VU1BfQVNZTkNfRElWMl9PRkZTRVQpOwogCX0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnR4X2RtYV9ubykpCisJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikKIAkJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3R4X2RtYV9pb19jdHJsLCBTSVJGVUFSVF9ETUFfTU9ERSk7CiAJZWxzZQogCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfdHhfZG1hX2lvX2N0cmwsIFNJUkZVQVJUX0lPX01PREUpOwotCWlmIChJU19ETUFfQ0hBTl9WQUxJRChzaXJmcG9ydC0+cnhfZG1hX25vKSkKKwlpZiAoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKQogCQl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfcnhfZG1hX2lvX2N0cmwsIFNJUkZVQVJUX0RNQV9NT0RFKTsKIAllbHNlCiAJCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9kbWFfaW9fY3RybCwgU0lSRlVBUlRfSU9fTU9ERSk7CkBAIC0xMDQ5LDkzICsxMDQ4LDYgQEAKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNpcmZwb3J0LT5jbGspOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpcmZzb2NfdWFydF9pbml0X3R4X2RtYShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBzaXJmc29jX3VhcnRfcG9ydCAqc2lyZnBvcnQgPSB0b19zaXJmcG9ydChwb3J0KTsKLQlkbWFfY2FwX21hc2tfdCBkbWFfbWFzazsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyB0eF9zbHZfY2ZnID0gewotCQkuZHN0X21heGJ1cnN0ID0gMiwKLQl9OwotCi0JZG1hX2NhcF96ZXJvKGRtYV9tYXNrKTsKLQlkbWFfY2FwX3NldChETUFfU0xBVkUsIGRtYV9tYXNrKTsKLQlzaXJmcG9ydC0+dHhfZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKGRtYV9tYXNrLAotCQkoZG1hX2ZpbHRlcl9mbilzaXJmc29jX2RtYV9maWx0ZXJfaWQsCi0JCSh2b2lkICopc2lyZnBvcnQtPnR4X2RtYV9ubyk7Ci0JaWYgKCFzaXJmcG9ydC0+dHhfZG1hX2NoYW4pIHsKLQkJZGV2X2Vycihwb3J0LT5kZXYsICJVYXJ0IFJlcXVlc3QgRG1hIENoYW5uZWwgRmFpbCAlZFxuIiwKLQkJCQkJc2lyZnBvcnQtPnR4X2RtYV9ubyk7Ci0JCXJldHVybiAgLUVQUk9CRV9ERUZFUjsKLQl9Ci0JZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzaXJmcG9ydC0+dHhfZG1hX2NoYW4sICZ0eF9zbHZfY2ZnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpcmZzb2NfdWFydF9pbml0X3J4X2RtYShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBzaXJmc29jX3VhcnRfcG9ydCAqc2lyZnBvcnQgPSB0b19zaXJmcG9ydChwb3J0KTsKLQlkbWFfY2FwX21hc2tfdCBkbWFfbWFzazsKLQlpbnQgcmV0OwotCWludCBpLCBqOwotCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHNsdl9jZmcgPSB7Ci0JCS5zcmNfbWF4YnVyc3QgPSAyLAotCX07Ci0KLQlkbWFfY2FwX3plcm8oZG1hX21hc2spOwotCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgZG1hX21hc2spOwotCXNpcmZwb3J0LT5yeF9kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX21hc2ssCi0JCQkJCShkbWFfZmlsdGVyX2ZuKXNpcmZzb2NfZG1hX2ZpbHRlcl9pZCwKLQkJCQkJKHZvaWQgKilzaXJmcG9ydC0+cnhfZG1hX25vKTsKLQlpZiAoIXNpcmZwb3J0LT5yeF9kbWFfY2hhbikgewotCQlkZXZfZXJyKHBvcnQtPmRldiwgIlVhcnQgUmVxdWVzdCBEbWEgQ2hhbm5lbCBGYWlsICVkXG4iLAotCQkJCXNpcmZwb3J0LT5yeF9kbWFfbm8pOwotCQlyZXQgPSAtRVBST0JFX0RFRkVSOwotCQlnb3RvIHJlcXVlc3RfZXJyOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgU0lSRlNPQ19SWF9MT09QX0JVRl9DTlQ7IGkrKykgewotCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQuYnVmID0KLQkJCWRtYV9hbGxvY19jb2hlcmVudChwb3J0LT5kZXYsIFNJUkZTT0NfUlhfRE1BX0JVRl9TSVpFLAotCQkJJnNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0uZG1hX2FkZHIsIEdGUF9LRVJORUwpOwotCQlpZiAoIXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5idWYpIHsKLQkJCWRldl9lcnIocG9ydC0+ZGV2LCAiVWFydCBhbGxvYyBidWZhIGZhaWxlZFxuIik7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBhbGxvY19jb2hlcmVudF9lcnI7Ci0JCX0KLQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmhlYWQgPQotCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LnRhaWwgPSAwOwotCX0KLQlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHNpcmZwb3J0LT5yeF9kbWFfY2hhbiwgJnNsdl9jZmcpOwotCi0JcmV0dXJuIDA7Ci1hbGxvY19jb2hlcmVudF9lcnI6Ci0JZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJZG1hX2ZyZWVfY29oZXJlbnQocG9ydC0+ZGV2LCBTSVJGU09DX1JYX0RNQV9CVUZfU0laRSwKLQkJCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2pdLnhtaXQuYnVmLAotCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbal0uZG1hX2FkZHIpOwotCWRtYV9yZWxlYXNlX2NoYW5uZWwoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKTsKLXJlcXVlc3RfZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpcmZzb2NfdWFydF91bmluaXRfdHhfZG1hKHN0cnVjdCBzaXJmc29jX3VhcnRfcG9ydCAqc2lyZnBvcnQpCi17Ci0JZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKTsKLQlkbWFfcmVsZWFzZV9jaGFubmVsKHNpcmZwb3J0LT50eF9kbWFfY2hhbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpcmZzb2NfdWFydF91bmluaXRfcnhfZG1hKHN0cnVjdCBzaXJmc29jX3VhcnRfcG9ydCAqc2lyZnBvcnQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzaXJmcG9ydC0+cG9ydDsKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOwotCWRtYV9yZWxlYXNlX2NoYW5uZWwoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKTsKLQlmb3IgKGkgPSAwOyBpIDwgU0lSRlNPQ19SWF9MT09QX0JVRl9DTlQ7IGkrKykKLQkJZG1hX2ZyZWVfY29oZXJlbnQocG9ydC0+ZGV2LCBTSVJGU09DX1JYX0RNQV9CVUZfU0laRSwKLQkJCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQuYnVmLAotCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0uZG1hX2FkZHIpOwotfQotCiBzdGF0aWMgaW50IHNpcmZzb2NfdWFydF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHNpcmZzb2NfdWFydF9wb3J0ICpzaXJmcG9ydAk9IHRvX3NpcmZwb3J0KHBvcnQpOwpAQCAtMTE3NCwxOCArMTA4NiwxMiBAQAogCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY19yeF9maWZvX29wLCAwKTsKIAl3cl9yZWdsKHBvcnQsIHVyZWctPnNpcmZzb2NfdHhfZmlmb19jdHJsLCBTSVJGVUFSVF9GSUZPX1RIRChwb3J0KSk7CiAJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fY3RybCwgU0lSRlVBUlRfRklGT19USEQocG9ydCkpOwotCi0JaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT5yeF9kbWFfbm8pKSB7Ci0JCXJldCA9IHNpcmZzb2NfdWFydF9pbml0X3J4X2RtYShwb3J0KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gaW5pdF9yeF9lcnI7CisJaWYgKHNpcmZwb3J0LT5yeF9kbWFfY2hhbikKIAkJd3JfcmVnbChwb3J0LCB1cmVnLT5zaXJmc29jX3J4X2ZpZm9fbGV2ZWxfY2hrLAotCQkJCVNJUkZVQVJUX1JYX0ZJRk9fQ0hLX1NDKHBvcnQtPmxpbmUsIDB4NCkgfAotCQkJCVNJUkZVQVJUX1JYX0ZJRk9fQ0hLX0xDKHBvcnQtPmxpbmUsIDB4ZSkgfAotCQkJCVNJUkZVQVJUX1JYX0ZJRk9fQ0hLX0hDKHBvcnQtPmxpbmUsIDB4MWIpKTsKLQl9Ci0JaWYgKElTX0RNQV9DSEFOX1ZBTElEKHNpcmZwb3J0LT50eF9kbWFfbm8pKSB7Ci0JCXNpcmZzb2NfdWFydF9pbml0X3R4X2RtYShwb3J0KTsKKwkJCVNJUkZVQVJUX1JYX0ZJRk9fQ0hLX1NDKHBvcnQtPmxpbmUsIDB4NCkgfAorCQkJU0lSRlVBUlRfUlhfRklGT19DSEtfTEMocG9ydC0+bGluZSwgMHhlKSB8CisJCQlTSVJGVUFSVF9SWF9GSUZPX0NIS19IQyhwb3J0LT5saW5lLCAweDFiKSk7CisJaWYgKHNpcmZwb3J0LT50eF9kbWFfY2hhbikgewogCQlzaXJmcG9ydC0+dHhfZG1hX3N0YXRlID0gVFhfRE1BX0lETEU7CiAJCXdyX3JlZ2wocG9ydCwgdXJlZy0+c2lyZnNvY190eF9maWZvX2xldmVsX2NoaywKIAkJCQlTSVJGVUFSVF9UWF9GSUZPX0NIS19TQyhwb3J0LT5saW5lLCAweDFiKSB8CkBAIC0xMjMyLDEyICsxMTM4LDggQEAKIAkJZ3Bpb19zZXRfdmFsdWUoc2lyZnBvcnQtPnJ0c19ncGlvLCAxKTsKIAkJZnJlZV9pcnEoZ3Bpb190b19pcnEoc2lyZnBvcnQtPmN0c19ncGlvKSwgc2lyZnBvcnQpOwogCX0KLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnJ4X2RtYV9ubykpCi0JCXNpcmZzb2NfdWFydF91bmluaXRfcnhfZG1hKHNpcmZwb3J0KTsKLQlpZiAoSVNfRE1BX0NIQU5fVkFMSUQoc2lyZnBvcnQtPnR4X2RtYV9ubykpIHsKLQkJc2lyZnNvY191YXJ0X3VuaW5pdF90eF9kbWEoc2lyZnBvcnQpOworCWlmIChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pCiAJCXNpcmZwb3J0LT50eF9kbWFfc3RhdGUgPSBUWF9ETUFfSURMRTsKLQl9CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzaXJmc29jX3VhcnRfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMTMxMyw4ICsxMjE1LDggQEAKIAlwb3J0LT5jb25zID0gY287CiAKIAkvKiBkZWZhdWx0IGNvbnNvbGUgdHgvcnggdHJhbnNmZXIgdXNpbmcgaW8gbW9kZSAqLwotCXNpcmZwb3J0LT5yeF9kbWFfbm8gPSBVTlZBTElEX0RNQV9DSEFOOwotCXNpcmZwb3J0LT50eF9kbWFfbm8gPSBVTlZBTElEX0RNQV9DSEFOOworCXNpcmZwb3J0LT5yeF9kbWFfY2hhbiA9IE5VTEw7CisJc2lyZnBvcnQtPnR4X2RtYV9jaGFuID0gTlVMTDsKIAlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKIH0KIApAQCAtMTM4Miw2ICsxMjg0LDEzIEBACiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0OworCWludCBpLCBqOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHNsdl9jZmcgPSB7CisJCS5zcmNfbWF4YnVyc3QgPSAyLAorCX07CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgdHhfc2x2X2NmZyA9IHsKKwkJLmRzdF9tYXhidXJzdCA9IDIsCisJfTsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAogCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShzaXJmc29jX3VhcnRfaWRzLCBwZGV2LT5kZXYub2Zfbm9kZSk7CkBAIC0xNDAyLDI3ICsxMzExLDEwIEBACiAKIAlzaXJmcG9ydC0+aHdfZmxvd19jdHJsID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAogCQkic2lyZix1YXJ0LWhhcy1ydHNjdHMiKTsKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJzaXJmLHByaW1hMi11YXJ0IikpIHsKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJzaXJmLHByaW1hMi11YXJ0IikpCiAJCXNpcmZwb3J0LT51YXJ0X3JlZy0+dWFydF90eXBlID0gU0lSRl9SRUFMX1VBUlQ7Ci0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkic2lyZix1YXJ0LWRtYS1yeC1jaGFubmVsIiwKLQkJCQkmc2lyZnBvcnQtPnJ4X2RtYV9ubykpCi0JCQlzaXJmcG9ydC0+cnhfZG1hX25vID0gVU5WQUxJRF9ETUFfQ0hBTjsKLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSJzaXJmLHVhcnQtZG1hLXR4LWNoYW5uZWwiLAotCQkJCSZzaXJmcG9ydC0+dHhfZG1hX25vKSkKLQkJCXNpcmZwb3J0LT50eF9kbWFfbm8gPSBVTlZBTElEX0RNQV9DSEFOOwotCX0KIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJzaXJmLHByaW1hMi11c3AtdWFydCIpKSB7CiAJCXNpcmZwb3J0LT51YXJ0X3JlZy0+dWFydF90eXBlID0JU0lSRl9VU1BfVUFSVDsKLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSJzaXJmLHVzcC1kbWEtcngtY2hhbm5lbCIsCi0JCQkJJnNpcmZwb3J0LT5yeF9kbWFfbm8pKQotCQkJc2lyZnBvcnQtPnJ4X2RtYV9ubyA9IFVOVkFMSURfRE1BX0NIQU47Ci0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkic2lyZix1c3AtZG1hLXR4LWNoYW5uZWwiLAotCQkJCSZzaXJmcG9ydC0+dHhfZG1hX25vKSkKLQkJCXNpcmZwb3J0LT50eF9kbWFfbm8gPSBVTlZBTElEX0RNQV9DSEFOOwogCQlpZiAoIXNpcmZwb3J0LT5od19mbG93X2N0cmwpCiAJCQlnb3RvIHVzcF9ub19mbG93X2NvbnRyb2w7CiAJCWlmIChvZl9maW5kX3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLCAiY3RzLWdwaW9zIiwgTlVMTCkpCkBAIC0xNTE1LDggKzE0MDcsMzIgQEAKIAkJZ290byBwb3J0X2VycjsKIAl9CiAKLQlyZXR1cm4gMDsKKwlzaXJmcG9ydC0+cnhfZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKHBvcnQtPmRldiwgInJ4Iik7CisJZm9yIChpID0gMDsgc2lyZnBvcnQtPnJ4X2RtYV9jaGFuICYmIGkgPCBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVDsgaSsrKSB7CisJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5idWYgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KHBvcnQtPmRldiwgU0lSRlNPQ19SWF9ETUFfQlVGX1NJWkUsCisJCQkmc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS5kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tpXS54bWl0LmJ1ZikgeworCQkJZGV2X2Vycihwb3J0LT5kZXYsICJVYXJ0IGFsbG9jIGJ1ZmEgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGFsbG9jX2NvaGVyZW50X2VycjsKKwkJfQorCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQuaGVhZCA9CisJCQlzaXJmcG9ydC0+cnhfZG1hX2l0ZW1zW2ldLnhtaXQudGFpbCA9IDA7CisJfQorCWlmIChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pCisJCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuLCAmc2x2X2NmZyk7CisJc2lyZnBvcnQtPnR4X2RtYV9jaGFuID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChwb3J0LT5kZXYsICJ0eCIpOworCWlmIChzaXJmcG9ydC0+dHhfZG1hX2NoYW4pCisJCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc2lyZnBvcnQtPnR4X2RtYV9jaGFuLCAmdHhfc2x2X2NmZyk7CiAKKwlyZXR1cm4gMDsKK2FsbG9jX2NvaGVyZW50X2VycjoKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQlkbWFfZnJlZV9jb2hlcmVudChwb3J0LT5kZXYsIFNJUkZTT0NfUlhfRE1BX0JVRl9TSVpFLAorCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbal0ueG1pdC5idWYsCisJCQkJc2lyZnBvcnQtPnJ4X2RtYV9pdGVtc1tqXS5kbWFfYWRkcik7CisJZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOwogcG9ydF9lcnI6CiAJY2xrX3B1dChzaXJmcG9ydC0+Y2xrKTsKIGVycjoKQEAgLTE1MjksNiArMTQ0NSwxOSBAQAogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmc2lyZnBvcnQtPnBvcnQ7CiAJY2xrX3B1dChzaXJmcG9ydC0+Y2xrKTsKIAl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2lyZnNvY191YXJ0X2RydiwgcG9ydCk7CisJaWYgKHNpcmZwb3J0LT5yeF9kbWFfY2hhbikgeworCQlpbnQgaTsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc2lyZnBvcnQtPnJ4X2RtYV9jaGFuKTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChzaXJmcG9ydC0+cnhfZG1hX2NoYW4pOworCQlmb3IgKGkgPSAwOyBpIDwgU0lSRlNPQ19SWF9MT09QX0JVRl9DTlQ7IGkrKykKKwkJCWRtYV9mcmVlX2NvaGVyZW50KHBvcnQtPmRldiwgU0lSRlNPQ19SWF9ETUFfQlVGX1NJWkUsCisJCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0ueG1pdC5idWYsCisJCQkJCXNpcmZwb3J0LT5yeF9kbWFfaXRlbXNbaV0uZG1hX2FkZHIpOworCX0KKwlpZiAoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKSB7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNpcmZwb3J0LT50eF9kbWFfY2hhbik7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwoc2lyZnBvcnQtPnR4X2RtYV9jaGFuKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuaCBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaXJmc29jX3VhcnQuaAppbmRleCBiN2Q2NzljLi44YTZlZGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2lyZnNvY191YXJ0LmgKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NpcmZzb2NfdWFydC5oCkBAIC0zOTIsOSArMzkyLDYgQEAKIC8qIEluZGljYXRlIGhvdyBtYW55IGJ1ZmZlcnMgdXNlZCAqLwogI2RlZmluZSBTSVJGU09DX1JYX0xPT1BfQlVGX0NOVAkJMgogCi0vKiBJbmRpY2F0ZSBpZiBETUEgY2hhbm5lbCB2YWxpZCAqLwotI2RlZmluZSBJU19ETUFfQ0hBTl9WQUxJRCh4KQkoKHgpICE9IC0xKQotI2RlZmluZSBVTlZBTElEX0RNQV9DSEFOCS0xCiAvKiBGb3IgRmFzdCBCYXVkIFJhdGUgQ2FsY3VsYXRpb24gKi8KIHN0cnVjdCBzaXJmc29jX2JhdWRyYXRlX3RvX3JlZ3YgewogCXVuc2lnbmVkIGludCBiYXVkX3JhdGU7CkBAIC00MjMsOCArNDIwLDYgQEAKIAkvKiBmb3IgU2lSRm1hcmNvLCB0aGVyZSBhcmUgU0VUL0NMUiBmb3IgVUFSVF9JTlRfRU4gKi8KIAlib29sCQkJCWlzX21hcmNvOwogCXN0cnVjdCBzaXJmc29jX3VhcnRfcmVnaXN0ZXIJKnVhcnRfcmVnOwotCWludAkJCQlyeF9kbWFfbm87Ci0JaW50CQkJCXR4X2RtYV9ubzsKIAlzdHJ1Y3QgZG1hX2NoYW4JCQkqcnhfZG1hX2NoYW47CiAJc3RydWN0IGRtYV9jaGFuCQkJKnR4X2RtYV9jaGFuOwogCWRtYV9hZGRyX3QJCQl0eF9kbWFfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdW5odi5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bmh2LmMKaW5kZXggY2Y4NmU3Mi4uZGM2OTdjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bmh2LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bmh2LmMKQEAgLTQzMywxMyArNDMzLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbG9ja2VkID0gMTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAocG9ydC0+c3lzcnEpIHsKLQkJbG9ja2VkID0gMDsKLQl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKLQkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZwb3J0LT5sb2NrKTsKLQl9IGVsc2UKLQkJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+c3lzcnEgfHwgb29wc19pbl9wcm9ncmVzcykKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwllbHNlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKIAl3aGlsZSAobiA+IDApIHsKIAkJdW5zaWduZWQgbG9uZyByYSA9IF9fcGEoY29uX3dyaXRlX3BhZ2UpOwpAQCAtNDcwLDggKzQ2Nyw3IEBACiAJfQogCiAJaWYgKGxvY2tlZCkKLQkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3VuaHZfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGNoYXIgYykKQEAgLTQ5Miw3ICs0ODgsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpLCBsb2NrZWQgPSAxOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChwb3J0LT5zeXNycSB8fCBvb3BzX2luX3Byb2dyZXNzKQorCQlsb2NrZWQgPSBzcGluX3RyeWxvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWVsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAlpZiAocG9ydC0+c3lzcnEpIHsKIAkJbG9ja2VkID0gMDsKIAl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKQEAgLTUwNyw4ICs1MDYsNyBAQAogCX0KIAogCWlmIChsb2NrZWQpCi0JCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIHN1bmh2X2NvbnNvbGUgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuc2FiLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggMzgwZmI1My4uNWZhYThlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bnNhYi5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdW5zYWIuYwpAQCAtODQ0LDIwICs4NDQsMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBsb2NrZWQgPSAxOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmICh1cC0+cG9ydC5zeXNycSkgewotCQlsb2NrZWQgPSAwOwotCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgewotCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnVwLT5wb3J0LmxvY2spOwotCX0gZWxzZQotCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOworCWlmICh1cC0+cG9ydC5zeXNycSB8fCBvb3BzX2luX3Byb2dyZXNzKQorCQlsb2NrZWQgPSBzcGluX3RyeWxvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCWVsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCXVhcnRfY29uc29sZV93cml0ZSgmdXAtPnBvcnQsIHMsIG4sIHN1bnNhYl9jb25zb2xlX3B1dGNoYXIpOwogCXN1bnNhYl90ZWNfd2FpdCh1cCk7CiAKIAlpZiAobG9ja2VkKQotCQlzcGluX3VubG9jaygmdXAtPnBvcnQubG9jayk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgc3Vuc2FiX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbiwgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdW5zdS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bnN1LmMKaW5kZXggZGI3OWI3Ni4uOWEwZjI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bnN1LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bnN1LmMKQEAgLTEyOTUsMTMgKzEyOTUsMTAgQEAKIAl1bnNpZ25lZCBpbnQgaWVyOwogCWludCBsb2NrZWQgPSAxOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmICh1cC0+cG9ydC5zeXNycSkgewotCQlsb2NrZWQgPSAwOwotCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgewotCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnVwLT5wb3J0LmxvY2spOwotCX0gZWxzZQotCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOworCWlmICh1cC0+cG9ydC5zeXNycSB8fCBvb3BzX2luX3Byb2dyZXNzKQorCQlsb2NrZWQgPSBzcGluX3RyeWxvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCWVsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCS8qCiAJICoJRmlyc3Qgc2F2ZSB0aGUgVUVSIHRoZW4gZGlzYWJsZSB0aGUgaW50ZXJydXB0cwpAQCAtMTMxOSw4ICsxMzE2LDcgQEAKIAlzZXJpYWxfb3V0KHVwLCBVQVJUX0lFUiwgaWVyKTsKIAogCWlmIChsb2NrZWQpCi0JCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdW56aWxvZy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bnppbG9nLmMKaW5kZXggNDVhOGM2YS4uYTJjNDBlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bnppbG9nLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bnppbG9nLmMKQEAgLTExOTUsMjAgKzExOTUsMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBsb2NrZWQgPSAxOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmICh1cC0+cG9ydC5zeXNycSkgewotCQlsb2NrZWQgPSAwOwotCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgewotCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnVwLT5wb3J0LmxvY2spOwotCX0gZWxzZQotCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOworCWlmICh1cC0+cG9ydC5zeXNycSB8fCBvb3BzX2luX3Byb2dyZXNzKQorCQlsb2NrZWQgPSBzcGluX3RyeWxvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCWVsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCXVhcnRfY29uc29sZV93cml0ZSgmdXAtPnBvcnQsIHMsIGNvdW50LCBzdW56aWxvZ19wdXRjaGFyKTsKIAl1ZGVsYXkoMik7CiAKIAlpZiAobG9ja2VkKQotCQlzcGluX3VubG9jaygmdXAtPnBvcnQubG9jayk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHN1bnppbG9nX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbiwgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3N5bmNsaW5rLmMgYi9kcml2ZXJzL3R0eS9zeW5jbGluay5jCmluZGV4IDVhZTE0YjQuLmQ0OGUwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3N5bmNsaW5rLmMKKysrIGIvZHJpdmVycy90dHkvc3luY2xpbmsuYwpAQCAtNzg2Niw2ICs3ODY2LDcgQEAKIAkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAogCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsKIAorCQltZW1zZXQoJm5ld19saW5lLCAwLCBzaXplb2YobmV3X2xpbmUpKTsKIAkJc3dpdGNoIChmbGFncyl7CiAJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOyBicmVhazsKIAkJY2FzZSAoSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19JTlQ7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc3luY2xpbmttcC5jIGIvZHJpdmVycy90dHkvc3luY2xpbmttcC5jCmluZGV4IDE0NDIwMmUuLjUzYmE4NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3N5bmNsaW5rbXAuYworKysgYi9kcml2ZXJzL3R0eS9zeW5jbGlua21wLmMKQEAgLTE3NjYsNiArMTc2Niw3IEBACiAJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKIAkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CiAKKwkJbWVtc2V0KCZuZXdfbGluZSwgMCwgc2l6ZW9mKG5ld19saW5lKSk7CiAJCXN3aXRjaCAoZmxhZ3MpewogCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfVFhDUElOKTogbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsgYnJlYWs7CiAJCWNhc2UgKEhETENfRkxBR19SWENfQlJHICAgIHwgSERMQ19GTEFHX1RYQ19CUkcpOiAgICBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfSU5UOyBicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3R0eV9idWZmZXIuYyBiL2RyaXZlcnMvdHR5L3R0eV9idWZmZXIuYwppbmRleCA3NjUxMjVkLi44ZWJkOWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS90dHlfYnVmZmVyLmMKKysrIGIvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jCkBAIC0zNTEsMTQgKzM1MSwxMSBAQAogICoJVGFrZXMgYW55IHBlbmRpbmcgYnVmZmVycyBhbmQgdHJhbnNmZXJzIHRoZWlyIG93bmVyc2hpcCB0byB0aGUKICAqCWxkaXNjIHNpZGUgb2YgdGhlIHF1ZXVlLiBJdCB0aGVuIHNjaGVkdWxlcyB0aG9zZSBjaGFyYWN0ZXJzIGZvcgogICoJcHJvY2Vzc2luZyBieSB0aGUgbGluZSBkaXNjaXBsaW5lLgotICoJTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBsb3dfbGF0ZW5jeSBmbGFnCi0gKglpcyB1bnNldC4gT3RoZXJ3aXNlIHRoZSB3b3JrcXVldWUgd29uJ3QgYmUgZmx1c2hlZC4KICAqLwogCiB2b2lkIHR0eV9zY2hlZHVsZV9mbGlwKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdHR5X2J1ZmhlYWQgKmJ1ZiA9ICZwb3J0LT5idWY7Ci0JV0FSTl9PTihwb3J0LT5sb3dfbGF0ZW5jeSk7CiAKIAlidWYtPnRhaWwtPmNvbW1pdCA9IGJ1Zi0+dGFpbC0+dXNlZDsKIAlzY2hlZHVsZV93b3JrKCZidWYtPndvcmspOwpAQCAtNDgyLDE3ICs0NzksMTUgQEAKICAqLwogdm9pZCB0dHlfZmx1c2hfdG9fbGRpc2Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlpZiAoIXR0eS0+cG9ydC0+bG93X2xhdGVuY3kpCi0JCWZsdXNoX3dvcmsoJnR0eS0+cG9ydC0+YnVmLndvcmspOworCWZsdXNoX3dvcmsoJnR0eS0+cG9ydC0+YnVmLndvcmspOwogfQogCiAvKioKICAqCXR0eV9mbGlwX2J1ZmZlcl9wdXNoCS0JdGVybWluYWwKICAqCUBwb3J0OiB0dHkgcG9ydCB0byBwdXNoCiAgKgotICoJUXVldWUgYSBwdXNoIG9mIHRoZSB0ZXJtaW5hbCBmbGlwIGJ1ZmZlcnMgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4gVGhpcwotICoJZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gSVJRIGNvbnRleHQgaWYgcG9ydC0+bG93X2xhdGVuY3kgaXMKLSAqCXNldC4KKyAqCVF1ZXVlIGEgcHVzaCBvZiB0aGUgdGVybWluYWwgZmxpcCBidWZmZXJzIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuCisgKglDYW4gYmUgY2FsbGVkIGZyb20gSVJRL2F0b21pYyBjb250ZXh0LgogICoKICAqCUluIHRoZSBldmVudCBvZiB0aGUgcXVldWUgYmVpbmcgYnVzeSBmb3IgZmxpcHBpbmcgdGhlIHdvcmsgd2lsbCBiZQogICoJaGVsZCBvZmYgYW5kIHJldHJpZWQgbGF0ZXIuCkBAIC01MDAsMTQgKzQ5NSw3IEBACiAKIHZvaWQgdHR5X2ZsaXBfYnVmZmVyX3B1c2goc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewotCXN0cnVjdCB0dHlfYnVmaGVhZCAqYnVmID0gJnBvcnQtPmJ1ZjsKLQotCWJ1Zi0+dGFpbC0+Y29tbWl0ID0gYnVmLT50YWlsLT51c2VkOwotCi0JaWYgKHBvcnQtPmxvd19sYXRlbmN5KQotCQlmbHVzaF90b19sZGlzYygmYnVmLT53b3JrKTsKLQllbHNlCi0JCXNjaGVkdWxlX3dvcmsoJmJ1Zi0+d29yayk7CisJdHR5X3NjaGVkdWxlX2ZsaXAocG9ydCk7CiB9CiBFWFBPUlRfU1lNQk9MKHR0eV9mbGlwX2J1ZmZlcl9wdXNoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdHR5X2lvLmMgYi9kcml2ZXJzL3R0eS90dHlfaW8uYwppbmRleCBjNzRhMDBhLi5kMzQ0OGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS90dHlfaW8uYworKysgYi9kcml2ZXJzL3R0eS90dHlfaW8uYwpAQCAtMTI3MSwxMiArMTI3MSwxMyBAQAogICoKICAqCUxvY2tpbmc6IE5vbmUKICAqLwotc3RhdGljIHZvaWQgdHR5X2xpbmVfbmFtZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaW5kZXgsIGNoYXIgKnApCitzdGF0aWMgc3NpemVfdCB0dHlfbGluZV9uYW1lKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpbmRleCwgY2hhciAqcCkKIHsKIAlpZiAoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfVU5OVU1CRVJFRF9OT0RFKQotCQlzdHJjcHkocCwgZHJpdmVyLT5uYW1lKTsKKwkJcmV0dXJuIHNwcmludGYocCwgIiVzIiwgZHJpdmVyLT5uYW1lKTsKIAllbHNlCi0JCXNwcmludGYocCwgIiVzJWQiLCBkcml2ZXItPm5hbWUsIGluZGV4ICsgZHJpdmVyLT5uYW1lX2Jhc2UpOworCQlyZXR1cm4gc3ByaW50ZihwLCAiJXMlZCIsIGRyaXZlci0+bmFtZSwKKwkJCSAgICAgICBpbmRleCArIGRyaXZlci0+bmFtZV9iYXNlKTsKIH0KIAogLyoqCkBAIC0zNTQ1LDkgKzM1NDYsMTkgQEAKIAkJaWYgKGkgPj0gQVJSQVlfU0laRShjcykpCiAJCQlicmVhazsKIAl9Ci0Jd2hpbGUgKGktLSkKLQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiVzJWQlYyIsCi0JCQkJIGNzW2ldLT5uYW1lLCBjc1tpXS0+aW5kZXgsIGkgPyAnICc6J1xuJyk7CisJd2hpbGUgKGktLSkgeworCQlpbnQgaW5kZXggPSBjc1tpXS0+aW5kZXg7CisJCXN0cnVjdCB0dHlfZHJpdmVyICpkcnYgPSBjc1tpXS0+ZGV2aWNlKGNzW2ldLCAmaW5kZXgpOworCisJCS8qIGRvbid0IHJlc29sdmUgdHR5MCBhcyBzb21lIHByb2dyYW1zIGRlcGVuZCBvbiBpdCAqLworCQlpZiAoZHJ2ICYmIChjc1tpXS0+aW5kZXggPiAwIHx8IGRydi0+bWFqb3IgIT0gVFRZX01BSk9SKSkKKwkJCWNvdW50ICs9IHR0eV9saW5lX25hbWUoZHJ2LCBpbmRleCwgYnVmICsgY291bnQpOworCQllbHNlCisJCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJXMlZCIsCisJCQkJCSBjc1tpXS0+bmFtZSwgY3NbaV0tPmluZGV4KTsKKworCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJWMiLCBpID8gJyAnOidcbicpOworCX0KIAljb25zb2xlX3VubG9jaygpOwogCiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdHR5X2xkc2VtLmMgYi9kcml2ZXJzL3R0eS90dHlfbGRzZW0uYwppbmRleCBkOGE1NWU4Li4wZmZiMGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS90dHlfbGRzZW0uYworKysgYi9kcml2ZXJzL3R0eS90dHlfbGRzZW0uYwpAQCAtMzksMTcgKzM5LDEwIEBACiAJCQkJbG9ja19hY3F1aXJlKCYobCktPmRlcF9tYXAsIHMsIHQsIHIsIGMsIG4sIGkpCiAjIGRlZmluZSBfX3JlbChsLCBuLCBpKQkJCQlcCiAJCQkJbG9ja19yZWxlYXNlKCYobCktPmRlcF9tYXAsIG4sIGkpCi0jIGlmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCi0jICBkZWZpbmUgbG9ja2RlcF9hY3F1aXJlKGwsIHMsIHQsIGkpCQlfX2FjcShsLCBzLCB0LCAwLCAyLCBOVUxMLCBpKQotIyAgZGVmaW5lIGxvY2tkZXBfYWNxdWlyZV9uZXN0KGwsIHMsIHQsIG4sIGkpCV9fYWNxKGwsIHMsIHQsIDAsIDIsIG4sIGkpCi0jICBkZWZpbmUgbG9ja2RlcF9hY3F1aXJlX3JlYWQobCwgcywgdCwgaSkJX19hY3EobCwgcywgdCwgMSwgMiwgTlVMTCwgaSkKLSMgIGRlZmluZSBsb2NrZGVwX3JlbGVhc2UobCwgbiwgaSkJCV9fcmVsKGwsIG4sIGkpCi0jIGVsc2UKLSMgIGRlZmluZSBsb2NrZGVwX2FjcXVpcmUobCwgcywgdCwgaSkJCV9fYWNxKGwsIHMsIHQsIDAsIDEsIE5VTEwsIGkpCi0jICBkZWZpbmUgbG9ja2RlcF9hY3F1aXJlX25lc3QobCwgcywgdCwgbiwgaSkJX19hY3EobCwgcywgdCwgMCwgMSwgbiwgaSkKLSMgIGRlZmluZSBsb2NrZGVwX2FjcXVpcmVfcmVhZChsLCBzLCB0LCBpKQlfX2FjcShsLCBzLCB0LCAxLCAxLCBOVUxMLCBpKQotIyAgZGVmaW5lIGxvY2tkZXBfcmVsZWFzZShsLCBuLCBpKQkJX19yZWwobCwgbiwgaSkKLSMgZW5kaWYKKyNkZWZpbmUgbG9ja2RlcF9hY3F1aXJlKGwsIHMsIHQsIGkpCQlfX2FjcShsLCBzLCB0LCAwLCAxLCBOVUxMLCBpKQorI2RlZmluZSBsb2NrZGVwX2FjcXVpcmVfbmVzdChsLCBzLCB0LCBuLCBpKQlfX2FjcShsLCBzLCB0LCAwLCAxLCBuLCBpKQorI2RlZmluZSBsb2NrZGVwX2FjcXVpcmVfcmVhZChsLCBzLCB0LCBpKQlfX2FjcShsLCBzLCB0LCAxLCAxLCBOVUxMLCBpKQorI2RlZmluZSBsb2NrZGVwX3JlbGVhc2UobCwgbiwgaSkJCV9fcmVsKGwsIG4sIGkpCiAjZWxzZQogIyBkZWZpbmUgbG9ja2RlcF9hY3F1aXJlKGwsIHMsIHQsIGkpCQlkbyB7IH0gd2hpbGUgKDApCiAjIGRlZmluZSBsb2NrZGVwX2FjcXVpcmVfbmVzdChsLCBzLCB0LCBuLCBpKQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS92dC92dC5jIGIvZHJpdmVycy90dHkvdnQvdnQuYwppbmRleCAyM2I1ZDMyLi4zYWQwYjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS92dC92dC5jCisrKyBiL2RyaXZlcnMvdHR5L3Z0L3Z0LmMKQEAgLTE1OTAsOSArMTU5MCw5IEBACiAJdmMtPnZjX25lZWRfd3JhcCA9IDA7CiB9CiAKLWVudW0geyBFU25vcm1hbCwgRVNlc2MsIEVTc3F1YXJlLCBFU2dldHBhcnMsIEVTZ290cGFycywgRVNmdW5ja2V5LAorZW51bSB7IEVTbm9ybWFsLCBFU2VzYywgRVNzcXVhcmUsIEVTZ2V0cGFycywgRVNmdW5ja2V5LAogCUVTaGFzaCwgRVNzZXRHMCwgRVNzZXRHMSwgRVNwZXJjZW50LCBFU2lnbm9yZSwgRVNub25zdGQsCi0JRVNwYWxldHRlIH07CisJRVNwYWxldHRlLCBFU29zYyB9OwogCiAvKiBjb25zb2xlX2xvY2sgaXMgaGVsZCAoZXhjZXB0IHZpYSB2Y19pbml0KCkpICovCiBzdGF0aWMgdm9pZCByZXNldF90ZXJtaW5hbChzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBkb19jbGVhcikKQEAgLTE2NTIsMTEgKzE2NTIsMTUgQEAKIAkgKiAgQ29udHJvbCBjaGFyYWN0ZXJzIGNhbiBiZSB1c2VkIGluIHRoZSBfbWlkZGxlXwogCSAqICBvZiBhbiBlc2NhcGUgc2VxdWVuY2UuCiAJICovCisJaWYgKHZjLT52Y19zdGF0ZSA9PSBFU29zYyAmJiBjPj04ICYmIGM8PTEzKSAvKiAuLi4gZXhjZXB0IGZvciBPU0MgKi8KKwkJcmV0dXJuOwogCXN3aXRjaCAoYykgewogCWNhc2UgMDoKIAkJcmV0dXJuOwogCWNhc2UgNzoKLQkJaWYgKHZjLT52Y19iZWxsX2R1cmF0aW9uKQorCQlpZiAodmMtPnZjX3N0YXRlID09IEVTb3NjKQorCQkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CisJCWVsc2UgaWYgKHZjLT52Y19iZWxsX2R1cmF0aW9uKQogCQkJa2RfbWtzb3VuZCh2Yy0+dmNfYmVsbF9waXRjaCwgdmMtPnZjX2JlbGxfZHVyYXRpb24pOwogCQlyZXR1cm47CiAJY2FzZSA4OgpAQCAtMTc2Nyw3ICsxNzcxLDkgQEAKIAkJfSBlbHNlIGlmIChjPT0nUicpIHsgICAvKiByZXNldCBwYWxldHRlICovCiAJCQlyZXNldF9wYWxldHRlKHZjKTsKIAkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOwotCQl9IGVsc2UKKwkJfSBlbHNlIGlmIChjPj0nMCcgJiYgYzw9JzknKQorCQkJdmMtPnZjX3N0YXRlID0gRVNvc2M7CisJCWVsc2UKIAkJCXZjLT52Y19zdGF0ZSA9IEVTbm9ybWFsOwogCQlyZXR1cm47CiAJY2FzZSBFU3BhbGV0dGU6CkBAIC0xODA3LDkgKzE4MTMsNyBAQAogCQkJdmMtPnZjX3Bhclt2Yy0+dmNfbnBhcl0gKj0gMTA7CiAJCQl2Yy0+dmNfcGFyW3ZjLT52Y19ucGFyXSArPSBjIC0gJzAnOwogCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCXZjLT52Y19zdGF0ZSA9IEVTZ290cGFyczsKLQljYXNlIEVTZ290cGFyczoKKwkJfQogCQl2Yy0+dmNfc3RhdGUgPSBFU25vcm1hbDsKIAkJc3dpdGNoKGMpIHsKIAkJY2FzZSAnaCc6CkBAIC0yMDIzLDYgKzIwMjcsOCBAQAogCQkJdmMtPnZjX3RyYW5zbGF0ZSA9IHNldF90cmFuc2xhdGUodmMtPnZjX0cxX2NoYXJzZXQsIHZjKTsKIAkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CiAJCXJldHVybjsKKwljYXNlIEVTb3NjOgorCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJdmMtPnZjX3N0YXRlID0gRVNub3JtYWw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggMmU2YjgzMi4uZTBjYWQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC0yLDEwICsyLDYgQEAKICMgVVNCIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLSMgVGhlc2UgYXJlIHVudXNlZCBub3csIHJlbW92ZSB0aGVtIG9uY2UgdGhleSBhcmUgbm8gbG9uZ2VyIHNlbGVjdGVkCi1jb25maWcgVVNCX0FSQ0hfSEFTX09IQ0kKLQlib29sCi0KIGNvbmZpZyBVU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MKIAlib29sCiAKQEAgLTE3LDE4ICsxMywxMiBAQAogCWRlZmF1bHQgbiBpZiBTVEIwM3h4eCB8fCBQUENfTVBDNTJ4eAogCWRlZmF1bHQgeQogCi1jb25maWcgVVNCX0FSQ0hfSEFTX0VIQ0kKLQlib29sCi0KIGNvbmZpZyBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KIAlib29sCiAKIGNvbmZpZyBVU0JfRUhDSV9CSUdfRU5ESUFOX0RFU0MKIAlib29sCiAKLWNvbmZpZyBVU0JfQVJDSF9IQVNfWEhDSQotCWJvb2wKLQogbWVudWNvbmZpZyBVU0JfU1VQUE9SVAogCWJvb2wgIlVTQiBzdXBwb3J0IgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL01ha2VmaWxlCmluZGV4IDczNDVkMjEuLjQ4MGJkNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiAjIEdsdWUvQnJpZGdlIGxheWVycyBnbyBoZXJlCiAKIG9iai0kKENPTkZJR19VU0JfQ0hJUElERUEpCSs9IGNpX2hkcmNfbXNtLm8KK29iai0kKENPTkZJR19VU0JfQ0hJUElERUEpCSs9IGNpX2hkcmNfemV2aW8ubwogCiAjIFBDSSBkb2Vzbid0IHByb3ZpZGUgc3R1YnMsIG5lZWQgdG8gY2hlY2sKIGlmbmVxICgkKENPTkZJR19QQ0kpLCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaCBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaAppbmRleCBhODU3MTMxLi44M2QwNmMxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaAorKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9iaXRzLmgKQEAgLTUwLDEyICs1MCwxNCBAQAogI2RlZmluZSBQT1JUU0NfUFRDICAgICAgICAgICAgKDB4MEZVTCA8PCAxNikKICNkZWZpbmUgUE9SVFNDX1BIQ0QoZCkJICAgICAgKChkKSA/IEJJVCgyMikgOiBCSVQoMjMpKQogLyogUFRTIGFuZCBQVFcgZm9yIG5vbiBscG0gdmVyc2lvbiBvbmx5ICovCisjZGVmaW5lIFBPUlRTQ19QRlNDICAgICAgICAgICBCSVQoMjQpCiAjZGVmaW5lIFBPUlRTQ19QVFMoZCkJCQkJCQlcCiAJKHUzMikoKCgoZCkgJiAweDMpIDw8IDMwKSB8ICgoKGQpICYgMHg0KSA/IEJJVCgyNSkgOiAwKSkKICNkZWZpbmUgUE9SVFNDX1BUVyAgICAgICAgICAgIEJJVCgyOCkKICNkZWZpbmUgUE9SVFNDX1NUUyAgICAgICAgICAgIEJJVCgyOSkKIAogLyogREVWTEMgKi8KKyNkZWZpbmUgREVWTENfUEZTQyAgICAgICAgICAgIEJJVCgyMykKICNkZWZpbmUgREVWTENfUFNQRCAgICAgICAgICAgICgweDAzVUwgPDwgMjUpCiAjZGVmaW5lIERFVkxDX1BTUERfSFMgICAgICAgICAoMHgwMlVMIDw8IDI1KQogI2RlZmluZSBERVZMQ19QVFcgICAgICAgICAgICAgQklUKDI3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2kuaCBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpLmgKaW5kZXggODhiODBmNy4uZTIwNjQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2kuaAorKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaS5oCkBAIC0xOTYsOCArMTk2LDYgQEAKIAogCXN0cnVjdCBjaV9oZHJjX3BsYXRmb3JtX2RhdGEJKnBsYXRkYXRhOwogCWludAkJCQl2YnVzX2FjdGl2ZTsKLQkvKiBGSVhNRTogc29tZSBkYXksIHdlJ2xsIG5vdCB1c2UgZ2xvYmFsIHBoeSAqLwotCWJvb2wJCQkJZ2xvYmFsX3BoeTsKIAlzdHJ1Y3QgdXNiX3BoeQkJCSp0cmFuc2NlaXZlcjsKIAlzdHJ1Y3QgdXNiX2hjZAkJCSpoY2Q7CiAJc3RydWN0IGRlbnRyeQkJCSpkZWJ1Z2ZzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMKaW5kZXggYzAwZjc3Mi4uMmU1OGY4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jCkBAIC05Niw3ICs5Niw3IEBACiB7CiAJc3RydWN0IGNpX2hkcmNfaW14X2RhdGEgKmRhdGE7CiAJc3RydWN0IGNpX2hkcmNfcGxhdGZvcm1fZGF0YSBwZGF0YSA9IHsKLQkJLm5hbWUJCT0gImNpX2hkcmNfaW14IiwKKwkJLm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldiksCiAJCS5jYXBvZmZzZXQJPSBERUZfQ0FQT0ZGU0VULAogCQkuZmxhZ3MJCT0gQ0lfSERSQ19SRVFVSVJFX1RSQU5TQ0VJVkVSIHwKIAkJCQkgIENJX0hEUkNfRElTQUJMRV9TVFJFQU1JTkcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX3pldmlvLmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX3pldmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmNjQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfemV2aW8uYwpAQCAtMCwwICsxLDcyIEBACisvKgorICoJQ29weXJpZ2h0IChDKSAyMDEzIERhbmllbCBUYW5nIDx0YW5ncnNAdGFuZ3JzLmlkLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEJhc2VkIG9mZiBkcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX21zbS5jCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoaXBpZGVhLmg+CisKKyNpbmNsdWRlICJjaS5oIgorCitzdGF0aWMgc3RydWN0IGNpX2hkcmNfcGxhdGZvcm1fZGF0YSBjaV9oZHJjX3pldmlvX3BsYXRkYXRhID0geworCS5uYW1lCQkJPSAiY2lfaGRyY196ZXZpbyIsCisJLmZsYWdzCQkJPSBDSV9IRFJDX1JFR1NfU0hBUkVELAorCS5jYXBvZmZzZXQJCT0gREVGX0NBUE9GRlNFVCwKK307CisKK3N0YXRpYyBpbnQgY2lfaGRyY196ZXZpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNpX3BkZXY7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJjaV9oZHJjX3pldmlvX3Byb2JlXG4iKTsKKworCWNpX3BkZXYgPSBjaV9oZHJjX2FkZF9kZXZpY2UoJnBkZXYtPmRldiwKKwkJCQlwZGV2LT5yZXNvdXJjZSwgcGRldi0+bnVtX3Jlc291cmNlcywKKwkJCQkmY2lfaGRyY196ZXZpb19wbGF0ZGF0YSk7CisKKwlpZiAoSVNfRVJSKGNpX3BkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNpX2hkcmNfYWRkX2RldmljZSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2lfcGRldik7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2lfcGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaV9oZHJjX3pldmlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNpX3BkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWNpX2hkcmNfcmVtb3ZlX2RldmljZShjaV9wZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjaV9oZHJjX3pldmlvX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAibHNpLHpldmlvLXVzYiIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjaV9oZHJjX3pldmlvX2RyaXZlciA9IHsKKwkucHJvYmUgPSBjaV9oZHJjX3pldmlvX3Byb2JlLAorCS5yZW1vdmUgPSBjaV9oZHJjX3pldmlvX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ6ZXZpb191c2IiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gY2lfaGRyY196ZXZpb19kdF9pZHMsCisJfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNpX2hkcmNfemV2aW9fZHRfaWRzKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoY2lfaGRyY196ZXZpb19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jb3JlLmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jb3JlLmMKaW5kZXggMzNmMjJiYy4uY2E2ODMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NvcmUuYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2hpcGlkZWEuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCkBAIC0yOTgsNiArMjk5LDEzIEBACiAJaWYgKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJiBDSV9IRFJDX0RJU0FCTEVfU1RSRUFNSU5HKQogCQlod193cml0ZShjaSwgT1BfVVNCTU9ERSwgVVNCTU9ERV9DSV9TRElTLCBVU0JNT0RFX0NJX1NESVMpOwogCisJaWYgKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJiBDSV9IRFJDX0ZPUkNFX0ZVTExTUEVFRCkgeworCQlpZiAoY2ktPmh3X2JhbmsubHBtKQorCQkJaHdfd3JpdGUoY2ksIE9QX0RFVkxDLCBERVZMQ19QRlNDLCBERVZMQ19QRlNDKTsKKwkJZWxzZQorCQkJaHdfd3JpdGUoY2ksIE9QX1BPUlRTQywgUE9SVFNDX1BGU0MsIFBPUlRTQ19QRlNDKTsKKwl9CisKIAkvKiBVU0JNT0RFIHNob3VsZCBiZSBjb25maWd1cmVkIHN0ZXAgYnkgc3RlcCAqLwogCWh3X3dyaXRlKGNpLCBPUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBVU0JNT0RFX0NNX0lETEUpOwogCWh3X3dyaXRlKGNpLCBPUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBtb2RlKTsKQEAgLTQxMiw2ICs0MjAsOSBAQAogCQl9CiAJfQogCisJaWYgKG9mX3VzYl9nZXRfbWF4aW11bV9zcGVlZChkZXYtPm9mX25vZGUpID09IFVTQl9TUEVFRF9GVUxMKQorCQlwbGF0ZGF0YS0+ZmxhZ3MgfD0gQ0lfSERSQ19GT1JDRV9GVUxMU1BFRUQ7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk2LDMzICs1MDcsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBjaV91c2JfcGh5X2luaXQoc3RydWN0IGNpX2hkcmMgKmNpKQotewotCWlmIChjaS0+cGxhdGRhdGEtPnBoeSkgewotCQljaS0+dHJhbnNjZWl2ZXIgPSBjaS0+cGxhdGRhdGEtPnBoeTsKLQkJcmV0dXJuIHVzYl9waHlfaW5pdChjaS0+dHJhbnNjZWl2ZXIpOwotCX0gZWxzZSB7Ci0JCWNpLT5nbG9iYWxfcGh5ID0gdHJ1ZTsKLQkJY2ktPnRyYW5zY2VpdmVyID0gdXNiX2dldF9waHkoVVNCX1BIWV9UWVBFX1VTQjIpOwotCQlpZiAoSVNfRVJSKGNpLT50cmFuc2NlaXZlcikpCi0JCQljaS0+dHJhbnNjZWl2ZXIgPSBOVUxMOwotCi0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2lfdXNiX3BoeV9kZXN0cm95KHN0cnVjdCBjaV9oZHJjICpjaSkKLXsKLQlpZiAoIWNpLT50cmFuc2NlaXZlcikKLQkJcmV0dXJuOwotCi0Jb3RnX3NldF9wZXJpcGhlcmFsKGNpLT50cmFuc2NlaXZlci0+b3RnLCBOVUxMKTsKLQlpZiAoY2ktPmdsb2JhbF9waHkpCi0JCXVzYl9wdXRfcGh5KGNpLT50cmFuc2NlaXZlcik7Ci0JZWxzZQotCQl1c2JfcGh5X3NodXRkb3duKGNpLT50cmFuc2NlaXZlcik7Ci19Ci0KIHN0YXRpYyBpbnQgY2lfaGRyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UJKmRldiA9ICZwZGV2LT5kZXY7CkBAIC01MzIsNyArNTE2LDcgQEAKIAlpbnQJCXJldDsKIAllbnVtIHVzYl9kcl9tb2RlIGRyX21vZGU7CiAKLQlpZiAoIWRldi0+cGxhdGZvcm1fZGF0YSkgeworCWlmICghZGV2X2dldF9wbGF0ZGF0YShkZXYpKSB7CiAJCWRldl9lcnIoZGV2LCAicGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNTQ5LDcgKzUzMyw3IEBACiAJfQogCiAJY2ktPmRldiA9IGRldjsKLQljaS0+cGxhdGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJY2ktPnBsYXRkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCWNpLT5pbXgyOF93cml0ZV9maXggPSAhIShjaS0+cGxhdGRhdGEtPmZsYWdzICYKIAkJQ0lfSERSQ19JTVgyOF9XUklURV9GSVgpOwogCkBAIC01NjEsNyArNTQ1LDI2IEBACiAKIAlod19waHltb2RlX2NvbmZpZ3VyZShjaSk7CiAKLQlyZXQgPSBjaV91c2JfcGh5X2luaXQoY2kpOworCWlmIChjaS0+cGxhdGRhdGEtPnBoeSkKKwkJY2ktPnRyYW5zY2VpdmVyID0gY2ktPnBsYXRkYXRhLT5waHk7CisJZWxzZQorCQljaS0+dHJhbnNjZWl2ZXIgPSBkZXZtX3VzYl9nZXRfcGh5KGRldiwgVVNCX1BIWV9UWVBFX1VTQjIpOworCisJaWYgKElTX0VSUihjaS0+dHJhbnNjZWl2ZXIpKSB7CisJCXJldCA9IFBUUl9FUlIoY2ktPnRyYW5zY2VpdmVyKTsKKwkJLyoKKwkJICogaWYgLUVOWElPIGlzIHJldHVybmVkLCBpdCBtZWFucyBQSFkgbGF5ZXIgd2Fzbid0CisJCSAqIGVuYWJsZWQsIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJldHVybiAtRVBST0JFX0RFRkVSCisJCSAqIGluIHRoYXQgY2FzZSwgc2luY2Ugbm8gUEhZIGRyaXZlciB3aWxsIGV2ZXIgcHJvYmUuCisJCSAqLworCQlpZiAocmV0ID09IC1FTlhJTykKKwkJCXJldHVybiByZXQ7CisKKwkJZGV2X2VycihkZXYsICJubyB1c2IyIHBoeSBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJcmV0ID0gdXNiX3BoeV9pbml0KGNpLT50cmFuc2NlaXZlcik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBpbml0IHBoeTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC01NzIsOCArNTc1LDggQEAKIAljaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoY2ktPmlycSA8IDApIHsKIAkJZGV2X2VycihkZXYsICJtaXNzaW5nIElSUVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZGVzdHJveV9waHk7CisJCXJldCA9IGNpLT5pcnE7CisJCWdvdG8gZGVpbml0X3BoeTsKIAl9CiAKIAljaV9nZXRfb3RnX2NhcGFibGUoY2kpOwpAQCAtNTkwLDIzICs1OTMsMTIgQEAKIAkJcmV0ID0gY2lfaGRyY19nYWRnZXRfaW5pdChjaSk7CiAJCWlmIChyZXQpCiAJCQlkZXZfaW5mbyhkZXYsICJkb2Vzbid0IHN1cHBvcnQgZ2FkZ2V0XG4iKTsKLQkJaWYgKCFyZXQgJiYgY2ktPnRyYW5zY2VpdmVyKSB7Ci0JCQlyZXQgPSBvdGdfc2V0X3BlcmlwaGVyYWwoY2ktPnRyYW5zY2VpdmVyLT5vdGcsCi0JCQkJCQkJJmNpLT5nYWRnZXQpOwotCQkJLyoKLQkJCSAqIElmIHdlIGltcGxlbWVudCBhbGwgVVNCIGZ1bmN0aW9ucyB1c2luZyBjaGlwaWRlYSBkcml2ZXJzLAotCQkJICogaXQgZG9lc24ndCBuZWVkIHRvIGNhbGwgYWJvdmUgQVBJLCBtZWFud2hpbGUsIGlmIHdlIG9ubHkKLQkJCSAqIHVzZSBnYWRnZXQgZnVuY3Rpb24sIGNhbGxpbmcgYWJvdmUgQVBJIGlzIHVzZWxlc3MuCi0JCQkgKi8KLQkJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9UU1VQUCkKLQkJCQlnb3RvIGRlc3Ryb3lfcGh5OwotCQl9CiAJfQogCiAJaWYgKCFjaS0+cm9sZXNbQ0lfUk9MRV9IT1NUXSAmJiAhY2ktPnJvbGVzW0NJX1JPTEVfR0FER0VUXSkgewogCQlkZXZfZXJyKGRldiwgIm5vIHN1cHBvcnRlZCByb2xlc1xuIik7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZGVzdHJveV9waHk7CisJCWdvdG8gZGVpbml0X3BoeTsKIAl9CiAKIAlpZiAoY2ktPmlzX290ZykgewpAQCAtNjYzLDggKzY1NSw4IEBACiAJZnJlZV9pcnEoY2ktPmlycSwgY2kpOwogc3RvcDoKIAljaV9yb2xlX2Rlc3Ryb3koY2kpOwotZGVzdHJveV9waHk6Ci0JY2lfdXNiX3BoeV9kZXN0cm95KGNpKTsKK2RlaW5pdF9waHk6CisJdXNiX3BoeV9zaHV0ZG93bihjaS0+dHJhbnNjZWl2ZXIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTY3Nyw3ICs2NjksOCBAQAogCWZyZWVfaXJxKGNpLT5pcnEsIGNpKTsKIAljaV9yb2xlX2Rlc3Ryb3koY2kpOwogCWNpX2hkcmNfZW50ZXJfbHBtKGNpLCB0cnVlKTsKLQljaV91c2JfcGh5X2Rlc3Ryb3koY2kpOworCXVzYl9waHlfc2h1dGRvd24oY2ktPnRyYW5zY2VpdmVyKTsKKwlrZnJlZShjaS0+aHdfYmFuay5yZWdtYXApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCmluZGV4IDRhYjJjYjYuLjc3MzljNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCkBAIC0xNzgsMTkgKzE3OCw2IEBACiB9CiAKIC8qKgotICogaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfc3RhdHVzOiB0ZXN0ICYgY2xlYXIgc2V0dXAgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQotICogQG46IGVuZHBvaW50IG51bWJlcgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBzZXR1cCBzdGF0dXMKLSAqLwotc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXMoc3RydWN0IGNpX2hkcmMgKmNpLCBpbnQgbikKLXsKLQluID0gZXBfdG9fYml0KGNpLCBuKTsKLQlyZXR1cm4gaHdfdGVzdF9hbmRfY2xlYXIoY2ksIE9QX0VORFBUU0VUVVBTVEFULCBCSVQobikpOwotfQotCi0vKioKICAqIGh3X2VwX3ByaW1lOiBwcmltZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAgKiBAbnVtOiAgICAgZW5kcG9pbnQgbnVtYmVyCiAgKiBAZGlyOiAgICAgZW5kcG9pbnQgZGlyZWN0aW9uCkBAIC05NjIsNiArOTQ5LDE1NiBAQAogfQogCiAvKioKKyAqIGlzcl9zZXR1cF9wYWNrZXRfaGFuZGxlcjogc2V0dXAgcGFja2V0IGhhbmRsZXIKKyAqIEBjaTogVURDIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgc2V0dXAgcGFja2V0IAorICovCitzdGF0aWMgdm9pZCBpc3Jfc2V0dXBfcGFja2V0X2hhbmRsZXIoc3RydWN0IGNpX2hkcmMgKmNpKQorX19yZWxlYXNlcyhjaS0+bG9jaykKK19fYWNxdWlyZXMoY2ktPmxvY2spCit7CisJc3RydWN0IGNpX2h3X2VwICpod2VwID0gJmNpLT5jaV9od19lcFswXTsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHJlcTsKKwlpbnQgdHlwZSwgbnVtLCBkaXIsIGVyciA9IC1FSU5WQUw7CisJdTggdG1vZGUgPSAwOworCisJLyoKKwkgKiBGbHVzaCBkYXRhIGFuZCBoYW5kc2hha2UgdHJhbnNhY3Rpb25zIG9mIHByZXZpb3VzCisJICogc2V0dXAgcGFja2V0LgorCSAqLworCV9lcF9udWtlKGNpLT5lcDBvdXQpOworCV9lcF9udWtlKGNpLT5lcDBpbik7CisKKwkvKiByZWFkX3NldHVwX3BhY2tldCAqLworCWRvIHsKKwkJaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKGNpKTsKKwkJbWVtY3B5KCZyZXEsICZod2VwLT5xaC5wdHItPnNldHVwLCBzaXplb2YocmVxKSk7CisJfSB3aGlsZSAoIWh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX2d1YXJkKGNpKSk7CisKKwl0eXBlID0gcmVxLmJSZXF1ZXN0VHlwZTsKKworCWNpLT5lcDBfZGlyID0gKHR5cGUgJiBVU0JfRElSX0lOKSA/IFRYIDogUlg7CisKKwlzd2l0Y2ggKHJlcS5iUmVxdWVzdCkgeworCWNhc2UgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09CisJCQkJVVNCX0VORFBPSU5UX0hBTFQpIHsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJZGlyID0gbnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwkJCWlmIChkaXIpIC8qIFRYICovCisJCQkJbnVtICs9IGNpLT5od19lcF9tYXggLyAyOworCQkJaWYgKCFjaS0+Y2lfaHdfZXBbbnVtXS53ZWRnZSkgeworCQkJCXNwaW5fdW5sb2NrKCZjaS0+bG9jayk7CisJCQkJZXJyID0gdXNiX2VwX2NsZWFyX2hhbHQoCisJCQkJCSZjaS0+Y2lfaHdfZXBbbnVtXS5lcCk7CisJCQkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7CisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSAmJgorCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09CisJCQkJVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQKSB7CisJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKKwkJCQlicmVhazsKKwkJCWNpLT5yZW1vdGVfd2FrZXVwID0gMDsKKwkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOworCQl9IGVsc2UgeworCQkJZ290byBkZWxlZ2F0ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRSkgICAmJgorCQkgICAgdHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCSAgICB0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9JTlRFUkZBQ0UpKQorCQkJZ290byBkZWxlZ2F0ZTsKKwkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAyIHx8CisJCSAgICBsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSAgIT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSBpc3JfZ2V0X3N0YXR1c19yZXNwb25zZShjaSwgJnJlcSk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKKwkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKQorCQkJZ290byBkZWxlZ2F0ZTsKKwkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAwIHx8CisJCSAgICBsZTE2X3RvX2NwdShyZXEud0luZGV4KSAgIT0gMCkKKwkJCWJyZWFrOworCQljaS0+YWRkcmVzcyA9ICh1OClsZTE2X3RvX2NwdShyZXEud1ZhbHVlKTsKKwkJY2ktPnNldGFkZHIgPSB0cnVlOworCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQlpZiAodHlwZSA9PSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09CisJCQkJVVNCX0VORFBPSU5UX0hBTFQpIHsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJZGlyID0gbnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwkJCWlmIChkaXIpIC8qIFRYICovCisJCQkJbnVtICs9IGNpLT5od19lcF9tYXggLyAyOworCisJCQlzcGluX3VubG9jaygmY2ktPmxvY2spOworCQkJZXJyID0gdXNiX2VwX3NldF9oYWx0KCZjaS0+Y2lfaHdfZXBbbnVtXS5lcCk7CisJCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKKwkJCWlmICghZXJyKQorCQkJCWlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKSB7CisJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKKwkJCQlicmVhazsKKwkJCXN3aXRjaCAobGUxNl90b19jcHUocmVxLndWYWx1ZSkpIHsKKwkJCWNhc2UgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOgorCQkJCWNpLT5yZW1vdGVfd2FrZXVwID0gMTsKKwkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RFVklDRV9URVNUX01PREU6CisJCQkJdG1vZGUgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KSA+PiA4OworCQkJCXN3aXRjaCAodG1vZGUpIHsKKwkJCQljYXNlIFRFU1RfSjoKKwkJCQljYXNlIFRFU1RfSzoKKwkJCQljYXNlIFRFU1RfU0UwX05BSzoKKwkJCQljYXNlIFRFU1RfUEFDS0VUOgorCQkJCWNhc2UgVEVTVF9GT1JDRV9FTjoKKwkJCQkJY2ktPnRlc3RfbW9kZSA9IHRtb2RlOworCQkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKAorCQkJCQkJCWNpKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGRlbGVnYXRlOworCQkJfQorCQl9IGVsc2UgeworCQkJZ290byBkZWxlZ2F0ZTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorZGVsZWdhdGU6CisJCWlmIChyZXEud0xlbmd0aCA9PSAwKSAgIC8qIG5vIGRhdGEgcGhhc2UgKi8KKwkJCWNpLT5lcDBfZGlyID0gVFg7CisKKwkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKKwkJZXJyID0gY2ktPmRyaXZlci0+c2V0dXAoJmNpLT5nYWRnZXQsICZyZXEpOworCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGVyciA8IDApIHsKKwkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKKwkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmaHdlcC0+ZXApKQorCQkJZGV2X2VycihjaS0+ZGV2LCAiZXJyb3I6IGVwX3NldF9oYWx0XG4iKTsKKwkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7CisJfQorfQorCisvKioKICAqIGlzcl90cl9jb21wbGV0ZV9oYW5kbGVyOiB0cmFuc2FjdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgaGFuZGxlcgogICogQGNpOiBVREMgZGVzY3JpcHRvcgogICoKQEAgLTk3MiwxMiArMTEwOSwxMCBAQAogX19hY3F1aXJlcyhjaS0+bG9jaykKIHsKIAl1bnNpZ25lZCBpOwotCXU4IHRtb2RlID0gMDsKKwlpbnQgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IGNpLT5od19lcF9tYXg7IGkrKykgewogCQlzdHJ1Y3QgY2lfaHdfZXAgKmh3ZXAgID0gJmNpLT5jaV9od19lcFtpXTsKLQkJaW50IHR5cGUsIG51bSwgZGlyLCBlcnIgPSAtRUlOVkFMOwotCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHJlcTsKIAogCQlpZiAoaHdlcC0+ZXAuZGVzYyA9PSBOVUxMKQogCQkJY29udGludWU7ICAgLyogbm90IGNvbmZpZ3VyZWQgKi8KQEAgLTk5NywxNDggKzExMzIsMTAgQEAKIAkJCX0KIAkJfQogCi0JCWlmIChod2VwLT50eXBlICE9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wgfHwKLQkJICAgICFod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXMoY2ksIGkpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGkgIT0gMCkgewotCQkJZGV2X3dhcm4oY2ktPmRldiwgImN0cmwgdHJhZmZpYyBhdCBlbmRwb2ludCAlZFxuIiwgaSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIEZsdXNoIGRhdGEgYW5kIGhhbmRzaGFrZSB0cmFuc2FjdGlvbnMgb2YgcHJldmlvdXMKLQkJICogc2V0dXAgcGFja2V0LgotCQkgKi8KLQkJX2VwX251a2UoY2ktPmVwMG91dCk7Ci0JCV9lcF9udWtlKGNpLT5lcDBpbik7Ci0KLQkJLyogcmVhZF9zZXR1cF9wYWNrZXQgKi8KLQkJZG8gewotCQkJaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKGNpKTsKLQkJCW1lbWNweSgmcmVxLCAmaHdlcC0+cWgucHRyLT5zZXR1cCwgc2l6ZW9mKHJlcSkpOwotCQl9IHdoaWxlICghaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfZ3VhcmQoY2kpKTsKLQotCQl0eXBlID0gcmVxLmJSZXF1ZXN0VHlwZTsKLQotCQljaS0+ZXAwX2RpciA9ICh0eXBlICYgVVNCX0RJUl9JTikgPyBUWCA6IFJYOwotCi0JCXN3aXRjaCAocmVxLmJSZXF1ZXN0KSB7Ci0JCWNhc2UgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgotCQkJaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9FTkRQT0lOVCkgJiYKLQkJCQkJbGUxNl90b19jcHUocmVxLndWYWx1ZSkgPT0KLQkJCQkJVVNCX0VORFBPSU5UX0hBTFQpIHsKLQkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOwotCQkJCWRpciA9IG51bSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSzsKLQkJCQludW0gJj0gVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJCWlmIChkaXIpIC8qIFRYICovCi0JCQkJCW51bSArPSBjaS0+aHdfZXBfbWF4LzI7Ci0JCQkJaWYgKCFjaS0+Y2lfaHdfZXBbbnVtXS53ZWRnZSkgewotCQkJCQlzcGluX3VubG9jaygmY2ktPmxvY2spOwotCQkJCQllcnIgPSB1c2JfZXBfY2xlYXJfaGFsdCgKLQkJCQkJCSZjaS0+Y2lfaHdfZXBbbnVtXS5lcCk7Ci0JCQkJCXNwaW5fbG9jaygmY2ktPmxvY2spOwotCQkJCQlpZiAoZXJyKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOwotCQkJfSBlbHNlIGlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSAmJgotCQkJCQlsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSA9PQotCQkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApIHsKLQkJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJY2ktPnJlbW90ZV93YWtldXAgPSAwOwotCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOwotCQkJfSBlbHNlIHsKLQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgotCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRSkgICAmJgotCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgotCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0lOVEVSRkFDRSkpCi0JCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmIChsZTE2X3RvX2NwdShyZXEud0xlbmd0aCkgIT0gMiB8fAotCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICAhPSAwKQotCQkJCWJyZWFrOwotCQkJZXJyID0gaXNyX2dldF9zdGF0dXNfcmVzcG9uc2UoY2ksICZyZXEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKLQkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSkKLQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAwIHx8Ci0JCQkgICAgbGUxNl90b19jcHUocmVxLndJbmRleCkgICE9IDApCi0JCQkJYnJlYWs7Ci0JCQljaS0+YWRkcmVzcyA9ICh1OClsZTE2X3RvX2NwdShyZXEud1ZhbHVlKTsKLQkJCWNpLT5zZXRhZGRyID0gdHJ1ZTsKLQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoY2kpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKLQkJCWlmICh0eXBlID09IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCi0JCQkJCWxlMTZfdG9fY3B1KHJlcS53VmFsdWUpID09Ci0JCQkJCVVTQl9FTkRQT0lOVF9IQUxUKSB7Ci0JCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCi0JCQkJCWJyZWFrOwotCQkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKLQkJCQlkaXIgPSBudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7Ci0JCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLQkJCQlpZiAoZGlyKSAvKiBUWCAqLwotCQkJCQludW0gKz0gY2ktPmh3X2VwX21heC8yOwotCi0JCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKLQkJCQllcnIgPSB1c2JfZXBfc2V0X2hhbHQoJmNpLT5jaV9od19lcFtudW1dLmVwKTsKLQkJCQlzcGluX2xvY2soJmNpLT5sb2NrKTsKLQkJCQlpZiAoIWVycikKLQkJCQkJaXNyX3NldHVwX3N0YXR1c19waGFzZShjaSk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gKFVTQl9ESVJfT1VUfFVTQl9SRUNJUF9ERVZJQ0UpKSB7Ci0JCQkJaWYgKHJlcS53TGVuZ3RoICE9IDApCi0JCQkJCWJyZWFrOwotCQkJCXN3aXRjaCAobGUxNl90b19jcHUocmVxLndWYWx1ZSkpIHsKLQkJCQljYXNlIFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDoKLQkJCQkJY2ktPnJlbW90ZV93YWtldXAgPSAxOwotCQkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVU0JfREVWSUNFX1RFU1RfTU9ERToKLQkJCQkJdG1vZGUgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KSA+PiA4OwotCQkJCQlzd2l0Y2ggKHRtb2RlKSB7Ci0JCQkJCWNhc2UgVEVTVF9KOgotCQkJCQljYXNlIFRFU1RfSzoKLQkJCQkJY2FzZSBURVNUX1NFMF9OQUs6Ci0JCQkJCWNhc2UgVEVTVF9QQUNLRVQ6Ci0JCQkJCWNhc2UgVEVTVF9GT1JDRV9FTjoKLQkJCQkJCWNpLT50ZXN0X21vZGUgPSB0bW9kZTsKLQkJCQkJCWVyciA9IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UoCi0JCQkJCQkJCWNpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQlnb3RvIGRlbGVnYXRlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZ290byBkZWxlZ2F0ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotZGVsZWdhdGU6Ci0JCQlpZiAocmVxLndMZW5ndGggPT0gMCkgICAvKiBubyBkYXRhIHBoYXNlICovCi0JCQkJY2ktPmVwMF9kaXIgPSBUWDsKLQotCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKLQkJCWVyciA9IGNpLT5kcml2ZXItPnNldHVwKCZjaS0+Z2FkZ2V0LCAmcmVxKTsKLQkJCXNwaW5fbG9jaygmY2ktPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoZXJyIDwgMCkgewotCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKLQkJCWlmICh1c2JfZXBfc2V0X2hhbHQoJmh3ZXAtPmVwKSkKLQkJCQlkZXZfZXJyKGNpLT5kZXYsICJlcnJvcjogZXBfc2V0X2hhbHRcbiIpOwotCQkJc3Bpbl9sb2NrKCZjaS0+bG9jayk7Ci0JCX0KKwkJLyogT25seSBoYW5kbGUgc2V0dXAgcGFja2V0IGJlbG93ICovCisJCWlmIChpID09IDAgJiYKKwkJCWh3X3Rlc3RfYW5kX2NsZWFyKGNpLCBPUF9FTkRQVFNFVFVQU1RBVCwgQklUKDApKSkKKwkJCWlzcl9zZXR1cF9wYWNrZXRfaGFuZGxlcihjaSk7CiAJfQogfQogCkBAIC0xMTkzLDYgKzExOTAsMTEgQEAKIAogCWh3ZXAtPnFoLnB0ci0+dGQubmV4dCB8PSBjcHVfdG9fbGUzMihURF9URVJNSU5BVEUpOyAgIC8qIG5lZWRlZD8gKi8KIAorCWlmIChod2VwLT5udW0gIT0gMCAmJiBod2VwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpIHsKKwkJZGV2X2Vycihod2VwLT5jaS0+ZGV2LCAiU2V0IGNvbnRyb2wgeGZlciBhdCBub24tZXAwXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisKIAkvKgogCSAqIEVuYWJsZSBlbmRwb2ludHMgaW4gdGhlIEhXIG90aGVyIHRoYW4gZXAwIGFzIGVwMAogCSAqIGlzIGFsd2F5cyBlbmFibGVkCkBAIC0xODM3LDEyICsxODM5LDYgQEAKIAogCWRtYV9wb29sX2Rlc3Ryb3koY2ktPnRkX3Bvb2wpOwogCWRtYV9wb29sX2Rlc3Ryb3koY2ktPnFoX3Bvb2wpOwotCi0JaWYgKGNpLT50cmFuc2NlaXZlcikgewotCQlvdGdfc2V0X3BlcmlwaGVyYWwoY2ktPnRyYW5zY2VpdmVyLT5vdGcsIE5VTEwpOwotCQlpZiAoY2ktPmdsb2JhbF9waHkpCi0JCQl1c2JfcHV0X3BoeShjaS0+dHJhbnNjZWl2ZXIpOwotCX0KIH0KIAogc3RhdGljIGludCB1ZGNfaWRfc3dpdGNoX2Zvcl9kZXZpY2Uoc3RydWN0IGNpX2hkcmMgKmNpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKaW5kZXggMDYyOTY3Yy4uMWFiNGRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCkBAIC0xMCw3ICsxMCw2IEBACiAKIAogI2RlZmluZSBVU0JfTUFYQUxUU0VUVElORwkJMTI4CS8qIEhhcmQgbGltaXQgKi8KLSNkZWZpbmUgVVNCX01BWEVORFBPSU5UUwkJMzAJLyogSGFyZCBsaW1pdCAqLwogCiAjZGVmaW5lIFVTQl9NQVhDT05GSUcJCQk4CS8qIEFyYml0cmFyeSBsaW1pdCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggOTBlMThmNi4uMjU3ODc2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtNjIsNyArNjIsNyBAQAogLyogTXV0dWFsIGV4Y2x1c2lvbiBmb3IgcmVtb3ZhbCwgb3BlbiwgYW5kIHJlbGVhc2UgKi8KIERFRklORV9NVVRFWCh1c2Jmc19tdXRleCk7CiAKLXN0cnVjdCBkZXZfc3RhdGUgeworc3RydWN0IHVzYl9kZXZfc3RhdGUgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgICAgICAvKiBzdGF0ZSBsaXN0ICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKQEAgLTgxLDcgKzgxLDcgQEAKIAogc3RydWN0IGFzeW5jIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFzeW5jbGlzdDsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwczsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHM7CiAJc3RydWN0IHBpZCAqcGlkOwogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkOwogCXVuc2lnbmVkIGludCBzaWducjsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCWF0b21pY19zdWIoYW1vdW50LCAmdXNiZnNfbWVtb3J5X3VzYWdlKTsKIH0KIAotc3RhdGljIGludCBjb25uZWN0ZWQoc3RydWN0IGRldl9zdGF0ZSAqcHMpCitzdGF0aWMgaW50IGNvbm5lY3RlZChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMpCiB7CiAJcmV0dXJuICghbGlzdF9lbXB0eSgmcHMtPmxpc3QpICYmCiAJCQlwcy0+ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOwpAQCAtMTg0LDcgKzE4NCw3IEBACiBzdGF0aWMgc3NpemVfdCB1c2JkZXZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKIAkJCSAgIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBzLT5kZXY7CiAJc3NpemVfdCByZXQgPSAwOwogCXVuc2lnbmVkIGxlbjsKQEAgLTMwNyw3ICszMDcsNyBAQAogCiBzdGF0aWMgdm9pZCBhc3luY19uZXdwZW5kaW5nKHN0cnVjdCBhc3luYyAqYXMpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gYXMtPnBzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHMtPmxvY2ssIGZsYWdzKTsKQEAgLTMxNyw3ICszMTcsNyBAQAogCiBzdGF0aWMgdm9pZCBhc3luY19yZW1vdmVwZW5kaW5nKHN0cnVjdCBhc3luYyAqYXMpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gYXMtPnBzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHMtPmxvY2ssIGZsYWdzKTsKQEAgLTMyNSw3ICszMjUsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXN5bmMgKmFzeW5jX2dldGNvbXBsZXRlZChzdHJ1Y3QgZGV2X3N0YXRlICpwcykKK3N0YXRpYyBzdHJ1Y3QgYXN5bmMgKmFzeW5jX2dldGNvbXBsZXRlZChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgYXN5bmMgKmFzID0gTlVMTDsKQEAgLTM0MCw3ICszNDAsNyBAQAogCXJldHVybiBhczsKIH0KIAotc3RhdGljIHN0cnVjdCBhc3luYyAqYXN5bmNfZ2V0cGVuZGluZyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywKK3N0YXRpYyBzdHJ1Y3QgYXN5bmMgKmFzeW5jX2dldHBlbmRpbmcoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLAogCQkJCQkgICAgIHZvaWQgX191c2VyICp1c2VydXJiKQogewogCXN0cnVjdCBhc3luYyAqYXM7CkBAIC00NDgsNyArNDQ4LDcgQEAKICNkZWZpbmUgQVNfQ09OVElOVUFUSU9OCTEKICNkZWZpbmUgQVNfVU5MSU5LCTIKIAotc3RhdGljIHZvaWQgY2FuY2VsX2J1bGtfdXJicyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgYnVsa19hZGRyKQorc3RhdGljIHZvaWQgY2FuY2VsX2J1bGtfdXJicyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHVuc2lnbmVkIGJ1bGtfYWRkcikKIF9fcmVsZWFzZXMocHMtPmxvY2spCiBfX2FjcXVpcmVzKHBzLT5sb2NrKQogewpAQCAtNDg5LDcgKzQ4OSw3IEBACiBzdGF0aWMgdm9pZCBhc3luY19jb21wbGV0ZWQoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBhc3luYyAqYXMgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBhcy0+cHM7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gYXMtPnBzOwogCXN0cnVjdCBzaWdpbmZvIHNpbmZvOwogCXN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7CiAJdTMyIHNlY2lkID0gMDsKQEAgLTUyOSw3ICs1MjksNyBAQAogCXdha2VfdXAoJnBzLT53YWl0KTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9hc3luYyhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfYXN5bmMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewogCXN0cnVjdCB1cmIgKnVyYjsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtNTUxLDcgKzU1MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHMtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9hc3luY19vbl9pbnRlcmZhY2Uoc3RydWN0IGRldl9zdGF0ZSAqcHMsCitzdGF0aWMgdm9pZCBkZXN0cm95X2FzeW5jX29uX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBpZm51bSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcSwgaGl0bGlzdDsKQEAgLTU2Niw3ICs1NjYsNyBAQAogCWRlc3Ryb3lfYXN5bmMocHMsICZoaXRsaXN0KTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9hbGxfYXN5bmMoc3RydWN0IGRldl9zdGF0ZSAqcHMpCitzdGF0aWMgdm9pZCBkZXN0cm95X2FsbF9hc3luYyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMpCiB7CiAJZGVzdHJveV9hc3luYyhwcywgJnBzLT5hc3luY19wZW5kaW5nKTsKIH0KQEAgLTU4NSw3ICs1ODUsNyBAQAogCiBzdGF0aWMgdm9pZCBkcml2ZXJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAl1bnNpZ25lZCBpbnQgaWZudW0gPSBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAKIAlpZiAoIXBzKQpAQCAtNjI4LDcgKzYyOCw3IEBACiAJLnJlc3VtZSA9CWRyaXZlcl9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IGNsYWltaW50ZihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IGlmbnVtKQorc3RhdGljIGludCBjbGFpbWludGYoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBzLT5kZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CkBAIC02NTAsNyArNjUwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlbGVhc2VpbnRmKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCitzdGF0aWMgaW50IHJlbGVhc2VpbnRmKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IGlmbnVtKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CkBAIC02NzAsNyArNjcwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGNoZWNraW50ZihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IGlmbnVtKQorc3RhdGljIGludCBjaGVja2ludGYoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgaWZudW0pCiB7CiAJaWYgKHBzLT5kZXYtPnN0YXRlICE9IFVTQl9TVEFURV9DT05GSUdVUkVEKQogCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKQEAgLTcxMCw3ICs3MTAsNyBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX2N0cmxyZWNpcChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdW5zaWduZWQgaW50IHJlcXVlc3R0eXBlLAorc3RhdGljIGludCBjaGVja19jdHJscmVjaXAoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB1bnNpZ25lZCBpbnQgcmVxdWVzdHR5cGUsCiAJCQkgICB1bnNpZ25lZCBpbnQgcmVxdWVzdCwgdW5zaWduZWQgaW50IGluZGV4KQogewogCWludCByZXQgPSAwOwpAQCAtNzY5LDYgKzc2OSw4OCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwX3RvX2hvc3RfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICAgdW5zaWduZWQgY2hhciBlcCkKK3sKKwlpZiAoZXAgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisJCXJldHVybiBkZXYtPmVwX2luW2VwICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLXTsKKwllbHNlCisJCXJldHVybiBkZXYtPmVwX291dFtlcCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTS107Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdXNiZGV2ZnNfc3RyZWFtcyhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsCisJCQkJICBzdHJ1Y3QgdXNiZGV2ZnNfc3RyZWFtcyBfX3VzZXIgKnN0cmVhbXMsCisJCQkJICB1bnNpZ25lZCBpbnQgKm51bV9zdHJlYW1zX3JldCwKKwkJCQkgIHVuc2lnbmVkIGludCAqbnVtX2Vwc19yZXQsCisJCQkJICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKioqZXBzX3JldCwKKwkJCQkgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICoqaW50Zl9yZXQpCit7CisJdW5zaWduZWQgaW50IGksIG51bV9zdHJlYW1zLCBudW1fZXBzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBlcDsKKwlpbnQgaWZudW0sIHJldDsKKworCWlmIChnZXRfdXNlcihudW1fc3RyZWFtcywgJnN0cmVhbXMtPm51bV9zdHJlYW1zKSB8fAorCSAgICBnZXRfdXNlcihudW1fZXBzLCAmc3RyZWFtcy0+bnVtX2VwcykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG51bV9lcHMgPCAxIHx8IG51bV9lcHMgPiBVU0JfTUFYRU5EUE9JTlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBYSENJIGNvbnRyb2xsZXIgYWxsb3dzIG1heCAyIF4gMTYgc3RyZWFtcyAqLworCWlmIChudW1fc3RyZWFtc19yZXQgJiYgKG51bV9zdHJlYW1zIDwgMiB8fCBudW1fc3RyZWFtcyA+IDY1NTM2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcHMgPSBrbWFsbG9jKG51bV9lcHMgKiBzaXplb2YoKmVwcyksIEdGUF9LRVJORUwpOworCWlmICghZXBzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZXBzOyBpKyspIHsKKwkJaWYgKGdldF91c2VyKGVwLCAmc3RyZWFtcy0+ZXBzW2ldKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZXBzW2ldID0gZXBfdG9faG9zdF9lbmRwb2ludChwcy0+ZGV2LCBlcCk7CisJCWlmICghZXBzW2ldKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIHVzYl9hbGxvYy9mcmVlX3N0cmVhbXMgb3BlcmF0ZSBvbiBhbiB1c2JfaW50ZXJmYWNlICovCisJCWlmbnVtID0gZmluZGludGZlcChwcy0+ZGV2LCBlcCk7CisJCWlmIChpZm51bSA8IDApIHsKKwkJCXJldCA9IGlmbnVtOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChpID09IDApIHsKKwkJCXJldCA9IGNoZWNraW50ZihwcywgaWZudW0pOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWludGYgPSB1c2JfaWZudW1fdG9faWYocHMtPmRldiwgaWZudW0pOworCQl9IGVsc2UgeworCQkJLyogVmVyaWZ5IGFsbCBlcHMgYmVsb25nIHRvIHRoZSBzYW1lIGludGVyZmFjZSAqLworCQkJaWYgKGlmbnVtICE9IGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcikgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCX0KKworCWlmIChudW1fc3RyZWFtc19yZXQpCisJCSpudW1fc3RyZWFtc19yZXQgPSBudW1fc3RyZWFtczsKKwkqbnVtX2Vwc19yZXQgPSBudW1fZXBzOworCSplcHNfcmV0ID0gZXBzOworCSppbnRmX3JldCA9IGludGY7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJa2ZyZWUoZXBzKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG1hdGNoX2RldnQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXJldHVybiBkZXYtPmRldnQgPT0gKGRldl90KSAodW5zaWduZWQgbG9uZykgZGF0YTsKQEAgLTc5MSwxMSArODczLDExIEBACiBzdGF0aWMgaW50IHVzYmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBOVUxMOwotCXN0cnVjdCBkZXZfc3RhdGUgKnBzOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwczsKIAlpbnQgcmV0OwogCiAJcmV0ID0gLUVOT01FTTsKLQlwcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlwcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfZGV2X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcykKIAkJZ290byBvdXRfZnJlZV9wczsKIApAQCAtODUyLDcgKzkzNCw3IEBACiAKIHN0YXRpYyBpbnQgdXNiZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCXVuc2lnbmVkIGludCBpZm51bTsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtODgzLDcgKzk2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19jb250cm9sKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2NvbnRyb2woc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCXN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgY3RybDsKQEAgLTk3MCw3ICsxMDUyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHByb2NfYnVsayhzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19idWxrKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcHMtPmRldjsKIAlzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyIGJ1bGs7CkBAIC0xMDQzLDcgKzExMjUsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVzZXRlcChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc2V0X29mX2FjdGl2ZV9lcChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwkJdW5zaWduZWQgaW50IGVwbnVtLCBjaGFyICppb2N0bF9uYW1lKQoreworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOworCisJZXBzID0gKGVwbnVtICYgVVNCX0RJUl9JTikgPyB1ZGV2LT5lcF9pbiA6IHVkZXYtPmVwX291dDsKKwllcCA9IGVwc1tlcG51bSAmIDB4MGZdOworCWlmIChlcCAmJiAhbGlzdF9lbXB0eSgmZXAtPnVyYl9saXN0KSkKKwkJZGV2X3dhcm4oJnVkZXYtPmRldiwgIlByb2Nlc3MgJWQgKCVzKSBjYWxsZWQgVVNCREVWRlNfJXMgZm9yIGFjdGl2ZSBlbmRwb2ludCAweCUwMnhcbiIsCisJCQkJdGFza19waWRfbnIoY3VycmVudCksIGN1cnJlbnQtPmNvbW0sCisJCQkJaW9jdGxfbmFtZSwgZXBudW0pOworfQorCitzdGF0aWMgaW50IHByb2NfcmVzZXRlcChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJdW5zaWduZWQgaW50IGVwOwogCWludCByZXQ7CkBAIC0xMDU2LDExICsxMTUyLDEyIEBACiAJcmV0ID0gY2hlY2tpbnRmKHBzLCByZXQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisJY2hlY2tfcmVzZXRfb2ZfYWN0aXZlX2VwKHBzLT5kZXYsIGVwLCAiUkVTRVRFUCIpOwogCXVzYl9yZXNldF9lbmRwb2ludChwcy0+ZGV2LCBlcCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19jbGVhcmhhbHQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfY2xlYXJoYWx0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBpbnQgZXA7CiAJaW50IHBpcGU7CkBAIC0xMDc0LDYgKzExNzEsNyBAQAogCXJldCA9IGNoZWNraW50ZihwcywgcmV0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCWNoZWNrX3Jlc2V0X29mX2FjdGl2ZV9lcChwcy0+ZGV2LCBlcCwgIkNMRUFSX0hBTFQiKTsKIAlpZiAoZXAgJiBVU0JfRElSX0lOKQogCQlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKHBzLT5kZXYsIGVwICYgMHg3Zik7CiAJZWxzZQpAQCAtMTA4Miw3ICsxMTgwLDcgQEAKIAlyZXR1cm4gdXNiX2NsZWFyX2hhbHQocHMtPmRldiwgcGlwZSk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19nZXRkcml2ZXIoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfZ2V0ZHJpdmVyKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfZ2V0ZHJpdmVyIGdkOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwpAQCAtMTEwMSw3ICsxMTk5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHByb2NfY29ubmVjdGluZm8oc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfY29ubmVjdGluZm8oc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc19jb25uZWN0aW5mbyBjaSA9IHsKIAkJLmRldm51bSA9IHBzLT5kZXYtPmRldm51bSwKQEAgLTExMTMsMTIgKzEyMTEsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX3Jlc2V0ZGV2aWNlKHN0cnVjdCBkZXZfc3RhdGUgKnBzKQorc3RhdGljIGludCBwcm9jX3Jlc2V0ZGV2aWNlKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcykKIHsKIAlyZXR1cm4gdXNiX3Jlc2V0X2RldmljZShwcy0+ZGV2KTsKIH0KIAotc3RhdGljIGludCBwcm9jX3NldGludGYoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2Nfc2V0aW50ZihzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX3NldGludGVyZmFjZSBzZXRpbnRmOwogCWludCByZXQ7CkBAIC0xMTI3LDExICsxMjI1LDE0IEBACiAJCXJldHVybiAtRUZBVUxUOwogCWlmICgocmV0ID0gY2hlY2tpbnRmKHBzLCBzZXRpbnRmLmludGVyZmFjZSkpKQogCQlyZXR1cm4gcmV0OworCisJZGVzdHJveV9hc3luY19vbl9pbnRlcmZhY2UocHMsIHNldGludGYuaW50ZXJmYWNlKTsKKwogCXJldHVybiB1c2Jfc2V0X2ludGVyZmFjZShwcy0+ZGV2LCBzZXRpbnRmLmludGVyZmFjZSwKIAkJCXNldGludGYuYWx0c2V0dGluZyk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19zZXRjb25maWcoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2Nfc2V0Y29uZmlnKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlpbnQgdTsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTExNzksNyArMTI4MCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBwcm9jX2RvX3N1Ym1pdHVyYihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgc3RydWN0IHVzYmRldmZzX3VyYiAqdXVyYiwKK3N0YXRpYyBpbnQgcHJvY19kb19zdWJtaXR1cmIoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgdXNiZGV2ZnNfdXJiICp1dXJiLAogCQkJc3RydWN0IHVzYmRldmZzX2lzb19wYWNrZXRfZGVzYyBfX3VzZXIgKmlzb19mcmFtZV9kZXNjLAogCQkJdm9pZCBfX3VzZXIgKmFyZykKIHsKQEAgLTExODksNiArMTI5MCw4IEBACiAJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHIgPSBOVUxMOwogCXVuc2lnbmVkIGludCB1LCB0b3RsZW4sIGlzb2ZybWxlbjsKIAlpbnQgaSwgcmV0LCBpc19pbiwgbnVtX3NncyA9IDAsIGlmbnVtID0gLTE7CisJaW50IG51bWJlcl9vZl9wYWNrZXRzID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RyZWFtX2lkID0gMDsKIAl2b2lkICpidWY7CiAKIAlpZiAodXVyYi0+ZmxhZ3MgJiB+KFVTQkRFVkZTX1VSQl9JU09fQVNBUCB8CkBAIC0xMjA5LDE1ICsxMzEyLDEwIEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KLQlpZiAoKHV1cmItPmVuZHBvaW50ICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSAhPSAwKSB7Ci0JCWlzX2luID0gMTsKLQkJZXAgPSBwcy0+ZGV2LT5lcF9pblt1dXJiLT5lbmRwb2ludCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTS107Ci0JfSBlbHNlIHsKLQkJaXNfaW4gPSAwOwotCQllcCA9IHBzLT5kZXYtPmVwX291dFt1dXJiLT5lbmRwb2ludCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTS107Ci0JfQorCWVwID0gZXBfdG9faG9zdF9lbmRwb2ludChwcy0+ZGV2LCB1dXJiLT5lbmRwb2ludCk7CiAJaWYgKCFlcCkKIAkJcmV0dXJuIC1FTk9FTlQ7CisJaXNfaW4gPSAodXVyYi0+ZW5kcG9pbnQgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IDA7CiAKIAl1ID0gMDsKIAlzd2l0Y2godXVyYi0+dHlwZSkgewpAQCAtMTI0Miw3ICsxMzQwLDYgQEAKIAkJCQkgICAgICBsZTE2X3RvX2NwdXAoJmRyLT53SW5kZXgpKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7Ci0JCXV1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKIAkJdXVyYi0+YnVmZmVyX2xlbmd0aCA9IGxlMTZfdG9fY3B1cCgmZHItPndMZW5ndGgpOwogCQl1dXJiLT5idWZmZXIgKz0gODsKIAkJaWYgKChkci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgJiYgdXVyYi0+YnVmZmVyX2xlbmd0aCkgewpAQCAtMTI3MiwxNyArMTM2OSwxNyBAQAogCQkJdXVyYi0+dHlwZSA9IFVTQkRFVkZTX1VSQl9UWVBFX0lOVEVSUlVQVDsKIAkJCWdvdG8gaW50ZXJydXB0X3VyYjsKIAkJfQotCQl1dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IDA7CiAJCW51bV9zZ3MgPSBESVZfUk9VTkRfVVAodXVyYi0+YnVmZmVyX2xlbmd0aCwgVVNCX1NHX1NJWkUpOwogCQlpZiAobnVtX3NncyA9PSAxIHx8IG51bV9zZ3MgPiBwcy0+ZGV2LT5idXMtPnNnX3RhYmxlc2l6ZSkKIAkJCW51bV9zZ3MgPSAwOworCQlpZiAoZXAtPnN0cmVhbXMpCisJCQlzdHJlYW1faWQgPSB1dXJiLT5zdHJlYW1faWQ7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19VUkJfVFlQRV9JTlRFUlJVUFQ6CiAJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaW50KCZlcC0+ZGVzYykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKICBpbnRlcnJ1cHRfdXJiOgotCQl1dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19VUkJfVFlQRV9JU086CkBAIC0xMjkyLDE1ICsxMzg5LDE2IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKCZlcC0+ZGVzYykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbnVtYmVyX29mX3BhY2tldHMgPSB1dXJiLT5udW1iZXJfb2ZfcGFja2V0czsKIAkJaXNvZnJtbGVuID0gc2l6ZW9mKHN0cnVjdCB1c2JkZXZmc19pc29fcGFja2V0X2Rlc2MpICoKLQkJCQkgICB1dXJiLT5udW1iZXJfb2ZfcGFja2V0czsKKwkJCQkgICBudW1iZXJfb2ZfcGFja2V0czsKIAkJaWYgKCEoaXNvcGt0ID0ga21hbGxvYyhpc29mcm1sZW4sIEdGUF9LRVJORUwpKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpZiAoY29weV9mcm9tX3VzZXIoaXNvcGt0LCBpc29fZnJhbWVfZGVzYywgaXNvZnJtbGVuKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KLQkJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IHV1cmItPm51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKKwkJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IG51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKIAkJCS8qCiAJCQkgKiBhcmJpdHJhcnkgbGltaXQgbmVlZCBmb3IgVVNCIDMuMAogCQkJICogYk1heEJ1cnN0ICgwfjE1IGFsbG93ZWQsIDF+MTYgcGFja2V0cykKQEAgLTEzMzEsNyArMTQyOSw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWFzID0gYWxsb2NfYXN5bmModXVyYi0+bnVtYmVyX29mX3BhY2tldHMpOworCWFzID0gYWxsb2NfYXN5bmMobnVtYmVyX29mX3BhY2tldHMpOwogCWlmICghYXMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKQEAgLTE0MjUsNyArMTUyMyw4IEBACiAJYXMtPnVyYi0+c2V0dXBfcGFja2V0ID0gKHVuc2lnbmVkIGNoYXIgKilkcjsKIAlkciA9IE5VTEw7CiAJYXMtPnVyYi0+c3RhcnRfZnJhbWUgPSB1dXJiLT5zdGFydF9mcmFtZTsKLQlhcy0+dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IHV1cmItPm51bWJlcl9vZl9wYWNrZXRzOworCWFzLT51cmItPm51bWJlcl9vZl9wYWNrZXRzID0gbnVtYmVyX29mX3BhY2tldHM7CisJYXMtPnVyYi0+c3RyZWFtX2lkID0gc3RyZWFtX2lkOwogCWlmICh1dXJiLT50eXBlID09IFVTQkRFVkZTX1VSQl9UWVBFX0lTTyB8fAogCQkJcHMtPmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCWFzLT51cmItPmludGVydmFsID0gMSA8PCBtaW4oMTUsIGVwLT5kZXNjLmJJbnRlcnZhbCAtIDEpOwpAQCAtMTQzMyw3ICsxNTMyLDcgQEAKIAkJYXMtPnVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CiAJYXMtPnVyYi0+Y29udGV4dCA9IGFzOwogCWFzLT51cmItPmNvbXBsZXRlID0gYXN5bmNfY29tcGxldGVkOwotCWZvciAodG90bGVuID0gdSA9IDA7IHUgPCB1dXJiLT5udW1iZXJfb2ZfcGFja2V0czsgdSsrKSB7CisJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IG51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKIAkJYXMtPnVyYi0+aXNvX2ZyYW1lX2Rlc2NbdV0ub2Zmc2V0ID0gdG90bGVuOwogCQlhcy0+dXJiLT5pc29fZnJhbWVfZGVzY1t1XS5sZW5ndGggPSBpc29wa3RbdV0ubGVuZ3RoOwogCQl0b3RsZW4gKz0gaXNvcGt0W3VdLmxlbmd0aDsKQEAgLTE1MDgsNyArMTYwNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwcm9jX3N1Ym1pdHVyYihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19zdWJtaXR1cmIoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc191cmIgdXVyYjsKIApAQCAtMTUyMCw3ICsxNjE5LDcgQEAKIAkJCWFyZyk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY191bmxpbmt1cmIoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfdW5saW5rdXJiKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJc3RydWN0IGFzeW5jICphczsKQEAgLTE1ODAsNyArMTY3OSw3IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXN5bmMgKnJlYXBfYXMoc3RydWN0IGRldl9zdGF0ZSAqcHMpCitzdGF0aWMgc3RydWN0IGFzeW5jICpyZWFwX2FzKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcykKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzdHJ1Y3QgYXN5bmMgKmFzID0gTlVMTDsKQEAgLTE2MDMsNyArMTcwMiw3IEBACiAJcmV0dXJuIGFzOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVhcHVyYihzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19yZWFwdXJiKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgYXN5bmMgKmFzID0gcmVhcF9hcyhwcyk7CiAJaWYgKGFzKSB7CkBAIC0xNjE2LDcgKzE3MTUsNyBAQAogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVhcHVyYm5vbmJsb2NrKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX3JlYXB1cmJub25ibG9jayhzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgYXN5bmMgKmFzOwpAQCAtMTYzMSw3ICsxNzMwLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgcHJvY19jb250cm9sX2NvbXBhdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywKK3N0YXRpYyBpbnQgcHJvY19jb250cm9sX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsCiAJCQkJc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyIF9fdXNlciAqcDMyKQogewogCXN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgX191c2VyICpwOwpAQCAtMTY0NCw3ICsxNzQzLDcgQEAKIAlyZXR1cm4gcHJvY19jb250cm9sKHBzLCBwKTsKIH0KIAotc3RhdGljIGludCBwcm9jX2J1bGtfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLAorc3RhdGljIGludCBwcm9jX2J1bGtfY29tcGF0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywKIAkJCXN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMiBfX3VzZXIgKnAzMikKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyIF9fdXNlciAqcDsKQEAgLTE2NjEsNyArMTc2MCw3IEBACiAKIAlyZXR1cm4gcHJvY19idWxrKHBzLCBwKTsKIH0KLXN0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0c2lnbmFsX2NvbXBhdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0c2lnbmFsX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiBkczsKIApAQCAtMTY5OSw3ICsxNzk4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX3N1Ym1pdHVyYl9jb21wYXQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2Nfc3VibWl0dXJiX2NvbXBhdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX3VyYiB1dXJiOwogCkBAIC0xNzQ1LDcgKzE4NDQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVhcHVyYl9jb21wYXQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfcmVhcHVyYl9jb21wYXQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBhc3luYyAqYXMgPSByZWFwX2FzKHBzKTsKIAlpZiAoYXMpIHsKQEAgLTE3NTgsNyArMTg1Nyw3IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWFwdXJibm9uYmxvY2tfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX3JlYXB1cmJub25ibG9ja19jb21wYXQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IGFzeW5jICphczsKQEAgLTE3NzUsNyArMTg3NCw3IEBACiAKICNlbmRpZgogCi1zdGF0aWMgaW50IHByb2NfZGlzY29ubmVjdHNpZ25hbChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0c2lnbmFsKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbCBkczsKIApAQCAtMTc4Niw3ICsxODg1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jX2NsYWltaW50ZXJmYWNlKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2NsYWltaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBpbnQgaWZudW07CiAKQEAgLTE3OTUsNyArMTg5NCw3IEBACiAJcmV0dXJuIGNsYWltaW50ZihwcywgaWZudW0pOwogfQogCi1zdGF0aWMgaW50IHByb2NfcmVsZWFzZWludGVyZmFjZShzdHJ1Y3QgZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgcHJvY19yZWxlYXNlaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBpbnQgaWZudW07CiAJaW50IHJldDsKQEAgLTE4MDgsNyArMTkwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19pb2N0bChzdHJ1Y3QgZGV2X3N0YXRlICpwcywgc3RydWN0IHVzYmRldmZzX2lvY3RsICpjdGwpCitzdGF0aWMgaW50IHByb2NfaW9jdGwoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwgKmN0bCkKIHsKIAlpbnQJCQlzaXplOwogCXZvaWQJCQkqYnVmID0gTlVMTDsKQEAgLTE4ODQsNyArMTk4Myw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBwcm9jX2lvY3RsX2RlZmF1bHQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfaW9jdGxfZGVmYXVsdChzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IHVzYmRldmZzX2lvY3RsCWN0cmw7CiAKQEAgLTE4OTQsNyArMTk5Myw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdGF0aWMgaW50IHByb2NfaW9jdGxfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCBjb21wYXRfdXB0cl90IGFyZykKK3N0YXRpYyBpbnQgcHJvY19pb2N0bF9jb21wYXQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBjb21wYXRfdXB0cl90IGFyZykKIHsKIAlzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwzMiBfX3VzZXIgKnVpb2M7CiAJc3RydWN0IHVzYmRldmZzX2lvY3RsIGN0cmw7CkBAIC0xOTEyLDcgKzIwMTEsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgcHJvY19jbGFpbV9wb3J0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2NsYWltX3BvcnQoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXVuc2lnbmVkIHBvcnRudW07CiAJaW50IHJjOwpAQCAtMTkyNiw3ICsyMDI1LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19yZWxlYXNlX3BvcnQoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHByb2NfcmVsZWFzZV9wb3J0KHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAl1bnNpZ25lZCBwb3J0bnVtOwogCkBAIC0xOTM1LDcgKzIwMzQsNyBAQAogCXJldHVybiB1c2JfaHViX3JlbGVhc2VfcG9ydChwcy0+ZGV2LCBwb3J0bnVtLCBwcyk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19nZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2dldF9jYXBhYmlsaXRpZXMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCV9fdTMyIGNhcHM7CiAKQEAgLTE5NTEsNyArMjA1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19kaXNjb25uZWN0X2NsYWltKHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RfY2xhaW0oc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0X2NsYWltIGRjOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwpAQCAtMTk4Myw2ICsyMDgyLDQ1IEBACiAJcmV0dXJuIGNsYWltaW50ZihwcywgZGMuaW50ZXJmYWNlKTsKIH0KIAorc3RhdGljIGludCBwcm9jX2FsbG9jX3N0cmVhbXMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXVuc2lnbmVkIG51bV9zdHJlYW1zLCBudW1fZXBzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlpbnQgcjsKKworCXIgPSBwYXJzZV91c2JkZXZmc19zdHJlYW1zKHBzLCBhcmcsICZudW1fc3RyZWFtcywgJm51bV9lcHMsCisJCQkJICAgJmVwcywgJmludGYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRlc3Ryb3lfYXN5bmNfb25faW50ZXJmYWNlKHBzLAorCQkJCSAgIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKworCXIgPSB1c2JfYWxsb2Nfc3RyZWFtcyhpbnRmLCBlcHMsIG51bV9lcHMsIG51bV9zdHJlYW1zLCBHRlBfS0VSTkVMKTsKKwlrZnJlZShlcHMpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHByb2NfZnJlZV9zdHJlYW1zKHN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcywgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwl1bnNpZ25lZCBudW1fZXBzOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqKmVwczsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlpbnQgcjsKKworCXIgPSBwYXJzZV91c2JkZXZmc19zdHJlYW1zKHBzLCBhcmcsIE5VTEwsICZudW1fZXBzLCAmZXBzLCAmaW50Zik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZGVzdHJveV9hc3luY19vbl9pbnRlcmZhY2UocHMsCisJCQkJICAgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisJciA9IHVzYl9mcmVlX3N0cmVhbXMoaW50ZiwgZXBzLCBudW1fZXBzLCBHRlBfS0VSTkVMKTsKKwlrZnJlZShlcHMpOworCXJldHVybiByOworfQorCiAvKgogICogTk9URTogIEFsbCByZXF1ZXN0cyBoZXJlIHRoYXQgaGF2ZSBpbnRlcmZhY2UgbnVtYmVycyBhcyBwYXJhbWV0ZXJzCiAgKiBhcmUgYXNzdW1pbmcgdGhhdCBzb21laG93IHRoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHByZXZlbnRlZCBmcm9tCkBAIC0xOTkxLDcgKzIxMjksNyBAQAogc3RhdGljIGxvbmcgdXNiZGV2X2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCXZvaWQgX191c2VyICpwKQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcHMtPmRldjsKIAlpbnQgcmV0ID0gLUVOT1RUWTsKQEAgLTIxNTksNiArMjI5NywxMiBAQAogCWNhc2UgVVNCREVWRlNfRElTQ09OTkVDVF9DTEFJTToKIAkJcmV0ID0gcHJvY19kaXNjb25uZWN0X2NsYWltKHBzLCBwKTsKIAkJYnJlYWs7CisJY2FzZSBVU0JERVZGU19BTExPQ19TVFJFQU1TOgorCQlyZXQgPSBwcm9jX2FsbG9jX3N0cmVhbXMocHMsIHApOworCQlicmVhazsKKwljYXNlIFVTQkRFVkZTX0ZSRUVfU1RSRUFNUzoKKwkJcmV0ID0gcHJvY19mcmVlX3N0cmVhbXMocHMsIHApOworCQlicmVhazsKIAl9CiAJdXNiX3VubG9ja19kZXZpY2UoZGV2KTsKIAlpZiAocmV0ID49IDApCkBAIC0yMTkyLDcgKzIzMzYsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCB1c2JkZXZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0Jc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAogCXBvbGxfd2FpdChmaWxlLCAmcHMtPndhaXQsIHdhaXQpOwpAQCAtMjIxOCwxMSArMjM2MiwxMSBAQAogCiBzdGF0aWMgdm9pZCB1c2JkZXZfcmVtb3ZlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpwczsKIAlzdHJ1Y3Qgc2lnaW5mbyBzaW5mbzsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmdWRldi0+ZmlsZWxpc3QpKSB7Ci0JCXBzID0gbGlzdF9lbnRyeSh1ZGV2LT5maWxlbGlzdC5uZXh0LCBzdHJ1Y3QgZGV2X3N0YXRlLCBsaXN0KTsKKwkJcHMgPSBsaXN0X2VudHJ5KHVkZXYtPmZpbGVsaXN0Lm5leHQsIHN0cnVjdCB1c2JfZGV2X3N0YXRlLCBsaXN0KTsKIAkJZGVzdHJveV9hbGxfYXN5bmMocHMpOwogCQl3YWtlX3VwX2FsbCgmcHMtPndhaXQpOwogCQlsaXN0X2RlbF9pbml0KCZwcy0+bGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCBhYjkwYTAxLi44ODg4ODFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTMxMiw5ICszMTIsOSBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWQgPSB1c2JfbWF0Y2hfaWQoaW50ZiwgZHJpdmVyLT5pZF90YWJsZSk7CisJaWQgPSB1c2JfbWF0Y2hfZHluYW1pY19pZChpbnRmLCBkcml2ZXIpOwogCWlmICghaWQpCi0JCWlkID0gdXNiX21hdGNoX2R5bmFtaWNfaWQoaW50ZiwgZHJpdmVyKTsKKwkJaWQgPSB1c2JfbWF0Y2hfaWQoaW50ZiwgZHJpdmVyLT5pZF90YWJsZSk7CiAJaWYgKCFpZCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC00MDAsOCArNDAwLDkgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RyaXZlciAqZHJpdmVyID0gdG9fdXNiX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwgKiplcHMgPSBOVUxMOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotCWludCBlcnJvciwgciwgbHBtX2Rpc2FibGVfZXJyb3I7CisJaW50IGksIGosIGVycm9yLCByLCBscG1fZGlzYWJsZV9lcnJvcjsKIAogCWludGYtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CSU5ESU5HOwogCkBAIC00MjUsNiArNDI2LDI2IEBACiAJZHJpdmVyLT5kaXNjb25uZWN0KGludGYpOwogCXVzYl9jYW5jZWxfcXVldWVkX3Jlc2V0KGludGYpOwogCisJLyogRnJlZSBzdHJlYW1zICovCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKKwkJZXAgPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2ldOworCQlpZiAoZXAtPnN0cmVhbXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaiA9PSAwKSB7CisJCQllcHMgPSBrbWFsbG9jKFVTQl9NQVhFTkRQT0lOVFMgKiBzaXplb2Yodm9pZCAqKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghZXBzKSB7CisJCQkJZGV2X3dhcm4oZGV2LCAib29tLCBsZWFraW5nIHN0cmVhbXNcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVwc1tqKytdID0gZXA7CisJfQorCWlmIChqKSB7CisJCXVzYl9mcmVlX3N0cmVhbXMoaW50ZiwgZXBzLCBqLCBHRlBfS0VSTkVMKTsKKwkJa2ZyZWUoZXBzKTsKKwl9CisKIAkvKiBSZXNldCBvdGhlciBpbnRlcmZhY2Ugc3RhdGUuCiAJICogV2UgY2Fubm90IGRvIGEgU2V0LUludGVyZmFjZSBpZiB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZCBvcgogCSAqIGlmIGl0IGlzIHByZXBhcmVkIGZvciBhIHN5c3RlbSBzbGVlcCAoc2luY2UgaW5zdGFsbGluZyBhIG5ldwpAQCAtOTkwLDggKzEwMTEsNyBAQAogICogaXQgZG9lc24ndCBzdXBwb3J0IHByZV9yZXNldC9wb3N0X3Jlc2V0L3Jlc2V0X3Jlc3VtZSBvcgogICogYmVjYXVzZSBpdCBkb2Vzbid0IHN1cHBvcnQgc3VzcGVuZC9yZXN1bWUuCiAgKgotICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQGludGYncyBkZXZpY2UncyBsb2NrLCBidXQgbm90IGl0cyBwbV9tdXRleAotICogYW5kIG5vdCBAaW50Zi0+ZGV2LnNlbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEBpbnRmJ3MgZGV2aWNlJ3MgbG9jaywgYnV0IG5vdCBAaW50ZidzIGxvY2suCiAgKi8KIHZvaWQgdXNiX2ZvcmNlZF91bmJpbmRfaW50ZihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKQEAgLTEwMDQsMTYgKzEwMjQsMzcgQEAKIAlpbnRmLT5uZWVkc19iaW5kaW5nID0gMTsKIH0KIAorLyoKKyAqIFVuYmluZCBkcml2ZXJzIGZvciBAdWRldidzIG1hcmtlZCBpbnRlcmZhY2VzLiAgVGhlc2UgaW50ZXJmYWNlcyBoYXZlCisgKiB0aGUgbmVlZHNfYmluZGluZyBmbGFnIHNldCwgZm9yIGV4YW1wbGUgYnkgdXNiX3Jlc3VtZV9pbnRlcmZhY2UoKS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgorICovCitzdGF0aWMgdm9pZCB1bmJpbmRfbWFya2VkX2ludGVyZmFjZXMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHVzYl9ob3N0X2NvbmZpZwkqY29uZmlnOworCWludAkJCWk7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UJKmludGY7CisKKwljb25maWcgPSB1ZGV2LT5hY3Rjb25maWc7CisJaWYgKGNvbmZpZykgeworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyArK2kpIHsKKwkJCWludGYgPSBjb25maWctPmludGVyZmFjZVtpXTsKKwkJCWlmIChpbnRmLT5kZXYuZHJpdmVyICYmIGludGYtPm5lZWRzX2JpbmRpbmcpCisJCQkJdXNiX2ZvcmNlZF91bmJpbmRfaW50ZihpbnRmKTsKKwkJfQorCX0KK30KKwogLyogRGVsYXllZCBmb3JjZWQgdW5iaW5kaW5nIG9mIGEgVVNCIGludGVyZmFjZSBkcml2ZXIgYW5kIHNjYW4KICAqIGZvciByZWJpbmRpbmcuCiAgKgotICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQGludGYncyBkZXZpY2UncyBsb2NrLCBidXQgbm90IGl0cyBwbV9tdXRleAotICogYW5kIG5vdCBAaW50Zi0+ZGV2LnNlbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIEBpbnRmJ3MgZGV2aWNlJ3MgbG9jaywgYnV0IG5vdCBAaW50ZidzIGxvY2suCiAgKgogICogTm90ZTogUmViaW5kcyB3aWxsIGJlIHNraXBwZWQgaWYgYSBzeXN0ZW0gc2xlZXAgdHJhbnNpdGlvbiBpcyBpbgogICogcHJvZ3Jlc3MgYW5kIHRoZSBQTSAiY29tcGxldGUiIGNhbGxiYWNrIGhhc24ndCBvY2N1cnJlZCB5ZXQuCiAgKi8KLXZvaWQgdXNiX3JlYmluZF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIHZvaWQgdXNiX3JlYmluZF9pbnRmKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCWludCByYzsKIApAQCAtMTAzMCw2ICsxMDcxLDQxIEBACiAJfQogfQogCisvKgorICogUmViaW5kIGRyaXZlcnMgdG8gQHVkZXYncyBtYXJrZWQgaW50ZXJmYWNlcy4gIFRoZXNlIGludGVyZmFjZXMgaGF2ZQorICogdGhlIG5lZWRzX2JpbmRpbmcgZmxhZyBzZXQuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQHVkZXYncyBkZXZpY2UgbG9jay4KKyAqLworc3RhdGljIHZvaWQgcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXN0cnVjdCB1c2JfaG9zdF9jb25maWcJKmNvbmZpZzsKKwlpbnQJCQlpOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOworCisJY29uZmlnID0gdWRldi0+YWN0Y29uZmlnOworCWlmIChjb25maWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgKytpKSB7CisJCQlpbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07CisJCQlpZiAoaW50Zi0+bmVlZHNfYmluZGluZykKKwkJCQl1c2JfcmViaW5kX2ludGYoaW50Zik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBVbmJpbmQgYWxsIG9mIEB1ZGV2J3MgbWFya2VkIGludGVyZmFjZXMgYW5kIHRoZW4gcmViaW5kIGFsbCBvZiB0aGVtLgorICogVGhpcyBvcmRlcmluZyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGRyaXZlcnMgY2xhaW0gc2V2ZXJhbCBpbnRlcmZhY2VzCisgKiB3aGVuIHRoZXkgYXJlIGZpcnN0IHByb2JlZC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgorICovCit2b2lkIHVzYl91bmJpbmRfYW5kX3JlYmluZF9tYXJrZWRfaW50ZXJmYWNlcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwl1bmJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7CisJcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHVkZXYpOworfQorCiAjaWZkZWYgQ09ORklHX1BNCiAKIC8qIFVuYmluZCBkcml2ZXJzIGZvciBAdWRldidzIGludGVyZmFjZXMgdGhhdCBkb24ndCBzdXBwb3J0IHN1c3BlbmQvcmVzdW1lCkBAIC0xMDU5LDQzICsxMTM1LDYgQEAKIAl9CiB9CiAKLS8qIFVuYmluZCBkcml2ZXJzIGZvciBAdWRldidzIGludGVyZmFjZXMgdGhhdCBmYWlsZWQgdG8gc3VwcG9ydCByZXNldC1yZXN1bWUuCi0gKiBUaGVzZSBpbnRlcmZhY2VzIGhhdmUgdGhlIG5lZWRzX2JpbmRpbmcgZmxhZyBzZXQgYnkgdXNiX3Jlc3VtZV9pbnRlcmZhY2UoKS4KLSAqCi0gKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgotICovCi1zdGF0aWMgdm9pZCB1bmJpbmRfbm9fcmVzZXRfcmVzdW1lX2RyaXZlcnNfaW50ZXJmYWNlcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKLXsKLQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSpjb25maWc7Ci0JaW50CQkJaTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZjsKLQotCWNvbmZpZyA9IHVkZXYtPmFjdGNvbmZpZzsKLQlpZiAoY29uZmlnKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7ICsraSkgewotCQkJaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJaWYgKGludGYtPmRldi5kcml2ZXIgJiYgaW50Zi0+bmVlZHNfYmluZGluZykKLQkJCQl1c2JfZm9yY2VkX3VuYmluZF9pbnRmKGludGYpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkb19yZWJpbmRfaW50ZXJmYWNlcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKLXsKLQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSpjb25maWc7Ci0JaW50CQkJaTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZjsKLQotCWNvbmZpZyA9IHVkZXYtPmFjdGNvbmZpZzsKLQlpZiAoY29uZmlnKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7ICsraSkgewotCQkJaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJaWYgKGludGYtPm5lZWRzX2JpbmRpbmcpCi0JCQkJdXNiX3JlYmluZF9pbnRmKGludGYpOwotCQl9Ci0JfQotfQotCiBzdGF0aWMgaW50IHVzYl9zdXNwZW5kX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIJKnVkcml2ZXI7CkBAIC0xNDIwLDcgKzE0NTksNyBAQAogCSAqIHdob3NlIG5lZWRzX2JpbmRpbmcgZmxhZyBpcyBzZXQKIAkgKi8KIAlpZiAodWRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQotCQlkb19yZWJpbmRfaW50ZXJmYWNlcyh1ZGV2KTsKKwkJcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHVkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDQyLDcgKzE0ODEsNyBAQAogCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKIAkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CiAJCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JCXVuYmluZF9ub19yZXNldF9yZXN1bWVfZHJpdmVyc19pbnRlcmZhY2VzKHVkZXYpOworCQl1bmJpbmRfbWFya2VkX2ludGVyZmFjZXModWRldik7CiAJfQogCiAJLyogQXZvaWQgUE0gZXJyb3IgbWVzc2FnZXMgZm9yIGRldmljZXMgZGlzY29ubmVjdGVkIHdoaWxlIHN1c3BlbmRlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYwppbmRleCBhY2JmZWIwLi4zNThjYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYwpAQCAtMTU1LDYgKzE1NSw3IEBACiAJfQogCXJldHVybiBpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2Nob29zZV9jb25maWd1cmF0aW9uKTsKIAogc3RhdGljIGludCBnZW5lcmljX3Byb2JlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggMjUxOGMzMi4uOWM0ZTI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0yMDQ5LDcgKzIwNDksNyBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCiAJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCWhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOwpAQCAtMjA1OCwxMyArMjA1OCwyNCBAQAogCWlmIChkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9TVVBFUikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBTdHJlYW1zIG9ubHkgYXBwbHkgdG8gYnVsayBlbmRwb2ludHMuICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9lcHM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKSB7CisJCS8qIFN0cmVhbXMgb25seSBhcHBseSB0byBidWxrIGVuZHBvaW50cy4gKi8KIAkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKCZlcHNbaV0tPmRlc2MpKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIFJlLWFsbG9jIGlzIG5vdCBhbGxvd2VkICovCisJCWlmIChlcHNbaV0tPnN0cmVhbXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQlyZXR1cm4gaGNkLT5kcml2ZXItPmFsbG9jX3N0cmVhbXMoaGNkLCBkZXYsIGVwcywgbnVtX2VwcywKKwlyZXQgPSBoY2QtPmRyaXZlci0+YWxsb2Nfc3RyZWFtcyhoY2QsIGRldiwgZXBzLCBudW1fZXBzLAogCQkJbnVtX3N0cmVhbXMsIG1lbV9mbGFncyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKQorCQllcHNbaV0tPnN0cmVhbXMgPSByZXQ7CisKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2FsbG9jX3N0cmVhbXMpOwogCkBAIC0yMDc4LDggKzIwODksNyBAQAogICogUmV2ZXJ0cyBhIGdyb3VwIG9mIGJ1bGsgZW5kcG9pbnRzIGJhY2sgdG8gbm90IHVzaW5nIHN0cmVhbSBJRHMuCiAgKiBDYW4gZmFpbCBpZiB3ZSBhcmUgZ2l2ZW4gYmFkIGFyZ3VtZW50cywgb3IgSENEIGlzIGJyb2tlbi4KICAqCi0gKiBSZXR1cm46IE9uIHN1Y2Nlc3MsIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIHN0cmVhbXMuIE9uIGZhaWx1cmUsIGEgbmVnYXRpdmUKLSAqIGVycm9yIGNvZGUuCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gT24gZmFpbHVyZSwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCiBpbnQgdXNiX2ZyZWVfc3RyZWFtcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKiplcHMsIHVuc2lnbmVkIGludCBudW1fZXBzLApAQCAtMjA4NywxOSArMjA5NywyNiBAQAogewogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCiAJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCWhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOwogCWlmIChkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9TVVBFUikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBTdHJlYW1zIG9ubHkgYXBwbHkgdG8gYnVsayBlbmRwb2ludHMuICovCisJLyogRG91YmxlLWZyZWUgaXMgbm90IGFsbG93ZWQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKQotCQlpZiAoIWVwc1tpXSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfYnVsaygmZXBzW2ldLT5kZXNjKSkKKwkJaWYgKCFlcHNbaV0gfHwgIWVwc1tpXS0+c3RyZWFtcykKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGhjZC0+ZHJpdmVyLT5mcmVlX3N0cmVhbXMoaGNkLCBkZXYsIGVwcywgbnVtX2VwcywgbWVtX2ZsYWdzKTsKKwlyZXQgPSBoY2QtPmRyaXZlci0+ZnJlZV9zdHJlYW1zKGhjZCwgZGV2LCBlcHMsIG51bV9lcHMsIG1lbV9mbGFncyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgaSsrKQorCQllcHNbaV0tPnN0cmVhbXMgPSAwOworCisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9mcmVlX3N0cmVhbXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA2NGVhMjE5Li4wOTA0NjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTE0MSwxOSArMTQxLDI3IEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIEFsbCBVU0IgMy4wIG11c3Qgc3VwcG9ydCBMUE0sIGJ1dCB3ZSBuZWVkIHRoZWlyIG1heCBleGl0IGxhdGVuY3kKLQkgKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTdXBlclNwZWVkIEV4dGVuZGVkIENhcGFiaWxpdGllcyBCT1MgZGVzY3JpcHRvci4KKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgVVNCIDMuMCBzcGVjLCBhbGwgVVNCIDMuMCBkZXZpY2VzIG11c3Qgc3VwcG9ydCBMUE0uCisJICogSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdGhhdCBkb24ndCwgYW5kIHRoZXkgc2V0IHRoZSBVMS9VMiBleGl0CisJICogbGF0ZW5jaWVzIHRvIHplcm8uCiAJICovCiAJaWYgKCF1ZGV2LT5ib3MtPnNzX2NhcCkgewotCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiTm8gTFBNIGV4aXQgbGF0ZW5jeSBpbmZvIGZvdW5kLiAgIgotCQkJCSJQb3dlciBtYW5hZ2VtZW50IHdpbGwgYmUgaW1wYWN0ZWQuXG4iKTsKKwkJZGV2X2luZm8oJnVkZXYtPmRldiwgIk5vIExQTSBleGl0IGxhdGVuY3kgaW5mbyBmb3VuZCwgZGlzYWJsaW5nIExQTS5cbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKHVkZXYtPnBhcmVudC0+bHBtX2NhcGFibGUpCi0JCXJldHVybiAxOwogCi0JZGV2X3dhcm4oJnVkZXYtPmRldiwgIlBhcmVudCBodWIgbWlzc2luZyBMUE0gZXhpdCBsYXRlbmN5IGluZm8uICAiCi0JCQkiUG93ZXIgbWFuYWdlbWVudCB3aWxsIGJlIGltcGFjdGVkLlxuIik7CisJaWYgKHVkZXYtPmJvcy0+c3NfY2FwLT5iVTFkZXZFeGl0TGF0ID09IDAgJiYKKwkJCXVkZXYtPmJvcy0+c3NfY2FwLT5iVTJEZXZFeGl0TGF0ID09IDApIHsKKwkJaWYgKHVkZXYtPnBhcmVudCkKKwkJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsICJMUE0gZXhpdCBsYXRlbmN5IGlzIHplcm9lZCwgZGlzYWJsaW5nIExQTS5cbiIpOworCQllbHNlCisJCQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiV2UgZG9uJ3Qga25vdyB0aGUgYWxnb3JpdGhtcyBmb3IgTFBNIGZvciB0aGlzIGhvc3QsIGRpc2FibGluZyBMUE0uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF1ZGV2LT5wYXJlbnQgfHwgdWRldi0+cGFyZW50LT5scG1fY2FwYWJsZSkKKwkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5OSw3ICs1MDcsOCBAQAogCQljaGFuZ2VkKys7CiAJfQogCWlmIChjaGFuZ2VkKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmh1Yi0+bGVkcywgTEVEX0NZQ0xFX1BFUklPRCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJCSZodWItPmxlZHMsIExFRF9DWUNMRV9QRVJJT0QpOwogfQogCiAvKiB1c2UgYSBzaG9ydCB0aW1lb3V0IGZvciBodWIvcG9ydCBzdGF0dXMgZmV0Y2hlcyAqLwpAQCAtMTA0MCw4ICsxMDQ5LDkgQEAKIAkJICovCiAJCWlmICh0eXBlID09IEhVQl9JTklUKSB7CiAJCQlkZWxheSA9IGh1Yl9wb3dlcl9vbihodWIsIGZhbHNlKTsKLQkJCVBSRVBBUkVfREVMQVlFRF9XT1JLKCZodWItPmluaXRfd29yaywgaHViX2luaXRfZnVuYzIpOwotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZodWItPmluaXRfd29yaywKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZodWItPmluaXRfd29yaywgaHViX2luaXRfZnVuYzIpOworCQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJCSZodWItPmluaXRfd29yaywKIAkJCQkJbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCiAJCQkvKiBTdXBwcmVzcyBhdXRvc3VzcGVuZCB1bnRpbCBpbml0IGlzIGRvbmUgKi8KQEAgLTExOTQsOCArMTIwNCw5IEBACiAKIAkJLyogRG9uJ3QgZG8gYSBsb25nIHNsZWVwIGluc2lkZSBhIHdvcmtxdWV1ZSByb3V0aW5lICovCiAJCWlmICh0eXBlID09IEhVQl9JTklUMikgewotCQkJUFJFUEFSRV9ERUxBWUVEX1dPUksoJmh1Yi0+aW5pdF93b3JrLCBodWJfaW5pdF9mdW5jMyk7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmh1Yi0+aW5pdF93b3JrLAorCQkJSU5JVF9ERUxBWUVEX1dPUksoJmh1Yi0+aW5pdF93b3JrLCBodWJfaW5pdF9mdW5jMyk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkJJmh1Yi0+aW5pdF93b3JrLAogCQkJCQltc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CiAJCQlyZXR1cm47CQkvKiBDb250aW51ZXMgYXQgaW5pdDM6IGJlbG93ICovCiAJCX0gZWxzZSB7CkBAIC0xMjA5LDcgKzEyMjAsOCBAQAogCWlmIChzdGF0dXMgPCAwKQogCQlkZXZfZXJyKGh1Yi0+aW50ZmRldiwgImFjdGl2YXRlIC0tPiAlZFxuIiwgc3RhdHVzKTsKIAlpZiAoaHViLT5oYXNfaW5kaWNhdG9ycyAmJiBibGlua2VubGlnaHRzKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmh1Yi0+bGVkcywgTEVEX0NZQ0xFX1BFUklPRCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJCSZodWItPmxlZHMsIExFRF9DWUNMRV9QRVJJT0QpOwogCiAJLyogU2NhbiBhbGwgcG9ydHMgdGhhdCBuZWVkIGF0dGVudGlvbiAqLwogCWtpY2tfa2h1YmQoaHViKTsKQEAgLTE3ODgsNyArMTgwMCw3IEBACiAgKiB0byBvbmUgb2YgdGhlc2UgImNsYWltZWQiIHBvcnRzLCB0aGUgcHJvZ3JhbSB3aWxsICJvd24iIHRoZSBkZXZpY2UuCiAgKi8KIHN0YXRpYyBpbnQgZmluZF9wb3J0X293bmVyKHN0cnVjdCB1c2JfZGV2aWNlICpoZGV2LCB1bnNpZ25lZCBwb3J0MSwKLQkJc3RydWN0IGRldl9zdGF0ZSAqKipwcG93bmVyKQorCQlzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqKipwcG93bmVyKQogewogCXN0cnVjdCB1c2JfaHViICpodWIgPSB1c2JfaHViX3RvX3N0cnVjdF9odWIoaGRldik7CiAKQEAgLTE4MDYsMTAgKzE4MTgsMTAgQEAKIAogLyogSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMsIHRoZSBjYWxsZXIgbXVzdCBob2xkIGhkZXYncyBsb2NrICovCiBpbnQgdXNiX2h1Yl9jbGFpbV9wb3J0KHN0cnVjdCB1c2JfZGV2aWNlICpoZGV2LCB1bnNpZ25lZCBwb3J0MSwKLQkJICAgICAgIHN0cnVjdCBkZXZfc3RhdGUgKm93bmVyKQorCQkgICAgICAgc3RydWN0IHVzYl9kZXZfc3RhdGUgKm93bmVyKQogewogCWludCByYzsKLQlzdHJ1Y3QgZGV2X3N0YXRlICoqcG93bmVyOworCXN0cnVjdCB1c2JfZGV2X3N0YXRlICoqcG93bmVyOwogCiAJcmMgPSBmaW5kX3BvcnRfb3duZXIoaGRldiwgcG9ydDEsICZwb3duZXIpOwogCWlmIChyYykKQEAgLTE4MTksMTIgKzE4MzEsMTMgQEAKIAkqcG93bmVyID0gb3duZXI7CiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2h1Yl9jbGFpbV9wb3J0KTsKIAogaW50IHVzYl9odWJfcmVsZWFzZV9wb3J0KHN0cnVjdCB1c2JfZGV2aWNlICpoZGV2LCB1bnNpZ25lZCBwb3J0MSwKLQkJCSBzdHJ1Y3QgZGV2X3N0YXRlICpvd25lcikKKwkJCSBzdHJ1Y3QgdXNiX2Rldl9zdGF0ZSAqb3duZXIpCiB7CiAJaW50IHJjOwotCXN0cnVjdCBkZXZfc3RhdGUgKipwb3duZXI7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKipwb3duZXI7CiAKIAlyYyA9IGZpbmRfcG9ydF9vd25lcihoZGV2LCBwb3J0MSwgJnBvd25lcik7CiAJaWYgKHJjKQpAQCAtMTgzNCw4ICsxODQ3LDkgQEAKIAkqcG93bmVyID0gTlVMTDsKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaHViX3JlbGVhc2VfcG9ydCk7CiAKLXZvaWQgdXNiX2h1Yl9yZWxlYXNlX2FsbF9wb3J0cyhzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgc3RydWN0IGRldl9zdGF0ZSAqb3duZXIpCit2b2lkIHVzYl9odWJfcmVsZWFzZV9hbGxfcG9ydHMoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHN0cnVjdCB1c2JfZGV2X3N0YXRlICpvd25lcikKIHsKIAlzdHJ1Y3QgdXNiX2h1YiAqaHViID0gdXNiX2h1Yl90b19zdHJ1Y3RfaHViKGhkZXYpOwogCWludCBuOwpAQCAtMzA5Myw5ICszMTA3LDE5IEBACiAJICogb3BlcmF0aW9uIGlzIGNhcnJpZWQgb3V0IGhlcmUsIGFmdGVyIHRoZSBwb3J0IGhhcyBiZWVuCiAJICogcmVzdW1lZC4KIAkgKi8KLQlpZiAodWRldi0+cmVzZXRfcmVzdW1lKQorCWlmICh1ZGV2LT5yZXNldF9yZXN1bWUpIHsKKwkJLyoKKwkJICogSWYgdGhlIGRldmljZSBtb3JwaHMgb3Igc3dpdGNoZXMgbW9kZXMgd2hlbiBpdCBpcyByZXNldCwKKwkJICogd2UgZG9uJ3Qgd2FudCB0byBwZXJmb3JtIGEgcmVzZXQtcmVzdW1lLiAgV2UnbGwgZmFpbCB0aGUKKwkJICogcmVzdW1lLCB3aGljaCB3aWxsIGNhdXNlIGEgbG9naWNhbCBkaXNjb25uZWN0LCBhbmQgdGhlbgorCQkgKiB0aGUgZGV2aWNlIHdpbGwgYmUgcmVkaXNjb3ZlcmVkLgorCQkgKi8KICByZXRyeV9yZXNldF9yZXN1bWU6Ci0JCXN0YXR1cyA9IHVzYl9yZXNldF9hbmRfdmVyaWZ5X2RldmljZSh1ZGV2KTsKKwkJaWYgKHVkZXYtPnF1aXJrcyAmIFVTQl9RVUlSS19SRVNFVCkKKwkJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWVsc2UKKwkJCXN0YXR1cyA9IHVzYl9yZXNldF9hbmRfdmVyaWZ5X2RldmljZSh1ZGV2KTsKKwl9CiAKIAkvKiAxMC41LjQuNSBzYXlzIGJlIHN1cmUgZGV2aWNlcyBpbiB0aGUgdHJlZSBhcmUgc3RpbGwgdGhlcmUuCiAJICogRm9yIG5vdyBsZXQncyBhc3N1bWUgdGhlIGRldmljZSBkaWRuJ3QgZ28gY3Jhenkgb24gcmVzdW1lLApAQCAtMzk1OCw3ICszOTgyLDcgQEAKIAljb25uZWN0X3R5cGUgPSB1c2JfZ2V0X2h1Yl9wb3J0X2Nvbm5lY3RfdHlwZSh1ZGV2LT5wYXJlbnQsCiAJCQl1ZGV2LT5wb3J0bnVtKTsKIAotCWlmICgodWRldi0+Ym9zLT5leHRfY2FwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfQkVTTF9TVVBQT1JUKSB8fAorCWlmICgodWRldi0+Ym9zLT5leHRfY2FwLT5ibUF0dHJpYnV0ZXMgJiBjcHVfdG9fbGUzMihVU0JfQkVTTF9TVVBQT1JUKSkgfHwKIAkJCWNvbm5lY3RfdHlwZSA9PSBVU0JfUE9SVF9DT05ORUNUX1RZUEVfSEFSRF9XSVJFRCkgewogCQl1ZGV2LT51c2IyX2h3X2xwbV9hbGxvd2VkID0gMTsKIAkJdXNiX3NldF91c2IyX2hhcmR3YXJlX2xwbSh1ZGV2LCAxKTsKQEAgLTQxMDcsOCArNDEzMSwxMiBAQAogCiAJCQlkaWRfbmV3X3NjaGVtZSA9IHRydWU7CiAJCQlyZXR2YWwgPSBodWJfZW5hYmxlX2RldmljZSh1ZGV2KTsKLQkJCWlmIChyZXR2YWwgPCAwKQorCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkJCSJodWIgZmFpbGVkIHRvIGVuYWJsZSBkZXZpY2UsIGVycm9yICVkXG4iLAorCQkJCQlyZXR2YWwpOwogCQkJCWdvdG8gZmFpbDsKKwkJCX0KIAogI2RlZmluZSBHRVRfREVTQ1JJUFRPUl9CVUZTSVpFCTY0CiAJCQlidWYgPSBrbWFsbG9jKEdFVF9ERVNDUklQVE9SX0JVRlNJWkUsIEdGUF9OT0lPKTsKQEAgLTQzMTEsNyArNDMzOSw4IEBACiAJCS8qIGh1YiBMRURzIGFyZSBwcm9iYWJseSBoYXJkZXIgdG8gbWlzcyB0aGFuIHN5c2xvZyAqLwogCQlpZiAoaHViLT5oYXNfaW5kaWNhdG9ycykgewogCQkJaHViLT5pbmRpY2F0b3JbcG9ydDEtMV0gPSBJTkRJQ0FUT1JfR1JFRU5fQkxJTks7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsgKCZodWItPmxlZHMsIDApOworCQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJCSZodWItPmxlZHMsIDApOwogCQl9CiAJfQogCWtmcmVlKHF1YWwpOwpAQCAtNDU0MCw3ICs0NTY5LDkgQEAKIAkJCQlpZiAoaHViLT5oYXNfaW5kaWNhdG9ycykgewogCQkJCQlodWItPmluZGljYXRvcltwb3J0MS0xXSA9CiAJCQkJCQlJTkRJQ0FUT1JfQU1CRVJfQkxJTks7Ci0JCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayAoJmh1Yi0+bGVkcywgMCk7CisJCQkJCXF1ZXVlX2RlbGF5ZWRfd29yaygKKwkJCQkJCXN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCisJCQkJCQkmaHViLT5sZWRzLCAwKTsKIAkJCQl9CiAJCQkJc3RhdHVzID0gLUVOT1RDT05OOwkvKiBEb24ndCByZXRyeSAqLwogCQkJCWdvdG8gbG9vcF9kaXNhYmxlOwpAQCAtNDczOSw2ICs0NzcwLDggQEAKIAogCQkvKiBkZWFsIHdpdGggcG9ydCBzdGF0dXMgY2hhbmdlcyAqLwogCQlmb3IgKGkgPSAxOyBpIDw9IGhkZXYtPm1heGNoaWxkOyBpKyspIHsKKwkJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaHViLT5wb3J0c1tpIC0gMV0tPmNoaWxkOworCiAJCQlpZiAodGVzdF9iaXQoaSwgaHViLT5idXN5X2JpdHMpKQogCQkJCWNvbnRpbnVlOwogCQkJY29ubmVjdF9jaGFuZ2UgPSB0ZXN0X2JpdChpLCBodWItPmNoYW5nZV9iaXRzKTsKQEAgLTQ4MzcsOCArNDg3MCw2IEBACiAJCQkgKi8KIAkJCWlmIChodWJfcG9ydF93YXJtX3Jlc2V0X3JlcXVpcmVkKGh1YiwgcG9ydHN0YXR1cykpIHsKIAkJCQlpbnQgc3RhdHVzOwotCQkJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0KLQkJCQkJaHViLT5wb3J0c1tpIC0gMV0tPmNoaWxkOwogCiAJCQkJZGV2X2RiZyhodWJfZGV2LCAid2FybSByZXNldCBwb3J0ICVkXG4iLCBpKTsKIAkJCQlpZiAoIXVkZXYgfHwKQEAgLTQ4NTUsNiArNDg4NiwyNCBAQAogCQkJCQl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKIAkJCQkJY29ubmVjdF9jaGFuZ2UgPSAwOwogCQkJCX0KKwkJCS8qCisJCQkgKiBPbiBkaXNjb25uZWN0IFVTQjMgcHJvdG9jb2wgcG9ydHMgdHJhbnNpdCBmcm9tIFUwIHRvCisJCQkgKiBTUy5JbmFjdGl2ZSB0byBSeC5EZXRlY3QuIElmIHRoaXMgaGFwcGVucyBhIHdhcm0tCisJCQkgKiByZXNldCBpcyBub3QgbmVlZGVkLCBidXQgYSAocmUpY29ubmVjdCBtYXkgaGFwcGVuCisJCQkgKiBiZWZvcmUga2h1YmQgcnVucyBhbmQgc2VlcyB0aGUgZGlzY29ubmVjdCwgYW5kIHRoZQorCQkJICogZGV2aWNlIG1heSBiZSBhbiB1bmtub3duIHN0YXRlLgorCQkJICoKKwkJCSAqIElmIHRoZSBwb3J0IHdlbnQgdGhyb3VnaCBTUy5JbmFjdGl2ZSB3aXRob3V0IGtodWJkCisJCQkgKiBzZWVpbmcgaXQgdGhlIENfTElOS19TVEFURSBjaGFuZ2UgZmxhZyB3aWxsIGJlIHNldCwKKwkJCSAqIGFuZCB3ZSByZXNldCB0aGUgZGV2IHRvIHB1dCBpdCBpbiBhIGtub3duIHN0YXRlLgorCQkJICovCisJCQl9IGVsc2UgaWYgKHVkZXYgJiYgaHViX2lzX3N1cGVyc3BlZWQoaHViLT5oZGV2KSAmJgorCQkJCSAgIChwb3J0Y2hhbmdlICYgVVNCX1BPUlRfU1RBVF9DX0xJTktfU1RBVEUpICYmCisJCQkJICAgKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pKSB7CisJCQkJdXNiX2xvY2tfZGV2aWNlKHVkZXYpOworCQkJCXVzYl9yZXNldF9kZXZpY2UodWRldik7CisJCQkJdXNiX3VubG9ja19kZXZpY2UodWRldik7CisJCQkJY29ubmVjdF9jaGFuZ2UgPSAwOwogCQkJfQogCiAJCQlpZiAoY29ubmVjdF9jaGFuZ2UpCkBAIC01MTEyLDcgKzUxNjEsNyBAQAogCXN0cnVjdCB1c2JfaGNkCQkJKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKIAlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yCWRlc2NyaXB0b3IgPSB1ZGV2LT5kZXNjcmlwdG9yOwogCXN0cnVjdCB1c2JfaG9zdF9ib3MJCSpib3M7Ci0JaW50IAkJCQlpLCByZXQgPSAwOworCWludAkJCQlpLCBqLCByZXQgPSAwOwogCWludAkJCQlwb3J0MSA9IHVkZXYtPnBvcnRudW07CiAKIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEIHx8CkBAIC01MjM4LDYgKzUyODcsOSBAQAogCQkJCXJldCk7CiAJCQlnb3RvIHJlX2VudW1lcmF0ZTsKIAkJfQorCQkvKiBSZXNldHRpbmcgYWxzbyBmcmVlcyBhbnkgYWxsb2NhdGVkIHN0cmVhbXMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHM7IGorKykKKwkJCWludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFtqXS5zdHJlYW1zID0gMDsKIAl9CiAKIGRvbmU6CkBAIC01MzQwLDEwICs1MzkyLDExIEBACiAJCQkJZWxzZSBpZiAoY2ludGYtPmNvbmRpdGlvbiA9PQogCQkJCQkJVVNCX0lOVEVSRkFDRV9CT1VORCkKIAkJCQkJcmViaW5kID0gMTsKKwkJCQlpZiAocmViaW5kKQorCQkJCQljaW50Zi0+bmVlZHNfYmluZGluZyA9IDE7CiAJCQl9Ci0JCQlpZiAocmV0ID09IDAgJiYgcmViaW5kKQotCQkJCXVzYl9yZWJpbmRfaW50ZihjaW50Zik7CiAJCX0KKwkJdXNiX3VuYmluZF9hbmRfcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHVkZXYpOwogCX0KIAogCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oIGIvZHJpdmVycy91c2IvY29yZS9odWIuaAppbmRleCBkZjYyOWEzLi4zM2JjYjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKQEAgLTg5LDcgKzg5LDcgQEAKIHN0cnVjdCB1c2JfcG9ydCB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmNoaWxkOwogCXN0cnVjdCBkZXZpY2UgZGV2OwotCXN0cnVjdCBkZXZfc3RhdGUgKnBvcnRfb3duZXI7CisJc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBvcnRfb3duZXI7CiAJZW51bSB1c2JfcG9ydF9jb25uZWN0X3R5cGUgY29ubmVjdF90eXBlOwogCXU4IHBvcnRudW07CiAJdW5zaWduZWQgcG93ZXJfaXNfb246MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggZjgyOWExYS4uM2NkY2QwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTEyOTMsOCArMTI5Myw3IEBACiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gYnVzX3RvX2hjZChkZXYtPmJ1cyk7Ci0JaW50IHJldDsKLQlpbnQgbWFudWFsID0gMDsKKwlpbnQgaSwgcmV0LCBtYW51YWwgPSAwOwogCXVuc2lnbmVkIGludCBlcGFkZHI7CiAJdW5zaWduZWQgaW50IHBpcGU7CiAKQEAgLTEzMjksNiArMTMyOCwxMCBAQAogCQltdXRleF91bmxvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJLyogQ2hhbmdpbmcgYWx0LXNldHRpbmcgYWxzbyBmcmVlcyBhbnkgYWxsb2NhdGVkIHN0cmVhbXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHM7IGkrKykKKwkJaWZhY2UtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFtpXS5zdHJlYW1zID0gMDsKKwogCXJldCA9IHVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKGRldiwgTlVMTCwgaWZhY2UtPmN1cl9hbHRzZXR0aW5nLCBhbHQpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIk5vdCBlbm91Z2ggYmFuZHdpZHRoIGZvciBhbHRzZXR0aW5nICVkXG4iLApAQCAtMTkyMCw2ICsxOTIzLDcgQEAKIAl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldik7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2V0X2NvbmZpZ3VyYXRpb24pOwogCiBzdGF0aWMgTElTVF9IRUFEKHNldF9jb25maWdfbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNldF9jb25maWdfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oIGIvZHJpdmVycy91c2IvY29yZS91c2IuaAppbmRleCA4MjM4NTc3Li43NWJmNjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKQEAgLTIsNyArMiw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCiBzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yOwotc3RydWN0IGRldl9zdGF0ZTsKK3N0cnVjdCB1c2JfZGV2X3N0YXRlOwogCiAvKiBGdW5jdGlvbnMgbG9jYWwgdG8gZHJpdmVycy91c2IvY29yZS8gKi8KIApAQCAtNTUsMTQgKzU1LDEwIEBACiBleHRlcm4gaW50IHVzYl9tYXRjaF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogZXh0ZXJuIHZvaWQgdXNiX2ZvcmNlZF91bmJpbmRfaW50ZihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7Ci1leHRlcm4gdm9pZCB1c2JfcmViaW5kX2ludGYoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworZXh0ZXJuIHZvaWQgdXNiX3VuYmluZF9hbmRfcmViaW5kX21hcmtlZF9pbnRlcmZhY2VzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKIAotZXh0ZXJuIGludCB1c2JfaHViX2NsYWltX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQsCi0JCXN0cnVjdCBkZXZfc3RhdGUgKm93bmVyKTsKLWV4dGVybiBpbnQgdXNiX2h1Yl9yZWxlYXNlX3BvcnQoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIHBvcnQsCi0JCXN0cnVjdCBkZXZfc3RhdGUgKm93bmVyKTsKIGV4dGVybiB2b2lkIHVzYl9odWJfcmVsZWFzZV9hbGxfcG9ydHMoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYsCi0JCXN0cnVjdCBkZXZfc3RhdGUgKm93bmVyKTsKKwkJc3RydWN0IHVzYl9kZXZfc3RhdGUgKm93bmVyKTsKIGV4dGVybiBib29sIHVzYl9kZXZpY2VfaXNfb3duZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCiBleHRlcm4gaW50ICB1c2JfaHViX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2NvcmVfaW50ci5jIGIvZHJpdmVycy91c2IvZHdjMi9jb3JlX2ludHIuYwppbmRleCA4MjA1Nzk5Li5jOTM5MThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MyL2NvcmVfaW50ci5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvY29yZV9pbnRyLmMKQEAgLTcyLDYgKzcyLDI2IEBACiB9CiAKIC8qKgorICogZHdjMl9oYW5kbGVfdXNiX3BvcnRfaW50ciAtIGhhbmRsZXMgT1RHIFBSVElOVCBpbnRlcnJ1cHRzLgorICogV2hlbiB0aGUgUFJUSU5UIGludGVycnVwdCBmaXJlcywgdGhlcmUgYXJlIGNlcnRhaW4gc3RhdHVzIGJpdHMgaW4gdGhlIEhvc3QKKyAqIFBvcnQgdGhhdCBuZWVkcyB0byBnZXQgY2xlYXJlZC4KKyAqCisgKiBAaHNvdGc6IFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyCisgKi8KK3N0YXRpYyB2b2lkIGR3YzJfaGFuZGxlX3VzYl9wb3J0X2ludHIoc3RydWN0IGR3YzJfaHNvdGcgKmhzb3RnKQoreworCXUzMiBocHJ0MCA9IHJlYWRsKGhzb3RnLT5yZWdzICsgSFBSVDApOworCisJaWYgKGhwcnQwICYgSFBSVDBfRU5BQ0hHKSB7CisJCWhwcnQwICY9IH5IUFJUMF9FTkE7CisJCXdyaXRlbChocHJ0MCwgaHNvdGctPnJlZ3MgKyBIUFJUMCk7CisJfQorCisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJd3JpdGVsKEdJTlRTVFNfUFJUSU5ULCBoc290Zy0+cmVncyArIEdJTlRTVFMpOworfQorCisvKioKICAqIGR3YzJfaGFuZGxlX21vZGVfbWlzbWF0Y2hfaW50cigpIC0gTG9ncyBhIG1vZGUgbWlzbWF0Y2ggd2FybmluZyBtZXNzYWdlCiAgKgogICogQGhzb3RnOiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlcgpAQCAtNDc5LDkgKzQ5OSw4IEBACiAJCWlmIChkd2MyX2lzX2RldmljZV9tb2RlKGhzb3RnKSkgewogCQkJZGV2X2RiZyhoc290Zy0+ZGV2LAogCQkJCSIgLS1Qb3J0IGludGVycnVwdCByZWNlaXZlZCBpbiBEZXZpY2UgbW9kZS0tXG4iKTsKLQkJCWdpbnRzdHMgPSBHSU5UU1RTX1BSVElOVDsKLQkJCXdyaXRlbChnaW50c3RzLCBoc290Zy0+cmVncyArIEdJTlRTVFMpOwotCQkJcmV0dmFsID0gMTsKKwkJCWR3YzJfaGFuZGxlX3VzYl9wb3J0X2ludHIoaHNvdGcpOworCQkJcmV0dmFsID0gSVJRX0hBTkRMRUQ7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkX2ludHIuYyBiL2RyaXZlcnMvdXNiL2R3YzIvaGNkX2ludHIuYwppbmRleCAwMTJmMTdlLi40N2I5ZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MyL2hjZF9pbnRyLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9oY2RfaW50ci5jCkBAIC05NzUsOCArOTc1LDggQEAKIAkJCQkgIHN0cnVjdCBkd2MyX3F0ZCAqcXRkKQogewogCXN0cnVjdCBkd2MyX2hjZF91cmIgKnVyYiA9IHF0ZC0+dXJiOwotCWludCBwaXBlX3R5cGUgPSBkd2MyX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbyk7CiAJZW51bSBkd2MyX2hhbHRfc3RhdHVzIGhhbHRfc3RhdHVzID0gRFdDMl9IQ19YRkVSX0NPTVBMRVRFOworCWludCBwaXBlX3R5cGU7CiAJaW50IHVyYl94ZmVyX2RvbmU7CiAKIAlpZiAoZGJnX2hjKGNoYW4pKQpAQCAtOTg0LDYgKzk4NCwxMSBAQAogCQkJICItLUhvc3QgQ2hhbm5lbCAlZCBJbnRlcnJ1cHQ6IFRyYW5zZmVyIENvbXBsZXRlLS1cbiIsCiAJCQkgY2hudW0pOwogCisJaWYgKCF1cmIpCisJCWdvdG8gaGFuZGxlX3hmZXJjb21wX2RvbmU7CisKKwlwaXBlX3R5cGUgPSBkd2MyX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbyk7CisKIAlpZiAoaHNvdGctPmNvcmVfcGFyYW1zLT5kbWFfZGVzY19lbmFibGUgPiAwKSB7CiAJCWR3YzJfaGNkX2NvbXBsZXRlX3hmZXJfZGRtYShoc290ZywgY2hhbiwgY2hudW0sIGhhbHRfc3RhdHVzKTsKIAkJaWYgKHBpcGVfdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQpAQCAtMTAwNSw5ICsxMDEwLDYgQEAKIAkJfQogCX0KIAotCWlmICghdXJiKQotCQlnb3RvIGhhbmRsZV94ZmVyY29tcF9kb25lOwotCiAJLyogVXBkYXRlIHRoZSBRVEQgYW5kIFVSQiBzdGF0ZXMgKi8KIAlzd2l0Y2ggKHBpcGVfdHlwZSkgewogCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTDoKQEAgLTExMDUsNyArMTEwNyw3IEBACiAJCQkgICAgICAgc3RydWN0IGR3YzJfcXRkICpxdGQpCiB7CiAJc3RydWN0IGR3YzJfaGNkX3VyYiAqdXJiID0gcXRkLT51cmI7Ci0JaW50IHBpcGVfdHlwZSA9IGR3YzJfaGNkX2dldF9waXBlX3R5cGUoJnVyYi0+cGlwZV9pbmZvKTsKKwlpbnQgcGlwZV90eXBlOwogCiAJZGV2X2RiZyhoc290Zy0+ZGV2LCAiLS1Ib3N0IENoYW5uZWwgJWQgSW50ZXJydXB0OiBTVEFMTCBSZWNlaXZlZC0tXG4iLAogCQljaG51bSk7CkBAIC0xMTE5LDYgKzExMjEsOCBAQAogCWlmICghdXJiKQogCQlnb3RvIGhhbmRsZV9zdGFsbF9oYWx0OwogCisJcGlwZV90eXBlID0gZHdjMl9oY2RfZ2V0X3BpcGVfdHlwZSgmdXJiLT5waXBlX2luZm8pOworCiAJaWYgKHBpcGVfdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQogCQlkd2MyX2hvc3RfY29tcGxldGUoaHNvdGcsIHF0ZCwgLUVQSVBFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYwppbmRleCBhNDkyMTdhLi5kMDAxNDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYwpAQCAtNjEsOSArNjEsMTAgQEAKICAqIGR3YzNfY29yZV9zb2Z0X3Jlc2V0IC0gSXNzdWVzIGNvcmUgc29mdCByZXNldCBhbmQgUEhZIHJlc2V0CiAgKiBAZHdjOiBwb2ludGVyIHRvIG91ciBjb250ZXh0IHN0cnVjdHVyZQogICovCi1zdGF0aWMgdm9pZCBkd2MzX2NvcmVfc29mdF9yZXNldChzdHJ1Y3QgZHdjMyAqZHdjKQorc3RhdGljIGludCBkd2MzX2NvcmVfc29mdF9yZXNldChzdHJ1Y3QgZHdjMyAqZHdjKQogewogCXUzMgkJcmVnOworCWludAkJcmV0OwogCiAJLyogQmVmb3JlIFJlc2V0dGluZyBQSFksIHB1dCBDb3JlIGluIFJlc2V0ICovCiAJcmVnID0gZHdjM19yZWFkbChkd2MtPnJlZ3MsIERXQzNfR0NUTCk7CkBAIC04Miw2ICs4MywxNSBAQAogCiAJdXNiX3BoeV9pbml0KGR3Yy0+dXNiMl9waHkpOwogCXVzYl9waHlfaW5pdChkd2MtPnVzYjNfcGh5KTsKKwlyZXQgPSBwaHlfaW5pdChkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGh5X2luaXQoZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKKwlpZiAocmV0IDwgMCkgeworCQlwaHlfZXhpdChkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCQlyZXR1cm4gcmV0OworCX0KIAltZGVsYXkoMTAwKTsKIAogCS8qIENsZWFyIFVTQjMgUEhZIHJlc2V0ICovCkBAIC0xMDAsNiArMTEwLDggQEAKIAlyZWcgPSBkd2MzX3JlYWRsKGR3Yy0+cmVncywgRFdDM19HQ1RMKTsKIAlyZWcgJj0gfkRXQzNfR0NUTF9DT1JFU09GVFJFU0VUOwogCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19HQ1RMLCByZWcpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMjQyLDYgKzI1NCw5MCBAQAogCX0KIH0KIAorc3RhdGljIGludCBkd2MzX2FsbG9jX3NjcmF0Y2hfYnVmZmVycyhzdHJ1Y3QgZHdjMyAqZHdjKQoreworCWlmICghZHdjLT5oYXNfaGliZXJuYXRpb24pCisJCXJldHVybiAwOworCisJaWYgKCFkd2MtPm5yX3NjcmF0Y2gpCisJCXJldHVybiAwOworCisJZHdjLT5zY3JhdGNoYnVmID0ga21hbGxvY19hcnJheShkd2MtPm5yX3NjcmF0Y2gsCisJCQlEV0MzX1NDUkFUQ0hCVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkd2MtPnNjcmF0Y2hidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHdjM19zZXR1cF9zY3JhdGNoX2J1ZmZlcnMoc3RydWN0IGR3YzMgKmR3YykKK3sKKwlkbWFfYWRkcl90IHNjcmF0Y2hfYWRkcjsKKwl1MzIgcGFyYW07CisJaW50IHJldDsKKworCWlmICghZHdjLT5oYXNfaGliZXJuYXRpb24pCisJCXJldHVybiAwOworCisJaWYgKCFkd2MtPm5yX3NjcmF0Y2gpCisJCXJldHVybiAwOworCisJIC8qIHNob3VsZCBuZXZlciBmYWxsIGhlcmUgKi8KKwlpZiAoIVdBUk5fT04oZHdjLT5zY3JhdGNoYnVmKSkKKwkJcmV0dXJuIDA7CisKKwlzY3JhdGNoX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShkd2MtPmRldiwgZHdjLT5zY3JhdGNoYnVmLAorCQkJZHdjLT5ucl9zY3JhdGNoICogRFdDM19TQ1JBVENIQlVGX1NJWkUsCisJCQlETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGR3Yy0+ZGV2LCBzY3JhdGNoX2FkZHIpKSB7CisJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gbWFwIHNjcmF0Y2ggYnVmZmVyXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnIwOworCX0KKworCWR3Yy0+c2NyYXRjaF9hZGRyID0gc2NyYXRjaF9hZGRyOworCisJcGFyYW0gPSBsb3dlcl8zMl9iaXRzKHNjcmF0Y2hfYWRkcik7CisKKwlyZXQgPSBkd2MzX3NlbmRfZ2FkZ2V0X2dlbmVyaWNfY29tbWFuZChkd2MsCisJCQlEV0MzX0RHQ01EX1NFVF9TQ1JBVENIUEFEX0FERFJfTE8sIHBhcmFtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIxOworCisJcGFyYW0gPSB1cHBlcl8zMl9iaXRzKHNjcmF0Y2hfYWRkcik7CisKKwlyZXQgPSBkd2MzX3NlbmRfZ2FkZ2V0X2dlbmVyaWNfY29tbWFuZChkd2MsCisJCQlEV0MzX0RHQ01EX1NFVF9TQ1JBVENIUEFEX0FERFJfSEksIHBhcmFtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIxOworCisJcmV0dXJuIDA7CisKK2VycjE6CisJZG1hX3VubWFwX3NpbmdsZShkd2MtPmRldiwgZHdjLT5zY3JhdGNoX2FkZHIsIGR3Yy0+bnJfc2NyYXRjaCAqCisJCQlEV0MzX1NDUkFUQ0hCVUZfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOworCitlcnIwOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGR3YzNfZnJlZV9zY3JhdGNoX2J1ZmZlcnMoc3RydWN0IGR3YzMgKmR3YykKK3sKKwlpZiAoIWR3Yy0+aGFzX2hpYmVybmF0aW9uKQorCQlyZXR1cm47CisKKwlpZiAoIWR3Yy0+bnJfc2NyYXRjaCkKKwkJcmV0dXJuOworCisJIC8qIHNob3VsZCBuZXZlciBmYWxsIGhlcmUgKi8KKwlpZiAoIVdBUk5fT04oZHdjLT5zY3JhdGNoYnVmKSkKKwkJcmV0dXJuOworCisJZG1hX3VubWFwX3NpbmdsZShkd2MtPmRldiwgZHdjLT5zY3JhdGNoX2FkZHIsIGR3Yy0+bnJfc2NyYXRjaCAqCisJCQlEV0MzX1NDUkFUQ0hCVUZfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWtmcmVlKGR3Yy0+c2NyYXRjaGJ1Zik7Cit9CisKIHN0YXRpYyB2b2lkIGR3YzNfY29yZV9udW1fZXBzKHN0cnVjdCBkd2MzICpkd2MpCiB7CiAJc3RydWN0IGR3YzNfaHdwYXJhbXMJKnBhcm1zID0gJmR3Yy0+aHdwYXJhbXM7CkBAIC0yNzcsNiArMzczLDcgQEAKIHN0YXRpYyBpbnQgZHdjM19jb3JlX2luaXQoc3RydWN0IGR3YzMgKmR3YykKIHsKIAl1bnNpZ25lZCBsb25nCQl0aW1lb3V0OworCXUzMgkJCWh3cGFyYW1zNCA9IGR3Yy0+aHdwYXJhbXMuaHdwYXJhbXM0OwogCXUzMgkJCXJlZzsKIAlpbnQJCQlyZXQ7CiAKQEAgLTMwNiw3ICs0MDMsOSBAQAogCQljcHVfcmVsYXgoKTsKIAl9IHdoaWxlICh0cnVlKTsKIAotCWR3YzNfY29yZV9zb2Z0X3Jlc2V0KGR3Yyk7CisJcmV0ID0gZHdjM19jb3JlX3NvZnRfcmVzZXQoZHdjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjA7CiAKIAlyZWcgPSBkd2MzX3JlYWRsKGR3Yy0+cmVncywgRFdDM19HQ1RMKTsKIAlyZWcgJj0gfkRXQzNfR0NUTF9TQ0FMRURPV05fTUFTSzsKQEAgLTMxNCw3ICs0MTMsMjkgQEAKIAogCXN3aXRjaCAoRFdDM19HSFdQQVJBTVMxX0VOX1BXUk9QVChkd2MtPmh3cGFyYW1zLmh3cGFyYW1zMSkpIHsKIAljYXNlIERXQzNfR0hXUEFSQU1TMV9FTl9QV1JPUFRfQ0xLOgotCQlyZWcgJj0gfkRXQzNfR0NUTF9EU0JMQ0xLR1RORzsKKwkJLyoqCisJCSAqIFdPUktBUk9VTkQ6IERXQzMgcmV2aXNpb25zIGJldHdlZW4gMi4xMGEgYW5kIDIuNTBhIGhhdmUgYW4KKwkJICogaXNzdWUgd2hpY2ggd291bGQgY2F1c2UgeEhDSSBjb21wbGlhbmNlIHRlc3RzIHRvIGZhaWwuCisJCSAqCisJCSAqIEJlY2F1c2Ugb2YgdGhhdCB3ZSBjYW5ub3QgZW5hYmxlIGNsb2NrIGdhdGluZyBvbiBzdWNoCisJCSAqIGNvbmZpZ3VyYXRpb25zLgorCQkgKgorCQkgKiBSZWZlcnMgdG86CisJCSAqCisJCSAqIFNUQVIjOTAwMDU4ODM3NTogQ2xvY2sgR2F0aW5nLCBTT0YgSXNzdWVzIHdoZW4gcmVmX2Nsay1CYXNlZAorCQkgKiBTT0YvSVRQIE1vZGUgVXNlZAorCQkgKi8KKwkJaWYgKChkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfSE9TVCB8fAorCQkJCWR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9PVEcpICYmCisJCQkJKGR3Yy0+cmV2aXNpb24gPj0gRFdDM19SRVZJU0lPTl8yMTBBICYmCisJCQkJZHdjLT5yZXZpc2lvbiA8PSBEV0MzX1JFVklTSU9OXzI1MEEpKQorCQkJcmVnIHw9IERXQzNfR0NUTF9EU0JMQ0xLR1RORyB8IERXQzNfR0NUTF9TT0ZJVFBTWU5DOworCQllbHNlCisJCQlyZWcgJj0gfkRXQzNfR0NUTF9EU0JMQ0xLR1RORzsKKwkJYnJlYWs7CisJY2FzZSBEV0MzX0dIV1BBUkFNUzFfRU5fUFdST1BUX0hJQjoKKwkJLyogZW5hYmxlIGhpYmVybmF0aW9uIGhlcmUgKi8KKwkJZHdjLT5ucl9zY3JhdGNoID0gRFdDM19HSFdQQVJBTVM0X0hJQkVSX1NDUkFUQ0hCVUZTKGh3cGFyYW1zNCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9kYmcoZHdjLT5kZXYsICJObyBwb3dlciBvcHRpbWl6YXRpb24gYXZhaWxhYmxlXG4iKTsKQEAgLTMzMywxNiArNDU0LDM2IEBACiAKIAlkd2MzX3dyaXRlbChkd2MtPnJlZ3MsIERXQzNfR0NUTCwgcmVnKTsKIAorCXJldCA9IGR3YzNfYWxsb2Nfc2NyYXRjaF9idWZmZXJzKGR3Yyk7CisJaWYgKHJldCkKKwkJZ290byBlcnIxOworCisJcmV0ID0gZHdjM19zZXR1cF9zY3JhdGNoX2J1ZmZlcnMoZHdjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKIAlyZXR1cm4gMDsKIAorZXJyMjoKKwlkd2MzX2ZyZWVfc2NyYXRjaF9idWZmZXJzKGR3Yyk7CisKK2VycjE6CisJdXNiX3BoeV9zaHV0ZG93bihkd2MtPnVzYjJfcGh5KTsKKwl1c2JfcGh5X3NodXRkb3duKGR3Yy0+dXNiM19waHkpOworCXBoeV9leGl0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJcGh5X2V4aXQoZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKKwogZXJyMDoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBkd2MzX2NvcmVfZXhpdChzdHJ1Y3QgZHdjMyAqZHdjKQogeworCWR3YzNfZnJlZV9zY3JhdGNoX2J1ZmZlcnMoZHdjKTsKIAl1c2JfcGh5X3NodXRkb3duKGR3Yy0+dXNiMl9waHkpOwogCXVzYl9waHlfc2h1dGRvd24oZHdjLT51c2IzX3BoeSk7CisJcGh5X2V4aXQoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwlwaHlfZXhpdChkd2MtPnVzYjNfZ2VuZXJpY19waHkpOwogfQogCiAjZGVmaW5lIERXQzNfQUxJR05fTUFTSwkJKDE2IC0gMSkKQEAgLTQxMSwzMiArNTUyLDUyIEBACiAKIAlpZiAoSVNfRVJSKGR3Yy0+dXNiMl9waHkpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHdjLT51c2IyX3BoeSk7Ci0KLQkJLyoKLQkJICogaWYgLUVOWElPIGlzIHJldHVybmVkLCBpdCBtZWFucyBQSFkgbGF5ZXIgd2Fzbid0Ci0JCSAqIGVuYWJsZWQsIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJldHVybiAtRVBST0JFX0RFRkVSCi0JCSAqIGluIHRoYXQgY2FzZSwgc2luY2Ugbm8gUEhZIGRyaXZlciB3aWxsIGV2ZXIgcHJvYmUuCi0JCSAqLwotCQlpZiAocmV0ID09IC1FTlhJTykKKwkJaWYgKHJldCA9PSAtRU5YSU8gfHwgcmV0ID09IC1FTk9ERVYpIHsKKwkJCWR3Yy0+dXNiMl9waHkgPSBOVUxMOworCQl9IGVsc2UgaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CiAJCQlyZXR1cm4gcmV0OwotCi0JCWRldl9lcnIoZGV2LCAibm8gdXNiMiBwaHkgY29uZmlndXJlZFxuIik7Ci0JCXJldHVybiAtRVBST0JFX0RFRkVSOworCQl9IGVsc2UgeworCQkJZGV2X2VycihkZXYsICJubyB1c2IyIHBoeSBjb25maWd1cmVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKIAlpZiAoSVNfRVJSKGR3Yy0+dXNiM19waHkpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHdjLT51c2IzX3BoeSk7Ci0KLQkJLyoKLQkJICogaWYgLUVOWElPIGlzIHJldHVybmVkLCBpdCBtZWFucyBQSFkgbGF5ZXIgd2Fzbid0Ci0JCSAqIGVuYWJsZWQsIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJldHVybiAtRVBST0JFX0RFRkVSCi0JCSAqIGluIHRoYXQgY2FzZSwgc2luY2Ugbm8gUEhZIGRyaXZlciB3aWxsIGV2ZXIgcHJvYmUuCi0JCSAqLwotCQlpZiAocmV0ID09IC1FTlhJTykKKwkJaWYgKHJldCA9PSAtRU5YSU8gfHwgcmV0ID09IC1FTk9ERVYpIHsKKwkJCWR3Yy0+dXNiM19waHkgPSBOVUxMOworCQl9IGVsc2UgaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CiAJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCQkJZGV2X2VycihkZXYsICJubyB1c2IzIHBoeSBjb25maWd1cmVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CiAKLQkJZGV2X2VycihkZXYsICJubyB1c2IzIHBoeSBjb25maWd1cmVkXG4iKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJZHdjLT51c2IyX2dlbmVyaWNfcGh5ID0gZGV2bV9waHlfZ2V0KGRldiwgInVzYjItcGh5Iik7CisJaWYgKElTX0VSUihkd2MtPnVzYjJfZ2VuZXJpY19waHkpKSB7CisJCXJldCA9IFBUUl9FUlIoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwkJaWYgKHJldCA9PSAtRU5PU1lTIHx8IHJldCA9PSAtRU5PREVWKSB7CisJCQlkd2MtPnVzYjJfZ2VuZXJpY19waHkgPSBOVUxMOworCQl9IGVsc2UgaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CisJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCQkJZGV2X2VycihkZXYsICJubyB1c2IyIHBoeSBjb25maWd1cmVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlkd2MtPnVzYjNfZ2VuZXJpY19waHkgPSBkZXZtX3BoeV9nZXQoZGV2LCAidXNiMy1waHkiKTsKKwlpZiAoSVNfRVJSKGR3Yy0+dXNiM19nZW5lcmljX3BoeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkd2MtPnVzYjNfZ2VuZXJpY19waHkpOworCQlpZiAocmV0ID09IC1FTk9TWVMgfHwgcmV0ID09IC1FTk9ERVYpIHsKKwkJCWR3Yy0+dXNiM19nZW5lcmljX3BoeSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKKwkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIHVzYjMgcGh5IGNvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCWR3Yy0+eGhjaV9yZXNvdXJjZXNbMF0uc3RhcnQgPSByZXMtPnN0YXJ0OwpAQCAtNDc5LDYgKzY0MCwxNCBAQAogCQlnb3RvIGVycjA7CiAJfQogCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MzX0hPU1QpKQorCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9IT1NUOworCWVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MzX0dBREdFVCkpCisJCWR3Yy0+ZHJfbW9kZSA9IFVTQl9EUl9NT0RFX1BFUklQSEVSQUw7CisKKwlpZiAoZHdjLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX1VOS05PV04pCisJCWR3Yy0+ZHJfbW9kZSA9IFVTQl9EUl9NT0RFX09URzsKKwogCXJldCA9IGR3YzNfY29yZV9pbml0KGR3Yyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGNvcmVcbiIpOwpAQCAtNDg3LDIxICs2NTYsMjAgQEAKIAogCXVzYl9waHlfc2V0X3N1c3BlbmQoZHdjLT51c2IyX3BoeSwgMCk7CiAJdXNiX3BoeV9zZXRfc3VzcGVuZChkd2MtPnVzYjNfcGh5LCAwKTsKKwlyZXQgPSBwaHlfcG93ZXJfb24oZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIxOworCisJcmV0ID0gcGh5X3Bvd2VyX29uKGR3Yy0+dXNiM19nZW5lcmljX3BoeSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VzYjJwaHlfcG93ZXI7CiAKIAlyZXQgPSBkd2MzX2V2ZW50X2J1ZmZlcnNfc2V0dXAoZHdjKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgZXZlbnQgYnVmZmVyc1xuIik7Ci0JCWdvdG8gZXJyMTsKKwkJZ290byBlcnJfdXNiM3BoeV9wb3dlcjsKIAl9CiAKLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfSE9TVCkpCi0JCWR3Yy0+ZHJfbW9kZSA9IFVTQl9EUl9NT0RFX0hPU1Q7Ci0JZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfR0FER0VUKSkKLQkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfUEVSSVBIRVJBTDsKLQotCWlmIChkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfVU5LTk9XTikKLQkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfT1RHOwotCiAJc3dpdGNoIChkd2MtPmRyX21vZGUpIHsKIAljYXNlIFVTQl9EUl9NT0RFX1BFUklQSEVSQUw6CiAJCWR3YzNfc2V0X21vZGUoZHdjLCBEV0MzX0dDVExfUFJUQ0FQX0RFVklDRSk7CkBAIC01NjgsNiArNzM2LDEyIEBACiBlcnIyOgogCWR3YzNfZXZlbnRfYnVmZmVyc19jbGVhbnVwKGR3Yyk7CiAKK2Vycl91c2IzcGh5X3Bvd2VyOgorCXBoeV9wb3dlcl9vZmYoZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKKworZXJyX3VzYjJwaHlfcG93ZXI6CisJcGh5X3Bvd2VyX29mZihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCiBlcnIxOgogCXVzYl9waHlfc2V0X3N1c3BlbmQoZHdjLT51c2IyX3BoeSwgMSk7CiAJdXNiX3BoeV9zZXRfc3VzcGVuZChkd2MtPnVzYjNfcGh5LCAxKTsKQEAgLTU4NSw2ICs3NTksOCBAQAogCiAJdXNiX3BoeV9zZXRfc3VzcGVuZChkd2MtPnVzYjJfcGh5LCAxKTsKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiM19waHksIDEpOworCXBoeV9wb3dlcl9vZmYoZHdjLT51c2IyX2dlbmVyaWNfcGh5KTsKKwlwaHlfcG93ZXJfb2ZmKGR3Yy0+dXNiM19nZW5lcmljX3BoeSk7CiAKIAlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKQEAgLTY4Miw2ICs4NTgsOCBAQAogCiAJdXNiX3BoeV9zaHV0ZG93bihkd2MtPnVzYjNfcGh5KTsKIAl1c2JfcGh5X3NodXRkb3duKGR3Yy0+dXNiMl9waHkpOworCXBoeV9leGl0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisJcGh5X2V4aXQoZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKIAogCXJldHVybiAwOwogfQpAQCAtNjkwLDkgKzg2OCwxNyBAQAogewogCXN0cnVjdCBkd2MzCSpkd2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJcmV0OwogCiAJdXNiX3BoeV9pbml0KGR3Yy0+dXNiM19waHkpOwogCXVzYl9waHlfaW5pdChkd2MtPnVzYjJfcGh5KTsKKwlyZXQgPSBwaHlfaW5pdChkd2MtPnVzYjJfZ2VuZXJpY19waHkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGh5X2luaXQoZHdjLT51c2IzX2dlbmVyaWNfcGh5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdXNiMnBoeV9pbml0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmR3Yy0+bG9jaywgZmxhZ3MpOwogCkBAIC03MTYsNiArOTAyLDExIEBACiAJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKIAogCXJldHVybiAwOworCitlcnJfdXNiMnBoeV9pbml0OgorCXBoeV9leGl0KGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZHdjM19kZXZfcG1fb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmggYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaAppbmRleCBmOGFmOGQ0Li41NzMzMmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaApAQCAtMzEsMTEgKzMxLDE0IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KIAorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKwogLyogR2xvYmFsIGNvbnN0YW50cyAqLwogI2RlZmluZSBEV0MzX0VQMF9CT1VOQ0VfU0laRQk1MTIKICNkZWZpbmUgRFdDM19FTkRQT0lOVFNfTlVNCTMyCiAjZGVmaW5lIERXQzNfWEhDSV9SRVNPVVJDRVNfTlVNCTIKIAorI2RlZmluZSBEV0MzX1NDUkFUQ0hCVUZfU0laRQk0MDk2CS8qIGVhY2ggYnVmZmVyIGlzIGFzc3VtZWQgdG8gYmUgNEtpQiAqLwogI2RlZmluZSBEV0MzX0VWRU5UX1NJWkUJCTQJLyogYnl0ZXMgKi8KICNkZWZpbmUgRFdDM19FVkVOVF9NQVhfTlVNCTY0CS8qIDIgZXZlbnRzL2VuZHBvaW50ICovCiAjZGVmaW5lIERXQzNfRVZFTlRfQlVGRkVSU19TSVpFCShEV0MzX0VWRU5UX1NJWkUgKiBEV0MzX0VWRU5UX01BWF9OVU0pCkBAIC0xNTcsNiArMTYwLDcgQEAKICNkZWZpbmUgRFdDM19HQ1RMX1BSVENBUF9PVEcJMwogCiAjZGVmaW5lIERXQzNfR0NUTF9DT1JFU09GVFJFU0VUCQkoMSA8PCAxMSkKKyNkZWZpbmUgRFdDM19HQ1RMX1NPRklUUFNZTkMJCSgxIDw8IDEwKQogI2RlZmluZSBEV0MzX0dDVExfU0NBTEVET1dOKG4pCQkoKG4pIDw8IDQpCiAjZGVmaW5lIERXQzNfR0NUTF9TQ0FMRURPV05fTUFTSwlEV0MzX0dDVExfU0NBTEVET1dOKDMpCiAjZGVmaW5lIERXQzNfR0NUTF9ESVNTQ1JBTUJMRQkJKDEgPDwgMykKQEAgLTMxOCw3ICszMjIsNyBAQAogLyogRGV2aWNlIEVuZHBvaW50IENvbW1hbmQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgRFdDM19ERVBDTURfUEFSQU1fU0hJRlQJCTE2CiAjZGVmaW5lIERXQzNfREVQQ01EX1BBUkFNKHgpCQkoKHgpIDw8IERXQzNfREVQQ01EX1BBUkFNX1NISUZUKQotI2RlZmluZSBEV0MzX0RFUENNRF9HRVRfUlNDX0lEWCh4KSAgICAgKCgoeCkgPj4gRFdDM19ERVBDTURfUEFSQU1fU0hJRlQpICYgMHg3ZikKKyNkZWZpbmUgRFdDM19ERVBDTURfR0VUX1JTQ19JRFgoeCkJKCgoeCkgPj4gRFdDM19ERVBDTURfUEFSQU1fU0hJRlQpICYgMHg3ZikKICNkZWZpbmUgRFdDM19ERVBDTURfU1RBVFVTKHgpCQkoKCh4KSA+PiAxNSkgJiAxKQogI2RlZmluZSBEV0MzX0RFUENNRF9ISVBSSV9GT1JDRVJNCSgxIDw8IDExKQogI2RlZmluZSBEV0MzX0RFUENNRF9DTURBQ1QJCSgxIDw8IDEwKQpAQCAtMzkzLDYgKzM5Nyw3IEBACiAgKiBAYnVzeV9zbG90OiBmaXJzdCBzbG90IHdoaWNoIGlzIG93bmVkIGJ5IEhXCiAgKiBAZGVzYzogdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgcG9pbnRlcgogICogQGR3YzogcG9pbnRlciB0byBEV0MgY29udHJvbGxlcgorICogQHNhdmVkX3N0YXRlOiBlcCBzdGF0ZSBzYXZlZCBkdXJpbmcgaGliZXJuYXRpb24KICAqIEBmbGFnczogZW5kcG9pbnQgZmxhZ3MgKHdlZGdlZCwgc3RhbGxlZCwgLi4uKQogICogQGN1cnJlbnRfdHJiOiBpbmRleCBvZiBjdXJyZW50IHVzZWQgdHJiCiAgKiBAbnVtYmVyOiBlbmRwb2ludCBudW1iZXIgKDEgLSAxNSkKQEAgLTQxNSw2ICs0MjAsNyBAQAogCWNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yICpjb21wX2Rlc2M7CiAJc3RydWN0IGR3YzMJCSpkd2M7CiAKKwl1MzIJCQlzYXZlZF9zdGF0ZTsKIAl1bnNpZ25lZAkJZmxhZ3M7CiAjZGVmaW5lIERXQzNfRVBfRU5BQkxFRAkJKDEgPDwgMCkKICNkZWZpbmUgRFdDM19FUF9TVEFMTAkJKDEgPDwgMSkKQEAgLTU5OCw2ICs2MDQsNyBAQAogICogQGVwMF90cmI6IGRtYSBhZGRyZXNzIG9mIGVwMF90cmIKICAqIEBlcDBfdXNiX3JlcTogZHVtbXkgcmVxIHVzZWQgd2hpbGUgaGFuZGxpbmcgU1REIFVTQiByZXF1ZXN0cwogICogQGVwMF9ib3VuY2VfYWRkcjogZG1hIGFkZHJlc3Mgb2YgZXAwX2JvdW5jZQorICogQHNjcmF0Y2hfYWRkcjogZG1hIGFkZHJlc3Mgb2Ygc2NyYXRjaGJ1ZgogICogQGxvY2s6IGZvciBzeW5jaHJvbml6aW5nCiAgKiBAZGV2OiBwb2ludGVyIHRvIG91ciBzdHJ1Y3QgZGV2aWNlCiAgKiBAeGhjaTogcG9pbnRlciB0byBvdXIgeEhDSSBjaGlsZApAQCAtNjA2LDYgKzYxMyw3IEBACiAgKiBAZ2FkZ2V0X2RyaXZlcjogcG9pbnRlciB0byB0aGUgZ2FkZ2V0IGRyaXZlcgogICogQHJlZ3M6IGJhc2UgYWRkcmVzcyBmb3Igb3VyIHJlZ2lzdGVycwogICogQHJlZ3Nfc2l6ZTogYWRkcmVzcyBzcGFjZSBzaXplCisgKiBAbnJfc2NyYXRjaDogbnVtYmVyIG9mIHNjcmF0Y2ggYnVmZmVycwogICogQG51bV9ldmVudF9idWZmZXJzOiBjYWxjdWxhdGVkIG51bWJlciBvZiBldmVudCBidWZmZXJzCiAgKiBAdTF1Mjogb25seSB1c2VkIG9uIHJldmlzaW9ucyA8MS44M2EgZm9yIHdvcmthcm91bmQKICAqIEBtYXhpbXVtX3NwZWVkOiBtYXhpbXVtIHNwZWVkIHJlcXVlc3RlZCAobWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzKQpAQCAtNjEzLDE2ICs2MjEsMTAgQEAKICAqIEBkcl9tb2RlOiByZXF1ZXN0ZWQgbW9kZSBvZiBvcGVyYXRpb24KICAqIEB1c2IyX3BoeTogcG9pbnRlciB0byBVU0IyIFBIWQogICogQHVzYjNfcGh5OiBwb2ludGVyIHRvIFVTQjMgUEhZCisgKiBAdXNiMl9nZW5lcmljX3BoeTogcG9pbnRlciB0byBVU0IyIFBIWQorICogQHVzYjNfZ2VuZXJpY19waHk6IHBvaW50ZXIgdG8gVVNCMyBQSFkKICAqIEBkY2ZnOiBzYXZlZCBjb250ZW50cyBvZiBEQ0ZHIHJlZ2lzdGVyCiAgKiBAZ2N0bDogc2F2ZWQgY29udGVudHMgb2YgR0NUTCByZWdpc3RlcgotICogQGlzX3NlbGZwb3dlcmVkOiB0cnVlIHdoZW4gd2UgYXJlIHNlbGZwb3dlcmVkCi0gKiBAdGhyZWVfc3RhZ2Vfc2V0dXA6IHNldCBpZiB3ZSBwZXJmb3JtIGEgdGhyZWUgcGhhc2Ugc2V0dXAKLSAqIEBlcDBfYm91bmNlZDogdHJ1ZSB3aGVuIHdlIHVzZWQgYm91bmNlIGJ1ZmZlcgotICogQGVwMF9leHBlY3RfaW46IHRydWUgd2hlbiB3ZSBleHBlY3QgYSBEQVRBIElOIHRyYW5zZmVyCi0gKiBAc3RhcnRfY29uZmlnX2lzc3VlZDogdHJ1ZSB3aGVuIFN0YXJ0Q29uZmlnIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkCi0gKiBAc2V0dXBfcGFja2V0X3BlbmRpbmc6IHRydWUgd2hlbiB0aGVyZSdzIGEgU2V0dXAgUGFja2V0IGluIEZJRk8uIFdvcmthcm91bmQKLSAqIEBuZWVkc19maWZvX3Jlc2l6ZTogbm90IGFsbCB1c2VycyBtaWdodCB3YW50IGZpZm8gcmVzaXppbmcsIGZsYWcgaXQKLSAqIEByZXNpemVfZmlmb3M6IHRlbGxzIHVzIGl0J3Mgb2sgdG8gcmVjb25maWd1cmUgb3VyIFR4RklGTyBzaXplcy4KICAqIEBpc29jaF9kZWxheTogd1ZhbHVlIGZyb20gU2V0IElzb2Nocm9ub3VzIERlbGF5IHJlcXVlc3Q7CiAgKiBAdTJzZWw6IHBhcmFtZXRlciBmcm9tIFNldCBTRUwgcmVxdWVzdC4KICAqIEB1MnBlbDogcGFyYW1ldGVyIGZyb20gU2V0IFNFTCByZXF1ZXN0LgpAQCAtNjM3LDE1ICs2MzksMzEgQEAKICAqIEBtZW06IHBvaW50cyB0byBzdGFydCBvZiBtZW1vcnkgd2hpY2ggaXMgdXNlZCBmb3IgdGhpcyBzdHJ1Y3QuCiAgKiBAaHdwYXJhbXM6IGNvcHkgb2YgaHdwYXJhbXMgcmVnaXN0ZXJzCiAgKiBAcm9vdDogZGVidWdmcyByb290IGZvbGRlciBwb2ludGVyCisgKiBAcmVnc2V0OiBkZWJ1Z2ZzIHBvaW50ZXIgdG8gcmVnZHVtcCBmaWxlCisgKiBAdGVzdF9tb2RlOiB0cnVlIHdoZW4gd2UncmUgZW50ZXJpbmcgYSBVU0IgdGVzdCBtb2RlCisgKiBAdGVzdF9tb2RlX25yOiB0ZXN0IGZlYXR1cmUgc2VsZWN0b3IKKyAqIEBkZWxheWVkX3N0YXR1czogdHJ1ZSB3aGVuIGdhZGdldCBkcml2ZXIgYXNrcyBmb3IgZGVsYXllZCBzdGF0dXMKKyAqIEBlcDBfYm91bmNlZDogdHJ1ZSB3aGVuIHdlIHVzZWQgYm91bmNlIGJ1ZmZlcgorICogQGVwMF9leHBlY3RfaW46IHRydWUgd2hlbiB3ZSBleHBlY3QgYSBEQVRBIElOIHRyYW5zZmVyCisgKiBAaGFzX2hpYmVybmF0aW9uOiB0cnVlIHdoZW4gZHdjMyB3YXMgY29uZmlndXJlZCB3aXRoIEhpYmVybmF0aW9uCisgKiBAaXNfc2VsZnBvd2VyZWQ6IHRydWUgd2hlbiB3ZSBhcmUgc2VsZnBvd2VyZWQKKyAqIEBuZWVkc19maWZvX3Jlc2l6ZTogbm90IGFsbCB1c2VycyBtaWdodCB3YW50IGZpZm8gcmVzaXppbmcsIGZsYWcgaXQKKyAqIEBwdWxsdXBzX2Nvbm5lY3RlZDogdHJ1ZSB3aGVuIFJ1bi9TdG9wIGJpdCBpcyBzZXQKKyAqIEByZXNpemVfZmlmb3M6IHRlbGxzIHVzIGl0J3Mgb2sgdG8gcmVjb25maWd1cmUgb3VyIFR4RklGTyBzaXplcy4KKyAqIEBzZXR1cF9wYWNrZXRfcGVuZGluZzogdHJ1ZSB3aGVuIHRoZXJlJ3MgYSBTZXR1cCBQYWNrZXQgaW4gRklGTy4gV29ya2Fyb3VuZAorICogQHN0YXJ0X2NvbmZpZ19pc3N1ZWQ6IHRydWUgd2hlbiBTdGFydENvbmZpZyBjb21tYW5kIGhhcyBiZWVuIGlzc3VlZAorICogQHRocmVlX3N0YWdlX3NldHVwOiBzZXQgaWYgd2UgcGVyZm9ybSBhIHRocmVlIHBoYXNlIHNldHVwCiAgKi8KIHN0cnVjdCBkd2MzIHsKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CSpjdHJsX3JlcTsKIAlzdHJ1Y3QgZHdjM190cmIJCSplcDBfdHJiOwogCXZvaWQJCQkqZXAwX2JvdW5jZTsKKwl2b2lkCQkJKnNjcmF0Y2hidWY7CiAJdTgJCQkqc2V0dXBfYnVmOwogCWRtYV9hZGRyX3QJCWN0cmxfcmVxX2FkZHI7CiAJZG1hX2FkZHJfdAkJZXAwX3RyYl9hZGRyOwogCWRtYV9hZGRyX3QJCWVwMF9ib3VuY2VfYWRkcjsKKwlkbWFfYWRkcl90CQlzY3JhdGNoX2FkZHI7CiAJc3RydWN0IGR3YzNfcmVxdWVzdAllcDBfdXNiX3JlcTsKIAogCS8qIGRldmljZSBsb2NrICovCkBAIC02NjUsNiArNjgzLDkgQEAKIAlzdHJ1Y3QgdXNiX3BoeQkJKnVzYjJfcGh5OwogCXN0cnVjdCB1c2JfcGh5CQkqdXNiM19waHk7CiAKKwlzdHJ1Y3QgcGh5CQkqdXNiMl9nZW5lcmljX3BoeTsKKwlzdHJ1Y3QgcGh5CQkqdXNiM19nZW5lcmljX3BoeTsKKwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJc2l6ZV90CQkJcmVnc19zaXplOwogCkBAIC02NzQsNiArNjk1LDcgQEAKIAl1MzIJCQlkY2ZnOwogCXUzMgkJCWdjdGw7CiAKKwl1MzIJCQlucl9zY3JhdGNoOwogCXUzMgkJCW51bV9ldmVudF9idWZmZXJzOwogCXUzMgkJCXUxdTI7CiAJdTMyCQkJbWF4aW11bV9zcGVlZDsKQEAgLTY5NSwxNyArNzE3LDkgQEAKICNkZWZpbmUgRFdDM19SRVZJU0lPTl8yMzBBCTB4NTUzMzIzMGEKICNkZWZpbmUgRFdDM19SRVZJU0lPTl8yNDBBCTB4NTUzMzI0MGEKICNkZWZpbmUgRFdDM19SRVZJU0lPTl8yNTBBCTB4NTUzMzI1MGEKLQotCXVuc2lnbmVkCQlpc19zZWxmcG93ZXJlZDoxOwotCXVuc2lnbmVkCQl0aHJlZV9zdGFnZV9zZXR1cDoxOwotCXVuc2lnbmVkCQllcDBfYm91bmNlZDoxOwotCXVuc2lnbmVkCQllcDBfZXhwZWN0X2luOjE7Ci0JdW5zaWduZWQJCXN0YXJ0X2NvbmZpZ19pc3N1ZWQ6MTsKLQl1bnNpZ25lZAkJc2V0dXBfcGFja2V0X3BlbmRpbmc6MTsKLQl1bnNpZ25lZAkJZGVsYXllZF9zdGF0dXM6MTsKLQl1bnNpZ25lZAkJbmVlZHNfZmlmb19yZXNpemU6MTsKLQl1bnNpZ25lZAkJcmVzaXplX2ZpZm9zOjE7Ci0JdW5zaWduZWQJCXB1bGx1cHNfY29ubmVjdGVkOjE7CisjZGVmaW5lIERXQzNfUkVWSVNJT05fMjYwQQkweDU1MzMyNjBhCisjZGVmaW5lIERXQzNfUkVWSVNJT05fMjcwQQkweDU1MzMyNzBhCisjZGVmaW5lIERXQzNfUkVWSVNJT05fMjgwQQkweDU1MzMyODBhCiAKIAllbnVtIGR3YzNfZXAwX25leHQJZXAwX25leHRfZXZlbnQ7CiAJZW51bSBkd2MzX2VwMF9zdGF0ZQllcDBzdGF0ZTsKQEAgLTczMCw2ICs3NDQsMTggQEAKIAogCXU4CQkJdGVzdF9tb2RlOwogCXU4CQkJdGVzdF9tb2RlX25yOworCisJdW5zaWduZWQJCWRlbGF5ZWRfc3RhdHVzOjE7CisJdW5zaWduZWQJCWVwMF9ib3VuY2VkOjE7CisJdW5zaWduZWQJCWVwMF9leHBlY3RfaW46MTsKKwl1bnNpZ25lZAkJaGFzX2hpYmVybmF0aW9uOjE7CisJdW5zaWduZWQJCWlzX3NlbGZwb3dlcmVkOjE7CisJdW5zaWduZWQJCW5lZWRzX2ZpZm9fcmVzaXplOjE7CisJdW5zaWduZWQJCXB1bGx1cHNfY29ubmVjdGVkOjE7CisJdW5zaWduZWQJCXJlc2l6ZV9maWZvczoxOworCXVuc2lnbmVkCQlzZXR1cF9wYWNrZXRfcGVuZGluZzoxOworCXVuc2lnbmVkCQlzdGFydF9jb25maWdfaXNzdWVkOjE7CisJdW5zaWduZWQJCXRocmVlX3N0YWdlX3NldHVwOjE7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODE1LDE1ICs4NDEsMTUgQEAKICAqCTEyCS0gVm5kckRldlRzdFJjdmVkCiAgKiBAcmVzZXJ2ZWQxNV8xMjogUmVzZXJ2ZWQsIG5vdCB1c2VkCiAgKiBAZXZlbnRfaW5mbzogSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBldmVudAotICogQHJlc2VydmVkMzFfMjQ6IFJlc2VydmVkLCBub3QgdXNlZAorICogQHJlc2VydmVkMzFfMjU6IFJlc2VydmVkLCBub3QgdXNlZAogICovCiBzdHJ1Y3QgZHdjM19ldmVudF9kZXZ0IHsKIAl1MzIJb25lX2JpdDoxOwogCXUzMglkZXZpY2VfZXZlbnQ6NzsKIAl1MzIJdHlwZTo0OwogCXUzMglyZXNlcnZlZDE1XzEyOjQ7Ci0JdTMyCWV2ZW50X2luZm86ODsKLQl1MzIJcmVzZXJ2ZWQzMV8yNDo4OworCXUzMglldmVudF9pbmZvOjk7CisJdTMyCXJlc2VydmVkMzFfMjU6NzsKIH0gX19wYWNrZWQ7CiAKIC8qKgpAQCAtODU2LDYgKzg4MiwxOSBAQAogCXN0cnVjdCBkd2MzX2V2ZW50X2dldnQJCWdldnQ7CiB9OwogCisvKioKKyAqIHN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zIC0gcmVwcmVzZW50YXRpb24gb2YgZW5kcG9pbnQgY29tbWFuZAorICogcGFyYW1ldGVycworICogQHBhcmFtMjogdGhpcmQgcGFyYW1ldGVyCisgKiBAcGFyYW0xOiBzZWNvbmQgcGFyYW1ldGVyCisgKiBAcGFyYW0wOiBmaXJzdCBwYXJhbWV0ZXIKKyAqLworc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgeworCXUzMglwYXJhbTI7CisJdTMyCXBhcmFtMTsKKwl1MzIJcGFyYW0wOworfTsKKwogLyoKICAqIERXQzMgRmVhdHVyZXMgdG8gYmUgdXNlZCBhcyBEcml2ZXIgRGF0YQogICovCkBAIC04ODEsMTEgKzkyMCwzMSBAQAogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MzX0dBREdFVCkgfHwgSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfRFVBTF9ST0xFKQogaW50IGR3YzNfZ2FkZ2V0X2luaXQoc3RydWN0IGR3YzMgKmR3Yyk7CiB2b2lkIGR3YzNfZ2FkZ2V0X2V4aXQoc3RydWN0IGR3YzMgKmR3Yyk7CitpbnQgZHdjM19nYWRnZXRfc2V0X3Rlc3RfbW9kZShzdHJ1Y3QgZHdjMyAqZHdjLCBpbnQgbW9kZSk7CitpbnQgZHdjM19nYWRnZXRfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGR3YzMgKmR3Yyk7CitpbnQgZHdjM19nYWRnZXRfc2V0X2xpbmtfc3RhdGUoc3RydWN0IGR3YzMgKmR3YywgZW51bSBkd2MzX2xpbmtfc3RhdGUgc3RhdGUpOworaW50IGR3YzNfc2VuZF9nYWRnZXRfZXBfY21kKHN0cnVjdCBkd2MzICpkd2MsIHVuc2lnbmVkIGVwLAorCQl1bnNpZ25lZCBjbWQsIHN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zICpwYXJhbXMpOworaW50IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKHN0cnVjdCBkd2MzICpkd2MsIGludCBjbWQsIHUzMiBwYXJhbSk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgZHdjM19nYWRnZXRfaW5pdChzdHJ1Y3QgZHdjMyAqZHdjKQogeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIGR3YzNfZ2FkZ2V0X2V4aXQoc3RydWN0IGR3YzMgKmR3YykKIHsgfQorc3RhdGljIGlubGluZSBpbnQgZHdjM19nYWRnZXRfc2V0X3Rlc3RfbW9kZShzdHJ1Y3QgZHdjMyAqZHdjLCBpbnQgbW9kZSkKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGR3YzNfZ2FkZ2V0X2dldF9saW5rX3N0YXRlKHN0cnVjdCBkd2MzICpkd2MpCit7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkd2MzX2dhZGdldF9zZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHdjMyAqZHdjLAorCQllbnVtIGR3YzNfbGlua19zdGF0ZSBzdGF0ZSkKK3sgcmV0dXJuIDA7IH0KKworc3RhdGljIGlubGluZSBpbnQgZHdjM19zZW5kX2dhZGdldF9lcF9jbWQoc3RydWN0IGR3YzMgKmR3YywgdW5zaWduZWQgZXAsCisJCXVuc2lnbmVkIGNtZCwgc3RydWN0IGR3YzNfZ2FkZ2V0X2VwX2NtZF9wYXJhbXMgKnBhcmFtcykKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGR3YzNfc2VuZF9nYWRnZXRfZ2VuZXJpY19jb21tYW5kKHN0cnVjdCBkd2MzICpkd2MsCisJCWludCBjbWQsIHUzMiBwYXJhbSkKK3sgcmV0dXJuIDA7IH0KICNlbmRpZgogCiAvKiBwb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9tYXAuYyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vbWFwLmMKaW5kZXggYjI2OWRiZC4uMTE2MGZmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9tYXAuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb21hcC5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi9vZl9leHRjb24uaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KQEAgLTQyNCwxMSArNDIzLDYgQEAKIAl9CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoZGV2LCAibWlzc2luZyBtZW1vcnkgYmFzZSByZXNvdXJjZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwogCWlmIChJU19FUlIoYmFzZSkpCiAJCXJldHVybiBQVFJfRVJSKGJhc2UpOwpAQCAtNTIyLDcgKzUxNiw3IEBACiAJZHdjM19vbWFwX2VuYWJsZV9pcnFzKG9tYXApOwogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCAiZXh0Y29uIikpIHsKLQkJZWRldiA9IG9mX2V4dGNvbl9nZXRfZXh0Y29uX2RldihkZXYsIDApOworCQllZGV2ID0gZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUoZGV2LCAwKTsKIAkJaWYgKElTX0VSUihlZGV2KSkgewogCQkJZGV2X3ZkYmcoZGV2LCAiY291bGRuJ3QgZ2V0IGV4dGNvbiBkZXZpY2VcbiIpOwogCQkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCmluZGV4IDJkYTBhNWEuLmE3NDBlYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYwpAQCAtNjgsNiArNjgsMjIgQEAKIH0KIAogLyoqCisgKiBkd2MzX2dhZGdldF9nZXRfbGlua19zdGF0ZSAtIEdldHMgY3VycmVudCBzdGF0ZSBvZiBVU0IgTGluaworICogQGR3YzogcG9pbnRlciB0byBvdXIgY29udGV4dCBzdHJ1Y3R1cmUKKyAqCisgKiBDYWxsZXIgc2hvdWxkIHRha2UgY2FyZSBvZiBsb2NraW5nLiBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAqIHJldHVybiB0aGUgbGluayBzdGF0ZSBvbiBzdWNjZXNzICg+PSAwKSBvciAtRVRJTUVET1VULgorICovCitpbnQgZHdjM19nYWRnZXRfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGR3YzMgKmR3YykKK3sKKwl1MzIJCXJlZzsKKworCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0RTVFMpOworCisJcmV0dXJuIERXQzNfRFNUU19VU0JMTktTVChyZWcpOworfQorCisvKioKICAqIGR3YzNfZ2FkZ2V0X3NldF9saW5rX3N0YXRlIC0gU2V0cyBVU0IgTGluayB0byBhIHBhcnRpY3VsYXIgU3RhdGUKICAqIEBkd2M6IHBvaW50ZXIgdG8gb3VyIGNvbnRleHQgc3RydWN0dXJlCiAgKiBAc3RhdGU6IHRoZSBzdGF0ZSB0byBwdXQgbGluayBpbnRvCkBAIC00MTcsNyArNDMzLDcgQEAKIHN0YXRpYyBpbnQgZHdjM19nYWRnZXRfc2V0X2VwX2NvbmZpZyhzdHJ1Y3QgZHdjMyAqZHdjLCBzdHJ1Y3QgZHdjM19lcCAqZGVwLAogCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MsCiAJCWNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yICpjb21wX2Rlc2MsCi0JCWJvb2wgaWdub3JlKQorCQlib29sIGlnbm9yZSwgYm9vbCByZXN0b3JlKQogewogCXN0cnVjdCBkd2MzX2dhZGdldF9lcF9jbWRfcGFyYW1zIHBhcmFtczsKIApAQCAtNDM2LDYgKzQ1MiwxMSBAQAogCWlmIChpZ25vcmUpCiAJCXBhcmFtcy5wYXJhbTAgfD0gRFdDM19ERVBDRkdfSUdOX1NFUV9OVU07CiAKKwlpZiAocmVzdG9yZSkgeworCQlwYXJhbXMucGFyYW0wIHw9IERXQzNfREVQQ0ZHX0FDVElPTl9SRVNUT1JFOworCQlwYXJhbXMucGFyYW0yIHw9IGRlcC0+c2F2ZWRfc3RhdGU7CisJfQorCiAJcGFyYW1zLnBhcmFtMSA9IERXQzNfREVQQ0ZHX1hGRVJfQ09NUExFVEVfRU4KIAkJfCBEV0MzX0RFUENGR19YRkVSX05PVF9SRUFEWV9FTjsKIApAQCAtNDk0LDcgKzUxNSw3IEBACiBzdGF0aWMgaW50IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKHN0cnVjdCBkd2MzX2VwICpkZXAsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYywKIAkJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmNvbXBfZGVzYywKLQkJYm9vbCBpZ25vcmUpCisJCWJvb2wgaWdub3JlLCBib29sIHJlc3RvcmUpCiB7CiAJc3RydWN0IGR3YzMJCSpkd2MgPSBkZXAtPmR3YzsKIAl1MzIJCQlyZWc7CkBAIC01MDgsNyArNTI5LDggQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gZHdjM19nYWRnZXRfc2V0X2VwX2NvbmZpZyhkd2MsIGRlcCwgZGVzYywgY29tcF9kZXNjLCBpZ25vcmUpOworCXJldCA9IGR3YzNfZ2FkZ2V0X3NldF9lcF9jb25maWcoZHdjLCBkZXAsIGRlc2MsIGNvbXBfZGVzYywgaWdub3JlLAorCQkJcmVzdG9yZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNTQ4LDEzICs1NzAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHdjM19zdG9wX2FjdGl2ZV90cmFuc2ZlcihzdHJ1Y3QgZHdjMyAqZHdjLCB1MzIgZXBudW0pOworc3RhdGljIHZvaWQgZHdjM19zdG9wX2FjdGl2ZV90cmFuc2ZlcihzdHJ1Y3QgZHdjMyAqZHdjLCB1MzIgZXBudW0sIGJvb2wgZm9yY2UpOwogc3RhdGljIHZvaWQgZHdjM19yZW1vdmVfcmVxdWVzdHMoc3RydWN0IGR3YzMgKmR3Yywgc3RydWN0IGR3YzNfZXAgKmRlcCkKIHsKIAlzdHJ1Y3QgZHdjM19yZXF1ZXN0CQkqcmVxOwogCiAJaWYgKCFsaXN0X2VtcHR5KCZkZXAtPnJlcV9xdWV1ZWQpKSB7Ci0JCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlcik7CisJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlciwgdHJ1ZSk7CiAKIAkJLyogLSBnaXZlYmFjayBhbGwgcmVxdWVzdHMgdG8gZ2FkZ2V0IGRyaXZlciAqLwogCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRlcC0+cmVxX3F1ZXVlZCkpIHsKQEAgLTY1OSw3ICs2ODEsNyBAQAogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkd2MtPmxvY2ssIGZsYWdzKTsKLQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsIGRlc2MsIGVwLT5jb21wX2Rlc2MsIGZhbHNlKTsKKwlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsIGRlc2MsIGVwLT5jb21wX2Rlc2MsIGZhbHNlLCBmYWxzZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzcxLDkgKzc5Myw2IEBACiAJCQl0cmItPmN0cmwgPSBEV0MzX1RSQkNUTF9JU09DSFJPTk9VU19GSVJTVDsKIAkJZWxzZQogCQkJdHJiLT5jdHJsID0gRFdDM19UUkJDVExfSVNPQ0hST05PVVM7Ci0KLQkJaWYgKCFyZXEtPnJlcXVlc3Qubm9faW50ZXJydXB0ICYmICFjaGFpbikKLQkJCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0lPQzsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CkBAIC03ODgsNiArODA3LDkgQEAKIAkJQlVHKCk7CiAJfQogCisJaWYgKCFyZXEtPnJlcXVlc3Qubm9faW50ZXJydXB0ICYmICFjaGFpbikKKwkJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfSU9DOworCiAJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSkgewogCQl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9JU1BfSU1JOwogCQl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9DU1A7CkBAIC0xMDc3LDcgKzEwOTksNyBAQAogCQkgKi8KIAkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSkgewogCQkJaWYgKGxpc3RfZW1wdHkoJmRlcC0+cmVxX3F1ZXVlZCkpIHsKLQkJCQlkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKGR3YywgZGVwLT5udW1iZXIpOworCQkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlciwgdHJ1ZSk7CiAJCQkJZGVwLT5mbGFncyA9IERXQzNfRVBfRU5BQkxFRDsKIAkJCX0KIAkJCXJldHVybiAwOwpAQCAtMTEwNyw2ICsxMTI5LDIzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJLyoKKwkgKiA0LiBTdHJlYW0gQ2FwYWJsZSBCdWxrIEVuZHBvaW50cy4gV2UgbmVlZCB0byBzdGFydCB0aGUgdHJhbnNmZXIKKwkgKiByaWdodCBhd2F5LCBvdGhlcndpc2UgaG9zdCB3aWxsIG5vdCBrbm93IHdlIGhhdmUgc3RyZWFtcyB0byBiZQorCSAqIGhhbmRsZWQuCisJICovCisJaWYgKGRlcC0+c3RyZWFtX2NhcGFibGUpIHsKKwkJaW50CXJldDsKKworCQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2tpY2tfdHJhbnNmZXIoZGVwLCAwLCB0cnVlKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVCVVNZKSB7CisJCQlzdHJ1Y3QgZHdjMwkqZHdjID0gZGVwLT5kd2M7CisKKwkJCWRldl9kYmcoZHdjLT5kZXYsICIlczogZmFpbGVkIHRvIGtpY2sgdHJhbnNmZXJzXG4iLAorCQkJCQlkZXAtPm5hbWUpOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNjMsNyArMTIwMiw3IEBACiAJCX0KIAkJaWYgKHIgPT0gcmVxKSB7CiAJCQkvKiB3YWl0IHVudGlsIGl0IGlzIHByb2Nlc3NlZCAqLwotCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyKTsKKwkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlciwgdHJ1ZSk7CiAJCQlnb3RvIG91dDE7CiAJCX0KIAkJZGV2X2Vycihkd2MtPmRldiwgInJlcXVlc3QgJXAgd2FzIG5vdCBxdWV1ZWQgdG8gJXNcbiIsCkBAIC0xMTk0LDggKzEyMzMsNyBAQAogCQlyZXQgPSBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZChkd2MsIGRlcC0+bnVtYmVyLAogCQkJRFdDM19ERVBDTURfU0VUU1RBTEwsICZwYXJhbXMpOwogCQlpZiAocmV0KQotCQkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byAlcyBTVEFMTCBvbiAlc1xuIiwKLQkJCQkJdmFsdWUgPyAic2V0IiA6ICJjbGVhciIsCisJCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBTVEFMTCBvbiAlc1xuIiwKIAkJCQkJZGVwLT5uYW1lKTsKIAkJZWxzZQogCQkJZGVwLT5mbGFncyB8PSBEV0MzX0VQX1NUQUxMOwpAQCAtMTIwMyw4ICsxMjQxLDcgQEAKIAkJcmV0ID0gZHdjM19zZW5kX2dhZGdldF9lcF9jbWQoZHdjLCBkZXAtPm51bWJlciwKIAkJCURXQzNfREVQQ01EX0NMRUFSU1RBTEwsICZwYXJhbXMpOwogCQlpZiAocmV0KQotCQkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byAlcyBTVEFMTCBvbiAlc1xuIiwKLQkJCQkJdmFsdWUgPyAic2V0IiA6ICJjbGVhciIsCisJCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvIGNsZWFyIFNUQUxMIG9uICVzXG4iLAogCQkJCQlkZXAtPm5hbWUpOwogCQllbHNlCiAJCQlkZXAtPmZsYWdzICY9IH4oRFdDM19FUF9TVEFMTCB8IERXQzNfRVBfV0VER0UpOwpAQCAtMTM4Nyw3ICsxNDI0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkd2MzX2dhZGdldF9ydW5fc3RvcChzdHJ1Y3QgZHdjMyAqZHdjLCBpbnQgaXNfb24pCitzdGF0aWMgaW50IGR3YzNfZ2FkZ2V0X3J1bl9zdG9wKHN0cnVjdCBkd2MzICpkd2MsIGludCBpc19vbiwgaW50IHN1c3BlbmQpCiB7CiAJdTMyCQkJcmVnOwogCXUzMgkJCXRpbWVvdXQgPSA1MDA7CkBAIC0xNDAyLDkgKzE0MzksMTcgQEAKIAkJaWYgKGR3Yy0+cmV2aXNpb24gPj0gRFdDM19SRVZJU0lPTl8xOTRBKQogCQkJcmVnICY9IH5EV0MzX0RDVExfS0VFUF9DT05ORUNUOwogCQlyZWcgfD0gRFdDM19EQ1RMX1JVTl9TVE9QOworCisJCWlmIChkd2MtPmhhc19oaWJlcm5hdGlvbikKKwkJCXJlZyB8PSBEV0MzX0RDVExfS0VFUF9DT05ORUNUOworCiAJCWR3Yy0+cHVsbHVwc19jb25uZWN0ZWQgPSB0cnVlOwogCX0gZWxzZSB7CiAJCXJlZyAmPSB+RFdDM19EQ1RMX1JVTl9TVE9QOworCisJCWlmIChkd2MtPmhhc19oaWJlcm5hdGlvbiAmJiAhc3VzcGVuZCkKKwkJCXJlZyAmPSB+RFdDM19EQ1RMX0tFRVBfQ09OTkVDVDsKKwogCQlkd2MtPnB1bGx1cHNfY29ubmVjdGVkID0gZmFsc2U7CiAJfQogCkBAIC0xNDQyLDcgKzE0ODcsNyBAQAogCWlzX29uID0gISFpc19vbjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkd2MtPmxvY2ssIGZsYWdzKTsKLQlyZXQgPSBkd2MzX2dhZGdldF9ydW5fc3RvcChkd2MsIGlzX29uKTsKKwlyZXQgPSBkd2MzX2dhZGdldF9ydW5fc3RvcChkd2MsIGlzX29uLCBmYWxzZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTU0OSwxNCArMTU5NCwxNiBAQAogCWR3YzNfZ2FkZ2V0X2VwMF9kZXNjLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoNTEyKTsKIAogCWRlcCA9IGR3Yy0+ZXBzWzBdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIGZhbHNlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBlbmFibGUgJXNcbiIsIGRlcC0+bmFtZSk7CiAJCWdvdG8gZXJyMjsKIAl9CiAKIAlkZXAgPSBkd2MtPmVwc1sxXTsKLQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgZmFsc2UpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSwKKwkJCWZhbHNlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlICVzXG4iLCBkZXAtPm5hbWUpOwogCQlnb3RvIGVycjM7CkBAIC0xODQ5LDE1ICsxODk2LDEyIEBACiAJCQkgKi8KIAkJCWRlcC0+ZmxhZ3MgPSBEV0MzX0VQX1BFTkRJTkdfUkVRVUVTVDsKIAkJfSBlbHNlIHsKLQkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlcik7CisJCQlkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKGR3YywgZGVwLT5udW1iZXIsIHRydWUpOwogCQkJZGVwLT5mbGFncyA9IERXQzNfRVBfRU5BQkxFRDsKIAkJfQogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAoKGV2ZW50LT5zdGF0dXMgJiBERVBFVlRfU1RBVFVTX0lPQykgJiYKLQkJCSh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0lPQykpCi0JCXJldHVybiAwOwogCXJldHVybiAxOwogfQogCkBAIC0xOTk5LDcgKzIwNDMsMjUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoc3RydWN0IGR3YzMgKmR3YywgdTMyIGVwbnVtKQorc3RhdGljIHZvaWQgZHdjM19zdXNwZW5kX2dhZGdldChzdHJ1Y3QgZHdjMyAqZHdjKQoreworCWlmIChkd2MtPmdhZGdldF9kcml2ZXIgJiYgZHdjLT5nYWRnZXRfZHJpdmVyLT5zdXNwZW5kKSB7CisJCXNwaW5fdW5sb2NrKCZkd2MtPmxvY2spOworCQlkd2MtPmdhZGdldF9kcml2ZXItPnN1c3BlbmQoJmR3Yy0+Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZkd2MtPmxvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgZHdjM19yZXN1bWVfZ2FkZ2V0KHN0cnVjdCBkd2MzICpkd2MpCit7CisJaWYgKGR3Yy0+Z2FkZ2V0X2RyaXZlciAmJiBkd2MtPmdhZGdldF9kcml2ZXItPnJlc3VtZSkgeworCQlzcGluX3VubG9jaygmZHdjLT5sb2NrKTsKKwkJZHdjLT5nYWRnZXRfZHJpdmVyLT5yZXN1bWUoJmR3Yy0+Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZkd2MtPmxvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgZHdjM19zdG9wX2FjdGl2ZV90cmFuc2ZlcihzdHJ1Y3QgZHdjMyAqZHdjLCB1MzIgZXBudW0sIGJvb2wgZm9yY2UpCiB7CiAJc3RydWN0IGR3YzNfZXAgKmRlcDsKIAlzdHJ1Y3QgZHdjM19nYWRnZXRfZXBfY21kX3BhcmFtcyBwYXJhbXM7CkBAIC0yMDMxLDcgKzIwOTMsOCBAQAogCSAqLwogCiAJY21kID0gRFdDM19ERVBDTURfRU5EVFJBTlNGRVI7Ci0JY21kIHw9IERXQzNfREVQQ01EX0hJUFJJX0ZPUkNFUk0gfCBEV0MzX0RFUENNRF9DTURJT0M7CisJY21kIHw9IGZvcmNlID8gRFdDM19ERVBDTURfSElQUklfRk9SQ0VSTSA6IDA7CisJY21kIHw9IERXQzNfREVQQ01EX0NNRElPQzsKIAljbWQgfD0gRFdDM19ERVBDTURfUEFSQU0oZGVwLT5yZXNvdXJjZV9pbmRleCk7CiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKIAlyZXQgPSBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZChkd2MsIGRlcC0+bnVtYmVyLCBjbWQsICZwYXJhbXMpOwpAQCAtMjI2MCwxNyArMjMyMywyMyBAQAogCQlyZWcgfD0gRFdDM19EQ1RMX0hJUkRfVEhSRVMoMTIpOwogCiAJCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19EQ1RMLCByZWcpOworCX0gZWxzZSB7CisJCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0RDVEwpOworCQlyZWcgJj0gfkRXQzNfRENUTF9ISVJEX1RIUkVTX01BU0s7CisJCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19EQ1RMLCByZWcpOwogCX0KIAogCWRlcCA9IGR3Yy0+ZXBzWzBdOwotCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCB0cnVlKTsKKwlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgdHJ1ZSwKKwkJCWZhbHNlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZHdjLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlICVzXG4iLCBkZXAtPm5hbWUpOwogCQlyZXR1cm47CiAJfQogCiAJZGVwID0gZHdjLT5lcHNbMV07Ci0JcmV0ID0gX19kd2MzX2dhZGdldF9lcF9lbmFibGUoZGVwLCAmZHdjM19nYWRnZXRfZXAwX2Rlc2MsIE5VTEwsIHRydWUpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCB0cnVlLAorCQkJZmFsc2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBlbmFibGUgJXNcbiIsIGRlcC0+bmFtZSk7CiAJCXJldHVybjsKQEAgLTIzNzgsOSArMjQ0Nyw1MCBAQAogCiAJZHdjLT5saW5rX3N0YXRlID0gbmV4dDsKIAorCXN3aXRjaCAobmV4dCkgeworCWNhc2UgRFdDM19MSU5LX1NUQVRFX1UxOgorCQlpZiAoZHdjLT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCQlkd2MzX3N1c3BlbmRfZ2FkZ2V0KGR3Yyk7CisJCWJyZWFrOworCWNhc2UgRFdDM19MSU5LX1NUQVRFX1UyOgorCWNhc2UgRFdDM19MSU5LX1NUQVRFX1UzOgorCQlkd2MzX3N1c3BlbmRfZ2FkZ2V0KGR3Yyk7CisJCWJyZWFrOworCWNhc2UgRFdDM19MSU5LX1NUQVRFX1JFU1VNRToKKwkJZHdjM19yZXN1bWVfZ2FkZ2V0KGR3Yyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCiAJZGV2X3ZkYmcoZHdjLT5kZXYsICIlcyBsaW5rICVkXG4iLCBfX2Z1bmNfXywgZHdjLT5saW5rX3N0YXRlKTsKIH0KIAorc3RhdGljIHZvaWQgZHdjM19nYWRnZXRfaGliZXJuYXRpb25faW50ZXJydXB0KHN0cnVjdCBkd2MzICpkd2MsCisJCXVuc2lnbmVkIGludCBldnRpbmZvKQoreworCXVuc2lnbmVkIGludCBpc19zcyA9IGV2dGluZm8gJiBCSVQoNCk7CisKKwkvKioKKwkgKiBXT1JLQVJPVU5EOiBEV0MzIHJldmlzb24gMi4yMGEgd2l0aCBoaWJlcm5hdGlvbiBzdXBwb3J0CisJICogaGF2ZSBhIGtub3duIGlzc3VlIHdoaWNoIGNhbiBjYXVzZSBVU0IgQ1YgVEQuOS4yMyB0byBmYWlsCisJICogcmFuZG9tbHkuCisJICoKKwkgKiBCZWNhdXNlIG9mIHRoaXMgaXNzdWUsIGNvcmUgY291bGQgZ2VuZXJhdGUgYm9ndXMgaGliZXJuYXRpb24KKwkgKiBldmVudHMgd2hpY2ggU1cgbmVlZHMgdG8gaWdub3JlLgorCSAqCisJICogUmVmZXJzIHRvOgorCSAqCisJICogU1RBUiM5MDAwNTQ2NTc2OiBEZXZpY2UgTW9kZSBIaWJlcm5hdGlvbjogSXNzdWUgaW4gVVNCIDIuMAorCSAqIERldmljZSBGYWxsYmFjayBmcm9tIFN1cGVyU3BlZWQKKwkgKi8KKwlpZiAoaXNfc3MgXiAoZHdjLT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpKQorCQlyZXR1cm47CisKKwkvKiBlbnRlciBoaWJlcm5hdGlvbiBoZXJlICovCit9CisKIHN0YXRpYyB2b2lkIGR3YzNfZ2FkZ2V0X2ludGVycnVwdChzdHJ1Y3QgZHdjMyAqZHdjLAogCQljb25zdCBzdHJ1Y3QgZHdjM19ldmVudF9kZXZ0ICpldmVudCkKIHsKQEAgLTIzOTcsNiArMjUwNywxMyBAQAogCWNhc2UgRFdDM19ERVZJQ0VfRVZFTlRfV0FLRVVQOgogCQlkd2MzX2dhZGdldF93YWtldXBfaW50ZXJydXB0KGR3Yyk7CiAJCWJyZWFrOworCWNhc2UgRFdDM19ERVZJQ0VfRVZFTlRfSElCRVJfUkVROgorCQlpZiAoZGV2X1dBUk5fT05DRShkd2MtPmRldiwgIWR3Yy0+aGFzX2hpYmVybmF0aW9uLAorCQkJCQkidW5leHBlY3RlZCBoaWJlcm5hdGlvbiBldmVudFxuIikpCisJCQlicmVhazsKKworCQlkd2MzX2dhZGdldF9oaWJlcm5hdGlvbl9pbnRlcnJ1cHQoZHdjLCBldmVudC0+ZXZlbnRfaW5mbyk7CisJCWJyZWFrOwogCWNhc2UgRFdDM19ERVZJQ0VfRVZFTlRfTElOS19TVEFUVVNfQ0hBTkdFOgogCQlkd2MzX2dhZGdldF9saW5rc3RzX2NoYW5nZV9pbnRlcnJ1cHQoZHdjLCBldmVudC0+ZXZlbnRfaW5mbyk7CiAJCWJyZWFrOwpAQCAtMjY2MSw4ICsyNzc4LDEwIEBACiAKIGludCBkd2MzX2dhZGdldF9wcmVwYXJlKHN0cnVjdCBkd2MzICpkd2MpCiB7Ci0JaWYgKGR3Yy0+cHVsbHVwc19jb25uZWN0ZWQpCisJaWYgKGR3Yy0+cHVsbHVwc19jb25uZWN0ZWQpIHsKIAkJZHdjM19nYWRnZXRfZGlzYWJsZV9pcnEoZHdjKTsKKwkJZHdjM19nYWRnZXRfcnVuX3N0b3AoZHdjLCB0cnVlLCB0cnVlKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NzEsNyArMjc5MCw3IEBACiB7CiAJaWYgKGR3Yy0+cHVsbHVwc19jb25uZWN0ZWQpIHsKIAkJZHdjM19nYWRnZXRfZW5hYmxlX2lycShkd2MpOwotCQlkd2MzX2dhZGdldF9ydW5fc3RvcChkd2MsIHRydWUpOworCQlkd2MzX2dhZGdldF9ydW5fc3RvcChkd2MsIHRydWUsIGZhbHNlKTsKIAl9CiB9CiAKQEAgLTI2OTQsMTIgKzI4MTMsMTQgQEAKIAlkd2MzX2dhZGdldF9lcDBfZGVzYy53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KDUxMik7CiAKIAlkZXAgPSBkd2MtPmVwc1swXTsKLQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgZmFsc2UpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSwKKwkJCWZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjA7CiAKIAlkZXAgPSBkd2MtPmVwc1sxXTsKLQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2VwX2VuYWJsZShkZXAsICZkd2MzX2dhZGdldF9lcDBfZGVzYywgTlVMTCwgZmFsc2UpOworCXJldCA9IF9fZHdjM19nYWRnZXRfZXBfZW5hYmxlKGRlcCwgJmR3YzNfZ2FkZ2V0X2VwMF9kZXNjLCBOVUxMLCBmYWxzZSwKKwkJCWZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmggYi9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5oCmluZGV4IGZlYmUxYWEuLmEwZWU3NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmgKKysrIGIvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuaApAQCAtNTYsMTIgKzU2LDYgQEAKIC8qIERFUFhGRVJDRkcgcGFyYW1ldGVyIDAgKi8KICNkZWZpbmUgRFdDM19ERVBYRkVSQ0ZHX05VTV9YRkVSX1JFUyhuKQkoKG4pICYgMHhmZmZmKQogCi1zdHJ1Y3QgZHdjM19nYWRnZXRfZXBfY21kX3BhcmFtcyB7Ci0JdTMyCXBhcmFtMjsKLQl1MzIJcGFyYW0xOwotCXUzMglwYXJhbTA7Ci19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjZGVmaW5lIHRvX2R3YzNfcmVxdWVzdChyKQkoY29udGFpbmVyX29mKHIsIHN0cnVjdCBkd2MzX3JlcXVlc3QsIHJlcXVlc3QpKQpAQCAtODUsOSArNzksNiBAQAogdm9pZCBkd2MzX2dhZGdldF9naXZlYmFjayhzdHJ1Y3QgZHdjM19lcCAqZGVwLCBzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEsCiAJCWludCBzdGF0dXMpOwogCi1pbnQgZHdjM19nYWRnZXRfc2V0X3Rlc3RfbW9kZShzdHJ1Y3QgZHdjMyAqZHdjLCBpbnQgbW9kZSk7Ci1pbnQgZHdjM19nYWRnZXRfc2V0X2xpbmtfc3RhdGUoc3RydWN0IGR3YzMgKmR3YywgZW51bSBkd2MzX2xpbmtfc3RhdGUgc3RhdGUpOwotCiB2b2lkIGR3YzNfZXAwX2ludGVycnVwdChzdHJ1Y3QgZHdjMyAqZHdjLAogCQljb25zdCBzdHJ1Y3QgZHdjM19ldmVudF9kZXBldnQgKmV2ZW50KTsKIHZvaWQgZHdjM19lcDBfb3V0X3N0YXJ0KHN0cnVjdCBkd2MzICpkd2MpOwpAQCAtOTUsOSArODYsNiBAQAogaW50IGR3YzNfZ2FkZ2V0X2VwMF9xdWV1ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXF1ZXN0LAogCQlnZnBfdCBnZnBfZmxhZ3MpOwogaW50IF9fZHdjM19nYWRnZXRfZXBfc2V0X2hhbHQoc3RydWN0IGR3YzNfZXAgKmRlcCwgaW50IHZhbHVlKTsKLWludCBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZChzdHJ1Y3QgZHdjMyAqZHdjLCB1bnNpZ25lZCBlcCwKLQkJdW5zaWduZWQgY21kLCBzdHJ1Y3QgZHdjM19nYWRnZXRfZXBfY21kX3BhcmFtcyAqcGFyYW1zKTsKLWludCBkd2MzX3NlbmRfZ2FkZ2V0X2dlbmVyaWNfY29tbWFuZChzdHJ1Y3QgZHdjMyAqZHdjLCBpbnQgY21kLCB1MzIgcGFyYW0pOwogCiAvKioKICAqIGR3YzNfZ2FkZ2V0X2VwX2dldF90cmFuc2Zlcl9pbmRleCAtIEdldHMgdHJhbnNmZXIgaW5kZXggZnJvbSBIVwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCA4MTU0MTY1Li4zNTU3YzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtMjI2LDcgKzIyNiw3IEBACiBjb25maWcgVVNCX09NQVAKIAl0cmlzdGF0ZSAiT01BUCBVU0IgRGV2aWNlIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAxCi0Jc2VsZWN0IElTUDEzMDFfT01BUCBpZiBNQUNIX09NQVBfSDIgfHwgTUFDSF9PTUFQX0gzIHx8IE1BQ0hfT01BUF9INF9PVEcKKwlzZWxlY3QgSVNQMTMwMV9PTUFQIGlmIE1BQ0hfT01BUF9IMiB8fCBNQUNIX09NQVBfSDMKIAloZWxwCiAJICAgTWFueSBUZXhhcyBJbnN0cnVtZW50cyBPTUFQIHByb2Nlc3NvcnMgaGF2ZSBmbGV4aWJsZSBmdWxsCiAJICAgc3BlZWQgVVNCIGRldmljZSBjb250cm9sbGVycywgd2l0aCBzdXBwb3J0IGZvciB1cCB0byAzMApAQCAtMzAxLDcgKzMwMSw2IEBACiAJICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCiAKIGNvbmZpZyBVU0JfUzNDX0hTT1RHCi0JZGVwZW5kcyBvbiBBUk0KIAl0cmlzdGF0ZSAiRGVzaWdud2FyZS9TM0MgSFMvT3RHIFVTQiBEZXZpY2UgY29udHJvbGxlciIKIAloZWxwCiAJICBUaGUgRGVzaWdud2FyZSBVU0IyLjAgaGlnaC1zcGVlZCBnYWRnZXQgY29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwppbmRleCBjZWE4YzIwLi5mNjA1YWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwpAQCAtMTc1OCwxNSArMTc1OCwxNSBAQAogCiAJLyogbmV3ZXIgY2hpcHMgaGF2ZSBtb3JlIEZJRk8gbWVtb3J5IHRoYW4gcm05MjAwICovCiAJaWYgKGNwdV9pc19hdDkxc2FtOTI2MCgpIHx8IGNwdV9pc19hdDkxc2FtOWcyMCgpKSB7Ci0JCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZ1ZGMtPmVwWzBdLmVwLCA2NCk7Ci0JCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZ1ZGMtPmVwWzNdLmVwLCA2NCk7Ci0JCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZ1ZGMtPmVwWzRdLmVwLCA1MTIpOwotCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmdWRjLT5lcFs1XS5lcCwgNTEyKTsKKwkJdWRjLT5lcFswXS5tYXhwYWNrZXQgPSA2NDsKKwkJdWRjLT5lcFszXS5tYXhwYWNrZXQgPSA2NDsKKwkJdWRjLT5lcFs0XS5tYXhwYWNrZXQgPSA1MTI7CisJCXVkYy0+ZXBbNV0ubWF4cGFja2V0ID0gNTEyOwogCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpIHsKLQkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJnVkYy0+ZXBbM10uZXAsIDY0KTsKKwkJdWRjLT5lcFszXS5tYXhwYWNrZXQgPSA2NDsKIAl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOTI2MygpKSB7Ci0JCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZ1ZGMtPmVwWzBdLmVwLCA2NCk7Ci0JCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZ1ZGMtPmVwWzNdLmVwLCA2NCk7CisJCXVkYy0+ZXBbMF0ubWF4cGFja2V0ID0gNjQ7CisJCXVkYy0+ZXBbM10ubWF4cGFja2V0ID0gNjQ7CiAJfQogCiAJdWRjLT51ZHBfYmFzZWFkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCmluZGV4IDUyNzcxZDQuLjlmNjUzMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCkBAIC0xNjYxLDcgKzE2NjEsNyBAQAogCWlmIChkbWFfc3RhdHVzKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDE7IGkgPCBVU0JBX05SX0VORFBPSU5UUzsgaSsrKQorCQlmb3IgKGkgPSAxOyBpIDwgVVNCQV9OUl9ETUFTOyBpKyspCiAJCQlpZiAoZG1hX3N0YXR1cyAmICgxIDw8IGkpKQogCQkJCXVzYmFfZG1hX2lycSh1ZGMsICZ1ZGMtPnVzYmFfZXBbaV0pOwogCX0KQEAgLTE2NzAsNyArMTY3MCw3IEBACiAJaWYgKGVwX3N0YXR1cykgewogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgVVNCQV9OUl9FTkRQT0lOVFM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IHVkYy0+bnVtX2VwOyBpKyspCiAJCQlpZiAoZXBfc3RhdHVzICYgKDEgPDwgaSkpIHsKIAkJCQlpZiAoZXBfaXNfY29udHJvbCgmdWRjLT51c2JhX2VwW2ldKSkKIAkJCQkJdXNiYV9jb250cm9sX2lycSh1ZGMsICZ1ZGMtPnVzYmFfZXBbaV0pOwpAQCAtMTgyNywxMiArMTgyNywxMiBAQAogCXRvZ2dsZV9iaWFzKDApOwogCXVzYmFfd3JpdGVsKHVkYywgQ1RSTCwgVVNCQV9ESVNBQkxFX01BU0spOwogCi0JdWRjLT5kcml2ZXIgPSBOVUxMOwotCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHVkYy0+aGNsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHVkYy0+cGNsayk7CiAKLQlEQkcoREJHX0dBREdFVCwgInVucmVnaXN0ZXJlZCBkcml2ZXIgYCVzJ1xuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CisJREJHKERCR19HQURHRVQsICJ1bnJlZ2lzdGVyZWQgZHJpdmVyIGAlcydcbiIsIHVkYy0+ZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwl1ZGMtPmRyaXZlciA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MTQsNiArMTkxNCwxMiBAQAogCQlpKys7CiAJfQogCisJaWYgKGkgPT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvZl9wcm9iZTogbm8gZW5kcG9pbnQgc3BlY2lmaWVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCiAJcmV0dXJuIGVwczsKIGVycjoKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuaAppbmRleCAyOTIyZGI1Li5hNzA3MDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuaApAQCAtMjEwLDcgKzIxMCw3IEBACiAjZGVmaW5lIFVTQkFfRklGT19CQVNFKHgpCSgoeCkgPDwgMTYpCiAKIC8qIFN5bnRoIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgVVNCQV9OUl9FTkRQT0lOVFMJNworI2RlZmluZSBVU0JBX05SX0RNQVMJCTcKIAogI2RlZmluZSBFUDBfRklGT19TSVpFCQk2NAogI2RlZmluZSBFUDBfRVBUX1NJWkUJCVVTQkFfRVBUX1NJWkVfNjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwppbmRleCBkNzQyYmVkLi5mYWI5MDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCkBAIC0xMTM5LDcgKzExMzksNyBAQAogCiAJdWMgPSBjb3B5X2dhZGdldF9zdHJpbmdzKHNwLCBuX2dzdHJpbmdzLCBuX3N0cmluZ3MpOwogCWlmIChJU19FUlIodWMpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKHVjKSk7CisJCXJldHVybiBFUlJfQ0FTVCh1Yyk7CiAKIAluX2dzID0gZ2V0X2NvbnRhaW5lcnNfZ3ModWMpOwogCXJldCA9IHVzYl9zdHJpbmdfaWRzX3RhYihjZGV2LCBuX2dzWzBdLT5zdHJpbmdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jCmluZGV4IDJiNDMzNDMuLjJlMTY0ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYwpAQCAtMjgsNiArMjgsMTAgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvY29tcG9zaXRlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2Z1bmN0aW9uZnMuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCiAjaW5jbHVkZSAidV9mcy5oIgogI2luY2x1ZGUgImNvbmZpZ2ZzLmgiCiAKQEAgLTk5LDYgKzEwMywxNCBAQAogfQogCiAKK3N0YXRpYyBpbmxpbmUgZW51bSBmZnNfc2V0dXBfc3RhdGUKK2Zmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoc3RydWN0IGZmc19kYXRhICpmZnMpCit7CisJcmV0dXJuIChlbnVtIGZmc19zZXR1cF9zdGF0ZSkKKwkJY21weGNoZygmZmZzLT5zZXR1cF9zdGF0ZSwgRkZTX1NFVFVQX0NBTkNFTExFRCwgRkZTX05PX1NFVFVQKTsKK30KKworCiBzdGF0aWMgdm9pZCBmZnNfZnVuY19lcHNfZGlzYWJsZShzdHJ1Y3QgZmZzX2Z1bmN0aW9uICpmdW5jKTsKIHN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGZmc19mdW5jX2Vwc19lbmFibGUoc3RydWN0IGZmc19mdW5jdGlvbiAqZnVuYyk7CiAKQEAgLTEyMiw4ICsxMzQsOCBAQAogCXN0cnVjdCB1c2JfZXAJCQkqZXA7CS8qIFA6IGZmcy0+ZXBzX2xvY2sgKi8KIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSpyZXE7CS8qIFA6IGVwZmlsZS0+bXV0ZXggKi8KIAotCS8qIFswXTogZnVsbCBzcGVlZCwgWzFdOiBoaWdoIHNwZWVkICovCi0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjc1syXTsKKwkvKiBbMF06IGZ1bGwgc3BlZWQsIFsxXTogaGlnaCBzcGVlZCwgWzJdOiBzdXBlciBzcGVlZCAqLworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqZGVzY3NbM107CiAKIAl1OAkJCQludW07CiAKQEAgLTE0OCw2ICsxNjAsMjUgQEAKIAl1bnNpZ25lZCBjaGFyCQkJX3BhZDsKIH07CiAKKy8qICBmZnNfaW9fZGF0YSBzdHJ1Y3R1cmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZmZzX2lvX2RhdGEgeworCWJvb2wgYWlvOworCWJvb2wgcmVhZDsKKworCXN0cnVjdCBraW9jYiAqa2lvY2I7CisJY29uc3Qgc3RydWN0IGlvdmVjICppb3ZlYzsKKwl1bnNpZ25lZCBsb25nIG5yX3NlZ3M7CisJY2hhciBfX3VzZXIgKmJ1ZjsKKwlzaXplX3QgbGVuOworCisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisKKwlzdHJ1Y3QgdXNiX2VwICplcDsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcTsKK307CisKIHN0YXRpYyBpbnQgIF9fbXVzdF9jaGVjayBmZnNfZXBmaWxlc19jcmVhdGUoc3RydWN0IGZmc19kYXRhICpmZnMpOwogc3RhdGljIHZvaWQgZmZzX2VwZmlsZXNfZGVzdHJveShzdHJ1Y3QgZmZzX2VwZmlsZSAqZXBmaWxlcywgdW5zaWduZWQgY291bnQpOwogCkBAIC0xNjEsOCArMTkyLDEwIEBACiBERUZJTkVfTVVURVgoZmZzX2xvY2spOwogRVhQT1JUX1NZTUJPTChmZnNfbG9jayk7CiAKLXN0YXRpYyBzdHJ1Y3QgZmZzX2RldiAqZmZzX2ZpbmRfZGV2KGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpfZmZzX2ZpbmRfZGV2KGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpfZmZzX2FsbG9jX2Rldih2b2lkKTsKIHN0YXRpYyBpbnQgX2Zmc19uYW1lX2RldihzdHJ1Y3QgZmZzX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyB2b2lkIF9mZnNfZnJlZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldik7CiBzdGF0aWMgdm9pZCAqZmZzX2FjcXVpcmVfZGV2KGNvbnN0IGNoYXIgKmRldl9uYW1lKTsKIHN0YXRpYyB2b2lkIGZmc19yZWxlYXNlX2RldihzdHJ1Y3QgZmZzX2RhdGEgKmZmc19kYXRhKTsKIHN0YXRpYyBpbnQgZmZzX3JlYWR5KHN0cnVjdCBmZnNfZGF0YSAqZmZzKTsKQEAgLTIxOCw3ICsyNTEsNyBAQAogCX0KIAogCWZmcy0+c2V0dXBfc3RhdGUgPSBGRlNfTk9fU0VUVVA7Ci0JcmV0dXJuIGZmcy0+ZXAwcmVxX3N0YXR1czsKKwlyZXR1cm4gcmVxLT5zdGF0dXMgPyByZXEtPnN0YXR1cyA6IHJlcS0+YWN0dWFsOwogfQogCiBzdGF0aWMgaW50IF9fZmZzX2VwMF9zdGFsbChzdHJ1Y3QgZmZzX2RhdGEgKmZmcykKQEAgLTI0NCw3ICsyNzcsNyBAQAogCUVOVEVSKCk7CiAKIAkvKiBGYXN0IGNoZWNrIGlmIHNldHVwIHdhcyBjYW5jZWxlZCAqLwotCWlmIChGRlNfU0VUVVBfU1RBVEUoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMRUQpCisJaWYgKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMTEVEKQogCQlyZXR1cm4gLUVJRFJNOwogCiAJLyogQWNxdWlyZSBtdXRleCAqLwpAQCAtMzEwLDggKzM0Myw4IEBACiAJCSAqIHJhdGhlciB0aGVuIF9pcnFzYXZlCiAJCSAqLwogCQlzcGluX2xvY2tfaXJxKCZmZnMtPmV2LndhaXRxLmxvY2spOwotCQlzd2l0Y2ggKEZGU19TRVRVUF9TVEFURShmZnMpKSB7Ci0JCWNhc2UgRkZTX1NFVFVQX0NBTkNFTEVEOgorCQlzd2l0Y2ggKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSkgeworCQljYXNlIEZGU19TRVRVUF9DQU5DRUxMRUQ6CiAJCQlyZXQgPSAtRUlEUk07CiAJCQlnb3RvIGRvbmVfc3BpbjsKIApAQCAtMzQ2LDcgKzM3OSw3IEBACiAJCS8qCiAJCSAqIFdlIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN0aWxsIGluIEZGU19BQ1RJVkUgc3RhdGUKIAkJICogYnV0IHRoZSBzdGF0ZSBvZiBzZXR1cCBjb3VsZCBoYXZlIGNoYW5nZWQgZnJvbQotCQkgKiBGRlNfU0VUVVBfUEVORElORyB0byBGRlNfU0VUVVBfQ0FOQ0VMRUQgc28gd2UgbmVlZAorCQkgKiBGRlNfU0VUVVBfUEVORElORyB0byBGRlNfU0VUVVBfQ0FOQ0VMTEVEIHNvIHdlIG5lZWQKIAkJICogdG8gY2hlY2sgZm9yIHRoYXQuICBJZiB0aGF0IGhhcHBlbmVkIHdlIGNvcGllZCBkYXRhCiAJCSAqIGZyb20gdXNlciBzcGFjZSBpbiB2YWluIGJ1dCBpdCdzIHVubGlrZWx5LgogCQkgKgpAQCAtMzU1LDcgKzM4OCw4IEBACiAJCSAqIHRyYW5zaXRpb24gY2FuIGJlIHBlcmZvcm1lZCBhbmQgaXQncyBwcm90ZWN0ZWQgYnkKIAkJICogbXV0ZXguCiAJCSAqLwotCQlpZiAoRkZTX1NFVFVQX1NUQVRFKGZmcykgPT0gRkZTX1NFVFVQX0NBTkNFTEVEKSB7CisJCWlmIChmZnNfc2V0dXBfc3RhdGVfY2xlYXJfY2FuY2VsbGVkKGZmcykgPT0KKwkJICAgIEZGU19TRVRVUF9DQU5DRUxMRUQpIHsKIAkJCXJldCA9IC1FSURSTTsKIGRvbmVfc3BpbjoKIAkJCXNwaW5fdW5sb2NrX2lycSgmZmZzLT5ldi53YWl0cS5sb2NrKTsKQEAgLTQyMSw3ICs0NTUsNyBAQAogCUVOVEVSKCk7CiAKIAkvKiBGYXN0IGNoZWNrIGlmIHNldHVwIHdhcyBjYW5jZWxlZCAqLwotCWlmIChGRlNfU0VUVVBfU1RBVEUoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMRUQpCisJaWYgKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSA9PSBGRlNfU0VUVVBfQ0FOQ0VMTEVEKQogCQlyZXR1cm4gLUVJRFJNOwogCiAJLyogQWNxdWlyZSBtdXRleCAqLwpAQCAtNDQxLDggKzQ3NSw4IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycSgmZmZzLT5ldi53YWl0cS5sb2NrKTsKIAotCXN3aXRjaCAoRkZTX1NFVFVQX1NUQVRFKGZmcykpIHsKLQljYXNlIEZGU19TRVRVUF9DQU5DRUxFRDoKKwlzd2l0Y2ggKGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQoZmZzKSkgeworCWNhc2UgRkZTX1NFVFVQX0NBTkNFTExFRDoKIAkJcmV0ID0gLUVJRFJNOwogCQlicmVhazsKIApAQCAtNDg5LDcgKzUyMyw4IEBACiAJCXNwaW5fbG9ja19pcnEoJmZmcy0+ZXYud2FpdHEubG9jayk7CiAKIAkJLyogU2VlIGZmc19lcDBfd3JpdGUoKSAqLwotCQlpZiAoRkZTX1NFVFVQX1NUQVRFKGZmcykgPT0gRkZTX1NFVFVQX0NBTkNFTEVEKSB7CisJCWlmIChmZnNfc2V0dXBfc3RhdGVfY2xlYXJfY2FuY2VsbGVkKGZmcykgPT0KKwkJICAgIEZGU19TRVRVUF9DQU5DRUxMRUQpIHsKIAkJCXJldCA9IC1FSURSTTsKIAkJCWJyZWFrOwogCQl9CkBAIC01NTgsNiArNTkzLDQ1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBmZnNfZXAwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGZmc19kYXRhICpmZnMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSBQT0xMV1JOT1JNOworCWludCByZXQ7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmZmcy0+ZXYud2FpdHEsIHdhaXQpOworCisJcmV0ID0gZmZzX211dGV4X2xvY2soJmZmcy0+bXV0ZXgsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCXJldHVybiBtYXNrOworCisJc3dpdGNoIChmZnMtPnN0YXRlKSB7CisJY2FzZSBGRlNfUkVBRF9ERVNDUklQVE9SUzoKKwljYXNlIEZGU19SRUFEX1NUUklOR1M6CisJCW1hc2sgfD0gUE9MTE9VVDsKKwkJYnJlYWs7CisKKwljYXNlIEZGU19BQ1RJVkU6CisJCXN3aXRjaCAoZmZzLT5zZXR1cF9zdGF0ZSkgeworCQljYXNlIEZGU19OT19TRVRVUDoKKwkJCWlmIChmZnMtPmV2LmNvdW50KQorCQkJCW1hc2sgfD0gUE9MTElOOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRlNfU0VUVVBfUEVORElORzoKKwkJY2FzZSBGRlNfU0VUVVBfQ0FOQ0VMTEVEOgorCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTE9VVCk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgRkZTX0NMT1NJTkc6CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmZmZzLT5tdXRleCk7CisKKwlyZXR1cm4gbWFzazsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmZzX2VwMF9vcGVyYXRpb25zID0gewogCS5sbHNlZWsgPQlub19sbHNlZWssCiAKQEAgLTU2Niw2ICs2NDAsNyBAQAogCS5yZWFkID0JCWZmc19lcDBfcmVhZCwKIAkucmVsZWFzZSA9CWZmc19lcDBfcmVsZWFzZSwKIAkudW5sb2NrZWRfaW9jdGwgPQlmZnNfZXAwX2lvY3RsLAorCS5wb2xsID0JCWZmc19lcDBfcG9sbCwKIH07CiAKIApAQCAtNTgxLDggKzY1Niw1MiBAQAogCX0KIH0KIAotc3RhdGljIHNzaXplX3QgZmZzX2VwZmlsZV9pbyhzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IHJlYWQpCitzdGF0aWMgdm9pZCBmZnNfdXNlcl9jb3B5X3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGZmc19pb19kYXRhICppb19kYXRhID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmZnNfaW9fZGF0YSwKKwkJCQkJCSAgIHdvcmspOworCWludCByZXQgPSBpb19kYXRhLT5yZXEtPnN0YXR1cyA/IGlvX2RhdGEtPnJlcS0+c3RhdHVzIDoKKwkJCQkJIGlvX2RhdGEtPnJlcS0+YWN0dWFsOworCisJaWYgKGlvX2RhdGEtPnJlYWQgJiYgcmV0ID4gMCkgeworCQlpbnQgaTsKKwkJc2l6ZV90IHBvcyA9IDA7CisJCXVzZV9tbShpb19kYXRhLT5tbSk7CisJCWZvciAoaSA9IDA7IGkgPCBpb19kYXRhLT5ucl9zZWdzOyBpKyspIHsKKwkJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIoaW9fZGF0YS0+aW92ZWNbaV0uaW92X2Jhc2UsCisJCQkJCQkgJmlvX2RhdGEtPmJ1Zltwb3NdLAorCQkJCQkJIGlvX2RhdGEtPmlvdmVjW2ldLmlvdl9sZW4pKSkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwb3MgKz0gaW9fZGF0YS0+aW92ZWNbaV0uaW92X2xlbjsKKwkJfQorCQl1bnVzZV9tbShpb19kYXRhLT5tbSk7CisJfQorCisJYWlvX2NvbXBsZXRlKGlvX2RhdGEtPmtpb2NiLCByZXQsIHJldCk7CisKKwl1c2JfZXBfZnJlZV9yZXF1ZXN0KGlvX2RhdGEtPmVwLCBpb19kYXRhLT5yZXEpOworCisJaW9fZGF0YS0+a2lvY2ItPnByaXZhdGUgPSBOVUxMOworCWlmIChpb19kYXRhLT5yZWFkKQorCQlrZnJlZShpb19kYXRhLT5pb3ZlYyk7CisJa2ZyZWUoaW9fZGF0YS0+YnVmKTsKKwlrZnJlZShpb19kYXRhKTsKK30KKworc3RhdGljIHZvaWQgZmZzX2VwZmlsZV9hc3luY19pb19jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICpfZXAsCisJCQkJCSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZmZzX2lvX2RhdGEgKmlvX2RhdGEgPSByZXEtPmNvbnRleHQ7CisKKwlFTlRFUigpOworCisJSU5JVF9XT1JLKCZpb19kYXRhLT53b3JrLCBmZnNfdXNlcl9jb3B5X3dvcmtlcik7CisJc2NoZWR1bGVfd29yaygmaW9fZGF0YS0+d29yayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZmc19lcGZpbGVfaW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmZnNfaW9fZGF0YSAqaW9fZGF0YSkKIHsKIAlzdHJ1Y3QgZmZzX2VwZmlsZSAqZXBmaWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBmZnNfZXAgKmVwOwpAQCAtNjEyLDcgKzczMSw3IEBACiAJfQogCiAJLyogRG8gd2UgaGFsdD8gKi8KLQloYWx0ID0gIXJlYWQgPT0gIWVwZmlsZS0+aW47CisJaGFsdCA9ICghaW9fZGF0YS0+cmVhZCA9PSAhZXBmaWxlLT5pbik7CiAJaWYgKGhhbHQgJiYgZXBmaWxlLT5pc29jKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3I7CkBAIC02MzAsMTUgKzc0OSwzMiBAQAogCQkgKiBDb250cm9sbGVyIG1heSByZXF1aXJlIGJ1ZmZlciBzaXplIHRvIGJlIGFsaWduZWQgdG8KIAkJICogbWF4cGFja2V0c2l6ZSBvZiBhbiBvdXQgZW5kcG9pbnQuCiAJCSAqLwotCQlkYXRhX2xlbiA9IHJlYWQgPyB1c2JfZXBfYWxpZ25fbWF5YmUoZ2FkZ2V0LCBlcC0+ZXAsIGxlbikgOiBsZW47CisJCWRhdGFfbGVuID0gaW9fZGF0YS0+cmVhZCA/CisJCQkgICB1c2JfZXBfYWxpZ25fbWF5YmUoZ2FkZ2V0LCBlcC0+ZXAsIGlvX2RhdGEtPmxlbikgOgorCQkJICAgaW9fZGF0YS0+bGVuOwogCiAJCWRhdGEgPSBrbWFsbG9jKGRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHVubGlrZWx5KCFkYXRhKSkKIAkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmICghcmVhZCAmJiB1bmxpa2VseShjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGxlbikpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBlcnJvcjsKKwkJaWYgKGlvX2RhdGEtPmFpbyAmJiAhaW9fZGF0YS0+cmVhZCkgeworCQkJaW50IGk7CisJCQlzaXplX3QgcG9zID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBpb19kYXRhLT5ucl9zZWdzOyBpKyspIHsKKwkJCQlpZiAodW5saWtlbHkoY29weV9mcm9tX3VzZXIoJmRhdGFbcG9zXSwKKwkJCQkJICAgICBpb19kYXRhLT5pb3ZlY1tpXS5pb3ZfYmFzZSwKKwkJCQkJICAgICBpb19kYXRhLT5pb3ZlY1tpXS5pb3ZfbGVuKSkpIHsKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQkJcG9zICs9IGlvX2RhdGEtPmlvdmVjW2ldLmlvdl9sZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIWlvX2RhdGEtPnJlYWQgJiYKKwkJCSAgICB1bmxpa2VseShfX2NvcHlfZnJvbV91c2VyKGRhdGEsIGlvX2RhdGEtPmJ1ZiwKKwkJCQkJCSAgICAgIGlvX2RhdGEtPmxlbikpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQogCQl9CiAJfQogCkBAIC02NjEsNDAgKzc5Nyw3OCBAQAogCQlyZXQgPSAtRUJBRE1TRzsKIAl9IGVsc2UgewogCQkvKiBGaXJlIHRoZSByZXF1ZXN0ICovCi0JCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGRvbmUpOworCQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcTsKIAotCQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9IGVwLT5yZXE7Ci0JCXJlcS0+Y29udGV4dCAgPSAmZG9uZTsKLQkJcmVxLT5jb21wbGV0ZSA9IGZmc19lcGZpbGVfaW9fY29tcGxldGU7Ci0JCXJlcS0+YnVmICAgICAgPSBkYXRhOwotCQlyZXEtPmxlbmd0aCAgID0gZGF0YV9sZW47CisJCWlmIChpb19kYXRhLT5haW8pIHsKKwkJCXJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGVwLT5lcCwgR0ZQX0tFUk5FTCk7CisJCQlpZiAodW5saWtlbHkoIXJlcSkpCisJCQkJZ290byBlcnJvcl9sb2NrOwogCi0JCXJldCA9IHVzYl9lcF9xdWV1ZShlcC0+ZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCQlyZXEtPmJ1ZiAgICAgID0gZGF0YTsKKwkJCXJlcS0+bGVuZ3RoICAgPSBpb19kYXRhLT5sZW47CiAKLQkJc3Bpbl91bmxvY2tfaXJxKCZlcGZpbGUtPmZmcy0+ZXBzX2xvY2spOworCQkJaW9fZGF0YS0+YnVmID0gZGF0YTsKKwkJCWlvX2RhdGEtPmVwID0gZXAtPmVwOworCQkJaW9fZGF0YS0+cmVxID0gcmVxOwogCi0JCWlmICh1bmxpa2VseShyZXQgPCAwKSkgewotCQkJLyogbm9wICovCi0JCX0gZWxzZSBpZiAodW5saWtlbHkod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZkb25lKSkpIHsKLQkJCXJldCA9IC1FSU5UUjsKLQkJCXVzYl9lcF9kZXF1ZXVlKGVwLT5lcCwgcmVxKTsKKwkJCXJlcS0+Y29udGV4dCAgPSBpb19kYXRhOworCQkJcmVxLT5jb21wbGV0ZSA9IGZmc19lcGZpbGVfYXN5bmNfaW9fY29tcGxldGU7CisKKwkJCXJldCA9IHVzYl9lcF9xdWV1ZShlcC0+ZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJCXVzYl9lcF9mcmVlX3JlcXVlc3QoZXAtPmVwLCByZXEpOworCQkJCWdvdG8gZXJyb3JfbG9jazsKKwkJCX0KKwkJCXJldCA9IC1FSU9DQlFVRVVFRDsKKworCQkJc3Bpbl91bmxvY2tfaXJxKCZlcGZpbGUtPmZmcy0+ZXBzX2xvY2spOwogCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFhYWCBXZSBtYXkgZW5kIHVwIHNpbGVudGx5IGRyb3BpbmcgZGF0YSBoZXJlLgotCQkJICogU2luY2UgZGF0YV9sZW4gKGkuZS4gcmVxLT5sZW5ndGgpIG1heSBiZSBiaWdnZXIKLQkJCSAqIHRoYW4gbGVuIChhZnRlciBiZWluZyByb3VuZGVkIHVwIHRvIG1heHBhY2tldHNpemUpLAotCQkJICogd2UgbWF5IGVuZCB1cCB3aXRoIG1vcmUgZGF0YSB0aGVuIHVzZXIgc3BhY2UgaGFzCi0JCQkgKiBzcGFjZSBmb3IuCi0JCQkgKi8KLQkJCXJldCA9IGVwLT5zdGF0dXM7Ci0JCQlpZiAocmVhZCAmJiByZXQgPiAwICYmCi0JCQkgICAgdW5saWtlbHkoY29weV90b191c2VyKGJ1ZiwgZGF0YSwKLQkJCQkJCSAgbWluX3Qoc2l6ZV90LCByZXQsIGxlbikpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOworCQkJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soZG9uZSk7CisKKwkJCXJlcSA9IGVwLT5yZXE7CisJCQlyZXEtPmJ1ZiAgICAgID0gZGF0YTsKKwkJCXJlcS0+bGVuZ3RoICAgPSBpb19kYXRhLT5sZW47CisKKwkJCXJlcS0+Y29udGV4dCAgPSAmZG9uZTsKKwkJCXJlcS0+Y29tcGxldGUgPSBmZnNfZXBmaWxlX2lvX2NvbXBsZXRlOworCisJCQlyZXQgPSB1c2JfZXBfcXVldWUoZXAtPmVwLCByZXEsIEdGUF9BVE9NSUMpOworCisJCQlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CisKKwkJCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQkJCS8qIG5vcCAqLworCQkJfSBlbHNlIGlmICh1bmxpa2VseSgKKwkJCQkgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmRvbmUpKSkgeworCQkJCXJldCA9IC1FSU5UUjsKKwkJCQl1c2JfZXBfZGVxdWV1ZShlcC0+ZXAsIHJlcSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogWFhYIFdlIG1heSBlbmQgdXAgc2lsZW50bHkgZHJvcGluZyBkYXRhCisJCQkJICogaGVyZS4gIFNpbmNlIGRhdGFfbGVuIChpLmUuIHJlcS0+bGVuZ3RoKSBtYXkKKwkJCQkgKiBiZSBiaWdnZXIgdGhhbiBsZW4gKGFmdGVyIGJlaW5nIHJvdW5kZWQgdXAKKwkJCQkgKiB0byBtYXhwYWNrZXRzaXplKSwgd2UgbWF5IGVuZCB1cCB3aXRoIG1vcmUKKwkJCQkgKiBkYXRhIHRoZW4gdXNlciBzcGFjZSBoYXMgc3BhY2UgZm9yLgorCQkJCSAqLworCQkJCXJldCA9IGVwLT5zdGF0dXM7CisJCQkJaWYgKGlvX2RhdGEtPnJlYWQgJiYgcmV0ID4gMCkgeworCQkJCQlyZXQgPSBtaW5fdChzaXplX3QsIHJldCwgaW9fZGF0YS0+bGVuKTsKKworCQkJCQlpZiAodW5saWtlbHkoY29weV90b191c2VyKGlvX2RhdGEtPmJ1ZiwKKwkJCQkJCWRhdGEsIHJldCkpKQorCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl9CisJCQl9CisJCQlrZnJlZShkYXRhKTsKIAkJfQogCX0KIAogCW11dGV4X3VubG9jaygmZXBmaWxlLT5tdXRleCk7CisJcmV0dXJuIHJldDsKKworZXJyb3JfbG9jazoKKwlzcGluX3VubG9ja19pcnEoJmVwZmlsZS0+ZmZzLT5lcHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZlcGZpbGUtPm11dGV4KTsKIGVycm9yOgogCWtmcmVlKGRhdGEpOwogCXJldHVybiByZXQ7CkBAIC03MDQsMTcgKzg3OCwzMSBAQAogZmZzX2VwZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKIAkJIGxvZmZfdCAqcHRyKQogeworCXN0cnVjdCBmZnNfaW9fZGF0YSBpb19kYXRhOworCiAJRU5URVIoKTsKIAotCXJldHVybiBmZnNfZXBmaWxlX2lvKGZpbGUsIChjaGFyIF9fdXNlciAqKWJ1ZiwgbGVuLCAwKTsKKwlpb19kYXRhLmFpbyA9IGZhbHNlOworCWlvX2RhdGEucmVhZCA9IGZhbHNlOworCWlvX2RhdGEuYnVmID0gKGNoYXIgKiBfX3VzZXIpYnVmOworCWlvX2RhdGEubGVuID0gbGVuOworCisJcmV0dXJuIGZmc19lcGZpbGVfaW8oZmlsZSwgJmlvX2RhdGEpOwogfQogCiBzdGF0aWMgc3NpemVfdAogZmZzX2VwZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnB0cikKIHsKKwlzdHJ1Y3QgZmZzX2lvX2RhdGEgaW9fZGF0YTsKKwogCUVOVEVSKCk7CiAKLQlyZXR1cm4gZmZzX2VwZmlsZV9pbyhmaWxlLCBidWYsIGxlbiwgMSk7CisJaW9fZGF0YS5haW8gPSBmYWxzZTsKKwlpb19kYXRhLnJlYWQgPSB0cnVlOworCWlvX2RhdGEuYnVmID0gYnVmOworCWlvX2RhdGEubGVuID0gbGVuOworCisJcmV0dXJuIGZmc19lcGZpbGVfaW8oZmlsZSwgJmlvX2RhdGEpOwogfQogCiBzdGF0aWMgaW50CkBAIC03MzMsNiArOTIxLDg5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmZzX2Fpb19jYW5jZWwoc3RydWN0IGtpb2NiICpraW9jYikKK3sKKwlzdHJ1Y3QgZmZzX2lvX2RhdGEgKmlvX2RhdGEgPSBraW9jYi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZmZzX2VwZmlsZSAqZXBmaWxlID0ga2lvY2ItPmtpX2ZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgdmFsdWU7CisKKwlFTlRFUigpOworCisJc3Bpbl9sb2NrX2lycSgmZXBmaWxlLT5mZnMtPmVwc19sb2NrKTsKKworCWlmIChsaWtlbHkoaW9fZGF0YSAmJiBpb19kYXRhLT5lcCAmJiBpb19kYXRhLT5yZXEpKQorCQl2YWx1ZSA9IHVzYl9lcF9kZXF1ZXVlKGlvX2RhdGEtPmVwLCBpb19kYXRhLT5yZXEpOworCWVsc2UKKwkJdmFsdWUgPSAtRUlOVkFMOworCisJc3Bpbl91bmxvY2tfaXJxKCZlcGZpbGUtPmZmcy0+ZXBzX2xvY2spOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgc3NpemVfdCBmZnNfZXBmaWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmtpb2NiLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdmVjLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBsb2ZmKQoreworCXN0cnVjdCBmZnNfaW9fZGF0YSAqaW9fZGF0YTsKKworCUVOVEVSKCk7CisKKwlpb19kYXRhID0ga21hbGxvYyhzaXplb2YoKmlvX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWlvX2RhdGEpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlvX2RhdGEtPmFpbyA9IHRydWU7CisJaW9fZGF0YS0+cmVhZCA9IGZhbHNlOworCWlvX2RhdGEtPmtpb2NiID0ga2lvY2I7CisJaW9fZGF0YS0+aW92ZWMgPSBpb3ZlYzsKKwlpb19kYXRhLT5ucl9zZWdzID0gbnJfc2VnczsKKwlpb19kYXRhLT5sZW4gPSBraW9jYi0+a2lfbmJ5dGVzOworCWlvX2RhdGEtPm1tID0gY3VycmVudC0+bW07CisKKwlraW9jYi0+cHJpdmF0ZSA9IGlvX2RhdGE7CisKKwlraW9jYl9zZXRfY2FuY2VsX2ZuKGtpb2NiLCBmZnNfYWlvX2NhbmNlbCk7CisKKwlyZXR1cm4gZmZzX2VwZmlsZV9pbyhraW9jYi0+a2lfZmlscCwgaW9fZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZmc19lcGZpbGVfYWlvX3JlYWQoc3RydWN0IGtpb2NiICpraW9jYiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdmVjLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IGxvZmYpCit7CisJc3RydWN0IGZmc19pb19kYXRhICppb19kYXRhOworCXN0cnVjdCBpb3ZlYyAqaW92ZWNfY29weTsKKworCUVOVEVSKCk7CisKKwlpb3ZlY19jb3B5ID0ga21hbGxvY19hcnJheShucl9zZWdzLCBzaXplb2YoKmlvdmVjX2NvcHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWlvdmVjX2NvcHkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShpb3ZlY19jb3B5LCBpb3ZlYywgc2l6ZW9mKHN0cnVjdCBpb3ZlYykqbnJfc2Vncyk7CisKKwlpb19kYXRhID0ga21hbGxvYyhzaXplb2YoKmlvX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWlvX2RhdGEpKSB7CisJCWtmcmVlKGlvdmVjX2NvcHkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpb19kYXRhLT5haW8gPSB0cnVlOworCWlvX2RhdGEtPnJlYWQgPSB0cnVlOworCWlvX2RhdGEtPmtpb2NiID0ga2lvY2I7CisJaW9fZGF0YS0+aW92ZWMgPSBpb3ZlY19jb3B5OworCWlvX2RhdGEtPm5yX3NlZ3MgPSBucl9zZWdzOworCWlvX2RhdGEtPmxlbiA9IGtpb2NiLT5raV9uYnl0ZXM7CisJaW9fZGF0YS0+bW0gPSBjdXJyZW50LT5tbTsKKworCWtpb2NiLT5wcml2YXRlID0gaW9fZGF0YTsKKworCWtpb2NiX3NldF9jYW5jZWxfZm4oa2lvY2IsIGZmc19haW9fY2FuY2VsKTsKKworCXJldHVybiBmZnNfZXBmaWxlX2lvKGtpb2NiLT5raV9maWxwLCBpb19kYXRhKTsKK30KKwogc3RhdGljIGludAogZmZzX2VwZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpAQCAtNzg5LDYgKzEwNjAsOCBAQAogCS5vcGVuID0JCWZmc19lcGZpbGVfb3BlbiwKIAkud3JpdGUgPQlmZnNfZXBmaWxlX3dyaXRlLAogCS5yZWFkID0JCWZmc19lcGZpbGVfcmVhZCwKKwkuYWlvX3dyaXRlID0JZmZzX2VwZmlsZV9haW9fd3JpdGUsCisJLmFpb19yZWFkID0JZmZzX2VwZmlsZV9haW9fcmVhZCwKIAkucmVsZWFzZSA9CWZmc19lcGZpbGVfcmVsZWFzZSwKIAkudW5sb2NrZWRfaW9jdGwgPQlmZnNfZXBmaWxlX2lvY3RsLAogfTsKQEAgLTExNzIsNyArMTQ0NSw3IEBACiAJaWYgKGZmcy0+ZXBmaWxlcykKIAkJZmZzX2VwZmlsZXNfZGVzdHJveShmZnMtPmVwZmlsZXMsIGZmcy0+ZXBzX2NvdW50KTsKIAotCWtmcmVlKGZmcy0+cmF3X2Rlc2NzKTsKKwlrZnJlZShmZnMtPnJhd19kZXNjc19kYXRhKTsKIAlrZnJlZShmZnMtPnJhd19zdHJpbmdzKTsKIAlrZnJlZShmZnMtPnN0cmluZ3RhYnMpOwogfQpAQCAtMTE4NCwxNCArMTQ1NywxNSBAQAogCWZmc19kYXRhX2NsZWFyKGZmcyk7CiAKIAlmZnMtPmVwZmlsZXMgPSBOVUxMOworCWZmcy0+cmF3X2Rlc2NzX2RhdGEgPSBOVUxMOwogCWZmcy0+cmF3X2Rlc2NzID0gTlVMTDsKIAlmZnMtPnJhd19zdHJpbmdzID0gTlVMTDsKIAlmZnMtPnN0cmluZ3RhYnMgPSBOVUxMOwogCiAJZmZzLT5yYXdfZGVzY3NfbGVuZ3RoID0gMDsKLQlmZnMtPnJhd19mc19kZXNjc19sZW5ndGggPSAwOwogCWZmcy0+ZnNfZGVzY3NfY291bnQgPSAwOwogCWZmcy0+aHNfZGVzY3NfY291bnQgPSAwOworCWZmcy0+c3NfZGVzY3NfY291bnQgPSAwOwogCiAJZmZzLT5zdHJpbmdzX2NvdW50ID0gMDsKIAlmZnMtPmludGVyZmFjZXNfY291bnQgPSAwOwpAQCAtMTMzNCw3ICsxNjA4LDI0IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmZ1bmMtPmZmcy0+ZXBzX2xvY2ssIGZsYWdzKTsKIAlkbyB7CiAJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZHM7Ci0JCWRzID0gZXAtPmRlc2NzW2VwLT5kZXNjc1sxXSA/IDEgOiAwXTsKKwkJaW50IGRlc2NfaWR4OworCisJCWlmIChmZnMtPmdhZGdldC0+c3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKQorCQkJZGVzY19pZHggPSAyOworCQllbHNlIGlmIChmZnMtPmdhZGdldC0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCQlkZXNjX2lkeCA9IDE7CisJCWVsc2UKKwkJCWRlc2NfaWR4ID0gMDsKKworCQkvKiBmYWxsLWJhY2sgdG8gbG93ZXIgc3BlZWQgaWYgZGVzYyBtaXNzaW5nIGZvciBjdXJyZW50IHNwZWVkICovCisJCWRvIHsKKwkJCWRzID0gZXAtPmRlc2NzW2Rlc2NfaWR4XTsKKwkJfSB3aGlsZSAoIWRzICYmIC0tZGVzY19pZHggPj0gMCk7CisKKwkJaWYgKCFkcykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAKIAkJZXAtPmVwLT5kcml2ZXJfZGF0YSA9IGVwOwogCQllcC0+ZXAtPmRlc2MgPSBkczsKQEAgLTE0NjksNiArMTc2MCwxMiBAQAogCX0KIAkJYnJlYWs7CiAKKwljYXNlIFVTQl9EVF9TU19FTkRQT0lOVF9DT01QOgorCQlwcl92ZGVidWcoIkVQIFNTIGNvbXBhbmlvbiBkZXNjcmlwdG9yXG4iKTsKKwkJaWYgKGxlbmd0aCAhPSBzaXplb2Yoc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IpKQorCQkJZ290byBpbnZfbGVuZ3RoOworCQlicmVhazsKKwogCWNhc2UgVVNCX0RUX09USEVSX1NQRUVEX0NPTkZJRzoKIAljYXNlIFVTQl9EVF9JTlRFUkZBQ0VfUE9XRVI6CiAJY2FzZSBVU0JfRFRfREVCVUc6CkBAIC0xNTc5LDYwICsxODc2LDc2IEBACiBzdGF0aWMgaW50IF9fZmZzX2RhdGFfZ290X2Rlc2NzKHN0cnVjdCBmZnNfZGF0YSAqZmZzLAogCQkJCWNoYXIgKmNvbnN0IF9kYXRhLCBzaXplX3QgbGVuKQogewotCXVuc2lnbmVkIGZzX2NvdW50LCBoc19jb3VudDsKLQlpbnQgZnNfbGVuLCByZXQgPSAtRUlOVkFMOwotCWNoYXIgKmRhdGEgPSBfZGF0YTsKKwljaGFyICpkYXRhID0gX2RhdGEsICpyYXdfZGVzY3M7CisJdW5zaWduZWQgY291bnRzWzNdLCBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTlZBTCwgaTsKIAogCUVOVEVSKCk7CiAKLQlpZiAodW5saWtlbHkoZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEpICE9IEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUMgfHwKLQkJICAgICBnZXRfdW5hbGlnbmVkX2xlMzIoZGF0YSArIDQpICE9IGxlbikpCisJaWYgKGdldF91bmFsaWduZWRfbGUzMihkYXRhICsgNCkgIT0gbGVuKQogCQlnb3RvIGVycm9yOwotCWZzX2NvdW50ID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEgKyAgOCk7Ci0JaHNfY291bnQgPSBnZXRfdW5hbGlnbmVkX2xlMzIoZGF0YSArIDEyKTsKIAotCWlmICghZnNfY291bnQgJiYgIWhzX2NvdW50KQotCQlnb3RvIGVpbnZhbDsKLQotCWRhdGEgKz0gMTY7Ci0JbGVuICAtPSAxNjsKLQotCWlmIChsaWtlbHkoZnNfY291bnQpKSB7Ci0JCWZzX2xlbiA9IGZmc19kb19kZXNjcyhmc19jb3VudCwgZGF0YSwgbGVuLAotCQkJCSAgICAgIF9fZmZzX2RhdGFfZG9fZW50aXR5LCBmZnMpOwotCQlpZiAodW5saWtlbHkoZnNfbGVuIDwgMCkpIHsKLQkJCXJldCA9IGZzX2xlbjsKKwlzd2l0Y2ggKGdldF91bmFsaWduZWRfbGUzMihkYXRhKSkgeworCWNhc2UgRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQzoKKwkJZmxhZ3MgPSBGVU5DVElPTkZTX0hBU19GU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfSFNfREVTQzsKKwkJZGF0YSArPSA4OworCQlsZW4gIC09IDg7CisJCWJyZWFrOworCWNhc2UgRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQ19WMjoKKwkJZmxhZ3MgPSBnZXRfdW5hbGlnbmVkX2xlMzIoZGF0YSArIDgpOworCQlpZiAoZmxhZ3MgJiB+KEZVTkNUSU9ORlNfSEFTX0ZTX0RFU0MgfAorCQkJICAgICAgRlVOQ1RJT05GU19IQVNfSFNfREVTQyB8CisJCQkgICAgICBGVU5DVElPTkZTX0hBU19TU19ERVNDKSkgeworCQkJcmV0ID0gLUVOT1NZUzsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KLQotCQlkYXRhICs9IGZzX2xlbjsKLQkJbGVuICAtPSBmc19sZW47Ci0JfSBlbHNlIHsKLQkJZnNfbGVuID0gMDsKKwkJZGF0YSArPSAxMjsKKwkJbGVuICAtPSAxMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnJvcjsKIAl9CiAKLQlpZiAobGlrZWx5KGhzX2NvdW50KSkgewotCQlyZXQgPSBmZnNfZG9fZGVzY3MoaHNfY291bnQsIGRhdGEsIGxlbiwKLQkJCQkgICBfX2Zmc19kYXRhX2RvX2VudGl0eSwgZmZzKTsKLQkJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCS8qIFJlYWQgZnNfY291bnQsIGhzX2NvdW50IGFuZCBzc19jb3VudCAoaWYgcHJlc2VudCkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCWlmICghKGZsYWdzICYgKDEgPDwgaSkpKSB7CisJCQljb3VudHNbaV0gPSAwOworCQl9IGVsc2UgaWYgKGxlbiA8IDQpIHsKIAkJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWNvdW50c1tpXSA9IGdldF91bmFsaWduZWRfbGUzMihkYXRhKTsKKwkJCWRhdGEgKz0gNDsKKwkJCWxlbiAgLT0gNDsKKwkJfQogCX0KIAotCWlmICh1bmxpa2VseShsZW4gIT0gcmV0KSkKLQkJZ290byBlaW52YWw7CisJLyogUmVhZCBkZXNjcmlwdG9ycyAqLworCXJhd19kZXNjcyA9IGRhdGE7CisJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworCQlpZiAoIWNvdW50c1tpXSkKKwkJCWNvbnRpbnVlOworCQlyZXQgPSBmZnNfZG9fZGVzY3MoY291bnRzW2ldLCBkYXRhLCBsZW4sCisJCQkJICAgX19mZnNfZGF0YV9kb19lbnRpdHksIGZmcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZGF0YSArPSByZXQ7CisJCWxlbiAgLT0gcmV0OworCX0KIAotCWZmcy0+cmF3X2ZzX2Rlc2NzX2xlbmd0aCA9IGZzX2xlbjsKLQlmZnMtPnJhd19kZXNjc19sZW5ndGggICAgPSBmc19sZW4gKyByZXQ7Ci0JZmZzLT5yYXdfZGVzY3MgICAgICAgICAgID0gX2RhdGE7Ci0JZmZzLT5mc19kZXNjc19jb3VudCAgICAgID0gZnNfY291bnQ7Ci0JZmZzLT5oc19kZXNjc19jb3VudCAgICAgID0gaHNfY291bnQ7CisJaWYgKHJhd19kZXNjcyA9PSBkYXRhIHx8IGxlbikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWZmcy0+cmF3X2Rlc2NzX2RhdGEJPSBfZGF0YTsKKwlmZnMtPnJhd19kZXNjcwkJPSByYXdfZGVzY3M7CisJZmZzLT5yYXdfZGVzY3NfbGVuZ3RoCT0gZGF0YSAtIHJhd19kZXNjczsKKwlmZnMtPmZzX2Rlc2NzX2NvdW50CT0gY291bnRzWzBdOworCWZmcy0+aHNfZGVzY3NfY291bnQJPSBjb3VudHNbMV07CisJZmZzLT5zc19kZXNjc19jb3VudAk9IGNvdW50c1syXTsKIAogCXJldHVybiAwOwogCi1laW52YWw6Ci0JcmV0ID0gLUVJTlZBTDsKIGVycm9yOgogCWtmcmVlKF9kYXRhKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTc4OSw3ICsyMTAyLDcgQEAKIAkgKiB0aGUgc291cmNlIGRvZXMgbm90aGluZy4KIAkgKi8KIAlpZiAoZmZzLT5zZXR1cF9zdGF0ZSA9PSBGRlNfU0VUVVBfUEVORElORykKLQkJZmZzLT5zZXR1cF9zdGF0ZSA9IEZGU19TRVRVUF9DQU5DRUxFRDsKKwkJZmZzLT5zZXR1cF9zdGF0ZSA9IEZGU19TRVRVUF9DQU5DRUxMRUQ7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEZVTkNUSU9ORlNfUkVTVU1FOgpAQCAtMTg1MCwyMSArMjE2MywyOCBAQAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZHMgPSAodm9pZCAqKWRlc2M7CiAJc3RydWN0IGZmc19mdW5jdGlvbiAqZnVuYyA9IHByaXY7CiAJc3RydWN0IGZmc19lcCAqZmZzX2VwOwotCi0JLyoKLQkgKiBJZiBoc19kZXNjcmlwdG9ycyBpcyBub3QgTlVMTCB0aGVuIHdlIGFyZSByZWFkaW5nIGhzCi0JICogZGVzY3JpcHRvcnMgbm93Ci0JICovCi0JY29uc3QgaW50IGlzSFMgPSBmdW5jLT5mdW5jdGlvbi5oc19kZXNjcmlwdG9ycyAhPSBOVUxMOwotCXVuc2lnbmVkIGlkeDsKKwl1bnNpZ25lZCBlcF9kZXNjX2lkLCBpZHg7CisJc3RhdGljIGNvbnN0IGNoYXIgKnNwZWVkX25hbWVzW10gPSB7ICJmdWxsIiwgImhpZ2giLCAic3VwZXIiIH07CiAKIAlpZiAodHlwZSAhPSBGRlNfREVTQ1JJUFRPUikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoaXNIUykKKwkvKgorCSAqIElmIHNzX2Rlc2NyaXB0b3JzIGlzIG5vdCBOVUxMLCB3ZSBhcmUgcmVhZGluZyBzdXBlciBzcGVlZAorCSAqIGRlc2NyaXB0b3JzOyBpZiBoc19kZXNjcmlwdG9ycyBpcyBub3QgTlVMTCwgd2UgYXJlIHJlYWRpbmcgaGlnaAorCSAqIHNwZWVkIGRlc2NyaXB0b3JzOyBvdGhlcndpc2UsIHdlIGFyZSByZWFkaW5nIGZ1bGwgc3BlZWQKKwkgKiBkZXNjcmlwdG9ycy4KKwkgKi8KKwlpZiAoZnVuYy0+ZnVuY3Rpb24uc3NfZGVzY3JpcHRvcnMpIHsKKwkJZXBfZGVzY19pZCA9IDI7CisJCWZ1bmMtPmZ1bmN0aW9uLnNzX2Rlc2NyaXB0b3JzWyhsb25nKXZhbHVlcF0gPSBkZXNjOworCX0gZWxzZSBpZiAoZnVuYy0+ZnVuY3Rpb24uaHNfZGVzY3JpcHRvcnMpIHsKKwkJZXBfZGVzY19pZCA9IDE7CiAJCWZ1bmMtPmZ1bmN0aW9uLmhzX2Rlc2NyaXB0b3JzWyhsb25nKXZhbHVlcF0gPSBkZXNjOwotCWVsc2UKKwl9IGVsc2UgeworCQllcF9kZXNjX2lkID0gMDsKIAkJZnVuYy0+ZnVuY3Rpb24uZnNfZGVzY3JpcHRvcnNbKGxvbmcpdmFsdWVwXSAgICA9IGRlc2M7CisJfQogCiAJaWYgKCFkZXNjIHx8IGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpCiAJCXJldHVybiAwOwpAQCAtMTg3MiwxMyArMjE5MiwxMyBAQAogCWlkeCA9IChkcy0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSykgLSAxOwogCWZmc19lcCA9IGZ1bmMtPmVwcyArIGlkeDsKIAotCWlmICh1bmxpa2VseShmZnNfZXAtPmRlc2NzW2lzSFNdKSkgewotCQlwcl92ZGVidWcoInR3byAlc3NwZWVkIGRlc2NyaXB0b3JzIGZvciBFUCAlZFxuIiwKLQkJCSAgaXNIUyA/ICJoaWdoIiA6ICJmdWxsIiwKKwlpZiAodW5saWtlbHkoZmZzX2VwLT5kZXNjc1tlcF9kZXNjX2lkXSkpIHsKKwkJcHJfZXJyKCJ0d28gJXNzcGVlZCBkZXNjcmlwdG9ycyBmb3IgRVAgJWRcbiIsCisJCQkgIHNwZWVkX25hbWVzW2VwX2Rlc2NfaWRdLAogCQkJICBkcy0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlmZnNfZXAtPmRlc2NzW2lzSFNdID0gZHM7CisJZmZzX2VwLT5kZXNjc1tlcF9kZXNjX2lkXSA9IGRzOwogCiAJZmZzX2R1bXBfbWVtKCI6IE9yaWdpbmFsICBlcCBkZXNjIiwgZHMsIGRzLT5iTGVuZ3RoKTsKIAlpZiAoZmZzX2VwLT5lcCkgewpAQCAtMjAyMiw4ICsyMzQyLDEwIEBACiAJY29uc3QgaW50IGZ1bGwgPSAhIWZ1bmMtPmZmcy0+ZnNfZGVzY3NfY291bnQ7CiAJY29uc3QgaW50IGhpZ2ggPSBnYWRnZXRfaXNfZHVhbHNwZWVkKGZ1bmMtPmdhZGdldCkgJiYKIAkJZnVuYy0+ZmZzLT5oc19kZXNjc19jb3VudDsKKwljb25zdCBpbnQgc3VwZXIgPSBnYWRnZXRfaXNfc3VwZXJzcGVlZChmdW5jLT5nYWRnZXQpICYmCisJCWZ1bmMtPmZmcy0+c3NfZGVzY3NfY291bnQ7CiAKLQlpbnQgcmV0OworCWludCBmc19sZW4sIGhzX2xlbiwgcmV0OwogCiAJLyogTWFrZSBpdCBhIHNpbmdsZSBjaHVuaywgbGVzcyBtYW5hZ2VtZW50IGxhdGVyIG9uICovCiAJdmxhX2dyb3VwKGQpOwpAQCAtMjAzMiwxNSArMjM1NCwxNiBAQAogCQlmdWxsID8gZmZzLT5mc19kZXNjc19jb3VudCArIDEgOiAwKTsKIAl2bGFfaXRlbV93aXRoX3N6KGQsIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKiwgaHNfZGVzY3MsCiAJCWhpZ2ggPyBmZnMtPmhzX2Rlc2NzX2NvdW50ICsgMSA6IDApOworCXZsYV9pdGVtX3dpdGhfc3ooZCwgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqLCBzc19kZXNjcywKKwkJc3VwZXIgPyBmZnMtPnNzX2Rlc2NzX2NvdW50ICsgMSA6IDApOwogCXZsYV9pdGVtX3dpdGhfc3ooZCwgc2hvcnQsIGludW1zLCBmZnMtPmludGVyZmFjZXNfY291bnQpOwotCXZsYV9pdGVtX3dpdGhfc3ooZCwgY2hhciwgcmF3X2Rlc2NzLAotCQloaWdoID8gZmZzLT5yYXdfZGVzY3NfbGVuZ3RoIDogZmZzLT5yYXdfZnNfZGVzY3NfbGVuZ3RoKTsKKwl2bGFfaXRlbV93aXRoX3N6KGQsIGNoYXIsIHJhd19kZXNjcywgZmZzLT5yYXdfZGVzY3NfbGVuZ3RoKTsKIAljaGFyICp2bGFidWY7CiAKIAlFTlRFUigpOwogCi0JLyogT25seSBoaWdoIHNwZWVkIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGdhZGdldD8gKi8KLQlpZiAodW5saWtlbHkoIShmdWxsIHwgaGlnaCkpKQorCS8qIEhhcyBkZXNjcmlwdG9ycyBvbmx5IGZvciBzcGVlZHMgZ2FkZ2V0IGRvZXMgbm90IHN1cHBvcnQgKi8KKwlpZiAodW5saWtlbHkoIShmdWxsIHwgaGlnaCB8IHN1cGVyKSkpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKIAkvKiBBbGxvY2F0ZSBhIHNpbmdsZSBjaHVuaywgbGVzcyBtYW5hZ2VtZW50IGxhdGVyIG9uICovCkBAIC0yMDUwLDggKzIzNzMsMTAgQEAKIAogCS8qIFplcm8gKi8KIAltZW1zZXQodmxhX3B0cih2bGFidWYsIGQsIGVwcyksIDAsIGRfZXBzX19zeik7Ci0JbWVtY3B5KHZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpLCBmZnMtPnJhd19kZXNjcyArIDE2LAotCSAgICAgICBkX3Jhd19kZXNjc19fc3opOworCS8qIENvcHkgZGVzY3JpcHRvcnMgICovCisJbWVtY3B5KHZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpLCBmZnMtPnJhd19kZXNjcywKKwkgICAgICAgZmZzLT5yYXdfZGVzY3NfbGVuZ3RoKTsKKwogCW1lbXNldCh2bGFfcHRyKHZsYWJ1ZiwgZCwgaW51bXMpLCAweGZmLCBkX2ludW1zX19zeik7CiAJZm9yIChyZXQgPSBmZnMtPmVwc19jb3VudDsgcmV0OyAtLXJldCkgewogCQlzdHJ1Y3QgZmZzX2VwICpwdHI7CkBAIC0yMDczLDIyICsyMzk4LDM4IEBACiAJICovCiAJaWYgKGxpa2VseShmdWxsKSkgewogCQlmdW5jLT5mdW5jdGlvbi5mc19kZXNjcmlwdG9ycyA9IHZsYV9wdHIodmxhYnVmLCBkLCBmc19kZXNjcyk7Ci0JCXJldCA9IGZmc19kb19kZXNjcyhmZnMtPmZzX2Rlc2NzX2NvdW50LAotCQkJCSAgIHZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpLAotCQkJCSAgIGRfcmF3X2Rlc2NzX19zeiwKLQkJCQkgICBfX2Zmc19mdW5jX2JpbmRfZG9fZGVzY3MsIGZ1bmMpOwotCQlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCWZzX2xlbiA9IGZmc19kb19kZXNjcyhmZnMtPmZzX2Rlc2NzX2NvdW50LAorCQkJCSAgICAgIHZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpLAorCQkJCSAgICAgIGRfcmF3X2Rlc2NzX19zeiwKKwkJCQkgICAgICBfX2Zmc19mdW5jX2JpbmRfZG9fZGVzY3MsIGZ1bmMpOworCQlpZiAodW5saWtlbHkoZnNfbGVuIDwgMCkpIHsKKwkJCXJldCA9IGZzX2xlbjsKIAkJCWdvdG8gZXJyb3I7CisJCX0KIAl9IGVsc2UgewotCQlyZXQgPSAwOworCQlmc19sZW4gPSAwOwogCX0KIAogCWlmIChsaWtlbHkoaGlnaCkpIHsKIAkJZnVuYy0+ZnVuY3Rpb24uaHNfZGVzY3JpcHRvcnMgPSB2bGFfcHRyKHZsYWJ1ZiwgZCwgaHNfZGVzY3MpOwotCQlyZXQgPSBmZnNfZG9fZGVzY3MoZmZzLT5oc19kZXNjc19jb3VudCwKLQkJCQkgICB2bGFfcHRyKHZsYWJ1ZiwgZCwgcmF3X2Rlc2NzKSArIHJldCwKLQkJCQkgICBkX3Jhd19kZXNjc19fc3ogLSByZXQsCi0JCQkJICAgX19mZnNfZnVuY19iaW5kX2RvX2Rlc2NzLCBmdW5jKTsKKwkJaHNfbGVuID0gZmZzX2RvX2Rlc2NzKGZmcy0+aHNfZGVzY3NfY291bnQsCisJCQkJICAgICAgdmxhX3B0cih2bGFidWYsIGQsIHJhd19kZXNjcykgKyBmc19sZW4sCisJCQkJICAgICAgZF9yYXdfZGVzY3NfX3N6IC0gZnNfbGVuLAorCQkJCSAgICAgIF9fZmZzX2Z1bmNfYmluZF9kb19kZXNjcywgZnVuYyk7CisJCWlmICh1bmxpa2VseShoc19sZW4gPCAwKSkgeworCQkJcmV0ID0gaHNfbGVuOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0gZWxzZSB7CisJCWhzX2xlbiA9IDA7CisJfQorCisJaWYgKGxpa2VseShzdXBlcikpIHsKKwkJZnVuYy0+ZnVuY3Rpb24uc3NfZGVzY3JpcHRvcnMgPSB2bGFfcHRyKHZsYWJ1ZiwgZCwgc3NfZGVzY3MpOworCQlyZXQgPSBmZnNfZG9fZGVzY3MoZmZzLT5zc19kZXNjc19jb3VudCwKKwkJCQl2bGFfcHRyKHZsYWJ1ZiwgZCwgcmF3X2Rlc2NzKSArIGZzX2xlbiArIGhzX2xlbiwKKwkJCQlkX3Jhd19kZXNjc19fc3ogLSBmc19sZW4gLSBoc19sZW4sCisJCQkJX19mZnNfZnVuY19iaW5kX2RvX2Rlc2NzLCBmdW5jKTsKIAkJaWYgKHVubGlrZWx5KHJldCA8IDApKQogCQkJZ290byBlcnJvcjsKIAl9CkBAIC0yMDk5LDcgKzI0NDAsOCBAQAogCSAqIG5vdy4KIAkgKi8KIAlyZXQgPSBmZnNfZG9fZGVzY3MoZmZzLT5mc19kZXNjc19jb3VudCArCi0JCQkgICAoaGlnaCA/IGZmcy0+aHNfZGVzY3NfY291bnQgOiAwKSwKKwkJCSAgIChoaWdoID8gZmZzLT5oc19kZXNjc19jb3VudCA6IDApICsKKwkJCSAgIChzdXBlciA/IGZmcy0+c3NfZGVzY3NfY291bnQgOiAwKSwKIAkJCSAgIHZsYV9wdHIodmxhYnVmLCBkLCByYXdfZGVzY3MpLCBkX3Jhd19kZXNjc19fc3osCiAJCQkgICBfX2Zmc19mdW5jX2JpbmRfZG9fbnVtcywgZnVuYyk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKQpAQCAtMjI1OCw3ICsyNjAwLDcgQEAKIAogc3RhdGljIExJU1RfSEVBRChmZnNfZGV2aWNlcyk7CiAKLXN0YXRpYyBzdHJ1Y3QgZmZzX2RldiAqX2Zmc19maW5kX2Rldihjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpfZmZzX2RvX2ZpbmRfZGV2KGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGZmc19kZXYgKmRldjsKIApAQCAtMjI3NSw3ICsyNjE3LDcgQEAKIC8qCiAgKiBmZnNfbG9jayBtdXN0IGJlIHRha2VuIGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbgogICovCi1zdGF0aWMgc3RydWN0IGZmc19kZXYgKmZmc19nZXRfc2luZ2xlX2Rldih2b2lkKQorc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpfZmZzX2dldF9zaW5nbGVfZGV2KHZvaWQpCiB7CiAJc3RydWN0IGZmc19kZXYgKmRldjsKIApAQCAtMjI5MSwxNSArMjYzMywxNSBAQAogLyoKICAqIGZmc19sb2NrIG11c3QgYmUgdGFrZW4gYnkgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmZzX2RldiAqZmZzX2ZpbmRfZGV2KGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgc3RydWN0IGZmc19kZXYgKl9mZnNfZmluZF9kZXYoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZmZzX2RldiAqZGV2OwogCi0JZGV2ID0gZmZzX2dldF9zaW5nbGVfZGV2KCk7CisJZGV2ID0gX2Zmc19nZXRfc2luZ2xlX2RldigpOwogCWlmIChkZXYpCiAJCXJldHVybiBkZXY7CiAKLQlyZXR1cm4gX2Zmc19maW5kX2RldihuYW1lKTsKKwlyZXR1cm4gX2Zmc19kb19maW5kX2RldihuYW1lKTsKIH0KIAogLyogQ29uZmlnZnMgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzM1LDcgKzI2NzcsNyBAQAogCiAJb3B0cyA9IHRvX2ZfZnNfb3B0cyhmKTsKIAlmZnNfZGV2X2xvY2soKTsKLQlmZnNfZnJlZV9kZXYob3B0cy0+ZGV2KTsKKwlfZmZzX2ZyZWVfZGV2KG9wdHMtPmRldik7CiAJZmZzX2Rldl91bmxvY2soKTsKIAlrZnJlZShvcHRzKTsKIH0KQEAgLTIzOTAsNyArMjczMiw3IEBACiAJb3B0cy0+ZnVuY19pbnN0LnNldF9pbnN0X25hbWUgPSBmZnNfc2V0X2luc3RfbmFtZTsKIAlvcHRzLT5mdW5jX2luc3QuZnJlZV9mdW5jX2luc3QgPSBmZnNfZnJlZV9pbnN0OwogCWZmc19kZXZfbG9jaygpOwotCWRldiA9IGZmc19hbGxvY19kZXYoKTsKKwlkZXYgPSBfZmZzX2FsbG9jX2RldigpOwogCWZmc19kZXZfdW5sb2NrKCk7CiAJaWYgKElTX0VSUihkZXYpKSB7CiAJCWtmcmVlKG9wdHMpOwpAQCAtMjQ0Niw2ICsyNzg4LDcgQEAKIAkgKi8KIAlmdW5jLT5mdW5jdGlvbi5mc19kZXNjcmlwdG9ycyA9IE5VTEw7CiAJZnVuYy0+ZnVuY3Rpb24uaHNfZGVzY3JpcHRvcnMgPSBOVUxMOworCWZ1bmMtPmZ1bmN0aW9uLnNzX2Rlc2NyaXB0b3JzID0gTlVMTDsKIAlmdW5jLT5pbnRlcmZhY2VzX251bXMgPSBOVUxMOwogCiAJZmZzX2V2ZW50X2FkZChmZnMsIEZVTkNUSU9ORlNfVU5CSU5EKTsKQEAgLTI0NzgsMTIgKzI4MjEsMTIgQEAKIC8qCiAgKiBmZnNfbG9jayBtdXN0IGJlIHRha2VuIGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbgogICovCi1zdHJ1Y3QgZmZzX2RldiAqZmZzX2FsbG9jX2Rldih2b2lkKQorc3RhdGljIHN0cnVjdCBmZnNfZGV2ICpfZmZzX2FsbG9jX2Rldih2b2lkKQogewogCXN0cnVjdCBmZnNfZGV2ICpkZXY7CiAJaW50IHJldDsKIAotCWlmIChmZnNfZ2V0X3NpbmdsZV9kZXYoKSkKKwlpZiAoX2Zmc19nZXRfc2luZ2xlX2RldigpKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKQEAgLTI1MTEsMTAgKzI4NTQsMTAgQEAKIHsKIAlzdHJ1Y3QgZmZzX2RldiAqZXhpc3Rpbmc7CiAKLQlleGlzdGluZyA9IF9mZnNfZmluZF9kZXYobmFtZSk7CisJZXhpc3RpbmcgPSBfZmZzX2RvX2ZpbmRfZGV2KG5hbWUpOwogCWlmIChleGlzdGluZykKIAkJcmV0dXJuIC1FQlVTWTsKLQkKKwogCWRldi0+bmFtZSA9IG5hbWU7CiAKIAlyZXR1cm4gMDsKQEAgLTI1NTUsNyArMjg5OCw3IEBACiAvKgogICogZmZzX2xvY2sgbXVzdCBiZSB0YWtlbiBieSB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24KICAqLwotdm9pZCBmZnNfZnJlZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldikKK3N0YXRpYyB2b2lkIF9mZnNfZnJlZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldikKIHsKIAlsaXN0X2RlbCgmZGV2LT5lbnRyeSk7CiAJaWYgKGRldi0+bmFtZV9hbGxvY2F0ZWQpCkBAIC0yNTcyLDcgKzI5MTUsNyBAQAogCUVOVEVSKCk7CiAJZmZzX2Rldl9sb2NrKCk7CiAKLQlmZnNfZGV2ID0gZmZzX2ZpbmRfZGV2KGRldl9uYW1lKTsKKwlmZnNfZGV2ID0gX2Zmc19maW5kX2RldihkZXZfbmFtZSk7CiAJaWYgKCFmZnNfZGV2KQogCQlmZnNfZGV2ID0gRVJSX1BUUigtRU5PREVWKTsKIAllbHNlIGlmIChmZnNfZGV2LT5tb3VudGVkKQpAQCAtMjU5NSwxMSArMjkzOCwxMiBAQAogCWZmc19kZXZfbG9jaygpOwogCiAJZmZzX2RldiA9IGZmc19kYXRhLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGZmc19kZXYpCisJaWYgKGZmc19kZXYpIHsKIAkJZmZzX2Rldi0+bW91bnRlZCA9IGZhbHNlOwotCQotCWlmIChmZnNfZGV2LT5mZnNfcmVsZWFzZV9kZXZfY2FsbGJhY2spCi0JCWZmc19kZXYtPmZmc19yZWxlYXNlX2Rldl9jYWxsYmFjayhmZnNfZGV2KTsKKworCQlpZiAoZmZzX2Rldi0+ZmZzX3JlbGVhc2VfZGV2X2NhbGxiYWNrKQorCQkJZmZzX2Rldi0+ZmZzX3JlbGVhc2VfZGV2X2NhbGxiYWNrKGZmc19kZXYpOworCX0KIAogCWZmc19kZXZfdW5sb2NrKCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9taWRpLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9taWRpLmMKaW5kZXggMzZkNGJiMi4uODA3YjMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWlkaS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX21pZGkuYwpAQCAtNjY0LDkgKzY2NCwxMCBAQAogCQkuZGV2X2ZyZWUgPSBmX21pZGlfc25kX2ZyZWUsCiAJfTsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShtaWRpLT5pbmRleCwgbWlkaS0+aWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZtaWRpLT5nYWRnZXQtPmRldiwgbWlkaS0+aW5kZXgsIG1pZGktPmlkLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlFUlJPUihtaWRpLCAic25kX2NhcmRfY3JlYXRlKCkgZmFpbGVkXG4iKTsKKwkJRVJST1IobWlkaSwgInNuZF9jYXJkX25ldygpIGZhaWxlZFxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAJbWlkaS0+Y2FyZCA9IGNhcmQ7CkBAIC03MDMsOCArNzA0LDYgQEAKIAlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9PVVRQVVQsICZnbWlkaV9pbl9vcHMpOwogCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULCAmZ21pZGlfb3V0X29wcyk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtaWRpLT5nYWRnZXQtPmRldik7Ci0KIAkvKiByZWdpc3RlciBpdCAtIHdlJ3JlIHJlYWR5IHRvIGdvICovCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3N1YnNldC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMKaW5kZXggZjFhNTkxOS4uZGY0YTBkY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3N1YnNldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3N1YnNldC5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAl9CiAKIAluZXQgPSBnZXRoZXJfY29ubmVjdCgmZ2V0aC0+cG9ydCk7Ci0JcmV0dXJuIElTX0VSUihuZXQpID8gUFRSX0VSUihuZXQpIDogMDsKKwlyZXR1cm4gUFRSX1JFVChuZXQpOwogfQogCiBzdGF0aWMgdm9pZCBnZXRoX2Rpc2FibGUoc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3VhYzIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3VhYzIuYwppbmRleCAyZjIzNTY2Li5iYzIzMDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl91YWMyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdWFjMi5jCkBAIC0zOTQsNyArMzk0LDcgQEAKIAlpbnQgZXJyOwogCiAJLyogQ2hvb3NlIGFueSBzbG90LCB3aXRoIG5vIGlkICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xLCBOVUxMLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCAtMSwgTlVMTCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNDIxLDggKzQyMSw2IEBACiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlVBQzJfR2FkZ2V0Iik7CiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIlVBQzJfR2FkZ2V0ICVpIiwgcGRldi0+aWQpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKLQogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTLAogCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwgMCwgQlVGRl9TSVpFX01BWCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ncl91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ncl91ZGMuYwppbmRleCA5MTRjYmQ4Li5mOTg0ZWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ3JfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dyX3VkYy5jCkBAIC0yMjUsMTQgKzIyNSw4IEBACiAJY29uc3QgY2hhciAqbmFtZSA9ICJncl91ZGNfc3RhdGUiOwogCiAJZGV2LT5kZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihkZXZfbmFtZShkZXYtPmRldiksIE5VTEwpOwotCWlmIChJU19FUlIoZGV2LT5kZnNfcm9vdCkpIHsKLQkJZGV2X2VycihkZXYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnlcbiIpOwotCQlyZXR1cm47Ci0JfQotCWRldi0+ZGZzX3N0YXRlID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwNDQ0LCBkZXYtPmRmc19yb290LAotCQkJCQkgICAgIGRldiwgJmdyX2Rmc19mb3BzKTsKLQlpZiAoSVNfRVJSKGRldi0+ZGZzX3N0YXRlKSkKLQkJZGV2X2VycihkZXYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBmaWxlICVzXG4iLCBuYW1lKTsKKwlkZXYtPmRmc19zdGF0ZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDQ0NCwgZGV2LT5kZnNfcm9vdCwgZGV2LAorCQkJCQkgICAgICZncl9kZnNfZm9wcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdyX2Rmc19kZWxldGUoc3RydWN0IGdyX3VkYyAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwppbmRleCBiOTRjMDQ5Li5iNWJlNmYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKQEAgLTQzOSwxMSArNDM5LDkgQEAKIAkvKiBGSVhNRSB3cml0ZWJlaGluZCBmb3IgT19OT05CTE9DSyBhbmQgcG9sbCgpLCBxbGVuID0gMSAqLwogCiAJdmFsdWUgPSAtRU5PTUVNOwotCWtidWYgPSBrbWFsbG9jIChsZW4sIEdGUF9LRVJORUwpOwotCWlmICgha2J1ZikKLQkJZ290byBmcmVlMTsKLQlpZiAoY29weV9mcm9tX3VzZXIgKGtidWYsIGJ1ZiwgbGVuKSkgewotCQl2YWx1ZSA9IC1FRkFVTFQ7CisJa2J1ZiA9IG1lbWR1cF91c2VyKGJ1ZiwgbGVuKTsKKwlpZiAoIWtidWYpIHsKKwkJdmFsdWUgPSBQVFJfRVJSKGtidWYpOwogCQlnb3RvIGZyZWUxOwogCX0KIApAQCAtNDUyLDcgKzQ1MCw2IEBACiAJCWRhdGEtPm5hbWUsIGxlbiwgKGludCkgdmFsdWUpOwogZnJlZTE6CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQlrZnJlZSAoa2J1Zik7CiAJcmV0dXJuIHZhbHVlOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbHBjMzJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9scGMzMnh4X3VkYy5jCmluZGV4IDA0OWViYWIuLmExMzk4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9scGMzMnh4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9scGMzMnh4X3VkYy5jCkBAIC0zMjk1LDkgKzMyOTUsOSBAQAogcGxsX3NldF9mYWlsOgogCWNsa19kaXNhYmxlKHVkYy0+dXNiX3BsbF9jbGspOwogcGxsX2VuYWJsZV9mYWlsOgotCWNsa19wdXQodWRjLT51c2Jfc2x2X2Nsayk7Ci11c2Jfb3RnX2Nsa19nZXRfZmFpbDoKIAljbGtfcHV0KHVkYy0+dXNiX290Z19jbGspOwordXNiX290Z19jbGtfZ2V0X2ZhaWw6CisJY2xrX3B1dCh1ZGMtPnVzYl9zbHZfY2xrKTsKIHVzYl9jbGtfZ2V0X2ZhaWw6CiAJY2xrX3B1dCh1ZGMtPnVzYl9wbGxfY2xrKTsKIHBsbF9nZXRfZmFpbDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCmluZGV4IDY5Yjc2ZWYuLjY0NzQwODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYwpAQCAtNDI3LDEyICs0MjcsMTcgQEAKIAkJcmVxLT5sZW5ndGggPSBVU0JfQlVGU0laRTsKIAkJcmVxLT5jb21wbGV0ZSA9IHJ4X2NvbXBsZXRlOwogCisJCS8qIGhlcmUsIHdlIHVubG9jaywgYW5kIG9ubHkgdW5sb2NrLCB0byBhdm9pZCBkZWFkbG9jay4gKi8KKwkJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CiAJCWVycm9yID0gdXNiX2VwX3F1ZXVlKGRldi0+b3V0X2VwLCByZXEsIEdGUF9BVE9NSUMpOworCQlzcGluX2xvY2soJmRldi0+bG9jayk7CiAJCWlmIChlcnJvcikgewogCQkJREJHKGRldiwgInJ4IHN1Ym1pdCAtLT4gJWRcbiIsIGVycm9yKTsKIAkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwogCQkJYnJlYWs7Ci0JCX0gZWxzZSB7CisJCX0KKwkJLyogaWYgdGhlIHJlcSBpcyBlbXB0eSwgdGhlbiBhZGQgaXQgaW50byBkZXYtPnJ4X3JlcXNfYWN0aXZlLiAqLworCQllbHNlIGlmIChsaXN0X2VtcHR5KCZyZXEtPmxpc3QpKSB7CiAJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzX2FjdGl2ZSk7CiAJCX0KIAl9CkBAIC0xMTMzLDYgKzExMzgsNyBAQAogCQkJCSAgTlVMTCwgImdfcHJpbnRlciIpOwogCWlmIChJU19FUlIoZGV2LT5wZGV2KSkgewogCQlFUlJPUihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIGRldmljZTogZ19wcmludGVyXG4iKTsKKwkJc3RhdHVzID0gUFRSX0VSUihkZXYtPnBkZXYpOwogCQlnb3RvIGZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMKaW5kZXggMTE3MmVhZS4uMmE5Y2I2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc290Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYwpAQCAtNjE3LDcgKzYxNyw3IEBACiAJdG9fd3JpdGUgPSBESVZfUk9VTkRfVVAodG9fd3JpdGUsIDQpOwogCWRhdGEgPSBoc19yZXEtPnJlcS5idWYgKyBidWZfcG9zOwogCi0Jd3JpdGVzbChoc290Zy0+cmVncyArIEVQRklGTyhoc19lcC0+aW5kZXgpLCBkYXRhLCB0b193cml0ZSk7CisJaW93cml0ZTMyX3JlcChoc290Zy0+cmVncyArIEVQRklGTyhoc19lcC0+aW5kZXgpLCBkYXRhLCB0b193cml0ZSk7CiAKIAlyZXR1cm4gKHRvX3dyaXRlID49IGNhbl93cml0ZSkgPyAtRU5PU1BDIDogMDsKIH0KQEAgLTcyMCw4ICs3MjAsOCBAQAogCQl1cmVxLT5sZW5ndGgsIHVyZXEtPmFjdHVhbCk7CiAJaWYgKDApCiAJCWRldl9kYmcoaHNvdGctPmRldiwKLQkJCSJSRVEgYnVmICVwIGxlbiAlZCBkbWEgMHglMDh4IG5vaT0lZCB6cD0lZCBzbm9rPSVkXG4iLAotCQkJdXJlcS0+YnVmLCBsZW5ndGgsIHVyZXEtPmRtYSwKKwkJCSJSRVEgYnVmICVwIGxlbiAlZCBkbWEgMHglcGFkIG5vaT0lZCB6cD0lZCBzbm9rPSVkXG4iLAorCQkJdXJlcS0+YnVmLCBsZW5ndGgsICZ1cmVxLT5kbWEsCiAJCQl1cmVxLT5ub19pbnRlcnJ1cHQsIHVyZXEtPnplcm8sIHVyZXEtPnNob3J0X25vdF9vayk7CiAKIAltYXhyZXEgPSBnZXRfZXBfbGltaXQoaHNfZXApOwpAQCAtNzg5LDggKzc4OSw4IEBACiAJCWRtYV9yZWcgPSBkaXJfaW4gPyBESUVQRE1BKGluZGV4KSA6IERPRVBETUEoaW5kZXgpOwogCQl3cml0ZWwodXJlcS0+ZG1hLCBoc290Zy0+cmVncyArIGRtYV9yZWcpOwogCi0JCWRldl9kYmcoaHNvdGctPmRldiwgIiVzOiAweCUwOHggPT4gMHglMDh4XG4iLAotCQkJX19mdW5jX18sIHVyZXEtPmRtYSwgZG1hX3JlZyk7CisJCWRldl9kYmcoaHNvdGctPmRldiwgIiVzOiAweCVwYWQgPT4gMHglMDh4XG4iLAorCQkJX19mdW5jX18sICZ1cmVxLT5kbWEsIGRtYV9yZWcpOwogCX0KIAogCWN0cmwgfD0gRHhFUENUTF9FUEVuYTsJLyogZW5zdXJlIGVwIGVuYWJsZWQgKi8KQEAgLTExODYsNiArMTE4Niw0MSBAQAogc3RhdGljIHZvaWQgczNjX2hzb3RnX2Rpc2Nvbm5lY3Qoc3RydWN0IHMzY19oc290ZyAqaHNvdGcpOwogCiAvKioKKyAqIHMzY19oc290Z19zdGFsbF9lcDAgLSBzdGFsbCBlcDAKKyAqIEBoc290ZzogVGhlIGRldmljZSBzdGF0ZQorICoKKyAqIFNldCBzdGFsbCBmb3IgZXAwIGFzIHJlc3BvbnNlIGZvciBzZXR1cCByZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZCBzM2NfaHNvdGdfc3RhbGxfZXAwKHN0cnVjdCBzM2NfaHNvdGcgKmhzb3RnKSB7CisJc3RydWN0IHMzY19oc290Z19lcCAqZXAwID0gJmhzb3RnLT5lcHNbMF07CisJdTMyIHJlZzsKKwl1MzIgY3RybDsKKworCWRldl9kYmcoaHNvdGctPmRldiwgImVwMCBzdGFsbCAoZGlyPSVkKVxuIiwgZXAwLT5kaXJfaW4pOworCXJlZyA9IChlcDAtPmRpcl9pbikgPyBESUVQQ1RMMCA6IERPRVBDVEwwOworCisJLyoKKwkgKiBEeEVQQ1RMX1N0YWxsIHdpbGwgYmUgY2xlYXJlZCBieSBFUCBvbmNlIGl0IGhhcworCSAqIHRha2VuIGVmZmVjdCwgc28gbm8gbmVlZCB0byBjbGVhciBsYXRlci4KKwkgKi8KKworCWN0cmwgPSByZWFkbChoc290Zy0+cmVncyArIHJlZyk7CisJY3RybCB8PSBEeEVQQ1RMX1N0YWxsOworCWN0cmwgfD0gRHhFUENUTF9DTkFLOworCXdyaXRlbChjdHJsLCBoc290Zy0+cmVncyArIHJlZyk7CisKKwlkZXZfZGJnKGhzb3RnLT5kZXYsCisJCSJ3cml0dGVuIER4RVBDVEw9MHglMDh4IHRvICUwOHggKER4RVBDVEw9MHglMDh4KVxuIiwKKwkJY3RybCwgcmVnLCByZWFkbChoc290Zy0+cmVncyArIHJlZykpOworCisJIC8qCisJICAqIGNvbXBsZXRlIHdvbid0IGJlIGNhbGxlZCwgc28gd2UgZW5xdWV1ZQorCSAgKiBzZXR1cCByZXF1ZXN0IGhlcmUKKwkgICovCisJIHMzY19oc290Z19lbnF1ZXVlX3NldHVwKGhzb3RnKTsKK30KKworLyoqCiAgKiBzM2NfaHNvdGdfcHJvY2Vzc19jb250cm9sIC0gcHJvY2VzcyBhIGNvbnRyb2wgcmVxdWVzdAogICogQGhzb3RnOiBUaGUgZGV2aWNlIHN0YXRlCiAgKiBAY3RybDogVGhlIGNvbnRyb2wgcmVxdWVzdCByZWNlaXZlZApAQCAtMTI2MiwzOCArMTI5Nyw4IEBACiAJICogc28gcmVzcG9uZCB3aXRoIGEgU1RBTEwgZm9yIHRoZSBzdGF0dXMgc3RhZ2UgdG8gaW5kaWNhdGUgZmFpbHVyZS4KIAkgKi8KIAotCWlmIChyZXQgPCAwKSB7Ci0JCXUzMiByZWc7Ci0JCXUzMiBjdHJsOwotCi0JCWRldl9kYmcoaHNvdGctPmRldiwgImVwMCBzdGFsbCAoZGlyPSVkKVxuIiwgZXAwLT5kaXJfaW4pOwotCQlyZWcgPSAoZXAwLT5kaXJfaW4pID8gRElFUENUTDAgOiBET0VQQ1RMMDsKLQotCQkvKgotCQkgKiBEeEVQQ1RMX1N0YWxsIHdpbGwgYmUgY2xlYXJlZCBieSBFUCBvbmNlIGl0IGhhcwotCQkgKiB0YWtlbiBlZmZlY3QsIHNvIG5vIG5lZWQgdG8gY2xlYXIgbGF0ZXIuCi0JCSAqLwotCi0JCWN0cmwgPSByZWFkbChoc290Zy0+cmVncyArIHJlZyk7Ci0JCWN0cmwgfD0gRHhFUENUTF9TdGFsbDsKLQkJY3RybCB8PSBEeEVQQ1RMX0NOQUs7Ci0JCXdyaXRlbChjdHJsLCBoc290Zy0+cmVncyArIHJlZyk7Ci0KLQkJZGV2X2RiZyhoc290Zy0+ZGV2LAotCQkJIndyaXR0ZW4gRHhFUENUTD0weCUwOHggdG8gJTA4eCAoRHhFUENUTD0weCUwOHgpXG4iLAotCQkJY3RybCwgcmVnLCByZWFkbChoc290Zy0+cmVncyArIHJlZykpOwotCi0JCS8qCi0JCSAqIGRvbid0IGJlbGlldmUgd2UgbmVlZCB0byBhbnl0aGluZyBtb3JlIHRvIGdldCB0aGUgRVAKLQkJICogdG8gcmVwbHkgd2l0aCBhIFNUQUxMIHBhY2tldAotCQkgKi8KLQotCQkgLyoKLQkJICAqIGNvbXBsZXRlIHdvbid0IGJlIGNhbGxlZCwgc28gd2UgZW5xdWV1ZQotCQkgICogc2V0dXAgcmVxdWVzdCBoZXJlCi0JCSAgKi8KLQkJIHMzY19oc290Z19lbnF1ZXVlX3NldHVwKGhzb3RnKTsKLQl9CisJaWYgKHJldCA8IDApCisJCXMzY19oc290Z19zdGFsbF9lcDAoaHNvdGcpOwogfQogCiAvKioKQEAgLTE0ODgsNyArMTQ5Myw3IEBACiAJICogbm90ZSwgd2UgbWlnaHQgb3Zlci13cml0ZSB0aGUgYnVmZmVyIGVuZCBieSAzIGJ5dGVzIGRlcGVuZGluZyBvbgogCSAqIGFsaWdubWVudCBvZiB0aGUgZGF0YS4KIAkgKi8KLQlyZWFkc2woZmlmbywgaHNfcmVxLT5yZXEuYnVmICsgcmVhZF9wdHIsIHRvX3JlYWQpOworCWlvcmVhZDMyX3JlcChmaWZvLCBoc19yZXEtPnJlcS5idWYgKyByZWFkX3B0ciwgdG9fcmVhZCk7CiB9CiAKIC8qKgpAQCAtMjgzMiw2ICsyODM3LDE1IEBACiAKIAlkZXZfaW5mbyhocy0+ZGV2LCAiJXMoZXAgJXAgJXMsICVkKVxuIiwgX19mdW5jX18sIGVwLCBlcC0+bmFtZSwgdmFsdWUpOwogCisJaWYgKGluZGV4ID09IDApIHsKKwkJaWYgKHZhbHVlKQorCQkJczNjX2hzb3RnX3N0YWxsX2VwMChocyk7CisJCWVsc2UKKwkJCWRldl93YXJuKGhzLT5kZXYsCisJCQkJICIlczogY2FuJ3QgY2xlYXIgaGFsdCBvbiBlcDBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyogd3JpdGUgYm90aCBJTiBhbmQgT1VUIGNvbnRyb2wgcmVnaXN0ZXJzICovCiAKIAllcHJlZyA9IERJRVBDVEwoaW5kZXgpOwpAQCAtMzc2MCwxMCArMzc3NCw1NSBAQAogCXJldHVybiAwOwogfQogCi0jaWYgMQotI2RlZmluZSBzM2NfaHNvdGdfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHMzY19oc290Z19yZXN1bWUgTlVMTAotI2VuZGlmCitzdGF0aWMgaW50IHMzY19oc290Z19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgczNjX2hzb3RnICpoc290ZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaHNvdGctPmRyaXZlcikKKwkJZGV2X2luZm8oaHNvdGctPmRldiwgInN1c3BlbmRpbmcgdXNiIGdhZGdldCAlc1xuIiwKKwkJCSBoc290Zy0+ZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKKwlzM2NfaHNvdGdfZGlzY29ubmVjdChoc290Zyk7CisJczNjX2hzb3RnX3BoeV9kaXNhYmxlKGhzb3RnKTsKKwloc290Zy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKKworCWlmIChoc290Zy0+ZHJpdmVyKSB7CisJCWludCBlcDsKKwkJZm9yIChlcCA9IDA7IGVwIDwgaHNvdGctPm51bV9vZl9lcHM7IGVwKyspCisJCQlzM2NfaHNvdGdfZXBfZGlzYWJsZSgmaHNvdGctPmVwc1tlcF0uZXApOworCisJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShoc290Zy0+c3VwcGxpZXMpLAorCQkJCQkgICAgIGhzb3RnLT5zdXBwbGllcyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzM2NfaHNvdGdfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHMzY19oc290ZyAqaHNvdGcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJaWYgKGhzb3RnLT5kcml2ZXIpIHsKKwkJZGV2X2luZm8oaHNvdGctPmRldiwgInJlc3VtaW5nIHVzYiBnYWRnZXQgJXNcbiIsCisJCQkgaHNvdGctPmRyaXZlci0+ZHJpdmVyLm5hbWUpOworCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShoc290Zy0+c3VwcGxpZXMpLAorCQkJCSAgICAgIGhzb3RnLT5zdXBwbGllcyk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhzb3RnLT5sb2NrLCBmbGFncyk7CisJaHNvdGctPmxhc3RfcnN0ID0gamlmZmllczsKKwlzM2NfaHNvdGdfcGh5X2VuYWJsZShoc290Zyk7CisJczNjX2hzb3RnX2NvcmVfaW5pdChoc290Zyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHMzY19oc290Z19vZl9pZHNbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHN1ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHN1ZGMuYwppbmRleCBlYTRiYmZlLi4xMGM2YTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jCkBAIC0xMzQ0LDcgKzEzNDQsNiBAQAogCiAJcmV0dXJuIDA7CiBlcnJfYWRkX3VkYzoKLWVycl9hZGRfZGV2aWNlOgogCWNsa19kaXNhYmxlKGhzdWRjLT51Y2xrKTsKIGVycl9yZXM6CiAJaWYgKCFJU19FUlJfT1JfTlVMTChoc3VkYy0+dHJhbnNjZWl2ZXIpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3RjbV91c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdGNtX3VzYl9nYWRnZXQuYwppbmRleCAwZjhhYWQ3Li40NjBjMjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdGNtX3VzYl9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdGNtX3VzYl9nYWRnZXQuYwpAQCAtMTYxMyw3ICsxNjEzLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCXRwb3J0LT50cG9ydF93d3BuID0gd3dwbjsKLQlzbnByaW50Zih0cG9ydC0+dHBvcnRfbmFtZSwgc2l6ZW9mKHRwb3J0LT50cG9ydF9uYW1lKSwgd25uX25hbWUpOworCXNucHJpbnRmKHRwb3J0LT50cG9ydF9uYW1lLCBzaXplb2YodHBvcnQtPnRwb3J0X25hbWUpLCAiJXMiLCB3bm5fbmFtZSk7CiAJcmV0dXJuICZ0cG9ydC0+dHBvcnRfd3duOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwppbmRleCBiN2Q0ZjgyLi41MGQwOWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKQEAgLTQ4LDYgKzQ4LDggQEAKIAogI2RlZmluZSBVRVRIX19WRVJTSU9OCSIyOS1NYXktMjAwOCIKIAorI2RlZmluZSBHRVRIRVJfTkFQSV9XRUlHSFQJMzIKKwogc3RydWN0IGV0aF9kZXYgewogCS8qIGxvY2sgaXMgaGVsZCB3aGlsZSBhY2Nlc3NpbmcgcG9ydF91c2IKIAkgKi8KQEAgLTcyLDYgKzc0LDcgQEAKIAkJCQkJCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpOwogCiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IG5hcGlfc3RydWN0CXJ4X25hcGk7CiAKIAl1bnNpZ25lZCBsb25nCQl0b2RvOwogI2RlZmluZQlXT1JLX1JYX01FTU9SWQkJMApAQCAtMjUzLDE4ICsyNTYsMTYgQEAKIAkJREJHKGRldiwgInJ4IHN1Ym1pdCAtLT4gJWRcbiIsIHJldHZhbCk7CiAJCWlmIChza2IpCiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yZXFfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZXFfbG9jaywgZmxhZ3MpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdm9pZCByeF9jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYiA9IHJlcS0+Y29udGV4dCwgKnNrYjI7CisJc3RydWN0IHNrX2J1ZmYJKnNrYiA9IHJlcS0+Y29udGV4dDsKIAlzdHJ1Y3QgZXRoX2RldgkqZGV2ID0gZXAtPmRyaXZlcl9kYXRhOwogCWludAkJc3RhdHVzID0gcmVxLT5zdGF0dXM7CisJYm9vbAkJcnhfcXVldWUgPSAwOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIApAQCAtMjg4LDMwICsyODksOCBAQAogCQl9IGVsc2UgewogCQkJc2tiX3F1ZXVlX3RhaWwoJmRldi0+cnhfZnJhbWVzLCBza2IpOwogCQl9Ci0JCXNrYiA9IE5VTEw7Ci0KLQkJc2tiMiA9IHNrYl9kZXF1ZXVlKCZkZXYtPnJ4X2ZyYW1lcyk7Ci0JCXdoaWxlIChza2IyKSB7Ci0JCQlpZiAoc3RhdHVzIDwgMAotCQkJCQl8fCBFVEhfSExFTiA+IHNrYjItPmxlbgotCQkJCQl8fCBza2IyLT5sZW4gPiBWTEFOX0VUSF9GUkFNRV9MRU4pIHsKLQkJCQlkZXYtPm5ldC0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJCQlEQkcoZGV2LCAicnggbGVuZ3RoICVkXG4iLCBza2IyLT5sZW4pOwotCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYjIpOwotCQkJCWdvdG8gbmV4dF9mcmFtZTsKLQkJCX0KLQkJCXNrYjItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiMiwgZGV2LT5uZXQpOwotCQkJZGV2LT5uZXQtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWRldi0+bmV0LT5zdGF0cy5yeF9ieXRlcyArPSBza2IyLT5sZW47Ci0KLQkJCS8qIG5vIGJ1ZmZlciBjb3BpZXMgbmVlZGVkLCB1bmxlc3MgaGFyZHdhcmUgY2FuJ3QKLQkJCSAqIHVzZSBza2IgYnVmZmVycy4KLQkJCSAqLwotCQkJc3RhdHVzID0gbmV0aWZfcngoc2tiMik7Ci1uZXh0X2ZyYW1lOgotCQkJc2tiMiA9IHNrYl9kZXF1ZXVlKCZkZXYtPnJ4X2ZyYW1lcyk7Ci0JCX0KKwkJaWYgKCFzdGF0dXMpCisJCQlyeF9xdWV1ZSA9IDE7CiAJCWJyZWFrOwogCiAJLyogc29mdHdhcmUtZHJpdmVuIGludGVyZmFjZSBzaHV0ZG93biAqLwpAQCAtMzM0LDIyICszMTMsMjAgQEAKIAkJLyogRkFMTFRIUk9VR0ggKi8KIAogCWRlZmF1bHQ6CisJCXJ4X3F1ZXVlID0gMTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJZGV2LT5uZXQtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQlEQkcoZGV2LCAicnggc3RhdHVzICVkXG4iLCBzdGF0dXMpOwogCQlicmVhazsKIAl9CiAKLQlpZiAoc2tiKQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCWlmICghbmV0aWZfcnVubmluZyhkZXYtPm5ldCkpIHsKIGNsZWFuOgogCQlzcGluX2xvY2soJmRldi0+cmVxX2xvY2spOwogCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+cmVxX2xvY2spOwotCQlyZXEgPSBOVUxMOwotCX0KLQlpZiAocmVxKQotCQlyeF9zdWJtaXQoZGV2LCByZXEsIEdGUF9BVE9NSUMpOworCisJaWYgKHJ4X3F1ZXVlICYmIGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJmRldi0+cnhfbmFwaSkpKQorCQlfX25hcGlfc2NoZWR1bGUoJmRldi0+cnhfbmFwaSk7CiB9CiAKIHN0YXRpYyBpbnQgcHJlYWxsb2Moc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIG4pCkBAIC00MTQsMTYgKzM5MSwyNCBAQAogewogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXJ4X2NvdW50cyA9IDA7CiAKIAkvKiBmaWxsIHVudXNlZCByeHEgc2xvdHMgd2l0aCBzb21lIHNrYiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPnJ4X3JlcXMpKSB7CisKKwkJaWYgKCsrcnhfY291bnRzID4gcWxlbihkZXYtPmdhZGdldCwgZGV2LT5xbXVsdCkpCisJCQlicmVhazsKKwogCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT5yeF9yZXFzLm5leHQsCiAJCQkJc3RydWN0IHVzYl9yZXF1ZXN0LCBsaXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZXFfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChyeF9zdWJtaXQoZGV2LCByZXEsIGdmcF9mbGFncykgPCAwKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yZXFfbG9jaywgZmxhZ3MpOworCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CiAJCQlkZWZlcl9rZXZlbnQoZGV2LCBXT1JLX1JYX01FTU9SWSk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTQzMyw2ICs0MTgsNDEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcV9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQgZ2V0aGVyX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBldGhfZGV2ICAqZGV2ID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBldGhfZGV2LCByeF9uYXBpKTsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCXVuc2lnbmVkIGludAl3b3JrX2RvbmUgPSAwOworCWludAkJc3RhdHVzID0gMDsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmRldi0+cnhfZnJhbWVzKSkpIHsKKwkJaWYgKHN0YXR1cyA8IDAKKwkJCQl8fCBFVEhfSExFTiA+IHNrYi0+bGVuCisJCQkJfHwgc2tiLT5sZW4gPiBWTEFOX0VUSF9GUkFNRV9MRU4pIHsKKwkJCWRldi0+bmV0LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldi0+bmV0LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlEQkcoZGV2LCAicnggbGVuZ3RoICVkXG4iLCBza2ItPmxlbik7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJY29udGludWU7CisJCX0KKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2LT5uZXQpOworCQlkZXYtPm5ldC0+c3RhdHMucnhfcGFja2V0cysrOworCQlkZXYtPm5ldC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkJc3RhdHVzID0gbmV0aWZfcnhfbmkoc2tiKTsKKwl9CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYtPm5ldCkpIHsKKwkJcnhfZmlsbChkZXYsIEdGUF9LRVJORUwpOworCQl3b3JrX2RvbmUrKzsKKwl9CisKKwlpZiAod29ya19kb25lIDwgYnVkZ2V0KQorCQluYXBpX2NvbXBsZXRlKCZkZXYtPnJ4X25hcGkpOworCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKwogc3RhdGljIHZvaWQgZXRoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBldGhfZGV2CSpkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGV0aF9kZXYsIHdvcmspOwpAQCAtNjI1LDYgKzY0NSw3IEBACiAJLyogYW5kIG9wZW4gdGhlIHR4IGZsb29kZ2F0ZXMgKi8KIAlhdG9taWNfc2V0KCZkZXYtPnR4X3FsZW4sIDApOwogCW5ldGlmX3dha2VfcXVldWUoZGV2LT5uZXQpOworCW5hcGlfZW5hYmxlKCZkZXYtPnJ4X25hcGkpOwogfQogCiBzdGF0aWMgaW50IGV0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCkBAIC02NTEsNiArNjcyLDcgQEAKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCiAJVkRCRyhkZXYsICIlc1xuIiwgX19mdW5jX18pOworCW5hcGlfZGlzYWJsZSgmZGV2LT5yeF9uYXBpKTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7CiAKIAlEQkcoZGV2LCAic3RvcCBzdGF0czogcngvdHggJWxkLyVsZCwgZXJycyAlbGQvJWxkXG4iLApAQCAtNzY4LDYgKzc5MCw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwluZXRpZl9uYXBpX2FkZChuZXQsICZkZXYtPnJ4X25hcGksIGdldGhlcl9wb2xsLCBHRVRIRVJfTkFQSV9XRUlHSFQpOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnJlcV9sb2NrKTsKIAlJTklUX1dPUksoJmRldi0+d29yaywgZXRoX3dvcmspOwpAQCAtODMwLDYgKzg1Myw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwluZXRpZl9uYXBpX2FkZChuZXQsICZkZXYtPnJ4X25hcGksIGdldGhlcl9wb2xsLCBHRVRIRVJfTkFQSV9XRUlHSFQpOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnJlcV9sb2NrKTsKIAlJTklUX1dPUksoJmRldi0+d29yaywgZXRoX3dvcmspOwpAQCAtMTExMyw2ICsxMTM3LDcgQEAKIHsKIAlzdHJ1Y3QgZXRoX2RldgkJKmRldiA9IGxpbmstPmlvcG9ydDsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKIAogCVdBUk5fT04oIWRldik7CiAJaWYgKCFkZXYpCkBAIC0xMTM5LDYgKzExNjQsMTIgQEAKIAkJc3Bpbl9sb2NrKCZkZXYtPnJlcV9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmRldi0+cmVxX2xvY2spOworCisJc3Bpbl9sb2NrKCZkZXYtPnJ4X2ZyYW1lcy5sb2NrKTsKKwl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJmRldi0+cnhfZnJhbWVzKSkpCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJc3Bpbl91bmxvY2soJmRldi0+cnhfZnJhbWVzLmxvY2spOworCiAJbGluay0+aW5fZXAtPmRyaXZlcl9kYXRhID0gTlVMTDsKIAlsaW5rLT5pbl9lcC0+ZGVzYyA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2ZzLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mcy5oCmluZGV4IGJjMmQzNzEuLmJmMGJhMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2ZzLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZnMuaApAQCAtNjUsMTAgKzY1LDggQEAKIAltdXRleF91bmxvY2soJmZmc19sb2NrKTsKIH0KIAotc3RydWN0IGZmc19kZXYgKmZmc19hbGxvY19kZXYodm9pZCk7CiBpbnQgZmZzX25hbWVfZGV2KHN0cnVjdCBmZnNfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpOwogaW50IGZmc19zaW5nbGVfZGV2KHN0cnVjdCBmZnNfZGV2ICpkZXYpOwotdm9pZCBmZnNfZnJlZV9kZXYoc3RydWN0IGZmc19kZXYgKmRldik7CiAKIHN0cnVjdCBmZnNfZXBmaWxlOwogc3RydWN0IGZmc19mdW5jdGlvbjsKQEAgLTEyNSw3ICsxMjMsNyBAQAogCSAqIHNldHVwLiAgSWYgdGhpcyBzdGF0ZSBpcyBzZXQgcmVhZC93cml0ZSBvbiBlcDAgcmV0dXJuCiAJICogLUVJRFJNLiAgVGhpcyBzdGF0ZSBpcyBvbmx5IHNldCB3aGVuIGFkZGluZyBldmVudC4KIAkgKi8KLQlGRlNfU0VUVVBfQ0FOQ0VMRUQKKwlGRlNfU0VUVVBfQ0FOQ0VMTEVECiB9OwogCiBzdHJ1Y3QgZmZzX2RhdGEgewpAQCAtMTU2LDcgKzE1NCw2IEBACiAJICovCiAJc3RydWN0IHVzYl9yZXF1ZXN0CQkqZXAwcmVxOwkJLyogUDogbXV0ZXggKi8KIAlzdHJ1Y3QgY29tcGxldGlvbgkJZXAwcmVxX2NvbXBsZXRpb247CS8qIFA6IG11dGV4ICovCi0JaW50CQkJCWVwMHJlcV9zdGF0dXM7CQkvKiBQOiBtdXRleCAqLwogCiAJLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KIAlhdG9taWNfdAkJCXJlZjsKQEAgLTE2OCwxOSArMTY1LDE4IEBACiAKIAkvKgogCSAqIFBvc3NpYmxlIHRyYW5zaXRpb25zOgotCSAqICsgRkZTX05PX1NFVFVQICAgICAgIC0+IEZGU19TRVRVUF9QRU5ESU5HICAtLSBQOiBldi53YWl0cS5sb2NrCisJICogKyBGRlNfTk9fU0VUVVAgICAgICAgIC0+IEZGU19TRVRVUF9QRU5ESU5HICAtLSBQOiBldi53YWl0cS5sb2NrCiAJICogICAgICAgICAgICAgICBoYXBwZW5zIG9ubHkgaW4gZXAwIHJlYWQgd2hpY2ggaXMgUDogbXV0ZXgKLQkgKiArIEZGU19TRVRVUF9QRU5ESU5HICAtPiBGRlNfTk9fU0VUVVAgICAgICAgLS0gUDogZXYud2FpdHEubG9jaworCSAqICsgRkZTX1NFVFVQX1BFTkRJTkcgICAtPiBGRlNfTk9fU0VUVVAgICAgICAgLS0gUDogZXYud2FpdHEubG9jawogCSAqICAgICAgICAgICAgICAgaGFwcGVucyBvbmx5IGluIGVwMCBpL28gIHdoaWNoIGlzIFA6IG11dGV4Ci0JICogKyBGRlNfU0VUVVBfUEVORElORyAgLT4gRkZTX1NFVFVQX0NBTkNFTEVEIC0tIFA6IGV2LndhaXRxLmxvY2sKLQkgKiArIEZGU19TRVRVUF9DQU5DRUxFRCAtPiBGRlNfTk9fU0VUVVAgICAgICAgLS0gY21weGNoZworCSAqICsgRkZTX1NFVFVQX1BFTkRJTkcgICAtPiBGRlNfU0VUVVBfQ0FOQ0VMTEVEIC0tIFA6IGV2LndhaXRxLmxvY2sKKwkgKiArIEZGU19TRVRVUF9DQU5DRUxMRUQgLT4gRkZTX05PX1NFVFVQICAgICAgICAtLSBjbXB4Y2hnCisJICoKKwkgKiBUaGlzIGZpZWxkIHNob3VsZCBuZXZlciBiZSBhY2Nlc3NlZCBkaXJlY3RseSBhbmQgaW5zdGVhZAorCSAqIGZmc19zZXR1cF9zdGF0ZV9jbGVhcl9jYW5jZWxsZWQgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQuCiAJICovCiAJZW51bSBmZnNfc2V0dXBfc3RhdGUJCXNldHVwX3N0YXRlOwogCi0jZGVmaW5lIEZGU19TRVRVUF9TVEFURShmZnMpCQkJCQlcCi0JKChlbnVtIGZmc19zZXR1cF9zdGF0ZSljbXB4Y2hnKCYoZmZzKS0+c2V0dXBfc3RhdGUsCVwKLQkJCQkgICAgICAgRkZTX1NFVFVQX0NBTkNFTEVELCBGRlNfTk9fU0VUVVApKQotCiAJLyogRXZlbnRzICYgc3VjaC4gKi8KIAlzdHJ1Y3QgewogCQl1OAkJCQl0eXBlc1s0XTsKQEAgLTIxMCwxNiArMjA2LDE2IEBACiAKIAkvKiBmaWxsZWQgYnkgX19mZnNfZGF0YV9nb3RfZGVzY3MoKSAqLwogCS8qCi0JICogUmVhbCBkZXNjcmlwdG9ycyBhcmUgMTYgYnl0ZXMgYWZ0ZXIgcmF3X2Rlc2NzIChzbyB5b3UgbmVlZAotCSAqIHRvIHNraXAgMTYgYnl0ZXMgKGllLiBmZnMtPnJhd19kZXNjcyArIDE2KSB0byBnZXQgdG8gdGhlCi0JICogZmlyc3QgZnVsbCBzcGVlZCBkZXNjcmlwdG9yKS4gIHJhd19kZXNjc19sZW5ndGggYW5kCi0JICogcmF3X2ZzX2Rlc2NzX2xlbmd0aCBkbyBub3QgaGF2ZSB0aG9zZSAxNiBieXRlcyBhZGRlZC4KKwkgKiByYXdfZGVzY3MgaXMgd2hhdCB5b3Uga2ZyZWUsIHJlYWxfZGVzY3MgcG9pbnRzIGluc2lkZSBvZiByYXdfZGVzY3MsCisJICogd2hlcmUgZnVsbCBzcGVlZCwgaGlnaCBzcGVlZCBhbmQgc3VwZXIgc3BlZWQgZGVzY3JpcHRvcnMgc3RhcnQuCisJICogcmVhbF9kZXNjc19sZW5ndGggaXMgdGhlIGxlbmd0aCBvZiBhbGwgdGhvc2UgZGVzY3JpcHRvcnMuCiAJICovCisJY29uc3Qgdm9pZAkJCSpyYXdfZGVzY3NfZGF0YTsKIAljb25zdCB2b2lkCQkJKnJhd19kZXNjczsKIAl1bnNpZ25lZAkJCXJhd19kZXNjc19sZW5ndGg7Ci0JdW5zaWduZWQJCQlyYXdfZnNfZGVzY3NfbGVuZ3RoOwogCXVuc2lnbmVkCQkJZnNfZGVzY3NfY291bnQ7CiAJdW5zaWduZWQJCQloc19kZXNjc19jb3VudDsKKwl1bnNpZ25lZAkJCXNzX2Rlc2NzX2NvdW50OwogCiAJdW5zaWduZWQgc2hvcnQJCQlzdHJpbmdzX2NvdW50OwogCXVuc2lnbmVkIHNob3J0CQkJaW50ZXJmYWNlc19jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMKaW5kZXggYjM2OTI5Mi4uYWQwYWNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMKQEAgLTU0OSw4ICs1NDksOCBAQAogCQlwb3J0LT5yZWFkX3N0YXJ0ZWQtLTsKIAl9CiAKLQkvKiBQdXNoIGZyb20gdHR5IHRvIGxkaXNjOyB3aXRob3V0IGxvd19sYXRlbmN5IHNldCB0aGlzIGlzIGhhbmRsZWQgYnkKLQkgKiBhIHdvcmtxdWV1ZSwgc28gd2Ugd29uJ3QgZ2V0IGNhbGxiYWNrcyBhbmQgY2FuIGhvbGQgcG9ydF9sb2NrCisJLyogUHVzaCBmcm9tIHR0eSB0byBsZGlzYzsgdGhpcyBpcyBoYW5kbGVkIGJ5IGEgd29ya3F1ZXVlLAorCSAqIHNvIHdlIHdvbid0IGdldCBjYWxsYmFja3MgYW5kIGNhbiBob2xkIHBvcnRfbG9jawogCSAqLwogCWlmIChkb19wdXNoKQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCgmcG9ydC0+cG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggYTk3MDdkYS4uZTIyYjgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtNTg0LDcgKzU4NCw2IEBACiBjb25maWcgVVNCX1UxMzJfSENECiAJdHJpc3RhdGUgIkVsYW4gVTEzMiBBZGFwdGVyIEhvc3QgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFVTQl9GVERJX0VMQU4KLQlkZWZhdWx0IE0KIAloZWxwCiAJICBUaGUgVTEzMiBhZGFwdGVyIGlzIGEgVVNCIHRvIENhcmRCdXMgYWRhcHRlciBzcGVjaWZpY2FsbHkgZGVzaWduZWQKIAkgIGZvciBQQyBjYXJkcyB0aGF0IGNvbnRhaW4gYW4gT0hDSSBob3N0IGNvbnRyb2xsZXIuIFR5cGljYWwgUEMgY2FyZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbGF0Zm9ybS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKaW5kZXggMDE1MzZjZi4uYjNhMGUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDcgU3RldmVuIEJyb3duIDxzYnJvd25AY29ydGxhbmQuY29tPgogICogQ29weXJpZ2h0IDIwMTAtMjAxMiBIYXVrZSBNZWhydGVucyA8aGF1a2VAaGF1a2UtbS5kZT4KKyAqIENvcHlyaWdodCAyMDE0IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CiAgKgogICogRGVyaXZlZCBmcm9tIHRoZSBvaGNpLXNzYiBkcml2ZXIKICAqIENvcHlyaWdodCAyMDA3IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CkBAIC0xOCw2ICsxOSw3IEBACiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICovCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTI1LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KQEAgLTMzLDYgKzM2LDEzIEBACiAjaW5jbHVkZSAiZWhjaS5oIgogCiAjZGVmaW5lIERSSVZFUl9ERVNDICJFSENJIGdlbmVyaWMgcGxhdGZvcm0gZHJpdmVyIgorI2RlZmluZSBFSENJX01BWF9DTEtTIDMKKyNkZWZpbmUgaGNkX3RvX2VoY2lfcHJpdihoKSAoKHN0cnVjdCBlaGNpX3BsYXRmb3JtX3ByaXYgKiloY2RfdG9fZWhjaShoKS0+cHJpdikKKworc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiB7CisJc3RydWN0IGNsayAqY2xrc1tFSENJX01BWF9DTEtTXTsKKwlzdHJ1Y3QgcGh5ICpwaHk7Cit9OwogCiBzdGF0aWMgY29uc3QgY2hhciBoY2RfbmFtZVtdID0gImVoY2ktcGxhdGZvcm0iOwogCkBAIC00NSw4ICs1NSw2IEBACiAKIAloY2QtPmhhc190dCA9IHBkYXRhLT5oYXNfdHQ7CiAJZWhjaS0+aGFzX3N5bm9wc3lzX2hjX2J1ZyA9IHBkYXRhLT5oYXNfc3lub3BzeXNfaGNfYnVnOwotCWVoY2ktPmJpZ19lbmRpYW5fZGVzYyA9IHBkYXRhLT5iaWdfZW5kaWFuX2Rlc2M7Ci0JZWhjaS0+YmlnX2VuZGlhbl9tbWlvID0gcGRhdGEtPmJpZ19lbmRpYW5fbW1pbzsKIAogCWlmIChwZGF0YS0+cHJlX3NldHVwKSB7CiAJCXJldHZhbCA9IHBkYXRhLT5wcmVfc2V0dXAoaGNkKTsKQEAgLTY0LDM4ICs3Miw5MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGVoY2lfcGxhdGZvcm1fcG93ZXJfb24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBlaGNpX3BsYXRmb3JtX3ByaXYgKnByaXYgPSBoY2RfdG9fZWhjaV9wcml2KGhjZCk7CisJaW50IGNsaywgcmV0OworCisJZm9yIChjbGsgPSAwOyBjbGsgPCBFSENJX01BWF9DTEtTICYmIHByaXYtPmNsa3NbY2xrXTsgY2xrKyspIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmNsa3NbY2xrXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9kaXNhYmxlX2Nsa3M7CisJfQorCisJaWYgKHByaXYtPnBoeSkgeworCQlyZXQgPSBwaHlfaW5pdChwcml2LT5waHkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZGlzYWJsZV9jbGtzOworCisJCXJldCA9IHBoeV9wb3dlcl9vbihwcml2LT5waHkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZXhpdF9waHk7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9leGl0X3BoeToKKwlwaHlfZXhpdChwcml2LT5waHkpOworZXJyX2Rpc2FibGVfY2xrczoKKwl3aGlsZSAoLS1jbGsgPj0gMCkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsa3NbY2xrXSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlaGNpX3BsYXRmb3JtX3Bvd2VyX29mZihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqcHJpdiA9IGhjZF90b19laGNpX3ByaXYoaGNkKTsKKwlpbnQgY2xrOworCisJaWYgKHByaXYtPnBoeSkgeworCQlwaHlfcG93ZXJfb2ZmKHByaXYtPnBoeSk7CisJCXBoeV9leGl0KHByaXYtPnBoeSk7CisJfQorCisJZm9yIChjbGsgPSBFSENJX01BWF9DTEtTIC0gMTsgY2xrID49IDA7IGNsay0tKQorCQlpZiAocHJpdi0+Y2xrc1tjbGtdKQorCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsa3NbY2xrXSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaGNfZHJpdmVyIF9fcmVhZF9tb3N0bHkgZWhjaV9wbGF0Zm9ybV9oY19kcml2ZXI7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZWhjaV9kcml2ZXJfb3ZlcnJpZGVzIHBsYXRmb3JtX292ZXJyaWRlcyBfX2luaXRjb25zdCA9IHsKLQkucmVzZXQgPQllaGNpX3BsYXRmb3JtX3Jlc2V0LAorCS5yZXNldCA9CQllaGNpX3BsYXRmb3JtX3Jlc2V0LAorCS5leHRyYV9wcml2X3NpemUgPQlzaXplb2Yoc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9laGNpX3BkYXRhIGVoY2lfcGxhdGZvcm1fZGVmYXVsdHM7CitzdGF0aWMgc3RydWN0IHVzYl9laGNpX3BkYXRhIGVoY2lfcGxhdGZvcm1fZGVmYXVsdHMgPSB7CisJLnBvd2VyX29uID0JCWVoY2lfcGxhdGZvcm1fcG93ZXJfb24sCisJLnBvd2VyX3N1c3BlbmQgPQllaGNpX3BsYXRmb3JtX3Bvd2VyX29mZiwKKwkucG93ZXJfb2ZmID0JCWVoY2lfcGxhdGZvcm1fcG93ZXJfb2ZmLAorfTsKIAogc3RhdGljIGludCBlaGNpX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzX21lbTsKLQlzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgKnBkYXRhOwotCWludCBpcnE7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgdXNiX2VoY2lfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBlaGNpX3BsYXRmb3JtX3ByaXYgKnByaXY7CisJc3RydWN0IGVoY2lfaGNkICplaGNpOworCWludCBlcnIsIGlycSwgY2xrID0gMDsKIAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKgotCSAqIHVzZSByZWFzb25hYmxlIGRlZmF1bHRzIHNvIHBsYXRmb3JtcyBkb24ndCBoYXZlIHRvIHByb3ZpZGUgdGhlc2UuCi0JICogd2l0aCBEVCBwcm9iaW5nIG9uIEFSTSwgbm9uZSBvZiB0aGVzZSBhcmUgc2V0LgorCSAqIFVzZSByZWFzb25hYmxlIGRlZmF1bHRzIHNvIHBsYXRmb3JtcyBkb24ndCBoYXZlIHRvIHByb3ZpZGUgdGhlc2UKKwkgKiB3aXRoIERUIHByb2Jpbmcgb24gQVJNLgogCSAqLwotCWlmICghZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpKQotCQlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gJmVoY2lfcGxhdGZvcm1fZGVmYXVsdHM7CisJaWYgKCFwZGF0YSkKKwkJcGRhdGEgPSAmZWhjaV9wbGF0Zm9ybV9kZWZhdWx0czsKIAogCWVyciA9IGRtYV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQoJmRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZkZXYtPmRldik7Ci0KIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7CiAJaWYgKGlycSA8IDApIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJubyBpcnEgcHJvdmlkZWQiKTsKQEAgLTEwNywxNyArMTY4LDcyIEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJmVoY2lfcGxhdGZvcm1faGNfZHJpdmVyLCAmZGV2LT5kZXYsCisJCQkgICAgIGRldl9uYW1lKCZkZXYtPmRldikpOworCWlmICghaGNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKKwlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJcHJpdiA9IGhjZF90b19laGNpX3ByaXYoaGNkKTsKKwllaGNpID0gaGNkX3RvX2VoY2koaGNkKTsKKworCWlmIChwZGF0YSA9PSAmZWhjaV9wbGF0Zm9ybV9kZWZhdWx0cyAmJiBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5kZXYub2Zfbm9kZSwgImJpZy1lbmRpYW4tcmVncyIpKQorCQkJZWhjaS0+YmlnX2VuZGlhbl9tbWlvID0gMTsKKworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+ZGV2Lm9mX25vZGUsICJiaWctZW5kaWFuLWRlc2MiKSkKKwkJCWVoY2ktPmJpZ19lbmRpYW5fZGVzYyA9IDE7CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPmRldi5vZl9ub2RlLCAiYmlnLWVuZGlhbiIpKQorCQkJZWhjaS0+YmlnX2VuZGlhbl9tbWlvID0gZWhjaS0+YmlnX2VuZGlhbl9kZXNjID0gMTsKKworCQlwcml2LT5waHkgPSBkZXZtX3BoeV9nZXQoJmRldi0+ZGV2LCAidXNiIik7CisJCWlmIChJU19FUlIocHJpdi0+cGh5KSkgeworCQkJZXJyID0gUFRSX0VSUihwcml2LT5waHkpOworCQkJaWYgKGVyciA9PSAtRVBST0JFX0RFRkVSKQorCQkJCWdvdG8gZXJyX3B1dF9oY2Q7CisJCQlwcml2LT5waHkgPSBOVUxMOworCQl9CisKKwkJZm9yIChjbGsgPSAwOyBjbGsgPCBFSENJX01BWF9DTEtTOyBjbGsrKykgeworCQkJcHJpdi0+Y2xrc1tjbGtdID0gb2ZfY2xrX2dldChkZXYtPmRldi5vZl9ub2RlLCBjbGspOworCQkJaWYgKElTX0VSUihwcml2LT5jbGtzW2Nsa10pKSB7CisJCQkJZXJyID0gUFRSX0VSUihwcml2LT5jbGtzW2Nsa10pOworCQkJCWlmIChlcnIgPT0gLUVQUk9CRV9ERUZFUikKKwkJCQkJZ290byBlcnJfcHV0X2Nsa3M7CisJCQkJcHJpdi0+Y2xrc1tjbGtdID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChwZGF0YS0+YmlnX2VuZGlhbl9kZXNjKQorCQllaGNpLT5iaWdfZW5kaWFuX2Rlc2MgPSAxOworCWlmIChwZGF0YS0+YmlnX2VuZGlhbl9tbWlvKQorCQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSAxOworCisjaWZuZGVmIENPTkZJR19VU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KKwlpZiAoZWhjaS0+YmlnX2VuZGlhbl9tbWlvKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIkVycm9yOiBDT05GSUdfVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPIG5vdCBzZXRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXRfY2xrczsKKwl9CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1VTQl9FSENJX0JJR19FTkRJQU5fREVTQworCWlmIChlaGNpLT5iaWdfZW5kaWFuX2Rlc2MpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiRXJyb3I6IENPTkZJR19VU0JfRUhDSV9CSUdfRU5ESUFOX0RFU0Mgbm90IHNldFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dF9jbGtzOworCX0KKyNlbmRpZgorCiAJaWYgKHBkYXRhLT5wb3dlcl9vbikgewogCQllcnIgPSBwZGF0YS0+cG93ZXJfb24oZGV2KTsKIAkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZlaGNpX3BsYXRmb3JtX2hjX2RyaXZlciwgJmRldi0+ZGV2LAotCQkJICAgICBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKLQlpZiAoIWhjZCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9wb3dlcjsKKwkJCWdvdG8gZXJyX3B1dF9jbGtzOwogCX0KIAogCWhjZC0+cnNyY19zdGFydCA9IHJlc19tZW0tPnN0YXJ0OwpAQCAtMTI2LDIyICsyNDIsMjggQEAKIAloY2QtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJmRldi0+ZGV2LCByZXNfbWVtKTsKIAlpZiAoSVNfRVJSKGhjZC0+cmVncykpIHsKIAkJZXJyID0gUFRSX0VSUihoY2QtPnJlZ3MpOwotCQlnb3RvIGVycl9wdXRfaGNkOworCQlnb3RvIGVycl9wb3dlcjsKIAl9CiAJZXJyID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIElSUUZfU0hBUkVEKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9wdXRfaGNkOworCQlnb3RvIGVycl9wb3dlcjsKIAogCWRldmljZV93YWtldXBfZW5hYmxlKGhjZC0+c2VsZi5jb250cm9sbGVyKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIGhjZCk7CiAKIAlyZXR1cm4gZXJyOwogCi1lcnJfcHV0X2hjZDoKLQl1c2JfcHV0X2hjZChoY2QpOwogZXJyX3Bvd2VyOgogCWlmIChwZGF0YS0+cG93ZXJfb2ZmKQogCQlwZGF0YS0+cG93ZXJfb2ZmKGRldik7CitlcnJfcHV0X2Nsa3M6CisJd2hpbGUgKC0tY2xrID49IDApCisJCWNsa19wdXQocHJpdi0+Y2xrc1tjbGtdKTsKK2Vycl9wdXRfaGNkOgorCWlmIChwZGF0YSA9PSAmZWhjaV9wbGF0Zm9ybV9kZWZhdWx0cykKKwkJZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IE5VTEw7CisKKwl1c2JfcHV0X2hjZChoY2QpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE1MCwxMyArMjcyLDE5IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHVzYl9laGNpX3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gaGNkX3RvX2VoY2lfcHJpdihoY2QpOworCWludCBjbGs7CiAKIAl1c2JfcmVtb3ZlX2hjZChoY2QpOwotCXVzYl9wdXRfaGNkKGhjZCk7CiAKIAlpZiAocGRhdGEtPnBvd2VyX29mZikKIAkJcGRhdGEtPnBvd2VyX29mZihkZXYpOwogCisJZm9yIChjbGsgPSAwOyBjbGsgPCBFSENJX01BWF9DTEtTICYmIHByaXYtPmNsa3NbY2xrXTsgY2xrKyspCisJCWNsa19wdXQocHJpdi0+Y2xrc1tjbGtdKTsKKworCXVzYl9wdXRfaGNkKGhjZCk7CisKIAlpZiAocGRhdGEgPT0gJmVoY2lfcGxhdGZvcm1fZGVmYXVsdHMpCiAJCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBOVUxMOwogCkBAIC0yMDcsOCArMzM1LDEwIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2dDg1MDBfZWhjaV9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInZpYSx2dDg1MDAtZWhjaSIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ3bSxwcml6bS1laGNpIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImdlbmVyaWMtZWhjaSIsIH0sCiAJe30KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB2dDg1MDBfZWhjaV9pZHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBlaGNpX3BsYXRmb3JtX3RhYmxlW10gPSB7CiAJeyAiZWhjaS1wbGF0Zm9ybSIsIDAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS10ZWdyYS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXRlZ3JhLmMKaW5kZXggYWYyOGI3NC4uMjdhYzZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXRlZ3JhLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXRlZ3JhLmMKQEAgLTM4LDEwICszOCw2IEBACiAKICNpbmNsdWRlICJlaGNpLmgiCiAKLSNkZWZpbmUgVEVHUkFfVVNCX0JBU0UJCQkweEM1MDAwMDAwCi0jZGVmaW5lIFRFR1JBX1VTQjJfQkFTRQkJCTB4QzUwMDQwMDAKLSNkZWZpbmUgVEVHUkFfVVNCM19CQVNFCQkJMHhDNTAwODAwMAotCiAjZGVmaW5lIFBPUlRfV0FLRV9CSVRTIChQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0UpCiAKICNkZWZpbmUgVEVHUkFfVVNCX0RNQV9BTElHTiAzMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9od2EtaGMuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaHdhLWhjLmMKaW5kZXggZTA3NjY5OS4uZDBkOGZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9od2EtaGMuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2h3YS1oYy5jCkBAIC0yNjEsOCArMjYxLDQ0IEBACiAJCWRldl9lcnIoZGV2LCAiY2Fubm90IGxpc3RlbiB0byBub3RpZmljYXRpb25zOiAlZFxuIiwgcmVzdWx0KTsKIAkJZ290byBlcnJvcl9zdG9wOwogCX0KKwkvKgorCSAqIElmIFdVU0JfUVVJUktfQUxFUkVPTl9IV0FfRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMgaXMgc2V0LAorCSAqICBkaXNhYmxlIHRyYW5zZmVyIG5vdGlmaWNhdGlvbnMuCisJICovCisJaWYgKGh3YWhjLT53YS5xdWlya3MgJgorCQlXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0RJU0FCTEVfWEZFUl9OT1RJRklDQVRJT05TKSB7CisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN1cl9hbHRzZXR0aW5nID0KKwkJCWh3YWhjLT53YS51c2JfaWZhY2UtPmN1cl9hbHRzZXR0aW5nOworCisJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhod2FoYy0+d2EudXNiX2RldiwKKwkJCQl1c2Jfc25kY3RybHBpcGUoaHdhaGMtPndhLnVzYl9kZXYsIDApLAorCQkJCVdBX1JFUV9BTEVSRU9OX0RJU0FCTEVfWEZFUl9OT1RJRklDQVRJT05TLAorCQkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkJVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQlXQV9SRVFfQUxFUkVPTl9GRUFUVVJFX1NFVCwKKwkJCQljdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJCU5VTEwsIDAsCisJCQkJVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCQkvKgorCQkgKiBJZiB3ZSBzdWNjZXNzZnVsbHkgc2VudCB0aGUgY29udHJvbCBtZXNzYWdlLCBzdGFydCBEVEkgaGVyZQorCQkgKiBiZWNhdXNlIG5vIHRyYW5zZmVyIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSByZWNlaXZlZCB3aGljaCBpcworCQkgKiB3aGVyZSBEVEkgaXMgbm9ybWFsbHkgc3RhcnRlZC4KKwkJICovCisJCWlmIChyZXN1bHQgPT0gMCkKKwkJCXJlc3VsdCA9IHdhX2R0aV9zdGFydCgmaHdhaGMtPndhKTsKKwkJZWxzZQorCQkJcmVzdWx0ID0gMDsJLyogT0suICBDb250aW51ZSBub3JtYWxseS4gKi8KKworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJjYW5ub3Qgc3RhcnQgRFRJOiAlZFxuIiwgcmVzdWx0KTsKKwkJCWdvdG8gZXJyb3JfZHRpX3N0YXJ0OworCQl9CisJfQorCiAJcmV0dXJuIHJlc3VsdDsKIAorZXJyb3JfZHRpX3N0YXJ0OgorCXdhX25lcF9kaXNhcm0oJmh3YWhjLT53YSk7CiBlcnJvcl9zdG9wOgogCV9fd2FfY2xlYXJfZmVhdHVyZSgmaHdhaGMtPndhLCBXQV9FTkFCTEUpOwogCXJldHVybiByZXN1bHQ7CkBAIC04MjcsMTAgKzg2MywxMiBAQAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGh3YWhjX2lkX3RhYmxlW10gPSB7CiAJLyogQWxlcmVvbiA1MzEwICovCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDEzZGMsIDB4NTMxMCwgMHhlMCwgMHgwMiwgMHgwMSksCi0JICAuZHJpdmVyX2luZm8gPSBXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DIH0sCisJICAuZHJpdmVyX2luZm8gPSBXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DIHwKKwkJV1VTQl9RVUlSS19BTEVSRU9OX0hXQV9ESVNBQkxFX1hGRVJfTk9USUZJQ0FUSU9OUyB9LAogCS8qIEFsZXJlb24gNTYxMSAqLwogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgxM2RjLCAweDU2MTEsIDB4ZTAsIDB4MDIsIDB4MDEpLAotCSAgLmRyaXZlcl9pbmZvID0gV1VTQl9RVUlSS19BTEVSRU9OX0hXQV9DT05DQVRfSVNPQyB9LAorCSAgLmRyaXZlcl9pbmZvID0gV1VTQl9RVUlSS19BTEVSRU9OX0hXQV9DT05DQVRfSVNPQyB8CisJCVdVU0JfUVVJUktfQUxFUkVPTl9IV0FfRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMgfSwKIAkvKiBGSVhNRTogdXNlIGNsYXNzIGxhYmVscyBmb3IgdGhpcyAqLwogCXsgVVNCX0lOVEVSRkFDRV9JTkZPKDB4ZTAsIDB4MDIsIDB4MDEpLCB9LAogCXt9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBsYXRmb3JtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGxhdGZvcm0uYwppbmRleCA2OGY2NzRjLi5iNjAwMmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGxhdGZvcm0uYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICogQ29weXJpZ2h0IDIwMTEtMjAxMiBIYXVrZSBNZWhydGVucyA8aGF1a2VAaGF1a2UtbS5kZT4KKyAqIENvcHlyaWdodCAyMDE0IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CiAgKgogICogRGVyaXZlZCBmcm9tIHRoZSBPQ0hJLVNTQiBkcml2ZXIKICAqIERlcml2ZWQgZnJvbSB0aGUgT0hDSS1QQ0kgZHJpdmVyCkBAIC0xNCwxMSArMTUsMTQgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUvR1BMLiBTZWUgQ09QWUlORyBmb3IgZGV0YWlscy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL29oY2lfcGRyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgpAQCAtMjcsNiArMzEsMTMgQEAKICNpbmNsdWRlICJvaGNpLmgiCiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIk9IQ0kgZ2VuZXJpYyBwbGF0Zm9ybSBkcml2ZXIiCisjZGVmaW5lIE9IQ0lfTUFYX0NMS1MgMworI2RlZmluZSBoY2RfdG9fb2hjaV9wcml2KGgpICgoc3RydWN0IG9oY2lfcGxhdGZvcm1fcHJpdiAqKWhjZF90b19vaGNpKGgpLT5wcml2KQorCitzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2IHsKKwlzdHJ1Y3QgY2xrICpjbGtzW09IQ0lfTUFYX0NMS1NdOworCXN0cnVjdCBwaHkgKnBoeTsKK307CiAKIHN0YXRpYyBjb25zdCBjaGFyIGhjZF9uYW1lW10gPSAib2hjaS1wbGF0Zm9ybSI7CiAKQEAgLTM2LDEwICs0Nyw2IEBACiAJc3RydWN0IHVzYl9vaGNpX3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IG9oY2lfaGNkICpvaGNpID0gaGNkX3RvX29oY2koaGNkKTsKIAotCWlmIChwZGF0YS0+YmlnX2VuZGlhbl9kZXNjKQotCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0JFX0RFU0M7Ci0JaWYgKHBkYXRhLT5iaWdfZW5kaWFuX21taW8pCi0JCW9oY2ktPmZsYWdzIHw9IE9IQ0lfUVVJUktfQkVfTU1JTzsKIAlpZiAocGRhdGEtPm5vX2JpZ19mcmFtZV9ubykKIAkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19GUkFNRV9OTzsKIAlpZiAocGRhdGEtPm51bV9wb3J0cykKQEAgLTQ4LDExICs1NSw2NyBAQAogCXJldHVybiBvaGNpX3NldHVwKGhjZCk7CiB9CiAKK3N0YXRpYyBpbnQgb2hjaV9wbGF0Zm9ybV9wb3dlcl9vbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9oY2lfcGxhdGZvcm1fcHJpdiAqcHJpdiA9IGhjZF90b19vaGNpX3ByaXYoaGNkKTsKKwlpbnQgY2xrLCByZXQ7CisKKwlmb3IgKGNsayA9IDA7IGNsayA8IE9IQ0lfTUFYX0NMS1MgJiYgcHJpdi0+Y2xrc1tjbGtdOyBjbGsrKykgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+Y2xrc1tjbGtdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfY2xrczsKKwl9CisKKwlpZiAocHJpdi0+cGh5KSB7CisJCXJldCA9IHBoeV9pbml0KHByaXYtPnBoeSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9kaXNhYmxlX2Nsa3M7CisKKwkJcmV0ID0gcGh5X3Bvd2VyX29uKHByaXYtPnBoeSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9leGl0X3BoeTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2V4aXRfcGh5OgorCXBoeV9leGl0KHByaXYtPnBoeSk7CitlcnJfZGlzYWJsZV9jbGtzOgorCXdoaWxlICgtLWNsayA+PSAwKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrc1tjbGtdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9oY2lfcGxhdGZvcm1fcG93ZXJfb2ZmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gaGNkX3RvX29oY2lfcHJpdihoY2QpOworCWludCBjbGs7CisKKwlpZiAocHJpdi0+cGh5KSB7CisJCXBoeV9wb3dlcl9vZmYocHJpdi0+cGh5KTsKKwkJcGh5X2V4aXQocHJpdi0+cGh5KTsKKwl9CisKKwlmb3IgKGNsayA9IE9IQ0lfTUFYX0NMS1MgLSAxOyBjbGsgPj0gMDsgY2xrLS0pCisJCWlmIChwcml2LT5jbGtzW2Nsa10pCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrc1tjbGtdKTsKK30KKwogc3RhdGljIHN0cnVjdCBoY19kcml2ZXIgX19yZWFkX21vc3RseSBvaGNpX3BsYXRmb3JtX2hjX2RyaXZlcjsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvaGNpX2RyaXZlcl9vdmVycmlkZXMgcGxhdGZvcm1fb3ZlcnJpZGVzIF9faW5pdGNvbnN0ID0gewotCS5wcm9kdWN0X2Rlc2MgPQkiR2VuZXJpYyBQbGF0Zm9ybSBPSENJIGNvbnRyb2xsZXIiLAotCS5yZXNldCA9CW9oY2lfcGxhdGZvcm1fcmVzZXQsCisJLnByb2R1Y3RfZGVzYyA9CQkiR2VuZXJpYyBQbGF0Zm9ybSBPSENJIGNvbnRyb2xsZXIiLAorCS5yZXNldCA9CQlvaGNpX3BsYXRmb3JtX3Jlc2V0LAorCS5leHRyYV9wcml2X3NpemUgPQlzaXplb2Yoc3RydWN0IG9oY2lfcGxhdGZvcm1fcHJpdiksCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9vaGNpX3BkYXRhIG9oY2lfcGxhdGZvcm1fZGVmYXVsdHMgPSB7CisJLnBvd2VyX29uID0JCW9oY2lfcGxhdGZvcm1fcG93ZXJfb24sCisJLnBvd2VyX3N1c3BlbmQgPQlvaGNpX3BsYXRmb3JtX3Bvd2VyX29mZiwKKwkucG93ZXJfb2ZmID0JCW9oY2lfcGxhdGZvcm1fcG93ZXJfb2ZmLAogfTsKIAogc3RhdGljIGludCBvaGNpX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKQEAgLTYwLDE3ICsxMjMsMjQgQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzX21lbTsKIAlzdHJ1Y3QgdXNiX29oY2lfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpOwotCWludCBpcnE7Ci0JaW50IGVyciA9IC1FTk9NRU07Ci0KLQlpZiAoIXBkYXRhKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KKwlzdHJ1Y3Qgb2hjaV9wbGF0Zm9ybV9wcml2ICpwcml2OworCXN0cnVjdCBvaGNpX2hjZCAqb2hjaTsKKwlpbnQgZXJyLCBpcnEsIGNsayA9IDA7CiAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyoKKwkgKiBVc2UgcmVhc29uYWJsZSBkZWZhdWx0cyBzbyBwbGF0Zm9ybXMgZG9uJ3QgaGF2ZSB0byBwcm92aWRlIHRoZXNlCisJICogd2l0aCBEVCBwcm9iaW5nIG9uIEFSTS4KKwkgKi8KKwlpZiAoIXBkYXRhKQorCQlwZGF0YSA9ICZvaGNpX3BsYXRmb3JtX2RlZmF1bHRzOworCisJZXJyID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7CiAJaWYgKGlycSA8IDApIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJubyBpcnEgcHJvdmlkZWQiKTsKQEAgLTgzLDE3ICsxNTMsNzIgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmb2hjaV9wbGF0Zm9ybV9oY19kcml2ZXIsICZkZXYtPmRldiwKKwkJCWRldl9uYW1lKCZkZXYtPmRldikpOworCWlmICghaGNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKKwlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJcHJpdiA9IGhjZF90b19vaGNpX3ByaXYoaGNkKTsKKwlvaGNpID0gaGNkX3RvX29oY2koaGNkKTsKKworCWlmIChwZGF0YSA9PSAmb2hjaV9wbGF0Zm9ybV9kZWZhdWx0cyAmJiBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5kZXYub2Zfbm9kZSwgImJpZy1lbmRpYW4tcmVncyIpKQorCQkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9NTUlPOworCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5kZXYub2Zfbm9kZSwgImJpZy1lbmRpYW4tZGVzYyIpKQorCQkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19CRV9ERVNDOworCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5kZXYub2Zfbm9kZSwgImJpZy1lbmRpYW4iKSkKKwkJCW9oY2ktPmZsYWdzIHw9IE9IQ0lfUVVJUktfQkVfTU1JTyB8IE9IQ0lfUVVJUktfQkVfREVTQzsKKworCQlwcml2LT5waHkgPSBkZXZtX3BoeV9nZXQoJmRldi0+ZGV2LCAidXNiIik7CisJCWlmIChJU19FUlIocHJpdi0+cGh5KSkgeworCQkJZXJyID0gUFRSX0VSUihwcml2LT5waHkpOworCQkJaWYgKGVyciA9PSAtRVBST0JFX0RFRkVSKQorCQkJCWdvdG8gZXJyX3B1dF9oY2Q7CisJCQlwcml2LT5waHkgPSBOVUxMOworCQl9CisKKwkJZm9yIChjbGsgPSAwOyBjbGsgPCBPSENJX01BWF9DTEtTOyBjbGsrKykgeworCQkJcHJpdi0+Y2xrc1tjbGtdID0gb2ZfY2xrX2dldChkZXYtPmRldi5vZl9ub2RlLCBjbGspOworCQkJaWYgKElTX0VSUihwcml2LT5jbGtzW2Nsa10pKSB7CisJCQkJZXJyID0gUFRSX0VSUihwcml2LT5jbGtzW2Nsa10pOworCQkJCWlmIChlcnIgPT0gLUVQUk9CRV9ERUZFUikKKwkJCQkJZ290byBlcnJfcHV0X2Nsa3M7CisJCQkJcHJpdi0+Y2xrc1tjbGtdID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChwZGF0YS0+YmlnX2VuZGlhbl9kZXNjKQorCQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX0JFX0RFU0M7CisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX21taW8pCisJCW9oY2ktPmZsYWdzIHw9IE9IQ0lfUVVJUktfQkVfTU1JTzsKKworI2lmbmRlZiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPCisJaWYgKG9oY2ktPmZsYWdzICYgT0hDSV9RVUlSS19CRV9NTUlPKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIkVycm9yOiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIG5vdCBzZXRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXRfY2xrczsKKwl9CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQworCWlmIChvaGNpLT5mbGFncyAmIE9IQ0lfUVVJUktfQkVfREVTQykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJFcnJvcjogQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBub3Qgc2V0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0X2Nsa3M7CisJfQorI2VuZGlmCisKIAlpZiAocGRhdGEtPnBvd2VyX29uKSB7CiAJCWVyciA9IHBkYXRhLT5wb3dlcl9vbihkZXYpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaGNkID0gdXNiX2NyZWF0ZV9oY2QoJm9oY2lfcGxhdGZvcm1faGNfZHJpdmVyLCAmZGV2LT5kZXYsCi0JCQlkZXZfbmFtZSgmZGV2LT5kZXYpKTsKLQlpZiAoIWhjZCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9wb3dlcjsKKwkJCWdvdG8gZXJyX3B1dF9jbGtzOwogCX0KIAogCWhjZC0+cnNyY19zdGFydCA9IHJlc19tZW0tPnN0YXJ0OwpAQCAtMTAyLDExICsyMjcsMTEgQEAKIAloY2QtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJmRldi0+ZGV2LCByZXNfbWVtKTsKIAlpZiAoSVNfRVJSKGhjZC0+cmVncykpIHsKIAkJZXJyID0gUFRSX0VSUihoY2QtPnJlZ3MpOwotCQlnb3RvIGVycl9wdXRfaGNkOworCQlnb3RvIGVycl9wb3dlcjsKIAl9CiAJZXJyID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIElSUUZfU0hBUkVEKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9wdXRfaGNkOworCQlnb3RvIGVycl9wb3dlcjsKIAogCWRldmljZV93YWtldXBfZW5hYmxlKGhjZC0+c2VsZi5jb250cm9sbGVyKTsKIApAQCAtMTE0LDExICsyMzksMTcgQEAKIAogCXJldHVybiBlcnI7CiAKLWVycl9wdXRfaGNkOgotCXVzYl9wdXRfaGNkKGhjZCk7CiBlcnJfcG93ZXI6CiAJaWYgKHBkYXRhLT5wb3dlcl9vZmYpCiAJCXBkYXRhLT5wb3dlcl9vZmYoZGV2KTsKK2Vycl9wdXRfY2xrczoKKwl3aGlsZSAoLS1jbGsgPj0gMCkKKwkJY2xrX3B1dChwcml2LT5jbGtzW2Nsa10pOworZXJyX3B1dF9oY2Q6CisJaWYgKHBkYXRhID09ICZvaGNpX3BsYXRmb3JtX2RlZmF1bHRzKQorCQlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKKworCXVzYl9wdXRfaGNkKGhjZCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTI3LDEzICsyNTgsMjIgQEAKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgdXNiX29oY2lfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBvaGNpX3BsYXRmb3JtX3ByaXYgKnByaXYgPSBoY2RfdG9fb2hjaV9wcml2KGhjZCk7CisJaW50IGNsazsKIAogCXVzYl9yZW1vdmVfaGNkKGhjZCk7Ci0JdXNiX3B1dF9oY2QoaGNkKTsKIAogCWlmIChwZGF0YS0+cG93ZXJfb2ZmKQogCQlwZGF0YS0+cG93ZXJfb2ZmKGRldik7CiAKKwlmb3IgKGNsayA9IDA7IGNsayA8IE9IQ0lfTUFYX0NMS1MgJiYgcHJpdi0+Y2xrc1tjbGtdOyBjbGsrKykKKwkJY2xrX3B1dChwcml2LT5jbGtzW2Nsa10pOworCisJdXNiX3B1dF9oY2QoaGNkKTsKKworCWlmIChwZGF0YSA9PSAmb2hjaV9wbGF0Zm9ybV9kZWZhdWx0cykKKwkJZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IE5VTEw7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTgwLDYgKzMyMCwxMiBAQAogI2RlZmluZSBvaGNpX3BsYXRmb3JtX3Jlc3VtZQlOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9oY2lfcGxhdGZvcm1faWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJnZW5lcmljLW9oY2kiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9oY2lfcGxhdGZvcm1faWRzKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgb2hjaV9wbGF0Zm9ybV90YWJsZVtdID0gewogCXsgIm9oY2ktcGxhdGZvcm0iLCAwIH0sCiAJeyB9CkBAIC0yMDAsNiArMzQ2LDcgQEAKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gIm9oY2ktcGxhdGZvcm0iLAogCQkucG0JPSAmb2hjaV9wbGF0Zm9ybV9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9oY2lfcGxhdGZvcm1faWRzLAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1wbGF0Zm9ybS5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXBsYXRmb3JtLmMKaW5kZXggNDRlNmM5ZC4uMDE4MzNhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLXBsYXRmb3JtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXBsYXRmb3JtLmMKQEAgLTE0OCw2ICsxNDgsNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwbGF0Zm9ybV91aGNpX2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZ2VuZXJpYy11aGNpIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInBsYXRmb3JtLXVoY2kiLCB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCmluZGV4IDk5OTJmYmYuLjFhZDZiYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKQEAgLTczMiw5ICs3MzIsMTEgQEAKIAkJLyogU2V0IHRoZSBVMSBhbmQgVTIgZXhpdCBsYXRlbmNpZXMuICovCiAJCW1lbWNweShidWYsICZ1c2JfYm9zX2Rlc2NyaXB0b3IsCiAJCQkJVVNCX0RUX0JPU19TSVpFICsgVVNCX0RUX1VTQl9TU19DQVBfU0laRSk7Ci0JCXRlbXAgPSByZWFkbCgmeGhjaS0+Y2FwX3JlZ3MtPmhjc19wYXJhbXMzKTsKLQkJYnVmWzEyXSA9IEhDU19VMV9MQVRFTkNZKHRlbXApOwotCQlwdXRfdW5hbGlnbmVkX2xlMTYoSENTX1UyX0xBVEVOQ1kodGVtcCksICZidWZbMTNdKTsKKwkJaWYgKCh4aGNpLT5xdWlya3MgJiBYSENJX0xQTV9TVVBQT1JUKSkgeworCQkJdGVtcCA9IHJlYWRsKCZ4aGNpLT5jYXBfcmVncy0+aGNzX3BhcmFtczMpOworCQkJYnVmWzEyXSA9IEhDU19VMV9MQVRFTkNZKHRlbXApOworCQkJcHV0X3VuYWxpZ25lZF9sZTE2KEhDU19VMl9MQVRFTkNZKHRlbXApLCAmYnVmWzEzXSk7CisJCX0KIAogCQkvKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBob3N0IGhhcyBMVE0gc3VwcG9ydC4gKi8KIAkJdGVtcCA9IHJlYWRsKCZ4aGNpLT5jYXBfcmVncy0+aGNjX3BhcmFtcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKaW5kZXggYmNlNDM5MS4uYzA4OTY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwpAQCAtMTQ5LDE0ICsxNDksMTQwIEBACiAJfQogfQogCisvKgorICogV2UgbmVlZCBhIHJhZGl4IHRyZWUgZm9yIG1hcHBpbmcgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIFRSQnMgdG8gd2hpY2ggc3RyZWFtCisgKiBJRCB0aGV5IGJlbG9uZyB0by4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZSBob3N0IGNvbnRyb2xsZXIgd29uJ3QgdGVsbAorICogdXMgd2hpY2ggc3RyZWFtIHJpbmcgdGhlIFRSQiBjYW1lIGZyb20uICBXZSBjb3VsZCBzdG9yZSB0aGUgc3RyZWFtIElEIGluIGFuCisgKiBldmVudCBkYXRhIFRSQiwgYnV0IHRoYXQgZG9lc24ndCBoZWxwIHVzIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhc2UsIHNpbmNlIHRoZQorICogZW5kcG9pbnQgbWF5IHN0b3AgYmVmb3JlIGl0IHJlYWNoZXMgdGhhdCBldmVudCBkYXRhIFRSQi4KKyAqCisgKiBUaGUgcmFkaXggdHJlZSBtYXBzIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSBUUkIgRE1BIGFkZHJlc3MgdG8gYSByaW5nCisgKiBzZWdtZW50IHRoYXQgaGFzIHRoZSBzYW1lIHVwcGVyIHBvcnRpb24gb2YgRE1BIGFkZHJlc3Nlcy4gIEZvciBleGFtcGxlLCBzYXkgSQorICogaGF2ZSBzZWdtZW50cyBvZiBzaXplIDFLQiwgdGhhdCBhcmUgYWx3YXlzIDFLQiBhbGlnbmVkLiAgQSBzZWdtZW50IG1heQorICogc3RhcnQgYXQgMHgxMGM5MTAwMCBhbmQgZW5kIGF0IDB4MTBjOTEzZjAuICBJZiBJIHVzZSB0aGUgdXBwZXIgMTAgYml0cywgdGhlCisgKiBrZXkgdG8gdGhlIHN0cmVhbSBJRCBpcyAweDQzMjQ0LiAgSSBjYW4gdXNlIHRoZSBETUEgYWRkcmVzcyBvZiB0aGUgVFJCIHRvCisgKiBwYXNzIHRoZSByYWRpeCB0cmVlIGEga2V5IHRvIGdldCB0aGUgcmlnaHQgc3RyZWFtIElEOgorICoKKyAqCTB4MTBjOTBmZmYgPj4gMTAgPSAweDQzMjQzCisgKgkweDEwYzkxMmMwID4+IDEwID0gMHg0MzI0NAorICoJMHgxMGM5MTQwMCA+PiAxMCA9IDB4NDMyNDUKKyAqCisgKiBPYnZpb3VzbHksIG9ubHkgdGhvc2UgVFJCcyB3aXRoIERNQSBhZGRyZXNzZXMgdGhhdCBhcmUgd2l0aGluIHRoZSBzZWdtZW50CisgKiB3aWxsIG1ha2UgdGhlIHJhZGl4IHRyZWUgcmV0dXJuIHRoZSBzdHJlYW0gSUQgZm9yIHRoYXQgcmluZy4KKyAqCisgKiBDYXZlYXRzIGZvciB0aGUgcmFkaXggdHJlZToKKyAqCisgKiBUaGUgcmFkaXggdHJlZSB1c2VzIGFuIHVuc2lnbmVkIGxvbmcgYXMgYSBrZXkgcGFpci4gIE9uIDMyLWJpdCBzeXN0ZW1zLCBhbgorICogdW5zaWduZWQgbG9uZyB3aWxsIGJlIDMyLWJpdHM7IG9uIGEgNjQtYml0IHN5c3RlbSBhbiB1bnNpZ25lZCBsb25nIHdpbGwgYmUKKyAqIDY0LWJpdHMuICBTaW5jZSB3ZSBvbmx5IHJlcXVlc3QgMzItYml0IERNQSBhZGRyZXNzZXMsIHdlIGNhbiB1c2UgdGhhdCBhcyB0aGUKKyAqIGtleSBvbiAzMi1iaXQgb3IgNjQtYml0IHN5c3RlbXMgKGl0IHdvdWxkIGFsc28gYmUgZmluZSBpZiB3ZSBhc2tlZCBmb3IgNjQtYml0CisgKiBQQ0kgRE1BIGFkZHJlc3NlcyBvbiBhIDY0LWJpdCBzeXN0ZW0pLiAgVGhlcmUgbWlnaHQgYmUgYSBwcm9ibGVtIG9uIDMyLWJpdAorICogZXh0ZW5kZWQgc3lzdGVtcyAod2hlcmUgdGhlIERNQSBhZGRyZXNzIGNhbiBiZSBiaWdnZXIgdGhhbiAzMi1iaXRzKSwKKyAqIGlmIHdlIGFsbG93IHRoZSBQQ0kgZG1hIG1hc2sgdG8gYmUgYmlnZ2VyIHRoYW4gMzItYml0cy4gIFNvIGRvbid0IGRvIHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgeGhjaV9pbnNlcnRfc2VnbWVudF9tYXBwaW5nKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnRyYl9hZGRyZXNzX21hcCwKKwkJc3RydWN0IHhoY2lfcmluZyAqcmluZywKKwkJc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnLAorCQlnZnBfdCBtZW1fZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBrZXk7CisJaW50IHJldDsKKworCWtleSA9ICh1bnNpZ25lZCBsb25nKShzZWctPmRtYSA+PiBUUkJfU0VHTUVOVF9TSElGVCk7CisJLyogU2tpcCBhbnkgc2VnbWVudHMgdGhhdCB3ZXJlIGFscmVhZHkgYWRkZWQuICovCisJaWYgKHJhZGl4X3RyZWVfbG9va3VwKHRyYl9hZGRyZXNzX21hcCwga2V5KSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSByYWRpeF90cmVlX21heWJlX3ByZWxvYWQobWVtX2ZsYWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHJhZGl4X3RyZWVfaW5zZXJ0KHRyYl9hZGRyZXNzX21hcCwKKwkJCWtleSwgcmluZyk7CisJcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHhoY2lfcmVtb3ZlX3NlZ21lbnRfbWFwcGluZyhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICp0cmJfYWRkcmVzc19tYXAsCisJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZykKK3sKKwl1bnNpZ25lZCBsb25nIGtleTsKKworCWtleSA9ICh1bnNpZ25lZCBsb25nKShzZWctPmRtYSA+PiBUUkJfU0VHTUVOVF9TSElGVCk7CisJaWYgKHJhZGl4X3RyZWVfbG9va3VwKHRyYl9hZGRyZXNzX21hcCwga2V5KSkKKwkJcmFkaXhfdHJlZV9kZWxldGUodHJiX2FkZHJlc3NfbWFwLCBrZXkpOworfQorCitzdGF0aWMgaW50IHhoY2lfdXBkYXRlX3N0cmVhbV9zZWdtZW50X21hcHBpbmcoCisJCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnRyYl9hZGRyZXNzX21hcCwKKwkJc3RydWN0IHhoY2lfcmluZyAqcmluZywKKwkJc3RydWN0IHhoY2lfc2VnbWVudCAqZmlyc3Rfc2VnLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpsYXN0X3NlZywKKwkJZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZzsKKwlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpmYWlsZWRfc2VnOworCWludCByZXQ7CisKKwlpZiAoV0FSTl9PTl9PTkNFKHRyYl9hZGRyZXNzX21hcCA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlzZWcgPSBmaXJzdF9zZWc7CisJZG8geworCQlyZXQgPSB4aGNpX2luc2VydF9zZWdtZW50X21hcHBpbmcodHJiX2FkZHJlc3NfbWFwLAorCQkJCXJpbmcsIHNlZywgbWVtX2ZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gcmVtb3ZlX3N0cmVhbXM7CisJCWlmIChzZWcgPT0gbGFzdF9zZWcpCisJCQlyZXR1cm4gMDsKKwkJc2VnID0gc2VnLT5uZXh0OworCX0gd2hpbGUgKHNlZyAhPSBmaXJzdF9zZWcpOworCisJcmV0dXJuIDA7CisKK3JlbW92ZV9zdHJlYW1zOgorCWZhaWxlZF9zZWcgPSBzZWc7CisJc2VnID0gZmlyc3Rfc2VnOworCWRvIHsKKwkJeGhjaV9yZW1vdmVfc2VnbWVudF9tYXBwaW5nKHRyYl9hZGRyZXNzX21hcCwgc2VnKTsKKwkJaWYgKHNlZyA9PSBmYWlsZWRfc2VnKQorCQkJcmV0dXJuIHJldDsKKwkJc2VnID0gc2VnLT5uZXh0OworCX0gd2hpbGUgKHNlZyAhPSBmaXJzdF9zZWcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeGhjaV9yZW1vdmVfc3RyZWFtX21hcHBpbmcoc3RydWN0IHhoY2lfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpzZWc7CisKKwlpZiAoV0FSTl9PTl9PTkNFKHJpbmctPnRyYl9hZGRyZXNzX21hcCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJc2VnID0gcmluZy0+Zmlyc3Rfc2VnOworCWRvIHsKKwkJeGhjaV9yZW1vdmVfc2VnbWVudF9tYXBwaW5nKHJpbmctPnRyYl9hZGRyZXNzX21hcCwgc2VnKTsKKwkJc2VnID0gc2VnLT5uZXh0OworCX0gd2hpbGUgKHNlZyAhPSByaW5nLT5maXJzdF9zZWcpOworfQorCitzdGF0aWMgaW50IHhoY2lfdXBkYXRlX3N0cmVhbV9tYXBwaW5nKHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsIGdmcF90IG1lbV9mbGFncykKK3sKKwlyZXR1cm4geGhjaV91cGRhdGVfc3RyZWFtX3NlZ21lbnRfbWFwcGluZyhyaW5nLT50cmJfYWRkcmVzc19tYXAsIHJpbmcsCisJCQlyaW5nLT5maXJzdF9zZWcsIHJpbmctPmxhc3Rfc2VnLCBtZW1fZmxhZ3MpOworfQorCiAvKiBYWFg6IERvIHdlIG5lZWQgdGhlIGhjZCBzdHJ1Y3R1cmUgaW4gYWxsIHRoZXNlIGZ1bmN0aW9ucz8gKi8KIHZvaWQgeGhjaV9yaW5nX2ZyZWUoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQogewogCWlmICghcmluZykKIAkJcmV0dXJuOwogCi0JaWYgKHJpbmctPmZpcnN0X3NlZykKKwlpZiAocmluZy0+Zmlyc3Rfc2VnKSB7CisJCWlmIChyaW5nLT50eXBlID09IFRZUEVfU1RSRUFNKQorCQkJeGhjaV9yZW1vdmVfc3RyZWFtX21hcHBpbmcocmluZyk7CiAJCXhoY2lfZnJlZV9zZWdtZW50c19mb3JfcmluZyh4aGNpLCByaW5nLT5maXJzdF9zZWcpOworCX0KIAogCWtmcmVlKHJpbmcpOwogfQpAQCAtMzQ5LDYgKzQ3NSwyMSBAQAogCWlmIChyZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKHJpbmctPnR5cGUgPT0gVFlQRV9TVFJFQU0pCisJCXJldCA9IHhoY2lfdXBkYXRlX3N0cmVhbV9zZWdtZW50X21hcHBpbmcocmluZy0+dHJiX2FkZHJlc3NfbWFwLAorCQkJCQkJcmluZywgZmlyc3QsIGxhc3QsIGZsYWdzKTsKKwlpZiAocmV0KSB7CisJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKm5leHQ7CisJCWRvIHsKKwkJCW5leHQgPSBmaXJzdC0+bmV4dDsKKwkJCXhoY2lfc2VnbWVudF9mcmVlKHhoY2ksIGZpcnN0KTsKKwkJCWlmIChmaXJzdCA9PSBsYXN0KQorCQkJCWJyZWFrOworCQkJZmlyc3QgPSBuZXh0OworCQl9IHdoaWxlICh0cnVlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAl4aGNpX2xpbmtfcmluZ3MoeGhjaSwgcmluZywgZmlyc3QsIGxhc3QsIG51bV9zZWdzKTsKIAl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19yaW5nX2V4cGFuc2lvbiwKIAkJCSJyaW5nIGV4cGFuc2lvbiBzdWNjZWVkLCBub3cgaGFzICVkIHNlZ21lbnRzIiwKQEAgLTQzNCwxMiArNTc1LDEyIEBACiAJCXN0cnVjdCB4aGNpX3N0cmVhbV9jdHggKnN0cmVhbV9jdHgsIGRtYV9hZGRyX3QgZG1hKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHhoY2lfdG9faGNkKHhoY2kpLT5zZWxmLmNvbnRyb2xsZXI7CisJc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IHhoY2lfc3RyZWFtX2N0eCkgKiBudW1fc3RyZWFtX2N0eHM7CiAKLQlpZiAobnVtX3N0cmVhbV9jdHhzID4gTUVESVVNX1NUUkVBTV9BUlJBWV9TSVpFKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsCi0JCQkJc2l6ZW9mKHN0cnVjdCB4aGNpX3N0cmVhbV9jdHgpKm51bV9zdHJlYW1fY3R4cywKKwlpZiAoc2l6ZSA+IE1FRElVTV9TVFJFQU1fQVJSQVlfU0laRSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLAogCQkJCXN0cmVhbV9jdHgsIGRtYSk7Ci0JZWxzZSBpZiAobnVtX3N0cmVhbV9jdHhzIDw9IFNNQUxMX1NUUkVBTV9BUlJBWV9TSVpFKQorCWVsc2UgaWYgKHNpemUgPD0gU01BTExfU1RSRUFNX0FSUkFZX1NJWkUpCiAJCXJldHVybiBkbWFfcG9vbF9mcmVlKHhoY2ktPnNtYWxsX3N0cmVhbXNfcG9vbCwKIAkJCQlzdHJlYW1fY3R4LCBkbWEpOwogCWVsc2UKQEAgLTQ2MiwxMiArNjAzLDEyIEBACiAJCWdmcF90IG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB4aGNpX3RvX2hjZCh4aGNpKS0+c2VsZi5jb250cm9sbGVyOworCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCB4aGNpX3N0cmVhbV9jdHgpICogbnVtX3N0cmVhbV9jdHhzOwogCi0JaWYgKG51bV9zdHJlYW1fY3R4cyA+IE1FRElVTV9TVFJFQU1fQVJSQVlfU0laRSkKLQkJcmV0dXJuIGRtYV9hbGxvY19jb2hlcmVudChkZXYsCi0JCQkJc2l6ZW9mKHN0cnVjdCB4aGNpX3N0cmVhbV9jdHgpKm51bV9zdHJlYW1fY3R4cywKKwlpZiAoc2l6ZSA+IE1FRElVTV9TVFJFQU1fQVJSQVlfU0laRSkKKwkJcmV0dXJuIGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsCiAJCQkJZG1hLCBtZW1fZmxhZ3MpOwotCWVsc2UgaWYgKG51bV9zdHJlYW1fY3R4cyA8PSBTTUFMTF9TVFJFQU1fQVJSQVlfU0laRSkKKwllbHNlIGlmIChzaXplIDw9IFNNQUxMX1NUUkVBTV9BUlJBWV9TSVpFKQogCQlyZXR1cm4gZG1hX3Bvb2xfYWxsb2MoeGhjaS0+c21hbGxfc3RyZWFtc19wb29sLAogCQkJCW1lbV9mbGFncywgZG1hKTsKIAllbHNlCkBAIC01MTAsMzYgKzY1MSw2IEBACiAgKiBUaGUgbnVtYmVyIG9mIHN0cmVhbSBjb250ZXh0cyBpbiB0aGUgc3RyZWFtIGNvbnRleHQgYXJyYXkgbWF5IGJlIGJpZ2dlciB0aGFuCiAgKiB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgdGhlIGRyaXZlciB3YW50cyB0byB1c2UuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG51bWJlciBvZgogICogc3RyZWFtIGNvbnRleHQgYXJyYXkgZW50cmllcyBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgotICoKLSAqIFdlIG5lZWQgYSByYWRpeCB0cmVlIGZvciBtYXBwaW5nIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBUUkJzIHRvIHdoaWNoIHN0cmVhbQotICogSUQgdGhleSBiZWxvbmcgdG8uICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUgaG9zdCBjb250cm9sbGVyIHdvbid0IHRlbGwKLSAqIHVzIHdoaWNoIHN0cmVhbSByaW5nIHRoZSBUUkIgY2FtZSBmcm9tLiAgV2UgY291bGQgc3RvcmUgdGhlIHN0cmVhbSBJRCBpbiBhbgotICogZXZlbnQgZGF0YSBUUkIsIGJ1dCB0aGF0IGRvZXNuJ3QgaGVscCB1cyBmb3IgdGhlIGNhbmNlbGxhdGlvbiBjYXNlLCBzaW5jZSB0aGUKLSAqIGVuZHBvaW50IG1heSBzdG9wIGJlZm9yZSBpdCByZWFjaGVzIHRoYXQgZXZlbnQgZGF0YSBUUkIuCi0gKgotICogVGhlIHJhZGl4IHRyZWUgbWFwcyB0aGUgdXBwZXIgcG9ydGlvbiBvZiB0aGUgVFJCIERNQSBhZGRyZXNzIHRvIGEgcmluZwotICogc2VnbWVudCB0aGF0IGhhcyB0aGUgc2FtZSB1cHBlciBwb3J0aW9uIG9mIERNQSBhZGRyZXNzZXMuICBGb3IgZXhhbXBsZSwgc2F5IEkKLSAqIGhhdmUgc2VnbWVudHMgb2Ygc2l6ZSAxS0IsIHRoYXQgYXJlIGFsd2F5cyA2NC1ieXRlIGFsaWduZWQuICBBIHNlZ21lbnQgbWF5Ci0gKiBzdGFydCBhdCAweDEwYzkxMDAwIGFuZCBlbmQgYXQgMHgxMGM5MTNmMC4gIElmIEkgdXNlIHRoZSB1cHBlciAxMCBiaXRzLCB0aGUKLSAqIGtleSB0byB0aGUgc3RyZWFtIElEIGlzIDB4NDMyNDQuICBJIGNhbiB1c2UgdGhlIERNQSBhZGRyZXNzIG9mIHRoZSBUUkIgdG8KLSAqIHBhc3MgdGhlIHJhZGl4IHRyZWUgYSBrZXkgdG8gZ2V0IHRoZSByaWdodCBzdHJlYW0gSUQ6Ci0gKgotICogCTB4MTBjOTBmZmYgPj4gMTAgPSAweDQzMjQzCi0gKiAJMHgxMGM5MTJjMCA+PiAxMCA9IDB4NDMyNDQKLSAqIAkweDEwYzkxNDAwID4+IDEwID0gMHg0MzI0NQotICoKLSAqIE9idmlvdXNseSwgb25seSB0aG9zZSBUUkJzIHdpdGggRE1BIGFkZHJlc3NlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIHNlZ21lbnQKLSAqIHdpbGwgbWFrZSB0aGUgcmFkaXggdHJlZSByZXR1cm4gdGhlIHN0cmVhbSBJRCBmb3IgdGhhdCByaW5nLgotICoKLSAqIENhdmVhdHMgZm9yIHRoZSByYWRpeCB0cmVlOgotICoKLSAqIFRoZSByYWRpeCB0cmVlIHVzZXMgYW4gdW5zaWduZWQgbG9uZyBhcyBhIGtleSBwYWlyLiAgT24gMzItYml0IHN5c3RlbXMsIGFuCi0gKiB1bnNpZ25lZCBsb25nIHdpbGwgYmUgMzItYml0czsgb24gYSA2NC1iaXQgc3lzdGVtIGFuIHVuc2lnbmVkIGxvbmcgd2lsbCBiZQotICogNjQtYml0cy4gIFNpbmNlIHdlIG9ubHkgcmVxdWVzdCAzMi1iaXQgRE1BIGFkZHJlc3Nlcywgd2UgY2FuIHVzZSB0aGF0IGFzIHRoZQotICoga2V5IG9uIDMyLWJpdCBvciA2NC1iaXQgc3lzdGVtcyAoaXQgd291bGQgYWxzbyBiZSBmaW5lIGlmIHdlIGFza2VkIGZvciA2NC1iaXQKLSAqIFBDSSBETUEgYWRkcmVzc2VzIG9uIGEgNjQtYml0IHN5c3RlbSkuICBUaGVyZSBtaWdodCBiZSBhIHByb2JsZW0gb24gMzItYml0Ci0gKiBleHRlbmRlZCBzeXN0ZW1zICh3aGVyZSB0aGUgRE1BIGFkZHJlc3MgY2FuIGJlIGJpZ2dlciB0aGFuIDMyLWJpdHMpLAotICogaWYgd2UgYWxsb3cgdGhlIFBDSSBkbWEgbWFzayB0byBiZSBiaWdnZXIgdGhhbiAzMi1iaXRzLiAgU28gZG9uJ3QgZG8gdGhhdC4KICAqLwogc3RydWN0IHhoY2lfc3RyZWFtX2luZm8gKnhoY2lfYWxsb2Nfc3RyZWFtX2luZm8oc3RydWN0IHhoY2lfaGNkICp4aGNpLAogCQl1bnNpZ25lZCBpbnQgbnVtX3N0cmVhbV9jdHhzLApAQCAtNTQ4LDcgKzY1OSw2IEBACiAJc3RydWN0IHhoY2lfc3RyZWFtX2luZm8gKnN0cmVhbV9pbmZvOwogCXUzMiBjdXJfc3RyZWFtOwogCXN0cnVjdCB4aGNpX3JpbmcgKmN1cl9yaW5nOwotCXVuc2lnbmVkIGxvbmcga2V5OwogCXU2NCBhZGRyOwogCWludCByZXQ7CiAKQEAgLTYwMyw2ICs3MTMsNyBAQAogCQlpZiAoIWN1cl9yaW5nKQogCQkJZ290byBjbGVhbnVwX3JpbmdzOwogCQljdXJfcmluZy0+c3RyZWFtX2lkID0gY3VyX3N0cmVhbTsKKwkJY3VyX3JpbmctPnRyYl9hZGRyZXNzX21hcCA9ICZzdHJlYW1faW5mby0+dHJiX2FkZHJlc3NfbWFwOwogCQkvKiBTZXQgZGVxIHB0ciwgY3ljbGUgYml0LCBhbmQgc3RyZWFtIGNvbnRleHQgdHlwZSAqLwogCQlhZGRyID0gY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hIHwKIAkJCVNDVF9GT1JfQ1RYKFNDVF9QUklfVFIpIHwKQEAgLTYxMiwxMCArNzIzLDcgQEAKIAkJeGhjaV9kYmcoeGhjaSwgIlNldHRpbmcgc3RyZWFtICVkIHJpbmcgcHRyIHRvIDB4JTA4bGx4XG4iLAogCQkJCWN1cl9zdHJlYW0sICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHIpOwogCi0JCWtleSA9ICh1bnNpZ25lZCBsb25nKQotCQkJKGN1cl9yaW5nLT5maXJzdF9zZWctPmRtYSA+PiBUUkJfU0VHTUVOVF9TSElGVCk7Ci0JCXJldCA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZzdHJlYW1faW5mby0+dHJiX2FkZHJlc3NfbWFwLAotCQkJCWtleSwgY3VyX3JpbmcpOworCQlyZXQgPSB4aGNpX3VwZGF0ZV9zdHJlYW1fbWFwcGluZyhjdXJfcmluZywgbWVtX2ZsYWdzKTsKIAkJaWYgKHJldCkgewogCQkJeGhjaV9yaW5nX2ZyZWUoeGhjaSwgY3VyX3JpbmcpOwogCQkJc3RyZWFtX2luZm8tPnN0cmVhbV9yaW5nc1tjdXJfc3RyZWFtXSA9IE5VTEw7CkBAIC02MzUsOSArNzQzLDYgQEAKIAlmb3IgKGN1cl9zdHJlYW0gPSAxOyBjdXJfc3RyZWFtIDwgbnVtX3N0cmVhbXM7IGN1cl9zdHJlYW0rKykgewogCQljdXJfcmluZyA9IHN0cmVhbV9pbmZvLT5zdHJlYW1fcmluZ3NbY3VyX3N0cmVhbV07CiAJCWlmIChjdXJfcmluZykgewotCQkJYWRkciA9IGN1cl9yaW5nLT5maXJzdF9zZWctPmRtYTsKLQkJCXJhZGl4X3RyZWVfZGVsZXRlKCZzdHJlYW1faW5mby0+dHJiX2FkZHJlc3NfbWFwLAotCQkJCQlhZGRyID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKIAkJCXhoY2lfcmluZ19mcmVlKHhoY2ksIGN1cl9yaW5nKTsKIAkJCXN0cmVhbV9pbmZvLT5zdHJlYW1fcmluZ3NbY3VyX3N0cmVhbV0gPSBOVUxMOwogCQl9CkBAIC02OTgsNyArODAzLDYgQEAKIHsKIAlpbnQgY3VyX3N0cmVhbTsKIAlzdHJ1Y3QgeGhjaV9yaW5nICpjdXJfcmluZzsKLQlkbWFfYWRkcl90IGFkZHI7CiAKIAlpZiAoIXN0cmVhbV9pbmZvKQogCQlyZXR1cm47CkBAIC03MDcsOSArODExLDYgQEAKIAkJCWN1cl9zdHJlYW0rKykgewogCQljdXJfcmluZyA9IHN0cmVhbV9pbmZvLT5zdHJlYW1fcmluZ3NbY3VyX3N0cmVhbV07CiAJCWlmIChjdXJfcmluZykgewotCQkJYWRkciA9IGN1cl9yaW5nLT5maXJzdF9zZWctPmRtYTsKLQkJCXJhZGl4X3RyZWVfZGVsZXRlKCZzdHJlYW1faW5mby0+dHJiX2FkZHJlc3NfbWFwLAotCQkJCQlhZGRyID4+IFRSQl9TRUdNRU5UX1NISUZUKTsKIAkJCXhoY2lfcmluZ19mcmVlKHhoY2ksIGN1cl9yaW5nKTsKIAkJCXN0cmVhbV9pbmZvLT5zdHJlYW1fcmluZ3NbY3VyX3N0cmVhbV0gPSBOVUxMOwogCQl9CkBAIC0xNzExLDcgKzE4MTIsNiBAQAogCiAJaWYgKHhoY2ktPmxwbV9jb21tYW5kKQogCQl4aGNpX2ZyZWVfY29tbWFuZCh4aGNpLCB4aGNpLT5scG1fY29tbWFuZCk7Ci0JeGhjaS0+Y21kX3JpbmdfcmVzZXJ2ZWRfdHJicyA9IDA7CiAJaWYgKHhoY2ktPmNtZF9yaW5nKQogCQl4aGNpX3JpbmdfZnJlZSh4aGNpLCB4aGNpLT5jbWRfcmluZyk7CiAJeGhjaS0+Y21kX3JpbmcgPSBOVUxMOwpAQCAtMTc3Niw2ICsxODc2LDcgQEAKIAl9CiAKIG5vX2J3OgorCXhoY2ktPmNtZF9yaW5nX3Jlc2VydmVkX3RyYnMgPSAwOwogCXhoY2ktPm51bV91c2IyX3BvcnRzID0gMDsKIAl4aGNpLT5udW1fdXNiM19wb3J0cyA9IDA7CiAJeGhjaS0+bnVtX2FjdGl2ZV9lcHMgPSAwOwpAQCAtMjI3NCwxMSArMjM3NSwxMiBAQAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgcmluZyBzZWdtZW50IHBvb2wuICBUaGUgcmluZyBtdXN0IGJlIGEgY29udGlndW91cwogCSAqIHN0cnVjdHVyZSBjb21wcmlzZWQgb2YgVFJCcy4gIFRoZSBUUkJzIG11c3QgYmUgMTYgYnl0ZSBhbGlnbmVkLAotCSAqIGhvd2V2ZXIsIHRoZSBjb21tYW5kIHJpbmcgc2VnbWVudCBuZWVkcyA2NC1ieXRlIGFsaWduZWQgc2VnbWVudHMsCi0JICogc28gd2UgcGljayB0aGUgZ3JlYXRlciBhbGlnbm1lbnQgbmVlZC4KKwkgKiBob3dldmVyLCB0aGUgY29tbWFuZCByaW5nIHNlZ21lbnQgbmVlZHMgNjQtYnl0ZSBhbGlnbmVkIHNlZ21lbnRzCisJICogYW5kIG91ciB1c2Ugb2YgZG1hIGFkZHJlc3NlcyBpbiB0aGUgdHJiX2FkZHJlc3NfbWFwIHJhZGl4IHRyZWUgbmVlZHMKKwkgKiBUUkJfU0VHTUVOVF9TSVpFIGFsaWdubWVudCwgc28gd2UgcGljayB0aGUgZ3JlYXRlciBhbGlnbm1lbnQgbmVlZC4KIAkgKi8KIAl4aGNpLT5zZWdtZW50X3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoInhIQ0kgcmluZyBzZWdtZW50cyIsIGRldiwKLQkJCVRSQl9TRUdNRU5UX1NJWkUsIDY0LCB4aGNpLT5wYWdlX3NpemUpOworCQkJVFJCX1NFR01FTlRfU0laRSwgVFJCX1NFR01FTlRfU0laRSwgeGhjaS0+cGFnZV9zaXplKTsKIAogCS8qIFNlZSBUYWJsZSA0NiBhbmQgTm90ZSBvbiBGaWd1cmUgNTUgKi8KIAl4aGNpLT5kZXZpY2VfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgieEhDSSBpbnB1dC9vdXRwdXQgY29udGV4dHMiLCBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKaW5kZXggMDRmOTg2ZC4uNDczOTBlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwpAQCAtMTkwLDYgKzE5MCwxMCBAQAogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAKIAlkcml2ZXIgPSAoc3RydWN0IGhjX2RyaXZlciAqKWlkLT5kcml2ZXJfZGF0YTsKKworCS8qIFByZXZlbnQgcnVudGltZSBzdXNwZW5kaW5nIGJldHdlZW4gVVNCLTIgYW5kIFVTQi0zIGluaXRpYWxpemF0aW9uICovCisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmRldi0+ZGV2KTsKKwogCS8qIFJlZ2lzdGVyIHRoZSBVU0IgMi4wIHJvb3RodWIuCiAJICogRklYTUU6IFVTQiBjb3JlIG11c3Qga25vdyB0byByZWdpc3RlciB0aGUgVVNCIDIuMCByb290aHViIGZpcnN0LgogCSAqIFRoaXMgaXMgc29ydCBvZiBzaWxseSwgYmVjYXVzZSB3ZSBjb3VsZCBqdXN0IHNldCB0aGUgSENEIGRyaXZlciBmbGFncwpAQCAtMTk5LDcgKzIwMyw3IEBACiAJcmV0dmFsID0gdXNiX2hjZF9wY2lfcHJvYmUoZGV2LCBpZCk7CiAKIAlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIHB1dF9ydW50aW1lX3BtOwogCiAJLyogVVNCIDIuMCByb290aHViIGlzIHN0b3JlZCBpbiB0aGUgUENJIGRldmljZSBub3cuICovCiAJaGNkID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CkBAIC0yMjIsMTEgKzIyNiwxMSBAQAogCQlnb3RvIHB1dF91c2IzX2hjZDsKIAkvKiBSb290aHViIGFscmVhZHkgbWFya2VkIGFzIFVTQiAzLjAgc3BlZWQgKi8KIAotCS8qIFdlIGtub3cgdGhlIExQTSB0aW1lb3V0IGFsZ29yaXRobXMgZm9yIHRoaXMgaG9zdCwgbGV0IHRoZSBVU0IgY29yZQotCSAqIGVuYWJsZSBhbmQgZGlzYWJsZSBMUE0gZm9yIGRldmljZXMgdW5kZXIgdGhlIFVTQiAzLjAgcm9vdGh1Yi4KLQkgKi8KLQlpZiAoeGhjaS0+cXVpcmtzICYgWEhDSV9MUE1fU1VQUE9SVCkKLQkJaGNkX3RvX2J1cyh4aGNpLT5zaGFyZWRfaGNkKS0+cm9vdF9odWItPmxwbV9jYXBhYmxlID0gMTsKKwlpZiAoSENDX01BWF9QU0EoeGhjaS0+aGNjX3BhcmFtcykgPj0gNCkKKwkJeGhjaS0+c2hhcmVkX2hjZC0+Y2FuX2RvX3N0cmVhbXMgPSAxOworCisJLyogVVNCLTIgYW5kIFVTQi0zIHJvb3RodWJzIGluaXRpYWxpemVkLCBhbGxvdyBydW50aW1lIHBtIHN1c3BlbmQgKi8KKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmRldi0+ZGV2KTsKIAogCXJldHVybiAwOwogCkBAIC0yMzQsNiArMjM4LDggQEAKIAl1c2JfcHV0X2hjZCh4aGNpLT5zaGFyZWRfaGNkKTsKIGRlYWxsb2NfdXNiMl9oY2Q6CiAJdXNiX2hjZF9wY2lfcmVtb3ZlKGRldik7CitwdXRfcnVudGltZV9wbToKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmRldi0+ZGV2KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBsYXQuYwppbmRleCA4YWJkYTVjLi4xNTE5MDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMKQEAgLTE1OCw2ICsxNTgsOSBAQAogCSAqLwogCSooKHN0cnVjdCB4aGNpX2hjZCAqKikgeGhjaS0+c2hhcmVkX2hjZC0+aGNkX3ByaXYpID0geGhjaTsKIAorCWlmIChIQ0NfTUFYX1BTQSh4aGNpLT5oY2NfcGFyYW1zKSA+PSA0KQorCQl4aGNpLT5zaGFyZWRfaGNkLT5jYW5fZG9fc3RyZWFtcyA9IDE7CisKIAlyZXQgPSB1c2JfYWRkX2hjZCh4aGNpLT5zaGFyZWRfaGNkLCBpcnEsIElSUUZfU0hBUkVEKTsKIAlpZiAocmV0KQogCQlnb3RvIHB1dF91c2IzX2hjZDsKQEAgLTIyNiw2ICsyMjksNyBAQAogCiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB1c2JfeGhjaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiZ2VuZXJpYy14aGNpIiB9LAogCXsgLmNvbXBhdGlibGUgPSAieGhjaS1wbGF0Zm9ybSIgfSwKIAl7IH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKaW5kZXggMGVkNjRlYi4uNWY5MjZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCkBAIC01NDYsOSArNTQ2LDkgQEAKIAkJc3RydWN0IHhoY2lfZGVxdWV1ZV9zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IHhoY2lfdmlydF9kZXZpY2UgKmRldiA9IHhoY2ktPmRldnNbc2xvdF9pZF07CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXAgPSAmZGV2LT5lcHNbZXBfaW5kZXhdOwogCXN0cnVjdCB4aGNpX3JpbmcgKmVwX3Jpbmc7CiAJc3RydWN0IHhoY2lfZ2VuZXJpY190cmIgKnRyYjsKLQlzdHJ1Y3QgeGhjaV9lcF9jdHggKmVwX2N0eDsKIAlkbWFfYWRkcl90IGFkZHI7CiAKIAllcF9yaW5nID0geGhjaV90cmlhZF90b190cmFuc2Zlcl9yaW5nKHhoY2ksIHNsb3RfaWQsCkBAIC01NzMsOCArNTczLDE2IEBACiAJLyogRGlnIG91dCB0aGUgY3ljbGUgc3RhdGUgc2F2ZWQgYnkgdGhlIHhIQyBkdXJpbmcgdGhlIHN0b3AgZXAgY21kICovCiAJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKIAkJCSJGaW5kaW5nIGVuZHBvaW50IGNvbnRleHQiKTsKLQllcF9jdHggPSB4aGNpX2dldF9lcF9jdHgoeGhjaSwgZGV2LT5vdXRfY3R4LCBlcF9pbmRleCk7Ci0Jc3RhdGUtPm5ld19jeWNsZV9zdGF0ZSA9IDB4MSAmIGxlNjRfdG9fY3B1KGVwX2N0eC0+ZGVxKTsKKwkvKiA0LjYuOSB0aGUgY3NzIGZsYWcgaXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGNvbnRleHQgZm9yIHN0cmVhbXMgKi8KKwlpZiAoZXAtPmVwX3N0YXRlICYgRVBfSEFTX1NUUkVBTVMpIHsKKwkJc3RydWN0IHhoY2lfc3RyZWFtX2N0eCAqY3R4ID0KKwkJCSZlcC0+c3RyZWFtX2luZm8tPnN0cmVhbV9jdHhfYXJyYXlbc3RyZWFtX2lkXTsKKwkJc3RhdGUtPm5ld19jeWNsZV9zdGF0ZSA9IDB4MSAmIGxlNjRfdG9fY3B1KGN0eC0+c3RyZWFtX3JpbmcpOworCX0gZWxzZSB7CisJCXN0cnVjdCB4aGNpX2VwX2N0eCAqZXBfY3R4CisJCQk9IHhoY2lfZ2V0X2VwX2N0eCh4aGNpLCBkZXYtPm91dF9jdHgsIGVwX2luZGV4KTsKKwkJc3RhdGUtPm5ld19jeWNsZV9zdGF0ZSA9IDB4MSAmIGxlNjRfdG9fY3B1KGVwX2N0eC0+ZGVxKTsKKwl9CiAKIAlzdGF0ZS0+bmV3X2RlcV9wdHIgPSBjdXJfdGQtPmxhc3RfdHJiOwogCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX2NhbmNlbF91cmIsCkBAIC04OTIsNiArOTAwLDU3IEBACiAJLyogUmV0dXJuIHRvIHRoZSBldmVudCBoYW5kbGVyIHdpdGggeGhjaS0+bG9jayByZS1hY3F1aXJlZCAqLwogfQogCitzdGF0aWMgdm9pZCB4aGNpX2tpbGxfcmluZ191cmJzKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgc3RydWN0IHhoY2lfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgeGhjaV90ZCAqY3VyX3RkOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT50ZF9saXN0KSkgeworCQljdXJfdGQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZyaW5nLT50ZF9saXN0LAorCQkJCXN0cnVjdCB4aGNpX3RkLCB0ZF9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT50ZF9saXN0KTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KSkKKwkJCWxpc3RfZGVsX2luaXQoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpOworCQl4aGNpX2dpdmViYWNrX3VyYl9pbl9pcnEoeGhjaSwgY3VyX3RkLCAtRVNIVVRET1dOKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhoY2lfa2lsbF9lbmRwb2ludF91cmJzKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJaW50IHNsb3RfaWQsIGludCBlcF9pbmRleCkKK3sKKwlzdHJ1Y3QgeGhjaV90ZCAqY3VyX3RkOworCXN0cnVjdCB4aGNpX3ZpcnRfZXAgKmVwOworCXN0cnVjdCB4aGNpX3JpbmcgKnJpbmc7CisKKwllcCA9ICZ4aGNpLT5kZXZzW3Nsb3RfaWRdLT5lcHNbZXBfaW5kZXhdOworCWlmICgoZXAtPmVwX3N0YXRlICYgRVBfSEFTX1NUUkVBTVMpIHx8CisJCQkoZXAtPmVwX3N0YXRlICYgRVBfR0VUVElOR19OT19TVFJFQU1TKSkgeworCQlpbnQgc3RyZWFtX2lkOworCisJCWZvciAoc3RyZWFtX2lkID0gMDsgc3RyZWFtX2lkIDwgZXAtPnN0cmVhbV9pbmZvLT5udW1fc3RyZWFtczsKKwkJCQlzdHJlYW1faWQrKykgeworCQkJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKKwkJCQkJIktpbGxpbmcgVVJCcyBmb3Igc2xvdCBJRCAldSwgZXAgaW5kZXggJXUsIHN0cmVhbSAldSIsCisJCQkJCXNsb3RfaWQsIGVwX2luZGV4LCBzdHJlYW1faWQgKyAxKTsKKwkJCXhoY2lfa2lsbF9yaW5nX3VyYnMoeGhjaSwKKwkJCQkJZXAtPnN0cmVhbV9pbmZvLT5zdHJlYW1fcmluZ3Nbc3RyZWFtX2lkXSk7CisJCX0KKwl9IGVsc2UgeworCQlyaW5nID0gZXAtPnJpbmc7CisJCWlmICghcmluZykKKwkJCXJldHVybjsKKwkJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKKwkJCQkiS2lsbGluZyBVUkJzIGZvciBzbG90IElEICV1LCBlcCBpbmRleCAldSIsCisJCQkJc2xvdF9pZCwgZXBfaW5kZXgpOworCQl4aGNpX2tpbGxfcmluZ191cmJzKHhoY2ksIHJpbmcpOworCX0KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmVwLT5jYW5jZWxsZWRfdGRfbGlzdCkpIHsKKwkJY3VyX3RkID0gbGlzdF9maXJzdF9lbnRyeSgmZXAtPmNhbmNlbGxlZF90ZF9saXN0LAorCQkJCXN0cnVjdCB4aGNpX3RkLCBjYW5jZWxsZWRfdGRfbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpOworCQl4aGNpX2dpdmViYWNrX3VyYl9pbl9pcnEoeGhjaSwgY3VyX3RkLCAtRVNIVVRET1dOKTsKKwl9Cit9CisKIC8qIFdhdGNoZG9nIHRpbWVyIGZ1bmN0aW9uIGZvciB3aGVuIGEgc3RvcCBlbmRwb2ludCBjb21tYW5kIGZhaWxzIHRvIGNvbXBsZXRlLgogICogSW4gdGhpcyBjYXNlLCB3ZSBhc3N1bWUgdGhlIGhvc3QgY29udHJvbGxlciBpcyBicm9rZW4gb3IgZHlpbmcgb3IgZGVhZC4gIFRoZQogICogaG9zdCBtYXkgc3RpbGwgYmUgY29tcGxldGluZyBzb21lIG90aGVyIGV2ZW50cywgc28gd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvCkBAIC05MTUsOSArOTc0LDYgQEAKIHsKIAlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7CiAJc3RydWN0IHhoY2lfdmlydF9lcCAqZXA7Ci0Jc3RydWN0IHhoY2lfdmlydF9lcCAqdGVtcF9lcDsKLQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nOwotCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQ7CiAJaW50IHJldCwgaSwgajsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC05NzQsMzQgKzEwMzAsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSENfU0xPVFM7IGkrKykgewogCQlpZiAoIXhoY2ktPmRldnNbaV0pCiAJCQljb250aW51ZTsKLQkJZm9yIChqID0gMDsgaiA8IDMxOyBqKyspIHsKLQkJCXRlbXBfZXAgPSAmeGhjaS0+ZGV2c1tpXS0+ZXBzW2pdOwotCQkJcmluZyA9IHRlbXBfZXAtPnJpbmc7Ci0JCQlpZiAoIXJpbmcpCi0JCQkJY29udGludWU7Ci0JCQl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAotCQkJCQkiS2lsbGluZyBVUkJzIGZvciBzbG90IElEICV1LCAiCi0JCQkJCSJlcCBpbmRleCAldSIsIGksIGopOwotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT50ZF9saXN0KSkgewotCQkJCWN1cl90ZCA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPnRkX2xpc3QsCi0JCQkJCQlzdHJ1Y3QgeGhjaV90ZCwKLQkJCQkJCXRkX2xpc3QpOwotCQkJCWxpc3RfZGVsX2luaXQoJmN1cl90ZC0+dGRfbGlzdCk7Ci0JCQkJaWYgKCFsaXN0X2VtcHR5KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KSkKLQkJCQkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7Ci0JCQkJeGhjaV9naXZlYmFja191cmJfaW5faXJxKHhoY2ksIGN1cl90ZCwKLQkJCQkJCS1FU0hVVERPV04pOwotCQkJfQotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0ZW1wX2VwLT5jYW5jZWxsZWRfdGRfbGlzdCkpIHsKLQkJCQljdXJfdGQgPSBsaXN0X2ZpcnN0X2VudHJ5KAotCQkJCQkJJnRlbXBfZXAtPmNhbmNlbGxlZF90ZF9saXN0LAotCQkJCQkJc3RydWN0IHhoY2lfdGQsCi0JCQkJCQljYW5jZWxsZWRfdGRfbGlzdCk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7Ci0JCQkJeGhjaV9naXZlYmFja191cmJfaW5faXJxKHhoY2ksIGN1cl90ZCwKLQkJCQkJCS1FU0hVVERPV04pOwotCQkJfQotCQl9CisJCWZvciAoaiA9IDA7IGogPCAzMTsgaisrKQorCQkJeGhjaV9raWxsX2VuZHBvaW50X3VyYnMoeGhjaSwgaSwgaik7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLApAQCAtMTA3MywxNyArMTEwMywxOCBAQAogCXVuc2lnbmVkIGludCBzdHJlYW1faWQ7CiAJc3RydWN0IHhoY2lfcmluZyAqZXBfcmluZzsKIAlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqZGV2OworCXN0cnVjdCB4aGNpX3ZpcnRfZXAgKmVwOwogCXN0cnVjdCB4aGNpX2VwX2N0eCAqZXBfY3R4OwogCXN0cnVjdCB4aGNpX3Nsb3RfY3R4ICpzbG90X2N0eDsKIAogCWVwX2luZGV4ID0gVFJCX1RPX0VQX0lOREVYKGxlMzJfdG9fY3B1KHRyYi0+Z2VuZXJpYy5maWVsZFszXSkpOwogCXN0cmVhbV9pZCA9IFRSQl9UT19TVFJFQU1fSUQobGUzMl90b19jcHUodHJiLT5nZW5lcmljLmZpZWxkWzJdKSk7CiAJZGV2ID0geGhjaS0+ZGV2c1tzbG90X2lkXTsKKwllcCA9ICZkZXYtPmVwc1tlcF9pbmRleF07CiAKIAllcF9yaW5nID0geGhjaV9zdHJlYW1faWRfdG9fcmluZyhkZXYsIGVwX2luZGV4LCBzdHJlYW1faWQpOwogCWlmICghZXBfcmluZykgewotCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gU2V0IFRSIGRlcSBwdHIgY29tbWFuZCBmb3IgIgotCQkJCSJmcmVlZCBzdHJlYW0gSUQgJXVcbiIsCisJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgZGVxIHB0ciBjb21tYW5kIGZvciBmcmVlZCBzdHJlYW0gSUQgJXVcbiIsCiAJCQkJc3RyZWFtX2lkKTsKIAkJLyogWFhYOiBIYXJtbGVzcz8/PyAqLwogCQlkZXYtPmVwc1tlcF9pbmRleF0uZXBfc3RhdGUgJj0gflNFVF9ERVFfUEVORElORzsKQEAgLTEwOTksMTIgKzExMzAsMTAgQEAKIAogCQlzd2l0Y2ggKGNtZF9jb21wX2NvZGUpIHsKIAkJY2FzZSBDT01QX1RSQl9FUlI6Ci0JCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gU2V0IFRSIERlcSBQdHIgY21kIGludmFsaWQgYmVjYXVzZSAiCi0JCQkJCSJvZiBzdHJlYW0gSUQgY29uZmlndXJhdGlvblxuIik7CisJCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gU2V0IFRSIERlcSBQdHIgY21kIGludmFsaWQgYmVjYXVzZSBvZiBzdHJlYW0gSUQgY29uZmlndXJhdGlvblxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBDT01QX0NUWF9TVEFURToKLQkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgZmFpbGVkIGR1ZSAiCi0JCQkJCSJ0byBpbmNvcnJlY3Qgc2xvdCBvciBlcCBzdGF0ZS5cbiIpOworCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIFNldCBUUiBEZXEgUHRyIGNtZCBmYWlsZWQgZHVlIHRvIGluY29ycmVjdCBzbG90IG9yIGVwIHN0YXRlLlxuIik7CiAJCQllcF9zdGF0ZSA9IGxlMzJfdG9fY3B1KGVwX2N0eC0+ZXBfaW5mbyk7CiAJCQllcF9zdGF0ZSAmPSBFUF9TVEFURV9NQVNLOwogCQkJc2xvdF9zdGF0ZSA9IGxlMzJfdG9fY3B1KHNsb3RfY3R4LT5kZXZfc3RhdGUpOwpAQCAtMTExNCwxMyArMTE0MywxMiBAQAogCQkJCQlzbG90X3N0YXRlLCBlcF9zdGF0ZSk7CiAJCQlicmVhazsKIAkJY2FzZSBDT01QX0VCQURTTFQ6Ci0JCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gU2V0IFRSIERlcSBQdHIgY21kIGZhaWxlZCBiZWNhdXNlICIKLQkJCQkJInNsb3QgJXUgd2FzIG5vdCBlbmFibGVkLlxuIiwgc2xvdF9pZCk7CisJCQl4aGNpX3dhcm4oeGhjaSwgIldBUk4gU2V0IFRSIERlcSBQdHIgY21kIGZhaWxlZCBiZWNhdXNlIHNsb3QgJXUgd2FzIG5vdCBlbmFibGVkLlxuIiwKKwkJCQkJc2xvdF9pZCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgd2l0aCB1bmtub3duICIKLQkJCQkJImNvbXBsZXRpb24gY29kZSBvZiAldS5cbiIsCi0JCQkJICBjbWRfY29tcF9jb2RlKTsKKwkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTiBTZXQgVFIgRGVxIFB0ciBjbWQgd2l0aCB1bmtub3duIGNvbXBsZXRpb24gY29kZSBvZiAldS5cbiIsCisJCQkJCWNtZF9jb21wX2NvZGUpOwogCQkJYnJlYWs7CiAJCX0KIAkJLyogT0sgd2hhdCBkbyB3ZSBkbyBub3c/ICBUaGUgZW5kcG9pbnQgc3RhdGUgaXMgaG9zZWQsIGFuZCB3ZQpAQCAtMTEzMCwyMyArMTE1OCwyOCBAQAogCQkgKiBjYW5jZWxsaW5nIFVSQnMsIHdoaWNoIG1pZ2h0IG5vdCBiZSBhbiBlcnJvci4uLgogCQkgKi8KIAl9IGVsc2UgeworCQl1NjQgZGVxOworCQkvKiA0LjYuMTAgZGVxIHB0ciBpcyB3cml0dGVuIHRvIHRoZSBzdHJlYW0gY3R4IGZvciBzdHJlYW1zICovCisJCWlmIChlcC0+ZXBfc3RhdGUgJiBFUF9IQVNfU1RSRUFNUykgeworCQkJc3RydWN0IHhoY2lfc3RyZWFtX2N0eCAqY3R4ID0KKwkJCQkmZXAtPnN0cmVhbV9pbmZvLT5zdHJlYW1fY3R4X2FycmF5W3N0cmVhbV9pZF07CisJCQlkZXEgPSBsZTY0X3RvX2NwdShjdHgtPnN0cmVhbV9yaW5nKSAmIFNDVFhfREVRX01BU0s7CisJCX0gZWxzZSB7CisJCQlkZXEgPSBsZTY0X3RvX2NwdShlcF9jdHgtPmRlcSkgJiB+RVBfQ1RYX0NZQ0xFX01BU0s7CisJCX0KIAkJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKLQkJCSJTdWNjZXNzZnVsIFNldCBUUiBEZXEgUHRyIGNtZCwgZGVxID0gQCUwOGxseCIsCi0JCQkgbGU2NF90b19jcHUoZXBfY3R4LT5kZXEpKTsKLQkJaWYgKHhoY2lfdHJiX3ZpcnRfdG9fZG1hKGRldi0+ZXBzW2VwX2luZGV4XS5xdWV1ZWRfZGVxX3NlZywKLQkJCQkJIGRldi0+ZXBzW2VwX2luZGV4XS5xdWV1ZWRfZGVxX3B0cikgPT0KLQkJICAgIChsZTY0X3RvX2NwdShlcF9jdHgtPmRlcSkgJiB+KEVQX0NUWF9DWUNMRV9NQVNLKSkpIHsKKwkJCSJTdWNjZXNzZnVsIFNldCBUUiBEZXEgUHRyIGNtZCwgZGVxID0gQCUwOGxseCIsIGRlcSk7CisJCWlmICh4aGNpX3RyYl92aXJ0X3RvX2RtYShlcC0+cXVldWVkX2RlcV9zZWcsCisJCQkJCSBlcC0+cXVldWVkX2RlcV9wdHIpID09IGRlcSkgewogCQkJLyogVXBkYXRlIHRoZSByaW5nJ3MgZGVxdWV1ZSBzZWdtZW50IGFuZCBkZXF1ZXVlIHBvaW50ZXIKIAkJCSAqIHRvIHJlZmxlY3QgdGhlIG5ldyBwb3NpdGlvbi4KIAkJCSAqLwogCQkJdXBkYXRlX3JpbmdfZm9yX3NldF9kZXFfY29tcGxldGlvbih4aGNpLCBkZXYsCiAJCQkJZXBfcmluZywgZXBfaW5kZXgpOwogCQl9IGVsc2UgewotCQkJeGhjaV93YXJuKHhoY2ksICJNaXNtYXRjaCBiZXR3ZWVuIGNvbXBsZXRlZCBTZXQgVFIgRGVxICIKLQkJCQkJIlB0ciBjb21tYW5kICYgeEhDSSBpbnRlcm5hbCBzdGF0ZS5cbiIpOworCQkJeGhjaV93YXJuKHhoY2ksICJNaXNtYXRjaCBiZXR3ZWVuIGNvbXBsZXRlZCBTZXQgVFIgRGVxIFB0ciBjb21tYW5kICYgeEhDSSBpbnRlcm5hbCBzdGF0ZS5cbiIpOwogCQkJeGhjaV93YXJuKHhoY2ksICJlcCBkZXEgc2VnID0gJXAsIGRlcSBwdHIgPSAlcFxuIiwKLQkJCQkJZGV2LT5lcHNbZXBfaW5kZXhdLnF1ZXVlZF9kZXFfc2VnLAotCQkJCQlkZXYtPmVwc1tlcF9pbmRleF0ucXVldWVkX2RlcV9wdHIpOworCQkJCSAgZXAtPnF1ZXVlZF9kZXFfc2VnLCBlcC0+cXVldWVkX2RlcV9wdHIpOwogCQl9CiAJfQogCkBAIC00MDcwLDYgKzQxMDMsNyBAQAogCXUzMiB0cmJfc2xvdF9pZCA9IFNMT1RfSURfRk9SX1RSQihzbG90X2lkKTsKIAl1MzIgdHJiX2VwX2luZGV4ID0gRVBfSURfRk9SX1RSQihlcF9pbmRleCk7CiAJdTMyIHRyYl9zdHJlYW1faWQgPSBTVFJFQU1fSURfRk9SX1RSQihzdHJlYW1faWQpOworCXUzMiB0cmJfc2N0ID0gMDsKIAl1MzIgdHlwZSA9IFRSQl9UWVBFKFRSQl9TRVRfREVRKTsKIAlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcDsKIApAQCAtNDA4OCw3ICs0MTIyLDkgQEAKIAl9CiAJZXAtPnF1ZXVlZF9kZXFfc2VnID0gZGVxX3NlZzsKIAllcC0+cXVldWVkX2RlcV9wdHIgPSBkZXFfcHRyOwotCXJldHVybiBxdWV1ZV9jb21tYW5kKHhoY2ksIGxvd2VyXzMyX2JpdHMoYWRkcikgfCBjeWNsZV9zdGF0ZSwKKwlpZiAoc3RyZWFtX2lkKQorCQl0cmJfc2N0ID0gU0NUX0ZPUl9UUkIoU0NUX1BSSV9UUik7CisJcmV0dXJuIHF1ZXVlX2NvbW1hbmQoeGhjaSwgbG93ZXJfMzJfYml0cyhhZGRyKSB8IHRyYl9zY3QgfCBjeWNsZV9zdGF0ZSwKIAkJCXVwcGVyXzMyX2JpdHMoYWRkciksIHRyYl9zdHJlYW1faWQsCiAJCQl0cmJfc2xvdF9pZCB8IHRyYl9lcF9pbmRleCB8IHR5cGUsIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKaW5kZXggOTI0YTZjYy4uOGZlNGUxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKQEAgLTM5MCw2ICszOTAsMTAgQEAKIAl9CiAKICBsZWdhY3lfaXJxOgorCWlmICghc3RybGVuKGhjZC0+aXJxX2Rlc2NyKSkKKwkJc25wcmludGYoaGNkLT5pcnFfZGVzY3IsIHNpemVvZihoY2QtPmlycV9kZXNjciksICIlczp1c2IlZCIsCisJCQkgaGNkLT5kcml2ZXItPmRlc2NyaXB0aW9uLCBoY2QtPnNlbGYuYnVzbnVtKTsKKwogCS8qIGZhbGwgYmFjayB0byBsZWdhY3kgaW50ZXJydXB0Ki8KIAlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsICZ1c2JfaGNkX2lycSwgSVJRRl9TSEFSRUQsCiAJCQloY2QtPmlycV9kZXNjciwgaGNkKTsKQEAgLTI2NzgsNiArMjY4MiwyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHhoY2lfY2hlY2tfYndfZHJvcF9lcF9zdHJlYW1zKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqdmRldiwgaW50IGkpCit7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXAgPSAmdmRldi0+ZXBzW2ldOworCisJaWYgKGVwLT5lcF9zdGF0ZSAmIEVQX0hBU19TVFJFQU1TKSB7CisJCXhoY2lfd2Fybih4aGNpLCAiV0FSTjogZW5kcG9pbnQgMHglMDJ4IGhhcyBzdHJlYW1zIG9uIHNldF9pbnRlcmZhY2UsIGZyZWVpbmcgc3RyZWFtcy5cbiIsCisJCQkJeGhjaV9nZXRfZW5kcG9pbnRfYWRkcmVzcyhpKSk7CisJCXhoY2lfZnJlZV9zdHJlYW1faW5mbyh4aGNpLCBlcC0+c3RyZWFtX2luZm8pOworCQllcC0+c3RyZWFtX2luZm8gPSBOVUxMOworCQllcC0+ZXBfc3RhdGUgJj0gfkVQX0hBU19TVFJFQU1TOworCX0KK30KKwogLyogQ2FsbGVkIGFmdGVyIG9uZSBvciBtb3JlIGNhbGxzIHRvIHhoY2lfYWRkX2VuZHBvaW50KCkgb3IKICAqIHhoY2lfZHJvcF9lbmRwb2ludCgpLiAgSWYgdGhpcyBjYWxsIGZhaWxzLCB0aGUgVVNCIGNvcmUgaXMgZXhwZWN0ZWQKICAqIHRvIGNhbGwgeGhjaV9yZXNldF9iYW5kd2lkdGgoKS4KQEAgLTI3NDIsOCArMjc2MCwxMCBAQAogCS8qIEZyZWUgYW55IHJpbmdzIHRoYXQgd2VyZSBkcm9wcGVkLCBidXQgbm90IGNoYW5nZWQuICovCiAJZm9yIChpID0gMTsgaSA8IDMxOyArK2kpIHsKIAkJaWYgKChsZTMyX3RvX2NwdShjdHJsX2N0eC0+ZHJvcF9mbGFncykgJiAoMSA8PCAoaSArIDEpKSkgJiYKLQkJICAgICEobGUzMl90b19jcHUoY3RybF9jdHgtPmFkZF9mbGFncykgJiAoMSA8PCAoaSArIDEpKSkpCisJCSAgICAhKGxlMzJfdG9fY3B1KGN0cmxfY3R4LT5hZGRfZmxhZ3MpICYgKDEgPDwgKGkgKyAxKSkpKSB7CiAJCQl4aGNpX2ZyZWVfb3JfY2FjaGVfZW5kcG9pbnRfcmluZyh4aGNpLCB2aXJ0X2RldiwgaSk7CisJCQl4aGNpX2NoZWNrX2J3X2Ryb3BfZXBfc3RyZWFtcyh4aGNpLCB2aXJ0X2RldiwgaSk7CisJCX0KIAl9CiAJeGhjaV96ZXJvX2luX2N0eCh4aGNpLCB2aXJ0X2Rldik7CiAJLyoKQEAgLTI3NTksNiArMjc3OSw3IEBACiAJCWlmICh2aXJ0X2Rldi0+ZXBzW2ldLnJpbmcpIHsKIAkJCXhoY2lfZnJlZV9vcl9jYWNoZV9lbmRwb2ludF9yaW5nKHhoY2ksIHZpcnRfZGV2LCBpKTsKIAkJfQorCQl4aGNpX2NoZWNrX2J3X2Ryb3BfZXBfc3RyZWFtcyh4aGNpLCB2aXJ0X2RldiwgaSk7CiAJCXZpcnRfZGV2LT5lcHNbaV0ucmluZyA9IHZpcnRfZGV2LT5lcHNbaV0ubmV3X3Jpbmc7CiAJCXZpcnRfZGV2LT5lcHNbaV0ubmV3X3JpbmcgPSBOVUxMOwogCX0KQEAgLTI5NTQsNyArMjk3NSw3IEBACiAJcmV0ID0geGhjaV9jaGVja19hcmdzKHhoY2lfdG9faGNkKHhoY2kpLCB1ZGV2LCBlcCwgMSwgdHJ1ZSwgX19mdW5jX18pOwogCWlmIChyZXQgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGVwLT5zc19lcF9jb21wLmJtQXR0cmlidXRlcyA9PSAwKSB7CisJaWYgKHVzYl9zc19tYXhfc3RyZWFtcygmZXAtPnNzX2VwX2NvbXApID09IDApIHsKIAkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBTdXBlclNwZWVkIEVuZHBvaW50IENvbXBhbmlvbiIKIAkJCQkiIGRlc2NyaXB0b3IgZm9yIGVwIDB4JXggZG9lcyBub3Qgc3VwcG9ydCBzdHJlYW1zXG4iLAogCQkJCWVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwpAQCAtMzEyMSw2ICszMTQyLDEyIEBACiAJeGhjaV9kYmcoeGhjaSwgIkRyaXZlciB3YW50cyAldSBzdHJlYW0gSURzIChpbmNsdWRpbmcgc3RyZWFtIDApLlxuIiwKIAkJCW51bV9zdHJlYW1zKTsKIAorCS8qIE1heFBTQVNpemUgdmFsdWUgMCAoMiBzdHJlYW1zKSBtZWFucyBzdHJlYW1zIGFyZSBub3Qgc3VwcG9ydGVkICovCisJaWYgKEhDQ19NQVhfUFNBKHhoY2ktPmhjY19wYXJhbXMpIDwgNCkgeworCQl4aGNpX2RiZyh4aGNpLCAieEhDSSBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgc3RyZWFtcy5cbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKIAljb25maWdfY21kID0geGhjaV9hbGxvY19jb21tYW5kKHhoY2ksIHRydWUsIHRydWUsIG1lbV9mbGFncyk7CiAJaWYgKCFjb25maWdfY21kKSB7CiAJCXhoY2lfZGJnKHhoY2ksICJDb3VsZCBub3QgYWxsb2NhdGUgeEhDSSBjb21tYW5kIHN0cnVjdHVyZS5cbiIpOwpAQCAtMzUxOSw2ICszNTQ2LDggQEAKIAkJc3RydWN0IHhoY2lfdmlydF9lcCAqZXAgPSAmdmlydF9kZXYtPmVwc1tpXTsKIAogCQlpZiAoZXAtPmVwX3N0YXRlICYgRVBfSEFTX1NUUkVBTVMpIHsKKwkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTjogZW5kcG9pbnQgMHglMDJ4IGhhcyBzdHJlYW1zIG9uIGRldmljZSByZXNldCwgZnJlZWluZyBzdHJlYW1zLlxuIiwKKwkJCQkJeGhjaV9nZXRfZW5kcG9pbnRfYWRkcmVzcyhpKSk7CiAJCQl4aGNpX2ZyZWVfc3RyZWFtX2luZm8oeGhjaSwgZXAtPnN0cmVhbV9pbmZvKTsKIAkJCWVwLT5zdHJlYW1faW5mbyA9IE5VTEw7CiAJCQllcC0+ZXBfc3RhdGUgJj0gfkVQX0hBU19TVFJFQU1TOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaAppbmRleCA1OGVkOWQwLi5kMjgwZTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaApAQCAtNzAzLDYgKzcwMyw3IEBACiAKIC8qIGRlcSBiaXRtYXNrcyAqLwogI2RlZmluZSBFUF9DVFhfQ1lDTEVfTUFTSwkJKDEgPDwgMCkKKyNkZWZpbmUgU0NUWF9ERVFfTUFTSwkJCSh+MHhmTCkKIAogCiAvKioKQEAgLTExMTgsOSArMTExOSwxMCBAQAogI2RlZmluZSBUUkJfVE9fU1VTUEVORF9QT1JUKHApCQkoKChwKSAmICgxIDw8IDIzKSkgPj4gMjMpCiAjZGVmaW5lIExBU1RfRVBfSU5ERVgJCQkzMAogCi0vKiBTZXQgVFIgRGVxdWV1ZSBQb2ludGVyIGNvbW1hbmQgVFJCIGZpZWxkcyAqLworLyogU2V0IFRSIERlcXVldWUgUG9pbnRlciBjb21tYW5kIFRSQiBmaWVsZHMsIDYuNC4zLjkgKi8KICNkZWZpbmUgVFJCX1RPX1NUUkVBTV9JRChwKQkJKCgoKHApICYgKDB4ZmZmZiA8PCAxNikpID4+IDE2KSkKICNkZWZpbmUgU1RSRUFNX0lEX0ZPUl9UUkIocCkJCSgoKChwKSkgJiAweGZmZmYpIDw8IDE2KQorI2RlZmluZSBTQ1RfRk9SX1RSQihwKQkJCSgoKHApIDw8IDEpICYgMHg3KQogCiAKIC8qIFBvcnQgU3RhdHVzIENoYW5nZSBFdmVudCBUUkIgZmllbGRzICovCkBAIC0xMzQxLDYgKzEzNDMsNyBAQAogCXVuc2lnbmVkIGludAkJbnVtX3RyYnNfZnJlZV90ZW1wOwogCWVudW0geGhjaV9yaW5nX3R5cGUJdHlwZTsKIAlib29sCQkJbGFzdF90ZF93YXNfc2hvcnQ7CisJc3RydWN0IHJhZGl4X3RyZWVfcm9vdAkqdHJiX2FkZHJlc3NfbWFwOwogfTsKIAogc3RydWN0IHhoY2lfZXJzdF9lbnRyeSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKaW5kZXggYmE1ZjcwZi4uMWJjYTI3NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKQEAgLTEyOCw3ICsxMjgsNiBAQAogCiBjb25maWcgVVNCX0ZURElfRUxBTgogCXRyaXN0YXRlICJFbGFuIFBDTUNJQSBDYXJkQnVzIEFkYXB0ZXIgVVNCIENsaWVudCIKLQlkZWZhdWx0IE0KIAloZWxwCiAJICBFTEFOJ3MgVXh4eCBzZXJpZXMgb2YgYWRhcHRlcnMgYXJlIFVTQiB0byBQQ01DSUEgQ2FyZEJ1cyBhZGFwdGVycy4KIAkgIEN1cnJlbnRseSBvbmx5IHRoZSBVMTMyIGFkYXB0ZXIgaXMgYXZhaWxhYmxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYwppbmRleCBkZTk4OTA2Li4wNmI1ZDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYwpAQCAtMjEyMyw4ICsyMTIzLDggQEAKIAl1OCB0bXA4LCB0bXA4MiwgcmFtdHlwZTsKIAlpbnQgYncgPSAwOwogCWNoYXIgKnJhbXR5cGV0ZXh0MSA9IE5VTEw7Ci0JY29uc3QgY2hhciAqcmFtdHlwZXRleHQyW10gPSB7CSJTRFIgU0RSQU0iLCAiU0RSIFNHUkFNIiwKLQkJCQkJIkREUiBTRFJBTSIsICJERFIgU0dSQU0iIH07CisJc3RhdGljIGNvbnN0IGNoYXIgcmFtX2RhdGFyYXRlWzRdID0geydTJywgJ1MnLCAnRCcsICdEJ307CisJc3RhdGljIGNvbnN0IGNoYXIgcmFtX2R5bmFtaWN0eXBlWzRdID0geydEJywgJ0cnLCAnRCcsICdHJ307CiAJc3RhdGljIGNvbnN0IGludCBidXNTRFJbNF0gID0gezY0LCA2NCwgMTI4LCAxMjh9OwogCXN0YXRpYyBjb25zdCBpbnQgYnVzRERSWzRdICA9IHszMiwgMzIsICA2NCwgIDY0fTsKIAlzdGF0aWMgY29uc3QgaW50IGJ1c0REUkFbNF0gPSB7NjQrMzIsIDY0KzMyICwgKDY0KzMyKSoyLCAoNjQrMzIpKjJ9OwpAQCAtMjE1Niw4ICsyMTU2LDEwIEBACiAJCWJyZWFrOwogCX0KIAotCWRldl9pbmZvKCZzaXN1c2ItPnNpc3VzYl9kZXYtPmRldiwgIiVkTUIgJXMgJXMsIGJ1cyB3aWR0aCAlZFxuIiwgKHNpc3VzYi0+dnJhbXNpemUgPj4gMjApLCByYW10eXBldGV4dDEsCi0JCQlyYW10eXBldGV4dDJbcmFtdHlwZV0sIGJ3KTsKKworCWRldl9pbmZvKCZzaXN1c2ItPnNpc3VzYl9kZXYtPmRldiwgIiVkTUIgJXMgJWNEUiBTJWNSQU0sIGJ1cyB3aWR0aCAlZFxuIiwKKwkJIHNpc3VzYi0+dnJhbXNpemUgPj4gMjAsIHJhbXR5cGV0ZXh0MSwKKwkJIHJhbV9kYXRhcmF0ZVtyYW10eXBlXSwgcmFtX2R5bmFtaWN0eXBlW3JhbXR5cGVdLCBidyk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGVkLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxlZC5jCmluZGV4IDc4ZWI0ZmYuLmJkZWYwZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGVkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2JsZWQuYwpAQCAtMjIsOCArMjIsMjcgQEAKIGVudW0gbGVkX3R5cGUgewogCURFTENPTV9WSVNVQUxfU0lHTkFMX0lORElDQVRPUiwKIAlEUkVBTV9DSEVFS1lfV0VCTUFJTF9OT1RJRklFUiwKKwlSSVNPX0tBR0FLVV9MRUQKIH07CiAKKy8qIHRoZSBXZWJtYWlsIExFRCBtYWRlIGJ5IFJJU08gS0FHQUtVIENPUlAuIGRlY29kZXMgYSBjb2xvciBpbmRleAorICAgaW50ZXJuYWxseSwgd2Ugd2FudCB0byBrZWVwIHRoZSByZWQrZ3JlZW4rYmx1ZSBzeXNmcyBhcGksIHNvIHdlIGRlY29kZQorICAgZnJvbSAxLWJpdCBSR0IgdG8gdGhlIHJpc28ga2FnYWt1IGNvbG9yIGluZGV4IGFjY29yZGluZyB0byB0aGlzIHRhYmxlLi4uICovCisKK3N0YXRpYyB1bnNpZ25lZCBjb25zdCBjaGFyIHJpc29fa2FnYWt1X3RibFtdID0geworLyogUisyRys0QiAtPiByaXNvIGthZ2FrdSBjb2xvciBpbmRleCAqLworCVswXSA9IDAsIC8qIGJsYWNrICAgKi8KKwlbMV0gPSAyLCAvKiByZWQgICAgICovCisJWzJdID0gMSwgLyogZ3JlZW4gICAqLworCVszXSA9IDUsIC8qIHllbGxvdyAgKi8KKwlbNF0gPSAzLCAvKiBibHVlICAgICovCisJWzVdID0gNiwgLyogbWFnZW50YSAqLworCVs2XSA9IDQsIC8qIGN5YW4gICAgKi8KKwlbN10gPSA3ICAvKiB3aGl0ZSAgICovCit9OworCisjZGVmaW5lIFJJU09fS0FHQUtVX0lYKHIsZyxiKSByaXNvX2thZ2FrdV90YmxbKChyKT8xOjApKygoZyk/MjowKSsoKGIpPzQ6MCldCisKIC8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZVtdID0gewogCXsgVVNCX0RFVklDRSgweDBmYzUsIDB4MTIyMyksCkBAIC0zMiw2ICs1MSw4IEBACiAJCQkuZHJpdmVyX2luZm8gPSBEUkVBTV9DSEVFS1lfV0VCTUFJTF9OT1RJRklFUiB9LAogCXsgVVNCX0RFVklDRSgweDFkMzQsIDB4MDAwYSksCiAJCQkuZHJpdmVyX2luZm8gPSBEUkVBTV9DSEVFS1lfV0VCTUFJTF9OT1RJRklFUiB9LAorCXsgVVNCX0RFVklDRSgweDEyOTQsIDB4MTMyMCksCisJCQkuZHJpdmVyX2luZm8gPSBSSVNPX0tBR0FLVV9MRUQgfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKQEAgLTQ4LDYgKzY5LDcgQEAKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJaW50IGFjdGxlbmd0aDsKIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmZXIpIHsKQEAgLTEwNCw2ICsxMjYsMTggQEAKIAkJCQkJMjAwMCk7CiAJCWJyZWFrOwogCisJY2FzZSBSSVNPX0tBR0FLVV9MRUQ6CisJCWJ1ZmZlclswXSA9IFJJU09fS0FHQUtVX0lYKGxlZC0+cmVkLCBsZWQtPmdyZWVuLCBsZWQtPmJsdWUpOworCQlidWZmZXJbMV0gPSAwOworCQlidWZmZXJbMl0gPSAwOworCQlidWZmZXJbM10gPSAwOworCQlidWZmZXJbNF0gPSAwOworCisJCXJldHZhbCA9IHVzYl9pbnRlcnJ1cHRfbXNnKGxlZC0+dWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShsZWQtPnVkZXYsIDIpLAorCQkJYnVmZmVyLCA1LCAmYWN0bGVuZ3RoLCAxMDAwIC8qbXMgdGltZW91dCovKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlkZXZfZXJyKCZsZWQtPnVkZXYtPmRldiwgInVua25vd24gZGV2aWNlIHR5cGUgJWRcbiIsIGxlZC0+dHlwZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCmluZGV4IDY4OGRjOGIuLjhiNzg5NzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCkBAIC00Myw2ICs0Myw3IEBACiBjb25maWcgVVNCX01VU0JfR0FER0VUCiAJYm9vbCAiR2FkZ2V0IG9ubHkgbW9kZSIKIAlkZXBlbmRzIG9uIFVTQl9HQURHRVQ9eSB8fCBVU0JfR0FER0VUPVVTQl9NVVNCX0hEUkMKKwlkZXBlbmRzIG9uIEhBU19ETUEKIAloZWxwCiAJICBTZWxlY3QgdGhpcyB3aGVuIHlvdSB3YW50IHRvIHVzZSBNVVNCIGluIGdhZGdldCBtb2RlIG9ubHksCiAJICB0aGVyZWJ5IHRoZSBob3N0IGZlYXR1cmUgd2lsbCBiZSByZWdyZXNzZWQuCkBAIC01MCw2ICs1MSw3IEBACiBjb25maWcgVVNCX01VU0JfRFVBTF9ST0xFCiAJYm9vbCAiRHVhbCBSb2xlIG1vZGUiCiAJZGVwZW5kcyBvbiAoKFVTQj15IHx8IFVTQj1VU0JfTVVTQl9IRFJDKSAmJiAoVVNCX0dBREdFVD15IHx8IFVTQl9HQURHRVQ9VVNCX01VU0JfSERSQykpCisJZGVwZW5kcyBvbiBIQVNfRE1BCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgZGVmYXVsdCBtb2RlIG9mIHdvcmtpbmcgb2YgTVVTQiBjb250cm9sbGVyIHdoZXJlCiAJICBib3RoIGhvc3QgYW5kIGdhZGdldCBmZWF0dXJlcyBhcmUgZW5hYmxlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCmluZGV4IDIzOWFkMGIuLjA3NTc2OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwpAQCAtNDM4LDcgKzQzOCw2IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgbXVzYl9zdGFnZTBfaXJxKHN0cnVjdCBtdXNiICptdXNiLCB1OCBpbnRfdXNiLAogCQkJCXU4IGRldmN0bCkKIHsKLQlzdHJ1Y3QgdXNiX290ZyAqb3RnID0gbXVzYi0+eGNlaXYtPm90ZzsKIAlpcnFyZXR1cm5fdCBoYW5kbGVkID0gSVJRX05PTkU7CiAKIAlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICI8PT0gRGV2Q3RsPSUwMngsIGludF91c2I9MHgleFxuIiwgZGV2Y3RsLApAQCAtNjU2LDcgKzY1NSw3IEBACiAJCQkJYnJlYWs7CiAJCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoKIAkJCW11c2JfZ19zdXNwZW5kKG11c2IpOwotCQkJbXVzYi0+aXNfYWN0aXZlID0gb3RnLT5nYWRnZXQtPmJfaG5wX2VuYWJsZTsKKwkJCW11c2ItPmlzX2FjdGl2ZSA9IG11c2ItPmcuYl9obnBfZW5hYmxlOwogCQkJaWYgKG11c2ItPmlzX2FjdGl2ZSkgewogCQkJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9CX1dBSVRfQUNPTjsKIAkJCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJITlA6IFNldHRpbmcgdGltZXIgZm9yIGJfYXNlMF9icnN0XG4iKTsKQEAgLTY3Miw3ICs2NzEsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT1RHX1NUQVRFX0FfSE9TVDoKIAkJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9BX1NVU1BFTkQ7Ci0JCQltdXNiLT5pc19hY3RpdmUgPSBvdGctPmhvc3QtPmJfaG5wX2VuYWJsZTsKKwkJCW11c2ItPmlzX2FjdGl2ZSA9IG11c2ItPmhjZC0+c2VsZi5iX2hucF9lbmFibGU7CiAJCQlicmVhazsKIAkJY2FzZSBPVEdfU1RBVEVfQl9IT1NUOgogCQkJLyogVHJhbnNpdGlvbiB0byBCX1BFUklQSEVSQUwsIHNlZSA2LjguMi42IHAgNDQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jcHBpNDEuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jcHBpNDEuYwppbmRleCBmODg5Mjk2Li43YjhiYmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY3BwaTQxLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NwcGk0MS5jCkBAIC0zOSw2ICszOSw3IEBACiAJdTMyIHRyYW5zZmVycmVkOwogCXUzMiBwYWNrZXRfc3o7CiAJc3RydWN0IGxpc3RfaGVhZCB0eF9jaGVjazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZG1hX2NvbXBsZXRpb247CiB9OwogCiAjZGVmaW5lIE1VU0JfRE1BX05VTV9DSEFOTkVMUyAxNQpAQCAtMTEyLDYgKzExMywxOCBAQAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBpc19pc29jKHN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgYm9vbCBpbikKK3sKKwlpZiAoaW4gJiYgaHdfZXAtPmluX3FoKSB7CisJCWlmIChod19lcC0+aW5fcWgtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoaHdfZXAtPm91dF9xaCkgeworCQlpZiAoaHdfZXAtPm91dF9xaC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQgY3BwaTQxX2RtYV9jYWxsYmFjayh2b2lkICpwcml2YXRlX2RhdGEpOwogCiBzdGF0aWMgdm9pZCBjcHBpNDFfdHJhbnNfZG9uZShzdHJ1Y3QgY3BwaTQxX2RtYV9jaGFubmVsICpjcHBpNDFfY2hhbm5lbCkKQEAgLTExOSw3ICsxMzIsOCBAQAogCXN0cnVjdCBtdXNiX2h3X2VwICpod19lcCA9IGNwcGk0MV9jaGFubmVsLT5od19lcDsKIAlzdHJ1Y3QgbXVzYiAqbXVzYiA9IGh3X2VwLT5tdXNiOwogCi0JaWYgKCFjcHBpNDFfY2hhbm5lbC0+cHJvZ19sZW4pIHsKKwlpZiAoIWNwcGk0MV9jaGFubmVsLT5wcm9nX2xlbiB8fAorCSAgICAoY3BwaTQxX2NoYW5uZWwtPmNoYW5uZWwuc3RhdHVzID09IE1VU0JfRE1BX1NUQVRVU19GUkVFKSkgewogCiAJCS8qIGRvbmUsIGNvbXBsZXRlICovCiAJCWNwcGk0MV9jaGFubmVsLT5jaGFubmVsLmFjdHVhbF9sZW4gPQpAQCAtMTY1LDYgKzE3OSwzMiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgY3BwaV90cmFuc19kb25lX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNwcGk0MV9kbWFfY2hhbm5lbCAqY3BwaTQxX2NoYW5uZWwgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNwcGk0MV9kbWFfY2hhbm5lbCwgZG1hX2NvbXBsZXRpb24pOworCXN0cnVjdCBjcHBpNDFfZG1hX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIgPSBjcHBpNDFfY2hhbm5lbC0+Y29udHJvbGxlcjsKKwlzdHJ1Y3QgbXVzYiAqbXVzYiA9IGNvbnRyb2xsZXItPm11c2I7CisJc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwID0gY3BwaTQxX2NoYW5uZWwtPmh3X2VwOworCWJvb2wgZW1wdHk7CisKKwlpZiAoIWNwcGk0MV9jaGFubmVsLT5pc190eCAmJiBpc19pc29jKGh3X2VwLCAxKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCQljcHBpNDFfdHJhbnNfZG9uZShjcHBpNDFfY2hhbm5lbCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQllbXB0eSA9IG11c2JfaXNfdHhfZmlmb19lbXB0eShod19lcCk7CisJCWlmIChlbXB0eSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKwkJCWNwcGk0MV90cmFuc19kb25lKGNwcGk0MV9jaGFubmVsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNjaGVkdWxlX3dvcmsoJmNwcGk0MV9jaGFubmVsLT5kbWFfY29tcGxldGlvbik7CisJCX0KKwl9Cit9CisKIHN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBjcHBpNDFfcmVjaGVja190eF9yZXEoc3RydWN0IGhydGltZXIgKnRpbWVyKQogewogCXN0cnVjdCBjcHBpNDFfZG1hX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CkBAIC0yMjgsNiArMjY4LDE0IEBACiAJCQl0cmFuc2ZlcnJlZCA8IGNwcGk0MV9jaGFubmVsLT5wYWNrZXRfc3opCiAJCWNwcGk0MV9jaGFubmVsLT5wcm9nX2xlbiA9IDA7CiAKKwlpZiAoIWNwcGk0MV9jaGFubmVsLT5pc190eCkgeworCQlpZiAoaXNfaXNvYyhod19lcCwgMSkpCisJCQlzY2hlZHVsZV93b3JrKCZjcHBpNDFfY2hhbm5lbC0+ZG1hX2NvbXBsZXRpb24pOworCQllbHNlCisJCQljcHBpNDFfdHJhbnNfZG9uZShjcHBpNDFfY2hhbm5lbCk7CisJCWdvdG8gb3V0OworCX0KKwogCWVtcHR5ID0gbXVzYl9pc190eF9maWZvX2VtcHR5KGh3X2VwKTsKIAlpZiAoZW1wdHkpIHsKIAkJY3BwaTQxX3RyYW5zX2RvbmUoY3BwaTQxX2NoYW5uZWwpOwpAQCAtMjY0LDYgKzMxMiwxMCBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CisJCWlmIChpc19pc29jKGh3X2VwLCAwKSkgeworCQkJc2NoZWR1bGVfd29yaygmY3BwaTQxX2NoYW5uZWwtPmRtYV9jb21wbGV0aW9uKTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWxpc3RfYWRkX3RhaWwoJmNwcGk0MV9jaGFubmVsLT50eF9jaGVjaywKIAkJCQkmY29udHJvbGxlci0+ZWFybHlfdHhfbGlzdCk7CiAJCWlmICghaHJ0aW1lcl9hY3RpdmUoJmNvbnRyb2xsZXItPmVhcmx5X3R4KSkgewpAQCAtNDQ4LDEyICs1MDAsMjUgQEAKIAkJCQlkbWFfYWRkcl90IGRtYV9hZGRyLCB1MzIgbGVuKQogewogCWludCByZXQ7CisJc3RydWN0IGNwcGk0MV9kbWFfY2hhbm5lbCAqY3BwaTQxX2NoYW5uZWwgPSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJaW50IGhiX211bHQgPSAwOwogCiAJQlVHX09OKGNoYW5uZWwtPnN0YXR1cyA9PSBNVVNCX0RNQV9TVEFUVVNfVU5LTk9XTiB8fAogCQljaGFubmVsLT5zdGF0dXMgPT0gTVVTQl9ETUFfU1RBVFVTX0JVU1kpOwogCisJaWYgKGlzX2hvc3RfYWN0aXZlKGNwcGk0MV9jaGFubmVsLT5jb250cm9sbGVyLT5tdXNiKSkgeworCQlpZiAoY3BwaTQxX2NoYW5uZWwtPmlzX3R4KQorCQkJaGJfbXVsdCA9IGNwcGk0MV9jaGFubmVsLT5od19lcC0+b3V0X3FoLT5oYl9tdWx0OworCQllbHNlCisJCQloYl9tdWx0ID0gY3BwaTQxX2NoYW5uZWwtPmh3X2VwLT5pbl9xaC0+aGJfbXVsdDsKKwl9CisKIAljaGFubmVsLT5zdGF0dXMgPSBNVVNCX0RNQV9TVEFUVVNfQlVTWTsKIAljaGFubmVsLT5hY3R1YWxfbGVuID0gMDsKKworCWlmIChoYl9tdWx0KQorCQlwYWNrZXRfc3ogPSBoYl9tdWx0ICogKHBhY2tldF9zeiAmIDB4N0ZGKTsKKwogCXJldCA9IGNwcGk0MV9jb25maWd1cmVfY2hhbm5lbChjaGFubmVsLCBwYWNrZXRfc3osIG1vZGUsIGRtYV9hZGRyLCBsZW4pOwogCWlmICghcmV0KQogCQljaGFubmVsLT5zdGF0dXMgPSBNVVNCX0RNQV9TVEFUVVNfRlJFRTsKQEAgLTYwNyw2ICs2NzIsOCBAQAogCQljcHBpNDFfY2hhbm5lbC0+cG9ydF9udW0gPSBwb3J0OwogCQljcHBpNDFfY2hhbm5lbC0+aXNfdHggPSBpc190eDsKIAkJSU5JVF9MSVNUX0hFQUQoJmNwcGk0MV9jaGFubmVsLT50eF9jaGVjayk7CisJCUlOSVRfV09SSygmY3BwaTQxX2NoYW5uZWwtPmRtYV9jb21wbGV0aW9uLAorCQkJICBjcHBpX3RyYW5zX2RvbmVfd29yayk7CiAKIAkJbXVzYl9kbWEgPSAmY3BwaTQxX2NoYW5uZWwtPmNoYW5uZWw7CiAJCW11c2JfZG1hLT5wcml2YXRlX2RhdGEgPSBjcHBpNDFfY2hhbm5lbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jCmluZGV4IDdhMTA5ZWEuLjMzNzJkZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYwpAQCAtNDUsNiArNDUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9vZi5oPgogCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorCiAjaW5jbHVkZSAibXVzYl9jb3JlLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG11c2JfZHNwc19vZl9tYXRjaFtdOwpAQCAtMTM2LDYgKzEzOCwyNiBAQAogCXVuc2lnbmVkIGxvbmcgbGFzdF90aW1lcjsgICAgLyogbGFzdCB0aW1lciBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCiAKIAlzdHJ1Y3QgZHNwc19jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGRlYnVnZnNfcmVnc2V0MzIgcmVnc2V0OworCXN0cnVjdCBkZW50cnkgKmRiZ2ZzX3Jvb3Q7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnZnNfcmVnMzIgZHNwc19tdXNiX3JlZ3NbXSA9IHsKKwl7ICJyZXZpc2lvbiIsCQkweDAwIH0sCisJeyAiY29udHJvbCIsCQkweDE0IH0sCisJeyAic3RhdHVzIiwJCTB4MTggfSwKKwl7ICJlb2kiLAkJMHgyNCB9LAorCXsgImludHIwX3N0YXQiLAkJMHgzMCB9LAorCXsgImludHIxX3N0YXQiLAkJMHgzNCB9LAorCXsgImludHIwX3NldCIsCQkweDM4IH0sCisJeyAiaW50cjFfc2V0IiwJCTB4M2MgfSwKKwl7ICJ0eG1vZGUiLAkJMHg3MCB9LAorCXsgInJ4bW9kZSIsCQkweDc0IH0sCisJeyAiYXV0b3JlcSIsCQkweGQwIH0sCisJeyAic3JwZml4dGltZSIsCQkweGQ0IH0sCisJeyAidGRvd24iLAkJMHhkOCB9LAorCXsgInBoeV91dG1pIiwJCTB4ZTAgfSwKKwl7ICJtb2RlIiwJCTB4ZTggfSwKIH07CiAKIHN0YXRpYyB2b2lkIGRzcHNfbXVzYl90cnlfaWRsZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQpAQCAtMzY4LDYgKzM5MCwzMCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgZHNwc19tdXNiX2RiZ19pbml0KHN0cnVjdCBtdXNiICptdXNiLCBzdHJ1Y3QgZHNwc19nbHVlICpnbHVlKQoreworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJc3RydWN0IGRlbnRyeSAqZmlsZTsKKwljaGFyIGJ1ZlsxMjhdOworCisJc3ByaW50ZihidWYsICIlcy5kc3BzIiwgZGV2X25hbWUobXVzYi0+Y29udHJvbGxlcikpOworCXJvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoYnVmLCBOVUxMKTsKKwlpZiAoIXJvb3QpCisJCXJldHVybiAtRU5PTUVNOworCWdsdWUtPmRiZ2ZzX3Jvb3QgPSByb290OworCisJZ2x1ZS0+cmVnc2V0LnJlZ3MgPSBkc3BzX211c2JfcmVnczsKKwlnbHVlLT5yZWdzZXQubnJlZ3MgPSBBUlJBWV9TSVpFKGRzcHNfbXVzYl9yZWdzKTsKKwlnbHVlLT5yZWdzZXQuYmFzZSA9IG11c2ItPmN0cmxfYmFzZTsKKworCWZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9yZWdzZXQzMigicmVnZHVtcCIsIFNfSVJVR08sIHJvb3QsICZnbHVlLT5yZWdzZXQpOworCWlmICghZmlsZSkgeworCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocm9vdCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBkc3BzX211c2JfaW5pdChzdHJ1Y3QgbXVzYiAqbXVzYikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtdXNiLT5jb250cm9sbGVyOwpAQCAtMzc3LDYgKzQyMyw3IEBACiAJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJdTMyIHJldiwgdmFsOworCWludCByZXQ7CiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwYXJlbnQsIElPUkVTT1VSQ0VfTUVNLCAiY29udHJvbCIpOwogCWlmICghcikKQEAgLTQxMCw2ICs0NTcsMTAgQEAKIAl2YWwgJj0gfigxIDw8IHdycC0+b3RnX2Rpc2FibGUpOwogCWRzcHNfd3JpdGVsKG11c2ItPmN0cmxfYmFzZSwgd3JwLT5waHlfdXRtaSwgdmFsKTsKIAorCXJldCA9IGRzcHNfbXVzYl9kYmdfaW5pdChtdXNiLCBnbHVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxNiw3ICs2NjcsNyBAQAogCXdycCA9IG1hdGNoLT5kYXRhOwogCiAJLyogYWxsb2NhdGUgZ2x1ZSAqLwotCWdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOworCWdsdWUgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFnbHVlKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBnbHVlIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjQ0LDcgKzY5NSw2IEBACiAJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiBlcnIyOgogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQlrZnJlZShnbHVlKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02NTcsNyArNzA3LDkgQEAKIAkvKiBkaXNhYmxlIHVzYnNzIGNsb2NrcyAqLwogCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQlrZnJlZShnbHVlKTsKKworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShnbHVlLT5kYmdmc19yb290KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwppbmRleCBhYmIzOGMzLi5lYjA2MjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKQEAgLTE2OTQsNyArMTY5NCw4IEBACiAJCQl8IE1VU0JfUlhDU1JfUlhQS1RSRFkpOwogCQltdXNiX3dyaXRldyhod19lcC0+cmVncywgTVVTQl9SWENTUiwgdmFsKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JTlZFTlRSQV9ETUEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9VWDUwMF9ETUEpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lOVkVOVFJBX0RNQSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1VYNTAwX0RNQSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1VTQl9USV9DUFBJNDFfRE1BKQogCQlpZiAodXNiX3BpcGVpc29jKHBpcGUpKSB7CiAJCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZDsKIApAQCAtMTcwNywxMCArMTcwOCwzMCBAQAogCQkJaWYgKGQtPnN0YXR1cyAhPSAtRUlMU0VRICYmIGQtPnN0YXR1cyAhPSAtRU9WRVJGTE9XKQogCQkJCWQtPnN0YXR1cyA9IDA7CiAKLQkJCWlmICgrK3FoLT5pc29faWR4ID49IHVyYi0+bnVtYmVyX29mX3BhY2tldHMpCisJCQlpZiAoKytxaC0+aXNvX2lkeCA+PSB1cmItPm51bWJlcl9vZl9wYWNrZXRzKSB7CiAJCQkJZG9uZSA9IHRydWU7Ci0JCQllbHNlCisJCQl9IGVsc2UgeworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9USV9DUFBJNDFfRE1BKQorCQkJCXN0cnVjdCBkbWFfY29udHJvbGxlciAgICpjOworCQkJCWRtYV9hZGRyX3QgKmJ1ZjsKKwkJCQl1MzIgbGVuZ3RoLCByZXQ7CisKKwkJCQljID0gbXVzYi0+ZG1hX2NvbnRyb2xsZXI7CisJCQkJYnVmID0gKHZvaWQgKikKKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1txaC0+aXNvX2lkeF0ub2Zmc2V0CisJCQkJCSsgKHUzMil1cmItPnRyYW5zZmVyX2RtYTsKKworCQkJCWxlbmd0aCA9CisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbcWgtPmlzb19pZHhdLmxlbmd0aDsKKworCQkJCXZhbCB8PSBNVVNCX1JYQ1NSX0RNQUVOQUI7CisJCQkJbXVzYl93cml0ZXcoaHdfZXAtPnJlZ3MsIE1VU0JfUlhDU1IsIHZhbCk7CisKKwkJCQlyZXQgPSBjLT5jaGFubmVsX3Byb2dyYW0oZG1hLCBxaC0+bWF4cGFja2V0LAorCQkJCQkJMCwgKHUzMikgYnVmLCBsZW5ndGgpOworI2VuZGlmCiAJCQkJZG9uZSA9IGZhbHNlOworCQkJfQogCiAJCX0gZWxzZSAgewogCQkvKiBkb25lIGlmIHVyYiBidWZmZXIgaXMgZnVsbCBvciBzaG9ydCBwYWNrZXQgaXMgcmVjZCAqLwpAQCAtMTc1MCw3ICsxNzcxLDggQEAKIAkJfQogCiAJCS8qIHdlIGFyZSBleHBlY3RpbmcgSU4gcGFja2V0cyAqLwotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JTlZFTlRSQV9ETUEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9VWDUwMF9ETUEpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lOVkVOVFJBX0RNQSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1VYNTAwX0RNQSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1VTQl9USV9DUFBJNDFfRE1BKQogCQlpZiAoZG1hKSB7CiAJCQlzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIJKmM7CiAJCQl1MTYJCQlyeF9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwppbmRleCA4YWE1OWEyLi5kMzQxYzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvbXVzYi1vbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL29tYXBfY29udHJvbF91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvb21hcF9jb250cm9sX3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAKICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9LY29uZmlnIGIvZHJpdmVycy91c2IvcGh5L0tjb25maWcKaW5kZXggN2QxNDUxZC4uNDE2ZTBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvcGh5L0tjb25maWcKQEAgLTc1LDI3ICs3NSw2IEBACiAJICBidWlsdC1pbiB3aXRoIHVzYiBpcCBvciB3aGljaCBhcmUgYXV0b25vbW91cyBhbmQgZG9lc24ndCByZXF1aXJlIGFueQogCSAgcGh5IHByb2dyYW1taW5nIHN1Y2ggYXMgSVNQMXgwNCBldGMuCiAKLWNvbmZpZyBPTUFQX0NPTlRST0xfVVNCCi0JdHJpc3RhdGUgIk9NQVAgQ09OVFJPTCBVU0IgRHJpdmVyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMgfHwgQ09NUElMRV9URVNUCi0JaGVscAotCSAgRW5hYmxlIHRoaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBVU0IgcGFydCBwcmVzZW50IGluIHRoZSBjb250cm9sCi0JICBtb2R1bGUuIFRoaXMgZHJpdmVyIGhhcyBBUEkgdG8gcG93ZXIgb24gdGhlIFVTQjIgUEhZIGFuZCB0byB3cml0ZSB0bwotCSAgdGhlIG1haWxib3guIFRoZSBtYWlsYm94IGlzIHByZXNlbnQgb25seSBpbiBvbWFwNCBhbmQgdGhlIHJlZ2lzdGVyIHRvCi0JICBwb3dlciBvbiB0aGUgVVNCMiBQSFkgaXMgcHJlc2VudCBpbiBPTUFQNCBhbmQgT01BUDUuIE9NQVA1IGhhcyBhbgotCSAgYWRkaXRpb25hbCByZWdpc3RlciB0byBwb3dlciBvbiBVU0IzIFBIWS4KLQotY29uZmlnIE9NQVBfVVNCMwotCXRyaXN0YXRlICJPTUFQIFVTQjMgUEhZIERyaXZlciIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTIHx8IENPTVBJTEVfVEVTVAotCXNlbGVjdCBPTUFQX0NPTlRST0xfVVNCCi0Jc2VsZWN0IFVTQl9QSFkKLQloZWxwCi0JICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBVU0IzIFBIWSB0aGF0IGlzIHBhcnQgb2YgU09DLiBUaGlzCi0JICBkcml2ZXIgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIFBIWSBmdW5jdGlvbmFsaXR5IGFwYXJ0IGZyb20gY29tcGFyYXRvci4KLQkgIFRoaXMgZHJpdmVyIGludGVyYWN0cyB3aXRoIHRoZSAiT01BUCBDb250cm9sIFVTQiBEcml2ZXIiIHRvIHBvd2VyCi0JICBvbi9vZmYgdGhlIFBIWS4KLQogY29uZmlnIEFNMzM1WF9DT05UUk9MX1VTQgogCXRyaXN0YXRlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL3BoeS9NYWtlZmlsZQppbmRleCBiZTU4YWRhLi5mOGZhNzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvcGh5L01ha2VmaWxlCkBAIC0xMywxMSArMTMsOSBAQAogb2JqLSQoQ09ORklHX01WX1UzRF9QSFkpCQkrPSBwaHktbXYtdTNkLXVzYi5vCiBvYmotJChDT05GSUdfTk9QX1VTQl9YQ0VJVikJCSs9IHBoeS1nZW5lcmljLm8KIG9iai0kKENPTkZJR19UQUhWT19VU0IpCQkJKz0gcGh5LXRhaHZvLm8KLW9iai0kKENPTkZJR19PTUFQX0NPTlRST0xfVVNCKQkJKz0gcGh5LW9tYXAtY29udHJvbC5vCiBvYmotJChDT05GSUdfQU0zMzVYX0NPTlRST0xfVVNCKQkrPSBwaHktYW0zMzV4LWNvbnRyb2wubwogb2JqLSQoQ09ORklHX0FNMzM1WF9QSFlfVVNCKQkJKz0gcGh5LWFtMzM1eC5vCiBvYmotJChDT05GSUdfT01BUF9PVEcpCQkJKz0gcGh5LW9tYXAtb3RnLm8KLW9iai0kKENPTkZJR19PTUFQX1VTQjMpCQkJKz0gcGh5LW9tYXAtdXNiMy5vCiBvYmotJChDT05GSUdfU0FNU1VOR19VU0JQSFkpCQkrPSBwaHktc2Ftc3VuZy11c2Iubwogb2JqLSQoQ09ORklHX1NBTVNVTkdfVVNCMlBIWSkJCSs9IHBoeS1zYW1zdW5nLXVzYjIubwogb2JqLSQoQ09ORklHX1NBTVNVTkdfVVNCM1BIWSkJCSs9IHBoeS1zYW1zdW5nLXVzYjMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1mc20tdXNiLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LWZzbS11c2IuYwppbmRleCA3YWEzMTRlLi5jNDdlNWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LWZzbS11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LWZzbS11c2IuYwpAQCAtMzE3LDEwICszMTcsMTIgQEAKIAkJCW90Z19zZXRfc3RhdGUoZnNtLCBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQV9IT1NUOgotCQlpZiAoKCFmc20tPmFfYnVzX3JlcSB8fCBmc20tPmFfc3VzcGVuZF9yZXFfaW5mKSAmJgorCQlpZiAoZnNtLT5pZCB8fCBmc20tPmFfYnVzX2Ryb3ApCisJCQlvdGdfc2V0X3N0YXRlKGZzbSwgT1RHX1NUQVRFX0FfV0FJVF9WRkFMTCk7CisJCWVsc2UgaWYgKCghZnNtLT5hX2J1c19yZXEgfHwgZnNtLT5hX3N1c3BlbmRfcmVxX2luZikgJiYKIAkJCQlmc20tPm90Zy0+aG9zdC0+Yl9obnBfZW5hYmxlKQogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX1NVU1BFTkQpOwotCQllbHNlIGlmIChmc20tPmlkIHx8ICFmc20tPmJfY29ubiB8fCBmc20tPmFfYnVzX2Ryb3ApCisJCWVsc2UgaWYgKCFmc20tPmJfY29ubikKIAkJCW90Z19zZXRfc3RhdGUoZnNtLCBPVEdfU1RBVEVfQV9XQUlUX0JDT04pOwogCQllbHNlIGlmICghZnNtLT5hX3ZidXNfdmxkKQogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX1ZCVVNfRVJSKTsKQEAgLTM0Niw4ICszNDgsNyBAQAogCQkJb3RnX3NldF9zdGF0ZShmc20sIE9UR19TVEFURV9BX1ZCVVNfRVJSKTsKIAkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOgotCQlpZiAoZnNtLT5hX3dhaXRfdmZhbGxfdG1vdXQgfHwgZnNtLT5pZCB8fCBmc20tPmFfYnVzX3JlcSB8fAotCQkJCSghZnNtLT5hX3Nlc3NfdmxkICYmICFmc20tPmJfY29ubikpCisJCWlmIChmc20tPmFfd2FpdF92ZmFsbF90bW91dCkKIAkJCW90Z19zZXRfc3RhdGUoZnNtLCBPVEdfU1RBVEVfQV9JRExFKTsKIAkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQV9WQlVTX0VSUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXNtLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tdXNiLmMKaW5kZXggZDIwNGY3NC4uNWIzN2I4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tdXNiLmMKQEAgLTE0MjgsNyArMTQyOCw4IEBACiAJbW90Zy0+cGh5Lm90ZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfb3RnKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtb3RnLT5waHkub3RnKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBtc21fb3RnXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9tb3RnOwogCX0KIAogCW1vdGctPnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXhzLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKaW5kZXggYjQyODk3Yi4uYzQyYmRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMTIgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDEyLTIwMTMgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAxMiBNYXJlayBWYXN1dCA8bWFyZXhAZGVueC5kZT4KICAqIG9uIGJlaGFsZiBvZiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIEdtYkgKICAqCkBAIC0yMCw2ICsyMCw5IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAibXhzX3BoeSIKIApAQCAtMjgsMTggKzMxLDEzNCBAQAogI2RlZmluZSBIV19VU0JQSFlfQ1RSTF9TRVQJCQkweDM0CiAjZGVmaW5lIEhXX1VTQlBIWV9DVFJMX0NMUgkJCTB4MzgKIAorI2RlZmluZSBIV19VU0JQSFlfREVCVUdfU0VUCQkJMHg1NAorI2RlZmluZSBIV19VU0JQSFlfREVCVUdfQ0xSCQkJMHg1OAorCisjZGVmaW5lIEhXX1VTQlBIWV9JUAkJCQkweDkwCisjZGVmaW5lIEhXX1VTQlBIWV9JUF9TRVQJCQkweDk0CisjZGVmaW5lIEhXX1VTQlBIWV9JUF9DTFIJCQkweDk4CisKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfU0ZUUlNUCQkJQklUKDMxKQogI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9DTEtHQVRFCQkJQklUKDMwKQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTkFVVE9TRVRfVVNCQ0xLUwlCSVQoMjYpCisjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOQVVUT0NMUl9VU0JDTEtHQVRFCUJJVCgyNSkKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5WQlVTQ0hHX1dLVVAJCUJJVCgyMykKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5JRENIR19XS1VQCQlCSVQoMjIpCisjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VORFBETUNIR19XS1VQCQlCSVQoMjEpCisjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOQVVUT0NMUl9QSFlfUFdECUJJVCgyMCkKKyNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX0NMS0dBVEUJQklUKDE5KQorI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTkFVVE9fUFdST05fUExMCQlCSVQoMTgpCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0VOVVRNSUxFVkVMMwkJQklUKDE1KQogI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9FTlVUTUlMRVZFTDIJCUJJVCgxNCkKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfRU5IT1NURElTQ09OREVURUNUCUJJVCgxKQogCisjZGVmaW5lIEJNX1VTQlBIWV9JUF9GSVggICAgICAgICAgICAgICAgICAgICAgIChCSVQoMTcpIHwgQklUKDE4KSkKKworI2RlZmluZSBCTV9VU0JQSFlfREVCVUdfQ0xLR0FURQkJCUJJVCgzMCkKKworLyogQW5hdG9wIFJlZ2lzdGVycyAqLworI2RlZmluZSBBTkFESUdfQU5BX01JU0MwCQkJMHgxNTAKKyNkZWZpbmUgQU5BRElHX0FOQV9NSVNDMF9TRVQJCQkweDE1NAorI2RlZmluZSBBTkFESUdfQU5BX01JU0MwX0NMUgkJCTB4MTU4CisKKyNkZWZpbmUgQU5BRElHX1VTQjFfVkJVU19ERVRfU1RBVAkJMHgxYzAKKyNkZWZpbmUgQU5BRElHX1VTQjJfVkJVU19ERVRfU1RBVAkJMHgyMjAKKworI2RlZmluZSBBTkFESUdfVVNCMV9MT09QQkFDS19TRVQJCTB4MWU0CisjZGVmaW5lIEFOQURJR19VU0IxX0xPT1BCQUNLX0NMUgkJMHgxZTgKKyNkZWZpbmUgQU5BRElHX1VTQjJfTE9PUEJBQ0tfU0VUCQkweDI0NAorI2RlZmluZSBBTkFESUdfVVNCMl9MT09QQkFDS19DTFIJCTB4MjQ4CisKKyNkZWZpbmUgQk1fQU5BRElHX0FOQV9NSVNDMF9TVE9QX01PREVfQ09ORklHCUJJVCgxMikKKyNkZWZpbmUgQk1fQU5BRElHX0FOQV9NSVNDMF9TVE9QX01PREVfQ09ORklHX1NMIEJJVCgxMSkKKworI2RlZmluZSBCTV9BTkFESUdfVVNCMV9WQlVTX0RFVF9TVEFUX1ZCVVNfVkFMSUQJQklUKDMpCisjZGVmaW5lIEJNX0FOQURJR19VU0IyX1ZCVVNfREVUX1NUQVRfVkJVU19WQUxJRAlCSVQoMykKKworI2RlZmluZSBCTV9BTkFESUdfVVNCMV9MT09QQkFDS19VVE1JX0RJR19UU1QxCUJJVCgyKQorI2RlZmluZSBCTV9BTkFESUdfVVNCMV9MT09QQkFDS19UU1RJX1RYX0VOCUJJVCg1KQorI2RlZmluZSBCTV9BTkFESUdfVVNCMl9MT09QQkFDS19VVE1JX0RJR19UU1QxCUJJVCgyKQorI2RlZmluZSBCTV9BTkFESUdfVVNCMl9MT09QQkFDS19UU1RJX1RYX0VOCUJJVCg1KQorCisjZGVmaW5lIHRvX214c19waHkocCkgY29udGFpbmVyX29mKChwKSwgc3RydWN0IG14c19waHksIHBoeSkKKworLyogRG8gZGlzY29ubmVjdGlvbiBiZXR3ZWVuIFBIWSBhbmQgY29udHJvbGxlciB3aXRob3V0IHZidXMgKi8KKyNkZWZpbmUgTVhTX1BIWV9ESVNDT05ORUNUX0xJTkVfV0lUSE9VVF9WQlVTCUJJVCgwKQorCisvKgorICogVGhlIFBIWSB3aWxsIGJlIGluIG1lc3N5IGlmIHRoZXJlIGlzIGEgd2FrZXVwIGFmdGVyIHB1dHRpbmcKKyAqIGJ1cyB0byBzdXNwZW5kIChzZXQgcG9ydHNjLnN1c3BlbmRNKSBidXQgYmVmb3JlIHNldHRpbmcgUEhZIHRvIGxvdworICogcG93ZXIgbW9kZSAoc2V0IHBvcnRzYy5waGNkKS4KKyAqLworI2RlZmluZSBNWFNfUEhZX0FCTk9STUFMX0lOX1NVU1BFTkQJCUJJVCgxKQorCisvKgorICogVGhlIFNPRiBzZW5kcyB0b28gZmFzdCBhZnRlciByZXN1bWluZywgaXQgd2lsbCBjYXVzZSBkaXNjb25uZWN0aW9uCisgKiBiZXR3ZWVuIGhvc3QgYW5kIGhpZ2ggc3BlZWQgZGV2aWNlLgorICovCisjZGVmaW5lIE1YU19QSFlfU0VORElOR19TT0ZfVE9PX0ZBU1QJCUJJVCgyKQorCisvKgorICogSUMgaGFzIGJ1ZyBmaXhlcyBsb2dpYywgdGhleSBpbmNsdWRlCisgKiBNWFNfUEhZX0FCTk9STUFMX0lOX1NVU1BFTkQgYW5kIE1YU19QSFlfU0VORElOR19TT0ZfVE9PX0ZBU1QKKyAqIHdoaWNoIGFyZSBkZXNjcmliZWQgYXQgYWJvdmUgZmxhZ3MsIHRoZSBSVEwgd2lsbCBoYW5kbGUgaXQKKyAqIGFjY29yZGluZyB0byBkaWZmZXJlbnQgdmVyc2lvbnMuCisgKi8KKyNkZWZpbmUgTVhTX1BIWV9ORUVEX0lQX0ZJWAkJCUJJVCgzKQorCitzdHJ1Y3QgbXhzX3BoeV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSBpbXgyM19waHlfZGF0YSA9IHsKKwkuZmxhZ3MgPSBNWFNfUEhZX0FCTk9STUFMX0lOX1NVU1BFTkQgfCBNWFNfUEhZX1NFTkRJTkdfU09GX1RPT19GQVNULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHNfcGh5X2RhdGEgaW14NnFfcGh5X2RhdGEgPSB7CisJLmZsYWdzID0gTVhTX1BIWV9TRU5ESU5HX1NPRl9UT09fRkFTVCB8CisJCU1YU19QSFlfRElTQ09OTkVDVF9MSU5FX1dJVEhPVVRfVkJVUyB8CisJCU1YU19QSFlfTkVFRF9JUF9GSVgsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSBpbXg2c2xfcGh5X2RhdGEgPSB7CisJLmZsYWdzID0gTVhTX1BIWV9ESVNDT05ORUNUX0xJTkVfV0lUSE9VVF9WQlVTIHwKKwkJTVhTX1BIWV9ORUVEX0lQX0ZJWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG14c19waHlfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnNsLXVzYnBoeSIsIC5kYXRhID0gJmlteDZzbF9waHlfZGF0YSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS11c2JwaHkiLCAuZGF0YSA9ICZpbXg2cV9waHlfZGF0YSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyMy11c2JwaHkiLCAuZGF0YSA9ICZpbXgyM19waHlfZGF0YSwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBteHNfcGh5X2R0X2lkcyk7CisKIHN0cnVjdCBteHNfcGh5IHsKIAlzdHJ1Y3QgdXNiX3BoeSBwaHk7CiAJc3RydWN0IGNsayAqY2xrOworCWNvbnN0IHN0cnVjdCBteHNfcGh5X2RhdGEgKmRhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwX2FuYXRvcDsKKwlpbnQgcG9ydF9pZDsKIH07CiAKLSNkZWZpbmUgdG9fbXhzX3BoeShwKSBjb250YWluZXJfb2YoKHApLCBzdHJ1Y3QgbXhzX3BoeSwgcGh5KQorc3RhdGljIGlubGluZSBib29sIGlzX2lteDZxX3BoeShzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSkKK3sKKwlyZXR1cm4gbXhzX3BoeS0+ZGF0YSA9PSAmaW14NnFfcGh5X2RhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19pbXg2c2xfcGh5KHN0cnVjdCBteHNfcGh5ICpteHNfcGh5KQoreworCXJldHVybiBteHNfcGh5LT5kYXRhID09ICZpbXg2c2xfcGh5X2RhdGE7Cit9CisKKy8qCisgKiBQSFkgbmVlZHMgc29tZSAzMksgY3ljbGVzIHRvIHN3aXRjaCBmcm9tIDMySyBjbG9jayB0bworICogYnVzIChzdWNoIGFzIEFIQi9BWEksIGV0YykgY2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIG14c19waHlfY2xvY2tfc3dpdGNoX2RlbGF5KHZvaWQpCit7CisJdXNsZWVwX3JhbmdlKDMwMCwgNDAwKTsKK30KIAogc3RhdGljIGludCBteHNfcGh5X2h3X2luaXQoc3RydWN0IG14c19waHkgKm14c19waHkpCiB7CkBAIC01MywxOSArMTcyLDEwNSBAQAogCS8qIFBvd2VyIHVwIHRoZSBQSFkgKi8KIAl3cml0ZWwoMCwgYmFzZSArIEhXX1VTQlBIWV9QV0QpOwogCi0JLyogZW5hYmxlIEZTL0xTIGRldmljZSAqLwotCXdyaXRlbChCTV9VU0JQSFlfQ1RSTF9FTlVUTUlMRVZFTDIgfAotCSAgICAgICBCTV9VU0JQSFlfQ1RSTF9FTlVUTUlMRVZFTDMsCisJLyoKKwkgKiBVU0IgUEhZIEN0cmwgU2V0dGluZworCSAqIC0gQXV0byBjbG9jay9wb3dlciBvbgorCSAqIC0gRW5hYmxlIGZ1bGwvbG93IHNwZWVkIHN1cHBvcnQKKwkgKi8KKwl3cml0ZWwoQk1fVVNCUEhZX0NUUkxfRU5BVVRPU0VUX1VTQkNMS1MgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTkFVVE9DTFJfVVNCQ0xLR0FURSB8CisJCUJNX1VTQlBIWV9DVFJMX0VOQVVUT0NMUl9QSFlfUFdEIHwKKwkJQk1fVVNCUEhZX0NUUkxfRU5BVVRPQ0xSX0NMS0dBVEUgfAorCQlCTV9VU0JQSFlfQ1RSTF9FTkFVVE9fUFdST05fUExMIHwKKwkJQk1fVVNCUEhZX0NUUkxfRU5VVE1JTEVWRUwyIHwKKwkJQk1fVVNCUEhZX0NUUkxfRU5VVE1JTEVWRUwzLAogCSAgICAgICBiYXNlICsgSFdfVVNCUEhZX0NUUkxfU0VUKTsKIAorCWlmIChteHNfcGh5LT5kYXRhLT5mbGFncyAmIE1YU19QSFlfTkVFRF9JUF9GSVgpCisJCXdyaXRlbChCTV9VU0JQSFlfSVBfRklYLCBiYXNlICsgSFdfVVNCUEhZX0lQX1NFVCk7CisKIAlyZXR1cm4gMDsKIH0KIAorLyogUmV0dXJuIHRydWUgaWYgdGhlIHZidXMgaXMgdGhlcmUgKi8KK3N0YXRpYyBib29sIG14c19waHlfZ2V0X3ZidXNfc3RhdHVzKHN0cnVjdCBteHNfcGh5ICpteHNfcGh5KQoreworCXVuc2lnbmVkIGludCB2YnVzX3ZhbHVlOworCisJaWYgKG14c19waHktPnBvcnRfaWQgPT0gMCkKKwkJcmVnbWFwX3JlYWQobXhzX3BoeS0+cmVnbWFwX2FuYXRvcCwKKwkJCUFOQURJR19VU0IxX1ZCVVNfREVUX1NUQVQsCisJCQkmdmJ1c192YWx1ZSk7CisJZWxzZSBpZiAobXhzX3BoeS0+cG9ydF9pZCA9PSAxKQorCQlyZWdtYXBfcmVhZChteHNfcGh5LT5yZWdtYXBfYW5hdG9wLAorCQkJQU5BRElHX1VTQjJfVkJVU19ERVRfU1RBVCwKKwkJCSZ2YnVzX3ZhbHVlKTsKKworCWlmICh2YnVzX3ZhbHVlICYgQk1fQU5BRElHX1VTQjFfVkJVU19ERVRfU1RBVF9WQlVTX1ZBTElEKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgX19teHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSwgYm9vbCBkaXNjb25uZWN0KQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IG14c19waHktPnBoeS5pb19wcml2OworCXUzMiByZWc7CisKKwlpZiAoZGlzY29ubmVjdCkKKwkJd3JpdGVsX3JlbGF4ZWQoQk1fVVNCUEhZX0RFQlVHX0NMS0dBVEUsCisJCQliYXNlICsgSFdfVVNCUEhZX0RFQlVHX0NMUik7CisKKwlpZiAobXhzX3BoeS0+cG9ydF9pZCA9PSAwKSB7CisJCXJlZyA9IGRpc2Nvbm5lY3QgPyBBTkFESUdfVVNCMV9MT09QQkFDS19TRVQKKwkJCTogQU5BRElHX1VTQjFfTE9PUEJBQ0tfQ0xSOworCQlyZWdtYXBfd3JpdGUobXhzX3BoeS0+cmVnbWFwX2FuYXRvcCwgcmVnLAorCQkJQk1fQU5BRElHX1VTQjFfTE9PUEJBQ0tfVVRNSV9ESUdfVFNUMSB8CisJCQlCTV9BTkFESUdfVVNCMV9MT09QQkFDS19UU1RJX1RYX0VOKTsKKwl9IGVsc2UgaWYgKG14c19waHktPnBvcnRfaWQgPT0gMSkgeworCQlyZWcgPSBkaXNjb25uZWN0ID8gQU5BRElHX1VTQjJfTE9PUEJBQ0tfU0VUCisJCQk6IEFOQURJR19VU0IyX0xPT1BCQUNLX0NMUjsKKwkJcmVnbWFwX3dyaXRlKG14c19waHktPnJlZ21hcF9hbmF0b3AsIHJlZywKKwkJCUJNX0FOQURJR19VU0IyX0xPT1BCQUNLX1VUTUlfRElHX1RTVDEgfAorCQkJQk1fQU5BRElHX1VTQjJfTE9PUEJBQ0tfVFNUSV9UWF9FTik7CisJfQorCisJaWYgKCFkaXNjb25uZWN0KQorCQl3cml0ZWxfcmVsYXhlZChCTV9VU0JQSFlfREVCVUdfQ0xLR0FURSwKKwkJCWJhc2UgKyBIV19VU0JQSFlfREVCVUdfU0VUKTsKKworCS8qIERlbGF5IHNvbWUgdGltZSwgYW5kIGxldCBMaW5lc3RhdGUgYmUgU0UwIGZvciBjb250cm9sbGVyICovCisJaWYgKGRpc2Nvbm5lY3QpCisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOworfQorCitzdGF0aWMgdm9pZCBteHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSwgYm9vbCBvbikKK3sKKwlib29sIHZidXNfaXNfb24gPSBmYWxzZTsKKworCS8qIElmIHRoZSBTb0NzIGRvbid0IG5lZWQgdG8gZGlzY29ubmVjdCBsaW5lIHdpdGhvdXQgdmJ1cywgcXVpdCAqLworCWlmICghKG14c19waHktPmRhdGEtPmZsYWdzICYgTVhTX1BIWV9ESVNDT05ORUNUX0xJTkVfV0lUSE9VVF9WQlVTKSkKKwkJcmV0dXJuOworCisJLyogSWYgdGhlIFNvQ3MgZG9uJ3QgaGF2ZSBhbmF0b3AsIHF1aXQgKi8KKwlpZiAoIW14c19waHktPnJlZ21hcF9hbmF0b3ApCisJCXJldHVybjsKKworCXZidXNfaXNfb24gPSBteHNfcGh5X2dldF92YnVzX3N0YXR1cyhteHNfcGh5KTsKKworCWlmIChvbiAmJiAhdmJ1c19pc19vbikKKwkJX19teHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShteHNfcGh5LCB0cnVlKTsKKwllbHNlCisJCV9fbXhzX3BoeV9kaXNjb25uZWN0X2xpbmUobXhzX3BoeSwgZmFsc2UpOworCit9CisKIHN0YXRpYyBpbnQgbXhzX3BoeV9pbml0KHN0cnVjdCB1c2JfcGh5ICpwaHkpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSA9IHRvX214c19waHkocGh5KTsKIAorCW14c19waHlfY2xvY2tfc3dpdGNoX2RlbGF5KCk7CiAJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG14c19waHktPmNsayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTk0LDYgKzI5OSw3IEBACiAJCSAgICAgICB4LT5pb19wcml2ICsgSFdfVVNCUEhZX0NUUkxfU0VUKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG14c19waHktPmNsayk7CiAJfSBlbHNlIHsKKwkJbXhzX3BoeV9jbG9ja19zd2l0Y2hfZGVsYXkoKTsKIAkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG14c19waHktPmNsayk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtMTA1LDExICszMTEsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBteHNfcGh5X3NldF93YWtldXAoc3RydWN0IHVzYl9waHkgKngsIGJvb2wgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSA9IHRvX214c19waHkoeCk7CisJdTMyIHZhbHVlID0gQk1fVVNCUEhZX0NUUkxfRU5WQlVTQ0hHX1dLVVAgfAorCQkJQk1fVVNCUEhZX0NUUkxfRU5EUERNQ0hHX1dLVVAgfAorCQkJCUJNX1VTQlBIWV9DVFJMX0VOSURDSEdfV0tVUDsKKwlpZiAoZW5hYmxlZCkgeworCQlteHNfcGh5X2Rpc2Nvbm5lY3RfbGluZShteHNfcGh5LCB0cnVlKTsKKwkJd3JpdGVsX3JlbGF4ZWQodmFsdWUsIHgtPmlvX3ByaXYgKyBIV19VU0JQSFlfQ1RSTF9TRVQpOworCX0gZWxzZSB7CisJCXdyaXRlbF9yZWxheGVkKHZhbHVlLCB4LT5pb19wcml2ICsgSFdfVVNCUEhZX0NUUkxfQ0xSKTsKKwkJbXhzX3BoeV9kaXNjb25uZWN0X2xpbmUobXhzX3BoeSwgZmFsc2UpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG14c19waHlfb25fY29ubmVjdChzdHJ1Y3QgdXNiX3BoeSAqcGh5LAogCQllbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3BlZWQpCiB7Ci0JZGV2X2RiZyhwaHktPmRldiwgIiVzIHNwZWVkIGRldmljZSBoYXMgY29ubmVjdGVkXG4iLAotCQkoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpID8gImhpZ2giIDogIm5vbi1oaWdoIik7CisJZGV2X2RiZyhwaHktPmRldiwgIiVzIGRldmljZSBoYXMgY29ubmVjdGVkXG4iLAorCQkoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpID8gIkhTIiA6ICJGUy9MUyIpOwogCiAJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQogCQl3cml0ZWwoQk1fVVNCUEhZX0NUUkxfRU5IT1NURElTQ09OREVURUNULApAQCAtMTIxLDggKzM0NCw4IEBACiBzdGF0aWMgaW50IG14c19waHlfb25fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX3BoeSAqcGh5LAogCQllbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3BlZWQpCiB7Ci0JZGV2X2RiZyhwaHktPmRldiwgIiVzIHNwZWVkIGRldmljZSBoYXMgZGlzY29ubmVjdGVkXG4iLAotCQkoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpID8gImhpZ2giIDogIm5vbi1oaWdoIik7CisJZGV2X2RiZyhwaHktPmRldiwgIiVzIGRldmljZSBoYXMgZGlzY29ubmVjdGVkXG4iLAorCQkoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpID8gIkhTIiA6ICJGUy9MUyIpOwogCiAJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQogCQl3cml0ZWwoQk1fVVNCUEhZX0NUUkxfRU5IT1NURElTQ09OREVURUNULApAQCAtMTM4LDYgKzM2MSw5IEBACiAJc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCBteHNfcGh5ICpteHNfcGh5OwogCWludCByZXQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQorCQkJb2ZfbWF0Y2hfZGV2aWNlKG14c19waHlfZHRfaWRzLCAmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKQEAgLTE1Nyw2ICszODMsMjIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJLyogU29tZSBTb0NzIGRvbid0IGhhdmUgYW5hdG9wIHJlZ2lzdGVycyAqLworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsYW5hdG9wIiwgTlVMTCkpIHsKKwkJbXhzX3BoeS0+cmVnbWFwX2FuYXRvcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUKKwkJCShucCwgImZzbCxhbmF0b3AiKTsKKwkJaWYgKElTX0VSUihteHNfcGh5LT5yZWdtYXBfYW5hdG9wKSkgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZmluZCByZWdtYXAgZm9yIGFuYXRvcFxuIik7CisJCQlyZXR1cm4gUFRSX0VSUihteHNfcGh5LT5yZWdtYXBfYW5hdG9wKTsKKwkJfQorCX0KKworCXJldCA9IG9mX2FsaWFzX2dldF9pZChucCwgInVzYnBoeSIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGFsaWFzIGlkLCBlcnJubyAlZFxuIiwgcmV0KTsKKwlteHNfcGh5LT5wb3J0X2lkID0gcmV0OworCiAJbXhzX3BoeS0+cGh5LmlvX3ByaXYJCT0gYmFzZTsKIAlteHNfcGh5LT5waHkuZGV2CQk9ICZwZGV2LT5kZXY7CiAJbXhzX3BoeS0+cGh5LmxhYmVsCQk9IERSSVZFUl9OQU1FOwpAQCAtMTY2LDExICs0MDgsMTUgQEAKIAlteHNfcGh5LT5waHkubm90aWZ5X2Nvbm5lY3QJPSBteHNfcGh5X29uX2Nvbm5lY3Q7CiAJbXhzX3BoeS0+cGh5Lm5vdGlmeV9kaXNjb25uZWN0CT0gbXhzX3BoeV9vbl9kaXNjb25uZWN0OwogCW14c19waHktPnBoeS50eXBlCQk9IFVTQl9QSFlfVFlQRV9VU0IyOworCW14c19waHktPnBoeS5zZXRfd2FrZXVwCQk9IG14c19waHlfc2V0X3dha2V1cDsKIAogCW14c19waHktPmNsayA9IGNsazsKKwlteHNfcGh5LT5kYXRhID0gb2ZfaWQtPmRhdGE7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBteHNfcGh5KTsKIAorCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoJnBkZXYtPmRldiwgdHJ1ZSk7CisKIAlyZXQgPSB1c2JfYWRkX3BoeV9kZXYoJm14c19waHktPnBoeSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE4NywxMSArNDMzLDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG14c19waHlfZHRfaWRzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MjMtdXNicGh5IiwgfSwKLQl7IC8qIHNlbnRpbmVsICovIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBteHNfcGh5X2R0X2lkcyk7CisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgdm9pZCBteHNfcGh5X2VuYWJsZV9sZG9faW5fc3VzcGVuZChzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSwgYm9vbCBvbikKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gb24gPyBBTkFESUdfQU5BX01JU0MwX1NFVCA6IEFOQURJR19BTkFfTUlTQzBfQ0xSOworCisJLyogSWYgdGhlIFNvQ3MgZG9uJ3QgaGF2ZSBhbmF0b3AsIHF1aXQgKi8KKwlpZiAoIW14c19waHktPnJlZ21hcF9hbmF0b3ApCisJCXJldHVybjsKKworCWlmIChpc19pbXg2cV9waHkobXhzX3BoeSkpCisJCXJlZ21hcF93cml0ZShteHNfcGh5LT5yZWdtYXBfYW5hdG9wLCByZWcsCisJCQlCTV9BTkFESUdfQU5BX01JU0MwX1NUT1BfTU9ERV9DT05GSUcpOworCWVsc2UgaWYgKGlzX2lteDZzbF9waHkobXhzX3BoeSkpCisJCXJlZ21hcF93cml0ZShteHNfcGh5LT5yZWdtYXBfYW5hdG9wLAorCQkJcmVnLCBCTV9BTkFESUdfQU5BX01JU0MwX1NUT1BfTU9ERV9DT05GSUdfU0wpOworfQorCitzdGF0aWMgaW50IG14c19waHlfc3lzdGVtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBteHNfcGh5ICpteHNfcGh5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJbXhzX3BoeV9lbmFibGVfbGRvX2luX3N1c3BlbmQobXhzX3BoeSwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHNfcGh5X3N5c3RlbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBteHNfcGh5ICpteHNfcGh5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJbXhzX3BoeV9lbmFibGVfbGRvX2luX3N1c3BlbmQobXhzX3BoeSwgZmFsc2UpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhteHNfcGh5X3BtLCBteHNfcGh5X3N5c3RlbV9zdXNwZW5kLAorCQlteHNfcGh5X3N5c3RlbV9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteHNfcGh5X2RyaXZlciA9IHsKIAkucHJvYmUgPSBteHNfcGh5X3Byb2JlLApAQCAtMjAwLDYgKzQ4MSw3IEBACiAJCS5uYW1lID0gRFJJVkVSX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBteHNfcGh5X2R0X2lkcywKKwkJLnBtID0gJm14c19waHlfcG0sCiAJIH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtY29udHJvbC5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1vbWFwLWNvbnRyb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyNTMxOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtY29udHJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qCi0gKiBvbWFwLWNvbnRyb2wtdXNiLmMgLSBUaGUgVVNCIHBhcnQgb2YgY29udHJvbCBtb2R1bGUuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb21hcF9jb250cm9sX3VzYi5oPgotCi0vKioKLSAqIG9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyIC0gcG93ZXIgb24vb2ZmIHRoZSBwaHkgdXNpbmcgY29udHJvbCBtb2R1bGUgcmVnCi0gKiBAZGV2OiB0aGUgY29udHJvbCBtb2R1bGUgZGV2aWNlCi0gKiBAb246IDAgb3IgMSwgYmFzZWQgb24gcG93ZXJpbmcgb24gb3Igb2ZmIHRoZSBQSFkKLSAqLwotdm9pZCBvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBvbikKLXsKLQl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQlzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYgkqY29udHJvbF91c2I7Ci0KLQlpZiAoSVNfRVJSKGRldikgfHwgIWRldikgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGRldmljZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JY29udHJvbF91c2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpZiAoIWNvbnRyb2xfdXNiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGludmFsaWQgY29udHJvbCB1c2IgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY29udHJvbF91c2ItPnR5cGUgPT0gT01BUF9DVFJMX1RZUEVfT1RHSFMpCi0JCXJldHVybjsKLQotCXZhbCA9IHJlYWRsKGNvbnRyb2xfdXNiLT5wb3dlcik7Ci0KLQlzd2l0Y2ggKGNvbnRyb2xfdXNiLT50eXBlKSB7Ci0JY2FzZSBPTUFQX0NUUkxfVFlQRV9VU0IyOgotCQlpZiAob24pCi0JCQl2YWwgJj0gfk9NQVBfQ1RSTF9ERVZfUEhZX1BEOwotCQllbHNlCi0JCQl2YWwgfD0gT01BUF9DVFJMX0RFVl9QSFlfUEQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBPTUFQX0NUUkxfVFlQRV9QSVBFMzoKLQkJcmF0ZSA9IGNsa19nZXRfcmF0ZShjb250cm9sX3VzYi0+c3lzX2Nsayk7Ci0JCXJhdGUgPSByYXRlLzEwMDAwMDA7Ci0KLQkJaWYgKG9uKSB7Ci0JCQl2YWwgJj0gfihPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfQ01EX01BU0sgfAotCQkJCQlPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfRlJFUV9NQVNLKTsKLQkJCXZhbCB8PSBPTUFQX0NUUkxfVVNCM19QSFlfVFhfUlhfUE9XRVJPTiA8PAotCQkJCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19DTURfU0hJRlQ7Ci0JCQl2YWwgfD0gcmF0ZSA8PCBPTUFQX0NUUkxfVVNCX1BXUkNUTF9DTEtfRlJFUV9TSElGVDsKLQkJfSBlbHNlIHsKLQkJCXZhbCAmPSB+T01BUF9DVFJMX1VTQl9QV1JDVExfQ0xLX0NNRF9NQVNLOwotCQkJdmFsIHw9IE9NQVBfQ1RSTF9VU0IzX1BIWV9UWF9SWF9QT1dFUk9GRiA8PAotCQkJCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19DTURfU0hJRlQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE9NQVBfQ1RSTF9UWVBFX0RSQTdVU0IyOgotCQlpZiAob24pCi0JCQl2YWwgJj0gfk9NQVBfQ1RSTF9VU0IyX1BIWV9QRDsKLQkJZWxzZQotCQkJdmFsIHw9IE9NQVBfQ1RSTF9VU0IyX1BIWV9QRDsKLQkJYnJlYWs7Ci0KLQljYXNlIE9NQVBfQ1RSTF9UWVBFX0FNNDM3VVNCMjoKLQkJaWYgKG9uKSB7Ci0JCQl2YWwgJj0gfihBTTQzN1hfQ1RSTF9VU0IyX1BIWV9QRCB8Ci0JCQkJCUFNNDM3WF9DVFJMX1VTQjJfT1RHX1BEKTsKLQkJCXZhbCB8PSAoQU00MzdYX0NUUkxfVVNCMl9PVEdWREVUX0VOIHwKLQkJCQkJQU00MzdYX0NUUkxfVVNCMl9PVEdTRVNTRU5EX0VOKTsKLQkJfSBlbHNlIHsKLQkJCXZhbCAmPSB+KEFNNDM3WF9DVFJMX1VTQjJfT1RHVkRFVF9FTiB8Ci0JCQkJCUFNNDM3WF9DVFJMX1VTQjJfT1RHU0VTU0VORF9FTik7Ci0JCQl2YWwgfD0gKEFNNDM3WF9DVFJMX1VTQjJfUEhZX1BEIHwKLQkJCQkJIEFNNDM3WF9DVFJMX1VTQjJfT1RHX1BEKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgIiVzOiB0eXBlICVkIG5vdCByZWNvZ25pemVkXG4iLAotCQkJCQlfX2Z1bmNfXywgY29udHJvbF91c2ItPnR5cGUpOwotCQlicmVhazsKLQl9Ci0KLQl3cml0ZWwodmFsLCBjb250cm9sX3VzYi0+cG93ZXIpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwob21hcF9jb250cm9sX3VzYl9waHlfcG93ZXIpOwotCi0vKioKLSAqIG9tYXBfY29udHJvbF91c2JfaG9zdF9tb2RlIC0gc2V0IEFWQUxJRCwgVkJVU1ZBTElEIGFuZCBJRCBwaW4gaW4gZ3JvdW5kZWQKLSAqIEBjdHJsX3VzYjogc3RydWN0IG9tYXBfY29udHJvbF91c2IgKgotICoKLSAqIFdyaXRlcyB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIHRoYXQgYSB1c2IKLSAqIGRldmljZSBoYXMgYmVlbiBjb25uZWN0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXBfY29udHJvbF91c2JfaG9zdF9tb2RlKHN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiICpjdHJsX3VzYikKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gcmVhZGwoY3RybF91c2ItPm90Z2hzX2NvbnRyb2wpOwotCXZhbCAmPSB+KE9NQVBfQ1RSTF9ERVZfSURESUcgfCBPTUFQX0NUUkxfREVWX1NFU1NFTkQpOwotCXZhbCB8PSBPTUFQX0NUUkxfREVWX0FWQUxJRCB8IE9NQVBfQ1RSTF9ERVZfVkJVU1ZBTElEOwotCXdyaXRlbCh2YWwsIGN0cmxfdXNiLT5vdGdoc19jb250cm9sKTsKLX0KLQotLyoqCi0gKiBvbWFwX2NvbnRyb2xfdXNiX2RldmljZV9tb2RlIC0gc2V0IEFWQUxJRCwgVkJVU1ZBTElEIGFuZCBJRCBwaW4gaW4gaGlnaAotICogaW1wZWRhbmNlCi0gKiBAY3RybF91c2I6IHN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiICoKLSAqCi0gKiBXcml0ZXMgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXIgdG8gbm90aWZ5IHRoZSB1c2IgY29yZSB0aGF0IGl0IGhhcyBiZWVuCi0gKiBjb25uZWN0ZWQgdG8gYSB1c2IgaG9zdC4KLSAqLwotc3RhdGljIHZvaWQgb21hcF9jb250cm9sX3VzYl9kZXZpY2VfbW9kZShzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqY3RybF91c2IpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IHJlYWRsKGN0cmxfdXNiLT5vdGdoc19jb250cm9sKTsKLQl2YWwgJj0gfk9NQVBfQ1RSTF9ERVZfU0VTU0VORDsKLQl2YWwgfD0gT01BUF9DVFJMX0RFVl9JRERJRyB8IE9NQVBfQ1RSTF9ERVZfQVZBTElEIHwKLQkJT01BUF9DVFJMX0RFVl9WQlVTVkFMSUQ7Ci0Jd3JpdGVsKHZhbCwgY3RybF91c2ItPm90Z2hzX2NvbnRyb2wpOwotfQotCi0vKioKLSAqIG9tYXBfY29udHJvbF91c2Jfc2V0X3Nlc3Npb25lbmQgLSBFbmFibGUgU0VTU0lPTkVORCBhbmQgSURJRyB0byBoaWdoCi0gKiBpbXBlZGFuY2UKLSAqIEBjdHJsX3VzYjogc3RydWN0IG9tYXBfY29udHJvbF91c2IgKgotICoKLSAqIFdyaXRlcyB0byB0aGUgbWFpbGJveCByZWdpc3RlciB0byBub3RpZnkgdGhlIHVzYiBjb3JlIGl0J3Mgbm93IGluCi0gKiBkaXNjb25uZWN0ZWQgc3RhdGUuCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXBfY29udHJvbF91c2Jfc2V0X3Nlc3Npb25lbmQoc3RydWN0IG9tYXBfY29udHJvbF91c2IgKmN0cmxfdXNiKQotewotCXUzMiB2YWw7Ci0KLQl2YWwgPSByZWFkbChjdHJsX3VzYi0+b3RnaHNfY29udHJvbCk7Ci0JdmFsICY9IH4oT01BUF9DVFJMX0RFVl9BVkFMSUQgfCBPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRCk7Ci0JdmFsIHw9IE9NQVBfQ1RSTF9ERVZfSURESUcgfCBPTUFQX0NUUkxfREVWX1NFU1NFTkQ7Ci0Jd3JpdGVsKHZhbCwgY3RybF91c2ItPm90Z2hzX2NvbnRyb2wpOwotfQotCi0vKioKLSAqIG9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUgLSBDYWxscyB0byBmdW5jdGlvbnMgdG8gc2V0IFVTQiBpbiBvbmUgb2YgaG9zdCBtb2RlCi0gKiBvciBkZXZpY2UgbW9kZSBvciB0byBkZW5vdGUgZGlzY29ubmVjdGVkIHN0YXRlCi0gKiBAZGV2OiB0aGUgY29udHJvbCBtb2R1bGUgZGV2aWNlCi0gKiBAbW9kZTogVGhlIG1vZGUgdG8gd2hpY2ggdXNiIHNob3VsZCBiZSBjb25maWd1cmVkCi0gKgotICogVGhpcyBpcyBhbiBBUEkgdG8gd3JpdGUgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXIgdG8gbm90aWZ5IHRoZSB1c2IgY29yZSB0aGF0Ci0gKiBhIHVzYiBkZXZpY2UgaGFzIGJlZW4gY29ubmVjdGVkLgotICovCi12b2lkIG9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCWVudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIG1vZGUpCi17Ci0Jc3RydWN0IG9tYXBfY29udHJvbF91c2IJKmN0cmxfdXNiOwotCi0JaWYgKElTX0VSUihkZXYpIHx8ICFkZXYpCi0JCXJldHVybjsKLQotCWN0cmxfdXNiID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoIWN0cmxfdXNiKSB7Ci0JCWRldl9lcnIoZGV2LCAiSW52YWxpZCBjb250cm9sIHVzYiBkZXZpY2VcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGN0cmxfdXNiLT50eXBlICE9IE9NQVBfQ1RSTF9UWVBFX09UR0hTKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFVTQl9NT0RFX0hPU1Q6Ci0JCW9tYXBfY29udHJvbF91c2JfaG9zdF9tb2RlKGN0cmxfdXNiKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfTU9ERV9ERVZJQ0U6Ci0JCW9tYXBfY29udHJvbF91c2JfZGV2aWNlX21vZGUoY3RybF91c2IpOwotCQlicmVhazsKLQljYXNlIFVTQl9NT0RFX0RJU0NPTk5FQ1Q6Ci0JCW9tYXBfY29udHJvbF91c2Jfc2V0X3Nlc3Npb25lbmQoY3RybF91c2IpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfdmRiZyhkZXYsICJpbnZhbGlkIG9tYXAgY29udHJvbCB1c2IgbW9kZVxuIik7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwob21hcF9jb250cm9sX3VzYl9zZXRfbW9kZSk7Ci0KLSNpZmRlZiBDT05GSUdfT0YKLQotc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIG90Z2hzX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9PVEdIUzsKLXN0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSB1c2IyX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9VU0IyOwotc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIHBpcGUzX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9QSVBFMzsKLXN0YXRpYyBjb25zdCBlbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSBkcmE3dXNiMl9kYXRhID0gT01BUF9DVFJMX1RZUEVfRFJBN1VTQjI7Ci1zdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfdXNiX3R5cGUgYW00Mzd1c2IyX2RhdGEgPSBPTUFQX0NUUkxfVFlQRV9BTTQzN1VTQjI7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9tYXBfY29udHJvbF91c2JfaWRfdGFibGVbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LW90Z2hzIiwKLQkJLmRhdGEgPSAmb3RnaHNfZGF0YSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktdXNiMiIsCi0JCS5kYXRhID0gJnVzYjJfZGF0YSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAidGksY29udHJvbC1waHktcGlwZTMiLAotCQkuZGF0YSA9ICZwaXBlM19kYXRhLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJ0aSxjb250cm9sLXBoeS1kcmE3dXNiMiIsCi0JCS5kYXRhID0gJmRyYTd1c2IyX2RhdGEsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInRpLGNvbnRyb2wtcGh5LWFtNDM3dXNiMiIsCi0JCS5kYXRhID0gJmFtNDM3dXNiMl9kYXRhLAotCX0sCi0Je30sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb21hcF9jb250cm9sX3VzYl9pZF90YWJsZSk7Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IG9tYXBfY29udHJvbF91c2JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UJKnJlczsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKLQlzdHJ1Y3Qgb21hcF9jb250cm9sX3VzYiAqY29udHJvbF91c2I7Ci0KLQlvZl9pZCA9IG9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIob21hcF9jb250cm9sX3VzYl9pZF90YWJsZSksCi0JCQkJCQkJCSZwZGV2LT5kZXYpOwotCWlmICghb2ZfaWQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY29udHJvbF91c2IgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjb250cm9sX3VzYiksCi0JCUdGUF9LRVJORUwpOwotCWlmICghY29udHJvbF91c2IpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgY29udHJvbCB1c2JcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQljb250cm9sX3VzYi0+ZGV2ID0gJnBkZXYtPmRldjsKLQljb250cm9sX3VzYi0+dHlwZSA9ICooZW51bSBvbWFwX2NvbnRyb2xfdXNiX3R5cGUgKilvZl9pZC0+ZGF0YTsKLQotCWlmIChjb250cm9sX3VzYi0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9PVEdIUykgewotCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAotCQkJIm90Z2hzX2NvbnRyb2wiKTsKLQkJY29udHJvbF91c2ItPm90Z2hzX2NvbnRyb2wgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoCi0JCQkmcGRldi0+ZGV2LCByZXMpOwotCQlpZiAoSVNfRVJSKGNvbnRyb2xfdXNiLT5vdGdoc19jb250cm9sKSkKLQkJCXJldHVybiBQVFJfRVJSKGNvbnRyb2xfdXNiLT5vdGdoc19jb250cm9sKTsKLQl9IGVsc2UgewotCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAotCQkJCSJwb3dlciIpOwotCQljb250cm9sX3VzYi0+cG93ZXIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKLQkJaWYgKElTX0VSUihjb250cm9sX3VzYi0+cG93ZXIpKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBnZXQgcG93ZXIgcmVnaXN0ZXJcbiIpOwotCQkJcmV0dXJuIFBUUl9FUlIoY29udHJvbF91c2ItPnBvd2VyKTsKLQkJfQotCX0KLQotCWlmIChjb250cm9sX3VzYi0+dHlwZSA9PSBPTUFQX0NUUkxfVFlQRV9QSVBFMykgewotCQljb250cm9sX3VzYi0+c3lzX2NsayA9IGRldm1fY2xrX2dldChjb250cm9sX3VzYi0+ZGV2LAotCQkJInN5c19jbGtpbiIpOwotCQlpZiAoSVNfRVJSKGNvbnRyb2xfdXNiLT5zeXNfY2xrKSkgewotCQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGdldCBzeXNfY2xraW5cbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKGNvbnRyb2xfdXNiLT5kZXYsIGNvbnRyb2xfdXNiKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2NvbnRyb2xfdXNiX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gb21hcF9jb250cm9sX3VzYl9wcm9iZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAib21hcC1jb250cm9sLXVzYiIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob21hcF9jb250cm9sX3VzYl9pZF90YWJsZSksCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfY29udHJvbF91c2JfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfY29udHJvbF91c2JfZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbChvbWFwX2NvbnRyb2xfdXNiX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9jb250cm9sX3VzYl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfY29udHJvbF91c2JfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG9tYXBfY29udHJvbF91c2JfZXhpdCk7Ci0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06IG9tYXBfY29udHJvbF91c2IiKTsKLU1PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIEluYy4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiT01BUCBDb250cm9sIE1vZHVsZSBVU0IgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtdXNiMy5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1vbWFwLXVzYjMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2YmEyOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtdXNiMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qCi0gKiBvbWFwLXVzYjMgLSBVU0IgUEhZLCB0YWxraW5nIHRvIGR3YzMgY29udHJvbGxlciBpbiBPTUFQLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbQotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBBdXRob3I6IEtpc2hvbiBWaWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb21hcF91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLQotI2RlZmluZQlQTExfU1RBVFVTCQkweDAwMDAwMDA0Ci0jZGVmaW5lCVBMTF9HTwkJCTB4MDAwMDAwMDgKLSNkZWZpbmUJUExMX0NPTkZJR1VSQVRJT04xCTB4MDAwMDAwMEMKLSNkZWZpbmUJUExMX0NPTkZJR1VSQVRJT04yCTB4MDAwMDAwMTAKLSNkZWZpbmUJUExMX0NPTkZJR1VSQVRJT04zCTB4MDAwMDAwMTQKLSNkZWZpbmUJUExMX0NPTkZJR1VSQVRJT040CTB4MDAwMDAwMjAKLQotI2RlZmluZQlQTExfUkVHTV9NQVNLCQkweDAwMUZGRTAwCi0jZGVmaW5lCVBMTF9SRUdNX1NISUZUCQkweDkKLSNkZWZpbmUJUExMX1JFR01fRl9NQVNLCQkweDAwMDNGRkZGCi0jZGVmaW5lCVBMTF9SRUdNX0ZfU0hJRlQJMHgwCi0jZGVmaW5lCVBMTF9SRUdOX01BU0sJCTB4MDAwMDAxRkUKLSNkZWZpbmUJUExMX1JFR05fU0hJRlQJCTB4MQotI2RlZmluZQlQTExfU0VMRlJFUURDT19NQVNLCTB4MDAwMDAwMEUKLSNkZWZpbmUJUExMX1NFTEZSRVFEQ09fU0hJRlQJMHgxCi0jZGVmaW5lCVBMTF9TRF9NQVNLCQkweDAwMDNGQzAwCi0jZGVmaW5lCVBMTF9TRF9TSElGVAkJMHg5Ci0jZGVmaW5lCVNFVF9QTExfR08JCTB4MQotI2RlZmluZQlQTExfVElDT1BXRE4JCTB4MTAwMDAKLSNkZWZpbmUJUExMX0xPQ0sJCTB4MgotI2RlZmluZQlQTExfSURMRQkJMHgxCi0KLS8qCi0gKiBUaGlzIGlzIGFuIEVtcGlyaWNhbCB2YWx1ZSB0aGF0IHdvcmtzLCBuZWVkIHRvIGNvbmZpcm0gdGhlIGFjdHVhbAotICogdmFsdWUgcmVxdWlyZWQgZm9yIHRoZSBVU0IzUEhZX1BMTF9DT05GSUdVUkFUSU9OMi5QTExfSURMRSBzdGF0dXMKLSAqIHRvIGJlIGNvcnJlY3RseSByZWZsZWN0ZWQgaW4gdGhlIFVTQjNQSFlfUExMX1NUQVRVUyByZWdpc3Rlci4KLSAqLwotIyBkZWZpbmUgUExMX0lETEVfVElNRSAgMTAwOwotCi1zdHJ1Y3QgdXNiX2RwbGxfbWFwIHsKLQl1bnNpZ25lZCBsb25nIHJhdGU7Ci0Jc3RydWN0IHVzYl9kcGxsX3BhcmFtcyBwYXJhbXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9kcGxsX21hcCBkcGxsX21hcFtdID0gewotCXsxMjAwMDAwMCwgezEyNTAsIDUsIDQsIDIwLCAwfSB9LAkvKiAxMiBNSHogKi8KLQl7MTY4MDAwMDAsIHszMTI1LCAyMCwgNCwgMjAsIDB9IH0sCS8qIDE2LjggTUh6ICovCi0JezE5MjAwMDAwLCB7MTE3MiwgOCwgNCwgMjAsIDY1NTM3fSB9LAkvKiAxOS4yIE1IeiAqLwotCXsyMDAwMDAwMCwgezEwMDAsIDcsIDQsIDEwLCAwfSB9LAkvKiAyMCBNSHogKi8KLQl7MjYwMDAwMDAsIHsxMjUwLCAxMiwgNCwgMjAsIDB9IH0sCS8qIDI2IE1IeiAqLwotCXszODQwMDAwMCwgezMxMjUsIDQ3LCA0LCAyMCwgOTI4NDN9IH0sCS8qIDM4LjQgTUh6ICovCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9kcGxsX3BhcmFtcyAqb21hcF91c2IzX2dldF9kcGxsX3BhcmFtcyh1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkcGxsX21hcCk7IGkrKykgewotCQlpZiAocmF0ZSA9PSBkcGxsX21hcFtpXS5yYXRlKQotCQkJcmV0dXJuICZkcGxsX21hcFtpXS5wYXJhbXM7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IzX3N1c3BlbmQoc3RydWN0IHVzYl9waHkgKngsIGludCBzdXNwZW5kKQotewotCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X3RvX29tYXB1c2IoeCk7Ci0JaW50CXZhbDsKLQlpbnQgdGltZW91dCA9IFBMTF9JRExFX1RJTUU7Ci0KLQlpZiAoc3VzcGVuZCAmJiAhcGh5LT5pc19zdXNwZW5kZWQpIHsKLQkJdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIpOwotCQl2YWwgfD0gUExMX0lETEU7Ci0JCW9tYXBfdXNiX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMiwgdmFsKTsKLQotCQlkbyB7Ci0JCQl2YWwgPSBvbWFwX3VzYl9yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOwotCQkJaWYgKHZhbCAmIFBMTF9USUNPUFdETikKLQkJCQlicmVhazsKLQkJCXVkZWxheSgxKTsKLQkJfSB3aGlsZSAoLS10aW1lb3V0KTsKLQotCQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKLQotCQlwaHktPmlzX3N1c3BlbmRlZAk9IDE7Ci0JfSBlbHNlIGlmICghc3VzcGVuZCAmJiBwaHktPmlzX3N1c3BlbmRlZCkgewotCQlwaHktPmlzX3N1c3BlbmRlZAk9IDA7Ci0KLQkJdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIpOwotCQl2YWwgJj0gflBMTF9JRExFOwotCQlvbWFwX3VzYl93cml0ZWwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjIsIHZhbCk7Ci0KLQkJZG8gewotCQkJdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfU1RBVFVTKTsKLQkJCWlmICghKHZhbCAmIFBMTF9USUNPUFdETikpCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0gd2hpbGUgKC0tdGltZW91dCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXBfdXNiX2RwbGxfcmVsb2NrKHN0cnVjdCBvbWFwX3VzYiAqcGh5KQotewotCXUzMgkJdmFsOwotCXVuc2lnbmVkIGxvbmcJdGltZW91dDsKLQotCW9tYXBfdXNiX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9HTywgU0VUX1BMTF9HTyk7Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOwotCWRvIHsKLQkJdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfU1RBVFVTKTsKLQkJaWYgKHZhbCAmIFBMTF9MT0NLKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAoIVdBUk5fT04odGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkpOwotfQotCi1zdGF0aWMgaW50IG9tYXBfdXNiX2RwbGxfbG9jayhzdHJ1Y3Qgb21hcF91c2IgKnBoeSkKLXsKLQl1MzIJCQl2YWw7Ci0JdW5zaWduZWQgbG9uZwkJcmF0ZTsKLQlzdHJ1Y3QgdXNiX2RwbGxfcGFyYW1zICpkcGxsX3BhcmFtczsKLQotCXJhdGUgPSBjbGtfZ2V0X3JhdGUocGh5LT5zeXNfY2xrKTsKLQlkcGxsX3BhcmFtcyA9IG9tYXBfdXNiM19nZXRfZHBsbF9wYXJhbXMocmF0ZSk7Ci0JaWYgKCFkcGxsX3BhcmFtcykgewotCQlkZXZfZXJyKHBoeS0+ZGV2LAotCQkJICAiTm8gRFBMTCBjb25maWd1cmF0aW9uIGZvciAlbHUgSHogU1lTIENMS1xuIiwgcmF0ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXZhbCA9IG9tYXBfdXNiX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xKTsKLQl2YWwgJj0gflBMTF9SRUdOX01BU0s7Ci0JdmFsIHw9IGRwbGxfcGFyYW1zLT5uIDw8IFBMTF9SRUdOX1NISUZUOwotCW9tYXBfdXNiX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSwgdmFsKTsKLQotCXZhbCA9IG9tYXBfdXNiX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04yKTsKLQl2YWwgJj0gflBMTF9TRUxGUkVRRENPX01BU0s7Ci0JdmFsIHw9IGRwbGxfcGFyYW1zLT5mcmVxIDw8IFBMTF9TRUxGUkVRRENPX1NISUZUOwotCW9tYXBfdXNiX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMiwgdmFsKTsKLQotCXZhbCA9IG9tYXBfdXNiX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04xKTsKLQl2YWwgJj0gflBMTF9SRUdNX01BU0s7Ci0JdmFsIHw9IGRwbGxfcGFyYW1zLT5tIDw8IFBMTF9SRUdNX1NISUZUOwotCW9tYXBfdXNiX3dyaXRlbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9DT05GSUdVUkFUSU9OMSwgdmFsKTsKLQotCXZhbCA9IG9tYXBfdXNiX3JlYWRsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT040KTsKLQl2YWwgJj0gflBMTF9SRUdNX0ZfTUFTSzsKLQl2YWwgfD0gZHBsbF9wYXJhbXMtPm1mIDw8IFBMTF9SRUdNX0ZfU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT040LCB2YWwpOwotCi0JdmFsID0gb21hcF91c2JfcmVhZGwocGh5LT5wbGxfY3RybF9iYXNlLCBQTExfQ09ORklHVVJBVElPTjMpOwotCXZhbCAmPSB+UExMX1NEX01BU0s7Ci0JdmFsIHw9IGRwbGxfcGFyYW1zLT5zZCA8PCBQTExfU0RfU0hJRlQ7Ci0Jb21hcF91c2Jfd3JpdGVsKHBoeS0+cGxsX2N0cmxfYmFzZSwgUExMX0NPTkZJR1VSQVRJT04zLCB2YWwpOwotCi0Jb21hcF91c2JfZHBsbF9yZWxvY2socGh5KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXBfdXNiM19pbml0KHN0cnVjdCB1c2JfcGh5ICp4KQotewotCXN0cnVjdCBvbWFwX3VzYgkqcGh5ID0gcGh5X3RvX29tYXB1c2IoeCk7Ci0JaW50IHJldDsKLQotCXJldCA9IG9tYXBfdXNiX2RwbGxfbG9jayhwaHkpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXBfdXNiM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBvbWFwX3VzYiAqcGh5OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbF9ub2RlOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbnRyb2xfcGRldjsKLQotCWlmICghbm9kZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwaHkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwaHkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBoeSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2MgbWVtIGZvciBPTUFQIFVTQjMgUEhZXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInBsbF9jdHJsIik7Ci0JcGh5LT5wbGxfY3RybF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihwaHktPnBsbF9jdHJsX2Jhc2UpKQotCQlyZXR1cm4gUFRSX0VSUihwaHktPnBsbF9jdHJsX2Jhc2UpOwotCi0JcGh5LT5kZXYJCT0gJnBkZXYtPmRldjsKLQotCXBoeS0+cGh5LmRldgkJPSBwaHktPmRldjsKLQlwaHktPnBoeS5sYWJlbAkJPSAib21hcC11c2IzIjsKLQlwaHktPnBoeS5pbml0CQk9IG9tYXBfdXNiM19pbml0OwotCXBoeS0+cGh5LnNldF9zdXNwZW5kCT0gb21hcF91c2IzX3N1c3BlbmQ7Ci0JcGh5LT5waHkudHlwZQkJPSBVU0JfUEhZX1RZUEVfVVNCMzsKLQotCXBoeS0+aXNfc3VzcGVuZGVkCT0gMTsKLQlwaHktPndrdXBjbGsgPSBkZXZtX2Nsa19nZXQocGh5LT5kZXYsICJ1c2JfcGh5X2NtX2NsazMyayIpOwotCWlmIChJU19FUlIocGh5LT53a3VwY2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IHVzYl9waHlfY21fY2xrMzJrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIocGh5LT53a3VwY2xrKTsKLQl9Ci0JY2xrX3ByZXBhcmUocGh5LT53a3VwY2xrKTsKLQotCXBoeS0+b3B0Y2xrID0gZGV2bV9jbGtfZ2V0KHBoeS0+ZGV2LCAidXNiX290Z19zc19yZWZjbGs5NjBtIik7Ci0JaWYgKElTX0VSUihwaHktPm9wdGNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCB1c2Jfb3RnX3NzX3JlZmNsazk2MG1cbiIpOwotCQlyZXR1cm4gUFRSX0VSUihwaHktPm9wdGNsayk7Ci0JfQotCWNsa19wcmVwYXJlKHBoeS0+b3B0Y2xrKTsKLQotCXBoeS0+c3lzX2NsayA9IGRldm1fY2xrX2dldChwaHktPmRldiwgInN5c19jbGtpbiIpOwotCWlmIChJU19FUlIocGh5LT5zeXNfY2xrKSkgewotCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZ2V0IHN5c19jbGtpblxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljb250cm9sX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJjdHJsLW1vZHVsZSIsIDApOwotCWlmICghY29udHJvbF9ub2RlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgY29udHJvbCBkZXZpY2UgcGhhbmRsZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQljb250cm9sX3BkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGNvbnRyb2xfbm9kZSk7Ci0JaWYgKCFjb250cm9sX3BkZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBjb250cm9sIGRldmljZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBoeS0+Y29udHJvbF9kZXYgPSAmY29udHJvbF9wZGV2LT5kZXY7Ci0KLQlvbWFwX2NvbnRyb2xfdXNiX3BoeV9wb3dlcihwaHktPmNvbnRyb2xfZGV2LCAwKTsKLQl1c2JfYWRkX3BoeV9kZXYoJnBoeS0+cGh5KTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBoeSk7Ci0KLQlwbV9ydW50aW1lX2VuYWJsZShwaHktPmRldik7Ci0JcG1fcnVudGltZV9nZXQoJnBkZXYtPmRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwX3VzYjNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWNsa191bnByZXBhcmUocGh5LT53a3VwY2xrKTsKLQljbGtfdW5wcmVwYXJlKHBoeS0+b3B0Y2xrKTsKLQl1c2JfcmVtb3ZlX3BoeSgmcGh5LT5waHkpOwotCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoJnBkZXYtPmRldikpCi0JCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwotCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKLQotc3RhdGljIGludCBvbWFwX3VzYjNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9tYXBfdXNiCSpwaHkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWNsa19kaXNhYmxlKHBoeS0+d2t1cGNsayk7Ci0JY2xrX2Rpc2FibGUocGh5LT5vcHRjbGspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IzX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQl1MzIgcmV0ID0gMDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9tYXBfdXNiCSpwaHkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXJldCA9IGNsa19lbmFibGUocGh5LT5vcHRjbGspOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihwaHktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgb3B0Y2xrICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JcmV0ID0gY2xrX2VuYWJsZShwaHktPndrdXBjbGspOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihwaHktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgd2t1cGNsayAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnIyOwotCX0KLQotCXJldHVybiAwOwotCi1lcnIyOgotCWNsa19kaXNhYmxlKHBoeS0+b3B0Y2xrKTsKLQotZXJyMToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgb21hcF91c2IzX3BtX29wcyA9IHsKLQlTRVRfUlVOVElNRV9QTV9PUFMob21hcF91c2IzX3J1bnRpbWVfc3VzcGVuZCwgb21hcF91c2IzX3J1bnRpbWVfcmVzdW1lLAotCQlOVUxMKQotfTsKLQotI2RlZmluZSBERVZfUE1fT1BTICAgICAoJm9tYXBfdXNiM19wbV9vcHMpCi0jZWxzZQotI2RlZmluZSBERVZfUE1fT1BTICAgICBOVUxMCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF91c2IzX2lkX3RhYmxlW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwLXVzYjMiIH0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvbWFwX3VzYjNfaWRfdGFibGUpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfdXNiM19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IG9tYXBfdXNiM19wcm9iZSwKLQkucmVtb3ZlCQk9IG9tYXBfdXNiM19yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gIm9tYXAtdXNiMyIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkucG0JPSBERVZfUE1fT1BTLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob21hcF91c2IzX2lkX3RhYmxlKSwKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihvbWFwX3VzYjNfZHJpdmVyKTsKLQotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogb21hcF91c2IzIik7Ci1NT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyBJbmMuIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAgVVNCMyBwaHkgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LXJjYXItZ2VuMi11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktcmNhci1nZW4yLXVzYi5jCmluZGV4IDU1MWUwYTYuLjM4OGQ4OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktcmNhci1nZW4yLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktcmNhci1nZW4yLXVzYi5jCkBAIC0xNzcsMTUgKzE3NywxNSBAQAogCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgcmV0dmFsOwogCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCWlmICghcGRhdGEpIHsKIAkJZGV2X2VycihkZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJ1c2JocyIpOworCWNsayA9IGRldm1fY2xrX2dldChkZXYsICJ1c2JocyIpOwogCWlmIChJU19FUlIoY2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgdGhlIGNsb2NrXG4iKTsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBnZXQgdGhlIGNsb2NrXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktdHdsNjAzMC11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktdHdsNjAzMC11c2IuYwppbmRleCAyMTQxNzJiLi4wNDc3OGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LXR3bDYwMzAtdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS10d2w2MDMwLXVzYi5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC91c2IvbXVzYi1vbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3BoeV9jb21wYW5pb24uaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb21hcF91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvb21hcF91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LXVscGkuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktdWxwaS5jCmluZGV4IDIxNzMzOWQuLjE3ZWEzZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktdWxwaS5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktdWxwaS5jCkBAIC00Nyw2ICs0Nyw4IEBACiBzdGF0aWMgc3RydWN0IHVscGlfaW5mbyB1bHBpX2lkc1tdID0gewogCVVMUElfSU5GTyhVTFBJX0lEKDB4MDRjYywgMHgxNTA0KSwgIk5YUCBJU1AxNTA0IiksCiAJVUxQSV9JTkZPKFVMUElfSUQoMHgwNDI0LCAweDAwMDYpLCAiU01TQyBVU0IzMzF4IiksCisJVUxQSV9JTkZPKFVMUElfSUQoMHgwNDI0LCAweDAwMDcpLCAiU01TQyBVU0IzMzIwIiksCisJVUxQSV9JTkZPKFVMUElfSUQoMHgwNDUxLCAweDE1MDcpLCAiVEkgVFVTQjEyMTAiKSwKIH07CiAKIHN0YXRpYyBpbnQgdWxwaV9zZXRfb3RnX2ZsYWdzKHN0cnVjdCB1c2JfcGh5ICpwaHkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY2gzNDEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jCmluZGV4IDgyMzcxZjYuLjJkNzJhYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jCkBAIC0zMjMsMTEgKzMyMywxMSBAQAogCWlmIChyKQogCQlnb3RvIG91dDsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwgX19mdW5jX18pOworCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLCBfX2Z1bmNfXyk7CiAJciA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiwiCi0JCQkiIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcik7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHN1Ym1pdCBpbnRlcnJ1cHQgdXJiOiAlZFxuIiwKKwkJCV9fZnVuY19fLCByKTsKIAkJY2gzNDFfY2xvc2UocG9ydCk7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYwppbmRleCAwYWMzYjNiLi4yOTE2ZGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkgewogCQkJZGV2X2VycigmcG9ydC0+ZGV2LAotCQkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLAorCQkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCiAJCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJCQkvKiBUaHJvdyBhd2F5IGRhdGEuIE5vIGJldHRlciBpZGVhIHdoYXQgdG8gZG8gd2l0aCBpdC4gKi8KIAkJCXByaXYtPndyZmlsbGVkID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCmluZGV4IGJjY2IxMjIuLjAxYmY1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJCQkgKiB0aGUgZ2VuZXJpYyBmaXJtd2FyZSwgYnV0IGFyZSBub3QgdXNlZCB3aXRoCiAJCQkgKiBOTUVBIGFuZCBTaVJGIHByb3RvY29scyAqLwogCQkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJCSIlcyAtIGZhaWxlZCBzZXR0aW5nIGJhdWQgcmF0ZSwgdW5zdXBwb3J0ZWQgc3BlZWQgb2YgJWQgb24gRWFydGhtYXRlIEdQUyIsCisJCQkJIiVzIC0gZmFpbGVkIHNldHRpbmcgYmF1ZCByYXRlLCB1bnN1cHBvcnRlZCBzcGVlZCBvZiAlZCBvbiBFYXJ0aG1hdGUgR1BTXG4iLAogCQkJCV9fZnVuY19fLCBuZXdfcmF0ZSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTEyMjQsNyArMTIyNCw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1cmItPmRldi0+ZGV2OwotCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKQEAgLTEyMzksMjEgKzEyMzgsOSBAQAogCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQlyZXR1cm47Ci0JY2FzZSAtRVBJUEU6IC8qIG5vIGJyZWFrIG5lZWRlZDsgY2xlYXIgaGFsdCBhbmQgcmVzdWJtaXQgKi8KLQkJaWYgKCFwcml2LT5jb21tX2lzX29rKQotCQkJYnJlYWs7Ci0JCXVzYl9jbGVhcl9oYWx0KHBvcnQtPnNlcmlhbC0+ZGV2LCAweDAyKTsKLQkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwotCQlkZXZfZGJnKGRldiwgIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcG9ydC0+aW50ZXJydXB0X291dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxOwotCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuOwotCQlkZXZfZXJyKGRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLAotCQkJX19mdW5jX18sIHJlc3VsdCk7Ci0JCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7Ci0JCWJyZWFrOworCWNhc2UgLUVQSVBFOgorCQkvKiBDYW5ub3QgY2FsbCB1c2JfY2xlYXJfaGFsdCB3aGlsZSBpbl9pbnRlcnJ1cHQgKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRldiwgIiVzIC0gdW5leHBlY3RlZCBub256ZXJvIHdyaXRlIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCiAJCQlfX2Z1bmNfXywgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCmluZGV4IGI2M2NlMDIuLjFiZDE5MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwpAQCAtMzMyLDkgKzMzMiw5IEBACiAJICogc3R1ZmYgbGlrZSAzRyBtb2RlbXMsIHNvIHNob3J0Y2lyY3VpdCBpdCBpbiB0aGUgOTkuOTk5OTk5OSUgb2YKIAkgKiBjYXNlcyB3aGVyZSB0aGUgVVNCIHNlcmlhbCBpcyBub3QgYSBjb25zb2xlIGFueXdheS4KIAkgKi8KLQlpZiAoIXBvcnQtPnBvcnQuY29uc29sZSB8fCAhcG9ydC0+c3lzcnEpCisJaWYgKCFwb3J0LT5wb3J0LmNvbnNvbGUgfHwgIXBvcnQtPnN5c3JxKSB7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoJnBvcnQtPnBvcnQsIGNoLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkrKywgY2grKykgewogCQkJaWYgKCF1c2Jfc2VyaWFsX2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsICpjaCkpCiAJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnBvcnQsICpjaCwgVFRZX05PUk1BTCk7CkBAIC0zNTksMjQgKzM1OSwzOCBAQAogCiAJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB1cmIgJWQsIGxlbiAlZFxuIiwgX19mdW5jX18sIGksCiAJCQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCWlmICh1cmItPnN0YXR1cykgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FU0hVVERPV046CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHN0b3BwZWQ6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKKwljYXNlIC1FUElQRToKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSB1cmIgc3RvcHBlZDogJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlnb3RvIHJlc3VibWl0OwogCX0KIAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YSgmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAlwb3J0LT5zZXJpYWwtPnR5cGUtPnByb2Nlc3NfcmVhZF91cmIodXJiKTsKIAorcmVzdWJtaXQ6CiAJLyogVGhyb3R0bGUgdGhlIGRldmljZSBpZiByZXF1ZXN0ZWQgYnkgdHR5ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAlwb3J0LT50aHJvdHRsZWQgPSBwb3J0LT50aHJvdHRsZV9yZXE7CiAJaWYgKCFwb3J0LT50aHJvdHRsZWQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCQl1c2Jfc2VyaWFsX2dlbmVyaWNfc3VibWl0X3JlYWRfdXJiKHBvcnQsIGksIEdGUF9BVE9NSUMpOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2VyaWFsX2dlbmVyaWNfcmVhZF9idWxrX2NhbGxiYWNrKTsKIApAQCAtMzg0LDI5ICszOTgsMzggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydC0+d3JpdGVfdXJicyk7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0LT53cml0ZV91cmJzKTsgKytpKSB7CiAJCWlmIChwb3J0LT53cml0ZV91cmJzW2ldID09IHVyYikKIAkJCWJyZWFrOwotCisJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJcG9ydC0+dHhfYnl0ZXMgLT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCXNldF9iaXQoaSwgJnBvcnQtPndyaXRlX3VyYnNfZnJlZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHN0YXR1cykgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJa2ZpZm9fcmVzZXRfb3V0KCZwb3J0LT53cml0ZV9maWZvKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9zdGFydChwb3J0LCBHRlBfQVRPTUlDKTsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FU0hVVERPV046CisJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHN0b3BwZWQ6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwljYXNlIC1FUElQRToKKwkJZGV2X2Vycl9jb25zb2xlKHBvcnQsICIlcyAtIHVyYiBzdG9wcGVkOiAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGV2X2Vycl9jb25zb2xlKHBvcnQsICIlcyAtIG5vbnplcm8gdXJiIHN0YXR1czogJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJZ290byByZXN1Ym1pdDsKIAl9CiAKK3Jlc3VibWl0OgorCXVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9zdGFydChwb3J0LCBHRlBfQVRPTUlDKTsKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9idWxrX2NhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKaW5kZXggZDAwZGFlMS4uNWFkNGEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKQEAgLTExNTEsNyArMTE1MSw3IEBACiAJCWdvdG8gZmFpbF9zdG9yZV92Y2NfbW9kZTsKIAl9CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBzZXR0aW5nIHZjY19tb2RlID0gJWxkIiwgX19mdW5jX18sIHYpOworCWRldl9kYmcoZGV2LCAiJXM6IHNldHRpbmcgdmNjX21vZGUgPSAlbGRcbiIsIF9fZnVuY19fLCB2KTsKIAogCWlmICgodiAhPSAzKSAmJiAodiAhPSA1KSkgewogCQlkZXZfZXJyKGRldiwgIiVzIC0gdmNjX21vZGUgJWxkIGlzIGludmFsaWRcbiIsIF9fZnVuY19fLCB2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCmluZGV4IDI2NWM2NzcuLmQzYWNhZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwpAQCAtMzk3LDE3ICszOTcsNiBAQAogCiAJbXNnID0gKHN0cnVjdCBrZXlzcGFuX3VzYTI2X3BvcnRTdGF0dXNNZXNzYWdlICopZGF0YTsKIAotI2lmIDAKLQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LAotCQkiJXMgLSBwb3J0IHN0YXR1czogcG9ydCAlZCBjdHMgJWQgZGNkICVkIGRzciAlZCByaSAlZCB0b2ZmICVkIHR4b2ZmICVkIHJ4ZW4gJWQgY3IgJWQiLAotCQlfX2Z1bmNfXywgbXNnLT5wb3J0LCBtc2ctPmhza2lhX2N0cywgbXNnLT5ncGlhX2RjZCwgbXNnLT5kc3IsCi0JCW1zZy0+cmksIG1zZy0+X3R4T2ZmLCBtc2ctPl90eFhvZmYsIG1zZy0+cnhFbmFibGVkLAotCQltc2ctPmNvbnRyb2xSZXNwb25zZSk7Ci0jZW5kaWYKLQotCS8qIE5vdyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIGRhdGEgKi8KLQotCiAJLyogQ2hlY2sgcG9ydCBudW1iZXIgZnJvbSBtZXNzYWdlIGFuZCByZXRyaWV2ZSBwcml2YXRlIGRhdGEgKi8KIAlpZiAobXNnLT5wb3J0ID49IHNlcmlhbC0+bnVtX3BvcnRzKSB7CiAJCWRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIFVuZXhwZWN0ZWQgcG9ydCBudW1iZXIgJWRcbiIsIF9fZnVuY19fLCBtc2ctPnBvcnQpOwpAQCAtNTIzLDkgKzUxMiw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKmRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlcyAlMTJwaCIsIF9fZnVuY19fLCBkYXRhKTsqLwotCi0JLyogTm93IGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgZGF0YSAqLwogCW1zZyA9IChzdHJ1Y3Qga2V5c3Bhbl91c2EyOF9wb3J0U3RhdHVzTWVzc2FnZSAqKWRhdGE7CiAKIAkvKiBDaGVjayBwb3J0IG51bWJlciBmcm9tIG1lc3NhZ2UgYW5kIHJldHJpZXZlIHByaXZhdGUgZGF0YSAqLwpAQCAtNjA1LDkgKzU5MSw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKmRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsICIlczogJTExcGgiLCBfX2Z1bmNfXywgZGF0YSk7Ki8KLQotCS8qIE5vdyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIGRhdGEgKi8KIAltc2cgPSAoc3RydWN0IGtleXNwYW5fdXNhNDlfcG9ydFN0YXR1c01lc3NhZ2UgKilkYXRhOwogCiAJLyogQ2hlY2sgcG9ydCBudW1iZXIgZnJvbSBtZXNzYWdlIGFuZCByZXRyaWV2ZSBwcml2YXRlIGRhdGEgKi8KQEAgLTE3OTMsMTIgKzE3NzYsNiBAQAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyICE9IDApCiAJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIoc2V0dXApIGZhaWxlZFxuIiwgX19mdW5jX18pOwotI2lmIDAKLQllbHNlIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYihzZXR1cCkgT0sgJWQgYnl0ZXNcbiIsIF9fZnVuY19fLAotCQkgICAgdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwotCX0KLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTc2LDEzICsxOTUzLDYgQEAKIAllcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGVyciAhPSAwKQogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHNldHVwKSBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIGVycik7Ci0jaWYgMAotCWVsc2UgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKCVkKSBPSyAlZCBieXRlcyAoZW5kICVkKVxuIiwgX19mdW5jX18sCi0JCQlvdXRjb250X3VyYiwgdGhpc191cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQl1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSk7Ci0JfQotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggZTk3MjQxMi4uNzQyZDgyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmcG9ydC0+ZGV2LAotCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJCSIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwKIAkJCV9fZnVuY19fLCByZXR2YWwpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBjODhjYzQ5Li5kNzQ0MGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWVsc2UgewogCQlzdGF0dXMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc3RhdHVzX2J1Zik7CiAKLQkJZGV2X2luZm8oJnBvcnQtPnNlcmlhbC0+ZGV2LT5kZXYsICJyZWFkIHN0YXR1cyAleCAleCIsCisJCWRldl9pbmZvKCZwb3J0LT5zZXJpYWwtPmRldi0+ZGV2LCAicmVhZCBzdGF0dXMgJXggJXhcbiIsCiAJCQkgc3RhdHVzX2J1ZlswXSwgc3RhdHVzX2J1ZlsxXSk7CiAKIAkJKmxpbmVfc3RhdGVfcCA9IGtsc2lfMTA1X3N0YXR1czJsaW5lc3RhdGUoc3RhdHVzKTsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCQlwcml2LT5jZmcuYmF1ZHJhdGUgPSBrbDVrdXNiMTA1YV9zaW9fYjExNTIwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2RiZyhkZXYsICJLTFNJIFVTQi0+U2VyaWFsIGNvbnZlcnRlcjogdW5zdXBwb3J0ZWQgYmF1ZHJhdGUgcmVxdWVzdCwgdXNpbmcgZGVmYXVsdCBvZiA5NjAwIik7CisJCWRldl9kYmcoZGV2LCAidW5zdXBwb3J0ZWQgYmF1ZHJhdGUsIHVzaW5nIDk2MDBcbiIpOwogCQlwcml2LT5jZmcuYmF1ZHJhdGUgPSBrbDVrdXNiMTA1YV9zaW9fYjk2MDA7CiAJCWJhdWQgPSA5NjAwOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwppbmRleCA2MThjMWMxLi5mZWUyNDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCkBAIC01NTcsNyArNTU3LDggQEAKIAkJCSk7CiAKIAkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJIiVzIC0gU2VuZCByZXNldF9hbGxfcXVldWVzIChGTFVTSCkgVVJCIHJldHVybnM6ICVpIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCQkiJXMgLSBTZW5kIHJlc2V0X2FsbF9xdWV1ZXMgKEZMVVNIKSBVUkIgcmV0dXJuczogJWlcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJa2ZyZWUodHJhbnNmZXJfYnVmZmVyKTsKIAkJcmV0dXJuIChyZXN1bHQgPCAwKSA/IC1FSU86IDA7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCmluZGV4IDRlYjI3NzIuLmRmZDcyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCQkJICAgICBpbmRleCwgTlVMTCwgMCwgTU9TX1dEUl9USU1FT1VUKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZGV2X2VycigmdXNiZGV2LT5kZXYsCi0JCQkibW9zNzcyMDogdXNiX2NvbnRyb2xfbXNnKCkgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisJCQkibW9zNzcyMDogdXNiX2NvbnRyb2xfbXNnKCkgZmFpbGVkOiAlZFxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJKmRhdGEgPSAqYnVmOwogCWVsc2UgaWYgKHN0YXR1cyA8IDApCiAJCWRldl9lcnIoJnVzYmRldi0+ZGV2LAotCQkJIm1vczc3MjA6IHVzYl9jb250cm9sX21zZygpIGZhaWxlZDogJWQiLCBzdGF0dXMpOworCQkJIm1vczc3MjA6IHVzYl9jb250cm9sX21zZygpIGZhaWxlZDogJWRcbiIsIHN0YXR1cyk7CiAJa2ZyZWUoYnVmKTsKIAogCXJldHVybiBzdGF0dXM7CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJCSAgICAgICZtb3NfcGFycG9ydC0+ZGVmZXJyZWRfdXJicyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vc19wYXJwb3J0LT5saXN0bG9jaywgZmxhZ3MpOwogCQl0YXNrbGV0X3NjaGVkdWxlKCZtb3NfcGFycG9ydC0+dXJiX3Rhc2tsZXQpOwotCQlkZXZfZGJnKCZ1c2JkZXYtPmRldiwgInRhc2tsZXQgc2NoZWR1bGVkIik7CisJCWRldl9kYmcoJnVzYmRldi0+ZGV2LCAidGFza2xldCBzY2hlZHVsZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQxOCw3ICs0MTgsNyBAQAogCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAlpZiAocmV0X3ZhbCkgewogCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwKLQkJCSIlczogc3VibWl0X3VyYigpIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgcmV0X3ZhbCk7CisJCQkiJXM6IHN1Ym1pdF91cmIoKSBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmV0X3ZhbCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtb3NfcGFycG9ydC0+bGlzdGxvY2ssIGZsYWdzKTsKIAkJbGlzdF9kZWwoJnVyYnRyYWNrLT51cmJsaXN0X2VudHJ5KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9zX3BhcnBvcnQtPmxpc3Rsb2NrLCBmbGFncyk7CkBAIC02NTYsNyArNjU2LDcgQEAKIAlwYXJwb3J0X2VwaWxvZ3VlKHBwKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoJm1vc19wYXJwb3J0LT5zZXJpYWwtPmRldi0+ZGV2LAotCQkJIm1vczc3MjA6IHVzYl9idWxrX21zZygpIGZhaWxlZDogJWQiLCByZXR2YWwpOworCQkJIm1vczc3MjA6IHVzYl9idWxrX21zZygpIGZhaWxlZDogJWRcbiIsIHJldHZhbCk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gYWN0dWFsX2xlbjsKQEAgLTg3NSw3ICs4NzUsNyBAQAogCWlmICghKGlpciAmIDB4MDEpKSB7CS8qIHNlcmlhbCBwb3J0IGludGVycnVwdCBwZW5kaW5nICovCiAJCXN3aXRjaCAoaWlyICYgMHgwZikgewogCQljYXNlIFNFUklBTF9JSVJfUkxTOgotCQkJZGV2X2RiZyhkZXYsICJTZXJpYWwgUG9ydDogUmVjZWl2ZXIgc3RhdHVzIGVycm9yIG9yIGFkZHJlc3MgYml0IGRldGVjdGVkIGluIDktYml0IG1vZGVcblxuIik7CisJCQlkZXZfZGJnKGRldiwgIlNlcmlhbCBQb3J0OiBSZWNlaXZlciBzdGF0dXMgZXJyb3Igb3IgYWRkcmVzcyBiaXQgZGV0ZWN0ZWQgaW4gOS1iaXQgbW9kZVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBTRVJJQUxfSUlSX0NUSToKIAkJCWRldl9kYmcoZGV2LCAiU2VyaWFsIFBvcnQ6IFJlY2VpdmVyIHRpbWUgb3V0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IGU5ZDk2N2YuLjM5M2JlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtNTIyLDExICs1MjIsMTEgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiBUaGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAorCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93bjogJWRcbiIsCiAJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzOiAlZFxuIiwKIAkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3F1YXRlY2gyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYwppbmRleCA3NzI1ZWQyLi41MDRmNWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcXVhdGVjaDIuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJCQkJIGRldmljZV9wb3J0LCBkYXRhLCAyLCBRVDJfVVNCX1RJTUVPVVQpOwogCiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvcGVuIHBvcnQgZmFpbGVkICVpIiwgX19mdW5jX18sCisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3BlbiBwb3J0IGZhaWxlZCAlaVxuIiwgX19mdW5jX18sCiAJCQlzdGF0dXMpOwogCQlrZnJlZShkYXRhKTsKIAkJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCmluZGV4IDRlYzA0ZjcuLmVmMGRiZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwpAQCAtMjIwLDkgKzIyMCw5IEBACiAJCQkgICAgICBHRVRfVUFSVF9TVEFUVVMsIEdFVF9VQVJUX1NUQVRVU19UWVBFLAogCQkJICAgICAgMCwgR0VUX1VBUlRfU1RBVFVTX01TUiwgYnVmLCAxLCAxMDApOwogCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1vZGVtIHN0YXR1czogJWQiLCByZXQpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1vZGVtIHN0YXR1czogJWRcbiIsIHJldCk7CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIweGMwOjB4MjI6MDo2ICAlZCAtIDB4MDIleCIsIHJldCwgKmJ1Zik7CisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiMHhjMDoweDIyOjA6NiAgJWQgLSAweDAyJXhcbiIsIHJldCwgKmJ1Zik7CiAJKnN0YXR1cyA9ICpidWY7CiAJa2ZyZWUoYnVmKTsKIApAQCAtMzQyLDggKzM0Miw3IEBACiAJY2FzZSAxMDAwMDAwOgogCQkJYnVmWzBdID0gMHgwYjsJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAic3BjcDgyNSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgIgotCQkJImJhdWRyYXRlIHJlcXVlc3RlZCwgdXNpbmcgZGVmYXVsdCBvZiA5NjAwLlxuIik7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgInVuc3VwcG9ydGVkIGJhdWRyYXRlLCB1c2luZyA5NjAwXG4iKTsKIAl9CiAKIAkvKiBTZXQgRGF0YSBMZW5ndGggOiAwMDo1Yml0LCAwMTo2Yml0LCAxMDo3Yml0LCAxMTo4Yml0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMKaW5kZXggOWZhN2RkNC4uOGZjZWVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3N5bWJvbHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zeW1ib2xzZXJpYWwuYwpAQCAtNzQsOSArNzQsNyBAQAogCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKCZwb3J0LT5wb3J0LCAmZGF0YVsxXSwgZGF0YV9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCgmcG9ydC0+cG9ydCk7CiAJfSBlbHNlIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LAotCQkJIkltcHJvcGVyIGFtb3VudCBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZSwgIgotCQkJIiVkIGJ5dGVzIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzaG9ydCBwYWNrZXRcbiIsIF9fZnVuY19fKTsKIAl9CiAKIGV4aXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCBlYzdjZWE1Li4zZGQzZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCWludCBzdGF0dXM7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwKLQkJIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkIiwKKwkJIiVzIC0gcHJvZHVjdCAweCU0WCwgbnVtIGNvbmZpZ3VyYXRpb25zICVkLCBjb25maWd1cmF0aW9uIHZhbHVlICVkXG4iLAogCQlfX2Z1bmNfXywgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCiAJCWRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMsCiAJCWRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUpOwpAQCAtODAzLDcgKzgwMyw3IEBACiAJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsCi0JCSIlcyAtIEJhdWRSYXRlPSVkLCB3QmF1ZFJhdGU9JWQsIHdGbGFncz0weCUwNFgsIGJEYXRhQml0cz0lZCwgYlBhcml0eT0lZCwgYlN0b3BCaXRzPSVkLCBjWG9uPSVkLCBjWG9mZj0lZCwgYlVhcnRNb2RlPSVkIiwKKwkJIiVzIC0gQmF1ZFJhdGU9JWQsIHdCYXVkUmF0ZT0lZCwgd0ZsYWdzPTB4JTA0WCwgYkRhdGFCaXRzPSVkLCBiUGFyaXR5PSVkLCBiU3RvcEJpdHM9JWQsIGNYb249JWQsIGNYb2ZmPSVkLCBiVWFydE1vZGU9JWRcbiIsCiAJCV9fZnVuY19fLCBiYXVkLCBjb25maWctPndCYXVkUmF0ZSwgY29uZmlnLT53RmxhZ3MsCiAJCWNvbmZpZy0+YkRhdGFCaXRzLCBjb25maWctPmJQYXJpdHksIGNvbmZpZy0+YlN0b3BCaXRzLAogCQljb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYsIGNvbmZpZy0+YlVhcnRNb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IDdjOWRjMjguLjgxZmMwZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtODY4LDcgKzg2OCw3IEBACiAJbWF4X2VuZHBvaW50cyA9IG1heChtYXhfZW5kcG9pbnRzLCAoaW50KXNlcmlhbC0+bnVtX3BvcnRzKTsKIAlzZXJpYWwtPm51bV9wb3J0X3BvaW50ZXJzID0gbWF4X2VuZHBvaW50czsKIAotCWRldl9kYmcoZGRldiwgInNldHRpbmcgdXAgJWQgcG9ydCBzdHJ1Y3R1cmVzIGZvciB0aGlzIGRldmljZSIsIG1heF9lbmRwb2ludHMpOworCWRldl9kYmcoZGRldiwgInNldHRpbmcgdXAgJWQgcG9ydCBzdHJ1Y3R1cmUocylcbiIsIG1heF9lbmRwb2ludHMpOwogCWZvciAoaSA9IDA7IGkgPCBtYXhfZW5kcG9pbnRzOyArK2kpIHsKIAkJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwb3J0KQpAQCAtOTIzLDkgKzkyMyw4IEBACiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCWlmIChrZmlmb19hbGxvYygmcG9ydC0+d3JpdGVfZmlmbywgUEFHRV9TSVpFLCBHRlBfS0VSTkVMKSkKIAkJCWdvdG8gcHJvYmVfZXJyb3I7Ci0JCWJ1ZmZlcl9zaXplID0gc2VyaWFsLT50eXBlLT5idWxrX291dF9zaXplOwotCQlpZiAoIWJ1ZmZlcl9zaXplKQotCQkJYnVmZmVyX3NpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChlbmRwb2ludCk7CisJCWJ1ZmZlcl9zaXplID0gbWF4X3QoaW50LCBzZXJpYWwtPnR5cGUtPmJ1bGtfb3V0X3NpemUsCisJCQkJCQl1c2JfZW5kcG9pbnRfbWF4cChlbmRwb2ludCkpOwogCQlwb3J0LT5idWxrX291dF9zaXplID0gYnVmZmVyX3NpemU7CiAJCXBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCkBAIC0xMDM0LDcgKzEwMzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fcG9ydHM7ICsraSkgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwogCQlkZXZfc2V0X25hbWUoJnBvcnQtPmRldiwgInR0eVVTQiVkIiwgcG9ydC0+bWlub3IpOwotCQlkZXZfZGJnKGRkZXYsICJyZWdpc3RlcmluZyAlcyIsIGRldl9uYW1lKCZwb3J0LT5kZXYpKTsKKwkJZGV2X2RiZyhkZGV2LCAicmVnaXN0ZXJpbmcgJXNcbiIsIGRldl9uYW1lKCZwb3J0LT5kZXYpKTsKIAkJZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKCZwb3J0LT5kZXYpOwogCiAJCXJldHZhbCA9IGRldmljZV9hZGQoJnBvcnQtPmRldik7CkBAIC0xMTYxLDkgKzExNjAsOSBAQAogCXVzYl9zZXJpYWxfdW5wb2lzb25fcG9ydF91cmJzKHNlcmlhbCk7CiAKIAlzZXJpYWwtPnN1c3BlbmRpbmcgPSAwOwotCWlmIChzZXJpYWwtPnR5cGUtPnJlc2V0X3Jlc3VtZSkKKwlpZiAoc2VyaWFsLT50eXBlLT5yZXNldF9yZXN1bWUpIHsKIAkJcnYgPSBzZXJpYWwtPnR5cGUtPnJlc2V0X3Jlc3VtZShzZXJpYWwpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCXJ2ID0gLUVPUE5PVFNVUFA7CiAJCWludGYtPm5lZWRzX2JpbmRpbmcgPSAxOwogCX0KQEAgLTEzMzgsOSArMTMzNyw5IEBACiAJaWYgKHJldHZhbCkgewogCQlwcl9lcnIoInByb2JsZW0gJWQgd2hlbiByZWdpc3RlcmluZyBkcml2ZXIgJXNcbiIsIHJldHZhbCwgZHJpdmVyLT5kZXNjcmlwdGlvbik7CiAJCWxpc3RfZGVsKCZkcml2ZXItPmRyaXZlcl9saXN0KTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlwcl9pbmZvKCJVU0IgU2VyaWFsIHN1cHBvcnQgcmVnaXN0ZXJlZCBmb3IgJXNcbiIsIGRyaXZlci0+ZGVzY3JpcHRpb24pOwotCisJfQogCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwppbmRleCAxZGQwNjA0Li4xM2I1YmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogY29uZmlnIFVTQl9VQVMKIAl0cmlzdGF0ZSAiVVNCIEF0dGFjaGVkIFNDU0kiCi0JZGVwZW5kcyBvbiBTQ1NJICYmIEJST0tFTgorCWRlcGVuZHMgb24gU0NTSSAmJiBVU0JfU1RPUkFHRQogCWhlbHAKIAkgIFRoZSBVU0IgQXR0YWNoZWQgU0NTSSBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgc29tZSBVU0IKIAkgIHN0b3JhZ2UgZGV2aWNlcy4gIEl0IHBlcm1pdHMgaGlnaGVyIHBlcmZvcm1hbmNlIGJ5IHN1cHBvcnRpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLWRldGVjdC5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMtZGV0ZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwNWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLWRldGVjdC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CisjaW5jbHVkZSAidXNiLmgiCisKK3N0YXRpYyBpbnQgdWFzX2lzX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiAoaW50Zi0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX01BU1NfU1RPUkFHRSAmJgorCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfU0NfU0NTSSAmJgorCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfUFJfVUFTKTsKK30KKworc3RhdGljIGludCB1YXNfaXNudF9zdXBwb3J0ZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKKworCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJUaGUgZHJpdmVyIGZvciB0aGUgVVNCIGNvbnRyb2xsZXIgJXMgZG9lcyBub3QgIgorCQkJInN1cHBvcnQgc2NhdHRlci1nYXRoZXIgd2hpY2ggaXNcbiIsCisJCQloY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24pOworCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJyZXF1aXJlZCBieSB0aGUgVUFTIGRyaXZlci4gUGxlYXNlIHRyeSBhbiIKKwkJCSJhbHRlcm5hdGl2ZSBVU0IgY29udHJvbGxlciBpZiB5b3Ugd2lzaCB0byB1c2UgVUFTLlxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdWFzX2ZpbmRfdWFzX2FsdF9zZXR0aW5nKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCBpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgc2dfc3VwcG9ydGVkID0gdWRldi0+YnVzLT5zZ190YWJsZXNpemUgIT0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5udW1fYWx0c2V0dGluZzsgaSsrKSB7CisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9ICZpbnRmLT5hbHRzZXR0aW5nW2ldOworCisJCWlmICh1YXNfaXNfaW50ZXJmYWNlKGFsdCkpIHsKKwkJCWlmICghc2dfc3VwcG9ydGVkKQorCQkJCXJldHVybiB1YXNfaXNudF9zdXBwb3J0ZWQodWRldik7CisJCQlyZXR1cm4gYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdWFzX2ZpbmRfZW5kcG9pbnRzKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCwKKwkJCSAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXBzW10pCit7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCA9IGFsdC0+ZW5kcG9pbnQ7CisJdW5zaWduZWQgaSwgbl9lbmRwb2ludHMgPSBhbHQtPmRlc2MuYk51bUVuZHBvaW50czsKKworCWZvciAoaSA9IDA7IGkgPCBuX2VuZHBvaW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgKmV4dHJhID0gZW5kcG9pbnRbaV0uZXh0cmE7CisJCWludCBsZW4gPSBlbmRwb2ludFtpXS5leHRyYWxlbjsKKwkJd2hpbGUgKGxlbiA+PSAzKSB7CisJCQlpZiAoZXh0cmFbMV0gPT0gVVNCX0RUX1BJUEVfVVNBR0UpIHsKKwkJCQl1bnNpZ25lZCBwaXBlX2lkID0gZXh0cmFbMl07CisJCQkJaWYgKHBpcGVfaWQgPiAwICYmIHBpcGVfaWQgPCA1KQorCQkJCQllcHNbcGlwZV9pZCAtIDFdID0gJmVuZHBvaW50W2ldOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuIC09IGV4dHJhWzBdOworCQkJZXh0cmEgKz0gZXh0cmFbMF07CisJCX0KKwl9CisKKwlpZiAoIWVwc1swXSB8fCAhZXBzWzFdIHx8ICFlcHNbMl0gfHwgIWVwc1szXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1YXNfdXNlX3Vhc19kcml2ZXIoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcHNbNF0gPSB7IH07CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKHVkZXYtPmJ1cyk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IGlkLT5kcml2ZXJfaW5mbzsKKwlpbnQgciwgYWx0OworCisJdXNiX3N0b3JfYWRqdXN0X3F1aXJrcyh1ZGV2LCAmZmxhZ3MpOworCisJaWYgKGZsYWdzICYgVVNfRkxfSUdOT1JFX1VBUykKKwkJcmV0dXJuIDA7CisKKwlpZiAodWRldi0+c3BlZWQgPj0gVVNCX1NQRUVEX1NVUEVSICYmICFoY2QtPmNhbl9kb19zdHJlYW1zKQorCQlyZXR1cm4gMDsKKworCWFsdCA9IHVhc19maW5kX3Vhc19hbHRfc2V0dGluZyhpbnRmKTsKKwlpZiAoYWx0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyID0gdWFzX2ZpbmRfZW5kcG9pbnRzKCZpbnRmLT5hbHRzZXR0aW5nW2FsdF0sIGVwcyk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLmMKaW5kZXggZDk2NmI1OS4uYTdhYzk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Vhcy5jCkBAIC0yLDYgKzIsNyBAQAogICogVVNCIEF0dGFjaGVkIFNDU0kKICAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgVVNCIE1hc3MgU3RvcmFnZSBkcml2ZXIKICAqCisgKiBDb3B5cmlnaHQgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4gZm9yIFJlZCBIYXQsIEluYy4gMjAxMwogICogQ29weXJpZ2h0IE1hdHRoZXcgV2lsY294IGZvciBJbnRlbCBDb3JwLCAyMDEwCiAgKiBDb3B5cmlnaHQgU2FyYWggU2hhcnAgZm9yIEludGVsIENvcnAsIDIwMTAKICAqCkBAIC0xMywxNyArMTQsMjEgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl91c3VhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc3RvcmFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi91YXMuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAorI2luY2x1ZGUgInVhcy1kZXRlY3QuaCIKKwogLyoKICAqIFRoZSByMDAtcjAxYyBzcGVjcyBkZWZpbmUgdGhpcyB2ZXJzaW9uIG9mIHRoZSBTRU5TRSBJVSBkYXRhIHN0cnVjdHVyZS4KICAqIEl0J3Mgc3RpbGwgaW4gdXNlIGJ5IHNldmVyYWwgZGlmZmVyZW50IGZpcm13YXJlIHJlbGVhc2VzLgpAQCAtNDUsMTIgKzUwLDE3IEBACiAJc3RydWN0IHVzYl9hbmNob3Igc2Vuc2VfdXJiczsKIAlzdHJ1Y3QgdXNiX2FuY2hvciBkYXRhX3VyYnM7CiAJaW50IHFkZXB0aCwgcmVzZXR0aW5nOwotCXN0cnVjdCByZXNwb25zZV91aSByZXNwb25zZTsKKwlzdHJ1Y3QgcmVzcG9uc2VfaXUgcmVzcG9uc2U7CiAJdW5zaWduZWQgY21kX3BpcGUsIHN0YXR1c19waXBlLCBkYXRhX2luX3BpcGUsIGRhdGFfb3V0X3BpcGU7CiAJdW5zaWduZWQgdXNlX3N0cmVhbXM6MTsKIAl1bnNpZ25lZCB1YXNfc2Vuc2Vfb2xkOjE7CisJdW5zaWduZWQgcnVubmluZ190YXNrOjE7CisJdW5zaWduZWQgc2h1dGRvd246MTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kOwogCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGluZmxpZ2h0X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkZWFkX2xpc3Q7CiB9OwogCiBlbnVtIHsKQEAgLTg1LDEwMyArOTUsMTE3IEBACiAJCQkJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywgZ2ZwX3QgZ2ZwKTsKIHN0YXRpYyB2b2lkIHVhc19kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgaW50IHVhc190cnlfY29tcGxldGUoc3RydWN0IHNjc2lfY21uZCAqY21uZCwgY29uc3QgY2hhciAqY2FsbGVyKTsKK3N0YXRpYyB2b2lkIHVhc19mcmVlX3N0cmVhbXMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCB1YXNfbG9nX2NtZF9zdGF0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kLCBjb25zdCBjaGFyICpjYWxsZXIpOwogCi1zdGF0aWMgREVDTEFSRV9XT1JLKHVhc193b3JrLCB1YXNfZG9fd29yayk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVhc193b3JrX2xvY2spOwotc3RhdGljIExJU1RfSEVBRCh1YXNfd29ya19saXN0KTsKLQorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBkZXZpbmZvLT5sb2NrIGhlbGQsIHdpbGwgdGVtcG9yYXJ5IHVubG9jayB0aGUgbG9jayAqLwogc3RhdGljIHZvaWQgdWFzX3VubGlua19kYXRhX3VyYnMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywKLQkJCQkgc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbykKKwkJCQkgc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbywKKwkJCQkgdW5zaWduZWQgbG9uZyAqbG9ja19mbGFncykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyoKIAkgKiBUaGUgVU5MSU5LX0RBVEFfVVJCUyBmbGFnIG1ha2VzIHN1cmUgdWFzX3RyeV9jb21wbGV0ZQogCSAqIChjYWxsZWQgYnkgdXJiIGNvbXBsZXRpb24pIGRvZXNuJ3QgcmVsZWFzZSBjbWRpbmZvCiAJICogdW5kZXJuZWF0aCB1cy4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCWNtZGluZm8tPnN0YXRlIHw9IFVOTElOS19EQVRBX1VSQlM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssICpsb2NrX2ZsYWdzKTsKIAogCWlmIChjbWRpbmZvLT5kYXRhX2luX3VyYikKIAkJdXNiX3VubGlua191cmIoY21kaW5mby0+ZGF0YV9pbl91cmIpOwogCWlmIChjbWRpbmZvLT5kYXRhX291dF91cmIpCiAJCXVzYl91bmxpbmtfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCAqbG9ja19mbGFncyk7CiAJY21kaW5mby0+c3RhdGUgJj0gflVOTElOS19EQVRBX1VSQlM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB1YXNfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdWFzX2Rldl9pbmZvLCB3b3JrKTsKIAlzdHJ1Y3QgdWFzX2NtZF9pbmZvICpjbWRpbmZvOwotCXN0cnVjdCB1YXNfY21kX2luZm8gKnRlbXA7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAotCXNwaW5fbG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCWxpc3RfcmVwbGFjZV9pbml0KCZ1YXNfd29ya19saXN0LCAmbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmbGlzdCwgbGlzdCkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWRpbmZvLCAmZGV2aW5mby0+aW5mbGlnaHRfbGlzdCwgbGlzdCkgewogCQlzdHJ1Y3Qgc2NzaV9wb2ludGVyICpzY3AgPSAodm9pZCAqKWNtZGluZm87Ci0JCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLAotCQkJCQkJCXN0cnVjdCBzY3NpX2NtbmQsIFNDcCk7Ci0JCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAodm9pZCAqKWNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWVyciA9IHVhc19zdWJtaXRfdXJicyhjbW5kLCBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhLCBHRlBfQVRPTUlDKTsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IGNvbnRhaW5lcl9vZihzY3AsIHN0cnVjdCBzY3NpX2NtbmQsCisJCQkJCQkgICAgICBTQ3ApOworCisJCWlmICghKGNtZGluZm8tPnN0YXRlICYgSVNfSU5fV09SS19MSVNUKSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IHVhc19zdWJtaXRfdXJicyhjbW5kLCBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhLCBHRlBfTk9JTyk7CiAJCWlmICghZXJyKQogCQkJY21kaW5mby0+c3RhdGUgJj0gfklTX0lOX1dPUktfTElTVDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCQlpZiAoZXJyKSB7Ci0JCQlsaXN0X2RlbCgmY21kaW5mby0+bGlzdCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZ1YXNfd29ya19saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmdWFzX3dvcmtfbG9jayk7Ci0JCQlzY2hlZHVsZV93b3JrKCZ1YXNfd29yayk7Ci0JCX0KKwkJZWxzZQorCQkJc2NoZWR1bGVfd29yaygmZGV2aW5mby0+d29yayk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgdWFzX2Fib3J0X3dvcmsoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKK3N0YXRpYyB2b2lkIHVhc19tYXJrX2NtZF9kZWFkKHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8sCisJCQkgICAgICBzdHJ1Y3QgdWFzX2NtZF9pbmZvICpjbWRpbmZvLAorCQkJICAgICAgaW50IHJlc3VsdCwgY29uc3QgY2hhciAqY2FsbGVyKQoreworCXN0cnVjdCBzY3NpX3BvaW50ZXIgKnNjcCA9ICh2b2lkICopY21kaW5mbzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gY29udGFpbmVyX29mKHNjcCwgc3RydWN0IHNjc2lfY21uZCwgU0NwKTsKKworCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIGNhbGxlcik7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOworCVdBUk5fT05fT05DRShjbWRpbmZvLT5zdGF0ZSAmIENPTU1BTkRfQUJPUlRFRCk7CisJY21kaW5mby0+c3RhdGUgfD0gQ09NTUFORF9BQk9SVEVEOworCWNtZGluZm8tPnN0YXRlICY9IH5JU19JTl9XT1JLX0xJU1Q7CisJY21uZC0+cmVzdWx0ID0gcmVzdWx0IDw8IDE2OworCWxpc3RfbW92ZV90YWlsKCZjbWRpbmZvLT5saXN0LCAmZGV2aW5mby0+ZGVhZF9saXN0KTsKK30KKworc3RhdGljIHZvaWQgdWFzX2Fib3J0X2luZmxpZ2h0KHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8sIGludCByZXN1bHQsCisJCQkgICAgICAgY29uc3QgY2hhciAqY2FsbGVyKQogewogCXN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm87CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqdGVtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCWxpc3RfcmVwbGFjZV9pbml0KCZ1YXNfd29ya19saXN0LCAmbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1YXNfd29ya19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmZGV2aW5mby0+aW5mbGlnaHRfbGlzdCwgbGlzdCkKKwkJdWFzX21hcmtfY21kX2RlYWQoZGV2aW5mbywgY21kaW5mbywgcmVzdWx0LCBjYWxsZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdWFzX2FkZF93b3JrKHN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm8pCit7CisJc3RydWN0IHNjc2lfcG9pbnRlciAqc2NwID0gKHZvaWQgKiljbWRpbmZvOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBTQ3ApOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOworCWNtZGluZm8tPnN0YXRlIHw9IElTX0lOX1dPUktfTElTVDsKKwlzY2hlZHVsZV93b3JrKCZkZXZpbmZvLT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgdWFzX3phcF9kZWFkKHN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8pCit7CisJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbzsKKwlzdHJ1Y3QgdWFzX2NtZF9pbmZvICp0ZW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWRpbmZvLCB0ZW1wLCAmZGV2aW5mby0+ZGVhZF9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBzY3NpX3BvaW50ZXIgKnNjcCA9ICh2b2lkICopY21kaW5mbzsKLQkJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IGNvbnRhaW5lcl9vZihzY3AsCi0JCQkJCQkJc3RydWN0IHNjc2lfY21uZCwgU0NwKTsKLQkJc3RydWN0IHVhc19kZXZfaW5mbyAqZGkgPSAodm9pZCAqKWNtbmQtPmRldmljZS0+aG9zdGRhdGE7Ci0KLQkJaWYgKGRpID09IGRldmluZm8pIHsKLQkJCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQUJPUlRFRDsKLQkJCWNtZGluZm8tPnN0YXRlICY9IH5JU19JTl9XT1JLX0xJU1Q7Ci0JCQlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7Ci0JCQkJLyogdWFzX3N0YXRfY21wbHQoKSB3aWxsIG5vdCBkbyB0aGF0Ci0JCQkJICogd2hlbiBhIGRldmljZSByZXNldCBpcyBpbgotCQkJCSAqIHByb2dyZXNzICovCi0JCQkJY21kaW5mby0+c3RhdGUgJj0gfkNPTU1BTkRfSU5GTElHSFQ7Ci0JCQl9Ci0JCQl1YXNfdHJ5X2NvbXBsZXRlKGNtbmQsIF9fZnVuY19fKTsKLQkJfSBlbHNlIHsKLQkJCS8qIG5vdCBvdXIgdWFzIGRldmljZSwgcmVsaW5rIGludG8gbGlzdCAqLwotCQkJbGlzdF9kZWwoJmNtZGluZm8tPmxpc3QpOwotCQkJc3Bpbl9sb2NrX2lycSgmdWFzX3dvcmtfbG9jayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZjbWRpbmZvLT5saXN0LCAmdWFzX3dvcmtfbGlzdCk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnVhc193b3JrX2xvY2spOwotCQl9CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSBjb250YWluZXJfb2Yoc2NwLCBzdHJ1Y3Qgc2NzaV9jbW5kLAorCQkJCQkJICAgICAgU0NwKTsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlXQVJOX09OX09OQ0UoIShjbWRpbmZvLT5zdGF0ZSAmIENPTU1BTkRfQUJPUlRFRCkpOworCQkvKiBhbGwgdXJicyBhcmUga2lsbGVkLCBjbGVhciBpbmZsaWdodCBiaXRzICovCisJCWNtZGluZm8tPnN0YXRlICY9IH4oQ09NTUFORF9JTkZMSUdIVCB8CisJCQkJICAgIERBVEFfSU5fVVJCX0lORkxJR0hUIHwKKwkJCQkgICAgREFUQV9PVVRfVVJCX0lORkxJR0hUKTsKKwkJdWFzX3RyeV9jb21wbGV0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJfQorCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC0yNTksMjAgKzI4MywxOSBAQAogCXN0cnVjdCB1YXNfY21kX2luZm8gKmNtZGluZm8gPSAodm9pZCAqKSZjbW5kLT5TQ3A7CiAJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9ICh2b2lkICopY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZkZXZpbmZvLT5sb2NrKSk7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOwogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIChDT01NQU5EX0lORkxJR0hUIHwKIAkJCSAgICAgIERBVEFfSU5fVVJCX0lORkxJR0hUIHwKIAkJCSAgICAgIERBVEFfT1VUX1VSQl9JTkZMSUdIVCB8CiAJCQkgICAgICBVTkxJTktfREFUQV9VUkJTKSkKIAkJcmV0dXJuIC1FQlVTWTsKLQlCVUdfT04oY21kaW5mby0+c3RhdGUgJiBDT01NQU5EX0NPTVBMRVRFRCk7CisJV0FSTl9PTl9PTkNFKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9DT01QTEVURUQpOwogCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQ09NUExFVEVEOwogCXVzYl9mcmVlX3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYik7CiAJdXNiX2ZyZWVfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7Ci0JaWYgKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9BQk9SVEVEKSB7CisJaWYgKGNtZGluZm8tPnN0YXRlICYgQ09NTUFORF9BQk9SVEVEKQogCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsICJhYm9ydCBjb21wbGV0ZWRcbiIpOwotCQljbW5kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JfQorCWxpc3RfZGVsKCZjbWRpbmZvLT5saXN0KTsKIAljbW5kLT5zY3NpX2RvbmUoY21uZCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yODYsMTEgKzMwOSw3IEBACiAJY21kaW5mby0+c3RhdGUgfD0gZGlyZWN0aW9uIHwgU1VCTUlUX1NUQVRVU19VUkI7CiAJZXJyID0gdWFzX3N1Ym1pdF91cmJzKGNtbmQsIGNtbmQtPmRldmljZS0+aG9zdGRhdGEsIEdGUF9BVE9NSUMpOwogCWlmIChlcnIpIHsKLQkJc3Bpbl9sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmY21kaW5mby0+bGlzdCwgJnVhc193b3JrX2xpc3QpOwotCQljbWRpbmZvLT5zdGF0ZSB8PSBJU19JTl9XT1JLX0xJU1Q7Ci0JCXNwaW5fdW5sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJc2NoZWR1bGVfd29yaygmdWFzX3dvcmspOworCQl1YXNfYWRkX3dvcmsoY21kaW5mbyk7CiAJfQogfQogCkBAIC0yOTgsMTQgKzMxNywyMCBAQAogewogCXN0cnVjdCBpdSAqaXUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHZvaWQgKilzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQ7CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiB0YWc7CiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIlVSQiBCQUQgU1RBVFVTICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAic3RhdCB1cmI6IGtpbGxlZCwgc3RyZWFtICVkXG4iLAorCQkJCXVyYi0+c3RyZWFtX2lkKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJzdGF0IHVyYjogc3RhdHVzICVkXG4iLAorCQkJCXVyYi0+c3RhdHVzKTsKKwkJfQogCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMyNCw2ICszNDksOSBAQAogCiAJaWYgKCFjbW5kKSB7CiAJCWlmIChpdS0+aXVfaWQgPT0gSVVfSURfUkVTUE9OU0UpIHsKKwkJCWlmICghZGV2aW5mby0+cnVubmluZ190YXNrKQorCQkJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LAorCQkJCSAgICAic3RhdCB1cmI6IHJlY3YgdW5leHBlY3RlZCByZXNwb25zZSBpdVxuIik7CiAJCQkvKiBzdG9yZSByZXN1bHRzIGZvciB1YXNfZWhfdGFza19tZ210KCkgKi8KIAkJCW1lbWNweSgmZGV2aW5mby0+cmVzcG9uc2UsIGl1LCBzaXplb2YoZGV2aW5mby0+cmVzcG9uc2UpKTsKIAkJfQpAQCAtMzQ2LDE3ICszNzQsMjUgQEAKIAkJCXVhc19zZW5zZSh1cmIsIGNtbmQpOwogCQlpZiAoY21uZC0+cmVzdWx0ICE9IDApIHsKIAkJCS8qIGNhbmNlbCBkYXRhIHRyYW5zZmVycyBvbiBlcnJvciAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCQkJdWFzX3VubGlua19kYXRhX3VyYnMoZGV2aW5mbywgY21kaW5mbyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQkJdWFzX3VubGlua19kYXRhX3VyYnMoZGV2aW5mbywgY21kaW5mbywgJmZsYWdzKTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+Q09NTUFORF9JTkZMSUdIVDsKIAkJdWFzX3RyeV9jb21wbGV0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSVVfSURfUkVBRF9SRUFEWToKKwkJaWYgKCFjbWRpbmZvLT5kYXRhX2luX3VyYiB8fAorCQkJCShjbWRpbmZvLT5zdGF0ZSAmIERBVEFfSU5fVVJCX0lORkxJR0hUKSkgeworCQkJc2NtZF9wcmludGsoS0VSTl9FUlIsIGNtbmQsICJ1bmV4cGVjdGVkIHJlYWQgcmR5XG4iKTsKKwkJCWJyZWFrOworCQl9CiAJCXVhc194ZmVyX2RhdGEodXJiLCBjbW5kLCBTVUJNSVRfREFUQV9JTl9VUkIpOwogCQlicmVhazsKIAljYXNlIElVX0lEX1dSSVRFX1JFQURZOgorCQlpZiAoIWNtZGluZm8tPmRhdGFfb3V0X3VyYiB8fAorCQkJCShjbWRpbmZvLT5zdGF0ZSAmIERBVEFfT1VUX1VSQl9JTkZMSUdIVCkpIHsKKwkJCXNjbWRfcHJpbnRrKEtFUk5fRVJSLCBjbW5kLCAidW5leHBlY3RlZCB3cml0ZSByZHlcbiIpOworCQkJYnJlYWs7CisJCX0KIAkJdWFzX3hmZXJfZGF0YSh1cmIsIGNtbmQsIFNVQk1JVF9EQVRBX09VVF9VUkIpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzgzLDggKzQxOSwxNSBAQAogCQlzZGIgPSBzY3NpX291dChjbW5kKTsKIAkJY21kaW5mby0+c3RhdGUgJj0gfkRBVEFfT1VUX1VSQl9JTkZMSUdIVDsKIAl9Ci0JQlVHX09OKHNkYiA9PSBOVUxMKTsKLQlpZiAodXJiLT5zdGF0dXMpIHsKKwlpZiAoc2RiID09IE5VTEwpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCX0gZWxzZSBpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKSB7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CisJCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21uZCwKKwkJCQkiZGF0YSBjbXBsdCBlcnIgJWQgc3RyZWFtICVkXG4iLAorCQkJCXVyYi0+c3RhdHVzLCB1cmItPnN0cmVhbV9pZCk7CisJCX0KIAkJLyogZXJyb3I6IG5vIGRhdGEgdHJhbnNmZXJlZCAqLwogCQlzZGItPnJlc2lkID0gc2RiLT5sZW5ndGg7CiAJfSBlbHNlIHsKQEAgLTM5NCw2ICs0MzcsMTcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIHVhc19jbWRfY21wbHQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSB1cmItPmNvbnRleHQ7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgY21uZCwgImNtZCBjbXBsdCBlcnIgJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwl9CisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXJiICp1YXNfYWxsb2NfZGF0YV91cmIoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbywgZ2ZwX3QgZ2ZwLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBwaXBlLCB1MTYgc3RyZWFtX2lkLAogCQkJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsCkBAIC00MDgsOCArNDYyLDcgQEAKIAkJZ290byBvdXQ7CiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1ZGV2LCBwaXBlLCBOVUxMLCBzZGItPmxlbmd0aCwKIAkJCSAgdWFzX2RhdGFfY21wbHQsIGNtbmQpOwotCWlmIChkZXZpbmZvLT51c2Vfc3RyZWFtcykKLQkJdXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisJdXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CiAJdXJiLT5udW1fc2dzID0gdWRldi0+YnVzLT5zZ190YWJsZXNpemUgPyBzZGItPnRhYmxlLm5lbnRzIDogMDsKIAl1cmItPnNnID0gc2RiLT50YWJsZS5zZ2w7CiAgb3V0OgpAQCAtNDQyLDcgKzQ5NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXJiICp1YXNfYWxsb2NfY21kX3VyYihzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvLCBnZnBfdCBnZnAsCi0JCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsIHUxNiBzdHJlYW1faWQpCisJCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkZXZpbmZvLT51ZGV2OwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtbmQtPmRldmljZTsKQEAgLTQ3Miw3ICs1MjUsNyBAQAogCW1lbWNweShpdS0+Y2RiLCBjbW5kLT5jbW5kLCBjbW5kLT5jbWRfbGVuKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdWRldiwgZGV2aW5mby0+Y21kX3BpcGUsIGl1LCBzaXplb2YoKml1KSArIGxlbiwKLQkJCQkJCQl1c2JfZnJlZV91cmIsIE5VTEwpOworCQkJCQkJCXVhc19jbWRfY21wbHQsIGNtbmQpOwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0ZSRUVfQlVGRkVSOwogIG91dDoKIAlyZXR1cm4gdXJiOwpAQCAtNTEyLDEzICs1NjUsMTcgQEAKIAl9CiAKIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVkZXYsIGRldmluZm8tPmNtZF9waXBlLCBpdSwgc2l6ZW9mKCppdSksCi0JCQkgIHVzYl9mcmVlX3VyYiwgTlVMTCk7CisJCQkgIHVhc19jbWRfY21wbHQsIGNtbmQpOwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0ZSRUVfQlVGRkVSOwogCi0JZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBnZnApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwogCXVzYl9hbmNob3JfdXJiKHVyYiwgJmRldmluZm8tPmNtZF91cmJzKTsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIGdmcCk7CisJaWYgKGVycikgeworCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7CisJCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIF9fZnVuY19fKTsKKwkJc2NtZF9wcmludGsoS0VSTl9FUlIsIGNtbmQsICJ0YXNrIHN1Ym1pc3Npb24gZXJyICVkXG4iLCBlcnIpOworCQlnb3RvIGVycjsKKwl9CiAKIAlyZXR1cm4gMDsKIApAQCAtNTMzLDM4ICs1OTAsNDMgQEAKICAqIGRhZnQgdG8gbWUuCiAgKi8KIAotc3RhdGljIGludCB1YXNfc3VibWl0X3NlbnNlX3VyYihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCQlnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBzdHJlYW0pCitzdGF0aWMgc3RydWN0IHVyYiAqdWFzX3N1Ym1pdF9zZW5zZV91cmIoc3RydWN0IHNjc2lfY21uZCAqY21uZCwKKwkJCQkJZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgc3RyZWFtKQogewotCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAodm9pZCAqKXNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IHVyYiAqdXJiOworCWludCBlcnI7CiAKIAl1cmIgPSB1YXNfYWxsb2Nfc2Vuc2VfdXJiKGRldmluZm8sIGdmcCwgc2hvc3QsIHN0cmVhbSk7CiAJaWYgKCF1cmIpCi0JCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKHVyYiwgZ2ZwKSkgewotCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKLQkJCSAgICAgInNlbnNlIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOwotCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKLQl9CisJCXJldHVybiBOVUxMOwogCXVzYl9hbmNob3JfdXJiKHVyYiwgJmRldmluZm8tPnNlbnNlX3VyYnMpOwotCXJldHVybiAwOworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgZ2ZwKTsKKwlpZiAoZXJyKSB7CisJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKKwkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOworCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKKwkJCSAgICAgInNlbnNlIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkIHN0cmVhbSAlZFxuIiwKKwkJCSAgICAgZXJyLCBzdHJlYW0pOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB1cmI7CiB9CiAKIHN0YXRpYyBpbnQgdWFzX3N1Ym1pdF91cmJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsCiAJCQkgICBzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHVhc19jbWRfaW5mbyAqY21kaW5mbyA9ICh2b2lkICopJmNtbmQtPlNDcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAJaW50IGVycjsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZkZXZpbmZvLT5sb2NrKSk7CisJV0FSTl9PTl9PTkNFKCFzcGluX2lzX2xvY2tlZCgmZGV2aW5mby0+bG9jaykpOwogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9TVEFUVVNfVVJCKSB7Ci0JCWVyciA9IHVhc19zdWJtaXRfc2Vuc2VfdXJiKGNtbmQtPmRldmljZS0+aG9zdCwgZ2ZwLAotCQkJCQkgICBjbWRpbmZvLT5zdHJlYW0pOwotCQlpZiAoZXJyKSB7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCXVyYiA9IHVhc19zdWJtaXRfc2Vuc2VfdXJiKGNtbmQsIGdmcCwgY21kaW5mby0+c3RyZWFtKTsKKwkJaWYgKCF1cmIpCisJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX1NUQVRVU19VUkI7CiAJfQogCkBAIC01NzgsMTQgKzY0MCwxOCBAQAogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9EQVRBX0lOX1VSQikgewotCQlpZiAodXNiX3N1Ym1pdF91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsIGdmcCkpIHsKKwkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYiwgZ2ZwKTsKKwkJaWYgKGVycikgeworCQkJdXNiX3VuYW5jaG9yX3VyYihjbWRpbmZvLT5kYXRhX2luX3VyYik7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsCi0JCQkJCSJkYXRhIGluIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOworCQkJCSJkYXRhIGluIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkIHN0cmVhbSAlZFxuIiwKKwkJCQllcnIsIGNtZGluZm8tPmRhdGFfaW5fdXJiLT5zdHJlYW1faWQpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX0RBVEFfSU5fVVJCOwogCQljbWRpbmZvLT5zdGF0ZSB8PSBEQVRBX0lOX1VSQl9JTkZMSUdIVDsKLQkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9pbl91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIEFMTE9DX0RBVEFfT1VUX1VSQikgewpAQCAtNTk4LDMzICs2NjQsMzcgQEAKIAl9CiAKIAlpZiAoY21kaW5mby0+c3RhdGUgJiBTVUJNSVRfREFUQV9PVVRfVVJCKSB7Ci0JCWlmICh1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5kYXRhX291dF91cmIsIGdmcCkpIHsKKwkJdXNiX2FuY2hvcl91cmIoY21kaW5mby0+ZGF0YV9vdXRfdXJiLCAmZGV2aW5mby0+ZGF0YV91cmJzKTsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIoY21kaW5mby0+ZGF0YV9vdXRfdXJiLCBnZnApOworCQlpZiAoZXJyKSB7CisJCQl1c2JfdW5hbmNob3JfdXJiKGNtZGluZm8tPmRhdGFfb3V0X3VyYik7CisJCQl1YXNfbG9nX2NtZF9zdGF0ZShjbW5kLCBfX2Z1bmNfXyk7CiAJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtbmQsCi0JCQkJCSJkYXRhIG91dCB1cmIgc3VibWlzc2lvbiBmYWlsdXJlXG4iKTsKKwkJCQkiZGF0YSBvdXQgdXJiIHN1Ym1pc3Npb24gZXJyb3IgJWQgc3RyZWFtICVkXG4iLAorCQkJCWVyciwgY21kaW5mby0+ZGF0YV9vdXRfdXJiLT5zdHJlYW1faWQpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQogCQljbWRpbmZvLT5zdGF0ZSAmPSB+U1VCTUlUX0RBVEFfT1VUX1VSQjsKIAkJY21kaW5mby0+c3RhdGUgfD0gREFUQV9PVVRfVVJCX0lORkxJR0hUOwotCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5kYXRhX291dF91cmIsICZkZXZpbmZvLT5kYXRhX3VyYnMpOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIEFMTE9DX0NNRF9VUkIpIHsKLQkJY21kaW5mby0+Y21kX3VyYiA9IHVhc19hbGxvY19jbWRfdXJiKGRldmluZm8sIGdmcCwgY21uZCwKLQkJCQkJCSAgICAgY21kaW5mby0+c3RyZWFtKTsKKwkJY21kaW5mby0+Y21kX3VyYiA9IHVhc19hbGxvY19jbWRfdXJiKGRldmluZm8sIGdmcCwgY21uZCk7CiAJCWlmICghY21kaW5mby0+Y21kX3VyYikKIAkJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiAJCWNtZGluZm8tPnN0YXRlICY9IH5BTExPQ19DTURfVVJCOwogCX0KIAogCWlmIChjbWRpbmZvLT5zdGF0ZSAmIFNVQk1JVF9DTURfVVJCKSB7Ci0JCXVzYl9nZXRfdXJiKGNtZGluZm8tPmNtZF91cmIpOwotCQlpZiAodXNiX3N1Ym1pdF91cmIoY21kaW5mby0+Y21kX3VyYiwgZ2ZwKSkgeworCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5jbWRfdXJiLCAmZGV2aW5mby0+Y21kX3VyYnMpOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjbWRpbmZvLT5jbWRfdXJiLCBnZnApOworCQlpZiAoZXJyKSB7CisJCQl1c2JfdW5hbmNob3JfdXJiKGNtZGluZm8tPmNtZF91cmIpOworCQkJdWFzX2xvZ19jbWRfc3RhdGUoY21uZCwgX19mdW5jX18pOwogCQkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbW5kLAotCQkJCQkiY21kIHVyYiBzdWJtaXNzaW9uIGZhaWx1cmVcbiIpOworCQkJCSAgICAiY21kIHVyYiBzdWJtaXNzaW9uIGVycm9yICVkXG4iLCBlcnIpOwogCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKIAkJfQotCQl1c2JfYW5jaG9yX3VyYihjbWRpbmZvLT5jbWRfdXJiLCAmZGV2aW5mby0+Y21kX3VyYnMpOwotCQl1c2JfcHV0X3VyYihjbWRpbmZvLT5jbWRfdXJiKTsKIAkJY21kaW5mby0+Y21kX3VyYiA9IE5VTEw7CiAJCWNtZGluZm8tPnN0YXRlICY9IH5TVUJNSVRfQ01EX1VSQjsKIAkJY21kaW5mby0+c3RhdGUgfD0gQ09NTUFORF9JTkZMSUdIVDsKQEAgLTY0NCwxOCArNzE0LDIyIEBACiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCB1YXNfY21kX2luZm8pID4gc2l6ZW9mKHN0cnVjdCBzY3NpX3BvaW50ZXIpKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisKIAlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7CiAJCWNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKIAkJY21uZC0+c2NzaV9kb25lKGNtbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRldmluZm8tPmNtbmQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCX0KIAorCW1lbXNldChjbWRpbmZvLCAwLCBzaXplb2YoKmNtZGluZm8pKTsKKwogCWlmIChibGtfcnFfdGFnZ2VkKGNtbmQtPnJlcXVlc3QpKSB7CiAJCWNtZGluZm8tPnN0cmVhbSA9IGNtbmQtPnJlcXVlc3QtPnRhZyArIDI7CiAJfSBlbHNlIHsKQEAgLTY5MiwxMyArNzY2LDEwIEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogCQl9Ci0JCXNwaW5fbG9jaygmdWFzX3dvcmtfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZ1YXNfd29ya19saXN0KTsKLQkJY21kaW5mby0+c3RhdGUgfD0gSVNfSU5fV09SS19MSVNUOwotCQlzcGluX3VubG9jaygmdWFzX3dvcmtfbG9jayk7Ci0JCXNjaGVkdWxlX3dvcmsoJnVhc193b3JrKTsKKwkJdWFzX2FkZF93b3JrKGNtZGluZm8pOwogCX0KIAorCWxpc3RfYWRkX3RhaWwoJmNtZGluZm8tPmxpc3QsICZkZXZpbmZvLT5pbmZsaWdodF9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MDksNDYgKzc4MCw3OCBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lLCB1OCBmdW5jdGlvbikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKLQlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHZvaWQgKilzaG9zdC0+aG9zdGRhdGFbMF07Ci0JdTE2IHRhZyA9IGRldmluZm8tPnFkZXB0aCAtIDE7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOworCXUxNiB0YWcgPSBkZXZpbmZvLT5xZGVwdGg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXJiICpzZW5zZV91cmI7CisJaW50IHJlc3VsdCA9IFNVQ0NFU1M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCW1lbXNldCgmZGV2aW5mby0+cmVzcG9uc2UsIDAsIHNpemVvZihkZXZpbmZvLT5yZXNwb25zZSkpOwotCWlmICh1YXNfc3VibWl0X3NlbnNlX3VyYihzaG9zdCwgR0ZQX0FUT01JQywgdGFnKSkgeworCisJaWYgKGRldmluZm8tPnJlc2V0dGluZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKGRldmluZm8tPnJ1bm5pbmdfdGFzaykgewogCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwKLQkJCSAgICAgIiVzOiAlczogc3VibWl0IHNlbnNlIHVyYiBmYWlsZWRcbiIsCisJCQkgICAgICIlczogJXM6IGVycm9yIGFscmVhZHkgcnVubmluZyBhIHRhc2tcbiIsCiAJCQkgICAgIF9fZnVuY19fLCBmbmFtZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9Ci0JaWYgKHVhc19zdWJtaXRfdGFza191cmIoY21uZCwgR0ZQX0FUT01JQywgZnVuY3Rpb24sIHRhZykpIHsKKworCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDE7CisJbWVtc2V0KCZkZXZpbmZvLT5yZXNwb25zZSwgMCwgc2l6ZW9mKGRldmluZm8tPnJlc3BvbnNlKSk7CisJc2Vuc2VfdXJiID0gdWFzX3N1Ym1pdF9zZW5zZV91cmIoY21uZCwgR0ZQX05PSU8sCisJCQkJCSBkZXZpbmZvLT51c2Vfc3RyZWFtcyA/IHRhZyA6IDApOworCWlmICghc2Vuc2VfdXJiKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAorCQkJICAgICAiJXM6ICVzOiBzdWJtaXQgc2Vuc2UgdXJiIGZhaWxlZFxuIiwKKwkJCSAgICAgX19mdW5jX18sIGZuYW1lKTsKKwkJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlpZiAodWFzX3N1Ym1pdF90YXNrX3VyYihjbW5kLCBHRlBfTk9JTywgZnVuY3Rpb24sIHRhZykpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgc2hvc3QsCiAJCQkgICAgICIlczogJXM6IHN1Ym1pdCB0YXNrIG1nbXQgdXJiIGZhaWxlZFxuIiwKIAkJCSAgICAgX19mdW5jX18sIGZuYW1lKTsKKwkJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQl1c2Jfa2lsbF91cmIoc2Vuc2VfdXJiKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHVzYl93YWl0X2FuY2hvcl9lbXB0eV90aW1lb3V0KCZkZXZpbmZvLT5zZW5zZV91cmJzLCAzMDAwKSA9PSAwKSB7CisJCS8qCisJCSAqIE5vdGUgd2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBjbGVhciBydW5uaW5nX3Rhc2sgaGVyZS4gSWYgd2UKKwkJICogYWxsb3cgbmV3IHRhc2tzIHRvIGJlIHN1Ym1pdHRlZCwgdGhlcmUgaXMgbm8gd2F5IHRvIGZpZ3VyZQorCQkgKiBvdXQgaWYgYSByZWNlaXZlZCByZXNwb25zZV9pdSBpcyBmb3IgdGhlIGZhaWxlZCB0YXNrIG9yIGZvcgorCQkgKiB0aGUgbmV3IG9uZS4gQSBidXMtcmVzZXQgd2lsbCBldmVudHVhbGx5IGNsZWFyIHJ1bm5pbmdfdGFzay4KKwkJICovCiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAogCQkJICAgICAiJXM6ICVzIHRpbWVkIG91dFxuIiwgX19mdW5jX18sIGZuYW1lKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCWRldmluZm8tPnJ1bm5pbmdfdGFzayA9IDA7CiAJaWYgKGJlMTZfdG9fY3B1KGRldmluZm8tPnJlc3BvbnNlLnRhZykgIT0gdGFnKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNob3N0LAogCQkJICAgICAiJXM6ICVzIGZhaWxlZCAod3JvbmcgdGFnICVkLyVkKVxuIiwgX19mdW5jX18sCiAJCQkgICAgIGZuYW1lLCBiZTE2X3RvX2NwdShkZXZpbmZvLT5yZXNwb25zZS50YWcpLCB0YWcpOwotCQlyZXR1cm4gRkFJTEVEOwotCX0KLQlpZiAoZGV2aW5mby0+cmVzcG9uc2UucmVzcG9uc2VfY29kZSAhPSBSQ19UTUZfQ09NUExFVEUpIHsKKwkJcmVzdWx0ID0gRkFJTEVEOworCX0gZWxzZSBpZiAoZGV2aW5mby0+cmVzcG9uc2UucmVzcG9uc2VfY29kZSAhPSBSQ19UTUZfQ09NUExFVEUpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgc2hvc3QsCiAJCQkgICAgICIlczogJXMgZmFpbGVkIChyYyAweCV4KVxuIiwgX19mdW5jX18sCiAJCQkgICAgIGZuYW1lLCBkZXZpbmZvLT5yZXNwb25zZS5yZXNwb25zZV9jb2RlKTsKLQkJcmV0dXJuIEZBSUxFRDsKKwkJcmVzdWx0ID0gRkFJTEVEOwogCX0KLQlyZXR1cm4gU1VDQ0VTUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHVhc19laF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCkBAIC03NTgsMjIgKzg2MSwxOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCXVhc19sb2dfY21kX3N0YXRlKGNtbmQsIF9fZnVuY19fKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwotCWNtZGluZm8tPnN0YXRlIHw9IENPTU1BTkRfQUJPUlRFRDsKLQlpZiAoY21kaW5mby0+c3RhdGUgJiBJU19JTl9XT1JLX0xJU1QpIHsKLQkJc3Bpbl9sb2NrKCZ1YXNfd29ya19sb2NrKTsKLQkJbGlzdF9kZWwoJmNtZGluZm8tPmxpc3QpOwotCQljbWRpbmZvLT5zdGF0ZSAmPSB+SVNfSU5fV09SS19MSVNUOwotCQlzcGluX3VubG9jaygmdWFzX3dvcmtfbG9jayk7CisKKwlpZiAoZGV2aW5mby0+cmVzZXR0aW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKIAl9CisKKwl1YXNfbWFya19jbWRfZGVhZChkZXZpbmZvLCBjbWRpbmZvLCBESURfQUJPUlQsIF9fZnVuY19fKTsKIAlpZiAoY21kaW5mby0+c3RhdGUgJiBDT01NQU5EX0lORkxJR0hUKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmluZm8tPmxvY2ssIGZsYWdzKTsKIAkJcmV0ID0gdWFzX2VoX3Rhc2tfbWdtdChjbW5kLCAiQUJPUlQgVEFTSyIsIFRNRl9BQk9SVF9UQVNLKTsKIAl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXVhc191bmxpbmtfZGF0YV91cmJzKGRldmluZm8sIGNtZGluZm8pOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOworCQl1YXNfdW5saW5rX2RhdGFfdXJicyhkZXZpbmZvLCBjbWRpbmZvLCAmZmxhZ3MpOwogCQl1YXNfdHJ5X2NvbXBsZXRlKGNtbmQsIF9fZnVuY19fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aW5mby0+bG9jaywgZmxhZ3MpOwogCQlyZXQgPSBTVUNDRVNTOwpAQCAtNzk1LDE0ICs4OTUsMjUgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGRldmluZm8tPnVkZXY7CiAJaW50IGVycjsKIAorCWVyciA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQodWRldiwgZGV2aW5mby0+aW50Zik7CisJaWYgKGVycikgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNkZXYtPmhvc3QsCisJCQkgICAgICIlcyBGQUlMRUQgdG8gZ2V0IGxvY2sgZXJyICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzZGV2LT5ob3N0LCAiJXMgc3RhcnRcbiIsIF9fZnVuY19fKTsKIAlkZXZpbmZvLT5yZXNldHRpbmcgPSAxOwotCXVhc19hYm9ydF93b3JrKGRldmluZm8pOworCXVhc19hYm9ydF9pbmZsaWdodChkZXZpbmZvLCBESURfUkVTRVQsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF9hbmNob3JlZF91cmJzKCZkZXZpbmZvLT5jbWRfdXJicyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+c2Vuc2VfdXJicyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+ZGF0YV91cmJzKTsKKwl1YXNfemFwX2RlYWQoZGV2aW5mbyk7CiAJZXJyID0gdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKIAlkZXZpbmZvLT5yZXNldHRpbmcgPSAwOwogCisJdXNiX3VubG9ja19kZXZpY2UodWRldik7CisKIAlpZiAoZXJyKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0lORk8sIHNkZXYtPmhvc3QsICIlcyBGQUlMRURcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIEZBSUxFRDsKQEAgLTgxNCw3ICs5MjUsMjUgQEAKIAogc3RhdGljIGludCB1YXNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXNkZXYtPmhvc3RkYXRhID0gKHZvaWQgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzZGV2LT5ob3N0ZGF0YSA9ICh2b2lkICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBVU0IgaGFzIHVudXN1YWwgRE1BLWFsaWdubWVudCByZXF1aXJlbWVudHM6IEFsdGhvdWdoIHRoZQorCSAqIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZWFjaCBzY2F0dGVyLWdhdGhlciBlbGVtZW50IGRvZXNuJ3QgbWF0dGVyLAorCSAqIHRoZSBsZW5ndGggb2YgZWFjaCBlbGVtZW50IGV4Y2VwdCB0aGUgbGFzdCBtdXN0IGJlIGRpdmlzaWJsZQorCSAqIGJ5IHRoZSBCdWxrIG1heHBhY2tldCB2YWx1ZS4gIFRoZXJlJ3MgY3VycmVudGx5IG5vIHdheSB0bworCSAqIGV4cHJlc3MgdGhpcyBieSBibG9jay1sYXllciBjb25zdHJhaW50cywgc28gd2UnbGwgY29wIG91dAorCSAqIGFuZCBzaW1wbHkgcmVxdWlyZSBhZGRyZXNzZXMgdG8gYmUgYWxpZ25lZCBhdCA1MTItYnl0ZQorCSAqIGJvdW5kYXJpZXMuICBUaGlzIGlzIG9rYXkgc2luY2UgbW9zdCBibG9jayBJL08gaW52b2x2ZXMKKwkgKiBoYXJkd2FyZSBzZWN0b3JzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiA1MTIgYnl0ZXMgaW4gbGVuZ3RoLAorCSAqIGFuZCBzaW5jZSBob3N0IGNvbnRyb2xsZXJzIHVwIHRocm91Z2ggVVNCIDIuMCBoYXZlIG1heHBhY2tldAorCSAqIHZhbHVlcyBubyBsYXJnZXIgdGhhbiA1MTIuCisJICoKKwkgKiBCdXQgaXQgZG9lc24ndCBzdWZmaWNlIGZvciBXaXJlbGVzcyBVU0IsIHdoZXJlIEJ1bGsgbWF4cGFja2V0CisJICogdmFsdWVzIGNhbiBiZSBhcyBsYXJnZSBhcyAyMDQ4LiAgVG8gbWFrZSB0aGF0IHdvcmsgcHJvcGVybHkKKwkgKiB3aWxsIHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgYmxvY2sgbGF5ZXIuCisJICovCisJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsICg1MTIgLSAxKSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIyLDcgKzk1MSw3IEBACiB7CiAJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IHNkZXYtPmhvc3RkYXRhOwogCXNjc2lfc2V0X3RhZ190eXBlKHNkZXYsIE1TR19PUkRFUkVEX1RBRyk7Ci0Jc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgZGV2aW5mby0+cWRlcHRoIC0gMyk7CisJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgZGV2aW5mby0+cWRlcHRoIC0gMik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0Myw3ICs5NzIsMTQgQEAKIAkub3JkZXJlZF90YWcgPSAxLAogfTsKIAorI2RlZmluZSBVTlVTVUFMX0RFVihpZF92ZW5kb3IsIGlkX3Byb2R1Y3QsIGJjZERldmljZU1pbiwgYmNkRGV2aWNlTWF4LCBcCisJCSAgICB2ZW5kb3JOYW1lLCBwcm9kdWN0TmFtZSwgdXNlUHJvdG9jb2wsIHVzZVRyYW5zcG9ydCwgXAorCQkgICAgaW5pdEZ1bmN0aW9uLCBmbGFncykgXAoreyBVU0JfREVWSUNFX1ZFUihpZF92ZW5kb3IsIGlkX3Byb2R1Y3QsIGJjZERldmljZU1pbiwgYmNkRGV2aWNlTWF4KSwgXAorCS5kcml2ZXJfaW5mbyA9IChmbGFncykgfQorCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdWFzX3VzYl9pZHNbXSA9IHsKKyMJaW5jbHVkZSAidW51c3VhbF91YXMuaCIKIAl7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfTUFTU19TVE9SQUdFLCBVU0JfU0NfU0NTSSwgVVNCX1BSX0JVTEspIH0sCiAJeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX01BU1NfU1RPUkFHRSwgVVNCX1NDX1NDU0ksIFVTQl9QUl9VQVMpIH0sCiAJLyogMHhhYSBpcyBhIHByb3RvdHlwZSBkZXZpY2UgSSBoYXBwZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gKi8KQEAgLTg1MiwxMDUgKzk4OCw1NSBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1YXNfdXNiX2lkcyk7CiAKLXN0YXRpYyBpbnQgdWFzX2lzX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmKQotewotCXJldHVybiAoaW50Zi0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX01BU1NfU1RPUkFHRSAmJgotCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfU0NfU0NTSSAmJgotCQlpbnRmLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfUFJfVUFTKTsKLX0KLQotc3RhdGljIGludCB1YXNfaXNudF9zdXBwb3J0ZWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCi17Ci0Jc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKLQotCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJUaGUgZHJpdmVyIGZvciB0aGUgVVNCIGNvbnRyb2xsZXIgJXMgZG9lcyBub3QgIgotCQkJInN1cHBvcnQgc2NhdHRlci1nYXRoZXIgd2hpY2ggaXNcbiIsCi0JCQloY2QtPmRyaXZlci0+ZGVzY3JpcHRpb24pOwotCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJyZXF1aXJlZCBieSB0aGUgVUFTIGRyaXZlci4gUGxlYXNlIHRyeSBhbiIKLQkJCSJhbHRlcm5hdGl2ZSBVU0IgY29udHJvbGxlciBpZiB5b3Ugd2lzaCB0byB1c2UgVUFTLlxuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19CisjdW5kZWYgVU5VU1VBTF9ERVYKIAogc3RhdGljIGludCB1YXNfc3dpdGNoX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWludCBpOwotCWludCBzZ19zdXBwb3J0ZWQgPSB1ZGV2LT5idXMtPnNnX3RhYmxlc2l6ZSAhPSAwOworCWludCBhbHQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW50Zi0+bnVtX2FsdHNldHRpbmc7IGkrKykgewotCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSAmaW50Zi0+YWx0c2V0dGluZ1tpXTsKKwlhbHQgPSB1YXNfZmluZF91YXNfYWx0X3NldHRpbmcoaW50Zik7CisJaWYgKGFsdCA8IDApCisJCXJldHVybiBhbHQ7CiAKLQkJaWYgKHVhc19pc19pbnRlcmZhY2UoYWx0KSkgewotCQkJaWYgKCFzZ19zdXBwb3J0ZWQpCi0JCQkJcmV0dXJuIHVhc19pc250X3N1cHBvcnRlZCh1ZGV2KTsKLQkJCXJldHVybiB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LAotCQkJCQkJYWx0LT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCi0JCQkJCQlhbHQtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmcpOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsCisJCQlpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgYWx0KTsKIH0KIAotc3RhdGljIHZvaWQgdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKK3N0YXRpYyBpbnQgdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwc1s0XSA9IHsgfTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGRldmluZm8tPmludGY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkZXZpbmZvLT51ZGV2OwotCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQ7Ci0JdW5zaWduZWQgaSwgbl9lbmRwb2ludHMgPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOworCWludCByOwogCiAJZGV2aW5mby0+dWFzX3NlbnNlX29sZCA9IDA7CiAJZGV2aW5mby0+Y21uZCA9IE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbl9lbmRwb2ludHM7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyICpleHRyYSA9IGVuZHBvaW50W2ldLmV4dHJhOwotCQlpbnQgbGVuID0gZW5kcG9pbnRbaV0uZXh0cmFsZW47Ci0JCXdoaWxlIChsZW4gPiAxKSB7Ci0JCQlpZiAoZXh0cmFbMV0gPT0gVVNCX0RUX1BJUEVfVVNBR0UpIHsKLQkJCQl1bnNpZ25lZCBwaXBlX2lkID0gZXh0cmFbMl07Ci0JCQkJaWYgKHBpcGVfaWQgPiAwICYmIHBpcGVfaWQgPCA1KQotCQkJCQllcHNbcGlwZV9pZCAtIDFdID0gJmVuZHBvaW50W2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbGVuIC09IGV4dHJhWzBdOwotCQkJZXh0cmEgKz0gZXh0cmFbMF07Ci0JCX0KLQl9CisJciA9IHVhc19maW5kX2VuZHBvaW50cyhkZXZpbmZvLT5pbnRmLT5jdXJfYWx0c2V0dGluZywgZXBzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKLQkvKgotCSAqIEFzc3VtZSB0aGF0IGlmIHdlIGRpZG4ndCBmaW5kIGEgY29udHJvbCBwaXBlIGRlc2NyaXB0b3IsIHdlJ3JlCi0JICogdXNpbmcgYSBkZXZpY2Ugd2l0aCBvbGQgZmlybXdhcmUgdGhhdCBoYXBwZW5zIHRvIGJlIHNldCB1cCBsaWtlCi0JICogdGhpcy4KLQkgKi8KLQlpZiAoIWVwc1swXSkgewotCQlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCAxKTsKLQkJZGV2aW5mby0+c3RhdHVzX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwgMSk7Ci0JCWRldmluZm8tPmRhdGFfaW5fcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LCAyKTsKLQkJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCAyKTsKKwlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzBdLT5kZXNjKSk7CisJZGV2aW5mby0+c3RhdHVzX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwKKwkJCQkJICAgIHVzYl9lbmRwb2ludF9udW0oJmVwc1sxXS0+ZGVzYykpOworCWRldmluZm8tPmRhdGFfaW5fcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzJdLT5kZXNjKSk7CisJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAorCQkJCQkgICAgdXNiX2VuZHBvaW50X251bSgmZXBzWzNdLT5kZXNjKSk7CiAKLQkJZXBzWzFdID0gdXNiX3BpcGVfZW5kcG9pbnQodWRldiwgZGV2aW5mby0+c3RhdHVzX3BpcGUpOwotCQllcHNbMl0gPSB1c2JfcGlwZV9lbmRwb2ludCh1ZGV2LCBkZXZpbmZvLT5kYXRhX2luX3BpcGUpOwotCQllcHNbM10gPSB1c2JfcGlwZV9lbmRwb2ludCh1ZGV2LCBkZXZpbmZvLT5kYXRhX291dF9waXBlKTsKLQl9IGVsc2UgewotCQlkZXZpbmZvLT5jbWRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzBdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCQlkZXZpbmZvLT5zdGF0dXNfcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzFdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCQlkZXZpbmZvLT5kYXRhX2luX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUodWRldiwKLQkJCQkJCWVwc1syXS0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKLQkJZGV2aW5mby0+ZGF0YV9vdXRfcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LAotCQkJCQkJZXBzWzNdLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCX0KLQotCWRldmluZm8tPnFkZXB0aCA9IHVzYl9hbGxvY19zdHJlYW1zKGRldmluZm8tPmludGYsIGVwcyArIDEsIDMsIDI1NiwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldmluZm8tPnFkZXB0aCA8IDApIHsKKwlpZiAodWRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX1NVUEVSKSB7CiAJCWRldmluZm8tPnFkZXB0aCA9IDI1NjsKIAkJZGV2aW5mby0+dXNlX3N0cmVhbXMgPSAwOwogCX0gZWxzZSB7CisJCWRldmluZm8tPnFkZXB0aCA9IHVzYl9hbGxvY19zdHJlYW1zKGRldmluZm8tPmludGYsIGVwcyArIDEsCisJCQkJCQkgICAgMywgMjU2LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRldmluZm8tPnFkZXB0aCA8IDApCisJCQlyZXR1cm4gZGV2aW5mby0+cWRlcHRoOwogCQlkZXZpbmZvLT51c2Vfc3RyZWFtcyA9IDE7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHVhc19mcmVlX3N0cmVhbXMoc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbykKQEAgLTk2NCwzMCArMTA1MCwyMyBAQAogCXVzYl9mcmVlX3N0cmVhbXMoZGV2aW5mby0+aW50ZiwgZXBzLCAzLCBHRlBfS0VSTkVMKTsKIH0KIAotLyoKLSAqIFhYWDogV2hhdCBJJ2QgbGlrZSB0byBkbyBoZXJlIGlzIHJlZ2lzdGVyIGEgU0NTSSBob3N0IGZvciBlYWNoIFVTQiBob3N0IGluCi0gKiB0aGUgc3lzdGVtLiAgRm9sbG93IHVzYi1zdG9yYWdlJ3MgZGVzaWduIG9mIHJlZ2lzdGVyaW5nIGEgU0NTSSBob3N0IGZvcgotICogZWFjaCBVU0IgZGV2aWNlIGZvciB0aGUgbW9tZW50LiAgQ2FuIGltcGxlbWVudCB0aGlzIGJ5IHdhbGtpbmcgdXAgdGhlCi0gKiBVU0IgaGllcmFyY2h5IHVudGlsIHdlIGZpbmQgYSBVU0IgaG9zdC4KLSAqLwogc3RhdGljIGludCB1YXNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCWludCByZXN1bHQgPSAtRU5PTUVNOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gTlVMTDsKIAlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAorCWlmICghdWFzX3VzZV91YXNfZHJpdmVyKGludGYsIGlkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAodWFzX3N3aXRjaF9pbnRlcmZhY2UodWRldiwgaW50ZikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGV2aW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1YXNfZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldmluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVzdWx0ID0gLUVOT01FTTsKLQlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdWFzX2hvc3RfdGVtcGxhdGUsIHNpemVvZih2b2lkICopKTsKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdWFzX2hvc3RfdGVtcGxhdGUsCisJCQkJc2l6ZW9mKHN0cnVjdCB1YXNfZGV2X2luZm8pKTsKIAlpZiAoIXNob3N0KQotCQlnb3RvIGZyZWU7CisJCWdvdG8gc2V0X2FsdDA7CiAKIAlzaG9zdC0+bWF4X2NtZF9sZW4gPSAxNiArIDI1MjsKIAlzaG9zdC0+bWF4X2lkID0gMTsKQEAgLTk5NSwzMyArMTA3NCw0MCBAQAogCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CiAJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IHVkZXYtPmJ1cy0+c2dfdGFibGVzaXplOwogCisJZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOwogCWRldmluZm8tPmludGYgPSBpbnRmOwogCWRldmluZm8tPnVkZXYgPSB1ZGV2OwogCWRldmluZm8tPnJlc2V0dGluZyA9IDA7CisJZGV2aW5mby0+cnVubmluZ190YXNrID0gMDsKKwlkZXZpbmZvLT5zaHV0ZG93biA9IDA7CiAJaW5pdF91c2JfYW5jaG9yKCZkZXZpbmZvLT5jbWRfdXJicyk7CiAJaW5pdF91c2JfYW5jaG9yKCZkZXZpbmZvLT5zZW5zZV91cmJzKTsKIAlpbml0X3VzYl9hbmNob3IoJmRldmluZm8tPmRhdGFfdXJicyk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldmluZm8tPmxvY2spOwotCXVhc19jb25maWd1cmVfZW5kcG9pbnRzKGRldmluZm8pOworCUlOSVRfV09SSygmZGV2aW5mby0+d29yaywgdWFzX2RvX3dvcmspOworCUlOSVRfTElTVF9IRUFEKCZkZXZpbmZvLT5pbmZsaWdodF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2aW5mby0+ZGVhZF9saXN0KTsKIAotCXJlc3VsdCA9IHNjc2lfaW5pdF9zaGFyZWRfdGFnX21hcChzaG9zdCwgZGV2aW5mby0+cWRlcHRoIC0gMyk7CisJcmVzdWx0ID0gdWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoZGV2aW5mbyk7CiAJaWYgKHJlc3VsdCkKLQkJZ290byBmcmVlOworCQlnb3RvIHNldF9hbHQwOworCisJcmVzdWx0ID0gc2NzaV9pbml0X3NoYXJlZF90YWdfbWFwKHNob3N0LCBkZXZpbmZvLT5xZGVwdGggLSAyKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZyZWVfc3RyZWFtczsKIAogCXJlc3VsdCA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZpbnRmLT5kZXYpOwogCWlmIChyZXN1bHQpCi0JCWdvdG8gZGVjb25maWdfZXBzOwotCi0Jc2hvc3QtPmhvc3RkYXRhWzBdID0gKHVuc2lnbmVkIGxvbmcpZGV2aW5mbzsKKwkJZ290byBmcmVlX3N0cmVhbXM7CiAKIAlzY3NpX3NjYW5faG9zdChzaG9zdCk7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBzaG9zdCk7CiAJcmV0dXJuIHJlc3VsdDsKIAotZGVjb25maWdfZXBzOgorZnJlZV9zdHJlYW1zOgogCXVhc19mcmVlX3N0cmVhbXMoZGV2aW5mbyk7Ci0gZnJlZToKLQlrZnJlZShkZXZpbmZvKTsKK3NldF9hbHQwOgorCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKIAlpZiAoc2hvc3QpCiAJCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwogCXJldHVybiByZXN1bHQ7CkBAIC0xMDI5LDQ1ICsxMTE1LDE0NiBAQAogCiBzdGF0aWMgaW50IHVhc19wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0vKiBYWFg6IE5lZWQgdG8gcmV0dXJuIDEgaWYgaXQncyBub3Qgb3VyIGRldmljZSBpbiBlcnJvciBoYW5kbGluZyAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZpbmZvLT5zaHV0ZG93bikKKwkJcmV0dXJuIDA7CisKKwkvKiBCbG9jayBuZXcgcmVxdWVzdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9ibG9ja19yZXF1ZXN0cyhzaG9zdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBXYWl0IGZvciBhbnkgcGVuZGluZyByZXF1ZXN0cyB0byBjb21wbGV0ZSAqLworCWZsdXNoX3dvcmsoJmRldmluZm8tPndvcmspOworCWlmICh1c2Jfd2FpdF9hbmNob3JfZW1wdHlfdGltZW91dCgmZGV2aW5mby0+c2Vuc2VfdXJicywgNTAwMCkgPT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNob3N0LCAiJXM6IHRpbWVkIG91dFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisKKwl1YXNfZnJlZV9zdHJlYW1zKGRldmluZm8pOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdWFzX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0vKiBYWFg6IE5lZWQgdG8gcmV0dXJuIDEgaWYgaXQncyBub3Qgb3VyIGRldmljZSBpbiBlcnJvciBoYW5kbGluZyAqLworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZpbmZvLT5zaHV0ZG93bikKKwkJcmV0dXJuIDA7CisKKwlpZiAodWFzX2NvbmZpZ3VyZV9lbmRwb2ludHMoZGV2aW5mbykgIT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNob3N0LAorCQkJICAgICAiJXM6IGFsbG9jIHN0cmVhbXMgZXJyb3IgYWZ0ZXIgcmVzZXQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzY3NpX3JlcG9ydF9idXNfcmVzZXQoc2hvc3QsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHNob3N0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVhc19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9IChzdHJ1Y3QgdWFzX2Rldl9pbmZvICopc2hvc3QtPmhvc3RkYXRhOworCisJLyogV2FpdCBmb3IgYW55IHBlbmRpbmcgcmVxdWVzdHMgdG8gY29tcGxldGUgKi8KKwlmbHVzaF93b3JrKCZkZXZpbmZvLT53b3JrKTsKKwlpZiAodXNiX3dhaXRfYW5jaG9yX2VtcHR5X3RpbWVvdXQoJmRldmluZm8tPnNlbnNlX3VyYnMsIDUwMDApID09IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBzaG9zdCwgIiVzOiB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1YXNfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVhc19yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAoc3RydWN0IHVhc19kZXZfaW5mbyAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVhc19jb25maWd1cmVfZW5kcG9pbnRzKGRldmluZm8pICE9IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBzaG9zdCwKKwkJCSAgICAgIiVzOiBhbGxvYyBzdHJlYW1zIGVycm9yIGFmdGVyIHJlc2V0IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHNob3N0LCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB1YXNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0Jc3RydWN0IHVhc19kZXZfaW5mbyAqZGV2aW5mbyA9ICh2b2lkICopc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCB1YXNfZGV2X2luZm8gKmRldmluZm8gPSAoc3RydWN0IHVhc19kZXZfaW5mbyAqKXNob3N0LT5ob3N0ZGF0YTsKIAogCWRldmluZm8tPnJlc2V0dGluZyA9IDE7Ci0JdWFzX2Fib3J0X3dvcmsoZGV2aW5mbyk7CisJY2FuY2VsX3dvcmtfc3luYygmZGV2aW5mby0+d29yayk7CisJdWFzX2Fib3J0X2luZmxpZ2h0KGRldmluZm8sIERJRF9OT19DT05ORUNULCBfX2Z1bmNfXyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGV2aW5mby0+Y21kX3VyYnMpOwogCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldmluZm8tPnNlbnNlX3VyYnMpOwogCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldmluZm8tPmRhdGFfdXJicyk7CisJdWFzX3phcF9kZWFkKGRldmluZm8pOwogCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwogCXVhc19mcmVlX3N0cmVhbXMoZGV2aW5mbyk7Ci0Ja2ZyZWUoZGV2aW5mbyk7CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiB9CiAKIC8qCi0gKiBYWFg6IFNob3VsZCB0aGlzIHBsdWcgaW50byBsaWJ1c3VhbCBzbyB3ZSBjYW4gYXV0by11cGdyYWRlIGRldmljZXMgZnJvbQotICogQnVsay1Pbmx5IHRvIFVBUz8KKyAqIFB1dCB0aGUgZGV2aWNlIGJhY2sgaW4gdXNiLXN0b3JhZ2UgbW9kZSBvbiBzaHV0ZG93biwgYXMgc29tZSBCSU9TLWVzCisgKiBoYW5nIG9uIHJlYm9vdCB3aGVuIHRoZSBkZXZpY2UgaXMgc3RpbGwgaW4gdWFzIG1vZGUuIE5vdGUgdGhlIHJlc2V0IGlzCisgKiBuZWNlc3NhcnkgYXMgc29tZSBkZXZpY2VzIHdvbid0IHJldmVydCB0byB1c2Itc3RvcmFnZSBtb2RlIHdpdGhvdXQgaXQuCiAgKi8KK3N0YXRpYyB2b2lkIHVhc19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdWFzX2Rldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCB1YXNfZGV2X2luZm8gKilzaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SRVNUQVJUKQorCQlyZXR1cm47CisKKwlkZXZpbmZvLT5zaHV0ZG93biA9IDE7CisJdWFzX2ZyZWVfc3RyZWFtcyhkZXZpbmZvKTsKKwl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CisJdXNiX3Jlc2V0X2RldmljZSh1ZGV2KTsKK30KKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVhc19kcml2ZXIgPSB7CiAJLm5hbWUgPSAidWFzIiwKIAkucHJvYmUgPSB1YXNfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSB1YXNfZGlzY29ubmVjdCwKIAkucHJlX3Jlc2V0ID0gdWFzX3ByZV9yZXNldCwKIAkucG9zdF9yZXNldCA9IHVhc19wb3N0X3Jlc2V0LAorCS5zdXNwZW5kID0gdWFzX3N1c3BlbmQsCisJLnJlc3VtZSA9IHVhc19yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9IHVhc19yZXNldF9yZXN1bWUsCisJLmRydndyYXAuZHJpdmVyLnNodXRkb3duID0gdWFzX3NodXRkb3duLAogCS5pZF90YWJsZSA9IHVhc191c2JfaWRzLAogfTsKIAogbW9kdWxlX3VzYl9kcml2ZXIodWFzX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgV2lsY294IGFuZCBTYXJhaCBTaGFycCIpOworTU9EVUxFX0FVVEhPUigKKwkiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4sIE1hdHRoZXcgV2lsY294IGFuZCBTYXJhaCBTaGFycCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggYWRiZWIyNS4uZjRhODIyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMjA4Niw2ICsyMDg2LDExIEBACiAJCSJEaWdpdGFsIE1QMyBBdWRpbyBQbGF5ZXIiLAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLCBVU19GTF9OT1RfTE9DS0FCTEUgKSwKIAorLyogVW51c3VhbCB1YXMgZGV2aWNlcyAqLworI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9VQVMpCisjaW5jbHVkZSAidW51c3VhbF91YXMuaCIKKyNlbmRpZgorCiAvKiBDb250cm9sL0J1bGsgdHJhbnNwb3J0IGZvciBhbGwgU3ViQ2xhc3MgdmFsdWVzICovCiBVU1VBTF9ERVYoVVNCX1NDX1JCQywgVVNCX1BSX0NCKSwKIFVTVUFMX0RFVihVU0JfU0NfODAyMCwgVVNCX1BSX0NCKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ0NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX3Vhcy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIERyaXZlciBmb3IgVVNCIEF0dGFjaGVkIFNDU0kgZGV2aWNlcyAtIFVudXN1YWwgRGV2aWNlcyBGaWxlCisgKgorICogICAoYykgMjAxMyBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSBzYW1lIGZpbGUgZm9yIHRoZSB1c2Itc3RvcmFnZSBkcml2ZXIsIHdoaWNoIGlzOgorICogICAoYykgMjAwMC0yMDAyIE1hdHRoZXcgRGhhcm0gKG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0KQorICogICAoYykgMjAwMCBBZGFtIEouIFJpY2h0ZXIgKGFkYW1AeWdnZHJhc2lsLmNvbSksIFlnZ2RyYXNpbCBDb21wdXRpbmcsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogSU1QT1JUQU5UIE5PVEU6IFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGluIGFub3RoZXIgZmlsZSB3aGljaCBkZWZpbmVzCisgKiBhIFVOVVNVQUxfREVWIG1hY3JvIGJlZm9yZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuCisgKi8KKworLyoKKyAqIElmIHlvdSBlZGl0IHRoaXMgZmlsZSwgcGxlYXNlIHRyeSB0byBrZWVwIGl0IHNvcnRlZCBmaXJzdCBieSBWZW5kb3JJRCwKKyAqIHRoZW4gYnkgUHJvZHVjdElELgorICoKKyAqIElmIHlvdSB3YW50IHRvIGFkZCBhbiBlbnRyeSBmb3IgdGhpcyBmaWxlLCBiZSBzdXJlIHRvIGluY2x1ZGUgdGhlCisgKiBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgKgktIGEgcGF0Y2ggdGhhdCBhZGRzIHRoZSBlbnRyeSBmb3IgeW91ciBkZXZpY2UsIGluY2x1ZGluZyB5b3VyCisgKgkgIGVtYWlsIGFkZHJlc3MgcmlnaHQgYWJvdmUgdGhlIGVudHJ5IChwbHVzIG1heWJlIGEgYnJpZWYKKyAqCSAgZXhwbGFuYXRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGVudHJ5KSwKKyAqCS0gbHN1c2IgLXYgb3V0cHV0IGZvciB0aGUgZGV2aWNlCisgKiBTZW5kIHlvdXIgc3VibWlzc2lvbiB0byBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICogYW5kIGRvbid0IGZvcmdldCB0byBDQzogdGhlIFVTQiBkZXZlbG9wbWVudCBsaXN0IDxsaW51eC11c2JAdmdlci5rZXJuZWwub3JnPgorICovCisKKy8qCisgKiBUaGlzIGlzIGFuIGV4YW1wbGUgZW50cnkgZm9yIHRoZSBVU19GTF9JR05PUkVfVUFTIGZsYWcuIE9uY2Ugd2UgaGF2ZSBhbgorICogYWN0dWFsIGVudHJ5IHVzaW5nIFVTX0ZMX0lHTk9SRV9VQVMgdGhpcyBlbnRyeSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqCisgKiBVTlVTVUFMX0RFViggIDB4YWJjZCwgMHgxMjM0LCAweDAxMDAsIDB4MDEwMCwKKyAqCQkiRXhhbXBsZSIsCisgKgkJIlN0b3JhZ2Ugd2l0aCBicm9rZW4gVUFTIiwKKyAqCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAorICoJCVVTX0ZMX0lHTk9SRV9VQVMpLAorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCAxYzBiODlmMi4uZjFjOTYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC03Miw2ICs3MiwxMCBAQAogI2luY2x1ZGUgInNpZXJyYV9tcy5oIgogI2luY2x1ZGUgIm9wdGlvbl9tcy5oIgogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1VBUykKKyNpbmNsdWRlICJ1YXMtZGV0ZWN0LmgiCisjZW5kaWYKKwogLyogU29tZSBpbmZvcm1hdGlvbmFsIGRhdGEgKi8KIE1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgRGhhcm0gPG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgTWFzcyBTdG9yYWdlIGRyaXZlciBmb3IgTGludXgiKTsKQEAgLTQ1OSwxNCArNDYzLDE0IEBACiAjZGVmaW5lIFRPTE9XRVIoeCkgKCh4KSB8IDB4MjApCiAKIC8qIEFkanVzdCBkZXZpY2UgZmxhZ3MgYmFzZWQgb24gdGhlICJxdWlya3M9IiBtb2R1bGUgcGFyYW1ldGVyICovCi1zdGF0aWMgdm9pZCBhZGp1c3RfcXVpcmtzKHN0cnVjdCB1c19kYXRhICp1cykKK3ZvaWQgdXNiX3N0b3JfYWRqdXN0X3F1aXJrcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdW5zaWduZWQgbG9uZyAqZmZsYWdzKQogewogCWNoYXIgKnA7Ci0JdTE2IHZpZCA9IGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JdTE2IHBpZCA9IGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCXUxNiB2aWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwl1MTYgcGlkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCXVuc2lnbmVkIGYgPSAwOwogCXVuc2lnbmVkIGludCBtYXNrID0gKFVTX0ZMX1NBTkVfU0VOU0UgfCBVU19GTF9CQURfU0VOU0UgfAotCQkJVVNfRkxfRklYX0NBUEFDSVRZIHwKKwkJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0lHTk9SRV9VQVMgfAogCQkJVVNfRkxfQ0FQQUNJVFlfSEVVUklTVElDUyB8IFVTX0ZMX0lHTk9SRV9ERVZJQ0UgfAogCQkJVVNfRkxfTk9UX0xPQ0tBQkxFIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgfAogCQkJVVNfRkxfQ0FQQUNJVFlfT0sgfCBVU19GTF9JR05PUkVfUkVTSURVRSB8CkBAIC01MzcsMTQgKzU0MSwxOCBAQAogCQljYXNlICdzJzoKIAkJCWYgfD0gVVNfRkxfU0lOR0xFX0xVTjsKIAkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWYgfD0gVVNfRkxfSUdOT1JFX1VBUzsKKwkJCWJyZWFrOwogCQljYXNlICd3JzoKIAkJCWYgfD0gVVNfRkxfTk9fV1BfREVURUNUOwogCQkJYnJlYWs7CiAJCS8qIElnbm9yZSB1bnJlY29nbml6ZWQgZmxhZyBjaGFyYWN0ZXJzICovCiAJCX0KIAl9Ci0JdXMtPmZmbGFncyA9ICh1cy0+ZmZsYWdzICYgfm1hc2spIHwgZjsKKwkqZmZsYWdzID0gKCpmZmxhZ3MgJiB+bWFzaykgfCBmOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX3N0b3JfYWRqdXN0X3F1aXJrcyk7CiAKIC8qIEdldCB0aGUgdW51c3VhbF9kZXZzIGVudHJpZXMgYW5kIHRoZSBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KIHN0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmZvKHN0cnVjdCB1c19kYXRhICp1cywgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLApAQCAtNTY0LDcgKzU3Miw3IEBACiAJCQlpZGVzYy0+YkludGVyZmFjZVByb3RvY29sIDoKIAkJCXVudXN1YWxfZGV2LT51c2VUcmFuc3BvcnQ7CiAJdXMtPmZmbGFncyA9IGlkLT5kcml2ZXJfaW5mbzsKLQlhZGp1c3RfcXVpcmtzKHVzKTsKKwl1c2Jfc3Rvcl9hZGp1c3RfcXVpcmtzKHVzLT5wdXNiX2RldiwgJnVzLT5mZmxhZ3MpOwogCiAJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9JR05PUkVfREVWSUNFKSB7CiAJCWRldl9pbmZvKHBkZXYsICJkZXZpY2UgaWdub3JlZFxuIik7CkBAIC0xMDM1LDYgKzEwNDMsMTIgQEAKIAlpbnQgcmVzdWx0OwogCWludCBzaXplOwogCisJLyogSWYgdWFzIGlzIGVuYWJsZWQgYW5kIHRoaXMgZGV2aWNlIGNhbiBkbyB1YXMgdGhlbiBpZ25vcmUgaXQuICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1VBUykKKwlpZiAodWFzX3VzZV91YXNfZHJpdmVyKGludGYsIGlkKSkKKwkJcmV0dXJuIC1FTlhJTzsKKyNlbmRpZgorCiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIGlzbid0IHN0YW5kYXJkIChpcyBoYW5kbGVkIGJ5IGEgc3ViZHJpdmVyCiAJICogbW9kdWxlKSB0aGVuIGRvbid0IGFjY2VwdCBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IDc1ZjcwZjAuLjMwN2UzMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtMjAxLDQgKzIwMSw3IEBACiBleHRlcm4gaW50IHVzYl9zdG9yX3Byb2JlMihzdHJ1Y3QgdXNfZGF0YSAqdXMpOwogZXh0ZXJuIHZvaWQgdXNiX3N0b3JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKK2V4dGVybiB2b2lkIHVzYl9zdG9yX2FkanVzdF9xdWlya3Moc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgbG9uZyAqZmZsYWdzKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMKaW5kZXggM2I5NTllOC4uMDY3NzEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gd3VzYmhjLT5kZXY7CiAJc3RydWN0IHd1c2JfZGV2ICp3dXNiX2RldjsKIAlzdHJ1Y3Qgd3VzYl9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGlkeCwgZGV2bnVtOworCXVuc2lnbmVkIGlkeDsKIAogCW11dGV4X2xvY2soJnd1c2JoYy0+bXV0ZXgpOwogCkBAIC0zMTIsOCArMzEyLDYgQEAKIAkJZ290byBlcnJvcl91bmxvY2s7CiAJfQogCi0JZGV2bnVtID0gaWR4ICsgMjsKLQogCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgbm8gY3J5cHRvIG9uIHRoYXQgInZpcnR1YWwgcG9ydCIgKi8KIAl3dXNiaGMtPnNldF9wdGsod3VzYmhjLCBpZHgsIDAsIE5VTEwsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuYwppbmRleCAzNjgzNjBmLi4yNTJjN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmMKQEAgLTc1LDggKzc1LDYgQEAKIAlpZiAod2EtPmR0aV91cmIpIHsKIAkJdXNiX2tpbGxfdXJiKHdhLT5kdGlfdXJiKTsKIAkJdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOwotCQl1c2Jfa2lsbF91cmIod2EtPmJ1Zl9pbl91cmIpOwotCQl1c2JfcHV0X3VyYih3YS0+YnVmX2luX3VyYik7CiAJfQogCWtmcmVlKHdhLT5kdGlfYnVmKTsKIAl3YV9uZXBfZGVzdHJveSh3YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5oIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuaAppbmRleCBhMmVmODRiLi5mMmE4ZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5oCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmgKQEAgLTEyNSw3ICsxMjUsOCBAQAogCiBlbnVtIHdhX2R0aV9zdGF0ZSB7CiAJV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HLAotCVdBX0RUSV9JU09DX1BBQ0tFVF9TVEFUVVNfUEVORElORworCVdBX0RUSV9JU09DX1BBQ0tFVF9TVEFUVVNfUEVORElORywKKwlXQV9EVElfQlVGX0lOX0RBVEFfUEVORElORwogfTsKIAogZW51bSB3YV9xdWlya3MgewpAQCAtMTM0LDggKzEzNSwyMCBAQAogCSAqIHJlcXVlc3RzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgbm90IHNlbnQgYXMgc2VwYXJhdGUgcGFja2V0cy4KIAkgKi8KIAlXVVNCX1FVSVJLX0FMRVJFT05fSFdBX0NPTkNBVF9JU09DCT0gMHgwMSwKKwkvKgorCSAqIFRoZSBBbGVyZW9uIEhXQSBjYW4gYmUgaW5zdHJ1Y3RlZCB0byBub3Qgc2VuZCB0cmFuc2ZlciBub3RpZmljYXRpb25zCisJICogYXMgYW4gb3B0aW1pemF0aW9uLgorCSAqLworCVdVU0JfUVVJUktfQUxFUkVPTl9IV0FfRElTQUJMRV9YRkVSX05PVElGSUNBVElPTlMJPSAweDAyLAogfTsKIAorZW51bSB3YV92ZW5kb3Jfc3BlY2lmaWNfcmVxdWVzdHMgeworCVdBX1JFUV9BTEVSRU9OX0RJU0FCTEVfWEZFUl9OT1RJRklDQVRJT05TID0gMHg0QywKKwlXQV9SRVFfQUxFUkVPTl9GRUFUVVJFX1NFVCA9IDB4MDEsCisJV0FfUkVRX0FMRVJFT05fRkVBVFVSRV9DTEVBUiA9IDB4MDAsCit9OworCisjZGVmaW5lIFdBX01BWF9CVUZfSU5fVVJCUwk0CiAvKioKICAqIEluc3RhbmNlIG9mIGEgSFdBIEhvc3QgQ29udHJvbGxlcgogICoKQEAgLTIwNiw3ICsyMTksOSBAQAogCXUzMiBkdGlfaXNvY194ZmVyX2luX3Byb2dyZXNzOwogCXU4ICBkdGlfaXNvY194ZmVyX3NlZzsKIAlzdHJ1Y3QgdXJiICpkdGlfdXJiOwkJLyogVVJCIGZvciByZWFkaW5nIHhmZXIgcmVzdWx0cyAqLwotCXN0cnVjdCB1cmIgKmJ1Zl9pbl91cmI7CQkvKiBVUkIgZm9yIHJlYWRpbmcgZGF0YSBpbiAqLworCQkJCQkvKiBVUkJzIGZvciByZWFkaW5nIGRhdGEgaW4gKi8KKwlzdHJ1Y3QgdXJiIGJ1Zl9pbl91cmJzW1dBX01BWF9CVUZfSU5fVVJCU107CisJaW50IGFjdGl2ZV9idWZfaW5fdXJiczsJCS8qIG51bWJlciBvZiBidWZfaW5fdXJicyBhY3RpdmUuICovCiAJc3RydWN0IGVkYyBkdGlfZWRjOwkJLyogRFRJIGVycm9yIGRlbnNpdHkgY291bnRlciAqLwogCXZvaWQgKmR0aV9idWY7CiAJc2l6ZV90IGR0aV9idWZfc2l6ZTsKQEAgLTIzNCw2ICsyNDksNyBAQAogZXh0ZXJuIGludCB3YV9jcmVhdGUoc3RydWN0IHdhaGMgKndhLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCiAJa2VybmVsX3Vsb25nX3QpOwogZXh0ZXJuIHZvaWQgX193YV9kZXN0cm95KHN0cnVjdCB3YWhjICp3YSk7CitleHRlcm4gaW50IHdhX2R0aV9zdGFydChzdHJ1Y3Qgd2FoYyAqd2EpOwogdm9pZCB3YV9yZXNldF9hbGwoc3RydWN0IHdhaGMgKndhKTsKIAogCkBAIC0yNzUsNiArMjkxLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHdhX2luaXQoc3RydWN0IHdhaGMgKndhKQogeworCWludCBpbmRleDsKKwogCWVkY19pbml0KCZ3YS0+bmVwX2VkYyk7CiAJYXRvbWljX3NldCgmd2EtPm5vdGlmc19xdWV1ZWQsIDApOwogCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfVFJBTlNGRVJfUkVTVUxUX1BFTkRJTkc7CkBAIC0yODgsNiArMzA2LDEwIEBACiAJSU5JVF9XT1JLKCZ3YS0+eGZlcl9lcnJvcl93b3JrLCB3YV9wcm9jZXNzX2Vycm9yZWRfdHJhbnNmZXJzX3J1bik7CiAJd2EtPmR0b19pbl91c2UgPSAwOwogCWF0b21pY19zZXQoJndhLT54ZmVyX2lkX2NvdW50LCAxKTsKKwkvKiBpbml0IHRoZSBidWYgaW4gVVJCcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFdBX01BWF9CVUZfSU5fVVJCUzsgKytpbmRleCkKKwkJdXNiX2luaXRfdXJiKCYod2EtPmJ1Zl9pbl91cmJzW2luZGV4XSkpOworCXdhLT5hY3RpdmVfYnVmX2luX3VyYnMgPSAwOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1ycGlwZS5jCmluZGV4IDZjYTgwYTQuLjZkNmRhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCQlicmVhazsKIAkJfQogCQlpdHIgKz0gaGRyLT5iTGVuZ3RoOwotCQlpdHJfc2l6ZSAtPSBoZHItPmJEZXNjcmlwdG9yVHlwZTsKKwkJaXRyX3NpemUgLT0gaGRyLT5iTGVuZ3RoOwogCX0KIG91dDoKIAlyZXR1cm4gZXBjZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYwppbmRleCAzY2Q5NmU5Li5jOGUyYTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC0xNjcsNiArMTY3LDggQEAKIAogc3RhdGljIHZvaWQgX193YV9wb3B1bGF0ZV9kdG9fdXJiX2lzb2Moc3RydWN0IHdhX3hmZXIgKnhmZXIsCiAJc3RydWN0IHdhX3NlZyAqc2VnLCBpbnQgY3Vycl9pc29fZnJhbWUpOworc3RhdGljIHZvaWQgd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2VncyhzdHJ1Y3Qgd2FfeGZlciAqeGZlciwKKwkJaW50IHN0YXJ0aW5nX2luZGV4LCBlbnVtIHdhX3NlZ19zdGF0dXMgc3RhdHVzKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHdhX3hmZXJfaW5pdChzdHJ1Y3Qgd2FfeGZlciAqeGZlcikKIHsKQEAgLTM2NywxMyArMzY5LDEzIEBACiAJCQlicmVhazsKIAkJY2FzZSBXQV9TRUdfRVJST1I6CiAJCQl4ZmVyLT5yZXN1bHQgPSBzZWctPnJlc3VsdDsKLQkJCWRldl9kYmcoZGV2LCAieGZlciAlcCBJRCAlMDhYIyV1OiBFUlJPUiByZXN1bHQgJXp1KDB4JTA4elgpXG4iLAorCQkJZGV2X2RiZyhkZXYsICJ4ZmVyICVwIElEICUwOFgjJXU6IEVSUk9SIHJlc3VsdCAlemkoMHglMDh6WClcbiIsCiAJCQkJeGZlciwgd2FfeGZlcl9pZCh4ZmVyKSwgc2VnLT5pbmRleCwgc2VnLT5yZXN1bHQsCiAJCQkJc2VnLT5yZXN1bHQpOwogCQkJZ290byBvdXQ7CiAJCWNhc2UgV0FfU0VHX0FCT1JURUQ6CiAJCQl4ZmVyLT5yZXN1bHQgPSBzZWctPnJlc3VsdDsKLQkJCWRldl9kYmcoZGV2LCAieGZlciAlcCBJRCAlMDhYIyV1OiBBQk9SVEVEIHJlc3VsdCAlenUoMHglMDh6WClcbiIsCisJCQlkZXZfZGJnKGRldiwgInhmZXIgJXAgSUQgJTA4WCMldTogQUJPUlRFRCByZXN1bHQgJXppKDB4JTA4elgpXG4iLAogCQkJCXhmZXIsIHdhX3hmZXJfaWQoeGZlciksIHNlZy0+aW5kZXgsIHNlZy0+cmVzdWx0LAogCQkJCXNlZy0+cmVzdWx0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzkwLDYgKzM5MiwyNCBAQAogfQogCiAvKgorICogTWFyayB0aGUgZ2l2ZW4gc2VnbWVudCBhcyBkb25lLiAgUmV0dXJuIHRydWUgaWYgdGhpcyBjb21wbGV0ZXMgdGhlIHhmZXIuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3Igc2VncyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gYW4gUlBJUEUuCisgKiBEZWxheWVkIHNlZ3MgYXJlIG5vdCBtYXJrZWQgYXMgc3VibWl0dGVkIHNvIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgbWFya2VkCisgKiBhcyBkb25lIHdoZW4gY2xlYW5pbmcgdXAuCisgKgorICogeGZlci0+bG9jayBoYXMgdG8gYmUgbG9ja2VkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZShzdHJ1Y3Qgd2FfeGZlciAqeGZlciwKKwlzdHJ1Y3Qgd2Ffc2VnICpzZWcsIGVudW0gd2Ffc2VnX3N0YXR1cyBzdGF0dXMpCit7CisJc2VnLT5zdGF0dXMgPSBzdGF0dXM7CisJeGZlci0+c2Vnc19kb25lKys7CisKKwkvKiBjaGVjayBmb3IgZG9uZS4gKi8KKwlyZXR1cm4gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7Cit9CisKKy8qCiAgKiBTZWFyY2ggZm9yIGEgdHJhbnNmZXIgbGlzdCBJRCBvbiB0aGUgSENEJ3MgVVJCIGxpc3QKICAqCiAgKiBGb3IgMzIgYml0IGFyY2hpdGVjdHVyZXMsIHdlIHVzZSB0aGUgcG9pbnRlciBpdHNlbGY7IGZvciA2NCBiaXRzLCBhCkBAIC00MTYsMTIgKzQzNiw1MSBAQAogCiBzdHJ1Y3Qgd2FfeGZlcl9hYm9ydF9idWZmZXIgewogCXN0cnVjdCB1cmIgdXJiOworCXN0cnVjdCB3YWhjICp3YTsKIAlzdHJ1Y3Qgd2FfeGZlcl9hYm9ydCBjbWQ7CiB9OwogCiBzdGF0aWMgdm9pZCBfX3dhX3hmZXJfYWJvcnRfY2Ioc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB3YV94ZmVyX2Fib3J0X2J1ZmZlciAqYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgd2FoYyAqd2EgPSBiLT53YTsKKworCS8qCisJICogSWYgdGhlIGFib3J0IHJlcXVlc3QgVVJCIGZhaWxlZCwgdGhlbiB0aGUgSFdBIGRpZCBub3QgZ2V0IHRoZSBhYm9ydAorCSAqIGNvbW1hbmQuICBGb3JjaWJseSBjbGVhbiB1cCB0aGUgeGZlciB3aXRob3V0IHdhaXRpbmcgZm9yIGEgVHJhbnNmZXIKKwkgKiBSZXN1bHQgZnJvbSB0aGUgSFdBLgorCSAqLworCWlmICh1cmItPnN0YXR1cyA8IDApIHsKKwkJc3RydWN0IHdhX3hmZXIgKnhmZXI7CisJCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ3YS0+dXNiX2lmYWNlLT5kZXY7CisKKwkJeGZlciA9IHdhX3hmZXJfZ2V0X2J5X2lkKHdhLCBsZTMyX3RvX2NwdShiLT5jbWQuZHdUcmFuc2ZlcklEKSk7CisJCWRldl9lcnIoZGV2LCAiJXM6IFRyYW5zZmVyIEFib3J0IHJlcXVlc3QgZmFpbGVkLiByZXN1bHQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJaWYgKHhmZXIpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlpbnQgZG9uZTsKKwkJCXN0cnVjdCB3YV9ycGlwZSAqcnBpcGUgPSB4ZmVyLT5lcC0+aGNwcml2OworCisJCQlkZXZfZXJyKGRldiwgIiVzOiBjbGVhbmluZyB1cCB4ZmVyICVwIElEIDB4JTA4WC5cbiIsCisJCQkJX19mdW5jX18sIHhmZXIsIHdhX3hmZXJfaWQoeGZlcikpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKKwkJCS8qIG1hcmsgYWxsIHNlZ3MgYXMgYWJvcnRlZC4gKi8KKwkJCXdhX2NvbXBsZXRlX3JlbWFpbmluZ194ZmVyX3NlZ3MoeGZlciwgMCwKKwkJCQlXQV9TRUdfQUJPUlRFRCk7CisJCQlkb25lID0gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoZG9uZSkKKwkJCQl3YV94ZmVyX2NvbXBsZXRpb24oeGZlcik7CisJCQl3YV94ZmVyX2RlbGF5ZWRfcnVuKHJwaXBlKTsKKwkJCXdhX3hmZXJfcHV0KHhmZXIpOworCQl9IGVsc2UgeworCQkJZGV2X2VycihkZXYsICIlczogeGZlciBJRCAweCUwOFggYWxyZWFkeSBnb25lLlxuIiwKKwkJCQkgX19mdW5jX18sIGxlMzJfdG9fY3B1KGItPmNtZC5kd1RyYW5zZmVySUQpKTsKKwkJfQorCX0KKworCXdhX3B1dCh3YSk7CS8qIHRha2VuIGluIF9fd2FfeGZlcl9hYm9ydCAqLwogCXVzYl9wdXRfdXJiKCZiLT51cmIpOwogfQogCkBAIC00NDksNiArNTA4LDcgQEAKIAliLT5jbWQuYlJlcXVlc3RUeXBlID0gV0FfWEZFUl9BQk9SVDsKIAliLT5jbWQud1JQaXBlID0gcnBpcGUtPmRlc2NyLndSUGlwZUluZGV4OwogCWItPmNtZC5kd1RyYW5zZmVySUQgPSB3YV94ZmVyX2lkX2xlMzIoeGZlcik7CisJYi0+d2EgPSB3YV9nZXQoeGZlci0+d2EpOwogCiAJdXNiX2luaXRfdXJiKCZiLT51cmIpOwogCXVzYl9maWxsX2J1bGtfdXJiKCZiLT51cmIsIHhmZXItPndhLT51c2JfZGV2LApAQCAtNDYyLDYgKzUyMiw3IEBACiAKIAogZXJyb3Jfc3VibWl0OgorCXdhX3B1dCh4ZmVyLT53YSk7CiAJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJZGV2X2VycihkZXYsICJ4ZmVyICVwOiBDYW4ndCBzdWJtaXQgYWJvcnQgcmVxdWVzdDogJWRcbiIsCiAJCQl4ZmVyLCByZXN1bHQpOwpAQCAtNzMzLDYgKzc5NCw4IEBACiAJCQkJc2VnLT5pc29jX2ZyYW1lX29mZnNldCArIHNlZy0+aXNvY19mcmFtZV9pbmRleCk7CiAKIAkJCS8qIHJlc3VibWl0IHRoZSBVUkIgd2l0aCB0aGUgbmV4dCBpc29jIGZyYW1lLiAqLworCQkJLyogdGFrZSBhIHJlZiBvbiByZXN1Ym1pdC4gKi8KKwkJCXdhX3hmZXJfZ2V0KHhmZXIpOwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoc2VnLT5kdG9fdXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChyZXN1bHQgPCAwKSB7CiAJCQkJZGV2X2VycihkZXYsICJ4ZmVyIDB4JTA4WCMldTogRFRPIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLApAQCAtNzYwLDkgKzgyMywxMyBAQAogCQlnb3RvIGVycm9yX2RlZmF1bHQ7CiAJfQogCisJLyogdGFrZW4gd2hlbiB0aGlzIFVSQiB3YXMgc3VibWl0dGVkLiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybjsKIAogZXJyb3JfZHRvX3N1Ym1pdDoKKwkvKiB0YWtlbiBvbiByZXN1Ym1pdCBhdHRlbXB0LiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogZXJyb3JfZGVmYXVsdDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCXJwaXBlID0geGZlci0+ZXAtPmhjcHJpdjsKQEAgLTc3MiwxMiArODM5LDEwIEBACiAJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJfQogCWlmIChzZWctPnN0YXR1cyAhPSBXQV9TRUdfRVJST1IpIHsKLQkJc2VnLT5zdGF0dXMgPSBXQV9TRUdfRVJST1I7CiAJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlfX3dhX3hmZXJfYWJvcnQoeGZlcik7CiAJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJZG9uZSA9IF9fd2FfeGZlcl9pc19kb25lKHhmZXIpOworCQlkb25lID0gX193YV94ZmVyX21hcmtfc2VnX2FzX2RvbmUoeGZlciwgc2VnLCBXQV9TRUdfRVJST1IpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGhvbGRpbmdfZHRvKSB7CkBAIC03ODgsNyArODUzLDggQEAKIAkJd2FfeGZlcl9jb21wbGV0aW9uKHhmZXIpOwogCWlmIChycGlwZV9yZWFkeSkKIAkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7Ci0KKwkvKiB0YWtlbiB3aGVuIHRoaXMgVVJCIHdhcyBzdWJtaXR0ZWQuICovCisJd2FfeGZlcl9wdXQoeGZlcik7CiB9CiAKIC8qCkBAIC04NDIsMTIgKzkwOCwxMSBAQAogCQl9CiAJCWlmIChzZWctPnN0YXR1cyAhPSBXQV9TRUdfRVJST1IpIHsKIAkJCXVzYl91bmxpbmtfdXJiKHNlZy0+ZHRvX3VyYik7Ci0JCQlzZWctPnN0YXR1cyA9IFdBX1NFR19FUlJPUjsKIAkJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCQl4ZmVyLT5zZWdzX2RvbmUrKzsKIAkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKIAkJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJCWRvbmUgPSBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZSh4ZmVyLCBzZWcsCisJCQkJCVdBX1NFR19FUlJPUik7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKQEAgLTg1NSw2ICs5MjAsOCBAQAogCQlpZiAocnBpcGVfcmVhZHkpCiAJCQl3YV94ZmVyX2RlbGF5ZWRfcnVuKHJwaXBlKTsKIAl9CisJLyogdGFrZW4gd2hlbiB0aGlzIFVSQiB3YXMgc3VibWl0dGVkLiAqLworCXdhX3hmZXJfcHV0KHhmZXIpOwogfQogCiAvKgpAQCAtOTE5LDE4ICs5ODYsMTggQEAKIAkJfQogCQl1c2JfdW5saW5rX3VyYihzZWctPmlzb2NfcGFja19kZXNjX3VyYik7CiAJCXVzYl91bmxpbmtfdXJiKHNlZy0+ZHRvX3VyYik7Ci0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogCQlzZWctPnJlc3VsdCA9IHVyYi0+c3RhdHVzOwotCQl4ZmVyLT5zZWdzX2RvbmUrKzsKIAkJX193YV94ZmVyX2Fib3J0KHhmZXIpOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0VSUk9SKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKIAkJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAkJaWYgKHJwaXBlX3JlYWR5KQogCQkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7CiAJfQorCS8qIHRha2VuIHdoZW4gdGhpcyBVUkIgd2FzIHN1Ym1pdHRlZC4gKi8KKwl3YV94ZmVyX3B1dCh4ZmVyKTsKIH0KIAogLyoKQEAgLTk0MCw3ICsxMDA3LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqd2FfeGZlcl9jcmVhdGVfc3Vic2V0X3NnKHN0cnVjdCBzY2F0dGVybGlzdCAqaW5fc2csCiAJY29uc3QgdW5zaWduZWQgaW50IGJ5dGVzX3RyYW5zZmVycmVkLAotCWNvbnN0IHVuc2lnbmVkIGludCBieXRlc190b190cmFuc2ZlciwgdW5zaWduZWQgaW50ICpvdXRfbnVtX3NncykKKwljb25zdCB1bnNpZ25lZCBpbnQgYnl0ZXNfdG9fdHJhbnNmZXIsIGludCAqb3V0X251bV9zZ3MpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpvdXRfc2c7CiAJdW5zaWduZWQgaW50IGJ5dGVzX3Byb2Nlc3NlZCA9IDAsIG9mZnNldF9pbnRvX2N1cnJlbnRfcGFnZV9kYXRhID0gMCwKQEAgLTEwOTQsMTQgKzExNjEsMTMgQEAKICAqLwogc3RhdGljIGludCBfX3dhX3hmZXJfc2V0dXBfc2VncyhzdHJ1Y3Qgd2FfeGZlciAqeGZlciwgc2l6ZV90IHhmZXJfaGRyX3NpemUpCiB7Ci0JaW50IHJlc3VsdCwgY250LCBpc29fZnJhbWVfb2Zmc2V0OworCWludCByZXN1bHQsIGNudCwgaXNvY19mcmFtZV9vZmZzZXQgPSAwOwogCXNpemVfdCBhbGxvY19zaXplID0gc2l6ZW9mKCp4ZmVyLT5zZWdbMF0pCiAJCS0gc2l6ZW9mKHhmZXItPnNlZ1swXS0+eGZlcl9oZHIpICsgeGZlcl9oZHJfc2l6ZTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHhmZXItPndhLT51c2JfZGV2OwogCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZHRvX2VwZCA9IHhmZXItPndhLT5kdG9fZXBkOwogCXN0cnVjdCB3YV9zZWcgKnNlZzsKIAlzaXplX3QgYnVmX2l0ciwgYnVmX3NpemUsIGJ1Zl9pdHJfc2l6ZTsKLQlpbnQgaXNvY19mcmFtZV9vZmZzZXQgPSAwOwogCiAJcmVzdWx0ID0gLUVOT01FTTsKIAl4ZmVyLT5zZWcgPSBrY2FsbG9jKHhmZXItPnNlZ3MsIHNpemVvZih4ZmVyLT5zZWdbMF0pLCBHRlBfQVRPTUlDKTsKQEAgLTExMDksNyArMTE3NSw2IEBACiAJCWdvdG8gZXJyb3Jfc2Vnc19remFsbG9jOwogCWJ1Zl9pdHIgPSAwOwogCWJ1Zl9zaXplID0geGZlci0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwotCWlzb19mcmFtZV9vZmZzZXQgPSAwOwogCWZvciAoY250ID0gMDsgY250IDwgeGZlci0+c2VnczsgY250KyspIHsKIAkJc2l6ZV90IGlzb19wa3RfZGVzY3Jfc2l6ZSA9IDA7CiAJCWludCBzZWdfaXNvY19mcmFtZV9jb3VudCA9IDAsIHNlZ19pc29jX3NpemUgPSAwOwpAQCAtMTMxOCwzMCArMTM4Myw0MSBAQAogCS8qIGRlZmF1bHQgdG8gZG9uZSB1bmxlc3Mgd2UgZW5jb3VudGVyIGEgbXVsdGktZnJhbWUgaXNvYyBzZWdtZW50LiAqLwogCSpkdG9fZG9uZSA9IDE7CiAKKwkvKgorCSAqIFRha2UgYSByZWYgZm9yIGVhY2ggc2VnbWVudCB1cmIgc28gdGhlIHhmZXIgY2Fubm90IGRpc2FwcGVhciB1bnRpbAorCSAqIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHJ1bi4KKwkgKi8KKwl3YV94ZmVyX2dldCh4ZmVyKTsKIAkvKiBzdWJtaXQgdGhlIHRyYW5zZmVyIHJlcXVlc3QuICovCisJc2VnLT5zdGF0dXMgPSBXQV9TRUdfU1VCTUlUVEVEOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKCZzZWctPnRyX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJcHJfZXJyKCIlczogeGZlciAlcCMldTogUkVRIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIHhmZXIsIHNlZy0+aW5kZXgsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyb3Jfc2VnX3N1Ym1pdDsKKwkJd2FfeGZlcl9wdXQoeGZlcik7CisJCWdvdG8gZXJyb3JfdHJfc3VibWl0OwogCX0KIAkvKiBzdWJtaXQgdGhlIGlzb2MgcGFja2V0IGRlc2NyaXB0b3IgaWYgcHJlc2VudC4gKi8KIAlpZiAoc2VnLT5pc29jX3BhY2tfZGVzY191cmIpIHsKKwkJd2FfeGZlcl9nZXQoeGZlcik7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHNlZy0+aXNvY19wYWNrX2Rlc2NfdXJiLCBHRlBfQVRPTUlDKTsKIAkJc2VnLT5pc29jX2ZyYW1lX2luZGV4ID0gMDsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCXByX2VycigiJXM6IHhmZXIgJXAjJXU6IElTTyBwYWNrZXQgZGVzY3JpcHRvciBzdWJtaXQgZmFpbGVkOiAlZFxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgeGZlciwgc2VnLT5pbmRleCwgcmVzdWx0KTsKKwkJCXdhX3hmZXJfcHV0KHhmZXIpOwogCQkJZ290byBlcnJvcl9pc29fcGFja19kZXNjX3N1Ym1pdDsKIAkJfQogCX0KIAkvKiBzdWJtaXQgdGhlIG91dCBkYXRhIGlmIHRoaXMgaXMgYW4gb3V0IHJlcXVlc3QuICovCiAJaWYgKHNlZy0+ZHRvX3VyYikgewogCQlzdHJ1Y3Qgd2FoYyAqd2EgPSB4ZmVyLT53YTsKKwkJd2FfeGZlcl9nZXQoeGZlcik7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHNlZy0+ZHRvX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQgPCAwKSB7CiAJCQlwcl9lcnIoIiVzOiB4ZmVyICVwIyV1OiBEVE8gc3VibWl0IGZhaWxlZDogJWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHhmZXIsIHNlZy0+aW5kZXgsIHJlc3VsdCk7CisJCQl3YV94ZmVyX3B1dCh4ZmVyKTsKIAkJCWdvdG8gZXJyb3JfZHRvX3N1Ym1pdDsKIAkJfQogCQkvKgpAQCAtMTM1Myw3ICsxNDI5LDYgQEAKIAkJCSYmIChzZWctPmlzb2NfZnJhbWVfY291bnQgPiAxKSkKIAkJCSpkdG9fZG9uZSA9IDA7CiAJfQotCXNlZy0+c3RhdHVzID0gV0FfU0VHX1NVQk1JVFRFRDsKIAlycGlwZV9hdmFpbF9kZWMocnBpcGUpOwogCXJldHVybiAwOwogCkBAIC0xMzYxLDcgKzE0MzYsNyBAQAogCXVzYl91bmxpbmtfdXJiKHNlZy0+aXNvY19wYWNrX2Rlc2NfdXJiKTsKIGVycm9yX2lzb19wYWNrX2Rlc2Nfc3VibWl0OgogCXVzYl91bmxpbmtfdXJiKCZzZWctPnRyX3VyYik7Ci1lcnJvcl9zZWdfc3VibWl0OgorZXJyb3JfdHJfc3VibWl0OgogCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogCXNlZy0+cmVzdWx0ID0gcmVzdWx0OwogCSpkdG9fZG9uZSA9IDE7CkBAIC0xMzkzLDYgKzE0NjgsMTIgQEAKIAkJCQkgbGlzdF9ub2RlKTsKIAkJbGlzdF9kZWwoJnNlZy0+bGlzdF9ub2RlKTsKIAkJeGZlciA9IHNlZy0+eGZlcjsKKwkJLyoKKwkJICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB4ZmVyIGluIGNhc2UgdGhlIGNhbGxiYWNrcyBmb3IgdGhlCisJCSAqIFVSQnMgc3VibWl0dGVkIGJ5IF9fd2Ffc2VnX3N1Ym1pdCBhdHRlbXB0IHRvIGNvbXBsZXRlCisJCSAqIHRoZSB4ZmVyIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNvbXBsZXRlcy4KKwkJICovCisJCXdhX3hmZXJfZ2V0KHhmZXIpOwogCQlyZXN1bHQgPSBfX3dhX3NlZ19zdWJtaXQocnBpcGUsIHhmZXIsIHNlZywgJmR0b19kb25lKTsKIAkJLyogcmVsZWFzZSB0aGUgZHRvIHJlc291cmNlIGlmIHRoaXMgUlBJUEUgaXMgZG9uZSB3aXRoIGl0LiAqLwogCQlpZiAoZHRvX2RvbmUpCkBAIC0xNDAxLDEzICsxNDgyLDIzIEBACiAJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAogCQkJYXRvbWljX3JlYWQoJnJwaXBlLT5zZWdzX2F2YWlsYWJsZSksIHJlc3VsdCk7CiAJCWlmICh1bmxpa2VseShyZXN1bHQgPCAwKSkgeworCQkJaW50IGRvbmU7CisKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKKwkJCS8qCisJCQkgKiBUaGlzIHNlZyB3YXMgbWFya2VkIGFzIHN1Ym1pdHRlZCB3aGVuIGl0IHdhcyBwdXQgb24KKwkJCSAqIHRoZSBSUElQRSBzZWdfbGlzdC4gIE1hcmsgaXQgZG9uZS4KKwkJCSAqLwogCQkJeGZlci0+c2Vnc19kb25lKys7CisJCQlkb25lID0gX193YV94ZmVyX2lzX2RvbmUoeGZlcik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoZG9uZSkKKwkJCQl3YV94ZmVyX2NvbXBsZXRpb24oeGZlcik7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBpcGUtPnNlZ19sb2NrLCBmbGFncyk7CiAJCX0KKwkJd2FfeGZlcl9wdXQoeGZlcik7CiAJfQogCS8qCiAJICogTWFyayB0aGlzIFJQSVBFIGFzIHdhaXRpbmcgaWYgZHRvIHdhcyBub3QgYWNxdWlyZWQsIHRoZXJlIGFyZQpAQCAtMTU5MiwxMiArMTY4MywxOSBAQAogCQlkZXZfZXJyKCYodXJiLT5kZXYtPmRldiksICIlczogZXJyb3JfeGZlcl9zZXR1cFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3hmZXJfc2V0dXA7CiAJfQorCS8qCisJICogR2V0IGEgeGZlciByZWZlcmVuY2Ugc2luY2UgX193YV94ZmVyX3N1Ym1pdCBzdGFydHMgYXN5bmNocm9ub3VzCisJICogb3BlcmF0aW9ucyB0aGF0IG1heSB0cnkgdG8gY29tcGxldGUgdGhlIHhmZXIgYmVmb3JlIHRoaXMgZnVuY3Rpb24KKwkgKiBleGl0cy4KKwkgKi8KKwl3YV94ZmVyX2dldCh4ZmVyKTsKIAlyZXN1bHQgPSBfX3dhX3hmZXJfc3VibWl0KHhmZXIpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCWRldl9lcnIoJih1cmItPmRldi0+ZGV2KSwgIiVzOiBlcnJvcl94ZmVyX3N1Ym1pdFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3hmZXJfc3VibWl0OwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CisJd2FfeGZlcl9wdXQoeGZlcik7CiAJcmV0dXJuIDA7CiAKIAkvKgpAQCAtMTYyMyw2ICsxNzIxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRvbmUpCiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKKwl3YV94ZmVyX3B1dCh4ZmVyKTsKIAkvKiByZXR1cm4gc3VjY2VzcyBzaW5jZSB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgcnVuLiAqLwogCXJldHVybiAwOwogfQpAQCAtMTgzMiwyMCArMTkzMSwyMCBAQAogCS8qIGNoZWNrIGlmIGl0IGlzIHNhZmUgdG8gdW5saW5rLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZ3YS0+eGZlcl9saXN0X2xvY2ssIGZsYWdzKTsKIAlyZXN1bHQgPSB1c2JfaGNkX2NoZWNrX3VubGlua191cmIoJih3YS0+d3VzYi0+dXNiX2hjZCksIHVyYiwgc3RhdHVzKTsKKwlpZiAoKHJlc3VsdCA9PSAwKSAmJiB1cmItPmhjcHJpdikgeworCQkvKgorCQkgKiBHZXQgYSB4ZmVyIHJlZiB0byBwcmV2ZW50IGEgcmFjZSB3aXRoIHdhX3hmZXJfZ2l2ZWJhY2sKKwkJICogY2xlYW5pbmcgdXAgdGhlIHhmZXIgd2hpbGUgd2UgYXJlIHdvcmtpbmcgd2l0aCBpdC4KKwkJICovCisJCXdhX3hmZXJfZ2V0KHVyYi0+aGNwcml2KTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2EtPnhmZXJfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKIAogCXhmZXIgPSB1cmItPmhjcHJpdjsKLQlpZiAoeGZlciA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIE5vdGhpbmcgc2V0dXAgeWV0IGVucXVldWUgd2lsbCBzZWUgdXJiLT5zdGF0dXMgIT0KLQkJICogLUVJTlBST0dSRVNTIChieSBoY2QgbGF5ZXIpIGFuZCBiYWlsIG91dCB3aXRoCi0JCSAqIGVycm9yLCBubyBuZWVkIHRvIGRvIGNvbXBsZXRpb24KLQkJICovCi0JCUJVR19PTih1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHhmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAlwcl9kZWJ1ZygiJXM6IERFUVVFVUUgeGZlciBpZCAweCUwOFhcbiIsIF9fZnVuY19fLCB3YV94ZmVyX2lkKHhmZXIpKTsKIAlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CkBAIC0xODU2LDYgKzE5NTUsMTYgQEAKIAkJcmVzdWx0ID0gLUVOT0VOVDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwkvKgorCSAqIENoZWNrIGZvciBkb25lIHRvIGF2b2lkIHJhY2luZyB3aXRoIHdhX3hmZXJfZ2l2ZWJhY2sgYW5kIGNvbXBsZXRpbmcKKwkgKiB0d2ljZS4KKwkgKi8KKwlpZiAoX193YV94ZmVyX2lzX2RvbmUoeGZlcikpIHsKKwkJcHJfZGVidWcoIiVzOiB4ZmVyICVwIGlkIDB4JTA4WCBhbHJlYWR5IGRvbmUuXG4iLCBfX2Z1bmNfXywKKwkJCXhmZXIsIHdhX3hmZXJfaWQoeGZlcikpOworCQlyZXN1bHQgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCS8qIENoZWNrIHRoZSBkZWxheWVkIGxpc3QgLT4gaWYgdGhlcmUsIHJlbGVhc2UgYW5kIGNvbXBsZXRlICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndhLT54ZmVyX2xpc3RfbG9jaywgZmxhZ3MyKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnhmZXItPmxpc3Rfbm9kZSkgJiYgeGZlci0+c2VnID09IE5VTEwpCkBAIC0xODY1LDYgKzE5NzQsMTEgQEAKIAkJZ290byBvdXRfdW5sb2NrOwkvKiBzZXR1cCgpLCBlbnF1ZXVlX2IoKSBjb21wbGV0ZXMgKi8KIAkvKiBPaywgdGhlIHhmZXIgaXMgaW4gZmxpZ2h0IGFscmVhZHksIGl0J3MgYmVlbiBzZXR1cCBhbmQgc3VibWl0dGVkLiovCiAJeGZlcl9hYm9ydF9wZW5kaW5nID0gX193YV94ZmVyX2Fib3J0KHhmZXIpID49IDA7CisJLyoKKwkgKiBncmFiIHRoZSBycGlwZS0+c2VnX2xvY2sgaGVyZSB0byBwcmV2ZW50IHJhY2luZyB3aXRoCisJICogX193YV94ZmVyX2RlbGF5ZWRfcnVuLgorCSAqLworCXNwaW5fbG9jaygmcnBpcGUtPnNlZ19sb2NrKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHhmZXItPnNlZ3M7IGNudCsrKSB7CiAJCXNlZyA9IHhmZXItPnNlZ1tjbnRdOwogCQlwcl9kZWJ1ZygiJXM6IHhmZXIgaWQgMHglMDhYIyVkIHN0YXR1cyA9ICVkXG4iLApAQCAtMTg4NSwxNiArMTk5OSwyNCBAQAogCQkJICovCiAJCQlzZWctPnN0YXR1cyA9IFdBX1NFR19BQk9SVEVEOwogCQkJc2VnLT5yZXN1bHQgPSAtRU5PRU5UOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MyKTsKIAkJCWxpc3RfZGVsKCZzZWctPmxpc3Rfbm9kZSk7CiAJCQl4ZmVyLT5zZWdzX2RvbmUrKzsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwaXBlLT5zZWdfbG9jaywgZmxhZ3MyKTsKIAkJCWJyZWFrOwogCQljYXNlIFdBX1NFR19ET05FOgogCQljYXNlIFdBX1NFR19FUlJPUjoKIAkJY2FzZSBXQV9TRUdfQUJPUlRFRDoKIAkJCWJyZWFrOwogCQkJLyoKKwkJCSAqIFRoZSBidWZfaW4gZGF0YSBmb3IgYSBzZWdtZW50IGluIHRoZQorCQkJICogV0FfU0VHX0RUSV9QRU5ESU5HIHN0YXRlIGlzIGFjdGl2ZWx5IGJlaW5nIHJlYWQuCisJCQkgKiBMZXQgd2FfYnVmX2luX2NiIGhhbmRsZSBpdCBzaW5jZSBpdCB3aWxsIGJlIGNhbGxlZAorCQkJICogYW5kIHdpbGwgaW5jcmVtZW50IHhmZXItPnNlZ3NfZG9uZS4gIENsZWFuaW5nIHVwCisJCQkgKiBoZXJlIGNvdWxkIGNhdXNlIHdhX2J1Zl9pbl9jYiB0byBhY2Nlc3MgdGhlIHhmZXIKKwkJCSAqIGFmdGVyIGl0IGhhcyBiZWVuIGNvbXBsZXRlZC9mcmVlZC4KKwkJCSAqLworCQljYXNlIFdBX1NFR19EVElfUEVORElORzoKKwkJCWJyZWFrOworCQkJLyoKIAkJCSAqIEluIHRoZSBzdGF0ZXMgYmVsb3csIHRoZSBIV0EgZGV2aWNlIGFscmVhZHkga25vd3MKIAkJCSAqIGFib3V0IHRoZSB0cmFuc2Zlci4gIElmIGFuIGFib3J0IHJlcXVlc3Qgd2FzIHNlbnQsCiAJCQkgKiBhbGxvdyB0aGUgSFdBIHRvIHByb2Nlc3MgaXQgYW5kIHdhaXQgZm9yIHRoZQpAQCAtMTkwMyw3ICsyMDI1LDYgQEAKIAkJCSAqLwogCQljYXNlIFdBX1NFR19TVUJNSVRURUQ6CiAJCWNhc2UgV0FfU0VHX1BFTkRJTkc6Ci0JCWNhc2UgV0FfU0VHX0RUSV9QRU5ESU5HOgogCQkJLyoKIAkJCSAqIENoZWNrIGlmIHRoZSBhYm9ydCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQuICBUaGlzIGNvdWxkCiAJCQkgKiBiZSBmYWxzZSBpZiB0aGUgSFdBIGhhcyBiZWVuIHJlbW92ZWQgYnV0IHdlIGhhdmVuJ3QKQEAgLTE5MTcsNiArMjAzOCw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlzcGluX3VubG9jaygmcnBpcGUtPnNlZ19sb2NrKTsKIAl4ZmVyLT5yZXN1bHQgPSB1cmItPnN0YXR1czsJLyogLUVOT0VOVCBvciAtRUNPTk5SRVNFVCAqLwogCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CkBAIC0xOTI0LDExICsyMDQ2LDEyIEBACiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAlpZiAocnBpcGVfcmVhZHkpCiAJCXdhX3hmZXJfZGVsYXllZF9ydW4ocnBpcGUpOworCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybiByZXN1bHQ7CiAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwotb3V0OgorCXdhX3hmZXJfcHV0KHhmZXIpOwogCXJldHVybiByZXN1bHQ7CiAKIGRlcXVldWVfZGVsYXllZDoKQEAgLTE5MzcsNiArMjA2MCw3IEBACiAJeGZlci0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCXdhX3hmZXJfZ2l2ZWJhY2soeGZlcik7CisJd2FfeGZlcl9wdXQoeGZlcik7CiAJdXNiX3B1dF91cmIodXJiKTsJCS8qIHdlIGdvdCBhIHJlZiBpbiBlbnF1ZXVlKCkgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTE5OTYsMTUgKzIxMjAsMTcgQEAKICAqIG5vIG90aGVyIHNlZ21lbnQgdHJhbnNmZXIgcmVzdWx0cyB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIGRldmljZS4KICAqIE1hcmsgdGhlIHJlbWFpbmluZyBzdWJtaXR0ZWQgb3IgcGVuZGluZyB4ZmVycyBhcyBjb21wbGV0ZWQgc28gdGhhdAogICogdGhlIHhmZXIgd2lsbCBjb21wbGV0ZSBjbGVhbmx5LgorICoKKyAqIHhmZXItPmxvY2sgbXVzdCBiZSBoZWxkCisgKgogICovCiBzdGF0aWMgdm9pZCB3YV9jb21wbGV0ZV9yZW1haW5pbmdfeGZlcl9zZWdzKHN0cnVjdCB3YV94ZmVyICp4ZmVyLAotCQlzdHJ1Y3Qgd2Ffc2VnICppbmNvbWluZ19zZWcsIGVudW0gd2Ffc2VnX3N0YXR1cyBzdGF0dXMpCisJCWludCBzdGFydGluZ19pbmRleCwgZW51bSB3YV9zZWdfc3RhdHVzIHN0YXR1cykKIHsKIAlpbnQgaW5kZXg7CiAJc3RydWN0IHdhX3JwaXBlICpycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CiAKLQlmb3IgKGluZGV4ID0gaW5jb21pbmdfc2VnLT5pbmRleCArIDE7IGluZGV4IDwgeGZlci0+c2Vnc19zdWJtaXR0ZWQ7Ci0JCWluZGV4KyspIHsKKwlmb3IgKGluZGV4ID0gc3RhcnRpbmdfaW5kZXg7IGluZGV4IDwgeGZlci0+c2Vnc19zdWJtaXR0ZWQ7IGluZGV4KyspIHsKIAkJc3RydWN0IHdhX3NlZyAqY3VycmVudF9zZWcgPSB4ZmVyLT5zZWdbaW5kZXhdOwogCiAJCUJVR19PTihjdXJyZW50X3NlZyA9PSBOVUxMKTsKQEAgLTIwMzMsNzMgKzIxNTksMTEwIEBACiAJfQogfQogCi0vKiBQb3B1bGF0ZSB0aGUgd2EtPmJ1Zl9pbl91cmIgYmFzZWQgb24gdGhlIGN1cnJlbnQgaXNvYyB0cmFuc2ZlciBzdGF0ZS4gKi8KLXN0YXRpYyB2b2lkIF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX3hmZXIgKnhmZXIsCi0Jc3RydWN0IHdhX3NlZyAqc2VnLCBpbnQgY3Vycl9pc29fZnJhbWUpCisvKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IGlzb2MgdHJhbnNmZXIgc3RhdGUuICovCitzdGF0aWMgaW50IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHN0cnVjdCB3YWhjICp3YSwKKwlzdHJ1Y3QgdXJiICpidWZfaW5fdXJiLCBzdHJ1Y3Qgd2FfeGZlciAqeGZlciwgc3RydWN0IHdhX3NlZyAqc2VnKQogewotCUJVR19PTih3YS0+YnVmX2luX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyk7CisJaW50IHVyYl9zdGFydF9mcmFtZSA9IHNlZy0+aXNvY19mcmFtZV9pbmRleCArIHNlZy0+aXNvY19mcmFtZV9vZmZzZXQ7CisJaW50IHNlZ19pbmRleCwgdG90YWxfbGVuID0gMCwgdXJiX2ZyYW1lX2luZGV4ID0gdXJiX3N0YXJ0X2ZyYW1lOworCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9CisJCQkJCQl4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjOworCWNvbnN0IGludCBkdGlfcGFja2V0X3NpemUgPSB1c2JfZW5kcG9pbnRfbWF4cCh3YS0+ZHRpX2VwZCk7CisJaW50IG5leHRfZnJhbWVfY29udGlndW91czsKKwlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqaXNvX2ZyYW1lOworCisJQlVHX09OKGJ1Zl9pbl91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpOworCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCBmcmFtZSBhY3R1YWxfbGVuZ3RoIGlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgbmV4dCBmcmFtZQorCSAqIGFuZCBhY3R1YWxfbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgdGhlIERUSSBlbmRwb2ludCBtYXggcGFja2V0IHNpemUsCisJICogY29tYmluZSB0aGUgY3VycmVudCBmcmFtZSB3aXRoIHRoZSBuZXh0IGZyYW1lIGluIGEgc2luZ2xlIFVSQi4gIFRoaXMKKwkgKiByZWR1Y2VzIHRoZSBudW1iZXIgb2YgVVJCcyB0aGF0IG11c3QgYmUgc3VibWl0dGVkIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlzZWdfaW5kZXggPSBzZWctPmlzb2NfZnJhbWVfaW5kZXg7CisJZG8geworCQluZXh0X2ZyYW1lX2NvbnRpZ3VvdXMgPSAwOworCisJCWlzb19mcmFtZSA9ICZpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdOworCQl0b3RhbF9sZW4gKz0gaXNvX2ZyYW1lLT5hY3R1YWxfbGVuZ3RoOworCQkrK3VyYl9mcmFtZV9pbmRleDsKKwkJKytzZWdfaW5kZXg7CisKKwkJaWYgKHNlZ19pbmRleCA8IHNlZy0+aXNvY19mcmFtZV9jb3VudCkgeworCQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKm5leHRfaXNvX2ZyYW1lOworCisJCQluZXh0X2lzb19mcmFtZSA9ICZpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdOworCisJCQlpZiAoKGlzb19mcmFtZS0+b2Zmc2V0ICsgaXNvX2ZyYW1lLT5hY3R1YWxfbGVuZ3RoKSA9PQorCQkJCW5leHRfaXNvX2ZyYW1lLT5vZmZzZXQpCisJCQkJbmV4dF9mcmFtZV9jb250aWd1b3VzID0gMTsKKwkJfQorCX0gd2hpbGUgKG5leHRfZnJhbWVfY29udGlndW91cworCQkJJiYgKChpc29fZnJhbWUtPmFjdHVhbF9sZW5ndGggJSBkdGlfcGFja2V0X3NpemUpID09IDApKTsKIAogCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSAwIGJlZm9yZSBhIHJlc3VibWl0LiAqLwotCXdhLT5idWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7Ci0Jd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2RtYSA9IHhmZXItPnVyYi0+dHJhbnNmZXJfZG1hICsKLQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzY1tjdXJyX2lzb19mcmFtZV0ub2Zmc2V0OwotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0KLQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzY1tjdXJyX2lzb19mcmFtZV0ubGVuZ3RoOwotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQl3YS0+YnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQl3YS0+YnVmX2luX3VyYi0+c2cgPSBOVUxMOwotCXdhLT5idWZfaW5fdXJiLT5udW1fc2dzID0gMDsKLQl3YS0+YnVmX2luX3VyYi0+Y29udGV4dCA9IHNlZzsKKwlidWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7CisJYnVmX2luX3VyYi0+dHJhbnNmZXJfZG1hID0geGZlci0+dXJiLT50cmFuc2Zlcl9kbWEgKworCQlpc29fZnJhbWVfZGVzY1t1cmJfc3RhcnRfZnJhbWVdLm9mZnNldDsKKwlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdG90YWxfbGVuOworCWJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCWJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJYnVmX2luX3VyYi0+c2cgPSBOVUxMOworCWJ1Zl9pbl91cmItPm51bV9zZ3MgPSAwOworCWJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CisKKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBmcmFtZXMgaW5jbHVkZWQgaW4gdGhpcyBVUkIuICovCisJcmV0dXJuIHNlZ19pbmRleCAtIHNlZy0+aXNvY19mcmFtZV9pbmRleDsKIH0KIAotLyogUG9wdWxhdGUgdGhlIHdhLT5idWZfaW5fdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXRlLiAqLwotc3RhdGljIGludCB3YV9wb3B1bGF0ZV9idWZfaW5fdXJiKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX3hmZXIgKnhmZXIsCisvKiBQb3B1bGF0ZSB0aGUgZ2l2ZW4gdXJiIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXRlLiAqLworc3RhdGljIGludCB3YV9wb3B1bGF0ZV9idWZfaW5fdXJiKHN0cnVjdCB1cmIgKmJ1Zl9pbl91cmIsIHN0cnVjdCB3YV94ZmVyICp4ZmVyLAogCXVuc2lnbmVkIGludCBzZWdfaWR4LCB1bnNpZ25lZCBpbnQgYnl0ZXNfdHJhbnNmZXJyZWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHdhX3NlZyAqc2VnID0geGZlci0+c2VnW3NlZ19pZHhdOwogCi0JQlVHX09OKHdhLT5idWZfaW5fdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKTsKKwlCVUdfT04oYnVmX2luX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyk7CiAJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIDAgYmVmb3JlIGEgcmVzdWJtaXQuICovCi0Jd2EtPmJ1Zl9pbl91cmItPm51bV9tYXBwZWRfc2dzCT0gMDsKKwlidWZfaW5fdXJiLT5udW1fbWFwcGVkX3Nncwk9IDA7CiAKIAlpZiAoeGZlci0+aXNfZG1hKSB7Ci0JCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9kbWEgPSB4ZmVyLT51cmItPnRyYW5zZmVyX2RtYQorCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9kbWEgPSB4ZmVyLT51cmItPnRyYW5zZmVyX2RtYQogCQkJKyAoc2VnX2lkeCAqIHhmZXItPnNlZ19zaXplKTsKLQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCQl3YS0+YnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQkJd2EtPmJ1Zl9pbl91cmItPnNnID0gTlVMTDsKLQkJd2EtPmJ1Zl9pbl91cmItPm51bV9zZ3MgPSAwOworCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJYnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJYnVmX2luX3VyYi0+c2cgPSBOVUxMOworCQlidWZfaW5fdXJiLT5udW1fc2dzID0gMDsKIAl9IGVsc2UgewogCQkvKiBkbyBidWZmZXIgb3IgU0cgcHJvY2Vzc2luZy4gKi8KLQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJYnVmX2luX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCiAJCWlmICh4ZmVyLT51cmItPnRyYW5zZmVyX2J1ZmZlcikgewotCQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIgPQogCQkJCXhmZXItPnVyYi0+dHJhbnNmZXJfYnVmZmVyCiAJCQkJKyAoc2VnX2lkeCAqIHhmZXItPnNlZ19zaXplKTsKLQkJCXdhLT5idWZfaW5fdXJiLT5zZyA9IE5VTEw7Ci0JCQl3YS0+YnVmX2luX3VyYi0+bnVtX3NncyA9IDA7CisJCQlidWZfaW5fdXJiLT5zZyA9IE5VTEw7CisJCQlidWZfaW5fdXJiLT5udW1fc2dzID0gMDsKIAkJfSBlbHNlIHsKIAkJCS8qIGFsbG9jYXRlIGFuIFNHIGxpc3QgdG8gc3RvcmUgc2VnX3NpemUgYnl0ZXMKIAkJCQlhbmQgY29weSB0aGUgc3Vic2V0IG9mIHRoZSB4ZmVyLT51cmItPnNnCiAJCQkJdGhhdCBtYXRjaGVzIHRoZSBidWZmZXIgc3Vic2V0IHdlIGFyZQogCQkJCWFib3V0IHRvIHJlYWQuICovCi0JCQl3YS0+YnVmX2luX3VyYi0+c2cgPSB3YV94ZmVyX2NyZWF0ZV9zdWJzZXRfc2coCisJCQlidWZfaW5fdXJiLT5zZyA9IHdhX3hmZXJfY3JlYXRlX3N1YnNldF9zZygKIAkJCQl4ZmVyLT51cmItPnNnLAogCQkJCXNlZ19pZHggKiB4ZmVyLT5zZWdfc2l6ZSwKIAkJCQlieXRlc190cmFuc2ZlcnJlZCwKLQkJCQkmKHdhLT5idWZfaW5fdXJiLT5udW1fc2dzKSk7CisJCQkJJihidWZfaW5fdXJiLT5udW1fc2dzKSk7CiAKLQkJCWlmICghKHdhLT5idWZfaW5fdXJiLT5zZykpIHsKLQkJCQl3YS0+YnVmX2luX3VyYi0+bnVtX3Nncwk9IDA7CisJCQlpZiAoIShidWZfaW5fdXJiLT5zZykpIHsKKwkJCQlidWZfaW5fdXJiLT5udW1fc2dzCT0gMDsKIAkJCQlyZXN1bHQgPSAtRU5PTUVNOwogCQkJfQotCQkJd2EtPmJ1Zl9pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQlidWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwogCQl9CiAJfQotCXdhLT5idWZfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0Jd2EtPmJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CisJYnVmX2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGJ5dGVzX3RyYW5zZmVycmVkOworCWJ1Zl9pbl91cmItPmNvbnRleHQgPSBzZWc7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjEyNCw2ICsyMjg3LDcgQEAKIAl1OCB1c2Jfc3RhdHVzOwogCXVuc2lnbmVkIHJwaXBlX3JlYWR5ID0gMDsKIAl1bnNpZ25lZCBieXRlc190cmFuc2ZlcnJlZCA9IGxlMzJfdG9fY3B1KHhmZXJfcmVzdWx0LT5kd1RyYW5zZmVyTGVuZ3RoKTsKKwlzdHJ1Y3QgdXJiICpidWZfaW5fdXJiID0gJih3YS0+YnVmX2luX3VyYnNbMF0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAlzZWdfaWR4ID0geGZlcl9yZXN1bHQtPmJUcmFuc2ZlclNlZ21lbnQgJiAweDdmOwpAQCAtMjE0Nyw3ICsyMzExLDcgQEAKIAl9CiAJaWYgKHVzYl9zdGF0dXMgJiAweDgwKSB7CiAJCXNlZy0+cmVzdWx0ID0gd2FfeGZlcl9zdGF0dXNfdG9fZXJybm8odXNiX3N0YXR1cyk7Ci0JCWRldl9lcnIoZGV2LCAiRFRJOiB4ZmVyICVwIzolMDhYOiV1IGZhaWxlZCAoMHglMDJ4KVxuIiwKKwkJZGV2X2VycihkZXYsICJEVEk6IHhmZXIgJXAgMHglMDhYOiMldSBmYWlsZWQgKDB4JTAyeClcbiIsCiAJCQl4ZmVyLCB4ZmVyLT5pZCwgc2VnLT5pbmRleCwgdXNiX3N0YXR1cyk7CiAJCXNlZy0+c3RhdHVzID0gKCh1c2Jfc3RhdHVzICYgMHg3RikgPT0gV0FfWEZFUl9TVEFUVVNfQUJPUlRFRCkgPwogCQkJV0FfU0VHX0FCT1JURUQgOiBXQV9TRUdfRVJST1I7CkBAIC0yMTYyLDcgKzIzMjYsOCBAQAogCSAqIHRyYW5zZmVycyB3aXRoIGRhdGEgb3IgYmVsb3cgZm9yIG5vIGRhdGEsIHRoZSB4ZmVyIHdpbGwgY29tcGxldGUuCiAJICovCiAJaWYgKHhmZXJfcmVzdWx0LT5iVHJhbnNmZXJTZWdtZW50ICYgMHg4MCkKLQkJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWcsIFdBX1NFR19ET05FKTsKKwkJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWctPmluZGV4ICsgMSwKKwkJCVdBX1NFR19ET05FKTsKIAlpZiAodXNiX3BpcGVpc29jKHhmZXItPnVyYi0+cGlwZSkKIAkJJiYgKGxlMzJfdG9fY3B1KHhmZXJfcmVzdWx0LT5kd051bU9mUGFja2V0cykgPiAwKSkgewogCQkvKiBzZXQgdXAgV0Egc3RhdGUgdG8gcmVhZCB0aGUgaXNvYyBwYWNrZXQgc3RhdHVzIG5leHQuICovCkBAIC0yMTczLDIwICsyMzM4LDIxIEBACiAJCQkmJiAoYnl0ZXNfdHJhbnNmZXJyZWQgPiAwKSkgewogCQkvKiBJTiBkYXRhIHBoYXNlOiByZWFkIHRvIGJ1ZmZlciAqLwogCQlzZWctPnN0YXR1cyA9IFdBX1NFR19EVElfUEVORElORzsKLQkJcmVzdWx0ID0gd2FfcG9wdWxhdGVfYnVmX2luX3VyYih3YSwgeGZlciwgc2VnX2lkeCwKKwkJcmVzdWx0ID0gd2FfcG9wdWxhdGVfYnVmX2luX3VyYihidWZfaW5fdXJiLCB4ZmVyLCBzZWdfaWR4LAogCQkJYnl0ZXNfdHJhbnNmZXJyZWQpOwogCQlpZiAocmVzdWx0IDwgMCkKIAkJCWdvdG8gZXJyb3JfYnVmX2luX3BvcHVsYXRlOwotCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih3YS0+YnVmX2luX3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChyZXN1bHQgPCAwKQorCQkrKyh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoYnVmX2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQktLSh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKIAkJCWdvdG8gZXJyb3Jfc3VibWl0X2J1Zl9pbjsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIE9VVCBkYXRhIHBoYXNlIG9yIG5vIGRhdGEsIGNvbXBsZXRlIGl0IC0tICovCi0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0RPTkU7CiAJCXNlZy0+cmVzdWx0ID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0RPTkUpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGRvbmUpCkBAIC0yMjA1LDE1ICsyMzcxLDE1IEBACiAJCWRldl9lcnIoZGV2LCAieGZlciAlcCMldTogY2FuJ3Qgc3VibWl0IERUSSBkYXRhIHBoYXNlOiAlZFxuIiwKIAkJCXhmZXIsIHNlZ19pZHgsIHJlc3VsdCk7CiAJc2VnLT5yZXN1bHQgPSByZXN1bHQ7Ci0Ja2ZyZWUod2EtPmJ1Zl9pbl91cmItPnNnKTsKLQl3YS0+YnVmX2luX3VyYi0+c2cgPSBOVUxMOworCWtmcmVlKGJ1Zl9pbl91cmItPnNnKTsKKwlidWZfaW5fdXJiLT5zZyA9IE5VTEw7CiBlcnJvcl9idWZfaW5fcG9wdWxhdGU6CiAJX193YV94ZmVyX2Fib3J0KHhmZXIpOwogCXNlZy0+c3RhdHVzID0gV0FfU0VHX0VSUk9SOwogZXJyb3JfY29tcGxldGU6CiAJeGZlci0+c2Vnc19kb25lKys7CiAJcnBpcGVfcmVhZHkgPSBycGlwZV9hdmFpbF9pbmMocnBpcGUpOwotCXdhX2NvbXBsZXRlX3JlbWFpbmluZ194ZmVyX3NlZ3MoeGZlciwgc2VnLCBzZWctPnN0YXR1cyk7CisJd2FfY29tcGxldGVfcmVtYWluaW5nX3hmZXJfc2Vncyh4ZmVyLCBzZWctPmluZGV4ICsgMSwgc2VnLT5zdGF0dXMpOwogCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKIAkvKgogCSAqIHF1ZXVlIHdvcmsgaXRlbSB0byBjbGVhciBTVEFMTCBmb3IgY29udHJvbCBlbmRwb2ludHMuCkBAIC0yMzE1LDE2ICsyNDgxLDE2IEBACiAJZm9yIChzZWdfaW5kZXggPSAwOyBzZWdfaW5kZXggPCBzZWctPmlzb2NfZnJhbWVfY291bnQ7ICsrc2VnX2luZGV4KSB7CiAJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9CiAJCQl4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjOwotCQljb25zdCBpbnQgdXJiX2ZyYW1lX2luZGV4ID0KKwkJY29uc3QgaW50IHhmZXJfZnJhbWVfaW5kZXggPQogCQkJc2VnLT5pc29jX2ZyYW1lX29mZnNldCArIHNlZ19pbmRleDsKIAotCQlpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdLnN0YXR1cyA9CisJCWlzb19mcmFtZV9kZXNjW3hmZXJfZnJhbWVfaW5kZXhdLnN0YXR1cyA9CiAJCQl3YV94ZmVyX3N0YXR1c190b19lcnJubygKIAkJCWxlMTZfdG9fY3B1KHN0YXR1c19hcnJheVtzZWdfaW5kZXhdLlBhY2tldFN0YXR1cykpOwotCQlpc29fZnJhbWVfZGVzY1t1cmJfZnJhbWVfaW5kZXhdLmFjdHVhbF9sZW5ndGggPQorCQlpc29fZnJhbWVfZGVzY1t4ZmVyX2ZyYW1lX2luZGV4XS5hY3R1YWxfbGVuZ3RoID0KIAkJCWxlMTZfdG9fY3B1KHN0YXR1c19hcnJheVtzZWdfaW5kZXhdLlBhY2tldExlbmd0aCk7CiAJCS8qIHRyYWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZC4gKi8KLQkJaWYgKGlzb19mcmFtZV9kZXNjW3VyYl9mcmFtZV9pbmRleF0uYWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJaWYgKGlzb19mcmFtZV9kZXNjW3hmZXJfZnJhbWVfaW5kZXhdLmFjdHVhbF9sZW5ndGggPiAwKSB7CiAJCQkvKiBzYXZlIHRoZSBzdGFydGluZyBmcmFtZSBpbmRleCBmb3IgYnVmX2luX3VyYi4gKi8KIAkJCWlmICghZGF0YV9mcmFtZV9jb3VudCkKIAkJCQlmaXJzdF9mcmFtZV9pbmRleCA9IHNlZ19pbmRleDsKQEAgLTIzMzMsMzAgKzI0OTksNjQgQEAKIAl9CiAKIAlpZiAoeGZlci0+aXNfaW5ib3VuZCAmJiBkYXRhX2ZyYW1lX2NvdW50KSB7Ci0JCWludCByZXN1bHQ7CisJCWludCByZXN1bHQsIHRvdGFsX2ZyYW1lc19yZWFkID0gMCwgdXJiX2luZGV4ID0gMDsKKwkJc3RydWN0IHVyYiAqYnVmX2luX3VyYjsKIAorCQkvKiBJTiBkYXRhIHBoYXNlOiByZWFkIHRvIGJ1ZmZlciAqLworCQlzZWctPnN0YXR1cyA9IFdBX1NFR19EVElfUEVORElORzsKKworCQkvKiBzdGFydCB3aXRoIHRoZSBmaXJzdCBmcmFtZSB3aXRoIGRhdGEuICovCiAJCXNlZy0+aXNvY19mcmFtZV9pbmRleCA9IGZpcnN0X2ZyYW1lX2luZGV4OwotCQkvKiBzdWJtaXQgYSByZWFkIFVSQiBmb3IgdGhlIGZpcnN0IGZyYW1lIHdpdGggZGF0YS4gKi8KLQkJX193YV9wb3B1bGF0ZV9idWZfaW5fdXJiX2lzb2Mod2EsIHhmZXIsIHNlZywKLQkJCXNlZy0+aXNvY19mcmFtZV9pbmRleCArIHNlZy0+aXNvY19mcmFtZV9vZmZzZXQpOworCQkvKiBzdWJtaXQgdXAgdG8gV0FfTUFYX0JVRl9JTl9VUkJTIHJlYWQgVVJCcy4gKi8KKwkJZG8geworCQkJaW50IHVyYl9mcmFtZV9pbmRleCwgdXJiX2ZyYW1lX2NvdW50OworCQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmlzb19mcmFtZV9kZXNjOwogCi0JCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5idWZfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJCWJ1Zl9pbl91cmIgPSAmKHdhLT5idWZfaW5fdXJic1t1cmJfaW5kZXhdKTsKKwkJCXVyYl9mcmFtZV9jb3VudCA9IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHdhLAorCQkJCWJ1Zl9pbl91cmIsIHhmZXIsIHNlZyk7CisJCQkvKiBhZHZhbmNlIGZyYW1lIGluZGV4IHRvIHN0YXJ0IG9mIG5leHQgcmVhZCBVUkIuICovCisJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKz0gdXJiX2ZyYW1lX2NvdW50OworCQkJdG90YWxfZnJhbWVzX3JlYWQgKz0gdXJiX2ZyYW1lX2NvdW50OworCisJCQkrKyh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKKwkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKGJ1Zl9pbl91cmIsIEdGUF9BVE9NSUMpOworCisJCQkvKiBza2lwIDAtYnl0ZSBmcmFtZXMuICovCisJCQl1cmJfZnJhbWVfaW5kZXggPQorCQkJCXNlZy0+aXNvY19mcmFtZV9vZmZzZXQgKyBzZWctPmlzb2NfZnJhbWVfaW5kZXg7CisJCQlpc29fZnJhbWVfZGVzYyA9CisJCQkJJih4ZmVyLT51cmItPmlzb19mcmFtZV9kZXNjW3VyYl9mcmFtZV9pbmRleF0pOworCQkJd2hpbGUgKChzZWctPmlzb2NfZnJhbWVfaW5kZXggPAorCQkJCQkJc2VnLT5pc29jX2ZyYW1lX2NvdW50KSAmJgorCQkJCSAoaXNvX2ZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGggPT0gMCkpIHsKKwkJCQkrKyhzZWctPmlzb2NfZnJhbWVfaW5kZXgpOworCQkJCSsraXNvX2ZyYW1lX2Rlc2M7CisJCQl9CisJCQkrK3VyYl9pbmRleDsKKworCQl9IHdoaWxlICgocmVzdWx0ID09IDApICYmICh1cmJfaW5kZXggPCBXQV9NQVhfQlVGX0lOX1VSQlMpCisJCQkJJiYgKHNlZy0+aXNvY19mcmFtZV9pbmRleCA8CisJCQkJCQlzZWctPmlzb2NfZnJhbWVfY291bnQpKTsKKwogCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLS0od2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CiAJCQlkZXZfZXJyKGRldiwgIkRUSSBFcnJvcjogQ291bGQgbm90IHN1Ym1pdCBidWYgaW4gVVJCICglZCkiLAogCQkJCXJlc3VsdCk7CiAJCQl3YV9yZXNldF9hbGwod2EpOwotCQl9IGVsc2UgaWYgKGRhdGFfZnJhbWVfY291bnQgPiAxKQotCQkJLyogSWYgd2UgbmVlZCB0byByZWFkIG11bHRpcGxlIGZyYW1lcywgc2V0IERUSSBidXN5LiAqLworCQl9IGVsc2UgaWYgKGRhdGFfZnJhbWVfY291bnQgPiB0b3RhbF9mcmFtZXNfcmVhZCkKKwkJCS8qIElmIHdlIG5lZWQgdG8gcmVhZCBtb3JlIGZyYW1lcywgc2V0IERUSSBidXN5LiAqLwogCQkJZHRpX2J1c3kgPSAxOwogCX0gZWxzZSB7CiAJCS8qIE9VVCB0cmFuc2ZlciBvciBubyBtb3JlIElOIGRhdGEsIGNvbXBsZXRlIGl0IC0tICovCi0JCXNlZy0+c3RhdHVzID0gV0FfU0VHX0RPTkU7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJZG9uZSA9IF9fd2FfeGZlcl9tYXJrX3NlZ19hc19kb25lKHhmZXIsIHNlZywgV0FfU0VHX0RPTkUpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7Ci0Jd2EtPmR0aV9zdGF0ZSA9IFdBX0RUSV9UUkFOU0ZFUl9SRVNVTFRfUEVORElORzsKKwlpZiAoZHRpX2J1c3kpCisJCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfQlVGX0lOX0RBVEFfUEVORElORzsKKwllbHNlCisJCXdhLT5kdGlfc3RhdGUgPSBXQV9EVElfVFJBTlNGRVJfUkVTVUxUX1BFTkRJTkc7CiAJaWYgKGRvbmUpCiAJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAlpZiAocnBpcGVfcmVhZHkpCkBAIC0yMzg4LDggKzI1ODgsOSBAQAogCXN0cnVjdCB3YWhjICp3YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHdhX3JwaXBlICpycGlwZTsKLQl1bnNpZ25lZCBycGlwZV9yZWFkeSA9IDAsIHNlZ19pbmRleCwgaXNvY19kYXRhX2ZyYW1lX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBycGlwZV9yZWFkeSA9IDAsIGlzb2NfZGF0YV9mcmFtZV9jb3VudCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWJtaXRfZHRpID0gMCwgYWN0aXZlX2J1Zl9pbl91cmJzOwogCXU4IGRvbmUgPSAwOwogCiAJLyogZnJlZSB0aGUgc2cgaWYgaXQgd2FzIHVzZWQuICovCkBAIC0yMzk5LDE5ICsyNjAwLDIwIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhmZXItPmxvY2ssIGZsYWdzKTsKIAl3YSA9IHhmZXItPndhOwogCWRldiA9ICZ3YS0+dXNiX2lmYWNlLT5kZXY7CisJLS0od2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CisJYWN0aXZlX2J1Zl9pbl91cmJzID0gd2EtPmFjdGl2ZV9idWZfaW5fdXJiczsKIAogCWlmICh1c2JfcGlwZWlzb2MoeGZlci0+dXJiLT5waXBlKSkgeworCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqaXNvX2ZyYW1lX2Rlc2MgPQorCQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJaW50CXNlZ19pbmRleDsKKwogCQkvKgotCQkgKiBGaW5kIHRoZSBuZXh0IGlzb2MgZnJhbWUgd2l0aCBkYXRhLiAgQmFpbCBvdXQgYWZ0ZXIKLQkJICogaXNvY19kYXRhX2ZyYW1lX2NvdW50ID4gMSBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsKLQkJICogdGhlIGVudGlyZSBmcmFtZSBhcnJheS4gIFdlIGp1c3QgbmVlZCB0byBrbm93IGlmCi0JCSAqIGlzb2NfZGF0YV9mcmFtZV9jb3VudCBpcyAwLCAxLCBvciA+MS4KKwkJICogRmluZCB0aGUgbmV4dCBpc29jIGZyYW1lIHdpdGggZGF0YSBhbmQgY291bnQgaG93IG1hbnkKKwkJICogZnJhbWVzIHdpdGggZGF0YSByZW1haW4uCiAJCSAqLwotCQlzZWdfaW5kZXggPSBzZWctPmlzb2NfZnJhbWVfaW5kZXggKyAxOwotCQl3aGlsZSAoKHNlZ19pbmRleCA8IHNlZy0+aXNvY19mcmFtZV9jb3VudCkKLQkJCSYmIChpc29jX2RhdGFfZnJhbWVfY291bnQgPD0gMSkpIHsKLQkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fZnJhbWVfZGVzYyA9Ci0JCQkJeGZlci0+dXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJc2VnX2luZGV4ID0gc2VnLT5pc29jX2ZyYW1lX2luZGV4OworCQl3aGlsZSAoc2VnX2luZGV4IDwgc2VnLT5pc29jX2ZyYW1lX2NvdW50KSB7CiAJCQljb25zdCBpbnQgdXJiX2ZyYW1lX2luZGV4ID0KIAkJCQlzZWctPmlzb2NfZnJhbWVfb2Zmc2V0ICsgc2VnX2luZGV4OwogCkBAIC0yNDMyLDI0ICsyNjM0LDM5IEBACiAKIAkJc2VnLT5yZXN1bHQgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlpZiAoaXNvY19kYXRhX2ZyYW1lX2NvdW50ID4gMCkgewotCQkJaW50IHJlc3VsdDsKLQkJCS8qIHN1Ym1pdCBhIHJlYWQgVVJCIGZvciB0aGUgZmlyc3QgZnJhbWUgd2l0aCBkYXRhLiAqLwotCQkJX193YV9wb3B1bGF0ZV9idWZfaW5fdXJiX2lzb2Mod2EsIHhmZXIsIHNlZywKLQkJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKyBzZWctPmlzb2NfZnJhbWVfb2Zmc2V0KTsKLQkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5idWZfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJCWludCByZXN1bHQsIHVyYl9mcmFtZV9jb3VudDsKKworCQkJLyogc3VibWl0IGEgcmVhZCBVUkIgZm9yIHRoZSBuZXh0IGZyYW1lIHdpdGggZGF0YS4gKi8KKwkJCXVyYl9mcmFtZV9jb3VudCA9IF9fd2FfcG9wdWxhdGVfYnVmX2luX3VyYl9pc29jKHdhLCB1cmIsCisJCQkJIHhmZXIsIHNlZyk7CisJCQkvKiBhZHZhbmNlIGluZGV4IHRvIHN0YXJ0IG9mIG5leHQgcmVhZCBVUkIuICovCisJCQlzZWctPmlzb2NfZnJhbWVfaW5kZXggKz0gdXJiX2ZyYW1lX2NvdW50OworCQkJKysod2EtPmFjdGl2ZV9idWZfaW5fdXJicyk7CisJCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQktLSh3YS0+YWN0aXZlX2J1Zl9pbl91cmJzKTsKIAkJCQlkZXZfZXJyKGRldiwgIkRUSSBFcnJvcjogQ291bGQgbm90IHN1Ym1pdCBidWYgaW4gVVJCICglZCkiLAogCQkJCQlyZXN1bHQpOwogCQkJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJCQl9Ci0JCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgd2UgYXJlIGluIHRoaXMgY2FsbGJhY2sgYW5kCisJCQkgKiBpc29jX2RhdGFfZnJhbWVfY291bnQgPiAwLCBpdCBtZWFucyB0aGF0IHRoZSBkdGlfdXJiCisJCQkgKiBzdWJtaXNzaW9uIHdhcyBkZWxheWVkIGluIHdhX2R0aV9jYi4gIE9uY2UKKwkJCSAqIHdlIHN1Ym1pdCB0aGUgbGFzdCBidWZfaW5fdXJiLCB3ZSBjYW4gc3VibWl0IHRoZQorCQkJICogZGVsYXllZCBkdGlfdXJiLgorCQkJICovCisJCQkgIHJlc3VibWl0X2R0aSA9IChpc29jX2RhdGFfZnJhbWVfY291bnQgPT0KKwkJCQkJCQl1cmJfZnJhbWVfY291bnQpOworCQl9IGVsc2UgaWYgKGFjdGl2ZV9idWZfaW5fdXJicyA9PSAwKSB7CiAJCQlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7Ci0JCQlzZWctPnN0YXR1cyA9IFdBX1NFR19ET05FOwotCQkJZGV2X2RiZyhkZXYsICJ4ZmVyICVwIyV1OiBkYXRhIGluIGRvbmUgKCV6dSBieXRlcylcbiIsCi0JCQkJeGZlciwgc2VnLT5pbmRleCwgc2VnLT5yZXN1bHQpOwotCQkJeGZlci0+c2Vnc19kb25lKys7CisJCQlkZXZfZGJnKGRldiwKKwkJCQkieGZlciAlcCAweCUwOFgjJXU6IGRhdGEgaW4gZG9uZSAoJXp1IGJ5dGVzKVxuIiwKKwkJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAorCQkJCXNlZy0+cmVzdWx0KTsKIAkJCXJwaXBlX3JlYWR5ID0gcnBpcGVfYXZhaWxfaW5jKHJwaXBlKTsKLQkJCWRvbmUgPSBfX3dhX3hmZXJfaXNfZG9uZSh4ZmVyKTsKKwkJCWRvbmUgPSBfX3dhX3hmZXJfbWFya19zZWdfYXNfZG9uZSh4ZmVyLCBzZWcsCisJCQkJCVdBX1NFR19ET05FKTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZmVyLT5sb2NrLCBmbGFncyk7CiAJCWlmIChkb25lKQpAQCAtMjQ2MSwzNyArMjY3OCw0NCBAQAogCWNhc2UgLUVOT0VOVDoJCS8qIGFzIGl0IHdhcyBkb25lIGJ5IHRoZSB3aG8gdW5saW5rZWQgdXMgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoJCS8qIE90aGVyIGVycm9ycyAuLi4gKi8KKwkJLyoKKwkJICogRXJyb3Igb24gZGF0YSBidWYgcmVhZC4gIE9ubHkgcmVzdWJtaXQgRFRJIGlmIGl0IGhhc24ndAorCQkgKiBhbHJlYWR5IGJlZW4gZG9uZSBieSBwcmV2aW91c2x5IGhpdHRpbmcgdGhpcyBlcnJvciBvciBieSBhCisJCSAqIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJldmlvdXMgYnVmX2luX3VyYi4KKwkJICovCisJCXJlc3VibWl0X2R0aSA9IHdhLT5kdGlfc3RhdGUgIT0gV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlycGlwZSA9IHhmZXItPmVwLT5oY3ByaXY7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlkZXZfZXJyKGRldiwgInhmZXIgJXAjJXU6IGRhdGEgaW4gZXJyb3IgJWRcbiIsCi0JCQkJeGZlciwgc2VnLT5pbmRleCwgdXJiLT5zdGF0dXMpOworCQkJZGV2X2VycihkZXYsICJ4ZmVyICVwIDB4JTA4WCMldTogZGF0YSBpbiBlcnJvciAlZFxuIiwKKwkJCQl4ZmVyLCB3YV94ZmVyX2lkKHhmZXIpLCBzZWctPmluZGV4LAorCQkJCXVyYi0+c3RhdHVzKTsKIAkJaWYgKGVkY19pbmMoJndhLT5uZXBfZWRjLCBFRENfTUFYX0VSUk9SUywKIAkJCSAgICBFRENfRVJST1JfVElNRUZSQU1FKSl7CiAJCQlkZXZfZXJyKGRldiwgIkRUTzogVVJCIG1heCBhY2NlcHRhYmxlIGVycm9ycyAiCiAJCQkJImV4Y2VlZGVkLCByZXNldHRpbmcgZGV2aWNlXG4iKTsKIAkJCXdhX3Jlc2V0X2FsbCh3YSk7CiAJCX0KLQkJc2VnLT5zdGF0dXMgPSBXQV9TRUdfRVJST1I7CiAJCXNlZy0+cmVzdWx0ID0gdXJiLT5zdGF0dXM7Ci0JCXhmZXItPnNlZ3NfZG9uZSsrOwogCQlycGlwZV9yZWFkeSA9IHJwaXBlX2F2YWlsX2luYyhycGlwZSk7Ci0JCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKLQkJZG9uZSA9IF9fd2FfeGZlcl9pc19kb25lKHhmZXIpOworCQlpZiAoYWN0aXZlX2J1Zl9pbl91cmJzID09IDApCisJCQlkb25lID0gX193YV94ZmVyX21hcmtfc2VnX2FzX2RvbmUoeGZlciwgc2VnLAorCQkJCVdBX1NFR19FUlJPUik7CisJCWVsc2UKKwkJCV9fd2FfeGZlcl9hYm9ydCh4ZmVyKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG9uZSkKIAkJCXdhX3hmZXJfY29tcGxldGlvbih4ZmVyKTsKIAkJaWYgKHJwaXBlX3JlYWR5KQogCQkJd2FfeGZlcl9kZWxheWVkX3J1bihycGlwZSk7CiAJfQotCS8qCi0JICogSWYgd2UgYXJlIGluIHRoaXMgY2FsbGJhY2sgYW5kIGlzb2NfZGF0YV9mcmFtZV9jb3VudCA+IDAsIGl0IG1lYW5zCi0JICogdGhhdCB0aGUgZHRpX3VyYiBzdWJtaXNzaW9uIHdhcyBkZWxheWVkIGluIHdhX2R0aV9jYi4gIE9uY2UKLQkgKiBpc29jX2RhdGFfZnJhbWVfY291bnQgZ2V0cyB0byAxLCB3ZSBjYW4gc3VibWl0IHRoZSBkZWZlcnJlZCBVUkIKLQkgKiBzaW5jZSB0aGUgbGFzdCBidWZfaW5fdXJiIHdhcyBqdXN0IHN1Ym1pdHRlZC4KLQkgKi8KLQlpZiAoaXNvY19kYXRhX2ZyYW1lX2NvdW50ID09IDEpIHsKLQkJaW50IHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5kdGlfdXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXN1Ym1pdF9kdGkpIHsKKwkJaW50IHJlc3VsdDsKKworCQl3YS0+ZHRpX3N0YXRlID0gV0FfRFRJX1RSQU5TRkVSX1JFU1VMVF9QRU5ESU5HOworCisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdhLT5kdGlfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiRFRJIEVycm9yOiBDb3VsZCBub3Qgc3VibWl0IERUSSBVUkIgKCVkKVxuIiwKIAkJCQlyZXN1bHQpOwpAQCAtMjU2MSwxMSArMjc4NSwxNSBAQAogCQkJCQl4ZmVyX3Jlc3VsdC0+aGRyLmJOb3RpZnlUeXBlKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXVzYl9zdGF0dXMgPSB4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU3RhdHVzICYgMHgzZjsKLQkJCWlmICh1c2Jfc3RhdHVzID09IFdBX1hGRVJfU1RBVFVTX05PVF9GT1VORCkKLQkJCQkvKiB0YWtlbiBjYXJlIG9mIGFscmVhZHkgKi8KLQkJCQlicmVhazsKIAkJCXhmZXJfaWQgPSBsZTMyX3RvX2NwdSh4ZmVyX3Jlc3VsdC0+ZHdUcmFuc2ZlcklEKTsKKwkJCXVzYl9zdGF0dXMgPSB4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU3RhdHVzICYgMHgzZjsKKwkJCWlmICh1c2Jfc3RhdHVzID09IFdBX1hGRVJfU1RBVFVTX05PVF9GT1VORCkgeworCQkJCS8qIHRha2VuIGNhcmUgb2YgYWxyZWFkeSAqLworCQkJCWRldl9kYmcoZGV2LCAiJXM6IHhmZXIgMHglMDhYIyV1IG5vdCBmb3VuZC5cbiIsCisJCQkJCV9fZnVuY19fLCB4ZmVyX2lkLAorCQkJCQl4ZmVyX3Jlc3VsdC0+YlRyYW5zZmVyU2VnbWVudCAmIDB4N2YpOworCQkJCWJyZWFrOworCQkJfQogCQkJeGZlciA9IHdhX3hmZXJfZ2V0X2J5X2lkKHdhLCB4ZmVyX2lkKTsKIAkJCWlmICh4ZmVyID09IE5VTEwpIHsKIAkJCQkvKiBGSVhNRTogdHJhbnNhY3Rpb24gbm90IGZvdW5kLiAqLwpAQCAtMjYxNCw2ICsyODQyLDU0IEBACiB9CiAKIC8qCisgKiBJbml0aWFsaXplIHRoZSBEVEkgVVJCIGZvciByZWFkaW5nIHRyYW5zZmVyIHJlc3VsdCBub3RpZmljYXRpb25zIGFuZCBhbHNvCisgKiB0aGUgYnVmZmVyLWluIFVSQiwgZm9yIHJlYWRpbmcgYnVmZmVycy4gVGhlbiB3ZSBqdXN0IHN1Ym1pdCB0aGUgRFRJIFVSQi4KKyAqLworaW50IHdhX2R0aV9zdGFydChzdHJ1Y3Qgd2FoYyAqd2EpCit7CisJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkdGlfZXBkID0gd2EtPmR0aV9lcGQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJndhLT51c2JfaWZhY2UtPmRldjsKKwlpbnQgcmVzdWx0ID0gLUVOT01FTSwgaW5kZXg7CisKKwlpZiAod2EtPmR0aV91cmIgIT0gTlVMTCkJLyogRFRJIFVSQiBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwkJZ290byBvdXQ7CisKKwl3YS0+ZHRpX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhLT5kdGlfdXJiID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBEVEkgVVJCXG4iKTsKKwkJZ290byBlcnJvcl9kdGlfdXJiX2FsbG9jOworCX0KKwl1c2JfZmlsbF9idWxrX3VyYigKKwkJd2EtPmR0aV91cmIsIHdhLT51c2JfZGV2LAorCQl1c2JfcmN2YnVsa3BpcGUod2EtPnVzYl9kZXYsIDB4ODAgfCBkdGlfZXBkLT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJd2EtPmR0aV9idWYsIHdhLT5kdGlfYnVmX3NpemUsCisJCXdhX2R0aV9jYiwgd2EpOworCisJLyogaW5pdCB0aGUgYnVmIGluIFVSQnMgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBXQV9NQVhfQlVGX0lOX1VSQlM7ICsraW5kZXgpIHsKKwkJdXNiX2ZpbGxfYnVsa191cmIoCisJCQkmKHdhLT5idWZfaW5fdXJic1tpbmRleF0pLCB3YS0+dXNiX2RldiwKKwkJCXVzYl9yY3ZidWxrcGlwZSh3YS0+dXNiX2RldiwKKwkJCQkweDgwIHwgZHRpX2VwZC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQlOVUxMLCAwLCB3YV9idWZfaW5fY2IsIHdhKTsKKwl9CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIod2EtPmR0aV91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRFRJIEVycm9yOiBDb3VsZCBub3Qgc3VibWl0IERUSSBVUkIgKCVkKSByZXNldHRpbmdcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yX2R0aV91cmJfc3VibWl0OworCX0KK291dDoKKwlyZXR1cm4gMDsKKworZXJyb3JfZHRpX3VyYl9zdWJtaXQ6CisJdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOworCXdhLT5kdGlfdXJiID0gTlVMTDsKK2Vycm9yX2R0aV91cmJfYWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdhX2R0aV9zdGFydCk7CisvKgogICogVHJhbnNmZXIgY29tcGxldGUgbm90aWZpY2F0aW9uCiAgKgogICogQ2FsbGVkIGZyb20gdGhlIG5vdGlmLmMgY29kZS4gV2UgZ2V0IGEgbm90aWZpY2F0aW9uIG9uIEVQMiBzYXlpbmcKQEAgLTI2MjcsMTUgKzI5MDMsMTAgQEAKICAqIEZvbGxvdyB1cCBpbiB3YV9kdGlfY2IoKSwgYXMgdGhhdCdzIHdoZXJlIHRoZSB3aG9sZSBzdGF0ZQogICogbWFjaGluZSBzdGFydHMuCiAgKgotICogU28gaGVyZSB3ZSBqdXN0IGluaXRpYWxpemUgdGhlIERUSSBVUkIgZm9yIHJlYWRpbmcgdHJhbnNmZXIgcmVzdWx0Ci0gKiBub3RpZmljYXRpb25zIGFuZCBhbHNvIHRoZSBidWZmZXItaW4gVVJCLCBmb3IgcmVhZGluZyBidWZmZXJzLiBUaGVuCi0gKiB3ZSBqdXN0IHN1Ym1pdCB0aGUgRFRJIFVSQi4KLSAqCiAgKiBAd2Egc2hhbGwgYmUgcmVmZXJlbmNlZAogICovCiB2b2lkIHdhX2hhbmRsZV9ub3RpZl94ZmVyKHN0cnVjdCB3YWhjICp3YSwgc3RydWN0IHdhX25vdGlmX2hkciAqbm90aWZfaGRyKQogewotCWludCByZXN1bHQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJndhLT51c2JfaWZhY2UtPmRldjsKIAlzdHJ1Y3Qgd2Ffbm90aWZfeGZlciAqbm90aWZfeGZlcjsKIAljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmR0aV9lcGQgPSB3YS0+ZHRpX2VwZDsKQEAgLTI2NDksNDUgKzI5MjAsMTMgQEAKIAkJCW5vdGlmX3hmZXItPmJFbmRwb2ludCwgZHRpX2VwZC0+YkVuZHBvaW50QWRkcmVzcyk7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWlmICh3YS0+ZHRpX3VyYiAhPSBOVUxMKQkvKiBEVEkgVVJCIGFscmVhZHkgc3RhcnRlZCAqLwotCQlnb3RvIG91dDsKIAotCXdhLT5kdGlfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAod2EtPmR0aV91cmIgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIERUSSBVUkJcbiIpOwotCQlnb3RvIGVycm9yX2R0aV91cmJfYWxsb2M7Ci0JfQotCXVzYl9maWxsX2J1bGtfdXJiKAotCQl3YS0+ZHRpX3VyYiwgd2EtPnVzYl9kZXYsCi0JCXVzYl9yY3ZidWxrcGlwZSh3YS0+dXNiX2RldiwgMHg4MCB8IG5vdGlmX3hmZXItPmJFbmRwb2ludCksCi0JCXdhLT5kdGlfYnVmLCB3YS0+ZHRpX2J1Zl9zaXplLAotCQl3YV9kdGlfY2IsIHdhKTsKKwkvKiBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBEVEkgZXAgcHJvY2Vzc2luZy4gKi8KKwlpZiAod2FfZHRpX3N0YXJ0KHdhKSA8IDApCisJCWdvdG8gZXJyb3I7CiAKLQl3YS0+YnVmX2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHdhLT5idWZfaW5fdXJiID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBCVUYtSU4gVVJCXG4iKTsKLQkJZ290byBlcnJvcl9idWZfaW5fdXJiX2FsbG9jOwotCX0KLQl1c2JfZmlsbF9idWxrX3VyYigKLQkJd2EtPmJ1Zl9pbl91cmIsIHdhLT51c2JfZGV2LAotCQl1c2JfcmN2YnVsa3BpcGUod2EtPnVzYl9kZXYsIDB4ODAgfCBub3RpZl94ZmVyLT5iRW5kcG9pbnQpLAotCQlOVUxMLCAwLCB3YV9idWZfaW5fY2IsIHdhKTsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih3YS0+ZHRpX3VyYiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJEVEkgRXJyb3I6IENvdWxkIG5vdCBzdWJtaXQgRFRJIFVSQiAoJWQpIHJlc2V0dGluZ1xuIiwKLQkJCXJlc3VsdCk7Ci0JCWdvdG8gZXJyb3JfZHRpX3VyYl9zdWJtaXQ7Ci0JfQotb3V0OgogCXJldHVybjsKIAotZXJyb3JfZHRpX3VyYl9zdWJtaXQ6Ci0JdXNiX3B1dF91cmIod2EtPmJ1Zl9pbl91cmIpOwotCXdhLT5idWZfaW5fdXJiID0gTlVMTDsKLWVycm9yX2J1Zl9pbl91cmJfYWxsb2M6Ci0JdXNiX3B1dF91cmIod2EtPmR0aV91cmIpOwotCXdhLT5kdGlfdXJiID0gTlVMTDsKLWVycm9yX2R0aV91cmJfYWxsb2M6CiBlcnJvcjoKIAl3YV9yZXNldF9hbGwod2EpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jCmluZGV4IDIxMDM1NzYuLjlkZDQ5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfaW50cnMuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2ludHJzLmMKQEAgLTQ4MiwxNSArNDgyLDE5IEBACiAJCWZvciAoaSA9IDA7IGkgPCBudmVjOyBpKyspCiAJCQl2ZGV2LT5tc2l4W2ldLmVudHJ5ID0gaTsKIAotCQlyZXQgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgdmRldi0+bXNpeCwgbnZlYyk7Ci0JCWlmIChyZXQpIHsKKwkJcmV0ID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIHZkZXYtPm1zaXgsIDEsIG52ZWMpOworCQlpZiAocmV0IDwgbnZlYykgeworCQkJaWYgKHJldCA+IDApCisJCQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKIAkJCWtmcmVlKHZkZXYtPm1zaXgpOwogCQkJa2ZyZWUodmRldi0+Y3R4KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9IGVsc2UgewotCQlyZXQgPSBwY2lfZW5hYmxlX21zaV9ibG9jayhwZGV2LCBudmVjKTsKLQkJaWYgKHJldCkgeworCQlyZXQgPSBwY2lfZW5hYmxlX21zaV9yYW5nZShwZGV2LCAxLCBudmVjKTsKKwkJaWYgKHJldCA8IG52ZWMpIHsKKwkJCWlmIChyZXQgPiAwKQorCQkJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAkJCWtmcmVlKHZkZXYtPmN0eCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L25ldC5jIGIvZHJpdmVycy92aG9zdC9uZXQuYwppbmRleCBhMGZhNWRlLi5lMWUyMmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L25ldC5jCisrKyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKQEAgLTUwNSw5ICs1MDUsMTMgQEAKIAkJCXIgPSAtRU5PQlVGUzsKIAkJCWdvdG8gZXJyOwogCQl9Ci0JCWQgPSB2aG9zdF9nZXRfdnFfZGVzYyh2cS0+ZGV2LCB2cSwgdnEtPmlvdiArIHNlZywKKwkJciA9IHZob3N0X2dldF92cV9kZXNjKHZxLT5kZXYsIHZxLCB2cS0+aW92ICsgc2VnLAogCQkJCSAgICAgIEFSUkFZX1NJWkUodnEtPmlvdikgLSBzZWcsICZvdXQsCiAJCQkJICAgICAgJmluLCBsb2csIGxvZ19udW0pOworCQlpZiAodW5saWtlbHkociA8IDApKQorCQkJZ290byBlcnI7CisKKwkJZCA9IHI7CiAJCWlmIChkID09IHZxLT5udW0pIHsKIAkJCXIgPSAwOwogCQkJZ290byBlcnI7CkBAIC01MzIsNiArNTM2LDEyIEBACiAJKmlvdmNvdW50ID0gc2VnOwogCWlmICh1bmxpa2VseShsb2cpKQogCQkqbG9nX251bSA9IG5sb2dzOworCisJLyogRGV0ZWN0IG92ZXJydW4gKi8KKwlpZiAodW5saWtlbHkoZGF0YWxlbiA+IDApKSB7CisJCXIgPSBVSU9fTUFYSU9WICsgMTsKKwkJZ290byBlcnI7CisJfQogCXJldHVybiBoZWFkY291bnQ7CiBlcnI6CiAJdmhvc3RfZGlzY2FyZF92cV9kZXNjKHZxLCBoZWFkY291bnQpOwpAQCAtNTg3LDYgKzU5NywxNCBAQAogCQkvKiBPbiBlcnJvciwgc3RvcCBoYW5kbGluZyB1bnRpbCB0aGUgbmV4dCBraWNrLiAqLwogCQlpZiAodW5saWtlbHkoaGVhZGNvdW50IDwgMCkpCiAJCQlicmVhazsKKwkJLyogT24gb3ZlcnJ1biwgdHJ1bmNhdGUgYW5kIGRpc2NhcmQgKi8KKwkJaWYgKHVubGlrZWx5KGhlYWRjb3VudCA+IFVJT19NQVhJT1YpKSB7CisJCQltc2cubXNnX2lvdmxlbiA9IDE7CisJCQllcnIgPSBzb2NrLT5vcHMtPnJlY3Ztc2coTlVMTCwgc29jaywgJm1zZywKKwkJCQkJCSAxLCBNU0dfRE9OVFdBSVQgfCBNU0dfVFJVTkMpOworCQkJcHJfZGVidWcoIkRpc2NhcmRlZCByeCBwYWNrZXQ6IGxlbiAlemRcbiIsIHNvY2tfbGVuKTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCS8qIE9LLCBub3cgd2UgbmVlZCB0byBrbm93IGFib3V0IGFkZGVkIGRlc2NyaXB0b3JzLiAqLwogCQlpZiAoIWhlYWRjb3VudCkgewogCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSkpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggOTdhOGYzYS4uYjRiMjA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtNzk2LDE4ICs3OTYsOSBAQAogCSAgQXMgdGhpcyBjYXJkIHRlY2hub2xvZ3kgaXMgYXQgbGVhc3QgMjUgeWVhcnMgb2xkLAogCSAgbW9zdCBwZW9wbGUgd2lsbCBhbnN3ZXIgTiBoZXJlLgogCi1jb25maWcgRkJfU0dJVlcKLQl0cmlzdGF0ZSAiU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gRkIgJiYgWDg2X1ZJU1dTCi0Jc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAotCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKLQlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCWhlbHAKLQkgIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc3VwcG9ydCBmb3IgZnJhbWVidWZmZXIgZ3JhcGhpY3MuCi0KIGNvbmZpZyBGQl9HQkUKIAlib29sICJTR0kgR3JhcGhpY3MgQmFja2VuZCBmcmFtZSBidWZmZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIChTR0lfSVAzMiB8fCBYODZfVklTV1MpCisJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBTR0lfSVAzMgogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCmluZGV4IDA4ZDZhNGEuLjFiZTI2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQpAQCAtNzUsNyArNzUsNiBAQAogb2JqLSQoQ09ORklHX0ZCX1A5MTAwKSAgICAgICAgICAgICs9IHA5MTAwLm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfVENYKSAgICAgICAgICAgICAgKz0gdGN4Lm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfTEVPKSAgICAgICAgICAgICAgKz0gbGVvLm8gc2J1c2xpYi5vCi1vYmotJChDT05GSUdfRkJfU0dJVlcpICAgICAgICAgICAgKz0gc2dpdndmYi5vCiBvYmotJChDT05GSUdfRkJfQUNPUk4pICAgICAgICAgICAgKz0gYWNvcm5mYi5vCiBvYmotJChDT05GSUdfRkJfQVRBUkkpICAgICAgICAgICAgKz0gYXRhZmIubyBjMnBfaXBsYW4yLm8gYXRhZmJfbWZiLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0YWZiX2lwbGFuMnAyLm8gYXRhZmJfaXBsYW4ycDQubyBhdGFmYl9pcGxhbjJwOC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKaW5kZXggNGM3Y2IzNi4uM2VjNjVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nYmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwpAQCAtNDUsMTAgKzQ1LDYgQEAKICNkZWZpbmUgR0JFX0JBU0UJMHgxNjAwMDAwMCAvKiBTR0kgTzIgKi8KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1g4Nl9WSVNXUwotI2RlZmluZSBHQkVfQkFTRQkweGQwMDAwMDAwIC8qIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gKi8KLSNlbmRpZgotCiAvKiBtYWNybyBmb3IgZmFzdGVzdCB3cml0ZS10aG91Z2ggYWNjZXNzIHRvIHRoZSBmcmFtZWJ1ZmZlciAqLwogI2lmZGVmIENPTkZJR19NSVBTCiAjaWZkZWYgQ09ORklHX0NQVV9SMTAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaHlwZXJ2X2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2h5cGVydl9mYi5jCmluZGV4IDEzMDcwOGYuLmUyMzM5MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaHlwZXJ2X2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9oeXBlcnZfZmIuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogCiAjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CiAKQEAgLTIxMiw2ICsyMTMsNyBAQAogCiBzdHJ1Y3QgaHZmYl9wYXIgewogCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCByZXNvdXJjZSBtZW07CiAJYm9vbCBmYl9yZWFkeTsgLyogZmIgZGV2aWNlIGlzIHJlYWR5ICovCiAJc3RydWN0IGNvbXBsZXRpb24gd2FpdDsKIAl1MzIgc3ludGh2aWRfdmVyc2lvbjsKQEAgLTQ2MCwxMyArNDYyLDEzIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKHBhci0+c3ludGh2aWRfdmVyc2lvbiA9PSBTWU5USFZJRF9WRVJTSU9OX1dJTjcpIHsKKwlpZiAocGFyLT5zeW50aHZpZF92ZXJzaW9uID09IFNZTlRIVklEX1ZFUlNJT05fV0lONykKIAkJc2NyZWVuX2RlcHRoID0gU1lOVEhWSURfREVQVEhfV0lONzsKLQkJc2NyZWVuX2ZiX3NpemUgPSBTWU5USFZJRF9GQl9TSVpFX1dJTjc7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXNjcmVlbl9kZXB0aCA9IFNZTlRIVklEX0RFUFRIX1dJTjg7Ci0JCXNjcmVlbl9mYl9zaXplID0gU1lOVEhWSURfRkJfU0laRV9XSU44OwotCX0KKworCXNjcmVlbl9mYl9zaXplID0gaGRldi0+Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuCisJCQkJbW1pb19tZWdhYnl0ZXMgKiAxMDI0ICogMTAyNDsKIAogCXJldHVybiAwOwogCkBAIC02MjcsMjYgKzYyOSw0NiBAQAogLyogR2V0IGZyYW1lYnVmZmVyIG1lbW9yeSBmcm9tIEh5cGVyLVYgdmlkZW8gcGNpIHNwYWNlICovCiBzdGF0aWMgaW50IGh2ZmJfZ2V0bWVtKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXVsb25nIGZiX3BoeXM7CisJc3RydWN0IGh2ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgID0gTlVMTDsKIAl2b2lkIF9faW9tZW0gKmZiX3ZpcnQ7CisJaW50IGdlbjJ2bSA9IGVmaV9lbmFibGVkKEVGSV9CT09UKTsKKwlpbnQgcmV0OwogCi0JcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfTUlDUk9TT0ZULAorCXBhci0+bWVtLm5hbWUgPSBLQlVJTERfTU9ETkFNRTsKKwlwYXItPm1lbS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCWlmIChnZW4ydm0pIHsKKwkJcmV0ID0gYWxsb2NhdGVfcmVzb3VyY2UoJmh5cGVydl9tbWlvLCAmcGFyLT5tZW0sCisJCQkJCXNjcmVlbl9mYl9zaXplLAorCQkJCQkwLCAtMSwKKwkJCQkJc2NyZWVuX2ZiX3NpemUsCisJCQkJCU5VTEwsIE5VTEwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGZyYW1lYnVmZmVyIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX01JQ1JPU09GVCwKIAkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSFlQRVJWX1ZJREVPLCBOVUxMKTsKLQlpZiAoIXBkZXYpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gZmluZCBQQ0kgSHlwZXItViB2aWRlb1xuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlpZiAoIXBkZXYpIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIGZpbmQgUENJIEh5cGVyLVYgdmlkZW9cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkgfHwKKwkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBzY3JlZW5fZmJfc2l6ZSkKKwkJCWdvdG8gZXJyMTsKKworCQlwYXItPm1lbS5lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApOworCQlwYXItPm1lbS5zdGFydCA9IHBhci0+bWVtLmVuZCAtIHNjcmVlbl9mYl9zaXplICsgMTsKKwkJcmV0ID0gcmVxdWVzdF9yZXNvdXJjZSgmcGRldi0+cmVzb3VyY2VbMF0sICZwYXItPm1lbSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJVbmFibGUgdG8gcmVxdWVzdCBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIpOworCQkJZ290byBlcnIxOworCQl9CiAJfQogCi0JaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pIHx8Ci0JICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBzY3JlZW5fZmJfc2l6ZSkKLQkJZ290byBlcnIxOwotCi0JZmJfcGh5cyA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCkgLSBzY3JlZW5fZmJfc2l6ZSArIDE7Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZmJfcGh5cywgc2NyZWVuX2ZiX3NpemUsIEtCVUlMRF9NT0ROQU1FKSkKLQkJZ290byBlcnIxOwotCi0JZmJfdmlydCA9IGlvcmVtYXAoZmJfcGh5cywgc2NyZWVuX2ZiX3NpemUpOworCWZiX3ZpcnQgPSBpb3JlbWFwKHBhci0+bWVtLnN0YXJ0LCBzY3JlZW5fZmJfc2l6ZSk7CiAJaWYgKCFmYl92aXJ0KQogCQlnb3RvIGVycjI7CiAKQEAgLTY1NCwzMCArNjc2LDQ0IEBACiAJaWYgKCFpbmZvLT5hcGVydHVyZXMpCiAJCWdvdG8gZXJyMzsKIAotCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0JaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBmYl9waHlzOworCWlmIChnZW4ydm0pIHsKKwkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSA9IHNjcmVlbl9pbmZvLmxmYl9iYXNlOworCQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gc2NyZWVuX2luZm8ubGZiX3NpemU7CisJCXJlbW92ZV9jb25mbGljdGluZ19mcmFtZWJ1ZmZlcnMoaW5mby0+YXBlcnR1cmVzLAorCQkJCQkJS0JVSUxEX01PRE5BTUUsIGZhbHNlKTsKKwl9IGVsc2UgeworCQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwl9CisKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IHBhci0+bWVtLnN0YXJ0OwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IHNjcmVlbl9mYl9zaXplOwogCWluZm8tPnNjcmVlbl9iYXNlID0gZmJfdmlydDsKIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IHNjcmVlbl9mYl9zaXplOwogCi0JcGNpX2Rldl9wdXQocGRldik7CisJaWYgKCFnZW4ydm0pCisJCXBjaV9kZXZfcHV0KHBkZXYpOworCiAJcmV0dXJuIDA7CiAKIGVycjM6CiAJaW91bm1hcChmYl92aXJ0KTsKIGVycjI6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGZiX3BoeXMsIHNjcmVlbl9mYl9zaXplKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZwYXItPm1lbSk7CiBlcnIxOgotCXBjaV9kZXZfcHV0KHBkZXYpOworCWlmICghZ2VuMnZtKQorCQlwY2lfZGV2X3B1dChwZGV2KTsKKwogCXJldHVybiAtRU5PTUVNOwogfQogCiAvKiBSZWxlYXNlIHRoZSBmcmFtZWJ1ZmZlciAqLwogc3RhdGljIHZvaWQgaHZmYl9wdXRtZW0oc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJc3RydWN0IGh2ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsIHNjcmVlbl9mYl9zaXplKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZwYXItPm1lbSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwppbmRleCAzOWFjNDllLi4wMDM3MTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwpAQCAtNTQsNyArNTQsNyBAQAogCiBjb25maWcgTE9HT19TR0lfQ0xVVDIyNAogCWJvb2wgIjIyNC1jb2xvciBTR0kgTGludXggbG9nbyIKLQlkZXBlbmRzIG9uIFNHSV9JUDIyIHx8IFNHSV9JUDI3IHx8IFNHSV9JUDMyIHx8IFg4Nl9WSVNXUworCWRlcGVuZHMgb24gU0dJX0lQMjIgfHwgU0dJX0lQMjcgfHwgU0dJX0lQMzIKIAlkZWZhdWx0IHkKIAogY29uZmlnIExPR09fU1VOX0NMVVQyMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jCmluZGV4IGI2NzBjYmQuLjk0MGNkMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ28uYwpAQCAtODEsNyArODEsNyBAQAogCQlsb2dvID0gJmxvZ29fcGFyaXNjX2NsdXQyMjQ7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTE9HT19TR0lfQ0xVVDIyNAotCQkvKiBTR0kgTGludXggbG9nbyBvbiBNSVBTL01JUFM2NCBhbmQgVklTV1MgKi8KKwkJLyogU0dJIExpbnV4IGxvZ28gb24gTUlQUy9NSVBTNjQgKi8KIAkJbG9nbyA9ICZsb2dvX3NnaV9jbHV0MjI0OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0xPR09fU1VOX0NMVVQyMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jIGIvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNzRkMDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODkgKzAsMCBAQAotLyoKLSAqICBsaW51eC9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYyAtLSBTR0kgREJFIGZyYW1lIGJ1ZmZlciBkZXZpY2UKLSAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogICAgICBKZWZmcmV5IE5ld3F1aXN0LCBuZXdxdWlzdEBlbmdyLnNnaS5zb20KLSAqCi0gKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbXRyci5oPgotI2luY2x1ZGUgPGFzbS92aXN3cy9zZ2l2dy5oPgotCi0jZGVmaW5lIElOQ0xVREVfVElNSU5HX1RBQkxFX0RBVEEKLSNkZWZpbmUgREJFX1JFR19CQVNFIHBhci0+cmVncwotI2luY2x1ZGUgPHZpZGVvL3NnaXZ3Lmg+Ci0KLXN0cnVjdCBzZ2l2d19wYXIgewotCXN0cnVjdCBhc3JlZ3MgKnJlZ3M7Ci0JdTMyIGNtYXBfZmlmbzsKLQl1X2xvbmcgdGltaW5nX251bTsKLX07Ci0KLSNkZWZpbmUgRkxBVFBBTkVMX1NHSV8xNjAwU1cJNQotCi0vKgotICogIFJBTSB3ZSByZXNlcnZlIGZvciB0aGUgZnJhbWUgYnVmZmVyLiBUaGlzIGRlZmluZXMgdGhlIG1heGltdW0gc2NyZWVuCi0gKiAgc2l6ZQotICoKLSAqICBUaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGFzIGEgbW9kdWxlCi0gKi8KLQotc3RhdGljIGludCB5cGFuID0gMDsKLXN0YXRpYyBpbnQgeXdyYXAgPSAwOwotCi1zdGF0aWMgaW50IGZsYXRwYW5lbF9pZCA9IC0xOwotCi1zdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHNnaXZ3ZmJfZml4ID0gewotCS5pZAkJPSAiU0dJIFZpcyBXUyBGQiIsCi0JLnR5cGUJCT0gRkJfVFlQRV9QQUNLRURfUElYRUxTLAotICAgICAgICAudmlzdWFsCQk9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiwKLQkubW1pb19zdGFydAk9IERCRV9SRUdfUEhZUywKLQkubW1pb19sZW4JPSBEQkVfUkVHX1NJWkUsCi0gICAgICAgIC5hY2NlbAkJPSBGQl9BQ0NFTF9OT05FLAotCS5saW5lX2xlbmd0aAk9IDY0MCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gc2dpdndmYl92YXIgPSB7Ci0JLyogNjQweDQ4MCwgOCBicHAgKi8KLQkueHJlcwkJPSA2NDAsCi0JLnlyZXMJCT0gNDgwLAotCS54cmVzX3ZpcnR1YWwJPSA2NDAsCi0JLnlyZXNfdmlydHVhbAk9IDQ4MCwKLQkuYml0c19wZXJfcGl4ZWwJPSA4LAotCS5yZWQJCT0geyAwLCA4LCAwIH0sCi0JLmdyZWVuCQk9IHsgMCwgOCwgMCB9LAotCS5ibHVlCQk9IHsgMCwgOCwgMCB9LAotCS5oZWlnaHQJCT0gLTEsCi0JLndpZHRoCQk9IC0xLAotCS5waXhjbG9jawk9IDIwMDAwLAotCS5sZWZ0X21hcmdpbgk9IDY0LAotCS5yaWdodF9tYXJnaW4JPSA2NCwKLQkudXBwZXJfbWFyZ2luCT0gMzIsCi0JLmxvd2VyX21hcmdpbgk9IDMyLAotCS5oc3luY19sZW4JPSA2NCwKLQkudnN5bmNfbGVuCT0gMiwKLQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAotfTsKLQotc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBzZ2l2d2ZiX3ZhcjE2MDBzdyA9IHsKLQkvKiAxNjAweDEwMjQsIDggYnBwICovCi0JLnhyZXMJCT0gMTYwMCwKLQkueXJlcwkJPSAxMDI0LAotCS54cmVzX3ZpcnR1YWwJPSAxNjAwLAotCS55cmVzX3ZpcnR1YWwJPSAxMDI0LAotCS5iaXRzX3Blcl9waXhlbAk9IDgsCi0JLnJlZAkJPSB7IDAsIDgsIDAgfSwKLQkuZ3JlZW4JCT0geyAwLCA4LCAwIH0sCi0JLmJsdWUJCT0geyAwLCA4LCAwIH0sCi0JLmhlaWdodAkJPSAtMSwKLQkud2lkdGgJCT0gLTEsCi0JLnBpeGNsb2NrCT0gOTM1MywKLQkubGVmdF9tYXJnaW4JPSAyMCwKLQkucmlnaHRfbWFyZ2luCT0gMzAsCi0JLnVwcGVyX21hcmdpbgk9IDM3LAotCS5sb3dlcl9tYXJnaW4JPSAzLAotCS5oc3luY19sZW4JPSAyMCwKLQkudnN5bmNfbGVuCT0gMywKLQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAotfTsKLQotLyoKLSAqICBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQKLSAqLwotaW50IHNnaXZ3ZmJfaW5pdCh2b2lkKTsKLQotc3RhdGljIGludCBzZ2l2d2ZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBzZ2l2d2ZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBzZ2l2d2ZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwKLQkJCSAgICAgdV9pbnQgYmx1ZSwgdV9pbnQgdHJhbnNwLAotCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50IHNnaXZ3ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLQotc3RhdGljIHN0cnVjdCBmYl9vcHMgc2dpdndmYl9vcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5mYl9jaGVja192YXIJPSBzZ2l2d2ZiX2NoZWNrX3ZhciwKLQkuZmJfc2V0X3Bhcgk9IHNnaXZ3ZmJfc2V0X3BhciwKLQkuZmJfc2V0Y29scmVnCT0gc2dpdndmYl9zZXRjb2xyZWcsCi0JLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKLQkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKLQkuZmJfbW1hcAk9IHNnaXZ3ZmJfbW1hcCwKLX07Ci0KLS8qCi0gKiAgSW50ZXJuYWwgcm91dGluZXMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnl0ZXNfcGVyX3BpeGVsKGludCBicHApCi17Ci0Jc3dpdGNoIChicHApIHsKLQkJY2FzZSA4OgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgMTY6Ci0JCQlyZXR1cm4gMjsKLQkJY2FzZSAzMjoKLQkJCXJldHVybiA0OwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAic2dpdndmYjogdW5zdXBwb3J0ZWQgYnBwICVkXG4iLCBicHApOwotCQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbGluZV9sZW5ndGgoaW50IHhyZXNfdmlydHVhbCwgaW50IGJwcCkKLXsKLQlyZXR1cm4gKHhyZXNfdmlydHVhbCAqIGJ5dGVzX3Blcl9waXhlbChicHApKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOglkYmVfVHVybk9mZkRtYQotICogUGFyYW1ldGVyczoJKE5vbmUpCi0gKiBEZXNjcmlwdGlvbjoJVGhpcyBzaG91bGQgdHVybiBvZmYgdGhlIG1vbml0b3IgYW5kIGRiZS4gIFRoaXMgaXMgdXNlZAotICogICAgICAgICAgICAgIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gdGhlIHNlcmlhbCBjb25zb2xlIGFuZCB0aGUgZ3JhcGhpY3MKLSAqICAgICAgICAgICAgICBjb25zb2xlLgotICovCi0KLXN0YXRpYyB2b2lkIGRiZV9UdXJuT2ZmRG1hKHN0cnVjdCBzZ2l2d19wYXIgKnBhcikKLXsKLQl1bnNpZ25lZCBpbnQgcmVhZFZhbDsKLQlpbnQgaTsKLQotCS8vIENoZWNrIHRvIHNlZSBpZiB0aGluZ3MgYXJlIGFscmVhZHkgdHVybmVkIG9mZjoKLQkvLyAxKSBDaGVjayB0byBzZWUgaWYgZGJlIGlzIG5vdCB1c2luZyB0aGUgaW50ZXJuYWwgZG90Y2xvY2suCi0JLy8gMikgQ2hlY2sgdG8gc2VlIGlmIHRoZSB4eSBjb3VudGVyIGluIGRiZSBpcyBhbHJlYWR5IG9mZi4KLQotCURCRV9HRVRSRUcoY3RybHN0YXQsIHJlYWRWYWwpOwotCWlmIChHRVRfREJFX0ZJRUxEKENUUkxTVEFULCBQQ0xLU0VMLCByZWFkVmFsKSA8IDIpCi0JCXJldHVybjsKLQotCURCRV9HRVRSRUcodnRfeHksIHJlYWRWYWwpOwotCWlmIChHRVRfREJFX0ZJRUxEKFZUX1hZLCBWVF9GUkVFWkUsIHJlYWRWYWwpID09IDEpCi0JCXJldHVybjsKLQotCS8vIE90aGVyd2lzZSwgdHVybiBvZmYgZGJlCi0KLQlEQkVfR0VUUkVHKG92cl9jb250cm9sLCByZWFkVmFsKTsKLQlTRVRfREJFX0ZJRUxEKE9WUl9DT05UUk9MLCBPVlJfRE1BX0VOQUJMRSwgcmVhZFZhbCwgMCk7Ci0JREJFX1NFVFJFRyhvdnJfY29udHJvbCwgcmVhZFZhbCk7Ci0JdWRlbGF5KDEwMDApOwotCURCRV9HRVRSRUcoZnJtX2NvbnRyb2wsIHJlYWRWYWwpOwotCVNFVF9EQkVfRklFTEQoRlJNX0NPTlRST0wsIEZSTV9ETUFfRU5BQkxFLCByZWFkVmFsLCAwKTsKLQlEQkVfU0VUUkVHKGZybV9jb250cm9sLCByZWFkVmFsKTsKLQl1ZGVsYXkoMTAwMCk7Ci0JREJFX0dFVFJFRyhkaWRfY29udHJvbCwgcmVhZFZhbCk7Ci0JU0VUX0RCRV9GSUVMRChESURfQ09OVFJPTCwgRElEX0RNQV9FTkFCTEUsIHJlYWRWYWwsIDApOwotCURCRV9TRVRSRUcoZGlkX2NvbnRyb2wsIHJlYWRWYWwpOwotCXVkZWxheSgxMDAwKTsKLQotCS8vIFhYWCBIQUNLOgotCS8vCi0JLy8gICAgVGhpcyB3YXMgbmVjZXNzYXJ5IGZvciBHQkUtLXdlIGhhZCB0byB3YWl0IHRocm91Z2ggdHdvCi0JLy8gICAgdmVydGljYWwgcmV0cmFjZSBwZXJpb2RzIGJlZm9yZSB0aGUgcGl4ZWwgRE1BIHdhcwotCS8vICAgIHR1cm5lZCBvZmYgZm9yIHN1cmUuICBJJ3ZlIGxlZnQgdGhpcyBpbiBmb3Igbm93LCBpbgotCS8vICAgIGNhc2UgZGJlIG5lZWRzIGl0LgotCi0JZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLQkJREJFX0dFVFJFRyhmcm1faW5od2N0cmwsIHJlYWRWYWwpOwotCQlpZiAoR0VUX0RCRV9GSUVMRChGUk1fSU5IV0NUUkwsIEZSTV9ETUFfRU5BQkxFLCByZWFkVmFsKSA9PQotCQkgICAgMCkKLQkJCXVkZWxheSgxMCk7Ci0JCWVsc2UgewotCQkJREJFX0dFVFJFRyhvdnJfaW5od2N0cmwsIHJlYWRWYWwpOwotCQkJaWYgKEdFVF9EQkVfRklFTEQKLQkJCSAgICAoT1ZSX0lOSFdDVFJMLCBPVlJfRE1BX0VOQUJMRSwgcmVhZFZhbCkgPT0gMCkKLQkJCQl1ZGVsYXkoMTApOwotCQkJZWxzZSB7Ci0JCQkJREJFX0dFVFJFRyhkaWRfaW5od2N0cmwsIHJlYWRWYWwpOwotCQkJCWlmIChHRVRfREJFX0ZJRUxECi0JCQkJICAgIChESURfSU5IV0NUUkwsIERJRF9ETUFfRU5BQkxFLAotCQkJCSAgICAgcmVhZFZhbCkgPT0gMCkKLQkJCQkJdWRlbGF5KDEwKTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICogIFNldCB0aGUgVXNlciBEZWZpbmVkIFBhcnQgb2YgdGhlIERpc3BsYXkuIEFnYWluIGlmIHBhciB1c2UgaXQgdG8gZ2V0Ci0gKiAgcmVhbCB2aWRlbyBtb2RlLgotICovCi1zdGF0aWMgaW50IHNnaXZ3ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCAKLQkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNnaXZ3X3BhciAqcGFyID0gKHN0cnVjdCBzZ2l2d19wYXIgKilpbmZvLT5wYXI7Ci0Jc3RydWN0IGRiZV90aW1pbmdfaW5mbyAqdGltaW5nOwotCXVfbG9uZyBsaW5lX2xlbmd0aDsKLQl1X2xvbmcgbWluX21vZGU7Ci0JaW50IHJlcV9kb3Q7Ci0JaW50IHRlc3RfbW9kZTsKLQotCS8qCi0JICogIEZCX1ZNT0RFX0NPTlVQREFURSBhbmQgRkJfVk1PREVfU01PT1RIX1hQQU4gYXJlIGVxdWFsIQotCSAqICBhcyBGQl9WTU9ERV9TTU9PVEhfWFBBTiBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseQotCSAqLwotCi0JaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9DT05VUERBVEUpIHsKLQkJdmFyLT52bW9kZSB8PSBGQl9WTU9ERV9ZV1JBUDsKLQkJdmFyLT54b2Zmc2V0ID0gaW5mby0+dmFyLnhvZmZzZXQ7Ci0JCXZhci0+eW9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0OwotCX0KLQotCS8qIFhYWCBGSVhNRSAtIGZvcmNpbmcgdmFyJ3MgKi8KLQl2YXItPnhvZmZzZXQgPSAwOwotCXZhci0+eW9mZnNldCA9IDA7Ci0KLQkvKiBMaW1pdCBicHAgdG8gOCwgMTYsIGFuZCAzMiAqLwotCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDgpCi0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSA4OwotCWVsc2UgaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gMTYpCi0JCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKLQllbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDMyKQotCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMzI7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZhci0+Z3JheXNjYWxlID0gMDsJLyogTm8gZ3JheXNjYWxlIGZvciBub3cgKi8KLQotCS8qIGRldGVybWluZSB2YWxpZCByZXNvbHV0aW9uIGFuZCB0aW1pbmcgKi8KLQlmb3IgKG1pbl9tb2RlID0gMDsgbWluX21vZGUgPCBBUlJBWV9TSVpFKGRiZVZUaW1pbmdzKTsgbWluX21vZGUrKykgewotCQlpZiAoZGJlVlRpbWluZ3NbbWluX21vZGVdLndpZHRoID49IHZhci0+eHJlcyAmJgotCQkgICAgZGJlVlRpbWluZ3NbbWluX21vZGVdLmhlaWdodCA+PSB2YXItPnlyZXMpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAobWluX21vZGUgPT0gQVJSQVlfU0laRShkYmVWVGltaW5ncykpCi0JCXJldHVybiAtRUlOVkFMOwkvKiBSZXNvbHV0aW9uIHRvIGhpZ2ggKi8KLQotCS8qIFhYWCBGSVhNRSAtIHNob3VsZCB0cnkgdG8gcGljayBiZXN0IHJlZnJlc2ggcmF0ZSAqLwotCS8qIGZvciBub3csIHBpY2sgY2xvc2VzdCBkb3QtY2xvY2sgd2l0aGluIDNNSHogKi8KLQlyZXFfZG90ID0gUElDT1MyS0haKHZhci0+cGl4Y2xvY2spOwotCXByaW50ayhLRVJOX0lORk8gInNnaXZ3ZmI6IHJlcXVlc3RlZCBwaXhjbG9jaz0lZCBwcyAoJWQgS0h6KVxuIiwKLQkgICAgICAgdmFyLT5waXhjbG9jaywgcmVxX2RvdCk7Ci0JdGVzdF9tb2RlID0gbWluX21vZGU7Ci0Jd2hpbGUgKGRiZVZUaW1pbmdzW21pbl9tb2RlXS53aWR0aCA9PSBkYmVWVGltaW5nc1t0ZXN0X21vZGVdLndpZHRoKSB7Ci0JCWlmIChkYmVWVGltaW5nc1t0ZXN0X21vZGVdLmNmcmVxICsgMzAwMCA+IHJlcV9kb3QpCi0JCQlicmVhazsKLQkJdGVzdF9tb2RlKys7Ci0JfQotCWlmIChkYmVWVGltaW5nc1ttaW5fbW9kZV0ud2lkdGggIT0gZGJlVlRpbWluZ3NbdGVzdF9tb2RlXS53aWR0aCkKLQkJdGVzdF9tb2RlLS07Ci0JbWluX21vZGUgPSB0ZXN0X21vZGU7Ci0JdGltaW5nID0gJmRiZVZUaW1pbmdzW21pbl9tb2RlXTsKLQlwcmludGsoS0VSTl9JTkZPICJzZ2l2d2ZiOiBncmFudGVkIGRvdC1jbG9jaz0lZCBLSHpcbiIsIHRpbWluZy0+Y2ZyZXEpOwotCi0JLyogQWRqdXN0IHZpcnR1YWwgcmVzb2x1dGlvbiwgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsIHx8ICgheXdyYXAgJiYgIXlwYW4pKQotCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKLQlpZiAodmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwgfHwgKCF5d3JhcCAmJiAheXBhbikpCi0JCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzOwotCi0JLyoKLQkgKiAgTWVtb3J5IGxpbWl0Ci0JICovCi0JbGluZV9sZW5ndGggPSBnZXRfbGluZV9sZW5ndGgodmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwotCWlmIChsaW5lX2xlbmd0aCAqIHZhci0+eXJlc192aXJ0dWFsID4gc2dpdndmYl9tZW1fc2l6ZSkKLQkJcmV0dXJuIC1FTk9NRU07CS8qIFZpcnR1YWwgcmVzb2x1dGlvbiB0byBoaWdoICovCi0KLQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBsaW5lX2xlbmd0aDsKLQotCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgODoKLQkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKLQkJdmFyLT5yZWQubGVuZ3RoID0gODsKLQkJdmFyLT5ncmVlbi5vZmZzZXQgPSAwOwotCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7Ci0JCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQl2YXItPmJsdWUubGVuZ3RoID0gODsKLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoJCS8qIFJHQkEgNTU1MSAqLwotCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKLQkJdmFyLT5yZWQubGVuZ3RoID0gNTsKLQkJdmFyLT5ncmVlbi5vZmZzZXQgPSA2OwotCQl2YXItPmdyZWVuLmxlbmd0aCA9IDU7Ci0JCXZhci0+Ymx1ZS5vZmZzZXQgPSAxOwotCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoJCS8qIFJHQiA4ODg4ICovCi0JCXZhci0+cmVkLm9mZnNldCA9IDA7Ci0JCXZhci0+cmVkLmxlbmd0aCA9IDg7Ci0JCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKLQkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwotCQl2YXItPmJsdWUub2Zmc2V0ID0gMTY7Ci0JCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAyNDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoID0gODsKLQkJYnJlYWs7Ci0JfQotCXZhci0+cmVkLm1zYl9yaWdodCA9IDA7Ci0JdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOwotCXZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOwotCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7Ci0KLQkvKiBzZXQgdmlkZW8gdGltaW5nIGluZm9ybWF0aW9uICovCi0JdmFyLT5waXhjbG9jayA9IEtIWjJQSUNPUyh0aW1pbmctPmNmcmVxKTsKLQl2YXItPmxlZnRfbWFyZ2luID0gdGltaW5nLT5odG90YWwgLSB0aW1pbmctPmhzeW5jX2VuZDsKLQl2YXItPnJpZ2h0X21hcmdpbiA9IHRpbWluZy0+aHN5bmNfc3RhcnQgLSB0aW1pbmctPndpZHRoOwotCXZhci0+dXBwZXJfbWFyZ2luID0gdGltaW5nLT52dG90YWwgLSB0aW1pbmctPnZzeW5jX2VuZDsKLQl2YXItPmxvd2VyX21hcmdpbiA9IHRpbWluZy0+dnN5bmNfc3RhcnQgLSB0aW1pbmctPmhlaWdodDsKLQl2YXItPmhzeW5jX2xlbiA9IHRpbWluZy0+aHN5bmNfZW5kIC0gdGltaW5nLT5oc3luY19zdGFydDsKLQl2YXItPnZzeW5jX2xlbiA9IHRpbWluZy0+dnN5bmNfZW5kIC0gdGltaW5nLT52c3luY19zdGFydDsKLQotCS8qIE91Y2guIFRoaXMgYnJlYWtzIHRoZSBydWxlcyBidXQgdGltaW5nX251bSBpcyBvbmx5IGltcG9ydGFudCBpZiB5b3UKLQkqIGNoYW5nZSBhIHZpZGVvIG1vZGUgKi8KLQlwYXItPnRpbWluZ19udW0gPSBtaW5fbW9kZTsKLQotCXByaW50ayhLRVJOX0lORk8gInNnaXZ3ZmI6IG5ldyB2aWRlbyBtb2RlIHhyZXM9JWQgeXJlcz0lZCBicHA9JWRcbiIsCi0JCXZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKLQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICB2eHJlcz0lZCB2eXJlcz0lZFxuIiwgdmFyLT54cmVzX3ZpcnR1YWwsCi0JCXZhci0+eXJlc192aXJ0dWFsKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqICBTZXR1cCBmbGF0cGFuZWwgcmVsYXRlZCByZWdpc3RlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIHNnaXZ3ZmJfc2V0dXBfZmxhdHBhbmVsKHN0cnVjdCBzZ2l2d19wYXIgKnBhciwgc3RydWN0IGRiZV90aW1pbmdfaW5mbyAqY3VycmVudFRpbWluZykKLXsKLQlpbnQgZnBfd2lkLCBmcF9oZ3QsIGZwX3ZicywgZnBfdmJlOwotCXUzMiBvdXRwdXRWYWwgPSAwOwotCi0JU0VUX0RCRV9GSUVMRChWVF9GTEFHUywgSERSVl9JTlZFUlQsIG91dHB1dFZhbCwgCi0JCShjdXJyZW50VGltaW5nLT5mbGFncyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSA/IDAgOiAxKTsKLQlTRVRfREJFX0ZJRUxEKFZUX0ZMQUdTLCBWRFJWX0lOVkVSVCwgb3V0cHV0VmFsLCAKLQkJKGN1cnJlbnRUaW1pbmctPmZsYWdzICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSA/IDAgOiAxKTsKLQlEQkVfU0VUUkVHKHZ0X2ZsYWdzLCBvdXRwdXRWYWwpOwotCi0JLyogVHVybiBvbiB0aGUgZmxhdCBwYW5lbCAqLwotCXN3aXRjaCAoZmxhdHBhbmVsX2lkKSB7Ci0JCWNhc2UgRkxBVFBBTkVMX1NHSV8xNjAwU1c6Ci0JCQlmcF93aWQgPSAxNjAwOwotCQkJZnBfaGd0ID0gMTAyNDsKLQkJCWZwX3ZicyA9IDA7Ci0JCQlmcF92YmUgPSAxNjAwOwotCQkJY3VycmVudFRpbWluZy0+cGxsX20gPSA0OwotCQkJY3VycmVudFRpbWluZy0+cGxsX24gPSAxOwotCQkJY3VycmVudFRpbWluZy0+cGxsX3AgPSAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0gICAgICAJCQlmcF93aWQgPSBmcF9oZ3QgPSBmcF92YnMgPSBmcF92YmUgPSAweGZmZjsKLSAgCX0KLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChGUF9ERSwgRlBfREVfT04sIG91dHB1dFZhbCwgZnBfdmJzKTsKLQlTRVRfREJFX0ZJRUxEKEZQX0RFLCBGUF9ERV9PRkYsIG91dHB1dFZhbCwgZnBfdmJlKTsKLQlEQkVfU0VUUkVHKGZwX2RlLCBvdXRwdXRWYWwpOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChGUF9IRFJWLCBGUF9IRFJWX09GRiwgb3V0cHV0VmFsLCBmcF93aWQpOwotCURCRV9TRVRSRUcoZnBfaGRydiwgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoRlBfVkRSViwgRlBfVkRSVl9PTiwgb3V0cHV0VmFsLCAxKTsKLQlTRVRfREJFX0ZJRUxEKEZQX1ZEUlYsIEZQX1ZEUlZfT0ZGLCBvdXRwdXRWYWwsIGZwX2hndCArIDEpOwotCURCRV9TRVRSRUcoZnBfdmRydiwgb3V0cHV0VmFsKTsKLX0KLQotLyoKLSAqICBTZXQgdGhlIGhhcmR3YXJlIGFjY29yZGluZyB0byAncGFyJy4KLSAqLwotc3RhdGljIGludCBzZ2l2d2ZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHNnaXZ3X3BhciAqcGFyID0gaW5mby0+cGFyOwotCWludCBpLCBqLCBodG1wLCB0ZW1wOwotCXUzMiByZWFkVmFsLCBvdXRwdXRWYWw7Ci0JaW50IHdob2xlVGlsZXNYLCBtYXhQaXhlbHNQZXJUaWxlWDsKLQlpbnQgZnJtV3JpdGUxLCBmcm1Xcml0ZTIsIGZybVdyaXRlM2I7Ci0Jc3RydWN0IGRiZV90aW1pbmdfaW5mbyAqY3VycmVudFRpbWluZzsgLyogQ3VycmVudCBWaWRlbyBUaW1pbmcgKi8KLQlpbnQgeHBtYXgsIHlwbWF4OwkvLyBNb25pdG9yIHJlc29sdXRpb24KLQlpbnQgYnl0ZXNQZXJQaXhlbDsJLy8gQnl0ZXMgcGVyIHBpeGVsCi0KLQljdXJyZW50VGltaW5nID0gJmRiZVZUaW1pbmdzW3Bhci0+dGltaW5nX251bV07Ci0JYnl0ZXNQZXJQaXhlbCA9IGJ5dGVzX3Blcl9waXhlbChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwotCXhwbWF4ID0gY3VycmVudFRpbWluZy0+d2lkdGg7Ci0JeXBtYXggPSBjdXJyZW50VGltaW5nLT5oZWlnaHQ7Ci0KLQkvKiBkYmVfSW5pdEdyYXBoaWNzQmFzZSgpOyAqLwotCS8qIFR1cm4gb24gZG90Y2xvY2sgUExMICovCi0JREJFX1NFVFJFRyhjdHJsc3RhdCwgMHgyMDAwMDAwMCk7Ci0KLQlkYmVfVHVybk9mZkRtYShwYXIpOwotCi0JLyogZGJlX0NhbGN1bGF0ZVNjcmVlblBhcmFtcygpOyAqLwotCW1heFBpeGVsc1BlclRpbGVYID0gNTEyIC8gYnl0ZXNQZXJQaXhlbDsKLQl3aG9sZVRpbGVzWCA9IHhwbWF4IC8gbWF4UGl4ZWxzUGVyVGlsZVg7Ci0JaWYgKHdob2xlVGlsZXNYICogbWF4UGl4ZWxzUGVyVGlsZVggPCB4cG1heCkKLQkJd2hvbGVUaWxlc1grKzsKLQotCXByaW50ayhLRVJOX0RFQlVHICJzZ2l2d2ZiOiBwaXhQZXJUaWxlPSVkIHdob2xlVGlsZXNYPSVkXG4iLAotCSAgICAgICBtYXhQaXhlbHNQZXJUaWxlWCwgd2hvbGVUaWxlc1gpOwotCi0JLyogZGJlX0luaXRHYW1tYU1hcCgpOyAqLwotCXVkZWxheSgxMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJREJFX0lTRVRSRUcoZ21hcCwgaSwgKGkgPDwgMjQpIHwgKGkgPDwgMTYpIHwgKGkgPDwgOCkpOwotCX0KLQotCS8qIGRiZV9UdXJuT24oKTsgKi8KLQlEQkVfR0VUUkVHKHZ0X3h5LCByZWFkVmFsKTsKLQlpZiAoR0VUX0RCRV9GSUVMRChWVF9YWSwgVlRfRlJFRVpFLCByZWFkVmFsKSA9PSAxKSB7Ci0JCURCRV9TRVRSRUcodnRfeHksIDB4MDAwMDAwMDApOwotCQl1ZGVsYXkoMSk7Ci0JfSBlbHNlCi0JCWRiZV9UdXJuT2ZmRG1hKHBhcik7Ci0KLQkvKiBkYmVfSW5pdGRiZSgpOyAqLwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKLQkJCURCRV9HRVRSRUcoY21fZmlmbywgcmVhZFZhbCk7Ci0JCQlpZiAocmVhZFZhbCAhPSAweDAwMDAwMDAwKQotCQkJCWJyZWFrOwotCQkJZWxzZQotCQkJCXVkZWxheSgxMCk7Ci0JCX0KLQotCQkvLyBEQkVfSVNFVFJFRyhjbWFwLCBpLCAweDAwMDAwMDAwKTsKLQkJREJFX0lTRVRSRUcoY21hcCwgaSwgKGkgPDwgOCkgfCAoaSA8PCAxNikgfCAoaSA8PCAyNCkpOwotCX0KLQotCS8qIGRiZV9Jbml0RnJhbWVidWZmZXIoKTsgKi8KLQlmcm1Xcml0ZTEgPSAwOwotCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX1dJRFRIX1RJTEUsIGZybVdyaXRlMSwKLQkJICAgICAgd2hvbGVUaWxlc1gpOwotCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX1JIUywgZnJtV3JpdGUxLCAwKTsKLQotCXN3aXRjaCAoYnl0ZXNQZXJQaXhlbCkgewotCWNhc2UgMToKLQkJU0VUX0RCRV9GSUVMRChGUk1fU0laRV9USUxFLCBGUk1fREVQVEgsIGZybVdyaXRlMSwKLQkJCSAgICAgIERCRV9GUk1fREVQVEhfOCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJU0VUX0RCRV9GSUVMRChGUk1fU0laRV9USUxFLCBGUk1fREVQVEgsIGZybVdyaXRlMSwKLQkJCSAgICAgIERCRV9GUk1fREVQVEhfMTYpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCVNFVF9EQkVfRklFTEQoRlJNX1NJWkVfVElMRSwgRlJNX0RFUFRILCBmcm1Xcml0ZTEsCi0JCQkgICAgICBEQkVfRlJNX0RFUFRIXzMyKTsKLQkJYnJlYWs7Ci0JfQotCi0JZnJtV3JpdGUyID0gMDsKLQlTRVRfREJFX0ZJRUxEKEZSTV9TSVpFX1BJWEVMLCBGQl9IRUlHSFRfUElYLCBmcm1Xcml0ZTIsIHlwbWF4KTsKLQotCS8vIFRlbGwgZGJlIGFib3V0IHRoZSBmcmFtZWJ1ZmZlciBsb2NhdGlvbiBhbmQgdHlwZQotCS8vIFhYWCBXaGF0IGZvcm1hdCBpcyB0aGUgRlJNX1RJTEVfUFRSPz8gIDY0SyBhbGlnbmVkIGFkZHJlc3M/Ci0JZnJtV3JpdGUzYiA9IDA7Ci0JU0VUX0RCRV9GSUVMRChGUk1fQ09OVFJPTCwgRlJNX1RJTEVfUFRSLCBmcm1Xcml0ZTNiLAotCQkgICAgICBzZ2l2d2ZiX21lbV9waHlzID4+IDkpOwotCVNFVF9EQkVfRklFTEQoRlJNX0NPTlRST0wsIEZSTV9ETUFfRU5BQkxFLCBmcm1Xcml0ZTNiLCAxKTsKLQlTRVRfREJFX0ZJRUxEKEZSTV9DT05UUk9MLCBGUk1fTElORUFSLCBmcm1Xcml0ZTNiLCAxKTsKLQotCS8qIEluaXRpYWxpemUgRElEcyAqLwotCi0Jb3V0cHV0VmFsID0gMDsKLQlzd2l0Y2ggKGJ5dGVzUGVyUGl4ZWwpIHsKLQljYXNlIDE6Ci0JCVNFVF9EQkVfRklFTEQoV0lELCBUWVAsIG91dHB1dFZhbCwgREJFX0NNT0RFX0k4KTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlTRVRfREJFX0ZJRUxEKFdJRCwgVFlQLCBvdXRwdXRWYWwsIERCRV9DTU9ERV9SR0JBNSk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJU0VUX0RCRV9GSUVMRChXSUQsIFRZUCwgb3V0cHV0VmFsLCBEQkVfQ01PREVfUkdCOCk7Ci0JCWJyZWFrOwotCX0KLQlTRVRfREJFX0ZJRUxEKFdJRCwgQlVGLCBvdXRwdXRWYWwsIERCRV9CTU9ERV9CT1RIKTsKLQotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCURCRV9JU0VUUkVHKG1vZGVfcmVncywgaSwgb3V0cHV0VmFsKTsKLQl9Ci0KLQkvKiBkYmVfSW5pdFRpbWluZygpOyAqLwotCURCRV9TRVRSRUcodnRfaW50cjAxLCAweGZmZmZmZmZmKTsKLQlEQkVfU0VUUkVHKHZ0X2ludHIyMywgMHhmZmZmZmZmZik7Ci0KLQlEQkVfR0VUUkVHKGRvdGNsb2NrLCByZWFkVmFsKTsKLQlEQkVfU0VUUkVHKGRvdGNsb2NrLCByZWFkVmFsICYgMHhmZmZmKTsKLQotCURCRV9TRVRSRUcodnRfeHltYXgsIDB4MDAwMDAwMDApOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9WU1lOQywgVlRfVlNZTkNfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dnN5bmNfc3RhcnQpOwotCVNFVF9EQkVfRklFTEQoVlRfVlNZTkMsIFZUX1ZTWU5DX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52c3luY19lbmQpOwotCURCRV9TRVRSRUcodnRfdnN5bmMsIG91dHB1dFZhbCk7Ci0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX0hTWU5DLCBWVF9IU1lOQ19PTiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT5oc3luY19zdGFydCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9IU1lOQywgVlRfSFNZTkNfT0ZGLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPmhzeW5jX2VuZCk7Ci0JREJFX1NFVFJFRyh2dF9oc3luYywgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVlRfVkJMQU5LLCBWVF9WQkxBTktfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dmJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZCTEFOSywgVlRfVkJMQU5LX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52YmxhbmtfZW5kKTsKLQlEQkVfU0VUUkVHKHZ0X3ZibGFuaywgb3V0cHV0VmFsKTsKLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoVlRfSEJMQU5LLCBWVF9IQkxBTktfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX0hCTEFOSywgVlRfSEJMQU5LX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gMyk7Ci0JREJFX1NFVFJFRyh2dF9oYmxhbmssIG91dHB1dFZhbCk7Ci0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZDTUFQLCBWVF9WQ01BUF9PTiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52Ymxhbmtfc3RhcnQpOwotCVNFVF9EQkVfRklFTEQoVlRfVkNNQVAsIFZUX1ZDTUFQX09GRiwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT52YmxhbmtfZW5kKTsKLQlEQkVfU0VUUkVHKHZ0X3ZjbWFwLCBvdXRwdXRWYWwpOwotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9IQ01BUCwgVlRfSENNQVBfT04sIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX0hDTUFQLCBWVF9IQ01BUF9PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCAtIDMpOwotCURCRV9TRVRSRUcodnRfaGNtYXAsIG91dHB1dFZhbCk7Ci0KLQlpZiAoZmxhdHBhbmVsX2lkICE9IC0xKQotCQlzZ2l2d2ZiX3NldHVwX2ZsYXRwYW5lbChwYXIsIGN1cnJlbnRUaW1pbmcpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQl0ZW1wID0gY3VycmVudFRpbWluZy0+dmJsYW5rX3N0YXJ0IC0gY3VycmVudFRpbWluZy0+dmJsYW5rX2VuZCAtIDE7Ci0JaWYgKHRlbXAgPiAwKQotCQl0ZW1wID0gLXRlbXA7Ci0KLQlTRVRfREJFX0ZJRUxEKERJRF9TVEFSVF9YWSwgRElEX1NUQVJUWSwgb3V0cHV0VmFsLCAodTMyKSB0ZW1wKTsKLQlpZiAoY3VycmVudFRpbWluZy0+aGJsYW5rX2VuZCA+PSAyMCkKLQkJU0VUX0RCRV9GSUVMRChESURfU1RBUlRfWFksIERJRF9TVEFSVFgsIG91dHB1dFZhbCwKLQkJCSAgICAgIGN1cnJlbnRUaW1pbmctPmhibGFua19lbmQgLSAyMCk7Ci0JZWxzZQotCQlTRVRfREJFX0ZJRUxEKERJRF9TVEFSVF9YWSwgRElEX1NUQVJUWCwgb3V0cHV0VmFsLAotCQkJICAgICAgY3VycmVudFRpbWluZy0+aHRvdGFsIC0gKDIwIC0KLQkJCQkJCSAgICAgICBjdXJyZW50VGltaW5nLT4KLQkJCQkJCSAgICAgICBoYmxhbmtfZW5kKSk7Ci0JREJFX1NFVFJFRyhkaWRfc3RhcnRfeHksIG91dHB1dFZhbCk7Ci0KLQlvdXRwdXRWYWwgPSAwOwotCVNFVF9EQkVfRklFTEQoQ1JTX1NUQVJUX1hZLCBDUlNfU1RBUlRZLCBvdXRwdXRWYWwsCi0JCSAgICAgICh1MzIpICh0ZW1wICsgMSkpOwotCWlmIChjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kID49IERCRV9DUlNfTUFHSUMpCi0JCVNFVF9EQkVfRklFTEQoQ1JTX1NUQVJUX1hZLCBDUlNfU1RBUlRYLCBvdXRwdXRWYWwsCi0JCQkgICAgICBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gREJFX0NSU19NQUdJQyk7Ci0JZWxzZQotCQlTRVRfREJFX0ZJRUxEKENSU19TVEFSVF9YWSwgQ1JTX1NUQVJUWCwgb3V0cHV0VmFsLAotCQkJICAgICAgY3VycmVudFRpbWluZy0+aHRvdGFsIC0gKERCRV9DUlNfTUFHSUMgLQotCQkJCQkJICAgICAgIGN1cnJlbnRUaW1pbmctPgotCQkJCQkJICAgICAgIGhibGFua19lbmQpKTsKLQlEQkVfU0VUUkVHKGNyc19zdGFydF94eSwgb3V0cHV0VmFsKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWQ19TVEFSVF9YWSwgVkNfU1RBUlRZLCBvdXRwdXRWYWwsICh1MzIpIHRlbXApOwotCVNFVF9EQkVfRklFTEQoVkNfU1RBUlRfWFksIFZDX1NUQVJUWCwgb3V0cHV0VmFsLAotCQkgICAgICBjdXJyZW50VGltaW5nLT5oYmxhbmtfZW5kIC0gNCk7Ci0JREJFX1NFVFJFRyh2Y19zdGFydF94eSwgb3V0cHV0VmFsKTsKLQotCURCRV9TRVRSRUcoZnJtX3NpemVfdGlsZSwgZnJtV3JpdGUxKTsKLQlEQkVfU0VUUkVHKGZybV9zaXplX3BpeGVsLCBmcm1Xcml0ZTIpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKERPVENMSywgTSwgb3V0cHV0VmFsLCBjdXJyZW50VGltaW5nLT5wbGxfbSAtIDEpOwotCVNFVF9EQkVfRklFTEQoRE9UQ0xLLCBOLCBvdXRwdXRWYWwsIGN1cnJlbnRUaW1pbmctPnBsbF9uIC0gMSk7Ci0JU0VUX0RCRV9GSUVMRChET1RDTEssIFAsIG91dHB1dFZhbCwgY3VycmVudFRpbWluZy0+cGxsX3ApOwotCVNFVF9EQkVfRklFTEQoRE9UQ0xLLCBSVU4sIG91dHB1dFZhbCwgMSk7Ci0JREJFX1NFVFJFRyhkb3RjbG9jaywgb3V0cHV0VmFsKTsKLQotCXVkZWxheSgxMSAqIDEwMDApOwotCi0JREJFX1NFVFJFRyh2dF92cGl4ZW4sIDB4ZmZmZmZmKTsKLQlEQkVfU0VUUkVHKHZ0X2hwaXhlbiwgMHhmZmZmZmYpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKFZUX1hZTUFYLCBWVF9NQVhYLCBvdXRwdXRWYWwsIGN1cnJlbnRUaW1pbmctPmh0b3RhbCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9YWU1BWCwgVlRfTUFYWSwgb3V0cHV0VmFsLCBjdXJyZW50VGltaW5nLT52dG90YWwpOwotCURCRV9TRVRSRUcodnRfeHltYXgsIG91dHB1dFZhbCk7Ci0KLQlvdXRwdXRWYWwgPSBmcm1Xcml0ZTE7Ci0JU0VUX0RCRV9GSUVMRChGUk1fU0laRV9USUxFLCBGUk1fRklGT19SRVNFVCwgb3V0cHV0VmFsLCAxKTsKLQlEQkVfU0VUUkVHKGZybV9zaXplX3RpbGUsIG91dHB1dFZhbCk7Ci0JREJFX1NFVFJFRyhmcm1fc2l6ZV90aWxlLCBmcm1Xcml0ZTEpOwotCi0Jb3V0cHV0VmFsID0gMDsKLQlTRVRfREJFX0ZJRUxEKE9WUl9XSURUSF9USUxFLCBPVlJfRklGT19SRVNFVCwgb3V0cHV0VmFsLCAxKTsKLQlEQkVfU0VUUkVHKG92cl93aWR0aF90aWxlLCBvdXRwdXRWYWwpOwotCURCRV9TRVRSRUcob3ZyX3dpZHRoX3RpbGUsIDApOwotCi0JREJFX1NFVFJFRyhmcm1fY29udHJvbCwgZnJtV3JpdGUzYik7Ci0JREJFX1NFVFJFRyhkaWRfY29udHJvbCwgMCk7Ci0KLQkvLyBXYWl0IGZvciBkYmUgdG8gdGFrZSBmcmFtZSBzZXR0aW5ncwotCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgewotCQlEQkVfR0VUUkVHKGZybV9pbmh3Y3RybCwgcmVhZFZhbCk7Ci0JCWlmIChHRVRfREJFX0ZJRUxEKEZSTV9JTkhXQ1RSTCwgRlJNX0RNQV9FTkFCTEUsIHJlYWRWYWwpICE9Ci0JCSAgICAwKQotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJCXVkZWxheSgxKTsKLQl9Ci0KLQlpZiAoaSA9PSAxMDAwMDApCi0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJzZ2l2d2ZiOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGZyYW1lIERNQSBlbmFibGUuXG4iKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JaHRtcCA9IGN1cnJlbnRUaW1pbmctPmhibGFua19lbmQgLSAxOTsKLQlpZiAoaHRtcCA8IDApCi0JCWh0bXAgKz0gY3VycmVudFRpbWluZy0+aHRvdGFsOwkvKiBhbGxvdyBibGFuayB0byB3cmFwIGFyb3VuZCAqLwotCVNFVF9EQkVfRklFTEQoVlRfSFBJWEVOLCBWVF9IUElYRU5fT04sIG91dHB1dFZhbCwgaHRtcCk7Ci0JU0VUX0RCRV9GSUVMRChWVF9IUElYRU4sIFZUX0hQSVhFTl9PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgKChodG1wICsgY3VycmVudFRpbWluZy0+d2lkdGggLQotCQkJMikgJSBjdXJyZW50VGltaW5nLT5odG90YWwpKTsKLQlEQkVfU0VUUkVHKHZ0X2hwaXhlbiwgb3V0cHV0VmFsKTsKLQotCW91dHB1dFZhbCA9IDA7Ci0JU0VUX0RCRV9GSUVMRChWVF9WUElYRU4sIFZUX1ZQSVhFTl9PRkYsIG91dHB1dFZhbCwKLQkJICAgICAgY3VycmVudFRpbWluZy0+dmJsYW5rX3N0YXJ0KTsKLQlTRVRfREJFX0ZJRUxEKFZUX1ZQSVhFTiwgVlRfVlBJWEVOX09OLCBvdXRwdXRWYWwsCi0JCSAgICAgIGN1cnJlbnRUaW1pbmctPnZibGFua19lbmQpOwotCURCRV9TRVRSRUcodnRfdnBpeGVuLCBvdXRwdXRWYWwpOwotCi0JLy8gVHVybiBvZmYgbW91c2UgY3Vyc29yCi0JcGFyLT5yZWdzLT5jcnNfY3RsID0gMDsKLQotCS8vIFhYWCBXaGF0J3MgdGhpcyBzZWN0aW9uIGZvcj8/Ci0JREJFX0dFVFJFRyhjdHJsc3RhdCwgcmVhZFZhbCk7Ci0JcmVhZFZhbCAmPSAweDAyMDAwMDAwOwotCi0JaWYgKHJlYWRWYWwgIT0gMCkgewotCQlEQkVfU0VUUkVHKGN0cmxzdGF0LCAweDMwMDAwMDAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGFyZSBhbHJlYWR5Ci0gKiAgcm91bmRlZCBkb3duIHRvIHRoZSBoYXJkd2FyZSdzIGNhcGFiaWxpdGllcyAoYWNjb3JkaW5nIHRvIHRoZQotICogIGVudHJpZXMgaW4gdGhlIHZhciBzdHJ1Y3R1cmUpLiBSZXR1cm4gIT0gMCBmb3IgaW52YWxpZCByZWduby4KLSAqLwotCi1zdGF0aWMgaW50IHNnaXZ3ZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLAotCQkJICAgICB1X2ludCBibHVlLCB1X2ludCB0cmFuc3AsCi0JCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBzZ2l2d19wYXIgKnBhciA9IChzdHJ1Y3Qgc2dpdndfcGFyICopIGluZm8tPnBhcjsKLQotCWlmIChyZWdubyA+IDI1NSkKLQkJcmV0dXJuIDE7Ci0JcmVkID4+PSA4OwotCWdyZWVuID4+PSA4OwotCWJsdWUgPj49IDg7Ci0KLQkvKiB3YWl0IGZvciB0aGUgY29sb3IgbWFwIEZJRk8gdG8gaGF2ZSBhIGZyZWUgZW50cnkgKi8KLQl3aGlsZSAocGFyLT5jbWFwX2ZpZm8gPT0gMCkKLQkJcGFyLT5jbWFwX2ZpZm8gPSBwYXItPnJlZ3MtPmNtX2ZpZm87Ci0KLQlwYXItPnJlZ3MtPmNtYXBbcmVnbm9dID0gKHJlZCA8PCAyNCkgfCAoZ3JlZW4gPDwgMTYpIHwgKGJsdWUgPDwgOCk7Ci0JcGFyLT5jbWFwX2ZpZm8tLTsJLyogYXNzdW1lIEZJRk8gaXMgZmlsbGluZyB1cCAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNnaXZ3ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWludCByOwotCi0JcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgPQotCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8IF9QQUdFX1BDRDsKLQotCXIgPSB2bV9pb21hcF9tZW1vcnkodm1hLCBzZ2l2d2ZiX21lbV9waHlzLCBzZ2l2d2ZiX21lbV9zaXplKTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJzZ2l2d2ZiOiBtbWFwIGZyYW1lYnVmZmVyIFAoJWx4KS0+ViglbHgpXG4iLAotCQlzZ2l2d2ZiX21lbV9waHlzICsgKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCksIHZtYS0+dm1fc3RhcnQpOwotCi0JcmV0dXJuIHI7Ci19Ci0KLWludCBfX2luaXQgc2dpdndmYl9zZXR1cChjaGFyICpvcHRpb25zKQotewotCWNoYXIgKnRoaXNfb3B0OwotCi0JaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm1vbml0b3I6IiwgOCkpIHsKLQkJCWlmICghc3RybmNtcCh0aGlzX29wdCArIDgsICJjcnQiLCAzKSkKLQkJCQlmbGF0cGFuZWxfaWQgPSAtMTsKLQkJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0ICsgOCwgIjE2MDBzdyIsIDYpKQotCQkJCWZsYXRwYW5lbF9pZCA9IEZMQVRQQU5FTF9TR0lfMTYwMFNXOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogIEluaXRpYWxpc2F0aW9uCi0gKi8KLXN0YXRpYyBpbnQgc2dpdndmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNnaXZ3X3BhciAqcGFyOwotCXN0cnVjdCBmYl9pbmZvICppbmZvOwotCWNoYXIgKm1vbml0b3I7Ci0KLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ2l2d19wYXIpICsgc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKLQlpZiAoIWluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCXBhciA9IGluZm8tPnBhcjsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKERCRV9SRUdfUEhZUywgREJFX1JFR19TSVpFLCAic2dpdndmYiIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2dpdndmYjogY291bGRuJ3QgcmVzZXJ2ZSBtbWlvIHJlZ2lvblxuIik7Ci0JCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcGFyLT5yZWdzID0gKHN0cnVjdCBhc3JlZ3MgKikgaW9yZW1hcF9ub2NhY2hlKERCRV9SRUdfUEhZUywgREJFX1JFR19TSVpFKTsKLQlpZiAoIXBhci0+cmVncykgewotCQlwcmludGsoS0VSTl9FUlIgInNnaXZ3ZmI6IGNvdWxkbid0IGlvcmVtYXAgcmVnaXN0ZXJzXG4iKTsKLQkJZ290byBmYWlsX2lvcmVtYXBfcmVnczsKLQl9Ci0KLQltdHJyX2FkZChzZ2l2d2ZiX21lbV9waHlzLCBzZ2l2d2ZiX21lbV9zaXplLCBNVFJSX1RZUEVfV1JDT01CLCAxKTsKLQotCXNnaXZ3ZmJfZml4LnNtZW1fc3RhcnQgPSBzZ2l2d2ZiX21lbV9waHlzOwotCXNnaXZ3ZmJfZml4LnNtZW1fbGVuID0gc2dpdndmYl9tZW1fc2l6ZTsKLQlzZ2l2d2ZiX2ZpeC55d3JhcHN0ZXAgPSB5d3JhcDsKLQlzZ2l2d2ZiX2ZpeC55cGFuc3RlcCA9IHlwYW47Ci0KLQlpbmZvLT5maXggPSBzZ2l2d2ZiX2ZpeDsKLQotCXN3aXRjaCAoZmxhdHBhbmVsX2lkKSB7Ci0JCWNhc2UgRkxBVFBBTkVMX1NHSV8xNjAwU1c6Ci0JCQlpbmZvLT52YXIgPSBzZ2l2d2ZiX3ZhcjE2MDBzdzsKLQkJCW1vbml0b3IgPSAiU0dJIDE2MDBTVyBmbGF0cGFuZWwiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpbmZvLT52YXIgPSBzZ2l2d2ZiX3ZhcjsKLQkJCW1vbml0b3IgPSAiQ1JUIjsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJzZ2l2d2ZiOiAlcyBtb25pdG9yIHNlbGVjdGVkXG4iLCBtb25pdG9yKTsKLQotCWluZm8tPmZib3BzID0gJnNnaXZ3ZmJfb3BzOwotCWluZm8tPnBzZXVkb19wYWxldHRlID0gKHZvaWQgKikgKHBhciArIDEpOwotCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7Ci0KLQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZSgodW5zaWduZWQgbG9uZykgc2dpdndmYl9tZW1fcGh5cywgc2dpdndmYl9tZW1fc2l6ZSk7Ci0JaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgInNnaXZ3ZmI6IGNvdWxkbid0IGlvcmVtYXAgc2NyZWVuX2Jhc2VcbiIpOwotCQlnb3RvIGZhaWxfaW9yZW1hcF9mYm1lbTsKLQl9Ci0KLQlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSA8IDApCi0JCWdvdG8gZmFpbF9jb2xvcl9tYXA7Ci0KLQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2dpdndmYjogY291bGRuJ3QgcmVnaXN0ZXIgZnJhbWVidWZmZXJcbiIpOwotCQlnb3RvIGZhaWxfcmVnaXN0ZXJfZnJhbWVidWZmZXI7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKLQotCWZiX2luZm8oaW5mbywgIlNHSSBEQkUgZnJhbWUgYnVmZmVyIGRldmljZSwgdXNpbmcgJWxkSyBvZiB2aWRlbyBtZW1vcnkgYXQgJSNseFxuIiwKLQkJc2dpdndmYl9tZW1fc2l6ZSA+PiAxMCwgc2dpdndmYl9tZW1fcGh5cyk7Ci0JcmV0dXJuIDA7Ci0KLWZhaWxfcmVnaXN0ZXJfZnJhbWVidWZmZXI6Ci0JZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKLWZhaWxfY29sb3JfbWFwOgotCWlvdW5tYXAoKGNoYXIgKikgaW5mby0+c2NyZWVuX2Jhc2UpOwotZmFpbF9pb3JlbWFwX2ZibWVtOgotCWlvdW5tYXAocGFyLT5yZWdzKTsKLWZhaWxfaW9yZW1hcF9yZWdzOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihEQkVfUkVHX1BIWVMsIERCRV9SRUdfU0laRSk7Ci0JZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLQlyZXR1cm4gLUVOWElPOwotfQotCi1zdGF0aWMgaW50IHNnaXZ3ZmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoaW5mbykgewotCQlzdHJ1Y3Qgc2dpdndfcGFyICpwYXIgPSBpbmZvLT5wYXI7Ci0KLQkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKLQkJZGJlX1R1cm5PZmZEbWEocGFyKTsKLQkJaW91bm1hcChwYXItPnJlZ3MpOwotCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKERCRV9SRUdfUEhZUywgREJFX1JFR19TSVpFKTsKLQkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKLQkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNnaXZ3ZmJfZHJpdmVyID0gewotCS5wcm9iZQk9IHNnaXZ3ZmJfcHJvYmUsCi0JLnJlbW92ZQk9IHNnaXZ3ZmJfcmVtb3ZlLAotCS5kcml2ZXIJPSB7Ci0JCS5uYW1lCT0gInNnaXZ3ZmIiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2dpdndmYl9kZXZpY2U7Ci0KLWludCBfX2luaXQgc2dpdndmYl9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotI2lmbmRlZiBNT0RVTEUKLQljaGFyICpvcHRpb24gPSBOVUxMOwotCi0JaWYgKGZiX2dldF9vcHRpb25zKCJzZ2l2d2ZiIiwgJm9wdGlvbikpCi0JCXJldHVybiAtRU5PREVWOwotCXNnaXZ3ZmJfc2V0dXAob3B0aW9uKTsKLSNlbmRpZgotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2dpdndmYl9kcml2ZXIpOwotCWlmICghcmV0KSB7Ci0JCXNnaXZ3ZmJfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzZ2l2d2ZiIiwgMCk7Ci0JCWlmIChzZ2l2d2ZiX2RldmljZSkgewotCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzZ2l2d2ZiX2RldmljZSk7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLUVOT01FTTsKLQkJaWYgKHJldCkgewotCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNnaXZ3ZmJfZHJpdmVyKTsKLQkJCXBsYXRmb3JtX2RldmljZV9wdXQoc2dpdndmYl9kZXZpY2UpOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLW1vZHVsZV9pbml0KHNnaXZ3ZmJfaW5pdCk7Ci0KLSNpZmRlZiBNT0RVTEUKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNnaXZ3ZmJfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNnaXZ3ZmJfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2dpdndmYl9kcml2ZXIpOwotfQotCi1tb2R1bGVfZXhpdChzZ2l2d2ZiX2V4aXQpOwotCi0jZW5kaWYJCQkJLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3V2ZXNhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jCmluZGV4IDI1NmZiYTcuLjFmMzg0NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAl1dmZiX3Rhc2tzW3NlcV0gPSB0YXNrOwogCW11dGV4X3VubG9jaygmdXZmYl9sb2NrKTsKIAotCWVyciA9IGNuX25ldGxpbmtfc2VuZChtLCAwLCBHRlBfS0VSTkVMKTsKKwllcnIgPSBjbl9uZXRsaW5rX3NlbmQobSwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVyciA9PSAtRVNSQ0gpIHsKIAkJLyoKIAkJICogVHJ5IHRvIHN0YXJ0IHRoZSB1c2Vyc3BhY2UgaGVscGVyIGlmIHNlbmRpbmcKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQkJCQkiaGVscGVyIGlzIGluc3RhbGxlZCBhbmQgZXhlY3V0YWJsZVxuIik7CiAJCX0gZWxzZSB7CiAJCQl2ODZkX3N0YXJ0ZWQgPSAxOwotCQkJZXJyID0gY25fbmV0bGlua19zZW5kKG0sIDAsIGdmcF9hbnkoKSk7CisJCQllcnIgPSBjbl9uZXRsaW5rX3NlbmQobSwgMCwgMCwgZ2ZwX2FueSgpKTsKIAkJCWlmIChlcnIgPT0gLUVOT0JVRlMpCiAJCQkJZXJyID0gMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKaW5kZXggMWI1ZDQ4Yy4uYmZiMmQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC04NjksMTQgKzg2OSwxMyBAQAogCiAJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKLQkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaGFuZGxlcyBWTUUgYWRkcmVzcyBhbGlnbm1lbnQgcHJvYmxlbQotCSAqIGluIG9yZGVyIHRvIGFzc3VyZSB0aGUgbWF4aW1hbCBkYXRhIHdpZHRoIGN5Y2xlLgotCSAqIFdlIGNhbm5vdCB1c2UgbWVtY3B5X3h4eCBkaXJlY3RseSBoZXJlIGJlY2F1c2UgaXQKLQkgKiBtYXkgY3V0IGRhdGEgdHJhbnNmZXIgaW4gOC1iaXRzIGN5Y2xlcywgdGh1cyBtYWtpbmcKLQkgKiBEMTYgY3ljbGUgaW1wb3NzaWJsZS4KLQkgKiBGcm9tIHRoZSBvdGhlciBoYW5kLCB0aGUgYnJpZGdlIGl0c2VsZiBhc3N1cmVzIHRoYXQKLQkgKiBtYXhpbWFsIGNvbmZpZ3VyZWQgZGF0YSBjeWNsZSBpcyB1c2VkIGFuZCBzcGxpdHMgaXQKLQkgKiBhdXRvbWF0aWNhbGx5IGZvciBub24tYWxpZ25lZCBhZGRyZXNzZXMuCisJLyogVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgVk1FIGFkZHJlc3MgYWxpZ25tZW50LiBXZSBjYW5ub3QgdXNlCisJICogbWVtY3B5X3h4eCBoZXJlIGJlY2F1c2UgaXQgbWF5IGN1dCBkYXRhIHRyYW5zZmVycyBpbiB0byA4LWJpdAorCSAqIGN5Y2xlcyB3aGVuIEQxNiBvciBEMzIgY3ljbGVzIGFyZSByZXF1aXJlZCBvbiB0aGUgVk1FIGJ1cy4KKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGJyaWRnZSBpdHNlbGYgYXNzdXJlcyB0aGF0IHRoZSBtYXhpbXVtIGRhdGEKKwkgKiBjeWNsZSBjb25maWd1cmVkIGZvciB0aGUgdHJhbnNmZXIgaXMgdXNlZCBhbmQgc3BsaXRzIGl0CisJICogYXV0b21hdGljYWxseSBmb3Igbm9uLWFsaWduZWQgYWRkcmVzc2VzLCBzbyB3ZSBkb24ndCB3YW50IHRoZQorCSAqIG92ZXJoZWFkIG9mIG5lZWRsZXNzbHkgZm9yY2luZyBzbWFsbCB0cmFuc2ZlcnMgZm9yIHRoZSBlbnRpcmUgY3ljbGUuCiAJICovCiAJaWYgKCh1aW50cHRyX3QpYWRkciAmIDB4MSkgewogCQkqKHU4ICopYnVmID0gaW9yZWFkOChhZGRyKTsKQEAgLTg5Niw5ICs4OTUsOSBAQAogCX0KIAogCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7Ci0JaWYgKGNvdW50MzIgPiAwKSB7Ci0JCW1lbWNweV9mcm9taW8oYnVmICsgZG9uZSwgYWRkciArIGRvbmUsICh1bnNpZ25lZCBpbnQpY291bnQpOwotCQlkb25lICs9IGNvdW50MzI7CisJd2hpbGUgKGRvbmUgPCBjb3VudDMyKSB7CisJCSoodTMyICopKGJ1ZiArIGRvbmUpID0gaW9yZWFkMzIoYWRkciArIGRvbmUpOworCQlkb25lICs9IDQ7CiAJfQogCiAJaWYgKChjb3VudCAtIGRvbmUpICYgMHgyKSB7CkBAIC05MzAsNyArOTI5LDcgQEAKIAlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qIEhlcmUgd2UgYXBwbHkgZm9yIHRoZSBzYW1lIHN0cmF0ZWd5IHdlIGRvIGluIG1hc3Rlcl9yZWFkCi0JICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gYXNzdXJlIEQxNiBjeWNsZSB3aGVuIHJlcXVpcmVkLgorCSAqIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGFzc3VyZSB0aGUgY29ycmVjdCBjeWNsZXMuCiAJICovCiAJaWYgKCh1aW50cHRyX3QpYWRkciAmIDB4MSkgewogCQlpb3dyaXRlOCgqKHU4ICopYnVmLCBhZGRyKTsKQEAgLTk1MCw5ICs5NDksOSBAQAogCX0KIAogCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7Ci0JaWYgKGNvdW50MzIgPiAwKSB7Ci0JCW1lbWNweV90b2lvKGFkZHIgKyBkb25lLCBidWYgKyBkb25lLCBjb3VudDMyKTsKLQkJZG9uZSArPSBjb3VudDMyOworCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQlpb3dyaXRlMzIoKih1MzIgKikoYnVmICsgZG9uZSksIGFkZHIgKyBkb25lKTsKKwkJZG9uZSArPSA0OwogCX0KIAogCWlmICgoY291bnQgLSBkb25lKSAmIDB4MikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCA5OTExY2Q1Li4wNjk5MGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwpAQCAtMTI3Niw4ICsxMjc2LDggQEAKIAlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIFZNRSBhZGRyZXNzIGFsaWdubWVudC4gV2UgY2Fubm90IHVzZQotCSAqIG1lbWNweV94eHggZGlyZWN0bHkgaGVyZSBiZWNhdXNlIGl0IG1heSBjdXQgc21hbGwgZGF0YSB0cmFuc2ZlcnMgaW4KLQkgKiB0byA4LWJpdCBjeWNsZXMsIHRodXMgbWFraW5nIEQxNiBjeWNsZSBpbXBvc3NpYmxlLgorCSAqIG1lbWNweV94eHggaGVyZSBiZWNhdXNlIGl0IG1heSBjdXQgZGF0YSB0cmFuc2ZlcnMgaW4gdG8gOC1iaXQKKwkgKiBjeWNsZXMgd2hlbiBEMTYgb3IgRDMyIGN5Y2xlcyBhcmUgcmVxdWlyZWQgb24gdGhlIFZNRSBidXMuCiAJICogT24gdGhlIG90aGVyIGhhbmQsIHRoZSBicmlkZ2UgaXRzZWxmIGFzc3VyZXMgdGhhdCB0aGUgbWF4aW11bSBkYXRhCiAJICogY3ljbGUgY29uZmlndXJlZCBmb3IgdGhlIHRyYW5zZmVyIGlzIHVzZWQgYW5kIHNwbGl0cyBpdAogCSAqIGF1dG9tYXRpY2FsbHkgZm9yIG5vbi1hbGlnbmVkIGFkZHJlc3Nlcywgc28gd2UgZG9uJ3Qgd2FudCB0aGUKQEAgLTEzMDEsOSArMTMwMSw5IEBACiAJfQogCiAJY291bnQzMiA9IChjb3VudCAtIGRvbmUpICYgfjB4MzsKLQlpZiAoY291bnQzMiA+IDApIHsKLQkJbWVtY3B5X2Zyb21pbyhidWYgKyBkb25lLCBhZGRyICsgZG9uZSwgY291bnQzMik7Ci0JCWRvbmUgKz0gY291bnQzMjsKKwl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJKih1MzIgKikoYnVmICsgZG9uZSkgPSBpb3JlYWQzMihhZGRyICsgZG9uZSk7CisJCWRvbmUgKz0gNDsKIAl9CiAKIAlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDIpIHsKQEAgLTEzNjMsNyArMTM2Myw3IEBACiAJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKiBIZXJlIHdlIGFwcGx5IGZvciB0aGUgc2FtZSBzdHJhdGVneSB3ZSBkbyBpbiBtYXN0ZXJfcmVhZAotCSAqIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGFzc3VyZSBEMTYgY3ljbGUgd2hlbiByZXF1aXJlZC4KKwkgKiBmdW5jdGlvbiBpbiBvcmRlciB0byBhc3N1cmUgdGhlIGNvcnJlY3QgY3ljbGVzLgogCSAqLwogCWlmICgodWludHB0cl90KWFkZHIgJiAweDEpIHsKIAkJaW93cml0ZTgoKih1OCAqKWJ1ZiwgYWRkcik7CkBAIC0xMzgzLDkgKzEzODMsOSBAQAogCX0KIAogCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7Ci0JaWYgKGNvdW50MzIgPiAwKSB7Ci0JCW1lbWNweV90b2lvKGFkZHIgKyBkb25lLCBidWYgKyBkb25lLCBjb3VudDMyKTsKLQkJZG9uZSArPSBjb3VudDMyOworCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQlpb3dyaXRlMzIoKih1MzIgKikoYnVmICsgZG9uZSksIGFkZHIgKyBkb25lKTsKKwkJZG9uZSArPSA0OwogCX0KIAogCWlmICgoY291bnQgLSBkb25lKSAmIDB4MikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwppbmRleCBlZmM3ZjA3Li4xNzA4YjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwpAQCAtMzYsMTMgKzM2LDEyIEBACiAKIGNvbmZpZyBXMV9NQVNURVJfTVhDCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBNWEMgMS13aXJlIGJ1c21hc3RlciIKLQlkZXBlbmRzIG9uIFcxICYmIEFSQ0hfTVhDCisJZGVwZW5kcyBvbiBBUkNIX01YQyB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNWEMgMS13aXJlIGhvc3QKIAogY29uZmlnIFcxX01BU1RFUl9EUzFXTQogCXRyaXN0YXRlICJNYXhpbSBEUzFXTSAxLXdpcmUgYnVzbWFzdGVyIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgRFMxV00gMS13aXJlIGRyaXZlciwgc3VjaCBhcyB0aGF0CiAJICBpbiBIUCBpUEFRIGRldmljZXMgbGlrZSBoNXh4eCwgaDIyMDAsIGFuZCBBU0lDMy1iYXNlZCBsaWtlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMKaW5kZXggNGY3ZTFkNy4uNzQwNGFkMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0OTAuYworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICoJZHNjb3JlLmMKKyAqCWRzMjQ5MC5jICBVU0IgdG8gb25lIHdpcmUgYnJpZGdlCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9seWFrb3YgPHpickBpb3JlbWFwLm5ldD4KICAqCkBAIC0yOCw2ICsyOCwxMCBAQAogI2luY2x1ZGUgIi4uL3cxX2ludC5oIgogI2luY2x1ZGUgIi4uL3cxLmgiCiAKKy8qIFVTQiBTdGFuZGFyZCAqLworLyogVVNCIENvbnRyb2wgcmVxdWVzdCB2ZW5kb3IgdHlwZSAqLworI2RlZmluZSBWRU5ET1IJCQkJMHg0MAorCiAvKiBDT01NQU5EIFRZUEUgQ09ERVMgKi8KICNkZWZpbmUgQ09OVFJPTF9DTUQJCQkweDAwCiAjZGVmaW5lIENPTU1fQ01ECQkJMHgwMQpAQCAtMTA3LDYgKzExMSw4IEBACiAjZGVmaW5lIFNUX0hBTFQJCQkJMHgxMCAgLyogRFMyNDkwIGlzIGN1cnJlbnRseSBoYWx0ZWQgKi8KICNkZWZpbmUgU1RfSURMRQkJCQkweDIwICAvKiBEUzI0OTAgaXMgY3VycmVudGx5IGlkbGUgKi8KICNkZWZpbmUgU1RfRVBPRgkJCQkweDgwCisvKiBTdGF0dXMgdHJhbnNmZXIgc2l6ZSwgMTYgYnl0ZXMgc3RhdHVzLCAxNiBieXRlIHJlc3VsdCBmbGFncyAqLworI2RlZmluZSBTVF9TSVpFCQkJCTB4MjAKIAogLyogUmVzdWx0IFJlZ2lzdGVyIGZsYWdzICovCiAjZGVmaW5lIFJSX0RFVEVDVAkJCTB4QTUgLyogTmV3IGRldmljZSBkZXRlY3RlZCAqLwpAQCAtMTk4LDcgKzIwNCw3IEBACiAJaW50IGVycjsKIAogCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAotCQkJQ09OVFJPTF9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CisJCQlDT05UUk9MX0NNRCwgVkVORE9SLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29tbWFuZCBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsCiAJCQkJdmFsdWUsIGluZGV4LCBlcnIpOwpAQCAtMjEzLDcgKzIxOSw3IEBACiAJaW50IGVycjsKIAogCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAotCQkJTU9ERV9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CisJCQlNT0RFX0NNRCwgVkVORE9SLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgbW9kZSBjb250cm9sIG1lc3NhZ2UgJXguJXg6IGVycj0lZC5cbiIsCiAJCQkJdmFsdWUsIGluZGV4LCBlcnIpOwpAQCAtMjI4LDcgKzIzNCw3IEBACiAJaW50IGVycjsKIAogCWVyciA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfQ09OVFJPTF0pLAotCQkJQ09NTV9DTUQsIDB4NDAsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgMTAwMCk7CisJCQlDT01NX0NNRCwgVkVORE9SLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNlbmQgY29udHJvbCBtZXNzYWdlICV4LiV4OiBlcnI9JWQuXG4iLAogCQkJCXZhbHVlLCBpbmRleCwgZXJyKTsKQEAgLTI0Niw3ICsyNTIsOCBAQAogCW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOwogCiAJY291bnQgPSAwOwotCWVyciA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfU1RBVFVTXSksIGJ1Ziwgc2l6ZSwgJmNvdW50LCAxMDApOworCWVyciA9IHVzYl9pbnRlcnJ1cHRfbXNnKGRldi0+dWRldiwgdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LAorCQlkZXYtPmVwW0VQX1NUQVRVU10pLCBidWYsIHNpemUsICZjb3VudCwgMTAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWFkIDEtd2lyZSBkYXRhIGZyb20gMHgleDogZXJyPSVkLlxuIiwgZGV2LT5lcFtFUF9TVEFUVVNdLCBlcnIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMzUzLDcgKzM2MCw3IEBACiAJZXJyID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9EQVRBX0lOXSksCiAJCQkJYnVmLCBzaXplLCAmY291bnQsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXU4IGJ1ZlsweDIwXTsKKwkJdTggYnVmW1NUX1NJWkVdOwogCQlpbnQgY291bnQ7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ2xlYXJpbmcgZXAweCV4LlxuIiwgZGV2LT5lcFtFUF9EQVRBX0lOXSk7CkBAIC0zOTgsNyArNDA1LDcgQEAKIHsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwogCWludCBjb3VudCA9IDAsIGVyciA9IDA7Ci0JdTggYnVmWzB4MjBdOworCXU4IGJ1ZltTVF9TSVpFXTsKIAogCWRvIHsKIAkJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ1RMX0hBTFRfRVhFX0lETEUsIDApOwpAQCAtNDUwLDEwICs0NTcsMTEgQEAKIAogc3RhdGljIGludCBkc193YWl0X3N0YXR1cyhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQogewotCXU4IGJ1ZlsweDIwXTsKKwl1OCBidWZbU1RfU0laRV07CiAJaW50IGVyciwgY291bnQgPSAwOwogCiAJZG8geworCQlzdC0+c3RhdHVzID0gMDsKIAkJZXJyID0gZHNfcmVjdl9zdGF0dXNfbm9kdW1wKGRldiwgc3QsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogI2lmIDAKIAkJaWYgKGVyciA+PSAwKSB7CkBAIC00NjQsNyArNDcyLDcgQEAKIAkJCXByaW50aygiXG4iKTsKIAkJfQogI2VuZGlmCi0JfSB3aGlsZSAoIShidWZbMHgwOF0gJiBTVF9JRExFKSAmJiAhKGVyciA8IDApICYmICsrY291bnQgPCAxMDApOworCX0gd2hpbGUgKCEoc3QtPnN0YXR1cyAmIFNUX0lETEUpICYmICEoZXJyIDwgMCkgJiYgKytjb3VudCA8IDEwMCk7CiAKIAlpZiAoZXJyID49IDE2ICYmIHN0LT5zdGF0dXMgJiBTVF9FUE9GKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIlJlc2V0dGluZyBkZXZpY2UgYWZ0ZXIgU1RfRVBPRi5cbiIpOwpAQCAtNjkwLDM3ICs2OTgsMTA2IEBACiAJcmV0dXJuICEoZXJyID09IGxlbik7CiB9CiAKLSNpZiAwCi0KLXN0YXRpYyBpbnQgZHNfc2VhcmNoKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTY0IGluaXQsIHU2NCAqYnVmLCB1OCBpZF9udW1iZXIsIGludCBjb25kaXRpb25hbF9zZWFyY2gpCitzdGF0aWMgdm9pZCBkczk0OTByX3NlYXJjaCh2b2lkICpkYXRhLCBzdHJ1Y3QgdzFfbWFzdGVyICptYXN0ZXIsCisJdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNhbGxiYWNrKQogeworCS8qIFdoZW4gc3RhcnRpbmcgd2l0aCBhbiBleGlzdGluZyBpZCwgdGhlIGZpcnN0IGlkIHJldHVybmVkIHdpbGwKKwkgKiBiZSB0aGF0IGRldmljZSAoaWYgaXQgaXMgc3RpbGwgb24gdGhlIGJ1cyBtb3N0IGxpa2VseSkuCisJICoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIGRldmljZXMgZm91bmQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQorCSAqIHNlYXJjaF9saW1pdCwgdGhhdCBudW1iZXIgb2YgSURzIHdpbGwgYmUgcmV0dXJuZWQuICBJZiB0aGVyZSBhcmUKKwkgKiBtb3JlLCBzZWFyY2hfbGltaXQgSURzIHdpbGwgYmUgcmV0dXJuZWQgZm9sbG93ZWQgYnkgYSBub24temVybworCSAqIGRpc2NyZXBlbmN5IHZhbHVlLgorCSAqLworCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7CiAJaW50IGVycjsKIAl1MTYgdmFsdWUsIGluZGV4OwogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CisJdTggc3RfYnVmW1NUX1NJWkVdOworCWludCBzZWFyY2hfbGltaXQ7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgaTsKIAotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkvKiBEUzE4YjIwIHNwZWMsIDEzLjE2IG1zIHBlciBkZXZpY2UsIDc1IHBlciBzZWNvbmQsIHNsZWVwIGZvcgorCSAqIGRpc2NvdmVyaW5nIDggZGV2aWNlcyAoMSBidWxrIHRyYW5zZmVyIGFuZCAxLzIgRklGTyBzaXplKSBhdCBhIHRpbWUuCisJICovCisJY29uc3QgdW5zaWduZWQgbG9uZyBqdGltZSA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCo4Lzc1KTsKKwkvKiBGSUZPIDEyOCBieXRlcywgYnVsayBwYWNrZXQgc2l6ZSA2NCwgcmVhZCBhIG11bHRpcGxlIG9mIHRoZQorCSAqIHBhY2tldCBzaXplLgorCSAqLworCXU2NCBidWZbMio2NC84XTsKIAotCWVyciA9IGRzX3NlbmRfZGF0YShkc19kZXYsICh1bnNpZ25lZCBjaGFyICopJmluaXQsIDgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJbXV0ZXhfbG9jaygmbWFzdGVyLT5idXNfbXV0ZXgpOwogCi0JZHNfd2FpdF9zdGF0dXMoZHNfZGV2LCAmc3QpOworCS8qIGFkZHJlc3MgdG8gc3RhcnQgc2VhcmNoaW5nIGF0ICovCisJaWYgKGRzX3NlbmRfZGF0YShkZXYsICh1OCAqKSZtYXN0ZXItPnNlYXJjaF9pZCwgOCkgPCAwKQorCQlnb3RvIHNlYXJjaF9vdXQ7CisJbWFzdGVyLT5zZWFyY2hfaWQgPSAwOwogCi0JdmFsdWUgPSBDT01NX1NFQVJDSF9BQ0NFU1MgfCBDT01NX0lNIHwgQ09NTV9TTSB8IENPTU1fRiB8IENPTU1fUlRTOwotCWluZGV4ID0gKGNvbmRpdGlvbmFsX3NlYXJjaCA/IDB4RUMgOiAweEYwKSB8IChpZF9udW1iZXIgPDwgOCk7Ci0JZXJyID0gZHNfc2VuZF9jb250cm9sKGRzX2RldiwgdmFsdWUsIGluZGV4KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCXZhbHVlID0gQ09NTV9TRUFSQ0hfQUNDRVNTIHwgQ09NTV9JTSB8IENPTU1fUlNUIHwgQ09NTV9TTSB8IENPTU1fRiB8CisJCUNPTU1fUlRTOworCXNlYXJjaF9saW1pdCA9IG1hc3Rlci0+bWF4X3NsYXZlX2NvdW50OworCWlmIChzZWFyY2hfbGltaXQgPiAyNTUpCisJCXNlYXJjaF9saW1pdCA9IDA7CisJaW5kZXggPSBzZWFyY2hfdHlwZSB8IChzZWFyY2hfbGltaXQgPDwgOCk7CisJaWYgKGRzX3NlbmRfY29udHJvbChkZXYsIHZhbHVlLCBpbmRleCkgPCAwKQorCQlnb3RvIHNlYXJjaF9vdXQ7CiAKLQlkc193YWl0X3N0YXR1cyhkc19kZXYsICZzdCk7CisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0KGp0aW1lKTsKIAotCWVyciA9IGRzX3JlY3ZfZGF0YShkc19kZXYsICh1bnNpZ25lZCBjaGFyICopYnVmLCA4KmlkX251bWJlcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWlmIChkc19yZWN2X3N0YXR1c19ub2R1bXAoZGV2LCAmc3QsIHN0X2J1Ziwgc2l6ZW9mKHN0X2J1ZikpIDwKKwkJCXNpemVvZihzdCkpIHsKKwkJCWJyZWFrOworCQl9CiAKLQlyZXR1cm4gZXJyLzg7CisJCWlmIChzdC5kYXRhX2luX2J1ZmZlcl9zdGF0dXMpIHsKKwkJCS8qIEJ1bGsgaW4gY2FuIHJlY2VpdmUgcGFydGlhbCBpZHMsIGJ1dCB3aGVuIGl0IGRvZXMKKwkJCSAqIHRoZXkgZmFpbCBjcmMgYW5kIHdpbGwgYmUgZGlzY2FyZGVkIGFueXdheS4KKwkJCSAqIFRoYXQgaGFzIG9ubHkgYmVlbiBzZWVuIHdoZW4gc3RhdHVzIGluIGJ1ZmZlcgorCQkJICogaXMgMCBhbmQgYnVsayBpcyByZWFkIGFueXdheSwgc28gZG9uJ3QgcmVhZAorCQkJICogYnVsayB3aXRob3V0IGZpcnN0IGNoZWNraW5nIGlmIHN0YXR1cyBzYXlzIHRoZXJlCisJCQkgKiBpcyBkYXRhIHRvIHJlYWQuCisJCQkgKi8KKwkJCWVyciA9IGRzX3JlY3ZfZGF0YShkZXYsICh1OCAqKWJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQlmb3IgKGkgPSAwOyBpIDwgZXJyLzg7ICsraSkgeworCQkJCSsrZm91bmQ7CisJCQkJaWYgKGZvdW5kIDw9IHNlYXJjaF9saW1pdCkKKwkJCQkJY2FsbGJhY2sobWFzdGVyLCBidWZbaV0pOworCQkJCS8qIGNhbid0IGtub3cgaWYgdGhlcmUgd2lsbCBiZSBhIGRpc2NyZXBhbmN5CisJCQkJICogdmFsdWUgYWZ0ZXIgdW50aWwgdGhlIG5leHQgaWQgKi8KKwkJCQlpZiAoZm91bmQgPT0gc2VhcmNoX2xpbWl0KQorCQkJCQltYXN0ZXItPnNlYXJjaF9pZCA9IGJ1ZltpXTsKKwkJCX0KKwkJfQorCisJCWlmICh0ZXN0X2JpdChXMV9BQk9SVF9TRUFSQ0gsICZtYXN0ZXItPmZsYWdzKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCEoc3Quc3RhdHVzICYgKFNUX0lETEUgfCBTVF9IQUxUKSkpOworCisJLyogb25seSBjb250aW51ZSB0aGUgc2VhcmNoIGlmIHNvbWUgd2VyZW4ndCBmb3VuZCAqLworCWlmIChmb3VuZCA8PSBzZWFyY2hfbGltaXQpIHsKKwkJbWFzdGVyLT5zZWFyY2hfaWQgPSAwOworCX0gZWxzZSBpZiAoIXRlc3RfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmbWFzdGVyLT5mbGFncykpIHsKKwkJLyogT25seSBtYXhfc2xhdmVfY291bnQgd2lsbCBiZSBzY2FubmVkIGluIGEgc2VhcmNoLAorCQkgKiBidXQgaXQgd2lsbCBzdGFydCB3aGVyZSBpdCBsZWZ0IG9mZiBuZXh0IHNlYXJjaAorCQkgKiB1bnRpbCBhbGwgaWRzIGFyZSBpZGVudGlmaWVkIGFuZCB0aGVuIGl0IHdpbGwgc3RhcnQKKwkJICogb3Zlci4gIEEgY29udGludWVkIHNlYXJjaCB3aWxsIHJlcG9ydCB0aGUgcHJldmlvdXMKKwkJICogbGFzdCBpZCBhcyB0aGUgZmlyc3QgaWQgKHByb3ZpZGVkIGl0IGlzIHN0aWxsIG9uIHRoZQorCQkgKiBidXMpLgorCQkgKi8KKwkJZGV2X2luZm8oJmRldi0+dWRldi0+ZGV2LCAiJXM6IG1heF9zbGF2ZV9jb3VudCAlZCByZWFjaGVkLCAiCisJCQkid2lsbCBjb250aW51ZSBuZXh0IHNlYXJjaC5cbiIsIF9fZnVuY19fLAorCQkJbWFzdGVyLT5tYXhfc2xhdmVfY291bnQpOworCQlzZXRfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmbWFzdGVyLT5mbGFncyk7CisJfQorc2VhcmNoX291dDoKKwltdXRleF91bmxvY2soJm1hc3Rlci0+YnVzX211dGV4KTsKIH0KIAorI2lmIDAKIHN0YXRpYyBpbnQgZHNfbWF0Y2hfYWNjZXNzKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTY0IGluaXQpCiB7CiAJaW50IGVycjsKQEAgLTg5NCw2ICs5NzEsNyBAQAogCWRldi0+bWFzdGVyLndyaXRlX2Jsb2NrCT0gJmRzOTQ5MHJfd3JpdGVfYmxvY2s7CiAJZGV2LT5tYXN0ZXIucmVzZXRfYnVzCT0gJmRzOTQ5MHJfcmVzZXQ7CiAJZGV2LT5tYXN0ZXIuc2V0X3B1bGx1cAk9ICZkczk0OTByX3NldF9wdWxsdXA7CisJZGV2LT5tYXN0ZXIuc2VhcmNoCT0gJmRzOTQ5MHJfc2VhcmNoOwogCiAJcmV0dXJuIHcxX2FkZF9tYXN0ZXJfZGV2aWNlKCZkZXYtPm1hc3Rlcik7CiB9CkBAIC05MTAsMTUgKzk4OCwxMyBAQAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgZHNfZGV2aWNlICpkZXY7Ci0JaW50IGksIGVycjsKKwlpbnQgaSwgZXJyLCBhbHQ7CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHNfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgRFM5NDkwUiBzdHJ1Y3R1cmUuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWRldi0+c3B1X3NsZWVwID0gMDsKLQlkZXYtPnNwdV9iaXQgPSAwOwogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCWlmICghZGV2LT51ZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC05MjgsMjAgKzEwMDQsMjUgQEAKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKIAotCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDMpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0IGFsdGVybmF0aXZlIHNldHRpbmcgMyBmb3IgJWQgaW50ZXJmYWNlOiBlcnI9JWQuXG4iLAotCQkJCWludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBlcnIpOwotCQlnb3RvIGVycl9vdXRfY2xlYXI7Ci0JfQotCiAJZXJyID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oZGV2LT51ZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlc2V0IGNvbmZpZ3VyYXRpb246IGVycj0lZC5cbiIsIGVycik7CisJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byByZXNldCBjb25maWd1cmF0aW9uOiBlcnI9JWQuXG4iLCBlcnIpOwogCQlnb3RvIGVycl9vdXRfY2xlYXI7CiAJfQogCi0JaWZhY2VfZGVzYyA9ICZpbnRmLT5hbHRzZXR0aW5nWzBdOworCS8qIGFsdGVybmF0aXZlIDMsIDFtcyBpbnRlcnJ1cHQgKGdyZWF0bHkgc3BlZWRzIHNlYXJjaCksIDY0IGJ5dGUgYnVsayAqLworCWFsdCA9IDM7CisJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LAorCQlpbnRmLT5hbHRzZXR0aW5nW2FsdF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBhbHQpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IGFsdGVybmF0aXZlIHNldHRpbmcgJWQgIgorCQkJImZvciAlZCBpbnRlcmZhY2U6IGVycj0lZC5cbiIsIGFsdCwKKwkJCWludGYtPmFsdHNldHRpbmdbYWx0XS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIGVycik7CisJCWdvdG8gZXJyX291dF9jbGVhcjsKKwl9CisKKwlpZmFjZV9kZXNjID0gJmludGYtPmFsdHNldHRpbmdbYWx0XTsKIAlpZiAoaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IE5VTV9FUC0xKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIk51bSBlbmRwb2ludHM9JWQuIEl0IGlzIG5vdCBEUzk0OTBSLlxuIiwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKIAkJZXJyID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYwppbmRleCAxZTVkOTRjLi42N2IwNjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvbXhjX3cxLmMKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL214Y193MS5jCkBAIC0xMCwyNCArMTAsMTYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgotICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgIi4uL3cxLmgiCiAjaW5jbHVkZSAiLi4vdzFfaW50LmgiCi0jaW5jbHVkZSAiLi4vdzFfbG9nLmgiCiAKIC8qIEFjY29yZGluZyB0byB0aGUgbXgyNyBEYXRhc2hlZXQgdGhlIHJlc2V0IHByb2NlZHVyZSBzaG91bGQgdGFrZSB1cCB0byBhYm91dAogICogMTM1MHVzLiBXZSBzZXQgdGhlIHRpbWVvdXQgdG8gNTAwKjEwMHVzID0gNTBtcyBmb3Igc3VyZSAqLwpAQCAtMzYsMTMgKzI4LDEzIEBACiAvKgogICogTVhDIFcxIFJlZ2lzdGVyIG9mZnNldHMKICAqLwotI2RlZmluZSBNWENfVzFfQ09OVFJPTCAgICAgICAgICAweDAwCi0jZGVmaW5lIE1YQ19XMV9USU1FX0RJVklERVIgICAgIDB4MDIKLSNkZWZpbmUgTVhDX1cxX1JFU0VUICAgICAgICAgICAgMHgwNAotI2RlZmluZSBNWENfVzFfQ09NTUFORCAgICAgICAgICAweDA2Ci0jZGVmaW5lIE1YQ19XMV9UWFJYICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgTVhDX1cxX0lOVEVSUlVQVCAgICAgICAgMHgwQQotI2RlZmluZSBNWENfVzFfSU5URVJSVVBUX0VOICAgICAweDBDCisjZGVmaW5lIE1YQ19XMV9DT05UUk9MCQkweDAwCisjIGRlZmluZSBNWENfVzFfQ09OVFJPTF9SRFNUCUJJVCgzKQorIyBkZWZpbmUgTVhDX1cxX0NPTlRST0xfV1IoeCkJQklUKDUgLSAoeCkpCisjIGRlZmluZSBNWENfVzFfQ09OVFJPTF9QU1QJQklUKDYpCisjIGRlZmluZSBNWENfVzFfQ09OVFJPTF9SUFAJQklUKDcpCisjZGVmaW5lIE1YQ19XMV9USU1FX0RJVklERVIJMHgwMgorI2RlZmluZSBNWENfVzFfUkVTRVQJCTB4MDQKIAogc3RydWN0IG14Y193MV9kZXZpY2UgewogCXZvaWQgX19pb21lbSAqcmVnczsKQEAgLTYxLDEyICs1MywxMiBAQAogCXVuc2lnbmVkIGludCB0aW1lb3V0X2NudCA9IDA7CiAJc3RydWN0IG14Y193MV9kZXZpY2UgKmRldiA9IGRhdGE7CiAKLQlfX3Jhd193cml0ZWIoMHg4MCwgKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKSk7CisJd3JpdGViKE1YQ19XMV9DT05UUk9MX1JQUCwgKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKSk7CiAKIAl3aGlsZSAoMSkgewotCQlyZWdfdmFsID0gX19yYXdfcmVhZGIoZGV2LT5yZWdzICsgTVhDX1cxX0NPTlRST0wpOworCQlyZWdfdmFsID0gcmVhZGIoZGV2LT5yZWdzICsgTVhDX1cxX0NPTlRST0wpOwogCi0JCWlmICgoKHJlZ192YWwgPj4gNykgJiAweDEpID09IDAgfHwKKwkJaWYgKCEocmVnX3ZhbCAmIE1YQ19XMV9DT05UUk9MX1JQUCkgfHwKIAkJICAgIHRpbWVvdXRfY250ID4gTVhDX1cxX1JFU0VUX1RJTUVPVVQpCiAJCQlicmVhazsKIAkJZWxzZQpAQCAtNzQsNyArNjYsNyBAQAogCiAJCXVkZWxheSgxMDApOwogCX0KLQlyZXR1cm4gKHJlZ192YWwgPj4gNykgJiAweDE7CisJcmV0dXJuICEhKHJlZ192YWwgJiBNWENfVzFfQ09OVFJPTF9QU1QpOwogfQogCiAvKgpAQCAtOTAsMTYgKzgyLDE2IEBACiAJCQkJCSAqIGRhdGFzaGVldC4KIAkJCQkJICovCiAKLQlfX3Jhd193cml0ZWIoKDEgPDwgKDUgLSBiaXQpKSwgY3RybF9hZGRyKTsKKwl3cml0ZWIoTVhDX1cxX0NPTlRST0xfV1IoYml0KSwgY3RybF9hZGRyKTsKIAogCXdoaWxlICh0aW1lb3V0X2NudC0tKSB7Ci0JCWlmICghKChfX3Jhd19yZWFkYihjdHJsX2FkZHIpID4+ICg1IC0gYml0KSkgJiAweDEpKQorCQlpZiAoIShyZWFkYihjdHJsX2FkZHIpICYgTVhDX1cxX0NPTlRST0xfV1IoYml0KSkpCiAJCQlicmVhazsKIAogCQl1ZGVsYXkoMSk7CiAJfQogCi0JcmV0dXJuICgoX19yYXdfcmVhZGIoY3RybF9hZGRyKSkgPj4gMykgJiAweDE7CisJcmV0dXJuICEhKHJlYWRiKGN0cmxfYWRkcikgJiBNWENfVzFfQ09OVFJPTF9SRFNUKTsKIH0KIAogc3RhdGljIGludCBteGNfdzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTEzOSw3ICsxMzEsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlfX3Jhd193cml0ZWIoY2xrZGl2IC0gMSwgbWRldi0+cmVncyArIE1YQ19XMV9USU1FX0RJVklERVIpOworCXdyaXRlYihjbGtkaXYgLSAxLCBtZGV2LT5yZWdzICsgTVhDX1cxX1RJTUVfRElWSURFUik7CiAKIAltZGV2LT5idXNfbWFzdGVyLmRhdGEgPSBtZGV2OwogCW1kZXYtPmJ1c19tYXN0ZXIucmVzZXRfYnVzID0gbXhjX3cxX2RzMl9yZXNldF9idXM7CkBAIC0xNzcsNiArMTY5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14Y193MV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibXhjX3cxIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG14Y193MV9kdF9pZHMsCiAJfSwKIAkucHJvYmUgPSBteGNfdzFfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvdzEtZ3Bpby5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL3cxLWdwaW8uYwppbmRleCA5NzA5YjhiLi4xZDExMWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvdzEtZ3Bpby5jCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy93MS1ncGlvLmMKQEAgLTg5LDExICs4OSwyMiBAQAogCQlwZGF0YS0+aXNfb3Blbl9kcmFpbiA9IDE7CiAKIAlncGlvID0gb2ZfZ2V0X2dwaW8obnAsIDApOwotCWlmIChncGlvIDwgMCkKKwlpZiAoZ3BpbyA8IDApIHsKKwkJaWYgKGdwaW8gIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJIkZhaWxlZCB0byBwYXJzZSBncGlvIHByb3BlcnR5IGZvciBkYXRhIHBpbiAoJWQpXG4iLAorCQkJCQlncGlvKTsKKwogCQlyZXR1cm4gZ3BpbzsKKwl9CiAJcGRhdGEtPnBpbiA9IGdwaW87CiAKLQlwZGF0YS0+ZXh0X3B1bGx1cF9lbmFibGVfcGluID0gb2ZfZ2V0X2dwaW8obnAsIDEpOworCWdwaW8gPSBvZl9nZXRfZ3BpbyhucCwgMSk7CisJaWYgKGdwaW8gPT0gLUVQUk9CRV9ERUZFUikKKwkJcmV0dXJuIGdwaW87CisJLyogaWdub3JlIG90aGVyIGVycm9ycyBhcyB0aGUgcHVsbHVwIGdwaW8gaXMgb3B0aW9uYWwgKi8KKwlwZGF0YS0+ZXh0X3B1bGx1cF9lbmFibGVfcGluID0gZ3BpbzsKKwogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiAKIAlyZXR1cm4gMDsKQEAgLTEwNywxMCArMTE4LDggQEAKIAogCWlmIChvZl9oYXZlX3BvcHVsYXRlZF9kdCgpKSB7CiAJCWVyciA9IHcxX2dwaW9fcHJvYmVfZHQocGRldik7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgRFRcbiIpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7Ci0JCX0KIAl9CiAKIAlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnIGIvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwppbmRleCA1ZTZhM2M5Li4xY2RjZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKQEAgLTcyLDcgKzcyLDYgQEAKIAogY29uZmlnIFcxX1NMQVZFX0RTMjc2MAogCXRyaXN0YXRlICJEYWxsYXMgMjc2MCBiYXR0ZXJ5IG1vbml0b3IgY2hpcCAoSFAgaVBBUSAmIG90aGVycykiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBoYXZlIHRoZSBEUzI3NjAgYmF0dGVyeSBtb25pdG9yCiAJICBjaGlwIHN1cHBvcnQuCkBAIC04NSw3ICs4NCw2IEBACiAKIGNvbmZpZyBXMV9TTEFWRV9EUzI3ODAKIAl0cmlzdGF0ZSAiRGFsbGFzIDI3ODAgYmF0dGVyeSBtb25pdG9yIGNoaXAiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBoYXZlIHRoZSBEUzI3ODAgYmF0dGVyeSBtb25pdG9yCiAJICBjaGlwIHN1cHBvcnQuCkBAIC05OCw3ICs5Niw2IEBACiAKIGNvbmZpZyBXMV9TTEFWRV9EUzI3ODEKIAl0cmlzdGF0ZSAiRGFsbGFzIDI3ODEgYmF0dGVyeSBtb25pdG9yIGNoaXAiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBoYXZlIHRoZSBEUzI3ODEgYmF0dGVyeSBtb25pdG9yCiAJICBjaGlwIHN1cHBvcnQuCkBAIC0xMTEsNyArMTA4LDYgQEAKIAogY29uZmlnIFcxX1NMQVZFX0RTMjhFMDQKIAl0cmlzdGF0ZSAiNDA5Ni1CaXQgQWRkcmVzc2FibGUgMS1XaXJlIEVFUFJPTSB3aXRoIFBJTyAoRFMyOEUwNC0xMDApIgotCWRlcGVuZHMgb24gVzEKIAlzZWxlY3QgQ1JDMTYKIAloZWxwCiAJICBJZiB5b3UgZW5hYmxlIHRoaXMgeW91IHdpbGwgaGF2ZSB0aGUgRFMyOEUwNC0xMDAKQEAgLTEyNCw3ICsxMjAsNiBAQAogCiBjb25maWcgVzFfU0xBVkVfQlEyNzAwMAogCXRyaXN0YXRlICJCUTI3MDAwIHNsYXZlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgaGRxCiAJICBicTI3MDAwIHNsYXZlIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwppbmRleCA4YjVmZjMzLi4xZjExYTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlICIuLi93MS5oIgpAQCAtNTgsNiArNTksMTkgQEAKIHN0YXRpYyBpbnQgdzFfc3Ryb25nX3B1bGx1cCA9IDE7CiBtb2R1bGVfcGFyYW1fbmFtZWQoc3Ryb25nX3B1bGx1cCwgdzFfc3Ryb25nX3B1bGx1cCwgaW50LCAwKTsKIAorc3RhdGljIGludCB3MV90aGVybV9hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKwlzbC0+ZmFtaWx5X2RhdGEgPSBremFsbG9jKDksIEdGUF9LRVJORUwpOworCWlmICghc2wtPmZhbWlseV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdzFfdGhlcm1fcmVtb3ZlX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJa2ZyZWUoc2wtPmZhbWlseV9kYXRhKTsKKwlzbC0+ZmFtaWx5X2RhdGEgPSBOVUxMOworfQogCiBzdGF0aWMgc3NpemVfdCB3MV9zbGF2ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldmljZSwKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKQEAgLTcxLDYgKzg1LDggQEAKIEFUVFJJQlVURV9HUk9VUFModzFfdGhlcm0pOwogCiBzdGF0aWMgc3RydWN0IHcxX2ZhbWlseV9vcHMgdzFfdGhlcm1fZm9wcyA9IHsKKwkuYWRkX3NsYXZlCT0gdzFfdGhlcm1fYWRkX3NsYXZlLAorCS5yZW1vdmVfc2xhdmUJPSB3MV90aGVybV9yZW1vdmVfc2xhdmUsCiAJLmdyb3VwcwkJPSB3MV90aGVybV9ncm91cHMsCiB9OwogCkBAIC0yNTMsMTIgKzI2OSwxMyBAQAogCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIjogY3JjPSUwMnggJXNcbiIsCiAJCQkgICBjcmMsICh2ZXJkaWN0KSA/ICJZRVMiIDogIk5PIik7CiAJaWYgKHZlcmRpY3QpCi0JCW1lbWNweShzbC0+cm9tLCByb20sIHNpemVvZihzbC0+cm9tKSk7CisJCW1lbWNweShzbC0+ZmFtaWx5X2RhdGEsIHJvbSwgc2l6ZW9mKHJvbSkpOwogCWVsc2UKIAkJZGV2X3dhcm4oZGV2aWNlLCAiUmVhZCBmYWlsZWQgQ1JDIGNoZWNrXG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCA5OyArK2kpCi0JCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIiUwMnggIiwgc2wtPnJvbVtpXSk7CisJCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIiUwMnggIiwKKwkJCSAgICAgICgodTggKilzbC0+ZmFtaWx5X2RhdGEpW2ldKTsKIAogCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgInQ9JWRcbiIsCiAJCXcxX2NvbnZlcnRfdGVtcChyb20sIHNsLT5mYW1pbHktPmZpZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IDY2ZWZhOTYuLmI5NmY2MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTQ2LDE4ICs0NiwyOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIDEtd2lyZSBEYWxsYXMgbmV0d29yayBwcm90b2NvbC4iKTsKIAogc3RhdGljIGludCB3MV90aW1lb3V0ID0gMTA7Ci1pbnQgdzFfbWF4X3NsYXZlX2NvdW50ID0gMTA7CitpbnQgdzFfbWF4X3NsYXZlX2NvdW50ID0gNjQ7CiBpbnQgdzFfbWF4X3NsYXZlX3R0bCA9IDEwOwogCiBtb2R1bGVfcGFyYW1fbmFtZWQodGltZW91dCwgdzFfdGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInRpbWUgaW4gc2Vjb25kcyBiZXR3ZWVuIGF1dG9tYXRpYyBzbGF2ZSBzZWFyY2hlcyIpOworLyogQSBzZWFyY2ggc3RvcHMgd2hlbiB3MV9tYXhfc2xhdmVfY291bnQgZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQgaW4gdGhhdAorICogc2VhcmNoLiAgVGhlIG5leHQgc2VhcmNoIHdpbGwgc3RhcnQgb3ZlciBhbmQgZGV0ZWN0IHRoZSBzYW1lIHNldCBvZiBkZXZpY2VzCisgKiBvbiBhIHN0YXRpYyAxLXdpcmUgYnVzLiAgTWVtb3J5IGlzIG5vdCBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBudW1iZXIsIGp1c3QKKyAqIG9uIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBrbm93biB0byB0aGUga2VybmVsLiAgSGF2aW5nIGEgaGlnaCBudW1iZXIgZG9lcyBub3QKKyAqIGNvbnN1bWUgYWRkaXRpb25hbCByZXNvdXJjZXMuICBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhlcmUgaXMgb25seSBvbmUKKyAqIGRldmljZSBvbiB0aGUgbmV0d29yayBhbmQgdzFfbWF4X3NsYXZlX2NvdW50IGlzIHNldCB0byAxLCB0aGUgZGV2aWNlIGlkIGNhbgorICogYmUgcmVhZCBkaXJlY3RseSBza2lwcGluZyB0aGUgbm9ybWFsIHNsb3dlciBzZWFyY2ggcHJvY2Vzcy4KKyAqLwogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9zbGF2ZV9jb3VudCwgdzFfbWF4X3NsYXZlX2NvdW50LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2xhdmVfY291bnQsCisJIm1heGltdW0gbnVtYmVyIG9mIHNsYXZlcyBkZXRlY3RlZCBpbiBhIHNlYXJjaCIpOwogbW9kdWxlX3BhcmFtX25hbWVkKHNsYXZlX3R0bCwgdzFfbWF4X3NsYXZlX3R0bCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2xhdmVfdHRsLAorCSJOdW1iZXIgb2Ygc2VhcmNoZXMgbm90IHNlZWluZyBhIHNsYXZlIGJlZm9yZSBpdCB3aWxsIGJlIHJlbW92ZWQiKTsKIAogREVGSU5FX01VVEVYKHcxX21sb2NrKTsKIExJU1RfSEVBRCh3MV9tYXN0ZXJzKTsKIAotc3RhdGljIGludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKTsKLQogc3RhdGljIGludCB3MV9tYXN0ZXJfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewogCXJldHVybiAxOwpAQCAtODEsMTkgKzkyLDEwIEBACiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCA9IGRldl90b193MV9zbGF2ZShkZXYpOwogCi0JZGV2X2RiZyhkZXYsICIlczogUmVsZWFzaW5nICVzLlxuIiwgX19mdW5jX18sIHNsLT5uYW1lKTsKLQotCXdoaWxlIChhdG9taWNfcmVhZCgmc2wtPnJlZmNudCkpIHsKLQkJZGV2X2RiZyhkZXYsICJXYWl0aW5nIGZvciAlcyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVkLlxuIiwKLQkJCQlzbC0+bmFtZSwgYXRvbWljX3JlYWQoJnNsLT5yZWZjbnQpKTsKLQkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApKQotCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKLQl9CisJZGV2X2RiZyhkZXYsICIlczogUmVsZWFzaW5nICVzIFslcF1cbiIsIF9fZnVuY19fLCBzbC0+bmFtZSwgc2wpOwogCiAJdzFfZmFtaWx5X3B1dChzbC0+ZmFtaWx5KTsKIAlzbC0+bWFzdGVyLT5zbGF2ZV9jb3VudC0tOwotCi0JY29tcGxldGUoJnNsLT5yZWxlYXNlZCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG5hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0yNDMsNyArMjQ1LDkgQEAKIAltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCW1kLT5zZWFyY2hfY291bnQgPSB0bXA7CiAJbXV0ZXhfdW5sb2NrKCZtZC0+bXV0ZXgpOwotCXdha2VfdXBfcHJvY2VzcyhtZC0+dGhyZWFkKTsKKwkvKiBPbmx5IHdha2UgaWYgaXQgaXMgZ29pbmcgdG8gYmUgc2VhcmNoaW5nLiAqLworCWlmICh0bXApCisJCXdha2VfdXBfcHJvY2VzcyhtZC0+dGhyZWFkKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTI3Nyw3ICsyODEsNiBAQAogCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CiAJbWQtPmVuYWJsZV9wdWxsdXAgPSB0bXA7CiAJbXV0ZXhfdW5sb2NrKCZtZC0+bXV0ZXgpOwotCXdha2VfdXBfcHJvY2VzcyhtZC0+dGhyZWFkKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTMxNCw2ICszMTcsMjQgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHcxX21hc3Rlcl9hdHRyaWJ1dGVfc3RvcmVfbWF4X3NsYXZlX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHRtcDsKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKKworCWlmIChrc3RydG9pbnQoYnVmLCAwLCAmdG1wKSA9PSAtRUlOVkFMIHx8IHRtcCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmbWQtPm11dGV4KTsKKwltZC0+bWF4X3NsYXZlX2NvdW50ID0gdG1wOworCS8qIGFsbG93IGVhY2ggdGltZSB0aGUgbWF4X3NsYXZlX2NvdW50IGlzIHVwZGF0ZWQgKi8KKwljbGVhcl9iaXQoVzFfV0FSTl9NQVhfQ09VTlQsICZtZC0+ZmxhZ3MpOworCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X21heF9zbGF2ZV9jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CkBAIC0zNTIsMjMgKzM3MywyMCBAQAogewogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCWludCBjID0gUEFHRV9TSVpFOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudCwgKm47CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IE5VTEw7CiAKLQltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOworCW11dGV4X2xvY2soJm1kLT5saXN0X211dGV4KTsKIAotCWlmIChtZC0+c2xhdmVfY291bnQgPT0gMCkKLQkJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAibm90IGZvdW5kLlxuIik7Ci0JZWxzZSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmVudCwgKm47Ci0JCXN0cnVjdCB3MV9zbGF2ZSAqc2w7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudCwgbiwgJm1kLT5zbGlzdCkgeworCQlzbCA9IGxpc3RfZW50cnkoZW50LCBzdHJ1Y3QgdzFfc2xhdmUsIHcxX3NsYXZlX2VudHJ5KTsKIAotCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50LCBuLCAmbWQtPnNsaXN0KSB7Ci0JCQlzbCA9IGxpc3RfZW50cnkoZW50LCBzdHJ1Y3QgdzFfc2xhdmUsIHcxX3NsYXZlX2VudHJ5KTsKLQotCQkJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAiJXNcbiIsIHNsLT5uYW1lKTsKLQkJfQorCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICIlc1xuIiwgc2wtPm5hbWUpOwogCX0KKwlpZiAoIXNsKQorCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICJub3QgZm91bmQuXG4iKTsKIAotCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJm1kLT5saXN0X211dGV4KTsKIAogCXJldHVybiBQQUdFX1NJWkUgLSBjOwogfQpAQCAtNDIyLDE5ICs0NDAsMjIgQEAKIH0KIAogLyogU2VhcmNoZXMgdGhlIHNsYXZlcyBpbiB0aGUgdzFfbWFzdGVyIGFuZCByZXR1cm5zIGEgcG9pbnRlciBvciBOVUxMLgotICogTm90ZTogbXVzdCBob2xkIHRoZSBtdXRleAorICogTm90ZTogbXVzdCBub3QgaG9sZCBsaXN0X211dGV4CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdzFfc2xhdmUgKncxX3NsYXZlX3NlYXJjaF9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2LAorc3RydWN0IHcxX3NsYXZlICp3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwKIAlzdHJ1Y3QgdzFfcmVnX251bSAqcm4pCiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbDsKKwltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewogCQlpZiAoc2wtPnJlZ19udW0uZmFtaWx5ID09IHJuLT5mYW1pbHkgJiYKIAkJCQlzbC0+cmVnX251bS5pZCA9PSBybi0+aWQgJiYKIAkJCQlzbC0+cmVnX251bS5jcmMgPT0gcm4tPmNyYykgeworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCQkJcmV0dXJuIHNsOwogCQl9CiAJfQorCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNDkxLDcgKzUxMiwxMCBAQAogCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CiAJc2wgPSB3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKG1kLCAmcm4pOwogCWlmIChzbCkgewotCQl3MV9zbGF2ZV9kZXRhY2goc2wpOworCQlyZXN1bHQgPSB3MV9zbGF2ZV9kZXRhY2goc2wpOworCQkvKiByZWZjbnQgMCBtZWFucyBpdCB3YXMgZGV0YWNoZWQgaW4gdGhlIGNhbGwgKi8KKwkJaWYgKHJlc3VsdCA9PSAwKQorCQkJcmVzdWx0ID0gY291bnQ7CiAJfSBlbHNlIHsKIAkJZGV2X2luZm8oZGV2LCAiRGV2aWNlICUwMngtJTAxMmxseCBkb2Vzbid0IGV4aXN0c1xuIiwgcm4uZmFtaWx5LAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylybi5pZCk7CkBAIC01MTYsNyArNTQwLDcgQEAKIHN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhuYW1lLCBTX0lSVUdPKTsKIHN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhzbGF2ZXMsIFNfSVJVR08pOwogc3RhdGljIFcxX01BU1RFUl9BVFRSX1JPKHNsYXZlX2NvdW50LCBTX0lSVUdPKTsKLXN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhtYXhfc2xhdmVfY291bnQsIFNfSVJVR08pOworc3RhdGljIFcxX01BU1RFUl9BVFRSX1JXKG1heF9zbGF2ZV9jb3VudCwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQKTsKIHN0YXRpYyBXMV9NQVNURVJfQVRUUl9STyhhdHRlbXB0cywgU19JUlVHTyk7CiBzdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8odGltZW91dCwgU19JUlVHTyk7CiBzdGF0aWMgVzFfTUFTVEVSX0FUVFJfUk8ocG9pbnRlciwgU19JUlVHTyk7CkBAIC02ODYsMTIgKzcxMCwxNCBAQAogCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKCZzbC0+ZGV2LCBmYWxzZSk7CiAJa29iamVjdF91ZXZlbnQoJnNsLT5kZXYua29iaiwgS09CSl9BREQpOwogCisJbXV0ZXhfbG9jaygmc2wtPm1hc3Rlci0+bGlzdF9tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmc2wtPncxX3NsYXZlX2VudHJ5LCAmc2wtPm1hc3Rlci0+c2xpc3QpOworCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bGlzdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKQoraW50IHcxX2F0dGFjaF9zbGF2ZV9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfcmVnX251bSAqcm4pCiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbDsKIAlzdHJ1Y3QgdzFfZmFtaWx5ICpmOwpAQCAtNzEzLDggKzczOSw4IEBACiAKIAltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwogCW1lbWNweSgmc2wtPnJlZ19udW0sIHJuLCBzaXplb2Yoc2wtPnJlZ19udW0pKTsKLQlhdG9taWNfc2V0KCZzbC0+cmVmY250LCAwKTsKLQlpbml0X2NvbXBsZXRpb24oJnNsLT5yZWxlYXNlZCk7CisJYXRvbWljX3NldCgmc2wtPnJlZmNudCwgMSk7CisJYXRvbWljX2luYygmc2wtPm1hc3Rlci0+cmVmY250KTsKIAogCS8qIHNsYXZlIG1vZHVsZXMgbmVlZCB0byBiZSBsb2FkZWQgaW4gYSBjb250ZXh0IHdpdGggdW5sb2NrZWQgbXV0ZXggKi8KIAltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwpAQCAtNzU0LDIzICs3ODAsNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3MV9zbGF2ZV9kZXRhY2goc3RydWN0IHcxX3NsYXZlICpzbCkKK2ludCB3MV91bnJlZl9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewotCXN0cnVjdCB3MV9uZXRsaW5rX21zZyBtc2c7CisJc3RydWN0IHcxX21hc3RlciAqZGV2ID0gc2wtPm1hc3RlcjsKKwlpbnQgcmVmY250OworCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJcmVmY250ID0gYXRvbWljX3N1Yl9yZXR1cm4oMSwgJnNsLT5yZWZjbnQpOworCWlmIChyZWZjbnQgPT0gMCkgeworCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgbXNnOwogCi0JZGV2X2RiZygmc2wtPmRldiwgIiVzOiBkZXRhY2hpbmcgJXMgWyVwXS5cbiIsIF9fZnVuY19fLCBzbC0+bmFtZSwgc2wpOworCQlkZXZfZGJnKCZzbC0+ZGV2LCAiJXM6IGRldGFjaGluZyAlcyBbJXBdLlxuIiwgX19mdW5jX18sCisJCQlzbC0+bmFtZSwgc2wpOwogCi0JbGlzdF9kZWwoJnNsLT53MV9zbGF2ZV9lbnRyeSk7CisJCWxpc3RfZGVsKCZzbC0+dzFfc2xhdmVfZW50cnkpOwogCi0JbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKLQltZW1jcHkobXNnLmlkLmlkLCAmc2wtPnJlZ19udW0sIHNpemVvZihtc2cuaWQpKTsKLQltc2cudHlwZSA9IFcxX1NMQVZFX1JFTU9WRTsKLQl3MV9uZXRsaW5rX3NlbmQoc2wtPm1hc3RlciwgJm1zZyk7CisJCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJCW1lbWNweShtc2cuaWQuaWQsICZzbC0+cmVnX251bSwgc2l6ZW9mKG1zZy5pZCkpOworCQltc2cudHlwZSA9IFcxX1NMQVZFX1JFTU9WRTsKKwkJdzFfbmV0bGlua19zZW5kKHNsLT5tYXN0ZXIsICZtc2cpOwogCi0JZGV2aWNlX3VucmVnaXN0ZXIoJnNsLT5kZXYpOworCQlkZXZpY2VfdW5yZWdpc3Rlcigmc2wtPmRldik7CisJCSNpZmRlZiBERUJVRworCQltZW1zZXQoc2wsIDAsIHNpemVvZigqc2wpKTsKKwkJI2VuZGlmCisJCWtmcmVlKHNsKTsKKwl9CisJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOworCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKKwlyZXR1cm4gcmVmY250OworfQogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmc2wtPnJlbGVhc2VkKTsKLQlrZnJlZShzbCk7CitpbnQgdzFfc2xhdmVfZGV0YWNoKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJLyogT25seSBkZXRhY2ggYSBzbGF2ZSBvbmNlIGFzIGl0IGRlY3JlYXNlcyB0aGUgcmVmY250IGVhY2ggdGltZS4gKi8KKwlpbnQgZGVzdHJveV9ub3c7CisJbXV0ZXhfbG9jaygmc2wtPm1hc3Rlci0+bGlzdF9tdXRleCk7CisJZGVzdHJveV9ub3cgPSAhdGVzdF9iaXQoVzFfU0xBVkVfREVUQUNILCAmc2wtPmZsYWdzKTsKKwlzZXRfYml0KFcxX1NMQVZFX0RFVEFDSCwgJnNsLT5mbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZzbC0+bWFzdGVyLT5saXN0X211dGV4KTsKKworCWlmIChkZXN0cm95X25vdykKKwkJZGVzdHJveV9ub3cgPSAhdzFfdW5yZWZfc2xhdmUoc2wpOworCXJldHVybiBkZXN0cm95X25vdyA/IDAgOiAtRUJVU1k7CiB9CiAKIHN0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXJfaWQodTMyIGlkKQpAQCAtNzk5LDcgKzg1MCw3IEBACiAKIAltdXRleF9sb2NrKCZ3MV9tbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewogCQkJaWYgKHNsLT5yZWdfbnVtLmZhbWlseSA9PSBpZC0+ZmFtaWx5ICYmCiAJCQkJCXNsLT5yZWdfbnVtLmlkID09IGlkLT5pZCAmJgpAQCAtODEwLDcgKzg2MSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCiAJCWlmIChmb3VuZCkKIAkJCWJyZWFrOwpAQCAtODMwLDYgKzg4MSw3IEBACiAJCWRldl9kYmcoJmRldi0+ZGV2LCAiUmVjb25uZWN0aW5nIHNsYXZlcyBpbiBkZXZpY2UgJXMgIgogCQkJImZvciBmYW1pbHkgJTAyeC5cbiIsIGRldi0+bmFtZSwgZi0+ZmlkKTsKIAkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKIAkJCS8qIElmIGl0IGlzIGEgbmV3IGZhbWlseSwgc2xhdmVzIHdpdGggdGhlIGRlZmF1bHQKIAkJCSAqIGZhbWlseSBkcml2ZXIgYW5kIGFyZSB0aGF0IGZhbWlseSB3aWxsIGJlCkBAIC04NDEsMTQgKzg5MywxOSBAQAogCQkJCSghYXR0YWNoICYmIHNsLT5mYW1pbHktPmZpZCA9PSBmLT5maWQpKSB7CiAJCQkJc3RydWN0IHcxX3JlZ19udW0gcm47CiAKKwkJCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCQkJbWVtY3B5KCZybiwgJnNsLT5yZWdfbnVtLCBzaXplb2Yocm4pKTsKLQkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwotCi0JCQkJdzFfYXR0YWNoX3NsYXZlX2RldmljZShkZXYsICZybik7CisJCQkJLyogSWYgaXQgd2FzIGFscmVhZHkgaW4gdXNlIGxldCB0aGUgYXV0b21hdGljCisJCQkJICogc2NhbiBwaWNrIGl0IHVwIGFnYWluIGxhdGVyLgorCQkJCSAqLworCQkJCWlmICghdzFfc2xhdmVfZGV0YWNoKHNsKSkKKwkJCQkJdzFfYXR0YWNoX3NsYXZlX2RldmljZShkZXYsICZybik7CisJCQkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKIAkJCX0KIAkJfQogCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzICIKIAkJCSJoYXMgYmVlbiBmaW5pc2hlZC5cbiIsIGRldi0+bmFtZSk7CisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CkBAIC04NzYsNyArOTMzLDEyIEBACiB9CiAKIC8qKgotICogUGVyZm9ybXMgYSBST00gU2VhcmNoICYgcmVnaXN0ZXJzIGFueSBkZXZpY2VzIGZvdW5kLgorICogdzFfc2VhcmNoKCkgLSBQZXJmb3JtcyBhIFJPTSBTZWFyY2ggJiByZWdpc3RlcnMgYW55IGRldmljZXMgZm91bmQuCisgKiBAZGV2OiBUaGUgbWFzdGVyIGRldmljZSB0byBzZWFyY2gKKyAqIEBzZWFyY2hfdHlwZTogVzFfU0VBUkNIIHRvIHNlYXJjaCBhbGwgZGV2aWNlcywgb3IgVzFfQUxBUk1fU0VBUkNICisgKiB0byByZXR1cm4gb25seSBkZXZpY2VzIGluIHRoZSBhbGFybWVkIHN0YXRlCisgKiBAY2I6IEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIGRldmljZSBpcyBmb3VuZAorICoKICAqIFRoZSAxLXdpcmUgc2VhcmNoIGlzIGEgc2ltcGxlIGJpbmFyeSB0cmVlIHNlYXJjaC4KICAqIEZvciBlYWNoIGJpdCBvZiB0aGUgYWRkcmVzcywgd2UgcmVhZCB0d28gYml0cyBhbmQgd3JpdGUgb25lIGJpdC4KICAqIFRoZSBiaXQgd3JpdHRlbiB3aWxsIHB1dCB0byBzbGVlcCBhbGwgZGV2aWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhhdCBiaXQuCkBAIC04ODYsOCArOTQ4LDYgQEAKICAqCiAgKiBTZWUgIkFwcGxpY2F0aW9uIG5vdGUgMTg3IDEtd2lyZSBzZWFyY2ggYWxnb3JpdGhtIiBhdCB3d3cubWF4aW0taWMuY29tCiAgKgotICogQGRldiAgICAgICAgVGhlIG1hc3RlciBkZXZpY2UgdG8gc2VhcmNoCi0gKiBAY2IgICAgICAgICBGdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgZm91bmQKICAqLwogdm9pZCB3MV9zZWFyY2goc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpCiB7CkBAIC04OTgsNyArOTU4LDggQEAKIAl1OCAgdHJpcGxldF9yZXQgPSAwOwogCiAJc2VhcmNoX2JpdCA9IDA7Ci0Jcm4gPSBsYXN0X3JuID0gMDsKKwlybiA9IGRldi0+c2VhcmNoX2lkOworCWxhc3Rfcm4gPSAwOwogCWxhc3RfZGV2aWNlID0gMDsKIAlsYXN0X3plcm8gPSAtMTsKIApAQCAtOTQ1LDcgKzEwMDYsNyBAQAogCQkJZWxzZQogCQkJCXNlYXJjaF9iaXQgPSAoKGxhc3Rfcm4gPj4gaSkgJiAweDEpOwogCi0JCQkvKiogUmVhZCB0d28gYml0cyBhbmQgd3JpdGUgb25lIGJpdCAqLworCQkJLyogUmVhZCB0d28gYml0cyBhbmQgd3JpdGUgb25lIGJpdCAqLwogCQkJdHJpcGxldF9yZXQgPSB3MV90cmlwbGV0KGRldiwgc2VhcmNoX2JpdCk7CiAKIAkJCS8qIHF1aXQgaWYgbm8gZGV2aWNlIHJlc3BvbmRlZCAqLwpAQCAtOTYwLDggKzEwMjEsNyBAQAogCQkJdG1wNjQgPSAodHJpcGxldF9yZXQgPj4gMik7CiAJCQlybiB8PSAodG1wNjQgPDwgaSk7CiAKLQkJCS8qIGVuc3VyZSB3ZSdyZSBjYWxsZWQgZnJvbSBrdGhyZWFkIGFuZCBub3QgYnkgbmV0bGluayBjYWxsYmFjayAqLwotCQkJaWYgKCFkZXYtPnByaXYgJiYga3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQlpZiAodGVzdF9iaXQoVzFfQUJPUlRfU0VBUkNILCAmZGV2LT5mbGFncykpIHsKIAkJCQltdXRleF91bmxvY2soJmRldi0+YnVzX211dGV4KTsKIAkJCQlkZXZfZGJnKCZkZXYtPmRldiwgIkFib3J0IHcxX3NlYXJjaFxuIik7CiAJCQkJcmV0dXJuOwpAQCAtOTcwLDExICsxMDMwLDMwIEBACiAJCW11dGV4X3VubG9jaygmZGV2LT5idXNfbXV0ZXgpOwogCiAJCWlmICggKHRyaXBsZXRfcmV0ICYgMHgwMykgIT0gMHgwMyApIHsKLQkJCWlmICggKGRlc2NfYml0ID09IGxhc3RfemVybykgfHwgKGxhc3RfemVybyA8IDApKQorCQkJaWYgKChkZXNjX2JpdCA9PSBsYXN0X3plcm8pIHx8IChsYXN0X3plcm8gPCAwKSkgewogCQkJCWxhc3RfZGV2aWNlID0gMTsKKwkJCQlkZXYtPnNlYXJjaF9pZCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWRldi0+c2VhcmNoX2lkID0gcm47CisJCQl9CiAJCQlkZXNjX2JpdCA9IGxhc3RfemVybzsKIAkJCWNiKGRldiwgcm4pOwogCQl9CisKKwkJaWYgKCFsYXN0X2RldmljZSAmJiBzbGF2ZV9jb3VudCA9PSBkZXYtPm1heF9zbGF2ZV9jb3VudCAmJgorCQkJIXRlc3RfYml0KFcxX1dBUk5fTUFYX0NPVU5ULCAmZGV2LT5mbGFncykpIHsKKwkJCS8qIE9ubHkgbWF4X3NsYXZlX2NvdW50IHdpbGwgYmUgc2Nhbm5lZCBpbiBhIHNlYXJjaCwKKwkJCSAqIGJ1dCBpdCB3aWxsIHN0YXJ0IHdoZXJlIGl0IGxlZnQgb2ZmIG5leHQgc2VhcmNoCisJCQkgKiB1bnRpbCBhbGwgaWRzIGFyZSBpZGVudGlmaWVkIGFuZCB0aGVuIGl0IHdpbGwgc3RhcnQKKwkJCSAqIG92ZXIuICBBIGNvbnRpbnVlZCBzZWFyY2ggd2lsbCByZXBvcnQgdGhlIHByZXZpb3VzCisJCQkgKiBsYXN0IGlkIGFzIHRoZSBmaXJzdCBpZCAocHJvdmlkZWQgaXQgaXMgc3RpbGwgb24gdGhlCisJCQkgKiBidXMpLgorCQkJICovCisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICIlczogbWF4X3NsYXZlX2NvdW50ICVkIHJlYWNoZWQsICIKKwkJCQkid2lsbCBjb250aW51ZSBuZXh0IHNlYXJjaC5cbiIsIF9fZnVuY19fLAorCQkJCWRldi0+bWF4X3NsYXZlX2NvdW50KTsKKwkJCXNldF9iaXQoVzFfV0FSTl9NQVhfQ09VTlQsICZkZXYtPmZsYWdzKTsKKwkJfQogCX0KIH0KIApAQCAtOTgzLDE3ICsxMDYyLDI0IEBACiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCwgKnNsbjsKIAorCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzbCwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KQogCQljbGVhcl9iaXQoVzFfU0xBVkVfQUNUSVZFLCAmc2wtPmZsYWdzKTsKKwltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAKIAl3MV9zZWFyY2hfZGV2aWNlcyhkZXYsIHNlYXJjaF90eXBlLCBjYik7CiAKKwltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKLQkJaWYgKCF0ZXN0X2JpdChXMV9TTEFWRV9BQ1RJVkUsICZzbC0+ZmxhZ3MpICYmICEtLXNsLT50dGwpCisJCWlmICghdGVzdF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAmc2wtPmZsYWdzKSAmJiAhLS1zbC0+dHRsKSB7CisJCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOworCQkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwkJfQogCQllbHNlIGlmICh0ZXN0X2JpdChXMV9TTEFWRV9BQ1RJVkUsICZzbC0+ZmxhZ3MpKQogCQkJc2wtPnR0bCA9IGRldi0+c2xhdmVfdHRsOwogCX0KKwltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CiAKIAlpZiAoZGV2LT5zZWFyY2hfY291bnQgPiAwKQogCQlkZXYtPnNlYXJjaF9jb3VudC0tOwpAQCAtMTAwNCw2ICsxMDkwLDMyIEBACiAJdzFfc2VhcmNoX3Byb2Nlc3NfY2IoZGV2LCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmQpOwogfQogCisvKioKKyAqIHcxX3Byb2Nlc3NfY2FsbGJhY2tzKCkgLSBleGVjdXRlIGVhY2ggZGV2LT5hc3luY19saXN0IGNhbGxiYWNrIGVudHJ5CisgKiBAZGV2OiB3MV9tYXN0ZXIgZGV2aWNlCisgKgorICogUmV0dXJuOiAxIGlmIHRoZXJlIHdlcmUgY29tbWFuZHMgdG8gZXhlY3V0ZWQgMCBvdGhlcndpc2UKKyAqLworaW50IHcxX3Byb2Nlc3NfY2FsbGJhY2tzKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdzFfYXN5bmNfY21kICphc3luY19jbWQsICphc3luY19uOworCisJLyogVGhlIGxpc3QgY2FuIGJlIGFkZGVkIHRvIGluIGFub3RoZXIgdGhyZWFkLCBsb29wIHVudGlsIGl0IGlzIGVtcHR5ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPmFzeW5jX2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhc3luY19jbWQsIGFzeW5jX24sICZkZXYtPmFzeW5jX2xpc3QsCisJCQlhc3luY19lbnRyeSkgeworCQkJLyogZHJvcCB0aGUgbG9jaywgaWYgaXQgaXMgYSBzZWFyY2ggaXQgY2FuIHRha2UgYSBsb25nCisJCQkgKiB0aW1lICovCisJCQltdXRleF91bmxvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCQlhc3luY19jbWQtPmNiKGRldiwgYXN5bmNfY21kKTsKKwkJCXJldCA9IDE7CisJCQltdXRleF9sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKIGludCB3MV9wcm9jZXNzKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2ID0gKHN0cnVjdCB3MV9tYXN0ZXIgKikgZGF0YTsKQEAgLTEwMTEsMjMgKzExMjMsNDYgQEAKIAkgKiB0aW1lIGNhbiBiZSBjYWxjdWxhdGVkIGluIGppZmZpZXMgb25jZS4KIAkgKi8KIAljb25zdCB1bnNpZ25lZCBsb25nIGp0aW1lID0gbXNlY3NfdG9famlmZmllcyh3MV90aW1lb3V0ICogMTAwMCk7CisJLyogcmVtYWluZGVyIGlmIGl0IHdva2UgdXAgZWFybHkgKi8KKwl1bnNpZ25lZCBsb25nIGpyZW1haW4gPSAwOwogCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJaWYgKGRldi0+c2VhcmNoX2NvdW50KSB7CisJZm9yICg7OykgeworCisJCWlmICghanJlbWFpbiAmJiBkZXYtPnNlYXJjaF9jb3VudCkgewogCQkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CiAJCQl3MV9zZWFyY2hfcHJvY2VzcyhkZXYsIFcxX1NFQVJDSCk7CiAJCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCQl9CiAKKwkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwkJLyogTm90ZSwgdzFfcHJvY2Vzc19jYWxsYmFjayBkcm9wcyB0aGUgbG9jayB3aGlsZSBwcm9jZXNzaW5nLAorCQkgKiBidXQgbG9ja3MgaXQgYWdhaW4gYmVmb3JlIHJldHVybmluZy4KKwkJICovCisJCWlmICghdzFfcHJvY2Vzc19jYWxsYmFja3MoZGV2KSAmJiBqcmVtYWluKSB7CisJCQkvKiBhIHdha2UgdXAgaXMgZWl0aGVyIHRvIHN0b3AgdGhlIHRocmVhZCwgcHJvY2VzcworCQkJICogY2FsbGJhY2tzLCBvciBzZWFyY2gsIGl0IGlzbid0IHByb2Nlc3MgY2FsbGJhY2tzLCBzbworCQkJICogc2NoZWR1bGUgYSBzZWFyY2guCisJCQkgKi8KKwkJCWpyZW1haW4gPSAxOworCQl9CisKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKKwkJLyogaG9sZCBsaXN0X211dGV4IHVudGlsIGFmdGVyIGludGVycnVwdGlibGUgdG8gcHJldmVudCBsb29zaW5nCisJCSAqIHRoZSB3YWtldXAgc2lnbmFsIHdoZW4gYXN5bmNfY21kIGlzIGFkZGVkLgorCQkgKi8KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAogCQkvKiBPbmx5IHNsZWVwIHdoZW4gdGhlIHNlYXJjaCBpcyBhY3RpdmUuICovCi0JCWlmIChkZXYtPnNlYXJjaF9jb3VudCkKLQkJCXNjaGVkdWxlX3RpbWVvdXQoanRpbWUpOworCQlpZiAoZGV2LT5zZWFyY2hfY291bnQpIHsKKwkJCWlmICghanJlbWFpbikKKwkJCQlqcmVtYWluID0ganRpbWU7CisJCQlqcmVtYWluID0gc2NoZWR1bGVfdGltZW91dChqcmVtYWluKTsKKwkJfQogCQllbHNlCiAJCQlzY2hlZHVsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuaCBiL2RyaXZlcnMvdzEvdzEuaAppbmRleCBjYTgwODFhLi43MzRkYWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmgKKysrIGIvZHJpdmVycy93MS93MS5oCkBAIC0yMiw2ICsyMiwxMyBAQAogI2lmbmRlZiBfX1cxX0gKICNkZWZpbmUgX19XMV9ICiAKKy8qKgorICogc3RydWN0IHcxX3JlZ19udW0gLSBicm9rZW4gb3V0IHNsYXZlIGRldmljZSBpZAorICoKKyAqIEBmYW1pbHk6IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZGV2aWNlCisgKiBAaWQ6IGFsb25nIHdpdGggZmFtaWx5IGlzIHRoZSB1bmlxdWUgZGV2aWNlIGlkCisgKiBAY3JjOiBjaGVja3N1bSBvZiB0aGUgb3RoZXIgYnl0ZXMKKyAqLwogc3RydWN0IHcxX3JlZ19udW0KIHsKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKQEAgLTU4LDcgKzY1LDI0IEBACiAjZGVmaW5lIFcxX1JFU1VNRV9DTUQJCTB4QTUKIAogI2RlZmluZSBXMV9TTEFWRV9BQ1RJVkUJCTAKKyNkZWZpbmUgVzFfU0xBVkVfREVUQUNICQkxCiAKKy8qKgorICogc3RydWN0IHcxX3NsYXZlIC0gaG9sZHMgYSBzaW5nbGUgc2xhdmUgZGV2aWNlIG9uIHRoZSBidXMKKyAqCisgKiBAb3duZXI6IFBvaW50cyB0byB0aGUgb25lIHdpcmUgIndpcmUiIGtlcm5lbCBtb2R1bGUuCisgKiBAbmFtZTogRGV2aWNlIGlkIGlzIGFzY2lpLgorICogQHcxX3NsYXZlX2VudHJ5OiBkYXRhIGZvciB0aGUgbGlua2VkIGxpc3QKKyAqIEByZWdfbnVtOiB0aGUgc2xhdmUgaWQgaW4gYmluYXJ5CisgKiBAcmVmY250OiByZWZlcmVuY2UgY291bnQsIGRlbGV0ZSB3aGVuIDAKKyAqIEBmbGFnczogYml0IGZsYWdzIGZvciBXMV9TTEFWRV9BQ1RJVkUgVzFfU0xBVkVfREVUQUNICisgKiBAdHRsOiBkZWNyZW1lbnQgcGVyIHNlYXJjaCB0aGlzIHNsYXZlIGlzbid0IGZvdW5kLCBkZWF0Y2ggYXQgMAorICogQG1hc3RlcjogYnVzIHdoaWNoIHRoaXMgc2xhdmUgaXMgb24KKyAqIEBmYW1pbHk6IG1vZHVsZSBmb3IgZGV2aWNlIGZhbWlseSB0eXBlCisgKiBAZmFtaWx5X2RhdGE6IHBvaW50ZXIgZm9yIHVzZSBieSB0aGUgZmFtaWx5IG1vZHVsZQorICogQGRldjoga2VybmVsIGRldmljZSBpZGVudGlmaWVyCisgKgorICovCiBzdHJ1Y3QgdzFfc2xhdmUKIHsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CkBAIC02Niw3ICs5MCw2IEBACiAJc3RydWN0IGxpc3RfaGVhZAl3MV9zbGF2ZV9lbnRyeTsKIAlzdHJ1Y3QgdzFfcmVnX251bQlyZWdfbnVtOwogCWF0b21pY190CQlyZWZjbnQ7Ci0JdTgJCQlyb21bOV07CiAJaW50CQkJdHRsOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCkBAIC03NCw5OSArOTcsMTQ2IEBACiAJc3RydWN0IHcxX2ZhbWlseQkqZmFtaWx5OwogCXZvaWQJCQkqZmFtaWx5X2RhdGE7CiAJc3RydWN0IGRldmljZQkJZGV2OwotCXN0cnVjdCBjb21wbGV0aW9uCXJlbGVhc2VkOwogfTsKIAogdHlwZWRlZiB2b2lkICgqdzFfc2xhdmVfZm91bmRfY2FsbGJhY2spKHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTY0KTsKIAogCiAvKioKKyAqIHN0cnVjdCB3MV9idXNfbWFzdGVyIC0gb3BlcmF0aW9ucyBhdmFpbGFibGUgb24gYSBidXMgbWFzdGVyCisgKgorICogQGRhdGE6IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW4gYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cKKyAqCisgKiBAcmVhZF9iaXQ6IFNhbXBsZSB0aGUgbGluZSBsZXZlbCBAcmV0dXJuIHRoZSBsZXZlbCByZWFkICgwIG9yIDEpCisgKgorICogQHdyaXRlX2JpdDogU2V0cyB0aGUgbGluZSBsZXZlbAorICoKKyAqIEB0b3VjaF9iaXQ6IHRoZSBsb3dlc3QtbGV2ZWwgZnVuY3Rpb24gZm9yIGRldmljZXMgdGhhdCByZWFsbHkgc3VwcG9ydCB0aGUKKyAqIDEtd2lyZSBwcm90b2NvbC4KKyAqIHRvdWNoX2JpdCgwKSA9IHdyaXRlLTAgY3ljbGUKKyAqIHRvdWNoX2JpdCgxKSA9IHdyaXRlLTEgLyByZWFkIGN5Y2xlCisgKiBAcmV0dXJuIHRoZSBiaXQgcmVhZCAoMCBvciAxKQorICoKKyAqIEByZWFkX2J5dGU6IFJlYWRzIGEgYnl0ZXMuIFNhbWUgYXMgOCB0b3VjaF9iaXQoMSkgY2FsbHMuCisgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQKKyAqCisgKiBAd3JpdGVfYnl0ZTogV3JpdGVzIGEgYnl0ZS4gU2FtZSBhcyA4IHRvdWNoX2JpdCh4KSBjYWxscy4KKyAqCisgKiBAcmVhZF9ibG9jazogU2FtZSBhcyBhIHNlcmllcyBvZiByZWFkX2J5dGUoKSBjYWxscworICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAqCisgKiBAd3JpdGVfYmxvY2s6IFNhbWUgYXMgYSBzZXJpZXMgb2Ygd3JpdGVfYnl0ZSgpIGNhbGxzCisgKgorICogQHRyaXBsZXQ6IENvbWJpbmVzIHR3byByZWFkcyBhbmQgYSBzbWFydCB3cml0ZSBmb3IgUk9NIHNlYXJjaGVzCisgKiBAcmV0dXJuIGJpdDA9SWQgYml0MT1jb21wX2lkIGJpdDI9ZGlyX3Rha2VuCisgKgorICogQHJlc2V0X2J1czogbG9uZyB3cml0ZS0wIHdpdGggYSByZWFkIGZvciB0aGUgcHJlc2VuY2UgcHVsc2UgZGV0ZWN0aW9uCisgKiBAcmV0dXJuIC0xPUVycm9yLCAwPURldmljZSBwcmVzZW50LCAxPU5vIGRldmljZSBwcmVzZW50CisgKgorICogQHNldF9wdWxsdXA6IFB1dCBvdXQgYSBzdHJvbmcgcHVsbC11cCBwdWxzZSBvZiB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uLgorICogQHJldHVybiAtMT1FcnJvciwgMD1jb21wbGV0ZWQKKyAqCisgKiBAc2VhcmNoOiBSZWFsbHkgbmljZSBoYXJkd2FyZSBjYW4gaGFuZGxlcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFJPTSBzZWFyY2gKKyAqIHcxX21hc3RlciogaXMgcGFzc2VkIHRvIHRoZSBzbGF2ZSBmb3VuZCBjYWxsYmFjay4KKyAqIHU4IGlzIHNlYXJjaF90eXBlLCBXMV9TRUFSQ0ggb3IgVzFfQUxBUk1fU0VBUkNICisgKgogICogTm90ZTogcmVhZF9iaXQgYW5kIHdyaXRlX2JpdCBhcmUgdmVyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFuZCBzaG91bGQgb25seQogICogYmUgdXNlZCB3aXRoIGhhcmR3YXJlIHRoYXQgZG9lc24ndCByZWFsbHkgc3VwcG9ydCAxLXdpcmUgb3BlcmF0aW9ucywKICAqIGxpa2UgYSBwYXJhbGxlbC9zZXJpYWwgcG9ydC4KICAqIEVpdGhlciBkZWZpbmUgcmVhZF9iaXQgYW5kIHdyaXRlX2JpdCBPUiBkZWZpbmUsIGF0IG1pbmltdW0sIHRvdWNoX2JpdCBhbmQKICAqIHJlc2V0X2J1cy4KKyAqCiAgKi8KIHN0cnVjdCB3MV9idXNfbWFzdGVyCiB7Ci0JLyoqIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaW4gYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cgKi8KIAl2b2lkCQkqZGF0YTsKIAotCS8qKgotCSAqIFNhbXBsZSB0aGUgbGluZSBsZXZlbAotCSAqIEByZXR1cm4gdGhlIGxldmVsIHJlYWQgKDAgb3IgMSkKLQkgKi8KIAl1OAkJKCpyZWFkX2JpdCkodm9pZCAqKTsKIAotCS8qKiBTZXRzIHRoZSBsaW5lIGxldmVsICovCiAJdm9pZAkJKCp3cml0ZV9iaXQpKHZvaWQgKiwgdTgpOwogCi0JLyoqCi0JICogdG91Y2hfYml0IGlzIHRoZSBsb3dlc3QtbGV2ZWwgZnVuY3Rpb24gZm9yIGRldmljZXMgdGhhdCByZWFsbHkKLQkgKiBzdXBwb3J0IHRoZSAxLXdpcmUgcHJvdG9jb2wuCi0JICogdG91Y2hfYml0KDApID0gd3JpdGUtMCBjeWNsZQotCSAqIHRvdWNoX2JpdCgxKSA9IHdyaXRlLTEgLyByZWFkIGN5Y2xlCi0JICogQHJldHVybiB0aGUgYml0IHJlYWQgKDAgb3IgMSkKLQkgKi8KIAl1OAkJKCp0b3VjaF9iaXQpKHZvaWQgKiwgdTgpOwogCi0JLyoqCi0JICogUmVhZHMgYSBieXRlcy4gU2FtZSBhcyA4IHRvdWNoX2JpdCgxKSBjYWxscy4KLQkgKiBAcmV0dXJuIHRoZSBieXRlIHJlYWQKLQkgKi8KIAl1OAkJKCpyZWFkX2J5dGUpKHZvaWQgKik7CiAKLQkvKioKLQkgKiBXcml0ZXMgYSBieXRlLiBTYW1lIGFzIDggdG91Y2hfYml0KHgpIGNhbGxzLgotCSAqLwogCXZvaWQJCSgqd3JpdGVfYnl0ZSkodm9pZCAqLCB1OCk7CiAKLQkvKioKLQkgKiBTYW1lIGFzIGEgc2VyaWVzIG9mIHJlYWRfYnl0ZSgpIGNhbGxzCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKLQkgKi8KIAl1OAkJKCpyZWFkX2Jsb2NrKSh2b2lkICosIHU4ICosIGludCk7CiAKLQkvKiogU2FtZSBhcyBhIHNlcmllcyBvZiB3cml0ZV9ieXRlKCkgY2FsbHMgKi8KIAl2b2lkCQkoKndyaXRlX2Jsb2NrKSh2b2lkICosIGNvbnN0IHU4ICosIGludCk7CiAKLQkvKioKLQkgKiBDb21iaW5lcyB0d28gcmVhZHMgYW5kIGEgc21hcnQgd3JpdGUgZm9yIFJPTSBzZWFyY2hlcwotCSAqIEByZXR1cm4gYml0MD1JZCBiaXQxPWNvbXBfaWQgYml0Mj1kaXJfdGFrZW4KLQkgKi8KIAl1OAkJKCp0cmlwbGV0KSh2b2lkICosIHU4KTsKIAotCS8qKgotCSAqIGxvbmcgd3JpdGUtMCB3aXRoIGEgcmVhZCBmb3IgdGhlIHByZXNlbmNlIHB1bHNlIGRldGVjdGlvbgotCSAqIEByZXR1cm4gLTE9RXJyb3IsIDA9RGV2aWNlIHByZXNlbnQsIDE9Tm8gZGV2aWNlIHByZXNlbnQKLQkgKi8KIAl1OAkJKCpyZXNldF9idXMpKHZvaWQgKik7CiAKLQkvKioKLQkgKiBQdXQgb3V0IGEgc3Ryb25nIHB1bGwtdXAgcHVsc2Ugb2YgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi4KLQkgKiBAcmV0dXJuIC0xPUVycm9yLCAwPWNvbXBsZXRlZAotCSAqLwogCXU4CQkoKnNldF9wdWxsdXApKHZvaWQgKiwgaW50KTsKIAotCS8qKiBSZWFsbHkgbmljZSBoYXJkd2FyZSBjYW4gaGFuZGxlcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFJPTSBzZWFyY2gKLQkgKiAgdzFfbWFzdGVyKiBpcyBwYXNzZWQgdG8gdGhlIHNsYXZlIGZvdW5kIGNhbGxiYWNrLgotCSAqLwogCXZvaWQJCSgqc2VhcmNoKSh2b2lkICosIHN0cnVjdCB3MV9tYXN0ZXIgKiwKIAkJdTgsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrKTsKIH07CiAKKy8qKgorICogZW51bSB3MV9tYXN0ZXJfZmxhZ3MgLSBiaXRmaWVsZHMgdXNlZCBpbiB3MV9tYXN0ZXIuZmxhZ3MKKyAqIEBXMV9BQk9SVF9TRUFSQ0g6IGFib3J0IHNlYXJjaGluZyBlYXJseSBvbiBzaHV0ZG93bgorICogQFcxX1dBUk5fTUFYX0NPVU5UOiBsaW1pdCB3YXJuaW5nIHdoZW4gdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZAorICovCitlbnVtIHcxX21hc3Rlcl9mbGFncyB7CisJVzFfQUJPUlRfU0VBUkNIID0gMCwKKwlXMV9XQVJOX01BWF9DT1VOVCA9IDEsCit9OworCisvKioKKyAqIHN0cnVjdCB3MV9tYXN0ZXIgLSBvbmUgcGVyIGJ1cyBtYXN0ZXIKKyAqIEB3MV9tYXN0ZXJfZW50cnk6CW1hc3RlciBsaW5rZWQgbGlzdAorICogQG93bmVyOgkJbW9kdWxlIG93bmVyCisgKiBAbmFtZToJCWR5bmFtaWNhbGx5IGFsbG9jYXRlIGJ1cyBuYW1lCisgKiBAbGlzdF9tdXRleDoJCXByb3RlY3Qgc2xpc3QgYW5kIGFzeW5jX2xpc3QKKyAqIEBzbGlzdDoJCWxpbmtlZCBsaXN0IG9mIHNsYXZlcworICogQGFzeW5jX2xpc3Q6CQlsaW5rZWQgbGlzdCBvZiBuZXRsaW5rIGNvbW1hbmRzIHRvIGV4ZWN1dGUKKyAqIEBtYXhfc2xhdmVfY291bnQ6CW1heGltdW0gbnVtYmVyIG9mIHNsYXZlcyB0byBzZWFyY2ggZm9yIGF0IGEgdGltZQorICogQHNsYXZlX2NvdW50OgljdXJyZW50IG51bWJlciBvZiBzbGF2ZXMga25vd24KKyAqIEBhdHRlbXB0czoJCW51bWJlciBvZiBzZWFyY2hlcyByYW4KKyAqIEBzbGF2ZV90dGw6CQludW1iZXIgb2Ygc2VhcmNoZXMgYmVmb3JlIGEgc2xhdmUgaXMgdGltZWQgb3V0CisgKiBAaW5pdGlhbGl6ZWQ6CXByZXZlbnQgaW5pdC9yZW1vdmFsIHJhY2UgY29uZGl0aW9ucworICogQGlkOgkJCXcxIGJ1cyBudW1iZXIKKyAqIEBzZWFyY2hfY291bnQ6CW51bWJlciBvZiBhdXRvbWF0aWMgc2VhcmNoZXMgdG8gcnVuLCAtMSB1bmxpbWl0ZWQKKyAqIEBzZWFyY2hfaWQ6CQlhbGxvd3MgY29udGludWluZyBhIHNlYXJjaAorICogQHJlZmNudDoJCXJlZmVyZW5jZSBjb3VudAorICogQHByaXY6CQlwcml2YXRlIGRhdGEgc3RvcmFnZQorICogQHByaXZfc2l6ZToJCXNpemUgYWxsb2NhdGVkCisgKiBAZW5hYmxlX3B1bGx1cDoJYWxsb3dzIGEgc3Ryb25nIHB1bGx1cAorICogQHB1bGx1cF9kdXJhdGlvbjoJdGltZSBmb3IgdGhlIG5leHQgc3Ryb25nIHB1bGx1cAorICogQGZsYWdzOgkJb25lIG9mIHcxX21hc3Rlcl9mbGFncworICogQHRocmVhZDoJCXRocmVhZCBmb3IgYnVzIHNlYXJjaCBhbmQgbmV0bGluayBjb21tYW5kcworICogQG11dGV4OgkJcHJvdGVjdCBtb3N0IG9mIHcxX21hc3RlcgorICogQGJ1c19tdXRleDoJCXByZXRlY3QgY29uY3VycmVudCBidXMgYWNjZXNzCisgKiBAZHJpdmVyOgkJc3lzZnMgZHJpdmVyCisgKiBAZGV2OgkJc3lzZnMgZGV2aWNlCisgKiBAYnVzX21hc3RlcjoJCWlvIG9wZXJhdGlvbnMgYXZhaWxhYmxlCisgKiBAc2VxOgkJc2VxdWVuY2UgbnVtYmVyIHVzZWQgZm9yIG5ldGxpbmsgYnJvYWRjYXN0cworICogQHBvcnRpZDoJCWRlc3RpbmF0aW9uIGZvciB0aGUgY3VycmVudCBuZXRsaW5rIGNvbW1hbmQKKyAqLwogc3RydWN0IHcxX21hc3RlcgogewogCXN0cnVjdCBsaXN0X2hlYWQJdzFfbWFzdGVyX2VudHJ5OwogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKIAl1bnNpZ25lZCBjaGFyCQluYW1lW1cxX01BWE5BTUVMRU5dOworCS8qIGxpc3RfbXV0ZXggcHJvdGVjdHMganVzdCBzbGlzdCBhbmQgYXN5bmNfbGlzdCBzbyBzbGF2ZXMgY2FuIGJlCisJICogc2VhcmNoZWQgZm9yIGFuZCBhc3luYyBjb21tYW5kcyBhZGRlZCB3aGlsZSB0aGUgbWFzdGVyIGhhcworCSAqIHcxX21hc3Rlci5tdXRleCBsb2NrZWQgYW5kIGlzIG9wZXJhdGluZyBvbiB0aGUgYnVzLgorCSAqIGxvY2sgb3JkZXIgdzFfbWxvY2ssIHcxX21hc3Rlci5tdXRleCwgdzFfbWFzdGVyLmxpc3RfbXV0ZXgKKwkgKi8KKwlzdHJ1Y3QgbXV0ZXgJCWxpc3RfbXV0ZXg7CiAJc3RydWN0IGxpc3RfaGVhZAlzbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFzeW5jX2xpc3Q7CiAJaW50CQkJbWF4X3NsYXZlX2NvdW50LCBzbGF2ZV9jb3VudDsKIAl1bnNpZ25lZCBsb25nCQlhdHRlbXB0czsKIAlpbnQJCQlzbGF2ZV90dGw7CiAJaW50CQkJaW5pdGlhbGl6ZWQ7CiAJdTMyCQkJaWQ7CiAJaW50CQkJc2VhcmNoX2NvdW50OworCS8qIGlkIHRvIHN0YXJ0IHNlYXJjaGluZyBvbiwgdG8gY29udGludWUgYSBzZWFyY2ggb3IgMCB0byByZXN0YXJ0ICovCisJdTY0CQkJc2VhcmNoX2lkOwogCiAJYXRvbWljX3QJCXJlZmNudDsKIApAQCAtMTc4LDYgKzI0OCw4IEBACiAJLyoqIDVWIHN0cm9uZyBwdWxsdXAgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLCB6ZXJvIGRpc2FibGVkLiAqLwogCWludAkJCXB1bGx1cF9kdXJhdGlvbjsKIAorCWxvbmcJCQlmbGFnczsKKwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGhyZWFkOwogCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJc3RydWN0IG11dGV4CQlidXNfbXV0ZXg7CkBAIC0xODgsMTYgKzI2MCw0MSBAQAogCXN0cnVjdCB3MV9idXNfbWFzdGVyCSpidXNfbWFzdGVyOwogCiAJdTMyCQkJc2VxOworCS8qIHBvcnQgaWQgdG8gc2VuZCBuZXRsaW5rIHJlc3BvbnNlcyB0by4gIFRoZSB2YWx1ZSBpcyB0ZW1wb3JhcmlseQorCSAqIHN0b3JlZCBoZXJlIHdoaWxlIHByb2Nlc3NpbmcgYSBtZXNzYWdlLCBzZXQgYWZ0ZXIgbG9ja2luZyB0aGUKKwkgKiBtdXRleCwgemVybyBiZWZvcmUgdW5sb2NraW5nIHRoZSBtdXRleC4KKwkgKi8KKwl1MzIJCQlwb3J0aWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB3MV9hc3luY19jbWQgLSBleGVjdXRlIGNhbGxiYWNrIGZyb20gdGhlIHcxX3Byb2Nlc3Mga3RocmVhZAorICogQGFzeW5jX2VudHJ5OiBsaW5rIGVudHJ5CisgKiBAY2I6IGNhbGxiYWNrIGZ1bmN0aW9uLCBtdXN0IGxpc3RfZGVsIGFuZCBkZXN0cm95IHRoaXMgbGlzdCBiZWZvcmUKKyAqIHJldHVybmluZworICoKKyAqIFdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgdzFfbWFzdGVyIGFzeW5jX2xpc3QsIHcxX3Byb2Nlc3Mgd2lsbCBleGVjdXRlCisgKiB0aGUgY2FsbGJhY2suICBFbWJlZCB0aGlzIGludG8gdGhlIHN0cnVjdHVyZSB3aXRoIHRoZSBjb21tYW5kIGRldGFpbHMuCisgKi8KK3N0cnVjdCB3MV9hc3luY19jbWQgeworCXN0cnVjdCBsaXN0X2hlYWQJYXN5bmNfZW50cnk7CisJdm9pZCAoKmNiKShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9hc3luY19jbWQgKmFzeW5jX2NtZCk7CiB9OwogCiBpbnQgdzFfY3JlYXRlX21hc3Rlcl9hdHRyaWJ1dGVzKHN0cnVjdCB3MV9tYXN0ZXIgKik7CiB2b2lkIHcxX2Rlc3Ryb3lfbWFzdGVyX2F0dHJpYnV0ZXMoc3RydWN0IHcxX21hc3RlciAqbWFzdGVyKTsKIHZvaWQgdzFfc2VhcmNoKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKTsKIHZvaWQgdzFfc2VhcmNoX2RldmljZXMoc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpOworLyogY2FsbCB3MV91bnJlZl9zbGF2ZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UgY291bnRzIHcxX3NlYXJjaF9zbGF2ZSBhZGRlZCAqLwogc3RydWN0IHcxX3NsYXZlICp3MV9zZWFyY2hfc2xhdmUoc3RydWN0IHcxX3JlZ19udW0gKmlkKTsKKy8qIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBvbiBzbC0+bWFzdGVyIGFuZCBzbCwgYW5kIGNsZWFucyB1cCBpZiB6ZXJvCisgKiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgKi8KK2ludCB3MV91bnJlZl9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKIHZvaWQgdzFfc2xhdmVfZm91bmQoc3RydWN0IHcxX21hc3RlciAqZGV2LCB1NjQgcm4pOwogdm9pZCB3MV9zZWFyY2hfcHJvY2Vzc19jYihzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlLAogCXcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKTsKK3N0cnVjdCB3MV9zbGF2ZSAqdzFfc2xhdmVfc2VhcmNoX2RldmljZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsCisJc3RydWN0IHcxX3JlZ19udW0gKnJuKTsKIHN0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXJfaWQodTMyIGlkKTsKIAogLyogRGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IGRldmljZXMgaW4gdGhlIGdpdmVuIGZhbWlseS4gIFVzZWQgZm9yIGZpbmRpbmcKQEAgLTIwNiw3ICszMDMsOSBAQAogICogaGFzIGp1c3QgYmVlbiByZWdpc3RlcmVkLCB0byAwIHdoZW4gaXQgaGFzIGJlZW4gdW5yZWdpc3RlcmVkLgogICovCiB2b2lkIHcxX3JlY29ubmVjdF9zbGF2ZXMoc3RydWN0IHcxX2ZhbWlseSAqZiwgaW50IGF0dGFjaCk7Ci12b2lkIHcxX3NsYXZlX2RldGFjaChzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKK2ludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKTsKKy8qIDAgc3VjY2Vzcywgb3RoZXJ3aXNlIEVCVVNZICovCitpbnQgdzFfc2xhdmVfZGV0YWNoKHN0cnVjdCB3MV9zbGF2ZSAqc2wpOwogCiB1OCB3MV90cmlwbGV0KHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgaW50IGJkaXIpOwogdm9pZCB3MV93cml0ZV84KHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTgpOwpAQCAtMjQyLDYgKzM0MSw3IEBACiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB3MV9tYXN0ZXJzOwogZXh0ZXJuIHN0cnVjdCBtdXRleCB3MV9tbG9jazsKIAorZXh0ZXJuIGludCB3MV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpOwogZXh0ZXJuIGludCB3MV9wcm9jZXNzKHZvaWQgKik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwppbmRleCBlOTMwOTc3OC4uM2JmZjZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuYworKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCkBAIC0zMSw2ICszMSwxMCBAQAogREVGSU5FX1NQSU5MT0NLKHcxX2Zsb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQodzFfZmFtaWxpZXMpOwogCisvKioKKyAqIHcxX3JlZ2lzdGVyX2ZhbWlseSgpIC0gcmVnaXN0ZXIgYSBkZXZpY2UgZmFtaWx5IGRyaXZlcgorICogQG5ld2Y6CWZhbWlseSB0byByZWdpc3RlcgorICovCiBpbnQgdzFfcmVnaXN0ZXJfZmFtaWx5KHN0cnVjdCB3MV9mYW1pbHkgKm5ld2YpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZW50LCAqbjsKQEAgLTU5LDYgKzYzLDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiB3MV91bnJlZ2lzdGVyX2ZhbWlseSgpIC0gdW5yZWdpc3RlciBhIGRldmljZSBmYW1pbHkgZHJpdmVyCisgKiBAZmVudDoJZmFtaWx5IHRvIHVucmVnaXN0ZXIKKyAqLwogdm9pZCB3MV91bnJlZ2lzdGVyX2ZhbWlseShzdHJ1Y3QgdzFfZmFtaWx5ICpmZW50KQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVudCwgKm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oIGIvZHJpdmVycy93MS93MV9mYW1pbHkuaAppbmRleCA0YWQwZTgxLi4yNmNhMTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCisrKyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKQEAgLTQ4LDYgKzQ4LDEyIEBACiAKIHN0cnVjdCB3MV9zbGF2ZTsKIAorLyoqCisgKiBzdHJ1Y3QgdzFfZmFtaWx5X29wcyAtIG9wZXJhdGlvbnMgZm9yIGEgZmFtaWx5IHR5cGUKKyAqIEBhZGRfc2xhdmU6IGFkZF9zbGF2ZQorICogQHJlbW92ZV9zbGF2ZTogcmVtb3ZlX3NsYXZlCisgKiBAZ3JvdXBzOiBzeXNmcyBncm91cAorICovCiBzdHJ1Y3QgdzFfZmFtaWx5X29wcwogewogCWludCAgKCogYWRkX3NsYXZlKShzdHJ1Y3QgdzFfc2xhdmUgKik7CkBAIC01NSw2ICs2MSwxMyBAQAogCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHM7CiB9OwogCisvKioKKyAqIHN0cnVjdCB3MV9mYW1pbHkgLSByZWZlcmVuY2UgY291bnRlZCBmYW1pbHkgc3RydWN0dXJlLgorICogQGZhbWlseV9lbnRyeToJZmFtaWx5IGxpbmtlZCBsaXN0CisgKiBAZmlkOgkJOCBiaXQgZmFtaWx5IGlkZW50aWZpZXIKKyAqIEBmb3BzOgkJb3BlcmF0aW9ucyBmb3IgdGhpcyBmYW1pbHkKKyAqIEByZWZjbnQ6CQlyZWZlcmVuY2UgY291bnRlcgorICovCiBzdHJ1Y3QgdzFfZmFtaWx5CiB7CiAJc3RydWN0IGxpc3RfaGVhZAlmYW1pbHlfZW50cnk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ludC5jIGIvZHJpdmVycy93MS93MV9pbnQuYwppbmRleCA1OTBiZDhhLi45YjA4NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ludC5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKQEAgLTc1LDggKzc1LDEwIEBACiAJYXRvbWljX3NldCgmZGV2LT5yZWZjbnQsIDIpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+c2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmFzeW5jX2xpc3QpOwogCW11dGV4X2luaXQoJmRldi0+bXV0ZXgpOwogCW11dGV4X2luaXQoJmRldi0+YnVzX211dGV4KTsKKwltdXRleF9pbml0KCZkZXYtPmxpc3RfbXV0ZXgpOwogCiAJbWVtY3B5KCZkZXYtPmRldiwgZGV2aWNlLCBzaXplb2Yoc3RydWN0IGRldmljZSkpOwogCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJ3MV9idXNfbWFzdGVyJXUiLCBkZXYtPmlkKTsKQEAgLTEwMyw2ICsxMDUsMTAgQEAKIAlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOwogfQogCisvKioKKyAqIHcxX2FkZF9tYXN0ZXJfZGV2aWNlKCkgLSByZWdpc3RlcnMgYSBuZXcgbWFzdGVyIGRldmljZQorICogQG1hc3RlcjoJbWFzdGVyIGJ1cyBkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqLwogaW50IHcxX2FkZF9tYXN0ZXJfZGV2aWNlKHN0cnVjdCB3MV9idXNfbWFzdGVyICptYXN0ZXIpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2LCAqZW50cnk7CkBAIC0xNzIsNiArMTc4LDcgQEAKIAogI2lmIDAgLyogVGhyZWFkIGNsZWFudXAgY29kZSwgbm90IHJlcXVpcmVkIGN1cnJlbnRseS4gKi8KIGVycl9vdXRfa2lsbF90aHJlYWQ6CisJc2V0X2JpdChXMV9BQk9SVF9TRUFSQ0gsICZkZXYtPmZsYWdzKTsKIAlrdGhyZWFkX3N0b3AoZGV2LT50aHJlYWQpOwogI2VuZGlmCiBlcnJfb3V0X3JtX2F0dHI6CkBAIC0xODcsMTYgKzE5NCwyMiBAQAogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyBtc2c7CiAJc3RydWN0IHcxX3NsYXZlICpzbCwgKnNsbjsKIAotCWt0aHJlYWRfc3RvcChkZXYtPnRocmVhZCk7Ci0KIAltdXRleF9sb2NrKCZ3MV9tbG9jayk7CiAJbGlzdF9kZWwoJmRldi0+dzFfbWFzdGVyX2VudHJ5KTsKIAltdXRleF91bmxvY2soJncxX21sb2NrKTsKIAorCXNldF9iaXQoVzFfQUJPUlRfU0VBUkNILCAmZGV2LT5mbGFncyk7CisJa3RocmVhZF9zdG9wKGRldi0+dGhyZWFkKTsKKwogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpCisJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CisJCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwl9CiAJdzFfZGVzdHJveV9tYXN0ZXJfYXR0cmlidXRlcyhkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5saXN0X211dGV4KTsKIAltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKIApAQCAtMjA2LDcgKzIxOSw5IEBACiAKIAkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApKQogCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJdzFfcHJvY2Vzc19jYWxsYmFja3MoZGV2KTsKIAl9CisJdzFfcHJvY2Vzc19jYWxsYmFja3MoZGV2KTsKIAogCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CiAJbXNnLmlkLm1zdC5pZCA9IGRldi0+aWQ7CkBAIC0yMTYsNiArMjMxLDEwIEBACiAJdzFfZnJlZV9kZXYoZGV2KTsKIH0KIAorLyoqCisgKiB3MV9yZW1vdmVfbWFzdGVyX2RldmljZSgpIC0gdW5yZWdpc3RlciBhIG1hc3RlciBkZXZpY2UKKyAqIEBibToJbWFzdGVyIGJ1cyBkZXZpY2UgdG8gcmVtb3ZlCisgKi8KIHZvaWQgdzFfcmVtb3ZlX21hc3Rlcl9kZXZpY2Uoc3RydWN0IHcxX2J1c19tYXN0ZXIgKmJtKQogewogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgKmZvdW5kID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW8uYyBiL2RyaXZlcnMvdzEvdzFfaW8uYwppbmRleCBlMTBhY2MyLi4yODIwOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2lvLmMKKysrIGIvZHJpdmVycy93MS93MV9pby5jCkBAIC02Miw3ICs2Miw5IEBACiBzdGF0aWMgdTggdzFfcmVhZF9iaXQoc3RydWN0IHcxX21hc3RlciAqZGV2KTsKIAogLyoqCi0gKiBHZW5lcmF0ZXMgYSB3cml0ZS0wIG9yIHdyaXRlLTEgY3ljbGUgYW5kIHNhbXBsZXMgdGhlIGxldmVsLgorICogdzFfdG91Y2hfYml0KCkgLSBHZW5lcmF0ZXMgYSB3cml0ZS0wIG9yIHdyaXRlLTEgY3ljbGUgYW5kIHNhbXBsZXMgdGhlIGxldmVsLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBiaXQ6CTAgLSB3cml0ZSBhIDAsIDEgLSB3cml0ZSBhIDAgcmVhZCB0aGUgbGV2ZWwKICAqLwogc3RhdGljIHU4IHcxX3RvdWNoX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiaXQpCiB7CkBAIC03Nyw3ICs3OSwxMCBAQAogfQogCiAvKioKLSAqIEdlbmVyYXRlcyBhIHdyaXRlLTAgb3Igd3JpdGUtMSBjeWNsZS4KKyAqIHcxX3dyaXRlX2JpdCgpIC0gR2VuZXJhdGVzIGEgd3JpdGUtMCBvciB3cml0ZS0xIGN5Y2xlLgorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqIEBiaXQ6CWJpdCB0byB3cml0ZQorICoKICAqIE9ubHkgY2FsbCBpZiBkZXYtPmJ1c19tYXN0ZXItPnRvdWNoX2JpdCBpcyBOVUxMCiAgKi8KIHN0YXRpYyB2b2lkIHcxX3dyaXRlX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiaXQpCkBAIC0xMDIsMTEgKzEwNywxMiBAQAogfQogCiAvKioKKyAqIHcxX3ByZV93cml0ZSgpIC0gcHJlLXdyaXRlIG9wZXJhdGlvbnMKKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKgogICogUHJlLXdyaXRlIG9wZXJhdGlvbiwgY3VycmVudGx5IG9ubHkgc3VwcG9ydGluZyBzdHJvbmcgcHVsbHVwcy4KICAqIFByb2dyYW0gdGhlIGhhcmR3YXJlIGZvciBhIHN0cm9uZyBwdWxsdXAsIGlmIG9uZSBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kCiAgKiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKICAqLwogc3RhdGljIHZvaWQgdzFfcHJlX3dyaXRlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKIHsKQEAgLTExOCwxMSArMTI0LDEyIEBACiB9CiAKIC8qKgorICogdzFfcG9zdF93cml0ZSgpIC0gcG9zdC13cml0ZSBvcHRpb25zCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICoKICAqIFBvc3Qtd3JpdGUgb3BlcmF0aW9uLCBjdXJyZW50bHkgb25seSBzdXBwb3J0aW5nIHN0cm9uZyBwdWxsdXBzLgogICogSWYgYSBzdHJvbmcgcHVsbHVwIHdhcyByZXF1ZXN0ZWQsIGNsZWFyIGl0IGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cwogICogdGhlbSwgb3IgZXhlY3V0ZSB0aGUgZGVsYXkgb3RoZXJ3aXNlLCBpbiBlaXRoZXIgY2FzZSBjbGVhciB0aGUgcmVxdWVzdC4KLSAqCi0gKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQogICovCiBzdGF0aWMgdm9pZCB3MV9wb3N0X3dyaXRlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKIHsKQEAgLTEzNiwxMCArMTQzLDkgQEAKIH0KIAogLyoqCi0gKiBXcml0ZXMgOCBiaXRzLgotICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCi0gKiBAcGFyYW0gYnl0ZSAgICB0aGUgYnl0ZSB0byB3cml0ZQorICogdzFfd3JpdGVfOCgpIC0gV3JpdGVzIDggYml0cy4KKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKiBAYnl0ZToJdGhlIGJ5dGUgdG8gd3JpdGUKICAqLwogdm9pZCB3MV93cml0ZV84KHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggYnl0ZSkKIHsKQEAgLTE2MSw3ICsxNjcsOSBAQAogCiAKIC8qKgotICogR2VuZXJhdGVzIGEgd3JpdGUtMSBjeWNsZSBhbmQgc2FtcGxlcyB0aGUgbGV2ZWwuCisgKiB3MV9yZWFkX2JpdCgpIC0gR2VuZXJhdGVzIGEgd3JpdGUtMSBjeWNsZSBhbmQgc2FtcGxlcyB0aGUgbGV2ZWwuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICoKICAqIE9ubHkgY2FsbCBpZiBkZXYtPmJ1c19tYXN0ZXItPnRvdWNoX2JpdCBpcyBOVUxMCiAgKi8KIHN0YXRpYyB1OCB3MV9yZWFkX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCkBAIC0xODUsMTYgKzE5MywxNyBAQAogfQogCiAvKioKLSAqIERvZXMgYSB0cmlwbGV0IC0gdXNlZCBmb3Igc2VhcmNoaW5nIFJPTSBhZGRyZXNzZXMuCisgKiB3MV90cmlwbGV0KCkgLSAqIERvZXMgYSB0cmlwbGV0IC0gdXNlZCBmb3Igc2VhcmNoaW5nIFJPTSBhZGRyZXNzZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJkaXI6CXRoZSBiaXQgdG8gd3JpdGUgaWYgYm90aCBpZF9iaXQgYW5kIGNvbXBfYml0IGFyZSAwCisgKgogICogUmV0dXJuIGJpdHM6CiAgKiAgYml0IDAgPSBpZF9iaXQKICAqICBiaXQgMSA9IGNvbXBfYml0CiAgKiAgYml0IDIgPSBkaXJfdGFrZW4KICAqIElmIGJvdGggYml0cyAwICYgMSBhcmUgc2V0LCB0aGUgc2VhcmNoIHNob3VsZCBiZSByZXN0YXJ0ZWQuCiAgKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKLSAqIEBwYXJhbSBiZGlyICAgIHRoZSBiaXQgdG8gd3JpdGUgaWYgYm90aCBpZF9iaXQgYW5kIGNvbXBfYml0IGFyZSAwCi0gKiBAcmV0dXJuICAgICAgICBiaXQgZmllbGRzIC0gc2VlIGFib3ZlCisgKiBSZXR1cm46ICAgICAgICBiaXQgZmllbGRzIC0gc2VlIGFib3ZlCiAgKi8KIHU4IHcxX3RyaXBsZXQoc3RydWN0IHcxX21hc3RlciAqZGV2LCBpbnQgYmRpcikKIHsKQEAgLTIyNiwxMCArMjM1LDEwIEBACiB9CiAKIC8qKgotICogUmVhZHMgOCBiaXRzLgorICogdzFfcmVhZF84KCkgLSBSZWFkcyA4IGJpdHMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQogICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCi0gKiBAcmV0dXJuICAgICAgICB0aGUgYnl0ZSByZWFkCisgKiBSZXR1cm46ICAgICAgICB0aGUgYnl0ZSByZWFkCiAgKi8KIHU4IHcxX3JlYWRfOChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CkBAIC0yNDcsMTEgKzI1NiwxMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVhZF84KTsKIAogLyoqCi0gKiBXcml0ZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKLSAqIEBwYXJhbSBidWYgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKLSAqIEBwYXJhbSBsZW4gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIHcxX3dyaXRlX2Jsb2NrKCkgLSBXcml0ZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJ1ZjoJcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorICogQGxlbjoJdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICovCiB2b2lkIHcxX3dyaXRlX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTI2OSwxMSArMjc3LDEwIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV93cml0ZV9ibG9jayk7CiAKIC8qKgotICogVG91Y2hlcyBhIHNlcmllcyBvZiBieXRlcy4KLSAqCi0gKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQotICogQHBhcmFtIGJ1ZiAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQotICogQHBhcmFtIGxlbiAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogdzFfdG91Y2hfYmxvY2soKSAtIFRvdWNoZXMgYSBzZXJpZXMgb2YgYnl0ZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJ1ZjoJcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorICogQGxlbjoJdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICovCiB2b2lkIHcxX3RvdWNoX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTI5NCwxMiArMzAxLDExIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV90b3VjaF9ibG9jayk7CiAKIC8qKgotICogUmVhZHMgYSBzZXJpZXMgb2YgYnl0ZXMuCi0gKgotICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKLSAqIEBwYXJhbSBidWYgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBmaWxsCi0gKiBAcGFyYW0gbGVuICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAqIEByZXR1cm4gICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICogdzFfcmVhZF9ibG9jaygpIC0gUmVhZHMgYSBzZXJpZXMgb2YgYnl0ZXMuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogQGJ1ZjoJcG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGZpbGwKKyAqIEBsZW46CXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogUmV0dXJuOgl0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKICAqLwogdTggdzFfcmVhZF9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4ICpidWYsIGludCBsZW4pCiB7CkBAIC0zMTksMTAgKzMyNSw5IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV9yZWFkX2Jsb2NrKTsKIAogLyoqCi0gKiBJc3N1ZXMgYSByZXNldCBidXMgc2VxdWVuY2UuCi0gKgotICogQHBhcmFtICBkZXYgVGhlIGJ1cyBtYXN0ZXIgcG9pbnRlcgotICogQHJldHVybiAgICAgMD1EZXZpY2UgcHJlc2VudCwgMT1ObyBkZXZpY2UgcHJlc2VudCBvciBlcnJvcgorICogdzFfcmVzZXRfYnVzKCkgLSBJc3N1ZXMgYSByZXNldCBidXMgc2VxdWVuY2UuCisgKiBAZGV2Ogl0aGUgbWFzdGVyIGRldmljZQorICogUmV0dXJuOgkwPURldmljZSBwcmVzZW50LCAxPU5vIGRldmljZSBwcmVzZW50IG9yIGVycm9yCiAgKi8KIGludCB3MV9yZXNldF9idXMoc3RydWN0IHcxX21hc3RlciAqZGV2KQogewpAQCAtMzgzLDEyICszODgsMTUgQEAKIH0KIAogLyoqCisgKiB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoKSAtIHJlc2V0IGFuZCBzZWxlY3QgYSBzbGF2ZQorICogQHNsOgkJdGhlIHNsYXZlIHRvIHNlbGVjdAorICoKICAqIFJlc2V0cyB0aGUgYnVzIGFuZCB0aGVuIHNlbGVjdHMgdGhlIHNsYXZlIGJ5IHNlbmRpbmcgZWl0aGVyIGEgc2tpcCByb20KLSAqIG9yIGEgcm9tIG1hdGNoLgorICogb3IgYSByb20gbWF0Y2guICBBIHNraXAgcm9tIGlzIGlzc3VlZCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UKKyAqIHJlZ2lzdGVyZWQgb24gdGhlIGJ1cy4KICAqIFRoZSB3MSBtYXN0ZXIgbG9jayBtdXN0IGJlIGhlbGQuCiAgKgotICogQHBhcmFtIHNsCXRoZSBzbGF2ZSB0byBzZWxlY3QKLSAqIEByZXR1cm4gCTA9c3VjY2VzcywgYW55dGhpbmcgZWxzZT1lcnJvcgorICogUmV0dXJuOgkwPXN1Y2Nlc3MsIGFueXRoaW5nIGVsc2U9ZXJyb3IKICAqLwogaW50IHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewpAQCAtNDA5LDYgKzQxNyw5IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV9yZXNldF9zZWxlY3Rfc2xhdmUpOwogCiAvKioKKyAqIHcxX3Jlc2V0X3Jlc3VtZV9jb21tYW5kKCkgLSByZXN1bWUgaW5zdGVhZCBvZiBhbm90aGVyIG1hdGNoIFJPTQorICogQGRldjoJdGhlIG1hc3RlciBkZXZpY2UKKyAqCiAgKiBXaGVuIHRoZSB3b3JrZmxvdyB3aXRoIGEgc2xhdmUgYW1vbmdzdCBtYW55IHJlcXVpcmVzIHNldmVyYWwKICAqIHN1Y2Nlc3NpdmUgY29tbWFuZHMgYSByZXNldCBiZXR3ZWVuIGVhY2gsIHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhcgogICogdG8gZG9pbmcgYSByZXNldCB0aGVuIGEgbWF0Y2ggUk9NIGZvciB0aGUgbGFzdCBtYXRjaGVkIFJPTS4gVGhlCkBAIC00MjAsOCArNDMxLDYgQEAKICAqIGRvZXNuJ3Qgd29yayBvZiBjb3Vyc2UsIGJ1dCB0aGUgcmVzdW1lIGNvbW1hbmQgaXMgdGhlIG5leHQgYmVzdCB0aGluZy4KICAqCiAgKiBUaGUgdzEgbWFzdGVyIGxvY2sgbXVzdCBiZSBoZWxkLgotICoKLSAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCiAgKi8KIGludCB3MV9yZXNldF9yZXN1bWVfY29tbWFuZChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CkBAIC00MzUsNiArNDQ0LDEwIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV9yZXNldF9yZXN1bWVfY29tbWFuZCk7CiAKIC8qKgorICogdzFfbmV4dF9wdWxsdXAoKSAtIHJlZ2lzdGVyIGZvciBhIHN0cm9uZyBwdWxsdXAKKyAqIEBkZXY6CXRoZSBtYXN0ZXIgZGV2aWNlCisgKiBAZGVsYXk6CXRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKgogICogUHV0IG91dCBhIHN0cm9uZyBwdWxsLXVwIG9mIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gYWZ0ZXIgdGhlIG5leHQgd3JpdGUKICAqIG9wZXJhdGlvbi4gIE5vdCBhbGwgaGFyZHdhcmUgc3VwcG9ydHMgc3Ryb25nIHB1bGx1cHMuICBIYXJkd2FyZSB0aGF0CiAgKiBkb2Vzbid0IHN1cHBvcnQgc3Ryb25nIHB1bGx1cHMgd2lsbCBzbGVlcCBmb3IgdGhlIGdpdmVuIHRpbWUgYWZ0ZXIgdGhlCkBAIC00NDIsOCArNDU1LDcgQEAKICAqIHRoZSBuZXh0IHdyaXRlLCBzcGVjaWZ5aW5nIHplcm8gd2lsbCBjbGVhciBhIHByZXZpb3VzIHJlcXVlc3QuCiAgKiBUaGUgdzEgbWFzdGVyIGxvY2sgbXVzdCBiZSBoZWxkLgogICoKLSAqIEBwYXJhbSBkZWxheQl0aW1lIGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybgkwPXN1Y2Nlc3MsIGFueXRoaW5nIGVsc2U9ZXJyb3IKKyAqIFJldHVybjoJMD1zdWNjZXNzLCBhbnl0aGluZyBlbHNlPWVycm9yCiAgKi8KIHZvaWQgdzFfbmV4dF9wdWxsdXAoc3RydWN0IHcxX21hc3RlciAqZGV2LCBpbnQgZGVsYXkpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCmluZGV4IDQwNzg4YzkuLjUyMzQ5NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCisrKyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCkBAIC00NSw3ICs0NSw3IEBACiAKIAltZW1jcHkodywgbXNnLCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSk7CiAKLQljbl9uZXRsaW5rX3NlbmQobSwgMCwgR0ZQX0tFUk5FTCk7CisJY25fbmV0bGlua19zZW5kKG0sIGRldi0+cG9ydGlkLCAwLCBHRlBfS0VSTkVMKTsKIH0KIAogc3RhdGljIHZvaWQgdzFfc2VuZF9zbGF2ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU2NCBybikKQEAgLTU0LDUzICs1NCw5NSBAQAogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKIAlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7CiAJaW50IGF2YWlsOwotCi0JLyogdXBkYXRlIGtlcm5lbCBzbGF2ZSBsaXN0ICovCi0JdzFfc2xhdmVfZm91bmQoZGV2LCBybik7CisJdTY0ICpkYXRhOwogCiAJYXZhaWwgPSBkZXYtPnByaXZfc2l6ZSAtIGNtZC0+bGVuOwogCi0JaWYgKGF2YWlsID4gOCkgewotCQl1NjQgKmRhdGEgPSAodm9pZCAqKShjbWQgKyAxKSArIGNtZC0+bGVuOworCWlmIChhdmFpbCA8IDgpIHsKKwkJbXNnLT5hY2srKzsKKwkJY25fbmV0bGlua19zZW5kKG1zZywgZGV2LT5wb3J0aWQsIDAsIEdGUF9LRVJORUwpOwogCi0JCSpkYXRhID0gcm47Ci0JCWNtZC0+bGVuICs9IDg7Ci0JCWhkci0+bGVuICs9IDg7Ci0JCW1zZy0+bGVuICs9IDg7Ci0JCXJldHVybjsKKwkJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArCisJCQlzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwkJaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwkJY21kLT5sZW4gPSAwOwogCX0KIAotCW1zZy0+YWNrKys7Ci0JY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9ICh2b2lkICopKGNtZCArIDEpICsgY21kLT5sZW47CiAKLQltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0JaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQljbWQtPmxlbiA9IDA7CisJKmRhdGEgPSBybjsKKwljbWQtPmxlbiArPSA4OworCWhkci0+bGVuICs9IDg7CisJbXNnLT5sZW4gKz0gODsKIH0KIAotc3RhdGljIGludCB3MV9wcm9jZXNzX3NlYXJjaF9jb21tYW5kKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IGNuX21zZyAqbXNnLAotCQl1bnNpZ25lZCBpbnQgYXZhaWwpCitzdGF0aWMgdm9pZCB3MV9mb3VuZF9zZW5kX3NsYXZlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTY0IHJuKQogewotCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKLQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7Ci0JaW50IHNlYXJjaF90eXBlID0gKGNtZC0+Y21kID09IFcxX0NNRF9BTEFSTV9TRUFSQ0gpP1cxX0FMQVJNX1NFQVJDSDpXMV9TRUFSQ0g7CisJLyogdXBkYXRlIGtlcm5lbCBzbGF2ZSBsaXN0ICovCisJdzFfc2xhdmVfZm91bmQoZGV2LCBybik7CisKKwl3MV9zZW5kX3NsYXZlKGRldiwgcm4pOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc2xhdmUgbGlzdCwgb3Igc2VhcmNoICh3aXRoIG9yIHdpdGhvdXQgYWxhcm0pICovCitzdGF0aWMgaW50IHcxX2dldF9zbGF2ZXMoc3RydWN0IHcxX21hc3RlciAqZGV2LAorCQlzdHJ1Y3QgY25fbXNnICpyZXFfbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJlcV9oZHIsCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmVxX2NtZCkKK3sKKwlzdHJ1Y3QgY25fbXNnICptc2c7CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHI7CisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQ7CisJc3RydWN0IHcxX3NsYXZlICpzbDsKKworCW1zZyA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2ctPmlkID0gcmVxX21zZy0+aWQ7CisJbXNnLT5zZXEgPSByZXFfbXNnLT5zZXE7CisJbXNnLT5hY2sgPSAwOworCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCQlzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKworCWhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CisJY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShoZHIgKyAxKTsKKworCWhkci0+dHlwZSA9IFcxX01BU1RFUl9DTUQ7CisJaGRyLT5pZCA9IHJlcV9oZHItPmlkOworCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisKKwljbWQtPmNtZCA9IHJlcV9jbWQtPmNtZDsKKwljbWQtPmxlbiA9IDA7CiAKIAlkZXYtPnByaXYgPSBtc2c7Ci0JZGV2LT5wcml2X3NpemUgPSBhdmFpbDsKKwlkZXYtPnByaXZfc2l6ZSA9IFBBR0VfU0laRSAtIG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpOwogCi0JdzFfc2VhcmNoX3Byb2Nlc3NfY2IoZGV2LCBzZWFyY2hfdHlwZSwgdzFfc2VuZF9zbGF2ZSk7CisJaWYgKHJlcV9jbWQtPmNtZCA9PSBXMV9DTURfTElTVF9TTEFWRVMpIHsKKwkJX191NjQgcm47CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgeworCQkJbWVtY3B5KCZybiwgJnNsLT5yZWdfbnVtLCBzaXplb2Yocm4pKTsKKwkJCXcxX3NlbmRfc2xhdmUoZGV2LCBybik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCX0gZWxzZSB7CisJCXcxX3NlYXJjaF9wcm9jZXNzX2NiKGRldiwgY21kLT5jbWQgPT0gVzFfQ01EX0FMQVJNX1NFQVJDSCA/CisJCQlXMV9BTEFSTV9TRUFSQ0ggOiBXMV9TRUFSQ0gsIHcxX2ZvdW5kX3NlbmRfc2xhdmUpOworCX0KIAogCW1zZy0+YWNrID0gMDsKLQljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCBkZXYtPnBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiAKIAlkZXYtPnByaXYgPSBOVUxMOwogCWRldi0+cHJpdl9zaXplID0gMDsKIAorCWtmcmVlKG1zZyk7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3MV9zZW5kX3JlYWRfcmVwbHkoc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwKLQkJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kLCB1MzIgcG9ydGlkKQogewogCXZvaWQgKmRhdGE7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoOwpAQCAtMTMxLDcgKzE3Myw3IEBACiAKIAltZW1jcHkoYy0+ZGF0YSwgY21kLT5kYXRhLCBjLT5sZW4pOwogCi0JZXJyID0gY25fbmV0bGlua19zZW5kKGNtLCAwLCBHRlBfS0VSTkVMKTsKKwllcnIgPSBjbl9uZXRsaW5rX3NlbmQoY20sIHBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiAKIAlrZnJlZShkYXRhKTsKIApAQCAtMTQ2LDExICsxODgsMTEgQEAKIAlzd2l0Y2ggKGNtZC0+Y21kKSB7CiAJY2FzZSBXMV9DTURfVE9VQ0g6CiAJCXcxX3RvdWNoX2Jsb2NrKGRldiwgY21kLT5kYXRhLCBjbWQtPmxlbik7Ci0JCXcxX3NlbmRfcmVhZF9yZXBseShtc2csIGhkciwgY21kKTsKKwkJdzFfc2VuZF9yZWFkX3JlcGx5KG1zZywgaGRyLCBjbWQsIGRldi0+cG9ydGlkKTsKIAkJYnJlYWs7CiAJY2FzZSBXMV9DTURfUkVBRDoKIAkJdzFfcmVhZF9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOwotCQl3MV9zZW5kX3JlYWRfcmVwbHkobXNnLCBoZHIsIGNtZCk7CisJCXcxX3NlbmRfcmVhZF9yZXBseShtc2csIGhkciwgY21kLCBkZXYtPnBvcnRpZCk7CiAJCWJyZWFrOwogCWNhc2UgVzFfQ01EX1dSSVRFOgogCQl3MV93cml0ZV9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOwpAQCAtMTYzLDM4ICsyMDUsNTcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9tYXN0ZXIoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgY25fbXNnICpyZXFfbXNnLAotCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJlcV9oZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmVxX2NtZCkKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX2FkZHJlbW92ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsCisJc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsOworCWludCBlcnIgPSAwOworCXN0cnVjdCB3MV9yZWdfbnVtICppZDsKKworCWlmIChjbWQtPmxlbiAhPSA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkID0gKHN0cnVjdCB3MV9yZWdfbnVtICopY21kLT5kYXRhOworCisJc2wgPSB3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKGRldiwgaWQpOworCXN3aXRjaCAoY21kLT5jbWQpIHsKKwljYXNlIFcxX0NNRF9TTEFWRV9BREQ6CisJCWlmIChzbCkKKwkJCWVyciA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCWVyciA9IHcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCBpZCk7CisJCWJyZWFrOworCWNhc2UgVzFfQ01EX1NMQVZFX1JFTU9WRToKKwkJaWYgKHNsKQorCQkJdzFfc2xhdmVfZGV0YWNoKHNsKTsKKwkJZWxzZQorCQkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwKKwlzdHJ1Y3QgY25fbXNnICpyZXFfbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJlcV9oZHIsCisJc3RydWN0IHcxX25ldGxpbmtfY21kICpyZXFfY21kKQogewogCWludCBlcnIgPSAtRUlOVkFMOwotCXN0cnVjdCBjbl9tc2cgKm1zZzsKLQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkcjsKLQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZDsKIAotCW1zZyA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltc2ctPmlkID0gcmVxX21zZy0+aWQ7Ci0JbXNnLT5zZXEgPSByZXFfbXNnLT5zZXE7Ci0JbXNnLT5hY2sgPSAwOwotCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQotCWhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7Ci0JY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShoZHIgKyAxKTsKLQotCWhkci0+dHlwZSA9IFcxX01BU1RFUl9DTUQ7Ci0JaGRyLT5pZCA9IHJlcV9oZHItPmlkOwotCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7Ci0KLQljbWQtPmNtZCA9IHJlcV9jbWQtPmNtZDsKLQljbWQtPmxlbiA9IDA7Ci0KLQlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJLyogZHJvcCBidXNfbXV0ZXggZm9yIHNlYXJjaCAoZG9lcyBpdCdzIG93biBsb2NraW5nKSwgYW5kIGFkZC9yZW1vdmUKKwkgKiB3aGljaCBkb2Vzbid0IHVzZSB0aGUgYnVzCisJICovCisJc3dpdGNoIChyZXFfY21kLT5jbWQpIHsKIAljYXNlIFcxX0NNRF9TRUFSQ0g6CiAJY2FzZSBXMV9DTURfQUxBUk1fU0VBUkNIOgotCQllcnIgPSB3MV9wcm9jZXNzX3NlYXJjaF9jb21tYW5kKGRldiwgbXNnLAotCQkJCVBBR0VfU0laRSAtIG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpKTsKKwljYXNlIFcxX0NNRF9MSVNUX1NMQVZFUzoKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19tdXRleCk7CisJCWVyciA9IHcxX2dldF9zbGF2ZXMoZGV2LCByZXFfbXNnLCByZXFfaGRyLCByZXFfY21kKTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5idXNfbXV0ZXgpOwogCQlicmVhazsKIAljYXNlIFcxX0NNRF9SRUFEOgogCWNhc2UgVzFfQ01EX1dSSVRFOgpAQCAtMjA0LDEyICsyNjUsMjAgQEAKIAljYXNlIFcxX0NNRF9SRVNFVDoKIAkJZXJyID0gdzFfcmVzZXRfYnVzKGRldik7CiAJCWJyZWFrOworCWNhc2UgVzFfQ01EX1NMQVZFX0FERDoKKwljYXNlIFcxX0NNRF9TTEFWRV9SRU1PVkU6CisJCW11dGV4X3VubG9jaygmZGV2LT5idXNfbXV0ZXgpOworCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX2FkZHJlbW92ZShkZXYsIHJlcV9tc2csIHJlcV9oZHIsCisJCQlyZXFfY21kKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5idXNfbXV0ZXgpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAKLQlrZnJlZShtc2cpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIyMyw3ICsyOTIsOCBAQAogCXJldHVybiB3MV9wcm9jZXNzX2NvbW1hbmRfaW8oc2wtPm1hc3RlciwgbXNnLCBoZHIsIGNtZCk7CiB9CiAKLXN0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX3Jvb3Qoc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1jbWQpCitzdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KHN0cnVjdCBjbl9tc2cgKm1zZywKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1jbWQsIHUzMiBwb3J0aWQpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqbTsKIAlzdHJ1Y3QgY25fbXNnICpjbjsKQEAgLTI1Niw3ICszMjYsNyBAQAogCW11dGV4X2xvY2soJncxX21sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKIAkJaWYgKGNuLT5sZW4gKyBzaXplb2YoKmlkKSA+IFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgY25fbXNnKSkgewotCQkJY25fbmV0bGlua19zZW5kKGNuLCAwLCBHRlBfS0VSTkVMKTsKKwkJCWNuX25ldGxpbmtfc2VuZChjbiwgcG9ydGlkLCAwLCBHRlBfS0VSTkVMKTsKIAkJCWNuLT5hY2srKzsKIAkJCWNuLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKTsKIAkJCXctPmxlbiA9IDA7CkBAIC0yNjksNyArMzM5LDcgQEAKIAkJaWQrKzsKIAl9CiAJY24tPmFjayA9IDA7Ci0JY25fbmV0bGlua19zZW5kKGNuLCAwLCBHRlBfS0VSTkVMKTsKKwljbl9uZXRsaW5rX3NlbmQoY24sIHBvcnRpZCwgMCwgR0ZQX0tFUk5FTCk7CiAJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CiAKIAlrZnJlZShjbik7CkBAIC0yNzcsNyArMzQ3LDcgQEAKIH0KIAogc3RhdGljIGludCB3MV9uZXRsaW5rX3NlbmRfZXJyb3Ioc3RydWN0IGNuX21zZyAqcmNtc2csIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqcm1zZywKLQkJc3RydWN0IHcxX25ldGxpbmtfY21kICpyY21kLCBpbnQgZXJyb3IpCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmNtZCwgaW50IHBvcnRpZCwgaW50IGVycm9yKQogewogCXN0cnVjdCBjbl9tc2cgKmNtc2c7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnICptc2c7CkBAIC0zMDQsMzUgKzM3NCwxNDcgQEAKIAkJY21zZy0+bGVuICs9IHNpemVvZigqY21kKTsKIAl9CiAKLQllcnJvciA9IGNuX25ldGxpbmtfc2VuZChjbXNnLCAwLCBHRlBfS0VSTkVMKTsKKwllcnJvciA9IGNuX25ldGxpbmtfc2VuZChjbXNnLCBwb3J0aWQsIDAsIEdGUF9LRVJORUwpOwogCWtmcmVlKGNtc2cpOwogCiAJcmV0dXJuIGVycm9yOwogfQogCisvKiBCdW5kbGUgdG9nZXRoZXIgYSByZWZlcmVuY2UgY291bnQsIHRoZSBmdWxsIG1lc3NhZ2UsIGFuZCBicm9rZW4gb3V0CisgKiBjb21tYW5kcyB0byBiZSBleGVjdXRlZCBvbiBlYWNoIHcxIG1hc3RlciBrdGhyZWFkIGluIG9uZSBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqLworc3RydWN0IHcxX2NiX2Jsb2NrIHsKKwlhdG9taWNfdCByZWZjbnQ7CisJdTMyIHBvcnRpZDsgLyogU2VuZGluZyBwcm9jZXNzIHBvcnQgSUQgKi8KKwlzdHJ1Y3QgY25fbXNnIG1zZzsKKwkvKiBjbl9tc2cgZGF0YSAqLworCS8qIG9uZSBvciBtb3JlIHZhcmlhYmxlIGxlbmd0aCBzdHJ1Y3QgdzFfY2Jfbm9kZSAqLworfTsKK3N0cnVjdCB3MV9jYl9ub2RlIHsKKwlzdHJ1Y3QgdzFfYXN5bmNfY21kIGFzeW5jOworCS8qIHBvaW50ZXJzIHdpdGhpbiB3MV9jYl9ibG9jayBhbmQgbXNnIGRhdGEgKi8KKwlzdHJ1Y3QgdzFfY2JfYmxvY2sgKmJsb2NrOworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbTsKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsOworCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKK307CisKK3N0YXRpYyB2b2lkIHcxX3Byb2Nlc3NfY2Ioc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfYXN5bmNfY21kICphc3luY19jbWQpCit7CisJc3RydWN0IHcxX2NiX25vZGUgKm5vZGUgPSBjb250YWluZXJfb2YoYXN5bmNfY21kLCBzdHJ1Y3QgdzFfY2Jfbm9kZSwKKwkJYXN5bmMpOworCXUxNiBtbGVuID0gbm9kZS0+bS0+bGVuOworCXU4ICpjbWRfZGF0YSA9IG5vZGUtPm0tPmRhdGE7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IG5vZGUtPnNsOworCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kID0gTlVMTDsKKworCW11dGV4X2xvY2soJmRldi0+YnVzX211dGV4KTsKKwlkZXYtPnBvcnRpZCA9IG5vZGUtPmJsb2NrLT5wb3J0aWQ7CisJaWYgKHNsICYmIHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpCisJCWVyciA9IC1FTk9ERVY7CisKKwl3aGlsZSAobWxlbiAmJiAhZXJyKSB7CisJCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKiljbWRfZGF0YTsKKworCQlpZiAoY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSA+IG1sZW4pIHsKKwkJCWVyciA9IC1FMkJJRzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNsKQorCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHNsLCAmbm9kZS0+YmxvY2stPm1zZywKKwkJCQlub2RlLT5tLCBjbWQpOworCQllbHNlCisJCQllcnIgPSB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKGRldiwgJm5vZGUtPmJsb2NrLT5tc2csCisJCQkJbm9kZS0+bSwgY21kKTsKKworCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IoJm5vZGUtPmJsb2NrLT5tc2csIG5vZGUtPm0sIGNtZCwKKwkJCW5vZGUtPmJsb2NrLT5wb3J0aWQsIGVycik7CisJCWVyciA9IDA7CisKKwkJY21kX2RhdGEgKz0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwkJbWxlbiAtPSBjbWQtPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCX0KKworCWlmICghY21kIHx8IGVycikKKwkJdzFfbmV0bGlua19zZW5kX2Vycm9yKCZub2RlLT5ibG9jay0+bXNnLCBub2RlLT5tLCBjbWQsCisJCQlub2RlLT5ibG9jay0+cG9ydGlkLCBlcnIpOworCisJaWYgKHNsKQorCQl3MV91bnJlZl9zbGF2ZShzbCk7CisJZWxzZQorCQlhdG9taWNfZGVjKCZkZXYtPnJlZmNudCk7CisJZGV2LT5wb3J0aWQgPSAwOworCW11dGV4X3VubG9jaygmZGV2LT5idXNfbXV0ZXgpOworCisJbXV0ZXhfbG9jaygmZGV2LT5saXN0X211dGV4KTsKKwlsaXN0X2RlbCgmYXN5bmNfY21kLT5hc3luY19lbnRyeSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCisJaWYgKGF0b21pY19zdWJfcmV0dXJuKDEsICZub2RlLT5ibG9jay0+cmVmY250KSA9PSAwKQorCQlrZnJlZShub2RlLT5ibG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIHcxX2NuX2NhbGxiYWNrKHN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICpuc3ApCiB7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnICptID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKLQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZDsKIAlzdHJ1Y3QgdzFfc2xhdmUgKnNsOwogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKKwl1MTYgbXNnX2xlbjsKIAlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdzFfY2JfYmxvY2sgKmJsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgdzFfY2Jfbm9kZSAqbm9kZSA9IE5VTEw7CisJaW50IG5vZGVfY291bnQgPSAwOwogCi0Jd2hpbGUgKG1zZy0+bGVuICYmICFlcnIpIHsKKwkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG1hc3RlciBvciBzbGF2ZSBjb21tYW5kcyB0aGVyZSBhcmUgdG8gYWxsb2NhdGUKKwkgKiBzcGFjZSBmb3Igb25lIGNiX25vZGUgZWFjaC4KKwkgKi8KKwltc2dfbGVuID0gbXNnLT5sZW47CisJd2hpbGUgKG1zZ19sZW4gJiYgIWVycikgeworCQlpZiAobS0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgPiBtc2dfbGVuKSB7CisJCQllcnIgPSAtRTJCSUc7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChtLT50eXBlID09IFcxX01BU1RFUl9DTUQgfHwgbS0+dHlwZSA9PSBXMV9TTEFWRV9DTUQpCisJCQkrK25vZGVfY291bnQ7CisKKwkJbXNnX2xlbiAtPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIG0tPmxlbjsKKwkJbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoKCh1OCAqKW0pICsKKwkJCXNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgbS0+bGVuKTsKKwl9CisJbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CisJaWYgKG5vZGVfY291bnQpIHsKKwkJLyogbXNnLT5sZW4gZG9lc24ndCBpbmNsdWRlIGl0c2VsZiAqLworCQlsb25nIHNpemUgPSBzaXplb2Yoc3RydWN0IHcxX2NiX2Jsb2NrKSArIG1zZy0+bGVuICsKKwkJCW5vZGVfY291bnQqc2l6ZW9mKHN0cnVjdCB3MV9jYl9ub2RlKTsKKwkJYmxvY2sgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWJsb2NrKSB7CisJCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IobXNnLCBtLCBOVUxMLCBuc3AtPnBvcnRpZCwKKwkJCQktRU5PTUVNKTsKKwkJCXJldHVybjsKKwkJfQorCQlhdG9taWNfc2V0KCZibG9jay0+cmVmY250LCAxKTsKKwkJYmxvY2stPnBvcnRpZCA9IG5zcC0+cG9ydGlkOworCQltZW1jcHkoJmJsb2NrLT5tc2csIG1zZywgc2l6ZW9mKCptc2cpICsgbXNnLT5sZW4pOworCQlub2RlID0gKHN0cnVjdCB3MV9jYl9ub2RlICopKCh1OCAqKWJsb2NrLT5tc2cuZGF0YSArIG1zZy0+bGVuKTsKKwl9CisKKwltc2dfbGVuID0gbXNnLT5sZW47CisJd2hpbGUgKG1zZ19sZW4gJiYgIWVycikgewogCQlzdHJ1Y3QgdzFfcmVnX251bSBpZDsKIAkJdTE2IG1sZW4gPSBtLT5sZW47Ci0JCXU4ICpjbWRfZGF0YSA9IG0tPmRhdGE7CiAKIAkJZGV2ID0gTlVMTDsKIAkJc2wgPSBOVUxMOwotCQljbWQgPSBOVUxMOwogCiAJCW1lbWNweSgmaWQsIG0tPmlkLmlkLCBzaXplb2YoaWQpKTsKICNpZiAwCiAJCXByaW50aygiJXM6ICUwMnguJTAxMmxseC4lMDJ4OiB0eXBlPSUwMngsIGxlbj0ldS5cbiIsCiAJCQkJX19mdW5jX18sIGlkLmZhbWlseSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpZC5pZCwgaWQuY3JjLCBtLT50eXBlLCBtLT5sZW4pOwogI2VuZGlmCi0JCWlmIChtLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSA+IG1zZy0+bGVuKSB7CisJCWlmIChtLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSA+IG1zZ19sZW4pIHsKIAkJCWVyciA9IC1FMkJJRzsKIAkJCWJyZWFrOwogCQl9CkBAIC0zNDQsNyArNTI2LDcgQEAKIAkJCWlmIChzbCkKIAkJCQlkZXYgPSBzbC0+bWFzdGVyOwogCQl9IGVsc2UgewotCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3Jvb3QobXNnLCBtKTsKKwkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KG1zZywgbSwgbnNwLT5wb3J0aWQpOwogCQkJZ290byBvdXRfY29udDsKIAkJfQogCkBAIC0zNTcsNDEgKzUzOSwyNCBAQAogCQlpZiAoIW1sZW4pCiAJCQlnb3RvIG91dF9jb250OwogCi0JCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCQlhdG9taWNfaW5jKCZibG9jay0+cmVmY250KTsKKwkJbm9kZS0+YXN5bmMuY2IgPSB3MV9wcm9jZXNzX2NiOworCQlub2RlLT5ibG9jayA9IGJsb2NrOworCQlub2RlLT5tID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKSgodTggKikmYmxvY2stPm1zZyArCisJCQkoc2l6ZV90KSgodTggKiltIC0gKHU4ICopbXNnKSk7CisJCW5vZGUtPnNsID0gc2w7CisJCW5vZGUtPmRldiA9IGRldjsKIAotCQlpZiAoc2wgJiYgdzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkgewotCQkJZXJyID0gLUVOT0RFVjsKLQkJCWdvdG8gb3V0X3VwOwotCQl9CisJCW11dGV4X2xvY2soJmRldi0+bGlzdF9tdXRleCk7CisJCWxpc3RfYWRkX3RhaWwoJm5vZGUtPmFzeW5jLmFzeW5jX2VudHJ5LCAmZGV2LT5hc3luY19saXN0KTsKKwkJd2FrZV91cF9wcm9jZXNzKGRldi0+dGhyZWFkKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpc3RfbXV0ZXgpOworCQkrK25vZGU7CiAKLQkJd2hpbGUgKG1sZW4pIHsKLQkJCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKiljbWRfZGF0YTsKLQotCQkJaWYgKGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgPiBtbGVuKSB7Ci0JCQkJZXJyID0gLUUyQklHOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoc2wpCi0JCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHNsLCBtc2csIG0sIGNtZCk7Ci0JCQllbHNlCi0JCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihkZXYsIG1zZywgbSwgY21kKTsKLQotCQkJdzFfbmV0bGlua19zZW5kX2Vycm9yKG1zZywgbSwgY21kLCBlcnIpOwotCQkJZXJyID0gMDsKLQotCQkJY21kX2RhdGEgKz0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQkJCW1sZW4gLT0gY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKLQkJfQotb3V0X3VwOgotCQlhdG9taWNfZGVjKCZkZXYtPnJlZmNudCk7Ci0JCWlmIChzbCkKLQkJCWF0b21pY19kZWMoJnNsLT5yZWZjbnQpOwotCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogb3V0X2NvbnQ6Ci0JCWlmICghY21kIHx8IGVycikKLQkJCXcxX25ldGxpbmtfc2VuZF9lcnJvcihtc2csIG0sIGNtZCwgZXJyKTsKLQkJbXNnLT5sZW4gLT0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW47CisJCWlmIChlcnIpCisJCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IobXNnLCBtLCBOVUxMLCBuc3AtPnBvcnRpZCwgZXJyKTsKKwkJbXNnX2xlbiAtPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIG0tPmxlbjsKIAkJbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoKCh1OCAqKW0pICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW4pOwogCiAJCS8qCkBAIC00MDAsNiArNTY1LDggQEAKIAkJaWYgKGVyciA9PSAtRU5PREVWKQogCQkJZXJyID0gMDsKIAl9CisJaWYgKGJsb2NrICYmIGF0b21pY19zdWJfcmV0dXJuKDEsICZibG9jay0+cmVmY250KSA9PSAwKQorCQlrZnJlZShibG9jayk7CiB9CiAKIGludCB3MV9pbml0X25ldGxpbmsodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKaW5kZXggYjA5MjJkYy4uMWU5NTA0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKKysrIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKQEAgLTI3LDYgKzI3LDE4IEBACiAKICNpbmNsdWRlICJ3MS5oIgogCisvKioKKyAqIGVudW0gdzFfbmV0bGlua19tZXNzYWdlX3R5cGVzIC0gbWVzc2FnZSB0eXBlCisgKgorICogQFcxX1NMQVZFX0FERDogbm90aWZpY2F0aW9uIHRoYXQgYSBzbGF2ZSBkZXZpY2Ugd2FzIGFkZGVkCisgKiBAVzFfU0xBVkVfUkVNT1ZFOiBub3RpZmljYXRpb24gdGhhdCBhIHNsYXZlIGRldmljZSB3YXMgcmVtb3ZlZAorICogQFcxX01BU1RFUl9BREQ6IG5vdGlmaWNhdGlvbiB0aGF0IGEgbmV3IGJ1cyBtYXN0ZXIgd2FzIGFkZGVkCisgKiBAVzFfTUFTVEVSX1JFTU9WRTogbm90aWZpY2F0aW9uIHRoYXQgYSBidXMgbWFzdGVyd2FzIHJlbW92ZWQKKyAqIEBXMV9NQVNURVJfQ01EOiBpbml0aWF0ZSBvcGVyYXRpb25zIG9uIGEgc3BlY2lmaWMgbWFzdGVyCisgKiBAVzFfU0xBVkVfQ01EOiBzZW5kcyByZXNldCwgc2VsZWN0cyB0aGUgc2xhdmUsIHRoZW4gZG9lcyBhIHJlYWQvd3JpdGUvdG91Y2gKKyAqIG9wZXJhdGlvbgorICogQFcxX0xJU1RfTUFTVEVSUzogdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJ1cyBtYXN0ZXIgaWRlbnRpZmllcnMKKyAqLwogZW51bSB3MV9uZXRsaW5rX21lc3NhZ2VfdHlwZXMgewogCVcxX1NMQVZFX0FERCA9IDAsCiAJVzFfU0xBVkVfUkVNT1ZFLApAQCAtNTIsNiArNjQsMjIgQEAKIAlfX3U4CQkJCWRhdGFbMF07CiB9OwogCisvKioKKyAqIGVudW0gdzFfY29tbWFuZHMgLSBjb21tYW5kcyBhdmFpbGFibGUgZm9yIG1hc3RlciBvciBzbGF2ZSBvcGVyYXRpb25zCisgKiBAVzFfQ01EX1JFQUQ6IHJlYWQgbGVuIGJ5dGVzCisgKiBAVzFfQ01EX1dSSVRFOiB3cml0ZSBsZW4gYnl0ZXMKKyAqIEBXMV9DTURfU0VBUkNIOiBpbml0aWF0ZSBhIHN0YW5kYXJkIHNlYXJjaCwgcmV0dXJucyBvbmx5IHRoZSBzbGF2ZQorICogZGV2aWNlcyBmb3VuZCBkdXJpbmcgdGhhdCBzZWFyY2gKKyAqIEBXMV9DTURfQUxBUk1fU0VBUkNIOiBzZWFyY2ggZm9yIGRldmljZXMgdGhhdCBhcmUgY3VycmVudGx5IGFsYXJtaW5nCisgKiBAVzFfQ01EX1RPVUNIOiBUb3VjaGVzIGEgc2VyaWVzIG9mIGJ5dGVzLgorICogQFcxX0NNRF9SRVNFVDogc2VuZHMgYSBidXMgcmVzZXQgb24gdGhlIGdpdmVuIG1hc3RlcgorICogQFcxX0NNRF9TTEFWRV9BREQ6IGFkZHMgYSBzbGF2ZSB0byB0aGUgZ2l2ZW4gbWFzdGVyLAorICogOCBieXRlIHNsYXZlIGlkIGF0IGRhdGFbMF0KKyAqIEBXMV9DTURfU0xBVkVfUkVNT1ZFOiByZW1vdmVzIGEgc2xhdmUgdG8gdGhlIGdpdmVuIG1hc3RlciwKKyAqIDggYnl0ZSBzbGF2ZSBpZCBhdCBkYXRhWzBdCisgKiBAVzFfQ01EX0xJU1RfU0xBVkVTOiBsaXN0IG9mIHNsYXZlcyByZWdpc3RlcmVkIG9uIHRoaXMgbWFzdGVyCisgKiBAVzFfQ01EX01BWDogbnVtYmVyIG9mIGF2YWlsYWJsZSBjb21tYW5kcworICovCiBlbnVtIHcxX2NvbW1hbmRzIHsKIAlXMV9DTURfUkVBRCA9IDAsCiAJVzFfQ01EX1dSSVRFLApAQCAtNTksNyArODcsMTAgQEAKIAlXMV9DTURfQUxBUk1fU0VBUkNILAogCVcxX0NNRF9UT1VDSCwKIAlXMV9DTURfUkVTRVQsCi0JVzFfQ01EX01BWCwKKwlXMV9DTURfU0xBVkVfQURELAorCVcxX0NNRF9TTEFWRV9SRU1PVkUsCisJVzFfQ01EX0xJU1RfU0xBVkVTLAorCVcxX0NNRF9NQVgKIH07CiAKIHN0cnVjdCB3MV9uZXRsaW5rX2NtZApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IDc5ZDI1ODkuLjBjNjA0OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTExMSw2ICsxMTEsMTUgQEAKIAkgIFN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyBpbiB0aGUgV004MzUwIEF1ZGlvUGx1cyBQTUlDLiAgV2hlbgogCSAgdGhlIHdhdGNoZG9nIHRyaWdnZXJzIHRoZSBzeXN0ZW0gd2lsbCBiZSByZXNldC4KIAorY29uZmlnIFhJTElOWF9XQVRDSERPRworCXRyaXN0YXRlICJYaWxpbnggV2F0Y2hkb2cgdGltZXIiCisJc2VsZWN0IFdBVENIRE9HX0NPUkUKKwloZWxwCisJICBXYXRjaGRvZyBkcml2ZXIgZm9yIHRoZSB4cHNfdGltZWJhc2Vfd2R0IGlwIGNvcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9mX3hpbGlueF93ZHQuCisKICMgQUxQSEEgQXJjaGl0ZWN0dXJlCiAKICMgQVJNIEFyY2hpdGVjdHVyZQpAQCAtMjkyLDcgKzMwMSw3IEBACiAKIGNvbmZpZyBPUklPTl9XQVRDSERPRwogCXRyaXN0YXRlICJPcmlvbiB3YXRjaGRvZyIKLQlkZXBlbmRzIG9uIEFSQ0hfT1JJT041WCB8fCBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRQorCWRlcGVuZHMgb24gQVJDSF9PUklPTjVYIHx8IEFSQ0hfS0lSS1dPT0QgfHwgQVJDSF9ET1ZFIHx8IE1BQ0hfRE9WRQogCXNlbGVjdCBXQVRDSERPR19DT1JFCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyB0aW1lcgpAQCAtNDIxLDYgKzQzMCwxNyBAQAogCSAgU3VwcG9ydCBmb3IgQ1NSIFNpUkZwcmltYUlJIGFuZCBTaVJGYXRsYXNWSSB3YXRjaGRvZy4gV2hlbgogCSAgdGhlIHdhdGNoZG9nIHRyaWdnZXJzIHRoZSBzeXN0ZW0gd2lsbCBiZSByZXNldC4KIAorY29uZmlnIFRFR1JBX1dBVENIRE9HCisJdHJpc3RhdGUgIlRlZ3JhIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gQVJDSF9URUdSQSB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgV0FUQ0hET0dfQ09SRQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIKKwkgIGVtYmVkZGVkIGluIE5WSURJQSBUZWdyYSBTb0NzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0ZWdyYV93ZHQuCisKICMgQVZSMzIgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyBBVDMyQVA3MDBYX1dEVApAQCAtNTMzLDcgKzU1Myw3IEBACiAKIGNvbmZpZyBTQzUyMF9XRFQKIAl0cmlzdGF0ZSAiQU1EIEVsYW4gU0M1MjAgcHJvY2Vzc29yIFdhdGNoZG9nIgotCWRlcGVuZHMgb24gWDg2CisJZGVwZW5kcyBvbiBNRUxBTgogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGJ1aWx0IGluIHRvIHRoZQogCSAgQU1EICJFbGFuIiBTQzUyMCBtaWNyb2NvbXB1dGVyIGNvbW1vbmx5IHVzZWQgaW4gZW1iZWRkZWQgc3lzdGVtcy4KQEAgLTEwMjMsMTggKzEwNDMsNiBAQAogCiAjIE1pY3JvQmxhemUgQXJjaGl0ZWN0dXJlCiAKLWNvbmZpZyBYSUxJTlhfV0FUQ0hET0cKLQl0cmlzdGF0ZSAiWGlsaW54IFdhdGNoZG9nIHRpbWVyIgotCWRlcGVuZHMgb24gTUlDUk9CTEFaRQotCS0tLWhlbHAtLS0KLQkgIFdhdGNoZG9nIGRyaXZlciBmb3IgdGhlIHhwc190aW1lYmFzZV93ZHQgaXAgY29yZS4KLQotCSAgSU1QT1JUQU5UOiBUaGUgeHBzX3RpbWViYXNlX3dkdCBwYXJlbnQgbXVzdCBoYXZlIHRoZSBwcm9wZXJ0eQotCSAgImNsb2NrLWZyZXF1ZW5jeSIgYXQgZGV2aWNlIHRyZWUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9mX3hpbGlueF93ZHQuCi0KICMgTUlQUyBBcmNoaXRlY3R1cmUKIAogY29uZmlnIEFUSDc5X1dEVApAQCAtMTE2MCw3ICsxMTY4LDcgQEAKIAogY29uZmlnIEJDTV9LT05BX1dEVAogCXRyaXN0YXRlICJCQ00gS29uYSBXYXRjaGRvZyIKLQlkZXBlbmRzIG9uIEFSQ0hfQkNNCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9NT0JJTEUKIAlzZWxlY3QgV0FUQ0hET0dfQ09SRQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSB3YXRjaGRvZyB0aW1lciBvbiB0aGUgZm9sbG93aW5nIEJyb2FkY29tIEJDTTI4MXh4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQppbmRleCA5ODVhNjZjLi4xYjVmM2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTU4LDYgKzU4LDcgQEAKIG9iai0kKENPTkZJR19NT1hBUlRfV0RUKSArPSBtb3hhcnRfd2R0Lm8KIG9iai0kKENPTkZJR19TSVJGU09DX1dBVENIRE9HKSArPSBzaXJmc29jX3dkdC5vCiBvYmotJChDT05GSUdfQkNNX0tPTkFfV0RUKSArPSBiY21fa29uYV93ZHQubworb2JqLSQoQ09ORklHX1RFR1JBX1dBVENIRE9HKSArPSB0ZWdyYV93ZHQubwogCiAjIEFWUjMyIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHX0FUMzJBUDcwMFhfV0RUKSArPSBhdDMyYXA3MDB4X3dkdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FjcXVpcmV3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWNxdWlyZXdkdC5jCmluZGV4IDVjZjE2MjEuLjU2MTQ0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYWNxdWlyZXdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWNxdWlyZXdkdC5jCkBAIC0yMzksNyArMjM5LDcgQEAKICAqCUluaXQgJiBleGl0IHJvdXRpbmVzCiAgKi8KIAotc3RhdGljIGludCBhY3FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgYWNxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0OwogCkBAIC0yOTEsNyArMjkxLDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWNxdWlyZXdkdF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGFjcV9wcm9iZSwKIAkucmVtb3ZlCQk9IGFjcV9yZW1vdmUsCiAJLnNodXRkb3duCT0gYWNxX3NodXRkb3duLAogCS5kcml2ZXIJCT0gewpAQCAtMzA2LDIwICszMDUsMTggQEAKIAogCXByX2luZm8oIldEVCBkcml2ZXIgZm9yIEFjcXVpcmUgc2luZ2xlIGJvYXJkIGNvbXB1dGVyIGluaXRpYWxpc2luZ1xuIik7CiAKLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFjcXVpcmV3ZHRfZHJpdmVyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJYWNxX3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJWX05BTUUsCiAJCQkJCQkJCS0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKGFjcV9wbGF0Zm9ybV9kZXZpY2UpKSB7Ci0JCWVyciA9IFBUUl9FUlIoYWNxX3BsYXRmb3JtX2RldmljZSk7Ci0JCWdvdG8gdW5yZWdfcGxhdGZvcm1fZHJpdmVyOwotCX0KKwlpZiAoSVNfRVJSKGFjcV9wbGF0Zm9ybV9kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihhY3FfcGxhdGZvcm1fZGV2aWNlKTsKKworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYWNxdWlyZXdkdF9kcml2ZXIsIGFjcV9wcm9iZSk7CisJaWYgKGVycikKKwkJZ290byB1bnJlZ19wbGF0Zm9ybV9kZXZpY2U7CiAJcmV0dXJuIDA7CiAKLXVucmVnX3BsYXRmb3JtX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWNxdWlyZXdkdF9kcml2ZXIpOwordW5yZWdfcGxhdGZvcm1fZGV2aWNlOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGFjcV9wbGF0Zm9ybV9kZXZpY2UpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYWR2YW50ZWNod2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2FkdmFudGVjaHdkdC5jCmluZGV4IGE4OTYxYWQuLjc3OTZkYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYWR2YW50ZWNod2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hZHZhbnRlY2h3ZHQuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAgKglJbml0ICYgZXhpdCByb3V0aW5lcwogICovCiAKLXN0YXRpYyBpbnQgYWR2d2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGFkdndkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIApAQCAtMjk5LDcgKzI5OSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFkdndkdF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGFkdndkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IGFkdndkdF9yZW1vdmUsCiAJLnNodXRkb3duCT0gYWR2d2R0X3NodXRkb3duLAogCS5kcml2ZXIJCT0gewpAQCAtMzE0LDIxICszMTMsMTkgQEAKIAogCXByX2luZm8oIldEVCBkcml2ZXIgZm9yIEFkdmFudGVjaCBzaW5nbGUgYm9hcmQgY29tcHV0ZXIgaW5pdGlhbGlzaW5nXG4iKTsKIAotCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWR2d2R0X2RyaXZlcik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCWFkdndkdF9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSVl9OQU1FLAogCQkJCQkJCQktMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlKSkgewotCQllcnIgPSBQVFJfRVJSKGFkdndkdF9wbGF0Zm9ybV9kZXZpY2UpOwotCQlnb3RvIHVucmVnX3BsYXRmb3JtX2RyaXZlcjsKLQl9CisJaWYgKElTX0VSUihhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWR2d2R0X3BsYXRmb3JtX2RldmljZSk7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmFkdndkdF9kcml2ZXIsIGFkdndkdF9wcm9iZSk7CisJaWYgKGVycikKKwkJZ290byB1bnJlZ19wbGF0Zm9ybV9kZXZpY2U7CiAKIAlyZXR1cm4gMDsKIAotdW5yZWdfcGxhdGZvcm1fZHJpdmVyOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhZHZ3ZHRfZHJpdmVyKTsKK3VucmVnX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhZHZ3ZHRfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FyN193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXI3X3dkdC5jCmluZGV4IDNhOTk2NTcuLmFlNmMyODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYXI3X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXI3X3dkdC5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYwppbmRleCBhZmU3ZDE3Li4yNWI1YzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2F0MzJhcDcwMHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hdDMyYXA3MDB4X3dkdC5jCkBAIC0zMjMsMTAgKzMyMyw4IEBACiAKIAl3ZHQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3ZHRfYXQzMmFwNzAweCksCiAJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXdkdCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIHdkdCBzdHJ1Y3R1cmVcbiIpOworCWlmICghd2R0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl3ZHQtPnJlZ3MgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOwogCWlmICghd2R0LT5yZWdzKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2F0aDc5X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9hdGg3OV93ZHQuYwppbmRleCA5ZmExZjY5Li4zOTljM2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2F0aDc5X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXRoNzlfd2R0LmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9iY20yODM1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9iY20yODM1X3dkdC5jCmluZGV4IGNhZmE5NzMuLjhkZjQ1MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYmNtMjgzNV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTI4MzVfd2R0LmMKQEAgLTExNCwxMCArMTE0LDggQEAKIAlpbnQgZXJyOwogCiAJd2R0ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBiY20yODM1X3dkdCksIEdGUF9LRVJORUwpOwotCWlmICghd2R0KSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igd2F0Y2hkb2cgZGV2aWNlIik7CisJaWYgKCF3ZHQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3ZHQpOwogCiAJc3Bpbl9sb2NrX2luaXQoJndkdC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2JjbTQ3eHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTQ3eHhfd2R0LmMKaW5kZXggYjQwMjFhMmIuLmI2MWZjYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYmNtNDd4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTQ3eHhfd2R0LmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9iY200N3h4X3dkdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2JjbTYzeHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2JjbTYzeHhfd2R0LmMKaW5kZXggNGViMTg4Yi4uNWE4ZTg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9iY202M3h4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYmNtNjN4eF93ZHQuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CkBAIC00NSw3ICs0NCw2IEBACiBzdGF0aWMgc3RydWN0IHsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Ci0JaW50IGRlZmF1bHRfdGlja3M7CiAJdW5zaWduZWQgbG9uZyBpbnVzZTsKIAlhdG9taWNfdCB0aWNrczsKIH0gYmNtNjN4eF93ZHRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9ib29rZV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYm9va2Vfd2R0LmMKaW5kZXggZjFiOGQ1NS4uYThkYmNlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYm9va2Vfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ib29rZV93ZHQuYwpAQCAtMTM4LDE0ICsxMzgsNiBAQAogCXZhbCAmPSB+V0RUUF9NQVNLOwogCXZhbCB8PSAoVENSX1dJRXxUQ1JfV1JDKFdSQ19DSElQKXxXRFRQKGJvb2tlX3dkdF9wZXJpb2QpKTsKIAotI2lmZGVmIENPTkZJR19QUENfQk9PSzNFXzY0Ci0JLyoKLQkgKiBDcml0IGludHMgYXJlIGN1cnJlbnRseSBicm9rZW4gb24gUFBDNjQgQm9vay1FLCBzbwotCSAqIGp1c3QgZGlzYWJsZSB0aGVtIGZvciBub3cuCi0JICovCi0JdmFsICY9IH5UQ1JfV0lFOwotI2VuZGlmCi0KIAltdHNwcihTUFJOX1RDUiwgdmFsKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9jcHU1d2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2NwdTV3ZHQuYwppbmRleCBmN2FlNDllLi42ZDAzZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2NwdTV3ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2NwdTV3ZHQuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2Nwd2QuYwppbmRleCAyMTMyMjVlLi5lNTVlZDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2Nwd2QuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2Nwd2QuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2RhOTA1Ml93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDUyX3dkdC5jCmluZGV4IGYwOWM1NGUuLjJlOTU4OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDUyX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDUyX3dkdC5jCkBAIC0xODUsNyArMTg1LDYgQEAKIAlkcml2ZXJfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRyaXZlcl9kYXRhKSwKIAkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWRyaXZlcl9kYXRhKSB7Ci0JCWRldl9lcnIoZGE5MDUyLT5kZXYsICJVbmFibGUgdG8gYWxsb2FjYXRlIHdhdGNoZG9nIGRldmljZVxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZGE5MDU1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9kYTkwNTVfd2R0LmMKaW5kZXggNTc1ZjM3YS4uNDk1MDg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9kYTkwNTVfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9kYTkwNTVfd2R0LmMKQEAgLTE1MSwxMCArMTUxLDggQEAKIAogCWRyaXZlcl9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJpdmVyX2RhdGEpLAogCQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghZHJpdmVyX2RhdGEpIHsKLQkJZGV2X2VycihkYTkwNTUtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB3YXRjaGRvZyBkZXZpY2VcbiIpOworCWlmICghZHJpdmVyX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWRyaXZlcl9kYXRhLT5kYTkwNTUgPSBkYTkwNTU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZGF2aW5jaV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGF2aW5jaV93ZHQuYwppbmRleCBiMWJhZTAzLi5kMDlhZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2RhdmluY2lfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9kYXZpbmNpX3dkdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9lcDkzeHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2VwOTN4eF93ZHQuYwppbmRleCBkMWQwN2YyLi41ZjU0ZTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2VwOTN4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2VwOTN4eF93ZHQuYwpAQCAtMTE4LDE2ICsxMTgsOSBAQAogCWludCBlcnI7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOWElPOwotCi0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAotCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCW1taW9fYmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghbW1pb19iYXNlKQotCQlyZXR1cm4gLUVOWElPOworCW1taW9fYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobW1pb19iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobW1pb19iYXNlKTsKIAogCWlmICh0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gMzYwMCkgewogCQl0aW1lb3V0ID0gV0RUX1RJTUVPVVQ7CkBAIC0xNzIsOSArMTY1LDkgQEAKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihlcDkzeHhfd2R0X2RyaXZlcik7CiAKLU1PRFVMRV9BVVRIT1IoIlJheSBMZWh0aW5pZW1pIDxyYXlsQG1haWwuY29tPiwiCi0JCSJBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4sIgotCQkiSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJSYXkgTGVodGluaWVtaSA8cmF5bEBtYWlsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworTU9EVUxFX0FVVEhPUigiSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkVQOTN4eCBXYXRjaGRvZyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oV0RUX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9nZW9kZXdkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9nZW9kZXdkdC5jCmluZGV4IDRhNmFlODQuLjRjNDNlM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvZ2VvZGV3ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2dlb2Rld2R0LmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCS5mb3BzID0gJmdlb2Rld2R0X2ZvcHMsCiB9OwogCi1zdGF0aWMgaW50IGdlb2Rld2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGdlb2Rld2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0OwogCkBAIC0yNTUsNyArMjU1LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ2VvZGV3ZHRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBnZW9kZXdkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IGdlb2Rld2R0X3JlbW92ZSwKIAkuc2h1dGRvd24JPSBnZW9kZXdkdF9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKQEAgLTI2OCwyMCArMjY3LDE4IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ2VvZGV3ZHRfZHJpdmVyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJZ2VvZGV3ZHRfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwKIAkJCQkJCQkJLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoZ2VvZGV3ZHRfcGxhdGZvcm1fZGV2aWNlKSkgewotCQlyZXQgPSBQVFJfRVJSKGdlb2Rld2R0X3BsYXRmb3JtX2RldmljZSk7CisJaWYgKElTX0VSUihnZW9kZXdkdF9wbGF0Zm9ybV9kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihnZW9kZXdkdF9wbGF0Zm9ybV9kZXZpY2UpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZnZW9kZXdkdF9kcml2ZXIsIGdlb2Rld2R0X3Byb2JlKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycjsKLQl9CiAKIAlyZXR1cm4gMDsKIGVycjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ2VvZGV3ZHRfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihnZW9kZXdkdF9wbGF0Zm9ybV9kZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwppbmRleCAyYjc1ZThiLi43NWQyMjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCkBAIC0xNyw3ICsxNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pNjMwMGVzYi5jIGIvZHJpdmVycy93YXRjaGRvZy9pNjMwMGVzYi5jCmluZGV4IDI1YTJiZmQuLmQ3YmVmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaTYzMDBlc2IuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2k2MzAwZXNiLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKaW5kZXggMDRmOGFmNi4uMGU2YzAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYwpAQCAtMzQ3LDE1ICszNDcsMTUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIGlUQ09fd2R0X29wcyA9IHsKIAkub3duZXIgPQkJVEhJU19NT0RVTEUsCiAJLnN0YXJ0ID0JCWlUQ09fd2R0X3N0YXJ0LAotCS5zdG9wID0gCQlpVENPX3dkdF9zdG9wLAotCS5waW5nID0gCQlpVENPX3dkdF9waW5nLAorCS5zdG9wID0JCQlpVENPX3dkdF9zdG9wLAorCS5waW5nID0JCQlpVENPX3dkdF9waW5nLAogCS5zZXRfdGltZW91dCA9CQlpVENPX3dkdF9zZXRfdGltZW91dCwKIAkuZ2V0X3RpbWVsZWZ0ID0JCWlUQ09fd2R0X2dldF90aW1lbGVmdCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIGlUQ09fd2R0X3dhdGNoZG9nX2RldiA9IHsKIAkuaW5mbyA9CQkmaWRlbnQsCi0JLm9wcyA9IAkJJmlUQ09fd2R0X29wcywKKwkub3BzID0JCSZpVENPX3dkdF9vcHMsCiB9OwogCiAvKgpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJaVRDT193ZHRfd2F0Y2hkb2dfZGV2LmJvb3RzdGF0dXMgPSAwOwogCWlUQ09fd2R0X3dhdGNoZG9nX2Rldi50aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsKIAl3YXRjaGRvZ19zZXRfbm93YXlvdXQoJmlUQ09fd2R0X3dhdGNoZG9nX2Rldiwgbm93YXlvdXQpOwotCWlUQ09fd2R0X3dhdGNoZG9nX2Rldi5wYXJlbnQgPSBkZXYtPmRldi5wYXJlbnQ7CisJaVRDT193ZHRfd2F0Y2hkb2dfZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgd2F0Y2hkb2cgaXMgbm90IHJ1bm5pbmcgKi8KIAlpVENPX3dkdF9zdG9wKCZpVENPX3dkdF93YXRjaGRvZ19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pYjcwMHdkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pYjcwMHdkdC5jCmluZGV4IDdhZTM2NjkuLjQyNDdjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaWI3MDB3ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2liNzAwd2R0LmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICoJSW5pdCAmIGV4aXQgcm91dGluZXMKICAqLwogCi1zdGF0aWMgaW50IGlid2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGlid2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzOwogCkBAIC0zMzYsNyArMzM2LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaWJ3ZHRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBpYndkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IGlid2R0X3JlbW92ZSwKIAkuc2h1dGRvd24JPSBpYndkdF9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKQEAgLTM1MSwyMSArMzUwLDE5IEBACiAKIAlwcl9pbmZvKCJXRFQgZHJpdmVyIGZvciBJQjcwMCBzaW5nbGUgYm9hcmQgY29tcHV0ZXIgaW5pdGlhbGlzaW5nXG4iKTsKIAotCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaWJ3ZHRfZHJpdmVyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJaWJ3ZHRfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwKIAkJCQkJCQkJLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoaWJ3ZHRfcGxhdGZvcm1fZGV2aWNlKSkgewotCQllcnIgPSBQVFJfRVJSKGlid2R0X3BsYXRmb3JtX2RldmljZSk7Ci0JCWdvdG8gdW5yZWdfcGxhdGZvcm1fZHJpdmVyOwotCX0KKwlpZiAoSVNfRVJSKGlid2R0X3BsYXRmb3JtX2RldmljZSkpCisJCXJldHVybiBQVFJfRVJSKGlid2R0X3BsYXRmb3JtX2RldmljZSk7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmlid2R0X2RyaXZlciwgaWJ3ZHRfcHJvYmUpOworCWlmIChlcnIpCisJCWdvdG8gdW5yZWdfcGxhdGZvcm1fZGV2aWNlOwogCiAJcmV0dXJuIDA7CiAKLXVucmVnX3BsYXRmb3JtX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaWJ3ZHRfZHJpdmVyKTsKK3VucmVnX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpYndkdF9wbGF0Zm9ybV9kZXZpY2UpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaWJtYXNyLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2libWFzci5jCmluZGV4IGRiMGEzNDQ2Li4zNjZiMDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2libWFzci5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaWJtYXNyLmMKQEAgLTM2MCw3ICszNjAsNyBAQAogCWludCB0eXBlOwogfTsKIAotc3RhdGljIHN0cnVjdCBpYm1hc3JfaWQgX19pbml0ZGF0YSBpYm1hc3JfaWRfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWJtYXNyX2lkIGlibWFzcl9pZF90YWJsZVtdIF9faW5pdGRhdGEgPSB7CiAJeyAiSUJNIEF1dG9tYXRpYyBTZXJ2ZXIgUmVzdGFydCAtIGVzZXJ2ZXIgeFNlcmllcyAyMjAiLCBBU01UWVBFX1RPUEFaIH0sCiAJeyAiSUJNIEF1dG9tYXRpYyBTZXJ2ZXIgUmVzdGFydCAtIE1hY2hpbmUgVHlwZSA4NjczIiwgQVNNVFlQRV9QRUFSTCB9LAogCXsgIklCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQgLSBNYWNoaW5lIFR5cGUgODQ4MCIsIEFTTVRZUEVfSkFTUEVSIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2luZHlkb2cuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW5keWRvZy5jCmluZGV4IDFiNWMyNWEuLjVkMjBjZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaW5keWRvZy5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW5keWRvZy5jCkBAIC00MSwyNCArNDEsMTUgQEAKIAogc3RhdGljIHZvaWQgaW5keWRvZ19zdGFydCh2b2lkKQogewotCXUzMiBtY19jdHJsMDsKLQogCXNwaW5fbG9jaygmaW5keWRvZ19sb2NrKTsKLQltY19jdHJsMCA9IHNnaW1jLT5jcHVjdHJsMDsKLQltY19jdHJsMCA9IHNnaW1jLT5jcHVjdHJsMCB8IFNHSU1DX0NDVFJMMF9XRE9HOwotCXNnaW1jLT5jcHVjdHJsMCA9IG1jX2N0cmwwOworCXNnaW1jLT5jcHVjdHJsMCB8PSBTR0lNQ19DQ1RSTDBfV0RPRzsKIAlzcGluX3VubG9jaygmaW5keWRvZ19sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgaW5keWRvZ19zdG9wKHZvaWQpCiB7Ci0JdTMyIG1jX2N0cmwwOwotCiAJc3Bpbl9sb2NrKCZpbmR5ZG9nX2xvY2spOwotCi0JbWNfY3RybDAgPSBzZ2ltYy0+Y3B1Y3RybDA7Ci0JbWNfY3RybDAgJj0gflNHSU1DX0NDVFJMMF9XRE9HOwotCXNnaW1jLT5jcHVjdHJsMCA9IG1jX2N0cmwwOworCXNnaW1jLT5jcHVjdHJsMCAmPSB+U0dJTUNfQ0NUUkwwX1dET0c7CiAJc3Bpbl91bmxvY2soJmluZHlkb2dfbG9jayk7CiAKIAlwcl9pbmZvKCJTdG9wcGVkIHdhdGNoZG9nIHRpbWVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaW50ZWxfc2N1X3dhdGNoZG9nLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2ludGVsX3NjdV93YXRjaGRvZy5jCmluZGV4IGUxM2U2NWUuLjBjYWFiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaW50ZWxfc2N1X3dhdGNoZG9nLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pbnRlbF9zY3Vfd2F0Y2hkb2cuYwpAQCAtMjExLDcgKzIxMSw2IEBACiAJaW50CQkJIGlwY19yZXQ7CiAJaW50CQkJIHJldHJ5X2NvdW50OwogCXUzMgkJCSBzb2Z0X3ZhbHVlOwotCXUzMgkJCSBod19wcmVfdmFsdWU7CiAJdTMyCQkJIGh3X3ZhbHVlOwogCiAJd2F0Y2hkb2dfZGV2aWNlLnRpbWVyX3NldCA9IHQ7CkBAIC0yNzMsOCArMjcyLDcgQEAKIAkJCXdhdGNoZG9nX2RldmljZS50aW1lcl9sb2FkX2NvdW50X2FkZHIpOwogCiAJCS8qIHJlYWQgY291bnQgdmFsdWUgYmVmb3JlIHN0YXJ0aW5nIHRpbWVyICovCi0JCWh3X3ByZV92YWx1ZSA9IGlvcmVhZDMyKHdhdGNoZG9nX2RldmljZS50aW1lcl9sb2FkX2NvdW50X2FkZHIpOwotCQlod19wcmVfdmFsdWUgPSBod19wcmVfdmFsdWUgJiAweEZGRkYwMDAwOworCQlpb3JlYWQzMih3YXRjaGRvZ19kZXZpY2UudGltZXJfbG9hZF9jb3VudF9hZGRyKTsKIAogCQkvKiBTdGFydCB0aGUgdGltZXIgKi8KIAkJaW93cml0ZTMyKDB4MDAwMDAwMDMsIHdhdGNoZG9nX2RldmljZS50aW1lcl9jb250cm9sX2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jCmluZGV4IGUyYmJhNjguLjBiOTM3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2l0ODdfd2R0LmMKQEAgLTU0LDYgKzU0LDcgQEAKIAogLyogRGVmYXVsdHMgZm9yIE1vZHVsZSBQYXJhbWV0ZXIgKi8KICNkZWZpbmUgREVGQVVMVF9OT0dBTUVQT1JUCTAKKyNkZWZpbmUgREVGQVVMVF9OT0NJUgkJMAogI2RlZmluZSBERUZBVUxUX0VYQ0xVU0lWRQkxCiAjZGVmaW5lIERFRkFVTFRfVElNRU9VVAkJNjAKICNkZWZpbmUgREVGQVVMVF9URVNUTU9ERQkwCkBAIC0xMzYsMTEgKzEzNywxMyBAQAogI2RlZmluZSBXRFRTX0xPQ0tFRAkzCiAjZGVmaW5lIFdEVFNfVVNFX0dQCTQKICNkZWZpbmUgV0RUU19FWFBFQ1RFRAk1CisjZGVmaW5lIFdEVFNfVVNFX0NJUgk2CiAKIHN0YXRpYwl1bnNpZ25lZCBpbnQgYmFzZSwgZ3BhY3QsIGNpcmFjdCwgbWF4X3VuaXRzLCBjaGlwX3R5cGU7CiBzdGF0aWMJdW5zaWduZWQgbG9uZyB3ZHRfc3RhdHVzOwogCiBzdGF0aWMJaW50IG5vZ2FtZXBvcnQgPSBERUZBVUxUX05PR0FNRVBPUlQ7CitzdGF0aWMgaW50IG5vY2lyICAgICAgPSBERUZBVUxUX05PQ0lSOwogc3RhdGljCWludCBleGNsdXNpdmUgID0gREVGQVVMVF9FWENMVVNJVkU7CiBzdGF0aWMJaW50IHRpbWVvdXQgICAgPSBERUZBVUxUX1RJTUVPVVQ7CiBzdGF0aWMJaW50IHRlc3Rtb2RlICAgPSBERUZBVUxUX1RFU1RNT0RFOwpAQCAtMTQ5LDYgKzE1Miw5IEBACiBtb2R1bGVfcGFyYW0obm9nYW1lcG9ydCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9nYW1lcG9ydCwgIkZvcmJpZCB0aGUgYWN0aXZhdGlvbiBvZiBnYW1lIHBvcnQsIGRlZmF1bHQ9IgogCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9OT0dBTUVQT1JUKSk7Cittb2R1bGVfcGFyYW0obm9jaXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vY2lyLCAiRm9yYmlkIHRoZSB1c2Ugb2YgQ29uc3VtZXIgSVIgaW50ZXJydXB0cyB0byByZXNldCB0aW1lciwgZGVmYXVsdD0iCisJCV9fTU9EVUxFX1NUUklORyhERUZBVUxUX05PQ0lSKSk7CiBtb2R1bGVfcGFyYW0oZXhjbHVzaXZlLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhleGNsdXNpdmUsICJXYXRjaGRvZyBleGNsdXNpdmUgZGV2aWNlIG9wZW4sIGRlZmF1bHQ9IgogCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9FWENMVVNJVkUpKTsKQEAgLTI1OCw5ICsyNjQsMTcgQEAKIHsKIAlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkKIAkJaW5iKGJhc2UpOwotCWVsc2UKKwllbHNlIGlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkKIAkJLyogVGhlIHRpbWVyIHJlbG9hZHMgd2l0aCBhcm91bmQgNSBtc2VjIGRlbGF5ICovCiAJCW91dGIoMHg1NSwgQ0lSX0RSKGJhc2UpKTsKKwllbHNlIHsKKwkJaWYgKHN1cGVyaW9fZW50ZXIoKSkKKwkJCXJldHVybjsKKworCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKKwkJd2R0X3VwZGF0ZV90aW1lb3V0KCk7CisJCXN1cGVyaW9fZXhpdCgpOworCX0KIAlzZXRfYml0KFdEVFNfS0VFUEFMSVZFLCAmd2R0X3N0YXR1cyk7CiB9CiAKQEAgLTI3Myw3ICsyODcsNyBAQAogCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwogCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKQogCQlzdXBlcmlvX291dGIoV0RUX0dBTUVQT1JULCBXRFRDVFJMKTsKLQllbHNlCisJZWxzZSBpZiAodGVzdF9iaXQoV0RUU19VU0VfQ0lSLCAmd2R0X3N0YXR1cykpCiAJCXN1cGVyaW9fb3V0YihXRFRfQ0lSSU5ULCBXRFRDVFJMKTsKIAl3ZHRfdXBkYXRlX3RpbWVvdXQoKTsKIApAQCAtNjYwLDcgKzY3NCw3IEBACiAJfQogCiAJLyogSWYgd2UgaGF2ZW4ndCBHYW1lcG9ydCBzdXBwb3J0LCB0cnkgdG8gZ2V0IENJUiBzdXBwb3J0ICovCi0JaWYgKCF0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7CisJaWYgKCFub2NpciAmJiAhdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgewogCQlpZiAoIXJlcXVlc3RfcmVnaW9uKENJUl9CQVNFLCA4LCBXQVRDSERPR19OQU1FKSkgewogCQkJaWYgKGdwX3JyZXFfZmFpbCkKIAkJCQlwcl9lcnIoIkkvTyBBZGRyZXNzIDB4JTA0eCBhbmQgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLApAQCAtNjgyLDYgKzY5Niw3IEBACiAJCQlzdXBlcmlvX3NlbGVjdChHQU1FUE9SVCk7CiAJCQlzdXBlcmlvX291dGIoZ3BhY3QsIEFDVFJFRyk7CiAJCX0KKwkJc2V0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKTsKIAl9CiAKIAlpZiAodGltZW91dCA8IDEgfHwgdGltZW91dCA+IG1heF91bml0cyAqIDYwKSB7CkBAIC03MDcsNyArNzIyLDcgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIENJUiB0byB1c2UgaXQgYXMga2VlcGFsaXZlIHNvdXJjZSAqLwotCWlmICghdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgeworCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkgewogCQlvdXRiKDB4MDAsIENJUl9SQ1IoYmFzZSkpOwogCQlvdXRiKDB4YzAsIENJUl9UQ1IxKGJhc2UpKTsKIAkJb3V0YigweDVjLCBDSVJfVENSMihiYXNlKSk7CkBAIC03MTcsOSArNzMyLDkgQEAKIAkJb3V0YigweDA5LCBDSVJfSUVSKGJhc2UpKTsKIAl9CiAKLQlwcl9pbmZvKCJDaGlwIElUJTA0eCByZXZpc2lvbiAlZCBpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkIHRlc3Rtb2RlPSVkIGV4Y2x1c2l2ZT0lZCBub2dhbWVwb3J0PSVkKVxuIiwKKwlwcl9pbmZvKCJDaGlwIElUJTA0eCByZXZpc2lvbiAlZCBpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkIHRlc3Rtb2RlPSVkIGV4Y2x1c2l2ZT0lZCBub2dhbWVwb3J0PSVkIG5vY2lyPSVkKVxuIiwKIAkJY2hpcF90eXBlLCBjaGlwX3JldiwgdGltZW91dCwKLQkJbm93YXlvdXQsIHRlc3Rtb2RlLCBleGNsdXNpdmUsIG5vZ2FtZXBvcnQpOworCQlub3dheW91dCwgdGVzdG1vZGUsIGV4Y2x1c2l2ZSwgbm9nYW1lcG9ydCwgbm9jaXIpOwogCiAJc3VwZXJpb19leGl0KCk7CiAJcmV0dXJuIDA7CkBAIC03MjcsOCArNzQyLDEwIEBACiBlcnJfb3V0X3JlYm9vdDoKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKIGVycl9vdXRfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGJhc2UsIHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykgPyAxIDogOCk7Ci0JaWYgKCF0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7CisJaWYgKHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpCisJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDEpOworCWVsc2UgaWYgKHRlc3RfYml0KFdEVFNfVVNFX0NJUiwgJndkdF9zdGF0dXMpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDgpOwogCQlzdXBlcmlvX3NlbGVjdChDSVIpOwogCQlzdXBlcmlvX291dGIoY2lyYWN0LCBBQ1RSRUcpOwogCX0KQEAgLTc1NCw3ICs3NzEsNyBAQAogCQlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgewogCQkJc3VwZXJpb19zZWxlY3QoR0FNRVBPUlQpOwogCQkJc3VwZXJpb19vdXRiKGdwYWN0LCBBQ1RSRUcpOwotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKHRlc3RfYml0KFdEVFNfVVNFX0NJUiwgJndkdF9zdGF0dXMpKSB7CiAJCQlzdXBlcmlvX3NlbGVjdChDSVIpOwogCQkJc3VwZXJpb19vdXRiKGNpcmFjdCwgQUNUUkVHKTsKIAkJfQpAQCAtNzYzLDcgKzc4MCwxMSBAQAogCiAJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7Ci0JcmVsZWFzZV9yZWdpb24oYmFzZSwgdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSA/IDEgOiA4KTsKKworCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKQorCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAxKTsKKwllbHNlIGlmICh0ZXN0X2JpdChXRFRTX1VTRV9DSVIsICZ3ZHRfc3RhdHVzKSkKKwkJcmVsZWFzZV9yZWdpb24oYmFzZSwgOCk7CiB9CiAKIG1vZHVsZV9pbml0KGl0ODdfd2R0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9qejQ3NDBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2p6NDc0MF93ZHQuYwppbmRleCAzYWE1MGNmLi45MWU0NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2p6NDc0MF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2p6NDc0MF93ZHQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbWF4NjN4eF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbWF4NjN4eF93ZHQuYwppbmRleCBiZGIzZjRhLi4wZTljYzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL21heDYzeHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9tYXg2M3h4X3dkdC5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tcGM4eHh4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tcGM4eHh4X3dkdC5jCmluZGV4IGMxZjY1YjQuLjc4MzE5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjOHh4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL21wYzh4eHhfd2R0LmMKQEAgLTIzNyw2ICsyMzcsNyBAQAogCQkuY29tcGF0aWJsZSA9ICJmc2wsbXBjODIzLXdkdCIsCiAJCS5kYXRhID0gJihzdHJ1Y3QgbXBjOHh4eF93ZHRfdHlwZSkgewogCQkJLnByZXNjYWxlciA9IDB4ODAwLAorCQkJLmh3X2VuYWJsZWQgPSB0cnVlLAogCQl9LAogCX0sCiAJe30sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYwppbmRleCBlZGIzMWZmLi5mZjI3YzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbnVjOTAwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9udWM5MDBfd2R0LmMKaW5kZXggYTBkODkzYi4uNzEzNTgwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9udWM5MDBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9udWM5MDBfd2R0LmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29mX3hpbGlueF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jCmluZGV4IGZiNTcxMDMuLjU3Y2NhZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIFdhdGNoZG9nIERldmljZSBEcml2ZXIgZm9yIFhpbGlueCBheGkveHBzX3RpbWViYXNlX3dkdAogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAxMyAtIDIwMTQgWGlsaW54LCBJbmMuCiAgKiAoQykgQ29weXJpZ2h0IDIwMTEgKEFsZWphbmRybyBDYWJyZXJhIDxhbGRheWFAZ21haWwuY29tPikKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC05LDE4ICsxMCwxMyBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpAQCAtNDMsMTAyICszOSwxMDMgQEAKICNkZWZpbmUgWFdUX1RJTUVSX0ZBSUxFRCAgICAgICAgICAgIDB4RkZGRkZGRkYKIAogI2RlZmluZSBXQVRDSERPR19OQU1FICAgICAiWGlsaW54IFdhdGNoZG9nIgotI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCiAKIHN0cnVjdCB4d2R0X2RldmljZSB7Ci0Jc3RydWN0IHJlc291cmNlICByZXM7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwotCXUzMiBub3dheW91dDsKIAl1MzIgd2R0X2ludGVydmFsOwotCXUzMiBib290X3N0YXR1czsKKwlzcGlubG9ja190IHNwaW5sb2NrOworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgeGlsaW54X3dkdF93ZGQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IHh3ZHRfZGV2aWNlIHhkZXY7Ci0KLXN0YXRpYyAgdTMyIHRpbWVvdXQ7Ci1zdGF0aWMgIHUzMiBjb250cm9sX3N0YXR1c19yZWc7Ci1zdGF0aWMgIHU4ICBleHBlY3RfY2xvc2U7Ci1zdGF0aWMgIHU4ICBub190aW1lb3V0Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgZHJpdmVyX29wZW47Ci0KLXN0YXRpYyAgREVGSU5FX1NQSU5MT0NLKHNwaW5sb2NrKTsKLQotc3RhdGljIHZvaWQgeHdkdF9zdGFydCh2b2lkKQorc3RhdGljIGludCB4aWxpbnhfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKKwl1MzIgY29udHJvbF9zdGF0dXNfcmVnOworCXN0cnVjdCB4d2R0X2RldmljZSAqeGRldiA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CisKKwlzcGluX2xvY2soJnhkZXYtPnNwaW5sb2NrKTsKIAogCS8qIENsZWFuIHByZXZpb3VzIHN0YXR1cyBhbmQgZW5hYmxlIHRoZSB3YXRjaGRvZyB0aW1lciAqLwotCWNvbnRyb2xfc3RhdHVzX3JlZyA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCWNvbnRyb2xfc3RhdHVzX3JlZyB8PSAoWFdUX0NTUjBfV1JTX01BU0sgfCBYV1RfQ1NSMF9XRFNfTUFTSyk7CiAKIAlpb3dyaXRlMzIoKGNvbnRyb2xfc3RhdHVzX3JlZyB8IFhXVF9DU1IwX0VXRFQxX01BU0spLAotCQkJCXhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwkJICB4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCi0JaW93cml0ZTMyKFhXVF9DU1JYX0VXRFQyX01BU0ssIHhkZXYuYmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKKwlpb3dyaXRlMzIoWFdUX0NTUlhfRVdEVDJfTUFTSywgeGRldi0+YmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKIAotCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisJc3Bpbl91bmxvY2soJnhkZXYtPnNwaW5sb2NrKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB4d2R0X3N0b3Aodm9pZCkKK3N0YXRpYyBpbnQgeGlsaW54X3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKKwl1MzIgY29udHJvbF9zdGF0dXNfcmVnOworCXN0cnVjdCB4d2R0X2RldmljZSAqeGRldiA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CiAKLQljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisJc3Bpbl9sb2NrKCZ4ZGV2LT5zcGlubG9jayk7CisKKwljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCiAJaW93cml0ZTMyKChjb250cm9sX3N0YXR1c19yZWcgJiB+WFdUX0NTUjBfRVdEVDFfTUFTSyksCi0JCQkJeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCQkgIHhkZXYtPmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CiAKLQlpb3dyaXRlMzIoMCwgeGRldi5iYXNlICsgWFdUX1RXQ1NSMV9PRkZTRVQpOworCWlvd3JpdGUzMigwLCB4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMV9PRkZTRVQpOwogCi0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKwlzcGluX3VubG9jaygmeGRldi0+c3BpbmxvY2spOwogCXByX2luZm8oIlN0b3BwZWQhXG4iKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB4d2R0X2tlZXBhbGl2ZSh2b2lkKQorc3RhdGljIGludCB4aWxpbnhfd2R0X2tlZXBhbGl2ZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCiB7Ci0Jc3Bpbl9sb2NrKCZzcGlubG9jayk7CisJdTMyIGNvbnRyb2xfc3RhdHVzX3JlZzsKKwlzdHJ1Y3QgeHdkdF9kZXZpY2UgKnhkZXYgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOwogCi0JY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCXNwaW5fbG9jaygmeGRldi0+c3BpbmxvY2spOworCisJY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi0+YmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKIAljb250cm9sX3N0YXR1c19yZWcgfD0gKFhXVF9DU1IwX1dSU19NQVNLIHwgWFdUX0NTUjBfV0RTX01BU0spOwotCWlvd3JpdGUzMihjb250cm9sX3N0YXR1c19yZWcsIHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwlpb3dyaXRlMzIoY29udHJvbF9zdGF0dXNfcmVnLCB4ZGV2LT5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOwogCi0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKwlzcGluX3VubG9jaygmeGRldi0+c3BpbmxvY2spOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHh3ZHRfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKLXsKLQlpbnQgbmV3X3N0YXR1czsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB4aWxpbnhfd2R0X2lkZW50ID0geworCS5vcHRpb25zID0gIFdESU9GX01BR0lDQ0xPU0UgfAorCQkgICAgV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCisJLmlkZW50aXR5ID0JV0FUQ0hET0dfTkFNRSwKK307CiAKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHhpbGlueF93ZHRfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zdGFydCA9IHhpbGlueF93ZHRfc3RhcnQsCisJLnN0b3AgPSB4aWxpbnhfd2R0X3N0b3AsCisJLnBpbmcgPSB4aWxpbnhfd2R0X2tlZXBhbGl2ZSwKK307CiAKLQljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7Ci0JbmV3X3N0YXR1cyA9ICgoY29udHJvbF9zdGF0dXNfcmVnICYKLQkJCShYV1RfQ1NSMF9XUlNfTUFTSyB8IFhXVF9DU1IwX1dEU19NQVNLKSkgIT0gMCk7Ci0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKLQotCSpzdGF0dXMgPSAwOwotCWlmIChuZXdfc3RhdHVzICYgMSkKLQkJKnN0YXR1cyB8PSBXRElPRl9DQVJEUkVTRVQ7Ci19Ci0KLXN0YXRpYyB1MzIgeHdkdF9zZWxmdGVzdCh2b2lkKQorc3RhdGljIHUzMiB4d2R0X3NlbGZ0ZXN0KHN0cnVjdCB4d2R0X2RldmljZSAqeGRldikKIHsKIAlpbnQgaTsKIAl1MzIgdGltZXJfdmFsdWUxOwogCXUzMiB0aW1lcl92YWx1ZTI7CiAKLQlzcGluX2xvY2soJnNwaW5sb2NrKTsKKwlzcGluX2xvY2soJnhkZXYtPnNwaW5sb2NrKTsKIAotCXRpbWVyX3ZhbHVlMSA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKLQl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CisJdGltZXJfdmFsdWUxID0gaW9yZWFkMzIoeGRldi0+YmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKKwl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LT5iYXNlICsgWFdUX1RCUl9PRkZTRVQpOwogCiAJZm9yIChpID0gMDsKIAkJKChpIDw9IFhXVF9NQVhfU0VMRlRFU1RfTE9PUF9DT1VOVCkgJiYKIAkJCSh0aW1lcl92YWx1ZTIgPT0gdGltZXJfdmFsdWUxKSk7IGkrKykgewotCQl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CisJCXRpbWVyX3ZhbHVlMiA9IGlvcmVhZDMyKHhkZXYtPmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKwlzcGluX3VubG9jaygmeGRldi0+c3BpbmxvY2spOwogCiAJaWYgKHRpbWVyX3ZhbHVlMiAhPSB0aW1lcl92YWx1ZTEpCiAJCXJldHVybiB+WFdUX1RJTUVSX0ZBSUxFRDsKQEAgLTE0NiwyMzggKzE0Myw4MyBAQAogCQlyZXR1cm4gWFdUX1RJTUVSX0ZBSUxFRDsKIH0KIAotc3RhdGljIGludCB4d2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JLyogT25seSBvbmUgcHJvY2VzcyBjYW4gaGFuZGxlIHRoZSB3ZHQgYXQgYSB0aW1lICovCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRyaXZlcl9vcGVuKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtb2R1bGUgYXJlIGFsd2F5cyBsb2FkZWQuLi4qLwotCWlmICh4ZGV2Lm5vd2F5b3V0KQotCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCi0JeHdkdF9zdGFydCgpOwotCXByX2luZm8oIlN0YXJ0ZWQuLi5cbiIpOwotCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IHh3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7Ci0JCXh3ZHRfc3RvcCgpOwotCX0gZWxzZSB7Ci0JCXByX2NyaXQoIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOwotCQl4d2R0X2tlZXBhbGl2ZSgpOwotCX0KLQotCWNsZWFyX2JpdCgwLCAmZHJpdmVyX29wZW4pOwotCWV4cGVjdF9jbG9zZSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgICAgIHh3ZHRfd3JpdGU6Ci0gKiAgICAgIEBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKLSAqICAgICAgQGJ1ZjogYnVmZmVyIHRvIHdyaXRlICh1bnVzZWQgYXMgZGF0YSBkb2VzIG5vdCBtYXR0ZXIgaGVyZQotICogICAgICBAY291bnQ6IGNvdW50IG9mIGJ5dGVzCi0gKiAgICAgIEBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAotICoKLSAqICAgICAgQSB3cml0ZSB0byBhIHdhdGNoZG9nIGRldmljZSBpcyBkZWZpbmVkIGFzIGEga2VlcGFsaXZlIHNpZ25hbC4gQW55Ci0gKiAgICAgIHdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KLSAqLwotc3RhdGljIHNzaXplX3QgeHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAobGVuKSB7Ci0JCWlmICgheGRldi5ub3dheW91dCkgewotCQkJc2l6ZV90IGk7Ci0KLQkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLwotCQkJZXhwZWN0X2Nsb3NlID0gMDsKLQotCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgewotCQkJCWNoYXIgYzsKLQotCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJaWYgKGMgPT0gJ1YnKQotCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKLQkJCX0KLQkJfQotCQl4d2R0X2tlZXBhbGl2ZSgpOwotCX0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7Ci0JLm9wdGlvbnMgPSAgV0RJT0ZfTUFHSUNDTE9TRSB8Ci0JCSAgICBXRElPRl9LRUVQQUxJVkVQSU5HLAotCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKLQkuaWRlbnRpdHkgPQlXQVRDSERPR19OQU1FLAotfTsKLQotLyoKLSAqICAgICAgeHdkdF9pb2N0bDoKLSAqICAgICAgQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKLSAqICAgICAgQGNtZDogd2F0Y2hkb2cgY29tbWFuZAotICogICAgICBAYXJnOiBhcmd1bWVudCBwb2ludGVyCi0gKgotICogICAgICBUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncwotICogICAgICBhY2NvcmRpbmcgdG8gdGhlaXIgYXZhaWxhYmxlIGZlYXR1cmVzLgotICovCi1zdGF0aWMgbG9uZyB4d2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgc3RhdHVzOwotCi0JdW5pb24gewotCQlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKmlkZW50OwotCQlpbnQgX191c2VyICppOwotCX0gdWFyZzsKLQotCXVhcmcuaSA9IChpbnQgX191c2VyICopYXJnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6Ci0JCXJldHVybiBjb3B5X3RvX3VzZXIodWFyZy5pZGVudCwgJmlkZW50LAotCQkJCQlzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOwotCi0JY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgotCQlyZXR1cm4gcHV0X3VzZXIoeGRldi5ib290X3N0YXR1cywgdWFyZy5pKTsKLQotCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCQl4d2R0X2dldF9zdGF0dXMoJnN0YXR1cyk7Ci0JCXJldHVybiBwdXRfdXNlcihzdGF0dXMsIHVhcmcuaSk7Ci0KLQljYXNlIFdESU9DX0tFRVBBTElWRToKLQkJeHdkdF9rZWVwYWxpdmUoKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCWlmIChub190aW1lb3V0KQotCQkJcmV0dXJuIC1FTk9UVFk7Ci0JCWVsc2UKLQkJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCB1YXJnLmkpOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9UVFk7Ci0JfQotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4d2R0X2ZvcHMgPSB7Ci0JLm93bmVyICAgICAgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrICAgICA9IG5vX2xsc2VlaywKLQkud3JpdGUgICAgICA9IHh3ZHRfd3JpdGUsCi0JLm9wZW4gICAgICAgPSB4d2R0X29wZW4sCi0JLnJlbGVhc2UgICAgPSB4d2R0X3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0geHdkdF9pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB4d2R0X21pc2NkZXYgPSB7Ci0JLm1pbm9yICAgICAgPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZSAgICAgICA9ICJ3YXRjaGRvZyIsCi0JLmZvcHMgICAgICAgPSAmeHdkdF9mb3BzLAotfTsKLQogc3RhdGljIGludCB4d2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJjOwotCXUzMiAqdG1wdHI7Ci0JdTMyICpwZnJlcTsKKwl1MzIgcGZyZXEgPSAwLCBlbmFibGVfb25jZSA9IDA7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHh3ZHRfZGV2aWNlICp4ZGV2OworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKnhpbGlueF93ZHRfd2RkOwogCi0Jbm9fdGltZW91dCA9IDA7CisJeGRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnhkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXhkZXYpCisJCXJldHVybiAtRU5PTUVNOwogCi0JcGZyZXEgPSAodTMyICopb2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJeGlsaW54X3dkdF93ZGQgPSAmeGRldi0+eGlsaW54X3dkdF93ZGQ7CisJeGlsaW54X3dkdF93ZGQtPmluZm8gPSAmeGlsaW54X3dkdF9pZGVudDsKKwl4aWxpbnhfd2R0X3dkZC0+b3BzID0gJnhpbGlueF93ZHRfb3BzOworCXhpbGlueF93ZHRfd2RkLT5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCi0JaWYgKHBmcmVxID09IE5VTEwpIHsKLQkJcHJfd2FybigiVGhlIHdhdGNoZG9nIGNsb2NrIGZyZXF1ZW5jeSBjYW5ub3QgYmUgb2J0YWluZWQhXG4iKTsKLQkJbm9fdGltZW91dCA9IDE7Ci0JfQorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJeGRldi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoeGRldi0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHhkZXYtPmJhc2UpOwogCi0JcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHBkZXYtPmRldi5vZl9ub2RlLCAwLCAmeGRldi5yZXMpOwotCWlmIChyYykgewotCQlwcl93YXJuKCJpbnZhbGlkIGFkZHJlc3MhXG4iKTsKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgJnBmcmVxKTsKKwlpZiAocmMpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlRoZSB3YXRjaGRvZyBjbG9jayBmcmVxdWVuY3kgY2Fubm90IGJlIG9idGFpbmVkXG4iKTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJ4bG54LHdkdC1pbnRlcnZhbCIsCisJCQkJICAmeGRldi0+d2R0X2ludGVydmFsKTsKKwlpZiAocmMpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlBhcmFtZXRlciBcInhsbngsd2R0LWludGVydmFsXCIgbm90IGZvdW5kXG4iKTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJ4bG54LHdkdC1lbmFibGUtb25jZSIsCisJCQkJICAmZW5hYmxlX29uY2UpOworCWlmIChyYykKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiUGFyYW1ldGVyIFwieGxueCx3ZHQtZW5hYmxlLW9uY2VcIiBub3QgZm91bmRcbiIpOworCisJd2F0Y2hkb2dfc2V0X25vd2F5b3V0KHhpbGlueF93ZHRfd2RkLCBlbmFibGVfb25jZSk7CisKKwkvKgorCSAqIFR3aWNlIG9mIHRoZSAyXndkdF9pbnRlcnZhbCAvIGZyZXEgIGJlY2F1c2UgdGhlIGZpcnN0IHdkdCBvdmVyZmxvdyBpcworCSAqIGlnbm9yZWQgKGludGVycnVwdCksIHJlc2V0IGlzIG9ubHkgZ2VuZXJhdGVkIGF0IHNlY29uZCB3ZHQgb3ZlcmZsb3cKKwkgKi8KKwlpZiAocGZyZXEgJiYgeGRldi0+d2R0X2ludGVydmFsKQorCQl4aWxpbnhfd2R0X3dkZC0+dGltZW91dCA9IDIgKiAoKDEgPDwgeGRldi0+d2R0X2ludGVydmFsKSAvCisJCQkJCSAgcGZyZXEpOworCisJc3Bpbl9sb2NrX2luaXQoJnhkZXYtPnNwaW5sb2NrKTsKKwl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSh4aWxpbnhfd2R0X3dkZCwgeGRldik7CisKKwlyYyA9IHh3ZHRfc2VsZnRlc3QoeGRldik7CisJaWYgKHJjID09IFhXVF9USU1FUl9GQUlMRUQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiU2VsZlRlc3Qgcm91dGluZSBlcnJvclxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKLQl0bXB0ciA9ICh1MzIgKilvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSJ4bG54LHdkdC1pbnRlcnZhbCIsIE5VTEwpOwotCWlmICh0bXB0ciA9PSBOVUxMKSB7Ci0JCXByX3dhcm4oIlBhcmFtZXRlciBcInhsbngsd2R0LWludGVydmFsXCIgbm90IGZvdW5kIGluIGRldmljZSB0cmVlIVxuIik7Ci0JCW5vX3RpbWVvdXQgPSAxOwotCX0gZWxzZSB7Ci0JCXhkZXYud2R0X2ludGVydmFsID0gKnRtcHRyOwotCX0KLQotCXRtcHRyID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInhsbngsd2R0LWVuYWJsZS1vbmNlIiwgTlVMTCk7Ci0JaWYgKHRtcHRyID09IE5VTEwpIHsKLQkJcHJfd2FybigiUGFyYW1ldGVyIFwieGxueCx3ZHQtZW5hYmxlLW9uY2VcIiBub3QgZm91bmQgaW4gZGV2aWNlIHRyZWUhXG4iKTsKLQkJeGRldi5ub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwotCX0KLQotLyoKLSAqICBUd2ljZSBvZiB0aGUgMl53ZHRfaW50ZXJ2YWwgLyBmcmVxICBiZWNhdXNlIHRoZSBmaXJzdCB3ZHQgb3ZlcmZsb3cgaXMKLSAqICBpZ25vcmVkIChpbnRlcnJ1cHQpLCByZXNldCBpcyBvbmx5IGdlbmVyYXRlZCBhdCBzZWNvbmQgd2R0IG92ZXJmbG93Ci0gKi8KLQlpZiAoIW5vX3RpbWVvdXQpCi0JCXRpbWVvdXQgPSAyICogKCgxPDx4ZGV2LndkdF9pbnRlcnZhbCkgLyAqcGZyZXEpOwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oeGRldi5yZXMuc3RhcnQsCi0JCQl4ZGV2LnJlcy5lbmQgLSB4ZGV2LnJlcy5zdGFydCArIDEsIFdBVENIRE9HX05BTUUpKSB7Ci0JCXJjID0gLUVOWElPOwotCQlwcl9lcnIoIm1lbW9yeSByZXF1ZXN0IGZhaWx1cmUhXG4iKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXhkZXYuYmFzZSA9IGlvcmVtYXAoeGRldi5yZXMuc3RhcnQsIHhkZXYucmVzLmVuZCAtIHhkZXYucmVzLnN0YXJ0ICsgMSk7Ci0JaWYgKHhkZXYuYmFzZSA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcHJfZXJyKCJpb3JlbWFwIGZhaWx1cmUhXG4iKTsKLQkJZ290byByZWxlYXNlX21lbTsKLQl9Ci0KLQlyYyA9IHh3ZHRfc2VsZnRlc3QoKTsKLQlpZiAocmMgPT0gWFdUX1RJTUVSX0ZBSUxFRCkgewotCQlwcl9lcnIoIlNlbGZUZXN0IHJvdXRpbmUgZXJyb3IhXG4iKTsKLQkJZ290byB1bm1hcF9pbzsKLQl9Ci0KLQl4d2R0X2dldF9zdGF0dXMoJnhkZXYuYm9vdF9zdGF0dXMpOwotCi0JcmMgPSBtaXNjX3JlZ2lzdGVyKCZ4d2R0X21pc2NkZXYpOworCXJjID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKHhpbGlueF93ZHRfd2RkKTsKIAlpZiAocmMpIHsKLQkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKLQkJICAgICAgIHh3ZHRfbWlzY2Rldi5taW5vciwgcmMpOwotCQlnb3RvIHVubWFwX2lvOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgd2F0Y2hkb2cgKGVycj0lZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOwogCX0KIAotCWlmIChub190aW1lb3V0KQotCQlwcl9pbmZvKCJkcml2ZXIgbG9hZGVkICh0aW1lb3V0PT8gc2VjLCBub3dheW91dD0lZClcbiIsCi0JCQl4ZGV2Lm5vd2F5b3V0KTsKLQllbHNlCi0JCXByX2luZm8oImRyaXZlciBsb2FkZWQgKHRpbWVvdXQ9JWQgc2VjLCBub3dheW91dD0lZClcbiIsCi0JCQl0aW1lb3V0LCB4ZGV2Lm5vd2F5b3V0KTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiWGlsaW54IFdhdGNoZG9nIFRpbWVyIGF0ICVwIHdpdGggdGltZW91dCAlZHNcbiIsCisJCSB4ZGV2LT5iYXNlLCB4aWxpbnhfd2R0X3dkZC0+dGltZW91dCk7CiAKLQlleHBlY3RfY2xvc2UgPSAwOwotCWNsZWFyX2JpdCgwLCAmZHJpdmVyX29wZW4pOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHhkZXYpOwogCiAJcmV0dXJuIDA7Ci0KLXVubWFwX2lvOgotCWlvdW5tYXAoeGRldi5iYXNlKTsKLXJlbGVhc2VfbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbih4ZGV2LnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmeGRldi5yZXMpKTsKLWVycl9vdXQ6Ci0JcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHh3ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgeHdkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQltaXNjX2RlcmVnaXN0ZXIoJnh3ZHRfbWlzY2Rldik7Ci0JaW91bm1hcCh4ZGV2LmJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbih4ZGV2LnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmeGRldi5yZXMpKTsKKwlzdHJ1Y3QgeHdkdF9kZXZpY2UgKnhkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZ4ZGV2LT54aWxpbnhfd2R0X3dkZCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvb21hcF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvb21hcF93ZHQuYwppbmRleCAwOWNmMDEzLi4zNjkxYjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9vbWFwX3dkdC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpAQCAtNTgsNyArNTcsNiBAQAogCXZvaWQgX19pb21lbSAgICAqYmFzZTsgICAgICAgICAgLyogcGh5c2ljYWwgKi8KIAlzdHJ1Y3QgZGV2aWNlICAgKmRldjsKIAlib29sCQlvbWFwX3dkdF91c2VyczsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAlpbnQJCXdkdF90cmdyX3BhdHRlcm47CiAJc3RydWN0IG11dGV4CWxvY2s7CQkvKiB0byBhdm9pZCByYWNlcyB3aXRoIFBNICovCiB9OwpAQCAtMjA3LDcgKzIwNSw3IEBACiB7CiAJc3RydWN0IG9tYXBfd2RfdGltZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKm9tYXBfd2R0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqbWVtOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXY7CiAJdTMyIHJzOwogCWludCByZXQ7CkBAIC0yMTYsMjkgKzIxNCwyMCBAQAogCWlmICghb21hcF93ZHQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogcmVzZXJ2ZSBzdGF0aWMgcmVnaXN0ZXIgbWFwcGluZ3MgKi8KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCW1lbSA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCi0JCQkJICAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKTsKLQlpZiAoIW1lbSkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCXdkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp3ZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF3ZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXdkZXYtPm9tYXBfd2R0X3VzZXJzCT0gZmFsc2U7Ci0Jd2Rldi0+bWVtCQk9IG1lbTsKIAl3ZGV2LT5kZXYJCT0gJnBkZXYtPmRldjsKIAl3ZGV2LT53ZHRfdHJncl9wYXR0ZXJuCT0gMHgxMjM0OwogCW11dGV4X2luaXQoJndkZXYtPmxvY2spOwogCi0Jd2Rldi0+YmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghd2Rldi0+YmFzZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJLyogcmVzZXJ2ZSBzdGF0aWMgcmVnaXN0ZXIgbWFwcGluZ3MgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXdkZXYtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHdkZXYtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih3ZGV2LT5iYXNlKTsKIAogCW9tYXBfd2R0LT5pbmZvCSAgICAgID0gJm9tYXBfd2R0X2luZm87CiAJb21hcF93ZHQtPm9wcwkgICAgICA9ICZvbWFwX3dkdF9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29yaW9uX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9vcmlvbl93ZHQuYwppbmRleCBmNzcyMmE0Li40OTgxNjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL29yaW9uX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb3Jpb25fd2R0LmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMKaW5kZXggNTIxMWQ1Ni4uOWYxNWRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9wYzg3NDEzX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYwpAQCAtNTEyLDkgKzUxMiw4IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjODc0MTNfbm90aWZpZXIpOwotCWlmIChyZXQgIT0gMCkgeworCWlmIChyZXQgIT0gMCkKIAkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLCByZXQpOwotCX0KIAogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnBjODc0MTNfbWlzY2Rldik7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC01NzUsOCArNTc0LDggQEAKIG1vZHVsZV9pbml0KHBjODc0MTNfaW5pdCk7CiBtb2R1bGVfZXhpdChwYzg3NDEzX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+LCAiCi0JCSJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4sIik7CitNT0RVTEVfQVVUSE9SKCJTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUEM4NzQxMyBXRFQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYwppbmRleCBlNTYyZTA0Li4xYTExYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfdXNiLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9wY3dkX3VzYi5jCkBAIC02NDUsMTAgKzY0NSw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KIAl1c2JfcGN3ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfcGN3ZF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVzYl9wY3dkID09IE5VTEwpIHsKLQkJcHJfZXJyKCJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAodXNiX3Bjd2QgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQl9CiAKIAl1c2JfcGN3ZF9kZXZpY2UgPSB1c2JfcGN3ZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9wbng0MDA4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9wbng0MDA4X3dkdC5jCmluZGV4IDViZWMyMGYuLjE1ZmIzMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcG54NDAwOF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3BueDQwMDhfd2R0LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3JkYzMyMXhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3JkYzMyMXhfd2R0LmMKaW5kZXggMDgyZDA2Mi4uMjljZjRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9yZGMzMjF4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcmRjMzIxeF93ZHQuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9yZXR1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9yZXR1X3dkdC5jCmluZGV4IGY1MzYxNWQuLmE3YTA2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcmV0dV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3JldHVfd2R0LmMKQEAgLTE2LDcgKzE2LDYgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcmlvd2QuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcmlvd2QuYwppbmRleCAzZGQ4ZWQyLi5jZmVkMGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKaW5kZXggYWVjOTQ2ZC4uN2M2Y2NkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KQEAgLTUyNiw3ICs1MjUsMTEgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JY2xrX3ByZXBhcmVfZW5hYmxlKHdkdC0+Y2xvY2spOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh3ZHQtPmNsb2NrKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgY2xvY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXJldCA9IHMzYzI0MTB3ZHRfY3B1ZnJlcV9yZWdpc3Rlcih3ZHQpOwogCWlmIChyZXQgPCAwKSB7CkBAIC02MDgsNyArNjExLDYgQEAKIAogIGVycl9jbGs6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHdkdC0+Y2xvY2spOwotCXdkdC0+Y2xvY2sgPSBOVUxMOwogCiAgZXJyOgogCXJldHVybiByZXQ7CkBAIC02MjgsNyArNjMwLDYgQEAKIAlzM2MyNDEwd2R0X2NwdWZyZXFfZGVyZWdpc3Rlcih3ZHQpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHdkdC0+Y2xvY2spOwotCXdkdC0+Y2xvY2sgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NjNTIwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zYzUyMF93ZHQuYwppbmRleCBmMzUzZTE4Li4xY2ZkM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NjNTIwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2M1MjBfd2R0LmMKQEAgLTE1OCwxMiArMTU4LDExIEBACiAKIHN0YXRpYyB2b2lkIHdkdF9jb25maWcoaW50IHdyaXRldmFsKQogewotCV9fdTE2IGR1bW15OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBidXkgc29tZSB0aW1lIChwaW5nKSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHRfc3BpbmxvY2ssIGZsYWdzKTsKLQlkdW1teSA9IHJlYWR3KHdkdG1yY3RsKTsJLyogZW5zdXJlIHdyaXRlIHN5bmNocm9uaXphdGlvbiAqLworCXJlYWR3KHdkdG1yY3RsKTsJLyogZW5zdXJlIHdyaXRlIHN5bmNocm9uaXphdGlvbiAqLwogCXdyaXRldygweEFBQUEsIHdkdG1yY3RsKTsKIAl3cml0ZXcoMHg1NTU1LCB3ZHRtcmN0bCk7CiAJLyogdW5sb2NrIFdEVCA9IG1ha2UgV0RUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgd3JpdGFibGUgb25lIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYwppbmRleCBhZjM1MjhmLi5kMDRkMDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Nod2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zaHdkdC5jCkBAIC0yOTMsOCArMjkzLDYgQEAKIAogc3RhdGljIGludCBzaF93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHNoX3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KIAl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmc2hfd2R0X2Rldik7CiAKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NvZnRkb2cuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc29mdGRvZy5jCmluZGV4IGMwNGExYWEuLjBkYzVlMzIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zb2Z0ZG9nLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zb2Z0ZG9nLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAkJIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD0iCiAJCQkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOwogCi1zdGF0aWMgaW50IHNvZnRfbm9ib290ID0gMDsKK3N0YXRpYyBpbnQgc29mdF9ub2Jvb3Q7CiBtb2R1bGVfcGFyYW0oc29mdF9ub2Jvb3QsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNvZnRfbm9ib290LAogCSJTb2Z0ZG9nIGFjdGlvbiwgc2V0IHRvIDEgdG8gaWdub3JlIHJlYm9vdHMsIDAgdG8gcmVib290IChkZWZhdWx0PTApIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYwppbmRleCAzZjc4NmNlLi40NzYyOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3A4MDVfd2R0LmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjA5LDI3ICsyMDgsMTUgQEAKIAlzdHJ1Y3Qgc3A4MDVfd2R0ICp3ZHQ7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZhZGV2LT5kZXYsIGFkZXYtPnJlcy5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKCZhZGV2LT5yZXMpLCAic3A4MDVfd2R0IikpIHsKLQkJZGV2X3dhcm4oJmFkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvbiByZXNvdXJjZVxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyOwotCX0KLQogCXdkdCA9IGRldm1fa3phbGxvYygmYWRldi0+ZGV2LCBzaXplb2YoKndkdCksIEdGUF9LRVJORUwpOwogCWlmICghd2R0KSB7Ci0JCWRldl93YXJuKCZhZGV2LT5kZXYsICJLemFsbG9jIGZhaWxlZFxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KIAotCXdkdC0+YmFzZSA9IGRldm1faW9yZW1hcCgmYWRldi0+ZGV2LCBhZGV2LT5yZXMuc3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKCZhZGV2LT5yZXMpKTsKLQlpZiAoIXdkdC0+YmFzZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlkZXZfd2FybigmYWRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsXG4iKTsKLQkJZ290byBlcnI7Ci0JfQorCXdkdC0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmYWRldi0+ZGV2LCAmYWRldi0+cmVzKTsKKwlpZiAoSVNfRVJSKHdkdC0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHdkdC0+YmFzZSk7CiAKIAl3ZHQtPmNsayA9IGRldm1fY2xrX2dldCgmYWRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHdkdC0+Y2xrKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zdG1wM3h4eF9ydGNfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3J0Y193ZHQuYwppbmRleCBiYjY0YWUzLi4zODA0ZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3J0Y193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3J0Y193ZHQuYwpAQCAtOSw3ICs5LDYgQEAKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zdW54aV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3VueGlfd2R0LmMKaW5kZXggNzYzMzJkOC4uY2QwMGE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zdW54aV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3N1bnhpX3dkdC5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VueGlfd2R0X2R0X2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLXdkdCIgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtd2R0IiB9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bnhpX3dkdF9kdF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy90ZWdyYV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvdGVncmFfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwZTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvdGVncmFfd2R0LmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE5WSURJQSBDT1JQT1JBVElPTi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKworLyogbWluaW11bSBhbmQgbWF4aW11bSB3YXRjaGRvZyB0cmlnZ2VyIHRpbWVvdXQsIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgTUlOX1dEVF9USU1FT1VUCQkJMQorI2RlZmluZSBNQVhfV0RUX1RJTUVPVVQJCQkyNTUKKworLyoKKyAqIEJhc2Ugb2YgdGhlIFdEVCByZWdpc3RlcnMsIGZyb20gdGhlIHRpbWVyIGJhc2UgYWRkcmVzcy4gIFRoZXJlIGFyZQorICogYWN0dWFsbHkgNSB3YXRjaGRvZ3MgdGhhdCBjYW4gYmUgY29uZmlndXJlZCAoYnkgcGFpcmluZyB3aXRoIGFuIGF2YWlsYWJsZQorICogdGltZXIpLCBhdCBiYXNlcyAweDEwMCArIChXRFQgSUQpICogMHgyMCwgd2hlcmUgV0RUIElEIGlzIDAgdGhyb3VnaCA0LgorICogVGhpcyBkcml2ZXIgb25seSBjb25maWd1cmVzIHRoZSBmaXJzdCB3YXRjaGRvZyAoV0RUIElEIDApLgorICovCisjZGVmaW5lIFdEVF9CQVNFCQkJMHgxMDAKKyNkZWZpbmUgV0RUX0lECQkJCTAKKworLyoKKyAqIFJlZ2lzdGVyIGJhc2Ugb2YgdGhlIHRpbWVyIHRoYXQncyBzZWxlY3RlZCBmb3IgcGFpcmluZyB3aXRoIHRoZSB3YXRjaGRvZy4KKyAqIFRoaXMgZHJpdmVyIGFyYml0cmFyaWx5IHVzZXMgdGltZXIgNSwgd2hpY2ggaXMgY3VycmVudGx5IHVudXNlZCBieQorICogb3RoZXIgZHJpdmVycyAoaW4gcGFydGljdWxhciwgdGhlIFRlZ3JhIGNsb2Nrc291cmNlIGRyaXZlcikuICBJZiB0aGlzCisgKiBuZWVkcyB0byBjaGFuZ2UsIHRha2UgY2FyZSB0aGF0IHRoZSBuZXcgdGltZXIgaXMgbm90IHVzZWQgYnkgdGhlCisgKiBjbG9ja3NvdXJjZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgV0RUX1RJTUVSX0JBU0UJCQkweDYwCisjZGVmaW5lIFdEVF9USU1FUl9JRAkJCTUKKworLyogV0RUIHJlZ2lzdGVycyAqLworI2RlZmluZSBXRFRfQ0ZHCQkJCTB4MAorI2RlZmluZSBXRFRfQ0ZHX1BFUklPRF9TSElGVAkJNAorI2RlZmluZSBXRFRfQ0ZHX1BFUklPRF9NQVNLCQkweGZmCisjZGVmaW5lIFdEVF9DRkdfSU5UX0VOCQkJKDEgPDwgMTIpCisjZGVmaW5lIFdEVF9DRkdfUE1DMkNBUl9SU1RfRU4JCSgxIDw8IDE1KQorI2RlZmluZSBXRFRfU1RTCQkJCTB4NAorI2RlZmluZSBXRFRfU1RTX0NPVU5UX1NISUZUCQk0CisjZGVmaW5lIFdEVF9TVFNfQ09VTlRfTUFTSwkJMHhmZgorI2RlZmluZSBXRFRfU1RTX0VYUF9TSElGVAkJMTIKKyNkZWZpbmUgV0RUX1NUU19FWFBfTUFTSwkJMHgzCisjZGVmaW5lIFdEVF9DTUQJCQkJMHg4CisjZGVmaW5lIFdEVF9DTURfU1RBUlRfQ09VTlRFUgkJKDEgPDwgMCkKKyNkZWZpbmUgV0RUX0NNRF9ESVNBQkxFX0NPVU5URVIJCSgxIDw8IDEpCisjZGVmaW5lIFdEVF9VTkxPQ0sJCQkoMHhjKQorI2RlZmluZSBXRFRfVU5MT0NLX1BBVFRFUk4JCSgweGM0NWEgPDwgMCkKKworLyogVGltZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTUVSX1BUVgkJCTB4MAorI2RlZmluZSBUSU1FUl9FTgkJCSgxIDw8IDMxKQorI2RlZmluZSBUSU1FUl9QRVJJT0RJQwkJCSgxIDw8IDMwKQorCitzdHJ1Y3QgdGVncmFfd2R0IHsKKwlzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlCXdkZDsKKwl2b2lkIF9faW9tZW0JCSp3ZHRfcmVnczsKKwl2b2lkIF9faW9tZW0JCSp0bXJfcmVnczsKK307CisKKyNkZWZpbmUgV0RUX0hFQVJUQkVBVCAxMjAKK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0RUX0hFQVJUQkVBVDsKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwKKwkiV2F0Y2hkb2cgaGVhcnRiZWF0cyBpbiBzZWNvbmRzLiAoZGVmYXVsdCA9ICIKKwlfX01PRFVMRV9TVFJJTkcoV0RUX0hFQVJUQkVBVCkgIikiKTsKKworc3RhdGljIGJvb2wgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LAorCSJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IgorCV9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKKworc3RhdGljIGludCB0ZWdyYV93ZHRfc3RhcnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXN0cnVjdCB0ZWdyYV93ZHQgKndkdCA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7CisJdTMyIHZhbDsKKworCS8qCisJICogVGhpcyB0aGluZyBoYXMgYSBmaXhlZCAxTUh6IGNsb2NrLiAgTm9ybWFsbHksIHdlIHdvdWxkIHNldCB0aGUKKwkgKiBwZXJpb2QgdG8gMSBzZWNvbmQgYnkgd3JpdGluZyAxMDAwMDAwdWwsIGJ1dCB0aGUgd2F0Y2hkb2cgc3lzdGVtCisJICogcmVzZXQgYWN0dWFsbHkgb2NjdXJzIG9uIHRoZSA0dGggZXhwaXJhdGlvbiBvZiB0aGlzIGNvdW50ZXIsCisJICogc28gd2Ugc2V0IHRoZSBwZXJpb2QgdG8gMS80IG9mIHRoaXMgYW1vdW50LgorCSAqLworCXZhbCA9IDEwMDAwMDB1bCAvIDQ7CisJdmFsIHw9IChUSU1FUl9FTiB8IFRJTUVSX1BFUklPRElDKTsKKwl3cml0ZWwodmFsLCB3ZHQtPnRtcl9yZWdzICsgVElNRVJfUFRWKTsKKworCS8qCisJICogU2V0IG51bWJlciBvZiBwZXJpb2RzIGFuZCBzdGFydCBjb3VudGVyLgorCSAqCisJICogSW50ZXJydXB0IGhhbmRsZXIgaXMgbm90IHJlcXVpcmVkIGZvciB1c2VyIHNwYWNlCisJICogV0RUIGFjY2Vzc2VzLCBzaW5jZSB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIHBpbmcgdGhlCisJICogV0RUIHRvIHJlc2V0IHRoZSBjb3VudGVyIGJlZm9yZSBleHBpcmF0aW9uLCB0aHJvdWdoIGlvY3Rscy4KKwkgKi8KKwl2YWwgPSBXRFRfVElNRVJfSUQgfAorCSAgICAgICh3ZGQtPnRpbWVvdXQgPDwgV0RUX0NGR19QRVJJT0RfU0hJRlQpIHwKKwkgICAgICBXRFRfQ0ZHX1BNQzJDQVJfUlNUX0VOOworCXdyaXRlbCh2YWwsIHdkdC0+d2R0X3JlZ3MgKyBXRFRfQ0ZHKTsKKworCXdyaXRlbChXRFRfQ01EX1NUQVJUX0NPVU5URVIsIHdkdC0+d2R0X3JlZ3MgKyBXRFRfQ01EKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOworCisJd3JpdGVsKFdEVF9VTkxPQ0tfUEFUVEVSTiwgd2R0LT53ZHRfcmVncyArIFdEVF9VTkxPQ0spOworCXdyaXRlbChXRFRfQ01EX0RJU0FCTEVfQ09VTlRFUiwgd2R0LT53ZHRfcmVncyArIFdEVF9DTUQpOworCXdyaXRlbCgwLCB3ZHQtPnRtcl9yZWdzICsgVElNRVJfUFRWKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9waW5nKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOworCisJd3JpdGVsKFdEVF9DTURfU1RBUlRfQ09VTlRFUiwgd2R0LT53ZHRfcmVncyArIFdEVF9DTUQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfd2R0X3NldF90aW1lb3V0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCwKKwkJCQkgdW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJd2RkLT50aW1lb3V0ID0gdGltZW91dDsKKworCWlmICh3YXRjaGRvZ19hY3RpdmUod2RkKSkKKwkJcmV0dXJuIHRlZ3JhX3dkdF9zdGFydCh3ZGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVncmFfd2R0X2dldF90aW1lbGVmdChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gd2F0Y2hkb2dfZ2V0X2RydmRhdGEod2RkKTsKKwl1MzIgdmFsOworCWludCBjb3VudDsKKwlpbnQgZXhwOworCisJdmFsID0gcmVhZGwod2R0LT53ZHRfcmVncyArIFdEVF9TVFMpOworCisJLyogQ3VycmVudCBjb3VudGRvd24gKGZyb20gdGltZW91dCkgKi8KKwljb3VudCA9ICh2YWwgPj4gV0RUX1NUU19DT1VOVF9TSElGVCkgJiBXRFRfU1RTX0NPVU5UX01BU0s7CisKKwkvKiBOdW1iZXIgb2YgZXhwaXJhdGlvbnMgKHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgNHRoIGV4cGlyYXRpb24pICovCisJZXhwID0gKHZhbCA+PiBXRFRfU1RTX0VYUF9TSElGVCkgJiBXRFRfU1RTX0VYUF9NQVNLOworCisJLyoKKwkgKiBUaGUgZW50aXJlIHRoaW5nIGlzIGRpdmlkZWQgYnkgNCBiZWNhdXNlIHdlIGFyZSB0aWNraW5nIGRvd24gNCB0aW1lcworCSAqIGZhc3RlciBkdWUgdG8gbmVlZGluZyB0byB3YWl0IGZvciB0aGUgNHRoIGV4cGlyYXRpb24uCisJICovCisJcmV0dXJuICgoKDMgLSBleHApICogd2RkLT50aW1lb3V0KSArIGNvdW50KSAvIDQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB0ZWdyYV93ZHRfaW5mbyA9IHsKKwkub3B0aW9ucwk9IFdESU9GX1NFVFRJTUVPVVQgfAorCQkJICBXRElPRl9NQUdJQ0NMT1NFIHwKKwkJCSAgV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuZmlybXdhcmVfdmVyc2lvbiA9IDAsCisJLmlkZW50aXR5CT0gIlRlZ3JhIFdhdGNoZG9nIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHRlZ3JhX3dkdF9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnN0YXJ0ID0gdGVncmFfd2R0X3N0YXJ0LAorCS5zdG9wID0gdGVncmFfd2R0X3N0b3AsCisJLnBpbmcgPSB0ZWdyYV93ZHRfcGluZywKKwkuc2V0X3RpbWVvdXQgPSB0ZWdyYV93ZHRfc2V0X3RpbWVvdXQsCisJLmdldF90aW1lbGVmdCA9IHRlZ3JhX3dkdF9nZXRfdGltZWxlZnQsCit9OworCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZDsKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCWludCByZXQ7CisKKwkvKiBUaGlzIGlzIHRoZSB0aW1lciBiYXNlLiAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIocmVncykpCisJCXJldHVybiBQVFJfRVJSKHJlZ3MpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBvdXIgd2F0Y2hkb2cgZHJpdmVyIGRhdGEsIHdoaWNoIGhhcyB0aGUKKwkgKiBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIG5lc3RlZCB3aXRoaW4gaXQuCisJICovCisJd2R0ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqd2R0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZHQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdGlhbGl6ZSBzdHJ1Y3QgdGVncmFfd2R0LiAqLworCXdkdC0+d2R0X3JlZ3MgPSByZWdzICsgV0RUX0JBU0U7CisJd2R0LT50bXJfcmVncyA9IHJlZ3MgKyBXRFRfVElNRVJfQkFTRTsKKworCS8qIEluaXRpYWxpemUgc3RydWN0IHdhdGNoZG9nX2RldmljZS4gKi8KKwl3ZGQgPSAmd2R0LT53ZGQ7CisJd2RkLT50aW1lb3V0ID0gaGVhcnRiZWF0OworCXdkZC0+aW5mbyA9ICZ0ZWdyYV93ZHRfaW5mbzsKKwl3ZGQtPm9wcyA9ICZ0ZWdyYV93ZHRfb3BzOworCXdkZC0+bWluX3RpbWVvdXQgPSBNSU5fV0RUX1RJTUVPVVQ7CisJd2RkLT5tYXhfdGltZW91dCA9IE1BWF9XRFRfVElNRU9VVDsKKworCXdhdGNoZG9nX3NldF9kcnZkYXRhKHdkZCwgd2R0KTsKKworCXdhdGNoZG9nX3NldF9ub3dheW91dCh3ZGQsIG5vd2F5b3V0KTsKKworCXJldCA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSh3ZGQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byByZWdpc3RlciB3YXRjaGRvZyBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdkdCk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkgImluaXRpYWxpemVkIChoZWFydGJlYXQgPSAlZCBzZWMsIG5vd2F5b3V0ID0gJWQpXG4iLAorCQkgaGVhcnRiZWF0LCBub3dheW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl0ZWdyYV93ZHRfc3RvcCgmd2R0LT53ZGQpOworCisJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJndkdC0+d2RkKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJyZW1vdmVkIHdkdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB0ZWdyYV93ZHRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVncmFfd2R0ICp3ZHQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICh3YXRjaGRvZ19hY3RpdmUoJndkdC0+d2RkKSkKKwkJdGVncmFfd2R0X3N0b3AoJndkdC0+d2RkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3dkdF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRlZ3JhX3dkdCAqd2R0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAod2F0Y2hkb2dfYWN0aXZlKCZ3ZHQtPndkZCkpCisJCXRlZ3JhX3dkdF9zdGFydCgmd2R0LT53ZGQpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfd2R0X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEzMC10aW1lciIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhX3dkdF9vZl9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0ZWdyYV93ZHRfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHRlZ3JhX3dkdF9ydW50aW1lX3N1c3BlbmQsCisJCQkJdGVncmFfd2R0X3J1bnRpbWVfcmVzdW1lKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfd2R0X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdGVncmFfd2R0X3Byb2JlLAorCS5yZW1vdmUJCT0gdGVncmFfd2R0X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gInRlZ3JhLXdkdCIsCisJCS5wbQk9ICZ0ZWdyYV93ZHRfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV93ZHRfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRlZ3JhX3dkdF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJOVklESUEgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGVncmEgV2F0Y2hkb2cgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3RzNzJ4eF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvdHM3Mnh4X3dkdC5jCmluZGV4IDA5ZDQ4MzEuLmFmYTlkNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvdHM3Mnh4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvdHM3Mnh4X3dkdC5jCkBAIC02MSw3ICs2MSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIH07CiAKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRzNzJ4eF93ZHRfcGRldjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0czcyeHhfd2R0X3BkZXY7CiAKIC8qCiAgKiBUUy03Mnh4IFdhdGNoZG9nIHN1cHBvcnRzIGZvbGxvd2luZyB0aW1lb3V0cyAodmFsdWUgd3JpdHRlbgpAQCAtMzk0LDEwICszOTQsOCBAQAogCWludCBlcnJvciA9IDA7CiAKIAl3ZHQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB0czcyeHhfd2R0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZHQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJaWYgKCF3ZHQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXIxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAl3ZHQtPmNvbnRyb2xfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHIxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jCmluZGV4IDY4YjQ1ZmMuLmU5ZWE4NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ODM2OTdoZl93ZHQuYwpAQCAtNDU1LDYgKzQ1NSw2IEBACiBtb2R1bGVfZXhpdCh3ZHRfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hcmN1cyBKdW5rZXIgPGp1bmtlckBhbmR1cmFzLmRlPiwgIgotCQkiU2FtdWVsIFRhcmRpZXUgPHNhbUByZmMxMTQ5Lm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIk1hcmN1cyBKdW5rZXIgPGp1bmtlckBhbmR1cmFzLmRlPiIpOworTU9EVUxFX0FVVEhPUigiU2FtdWVsIFRhcmRpZXUgPHNhbUByZmMxMTQ5Lm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigidzgzNjk3aGYvaGcgV0RUIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ZHQyODUuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMKaW5kZXggNzM1NWRkZDAuLmViYmIxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ZHQyODUuYwpAQCAtMTM5LDkgKzEzOSw4IEBACiBzdGF0aWMgbG9uZyB3YXRjaGRvZ19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXVuc2lnbmVkIGludCBuZXdfbWFyZ2luOwogCWludCBfX3VzZXIgKmludF9hcmcgPSAoaW50IF9fdXNlciAqKWFyZzsKLQlpbnQgcmV0ID0gLUVOT1RUWTsKKwlpbnQgbmV3X21hcmdpbiwgcmV0ID0gLUVOT1RUWTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdF9wY2kuYwppbmRleCAzZGM1NzhlLi40OGIyYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3dkdF9wY2kuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdF9wY2kuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYwppbmRleCBlMjQzYmQwLi4yZmExN2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYwpAQCAtMjA0LDcgKzIwNCw2IEBACiAJZHJpdmVyX2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkcml2ZXJfZGF0YSksCiAJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcml2ZXJfZGF0YSkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9hY2F0ZSB3YXRjaGRvZyBkZXZpY2VcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMgYi9kcml2ZXJzL3hlbi9iYWxsb29uLmMKaW5kZXggMzdkMDZlYS4uNjFhNmFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwpAQCAtMzk5LDEyICszOTksMjYgQEAKIAkJCXN0YXRlID0gQlBfRUFHQUlOOwogCQkJYnJlYWs7CiAJCX0KLQotCQlwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKLQkJZnJhbWVfbGlzdFtpXSA9IHBmbl90b19tZm4ocGZuKTsKLQogCQlzY3J1Yl9wYWdlKHBhZ2UpOwogCisJCWZyYW1lX2xpc3RbaV0gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwl9CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IGJhbGxvb25lZCBoaWdobWVtIHBhZ2VzIGRvbid0IGhhdmUga21hcHMuCisJICoKKwkgKiBEbyB0aGlzIGJlZm9yZSBjaGFuZ2luZyB0aGUgcDJtIGFzIGttYXBfZmx1c2hfdW51c2VkKCkKKwkgKiByZWFkcyBQVEVzIHRvIG9idGFpbiBwYWdlcyAoYW5kIGhlbmNlIG5lZWRzIHRoZSBvcmlnaW5hbAorCSAqIHAybSBlbnRyeSkuCisJICovCisJa21hcF9mbHVzaF91bnVzZWQoKTsKKworCS8qIFVwZGF0ZSBkaXJlY3QgbWFwcGluZywgaW52YWxpZGF0ZSBQMk0sIGFuZCBhZGQgdG8gYmFsbG9vbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlwZm4gPSBmcmFtZV9saXN0W2ldOworCQlmcmFtZV9saXN0W2ldID0gcGZuX3RvX21mbihwZm4pOworCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwogI2lmZGVmIENPTkZJR19YRU5fSEFWRV9QVk1NVQogCQkvKgogCQkgKiBCYWxsb29uZWQgb3V0IGZyYW1lcyBhcmUgZWZmZWN0aXZlbHkgcmVwbGFjZWQgd2l0aApAQCAtNDI5LDExICs0NDMsOSBAQAogCQl9CiAjZW5kaWYKIAotCQliYWxsb29uX2FwcGVuZChwZm5fdG9fcGFnZShwZm4pKTsKKwkJYmFsbG9vbl9hcHBlbmQocGFnZSk7CiAJfQogCi0JLyogRW5zdXJlIHRoYXQgYmFsbG9vbmVkIGhpZ2htZW0gcGFnZXMgZG9uJ3QgaGF2ZSBrbWFwcy4gKi8KLQlrbWFwX2ZsdXNoX3VudXNlZCgpOwogCWZsdXNoX3RsYl9hbGwoKTsKIAogCXNldF94ZW5fZ3Vlc3RfaGFuZGxlKHJlc2VydmF0aW9uLmV4dGVudF9zdGFydCwgZnJhbWVfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzXzJsLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzXzJsLmMKaW5kZXggZDdmZjkxNy4uNWRiNDNmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c18ybC5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfMmwuYwpAQCAtMTY2LDcgKzE2Niw2IEBACiAJaW50IHN0YXJ0X3dvcmRfaWR4LCBzdGFydF9iaXRfaWR4OwogCWludCB3b3JkX2lkeCwgYml0X2lkeDsKIAlpbnQgaTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJc3RydWN0IHNoYXJlZF9pbmZvICpzID0gSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKIAlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1X2luZm8gPSBfX3RoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpOwogCkBAIC0xNzYsMTEgKzE3NSw4IEBACiAJCXVuc2lnbmVkIGludCBldnRjaG4gPSBldnRjaG5fZnJvbV9pcnEoaXJxKTsKIAkJd29yZF9pZHggPSBldnRjaG4gLyBCSVRTX1BFUl9MT05HOwogCQliaXRfaWR4ID0gZXZ0Y2huICUgQklUU19QRVJfTE9ORzsKLQkJaWYgKGFjdGl2ZV9ldnRjaG5zKGNwdSwgcywgd29yZF9pZHgpICYgKDFVTEwgPDwgYml0X2lkeCkpIHsKLQkJCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCQkJaWYgKGRlc2MpCi0JCQkJZ2VuZXJpY19oYW5kbGVfaXJxX2Rlc2MoaXJxLCBkZXNjKTsKLQkJfQorCQlpZiAoYWN0aXZlX2V2dGNobnMoY3B1LCBzLCB3b3JkX2lkeCkgJiAoMVVMTCA8PCBiaXRfaWR4KSkKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCX0KIAogCS8qCkBAIC0yNDUsMTEgKzI0MSw4IEBACiAJCQlwb3J0ID0gKHdvcmRfaWR4ICogQklUU19QRVJfRVZUQ0hOX1dPUkQpICsgYml0X2lkeDsKIAkJCWlycSA9IGdldF9ldnRjaG5fdG9faXJxKHBvcnQpOwogCi0JCQlpZiAoaXJxICE9IC0xKSB7Ci0JCQkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0JCQkJaWYgKGRlc2MpCi0JCQkJCWdlbmVyaWNfaGFuZGxlX2lycV9kZXNjKGlycSwgZGVzYyk7Ci0JCQl9CisJCQlpZiAoaXJxICE9IC0xKQorCQkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCiAJCQliaXRfaWR4ID0gKGJpdF9pZHggKyAxKSAlIEJJVFNfUEVSX0VWVENITl9XT1JEOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2Jhc2UuYyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCmluZGV4IGY0YTllMzMuLmMzNDU4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCkBAIC0zMzYsOSArMzM2LDggQEAKIAogCUJVR19PTihpcnEgPT0gLTEpOwogI2lmZGVmIENPTkZJR19TTVAKLQljcHVtYXNrX2NvcHkoaXJxX3RvX2Rlc2MoaXJxKS0+aXJxX2RhdGEuYWZmaW5pdHksIGNwdW1hc2tfb2YoY3B1KSk7CisJY3B1bWFza19jb3B5KGlycV9nZXRfaXJxX2RhdGEoaXJxKS0+YWZmaW5pdHksIGNwdW1hc2tfb2YoY3B1KSk7CiAjZW5kaWYKLQogCXhlbl9ldnRjaG5fcG9ydF9iaW5kX3RvX2NwdShpbmZvLCBjcHUpOwogCiAJaW5mby0+Y3B1ID0gY3B1OwpAQCAtMzczLDEwICszNzIsOCBAQAogewogCXN0cnVjdCBpcnFfaW5mbyAqaW5mbzsKICNpZmRlZiBDT05GSUdfU01QCi0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQogCS8qIEJ5IGRlZmF1bHQgYWxsIGV2ZW50IGNoYW5uZWxzIG5vdGlmeSBDUFUjMC4gKi8KLQljcHVtYXNrX2NvcHkoZGVzYy0+aXJxX2RhdGEuYWZmaW5pdHksIGNwdW1hc2tfb2YoMCkpOworCWNwdW1hc2tfY29weShpcnFfZ2V0X2lycV9kYXRhKGlycSktPmFmZmluaXR5LCBjcHVtYXNrX29mKDApKTsKICNlbmRpZgogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CkBAIC00OTAsMTMgKzQ4Nyw2IEBACiAJCWluZm8tPnUucGlycS5mbGFncyB8PSBQSVJRX05FRURTX0VPSTsKIH0KIAotc3RhdGljIGJvb2wgcHJvYmluZ19pcnEoaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCi0JcmV0dXJuIGRlc2MgJiYgZGVzYy0+YWN0aW9uID09IE5VTEw7Ci19Ci0KIHN0YXRpYyB2b2lkIGVvaV9waXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKIAlpbnQgZXZ0Y2huID0gZXZ0Y2huX2Zyb21faXJxKGRhdGEtPmlycSk7CkBAIC01MzgsOCArNTI4LDcgQEAKIAkJCQkJQklORF9QSVJRX19XSUxMX1NIQVJFIDogMDsKIAlyYyA9IEhZUEVSVklTT1JfZXZlbnRfY2hhbm5lbF9vcChFVlRDSE5PUF9iaW5kX3BpcnEsICZiaW5kX3BpcnEpOwogCWlmIChyYyAhPSAwKSB7Ci0JCWlmICghcHJvYmluZ19pcnEoaXJxKSkKLQkJCXByX2luZm8oIkZhaWxlZCB0byBvYnRhaW4gcGh5c2ljYWwgSVJRICVkXG4iLCBpcnEpOworCQlwcl93YXJuKCJGYWlsZWQgdG8gb2J0YWluIHBoeXNpY2FsIElSUSAlZFxuIiwgaXJxKTsKIAkJcmV0dXJuIDA7CiAJfQogCWV2dGNobiA9IGJpbmRfcGlycS5wb3J0OwpAQCAtNzcyLDE3ICs3NjEsMTIgQEAKIAogaW50IHhlbl9kZXN0cm95X2lycShpbnQgaXJxKQogewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgcGh5c2Rldl91bm1hcF9waXJxIHVubWFwX2lycTsKIAlzdHJ1Y3QgaXJxX2luZm8gKmluZm8gPSBpbmZvX2Zvcl9pcnEoaXJxKTsKIAlpbnQgcmMgPSAtRU5PRU5UOwogCiAJbXV0ZXhfbG9jaygmaXJxX21hcHBpbmdfdXBkYXRlX2xvY2spOwogCi0JZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0JaWYgKCFkZXNjKQotCQlnb3RvIG91dDsKLQogCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSkgewogCQl1bm1hcF9pcnEucGlycSA9IGluZm8tPnUucGlycS5waXJxOwogCQl1bm1hcF9pcnEuZG9taWQgPSBpbmZvLT51LnBpcnEuZG9taWQ7CkBAIC0xMjUxLDYgKzEyMzUsNyBAQAogI2lmZGVmIENPTkZJR19YODYKIAlleGl0X2lkbGUoKTsKICNlbmRpZgorCWluY19pcnFfc3RhdChpcnFfaHZfY2FsbGJhY2tfY291bnQpOwogCiAJX194ZW5fZXZ0Y2huX2RvX3VwY2FsbCgpOwogCkBAIC0xMzM5LDcgKzEzMjQsNyBAQAogc3RhdGljIGludCBzZXRfYWZmaW5pdHlfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QsCiAJCQkgICAgYm9vbCBmb3JjZSkKIHsKLQl1bnNpZ25lZCB0Y3B1ID0gY3B1bWFza19maXJzdChkZXN0KTsKKwl1bnNpZ25lZCB0Y3B1ID0gY3B1bWFza19maXJzdF9hbmQoZGVzdCwgY3B1X29ubGluZV9tYXNrKTsKIAogCXJldHVybiByZWJpbmRfaXJxX3RvX2NwdShkYXRhLT5pcnEsIHRjcHUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c19maWZvLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYwppbmRleCAxZGUyYTE5Li45NjEwOWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYwpAQCAtMjM1LDE0ICsyMzUsMTAgQEAKIHN0YXRpYyB2b2lkIGhhbmRsZV9pcnFfZm9yX3BvcnQodW5zaWduZWQgcG9ydCkKIHsKIAlpbnQgaXJxOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAogCWlycSA9IGdldF9ldnRjaG5fdG9faXJxKHBvcnQpOwotCWlmIChpcnEgIT0gLTEpIHsKLQkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7Ci0JCWlmIChkZXNjKQotCQkJZ2VuZXJpY19oYW5kbGVfaXJxX2Rlc2MoaXJxLCBkZXNjKTsKLQl9CisJaWYgKGlycSAhPSAtMSkKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbnN1bWVfb25lX2V2ZW50KHVuc2lnbmVkIGNwdSwKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IDczODVlNTQuLjMxMjM5M2YgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtOTYsNiArOTYsNyBAQAogbWVudSAiUHNldWRvIGZpbGVzeXN0ZW1zIgogCiBzb3VyY2UgImZzL3Byb2MvS2NvbmZpZyIKK3NvdXJjZSAiZnMva2VybmZzL0tjb25maWciCiBzb3VyY2UgImZzL3N5c2ZzL0tjb25maWciCiAKIGNvbmZpZyBUTVBGUwpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA0N2FjMDdiLi5mOWNiOTg3IDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtNTIsNyArNTIsOCBAQAogb2JqLXkJCQkJKz0gcXVvdGEvCiAKIG9iai0kKENPTkZJR19QUk9DX0ZTKQkJKz0gcHJvYy8KLW9iai0kKENPTkZJR19TWVNGUykJCSs9IHN5c2ZzLyBrZXJuZnMvCitvYmotJChDT05GSUdfS0VSTkZTKQkJKz0ga2VybmZzLworb2JqLSQoQ09ORklHX1NZU0ZTKQkJKz0gc3lzZnMvCiBvYmotJChDT05GSUdfQ09ORklHRlNfRlMpCSs9IGNvbmZpZ2ZzLwogb2JqLXkJCQkJKz0gZGV2cHRzLwogCmRpZmYgLS1naXQgYS9mcy9hZnMvaW50ZXJuYWwuaCBiL2ZzL2Fmcy9pbnRlcm5hbC5oCmluZGV4IDY2MjFmODAuLmJlNzViNTAgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbnRlcm5hbC5oCisrKyBiL2ZzL2Fmcy9pbnRlcm5hbC5oCkBAIC03NSw2ICs3NSw3IEBACiAJY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGU7CS8qIHR5cGUgb2YgY2FsbCAqLwogCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGU7CS8qIGNvbXBsZXRpb24gd2FpdCBtb2RlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBwcm9jZXNzZXMgYXdhaXRpbmcgY29tcGxldGlvbiAqLworCXdvcmtfZnVuY190CQlhc3luY193b3JrZm47CiAJc3RydWN0IHdvcmtfc3RydWN0CWFzeW5jX3dvcms7CS8qIGFzeW5jaHJvbm91cyB3b3JrIHByb2Nlc3NvciAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwkJLyogYWN0dWFsIHdvcmsgcHJvY2Vzc29yICovCiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgcGFja2V0cyAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3J4cnBjLmMgYi9mcy9hZnMvcnhycGMuYwppbmRleCA4YWQ4YzJhLi5lZjk0M2RmIDEwMDY0NAotLS0gYS9mcy9hZnMvcnhycGMuYworKysgYi9mcy9hZnMvcnhycGMuYwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAKIAkJLyogd2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIGNhbGwgYmVjYXVzZSB0aGUgd29yayBpdGVtIG1heSBiZQogCQkgKiBxdWV1ZWQgKi8KLQkJUFJFUEFSRV9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfZGVsZXRlX2FzeW5jX2NhbGwpOworCQljYWxsLT5hc3luY193b3JrZm4gPSBhZnNfZGVsZXRlX2FzeW5jX2NhbGw7CiAJCXF1ZXVlX3dvcmsoYWZzX2FzeW5jX2NhbGxzLCAmY2FsbC0+YXN5bmNfd29yayk7CiAJfQogCkBAIC02NjMsNiArNjYzLDEzIEBACiAJY2FsbC0+cmVwbHlfc2l6ZSArPSBsZW47CiB9CiAKK3N0YXRpYyB2b2lkIGFmc19hc3luY193b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCisJY2FsbC0+YXN5bmNfd29ya2ZuKHdvcmspOworfQorCiAvKgogICogYWNjZXB0IHRoZSBiYWNrbG9nIG9mIGluY29taW5nIGNhbGxzCiAgKi8KQEAgLTY4NSw3ICs2OTIsOCBAQAogCQkJCXJldHVybjsKIAkJCX0KIAotCQkJSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKTsKKwkJCWNhbGwtPmFzeW5jX3dvcmtmbiA9IGFmc19wcm9jZXNzX2FzeW5jX2NhbGw7CisJCQlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19hc3luY193b3JrZm4pOwogCQkJY2FsbC0+d2FpdF9tb2RlID0gJmFmc19hc3luY19pbmNvbWluZ19jYWxsOwogCQkJY2FsbC0+dHlwZSA9ICZhZnNfUlhDTXh4eHg7CiAJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7CmRpZmYgLS1naXQgYS9mcy9hbm9uX2lub2Rlcy5jIGIvZnMvYW5vbl9pbm9kZXMuYwppbmRleCAyNDA4NDczLi44MGVmMzhjIDEwMDY0NAotLS0gYS9mcy9hbm9uX2lub2Rlcy5jCisrKyBiL2ZzL2Fub25faW5vZGVzLmMKQEAgLTQxLDE5ICs0MSw4IEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYW5vbl9pbm9kZWZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqcm9vdDsKLQlyb290ID0gbW91bnRfcHNldWRvKGZzX3R5cGUsICJhbm9uX2lub2RlOiIsIE5VTEwsCisJcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAiYW5vbl9pbm9kZToiLCBOVUxMLAogCQkJJmFub25faW5vZGVmc19kZW50cnlfb3BlcmF0aW9ucywgQU5PTl9JTk9ERV9GU19NQUdJQyk7Ci0JaWYgKCFJU19FUlIocm9vdCkpIHsKLQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gcm9vdC0+ZF9zYjsKLQkJYW5vbl9pbm9kZV9pbm9kZSA9IGFsbG9jX2Fub25faW5vZGUocyk7Ci0JCWlmIChJU19FUlIoYW5vbl9pbm9kZV9pbm9kZSkpIHsKLQkJCWRwdXQocm9vdCk7Ci0JCQlkZWFjdGl2YXRlX2xvY2tlZF9zdXBlcihzKTsKLQkJCXJvb3QgPSBFUlJfQ0FTVChhbm9uX2lub2RlX2lub2RlKTsKLQkJfQotCX0KLQlyZXR1cm4gcm9vdDsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGFub25faW5vZGVfZnNfdHlwZSA9IHsKQEAgLTE3NSwyMiArMTY0LDE1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFub25faW5vZGVfaW5pdCh2b2lkKQogewotCWludCBlcnJvcjsKLQotCWVycm9yID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmYW5vbl9pbm9kZV9mc190eXBlKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZXJyX2V4aXQ7CiAJYW5vbl9pbm9kZV9tbnQgPSBrZXJuX21vdW50KCZhbm9uX2lub2RlX2ZzX3R5cGUpOwotCWlmIChJU19FUlIoYW5vbl9pbm9kZV9tbnQpKSB7Ci0JCWVycm9yID0gUFRSX0VSUihhbm9uX2lub2RlX21udCk7Ci0JCWdvdG8gZXJyX3VucmVnaXN0ZXJfZmlsZXN5c3RlbTsKLQl9Ci0JcmV0dXJuIDA7CisJaWYgKElTX0VSUihhbm9uX2lub2RlX21udCkpCisJCXBhbmljKCJhbm9uX2lub2RlX2luaXQoKSBrZXJuZWwgbW91bnQgZmFpbGVkICglbGQpXG4iLCBQVFJfRVJSKGFub25faW5vZGVfbW50KSk7CiAKLWVycl91bnJlZ2lzdGVyX2ZpbGVzeXN0ZW06Ci0JdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZhbm9uX2lub2RlX2ZzX3R5cGUpOwotZXJyX2V4aXQ6Ci0JcGFuaWMoS0VSTl9FUlIgImFub25faW5vZGVfaW5pdCgpIGZhaWxlZCAoJWQpXG4iLCBlcnJvcik7CisJYW5vbl9pbm9kZV9pbm9kZSA9IGFsbG9jX2Fub25faW5vZGUoYW5vbl9pbm9kZV9tbnQtPm1udF9zYik7CisJaWYgKElTX0VSUihhbm9uX2lub2RlX2lub2RlKSkKKwkJcGFuaWMoImFub25faW5vZGVfaW5pdCgpIGlub2RlIGFsbG9jYXRpb24gZmFpbGVkICglbGQpXG4iLCBQVFJfRVJSKGFub25faW5vZGVfaW5vZGUpKTsKKworCXJldHVybiAwOwogfQogCiBmc19pbml0Y2FsbChhbm9uX2lub2RlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLWludGVncml0eS5jIGIvZnMvYmlvLWludGVncml0eS5jCmluZGV4IDRmNzBmMzguLjI5Njk2YjcgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby1pbnRlZ3JpdHkuYworKysgYi9mcy9iaW8taW50ZWdyaXR5LmMKQEAgLTMwMSwyNSArMzAxLDI1IEBACiBFWFBPUlRfU1lNQk9MKGJpb19pbnRlZ3JpdHlfZ2V0X3RhZyk7CiAKIC8qKgotICogYmlvX2ludGVncml0eV9nZW5lcmF0ZSAtIEdlbmVyYXRlIGludGVncml0eSBtZXRhZGF0YSBmb3IgYSBiaW8KLSAqIEBiaW86CWJpbyB0byBnZW5lcmF0ZSBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yCi0gKgotICogRGVzY3JpcHRpb246IEdlbmVyYXRlcyBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yIGEgYmlvIGJ5IGNhbGxpbmcgdGhlCi0gKiBibG9jayBkZXZpY2UncyBnZW5lcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLiAgVGhlIGJpbyBtdXN0IGhhdmUgYQotICogYmlwIGF0dGFjaGVkIHdpdGggZW5vdWdoIHJvb20gdG8gYWNjb21tb2RhdGUgdGhlIGdlbmVyYXRlZAotICogaW50ZWdyaXR5IG1ldGFkYXRhLgorICogYmlvX2ludGVncml0eV9nZW5lcmF0ZV92ZXJpZnkgLSBHZW5lcmF0ZS92ZXJpZnkgaW50ZWdyaXR5IG1ldGFkYXRhIGZvciBhIGJpbworICogQGJpbzoJYmlvIHRvIGdlbmVyYXRlL3ZlcmlmeSBpbnRlZ3JpdHkgbWV0YWRhdGEgZm9yCisgKiBAb3BlcmF0ZToJb3BlcmF0ZSBudW1iZXIsIDEgZm9yIGdlbmVyYXRlLCAwIGZvciB2ZXJpZnkKICAqLwotc3RhdGljIHZvaWQgYmlvX2ludGVncml0eV9nZW5lcmF0ZShzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW50IGJpb19pbnRlZ3JpdHlfZ2VuZXJhdGVfdmVyaWZ5KHN0cnVjdCBiaW8gKmJpbywgaW50IG9wZXJhdGUpCiB7CiAJc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpID0gYmRldl9nZXRfaW50ZWdyaXR5KGJpby0+YmlfYmRldik7CiAJc3RydWN0IGJsa19pbnRlZ3JpdHlfZXhjaGcgYml4OwogCXN0cnVjdCBiaW9fdmVjIGJ2OwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKLQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwotCXVuc2lnbmVkIGludCBzZWN0b3JzLCB0b3RhbDsKKwlzZWN0b3JfdCBzZWN0b3I7CisJdW5zaWduZWQgaW50IHNlY3RvcnMsIHJldCA9IDA7CiAJdm9pZCAqcHJvdF9idWYgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2J1ZjsKIAotCXRvdGFsID0gMDsKKwlpZiAob3BlcmF0ZSkKKwkJc2VjdG9yID0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcjsKKwllbHNlCisJCXNlY3RvciA9IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfaXRlci5iaV9zZWN0b3I7CisKIAliaXguZGlza19uYW1lID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWU7CiAJYml4LnNlY3Rvcl9zaXplID0gYmktPnNlY3Rvcl9zaXplOwogCkBAIC0zMzAsMTYgKzMzMCwzNyBAQAogCQliaXgucHJvdF9idWYgPSBwcm90X2J1ZjsKIAkJYml4LnNlY3RvciA9IHNlY3RvcjsKIAotCQliaS0+Z2VuZXJhdGVfZm4oJmJpeCk7CisJCWlmIChvcGVyYXRlKSB7CisJCQliaS0+Z2VuZXJhdGVfZm4oJmJpeCk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBiaS0+dmVyaWZ5X2ZuKCZiaXgpOworCQkJaWYgKHJldCkgeworCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KIAogCQlzZWN0b3JzID0gYnYuYnZfbGVuIC8gYmktPnNlY3Rvcl9zaXplOwogCQlzZWN0b3IgKz0gc2VjdG9yczsKIAkJcHJvdF9idWYgKz0gc2VjdG9ycyAqIGJpLT50dXBsZV9zaXplOwotCQl0b3RhbCArPSBzZWN0b3JzICogYmktPnR1cGxlX3NpemU7Ci0JCUJVR19PTih0b3RhbCA+IGJpby0+YmlfaW50ZWdyaXR5LT5iaXBfaXRlci5iaV9zaXplKTsKIAogCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKIAl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiaW9faW50ZWdyaXR5X2dlbmVyYXRlIC0gR2VuZXJhdGUgaW50ZWdyaXR5IG1ldGFkYXRhIGZvciBhIGJpbworICogQGJpbzoJYmlvIHRvIGdlbmVyYXRlIGludGVncml0eSBtZXRhZGF0YSBmb3IKKyAqCisgKiBEZXNjcmlwdGlvbjogR2VuZXJhdGVzIGludGVncml0eSBtZXRhZGF0YSBmb3IgYSBiaW8gYnkgY2FsbGluZyB0aGUKKyAqIGJsb2NrIGRldmljZSdzIGdlbmVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24uICBUaGUgYmlvIG11c3QgaGF2ZSBhCisgKiBiaXAgYXR0YWNoZWQgd2l0aCBlbm91Z2ggcm9vbSB0byBhY2NvbW1vZGF0ZSB0aGUgZ2VuZXJhdGVkCisgKiBpbnRlZ3JpdHkgbWV0YWRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGJpb19pbnRlZ3JpdHlfZ2VuZXJhdGUoc3RydWN0IGJpbyAqYmlvKQoreworCWJpb19pbnRlZ3JpdHlfZ2VuZXJhdGVfdmVyaWZ5KGJpbywgMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgYmxrX2ludGVncml0eV90dXBsZV9zaXplKHN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaSkKQEAgLTQ1NCw0MCArNDc1LDcgQEAKICAqLwogc3RhdGljIGludCBiaW9faW50ZWdyaXR5X3ZlcmlmeShzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Jc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpID0gYmRldl9nZXRfaW50ZWdyaXR5KGJpby0+YmlfYmRldik7Ci0Jc3RydWN0IGJsa19pbnRlZ3JpdHlfZXhjaGcgYml4OwotCXN0cnVjdCBiaW9fdmVjICpidjsKLQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX2ludGVncml0eS0+YmlwX2l0ZXIuYmlfc2VjdG9yOwotCXVuc2lnbmVkIGludCBzZWN0b3JzLCByZXQgPSAwOwotCXZvaWQgKnByb3RfYnVmID0gYmlvLT5iaV9pbnRlZ3JpdHktPmJpcF9idWY7Ci0JaW50IGk7Ci0KLQliaXguZGlza19uYW1lID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWU7Ci0JYml4LnNlY3Rvcl9zaXplID0gYmktPnNlY3Rvcl9zaXplOwotCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2LCBiaW8sIGkpIHsKLQkJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhidi0+YnZfcGFnZSk7Ci0KLQkJYml4LmRhdGFfYnVmID0ga2FkZHIgKyBidi0+YnZfb2Zmc2V0OwotCQliaXguZGF0YV9zaXplID0gYnYtPmJ2X2xlbjsKLQkJYml4LnByb3RfYnVmID0gcHJvdF9idWY7Ci0JCWJpeC5zZWN0b3IgPSBzZWN0b3I7Ci0KLQkJcmV0ID0gYmktPnZlcmlmeV9mbigmYml4KTsKLQotCQlpZiAocmV0KSB7Ci0JCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlzZWN0b3JzID0gYnYtPmJ2X2xlbiAvIGJpLT5zZWN0b3Jfc2l6ZTsKLQkJc2VjdG9yICs9IHNlY3RvcnM7Ci0JCXByb3RfYnVmICs9IHNlY3RvcnMgKiBiaS0+dHVwbGVfc2l6ZTsKLQotCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBiaW9faW50ZWdyaXR5X2dlbmVyYXRlX3ZlcmlmeShiaW8sIDApOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2Jpby5jIGIvZnMvYmlvLmMKaW5kZXggODc1NGU3Yi4uYjJkZDQyZSAxMDA2NDQKLS0tIGEvZnMvYmlvLmMKKysrIGIvZnMvYmlvLmMKQEAgLTExNiw3ICsxMTYsNiBAQAogCWlmICghc2xhYikKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYmlvOiBjcmVhdGUgc2xhYiA8JXM+IGF0ICVkXG4iLCBic2xhYi0+bmFtZSwgZW50cnkpOwogCWJzbGFiLT5zbGFiID0gc2xhYjsKIAlic2xhYi0+c2xhYl9yZWYgPSAxOwogCWJzbGFiLT5zbGFiX3NpemUgPSBzejsKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggNmFmMjBkZS4uZjg2ZGY4NSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTcyLDggKzcyLDggQEAKICAqIE5vdCBhbGwgYXJjaGl0ZWN0dXJlcyBoYXZlIHN5c191dGltZSwgc28gaW1wbGVtZW50IHRoaXMgaW4gdGVybXMKICAqIG9mIHN5c191dGltZXMuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3V0aW1lKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwKLQkJCQkgc3RydWN0IGNvbXBhdF91dGltYnVmIF9fdXNlciAqdCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIodXRpbWUsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF91dGltYnVmIF9fdXNlciAqLCB0KQogewogCXN0cnVjdCB0aW1lc3BlYyB0dlsyXTsKIApAQCAtODcsMTMgKzg3LDEzIEBACiAJcmV0dXJuIGRvX3V0aW1lcyhBVF9GRENXRCwgZmlsZW5hbWUsIHQgPyB0diA6IE5VTEwsIDApOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c191dGltZW5zYXQodW5zaWduZWQgaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdCwgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNCh1dGltZW5zYXQsIHVuc2lnbmVkIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdCwgaW50LCBmbGFncykKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHZbMl07CiAKIAlpZiAgKHQpIHsKLQkJaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnR2WzBdLCAmdFswXSkgfHwKLQkJICAgIGdldF9jb21wYXRfdGltZXNwZWMoJnR2WzFdLCAmdFsxXSkpCisJCWlmIChjb21wYXRfZ2V0X3RpbWVzcGVjKCZ0dlswXSwgJnRbMF0pIHx8CisJCSAgICBjb21wYXRfZ2V0X3RpbWVzcGVjKCZ0dlsxXSwgJnRbMV0pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJaWYgKHR2WzBdLnR2X25zZWMgPT0gVVRJTUVfT01JVCAmJiB0dlsxXS50dl9uc2VjID09IFVUSU1FX09NSVQpCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlyZXR1cm4gZG9fdXRpbWVzKGRmZCwgZmlsZW5hbWUsIHQgPyB0diA6IE5VTEwsIGZsYWdzKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnV0aW1lc2F0KHVuc2lnbmVkIGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZnV0aW1lc2F0LCB1bnNpZ25lZCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHZbMl07CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogCXJldHVybiBkb191dGltZXMoZGZkLCBmaWxlbmFtZSwgdCA/IHR2IDogTlVMTCwgMCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3V0aW1lcyhjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKHV0aW1lcywgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdCkKIHsKIAlyZXR1cm4gY29tcGF0X3N5c19mdXRpbWVzYXQoQVRfRkRDV0QsIGZpbGVuYW1lLCB0KTsKIH0KQEAgLTE1OSw4ICsxNTksOCBAQAogCXJldHVybiBjb3B5X3RvX3VzZXIodWJ1ZiwgJnRtcCwgc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld3N0YXQoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKLQkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobmV3c3RhdCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yOwpAQCAtMTcxLDggKzE3MSw4IEBACiAJcmV0dXJuIGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3bHN0YXQoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKLQkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobmV3bHN0YXQsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCBlcnJvcjsKQEAgLTE4NCw5ICsxODQsOSBAQAogfQogCiAjaWZuZGVmIF9fQVJDSF9XQU5UX1NUQVQ2NAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3ZnN0YXRhdCh1bnNpZ25lZCBpbnQgZGZkLAotCQljb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCi0JCXN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnN0YXRidWYsIGludCBmbGFnKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChuZXdmc3RhdGF0LCB1bnNpZ25lZCBpbnQsIGRmZCwKKwkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqLCBzdGF0YnVmLCBpbnQsIGZsYWcpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yOwpAQCAtMTk4LDggKzE5OCw4IEBACiB9CiAjZW5kaWYKIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3ZnN0YXQodW5zaWduZWQgaW50IGZkLAotCQlzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICogc3RhdGJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobmV3ZnN0YXQsIHVuc2lnbmVkIGludCwgZmQsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CkBAIC0yNDcsNyArMjQ3LDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgc3RhdGZzIGNhbGxzIGFyZSBjb3BpZXMgb2YgY29kZSBmcm9tIGZzL3N0YXRmcy5jIGFuZAogICogc2hvdWxkIGJlIGNoZWNrZWQgYWdhaW5zdCB0aG9zZSBmcm9tIHRpbWUgdG8gdGltZQogICovCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zdGF0ZnMoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBzdHJ1Y3QgY29tcGF0X3N0YXRmcyBfX3VzZXIgKmJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoc3RhdGZzLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICosIGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXRmcyB0bXA7CiAJaW50IGVycm9yID0gdXNlcl9zdGF0ZnMocGF0aG5hbWUsICZ0bXApOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19mc3RhdGZzKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICpidWYpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKGZzdGF0ZnMsIHVuc2lnbmVkIGludCwgZmQsIHN0cnVjdCBjb21wYXRfc3RhdGZzIF9fdXNlciAqLCBidWYpCiB7CiAJc3RydWN0IGtzdGF0ZnMgdG1wOwogCWludCBlcnJvciA9IGZkX3N0YXRmcyhmZCwgJnRtcCk7CkBAIC0yOTgsNyArMjk4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc3RhdGZzNjQoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBjb21wYXRfc2l6ZV90IHN6LCBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqYnVmKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzdGF0ZnM2NCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsIGNvbXBhdF9zaXplX3QsIHN6LCBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqLCBidWYpCiB7CiAJc3RydWN0IGtzdGF0ZnMgdG1wOwogCWludCBlcnJvcjsKQEAgLTMxMiw3ICszMTIsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnN0YXRmczY0KHVuc2lnbmVkIGludCBmZCwgY29tcGF0X3NpemVfdCBzeiwgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCBfX3VzZXIgKmJ1ZikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZnN0YXRmczY0LCB1bnNpZ25lZCBpbnQsIGZkLCBjb21wYXRfc2l6ZV90LCBzeiwgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCBfX3VzZXIgKiwgYnVmKQogewogCXN0cnVjdCBrc3RhdGZzIHRtcDsKIAlpbnQgZXJyb3I7CkBAIC0zMzEsNyArMzMxLDcgQEAKICAqIEdpdmVuIGhvdyBzaW1wbGUgdGhpcyBzeXNjYWxsIGlzIHRoYXQgYXBwb3JhY2ggaXMgbW9yZSBtYWludGFpbmFibGUKICAqIHRoYW4gdGhlIHZhcmlvdXMgY29udmVyc2lvbiBoYWNrcy4KICAqLwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdXN0YXQodW5zaWduZWQgZGV2LCBzdHJ1Y3QgY29tcGF0X3VzdGF0IF9fdXNlciAqdSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIodXN0YXQsIHVuc2lnbmVkLCBkZXYsIHN0cnVjdCBjb21wYXRfdXN0YXQgX191c2VyICosIHUpCiB7CiAJc3RydWN0IGNvbXBhdF91c3RhdCB0bXA7CiAJc3RydWN0IGtzdGF0ZnMgc2J1ZjsKQEAgLTM5OSw4ICszOTksOCBAQAogfQogI2VuZGlmCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZjbnRsNjQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAotCQl1bnNpZ25lZCBsb25nIGFyZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZmNudGw2NCwgdW5zaWduZWQgaW50LCBmZCwgdW5zaWduZWQgaW50LCBjbWQsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgYXJnKQogewogCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAJc3RydWN0IGZsb2NrIGY7CkBAIC00NjgsMTYgKzQ2OCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZjbnRsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKGZjbnRsLCB1bnNpZ25lZCBpbnQsIGZkLCB1bnNpZ25lZCBpbnQsIGNtZCwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBhcmcpCiB7CiAJaWYgKChjbWQgPT0gRl9HRVRMSzY0KSB8fCAoY21kID09IEZfU0VUTEs2NCkgfHwgKGNtZCA9PSBGX1NFVExLVzY0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIGNvbXBhdF9zeXNfZmNudGw2NChmZCwgY21kLCBhcmcpOwogfQogCi1hc21saW5rYWdlIGxvbmcKLWNvbXBhdF9zeXNfaW9fc2V0dXAodW5zaWduZWQgbnJfcmVxcywgdTMyIF9fdXNlciAqY3R4MzJwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihpb19zZXR1cCwgdW5zaWduZWQsIG5yX3JlcXMsIHUzMiBfX3VzZXIgKiwgY3R4MzJwKQogewogCWxvbmcgcmV0OwogCWFpb19jb250ZXh0X3QgY3R4NjQ7CkBAIC00OTYsMzIgKzQ5NSwyNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotY29tcGF0X3N5c19pb19nZXRldmVudHMoYWlvX2NvbnRleHRfdCBjdHhfaWQsCi0JCQkJIHVuc2lnbmVkIGxvbmcgbWluX25yLAotCQkJCSB1bnNpZ25lZCBsb25nIG5yLAotCQkJCSBzdHJ1Y3QgaW9fZXZlbnQgX191c2VyICpldmVudHMsCi0JCQkJIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShpb19nZXRldmVudHMsIGNvbXBhdF9haW9fY29udGV4dF90LCBjdHhfaWQsCisJCSAgICAgICBjb21wYXRfbG9uZ190LCBtaW5fbnIsCisJCSAgICAgICBjb21wYXRfbG9uZ190LCBuciwKKwkJICAgICAgIHN0cnVjdCBpb19ldmVudCBfX3VzZXIgKiwgZXZlbnRzLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdGltZW91dCkKIHsKLQlsb25nIHJldDsKIAlzdHJ1Y3QgdGltZXNwZWMgdDsKIAlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp1dCA9IE5VTEw7CiAKLQlyZXQgPSAtRUZBVUxUOwotCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZXZlbnRzLCAKLQkJCQluciAqIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKSkpCi0JCWdvdG8gb3V0OwogCWlmICh0aW1lb3V0KSB7Ci0JCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0LCB0aW1lb3V0KSkKLQkJCWdvdG8gb3V0OworCQlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdCwgdGltZW91dCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQl1dCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdXQpKTsKIAkJaWYgKGNvcHlfdG9fdXNlcih1dCwgJnQsIHNpemVvZih0KSkgKQotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IAotCXJldCA9IHN5c19pb19nZXRldmVudHMoY3R4X2lkLCBtaW5fbnIsIG5yLCBldmVudHMsIHV0KTsKLW91dDoKLQlyZXR1cm4gcmV0OworCXJldHVybiBzeXNfaW9fZ2V0ZXZlbnRzKGN0eF9pZCwgbWluX25yLCBuciwgZXZlbnRzLCB1dCk7CiB9CiAKIC8qIEEgd3JpdGUgb3BlcmF0aW9uIGRvZXMgYSByZWFkIGZyb20gdXNlciBzcGFjZSBhbmQgdmljZSB2ZXJzYSAqLwpAQCAtNjE3LDggKzYwOCw4IEBACiAKICNkZWZpbmUgTUFYX0FJT19TVUJNSVRTIAkoUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgaW9jYiAqKSkKIAotYXNtbGlua2FnZSBsb25nCi1jb21wYXRfc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgaW50IG5yLCB1MzIgX191c2VyICppb2NiKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhpb19zdWJtaXQsIGNvbXBhdF9haW9fY29udGV4dF90LCBjdHhfaWQsCisJCSAgICAgICBpbnQsIG5yLCB1MzIgX191c2VyICosIGlvY2IpCiB7CiAJc3RydWN0IGlvY2IgX191c2VyICogX191c2VyICppb2NiNjQ7IAogCWxvbmcgcmV0OwpAQCAtNzcwLDEwICs3NjEsMTAgQEAKICNkZWZpbmUgTkNQRlNfTkFNRSAgICAgICJuY3BmcyIKICNkZWZpbmUgTkZTNF9OQU1FCSJuZnM0IgogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tb3VudChjb25zdCBjaGFyIF9fdXNlciAqIGRldl9uYW1lLAotCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIGRpcl9uYW1lLAotCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIHR5cGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkJIGNvbnN0IHZvaWQgX191c2VyICogZGF0YSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUobW91bnQsIGNvbnN0IGNoYXIgX191c2VyICosIGRldl9uYW1lLAorCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKiwgZGlyX25hbWUsCisJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqLCB0eXBlLCBjb21wYXRfdWxvbmdfdCwgZmxhZ3MsCisJCSAgICAgICBjb25zdCB2b2lkIF9fdXNlciAqLCBkYXRhKQogewogCWNoYXIgKmtlcm5lbF90eXBlOwogCXVuc2lnbmVkIGxvbmcgZGF0YV9wYWdlOwpAQCAtODY5LDggKzg2MCw4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX29sZF9yZWFkZGlyKHVuc2lnbmVkIGludCBmZCwKLQlzdHJ1Y3QgY29tcGF0X29sZF9saW51eF9kaXJlbnQgX191c2VyICpkaXJlbnQsIHVuc2lnbmVkIGludCBjb3VudCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMob2xkX3JlYWRkaXIsIHVuc2lnbmVkIGludCwgZmQsCisJCXN0cnVjdCBjb21wYXRfb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZmQgZiA9IGZkZ2V0KGZkKTsKQEAgLTk0OCw4ICs5MzksOCBAQAogCXJldHVybiAtRUZBVUxUOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRkZW50cyh1bnNpZ25lZCBpbnQgZmQsCi0JCXN0cnVjdCBjb21wYXRfbGludXhfZGlyZW50IF9fdXNlciAqZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKGdldGRlbnRzLCB1bnNpZ25lZCBpbnQsIGZkLAorCQlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KQogewogCXN0cnVjdCBmZCBmOwogCXN0cnVjdCBjb21wYXRfbGludXhfZGlyZW50IF9fdXNlciAqIGxhc3RkaXJlbnQ7CkBAIC05ODEsNyArOTcyLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZm5kZWYgX19BUkNIX09NSVRfQ09NUEFUX1NZU19HRVRERU5UUzY0CisjaWZkZWYgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19HRVRERU5UUzY0CiAKIHN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2s2NCB7CiAJc3RydWN0IGRpcl9jb250ZXh0IGN0eDsKQEAgLTEwMzMsOCArMTAyNCw4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldGRlbnRzNjQodW5zaWduZWQgaW50IGZkLAotCQlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICogZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKGdldGRlbnRzNjQsIHVuc2lnbmVkIGludCwgZmQsCisJCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KQogewogCXN0cnVjdCBmZCBmOwogCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiBsYXN0ZGlyZW50OwpAQCAtMTA2Niw3ICsxMDU3LDcgQEAKIAlmZHB1dChmKTsKIAlyZXR1cm4gZXJyb3I7CiB9Ci0jZW5kaWYgLyogISBfX0FSQ0hfT01JVF9DT01QQVRfU1lTX0dFVERFTlRTNjQgKi8KKyNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX0dFVERFTlRTNjQgKi8KIAogLyoKICAqIEV4YWN0bHkgbGlrZSBmcy9vcGVuLmM6c3lzX29wZW4oKSwgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBzZXQgdGhlCkBAIC0xMjg3LDkgKzEyNzgsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbGVjdChpbnQgbiwgY29tcGF0X3Vsb25nX3QgX191c2VyICppbnAsCi0JY29tcGF0X3Vsb25nX3QgX191c2VyICpvdXRwLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmV4cCwKLQlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0dnApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHNlbGVjdCwgaW50LCBuLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgaW5wLAorCWNvbXBhdF91bG9uZ190IF9fdXNlciAqLCBvdXRwLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgZXhwLAorCXN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdHZwKQogewogCXN0cnVjdCB0aW1lc3BlYyBlbmRfdGltZSwgKnRvID0gTlVMTDsKIAlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgdHY7CkBAIC0xMzIwLDcgKzEzMTEsNyBAQAogCWNvbXBhdF91cHRyX3QgdHZwOwogfTsKIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfb2xkX3NlbGVjdChzdHJ1Y3QgY29tcGF0X3NlbF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShvbGRfc2VsZWN0LCBzdHJ1Y3QgY29tcGF0X3NlbF9hcmdfc3RydWN0IF9fdXNlciAqLCBhcmcpCiB7CiAJc3RydWN0IGNvbXBhdF9zZWxfYXJnX3N0cnVjdCBhOwogCkBAIC0xMzgxLDkgKzEzNzIsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3BzZWxlY3Q2KGludCBuLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmlucCwKLQljb21wYXRfdWxvbmdfdCBfX3VzZXIgKm91dHAsIGNvbXBhdF91bG9uZ190IF9fdXNlciAqZXhwLAotCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0c3AsIHZvaWQgX191c2VyICpzaWcpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KHBzZWxlY3Q2LCBpbnQsIG4sIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCBpbnAsCisJY29tcGF0X3Vsb25nX3QgX191c2VyICosIG91dHAsIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCBleHAsCisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdHNwLCB2b2lkIF9fdXNlciAqLCBzaWcpCiB7CiAJY29tcGF0X3NpemVfdCBzaWdzZXRzaXplID0gMDsKIAljb21wYXRfdXB0cl90IHVwID0gMDsKQEAgLTE0MDAsOSArMTM5MSw5IEBACiAJCQkJIHNpZ3NldHNpemUpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19wcG9sbChzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqdWZkcywKLQl1bnNpZ25lZCBpbnQgbmZkcywgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRzcCwKLQljb25zdCBjb21wYXRfc2lnc2V0X3QgX191c2VyICpzaWdtYXNrLCBjb21wYXRfc2l6ZV90IHNpZ3NldHNpemUpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KHBwb2xsLCBzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqLCB1ZmRzLAorCXVuc2lnbmVkIGludCwgIG5mZHMsIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRzcCwKKwljb25zdCBjb21wYXRfc2lnc2V0X3QgX191c2VyICosIHNpZ21hc2ssIGNvbXBhdF9zaXplX3QsIHNpZ3NldHNpemUpCiB7CiAJY29tcGF0X3NpZ3NldF90IHNzMzI7CiAJc2lnc2V0X3Qga3NpZ21hc2ssIHNpZ3NhdmVkOwpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2JpbmZtdF9lbGYuYyBiL2ZzL2NvbXBhdF9iaW5mbXRfZWxmLmMKaW5kZXggYTgxMTQ3ZS4uNGQyNGQxNyAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2JpbmZtdF9lbGYuYworKysgYi9mcy9jb21wYXRfYmluZm10X2VsZi5jCkBAIC04OCw2ICs4OCwxMSBAQAogI2RlZmluZQlFTEZfSFdDQVAJCUNPTVBBVF9FTEZfSFdDQVAKICNlbmRpZgogCisjaWZkZWYJQ09NUEFUX0VMRl9IV0NBUDIKKyN1bmRlZglFTEZfSFdDQVAyCisjZGVmaW5lCUVMRl9IV0NBUDIJCUNPTVBBVF9FTEZfSFdDQVAyCisjZW5kaWYKKwogI2lmZGVmCUNPTVBBVF9BUkNIX0RMSU5GTwogI3VuZGVmCUFSQ0hfRExJTkZPCiAjZGVmaW5lCUFSQ0hfRExJTkZPCQlDT01QQVRfQVJDSF9ETElORk8KZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggMzg4MTYxMC4uZTgyMjg5MCAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTE1MzgsOSArMTUzOCwxMCBAQAogCXJldHVybiBpb2N0bF9wb2ludGVyW2ldID09IHhjbWQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoaW9jdGwsIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGludCwgY21kLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIGFyZzMyKQogeworCXVuc2lnbmVkIGxvbmcgYXJnID0gYXJnMzI7CiAJc3RydWN0IGZkIGYgPSBmZGdldChmZCk7CiAJaW50IGVycm9yID0gLUVCQURGOwogCWlmICghZi5maWxlKQpkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCAyNjVlMGNlLi5jYTAyYzEzIDEwMDY0NAotLS0gYS9mcy9kY2FjaGUuYworKysgYi9mcy9kY2FjaGUuYwpAQCAtMjgzMyw5ICsyODMzLDkgQEAKIAl1MzIgZGxlbiA9IEFDQ0VTU19PTkNFKG5hbWUtPmxlbik7CiAJY2hhciAqcDsKIAotCWlmICgqYnVmbGVuIDwgZGxlbiArIDEpCi0JCXJldHVybiAtRU5BTUVUT09MT05HOwogCSpidWZsZW4gLT0gZGxlbiArIDE7CisJaWYgKCpidWZsZW4gPCAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAlwID0gKmJ1ZmZlciAtPSBkbGVuICsgMTsKIAkqcCsrID0gJy8nOwogCXdoaWxlIChkbGVuLS0pIHsKZGlmZiAtLWdpdCBhL2ZzL2VmaXZhcmZzL2ZpbGUuYyBiL2ZzL2VmaXZhcmZzL2ZpbGUuYwppbmRleCA4ZGQ1MjRmLi5jZGIyOTcxIDEwMDY0NAotLS0gYS9mcy9lZml2YXJmcy9maWxlLmMKKysrIGIvZnMvZWZpdmFyZnMvZmlsZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAJdTMyIGF0dHJpYnV0ZXM7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAl1bnNpZ25lZCBsb25nIGRhdGFzaXplID0gY291bnQgLSBzaXplb2YoYXR0cmlidXRlcyk7Ci0Jc3NpemVfdCBieXRlcyA9IDA7CisJc3NpemVfdCBieXRlczsKIAlib29sIHNldCA9IGZhbHNlOwogCiAJaWYgKGNvdW50IDwgc2l6ZW9mKGF0dHJpYnV0ZXMpKQpAQCAtMzMsMTQgKzMzLDkgQEAKIAlpZiAoYXR0cmlidXRlcyAmIH4oRUZJX1ZBUklBQkxFX01BU0spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHVzZXJidWYgKyBzaXplb2YoYXR0cmlidXRlcyksIGRhdGFzaXplKSkgewotCQlieXRlcyA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OwotCX0KKwlkYXRhID0gbWVtZHVwX3VzZXIodXNlcmJ1ZiArIHNpemVvZihhdHRyaWJ1dGVzKSwgZGF0YXNpemUpOworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOwogCiAJYnl0ZXMgPSBlZml2YXJfZW50cnlfc2V0X2dldF9zaXplKHZhciwgYXR0cmlidXRlcywgJmRhdGFzaXplLAogCQkJCQkgIGRhdGEsICZzZXQpOwpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDNkNzhmY2MuLjRmNTk0MDIgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTE2MTksOSArMTYxOSw5IEBACiAJcmV0dXJuIGRvX2V4ZWN2ZShnZXRuYW1lKGZpbGVuYW1lKSwgYXJndiwgZW52cCk7CiB9CiAjaWZkZWYgQ09ORklHX0NPTVBBVAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZXhlY3ZlKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsCi0JY29uc3QgY29tcGF0X3VwdHJfdCBfX3VzZXIgKiBhcmd2LAotCWNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICogZW52cCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTMoZXhlY3ZlLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwKKwljb25zdCBjb21wYXRfdXB0cl90IF9fdXNlciAqLCBhcmd2LAorCWNvbnN0IGNvbXBhdF91cHRyX3QgX191c2VyICosIGVudnApCiB7CiAJcmV0dXJuIGNvbXBhdF9kb19leGVjdmUoZ2V0bmFtZShmaWxlbmFtZSksIGFyZ3YsIGVudnApOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDZlMzk4OTUuLjI0YmZkN2YgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgpAQCAtMzkyMSwxOCArMzkyMiwyMCBAQAogdm9pZCBleHQ0X3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXVuc2lnbmVkIGludCBmbGFncyA9IEVYVDRfSShpbm9kZSktPmlfZmxhZ3M7CisJdW5zaWduZWQgaW50IG5ld19mbCA9IDA7CiAKLQlpbm9kZS0+aV9mbGFncyAmPSB+KFNfU1lOQ3xTX0FQUEVORHxTX0lNTVVUQUJMRXxTX05PQVRJTUV8U19ESVJTWU5DKTsKIAlpZiAoZmxhZ3MgJiBFWFQ0X1NZTkNfRkwpCi0JCWlub2RlLT5pX2ZsYWdzIHw9IFNfU1lOQzsKKwkJbmV3X2ZsIHw9IFNfU1lOQzsKIAlpZiAoZmxhZ3MgJiBFWFQ0X0FQUEVORF9GTCkKLQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19BUFBFTkQ7CisJCW5ld19mbCB8PSBTX0FQUEVORDsKIAlpZiAoZmxhZ3MgJiBFWFQ0X0lNTVVUQUJMRV9GTCkKLQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJCW5ld19mbCB8PSBTX0lNTVVUQUJMRTsKIAlpZiAoZmxhZ3MgJiBFWFQ0X05PQVRJTUVfRkwpCi0JCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwkJbmV3X2ZsIHw9IFNfTk9BVElNRTsKIAlpZiAoZmxhZ3MgJiBFWFQ0X0RJUlNZTkNfRkwpCi0JCWlub2RlLT5pX2ZsYWdzIHw9IFNfRElSU1lOQzsKKwkJbmV3X2ZsIHw9IFNfRElSU1lOQzsKKwlzZXRfbWFza19iaXRzKCZpbm9kZS0+aV9mbGFncywKKwkJICAgICAgU19TWU5DfFNfQVBQRU5EfFNfSU1NVVRBQkxFfFNfTk9BVElNRXxTX0RJUlNZTkMsIG5ld19mbCk7CiB9CiAKIC8qIFByb3BhZ2F0ZSBmbGFncyBmcm9tIGlfZmxhZ3MgdG8gRVhUNF9JKGlub2RlKS0+aV9mbGFncyAqLwpkaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jCmluZGV4IDYwYTQ1ZTkuLmI2MTI5M2IgMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGUuYworKysgYi9mcy9maWxlLmMKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCWVycm9yID0gZmQ7CiAjaWYgMQogCS8qIFNhbml0eSBjaGVjayAqLwotCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KGZkdC0+ZmRbZmRdKSAhPSBOVUxMKSB7CisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihmZHQtPmZkW2ZkXSkgIT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGxvY19mZDogc2xvdCAlZCBub3QgTlVMTCFcbiIsIGZkKTsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBOVUxMKTsKIAl9CkBAIC03MTMsMjcgKzcxMywxNiBAQAogCiB1bnNpZ25lZCBsb25nIF9fZmRnZXRfcG9zKHVuc2lnbmVkIGludCBmZCkKIHsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCXVuc2lnbmVkIGxvbmcgdjsKKwl1bnNpZ25lZCBsb25nIHYgPSBfX2ZkZ2V0KGZkKTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IChzdHJ1Y3QgZmlsZSAqKSh2ICYgfjMpOwogCi0JaWYgKGF0b21pY19yZWFkKCZmaWxlcy0+Y291bnQpID09IDEpIHsKLQkJZmlsZSA9IF9fZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7Ci0JCXYgPSAwOwotCX0gZWxzZSB7Ci0JCWZpbGUgPSBfX2ZnZXQoZmQsIDApOwotCQl2ID0gRkRQVVRfRlBVVDsKLQl9Ci0JaWYgKCFmaWxlKQotCQlyZXR1cm4gMDsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9BVE9NSUNfUE9TKSB7CisJaWYgKGZpbGUgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0FUT01JQ19QT1MpKSB7CiAJCWlmIChmaWxlX2NvdW50KGZpbGUpID4gMSkgewogCQkJdiB8PSBGRFBVVF9QT1NfVU5MT0NLOwogCQkJbXV0ZXhfbG9jaygmZmlsZS0+Zl9wb3NfbG9jayk7CiAJCX0KIAl9Ci0JcmV0dXJuIHYgfCAodW5zaWduZWQgbG9uZylmaWxlOworCXJldHVybiB2OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMva2VybmZzL0tjb25maWcgYi9mcy9rZXJuZnMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdiNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMva2VybmZzL0tjb25maWcKQEAgLTAsMCArMSw3IEBACisjCisjIEtFUk5GUyBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgaXRzIHVzZXJzCisjCisKK2NvbmZpZyBLRVJORlMKKwlib29sCisJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmMKaW5kZXggYmQ2ZTE4Yi4uMGJkMDVhYiAxMDA2NDQKLS0tIGEvZnMva2VybmZzL2Rpci5jCisrKyBiL2ZzL2tlcm5mcy9kaXIuYwpAQCAtOCw2ICs4LDcgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgpAQCAtMTgsOSArMTksMTYxIEBACiAjaW5jbHVkZSAia2VybmZzLWludGVybmFsLmgiCiAKIERFRklORV9NVVRFWChrZXJuZnNfbXV0ZXgpOworc3RhdGljIERFRklORV9TUElOTE9DSyhrZXJuZnNfcmVuYW1lX2xvY2spOwkvKiBrbi0+cGFyZW50IGFuZCAtPm5hbWUgKi8KK3N0YXRpYyBjaGFyIGtlcm5mc19wcl9jb250X2J1ZltQQVRIX01BWF07CS8qIHByb3RlY3RlZCBieSByZW5hbWVfbG9jayAqLwogCiAjZGVmaW5lIHJiX3RvX2tuKFgpIHJiX2VudHJ5KChYKSwgc3RydWN0IGtlcm5mc19ub2RlLCByYikKIAorc3RhdGljIGJvb2wga2VybmZzX2FjdGl2ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmtlcm5mc19tdXRleCk7CisJcmV0dXJuIGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSA+PSAwOworfQorCitzdGF0aWMgYm9vbCBrZXJuZnNfbG9ja2RlcChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCisJcmV0dXJuIGtuLT5mbGFncyAmIEtFUk5GU19MT0NLREVQOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworc3RhdGljIGludCBrZXJuZnNfbmFtZV9sb2NrZWQoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXJldHVybiBzdHJsY3B5KGJ1Ziwga24tPnBhcmVudCA/IGtuLT5uYW1lIDogIi8iLCBidWZsZW4pOworfQorCitzdGF0aWMgY2hhciAqIF9fbXVzdF9jaGVjayBrZXJuZnNfcGF0aF9sb2NrZWQoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLAorCQkJCQkgICAgICBzaXplX3QgYnVmbGVuKQoreworCWNoYXIgKnAgPSBidWYgKyBidWZsZW47CisJaW50IGxlbjsKKworCSotLXAgPSAnXDAnOworCisJZG8geworCQlsZW4gPSBzdHJsZW4oa24tPm5hbWUpOworCQlpZiAocCAtIGJ1ZiA8IGxlbiArIDEpIHsKKwkJCWJ1ZlswXSA9ICdcMCc7CisJCQlwID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXAgLT0gbGVuOworCQltZW1jcHkocCwga24tPm5hbWUsIGxlbik7CisJCSotLXAgPSAnLyc7CisJCWtuID0ga24tPnBhcmVudDsKKwl9IHdoaWxlIChrbiAmJiBrbi0+cGFyZW50KTsKKworCXJldHVybiBwOworfQorCisvKioKKyAqIGtlcm5mc19uYW1lIC0gb2J0YWluIHRoZSBuYW1lIG9mIGEgZ2l2ZW4gbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICogQGJ1ZjogYnVmZmVyIHRvIGNvcHkgQGtuJ3MgbmFtZSBpbnRvCisgKiBAYnVmbGVuOiBzaXplIG9mIEBidWYKKyAqCisgKiBDb3BpZXMgdGhlIG5hbWUgb2YgQGtuIGludG8gQGJ1ZiBvZiBAYnVmbGVuIGJ5dGVzLiAgVGhlIGJlaGF2aW9yIGlzCisgKiBzaW1pbGFyIHRvIHN0cmxjcHkoKS4gIEl0IHJldHVybnMgdGhlIGxlbmd0aCBvZiBAa24ncyBuYW1lIGFuZCBpZiBAYnVmCisgKiBpc24ndCBsb25nIGVub3VnaCwgaXQncyBmaWxsZWQgdXB0byBAYnVmbGVuLTEgYW5kIG51bCB0ZXJtaW5hdGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LgorICovCitpbnQga2VybmZzX25hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBrZXJuZnNfbmFtZV9sb2NrZWQoa24sIGJ1ZiwgYnVmbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGtlcm5mc19wYXRoIC0gYnVpbGQgZnVsbCBwYXRoIG9mIGEgZ2l2ZW4gbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICogQGJ1ZjogYnVmZmVyIHRvIGNvcHkgQGtuJ3MgbmFtZSBpbnRvCisgKiBAYnVmbGVuOiBzaXplIG9mIEBidWYKKyAqCisgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCBvZiBAa24gaW4gQGJ1ZiBvZiBAYnVmbGVuIGJ5dGVzLiAgVGhlCisgKiBwYXRoIGlzIGJ1aWx0IGZyb20gdGhlIGVuZCBvZiBAYnVmIHNvIHRoZSByZXR1cm5lZCBwb2ludGVyIHVzdWFsbHkKKyAqIGRvZXNuJ3QgbWF0Y2ggQGJ1Zi4gIElmIEBidWYgaXNuJ3QgbG9uZyBlbm91Z2gsIEBidWYgaXMgbnVsIHRlcm1pbmF0ZWQKKyAqIGFuZCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqLworY2hhciAqa2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlwID0ga2VybmZzX3BhdGhfbG9ja2VkKGtuLCBidWYsIGJ1Zmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHA7Cit9CisKKy8qKgorICogcHJfY29udF9rZXJuZnNfbmFtZSAtIHByX2NvbnQgbmFtZSBvZiBhIGtlcm5mc19ub2RlCisgKiBAa246IGtlcm5mc19ub2RlIG9mIGludGVyZXN0CisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuCisgKi8KK3ZvaWQgcHJfY29udF9rZXJuZnNfbmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisKKwlrZXJuZnNfbmFtZV9sb2NrZWQoa24sIGtlcm5mc19wcl9jb250X2J1Ziwgc2l6ZW9mKGtlcm5mc19wcl9jb250X2J1ZikpOworCXByX2NvbnQoIiVzIiwga2VybmZzX3ByX2NvbnRfYnVmKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtlcm5mc19yZW5hbWVfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHByX2NvbnRfa2VybmZzX3BhdGggLSBwcl9jb250IHBhdGggb2YgYSBrZXJuZnNfbm9kZQorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LgorICovCit2b2lkIHByX2NvbnRfa2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgKnA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2VybmZzX3JlbmFtZV9sb2NrLCBmbGFncyk7CisKKwlwID0ga2VybmZzX3BhdGhfbG9ja2VkKGtuLCBrZXJuZnNfcHJfY29udF9idWYsCisJCQkgICAgICAgc2l6ZW9mKGtlcm5mc19wcl9jb250X2J1ZikpOworCWlmIChwKQorCQlwcl9jb250KCIlcyIsIHApOworCWVsc2UKKwkJcHJfY29udCgiPG5hbWUgdG9vIGxvbmc+Iik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBrZXJuZnNfZ2V0X3BhcmVudCAtIGRldGVybWluZSB0aGUgcGFyZW50IG5vZGUgYW5kIHBpbiBpdAorICogQGtuOiBrZXJuZnNfbm9kZSBvZiBpbnRlcmVzdAorICoKKyAqIERldGVybWluZXMgQGtuJ3MgcGFyZW50LCBwaW5zIGFuZCByZXR1cm5zIGl0LiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAqIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LgorICovCitzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19nZXRfcGFyZW50KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKwlwYXJlbnQgPSBrbi0+cGFyZW50OworCWtlcm5mc19nZXQocGFyZW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXJuZnNfcmVuYW1lX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKIC8qKgogICoJa2VybmZzX25hbWVfaGFzaAogICoJQG5hbWU6IE51bGwgdGVybWluYXRlZCBzdHJpbmcgdG8gaGFzaApAQCAtMzcsNyArMTkwLDcgQEAKIAloYXNoID0gKGVuZF9uYW1lX2hhc2goaGFzaCkgXiBoYXNoX3B0cigodm9pZCAqKW5zLCAzMSkpOwogCWhhc2ggJj0gMHg3ZmZmZmZmZlU7CiAJLyogUmVzZXJ2ZSBoYXNoIG51bWJlcnMgMCwgMSBhbmQgSU5UX01BWCBmb3IgbWFnaWMgZGlyZWN0b3J5IGVudHJpZXMgKi8KLQlpZiAoaGFzaCA8IDEpCisJaWYgKGhhc2ggPCAyKQogCQloYXNoICs9IDI7CiAJaWYgKGhhc2ggPj0gSU5UX01BWCkKIAkJaGFzaCA9IElOVF9NQVggLSAxOwpAQCAtMTA1LDE4ICsyNTgsMjQgQEAKICAqCWtlcm5mc191bmxpbmtfc2libGluZyAtIHVubGluayBrZXJuZnNfbm9kZSBmcm9tIHNpYmxpbmcgcmJ0cmVlCiAgKglAa246IGtlcm5mc19ub2RlIG9mIGludGVyZXN0CiAgKgotICoJVW5saW5rIEBrbiBmcm9tIGl0cyBzaWJsaW5nIHJidHJlZSB3aGljaCBzdGFydHMgZnJvbQotICoJa24tPnBhcmVudC0+ZGlyLmNoaWxkcmVuLgorICoJVHJ5IHRvIHVubGluayBAa24gZnJvbSBpdHMgc2libGluZyByYnRyZWUgd2hpY2ggc3RhcnRzIGZyb20KKyAqCWtuLT5wYXJlbnQtPmRpci5jaGlsZHJlbi4gIFJldHVybnMgJXRydWUgaWYgQGtuIHdhcyBhY3R1YWxseQorICoJcmVtb3ZlZCwgJWZhbHNlIGlmIEBrbiB3YXNuJ3Qgb24gdGhlIHJidHJlZS4KICAqCiAgKglMb2NraW5nOgogICoJbXV0ZXhfbG9jayhrZXJuZnNfbXV0ZXgpCiAgKi8KLXN0YXRpYyB2b2lkIGtlcm5mc191bmxpbmtfc2libGluZyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQorc3RhdGljIGJvb2wga2VybmZzX3VubGlua19zaWJsaW5nKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7CisJaWYgKFJCX0VNUFRZX05PREUoJmtuLT5yYikpCisJCXJldHVybiBmYWxzZTsKKwogCWlmIChrZXJuZnNfdHlwZShrbikgPT0gS0VSTkZTX0RJUikKIAkJa24tPnBhcmVudC0+ZGlyLnN1YmRpcnMtLTsKIAogCXJiX2VyYXNlKCZrbi0+cmIsICZrbi0+cGFyZW50LT5kaXIuY2hpbGRyZW4pOworCVJCX0NMRUFSX05PREUoJmtuLT5yYik7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qKgpAQCAtMTM3LDcgKzI5Niw3IEBACiAJaWYgKCFhdG9taWNfaW5jX3VubGVzc19uZWdhdGl2ZSgma24tPmFjdGl2ZSkpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKGtuLT5mbGFncyAmIEtFUk5GU19MT0NLREVQKQorCWlmIChrZXJuZnNfbG9ja2RlcChrbikpCiAJCXJ3c2VtX2FjcXVpcmVfcmVhZCgma24tPmRlcF9tYXAsIDAsIDEsIF9SRVRfSVBfKTsKIAlyZXR1cm4ga247CiB9CkBAIC0xNTEsNTkgKzMxMCw1NyBAQAogICovCiB2b2lkIGtlcm5mc19wdXRfYWN0aXZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7CisJc3RydWN0IGtlcm5mc19yb290ICpyb290ID0ga2VybmZzX3Jvb3Qoa24pOwogCWludCB2OwogCiAJaWYgKHVubGlrZWx5KCFrbikpCiAJCXJldHVybjsKIAotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKQogCQlyd3NlbV9yZWxlYXNlKCZrbi0+ZGVwX21hcCwgMSwgX1JFVF9JUF8pOwogCXYgPSBhdG9taWNfZGVjX3JldHVybigma24tPmFjdGl2ZSk7CiAJaWYgKGxpa2VseSh2ICE9IEtOX0RFQUNUSVZBVEVEX0JJQVMpKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIGF0b21pY19kZWNfcmV0dXJuKCkgaXMgYSBtYigpLCB3ZSdsbCBhbHdheXMgc2VlIHRoZSB1cGRhdGVkCi0JICoga24tPnUuY29tcGxldGlvbi4KLQkgKi8KLQljb21wbGV0ZShrbi0+dS5jb21wbGV0aW9uKTsKKwl3YWtlX3VwX2FsbCgmcm9vdC0+ZGVhY3RpdmF0ZV93YWl0cSk7CiB9CiAKIC8qKgotICoJa2VybmZzX2RlYWN0aXZhdGUgLSBkZWFjdGl2YXRlIGtlcm5mc19ub2RlCi0gKglAa246IGtlcm5mc19ub2RlIHRvIGRlYWN0aXZhdGUKKyAqIGtlcm5mc19kcmFpbiAtIGRyYWluIGtlcm5mc19ub2RlCisgKiBAa246IGtlcm5mc19ub2RlIHRvIGRyYWluCiAgKgotICoJRGVueSBuZXcgYWN0aXZlIHJlZmVyZW5jZXMgYW5kIGRyYWluIGV4aXN0aW5nIG9uZXMuCisgKiBEcmFpbiBleGlzdGluZyB1c2FnZXMgYW5kIG51a2UgYWxsIGV4aXN0aW5nIG1tYXBzIG9mIEBrbi4gIE11dGlwbGUKKyAqIHJlbW92ZXJzIG1heSBpbnZva2UgdGhpcyBmdW5jdGlvbiBjb25jdXJyZW50bHkgb24gQGtuIGFuZCBhbGwgd2lsbAorICogcmV0dXJuIGFmdGVyIGRyYWluaW5nIGlzIGNvbXBsZXRlLgogICovCi1zdGF0aWMgdm9pZCBrZXJuZnNfZGVhY3RpdmF0ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQorc3RhdGljIHZvaWQga2VybmZzX2RyYWluKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCisJX19yZWxlYXNlcygma2VybmZzX211dGV4KSBfX2FjcXVpcmVzKCZrZXJuZnNfbXV0ZXgpCiB7Ci0JREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sod2FpdCk7Ci0JaW50IHY7CisJc3RydWN0IGtlcm5mc19yb290ICpyb290ID0ga2VybmZzX3Jvb3Qoa24pOwogCi0JQlVHX09OKCEoa24tPmZsYWdzICYgS0VSTkZTX1JFTU9WRUQpKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZrZXJuZnNfbXV0ZXgpOworCVdBUk5fT05fT05DRShrZXJuZnNfYWN0aXZlKGtuKSk7CiAKLQlpZiAoIShrZXJuZnNfdHlwZShrbikgJiBLRVJORlNfQUNUSVZFX1JFRikpCi0JCXJldHVybjsKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CiAKLQlrbi0+dS5jb21wbGV0aW9uID0gKHZvaWQgKikmd2FpdDsKLQotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKSB7CiAJCXJ3c2VtX2FjcXVpcmUoJmtuLT5kZXBfbWFwLCAwLCAwLCBfUkVUX0lQXyk7Ci0JLyogYXRvbWljX2FkZF9yZXR1cm4oKSBpcyBhIG1iKCksIHB1dF9hY3RpdmUoKSB3aWxsIGFsd2F5cyBzZWUKLQkgKiB0aGUgdXBkYXRlZCBrbi0+dS5jb21wbGV0aW9uLgotCSAqLwotCXYgPSBhdG9taWNfYWRkX3JldHVybihLTl9ERUFDVElWQVRFRF9CSUFTLCAma24tPmFjdGl2ZSk7Ci0KLQlpZiAodiAhPSBLTl9ERUFDVElWQVRFRF9CSUFTKSB7Ci0JCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkKKwkJaWYgKGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSAhPSBLTl9ERUFDVElWQVRFRF9CSUFTKQogCQkJbG9ja19jb250ZW5kZWQoJmtuLT5kZXBfbWFwLCBfUkVUX0lQXyk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCX0KIAotCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfTE9DS0RFUCkgeworCS8qIGJ1dCBldmVyeW9uZSBzaG91bGQgd2FpdCBmb3IgZHJhaW5pbmcgKi8KKwl3YWl0X2V2ZW50KHJvb3QtPmRlYWN0aXZhdGVfd2FpdHEsCisJCSAgIGF0b21pY19yZWFkKCZrbi0+YWN0aXZlKSA9PSBLTl9ERUFDVElWQVRFRF9CSUFTKTsKKworCWlmIChrZXJuZnNfbG9ja2RlcChrbikpIHsKIAkJbG9ja19hY3F1aXJlZCgma24tPmRlcF9tYXAsIF9SRVRfSVBfKTsKIAkJcndzZW1fcmVsZWFzZSgma24tPmRlcF9tYXAsIDEsIF9SRVRfSVBfKTsKIAl9CisKKwlrZXJuZnNfdW5tYXBfYmluX2ZpbGUoa24pOworCisJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKIH0KIAogLyoqCkBAIC0yMzQsMTMgKzM5MSwxNSBAQAogCQlyZXR1cm47CiAJcm9vdCA9IGtlcm5mc19yb290KGtuKTsKICByZXBlYXQ6Ci0JLyogTW92aW5nL3JlbmFtaW5nIGlzIGFsd2F5cyBkb25lIHdoaWxlIGhvbGRpbmcgcmVmZXJlbmNlLgorCS8qCisJICogTW92aW5nL3JlbmFtaW5nIGlzIGFsd2F5cyBkb25lIHdoaWxlIGhvbGRpbmcgcmVmZXJlbmNlLgogCSAqIGtuLT5wYXJlbnQgd29uJ3QgY2hhbmdlIGJlbmVhdGggdXMuCiAJICovCiAJcGFyZW50ID0ga24tPnBhcmVudDsKIAotCVdBUk4oIShrbi0+ZmxhZ3MgJiBLRVJORlNfUkVNT1ZFRCksICJrZXJuZnM6IGZyZWUgdXNpbmcgZW50cnk6ICVzLyVzXG4iLAotCSAgICAgcGFyZW50ID8gcGFyZW50LT5uYW1lIDogIiIsIGtuLT5uYW1lKTsKKwlXQVJOX09OQ0UoYXRvbWljX3JlYWQoJmtuLT5hY3RpdmUpICE9IEtOX0RFQUNUSVZBVEVEX0JJQVMsCisJCSAgImtlcm5mc19wdXQ6ICVzLyVzOiByZWxlYXNlZCB3aXRoIGluY29ycmVjdCBhY3RpdmVfcmVmICVkXG4iLAorCQkgIHBhcmVudCA/IHBhcmVudC0+bmFtZSA6ICIiLCBrbi0+bmFtZSwgYXRvbWljX3JlYWQoJmtuLT5hY3RpdmUpKTsKIAogCWlmIChrZXJuZnNfdHlwZShrbikgPT0gS0VSTkZTX0xJTkspCiAJCWtlcm5mc19wdXQoa24tPnN5bWxpbmsudGFyZ2V0X2tuKTsKQEAgLTI4Miw4ICs0NDEsOCBAQAogCWtuID0gZGVudHJ5LT5kX2ZzZGF0YTsKIAltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCi0JLyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIGRlbGV0ZWQgKi8KLQlpZiAoa24tPmZsYWdzICYgS0VSTkZTX1JFTU9WRUQpCisJLyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIGRlYWN0aXZhdGVkICovCisJaWYgKCFrZXJuZnNfYWN0aXZlKGtuKSkKIAkJZ290byBvdXRfYmFkOwogCiAJLyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIG1vdmVkPyAqLwpAQCAtMzI4LDYgKzQ4NywyNCBAQAogCS5kX3JlbGVhc2UJPSBrZXJuZnNfZG9wX3JlbGVhc2UsCiB9OwogCisvKioKKyAqIGtlcm5mc19ub2RlX2Zyb21fZGVudHJ5IC0gZGV0ZXJtaW5lIGtlcm5mc19ub2RlIGFzc29jaWF0ZWQgd2l0aCBhIGRlbnRyeQorICogQGRlbnRyeTogdGhlIGRlbnRyeSBpbiBxdWVzdGlvbgorICoKKyAqIFJldHVybiB0aGUga2VybmZzX25vZGUgYXNzb2NpYXRlZCB3aXRoIEBkZW50cnkuICBJZiBAZGVudHJ5IGlzIG5vdCBhCisgKiBrZXJuZnMgb25lLCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBXaGlsZSB0aGUgcmV0dXJuZWQga2VybmZzX25vZGUgd2lsbCBzdGF5IGFjY2Vzc2libGUgYXMgbG9uZyBhcyBAZGVudHJ5CisgKiBpcyBhY2Nlc3NpYmxlLCB0aGUgcmV0dXJuZWQgbm9kZSBjYW4gYmUgaW4gYW55IHN0YXRlIGFuZCB0aGUgY2FsbGVyIGlzCisgKiBmdWxseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hhdCdzIGFjY2Vzc2libGUuCisgKi8KK3N0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX25vZGVfZnJvbV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlmIChkZW50cnktPmRfc2ItPnNfb3AgPT0gJmtlcm5mc19zb3BzKQorCQlyZXR1cm4gZGVudHJ5LT5kX2ZzZGF0YTsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqX19rZXJuZnNfbmV3X25vZGUoc3RydWN0IGtlcm5mc19yb290ICpyb290LAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKIAkJCQkJICAgICB1bnNpZ25lZCBmbGFncykKQEAgLTM1MiwxMSArNTI5LDEyIEBACiAJa24tPmlubyA9IHJldDsKIAogCWF0b21pY19zZXQoJmtuLT5jb3VudCwgMSk7Ci0JYXRvbWljX3NldCgma24tPmFjdGl2ZSwgMCk7CisJYXRvbWljX3NldCgma24tPmFjdGl2ZSwgS05fREVBQ1RJVkFURURfQklBUyk7CisJUkJfQ0xFQVJfTk9ERSgma24tPnJiKTsKIAogCWtuLT5uYW1lID0gbmFtZTsKIAlrbi0+bW9kZSA9IG1vZGU7Ci0Ja24tPmZsYWdzID0gZmxhZ3MgfCBLRVJORlNfUkVNT1ZFRDsKKwlrbi0+ZmxhZ3MgPSBmbGFnczsKIAogCXJldHVybiBrbjsKIApAQCAtMzgyLDY5ICs1NjAsNDQgQEAKIH0KIAogLyoqCi0gKglrZXJuZnNfYWRkcm1fc3RhcnQgLSBwcmVwYXJlIGZvciBrZXJuZnNfbm9kZSBhZGQvcmVtb3ZlCi0gKglAYWN4dDogcG9pbnRlciB0byBrZXJuZnNfYWRkcm1fY3h0IHRvIGJlIHVzZWQKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gYWRkIG9yIHJlbW92ZQotICoJa2VybmZzX25vZGUuICBUaGlzIGZ1bmN0aW9uIGFjcXVpcmVzIGtlcm5mc19tdXRleC4gIEBhY3h0IGlzIHVzZWQKLSAqCXRvIGtlZXAgYW5kIHBhc3MgY29udGV4dCB0byBvdGhlciBhZGRybSBmdW5jdGlvbnMuCi0gKgotICoJTE9DS0lORzoKLSAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4gIGtlcm5mc19tdXRleCBpcyBsb2NrZWQgb24KLSAqCXJldHVybi4KLSAqLwotdm9pZCBrZXJuZnNfYWRkcm1fc3RhcnQoc3RydWN0IGtlcm5mc19hZGRybV9jeHQgKmFjeHQpCi0JX19hY3F1aXJlcyhrZXJuZnNfbXV0ZXgpCi17Ci0JbWVtc2V0KGFjeHQsIDAsIHNpemVvZigqYWN4dCkpOwotCi0JbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKLX0KLQotLyoqCiAgKglrZXJuZnNfYWRkX29uZSAtIGFkZCBrZXJuZnNfbm9kZSB0byBwYXJlbnQgd2l0aG91dCB3YXJuaW5nCi0gKglAYWN4dDogYWRkcm0gY29udGV4dCB0byB1c2UKICAqCUBrbjoga2VybmZzX25vZGUgdG8gYmUgYWRkZWQKICAqCiAgKglUaGUgY2FsbGVyIG11c3QgYWxyZWFkeSBoYXZlIGluaXRpYWxpemVkIEBrbi0+cGFyZW50LiAgVGhpcwogICoJZnVuY3Rpb24gaW5jcmVtZW50cyBubGluayBvZiB0aGUgcGFyZW50J3MgaW5vZGUgaWYgQGtuIGlzIGEKICAqCWRpcmVjdG9yeSBhbmQgbGluayBpbnRvIHRoZSBjaGlsZHJlbiBsaXN0IG9mIHRoZSBwYXJlbnQuCiAgKgotICoJVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJldHdlZW4gY2FsbHMgdG8KLSAqCWtlcm5mc19hZGRybV9zdGFydCgpIGFuZCBrZXJuZnNfYWRkcm1fZmluaXNoKCkgYW5kIHNob3VsZCBiZSBwYXNzZWQKLSAqCXRoZSBzYW1lIEBhY3h0IGFzIHBhc3NlZCB0byBrZXJuZnNfYWRkcm1fc3RhcnQoKS4KLSAqCi0gKglMT0NLSU5HOgotICoJRGV0ZXJtaW5lZCBieSBrZXJuZnNfYWRkcm1fc3RhcnQoKS4KLSAqCiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCAtRUVYSVNUIGlmIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUgYWxyZWFkeQogICoJZXhpc3RzLgogICovCi1pbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19hZGRybV9jeHQgKmFjeHQsIHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCitpbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19ub2RlICprbikKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCA9IGtuLT5wYXJlbnQ7Ci0JYm9vbCBoYXNfbnMgPSBrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpOwogCXN0cnVjdCBrZXJuZnNfaWF0dHJzICpwc19pYXR0cjsKKwlib29sIGhhc19uczsKIAlpbnQgcmV0OwogCi0JaWYgKGhhc19ucyAhPSAoYm9vbClrbi0+bnMpIHsKLQkJV0FSTigxLCBLRVJOX1dBUk5JTkcgImtlcm5mczogbnMgJXMgaW4gJyVzJyBmb3IgJyVzJ1xuIiwKLQkJICAgICBoYXNfbnMgPyAicmVxdWlyZWQiIDogImludmFsaWQiLCBwYXJlbnQtPm5hbWUsIGtuLT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CisKKwlyZXQgPSAtRUlOVkFMOworCWhhc19ucyA9IGtlcm5mc19uc19lbmFibGVkKHBhcmVudCk7CisJaWYgKFdBUk4oaGFzX25zICE9IChib29sKWtuLT5ucywgS0VSTl9XQVJOSU5HICJrZXJuZnM6IG5zICVzIGluICclcycgZm9yICclcydcbiIsCisJCSBoYXNfbnMgPyAicmVxdWlyZWQiIDogImludmFsaWQiLCBwYXJlbnQtPm5hbWUsIGtuLT5uYW1lKSkKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJaWYgKGtlcm5mc190eXBlKHBhcmVudCkgIT0gS0VSTkZTX0RJUikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKIAotCWlmIChwYXJlbnQtPmZsYWdzICYgS0VSTkZTX1JFTU9WRUQpCi0JCXJldHVybiAtRU5PRU5UOworCXJldCA9IC1FTk9FTlQ7CisJaWYgKChwYXJlbnQtPmZsYWdzICYgS0VSTkZTX0FDVElWQVRFRCkgJiYgIWtlcm5mc19hY3RpdmUocGFyZW50KSkKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJa24tPmhhc2ggPSBrZXJuZnNfbmFtZV9oYXNoKGtuLT5uYW1lLCBrbi0+bnMpOwogCiAJcmV0ID0ga2VybmZzX2xpbmtfc2libGluZyhrbik7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJLyogVXBkYXRlIHRpbWVzdGFtcHMgb24gdGhlIHBhcmVudCAqLwogCXBzX2lhdHRyID0gcGFyZW50LT5pYXR0cjsKQEAgLTQ1Myw4MiArNjA2LDIyIEBACiAJCXBzX2lhdHRycy0+aWFfY3RpbWUgPSBwc19pYXR0cnMtPmlhX210aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KIAotCS8qIE1hcmsgdGhlIGVudHJ5IGFkZGVkIGludG8gZGlyZWN0b3J5IHRyZWUgKi8KLQlrbi0+ZmxhZ3MgJj0gfktFUk5GU19SRU1PVkVEOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoJa2VybmZzX3JlbW92ZV9vbmUgLSByZW1vdmUga2VybmZzX25vZGUgZnJvbSBwYXJlbnQKLSAqCUBhY3h0OiBhZGRybSBjb250ZXh0IHRvIHVzZQotICoJQGtuOiBrZXJuZnNfbm9kZSB0byBiZSByZW1vdmVkCi0gKgotICoJTWFyayBAa24gcmVtb3ZlZCBhbmQgZHJvcCBubGluayBvZiBwYXJlbnQgaW5vZGUgaWYgQGtuIGlzIGEKLSAqCWRpcmVjdG9yeS4gIEBrbiBpcyB1bmxpbmtlZCBmcm9tIHRoZSBjaGlsZHJlbiBsaXN0LgotICoKLSAqCVRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZXR3ZWVuIGNhbGxzIHRvCi0gKglrZXJuZnNfYWRkcm1fc3RhcnQoKSBhbmQga2VybmZzX2FkZHJtX2ZpbmlzaCgpIGFuZCBzaG91bGQgYmUKLSAqCXBhc3NlZCB0aGUgc2FtZSBAYWN4dCBhcyBwYXNzZWQgdG8ga2VybmZzX2FkZHJtX3N0YXJ0KCkuCi0gKgotICoJTE9DS0lORzoKLSAqCURldGVybWluZWQgYnkga2VybmZzX2FkZHJtX3N0YXJ0KCkuCi0gKi8KLXN0YXRpYyB2b2lkIGtlcm5mc19yZW1vdmVfb25lKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0LAotCQkJICAgICAgc3RydWN0IGtlcm5mc19ub2RlICprbikKLXsKLQlzdHJ1Y3Qga2VybmZzX2lhdHRycyAqcHNfaWF0dHI7Ci0KLQkvKgotCSAqIFJlbW92YWwgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBub2RlLiAgT25seSB0aGUKLQkgKiBmaXJzdCBpbnZvY2F0aW9uIGlzIGVmZmVjdGl2ZSBhbmQgcHV0cyB0aGUgYmFzZSByZWYuCi0JICovCi0JaWYgKGtuLT5mbGFncyAmIEtFUk5GU19SRU1PVkVEKQotCQlyZXR1cm47Ci0KLQlpZiAoa24tPnBhcmVudCkgewotCQlrZXJuZnNfdW5saW5rX3NpYmxpbmcoa24pOwotCi0JCS8qIFVwZGF0ZSB0aW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgKi8KLQkJcHNfaWF0dHIgPSBrbi0+cGFyZW50LT5pYXR0cjsKLQkJaWYgKHBzX2lhdHRyKSB7Ci0JCQlwc19pYXR0ci0+aWFfaWF0dHIuaWFfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCQlwc19pYXR0ci0+aWFfaWF0dHIuaWFfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCX0KLQl9Ci0KLQlrbi0+ZmxhZ3MgfD0gS0VSTkZTX1JFTU9WRUQ7Ci0Ja24tPnUucmVtb3ZlZF9saXN0ID0gYWN4dC0+cmVtb3ZlZDsKLQlhY3h0LT5yZW1vdmVkID0ga247Ci19Ci0KLS8qKgotICoJa2VybmZzX2FkZHJtX2ZpbmlzaCAtIGZpbmlzaCB1cCBrZXJuZnNfbm9kZSBhZGQvcmVtb3ZlCi0gKglAYWN4dDogYWRkcm0gY29udGV4dCB0byBmaW5pc2ggdXAKLSAqCi0gKglGaW5pc2ggdXAga2VybmZzX25vZGUgYWRkL3JlbW92ZS4gIFJlc291cmNlcyBhY3F1aXJlZCBieQotICoJa2VybmZzX2FkZHJtX3N0YXJ0KCkgYXJlIHJlbGVhc2VkIGFuZCByZW1vdmVkIGtlcm5mc19ub2RlcyBhcmUKLSAqCWNsZWFuZWQgdXAuCi0gKgotICoJTE9DS0lORzoKLSAqCWtlcm5mc19tdXRleCBpcyByZWxlYXNlZC4KLSAqLwotdm9pZCBrZXJuZnNfYWRkcm1fZmluaXNoKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0KQotCV9fcmVsZWFzZXMoa2VybmZzX211dGV4KQotewotCS8qIHJlbGVhc2UgcmVzb3VyY2VzIGFjcXVpcmVkIGJ5IGtlcm5mc19hZGRybV9zdGFydCgpICovCiAJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCi0JLyoga2lsbCByZW1vdmVkIGtlcm5mc19ub2RlcyAqLwotCXdoaWxlIChhY3h0LT5yZW1vdmVkKSB7Ci0JCXN0cnVjdCBrZXJuZnNfbm9kZSAqa24gPSBhY3h0LT5yZW1vdmVkOworCS8qCisJICogQWN0aXZhdGUgdGhlIG5ldyBub2RlIHVubGVzcyBDUkVBVEVfREVBQ1RJVkFURUQgaXMgcmVxdWVzdGVkLgorCSAqIElmIG5vdCBhY3RpdmF0ZWQgaGVyZSwgdGhlIGtlcm5mcyB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvcgorCSAqIGFjdGl2YXRpbmcgdGhlIG5vZGUgd2l0aCBrZXJuZnNfYWN0aXZhdGUoKS4gIEEgbm9kZSB3aGljaCBoYXNuJ3QKKwkgKiBiZWVuIGFjdGl2YXRlZCBpcyBub3QgdmlzaWJsZSB0byB1c2VybGFuZCBhbmQgaXRzIHJlbW92YWwgd29uJ3QKKwkgKiB0cmlnZ2VyIGRlYWN0aXZhdGlvbi4KKwkgKi8KKwlpZiAoIShrZXJuZnNfcm9vdChrbiktPmZsYWdzICYgS0VSTkZTX1JPT1RfQ1JFQVRFX0RFQUNUSVZBVEVEKSkKKwkJa2VybmZzX2FjdGl2YXRlKGtuKTsKKwlyZXR1cm4gMDsKIAotCQlhY3h0LT5yZW1vdmVkID0ga24tPnUucmVtb3ZlZF9saXN0OwotCi0JCWtlcm5mc19kZWFjdGl2YXRlKGtuKTsKLQkJa2VybmZzX3VubWFwX2Jpbl9maWxlKGtuKTsKLQkJa2VybmZzX3B1dChrbik7Ci0JfQorb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC01OTksMTMgKzY5MiwxNSBAQAogCiAvKioKICAqIGtlcm5mc19jcmVhdGVfcm9vdCAtIGNyZWF0ZSBhIG5ldyBrZXJuZnMgaGllcmFyY2h5Ci0gKiBAa2RvcHM6IG9wdGlvbmFsIGRpcmVjdG9yeSBzeXNjYWxsIG9wZXJhdGlvbnMgZm9yIHRoZSBoaWVyYXJjaHkKKyAqIEBzY29wczogb3B0aW9uYWwgc3lzY2FsbCBvcGVyYXRpb25zIGZvciB0aGUgaGllcmFyY2h5CisgKiBAZmxhZ3M6IEtFUk5GU19ST09UXyogZmxhZ3MKICAqIEBwcml2OiBvcGFxdWUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBkaXJlY3RvcnkKICAqCiAgKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBuZXcgaGllcmFyY2h5IG9uIHN1Y2Nlc3MsIEVSUl9QVFIoKSB2YWx1ZSBvbgogICogZmFpbHVyZS4KICAqLwotc3RydWN0IGtlcm5mc19yb290ICprZXJuZnNfY3JlYXRlX3Jvb3Qoc3RydWN0IGtlcm5mc19kaXJfb3BzICprZG9wcywgdm9pZCAqcHJpdikKK3N0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX2NyZWF0ZV9yb290KHN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGtlcm5mc19yb290ICpyb290OwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa247CkBAIC02MjQsMTIgKzcxOSwxNiBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlrbi0+ZmxhZ3MgJj0gfktFUk5GU19SRU1PVkVEOwogCWtuLT5wcml2ID0gcHJpdjsKIAlrbi0+ZGlyLnJvb3QgPSByb290OwogCi0Jcm9vdC0+ZGlyX29wcyA9IGtkb3BzOworCXJvb3QtPnN5c2NhbGxfb3BzID0gc2NvcHM7CisJcm9vdC0+ZmxhZ3MgPSBmbGFnczsKIAlyb290LT5rbiA9IGtuOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJvb3QtPmRlYWN0aXZhdGVfd2FpdHEpOworCisJaWYgKCEocm9vdC0+ZmxhZ3MgJiBLRVJORlNfUk9PVF9DUkVBVEVfREVBQ1RJVkFURUQpKQorCQlrZXJuZnNfYWN0aXZhdGUoa24pOwogCiAJcmV0dXJuIHJvb3Q7CiB9CkBAIC02NjAsNyArNzU5LDYgQEAKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKIAkJCQkJIHZvaWQgKnByaXYsIGNvbnN0IHZvaWQgKm5zKQogewotCXN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0IGFjeHQ7CiAJc3RydWN0IGtlcm5mc19ub2RlICprbjsKIAlpbnQgcmM7CiAKQEAgLTY3NCwxMCArNzcyLDcgQEAKIAlrbi0+cHJpdiA9IHByaXY7CiAKIAkvKiBsaW5rIGluICovCi0Ja2VybmZzX2FkZHJtX3N0YXJ0KCZhY3h0KTsKLQlyYyA9IGtlcm5mc19hZGRfb25lKCZhY3h0LCBrbik7Ci0Ja2VybmZzX2FkZHJtX2ZpbmlzaCgmYWN4dCk7Ci0KKwlyYyA9IGtlcm5mc19hZGRfb25lKGtuKTsKIAlpZiAoIXJjKQogCQlyZXR1cm4ga247CiAKQEAgLTcwMyw3ICs3OTgsNyBAQAogCWtuID0ga2VybmZzX2ZpbmRfbnMocGFyZW50LCBkZW50cnktPmRfbmFtZS5uYW1lLCBucyk7CiAKIAkvKiBubyBzdWNoIGVudHJ5ICovCi0JaWYgKCFrbikgeworCWlmICgha24gfHwgIWtlcm5mc19hY3RpdmUoa24pKSB7CiAJCXJldCA9IE5VTEw7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CkBAIC03MjgsMjMgKzgyMywzNyBAQAogCQkJICAgIHVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCA9IGRpci0+aV9wcml2YXRlOwotCXN0cnVjdCBrZXJuZnNfZGlyX29wcyAqa2RvcHMgPSBrZXJuZnNfcm9vdChwYXJlbnQpLT5kaXJfb3BzOworCXN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzID0ga2VybmZzX3Jvb3QocGFyZW50KS0+c3lzY2FsbF9vcHM7CisJaW50IHJldDsKIAotCWlmICgha2RvcHMgfHwgIWtkb3BzLT5ta2RpcikKKwlpZiAoIXNjb3BzIHx8ICFzY29wcy0+bWtkaXIpCiAJCXJldHVybiAtRVBFUk07CiAKLQlyZXR1cm4ga2RvcHMtPm1rZGlyKHBhcmVudCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSk7CisJaWYgKCFrZXJuZnNfZ2V0X2FjdGl2ZShwYXJlbnQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IHNjb3BzLT5ta2RpcihwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUpOworCisJa2VybmZzX3B1dF9hY3RpdmUocGFyZW50KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGtlcm5mc19pb3Bfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuICA9IGRlbnRyeS0+ZF9mc2RhdGE7Ci0Jc3RydWN0IGtlcm5mc19kaXJfb3BzICprZG9wcyA9IGtlcm5mc19yb290KGtuKS0+ZGlyX29wczsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IGtlcm5mc19yb290KGtuKS0+c3lzY2FsbF9vcHM7CisJaW50IHJldDsKIAotCWlmICgha2RvcHMgfHwgIWtkb3BzLT5ybWRpcikKKwlpZiAoIXNjb3BzIHx8ICFzY29wcy0+cm1kaXIpCiAJCXJldHVybiAtRVBFUk07CiAKLQlyZXR1cm4ga2RvcHMtPnJtZGlyKGtuKTsKKwlpZiAoIWtlcm5mc19nZXRfYWN0aXZlKGtuKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzY29wcy0+cm1kaXIoa24pOworCisJa2VybmZzX3B1dF9hY3RpdmUoa24pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQga2VybmZzX2lvcF9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LApAQCAtNzUyLDEyICs4NjEsMjUgQEAKIHsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuICA9IG9sZF9kZW50cnktPmRfZnNkYXRhOwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCA9IG5ld19kaXItPmlfcHJpdmF0ZTsKLQlzdHJ1Y3Qga2VybmZzX2Rpcl9vcHMgKmtkb3BzID0ga2VybmZzX3Jvb3Qoa24pLT5kaXJfb3BzOworCXN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzID0ga2VybmZzX3Jvb3Qoa24pLT5zeXNjYWxsX29wczsKKwlpbnQgcmV0OwogCi0JaWYgKCFrZG9wcyB8fCAha2RvcHMtPnJlbmFtZSkKKwlpZiAoIXNjb3BzIHx8ICFzY29wcy0+cmVuYW1lKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcmV0dXJuIGtkb3BzLT5yZW5hbWUoa24sIG5ld19wYXJlbnQsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpZiAoIWtlcm5mc19nZXRfYWN0aXZlKGtuKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWtlcm5mc19nZXRfYWN0aXZlKG5ld19wYXJlbnQpKSB7CisJCWtlcm5mc19wdXRfYWN0aXZlKGtuKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gc2NvcHMtPnJlbmFtZShrbiwgbmV3X3BhcmVudCwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJa2VybmZzX3B1dF9hY3RpdmUobmV3X3BhcmVudCk7CisJa2VybmZzX3B1dF9hY3RpdmUoa24pOworCXJldHVybiByZXQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGtlcm5mc19kaXJfaW9wcyA9IHsKQEAgLTgzMCwyMyArOTUyLDEwNCBAQAogCXJldHVybiBwb3MtPnBhcmVudDsKIH0KIAotc3RhdGljIHZvaWQgX19rZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0LAotCQkJICAgIHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCisvKioKKyAqIGtlcm5mc19hY3RpdmF0ZSAtIGFjdGl2YXRlIGEgbm9kZSB3aGljaCBzdGFydGVkIGRlYWN0aXZhdGVkCisgKiBAa246IGtlcm5mc19ub2RlIHdob3NlIHN1YnRyZWUgaXMgdG8gYmUgYWN0aXZhdGVkCisgKgorICogSWYgdGhlIHJvb3QgaGFzIEtFUk5GU19ST09UX0NSRUFURV9ERUFDVElWQVRFRCBzZXQsIGEgbmV3bHkgY3JlYXRlZCBub2RlCisgKiBuZWVkcyB0byBiZSBleHBsaWNpdGx5IGFjdGl2YXRlZC4gIEEgbm9kZSB3aGljaCBoYXNuJ3QgYmVlbiBhY3RpdmF0ZWQKKyAqIGlzbid0IHZpc2libGUgdG8gdXNlcmxhbmQgYW5kIGRlYWN0aXZhdGlvbiBpcyBza2lwcGVkIGR1cmluZyBpdHMKKyAqIHJlbW92YWwuICBUaGlzIGlzIHVzZWZ1bCB0byBjb25zdHJ1Y3QgYXRvbWljIGluaXQgc2VxdWVuY2VzIHdoZXJlCisgKiBjcmVhdGlvbiBvZiBtdWx0aXBsZSBub2RlcyBzaG91bGQgZWl0aGVyIHN1Y2NlZWQgb3IgZmFpbCBhdG9taWNhbGx5LgorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkCisgKiBhZnRlciBrZXJuZnNfcmVtb3ZlKigpIGlzIGludm9rZWQgb24gQGtuLgorICovCit2b2lkIGtlcm5mc19hY3RpdmF0ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogewotCXN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLCAqbmV4dDsKKwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBvczsKIAotCWlmICgha24pCisJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKKworCXBvcyA9IE5VTEw7CisJd2hpbGUgKChwb3MgPSBrZXJuZnNfbmV4dF9kZXNjZW5kYW50X3Bvc3QocG9zLCBrbikpKSB7CisJCWlmICghcG9zIHx8IChwb3MtPmZsYWdzICYgS0VSTkZTX0FDVElWQVRFRCkpCisJCQljb250aW51ZTsKKworCQlXQVJOX09OX09OQ0UocG9zLT5wYXJlbnQgJiYgUkJfRU1QVFlfTk9ERSgmcG9zLT5yYikpOworCQlXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJnBvcy0+YWN0aXZlKSAhPSBLTl9ERUFDVElWQVRFRF9CSUFTKTsKKworCQlhdG9taWNfc3ViKEtOX0RFQUNUSVZBVEVEX0JJQVMsICZwb3MtPmFjdGl2ZSk7CisJCXBvcy0+ZmxhZ3MgfD0gS0VSTkZTX0FDVElWQVRFRDsKKwl9CisKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa2VybmZzX3JlbW92ZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworCXN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgma2VybmZzX211dGV4KTsKKworCS8qCisJICogU2hvcnQtY2lyY3VpdCBpZiBub24tcm9vdCBAa24gaGFzIGFscmVhZHkgZmluaXNoZWQgcmVtb3ZhbC4KKwkgKiBUaGlzIGlzIGZvciBrZXJuZnNfcmVtb3ZlX3NlbGYoKSB3aGljaCBwbGF5cyB3aXRoIGFjdGl2ZSByZWYKKwkgKiBhZnRlciByZW1vdmFsLgorCSAqLworCWlmICgha24gfHwgKGtuLT5wYXJlbnQgJiYgUkJfRU1QVFlfTk9ERSgma24tPnJiKSkpCiAJCXJldHVybjsKIAogCXByX2RlYnVnKCJrZXJuZnMgJXM6IHJlbW92aW5nXG4iLCBrbi0+bmFtZSk7CiAKLQluZXh0ID0gTlVMTDsKKwkvKiBwcmV2ZW50IGFueSBuZXcgdXNhZ2UgdW5kZXIgQGtuIGJ5IGRlYWN0aXZhdGluZyBhbGwgbm9kZXMgKi8KKwlwb3MgPSBOVUxMOworCXdoaWxlICgocG9zID0ga2VybmZzX25leHRfZGVzY2VuZGFudF9wb3N0KHBvcywga24pKSkKKwkJaWYgKGtlcm5mc19hY3RpdmUocG9zKSkKKwkJCWF0b21pY19hZGQoS05fREVBQ1RJVkFURURfQklBUywgJnBvcy0+YWN0aXZlKTsKKworCS8qIGRlYWN0aXZhdGUgYW5kIHVubGluayB0aGUgc3VidHJlZSBub2RlLWJ5LW5vZGUgKi8KIAlkbyB7Ci0JCXBvcyA9IG5leHQ7Ci0JCW5leHQgPSBrZXJuZnNfbmV4dF9kZXNjZW5kYW50X3Bvc3QocG9zLCBrbik7Ci0JCWlmIChwb3MpCi0JCQlrZXJuZnNfcmVtb3ZlX29uZShhY3h0LCBwb3MpOwotCX0gd2hpbGUgKG5leHQpOworCQlwb3MgPSBrZXJuZnNfbGVmdG1vc3RfZGVzY2VuZGFudChrbik7CisKKwkJLyoKKwkJICoga2VybmZzX2RyYWluKCkgZHJvcHMga2VybmZzX211dGV4IHRlbXBvcmFyaWx5IGFuZCBAcG9zJ3MKKwkJICogYmFzZSByZWYgY291bGQgaGF2ZSBiZWVuIHB1dCBieSBzb21lb25lIGVsc2UgYnkgdGhlIHRpbWUKKwkJICogdGhlIGZ1bmN0aW9uIHJldHVybnMuICBNYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBhd2F5CisJCSAqIHVuZGVybmVhdGggdXMuCisJCSAqLworCQlrZXJuZnNfZ2V0KHBvcyk7CisKKwkJLyoKKwkJICogRHJhaW4gaWZmIEBrbiB3YXMgYWN0aXZhdGVkLiAgVGhpcyBhdm9pZHMgZHJhaW5pbmcgYW5kCisJCSAqIGl0cyBsb2NrZGVwIGFubm90YXRpb25zIGZvciBub2RlcyB3aGljaCBoYXZlIG5ldmVyIGJlZW4KKwkJICogYWN0aXZhdGVkIGFuZCBhbGxvd3MgZW1iZWRkaW5nIGtlcm5mc19yZW1vdmUoKSBpbiBjcmVhdGUKKwkJICogZXJyb3IgcGF0aHMgd2l0aG91dCB3b3JyeWluZyBhYm91dCBkcmFpbmluZy4KKwkJICovCisJCWlmIChrbi0+ZmxhZ3MgJiBLRVJORlNfQUNUSVZBVEVEKQorCQkJa2VybmZzX2RyYWluKHBvcyk7CisJCWVsc2UKKwkJCVdBUk5fT05fT05DRShhdG9taWNfcmVhZCgma24tPmFjdGl2ZSkgIT0gS05fREVBQ1RJVkFURURfQklBUyk7CisKKwkJLyoKKwkJICoga2VybmZzX3VubGlua19zaWJsaW5nKCkgc3VjY2VlZHMgb25jZSBwZXIgbm9kZS4gIFVzZSBpdAorCQkgKiB0byBkZWNpZGUgd2hvJ3MgcmVzcG9uc2libGUgZm9yIGNsZWFudXBzLgorCQkgKi8KKwkJaWYgKCFwb3MtPnBhcmVudCB8fCBrZXJuZnNfdW5saW5rX3NpYmxpbmcocG9zKSkgeworCQkJc3RydWN0IGtlcm5mc19pYXR0cnMgKnBzX2lhdHRyID0KKwkJCQlwb3MtPnBhcmVudCA/IHBvcy0+cGFyZW50LT5pYXR0ciA6IE5VTEw7CisKKwkJCS8qIHVwZGF0ZSB0aW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgKi8KKwkJCWlmIChwc19pYXR0cikgeworCQkJCXBzX2lhdHRyLT5pYV9pYXR0ci5pYV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJCQlwc19pYXR0ci0+aWFfaWF0dHIuaWFfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJCQl9CisKKwkJCWtlcm5mc19wdXQocG9zKTsKKwkJfQorCisJCWtlcm5mc19wdXQocG9zKTsKKwl9IHdoaWxlIChwb3MgIT0ga24pOwogfQogCiAvKioKQEAgLTg1NywxMSArMTA2MCwxNDAgQEAKICAqLwogdm9pZCBrZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCiB7Ci0Jc3RydWN0IGtlcm5mc19hZGRybV9jeHQgYWN4dDsKKwltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOworCV9fa2VybmZzX3JlbW92ZShrbik7CisJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOworfQogCi0Ja2VybmZzX2FkZHJtX3N0YXJ0KCZhY3h0KTsKLQlfX2tlcm5mc19yZW1vdmUoJmFjeHQsIGtuKTsKLQlrZXJuZnNfYWRkcm1fZmluaXNoKCZhY3h0KTsKKy8qKgorICoga2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uIC0gYnJlYWsgb3V0IG9mIGFjdGl2ZSBwcm90ZWN0aW9uCisgKiBAa246IHRoZSBzZWxmIGtlcm5mc19ub2RlCisgKgorICogVGhlIGNhbGxlciBtdXN0IGJlIHJ1bm5pbmcgb2ZmIG9mIGEga2VybmZzIG9wZXJhdGlvbiB3aGljaCBpcyBpbnZva2VkCisgKiB3aXRoIGFuIGFjdGl2ZSByZWZlcmVuY2UgLSBlLmcuIG9uZSBvZiBrZXJuZnNfb3BzLiAgRWFjaCBpbnZvY2F0aW9uIG9mCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYWxzbyBiZSBtYXRjaGVkIHdpdGggYW4gaW52b2NhdGlvbiBvZgorICoga2VybmZzX3VuYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIHRoZSBhY3RpdmUgcmVmZXJlbmNlIG9mIEBrbiB0aGUgY2FsbGVyIGlzCisgKiBob2xkaW5nLiAgT25jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgQGtuIG1heSBiZSByZW1vdmVkIGF0IGFueSBwb2ludAorICogYW5kIHRoZSBjYWxsZXIgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBvYmplY3RzIGl0CisgKiBkZXJlZmVyZW5jZXMgYXJlIGFjY2Vzc2libGUuCisgKi8KK3ZvaWQga2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJLyoKKwkgKiBUYWtlIG91dCBvdXJzZWxmIG91dCBvZiB0aGUgYWN0aXZlIHJlZiBkZXBlbmRlbmN5IGNoYWluLiAgSWYKKwkgKiB3ZSdyZSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgcmVmLCBsb2NrZGVwIHdpbGwgY29tcGxhaW4uCisJICovCisJa2VybmZzX3B1dF9hY3RpdmUoa24pOworfQorCisvKioKKyAqIGtlcm5mc191bmJyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uIC0gdW5kbyBrZXJuZnNfYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oKQorICogQGtuOiB0aGUgc2VsZiBrZXJuZnNfbm9kZQorICoKKyAqIElmIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbigpIHdhcyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQorICogaW52b2tlZCBiZWZvcmUgZmluaXNoaW5nIHRoZSBrZXJuZnMgb3BlcmF0aW9uLiAgTm90ZSB0aGF0IHdoaWxlIHRoaXMKKyAqIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBhY3RpdmUgcmVmZXJlbmNlLCBpdCBkb2Vzbid0IGFuZCBjYW4ndCBhY3R1YWxseQorICogcmVzdG9yZSB0aGUgYWN0aXZlIHByb3RlY3Rpb24gLSBAa24gbWF5IGFscmVhZHkgb3IgYmUgaW4gdGhlIHByb2Nlc3Mgb2YKKyAqIGJlaW5nIHJlbW92ZWQuICBPbmNlIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbigpIGlzIGludm9rZWQsIHRoYXQKKyAqIHByb3RlY3Rpb24gaXMgaXJyZXZlcnNpYmx5IGdvbmUgZm9yIHRoZSBrZXJuZnMgb3BlcmF0aW9uIGluc3RhbmNlLgorICoKKyAqIFdoaWxlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhdCBhbnkgcG9pbnQgYWZ0ZXIKKyAqIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbigpIGlzIGludm9rZWQsIGl0cyBtb3N0IHVzZWZ1bCBsb2NhdGlvbgorICogd291bGQgYmUgcmlnaHQgYmVmb3JlIHRoZSBlbmNsb3Npbmcga2VybmZzIG9wZXJhdGlvbiByZXR1cm5zLgorICovCit2b2lkIGtlcm5mc191bmJyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7CisJLyoKKwkgKiBAa24tPmFjdGl2ZSBjb3VsZCBiZSBpbiBhbnkgc3RhdGU7IGhvd2V2ZXIsIHRoZSBpbmNyZW1lbnQgd2UgZG8KKwkgKiBoZXJlIHdpbGwgYmUgdW5kb25lIGFzIHNvb24gYXMgdGhlIGVuY2xvc2luZyBrZXJuZnMgb3BlcmF0aW9uCisJICogZmluaXNoZXMgYW5kIHRoaXMgdGVtcG9yYXJ5IGJ1bXAgY2FuJ3QgYnJlYWsgYW55dGhpbmcuICBJZiBAa24KKwkgKiBpcyBhbGl2ZSwgbm90aGluZyBjaGFuZ2VzLiAgSWYgQGtuIGlzIGJlaW5nIGRlYWN0aXZhdGVkLCB0aGUKKwkgKiBzb29uLXRvLWZvbGxvdyBwdXQgd2lsbCBlaXRoZXIgZmluaXNoIGRlYWN0aXZhdGlvbiBvciByZXN0b3JlCisJICogZGVhY3RpdmF0ZWQgc3RhdGUuICBJZiBAa24gaXMgYWxyZWFkeSByZW1vdmVkLCB0aGUgdGVtcG9yYXJ5CisJICogYnVtcCBpcyBndWFyYW50ZWVkIHRvIGJlIGdvbmUgYmVmb3JlIEBrbiBpcyByZWxlYXNlZC4KKwkgKi8KKwlhdG9taWNfaW5jKCZrbi0+YWN0aXZlKTsKKwlpZiAoa2VybmZzX2xvY2tkZXAoa24pKQorCQlyd3NlbV9hY3F1aXJlKCZrbi0+ZGVwX21hcCwgMCwgMSwgX1JFVF9JUF8pOworfQorCisvKioKKyAqIGtlcm5mc19yZW1vdmVfc2VsZiAtIHJlbW92ZSBhIGtlcm5mc19ub2RlIGZyb20gaXRzIG93biBtZXRob2QKKyAqIEBrbjogdGhlIHNlbGYga2VybmZzX25vZGUgdG8gcmVtb3ZlCisgKgorICogVGhlIGNhbGxlciBtdXN0IGJlIHJ1bm5pbmcgb2ZmIG9mIGEga2VybmZzIG9wZXJhdGlvbiB3aGljaCBpcyBpbnZva2VkCisgKiB3aXRoIGFuIGFjdGl2ZSByZWZlcmVuY2UgLSBlLmcuIG9uZSBvZiBrZXJuZnNfb3BzLiAgVGhpcyBjYW4gYmUgdXNlZCB0bworICogaW1wbGVtZW50IGEgZmlsZSBvcGVyYXRpb24gd2hpY2ggZGVsZXRlcyBpdHNlbGYuCisgKgorICogRm9yIGV4YW1wbGUsIHRoZSAiZGVsZXRlIiBmaWxlIGZvciBhIHN5c2ZzIGRldmljZSBkaXJlY3RvcnkgY2FuIGJlCisgKiBpbXBsZW1lbnRlZCBieSBpbnZva2luZyBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBvbiB0aGUgImRlbGV0ZSIgZmlsZQorICogaXRzZWxmLiAgVGhpcyBmdW5jdGlvbiBicmVha3MgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kgb2YgdHJ5aW5nIHRvCisgKiBkZWFjdGl2YXRlIHNlbGYgd2hpbGUgaG9sZGluZyBhbiBhY3RpdmUgcmVmIGl0c2VsZi4gIEl0IGlzbid0IG5lY2Vzc2FyeQorICogdG8gbW9kaWZ5IHRoZSB1c3VhbCByZW1vdmFsIHBhdGggdG8gdXNlIGtlcm5mc19yZW1vdmVfc2VsZigpLiAgVGhlCisgKiAiZGVsZXRlIiBpbXBsZW1lbnRhdGlvbiBjYW4gc2ltcGx5IGludm9rZSBrZXJuZnNfcmVtb3ZlX3NlbGYoKSBvbiBzZWxmCisgKiBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSB1c3VhbCByZW1vdmFsIHBhdGguICBrZXJuZnMgd2lsbCBpZ25vcmUgbGF0ZXIKKyAqIGtlcm5mc19yZW1vdmUoKSBvbiBzZWxmLgorICoKKyAqIGtlcm5mc19yZW1vdmVfc2VsZigpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5IG9uIHRoZQorICogc2FtZSBrZXJuZnNfbm9kZS4gIE9ubHkgdGhlIGZpcnN0IG9uZSBhY3R1YWxseSBwZXJmb3JtcyByZW1vdmFsIGFuZAorICogcmV0dXJucyAldHJ1ZS4gIEFsbCBvdGhlcnMgd2lsbCB3YWl0IHVudGlsIHRoZSBrZXJuZnMgb3BlcmF0aW9uIHdoaWNoCisgKiB3b24gc2VsZi1yZW1vdmFsIGZpbmlzaGVzIGFuZCByZXR1cm4gJWZhbHNlLiAgTm90ZSB0aGF0IHRoZSBsb3NlcnMgd2FpdAorICogZm9yIHRoZSBjb21wbGV0aW9uIG9mIG5vdCBvbmx5IHRoZSB3aW5uaW5nIGtlcm5mc19yZW1vdmVfc2VsZigpIGJ1dCBhbHNvCisgKiB0aGUgd2hvbGUga2VybmZzX29wcyB3aGljaCB3b24gdGhlIGFyYml0cmF0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZCB0bworICogZ3VhcmFudGVlLCBmb3IgZXhhbXBsZSwgYWxsIGNvbmN1cnJlbnQgd3JpdGVzIHRvIGEgImRlbGV0ZSIgZmlsZSB0bworICogZmluaXNoIG9ubHkgYWZ0ZXIgdGhlIHdob2xlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKyAqLworYm9vbCBrZXJuZnNfcmVtb3ZlX3NlbGYoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwlib29sIHJldDsKKworCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CisJa2VybmZzX2JyZWFrX2FjdGl2ZV9wcm90ZWN0aW9uKGtuKTsKKworCS8qCisJICogU1VJQ0lEQUwgaXMgdXNlZCB0byBhcmJpdHJhdGUgYW1vbmcgY29tcGV0aW5nIGludm9jYXRpb25zLiAgT25seQorCSAqIHRoZSBmaXJzdCBvbmUgd2lsbCBhY3R1YWxseSBwZXJmb3JtIHJlbW92YWwuICBXaGVuIHRoZSByZW1vdmFsCisJICogaXMgY29tcGxldGUsIFNVSUNJREVEIGlzIHNldCBhbmQgdGhlIGFjdGl2ZSByZWYgaXMgcmVzdG9yZWQKKwkgKiB3aGlsZSBob2xkaW5nIGtlcm5mc19tdXRleC4gIFRoZSBvbmVzIHdoaWNoIGxvc3QgYXJiaXRyYXRpb24KKwkgKiB3YWl0cyBmb3IgU1VJQ0RFRCAmJiBkcmFpbmVkIHdoaWNoIGNhbiBoYXBwZW4gb25seSBhZnRlciB0aGUKKwkgKiBlbmNsb3Npbmcga2VybmZzIG9wZXJhdGlvbiB3aGljaCBleGVjdXRlZCB0aGUgd2lubmluZyBpbnN0YW5jZQorCSAqIG9mIGtlcm5mc19yZW1vdmVfc2VsZigpIGZpbmlzaGVkLgorCSAqLworCWlmICghKGtuLT5mbGFncyAmIEtFUk5GU19TVUlDSURBTCkpIHsKKwkJa24tPmZsYWdzIHw9IEtFUk5GU19TVUlDSURBTDsKKwkJX19rZXJuZnNfcmVtb3ZlKGtuKTsKKwkJa24tPmZsYWdzIHw9IEtFUk5GU19TVUlDSURFRDsKKwkJcmV0ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdHEgPSAma2VybmZzX3Jvb3Qoa24pLT5kZWFjdGl2YXRlX3dhaXRxOworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQl3aGlsZSAodHJ1ZSkgeworCQkJcHJlcGFyZV90b193YWl0KHdhaXRxLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCQlpZiAoKGtuLT5mbGFncyAmIEtFUk5GU19TVUlDSURFRCkgJiYKKwkJCSAgICBhdG9taWNfcmVhZCgma24tPmFjdGl2ZSkgPT0gS05fREVBQ1RJVkFURURfQklBUykKKwkJCQlicmVhazsKKworCQkJbXV0ZXhfdW5sb2NrKCZrZXJuZnNfbXV0ZXgpOworCQkJc2NoZWR1bGUoKTsKKwkJCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CisJCX0KKwkJZmluaXNoX3dhaXQod2FpdHEsICZ3YWl0KTsKKwkJV0FSTl9PTl9PTkNFKCFSQl9FTVBUWV9OT0RFKCZrbi0+cmIpKTsKKwkJcmV0ID0gZmFsc2U7CisJfQorCisJLyoKKwkgKiBUaGlzIG11c3QgYmUgZG9uZSB3aGlsZSBob2xkaW5nIGtlcm5mc19tdXRleDsgb3RoZXJ3aXNlLCB3YWl0aW5nCisJICogZm9yIFNVSUNJREVEICYmIGRlYWN0aXZhdGVkIGNvdWxkIGZpbmlzaCBwcmVtYXR1cmVseS4KKwkgKi8KKwlrZXJuZnNfdW5icmVha19hY3RpdmVfcHJvdGVjdGlvbihrbik7CisKKwltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC04NzYsNyArMTIwOCw2IEBACiBpbnQga2VybmZzX3JlbW92ZV9ieV9uYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICBjb25zdCB2b2lkICpucykKIHsKLQlzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCBhY3h0OwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqa247CiAKIAlpZiAoIXBhcmVudCkgewpAQCAtODg1LDEzICsxMjE2LDEzIEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWtlcm5mc19hZGRybV9zdGFydCgmYWN4dCk7CisJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKIAogCWtuID0ga2VybmZzX2ZpbmRfbnMocGFyZW50LCBuYW1lLCBucyk7CiAJaWYgKGtuKQotCQlfX2tlcm5mc19yZW1vdmUoJmFjeHQsIGtuKTsKKwkJX19rZXJuZnNfcmVtb3ZlKGtuKTsKIAotCWtlcm5mc19hZGRybV9maW5pc2goJmFjeHQpOworCW11dGV4X3VubG9jaygma2VybmZzX211dGV4KTsKIAogCWlmIChrbikKIAkJcmV0dXJuIDA7CkBAIC05MDksMTIgKzEyNDAsMTggQEAKIGludCBrZXJuZnNfcmVuYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIHN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCwKIAkJICAgICBjb25zdCBjaGFyICpuZXdfbmFtZSwgY29uc3Qgdm9pZCAqbmV3X25zKQogeworCXN0cnVjdCBrZXJuZnNfbm9kZSAqb2xkX3BhcmVudDsKKwljb25zdCBjaGFyICpvbGRfbmFtZSA9IE5VTEw7CiAJaW50IGVycm9yOwogCisJLyogY2FuJ3QgbW92ZSBvciByZW5hbWUgcm9vdCAqLworCWlmICgha24tPnBhcmVudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltdXRleF9sb2NrKCZrZXJuZnNfbXV0ZXgpOwogCiAJZXJyb3IgPSAtRU5PRU5UOwotCWlmICgoa24tPmZsYWdzIHwgbmV3X3BhcmVudC0+ZmxhZ3MpICYgS0VSTkZTX1JFTU9WRUQpCisJaWYgKCFrZXJuZnNfYWN0aXZlKGtuKSB8fCAha2VybmZzX2FjdGl2ZShuZXdfcGFyZW50KSkKIAkJZ290byBvdXQ7CiAKIAllcnJvciA9IDA7CkBAIC05MzIsMTMgKzEyNjksOCBAQAogCQluZXdfbmFtZSA9IGtzdHJkdXAobmV3X25hbWUsIEdGUF9LRVJORUwpOwogCQlpZiAoIW5ld19uYW1lKQogCQkJZ290byBvdXQ7Ci0KLQkJaWYgKGtuLT5mbGFncyAmIEtFUk5GU19TVEFUSUNfTkFNRSkKLQkJCWtuLT5mbGFncyAmPSB+S0VSTkZTX1NUQVRJQ19OQU1FOwotCQllbHNlCi0JCQlrZnJlZShrbi0+bmFtZSk7Ci0KLQkJa24tPm5hbWUgPSBuZXdfbmFtZTsKKwl9IGVsc2UgeworCQluZXdfbmFtZSA9IE5VTEw7CiAJfQogCiAJLyoKQEAgLTk0NiwxMiArMTI3OCwyOSBAQAogCSAqLwogCWtlcm5mc191bmxpbmtfc2libGluZyhrbik7CiAJa2VybmZzX2dldChuZXdfcGFyZW50KTsKLQlrZXJuZnNfcHV0KGtuLT5wYXJlbnQpOwotCWtuLT5ucyA9IG5ld19uczsKLQlrbi0+aGFzaCA9IGtlcm5mc19uYW1lX2hhc2goa24tPm5hbWUsIGtuLT5ucyk7CisKKwkvKiByZW5hbWVfbG9jayBwcm90ZWN0cyAtPnBhcmVudCBhbmQgLT5uYW1lIGFjY2Vzc29ycyAqLworCXNwaW5fbG9ja19pcnEoJmtlcm5mc19yZW5hbWVfbG9jayk7CisKKwlvbGRfcGFyZW50ID0ga24tPnBhcmVudDsKIAlrbi0+cGFyZW50ID0gbmV3X3BhcmVudDsKKworCWtuLT5ucyA9IG5ld19uczsKKwlpZiAobmV3X25hbWUpIHsKKwkJaWYgKCEoa24tPmZsYWdzICYgS0VSTkZTX1NUQVRJQ19OQU1FKSkKKwkJCW9sZF9uYW1lID0ga24tPm5hbWU7CisJCWtuLT5mbGFncyAmPSB+S0VSTkZTX1NUQVRJQ19OQU1FOworCQlrbi0+bmFtZSA9IG5ld19uYW1lOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgma2VybmZzX3JlbmFtZV9sb2NrKTsKKworCWtuLT5oYXNoID0ga2VybmZzX25hbWVfaGFzaChrbi0+bmFtZSwga24tPm5zKTsKIAlrZXJuZnNfbGlua19zaWJsaW5nKGtuKTsKIAorCWtlcm5mc19wdXQob2xkX3BhcmVudCk7CisJa2ZyZWUob2xkX25hbWUpOworCiAJZXJyb3IgPSAwOwogIG91dDoKIAltdXRleF91bmxvY2soJmtlcm5mc19tdXRleCk7CkBAIC05NzQsNyArMTMyMyw3IEBACiAJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcykKIHsKIAlpZiAocG9zKSB7Ci0JCWludCB2YWxpZCA9ICEocG9zLT5mbGFncyAmIEtFUk5GU19SRU1PVkVEKSAmJgorCQlpbnQgdmFsaWQgPSBrZXJuZnNfYWN0aXZlKHBvcykgJiYKIAkJCXBvcy0+cGFyZW50ID09IHBhcmVudCAmJiBoYXNoID09IHBvcy0+aGFzaDsKIAkJa2VybmZzX3B1dChwb3MpOwogCQlpZiAoIXZhbGlkKQpAQCAtOTkzLDggKzEzNDIsOCBAQAogCQkJCWJyZWFrOwogCQl9CiAJfQotCS8qIFNraXAgb3ZlciBlbnRyaWVzIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi8KLQl3aGlsZSAocG9zICYmIHBvcy0+bnMgIT0gbnMpIHsKKwkvKiBTa2lwIG92ZXIgZW50cmllcyB3aGljaCBhcmUgZHlpbmcvZGVhZCBvciBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlICovCisJd2hpbGUgKHBvcyAmJiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fCBwb3MtPm5zICE9IG5zKSkgewogCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX25leHQoJnBvcy0+cmIpOwogCQlpZiAoIW5vZGUpCiAJCQlwb3MgPSBOVUxMOwpAQCAtMTAwOCwxNCArMTM1NywxNSBAQAogCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBpbm9fdCBpbm8sIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zKQogewogCXBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGlubywgcG9zKTsKLQlpZiAocG9zKQorCWlmIChwb3MpIHsKIAkJZG8gewogCQkJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KCZwb3MtPnJiKTsKIAkJCWlmICghbm9kZSkKIAkJCQlwb3MgPSBOVUxMOwogCQkJZWxzZQogCQkJCXBvcyA9IHJiX3RvX2tuKG5vZGUpOwotCQl9IHdoaWxlIChwb3MgJiYgcG9zLT5ucyAhPSBucyk7CisJCX0gd2hpbGUgKHBvcyAmJiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fCBwb3MtPm5zICE9IG5zKSk7CisJfQogCXJldHVybiBwb3M7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9maWxlLmMgYi9mcy9rZXJuZnMvZmlsZS5jCmluZGV4IGRiZjM5N2IuLjgwMzQ3MDYgMTAwNjQ0Ci0tLSBhL2ZzL2tlcm5mcy9maWxlLmMKKysrIGIvZnMva2VybmZzL2ZpbGUuYwpAQCAtMjUyLDEwICsyNTIsMTggQEAKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YgPSBrZXJuZnNfb2YoZmlsZSk7Ci0Jc3NpemVfdCBsZW4gPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUpOwogCWNvbnN0IHN0cnVjdCBrZXJuZnNfb3BzICpvcHM7CisJc2l6ZV90IGxlbjsKIAljaGFyICpidWY7CiAKKwlpZiAob2YtPmF0b21pY193cml0ZV9sZW4pIHsKKwkJbGVuID0gY291bnQ7CisJCWlmIChsZW4gPiBvZi0+YXRvbWljX3dyaXRlX2xlbikKKwkJCXJldHVybiAtRTJCSUc7CisJfSBlbHNlIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFKTsKKwl9CisKIAlidWYgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY1Myw2ICs2NjEsMTIgQEAKIAlvZi0+ZmlsZSA9IGZpbGU7CiAKIAkvKgorCSAqIFdyaXRlIHBhdGggbmVlZHMgdG8gYXRvbWljX3dyaXRlX2xlbiBvdXRzaWRlIGFjdGl2ZSByZWZlcmVuY2UuCisJICogQ2FjaGUgaXQgaW4gb3Blbl9maWxlLiAgU2VlIGtlcm5mc19mb3Bfd3JpdGUoKSBmb3IgZGV0YWlscy4KKwkgKi8KKwlvZi0+YXRvbWljX3dyaXRlX2xlbiA9IG9wcy0+YXRvbWljX3dyaXRlX2xlbjsKKworCS8qCiAJICogQWx3YXlzIGluc3RhbnRpYXRlIHNlcV9maWxlIGV2ZW4gaWYgcmVhZCBhY2Nlc3MgZG9lc24ndCB1c2UKIAkgKiBzZXFfZmlsZSBvciBpcyBub3QgcmVxdWVzdGVkLiAgVGhpcyB1bmlmaWVzIHByaXZhdGUgZGF0YSBhY2Nlc3MKIAkgKiBhbmQgcmVhZGFibGUgcmVndWxhciBmaWxlcyBhcmUgdGhlIHZhc3QgbWFqb3JpdHkgYW55d2F5LgpAQCAtODIwLDcgKzgzNCw2IEBACiAJCQkJCSBib29sIG5hbWVfaXNfc3RhdGljLAogCQkJCQkgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7Ci0Jc3RydWN0IGtlcm5mc19hZGRybV9jeHQgYWN4dDsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuOwogCXVuc2lnbmVkIGZsYWdzOwogCWludCByYzsKQEAgLTg1NSwxMCArODY4LDcgQEAKIAlpZiAob3BzLT5tbWFwKQogCQlrbi0+ZmxhZ3MgfD0gS0VSTkZTX0hBU19NTUFQOwogCi0Ja2VybmZzX2FkZHJtX3N0YXJ0KCZhY3h0KTsKLQlyYyA9IGtlcm5mc19hZGRfb25lKCZhY3h0LCBrbik7Ci0Ja2VybmZzX2FkZHJtX2ZpbmlzaCgmYWN4dCk7Ci0KKwlyYyA9IGtlcm5mc19hZGRfb25lKGtuKTsKIAlpZiAocmMpIHsKIAkJa2VybmZzX3B1dChrbik7CiAJCXJldHVybiBFUlJfUFRSKHJjKTsKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaCBiL2ZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaAppbmRleCBlYjUzNmI3Li44YmUxM2IyIDEwMDY0NAotLS0gYS9mcy9rZXJuZnMva2VybmZzLWludGVybmFsLmgKKysrIGIvZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oCkBAIC0yNiw3ICsyNiw4IEBACiAJc3RydWN0IHNpbXBsZV94YXR0cnMJeGF0dHJzOwogfTsKIAotI2RlZmluZSBLTl9ERUFDVElWQVRFRF9CSUFTCQlJTlRfTUlOCisvKiArMSB0byBhdm9pZCB0cmlnZ2VyaW5nIG92ZXJmbG93IHdhcm5pbmcgd2hlbiBuZWdhdGluZyBpdCAqLworI2RlZmluZSBLTl9ERUFDVElWQVRFRF9CSUFTCQkoSU5UX01JTiArIDEpCiAKIC8qIEtFUk5GU19UWVBFX01BU0sgYW5kIHR5cGVzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgva2VybmZzLmggKi8KIApAQCAtNDUsMTMgKzQ2LDYgQEAKIH0KIAogLyoKLSAqIENvbnRleHQgc3RydWN0dXJlIHRvIGJlIHVzZWQgd2hpbGUgYWRkaW5nL3JlbW92aW5nIG5vZGVzLgotICovCi1zdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCB7Ci0Jc3RydWN0IGtlcm5mc19ub2RlCSpyZW1vdmVkOwotfTsKLQotLyoKICAqIG1vdW50LmMKICAqLwogc3RydWN0IGtlcm5mc19zdXBlcl9pbmZvIHsKQEAgLTcxLDYgKzY1LDcgQEAKIH07CiAjZGVmaW5lIGtlcm5mc19pbmZvKFNCKSAoKHN0cnVjdCBrZXJuZnNfc3VwZXJfaW5mbyAqKShTQi0+c19mc19pbmZvKSkKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGtlcm5mc19zb3BzOwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICprZXJuZnNfbm9kZV9jYWNoZTsKIAogLyoKQEAgLTEwMCw5ICs5NSw3IEBACiAKIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2dldF9hY3RpdmUoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiB2b2lkIGtlcm5mc19wdXRfYWN0aXZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pOwotdm9pZCBrZXJuZnNfYWRkcm1fc3RhcnQoc3RydWN0IGtlcm5mc19hZGRybV9jeHQgKmFjeHQpOwotaW50IGtlcm5mc19hZGRfb25lKHN0cnVjdCBrZXJuZnNfYWRkcm1fY3h0ICphY3h0LCBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKLXZvaWQga2VybmZzX2FkZHJtX2ZpbmlzaChzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCAqYWN4dCk7CitpbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19uZXdfbm9kZShzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwKIAkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLAogCQkJCSAgICB1bnNpZ25lZCBmbGFncyk7CmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvbW91bnQuYyBiL2ZzL2tlcm5mcy9tb3VudC5jCmluZGV4IDBmNDE1MmQuLjZhNWYwNGEgMTAwNjQ0Ci0tLSBhL2ZzL2tlcm5mcy9tb3VudC5jCisrKyBiL2ZzL2tlcm5mcy9tb3VudC5jCkBAIC0xOSwxMiArMTksNDkgQEAKIAogc3RydWN0IGttZW1fY2FjaGUgKmtlcm5mc19ub2RlX2NhY2hlOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMga2VybmZzX3NvcHMgPSB7CitzdGF0aWMgaW50IGtlcm5mc19zb3BfcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCA9IGtlcm5mc19pbmZvKHNiKS0+cm9vdDsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IHJvb3QtPnN5c2NhbGxfb3BzOworCisJaWYgKHNjb3BzICYmIHNjb3BzLT5yZW1vdW50X2ZzKQorCQlyZXR1cm4gc2NvcHMtPnJlbW91bnRfZnMocm9vdCwgZmxhZ3MsIGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtlcm5mc19zb3Bfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QgPSBrZXJuZnNfcm9vdChkZW50cnktPmRfZnNkYXRhKTsKKwlzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzICpzY29wcyA9IHJvb3QtPnN5c2NhbGxfb3BzOworCisJaWYgKHNjb3BzICYmIHNjb3BzLT5zaG93X29wdGlvbnMpCisJCXJldHVybiBzY29wcy0+c2hvd19vcHRpb25zKHNmLCByb290KTsKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMga2VybmZzX3NvcHMgPSB7CiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAogCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCiAJLmV2aWN0X2lub2RlCT0ga2VybmZzX2V2aWN0X2lub2RlLAorCisJLnJlbW91bnRfZnMJPSBrZXJuZnNfc29wX3JlbW91bnRfZnMsCisJLnNob3dfb3B0aW9ucwk9IGtlcm5mc19zb3Bfc2hvd19vcHRpb25zLAogfTsKIAorLyoqCisgKiBrZXJuZnNfcm9vdF9mcm9tX3NiIC0gZGV0ZXJtaW5lIGtlcm5mc19yb290IGFzc29jaWF0ZWQgd2l0aCBhIHN1cGVyX2Jsb2NrCisgKiBAc2I6IHRoZSBzdXBlcl9ibG9jayBpbiBxdWVzdGlvbgorICoKKyAqIFJldHVybiB0aGUga2VybmZzX3Jvb3QgYXNzb2NpYXRlZCB3aXRoIEBzYi4gIElmIEBzYiBpcyBub3QgYSBrZXJuZnMgb25lLAorICogJU5VTEwgaXMgcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX3Jvb3RfZnJvbV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmIChzYi0+c19vcCA9PSAma2VybmZzX3NvcHMpCisJCXJldHVybiBrZXJuZnNfaW5mbyhzYiktPnJvb3Q7CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbnQga2VybmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3Qga2VybmZzX3N1cGVyX2luZm8gKmluZm8gPSBrZXJuZnNfaW5mbyhzYik7CmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvc3ltbGluay5jIGIvZnMva2VybmZzL3N5bWxpbmsuYwppbmRleCA0ZDQ1NzA1Li44YTE5ODg5IDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvc3ltbGluay5jCisrKyBiL2ZzL2tlcm5mcy9zeW1saW5rLmMKQEAgLTI3LDcgKzI3LDYgQEAKIAkJCQkgICAgICAgc3RydWN0IGtlcm5mc19ub2RlICp0YXJnZXQpCiB7CiAJc3RydWN0IGtlcm5mc19ub2RlICprbjsKLQlzdHJ1Y3Qga2VybmZzX2FkZHJtX2N4dCBhY3h0OwogCWludCBlcnJvcjsKIAogCWtuID0ga2VybmZzX25ld19ub2RlKHBhcmVudCwgbmFtZSwgU19JRkxOS3xTX0lSV1hVR08sIEtFUk5GU19MSU5LKTsKQEAgLTM5LDEwICszOCw3IEBACiAJa24tPnN5bWxpbmsudGFyZ2V0X2tuID0gdGFyZ2V0OwogCWtlcm5mc19nZXQodGFyZ2V0KTsJLyogcmVmIG93bmVkIGJ5IHN5bWxpbmsgKi8KIAotCWtlcm5mc19hZGRybV9zdGFydCgmYWN4dCk7Ci0JZXJyb3IgPSBrZXJuZnNfYWRkX29uZSgmYWN4dCwga24pOwotCWtlcm5mc19hZGRybV9maW5pc2goJmFjeHQpOwotCisJZXJyb3IgPSBrZXJuZnNfYWRkX29uZShrbik7CiAJaWYgKCFlcnJvcikKIAkJcmV0dXJuIGtuOwogCmRpZmYgLS1naXQgYS9mcy9tb3VudC5oIGIvZnMvbW91bnQuaAppbmRleCBhMTc0NThjLi5iMjllNDJmIDEwMDY0NAotLS0gYS9mcy9tb3VudC5oCisrKyBiL2ZzL21vdW50LmgKQEAgLTE5LDEzICsxOSwxMyBAQAogfTsKIAogc3RydWN0IG1vdW50cG9pbnQgewotCXN0cnVjdCBsaXN0X2hlYWQgbV9oYXNoOworCXN0cnVjdCBobGlzdF9ub2RlIG1faGFzaDsKIAlzdHJ1Y3QgZGVudHJ5ICptX2RlbnRyeTsKIAlpbnQgbV9jb3VudDsKIH07CiAKIHN0cnVjdCBtb3VudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBtbnRfaGFzaDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBtbnRfaGFzaDsKIAlzdHJ1Y3QgbW91bnQgKm1udF9wYXJlbnQ7CiAJc3RydWN0IGRlbnRyeSAqbW50X21vdW50cG9pbnQ7CiAJc3RydWN0IHZmc21vdW50IG1udDsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDJmNzMwZWYuLjRiNDkxYjQgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTEwOSw3ICsxMTA5LDcgQEAKIAkJCXJldHVybiBmYWxzZTsKIAogCQlpZiAoIWRfbW91bnRwb2ludChwYXRoLT5kZW50cnkpKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gdHJ1ZTsKIAogCQltb3VudGVkID0gX19sb29rdXBfbW50KHBhdGgtPm1udCwgcGF0aC0+ZGVudHJ5KTsKIAkJaWYgKCFtb3VudGVkKQpAQCAtMTEyNSwyMCArMTEyNSw3IEBACiAJCSAqLwogCQkqaW5vZGUgPSBwYXRoLT5kZW50cnktPmRfaW5vZGU7CiAJfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBmb2xsb3dfbW91bnRfcmN1KHN0cnVjdCBuYW1laWRhdGEgKm5kKQotewotCXdoaWxlIChkX21vdW50cG9pbnQobmQtPnBhdGguZGVudHJ5KSkgewotCQlzdHJ1Y3QgbW91bnQgKm1vdW50ZWQ7Ci0JCW1vdW50ZWQgPSBfX2xvb2t1cF9tbnQobmQtPnBhdGgubW50LCBuZC0+cGF0aC5kZW50cnkpOwotCQlpZiAoIW1vdW50ZWQpCi0JCQlicmVhazsKLQkJbmQtPnBhdGgubW50ID0gJm1vdW50ZWQtPm1udDsKLQkJbmQtPnBhdGguZGVudHJ5ID0gbW91bnRlZC0+bW50Lm1udF9yb290OwotCQluZC0+c2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmQtPnBhdGguZGVudHJ5LT5kX3NlcSk7Ci0JfQorCXJldHVybiByZWFkX3NlcXJldHJ5KCZtb3VudF9sb2NrLCBuZC0+bV9zZXEpOwogfQogCiBzdGF0aWMgaW50IGZvbGxvd19kb3Rkb3RfcmN1KHN0cnVjdCBuYW1laWRhdGEgKm5kKQpAQCAtMTE2Niw3ICsxMTUzLDE3IEBACiAJCQlicmVhazsKIAkJbmQtPnNlcSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5kLT5wYXRoLmRlbnRyeS0+ZF9zZXEpOwogCX0KLQlmb2xsb3dfbW91bnRfcmN1KG5kKTsKKwl3aGlsZSAoZF9tb3VudHBvaW50KG5kLT5wYXRoLmRlbnRyeSkpIHsKKwkJc3RydWN0IG1vdW50ICptb3VudGVkOworCQltb3VudGVkID0gX19sb29rdXBfbW50KG5kLT5wYXRoLm1udCwgbmQtPnBhdGguZGVudHJ5KTsKKwkJaWYgKCFtb3VudGVkKQorCQkJYnJlYWs7CisJCW5kLT5wYXRoLm1udCA9ICZtb3VudGVkLT5tbnQ7CisJCW5kLT5wYXRoLmRlbnRyeSA9IG1vdW50ZWQtPm1udC5tbnRfcm9vdDsKKwkJbmQtPnNlcSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5kLT5wYXRoLmRlbnRyeS0+ZF9zZXEpOworCQlpZiAoIXJlYWRfc2VxcmV0cnkoJm1vdW50X2xvY2ssIG5kLT5tX3NlcSkpCisJCQlnb3RvIGZhaWxlZDsKKwl9CiAJbmQtPmlub2RlID0gbmQtPnBhdGguZGVudHJ5LT5kX2lub2RlOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IDIyZTUzNjcuLjJmZmM1YTIgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0yMywxMSArMjMsMzQgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19ucy5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgInBub2RlLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2RlZmluZSBIQVNIX1NISUZUIGlsb2cyKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSkKLSNkZWZpbmUgSEFTSF9TSVpFICgxVUwgPDwgSEFTSF9TSElGVCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbV9oYXNoX21hc2sgX19yZWFkX21vc3RseTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbV9oYXNoX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgaW50IG1wX2hhc2hfbWFzayBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIGludCBtcF9oYXNoX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyBfX2luaXRkYXRhIHVuc2lnbmVkIGxvbmcgbWhhc2hfZW50cmllczsKK3N0YXRpYyBpbnQgX19pbml0IHNldF9taGFzaF9lbnRyaWVzKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cikKKwkJcmV0dXJuIDA7CisJbWhhc2hfZW50cmllcyA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJnN0ciwgMCk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJtaGFzaF9lbnRyaWVzPSIsIHNldF9taGFzaF9lbnRyaWVzKTsKKworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyBtcGhhc2hfZW50cmllczsKK3N0YXRpYyBpbnQgX19pbml0IHNldF9tcGhhc2hfZW50cmllcyhjaGFyICpzdHIpCit7CisJaWYgKCFzdHIpCisJCXJldHVybiAwOworCW1waGFzaF9lbnRyaWVzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm1waGFzaF9lbnRyaWVzPSIsIHNldF9tcGhhc2hfZW50cmllcyk7CiAKIHN0YXRpYyBpbnQgZXZlbnQ7CiBzdGF0aWMgREVGSU5FX0lEQShtbnRfaWRfaWRhKTsKQEAgLTM2LDggKzU5LDggQEAKIHN0YXRpYyBpbnQgbW50X2lkX3N0YXJ0ID0gMDsKIHN0YXRpYyBpbnQgbW50X2dyb3VwX3N0YXJ0ID0gMTsKIAotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50X2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Owotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cG9pbnRfaGFzaHRhYmxlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKm1vdW50X2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICptb3VudHBvaW50X2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptbnRfY2FjaGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKG5hbWVzcGFjZV9zZW0pOwogCkBAIC01NSwxMiArNzgsMTkgQEAKICAqLwogX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NFUUxPQ0sobW91bnRfbG9jayk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBobGlzdF9oZWFkICptX2hhc2goc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcCA9ICgodW5zaWduZWQgbG9uZyltbnQgLyBMMV9DQUNIRV9CWVRFUyk7CiAJdG1wICs9ICgodW5zaWduZWQgbG9uZylkZW50cnkgLyBMMV9DQUNIRV9CWVRFUyk7Ci0JdG1wID0gdG1wICsgKHRtcCA+PiBIQVNIX1NISUZUKTsKLQlyZXR1cm4gdG1wICYgKEhBU0hfU0laRSAtIDEpOworCXRtcCA9IHRtcCArICh0bXAgPj4gbV9oYXNoX3NoaWZ0KTsKKwlyZXR1cm4gJm1vdW50X2hhc2h0YWJsZVt0bXAgJiBtX2hhc2hfbWFza107Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhsaXN0X2hlYWQgKm1wX2hhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgdG1wID0gKCh1bnNpZ25lZCBsb25nKWRlbnRyeSAvIEwxX0NBQ0hFX0JZVEVTKTsKKwl0bXAgPSB0bXAgKyAodG1wID4+IG1wX2hhc2hfc2hpZnQpOworCXJldHVybiAmbW91bnRwb2ludF9oYXNodGFibGVbdG1wICYgbXBfaGFzaF9tYXNrXTsKIH0KIAogLyoKQEAgLTE4Nyw3ICsyMTcsNyBAQAogCQltbnQtPm1udF93cml0ZXJzID0gMDsKICNlbmRpZgogCi0JCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9oYXNoKTsKKwkJSU5JVF9ITElTVF9OT0RFKCZtbnQtPm1udF9oYXNoKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2NoaWxkKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X21vdW50cyk7CiAJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9saXN0KTsKQEAgLTU3NSwxMCArNjA1LDEwIEBACiAgKi8KIHN0cnVjdCBtb3VudCAqX19sb29rdXBfbW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9IG1vdW50X2hhc2h0YWJsZSArIGhhc2gobW50LCBkZW50cnkpOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gbV9oYXNoKG1udCwgZGVudHJ5KTsKIAlzdHJ1Y3QgbW91bnQgKnA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCBoZWFkLCBtbnRfaGFzaCkKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocCwgaGVhZCwgbW50X2hhc2gpCiAJCWlmICgmcC0+bW50X3BhcmVudC0+bW50ID09IG1udCAmJiBwLT5tbnRfbW91bnRwb2ludCA9PSBkZW50cnkpCiAJCQlyZXR1cm4gcDsKIAlyZXR1cm4gTlVMTDsKQEAgLTU5MCwxMyArNjIwLDE3IEBACiAgKi8KIHN0cnVjdCBtb3VudCAqX19sb29rdXBfbW50X2xhc3Qoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gbW91bnRfaGFzaHRhYmxlICsgaGFzaChtbnQsIGRlbnRyeSk7Ci0Jc3RydWN0IG1vdW50ICpwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHAsIGhlYWQsIG1udF9oYXNoKQotCQlpZiAoJnAtPm1udF9wYXJlbnQtPm1udCA9PSBtbnQgJiYgcC0+bW50X21vdW50cG9pbnQgPT0gZGVudHJ5KQotCQkJcmV0dXJuIHA7Ci0JcmV0dXJuIE5VTEw7CisJc3RydWN0IG1vdW50ICpwLCAqcmVzOworCXJlcyA9IHAgPSBfX2xvb2t1cF9tbnQobW50LCBkZW50cnkpOworCWlmICghcCkKKwkJZ290byBvdXQ7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocCwgbW50X2hhc2gpIHsKKwkJaWYgKCZwLT5tbnRfcGFyZW50LT5tbnQgIT0gbW50IHx8IHAtPm1udF9tb3VudHBvaW50ICE9IGRlbnRyeSkKKwkJCWJyZWFrOworCQlyZXMgPSBwOworCX0KK291dDoKKwlyZXR1cm4gcmVzOwogfQogCiAvKgpAQCAtNjMzLDExICs2NjcsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBtb3VudHBvaW50ICpuZXdfbW91bnRwb2ludChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY2hhaW4gPSBtb3VudHBvaW50X2hhc2h0YWJsZSArIGhhc2goTlVMTCwgZGVudHJ5KTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW4gPSBtcF9oYXNoKGRlbnRyeSk7CiAJc3RydWN0IG1vdW50cG9pbnQgKm1wOwogCWludCByZXQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1wLCBjaGFpbiwgbV9oYXNoKSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkobXAsIGNoYWluLCBtX2hhc2gpIHsKIAkJaWYgKG1wLT5tX2RlbnRyeSA9PSBkZW50cnkpIHsKIAkJCS8qIG1pZ2h0IGJlIHdvcnRoIGEgV0FSTl9PTigpICovCiAJCQlpZiAoZF91bmxpbmtlZChkZW50cnkpKQpAQCAtNjU5LDcgKzY5Myw3IEBACiAKIAltcC0+bV9kZW50cnkgPSBkZW50cnk7CiAJbXAtPm1fY291bnQgPSAxOwotCWxpc3RfYWRkKCZtcC0+bV9oYXNoLCBjaGFpbik7CisJaGxpc3RfYWRkX2hlYWQoJm1wLT5tX2hhc2gsIGNoYWluKTsKIAlyZXR1cm4gbXA7CiB9CiAKQEAgLTY3MCw3ICs3MDQsNyBAQAogCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAkJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfTU9VTlRFRDsKIAkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQkJbGlzdF9kZWwoJm1wLT5tX2hhc2gpOworCQlobGlzdF9kZWwoJm1wLT5tX2hhc2gpOwogCQlrZnJlZShtcCk7CiAJfQogfQpAQCAtNzEyLDcgKzc0Niw3IEBACiAJbW50LT5tbnRfcGFyZW50ID0gbW50OwogCW1udC0+bW50X21vdW50cG9pbnQgPSBtbnQtPm1udC5tbnRfcm9vdDsKIAlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9jaGlsZCk7Ci0JbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7CisJaGxpc3RfZGVsX2luaXRfcmN1KCZtbnQtPm1udF9oYXNoKTsKIAlwdXRfbW91bnRwb2ludChtbnQtPm1udF9tcCk7CiAJbW50LT5tbnRfbXAgPSBOVUxMOwogfQpAQCAtNzM5LDE1ICs3NzMsMTQgQEAKIAkJCXN0cnVjdCBtb3VudHBvaW50ICptcCkKIHsKIAltbnRfc2V0X21vdW50cG9pbnQocGFyZW50LCBtcCwgbW50KTsKLQlsaXN0X2FkZF90YWlsKCZtbnQtPm1udF9oYXNoLCBtb3VudF9oYXNodGFibGUgKwotCQkJaGFzaCgmcGFyZW50LT5tbnQsIG1wLT5tX2RlbnRyeSkpOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmbW50LT5tbnRfaGFzaCwgbV9oYXNoKCZwYXJlbnQtPm1udCwgbXAtPm1fZGVudHJ5KSk7CiAJbGlzdF9hZGRfdGFpbCgmbW50LT5tbnRfY2hpbGQsICZwYXJlbnQtPm1udF9tb3VudHMpOwogfQogCiAvKgogICogdmZzbW91bnQgbG9jayBtdXN0IGJlIGhlbGQgZm9yIHdyaXRlCiAgKi8KLXN0YXRpYyB2b2lkIGNvbW1pdF90cmVlKHN0cnVjdCBtb3VudCAqbW50KQorc3RhdGljIHZvaWQgY29tbWl0X3RyZWUoc3RydWN0IG1vdW50ICptbnQsIHN0cnVjdCBtb3VudCAqc2hhZG93cykKIHsKIAlzdHJ1Y3QgbW91bnQgKnBhcmVudCA9IG1udC0+bW50X3BhcmVudDsKIAlzdHJ1Y3QgbW91bnQgKm07CkBAIC03NjIsOCArNzk1LDExIEBACiAKIAlsaXN0X3NwbGljZSgmaGVhZCwgbi0+bGlzdC5wcmV2KTsKIAotCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2hhc2gsIG1vdW50X2hhc2h0YWJsZSArCi0JCQkJaGFzaCgmcGFyZW50LT5tbnQsIG1udC0+bW50X21vdW50cG9pbnQpKTsKKwlpZiAoc2hhZG93cykKKwkJaGxpc3RfYWRkX2FmdGVyX3JjdSgmc2hhZG93cy0+bW50X2hhc2gsICZtbnQtPm1udF9oYXNoKTsKKwllbHNlCisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmbW50LT5tbnRfaGFzaCwKKwkJCQltX2hhc2goJnBhcmVudC0+bW50LCBtbnQtPm1udF9tb3VudHBvaW50KSk7CiAJbGlzdF9hZGRfdGFpbCgmbW50LT5tbnRfY2hpbGQsICZwYXJlbnQtPm1udF9tb3VudHMpOwogCXRvdWNoX21udF9uYW1lc3BhY2Uobik7CiB9CkBAIC0xMTUzLDI2ICsxMTg5LDI4IEBACiAKIEVYUE9SVF9TWU1CT0wobWF5X3Vtb3VudCk7CiAKLXN0YXRpYyBMSVNUX0hFQUQodW5tb3VudGVkKTsJLyogcHJvdGVjdGVkIGJ5IG5hbWVzcGFjZV9zZW0gKi8KK3N0YXRpYyBITElTVF9IRUFEKHVubW91bnRlZCk7CS8qIHByb3RlY3RlZCBieSBuYW1lc3BhY2Vfc2VtICovCiAKIHN0YXRpYyB2b2lkIG5hbWVzcGFjZV91bmxvY2sodm9pZCkKIHsKIAlzdHJ1Y3QgbW91bnQgKm1udDsKLQlMSVNUX0hFQUQoaGVhZCk7CisJc3RydWN0IGhsaXN0X2hlYWQgaGVhZCA9IHVubW91bnRlZDsKIAotCWlmIChsaWtlbHkobGlzdF9lbXB0eSgmdW5tb3VudGVkKSkpIHsKKwlpZiAobGlrZWx5KGhsaXN0X2VtcHR5KCZoZWFkKSkpIHsKIAkJdXBfd3JpdGUoJm5hbWVzcGFjZV9zZW0pOwogCQlyZXR1cm47CiAJfQogCi0JbGlzdF9zcGxpY2VfaW5pdCgmdW5tb3VudGVkLCAmaGVhZCk7CisJaGVhZC5maXJzdC0+cHByZXYgPSAmaGVhZC5maXJzdDsKKwlJTklUX0hMSVNUX0hFQUQoJnVubW91bnRlZCk7CisKIAl1cF93cml0ZSgmbmFtZXNwYWNlX3NlbSk7CiAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmaGVhZCkpIHsKLQkJbW50ID0gbGlzdF9maXJzdF9lbnRyeSgmaGVhZCwgc3RydWN0IG1vdW50LCBtbnRfaGFzaCk7Ci0JCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2hhc2gpOworCXdoaWxlICghaGxpc3RfZW1wdHkoJmhlYWQpKSB7CisJCW1udCA9IGhsaXN0X2VudHJ5KGhlYWQuZmlyc3QsIHN0cnVjdCBtb3VudCwgbW50X2hhc2gpOworCQlobGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7CiAJCWlmIChtbnQtPm1udF9leF9tb3VudHBvaW50Lm1udCkKIAkJCXBhdGhfcHV0KCZtbnQtPm1udF9leF9tb3VudHBvaW50KTsKIAkJbW50cHV0KCZtbnQtPm1udCk7CkBAIC0xMTkzLDE2ICsxMjMxLDE5IEBACiAgKi8KIHZvaWQgdW1vdW50X3RyZWUoc3RydWN0IG1vdW50ICptbnQsIGludCBob3cpCiB7Ci0JTElTVF9IRUFEKHRtcF9saXN0KTsKKwlITElTVF9IRUFEKHRtcF9saXN0KTsKIAlzdHJ1Y3QgbW91bnQgKnA7CisJc3RydWN0IG1vdW50ICpsYXN0ID0gTlVMTDsKIAotCWZvciAocCA9IG1udDsgcDsgcCA9IG5leHRfbW50KHAsIG1udCkpCi0JCWxpc3RfbW92ZSgmcC0+bW50X2hhc2gsICZ0bXBfbGlzdCk7CisJZm9yIChwID0gbW50OyBwOyBwID0gbmV4dF9tbnQocCwgbW50KSkgeworCQlobGlzdF9kZWxfaW5pdF9yY3UoJnAtPm1udF9oYXNoKTsKKwkJaGxpc3RfYWRkX2hlYWQoJnAtPm1udF9oYXNoLCAmdG1wX2xpc3QpOworCX0KIAogCWlmIChob3cpCiAJCXByb3BhZ2F0ZV91bW91bnQoJnRtcF9saXN0KTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnRtcF9saXN0LCBtbnRfaGFzaCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0bXBfbGlzdCwgbW50X2hhc2gpIHsKIAkJbGlzdF9kZWxfaW5pdCgmcC0+bW50X2V4cGlyZSk7CiAJCWxpc3RfZGVsX2luaXQoJnAtPm1udF9saXN0KTsKIAkJX190b3VjaF9tbnRfbmFtZXNwYWNlKHAtPm1udF9ucyk7CkBAIC0xMjIwLDggKzEyNjEsMTMgQEAKIAkJCXAtPm1udF9tcCA9IE5VTEw7CiAJCX0KIAkJY2hhbmdlX21udF9wcm9wYWdhdGlvbihwLCBNU19QUklWQVRFKTsKKwkJbGFzdCA9IHA7CiAJfQotCWxpc3Rfc3BsaWNlKCZ0bXBfbGlzdCwgJnVubW91bnRlZCk7CisJaWYgKGxhc3QpIHsKKwkJbGFzdC0+bW50X2hhc2gubmV4dCA9IHVubW91bnRlZC5maXJzdDsKKwkJdW5tb3VudGVkLmZpcnN0ID0gdG1wX2xpc3QuZmlyc3Q7CisJCXVubW91bnRlZC5maXJzdC0+cHByZXYgPSAmdW5tb3VudGVkLmZpcnN0OworCX0KIH0KIAogc3RhdGljIHZvaWQgc2hyaW5rX3N1Ym1vdW50cyhzdHJ1Y3QgbW91bnQgKm1udCk7CkBAIC0xNjA1LDI0ICsxNjUxLDIzIEBACiAJCQlzdHJ1Y3QgbW91bnRwb2ludCAqZGVzdF9tcCwKIAkJCXN0cnVjdCBwYXRoICpwYXJlbnRfcGF0aCkKIHsKLQlMSVNUX0hFQUQodHJlZV9saXN0KTsKKwlITElTVF9IRUFEKHRyZWVfbGlzdCk7CiAJc3RydWN0IG1vdW50ICpjaGlsZCwgKnA7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJaW50IGVycjsKIAogCWlmIChJU19NTlRfU0hBUkVEKGRlc3RfbW50KSkgewogCQllcnIgPSBpbnZlbnRfZ3JvdXBfaWRzKHNvdXJjZV9tbnQsIHRydWUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7Ci0JfQotCWVyciA9IHByb3BhZ2F0ZV9tbnQoZGVzdF9tbnQsIGRlc3RfbXAsIHNvdXJjZV9tbnQsICZ0cmVlX2xpc3QpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2NsZWFudXBfaWRzOwotCi0JbG9ja19tb3VudF9oYXNoKCk7Ci0KLQlpZiAoSVNfTU5UX1NIQVJFRChkZXN0X21udCkpIHsKKwkJZXJyID0gcHJvcGFnYXRlX21udChkZXN0X21udCwgZGVzdF9tcCwgc291cmNlX21udCwgJnRyZWVfbGlzdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbGVhbnVwX2lkczsKKwkJbG9ja19tb3VudF9oYXNoKCk7CiAJCWZvciAocCA9IHNvdXJjZV9tbnQ7IHA7IHAgPSBuZXh0X21udChwLCBzb3VyY2VfbW50KSkKIAkJCXNldF9tbnRfc2hhcmVkKHApOworCX0gZWxzZSB7CisJCWxvY2tfbW91bnRfaGFzaCgpOwogCX0KIAlpZiAocGFyZW50X3BhdGgpIHsKIAkJZGV0YWNoX21udChzb3VyY2VfbW50LCBwYXJlbnRfcGF0aCk7CkBAIC0xNjMwLDIwICsxNjc1LDIyIEBACiAJCXRvdWNoX21udF9uYW1lc3BhY2Uoc291cmNlX21udC0+bW50X25zKTsKIAl9IGVsc2UgewogCQltbnRfc2V0X21vdW50cG9pbnQoZGVzdF9tbnQsIGRlc3RfbXAsIHNvdXJjZV9tbnQpOwotCQljb21taXRfdHJlZShzb3VyY2VfbW50KTsKKwkJY29tbWl0X3RyZWUoc291cmNlX21udCwgTlVMTCk7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxkLCBwLCAmdHJlZV9saXN0LCBtbnRfaGFzaCkgewotCQlsaXN0X2RlbF9pbml0KCZjaGlsZC0+bW50X2hhc2gpOwotCQljb21taXRfdHJlZShjaGlsZCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGlsZCwgbiwgJnRyZWVfbGlzdCwgbW50X2hhc2gpIHsKKwkJc3RydWN0IG1vdW50ICpxOworCQlobGlzdF9kZWxfaW5pdCgmY2hpbGQtPm1udF9oYXNoKTsKKwkJcSA9IF9fbG9va3VwX21udF9sYXN0KCZjaGlsZC0+bW50X3BhcmVudC0+bW50LAorCQkJCSAgICAgIGNoaWxkLT5tbnRfbW91bnRwb2ludCk7CisJCWNvbW1pdF90cmVlKGNoaWxkLCBxKTsKIAl9CiAJdW5sb2NrX21vdW50X2hhc2goKTsKIAogCXJldHVybiAwOwogCiAgb3V0X2NsZWFudXBfaWRzOgotCWlmIChJU19NTlRfU0hBUkVEKGRlc3RfbW50KSkKLQkJY2xlYW51cF9ncm91cF9pZHMoc291cmNlX21udCwgTlVMTCk7CisJY2xlYW51cF9ncm91cF9pZHMoc291cmNlX21udCwgTlVMTCk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0yNzc3LDE4ICsyODI0LDI0IEBACiAJbW50X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoIm1udF9jYWNoZSIsIHNpemVvZihzdHJ1Y3QgbW91bnQpLAogCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOIHwgU0xBQl9QQU5JQywgTlVMTCk7CiAKLQltb3VudF9oYXNodGFibGUgPSAoc3RydWN0IGxpc3RfaGVhZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKLQltb3VudHBvaW50X2hhc2h0YWJsZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworCW1vdW50X2hhc2h0YWJsZSA9IGFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJNb3VudC1jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSwKKwkJCQltaGFzaF9lbnRyaWVzLCAxOSwKKwkJCQkwLAorCQkJCSZtX2hhc2hfc2hpZnQsICZtX2hhc2hfbWFzaywgMCwgMCk7CisJbW91bnRwb2ludF9oYXNodGFibGUgPSBhbGxvY19sYXJnZV9zeXN0ZW1faGFzaCgiTW91bnRwb2ludC1jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSwKKwkJCQltcGhhc2hfZW50cmllcywgMTksCisJCQkJMCwKKwkJCQkmbXBfaGFzaF9zaGlmdCwgJm1wX2hhc2hfbWFzaywgMCwgMCk7CiAKIAlpZiAoIW1vdW50X2hhc2h0YWJsZSB8fCAhbW91bnRwb2ludF9oYXNodGFibGUpCiAJCXBhbmljKCJGYWlsZWQgdG8gYWxsb2NhdGUgbW91bnQgaGFzaCB0YWJsZVxuIik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJNb3VudC1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6ICVsdVxuIiwgSEFTSF9TSVpFKTsKLQotCWZvciAodSA9IDA7IHUgPCBIQVNIX1NJWkU7IHUrKykKLQkJSU5JVF9MSVNUX0hFQUQoJm1vdW50X2hhc2h0YWJsZVt1XSk7Ci0JZm9yICh1ID0gMDsgdSA8IEhBU0hfU0laRTsgdSsrKQotCQlJTklUX0xJU1RfSEVBRCgmbW91bnRwb2ludF9oYXNodGFibGVbdV0pOworCWZvciAodSA9IDA7IHUgPD0gbV9oYXNoX21hc2s7IHUrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZtb3VudF9oYXNodGFibGVbdV0pOworCWZvciAodSA9IDA7IHUgPD0gbXBfaGFzaF9tYXNrOyB1KyspCisJCUlOSVRfSExJU1RfSEVBRCgmbW91bnRwb2ludF9oYXNodGFibGVbdV0pOwogCiAJa2VybmZzX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggMDE3ZDNjYi4uNmQ3YmUzZiAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC00NDksNiArNDQ5LDcgQEAKIAlmaF9sb2NrKGZocCk7CiAJaG9zdF9lcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFwLCBOVUxMKTsKIAlmaF91bmxvY2soZmhwKTsKKwllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAKIG91dF9wdXRfd3JpdGVfYWNjZXNzOgogCWlmIChzaXplX2NoYW5nZSkKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jIGIvZnMvb2NmczIvc3RhY2tnbHVlLmMKaW5kZXggMTMyNGU2Ni4uY2E1Y2UxNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3RhY2tnbHVlLmMKKysrIGIvZnMvb2NmczIvc3RhY2tnbHVlLmMKQEAgLTM0Niw3ICszNDYsOSBAQAogCiAJc3RybGNweShuZXdfY29ubi0+Y2NfbmFtZSwgZ3JvdXAsIEdST1VQX05BTUVfTUFYICsgMSk7CiAJbmV3X2Nvbm4tPmNjX25hbWVsZW4gPSBncm91cGxlbjsKLQlzdHJsY3B5KG5ld19jb25uLT5jY19jbHVzdGVyX25hbWUsIGNsdXN0ZXJfbmFtZSwgQ0xVU1RFUl9OQU1FX01BWCArIDEpOworCWlmIChjbHVzdGVyX25hbWVfbGVuKQorCQlzdHJsY3B5KG5ld19jb25uLT5jY19jbHVzdGVyX25hbWUsIGNsdXN0ZXJfbmFtZSwKKwkJCUNMVVNURVJfTkFNRV9NQVggKyAxKTsKIAluZXdfY29ubi0+Y2NfY2x1c3Rlcl9uYW1lX2xlbiA9IGNsdXN0ZXJfbmFtZV9sZW47CiAJbmV3X2Nvbm4tPmNjX3JlY292ZXJ5X2hhbmRsZXIgPSByZWNvdmVyeV9oYW5kbGVyOwogCW5ld19jb25uLT5jY19yZWNvdmVyeV9kYXRhID0gcmVjb3ZlcnlfZGF0YTsKZGlmZiAtLWdpdCBhL2ZzL3Bub2RlLmMgYi9mcy9wbm9kZS5jCmluZGV4IGM3MjIxYmIuLjg4Mzk2ZGYgMTAwNjQ0Ci0tLSBhL2ZzL3Bub2RlLmMKKysrIGIvZnMvcG5vZGUuYwpAQCAtMjIwLDE0ICsyMjAsMTQgQEAKICAqIEB0cmVlX2xpc3QgOiBsaXN0IG9mIGhlYWRzIG9mIHRyZWVzIHRvIGJlIGF0dGFjaGVkLgogICovCiBpbnQgcHJvcGFnYXRlX21udChzdHJ1Y3QgbW91bnQgKmRlc3RfbW50LCBzdHJ1Y3QgbW91bnRwb2ludCAqZGVzdF9tcCwKLQkJICAgIHN0cnVjdCBtb3VudCAqc291cmNlX21udCwgc3RydWN0IGxpc3RfaGVhZCAqdHJlZV9saXN0KQorCQkgICAgc3RydWN0IG1vdW50ICpzb3VyY2VfbW50LCBzdHJ1Y3QgaGxpc3RfaGVhZCAqdHJlZV9saXN0KQogewogCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucyA9IGN1cnJlbnQtPm5zcHJveHktPm1udF9ucy0+dXNlcl9uczsKIAlzdHJ1Y3QgbW91bnQgKm0sICpjaGlsZDsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbW91bnQgKnByZXZfZGVzdF9tbnQgPSBkZXN0X21udDsKIAlzdHJ1Y3QgbW91bnQgKnByZXZfc3JjX21udCAgPSBzb3VyY2VfbW50OwotCUxJU1RfSEVBRCh0bXBfbGlzdCk7CisJSExJU1RfSEVBRCh0bXBfbGlzdCk7CiAKIAlmb3IgKG0gPSBwcm9wYWdhdGlvbl9uZXh0KGRlc3RfbW50LCBkZXN0X21udCk7IG07CiAJCQltID0gcHJvcGFnYXRpb25fbmV4dChtLCBkZXN0X21udCkpIHsKQEAgLTI0NiwyNyArMjQ2LDI5IEBACiAJCWNoaWxkID0gY29weV90cmVlKHNvdXJjZSwgc291cmNlLT5tbnQubW50X3Jvb3QsIHR5cGUpOwogCQlpZiAoSVNfRVJSKGNoaWxkKSkgewogCQkJcmV0ID0gUFRSX0VSUihjaGlsZCk7Ci0JCQlsaXN0X3NwbGljZSh0cmVlX2xpc3QsIHRtcF9saXN0LnByZXYpOworCQkJdG1wX2xpc3QgPSAqdHJlZV9saXN0OworCQkJdG1wX2xpc3QuZmlyc3QtPnBwcmV2ID0gJnRtcF9saXN0LmZpcnN0OworCQkJSU5JVF9ITElTVF9IRUFEKHRyZWVfbGlzdCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCiAJCWlmIChpc19zdWJkaXIoZGVzdF9tcC0+bV9kZW50cnksIG0tPm1udC5tbnRfcm9vdCkpIHsKIAkJCW1udF9zZXRfbW91bnRwb2ludChtLCBkZXN0X21wLCBjaGlsZCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bW50X2hhc2gsIHRyZWVfbGlzdCk7CisJCQlobGlzdF9hZGRfaGVhZCgmY2hpbGQtPm1udF9oYXNoLCB0cmVlX2xpc3QpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcGFyZW50IG1vdW50IHdhcyBiaW5kIG1vdW50ZWQKIAkJCSAqIG9uIHNvbWUgc3ViZGlyZWN0b3J5IG9mIGEgc2hhcmVkL3NsYXZlIG1vdW50LgogCQkJICovCi0JCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bW50X2hhc2gsICZ0bXBfbGlzdCk7CisJCQlobGlzdF9hZGRfaGVhZCgmY2hpbGQtPm1udF9oYXNoLCAmdG1wX2xpc3QpOwogCQl9CiAJCXByZXZfZGVzdF9tbnQgPSBtOwogCQlwcmV2X3NyY19tbnQgID0gY2hpbGQ7CiAJfQogb3V0OgogCWxvY2tfbW91bnRfaGFzaCgpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wX2xpc3QpKSB7Ci0JCWNoaWxkID0gbGlzdF9maXJzdF9lbnRyeSgmdG1wX2xpc3QsIHN0cnVjdCBtb3VudCwgbW50X2hhc2gpOworCXdoaWxlICghaGxpc3RfZW1wdHkoJnRtcF9saXN0KSkgeworCQljaGlsZCA9IGhsaXN0X2VudHJ5KHRtcF9saXN0LmZpcnN0LCBzdHJ1Y3QgbW91bnQsIG1udF9oYXNoKTsKIAkJdW1vdW50X3RyZWUoY2hpbGQsIDApOwogCX0KIAl1bmxvY2tfbW91bnRfaGFzaCgpOwpAQCAtMzM4LDggKzM0MCwxMCBAQAogCQkgKiB1bW91bnQgdGhlIGNoaWxkIG9ubHkgaWYgdGhlIGNoaWxkIGhhcyBubwogCQkgKiBvdGhlciBjaGlsZHJlbgogCQkgKi8KLQkJaWYgKGNoaWxkICYmIGxpc3RfZW1wdHkoJmNoaWxkLT5tbnRfbW91bnRzKSkKLQkJCWxpc3RfbW92ZV90YWlsKCZjaGlsZC0+bW50X2hhc2gsICZtbnQtPm1udF9oYXNoKTsKKwkJaWYgKGNoaWxkICYmIGxpc3RfZW1wdHkoJmNoaWxkLT5tbnRfbW91bnRzKSkgeworCQkJaGxpc3RfZGVsX2luaXRfcmN1KCZjaGlsZC0+bW50X2hhc2gpOworCQkJaGxpc3RfYWRkX2JlZm9yZV9yY3UoJmNoaWxkLT5tbnRfaGFzaCwgJm1udC0+bW50X2hhc2gpOworCQl9CiAJfQogfQogCkBAIC0zNTAsMTEgKzM1NCwxMSBAQAogICoKICAqIHZmc21vdW50IGxvY2sgbXVzdCBiZSBoZWxkIGZvciB3cml0ZQogICovCi1pbnQgcHJvcGFnYXRlX3Vtb3VudChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoraW50IHByb3BhZ2F0ZV91bW91bnQoc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IG1vdW50ICptbnQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1udCwgbGlzdCwgbW50X2hhc2gpCisJaGxpc3RfZm9yX2VhY2hfZW50cnkobW50LCBsaXN0LCBtbnRfaGFzaCkKIAkJX19wcm9wYWdhdGVfdW1vdW50KG1udCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9wbm9kZS5oIGIvZnMvcG5vZGUuaAppbmRleCA1OWU3ZWRhLi5mYzI4YTI3IDEwMDY0NAotLS0gYS9mcy9wbm9kZS5oCisrKyBiL2ZzL3Bub2RlLmgKQEAgLTM2LDggKzM2LDggQEAKIAogdm9pZCBjaGFuZ2VfbW50X3Byb3BhZ2F0aW9uKHN0cnVjdCBtb3VudCAqLCBpbnQpOwogaW50IHByb3BhZ2F0ZV9tbnQoc3RydWN0IG1vdW50ICosIHN0cnVjdCBtb3VudHBvaW50ICosIHN0cnVjdCBtb3VudCAqLAotCQlzdHJ1Y3QgbGlzdF9oZWFkICopOwotaW50IHByb3BhZ2F0ZV91bW91bnQoc3RydWN0IGxpc3RfaGVhZCAqKTsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKik7CitpbnQgcHJvcGFnYXRlX3Vtb3VudChzdHJ1Y3QgaGxpc3RfaGVhZCAqKTsKIGludCBwcm9wYWdhdGVfbW91bnRfYnVzeShzdHJ1Y3QgbW91bnQgKiwgaW50KTsKIHZvaWQgbW50X3JlbGVhc2VfZ3JvdXBfaWQoc3RydWN0IG1vdW50ICopOwogaW50IGdldF9kb21pbmF0aW5nX2lkKHN0cnVjdCBtb3VudCAqbW50LCBjb25zdCBzdHJ1Y3QgcGF0aCAqcm9vdCk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3N0YXQuYyBiL2ZzL3Byb2Mvc3RhdC5jCmluZGV4IDZmNTk5YzYuLjlkMjMxZTkgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvc3RhdC5jCisrKyBiL2ZzL3Byb2Mvc3RhdC5jCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxbnIuaD4KLSNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKICNpZm5kZWYgYXJjaF9pcnFfc3RhdF9jcHUKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdXB0aW1lLmMgYi9mcy9wcm9jL3VwdGltZS5jCmluZGV4IDcxNDFiOGQuLjMzZGU1NjcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdXB0aW1lLmMKKysrIGIvZnMvcHJvYy91cHRpbWUuYwpAQCAtNSw3ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY3B1dGltZS5oPgogCiBzdGF0aWMgaW50IHVwdGltZV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewpkaWZmIC0tZ2l0IGEvZnMvcmVhZF93cml0ZS5jIGIvZnMvcmVhZF93cml0ZS5jCmluZGV4IDU0ZTE5YjkuLjMxYzZlZmEgMTAwNjQ0Ci0tLSBhL2ZzL3JlYWRfd3JpdGUuYworKysgYi9mcy9yZWFkX3dyaXRlLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCQl1bnNpZ25lZCBpbnQsIHdoZW5jZSkKIHsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCBmZCBmID0gZmRnZXQoZmQpOworCXN0cnVjdCBmZCBmID0gZmRnZXRfcG9zKGZkKTsKIAlsb2ZmX3Qgb2Zmc2V0OwogCiAJaWYgKCFmLmZpbGUpCkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJCXJldHZhbCA9IDA7CiAJfQogb3V0X3B1dGY6Ci0JZmRwdXQoZik7CisJZmRwdXRfcG9zKGYpOwogCXJldHVybiByZXR2YWw7CiB9CiAjZW5kaWYKQEAgLTk5NCw5ICs5OTQsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLUNPTVBBVF9TWVNDQUxMX0RFRklORTQocHJlYWR2NjQsIHVuc2lnbmVkIGxvbmcsIGZkLAotCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLHZlYywKLQkJdW5zaWduZWQgbG9uZywgdmxlbiwgbG9mZl90LCBwb3MpCitzdGF0aWMgbG9uZyBfX2NvbXBhdF9zeXNfcHJlYWR2NjQodW5zaWduZWQgbG9uZyBmZCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsCisJCQkJICB1bnNpZ25lZCBsb25nIHZsZW4sIGxvZmZfdCBwb3MpCiB7CiAJc3RydWN0IGZkIGY7CiAJc3NpemVfdCByZXQ7CkBAIC0xMDEzLDEyICsxMDEzLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFJFQURWNjQKK0NPTVBBVF9TWVNDQUxMX0RFRklORTQocHJlYWR2NjQsIHVuc2lnbmVkIGxvbmcsIGZkLAorCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLHZlYywKKwkJdW5zaWduZWQgbG9uZywgdmxlbiwgbG9mZl90LCBwb3MpCit7CisJcmV0dXJuIF9fY29tcGF0X3N5c19wcmVhZHY2NChmZCwgdmVjLCB2bGVuLCBwb3MpOworfQorI2VuZGlmCisKIENPTVBBVF9TWVNDQUxMX0RFRklORTUocHJlYWR2LCBjb21wYXRfdWxvbmdfdCwgZmQsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICosdmVjLAogCQljb21wYXRfdWxvbmdfdCwgdmxlbiwgdTMyLCBwb3NfbG93LCB1MzIsIHBvc19oaWdoKQogewogCWxvZmZfdCBwb3MgPSAoKGxvZmZfdClwb3NfaGlnaCA8PCAzMikgfCBwb3NfbG93OwotCXJldHVybiBjb21wYXRfc3lzX3ByZWFkdjY0KGZkLCB2ZWMsIHZsZW4sIHBvcyk7CisKKwlyZXR1cm4gX19jb21wYXRfc3lzX3ByZWFkdjY0KGZkLCB2ZWMsIHZsZW4sIHBvcyk7CiB9CiAKIHN0YXRpYyBzaXplX3QgY29tcGF0X3dyaXRldihzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTEwNjEsOSArMTA3MSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotQ09NUEFUX1NZU0NBTExfREVGSU5FNChwd3JpdGV2NjQsIHVuc2lnbmVkIGxvbmcsIGZkLAotCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLHZlYywKLQkJdW5zaWduZWQgbG9uZywgdmxlbiwgbG9mZl90LCBwb3MpCitzdGF0aWMgbG9uZyBfX2NvbXBhdF9zeXNfcHdyaXRldjY0KHVuc2lnbmVkIGxvbmcgZmQsCisJCQkJICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnZlYywKKwkJCQkgICB1bnNpZ25lZCBsb25nIHZsZW4sIGxvZmZfdCBwb3MpCiB7CiAJc3RydWN0IGZkIGY7CiAJc3NpemVfdCByZXQ7CkBAIC0xMDgwLDEyICsxMDkwLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFdSSVRFVjY0CitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KHB3cml0ZXY2NCwgdW5zaWduZWQgbG9uZywgZmQsCisJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICosdmVjLAorCQl1bnNpZ25lZCBsb25nLCB2bGVuLCBsb2ZmX3QsIHBvcykKK3sKKwlyZXR1cm4gX19jb21wYXRfc3lzX3B3cml0ZXY2NChmZCwgdmVjLCB2bGVuLCBwb3MpOworfQorI2VuZGlmCisKIENPTVBBVF9TWVNDQUxMX0RFRklORTUocHdyaXRldiwgY29tcGF0X3Vsb25nX3QsIGZkLAogCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLHZlYywKIAkJY29tcGF0X3Vsb25nX3QsIHZsZW4sIHUzMiwgcG9zX2xvdywgdTMyLCBwb3NfaGlnaCkKIHsKIAlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcG9zX2hpZ2ggPDwgMzIpIHwgcG9zX2xvdzsKLQlyZXR1cm4gY29tcGF0X3N5c19wd3JpdGV2NjQoZmQsIHZlYywgdmxlbiwgcG9zKTsKKworCXJldHVybiBfX2NvbXBhdF9zeXNfcHdyaXRldjY0KGZkLCB2ZWMsIHZsZW4sIHBvcyk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvS2NvbmZpZyBiL2ZzL3N5c2ZzL0tjb25maWcKaW5kZXggOGM0MWZlYS4uYjI3NTYwMSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvS2NvbmZpZworKysgYi9mcy9zeXNmcy9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFNZU0ZTCiAJYm9vbCAic3lzZnMgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgaWYgRVhQRVJUCiAJZGVmYXVsdCB5CisJc2VsZWN0IEtFUk5GUwogCWhlbHAKIAlUaGUgc3lzZnMgZmlsZXN5c3RlbSBpcyBhIHZpcnR1YWwgZmlsZXN5c3RlbSB0aGF0IHRoZSBrZXJuZWwgdXNlcyB0bwogCWV4cG9ydCBpbnRlcm5hbCBrZXJuZWwgb2JqZWN0cywgdGhlaXIgYXR0cmlidXRlcywgYW5kIHRoZWlyCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IGVlMGQ3NjEuLjBiNDVmZjQgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2Rpci5jCisrKyBiL2ZzL3N5c2ZzL2Rpci5jCkBAIC0xOSwzOSArMTksMTggQEAKIAogREVGSU5FX1NQSU5MT0NLKHN5c2ZzX3N5bWxpbmtfdGFyZ2V0X2xvY2spOwogCi0vKioKLSAqCXN5c2ZzX3BhdGhuYW1lIC0gcmV0dXJuIGZ1bGwgcGF0aCB0byBzeXNmcyBkaXJlbnQKLSAqCUBrbjoga2VybmZzX25vZGUgd2hvc2UgcGF0aCB3ZSB3YW50Ci0gKglAcGF0aDogY2FsbGVyIGFsbG9jYXRlZCBidWZmZXIgb2Ygc2l6ZSBQQVRIX01BWAotICoKLSAqCUdpdmVzIHRoZSBuYW1lICIvIiB0byB0aGUgc3lzZnNfcm9vdCBlbnRyeTsgYW55IHBhdGggcmV0dXJuZWQKLSAqCWlzIHJlbGF0aXZlIHRvIHdoZXJldmVyIHN5c2ZzIGlzIG1vdW50ZWQuCi0gKi8KLXN0YXRpYyBjaGFyICpzeXNmc19wYXRobmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBjaGFyICpwYXRoKQotewotCWlmIChrbi0+cGFyZW50KSB7Ci0JCXN5c2ZzX3BhdGhuYW1lKGtuLT5wYXJlbnQsIHBhdGgpOwotCQlzdHJsY2F0KHBhdGgsICIvIiwgUEFUSF9NQVgpOwotCX0KLQlzdHJsY2F0KHBhdGgsIGtuLT5uYW1lLCBQQVRIX01BWCk7Ci0JcmV0dXJuIHBhdGg7Ci19Ci0KIHZvaWQgc3lzZnNfd2Fybl9kdXAoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JY2hhciAqcGF0aDsKKwljaGFyICpidWYsICpwYXRoID0gTlVMTDsKIAotCXBhdGggPSBremFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZiAocGF0aCkgewotCQlzeXNmc19wYXRobmFtZShwYXJlbnQsIHBhdGgpOwotCQlzdHJsY2F0KHBhdGgsICIvIiwgUEFUSF9NQVgpOwotCQlzdHJsY2F0KHBhdGgsIG5hbWUsIFBBVEhfTUFYKTsKLQl9CisJYnVmID0ga3phbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZikKKwkJcGF0aCA9IGtlcm5mc19wYXRoKHBhcmVudCwgYnVmLCBQQVRIX01BWCk7CiAKLQlXQVJOKDEsIEtFUk5fV0FSTklORyAic3lzZnM6IGNhbm5vdCBjcmVhdGUgZHVwbGljYXRlIGZpbGVuYW1lICclcydcbiIsCi0JICAgICBwYXRoID8gcGF0aCA6IG5hbWUpOworCVdBUk4oMSwgS0VSTl9XQVJOSU5HICJzeXNmczogY2Fubm90IGNyZWF0ZSBkdXBsaWNhdGUgZmlsZW5hbWUgJyVzLyVzJ1xuIiwKKwkgICAgIHBhdGgsIG5hbWUpOwogCi0Ja2ZyZWUocGF0aCk7CisJa2ZyZWUoYnVmKTsKIH0KIAogLyoqCkBAIC0xMjIsOSArMTAxLDEzIEBACiBpbnQgc3lzZnNfcmVuYW1lX2Rpcl9ucyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3QgY2hhciAqbmV3X25hbWUsCiAJCQljb25zdCB2b2lkICpuZXdfbnMpCiB7Ci0Jc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrb2JqLT5zZC0+cGFyZW50OworCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50OworCWludCByZXQ7CiAKLQlyZXR1cm4ga2VybmZzX3JlbmFtZV9ucyhrb2JqLT5zZCwgcGFyZW50LCBuZXdfbmFtZSwgbmV3X25zKTsKKwlwYXJlbnQgPSBrZXJuZnNfZ2V0X3BhcmVudChrb2JqLT5zZCk7CisJcmV0ID0ga2VybmZzX3JlbmFtZV9ucyhrb2JqLT5zZCwgcGFyZW50LCBuZXdfbmFtZSwgbmV3X25zKTsKKwlrZXJuZnNfcHV0KHBhcmVudCk7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IHN5c2ZzX21vdmVfZGlyX25zKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29iamVjdCAqbmV3X3BhcmVudF9rb2JqLApAQCAtMTMzLDcgKzExNiw2IEBACiAJc3RydWN0IGtlcm5mc19ub2RlICprbiA9IGtvYmotPnNkOwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudDsKIAotCUJVR19PTigha24tPnBhcmVudCk7CiAJbmV3X3BhcmVudCA9IG5ld19wYXJlbnRfa29iaiAmJiBuZXdfcGFyZW50X2tvYmotPnNkID8KIAkJbmV3X3BhcmVudF9rb2JqLT5zZCA6IHN5c2ZzX3Jvb3Rfa247CiAKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwppbmRleCA4MTBjZjZlLi4xYjhiOTFiIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0zNzIsNiArMzcyLDI5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZmlsZV9ucyk7CiAKKy8qKgorICogc3lzZnNfcmVtb3ZlX2ZpbGVfc2VsZiAtIHJlbW92ZSBhbiBvYmplY3QgYXR0cmlidXRlIGZyb20gaXRzIG93biBtZXRob2QKKyAqIEBrb2JqOiBvYmplY3Qgd2UncmUgYWN0aW5nIGZvcgorICogQGF0dHI6IGF0dHJpYnV0ZSBkZXNjcmlwdG9yCisgKgorICogU2VlIGtlcm5mc19yZW1vdmVfc2VsZigpIGZvciBkZXRhaWxzLgorICovCitib29sIHN5c2ZzX3JlbW92ZV9maWxlX3NlbGYoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIpCit7CisJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrb2JqLT5zZDsKKwlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuOworCWJvb2wgcmV0OworCisJa24gPSBrZXJuZnNfZmluZF9hbmRfZ2V0KHBhcmVudCwgYXR0ci0+bmFtZSk7CisJaWYgKFdBUk5fT05fT05DRSgha24pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXQgPSBrZXJuZnNfcmVtb3ZlX3NlbGYoa24pOworCisJa2VybmZzX3B1dChrbik7CisJcmV0dXJuIHJldDsKK30KKwogdm9pZCBzeXNmc19yZW1vdmVfZmlsZXMoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKipwdHIpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwppbmRleCA2YjU3OTM4Li5hYTA0MDY4IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9ncm91cC5jCisrKyBiL2ZzL3N5c2ZzL2dyb3VwLmMKQEAgLTcwLDggKzcwLDExIEBACiAJaWYgKGdycC0+YmluX2F0dHJzKSB7CiAJCWZvciAoYmluX2F0dHIgPSBncnAtPmJpbl9hdHRyczsgKmJpbl9hdHRyOyBiaW5fYXR0cisrKSB7CiAJCQlpZiAodXBkYXRlKQotCQkJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZShrb2JqLCAqYmluX2F0dHIpOwotCQkJZXJyb3IgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoa29iaiwgKmJpbl9hdHRyKTsKKwkJCQlrZXJuZnNfcmVtb3ZlX2J5X25hbWUocGFyZW50LAorCQkJCQkJKCpiaW5fYXR0ciktPmF0dHIubmFtZSk7CisJCQllcnJvciA9IHN5c2ZzX2FkZF9maWxlX21vZGVfbnMocGFyZW50LAorCQkJCQkmKCpiaW5fYXR0ciktPmF0dHIsIHRydWUsCisJCQkJCSgqYmluX2F0dHIpLT5hdHRyLm1vZGUsIE5VTEwpOwogCQkJaWYgKGVycm9yKQogCQkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9tb3VudC5jIGIvZnMvc3lzZnMvbW91bnQuYwppbmRleCAzZWFmNWM2Li5hNjZhZDYxIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9tb3VudC5jCisrKyBiL2ZzL3N5c2ZzL21vdW50LmMKQEAgLTYzLDcgKzYzLDcgQEAKIHsKIAlpbnQgZXJyOwogCi0Jc3lzZnNfcm9vdCA9IGtlcm5mc19jcmVhdGVfcm9vdChOVUxMLCBOVUxMKTsKKwlzeXNmc19yb290ID0ga2VybmZzX2NyZWF0ZV9yb290KE5VTEwsIDAsIE5VTEwpOwogCWlmIChJU19FUlIoc3lzZnNfcm9vdCkpCiAJCXJldHVybiBQVFJfRVJSKHN5c2ZzX3Jvb3QpOwogCmRpZmYgLS1naXQgYS9mcy90aW1lcmZkLmMgYi9mcy90aW1lcmZkLmMKaW5kZXggOTI5MzEyMS4uMDAxMzE0MiAxMDA2NDQKLS0tIGEvZnMvdGltZXJmZC5jCisrKyBiL2ZzL3RpbWVyZmQuYwpAQCAtMzE3LDYgKzMxNyw3IEBACiAJICAgIChjbG9ja2lkICE9IENMT0NLX01PTk9UT05JQyAmJgogCSAgICAgY2xvY2tpZCAhPSBDTE9DS19SRUFMVElNRSAmJgogCSAgICAgY2xvY2tpZCAhPSBDTE9DS19SRUFMVElNRV9BTEFSTSAmJgorCSAgICAgY2xvY2tpZCAhPSBDTE9DS19CT09UVElNRSAmJgogCSAgICAgY2xvY2tpZCAhPSBDTE9DS19CT09UVElNRV9BTEFSTSkpCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9udW1hLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9udW1hLmgKaW5kZXggNDUxODIzYy4uOTRhMzdjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfbnVtYS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX251bWEuaApAQCAtMTMsNyArMTMsNiBAQAogCiBleHRlcm4gaW50IHB4bV90b19ub2RlKGludCk7CiBleHRlcm4gaW50IG5vZGVfdG9fcHhtKGludCk7Ci1leHRlcm4gdm9pZCBfX2FjcGlfbWFwX3B4bV90b19ub2RlKGludCwgaW50KTsKIGV4dGVybiBpbnQgYWNwaV9tYXBfcHhtX3RvX25vZGUoaW50KTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIGFjcGlfc3JhdF9yZXZpc2lvbjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvY29uc3RfaHdlaWdodC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvY29uc3RfaHdlaWdodC5oCmluZGV4IGZhMmE1MGIuLjBhN2UwNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL2NvbnN0X2h3ZWlnaHQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9jb25zdF9od2VpZ2h0LmgKQEAgLTUsMTQgKzUsMTUgQEAKICAqIENvbXBpbGUgdGltZSB2ZXJzaW9ucyBvZiBfX2FyY2hfaHdlaWdodE4oKQogICovCiAjZGVmaW5lIF9fY29uc3RfaHdlaWdodDgodykJCVwKLSAgICAgICgJKCEhKCh3KSAmICgxVUxMIDw8IDApKSkgKwlcCi0JKCEhKCh3KSAmICgxVUxMIDw8IDEpKSkgKwlcCi0JKCEhKCh3KSAmICgxVUxMIDw8IDIpKSkgKwlcCi0JKCEhKCh3KSAmICgxVUxMIDw8IDMpKSkgKwlcCi0JKCEhKCh3KSAmICgxVUxMIDw8IDQpKSkgKwlcCi0JKCEhKCh3KSAmICgxVUxMIDw8IDUpKSkgKwlcCi0JKCEhKCh3KSAmICgxVUxMIDw8IDYpKSkgKwlcCi0JKCEhKCh3KSAmICgxVUxMIDw8IDcpKSkJKQorCSgodW5zaWduZWQgaW50KQkJCVwKKwkgKCghISgodykgJiAoMVVMTCA8PCAwKSkpICsJXAorCSAgKCEhKCh3KSAmICgxVUxMIDw8IDEpKSkgKwlcCisJICAoISEoKHcpICYgKDFVTEwgPDwgMikpKSArCVwKKwkgICghISgodykgJiAoMVVMTCA8PCAzKSkpICsJXAorCSAgKCEhKCh3KSAmICgxVUxMIDw8IDQpKSkgKwlcCisJICAoISEoKHcpICYgKDFVTEwgPDwgNSkpKSArCVwKKwkgICghISgodykgJiAoMVVMTCA8PCA2KSkpICsJXAorCSAgKCEhKCh3KSAmICgxVUxMIDw8IDcpKSkpKQogCiAjZGVmaW5lIF9fY29uc3RfaHdlaWdodDE2KHcpIChfX2NvbnN0X2h3ZWlnaHQ4KHcpICArIF9fY29uc3RfaHdlaWdodDgoKHcpICA+PiA4ICkpCiAjZGVmaW5lIF9fY29uc3RfaHdlaWdodDMyKHcpIChfX2NvbnN0X2h3ZWlnaHQxNih3KSArIF9fY29uc3RfaHdlaWdodDE2KCh3KSA+PiAxNikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWVfamlmZmllcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX2ppZmZpZXMuaAppbmRleCAyNzJlY2JhLi5kNWNiNzhmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX2ppZmZpZXMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWVfamlmZmllcy5oCkBAIC0xNSw4ICsxNSwxMCBAQAogCiAKIC8qCi0gKiBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIGNwdXRpbWUKKyAqIENvbnZlcnQgbmFub3NlY29uZHMgPC0+IGNwdXRpbWUKICAqLworI2RlZmluZSBjcHV0aW1lX3RvX25zZWNzKF9fY3QpCQlcCisJamlmZmllc190b19uc2VjcyhjcHV0aW1lX3RvX2ppZmZpZXMoX19jdCkpCiAjZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWU2NChfX25zZWMpCVwKIAlqaWZmaWVzNjRfdG9fY3B1dGltZTY0KG5zZWNzX3RvX2ppZmZpZXM2NChfX25zZWMpKQogI2RlZmluZSBuc2Vjc190b19jcHV0aW1lKF9fbnNlYykJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lX25zZWNzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWVfbnNlY3MuaAppbmRleCAyYzllNjJjLi40ZTgxNzYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWVfbnNlY3MuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWVfbnNlY3MuaApAQCAtNDQsNyArNDQsMTAgQEAKIC8qCiAgKiBDb252ZXJ0IGNwdXRpbWUgPC0+IG5hbm9zZWNvbmRzCiAgKi8KLSNkZWZpbmUgbnNlY3NfdG9fY3B1dGltZShfX25zZWNzKQkoKF9fZm9yY2UgdTY0KShfX25zZWNzKSkKKyNkZWZpbmUgY3B1dGltZV90b19uc2VjcyhfX2N0KQkJXAorCShfX2ZvcmNlIHU2NCkoX19jdCkKKyNkZWZpbmUgbnNlY3NfdG9fY3B1dGltZShfX25zZWNzKQlcCisJKF9fZm9yY2UgY3B1dGltZV90KShfX25zZWNzKQogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL21jc19zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tY3Nfc3BpbmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGNkNGZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tY3Nfc3BpbmxvY2suaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fQVNNX01DU19TUElOTE9DS19ICisjZGVmaW5lIF9fQVNNX01DU19TUElOTE9DS19ICisKKy8qCisgKiBBcmNoaXRlY3R1cmVzIGNhbiBkZWZpbmUgdGhlaXIgb3duOgorICoKKyAqICAgYXJjaF9tY3Nfc3Bpbl9sb2NrX2NvbnRlbmRlZChsKQorICogICBhcmNoX21jc19zcGluX3VubG9ja19jb250ZW5kZWQobCkKKyAqCisgKiBTZWUga2VybmVsL2xvY2tpbmcvbWNzX3NwaW5sb2NrLmMuCisgKi8KKworI2VuZGlmIC8qIF9fQVNNX01DU19TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCmluZGV4IDM0YzdiZGMuLjFlYzA4YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCkBAIC0xOTMsNiArMTkzLDE5IEBACiB9CiAjZW5kaWYKIAorI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVfVU5VU0VECisvKgorICogU29tZSBhcmNoaXRlY3R1cmVzIHByb3ZpZGUgZmFjaWxpdGllcyB0byB2aXJ0dWFsaXphdGlvbiBndWVzdHMKKyAqIHNvIHRoYXQgdGhleSBjYW4gZmxhZyBhbGxvY2F0ZWQgcGFnZXMgYXMgdW51c2VkLiBUaGlzIGFsbG93cyB0aGUKKyAqIGhvc3QgdG8gdHJhbnNwYXJlbnRseSByZWNsYWltIHVudXNlZCBwYWdlcy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiB3aGV0aGVyIHRoZSBwdGUncyBwYWdlIGlzIHVudXNlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX3VudXNlZChwdGVfdCBwdGUpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogI2lmbmRlZiBfX0hBVkVfQVJDSF9QTURfU0FNRQogI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQogc3RhdGljIGlubGluZSBpbnQgcG1kX3NhbWUocG1kX3QgcG1kX2EsIHBtZF90IHBtZF9iKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9yd3NlbS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9yd3NlbS5oCmluZGV4IGJiMWUyY2QuLmQ0OGJmNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcndzZW0uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3J3c2VtLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fUE9XRVJQQ19SV1NFTV9ICi0jZGVmaW5lIF9BU01fUE9XRVJQQ19SV1NFTV9ICisjaWZuZGVmIF9BU01fR0VORVJJQ19SV1NFTV9ICisjZGVmaW5lIF9BU01fR0VORVJJQ19SV1NFTV9ICiAKICNpZm5kZWYgX0xJTlVYX1JXU0VNX0gKICNlcnJvciAiUGxlYXNlIGRvbid0IGluY2x1ZGUgPGFzbS9yd3NlbS5oPiBkaXJlY3RseSwgdXNlIDxsaW51eC9yd3NlbS5oPiBpbnN0ZWFkLiIKQEAgLTgsNyArOCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAvKgotICogUi9XIHNlbWFwaG9yZXMgZm9yIFBQQyB1c2luZyB0aGUgc3R1ZmYgaW4gbGliL3J3c2VtLmMuCisgKiBSL1cgc2VtYXBob3JlcyBvcmlnaW5hbGx5IGZvciBQUEMgdXNpbmcgdGhlIHN0dWZmIGluIGxpYi9yd3NlbS5jLgogICogQWRhcHRlZCBsYXJnZWx5IGZyb20gaW5jbHVkZS9hc20taTM4Ni9yd3NlbS5oCiAgKiBieSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4uCiAgKi8KQEAgLTE2LDcgKzE2LDcgQEAKIC8qCiAgKiB0aGUgc2VtYXBob3JlIGRlZmluaXRpb24KICAqLwotI2lmZGVmIENPTkZJR19QUEM2NAorI2lmZGVmIENPTkZJR182NEJJVAogIyBkZWZpbmUgUldTRU1fQUNUSVZFX01BU0sJCTB4ZmZmZmZmZmZMCiAjZWxzZQogIyBkZWZpbmUgUldTRU1fQUNUSVZFX01BU0sJCTB4MDAwMGZmZmZMCkBAIC0xMjksNCArMTI5LDQgQEAKIH0KIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZgkvKiBfQVNNX1BPV0VSUENfUldTRU1fSCAqLworI2VuZGlmCS8qIF9BU01fR0VORVJJQ19SV1NFTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgtbWljYmlhcy5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LW1pY2JpYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNiNzcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LW1pY2JpYXMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX19EVF9UTFYzMjBBSUMzMVhYX01JQ0JJQVNfSAorI2RlZmluZSBfX0RUX1RMVjMyMEFJQzMxWFhfTUlDQklBU19ICisKKyNkZWZpbmUgTUlDQklBU18yXzBWCQkxCisjZGVmaW5lIE1JQ0JJQVNfMl81VgkJMgorI2RlZmluZSBNSUNCSUFTX0FWRERWCQkzCisKKyNlbmRpZiAvKiBfX0RUX1RMVjMyMEFJQzMxWFhfTUlDQklBU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3NwbWkvc3BtaS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9zcG1pL3NwbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFlMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9zcG1pL3NwbWkuaApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19EVF9CSU5ESU5HU19TUE1JX0gKKyNkZWZpbmUgX19EVF9CSU5ESU5HU19TUE1JX0gKKworI2RlZmluZSBTUE1JX1VTSUQJMAorI2RlZmluZSBTUE1JX0dTSUQJMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggNmExNWRkZC4uN2E4ZjJjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTI2MywxNCArMjYzLDkgQEAKIGV4dGVybiB2b2lkIGFjcGlfb3NpX3NldHVwKGNoYXIgKnN0cik7CiAKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi1pbnQgYWNwaV9nZXRfcHhtKGFjcGlfaGFuZGxlIGhhbmRsZSk7Ci1pbnQgYWNwaV9nZXRfbm9kZShhY3BpX2hhbmRsZSAqaGFuZGxlKTsKK2ludCBhY3BpX2dldF9ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9nZXRfcHhtKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IGFjcGlfZ2V0X25vZGUoYWNwaV9oYW5kbGUgKmhhbmRsZSkKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfZ2V0X25vZGUoYWNwaV9oYW5kbGUgaGFuZGxlKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9haGNpX3BsYXRmb3JtLmggYi9pbmNsdWRlL2xpbnV4L2FoY2lfcGxhdGZvcm0uaAppbmRleCA3M2EyNTAwLi4xZjE2ZDUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FoY2lfcGxhdGZvcm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2FoY2lfcGxhdGZvcm0uaApAQCAtMTksMTUgKzE5LDM3IEBACiAKIHN0cnVjdCBkZXZpY2U7CiBzdHJ1Y3QgYXRhX3BvcnRfaW5mbzsKK3N0cnVjdCBhaGNpX2hvc3RfcHJpdjsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CiAKKy8qCisgKiBOb3RlIGFoY2lfcGxhdGZvcm1fZGF0YSBpcyBkZXByZWNhdGVkLCBpdCBpcyBvbmx5IGtlcHQgYXJvdW5kIGZvciB1c2UKKyAqIGJ5IHRoZSBvbGQgZGE4NTAgYW5kIHNwZWFyMTN4eCBhaGNpIGNvZGUuCisgKiBOZXcgZHJpdmVycyBzaG91bGQgaW5zdGVhZCBkZWNsYXJlIHRoZWlyIG93biBwbGF0Zm9ybV9kcml2ZXIgc3RydWN0LCBhbmQKKyAqIHVzZSBhaGNpX3BsYXRmb3JtKiBmdW5jdGlvbnMgaW4gdGhlaXIgb3duIHByb2JlLCBzdXNwZW5kIGFuZCByZXN1bWUgbWV0aG9kcy4KKyAqLwogc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSB7CiAJaW50ICgqaW5pdCkoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpOwogCXZvaWQgKCpleGl0KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICphdGFfcG9ydF9pbmZvOwotCXVuc2lnbmVkIGludCBmb3JjZV9wb3J0X21hcDsKLQl1bnNpZ25lZCBpbnQgbWFza19wb3J0X21hcDsKIH07CiAKK2ludCBhaGNpX3BsYXRmb3JtX2VuYWJsZV9jbGtzKHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYpOwordm9pZCBhaGNpX3BsYXRmb3JtX2Rpc2FibGVfY2xrcyhzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KTsKK2ludCBhaGNpX3BsYXRmb3JtX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdik7Cit2b2lkIGFoY2lfcGxhdGZvcm1fZGlzYWJsZV9yZXNvdXJjZXMoc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdik7CitzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmFoY2lfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcygKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKK2ludCBhaGNpX3BsYXRmb3JtX2luaXRfaG9zdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgIHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYsCisJCQkgICAgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBpX3RlbXBsYXRlLAorCQkJICAgIHVuc2lnbmVkIGludCBmb3JjZV9wb3J0X21hcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbWFza19wb3J0X21hcCk7CisKK2ludCBhaGNpX3BsYXRmb3JtX3N1c3BlbmRfaG9zdChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGFoY2lfcGxhdGZvcm1fcmVzdW1lX2hvc3Qoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBhaGNpX3BsYXRmb3JtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBhaGNpX3BsYXRmb3JtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCiAjZW5kaWYgLyogX0FIQ0lfUExBVEZPUk1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdG1lbC1zc2MuaCBiL2luY2x1ZGUvbGludXgvYXRtZWwtc3NjLmgKaW5kZXggNjZhMGU1My4uNTcxYTEyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdG1lbC1zc2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0bWVsLXNzYy5oCkBAIC0xOCw2ICsxOCw3IEBACiAJc3RydWN0IGNsawkJKmNsazsKIAlpbnQJCQl1c2VyOwogCWludAkJCWlycTsKKwlib29sCQkJY2xrX2Zyb21fcmtfcGluOwogfTsKIAogc3RydWN0IHNzY19kZXZpY2UgKiBfX211c3RfY2hlY2sgc3NjX3JlcXVlc3QodW5zaWduZWQgaW50IHNzY19udW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRvcHMuaCBiL2luY2x1ZGUvbGludXgvYml0b3BzLmgKaW5kZXggYWJjOWNhNy4uYmU1ZmQzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCkBAIC0xOTYsNiArMTk2LDIxIEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpZm5kZWYgc2V0X21hc2tfYml0cworI2RlZmluZSBzZXRfbWFza19iaXRzKHB0ciwgX21hc2ssIF9iaXRzKQlcCisoewkJCQkJCQkJXAorCWNvbnN0IHR5cGVvZigqcHRyKSBtYXNrID0gKF9tYXNrKSwgYml0cyA9IChfYml0cyk7CVwKKwl0eXBlb2YoKnB0cikgb2xkLCBuZXc7CQkJCQlcCisJCQkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJb2xkID0gQUNDRVNTX09OQ0UoKnB0cik7CQkJXAorCQluZXcgPSAob2xkICYgfm1hc2spIHwgYml0czsJCQlcCisJfSB3aGlsZSAoY21weGNoZyhwdHIsIG9sZCwgbmV3KSAhPSBvbGQpOwkJXAorCQkJCQkJCQlcCisJbmV3OwkJCQkJCQlcCit9KQorI2VuZGlmCisKICNpZm5kZWYgZmluZF9sYXN0X2JpdAogLyoqCiAgKiBmaW5kX2xhc3RfYml0IC0gZmluZCB0aGUgbGFzdCBzZXQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGstaW9wb2xsLmggYi9pbmNsdWRlL2xpbnV4L2Jsay1pb3BvbGwuaAppbmRleCAzMDg3MzRkLi43N2FlNzdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsay1pb3BvbGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsay1pb3BvbGwuaApAQCAtNDMsNiArNDMsNCBAQAogZXh0ZXJuIHZvaWQgYmxrX2lvcG9sbF9lbmFibGUoc3RydWN0IGJsa19pb3BvbGwgKik7CiBleHRlcm4gdm9pZCBibGtfaW9wb2xsX2Rpc2FibGUoc3RydWN0IGJsa19pb3BvbGwgKik7CiAKLWV4dGVybiBpbnQgYmxrX2lvcG9sbF9lbmFibGVkOwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLW1xLmggYi9pbmNsdWRlL2xpbnV4L2Jsay1tcS5oCmluZGV4IDJmZjJlOGQuLjAxMjA0NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrLW1xLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGstbXEuaApAQCAtMTA5LDcgKzEwOSw3IEBACiAJQkxLX01RX0ZfU0hPVUxEX1NPUlQJPSAxIDw8IDEsCiAJQkxLX01RX0ZfU0hPVUxEX0lQSQk9IDEgPDwgMiwKIAotCUJMS19NUV9TX1NUT1BQRUQJPSAxIDw8IDAsCisJQkxLX01RX1NfU1RPUFBFRAk9IDAsCiAKIAlCTEtfTVFfTUFYX0RFUFRICT0gMjA0OCwKIH07CkBAIC0xMTcsNyArMTE3LDggQEAKIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpibGtfbXFfaW5pdF9xdWV1ZShzdHJ1Y3QgYmxrX21xX3JlZyAqLCB2b2lkICopOwogaW50IGJsa19tcV9yZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICopOwogdm9pZCBibGtfbXFfdW5yZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICopOwotdm9pZCBibGtfbXFfaW5pdF9jb21tYW5kcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB2b2lkICgqaW5pdCkodm9pZCAqZGF0YSwgc3RydWN0IGJsa19tcV9od19jdHggKiwgc3RydWN0IHJlcXVlc3QgKiwgdW5zaWduZWQgaW50KSwgdm9pZCAqZGF0YSk7CitpbnQgYmxrX21xX2luaXRfY29tbWFuZHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgaW50ICgqaW5pdCkodm9pZCAqZGF0YSwgc3RydWN0IGJsa19tcV9od19jdHggKiwgc3RydWN0IHJlcXVlc3QgKiwgdW5zaWduZWQgaW50KSwgdm9pZCAqZGF0YSk7Cit2b2lkIGJsa19tcV9mcmVlX2NvbW1hbmRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHZvaWQgKCpmcmVlKSh2b2lkICpkYXRhLCBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB1bnNpZ25lZCBpbnQpLCB2b2lkICpkYXRhKTsKIAogdm9pZCBibGtfbXFfZmx1c2hfcGx1Z19saXN0KHN0cnVjdCBibGtfcGx1ZyAqcGx1ZywgYm9vbCBmcm9tX3NjaGVkdWxlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggNGFmYTRmOC4uMWUxZmEzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC05OSw2ICs5OSw3IEBACiAJdW5pb24gewogCQlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSBjc2Q7CiAJCXN0cnVjdCB3b3JrX3N0cnVjdCBtcV9mbHVzaF93b3JrOworCQl1bnNpZ25lZCBsb25nIGZpZm9fdGltZTsKIAl9OwogCiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaCBiL2luY2x1ZGUvbGludXgvY2xvY2tjaGlwcy5oCmluZGV4IDQ5M2FhMDIuLjJlNGNiNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xvY2tjaGlwcy5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xvY2tjaGlwcy5oCkBAIC02Miw2ICs2MiwxMSBAQAogI2RlZmluZSBDTE9DS19FVlRfRkVBVF9EWU5JUlEJCTB4MDAwMDIwCiAjZGVmaW5lIENMT0NLX0VWVF9GRUFUX1BFUkNQVQkJMHgwMDAwNDAKIAorLyoKKyAqIENsb2NrZXZlbnQgZGV2aWNlIGlzIGJhc2VkIG9uIGEgaHJ0aW1lciBmb3IgYnJvYWRjYXN0CisgKi8KKyNkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfSFJUSU1FUgkJMHgwMDAwODAKKwogLyoqCiAgKiBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIC0gY2xvY2sgZXZlbnQgZGV2aWNlIGRlc2NyaXB0b3IKICAqIEBldmVudF9oYW5kbGVyOglBc3NpZ25lZCBieSB0aGUgZnJhbWV3b3JrIHRvIGJlIGNhbGxlZCBieSB0aGUgbG93CkBAIC04Myw2ICs4OCw3IEBACiAgKiBAbmFtZToJCXB0ciB0byBjbG9jayBldmVudCBuYW1lCiAgKiBAcmF0aW5nOgkJdmFyaWFibGUgdG8gcmF0ZSBjbG9jayBldmVudCBkZXZpY2VzCiAgKiBAaXJxOgkJSVJRIG51bWJlciAob25seSBmb3Igbm9uIENQVSBsb2NhbCBkZXZpY2VzKQorICogQGJvdW5kX29uOgkJQm91bmQgb24gQ1BVCiAgKiBAY3B1bWFzazoJCWNwdW1hc2sgdG8gaW5kaWNhdGUgZm9yIHdoaWNoIENQVXMgdGhpcyBkZXZpY2Ugd29ya3MKICAqIEBsaXN0OgkJbGlzdCBoZWFkIGZvciB0aGUgbWFuYWdlbWVudCBjb2RlCiAgKiBAb3duZXI6CQltb2R1bGUgcmVmZXJlbmNlCkBAIC0xMTMsNiArMTE5LDcgQEAKIAljb25zdCBjaGFyCQkqbmFtZTsKIAlpbnQJCQlyYXRpbmc7CiAJaW50CQkJaXJxOworCWludAkJCWJvdW5kX29uOwogCWNvbnN0IHN0cnVjdCBjcHVtYXNrCSpjcHVtYXNrOwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CkBAIC0xODAsMTUgKzE4NywxNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCkgJiYgZGVmaW5lZChDT05GSUdfVElDS19PTkVTSE9UKQorZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9ocnRpbWVyX2Jyb2FkY2FzdCh2b2lkKTsKIGV4dGVybiBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZXhwaXJlZCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9leHBpcmVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NldHVwX2hydGltZXJfYnJvYWRjYXN0KHZvaWQpIHt9OwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUwotZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpOworZXh0ZXJuIGludCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZyk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKSB7fQorc3RhdGljIGlubGluZSBpbnQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCiAjZWxzZSAvKiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRCAqLwpAQCAtMTk2LDggKzIwNSw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tldmVudHNfc3VzcGVuZCh2b2lkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGNsb2NrZXZlbnRzX3Jlc3VtZSh2b2lkKSB7fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpIHt9CitzdGF0aWMgaW5saW5lIGludCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZXhwaXJlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zZXR1cF9ocnRpbWVyX2Jyb2FkY2FzdCh2b2lkKSB7fTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCmluZGV4IDNmNDQ4YzYuLmU2NDk0MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9haW9fYWJpLmg+CS8qIGZvciBhaW9fY29udGV4dF90ICovCisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAKICNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CiAjaW5jbHVkZSA8YXNtL3NpZ2luZm8uaD4KQEAgLTI3LDYgKzI4LDkgQEAKICNkZWZpbmUgX19TQ19ERUxPVVNFKHQsdikgKCh0KSh1bnNpZ25lZCBsb25nKSh2KSkKICNlbmRpZgogCisjZGVmaW5lIENPTVBBVF9TWVNDQUxMX0RFRklORTAobmFtZSkgXAorCWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzXyMjbmFtZSh2b2lkKQorCiAjZGVmaW5lIENPTVBBVF9TWVNDQUxMX0RFRklORTEobmFtZSwgLi4uKSBcCiAgICAgICAgIENPTVBBVF9TWVNDQUxMX0RFRklORXgoMSwgXyMjbmFtZSwgX19WQV9BUkdTX18pCiAjZGVmaW5lIENPTVBBVF9TWVNDQUxMX0RFRklORTIobmFtZSwgLi4uKSBcCkBAIC02OCw2ICs3Miw4IEBACiB0eXBlZGVmIF9fY29tcGF0X3VpZDMyX3QJY29tcGF0X3VpZF90OwogdHlwZWRlZiBfX2NvbXBhdF9naWQzMl90CWNvbXBhdF9naWRfdDsKIAordHlwZWRlZgljb21wYXRfdWxvbmdfdAkJY29tcGF0X2Fpb19jb250ZXh0X3Q7CisKIHN0cnVjdCBjb21wYXRfc2VsX2FyZ19zdHJ1Y3Q7CiBzdHJ1Y3QgcnVzYWdlOwogCkBAIC0xNDEsMjYgKzE0NywyMyBAQAogfTsKIAogLyoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIHN0cmljdGx5IG9uIHN0cnVjdCBjb21wYXRfdGltZSoKLSAqLwotZXh0ZXJuIGludCBnZXRfY29tcGF0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyAqLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICopOwotZXh0ZXJuIGludCBwdXRfY29tcGF0X3RpbWVzcGVjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLAotCQkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICopOwotZXh0ZXJuIGludCBnZXRfY29tcGF0X3RpbWV2YWwoc3RydWN0IHRpbWV2YWwgKiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKik7Ci1leHRlcm4gaW50IHB1dF9jb21wYXRfdGltZXZhbChjb25zdCBzdHJ1Y3QgdGltZXZhbCAqLAotCQkJICAgICAgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqKTsKLS8qCiAgKiBUaGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiAzMi0gb3IgNjQtYml0IHNwZWNzIGRlcGVuZGluZyBvbgotICogQ09NUEFUX1VTRV82NEJJVF9USU1FLCBoZW5jZSB0aGUgdm9pZCB1c2VyIHBvaW50ZXIgYXJndW1lbnRzIGFuZCB0aGUKLSAqIG5hbWluZyBhcyBjb21wYXRfZ2V0L3B1dF8gcmF0aGVyIHRoYW4gZ2V0L3B1dF9jb21wYXRfLgorICogQ09NUEFUX1VTRV82NEJJVF9USU1FLCBoZW5jZSB0aGUgdm9pZCB1c2VyIHBvaW50ZXIgYXJndW1lbnRzLgogICovCiBleHRlcm4gaW50IGNvbXBhdF9nZXRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHZvaWQgX191c2VyICopOwogZXh0ZXJuIGludCBjb21wYXRfcHV0X3RpbWVzcGVjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLCB2b2lkIF9fdXNlciAqKTsKIGV4dGVybiBpbnQgY29tcGF0X2dldF90aW1ldmFsKHN0cnVjdCB0aW1ldmFsICosIGNvbnN0IHZvaWQgX191c2VyICopOwogZXh0ZXJuIGludCBjb21wYXRfcHV0X3RpbWV2YWwoY29uc3Qgc3RydWN0IHRpbWV2YWwgKiwgdm9pZCBfX3VzZXIgKik7CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnQgYSB0aW1lc3BlYyBpZiBuZWNlc3NhcnkgYW5kIHJldHVybnMgYSAqdXNlcgorICogc3BhY2UqIHBvaW50ZXIuICBJZiBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSwgaXQgcmV0dXJucyB0aGUKKyAqIGluaXRpYWwgcG9pbnRlci4gIE5VTEwgaXMgYSBsZWdpdGltYXRlIGFyZ3VtZW50IGFuZCB3aWxsIGFsd2F5cworICogb3V0cHV0IE5VTEwuCisgKi8KK2V4dGVybiBpbnQgY29tcGF0X2NvbnZlcnRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKiwKKwkJCQkgICBjb25zdCB2b2lkIF9fdXNlciAqKTsKKwogc3RydWN0IGNvbXBhdF9pb3ZlYyB7CiAJY29tcGF0X3VwdHJfdAlpb3ZfYmFzZTsKIAljb21wYXRfc2l6ZV90CWlvdl9sZW47CkBAIC0zMTgsNyArMzIxLDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21zZ3NuZChpbnQgbXNxaWQsIGNvbXBhdF91cHRyX3QgbXNncCwKIAkJY29tcGF0X3NzaXplX3QgbXNnc3osIGludCBtc2dmbGcpOwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbXNncmN2KGludCBtc3FpZCwgY29tcGF0X3VwdHJfdCBtc2dwLAotCQljb21wYXRfc3NpemVfdCBtc2dzeiwgbG9uZyBtc2d0eXAsIGludCBtc2dmbGcpOworCQljb21wYXRfc3NpemVfdCBtc2dzeiwgY29tcGF0X2xvbmdfdCBtc2d0eXAsIGludCBtc2dmbGcpOwogbG9uZyBjb21wYXRfc3lzX21zZ2N0bChpbnQgZmlyc3QsIGludCBzZWNvbmQsIHZvaWQgX191c2VyICp1cHRyKTsKIGxvbmcgY29tcGF0X3N5c19zaG1jdGwoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCB2b2lkIF9fdXNlciAqdXB0cik7CiBsb25nIGNvbXBhdF9zeXNfc2VtdGltZWRvcChpbnQgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICp0c2VtcywKQEAgLTMzNyw2ICszNDAsMTkgQEAKIGFzbWxpbmthZ2Ugc3NpemVfdCBjb21wYXRfc3lzX3B3cml0ZXYoY29tcGF0X3Vsb25nX3QgZmQsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsCiAJCWNvbXBhdF91bG9uZ190IHZsZW4sIHUzMiBwb3NfbG93LCB1MzIgcG9zX2hpZ2gpOworCisjaWZkZWYgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19QUkVBRFY2NAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcHJlYWR2NjQodW5zaWduZWQgbG9uZyBmZCwKKwkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnZlYywKKwkJdW5zaWduZWQgbG9uZyB2bGVuLCBsb2ZmX3QgcG9zKTsKKyNlbmRpZgorCisjaWZkZWYgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19QV1JJVEVWNjQKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3B3cml0ZXY2NCh1bnNpZ25lZCBsb25nIGZkLAorCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqdmVjLAorCQl1bnNpZ25lZCBsb25nIHZsZW4sIGxvZmZfdCBwb3MpOworI2VuZGlmCisKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2xzZWVrKHVuc2lnbmVkIGludCwgY29tcGF0X29mZl90LCB1bnNpZ25lZCBpbnQpOwogCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19leGVjdmUoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBjb25zdCBjb21wYXRfdXB0cl90IF9fdXNlciAqYXJndiwKQEAgLTQ1MSw3ICs0NjcsNyBAQAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdGltZXJmZF9nZXR0aW1lKGludCB1ZmQsCiAJCQkJICAgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqb3Rtcik7CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21vdmVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2UsCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tb3ZlX3BhZ2VzKHBpZF90IHBpZCwgY29tcGF0X3Vsb25nX3QgbnJfcGFnZXMsCiAJCQkJICAgICAgX191MzIgX191c2VyICpwYWdlcywKIAkJCQkgICAgICBjb25zdCBpbnQgX191c2VyICpub2RlcywKIAkJCQkgICAgICBpbnQgX191c2VyICpzdGF0dXMsCkBAIC00ODEsMjAgKzQ5NywyMCBAQAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnN0YXRmczY0KHVuc2lnbmVkIGludCBmZCwgY29tcGF0X3NpemVfdCBzeiwKIAkJCQkgICAgIHN0cnVjdCBjb21wYXRfc3RhdGZzNjQgX191c2VyICpidWYpOwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZmNudGw2NCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpOworCQkJCSAgIGNvbXBhdF91bG9uZ190IGFyZyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19mY250bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwkJCQkgY29tcGF0X3Vsb25nX3QgYXJnKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvX3NldHVwKHVuc2lnbmVkIG5yX3JlcXMsIHUzMiBfX3VzZXIgKmN0eDMycCk7Ci1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19pb19nZXRldmVudHMoYWlvX2NvbnRleHRfdCBjdHhfaWQsCi0JCQkJCXVuc2lnbmVkIGxvbmcgbWluX25yLAotCQkJCQl1bnNpZ25lZCBsb25nIG5yLAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzKGNvbXBhdF9haW9fY29udGV4dF90IGN0eF9pZCwKKwkJCQkJY29tcGF0X2xvbmdfdCBtaW5fbnIsCisJCQkJCWNvbXBhdF9sb25nX3QgbnIsCiAJCQkJCXN0cnVjdCBpb19ldmVudCBfX3VzZXIgKmV2ZW50cywKIAkJCQkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRpbWVvdXQpOwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfaW9fc3VibWl0KGFpb19jb250ZXh0X3QgY3R4X2lkLCBpbnQgbnIsCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19pb19zdWJtaXQoY29tcGF0X2Fpb19jb250ZXh0X3QgY3R4X2lkLCBpbnQgbnIsCiAJCQkJICAgICB1MzIgX191c2VyICppb2NiKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21vdW50KGNvbnN0IGNoYXIgX191c2VyICpkZXZfbmFtZSwKIAkJCQkgY29uc3QgY2hhciBfX3VzZXIgKmRpcl9uYW1lLAotCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnR5cGUsIGNvbXBhdF91bG9uZ190IGZsYWdzLAogCQkJCSBjb25zdCB2b2lkIF9fdXNlciAqZGF0YSk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19vbGRfcmVhZGRpcih1bnNpZ25lZCBpbnQgZmQsCiAJCQkJICAgICAgIHN0cnVjdCBjb21wYXRfb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKiwKQEAgLTUwMiw5ICs1MTgsMTEgQEAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldGRlbnRzKHVuc2lnbmVkIGludCBmZCwKIAkJCQkgICAgc3RydWN0IGNvbXBhdF9saW51eF9kaXJlbnQgX191c2VyICpkaXJlbnQsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjb3VudCk7CisjaWZkZWYgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19HRVRERU5UUzY0CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRkZW50czY0KHVuc2lnbmVkIGludCBmZCwKIAkJCQkgICAgICBzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICpkaXJlbnQsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKKyNlbmRpZgogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdm1zcGxpY2UoaW50IGZkLCBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgbnJfc2VncywgdW5zaWduZWQgaW50IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsCkBAIC01NDksOSArNTY3LDkgQEAKIAkJCQkgICAgdW5zaWduZWQgdmxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Ztc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywKIAkJCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdihpbnQgZmQsIHZvaWQgX191c2VyICpidWYsIHNpemVfdCBsZW4sCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2KGludCBmZCwgdm9pZCBfX3VzZXIgKmJ1ZiwgY29tcGF0X3NpemVfdCBsZW4sCiAJCQkJdW5zaWduZWQgZmxhZ3MpOwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdmZyb20oaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdmZyb20oaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmLCBjb21wYXRfc2l6ZV90IGxlbiwKIAkJCSAgICB1bnNpZ25lZCBmbGFncywgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqYWRkciwKIAkJCSAgICBpbnQgX191c2VyICphZGRybGVuKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3ZtbXNnKGludCBmZCwgc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqbW1zZywKQEAgLTYxNSwxNiArNjMzLDE2IEBACiAJCQkJc3RydWN0IGNvbXBhdF9zaWdpbmZvIF9fdXNlciAqdWluZm8pOwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc3lzaW5mbyhzdHJ1Y3QgY29tcGF0X3N5c2luZm8gX191c2VyICppbmZvKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgdW5zaWduZWQgbG9uZyBhcmcpOworCQkJCSBjb21wYXRfdWxvbmdfdCBhcmcpOwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnV0ZXgodTMyIF9fdXNlciAqdWFkZHIsIGludCBvcCwgdTMyIHZhbCwKIAkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnV0aW1lLCB1MzIgX191c2VyICp1YWRkcjIsCiAJCXUzMiB2YWwzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldHNvY2tvcHQoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7Ci1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19rZXhlY19sb2FkKHVuc2lnbmVkIGxvbmcgZW50cnksCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdtZW50cywKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2tleGVjX2xvYWQoY29tcGF0X3Vsb25nX3QgZW50cnksCisJCQkJICAgICAgY29tcGF0X3Vsb25nX3QgbnJfc2VnbWVudHMsCiAJCQkJICAgICAgc3RydWN0IGNvbXBhdF9rZXhlY19zZWdtZW50IF9fdXNlciAqLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQkJCSAgICAgIGNvbXBhdF91bG9uZ190IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21xX2dldHNldGF0dHIobXFkX3QgbXFkZXMsCiAJCQljb25zdCBzdHJ1Y3QgY29tcGF0X21xX2F0dHIgX191c2VyICp1X21xc3RhdCwKIAkJCXN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKnVfb21xc3RhdCk7CkBAIC02MzUsMTEgKzY1MywxMSBAQAogCQkJc3RydWN0IGNvbXBhdF9tcV9hdHRyIF9fdXNlciAqdV9hdHRyKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21xX3RpbWVkc2VuZChtcWRfdCBtcWRlcywKIAkJCWNvbnN0IGNoYXIgX191c2VyICp1X21zZ19wdHIsCi0JCQlzaXplX3QgbXNnX2xlbiwgdW5zaWduZWQgaW50IG1zZ19wcmlvLAorCQkJY29tcGF0X3NpemVfdCBtc2dfbGVuLCB1bnNpZ25lZCBpbnQgbXNnX3ByaW8sCiAJCQljb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdV9hYnNfdGltZW91dCk7CiBhc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUobXFkX3QgbXFkZXMsCiAJCQljaGFyIF9fdXNlciAqdV9tc2dfcHRyLAotCQkJc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBfX3VzZXIgKnVfbXNnX3ByaW8sCisJCQljb21wYXRfc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBfX3VzZXIgKnVfbXNnX3ByaW8sCiAJCQljb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdV9hYnNfdGltZW91dCk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zb2NrZXRjYWxsKGludCBjYWxsLCB1MzIgX191c2VyICphcmdzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3N5c2N0bChzdHJ1Y3QgY29tcGF0X3N5c2N0bF9hcmdzIF9fdXNlciAqYXJncyk7CkBAIC02NTQsMTIgKzY3MiwxMiBAQAogCiBhc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3JlYWR2KGNvbXBhdF9waWRfdCBwaWQsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpsdmVjLAotCQl1bnNpZ25lZCBsb25nIGxpb3ZjbnQsIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAotCQl1bnNpZ25lZCBsb25nIHJpb3ZjbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQljb21wYXRfdWxvbmdfdCBsaW92Y250LCBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKKwkJY29tcGF0X3Vsb25nX3QgcmlvdmNudCwgY29tcGF0X3Vsb25nX3QgZmxhZ3MpOwogYXNtbGlua2FnZSBzc2l6ZV90IGNvbXBhdF9zeXNfcHJvY2Vzc192bV93cml0ZXYoY29tcGF0X3BpZF90IHBpZCwKIAkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKmx2ZWMsCi0JCXVuc2lnbmVkIGxvbmcgbGlvdmNudCwgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnJ2ZWMsCi0JCXVuc2lnbmVkIGxvbmcgcmlvdmNudCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWNvbXBhdF91bG9uZ190IGxpb3ZjbnQsIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAorCQljb21wYXRfdWxvbmdfdCByaW92Y250LCBjb21wYXRfdWxvbmdfdCBmbGFncyk7CiAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbmRmaWxlKGludCBvdXRfZmQsIGludCBpbl9mZCwKIAkJCQkgICAgY29tcGF0X29mZl90IF9fdXNlciAqb2Zmc2V0LCBjb21wYXRfc2l6ZV90IGNvdW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmggYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCmluZGV4IGIyYjVhNDEuLmJlOWM0NzQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCisrKyBiL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKQEAgLTcxLDcgKzcxLDcgQEAKIGludCBjbl9hZGRfY2FsbGJhY2soc3RydWN0IGNiX2lkICppZCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGNuX21zZyAqLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKikpOwogdm9pZCBjbl9kZWxfY2FsbGJhY2soc3RydWN0IGNiX2lkICopOwotaW50IGNuX25ldGxpbmtfc2VuZChzdHJ1Y3QgY25fbXNnICosIHUzMiwgZ2ZwX3QpOworaW50IGNuX25ldGxpbmtfc2VuZChzdHJ1Y3QgY25fbXNnICptc2csIHUzMiBwb3J0aWQsIHUzMiBncm91cCwgZ2ZwX3QgZ2ZwX21hc2spOwogCiBpbnQgY25fcXVldWVfYWRkX2NhbGxiYWNrKHN0cnVjdCBjbl9xdWV1ZV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgc3RydWN0IGNiX2lkICppZCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1LmggYi9pbmNsdWRlL2xpbnV4L2NwdS5oCmluZGV4IDAzZTIzNWFkLi4wM2U5NjJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTQ2LDEzICs0Niw2IEBACiAjZW5kaWYKIHN0cnVjdCBub3RpZmllcl9ibG9jazsKIAotI2lmZGVmIENPTkZJR19BUkNIX0hBU19DUFVfQVVUT1BST0JFCi1leHRlcm4gaW50IGFyY2hfY3B1X3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudik7Ci1leHRlcm4gc3NpemVfdCBhcmNoX3ByaW50X2NwdV9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgICBjaGFyICpidWZwdHIpOwotI2VuZGlmCi0KIC8qCiAgKiBDUFUgbm90aWZpZXIgcHJpb3JpdGllcy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVmZWF0dXJlLmggYi9pbmNsdWRlL2xpbnV4L2NwdWZlYXR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ0ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmZWF0dXJlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBMaW5hcm8gTHRkLiA8YXJkLmJpZXNoZXV2ZWxAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9DUFVGRUFUVVJFX0gKKyNkZWZpbmUgX19MSU5VWF9DUFVGRUFUVVJFX0gKKworI2lmZGVmIENPTkZJR19HRU5FUklDX0NQVV9BVVRPUFJPQkUKKworI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisKKy8qCisgKiBNYWNyb3MgaW1wb3J0ZWQgZnJvbSA8YXNtL2NwdWZlYXR1cmUuaD46CisgKiAtIGNwdV9mZWF0dXJlKHgpCQlvcmRpbmFsIHZhbHVlIG9mIGZlYXR1cmUgY2FsbGVkICd4JworICogLSBjcHVfaGF2ZV9mZWF0dXJlKHUzMiBuKQl3aGV0aGVyIGZlYXR1cmUgI24gaXMgYXZhaWxhYmxlCisgKiAtIE1BWF9DUFVfRkVBVFVSRVMJCXVwcGVyIGJvdW5kIGZvciBmZWF0dXJlIG9yZGluYWwgdmFsdWVzCisgKiBPcHRpb25hbDoKKyAqIC0gQ1BVX0ZFQVRVUkVfVFlQRUZNVAlmb3JtYXQgc3RyaW5nIGZyYWdtZW50IGZvciBwcmludGluZyB0aGUgY3B1IHR5cGUKKyAqIC0gQ1BVX0ZFQVRVUkVfVFlQRVZBTAlzZXQgb2YgdmFsdWVzIG1hdGNoaW5nIHRoZSBmb3JtYXQgc3RyaW5nIGFib3ZlCisgKi8KKworI2lmbmRlZiBDUFVfRkVBVFVSRV9UWVBFRk1UCisjZGVmaW5lIENQVV9GRUFUVVJFX1RZUEVGTVQJIiVzIgorI2VuZGlmCisKKyNpZm5kZWYgQ1BVX0ZFQVRVUkVfVFlQRVZBTAorI2RlZmluZSBDUFVfRkVBVFVSRV9UWVBFVkFMCUVMRl9QTEFURk9STQorI2VuZGlmCisKKy8qCisgKiBVc2UgbW9kdWxlX2NwdV9mZWF0dXJlX21hdGNoKGZlYXR1cmUsIG1vZHVsZV9pbml0X2Z1bmN0aW9uKSB0bworICogZGVjbGFyZSB0aGF0CisgKiBhKSB0aGUgbW9kdWxlIHNoYWxsIGJlIHByb2JlZCB1cG9uIGRpc2NvdmVyeSBvZiBDUFUgZmVhdHVyZSAnZmVhdHVyZScKKyAqICAgICh0eXBpY2FsbHkgYXQgYm9vdCB0aW1lIHVzaW5nIHVkZXYpCisgKiBiKSB0aGUgbW9kdWxlIG11c3Qgbm90IGJlIGxvYWRlZCBpZiBDUFUgZmVhdHVyZSAnZmVhdHVyZScgaXMgbm90IHByZXNlbnQKKyAqICAgIChub3QgZXZlbiBieSBtYW51YWwgaW5zbW9kKS4KKyAqCisgKiBGb3IgYSBsaXN0IG9mIGxlZ2FsIHZhbHVlcyBmb3IgJ2ZlYXR1cmUnLCBwbGVhc2UgY29uc3VsdCB0aGUgZmlsZQorICogJ2FzbS9jcHVmZWF0dXJlLmgnIG9mIHlvdXIgZmF2b3JpdGUgYXJjaGl0ZWN0dXJlLgorICovCisjZGVmaW5lIG1vZHVsZV9jcHVfZmVhdHVyZV9tYXRjaCh4LCBfX2luaXQpCQkJXAorc3RhdGljIHN0cnVjdCBjcHVfZmVhdHVyZSBjb25zdCBjcHVfZmVhdHVyZV9tYXRjaF8gIyMgeFtdID0JXAorCXsgeyAuZmVhdHVyZSA9IGNwdV9mZWF0dXJlKHgpIH0sIHsgfSB9OwkJCVwKK01PRFVMRV9ERVZJQ0VfVEFCTEUoY3B1LCBjcHVfZmVhdHVyZV9tYXRjaF8gIyMgeCk7CQlcCisJCQkJCQkJCVwKK3N0YXRpYyBpbnQgY3B1X2ZlYXR1cmVfbWF0Y2hfICMjIHggIyMgX2luaXQodm9pZCkJCVwKK3sJCQkJCQkJCVwKKwlpZiAoIWNwdV9oYXZlX2ZlYXR1cmUoY3B1X2ZlYXR1cmUoeCkpKQkJCVwKKwkJcmV0dXJuIC1FTk9ERVY7CQkJCQlcCisJcmV0dXJuIF9faW5pdCgpOwkJCQkJXAorfQkJCQkJCQkJXAorbW9kdWxlX2luaXQoY3B1X2ZlYXR1cmVfbWF0Y2hfICMjIHggIyMgX2luaXQpCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdXRpbWUuaCBiL2luY2x1ZGUvbGludXgvY3B1dGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZWIyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdXRpbWUuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9fTElOVVhfQ1BVVElNRV9ICisjZGVmaW5lIF9fTElOVVhfQ1BVVElNRV9ICisKKyNpbmNsdWRlIDxhc20vY3B1dGltZS5oPgorCisjaWZuZGVmIGNwdXRpbWVfdG9fbnNlY3MKKyMgZGVmaW5lIGNwdXRpbWVfdG9fbnNlY3MoX19jdCkJXAorCShjcHV0aW1lX3RvX3VzZWNzKF9fY3QpICogTlNFQ19QRVJfVVNFQykKKyNlbmRpZgorCisjaWZuZGVmIG5zZWNzX3RvX2NwdXRpbWUKKyMgZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWUoX19uc2VjcykJXAorCXVzZWNzX3RvX2NwdXRpbWUoKF9fbnNlY3MpIC8gTlNFQ19QRVJfVVNFQykKKyNlbmRpZgorCisjZW5kaWYgLyogX19MSU5VWF9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDk1MmIwMTAuLjIzM2JiYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtNTYwLDYgKzU2MCw4IEBACiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZW50cnkpOwogZXh0ZXJuIHZvaWQgZGV2aWNlX3JlbW92ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cik7CitleHRlcm4gYm9vbCBkZXZpY2VfcmVtb3ZlX2ZpbGVfc2VsZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKTsKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9jcmVhdGVfYmluX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQljb25zdCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7CiBleHRlcm4gdm9pZCBkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTYyNiw2ICs2MjgsNyBAQAogCXJldHVybiBkZXZtX2ttYWxsb2NfYXJyYXkoZGV2LCBuLCBzaXplLCBmbGFncyB8IF9fR0ZQX1pFUk8pOwogfQogZXh0ZXJuIHZvaWQgZGV2bV9rZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnApOworZXh0ZXJuIGNoYXIgKmRldm1fa3N0cmR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnMsIGdmcF90IGdmcCk7CiAKIHZvaWQgX19pb21lbSAqZGV2bV9pb3JlbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpOwogdm9pZCBfX2lvbWVtICpkZXZtX3JlcXVlc3RfYW5kX2lvcmVtYXAoc3RydWN0IGRldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcmJkLmggYi9pbmNsdWRlL2xpbnV4L2RyYmQuaAppbmRleCBkZTdkNzRhLi4zZGJlOWJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RyYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RyYmQuaApAQCAtMzI3LDEyICszMjcsNiBAQAogCVNTX0FGVEVSX0xBU1RfRVJST1IgPSAtMjIsICAgIC8qIEtlZXAgdGhpcyBhdCBib3R0b20gKi8KIH07CiAKLS8qIGZyb20gZHJiZF9zdHJpbmdzLmMgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkcmJkX2Nvbm5fc3RyKGVudW0gZHJiZF9jb25ucyk7Ci1leHRlcm4gY29uc3QgY2hhciAqZHJiZF9yb2xlX3N0cihlbnVtIGRyYmRfcm9sZSk7Ci1leHRlcm4gY29uc3QgY2hhciAqZHJiZF9kaXNrX3N0cihlbnVtIGRyYmRfZGlza19zdGF0ZSk7Ci1leHRlcm4gY29uc3QgY2hhciAqZHJiZF9zZXRfc3RfZXJyX3N0cihlbnVtIGRyYmRfc3RhdGVfcnYpOwotCiAjZGVmaW5lIFNIQVJFRF9TRUNSRVRfTUFYIDY0CiAKICNkZWZpbmUgTURGX0NPTlNJU1RFTlQJCSgxIDw8IDApCkBAIC0zODIsNCArMzc2LDYgQEAKICNkZWZpbmUgRFJCRF9NRF9JTkRFWF9GTEVYX0VYVCAtMgogI2RlZmluZSBEUkJEX01EX0lOREVYX0ZMRVhfSU5UIC0zCiAKKyNkZWZpbmUgRFJCRF9DUFVfTUFTS19TSVpFIDMyCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcmJkX2dlbmwuaCBiL2luY2x1ZGUvbGludXgvZHJiZF9nZW5sLmgKaW5kZXggZThjNDQ1Ny4uNDE5M2Y1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kcmJkX2dlbmwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RyYmRfZ2VubC5oCkBAIC0xMzUsNyArMTM1LDcgQEAKICkKIAogR0VOTF9zdHJ1Y3QoRFJCRF9OTEFfUkVTT1VSQ0VfT1BUUywgNCwgcmVzX29wdHMsCi0JX19zdHJfZmllbGRfZGVmKDEsCURSQkRfR0VOTEFfRl9NQU5EQVRPUlksCWNwdV9tYXNrLCAgICAgICAzMikKKwlfX3N0cl9maWVsZF9kZWYoMSwJRFJCRF9HRU5MQV9GX01BTkRBVE9SWSwJY3B1X21hc2ssICAgICAgIERSQkRfQ1BVX01BU0tfU0laRSkKIAlfX3UzMl9maWVsZF9kZWYoMiwJRFJCRF9HRU5MQV9GX01BTkRBVE9SWSwJb25fbm9fZGF0YSwgRFJCRF9PTl9OT19EQVRBX0RFRikKICkKIApAQCAtMjc2LDkgKzI3Niw5IEBACiApCiAKIAkvKiBhZGQgRFJCRCBtaW5vciBkZXZpY2VzIGFzIHZvbHVtZXMgdG8gcmVzb3VyY2VzICovCi1HRU5MX29wKERSQkRfQURNX05FV19NSU5PUiwgNSwgR0VOTF9kb2l0KGRyYmRfYWRtX2FkZF9taW5vciksCitHRU5MX29wKERSQkRfQURNX05FV19NSU5PUiwgNSwgR0VOTF9kb2l0KGRyYmRfYWRtX25ld19taW5vciksCiAJR0VOTF90bGFfZXhwZWN0ZWQoRFJCRF9OTEFfQ0ZHX0NPTlRFWFQsIERSQkRfRl9SRVFVSVJFRCkpCi1HRU5MX29wKERSQkRfQURNX0RFTF9NSU5PUiwgNiwgR0VOTF9kb2l0KGRyYmRfYWRtX2RlbGV0ZV9taW5vciksCitHRU5MX29wKERSQkRfQURNX0RFTF9NSU5PUiwgNiwgR0VOTF9kb2l0KGRyYmRfYWRtX2RlbF9taW5vciksCiAJR0VOTF90bGFfZXhwZWN0ZWQoRFJCRF9OTEFfQ0ZHX0NPTlRFWFQsIERSQkRfRl9SRVFVSVJFRCkpCiAKIAkvKiBhZGQgb3IgZGVsZXRlIHJlc291cmNlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lZmkuaCBiL2luY2x1ZGUvbGludXgvZWZpLmgKaW5kZXggMGE4MTllNy4uNmMxMDBmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lZmkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VmaS5oCkBAIC0xNTMsNiArMTUzLDEwMiBAQAogCXU4IHNldHNfdG9femVybzsKIH0gZWZpX3RpbWVfY2FwX3Q7CiAKK3R5cGVkZWYgc3RydWN0IHsKKwllZmlfdGFibGVfaGRyX3QgaGRyOworCXUzMiByYWlzZV90cGw7CisJdTMyIHJlc3RvcmVfdHBsOworCXUzMiBhbGxvY2F0ZV9wYWdlczsKKwl1MzIgZnJlZV9wYWdlczsKKwl1MzIgZ2V0X21lbW9yeV9tYXA7CisJdTMyIGFsbG9jYXRlX3Bvb2w7CisJdTMyIGZyZWVfcG9vbDsKKwl1MzIgY3JlYXRlX2V2ZW50OworCXUzMiBzZXRfdGltZXI7CisJdTMyIHdhaXRfZm9yX2V2ZW50OworCXUzMiBzaWduYWxfZXZlbnQ7CisJdTMyIGNsb3NlX2V2ZW50OworCXUzMiBjaGVja19ldmVudDsKKwl1MzIgaW5zdGFsbF9wcm90b2NvbF9pbnRlcmZhY2U7CisJdTMyIHJlaW5zdGFsbF9wcm90b2NvbF9pbnRlcmZhY2U7CisJdTMyIHVuaW5zdGFsbF9wcm90b2NvbF9pbnRlcmZhY2U7CisJdTMyIGhhbmRsZV9wcm90b2NvbDsKKwl1MzIgX19yZXNlcnZlZDsKKwl1MzIgcmVnaXN0ZXJfcHJvdG9jb2xfbm90aWZ5OworCXUzMiBsb2NhdGVfaGFuZGxlOworCXUzMiBsb2NhdGVfZGV2aWNlX3BhdGg7CisJdTMyIGluc3RhbGxfY29uZmlndXJhdGlvbl90YWJsZTsKKwl1MzIgbG9hZF9pbWFnZTsKKwl1MzIgc3RhcnRfaW1hZ2U7CisJdTMyIGV4aXQ7CisJdTMyIHVubG9hZF9pbWFnZTsKKwl1MzIgZXhpdF9ib290X3NlcnZpY2VzOworCXUzMiBnZXRfbmV4dF9tb25vdG9uaWNfY291bnQ7CisJdTMyIHN0YWxsOworCXUzMiBzZXRfd2F0Y2hkb2dfdGltZXI7CisJdTMyIGNvbm5lY3RfY29udHJvbGxlcjsKKwl1MzIgZGlzY29ubmVjdF9jb250cm9sbGVyOworCXUzMiBvcGVuX3Byb3RvY29sOworCXUzMiBjbG9zZV9wcm90b2NvbDsKKwl1MzIgb3Blbl9wcm90b2NvbF9pbmZvcm1hdGlvbjsKKwl1MzIgcHJvdG9jb2xzX3Blcl9oYW5kbGU7CisJdTMyIGxvY2F0ZV9oYW5kbGVfYnVmZmVyOworCXUzMiBsb2NhdGVfcHJvdG9jb2w7CisJdTMyIGluc3RhbGxfbXVsdGlwbGVfcHJvdG9jb2xfaW50ZXJmYWNlczsKKwl1MzIgdW5pbnN0YWxsX211bHRpcGxlX3Byb3RvY29sX2ludGVyZmFjZXM7CisJdTMyIGNhbGN1bGF0ZV9jcmMzMjsKKwl1MzIgY29weV9tZW07CisJdTMyIHNldF9tZW07CisJdTMyIGNyZWF0ZV9ldmVudF9leDsKK30gX19wYWNrZWQgZWZpX2Jvb3Rfc2VydmljZXNfMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWVmaV90YWJsZV9oZHJfdCBoZHI7CisJdTY0IHJhaXNlX3RwbDsKKwl1NjQgcmVzdG9yZV90cGw7CisJdTY0IGFsbG9jYXRlX3BhZ2VzOworCXU2NCBmcmVlX3BhZ2VzOworCXU2NCBnZXRfbWVtb3J5X21hcDsKKwl1NjQgYWxsb2NhdGVfcG9vbDsKKwl1NjQgZnJlZV9wb29sOworCXU2NCBjcmVhdGVfZXZlbnQ7CisJdTY0IHNldF90aW1lcjsKKwl1NjQgd2FpdF9mb3JfZXZlbnQ7CisJdTY0IHNpZ25hbF9ldmVudDsKKwl1NjQgY2xvc2VfZXZlbnQ7CisJdTY0IGNoZWNrX2V2ZW50OworCXU2NCBpbnN0YWxsX3Byb3RvY29sX2ludGVyZmFjZTsKKwl1NjQgcmVpbnN0YWxsX3Byb3RvY29sX2ludGVyZmFjZTsKKwl1NjQgdW5pbnN0YWxsX3Byb3RvY29sX2ludGVyZmFjZTsKKwl1NjQgaGFuZGxlX3Byb3RvY29sOworCXU2NCBfX3Jlc2VydmVkOworCXU2NCByZWdpc3Rlcl9wcm90b2NvbF9ub3RpZnk7CisJdTY0IGxvY2F0ZV9oYW5kbGU7CisJdTY0IGxvY2F0ZV9kZXZpY2VfcGF0aDsKKwl1NjQgaW5zdGFsbF9jb25maWd1cmF0aW9uX3RhYmxlOworCXU2NCBsb2FkX2ltYWdlOworCXU2NCBzdGFydF9pbWFnZTsKKwl1NjQgZXhpdDsKKwl1NjQgdW5sb2FkX2ltYWdlOworCXU2NCBleGl0X2Jvb3Rfc2VydmljZXM7CisJdTY0IGdldF9uZXh0X21vbm90b25pY19jb3VudDsKKwl1NjQgc3RhbGw7CisJdTY0IHNldF93YXRjaGRvZ190aW1lcjsKKwl1NjQgY29ubmVjdF9jb250cm9sbGVyOworCXU2NCBkaXNjb25uZWN0X2NvbnRyb2xsZXI7CisJdTY0IG9wZW5fcHJvdG9jb2w7CisJdTY0IGNsb3NlX3Byb3RvY29sOworCXU2NCBvcGVuX3Byb3RvY29sX2luZm9ybWF0aW9uOworCXU2NCBwcm90b2NvbHNfcGVyX2hhbmRsZTsKKwl1NjQgbG9jYXRlX2hhbmRsZV9idWZmZXI7CisJdTY0IGxvY2F0ZV9wcm90b2NvbDsKKwl1NjQgaW5zdGFsbF9tdWx0aXBsZV9wcm90b2NvbF9pbnRlcmZhY2VzOworCXU2NCB1bmluc3RhbGxfbXVsdGlwbGVfcHJvdG9jb2xfaW50ZXJmYWNlczsKKwl1NjQgY2FsY3VsYXRlX2NyYzMyOworCXU2NCBjb3B5X21lbTsKKwl1NjQgc2V0X21lbTsKKwl1NjQgY3JlYXRlX2V2ZW50X2V4OworfSBfX3BhY2tlZCBlZmlfYm9vdF9zZXJ2aWNlc182NF90OworCiAvKgogICogRUZJIEJvb3QgU2VydmljZXMgdGFibGUKICAqLwpAQCAtMjMxLDYgKzMyNywxNSBAQAogICAgIEVmaVBjaUlvQXR0cmlidXRlT3BlcmF0aW9uTWF4aW11bQogfSBFRklfUENJX0lPX1BST1RPQ09MX0FUVFJJQlVURV9PUEVSQVRJT047CiAKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgcmVhZDsKKwl1MzIgd3JpdGU7Cit9IGVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1NjQgcmVhZDsKKwl1NjQgd3JpdGU7Cit9IGVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzY0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAl2b2lkICpyZWFkOwpAQCAtMjM4LDYgKzM0Myw0NiBAQAogfSBlZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc190OwogCiB0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHBvbGxfbWVtOworCXUzMiBwb2xsX2lvOworCWVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzMyX3QgbWVtOworCWVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzMyX3QgaW87CisJZWZpX3BjaV9pb19wcm90b2NvbF9hY2Nlc3NfMzJfdCBwY2k7CisJdTMyIGNvcHlfbWVtOworCXUzMiBtYXA7CisJdTMyIHVubWFwOworCXUzMiBhbGxvY2F0ZV9idWZmZXI7CisJdTMyIGZyZWVfYnVmZmVyOworCXUzMiBmbHVzaDsKKwl1MzIgZ2V0X2xvY2F0aW9uOworCXUzMiBhdHRyaWJ1dGVzOworCXUzMiBnZXRfYmFyX2F0dHJpYnV0ZXM7CisJdTMyIHNldF9iYXJfYXR0cmlidXRlczsKKwl1aW50NjRfdCByb21zaXplOworCXZvaWQgKnJvbWltYWdlOworfSBlZmlfcGNpX2lvX3Byb3RvY29sXzMyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTY0IHBvbGxfbWVtOworCXU2NCBwb2xsX2lvOworCWVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzY0X3QgbWVtOworCWVmaV9wY2lfaW9fcHJvdG9jb2xfYWNjZXNzXzY0X3QgaW87CisJZWZpX3BjaV9pb19wcm90b2NvbF9hY2Nlc3NfNjRfdCBwY2k7CisJdTY0IGNvcHlfbWVtOworCXU2NCBtYXA7CisJdTY0IHVubWFwOworCXU2NCBhbGxvY2F0ZV9idWZmZXI7CisJdTY0IGZyZWVfYnVmZmVyOworCXU2NCBmbHVzaDsKKwl1NjQgZ2V0X2xvY2F0aW9uOworCXU2NCBhdHRyaWJ1dGVzOworCXU2NCBnZXRfYmFyX2F0dHJpYnV0ZXM7CisJdTY0IHNldF9iYXJfYXR0cmlidXRlczsKKwl1aW50NjRfdCByb21zaXplOworCXZvaWQgKnJvbWltYWdlOworfSBlZmlfcGNpX2lvX3Byb3RvY29sXzY0OworCit0eXBlZGVmIHN0cnVjdCB7CiAJdm9pZCAqcG9sbF9tZW07CiAJdm9pZCAqcG9sbF9pbzsKIAllZmlfcGNpX2lvX3Byb3RvY29sX2FjY2Vzc190IG1lbTsKQEAgLTI5Miw2ICs0MzcsNDIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogCWVmaV90YWJsZV9oZHJfdCBoZHI7CisJdTMyIGdldF90aW1lOworCXUzMiBzZXRfdGltZTsKKwl1MzIgZ2V0X3dha2V1cF90aW1lOworCXUzMiBzZXRfd2FrZXVwX3RpbWU7CisJdTMyIHNldF92aXJ0dWFsX2FkZHJlc3NfbWFwOworCXUzMiBjb252ZXJ0X3BvaW50ZXI7CisJdTMyIGdldF92YXJpYWJsZTsKKwl1MzIgZ2V0X25leHRfdmFyaWFibGU7CisJdTMyIHNldF92YXJpYWJsZTsKKwl1MzIgZ2V0X25leHRfaGlnaF9tb25vX2NvdW50OworCXUzMiByZXNldF9zeXN0ZW07CisJdTMyIHVwZGF0ZV9jYXBzdWxlOworCXUzMiBxdWVyeV9jYXBzdWxlX2NhcHM7CisJdTMyIHF1ZXJ5X3ZhcmlhYmxlX2luZm87Cit9IGVmaV9ydW50aW1lX3NlcnZpY2VzXzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwllZmlfdGFibGVfaGRyX3QgaGRyOworCXU2NCBnZXRfdGltZTsKKwl1NjQgc2V0X3RpbWU7CisJdTY0IGdldF93YWtldXBfdGltZTsKKwl1NjQgc2V0X3dha2V1cF90aW1lOworCXU2NCBzZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKKwl1NjQgY29udmVydF9wb2ludGVyOworCXU2NCBnZXRfdmFyaWFibGU7CisJdTY0IGdldF9uZXh0X3ZhcmlhYmxlOworCXU2NCBzZXRfdmFyaWFibGU7CisJdTY0IGdldF9uZXh0X2hpZ2hfbW9ub19jb3VudDsKKwl1NjQgcmVzZXRfc3lzdGVtOworCXU2NCB1cGRhdGVfY2Fwc3VsZTsKKwl1NjQgcXVlcnlfY2Fwc3VsZV9jYXBzOworCXU2NCBxdWVyeV92YXJpYWJsZV9pbmZvOworfSBlZmlfcnVudGltZV9zZXJ2aWNlc182NF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJZWZpX3RhYmxlX2hkcl90IGhkcjsKIAl2b2lkICpnZXRfdGltZTsKIAl2b2lkICpzZXRfdGltZTsKIAl2b2lkICpnZXRfd2FrZXVwX3RpbWU7CkBAIC00ODUsNiArNjY2LDM4IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAl1MzIgcmV2aXNpb247CisJdTMyIHBhcmVudF9oYW5kbGU7CisJdTMyIHN5c3RlbV90YWJsZTsKKwl1MzIgZGV2aWNlX2hhbmRsZTsKKwl1MzIgZmlsZV9wYXRoOworCXUzMiByZXNlcnZlZDsKKwl1MzIgbG9hZF9vcHRpb25zX3NpemU7CisJdTMyIGxvYWRfb3B0aW9uczsKKwl1MzIgaW1hZ2VfYmFzZTsKKwlfX2FsaWduZWRfdTY0IGltYWdlX3NpemU7CisJdW5zaWduZWQgaW50IGltYWdlX2NvZGVfdHlwZTsKKwl1bnNpZ25lZCBpbnQgaW1hZ2VfZGF0YV90eXBlOworCXVuc2lnbmVkIGxvbmcgdW5sb2FkOworfSBlZmlfbG9hZGVkX2ltYWdlXzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgcmV2aXNpb247CisJdTY0IHBhcmVudF9oYW5kbGU7CisJdTY0IHN5c3RlbV90YWJsZTsKKwl1NjQgZGV2aWNlX2hhbmRsZTsKKwl1NjQgZmlsZV9wYXRoOworCXU2NCByZXNlcnZlZDsKKwl1MzIgbG9hZF9vcHRpb25zX3NpemU7CisJdTY0IGxvYWRfb3B0aW9uczsKKwl1NjQgaW1hZ2VfYmFzZTsKKwlfX2FsaWduZWRfdTY0IGltYWdlX3NpemU7CisJdW5zaWduZWQgaW50IGltYWdlX2NvZGVfdHlwZTsKKwl1bnNpZ25lZCBpbnQgaW1hZ2VfZGF0YV90eXBlOworCXVuc2lnbmVkIGxvbmcgdW5sb2FkOworfSBlZmlfbG9hZGVkX2ltYWdlXzY0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgcmV2aXNpb247CiAJdm9pZCAqcGFyZW50X2hhbmRsZTsKIAllZmlfc3lzdGVtX3RhYmxlX3QgKnN5c3RlbV90YWJsZTsKIAl2b2lkICpkZXZpY2VfaGFuZGxlOwpAQCAtNTExLDYgKzcyNCwzNCBAQAogCWVmaV9jaGFyMTZfdCBmaWxlbmFtZVsxXTsKIH0gZWZpX2ZpbGVfaW5mb190OwogCit0eXBlZGVmIHN0cnVjdCB7CisJdTY0IHJldmlzaW9uOworCXUzMiBvcGVuOworCXUzMiBjbG9zZTsKKwl1MzIgZGVsZXRlOworCXUzMiByZWFkOworCXUzMiB3cml0ZTsKKwl1MzIgZ2V0X3Bvc2l0aW9uOworCXUzMiBzZXRfcG9zaXRpb247CisJdTMyIGdldF9pbmZvOworCXUzMiBzZXRfaW5mbzsKKwl1MzIgZmx1c2g7Cit9IGVmaV9maWxlX2hhbmRsZV8zMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTY0IHJldmlzaW9uOworCXU2NCBvcGVuOworCXU2NCBjbG9zZTsKKwl1NjQgZGVsZXRlOworCXU2NCByZWFkOworCXU2NCB3cml0ZTsKKwl1NjQgZ2V0X3Bvc2l0aW9uOworCXU2NCBzZXRfcG9zaXRpb247CisJdTY0IGdldF9pbmZvOworCXU2NCBzZXRfaW5mbzsKKwl1NjQgZmx1c2g7Cit9IGVmaV9maWxlX2hhbmRsZV82NF90OworCiB0eXBlZGVmIHN0cnVjdCBfZWZpX2ZpbGVfaGFuZGxlIHsKIAl1NjQgcmV2aXNpb247CiAJZWZpX3N0YXR1c190ICgqb3Blbikoc3RydWN0IF9lZmlfZmlsZV9oYW5kbGUgKiwKQEAgLTU3Myw2ICs4MTQsNyBAQAogCWVmaV9yZXNldF9zeXN0ZW1fdCAqcmVzZXRfc3lzdGVtOwogCWVmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcF90ICpzZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKIAlzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgKm1lbW1hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogfSBlZmk7CiAKIHN0YXRpYyBpbmxpbmUgaW50CkBAIC02NTksMTggKzkwMSwxNyBAQAogI2RlZmluZSBFRklfQVJDSF8xCQk2CS8qIEZpcnN0IGFyY2gtc3BlY2lmaWMgYml0ICovCiAKICNpZmRlZiBDT05GSUdfRUZJCi0jIGlmZGVmIENPTkZJR19YODYKLWV4dGVybiBpbnQgZWZpX2VuYWJsZWQoaW50IGZhY2lsaXR5KTsKLSMgZWxzZQotc3RhdGljIGlubGluZSBpbnQgZWZpX2VuYWJsZWQoaW50IGZhY2lsaXR5KQorLyoKKyAqIFRlc3Qgd2hldGhlciB0aGUgYWJvdmUgRUZJXyogYml0cyBhcmUgZW5hYmxlZC4KKyAqLworc3RhdGljIGlubGluZSBib29sIGVmaV9lbmFibGVkKGludCBmZWF0dXJlKQogewotCXJldHVybiAxOworCXJldHVybiB0ZXN0X2JpdChmZWF0dXJlLCAmZWZpLmZsYWdzKSAhPSAwOwogfQotIyBlbmRpZgogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGVmaV9lbmFibGVkKGludCBmYWNpbGl0eSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBlZmlfZW5hYmxlZChpbnQgZmVhdHVyZSkKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmFsc2U7CiB9CiAjZW5kaWYKIApAQCAtODA5LDYgKzEwNTAsMTcgQEAKIAlib29sIGRlbGV0aW5nOwogfTsKIAorc3RydWN0IGVmaV9zaW1wbGVfdGV4dF9vdXRwdXRfcHJvdG9jb2xfMzIgeworCXUzMiByZXNldDsKKwl1MzIgb3V0cHV0X3N0cmluZzsKKwl1MzIgdGVzdF9zdHJpbmc7Cit9OworCitzdHJ1Y3QgZWZpX3NpbXBsZV90ZXh0X291dHB1dF9wcm90b2NvbF82NCB7CisJdTY0IHJlc2V0OworCXU2NCBvdXRwdXRfc3RyaW5nOworCXU2NCB0ZXN0X3N0cmluZzsKK307CiAKIHN0cnVjdCBlZmlfc2ltcGxlX3RleHRfb3V0cHV0X3Byb3RvY29sIHsKIAl2b2lkICpyZXNldDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaCBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAppbmRleCAzMDZkZDhjLi5kZjYzYmQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCkBAIC0yMDIsMTcgKzIwMiw4IEBACiAjZGVmaW5lIHJxX2VuZF9zZWN0b3IocnEpCShibGtfcnFfcG9zKHJxKSArIGJsa19ycV9zZWN0b3JzKHJxKSkKICNkZWZpbmUgcmJfZW50cnlfcnEobm9kZSkJcmJfZW50cnkoKG5vZGUpLCBzdHJ1Y3QgcmVxdWVzdCwgcmJfbm9kZSkKIAotLyoKLSAqIEhhY2sgdG8gcmV1c2UgdGhlIGNzZC5saXN0IGxpc3RfaGVhZCBhcyB0aGUgZmlmbyB0aW1lIGhvbGRlciB3aGlsZQotICogdGhlIHJlcXVlc3QgaXMgaW4gdGhlIGlvIHNjaGVkdWxlci4gU2F2ZXMgYW4gdW5zaWduZWQgbG9uZyBpbiBycS4KLSAqLwotI2RlZmluZSBycV9maWZvX3RpbWUocnEpCSgodW5zaWduZWQgbG9uZykgKHJxKS0+Y3NkLmxpc3QubmV4dCkKLSNkZWZpbmUgcnFfc2V0X2ZpZm9fdGltZShycSxleHApCSgocnEpLT5jc2QubGlzdC5uZXh0ID0gKHZvaWQgKikgKGV4cCkpCiAjZGVmaW5lIHJxX2VudHJ5X2ZpZm8ocHRyKQlsaXN0X2VudHJ5KChwdHIpLCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KQotI2RlZmluZSBycV9maWZvX2NsZWFyKHJxKQlkbyB7CQlcCi0JbGlzdF9kZWxfaW5pdCgmKHJxKS0+cXVldWVsaXN0KTsJXAotCUlOSVRfTElTVF9IRUFEKCYocnEpLT5jc2QubGlzdCk7CVwKLQl9IHdoaWxlICgwKQorI2RlZmluZSBycV9maWZvX2NsZWFyKHJxKQlsaXN0X2RlbF9pbml0KCYocnEpLT5xdWV1ZWxpc3QpCiAKICNlbHNlIC8qIENPTkZJR19CTE9DSyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oIGIvaW5jbHVkZS9saW51eC9leHRjb24uaAppbmRleCAyMWM1OWFmLi5mNDg4MTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Y29uLmgKQEAgLTI0MCw2ICsyNDAsMTIgQEAKIAkJCQkgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gaW50IGV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LAogCQkJCSAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworCisvKgorICogRm9sbG93aW5nIEFQSSBnZXQgdGhlIGV4dGNvbiBkZXZpY2UgZnJvbSBkZXZpY2V0cmVlLgorICogVGhpcyBmdW5jdGlvbiB1c2UgcGhhbmRsZSBvZiBkZXZpY2V0cmVlIHRvIGdldCBleHRjb24gZGV2aWNlIGRpcmVjdGx5LgorICovCitleHRlcm4gc3RydWN0IGV4dGNvbl9kZXYgKmV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4KTsKICNlbHNlIC8qIENPTkZJR19FWFRDT04gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9kZXZfcmVnaXN0ZXIoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYpCiB7CkBAIC0zMjQsNSArMzMwLDExIEBACiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4dGNvbl9kZXYgKmV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCQkgICAgaW50IGluZGV4KQoreworCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworfQogI2VuZGlmIC8qIENPTkZJR19FWFRDT04gKi8KICNlbmRpZiAvKiBfX0xJTlVYX0VYVENPTl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0Y29uL29mX2V4dGNvbi5oIGIvaW5jbHVkZS9saW51eC9leHRjb24vb2ZfZXh0Y29uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmZlZmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9leHRjb24vb2ZfZXh0Y29uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogT0YgaGVscGVycyBmb3IgRXh0ZXJuYWwgY29ubmVjdG9yIChleHRjb24pIGZyYW1ld29yawotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fTElOVVhfT0ZfRVhUQ09OX0gKLSNkZWZpbmUgX19MSU5VWF9PRl9FWFRDT05fSAotCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19PRl9FWFRDT04pCi1leHRlcm4gc3RydWN0IGV4dGNvbl9kZXYKLQkqb2ZfZXh0Y29uX2dldF9leHRjb25fZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4KTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBleHRjb25fZGV2Ci0JKm9mX2V4dGNvbl9nZXRfZXh0Y29uX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCkKLXsKLQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfT0ZfRVhUQ09OICovCi0jZW5kaWYgLyogX19MSU5VWF9PRl9FWFRDT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mbWMtc2RiLmggYi9pbmNsdWRlL2xpbnV4L2ZtYy1zZGIuaAppbmRleCAxOTc0MzE3Li41OTliZDZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZtYy1zZGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZtYy1zZGIuaApAQCAtMTQsNiArMTQsOCBAQAogCXN0cnVjdCBzZGJfYnJpZGdlIGJyaWRnZTsKIAlzdHJ1Y3Qgc2RiX2ludGVncmF0aW9uIGludGVncjsKIAlzdHJ1Y3Qgc2RiX2VtcHR5IGVtcHR5OworCXN0cnVjdCBzZGJfc3ludGhlc2lzIHN5bnRoZXNpczsKKwlzdHJ1Y3Qgc2RiX3JlcG9fdXJsIHJlcG9fdXJsOwogfTsKIAogc3RydWN0IGZtY19kZXZpY2U7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2lmYy5oIGIvaW5jbHVkZS9saW51eC9mc2xfaWZjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mc2xfaWZjLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvZnNsX2lmYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaAppbmRleCA0ZTRjYzI4Li40Y2RiM2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKQEAgLTQ5NSwxMCArNDk1LDYgQEAKIAlGSUxURVJfVFJBQ0VfRk4sCiB9OwogCi0jZGVmaW5lIEVWRU5UX1NUT1JBR0VfU0laRSAxMjgKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggZXZlbnRfc3RvcmFnZV9tdXRleDsKLWV4dGVybiBjaGFyIGV2ZW50X3N0b3JhZ2VbRVZFTlRfU1RPUkFHRV9TSVpFXTsKLQogZXh0ZXJuIGludCB0cmFjZV9ldmVudF9yYXdfaW5pdChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpOwogZXh0ZXJuIGludCB0cmFjZV9kZWZpbmVfZmllbGQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBjb25zdCBjaGFyICp0eXBlLAogCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG9mZnNldCwgaW50IHNpemUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z1dGV4LmggYi9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKaW5kZXggYjBkOTVjYS4uNjQzNWY0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXRleC5oCisrKyBiL2luY2x1ZGUvbGludXgvZnV0ZXguaApAQCAtNTUsNyArNTUsMTEgQEAKICNpZmRlZiBDT05GSUdfRlVURVgKIGV4dGVybiB2b2lkIGV4aXRfcm9idXN0X2xpc3Qoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKTsKIGV4dGVybiB2b2lkIGV4aXRfcGlfc3RhdGVfbGlzdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIpOworI2lmZGVmIENPTkZJR19IQVZFX0ZVVEVYX0NNUFhDSEcKKyNkZWZpbmUgZnV0ZXhfY21weGNoZ19lbmFibGVkIDEKKyNlbHNlCiBleHRlcm4gaW50IGZ1dGV4X2NtcHhjaGdfZW5hYmxlZDsKKyNlbmRpZgogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBleGl0X3JvYnVzdF9saXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VycikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKaW5kZXggMTJkNWY5Ny4uY2JhNDQyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKQEAgLTksNiArOSw3IEBACiAKIAogZXh0ZXJuIHZvaWQgc3luY2hyb25pemVfaXJxKHVuc2lnbmVkIGludCBpcnEpOworZXh0ZXJuIHZvaWQgc3luY2hyb25pemVfaGFyZGlycSh1bnNpZ25lZCBpbnQgaXJxKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1RJTllfUkNVKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaWRzLmggYi9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaWRzLmgKaW5kZXggYmVhZjk2NS4uNTM3MTYxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWlkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1pZHMuaApAQCAtMzMsNiArMzMsMTYgQEAKICNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUCQkJCTB4MjAwNGQwCiAjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfTElHSFRfSUxMVU0JCQkJMHgyMDA0ZDEKIAorLyogUFJPWCAoMjAwMDExKSAqLworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDExCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9QUkVTRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA0YjAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9IVU1BTl9QUkVTRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDRiMQorCisvKiBQcmVzc3VyZSAoMjAwMDMxKSAqLworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDMxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9BVE1PU1BIRVJJQ19QUkVTU1VSRSAgICAgICAgICAgICAgMHgyMDA0MzAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9BVE1PU1BIRVJJQ19QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAweDIwMDQzMQorCiAvKiBHeXJvIDNEOiAoMjAwMDc2KSAqLwogI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dZUk9fM0QJCQkJMHgyMDAwNzYKICNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0FOR0xfVkVMT0NJVFkJCQkweDIwMDQ1NgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmggYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAppbmRleCBkMTlhNWMyLi5lN2E4ZDNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaApAQCAtOTYsMTIgKzk2LDEyIEBACiAgKiBAZnVuY3Rpb246CXRpbWVyIGV4cGlyeSBjYWxsYmFjayBmdW5jdGlvbgogICogQGJhc2U6CXBvaW50ZXIgdG8gdGhlIHRpbWVyIGJhc2UgKHBlciBjcHUgYW5kIHBlciBjbG9jaykKICAqIEBzdGF0ZToJc3RhdGUgaW5mb3JtYXRpb24gKFNlZSBiaXQgdmFsdWVzIGFib3ZlKQorICogQHN0YXJ0X3BpZDogdGltZXIgc3RhdGlzdGljcyBmaWVsZCB0byBzdG9yZSB0aGUgcGlkIG9mIHRoZSB0YXNrIHdoaWNoCisgKgkJc3RhcnRlZCB0aGUgdGltZXIKICAqIEBzdGFydF9zaXRlOgl0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBzaXRlIHdoZXJlIHRoZSB0aW1lcgogICoJCXdhcyBzdGFydGVkCiAgKiBAc3RhcnRfY29tbTogdGltZXIgc3RhdGlzdGljcyBmaWVsZCB0byBzdG9yZSB0aGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB3aGljaAogICoJCXN0YXJ0ZWQgdGhlIHRpbWVyCi0gKiBAc3RhcnRfcGlkOiB0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBwaWQgb2YgdGhlIHRhc2sgd2hpY2gKLSAqCQlzdGFydGVkIHRoZSB0aW1lcgogICoKICAqIFRoZSBocnRpbWVyIHN0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGhydGltZXJfaW5pdCgpCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHlwZXJ2LmggYi9pbmNsdWRlL2xpbnV4L2h5cGVydi5oCmluZGV4IDM0NDg4M2QuLmFiNzM1OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHlwZXJ2LmgKKysrIGIvaW5jbHVkZS9saW51eC9oeXBlcnYuaApAQCAtMjUsMzI4ICsyNSwxMSBAQAogI2lmbmRlZiBfSFlQRVJWX0gKICNkZWZpbmUgX0hZUEVSVl9ICiAKKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2h5cGVydi5oPgorCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotLyoKLSAqIEZyYW1ld29yayB2ZXJzaW9uIGZvciB1dGlsIHNlcnZpY2VzLgotICovCi0jZGVmaW5lIFVUSUxfRldfTUlOT1IgIDAKLQotI2RlZmluZSBVVElMX1dTMks4X0ZXX01BSk9SICAxCi0jZGVmaW5lIFVUSUxfV1MySzhfRldfVkVSU0lPTiAgICAgKFVUSUxfV1MySzhfRldfTUFKT1IgPDwgMTYgfCBVVElMX0ZXX01JTk9SKQotCi0jZGVmaW5lIFVUSUxfRldfTUFKT1IgIDMKLSNkZWZpbmUgVVRJTF9GV19WRVJTSU9OICAgICAoVVRJTF9GV19NQUpPUiA8PCAxNiB8IFVUSUxfRldfTUlOT1IpCi0KLQotLyoKLSAqIEltcGxlbWVudGF0aW9uIG9mIGhvc3QgY29udHJvbGxlZCBzbmFwc2hvdCBvZiB0aGUgZ3Vlc3QuCi0gKi8KLQotI2RlZmluZSBWU1NfT1BfUkVHSVNURVIgMTI4Ci0KLWVudW0gaHZfdnNzX29wIHsKLQlWU1NfT1BfQ1JFQVRFID0gMCwKLQlWU1NfT1BfREVMRVRFLAotCVZTU19PUF9IT1RfQkFDS1VQLAotCVZTU19PUF9HRVRfRE1fSU5GTywKLQlWU1NfT1BfQlVfQ09NUExFVEUsCi0JLyoKLQkgKiBGb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCBJQyB2ZXJzaW9uID49IDUuMAotCSAqLwotCVZTU19PUF9GUkVFWkUsIC8qIEZyZWV6ZSB0aGUgZmlsZSBzeXN0ZW1zIGluIHRoZSBWTSAqLwotCVZTU19PUF9USEFXLCAvKiBVbmZyZWV6ZSB0aGUgZmlsZSBzeXN0ZW1zICovCi0JVlNTX09QX0FVVE9fUkVDT1ZFUiwKLQlWU1NfT1BfQ09VTlQgLyogTnVtYmVyIG9mIG9wZXJhdGlvbnMsIG11c3QgYmUgbGFzdCAqLwotfTsKLQotCi0vKgotICogSGVhZGVyIGZvciBhbGwgVlNTIG1lc3NhZ2VzLgotICovCi1zdHJ1Y3QgaHZfdnNzX2hkciB7Ci0JX191OCBvcGVyYXRpb247Ci0JX191OCByZXNlcnZlZFs3XTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotLyoKLSAqIEZsYWcgdmFsdWVzIGZvciB0aGUgaHZfdnNzX2NoZWNrX2ZlYXR1cmUuIExpbnV4IHN1cHBvcnRzIG9ubHkKLSAqIG9uZSB2YWx1ZS4KLSAqLwotI2RlZmluZSBWU1NfSEJVX05PX0FVVE9fUkVDT1ZFUlkJMHgwMDAwMDAwNQotCi1zdHJ1Y3QgaHZfdnNzX2NoZWNrX2ZlYXR1cmUgewotCV9fdTMyIGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGh2X3Zzc19jaGVja19kbV9pbmZvIHsKLQlfX3UzMiBmbGFnczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodl92c3NfbXNnIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBodl92c3NfaGRyIHZzc19oZHI7Ci0JCWludCBlcnJvcjsKLQl9OwotCXVuaW9uIHsKLQkJc3RydWN0IGh2X3Zzc19jaGVja19mZWF0dXJlIHZzc19jZjsKLQkJc3RydWN0IGh2X3Zzc19jaGVja19kbV9pbmZvIGRtX2luZm87Ci0JfTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBIeXBlclYga2V5IHZhbHVlIHBhaXIgKEtWUCkgZnVuY3Rpb25hbGl0eSBmb3IgTGludXguCi0gKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgTm92ZWxsLCBJbmMuCi0gKiBBdXRob3IgOiBLLiBZLiBTcmluaXZhc2FuIDxrc3Jpbml2YXNhbkBub3ZlbGwuY29tPgotICoKLSAqLwotCi0vKgotICogTWF4aW11bSB2YWx1ZSBzaXplIC0gdXNlZCBmb3IgYm90aCBrZXkgbmFtZXMgYW5kIHZhbHVlIGRhdGEsIGFuZCBpbmNsdWRlcwotICogYW55IGFwcGxpY2FibGUgTlVMTCB0ZXJtaW5hdG9ycy4KLSAqCi0gKiBOb3RlOiAgVGhpcyBsaW1pdCBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGJ1dCBmYWxscyBlYXNpbHkgd2l0aGluIHdoYXQgaXMKLSAqIHN1cHBvcnRlZCBmb3IgYWxsIG5hdGl2ZSBndWVzdHMgKGJhY2sgdG8gV2luIDIwMDApIGFuZCB3aGF0IGlzIHJlYXNvbmFibGUKLSAqIGZvciB0aGUgSUMgS1ZQIGV4Y2hhbmdlIGZ1bmN0aW9uYWxpdHkuICBOb3RlIHRoYXQgV2luZG93cyBNZS85OC85NSBhcmUKLSAqIGxpbWl0ZWQgdG8gMjU1IGNoYXJhY3RlciBrZXkgbmFtZXMuCi0gKgotICogTVNETiByZWNvbW1lbmRzIG5vdCBzdG9yaW5nIGRhdGEgdmFsdWVzIGxhcmdlciB0aGFuIDIwNDggYnl0ZXMgaW4gdGhlCi0gKiByZWdpc3RyeS4KLSAqCi0gKiBOb3RlOiAgVGhpcyB2YWx1ZSBpcyB1c2VkIGluIGRlZmluaW5nIHRoZSBLVlAgZXhjaGFuZ2UgbWVzc2FnZSAtIHRoaXMgdmFsdWUKLSAqIGNhbm5vdCBiZSBtb2RpZmllZCB3aXRob3V0IGFmZmVjdGluZyB0aGUgbWVzc2FnZSBzaXplIGFuZCBjb21wYXRpYmlsaXR5LgotICovCi0KLS8qCi0gKiBieXRlcywgaW5jbHVkaW5nIGFueSBudWxsIHRlcm1pbmF0b3JzCi0gKi8KLSNkZWZpbmUgSFZfS1ZQX0VYQ0hBTkdFX01BWF9WQUxVRV9TSVpFICAgICAgICAgICgyMDQ4KQotCi0KLS8qCi0gKiBNYXhpbXVtIGtleSBzaXplIC0gdGhlIHJlZ2lzdHJ5IGxpbWl0IGZvciB0aGUgbGVuZ3RoIG9mIGFuIGVudHJ5IG5hbWUKLSAqIGlzIDI1NiBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvcgotICovCi0KLSNkZWZpbmUgSFZfS1ZQX0VYQ0hBTkdFX01BWF9LRVlfU0laRSAgICAgICAgICAgICg1MTIpCi0KLS8qCi0gKiBJbiBMaW51eCwgd2UgaW1wbGVtZW50IHRoZSBLVlAgZnVuY3Rpb25hbGl0eSBpbiB0d28gY29tcG9uZW50czoKLSAqIDEpIFRoZSBrZXJuZWwgY29tcG9uZW50IHdoaWNoIGlzIHBhY2thZ2VkIGFzIHBhcnQgb2YgdGhlIGh2X3V0aWxzIGRyaXZlcgotICogaXMgcmVzcG9uc2libGUgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgaG9zdCBhbmQgcmVzcG9uc2libGUgZm9yCi0gKiBpbXBsZW1lbnRpbmcgdGhlIGhvc3QvZ3Vlc3QgcHJvdG9jb2wuIDIpIEEgdXNlciBsZXZlbCBkYWVtb24gdGhhdCBpcwotICogcmVzcG9uc2libGUgZm9yIGRhdGEgZ2F0aGVyaW5nLgotICoKLSAqIEhvc3QvR3Vlc3QgUHJvdG9jb2w6IFRoZSBob3N0IGl0ZXJhdGVzIG92ZXIgYW4gaW5kZXggYW5kIGV4cGVjdHMgdGhlIGd1ZXN0Ci0gKiB0byBhc3NpZ24gYSBrZXkgbmFtZSB0byB0aGUgaW5kZXggYW5kIGFsc28gcmV0dXJuIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvCi0gKiB0aGUga2V5LiBUaGUgaG9zdCB3aWxsIGhhdmUgYXRtb3N0IG9uZSBLVlAgdHJhbnNhY3Rpb24gb3V0c3RhbmRpbmcgYXQgYW55Ci0gKiBnaXZlbiBwb2ludCBpbiB0aW1lLiBUaGUgaG9zdCBzaWRlIGl0ZXJhdGlvbiBzdG9wcyB3aGVuIHRoZSBndWVzdCByZXR1cm5zCi0gKiBhbiBlcnJvci4gTWljcm9zb2Z0IGhhcyBzcGVjaWZpZWQgdGhlIGZvbGxvd2luZyBtYXBwaW5nIG9mIGtleSBuYW1lcyB0bwotICogaG9zdCBzcGVjaWZpZWQgaW5kZXg6Ci0gKgotICoJSW5kZXgJCUtleSBOYW1lCi0gKgkwCQlGdWxseVF1YWxpZmllZERvbWFpbk5hbWUKLSAqCTEJCUludGVncmF0aW9uU2VydmljZXNWZXJzaW9uCi0gKgkyCQlOZXR3b3JrQWRkcmVzc0lQdjQKLSAqCTMJCU5ldHdvcmtBZGRyZXNzSVB2NgotICoJNAkJT1NCdWlsZE51bWJlcgotICoJNQkJT1NOYW1lCi0gKgk2CQlPU01ham9yVmVyc2lvbgotICoJNwkJT1NNaW5vclZlcnNpb24KLSAqCTgJCU9TVmVyc2lvbgotICoJOQkJUHJvY2Vzc29yQXJjaGl0ZWN0dXJlCi0gKgotICogVGhlIFdpbmRvd3MgaG9zdCBleHBlY3RzIHRoZSBLZXkgTmFtZSBhbmQgS2V5IFZhbHVlIHRvIGJlIGVuY29kZWQgaW4gdXRmMTYuCi0gKgotICogR3Vlc3QgS2VybmVsL0tWUCBEYWVtb24gUHJvdG9jb2w6IEFzIG5vdGVkIGVhcmxpZXIsIHdlIGltcGxlbWVudCBhbGwgb2YgdGhlCi0gKiBkYXRhIGdhdGhlcmluZyBmdW5jdGlvbmFsaXR5IGluIGEgdXNlciBtb2RlIGRhZW1vbi4gVGhlIHVzZXIgbGV2ZWwgZGFlbW9uCi0gKiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBiaW5kaW5nIHRoZSBrZXkgbmFtZSB0byB0aGUgaW5kZXggYXMgd2VsbC4gVGhlCi0gKiBrZXJuZWwgYW5kIHVzZXItbGV2ZWwgZGFlbW9uIGNvbW11bmljYXRlIHVzaW5nIGEgY29ubmVjdG9yIGNoYW5uZWwuCi0gKgotICogVGhlIHVzZXIgbW9kZSBjb21wb25lbnQgZmlyc3QgcmVnaXN0ZXJzIHdpdGggdGhlCi0gKiB0aGUga2VybmVsIGNvbXBvbmVudC4gU3Vic2VxdWVudGx5LCB0aGUga2VybmVsIGNvbXBvbmVudCByZXF1ZXN0cywgZGF0YQotICogZm9yIHRoZSBzcGVjaWZpZWQga2V5cy4gSW4gcmVzcG9uc2UgdG8gdGhpcyBtZXNzYWdlIHRoZSB1c2VyIG1vZGUgY29tcG9uZW50Ci0gKiBmaWxscyBpbiB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGtleS4gV2Ugb3ZlcmxvYWQgdGhlCi0gKiBzZXF1ZW5jZSBmaWVsZCBpbiB0aGUgY25fbXNnIGhlYWRlciB0byBkZWZpbmUgb3VyIEtWUCBtZXNzYWdlIHR5cGVzLgotICoKLSAqCi0gKiBUaGUga2VybmVsIGNvbXBvbmVudCBzaW1wbHkgYWN0cyBhcyBhIGNvbmR1aXQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUKLSAqIFdpbmRvd3MgaG9zdCBhbmQgdGhlIHVzZXItbGV2ZWwgZGFlbW9uLiBUaGUga2VybmVsIGNvbXBvbmVudCBwYXNzZXMgdXAgdGhlCi0gKiBpbmRleCByZWNlaXZlZCBmcm9tIHRoZSBIb3N0IHRvIHRoZSB1c2VyLWxldmVsIGRhZW1vbi4gSWYgdGhlIGluZGV4IGlzCi0gKiB2YWxpZCAoc3VwcG9ydGVkKSwgdGhlIGNvcnJlc3BvbmRpbmcga2V5IGFzIHdlbGwgYXMgaXRzCi0gKiB2YWx1ZSAoYm90aCBhcmUgc3RyaW5ncykgaXMgcmV0dXJuZWQuIElmIHRoZSBpbmRleCBpcyBpbnZhbGlkCi0gKiAobm90IHN1cHBvcnRlZCksIGEgTlVMTCBrZXkgc3RyaW5nIGlzIHJldHVybmVkLgotICovCi0KLQotLyoKLSAqIFJlZ2lzdHJ5IHZhbHVlIHR5cGVzLgotICovCi0KLSNkZWZpbmUgUkVHX1NaIDEKLSNkZWZpbmUgUkVHX1UzMiA0Ci0jZGVmaW5lIFJFR19VNjQgOAotCi0vKgotICogQXMgd2UgbG9vayBhdCBleHBhbmRpbmcgdGhlIEtWUCBmdW5jdGlvbmFsaXR5IHRvIGluY2x1ZGUKLSAqIElQIGluamVjdGlvbiBmdW5jdGlvbmFsaXR5LCB3ZSBuZWVkIHRvIG1haW50YWluIGJpbmFyeQotICogY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGRhZW1vbnMuCi0gKgotICogVGhlIEtWUCBvcGNvZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBob3N0IGFuZCBpdCB3YXMgdW5mb3J0dW5hdGUKLSAqIHRoYXQgSSBjaG9zZSB0byB0cmVhdCB0aGUgcmVnaXN0cmF0aW9uIG9wZXJhdGlvbiBhcyBwYXJ0IG9mIHRoZQotICogS1ZQIG9wZXJhdGlvbnMgZGVmaW5lZCBieSB0aGUgaG9zdC4KLSAqIEhlcmUgaXMgdGhlIGxldmVsIG9mIGNvbXBhdGliaWxpdHkKLSAqIChiZXR3ZWVuIHRoZSB1c2VyIGxldmVsIGRhZW1vbiBhbmQgdGhlIGtlcm5lbCBLVlAgZHJpdmVyKSB0aGF0IHdlCi0gKiB3aWxsIGltcGxlbWVudDoKLSAqCi0gKiBBbiBvbGRlciBkYWVtb24gd2lsbCBhbHdheXMgYmUgc3VwcG9ydGVkIG9uIGEgbmV3ZXIgZHJpdmVyLgotICogQSBnaXZlbiB1c2VyIGxldmVsIGRhZW1vbiB3aWxsIHJlcXVpcmUgYSBtaW5pbWFsIHZlcnNpb24gb2YgdGhlCi0gKiBrZXJuZWwgZHJpdmVyLgotICogSWYgd2UgY2Fubm90IGhhbmRsZSB0aGUgdmVyc2lvbiBkaWZmZXJlbmNlcywgd2Ugd2lsbCBmYWlsIGdyYWNlZnVsbHkKLSAqICh0aGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBoYXZlIGEgdXNlciBsZXZlbCBkYWVtb24gdGhhdCBpcyBtb3JlCi0gKiBhZHZhbmNlZCB0aGFuIHRoZSBLVlAgZHJpdmVyLgotICoKLSAqIFdlIHdpbGwgdXNlIHZhbHVlcyB1c2VkIGluIHRoaXMgaGFuZHNoYWtlIGZvciBkZXRlcm1pbmluZyBpZiB3ZSBoYXZlCi0gKiB3b3JrYWJsZSB1c2VyIGxldmVsIGRhZW1vbiBhbmQgdGhlIGtlcm5lbCBkcml2ZXIuIFdlIGJlZ2luIGJ5IHRha2luZyB0aGUKLSAqIHJlZ2lzdHJhdGlvbiBvcGNvZGUgb3V0IG9mIHRoZSBLVlAgb3Bjb2RlIG5hbWVzcGFjZS4gV2Ugd2lsbCBob3dldmVyLAotICogbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBleGlzdGluZyB1c2VyLWxldmVsIGRhZW1vbiBjb2RlLgotICovCi0KLS8qCi0gKiBEYWVtb24gY29kZSBub3Qgc3VwcG9ydGluZyBJUCBpbmplY3Rpb24gKGxlZ2FjeSBkYWVtb24pLgotICovCi0KLSNkZWZpbmUgS1ZQX09QX1JFR0lTVEVSCTQKLQotLyoKLSAqIERhZW1vbiBjb2RlIHN1cHBvcnRpbmcgSVAgaW5qZWN0aW9uLgotICogVGhlIEtWUCBvcGNvZGUgZmllbGQgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB0aGUKLSAqIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbjsgc28gZGVmaW5lIGEgbmFtZXNwYWNlIHRoYXQKLSAqIHdpbGwgYmUgZGlzdGluY3QgZnJvbSB0aGUgaG9zdCBkZWZpbmVkIEtWUCBvcGNvZGUuCi0gKi8KLQotI2RlZmluZSBLVlBfT1BfUkVHSVNURVIxIDEwMAotCi1lbnVtIGh2X2t2cF9leGNoZ19vcCB7Ci0JS1ZQX09QX0dFVCA9IDAsCi0JS1ZQX09QX1NFVCwKLQlLVlBfT1BfREVMRVRFLAotCUtWUF9PUF9FTlVNRVJBVEUsCi0JS1ZQX09QX0dFVF9JUF9JTkZPLAotCUtWUF9PUF9TRVRfSVBfSU5GTywKLQlLVlBfT1BfQ09VTlQgLyogTnVtYmVyIG9mIG9wZXJhdGlvbnMsIG11c3QgYmUgbGFzdC4gKi8KLX07Ci0KLWVudW0gaHZfa3ZwX2V4Y2hnX3Bvb2wgewotCUtWUF9QT09MX0VYVEVSTkFMID0gMCwKLQlLVlBfUE9PTF9HVUVTVCwKLQlLVlBfUE9PTF9BVVRPLAotCUtWUF9QT09MX0FVVE9fRVhURVJOQUwsCi0JS1ZQX1BPT0xfQVVUT19JTlRFUk5BTCwKLQlLVlBfUE9PTF9DT1VOVCAvKiBOdW1iZXIgb2YgcG9vbHMsIG11c3QgYmUgbGFzdC4gKi8KLX07Ci0KLS8qCi0gKiBTb21lIEh5cGVyLVYgc3RhdHVzIGNvZGVzLgotICovCi0KLSNkZWZpbmUgSFZfU19PSwkJCQkweDAwMDAwMDAwCi0jZGVmaW5lIEhWX0VfRkFJTAkJCTB4ODAwMDQwMDUKLSNkZWZpbmUgSFZfU19DT05UCQkJMHg4MDA3MDEwMwotI2RlZmluZSBIVl9FUlJPUl9OT1RfU1VQUE9SVEVECQkweDgwMDcwMDMyCi0jZGVmaW5lIEhWX0VSUk9SX01BQ0hJTkVfTE9DS0VECQkweDgwMDcwNEY3Ci0jZGVmaW5lIEhWX0VSUk9SX0RFVklDRV9OT1RfQ09OTkVDVEVECTB4ODAwNzA0OEYKLSNkZWZpbmUgSFZfSU5WQUxJREFSRwkJCTB4ODAwNzAwNTcKLSNkZWZpbmUgSFZfR1VJRF9OT1RGT1VORAkJMHg4MDA0MTAwMgotCi0jZGVmaW5lIEFERFJfRkFNSUxZX05PTkUJMHgwMAotI2RlZmluZSBBRERSX0ZBTUlMWV9JUFY0CTB4MDEKLSNkZWZpbmUgQUREUl9GQU1JTFlfSVBWNgkweDAyCi0KLSNkZWZpbmUgTUFYX0FEQVBURVJfSURfU0laRQkxMjgKLSNkZWZpbmUgTUFYX0lQX0FERFJfU0laRQkxMDI0Ci0jZGVmaW5lIE1BWF9HQVRFV0FZX1NJWkUJNTEyCi0KLQotc3RydWN0IGh2X2t2cF9pcGFkZHJfdmFsdWUgewotCV9fdTE2CWFkYXB0ZXJfaWRbTUFYX0FEQVBURVJfSURfU0laRV07Ci0JX191OAlhZGRyX2ZhbWlseTsKLQlfX3U4CWRoY3BfZW5hYmxlZDsKLQlfX3UxNglpcF9hZGRyW01BWF9JUF9BRERSX1NJWkVdOwotCV9fdTE2CXN1Yl9uZXRbTUFYX0lQX0FERFJfU0laRV07Ci0JX191MTYJZ2F0ZV93YXlbTUFYX0dBVEVXQVlfU0laRV07Ci0JX191MTYJZG5zX2FkZHJbTUFYX0lQX0FERFJfU0laRV07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLXN0cnVjdCBodl9rdnBfaGRyIHsKLQlfX3U4IG9wZXJhdGlvbjsKLQlfX3U4IHBvb2w7Ci0JX191MTYgcGFkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGh2X2t2cF9leGNoZ19tc2dfdmFsdWUgewotCV9fdTMyIHZhbHVlX3R5cGU7Ci0JX191MzIga2V5X3NpemU7Ci0JX191MzIgdmFsdWVfc2l6ZTsKLQlfX3U4IGtleVtIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFXTsKLQl1bmlvbiB7Ci0JCV9fdTggdmFsdWVbSFZfS1ZQX0VYQ0hBTkdFX01BWF9WQUxVRV9TSVpFXTsKLQkJX191MzIgdmFsdWVfdTMyOwotCQlfX3U2NCB2YWx1ZV91NjQ7Ci0JfTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodl9rdnBfbXNnX2VudW1lcmF0ZSB7Ci0JX191MzIgaW5kZXg7Ci0Jc3RydWN0IGh2X2t2cF9leGNoZ19tc2dfdmFsdWUgZGF0YTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodl9rdnBfbXNnX2dldCB7Ci0Jc3RydWN0IGh2X2t2cF9leGNoZ19tc2dfdmFsdWUgZGF0YTsKLX07Ci0KLXN0cnVjdCBodl9rdnBfbXNnX3NldCB7Ci0Jc3RydWN0IGh2X2t2cF9leGNoZ19tc2dfdmFsdWUgZGF0YTsKLX07Ci0KLXN0cnVjdCBodl9rdnBfbXNnX2RlbGV0ZSB7Ci0JX191MzIga2V5X3NpemU7Ci0JX191OCBrZXlbSFZfS1ZQX0VYQ0hBTkdFX01BWF9LRVlfU0laRV07Ci19OwotCi1zdHJ1Y3QgaHZfa3ZwX3JlZ2lzdGVyIHsKLQlfX3U4IHZlcnNpb25bSFZfS1ZQX0VYQ0hBTkdFX01BWF9LRVlfU0laRV07Ci19OwotCi1zdHJ1Y3QgaHZfa3ZwX21zZyB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaHZfa3ZwX2hkcglrdnBfaGRyOwotCQlpbnQgZXJyb3I7Ci0JfTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBodl9rdnBfbXNnX2dldAkJa3ZwX2dldDsKLQkJc3RydWN0IGh2X2t2cF9tc2dfc2V0CQlrdnBfc2V0OwotCQlzdHJ1Y3QgaHZfa3ZwX21zZ19kZWxldGUJa3ZwX2RlbGV0ZTsKLQkJc3RydWN0IGh2X2t2cF9tc2dfZW51bWVyYXRlCWt2cF9lbnVtX2RhdGE7Ci0JCXN0cnVjdCBodl9rdnBfaXBhZGRyX3ZhbHVlICAgICAga3ZwX2lwX3ZhbDsKLQkJc3RydWN0IGh2X2t2cF9yZWdpc3RlcgkJa3ZwX3JlZ2lzdGVyOwotCX0gYm9keTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodl9rdnBfaXBfbXNnIHsKLQlfX3U4IG9wZXJhdGlvbjsKLQlfX3U4IHBvb2w7Ci0Jc3RydWN0IGh2X2t2cF9pcGFkZHJfdmFsdWUgICAgICBrdnBfaXBfdmFsOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CkBAIC0zNTQsNyArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogCiAKLSNkZWZpbmUgTUFYX1BBR0VfQlVGRkVSX0NPVU5UCQkJCTE5CisjZGVmaW5lIE1BWF9QQUdFX0JVRkZFUl9DT1VOVAkJCQkzMgogI2RlZmluZSBNQVhfTVVMVElQQUdFX0JVRkZFUl9DT1VOVAkJCTMyIC8qIDEyOEsgKi8KIAogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCkBAIC0xMDQzLDYgKzcyNiwxMCBAQAogCSAqIFRoaXMgd2lsbCBiZSBOVUxMIGZvciB0aGUgcHJpbWFyeSBjaGFubmVsLgogCSAqLwogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpwcmltYXJ5X2NoYW5uZWw7CisJLyoKKwkgKiBTdXBwb3J0IHBlci1jaGFubmVsIHN0YXRlIGZvciB1c2UgYnkgdm1idXMgZHJpdmVycy4KKwkgKi8KKwl2b2lkICpwZXJfY2hhbm5lbF9zdGF0ZTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2hhbm5lbF9yZWFkX3N0YXRlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjLCBib29sIHN0YXRlKQpAQCAtMTA1MCw2ICs3MzcsMTYgQEAKIAljLT5iYXRjaGVkX3JlYWRpbmcgPSBzdGF0ZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9wZXJfY2hhbm5lbF9zdGF0ZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqYywgdm9pZCAqcykKK3sKKwljLT5wZXJfY2hhbm5lbF9zdGF0ZSA9IHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X3Blcl9jaGFubmVsX3N0YXRlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjKQoreworCXJldHVybiBjLT5wZXJfY2hhbm5lbF9zdGF0ZTsKK30KKwogdm9pZCB2bWJ1c19vbm1lc3NhZ2Uodm9pZCAqY29udGV4dCk7CiAKIGludCB2bWJ1c19yZXF1ZXN0X29mZmVycyh2b2lkKTsKQEAgLTExMTgsNyArODE1LDcgQEAKIGV4dGVybiB2b2lkIHZtYnVzX2Nsb3NlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKIAogZXh0ZXJuIGludCB2bWJ1c19zZW5kcGFja2V0KHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLAotCQkJCSAgY29uc3Qgdm9pZCAqYnVmZmVyLAorCQkJCSAgdm9pZCAqYnVmZmVyLAogCQkJCSAgdTMyIGJ1ZmZlckxlbiwKIAkJCQkgIHU2NCByZXF1ZXN0aWQsCiAJCQkJICBlbnVtIHZtYnVzX3BhY2tldF90eXBlIHR5cGUsCkBAIC0xMzUyLDYgKzEwNDksMTcgQEAKIAkJfQogCiAvKgorICogR3Vlc3QgRmlsZSBDb3B5IFNlcnZpY2UKKyAqIHszNEQxNEJFMy1ERUU0LTQxYzgtOUFFNy02QjE3NDk3N0MxOTJ9CisgKi8KKworI2RlZmluZSBIVl9GQ09QWV9HVUlEIFwKKwkuZ3VpZCA9IHsgXAorCQkJMHhFMywgMHg0QiwgMHhEMSwgMHgzNCwgMHhFNCwgMHhERSwgMHhDOCwgMHg0MSwgXAorCQkJMHg5QSwgMHhFNywgMHg2QiwgMHgxNywgMHg0OSwgMHg3NywgMHhDMSwgMHg5MiBcCisJCX0KKworLyoKICAqIENvbW1vbiBoZWFkZXIgZm9yIEh5cGVyLVYgSUNzCiAgKi8KIApAQCAtMTQ1OSwxMSArMTE2NywxMiBAQAogdm9pZCBodl92c3NfZGVpbml0KHZvaWQpOwogdm9pZCBodl92c3Nfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqKTsKIAorZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBoeXBlcnZfbW1pbzsKKwogLyoKICAqIE5lZ290aWF0ZWQgdmVyc2lvbiB3aXRoIHRoZSBIb3N0LgogICovCiAKIGV4dGVybiBfX3UzMiB2bWJ1c19wcm90b192ZXJzaW9uOwogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9IWVBFUlZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZHIuaCBiL2luY2x1ZGUvbGludXgvaWRyLmgKaW5kZXggODcxYTIxMy4uOWM5NWQyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkci5oCkBAIC04NSw2ICs4NSw3IEBACiB2b2lkIGlkcl9mcmVlKHN0cnVjdCBpZHIgKmlkcCwgaW50IGlkKTsKIHZvaWQgaWRyX2Rlc3Ryb3koc3RydWN0IGlkciAqaWRwKTsKIHZvaWQgaWRyX2luaXQoc3RydWN0IGlkciAqaWRwKTsKK2Jvb2wgaWRyX2lzX2VtcHR5KHN0cnVjdCBpZHIgKmlkcCk7CiAKIC8qKgogICogaWRyX3ByZWxvYWRfZW5kIC0gZW5kIHByZWxvYWQgc2VjdGlvbiBzdGFydGVkIHdpdGggaWRyX3ByZWxvYWQoKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9paW8vaWlvLmggYi9pbmNsdWRlL2xpbnV4L2lpby9paW8uaAppbmRleCA3NWE4YTIwLi41ZjJkMDBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby9paW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lpby9paW8uaApAQCAtMjU0LDEyICsyNTQsMTYgQEAKIAkJKGNoYW4tPmluZm9fbWFza19zaGFyZWRfYnlfYWxsICYgQklUKHR5cGUpKTsKIH0KIAotI2RlZmluZSBJSU9fU1Qoc2ksIHJiLCBzYiwgc2gpCQkJCQkJXAotCXsgLnNpZ24gPSBzaSwgLnJlYWxiaXRzID0gcmIsIC5zdG9yYWdlYml0cyA9IHNiLCAuc2hpZnQgPSBzaCB9Ci0KLSNkZWZpbmUgSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoX3NpKQkJCQkJXAotCXsgLnR5cGUgPSBJSU9fVElNRVNUQU1QLCAuY2hhbm5lbCA9IC0xLAkJCQlcCi0JCQkuc2Nhbl9pbmRleCA9IF9zaSwgLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDY0LCA2NCwgMCkgfQorI2RlZmluZSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUChfc2kpIHsJCQkJCVwKKwkudHlwZSA9IElJT19USU1FU1RBTVAsCQkJCQkJXAorCS5jaGFubmVsID0gLTEsCQkJCQkJCVwKKwkuc2Nhbl9pbmRleCA9IF9zaSwJCQkJCQlcCisJLnNjYW5fdHlwZSA9IHsJCQkJCQkJXAorCQkuc2lnbiA9ICdzJywJCQkJCQlcCisJCS5yZWFsYml0cyA9IDY0LAkJCQkJXAorCQkuc3RvcmFnZWJpdHMgPSA2NCwJCQkJCVwKKwkJfSwJCQkJCQkJXAorfQogCiAvKioKICAqIGlpb19nZXRfdGltZV9ucygpIC0gdXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgYSB0aW1lIHN0YW1wIGZvciBldmVudHMgZXRjCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXQuaCBiL2luY2x1ZGUvbGludXgvaW5pdC5oCmluZGV4IGUxNjg4ODAuLmEzYmEyNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdC5oCkBAIC0xNjMsNiArMTYzLDIzIEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKKyNpZmRlZiBDT05GSUdfTFRPCisvKiBXb3JrIGFyb3VuZCBhIExUTyBnY2MgcHJvYmxlbTogd2hlbiB0aGVyZSBpcyBubyByZWZlcmVuY2UgdG8gYSB2YXJpYWJsZQorICogaW4gYSBtb2R1bGUgaXQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtLiBUaGlzIGNhdXNlcworICogcmVvcmRlcmluZyBvZiBpbml0Y2FsbHMgd2hpY2ggdGhlIGtlcm5lbCBkb2VzIG5vdCBsaWtlLgorICogQWRkIGEgZHVtbXkgcmVmZXJlbmNlIGZ1bmN0aW9uIHRvIGF2b2lkIHRoaXMuIFRoZSBmdW5jdGlvbiBpcworICogZGVsZXRlZCBieSB0aGUgbGlua2VyLgorICovCisjZGVmaW5lIExUT19SRUZFUkVOQ0VfSU5JVENBTEwoeCkgXAorCTsgLyogeWVzIHRoaXMgaXMgbmVlZGVkICovCQkJXAorCXN0YXRpYyBfX3VzZWQgX19leGl0IHZvaWQgKnJlZmVyZW5jZV8jI3godm9pZCkJXAorCXsJCQkJCQlcCisJCXJldHVybiAmeDsJCQkJXAorCX0KKyNlbHNlCisjZGVmaW5lIExUT19SRUZFUkVOQ0VfSU5JVENBTEwoeCkKKyNlbmRpZgorCiAvKiBpbml0Y2FsbHMgYXJlIG5vdyBncm91cGVkIGJ5IGZ1bmN0aW9uYWxpdHkgaW50byBzZXBhcmF0ZSAKICAqIHN1YnNlY3Rpb25zLiBPcmRlcmluZyBpbnNpZGUgdGhlIHN1YnNlY3Rpb25zIGlzIGRldGVybWluZWQKICAqIGJ5IGxpbmsgb3JkZXIuIApAQCAtMTc1LDcgKzE5Miw4IEBACiAKICNkZWZpbmUgX19kZWZpbmVfaW5pdGNhbGwoZm4sIGlkKSBcCiAJc3RhdGljIGluaXRjYWxsX3QgX19pbml0Y2FsbF8jI2ZuIyNpZCBfX3VzZWQgXAotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuaW5pdGNhbGwiICNpZCAiLmluaXQiKSkpID0gZm4KKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmluaXRjYWxsIiAjaWQgIi5pbml0IikpKSA9IGZuOyBcCisJTFRPX1JFRkVSRU5DRV9JTklUQ0FMTChfX2luaXRjYWxsXyMjZm4jI2lkKQogCiAvKgogICogRWFybHkgaW5pdGNhbGxzIHJ1biBiZWZvcmUgaW5pdGlhbGl6aW5nIFNNUC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IGEyNjc4ZDMuLmM3YmZhYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMTg4LDYgKzE4OCw3IEBACiBleHRlcm4gdm9pZCBkaXNhYmxlX3BlcmNwdV9pcnEodW5zaWduZWQgaW50IGlycSk7CiBleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX3BlcmNwdV9pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpOworZXh0ZXJuIHZvaWQgaXJxX3dha2VfdGhyZWFkKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKIC8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFyZSBmb3IgdGhlIGNvcmUga2VybmVsIHVzZSBvbmx5LiAqLwogZXh0ZXJuIHZvaWQgc3VzcGVuZF9kZXZpY2VfaXJxcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8uaCBiL2luY2x1ZGUvbGludXgvaW8uaAppbmRleCBmNGY0MmZhLi44YTE4ZTc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0cnVjdCBkZXZpY2U7CiAKLXZvaWQgX19pb3dyaXRlMzJfY29weSh2b2lkIF9faW9tZW0gKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgY291bnQpOworX192aXNpYmxlIHZvaWQgX19pb3dyaXRlMzJfY29weSh2b2lkIF9faW9tZW0gKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgY291bnQpOwogdm9pZCBfX2lvd3JpdGU2NF9jb3B5KHZvaWQgX19pb21lbSAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBjb3VudCk7CiAKICNpZmRlZiBDT05GSUdfTU1VCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaAppbmRleCA4OWI3YzI0Li41ZTNhOTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKQEAgLTUxLDcgKzUxLDcgQEAKIAogI2RlZmluZSBJT1JFU09VUkNFX0VYQ0xVU0lWRQkweDA4MDAwMDAwCS8qIFVzZXJsYW5kIG1heSBub3QgbWFwIHRoaXMgcmVzb3VyY2UgKi8KICNkZWZpbmUgSU9SRVNPVVJDRV9ESVNBQkxFRAkweDEwMDAwMDAwCi0jZGVmaW5lIElPUkVTT1VSQ0VfVU5TRVQJMHgyMDAwMDAwMAorI2RlZmluZSBJT1JFU09VUkNFX1VOU0VUCTB4MjAwMDAwMDAJLyogTm8gYWRkcmVzcyBhc3NpZ25lZCB5ZXQgKi8KICNkZWZpbmUgSU9SRVNPVVJDRV9BVVRPCQkweDQwMDAwMDAwCiAjZGVmaW5lIElPUkVTT1VSQ0VfQlVTWQkJMHg4MDAwMDAwMAkvKiBEcml2ZXIgaGFzIG1hcmtlZCB0aGlzIHJlc291cmNlIGJ1c3kgKi8KIApAQCAtMTY5LDYgKzE2OSwxNiBAQAogewogCXJldHVybiByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9UWVBFX0JJVFM7CiB9CisvKiBUcnVlIGlmZiByMSBjb21wbGV0ZWx5IGNvbnRhaW5zIHIyICovCitzdGF0aWMgaW5saW5lIGJvb2wgcmVzb3VyY2VfY29udGFpbnMoc3RydWN0IHJlc291cmNlICpyMSwgc3RydWN0IHJlc291cmNlICpyMikKK3sKKwlpZiAocmVzb3VyY2VfdHlwZShyMSkgIT0gcmVzb3VyY2VfdHlwZShyMikpCisJCXJldHVybiBmYWxzZTsKKwlpZiAocjEtPmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCB8fCByMi0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHIxLT5zdGFydCA8PSByMi0+c3RhcnQgJiYgcjEtPmVuZCA+PSByMi0+ZW5kOworfQorCiAKIC8qIENvbnZlbmllbmNlIHNob3J0aGFuZCB3aXRoIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgcmVxdWVzdF9yZWdpb24oc3RhcnQsbixuYW1lKQkJX19yZXF1ZXN0X3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IDdkYzEwMDMuLmQyNzg4MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMzAzLDYgKzMwMywxMCBAQAogICogQGlycV9wbV9zaHV0ZG93bjoJZnVuY3Rpb24gY2FsbGVkIGZyb20gY29yZSBjb2RlIG9uIHNodXRkb3duIG9uY2UgcGVyIGNoaXAKICAqIEBpcnFfY2FsY19tYXNrOglPcHRpb25hbCBmdW5jdGlvbiB0byBzZXQgaXJxX2RhdGEubWFzayBmb3Igc3BlY2lhbCBjYXNlcwogICogQGlycV9wcmludF9jaGlwOglvcHRpb25hbCB0byBwcmludCBzcGVjaWFsIGNoaXAgaW5mbyBpbiBzaG93X2ludGVycnVwdHMKKyAqIEBpcnFfcmVxdWVzdF9yZXNvdXJjZXM6CW9wdGlvbmFsIHRvIHJlcXVlc3QgcmVzb3VyY2VzIGJlZm9yZSBjYWxsaW5nCisgKgkJCQlhbnkgb3RoZXIgY2FsbGJhY2sgcmVsYXRlZCB0byB0aGlzIGlycQorICogQGlycV9yZWxlYXNlX3Jlc291cmNlczoJb3B0aW9uYWwgdG8gcmVsZWFzZSByZXNvdXJjZXMgYWNxdWlyZWQgd2l0aAorICoJCQkJaXJxX3JlcXVlc3RfcmVzb3VyY2VzCiAgKiBAZmxhZ3M6CQljaGlwIHNwZWNpZmljIGZsYWdzCiAgKi8KIHN0cnVjdCBpcnFfY2hpcCB7CkBAIC0zMzYsNiArMzQwLDggQEAKIAl2b2lkCQkoKmlycV9jYWxjX21hc2spKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CiAKIAl2b2lkCQkoKmlycV9wcmludF9jaGlwKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHN0cnVjdCBzZXFfZmlsZSAqcCk7CisJaW50CQkoKmlycV9yZXF1ZXN0X3Jlc291cmNlcykoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKKwl2b2lkCQkoKmlycV9yZWxlYXNlX3Jlc291cmNlcykoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKIAogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiB9OwpAQCAtMzQ5LDYgKzM1NSw4IEBACiAgKiBJUlFDSElQX09OT0ZGTElORV9FTkFCTEVEOglPbmx5IGNhbGwgaXJxX29uL29mZl9saW5lIGNhbGxiYWNrcwogICoJCQkJd2hlbiBpcnEgZW5hYmxlZAogICogSVJRQ0hJUF9TS0lQX1NFVF9XQUtFOglTa2lwIGNoaXAuaXJxX3NldF93YWtlKCksIGZvciB0aGlzIGlycSBjaGlwCisgKiBJUlFDSElQX09ORVNIT1RfU0FGRToJT25lIHNob3QgZG9lcyBub3QgcmVxdWlyZSBtYXNrL3VubWFzaworICogSVJRQ0hJUF9FT0lfVEhSRUFERUQ6CUNoaXAgcmVxdWlyZXMgZW9pKCkgb24gdW5tYXNrIGluIHRocmVhZGVkIG1vZGUKICAqLwogZW51bSB7CiAJSVJRQ0hJUF9TRVRfVFlQRV9NQVNLRUQJCT0gKDEgPDwgIDApLApAQCAtMzU3LDYgKzM2NSw3IEBACiAJSVJRQ0hJUF9PTk9GRkxJTkVfRU5BQkxFRAk9ICgxIDw8ICAzKSwKIAlJUlFDSElQX1NLSVBfU0VUX1dBS0UJCT0gKDEgPDwgIDQpLAogCUlSUUNISVBfT05FU0hPVF9TQUZFCQk9ICgxIDw8ICA1KSwKKwlJUlFDSElQX0VPSV9USFJFQURFRAkJPSAoMSA8PCAgNiksCiB9OwogCiAvKiBUaGlzIGluY2x1ZGUgd2lsbCBnbyBhd2F5IG9uY2Ugd2UgaXNvbGF0ZWQgaXJxX2Rlc2MgdXNhZ2UgdG8gY29yZSBjb2RlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycV93b3JrLmggYi9pbmNsdWRlL2xpbnV4L2lycV93b3JrLmgKaW5kZXggNjYwMTcwMi4uMTlhZTA1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFfd29yay5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxX3dvcmsuaApAQCAtMzAsNyArMzAsOSBAQAogCXdvcmstPmZ1bmMgPSBmdW5jOwogfQogCi12b2lkIGlycV93b3JrX3F1ZXVlKHN0cnVjdCBpcnFfd29yayAqd29yayk7CisjZGVmaW5lIERFRklORV9JUlFfV09SSyhuYW1lLCBfZikgc3RydWN0IGlycV93b3JrIG5hbWUgPSB7IC5mdW5jID0gKF9mKSwgfQorCitib29sIGlycV93b3JrX3F1ZXVlKHN0cnVjdCBpcnFfd29yayAqd29yayk7CiB2b2lkIGlycV93b3JrX3J1bih2b2lkKTsKIHZvaWQgaXJxX3dvcmtfc3luYyhzdHJ1Y3QgaXJxX3dvcmsgKndvcmspOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCAxOTZkMWVhLi4wOGZiMDI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCiAjZGVmaW5lIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRQkwCiAjZGVmaW5lIFRBSU5UX0ZPUkNFRF9NT0RVTEUJCTEKLSNkZWZpbmUgVEFJTlRfVU5TQUZFX1NNUAkJMgorI2RlZmluZSBUQUlOVF9DUFVfT1VUX09GX1NQRUMJCTIKICNkZWZpbmUgVEFJTlRfRk9SQ0VEX1JNTU9ECQkzCiAjZGVmaW5lIFRBSU5UX01BQ0hJTkVfQ0hFQ0sJCTQKICNkZWZpbmUgVEFJTlRfQkFEX1BBR0UJCQk1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKaW5kZXggNTFjNzJiZS4uZWNiYzUyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0aW1lLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY3B1dGltZS5oPgogCiAvKgogICogJ2tlcm5lbF9zdGF0LmgnIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBuZWVkZWQgZm9yIGRvaW5nCkBAIC01MSwxNCArNTEsOCBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG5yX2NvbnRleHRfc3dpdGNoZXModm9pZCk7CiAKLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIGV4dGVybiB1bnNpZ25lZCBpbnQga3N0YXRfaXJxc19jcHUodW5zaWduZWQgaW50IGlycSwgaW50IGNwdSk7Ci0KLSNkZWZpbmUga3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycW5vLCBERVNDKQkJXAotZG8gewkJCQkJCQlcCi0JX190aGlzX2NwdV9pbmMoKihERVNDKS0+a3N0YXRfaXJxcyk7CQlcCi0JX190aGlzX2NwdV9pbmMoa3N0YXQuaXJxc19zdW0pOwkJCVwKLX0gd2hpbGUgKDApCitleHRlcm4gdm9pZCBrc3RhdF9pbmNyX2lycV90aGlzX2NwdSh1bnNpZ25lZCBpbnQgaXJxKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGtzdGF0X2luY3Jfc29mdGlycXNfdGhpc19jcHUodW5zaWduZWQgaW50IGlycSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmZzLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5mcy5oCmluZGV4IGQyNjc2MjMuLmIwMTIyZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZnMuaApAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCiBzdHJ1Y3QgZmlsZTsKIHN0cnVjdCBkZW50cnk7CkBAIC0zNSwxNiArMzUsMjIgQEAKIH07CiAKICNkZWZpbmUgS0VSTkZTX1RZUEVfTUFTSwkweDAwMGYKLSNkZWZpbmUgS0VSTkZTX0FDVElWRV9SRUYJS0VSTkZTX0ZJTEUKICNkZWZpbmUgS0VSTkZTX0ZMQUdfTUFTSwl+S0VSTkZTX1RZUEVfTUFTSwogCiBlbnVtIGtlcm5mc19ub2RlX2ZsYWcgewotCUtFUk5GU19SRU1PVkVECQk9IDB4MDAxMCwKKwlLRVJORlNfQUNUSVZBVEVECT0gMHgwMDEwLAogCUtFUk5GU19OUwkJPSAweDAwMjAsCiAJS0VSTkZTX0hBU19TRVFfU0hPVwk9IDB4MDA0MCwKIAlLRVJORlNfSEFTX01NQVAJCT0gMHgwMDgwLAogCUtFUk5GU19MT0NLREVQCQk9IDB4MDEwMCwKIAlLRVJORlNfU1RBVElDX05BTUUJPSAweDAyMDAsCisJS0VSTkZTX1NVSUNJREFMCQk9IDB4MDQwMCwKKwlLRVJORlNfU1VJQ0lERUQJCT0gMHgwODAwLAorfTsKKworLyogQGZsYWdzIGZvciBrZXJuZnNfY3JlYXRlX3Jvb3QoKSAqLworZW51bSBrZXJuZnNfcm9vdF9mbGFnIHsKKwlLRVJORlNfUk9PVF9DUkVBVEVfREVBQ1RJVkFURUQgPSAweDAwMDEsCiB9OwogCiAvKiB0eXBlLXNwZWNpZmljIHN0cnVjdHVyZXMgZm9yIGtlcm5mc19ub2RlIHVuaW9uIG1lbWJlcnMgKi8KQEAgLTg1LDE3ICs5MSwxNyBAQAogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCiAJc3RydWN0IGxvY2tkZXBfbWFwCWRlcF9tYXA7CiAjZW5kaWYKLQkvKiB0aGUgZm9sbG93aW5nIHR3byBmaWVsZHMgYXJlIHB1Ymxpc2hlZCAqLworCS8qCisJICogVXNlIGtlcm5mc19nZXRfcGFyZW50KCkgYW5kIGtlcm5mc19uYW1lL3BhdGgoKSBpbnN0ZWFkIG9mCisJICogYWNjZXNzaW5nIHRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBkaXJlY3RseS4gIElmIHRoZSBub2RlIGlzCisJICogbmV2ZXIgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcGFyZW50LCBpdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUKKwkgKiBwYXJlbnQgZGlyZWN0bHkuCisJICovCiAJc3RydWN0IGtlcm5mc19ub2RlCSpwYXJlbnQ7CiAJY29uc3QgY2hhcgkJKm5hbWU7CiAKIAlzdHJ1Y3QgcmJfbm9kZQkJcmI7CiAKLQl1bmlvbiB7Ci0JCXN0cnVjdCBjb21wbGV0aW9uCSpjb21wbGV0aW9uOwotCQlzdHJ1Y3Qga2VybmZzX25vZGUJKnJlbW92ZWRfbGlzdDsKLQl9IHU7Ci0KIAljb25zdCB2b2lkCQkqbnM7CS8qIG5hbWVzcGFjZSB0YWcgKi8KIAl1bnNpZ25lZCBpbnQJCWhhc2g7CS8qIG5zICsgbmFtZSBoYXNoICovCiAJdW5pb24gewpAQCAtMTEzLDEyICsxMTksMTYgQEAKIH07CiAKIC8qCi0gKiBrZXJuZnNfZGlyX29wcyBtYXkgYmUgc3BlY2lmaWVkIG9uIGtlcm5mc19jcmVhdGVfcm9vdCgpIHRvIHN1cHBvcnQKLSAqIGRpcmVjdG9yeSBtYW5pcHVsYXRpb24gc3lzY2FsbHMuICBUaGVzZSBvcHRpb25hbCBjYWxsYmFja3MgYXJlIGludm9rZWQKLSAqIG9uIHRoZSBtYXRjaGluZyBzeXNjYWxscyBhbmQgY2FuIHBlcmZvcm0gYW55IGtlcm5mcyBvcGVyYXRpb25zIHdoaWNoCi0gKiBkb24ndCBuZWNlc3NhcmlseSBoYXZlIHRvIGJlIHRoZSBleGFjdCBvcGVyYXRpb24gcmVxdWVzdGVkLgorICoga2VybmZzX3N5c2NhbGxfb3BzIG1heSBiZSBzcGVjaWZpZWQgb24ga2VybmZzX2NyZWF0ZV9yb290KCkgdG8gc3VwcG9ydAorICogc3lzY2FsbHMuICBUaGVzZSBvcHRpb25hbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb24gdGhlIG1hdGNoaW5nIHN5c2NhbGxzCisgKiBhbmQgY2FuIHBlcmZvcm0gYW55IGtlcm5mcyBvcGVyYXRpb25zIHdoaWNoIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgdG8gYmUKKyAqIHRoZSBleGFjdCBvcGVyYXRpb24gcmVxdWVzdGVkLiAgQW4gYWN0aXZlIHJlZmVyZW5jZSBpcyBoZWxkIGZvciBlYWNoCisgKiBrZXJuZnNfbm9kZSBwYXJhbWV0ZXIuCiAgKi8KLXN0cnVjdCBrZXJuZnNfZGlyX29wcyB7CitzdHJ1Y3Qga2VybmZzX3N5c2NhbGxfb3BzIHsKKwlpbnQgKCpyZW1vdW50X2ZzKShzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3QsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOworCWludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IGtlcm5mc19yb290ICpyb290KTsKKwogCWludCAoKm1rZGlyKShzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICB1bW9kZV90IG1vZGUpOwogCWludCAoKnJtZGlyKShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKQEAgLTEyOSwyMiArMTM5LDI2IEBACiBzdHJ1Y3Qga2VybmZzX3Jvb3QgewogCS8qIHB1Ymxpc2hlZCBmaWVsZHMgKi8KIAlzdHJ1Y3Qga2VybmZzX25vZGUJKmtuOworCXVuc2lnbmVkIGludAkJZmxhZ3M7CS8qIEtFUk5GU19ST09UXyogZmxhZ3MgKi8KIAogCS8qIHByaXZhdGUgZmllbGRzLCBkbyBub3QgdXNlIG91dHNpZGUga2VybmZzIHByb3BlciAqLwogCXN0cnVjdCBpZGEJCWlub19pZGE7Ci0Jc3RydWN0IGtlcm5mc19kaXJfb3BzCSpkaXJfb3BzOworCXN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnN5c2NhbGxfb3BzOworCXdhaXRfcXVldWVfaGVhZF90CWRlYWN0aXZhdGVfd2FpdHE7CiB9OwogCiBzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSB7CiAJLyogcHVibGlzaGVkIGZpZWxkcyAqLwogCXN0cnVjdCBrZXJuZnNfbm9kZQkqa247CiAJc3RydWN0IGZpbGUJCSpmaWxlOworCXZvaWQJCQkqcHJpdjsKIAogCS8qIHByaXZhdGUgZmllbGRzLCBkbyBub3QgdXNlIG91dHNpZGUga2VybmZzIHByb3BlciAqLwogCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJaW50CQkJZXZlbnQ7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCisJc2l6ZV90CQkJYXRvbWljX3dyaXRlX2xlbjsKIAlib29sCQkJbW1hcHBlZDsKIAljb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wczsKIH07CkBAIC0xNzEsOSArMTg1LDEzIEBACiAJCQlsb2ZmX3Qgb2ZmKTsKIAogCS8qCi0JICogd3JpdGUoKSBpcyBib3VuY2VkIHRocm91Z2gga2VybmVsIGJ1ZmZlciBhbmQgYSB3cml0ZSBsYXJnZXIgdGhhbgotCSAqIFBBR0VfU0laRSByZXN1bHRzIGluIHBhcnRpYWwgb3BlcmF0aW9uIG9mIFBBR0VfU0laRS4KKwkgKiB3cml0ZSgpIGlzIGJvdW5jZWQgdGhyb3VnaCBrZXJuZWwgYnVmZmVyLiAgSWYgYXRvbWljX3dyaXRlX2xlbgorCSAqIGlzIG5vdCBzZXQsIGEgd3JpdGUgbGFyZ2VyIHRoYW4gUEFHRV9TSVpFIHJlc3VsdHMgaW4gcGFydGlhbAorCSAqIG9wZXJhdGlvbnMgb2YgUEFHRV9TSVpFIGNodW5rcy4gIElmIGF0b21pY193cml0ZV9sZW4gaXMgc2V0LAorCSAqIHdyaXRlcyB1cHRvIHRoZSBzcGVjaWZpZWQgc2l6ZSBhcmUgZXhlY3V0ZWQgYXRvbWljYWxseSBidXQKKwkgKiBsYXJnZXIgb25lcyBhcmUgcmVqZWN0ZWQgd2l0aCAtRTJCSUcuCiAJICovCisJc2l6ZV90IGF0b21pY193cml0ZV9sZW47CiAJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ5dGVzLAogCQkJIGxvZmZfdCBvZmYpOwogCkBAIC0xODQsNyArMjAyLDcgQEAKICNlbmRpZgogfTsKIAotI2lmZGVmIENPTkZJR19TWVNGUworI2lmZGVmIENPTkZJR19LRVJORlMKIAogc3RhdGljIGlubGluZSBlbnVtIGtlcm5mc19ub2RlX3R5cGUga2VybmZzX3R5cGUoc3RydWN0IGtlcm5mc19ub2RlICprbikKIHsKQEAgLTIxNywxMyArMjM1LDIyIEBACiAJcmV0dXJuIGtuLT5mbGFncyAmIEtFUk5GU19OUzsKIH0KIAoraW50IGtlcm5mc19uYW1lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CitjaGFyICogX19tdXN0X2NoZWNrIGtlcm5mc19wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgYnVmbGVuKTsKK3ZvaWQgcHJfY29udF9rZXJuZnNfbmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKK3ZvaWQgcHJfY29udF9rZXJuZnNfcGF0aChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKK3N0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2dldF9wYXJlbnQoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19maW5kX2FuZF9nZXRfbnMoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsCiAJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKm5zKTsKIHZvaWQga2VybmZzX2dldChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKIHZvaWQga2VybmZzX3B1dChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKIAotc3RydWN0IGtlcm5mc19yb290ICprZXJuZnNfY3JlYXRlX3Jvb3Qoc3RydWN0IGtlcm5mc19kaXJfb3BzICprZG9wcywKLQkJCQkgICAgICAgdm9pZCAqcHJpdik7CitzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19ub2RlX2Zyb21fZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitzdHJ1Y3Qga2VybmZzX3Jvb3QgKmtlcm5mc19yb290X2Zyb21fc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKK3N0cnVjdCBrZXJuZnNfcm9vdCAqa2VybmZzX2NyZWF0ZV9yb290KHN0cnVjdCBrZXJuZnNfc3lzY2FsbF9vcHMgKnNjb3BzLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKnByaXYpOwogdm9pZCBrZXJuZnNfZGVzdHJveV9yb290KHN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCk7CiAKIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2NyZWF0ZV9kaXJfbnMoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsCkBAIC0yMzksNyArMjY2LDExIEBACiBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19jcmVhdGVfbGluayhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICAgICAgc3RydWN0IGtlcm5mc19ub2RlICp0YXJnZXQpOwordm9pZCBrZXJuZnNfYWN0aXZhdGUoc3RydWN0IGtlcm5mc19ub2RlICprbik7CiB2b2lkIGtlcm5mc19yZW1vdmUoc3RydWN0IGtlcm5mc19ub2RlICprbik7Cit2b2lkIGtlcm5mc19icmVha19hY3RpdmVfcHJvdGVjdGlvbihzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKK3ZvaWQga2VybmZzX3VuYnJlYWtfYWN0aXZlX3Byb3RlY3Rpb24oc3RydWN0IGtlcm5mc19ub2RlICprbik7Citib29sIGtlcm5mc19yZW1vdmVfc2VsZihzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKTsKIGludCBrZXJuZnNfcmVtb3ZlX2J5X25hbWVfbnMoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgIGNvbnN0IHZvaWQgKm5zKTsKIGludCBrZXJuZnNfcmVuYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIHN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCwKQEAgLTI1NSw3ICsyODYsNyBAQAogCiB2b2lkIGtlcm5mc19pbml0KHZvaWQpOwogCi0jZWxzZQkvKiBDT05GSUdfU1lTRlMgKi8KKyNlbHNlCS8qIENPTkZJR19LRVJORlMgKi8KIAogc3RhdGljIGlubGluZSBlbnVtIGtlcm5mc19ub2RlX3R5cGUga2VybmZzX3R5cGUoc3RydWN0IGtlcm5mc19ub2RlICprbikKIHsgcmV0dXJuIDA7IH0JLyogd2hhdGV2ZXIgKi8KQEAgLTI2NSw2ICsyOTYsMTkgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBrZXJuZnNfbnNfZW5hYmxlZChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQogeyByZXR1cm4gZmFsc2U7IH0KIAorc3RhdGljIGlubGluZSBpbnQga2VybmZzX25hbWUoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreyByZXR1cm4gLUVOT1NZUzsgfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKiBfX211c3RfY2hlY2sga2VybmZzX3BhdGgoc3RydWN0IGtlcm5mc19ub2RlICprbiwgY2hhciAqYnVmLAorCQkJCQkgICAgICBzaXplX3QgYnVmbGVuKQoreyByZXR1cm4gTlVMTDsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJfY29udF9rZXJuZnNfbmFtZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcl9jb250X2tlcm5mc19wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pIHsgfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2dldF9wYXJlbnQoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sgcmV0dXJuIE5VTEw7IH0KKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qga2VybmZzX25vZGUgKgoga2VybmZzX2ZpbmRfYW5kX2dldF9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgIGNvbnN0IHZvaWQgKm5zKQpAQCAtMjczLDggKzMxNywxNSBAQAogc3RhdGljIGlubGluZSB2b2lkIGtlcm5mc19nZXQoc3RydWN0IGtlcm5mc19ub2RlICprbikgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQga2VybmZzX3B1dChzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKSB7IH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19ub2RlX2Zyb21fZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sgcmV0dXJuIE5VTEw7IH0KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2VybmZzX3Jvb3QgKmtlcm5mc19yb290X2Zyb21fc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sgcmV0dXJuIE5VTEw7IH0KKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qga2VybmZzX3Jvb3QgKgota2VybmZzX2NyZWF0ZV9yb290KHN0cnVjdCBrZXJuZnNfZGlyX29wcyAqa2RvcHMsIHZvaWQgKnByaXYpCitrZXJuZnNfY3JlYXRlX3Jvb3Qoc3RydWN0IGtlcm5mc19zeXNjYWxsX29wcyAqc2NvcHMsIHVuc2lnbmVkIGludCBmbGFncywKKwkJICAgdm9pZCAqcHJpdikKIHsgcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7IH0KIAogc3RhdGljIGlubGluZSB2b2lkIGtlcm5mc19kZXN0cm95X3Jvb3Qoc3RydWN0IGtlcm5mc19yb290ICpyb290KSB7IH0KQEAgLTI5Niw4ICszNDcsMTMgQEAKIAkJICAgc3RydWN0IGtlcm5mc19ub2RlICp0YXJnZXQpCiB7IHJldHVybiBFUlJfUFRSKC1FTk9TWVMpOyB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZnNfYWN0aXZhdGUoc3RydWN0IGtlcm5mc19ub2RlICprbikgeyB9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pIHsgfQogCitzdGF0aWMgaW5saW5lIGJvb2wga2VybmZzX3JlbW92ZV9zZWxmKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pCit7IHJldHVybiBmYWxzZTsgfQorCiBzdGF0aWMgaW5saW5lIGludCBrZXJuZnNfcmVtb3ZlX2J5X25hbWVfbnMoc3RydWN0IGtlcm5mc19ub2RlICprbiwKIAkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqbnMpCiB7IHJldHVybiAtRU5PU1lTOyB9CkBAIC0zMjUsNyArMzgxLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGtlcm5mc19pbml0KHZvaWQpIHsgfQogCi0jZW5kaWYJLyogQ09ORklHX1NZU0ZTICovCisjZW5kaWYJLyogQ09ORklHX0tFUk5GUyAqLwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBrZXJuZnNfbm9kZSAqCiBrZXJuZnNfZmluZF9hbmRfZ2V0KHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIGNvbnN0IGNoYXIgKm5hbWUpCkBAIC0zNjcsNiArNDIzLDEzIEBACiAJcmV0dXJuIGtlcm5mc19yZW1vdmVfYnlfbmFtZV9ucyhwYXJlbnQsIG5hbWUsIE5VTEwpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBrZXJuZnNfcmVuYW1lKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sCisJCQkJc3RydWN0IGtlcm5mc19ub2RlICpuZXdfcGFyZW50LAorCQkJCWNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCXJldHVybiBrZXJuZnNfcmVuYW1lX25zKGtuLCBuZXdfcGFyZW50LCBuZXdfbmFtZSwgTlVMTCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqCiBrZXJuZnNfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKIAkgICAgIHN0cnVjdCBrZXJuZnNfcm9vdCAqcm9vdCwgYm9vbCAqbmV3X3NiX2NyZWF0ZWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleGVjLmggYi9pbmNsdWRlL2xpbnV4L2tleGVjLmgKaW5kZXggNmQ0MDY2Yy4uYTc1NjQxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXhlYy5oCisrKyBiL2luY2x1ZGUvbGludXgva2V4ZWMuaApAQCAtMTI3LDEyICsxMjcsNiBAQAogCQkJCQlzdHJ1Y3Qga2V4ZWNfc2VnbWVudCBfX3VzZXIgKnNlZ21lbnRzLAogCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiBpbnQga2VybmVsX2tleGVjKHZvaWQpOwotI2lmZGVmIENPTkZJR19DT01QQVQKLWV4dGVybiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19rZXhlY19sb2FkKHVuc2lnbmVkIGxvbmcgZW50cnksCi0JCQkJdW5zaWduZWQgbG9uZyBucl9zZWdtZW50cywKLQkJCQlzdHJ1Y3QgY29tcGF0X2tleGVjX3NlZ21lbnQgX191c2VyICpzZWdtZW50cywKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKLSNlbmRpZgogZXh0ZXJuIHN0cnVjdCBwYWdlICpraW1hZ2VfYWxsb2NfY29udHJvbF9wYWdlcyhzdHJ1Y3Qga2ltYWdlICppbWFnZSwKIAkJCQkJCXVuc2lnbmVkIGludCBvcmRlcik7CiBleHRlcm4gdm9pZCBjcmFzaF9rZXhlYyhzdHJ1Y3QgcHRfcmVncyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IGJlYzZkYmUuLjFkZTM2YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtODQ4LDcgKzg0OCw2IEBACiAJc3RydWN0IGNvbXBsZXRpb24JcGFya19yZXFfcGVuZGluZzsKIAogCXBtX21lc3NhZ2VfdAkJcG1fbWVzZzsKLQlpbnQJCQkqcG1fcmVzdWx0OwogCWVudW0gYXRhX2xwbV9wb2xpY3kJdGFyZ2V0X2xwbV9wb2xpY3k7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAlmYXN0ZHJhaW5fdGltZXI7CkBAIC0xMTQwLDE2ICsxMTM5LDE0IEBACiAjaWZkZWYgQ09ORklHX1BNCiBleHRlcm4gaW50IGF0YV9ob3N0X3N1c3BlbmQoc3RydWN0IGF0YV9ob3N0ICpob3N0LCBwbV9tZXNzYWdlX3QgbWVzZyk7CiBleHRlcm4gdm9pZCBhdGFfaG9zdF9yZXN1bWUoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKLWV4dGVybiBpbnQgYXRhX3Nhc19wb3J0X2FzeW5jX3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYyk7Ci1leHRlcm4gaW50IGF0YV9zYXNfcG9ydF9hc3luY19yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYyk7CitleHRlcm4gdm9pZCBhdGFfc2FzX3BvcnRfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiB2b2lkIGF0YV9zYXNfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgYXRhX3Nhc19wb3J0X2FzeW5jX3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50ICphc3luYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfc2FzX3BvcnRfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXJldHVybiAwOwogfQotc3RhdGljIGlubGluZSBpbnQgYXRhX3Nhc19wb3J0X2FzeW5jX3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgKmFzeW5jKQorc3RhdGljIGlubGluZSB2b2lkIGF0YV9zYXNfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlyZXR1cm4gMDsKIH0KICNlbmRpZgogZXh0ZXJuIGludCBhdGFfcmF0ZWxpbWl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saW5rYWdlLmggYi9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaAppbmRleCBhNmE0MmRkLi4zNGE1MTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaApAQCAtMTIsOSArMTIsOSBAQAogI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBDUFBfQVNNTElOS0FHRSBleHRlcm4gIkMiCisjZGVmaW5lIENQUF9BU01MSU5LQUdFIGV4dGVybiAiQyIgX192aXNpYmxlCiAjZWxzZQotI2RlZmluZSBDUFBfQVNNTElOS0FHRQorI2RlZmluZSBDUFBfQVNNTElOS0FHRSBfX3Zpc2libGUKICNlbmRpZgogCiAjaWZuZGVmIGFzbWxpbmthZ2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKaW5kZXggOTJiMWJmYy4uMDA4Mzg4ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oCkBAIC0yNTIsOSArMjUyLDkgQEAKIAl1bnNpZ25lZCBpbnQgdHJ5bG9jazoxOwkJCQkJCS8qIDE2IGJpdHMgKi8KIAogCXVuc2lnbmVkIGludCByZWFkOjI7ICAgICAgICAvKiBzZWUgbG9ja19hY3F1aXJlKCkgY29tbWVudCAqLwotCXVuc2lnbmVkIGludCBjaGVjazoyOyAgICAgICAvKiBzZWUgbG9ja19hY3F1aXJlKCkgY29tbWVudCAqLworCXVuc2lnbmVkIGludCBjaGVjazoxOyAgICAgICAvKiBzZWUgbG9ja19hY3F1aXJlKCkgY29tbWVudCAqLwogCXVuc2lnbmVkIGludCBoYXJkaXJxc19vZmY6MTsKLQl1bnNpZ25lZCBpbnQgcmVmZXJlbmNlczoxMTsJCQkJCS8qIDMyIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgcmVmZXJlbmNlczoxMjsJCQkJCS8qIDMyIGJpdHMgKi8KIH07CiAKIC8qCkBAIC0yNjUsNyArMjY1LDcgQEAKIGV4dGVybiB2b2lkIGxvY2tkZXBfcmVzZXQodm9pZCk7CiBleHRlcm4gdm9pZCBsb2NrZGVwX3Jlc2V0X2xvY2soc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrKTsKIGV4dGVybiB2b2lkIGxvY2tkZXBfZnJlZV9rZXlfcmFuZ2Uodm9pZCAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gdm9pZCBsb2NrZGVwX3N5c19leGl0KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBsb2NrZGVwX3N5c19leGl0KHZvaWQpOwogCiBleHRlcm4gdm9pZCBsb2NrZGVwX29mZih2b2lkKTsKIGV4dGVybiB2b2lkIGxvY2tkZXBfb24odm9pZCk7CkBAIC0zMDMsNyArMzAzLDcgQEAKIAkJCQkgKGxvY2spLT5kZXBfbWFwLmtleSwgc3ViKQogCiAjZGVmaW5lIGxvY2tkZXBfc2V0X25vdmFsaWRhdGVfY2xhc3MobG9jaykgXAotCWxvY2tkZXBfc2V0X2NsYXNzKGxvY2ssICZfX2xvY2tkZXBfbm9fdmFsaWRhdGVfXykKKwlsb2NrZGVwX3NldF9jbGFzc19hbmRfbmFtZShsb2NrLCAmX19sb2NrZGVwX25vX3ZhbGlkYXRlX18sICNsb2NrKQogLyoKICAqIENvbXBhcmUgbG9ja2luZyBjbGFzc2VzCiAgKi8KQEAgLTMyNiw5ICszMjYsOCBAQAogICoKICAqIFZhbHVlcyBmb3IgY2hlY2s6CiAgKgotICogICAwOiBkaXNhYmxlZAotICogICAxOiBzaW1wbGUgY2hlY2tzIChmcmVlaW5nLCBoZWxkLWF0LWV4aXQtdGltZSwgZXRjLikKLSAqICAgMjogZnVsbCB2YWxpZGF0aW9uCisgKiAgIDA6IHNpbXBsZSBjaGVja3MgKGZyZWVpbmcsIGhlbGQtYXQtZXhpdC10aW1lLCBldGMuKQorICogICAxOiBmdWxsIHZhbGlkYXRpb24KICAqLwogZXh0ZXJuIHZvaWQgbG9ja19hY3F1aXJlKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgaW50IHN1YmNsYXNzLAogCQkJIGludCB0cnlsb2NrLCBpbnQgcmVhZCwgaW50IGNoZWNrLApAQCAtNDc5LDE1ICs0NzgsOSBAQAogICogb24gdGhlIHBlciBsb2NrLWNsYXNzIGRlYnVnIG1vZGU6CiAgKi8KIAotI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCi0gI2RlZmluZSBsb2NrX2FjcXVpcmVfZXhjbHVzaXZlKGwsIHMsIHQsIG4sIGkpCQlsb2NrX2FjcXVpcmUobCwgcywgdCwgMCwgMiwgbiwgaSkKLSAjZGVmaW5lIGxvY2tfYWNxdWlyZV9zaGFyZWQobCwgcywgdCwgbiwgaSkJCWxvY2tfYWNxdWlyZShsLCBzLCB0LCAxLCAyLCBuLCBpKQotICNkZWZpbmUgbG9ja19hY3F1aXJlX3NoYXJlZF9yZWN1cnNpdmUobCwgcywgdCwgbiwgaSkJbG9ja19hY3F1aXJlKGwsIHMsIHQsIDIsIDIsIG4sIGkpCi0jZWxzZQotICNkZWZpbmUgbG9ja19hY3F1aXJlX2V4Y2x1c2l2ZShsLCBzLCB0LCBuLCBpKQkJbG9ja19hY3F1aXJlKGwsIHMsIHQsIDAsIDEsIG4sIGkpCi0gI2RlZmluZSBsb2NrX2FjcXVpcmVfc2hhcmVkKGwsIHMsIHQsIG4sIGkpCQlsb2NrX2FjcXVpcmUobCwgcywgdCwgMSwgMSwgbiwgaSkKLSAjZGVmaW5lIGxvY2tfYWNxdWlyZV9zaGFyZWRfcmVjdXJzaXZlKGwsIHMsIHQsIG4sIGkpCWxvY2tfYWNxdWlyZShsLCBzLCB0LCAyLCAxLCBuLCBpKQotI2VuZGlmCisjZGVmaW5lIGxvY2tfYWNxdWlyZV9leGNsdXNpdmUobCwgcywgdCwgbiwgaSkJCWxvY2tfYWNxdWlyZShsLCBzLCB0LCAwLCAxLCBuLCBpKQorI2RlZmluZSBsb2NrX2FjcXVpcmVfc2hhcmVkKGwsIHMsIHQsIG4sIGkpCQlsb2NrX2FjcXVpcmUobCwgcywgdCwgMSwgMSwgbiwgaSkKKyNkZWZpbmUgbG9ja19hY3F1aXJlX3NoYXJlZF9yZWN1cnNpdmUobCwgcywgdCwgbiwgaSkJbG9ja19hY3F1aXJlKGwsIHMsIHQsIDIsIDEsIG4sIGkpCiAKICNkZWZpbmUgc3Bpbl9hY3F1aXJlKGwsIHMsIHQsIGkpCQlsb2NrX2FjcXVpcmVfZXhjbHVzaXZlKGwsIHMsIHQsIE5VTEwsIGkpCiAjZGVmaW5lIHNwaW5fYWNxdWlyZV9uZXN0KGwsIHMsIHQsIG4sIGkpCWxvY2tfYWNxdWlyZV9leGNsdXNpdmUobCwgcywgdCwgbiwgaSkKQEAgLTUxOCwxMyArNTExLDEzIEBACiAjIGRlZmluZSBtaWdodF9sb2NrKGxvY2spIAkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJdHlwZWNoZWNrKHN0cnVjdCBsb2NrZGVwX21hcCAqLCAmKGxvY2spLT5kZXBfbWFwKTsJCVwKLQlsb2NrX2FjcXVpcmUoJihsb2NrKS0+ZGVwX21hcCwgMCwgMCwgMCwgMiwgTlVMTCwgX1RISVNfSVBfKTsJXAorCWxvY2tfYWNxdWlyZSgmKGxvY2spLT5kZXBfbWFwLCAwLCAwLCAwLCAxLCBOVUxMLCBfVEhJU19JUF8pOwlcCiAJbG9ja19yZWxlYXNlKCYobG9jayktPmRlcF9tYXAsIDAsIF9USElTX0lQXyk7CQkJXAogfSB3aGlsZSAoMCkKICMgZGVmaW5lIG1pZ2h0X2xvY2tfcmVhZChsb2NrKSAJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogCXR5cGVjaGVjayhzdHJ1Y3QgbG9ja2RlcF9tYXAgKiwgJihsb2NrKS0+ZGVwX21hcCk7CQlcCi0JbG9ja19hY3F1aXJlKCYobG9jayktPmRlcF9tYXAsIDAsIDAsIDEsIDIsIE5VTEwsIF9USElTX0lQXyk7CVwKKwlsb2NrX2FjcXVpcmUoJihsb2NrKS0+ZGVwX21hcCwgMCwgMCwgMSwgMSwgTlVMTCwgX1RISVNfSVBfKTsJXAogCWxvY2tfcmVsZWFzZSgmKGxvY2spLT5kZXBfbWFwLCAwLCBfVEhJU19JUF8pOwkJCVwKIH0gd2hpbGUgKDApCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tY2IuaCBiL2luY2x1ZGUvbGludXgvbWNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiMjg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWNiLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBNRU4gQ2hhbWVsZW9uIEJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTUVOIE1pa3JvZWxla3Ryb25payBHbWJIICh3d3cubWVuLmRlKQorICogQXV0aG9yOiBKb2hhbm5lcyBUaHVtc2hpcm4gPGpvaGFubmVzLnRodW1zaGlybkBtZW4uZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0xJTlVYX01DQl9ICisjZGVmaW5lIF9MSU5VWF9NQ0JfSAorCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisKK3N0cnVjdCBtY2JfZHJpdmVyOworCisvKioKKyAqIHN0cnVjdCBtY2JfYnVzIC0gTUVOIENoYW1lbGVvbiBCdXMKKyAqCisgKiBAZGV2OiBwb2ludGVyIHRvIGNhcnJpZXIgZGV2aWNlCisgKiBAY2hpbGRyZW46IHRoZSBjaGlsZCBidXNzZXMKKyAqIEBidXNfbnI6IG1jYiBidXMgbnVtYmVyCisgKi8KK3N0cnVjdCBtY2JfYnVzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaWxkcmVuOworCXN0cnVjdCBkZXZpY2UgZGV2OworCWludCBidXNfbnI7Cit9OworI2RlZmluZSB0b19tY2JfYnVzKGIpIGNvbnRhaW5lcl9vZigoYiksIHN0cnVjdCBtY2JfYnVzLCBkZXYpCisKKy8qKgorICogc3RydWN0IG1jYl9kZXZpY2UgLSBNRU4gQ2hhbWVsZW9uIEJ1cyBkZXZpY2UKKyAqCisgKiBAYnVzX2xpc3Q6IGludGVybmFsIGxpc3QgaGFuZGxpbmcgZm9yIGJ1cyBjb2RlCisgKiBAZGV2OiBkZXZpY2UgaW4ga2VybmVsIHJlcHJlc2VudGF0aW9uCisgKiBAYnVzOiBtY2IgYnVzIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCB0bworICogQHN1Ym9yZGluYXRlOiBzdWJvcmRpbmF0ZSBNQ0J1cyBpbiBjYXNlIG9mIGJyaWRnZQorICogQGlzX2FkZGVkOiBmbGFnIHRvIGNoZWNrIGlmIGRldmljZSBpcyBhZGRlZCB0byBidXMKKyAqIEBkcml2ZXI6IGFzc29jaWF0ZWQgbWNiX2RyaXZlcgorICogQGlkOiBtY2IgZGV2aWNlIGlkCisgKiBAaW5zdDogaW5zdGFuY2UgaW4gQ2hhbWVsZW9uIHRhYmxlCisgKiBAZ3JvdXA6IGdyb3VwIGluIENoYW1lbGVvbiB0YWJsZQorICogQHZhcjogdmFyaWFudCBpbiBDaGFtZWxlb24gdGFibGUKKyAqIEBiYXI6IEJBUiBpbiBDaGFtZWxlb24gdGFibGUKKyAqIEByZXY6IHJldmlzaW9uIGluIENoYW1lbGVvbiB0YWJsZQorICogQGlycTogSVJRIHJlc291cmNlCisgKiBAbWVtb3J5OiBtZW1vcnkgcmVzb3VyY2UKKyAqLworc3RydWN0IG1jYl9kZXZpY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgYnVzX2xpc3Q7CisJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IG1jYl9idXMgKmJ1czsKKwlzdHJ1Y3QgbWNiX2J1cyAqc3Vib3JkaW5hdGU7CisJYm9vbCBpc19hZGRlZDsKKwlzdHJ1Y3QgbWNiX2RyaXZlciAqZHJpdmVyOworCXUxNiBpZDsKKwlpbnQgaW5zdDsKKwlpbnQgZ3JvdXA7CisJaW50IHZhcjsKKwlpbnQgYmFyOworCWludCByZXY7CisJc3RydWN0IHJlc291cmNlIGlycTsKKwlzdHJ1Y3QgcmVzb3VyY2UgbWVtOworfTsKKyNkZWZpbmUgdG9fbWNiX2RldmljZSh4KSBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3QgbWNiX2RldmljZSwgZGV2KQorCisvKioKKyAqIHN0cnVjdCBtY2JfZHJpdmVyIC0gTUVOIENoYW1lbGVvbiBCdXMgZGV2aWNlIGRyaXZlcgorICoKKyAqIEBkcml2ZXI6IGRldmljZV9kcml2ZXIKKyAqIEBpZF90YWJsZTogbWNiIGlkIHRhYmxlCisgKiBAcHJvYmU6IHByb2JlIGNhbGxiYWNrCisgKiBAcmVtb3ZlOiByZW1vdmUgY2FsbGJhY2sKKyAqIEBzaHV0ZG93bjogc2h1dGRvd24gY2FsbGJhY2sKKyAqLworc3RydWN0IG1jYl9kcml2ZXIgeworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKKwljb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCAqaWRfdGFibGU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBtY2JfZGV2aWNlICptZGV2LCBjb25zdCBzdHJ1Y3QgbWNiX2RldmljZV9pZCAqaWQpOworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBtY2JfZGV2aWNlICptZGV2KTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBtY2JfZGV2aWNlICptZGV2KTsKK307CisjZGVmaW5lIHRvX21jYl9kcml2ZXIoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IG1jYl9kcml2ZXIsIGRyaXZlcikKKworc3RhdGljIGlubGluZSB2b2lkICptY2JfZ2V0X2RydmRhdGEoc3RydWN0IG1jYl9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2Jfc2V0X2RydmRhdGEoc3RydWN0IG1jYl9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBkYXRhKTsKK30KKworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgX19tY2JfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtY2JfZHJpdmVyICpkcnYsCisJCQkJCXN0cnVjdCBtb2R1bGUgKm93bmVyLAorCQkJCQljb25zdCBjaGFyICptb2RfbmFtZSk7CisjZGVmaW5lIG1jYl9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKQkJXAorCV9fbWNiX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKK2V4dGVybiB2b2lkIG1jYl91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbWNiX2RyaXZlciAqZHJpdmVyKTsKKyNkZWZpbmUgbW9kdWxlX21jYl9kcml2ZXIoX19tY2JfZHJpdmVyKQkJXAorCW1vZHVsZV9kcml2ZXIoX19tY2JfZHJpdmVyLCBtY2JfcmVnaXN0ZXJfZHJpdmVyLCBtY2JfdW5yZWdpc3Rlcl9kcml2ZXIpOworZXh0ZXJuIHZvaWQgbWNiX2J1c19hZGRfZGV2aWNlcyhjb25zdCBzdHJ1Y3QgbWNiX2J1cyAqYnVzKTsKK2V4dGVybiBpbnQgbWNiX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgbWNiX2J1cyAqYnVzLCBzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgbWNiX2J1cyAqbWNiX2FsbG9jX2J1cyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgbWNiX2J1cyAqbWNiX2J1c19nZXQoc3RydWN0IG1jYl9idXMgKmJ1cyk7CitleHRlcm4gdm9pZCBtY2JfYnVzX3B1dChzdHJ1Y3QgbWNiX2J1cyAqYnVzKTsKK2V4dGVybiBzdHJ1Y3QgbWNiX2RldmljZSAqbWNiX2FsbG9jX2RldihzdHJ1Y3QgbWNiX2J1cyAqYnVzKTsKK2V4dGVybiB2b2lkIG1jYl9mcmVlX2RldihzdHJ1Y3QgbWNiX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIG1jYl9yZWxlYXNlX2J1cyhzdHJ1Y3QgbWNiX2J1cyAqYnVzKTsKK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgKm1jYl9yZXF1ZXN0X21lbShzdHJ1Y3QgbWNiX2RldmljZSAqZGV2LAorCQkJCQljb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIG1jYl9yZWxlYXNlX21lbShzdHJ1Y3QgcmVzb3VyY2UgKm1lbSk7CitleHRlcm4gaW50IG1jYl9nZXRfaXJxKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpOworCisjZW5kaWYgLyogX0xJTlVYX01DQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL3JlZ2lzdGVycy5oIGIvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9yZWdpc3RlcnMuaAppbmRleCBmZGYzYWEzLi4zZGRhYTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL3JlZ2lzdGVycy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2FyaXpvbmEvcmVnaXN0ZXJzLmgKQEAgLTE3MDIsOSArMTcwMiw5IEBACiAvKgogICogUjM3MyAoMHgxNzUpIC0gRkxMMSBDb250cm9sIDUKICAqLwotI2RlZmluZSBBUklaT05BX0ZMTDFfRlJBVElPX01BU0sgICAgICAgICAgICAgICAgIDB4MDcwMCAgLyogRkxMMV9GUkFUSU8gLSBbMTA6OF0gKi8KLSNkZWZpbmUgQVJJWk9OQV9GTEwxX0ZSQVRJT19TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEZMTDFfRlJBVElPIC0gWzEwOjhdICovCi0jZGVmaW5lIEFSSVpPTkFfRkxMMV9GUkFUSU9fV0lEVEggICAgICAgICAgICAgICAgICAgICAzICAvKiBGTEwxX0ZSQVRJTyAtIFsxMDo4XSAqLworI2RlZmluZSBBUklaT05BX0ZMTDFfRlJBVElPX01BU0sgICAgICAgICAgICAgICAgIDB4MEYwMCAgLyogRkxMMV9GUkFUSU8gLSBbMTE6OF0gKi8KKyNkZWZpbmUgQVJJWk9OQV9GTEwxX0ZSQVRJT19TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEZMTDFfRlJBVElPIC0gWzExOjhdICovCisjZGVmaW5lIEFSSVpPTkFfRkxMMV9GUkFUSU9fV0lEVEggICAgICAgICAgICAgICAgICAgICA0ICAvKiBGTEwxX0ZSQVRJTyAtIFsxMTo4XSAqLwogI2RlZmluZSBBUklaT05BX0ZMTDFfT1VURElWX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwRSAgLyogRkxMMV9PVVRESVYgLSBbMzoxXSAqLwogI2RlZmluZSBBUklaT05BX0ZMTDFfT1VURElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMMV9PVVRESVYgLSBbMzoxXSAqLwogI2RlZmluZSBBUklaT05BX0ZMTDFfT1VURElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMV9PVVRESVYgLSBbMzoxXSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL2NvcmUuaAppbmRleCA0MWM5YmRlNC4uMTU3ZTMyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9jb3JlLmgKQEAgLTE4LDcgKzE4LDkgQEAKIAlTNU04NzUxWCwKIAlTNU04NzYzWCwKIAlTNU04NzY3WCwKKwlTMk1QQTAxLAogCVMyTVBTMTFYLAorCVMyTVBTMTRYLAogfTsKIAogLyoqCkBAIC01MCw3ICs1Miw3IEBACiAJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICppcnFfZGF0YTsKIAogCWludCBvbm87Ci0JaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyB0eXBlOwogCWJvb2wgd2FrZXVwOwogCWJvb2wgd3Rzcl9zbXBsOwogfTsKQEAgLTkyLDcgKzk0LDcgQEAKIAlpbnQJCQkJYnVjazNfZGVmYXVsdF9pZHg7CiAJaW50CQkJCWJ1Y2s0X2RlZmF1bHRfaWR4OwogCi0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrX3JhbXBfZGVsYXk7CisJaW50CQkJCWJ1Y2tfcmFtcF9kZWxheTsKIAogCWludAkJCQlidWNrMl9yYW1wX2RlbGF5OwogCWludAkJCQlidWNrMzRfcmFtcF9kZWxheTsKQEAgLTEwMCwxMCArMTAyLDE1IEBACiAJaW50CQkJCWJ1Y2sxNl9yYW1wX2RlbGF5OwogCWludAkJCQlidWNrNzgxMF9yYW1wX2RlbGF5OwogCWludAkJCQlidWNrOV9yYW1wX2RlbGF5OworCWludAkJCQlidWNrMjRfcmFtcF9kZWxheTsKKwlpbnQJCQkJYnVjazNfcmFtcF9kZWxheTsKKwlpbnQJCQkJYnVjazdfcmFtcF9kZWxheTsKKwlpbnQJCQkJYnVjazg5MTBfcmFtcF9kZWxheTsKIAotCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVjazJfcmFtcF9lbmFibGU7Ci0JYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrM19yYW1wX2VuYWJsZTsKLQlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2s0X3JhbXBfZW5hYmxlOworCWJvb2wJCQkJYnVjazFfcmFtcF9lbmFibGU7CisJYm9vbAkJCQlidWNrMl9yYW1wX2VuYWJsZTsKKwlib29sCQkJCWJ1Y2szX3JhbXBfZW5hYmxlOworCWJvb2wJCQkJYnVjazRfcmFtcF9lbmFibGU7CiAJYm9vbAkJCQlidWNrNl9yYW1wX2VuYWJsZTsKIAogCWludAkJCQlidWNrMl9pbml0OwpAQCAtMTE5LDcgKzEyNiw4IEBACiBzdHJ1Y3Qgc2VjX3JlZ3VsYXRvcl9kYXRhIHsKIAlpbnQJCQkJaWQ7CiAJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJKmluaXRkYXRhOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVnX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlCQkqcmVnX25vZGU7CisJaW50CQkJCWV4dF9jb250cm9sX2dwaW87CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9pcnEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvaXJxLmgKaW5kZXggZDQzYjRmOS4uMTIyNGY0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL2lycS5oCkBAIC0xMyw2ICsxMyw1NiBAQAogI2lmbmRlZiBfX0xJTlVYX01GRF9TRUNfSVJRX0gKICNkZWZpbmUgX19MSU5VWF9NRkRfU0VDX0lSUV9ICiAKK2VudW0gczJtcGEwMV9pcnEgeworCVMyTVBBMDFfSVJRX1BXUk9ORiwKKwlTMk1QQTAxX0lSUV9QV1JPTlIsCisJUzJNUEEwMV9JUlFfSklHT05CRiwKKwlTMk1QQTAxX0lSUV9KSUdPTkJSLAorCVMyTVBBMDFfSVJRX0FDT0tCRiwKKwlTMk1QQTAxX0lSUV9BQ09LQlIsCisJUzJNUEEwMV9JUlFfUFdST04xUywKKwlTMk1QQTAxX0lSUV9NUkIsCisKKwlTMk1QQTAxX0lSUV9SVEM2MFMsCisJUzJNUEEwMV9JUlFfUlRDQTEsCisJUzJNUEEwMV9JUlFfUlRDQTAsCisJUzJNUEEwMV9JUlFfU01QTCwKKwlTMk1QQTAxX0lSUV9SVEMxUywKKwlTMk1QQTAxX0lSUV9XVFNSLAorCisJUzJNUEEwMV9JUlFfSU5UMTIwQywKKwlTMk1QQTAxX0lSUV9JTlQxNDBDLAorCVMyTVBBMDFfSVJRX0xETzNfVFNELAorCVMyTVBBMDFfSVJRX0IxNl9UU0QsCisJUzJNUEEwMV9JUlFfQjI0X1RTRCwKKwlTMk1QQTAxX0lSUV9CMzVfVFNELAorCisJUzJNUEEwMV9JUlFfTlIsCit9OworCisjZGVmaW5lIFMyTVBBMDFfSVJRX1BXUk9ORl9NQVNLCQkoMSA8PCAwKQorI2RlZmluZSBTMk1QQTAxX0lSUV9QV1JPTlJfTUFTSwkJKDEgPDwgMSkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfSklHT05CRl9NQVNLCSgxIDw8IDIpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0pJR09OQlJfTUFTSwkoMSA8PCAzKQorI2RlZmluZSBTMk1QQTAxX0lSUV9BQ09LQkZfTUFTSwkJKDEgPDwgNCkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfQUNPS0JSX01BU0sJCSgxIDw8IDUpCisjZGVmaW5lIFMyTVBBMDFfSVJRX1BXUk9OMVNfTUFTSwkoMSA8PCA2KQorI2RlZmluZSBTMk1QQTAxX0lSUV9NUkJfTUFTSwkJKDEgPDwgNykKKworI2RlZmluZSBTMk1QQTAxX0lSUV9SVEM2MFNfTUFTSwkJKDEgPDwgMCkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUlRDQTFfTUFTSwkJKDEgPDwgMSkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfUlRDQTBfTUFTSwkJKDEgPDwgMikKKyNkZWZpbmUgUzJNUEEwMV9JUlFfU01QTF9NQVNLCQkoMSA8PCAzKQorI2RlZmluZSBTMk1QQTAxX0lSUV9SVEMxU19NQVNLCQkoMSA8PCA0KQorI2RlZmluZSBTMk1QQTAxX0lSUV9XVFNSX01BU0sJCSgxIDw8IDUpCisKKyNkZWZpbmUgUzJNUEEwMV9JUlFfSU5UMTIwQ19NQVNLCSgxIDw8IDApCisjZGVmaW5lIFMyTVBBMDFfSVJRX0lOVDE0MENfTUFTSwkoMSA8PCAxKQorI2RlZmluZSBTMk1QQTAxX0lSUV9MRE8zX1RTRF9NQVNLCSgxIDw8IDIpCisjZGVmaW5lIFMyTVBBMDFfSVJRX0IxNl9UU0RfTUFTSwkoMSA8PCAzKQorI2RlZmluZSBTMk1QQTAxX0lSUV9CMjRfVFNEX01BU0sJKDEgPDwgNCkKKyNkZWZpbmUgUzJNUEEwMV9JUlFfQjM1X1RTRF9NQVNLCSgxIDw8IDUpCisKIGVudW0gczJtcHMxMV9pcnEgewogCVMyTVBTMTFfSVJRX1BXUk9ORiwKIAlTMk1QUzExX0lSUV9QV1JPTlIsCkBAIC0yNCw4ICs3NCw4IEBACiAJUzJNUFMxMV9JUlFfTVJCLAogCiAJUzJNUFMxMV9JUlFfUlRDNjBTLAorCVMyTVBTMTFfSVJRX1JUQ0EwLAogCVMyTVBTMTFfSVJRX1JUQ0ExLAotCVMyTVBTMTFfSVJRX1JUQ0EyLAogCVMyTVBTMTFfSVJRX1NNUEwsCiAJUzJNUFMxMV9JUlFfUlRDMVMsCiAJUzJNUFMxMV9JUlFfV1RTUiwKQEAgLTQ3LDcgKzk3LDcgQEAKIAogI2RlZmluZSBTMk1QUzExX0lSUV9SVEM2MFNfTUFTSwkJKDEgPDwgMCkKICNkZWZpbmUgUzJNUFMxMV9JUlFfUlRDQTFfTUFTSwkJKDEgPDwgMSkKLSNkZWZpbmUgUzJNUFMxMV9JUlFfUlRDQTJfTUFTSwkJKDEgPDwgMikKKyNkZWZpbmUgUzJNUFMxMV9JUlFfUlRDQTBfTUFTSwkJKDEgPDwgMikKICNkZWZpbmUgUzJNUFMxMV9JUlFfU01QTF9NQVNLCQkoMSA8PCAzKQogI2RlZmluZSBTMk1QUzExX0lSUV9SVEMxU19NQVNLCQkoMSA8PCA0KQogI2RlZmluZSBTMk1QUzExX0lSUV9XVFNSX01BU0sJCSgxIDw8IDUpCkBAIC01NSw2ICsxMDUsMzMgQEAKICNkZWZpbmUgUzJNUFMxMV9JUlFfSU5UMTIwQ19NQVNLCSgxIDw8IDApCiAjZGVmaW5lIFMyTVBTMTFfSVJRX0lOVDE0MENfTUFTSwkoMSA8PCAxKQogCitlbnVtIHMybXBzMTRfaXJxIHsKKwlTMk1QUzE0X0lSUV9QV1JPTkYsCisJUzJNUFMxNF9JUlFfUFdST05SLAorCVMyTVBTMTRfSVJRX0pJR09OQkYsCisJUzJNUFMxNF9JUlFfSklHT05CUiwKKwlTMk1QUzE0X0lSUV9BQ09LQkYsCisJUzJNUFMxNF9JUlFfQUNPS0JSLAorCVMyTVBTMTRfSVJRX1BXUk9OMVMsCisJUzJNUFMxNF9JUlFfTVJCLAorCisJUzJNUFMxNF9JUlFfUlRDNjBTLAorCVMyTVBTMTRfSVJRX1JUQ0ExLAorCVMyTVBTMTRfSVJRX1JUQ0EwLAorCVMyTVBTMTRfSVJRX1NNUEwsCisJUzJNUFMxNF9JUlFfUlRDMVMsCisJUzJNUFMxNF9JUlFfV1RTUiwKKworCVMyTVBTMTRfSVJRX0lOVDEyMEMsCisJUzJNUFMxNF9JUlFfSU5UMTQwQywKKwlTMk1QUzE0X0lSUV9UU0QsCisKKwlTMk1QUzE0X0lSUV9OUiwKK307CisKKy8qIE1hc2tzIGZvciBpbnRlcnJ1cHRzIGFyZSB0aGUgc2FtZSBhcyBpbiBzMm1wczExICovCisjZGVmaW5lIFMyTVBTMTRfSVJRX1RTRF9NQVNLCQkoMSA8PCAyKQorCiBlbnVtIHM1bTg3NjdfaXJxIHsKIAlTNU04NzY3X0lSUV9QV1JSLAogCVM1TTg3NjdfSVJRX1BXUkYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3J0Yy5oIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9ydGMuaAppbmRleCA5NGI3Y2Q2Li4zZTAyYjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL3J0Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvcnRjLmgKQEAgLTEsMTIgKzEsMTcgQEAKLS8qICBydGMuaAorLyogcnRjLmgKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAogICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KICAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKi8KIApAQCAtNDMsNiArNDgsMzkgQEAKIAlTRUNfUlRDX1NUQVRVUywKIAlTRUNfV1RTUl9TTVBMX0NOVEwsCiAJU0VDX1JUQ19VRFJfQ09OLAorCisJU0VDX1JUQ19SRUdfTUFYLAorfTsKKworZW51bSBzMm1wc19ydGNfcmVnIHsKKwlTMk1QU19SVENfQ1RSTCwKKwlTMk1QU19XVFNSX1NNUExfQ05UTCwKKwlTMk1QU19SVENfVURSX0NPTiwKKwlTMk1QU19SU1ZELAorCVMyTVBTX1JUQ19TRUMsCisJUzJNUFNfUlRDX01JTiwKKwlTMk1QU19SVENfSE9VUiwKKwlTMk1QU19SVENfV0VFS0RBWSwKKwlTMk1QU19SVENfREFURSwKKwlTMk1QU19SVENfTU9OVEgsCisJUzJNUFNfUlRDX1lFQVIsCisJUzJNUFNfQUxBUk0wX1NFQywKKwlTMk1QU19BTEFSTTBfTUlOLAorCVMyTVBTX0FMQVJNMF9IT1VSLAorCVMyTVBTX0FMQVJNMF9XRUVLREFZLAorCVMyTVBTX0FMQVJNMF9EQVRFLAorCVMyTVBTX0FMQVJNMF9NT05USCwKKwlTMk1QU19BTEFSTTBfWUVBUiwKKwlTMk1QU19BTEFSTTFfU0VDLAorCVMyTVBTX0FMQVJNMV9NSU4sCisJUzJNUFNfQUxBUk0xX0hPVVIsCisJUzJNUFNfQUxBUk0xX1dFRUtEQVksCisJUzJNUFNfQUxBUk0xX0RBVEUsCisJUzJNUFNfQUxBUk0xX01PTlRILAorCVMyTVBTX0FMQVJNMV9ZRUFSLAorCVMyTVBTX09GRlNSQywKKworCVMyTVBTX1JUQ19SRUdfTUFYLAogfTsKIAogI2RlZmluZSBSVENfSTJDX0FERFIJCSgweDBDID4+IDEpCkBAIC01NCw2ICs5Miw5IEBACiAjZGVmaW5lIEFMQVJNMV9TVEFUVVMJCSgxIDw8IDIpCiAjZGVmaW5lIFVQREFURV9BRAkJKDEgPDwgMCkKIAorI2RlZmluZSBTMk1QU19BTEFSTTBfU1RBVFVTCSgxIDw8IDIpCisjZGVmaW5lIFMyTVBTX0FMQVJNMV9TVEFUVVMJKDEgPDwgMSkKKwogLyogUlRDIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgQkNEX0VOX1NISUZUCQkwCiAjZGVmaW5lIEJDRF9FTl9NQVNLCQkoMSA8PCBCQ0RfRU5fU0hJRlQpCkBAIC02Miw2ICsxMDMsMTAgQEAKIC8qIFJUQyBVcGRhdGUgUmVnaXN0ZXIxICovCiAjZGVmaW5lIFJUQ19VRFJfU0hJRlQJCTAKICNkZWZpbmUgUlRDX1VEUl9NQVNLCQkoMSA8PCBSVENfVURSX1NISUZUKQorI2RlZmluZSBTMk1QU19SVENfV1VEUl9TSElGVAk0CisjZGVmaW5lIFMyTVBTX1JUQ19XVURSX01BU0sJKDEgPDwgUzJNUFNfUlRDX1dVRFJfU0hJRlQpCisjZGVmaW5lIFMyTVBTX1JUQ19SVURSX1NISUZUCTAKKyNkZWZpbmUgUzJNUFNfUlRDX1JVRFJfTUFTSwkoMSA8PCBTMk1QU19SVENfUlVEUl9TSElGVCkKICNkZWZpbmUgUlRDX1RDT05fU0hJRlQJCTEKICNkZWZpbmUgUlRDX1RDT05fTUFTSwkJKDEgPDwgUlRDX1RDT05fU0hJRlQpCiAjZGVmaW5lIFJUQ19USU1FX0VOX1NISUZUCTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcGEwMS5oIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9zMm1wYTAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjNjNiYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcGEwMS5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfUzJNUEEwMV9ICisjZGVmaW5lIF9fTElOVVhfTUZEX1MyTVBBMDFfSAorCisvKiBTMk1QQTAxIHJlZ2lzdGVycyAqLworZW51bSBzMm1wYTAxX3JlZyB7CisJUzJNUEEwMV9SRUdfSUQsCisJUzJNUEEwMV9SRUdfSU5UMSwKKwlTMk1QQTAxX1JFR19JTlQyLAorCVMyTVBBMDFfUkVHX0lOVDMsCisJUzJNUEEwMV9SRUdfSU5UMU0sCisJUzJNUEEwMV9SRUdfSU5UMk0sCisJUzJNUEEwMV9SRUdfSU5UM00sCisJUzJNUEEwMV9SRUdfU1QxLAorCVMyTVBBMDFfUkVHX1NUMiwKKwlTMk1QQTAxX1JFR19QV1JPTlNSQywKKwlTMk1QQTAxX1JFR19PRkZTUkMsCisJUzJNUEEwMV9SRUdfUlRDX0JVRiwKKwlTMk1QQTAxX1JFR19DVFJMMSwKKwlTMk1QQTAxX1JFR19FVENfVEVTVCwKKwlTMk1QQTAxX1JFR19SU1ZEMSwKKwlTMk1QQTAxX1JFR19CVV9DSEcsCisJUzJNUEEwMV9SRUdfUkFNUDEsCisJUzJNUEEwMV9SRUdfUkFNUDIsCisJUzJNUEEwMV9SRUdfTERPX0RTQ0gxLAorCVMyTVBBMDFfUkVHX0xET19EU0NIMiwKKwlTMk1QQTAxX1JFR19MRE9fRFNDSDMsCisJUzJNUEEwMV9SRUdfTERPX0RTQ0g0LAorCVMyTVBBMDFfUkVHX09UUF9BRFJMLAorCVMyTVBBMDFfUkVHX09UUF9BRFJILAorCVMyTVBBMDFfUkVHX09UUF9EQVRBLAorCVMyTVBBMDFfUkVHX01PTjFTRUwsCisJUzJNUEEwMV9SRUdfTU9OMlNFTCwKKwlTMk1QQTAxX1JFR19MRUUsCisJUzJNUEEwMV9SRUdfUlNWRDIsCisJUzJNUEEwMV9SRUdfUlNWRDMsCisJUzJNUEEwMV9SRUdfUlNWRDQsCisJUzJNUEEwMV9SRUdfUlNWRDUsCisJUzJNUEEwMV9SRUdfUlNWRDYsCisJUzJNUEEwMV9SRUdfVE9QX1JTVkQsCisJUzJNUEEwMV9SRUdfRFZTX1NFTCwKKwlTMk1QQTAxX1JFR19EVlNfUFRSLAorCVMyTVBBMDFfUkVHX0RWU19EQVRBLAorCVMyTVBBMDFfUkVHX1JTVkRfTk8sCisJUzJNUEEwMV9SRUdfVVZMTywKKwlTMk1QQTAxX1JFR19MRUVfTk8sCisJUzJNUEEwMV9SRUdfQjFDVFJMMSwKKwlTMk1QQTAxX1JFR19CMUNUUkwyLAorCVMyTVBBMDFfUkVHX0IyQ1RSTDEsCisJUzJNUEEwMV9SRUdfQjJDVFJMMiwKKwlTMk1QQTAxX1JFR19CM0NUUkwxLAorCVMyTVBBMDFfUkVHX0IzQ1RSTDIsCisJUzJNUEEwMV9SRUdfQjRDVFJMMSwKKwlTMk1QQTAxX1JFR19CNENUUkwyLAorCVMyTVBBMDFfUkVHX0I1Q1RSTDEsCisJUzJNUEEwMV9SRUdfQjVDVFJMMiwKKwlTMk1QQTAxX1JFR19CNUNUUkwzLAorCVMyTVBBMDFfUkVHX0I1Q1RSTDQsCisJUzJNUEEwMV9SRUdfQjVDVFJMNSwKKwlTMk1QQTAxX1JFR19CNUNUUkw2LAorCVMyTVBBMDFfUkVHX0I2Q1RSTDEsCisJUzJNUEEwMV9SRUdfQjZDVFJMMiwKKwlTMk1QQTAxX1JFR19CN0NUUkwxLAorCVMyTVBBMDFfUkVHX0I3Q1RSTDIsCisJUzJNUEEwMV9SRUdfQjhDVFJMMSwKKwlTMk1QQTAxX1JFR19COENUUkwyLAorCVMyTVBBMDFfUkVHX0I5Q1RSTDEsCisJUzJNUEEwMV9SRUdfQjlDVFJMMiwKKwlTMk1QQTAxX1JFR19CMTBDVFJMMSwKKwlTMk1QQTAxX1JFR19CMTBDVFJMMiwKKwlTMk1QQTAxX1JFR19MMUNUUkwsCisJUzJNUEEwMV9SRUdfTDJDVFJMLAorCVMyTVBBMDFfUkVHX0wzQ1RSTCwKKwlTMk1QQTAxX1JFR19MNENUUkwsCisJUzJNUEEwMV9SRUdfTDVDVFJMLAorCVMyTVBBMDFfUkVHX0w2Q1RSTCwKKwlTMk1QQTAxX1JFR19MN0NUUkwsCisJUzJNUEEwMV9SRUdfTDhDVFJMLAorCVMyTVBBMDFfUkVHX0w5Q1RSTCwKKwlTMk1QQTAxX1JFR19MMTBDVFJMLAorCVMyTVBBMDFfUkVHX0wxMUNUUkwsCisJUzJNUEEwMV9SRUdfTDEyQ1RSTCwKKwlTMk1QQTAxX1JFR19MMTNDVFJMLAorCVMyTVBBMDFfUkVHX0wxNENUUkwsCisJUzJNUEEwMV9SRUdfTDE1Q1RSTCwKKwlTMk1QQTAxX1JFR19MMTZDVFJMLAorCVMyTVBBMDFfUkVHX0wxN0NUUkwsCisJUzJNUEEwMV9SRUdfTDE4Q1RSTCwKKwlTMk1QQTAxX1JFR19MMTlDVFJMLAorCVMyTVBBMDFfUkVHX0wyMENUUkwsCisJUzJNUEEwMV9SRUdfTDIxQ1RSTCwKKwlTMk1QQTAxX1JFR19MMjJDVFJMLAorCVMyTVBBMDFfUkVHX0wyM0NUUkwsCisJUzJNUEEwMV9SRUdfTDI0Q1RSTCwKKwlTMk1QQTAxX1JFR19MMjVDVFJMLAorCVMyTVBBMDFfUkVHX0wyNkNUUkwsCisKKwlTMk1QQTAxX1JFR19MRE9fT1ZDQjEsCisJUzJNUEEwMV9SRUdfTERPX09WQ0IyLAorCVMyTVBBMDFfUkVHX0xET19PVkNCMywKKwlTMk1QQTAxX1JFR19MRE9fT1ZDQjQsCisKK307CisKKy8qIFMyTVBBMDEgcmVndWxhdG9yIGlkcyAqLworZW51bSBzMm1wYTAxX3JlZ3VsYXRvcnMgeworCVMyTVBBMDFfTERPMSwKKwlTMk1QQTAxX0xETzIsCisJUzJNUEEwMV9MRE8zLAorCVMyTVBBMDFfTERPNCwKKwlTMk1QQTAxX0xETzUsCisJUzJNUEEwMV9MRE82LAorCVMyTVBBMDFfTERPNywKKwlTMk1QQTAxX0xETzgsCisJUzJNUEEwMV9MRE85LAorCVMyTVBBMDFfTERPMTAsCisJUzJNUEEwMV9MRE8xMSwKKwlTMk1QQTAxX0xETzEyLAorCVMyTVBBMDFfTERPMTMsCisJUzJNUEEwMV9MRE8xNCwKKwlTMk1QQTAxX0xETzE1LAorCVMyTVBBMDFfTERPMTYsCisJUzJNUEEwMV9MRE8xNywKKwlTMk1QQTAxX0xETzE4LAorCVMyTVBBMDFfTERPMTksCisJUzJNUEEwMV9MRE8yMCwKKwlTMk1QQTAxX0xETzIxLAorCVMyTVBBMDFfTERPMjIsCisJUzJNUEEwMV9MRE8yMywKKwlTMk1QQTAxX0xETzI0LAorCVMyTVBBMDFfTERPMjUsCisJUzJNUEEwMV9MRE8yNiwKKworCVMyTVBBMDFfQlVDSzEsCisJUzJNUEEwMV9CVUNLMiwKKwlTMk1QQTAxX0JVQ0szLAorCVMyTVBBMDFfQlVDSzQsCisJUzJNUEEwMV9CVUNLNSwKKwlTMk1QQTAxX0JVQ0s2LAorCVMyTVBBMDFfQlVDSzcsCisJUzJNUEEwMV9CVUNLOCwKKwlTMk1QQTAxX0JVQ0s5LAorCVMyTVBBMDFfQlVDSzEwLAorCisJUzJNUEEwMV9SRUdVTEFUT1JfTUFYLAorfTsKKworI2RlZmluZSBTMk1QQTAxX0JVQ0tfTUlOMQk2MDAwMDAKKyNkZWZpbmUgUzJNUEEwMV9CVUNLX01JTjIJODAwMDAwCisjZGVmaW5lIFMyTVBBMDFfQlVDS19NSU4zCTEwMDAwMDAKKyNkZWZpbmUgUzJNUEEwMV9CVUNLX01JTjQJMTUwMDAwMAorI2RlZmluZSBTMk1QQTAxX0xET19NSU4JCTgwMDAwMAorCisjZGVmaW5lIFMyTVBBMDFfQlVDS19TVEVQMQk2MjUwCisjZGVmaW5lIFMyTVBBMDFfQlVDS19TVEVQMgkxMjUwMAorCisjZGVmaW5lIFMyTVBBMDFfTERPX1NURVAxCTUwMDAwCisjZGVmaW5lIFMyTVBBMDFfTERPX1NURVAyCTI1MDAwCisKKyNkZWZpbmUgUzJNUEEwMV9MRE9fVlNFTF9NQVNLCTB4M0YKKyNkZWZpbmUgUzJNUEEwMV9CVUNLX1ZTRUxfTUFTSwkweEZGCisjZGVmaW5lIFMyTVBBMDFfRU5BQkxFX01BU0sJKDB4MDMgPDwgUzJNUEEwMV9FTkFCTEVfU0hJRlQpCisjZGVmaW5lIFMyTVBBMDFfRU5BQkxFX1NISUZUCTB4MDYKKyNkZWZpbmUgUzJNUEEwMV9MRE9fTl9WT0xUQUdFUwkoUzJNUEEwMV9MRE9fVlNFTF9NQVNLICsgMSkKKyNkZWZpbmUgUzJNUEEwMV9CVUNLX05fVk9MVEFHRVMgKFMyTVBBMDFfQlVDS19WU0VMX01BU0sgKyAxKQorCisjZGVmaW5lIFMyTVBBMDFfUkFNUF9ERUxBWQkxMjUwMAkvKiB1Vi91cyAqLworCisjZGVmaW5lIFMyTVBBMDFfQlVDSzE2X1JBTVBfU0hJRlQJNAorI2RlZmluZSBTMk1QQTAxX0JVQ0syNF9SQU1QX1NISUZUCTYKKyNkZWZpbmUgUzJNUEEwMV9CVUNLM19SQU1QX1NISUZUCTQKKyNkZWZpbmUgUzJNUEEwMV9CVUNLNV9SQU1QX1NISUZUCTYKKyNkZWZpbmUgUzJNUEEwMV9CVUNLN19SQU1QX1NISUZUCTIKKyNkZWZpbmUgUzJNUEEwMV9CVUNLODkxMF9SQU1QX1NISUZUCTAKKworI2RlZmluZSBTMk1QQTAxX0JVQ0sxX1JBTVBfRU5fU0hJRlQJMworI2RlZmluZSBTMk1QQTAxX0JVQ0syX1JBTVBfRU5fU0hJRlQJMgorI2RlZmluZSBTMk1QQTAxX0JVQ0szX1JBTVBfRU5fU0hJRlQJMQorI2RlZmluZSBTMk1QQTAxX0JVQ0s0X1JBTVBfRU5fU0hJRlQJMAorI2RlZmluZSBTMk1QQTAxX1BNSUNfRU5fU0hJRlQJNgorCisjZW5kaWYgLypfX0xJTlVYX01GRF9TMk1QQTAxX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcHMxNC5oIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9zMm1wczE0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0NDliOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczJtcHMxNC5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogczJtcHMxNC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqICAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1MyTVBTMTRfSAorI2RlZmluZSBfX0xJTlVYX01GRF9TMk1QUzE0X0gKKworLyogUzJNUFMxNCByZWdpc3RlcnMgKi8KK2VudW0gczJtcHMxNF9yZWcgeworCVMyTVBTMTRfUkVHX0lELAorCVMyTVBTMTRfUkVHX0lOVDEsCisJUzJNUFMxNF9SRUdfSU5UMiwKKwlTMk1QUzE0X1JFR19JTlQzLAorCVMyTVBTMTRfUkVHX0lOVDFNLAorCVMyTVBTMTRfUkVHX0lOVDJNLAorCVMyTVBTMTRfUkVHX0lOVDNNLAorCVMyTVBTMTRfUkVHX1NUMSwKKwlTMk1QUzE0X1JFR19TVDIsCisJUzJNUFMxNF9SRUdfUFdST05TUkMsCisJUzJNUFMxNF9SRUdfT0ZGU1JDLAorCVMyTVBTMTRfUkVHX0JVX0NIRywKKwlTMk1QUzE0X1JFR19SVENDVFJMLAorCVMyTVBTMTRfUkVHX0NUUkwxLAorCVMyTVBTMTRfUkVHX0NUUkwyLAorCVMyTVBTMTRfUkVHX1JTVkQxLAorCVMyTVBTMTRfUkVHX1JTVkQyLAorCVMyTVBTMTRfUkVHX1JTVkQzLAorCVMyTVBTMTRfUkVHX1JTVkQ0LAorCVMyTVBTMTRfUkVHX1JTVkQ1LAorCVMyTVBTMTRfUkVHX1JTVkQ2LAorCVMyTVBTMTRfUkVHX0NUUkwzLAorCVMyTVBTMTRfUkVHX1JTVkQ3LAorCVMyTVBTMTRfUkVHX1JTVkQ4LAorCVMyTVBTMTRfUkVHX1dSU1RCSSwKKwlTMk1QUzE0X1JFR19CMUNUUkwxLAorCVMyTVBTMTRfUkVHX0IxQ1RSTDIsCisJUzJNUFMxNF9SRUdfQjJDVFJMMSwKKwlTMk1QUzE0X1JFR19CMkNUUkwyLAorCVMyTVBTMTRfUkVHX0IzQ1RSTDEsCisJUzJNUFMxNF9SRUdfQjNDVFJMMiwKKwlTMk1QUzE0X1JFR19CNENUUkwxLAorCVMyTVBTMTRfUkVHX0I0Q1RSTDIsCisJUzJNUFMxNF9SRUdfQjVDVFJMMSwKKwlTMk1QUzE0X1JFR19CNUNUUkwyLAorCVMyTVBTMTRfUkVHX0wxQ1RSTCwKKwlTMk1QUzE0X1JFR19MMkNUUkwsCisJUzJNUFMxNF9SRUdfTDNDVFJMLAorCVMyTVBTMTRfUkVHX0w0Q1RSTCwKKwlTMk1QUzE0X1JFR19MNUNUUkwsCisJUzJNUFMxNF9SRUdfTDZDVFJMLAorCVMyTVBTMTRfUkVHX0w3Q1RSTCwKKwlTMk1QUzE0X1JFR19MOENUUkwsCisJUzJNUFMxNF9SRUdfTDlDVFJMLAorCVMyTVBTMTRfUkVHX0wxMENUUkwsCisJUzJNUFMxNF9SRUdfTDExQ1RSTCwKKwlTMk1QUzE0X1JFR19MMTJDVFJMLAorCVMyTVBTMTRfUkVHX0wxM0NUUkwsCisJUzJNUFMxNF9SRUdfTDE0Q1RSTCwKKwlTMk1QUzE0X1JFR19MMTVDVFJMLAorCVMyTVBTMTRfUkVHX0wxNkNUUkwsCisJUzJNUFMxNF9SRUdfTDE3Q1RSTCwKKwlTMk1QUzE0X1JFR19MMThDVFJMLAorCVMyTVBTMTRfUkVHX0wxOUNUUkwsCisJUzJNUFMxNF9SRUdfTDIwQ1RSTCwKKwlTMk1QUzE0X1JFR19MMjFDVFJMLAorCVMyTVBTMTRfUkVHX0wyMkNUUkwsCisJUzJNUFMxNF9SRUdfTDIzQ1RSTCwKKwlTMk1QUzE0X1JFR19MMjRDVFJMLAorCVMyTVBTMTRfUkVHX0wyNUNUUkwsCisJUzJNUFMxNF9SRUdfTERPRFNDSDEsCisJUzJNUFMxNF9SRUdfTERPRFNDSDIsCisJUzJNUFMxNF9SRUdfTERPRFNDSDMsCit9OworCisvKiBTMk1QUzE0IHJlZ3VsYXRvciBpZHMgKi8KK2VudW0gczJtcHMxNF9yZWd1bGF0b3JzIHsKKwlTMk1QUzE0X0xETzEsCisJUzJNUFMxNF9MRE8yLAorCVMyTVBTMTRfTERPMywKKwlTMk1QUzE0X0xETzQsCisJUzJNUFMxNF9MRE81LAorCVMyTVBTMTRfTERPNiwKKwlTMk1QUzE0X0xETzcsCisJUzJNUFMxNF9MRE84LAorCVMyTVBTMTRfTERPOSwKKwlTMk1QUzE0X0xETzEwLAorCVMyTVBTMTRfTERPMTEsCisJUzJNUFMxNF9MRE8xMiwKKwlTMk1QUzE0X0xETzEzLAorCVMyTVBTMTRfTERPMTQsCisJUzJNUFMxNF9MRE8xNSwKKwlTMk1QUzE0X0xETzE2LAorCVMyTVBTMTRfTERPMTcsCisJUzJNUFMxNF9MRE8xOCwKKwlTMk1QUzE0X0xETzE5LAorCVMyTVBTMTRfTERPMjAsCisJUzJNUFMxNF9MRE8yMSwKKwlTMk1QUzE0X0xETzIyLAorCVMyTVBTMTRfTERPMjMsCisJUzJNUFMxNF9MRE8yNCwKKwlTMk1QUzE0X0xETzI1LAorCVMyTVBTMTRfQlVDSzEsCisJUzJNUFMxNF9CVUNLMiwKKwlTMk1QUzE0X0JVQ0szLAorCVMyTVBTMTRfQlVDSzQsCisJUzJNUFMxNF9CVUNLNSwKKworCVMyTVBTMTRfUkVHVUxBVE9SX01BWCwKK307CisKKy8qIFJlZ3VsYXRvciBjb25zdHJhaW50cyBmb3IgQlVDS3ggKi8KKyNkZWZpbmUgUzJNUFMxNF9CVUNLMTIzNV9NSU5fNjAwTVYJNjAwMDAwCisjZGVmaW5lIFMyTVBTMTRfQlVDSzRfTUlOXzE0MDBNVgkxNDAwMDAwCisjZGVmaW5lIFMyTVBTMTRfQlVDSzEyMzVfU1RFUF82XzI1TVYJNjI1MAorI2RlZmluZSBTMk1QUzE0X0JVQ0s0X1NURVBfMTJfNU1WCTEyNTAwCisjZGVmaW5lIFMyTVBTMTRfQlVDSzEyMzVfU1RBUlRfU0VMCTB4MjAKKyNkZWZpbmUgUzJNUFMxNF9CVUNLNF9TVEFSVF9TRUwJCTB4NDAKKy8qCisgKiBEZWZhdWx0IHJhbXAgZGVsYXkgaW4gdXYvdXMuIERhdGFzaGVldCBzYXlzIHRoYXQgcmFtcCBkZWxheSBjYW4gYmUKKyAqIGNvbnRyb2xsZWQgaG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHdoaWNoIHJlZ2lzdGVyIGlzIHVzZWQgZm9yIHRoYXQuCisgKiBMZXQncyBhc3N1bWUgdGhhdCBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgc2V0LgorICovCisjZGVmaW5lIFMyTVBTMTRfQlVDS19SQU1QX0RFTEFZCQkxMjUwMAorCisvKiBSZWd1bGF0b3IgY29uc3RyYWludHMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBMRE94ICovCisjZGVmaW5lIFMyTVBTMTRfTERPX01JTl84MDBNVgkJODAwMDAwCisjZGVmaW5lIFMyTVBTMTRfTERPX01JTl8xODAwTVYJCTE4MDAwMDAKKyNkZWZpbmUgUzJNUFMxNF9MRE9fU1RFUF8xMl81TVYJCTEyNTAwCisjZGVmaW5lIFMyTVBTMTRfTERPX1NURVBfMjVNVgkJMjUwMDAKKworI2RlZmluZSBTMk1QUzE0X0xET19WU0VMX01BU0sJCTB4M0YKKyNkZWZpbmUgUzJNUFMxNF9CVUNLX1ZTRUxfTUFTSwkJMHhGRgorI2RlZmluZSBTMk1QUzE0X0VOQUJMRV9NQVNLCQkoMHgwMyA8PCBTMk1QUzE0X0VOQUJMRV9TSElGVCkKKyNkZWZpbmUgUzJNUFMxNF9FTkFCTEVfU0hJRlQJCTYKKy8qIE9uL09mZiBjb250cm9sbGVkIGJ5IFBXUkVOICovCisjZGVmaW5lIFMyTVBTMTRfRU5BQkxFX1NVU1BFTkQJCSgweDAxIDw8IFMyTVBTMTRfRU5BQkxFX1NISUZUKQorI2RlZmluZSBTMk1QUzE0X0xET19OX1ZPTFRBR0VTCQkoUzJNUFMxNF9MRE9fVlNFTF9NQVNLICsgMSkKKyNkZWZpbmUgUzJNUFMxNF9CVUNLX05fVk9MVEFHRVMJCShTMk1QUzE0X0JVQ0tfVlNFTF9NQVNLICsgMSkKKworI2VuZGlmIC8qICBfX0xJTlVYX01GRF9TMk1QUzE0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvczVtODc2Ny5oIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9zNW04NzY3LmgKaW5kZXggMmFiMGIwZi4uMjQzYjU4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9zNW04NzY3LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9zNW04NzY3LmgKQEAgLTE4MywxMCArMTgzLDE3IEBACiAJUzVNODc2N19SRUdfTUFYLAogfTsKIAorLyogTERPX0VOL0JVQ0tfRU4gZmllbGQgaW4gcmVnaXN0ZXJzICovCiAjZGVmaW5lIFM1TTg3NjdfRU5DVFJMX1NISUZUCQk2CiAjZGVmaW5lIFM1TTg3NjdfRU5DVFJMX01BU0sJCSgweDMgPDwgUzVNODc2N19FTkNUUkxfU0hJRlQpCiAKIC8qCisgKiBMRE9fRU4vQlVDS19FTiByZWdpc3RlciB2YWx1ZSBmb3IgY29udHJvbGxpbmcgdGhpcyBCdWNrIG9yIExETworICogYnkgR1BJTyAoUFdSRU4sIEJVQ0tFTikuCisgKi8KKyNkZWZpbmUgUzVNODc2N19FTkNUUkxfVVNFX0dQSU8JCTB4MQorCisvKgogICogVmFsdWVzIGZvciBCVUNLX1JBTVAgZmllbGQgaW4gRFZTX1JBTVAgcmVnaXN0ZXIsIG1hdGNoaW5nIHJhdyB2YWx1ZXMKICAqIGluIG1WL3VzLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCmluZGV4IDM3MzdmNzIuLjJjZjE1NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCkBAIC0xMSwyMyArMTEsMjMgQEAKICAqLwogCiAjZGVmaW5lIFBTTU9VU0VfTUlOT1IJCTEKLSNkZWZpbmUgTVNfQlVTTU9VU0VfTUlOT1IJMgotI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUgkzCisjZGVmaW5lIE1TX0JVU01PVVNFX01JTk9SCTIJLyogdW51c2VkICovCisjZGVmaW5lIEFUSVhMX0JVU01PVVNFX01JTk9SCTMJLyogdW51c2VkICovCiAvKiNkZWZpbmUgQU1JR0FNT1VTRV9NSU5PUgk0CUZJWE1FIE9CU09MRVRFICovCi0jZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IJNQotI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IJCTYKLSNkZWZpbmUgQVBPTExPX01PVVNFX01JTk9SCTcKLSNkZWZpbmUgUEMxMTBQQURfTUlOT1IJCTkKKyNkZWZpbmUgQVRBUklNT1VTRV9NSU5PUgk1CS8qIHVudXNlZCAqLworI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IJCTYJLyogdW51c2VkICovCisjZGVmaW5lIEFQT0xMT19NT1VTRV9NSU5PUgk3CS8qIHVudXNlZCAqLworI2RlZmluZSBQQzExMFBBRF9NSU5PUgkJOQkvKiB1bnVzZWQgKi8KIC8qI2RlZmluZSBBREJfTU9VU0VfTUlOT1IJMTAJRklYTUUgT0JTT0xFVEUgKi8KICNkZWZpbmUgV0FUQ0hET0dfTUlOT1IJCTEzMAkvKiBXYXRjaGRvZyB0aW1lciAgICAgKi8KICNkZWZpbmUgVEVNUF9NSU5PUgkJMTMxCS8qIFRlbXBlcmF0dXJlIFNlbnNvciAqLwogI2RlZmluZSBSVENfTUlOT1IJCTEzNQogI2RlZmluZSBFRklfUlRDX01JTk9SCQkxMzYJLyogRUZJIFRpbWUgc2VydmljZXMgKi8KICNkZWZpbmUgU1VOX09QRU5QUk9NX01JTk9SCTEzOQotI2RlZmluZSBETUFQSV9NSU5PUgkJMTQwCS8qIERNQVBJICovCisjZGVmaW5lIERNQVBJX01JTk9SCQkxNDAJLyogdW51c2VkICovCiAjZGVmaW5lIE5WUkFNX01JTk9SCQkxNDQKICNkZWZpbmUgU0dJX01NVElNRVIJCTE1MwotI2RlZmluZSBTVE9SRV9RVUVVRV9NSU5PUgkxNTUKKyNkZWZpbmUgU1RPUkVfUVVFVUVfTUlOT1IJMTU1CS8qIHVudXNlZCAqLwogI2RlZmluZSBJMk9fTUlOT1IJCTE2NgogI2RlZmluZSBNSUNST0NPREVfTUlOT1IJCTE4NAogI2RlZmluZSBWRklPX01JTk9SCQkxOTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCBjMWI3NDE0Li4yZWVjNjFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0xNDg3LDkgKzE0ODcsMTUgQEAKIAogI2lmIFVTRV9TUExJVF9QTURfUFRMT0NLUwogCitzdGF0aWMgc3RydWN0IHBhZ2UgKnBtZF90b19wYWdlKHBtZF90ICpwbWQpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gfihQVFJTX1BFUl9QTUQgKiBzaXplb2YocG1kX3QpIC0gMSk7CisJcmV0dXJuIHZpcnRfdG9fcGFnZSgodm9pZCAqKSgodW5zaWduZWQgbG9uZykgcG1kICYgbWFzaykpOworfQorCiBzdGF0aWMgaW5saW5lIHNwaW5sb2NrX3QgKnBtZF9sb2NrcHRyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kKQogewotCXJldHVybiBwdGxvY2tfcHRyKHZpcnRfdG9fcGFnZShwbWQpKTsKKwlyZXR1cm4gcHRsb2NrX3B0cihwbWRfdG9fcGFnZShwbWQpKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHBndGFibGVfcG1kX3BhZ2VfY3RvcihzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTE1MDgsNyArMTUxNCw3IEBACiAJcHRsb2NrX2ZyZWUocGFnZSk7CiB9CiAKLSNkZWZpbmUgcG1kX2h1Z2VfcHRlKG1tLCBwbWQpICh2aXJ0X3RvX3BhZ2UocG1kKS0+cG1kX2h1Z2VfcHRlKQorI2RlZmluZSBwbWRfaHVnZV9wdGUobW0sIHBtZCkgKHBtZF90b19wYWdlKHBtZCktPnBtZF9odWdlX3B0ZSkKIAogI2Vsc2UKIApAQCAtMTc1MCw2ICsxNzU2LDkgQEAKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIAogZXh0ZXJuIGludCBtYXlfZXhwYW5kX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIG5wYWdlcyk7CitleHRlcm4gc3RydWN0IHZtX2FyZWFfc3RydWN0ICpfaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKIGV4dGVybiBpbnQgaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCmluZGV4IDQ1ZTkyMTQuLjlhMTY1YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaApAQCAtNDMyLDYgKzQzMiwxNCBAQAogCWtlcm5lbF91bG9uZ190IGRyaXZlcl9kYXRhOwkvKiBEYXRhIHByaXZhdGUgdG8gdGhlIGRyaXZlciAqLwogfTsKIAorI2RlZmluZSBTUE1JX05BTUVfU0laRQkzMgorI2RlZmluZSBTUE1JX01PRFVMRV9QUkVGSVggInNwbWk6IgorCitzdHJ1Y3Qgc3BtaV9kZXZpY2VfaWQgeworCWNoYXIgbmFtZVtTUE1JX05BTUVfU0laRV07CisJa2VybmVsX3Vsb25nX3QgZHJpdmVyX2RhdGE7CS8qIERhdGEgcHJpdmF0ZSB0byB0aGUgZHJpdmVyICovCit9OworCiAvKiBkbWkgKi8KIGVudW0gZG1pX2ZpZWxkIHsKIAlETUlfTk9ORSwKQEAgLTU2NCw2ICs1NzIsMTUgQEAKICNkZWZpbmUgWDg2X01PREVMX0FOWSAgMAogI2RlZmluZSBYODZfRkVBVFVSRV9BTlkgMAkvKiBTYW1lIGFzIEZQVSwgeW91IGNhbid0IHRlc3QgZm9yIHRoYXQgKi8KIAorLyoKKyAqIEdlbmVyaWMgdGFibGUgdHlwZSBmb3IgbWF0Y2hpbmcgQ1BVIGZlYXR1cmVzLgorICogQGZlYXR1cmU6CXRoZSBiaXQgbnVtYmVyIG9mIHRoZSBmZWF0dXJlICgwIC0gNjU1MzUpCisgKi8KKworc3RydWN0IGNwdV9mZWF0dXJlIHsKKwlfX3UxNglmZWF0dXJlOworfTsKKwogI2RlZmluZSBJUEFDS19BTllfRk9STUFUIDB4ZmYKICNkZWZpbmUgSVBBQ0tfQU5ZX0lEICh+MCkKIHN0cnVjdCBpcGFja19kZXZpY2VfaWQgewpAQCAtNTk5LDQgKzYxNiw5IEBACiAJX191MTYgYXNtX2RpZCwgYXNtX3ZpZDsKIH07CiAKK3N0cnVjdCBtY2JfZGV2aWNlX2lkIHsKKwlfX3UxNiBkZXZpY2U7CisJa2VybmVsX3Vsb25nX3QgZHJpdmVyX2RhdGE7Cit9OworCiAjZW5kaWYgLyogTElOVVhfTU9EX0RFVklDRVRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXV0ZXguaCBiL2luY2x1ZGUvbGludXgvbXV0ZXguaAppbmRleCBkMzE4MTkzLi4xMTY5MmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L211dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCkBAIC00Niw2ICs0Niw3IEBACiAgKiAtIGRldGVjdHMgbXVsdGktdGFzayBjaXJjdWxhciBkZWFkbG9ja3MgYW5kIHByaW50cyBvdXQgYWxsIGFmZmVjdGVkCiAgKiAgIGxvY2tzIGFuZCB0YXNrcyAoYW5kIG9ubHkgdGhvc2UgdGFza3MpCiAgKi8KK3N0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWU7CiBzdHJ1Y3QgbXV0ZXggewogCS8qIDE6IHVubG9ja2VkLCAwOiBsb2NrZWQsIG5lZ2F0aXZlOiBsb2NrZWQsIHBvc3NpYmxlIHdhaXRlcnMgKi8KIAlhdG9taWNfdAkJY291bnQ7CkBAIC01NSw3ICs1Niw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0CSpvd25lcjsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NVVRFWF9TUElOX09OX09XTkVSCi0Jdm9pZAkJCSpzcGluX21sb2NrOwkvKiBTcGlubmVyIE1DUyBsb2NrICovCisJc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZQkqb3NxOwkvKiBTcGlubmVyIE1DUyBsb2NrICovCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfREVCVUdfTVVURVhFUwogCWNvbnN0IGNoYXIgCQkqbmFtZTsKQEAgLTE3OSw0ICsxODAsNCBAQAogIyBkZWZpbmUgYXJjaF9tdXRleF9jcHVfcmVsYXgoKSBjcHVfcmVsYXgoKQogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIF9fTElOVVhfTVVURVhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZfZmVhdHVyZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2X2ZlYXR1cmVzLmgKaW5kZXggMTAwNWViZi4uNWEwOWE0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZfZmVhdHVyZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldl9mZWF0dXJlcy5oCkBAIC0xNjMsNCArMTYzLDExIEBACiAvKiBjaGFuZ2VhYmxlIGZlYXR1cmVzIHdpdGggbm8gc3BlY2lhbCBoYXJkd2FyZSByZXF1aXJlbWVudHMgKi8KICNkZWZpbmUgTkVUSUZfRl9TT0ZUX0ZFQVRVUkVTCShORVRJRl9GX0dTTyB8IE5FVElGX0ZfR1JPKQogCisjZGVmaW5lIE5FVElGX0ZfVkxBTl9GRUFUVVJFUwkoTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSIHwgXAorCQkJCSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8IFwKKwkJCQkgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBcCisJCQkJIE5FVElGX0ZfSFdfVkxBTl9TVEFHX0ZJTFRFUiB8IFwKKwkJCQkgTkVUSUZfRl9IV19WTEFOX1NUQUdfUlggfCBcCisJCQkJIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1RYKQorCiAjZW5kaWYJLyogX0xJTlVYX05FVERFVl9GRUFUVVJFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCBlOGVlZWJkLi5kYWFmZDk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTMwMTQsNyArMzAxNCw3IEBACiB7CiAJcmV0dXJuIF9fc2tiX2dzb19zZWdtZW50KHNrYiwgZmVhdHVyZXMsIHRydWUpOwogfQotX19iZTE2IHNrYl9uZXR3b3JrX3Byb3RvY29sKHN0cnVjdCBza19idWZmICpza2IpOworX19iZTE2IHNrYl9uZXR3b3JrX3Byb3RvY29sKHN0cnVjdCBza19idWZmICpza2IsIGludCAqZGVwdGgpOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgY2FuX2NoZWNrc3VtX3Byb3RvY29sKG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLAogCQkJCQkgX19iZTE2IHByb3RvY29sKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9udm1lLmggYi9pbmNsdWRlL2xpbnV4L252bWUuaAppbmRleCA2OWFlMDNmLi42YjlhYWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L252bWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L252bWUuaApAQCAtODcsNiArODcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbmFtZXNwYWNlczsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBtaXNjZGV2aWNlIG1pc2NkZXY7CisJd29ya19mdW5jX3QgcmVzZXRfd29ya2ZuOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93b3JrOwogCWNoYXIgbmFtZVsxMl07CiAJY2hhciBzZXJpYWxbMjBdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZi5oIGIvaW5jbHVkZS9saW51eC9vZi5oCmluZGV4IDQzNWNiOTkuLjgzZDFhYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2YuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mLmgKQEAgLTE5OCw2ICsxOTgsOCBAQAogZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJIGludCAqbGVucCk7CitleHRlcm4gaW50IG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgaW50IGVsZW1fc2l6ZSk7CiBleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCSAgICAgICB1MzIgaW5kZXgsIHUzMiAqb3V0X3ZhbHVlKTsKQEAgLTM5MCw2ICszOTIsMTIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBlbGVtX3NpemUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTMyIGluZGV4LCB1MzIgKm91dF92YWx1ZSkKIHsKQEAgLTUzNiw2ICs1NDQsNzQgQEAKIH0KIAogLyoqCisgKiBvZl9wcm9wZXJ0eV9jb3VudF91OF9lbGVtcyAtIENvdW50IHRoZSBudW1iZXIgb2YgdTggZWxlbWVudHMgaW4gYSBwcm9wZXJ0eQorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICoKKyAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHU4IGVsZW1lbnRzCisgKiBpbiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgb24gc3VjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzCisgKiBub3QgZXhpc3Qgb3IgaXRzIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBhIG11bHRpcGxlIG9mIHU4IGFuZCAtRU5PREFUQSBpZiB0aGUKKyAqIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfY291bnRfdThfZWxlbXMoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCBjaGFyICpwcm9wbmFtZSkKK3sKKwlyZXR1cm4gb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZShucCwgcHJvcG5hbWUsIHNpemVvZih1OCkpOworfQorCisvKioKKyAqIG9mX3Byb3BlcnR5X2NvdW50X3UxNl9lbGVtcyAtIENvdW50IHRoZSBudW1iZXIgb2YgdTE2IGVsZW1lbnRzIGluIGEgcHJvcGVydHkKKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgY291bnQgdGhlIG51bWJlciBvZiB1MTYgZWxlbWVudHMKKyAqIGluIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyBvbiBzdWNlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMKKyAqIG5vdCBleGlzdCBvciBpdHMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGEgbXVsdGlwbGUgb2YgdTE2IGFuZCAtRU5PREFUQSBpZiB0aGUKKyAqIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfY291bnRfdTE2X2VsZW1zKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJcmV0dXJuIG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUobnAsIHByb3BuYW1lLCBzaXplb2YodTE2KSk7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zIC0gQ291bnQgdGhlIG51bWJlciBvZiB1MzIgZWxlbWVudHMgaW4gYSBwcm9wZXJ0eQorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICoKKyAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHUzMiBlbGVtZW50cworICogaW4gaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIG9uIHN1Y2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcworICogbm90IGV4aXN0IG9yIGl0cyBsZW5ndGggZG9lcyBub3QgbWF0Y2ggYSBtdWx0aXBsZSBvZiB1MzIgYW5kIC1FTk9EQVRBIGlmIHRoZQorICogcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9jb3VudF91MzJfZWxlbXMoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCBjaGFyICpwcm9wbmFtZSkKK3sKKwlyZXR1cm4gb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZShucCwgcHJvcG5hbWUsIHNpemVvZih1MzIpKTsKK30KKworLyoqCisgKiBvZl9wcm9wZXJ0eV9jb3VudF91NjRfZWxlbXMgLSBDb3VudCB0aGUgbnVtYmVyIG9mIHU2NCBlbGVtZW50cyBpbiBhIHByb3BlcnR5CisgKgorICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgdTY0IGVsZW1lbnRzCisgKiBpbiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgb24gc3VjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzCisgKiBub3QgZXhpc3Qgb3IgaXRzIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBhIG11bHRpcGxlIG9mIHU2NCBhbmQgLUVOT0RBVEEgaWYgdGhlCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X2NvdW50X3U2NF9lbGVtcyhjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lKQoreworCXJldHVybiBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKG5wLCBwcm9wbmFtZSwgc2l6ZW9mKHU2NCkpOworfQorCisvKioKICAqIG9mX3Byb3BlcnR5X3JlYWRfYm9vbCAtIEZpbmRmcm9tIGEgcHJvcGVydHkKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCiAgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9ncmFwaC5oIGIvaW5jbHVkZS9saW51eC9vZl9ncmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmVmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2dyYXBoLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIE9GIGdyYXBoIGJpbmRpbmcgcGFyc2luZyBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOiBTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJlbmVzYXMgRWxlY3Ryb25pY3MgQ29ycC4KKyAqIEF1dGhvcjogR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX0xJTlVYX09GX0dSQVBIX0gKKyNkZWZpbmUgX19MSU5VWF9PRl9HUkFQSF9ICisKKy8qKgorICogc3RydWN0IG9mX2VuZHBvaW50IC0gdGhlIE9GIGdyYXBoIGVuZHBvaW50IGRhdGEgc3RydWN0dXJlCisgKiBAcG9ydDogaWRlbnRpZmllciAodmFsdWUgb2YgcmVnIHByb3BlcnR5KSBvZiBhIHBvcnQgdGhpcyBlbmRwb2ludCBiZWxvbmdzIHRvCisgKiBAaWQ6IGlkZW50aWZpZXIgKHZhbHVlIG9mIHJlZyBwcm9wZXJ0eSkgb2YgdGhpcyBlbmRwb2ludAorICogQGxvY2FsX25vZGU6IHBvaW50ZXIgdG8gZGV2aWNlX25vZGUgb2YgdGhpcyBlbmRwb2ludAorICovCitzdHJ1Y3Qgb2ZfZW5kcG9pbnQgeworCXVuc2lnbmVkIGludCBwb3J0OworCXVuc2lnbmVkIGludCBpZDsKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmxvY2FsX25vZGU7Cit9OworCisjaWZkZWYgQ09ORklHX09GCitpbnQgb2ZfZ3JhcGhfcGFyc2VfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCXN0cnVjdCBvZl9lbmRwb2ludCAqZW5kcG9pbnQpOworc3RydWN0IGRldmljZV9ub2RlICpvZl9ncmFwaF9nZXRfbmV4dF9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpwcmV2aW91cyk7CitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCisJCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgb2ZfZ3JhcGhfcGFyc2VfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCQlzdHJ1Y3Qgb2ZfZW5kcG9pbnQgKmVuZHBvaW50KQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQoCisJCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXZpb3VzKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0X3BhcmVudCgKKwkJCQkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ3JhcGhfZ2V0X3JlbW90ZV9wb3J0KAorCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKworI2VuZGlmIC8qIF9fTElOVVhfT0ZfR1JBUEhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggMzNhYTJjYS4uYWFiNTdiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgpAQCAtMTcwLDYgKzE2OSw4IEBACiAJUENJX0RFVl9GTEFHU19OT19EMyA9IChfX2ZvcmNlIHBjaV9kZXZfZmxhZ3NfdCkgMiwKIAkvKiBQcm92aWRlIGluZGljYXRpb24gZGV2aWNlIGlzIGFzc2lnbmVkIGJ5IGEgVmlydHVhbCBNYWNoaW5lIE1hbmFnZXIgKi8KIAlQQ0lfREVWX0ZMQUdTX0FTU0lHTkVEID0gKF9fZm9yY2UgcGNpX2Rldl9mbGFnc190KSA0LAorCS8qIEZsYWcgZm9yIHF1aXJrIHVzZSB0byBzdG9yZSBpZiBxdWlyay1zcGVjaWZpYyBBQ1MgaXMgZW5hYmxlZCAqLworCVBDSV9ERVZfRkxBR1NfQUNTX0VOQUJMRURfUVVJUksgPSAoX19mb3JjZSBwY2lfZGV2X2ZsYWdzX3QpIDgsCiB9OwogCiBlbnVtIHBjaV9pcnFfcmVyb3V0ZV92YXJpYW50IHsKQEAgLTQ2MSw3ICs0NjIsNiBAQAogCXVuc2lnbmVkIGludAkJaXNfYWRkZWQ6MTsKIH07CiAKLSNkZWZpbmUgcGNpX2J1c19iKG4pCWxpc3RfZW50cnkobiwgc3RydWN0IHBjaV9idXMsIG5vZGUpCiAjZGVmaW5lIHRvX3BjaV9idXMobikJY29udGFpbmVyX29mKG4sIHN0cnVjdCBwY2lfYnVzLCBkZXYpCiAKIC8qCkBAIC0xMDY2LDcgKzEwNjYsNyBAQAogaW50IF9fbXVzdF9jaGVjayBwY2lfYnVzX2FsbG9jX3Jlc291cmNlKHN0cnVjdCBwY2lfYnVzICpidXMsCiAJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCiAJCQlyZXNvdXJjZV9zaXplX3QgYWxpZ24sIHJlc291cmNlX3NpemVfdCBtaW4sCi0JCQl1bnNpZ25lZCBpbnQgdHlwZV9tYXNrLAorCQkJdW5zaWduZWQgbG9uZyB0eXBlX21hc2ssCiAJCQlyZXNvdXJjZV9zaXplX3QgKCphbGlnbmYpKHZvaWQgKiwKIAkJCQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICosCiAJCQkJCQkgIHJlc291cmNlX3NpemVfdCwKQEAgLTE1MzAsNiArMTUzMCw3IEBACiB2b2lkIHBjaV9maXh1cF9kZXZpY2UoZW51bSBwY2lfZml4dXBfcGFzcyBwYXNzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RtYV9zb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX2Rldl9zcGVjaWZpY19hY3NfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MTYgYWNzX2ZsYWdzKTsKK3ZvaWQgcGNpX2Rldl9zcGVjaWZpY19lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZml4dXBfZGV2aWNlKGVudW0gcGNpX2ZpeHVwX3Bhc3MgcGFzcywKIAkJCQkgICAgc3RydWN0IHBjaV9kZXYgKmRldikgeyB9CkBAIC0xNTQyLDYgKzE1NDMsNyBAQAogewogCXJldHVybiAtRU5PVFRZOwogfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kZXZfc3BlY2lmaWNfZW5hYmxlX2FjcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KICNlbmRpZgogCiB2b2lkIF9faW9tZW0gKnBjaW1faW9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4bGVuKTsKQEAgLTE1OTcsNyArMTU5OSw2IEBACiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKIGludCBwY2lfZW5hYmxlX3NyaW92KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBucl92aXJ0Zm4pOwogdm9pZCBwY2lfZGlzYWJsZV9zcmlvdihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWlycXJldHVybl90IHBjaV9zcmlvdl9taWdyYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX251bV92ZihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfdmZzX2Fzc2lnbmVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9zcmlvdl9zZXRfdG90YWx2ZnMoc3RydWN0IHBjaV9kZXYgKmRldiwgdTE2IG51bXZmcyk7CkBAIC0xNjA2LDggKzE2MDcsNiBAQAogc3RhdGljIGlubGluZSBpbnQgcGNpX2VuYWJsZV9zcmlvdihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnJfdmlydGZuKQogeyByZXR1cm4gLUVOT0RFVjsgfQogc3RhdGljIGlubGluZSB2b2lkIHBjaV9kaXNhYmxlX3NyaW92KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQotc3RhdGljIGlubGluZSBpcnFyZXR1cm5fdCBwY2lfc3Jpb3ZfbWlncmF0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17IHJldHVybiBJUlFfTk9ORTsgfQogc3RhdGljIGlubGluZSBpbnQgcGNpX251bV92ZihzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBwY2lfdmZzX2Fzc2lnbmVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IDk3ZmJlY2QuLmQ0ZGUyNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC01MjgsNiArNTI4LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0Y1CTB4MTYwNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNkhfTkJfRjMJMHgxNTMzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9OQl9GNAkweDE1MzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTZIX00zMEhfTkJfRjMgMHgxNTgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE2SF9NMzBIX05CX0Y0IDB4MTU4NAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DTkIxN0hfRjMJMHgxNzAzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFCQkweDIwMDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfTEFOQ0VfSE9NRQkweDIwMDEKQEAgLTcyNiw2ICs3MjgsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgJCTB4NzAxOAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSFAJCTB4MTAzYworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hQXzNQQVIJCTB4MTU5MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX1ZJU1VBTElaRV9FRwkweDEwMDUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9WSVNVQUxJWkVfRlg2CTB4MTAwNgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX1ZJU1VBTElaRV9GWDQJMHgxMDA4CkBAIC0yNTMxLDYgKzI1MzQsOSBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5URUwJCTB4ODA4NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0VFU1NDCTB4MDAwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NOQl9JTUMJMHgwMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSVZCX0lNQwkweDAxNTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9IU1dfSU1DCTB4MGMwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BYSERfMAkweDAzMjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9QWEhEXzEJMHgwMzIxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUFhIXzAJMHgwMzI5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS9vbWFwX2NvbnRyb2xfcGh5LmggYi9pbmNsdWRlL2xpbnV4L3BoeS9vbWFwX2NvbnRyb2xfcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1MDQwMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcGh5L29tYXBfY29udHJvbF9waHkuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogb21hcF9jb250cm9sX3BoeS5oIC0gSGVhZGVyIGZpbGUgZm9yIHRoZSBQSFkgcGFydCBvZiBjb250cm9sIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yOiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19PTUFQX0NPTlRST0xfUEhZX0hfXworI2RlZmluZSBfX09NQVBfQ09OVFJPTF9QSFlfSF9fCisKK2VudW0gb21hcF9jb250cm9sX3BoeV90eXBlIHsKKwlPTUFQX0NUUkxfVFlQRV9PVEdIUyA9IDEsCS8qIE1haWxib3ggT1RHSFNfQ09OVFJPTCAqLworCU9NQVBfQ1RSTF9UWVBFX1VTQjIsCS8qIFVTQjJfUEhZLCBwb3dlciBkb3duIGluIENPTlRST0xfREVWX0NPTkYgKi8KKwlPTUFQX0NUUkxfVFlQRV9QSVBFMywJLyogUElQRTMgUEhZLCBEUExMICYgc2VwZXJhdGUgUngvVHggcG93ZXIgKi8KKwlPTUFQX0NUUkxfVFlQRV9EUkE3VVNCMiwgLyogVVNCMiBQSFksIHBvd2VyIGFuZCBwb3dlcl9hdXggZS5nLiBEUkE3ICovCisJT01BUF9DVFJMX1RZUEVfQU00MzdVU0IyLCAvKiBVU0IyIFBIWSwgcG93ZXIgZS5nLiBBTTQzN3ggKi8KK307CisKK3N0cnVjdCBvbWFwX2NvbnRyb2xfcGh5IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwl1MzIgX19pb21lbSAqb3RnaHNfY29udHJvbDsKKwl1MzIgX19pb21lbSAqcG93ZXI7CisJdTMyIF9faW9tZW0gKnBvd2VyX2F1eDsKKworCXN0cnVjdCBjbGsgKnN5c19jbGs7CisKKwllbnVtIG9tYXBfY29udHJvbF9waHlfdHlwZSB0eXBlOworfTsKKworZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgeworCVVTQl9NT0RFX1VOREVGSU5FRCA9IDAsCisJVVNCX01PREVfSE9TVCwKKwlVU0JfTU9ERV9ERVZJQ0UsCisJVVNCX01PREVfRElTQ09OTkVDVCwKK307CisKKyNkZWZpbmUJT01BUF9DVFJMX0RFVl9QSFlfUEQJCUJJVCgwKQorCisjZGVmaW5lCU9NQVBfQ1RSTF9ERVZfQVZBTElECQlCSVQoMCkKKyNkZWZpbmUJT01BUF9DVFJMX0RFVl9CVkFMSUQJCUJJVCgxKQorI2RlZmluZQlPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRAkJQklUKDIpCisjZGVmaW5lCU9NQVBfQ1RSTF9ERVZfU0VTU0VORAkJQklUKDMpCisjZGVmaW5lCU9NQVBfQ1RSTF9ERVZfSURESUcJCUJJVCg0KQorCisjZGVmaW5lCU9NQVBfQ1RSTF9QSVBFM19QSFlfUFdSQ1RMX0NMS19DTURfTUFTSwkJMHgwMDNGQzAwMAorI2RlZmluZQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfQ01EX1NISUZUCTB4RQorCisjZGVmaW5lCU9NQVBfQ1RSTF9QSVBFM19QSFlfUFdSQ1RMX0NMS19GUkVRX01BU0sJMHhGRkMwMDAwMAorI2RlZmluZQlPTUFQX0NUUkxfUElQRTNfUEhZX1BXUkNUTF9DTEtfRlJFUV9TSElGVAkweDE2CisKKyNkZWZpbmUJT01BUF9DVFJMX1BJUEUzX1BIWV9UWF9SWF9QT1dFUk9OCTB4MworI2RlZmluZQlPTUFQX0NUUkxfUElQRTNfUEhZX1RYX1JYX1BPV0VST0ZGCTB4MAorCisjZGVmaW5lIE9NQVBfQ1RSTF9VU0IyX1BIWV9QRAkJQklUKDI4KQorCisjZGVmaW5lIEFNNDM3WF9DVFJMX1VTQjJfUEhZX1BECQlCSVQoMCkKKyNkZWZpbmUgQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQJCUJJVCgxKQorI2RlZmluZSBBTTQzN1hfQ1RSTF9VU0IyX09UR1ZERVRfRU4JQklUKDE5KQorI2RlZmluZSBBTTQzN1hfQ1RSTF9VU0IyX09UR1NFU1NFTkRfRU4JQklUKDIwKQorCisjaWYgSVNfRU5BQkxFRChDT05GSUdfT01BUF9DT05UUk9MX1BIWSkKK3ZvaWQgb21hcF9jb250cm9sX3BoeV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBvbik7Cit2b2lkIG9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIGVudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIG1vZGUpOworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfY29udHJvbF9waHlfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb24pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwllbnVtIG9tYXBfY29udHJvbF91c2JfbW9kZSBtb2RlKQoreworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBfX09NQVBfQ09OVFJPTF9QSFlfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS9vbWFwX3VzYi5oIGIvaW5jbHVkZS9saW51eC9waHkvb21hcF91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJjNTQxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9waHkvb21hcF91c2IuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogb21hcF91c2IuaCAtLSBvbWFwIHVzYjIgcGh5IGhlYWRlciBmaWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fRFJJVkVSU19PTUFQX1VTQjJfSAorI2RlZmluZSBfX0RSSVZFUlNfT01BUF9VU0IyX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorCitzdHJ1Y3QgdXNiX2RwbGxfcGFyYW1zIHsKKwl1MTYJbTsKKwl1OAluOworCXU4CWZyZXE6MzsKKwl1OAlzZDsKKwl1MzIJbWY7Cit9OworCitzdHJ1Y3Qgb21hcF91c2IgeworCXN0cnVjdCB1c2JfcGh5CQlwaHk7CisJc3RydWN0IHBoeV9jb21wYW5pb24JKmNvbXBhcmF0b3I7CisJdm9pZCBfX2lvbWVtCQkqcGxsX2N0cmxfYmFzZTsKKwl2b2lkIF9faW9tZW0JCSpwaHlfYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sX2RldjsKKwlzdHJ1Y3QgY2xrCQkqd2t1cGNsazsKKwlzdHJ1Y3QgY2xrCQkqb3B0Y2xrOworCXU4CQkJZmxhZ3M7Cit9OworCitzdHJ1Y3QgdXNiX3BoeV9kYXRhIHsKKwljb25zdCBjaGFyICpsYWJlbDsKKwl1OCBmbGFnczsKK307CisKKy8qIERyaXZlciBGbGFncyAqLworI2RlZmluZSBPTUFQX1VTQjJfSEFTX1NUQVJUX1NSUCAoMSA8PCAwKQorI2RlZmluZSBPTUFQX1VTQjJfSEFTX1NFVF9WQlVTICgxIDw8IDEpCisjZGVmaW5lIE9NQVBfVVNCMl9DQUxJQlJBVEVfRkFMU0VfRElTQ09OTkVDVCAoMSA8PCAyKQorCisjZGVmaW5lCXBoeV90b19vbWFwdXNiKHgpCWNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBvbWFwX3VzYiwgcGh5KQorCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9VU0IyKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX1VTQjJfTU9EVUxFKQorZXh0ZXJuIGludCBvbWFwX3VzYjJfc2V0X2NvbXBhcmF0b3Ioc3RydWN0IHBoeV9jb21wYW5pb24gKmNvbXBhcmF0b3IpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG9tYXBfdXNiMl9zZXRfY29tcGFyYXRvcihzdHJ1Y3QgcGh5X2NvbXBhbmlvbiAqY29tcGFyYXRvcikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHUzMiBvbWFwX3VzYl9yZWFkbCh2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3VzYl93cml0ZWwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsCisJdTMyIGRhdGEpCit7CisJX19yYXdfd3JpdGVsKGRhdGEsIGFkZHIgKyBvZmZzZXQpOworfQorCisjZW5kaWYgLyogX19EUklWRVJTX09NQVBfVVNCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkvcGh5LmgKaW5kZXggM2Y4MzQ1OS4uZTJmNWNhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHkvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkvcGh5LmgKQEAgLTE0OSw4ICsxNDksMTEgQEAKIHN0cnVjdCBwaHkgKnBoeV9vcHRpb25hbF9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpzdHJpbmcpOwogc3RydWN0IHBoeSAqZGV2bV9waHlfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqc3RyaW5nKTsKIHN0cnVjdCBwaHkgKmRldm1fcGh5X29wdGlvbmFsX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnN0cmluZyk7CitzdHJ1Y3QgcGh5ICpkZXZtX29mX3BoeV9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJICAgIGNvbnN0IGNoYXIgKmNvbl9pZCk7CiB2b2lkIHBoeV9wdXQoc3RydWN0IHBoeSAqcGh5KTsKIHZvaWQgZGV2bV9waHlfcHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBoeSAqcGh5KTsKK3N0cnVjdCBwaHkgKm9mX3BoeV9nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqY29uX2lkKTsKIHN0cnVjdCBwaHkgKm9mX3BoeV9zaW1wbGVfeGxhdGUoc3RydWN0IGRldmljZSAqZGV2LAogCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpOwogc3RydWN0IHBoeSAqcGh5X2NyZWF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBwaHlfb3BzICpvcHMsCkBAIC0yNTEsNiArMjU0LDEzIEBACiAJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBoeSAqZGV2bV9vZl9waHlfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgIGNvbnN0IGNoYXIgKmNvbl9pZCkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHBoeV9wdXQoc3RydWN0IHBoeSAqcGh5KQogewogfQpAQCAtMjU5LDYgKzI2OSwxMSBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwaHkgKm9mX3BoeV9nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqY29uX2lkKQoreworCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwaHkgKm9mX3BoeV9zaW1wbGVfeGxhdGUoc3RydWN0IGRldmljZSAqZGV2LAogCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYWRhdTE5NzcuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hZGF1MTk3Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDExZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYWRhdTE5NzcuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQURBVTE5NzcvQURBVTE5NzgvQURBVTE5NzkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9QTEFURk9STV9EQVRBX0FEQVUxOTc3X0hfXworI2RlZmluZSBfX0xJTlVYX1BMQVRGT1JNX0RBVEFfQURBVTE5NzdfSF9fCisKKy8qKgorICogZW51bSBhZGF1MTk3N19taWNiaWFzIC0gQURBVTE5NzcgTUlDQklBUyBwaW4gdm9sdGFnZSBzZXR0aW5nCisgKiBAQURBVTE5NzdfTUlDQklBU181VjA6IE1JQ0JJQVMgaXMgc2V0IHRvIDUuMCBWCisgKiBAQURBVTE5NzdfTUlDQklBU181VjU6IE1JQ0JJQVMgaXMgc2V0IHRvIDUuNSBWCisgKiBAQURBVTE5NzdfTUlDQklBU182VjA6IE1JQ0JJQVMgaXMgc2V0IHRvIDYuMCBWCisgKiBAQURBVTE5NzdfTUlDQklBU182VjU6IE1JQ0JJQVMgaXMgc2V0IHRvIDYuNSBWCisgKiBAQURBVTE5NzdfTUlDQklBU183VjA6IE1JQ0JJQVMgaXMgc2V0IHRvIDcuMCBWCisgKiBAQURBVTE5NzdfTUlDQklBU183VjU6IE1JQ0JJQVMgaXMgc2V0IHRvIDcuNSBWCisgKiBAQURBVTE5NzdfTUlDQklBU184VjA6IE1JQ0JJQVMgaXMgc2V0IHRvIDguMCBWCisgKiBAQURBVTE5NzdfTUlDQklBU184VjU6IE1JQ0JJQVMgaXMgc2V0IHRvIDguNSBWCisgKiBAQURBVTE5NzdfTUlDQklBU185VjA6IE1JQ0JJQVMgaXMgc2V0IHRvIDkuMCBWCisgKi8KK2VudW0gYWRhdTE5NzdfbWljYmlhcyB7CisJQURBVTE5NzdfTUlDQklBU181VjAgPSAweDAsCisJQURBVTE5NzdfTUlDQklBU181VjUgPSAweDEsCisJQURBVTE5NzdfTUlDQklBU182VjAgPSAweDIsCisJQURBVTE5NzdfTUlDQklBU182VjUgPSAweDMsCisJQURBVTE5NzdfTUlDQklBU183VjAgPSAweDQsCisJQURBVTE5NzdfTUlDQklBU183VjUgPSAweDUsCisJQURBVTE5NzdfTUlDQklBU184VjAgPSAweDYsCisJQURBVTE5NzdfTUlDQklBU184VjUgPSAweDcsCisJQURBVTE5NzdfTUlDQklBU185VjAgPSAweDgsCit9OworCisvKioKKyAqIHN0cnVjdCBhZGF1MTk3N19wbGF0Zm9ybV9kYXRhIC0gUGxhdGZvcm0gY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgQURBVTE5NzcKKyAqIEBtaWNiaWFzOiBTcGVjaWZpZXMgdGhlIHZvbHRhZ2UgZm9yIHRoZSBNSUNCSUFTIHBpbgorICovCitzdHJ1Y3QgYWRhdTE5NzdfcGxhdGZvcm1fZGF0YSB7CisJZW51bSBhZGF1MTk3N19taWNiaWFzIG1pY2JpYXM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYy5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjLmgKaW5kZXggOWVmYzA0ZC4uNzA5YzZmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjLmgKQEAgLTEsNSArMSw0IEBACi0vKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2F1ZGlvLmgKLSAqCisvKgogICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZAogICogQXV0aG9yOiBKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjMjR4eF9zaW10ZWMuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9hc29jLXMzYzI0eHhfc2ltdGVjLmgKaW5kZXggMzc2YWY1Mi4uZDIyMGU1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2MtczNjMjR4eF9zaW10ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MyNHh4X3NpbXRlYy5oCkBAIC0xLDUgKzEsNCBAQAotLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hdWRpby1zaW10ZWMuaAotICoKKy8qCiAgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKICAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCiAgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYnQtbm9raWEtaDRwLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvYnQtbm9raWEtaDRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkMTY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9idC1ub2tpYS1oNHAuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTm9raWEgSDRQIGJsdWV0b290aCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisKKy8qKgorICogc3RydWN0IGhjaV9oNHBfcGxhdGZvcm0gZGF0YSAtIGhjaV9oNHAgUGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGhjaV9oNHBfcGxhdGZvcm1fZGF0YSB7CisJaW50IGNoaXBfdHlwZTsKKwlpbnQgYnRfc3lzY2xrOworCXVuc2lnbmVkIGludCBidF93YWtldXBfZ3BpbzsKKwl1bnNpZ25lZCBpbnQgaG9zdF93YWtldXBfZ3BpbzsKKwl1bnNpZ25lZCBpbnQgcmVzZXRfZ3BpbzsKKwlpbnQgcmVzZXRfZ3Bpb19zaGFyZWQ7CisJdW5zaWduZWQgaW50IHVhcnRfaXJxOworCXBoeXNfYWRkcl90IHVhcnRfYmFzZTsKKwljb25zdCBjaGFyICp1YXJ0X2ljbGs7CisJY29uc3QgY2hhciAqdWFydF9mY2xrOworCXZvaWQgKCpzZXRfcG1fbGltaXRzKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgc2V0KTsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZGF2aW5jaV9hc3AuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kYXZpbmNpX2FzcC5oCmluZGV4IDUyNDU5OTIuLjg1YWQ2OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kYXZpbmNpX2FzcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kYXZpbmNpX2FzcC5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgogCi1zdHJ1Y3Qgc25kX3BsYXRmb3JtX2RhdGEgeworc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgewogCXUzMiB0eF9kbWFfb2Zmc2V0OwogCXUzMiByeF9kbWFfb2Zmc2V0OwogCWludCBhc3BfY2hhbl9xOwkvKiBldmVudCBxdWV1ZSBudW1iZXIgZm9yIEFTUCBjaGFubmVsICovCkBAIC04Nyw2ICs4Nyw4IEBACiAJaW50IHR4X2RtYV9jaGFubmVsOwogCWludCByeF9kbWFfY2hhbm5lbDsKIH07CisvKiBUT0RPOiBGaXggYXJjaC9hcm0vbWFjaC1kYXZpbmNpLyB1c2VycyBhbmQgcmVtb3ZlIHRoaXMgZGVmaW5lICovCisjZGVmaW5lIHNuZF9wbGF0Zm9ybV9kYXRhIGRhdmluY2lfbWNhc3BfcGRhdGEKIAogZW51bSB7CiAJTUNBU1BfVkVSU0lPTl8xID0gMCwJLyogRE02NDZ4ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbWF4MzEweC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL21heDMxMHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMWRjZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbWF4MzEweC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqICBNYXhpbSAoRGFsbGFzKSBNQVgzMTA3LzgvOSwgTUFYMTQ4MzAgc2VyaWFsIGRyaXZlcgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTIgQWxleGFuZGVyIFNoaXlhbiA8c2hjX3dvcmtAbWFpbC5ydT4KLSAqCi0gKiAgQmFzZWQgb24gbWF4MzEwMC5jLCBieSBDaHJpc3RpYW4gUGVsbGVncmluIDxjaHJpcGVsbEBldm9sd2FyZS5vcmc+Ci0gKiAgQmFzZWQgb24gbWF4MzExMC5jLCBieSBGZW5nIFRhbmcgPGZlbmcudGFuZ0BpbnRlbC5jb20+Ci0gKiAgQmFzZWQgb24gbWF4MzEwNy5jLCBieSBBYXZhbW9iaWxlCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTUFYMzEwWF9IXwotI2RlZmluZSBfTUFYMzEwWF9IXwotCi0vKgotICogRXhhbXBsZSBib2FyZCBpbml0aWFsaXphdGlvbiBkYXRhOgotICoKLSAqIHN0YXRpYyBzdHJ1Y3QgbWF4MzEweF9wZGF0YSBtYXgzMTA3X3BkYXRhID0gewotICoJLmRyaXZlcl9mbGFncwk9IE1BWDMxMFhfRVhUX0NMSywKLSAqCS51YXJ0X2ZsYWdzWzBdCT0gTUFYMzEwWF9FQ0hPX1NVUFJFU1MgfCBNQVgzMTBYX0FVVE9fRElSX0NUUkwsCi0gKgkuZnJlcXVlbmN5CT0gMzY4NjQwMCwKLSAqCS5ncGlvX2Jhc2UJPSAtMSwKLSAqIH07Ci0gKgotICogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfZGV2aWNlX21heDMxMDdbXSA9IHsKLSAqCXsKLSAqCQkubW9kYWxpYXMJPSAibWF4MzEwNyIsCi0gKgkJLmlycQkJPSBJUlFfRUlOVDMsCi0gKgkJLmJ1c19udW0JPSAxLAotICoJCS5jaGlwX3NlbGVjdAk9IDEsCi0gKgkJLnBsYXRmb3JtX2RhdGEJPSAmbWF4MzEwN19wZGF0YSwKLSAqCX0sCi0gKiB9OwotICovCi0KLSNkZWZpbmUgTUFYMzEwWF9NQVhfVUFSVFMJNAotCi0vKiBNQVgzMTBYIHBsYXRmb3JtIGRhdGEgc3RydWN0dXJlICovCi1zdHJ1Y3QgbWF4MzEweF9wZGF0YSB7Ci0JLyogRmxhZ3MgZ2xvYmFsIHRvIGRyaXZlciAqLwotCWNvbnN0IHU4CQlkcml2ZXJfZmxhZ3M7Ci0jZGVmaW5lIE1BWDMxMFhfRVhUX0NMSwkJKDB4MDAwMDAwMDEpCS8qIEV4dGVybmFsIGNsb2NrIGVuYWJsZSAqLwotCS8qIEZsYWdzIGdsb2JhbCB0byBVQVJUIHBvcnQgKi8KLQljb25zdCB1OAkJdWFydF9mbGFnc1tNQVgzMTBYX01BWF9VQVJUU107Ci0jZGVmaW5lIE1BWDMxMFhfTE9PUEJBQ0sJKDB4MDAwMDAwMDEpCS8qIExvb3BiYWNrIG1vZGUgZW5hYmxlICovCi0jZGVmaW5lIE1BWDMxMFhfRUNIT19TVVBSRVNTCSgweDAwMDAwMDAyKQkvKiBFbmFibGUgZWNobyBzdXByZXNzICovCi0jZGVmaW5lIE1BWDMxMFhfQVVUT19ESVJfQ1RSTAkoMHgwMDAwMDAwNCkJLyogRW5hYmxlIEF1dG8gZGlyZWN0aW9uCi0JCQkJCQkgKiBjb250cm9sIChSUy00ODUpCi0JCQkJCQkgKi8KLQkvKiBGcmVxdWVuY3kgKGV4dHJlbmFsIGNsb2NrIG9yIGNyeXN0YWwpICovCi0JY29uc3QgaW50CQlmcmVxdWVuY3k7Ci0JLyogR1BJTyBiYXNlIG51bWJlciAoY2FuIGJlIG5lZ2F0aXZlKSAqLwotCWNvbnN0IGludAkJZ3Bpb19iYXNlOwotCS8qIENhbGxlZCBkdXJpbmcgc3RhcnR1cCAqLwotCXZvaWQgKCppbml0KSh2b2lkKTsKLQkvKiBDYWxsZWQgYmVmb3JlIGZpbmlzaCAqLwotCXZvaWQgKCpleGl0KSh2b2lkKTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NlcmlhbC1pbXguaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zZXJpYWwtaW14LmgKaW5kZXggNGFkZWM5Yi4uM2NjMmUzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NlcmlhbC1pbXguaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc2VyaWFsLWlteC5oCkBAIC0yMyw4ICsyMyw2IEBACiAjZGVmaW5lIElNWFVBUlRfSVJEQSAgICAgICAgKDE8PDEpCiAKIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgewotCWludCAoKmluaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwotCXZvaWQgKCpleGl0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdm9pZCAoKmlyZGFfZW5hYmxlKShpbnQgZW5hYmxlKTsKIAl1bnNpZ25lZCBpbnQgaXJkYV9pbnZfcng6MTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zcGktczNjNjR4eC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1zM2M2NHh4LmgKaW5kZXggODQ0N2Y2My4uZDM4ODliOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1zM2M2NHh4LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1zM2M2NHh4LmgKQEAgLTEsNSArMSw0IEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0eHgtc3BpLmgKLSAqCisvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgTHRkLgogICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgogICoKQEAgLTgsOCArNyw4IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaWZuZGVmIF9fUzNDNjRYWF9QTEFUX1NQSV9ICi0jZGVmaW5lIF9fUzNDNjRYWF9QTEFUX1NQSV9ICisjaWZuZGVmIF9fU1BJX1MzQzY0WFhfSAorI2RlZmluZSBfX1NQSV9TM0M2NFhYX0gKIAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogCkBAIC02OCw0ICs2Nyw0IEBACiBleHRlcm4gc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gczNjNjR4eF9zcGkwX3BkYXRhOwogZXh0ZXJuIHN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvIHMzYzY0eHhfc3BpMV9wZGF0YTsKIGV4dGVybiBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyBzM2M2NHh4X3NwaTJfcGRhdGE7Ci0jZW5kaWYgLyogX19TM0M2NFhYX1BMQVRfU1BJX0ggKi8KKyNlbmRpZiAvKl9fU1BJX1MzQzY0WFhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VsaXN0LmggYi9pbmNsdWRlL2xpbnV4L3JjdWxpc3QuaAppbmRleCBkYmFmOTkwLi44MTgzYjQ2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKQEAgLTI0Nyw5ICsyNDcsMTAgQEAKICAqIHByaW1pdGl2ZXMgc3VjaCBhcyBsaXN0X2FkZF9yY3UoKSBhcyBsb25nIGFzIGl0J3MgZ3VhcmRlZCBieSByY3VfcmVhZF9sb2NrKCkuCiAgKi8KICNkZWZpbmUgbGlzdF9lbnRyeV9yY3UocHRyLCB0eXBlLCBtZW1iZXIpIFwKLQkoe3R5cGVvZiAoKnB0cikgX19yY3UgKl9fcHRyID0gKHR5cGVvZiAoKnB0cikgX19yY3UgX19mb3JjZSAqKXB0cjsgXAotCSBjb250YWluZXJfb2YoKHR5cGVvZihwdHIpKXJjdV9kZXJlZmVyZW5jZV9yYXcoX19wdHIpLCB0eXBlLCBtZW1iZXIpOyBcCi0JfSkKKyh7IFwKKwl0eXBlb2YoKnB0cikgX19yY3UgKl9fcHRyID0gKHR5cGVvZigqcHRyKSBfX3JjdSBfX2ZvcmNlICopcHRyOyBcCisJY29udGFpbmVyX29mKCh0eXBlb2YocHRyKSlyY3VfZGVyZWZlcmVuY2VfcmF3KF9fcHRyKSwgdHlwZSwgbWVtYmVyKTsgXAorfSkKIAogLyoqCiAgKiBXaGVyZSBhcmUgbGlzdF9lbXB0eV9yY3UoKSBhbmQgbGlzdF9maXJzdF9lbnRyeV9yY3UoKT8KQEAgLTI4NSwxMSArMjg2LDExIEBACiAgKiBwcmltaXRpdmVzIHN1Y2ggYXMgbGlzdF9hZGRfcmN1KCkgYXMgbG9uZyBhcyBpdCdzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgogICovCiAjZGVmaW5lIGxpc3RfZmlyc3Rfb3JfbnVsbF9yY3UocHRyLCB0eXBlLCBtZW1iZXIpIFwKLQkoe3N0cnVjdCBsaXN0X2hlYWQgKl9fcHRyID0gKHB0cik7IFwKLQkgIHN0cnVjdCBsaXN0X2hlYWQgKl9fbmV4dCA9IEFDQ0VTU19PTkNFKF9fcHRyLT5uZXh0KTsgXAotCSAgbGlrZWx5KF9fcHRyICE9IF9fbmV4dCkgPyBcCi0JCWxpc3RfZW50cnlfcmN1KF9fbmV4dCwgdHlwZSwgbWVtYmVyKSA6IE5VTEw7IFwKLQl9KQorKHsgXAorCXN0cnVjdCBsaXN0X2hlYWQgKl9fcHRyID0gKHB0cik7IFwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfX25leHQgPSBBQ0NFU1NfT05DRShfX3B0ci0+bmV4dCk7IFwKKwlsaWtlbHkoX19wdHIgIT0gX19uZXh0KSA/IGxpc3RfZW50cnlfcmN1KF9fbmV4dCwgdHlwZSwgbWVtYmVyKSA6IE5VTEw7IFwKK30pCiAKIC8qKgogICogbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UJLQlpdGVyYXRlIG92ZXIgcmN1IGxpc3Qgb2YgZ2l2ZW4gdHlwZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCmluZGV4IDcyYmYzYTAuLjAwYTdmZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDEKICAqCkBAIC00NCw3ICs0NCw5IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdvYmplY3RzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vYmFycmllci5oPgogCitleHRlcm4gaW50IHJjdV9leHBlZGl0ZWQ7IC8qIGZvciBzeXNjdGwgKi8KICNpZmRlZiBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVAogZXh0ZXJuIGludCByY3V0b3J0dXJlX3J1bm5hYmxlOyAvKiBmb3Igc3lzY3RsICovCiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUICovCkBAIC0zMTQsNyArMzE2LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHJjdV9sb2NrX2FjcXVpcmUoc3RydWN0IGxvY2tkZXBfbWFwICptYXApCiB7Ci0JbG9ja19hY3F1aXJlKG1hcCwgMCwgMCwgMiwgMSwgTlVMTCwgX1RISVNfSVBfKTsKKwlsb2NrX2FjcXVpcmUobWFwLCAwLCAwLCAyLCAwLCBOVUxMLCBfVEhJU19JUF8pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmN1X2xvY2tfcmVsZWFzZShzdHJ1Y3QgbG9ja2RlcF9tYXAgKm1hcCkKQEAgLTQ3OSwxMSArNDgxLDkgQEAKIAlkbyB7CQkJCQkJCQlcCiAJCXJjdV9wcmVlbXB0X3NsZWVwX2NoZWNrKCk7CQkJCVwKIAkJcmN1X2xvY2tkZXBfYXNzZXJ0KCFsb2NrX2lzX2hlbGQoJnJjdV9iaF9sb2NrX21hcCksCVwKLQkJCQkgICAiSWxsZWdhbCBjb250ZXh0IHN3aXRjaCBpbiBSQ1UtYmgiCVwKLQkJCQkgICAiIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIik7CVwKKwkJCQkgICAiSWxsZWdhbCBjb250ZXh0IHN3aXRjaCBpbiBSQ1UtYmggcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24iKTsgXAogCQlyY3VfbG9ja2RlcF9hc3NlcnQoIWxvY2tfaXNfaGVsZCgmcmN1X3NjaGVkX2xvY2tfbWFwKSwJXAotCQkJCSAgICJJbGxlZ2FsIGNvbnRleHQgc3dpdGNoIGluIFJDVS1zY2hlZCJcCi0JCQkJICAgIiByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiIpOwlcCisJCQkJICAgIklsbGVnYWwgY29udGV4dCBzd2l0Y2ggaW4gUkNVLXNjaGVkIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIik7IFwKIAl9IHdoaWxlICgwKQogCiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1BST1ZFX1JDVSAqLwpAQCAtNTEwLDQzICs1MTAsNDAgQEAKICNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgX19DSEVDS0VSX18gKi8KIAogI2RlZmluZSBfX3JjdV9hY2Nlc3NfcG9pbnRlcihwLCBzcGFjZSkgXAotCSh7IFwKLQkJdHlwZW9mKCpwKSAqX19fX19fX19fcDEgPSAodHlwZW9mKCpwKSpfX2ZvcmNlIClBQ0NFU1NfT05DRShwKTsgXAotCQlyY3VfZGVyZWZlcmVuY2Vfc3BhcnNlKHAsIHNwYWNlKTsgXAotCQkoKHR5cGVvZigqcCkgX19mb3JjZSBfX2tlcm5lbCAqKShfX19fX19fX19wMSkpOyBcCi0JfSkKKyh7IFwKKwl0eXBlb2YoKnApICpfX19fX19fX19wMSA9ICh0eXBlb2YoKnApICpfX2ZvcmNlKUFDQ0VTU19PTkNFKHApOyBcCisJcmN1X2RlcmVmZXJlbmNlX3NwYXJzZShwLCBzcGFjZSk7IFwKKwkoKHR5cGVvZigqcCkgX19mb3JjZSBfX2tlcm5lbCAqKShfX19fX19fX19wMSkpOyBcCit9KQogI2RlZmluZSBfX3JjdV9kZXJlZmVyZW5jZV9jaGVjayhwLCBjLCBzcGFjZSkgXAotCSh7IFwKLQkJdHlwZW9mKCpwKSAqX19fX19fX19fcDEgPSAodHlwZW9mKCpwKSpfX2ZvcmNlIClBQ0NFU1NfT05DRShwKTsgXAotCQlyY3VfbG9ja2RlcF9hc3NlcnQoYywgInN1c3BpY2lvdXMgcmN1X2RlcmVmZXJlbmNlX2NoZWNrKCkiIFwKLQkJCQkgICAgICAiIHVzYWdlIik7IFwKLQkJcmN1X2RlcmVmZXJlbmNlX3NwYXJzZShwLCBzcGFjZSk7IFwKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IFwKLQkJKCh0eXBlb2YoKnApIF9fZm9yY2UgX19rZXJuZWwgKikoX19fX19fX19fcDEpKTsgXAotCX0pCisoeyBcCisJdHlwZW9mKCpwKSAqX19fX19fX19fcDEgPSAodHlwZW9mKCpwKSAqX19mb3JjZSlBQ0NFU1NfT05DRShwKTsgXAorCXJjdV9sb2NrZGVwX2Fzc2VydChjLCAic3VzcGljaW91cyByY3VfZGVyZWZlcmVuY2VfY2hlY2soKSB1c2FnZSIpOyBcCisJcmN1X2RlcmVmZXJlbmNlX3NwYXJzZShwLCBzcGFjZSk7IFwKKwlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgLyogRGVwZW5kZW5jeSBvcmRlciB2cy4gcCBhYm92ZS4gKi8gXAorCSgodHlwZW9mKCpwKSBfX2ZvcmNlIF9fa2VybmVsICopKF9fX19fX19fX3AxKSk7IFwKK30pCiAjZGVmaW5lIF9fcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwLCBjLCBzcGFjZSkgXAotCSh7IFwKLQkJcmN1X2xvY2tkZXBfYXNzZXJ0KGMsICJzdXNwaWNpb3VzIHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoKSIgXAotCQkJCSAgICAgICIgdXNhZ2UiKTsgXAotCQlyY3VfZGVyZWZlcmVuY2Vfc3BhcnNlKHAsIHNwYWNlKTsgXAotCQkoKHR5cGVvZigqcCkgX19mb3JjZSBfX2tlcm5lbCAqKShwKSk7IFwKLQl9KQorKHsgXAorCXJjdV9sb2NrZGVwX2Fzc2VydChjLCAic3VzcGljaW91cyByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKCkgdXNhZ2UiKTsgXAorCXJjdV9kZXJlZmVyZW5jZV9zcGFyc2UocCwgc3BhY2UpOyBcCisJKCh0eXBlb2YoKnApIF9fZm9yY2UgX19rZXJuZWwgKikocCkpOyBcCit9KQogCiAjZGVmaW5lIF9fcmN1X2FjY2Vzc19pbmRleChwLCBzcGFjZSkgXAotCSh7IFwKLQkJdHlwZW9mKHApIF9fX19fX19fX3AxID0gQUNDRVNTX09OQ0UocCk7IFwKLQkJcmN1X2RlcmVmZXJlbmNlX3NwYXJzZShwLCBzcGFjZSk7IFwKLQkJKF9fX19fX19fX3AxKTsgXAotCX0pCisoeyBcCisJdHlwZW9mKHApIF9fX19fX19fX3AxID0gQUNDRVNTX09OQ0UocCk7IFwKKwlyY3VfZGVyZWZlcmVuY2Vfc3BhcnNlKHAsIHNwYWNlKTsgXAorCShfX19fX19fX19wMSk7IFwKK30pCiAjZGVmaW5lIF9fcmN1X2RlcmVmZXJlbmNlX2luZGV4X2NoZWNrKHAsIGMpIFwKLQkoeyBcCi0JCXR5cGVvZihwKSBfX19fX19fX19wMSA9IEFDQ0VTU19PTkNFKHApOyBcCi0JCXJjdV9sb2NrZGVwX2Fzc2VydChjLCBcCi0JCQkJICAgInN1c3BpY2lvdXMgcmN1X2RlcmVmZXJlbmNlX2luZGV4X2NoZWNrKCkiIFwKLQkJCQkgICAiIHVzYWdlIik7IFwKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IFwKLQkJKF9fX19fX19fX3AxKTsgXAotCX0pCisoeyBcCisJdHlwZW9mKHApIF9fX19fX19fX3AxID0gQUNDRVNTX09OQ0UocCk7IFwKKwlyY3VfbG9ja2RlcF9hc3NlcnQoYywgXAorCQkJICAgInN1c3BpY2lvdXMgcmN1X2RlcmVmZXJlbmNlX2luZGV4X2NoZWNrKCkgdXNhZ2UiKTsgXAorCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyAvKiBEZXBlbmRlbmN5IG9yZGVyIHZzLiBwIGFib3ZlLiAqLyBcCisJKF9fX19fX19fX3AxKTsgXAorfSkKIAogLyoqCiAgKiBSQ1VfSU5JVElBTElaRVIoKSAtIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSBhbiBSQ1UtcHJvdGVjdGVkIGdsb2JhbCB2YXJpYWJsZQpAQCAtNTg1LDEyICs1ODIsNyBAQAogICogcGxlYXNlIGJlIGNhcmVmdWwgd2hlbiBtYWtpbmcgY2hhbmdlcyB0byByY3VfYXNzaWduX3BvaW50ZXIoKSBhbmQgdGhlCiAgKiBvdGhlciBtYWNyb3MgdGhhdCBpdCBpbnZva2VzLgogICovCi0jZGVmaW5lIHJjdV9hc3NpZ25fcG9pbnRlcihwLCB2KSBcCi0JZG8geyBcCi0JCXNtcF93bWIoKTsgXAotCQlBQ0NFU1NfT05DRShwKSA9IFJDVV9JTklUSUFMSVpFUih2KTsgXAotCX0gd2hpbGUgKDApCi0KKyNkZWZpbmUgcmN1X2Fzc2lnbl9wb2ludGVyKHAsIHYpIHNtcF9zdG9yZV9yZWxlYXNlKCZwLCBSQ1VfSU5JVElBTElaRVIodikpCiAKIC8qKgogICogcmN1X2FjY2Vzc19wb2ludGVyKCkgLSBmZXRjaCBSQ1UgcG9pbnRlciB3aXRoIG5vIGRlcmVmZXJlbmNpbmcKQEAgLTEwMTUsMTEgKzEwMDcsMjEgQEAKICNkZWZpbmUga2ZyZWVfcmN1KHB0ciwgcmN1X2hlYWQpCQkJCQlcCiAJX19rZnJlZV9yY3UoJigocHRyKS0+cmN1X2hlYWQpLCBvZmZzZXRvZih0eXBlb2YoKihwdHIpKSwgcmN1X2hlYWQpKQogCi0jaWZkZWYgQ09ORklHX1JDVV9OT0NCX0NQVQorI2lmIGRlZmluZWQoQ09ORklHX1RJTllfUkNVKSB8fCBkZWZpbmVkKENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMKQorc3RhdGljIGlubGluZSBpbnQgcmN1X25lZWRzX2NwdShpbnQgY3B1LCB1bnNpZ25lZCBsb25nICpkZWx0YV9qaWZmaWVzKQoreworCSpkZWx0YV9qaWZmaWVzID0gVUxPTkdfTUFYOworCXJldHVybiAwOworfQorI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19USU5ZX1JDVSkgfHwgZGVmaW5lZChDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTCkgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwpCitzdGF0aWMgaW5saW5lIGJvb2wgcmN1X2lzX25vY2JfY3B1KGludCBjcHUpIHsgcmV0dXJuIHRydWU7IH0KKyNlbGlmIGRlZmluZWQoQ09ORklHX1JDVV9OT0NCX0NQVSkKIGJvb2wgcmN1X2lzX25vY2JfY3B1KGludCBjcHUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgYm9vbCByY3VfaXNfbm9jYl9jcHUoaW50IGNwdSkgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1JDVV9OT0NCX0NQVSAqLworI2VuZGlmCiAKIAogLyogT25seSBmb3IgdXNlIGJ5IGFkYXB0aXZlLXRpY2tzIGNvZGUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXRpbnkuaCBiL2luY2x1ZGUvbGludXgvcmN1dGlueS5oCmluZGV4IDZmMDE3NzEuLjQyNWM2NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1dGlueS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1dGlueS5oCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA4CiAgKgpAQCAtMjcsNiArMjcsMTYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25kX3N5bmNocm9uaXplX3JjdSh1bnNpZ25lZCBsb25nIG9sZHN0YXRlKQoreworCW1pZ2h0X3NsZWVwKCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCByY3VfYmFycmllcl9iaCh2b2lkKQogewogCXdhaXRfcmN1X2dwKGNhbGxfcmN1X2JoKTsKQEAgLTY4LDEyICs3OCw2IEBACiAJY2FsbF9yY3UoaGVhZCwgZnVuYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJjdV9uZWVkc19jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyAqZGVsdGFfamlmZmllcykKLXsKLQkqZGVsdGFfamlmZmllcyA9IFVMT05HX01BWDsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHJjdV9ub3RlX2NvbnRleHRfc3dpdGNoKGludCBjcHUpCiB7CiAJcmN1X3NjaGVkX3FzKGNwdSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCmluZGV4IDcyMTM3ZWUuLmE1OWNhMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA4CiAgKgpAQCAtMzEsNyArMzEsOSBAQAogI2RlZmluZSBfX0xJTlVYX1JDVVRSRUVfSAogCiB2b2lkIHJjdV9ub3RlX2NvbnRleHRfc3dpdGNoKGludCBjcHUpOworI2lmbmRlZiBDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTAogaW50IHJjdV9uZWVkc19jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyAqZGVsdGFfamlmZmllcyk7CisjZW5kaWYgLyogI2lmbmRlZiBDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTCAqLwogdm9pZCByY3VfY3B1X3N0YWxsX3Jlc2V0KHZvaWQpOwogCiAvKgpAQCAtNzQsNiArNzYsOCBAQAogdm9pZCByY3VfYmFycmllcih2b2lkKTsKIHZvaWQgcmN1X2JhcnJpZXJfYmgodm9pZCk7CiB2b2lkIHJjdV9iYXJyaWVyX3NjaGVkKHZvaWQpOwordW5zaWduZWQgbG9uZyBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KHZvaWQpOwordm9pZCBjb25kX3N5bmNocm9uaXplX3JjdSh1bnNpZ25lZCBsb25nIG9sZHN0YXRlKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmN1dG9ydHVyZV90ZXN0c2VxOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmN1dG9ydHVyZV92ZXJudW07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaAppbmRleCA0MTQ5ZjFhLi44NTY5MWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKQEAgLTE2NCw2ICsxNjQsOSBAQAogICogQHVzZV9zaW5nbGVfcnc6IElmIHNldCwgY29udmVydHMgdGhlIGJ1bGsgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyBpbnRvCiAgKgkJICAgIGEgc2VyaWVzIG9mIHNpbmdsZSByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zLiBUaGlzIGlzIHVzZWZ1bAogICoJCSAgICBmb3IgZGV2aWNlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBidWxrIHJlYWQgYW5kIHdyaXRlLgorICogQGNhbl9tdWx0aV93cml0ZTogSWYgc2V0LCB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSBtdWx0aSB3cml0ZSBtb2RlIG9mIGJ1bGsKKyAqICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMsIGlmIGNsZWFyIG11bHRpIHdyaXRlIHJlcXVlc3RzIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgIHNwbGl0IGludG8gaW5kaXZpZHVhbCB3cml0ZSBvcGVyYXRpb25zCiAgKgogICogQGNhY2hlX3R5cGU6IFRoZSBhY3R1YWwgY2FjaGUgdHlwZS4KICAqIEByZWdfZGVmYXVsdHNfcmF3OiBQb3dlciBvbiByZXNldCB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAoZm9yIHVzZSB3aXRoCkBAIC0yMTUsNiArMjE4LDcgQEAKIAl1OCB3cml0ZV9mbGFnX21hc2s7CiAKIAlib29sIHVzZV9zaW5nbGVfcnc7CisJYm9vbCBjYW5fbXVsdGlfd3JpdGU7CiAKIAllbnVtIHJlZ21hcF9lbmRpYW4gcmVnX2Zvcm1hdF9lbmRpYW47CiAJZW51bSByZWdtYXBfZW5kaWFuIHZhbF9mb3JtYXRfZW5kaWFuOwpAQCAtMzE3LDEyICszMjEsMTYgQEAKIAkJCSAgIGNvbnN0IHN0cnVjdCByZWdtYXBfYnVzICpidXMsCiAJCQkgICB2b2lkICpidXNfY29udGV4dCwKIAkJCSAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOworaW50IHJlZ21hcF9hdHRhY2hfZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKIHN0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X2kyYyhzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwogc3RydWN0IHJlZ21hcCAqcmVnbWFwX2luaXRfc3BpKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7Ci1zdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pKHN0cnVjdCBzcG1pX2RldmljZSAqZGV2LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOworc3RydWN0IHJlZ21hcCAqcmVnbWFwX2luaXRfc3BtaV9iYXNlKHN0cnVjdCBzcG1pX2RldmljZSAqZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcG1pX2V4dChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CiBzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9tbWlvX2NsayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNsa19pZCwKIAkJCQkgICAgdm9pZCBfX2lvbWVtICpyZWdzLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKQEAgLTMzNSw4ICszNDMsMTAgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CiBzdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X3NwaShzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKLXN0cnVjdCByZWdtYXAgKmRldm1fcmVnbWFwX2luaXRfc3BtaShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOworc3RydWN0IHJlZ21hcCAqZGV2bV9yZWdtYXBfaW5pdF9zcG1pX2Jhc2Uoc3RydWN0IHNwbWlfZGV2aWNlICpkZXYsCisJCQkJCSAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CitzdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X3NwbWlfZXh0KHN0cnVjdCBzcG1pX2RldmljZSAqZGV2LAorCQkJCQkgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CiBzdHJ1Y3QgcmVnbWFwICpkZXZtX3JlZ21hcF9pbml0X21taW9fY2xrKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY2xrX2lkLAogCQkJCQkgdm9pZCBfX2lvbWVtICpyZWdzLAogCQkJCQkgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CkBAIC0zODYsOCArMzk2LDExIEBACiAJCSAgICAgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX2xlbik7CiBpbnQgcmVnbWFwX2J1bGtfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLCBjb25zdCB2b2lkICp2YWwsCiAJCQlzaXplX3QgdmFsX2NvdW50KTsKLWludCByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAoraW50IHJlZ21hcF9tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgKnJlZ3MsCiAJCQlpbnQgbnVtX3JlZ3MpOworaW50IHJlZ21hcF9tdWx0aV9yZWdfd3JpdGVfYnlwYXNzZWQoc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgKnJlZ3MsCisJCQkJICAgIGludCBudW1fcmVncyk7CiBpbnQgcmVnbWFwX3Jhd193cml0ZV9hc3luYyhzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsCiAJCQkgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfbGVuKTsKIGludCByZWdtYXBfcmVhZChzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCAqdmFsKTsKQEAgLTQyMyw2ICs0MzYsOCBAQAogCiBpbnQgcmVnbWFwX3JlZ2lzdGVyX3BhdGNoKHN0cnVjdCByZWdtYXAgKm1hcCwgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0ICpyZWdzLAogCQkJICBpbnQgbnVtX3JlZ3MpOworaW50IHJlZ21hcF9wYXJzZV92YWwoc3RydWN0IHJlZ21hcCAqbWFwLCBjb25zdCB2b2lkICpidWYsCisJCQkJdW5zaWduZWQgaW50ICp2YWwpOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgcmVnbWFwX3JlZ19pbl9yYW5nZSh1bnNpZ25lZCBpbnQgcmVnLAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlICpyYW5nZSkKQEAgLTY5NSw2ICs3MTAsMTMgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcmVnbWFwX3BhcnNlX3ZhbChzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQl1bnNpZ25lZCBpbnQgKnZhbCkKK3sKKwlXQVJOX09OQ0UoMSwgInJlZ21hcCBBUEkgaXMgZGlzYWJsZWQiKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVnbWFwICpkZXZfZ2V0X3JlZ21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAppbmRleCA5MzcwZTY1Li5iYmUwM2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaApAQCAtMjI4LDEwICsyMjgsMTQgQEAKICAqICAgICAgICAgICAgICAgIG91dHB1dCB3aGVuIHVzaW5nIHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwCiAgKiBAZW5hYmxlX3JlZzogUmVnaXN0ZXIgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgZW5hYmxlL2Rpc2FibGUgb3BzCiAgKiBAZW5hYmxlX21hc2s6IE1hc2sgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgZW5hYmxlL2Rpc2FibGUgb3BzCisgKiBAZW5hYmxlX3ZhbDogRW5hYmxpbmcgdmFsdWUgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgZW5hYmxlL2Rpc2FibGUgb3BzCisgKiBAZGlzYWJsZV92YWw6IERpc2FibGluZyB2YWx1ZSBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBlbmFibGUvZGlzYWJsZSBvcHMKICAqIEBlbmFibGVfaXNfaW52ZXJ0ZWQ6IEEgZmxhZyB0byBpbmRpY2F0ZSBzZXQgZW5hYmxlX21hc2sgYml0cyB0byBkaXNhYmxlCiAgKiAgICAgICAgICAgICAgICAgICAgICB3aGVuIHVzaW5nIHJlZ3VsYXRvcl9lbmFibGVfcmVnbWFwIGFuZCBmcmllbmRzIEFQSXMuCiAgKiBAYnlwYXNzX3JlZzogUmVnaXN0ZXIgZm9yIGNvbnRyb2wgd2hlbiB1c2luZyByZWdtYXAgc2V0X2J5cGFzcwogICogQGJ5cGFzc19tYXNrOiBNYXNrIGZvciBjb250cm9sIHdoZW4gdXNpbmcgcmVnbWFwIHNldF9ieXBhc3MKKyAqIEBieXBhc3NfdmFsX29uOiBFbmFibGluZyB2YWx1ZSBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBzZXRfYnlwYXNzCisgKiBAYnlwYXNzX3ZhbF9vZmY6IERpc2FibGluZyB2YWx1ZSBmb3IgY29udHJvbCB3aGVuIHVzaW5nIHJlZ21hcCBzZXRfYnlwYXNzCiAgKgogICogQGVuYWJsZV90aW1lOiBUaW1lIHRha2VuIGZvciBpbml0aWFsIGVuYWJsZSBvZiByZWd1bGF0b3IgKGluIHVTKS4KICAqLwpAQCAtMjYzLDkgKzI2NywxMyBAQAogCXVuc2lnbmVkIGludCBhcHBseV9iaXQ7CiAJdW5zaWduZWQgaW50IGVuYWJsZV9yZWc7CiAJdW5zaWduZWQgaW50IGVuYWJsZV9tYXNrOworCXVuc2lnbmVkIGludCBlbmFibGVfdmFsOworCXVuc2lnbmVkIGludCBkaXNhYmxlX3ZhbDsKIAlib29sIGVuYWJsZV9pc19pbnZlcnRlZDsKIAl1bnNpZ25lZCBpbnQgYnlwYXNzX3JlZzsKIAl1bnNpZ25lZCBpbnQgYnlwYXNzX21hc2s7CisJdW5zaWduZWQgaW50IGJ5cGFzc192YWxfb247CisJdW5zaWduZWQgaW50IGJ5cGFzc192YWxfb2ZmOwogCiAJdW5zaWduZWQgaW50IGVuYWJsZV90aW1lOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL3BmdXplMTAwLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9wZnV6ZTEwMC5oCmluZGV4IDY1ZDU1MGIuLjM2NGY3YTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL3BmdXplMTAwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvcGZ1emUxMDAuaApAQCAtMzUsNiArMzUsMjAgQEAKICNkZWZpbmUgUEZVWkUxMDBfVkdFTjYJCTE0CiAjZGVmaW5lIFBGVVpFMTAwX01BWF9SRUdVTEFUT1IJMTUKIAorI2RlZmluZSBQRlVaRTIwMF9TVzFBQgkJMAorI2RlZmluZSBQRlVaRTIwMF9TVzIJCTEKKyNkZWZpbmUgUEZVWkUyMDBfU1czQQkJMgorI2RlZmluZSBQRlVaRTIwMF9TVzNCCQkzCisjZGVmaW5lIFBGVVpFMjAwX1NXQlNUCQk0CisjZGVmaW5lIFBGVVpFMjAwX1ZTTlZTCQk1CisjZGVmaW5lIFBGVVpFMjAwX1ZSRUZERFIJNgorI2RlZmluZSBQRlVaRTIwMF9WR0VOMQkJNworI2RlZmluZSBQRlVaRTIwMF9WR0VOMgkJOAorI2RlZmluZSBQRlVaRTIwMF9WR0VOMwkJOQorI2RlZmluZSBQRlVaRTIwMF9WR0VONAkJMTAKKyNkZWZpbmUgUEZVWkUyMDBfVkdFTjUJCTExCisjZGVmaW5lIFBGVVpFMjAwX1ZHRU42CQkxMgorCiBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YTsKIAogc3RydWN0IHBmdXplX3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggMWRhNjkzZC4uYjY2YzIxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTI1MCw4ICsyNTAsNyBAQAogCWludCAoKnJtYXBfb25lKShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKTsKIAlpbnQgKCpkb25lKShzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci0JaW50ICgqZmlsZV9ub25saW5lYXIpKHN0cnVjdCBwYWdlICosIHN0cnVjdCBhZGRyZXNzX3NwYWNlICosCi0JCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKwlpbnQgKCpmaWxlX25vbmxpbmVhcikoc3RydWN0IHBhZ2UgKiwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgdm9pZCAqYXJnKTsKIAlzdHJ1Y3QgYW5vbl92bWEgKigqYW5vbl9sb2NrKShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAJYm9vbCAoKmludmFsaWRfdm1hKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdm9pZCAqYXJnKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggYTc4MWRlYy4uN2NiMDdmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMyw2ICszLDggQEAKIAogI2luY2x1ZGUgPHVhcGkvbGludXgvc2NoZWQuaD4KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3ByaW8uaD4KKwogCiBzdHJ1Y3Qgc2NoZWRfcGFyYW0gewogCWludCBzY2hlZF9wcmlvcml0eTsKQEAgLTI3LDcgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY3B1dGltZS5oPgogCiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CkBAIC0yOTIsMTAgKzI5NCwxNCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFpfQ09NTU9OKQogZXh0ZXJuIHZvaWQgbm9oel9iYWxhbmNlX2VudGVyX2lkbGUoaW50IGNwdSk7CiBleHRlcm4gdm9pZCBzZXRfY3B1X3NkX3N0YXRlX2lkbGUodm9pZCk7Ci1leHRlcm4gaW50IGdldF9ub2h6X3RpbWVyX3RhcmdldCh2b2lkKTsKK2V4dGVybiBpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KGludCBwaW5uZWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBub2h6X2JhbGFuY2VfZW50ZXJfaWRsZShpbnQgY3B1KSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3B1X3NkX3N0YXRlX2lkbGUodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCBnZXRfbm9oel90aW1lcl90YXJnZXQoaW50IHBpbm5lZCkKK3sKKwlyZXR1cm4gc21wX3Byb2Nlc3Nvcl9pZCgpOworfQogI2VuZGlmCiAKIC8qCkBAIC0xMDc3LDYgKzEwODMsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAorCWludAkJCWRlcHRoOwogCXN0cnVjdCBzY2hlZF9lbnRpdHkJKnBhcmVudDsKIAkvKiBycSBvbiB3aGljaCB0aGlzIGVudGl0eSBpcyAodG8gYmUpIHF1ZXVlZDogKi8KIAlzdHJ1Y3QgY2ZzX3JxCQkqY2ZzX3JxOwpAQCAtMTQ2MCw2ICsxNDY3LDkgQEAKIAlzdHJ1Y3QgbXV0ZXggcGVyZl9ldmVudF9tdXRleDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBlcmZfZXZlbnRfbGlzdDsKICNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19QUkVFTVBUCisJdW5zaWduZWQgbG9uZyBwcmVlbXB0X2Rpc2FibGVfaXA7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfTlVNQQogCXN0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeTsJLyogUHJvdGVjdGVkIGJ5IGFsbG9jX2xvY2sgKi8KIAlzaG9ydCBpbF9uZXh0OwpAQCAtMTQ3MCw5ICsxNDgwLDEwIEBACiAJdW5zaWduZWQgaW50IG51bWFfc2Nhbl9wZXJpb2Q7CiAJdW5zaWduZWQgaW50IG51bWFfc2Nhbl9wZXJpb2RfbWF4OwogCWludCBudW1hX3ByZWZlcnJlZF9uaWQ7Ci0JaW50IG51bWFfbWlncmF0ZV9kZWZlcnJlZDsKIAl1bnNpZ25lZCBsb25nIG51bWFfbWlncmF0ZV9yZXRyeTsKIAl1NjQgbm9kZV9zdGFtcDsJCQkvKiBtaWdyYXRpb24gc3RhbXAgICovCisJdTY0IGxhc3RfdGFza19udW1hX3BsYWNlbWVudDsKKwl1NjQgbGFzdF9zdW1fZXhlY19ydW50aW1lOwogCXN0cnVjdCBjYWxsYmFja19oZWFkIG51bWFfd29yazsKIAogCXN0cnVjdCBsaXN0X2hlYWQgbnVtYV9lbnRyeTsKQEAgLTE0ODMsMTUgKzE0OTQsMjIgQEAKIAkgKiBTY2hlZHVsaW5nIHBsYWNlbWVudCBkZWNpc2lvbnMgYXJlIG1hZGUgYmFzZWQgb24gdGhlIHRoZXNlIGNvdW50cy4KIAkgKiBUaGUgdmFsdWVzIHJlbWFpbiBzdGF0aWMgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIFBURSBzY2FuCiAJICovCi0JdW5zaWduZWQgbG9uZyAqbnVtYV9mYXVsdHM7CisJdW5zaWduZWQgbG9uZyAqbnVtYV9mYXVsdHNfbWVtb3J5OwogCXVuc2lnbmVkIGxvbmcgdG90YWxfbnVtYV9mYXVsdHM7CiAKIAkvKgogCSAqIG51bWFfZmF1bHRzX2J1ZmZlciByZWNvcmRzIGZhdWx0cyBwZXIgbm9kZSBkdXJpbmcgdGhlIGN1cnJlbnQKLQkgKiBzY2FuIHdpbmRvdy4gV2hlbiB0aGUgc2NhbiBjb21wbGV0ZXMsIHRoZSBjb3VudHMgaW4gbnVtYV9mYXVsdHMKLQkgKiBkZWNheSBhbmQgdGhlc2UgdmFsdWVzIGFyZSBjb3BpZWQuCisJICogc2NhbiB3aW5kb3cuIFdoZW4gdGhlIHNjYW4gY29tcGxldGVzLCB0aGUgY291bnRzIGluCisJICogbnVtYV9mYXVsdHNfbWVtb3J5IGRlY2F5IGFuZCB0aGVzZSB2YWx1ZXMgYXJlIGNvcGllZC4KIAkgKi8KLQl1bnNpZ25lZCBsb25nICpudW1hX2ZhdWx0c19idWZmZXI7CisJdW5zaWduZWQgbG9uZyAqbnVtYV9mYXVsdHNfYnVmZmVyX21lbW9yeTsKKworCS8qCisJICogVHJhY2sgdGhlIG5vZGVzIHRoZSBwcm9jZXNzIHdhcyBydW5uaW5nIG9uIHdoZW4gYSBOVU1BIGhpbnRpbmcKKwkgKiBmYXVsdCB3YXMgaW5jdXJyZWQuCisJICovCisJdW5zaWduZWQgbG9uZyAqbnVtYV9mYXVsdHNfY3B1OworCXVuc2lnbmVkIGxvbmcgKm51bWFfZmF1bHRzX2J1ZmZlcl9jcHU7CiAKIAkvKgogCSAqIG51bWFfZmF1bHRzX2xvY2FsaXR5IHRyYWNrcyBpZiBmYXVsdHMgcmVjb3JkZWQgZHVyaW5nIHRoZSBsYXN0CkBAIC0xNTk2LDggKzE2MTQsOCBAQAogZXh0ZXJuIHBpZF90IHRhc2tfbnVtYV9ncm91cF9pZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIHZvaWQgc2V0X251bWFiYWxhbmNpbmdfc3RhdGUoYm9vbCBlbmFibGVkKTsKIGV4dGVybiB2b2lkIHRhc2tfbnVtYV9mcmVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX251bWFfYmFsYW5jaW5nX21pZ3JhdGVfZGVmZXJyZWQ7CitleHRlcm4gYm9vbCBzaG91bGRfbnVtYV9taWdyYXRlX21lbW9yeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQlpbnQgc3JjX25pZCwgaW50IGRzdF9jcHUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX251bWFfZmF1bHQoaW50IGxhc3Rfbm9kZSwgaW50IG5vZGUsIGludCBwYWdlcywKIAkJCQkgICBpbnQgZmxhZ3MpCkBAIC0xNjEzLDYgKzE2MzEsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX251bWFfZnJlZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiB9CitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX251bWFfbWlncmF0ZV9tZW1vcnkoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgc3JjX25pZCwgaW50IGRzdF9jcHUpCit7CisJcmV0dXJuIHRydWU7Cit9CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkICp0YXNrX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCkBAIC0yMDgwLDcgKzIxMDMsMTYgQEAKIGV4dGVybiBib29sIHlpZWxkX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgYm9vbCBwcmVlbXB0KTsKIGV4dGVybiB2b2lkIHNldF91c2VyX25pY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBsb25nIG5pY2UpOwogZXh0ZXJuIGludCB0YXNrX3ByaW8oY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKLWV4dGVybiBpbnQgdGFza19uaWNlKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisvKioKKyAqIHRhc2tfbmljZSAtIHJldHVybiB0aGUgbmljZSB2YWx1ZSBvZiBhIGdpdmVuIHRhc2suCisgKiBAcDogdGhlIHRhc2sgaW4gcXVlc3Rpb24uCisgKgorICogUmV0dXJuOiBUaGUgbmljZSB2YWx1ZSBbIC0yMCAuLi4gMCAuLi4gMTkgXS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGFza19uaWNlKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gUFJJT19UT19OSUNFKChwKS0+c3RhdGljX3ByaW8pOworfQogZXh0ZXJuIGludCBjYW5fbmljZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNvbnN0IGludCBuaWNlKTsKIGV4dGVybiBpbnQgdGFza19jdXJyKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gaW50IGlkbGVfY3B1KGludCBjcHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC9wcmlvLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3ByaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzMyMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9wcmlvLmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBfU0NIRURfUFJJT19ICisjZGVmaW5lIF9TQ0hFRF9QUklPX0gKKworI2RlZmluZSBNQVhfTklDRQkxOQorI2RlZmluZSBNSU5fTklDRQktMjAKKyNkZWZpbmUgTklDRV9XSURUSAkoTUFYX05JQ0UgLSBNSU5fTklDRSArIDEpCisKKy8qCisgKiBQcmlvcml0eSBvZiBhIHByb2Nlc3MgZ29lcyBmcm9tIDAuLk1BWF9QUklPLTEsIHZhbGlkIFJUCisgKiBwcmlvcml0eSBpcyAwLi5NQVhfUlRfUFJJTy0xLCBhbmQgU0NIRURfTk9STUFML1NDSEVEX0JBVENICisgKiB0YXNrcyBhcmUgaW4gdGhlIHJhbmdlIE1BWF9SVF9QUklPLi5NQVhfUFJJTy0xLiBQcmlvcml0eQorICogdmFsdWVzIGFyZSBpbnZlcnRlZDogbG93ZXIgcC0+cHJpbyB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkuCisgKgorICogVGhlIE1BWF9VU0VSX1JUX1BSSU8gdmFsdWUgYWxsb3dzIHRoZSBhY3R1YWwgbWF4aW11bQorICogUlQgcHJpb3JpdHkgdG8gYmUgc2VwYXJhdGUgZnJvbSB0aGUgdmFsdWUgZXhwb3J0ZWQgdG8KKyAqIHVzZXItc3BhY2UuICBUaGlzIGFsbG93cyBrZXJuZWwgdGhyZWFkcyB0byBzZXQgdGhlaXIKKyAqIHByaW9yaXR5IHRvIGEgdmFsdWUgaGlnaGVyIHRoYW4gYW55IHVzZXIgdGFzay4gTm90ZToKKyAqIE1BWF9SVF9QUklPIG11c3Qgbm90IGJlIHNtYWxsZXIgdGhhbiBNQVhfVVNFUl9SVF9QUklPLgorICovCisKKyNkZWZpbmUgTUFYX1VTRVJfUlRfUFJJTwkxMDAKKyNkZWZpbmUgTUFYX1JUX1BSSU8JCU1BWF9VU0VSX1JUX1BSSU8KKworI2RlZmluZSBNQVhfUFJJTwkJKE1BWF9SVF9QUklPICsgTklDRV9XSURUSCkKKyNkZWZpbmUgREVGQVVMVF9QUklPCQkoTUFYX1JUX1BSSU8gKyBOSUNFX1dJRFRIIC8gMikKKworLyoKKyAqIENvbnZlcnQgdXNlci1uaWNlIHZhbHVlcyBbIC0yMCAuLi4gMCAuLi4gMTkgXQorICogdG8gc3RhdGljIHByaW9yaXR5IFsgTUFYX1JUX1BSSU8uLk1BWF9QUklPLTEgXSwKKyAqIGFuZCBiYWNrLgorICovCisjZGVmaW5lIE5JQ0VfVE9fUFJJTyhuaWNlKQkoKG5pY2UpICsgREVGQVVMVF9QUklPKQorI2RlZmluZSBQUklPX1RPX05JQ0UocHJpbykJKChwcmlvKSAtIERFRkFVTFRfUFJJTykKKworLyoKKyAqICdVc2VyIHByaW9yaXR5JyBpcyB0aGUgbmljZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gc29tZXRoaW5nIHdlCisgKiBjYW4gd29yayB3aXRoIGJldHRlciB3aGVuIHNjYWxpbmcgdmFyaW91cyBzY2hlZHVsZXIgcGFyYW1ldGVycywKKyAqIGl0J3MgYSBbIDAgLi4uIDM5IF0gcmFuZ2UuCisgKi8KKyNkZWZpbmUgVVNFUl9QUklPKHApCQkoKHApLU1BWF9SVF9QUklPKQorI2RlZmluZSBUQVNLX1VTRVJfUFJJTyhwKQlVU0VSX1BSSU8oKHApLT5zdGF0aWNfcHJpbykKKyNkZWZpbmUgTUFYX1VTRVJfUFJJTwkJKFVTRVJfUFJJTyhNQVhfUFJJTykpCisKKyNlbmRpZiAvKiBfU0NIRURfUFJJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3J0LmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3J0LmgKaW5kZXggMzRlNGViZS4uNjM0MWY1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQvcnQuaApAQCAtMSwyNCArMSw3IEBACiAjaWZuZGVmIF9TQ0hFRF9SVF9ICiAjZGVmaW5lIF9TQ0hFRF9SVF9ICiAKLS8qCi0gKiBQcmlvcml0eSBvZiBhIHByb2Nlc3MgZ29lcyBmcm9tIDAuLk1BWF9QUklPLTEsIHZhbGlkIFJUCi0gKiBwcmlvcml0eSBpcyAwLi5NQVhfUlRfUFJJTy0xLCBhbmQgU0NIRURfTk9STUFML1NDSEVEX0JBVENICi0gKiB0YXNrcyBhcmUgaW4gdGhlIHJhbmdlIE1BWF9SVF9QUklPLi5NQVhfUFJJTy0xLiBQcmlvcml0eQotICogdmFsdWVzIGFyZSBpbnZlcnRlZDogbG93ZXIgcC0+cHJpbyB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkuCi0gKgotICogVGhlIE1BWF9VU0VSX1JUX1BSSU8gdmFsdWUgYWxsb3dzIHRoZSBhY3R1YWwgbWF4aW11bQotICogUlQgcHJpb3JpdHkgdG8gYmUgc2VwYXJhdGUgZnJvbSB0aGUgdmFsdWUgZXhwb3J0ZWQgdG8KLSAqIHVzZXItc3BhY2UuICBUaGlzIGFsbG93cyBrZXJuZWwgdGhyZWFkcyB0byBzZXQgdGhlaXIKLSAqIHByaW9yaXR5IHRvIGEgdmFsdWUgaGlnaGVyIHRoYW4gYW55IHVzZXIgdGFzay4gTm90ZToKLSAqIE1BWF9SVF9QUklPIG11c3Qgbm90IGJlIHNtYWxsZXIgdGhhbiBNQVhfVVNFUl9SVF9QUklPLgotICovCi0KLSNkZWZpbmUgTUFYX1VTRVJfUlRfUFJJTwkxMDAKLSNkZWZpbmUgTUFYX1JUX1BSSU8JCU1BWF9VU0VSX1JUX1BSSU8KLQotI2RlZmluZSBNQVhfUFJJTwkJKE1BWF9SVF9QUklPICsgNDApCi0jZGVmaW5lIERFRkFVTFRfUFJJTwkJKE1BWF9SVF9QUklPICsgMjApCisjaW5jbHVkZSA8bGludXgvc2NoZWQvcHJpby5oPgogCiBzdGF0aWMgaW5saW5lIGludCBydF9wcmlvKGludCBwcmlvKQogewpAQCAtMzUsNiArMTgsNyBAQAogI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCiBleHRlcm4gaW50IHJ0X211dGV4X2dldHByaW8oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIGV4dGVybiB2b2lkIHJ0X211dGV4X3NldHByaW8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcHJpbyk7CitleHRlcm4gaW50IHJ0X211dGV4X2NoZWNrX3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgbmV3cHJpbyk7CiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpydF9tdXRleF9nZXRfdG9wX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIGV4dGVybiB2b2lkIHJ0X211dGV4X2FkanVzdF9waShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogc3RhdGljIGlubGluZSBib29sIHRza19pc19waV9ibG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQpAQCAtNDYsNiArMzAsMTIgQEAKIHsKIAlyZXR1cm4gcC0+bm9ybWFsX3ByaW87CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0X211dGV4X2NoZWNrX3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgbmV3cHJpbykKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJ0X211dGV4X2dldF90b3BfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmggYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKaW5kZXggNTYyM2E3Zi4uMmZjNDJkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMTA0MCw2ICsxMDQwLDcgQEAKICAqCUFsbG9jYXRlIGEgc2VjdXJpdHkgc3RydWN0dXJlIHRvIHRoZSB4cC0+c2VjdXJpdHkgZmllbGQ7IHRoZSBzZWN1cml0eQogICoJZmllbGQgaXMgaW5pdGlhbGl6ZWQgdG8gTlVMTCB3aGVuIHRoZSB4ZnJtX3BvbGljeSBpcyBhbGxvY2F0ZWQuCiAgKglSZXR1cm4gMCBpZiBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKG1lbW9yeSB0byBhbGxvY2F0ZSwgbGVnYWwgY29udGV4dCkKKyAqCUBnZnAgaXMgdG8gc3BlY2lmeSB0aGUgY29udGV4dCBmb3IgdGhlIGFsbG9jYXRpb24KICAqIEB4ZnJtX3BvbGljeV9jbG9uZV9zZWN1cml0eToKICAqCUBvbGRfY3R4IGNvbnRhaW5zIGFuIGV4aXN0aW5nIHhmcm1fc2VjX2N0eC4KICAqCUBuZXdfY3R4cCBjb250YWlucyBhIG5ldyB4ZnJtX3NlY19jdHggYmVpbmcgY2xvbmVkIGZyb20gb2xkLgpAQCAtMTY4Myw3ICsxNjg0LDcgQEAKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0KIAlpbnQgKCp4ZnJtX3BvbGljeV9hbGxvY19zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAotCQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KTsKKwkJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgZ2ZwX3QgZ2ZwKTsKIAlpbnQgKCp4ZnJtX3BvbGljeV9jbG9uZV9zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3NlY19jdHggKm9sZF9jdHgsIHN0cnVjdCB4ZnJtX3NlY19jdHggKipuZXdfY3R4KTsKIAl2b2lkICgqeGZybV9wb2xpY3lfZnJlZV9zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eCk7CiAJaW50ICgqeGZybV9wb2xpY3lfZGVsZXRlX3NlY3VyaXR5KSAoc3RydWN0IHhmcm1fc2VjX2N0eCAqY3R4KTsKQEAgLTI4NTksNyArMjg2MCw4IEBACiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiAKLWludCBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqY3R4cCwgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KTsKK2ludCBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqY3R4cCwKKwkJCSAgICAgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgsIGdmcF90IGdmcCk7CiBpbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfY2xvbmUoc3RydWN0IHhmcm1fc2VjX2N0eCAqb2xkX2N0eCwgc3RydWN0IHhmcm1fc2VjX2N0eCAqKm5ld19jdHhwKTsKIHZvaWQgc2VjdXJpdHlfeGZybV9wb2xpY3lfZnJlZShzdHJ1Y3QgeGZybV9zZWNfY3R4ICpjdHgpOwogaW50IHNlY3VyaXR5X3hmcm1fcG9saWN5X2RlbGV0ZShzdHJ1Y3QgeGZybV9zZWNfY3R4ICpjdHgpOwpAQCAtMjg3Nyw3ICsyODc5LDkgQEAKIAogI2Vsc2UJLyogQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTSAqLwogCi1zdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqY3R4cCwgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KQorc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2Moc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsCisJCQkJCSAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LAorCQkJCQkgICAgIGdmcF90IGdmcCkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2JjbTYzeHguaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2JjbTYzeHguaAppbmRleCA1NzBlOTY0Li5hODBhYTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9iY202M3h4LmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfYmNtNjN4eC5oCkBAIC0xMTYsNCArMTE2LDYgQEAKIAkJCQkJVUFSVF9GSUZPX1BBUkVSUl9NQVNLIHwJCVwKIAkJCQkJVUFSVF9GSUZPX0JSS0RFVF9NQVNLKQogCisjZGVmaW5lIFVBUlRfUkVHX1NJWkUJCQkyNAorCiAjZW5kaWYgLyogX0xJTlVYX1NFUklBTF9CQ002M1hYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKaW5kZXggMjJiMzY0MC4uNmM1ZTNiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKQEAgLTEwLDQ1ICsxMCw1OSBAQAogCiAjZGVmaW5lIFNDSXhfTk9UX1NVUFBPUlRFRAkoLTEpCiAKLSNkZWZpbmUgU0NTQ1JfVElFCSgxIDw8IDcpCi0jZGVmaW5lIFNDU0NSX1JJRQkoMSA8PCA2KQotI2RlZmluZSBTQ1NDUl9URQkoMSA8PCA1KQotI2RlZmluZSBTQ1NDUl9SRQkoMSA8PCA0KQotI2RlZmluZSBTQ1NDUl9SRUlFCSgxIDw8IDMpCS8qIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHBhcnRzICovCi0jZGVmaW5lIFNDU0NSX1RPSUUJKDEgPDwgMikJLyogbm90IHN1cHBvcnRlZCBieSBhbGwgcGFydHMgKi8KLSNkZWZpbmUgU0NTQ1JfQ0tFMQkoMSA8PCAxKQotI2RlZmluZSBTQ1NDUl9DS0UwCSgxIDw8IDApCisvKiBTQ1NNUiAoU2VyaWFsIE1vZGUgUmVnaXN0ZXIpICovCisjZGVmaW5lIFNDU01SX0NIUgkoMSA8PCA2KQkvKiA3LWJpdCBDaGFyYWN0ZXIgTGVuZ3RoICovCisjZGVmaW5lIFNDU01SX1BFCSgxIDw8IDUpCS8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUgU0NTTVJfT0RECSgxIDw8IDQpCS8qIE9kZCBQYXJpdHkgKi8KKyNkZWZpbmUgU0NTTVJfU1RPUAkoMSA8PCAzKQkvKiBTdG9wIEJpdCBMZW5ndGggKi8KKyNkZWZpbmUgU0NTTVJfQ0tTCTB4MDAwMwkJLyogQ2xvY2sgU2VsZWN0ICovCiAKLS8qIFNDeFNSIFNDSSAqLwotI2RlZmluZSBTQ0lfVERSRSAgMHg4MAotI2RlZmluZSBTQ0lfUkRSRiAgMHg0MAotI2RlZmluZSBTQ0lfT1JFUiAgMHgyMAotI2RlZmluZSBTQ0lfRkVSICAgMHgxMAotI2RlZmluZSBTQ0lfUEVSICAgMHgwOAotI2RlZmluZSBTQ0lfVEVORCAgMHgwNAorLyogU2VyaWFsIENvbnRyb2wgUmVnaXN0ZXIgKEAgPSBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBwYXJ0cykgKi8KKyNkZWZpbmUgU0NTQ1JfVElFCSgxIDw8IDcpCS8qIFRyYW5zbWl0IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU0NTQ1JfUklFCSgxIDw8IDYpCS8qIFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBTQ1NDUl9URQkoMSA8PCA1KQkvKiBUcmFuc21pdCBFbmFibGUgKi8KKyNkZWZpbmUgU0NTQ1JfUkUJKDEgPDwgNCkJLyogUmVjZWl2ZSBFbmFibGUgKi8KKyNkZWZpbmUgU0NTQ1JfUkVJRQkoMSA8PCAzKQkvKiBSZWNlaXZlIEVycm9yIEludGVycnVwdCBFbmFibGUgQCAqLworI2RlZmluZSBTQ1NDUl9UT0lFCSgxIDw8IDIpCS8qIFRpbWVvdXQgSW50ZXJydXB0IEVuYWJsZSBAICovCisjZGVmaW5lIFNDU0NSX0NLRTEJKDEgPDwgMSkJLyogQ2xvY2sgRW5hYmxlIDEgKi8KKyNkZWZpbmUgU0NTQ1JfQ0tFMAkoMSA8PCAwKQkvKiBDbG9jayBFbmFibGUgMCAqLworLyogU0NJRkEvU0NJRkIgb25seSAqLworI2RlZmluZSBTQ1NDUl9URFJRRQkoMSA8PCAxNSkJLyogVHggRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IEVuYWJsZSAqLworI2RlZmluZSBTQ1NDUl9SRFJRRQkoMSA8PCAxNCkJLyogUnggRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IEVuYWJsZSAqLworCisvKiBTQ3hTUiAoU2VyaWFsIFN0YXR1cyBSZWdpc3Rlcikgb24gU0NJICovCisjZGVmaW5lIFNDSV9URFJFICAweDgwCQkJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSAqLworI2RlZmluZSBTQ0lfUkRSRiAgMHg0MAkJCS8qIFJlY2VpdmUgRGF0YSBSZWdpc3RlciBGdWxsICovCisjZGVmaW5lIFNDSV9PUkVSICAweDIwCQkJLyogT3ZlcnJ1biBFcnJvciAqLworI2RlZmluZSBTQ0lfRkVSICAgMHgxMAkJCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUgU0NJX1BFUiAgIDB4MDgJCQkvKiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgU0NJX1RFTkQgIDB4MDQJCQkvKiBUcmFuc21pdCBFbmQgKi8KIAogI2RlZmluZSBTQ0lfREVGQVVMVF9FUlJPUl9NQVNLIChTQ0lfUEVSIHwgU0NJX0ZFUikKIAotLyogU0N4U1IgU0NJRiwgSFNDSUYgKi8KLSNkZWZpbmUgU0NJRl9FUiAgICAweDAwODAKLSNkZWZpbmUgU0NJRl9URU5EICAweDAwNDAKLSNkZWZpbmUgU0NJRl9UREZFICAweDAwMjAKLSNkZWZpbmUgU0NJRl9CUksgICAweDAwMTAKLSNkZWZpbmUgU0NJRl9GRVIgICAweDAwMDgKLSNkZWZpbmUgU0NJRl9QRVIgICAweDAwMDQKLSNkZWZpbmUgU0NJRl9SREYgICAweDAwMDIKLSNkZWZpbmUgU0NJRl9EUiAgICAweDAwMDEKKy8qIFNDeFNSIChTZXJpYWwgU3RhdHVzIFJlZ2lzdGVyKSBvbiBTQ0lGLCBIU0NJRiAqLworI2RlZmluZSBTQ0lGX0VSICAgIDB4MDA4MAkJLyogUmVjZWl2ZSBFcnJvciAqLworI2RlZmluZSBTQ0lGX1RFTkQgIDB4MDA0MAkJLyogVHJhbnNtaXNzaW9uIEVuZCAqLworI2RlZmluZSBTQ0lGX1RERkUgIDB4MDAyMAkJLyogVHJhbnNtaXQgRklGTyBEYXRhIEVtcHR5ICovCisjZGVmaW5lIFNDSUZfQlJLICAgMHgwMDEwCQkvKiBCcmVhayBEZXRlY3QgKi8KKyNkZWZpbmUgU0NJRl9GRVIgICAweDAwMDgJCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUgU0NJRl9QRVIgICAweDAwMDQJCS8qIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBTQ0lGX1JERiAgIDB4MDAwMgkJLyogUmVjZWl2ZSBGSUZPIERhdGEgRnVsbCAqLworI2RlZmluZSBTQ0lGX0RSICAgIDB4MDAwMQkJLyogUmVjZWl2ZSBEYXRhIFJlYWR5ICovCiAKICNkZWZpbmUgU0NJRl9ERUZBVUxUX0VSUk9SX01BU0sgKFNDSUZfUEVSIHwgU0NJRl9GRVIgfCBTQ0lGX0VSIHwgU0NJRl9CUkspCiAKLS8qIFNDU1BUUiwgb3B0aW9uYWwgKi8KLSNkZWZpbmUgU0NTUFRSX1JUU0lPCSgxIDw8IDcpCi0jZGVmaW5lIFNDU1BUUl9DVFNJTwkoMSA8PCA1KQotI2RlZmluZSBTQ1NQVFJfU1BCMklPCSgxIDw8IDEpCi0jZGVmaW5lIFNDU1BUUl9TUEIyRFQJKDEgPDwgMCkKKy8qIFNDRkNSIChGSUZPIENvbnRyb2wgUmVnaXN0ZXIpICovCisjZGVmaW5lIFNDRkNSX0xPT1AJKDEgPDwgMCkJLyogTG9vcGJhY2sgVGVzdCAqLworCisvKiBTQ1NQVFIgKFNlcmlhbCBQb3J0IFJlZ2lzdGVyKSwgb3B0aW9uYWwgKi8KKyNkZWZpbmUgU0NTUFRSX1JUU0lPCSgxIDw8IDcpCS8qIFNlcmlhbCBQb3J0IFJUUyBQaW4gSW5wdXQvT3V0cHV0ICovCisjZGVmaW5lIFNDU1BUUl9DVFNJTwkoMSA8PCA1KQkvKiBTZXJpYWwgUG9ydCBDVFMgUGluIElucHV0L091dHB1dCAqLworI2RlZmluZSBTQ1NQVFJfU1BCMklPCSgxIDw8IDEpCS8qIFNlcmlhbCBQb3J0IEJyZWFrIElucHV0L091dHB1dCAqLworI2RlZmluZSBTQ1NQVFJfU1BCMkRUCSgxIDw8IDApCS8qIFNlcmlhbCBQb3J0IEJyZWFrIERhdGEgKi8KIAogLyogSFNTUlIgSFNDSUYgKi8KLSNkZWZpbmUgSFNDSUZfU1JFCTB4ODAwMAorI2RlZmluZSBIU0NJRl9TUkUJMHg4MDAwCQkvKiBTYW1wbGluZyBSYXRlIFJlZ2lzdGVyIEVuYWJsZSAqLwogCiBlbnVtIHsKIAlTQ0l4X1BST0JFX1JFR1RZUEUsCkBAIC03MywxMCArODcsMTkgQEAKICAqIE5vdCBhbGwgcmVnaXN0ZXJzIHdpbGwgZXhpc3Qgb24gYWxsIHBhcnRzLgogICovCiBlbnVtIHsKLQlTQ1NNUiwgU0NCUlIsIFNDU0NSLCBTQ3hTUiwKLQlTQ0ZDUiwgU0NGRFIsIFNDeFREUiwgU0N4UkRSLAotCVNDTFNSLCBTQ1RGRFIsIFNDUkZEUiwgU0NTUFRSLAotCUhTU1JSLAorCVNDU01SLAkJCQkvKiBTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworCVNDQlJSLAkJCQkvKiBCaXQgUmF0ZSBSZWdpc3RlciAqLworCVNDU0NSLAkJCQkvKiBTZXJpYWwgQ29udHJvbCBSZWdpc3RlciAqLworCVNDeFNSLAkJCQkvKiBTZXJpYWwgU3RhdHVzIFJlZ2lzdGVyICovCisJU0NGQ1IsCQkJCS8qIEZJRk8gQ29udHJvbCBSZWdpc3RlciAqLworCVNDRkRSLAkJCQkvKiBGSUZPIERhdGEgQ291bnQgUmVnaXN0ZXIgKi8KKwlTQ3hURFIsCQkJCS8qIFRyYW5zbWl0IChGSUZPKSBEYXRhIFJlZ2lzdGVyICovCisJU0N4UkRSLAkJCQkvKiBSZWNlaXZlIChGSUZPKSBEYXRhIFJlZ2lzdGVyICovCisJU0NMU1IsCQkJCS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCisJU0NURkRSLAkJCQkvKiBUcmFuc21pdCBGSUZPIERhdGEgQ291bnQgUmVnaXN0ZXIgKi8KKwlTQ1JGRFIsCQkJCS8qIFJlY2VpdmUgRklGTyBEYXRhIENvdW50IFJlZ2lzdGVyICovCisJU0NTUFRSLAkJCQkvKiBTZXJpYWwgUG9ydCBSZWdpc3RlciAqLworCUhTU1JSLAkJCQkvKiBTYW1wbGluZyBSYXRlIFJlZ2lzdGVyICovCiAKIAlTQ0l4X05SX1JFR1MsCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNWUxZTZmMi4uMTVlZGU2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC0yNDUxLDggKzI0NTEsOCBAQAogCQkgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKIHZvaWQgc2tiX2NvcHlfYW5kX2NzdW1fZGV2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHU4ICp0byk7CiB1bnNpZ25lZCBpbnQgc2tiX3plcm9jb3B5X2hlYWRsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKmZyb20pOwotdm9pZCBza2JfemVyb2NvcHkoc3RydWN0IHNrX2J1ZmYgKnRvLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSwKLQkJICBpbnQgbGVuLCBpbnQgaGxlbik7CitpbnQgc2tiX3plcm9jb3B5KHN0cnVjdCBza19idWZmICp0bywgc3RydWN0IHNrX2J1ZmYgKmZyb20sCisJCSBpbnQgbGVuLCBpbnQgaGxlbik7CiB2b2lkIHNrYl9zcGxpdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSwgY29uc3QgdTMyIGxlbik7CiBpbnQgc2tiX3NoaWZ0KHN0cnVjdCBza19idWZmICp0Z3QsIHN0cnVjdCBza19idWZmICpza2IsIGludCBzaGlmdGxlbik7CiB2b2lkIHNrYl9zY3J1Yl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB4bmV0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21wLmggYi9pbmNsdWRlL2xpbnV4L3NtcC5oCmluZGV4IDZhZTAwNGUuLjYzM2Y1ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXAuaApAQCAtMTcsMTAgKzE3LDcgQEAKIAogdHlwZWRlZiB2b2lkICgqc21wX2NhbGxfZnVuY190KSh2b2lkICppbmZvKTsKIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQkJc3RydWN0IGxsaXN0X25vZGUgbGxpc3Q7Ci0JfTsKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSBsbGlzdDsKIAlzbXBfY2FsbF9mdW5jX3QgZnVuYzsKIAl2b2lkICppbmZvOwogCXUxNiBmbGFnczsKQEAgLTUzLDggKzUwLDcgQEAKIAkJc21wX2NhbGxfZnVuY190IGZ1bmMsIHZvaWQgKmluZm8sIGJvb2wgd2FpdCwKIAkJZ2ZwX3QgZ2ZwX2ZsYWdzKTsKIAotdm9pZCBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1aWQsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpkYXRhLAotCQkJCWludCB3YWl0KTsKK2ludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoaW50IGNwdSwgc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCk7CiAKICNpZmRlZiBDT05GSUdfU01QCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKaW5kZXggNDIwM2M2Ni4uMzZjODZlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKQEAgLTI0LDYgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCitzdHJ1Y3QgZG1hX2NoYW47CiAKIC8qCiAgKiBJTlRFUkZBQ0VTIGJldHdlZW4gU1BJIG1hc3Rlci1zaWRlIGRyaXZlcnMgYW5kIFNQSSBpbmZyYXN0cnVjdHVyZS4KQEAgLTI2Niw2ICsyNjksNyBAQAogICogQGF1dG9fcnVudGltZV9wbTogdGhlIGNvcmUgc2hvdWxkIGVuc3VyZSBhIHJ1bnRpbWUgUE0gcmVmZXJlbmNlIGlzIGhlbGQKICAqICAgICAgICAgICAgICAgICAgIHdoaWxlIHRoZSBoYXJkd2FyZSBpcyBwcmVwYXJlZCwgdXNpbmcgdGhlIHBhcmVudAogICogICAgICAgICAgICAgICAgICAgZGV2aWNlIGZvciB0aGUgc3BpZGV2CisgKiBAbWF4X2RtYV9sZW46IE1heGltdW0gbGVuZ3RoIG9mIGEgRE1BIHRyYW5zZmVyIGZvciB0aGUgZGV2aWNlLgogICogQHByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmU6IGEgbWVzc2FnZSB3aWxsIHNvb24gYXJyaXZlIGZyb20gdGhlIHF1ZXVlCiAgKglzbyB0aGUgc3Vic3lzdGVtIHJlcXVlc3RzIHRoZSBkcml2ZXIgdG8gcHJlcGFyZSB0aGUgdHJhbnNmZXIgaGFyZHdhcmUKICAqCWJ5IGlzc3VpbmcgdGhpcyBjYWxsCkBAIC0zNDgsNiArMzUyLDggQEAKICNkZWZpbmUgU1BJX01BU1RFUl9IQUxGX0RVUExFWAlCSVQoMCkJCS8qIGNhbid0IGRvIGZ1bGwgZHVwbGV4ICovCiAjZGVmaW5lIFNQSV9NQVNURVJfTk9fUlgJQklUKDEpCQkvKiBjYW4ndCBkbyBidWZmZXIgcmVhZCAqLwogI2RlZmluZSBTUElfTUFTVEVSX05PX1RYCUJJVCgyKQkJLyogY2FuJ3QgZG8gYnVmZmVyIHdyaXRlICovCisjZGVmaW5lIFNQSV9NQVNURVJfTVVTVF9SWCAgICAgIEJJVCgzKQkJLyogcmVxdWlyZXMgcnggKi8KKyNkZWZpbmUgU1BJX01BU1RFUl9NVVNUX1RYICAgICAgQklUKDQpCQkvKiByZXF1aXJlcyB0eCAqLwogCiAJLyogbG9jayBhbmQgbXV0ZXggZm9yIFNQSSBidXMgbG9ja2luZyAqLwogCXNwaW5sb2NrX3QJCWJ1c19sb2NrX3NwaW5sb2NrOwpAQCAtMzkwLDYgKzM5NiwxNyBAQAogCXZvaWQJCQkoKmNsZWFudXApKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOwogCiAJLyoKKwkgKiBVc2VkIHRvIGVuYWJsZSBjb3JlIHN1cHBvcnQgZm9yIERNQSBoYW5kbGluZywgaWYgY2FuX2RtYSgpCisJICogZXhpc3RzIGFuZCByZXR1cm5zIHRydWUgdGhlbiB0aGUgdHJhbnNmZXIgd2lsbCBiZSBtYXBwZWQKKwkgKiBwcmlvciB0byB0cmFuc2Zlcl9vbmUoKSBiZWluZyBjYWxsZWQuICBUaGUgZHJpdmVyIHNob3VsZAorCSAqIG5vdCBtb2RpZnkgb3Igc3RvcmUgeGZlciBhbmQgZG1hX3R4IGFuZCBkbWFfcnggbXVzdCBiZSBzZXQKKwkgKiB3aGlsZSB0aGUgZGV2aWNlIGlzIHByZXBhcmVkLgorCSAqLworCWJvb2wJCQkoKmNhbl9kbWEpKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJCSAgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpOworCisJLyoKIAkgKiBUaGVzZSBob29rcyBhcmUgZm9yIGRyaXZlcnMgdGhhdCB3YW50IHRvIHVzZSB0aGUgZ2VuZXJpYwogCSAqIG1hc3RlciB0cmFuc2ZlciBxdWV1ZWluZyBtZWNoYW5pc20uIElmIHRoZXNlIGFyZSB1c2VkLCB0aGUKIAkgKiB0cmFuc2ZlcigpIGZ1bmN0aW9uIGFib3ZlIG11c3QgTk9UIGJlIHNwZWNpZmllZCBieSB0aGUgZHJpdmVyLgpAQCAtNDA3LDcgKzQyNCw5IEBACiAJYm9vbAkJCQlydDsKIAlib29sCQkJCWF1dG9fcnVudGltZV9wbTsKIAlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9tc2dfcHJlcGFyZWQ7CisJYm9vbAkJCQljdXJfbXNnX21hcHBlZDsKIAlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgICAgIHhmZXJfY29tcGxldGlvbjsKKwlzaXplX3QJCQkJbWF4X2RtYV9sZW47CiAKIAlpbnQgKCpwcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlKShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKTsKIAlpbnQgKCp0cmFuc2Zlcl9vbmVfbWVzc2FnZSkoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKQEAgLTQyOCw2ICs0NDcsMTQgQEAKIAogCS8qIGdwaW8gY2hpcCBzZWxlY3QgKi8KIAlpbnQJCQkqY3NfZ3Bpb3M7CisKKwkvKiBETUEgY2hhbm5lbHMgZm9yIHVzZSB3aXRoIGNvcmUgZG1hZW5naW5lIGhlbHBlcnMgKi8KKwlzdHJ1Y3QgZG1hX2NoYW4JCSpkbWFfdHg7CisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3J4OworCisJLyogZHVtbXkgZGF0YSBmb3IgZnVsbCBkdXBsZXggZGV2aWNlcyAqLworCXZvaWQJCQkqZHVtbXlfcng7CisJdm9pZAkJCSpkdW1teV90eDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQpAQCAtNTEyLDYgKzUzOSw4IEBACiAgKgkob3B0aW9uYWxseSkgY2hhbmdpbmcgdGhlIGNoaXBzZWxlY3Qgc3RhdHVzLCB0aGVuIHN0YXJ0aW5nCiAgKgl0aGUgbmV4dCB0cmFuc2ZlciBvciBjb21wbGV0aW5nIHRoaXMgQHNwaV9tZXNzYWdlLgogICogQHRyYW5zZmVyX2xpc3Q6IHRyYW5zZmVycyBhcmUgc2VxdWVuY2VkIHRocm91Z2ggQHNwaV9tZXNzYWdlLnRyYW5zZmVycworICogQHR4X3NnOiBTY2F0dGVybGlzdCBmb3IgdHJhbnNtaXQsIGN1cnJlbnRseSBub3QgZm9yIGNsaWVudCB1c2UKKyAqIEByeF9zZzogU2NhdHRlcmxpc3QgZm9yIHJlY2VpdmUsIGN1cnJlbnRseSBub3QgZm9yIGNsaWVudCB1c2UKICAqCiAgKiBTUEkgdHJhbnNmZXJzIGFsd2F5cyB3cml0ZSB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMgYXMgdGhleSByZWFkLgogICogUHJvdG9jb2wgZHJpdmVycyBzaG91bGQgYWx3YXlzIHByb3ZpZGUgQHJ4X2J1ZiBhbmQvb3IgQHR4X2J1Zi4KQEAgLTU3OSw2ICs2MDgsOCBAQAogCiAJZG1hX2FkZHJfdAl0eF9kbWE7CiAJZG1hX2FkZHJfdAlyeF9kbWE7CisJc3RydWN0IHNnX3RhYmxlIHR4X3NnOworCXN0cnVjdCBzZ190YWJsZSByeF9zZzsKIAogCXVuc2lnbmVkCWNzX2NoYW5nZToxOwogCXVuc2lnbmVkCXR4X25iaXRzOjM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAppbmRleCBkYWViYWJhLi44NTU3OGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKQEAgLTQyLDYgKzQyLDYgQEAKIAogLyogc3RhcnQgb3Igc3RvcCBxdWV1ZSBwcm9jZXNzaW5nICovCiBleHRlcm4gaW50IHNwaV9iaXRiYW5nX3N0YXJ0KHN0cnVjdCBzcGlfYml0YmFuZyAqc3BpKTsKLWV4dGVybiBpbnQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKnNwaSk7CitleHRlcm4gdm9pZCBzcGlfYml0YmFuZ19zdG9wKHN0cnVjdCBzcGlfYml0YmFuZyAqc3BpKTsKIAogI2VuZGlmCS8qIF9fU1BJX0JJVEJBTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcG1pLmggYi9pbmNsdWRlL2xpbnV4L3NwbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY1ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcG1pLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9MSU5VWF9TUE1JX0gKKyNkZWZpbmUgX0xJTlVYX1NQTUlfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKworLyogTWF4aW11bSBzbGF2ZSBpZGVudGlmaWVyICovCisjZGVmaW5lIFNQTUlfTUFYX1NMQVZFX0lECQkxNgorCisvKiBTUE1JIENvbW1hbmRzICovCisjZGVmaW5lIFNQTUlfQ01EX0VYVF9XUklURQkJMHgwMAorI2RlZmluZSBTUE1JX0NNRF9SRVNFVAkJCTB4MTAKKyNkZWZpbmUgU1BNSV9DTURfU0xFRVAJCQkweDExCisjZGVmaW5lIFNQTUlfQ01EX1NIVVRET1dOCQkweDEyCisjZGVmaW5lIFNQTUlfQ01EX1dBS0VVUAkJCTB4MTMKKyNkZWZpbmUgU1BNSV9DTURfQVVUSEVOVElDQVRFCQkweDE0CisjZGVmaW5lIFNQTUlfQ01EX01TVFJfUkVBRAkJMHgxNQorI2RlZmluZSBTUE1JX0NNRF9NU1RSX1dSSVRFCQkweDE2CisjZGVmaW5lIFNQTUlfQ01EX1RSQU5TRkVSX0JVU19PV05FUlNISVAJMHgxQQorI2RlZmluZSBTUE1JX0NNRF9EREJfTUFTVEVSX1JFQUQJMHgxQgorI2RlZmluZSBTUE1JX0NNRF9EREJfU0xBVkVfUkVBRAkJMHgxQworI2RlZmluZSBTUE1JX0NNRF9FWFRfUkVBRAkJMHgyMAorI2RlZmluZSBTUE1JX0NNRF9FWFRfV1JJVEVMCQkweDMwCisjZGVmaW5lIFNQTUlfQ01EX0VYVF9SRUFETAkJMHgzOAorI2RlZmluZSBTUE1JX0NNRF9XUklURQkJCTB4NDAKKyNkZWZpbmUgU1BNSV9DTURfUkVBRAkJCTB4NjAKKyNkZWZpbmUgU1BNSV9DTURfWkVST19XUklURQkJMHg4MAorCisvKioKKyAqIHN0cnVjdCBzcG1pX2RldmljZSAtIEJhc2ljIHJlcHJlc2VudGF0aW9uIG9mIGFuIFNQTUkgZGV2aWNlCisgKiBAZGV2OglEcml2ZXIgbW9kZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZS4KKyAqIEBjdHJsOglTUE1JIGNvbnRyb2xsZXIgbWFuYWdpbmcgdGhlIGJ1cyBob3N0aW5nIHRoaXMgZGV2aWNlLgorICogQHVzaWQ6CVRoaXMgZGV2aWNlcycgVW5pcXVlIFNsYXZlIElEZW50aWZpZXIuCisgKi8KK3N0cnVjdCBzcG1pX2RldmljZSB7CisJc3RydWN0IGRldmljZQkJZGV2OworCXN0cnVjdCBzcG1pX2NvbnRyb2xsZXIJKmN0cmw7CisJdTgJCQl1c2lkOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnRvX3NwbWlfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc3BtaV9kZXZpY2UsIGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3BtaV9kZXZpY2VfZ2V0X2RydmRhdGEoY29uc3Qgc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoJnNkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcG1pX2RldmljZV9zZXRfZHJ2ZGF0YShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZzZGV2LT5kZXYsIGRhdGEpOworfQorCitzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNwbWlfZGV2aWNlX2FsbG9jKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3BtaV9kZXZpY2VfcHV0KHN0cnVjdCBzcG1pX2RldmljZSAqc2RldikKK3sKKwlpZiAoc2RldikKKwkJcHV0X2RldmljZSgmc2Rldi0+ZGV2KTsKK30KKworaW50IHNwbWlfZGV2aWNlX2FkZChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworCit2b2lkIHNwbWlfZGV2aWNlX3JlbW92ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworCisvKioKKyAqIHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgLSBpbnRlcmZhY2UgdG8gdGhlIFNQTUkgbWFzdGVyIGNvbnRyb2xsZXIKKyAqIEBkZXY6CURyaXZlciBtb2RlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGV2aWNlLgorICogQG5yOgkJYm9hcmQtc3BlY2lmaWMgbnVtYmVyIGlkZW50aWZpZXIgZm9yIHRoaXMgY29udHJvbGxlci9idXMKKyAqIEBjbWQ6CXNlbmRzIGEgbm9uLWRhdGEgY29tbWFuZCBzZXF1ZW5jZSBvbiB0aGUgU1BNSSBidXMuCisgKiBAcmVhZF9jbWQ6CXNlbmRzIGEgcmVnaXN0ZXIgcmVhZCBjb21tYW5kIHNlcXVlbmNlIG9uIHRoZSBTUE1JIGJ1cy4KKyAqIEB3cml0ZV9jbWQ6CXNlbmRzIGEgcmVnaXN0ZXIgd3JpdGUgY29tbWFuZCBzZXF1ZW5jZSBvbiB0aGUgU1BNSSBidXMuCisgKi8KK3N0cnVjdCBzcG1pX2NvbnRyb2xsZXIgeworCXN0cnVjdCBkZXZpY2UJCWRldjsKKwl1bnNpZ25lZCBpbnQJCW5yOworCWludAkoKmNtZCkoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwgdTggb3Bjb2RlLCB1OCBzaWQpOworCWludAkoKnJlYWRfY21kKShzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGNvZGUsCisJCQkgICAgdTggc2lkLCB1MTYgYWRkciwgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CisJaW50CSgqd3JpdGVfY21kKShzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsLCB1OCBvcGNvZGUsCisJCQkgICAgIHU4IHNpZCwgdTE2IGFkZHIsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICp0b19zcG1pX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZSAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIsIGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgKnNwbWlfY29udHJvbGxlcl9nZXRfZHJ2ZGF0YShjb25zdCBzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoJmN0cmwtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcG1pX2NvbnRyb2xsZXJfc2V0X2RydmRhdGEoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCwKKwkJCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZjdHJsLT5kZXYsIGRhdGEpOworfQorCitzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpzcG1pX2NvbnRyb2xsZXJfYWxsb2Moc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgICBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogc3BtaV9jb250cm9sbGVyX3B1dCgpIC0gZGVjcmVtZW50IGNvbnRyb2xsZXIgcmVmY291bnQKKyAqIEBjdHJsCVNQTUkgY29udHJvbGxlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwbWlfY29udHJvbGxlcl9wdXQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCkKK3sKKwlpZiAoY3RybCkKKwkJcHV0X2RldmljZSgmY3RybC0+ZGV2KTsKK30KKworaW50IHNwbWlfY29udHJvbGxlcl9hZGQoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCk7Cit2b2lkIHNwbWlfY29udHJvbGxlcl9yZW1vdmUoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCk7CisKKy8qKgorICogc3RydWN0IHNwbWlfZHJpdmVyIC0gU1BNSSBzbGF2ZSBkZXZpY2UgZHJpdmVyCisgKiBAZHJpdmVyOglTUE1JIGRldmljZSBkcml2ZXJzIHNob3VsZCBpbml0aWFsaXplIG5hbWUgYW5kIG93bmVyIGZpZWxkIG9mCisgKgkJdGhpcyBzdHJ1Y3R1cmUuCisgKiBAcHJvYmU6CWJpbmRzIHRoaXMgZHJpdmVyIHRvIGEgU1BNSSBkZXZpY2UuCisgKiBAcmVtb3ZlOgl1bmJpbmRzIHRoaXMgZHJpdmVyIGZyb20gdGhlIFNQTUkgZGV2aWNlLgorICogQHNodXRkb3duOglzdGFuZGFyZCBzaHV0ZG93biBjYWxsYmFjayB1c2VkIGR1cmluZyBwb3dlcmRvd24vaGFsdC4KKyAqIEBzdXNwZW5kOglzdGFuZGFyZCBzdXNwZW5kIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHN5c3RlbSBzdXNwZW5kLgorICogQHJlc3VtZToJc3RhbmRhcmQgcmVzdW1lIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHN5c3RlbSByZXN1bWUuCisgKgorICogSWYgUE0gcnVudGltZSBzdXBwb3J0IGlzIGRlc2lyZWQgZm9yIGEgc2xhdmUsIGEgZGV2aWNlIGRyaXZlciBjYW4gY2FsbAorICogcG1fcnVudGltZV9wdXQoKSBmcm9tIHRoZWlyIHByb2JlKCkgcm91dGluZSAoYW5kIGEgYmFsYW5jaW5nCisgKiBwbV9ydW50aW1lX2dldCgpIGluIHJlbW92ZSgpKS4gIFBNIHJ1bnRpbWUgc3VwcG9ydCBmb3IgYSBzbGF2ZSBpcworICogaW1wbGVtZW50ZWQgYnkgaXNzdWluZyBhIFNMRUVQIGNvbW1hbmQgdG8gdGhlIHNsYXZlIG9uIHJ1bnRpbWVfc3VzcGVuZCgpLAorICogdHJhbnNpdGlvbmluZyB0aGUgc2xhdmUgaW50byB0aGUgU0xFRVAgc3RhdGUuICBPbiBydW50aW1lX3Jlc3VtZSgpLCBhIFdBS0VVUAorICogY29tbWFuZCBpcyBzZW50IHRvIHRoZSBzbGF2ZSB0byBicmluZyBpdCBiYWNrIHRvIEFDVElWRS4KKyAqLworc3RydWN0IHNwbWlfZHJpdmVyIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJaW50CSgqcHJvYmUpKHN0cnVjdCBzcG1pX2RldmljZSAqc2Rldik7CisJdm9pZAkoKnJlbW92ZSkoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2KTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwbWlfZHJpdmVyICp0b19zcG1pX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCBzcG1pX2RyaXZlciwgZHJpdmVyKTsKK30KKworaW50IHNwbWlfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzcG1pX2RyaXZlciAqc2Rydik7CisKKy8qKgorICogc3BtaV9kcml2ZXJfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciBhbiBTUE1JIGNsaWVudCBkcml2ZXIKKyAqIEBzZHJ2Ogl0aGUgZHJpdmVyIHRvIHVucmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwbWlfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHNwbWlfZHJpdmVyICpzZHJ2KQoreworCWlmIChzZHJ2KQorCQlkcml2ZXJfdW5yZWdpc3Rlcigmc2Rydi0+ZHJpdmVyKTsKK30KKworI2RlZmluZSBtb2R1bGVfc3BtaV9kcml2ZXIoX19zcG1pX2RyaXZlcikgXAorCW1vZHVsZV9kcml2ZXIoX19zcG1pX2RyaXZlciwgc3BtaV9kcml2ZXJfcmVnaXN0ZXIsIFwKKwkJCXNwbWlfZHJpdmVyX3VucmVnaXN0ZXIpCisKK2ludCBzcG1pX3JlZ2lzdGVyX3JlYWQoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1OCBhZGRyLCB1OCAqYnVmKTsKK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggYWRkciwgdTggKmJ1ZiwKKwkJCSAgIHNpemVfdCBsZW4pOworaW50IHNwbWlfZXh0X3JlZ2lzdGVyX3JlYWRsKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTE2IGFkZHIsIHU4ICpidWYsCisJCQkgICAgc2l6ZV90IGxlbik7CitpbnQgc3BtaV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGFkZHIsIHU4IGRhdGEpOworaW50IHNwbWlfcmVnaXN0ZXJfemVyb193cml0ZShzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYsIHU4IGRhdGEpOworaW50IHNwbWlfZXh0X3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBzcG1pX2RldmljZSAqc2RldiwgdTggYWRkciwKKwkJCSAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKK2ludCBzcG1pX2V4dF9yZWdpc3Rlcl93cml0ZWwoc3RydWN0IHNwbWlfZGV2aWNlICpzZGV2LCB1MTYgYWRkciwKKwkJCSAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CitpbnQgc3BtaV9jb21tYW5kX3Jlc2V0KHN0cnVjdCBzcG1pX2RldmljZSAqc2Rldik7CitpbnQgc3BtaV9jb21tYW5kX3NsZWVwKHN0cnVjdCBzcG1pX2RldmljZSAqc2Rldik7CitpbnQgc3BtaV9jb21tYW5kX3dha2V1cChzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworaW50IHNwbWlfY29tbWFuZF9zaHV0ZG93bihzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3JjdS5oIGIvaW5jbHVkZS9saW51eC9zcmN1LmgKaW5kZXggOWIwNThlZS4uYTI3ODNjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcmN1LmgKKysrIGIvaW5jbHVkZS9saW51eC9zcmN1LmgKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA2CiAgKiBDb3B5cmlnaHQgKEMpIEZ1aml0c3UsIDIwMTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCBhNzQ3YTc3Li4xZTY3YjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC05OCw2ICs5OCw4IEBACiAjZGVmaW5lIF9fTUFQKG4sLi4uKSBfX01BUCMjbihfX1ZBX0FSR1NfXykKIAogI2RlZmluZSBfX1NDX0RFQ0wodCwgYSkJdCBhCisjZGVmaW5lIF9fVFlQRV9JU19MKHQpCShfX3NhbWVfdHlwZSgodCkwLCAwTCkpCisjZGVmaW5lIF9fVFlQRV9JU19VTCh0KQkoX19zYW1lX3R5cGUoKHQpMCwgMFVMKSkKICNkZWZpbmUgX19UWVBFX0lTX0xMKHQpIChfX3NhbWVfdHlwZSgodCkwLCAwTEwpIHx8IF9fc2FtZV90eXBlKCh0KTAsIDBVTEwpKQogI2RlZmluZSBfX1NDX0xPTkcodCwgYSkgX190eXBlb2YoX19idWlsdGluX2Nob29zZV9leHByKF9fVFlQRV9JU19MTCh0KSwgMExMLCAwTCkpIGEKICNkZWZpbmUgX19TQ19DQVNUKHQsIGEpCSh0KSBhCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKaW5kZXggMzBiMmViZS4uZTBiZjIxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZnMuaApAQCAtMTk4LDYgKzE5OCw3IEBACiAJCQkJICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCB1bW9kZV90IG1vZGUpOwogdm9pZCBzeXNmc19yZW1vdmVfZmlsZV9ucyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgY29uc3Qgdm9pZCAqbnMpOworYm9vbCBzeXNmc19yZW1vdmVfZmlsZV9zZWxmKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyKTsKIHZvaWQgc3lzZnNfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cik7CiAKIGludCBfX211c3RfY2hlY2sgc3lzZnNfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLApAQCAtMjQ2LDYgKzI0NywxMSBAQAogCiBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2luaXQodm9pZCk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNmc19lbmFibGVfbnMoc3RydWN0IGtlcm5mc19ub2RlICprbikKK3sKKwlyZXR1cm4ga2VybmZzX2VuYWJsZV9ucyhrbik7Cit9CisKICNlbHNlIC8qIENPTkZJR19TWVNGUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBzeXNmc19zY2hlZHVsZV9jYWxsYmFjayhzdHJ1Y3Qga29iamVjdCAqa29iaiwKQEAgLTMwMSw2ICszMDcsMTIgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHN5c2ZzX3JlbW92ZV9maWxlX3NlbGYoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cikKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzeXNmc19yZW1vdmVfZmlsZXMoc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cikKIHsKQEAgLTQxOCw2ICs0MzAsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX2VuYWJsZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKQoreworfQorCiAjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBzeXNmc19jcmVhdGVfZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdG9ydHVyZS5oIGIvaW5jbHVkZS9saW51eC90b3J0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlMmI0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdG9ydHVyZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29tbW9uIGZ1bmN0aW9ucyBmb3IgaW4ta2VybmVsIHRvcnR1cmUgdGVzdHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCisgKgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAxNAorICoKKyAqIEF1dGhvcjogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1RPUlRVUkVfSAorI2RlZmluZSBfX0xJTlVYX1RPUlRVUkVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z29iamVjdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisvKiBEZWZpbml0aW9ucyBmb3IgYSBub24tc3RyaW5nIHRvcnR1cmUtdGVzdCBtb2R1bGUgcGFyYW1ldGVyLiAqLworI2RlZmluZSB0b3J0dXJlX3BhcmFtKHR5cGUsIG5hbWUsIGluaXQsIG1zZykgXAorCXN0YXRpYyB0eXBlIG5hbWUgPSBpbml0OyBcCisJbW9kdWxlX3BhcmFtKG5hbWUsIHR5cGUsIDA0NDQpOyBcCisJTU9EVUxFX1BBUk1fREVTQyhuYW1lLCBtc2cpOworCisjZGVmaW5lIFRPUlRVUkVfRkxBRyAiLXRvcnR1cmU6IgorI2RlZmluZSBUT1JPVVRfU1RSSU5HKHMpIFwKKwlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyBzICJcbiIsIHRvcnR1cmVfdHlwZSkKKyNkZWZpbmUgVkVSQk9TRV9UT1JPVVRfU1RSSU5HKHMpIFwKKwlkbyB7IGlmICh2ZXJib3NlKSBwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyAiICVzXG4iLCB0b3J0dXJlX3R5cGUsIHMpOyB9IHdoaWxlICgwKQorI2RlZmluZSBWRVJCT1NFX1RPUk9VVF9FUlJTVFJJTkcocykgXAorCWRvIHsgaWYgKHZlcmJvc2UpIHByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHICIhISEgJXNcbiIsIHRvcnR1cmVfdHlwZSwgcyk7IH0gd2hpbGUgKDApCisKKy8qIERlZmluaXRpb25zIGZvciBhIG5vbi1zdHJpbmcgdG9ydHVyZS10ZXN0IG1vZHVsZSBwYXJhbWV0ZXIuICovCisjZGVmaW5lIHRvcnR1cmVfcGFybSh0eXBlLCBuYW1lLCBpbml0LCBtc2cpIFwKKwlzdGF0aWMgdHlwZSBuYW1lID0gaW5pdDsgXAorCW1vZHVsZV9wYXJhbShuYW1lLCB0eXBlLCAwNDQ0KTsgXAorCU1PRFVMRV9QQVJNX0RFU0MobmFtZSwgbXNnKTsKKworLyogRGVmaW5pdGlvbnMgZm9yIG9ubGluZS9vZmZsaW5lIGV4ZXJjaXNlci4gKi8KK2ludCB0b3J0dXJlX29ub2ZmX2luaXQobG9uZyBvb2hvbGRvZmYsIGxvbmcgb29pbnRlcnZhbCk7CitjaGFyICp0b3J0dXJlX29ub2ZmX3N0YXRzKGNoYXIgKnBhZ2UpOworYm9vbCB0b3J0dXJlX29ub2ZmX2ZhaWx1cmVzKHZvaWQpOworCisvKiBMb3ctcmlkZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICovCitzdHJ1Y3QgdG9ydHVyZV9yYW5kb21fc3RhdGUgeworCXVuc2lnbmVkIGxvbmcgdHJzX3N0YXRlOworCWxvbmcgdHJzX2NvdW50OworfTsKKyNkZWZpbmUgREVGSU5FX1RPUlRVUkVfUkFORE9NKG5hbWUpIHN0cnVjdCB0b3J0dXJlX3JhbmRvbV9zdGF0ZSBuYW1lID0geyAwLCAwIH0KK3Vuc2lnbmVkIGxvbmcgdG9ydHVyZV9yYW5kb20oc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICp0cnNwKTsKKworLyogVGFzayBzaHVmZmxlciwgd2hpY2ggY2F1c2VzIENQVXMgdG8gb2NjYXNpb25hbGx5IGdvIGlkbGUuICovCit2b2lkIHRvcnR1cmVfc2h1ZmZsZV90YXNrX3JlZ2lzdGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHApOworaW50IHRvcnR1cmVfc2h1ZmZsZV9pbml0KGxvbmcgc2h1ZmZpbnQpOworCisvKiBUZXN0IGF1dG8tc2h1dGRvd24gaGFuZGxpbmcuICovCit2b2lkIHRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKGNvbnN0IGNoYXIgKnRpdGxlKTsKK2ludCB0b3J0dXJlX3NodXRkb3duX2luaXQoaW50IHNzZWNzLCB2b2lkICgqY2xlYW51cCkodm9pZCkpOworCisvKiBUYXNrIHN0dXR0ZXJpbmcsIHdoaWNoIGZvcmNlcyBsb2FkL25vLWxvYWQgdHJhbnNpdGlvbnMuICovCit2b2lkIHN0dXR0ZXJfd2FpdChjb25zdCBjaGFyICp0aXRsZSk7CitpbnQgdG9ydHVyZV9zdHV0dGVyX2luaXQoaW50IHMpOworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cC4gKi8KK3ZvaWQgdG9ydHVyZV9pbml0X2JlZ2luKGNoYXIgKnR0eXBlLCBib29sIHYsIGludCAqcnVubmFibGUpOwordm9pZCB0b3J0dXJlX2luaXRfZW5kKHZvaWQpOworYm9vbCB0b3J0dXJlX2NsZWFudXAodm9pZCk7Citib29sIHRvcnR1cmVfbXVzdF9zdG9wKHZvaWQpOworYm9vbCB0b3J0dXJlX211c3Rfc3RvcF9pcnEodm9pZCk7Cit2b2lkIHRvcnR1cmVfa3RocmVhZF9zdG9wcGluZyhjaGFyICp0aXRsZSk7CitpbnQgX3RvcnR1cmVfY3JlYXRlX2t0aHJlYWQoaW50ICgqZm4pKHZvaWQgKmFyZyksIHZvaWQgKmFyZywgY2hhciAqcywgY2hhciAqbSwKKwkJCSAgICAgY2hhciAqZiwgc3RydWN0IHRhc2tfc3RydWN0ICoqdHApOwordm9pZCBfdG9ydHVyZV9zdG9wX2t0aHJlYWQoY2hhciAqbSwgc3RydWN0IHRhc2tfc3RydWN0ICoqdHApOworCisjZGVmaW5lIHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQobiwgYXJnLCB0cCkgXAorCV90b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKG4sIChhcmcpLCAjbiwgIkNyZWF0aW5nICIgI24gIiB0YXNrIiwgXAorCQkJCSJGYWlsZWQgdG8gY3JlYXRlICIgI24sICYodHApKQorI2RlZmluZSB0b3J0dXJlX3N0b3Bfa3RocmVhZChuLCB0cCkgXAorCV90b3J0dXJlX3N0b3Bfa3RocmVhZCgiU3RvcHBpbmcgIiAjbiAiIHRhc2siLCAmKHRwKSkKKworI2VuZGlmIC8qIF9fTElOVVhfVE9SVFVSRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eS5oIGIvaW5jbHVkZS9saW51eC90dHkuaAppbmRleCA5MGI0ZmRjLi5iOTBiNWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5LmgKQEAgLTIwOCw3ICsyMDgsNyBAQAogCXdhaXRfcXVldWVfaGVhZF90CWRlbHRhX21zcl93YWl0OwkvKiBNb2RlbSBzdGF0dXMgY2hhbmdlICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBUVFkgZmxhZ3MgQVNZXyovCiAJdW5zaWduZWQgY2hhcgkJY29uc29sZToxLAkvKiBwb3J0IGlzIGEgY29uc29sZSAqLwotCQkJCWxvd19sYXRlbmN5OjE7CS8qIGRpcmVjdCBidWZmZXIgZmx1c2ggKi8KKwkJCQlsb3dfbGF0ZW5jeToxOwkvKiBvcHRpb25hbDogdHVuZSBmb3IgbGF0ZW5jeSAqLwogCXN0cnVjdCBtdXRleAkJbXV0ZXg7CQkvKiBMb2NraW5nICovCiAJc3RydWN0IG11dGV4CQlidWZfbXV0ZXg7CS8qIEJ1ZmZlciBhbGxvYyBsb2NrICovCiAJdW5zaWduZWQgY2hhcgkJKnhtaXRfYnVmOwkvKiBPcHRpb25hbCBidWZmZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmggYi9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCmluZGV4IGI4MzQ3YzIwLi5hZGQyNmRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmgKQEAgLTEyNiw3ICsxMjYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCA3ZjZlYjg1Li42YjdlYzM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiLmgKQEAgLTU3LDYgKzU3LDcgQEAKICAqIEBleHRyYTogZGVzY3JpcHRvcnMgZm9sbG93aW5nIHRoaXMgZW5kcG9pbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KICAqIEBleHRyYWxlbjogaG93IG1hbnkgYnl0ZXMgb2YgImV4dHJhIiBhcmUgdmFsaWQKICAqIEBlbmFibGVkOiBVUkJzIG1heSBiZSBzdWJtaXR0ZWQgdG8gdGhpcyBlbmRwb2ludAorICogQHN0cmVhbXM6IG51bWJlciBvZiBVU0ItMyBzdHJlYW1zIGFsbG9jYXRlZCBvbiB0aGUgZW5kcG9pbnQKICAqCiAgKiBVU0IgcmVxdWVzdHMgYXJlIGFsd2F5cyBxdWV1ZWQgdG8gYSBnaXZlbiBlbmRwb2ludCwgaWRlbnRpZmllZCBieSBhCiAgKiBkZXNjcmlwdG9yIHdpdGhpbiBhbiBhY3RpdmUgaW50ZXJmYWNlIGluIGEgZ2l2ZW4gVVNCIGNvbmZpZ3VyYXRpb24uCkBAIC03MSw2ICs3Miw3IEBACiAJdW5zaWduZWQgY2hhciAqZXh0cmE7ICAgLyogRXh0cmEgZGVzY3JpcHRvcnMgKi8KIAlpbnQgZXh0cmFsZW47CiAJaW50IGVuYWJsZWQ7CisJaW50IHN0cmVhbXM7CiB9OwogCiAvKiBob3N0LXNpZGUgd3JhcHBlciBmb3Igb25lIGludGVyZmFjZSBzZXR0aW5nJ3MgcGFyc2VkIGRlc2NyaXB0b3JzICovCkBAIC0yMDIsNiArMjA0LDggQEAKIHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfZ2V0X2ludGYoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogdm9pZCB1c2JfcHV0X2ludGYoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogCisvKiBIYXJkIGxpbWl0ICovCisjZGVmaW5lIFVTQl9NQVhFTkRQT0lOVFMJMzAKIC8qIHRoaXMgbWF4aW11bSBpcyBhcmJpdHJhcnkgKi8KICNkZWZpbmUgVVNCX01BWElOVEVSRkFDRVMJMzIKICNkZWZpbmUgVVNCX01BWElBRFMJCShVU0JfTUFYSU5URVJGQUNFUy8yKQpAQCAtMzY2LDYgKzM3MCw4IEBACiAjZW5kaWYKIH07CiAKK3N0cnVjdCB1c2JfZGV2X3N0YXRlOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdHJ1Y3QgdXNiX3R0OwpAQCAtNzQ5LDYgKzc1NSwxMSBAQAogCQl1bnNpZ25lZCBpbnQgaWZhY2VfbnVtLAogCQl1bnNpZ25lZCBpbnQgYWx0X251bSk7CiAKKy8qIHBvcnQgY2xhaW1pbmcgZnVuY3Rpb25zICovCitpbnQgdXNiX2h1Yl9jbGFpbV9wb3J0KHN0cnVjdCB1c2JfZGV2aWNlICpoZGV2LCB1bnNpZ25lZCBwb3J0MSwKKwkJc3RydWN0IHVzYl9kZXZfc3RhdGUgKm93bmVyKTsKK2ludCB1c2JfaHViX3JlbGVhc2VfcG9ydChzdHJ1Y3QgdXNiX2RldmljZSAqaGRldiwgdW5zaWduZWQgcG9ydDEsCisJCXN0cnVjdCB1c2JfZGV2X3N0YXRlICpvd25lcik7CiAKIC8qKgogICogdXNiX21ha2VfcGF0aCAtIHJldHVybnMgc3RhYmxlIGRldmljZSBwYXRoIGluIHRoZSB1c2IgdHJlZQpAQCAtMTY2Niw2ICsxNjc3LDEwIEBACiAvKiB0aGlzIHJlcXVlc3QgaXNuJ3QgcmVhbGx5IHN5bmNocm9ub3VzLCBidXQgaXQgYmVsb25ncyB3aXRoIHRoZSBvdGhlcnMgKi8KIGV4dGVybiBpbnQgdXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGNvbmZpZyk7CiAKKy8qIGNob29zZSBhbmQgc2V0IGNvbmZpZ3VyYXRpb24gZm9yIGRldmljZSAqLworZXh0ZXJuIGludCB1c2JfY2hvb3NlX2NvbmZpZ3VyYXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworZXh0ZXJuIGludCB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGNvbmZpZ3VyYXRpb24pOworCiAvKgogICogdGltZW91dHMsIGluIG1pbGxpc2Vjb25kcywgdXNlZCBmb3Igc2VuZGluZy9yZWNlaXZpbmcgY29udHJvbCBtZXNzYWdlcwogICogdGhleSB0eXBpY2FsbHkgY29tcGxldGUgd2l0aGluIGEgZmV3IGZyYW1lcyAobXNlYykgYWZ0ZXIgdGhleSdyZSBpc3N1ZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2NkY19uY20uaCBiL2luY2x1ZGUvbGludXgvdXNiL2NkY19uY20uaAppbmRleCBjM2ZhODA3Li4yYzE0ZDljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jZGNfbmNtLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvY2RjX25jbS5oCkBAIC04OCw2ICs4OCw3IEBACiAjZGVmaW5lIGNkY19uY21fZGF0YV9pbnRmX2lzX21iaW0oeCkgICgoeCktPmRlc2MuYkludGVyZmFjZVByb3RvY29sID09IFVTQl9DRENfTUJJTV9QUk9UT19OVEIpCiAKIHN0cnVjdCBjZGNfbmNtX2N0eCB7CisJc3RydWN0IHVzYl9jZGNfbmNtX250Yl9wYXJhbWV0ZXJzIG5jbV9wYXJtOwogCXN0cnVjdCBocnRpbWVyIHR4X3RpbWVyOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBiaDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY2hpcGlkZWEuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NoaXBpZGVhLmgKaW5kZXggNzA4YmQxMS4uYmJlNzc5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvY2hpcGlkZWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jaGlwaWRlYS5oCkBAIC0yNSw2ICsyNSw3IEBACiAJICovCiAjZGVmaW5lIENJX0hEUkNfRFVBTF9ST0xFX05PVF9PVEcJQklUKDQpCiAjZGVmaW5lIENJX0hEUkNfSU1YMjhfV1JJVEVfRklYCQlCSVQoNSkKKyNkZWZpbmUgQ0lfSERSQ19GT1JDRV9GVUxMU1BFRUQJCUJJVCg2KQogCWVudW0gdXNiX2RyX21vZGUJZHJfbW9kZTsKICNkZWZpbmUgQ0lfSERSQ19DT05UUk9MTEVSX1JFU0VUX0VWRU5UCQkwCiAjZGVmaW5lIENJX0hEUkNfQ09OVFJPTExFUl9TVE9QUEVEX0VWRU5UCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2hjZC5oIGIvaW5jbHVkZS9saW51eC91c2IvaGNkLmgKaW5kZXggZWZlOGQ4YS4uNDg1Y2Q1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvaGNkLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvaGNkLmgKQEAgLTE0Myw2ICsxNDMsNyBAQAogCXVuc2lnbmVkCQlhdXRob3JpemVkX2RlZmF1bHQ6MTsKIAl1bnNpZ25lZAkJaGFzX3R0OjE7CS8qIEludGVncmF0ZWQgVFQgaW4gcm9vdCBodWIgKi8KIAl1bnNpZ25lZAkJYW1kX3Jlc3VtZV9idWc6MTsgLyogQU1EIHJlbW90ZSB3YWtldXAgcXVpcmsgKi8KKwl1bnNpZ25lZAkJY2FuX2RvX3N0cmVhbXM6MTsgLyogSEMgc3VwcG9ydHMgc3RyZWFtcyAqLwogCiAJdW5zaWduZWQgaW50CQlpcnE7CQkvKiBpcnEgYWxsb2NhdGVkICovCiAJdm9pZCBfX2lvbWVtCQkqcmVnczsJCS8qIGRldmljZSBtZW1vcnkvaW8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL29tYXBfY29udHJvbF91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiL29tYXBfY29udHJvbF91c2IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhZTM4My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9vbWFwX2NvbnRyb2xfdXNiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogb21hcF9jb250cm9sX3VzYi5oIC0gSGVhZGVyIGZpbGUgZm9yIHRoZSBVU0IgcGFydCBvZiBjb250cm9sIG1vZHVsZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQXV0aG9yOiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19PTUFQX0NPTlRST0xfVVNCX0hfXwotI2RlZmluZSBfX09NQVBfQ09OVFJPTF9VU0JfSF9fCi0KLWVudW0gb21hcF9jb250cm9sX3VzYl90eXBlIHsKLQlPTUFQX0NUUkxfVFlQRV9PVEdIUyA9IDEsCS8qIE1haWxib3ggT1RHSFNfQ09OVFJPTCAqLwotCU9NQVBfQ1RSTF9UWVBFX1VTQjIsCS8qIFVTQjJfUEhZLCBwb3dlciBkb3duIGluIENPTlRST0xfREVWX0NPTkYgKi8KLQlPTUFQX0NUUkxfVFlQRV9QSVBFMywJLyogUElQRTMgUEhZLCBEUExMICYgc2VwZXJhdGUgUngvVHggcG93ZXIgKi8KLQlPTUFQX0NUUkxfVFlQRV9EUkE3VVNCMiwgLyogVVNCMiBQSFksIHBvd2VyIGFuZCBwb3dlcl9hdXggZS5nLiBEUkE3ICovCi0JT01BUF9DVFJMX1RZUEVfQU00MzdVU0IyLCAvKiBVU0IyIFBIWSwgcG93ZXIgZS5nLiBBTTQzN3ggKi8KLX07Ci0KLXN0cnVjdCBvbWFwX2NvbnRyb2xfdXNiIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0KLQl1MzIgX19pb21lbSAqb3RnaHNfY29udHJvbDsKLQl1MzIgX19pb21lbSAqcG93ZXI7Ci0JdTMyIF9faW9tZW0gKnBvd2VyX2F1eDsKLQotCXN0cnVjdCBjbGsgKnN5c19jbGs7Ci0KLQllbnVtIG9tYXBfY29udHJvbF91c2JfdHlwZSB0eXBlOwotfTsKLQotZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgewotCVVTQl9NT0RFX1VOREVGSU5FRCA9IDAsCi0JVVNCX01PREVfSE9TVCwKLQlVU0JfTU9ERV9ERVZJQ0UsCi0JVVNCX01PREVfRElTQ09OTkVDVCwKLX07Ci0KLSNkZWZpbmUJT01BUF9DVFJMX0RFVl9QSFlfUEQJCUJJVCgwKQotCi0jZGVmaW5lCU9NQVBfQ1RSTF9ERVZfQVZBTElECQlCSVQoMCkKLSNkZWZpbmUJT01BUF9DVFJMX0RFVl9CVkFMSUQJCUJJVCgxKQotI2RlZmluZQlPTUFQX0NUUkxfREVWX1ZCVVNWQUxJRAkJQklUKDIpCi0jZGVmaW5lCU9NQVBfQ1RSTF9ERVZfU0VTU0VORAkJQklUKDMpCi0jZGVmaW5lCU9NQVBfQ1RSTF9ERVZfSURESUcJCUJJVCg0KQotCi0jZGVmaW5lCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19DTURfTUFTSwkweDAwM0ZDMDAwCi0jZGVmaW5lCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19DTURfU0hJRlQJMHhFCi0KLSNkZWZpbmUJT01BUF9DVFJMX1VTQl9QV1JDVExfQ0xLX0ZSRVFfTUFTSwkweEZGQzAwMDAwCi0jZGVmaW5lCU9NQVBfQ1RSTF9VU0JfUFdSQ1RMX0NMS19GUkVRX1NISUZUCTB4MTYKLQotI2RlZmluZQlPTUFQX0NUUkxfVVNCM19QSFlfVFhfUlhfUE9XRVJPTgkweDMKLSNkZWZpbmUJT01BUF9DVFJMX1VTQjNfUEhZX1RYX1JYX1BPV0VST0ZGCTB4MAotCi0jZGVmaW5lIE9NQVBfQ1RSTF9VU0IyX1BIWV9QRAkJQklUKDI4KQotCi0jZGVmaW5lIEFNNDM3WF9DVFJMX1VTQjJfUEhZX1BECQlCSVQoMCkKLSNkZWZpbmUgQU00MzdYX0NUUkxfVVNCMl9PVEdfUEQJCUJJVCgxKQotI2RlZmluZSBBTTQzN1hfQ1RSTF9VU0IyX09UR1ZERVRfRU4JQklUKDE5KQotI2RlZmluZSBBTTQzN1hfQ1RSTF9VU0IyX09UR1NFU1NFTkRfRU4JQklUKDIwKQotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfT01BUF9DT05UUk9MX1VTQikKLWV4dGVybiB2b2lkIG9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKTsKLWV4dGVybiB2b2lkIG9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCWVudW0gb21hcF9jb250cm9sX3VzYl9tb2RlIG1vZGUpOwotI2Vsc2UKLQotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfY29udHJvbF91c2JfcGh5X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JZW51bSBvbWFwX2NvbnRyb2xfdXNiX21vZGUgbW9kZSkKLXsKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogX19PTUFQX0NPTlRST0xfVVNCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivb21hcF91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiL29tYXBfdXNiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTI5MzYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivb21hcF91c2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBvbWFwX3VzYi5oIC0tIG9tYXAgdXNiMiBwaHkgaGVhZGVyIGZpbGUKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQXV0aG9yOiBLaXNob24gVmlqYXkgQWJyYWhhbSBJIDxraXNob25AdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19EUklWRVJTX09NQVBfVVNCMl9ICi0jZGVmaW5lIF9fRFJJVkVSU19PTUFQX1VTQjJfSAotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+Ci0KLXN0cnVjdCB1c2JfZHBsbF9wYXJhbXMgewotCXUxNgltOwotCXU4CW47Ci0JdTgJZnJlcTozOwotCXU4CXNkOwotCXUzMgltZjsKLX07Ci0KLXN0cnVjdCBvbWFwX3VzYiB7Ci0Jc3RydWN0IHVzYl9waHkJCXBoeTsKLQlzdHJ1Y3QgcGh5X2NvbXBhbmlvbgkqY29tcGFyYXRvcjsKLQl2b2lkIF9faW9tZW0JCSpwbGxfY3RybF9iYXNlOwotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IGRldmljZQkJKmNvbnRyb2xfZGV2OwotCXN0cnVjdCBjbGsJCSp3a3VwY2xrOwotCXN0cnVjdCBjbGsJCSpzeXNfY2xrOwotCXN0cnVjdCBjbGsJCSpvcHRjbGs7Ci0JdTgJCQlpc19zdXNwZW5kZWQ6MTsKLX07Ci0KLSNkZWZpbmUJcGh5X3RvX29tYXB1c2IoeCkJY29udGFpbmVyX29mKCh4KSwgc3RydWN0IG9tYXBfdXNiLCBwaHkpCi0KLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX1VTQjIpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfVVNCMl9NT0RVTEUpCi1leHRlcm4gaW50IG9tYXBfdXNiMl9zZXRfY29tcGFyYXRvcihzdHJ1Y3QgcGh5X2NvbXBhbmlvbiAqY29tcGFyYXRvcik7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgb21hcF91c2IyX3NldF9jb21wYXJhdG9yKHN0cnVjdCBwaHlfY29tcGFuaW9uICpjb21wYXJhdG9yKQotewotCXJldHVybiAtRU5PREVWOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdTMyIG9tYXBfdXNiX3JlYWRsKHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBfX3Jhd19yZWFkbChhZGRyICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfdXNiX3dyaXRlbCh2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCwKLQl1MzIgZGF0YSkKLXsKLQlfX3Jhd193cml0ZWwoZGF0YSwgYWRkciArIG9mZnNldCk7Ci19Ci0KLSNlbmRpZiAvKiBfX0RSSVZFUlNfT01BUF9VU0JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9waHkuaAppbmRleCA2YzBiMWM1Li4zNTMwNTNhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvcGh5LmgKQEAgLTExMSw2ICsxMTEsMTMgQEAKIAlpbnQJKCpzZXRfc3VzcGVuZCkoc3RydWN0IHVzYl9waHkgKngsCiAJCQkJaW50IHN1c3BlbmQpOwogCisJLyoKKwkgKiBTZXQgd2FrZXVwIGVuYWJsZSBmb3IgUEhZLCBpbiB0aGF0IGNhc2UsIHRoZSBQSFkgY2FuIGJlCisJICogd29rZW4gdXAgZnJvbSBzdXNwZW5kIHN0YXR1cyBkdWUgdG8gZXh0ZXJuYWwgZXZlbnRzLAorCSAqIGxpa2UgdmJ1cyBjaGFuZ2UsIGRwL2RtIGNoYW5nZSBhbmQgaWQuCisJICovCisJaW50CSgqc2V0X3dha2V1cCkoc3RydWN0IHVzYl9waHkgKngsIGJvb2wgZW5hYmxlZCk7CisKIAkvKiBub3RpZnkgcGh5IGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLwogCWludAkoKm5vdGlmeV9jb25uZWN0KShzdHJ1Y3QgdXNiX3BoeSAqeCwKIAkJCWVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCk7CkBAIC0yNjUsNiArMjcyLDE1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Cit1c2JfcGh5X3NldF93YWtldXAoc3RydWN0IHVzYl9waHkgKngsIGJvb2wgZW5hYmxlZCkKK3sKKwlpZiAoeCAmJiB4LT5zZXRfd2FrZXVwKQorCQlyZXR1cm4geC0+c2V0X3dha2V1cCh4LCBlbmFibGVkKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAogdXNiX3BoeV9ub3RpZnlfY29ubmVjdChzdHJ1Y3QgdXNiX3BoeSAqeCwgZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKQogewogCWlmICh4ICYmIHgtPm5vdGlmeV9jb25uZWN0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAppbmRleCA3MDRhMWFiLi45YmI1NDdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaApAQCAtMTkwLDcgKzE5MCw4IEBACiAgKiBAbnVtX3BvcnRzOiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBwb3J0cyB0aGlzIGRldmljZSB3aWxsIGhhdmUuCiAgKiBAYnVsa19pbl9zaXplOiBtaW5pbXVtIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmb3IgYnVsay1pbiBidWZmZXIKICAqCSgwID0gZW5kLXBvaW50IHNpemUpCi0gKiBAYnVsa19vdXRfc2l6ZTogYnl0ZXMgdG8gYWxsb2NhdGUgZm9yIGJ1bGstb3V0IGJ1ZmZlciAoMCA9IGVuZC1wb2ludCBzaXplKQorICogQGJ1bGtfb3V0X3NpemU6IG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZvciBidWxrLW91dCBidWZmZXIKKyAqCSgwID0gZW5kLXBvaW50IHNpemUpCiAgKiBAY2FsY19udW1fcG9ydHM6IHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaG93IG1hbnkgcG9ydHMgdGhpcwogICoJZGV2aWNlIGhhcyBkeW5hbWljYWxseS4gIEl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBwcm9iZSgpCiAgKgljYWxsYmFjayBpcyBjYWxsZWQsIGJ1dCBiZWZvcmUgYXR0YWNoKCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3Vhcy5oIGIvaW5jbHVkZS9saW51eC91c2IvdWFzLmgKaW5kZXggNTQ5OWFiNS4uM2ZjOGU4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvdWFzLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvdWFzLmgKQEAgLTksNyArOSw3IEBACiAJX191OCBpdV9pZDsKIAlfX3U4IHJzdmQxOwogCV9fYmUxNiB0YWc7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIGVudW0gewogCUlVX0lEX0NPTU1BTkQJCT0gMHgwMSwKQEAgLTUyLDcgKzUyLDcgQEAKIAlfX3U4IHJzdmQ3OwogCXN0cnVjdCBzY3NpX2x1biBsdW47CiAJX191OCBjZGJbMTZdOwkvKiBYWFg6IE92ZXJmbG93LWNoZWNraW5nIHRvb2xzIG1heSBtaXN1bmRlcnN0YW5kICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCB0YXNrX21nbXRfaXUgewogCV9fdTggaXVfaWQ7CkBAIC02Miw3ICs2Miw3IEBACiAJX191OCByc3ZkMjsKIAlfX2JlMTYgdGFza190YWc7CiAJc3RydWN0IHNjc2lfbHVuIGx1bjsKLX07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKIAogLyoKICAqIEFsc28gdXNlZCBmb3IgdGhlIFJlYWQgUmVhZHkgYW5kIFdyaXRlIFJlYWR5IElVcyBzaW5jZSB0aGV5IGhhdmUgdGhlCkBAIC03NywxNSArNzcsMTUgQEAKIAlfX3U4IHJzdmQ3WzddOwogCV9fYmUxNiBsZW47CiAJX191OCBzZW5zZVtTQ1NJX1NFTlNFX0JVRkZFUlNJWkVdOwotfTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwogCi1zdHJ1Y3QgcmVzcG9uc2VfdWkgeworc3RydWN0IHJlc3BvbnNlX2l1IHsKIAlfX3U4IGl1X2lkOwogCV9fdTggcnN2ZDE7CiAJX19iZTE2IHRhZzsKLQlfX2JlMTYgYWRkX3Jlc3BvbnNlX2luZm87CisJX191OCBhZGRfcmVzcG9uc2VfaW5mb1szXTsKIAlfX3U4IHJlc3BvbnNlX2NvZGU7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCB1c2JfcGlwZV91c2FnZV9kZXNjcmlwdG9yIHsKIAlfX3U4ICBiTGVuZ3RoOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvdXNibmV0LmggYi9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaAppbmRleCBlMzAzZWVmLi4wNjYyZTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaApAQCAtMzAsNyArMzAsNyBAQAogCXN0cnVjdCBkcml2ZXJfaW5mbwkqZHJpdmVyX2luZm87CiAJY29uc3QgY2hhcgkJKmRyaXZlcl9uYW1lOwogCXZvaWQJCQkqZHJpdmVyX3ByaXY7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJKndhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKIAlzdHJ1Y3QgbXV0ZXgJCXBoeV9tdXRleDsKIAl1bnNpZ25lZCBjaGFyCQlzdXNwZW5kX2NvdW50OwogCXVuc2lnbmVkIGNoYXIJCXBrdF9jbnQsIHBrdF9lcnI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCA2MzAzNTY4Li4xYTY0YjI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTY3LDggKzY3LDEwIEBACiAJCS8qIEluaXRpYWwgUkVBRCgxMCkgKGFuZCBvdGhlcnMpIG11c3QgYmUgcmV0cmllZCAqLwlcCiAJVVNfRkxBRyhXUklURV9DQUNIRSwJMHgwMDIwMDAwMCkJCQlcCiAJCS8qIFdyaXRlIENhY2hlIHN0YXR1cyBpcyBub3QgYXZhaWxhYmxlICovCVwKLQlVU19GTEFHKE5FRURTX0NBUDE2LAkweDAwNDAwMDAwKQotCQkvKiBjYW5ub3QgaGFuZGxlIFJFQURfQ0FQQUNJVFlfMTAgKi8KKwlVU19GTEFHKE5FRURTX0NBUDE2LAkweDAwNDAwMDAwKQkJCVwKKwkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0NBUEFDSVRZXzEwICovCQlcCisJVVNfRkxBRyhJR05PUkVfVUFTLAkweDAwODAwMDAwKQkJCVwKKwkJLyogRGV2aWNlIGFkdmVydGlzZXMgVUFTIGJ1dCBpdCBpcyBicm9rZW4gKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCA3MDRmNGY2Li4xYjIyYzQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTE3NywyMCArMTc3LDEwIEBACiAjZGVmaW5lIERFQ0xBUkVfREVGRVJSQUJMRV9XT1JLKG4sIGYpCQkJCQlcCiAJc3RydWN0IGRlbGF5ZWRfd29yayBuID0gX19ERUxBWUVEX1dPUktfSU5JVElBTElaRVIobiwgZiwgVElNRVJfREVGRVJSQUJMRSkKIAotLyoKLSAqIGluaXRpYWxpemUgYSB3b3JrIGl0ZW0ncyBmdW5jdGlvbiBwb2ludGVyCi0gKi8KLSNkZWZpbmUgUFJFUEFSRV9XT1JLKF93b3JrLCBfZnVuYykJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCShfd29yayktPmZ1bmMgPSAoX2Z1bmMpOwkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQUkVQQVJFX0RFTEFZRURfV09SSyhfd29yaywgX2Z1bmMpCQkJCVwKLQlQUkVQQVJFX1dPUksoJihfd29yayktPndvcmssIChfZnVuYykpCi0KICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19XT1JLCiBleHRlcm4gdm9pZCBfX2luaXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIGludCBvbnN0YWNrKTsKIGV4dGVybiB2b2lkIGRlc3Ryb3lfd29ya19vbl9zdGFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuIHZvaWQgZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2soc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayk7CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB3b3JrX3N0YXRpYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJcmV0dXJuICp3b3JrX2RhdGFfYml0cyh3b3JrKSAmIFdPUktfU1RSVUNUX1NUQVRJQzsKQEAgLTE5OCw2ICsxODgsNyBAQAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIGludCBvbnN0YWNrKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X3dvcmtfb25fc3RhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2RlbGF5ZWRfd29ya19vbl9zdGFjayhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKSB7IH0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHdvcmtfc3RhdGljKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAKQEAgLTIxNyw3ICsyMDgsNyBAQAogCQkoX3dvcmspLT5kYXRhID0gKGF0b21pY19sb25nX3QpIFdPUktfREFUQV9JTklUKCk7CVwKIAkJbG9ja2RlcF9pbml0X21hcCgmKF93b3JrKS0+bG9ja2RlcF9tYXAsICNfd29yaywgJl9fa2V5LCAwKTsgXAogCQlJTklUX0xJU1RfSEVBRCgmKF93b3JrKS0+ZW50cnkpOwkJCVwKLQkJUFJFUEFSRV9XT1JLKChfd29yayksIChfZnVuYykpOwkJCQlcCisJCShfd29yayktPmZ1bmMgPSAoX2Z1bmMpOwkJCQlcCiAJfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIF9fSU5JVF9XT1JLKF93b3JrLCBfZnVuYywgX29uc3RhY2spCQkJCVwKQEAgLTIyNSw3ICsyMTYsNyBAQAogCQlfX2luaXRfd29yaygoX3dvcmspLCBfb25zdGFjayk7CQkJCVwKIAkJKF93b3JrKS0+ZGF0YSA9IChhdG9taWNfbG9uZ190KSBXT1JLX0RBVEFfSU5JVCgpOwlcCiAJCUlOSVRfTElTVF9IRUFEKCYoX3dvcmspLT5lbnRyeSk7CQkJXAotCQlQUkVQQVJFX1dPUksoKF93b3JrKSwgKF9mdW5jKSk7CQkJCVwKKwkJKF93b3JrKS0+ZnVuYyA9IChfZnVuYyk7CQkJCVwKIAl9IHdoaWxlICgwKQogI2VuZGlmCiAKQEAgLTI5NSwxNyArMjg2LDExIEBACiAgKiBEb2N1bWVudGF0aW9uL3dvcmtxdWV1ZS50eHQuCiAgKi8KIGVudW0gewotCS8qCi0JICogQWxsIHdxcyBhcmUgbm93IG5vbi1yZWVudHJhbnQgbWFraW5nIHRoZSBmb2xsb3dpbmcgZmxhZwotCSAqIG1lYW5pbmdsZXNzLiAgV2lsbCBiZSByZW1vdmVkLgotCSAqLwotCVdRX05PTl9SRUVOVFJBTlQJPSAxIDw8IDAsIC8qIERFUFJFQ0FURUQgKi8KLQogCVdRX1VOQk9VTkQJCT0gMSA8PCAxLCAvKiBub3QgYm91bmQgdG8gYW55IGNwdSAqLwogCVdRX0ZSRUVaQUJMRQkJPSAxIDw8IDIsIC8qIGZyZWV6ZSBkdXJpbmcgc3VzcGVuZCAqLwogCVdRX01FTV9SRUNMQUlNCQk9IDEgPDwgMywgLyogbWF5IGJlIHVzZWQgZm9yIG1lbW9yeSByZWNsYWltICovCiAJV1FfSElHSFBSSQkJPSAxIDw8IDQsIC8qIGhpZ2ggcHJpb3JpdHkgKi8KLQlXUV9DUFVfSU5URU5TSVZFCT0gMSA8PCA1LCAvKiBjcHUgaW5zdGVuc2l2ZSB3b3JrcXVldWUgKi8KKwlXUV9DUFVfSU5URU5TSVZFCT0gMSA8PCA1LCAvKiBjcHUgaW50ZW5zaXZlIHdvcmtxdWV1ZSAqLwogCVdRX1NZU0ZTCQk9IDEgPDwgNiwgLyogdmlzaWJsZSBpbiBzeXNmcywgc2VlIHdxX3N5c2ZzX3JlZ2lzdGVyKCkgKi8KIAogCS8qCkBAIC02MDIsMjEgKzU4Nyw2IEBACiAJcmV0dXJuIHN5c3RlbV93cSAhPSBOVUxMOwogfQogCi0vKgotICogTGlrZSBhYm92ZSwgYnV0IHVzZXMgZGVsX3RpbWVyKCkgaW5zdGVhZCBvZiBkZWxfdGltZXJfc3luYygpLiBUaGlzIG1lYW5zLAotICogaWYgaXQgcmV0dXJucyAwIHRoZSB0aW1lciBmdW5jdGlvbiBtYXkgYmUgcnVubmluZyBhbmQgdGhlIHF1ZXVlaW5nIGlzIGluCi0gKiBwcm9ncmVzcy4KLSAqLwotc3RhdGljIGlubGluZSBib29sIF9fZGVwcmVjYXRlZCBfX2NhbmNlbF9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKLXsKLQlib29sIHJldDsKLQotCXJldCA9IGRlbF90aW1lcigmd29yay0+dGltZXIpOwotCWlmIChyZXQpCi0JCXdvcmtfY2xlYXJfcGVuZGluZygmd29yay0+d29yayk7Ci0JcmV0dXJuIHJldDsKLX0KLQogLyogdXNlZCB0byBiZSBkaWZmZXJlbnQgYnV0IG5vdyBpZGVudGljYWwgdG8gZmx1c2hfd29yaygpLCBkZXByZWNhdGVkICovCiBzdGF0aWMgaW5saW5lIGJvb2wgX19kZXByZWNhdGVkIGZsdXNoX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItb2YuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCmluZGV4IDU0MWNlYTQuLjcwZmE3YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1vZi5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgogCkBAIC01MCwxNyArNTEsMTMgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCAtIHRoZSBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQotICogQHBvcnQ6IGlkZW50aWZpZXIgKHZhbHVlIG9mIHJlZyBwcm9wZXJ0eSkgb2YgYSBwb3J0IHRoaXMgZW5kcG9pbnQgYmVsb25ncyB0bwotICogQGlkOiBpZGVudGlmaWVyICh2YWx1ZSBvZiByZWcgcHJvcGVydHkpIG9mIHRoaXMgZW5kcG9pbnQKLSAqIEBsb2NhbF9ub2RlOiBwb2ludGVyIHRvIGRldmljZV9ub2RlIG9mIHRoaXMgZW5kcG9pbnQKKyAqIEBiYXNlOiBzdHJ1Y3Qgb2ZfZW5kcG9pbnQgY29udGFpbmluZyBwb3J0LCBpZCwgYW5kIGxvY2FsIG9mX25vZGUKICAqIEBidXNfdHlwZTogYnVzIHR5cGUKICAqIEBidXM6IGJ1cyBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCiAgKiBAaGVhZDogbGlzdCBoZWFkIGZvciB0aGlzIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgdjRsMl9vZl9lbmRwb2ludCB7Ci0JdW5zaWduZWQgaW50IHBvcnQ7Ci0JdW5zaWduZWQgaW50IGlkOwotCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbG9jYWxfbm9kZTsKKwlzdHJ1Y3Qgb2ZfZW5kcG9pbnQgYmFzZTsKIAllbnVtIHY0bDJfbWJ1c190eXBlIGJ1c190eXBlOwogCXVuaW9uIHsKIAkJc3RydWN0IHY0bDJfb2ZfYnVzX3BhcmFsbGVsIHBhcmFsbGVsOwpAQCAtNzIsMTEgKzY5LDYgQEAKICNpZmRlZiBDT05GSUdfT0YKIGludCB2NGwyX29mX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCSAgIHN0cnVjdCB2NGwyX29mX2VuZHBvaW50ICplbmRwb2ludCk7Ci1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X25leHRfZW5kcG9pbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpOwotc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCi0JCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7Ci1zdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiAjZWxzZSAvKiBDT05GSUdfT0YgKi8KIAogc3RhdGljIGlubGluZSBpbnQgdjRsMl9vZl9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCkBAIC04NSwyNSArNzcsNiBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqdjRsMl9vZl9nZXRfbmV4dF9lbmRwb2ludCgKLQkJCQkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldmlvdXMpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICp2NGwyX29mX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQoCi0JCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKnY0bDJfb2ZfZ2V0X3JlbW90ZV9wb3J0KAotCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAogI2VuZGlmIC8qIF9WNEwyX09GX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmggYi9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCmluZGV4IDk2NTBhM2YuLmI0OTU2YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKKysrIGIvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaApAQCAtMzEsOCArMzEsMTAgQEAKICNkZWZpbmUgSUZfUFJFRklYX0FVVE9DT05GCTB4MDIKIAogZW51bSB7CisJSU5FVDZfSUZBRERSX1NUQVRFX1BSRURBRCwKIAlJTkVUNl9JRkFERFJfU1RBVEVfREFELAogCUlORVQ2X0lGQUREUl9TVEFURV9QT1NUREFELAorCUlORVQ2X0lGQUREUl9TVEFURV9FUlJEQUQsCiAJSU5FVDZfSUZBRERSX1NUQVRFX1VQLAogCUlORVQ2X0lGQUREUl9TVEFURV9ERUFELAogfTsKQEAgLTU4LDcgKzYwLDcgQEAKIAl1bnNpZ25lZCBsb25nCQljc3RhbXA7CS8qIGNyZWF0ZWQgdGltZXN0YW1wICovCiAJdW5zaWduZWQgbG9uZwkJdHN0YW1wOyAvKiB1cGRhdGVkIHRpbWVzdGFtcCAqLwogCi0Jc3RydWN0IHRpbWVyX2xpc3QJZGFkX3RpbWVyOworCXN0cnVjdCBkZWxheWVkX3dvcmsJZGFkX3dvcms7CiAKIAlzdHJ1Y3QgaW5ldDZfZGV2CSppZGV2OwogCXN0cnVjdCBydDZfaW5mbwkJKnJ0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCA4YzRkZDYzLi43NDNhY2NlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtNDgwLDIwICs0ODAsMjEgQEAKICNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogCi0vKiBTeW5jb29raWVzIHVzZSBhIG1vbm90b25pYyB0aW1lciB3aGljaCBpbmNyZW1lbnRzIGV2ZXJ5IDY0IHNlY29uZHMuCisvKiBTeW5jb29raWVzIHVzZSBhIG1vbm90b25pYyB0aW1lciB3aGljaCBpbmNyZW1lbnRzIGV2ZXJ5IDYwIHNlY29uZHMuCiAgKiBUaGlzIGNvdW50ZXIgaXMgdXNlZCBib3RoIGFzIGEgaGFzaCBpbnB1dCBhbmQgcGFydGlhbGx5IGVuY29kZWQgaW50bwogICogdGhlIGNvb2tpZSB2YWx1ZS4gIEEgY29va2llIGlzIG9ubHkgdmFsaWRhdGVkIGZ1cnRoZXIgaWYgdGhlIGRlbHRhCiAgKiBiZXR3ZWVuIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgYW5kIHRoZSBlbmNvZGVkIG9uZSBpcyBsZXNzIHRoYW4gdGhpcywKLSAqIGkuZS4gYSBzZW50IGNvb2tpZSBpcyB2YWxpZCBvbmx5IGF0IG1vc3QgZm9yIDEyOCBzZWNvbmRzIChvciBsZXNzIGlmCisgKiBpLmUuIGEgc2VudCBjb29raWUgaXMgdmFsaWQgb25seSBhdCBtb3N0IGZvciAyKjYwIHNlY29uZHMgKG9yIGxlc3MgaWYKICAqIHRoZSBjb3VudGVyIGFkdmFuY2VzIGltbWVkaWF0ZWx5IGFmdGVyIGEgY29va2llIGlzIGdlbmVyYXRlZCkuCiAgKi8KICNkZWZpbmUgTUFYX1NZTkNPT0tJRV9BR0UgMgogCiBzdGF0aWMgaW5saW5lIHUzMiB0Y3BfY29va2llX3RpbWUodm9pZCkKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgbm93OwotCWdldG5zdGltZW9mZGF5KCZub3cpOwotCXJldHVybiBub3cudHZfc2VjID4+IDY7IC8qIDY0IHNlY29uZHMgZ3JhbnVsYXJpdHkgKi8KKwl1NjQgdmFsID0gZ2V0X2ppZmZpZXNfNjQoKTsKKworCWRvX2Rpdih2YWwsIDYwICogSFopOworCXJldHVybiB2YWw7CiB9CiAKIHUzMiBfX2Nvb2tpZV92NF9pbml0X3NlcXVlbmNlKGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKaW5kZXggMzA5ZjUxMy4uNzIyMWEyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmgKQEAgLTMyNywxMiArMzI3LDE5IEBACiAJc3RydWN0IGlzY3NpX3RyYW5zcG9ydAkqdHQ7CiAJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKIAlzdHJ1Y3QgaXNjc2lfY29ubgkqbGVhZGNvbm47CS8qIGxlYWRpbmcgY29ubmVjdGlvbiAqLwotCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBwcm90ZWN0cyBzZXNzaW9uIHN0YXRlLCAqCi0JCQkJCQkgKiBzZXF1ZW5jZSBudW1iZXJzLCAgICAgICAqCisJLyogQmV0d2VlbiB0aGUgZm9yd2FyZCBhbmQgdGhlIGJhY2t3YXJkIGxvY2tzIGV4aXN0cyBhIHN0cmljdCBsb2NraW5nCisJICogaGllcmFyY2h5LiBUaGUgbXV0dWFsIGV4Y2x1c2lvbiB6b25lIHByb3RlY3RlZCBieSB0aGUgZm9yd2FyZCBsb2NrCisJICogY2FuIGVuY2xvc2UgdGhlIG11dHVhbCBleGNsdXNpb24gem9uZSBwcm90ZWN0ZWQgYnkgdGhlIGJhY2t3YXJkIGxvY2sKKwkgKiBidXQgbm90IHZpY2UgdmVyc2EuCisJICovCisJc3BpbmxvY2tfdAkJZnJ3ZF9sb2NrOwkvKiBwcm90ZWN0cyBzZXNzaW9uIHN0YXRlLCAqCisJCQkJCQkgKiBjbWRzbiwgcXVldWVkX2NtZHNuICAgICAqCiAJCQkJCQkgKiBzZXNzaW9uIHJlc291cmNlczogICAgICAqCi0JCQkJCQkgKiAtIGNtZHBvb2wsCQkgICAqCi0JCQkJCQkgKiAtIG1nbXRwb29sLAkJICAgKgotCQkJCQkJICogLSByMnRwb29sCQkgICAqLworCQkJCQkJICogLSBjbWRwb29sIGtmaWZvX291dCAsICAgKgorCQkJCQkJICogLSBtZ210cG9vbCwJCSAgICovCisJc3BpbmxvY2tfdAkJYmFja19sb2NrOwkvKiBwcm90ZWN0cyBjbWRzbl9leHAgICAgICAqCisJCQkJCQkgKiBjbWRzbl9tYXgsICAgICAgICAgICAgICAqCisJCQkJCQkgKiBjbWRwb29sIGtmaWZvX2luICAgICAgICAqLwogCWludAkJCXN0YXRlOwkJLyogc2Vzc2lvbiBzdGF0ZSAgICAgICAgICAgKi8KIAlpbnQJCQlhZ2U7CQkvKiBjb3VudHMgc2Vzc2lvbiByZS1vcGVucyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmgKaW5kZXggMjE1NDY5YS4uMmE3YWE3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpX3RjcC5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJpc2NzaV90Y3AuaApAQCAtODMsNiArODMsOCBAQAogCXN0cnVjdCBpc2NzaV9wb29sCXIydHBvb2w7CiAJc3RydWN0IGtmaWZvCQlyMnRxdWV1ZTsKIAl2b2lkCQkJKmRkX2RhdGE7CisJc3BpbmxvY2tfdAkJcG9vbDJxdWV1ZTsKKwlzcGlubG9ja190CQlxdWV1ZTJwb29sOwogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGlic2FzLmggYi9pbmNsdWRlL3Njc2kvbGlic2FzLmgKaW5kZXggZjg0M2RkOC4uZWY3ODcyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaApAQCAtMTcyLDcgKzE3Miw2IEBACiAgICAgICAgIGVudW0gICBhdGFfY29tbWFuZF9zZXQgY29tbWFuZF9zZXQ7CiAgICAgICAgIHN0cnVjdCBzbXBfcmVzcCAgICAgICAgcnBzX3Jlc3A7IC8qIHJlcG9ydF9waHlfc2F0YV9yZXNwICovCiAgICAgICAgIHU4ICAgICBwb3J0X25vOyAgICAgICAgLyogcG9ydCBudW1iZXIsIGlmIHRoaXMgaXMgYSBQTSAoUG9ydCkgKi8KLQlpbnQgICAgcG1fcmVzdWx0OwogCiAJc3RydWN0IGF0YV9wb3J0ICphcDsKIAlzdHJ1Y3QgYXRhX2hvc3QgYXRhX2hvc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKaW5kZXggOTE1NThhMS4uZGQ3Yzk5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaApAQCAtMTQyLDggKzE0Miw3IEBACiBleHRlcm4gc3RydWN0IHNjc2lfY21uZCAqc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgZ2ZwX3QpOwogZXh0ZXJuIHN0cnVjdCBzY3NpX2NtbmQgKl9fc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIGdmcF90KTsKIGV4dGVybiB2b2lkIHNjc2lfcHV0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKLWV4dGVybiB2b2lkIF9fc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBzY3NpX2NtbmQgKiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICopOworZXh0ZXJuIHZvaWQgX19zY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKIGV4dGVybiB2b2lkIHNjc2lfZmluaXNoX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAogZXh0ZXJuIHZvaWQgKnNjc2lfa21hcF9hdG9taWNfc2coc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHNnX2NvdW50LApAQCAtMTU2LDkgKzE1NSw2IEBACiBleHRlcm4gaW50IHNjc2lfZG1hX21hcChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogZXh0ZXJuIHZvaWQgc2NzaV9kbWFfdW5tYXAoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAotc3RydWN0IHNjc2lfY21uZCAqc2NzaV9hbGxvY2F0ZV9jb21tYW5kKGdmcF90IGdmcF9tYXNrKTsKLXZvaWQgc2NzaV9mcmVlX2NvbW1hbmQoZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2NzaV9zZ19jb3VudChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJcmV0dXJuIGNtZC0+c2RiLnRhYmxlLm5lbnRzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAppbmRleCBkNjVmYmVjLi40ZTg0NWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaApAQCAtMTEzLDYgKzExMywxMiBAQAogCWNvbnN0IGNoYXIgKiB2ZW5kb3I7CQkvKiBbYmFja19jb21wYXRdIHBvaW50IGludG8gJ2lucXVpcnknIC4uLiAqLwogCWNvbnN0IGNoYXIgKiBtb2RlbDsJCS8qIC4uLiBhZnRlciBzY2FuOyBwb2ludCB0byBzdGF0aWMgc3RyaW5nICovCiAJY29uc3QgY2hhciAqIHJldjsJCS8qIC4uLiAibnVsbG51bGxudWxsbnVsbCIgYmVmb3JlIHNjYW4gKi8KKworI2RlZmluZSBTQ1NJX1ZQRF9QR19MRU4gICAgICAgICAgICAgICAgMjU1CisJaW50IHZwZF9wZzgzX2xlbjsKKwl1bnNpZ25lZCBjaGFyICp2cGRfcGc4MzsKKwlpbnQgdnBkX3BnODBfbGVuOworCXVuc2lnbmVkIGNoYXIgKnZwZF9wZzgwOwogCXVuc2lnbmVkIGNoYXIgY3VycmVudF90YWc7CS8qIGN1cnJlbnQgdGFnICovCiAJc3RydWN0IHNjc2lfdGFyZ2V0ICAgICAgKnNkZXZfdGFyZ2V0OyAgIC8qIHVzZWQgb25seSBmb3Igc2luZ2xlX2x1biAqLwogCkBAIC0yMzUsMTIgKzI0MSwyNCBAQAogI2RlZmluZSBzZGV2X3ByaW50ayhwcmVmaXgsIHNkZXYsIGZtdCwgYS4uLikJXAogCWRldl9wcmludGsocHJlZml4LCAmKHNkZXYpLT5zZGV2X2dlbmRldiwgZm10LCAjI2EpCiAKKyNkZWZpbmUgc2Rldl9kYmcoc2RldiwgZm10LCBhLi4uKSBcCisJZGV2X2RiZygmKHNkZXYpLT5zZGV2X2dlbmRldiwgZm10LCAjI2EpCisKICNkZWZpbmUgc2NtZF9wcmludGsocHJlZml4LCBzY21kLCBmbXQsIGEuLi4pCQkJCVwKICAgICAgICAgKHNjbWQpLT5yZXF1ZXN0LT5ycV9kaXNrID8JCQkJCVwKIAlzZGV2X3ByaW50ayhwcmVmaXgsIChzY21kKS0+ZGV2aWNlLCAiWyVzXSAiIGZtdCwJCVwKIAkJICAgIChzY21kKS0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lLCAjI2EpIDoJCVwKIAlzZGV2X3ByaW50ayhwcmVmaXgsIChzY21kKS0+ZGV2aWNlLCBmbXQsICMjYSkKIAorI2RlZmluZSBzY21kX2RiZyhzY21kLCBmbXQsIGEuLi4pCQkJCQkgICBcCisJZG8gewkJCQkJCQkJICAgXAorCQlpZiAoKHNjbWQpLT5yZXF1ZXN0LT5ycV9kaXNrKQkJCQkgICBcCisJCQlzZGV2X2RiZygoc2NtZCktPmRldmljZSwgIlslc10gIiBmbXQsCQkgICBcCisJCQkJIChzY21kKS0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lLCAjI2EpO1wKKwkJZWxzZQkJCQkJCQkgICBcCisJCQlzZGV2X2RiZygoc2NtZCktPmRldmljZSwgZm10LCAjI2EpOwkJICAgXAorCX0gd2hpbGUgKDApCisKIGVudW0gc2NzaV90YXJnZXRfc3RhdGUgewogCVNUQVJHRVRfQ1JFQVRFRCA9IDEsCiAJU1RBUkdFVF9SVU5OSU5HLApAQCAtMjU3LDcgKzI3NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlzaWJsaW5nczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldmljZXM7CiAJc3RydWN0IGRldmljZQkJZGV2OwotCXVuc2lnbmVkIGludAkJcmVhcF9yZWY7IC8qIHByb3RlY3RlZCBieSB0aGUgaG9zdCBsb2NrICovCisJc3RydWN0IGtyZWYJCXJlYXBfcmVmOyAvKiBsYXN0IHB1dCByZW5kZXJzIHRhcmdldCBpbnZpc2libGUgKi8KIAl1bnNpZ25lZCBpbnQJCWNoYW5uZWw7CiAJdW5zaWduZWQgaW50CQlpZDsgLyogdGFyZ2V0IGlkIC4uLiByZXBsYWNlCiAJCQkJICAgICAqIHNjc2lfZGV2aWNlLmlkIGV2ZW50dWFsbHkgKi8KQEAgLTI4NCw3ICszMDIsNiBAQAogI2RlZmluZSBTQ1NJX0RFRkFVTFRfVEFSR0VUX0JMT0NLRUQJMwogCiAJY2hhcgkJCXNjc2lfbGV2ZWw7Ci0Jc3RydWN0IGV4ZWN1dGVfd29yawlldzsKIAllbnVtIHNjc2lfdGFyZ2V0X3N0YXRlCXN0YXRlOwogCXZvaWQgCQkJKmhvc3RkYXRhOyAvKiBhdmFpbGFibGUgdG8gbG93LWxldmVsIGRyaXZlciAqLwogCXVuc2lnbmVkIGxvbmcJCXN0YXJnZXRfZGF0YVswXTsgLyogZm9yIHRoZSB0cmFuc3BvcnQgKi8KQEAgLTMwOSw2ICszMjYsNyBAQAogZXh0ZXJuIGludCBzY3NpX3JlZ2lzdGVyX2RldmljZV9oYW5kbGVyKHN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICpzY3NpX2RoKTsKIGV4dGVybiB2b2lkIHNjc2lfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gaW50IHNjc2lfdW5yZWdpc3Rlcl9kZXZpY2VfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciAqc2NzaV9kaCk7Cit2b2lkIHNjc2lfYXR0YWNoX3ZwZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogCiBleHRlcm4gaW50IHNjc2lfZGV2aWNlX2dldChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBzY3NpX2RldmljZV9wdXQoc3RydWN0IHNjc2lfZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDUzMDc1ZTUuLjk0ODQ0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTE1LDYgKzE1LDcgQEAKIHN0cnVjdCBtb2R1bGU7CiBzdHJ1Y3Qgc2NzaV9jbW5kOwogc3RydWN0IHNjc2lfZGV2aWNlOworc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbDsKIHN0cnVjdCBzY3NpX3RhcmdldDsKIHN0cnVjdCBTY3NpX0hvc3Q7CiBzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sOwpAQCAtNTI0LDYgKzUyNSwxMiBAQAogCSAqICAgc2NzaV9uZXRsaW5rLmgKIAkgKi8KIAl1NjQgdmVuZG9yX2lkOworCisJLyoKKwkgKiBBZGRpdGlvbmFsIHBlci1jb21tYW5kIGRhdGEgYWxsb2NhdGVkIGZvciB0aGUgZHJpdmVyLgorCSAqLworCXVuc2lnbmVkIGludCBjbWRfc2l6ZTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X2NtZF9wb29sICpjbWRfcG9vbDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCmluZGV4IGI3OTdlOGYuLjhjNzk5ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCkBAIC0xMzAsNiArMTMwLDcgQEAKICNkZWZpbmUgRkNfUE9SVFNQRUVEXzRHQklUCQk4CiAjZGVmaW5lIEZDX1BPUlRTUEVFRF84R0JJVAkJMHgxMAogI2RlZmluZSBGQ19QT1JUU1BFRURfMTZHQklUCQkweDIwCisjZGVmaW5lIEZDX1BPUlRTUEVFRF8zMkdCSVQJCTB4NDAKICNkZWZpbmUgRkNfUE9SVFNQRUVEX05PVF9ORUdPVElBVEVECSgxIDw8IDE1KSAvKiBTcGVlZCBub3QgZXN0YWJsaXNoZWQgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKaW5kZXggMmExNGYxZi4uZDNmNWY4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb3JlLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKQEAgLTIyLDYgKzIyLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiB3YWtlX3VwKCkgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgkJLyogc3RydWN0IG11dGV4ICovCiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4JCS8qIHN0cnVjdCByd19zZW1hcGhvcmUgKi8KQEAgLTQxLDM5ICs0MiwzMyBAQAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIHN0cnVjdCBwY2lfZGV2Owogc3RydWN0IG1vZHVsZTsKLXN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZTsKK3N0cnVjdCBjb21wbGV0aW9uOwogCiAvKiBkZXZpY2UgYWxsb2NhdGlvbiBzdHVmZiAqLwogCi0jZGVmaW5lIFNORFJWX0RFVl9UWVBFX1JBTkdFX1NJWkUJCTB4MTAwMAorLyogdHlwZSBvZiB0aGUgb2JqZWN0IHVzZWQgaW4gc25kX2RldmljZV8qKCkKKyAqIHRoaXMgYWxzbyBkZWZpbmVzIHRoZSBjYWxsaW5nIG9yZGVyCisgKi8KK2VudW0gc25kX2RldmljZV90eXBlIHsKKwlTTkRSVl9ERVZfTE9XTEVWRUwsCisJU05EUlZfREVWX0NPTlRST0wsCisJU05EUlZfREVWX0lORk8sCisJU05EUlZfREVWX0JVUywKKwlTTkRSVl9ERVZfQ09ERUMsCisJU05EUlZfREVWX1BDTSwKKwlTTkRSVl9ERVZfQ09NUFJFU1MsCisJU05EUlZfREVWX1JBV01JREksCisJU05EUlZfREVWX1RJTUVSLAorCVNORFJWX0RFVl9TRVFVRU5DRVIsCisJU05EUlZfREVWX0hXREVQLAorCVNORFJWX0RFVl9KQUNLLAorfTsKIAotdHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9kZXZpY2VfdHlwZV90OwotI2RlZmluZQlTTkRSVl9ERVZfVE9QTEVWRUwJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAwKQotI2RlZmluZQlTTkRSVl9ERVZfQ09OVFJPTAkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDEpCi0jZGVmaW5lCVNORFJWX0RFVl9MT1dMRVZFTF9QUkUJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAyKQotI2RlZmluZQlTTkRSVl9ERVZfTE9XTEVWRUxfTk9STUFMICgoX19mb3JjZSBzbmRfZGV2aWNlX3R5cGVfdCkgMHgxMDAwKQotI2RlZmluZQlTTkRSVl9ERVZfUENNCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwMSkKLSNkZWZpbmUJU05EUlZfREVWX1JBV01JREkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDIpCi0jZGVmaW5lCVNORFJWX0RFVl9USU1FUgkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDMpCi0jZGVmaW5lCVNORFJWX0RFVl9TRVFVRU5DRVIJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDQpCi0jZGVmaW5lCVNORFJWX0RFVl9IV0RFUAkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDUpCi0jZGVmaW5lCVNORFJWX0RFVl9JTkZPCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwNikKLSNkZWZpbmUJU05EUlZfREVWX0JVUwkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDcpCi0jZGVmaW5lCVNORFJWX0RFVl9DT0RFQwkJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDgpCi0jZGVmaW5lCVNORFJWX0RFVl9KQUNLICAgICAgICAgICgoX19mb3JjZSBzbmRfZGV2aWNlX3R5cGVfdCkgMHgxMDA5KQotI2RlZmluZQlTTkRSVl9ERVZfQ09NUFJFU1MJKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMEEpCi0jZGVmaW5lCVNORFJWX0RFVl9MT1dMRVZFTAkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MjAwMCkKLQotdHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9kZXZpY2Vfc3RhdGVfdDsKLSNkZWZpbmUJU05EUlZfREVWX0JVSUxECQkoKF9fZm9yY2Ugc25kX2RldmljZV9zdGF0ZV90KSAwKQotI2RlZmluZQlTTkRSVl9ERVZfUkVHSVNURVJFRAkoKF9fZm9yY2Ugc25kX2RldmljZV9zdGF0ZV90KSAxKQotI2RlZmluZQlTTkRSVl9ERVZfRElTQ09OTkVDVEVECSgoX19mb3JjZSBzbmRfZGV2aWNlX3N0YXRlX3QpIDIpCi0KLXR5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfZGV2aWNlX2NtZF90OwotI2RlZmluZQlTTkRSVl9ERVZfQ01EX1BSRQkoKF9fZm9yY2Ugc25kX2RldmljZV9jbWRfdCkgMCkKLSNkZWZpbmUJU05EUlZfREVWX0NNRF9OT1JNQUwJKChfX2ZvcmNlIHNuZF9kZXZpY2VfY21kX3QpIDEpCQotI2RlZmluZQlTTkRSVl9ERVZfQ01EX1BPU1QJKChfX2ZvcmNlIHNuZF9kZXZpY2VfY21kX3QpIDIpCitlbnVtIHNuZF9kZXZpY2Vfc3RhdGUgeworCVNORFJWX0RFVl9CVUlMRCwKKwlTTkRSVl9ERVZfUkVHSVNURVJFRCwKKwlTTkRSVl9ERVZfRElTQ09OTkVDVEVELAorfTsKIAogc3RydWN0IHNuZF9kZXZpY2U7CiAKQEAgLTg2LDggKzgxLDggQEAKIHN0cnVjdCBzbmRfZGV2aWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IG9mIHJlZ2lzdGVyZWQgZGV2aWNlcyAqLwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsJCS8qIGNhcmQgd2hpY2ggaG9sZHMgdGhpcyBkZXZpY2UgKi8KLQlzbmRfZGV2aWNlX3N0YXRlX3Qgc3RhdGU7CS8qIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KLQlzbmRfZGV2aWNlX3R5cGVfdCB0eXBlOwkJLyogZGV2aWNlIHR5cGUgKi8KKwllbnVtIHNuZF9kZXZpY2Vfc3RhdGUgc3RhdGU7CS8qIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KKwllbnVtIHNuZF9kZXZpY2VfdHlwZSB0eXBlOwkvKiBkZXZpY2UgdHlwZSAqLwogCXZvaWQgKmRldmljZV9kYXRhOwkJLyogZGV2aWNlIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBzbmRfZGV2aWNlX29wcyAqb3BzOwkvKiBvcGVyYXRpb25zICovCiB9OwpAQCAtMTMxLDExICsxMjYsMTAgQEAKIAkJCQkJCQkJc3RhdGUgKi8KIAlzcGlubG9ja190IGZpbGVzX2xvY2s7CQkvKiBsb2NrIHRoZSBmaWxlcyBmb3IgdGhpcyBjYXJkICovCiAJaW50IHNodXRkb3duOwkJCS8qIHRoaXMgY2FyZCBpcyBnb2luZyBkb3duICovCi0JaW50IGZyZWVfb25fbGFzdF9jbG9zZTsJCS8qIGZyZWUgaW4gY29udGV4dCBvZiBmaWxlX3JlbGVhc2UgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBzaHV0ZG93bl9zbGVlcDsKLQlhdG9taWNfdCByZWZjb3VudDsJCS8qIHJlZmNvdW50IGZvciBkaXNjb25uZWN0aW9uICovCisJc3RydWN0IGNvbXBsZXRpb24gKnJlbGVhc2VfY29tcGxldGlvbjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBkZXZpY2UgYXNzaWduZWQgdG8gdGhpcyBjYXJkICovCi0Jc3RydWN0IGRldmljZSAqY2FyZF9kZXY7CS8qIGNhcmRYIG9iamVjdCBmb3Igc3lzZnMgKi8KKwlzdHJ1Y3QgZGV2aWNlIGNhcmRfZGV2OwkJLyogY2FyZFggb2JqZWN0IGZvciBzeXNmcyAqLworCWJvb2wgcmVnaXN0ZXJlZDsJCS8qIGNhcmRfZGV2IGlzIHJlZ2lzdGVyZWQ/ICovCiAKICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGU7CS8qIHBvd2VyIHN0YXRlICovCkBAIC0xNDksNiArMTQzLDggQEAKICNlbmRpZgogfTsKIAorI2RlZmluZSBkZXZfdG9fc25kX2NhcmQocCkJY29udGFpbmVyX29mKHAsIHN0cnVjdCBzbmRfY2FyZCwgY2FyZF9kZXYpCisKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfcG93ZXJfbG9jayhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CkBAIC0xOTcsNyArMTkzLDcgQEAKIC8qIHJldHVybiBhIGRldmljZSBwb2ludGVyIGxpbmtlZCB0byBlYWNoIHNvdW5kIGRldmljZSBhcyBhIHBhcmVudCAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpzbmRfY2FyZF9nZXRfZGV2aWNlX2xpbmsoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXJldHVybiBjYXJkID8gY2FyZC0+Y2FyZF9kZXYgOiBOVUxMOworCXJldHVybiBjYXJkID8gJmNhcmQtPmNhcmRfZGV2IDogTlVMTDsKIH0KIAogLyogc291bmQuYyAqLwpAQCAtMjQ0LDEzICsyNDAsMTEgQEAKIAogaW50IHNuZF91bnJlZ2lzdGVyX2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KTsKIHZvaWQgKnNuZF9sb29rdXBfbWlub3JfZGF0YSh1bnNpZ25lZCBpbnQgbWlub3IsIGludCB0eXBlKTsKLWludCBzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cik7CitzdHJ1Y3QgZGV2aWNlICpzbmRfZ2V0X2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KTsKIAogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTAogaW50IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsIHZvaWQgKnByaXZhdGVfZGF0YSwKLQkJCSAgICBjb25zdCBjaGFyICpuYW1lKTsKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKIGludCBzbmRfdW5yZWdpc3Rlcl9vc3NfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYpOwogdm9pZCAqc25kX2xvb2t1cF9vc3NfbWlub3JfZGF0YSh1bnNpZ25lZCBpbnQgbWlub3IsIGludCB0eXBlKTsKICNlbmRpZgpAQCAtMjg0LDkgKzI3OCwxNiBAQAogZXh0ZXJuIGludCAoKnNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBjbWQpOwogI2VuZGlmCiAKLWludCBzbmRfY2FyZF9jcmVhdGUoaW50IGlkeCwgY29uc3QgY2hhciAqaWQsCi0JCSAgICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAotCQkgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZF9yZXQpOworaW50IHNuZF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCwKKwkJIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgaW50IGV4dHJhX3NpemUsCisJCSBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkX3JldCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fZGVwcmVjYXRlZAorc25kX2NhcmRfY3JlYXRlKGludCBpZHgsIGNvbnN0IGNoYXIgKmlkLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCBleHRyYV9zaXplLAorCQlzdHJ1Y3Qgc25kX2NhcmQgKipyZXQpCit7CisJcmV0dXJuIHNuZF9jYXJkX25ldyhOVUxMLCBpZHgsIGlkLCBtb2R1bGUsIGV4dHJhX3NpemUsIHJldCk7Cit9CiAKIGludCBzbmRfY2FyZF9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CiBpbnQgc25kX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpOwpAQCAtMjk4LDIwICsyOTksMTkgQEAKIGludCBzbmRfY29tcG9uZW50X2FkZChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGNvbnN0IGNoYXIgKmNvbXBvbmVudCk7CiBpbnQgc25kX2NhcmRfZmlsZV9hZGQoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBpbnQgc25kX2NhcmRfZmlsZV9yZW1vdmUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci12b2lkIHNuZF9jYXJkX3VucmVmKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CisjZGVmaW5lIHNuZF9jYXJkX3VucmVmKGNhcmQpCXB1dF9kZXZpY2UoJihjYXJkKS0+Y2FyZF9kZXYpCiAKICNkZWZpbmUgc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpICgoY2FyZCktPmRldiA9IChkZXZwdHIpKQogCiAvKiBkZXZpY2UuYyAqLwogCi1pbnQgc25kX2RldmljZV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzbmRfZGV2aWNlX3R5cGVfdCB0eXBlLAoraW50IHNuZF9kZXZpY2VfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgZW51bSBzbmRfZGV2aWNlX3R5cGUgdHlwZSwKIAkJICAgdm9pZCAqZGV2aWNlX2RhdGEsIHN0cnVjdCBzbmRfZGV2aWNlX29wcyAqb3BzKTsKIGludCBzbmRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwogaW50IHNuZF9kZXZpY2VfcmVnaXN0ZXJfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7Ci1pbnQgc25kX2RldmljZV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwogaW50IHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKTsKLWludCBzbmRfZGV2aWNlX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSk7Ci1pbnQgc25kX2RldmljZV9mcmVlX2FsbChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHNuZF9kZXZpY2VfY21kX3QgY21kKTsKK3ZvaWQgc25kX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpOwordm9pZCBzbmRfZGV2aWNlX2ZyZWVfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CiAKIC8qIGlzYWRtYS5jICovCiAKQEAgLTQzMyw3ICs0MzMsNiBAQAogI2RlZmluZSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdwKSAoZ3ApLT5wb3J0X2RhdGEKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1BDSQogLyogUENJIHF1aXJrIGxpc3QgaGVscGVyICovCiBzdHJ1Y3Qgc25kX3BjaV9xdWlyayB7CiAJdW5zaWduZWQgc2hvcnQgc3VidmVuZG9yOwkvKiBQQ0kgc3VidmVuZG9yIElEICovCkBAIC00NjksMTIgKzQ2OCwyNiBAQAogI2RlZmluZSBzbmRfcGNpX3F1aXJrX25hbWUocSkJIiIKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQogY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgogc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpOwogCiBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqCiBzbmRfcGNpX3F1aXJrX2xvb2t1cF9pZCh1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAogCQkJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXBfaWQodTE2IHZlbmRvciwgdTE2IGRldmljZSwKKwkJCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpsaXN0KQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX1NPVU5EX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmggYi9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaAppbmRleCBkZmI0MmNhLi5jNDY5MDhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaAorKysgYi9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaApAQCAtNDM2LDggKzQzNiw2IEBACiAjZGVmaW5lIENDQ0FfQ1VSUkFERFJfTUFTSwkweDAwZmZmZmZmCS8qIEN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbAkJKi8KICNkZWZpbmUgQ0NDQV9DVVJSQUREUgkJMHgxODAwMDAwOAogCi0vKiB1bmRlZmluZSBDQ1IgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCB0aGUgZGVmaW5pdGlvbiBmb3IgU0ggKi8KLSN1bmRlZiBDQ1IKICNkZWZpbmUgQ0NSCQkJMHgwOQkJLyogQ2FjaGUgY29udHJvbCByZWdpc3RlcgkJCQkqLwogI2RlZmluZSBDQ1JfQ0FDSEVJTlZBTElEU0laRQkweDA3MTkwMDA5CiAjZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFX01BU0sJMHhmZTAwMDAwMAkvKiBOdW1iZXIgb2YgaW52YWxpZCBzYW1wbGVzIGNhY2hlIGZvciB0aGlzIGNoYW5uZWwgICAgCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2h3ZGVwLmggYi9pbmNsdWRlL3NvdW5kL2h3ZGVwLmgKaW5kZXggOGMwNWU0N2EuLmFlMDRhM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaHdkZXAuaAorKysgYi9pbmNsdWRlL3NvdW5kL2h3ZGVwLmgKQEAgLTYwLDcgKzYwLDYgQEAKIAlpbnQgaWZhY2U7CiAKICNpZmRlZiBDT05GSUdfU05EX09TU0VNVUwKLQljaGFyIG9zc19kZXZbMzJdOwogCWludCBvc3NfdHlwZTsKIAlpbnQgb3NzcmVnOwogI2VuZGlmCkBAIC02OSw2ICs2OCw4IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwogCXZvaWQgKnByaXZhdGVfZGF0YTsKIAl2b2lkICgqcHJpdmF0ZV9mcmVlKSAoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogCiAJc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7CiAJaW50IHVzZWQ7CQkJLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcGNtLmggYi9pbmNsdWRlL3NvdW5kL3BjbS5oCmluZGV4IDQ4ODM0OTkuLmI0ZDY2OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcGNtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY20uaApAQCAtMTE0MSw0ICsxMTQxLDEyIEBACiAJcmV0dXJuIDFVTEwgPDwgKF9fZm9yY2UgaW50KSBwY21fZm9ybWF0OwogfQogCisvKiBwcmludGsgaGVscGVycyAqLworI2RlZmluZSBwY21fZXJyKHBjbSwgZm10LCBhcmdzLi4uKSBcCisJZGV2X2VycigocGNtKS0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgcGNtX3dhcm4ocGNtLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfd2FybigocGNtKS0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgcGNtX2RiZyhwY20sIGZtdCwgYXJncy4uLikgXAorCWRldl9kYmcoKHBjbSktPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisKICNlbmRpZiAvKiBfX1NPVU5EX1BDTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaCBiL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCmluZGV4IGFkZjA4ODUuLjMxMWRhZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCisrKyBiL2luY2x1ZGUvc291bmQvcmF3bWlkaS5oCkBAIC0xNTcsMTAgKzE1Nyw4IEBACiAKIC8qIGNhbGxiYWNrcyAqLwogCi12b2lkIHNuZF9yYXdtaWRpX3JlY2VpdmVfcmVzZXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGludCBzbmRfcmF3bWlkaV9yZWNlaXZlKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGNvdW50KTsKLXZvaWQgc25kX3Jhd21pZGlfdHJhbnNtaXRfcmVzZXQoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGludCBzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogaW50IHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWsoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgY291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9yY2FyX3NuZC5oIGIvaW5jbHVkZS9zb3VuZC9yY2FyX3NuZC5oCmluZGV4IDZhZGQ2Y2MuLjM0YTNjMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcmNhcl9zbmQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3JjYXJfc25kLmgKQEAgLTM0LDE3ICszNCwxNyBAQAogICogQiA6IFNTSSBkaXJlY3Rpb24KICAqLwogI2RlZmluZSBSU05EX1NTSV9DTEtfUElOX1NIQVJFCQkoMSA8PCAzMSkKLSNkZWZpbmUgUlNORF9TU0lfU1lOQwkJCSgxIDw8IDI5KSAvKiBTU0kzNF9zeW5jIGV0YyAqLwotCiAjZGVmaW5lIFJTTkRfU1NJX1BMQVkJCQkoMSA8PCAyNCkKIAorI2RlZmluZSBSU05EX1NTSShfZG1hX2lkLCBfcGlvX2lycSwgX2ZsYWdzKQkJXAoreyAuZG1hX2lkID0gX2RtYV9pZCwgLnBpb19pcnEgPSBfcGlvX2lycSwgLmZsYWdzID0gX2ZsYWdzIH0KICNkZWZpbmUgUlNORF9TU0lfU0VUKF9kYWlfaWQsIF9kbWFfaWQsIF9waW9faXJxLCBfZmxhZ3MpCVwKIHsgLmRhaV9pZCA9IF9kYWlfaWQsIC5kbWFfaWQgPSBfZG1hX2lkLCAucGlvX2lycSA9IF9waW9faXJxLCAuZmxhZ3MgPSBfZmxhZ3MgfQogI2RlZmluZSBSU05EX1NTSV9VTlVTRUQgXAogeyAuZGFpX2lkID0gLTEsIC5kbWFfaWQgPSAtMSwgLnBpb19pcnEgPSAtMSwgLmZsYWdzID0gMCB9CiAKIHN0cnVjdCByc25kX3NzaV9wbGF0Zm9ybV9pbmZvIHsKLQlpbnQgZGFpX2lkOworCWludCBkYWlfaWQ7CS8qIHdpbGwgYmUgcmVtb3ZlZCAqLwogCWludCBkbWFfaWQ7CiAJaW50IHBpb19pcnE7CiAJdTMyIGZsYWdzOwpAQCAtNTUsOSArNTUsMzEgQEAKICAqLwogI2RlZmluZSBSU05EX1NDVV9VU0VfSFBCSUYJCSgxIDw8IDMxKSAvKiBpdCBuZWVkcyBSU05EX1NTSV9ERVBFTkRFTlQgKi8KIAotc3RydWN0IHJzbmRfc2N1X3BsYXRmb3JtX2luZm8geworI2RlZmluZSBSU05EX1NSQyhyYXRlLCBfZG1hX2lkKQkJCQkJCVwKK3sgLmZsYWdzID0gUlNORF9TQ1VfVVNFX0hQQklGLCAuY29udmVydF9yYXRlID0gcmF0ZSwgLmRtYV9pZCA9IF9kbWFfaWQsIH0KKyNkZWZpbmUgUlNORF9TUkNfU0VUKHJhdGUsIF9kbWFfaWQpCQlcCisJeyAuZmxhZ3MgPSBSU05EX1NDVV9VU0VfSFBCSUYsIC5jb252ZXJ0X3JhdGUgPSByYXRlLCAuZG1hX2lkID0gX2RtYV9pZCwgfQorI2RlZmluZSBSU05EX1NSQ19VTlVTRUQJCQkJXAorCXsgLmZsYWdzID0gMCwgLmNvbnZlcnRfcmF0ZSA9IDAsIC5kbWFfaWQgPSAwLCB9CisKKyNkZWZpbmUgcnNuZF9zY3VfcGxhdGZvcm1faW5mbwlyc25kX3NyY19wbGF0Zm9ybV9pbmZvCisjZGVmaW5lIHNyY19pbmZvCQlzY3VfaW5mbworI2RlZmluZSBzcmNfaW5mb19ucgkJc2N1X2luZm9fbnIKKworc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gewogCXUzMiBmbGFnczsKIAl1MzIgY29udmVydF9yYXRlOyAvKiBzYW1wbGluZyByYXRlIGNvbnZlcnQgKi8KKwlpbnQgZG1hX2lkOyAvKiBmb3IgR2VuMiBTQ1UgKi8KK307CisKK3N0cnVjdCByc25kX2RhaV9wYXRoX2luZm8geworCXN0cnVjdCByc25kX3NzaV9wbGF0Zm9ybV9pbmZvICpzc2k7CisJc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gKnNyYzsKK307CisKK3N0cnVjdCByc25kX2RhaV9wbGF0Zm9ybV9pbmZvIHsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGF0aF9pbmZvIHBsYXliYWNrOworCXN0cnVjdCByc25kX2RhaV9wYXRoX2luZm8gY2FwdHVyZTsKIH07CiAKIC8qCkBAIC03NSw4ICs5NywxMCBAQAogCXUzMiBmbGFnczsKIAlzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbyAqc3NpX2luZm87CiAJaW50IHNzaV9pbmZvX25yOwotCXN0cnVjdCByc25kX3NjdV9wbGF0Zm9ybV9pbmZvICpzY3VfaW5mbzsKLQlpbnQgc2N1X2luZm9fbnI7CisJc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gKnNyY19pbmZvOworCWludCBzcmNfaW5mb19ucjsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm87CisJaW50IGRhaV9pbmZvX25yOwogCWludCAoKnN0YXJ0KShpbnQgaWQpOwogCWludCAoKnN0b3ApKGludCBpZCk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZC5oIGIvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZC5oCmluZGV4IDZjNzQ1MjcuLjliMGFjNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2ltcGxlX2NhcmQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkLmgKQEAgLTE4LDYgKzE4LDggQEAKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGludCBmbXQ7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKKwlpbnQgc2xvdHM7CisJaW50IHNsb3Rfd2lkdGg7CiB9OwogCiBzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9pbmZvIHsKQEAgLTI5LDEwICszMSw2IEBACiAJdW5zaWduZWQgaW50IGRhaWZtdDsKIAlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpIGNwdV9kYWk7CiAJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSBjb2RlY19kYWk7Ci0KLQkvKiB1c2VkIGluIHNpbXBsZS1jYXJkLmMgKi8KLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbmRfbGluazsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9jYXJkOwogfTsKIAogI2VuZGlmIC8qIF9fU0lNUExFX0NBUkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFpLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAppbmRleCA3MWYyN2M0Li5mYWQ3Njc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaApAQCAtMTQyLDYgKzE0Miw4IEBACiAJICogQ2FsbGVkIGJ5IHNvY19jYXJkIGRyaXZlcnMsIG5vcm1hbGx5IGluIHRoZWlyIGh3X3BhcmFtcy4KIAkgKi8KIAlpbnQgKCpzZXRfZm10KShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCk7CisJaW50ICgqeGxhdGVfdGRtX3Nsb3RfbWFzaykodW5zaWduZWQgaW50IHNsb3RzLAorCQl1bnNpZ25lZCBpbnQgKnR4X21hc2ssIHVuc2lnbmVkIGludCAqcnhfbWFzayk7CiAJaW50ICgqc2V0X3RkbV9zbG90KShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKIAkJdW5zaWduZWQgaW50IHR4X21hc2ssIHVuc2lnbmVkIGludCByeF9tYXNrLAogCQlpbnQgc2xvdHMsIGludCBzbG90X3dpZHRoKTsKQEAgLTI3MCw2ICsyNzIsNyBAQAogCS8qIHBhcmVudCBwbGF0Zm9ybS9jb2RlYyAqLwogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKaW5kZXggNmU4OWVmNi4uZWY3OGY1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaApAQCAtMTA4LDEzICsxMDgsOSBAQAogCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAogCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CiAjZGVmaW5lIFNORF9TT0NfREFQTV9WSVJUX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKLXsJLmlkID0gc25kX3NvY19kYXBtX3ZpcnRfbXV4LCAubmFtZSA9IHduYW1lLCBcCi0JU05EX1NPQ19EQVBNX0lOSVRfUkVHX1ZBTCh3cmVnLCB3c2hpZnQsIHdpbnZlcnQpLCBcCi0JLmtjb250cm9sX25ld3MgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMX0KKwlTTkRfU09DX0RBUE1fTVVYKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scykKICNkZWZpbmUgU05EX1NPQ19EQVBNX1ZBTFVFX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKLXsJLmlkID0gc25kX3NvY19kYXBtX3ZhbHVlX211eCwgLm5hbWUgPSB3bmFtZSwgXAotCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAotCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CisJU05EX1NPQ19EQVBNX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpCiAKIC8qIFNpbXBsaWZpZWQgdmVyc2lvbnMgb2YgYWJvdmUgbWFjcm9zLCBhc3N1bWluZyB3bmNvbnRyb2xzID0gQVJSQVlfU0laRSh3Y29udHJvbHMpICovCiAjZGVmaW5lIFNPQ19QR0FfQVJSQVkod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCxcCkBAIC0xNzIsMTAgKzE2OCw4IEBACiAJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CiAjZGVmaW5lIFNORF9TT0NfREFQTV9WSVJUX01VWF9FKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scywgXAogCXdldmVudCwgd2ZsYWdzKSBcCi17CS5pZCA9IHNuZF9zb2NfZGFwbV92aXJ0X211eCwgLm5hbWUgPSB3bmFtZSwgXAotCVNORF9TT0NfREFQTV9JTklUX1JFR19WQUwod3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSwgXAotCS5rY29udHJvbF9uZXdzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDEsIFwKLQkuZXZlbnQgPSB3ZXZlbnQsIC5ldmVudF9mbGFncyA9IHdmbGFnc30KKwlTTkRfU09DX0RBUE1fTVVYX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzLCB3ZXZlbnQsIFwKKwkJd2ZsYWdzKQogCiAvKiBhZGRpdGlvbmFsIHNlcXVlbmNpbmcgY29udHJvbCB3aXRoaW4gYW4gZXZlbnQgdHlwZSAqLwogI2RlZmluZSBTTkRfU09DX0RBUE1fUEdBX1Mod25hbWUsIHdzdWJzZXEsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgXApAQCAtMzExLDEyICszMDUsOCBAQAogIAkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgXAogIAkucHV0ID0gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSwgXAogICAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQotI2RlZmluZSBTT0NfREFQTV9FTlVNX1ZJUlQoeG5hbWUsIHhlbnVtKQkJICAgIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAotCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X2VudW1fdmlydCwgXAotCS5wdXQgPSBzbmRfc29jX2RhcG1fcHV0X2VudW1fdmlydCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKyNkZWZpbmUgU09DX0RBUE1fRU5VTV9WSVJUKHhuYW1lLCB4ZW51bSkgXAorCVNPQ19EQVBNX0VOVU0oeG5hbWUsIHhlbnVtKQogI2RlZmluZSBTT0NfREFQTV9FTlVNX0VYVCh4bmFtZSwgeGVudW0sIHhnZXQsIHhwdXQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXApAQCAtMzI0LDExICszMTQsNyBAQAogCS5wdXQgPSB4cHV0LCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogI2RlZmluZSBTT0NfREFQTV9WQUxVRV9FTlVNKHhuYW1lLCB4ZW51bSkgXAotewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAotCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCi0JLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUsIFwKLQkucHV0ID0gc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKwlTT0NfREFQTV9FTlVNKHhuYW1lLCB4ZW51bSkKICNkZWZpbmUgU09DX0RBUE1fUElOX1NXSVRDSCh4bmFtZSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSAiIFN3aXRjaCIsIFwKIAkuaW5mbyA9IHNuZF9zb2NfZGFwbV9pbmZvX3Bpbl9zd2l0Y2gsIFwKQEAgLTM5MiwxNCArMzc4LDYgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7Ci1pbnQgc25kX3NvY19kYXBtX2dldF9lbnVtX3ZpcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfZGFwbV9wdXRfZW51bV92aXJ0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIGludCBzbmRfc29jX2RhcG1faW5mb19waW5fc3dpdGNoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwogaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKQEAgLTQ2MSw2ICs0MzksNyBAQAogaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJY29uc3QgY2hhciAqcGluKTsKIGludCBzbmRfc29jX2RhcG1fc3luYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pOworaW50IHNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSk7CiBpbnQgc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCQkJCSAgY29uc3QgY2hhciAqcGluKTsKIGludCBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCkBAIC00NzAsNyArNDQ5LDYgQEAKIHZvaWQgc25kX3NvY19kYXBtX2F1dG9fbmNfY29kZWNfcGlucyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogCiAvKiBNb3N0bHkgaW50ZXJuYWwgLSBzaG91bGQgbm90IG5vcm1hbGx5IGJlIHVzZWQgKi8KLXZvaWQgZGFwbV9tYXJrX2RpcnR5KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBjb25zdCBjaGFyICpyZWFzb24pOwogdm9pZCBkYXBtX21hcmtfaW9fZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKTsKIAogLyogZGFwbSBwYXRoIHF1ZXJ5ICovCkBAIC00ODQsOCArNDYyLDYgQEAKIAlzbmRfc29jX2RhcG1faW5wdXQgPSAwLAkJLyogaW5wdXQgcGluICovCiAJc25kX3NvY19kYXBtX291dHB1dCwJCS8qIG91dHB1dCBwaW4gKi8KIAlzbmRfc29jX2RhcG1fbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KLQlzbmRfc29jX2RhcG1fdmlydF9tdXgsCQkJLyogdmlydHVhbCB2ZXJzaW9uIG9mIHNuZF9zb2NfZGFwbV9tdXggKi8KLQlzbmRfc29jX2RhcG1fdmFsdWVfbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KIAlzbmRfc29jX2RhcG1fbWl4ZXIsCQkJLyogbWl4ZXMgc2V2ZXJhbCBhbmFsb2cgc2lnbmFscyB0b2dldGhlciAqLwogCXNuZF9zb2NfZGFwbV9taXhlcl9uYW1lZF9jdGwsCQkvKiBtaXhlciB3aXRoIG5hbWVkIGNvbnRyb2xzICovCiAJc25kX3NvY19kYXBtX3BnYSwJCQkvKiBwcm9ncmFtbWFibGUgZ2Fpbi9hdHRlbnVhdGlvbiAodm9sdW1lKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggOWEwMDE0Ny4uMGI4MzE2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC00NSw2ICs0NSwxMSBAQAogCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAogCXsucmVnID0geGxyZWcsIC5ycmVnID0geHJyZWcsIC5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAogCS5tYXggPSB4bWF4LCAucGxhdGZvcm1fbWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQorI2RlZmluZSBTT0NfRE9VQkxFX1JfU19WQUxVRSh4bHJlZywgeHJyZWcsIHhzaGlmdCwgeG1pbiwgeG1heCwgeHNpZ25fYml0LCB4aW52ZXJ0KSBcCisJKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCisJey5yZWcgPSB4bHJlZywgLnJyZWcgPSB4cnJlZywgLnNoaWZ0ID0geHNoaWZ0LCAucnNoaWZ0ID0geHNoaWZ0LCBcCisJLm1heCA9IHhtYXgsIC5taW4gPSB4bWluLCAucGxhdGZvcm1fbWF4ID0geG1heCwgLnNpZ25fYml0ID0geHNpZ25fYml0LCBcCisJLmludmVydCA9IHhpbnZlcnR9KQogI2RlZmluZSBTT0NfRE9VQkxFX1JfUkFOR0VfVkFMVUUoeGxyZWcsIHhycmVnLCB4c2hpZnQsIHhtaW4sIHhtYXgsIHhpbnZlcnQpIFwKIAkoKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKIAl7LnJlZyA9IHhscmVnLCAucnJlZyA9IHhycmVnLCAuc2hpZnQgPSB4c2hpZnQsIC5yc2hpZnQgPSB4c2hpZnQsIFwKQEAgLTE1Miw2ICsxNTcsMTUgQEAKIAkJey5yZWcgPSB4cmVnLCAucnJlZyA9IHhycmVnLCBcCiAJCS5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAogCQkubWF4ID0geG1heCwgLm1pbiA9IHhtaW59IH0KKyNkZWZpbmUgU09DX0RPVUJMRV9SX1NfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtaW4sIHhtYXgsIHhzaWduX2JpdCwgeGludmVydCwgdGx2X2FycmF5KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKKwkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAorCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKKwkuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csIC5wdXQgPSBzbmRfc29jX3B1dF92b2xzdywgXAorCS5wcml2YXRlX3ZhbHVlID0gU09DX0RPVUJMRV9SX1NfVkFMVUUocmVnX2xlZnQsIHJlZ19yaWdodCwgeHNoaWZ0LCBcCisJCQkJCSAgICB4bWluLCB4bWF4LCB4c2lnbl9iaXQsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9TOF9UTFYoeG5hbWUsIHhyZWcsIHhtaW4sIHhtYXgsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCkBAIC0xNjIsMzAgKzE3NiwyOCBAQAogCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKIAkJey5yZWcgPSB4cmVnLCAubWluID0geG1pbiwgLm1heCA9IHhtYXgsIFwKIAkJIC5wbGF0Zm9ybV9tYXggPSB4bWF4fSB9Ci0jZGVmaW5lIFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXgsIHh0ZXh0cykgXAorI2RlZmluZSBTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4aXRlbXMsIHh0ZXh0cykgXAogewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAotCS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMsIFwKLQkubWFzayA9IHhtYXggPyByb3VuZHVwX3Bvd19vZl90d28oeG1heCkgLSAxIDogMH0KLSNkZWZpbmUgU09DX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1heCwgeHRleHRzKSBcCi0JU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWF4LCB4dGV4dHMpCi0jZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFQoeG1heCwgeHRleHRzKSBcCi17CS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMgfQotI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCisJLml0ZW1zID0geGl0ZW1zLCAudGV4dHMgPSB4dGV4dHMsIFwKKwkubWFzayA9IHhpdGVtcyA/IHJvdW5kdXBfcG93X29mX3R3byh4aXRlbXMpIC0gMSA6IDB9CisjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRSh4cmVnLCB4c2hpZnQsIHhpdGVtcywgeHRleHRzKSBcCisJU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4aXRlbXMsIHh0ZXh0cykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX0VYVCh4aXRlbXMsIHh0ZXh0cykgXAorewkuaXRlbXMgPSB4aXRlbXMsIC50ZXh0cyA9IHh0ZXh0cyB9CisjZGVmaW5lIFNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4aXRlbXMsIHh0ZXh0cywgeHZhbHVlcykgXAogewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAotCS5tYXNrID0geG1hc2ssIC5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMsIC52YWx1ZXMgPSB4dmFsdWVzfQotI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9TSU5HTEUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCi0JU09DX1ZBTFVFX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKQorCS5tYXNrID0geG1hc2ssIC5pdGVtcyA9IHhpdGVtcywgLnRleHRzID0geHRleHRzLCAudmFsdWVzID0geHZhbHVlc30KKyNkZWZpbmUgU09DX1ZBTFVFX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1hc2ssIHhuaXRtZXMsIHh0ZXh0cywgeHZhbHVlcykgXAorCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHhuaXRtZXMsIHh0ZXh0cywgeHZhbHVlcykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX1ZJUlQoeGl0ZW1zLCB4dGV4dHMpIFwKKwlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCB4aXRlbXMsIHh0ZXh0cykKICNkZWZpbmUgU09DX0VOVU0oeG5hbWUsIHhlbnVtKSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAogCS5nZXQgPSBzbmRfc29jX2dldF9lbnVtX2RvdWJsZSwgLnB1dCA9IHNuZF9zb2NfcHV0X2VudW1fZG91YmxlLCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTSh4bmFtZSwgeGVudW0pIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsXAotCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlLCBcCi0JLnB1dCA9IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlLCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQorCVNPQ19FTlVNKHhuYW1lLCB4ZW51bSkKICNkZWZpbmUgU09DX1NJTkdMRV9FWFQoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCxcCiAJIHhoYW5kbGVyX2dldCwgeGhhbmRsZXJfcHV0KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCkBAIC0yNzIsMTcgKzI4NCwxOSBAQAogICogQVJSQVlfU0laRSBpbnRlcm5hbGx5CiAgKi8KICNkZWZpbmUgU09DX0VOVU1fRE9VQkxFX0RFQ0wobmFtZSwgeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4dGV4dHMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIFwKKwljb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIFwKIAkJCQkJCUFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogI2RlZmluZSBTT0NfRU5VTV9TSU5HTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHh0ZXh0cykgXAogCVNPQ19FTlVNX0RPVUJMRV9ERUNMKG5hbWUsIHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4dGV4dHMpCiAjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChuYW1lLCB4dGV4dHMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh4dGV4dHMpLCB4dGV4dHMpCisJY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hbWUgPSBTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9ET1VCTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4dGV4dHMsIHh2YWx1ZXMpIFwKLQlzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCBcCisJY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hbWUgPSBTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgXAogCQkJCQkJCUFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzLCB4dmFsdWVzKQogI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMsIHh2YWx1ZXMpIFwKIAlTT0NfVkFMVUVfRU5VTV9ET1VCTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cywgeHZhbHVlcykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChuYW1lLCB4dGV4dHMpIFwKKwljb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmFtZSA9IFNPQ19FTlVNX1NJTkdMRV9WSVJUKEFSUkFZX1NJWkUoeHRleHRzKSwgeHRleHRzKQogCiAvKgogICogQ29tcG9uZW50IHByb2JlIGFuZCByZW1vdmUgb3JkZXJpbmcgbGV2ZWxzIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZQpAQCAtMzQwLDEyICszNTQsNiBAQAogCiBleHRlcm4gc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgKnNvY19hYzk3X29wczsKIAotZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSB7Ci0JU05EX1NPQ19JMkMgPSAxLAotCVNORF9TT0NfU1BJLAotCVNORF9TT0NfUkVHTUFQLAotfTsKLQogZW51bSBzbmRfc29jX3BjbV9zdWJjbGFzcyB7CiAJU05EX1NPQ19QQ01fQ0xBU1NfUENNCT0gMCwKIAlTTkRfU09DX1BDTV9DTEFTU19CRQk9IDEsCkBAIC0zOTIsOCArNDAwLDcgQEAKIGludCBzbmRfc29jX2NvZGVjX3dyaXRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgICAgdW5zaWduZWQgaW50IHJlZyk7CiBpbnQgc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBhZGRyX2JpdHMsIGludCBkYXRhX2JpdHMsCi0JCQkgICAgICAgZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sKTsKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOwogaW50IHNuZF9zb2NfY2FjaGVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogaW50IHNuZF9zb2NfY2FjaGVfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogaW50IHNuZF9zb2NfY2FjaGVfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwpAQCAtNDEzLDYgKzQyMCwxMCBAQAogc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCiAJCWNvbnN0IGNoYXIgKmRhaV9saW5rKTsKIAorYm9vbCBzbmRfc29jX3J1bnRpbWVfaWdub3JlX3BtZG93bl90aW1lKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpOwordm9pZCBzbmRfc29jX3J1bnRpbWVfYWN0aXZhdGUoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwgaW50IHN0cmVhbSk7Cit2b2lkIHNuZF9zb2NfcnVudGltZV9kZWFjdGl2YXRlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsIGludCBzdHJlYW0pOworCiAvKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBnZXQgY2xvY2sgcmF0ZXMgZnJvbSB2YXJpb3VzIHRoaW5ncyAqLwogaW50IHNuZF9zb2NfY2FsY19mcmFtZV9zaXplKGludCBzYW1wbGVfc2l6ZSwgaW50IGNoYW5uZWxzLCBpbnQgdGRtX3Nsb3RzKTsKIGludCBzbmRfc29jX3BhcmFtc190b19mcmFtZV9zaXplKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKQEAgLTQ5NiwxMCArNTA3LDYgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19pbmZvX3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwogI2RlZmluZSBzbmRfc29jX2luZm9fYm9vbF9leHQJCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KQEAgLTYwMCw3ICs2MDcsOCBAQAogCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCi0JaW50ICgqamFja19zdGF0dXNfY2hlY2spKHZvaWQpOworCXZvaWQgKmRhdGE7CisJaW50ICgqamFja19zdGF0dXNfY2hlY2spKHZvaWQgKmRhdGEpOwogfTsKIAogc3RydWN0IHNuZF9zb2NfamFjayB7CkBAIC02NTYsMTIgKzY2NCwxOSBAQAogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGlkOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXVuc2lnbmVkIGludCBhY3RpdmU7CisKKwl1bnNpZ25lZCBpbnQgaWdub3JlX3BtZG93bl90aW1lOjE7IC8qIHBtZG93bl90aW1lIGlzIGlnbm9yZWQgYXQgc3RvcCAqLworCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCiAJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydjsKIAlpbnQgbnVtX2RhaTsKIAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgKmRyaXZlcjsKKworCXN0cnVjdCBsaXN0X2hlYWQgZGFpX2xpc3Q7CiB9OwogCiAvKiBTb0MgQXVkaW8gQ29kZWMgZGV2aWNlICovCkBAIC02ODMsNyArNjk4LDYgQEAKIAogCS8qIHJ1bnRpbWUgKi8KIAlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7ICAvKiBmb3IgYWQtaG9jIGFjOTcgZGV2aWNlcyAqLwotCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJdW5zaWduZWQgaW50IGNhY2hlX2J5cGFzczoxOyAvKiBTdXBwcmVzcyBhY2Nlc3MgdG8gdGhlIGNhY2hlICovCiAJdW5zaWduZWQgaW50IHN1c3BlbmRlZDoxOyAvKiBDb2RlYyBpcyBpbiBzdXNwZW5kIFBNIHN0YXRlICovCiAJdW5zaWduZWQgaW50IHByb2JlZDoxOyAvKiBDb2RlYyBoYXMgYmVlbiBwcm9iZWQgKi8KQEAgLTY5Nyw3ICs3MTEsNiBAQAogCS8qIGNvZGVjIElPICovCiAJdm9pZCAqY29udHJvbF9kYXRhOyAvKiBjb2RlYyBjb250cm9sIChpMmMvM3dpcmUpIGRhdGEgKi8KIAlod193cml0ZV90IGh3X3dyaXRlOwotCXVuc2lnbmVkIGludCAoKmh3X3JlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CiAJdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKIAlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogCXZvaWQgKnJlZ19jYWNoZTsKQEAgLTcwOSw3ICs3MjIsNiBAQAogCiAJLyogZGFwbSAqLwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCBkYXBtOwotCXVuc2lnbmVkIGludCBpZ25vcmVfcG1kb3duX3RpbWU6MTsgLyogcG1kb3duX3RpbWUgaXMgaWdub3JlZCBhdCBzdG9wICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NvZGVjX3Jvb3Q7CkBAIC0xMDY3LDYgKzEwNzksNyBAQAogCWludCBtaW4sIG1heCwgcGxhdGZvcm1fbWF4OwogCWludCByZWcsIHJyZWc7CiAJdW5zaWduZWQgaW50IHNoaWZ0LCByc2hpZnQ7CisJdW5zaWduZWQgaW50IHNpZ25fYml0OwogCXVuc2lnbmVkIGludCBpbnZlcnQ6MTsKIAl1bnNpZ25lZCBpbnQgYXV0b2Rpc2FibGU6MTsKIH07CkBAIC0xMDg1LDE2ICsxMDk4LDI4IEBACiAKIC8qIGVudW1lcmF0ZWQga2NvbnRyb2wgKi8KIHN0cnVjdCBzb2NfZW51bSB7Ci0JdW5zaWduZWQgc2hvcnQgcmVnOwotCXVuc2lnbmVkIHNob3J0IHJlZzI7CisJaW50IHJlZzsKIAl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7CiAJdW5zaWduZWQgY2hhciBzaGlmdF9yOwotCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgaW50IGl0ZW1zOwogCXVuc2lnbmVkIGludCBtYXNrOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqdGV4dHM7CiAJY29uc3QgdW5zaWduZWQgaW50ICp2YWx1ZXM7CiB9OwogCisvKioKKyAqIHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKCkgLSBDYXN0cyBhIGNvbXBvbmVudCB0byB0aGUgQ09ERUMgaXQgaXMgZW1iZWRkZWQgaW4KKyAqIEBjb21wb25lbnQ6IFRoZSBjb21wb25lbnQgdG8gY2FzdCB0byBhIENPREVDCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgdXNlZCBvbiBjb21wb25lbnRzIHRoYXQgYXJlIGtub3duIHRvIGJlIENPREVDcy4KKyAqIE90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2NvZGVjICpzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYygKKwlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNvbXBvbmVudCwgc3RydWN0IHNuZF9zb2NfY29kZWMsIGNvbXBvbmVudCk7Cit9CisKIC8qIGNvZGVjIElPICovCiB1bnNpZ25lZCBpbnQgc25kX3NvY19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZyk7CiB1bnNpZ25lZCBpbnQgc25kX3NvY193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCkBAIC0xMTY4LDExICsxMTkzLDUxIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShzdHJ1Y3Qgc29jX2VudW0gKmUsCisJdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghZS0+dmFsdWVzKQorCQlyZXR1cm4gdmFsOworCisJZm9yIChpID0gMDsgaSA8IGUtPml0ZW1zOyBpKyspCisJCWlmICh2YWwgPT0gZS0+dmFsdWVzW2ldKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc25kX3NvY19lbnVtX2l0ZW1fdG9fdmFsKHN0cnVjdCBzb2NfZW51bSAqZSwKKwl1bnNpZ25lZCBpbnQgaXRlbSkKK3sKKwlpZiAoIWUtPnZhbHVlcykKKwkJcmV0dXJuIGl0ZW07CisKKwlyZXR1cm4gZS0+dmFsdWVzW2l0ZW1dOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc25kX3NvY19jb21wb25lbnRfaXNfYWN0aXZlKAorCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXJldHVybiBjb21wb25lbnQtPmFjdGl2ZSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc25kX3NvY19jb2RlY19pc19hY3RpdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfc29jX2NvbXBvbmVudF9pc19hY3RpdmUoJmNvZGVjLT5jb21wb25lbnQpOworfQorCiBpbnQgc25kX3NvY191dGlsX2luaXQodm9pZCk7CiB2b2lkIHNuZF9zb2NfdXRpbF9leGl0KHZvaWQpOwogCiBpbnQgc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSk7CitpbnQgc25kX3NvY19vZl9wYXJzZV9hdWRpb19zaW1wbGVfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAorCQkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lKTsKK2ludCBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNsb3RzLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpzbG90X3dpZHRoKTsKIGludCBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCQkgICBjb25zdCBjaGFyICpwcm9wbmFtZSk7CiB1bnNpZ25lZCBpbnQgc25kX3NvY19vZl9wYXJzZV9kYWlmbXQoc3RydWN0IGRldmljZV9ub2RlICpucCwKQEAgLTExODgsNCArMTI1MywxNSBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc25kX3NvY19wbV9vcHM7CiAKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCit7CisJbXV0ZXhfbG9jaygmZGFwbS0+Y2FyZC0+ZGFwbV9tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKK3sKKwltdXRleF91bmxvY2soJmRhcG0tPmNhcmQtPmRhcG1fbXV0ZXgpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2JjYWNoZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKaW5kZXggNzExMDg5Ny4uYzljM2MwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmNhY2hlLmgKQEAgLTM5OSwyNiArMzk5LDQzIEBACiAKIC8qIEFsbG9jYXRvciAqLwogCi1UUkFDRV9FVkVOVChiY2FjaGVfYWxsb2NfaW52YWxpZGF0ZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgY2FjaGUgKmNhKSwKLQlUUF9BUkdTKGNhKSwKK1RSQUNFX0VWRU5UKGJjYWNoZV9pbnZhbGlkYXRlLAorCVRQX1BST1RPKHN0cnVjdCBjYWNoZSAqY2EsIHNpemVfdCBidWNrZXQpLAorCVRQX0FSR1MoY2EsIGJ1Y2tldCksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlCQkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luYwkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luY19zaXplCQkpCi0JCV9fZmllbGQodW5zaWduZWQsCXVudXNlZAkJCSkKKwkJX19maWVsZCh1bnNpZ25lZCwJc2VjdG9ycwkJCSkKKwkJX19maWVsZChkZXZfdCwJCWRldgkJCSkKKwkJX19maWVsZChfX3U2NCwJCW9mZnNldAkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmZyZWUJCT0gZmlmb191c2VkKCZjYS0+ZnJlZVtSRVNFUlZFX05PTkVdKTsKLQkJX19lbnRyeS0+ZnJlZV9pbmMJPSBmaWZvX3VzZWQoJmNhLT5mcmVlX2luYyk7Ci0JCV9fZW50cnktPmZyZWVfaW5jX3NpemUJPSBjYS0+ZnJlZV9pbmMuc2l6ZTsKLQkJX19lbnRyeS0+dW51c2VkCQk9IGZpZm9fdXNlZCgmY2EtPnVudXNlZCk7CisJCV9fZW50cnktPmRldgkJPSBjYS0+YmRldi0+YmRfZGV2OworCQlfX2VudHJ5LT5vZmZzZXQJCT0gYnVja2V0IDw8IGNhLT5zZXQtPmJ1Y2tldF9iaXRzOworCQlfX2VudHJ5LT5zZWN0b3JzCT0gR0NfU0VDVE9SU19VU0VEKCZjYS0+YnVja2V0c1tidWNrZXRdKTsKIAkpLAogCi0JVFBfcHJpbnRrKCJmcmVlICV1IGZyZWVfaW5jICV1LyV1IHVudXNlZCAldSIsIF9fZW50cnktPmZyZWUsCi0JCSAgX19lbnRyeS0+ZnJlZV9pbmMsIF9fZW50cnktPmZyZWVfaW5jX3NpemUsIF9fZW50cnktPnVudXNlZCkKKwlUUF9wcmludGsoImludmFsaWRhdGVkICV1IHNlY3RvcnMgYXQgJWQsJWQgc2VjdG9yPSVsbHUiLAorCQkgIF9fZW50cnktPnNlY3RvcnMsIE1BSk9SKF9fZW50cnktPmRldiksCisJCSAgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+b2Zmc2V0KQorKTsKKworVFJBQ0VfRVZFTlQoYmNhY2hlX2FsbG9jLAorCVRQX1BST1RPKHN0cnVjdCBjYWNoZSAqY2EsIHNpemVfdCBidWNrZXQpLAorCVRQX0FSR1MoY2EsIGJ1Y2tldCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKF9fdTY0LAkJb2Zmc2V0CQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGNhLT5iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPm9mZnNldAkJPSBidWNrZXQgPDwgY2EtPnNldC0+YnVja2V0X2JpdHM7CisJKSwKKworCVRQX3ByaW50aygiYWxsb2NhdGVkICVkLCVkIHNlY3Rvcj0lbGx1IiwgTUFKT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5vZmZzZXQpCiApOwogCiBUUkFDRV9FVkVOVChiY2FjaGVfYWxsb2NfZmFpbCwKQEAgLTQyNiwyMSArNDQzLDIyIEBACiAJVFBfQVJHUyhjYSwgcmVzZXJ2ZSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGRldl90LAkJZGV2CQkJKQogCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlCQkJKQogCQlfX2ZpZWxkKHVuc2lnbmVkLAlmcmVlX2luYwkJKQotCQlfX2ZpZWxkKHVuc2lnbmVkLAl1bnVzZWQJCQkpCiAJCV9fZmllbGQodW5zaWduZWQsCWJsb2NrZWQJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gY2EtPmJkZXYtPmJkX2RldjsKIAkJX19lbnRyeS0+ZnJlZQkJPSBmaWZvX3VzZWQoJmNhLT5mcmVlW3Jlc2VydmVdKTsKIAkJX19lbnRyeS0+ZnJlZV9pbmMJPSBmaWZvX3VzZWQoJmNhLT5mcmVlX2luYyk7Ci0JCV9fZW50cnktPnVudXNlZAkJPSBmaWZvX3VzZWQoJmNhLT51bnVzZWQpOwogCQlfX2VudHJ5LT5ibG9ja2VkCT0gYXRvbWljX3JlYWQoJmNhLT5zZXQtPnByaW9fYmxvY2tlZCk7CiAJKSwKIAotCVRQX3ByaW50aygiZnJlZSAldSBmcmVlX2luYyAldSB1bnVzZWQgJXUgYmxvY2tlZCAldSIsIF9fZW50cnktPmZyZWUsCi0JCSAgX19lbnRyeS0+ZnJlZV9pbmMsIF9fZW50cnktPnVudXNlZCwgX19lbnRyeS0+YmxvY2tlZCkKKwlUUF9wcmludGsoImFsbG9jIGZhaWwgJWQsJWQgZnJlZSAldSBmcmVlX2luYyAldSBibG9ja2VkICV1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5mcmVlLAorCQkgIF9fZW50cnktPmZyZWVfaW5jLCBfX2VudHJ5LT5ibG9ja2VkKQogKTsKIAogLyogQmFja2dyb3VuZCB3cml0ZWJhY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCmluZGV4IGU3NmFlMTkuLmU4YTVlY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaApAQCAtMTMyLDYgKzEzMiw3IEBACiAgKiBibG9ja19ycV9jb21wbGV0ZSAtIGJsb2NrIElPIG9wZXJhdGlvbiBjb21wbGV0ZWQgYnkgZGV2aWNlIGRyaXZlcgogICogQHE6IHF1ZXVlIGNvbnRhaW5pbmcgdGhlIGJsb2NrIG9wZXJhdGlvbiByZXF1ZXN0CiAgKiBAcnE6IGJsb2NrIG9wZXJhdGlvbnMgcmVxdWVzdAorICogQG5yX2J5dGVzOiBudW1iZXIgb2YgY29tcGxldGVkIGJ5dGVzCiAgKgogICogVGhlIGJsb2NrX3JxX2NvbXBsZXRlIHRyYWNlcG9pbnQgZXZlbnQgaW5kaWNhdGVzIHRoYXQgc29tZSBwb3J0aW9uCiAgKiBvZiBvcGVyYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgdGhlIGRldmljZSBkcml2ZXIuICBJZgpAQCAtMTM5LDExICsxNDAsMzcgQEAKICAqIGRvIGZvciB0aGUgcmVxdWVzdC4gSWYgQHJxLT5iaW8gaXMgbm9uLU5VTEwgdGhlbiB0aGVyZSBpcwogICogYWRkaXRpb25hbCB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LgogICovCi1ERUZJTkVfRVZFTlQoYmxvY2tfcnFfd2l0aF9lcnJvciwgYmxvY2tfcnFfY29tcGxldGUsCitUUkFDRV9FVkVOVChibG9ja19ycV9jb21wbGV0ZSwKIAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAorCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCSB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpLAogCi0JVFBfQVJHUyhxLCBycSkKKwlUUF9BUkdTKHEsIHJxLCBucl9ieXRlcyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCAgZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCggIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoICB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2ZpZWxkKCAgaW50LAkJZXJyb3JzCQkJKQorCQlfX2FycmF5KCAgY2hhciwJCXJ3YnMsCVJXQlNfTEVOCSkKKwkJX19keW5hbWljX2FycmF5KCBjaGFyLAljbWQsCWJsa19jbWRfYnVmX2xlbihycSkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSAgID0gcnEtPnJxX2Rpc2sgPyBkaXNrX2RldnQocnEtPnJxX2Rpc2spIDogMDsKKwkJX19lbnRyeS0+c2VjdG9yICAgID0gYmxrX3JxX3BvcyhycSk7CisJCV9fZW50cnktPm5yX3NlY3RvciA9IG5yX2J5dGVzID4+IDk7CisJCV9fZW50cnktPmVycm9ycyAgICA9IHJxLT5lcnJvcnM7CisKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBycS0+Y21kX2ZsYWdzLCBucl9ieXRlcyk7CisJCWJsa19kdW1wX2NtZChfX2dldF9zdHIoY21kKSwgcnEpOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICglcykgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+cndicywgX19nZXRfc3RyKGNtZCksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcnMpCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGJsb2NrX3JxLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaHN3YWRzcC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaHN3YWRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzhiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9oc3dhZHNwLmgKQEAgLTAsMCArMSwzODQgQEAKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGhzd2Fkc3AKKworI2lmICFkZWZpbmVkKF9UUkFDRV9IU1dBRFNQX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9IU1dBRFNQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK3N0cnVjdCBzc3RfaHN3Oworc3RydWN0IHNzdF9oc3dfc3RyZWFtOworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9mcmVlX3JlcTsKK3N0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxOworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXE7CitzdHJ1Y3Qgc3N0X2hzd19hdWRpb19kYXRhX2Zvcm1hdF9pcGM7CitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHk7CitzdHJ1Y3Qgc3N0X2hzd19pcGNfZGV2aWNlX2NvbmZpZ19yZXE7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1Moc3N0X2lycSwKKworCVRQX1BST1RPKHVpbnQzMl90IHN0YXR1cywgdWludDMyX3QgbWFzayksCisKKwlUUF9BUkdTKHN0YXR1cywgbWFzayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXN0YXR1cwkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCW1hc2sJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnN0YXR1cyA9IHN0YXR1czsKKwkJX19lbnRyeS0+bWFzayA9IG1hc2s7CisJKSwKKworCVRQX3ByaW50aygic3RhdHVzIDB4JTguOHggbWFzayAweCU4Ljh4IiwKKwkJKHVuc2lnbmVkIGludClfX2VudHJ5LT5zdGF0dXMsICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+bWFzaykKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXJxLCBzc3RfaXJxX2J1c3ksCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgc3RhdHVzLCB1bnNpZ25lZCBpbnQgbWFzayksCisKKwlUUF9BUkdTKHN0YXR1cywgbWFzaykKKworKTsKKworREVGSU5FX0VWRU5UKHNzdF9pcnEsIHNzdF9pcnFfZG9uZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzdGF0dXMsIHVuc2lnbmVkIGludCBtYXNrKSwKKworCVRQX0FSR1Moc3RhdHVzLCBtYXNrKQorCispOworCitERUNMQVJFX0VWRU5UX0NMQVNTKGlwYywKKworCVRQX1BST1RPKGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWwpLAorCisJVFBfQVJHUyhuYW1lLCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCW5hbWUJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAl2YWwJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKG5hbWUsIG5hbWUpOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKworCVRQX3ByaW50aygiJXMgMHglOC44eCIsIF9fZ2V0X3N0cihuYW1lKSwgKHVuc2lnbmVkIGludClfX2VudHJ5LT52YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChpcGMsIGlwY19yZXF1ZXN0LAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX3JlcGx5LAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX3BlbmRpbmdfcmVwbHksCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsKSwKKworCVRQX0FSR1MobmFtZSwgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoaXBjLCBpcGNfbm90aWZpY2F0aW9uLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKGlwYywgaXBjX2Vycm9yLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbCksCisKKwlUUF9BUkdTKG5hbWUsIHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzdHJlYW1fcG9zaXRpb24sCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBwb3MpLAorCisJVFBfQVJHUyhpZCwgcG9zKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJaWQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlwb3MJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlkID0gaWQ7CisJCV9fZW50cnktPnBvcyA9IHBvczsKKwkpLAorCisJVFBfcHJpbnRrKCJpZCAlZCBwb3NpdGlvbiAweCV4IiwKKwkJKHVuc2lnbmVkIGludClfX2VudHJ5LT5pZCwgKHVuc2lnbmVkIGludClfX2VudHJ5LT5wb3MpCispOworCitERUZJTkVfRVZFTlQoc3RyZWFtX3Bvc2l0aW9uLCBzdHJlYW1fcmVhZF9wb3NpdGlvbiwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHBvcyksCisKKwlUUF9BUkdTKGlkLCBwb3MpCisKKyk7CisKK0RFRklORV9FVkVOVChzdHJlYW1fcG9zaXRpb24sIHN0cmVhbV93cml0ZV9wb3NpdGlvbiwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHBvcyksCisKKwlUUF9BUkdTKGlkLCBwb3MpCisKKyk7CisKK1RSQUNFX0VWRU5UKGhzd19zdHJlYW1fYnVmZmVyLAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pLAorCisJVFBfQVJHUyhzdHJlYW0pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAlpZAkpCisJCV9fZmllbGQoCWludCwJcHRfYWRkcgkpCisJCV9fZmllbGQoCWludCwJbnVtX3BhZ2VzCSkKKwkJX19maWVsZCgJaW50LAlyaW5nX3NpemUJKQorCQlfX2ZpZWxkKAlpbnQsCXJpbmdfb2Zmc2V0CSkKKwkJX19maWVsZCgJaW50LAlmaXJzdF9wZm4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnB0X2FkZHIgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19wdF9hZGRyZXNzOworCQlfX2VudHJ5LT5udW1fcGFnZXMgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ubnVtX3BhZ2VzOworCQlfX2VudHJ5LT5yaW5nX3NpemUgPSBzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19zaXplOworCQlfX2VudHJ5LT5yaW5nX29mZnNldCA9IHN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5yaW5nX29mZnNldDsKKwkJX19lbnRyeS0+Zmlyc3RfcGZuID0gc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLnJpbmdfZmlyc3RfcGZuOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCByaW5nIGFkZHIgMHgleCBwYWdlcyAlZCBzaXplIDB4JXggb2Zmc2V0IDB4JXggUEZOIDB4JXgiLAorCQkoaW50KSBfX2VudHJ5LT5pZCwgIChpbnQpX19lbnRyeS0+cHRfYWRkciwKKwkJKGludClfX2VudHJ5LT5udW1fcGFnZXMsIChpbnQpX19lbnRyeS0+cmluZ19zaXplLAorCQkoaW50KV9fZW50cnktPnJpbmdfb2Zmc2V0LCAoaW50KV9fZW50cnktPmZpcnN0X3BmbikKKyk7CisKK1RSQUNFX0VWRU5UKGhzd19zdHJlYW1fYWxsb2NfcmVwbHksCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSksCisKKwlUUF9BUkdTKHN0cmVhbSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlkCSkKKwkJX19maWVsZCgJaW50LAlzdHJlYW1faWQJKQorCQlfX2ZpZWxkKAlpbnQsCW1peGVyX2lkCSkKKwkJX19maWVsZCgJaW50LAlwZWFrMAkpCisJCV9fZmllbGQoCWludCwJcGVhazEJKQorCQlfX2ZpZWxkKAlpbnQsCXZvbDAJKQorCQlfX2ZpZWxkKAlpbnQsCXZvbDEJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnN0cmVhbV9pZCA9IHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkOworCQlfX2VudHJ5LT5taXhlcl9pZCA9IHN0cmVhbS0+cmVwbHkubWl4ZXJfaHdfaWQ7CisJCV9fZW50cnktPnBlYWswID0gc3RyZWFtLT5yZXBseS5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMF07CisJCV9fZW50cnktPnBlYWsxID0gc3RyZWFtLT5yZXBseS5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMV07CisJCV9fZW50cnktPnZvbDAgPSBzdHJlYW0tPnJlcGx5LnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzWzBdOworCQlfX2VudHJ5LT52b2wxID0gc3RyZWFtLT5yZXBseS52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkpLAorCisJVFBfcHJpbnRrKCJzdHJlYW0gJWQgaHcgaWQgJWQgbWl4ZXIgJWQgcGVhayAweCV4OjB4JXggdm9sIDB4JXgsMHgleCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAoaW50KSBfX2VudHJ5LT5zdHJlYW1faWQsIChpbnQpX19lbnRyeS0+bWl4ZXJfaWQsCisJCShpbnQpX19lbnRyeS0+cGVhazAsIChpbnQpX19lbnRyeS0+cGVhazEsCisJCShpbnQpX19lbnRyeS0+dm9sMCwgKGludClfX2VudHJ5LT52b2wxKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X21peGVyX2luZm9fcmVwbHksCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHkgKnJlcGx5KSwKKworCVRQX0FSR1MocmVwbHkpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAltaXhlcl9pZAkpCisJCV9fZmllbGQoCWludCwJcGVhazAJKQorCQlfX2ZpZWxkKAlpbnQsCXBlYWsxCSkKKwkJX19maWVsZCgJaW50LAl2b2wwCSkKKwkJX19maWVsZCgJaW50LAl2b2wxCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm1peGVyX2lkID0gcmVwbHktPm1peGVyX2h3X2lkOworCQlfX2VudHJ5LT5wZWFrMCA9IHJlcGx5LT5wZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbMF07CisJCV9fZW50cnktPnBlYWsxID0gcmVwbHktPnBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkJX19lbnRyeS0+dm9sMCA9IHJlcGx5LT52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1swXTsKKwkJX19lbnRyeS0+dm9sMSA9IHJlcGx5LT52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1sxXTsKKwkpLAorCisJVFBfcHJpbnRrKCJtaXhlciBpZCAlZCBwZWFrIDB4JXg6MHgleCB2b2wgMHgleCwweCV4IiwKKwkJKGludClfX2VudHJ5LT5taXhlcl9pZCwKKwkJKGludClfX2VudHJ5LT5wZWFrMCwgKGludClfX2VudHJ5LT5wZWFrMSwKKwkJKGludClfX2VudHJ5LT52b2wwLCAoaW50KV9fZW50cnktPnZvbDEpCispOworCitUUkFDRV9FVkVOVChoc3dfc3RyZWFtX2RhdGFfZm9ybWF0LAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJCXN0cnVjdCBzc3RfaHN3X2F1ZGlvX2RhdGFfZm9ybWF0X2lwYyAqcmVxKSwKKworCVRQX0FSR1Moc3RyZWFtLCByZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdWludDMyX3QsCWlkCSkKKwkJX19maWVsZCgJdWludDMyX3QsCWZyZXF1ZW5jeQkpCisJCV9fZmllbGQoCXVpbnQzMl90LAliaXRkZXB0aAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAltYXAJKQorCQlfX2ZpZWxkKAl1aW50MzJfdCwJY29uZmlnCSkKKwkJX19maWVsZCgJdWludDMyX3QsCXN0eWxlCSkKKwkJX19maWVsZCgJdWludDhfdCwJY2hfbnVtCSkKKwkJX19maWVsZCgJdWludDhfdCwJdmFsaWRfYml0CSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlkID0gc3RyZWFtLT5ob3N0X2lkOworCQlfX2VudHJ5LT5mcmVxdWVuY3kgPSByZXEtPmZyZXF1ZW5jeTsKKwkJX19lbnRyeS0+Yml0ZGVwdGggPSByZXEtPmJpdGRlcHRoOworCQlfX2VudHJ5LT5tYXAgPSByZXEtPm1hcDsKKwkJX19lbnRyeS0+Y29uZmlnID0gcmVxLT5jb25maWc7CisJCV9fZW50cnktPnN0eWxlID0gcmVxLT5zdHlsZTsKKwkJX19lbnRyeS0+Y2hfbnVtID0gcmVxLT5jaF9udW07CisJCV9fZW50cnktPnZhbGlkX2JpdCA9IHJlcS0+dmFsaWRfYml0OworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBmcmVxICVkIGRlcHRoICVkIG1hcCAweCV4IGNvbmZpZyAweCV4IHN0eWxlIDB4JXggY2ggJWQgYml0cyAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDMyX3QpX19lbnRyeS0+ZnJlcXVlbmN5LAorCQkodWludDMyX3QpX19lbnRyeS0+Yml0ZGVwdGgsICh1aW50MzJfdClfX2VudHJ5LT5tYXAsCisJCSh1aW50MzJfdClfX2VudHJ5LT5jb25maWcsICh1aW50MzJfdClfX2VudHJ5LT5zdHlsZSwKKwkJKHVpbnQ4X3QpX19lbnRyeS0+Y2hfbnVtLCAodWludDhfdClfX2VudHJ5LT52YWxpZF9iaXQpCispOworCitUUkFDRV9FVkVOVChoc3dfc3RyZWFtX2FsbG9jX3JlcXVlc3QsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwkJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXEgKnJlcSksCisKKwlUUF9BUkdTKHN0cmVhbSwgcmVxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVpbnQzMl90LAlpZAkpCisJCV9fZmllbGQoCXVpbnQ4X3QsCXBhdGhfaWQJKQorCQlfX2ZpZWxkKAl1aW50OF90LAlzdHJlYW1fdHlwZQkpCisJCV9fZmllbGQoCXVpbnQ4X3QsCWZvcm1hdF9pZAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pZCA9IHN0cmVhbS0+aG9zdF9pZDsKKwkJX19lbnRyeS0+cGF0aF9pZCA9IHJlcS0+cGF0aF9pZDsKKwkJX19lbnRyeS0+c3RyZWFtX3R5cGUgPSByZXEtPnN0cmVhbV90eXBlOworCQlfX2VudHJ5LT5mb3JtYXRfaWQgPSByZXEtPmZvcm1hdF9pZDsKKwkpLAorCisJVFBfcHJpbnRrKCJzdHJlYW0gJWQgcGF0aCAlZCB0eXBlICVkIGZvcm1hdCAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDhfdClfX2VudHJ5LT5wYXRoX2lkLAorCQkodWludDhfdClfX2VudHJ5LT5zdHJlYW1fdHlwZSwgKHVpbnQ4X3QpX19lbnRyeS0+Zm9ybWF0X2lkKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X3N0cmVhbV9mcmVlX3JlcSwKKworCVRQX1BST1RPKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxICpyZXEpLAorCisJVFBfQVJHUyhzdHJlYW0sIHJlcSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlkCSkKKwkJX19maWVsZCgJaW50LAlzdHJlYW1faWQJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aWQgPSBzdHJlYW0tPmhvc3RfaWQ7CisJCV9fZW50cnktPnN0cmVhbV9pZCA9IHJlcS0+c3RyZWFtX2lkOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBodyBpZCAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAoaW50KSBfX2VudHJ5LT5zdHJlYW1faWQpCispOworCitUUkFDRV9FVkVOVChoc3dfdm9sdW1lX3JlcSwKKworCVRQX1BST1RPKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCQlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSAqcmVxKSwKKworCVRQX0FSR1Moc3RyZWFtLCByZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAlpZAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAljaGFubmVsCSkKKwkJX19maWVsZCgJdWludDMyX3QsCXRhcmdldF92b2x1bWUJKQorCQlfX2ZpZWxkKAl1aW50NjRfdCwJY3VydmVfZHVyYXRpb24JKQorCQlfX2ZpZWxkKAl1aW50MzJfdCwJY3VydmVfdHlwZQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pZCA9IHN0cmVhbS0+aG9zdF9pZDsKKwkJX19lbnRyeS0+Y2hhbm5lbCA9IHJlcS0+Y2hhbm5lbDsKKwkJX19lbnRyeS0+dGFyZ2V0X3ZvbHVtZSA9IHJlcS0+dGFyZ2V0X3ZvbHVtZTsKKwkJX19lbnRyeS0+Y3VydmVfZHVyYXRpb24gPSByZXEtPmN1cnZlX2R1cmF0aW9uOworCQlfX2VudHJ5LT5jdXJ2ZV90eXBlID0gcmVxLT5jdXJ2ZV90eXBlOworCSksCisKKwlUUF9wcmludGsoInN0cmVhbSAlZCBjaGFuIDB4JXggdm9sICVkIGR1cmF0aW9uICVsbHUgdHlwZSAlZCIsCisJCShpbnQpIF9fZW50cnktPmlkLCAodWludDMyX3QpIF9fZW50cnktPmNoYW5uZWwsCisJCSh1aW50MzJfdClfX2VudHJ5LT50YXJnZXRfdm9sdW1lLAorCQkodWludDY0X3QpX19lbnRyeS0+Y3VydmVfZHVyYXRpb24sCisJCSh1aW50MzJfdClfX2VudHJ5LT5jdXJ2ZV90eXBlKQorKTsKKworVFJBQ0VfRVZFTlQoaHN3X2RldmljZV9jb25maWdfcmVxLAorCisJVFBfUFJPVE8oc3RydWN0IHNzdF9oc3dfaXBjX2RldmljZV9jb25maWdfcmVxICpyZXEpLAorCisJVFBfQVJHUyhyZXEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdWludDMyX3QsCXNzcAkpCisJCV9fZmllbGQoCXVpbnQzMl90LAljbG9ja19mcmVxCSkKKwkJX19maWVsZCgJdWludDMyX3QsCW1vZGUJKQorCQlfX2ZpZWxkKAl1aW50MTZfdCwJY2xvY2tfZGl2aWRlcgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5zc3AgPSByZXEtPnNzcF9pbnRlcmZhY2U7CisJCV9fZW50cnktPmNsb2NrX2ZyZXEgPSByZXEtPmNsb2NrX2ZyZXF1ZW5jeTsKKwkJX19lbnRyeS0+bW9kZSA9IHJlcS0+bW9kZTsKKwkJX19lbnRyeS0+Y2xvY2tfZGl2aWRlciA9IHJlcS0+Y2xvY2tfZGl2aWRlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJTU1AgJWQgRnJlcSAlZCBtb2RlICVkIGRpdiAlZCIsCisJCSh1aW50MzJfdClfX2VudHJ5LT5zc3AsCisJCSh1aW50MzJfdClfX2VudHJ5LT5jbG9ja19mcmVxLCAodWludDMyX3QpX19lbnRyeS0+bW9kZSwKKwkJKHVpbnQzMl90KV9fZW50cnktPmNsb2NrX2RpdmlkZXIpCispOworCisjZW5kaWYgLyogX1RSQUNFX0hTV0FEU1BfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaW50ZWwtc3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNzJkMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oCkBAIC0wLDAgKzEsMTQ4IEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBpbnRlbC1zc3QKKworI2lmICFkZWZpbmVkKF9UUkFDRV9JTlRFTF9TU1RfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0lOVEVMX1NTVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCitERUNMQVJFX0VWRU5UX0NMQVNTKHNzdF9pcGNfbXNnLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKHZhbCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXZhbAkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCSksCisKKwlUUF9wcmludGsoIjB4JTguOHgiLCAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21zZywgc3N0X2lwY19tc2dfdHgsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1ModmFsKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tc2csIHNzdF9pcGNfbXNnX3J4LAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzc3RfaXBjX21haWxib3gsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlvZmZzZXQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAl2YWwJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm9mZnNldCA9IG9mZnNldDsKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCSksCisKKwlUUF9wcmludGsoIiAweCU0LjR4ID0gMHglOC44eCIsCisJCSh1bnNpZ25lZCBpbnQpX19lbnRyeS0+b2Zmc2V0LCAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfaW5ib3hfcmRhdGEsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfaW5ib3hfd2RhdGEsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1Mob2Zmc2V0LCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3gsIHNzdF9pcGNfb3V0Ym94X3JkYXRhLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKG9mZnNldCwgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tYWlsYm94LCBzc3RfaXBjX291dGJveF93ZGF0YSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhvZmZzZXQsIHZhbCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzc3RfaXBjX21haWxib3hfaW5mbywKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXNpemUJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnNpemUgPSBzaXplOworCSksCisKKwlUUF9wcmludGsoIk1haWxib3ggYnl0ZXMgMHglOC44eCIsICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+c2l6ZSkKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3hfaW5mbywgc3N0X2lwY19pbmJveF9yZWFkLAorCisJVFBfUFJPVE8odW5zaWduZWQgaW50IHNpemUpLAorCisJVFBfQVJHUyhzaXplKQorCispOworCitERUZJTkVfRVZFTlQoc3N0X2lwY19tYWlsYm94X2luZm8sIHNzdF9pcGNfaW5ib3hfd3JpdGUsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgc2l6ZSksCisKKwlUUF9BUkdTKHNpemUpCisKKyk7CisKK0RFRklORV9FVkVOVChzc3RfaXBjX21haWxib3hfaW5mbywgc3N0X2lwY19vdXRib3hfcmVhZCwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSkKKworKTsKKworREVGSU5FX0VWRU5UKHNzdF9pcGNfbWFpbGJveF9pbmZvLCBzc3RfaXBjX291dGJveF93cml0ZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBzaXplKSwKKworCVRQX0FSR1Moc2l6ZSkKKworKTsKKworI2VuZGlmIC8qIF9UUkFDRV9TU1RfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZnRyYWNlLmggYi9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oCmluZGV4IDFhOGIyOGQuLjFlZTE5YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZnRyYWNlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaApAQCAtMzEwLDE1ICszMTAsMTIgQEAKICN1bmRlZiBfX2FycmF5CiAjZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKLQkJbXV0ZXhfbG9jaygmZXZlbnRfc3RvcmFnZV9tdXRleCk7CQkJXAorCQljaGFyICp0eXBlX3N0ciA9ICN0eXBlIlsiX19zdHJpbmdpZnkobGVuKSJdIjsJCVwKIAkJQlVJTERfQlVHX09OKGxlbiA+IE1BWF9GSUxURVJfU1RSX1ZBTCk7CQkJXAotCQlzbnByaW50ZihldmVudF9zdG9yYWdlLCBzaXplb2YoZXZlbnRfc3RvcmFnZSksCQlcCi0JCQkgIiVzWyVkXSIsICN0eXBlLCBsZW4pOwkJCQlcCi0JCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCBldmVudF9zdG9yYWdlLCAjaXRlbSwgXAorCQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgdHlwZV9zdHIsICNpdGVtLAlcCiAJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAogCQkJCSBzaXplb2YoZmllbGQuaXRlbSksCQkJXAogCQkJCSBpc19zaWduZWRfdHlwZSh0eXBlKSwgRklMVEVSX09USEVSKTsJXAotCQltdXRleF91bmxvY2soJmV2ZW50X3N0b3JhZ2VfbXV0ZXgpOwkJCVwKIAkJaWYgKHJldCkJCQkJCQlcCiAJCQlyZXR1cm4gcmV0OwkJCQkJXAogCX0gd2hpbGUgKDApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3VuaXN0ZC5oIGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3VuaXN0ZC5oCmluZGV4IGRkZTgwNDEuLjZkYjY2NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvdW5pc3RkLmgKQEAgLTE5MSw2ICsxOTEsNyBAQAogCiAvKiBmcy9yZWFkZGlyLmMgKi8KICNkZWZpbmUgX19OUl9nZXRkZW50czY0IDYxCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfR0VUREVOVFM2NAogX19TQ19DT01QKF9fTlJfZ2V0ZGVudHM2NCwgc3lzX2dldGRlbnRzNjQsIGNvbXBhdF9zeXNfZ2V0ZGVudHM2NCkKIAogLyogZnMvcmVhZF93cml0ZS5jICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkIGIvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZAppbmRleCAzY2UyNWI1Li42OTI5NTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKQEAgLTEzOSw2ICsxMzksNyBAQAogaGVhZGVyLXkgKz0gaGlkZGV2LmgKIGhlYWRlci15ICs9IGhpZHJhdy5oCiBoZWFkZXIteSArPSBocGV0LmgKK2hlYWRlci15ICs9IGh5cGVydi5oCiBoZWFkZXIteSArPSBoeXNkbl9pZi5oCiBoZWFkZXIteSArPSBpMmMtZGV2LmgKIGhlYWRlci15ICs9IGkyYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaHlwZXJ2LmggYi9pbmNsdWRlL3VhcGkvbGludXgvaHlwZXJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlYjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9oeXBlcnYuaApAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogQXV0aG9yczoKKyAqICAgSGFpeWFuZyBaaGFuZyA8aGFpeWFuZ3pAbWljcm9zb2Z0LmNvbT4KKyAqICAgSGFuayBKYW5zc2VuICA8aGphbnNzZW5AbWljcm9zb2Z0LmNvbT4KKyAqICAgSy4gWS4gU3Jpbml2YXNhbiA8a3lzQG1pY3Jvc29mdC5jb20+CisgKgorICovCisKKyNpZm5kZWYgX1VBUElfSFlQRVJWX0gKKyNkZWZpbmUgX1VBUElfSFlQRVJWX0gKKworI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKworLyoKKyAqIEZyYW1ld29yayB2ZXJzaW9uIGZvciB1dGlsIHNlcnZpY2VzLgorICovCisjZGVmaW5lIFVUSUxfRldfTUlOT1IgIDAKKworI2RlZmluZSBVVElMX1dTMks4X0ZXX01BSk9SICAxCisjZGVmaW5lIFVUSUxfV1MySzhfRldfVkVSU0lPTiAgICAgKFVUSUxfV1MySzhfRldfTUFKT1IgPDwgMTYgfCBVVElMX0ZXX01JTk9SKQorCisjZGVmaW5lIFVUSUxfRldfTUFKT1IgIDMKKyNkZWZpbmUgVVRJTF9GV19WRVJTSU9OICAgICAoVVRJTF9GV19NQUpPUiA8PCAxNiB8IFVUSUxfRldfTUlOT1IpCisKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGhvc3QgY29udHJvbGxlZCBzbmFwc2hvdCBvZiB0aGUgZ3Vlc3QuCisgKi8KKworI2RlZmluZSBWU1NfT1BfUkVHSVNURVIgMTI4CisKK2VudW0gaHZfdnNzX29wIHsKKwlWU1NfT1BfQ1JFQVRFID0gMCwKKwlWU1NfT1BfREVMRVRFLAorCVZTU19PUF9IT1RfQkFDS1VQLAorCVZTU19PUF9HRVRfRE1fSU5GTywKKwlWU1NfT1BfQlVfQ09NUExFVEUsCisJLyoKKwkgKiBGb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCBJQyB2ZXJzaW9uID49IDUuMAorCSAqLworCVZTU19PUF9GUkVFWkUsIC8qIEZyZWV6ZSB0aGUgZmlsZSBzeXN0ZW1zIGluIHRoZSBWTSAqLworCVZTU19PUF9USEFXLCAvKiBVbmZyZWV6ZSB0aGUgZmlsZSBzeXN0ZW1zICovCisJVlNTX09QX0FVVE9fUkVDT1ZFUiwKKwlWU1NfT1BfQ09VTlQgLyogTnVtYmVyIG9mIG9wZXJhdGlvbnMsIG11c3QgYmUgbGFzdCAqLworfTsKKworCisvKgorICogSGVhZGVyIGZvciBhbGwgVlNTIG1lc3NhZ2VzLgorICovCitzdHJ1Y3QgaHZfdnNzX2hkciB7CisJX191OCBvcGVyYXRpb247CisJX191OCByZXNlcnZlZFs3XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoKKyAqIEZsYWcgdmFsdWVzIGZvciB0aGUgaHZfdnNzX2NoZWNrX2ZlYXR1cmUuIExpbnV4IHN1cHBvcnRzIG9ubHkKKyAqIG9uZSB2YWx1ZS4KKyAqLworI2RlZmluZSBWU1NfSEJVX05PX0FVVE9fUkVDT1ZFUlkJMHgwMDAwMDAwNQorCitzdHJ1Y3QgaHZfdnNzX2NoZWNrX2ZlYXR1cmUgeworCV9fdTMyIGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X3Zzc19jaGVja19kbV9pbmZvIHsKKwlfX3UzMiBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodl92c3NfbXNnIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBodl92c3NfaGRyIHZzc19oZHI7CisJCWludCBlcnJvcjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IGh2X3Zzc19jaGVja19mZWF0dXJlIHZzc19jZjsKKwkJc3RydWN0IGh2X3Zzc19jaGVja19kbV9pbmZvIGRtX2luZm87CisJfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGhvc3QgdG8gZ3Vlc3QgY29weSBmYWNpbGl0eS4KKyAqLworCisjZGVmaW5lIEZDT1BZX1ZFUlNJT05fMCAwCisjZGVmaW5lIEZDT1BZX0NVUlJFTlRfVkVSU0lPTiBGQ09QWV9WRVJTSU9OXzAKKyNkZWZpbmUgV19NQVhfUEFUSCAyNjAKKworZW51bSBodl9mY29weV9vcCB7CisJU1RBUlRfRklMRV9DT1BZID0gMCwKKwlXUklURV9UT19GSUxFLAorCUNPTVBMRVRFX0ZDT1BZLAorCUNBTkNFTF9GQ09QWSwKK307CisKK3N0cnVjdCBodl9mY29weV9oZHIgeworCV9fdTMyIG9wZXJhdGlvbjsKKwl1dWlkX2xlIHNlcnZpY2VfaWQwOyAvKiBjdXJyZW50bHkgdW51c2VkICovCisJdXVpZF9sZSBzZXJ2aWNlX2lkMTsgLyogY3VycmVudGx5IHVudXNlZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBPVkVSX1dSSVRFCTB4MQorI2RlZmluZSBDUkVBVEVfUEFUSAkweDIKKworc3RydWN0IGh2X3N0YXJ0X2Zjb3B5IHsKKwlzdHJ1Y3QgaHZfZmNvcHlfaGRyIGhkcjsKKwlfX3UxNiBmaWxlX25hbWVbV19NQVhfUEFUSF07CisJX191MTYgcGF0aF9uYW1lW1dfTUFYX1BBVEhdOworCV9fdTMyIGNvcHlfZmxhZ3M7CisJX191NjQgZmlsZV9zaXplOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZSBmaWxlIGlzIGNodW5rZWQgaW50byBmcmFnbWVudHMuCisgKi8KKyNkZWZpbmUgREFUQV9GUkFHTUVOVAkoNiAqIDEwMjQpCisKK3N0cnVjdCBodl9kb19mY29weSB7CisJc3RydWN0IGh2X2Zjb3B5X2hkciBoZHI7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191OAlkYXRhW0RBVEFfRlJBR01FTlRdOworfTsKKworLyoKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEh5cGVyViBrZXkgdmFsdWUgcGFpciAoS1ZQKSBmdW5jdGlvbmFsaXR5IGZvciBMaW51eC4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBOb3ZlbGwsIEluYy4KKyAqIEF1dGhvciA6IEsuIFkuIFNyaW5pdmFzYW4gPGtzcmluaXZhc2FuQG5vdmVsbC5jb20+CisgKgorICovCisKKy8qCisgKiBNYXhpbXVtIHZhbHVlIHNpemUgLSB1c2VkIGZvciBib3RoIGtleSBuYW1lcyBhbmQgdmFsdWUgZGF0YSwgYW5kIGluY2x1ZGVzCisgKiBhbnkgYXBwbGljYWJsZSBOVUxMIHRlcm1pbmF0b3JzLgorICoKKyAqIE5vdGU6ICBUaGlzIGxpbWl0IGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGZhbGxzIGVhc2lseSB3aXRoaW4gd2hhdCBpcworICogc3VwcG9ydGVkIGZvciBhbGwgbmF0aXZlIGd1ZXN0cyAoYmFjayB0byBXaW4gMjAwMCkgYW5kIHdoYXQgaXMgcmVhc29uYWJsZQorICogZm9yIHRoZSBJQyBLVlAgZXhjaGFuZ2UgZnVuY3Rpb25hbGl0eS4gIE5vdGUgdGhhdCBXaW5kb3dzIE1lLzk4Lzk1IGFyZQorICogbGltaXRlZCB0byAyNTUgY2hhcmFjdGVyIGtleSBuYW1lcy4KKyAqCisgKiBNU0ROIHJlY29tbWVuZHMgbm90IHN0b3JpbmcgZGF0YSB2YWx1ZXMgbGFyZ2VyIHRoYW4gMjA0OCBieXRlcyBpbiB0aGUKKyAqIHJlZ2lzdHJ5LgorICoKKyAqIE5vdGU6ICBUaGlzIHZhbHVlIGlzIHVzZWQgaW4gZGVmaW5pbmcgdGhlIEtWUCBleGNoYW5nZSBtZXNzYWdlIC0gdGhpcyB2YWx1ZQorICogY2Fubm90IGJlIG1vZGlmaWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBtZXNzYWdlIHNpemUgYW5kIGNvbXBhdGliaWxpdHkuCisgKi8KKworLyoKKyAqIGJ5dGVzLCBpbmNsdWRpbmcgYW55IG51bGwgdGVybWluYXRvcnMKKyAqLworI2RlZmluZSBIVl9LVlBfRVhDSEFOR0VfTUFYX1ZBTFVFX1NJWkUgICAgICAgICAgKDIwNDgpCisKKworLyoKKyAqIE1heGltdW0ga2V5IHNpemUgLSB0aGUgcmVnaXN0cnkgbGltaXQgZm9yIHRoZSBsZW5ndGggb2YgYW4gZW50cnkgbmFtZQorICogaXMgMjU2IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgbnVsbCB0ZXJtaW5hdG9yCisgKi8KKworI2RlZmluZSBIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFICAgICAgICAgICAgKDUxMikKKworLyoKKyAqIEluIExpbnV4LCB3ZSBpbXBsZW1lbnQgdGhlIEtWUCBmdW5jdGlvbmFsaXR5IGluIHR3byBjb21wb25lbnRzOgorICogMSkgVGhlIGtlcm5lbCBjb21wb25lbnQgd2hpY2ggaXMgcGFja2FnZWQgYXMgcGFydCBvZiB0aGUgaHZfdXRpbHMgZHJpdmVyCisgKiBpcyByZXNwb25zaWJsZSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBob3N0IGFuZCByZXNwb25zaWJsZSBmb3IKKyAqIGltcGxlbWVudGluZyB0aGUgaG9zdC9ndWVzdCBwcm90b2NvbC4gMikgQSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0IGlzCisgKiByZXNwb25zaWJsZSBmb3IgZGF0YSBnYXRoZXJpbmcuCisgKgorICogSG9zdC9HdWVzdCBQcm90b2NvbDogVGhlIGhvc3QgaXRlcmF0ZXMgb3ZlciBhbiBpbmRleCBhbmQgZXhwZWN0cyB0aGUgZ3Vlc3QKKyAqIHRvIGFzc2lnbiBhIGtleSBuYW1lIHRvIHRoZSBpbmRleCBhbmQgYWxzbyByZXR1cm4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8KKyAqIHRoZSBrZXkuIFRoZSBob3N0IHdpbGwgaGF2ZSBhdG1vc3Qgb25lIEtWUCB0cmFuc2FjdGlvbiBvdXRzdGFuZGluZyBhdCBhbnkKKyAqIGdpdmVuIHBvaW50IGluIHRpbWUuIFRoZSBob3N0IHNpZGUgaXRlcmF0aW9uIHN0b3BzIHdoZW4gdGhlIGd1ZXN0IHJldHVybnMKKyAqIGFuIGVycm9yLiBNaWNyb3NvZnQgaGFzIHNwZWNpZmllZCB0aGUgZm9sbG93aW5nIG1hcHBpbmcgb2Yga2V5IG5hbWVzIHRvCisgKiBob3N0IHNwZWNpZmllZCBpbmRleDoKKyAqCisgKglJbmRleAkJS2V5IE5hbWUKKyAqCTAJCUZ1bGx5UXVhbGlmaWVkRG9tYWluTmFtZQorICoJMQkJSW50ZWdyYXRpb25TZXJ2aWNlc1ZlcnNpb24KKyAqCTIJCU5ldHdvcmtBZGRyZXNzSVB2NAorICoJMwkJTmV0d29ya0FkZHJlc3NJUHY2CisgKgk0CQlPU0J1aWxkTnVtYmVyCisgKgk1CQlPU05hbWUKKyAqCTYJCU9TTWFqb3JWZXJzaW9uCisgKgk3CQlPU01pbm9yVmVyc2lvbgorICoJOAkJT1NWZXJzaW9uCisgKgk5CQlQcm9jZXNzb3JBcmNoaXRlY3R1cmUKKyAqCisgKiBUaGUgV2luZG93cyBob3N0IGV4cGVjdHMgdGhlIEtleSBOYW1lIGFuZCBLZXkgVmFsdWUgdG8gYmUgZW5jb2RlZCBpbiB1dGYxNi4KKyAqCisgKiBHdWVzdCBLZXJuZWwvS1ZQIERhZW1vbiBQcm90b2NvbDogQXMgbm90ZWQgZWFybGllciwgd2UgaW1wbGVtZW50IGFsbCBvZiB0aGUKKyAqIGRhdGEgZ2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHkgaW4gYSB1c2VyIG1vZGUgZGFlbW9uLiBUaGUgdXNlciBsZXZlbCBkYWVtb24KKyAqIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGJpbmRpbmcgdGhlIGtleSBuYW1lIHRvIHRoZSBpbmRleCBhcyB3ZWxsLiBUaGUKKyAqIGtlcm5lbCBhbmQgdXNlci1sZXZlbCBkYWVtb24gY29tbXVuaWNhdGUgdXNpbmcgYSBjb25uZWN0b3IgY2hhbm5lbC4KKyAqCisgKiBUaGUgdXNlciBtb2RlIGNvbXBvbmVudCBmaXJzdCByZWdpc3RlcnMgd2l0aCB0aGUKKyAqIHRoZSBrZXJuZWwgY29tcG9uZW50LiBTdWJzZXF1ZW50bHksIHRoZSBrZXJuZWwgY29tcG9uZW50IHJlcXVlc3RzLCBkYXRhCisgKiBmb3IgdGhlIHNwZWNpZmllZCBrZXlzLiBJbiByZXNwb25zZSB0byB0aGlzIG1lc3NhZ2UgdGhlIHVzZXIgbW9kZSBjb21wb25lbnQKKyAqIGZpbGxzIGluIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQga2V5LiBXZSBvdmVybG9hZCB0aGUKKyAqIHNlcXVlbmNlIGZpZWxkIGluIHRoZSBjbl9tc2cgaGVhZGVyIHRvIGRlZmluZSBvdXIgS1ZQIG1lc3NhZ2UgdHlwZXMuCisgKgorICoKKyAqIFRoZSBrZXJuZWwgY29tcG9uZW50IHNpbXBseSBhY3RzIGFzIGEgY29uZHVpdCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQorICogV2luZG93cyBob3N0IGFuZCB0aGUgdXNlci1sZXZlbCBkYWVtb24uIFRoZSBrZXJuZWwgY29tcG9uZW50IHBhc3NlcyB1cCB0aGUKKyAqIGluZGV4IHJlY2VpdmVkIGZyb20gdGhlIEhvc3QgdG8gdGhlIHVzZXItbGV2ZWwgZGFlbW9uLiBJZiB0aGUgaW5kZXggaXMKKyAqIHZhbGlkIChzdXBwb3J0ZWQpLCB0aGUgY29ycmVzcG9uZGluZyBrZXkgYXMgd2VsbCBhcyBpdHMKKyAqIHZhbHVlIChib3RoIGFyZSBzdHJpbmdzKSBpcyByZXR1cm5lZC4gSWYgdGhlIGluZGV4IGlzIGludmFsaWQKKyAqIChub3Qgc3VwcG9ydGVkKSwgYSBOVUxMIGtleSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgKi8KKworCisvKgorICogUmVnaXN0cnkgdmFsdWUgdHlwZXMuCisgKi8KKworI2RlZmluZSBSRUdfU1ogMQorI2RlZmluZSBSRUdfVTMyIDQKKyNkZWZpbmUgUkVHX1U2NCA4CisKKy8qCisgKiBBcyB3ZSBsb29rIGF0IGV4cGFuZGluZyB0aGUgS1ZQIGZ1bmN0aW9uYWxpdHkgdG8gaW5jbHVkZQorICogSVAgaW5qZWN0aW9uIGZ1bmN0aW9uYWxpdHksIHdlIG5lZWQgdG8gbWFpbnRhaW4gYmluYXJ5CisgKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgZGFlbW9ucy4KKyAqCisgKiBUaGUgS1ZQIG9wY29kZXMgYXJlIGRlZmluZWQgYnkgdGhlIGhvc3QgYW5kIGl0IHdhcyB1bmZvcnR1bmF0ZQorICogdGhhdCBJIGNob3NlIHRvIHRyZWF0IHRoZSByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGFzIHBhcnQgb2YgdGhlCisgKiBLVlAgb3BlcmF0aW9ucyBkZWZpbmVkIGJ5IHRoZSBob3N0LgorICogSGVyZSBpcyB0aGUgbGV2ZWwgb2YgY29tcGF0aWJpbGl0eQorICogKGJldHdlZW4gdGhlIHVzZXIgbGV2ZWwgZGFlbW9uIGFuZCB0aGUga2VybmVsIEtWUCBkcml2ZXIpIHRoYXQgd2UKKyAqIHdpbGwgaW1wbGVtZW50OgorICoKKyAqIEFuIG9sZGVyIGRhZW1vbiB3aWxsIGFsd2F5cyBiZSBzdXBwb3J0ZWQgb24gYSBuZXdlciBkcml2ZXIuCisgKiBBIGdpdmVuIHVzZXIgbGV2ZWwgZGFlbW9uIHdpbGwgcmVxdWlyZSBhIG1pbmltYWwgdmVyc2lvbiBvZiB0aGUKKyAqIGtlcm5lbCBkcml2ZXIuCisgKiBJZiB3ZSBjYW5ub3QgaGFuZGxlIHRoZSB2ZXJzaW9uIGRpZmZlcmVuY2VzLCB3ZSB3aWxsIGZhaWwgZ3JhY2VmdWxseQorICogKHRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGhhdmUgYSB1c2VyIGxldmVsIGRhZW1vbiB0aGF0IGlzIG1vcmUKKyAqIGFkdmFuY2VkIHRoYW4gdGhlIEtWUCBkcml2ZXIuCisgKgorICogV2Ugd2lsbCB1c2UgdmFsdWVzIHVzZWQgaW4gdGhpcyBoYW5kc2hha2UgZm9yIGRldGVybWluaW5nIGlmIHdlIGhhdmUKKyAqIHdvcmthYmxlIHVzZXIgbGV2ZWwgZGFlbW9uIGFuZCB0aGUga2VybmVsIGRyaXZlci4gV2UgYmVnaW4gYnkgdGFraW5nIHRoZQorICogcmVnaXN0cmF0aW9uIG9wY29kZSBvdXQgb2YgdGhlIEtWUCBvcGNvZGUgbmFtZXNwYWNlLiBXZSB3aWxsIGhvd2V2ZXIsCisgKiBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGV4aXN0aW5nIHVzZXItbGV2ZWwgZGFlbW9uIGNvZGUuCisgKi8KKworLyoKKyAqIERhZW1vbiBjb2RlIG5vdCBzdXBwb3J0aW5nIElQIGluamVjdGlvbiAobGVnYWN5IGRhZW1vbikuCisgKi8KKworI2RlZmluZSBLVlBfT1BfUkVHSVNURVIJNAorCisvKgorICogRGFlbW9uIGNvZGUgc3VwcG9ydGluZyBJUCBpbmplY3Rpb24uCisgKiBUaGUgS1ZQIG9wY29kZSBmaWVsZCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHRoZQorICogcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uOyBzbyBkZWZpbmUgYSBuYW1lc3BhY2UgdGhhdAorICogd2lsbCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBob3N0IGRlZmluZWQgS1ZQIG9wY29kZS4KKyAqLworCisjZGVmaW5lIEtWUF9PUF9SRUdJU1RFUjEgMTAwCisKK2VudW0gaHZfa3ZwX2V4Y2hnX29wIHsKKwlLVlBfT1BfR0VUID0gMCwKKwlLVlBfT1BfU0VULAorCUtWUF9PUF9ERUxFVEUsCisJS1ZQX09QX0VOVU1FUkFURSwKKwlLVlBfT1BfR0VUX0lQX0lORk8sCisJS1ZQX09QX1NFVF9JUF9JTkZPLAorCUtWUF9PUF9DT1VOVCAvKiBOdW1iZXIgb2Ygb3BlcmF0aW9ucywgbXVzdCBiZSBsYXN0LiAqLworfTsKKworZW51bSBodl9rdnBfZXhjaGdfcG9vbCB7CisJS1ZQX1BPT0xfRVhURVJOQUwgPSAwLAorCUtWUF9QT09MX0dVRVNULAorCUtWUF9QT09MX0FVVE8sCisJS1ZQX1BPT0xfQVVUT19FWFRFUk5BTCwKKwlLVlBfUE9PTF9BVVRPX0lOVEVSTkFMLAorCUtWUF9QT09MX0NPVU5UIC8qIE51bWJlciBvZiBwb29scywgbXVzdCBiZSBsYXN0LiAqLworfTsKKworLyoKKyAqIFNvbWUgSHlwZXItViBzdGF0dXMgY29kZXMuCisgKi8KKworI2RlZmluZSBIVl9TX09LCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgSFZfRV9GQUlMCQkJMHg4MDAwNDAwNQorI2RlZmluZSBIVl9TX0NPTlQJCQkweDgwMDcwMTAzCisjZGVmaW5lIEhWX0VSUk9SX05PVF9TVVBQT1JURUQJCTB4ODAwNzAwMzIKKyNkZWZpbmUgSFZfRVJST1JfTUFDSElORV9MT0NLRUQJCTB4ODAwNzA0RjcKKyNkZWZpbmUgSFZfRVJST1JfREVWSUNFX05PVF9DT05ORUNURUQJMHg4MDA3MDQ4RgorI2RlZmluZSBIVl9JTlZBTElEQVJHCQkJMHg4MDA3MDA1NworI2RlZmluZSBIVl9HVUlEX05PVEZPVU5ECQkweDgwMDQxMDAyCisKKyNkZWZpbmUgQUREUl9GQU1JTFlfTk9ORQkweDAwCisjZGVmaW5lIEFERFJfRkFNSUxZX0lQVjQJMHgwMQorI2RlZmluZSBBRERSX0ZBTUlMWV9JUFY2CTB4MDIKKworI2RlZmluZSBNQVhfQURBUFRFUl9JRF9TSVpFCTEyOAorI2RlZmluZSBNQVhfSVBfQUREUl9TSVpFCTEwMjQKKyNkZWZpbmUgTUFYX0dBVEVXQVlfU0laRQk1MTIKKworCitzdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSB7CisJX191MTYJYWRhcHRlcl9pZFtNQVhfQURBUFRFUl9JRF9TSVpFXTsKKwlfX3U4CWFkZHJfZmFtaWx5OworCV9fdTgJZGhjcF9lbmFibGVkOworCV9fdTE2CWlwX2FkZHJbTUFYX0lQX0FERFJfU0laRV07CisJX191MTYJc3ViX25ldFtNQVhfSVBfQUREUl9TSVpFXTsKKwlfX3UxNglnYXRlX3dheVtNQVhfR0FURVdBWV9TSVpFXTsKKwlfX3UxNglkbnNfYWRkcltNQVhfSVBfQUREUl9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGh2X2t2cF9oZHIgeworCV9fdTggb3BlcmF0aW9uOworCV9fdTggcG9vbDsKKwlfX3UxNiBwYWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSB7CisJX191MzIgdmFsdWVfdHlwZTsKKwlfX3UzMiBrZXlfc2l6ZTsKKwlfX3UzMiB2YWx1ZV9zaXplOworCV9fdTgga2V5W0hWX0tWUF9FWENIQU5HRV9NQVhfS0VZX1NJWkVdOworCXVuaW9uIHsKKwkJX191OCB2YWx1ZVtIVl9LVlBfRVhDSEFOR0VfTUFYX1ZBTFVFX1NJWkVdOworCQlfX3UzMiB2YWx1ZV91MzI7CisJCV9fdTY0IHZhbHVlX3U2NDsKKwl9OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X2t2cF9tc2dfZW51bWVyYXRlIHsKKwlfX3UzMiBpbmRleDsKKwlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X2t2cF9tc2dfZ2V0IHsKKwlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOworfTsKKworc3RydWN0IGh2X2t2cF9tc2dfc2V0IHsKKwlzdHJ1Y3QgaHZfa3ZwX2V4Y2hnX21zZ192YWx1ZSBkYXRhOworfTsKKworc3RydWN0IGh2X2t2cF9tc2dfZGVsZXRlIHsKKwlfX3UzMiBrZXlfc2l6ZTsKKwlfX3U4IGtleVtIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFXTsKK307CisKK3N0cnVjdCBodl9rdnBfcmVnaXN0ZXIgeworCV9fdTggdmVyc2lvbltIVl9LVlBfRVhDSEFOR0VfTUFYX0tFWV9TSVpFXTsKK307CisKK3N0cnVjdCBodl9rdnBfbXNnIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBodl9rdnBfaGRyCWt2cF9oZHI7CisJCWludCBlcnJvcjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IGh2X2t2cF9tc2dfZ2V0CQlrdnBfZ2V0OworCQlzdHJ1Y3QgaHZfa3ZwX21zZ19zZXQJCWt2cF9zZXQ7CisJCXN0cnVjdCBodl9rdnBfbXNnX2RlbGV0ZQlrdnBfZGVsZXRlOworCQlzdHJ1Y3QgaHZfa3ZwX21zZ19lbnVtZXJhdGUJa3ZwX2VudW1fZGF0YTsKKwkJc3RydWN0IGh2X2t2cF9pcGFkZHJfdmFsdWUgICAgICBrdnBfaXBfdmFsOworCQlzdHJ1Y3QgaHZfa3ZwX3JlZ2lzdGVyCQlrdnBfcmVnaXN0ZXI7CisJfSBib2R5OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2X2t2cF9pcF9tc2cgeworCV9fdTggb3BlcmF0aW9uOworCV9fdTggcG9vbDsKKwlzdHJ1Y3QgaHZfa3ZwX2lwYWRkcl92YWx1ZSAgICAgIGt2cF9pcF92YWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYgLyogX1VBUElfSFlQRVJWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9zcGkvc3BpZGV2LmggYi9pbmNsdWRlL3VhcGkvbGludXgvc3BpL3NwaWRldi5oCmluZGV4IDUyZDllZDAuLmRkNWYyMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9zcGkvc3BpZGV2LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NwaS9zcGlkZXYuaApAQCAtNDIsNiArNDIsMTAgQEAKICNkZWZpbmUgU1BJX0xPT1AJCTB4MjAKICNkZWZpbmUgU1BJX05PX0NTCQkweDQwCiAjZGVmaW5lIFNQSV9SRUFEWQkJMHg4MAorI2RlZmluZSBTUElfVFhfRFVBTAkJMHgxMDAKKyNkZWZpbmUgU1BJX1RYX1FVQUQJCTB4MjAwCisjZGVmaW5lIFNQSV9SWF9EVUFMCQkweDQwMAorI2RlZmluZSBTUElfUlhfUVVBRAkJMHg4MDAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC05Miw3ICs5Niw5IEBACiAJX191MTYJCWRlbGF5X3VzZWNzOwogCV9fdTgJCWJpdHNfcGVyX3dvcmQ7CiAJX191OAkJY3NfY2hhbmdlOwotCV9fdTMyCQlwYWQ7CisJX191OAkJdHhfbmJpdHM7CisJX191OAkJcnhfbmJpdHM7CisJX191MTYJCXBhZDsKIAogCS8qIElmIHRoZSBjb250ZW50cyBvZiAnc3RydWN0IHNwaV9pb2NfdHJhbnNmZXInIGV2ZXIgY2hhbmdlCiAJICogaW5jb21wYXRpYmx5LCB0aGVuIHRoZSBpb2N0bCBudW1iZXIgKGN1cnJlbnRseSAwKSBtdXN0IGNoYW5nZTsKQEAgLTExMCw3ICsxMTYsNyBAQAogI2RlZmluZSBTUElfSU9DX01FU1NBR0UoTikgX0lPVyhTUElfSU9DX01BR0lDLCAwLCBjaGFyW1NQSV9NU0dTSVpFKE4pXSkKIAogCi0vKiBSZWFkIC8gV3JpdGUgb2YgU1BJIG1vZGUgKFNQSV9NT0RFXzAuLlNQSV9NT0RFXzMpICovCisvKiBSZWFkIC8gV3JpdGUgb2YgU1BJIG1vZGUgKFNQSV9NT0RFXzAuLlNQSV9NT0RFXzMpIChsaW1pdGVkIHRvIDggYml0cykgKi8KICNkZWZpbmUgU1BJX0lPQ19SRF9NT0RFCQkJX0lPUihTUElfSU9DX01BR0lDLCAxLCBfX3U4KQogI2RlZmluZSBTUElfSU9DX1dSX01PREUJCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDEsIF9fdTgpCiAKQEAgLTEyNiw2ICsxMzIsMTAgQEAKICNkZWZpbmUgU1BJX0lPQ19SRF9NQVhfU1BFRURfSFoJCV9JT1IoU1BJX0lPQ19NQUdJQywgNCwgX191MzIpCiAjZGVmaW5lIFNQSV9JT0NfV1JfTUFYX1NQRUVEX0haCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDQsIF9fdTMyKQogCisvKiBSZWFkIC8gV3JpdGUgb2YgdGhlIFNQSSBtb2RlIGZpZWxkICovCisjZGVmaW5lIFNQSV9JT0NfUkRfTU9ERTMyCQlfSU9SKFNQSV9JT0NfTUFHSUMsIDUsIF9fdTMyKQorI2RlZmluZSBTUElfSU9DX1dSX01PREUzMgkJX0lPVyhTUElfSU9DX01BR0lDLCA1LCBfX3UzMikKKwogCiAKICNlbmRpZiAvKiBTUElERVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAppbmRleCBkNmIwMTI4Li4yYTRiNGE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaApAQCAtMTAsOSArMTAsMTUgQEAKIAogZW51bSB7CiAJRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQyA9IDEsCi0JRlVOQ1RJT05GU19TVFJJTkdTX01BR0lDICAgICA9IDIKKwlGVU5DVElPTkZTX1NUUklOR1NfTUFHSUMgPSAyLAorCUZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIgPSAzLAogfTsKIAorZW51bSBmdW5jdGlvbmZzX2ZsYWdzIHsKKwlGVU5DVElPTkZTX0hBU19GU19ERVNDID0gMSwKKwlGVU5DVElPTkZTX0hBU19IU19ERVNDID0gMiwKKwlGVU5DVElPTkZTX0hBU19TU19ERVNDID0gNCwKK307CiAKICNpZm5kZWYgX19LRVJORUxfXwogCkBAIC0yOSwyOSArMzUsMzkgQEAKIAogCiAvKgotICogQWxsIG51bWJlcnMgbXVzdCBiZSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgotICovCi0KLXN0cnVjdCB1c2JfZnVuY3Rpb25mc19kZXNjc19oZWFkIHsKLQlfX2xlMzIgbWFnaWM7Ci0JX19sZTMyIGxlbmd0aDsKLQlfX2xlMzIgZnNfY291bnQ7Ci0JX19sZTMyIGhzX2NvdW50OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKICAqIERlc2NyaXB0b3JzIGZvcm1hdDoKICAqCiAgKiB8IG9mZiB8IG5hbWUgICAgICB8IHR5cGUgICAgICAgICB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgKiB8LS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKiB8ICAgMCB8IG1hZ2ljICAgICB8IExFMzIgICAgICAgICB8IEZVTkNUSU9ORlNfe0ZTLEhTfV9ERVNDUklQVE9SU19NQUdJQyB8CisgKiB8ICAgMCB8IG1hZ2ljICAgICB8IExFMzIgICAgICAgICB8IEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIgICAgICB8CisgKiB8ICAgNCB8IGxlbmd0aCAgICB8IExFMzIgICAgICAgICB8IGxlbmd0aCBvZiB0aGUgd2hvbGUgZGF0YSBjaHVuayAgICAgICB8CisgKiB8ICAgOCB8IGZsYWdzICAgICB8IExFMzIgICAgICAgICB8IGNvbWJpbmF0aW9uIG9mIGZ1bmN0aW9uZnNfZmxhZ3MgICAgICB8CisgKiB8ICAgICB8IGZzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBmdWxsLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CisgKiB8ICAgICB8IGhzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBoaWdoLXNwZWVkIGRlc2NyaXB0b3JzICAgICB8CisgKiB8ICAgICB8IHNzX2NvdW50ICB8IExFMzIgICAgICAgICB8IG51bWJlciBvZiBzdXBlci1zcGVlZCBkZXNjcmlwdG9ycyAgICB8CisgKiB8ICAgICB8IGZzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgZnVsbC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CisgKiB8ICAgICB8IGhzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2YgaGlnaC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgICB8CisgKiB8ICAgICB8IHNzX2Rlc2NycyB8IERlc2NyaXB0b3JbXSB8IGxpc3Qgb2Ygc3VwZXItc3BlZWQgZGVzY3JpcHRvcnMgICAgICB8CisgKgorICogRGVwZW5kaW5nIG9uIHdoaWNoIGZsYWdzIGFyZSBzZXQsIHZhcmlvdXMgZmllbGRzIG1heSBiZSBtaXNzaW5nIGluIHRoZQorICogc3RydWN0dXJlLiAgQW55IGZsYWdzIHRoYXQgYXJlIG5vdCByZWNvZ25pc2VkIGNhdXNlIHRoZSB3aG9sZSBibG9jayB0byBiZQorICogcmVqZWN0ZWQgd2l0aCAtRU5PU1lTLgorICoKKyAqIExlZ2FjeSBkZXNjcmlwdG9ycyBmb3JtYXQ6CisgKgorICogfCBvZmYgfCBuYW1lICAgICAgfCB0eXBlICAgICAgICAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgIDAgfCBtYWdpYyAgICAgfCBMRTMyICAgICAgICAgfCBGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDICAgICAgICAgfAogICogfCAgIDQgfCBsZW5ndGggICAgfCBMRTMyICAgICAgICAgfCBsZW5ndGggb2YgdGhlIHdob2xlIGRhdGEgY2h1bmsgICAgICAgfAogICogfCAgIDggfCBmc19jb3VudCAgfCBMRTMyICAgICAgICAgfCBudW1iZXIgb2YgZnVsbC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgfAogICogfCAgMTIgfCBoc19jb3VudCAgfCBMRTMyICAgICAgICAgfCBudW1iZXIgb2YgaGlnaC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgfAogICogfCAgMTYgfCBmc19kZXNjcnMgfCBEZXNjcmlwdG9yW10gfCBsaXN0IG9mIGZ1bGwtc3BlZWQgZGVzY3JpcHRvcnMgICAgICAgfAogICogfCAgICAgfCBoc19kZXNjcnMgfCBEZXNjcmlwdG9yW10gfCBsaXN0IG9mIGhpZ2gtc3BlZWQgZGVzY3JpcHRvcnMgICAgICAgfAogICoKLSAqIGRlc2NzIGFyZSBqdXN0IHZhbGlkIFVTQiBkZXNjcmlwdG9ycyBhbmQgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqIEFsbCBudW1iZXJzIG11c3QgYmUgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KKyAqCisgKiBEZXNjcmlwdG9yW10gaXMgYW4gYXJyYXkgb2YgdmFsaWQgVVNCIGRlc2NyaXB0b3JzIHdoaWNoIGhhdmUgdGhlIGZvbGxvd2luZworICogZm9ybWF0OgogICoKICAqIHwgb2ZmIHwgbmFtZSAgICAgICAgICAgIHwgdHlwZSB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICB8CiAgKiB8LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYmRldmljZV9mcy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3VzYmRldmljZV9mcy5oCmluZGV4IDBjNjVlNGIuLmFiZTVmNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC91c2JkZXZpY2VfZnMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiZGV2aWNlX2ZzLmgKQEAgLTEwMiw3ICsxMDIsMTAgQEAKIAlpbnQgYnVmZmVyX2xlbmd0aDsKIAlpbnQgYWN0dWFsX2xlbmd0aDsKIAlpbnQgc3RhcnRfZnJhbWU7Ci0JaW50IG51bWJlcl9vZl9wYWNrZXRzOworCXVuaW9uIHsKKwkJaW50IG51bWJlcl9vZl9wYWNrZXRzOwkvKiBPbmx5IHVzZWQgZm9yIGlzb2MgdXJicyAqLworCQl1bnNpZ25lZCBpbnQgc3RyZWFtX2lkOwkvKiBPbmx5IHVzZWQgd2l0aCBidWxrIHN0cmVhbXMgKi8KKwl9OwogCWludCBlcnJvcl9jb3VudDsKIAl1bnNpZ25lZCBpbnQgc2lnbnI7CS8qIHNpZ25hbCB0byBiZSBzZW50IG9uIGNvbXBsZXRpb24sCiAJCQkJICBvciAwIGlmIG5vbmUgc2hvdWxkIGJlIHNlbnQuICovCkBAIC0xNDQsNiArMTQ3LDExIEBACiAJY2hhciBkcml2ZXJbVVNCREVWRlNfTUFYRFJJVkVSTkFNRSArIDFdOwogfTsKIAorc3RydWN0IHVzYmRldmZzX3N0cmVhbXMgeworCXVuc2lnbmVkIGludCBudW1fc3RyZWFtczsgLyogTm90IHVzZWQgYnkgVVNCREVWRlNfRlJFRV9TVFJFQU1TICovCisJdW5zaWduZWQgaW50IG51bV9lcHM7CisJdW5zaWduZWQgY2hhciBlcHNbMF07Cit9OwogCiAjZGVmaW5lIFVTQkRFVkZTX0NPTlRST0wgICAgICAgICAgIF9JT1dSKCdVJywgMCwgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcikKICNkZWZpbmUgVVNCREVWRlNfQ09OVFJPTDMyICAgICAgICAgICBfSU9XUignVScsIDAsIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIzMikKQEAgLTE3Niw1ICsxODQsNyBAQAogI2RlZmluZSBVU0JERVZGU19SRUxFQVNFX1BPUlQgICAgICBfSU9SKCdVJywgMjUsIHVuc2lnbmVkIGludCkKICNkZWZpbmUgVVNCREVWRlNfR0VUX0NBUEFCSUxJVElFUyAgX0lPUignVScsIDI2LCBfX3UzMikKICNkZWZpbmUgVVNCREVWRlNfRElTQ09OTkVDVF9DTEFJTSAgX0lPUignVScsIDI3LCBzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdF9jbGFpbSkKKyNkZWZpbmUgVVNCREVWRlNfQUxMT0NfU1RSRUFNUyAgICAgX0lPUignVScsIDI4LCBzdHJ1Y3QgdXNiZGV2ZnNfc3RyZWFtcykKKyNkZWZpbmUgVVNCREVWRlNfRlJFRV9TVFJFQU1TICAgICAgX0lPUignVScsIDI5LCBzdHJ1Y3QgdXNiZGV2ZnNfc3RyZWFtcykKIAogI2VuZGlmIC8qIF9VQVBJX0xJTlVYX1VTQkRFVklDRV9GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3NnaXZ3LmggYi9pbmNsdWRlL3ZpZGVvL3NnaXZ3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWE1NjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS92aWRlby9zZ2l2dy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjgxICswLDAgQEAKLS8qCi0gKiAgbGludXgvZHJpdmVycy92aWRlby9zZ2l2dy5oIC0tIFNHSSBEQkUgZnJhbWUgYnVmZmVyIGRldmljZSBoZWFkZXIKLSAqCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiAgICAgIEplZmZyZXkgTmV3cXVpc3QsIG5ld3F1aXN0QGVuZ3Iuc2dpLnNvbQotICoKLSAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiAgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19TR0lWV0ZCX0hfXwotI2RlZmluZSBfX1NHSVZXRkJfSF9fCi0KLSNkZWZpbmUgREJFX0dFVFJFRyhyZWcsIGRlc3QpCQkoKGRlc3QpID0gREJFX1JFR19CQVNFLT5yZWcpCi0jZGVmaW5lIERCRV9TRVRSRUcocmVnLCBzcmMpCQlEQkVfUkVHX0JBU0UtPnJlZyA9IChzcmMpCi0jZGVmaW5lIERCRV9JR0VUUkVHKHJlZywgaWR4LCBkZXN0KQkoKGRlc3QpID0gREJFX1JFR19CQVNFLT5yZWdbaWR4XSkKLSNkZWZpbmUgREJFX0lTRVRSRUcocmVnLCBpZHgsIHNyYykJKERCRV9SRUdfQkFTRS0+cmVnW2lkeF0gPSAoc3JjKSkKLQotI2RlZmluZSBNQVNLKG1zYiwgbHNiKSAgICAgICAgICAoICgoKHUzMikxPDwoKG1zYiktKGxzYikrMSkpLTEpIDw8IChsc2IpICkKLSNkZWZpbmUgR0VUKHYsIG1zYiwgbHNiKSAgICAgICAgKCAoKHUzMikodikgJiBNQVNLKG1zYixsc2IpKSA+PiAobHNiKSApCi0jZGVmaW5lIFNFVCh2LCBmLCBtc2IsIGxzYikgICAgICggKHYpID0gKCh2KSZ+TUFTSyhtc2IsbHNiKSkgfCAoKCAodTMyKShmKTw8KGxzYikgKSAmIE1BU0sobXNiLGxzYikpICkKLQotI2RlZmluZSBHRVRfREJFX0ZJRUxEKHJlZywgZmllbGQsIHYpICAgICAgICBHRVQoKHYpLCBEQkVfIyNyZWcjI18jI2ZpZWxkIyNfTVNCLCBEQkVfIyNyZWcjI18jI2ZpZWxkIyNfTFNCKQotI2RlZmluZSBTRVRfREJFX0ZJRUxEKHJlZywgZmllbGQsIHYsIGYpICAgICBTRVQoKHYpLCAoZiksIERCRV8jI3JlZyMjXyMjZmllbGQjI19NU0IsIERCRV8jI3JlZyMjXyMjZmllbGQjI19MU0IpCi0KLS8qIE5PVEU6IEFsbCBsb2Fkcy9zdG9yZXMgbXVzdCBiZSAzMiBiaXRzIGFuZCB1bmNhY2hlZCAqLwotCi0jZGVmaW5lIERCRV9SRUdfUEhZUwkweGQwMDAwMDAwCi0jZGVmaW5lIERCRV9SRUdfU0laRSAgICAgICAgMHgwMTAwMDAwMAotCi1zdHJ1Y3QgYXNyZWdzIHsKLSAgdm9sYXRpbGUgdTMyIGN0cmxzdGF0OyAgICAgLyogMHgwMDAwMDAgZ2VuZXJhbCBjb250cm9sICovCi0gIHZvbGF0aWxlIHUzMiBkb3RjbG9jazsgICAgIC8qIDB4MDAwMDA0IGRvdCBjbG9jayBQTEwgY29udHJvbCAqLwotICB2b2xhdGlsZSB1MzIgaTJjOyAgICAgICAgICAvKiAweDAwMDAwOCBjcnQgSTJDIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIHN5c2NsazsgICAgICAgLyogMHgwMDAwMGMgc3lzdGVtIGNsb2NrIFBMTCBjb250cm9sICovCi0gIHZvbGF0aWxlIHUzMiBpMmNmcDsgICAgICAgIC8qIDB4MDAwMDEwIGZsYXQgcGFuZWwgSTJDIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIGlkOyAgICAgICAgICAgLyogMHgwMDAwMTQgZGV2aWNlIGlkL2NoaXAgcmV2aXNpb24gKi8KLSAgdm9sYXRpbGUgdTMyIGNvbmZpZzsgICAgICAgLyogMHgwMDAwMTggcG93ZXIgb24gY29uZmlndXJhdGlvbiAqLwotICB2b2xhdGlsZSB1MzIgYmlzdDsgICAgICAgICAvKiAweDAwMDAxYyBpbnRlcm5hbCBiaXN0IHN0YXR1cyAqLwotCi0gIGNoYXIgX3BhZDBbIDB4MDEwMDAwIC0gMHgwMDAwMjAgXTsKLQotICB2b2xhdGlsZSB1MzIgdnRfeHk7ICAgICAgICAvKiAweDAxMDAwMCBjdXJyZW50IGRvdCBjb29yZHMgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X3h5bWF4OyAgICAgLyogMHgwMTAwMDQgbWF4aW11bSBkb3QgY29vcmRzICovCi0gIHZvbGF0aWxlIHUzMiB2dF92c3luYzsgICAgIC8qIDB4MDEwMDA4IHZzeW5jIG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgdnRfaHN5bmM7ICAgICAvKiAweDAxMDAwYyBoc3luYyBvbi9vZmYgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X3ZibGFuazsgICAgLyogMHgwMTAwMTAgdmJsYW5rIG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgdnRfaGJsYW5rOyAgICAvKiAweDAxMDAxNCBoYmxhbmsgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiB2dF9mbGFnczsgICAgIC8qIDB4MDEwMDE4IHBvbGFyaXR5IG9mIHZ0IHNpZ25hbHMgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2YycmZfbG9jazsgLyogMHgwMTAwMWMgZjJyZiAmIGZyYW1lbGNrIHkgY29vcmQgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2ludHIwMTsgICAgLyogMHgwMTAwMjAgaW50ciAwLDEgeSBjb29yZHMgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2ludHIyMzsgICAgLyogMHgwMTAwMjQgaW50ciAyLDMgeSBjb29yZHMgKi8KLSAgdm9sYXRpbGUgdTMyIGZwX2hkcnY7ICAgICAgLyogMHgwMTAwMjggZmxhdCBwYW5lbCBoZHJ2IG9uL29mZiAqLwotICB2b2xhdGlsZSB1MzIgZnBfdmRydjsgICAgICAvKiAweDAxMDAyYyBmbGF0IHBhbmVsIHZkcnYgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiBmcF9kZTsgICAgICAgIC8qIDB4MDEwMDMwIGZsYXQgcGFuZWwgZGUgb24vb2ZmICovCi0gIHZvbGF0aWxlIHUzMiB2dF9ocGl4ZW47ICAgIC8qIDB4MDEwMDM0IGludHJubCBob3JpeiBwaXhlbCBvbi9vZmYqLwotICB2b2xhdGlsZSB1MzIgdnRfdnBpeGVuOyAgICAvKiAweDAxMDAzOCBpbnRybmwgdmVydCBwaXhlbCBvbi9vZmYgKi8KLSAgdm9sYXRpbGUgdTMyIHZ0X2hjbWFwOyAgICAgLyogMHgwMTAwM2MgY21hcCB3cml0ZSAoaG9yaXopICovCi0gIHZvbGF0aWxlIHUzMiB2dF92Y21hcDsgICAgIC8qIDB4MDEwMDQwIGNtYXAgd3JpdGUgKHZlcnQpICovCi0gIHZvbGF0aWxlIHUzMiBkaWRfc3RhcnRfeHk7IC8qIDB4MDEwMDQ0IGVvbC9mIGRpZC94eSByZXNldCB2YWwgKi8KLSAgdm9sYXRpbGUgdTMyIGNyc19zdGFydF94eTsgLyogMHgwMTAwNDggZW9sL2YgY3JzL3h5IHJlc2V0IHZhbCAqLwotICB2b2xhdGlsZSB1MzIgdmNfc3RhcnRfeHk7ICAvKiAweDAxMDA0YyBlb2wvZiB2Yy94eSByZXNldCB2YWwgKi8KLQotICBjaGFyIF9wYWQxWyAweDAyMDAwMCAtIDB4MDEwMDUwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIG92cl93aWR0aF90aWxlOyAvKiAweDAyMDAwMCBvdmVybGF5IHBsYW5lIGN0cmwgMCAqLwotICB2b2xhdGlsZSB1MzIgb3ZyX2luaHdjdHJsOyAgIC8qIDB4MDIwMDA0IG92ZXJsYXkgcGxhbmUgY3RybCAxICovCi0gIHZvbGF0aWxlIHUzMiBvdnJfY29udHJvbDsgICAgLyogMHgwMjAwMDggb3ZlcmxheSBwbGFuZSBjdHJsIDEgKi8KLQotICBjaGFyIF9wYWQyWyAweDAzMDAwMCAtIDB4MDIwMDBDIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGZybV9zaXplX3RpbGU7ICAvKiAweDAzMDAwMCBub3JtYWwgcGxhbmUgY3RybCAwICovCi0gIHZvbGF0aWxlIHUzMiBmcm1fc2l6ZV9waXhlbDsgLyogMHgwMzAwMDQgbm9ybWFsIHBsYW5lIGN0cmwgMSAqLwotICB2b2xhdGlsZSB1MzIgZnJtX2luaHdjdHJsOyAgIC8qIDB4MDMwMDA4IG5vcm1hbCBwbGFuZSBjdHJsIDIgKi8KLSAgdm9sYXRpbGUgdTMyIGZybV9jb250cm9sOwkgICAvKiAweDAzMDAwQyBub3JtYWwgcGxhbmUgY3RybCAzICovCi0KLSAgY2hhciBfcGFkM1sgMHgwNDAwMDAgLSAweDAzMDAxMCBdOwotCi0gIHZvbGF0aWxlIHUzMiBkaWRfaW5od2N0cmw7ICAgLyogMHgwNDAwMDAgRElEIGNvbnRyb2wgKi8KLSAgdm9sYXRpbGUgdTMyIGRpZF9jb250cm9sOyAgICAvKiAweDA0MDAwNCBESUQgc2hhZG93ICovCi0KLSAgY2hhciBfcGFkNFsgMHgwNDgwMDAgLSAweDA0MDAwOCBdOwotCi0gIHZvbGF0aWxlIHUzMiBtb2RlX3JlZ3NbMzJdOyAgLyogMHgwNDgwMDAgLSAweDA0ODA3YyBXSUQgdGFibGUgKi8KLQotICBjaGFyIF9wYWQ1WyAweDA1MDAwMCAtIDB4MDQ4MDgwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGNtYXBbNjE0NF07ICAgICAvKiAweDA1MDAwMCAtIDB4MDU1ZmZjIGNvbG9yIG1hcCAqLwotCi0gIGNoYXIgX3BhZDZbIDB4MDU4MDAwIC0gMHgwNTYwMDAgXTsKLQotICB2b2xhdGlsZSB1MzIgY21fZmlmbzsgICAgICAgIC8qIDB4MDU4MDAwIGNvbG9yIG1hcCBmaWZvIHN0YXR1cyAqLwotCi0gIGNoYXIgX3BhZDdbIDB4MDYwMDAwIC0gMHgwNTgwMDQgXTsKLQotICB2b2xhdGlsZSB1MzIgZ21hcFsyNTZdOyAgICAgIC8qIDB4MDYwMDAwIC0gMHgwNjAzZmMgZ2FtbWEgbWFwICovCi0KLSAgY2hhciBfcGFkOFsgMHgwNjgwMDAgLSAweDA2MDQwMCBdOwotCi0gIHZvbGF0aWxlIHUzMiBnbWFwMTBbMTAyNF07ICAgLyogMHgwNjgwMDAgLSAweDA2OGZmYyBnYW1tYSBtYXAgKi8KLQotICBjaGFyIF9wYWQ5WyAweDA3MDAwMCAtIDB4MDY5MDAwIF07Ci0KLSAgdm9sYXRpbGUgdTMyIGNyc19wb3M7ICAgICAgICAvKiAweDA3MDAwMCBjdXNyb3IgY29udHJvbCAwICovCi0gIHZvbGF0aWxlIHUzMiBjcnNfY3RsOyAgICAgICAgLyogMHgwNzAwMDQgY3Vzcm9yIGNvbnRyb2wgMSAqLwotICB2b2xhdGlsZSB1MzIgY3JzX2NtYXBbM107ICAgIC8qIDB4MDcwMDA4IC0gMHgwNzAwMTAgY3JzIGNtYXAgKi8KLQotICBjaGFyIF9wYWQxMFsgMHgwNzgwMDAgLSAweDA3MDAxNCBdOwotCi0gIHZvbGF0aWxlIHUzMiBjcnNfZ2x5cGhbNjRdOyAgLyogMHgwNzgwMDAgLSAweDA3ODBmYyBjcnMgZ2x5cGggKi8KLQotICBjaGFyIF9wYWQxMVsgMHgwODAwMDAgLSAweDA3ODEwMCBdOwotCi0gIHZvbGF0aWxlIHUzMiB2Y18wOyAgICAgICAgICAgLyogMHgwODAwMDAgdmlkZW8gY2FwdHVyZSBjcnRsIDAgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzE7ICAgICAgICAgICAvKiAweDA4MDAwNCB2aWRlbyBjYXB0dXJlIGNydGwgMSAqLwotICB2b2xhdGlsZSB1MzIgdmNfMjsgICAgICAgICAgIC8qIDB4MDgwMDA4IHZpZGVvIGNhcHR1cmUgY3J0bCAyICovCi0gIHZvbGF0aWxlIHUzMiB2Y18zOyAgICAgICAgICAgLyogMHgwODAwMGMgdmlkZW8gY2FwdHVyZSBjcnRsIDMgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzQ7ICAgICAgICAgICAvKiAweDA4MDAxMCB2aWRlbyBjYXB0dXJlIGNydGwgMyAqLwotICB2b2xhdGlsZSB1MzIgdmNfNTsgICAgICAgICAgIC8qIDB4MDgwMDE0IHZpZGVvIGNhcHR1cmUgY3J0bCAzICovCi0gIHZvbGF0aWxlIHUzMiB2Y182OyAgICAgICAgICAgLyogMHgwODAwMTggdmlkZW8gY2FwdHVyZSBjcnRsIDMgKi8KLSAgdm9sYXRpbGUgdTMyIHZjXzc7ICAgICAgICAgICAvKiAweDA4MDAxYyB2aWRlbyBjYXB0dXJlIGNydGwgMyAqLwotICB2b2xhdGlsZSB1MzIgdmNfODsgICAgICAgICAgIC8qIDB4MDgwMDBjIHZpZGVvIGNhcHR1cmUgY3J0bCAzICovCi19OwotCi0vKiBCaXQgbWFzayBpbmZvcm1hdGlvbiAqLwotCi0jZGVmaW5lIERCRV9DVFJMU1RBVF9DSElQSURfTVNCICAgICAzCi0jZGVmaW5lIERCRV9DVFJMU1RBVF9DSElQSURfTFNCICAgICAwCi0jZGVmaW5lIERCRV9DVFJMU1RBVF9TRU5TRV9OX01TQiAgICA0Ci0jZGVmaW5lIERCRV9DVFJMU1RBVF9TRU5TRV9OX0xTQiAgICA0Ci0jZGVmaW5lIERCRV9DVFJMU1RBVF9QQ0xLU0VMX01TQiAgICAyOQotI2RlZmluZSBEQkVfQ1RSTFNUQVRfUENMS1NFTF9MU0IgICAgMjgKLQotI2RlZmluZSBEQkVfRE9UQ0xLX01fTVNCICAgICAgICAgICAgNwotI2RlZmluZSBEQkVfRE9UQ0xLX01fTFNCICAgICAgICAgICAgMAotI2RlZmluZSBEQkVfRE9UQ0xLX05fTVNCICAgICAgICAgICAgMTMKLSNkZWZpbmUgREJFX0RPVENMS19OX0xTQiAgICAgICAgICAgIDgKLSNkZWZpbmUgREJFX0RPVENMS19QX01TQiAgICAgICAgICAgIDE1Ci0jZGVmaW5lIERCRV9ET1RDTEtfUF9MU0IgICAgICAgICAgICAxNAotI2RlZmluZSBEQkVfRE9UQ0xLX1JVTl9NU0IgICAgICAgICAgMjAKLSNkZWZpbmUgREJFX0RPVENMS19SVU5fTFNCICAgICAgICAgIDIwCi0KLSNkZWZpbmUgREJFX1ZUX1hZX1ZUX0ZSRUVaRV9NU0IgICAgIDMxCi0jZGVmaW5lIERCRV9WVF9YWV9WVF9GUkVFWkVfTFNCICAgICAzMQotCi0jZGVmaW5lIERCRV9GUF9WRFJWX0ZQX1ZEUlZfT05fTVNCCTIzCi0jZGVmaW5lIERCRV9GUF9WRFJWX0ZQX1ZEUlZfT05fTFNCCTEyCi0jZGVmaW5lIERCRV9GUF9WRFJWX0ZQX1ZEUlZfT0ZGX01TQgkxMQotI2RlZmluZSBEQkVfRlBfVkRSVl9GUF9WRFJWX09GRl9MU0IJMAotCi0jZGVmaW5lIERCRV9GUF9IRFJWX0ZQX0hEUlZfT05fTVNCCTIzCi0jZGVmaW5lIERCRV9GUF9IRFJWX0ZQX0hEUlZfT05fTFNCCTEyCi0jZGVmaW5lIERCRV9GUF9IRFJWX0ZQX0hEUlZfT0ZGX01TQgkxMQotI2RlZmluZSBEQkVfRlBfSERSVl9GUF9IRFJWX09GRl9MU0IJMAotCi0jZGVmaW5lIERCRV9GUF9ERV9GUF9ERV9PTl9NU0IJCTIzCi0jZGVmaW5lIERCRV9GUF9ERV9GUF9ERV9PTl9MU0IJCTEyCi0jZGVmaW5lIERCRV9GUF9ERV9GUF9ERV9PRkZfTVNCCQkxMQotI2RlZmluZSBEQkVfRlBfREVfRlBfREVfT0ZGX0xTQgkJMAotCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PRkZfTVNCICAgICAgIDExCi0jZGVmaW5lIERCRV9WVF9WU1lOQ19WVF9WU1lOQ19PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT05fTFNCICAgICAgICAxMgotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT0ZGX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVlRfSFNZTkNfVlRfSFNZTkNfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX1ZCTEFOS19WVF9WQkxBTktfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfVkJMQU5LX1ZUX1ZCTEFOS19PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9WQkxBTktfVlRfVkJMQU5LX09GRl9NU0IgICAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX1ZCTEFOS19WVF9WQkxBTktfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX0hCTEFOS19WVF9IQkxBTktfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSEJMQU5LX1ZUX0hCTEFOS19PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9IQkxBTktfVlRfSEJMQU5LX09GRl9NU0IgICAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX0hCTEFOS19WVF9IQkxBTktfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX0ZMQUdTX1ZEUlZfSU5WRVJUX01TQgkJMAotI2RlZmluZSBEQkVfVlRfRkxBR1NfVkRSVl9JTlZFUlRfTFNCCQkwCi0jZGVmaW5lIERCRV9WVF9GTEFHU19IRFJWX0lOVkVSVF9NU0IJCTIKLSNkZWZpbmUgREJFX1ZUX0ZMQUdTX0hEUlZfSU5WRVJUX0xTQgkJMgotCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PTl9NU0IgICAgICAgIDIzCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PTl9MU0IgICAgICAgIDEyCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PRkZfTVNCICAgICAgIDExCi0jZGVmaW5lIERCRV9WVF9WQ01BUF9WVF9WQ01BUF9PRkZfTFNCICAgICAgIDAKLQotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT05fTVNCICAgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT05fTFNCICAgICAgICAxMgotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT0ZGX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVlRfSENNQVBfVlRfSENNQVBfT0ZGX0xTQiAgICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX1hZTUFYX1ZUX01BWFhfTVNCICAgIDExCi0jZGVmaW5lIERCRV9WVF9YWU1BWF9WVF9NQVhYX0xTQiAgICAwCi0jZGVmaW5lIERCRV9WVF9YWU1BWF9WVF9NQVhZX01TQiAgICAyMwotI2RlZmluZSBEQkVfVlRfWFlNQVhfVlRfTUFYWV9MU0IgICAgMTIKLQotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PTl9NU0IgICAgICAyMwotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PTl9MU0IgICAgICAxMgotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PRkZfTVNCICAgICAxMQotI2RlZmluZSBEQkVfVlRfSFBJWEVOX1ZUX0hQSVhFTl9PRkZfTFNCICAgICAwCi0KLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT05fTVNCICAgICAgMjMKLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT05fTFNCICAgICAgMTIKLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT0ZGX01TQiAgICAgMTEKLSNkZWZpbmUgREJFX1ZUX1ZQSVhFTl9WVF9WUElYRU5fT0ZGX0xTQiAgICAgMAotCi0jZGVmaW5lIERCRV9PVlJfQ09OVFJPTF9PVlJfRE1BX0VOQUJMRV9NU0IgIDAKLSNkZWZpbmUgREJFX09WUl9DT05UUk9MX09WUl9ETUFfRU5BQkxFX0xTQiAgMAotCi0jZGVmaW5lIERCRV9PVlJfSU5IV0NUUkxfT1ZSX0RNQV9FTkFCTEVfTVNCIDAKLSNkZWZpbmUgREJFX09WUl9JTkhXQ1RSTF9PVlJfRE1BX0VOQUJMRV9MU0IgMAotCi0jZGVmaW5lIERCRV9PVlJfV0lEVEhfVElMRV9PVlJfRklGT19SRVNFVF9NU0IgICAgICAgMTMKLSNkZWZpbmUgREJFX09WUl9XSURUSF9USUxFX09WUl9GSUZPX1JFU0VUX0xTQiAgICAgICAxMwotCi0jZGVmaW5lIERCRV9GUk1fQ09OVFJPTF9GUk1fRE1BX0VOQUJMRV9NU0IgIDAKLSNkZWZpbmUgREJFX0ZSTV9DT05UUk9MX0ZSTV9ETUFfRU5BQkxFX0xTQiAgMAotI2RlZmluZSBEQkVfRlJNX0NPTlRST0xfRlJNX1RJTEVfUFRSX01TQiAgICAzMQotI2RlZmluZSBEQkVfRlJNX0NPTlRST0xfRlJNX1RJTEVfUFRSX0xTQiAgICA5Ci0jZGVmaW5lIERCRV9GUk1fQ09OVFJPTF9GUk1fTElORUFSX01TQiAgICAgIDEKLSNkZWZpbmUgREJFX0ZSTV9DT05UUk9MX0ZSTV9MSU5FQVJfTFNCICAgICAgMQotCi0jZGVmaW5lIERCRV9GUk1fSU5IV0NUUkxfRlJNX0RNQV9FTkFCTEVfTVNCIDAKLSNkZWZpbmUgREJFX0ZSTV9JTkhXQ1RSTF9GUk1fRE1BX0VOQUJMRV9MU0IgMAotCi0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9XSURUSF9USUxFX01TQiAgICAgICAgMTIKLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1RJTEVfRlJNX1dJRFRIX1RJTEVfTFNCICAgICAgICA1Ci0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9SSFNfTVNCICAgICAgIDQKLSNkZWZpbmUgREJFX0ZSTV9TSVpFX1RJTEVfRlJNX1JIU19MU0IgICAgICAgMAotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fREVQVEhfTVNCICAgICAxNAotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fREVQVEhfTFNCICAgICAxMwotI2RlZmluZSBEQkVfRlJNX1NJWkVfVElMRV9GUk1fRklGT19SRVNFVF9NU0IgICAgICAgIDE1Ci0jZGVmaW5lIERCRV9GUk1fU0laRV9USUxFX0ZSTV9GSUZPX1JFU0VUX0xTQiAgICAgICAgMTUKLQotI2RlZmluZSBEQkVfRlJNX1NJWkVfUElYRUxfRkJfSEVJR0hUX1BJWF9NU0IgICAgICAgIDMxCi0jZGVmaW5lIERCRV9GUk1fU0laRV9QSVhFTF9GQl9IRUlHSFRfUElYX0xTQiAgICAgICAgMTYKLQotI2RlZmluZSBEQkVfRElEX0NPTlRST0xfRElEX0RNQV9FTkFCTEVfTVNCICAwCi0jZGVmaW5lIERCRV9ESURfQ09OVFJPTF9ESURfRE1BX0VOQUJMRV9MU0IgIDAKLSNkZWZpbmUgREJFX0RJRF9JTkhXQ1RSTF9ESURfRE1BX0VOQUJMRV9NU0IgMAotI2RlZmluZSBEQkVfRElEX0lOSFdDVFJMX0RJRF9ETUFfRU5BQkxFX0xTQiAwCi0KLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRZX01TQiAgICAgMjMKLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRZX0xTQiAgICAgMTIKLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRYX01TQiAgICAgMTEKLSNkZWZpbmUgREJFX0RJRF9TVEFSVF9YWV9ESURfU1RBUlRYX0xTQiAgICAgMAotCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWV9NU0IgICAgIDIzCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWV9MU0IgICAgIDEyCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWF9NU0IgICAgIDExCi0jZGVmaW5lIERCRV9DUlNfU1RBUlRfWFlfQ1JTX1NUQVJUWF9MU0IgICAgIDAKLQotI2RlZmluZSBEQkVfV0lEX1RZUF9NU0IgICAgIDQKLSNkZWZpbmUgREJFX1dJRF9UWVBfTFNCICAgICAyCi0jZGVmaW5lIERCRV9XSURfQlVGX01TQiAgICAgMQotI2RlZmluZSBEQkVfV0lEX0JVRl9MU0IgICAgIDAKLQotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRZX01TQiAgICAgICAyMwotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRZX0xTQiAgICAgICAxMgotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRYX01TQiAgICAgICAxMQotI2RlZmluZSBEQkVfVkNfU1RBUlRfWFlfVkNfU1RBUlRYX0xTQiAgICAgICAwCi0KLS8qIENvbnN0YW50cyAqLwotCi0jZGVmaW5lIERCRV9GUk1fREVQVEhfOCAgICAgMAotI2RlZmluZSBEQkVfRlJNX0RFUFRIXzE2ICAgIDEKLSNkZWZpbmUgREJFX0ZSTV9ERVBUSF8zMiAgICAyCi0KLSNkZWZpbmUgREJFX0NNT0RFX0k4ICAgICAgICAwCi0jZGVmaW5lIERCRV9DTU9ERV9JMTIgICAgICAgMQotI2RlZmluZSBEQkVfQ01PREVfUkczQjIgICAgIDIKLSNkZWZpbmUgREJFX0NNT0RFX1JHQjQgICAgICAzCi0jZGVmaW5lIERCRV9DTU9ERV9BUkdCNSAgICAgNAotI2RlZmluZSBEQkVfQ01PREVfUkdCOCAgICAgIDUKLSNkZWZpbmUgREJFX0NNT0RFX1JHQkE1ICAgICA2Ci0jZGVmaW5lIERCRV9DTU9ERV9SR0IxMCAgICAgNwotCi0jZGVmaW5lIERCRV9CTU9ERV9CT1RIICAgICAgMwotCi0jZGVmaW5lIERCRV9DUlNfTUFHSUMgICAgICAgNTQKLQotI2RlZmluZSBEQkVfQ0xPQ0tfUkVGX0tIWgkyNzAwMAotCi0vKiBDb25maWcgUmVnaXN0ZXIgKERCRSBPbmx5KSBEZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIERCRV9DT05GSUdfVkRBQ19FTkFCTEUgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBEQkVfQ09ORklHX1ZEQUNfR1NZTkMgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgREJFX0NPTkZJR19WREFDX1BCTEFOSyAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIERCRV9DT05GSUdfRlBFTkFCTEUgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBEQkVfQ09ORklHX0xFTkRJQU4gICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgREJFX0NPTkZJR19USUxFSElTVCAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIERCRV9DT05GSUdfRVhUX0FERFIgICAgICAgICAgMHgwMDAwMDA4MAotCi0jZGVmaW5lIERCRV9DT05GSUdfRkJERVYgICAgICAgICggREJFX0NPTkZJR19WREFDX0VOQUJMRSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19WREFDX0dTWU5DICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19WREFDX1BCTEFOSyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19MRU5ESUFOICAgICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX0NPTkZJR19FWFRfQUREUiApCi0KLS8qCi0gKiBBdmFpbGFibGUgVmlkZW8gVGltaW5ncyBhbmQgQ29ycmVzcG9uZGluZyBJbmRpY2VzCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgREJFX1ZUXzY0MF80ODBfNjAsCi0KLSAgREJFX1ZUXzgwMF82MDBfNjAsCi0gIERCRV9WVF84MDBfNjAwXzc1LAotICBEQkVfVlRfODAwXzYwMF8xMjAsCi0KLSAgREJFX1ZUXzEwMjRfNzY4XzUwLAotICBEQkVfVlRfMTAyNF83NjhfNjAsCi0gIERCRV9WVF8xMDI0Xzc2OF83NSwKLSAgREJFX1ZUXzEwMjRfNzY4Xzg1LAotICBEQkVfVlRfMTAyNF83NjhfMTIwLAotCi0gIERCRV9WVF8xMjgwXzEwMjRfNTAsCi0gIERCRV9WVF8xMjgwXzEwMjRfNjAsCi0gIERCRV9WVF8xMjgwXzEwMjRfNzUsCi0gIERCRV9WVF8xMjgwXzEwMjRfODUsCi0KLSAgREJFX1ZUXzE2MDBfMTAyNF81MywKLSAgREJFX1ZUXzE2MDBfMTAyNF82MCwKLQotICBEQkVfVlRfMTYwMF8xMjAwXzUwLAotICBEQkVfVlRfMTYwMF8xMjAwXzYwLAotICBEQkVfVlRfMTYwMF8xMjAwXzc1LAotCi0gIERCRV9WVF8xOTIwXzEwODBfNTAsCi0gIERCRV9WVF8xOTIwXzEwODBfNjAsCi0gIERCRV9WVF8xOTIwXzEwODBfNzIsCi0KLSAgREJFX1ZUXzE5MjBfMTIwMF81MCwKLSAgREJFX1ZUXzE5MjBfMTIwMF82MCwKLSAgREJFX1ZUXzE5MjBfMTIwMF82NiwKLQotICBEQkVfVlRfVU5LTk9XTgotfSBkYmVfdGltaW5nX3Q7Ci0KLQotCi0vKgotICogQ3JpbWUgVmlkZW8gVGltaW5nIERhdGEgU3RydWN0dXJlCi0gKi8KLQotc3RydWN0IGRiZV90aW1pbmdfaW5mbwotewotICBkYmVfdGltaW5nX3QgdHlwZTsKLSAgaW50IGZsYWdzOwotICBzaG9ydCB3aWR0aDsJCSAgICAvKiBNb25pdG9yIHJlc29sdXRpb24JCSovCi0gIHNob3J0IGhlaWdodDsKLSAgaW50IGZpZWxkc19zZWM7CSAgICAvKiBmaWVsZHMvc2VjICAoSHogLTMgZGVjLiBwbGFjZXMgKi8KLSAgaW50IGNmcmVxOwkJICAgIC8qIHBpeGVsIGNsb2NrIGZyZXF1ZW5jeSAoTUh6IC0zIGRlYy4gcGxhY2VzKSAqLwotICBzaG9ydCBodG90YWw7CQkgICAgLyogSG9yaXpvbnRhbCB0b3RhbCBwaXhlbHMJKi8KLSAgc2hvcnQgaGJsYW5rX3N0YXJ0OwkgICAgLyogSG9yaXpvbnRhbCBibGFuayBzdGFydAkqLwotICBzaG9ydCBoYmxhbmtfZW5kOwkgICAgLyogSG9yaXpvbnRhbCBibGFuayBlbmQJCSovCi0gIHNob3J0IGhzeW5jX3N0YXJ0OwkgICAgLyogSG9yaXpvbnRhbCBzeW5jIHN0YXJ0CSovCi0gIHNob3J0IGhzeW5jX2VuZDsJICAgIC8qIEhvcml6b250YWwgc3luYyBlbmQJCSovCi0gIHNob3J0IHZ0b3RhbDsJCSAgICAvKiBWZXJ0aWNhbCB0b3RhbCBsaW5lcwkJKi8KLSAgc2hvcnQgdmJsYW5rX3N0YXJ0OwkgICAgLyogVmVydGljYWwgYmxhbmsgc3RhcnQJCSovCi0gIHNob3J0IHZibGFua19lbmQ7CSAgICAvKiBWZXJ0aWNhbCBibGFuayBlbmQJCSovCi0gIHNob3J0IHZzeW5jX3N0YXJ0OwkgICAgLyogVmVydGljYWwgc3luYyBzdGFydAkJKi8KLSAgc2hvcnQgdnN5bmNfZW5kOwkgICAgLyogVmVydGljYWwgc3luYyBlbmQJCSovCi0gIHNob3J0IHBsbF9tOwkJICAgIC8qIFBMTCBNIHBhcmFtZXRlcgkJKi8KLSAgc2hvcnQgcGxsX247CQkgICAgLyogUExMIFAgcGFyYW1ldGVyCQkqLwotICBzaG9ydCBwbGxfcDsJCSAgICAvKiBQTEwgTiBwYXJhbWV0ZXIJCSovCi19OwotCi0vKiBEZWZpbmVzIGZvciBkYmVfdm9mX2luZm9fdCBmbGFncyAqLwotCi0jZGVmaW5lIERCRV9WT0ZfVU5LTk9XTk1PTiAgICAxCi0jZGVmaW5lIERCRV9WT0ZfU1RFUkVPICAgICAgICAyCi0jZGVmaW5lIERCRV9WT0ZfRE9fR0VOU1lOQyAgICA0ICAgICAgICAgIC8qIGVuYWJsZSBpbmNvbWluZyBzeW5jICovCi0jZGVmaW5lIERCRV9WT0ZfU1lOQ19PTl9HUkVFTiA4ICAgICAgICAgIC8qIHN5bmMgb24gZ3JlZW4gKi8KLSNkZWZpbmUgREJFX1ZPRl9GTEFUUEFORUwgICAgIDB4MTAwMCAgICAgLyogRkxBVFBBTkVMIFRpbWluZyAqLwotI2RlZmluZSBEQkVfVk9GX01BR0lDS0VZICAgICAgMHgyMDAwICAgICAvKiBCYWNrZG9vciBrZXkgKi8KLQotLyoKLSAqIERCRSBUaW1pbmcgVGFibGVzCi0gKi8KLQotI2lmZGVmIElOQ0xVREVfVElNSU5HX1RBQkxFX0RBVEEKLXN0cnVjdCBkYmVfdGltaW5nX2luZm8gZGJlVlRpbWluZ3NbXSA9IHsKLSAgewotICAgIERCRV9WVF82NDBfNDgwXzYwLAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgICAgIDY0MCwJCQk0ODAsCQk1OTk0MCwJCQkyNTE3NSwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDgwMCwJNjQwLAkJICAgICAgICA4MDAsCQk2NTYsCQk3NTIsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA1MjUsCTQ4MCwJCSAgICAgICAgNTI1LAkJNDkwLAkJICAgIDQ5MiwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICAxNSwJICAgIDIsCQkJCTMKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzgwMF82MDBfNjAsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICA4MDAsCQkJNjAwLAkJNjAzMTcsCQkJNDAwMDAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMDU2LAk4MDAsCQkgICAgMTA1NiwJCTg0MCwJCSAgICA5NjgsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA2MjgsCTYwMCwJCSAgICA2MjgsCQk2MDEsCQkgICAgNjA1LAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDMsCSAgICAxLAkJCQkxCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF84MDBfNjAwXzc1LAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCSAgICBoZWlnaHQsCQlmaWVsZHNfc2VjLAkgICAgY2ZyZXEgKi8KLSAgICAwLAkgICAgODAwLAkJICAgIDYwMCwJCTc1MDAwLAkJICAgIDQ5NTAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTA1NiwJODAwLAkJICAgIDEwNTYsCQk4MTYsCQkgICAgODk2LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgNjI1LAk2MDAsCQkgICAgNjI1LAkJNjAxLAkJICAgIDYwNCwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkgICAgcGxsX3AgKi8KLSAgICAxMSwJICAgIDMsCQkgICAgICAgIDEKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzgwMF82MDBfMTIwLAotICAgIC8qCWZsYWdzLAkJCQkJd2lkdGgsCQloZWlnaHQsCQkJZmllbGRzX3NlYywJICAgIGNmcmVxICovCi0gICAgREJFX1ZPRl9TVEVSRU8sCSAgICA4MDAsCQk2MDAsCQkJMTE5ODAwLAkJICAgIDgyOTc4LAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTA0MCwJODAwLAkJICAgIDEwNDAsCQk4NTYsCQkgICAgOTc2LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgNjY2LAk2MDAsCQkgICAgNjY2LAkJNjM3LAkJICAgIDY0MywKLSAgICAvKglwbGxfbSwJcGxsX24sCQkgICAgcGxsX3AgKi8KLSAgICAzMSwJICAgIDUsCQkgICAgICAgIDEKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEwMjRfNzY4XzUwLAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCSAgICBoZWlnaHQsCQlmaWVsZHNfc2VjLAkgICAgY2ZyZXEgKi8KLSAgICAwLAkgICAgMTAyNCwJCSAgICA3NjgsCQk1MDAwMCwJCSAgICA1NDE2MywKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDEzNDQsCTEwMjQsCQkgICAgMTM0NCwJCTEwNDgsCQkgICAgMTE4NCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDgwNiwJNzY4LAkJICAgIDgwNiwJCTc3MSwJCSAgICA3NzcsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJICAgIHBsbF9wICovCi0gICAgNCwJICAgIDEsCQkgICAgICAgIDEKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEwMjRfNzY4XzYwLAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgMTAyNCwJCQk3NjgsCQk2MDAwNCwJCQk2NTAwMCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDEzNDQsCTEwMjQsCQkgICAgMTM0NCwJCTEwNDgsCQkgICAgMTE4NCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDgwNiwJNzY4LAkJICAgIDgwNiwJCTc3MSwJCSAgICA3NzcsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJCXBsbF9wICovCi0gICAgMTIsCSAgICA1LAkJCQkwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMDI0Xzc2OF83NSwKLSAgICAvKglmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgMCwJICAgIDEwMjQsCQkJNzY4LAkJNzUwMjksCQkJNzg3NTAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMzEyLAkxMDI0LAkJICAgIDEzMTIsCQkxMDQwLAkJICAgIDExMzYsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA4MDAsCTc2OCwJCSAgICA4MDAsCQk3NjksCQkgICAgNzcyLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDI5LAkgICAgNSwJCQkJMQotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTAyNF83NjhfODUsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICAxMDI0LAkJCTc2OCwJCTg0OTk3LAkJCTk0NTAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTM3NiwJMTAyNCwJCSAgICAxMzc2LAkJMTA3MiwJCSAgICAxMTY4LAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgODA4LAk3NjgsCQkgICAgODA4LAkJNzY5LAkJICAgIDc3MiwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICA3LAkgICAgMiwJCQkJMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTAyNF83NjhfMTIwLAotICAgIC8qCWZsYWdzLAkJCQkJd2lkdGgsCQloZWlnaHQsCQkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgREJFX1ZPRl9TVEVSRU8sCSAgICAxMDI0LAkJNzY4LAkJCTExOTgwMCwJCQkxMzMxOTUsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxMzc2LAkxMDI0LAkJICAgIDEzNzYsCQkxMDcyLAkJICAgIDExNjgsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICA4MDgsCTc2OCwJCSAgICA4MDgsCQk3NjksCQkgICAgNzcyLAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDUsCSAgICAxLAkJCQkwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMjgwXzEwMjRfNTAsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsCQljZnJlcSAqLwotICAgIDAsCSAgICAxMjgwLAkJCTEwMjQsCQk1MDAwMCwJCQk4OTQ2MCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDE2ODAsCTEyODAsCQkgICAgMTY4MCwJCTEzNjAsCQkgICAgMTQ4MCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDEwNjUsCTEwMjQsCQkgICAgMTA2NSwJCTEwMjcsCQkgICAgMTAzMCwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICAxMCwJICAgIDMsCQkJCTAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzEyODBfMTAyNF82MCwKLSAgICAvKglmbGFncywJd2lkdGgsCQkJaGVpZ2h0LAkJZmllbGRzX3NlYywJCWNmcmVxICovCi0gICAgMCwJICAgIDEyODAsCQkJMTAyNCwJCTYwMDIwLAkJCTEwODAwMCwKLSAgICAvKglodG90YWwsCWhibGFua19zdGFydCwJaGJsYW5rX2VuZCwJaHN5bmNfc3RhcnQsCWhzeW5jX2VuZCAqLwotICAgIDE2ODgsCTEyODAsCQkgICAgMTY4OCwJCTEzMjgsCQkgICAgMTQ0MCwKLSAgICAvKgl2dG90YWwsCXZibGFua19zdGFydCwJdmJsYW5rX2VuZCwJdnN5bmNfc3RhcnQsCXZzeW5jX2VuZCAqLwotICAgIDEwNjYsCTEwMjQsCQkgICAgMTA2NiwJCTEwMjUsCQkgICAgMTAyOCwKLSAgICAvKglwbGxfbSwJcGxsX24sCQkJcGxsX3AgKi8KLSAgICA0LAkgICAgMSwJCQkgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTI4MF8xMDI0Xzc1LAotICAgIC8qCWZsYWdzLAl3aWR0aCwJCQloZWlnaHQsCQlmaWVsZHNfc2VjLAkJY2ZyZXEgKi8KLSAgICAwLAkgICAgMTI4MCwJCQkxMDI0LAkJNzUwMjUsCQkJMTM1MDAwLAotICAgIC8qCWh0b3RhbCwJaGJsYW5rX3N0YXJ0LAloYmxhbmtfZW5kLAloc3luY19zdGFydCwJaHN5bmNfZW5kICovCi0gICAgMTY4OCwJMTI4MCwJCSAgICAxNjg4LAkJMTI5NiwJCSAgICAxNDQwLAotICAgIC8qCXZ0b3RhbCwJdmJsYW5rX3N0YXJ0LAl2YmxhbmtfZW5kLAl2c3luY19zdGFydCwJdnN5bmNfZW5kICovCi0gICAgMTA2NiwJMTAyNCwJCSAgICAxMDY2LAkJMTAyNSwJCSAgICAxMDI4LAotICAgIC8qCXBsbF9tLAlwbGxfbiwJCQlwbGxfcCAqLwotICAgIDUsCSAgICAxLAkJCQkwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xMjgwXzEwMjRfODUsCi0gICAgLyoJZmxhZ3MsCXdpZHRoLAkJICAgIGhlaWdodCwJCWZpZWxkc19zZWMsCSAgICBjZnJlcSAqLwotICAgIDAsCSAgICAxMjgwLAkJICAgIDEwMjQsCQk4NTAyNCwJCSAgICAxNTc1MDAsCi0gICAgLyoJaHRvdGFsLAloYmxhbmtfc3RhcnQsCWhibGFua19lbmQsCWhzeW5jX3N0YXJ0LAloc3luY19lbmQgKi8KLSAgICAxNzI4LAkxMjgwLAkJICAgIDE3MjgsCQkxMzQ0LAkJICAgIDE1MDQsCi0gICAgLyoJdnRvdGFsLAl2Ymxhbmtfc3RhcnQsCXZibGFua19lbmQsCXZzeW5jX3N0YXJ0LAl2c3luY19lbmQgKi8KLSAgICAxMDcyLAkxMDI0LAkJICAgIDEwNzIsCQkxMDI1LAkJICAgIDEwMjgsCi0gICAgLyoJcGxsX20sCXBsbF9uLAkJICAgIHBsbF9wICovCi0gICAgMjksCSAgICA1LAkJICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEwMjRfNTMsCi0gICAgLyogZmxhZ3MsCXdpZHRoLAkJCWhlaWdodCwJCWZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIERCRV9WT0ZfRkxBVFBBTkVMIHwgREJFX1ZPRl9NQUdJQ0tFWSwKLSAgICAxNjAwLAkJCTEwMjQsCQk1MzAwMCwJCQkxMDc0NDcsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAxOTAwLCAgIDE2MDAsICAgICAgICAgICAxOTAwLCAgICAgICAgICAgMTYzMCwgICAgICAgICAgIDE3MzAsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMDY3LCAgIDEwMjQsICAgICAgICAgICAxMDY3LCAgICAgICAgICAgMTAyNywgICAgICAgICAgIDEwMzAsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA0LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEwMjRfNjAsCi0gICAgLyogZmxhZ3MsCQkJCQl3aWR0aCwgICAgICAgICAgaGVpZ2h0LAkJCWZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIERCRV9WT0ZfRkxBVFBBTkVMLCAgIDE2MDAsICAgICAgICAgICAxMDI0LAkJCTYwMDAwLCAgICAgICAgICAxMDY5MTMsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAxNjcwLCAgIDE2MDAsICAgICAgICAgICAxNjcwLCAgICAgICAgICAgMTYzMCwgICAgICAgICAgIDE2NTAsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMDY3LCAgIDEwMjQsICAgICAgICAgICAxMDY3LCAgICAgICAgICAgMTAyNywgICAgICAgICAgIDEwMzAsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA0LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xNjAwXzEyMDBfNTAsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTYwMCwgICAgICAgICAgIDEyMDAsICAgICAgICAgICA1MDAwMCwgICAgICAgICAgMTMwNTAwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjA4OCwgICAxNjAwLCAgICAgICAgICAgMjA4OCwgICAgICAgICAgIDE2NDQsICAgICAgICAgICAxNzY0LAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTI1MCwgICAxMjAwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDEyMDUsICAgICAgICAgICAxMjExLAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgMjQsICAgICA1LCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTYwMF8xMjAwXzYwLAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE2MDAsICAgICAgICAgICAxMjAwLCAgICAgICAgICAgNTk5NDAsICAgICAgICAgIDE2MjAwMCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDIxNjAsICAgMTYwMCwgICAgICAgICAgIDIxNjAsICAgICAgICAgICAxNjQ0LCAgICAgICAgICAgMTg1NiwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEyNTAsICAgMTIwMCwgICAgICAgICAgIDEyNTAsICAgICAgICAgICAxMjAxLCAgICAgICAgICAgMTIwNCwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDYsCQkxLCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTYwMF8xMjAwXzc1LAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE2MDAsICAgICAgICAgICAxMjAwLCAgICAgICAgICAgNzUwMDAsICAgICAgICAgIDIwMjUwMCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDIxNjAsICAgMTYwMCwgICAgICAgICAgIDIxNjAsICAgICAgICAgICAxNjQ0LCAgICAgICAgICAgMTg1NiwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEyNTAsICAgMTIwMCwgICAgICAgICAgIDEyNTAsICAgICAgICAgICAxMjAxLCAgICAgICAgICAgMTIwNCwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDE1LAkJMiwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE5MjBfMTA4MF81MCwKLSAgICAvKiBmbGFncywgIHdpZHRoLCAgICAgICAgICBoZWlnaHQsICAgICAgICAgZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgMCwgICAgICAxOTIwLCAgICAgICAgICAgMTA4MCwgICAgICAgICAgIDUwMDAwLCAgICAgICAgICAxMzMyMDAsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAyMzY4LCAgIDE5MjAsICAgICAgICAgICAyMzY4LCAgICAgICAgICAgMTk1MiwgICAgICAgICAgIDIwOTYsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMTI1LCAgIDEwODAsICAgICAgICAgICAxMTI1LCAgICAgICAgICAgMTA4MywgICAgICAgICAgIDEwODYsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA1LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xOTIwXzEwODBfNjAsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTkyMCwgICAgICAgICAgIDEwODAsICAgICAgICAgICA1OTk0MCwgICAgICAgICAgMTU5ODQwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjM2OCwgICAxOTIwLCAgICAgICAgICAgMjM2OCwgICAgICAgICAgIDE5NTIsICAgICAgICAgICAyMDk2LAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTEyNSwgICAxMDgwLCAgICAgICAgICAgMTEyNSwgICAgICAgICAgIDEwODMsICAgICAgICAgICAxMDg2LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgNiwgICAgICAxLCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTkyMF8xMDgwXzcyLAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE5MjAsICAgICAgICAgICAxMDgwLCAgICAgICAgICAgNzIwMDAsICAgICAgICAgIDIxNjAyMywKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDI1NjAsICAgMTkyMCwgICAgICAgICAgIDI1NjAsICAgICAgICAgICAxOTY4LCAgICAgICAgICAgMjE4NCwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDExNzIsICAgMTA4MCwgICAgICAgICAgIDExNzIsICAgICAgICAgICAxMDgzLCAgICAgICAgICAgMTA4NiwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDgsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfSwKLQotICB7Ci0gICAgREJFX1ZUXzE5MjBfMTIwMF81MCwKLSAgICAvKiBmbGFncywgIHdpZHRoLCAgICAgICAgICBoZWlnaHQsICAgICAgICAgZmllbGRzX3NlYywgICAgIGNmcmVxICovCi0gICAgMCwgICAgICAxOTIwLCAgICAgICAgICAgMTIwMCwgICAgICAgICAgIDUwMDAwLCAgICAgICAgICAxNjE1MDAsCi0gICAgLyogaHRvdGFsLCBoYmxhbmtfc3RhcnQsICAgaGJsYW5rX2VuZCwgICAgIGhzeW5jX3N0YXJ0LCAgICBoc3luY19lbmQgKi8KLSAgICAyNTg0LCAgIDE5MjAsICAgICAgICAgICAyNTg0LCAgICAgICAgICAgMTk4NCwgICAgICAgICAgIDIyNDAsCi0gICAgLyogdnRvdGFsLCB2Ymxhbmtfc3RhcnQsICAgdmJsYW5rX2VuZCwgICAgIHZzeW5jX3N0YXJ0LCAgICB2c3luY19lbmQgKi8KLSAgICAxMjUwLCAgIDEyMDAsICAgICAgICAgICAxMjUwLCAgICAgICAgICAgMTIwMywgICAgICAgICAgIDEyMDYsCi0gICAgLyogcGxsX20sICBwbGxfbiwgICAgICAgICAgcGxsX3AgKi8KLSAgICA2LCAgICAgIDEsICAgICAgICAgICAgICAwCi0gIH0sCi0KLSAgewotICAgIERCRV9WVF8xOTIwXzEyMDBfNjAsCi0gICAgLyogZmxhZ3MsICB3aWR0aCwgICAgICAgICAgaGVpZ2h0LCAgICAgICAgIGZpZWxkc19zZWMsICAgICBjZnJlcSAqLwotICAgIDAsICAgICAgMTkyMCwgICAgICAgICAgIDEyMDAsICAgICAgICAgICA1OTk0MCwgICAgICAgICAgMTkzODAwLAotICAgIC8qIGh0b3RhbCwgaGJsYW5rX3N0YXJ0LCAgIGhibGFua19lbmQsICAgICBoc3luY19zdGFydCwgICAgaHN5bmNfZW5kICovCi0gICAgMjU4NCwgICAxOTIwLCAgICAgICAgICAgMjU4NCwgICAgICAgICAgIDE5ODQsICAgICAgICAgICAyMjQwLAotICAgIC8qIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LCAgIHZibGFua19lbmQsICAgICB2c3luY19zdGFydCwgICAgdnN5bmNfZW5kICovCi0gICAgMTI1MCwgICAxMjAwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDEyMDMsICAgICAgICAgICAxMjA2LAotICAgIC8qIHBsbF9tLCAgcGxsX24sICAgICAgICAgIHBsbF9wICovCi0gICAgMjksICAgICA0LCAgICAgICAgICAgICAgMAotICB9LAotCi0gIHsKLSAgICBEQkVfVlRfMTkyMF8xMjAwXzY2LAotICAgIC8qIGZsYWdzLCAgd2lkdGgsICAgICAgICAgIGhlaWdodCwgICAgICAgICBmaWVsZHNfc2VjLCAgICAgY2ZyZXEgKi8KLSAgICAwLCAgICAgIDE5MjAsICAgICAgICAgICAxMjAwLCAgICAgICAgICAgNjYwMDAsICAgICAgICAgIDIxMzE4MCwKLSAgICAvKiBodG90YWwsIGhibGFua19zdGFydCwgICBoYmxhbmtfZW5kLCAgICAgaHN5bmNfc3RhcnQsICAgIGhzeW5jX2VuZCAqLwotICAgIDI1ODQsICAgMTkyMCwgICAgICAgICAgIDI1ODQsICAgICAgICAgICAxOTg0LCAgICAgICAgICAgMjI0MCwKLSAgICAvKiB2dG90YWwsIHZibGFua19zdGFydCwgICB2YmxhbmtfZW5kLCAgICAgdnN5bmNfc3RhcnQsICAgIHZzeW5jX2VuZCAqLwotICAgIDEyNTAsICAgMTIwMCwgICAgICAgICAgIDEyNTAsICAgICAgICAgICAxMjAzLCAgICAgICAgICAgMTIwNiwKLSAgICAvKiBwbGxfbSwgIHBsbF9uLCAgICAgICAgICBwbGxfcCAqLwotICAgIDgsICAgICAgMSwgICAgICAgICAgICAgIDAKLSAgfQotfTsKLQotI2VuZGlmIC8vIElOQ0xVREVfVElNSU5HX1RBQkxFX0RBVEEKLQotI2VuZGlmIC8vICEgX19TR0lWV0ZCX0hfXwpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IDAwOWE3OTcuLmQ1NmNiMDMgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTEzODcsNiArMTM4NywxMyBAQAogCSAgc3VwcG9ydCBmb3IgImZhc3QgdXNlcnNwYWNlIG11dGV4ZXMiLiAgVGhlIHJlc3VsdGluZyBrZXJuZWwgbWF5IG5vdAogCSAgcnVuIGdsaWJjLWJhc2VkIGFwcGxpY2F0aW9ucyBjb3JyZWN0bHkuCiAKK2NvbmZpZyBIQVZFX0ZVVEVYX0NNUFhDSEcKKwlib29sCisJaGVscAorCSAgQXJjaGl0ZWN0dXJlcyBzaG91bGQgc2VsZWN0IHRoaXMgaWYgZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWMoKQorCSAgaXMgaW1wbGVtZW50ZWQgYW5kIGFsd2F5cyB3b3JraW5nLiBUaGlzIHJlbW92ZXMgYSBjb3VwbGUgb2YgcnVudGltZQorCSAgY2hlY2tzLgorCiBjb25maWcgRVBPTEwKIAlib29sICJFbmFibGUgZXZlbnRwb2xsIHN1cHBvcnQiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvaXBjL2NvbXBhdC5jIGIvaXBjL2NvbXBhdC5jCmluZGV4IGY0ODZiMDAuLmE0Njk1YWQgMTAwNjQ0Ci0tLSBhL2lwYy9jb21wYXQuYworKysgYi9pcGMvY29tcGF0LmMKQEAgLTQzMCw5ICs0MzAsOSBAQAogfQogCiBDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KG1zZ3JjdiwgaW50LCBtc3FpZCwgY29tcGF0X3VwdHJfdCwgbXNncCwKLQkJICAgICAgIGNvbXBhdF9zc2l6ZV90LCBtc2dzeiwgbG9uZywgbXNndHlwLCBpbnQsIG1zZ2ZsZykKKwkJICAgICAgIGNvbXBhdF9zc2l6ZV90LCBtc2dzeiwgY29tcGF0X2xvbmdfdCwgbXNndHlwLCBpbnQsIG1zZ2ZsZykKIHsKLQlyZXR1cm4gZG9fbXNncmN2KG1zcWlkLCBjb21wYXRfcHRyKG1zZ3ApLCAoc3NpemVfdCltc2dzeiwgbXNndHlwLAorCXJldHVybiBkb19tc2dyY3YobXNxaWQsIGNvbXBhdF9wdHIobXNncCksIChzc2l6ZV90KW1zZ3N6LCAobG9uZyltc2d0eXAsCiAJCQkgbXNnZmxnLCBjb21wYXRfZG9fbXNnX2ZpbGwpOwogfQogCkBAIC00OTgsNyArNDk4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfbXNnY3RsKGludCBmaXJzdCwgaW50IHNlY29uZCwgdm9pZCBfX3VzZXIgKnVwdHIpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKG1zZ2N0bCwgaW50LCBmaXJzdCwgaW50LCBzZWNvbmQsIHZvaWQgX191c2VyICosIHVwdHIpCiB7CiAJaW50IGVyciwgZXJyMjsKIAlzdHJ1Y3QgbXNxaWQ2NF9kcyBtNjQ7CkBAIC02NjgsNyArNjY4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfc2htY3RsKGludCBmaXJzdCwgaW50IHNlY29uZCwgdm9pZCBfX3VzZXIgKnVwdHIpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHNobWN0bCwgaW50LCBmaXJzdCwgaW50LCBzZWNvbmQsIHZvaWQgX191c2VyICosIHVwdHIpCiB7CiAJdm9pZCBfX3VzZXIgKnA7CiAJc3RydWN0IHNobWlkNjRfZHMgczY0OwpAQCAtNzQ5LDE3ICs3NDksMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfc2VtdGltZWRvcChpbnQgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICp0c2VtcywKLQkJdW5zaWduZWQgbnNvcHMsIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChzZW10aW1lZG9wLCBpbnQsIHNlbWlkLCBzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqLCB0c2VtcywKKwkJICAgICAgIHVuc2lnbmVkLCBuc29wcywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRpbWVvdXQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdHM2NCA9IE5VTEw7Ci0JaWYgKHRpbWVvdXQpIHsKLQkJc3RydWN0IHRpbWVzcGVjIHRzOwotCQl0czY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp0czY0KSk7Ci0JCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0cywgdGltZW91dCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcih0czY0LCAmdHMsIHNpemVvZih0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRzNjQ7CisJaWYgKGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKCZ0czY0LCB0aW1lb3V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIHN5c19zZW10aW1lZG9wKHNlbWlkLCB0c2VtcywgbnNvcHMsIHRzNjQpOwogfQpkaWZmIC0tZ2l0IGEvaXBjL2NvbXBhdF9tcS5jIGIvaXBjL2NvbXBhdF9tcS5jCmluZGV4IDYzZDdjNmRlLi45MGQyOWY1IDEwMDY0NAotLS0gYS9pcGMvY29tcGF0X21xLmMKKysrIGIvaXBjL2NvbXBhdF9tcS5jCkBAIC00Niw5ICs0Niw5IEBACiAJCXwgX19wdXRfdXNlcihhdHRyLT5tcV9jdXJtc2dzLCAmdWF0dHItPm1xX2N1cm1zZ3MpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tcV9vcGVuKGNvbnN0IGNoYXIgX191c2VyICp1X25hbWUsCi0JCQlpbnQgb2ZsYWcsIGNvbXBhdF9tb2RlX3QgbW9kZSwKLQkJCXN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKnVfYXR0cikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTQobXFfb3BlbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgdV9uYW1lLAorCQkgICAgICAgaW50LCBvZmxhZywgY29tcGF0X21vZGVfdCwgbW9kZSwKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKiwgdV9hdHRyKQogewogCXZvaWQgX191c2VyICpwID0gTlVMTDsKIAlpZiAodV9hdHRyICYmIG9mbGFnICYgT19DUkVBVCkgewpAQCAtNjQsNDkgKzY0LDM2IEBACiAJcmV0dXJuIHN5c19tcV9vcGVuKHVfbmFtZSwgb2ZsYWcsIG1vZGUsIHApOwogfQogCi1zdGF0aWMgaW50IGNvbXBhdF9wcmVwYXJlX3RpbWVvdXQoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKnAsCi0JCQkJICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdSkKLXsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0JaWYgKCF1KSB7Ci0JCSpwID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHRzKSk7Ci0JaWYgKGdldF9jb21wYXRfdGltZXNwZWMoJnRzLCB1KSB8fCBjb3B5X3RvX3VzZXIoKnAsICZ0cywgc2l6ZW9mKHRzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tcV90aW1lZHNlbmQobXFkX3QgbXFkZXMsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqdV9tc2dfcHRyLAotCQkJc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBtc2dfcHJpbywKLQkJCWNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp1X2Fic190aW1lb3V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShtcV90aW1lZHNlbmQsIG1xZF90LCBtcWRlcywKKwkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICosIHVfbXNnX3B0ciwKKwkJICAgICAgIGNvbXBhdF9zaXplX3QsIG1zZ19sZW4sIHVuc2lnbmVkIGludCwgbXNnX3ByaW8sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCB1X2Fic190aW1lb3V0KQogewogCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnVfdHM7CiAKLQlpZiAoY29tcGF0X3ByZXBhcmVfdGltZW91dCgmdV90cywgdV9hYnNfdGltZW91dCkpCisJaWYgKGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKCZ1X3RzLCB1X2Fic190aW1lb3V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gc3lzX21xX3RpbWVkc2VuZChtcWRlcywgdV9tc2dfcHRyLCBtc2dfbGVuLAogCQkJbXNnX3ByaW8sIHVfdHMpOwogfQogCi1hc21saW5rYWdlIHNzaXplX3QgY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUobXFkX3QgbXFkZXMsCi0JCQljaGFyIF9fdXNlciAqdV9tc2dfcHRyLAotCQkJc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBfX3VzZXIgKnVfbXNnX3ByaW8sCi0JCQljb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdV9hYnNfdGltZW91dCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUobXFfdGltZWRyZWNlaXZlLCBtcWRfdCwgbXFkZXMsCisJCSAgICAgICBjaGFyIF9fdXNlciAqLCB1X21zZ19wdHIsCisJCSAgICAgICBjb21wYXRfc2l6ZV90LCBtc2dfbGVuLCB1bnNpZ25lZCBpbnQgX191c2VyICosIHVfbXNnX3ByaW8sCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCB1X2Fic190aW1lb3V0KQogewogCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnVfdHM7Ci0JaWYgKGNvbXBhdF9wcmVwYXJlX3RpbWVvdXQoJnVfdHMsIHVfYWJzX3RpbWVvdXQpKQorCisJaWYgKGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKCZ1X3RzLCB1X2Fic190aW1lb3V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gc3lzX21xX3RpbWVkcmVjZWl2ZShtcWRlcywgdV9tc2dfcHRyLCBtc2dfbGVuLAogCQkJdV9tc2dfcHJpbywgdV90cyk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21xX25vdGlmeShtcWRfdCBtcWRlcywKLQkJCWNvbnN0IHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgX191c2VyICp1X25vdGlmaWNhdGlvbikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIobXFfbm90aWZ5LCBtcWRfdCwgbXFkZXMsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50IF9fdXNlciAqLCB1X25vdGlmaWNhdGlvbikKIHsKIAlzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICpwID0gTlVMTDsKIAlpZiAodV9ub3RpZmljYXRpb24pIHsKQEAgLTEyMiw5ICsxMDksOSBAQAogCXJldHVybiBzeXNfbXFfbm90aWZ5KG1xZGVzLCBwKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cihtcWRfdCBtcWRlcywKLQkJCWNvbnN0IHN0cnVjdCBjb21wYXRfbXFfYXR0ciBfX3VzZXIgKnVfbXFzdGF0LAotCQkJc3RydWN0IGNvbXBhdF9tcV9hdHRyIF9fdXNlciAqdV9vbXFzdGF0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhtcV9nZXRzZXRhdHRyLCBtcWRfdCwgbXFkZXMsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X21xX2F0dHIgX191c2VyICosIHVfbXFzdGF0LAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9tcV9hdHRyIF9fdXNlciAqLCB1X29tcXN0YXQpCiB7CiAJc3RydWN0IG1xX2F0dHIgbXFzdGF0OwogCXN0cnVjdCBtcV9hdHRyIF9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKDIgKiBzaXplb2YoKnApKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCBiYzAxMGVlLi5mMmE4YjYyIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC0xOCwxMSArMTgsMTMgQEAKIENGTEFHU19SRU1PVkVfaXJxX3dvcmsubyA9IC1wZwogZW5kaWYKIAorIyBjb25kX3N5c2NhbGwgaXMgY3VycmVudGx5IG5vdCBMVE8gY29tcGF0aWJsZQorQ0ZMQUdTX3N5c19uaS5vID0gJChESVNBQkxFX0xUTykKKwogb2JqLXkgKz0gc2NoZWQvCiBvYmoteSArPSBsb2NraW5nLwogb2JqLXkgKz0gcG93ZXIvCiBvYmoteSArPSBwcmludGsvCi1vYmoteSArPSBjcHUvCiBvYmoteSArPSBpcnEvCiBvYmoteSArPSByY3UvCiAKQEAgLTkzLDYgKzk1LDcgQEAKIG9iai0kKENPTkZJR19DUkFTSF9EVU1QKSArPSBjcmFzaF9kdW1wLm8KIG9iai0kKENPTkZJR19KVU1QX0xBQkVMKSArPSBqdW1wX2xhYmVsLm8KIG9iai0kKENPTkZJR19DT05URVhUX1RSQUNLSU5HKSArPSBjb250ZXh0X3RyYWNraW5nLm8KK29iai0kKENPTkZJR19UT1JUVVJFX1RFU1QpICs9IHRvcnR1cmUubwogCiAkKG9iaikvY29uZmlncy5vOiAkKG9iaikvY29uZmlnX2RhdGEuaAogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IDMzOTJkM2UuLjk1YTIwZjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC02MDgsOSArNjA4LDE5IEBACiAJaW50IGVyciA9IDA7CiAKIAkvKiBPbmx5IHN1cHBvcnQgdGhlIGluaXRpYWwgbmFtZXNwYWNlcyBmb3Igbm93LiAqLworCS8qCisJICogV2UgcmV0dXJuIEVDT05OUkVGVVNFRCBiZWNhdXNlIGl0IHRyaWNrcyB1c2Vyc3BhY2UgaW50byB0aGlua2luZworCSAqIHRoYXQgYXVkaXQgd2FzIG5vdCBjb25maWd1cmVkIGludG8gdGhlIGtlcm5lbC4gIExvdHMgb2YgdXNlcnMKKwkgKiBjb25maWd1cmUgdGhlaXIgUEFNIHN0YWNrIChiZWNhdXNlIHRoYXQncyB3aGF0IHRoZSBkaXN0cm8gZG9lcykKKwkgKiB0byByZWplY3QgbG9naW4gaWYgdW5hYmxlIHRvIHNlbmQgbWVzc2FnZXMgdG8gYXVkaXQuICBJZiB3ZSByZXR1cm4KKwkgKiBFQ09OTlJFRlVTRUQgdGhlIFBBTSBzdGFjayB0aGlua3MgdGhlIGtlcm5lbCBkb2VzIG5vdCBoYXZlIGF1ZGl0CisJICogY29uZmlndXJlZCBpbiBhbmQgd2lsbCBsZXQgbG9naW4gcHJvY2VlZC4gIElmIHdlIHJldHVybiBFUEVSTQorCSAqIHVzZXJzcGFjZSB3aWxsIHJlamVjdCBhbGwgbG9naW5zLiAgVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHdlCisJICogc3VwcG9ydCBub24gaW5pdCBuYW1lc3BhY2VzISEKKwkgKi8KIAlpZiAoKGN1cnJlbnRfdXNlcl9ucygpICE9ICZpbml0X3VzZXJfbnMpIHx8CiAJICAgICh0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkgIT0gJmluaXRfcGlkX25zKSkKLQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAKIAlzd2l0Y2ggKG1zZ190eXBlKSB7CiAJY2FzZSBBVURJVF9MSVNUOgpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IDEwNWYyNzMuLjBjNzUzZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTQxMTIsMTcgKzQxMTIsMTcgQEAKIAogCWVyciA9IHBlcmNwdV9yZWZfaW5pdCgmY3NzLT5yZWZjbnQsIGNzc19yZWxlYXNlKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlOworCQlnb3RvIGVycl9mcmVlX2NzczsKIAogCWluaXRfY3NzKGNzcywgc3MsIGNncnApOwogCiAJZXJyID0gY2dyb3VwX3BvcHVsYXRlX2RpcihjZ3JwLCAxIDw8IHNzLT5zdWJzeXNfaWQpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWU7CisJCWdvdG8gZXJyX2ZyZWVfcGVyY3B1X3JlZjsKIAogCWVyciA9IG9ubGluZV9jc3MoY3NzKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlOworCQlnb3RvIGVycl9jbGVhcl9kaXI7CiAKIAlkZ2V0KGNncnAtPmRlbnRyeSk7CiAJY3NzX2dldChjc3MtPnBhcmVudCk7CkBAIC00MTM4LDggKzQxMzgsMTEgQEAKIAogCXJldHVybiAwOwogCi1lcnJfZnJlZToKK2Vycl9jbGVhcl9kaXI6CisJY2dyb3VwX2NsZWFyX2Rpcihjc3MtPmNncm91cCwgMSA8PCBjc3MtPnNzLT5zdWJzeXNfaWQpOworZXJyX2ZyZWVfcGVyY3B1X3JlZjoKIAlwZXJjcHVfcmVmX2NhbmNlbF9pbml0KCZjc3MtPnJlZmNudCk7CitlcnJfZnJlZV9jc3M6CiAJc3MtPmNzc19mcmVlKGNzcyk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9jb21wYXQuYyBiL2tlcm5lbC9jb21wYXQuYwppbmRleCAwYTA5ZTQ4Li5lNDBiMDQzIDEwMDY0NAotLS0gYS9rZXJuZWwvY29tcGF0LmMKKysrIGIva2VybmVsL2NvbXBhdC5jCkBAIC0zMCwyOCArMzAsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotLyoKLSAqIEdldC9zZXQgc3RydWN0IHRpbWV2YWwgd2l0aCBzdHJ1Y3QgdGltZXNwZWMgb24gdGhlIG5hdGl2ZSBzaWRlCi0gKi8KLXN0YXRpYyBpbnQgY29tcGF0X2dldF90aW1ldmFsX2NvbnZlcnQoc3RydWN0IHRpbWVzcGVjICpvLAotCQkJCSAgICAgIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmkpCi17Ci0JbG9uZyB1c2VjOwotCi0JaWYgKGdldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYykgfHwKLQkgICAgZ2V0X3VzZXIodXNlYywgJmktPnR2X3VzZWMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlvLT50dl9uc2VjID0gdXNlYyAqIDEwMDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGF0X3B1dF90aW1ldmFsX2NvbnZlcnQoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqbywKLQkJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqaSkKLXsKLQlyZXR1cm4gKHB1dF91c2VyKGktPnR2X3NlYywgJm8tPnR2X3NlYykgfHwKLQkJcHV0X3VzZXIoaS0+dHZfdXNlYywgJm8tPnR2X3VzZWMpKSA/IC1FRkFVTFQgOiAwOwotfQotCiBzdGF0aWMgaW50IGNvbXBhdF9nZXRfdGltZXgoc3RydWN0IHRpbWV4ICp0eGMsIHN0cnVjdCBjb21wYXRfdGltZXggX191c2VyICp1dHApCiB7CiAJbWVtc2V0KHR4YywgMCwgc2l6ZW9mKHN0cnVjdCB0aW1leCkpOwpAQCAtMTEwLDEzICs4OCwxMyBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsCi0JCXN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihnZXR0aW1lb2ZkYXksIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdHYsCisJCSAgICAgICBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICosIHR6KQogewogCWlmICh0dikgewogCQlzdHJ1Y3QgdGltZXZhbCBrdHY7CiAJCWRvX2dldHRpbWVvZmRheSgma3R2KTsKLQkJaWYgKGNvbXBhdF9wdXRfdGltZXZhbF9jb252ZXJ0KHR2LCAma3R2KSkKKwkJaWYgKGNvbXBhdF9wdXRfdGltZXZhbCgma3R2LCB0dikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKHR6KSB7CkBAIC0xMjcsNjIgKzEwNSw2MSBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsCi0JCXN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihzZXR0aW1lb2ZkYXksIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKiwgdHYsCisJCSAgICAgICBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICosIHR6KQogewotCXN0cnVjdCB0aW1lc3BlYyBrdHM7Ci0Jc3RydWN0IHRpbWV6b25lIGt0ejsKKwlzdHJ1Y3QgdGltZXZhbCB1c2VyX3R2OworCXN0cnVjdCB0aW1lc3BlYwluZXdfdHM7CisJc3RydWN0IHRpbWV6b25lIG5ld190ejsKIAogCWlmICh0dikgewotCQlpZiAoY29tcGF0X2dldF90aW1ldmFsX2NvbnZlcnQoJmt0cywgdHYpKQorCQlpZiAoY29tcGF0X2dldF90aW1ldmFsKCZ1c2VyX3R2LCB0dikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbmV3X3RzLnR2X3NlYyA9IHVzZXJfdHYudHZfc2VjOworCQluZXdfdHMudHZfbnNlYyA9IHVzZXJfdHYudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CiAJfQogCWlmICh0eikgewotCQlpZiAoY29weV9mcm9tX3VzZXIoJmt0eiwgdHosIHNpemVvZihrdHopKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfdHosIHR6LCBzaXplb2YoKnR6KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlyZXR1cm4gZG9fc3lzX3NldHRpbWVvZmRheSh0diA/ICZrdHMgOiBOVUxMLCB0eiA/ICZrdHogOiBOVUxMKTsKKwlyZXR1cm4gZG9fc3lzX3NldHRpbWVvZmRheSh0diA/ICZuZXdfdHMgOiBOVUxMLCB0eiA/ICZuZXdfdHogOiBOVUxMKTsKIH0KIAotaW50IGdldF9jb21wYXRfdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqdHYsIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmN0dikKK3N0YXRpYyBpbnQgX19jb21wYXRfZ2V0X3RpbWV2YWwoc3RydWN0IHRpbWV2YWwgKnR2LCBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICpjdHYpCiB7CiAJcmV0dXJuICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBjdHYsIHNpemVvZigqY3R2KSkgfHwKIAkJCV9fZ2V0X3VzZXIodHYtPnR2X3NlYywgJmN0di0+dHZfc2VjKSB8fAogCQkJX19nZXRfdXNlcih0di0+dHZfdXNlYywgJmN0di0+dHZfdXNlYykpID8gLUVGQVVMVCA6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChnZXRfY29tcGF0X3RpbWV2YWwpOwogCi1pbnQgcHV0X2NvbXBhdF90aW1ldmFsKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqY3R2KQorc3RhdGljIGludCBfX2NvbXBhdF9wdXRfdGltZXZhbChjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmN0dikKIHsKIAlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjdHYsIHNpemVvZigqY3R2KSkgfHwKIAkJCV9fcHV0X3VzZXIodHYtPnR2X3NlYywgJmN0di0+dHZfc2VjKSB8fAogCQkJX19wdXRfdXNlcih0di0+dHZfdXNlYywgJmN0di0+dHZfdXNlYykpID8gLUVGQVVMVCA6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwdXRfY29tcGF0X3RpbWV2YWwpOwogCi1pbnQgZ2V0X2NvbXBhdF90aW1lc3BlYyhzdHJ1Y3QgdGltZXNwZWMgKnRzLCBjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3RzKQorc3RhdGljIGludCBfX2NvbXBhdF9nZXRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjICp0cywgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKmN0cykKIHsKIAlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGN0cywgc2l6ZW9mKCpjdHMpKSB8fAogCQkJX19nZXRfdXNlcih0cy0+dHZfc2VjLCAmY3RzLT50dl9zZWMpIHx8CiAJCQlfX2dldF91c2VyKHRzLT50dl9uc2VjLCAmY3RzLT50dl9uc2VjKSkgPyAtRUZBVUxUIDogMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGdldF9jb21wYXRfdGltZXNwZWMpOwogCi1pbnQgcHV0X2NvbXBhdF90aW1lc3BlYyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3RzKQorc3RhdGljIGludCBfX2NvbXBhdF9wdXRfdGltZXNwZWMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cywgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKmN0cykKIHsKIAlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjdHMsIHNpemVvZigqY3RzKSkgfHwKIAkJCV9fcHV0X3VzZXIodHMtPnR2X3NlYywgJmN0cy0+dHZfc2VjKSB8fAogCQkJX19wdXRfdXNlcih0cy0+dHZfbnNlYywgJmN0cy0+dHZfbnNlYykpID8gLUVGQVVMVCA6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwdXRfY29tcGF0X3RpbWVzcGVjKTsKIAogaW50IGNvbXBhdF9nZXRfdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqdHYsIGNvbnN0IHZvaWQgX191c2VyICp1dHYpCiB7CiAJaWYgKENPTVBBVF9VU0VfNjRCSVRfVElNRSkKIAkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKHR2LCB1dHYsIHNpemVvZiAqdHYpID8gLUVGQVVMVCA6IDA7CiAJZWxzZQotCQlyZXR1cm4gZ2V0X2NvbXBhdF90aW1ldmFsKHR2LCB1dHYpOworCQlyZXR1cm4gX19jb21wYXRfZ2V0X3RpbWV2YWwodHYsIHV0dik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21wYXRfZ2V0X3RpbWV2YWwpOwogCkBAIC0xOTEsNyArMTY4LDcgQEAKIAlpZiAoQ09NUEFUX1VTRV82NEJJVF9USU1FKQogCQlyZXR1cm4gY29weV90b191c2VyKHV0diwgdHYsIHNpemVvZiAqdHYpID8gLUVGQVVMVCA6IDA7CiAJZWxzZQotCQlyZXR1cm4gcHV0X2NvbXBhdF90aW1ldmFsKHR2LCB1dHYpOworCQlyZXR1cm4gX19jb21wYXRfcHV0X3RpbWV2YWwodHYsIHV0dik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21wYXRfcHV0X3RpbWV2YWwpOwogCkBAIC0yMDAsNyArMTc3LDcgQEAKIAlpZiAoQ09NUEFUX1VTRV82NEJJVF9USU1FKQogCQlyZXR1cm4gY29weV9mcm9tX3VzZXIodHMsIHV0cywgc2l6ZW9mICp0cykgPyAtRUZBVUxUIDogMDsKIAllbHNlCi0JCXJldHVybiBnZXRfY29tcGF0X3RpbWVzcGVjKHRzLCB1dHMpOworCQlyZXR1cm4gX19jb21wYXRfZ2V0X3RpbWVzcGVjKHRzLCB1dHMpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY29tcGF0X2dldF90aW1lc3BlYyk7CiAKQEAgLTIwOSwxMCArMTg2LDMzIEBACiAJaWYgKENPTVBBVF9VU0VfNjRCSVRfVElNRSkKIAkJcmV0dXJuIGNvcHlfdG9fdXNlcih1dHMsIHRzLCBzaXplb2YgKnRzKSA/IC1FRkFVTFQgOiAwOwogCWVsc2UKLQkJcmV0dXJuIHB1dF9jb21wYXRfdGltZXNwZWModHMsIHV0cyk7CisJCXJldHVybiBfX2NvbXBhdF9wdXRfdGltZXNwZWModHMsIHV0cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21wYXRfcHV0X3RpbWVzcGVjKTsKIAoraW50IGNvbXBhdF9jb252ZXJ0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiprdHMsCisJCQkgICAgY29uc3Qgdm9pZCBfX3VzZXIgKmN0cykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXRzOworCisJaWYgKCFjdHMgfHwgQ09NUEFUX1VTRV82NEJJVF9USU1FKSB7CisJCSprdHMgPSAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKWN0czsKKwkJcmV0dXJuIDA7CisJfQorCisJdXRzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHRzKSk7CisJaWYgKCF1dHMpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb21wYXRfZ2V0X3RpbWVzcGVjKCZ0cywgY3RzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcih1dHMsICZ0cywgc2l6ZW9mKHRzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJKmt0cyA9IHV0czsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGxvbmcgY29tcGF0X25hbm9zbGVlcF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KQogewogCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpybXRwOwpAQCAtMjI5LDIxICsyMjksMjEgQEAKIAlpZiAocmV0KSB7CiAJCXJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAuY29tcGF0X3JtdHA7CiAKLQkJaWYgKHJtdHAgJiYgcHV0X2NvbXBhdF90aW1lc3BlYygmcm10LCBybXRwKSkKKwkJaWYgKHJtdHAgJiYgY29tcGF0X3B1dF90aW1lc3BlYygmcm10LCBybXRwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25hbm9zbGVlcChzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqcnF0cCwKLQkJCQkgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpybXRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihuYW5vc2xlZXAsIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHJxdHAsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCBybXRwKQogewogCXN0cnVjdCB0aW1lc3BlYyB0dSwgcm10OwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlsb25nIHJldDsKIAotCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZ0dSwgcnF0cCkpCisJaWYgKGNvbXBhdF9nZXRfdGltZXNwZWMoJnR1LCBycXRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoIXRpbWVzcGVjX3ZhbGlkKCZ0dSkpCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJcmVzdGFydC0+Zm4gPSBjb21wYXRfbmFub3NsZWVwX3Jlc3RhcnQ7CiAJCXJlc3RhcnQtPm5hbm9zbGVlcC5jb21wYXRfcm10cCA9IHJtdHA7CiAKLQkJaWYgKHJtdHAgJiYgcHV0X2NvbXBhdF90aW1lc3BlYygmcm10LCBybXRwKSkKKwkJaWYgKHJtdHAgJiYgY29tcGF0X3B1dF90aW1lc3BlYygmcm10LCBybXRwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMzI4LDcgKzMyOCw3IEBACiAJcmV0dXJuIGNvbXBhdF9qaWZmaWVzX3RvX2Nsb2NrX3QoY2xvY2tfdF90b19qaWZmaWVzKHgpKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdGltZXMoc3RydWN0IGNvbXBhdF90bXMgX191c2VyICp0YnVmKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMSh0aW1lcywgc3RydWN0IGNvbXBhdF90bXMgX191c2VyICosIHRidWYpCiB7CiAJaWYgKHRidWYpIHsKIAkJc3RydWN0IHRtcyB0bXM7CkBAIC0zNTQsNyArMzU0LDcgQEAKICAqIHR5cGVzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBwdXRfdXNlcigpL2dldF91c2VyKCkuCiAgKi8KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2lncGVuZGluZyhjb21wYXRfb2xkX3NpZ3NldF90IF9fdXNlciAqc2V0KQorQ09NUEFUX1NZU0NBTExfREVGSU5FMShzaWdwZW5kaW5nLCBjb21wYXRfb2xkX3NpZ3NldF90IF9fdXNlciAqLCBzZXQpCiB7CiAJb2xkX3NpZ3NldF90IHM7CiAJbG9uZyByZXQ7CkBAIC00MjQsOCArNDI0LDggQEAKIAogI2VuZGlmCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsCi0JCXN0cnVjdCBjb21wYXRfcmxpbWl0IF9fdXNlciAqcmxpbSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoc2V0cmxpbWl0LCB1bnNpZ25lZCBpbnQsIHJlc291cmNlLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9ybGltaXQgX191c2VyICosIHJsaW0pCiB7CiAJc3RydWN0IHJsaW1pdCByOwogCkBAIC00NDMsMTUgKzQ0MywxNSBAQAogCiAjaWZkZWYgQ09NUEFUX1JMSU1fT0xEX0lORklOSVRZCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX29sZF9nZXRybGltaXQodW5zaWduZWQgaW50IHJlc291cmNlLAotCQlzdHJ1Y3QgY29tcGF0X3JsaW1pdCBfX3VzZXIgKnJsaW0pCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKG9sZF9nZXRybGltaXQsIHVuc2lnbmVkIGludCwgcmVzb3VyY2UsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3JsaW1pdCBfX3VzZXIgKiwgcmxpbSkKIHsKIAlzdHJ1Y3QgcmxpbWl0IHI7CiAJaW50IHJldDsKIAltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CiAKIAlzZXRfZnMoS0VSTkVMX0RTKTsKLQlyZXQgPSBzeXNfb2xkX2dldHJsaW1pdChyZXNvdXJjZSwgJnIpOworCXJldCA9IHN5c19vbGRfZ2V0cmxpbWl0KHJlc291cmNlLCAoc3RydWN0IHJsaW1pdCBfX3VzZXIgKikmcik7CiAJc2V0X2ZzKG9sZF9mcyk7CiAKIAlpZiAoIXJldCkgewpAQCAtNDcwLDggKzQ3MCw4IEBACiAKICNlbmRpZgogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRybGltaXQodW5zaWduZWQgaW50IHJlc291cmNlLAotCQlzdHJ1Y3QgY29tcGF0X3JsaW1pdCBfX3VzZXIgKnJsaW0pCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKGdldHJsaW1pdCwgdW5zaWduZWQgaW50LCByZXNvdXJjZSwKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfcmxpbWl0IF9fdXNlciAqLCBybGltKQogewogCXN0cnVjdCBybGltaXQgcjsKIAlpbnQgcmV0OwpAQCAtNTk2LDkgKzU5Niw5IEBACiAJcmV0dXJuIGNvbXBhdF9nZXRfYml0bWFwKGssIHVzZXJfbWFza19wdHIsIGxlbiAqIDgpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zY2hlZF9zZXRhZmZpbml0eShjb21wYXRfcGlkX3QgcGlkLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBsZW4sCi0JCQkJCSAgICAgY29tcGF0X3Vsb25nX3QgX191c2VyICp1c2VyX21hc2tfcHRyKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzY2hlZF9zZXRhZmZpbml0eSwgY29tcGF0X3BpZF90LCBwaWQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQsIGxlbiwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCB1c2VyX21hc2tfcHRyKQogewogCWNwdW1hc2tfdmFyX3QgbmV3X21hc2s7CiAJaW50IHJldHZhbDsKQEAgLTYxNiw4ICs2MTYsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NjaGVkX2dldGFmZmluaXR5KGNvbXBhdF9waWRfdCBwaWQsIHVuc2lnbmVkIGludCBsZW4sCi0JCQkJCSAgICAgY29tcGF0X3Vsb25nX3QgX191c2VyICp1c2VyX21hc2tfcHRyKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzY2hlZF9nZXRhZmZpbml0eSwgY29tcGF0X3BpZF90LCAgcGlkLCB1bnNpZ25lZCBpbnQsIGxlbiwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190IF9fdXNlciAqLCB1c2VyX21hc2tfcHRyKQogewogCWludCByZXQ7CiAJY3B1bWFza192YXJfdCBtYXNrOwpAQCAtNjQ3LDggKzY0Nyw4IEBACiBpbnQgZ2V0X2NvbXBhdF9pdGltZXJzcGVjKHN0cnVjdCBpdGltZXJzcGVjICpkc3QsCiAJCQkgIGNvbnN0IHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKnNyYykKIHsKLQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmZHN0LT5pdF9pbnRlcnZhbCwgJnNyYy0+aXRfaW50ZXJ2YWwpIHx8Ci0JICAgIGdldF9jb21wYXRfdGltZXNwZWMoJmRzdC0+aXRfdmFsdWUsICZzcmMtPml0X3ZhbHVlKSkKKwlpZiAoX19jb21wYXRfZ2V0X3RpbWVzcGVjKCZkc3QtPml0X2ludGVydmFsLCAmc3JjLT5pdF9pbnRlcnZhbCkgfHwKKwkgICAgX19jb21wYXRfZ2V0X3RpbWVzcGVjKCZkc3QtPml0X3ZhbHVlLCAmc3JjLT5pdF92YWx1ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtNjU2LDE1ICs2NTYsMTUgQEAKIGludCBwdXRfY29tcGF0X2l0aW1lcnNwZWMoc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqZHN0LAogCQkJICBjb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyAqc3JjKQogewotCWlmIChwdXRfY29tcGF0X3RpbWVzcGVjKCZzcmMtPml0X2ludGVydmFsLCAmZHN0LT5pdF9pbnRlcnZhbCkgfHwKLQkgICAgcHV0X2NvbXBhdF90aW1lc3BlYygmc3JjLT5pdF92YWx1ZSwgJmRzdC0+aXRfdmFsdWUpKQorCWlmIChfX2NvbXBhdF9wdXRfdGltZXNwZWMoJnNyYy0+aXRfaW50ZXJ2YWwsICZkc3QtPml0X2ludGVydmFsKSB8fAorCSAgICBfX2NvbXBhdF9wdXRfdGltZXNwZWMoJnNyYy0+aXRfdmFsdWUsICZkc3QtPml0X3ZhbHVlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKLWxvbmcgY29tcGF0X3N5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAotCQkJc3RydWN0IGNvbXBhdF9zaWdldmVudCBfX3VzZXIgKnRpbWVyX2V2ZW50X3NwZWMsCi0JCQl0aW1lcl90IF9fdXNlciAqY3JlYXRlZF90aW1lcl9pZCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTModGltZXJfY3JlYXRlLCBjbG9ja2lkX3QsIHdoaWNoX2Nsb2NrLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9zaWdldmVudCBfX3VzZXIgKiwgdGltZXJfZXZlbnRfc3BlYywKKwkJICAgICAgIHRpbWVyX3QgX191c2VyICosIGNyZWF0ZWRfdGltZXJfaWQpCiB7CiAJc3RydWN0IHNpZ2V2ZW50IF9fdXNlciAqZXZlbnQgPSBOVUxMOwogCkBAIC02ODAsOSArNjgwLDkgQEAKIAlyZXR1cm4gc3lzX3RpbWVyX2NyZWF0ZSh3aGljaF9jbG9jaywgZXZlbnQsIGNyZWF0ZWRfdGltZXJfaWQpOwogfQogCi1sb25nIGNvbXBhdF9zeXNfdGltZXJfc2V0dGltZSh0aW1lcl90IHRpbWVyX2lkLCBpbnQgZmxhZ3MsCi0JCQkgIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKm5ldywKLQkJCSAgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqb2xkKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNCh0aW1lcl9zZXR0aW1lLCB0aW1lcl90LCB0aW1lcl9pZCwgaW50LCBmbGFncywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKiwgbmV3LAorCQkgICAgICAgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqLCBvbGQpCiB7CiAJbG9uZyBlcnI7CiAJbW1fc2VnbWVudF90IG9sZGZzOwpAQCAtNzAzLDggKzcwMyw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotbG9uZyBjb21wYXRfc3lzX3RpbWVyX2dldHRpbWUodGltZXJfdCB0aW1lcl9pZCwKLQkJc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqc2V0dGluZykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIodGltZXJfZ2V0dGltZSwgdGltZXJfdCwgdGltZXJfaWQsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgX191c2VyICosIHNldHRpbmcpCiB7CiAJbG9uZyBlcnI7CiAJbW1fc2VnbWVudF90IG9sZGZzOwpAQCAtNzIwLDE0ICs3MjAsMTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZShjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCi0JCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0cCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoY2xvY2tfc2V0dGltZSwgY2xvY2tpZF90LCB3aGljaF9jbG9jaywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRwKQogewogCWxvbmcgZXJyOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKLQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmdHMsIHRwKSkKKwlpZiAoY29tcGF0X2dldF90aW1lc3BlYygmdHMsIHRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJb2xkZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoS0VSTkVMX0RTKTsKQEAgLTczNyw4ICs3MzcsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLWxvbmcgY29tcGF0X3N5c19jbG9ja19nZXR0aW1lKGNsb2NraWRfdCB3aGljaF9jbG9jaywKLQkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihjbG9ja19nZXR0aW1lLCBjbG9ja2lkX3QsIHdoaWNoX2Nsb2NrLAorCQkgICAgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKiwgdHApCiB7CiAJbG9uZyBlcnI7CiAJbW1fc2VnbWVudF90IG9sZGZzOwpAQCAtNzQ5LDEzICs3NDksMTMgQEAKIAllcnIgPSBzeXNfY2xvY2tfZ2V0dGltZSh3aGljaF9jbG9jaywKIAkJCQkoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKSAmdHMpOwogCXNldF9mcyhvbGRmcyk7Ci0JaWYgKCFlcnIgJiYgcHV0X2NvbXBhdF90aW1lc3BlYygmdHMsIHRwKSkKKwlpZiAoIWVyciAmJiBjb21wYXRfcHV0X3RpbWVzcGVjKCZ0cywgdHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gZXJyOwogfQogCi1sb25nIGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZShjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCi0JCXN0cnVjdCBjb21wYXRfdGltZXggX191c2VyICp1dHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUyKGNsb2NrX2FkanRpbWUsIGNsb2NraWRfdCwgd2hpY2hfY2xvY2ssCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqLCB1dHApCiB7CiAJc3RydWN0IHRpbWV4IHR4YzsKIAltbV9zZWdtZW50X3Qgb2xkZnM7CkBAIC03NzcsOCArNzc3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1sb25nIGNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzKGNsb2NraWRfdCB3aGljaF9jbG9jaywKLQkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRwKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMihjbG9ja19nZXRyZXMsIGNsb2NraWRfdCwgd2hpY2hfY2xvY2ssCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCB0cCkKIHsKIAlsb25nIGVycjsKIAltbV9zZWdtZW50X3Qgb2xkZnM7CkBAIC03ODksNyArNzg5LDcgQEAKIAllcnIgPSBzeXNfY2xvY2tfZ2V0cmVzKHdoaWNoX2Nsb2NrLAogCQkJICAgICAgIChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopICZ0cyk7CiAJc2V0X2ZzKG9sZGZzKTsKLQlpZiAoIWVyciAmJiB0cCAmJiBwdXRfY29tcGF0X3RpbWVzcGVjKCZ0cywgdHApKQorCWlmICghZXJyICYmIHRwICYmIGNvbXBhdF9wdXRfdGltZXNwZWMoJnRzLCB0cCkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBlcnI7CiB9CkBAIC03OTksNyArNzk5LDcgQEAKIAlsb25nIGVycjsKIAltbV9zZWdtZW50X3Qgb2xkZnM7CiAJc3RydWN0IHRpbWVzcGVjIHR1OwotCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgKnJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAuY29tcGF0X3JtdHA7CisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnJtdHAgPSByZXN0YXJ0LT5uYW5vc2xlZXAuY29tcGF0X3JtdHA7CiAKIAlyZXN0YXJ0LT5uYW5vc2xlZXAucm10cCA9IChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopICZ0dTsKIAlvbGRmcyA9IGdldF9mcygpOwpAQCAtODA4LDcgKzgwOCw3IEBACiAJc2V0X2ZzKG9sZGZzKTsKIAogCWlmICgoZXJyID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spICYmIHJtdHAgJiYKLQkgICAgcHV0X2NvbXBhdF90aW1lc3BlYygmdHUsIHJtdHApKQorCSAgICBjb21wYXRfcHV0X3RpbWVzcGVjKCZ0dSwgcm10cCkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGVyciA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSB7CkBAIC04MTgsMTYgKzgxOCwxNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLWxvbmcgY29tcGF0X3N5c19jbG9ja19uYW5vc2xlZXAoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBpbnQgZmxhZ3MsCi0JCQkgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnJxdHAsCi0JCQkgICAgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnJtdHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KGNsb2NrX25hbm9zbGVlcCwgY2xvY2tpZF90LCB3aGljaF9jbG9jaywgaW50LCBmbGFncywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHJxdHAsCisJCSAgICAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqLCBybXRwKQogewogCWxvbmcgZXJyOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlzdHJ1Y3QgdGltZXNwZWMgaW4sIG91dDsKIAlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydDsKIAotCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZpbiwgcnF0cCkpCisJaWYgKGNvbXBhdF9nZXRfdGltZXNwZWMoJmluLCBycXRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlvbGRmcyA9IGdldF9mcygpOwpAQCAtODM4LDcgKzgzOCw3IEBACiAJc2V0X2ZzKG9sZGZzKTsKIAogCWlmICgoZXJyID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spICYmIHJtdHAgJiYKLQkgICAgcHV0X2NvbXBhdF90aW1lc3BlYygmb3V0LCBybXRwKSkKKwkgICAgY29tcGF0X3B1dF90aW1lc3BlYygmb3V0LCBybXRwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoZXJyID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAKIC8qIGNvbXBhdF90aW1lX3QgaXMgYSAzMiBiaXQgImxvbmciIGFuZCBuZWVkcyB0byBnZXQgY29udmVydGVkLiAqLwogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c190aW1lKGNvbXBhdF90aW1lX3QgX191c2VyICogdGxvYykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEodGltZSwgY29tcGF0X3RpbWVfdCBfX3VzZXIgKiwgdGxvYykKIHsKIAljb21wYXRfdGltZV90IGk7CiAJc3RydWN0IHRpbWV2YWwgdHY7CkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogCXJldHVybiBpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zdGltZShjb21wYXRfdGltZV90IF9fdXNlciAqdHB0cikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTEoc3RpbWUsIGNvbXBhdF90aW1lX3QgX191c2VyICosIHRwdHIpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHR2OwogCWludCBlcnI7CkBAIC0xMDQ2LDcgKzEwNDYsNyBAQAogCiAjZW5kaWYgLyogX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FICovCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2FkanRpbWV4KHN0cnVjdCBjb21wYXRfdGltZXggX191c2VyICp1dHApCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUxKGFkanRpbWV4LCBzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqLCB1dHApCiB7CiAJc3RydWN0IHRpbWV4IHR4YzsKIAlpbnQgZXJyLCByZXQ7CkBAIC0xMDY1LDExICsxMDY1LDExIEBACiB9CiAKICNpZmRlZiBDT05GSUdfTlVNQQotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbW92ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCi0JCWNvbXBhdF91cHRyX3QgX191c2VyICpwYWdlczMyLAotCQljb25zdCBpbnQgX191c2VyICpub2RlcywKLQkJaW50IF9fdXNlciAqc3RhdHVzLAotCQlpbnQgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KG1vdmVfcGFnZXMsIHBpZF90LCBwaWQsIGNvbXBhdF91bG9uZ190LCBucl9wYWdlcywKKwkJICAgICAgIGNvbXBhdF91cHRyX3QgX191c2VyICosIHBhZ2VzMzIsCisJCSAgICAgICBjb25zdCBpbnQgX191c2VyICosIG5vZGVzLAorCQkgICAgICAgaW50IF9fdXNlciAqLCBzdGF0dXMsCisJCSAgICAgICBpbnQsIGZsYWdzKQogewogCWNvbnN0IHZvaWQgX191c2VyICogX191c2VyICpwYWdlczsKIAlpbnQgaTsKQEAgLTEwODUsMTAgKzEwODUsMTAgQEAKIAlyZXR1cm4gc3lzX21vdmVfcGFnZXMocGlkLCBucl9wYWdlcywgcGFnZXMsIG5vZGVzLCBzdGF0dXMsIGZsYWdzKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbWlncmF0ZV9wYWdlcyhjb21wYXRfcGlkX3QgcGlkLAotCQkJY29tcGF0X3Vsb25nX3QgbWF4bm9kZSwKLQkJCWNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqb2xkX25vZGVzLAotCQkJY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICpuZXdfbm9kZXMpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KG1pZ3JhdGVfcGFnZXMsIGNvbXBhdF9waWRfdCwgcGlkLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIG1heG5vZGUsCisJCSAgICAgICBjb25zdCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgb2xkX25vZGVzLAorCQkgICAgICAgY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICosIG5ld19ub2RlcykKIHsKIAl1bnNpZ25lZCBsb25nIF9fdXNlciAqb2xkID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIF9fdXNlciAqbmV3ID0gTlVMTDsKQEAgLTExMzAsNyArMTEzMCw3IEBACiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJcmV0ID0gc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbChwaWQsIChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopJnQpOwogCXNldF9mcyhvbGRfZnMpOwotCWlmIChwdXRfY29tcGF0X3RpbWVzcGVjKCZ0LCBpbnRlcnZhbCkpCisJaWYgKGNvbXBhdF9wdXRfdGltZXNwZWMoJnQsIGludGVydmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9rZXJuZWwvY3B1L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWFiMDUyLi4wMDAwMDAwCi0tLSBhL2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vYmoteQk9IGlkbGUubwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdS9pZGxlLmMgYi9rZXJuZWwvY3B1L2lkbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3ZjQ5NC4uMDAwMDAwMAotLS0gYS9rZXJuZWwvY3B1L2lkbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogR2VuZXJpYyBlbnRyeSBwb2ludCBmb3IgdGhlIGlkbGUgdGhyZWFkcwotICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC90aWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdGFja3Byb3RlY3Rvci5oPgotCi0jaW5jbHVkZSA8YXNtL3RsYi5oPgotCi0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+Ci0KLXN0YXRpYyBpbnQgX19yZWFkX21vc3RseSBjcHVfaWRsZV9mb3JjZV9wb2xsOwotCi12b2lkIGNwdV9pZGxlX3BvbGxfY3RybChib29sIGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKSB7Ci0JCWNwdV9pZGxlX2ZvcmNlX3BvbGwrKzsKLQl9IGVsc2UgewotCQljcHVfaWRsZV9mb3JjZV9wb2xsLS07Ci0JCVdBUk5fT05fT05DRShjcHVfaWRsZV9mb3JjZV9wb2xsIDwgMCk7Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfSURMRV9QT0xMX1NFVFVQCi1zdGF0aWMgaW50IF9faW5pdCBjcHVfaWRsZV9wb2xsX3NldHVwKGNoYXIgKl9fdW51c2VkKQotewotCWNwdV9pZGxlX2ZvcmNlX3BvbGwgPSAxOwotCXJldHVybiAxOwotfQotX19zZXR1cCgibm9obHQiLCBjcHVfaWRsZV9wb2xsX3NldHVwKTsKLQotc3RhdGljIGludCBfX2luaXQgY3B1X2lkbGVfbm9wb2xsX3NldHVwKGNoYXIgKl9fdW51c2VkKQotewotCWNwdV9pZGxlX2ZvcmNlX3BvbGwgPSAwOwotCXJldHVybiAxOwotfQotX19zZXR1cCgiaGx0IiwgY3B1X2lkbGVfbm9wb2xsX3NldHVwKTsKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBjcHVfaWRsZV9wb2xsKHZvaWQpCi17Ci0JcmN1X2lkbGVfZW50ZXIoKTsKLQl0cmFjZV9jcHVfaWRsZV9yY3VpZGxlKDAsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXdoaWxlICghdGlmX25lZWRfcmVzY2hlZCgpKQotCQljcHVfcmVsYXgoKTsKLQl0cmFjZV9jcHVfaWRsZV9yY3VpZGxlKFBXUl9FVkVOVF9FWElULCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXJjdV9pZGxlX2V4aXQoKTsKLQlyZXR1cm4gMTsKLX0KLQotLyogV2VhayBpbXBsZW1lbnRhdGlvbnMgZm9yIG9wdGlvbmFsIGFyY2ggc3BlY2lmaWMgZnVuY3Rpb25zICovCi12b2lkIF9fd2VhayBhcmNoX2NwdV9pZGxlX3ByZXBhcmUodm9pZCkgeyB9Ci12b2lkIF9fd2VhayBhcmNoX2NwdV9pZGxlX2VudGVyKHZvaWQpIHsgfQotdm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9leGl0KHZvaWQpIHsgfQotdm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9kZWFkKHZvaWQpIHsgfQotdm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZSh2b2lkKQotewotCWNwdV9pZGxlX2ZvcmNlX3BvbGwgPSAxOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLX0KLQotLyoKLSAqIEdlbmVyaWMgaWRsZSBsb29wIGltcGxlbWVudGF0aW9uCi0gKi8KLXN0YXRpYyB2b2lkIGNwdV9pZGxlX2xvb3Aodm9pZCkKLXsKLQl3aGlsZSAoMSkgewotCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOwotCi0JCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJCWNoZWNrX3BndF9jYWNoZSgpOwotCQkJcm1iKCk7Ci0KLQkJCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKQotCQkJCWFyY2hfY3B1X2lkbGVfZGVhZCgpOwotCi0JCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQkJYXJjaF9jcHVfaWRsZV9lbnRlcigpOwotCi0JCQkvKgotCQkJICogSW4gcG9sbCBtb2RlIHdlIHJlZW5hYmxlIGludGVycnVwdHMgYW5kIHNwaW4uCi0JCQkgKgotCQkJICogQWxzbyBpZiB3ZSBkZXRlY3RlZCBpbiB0aGUgd2FrZXVwIGZyb20gaWRsZQotCQkJICogcGF0aCB0aGF0IHRoZSB0aWNrIGJyb2FkY2FzdCBkZXZpY2UgZXhwaXJlZAotCQkJICogZm9yIHVzLCB3ZSBkb24ndCB3YW50IHRvIGdvIGRlZXAgaWRsZSBhcyB3ZQotCQkJICoga25vdyB0aGF0IHRoZSBJUEkgaXMgZ29pbmcgdG8gYXJyaXZlIHJpZ2h0Ci0JCQkgKiBhd2F5Ci0JCQkgKi8KLQkJCWlmIChjcHVfaWRsZV9mb3JjZV9wb2xsIHx8IHRpY2tfY2hlY2tfYnJvYWRjYXN0X2V4cGlyZWQoKSkgewotCQkJCWNwdV9pZGxlX3BvbGwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFjdXJyZW50X2Nscl9wb2xsaW5nX2FuZF90ZXN0KCkpIHsKLQkJCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7Ci0JCQkJCXJjdV9pZGxlX2VudGVyKCk7Ci0JCQkJCWFyY2hfY3B1X2lkbGUoKTsKLQkJCQkJV0FSTl9PTl9PTkNFKGlycXNfZGlzYWJsZWQoKSk7Ci0JCQkJCXJjdV9pZGxlX2V4aXQoKTsKLQkJCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJCQl9Ci0JCQkJX19jdXJyZW50X3NldF9wb2xsaW5nKCk7Ci0JCQl9Ci0JCQlhcmNoX2NwdV9pZGxlX2V4aXQoKTsKLQkJfQotCi0JCS8qCi0JCSAqIFNpbmNlIHdlIGZlbGwgb3V0IG9mIHRoZSBsb29wIGFib3ZlLCB3ZSBrbm93Ci0JCSAqIFRJRl9ORUVEX1JFU0NIRUQgbXVzdCBiZSBzZXQsIHByb3BhZ2F0ZSBpdCBpbnRvCi0JCSAqIFBSRUVNUFRfTkVFRF9SRVNDSEVELgotCQkgKgotCQkgKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgZm9yIHBvbGxpbmcgaWRsZSBsb29wcyB3ZSB3aWxsCi0JCSAqIG5vdCBoYXZlIGhhZCBhbiBJUEkgdG8gZm9sZCB0aGUgc3RhdGUgZm9yIHVzLgotCQkgKi8KLQkJcHJlZW1wdF9zZXRfbmVlZF9yZXNjaGVkKCk7Ci0JCXRpY2tfbm9oel9pZGxlX2V4aXQoKTsKLQkJc2NoZWR1bGVfcHJlZW1wdF9kaXNhYmxlZCgpOwotCX0KLX0KLQotdm9pZCBjcHVfc3RhcnR1cF9lbnRyeShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKQotewotCS8qCi0JICogVGhpcyAjaWZkZWYgbmVlZHMgdG8gZGllLCBidXQgaXQncyB0b28gbGF0ZSBpbiB0aGUgY3ljbGUgdG8KLQkgKiBtYWtlIHRoaXMgZ2VuZXJpYyAoYXJtIGFuZCBzaCBoYXZlIG5ldmVyIGludm9rZWQgdGhlIGNhbmFyeQotCSAqIGluaXQgZm9yIHRoZSBub24gYm9vdCBjcHVzISkuIFdpbGwgYmUgZml4ZWQgaW4gMy4xMQotCSAqLwotI2lmZGVmIENPTkZJR19YODYKLQkvKgotCSAqIElmIHdlJ3JlIHRoZSBub24tYm9vdCBDUFUsIG5vdGhpbmcgc2V0IHRoZSBzdGFjayBjYW5hcnkgdXAKLQkgKiBmb3IgdXMuIFRoZSBib290IENQVSBhbHJlYWR5IGhhcyBpdCBpbml0aWFsaXplZCBidXQgbm8gaGFybQotCSAqIGluIGRvaW5nIGl0IGFnYWluLiBUaGlzIGlzIGEgZ29vZCBwbGFjZSBmb3IgdXBkYXRpbmcgaXQsIGFzCi0JICogd2Ugd29udCBldmVyIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gKHNvIHRoZSBpbnZhbGlkCi0JICogY2FuYXJpZXMgYWxyZWFkeSBvbiB0aGUgc3RhY2sgd29udCBldmVyIHRyaWdnZXIpLgotCSAqLwotCWJvb3RfaW5pdF9zdGFja19jYW5hcnkoKTsKLSNlbmRpZgotCV9fY3VycmVudF9zZXRfcG9sbGluZygpOwotCWFyY2hfY3B1X2lkbGVfcHJlcGFyZSgpOwotCWNwdV9pZGxlX2xvb3AoKTsKLX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmMgYi9rZXJuZWwvZGVidWcvZGVidWdfY29yZS5jCmluZGV4IDMzNGIzOTguLjk5OTgyYTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9kZWJ1Z19jb3JlLmMKKysrIGIva2VybmVsL2RlYnVnL2RlYnVnX2NvcmUuYwpAQCAtMTAzNSw3ICsxMDM1LDcgQEAKICAqIG90aGVyd2lzZSBhcyBhIHF1aWNrIG1lYW5zIHRvIHN0b3AgcHJvZ3JhbSBleGVjdXRpb24gYW5kICJicmVhayIgaW50bwogICogdGhlIGRlYnVnZ2VyLgogICovCi12b2lkIGtnZGJfYnJlYWtwb2ludCh2b2lkKQorbm9pbmxpbmUgdm9pZCBrZ2RiX2JyZWFrcG9pbnQodm9pZCkKIHsKIAlhdG9taWNfaW5jKCZrZ2RiX3NldHRpbmdfYnJlYWtwb2ludCk7CiAJd21iKCk7IC8qIFN5bmMgcG9pbnQgYmVmb3JlIGJyZWFrcG9pbnQgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggZmEwYjJkNC4uNjYxOTUxYSAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTIzMSwxMSArMjMxLDI5IEBACiAjZGVmaW5lIE5SX0FDQ1VNVUxBVEVEX1NBTVBMRVMgMTI4CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCBydW5uaW5nX3NhbXBsZV9sZW5ndGgpOwogCi12b2lkIHBlcmZfc2FtcGxlX2V2ZW50X3Rvb2sodTY0IHNhbXBsZV9sZW5fbnMpCitzdGF0aWMgdm9pZCBwZXJmX2R1cmF0aW9uX3dhcm4oc3RydWN0IGlycV93b3JrICp3KQogeworCXU2NCBhbGxvd2VkX25zID0gQUNDRVNTX09OQ0UocGVyZl9zYW1wbGVfYWxsb3dlZF9ucyk7CiAJdTY0IGF2Z19sb2NhbF9zYW1wbGVfbGVuOwogCXU2NCBsb2NhbF9zYW1wbGVzX2xlbjsKKworCWxvY2FsX3NhbXBsZXNfbGVuID0gX19nZXRfY3B1X3ZhcihydW5uaW5nX3NhbXBsZV9sZW5ndGgpOworCWF2Z19sb2NhbF9zYW1wbGVfbGVuID0gbG9jYWxfc2FtcGxlc19sZW4vTlJfQUNDVU1VTEFURURfU0FNUExFUzsKKworCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcKKwkJCSJwZXJmIGludGVycnVwdCB0b29rIHRvbyBsb25nICglbGxkID4gJWxsZCksIGxvd2VyaW5nICIKKwkJCSJrZXJuZWwucGVyZl9ldmVudF9tYXhfc2FtcGxlX3JhdGUgdG8gJWRcbiIsCisJCQlhdmdfbG9jYWxfc2FtcGxlX2xlbiwgYWxsb3dlZF9ucyA+PiAxLAorCQkJc3lzY3RsX3BlcmZfZXZlbnRfc2FtcGxlX3JhdGUpOworfQorCitzdGF0aWMgREVGSU5FX0lSUV9XT1JLKHBlcmZfZHVyYXRpb25fd29yaywgcGVyZl9kdXJhdGlvbl93YXJuKTsKKwordm9pZCBwZXJmX3NhbXBsZV9ldmVudF90b29rKHU2NCBzYW1wbGVfbGVuX25zKQorewogCXU2NCBhbGxvd2VkX25zID0gQUNDRVNTX09OQ0UocGVyZl9zYW1wbGVfYWxsb3dlZF9ucyk7CisJdTY0IGF2Z19sb2NhbF9zYW1wbGVfbGVuOworCXU2NCBsb2NhbF9zYW1wbGVzX2xlbjsKIAogCWlmIChhbGxvd2VkX25zID09IDApCiAJCXJldHVybjsKQEAgLTI2MywxMyArMjgxLDE0IEBACiAJc3lzY3RsX3BlcmZfZXZlbnRfc2FtcGxlX3JhdGUgPSBtYXhfc2FtcGxlc19wZXJfdGljayAqIEhaOwogCXBlcmZfc2FtcGxlX3BlcmlvZF9ucyA9IE5TRUNfUEVSX1NFQyAvIHN5c2N0bF9wZXJmX2V2ZW50X3NhbXBsZV9yYXRlOwogCi0JcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORwotCQkJInBlcmYgc2FtcGxlcyB0b28gbG9uZyAoJWxsZCA+ICVsbGQpLCBsb3dlcmluZyAiCi0JCQkia2VybmVsLnBlcmZfZXZlbnRfbWF4X3NhbXBsZV9yYXRlIHRvICVkXG4iLAotCQkJYXZnX2xvY2FsX3NhbXBsZV9sZW4sIGFsbG93ZWRfbnMsCi0JCQlzeXNjdGxfcGVyZl9ldmVudF9zYW1wbGVfcmF0ZSk7Ci0KIAl1cGRhdGVfcGVyZl9jcHVfbGltaXRzKCk7CisKKwlpZiAoIWlycV93b3JrX3F1ZXVlKCZwZXJmX2R1cmF0aW9uX3dvcmspKSB7CisJCWVhcmx5X3ByaW50aygicGVyZiBpbnRlcnJ1cHQgdG9vayB0b28gbG9uZyAoJWxsZCA+ICVsbGQpLCBsb3dlcmluZyAiCisJCQkgICAgICJrZXJuZWwucGVyZl9ldmVudF9tYXhfc2FtcGxlX3JhdGUgdG8gJWRcbiIsCisJCQkgICAgIGF2Z19sb2NhbF9zYW1wbGVfbGVuLCBhbGxvd2VkX25zID4+IDEsCisJCQkgICAgIHN5c2N0bF9wZXJmX2V2ZW50X3NhbXBsZV9yYXRlKTsKKwl9CiB9CiAKIHN0YXRpYyBhdG9taWM2NF90IHBlcmZfZXZlbnRfaWQ7CkBAIC0xNzE0LDcgKzE3MzMsNyBAQAogCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCAqcGFydGlhbF9ncm91cCA9IE5VTEw7Ci0Jc3RydWN0IHBtdSAqcG11ID0gZ3JvdXBfZXZlbnQtPnBtdTsKKwlzdHJ1Y3QgcG11ICpwbXUgPSBjdHgtPnBtdTsKIAl1NjQgbm93ID0gY3R4LT50aW1lOwogCWJvb2wgc2ltdWxhdGUgPSBmYWxzZTsKIApAQCAtMjU2Myw4ICsyNTgyLDYgQEAKIAkJaWYgKGNwdWN0eC0+Y3R4Lm5yX2JyYW5jaF9zdGFjayA+IDAKIAkJICAgICYmIHBtdS0+Zmx1c2hfYnJhbmNoX3N0YWNrKSB7CiAKLQkJCXBtdSA9IGNwdWN0eC0+Y3R4LnBtdTsKLQogCQkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOwogCiAJCQlwZXJmX3BtdV9kaXNhYmxlKHBtdSk7CkBAIC02Mjk0LDcgKzYzMTEsNyBAQAogICogRW5zdXJlcyBhbGwgY29udGV4dHMgd2l0aCB0aGUgc2FtZSB0YXNrX2N0eF9uciBoYXZlIHRoZSBzYW1lCiAgKiBwbXVfY3B1X2NvbnRleHQgdG9vLgogICovCi1zdGF0aWMgdm9pZCAqZmluZF9wbXVfY29udGV4dChpbnQgY3R4bikKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCBfX3BlcmNwdSAqZmluZF9wbXVfY29udGV4dChpbnQgY3R4bikKIHsKIAlzdHJ1Y3QgcG11ICpwbXU7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9leHRhYmxlLmMgYi9rZXJuZWwvZXh0YWJsZS5jCmluZGV4IDc2M2ZhZjAuLmQ4YTY0NDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leHRhYmxlLmMKKysrIGIva2VybmVsL2V4dGFibGUuYwpAQCAtMzYsNyArMzYsNyBAQAogZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgX19zdG9wX19fZXhfdGFibGVbXTsKIAogLyogQ2xlYXJlZCBieSBidWlsZCB0aW1lIHRvb2xzIGlmIHRoZSB0YWJsZSBpcyBhbHJlYWR5IHNvcnRlZC4gKi8KLXUzMiBfX2luaXRkYXRhIG1haW5fZXh0YWJsZV9zb3J0X25lZWRlZCA9IDE7Cit1MzIgX19pbml0ZGF0YSBfX3Zpc2libGUgbWFpbl9leHRhYmxlX3NvcnRfbmVlZGVkID0gMTsKIAogLyogU29ydCB0aGUga2VybmVsJ3MgYnVpbHQtaW4gZXhjZXB0aW9uIHRhYmxlICovCiB2b2lkIF9faW5pdCBzb3J0X21haW5fZXh0YWJsZSh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggYTE3NjIxYy4uMzMyNjg4ZSAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0yMzcsNiArMjM3LDcgQEAKIAlXQVJOX09OKGF0b21pY19yZWFkKCZ0c2stPnVzYWdlKSk7CiAJV0FSTl9PTih0c2sgPT0gY3VycmVudCk7CiAKKwl0YXNrX251bWFfZnJlZSh0c2spOwogCXNlY3VyaXR5X3Rhc2tfZnJlZSh0c2spOwogCWV4aXRfY3JlZHModHNrKTsKIAlkZWxheWFjY3RfdHNrX2ZyZWUodHNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggNDRhMTI2MS4uNjdkYWNhZiAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTE1Nyw3ICsxNTcsOSBAQAogICogZW5xdWV1ZS4KICAqLwogCisjaWZuZGVmIENPTkZJR19IQVZFX0ZVVEVYX0NNUFhDSEcKIGludCBfX3JlYWRfbW9zdGx5IGZ1dGV4X2NtcHhjaGdfZW5hYmxlZDsKKyNlbmRpZgogCiAvKgogICogRnV0ZXggZmxhZ3MgdXNlZCB0byBlbmNvZGUgb3B0aW9ucyB0byBmdW5jdGlvbnMgYW5kIHByZXNlcnZlIHRoZW0gYWNyb3NzCkBAIC0yMzQsNiArMjM2LDcgQEAKICAqIHdhaXRpbmcgb24gYSBmdXRleC4KICAqLwogc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0IHsKKwlhdG9taWNfdCB3YWl0ZXJzOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgcGxpc3RfaGVhZCBjaGFpbjsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTI1MywyMiArMjU2LDM3IEBACiAJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBoYl93YWl0ZXJzX3BlbmRpbmcoc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYikKKy8qCisgKiBSZWZsZWN0cyBhIG5ldyB3YWl0ZXIgYmVpbmcgYWRkZWQgdG8gdGhlIHdhaXRxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhiX3dhaXRlcnNfaW5jKHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAorCWF0b21pY19pbmMoJmhiLT53YWl0ZXJzKTsKIAkvKgotCSAqIFRhc2tzIHRyeWluZyB0byBlbnRlciB0aGUgY3JpdGljYWwgcmVnaW9uIGFyZSBtb3N0IGxpa2VseQotCSAqIHBvdGVudGlhbCB3YWl0ZXJzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGxpc3QuIEVuc3VyZQotCSAqIHRoYXQgd2FrZXJzIHdvbid0IG1pc3MgdG8tYmUtc2xlcHQgdGFza3MgaW4gdGhlIHdpbmRvdyBiZXR3ZWVuCi0JICogdGhlIHdhaXQgY2FsbCBhbmQgdGhlIGFjdHVhbCBwbGlzdF9hZGQuCisJICogRnVsbCBiYXJyaWVyIChBKSwgc2VlIHRoZSBvcmRlcmluZyBjb21tZW50IGFib3ZlLgogCSAqLwotCWlmIChzcGluX2lzX2xvY2tlZCgmaGItPmxvY2spKQotCQlyZXR1cm4gdHJ1ZTsKLQlzbXBfcm1iKCk7IC8qIE1ha2Ugc3VyZSB3ZSBjaGVjayB0aGUgbG9jayBzdGF0ZSBmaXJzdCAqLworCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOworI2VuZGlmCit9CiAKLQlyZXR1cm4gIXBsaXN0X2hlYWRfZW1wdHkoJmhiLT5jaGFpbik7CisvKgorICogUmVmbGVjdHMgYSB3YWl0ZXIgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSB3YWl0cXVldWUgYnkgd2FrZXVwCisgKiBwYXRocy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhiX3dhaXRlcnNfZGVjKHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWF0b21pY19kZWMoJmhiLT53YWl0ZXJzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBoYl93YWl0ZXJzX3BlbmRpbmcoc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYikKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJcmV0dXJuIGF0b21pY19yZWFkKCZoYi0+d2FpdGVycyk7CiAjZWxzZQotCXJldHVybiB0cnVlOworCXJldHVybiAxOwogI2VuZGlmCiB9CiAKQEAgLTk1NCw2ICs5NzIsNyBAQAogCiAJaGIgPSBjb250YWluZXJfb2YocS0+bG9ja19wdHIsIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCwgbG9jayk7CiAJcGxpc3RfZGVsKCZxLT5saXN0LCAmaGItPmNoYWluKTsKKwloYl93YWl0ZXJzX2RlYyhoYik7CiB9CiAKIC8qCkBAIC0xMjU3LDcgKzEyNzYsOSBAQAogCSAqLwogCWlmIChsaWtlbHkoJmhiMS0+Y2hhaW4gIT0gJmhiMi0+Y2hhaW4pKSB7CiAJCXBsaXN0X2RlbCgmcS0+bGlzdCwgJmhiMS0+Y2hhaW4pOworCQloYl93YWl0ZXJzX2RlYyhoYjEpOwogCQlwbGlzdF9hZGQoJnEtPmxpc3QsICZoYjItPmNoYWluKTsKKwkJaGJfd2FpdGVyc19pbmMoaGIyKTsKIAkJcS0+bG9ja19wdHIgPSAmaGIyLT5sb2NrOwogCX0KIAlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5Mik7CkBAIC0xNjAwLDYgKzE2MjEsMTcgQEAKIAlzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiOwogCiAJaGIgPSBoYXNoX2Z1dGV4KCZxLT5rZXkpOworCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIgYmVmb3JlIHRha2luZyB0aGUgbG9jayBzbyB0aGF0CisJICogYSBwb3RlbnRpYWwgd2FrZXIgd29uJ3QgbWlzcyBhIHRvLWJlLXNsZXB0IHRhc2sgdGhhdCBpcworCSAqIHdhaXRpbmcgZm9yIHRoZSBzcGlubG9jay4gVGhpcyBpcyBzYWZlIGFzIGFsbCBxdWV1ZV9sb2NrKCkKKwkgKiB1c2VycyBlbmQgdXAgY2FsbGluZyBxdWV1ZV9tZSgpLiBTaW1pbGFybHksIGZvciBob3VzZWtlZXBpbmcsCisJICogZGVjcmVtZW50IHRoZSBjb3VudGVyIGF0IHF1ZXVlX3VubG9jaygpIHdoZW4gc29tZSBlcnJvciBoYXMKKwkgKiBvY2N1cnJlZCBhbmQgd2UgZG9uJ3QgZW5kIHVwIGFkZGluZyB0aGUgdGFzayB0byB0aGUgbGlzdC4KKwkgKi8KKwloYl93YWl0ZXJzX2luYyhoYik7CisKIAlxLT5sb2NrX3B0ciA9ICZoYi0+bG9jazsKIAogCXNwaW5fbG9jaygmaGItPmxvY2spOyAvKiBpbXBsaWVzIE1CIChBKSAqLwpAQCAtMTYxMSw2ICsxNjQzLDcgQEAKIAlfX3JlbGVhc2VzKCZoYi0+bG9jaykKIHsKIAlzcGluX3VubG9jaygmaGItPmxvY2spOworCWhiX3dhaXRlcnNfZGVjKGhiKTsKIH0KIAogLyoqCkBAIC0yMzQyLDYgKzIzNzUsNyBAQAogCQkgKiBVbnF1ZXVlIHRoZSBmdXRleF9xIGFuZCBkZXRlcm1pbmUgd2hpY2ggaXQgd2FzLgogCQkgKi8KIAkJcGxpc3RfZGVsKCZxLT5saXN0LCAmaGItPmNoYWluKTsKKwkJaGJfd2FpdGVyc19kZWMoaGIpOwogCiAJCS8qIEhhbmRsZSBzcHVyaW91cyB3YWtldXBzIGdyYWNlZnVsbHkgKi8KIAkJcmV0ID0gLUVXT1VMREJMT0NLOwpAQCAtMjg0Myw5ICsyODc3LDI4IEBACiAJcmV0dXJuIGRvX2Z1dGV4KHVhZGRyLCBvcCwgdmFsLCB0cCwgdWFkZHIyLCB2YWwyLCB2YWwzKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGZ1dGV4X2RldGVjdF9jbXB4Y2hnKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19IQVZFX0ZVVEVYX0NNUFhDSEcKKwl1MzIgY3VydmFsOworCisJLyoKKwkgKiBUaGlzIHdpbGwgZmFpbCBhbmQgd2Ugd2FudCBpdC4gU29tZSBhcmNoIGltcGxlbWVudGF0aW9ucyBkbworCSAqIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIHRoZSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYygpCisJICogZnVuY3Rpb25hbGl0eS4gV2Ugd2FudCB0byBrbm93IHRoYXQgYmVmb3JlIHdlIGNhbGwgaW4gYW55CisJICogb2YgdGhlIGNvbXBsZXggY29kZSBwYXRocy4gQWxzbyB3ZSB3YW50IHRvIHByZXZlbnQKKwkgKiByZWdpc3RyYXRpb24gb2Ygcm9idXN0IGxpc3RzIGluIHRoYXQgY2FzZS4gTlVMTCBpcworCSAqIGd1YXJhbnRlZWQgdG8gZmF1bHQgYW5kIHdlIGdldCAtRUZBVUxUIG9uIGZ1bmN0aW9uYWwKKwkgKiBpbXBsZW1lbnRhdGlvbiwgdGhlIG5vbi1mdW5jdGlvbmFsIG9uZXMgd2lsbCByZXR1cm4KKwkgKiAtRU5PU1lTLgorCSAqLworCWlmIChjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCgmY3VydmFsLCBOVUxMLCAwLCAwKSA9PSAtRUZBVUxUKQorCQlmdXRleF9jbXB4Y2hnX2VuYWJsZWQgPSAxOworI2VuZGlmCit9CisKIHN0YXRpYyBpbnQgX19pbml0IGZ1dGV4X2luaXQodm9pZCkKIHsKLQl1MzIgY3VydmFsOwogCXVuc2lnbmVkIGludCBmdXRleF9zaGlmdDsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTI4NjEsMjAgKzI5MTQsMTEgQEAKIAkJCQkJICAgICAgICZmdXRleF9zaGlmdCwgTlVMTCwKIAkJCQkJICAgICAgIGZ1dGV4X2hhc2hzaXplLCBmdXRleF9oYXNoc2l6ZSk7CiAJZnV0ZXhfaGFzaHNpemUgPSAxVUwgPDwgZnV0ZXhfc2hpZnQ7Ci0JLyoKLQkgKiBUaGlzIHdpbGwgZmFpbCBhbmQgd2Ugd2FudCBpdC4gU29tZSBhcmNoIGltcGxlbWVudGF0aW9ucyBkbwotCSAqIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIHRoZSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYygpCi0JICogZnVuY3Rpb25hbGl0eS4gV2Ugd2FudCB0byBrbm93IHRoYXQgYmVmb3JlIHdlIGNhbGwgaW4gYW55Ci0JICogb2YgdGhlIGNvbXBsZXggY29kZSBwYXRocy4gQWxzbyB3ZSB3YW50IHRvIHByZXZlbnQKLQkgKiByZWdpc3RyYXRpb24gb2Ygcm9idXN0IGxpc3RzIGluIHRoYXQgY2FzZS4gTlVMTCBpcwotCSAqIGd1YXJhbnRlZWQgdG8gZmF1bHQgYW5kIHdlIGdldCAtRUZBVUxUIG9uIGZ1bmN0aW9uYWwKLQkgKiBpbXBsZW1lbnRhdGlvbiwgdGhlIG5vbi1mdW5jdGlvbmFsIG9uZXMgd2lsbCByZXR1cm4KLQkgKiAtRU5PU1lTLgotCSAqLwotCWlmIChjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCgmY3VydmFsLCBOVUxMLCAwLCAwKSA9PSAtRUZBVUxUKQotCQlmdXRleF9jbXB4Y2hnX2VuYWJsZWQgPSAxOworCisJZnV0ZXhfZGV0ZWN0X2NtcHhjaGcoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBmdXRleF9oYXNoc2l6ZTsgaSsrKSB7CisJCWF0b21pY19zZXQoJmZ1dGV4X3F1ZXVlc1tpXS53YWl0ZXJzLCAwKTsKIAkJcGxpc3RfaGVhZF9pbml0KCZmdXRleF9xdWV1ZXNbaV0uY2hhaW4pOwogCQlzcGluX2xvY2tfaW5pdCgmZnV0ZXhfcXVldWVzW2ldLmxvY2spOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleF9jb21wYXQuYyBiL2tlcm5lbC9mdXRleF9jb21wYXQuYwppbmRleCBmOWY0NGZkLi41NWM4YzkzIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXhfY29tcGF0LmMKKysrIGIva2VybmVsL2Z1dGV4X2NvbXBhdC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAlpZiAodXRpbWUgJiYgKGNtZCA9PSBGVVRFWF9XQUlUIHx8IGNtZCA9PSBGVVRFWF9MT0NLX1BJIHx8CiAJCSAgICAgIGNtZCA9PSBGVVRFWF9XQUlUX0JJVFNFVCB8fAogCQkgICAgICBjbWQgPT0gRlVURVhfV0FJVF9SRVFVRVVFX1BJKSkgewotCQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmdHMsIHV0aW1lKSkKKwkJaWYgKGNvbXBhdF9nZXRfdGltZXNwZWMoJnRzLCB1dGltZSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKCF0aW1lc3BlY192YWxpZCgmdHMpKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCAwOTA5NDM2Li5kNTUwOTJjIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTE2OCwxOSArMTY4LDYgQEAKIAl9CiB9CiAKLQotLyoKLSAqIEdldCB0aGUgcHJlZmVycmVkIHRhcmdldCBDUFUgZm9yIE5PSFoKLSAqLwotc3RhdGljIGludCBocnRpbWVyX2dldF90YXJnZXQoaW50IHRoaXNfY3B1LCBpbnQgcGlubmVkKQotewotI2lmZGVmIENPTkZJR19OT19IWl9DT01NT04KLQlpZiAoIXBpbm5lZCAmJiBnZXRfc3lzY3RsX3RpbWVyX21pZ3JhdGlvbigpICYmIGlkbGVfY3B1KHRoaXNfY3B1KSkKLQkJcmV0dXJuIGdldF9ub2h6X3RpbWVyX3RhcmdldCgpOwotI2VuZGlmCi0JcmV0dXJuIHRoaXNfY3B1OwotfQotCiAvKgogICogV2l0aCBISUdIUkVTPXkgd2UgZG8gbm90IG1pZ3JhdGUgdGhlIHRpbWVyIHdoZW4gaXQgaXMgZXhwaXJpbmcKICAqIGJlZm9yZSB0aGUgbmV4dCBldmVudCBvbiB0aGUgdGFyZ2V0IGNwdSBiZWNhdXNlIHdlIGNhbm5vdCByZXByb2dyYW0KQEAgLTIxNCw3ICsyMDEsNyBAQAogCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKm5ld19iYXNlOwogCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpuZXdfY3B1X2Jhc2U7CiAJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBjcHUgPSBocnRpbWVyX2dldF90YXJnZXQodGhpc19jcHUsIHBpbm5lZCk7CisJaW50IGNwdSA9IGdldF9ub2h6X3RpbWVyX3RhcmdldChwaW5uZWQpOwogCWludCBiYXNlbnVtID0gYmFzZS0+aW5kZXg7CiAKIGFnYWluOgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9jaGlwLmMgYi9rZXJuZWwvaXJxL2NoaXAuYwppbmRleCBkYzA0YzE2Li42Mzk3ZGYyIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2NoaXAuYworKysgYi9rZXJuZWwvaXJxL2NoaXAuYwpAQCAtMjgxLDYgKzI4MSwxOSBAQAogCX0KIH0KIAordm9pZCB1bm1hc2tfdGhyZWFkZWRfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBkZXNjLT5pcnFfZGF0YS5jaGlwOworCisJaWYgKGNoaXAtPmZsYWdzICYgSVJRQ0hJUF9FT0lfVEhSRUFERUQpCisJCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKKworCWlmIChjaGlwLT5pcnFfdW5tYXNrKSB7CisJCWNoaXAtPmlycV91bm1hc2soJmRlc2MtPmlycV9kYXRhKTsKKwkJaXJxX3N0YXRlX2Nscl9tYXNrZWQoZGVzYyk7CisJfQorfQorCiAvKgogICoJaGFuZGxlX25lc3RlZF9pcnEgLSBIYW5kbGUgYSBuZXN0ZWQgaXJxIGZyb20gYSBpcnEgdGhyZWFkCiAgKglAaXJxOgl0aGUgaW50ZXJydXB0IG51bWJlcgpAQCAtNDM1LDYgKzQ0OCwyNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHByZWZsb3dfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpIHsgfQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIGNvbmRfdW5tYXNrX2VvaV9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgaXJxX2NoaXAgKmNoaXApCit7CisJaWYgKCEoZGVzYy0+aXN0YXRlICYgSVJRU19PTkVTSE9UKSkgeworCQljaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBXZSBuZWVkIHRvIHVubWFzayBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorCSAqIC0gT25lc2hvdCBpcnEgd2hpY2ggZGlkIG5vdCB3YWtlIHRoZSB0aHJlYWQgKGNhdXNlZCBieSBhCisJICogICBzcHVyaW91cyBpbnRlcnJ1cHQgb3IgYSBwcmltYXJ5IGhhbmRsZXIgaGFuZGxpbmcgaXQKKwkgKiAgIGNvbXBsZXRlbHkpLgorCSAqLworCWlmICghaXJxZF9pcnFfZGlzYWJsZWQoJmRlc2MtPmlycV9kYXRhKSAmJgorCSAgICBpcnFkX2lycV9tYXNrZWQoJmRlc2MtPmlycV9kYXRhKSAmJiAhZGVzYy0+dGhyZWFkc19vbmVzaG90KSB7CisJCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKKwkJdW5tYXNrX2lycShkZXNjKTsKKwl9IGVsc2UgaWYgKCEoY2hpcC0+ZmxhZ3MgJiBJUlFDSElQX0VPSV9USFJFQURFRCkpIHsKKwkJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOworCX0KK30KKwogLyoqCiAgKgloYW5kbGVfZmFzdGVvaV9pcnEgLSBpcnEgaGFuZGxlciBmb3IgdHJhbnNwYXJlbnQgY29udHJvbGxlcnMKICAqCUBpcnE6CXRoZSBpbnRlcnJ1cHQgbnVtYmVyCkBAIC00NDgsNiArNDgyLDggQEAKIHZvaWQKIGhhbmRsZV9mYXN0ZW9pX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gZGVzYy0+aXJxX2RhdGEuY2hpcDsKKwogCXJhd19zcGluX2xvY2soJmRlc2MtPmxvY2spOwogCiAJaWYgKHVubGlrZWx5KGlycWRfaXJxX2lucHJvZ3Jlc3MoJmRlc2MtPmlycV9kYXRhKSkpCkBAIC00NzMsMTggKzUwOSwxNCBAQAogCXByZWZsb3dfaGFuZGxlcihkZXNjKTsKIAloYW5kbGVfaXJxX2V2ZW50KGRlc2MpOwogCi0JaWYgKGRlc2MtPmlzdGF0ZSAmIElSUVNfT05FU0hPVCkKLQkJY29uZF91bm1hc2tfaXJxKGRlc2MpOworCWNvbmRfdW5tYXNrX2VvaV9pcnEoZGVzYywgY2hpcCk7CiAKLW91dF9lb2k6Ci0JZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwotb3V0X3VubG9jazoKIAlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogCXJldHVybjsKIG91dDoKLQlpZiAoIShkZXNjLT5pcnFfZGF0YS5jaGlwLT5mbGFncyAmIElSUUNISVBfRU9JX0lGX0hBTkRMRUQpKQotCQlnb3RvIG91dF9lb2k7Ci0JZ290byBvdXRfdW5sb2NrOworCWlmICghKGNoaXAtPmZsYWdzICYgSVJRQ0hJUF9FT0lfSUZfSEFORExFRCkpCisJCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKKwlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaGFuZGxlLmMgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCmluZGV4IDEzMWNhMTcuLjYzNTQ4MDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaGFuZGxlLmMKKysrIGIva2VybmVsL2lycS9oYW5kbGUuYwpAQCAtNDEsNiArNDEsNyBAQAogewogCXJldHVybiBJUlFfTk9ORTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5vX2FjdGlvbik7CiAKIHN0YXRpYyB2b2lkIHdhcm5fbm9fdGhyZWFkKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKIHsKQEAgLTUxLDcgKzUyLDcgQEAKIAkgICAgICAgImJ1dCBubyB0aHJlYWQgZnVuY3Rpb24gYXZhaWxhYmxlLiIsIGlycSwgYWN0aW9uLT5uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgaXJxX3dha2VfdGhyZWFkKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQordm9pZCBfX2lycV93YWtlX3RocmVhZChzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKIHsKIAkvKgogCSAqIEluIGNhc2UgdGhlIHRocmVhZCBjcmFzaGVkIGFuZCB3YXMga2lsbGVkIHdlIGp1c3QgcHJldGVuZCB0aGF0CkBAIC0xNTcsNyArMTU4LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJaXJxX3dha2VfdGhyZWFkKGRlc2MsIGFjdGlvbik7CisJCQlfX2lycV93YWtlX3RocmVhZChkZXNjLCBhY3Rpb24pOwogCiAJCQkvKiBGYWxsIHRocm91Z2ggdG8gYWRkIHRvIHJhbmRvbW5lc3MgKi8KIAkJY2FzZSBJUlFfSEFORExFRDoKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmggYi9rZXJuZWwvaXJxL2ludGVybmFscy5oCmluZGV4IDAwMWZhNWIuLmRkZjFmZmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmgKKysrIGIva2VybmVsL2lycS9pbnRlcm5hbHMuaApAQCAtNiw2ICs2LDcgQEAKICAqIG9mIHRoaXMgZmlsZSBmb3IgeW91ciBub24gY29yZSBjb2RlLgogICovCiAjaW5jbHVkZSA8bGludXgvaXJxZGVzYy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAKICNpZmRlZiBDT05GSUdfU1BBUlNFX0lSUQogIyBkZWZpbmUgSVJRX0JJVE1BUF9CSVRTCShOUl9JUlFTICsgODE5NikKQEAgLTczLDYgKzc0LDcgQEAKIGV4dGVybiB2b2lkIGlycV9wZXJjcHVfZGlzYWJsZShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGludCBjcHUpOwogZXh0ZXJuIHZvaWQgbWFza19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIGV4dGVybiB2b2lkIHVubWFza19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKK2V4dGVybiB2b2lkIHVubWFza190aHJlYWRlZF9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIAogZXh0ZXJuIHZvaWQgaW5pdF9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUsIGludCBucik7CiAKQEAgLTgyLDYgKzg0LDcgQEAKIC8qIFJlc2VuZGluZyBvZiBpbnRlcnJ1cHRzIDoqLwogdm9pZCBjaGVja19pcnFfcmVzZW5kKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IGlycSk7CiBib29sIGlycV93YWl0X2Zvcl9wb2xsKHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7Cit2b2lkIF9faXJxX3dha2VfdGhyZWFkKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9pcnFfcHJvYyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwpAQCAtMTc5LDMgKzE4Miw5IEBACiB7CiAJcmV0dXJuIGQtPnN0YXRlX3VzZV9hY2Nlc3NvcnMgJiBtYXNrOwogfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlfX3RoaXNfY3B1X2luYygqZGVzYy0+a3N0YXRfaXJxcyk7CisJX190aGlzX2NwdV9pbmMoa3N0YXQuaXJxc19zdW0pOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkZXNjLmMgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwppbmRleCA4YWI4ZTkzLi5hNzE3NDYxNyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pcnFkZXNjLmMKKysrIGIva2VybmVsL2lycS9pcnFkZXNjLmMKQEAgLTQ4OSw2ICs0ODksMTEgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogfQogCit2b2lkIGtzdGF0X2luY3JfaXJxX3RoaXNfY3B1KHVuc2lnbmVkIGludCBpcnEpCit7CisJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgaXJxX3RvX2Rlc2MoaXJxKSk7Cit9CisKIHVuc2lnbmVkIGludCBrc3RhdF9pcnFzX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KQogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21hbmFnZS5jIGIva2VybmVsL2lycS9tYW5hZ2UuYwppbmRleCBkM2JmNjYwLi4yNDg2YTRjIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTMyLDI0ICszMiwxMCBAQAogZWFybHlfcGFyYW0oInRocmVhZGlycXMiLCBzZXR1cF9mb3JjZWRfaXJxdGhyZWFkcyk7CiAjZW5kaWYKIAotLyoqCi0gKglzeW5jaHJvbml6ZV9pcnEgLSB3YWl0IGZvciBwZW5kaW5nIElSUSBoYW5kbGVycyAob24gb3RoZXIgQ1BVcykKLSAqCUBpcnE6IGludGVycnVwdCBudW1iZXIgdG8gd2FpdCBmb3IKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbnkgcGVuZGluZyBJUlEgaGFuZGxlcnMgZm9yIHRoaXMgaW50ZXJydXB0Ci0gKgl0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24gd2hpbGUKLSAqCWhvbGRpbmcgYSByZXNvdXJjZSB0aGUgSVJRIGhhbmRsZXIgbWF5IG5lZWQgeW91IHdpbGwgZGVhZGxvY2suCi0gKgotICoJVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIC0gd2l0aCBjYXJlIC0gZnJvbSBJUlEgY29udGV4dC4KLSAqLwotdm9pZCBzeW5jaHJvbml6ZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIF9fc3luY2hyb25pemVfaGFyZGlycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlib29sIGlucHJvZ3Jlc3M7CiAKLQlpZiAoIWRlc2MpCi0JCXJldHVybjsKLQogCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNjcsMTIgKzUzLDU2IEBACiAKIAkJLyogT29wcywgdGhhdCBmYWlsZWQ/ICovCiAJfSB3aGlsZSAoaW5wcm9ncmVzcyk7Cit9CiAKLQkvKgotCSAqIFdlIG1hZGUgc3VyZSB0aGF0IG5vIGhhcmRpcnEgaGFuZGxlciBpcyBydW5uaW5nLiBOb3cgdmVyaWZ5Ci0JICogdGhhdCBubyB0aHJlYWRlZCBoYW5kbGVycyBhcmUgYWN0aXZlLgotCSAqLwotCXdhaXRfZXZlbnQoZGVzYy0+d2FpdF9mb3JfdGhyZWFkcywgIWF0b21pY19yZWFkKCZkZXNjLT50aHJlYWRzX2FjdGl2ZSkpOworLyoqCisgKglzeW5jaHJvbml6ZV9oYXJkaXJxIC0gd2FpdCBmb3IgcGVuZGluZyBoYXJkIElSUSBoYW5kbGVycyAob24gb3RoZXIgQ1BVcykKKyAqCUBpcnE6IGludGVycnVwdCBudW1iZXIgdG8gd2FpdCBmb3IKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbnkgcGVuZGluZyBoYXJkIElSUSBoYW5kbGVycyBmb3IgdGhpcworICoJaW50ZXJydXB0IHRvIGNvbXBsZXRlIGJlZm9yZSByZXR1cm5pbmcuIElmIHlvdSB1c2UgdGhpcworICoJZnVuY3Rpb24gd2hpbGUgaG9sZGluZyBhIHJlc291cmNlIHRoZSBJUlEgaGFuZGxlciBtYXkgbmVlZCB5b3UKKyAqCXdpbGwgZGVhZGxvY2suIEl0IGRvZXMgbm90IHRha2UgYXNzb2NpYXRlZCB0aHJlYWRlZCBoYW5kbGVycworICoJaW50byBhY2NvdW50LgorICoKKyAqCURvIG5vdCB1c2UgdGhpcyBmb3Igc2h1dGRvd24gc2NlbmFyaW9zIHdoZXJlIHlvdSBtdXN0IGJlIHN1cmUKKyAqCXRoYXQgYWxsIHBhcnRzIChoYXJkaXJxIGFuZCB0aHJlYWRlZCBoYW5kbGVyKSBoYXZlIGNvbXBsZXRlZC4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgLSB3aXRoIGNhcmUgLSBmcm9tIElSUSBjb250ZXh0LgorICovCit2b2lkIHN5bmNocm9uaXplX2hhcmRpcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKGRlc2MpCisJCV9fc3luY2hyb25pemVfaGFyZGlycShkZXNjKTsKK30KK0VYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaGFyZGlycSk7CisKKy8qKgorICoJc3luY2hyb25pemVfaXJxIC0gd2FpdCBmb3IgcGVuZGluZyBJUlEgaGFuZGxlcnMgKG9uIG90aGVyIENQVXMpCisgKglAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyIHRvIHdhaXQgZm9yCisgKgorICoJVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgYW55IHBlbmRpbmcgSVJRIGhhbmRsZXJzIGZvciB0aGlzIGludGVycnVwdAorICoJdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZy4gSWYgeW91IHVzZSB0aGlzIGZ1bmN0aW9uIHdoaWxlCisgKglob2xkaW5nIGEgcmVzb3VyY2UgdGhlIElSUSBoYW5kbGVyIG1heSBuZWVkIHlvdSB3aWxsIGRlYWRsb2NrLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCAtIHdpdGggY2FyZSAtIGZyb20gSVJRIGNvbnRleHQuCisgKi8KK3ZvaWQgc3luY2hyb25pemVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWlmIChkZXNjKSB7CisJCV9fc3luY2hyb25pemVfaGFyZGlycShkZXNjKTsKKwkJLyoKKwkJICogV2UgbWFkZSBzdXJlIHRoYXQgbm8gaGFyZGlycSBoYW5kbGVyIGlzCisJCSAqIHJ1bm5pbmcuIE5vdyB2ZXJpZnkgdGhhdCBubyB0aHJlYWRlZCBoYW5kbGVycyBhcmUKKwkJICogYWN0aXZlLgorCQkgKi8KKwkJd2FpdF9ldmVudChkZXNjLT53YWl0X2Zvcl90aHJlYWRzLAorCQkJICAgIWF0b21pY19yZWFkKCZkZXNjLT50aHJlYWRzX2FjdGl2ZSkpOworCX0KIH0KIEVYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaXJxKTsKIApAQCAtNzE4LDcgKzc0OCw3IEBACiAKIAlpZiAoIWRlc2MtPnRocmVhZHNfb25lc2hvdCAmJiAhaXJxZF9pcnFfZGlzYWJsZWQoJmRlc2MtPmlycV9kYXRhKSAmJgogCSAgICBpcnFkX2lycV9tYXNrZWQoJmRlc2MtPmlycV9kYXRhKSkKLQkJdW5tYXNrX2lycShkZXNjKTsKKwkJdW5tYXNrX3RocmVhZGVkX2lycShkZXNjKTsKIAogb3V0X3VubG9jazoKIAlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKQEAgLTcyNyw3ICs3NTcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogLyoKLSAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBjaGFzbmdlIHRoZSBhZmZpbml0eSBvZiB0aGUgaW50ZXJydXB0IHRocmVhZC4KKyAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGFmZmluaXR5IG9mIHRoZSBpbnRlcnJ1cHQgdGhyZWFkLgogICovCiBzdGF0aWMgdm9pZAogaXJxX3RocmVhZF9jaGVja19hZmZpbml0eShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKQEAgLTg4MCw2ICs5MTAsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKglpcnFfd2FrZV90aHJlYWQgLSB3YWtlIHRoZSBpcnEgdGhyZWFkIGZvciB0aGUgYWN0aW9uIGlkZW50aWZpZWQgYnkgZGV2X2lkCisgKglAaXJxOgkJSW50ZXJydXB0IGxpbmUKKyAqCUBkZXZfaWQ6CURldmljZSBpZGVudGl0eSBmb3Igd2hpY2ggdGhlIHRocmVhZCBzaG91bGQgYmUgd29rZW4KKyAqCisgKi8KK3ZvaWQgaXJxX3dha2VfdGhyZWFkKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFkZXNjIHx8IFdBUk5fT04oaXJxX3NldHRpbmdzX2lzX3Blcl9jcHVfZGV2aWQoZGVzYykpKQorCQlyZXR1cm47CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGFjdGlvbiA9IGRlc2MtPmFjdGlvbjsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKKwkJaWYgKGFjdGlvbi0+ZGV2X2lkID09IGRldl9pZCkgeworCQkJaWYgKGFjdGlvbi0+dGhyZWFkKQorCQkJCV9faXJxX3dha2VfdGhyZWFkKGRlc2MsIGFjdGlvbik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX3dha2VfdGhyZWFkKTsKKwogc3RhdGljIHZvaWQgaXJxX3NldHVwX2ZvcmNlZF90aHJlYWRpbmcoc3RydWN0IGlycWFjdGlvbiAqbmV3KQogewogCWlmICghZm9yY2VfaXJxdGhyZWFkcykKQEAgLTg5Niw2ICs5NTMsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaXJxX3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSAmZGVzYy0+aXJxX2RhdGE7CisJc3RydWN0IGlycV9jaGlwICpjID0gZC0+Y2hpcDsKKworCXJldHVybiBjLT5pcnFfcmVxdWVzdF9yZXNvdXJjZXMgPyBjLT5pcnFfcmVxdWVzdF9yZXNvdXJjZXMoZCkgOiAwOworfQorCitzdGF0aWMgdm9pZCBpcnFfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfZGF0YSAqZCA9ICZkZXNjLT5pcnFfZGF0YTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmMgPSBkLT5jaGlwOworCisJaWYgKGMtPmlycV9yZWxlYXNlX3Jlc291cmNlcykKKwkJYy0+aXJxX3JlbGVhc2VfcmVzb3VyY2VzKGQpOworfQorCiAvKgogICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYW4gaXJxYWN0aW9uIC0gdHlwaWNhbGx5IHVzZWQgdG8KICAqIGFsbG9jYXRlIHNwZWNpYWwgaW50ZXJydXB0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBhcmNoaXRlY3R1cmUuCkBAIC0xMDkxLDYgKzExNjUsMTMgQEAKIAl9CiAKIAlpZiAoIXNoYXJlZCkgeworCQlyZXQgPSBpcnFfcmVxdWVzdF9yZXNvdXJjZXMoZGVzYyk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHJlcXVlc3QgcmVzb3VyY2VzIGZvciAlcyAoaXJxICVkKSBvbiBpcnFjaGlwICVzXG4iLAorCQkJICAgICAgIG5ldy0+bmFtZSwgaXJxLCBkZXNjLT5pcnFfZGF0YS5jaGlwLT5uYW1lKTsKKwkJCWdvdG8gb3V0X21hc2s7CisJCX0KKwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXNjLT53YWl0X2Zvcl90aHJlYWRzKTsKIAogCQkvKiBTZXR1cCB0aGUgdHlwZSAobGV2ZWwsIGVkZ2UgcG9sYXJpdHkpIGlmIGNvbmZpZ3VyZWQ6ICovCkBAIC0xMjYxLDggKzEzNDIsMTAgQEAKIAkqYWN0aW9uX3B0ciA9IGFjdGlvbi0+bmV4dDsKIAogCS8qIElmIHRoaXMgd2FzIHRoZSBsYXN0IGhhbmRsZXIsIHNodXQgZG93biB0aGUgSVJRIGxpbmU6ICovCi0JaWYgKCFkZXNjLT5hY3Rpb24pCisJaWYgKCFkZXNjLT5hY3Rpb24pIHsKIAkJaXJxX3NodXRkb3duKGRlc2MpOworCQlpcnFfcmVsZWFzZV9yZXNvdXJjZXMoZGVzYyk7CisJfQogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIG1ha2Ugc3VyZSBhZmZpbml0eV9oaW50IGlzIGNsZWFuZWQgdXAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvcHJvYy5jIGIva2VybmVsL2lycS9wcm9jLmMKaW5kZXggMzZmNmVlMS4uYWMxYmEyZiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9wcm9jLmMKKysrIGIva2VybmVsL2lycS9wcm9jLmMKQEAgLTMyNCwxNSArMzI0LDE1IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJLyogY3JlYXRlIC9wcm9jL2lycS88aXJxPi9zbXBfYWZmaW5pdHkgKi8KLQlwcm9jX2NyZWF0ZV9kYXRhKCJzbXBfYWZmaW5pdHkiLCAwNjAwLCBkZXNjLT5kaXIsCisJcHJvY19jcmVhdGVfZGF0YSgic21wX2FmZmluaXR5IiwgMDY0NCwgZGVzYy0+ZGlyLAogCQkJICZpcnFfYWZmaW5pdHlfcHJvY19mb3BzLCAodm9pZCAqKShsb25nKWlycSk7CiAKIAkvKiBjcmVhdGUgL3Byb2MvaXJxLzxpcnE+L2FmZmluaXR5X2hpbnQgKi8KLQlwcm9jX2NyZWF0ZV9kYXRhKCJhZmZpbml0eV9oaW50IiwgMDQwMCwgZGVzYy0+ZGlyLAorCXByb2NfY3JlYXRlX2RhdGEoImFmZmluaXR5X2hpbnQiLCAwNDQ0LCBkZXNjLT5kaXIsCiAJCQkgJmlycV9hZmZpbml0eV9oaW50X3Byb2NfZm9wcywgKHZvaWQgKikobG9uZylpcnEpOwogCiAJLyogY3JlYXRlIC9wcm9jL2lycS88aXJxPi9zbXBfYWZmaW5pdHlfbGlzdCAqLwotCXByb2NfY3JlYXRlX2RhdGEoInNtcF9hZmZpbml0eV9saXN0IiwgMDYwMCwgZGVzYy0+ZGlyLAorCXByb2NfY3JlYXRlX2RhdGEoInNtcF9hZmZpbml0eV9saXN0IiwgMDY0NCwgZGVzYy0+ZGlyLAogCQkJICZpcnFfYWZmaW5pdHlfbGlzdF9wcm9jX2ZvcHMsICh2b2lkICopKGxvbmcpaXJxKTsKIAogCXByb2NfY3JlYXRlX2RhdGEoIm5vZGUiLCAwNDQ0LCBkZXNjLT5kaXIsCkBAIC0zNzIsNyArMzcyLDcgQEAKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2RlZmF1bHRfYWZmaW5pdHlfcHJvYyh2b2lkKQogewogI2lmZGVmIENPTkZJR19TTVAKLQlwcm9jX2NyZWF0ZSgiaXJxL2RlZmF1bHRfc21wX2FmZmluaXR5IiwgMDYwMCwgTlVMTCwKKwlwcm9jX2NyZWF0ZSgiaXJxL2RlZmF1bHRfc21wX2FmZmluaXR5IiwgMDY0NCwgTlVMTCwKIAkJICAgICZkZWZhdWx0X2FmZmluaXR5X3Byb2NfZm9wcyk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnFfd29yay5jIGIva2VybmVsL2lycV93b3JrLmMKaW5kZXggNTVmY2NlNi4uYTgyMTcwZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycV93b3JrLmMKKysrIGIva2VybmVsL2lycV93b3JrLmMKQEAgLTYxLDExICs2MSwxMSBAQAogICoKICAqIENhbiBiZSByZS1lbnF1ZXVlZCB3aGlsZSB0aGUgY2FsbGJhY2sgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MuCiAgKi8KLXZvaWQgaXJxX3dvcmtfcXVldWUoc3RydWN0IGlycV93b3JrICp3b3JrKQorYm9vbCBpcnFfd29ya19xdWV1ZShzdHJ1Y3QgaXJxX3dvcmsgKndvcmspCiB7CiAJLyogT25seSBxdWV1ZSBpZiBub3QgYWxyZWFkeSBwZW5kaW5nICovCiAJaWYgKCFpcnFfd29ya19jbGFpbSh3b3JrKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBRdWV1ZSB0aGUgZW50cnkgYW5kIHJhaXNlIHRoZSBJUEkgaWYgbmVlZGVkLiAqLwogCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtODMsNiArODMsOCBAQAogCX0KIAogCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV93b3JrX3F1ZXVlKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCA2MGJhZmJlLi40NTYwMWNmIDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtMTAzOSwxMCArMTAzOSwxMCBAQAoge30KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2tleGVjX2xvYWQodW5zaWduZWQgbG9uZyBlbnRyeSwKLQkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAotCQkJCXN0cnVjdCBjb21wYXRfa2V4ZWNfc2VnbWVudCBfX3VzZXIgKnNlZ21lbnRzLAotCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KGtleGVjX2xvYWQsIGNvbXBhdF91bG9uZ190LCBlbnRyeSwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBucl9zZWdtZW50cywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfa2V4ZWNfc2VnbWVudCBfX3VzZXIgKiwgc2VnbWVudHMsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgZmxhZ3MpCiB7CiAJc3RydWN0IGNvbXBhdF9rZXhlY19zZWdtZW50IGluOwogCXN0cnVjdCBrZXhlY19zZWdtZW50IG91dCwgX191c2VyICprc2VnbWVudHM7CmRpZmYgLS1naXQgYS9rZXJuZWwva3N5c2ZzLmMgYi9rZXJuZWwva3N5c2ZzLmMKaW5kZXggZDk0NWE5NC4uZTY2MDk2NCAxMDA2NDQKLS0tIGEva2VybmVsL2tzeXNmcy5jCisrKyBiL2tlcm5lbC9rc3lzZnMuYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogCisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4JLyogcmN1X2V4cGVkaXRlZCAqLworCiAjZGVmaW5lIEtFUk5FTF9BVFRSX1JPKF9uYW1lKSBcCiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IF9fQVRUUl9STyhfbmFtZSkKIApkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvTWFrZWZpbGUgYi9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZQppbmRleCBiYWFiOGU1Li4zMDZhNzZiIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZQorKysgYi9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIAotb2JqLXkgKz0gbXV0ZXgubyBzZW1hcGhvcmUubyByd3NlbS5vIGxnbG9jay5vCitvYmoteSArPSBtdXRleC5vIHNlbWFwaG9yZS5vIHJ3c2VtLm8gbGdsb2NrLm8gbWNzX3NwaW5sb2NrLm8KIAogaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgogQ0ZMQUdTX1JFTU9WRV9sb2NrZGVwLm8gPSAtcGcKQEAgLTIzLDMgKzIzLDQgQEAKIG9iai0kKENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLKSArPSByd3NlbS1zcGlubG9jay5vCiBvYmotJChDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0pICs9IHJ3c2VtLXhhZGQubwogb2JqLSQoQ09ORklHX1BFUkNQVV9SV1NFTSkgKz0gcGVyY3B1LXJ3c2VtLm8KK29iai0kKENPTkZJR19MT0NLX1RPUlRVUkVfVEVTVCkgKz0gbG9ja3RvcnR1cmUubwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tpbmcvbG9ja2RlcC5jCmluZGV4IGViOGE1NDcuLmIwZTk0NjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2luZy9sb2NrZGVwLmMKQEAgLTE5MzYsMTIgKzE5MzYsMTIgQEAKIAogCWZvciAoOzspIHsKIAkJaW50IGRpc3RhbmNlID0gY3Vyci0+bG9ja2RlcF9kZXB0aCAtIGRlcHRoICsgMTsKLQkJaGxvY2sgPSBjdXJyLT5oZWxkX2xvY2tzICsgZGVwdGgtMTsKKwkJaGxvY2sgPSBjdXJyLT5oZWxkX2xvY2tzICsgZGVwdGggLSAxOwogCQkvKgogCQkgKiBPbmx5IG5vbi1yZWN1cnNpdmUtcmVhZCBlbnRyaWVzIGdldCBuZXcgZGVwZW5kZW5jaWVzCiAJCSAqIGFkZGVkOgogCQkgKi8KLQkJaWYgKGhsb2NrLT5yZWFkICE9IDIpIHsKKwkJaWYgKGhsb2NrLT5yZWFkICE9IDIgJiYgaGxvY2stPmNoZWNrKSB7CiAJCQlpZiAoIWNoZWNrX3ByZXZfYWRkKGN1cnIsIGhsb2NrLCBuZXh0LAogCQkJCQkJZGlzdGFuY2UsIHRyeWxvY2tfbG9vcCkpCiAJCQkJcmV0dXJuIDA7CkBAIC0yMDk4LDcgKzIwOTgsNyBAQAogCSAqIChJZiBsb29rdXBfY2hhaW5fY2FjaGUoKSByZXR1cm5zIHdpdGggMSBpdCBhY3F1aXJlcwogCSAqIGdyYXBoX2xvY2sgZm9yIHVzKQogCSAqLwotCWlmICghaGxvY2stPnRyeWxvY2sgJiYgKGhsb2NrLT5jaGVjayA9PSAyKSAmJgorCWlmICghaGxvY2stPnRyeWxvY2sgJiYgaGxvY2stPmNoZWNrICYmCiAJICAgIGxvb2t1cF9jaGFpbl9jYWNoZShjdXJyLCBobG9jaywgY2hhaW5fa2V5KSkgewogCQkvKgogCQkgKiBDaGVjayB3aGV0aGVyIGxhc3QgaGVsZCBsb2NrOgpAQCAtMjUxNyw3ICsyNTE3LDcgQEAKIAogCQlCVUdfT04odXNhZ2VfYml0ID49IExPQ0tfVVNBR0VfU1RBVEVTKTsKIAotCQlpZiAoaGxvY2tfY2xhc3MoaGxvY2spLT5rZXkgPT0gX19sb2NrZGVwX25vX3ZhbGlkYXRlX18uc3Via2V5cykKKwkJaWYgKCFobG9jay0+Y2hlY2spCiAJCQljb250aW51ZTsKIAogCQlpZiAoIW1hcmtfbG9jayhjdXJyLCBobG9jaywgdXNhZ2VfYml0KSkKQEAgLTI1NTcsNyArMjU1Nyw3IEBACiAJZGVidWdfYXRvbWljX2luYyhoYXJkaXJxc19vbl9ldmVudHMpOwogfQogCi12b2lkIHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcih1bnNpZ25lZCBsb25nIGlwKQorX192aXNpYmxlIHZvaWQgdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKHVuc2lnbmVkIGxvbmcgaXApCiB7CiAJdGltZV9oYXJkaXJxc19vbihDQUxMRVJfQUREUjAsIGlwKTsKIApAQCAtMjYxMCw3ICsyNjEwLDcgQEAKIC8qCiAgKiBIYXJkaXJxcyB3ZXJlIGRpc2FibGVkOgogICovCi12b2lkIHRyYWNlX2hhcmRpcnFzX29mZl9jYWxsZXIodW5zaWduZWQgbG9uZyBpcCkKK19fdmlzaWJsZSB2b2lkIHRyYWNlX2hhcmRpcnFzX29mZl9jYWxsZXIodW5zaWduZWQgbG9uZyBpcCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCkBAIC0zMDU1LDkgKzMwNTUsNiBAQAogCWludCBjbGFzc19pZHg7CiAJdTY0IGNoYWluX2tleTsKIAotCWlmICghcHJvdmVfbG9ja2luZykKLQkJY2hlY2sgPSAxOwotCiAJaWYgKHVubGlrZWx5KCFkZWJ1Z19sb2NrcykpCiAJCXJldHVybiAwOwogCkBAIC0zMDY5LDggKzMwNjYsOCBAQAogCWlmIChERUJVR19MT0NLU19XQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpKQogCQlyZXR1cm4gMDsKIAotCWlmIChsb2NrLT5rZXkgPT0gJl9fbG9ja2RlcF9ub192YWxpZGF0ZV9fKQotCQljaGVjayA9IDE7CisJaWYgKCFwcm92ZV9sb2NraW5nIHx8IGxvY2stPmtleSA9PSAmX19sb2NrZGVwX25vX3ZhbGlkYXRlX18pCisJCWNoZWNrID0gMDsKIAogCWlmIChzdWJjbGFzcyA8IE5SX0xPQ0tERVBfQ0FDSElOR19DTEFTU0VTKQogCQljbGFzcyA9IGxvY2stPmNsYXNzX2NhY2hlW3N1YmNsYXNzXTsKQEAgLTMxMzgsNyArMzEzNSw3IEBACiAJaGxvY2stPmhvbGR0aW1lX3N0YW1wID0gbG9ja3N0YXRfY2xvY2soKTsKICNlbmRpZgogCi0JaWYgKGNoZWNrID09IDIgJiYgIW1hcmtfaXJxZmxhZ3MoY3VyciwgaGxvY2spKQorCWlmIChjaGVjayAmJiAhbWFya19pcnFmbGFncyhjdXJyLCBobG9jaykpCiAJCXJldHVybiAwOwogCiAJLyogbWFyayBpdCBhcyB1c2VkOiAqLwpAQCAtNDE5MSw3ICs0MTg4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnX3Nob3dfaGVsZF9sb2Nrcyk7CiAKLXZvaWQgbG9ja2RlcF9zeXNfZXhpdCh2b2lkKQorYXNtbGlua2FnZSB2b2lkIGxvY2tkZXBfc3lzX2V4aXQodm9pZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9sb2NrdG9ydHVyZS5jIGIva2VybmVsL2xvY2tpbmcvbG9ja3RvcnR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZiMWExCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2xvY2tpbmcvbG9ja3RvcnR1cmUuYwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqIE1vZHVsZS1iYXNlZCB0b3J0dXJlIHRlc3QgZmFjaWxpdHkgZm9yIGxvY2tpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxNAorICoKKyAqIEF1dGhvcjogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPgorICoJQmFzZWQgb24ga2VybmVsL3JjdS90b3J0dXJlLmMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZV9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90b3J0dXJlLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAdXMuaWJtLmNvbT4iKTsKKwordG9ydHVyZV9wYXJhbShpbnQsIG53cml0ZXJzX3N0cmVzcywgLTEsCisJICAgICAiTnVtYmVyIG9mIHdyaXRlLWxvY2tpbmcgc3RyZXNzLXRlc3QgdGhyZWFkcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIG9ub2ZmX2hvbGRvZmYsIDAsICJUaW1lIGFmdGVyIGJvb3QgYmVmb3JlIENQVSBob3RwbHVncyAocykiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBvbm9mZl9pbnRlcnZhbCwgMCwKKwkgICAgICJUaW1lIGJldHdlZW4gQ1BVIGhvdHBsdWdzIChzKSwgMD1kaXNhYmxlIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc2h1ZmZsZV9pbnRlcnZhbCwgMywKKwkgICAgICJOdW1iZXIgb2YgamlmZmllcyBiZXR3ZWVuIHNodWZmbGVzLCAwPWRpc2FibGUiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBzaHV0ZG93bl9zZWNzLCAwLCAiU2h1dGRvd24gdGltZSAoaiksIDw9IHplcm8gdG8gZGlzYWJsZS4iKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBzdGF0X2ludGVydmFsLCA2MCwKKwkgICAgICJOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHN0YXRzIHByaW50aygpcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIHN0dXR0ZXIsIDUsICJOdW1iZXIgb2YgamlmZmllcyB0byBydW4vaGFsdCB0ZXN0LCAwPWRpc2FibGUiKTsKK3RvcnR1cmVfcGFyYW0oYm9vbCwgdmVyYm9zZSwgdHJ1ZSwKKwkgICAgICJFbmFibGUgdmVyYm9zZSBkZWJ1Z2dpbmcgcHJpbnRrKClzIik7CisKK3N0YXRpYyBjaGFyICp0b3J0dXJlX3R5cGUgPSAic3Bpbl9sb2NrIjsKK21vZHVsZV9wYXJhbSh0b3J0dXJlX3R5cGUsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModG9ydHVyZV90eXBlLAorCQkgIlR5cGUgb2YgbG9jayB0byB0b3J0dXJlIChzcGluX2xvY2ssIHNwaW5fbG9ja19pcnEsIC4uLikiKTsKKworc3RhdGljIGF0b21pY190IG5fbG9ja190b3J0dXJlX2Vycm9yczsKKworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3RhdHNfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKip3cml0ZXJfdGFza3M7CisKK3N0YXRpYyBpbnQgbnJlYWx3cml0ZXJzX3N0cmVzczsKK3N0YXRpYyBib29sIGxvY2tfaXNfd3JpdGVfaGVsZDsKKworc3RydWN0IGxvY2tfd3JpdGVyX3N0cmVzc19zdGF0cyB7CisJbG9uZyBuX3dyaXRlX2xvY2tfZmFpbDsKKwlsb25nIG5fd3JpdGVfbG9ja19hY3F1aXJlZDsKK307CitzdGF0aWMgc3RydWN0IGxvY2tfd3JpdGVyX3N0cmVzc19zdGF0cyAqbHdzYTsKKworI2lmIGRlZmluZWQoTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19MT0NLX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSkKKyNkZWZpbmUgTE9DS1RPUlRVUkVfUlVOTkFCTEVfSU5JVCAxCisjZWxzZQorI2RlZmluZSBMT0NLVE9SVFVSRV9SVU5OQUJMRV9JTklUIDAKKyNlbmRpZgoraW50IGxvY2t0b3J0dXJlX3J1bm5hYmxlID0gTE9DS1RPUlRVUkVfUlVOTkFCTEVfSU5JVDsKK21vZHVsZV9wYXJhbShsb2NrdG9ydHVyZV9ydW5uYWJsZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9ja3RvcnR1cmVfcnVubmFibGUsICJTdGFydCBsb2NrdG9ydHVyZSBhdCBib290Iik7CisKKy8qIEZvcndhcmQgcmVmZXJlbmNlLiAqLworc3RhdGljIHZvaWQgbG9ja190b3J0dXJlX2NsZWFudXAodm9pZCk7CisKKy8qCisgKiBPcGVyYXRpb25zIHZlY3RvciBmb3Igc2VsZWN0aW5nIGRpZmZlcmVudCB0eXBlcyBvZiB0ZXN0cy4KKyAqLworc3RydWN0IGxvY2tfdG9ydHVyZV9vcHMgeworCXZvaWQgKCppbml0KSh2b2lkKTsKKwlpbnQgKCp3cml0ZWxvY2spKHZvaWQpOworCXZvaWQgKCp3cml0ZV9kZWxheSkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICp0cnNwKTsKKwl2b2lkICgqd3JpdGV1bmxvY2spKHZvaWQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyAqY3VyX29wczsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBsb2NrIHRvcnR1cmUgdGVzdGluZy4KKyAqLworCitzdGF0aWMgaW50IHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfbG9jayh2b2lkKQoreworCXJldHVybiAwOyAgLyogQlVHR1ksIGRvIG5vdCB1c2UgaW4gcmVhbCBsaWZlISEhICovCit9CisKK3N0YXRpYyB2b2lkIHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICp0cnNwKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZ2RlbGF5X3VzID0gMTAwOworCisJLyogV2Ugd2FudCBhIGxvbmcgZGVsYXkgb2NjYXNpb25hbGx5IHRvIGZvcmNlIG1hc3NpdmUgY29udGVudGlvbi4gICovCisJaWYgKCEodG9ydHVyZV9yYW5kb20odHJzcCkgJQorCSAgICAgIChucmVhbHdyaXRlcnNfc3RyZXNzICogMjAwMCAqIGxvbmdkZWxheV91cykpKQorCQltZGVsYXkobG9uZ2RlbGF5X3VzKTsKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCWlmICghKHRvcnR1cmVfcmFuZG9tKHRyc3ApICUgKG5yZWFsd3JpdGVyc19zdHJlc3MgKiAyMDAwMCkpKQorCQlwcmVlbXB0X3NjaGVkdWxlKCk7ICAvKiBBbGxvdyB0ZXN0IHRvIGJlIHByZWVtcHRlZC4gKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0b3J0dXJlX2xvY2tfYnVzdGVkX3dyaXRlX3VubG9jayh2b2lkKQoreworCSAgLyogQlVHR1ksIGRvIG5vdCB1c2UgaW4gcmVhbCBsaWZlISEhICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyBsb2NrX2J1c3RlZF9vcHMgPSB7CisJLndyaXRlbG9jawk9IHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfbG9jaywKKwkud3JpdGVfZGVsYXkJPSB0b3J0dXJlX2xvY2tfYnVzdGVkX3dyaXRlX2RlbGF5LAorCS53cml0ZXVubG9jawk9IHRvcnR1cmVfbG9ja19idXN0ZWRfd3JpdGVfdW5sb2NrLAorCS5uYW1lCQk9ICJsb2NrX2J1c3RlZCIKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodG9ydHVyZV9zcGlubG9jayk7CisKK3N0YXRpYyBpbnQgdG9ydHVyZV9zcGluX2xvY2tfd3JpdGVfbG9jayh2b2lkKSBfX2FjcXVpcmVzKHRvcnR1cmVfc3BpbmxvY2spCit7CisJc3Bpbl9sb2NrKCZ0b3J0dXJlX3NwaW5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG9ydHVyZV9zcGluX2xvY2tfd3JpdGVfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICp0cnNwKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hvcnRkZWxheV91cyA9IDI7CisJY29uc3QgdW5zaWduZWQgbG9uZyBsb25nZGVsYXlfdXMgPSAxMDA7CisKKwkvKiBXZSB3YW50IGEgc2hvcnQgZGVsYXkgbW9zdGx5IHRvIGVtdWxhdGUgbGlrZWx5IGNvZGUsIGFuZAorCSAqIHdlIHdhbnQgYSBsb25nIGRlbGF5IG9jY2FzaW9uYWxseSB0byBmb3JjZSBtYXNzaXZlIGNvbnRlbnRpb24uCisJICovCisJaWYgKCEodG9ydHVyZV9yYW5kb20odHJzcCkgJQorCSAgICAgIChucmVhbHdyaXRlcnNfc3RyZXNzICogMjAwMCAqIGxvbmdkZWxheV91cykpKQorCQltZGVsYXkobG9uZ2RlbGF5X3VzKTsKKwlpZiAoISh0b3J0dXJlX3JhbmRvbSh0cnNwKSAlCisJICAgICAgKG5yZWFsd3JpdGVyc19zdHJlc3MgKiAyICogc2hvcnRkZWxheV91cykpKQorCQl1ZGVsYXkoc2hvcnRkZWxheV91cyk7CisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlpZiAoISh0b3J0dXJlX3JhbmRvbSh0cnNwKSAlIChucmVhbHdyaXRlcnNfc3RyZXNzICogMjAwMDApKSkKKwkJcHJlZW1wdF9zY2hlZHVsZSgpOyAgLyogQWxsb3cgdGVzdCB0byBiZSBwcmVlbXB0ZWQuICovCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdG9ydHVyZV9zcGluX2xvY2tfd3JpdGVfdW5sb2NrKHZvaWQpIF9fcmVsZWFzZXModG9ydHVyZV9zcGlubG9jaykKK3sKKwlzcGluX3VubG9jaygmdG9ydHVyZV9zcGlubG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyBzcGluX2xvY2tfb3BzID0geworCS53cml0ZWxvY2sJPSB0b3J0dXJlX3NwaW5fbG9ja193cml0ZV9sb2NrLAorCS53cml0ZV9kZWxheQk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX2RlbGF5LAorCS53cml0ZXVubG9jawk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX3VubG9jaywKKwkubmFtZQkJPSAic3Bpbl9sb2NrIgorfTsKKworc3RhdGljIGludCB0b3J0dXJlX3NwaW5fbG9ja193cml0ZV9sb2NrX2lycSh2b2lkKQorX19hY3F1aXJlcyh0b3J0dXJlX3NwaW5sb2NrX2lycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRvcnR1cmVfc3BpbmxvY2ssIGZsYWdzKTsKKwljdXJfb3BzLT5mbGFncyA9IGZsYWdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0b3J0dXJlX2xvY2tfc3Bpbl93cml0ZV91bmxvY2tfaXJxKHZvaWQpCitfX3JlbGVhc2VzKHRvcnR1cmVfc3BpbmxvY2spCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG9ydHVyZV9zcGlubG9jaywgY3VyX29wcy0+ZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfdG9ydHVyZV9vcHMgc3Bpbl9sb2NrX2lycV9vcHMgPSB7CisJLndyaXRlbG9jawk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX2xvY2tfaXJxLAorCS53cml0ZV9kZWxheQk9IHRvcnR1cmVfc3Bpbl9sb2NrX3dyaXRlX2RlbGF5LAorCS53cml0ZXVubG9jawk9IHRvcnR1cmVfbG9ja19zcGluX3dyaXRlX3VubG9ja19pcnEsCisJLm5hbWUJCT0gInNwaW5fbG9ja19pcnEiCit9OworCisvKgorICogTG9jayB0b3J0dXJlIHdyaXRlciBrdGhyZWFkLiAgUmVwZWF0ZWRseSBhY3F1aXJlcyBhbmQgcmVsZWFzZXMKKyAqIHRoZSBsb2NrLCBjaGVja2luZyBmb3IgZHVwbGljYXRlIGFjcXVpc2l0aW9ucy4KKyAqLworc3RhdGljIGludCBsb2NrX3RvcnR1cmVfd3JpdGVyKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbG9ja193cml0ZXJfc3RyZXNzX3N0YXRzICpsd3NwID0gYXJnOworCXN0YXRpYyBERUZJTkVfVE9SVFVSRV9SQU5ET00ocmFuZCk7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoImxvY2tfdG9ydHVyZV93cml0ZXIgdGFzayBzdGFydGVkIik7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7CisKKwlkbyB7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQljdXJfb3BzLT53cml0ZWxvY2soKTsKKwkJaWYgKFdBUk5fT05fT05DRShsb2NrX2lzX3dyaXRlX2hlbGQpKQorCQkJbHdzcC0+bl93cml0ZV9sb2NrX2ZhaWwrKzsKKwkJbG9ja19pc193cml0ZV9oZWxkID0gMTsKKwkJbHdzcC0+bl93cml0ZV9sb2NrX2FjcXVpcmVkKys7CisJCWN1cl9vcHMtPndyaXRlX2RlbGF5KCZyYW5kKTsKKwkJbG9ja19pc193cml0ZV9oZWxkID0gMDsKKwkJY3VyX29wcy0+d3JpdGV1bmxvY2soKTsKKwkJc3R1dHRlcl93YWl0KCJsb2NrX3RvcnR1cmVfd3JpdGVyIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygibG9ja190b3J0dXJlX3dyaXRlciIpOworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGFuIGxvY2stdG9ydHVyZS1zdGF0aXN0aWNzIG1lc3NhZ2UgaW4gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tfdG9ydHVyZV9wcmludGsoY2hhciAqcGFnZSkKK3sKKwlib29sIGZhaWwgPSAwOworCWludCBpOworCWxvbmcgbWF4ID0gMDsKKwlsb25nIG1pbiA9IGx3c2FbMF0ubl93cml0ZV9sb2NrX2FjcXVpcmVkOworCWxvbmcgbG9uZyBzdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5yZWFsd3JpdGVyc19zdHJlc3M7IGkrKykgeworCQlpZiAobHdzYVtpXS5uX3dyaXRlX2xvY2tfZmFpbCkKKwkJCWZhaWwgPSB0cnVlOworCQlzdW0gKz0gbHdzYVtpXS5uX3dyaXRlX2xvY2tfYWNxdWlyZWQ7CisJCWlmIChtYXggPCBsd3NhW2ldLm5fd3JpdGVfbG9ja19mYWlsKQorCQkJbWF4ID0gbHdzYVtpXS5uX3dyaXRlX2xvY2tfZmFpbDsKKwkJaWYgKG1pbiA+IGx3c2FbaV0ubl93cml0ZV9sb2NrX2ZhaWwpCisJCQltaW4gPSBsd3NhW2ldLm5fd3JpdGVfbG9ja19mYWlsOworCX0KKwlwYWdlICs9IHNwcmludGYocGFnZSwgIiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLAorCQkJIldyaXRlczogIFRvdGFsOiAlbGxkICBNYXgvTWluOiAlbGQvJWxkICVzICBGYWlsOiAlZCAlc1xuIiwKKwkJCXN1bSwgbWF4LCBtaW4sIG1heCAvIDIgPiBtaW4gPyAiPz8/IiA6ICIiLAorCQkJZmFpbCwgZmFpbCA/ICIhISEiIDogIiIpOworCWlmIChmYWlsKQorCQlhdG9taWNfaW5jKCZuX2xvY2tfdG9ydHVyZV9lcnJvcnMpOworfQorCisvKgorICogUHJpbnQgdG9ydHVyZSBzdGF0aXN0aWNzLiAgQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUKKyAqIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBhdCBhIGdpdmVuIHRpbWUhISEgIFRoaXMgaXMgbm9ybWFsbHkgYWNjb21wbGlzaGVkCisgKiBieSByZWx5aW5nIG9uIHRoZSBtb2R1bGUgc3lzdGVtIHRvIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgbW9kdWxlCisgKiBsb2FkZWQsIGFuZCB0aGVuIGJ5IGdpdmluZyB0aGUgbG9ja190b3J0dXJlX3N0YXRzIGt0aHJlYWQgZnVsbCBjb250cm9sCisgKiAob3IgdGhlIGluaXQvY2xlYW51cCBmdW5jdGlvbnMgd2hlbiBsb2NrX3RvcnR1cmVfc3RhdHMgdGhyZWFkIGlzIG5vdAorICogcnVubmluZykuCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tfdG9ydHVyZV9zdGF0c19wcmludCh2b2lkKQoreworCWludCBzaXplID0gbnJlYWx3cml0ZXJzX3N0cmVzcyAqIDIwMCArIDgxOTI7CisJY2hhciAqYnVmOworCisJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlwcl9lcnIoImxvY2tfdG9ydHVyZV9zdGF0c19wcmludDogT3V0IG9mIG1lbW9yeSwgbmVlZDogJWQiLAorCQkgICAgICAgc2l6ZSk7CisJCXJldHVybjsKKwl9CisJbG9ja190b3J0dXJlX3ByaW50ayhidWYpOworCXByX2FsZXJ0KCIlcyIsIGJ1Zik7CisJa2ZyZWUoYnVmKTsKK30KKworLyoKKyAqIFBlcmlvZGljYWxseSBwcmludHMgdG9ydHVyZSBzdGF0aXN0aWNzLCBpZiBwZXJpb2RpYyBzdGF0aXN0aWNzIHByaW50aW5nCisgKiB3YXMgc3BlY2lmaWVkIHZpYSB0aGUgc3RhdF9pbnRlcnZhbCBtb2R1bGUgcGFyYW1ldGVyLgorICoKKyAqIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgZnVsbHN0b3AgaGVyZSwgc2luY2UgdGhpcyBvbmUgZG9lc24ndCByZWZlcmVuY2UKKyAqIHZvbGF0aWxlIHN0YXRlIG9yIHJlZ2lzdGVyIGNhbGxiYWNrcy4KKyAqLworc3RhdGljIGludCBsb2NrX3RvcnR1cmVfc3RhdHModm9pZCAqYXJnKQoreworCVZFUkJPU0VfVE9ST1VUX1NUUklORygibG9ja190b3J0dXJlX3N0YXRzIHRhc2sgc3RhcnRlZCIpOworCWRvIHsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YXRfaW50ZXJ2YWwgKiBIWik7CisJCWxvY2tfdG9ydHVyZV9zdGF0c19wcmludCgpOworCQl0b3J0dXJlX3NodXRkb3duX2Fic29yYigibG9ja190b3J0dXJlX3N0YXRzIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygibG9ja190b3J0dXJlX3N0YXRzIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbG9ja190b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhzdHJ1Y3QgbG9ja190b3J0dXJlX29wcyAqY3VyX29wcywKKwkJCQljb25zdCBjaGFyICp0YWcpCit7CisJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKKwkJICItLS0gJXM6IG53cml0ZXJzX3N0cmVzcz0lZCBzdGF0X2ludGVydmFsPSVkIHZlcmJvc2U9JWQgc2h1ZmZsZV9pbnRlcnZhbD0lZCBzdHV0dGVyPSVkIHNodXRkb3duX3NlY3M9JWQgb25vZmZfaW50ZXJ2YWw9JWQgb25vZmZfaG9sZG9mZj0lZFxuIiwKKwkJIHRvcnR1cmVfdHlwZSwgdGFnLCBucmVhbHdyaXRlcnNfc3RyZXNzLCBzdGF0X2ludGVydmFsLCB2ZXJib3NlLAorCQkgc2h1ZmZsZV9pbnRlcnZhbCwgc3R1dHRlciwgc2h1dGRvd25fc2VjcywKKwkJIG9ub2ZmX2ludGVydmFsLCBvbm9mZl9ob2xkb2ZmKTsKK30KKworc3RhdGljIHZvaWQgbG9ja190b3J0dXJlX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICh0b3J0dXJlX2NsZWFudXAoKSkKKwkJcmV0dXJuOworCisJaWYgKHdyaXRlcl90YXNrcykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnJlYWx3cml0ZXJzX3N0cmVzczsgaSsrKQorCQkJdG9ydHVyZV9zdG9wX2t0aHJlYWQobG9ja190b3J0dXJlX3dyaXRlciwKKwkJCQkJICAgICB3cml0ZXJfdGFza3NbaV0pOworCQlrZnJlZSh3cml0ZXJfdGFza3MpOworCQl3cml0ZXJfdGFza3MgPSBOVUxMOworCX0KKworCXRvcnR1cmVfc3RvcF9rdGhyZWFkKGxvY2tfdG9ydHVyZV9zdGF0cywgc3RhdHNfdGFzayk7CisJbG9ja190b3J0dXJlX3N0YXRzX3ByaW50KCk7ICAvKiAtQWZ0ZXItIHRoZSBzdGF0cyB0aHJlYWQgaXMgc3RvcHBlZCEgKi8KKworCWlmIChhdG9taWNfcmVhZCgmbl9sb2NrX3RvcnR1cmVfZXJyb3JzKSkKKwkJbG9ja190b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLAorCQkJCQkJIkVuZCBvZiB0ZXN0OiBGQUlMVVJFIik7CisJZWxzZSBpZiAodG9ydHVyZV9vbm9mZl9mYWlsdXJlcygpKQorCQlsb2NrX3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsCisJCQkJCQkiRW5kIG9mIHRlc3Q6IExPQ0tfSE9UUExVRyIpOworCWVsc2UKKwkJbG9ja190b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLAorCQkJCQkJIkVuZCBvZiB0ZXN0OiBTVUNDRVNTIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxvY2tfdG9ydHVyZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IGZpcnN0ZXJyID0gMDsKKwlzdGF0aWMgc3RydWN0IGxvY2tfdG9ydHVyZV9vcHMgKnRvcnR1cmVfb3BzW10gPSB7CisJCSZsb2NrX2J1c3RlZF9vcHMsICZzcGluX2xvY2tfb3BzLCAmc3Bpbl9sb2NrX2lycV9vcHMsCisJfTsKKworCXRvcnR1cmVfaW5pdF9iZWdpbih0b3J0dXJlX3R5cGUsIHZlcmJvc2UsICZsb2NrdG9ydHVyZV9ydW5uYWJsZSk7CisKKwkvKiBQcm9jZXNzIGFyZ3MgYW5kIHRlbGwgdGhlIHdvcmxkIHRoYXQgdGhlIHRvcnR1cmVyIGlzIG9uIHRoZSBqb2IuICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9ydHVyZV9vcHMpOyBpKyspIHsKKwkJY3VyX29wcyA9IHRvcnR1cmVfb3BzW2ldOworCQlpZiAoc3RyY21wKHRvcnR1cmVfdHlwZSwgY3VyX29wcy0+bmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKSkgeworCQlwcl9hbGVydCgibG9jay10b3J0dXJlOiBpbnZhbGlkIHRvcnR1cmUgdHlwZTogXCIlc1wiXG4iLAorCQkJIHRvcnR1cmVfdHlwZSk7CisJCXByX2FsZXJ0KCJsb2NrLXRvcnR1cmUgdHlwZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKTsgaSsrKQorCQkJcHJfYWxlcnQoIiAlcyIsIHRvcnR1cmVfb3BzW2ldLT5uYW1lKTsKKwkJcHJfYWxlcnQoIlxuIik7CisJCXRvcnR1cmVfaW5pdF9lbmQoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjdXJfb3BzLT5pbml0KQorCQljdXJfb3BzLT5pbml0KCk7IC8qIG5vICJnb3RvIHVud2luZCIgcHJpb3IgdG8gdGhpcyBwb2ludCEhISAqLworCisJaWYgKG53cml0ZXJzX3N0cmVzcyA+PSAwKQorCQlucmVhbHdyaXRlcnNfc3RyZXNzID0gbndyaXRlcnNfc3RyZXNzOworCWVsc2UKKwkJbnJlYWx3cml0ZXJzX3N0cmVzcyA9IDIgKiBudW1fb25saW5lX2NwdXMoKTsKKwlsb2NrX3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsICJTdGFydCBvZiB0ZXN0Iik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdGF0aXN0aWNzIHNvIHRoYXQgZWFjaCBydW4gZ2V0cyBpdHMgb3duIG51bWJlcnMuICovCisKKwlsb2NrX2lzX3dyaXRlX2hlbGQgPSAwOworCWx3c2EgPSBrbWFsbG9jKHNpemVvZigqbHdzYSkgKiBucmVhbHdyaXRlcnNfc3RyZXNzLCBHRlBfS0VSTkVMKTsKKwlpZiAobHdzYSA9PSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX1NUUklORygibHdzYTogT3V0IG9mIG1lbW9yeSIpOworCQlmaXJzdGVyciA9IC1FTk9NRU07CisJCWdvdG8gdW53aW5kOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnJlYWx3cml0ZXJzX3N0cmVzczsgaSsrKSB7CisJCWx3c2FbaV0ubl93cml0ZV9sb2NrX2ZhaWwgPSAwOworCQlsd3NhW2ldLm5fd3JpdGVfbG9ja19hY3F1aXJlZCA9IDA7CisJfQorCisJLyogU3RhcnQgdXAgdGhlIGt0aHJlYWRzLiAqLworCisJaWYgKG9ub2ZmX2ludGVydmFsID4gMCkgeworCQlmaXJzdGVyciA9IHRvcnR1cmVfb25vZmZfaW5pdChvbm9mZl9ob2xkb2ZmICogSFosCisJCQkJCSAgICAgIG9ub2ZmX2ludGVydmFsICogSFopOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJaWYgKHNodWZmbGVfaW50ZXJ2YWwgPiAwKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9zaHVmZmxlX2luaXQoc2h1ZmZsZV9pbnRlcnZhbCk7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAoc2h1dGRvd25fc2VjcyA+IDApIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX3NodXRkb3duX2luaXQoc2h1dGRvd25fc2VjcywKKwkJCQkJCSBsb2NrX3RvcnR1cmVfY2xlYW51cCk7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAoc3R1dHRlciA+IDApIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX3N0dXR0ZXJfaW5pdChzdHV0dGVyKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCisJd3JpdGVyX3Rhc2tzID0ga3phbGxvYyhucmVhbHdyaXRlcnNfc3RyZXNzICogc2l6ZW9mKHdyaXRlcl90YXNrc1swXSksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHdyaXRlcl90YXNrcyA9PSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX0VSUlNUUklORygid3JpdGVyX3Rhc2tzOiBPdXQgb2YgbWVtb3J5Iik7CisJCWZpcnN0ZXJyID0gLUVOT01FTTsKKwkJZ290byB1bndpbmQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBucmVhbHdyaXRlcnNfc3RyZXNzOyBpKyspIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKGxvY2tfdG9ydHVyZV93cml0ZXIsICZsd3NhW2ldLAorCQkJCQkJICB3cml0ZXJfdGFza3NbaV0pOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJaWYgKHN0YXRfaW50ZXJ2YWwgPiAwKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9jcmVhdGVfa3RocmVhZChsb2NrX3RvcnR1cmVfc3RhdHMsIE5VTEwsCisJCQkJCQkgIHN0YXRzX3Rhc2spOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJdG9ydHVyZV9pbml0X2VuZCgpOworCXJldHVybiAwOworCit1bndpbmQ6CisJdG9ydHVyZV9pbml0X2VuZCgpOworCWxvY2tfdG9ydHVyZV9jbGVhbnVwKCk7CisJcmV0dXJuIGZpcnN0ZXJyOworfQorCittb2R1bGVfaW5pdChsb2NrX3RvcnR1cmVfaW5pdCk7Cittb2R1bGVfZXhpdChsb2NrX3RvcnR1cmVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9tY3Nfc3BpbmxvY2suYyBiL2tlcm5lbC9sb2NraW5nL21jc19zcGlubG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGRjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvbG9ja2luZy9tY3Nfc3BpbmxvY2suYwpAQCAtMCwwICsxLDE3OCBAQAorCisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgIm1jc19zcGlubG9jay5oIgorCisjaWZkZWYgQ09ORklHX1NNUAorCisvKgorICogQW4gTUNTIGxpa2UgbG9jayBlc3BlY2lhbGx5IHRhaWxvcmVkIGZvciBvcHRpbWlzdGljIHNwaW5uaW5nIGZvciBzbGVlcGluZworICogbG9jayBpbXBsZW1lbnRhdGlvbnMgKG11dGV4LCByd3NlbSwgZXRjKS4KKyAqCisgKiBVc2luZyBhIHNpbmdsZSBtY3Mgbm9kZSBwZXIgQ1BVIGlzIHNhZmUgYmVjYXVzZSBzbGVlcGluZyBsb2NrcyBzaG91bGQgbm90IGJlCisgKiBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBhbmQgd2UgaGF2ZSBwcmVlbXB0aW9uIGRpc2FibGVkIHdoaWxlCisgKiBzcGlubmluZy4KKyAqLworc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUsIG9zcV9ub2RlKTsKKworLyoKKyAqIEdldCBhIHN0YWJsZSBAbm9kZS0+bmV4dCBwb2ludGVyLCBlaXRoZXIgZm9yIHVubG9jaygpIG9yIHVucXVldWUoKSBwdXJwb3Nlcy4KKyAqIENhbiByZXR1cm4gTlVMTCBpbiBjYXNlIHdlIHdlcmUgdGhlIGxhc3QgcXVldWVkIGFuZCB3ZSB1cGRhdGVkIEBsb2NrIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqCitvc3Ffd2FpdF9uZXh0KHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKipsb2NrLAorCSAgICAgIHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKm5vZGUsCisJICAgICAgc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqcHJldikKK3sKKwlzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICpuZXh0ID0gTlVMTDsKKworCWZvciAoOzspIHsKKwkJaWYgKCpsb2NrID09IG5vZGUgJiYgY21weGNoZyhsb2NrLCBub2RlLCBwcmV2KSA9PSBub2RlKSB7CisJCQkvKgorCQkJICogV2Ugd2VyZSB0aGUgbGFzdCBxdWV1ZWQsIHdlIG1vdmVkIEBsb2NrIGJhY2suIEBwcmV2CisJCQkgKiB3aWxsIG5vdyBvYnNlcnZlIEBsb2NrIGFuZCB3aWxsIGNvbXBsZXRlIGl0cworCQkJICogdW5sb2NrKCkvdW5xdWV1ZSgpLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFdlIG11c3QgeGNoZygpIHRoZSBAbm9kZS0+bmV4dCB2YWx1ZSwgYmVjYXVzZSBpZiB3ZSB3ZXJlIHRvCisJCSAqIGxlYXZlIGl0IGluLCBhIGNvbmN1cnJlbnQgdW5sb2NrKCkvdW5xdWV1ZSgpIGZyb20KKwkJICogQG5vZGUtPm5leHQgbWlnaHQgY29tcGxldGUgU3RlcC1BIGFuZCB0aGluayBpdHMgQHByZXYgaXMKKwkJICogc3RpbGwgdmFsaWQuCisJCSAqCisJCSAqIElmIHRoZSBjb25jdXJyZW50IHVubG9jaygpL3VucXVldWUoKSB3aW5zIHRoZSByYWNlLCB3ZSdsbAorCQkgKiB3YWl0IGZvciBlaXRoZXIgQGxvY2sgdG8gcG9pbnQgdG8gdXMsIHRocm91Z2ggaXRzIFN0ZXAtQiwgb3IKKwkJICogd2FpdCBmb3IgYSBuZXcgQG5vZGUtPm5leHQgZnJvbSBpdHMgU3RlcC1DLgorCQkgKi8KKwkJaWYgKG5vZGUtPm5leHQpIHsKKwkJCW5leHQgPSB4Y2hnKCZub2RlLT5uZXh0LCBOVUxMKTsKKwkJCWlmIChuZXh0KQorCQkJCWJyZWFrOworCQl9CisKKwkJYXJjaF9tdXRleF9jcHVfcmVsYXgoKTsKKwl9CisKKwlyZXR1cm4gbmV4dDsKK30KKworYm9vbCBvc3FfbG9jayhzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICoqbG9jaykKK3sKKwlzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICpub2RlID0gdGhpc19jcHVfcHRyKCZvc3Ffbm9kZSk7CisJc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqcHJldiwgKm5leHQ7CisKKwlub2RlLT5sb2NrZWQgPSAwOworCW5vZGUtPm5leHQgPSBOVUxMOworCisJbm9kZS0+cHJldiA9IHByZXYgPSB4Y2hnKGxvY2ssIG5vZGUpOworCWlmIChsaWtlbHkocHJldiA9PSBOVUxMKSkKKwkJcmV0dXJuIHRydWU7CisKKwlBQ0NFU1NfT05DRShwcmV2LT5uZXh0KSA9IG5vZGU7CisKKwkvKgorCSAqIE5vcm1hbGx5IEBwcmV2IGlzIHVudG91Y2hhYmxlIGFmdGVyIHRoZSBhYm92ZSBzdG9yZTsgYmVjYXVzZSBhdCB0aGF0CisJICogbW9tZW50IHVubG9jayBjYW4gcHJvY2VlZCBhbmQgd2lwZSB0aGUgbm9kZSBlbGVtZW50IGZyb20gc3RhY2suCisJICoKKwkgKiBIb3dldmVyLCBzaW5jZSBvdXIgbm9kZXMgYXJlIHN0YXRpYyBwZXItY3B1IHN0b3JhZ2UsIHdlJ3JlCisJICogZ3VhcmFudGVlZCB0aGVpciBleGlzdGVuY2UgLS0gdGhpcyBhbGxvd3MgdXMgdG8gYXBwbHkKKwkgKiBjbXB4Y2hnIGluIGFuIGF0dGVtcHQgdG8gdW5kbyBvdXIgcXVldWVpbmcuCisJICovCisKKwl3aGlsZSAoIXNtcF9sb2FkX2FjcXVpcmUoJm5vZGUtPmxvY2tlZCkpIHsKKwkJLyoKKwkJICogSWYgd2UgbmVlZCB0byByZXNjaGVkdWxlIGJhaWwuLi4gc28gd2UgY2FuIGJsb2NrLgorCQkgKi8KKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJZ290byB1bnF1ZXVlOworCisJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CisJfQorCXJldHVybiB0cnVlOworCit1bnF1ZXVlOgorCS8qCisJICogU3RlcCAtIEEgIC0tIHN0YWJpbGl6ZSBAcHJldgorCSAqCisJICogVW5kbyBvdXIgQHByZXYtPm5leHQgYXNzaWdubWVudDsgdGhpcyB3aWxsIG1ha2UgQHByZXYncworCSAqIHVubG9jaygpL3VucXVldWUoKSB3YWl0IGZvciBhIG5leHQgcG9pbnRlciBzaW5jZSBAbG9jayBwb2ludHMgdG8gdXMKKwkgKiAob3IgbGF0ZXIpLgorCSAqLworCisJZm9yICg7OykgeworCQlpZiAocHJldi0+bmV4dCA9PSBub2RlICYmCisJCSAgICBjbXB4Y2hnKCZwcmV2LT5uZXh0LCBub2RlLCBOVUxMKSA9PSBub2RlKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogV2UgY2FuIG9ubHkgZmFpbCB0aGUgY21weGNoZygpIHJhY2luZyBhZ2FpbnN0IGFuIHVubG9jaygpLAorCQkgKiBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBvYnNlcnZlIEBub2RlLT5sb2NrZWQgYmVjb21taW5nCisJCSAqIHRydWUuCisJCSAqLworCQlpZiAoc21wX2xvYWRfYWNxdWlyZSgmbm9kZS0+bG9ja2VkKSkKKwkJCXJldHVybiB0cnVlOworCisJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CisKKwkJLyoKKwkJICogT3Igd2UgcmFjZSBhZ2FpbnN0IGEgY29uY3VycmVudCB1bnF1ZXVlKCkncyBzdGVwLUIsIGluIHdoaWNoCisJCSAqIGNhc2UgaXRzIHN0ZXAtQyB3aWxsIHdyaXRlIHVzIGEgbmV3IEBub2RlLT5wcmV2IHBvaW50ZXIuCisJCSAqLworCQlwcmV2ID0gQUNDRVNTX09OQ0Uobm9kZS0+cHJldik7CisJfQorCisJLyoKKwkgKiBTdGVwIC0gQiAtLSBzdGFiaWxpemUgQG5leHQKKwkgKgorCSAqIFNpbWlsYXIgdG8gdW5sb2NrKCksIHdhaXQgZm9yIEBub2RlLT5uZXh0IG9yIG1vdmUgQGxvY2sgZnJvbSBAbm9kZQorCSAqIGJhY2sgdG8gQHByZXYuCisJICovCisKKwluZXh0ID0gb3NxX3dhaXRfbmV4dChsb2NrLCBub2RlLCBwcmV2KTsKKwlpZiAoIW5leHQpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogU3RlcCAtIEMgLS0gdW5saW5rCisJICoKKwkgKiBAcHJldiBpcyBzdGFibGUgYmVjYXVzZSBpdHMgc3RpbGwgd2FpdGluZyBmb3IgYSBuZXcgQHByZXYtPm5leHQKKwkgKiBwb2ludGVyLCBAbmV4dCBpcyBzdGFibGUgYmVjYXVzZSBvdXIgQG5vZGUtPm5leHQgcG9pbnRlciBpcyBOVUxMIGFuZAorCSAqIGl0IHdpbGwgd2FpdCBpbiBTdGVwLUEuCisJICovCisKKwlBQ0NFU1NfT05DRShuZXh0LT5wcmV2KSA9IHByZXY7CisJQUNDRVNTX09OQ0UocHJldi0+bmV4dCkgPSBuZXh0OworCisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIG9zcV91bmxvY2soc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqKmxvY2spCit7CisJc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqbm9kZSA9IHRoaXNfY3B1X3B0cigmb3NxX25vZGUpOworCXN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKm5leHQ7CisKKwkvKgorCSAqIEZhc3QgcGF0aCBmb3IgdGhlIHVuY29udGVuZGVkIGNhc2UuCisJICovCisJaWYgKGxpa2VseShjbXB4Y2hnKGxvY2ssIG5vZGUsIE5VTEwpID09IG5vZGUpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNlY29uZCBtb3N0IGxpa2VseSBjYXNlLgorCSAqLworCW5leHQgPSB4Y2hnKCZub2RlLT5uZXh0LCBOVUxMKTsKKwlpZiAobmV4dCkgeworCQlBQ0NFU1NfT05DRShuZXh0LT5sb2NrZWQpID0gMTsKKwkJcmV0dXJuOworCX0KKworCW5leHQgPSBvc3Ffd2FpdF9uZXh0KGxvY2ssIG5vZGUsIE5VTEwpOworCWlmIChuZXh0KQorCQlBQ0NFU1NfT05DRShuZXh0LT5sb2NrZWQpID0gMTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL21jc19zcGlubG9jay5oIGIva2VybmVsL2xvY2tpbmcvbWNzX3NwaW5sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkYmFjNAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9sb2NraW5nL21jc19zcGlubG9jay5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTUNTIGxvY2sgZGVmaW5lcworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZSBhbmQgQVBJIGRlZmluaXRpb25zIG9mIE1DUyBsb2NrLgorICoKKyAqIFRoZSBNQ1MgbG9jayAocHJvcG9zZWQgYnkgTWVsbG9yLUNydW1tZXkgYW5kIFNjb3R0KSBpcyBhIHNpbXBsZSBzcGluLWxvY2sKKyAqIHdpdGggdGhlIGRlc2lyYWJsZSBwcm9wZXJ0aWVzIG9mIGJlaW5nIGZhaXIsIGFuZCB3aXRoIGVhY2ggY3B1IHRyeWluZworICogdG8gYWNxdWlyZSB0aGUgbG9jayBzcGlubmluZyBvbiBhIGxvY2FsIHZhcmlhYmxlLgorICogSXQgYXZvaWRzIGV4cGVuc2l2ZSBjYWNoZSBib3VuY2luZ3MgdGhhdCBjb21tb24gdGVzdC1hbmQtc2V0IHNwaW4tbG9jaworICogaW1wbGVtZW50YXRpb25zIGluY3VyLgorICovCisjaWZuZGVmIF9fTElOVVhfTUNTX1NQSU5MT0NLX0gKKyNkZWZpbmUgX19MSU5VWF9NQ1NfU1BJTkxPQ0tfSAorCisjaW5jbHVkZSA8YXNtL21jc19zcGlubG9jay5oPgorCitzdHJ1Y3QgbWNzX3NwaW5sb2NrIHsKKwlzdHJ1Y3QgbWNzX3NwaW5sb2NrICpuZXh0OworCWludCBsb2NrZWQ7IC8qIDEgaWYgbG9jayBhY3F1aXJlZCAqLworfTsKKworI2lmbmRlZiBhcmNoX21jc19zcGluX2xvY2tfY29udGVuZGVkCisvKgorICogVXNpbmcgc21wX2xvYWRfYWNxdWlyZSgpIHByb3ZpZGVzIGEgbWVtb3J5IGJhcnJpZXIgdGhhdCBlbnN1cmVzCisgKiBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgaGFwcGVuIGFmdGVyIHRoZSBsb2NrIGlzIGFjcXVpcmVkLgorICovCisjZGVmaW5lIGFyY2hfbWNzX3NwaW5fbG9ja19jb250ZW5kZWQobCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJd2hpbGUgKCEoc21wX2xvYWRfYWNxdWlyZShsKSkpCQkJCQlcCisJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgYXJjaF9tY3Nfc3Bpbl91bmxvY2tfY29udGVuZGVkCisvKgorICogc21wX3N0b3JlX3JlbGVhc2UoKSBwcm92aWRlcyBhIG1lbW9yeSBiYXJyaWVyIHRvIGVuc3VyZSBhbGwKKyAqIG9wZXJhdGlvbnMgaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkIGJlZm9yZQorICogdW5sb2NraW5nLgorICovCisjZGVmaW5lIGFyY2hfbWNzX3NwaW5fdW5sb2NrX2NvbnRlbmRlZChsKQkJCQlcCisJc21wX3N0b3JlX3JlbGVhc2UoKGwpLCAxKQorI2VuZGlmCisKKy8qCisgKiBOb3RlOiB0aGUgc21wX2xvYWRfYWNxdWlyZS9zbXBfc3RvcmVfcmVsZWFzZSBwYWlyIGlzIG5vdAorICogc3VmZmljaWVudCB0byBmb3JtIGEgZnVsbCBtZW1vcnkgYmFycmllciBhY3Jvc3MKKyAqIGNwdXMgZm9yIG1hbnkgYXJjaGl0ZWN0dXJlcyAoZXhjZXB0IHg4NikgZm9yIG1jc191bmxvY2sgYW5kIG1jc19sb2NrLgorICogRm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgYSBmdWxsIGJhcnJpZXIgYWNyb3NzIG11bHRpcGxlIGNwdXMKKyAqIHdpdGggbWNzX3VubG9jayBhbmQgbWNzX2xvY2sgcGFpciwgc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpIHNob3VsZCBiZQorICogdXNlZCBhZnRlciBtY3NfbG9jay4KKyAqLworCisvKgorICogSW4gb3JkZXIgdG8gYWNxdWlyZSB0aGUgbG9jaywgdGhlIGNhbGxlciBzaG91bGQgZGVjbGFyZSBhIGxvY2FsIG5vZGUgYW5kCisgKiBwYXNzIGEgcmVmZXJlbmNlIG9mIHRoZSBub2RlIHRvIHRoaXMgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIGxvY2suCisgKiBJZiB0aGUgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGFjcXVpcmVkLCB0aGVuIHRoaXMgd2lsbCBwcm9jZWVkIHRvIHNwaW4KKyAqIG9uIHRoaXMgbm9kZS0+bG9ja2VkIHVudGlsIHRoZSBwcmV2aW91cyBsb2NrIGhvbGRlciBzZXRzIHRoZSBub2RlLT5sb2NrZWQKKyAqIGluIG1jc19zcGluX3VubG9jaygpLgorICoKKyAqIFdlIGRvbid0IGlubGluZSBtY3Nfc3Bpbl9sb2NrKCkgc28gdGhhdCBwZXJmIGNhbiBjb3JyZWN0bHkgYWNjb3VudCBmb3IgdGhlCisgKiB0aW1lIHNwZW50IGluIHRoaXMgbG9jayBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBtY3Nfc3Bpbl9sb2NrKHN0cnVjdCBtY3Nfc3BpbmxvY2sgKipsb2NrLCBzdHJ1Y3QgbWNzX3NwaW5sb2NrICpub2RlKQoreworCXN0cnVjdCBtY3Nfc3BpbmxvY2sgKnByZXY7CisKKwkvKiBJbml0IG5vZGUgKi8KKwlub2RlLT5sb2NrZWQgPSAwOworCW5vZGUtPm5leHQgICA9IE5VTEw7CisKKwlwcmV2ID0geGNoZyhsb2NrLCBub2RlKTsKKwlpZiAobGlrZWx5KHByZXYgPT0gTlVMTCkpIHsKKwkJLyoKKwkJICogTG9jayBhY3F1aXJlZCwgZG9uJ3QgbmVlZCB0byBzZXQgbm9kZS0+bG9ja2VkIHRvIDEuIFRocmVhZHMKKwkJICogb25seSBzcGluIG9uIGl0cyBvd24gbm9kZS0+bG9ja2VkIHZhbHVlIGZvciBsb2NrIGFjcXVpc2l0aW9uLgorCQkgKiBIb3dldmVyLCBzaW5jZSB0aGlzIHRocmVhZCBjYW4gaW1tZWRpYXRlbHkgYWNxdWlyZSB0aGUgbG9jaworCQkgKiBhbmQgZG9lcyBub3QgcHJvY2VlZCB0byBzcGluIG9uIGl0cyBvd24gbm9kZS0+bG9ja2VkLCB0aGlzCisJCSAqIHZhbHVlIHdvbid0IGJlIHVzZWQuIElmIGEgZGVidWcgbW9kZSBpcyBuZWVkZWQgdG8KKwkJICogYXVkaXQgbG9jayBzdGF0dXMsIHRoZW4gc2V0IG5vZGUtPmxvY2tlZCB2YWx1ZSBoZXJlLgorCQkgKi8KKwkJcmV0dXJuOworCX0KKwlBQ0NFU1NfT05DRShwcmV2LT5uZXh0KSA9IG5vZGU7CisKKwkvKiBXYWl0IHVudGlsIHRoZSBsb2NrIGhvbGRlciBwYXNzZXMgdGhlIGxvY2sgZG93bi4gKi8KKwlhcmNoX21jc19zcGluX2xvY2tfY29udGVuZGVkKCZub2RlLT5sb2NrZWQpOworfQorCisvKgorICogUmVsZWFzZXMgdGhlIGxvY2suIFRoZSBjYWxsZXIgc2hvdWxkIHBhc3MgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSB0aGF0CisgKiB3YXMgdXNlZCB0byBhY3F1aXJlIHRoZSBsb2NrLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIG1jc19zcGluX3VubG9jayhzdHJ1Y3QgbWNzX3NwaW5sb2NrICoqbG9jaywgc3RydWN0IG1jc19zcGlubG9jayAqbm9kZSkKK3sKKwlzdHJ1Y3QgbWNzX3NwaW5sb2NrICpuZXh0ID0gQUNDRVNTX09OQ0Uobm9kZS0+bmV4dCk7CisKKwlpZiAobGlrZWx5KCFuZXh0KSkgeworCQkvKgorCQkgKiBSZWxlYXNlIHRoZSBsb2NrIGJ5IHNldHRpbmcgaXQgdG8gTlVMTAorCQkgKi8KKwkJaWYgKGxpa2VseShjbXB4Y2hnKGxvY2ssIG5vZGUsIE5VTEwpID09IG5vZGUpKQorCQkJcmV0dXJuOworCQkvKiBXYWl0IHVudGlsIHRoZSBuZXh0IHBvaW50ZXIgaXMgc2V0ICovCisJCXdoaWxlICghKG5leHQgPSBBQ0NFU1NfT05DRShub2RlLT5uZXh0KSkpCisJCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOworCX0KKworCS8qIFBhc3MgbG9jayB0byBuZXh0IHdhaXRlci4gKi8KKwlhcmNoX21jc19zcGluX3VubG9ja19jb250ZW5kZWQoJm5leHQtPmxvY2tlZCk7Cit9CisKKy8qCisgKiBDYW5jZWxsYWJsZSB2ZXJzaW9uIG9mIHRoZSBNQ1MgbG9jayBhYm92ZS4KKyAqCisgKiBJbnRlbmRlZCBmb3IgYWRhcHRpdmUgc3Bpbm5pbmcgb2Ygc2xlZXBpbmcgbG9ja3M6CisgKiBtdXRleF9sb2NrKCkvcndzZW1fZG93bl97cmVhZCx3cml0ZX0oKSBldGMuCisgKi8KKworc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSB7CisJc3RydWN0IG9wdGltaXN0aWNfc3Bpbl9xdWV1ZSAqbmV4dCwgKnByZXY7CisJaW50IGxvY2tlZDsgLyogMSBpZiBsb2NrIGFjcXVpcmVkICovCit9OworCitleHRlcm4gYm9vbCBvc3FfbG9jayhzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1ZXVlICoqbG9jayk7CitleHRlcm4gdm9pZCBvc3FfdW5sb2NrKHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKipsb2NrKTsKKworI2VuZGlmIC8qIF9fTElOVVhfTUNTX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL211dGV4LWRlYnVnLmMgYi9rZXJuZWwvbG9ja2luZy9tdXRleC1kZWJ1Zy5jCmluZGV4IGZhZjZmNWIuLmUxMTkxYzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL211dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL2xvY2tpbmcvbXV0ZXgtZGVidWcuYwpAQCAtODMsNiArODMsMTIgQEAKIAogCURFQlVHX0xPQ0tTX1dBUk5fT04oIWxvY2stPndhaXRfbGlzdC5wcmV2ICYmICFsb2NrLT53YWl0X2xpc3QubmV4dCk7CiAJbXV0ZXhfY2xlYXJfb3duZXIobG9jayk7CisKKwkvKgorCSAqIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkgaXMgZXhwbGljaXRseSAwIGZvciBkZWJ1ZworCSAqIG11dGV4ZXMgc28gdGhhdCB3ZSBjYW4gZG8gaXQgaGVyZSBhZnRlciB3ZSd2ZSB2ZXJpZmllZCBzdGF0ZS4KKwkgKi8KKwlhdG9taWNfc2V0KCZsb2NrLT5jb3VudCwgMSk7CiB9CiAKIHZvaWQgZGVidWdfbXV0ZXhfaW5pdChzdHJ1Y3QgbXV0ZXggKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9tdXRleC5jIGIva2VybmVsL2xvY2tpbmcvbXV0ZXguYwppbmRleCA0ZGQ2ZTRjLi5iYzczZDMzIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9tdXRleC5jCisrKyBiL2tlcm5lbC9sb2NraW5nL211dGV4LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CisjaW5jbHVkZSAibWNzX3NwaW5sb2NrLmgiCiAKIC8qCiAgKiBJbiB0aGUgREVCVUcgY2FzZSB3ZSBhcmUgdXNpbmcgdGhlICJOVUxMIGZhc3RwYXRoIiBmb3IgbXV0ZXhlcywKQEAgLTMzLDYgKzM0LDEzIEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKICMgaW5jbHVkZSAibXV0ZXgtZGVidWcuaCIKICMgaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtbnVsbC5oPgorLyoKKyAqIE11c3QgYmUgMCBmb3IgdGhlIGRlYnVnIGNhc2Ugc28gd2UgZG8gbm90IGRvIHRoZSB1bmxvY2sgb3V0c2lkZSBvZiB0aGUKKyAqIHdhaXRfbG9jayByZWdpb24uIGRlYnVnX211dGV4X3VubG9jaygpIHdpbGwgZG8gdGhlIGFjdHVhbCB1bmxvY2sgaW4gdGhpcworICogY2FzZS4KKyAqLworIyB1bmRlZiBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaworIyBkZWZpbmUgIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkJMAogI2Vsc2UKICMgaW5jbHVkZSAibXV0ZXguaCIKICMgaW5jbHVkZSA8YXNtL211dGV4Lmg+CkBAIC01Miw3ICs2MCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmxvY2stPndhaXRfbGlzdCk7CiAJbXV0ZXhfY2xlYXJfb3duZXIobG9jayk7CiAjaWZkZWYgQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVIKLQlsb2NrLT5zcGluX21sb2NrID0gTlVMTDsKKwlsb2NrLT5vc3EgPSBOVUxMOwogI2VuZGlmCiAKIAlkZWJ1Z19tdXRleF9pbml0KGxvY2ssIG5hbWUsIGtleSk7CkBAIC02Nyw4ICs3NSw3IEBACiAgKiBXZSBhbHNvIHB1dCB0aGUgZmFzdHBhdGggZmlyc3QgaW4gdGhlIGtlcm5lbCBpbWFnZSwgdG8gbWFrZSBzdXJlIHRoZQogICogYnJhbmNoIGlzIHByZWRpY3RlZCBieSB0aGUgQ1BVIGFzIGRlZmF1bHQtdW50YWtlbi4KICAqLwotc3RhdGljIF9fdXNlZCBub2lubGluZSB2b2lkIF9fc2NoZWQKLV9fbXV0ZXhfbG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CitfX3Zpc2libGUgdm9pZCBfX3NjaGVkIF9fbXV0ZXhfbG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CiAKIC8qKgogICogbXV0ZXhfbG9jayAtIGFjcXVpcmUgdGhlIG11dGV4CkBAIC0xMTEsNTQgKzExOCw3IEBACiAgKiBtb3JlIG9yIGxlc3Mgc2ltdWx0YW5lb3VzbHksIHRoZSBzcGlubmVycyBuZWVkIHRvIGFjcXVpcmUgYSBNQ1MgbG9jawogICogZmlyc3QgYmVmb3JlIHNwaW5uaW5nIG9uIHRoZSBvd25lciBmaWVsZC4KICAqCi0gKiBXZSBkb24ndCBpbmxpbmUgbXNwaW5fbG9jaygpIHNvIHRoYXQgcGVyZiBjYW4gY29ycmVjdGx5IGFjY291bnQgZm9yIHRoZQotICogdGltZSBzcGVudCBpbiB0aGlzIGxvY2sgZnVuY3Rpb24uCiAgKi8KLXN0cnVjdCBtc3Bpbl9ub2RlIHsKLQlzdHJ1Y3QgbXNwaW5fbm9kZSAqbmV4dCA7Ci0JaW50CQkgIGxvY2tlZDsJLyogMSBpZiBsb2NrIGFjcXVpcmVkICovCi19OwotI2RlZmluZQlNTE9DSyhtdXRleCkJKChzdHJ1Y3QgbXNwaW5fbm9kZSAqKikmKChtdXRleCktPnNwaW5fbWxvY2spKQotCi1zdGF0aWMgbm9pbmxpbmUKLXZvaWQgbXNwaW5fbG9jayhzdHJ1Y3QgbXNwaW5fbm9kZSAqKmxvY2ssIHN0cnVjdCBtc3Bpbl9ub2RlICpub2RlKQotewotCXN0cnVjdCBtc3Bpbl9ub2RlICpwcmV2OwotCi0JLyogSW5pdCBub2RlICovCi0Jbm9kZS0+bG9ja2VkID0gMDsKLQlub2RlLT5uZXh0ICAgPSBOVUxMOwotCi0JcHJldiA9IHhjaGcobG9jaywgbm9kZSk7Ci0JaWYgKGxpa2VseShwcmV2ID09IE5VTEwpKSB7Ci0JCS8qIExvY2sgYWNxdWlyZWQgKi8KLQkJbm9kZS0+bG9ja2VkID0gMTsKLQkJcmV0dXJuOwotCX0KLQlBQ0NFU1NfT05DRShwcmV2LT5uZXh0KSA9IG5vZGU7Ci0Jc21wX3dtYigpOwotCS8qIFdhaXQgdW50aWwgdGhlIGxvY2sgaG9sZGVyIHBhc3NlcyB0aGUgbG9jayBkb3duICovCi0Jd2hpbGUgKCFBQ0NFU1NfT05DRShub2RlLT5sb2NrZWQpKQotCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOwotfQotCi1zdGF0aWMgdm9pZCBtc3Bpbl91bmxvY2soc3RydWN0IG1zcGluX25vZGUgKipsb2NrLCBzdHJ1Y3QgbXNwaW5fbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgbXNwaW5fbm9kZSAqbmV4dCA9IEFDQ0VTU19PTkNFKG5vZGUtPm5leHQpOwotCi0JaWYgKGxpa2VseSghbmV4dCkpIHsKLQkJLyoKLQkJICogUmVsZWFzZSB0aGUgbG9jayBieSBzZXR0aW5nIGl0IHRvIE5VTEwKLQkJICovCi0JCWlmIChjbXB4Y2hnKGxvY2ssIG5vZGUsIE5VTEwpID09IG5vZGUpCi0JCQlyZXR1cm47Ci0JCS8qIFdhaXQgdW50aWwgdGhlIG5leHQgcG9pbnRlciBpcyBzZXQgKi8KLQkJd2hpbGUgKCEobmV4dCA9IEFDQ0VTU19PTkNFKG5vZGUtPm5leHQpKSkKLQkJCWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7Ci0JfQotCUFDQ0VTU19PTkNFKG5leHQtPmxvY2tlZCkgPSAxOwotCXNtcF93bWIoKTsKLX0KIAogLyoKICAqIE11dGV4IHNwaW5uaW5nIGNvZGUgbWlncmF0ZWQgZnJvbSBrZXJuZWwvc2NoZWQvY29yZS5jCkBAIC0yMTIsNiArMTcyLDkgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyOwogCWludCByZXR2YWwgPSAxOwogCisJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQlyZXR1cm4gMDsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAlvd25lciA9IEFDQ0VTU19PTkNFKGxvY2stPm93bmVyKTsKIAlpZiAob3duZXIpCkBAIC0yMjUsNyArMTg4LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgX191c2VkIG5vaW5saW5lIHZvaWQgX19zY2hlZCBfX211dGV4X3VubG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CitfX3Zpc2libGUgX191c2VkIG5vaW5saW5lCit2b2lkIF9fc2NoZWQgX19tdXRleF91bmxvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpOwogCiAvKioKICAqIG11dGV4X3VubG9jayAtIHJlbGVhc2UgdGhlIG11dGV4CkBAIC00NDYsOSArNDEwLDExIEBACiAJaWYgKCFtdXRleF9jYW5fc3Bpbl9vbl9vd25lcihsb2NrKSkKIAkJZ290byBzbG93cGF0aDsKIAorCWlmICghb3NxX2xvY2soJmxvY2stPm9zcSkpCisJCWdvdG8gc2xvd3BhdGg7CisKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7Ci0JCXN0cnVjdCBtc3Bpbl9ub2RlICBub2RlOwogCiAJCWlmICh1c2Vfd3dfY3R4ICYmIHd3X2N0eC0+YWNxdWlyZWQgPiAwKSB7CiAJCQlzdHJ1Y3Qgd3dfbXV0ZXggKnd3OwpAQCAtNDYzLDE5ICs0MjksMTYgQEAKIAkJCSAqIHBlcmZvcm1lZCB0aGUgb3B0aW1pc3RpYyBzcGlubmluZyBjYW5ub3QgYmUgZG9uZS4KIAkJCSAqLwogCQkJaWYgKEFDQ0VTU19PTkNFKHd3LT5jdHgpKQotCQkJCWdvdG8gc2xvd3BhdGg7CisJCQkJYnJlYWs7CiAJCX0KIAogCQkvKgogCQkgKiBJZiB0aGVyZSdzIGFuIG93bmVyLCB3YWl0IGZvciBpdCB0byBlaXRoZXIKIAkJICogcmVsZWFzZSB0aGUgbG9jayBvciBnbyB0byBzbGVlcC4KIAkJICovCi0JCW1zcGluX2xvY2soTUxPQ0sobG9jayksICZub2RlKTsKIAkJb3duZXIgPSBBQ0NFU1NfT05DRShsb2NrLT5vd25lcik7Ci0JCWlmIChvd25lciAmJiAhbXV0ZXhfc3Bpbl9vbl9vd25lcihsb2NrLCBvd25lcikpIHsKLQkJCW1zcGluX3VubG9jayhNTE9DSyhsb2NrKSwgJm5vZGUpOwotCQkJZ290byBzbG93cGF0aDsKLQkJfQorCQlpZiAob3duZXIgJiYgIW11dGV4X3NwaW5fb25fb3duZXIobG9jaywgb3duZXIpKQorCQkJYnJlYWs7CiAKIAkJaWYgKChhdG9taWNfcmVhZCgmbG9jay0+Y291bnQpID09IDEpICYmCiAJCSAgICAoYXRvbWljX2NtcHhjaGcoJmxvY2stPmNvdW50LCAxLCAwKSA9PSAxKSkgewpAQCAtNDg4LDExICs0NTEsMTAgQEAKIAkJCX0KIAogCQkJbXV0ZXhfc2V0X293bmVyKGxvY2spOwotCQkJbXNwaW5fdW5sb2NrKE1MT0NLKGxvY2spLCAmbm9kZSk7CisJCQlvc3FfdW5sb2NrKCZsb2NrLT5vc3EpOwogCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCW1zcGluX3VubG9jayhNTE9DSyhsb2NrKSwgJm5vZGUpOwogCiAJCS8qCiAJCSAqIFdoZW4gdGhlcmUncyBubyBvd25lciwgd2UgbWlnaHQgaGF2ZSBwcmVlbXB0ZWQgYmV0d2VlbiB0aGUKQEAgLTUwMSw3ICs0NjMsNyBAQAogCQkgKiB0aGUgb3duZXIgY29tcGxldGUuCiAJCSAqLwogCQlpZiAoIW93bmVyICYmIChuZWVkX3Jlc2NoZWQoKSB8fCBydF90YXNrKHRhc2spKSkKLQkJCWdvdG8gc2xvd3BhdGg7CisJCQlicmVhazsKIAogCQkvKgogCQkgKiBUaGUgY3B1X3JlbGF4KCkgY2FsbCBpcyBhIGNvbXBpbGVyIGJhcnJpZXIgd2hpY2ggZm9yY2VzCkBAIC01MTEsNyArNDczLDE1IEBACiAJCSAqLwogCQlhcmNoX211dGV4X2NwdV9yZWxheCgpOwogCX0KKwlvc3FfdW5sb2NrKCZsb2NrLT5vc3EpOwogc2xvd3BhdGg6CisJLyoKKwkgKiBJZiB3ZSBmZWxsIG91dCBvZiB0aGUgc3BpbiBwYXRoIGJlY2F1c2Ugb2YgbmVlZF9yZXNjaGVkKCksCisJICogcmVzY2hlZHVsZSBub3csIGJlZm9yZSB3ZSB0cnktbG9jayB0aGUgbXV0ZXguIFRoaXMgYXZvaWRzIGdldHRpbmcKKwkgKiBzY2hlZHVsZWQgb3V0IHJpZ2h0IGFmdGVyIHdlIG9idGFpbmVkIHRoZSBtdXRleC4KKwkgKi8KKwlpZiAobmVlZF9yZXNjaGVkKCkpCisJCXNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQoKTsKICNlbmRpZgogCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7CiAKQEAgLTcxNywxMCArNjg3LDYgQEAKIAlzdHJ1Y3QgbXV0ZXggKmxvY2sgPSBjb250YWluZXJfb2YobG9ja19jb3VudCwgc3RydWN0IG11dGV4LCBjb3VudCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7Ci0JbXV0ZXhfcmVsZWFzZSgmbG9jay0+ZGVwX21hcCwgbmVzdGVkLCBfUkVUX0lQXyk7Ci0JZGVidWdfbXV0ZXhfdW5sb2NrKGxvY2spOwotCiAJLyoKIAkgKiBzb21lIGFyY2hpdGVjdHVyZXMgbGVhdmUgdGhlIGxvY2sgdW5sb2NrZWQgaW4gdGhlIGZhc3RwYXRoIGZhaWx1cmUKIAkgKiBjYXNlLCBvdGhlcnMgbmVlZCB0byBsZWF2ZSBpdCBsb2NrZWQuIEluIHRoZSBsYXRlciBjYXNlIHdlIGhhdmUgdG8KQEAgLTcyOSw2ICs2OTUsMTAgQEAKIAlpZiAoX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKSkKIAkJYXRvbWljX3NldCgmbG9jay0+Y291bnQsIDEpOwogCisJc3Bpbl9sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2ssIGZsYWdzKTsKKwltdXRleF9yZWxlYXNlKCZsb2NrLT5kZXBfbWFwLCBuZXN0ZWQsIF9SRVRfSVBfKTsKKwlkZWJ1Z19tdXRleF91bmxvY2sobG9jayk7CisKIAlpZiAoIWxpc3RfZW1wdHkoJmxvY2stPndhaXRfbGlzdCkpIHsKIAkJLyogZ2V0IHRoZSBmaXJzdCBlbnRyeSBmcm9tIHRoZSB3YWl0LWxpc3Q6ICovCiAJCXN0cnVjdCBtdXRleF93YWl0ZXIgKndhaXRlciA9CkBAIC03NDYsNyArNzE2LDcgQEAKIC8qCiAgKiBSZWxlYXNlIHRoZSBsb2NrLCBzbG93cGF0aDoKICAqLwotc3RhdGljIF9fdXNlZCBub2lubGluZSB2b2lkCitfX3Zpc2libGUgdm9pZAogX19tdXRleF91bmxvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpCiB7CiAJX19tdXRleF91bmxvY2tfY29tbW9uX3Nsb3dwYXRoKGxvY2tfY291bnQsIDEpOwpAQCAtODAzLDcgKzc3Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG11dGV4X2xvY2tfa2lsbGFibGUpOwogCi1zdGF0aWMgX191c2VkIG5vaW5saW5lIHZvaWQgX19zY2hlZAorX192aXNpYmxlIHZvaWQgX19zY2hlZAogX19tdXRleF9sb2NrX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50KQogewogCXN0cnVjdCBtdXRleCAqbG9jayA9IGNvbnRhaW5lcl9vZihsb2NrX2NvdW50LCBzdHJ1Y3QgbXV0ZXgsIGNvdW50KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3J0bXV0ZXguYyBiL2tlcm5lbC9sb2NraW5nL3J0bXV0ZXguYwppbmRleCAyZTk2MGEyLi5hYTRkZmYwIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9ydG11dGV4LmMKKysrIGIva2VybmVsL2xvY2tpbmcvcnRtdXRleC5jCkBAIC0yMTMsNiArMjEzLDE4IEBACiB9CiAKIC8qCisgKiBDYWxsZWQgYnkgc2NoZWRfc2V0c2NoZWR1bGVyKCkgdG8gY2hlY2sgd2hldGhlciB0aGUgcHJpb3JpdHkgY2hhbmdlCisgKiBpcyBvdmVycnVsZWQgYnkgYSBwb3NzaWJsZSBwcmlvcml0eSBib29zdGluZy4KKyAqLworaW50IHJ0X211dGV4X2NoZWNrX3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgbmV3cHJpbykKK3sKKwlpZiAoIXRhc2tfaGFzX3BpX3dhaXRlcnModGFzaykpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRhc2tfdG9wX3BpX3dhaXRlcih0YXNrKS0+dGFzay0+cHJpbyA8PSBuZXdwcmlvOworfQorCisvKgogICogQWRqdXN0IHRoZSBwcmlvcml0eSBvZiBhIHRhc2ssIGFmdGVyIGl0cyBwaV93YWl0ZXJzIGdvdCBtb2RpZmllZC4KICAqCiAgKiBUaGlzIGNhbiBiZSBib3RoIGJvb3N0aW5nIGFuZCB1bmJvb3N0aW5nLiB0YXNrLT5waV9sb2NrIG11c3QgYmUgaGVsZC4KZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYwppbmRleCAxOWM1ZmE5Li4xZDY2ZTA4IDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMKKysrIGIva2VybmVsL2xvY2tpbmcvcndzZW0teGFkZC5jCkBAIC0xNDMsNiArMTQzLDcgQEAKIC8qCiAgKiB3YWl0IGZvciB0aGUgcmVhZCBsb2NrIHRvIGJlIGdyYW50ZWQKICAqLworX192aXNpYmxlCiBzdHJ1Y3Qgcndfc2VtYXBob3JlIF9fc2NoZWQgKnJ3c2VtX2Rvd25fcmVhZF9mYWlsZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewogCWxvbmcgY291bnQsIGFkanVzdG1lbnQgPSAtUldTRU1fQUNUSVZFX1JFQURfQklBUzsKQEAgLTE5MCw2ICsxOTEsNyBAQAogLyoKICAqIHdhaXQgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IGFjcXVpcmUgdGhlIHdyaXRlIGxvY2sKICAqLworX192aXNpYmxlCiBzdHJ1Y3Qgcndfc2VtYXBob3JlIF9fc2NoZWQgKnJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKIAlsb25nIGNvdW50LCBhZGp1c3RtZW50ID0gLVJXU0VNX0FDVElWRV9XUklURV9CSUFTOwpAQCAtMjUyLDYgKzI1NCw3IEBACiAgKiBoYW5kbGUgd2FraW5nIHVwIGEgd2FpdGVyIG9uIHRoZSBzZW1hcGhvcmUKICAqIC0gdXBfcmVhZC91cF93cml0ZSBoYXMgZGVjcmVtZW50ZWQgdGhlIGFjdGl2ZSBwYXJ0IG9mIGNvdW50IGlmIHdlIGNvbWUgaGVyZQogICovCitfX3Zpc2libGUKIHN0cnVjdCByd19zZW1hcGhvcmUgKnJ3c2VtX3dha2Uoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNzIsNiArMjc1LDcgQEAKICAqIC0gY2FsbGVyIGluY3JlbWVudGVkIHdhaXRpbmcgcGFydCBvZiBjb3VudCBhbmQgZGlzY292ZXJlZCBpdCBzdGlsbCBuZWdhdGl2ZQogICogLSBqdXN0IHdha2UgdXAgYW55IHJlYWRlcnMgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZQogICovCitfX3Zpc2libGUKIHN0cnVjdCByd19zZW1hcGhvcmUgKnJ3c2VtX2Rvd25ncmFkZV93YWtlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGQyNGZjZjIuLjhkYzdmNWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAJCWJ1ZltsKytdID0gJ0MnOwogCS8qCiAJICogVEFJTlRfRk9SQ0VEX1JNTU9EOiBjb3VsZCBiZSBhZGRlZC4KLQkgKiBUQUlOVF9VTlNBRkVfU01QLCBUQUlOVF9NQUNISU5FX0NIRUNLLCBUQUlOVF9CQURfUEFHRSBkb24ndAorCSAqIFRBSU5UX0NQVV9PVVRfT0ZfU1BFQywgVEFJTlRfTUFDSElORV9DSEVDSywgVEFJTlRfQkFEX1BBR0UgZG9uJ3QKIAkgKiBhcHBseSB0byBtb2R1bGVzLgogCSAqLwogCXJldHVybiBsOwpAQCAtMTk0OCw2ICsxOTQ4LDEwIEBACiAKIAkJc3dpdGNoIChzeW1baV0uc3Rfc2huZHgpIHsKIAkJY2FzZSBTSE5fQ09NTU9OOgorCQkJLyogSWdub3JlIGNvbW1vbiBzeW1ib2xzICovCisJCQlpZiAoIXN0cm5jbXAobmFtZSwgIl9fZ251X2x0byIsIDkpKQorCQkJCWJyZWFrOworCiAJCQkvKiBXZSBjb21waWxlZCB3aXRoIC1mbm8tY29tbW9uLiAgVGhlc2UgYXJlIG5vdAogCQkJICAgc3VwcG9zZWQgdG8gaGFwcGVuLiAgKi8KIAkJCXByX2RlYnVnKCJDb21tb24gc3ltYm9sOiAlc1xuIiwgbmFtZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbm90aWZpZXIuYyBiL2tlcm5lbC9ub3RpZmllci5jCmluZGV4IDJkNWNjNGMuLmRiNGM4YjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ub3RpZmllci5jCisrKyBiL2tlcm5lbC9ub3RpZmllci5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAkgKiByYWN5IHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIHdoYXQgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdAogCSAqIGlzLCB3ZSByZS1jaGVjayB0aGUgbGlzdCBhZnRlciBoYXZpbmcgdGFrZW4gdGhlIGxvY2sgYW55d2F5OgogCSAqLwotCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KG5oLT5oZWFkKSkgeworCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIobmgtPmhlYWQpKSB7CiAJCWRvd25fcmVhZCgmbmgtPnJ3c2VtKTsKIAkJcmV0ID0gbm90aWZpZXJfY2FsbF9jaGFpbigmbmgtPmhlYWQsIHZhbCwgdiwgbnJfdG9fY2FsbCwKIAkJCQkJbnJfY2FsbHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCA2ZDYzMDAzLi5jY2E4YTkxIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHRudCB0bnRzW10gPSB7CiAJeyBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUsCSdQJywgJ0cnIH0sCiAJeyBUQUlOVF9GT1JDRURfTU9EVUxFLAkJJ0YnLCAnICcgfSwKLQl7IFRBSU5UX1VOU0FGRV9TTVAsCQknUycsICcgJyB9LAorCXsgVEFJTlRfQ1BVX09VVF9PRl9TUEVDLAknUycsICcgJyB9LAogCXsgVEFJTlRfRk9SQ0VEX1JNTU9ELAkJJ1InLCAnICcgfSwKIAl7IFRBSU5UX01BQ0hJTkVfQ0hFQ0ssCQknTScsICcgJyB9LAogCXsgVEFJTlRfQkFEX1BBR0UsCQknQicsICcgJyB9LApAQCAtNDU5LDcgKzQ1OSw3IEBACiAgKiBDYWxsZWQgd2hlbiBnY2MncyAtZnN0YWNrLXByb3RlY3RvciBmZWF0dXJlIGlzIHVzZWQsIGFuZAogICogZ2NjIGRldGVjdHMgY29ycnVwdGlvbiBvZiB0aGUgb24tc3RhY2sgY2FuYXJ5IHZhbHVlCiAgKi8KLXZvaWQgX19zdGFja19jaGtfZmFpbCh2b2lkKQorX192aXNpYmxlIHZvaWQgX19zdGFja19jaGtfZmFpbCh2b2lkKQogewogCXBhbmljKCJzdGFjay1wcm90ZWN0b3I6IEtlcm5lbCBzdGFjayBpcyBjb3JydXB0ZWQgaW46ICVwXG4iLAogCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3B0cmFjZS5jIGIva2VybmVsL3B0cmFjZS5jCmluZGV4IDFmNGJjYjMuLmFkZjk4NjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTExODAsOCArMTE4MCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcHRyYWNlKGNvbXBhdF9sb25nX3QgcmVxdWVzdCwgY29tcGF0X2xvbmdfdCBwaWQsCi0JCQkJICBjb21wYXRfbG9uZ190IGFkZHIsIGNvbXBhdF9sb25nX3QgZGF0YSkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTQocHRyYWNlLCBjb21wYXRfbG9uZ190LCByZXF1ZXN0LCBjb21wYXRfbG9uZ190LCBwaWQsCisJCSAgICAgICBjb21wYXRfbG9uZ190LCBhZGRyLCBjb21wYXRfbG9uZ190LCBkYXRhKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7CiAJbG9uZyByZXQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L01ha2VmaWxlIGIva2VybmVsL3JjdS9NYWtlZmlsZQppbmRleCAwMWU5ZWMzLi44MDdjY2ZiIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L01ha2VmaWxlCisrKyBiL2tlcm5lbC9yY3UvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiBvYmoteSArPSB1cGRhdGUubyBzcmN1Lm8KLW9iai0kKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUKSArPSB0b3J0dXJlLm8KK29iai0kKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUKSArPSByY3V0b3J0dXJlLm8KIG9iai0kKENPTkZJR19UUkVFX1JDVSkgKz0gdHJlZS5vCiBvYmotJChDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSkgKz0gdHJlZS5vCiBvYmotJChDT05GSUdfVFJFRV9SQ1VfVFJBQ0UpICs9IHRyZWVfdHJhY2UubwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS9yY3UuaCBiL2tlcm5lbC9yY3UvcmN1LmgKaW5kZXggNzljMzg3Ny4uYmZkYTI3MiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9yY3UuaAorKysgYi9rZXJuZWwvcmN1L3JjdS5oCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDExCiAgKgpAQCAtMjMsNiArMjMsNyBAQAogI2lmbmRlZiBfX0xJTlVYX1JDVV9ICiAjZGVmaW5lIF9fTElOVVhfUkNVX0gKIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9yY3UuaD4KICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFCiAjZGVmaW5lIFJDVV9UUkFDRShzdG10KSBzdG10CiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLwpAQCAtMTE2LDggKzExNyw2IEBACiAJfQogfQogCi1leHRlcm4gaW50IHJjdV9leHBlZGl0ZWQ7Ci0KICNpZmRlZiBDT05GSUdfUkNVX1NUQUxMX0NPTU1PTgogCiBleHRlcm4gaW50IHJjdV9jcHVfc3RhbGxfc3VwcHJlc3M7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3UvcmN1dG9ydHVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzBiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwpAQCAtMCwwICsxLDE1ODIgQEAKKy8qCisgKiBSZWFkLUNvcHkgVXBkYXRlIG1vZHVsZS1iYXNlZCB0b3J0dXJlIHRlc3QgZmFjaWxpdHkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwNgorICoKKyAqIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAdXMuaWJtLmNvbT4KKyAqCSAgSm9zaCBUcmlwbGV0dCA8am9zaEBmcmVlZGVza3RvcC5vcmc+CisgKgorICogU2VlIGFsc286ICBEb2N1bWVudGF0aW9uL1JDVS90b3J0dXJlLnR4dAorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NyY3UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2VfY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdG9ydHVyZS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQHVzLmlibS5jb20+IGFuZCBKb3NoIFRyaXBsZXR0IDxqb3NoQGZyZWVkZXNrdG9wLm9yZz4iKTsKKworCit0b3J0dXJlX3BhcmFtKGludCwgZnFzX2R1cmF0aW9uLCAwLAorCSAgICAgICJEdXJhdGlvbiBvZiBmcXMgYnVyc3RzICh1cyksIDAgdG8gZGlzYWJsZSIpOwordG9ydHVyZV9wYXJhbShpbnQsIGZxc19ob2xkb2ZmLCAwLCAiSG9sZG9mZiB0aW1lIHdpdGhpbiBmcXMgYnVyc3RzICh1cykiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBmcXNfc3R1dHRlciwgMywgIldhaXQgdGltZSBiZXR3ZWVuIGZxcyBidXJzdHMgKHMpIik7Cit0b3J0dXJlX3BhcmFtKGJvb2wsIGdwX2V4cCwgZmFsc2UsICJVc2UgZXhwZWRpdGVkIEdQIHdhaXQgcHJpbWl0aXZlcyIpOwordG9ydHVyZV9wYXJhbShib29sLCBncF9ub3JtYWwsIGZhbHNlLAorCSAgICAgIlVzZSBub3JtYWwgKG5vbi1leHBlZGl0ZWQpIEdQIHdhaXQgcHJpbWl0aXZlcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIGlycXJlYWRlciwgMSwgIkFsbG93IFJDVSByZWFkZXJzIGZyb20gaXJxIGhhbmRsZXJzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgbl9iYXJyaWVyX2NicywgMCwKKwkgICAgICIjIG9mIGNhbGxiYWNrcy9rdGhyZWFkcyBmb3IgYmFycmllciB0ZXN0aW5nIik7Cit0b3J0dXJlX3BhcmFtKGludCwgbmZha2V3cml0ZXJzLCA0LCAiTnVtYmVyIG9mIFJDVSBmYWtlIHdyaXRlciB0aHJlYWRzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgbnJlYWRlcnMsIC0xLCAiTnVtYmVyIG9mIFJDVSByZWFkZXIgdGhyZWFkcyIpOwordG9ydHVyZV9wYXJhbShpbnQsIG9iamVjdF9kZWJ1ZywgMCwKKwkgICAgICJFbmFibGUgZGVidWctb2JqZWN0IGRvdWJsZSBjYWxsX3JjdSgpIHRlc3RpbmciKTsKK3RvcnR1cmVfcGFyYW0oaW50LCBvbm9mZl9ob2xkb2ZmLCAwLCAiVGltZSBhZnRlciBib290IGJlZm9yZSBDUFUgaG90cGx1Z3MgKHMpIik7Cit0b3J0dXJlX3BhcmFtKGludCwgb25vZmZfaW50ZXJ2YWwsIDAsCisJICAgICAiVGltZSBiZXR3ZWVuIENQVSBob3RwbHVncyAocyksIDA9ZGlzYWJsZSIpOwordG9ydHVyZV9wYXJhbShpbnQsIHNodWZmbGVfaW50ZXJ2YWwsIDMsICJOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHNodWZmbGVzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc2h1dGRvd25fc2VjcywgMCwgIlNodXRkb3duIHRpbWUgKHMpLCA8PSB6ZXJvIHRvIGRpc2FibGUuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc3RhbGxfY3B1LCAwLCAiU3RhbGwgZHVyYXRpb24gKHMpLCB6ZXJvIHRvIGRpc2FibGUuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc3RhbGxfY3B1X2hvbGRvZmYsIDEwLAorCSAgICAgIlRpbWUgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgc3RhbGwgKHMpLiIpOwordG9ydHVyZV9wYXJhbShpbnQsIHN0YXRfaW50ZXJ2YWwsIDYwLAorCSAgICAgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc3RhdHMgcHJpbnRrKClzIik7Cit0b3J0dXJlX3BhcmFtKGludCwgc3R1dHRlciwgNSwgIk51bWJlciBvZiBzZWNvbmRzIHRvIHJ1bi9oYWx0IHRlc3QiKTsKK3RvcnR1cmVfcGFyYW0oaW50LCB0ZXN0X2Jvb3N0LCAxLCAiVGVzdCBSQ1UgcHJpbyBib29zdDogMD1ubywgMT1tYXliZSwgMj15ZXMuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgdGVzdF9ib29zdF9kdXJhdGlvbiwgNCwKKwkgICAgICJEdXJhdGlvbiBvZiBlYWNoIGJvb3N0IHRlc3QsIHNlY29uZHMuIik7Cit0b3J0dXJlX3BhcmFtKGludCwgdGVzdF9ib29zdF9pbnRlcnZhbCwgNywKKwkgICAgICJJbnRlcnZhbCBiZXR3ZWVuIGJvb3N0IHRlc3RzLCBzZWNvbmRzLiIpOwordG9ydHVyZV9wYXJhbShib29sLCB0ZXN0X25vX2lkbGVfaHosIHRydWUsCisJICAgICAiVGVzdCBzdXBwb3J0IGZvciB0aWNrbGVzcyBpZGxlIENQVXMiKTsKK3RvcnR1cmVfcGFyYW0oYm9vbCwgdmVyYm9zZSwgdHJ1ZSwKKwkgICAgICJFbmFibGUgdmVyYm9zZSBkZWJ1Z2dpbmcgcHJpbnRrKClzIik7CisKK3N0YXRpYyBjaGFyICp0b3J0dXJlX3R5cGUgPSAicmN1IjsKK21vZHVsZV9wYXJhbSh0b3J0dXJlX3R5cGUsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModG9ydHVyZV90eXBlLCAiVHlwZSBvZiBSQ1UgdG8gdG9ydHVyZSAocmN1LCByY3VfYmgsIC4uLikiKTsKKworc3RhdGljIGludCBucmVhbHJlYWRlcnM7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp3cml0ZXJfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKipmYWtld3JpdGVyX3Rhc2tzOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnJlYWRlcl90YXNrczsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN0YXRzX3Rhc2s7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpmcXNfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmJvb3N0X3Rhc2tzW05SX0NQVVNdOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3RhbGxfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKipiYXJyaWVyX2Nic190YXNrczsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmJhcnJpZXJfdGFzazsKKworI2RlZmluZSBSQ1VfVE9SVFVSRV9QSVBFX0xFTiAxMAorCitzdHJ1Y3QgcmN1X3RvcnR1cmUgeworCXN0cnVjdCByY3VfaGVhZCBydG9ydF9yY3U7CisJaW50IHJ0b3J0X3BpcGVfY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZCBydG9ydF9mcmVlOworCWludCBydG9ydF9tYnRlc3Q7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKHJjdV90b3J0dXJlX2ZyZWVsaXN0KTsKK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmUgX19yY3UgKnJjdV90b3J0dXJlX2N1cnJlbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb247CitzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlIHJjdV90b3J0dXJlc1sxMCAqIFJDVV9UT1JUVVJFX1BJUEVfTEVOXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socmN1X3RvcnR1cmVfbG9jayk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZyBbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXSwKKwkJICAgICAgcmN1X3RvcnR1cmVfY291bnQpID0geyAwIH07CitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZyBbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXSwKKwkJICAgICAgcmN1X3RvcnR1cmVfYmF0Y2gpID0geyAwIH07CitzdGF0aWMgYXRvbWljX3QgcmN1X3RvcnR1cmVfd2NvdW50W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV07CitzdGF0aWMgYXRvbWljX3Qgbl9yY3VfdG9ydHVyZV9hbGxvYzsKK3N0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWw7CitzdGF0aWMgYXRvbWljX3Qgbl9yY3VfdG9ydHVyZV9mcmVlOworc3RhdGljIGF0b21pY190IG5fcmN1X3RvcnR1cmVfbWJlcnJvcjsKK3N0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2Vycm9yOworc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9iYXJyaWVyX2Vycm9yOworc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdF9rdHJlcnJvcjsKK3N0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvcjsKK3N0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfZmFpbHVyZTsKK3N0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RzOworc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV90aW1lcnM7CitzdGF0aWMgbG9uZyBuX2JhcnJpZXJfYXR0ZW1wdHM7CitzdGF0aWMgbG9uZyBuX2JhcnJpZXJfc3VjY2Vzc2VzOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgcmN1X3RvcnR1cmVfcmVtb3ZlZDsKKworI2lmIGRlZmluZWQoTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFKQorI2RlZmluZSBSQ1VUT1JUVVJFX1JVTk5BQkxFX0lOSVQgMQorI2Vsc2UKKyNkZWZpbmUgUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUIDAKKyNlbmRpZgoraW50IHJjdXRvcnR1cmVfcnVubmFibGUgPSBSQ1VUT1JUVVJFX1JVTk5BQkxFX0lOSVQ7Cittb2R1bGVfcGFyYW0ocmN1dG9ydHVyZV9ydW5uYWJsZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmN1dG9ydHVyZV9ydW5uYWJsZSwgIlN0YXJ0IHJjdXRvcnR1cmUgYXQgYm9vdCIpOworCisjaWYgZGVmaW5lZChDT05GSUdfUkNVX0JPT1NUKSAmJiAhZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCisjZGVmaW5lIHJjdV9jYW5fYm9vc3QoKSAxCisjZWxzZSAvKiAjaWYgZGVmaW5lZChDT05GSUdfUkNVX0JPT1NUKSAmJiAhZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpICovCisjZGVmaW5lIHJjdV9jYW5fYm9vc3QoKSAwCisjZW5kaWYgLyogI2Vsc2UgI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAqLworCisjaWZkZWYgQ09ORklHX1JDVV9UUkFDRQorc3RhdGljIHU2NCBub3RyYWNlIHJjdV90cmFjZV9jbG9ja19sb2NhbCh2b2lkKQoreworCXU2NCB0cyA9IHRyYWNlX2Nsb2NrX2xvY2FsKCk7CisJdW5zaWduZWQgbG9uZyBfX21heWJlX3VudXNlZCB0c19yZW0gPSBkb19kaXYodHMsIE5TRUNfUEVSX1VTRUMpOworCXJldHVybiB0czsKK30KKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFICovCitzdGF0aWMgdTY0IG5vdHJhY2UgcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKHZvaWQpCit7CisJcmV0dXJuIDBVTEw7Cit9CisjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYm9vc3Rfc3RhcnR0aW1lOwkvKiBqaWZmaWVzIG9mIG5leHQgYm9vc3QgdGVzdCBzdGFydC4gKi8KK0RFRklORV9NVVRFWChib29zdF9tdXRleCk7CQkvKiBwcm90ZWN0IHNldHRpbmcgYm9vc3Rfc3RhcnR0aW1lICovCisJCQkJCS8qICBhbmQgYm9vc3QgdGFzayBjcmVhdGUvZGVzdHJveS4gKi8KK3N0YXRpYyBhdG9taWNfdCBiYXJyaWVyX2Nic19jb3VudDsJLyogQmFycmllciBjYWxsYmFja3MgcmVnaXN0ZXJlZC4gKi8KK3N0YXRpYyBib29sIGJhcnJpZXJfcGhhc2U7CQkvKiBUZXN0IHBoYXNlLiAqLworc3RhdGljIGF0b21pY190IGJhcnJpZXJfY2JzX2ludm9rZWQ7CS8qIEJhcnJpZXIgY2FsbGJhY2tzIGludm9rZWQuICovCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgKmJhcnJpZXJfY2JzX3dxOyAvKiBDb29yZGluYXRlIGJhcnJpZXIgdGVzdGluZy4gKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChiYXJyaWVyX3dxKTsKKworLyoKKyAqIEFsbG9jYXRlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmUgKgorcmN1X3RvcnR1cmVfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJc3Bpbl9sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmcmN1X3RvcnR1cmVfZnJlZWxpc3QpKSB7CisJCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbCk7CisJCXNwaW5fdW5sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2MpOworCXAgPSByY3VfdG9ydHVyZV9mcmVlbGlzdC5uZXh0OworCWxpc3RfZGVsX2luaXQocCk7CisJc3Bpbl91bmxvY2tfYmgoJnJjdV90b3J0dXJlX2xvY2spOworCXJldHVybiBjb250YWluZXJfb2YocCwgc3RydWN0IHJjdV90b3J0dXJlLCBydG9ydF9mcmVlKTsKK30KKworLyoKKyAqIEZyZWUgYW4gZWxlbWVudCB0byB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCisgKi8KK3N0YXRpYyB2b2lkCityY3VfdG9ydHVyZV9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcCkKK3sKKwlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX2ZyZWUpOworCXNwaW5fbG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcC0+cnRvcnRfZnJlZSwgJnJjdV90b3J0dXJlX2ZyZWVsaXN0KTsKKwlzcGluX3VubG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7Cit9CisKKy8qCisgKiBPcGVyYXRpb25zIHZlY3RvciBmb3Igc2VsZWN0aW5nIGRpZmZlcmVudCB0eXBlcyBvZiB0ZXN0cy4KKyAqLworCitzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHsKKwl2b2lkICgqaW5pdCkodm9pZCk7CisJaW50ICgqcmVhZGxvY2spKHZvaWQpOworCXZvaWQgKCpyZWFkX2RlbGF5KShzdHJ1Y3QgdG9ydHVyZV9yYW5kb21fc3RhdGUgKnJyc3ApOworCXZvaWQgKCpyZWFkdW5sb2NrKShpbnQgaWR4KTsKKwlpbnQgKCpjb21wbGV0ZWQpKHZvaWQpOworCXZvaWQgKCpkZWZlcnJlZF9mcmVlKShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApOworCXZvaWQgKCpzeW5jKSh2b2lkKTsKKwl2b2lkICgqZXhwX3N5bmMpKHZvaWQpOworCXZvaWQgKCpjYWxsKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpOworCXZvaWQgKCpjYl9iYXJyaWVyKSh2b2lkKTsKKwl2b2lkICgqZnFzKSh2b2lkKTsKKwl2b2lkICgqc3RhdHMpKGNoYXIgKnBhZ2UpOworCWludCBpcnFfY2FwYWJsZTsKKwlpbnQgY2FuX2Jvb3N0OworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlX29wcyAqY3VyX29wczsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciByY3UgdG9ydHVyZSB0ZXN0aW5nLgorICovCisKK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfcmVhZF9sb2NrKHZvaWQpIF9fYWNxdWlyZXMoUkNVKQoreworCXJjdV9yZWFkX2xvY2soKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmN1X3JlYWRfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICpycnNwKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hvcnRkZWxheV91cyA9IDIwMDsKKwljb25zdCB1bnNpZ25lZCBsb25nIGxvbmdkZWxheV9tcyA9IDUwOworCisJLyogV2Ugd2FudCBhIHNob3J0IGRlbGF5IHNvbWV0aW1lcyB0byBtYWtlIGEgcmVhZGVyIGRlbGF5IHRoZSBncmFjZQorCSAqIHBlcmlvZCwgYW5kIHdlIHdhbnQgYSBsb25nIGRlbGF5IG9jY2FzaW9uYWxseSB0byB0cmlnZ2VyCisJICogZm9yY2VfcXVpZXNjZW50X3N0YXRlLiAqLworCisJaWYgKCEodG9ydHVyZV9yYW5kb20ocnJzcCkgJSAobnJlYWxyZWFkZXJzICogMjAwMCAqIGxvbmdkZWxheV9tcykpKQorCQltZGVsYXkobG9uZ2RlbGF5X21zKTsKKwlpZiAoISh0b3J0dXJlX3JhbmRvbShycnNwKSAlIChucmVhbHJlYWRlcnMgKiAyICogc2hvcnRkZWxheV91cykpKQorCQl1ZGVsYXkoc2hvcnRkZWxheV91cyk7CisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlpZiAoIXByZWVtcHRfY291bnQoKSAmJgorCSAgICAhKHRvcnR1cmVfcmFuZG9tKHJyc3ApICUgKG5yZWFscmVhZGVycyAqIDIwMDAwKSkpCisJCXByZWVtcHRfc2NoZWR1bGUoKTsgIC8qIE5vIFFTIGlmIHByZWVtcHRfZGlzYWJsZSgpIGluIGVmZmVjdCAqLworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJjdV90b3J0dXJlX3JlYWRfdW5sb2NrKGludCBpZHgpIF9fcmVsZWFzZXMoUkNVKQoreworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IHJjdV90b3J0dXJlX2NvbXBsZXRlZCh2b2lkKQoreworCXJldHVybiByY3VfYmF0Y2hlc19jb21wbGV0ZWQoKTsKK30KKworc3RhdGljIHZvaWQKK3JjdV90b3J0dXJlX2NiKHN0cnVjdCByY3VfaGVhZCAqcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmN1X3RvcnR1cmUgKnJwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByY3VfdG9ydHVyZSwgcnRvcnRfcmN1KTsKKworCWlmICh0b3J0dXJlX211c3Rfc3RvcF9pcnEoKSkgeworCQkvKiBUZXN0IGlzIGVuZGluZywganVzdCBkcm9wIGNhbGxiYWNrcyBvbiB0aGUgZmxvb3IuICovCisJCS8qIFRoZSBuZXh0IGluaXRpYWxpemF0aW9uIHdpbGwgcGljayB1cCB0aGUgcGllY2VzLiAqLworCQlyZXR1cm47CisJfQorCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKKwlpZiAoaSA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKQorCQlpID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKKwlpZiAoKytycC0+cnRvcnRfcGlwZV9jb3VudCA+PSBSQ1VfVE9SVFVSRV9QSVBFX0xFTikgeworCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKKwkJcmN1X3RvcnR1cmVfZnJlZShycCk7CisJfSBlbHNlIHsKKwkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShycCk7CisJfQorfQorCitzdGF0aWMgaW50IHJjdV9ub19jb21wbGV0ZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCit7CisJY2FsbF9yY3UoJnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOworfQorCitzdGF0aWMgdm9pZCByY3Vfc3luY190b3J0dXJlX2luaXQodm9pZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHJjdV9vcHMgPSB7CisJLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAorCS5yZWFkbG9jawk9IHJjdV90b3J0dXJlX3JlYWRfbG9jaywKKwkucmVhZF9kZWxheQk9IHJjdV9yZWFkX2RlbGF5LAorCS5yZWFkdW5sb2NrCT0gcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCisJLmNvbXBsZXRlZAk9IHJjdV90b3J0dXJlX2NvbXBsZXRlZCwKKwkuZGVmZXJyZWRfZnJlZQk9IHJjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUsCisJLnN5bmMJCT0gc3luY2hyb25pemVfcmN1LAorCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQsCisJLmNhbGwJCT0gY2FsbF9yY3UsCisJLmNiX2JhcnJpZXIJPSByY3VfYmFycmllciwKKwkuZnFzCQk9IHJjdV9mb3JjZV9xdWllc2NlbnRfc3RhdGUsCisJLnN0YXRzCQk9IE5VTEwsCisJLmlycV9jYXBhYmxlCT0gMSwKKwkuY2FuX2Jvb3N0CT0gcmN1X2Nhbl9ib29zdCgpLAorCS5uYW1lCQk9ICJyY3UiCit9OworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHJjdV9iaCB0b3J0dXJlIHRlc3RpbmcuCisgKi8KKworc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9yZWFkX2xvY2sodm9pZCkgX19hY3F1aXJlcyhSQ1VfQkgpCit7CisJcmN1X3JlYWRfbG9ja19iaCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jayhpbnQgaWR4KSBfX3JlbGVhc2VzKFJDVV9CSCkKK3sKKwlyY3VfcmVhZF91bmxvY2tfYmgoKTsKK30KKworc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9jb21wbGV0ZWQodm9pZCkKK3sKKwlyZXR1cm4gcmN1X2JhdGNoZXNfY29tcGxldGVkX2JoKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJjdV9iaF90b3J0dXJlX2RlZmVycmVkX2ZyZWUoc3RydWN0IHJjdV90b3J0dXJlICpwKQoreworCWNhbGxfcmN1X2JoKCZwLT5ydG9ydF9yY3UsIHJjdV90b3J0dXJlX2NiKTsKK30KKworc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgcmN1X2JoX29wcyA9IHsKKwkuaW5pdAkJPSByY3Vfc3luY190b3J0dXJlX2luaXQsCisJLnJlYWRsb2NrCT0gcmN1X2JoX3RvcnR1cmVfcmVhZF9sb2NrLAorCS5yZWFkX2RlbGF5CT0gcmN1X3JlYWRfZGVsYXksICAvKiBqdXN0IHJldXNlIHJjdSdzIHZlcnNpb24uICovCisJLnJlYWR1bmxvY2sJPSByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jaywKKwkuY29tcGxldGVkCT0gcmN1X2JoX3RvcnR1cmVfY29tcGxldGVkLAorCS5kZWZlcnJlZF9mcmVlCT0gcmN1X2JoX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKKwkuc3luYwkJPSBzeW5jaHJvbml6ZV9yY3VfYmgsCisJLmV4cF9zeW5jCT0gc3luY2hyb25pemVfcmN1X2JoX2V4cGVkaXRlZCwKKwkuY2FsbAkJPSBjYWxsX3JjdV9iaCwKKwkuY2JfYmFycmllcgk9IHJjdV9iYXJyaWVyX2JoLAorCS5mcXMJCT0gcmN1X2JoX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSwKKwkuc3RhdHMJCT0gTlVMTCwKKwkuaXJxX2NhcGFibGUJPSAxLAorCS5uYW1lCQk9ICJyY3VfYmgiCit9OworCisvKgorICogRG9uJ3QgZXZlbiB0aGluayBhYm91dCB0cnlpbmcgYW55IG9mIHRoZXNlIGluIHJlYWwgbGlmZSEhIQorICogVGhlIG5hbWVzIGluY2x1ZGVzICJidXN0ZWQiLCBhbmQgdGhleSByZWFsbHkgbWVhbnMgaXQhCisgKiBUaGUgb25seSBwdXJwb3NlIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyB0byBwcm92aWRlIGEgYnVnZ3kgUkNVCisgKiBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIHN1cmUgdGhhdCByY3V0b3J0dXJlIGNvcnJlY3RseSBlbWl0cworICogYnVnZ3ktUkNVIGVycm9yIG1lc3NhZ2VzLgorICovCitzdGF0aWMgdm9pZCByY3VfYnVzdGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCit7CisJLyogVGhpcyBpcyBhIGRlbGliZXJhdGUgYnVnIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkhICovCisJcmN1X3RvcnR1cmVfY2IoJnAtPnJ0b3J0X3JjdSk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNocm9uaXplX3JjdV9idXN0ZWQodm9pZCkKK3sKKwkvKiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBidWcgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSEgKi8KK30KKworc3RhdGljIHZvaWQKK2NhbGxfcmN1X2J1c3RlZChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpCit7CisJLyogVGhpcyBpcyBhIGRlbGliZXJhdGUgYnVnIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkhICovCisJZnVuYyhoZWFkKTsKK30KKworc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgcmN1X2J1c3RlZF9vcHMgPSB7CisJLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAorCS5yZWFkbG9jawk9IHJjdV90b3J0dXJlX3JlYWRfbG9jaywKKwkucmVhZF9kZWxheQk9IHJjdV9yZWFkX2RlbGF5LCAgLyoganVzdCByZXVzZSByY3UncyB2ZXJzaW9uLiAqLworCS5yZWFkdW5sb2NrCT0gcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCisJLmNvbXBsZXRlZAk9IHJjdV9ub19jb21wbGV0ZWQsCisJLmRlZmVycmVkX2ZyZWUJPSByY3VfYnVzdGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKKwkuc3luYwkJPSBzeW5jaHJvbml6ZV9yY3VfYnVzdGVkLAorCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3JjdV9idXN0ZWQsCisJLmNhbGwJCT0gY2FsbF9yY3VfYnVzdGVkLAorCS5jYl9iYXJyaWVyCT0gTlVMTCwKKwkuZnFzCQk9IE5VTEwsCisJLnN0YXRzCQk9IE5VTEwsCisJLmlycV9jYXBhYmxlCT0gMSwKKwkubmFtZQkJPSAicmN1X2J1c3RlZCIKK307CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3Igc3JjdSB0b3J0dXJlIHRlc3RpbmcuCisgKi8KKworREVGSU5FX1NUQVRJQ19TUkNVKHNyY3VfY3RsKTsKKworc3RhdGljIGludCBzcmN1X3RvcnR1cmVfcmVhZF9sb2NrKHZvaWQpIF9fYWNxdWlyZXMoJnNyY3VfY3RsKQoreworCXJldHVybiBzcmN1X3JlYWRfbG9jaygmc3JjdV9jdGwpOworfQorCitzdGF0aWMgdm9pZCBzcmN1X3JlYWRfZGVsYXkoc3RydWN0IHRvcnR1cmVfcmFuZG9tX3N0YXRlICpycnNwKQoreworCWxvbmcgZGVsYXk7CisJY29uc3QgbG9uZyB1c3BlcnRpY2sgPSAxMDAwMDAwIC8gSFo7CisJY29uc3QgbG9uZyBsb25nZGVsYXkgPSAxMDsKKworCS8qIFdlIHdhbnQgdGhlcmUgdG8gYmUgbG9uZy1ydW5uaW5nIHJlYWRlcnMsIGJ1dCBub3QgYWxsIHRoZSB0aW1lLiAqLworCisJZGVsYXkgPSB0b3J0dXJlX3JhbmRvbShycnNwKSAlCisJCShucmVhbHJlYWRlcnMgKiAyICogbG9uZ2RlbGF5ICogdXNwZXJ0aWNrKTsKKwlpZiAoIWRlbGF5KQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobG9uZ2RlbGF5KTsKKwllbHNlCisJCXJjdV9yZWFkX2RlbGF5KHJyc3ApOworfQorCitzdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfcmVhZF91bmxvY2soaW50IGlkeCkgX19yZWxlYXNlcygmc3JjdV9jdGwpCit7CisJc3JjdV9yZWFkX3VubG9jaygmc3JjdV9jdGwsIGlkeCk7Cit9CisKK3N0YXRpYyBpbnQgc3JjdV90b3J0dXJlX2NvbXBsZXRlZCh2b2lkKQoreworCXJldHVybiBzcmN1X2JhdGNoZXNfY29tcGxldGVkKCZzcmN1X2N0bCk7Cit9CisKK3N0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9kZWZlcnJlZF9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcnApCit7CisJY2FsbF9zcmN1KCZzcmN1X2N0bCwgJnJwLT5ydG9ydF9yY3UsIHJjdV90b3J0dXJlX2NiKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX3N5bmNocm9uaXplKHZvaWQpCit7CisJc3luY2hyb25pemVfc3JjdSgmc3JjdV9jdGwpOworfQorCitzdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfY2FsbChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsCisJCQkgICAgICB2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpoZWFkKSkKK3sKKwljYWxsX3NyY3UoJnNyY3VfY3RsLCBoZWFkLCBmdW5jKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX2JhcnJpZXIodm9pZCkKK3sKKwlzcmN1X2JhcnJpZXIoJnNyY3VfY3RsKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX3N0YXRzKGNoYXIgKnBhZ2UpCit7CisJaW50IGNwdTsKKwlpbnQgaWR4ID0gc3JjdV9jdGwuY29tcGxldGVkICYgMHgxOworCisJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlcyVzIHBlci1DUFUoaWR4PSVkKToiLAorCQkgICAgICAgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcsIGlkeCk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlZCglbHUsJWx1KSIsIGNwdSwKKwkJCSAgICAgICBwZXJfY3B1X3B0cihzcmN1X2N0bC5wZXJfY3B1X3JlZiwgY3B1KS0+Y1shaWR4XSwKKwkJCSAgICAgICBwZXJfY3B1X3B0cihzcmN1X2N0bC5wZXJfY3B1X3JlZiwgY3B1KS0+Y1tpZHhdKTsKKwl9CisJc3ByaW50ZihwYWdlLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX3N5bmNocm9uaXplX2V4cGVkaXRlZCh2b2lkKQoreworCXN5bmNocm9uaXplX3NyY3VfZXhwZWRpdGVkKCZzcmN1X2N0bCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHNyY3Vfb3BzID0geworCS5pbml0CQk9IHJjdV9zeW5jX3RvcnR1cmVfaW5pdCwKKwkucmVhZGxvY2sJPSBzcmN1X3RvcnR1cmVfcmVhZF9sb2NrLAorCS5yZWFkX2RlbGF5CT0gc3JjdV9yZWFkX2RlbGF5LAorCS5yZWFkdW5sb2NrCT0gc3JjdV90b3J0dXJlX3JlYWRfdW5sb2NrLAorCS5jb21wbGV0ZWQJPSBzcmN1X3RvcnR1cmVfY29tcGxldGVkLAorCS5kZWZlcnJlZF9mcmVlCT0gc3JjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUsCisJLnN5bmMJCT0gc3JjdV90b3J0dXJlX3N5bmNocm9uaXplLAorCS5leHBfc3luYwk9IHNyY3VfdG9ydHVyZV9zeW5jaHJvbml6ZV9leHBlZGl0ZWQsCisJLmNhbGwJCT0gc3JjdV90b3J0dXJlX2NhbGwsCisJLmNiX2JhcnJpZXIJPSBzcmN1X3RvcnR1cmVfYmFycmllciwKKwkuc3RhdHMJCT0gc3JjdV90b3J0dXJlX3N0YXRzLAorCS5uYW1lCQk9ICJzcmN1IgorfTsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBzY2hlZCB0b3J0dXJlIHRlc3RpbmcuCisgKi8KKworc3RhdGljIGludCBzY2hlZF90b3J0dXJlX3JlYWRfbG9jayh2b2lkKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY2hlZF90b3J0dXJlX3JlYWRfdW5sb2NrKGludCBpZHgpCit7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgcmN1X3NjaGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCit7CisJY2FsbF9yY3Vfc2NoZWQoJnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOworfQorCitzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlX29wcyBzY2hlZF9vcHMgPSB7CisJLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAorCS5yZWFkbG9jawk9IHNjaGVkX3RvcnR1cmVfcmVhZF9sb2NrLAorCS5yZWFkX2RlbGF5CT0gcmN1X3JlYWRfZGVsYXksICAvKiBqdXN0IHJldXNlIHJjdSdzIHZlcnNpb24uICovCisJLnJlYWR1bmxvY2sJPSBzY2hlZF90b3J0dXJlX3JlYWRfdW5sb2NrLAorCS5jb21wbGV0ZWQJPSByY3Vfbm9fY29tcGxldGVkLAorCS5kZWZlcnJlZF9mcmVlCT0gcmN1X3NjaGVkX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKKwkuc3luYwkJPSBzeW5jaHJvbml6ZV9zY2hlZCwKKwkuZXhwX3N5bmMJPSBzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWQsCisJLmNhbGwJCT0gY2FsbF9yY3Vfc2NoZWQsCisJLmNiX2JhcnJpZXIJPSByY3VfYmFycmllcl9zY2hlZCwKKwkuZnFzCQk9IHJjdV9zY2hlZF9mb3JjZV9xdWllc2NlbnRfc3RhdGUsCisJLnN0YXRzCQk9IE5VTEwsCisJLmlycV9jYXBhYmxlCT0gMSwKKwkubmFtZQkJPSAic2NoZWQiCit9OworCisvKgorICogUkNVIHRvcnR1cmUgcHJpb3JpdHktYm9vc3QgdGVzdGluZy4gIFJ1bnMgb25lIHJlYWwtdGltZSB0aHJlYWQgcGVyCisgKiBDUFUgZm9yIG1vZGVyYXRlIGJ1cnN0cywgcmVwZWF0ZWRseSByZWdpc3RlcmluZyBSQ1UgY2FsbGJhY2tzIGFuZAorICogc3Bpbm5pbmcgd2FpdGluZyBmb3IgdGhlbSB0byBiZSBpbnZva2VkLiAgSWYgYSBnaXZlbiBjYWxsYmFjayB0YWtlcworICogdG9vIGxvbmcgdG8gYmUgaW52b2tlZCwgd2UgYXNzdW1lIHRoYXQgcHJpb3JpdHkgaW52ZXJzaW9uIGhhcyBvY2N1cnJlZC4KKyAqLworCitzdHJ1Y3QgcmN1X2Jvb3N0X2luZmxpZ2h0IHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCWludCBpbmZsaWdodDsKK307CisKK3N0YXRpYyB2b2lkIHJjdV90b3J0dXJlX2Jvb3N0X2NiKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgcmN1X2Jvb3N0X2luZmxpZ2h0ICpyYmlwID0KKwkJY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQsIHJjdSk7CisKKwlzbXBfbWIoKTsgLyogRW5zdXJlIFJDVS1jb3JlIGFjY2Vzc2VzIHByZWNlZGUgY2xlYXJpbmcgLT5pbmZsaWdodCAqLworCXJiaXAtPmluZmxpZ2h0ID0gMDsKK30KKworc3RhdGljIGludCByY3VfdG9ydHVyZV9ib29zdCh2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBjYWxsX3JjdV90aW1lOworCXVuc2lnbmVkIGxvbmcgZW5kdGltZTsKKwl1bnNpZ25lZCBsb25nIG9sZHN0YXJ0dGltZTsKKwlzdHJ1Y3QgcmN1X2Jvb3N0X2luZmxpZ2h0IHJiaSA9IHsgLmluZmxpZ2h0ID0gMCB9OworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKworCVZFUkJPU0VfVE9ST1VUX1NUUklORygicmN1X3RvcnR1cmVfYm9vc3Qgc3RhcnRlZCIpOworCisJLyogU2V0IHJlYWwtdGltZSBwcmlvcml0eS4gKi8KKwlzcC5zY2hlZF9wcmlvcml0eSA9IDE7CisJaWYgKHNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9GSUZPLCAmc3ApIDwgMCkgeworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IFJUIHByaW8gZmFpbGVkISIpOworCQluX3JjdV90b3J0dXJlX2Jvb3N0X3J0ZXJyb3IrKzsKKwl9CisKKwlpbml0X3JjdV9oZWFkX29uX3N0YWNrKCZyYmkucmN1KTsKKwkvKiBFYWNoIHBhc3MgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGxvb3AgZG9lcyBvbmUgYm9vc3QtdGVzdCBjeWNsZS4gKi8KKwlkbyB7CisJCS8qIFdhaXQgZm9yIHRoZSBuZXh0IHRlc3QgaW50ZXJ2YWwuICovCisJCW9sZHN0YXJ0dGltZSA9IGJvb3N0X3N0YXJ0dGltZTsKKwkJd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzLCBvbGRzdGFydHRpbWUpKSB7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUob2xkc3RhcnR0aW1lIC0gamlmZmllcyk7CisJCQlzdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJCQlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCQlnb3RvIGNoZWNrd2FpdDsKKwkJfQorCisJCS8qIERvIG9uZSBib29zdC10ZXN0IGludGVydmFsLiAqLworCQllbmR0aW1lID0gb2xkc3RhcnR0aW1lICsgdGVzdF9ib29zdF9kdXJhdGlvbiAqIEhaOworCQljYWxsX3JjdV90aW1lID0gamlmZmllczsKKwkJd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzLCBlbmR0aW1lKSkgeworCQkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhbGxiYWNrIGluIGZsaWdodCwgcG9zdCBvbmUuICovCisJCQlpZiAoIXJiaS5pbmZsaWdodCkgeworCQkJCXNtcF9tYigpOyAvKiBSQ1UgY29yZSBiZWZvcmUgLT5pbmZsaWdodCA9IDEuICovCisJCQkJcmJpLmluZmxpZ2h0ID0gMTsKKwkJCQljYWxsX3JjdSgmcmJpLnJjdSwgcmN1X3RvcnR1cmVfYm9vc3RfY2IpOworCQkJCWlmIChqaWZmaWVzIC0gY2FsbF9yY3VfdGltZSA+CisJCQkJCSB0ZXN0X2Jvb3N0X2R1cmF0aW9uICogSFogLSBIWiAvIDIpIHsKKwkJCQkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9ib29zdCBib29zdGluZyBmYWlsZWQiKTsKKwkJCQkJbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlKys7CisJCQkJfQorCQkJCWNhbGxfcmN1X3RpbWUgPSBqaWZmaWVzOworCQkJfQorCQkJY29uZF9yZXNjaGVkKCk7CisJCQlzdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJCQlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCQlnb3RvIGNoZWNrd2FpdDsKKwkJfQorCisJCS8qCisJCSAqIFNldCB0aGUgc3RhcnQgdGltZSBvZiB0aGUgbmV4dCB0ZXN0IGludGVydmFsLgorCQkgKiBZZXMsIHRoaXMgaXMgdnVsbmVyYWJsZSB0byBsb25nIGRlbGF5cywgYnV0IHN1Y2gKKwkJICogZGVsYXlzIHNpbXBseSBjYXVzZSBhIGZhbHNlIG5lZ2F0aXZlIGZvciB0aGUgbmV4dAorCQkgKiBpbnRlcnZhbC4gIEJlc2lkZXMsIHdlIGFyZSBydW5uaW5nIGF0IFJUIHByaW9yaXR5LAorCQkgKiBzbyBkZWxheXMgc2hvdWxkIGJlIHJlbGF0aXZlbHkgcmFyZS4KKwkJICovCisJCXdoaWxlIChvbGRzdGFydHRpbWUgPT0gYm9vc3Rfc3RhcnR0aW1lICYmCisJCSAgICAgICAha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQlpZiAobXV0ZXhfdHJ5bG9jaygmYm9vc3RfbXV0ZXgpKSB7CisJCQkJYm9vc3Rfc3RhcnR0aW1lID0gamlmZmllcyArCisJCQkJCQkgIHRlc3RfYm9vc3RfaW50ZXJ2YWwgKiBIWjsKKwkJCQluX3JjdV90b3J0dXJlX2Jvb3N0cysrOworCQkJCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KKworCQkvKiBHbyBkbyB0aGUgc3R1dHRlci4gKi8KK2NoZWNrd2FpdDoJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9ib29zdCIpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKworCS8qIENsZWFuIHVwIGFuZCBleGl0LiAqLworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IHJiaS5pbmZsaWdodCkgeworCQl0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfYm9vc3QiKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJfQorCXNtcF9tYigpOyAvKiBvcmRlciBhY2Nlc3NlcyB0byAtPmluZmxpZ2h0IGJlZm9yZSBzdGFjay1mcmFtZSBkZWF0aC4gKi8KKwlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyYmkucmN1KTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSQ1UgdG9ydHVyZSBmb3JjZS1xdWllc2NlbnQtc3RhdGUga3RocmVhZC4gIFJlcGVhdGVkbHkgaW5kdWNlcworICogYnVyc3RzIG9mIGNhbGxzIHRvIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpLCBpbmNyZWFzaW5nIHRoZSBwcm9iYWJpbGl0eQorICogb2Ygb2NjdXJyZW5jZSBvZiBzb21lIGltcG9ydGFudCB0eXBlcyBvZiByYWNlIGNvbmRpdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX2Zxcyh2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBmcXNfcmVzdW1lX3RpbWU7CisJaW50IGZxc19idXJzdF9yZW1haW5pbmc7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2ZxcyB0YXNrIHN0YXJ0ZWQiKTsKKwlkbyB7CisJCWZxc19yZXN1bWVfdGltZSA9IGppZmZpZXMgKyBmcXNfc3R1dHRlciAqIEhaOworCQl3aGlsZSAoVUxPTkdfQ01QX0xUKGppZmZpZXMsIGZxc19yZXN1bWVfdGltZSkgJiYKKwkJICAgICAgICFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwkJfQorCQlmcXNfYnVyc3RfcmVtYWluaW5nID0gZnFzX2R1cmF0aW9uOworCQl3aGlsZSAoZnFzX2J1cnN0X3JlbWFpbmluZyA+IDAgJiYKKwkJICAgICAgICFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCWN1cl9vcHMtPmZxcygpOworCQkJdWRlbGF5KGZxc19ob2xkb2ZmKTsKKwkJCWZxc19idXJzdF9yZW1haW5pbmcgLT0gZnFzX2hvbGRvZmY7CisJCX0KKwkJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mcXMiKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJyY3VfdG9ydHVyZV9mcXMiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJDVSB0b3J0dXJlIHdyaXRlciBrdGhyZWFkLiAgUmVwZWF0ZWRseSBzdWJzdGl0dXRlcyBhIG5ldyBzdHJ1Y3R1cmUKKyAqIGZvciB0aGF0IHBvaW50ZWQgdG8gYnkgcmN1X3RvcnR1cmVfY3VycmVudCwgZnJlZWluZyB0aGUgb2xkIHN0cnVjdHVyZQorICogYWZ0ZXIgYSBzZXJpZXMgb2YgZ3JhY2UgcGVyaW9kcyAodGhlICJwaXBlbGluZSIpLgorICovCitzdGF0aWMgaW50CityY3VfdG9ydHVyZV93cml0ZXIodm9pZCAqYXJnKQoreworCWJvb2wgZXhwOworCWludCBpOworCXN0cnVjdCByY3VfdG9ydHVyZSAqcnA7CisJc3RydWN0IHJjdV90b3J0dXJlICpycDE7CisJc3RydWN0IHJjdV90b3J0dXJlICpvbGRfcnA7CisJc3RhdGljIERFRklORV9UT1JUVVJFX1JBTkRPTShyYW5kKTsKKworCVZFUkJPU0VfVE9ST1VUX1NUUklORygicmN1X3RvcnR1cmVfd3JpdGVyIHRhc2sgc3RhcnRlZCIpOworCXNldF91c2VyX25pY2UoY3VycmVudCwgTUFYX05JQ0UpOworCisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJcnAgPSByY3VfdG9ydHVyZV9hbGxvYygpOworCQlpZiAocnAgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlycC0+cnRvcnRfcGlwZV9jb3VudCA9IDA7CisJCXVkZWxheSh0b3J0dXJlX3JhbmRvbSgmcmFuZCkgJiAweDNmZik7CisJCW9sZF9ycCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhyY3VfdG9ydHVyZV9jdXJyZW50LAorCQkJCQkgICAgICAgY3VycmVudCA9PSB3cml0ZXJfdGFzayk7CisJCXJwLT5ydG9ydF9tYnRlc3QgPSAxOworCQlyY3VfYXNzaWduX3BvaW50ZXIocmN1X3RvcnR1cmVfY3VycmVudCwgcnApOworCQlzbXBfd21iKCk7IC8qIE1vZHMgdG8gb2xkX3JwIG11c3QgZm9sbG93IHJjdV9hc3NpZ25fcG9pbnRlcigpICovCisJCWlmIChvbGRfcnApIHsKKwkJCWkgPSBvbGRfcnAtPnJ0b3J0X3BpcGVfY291bnQ7CisJCQlpZiAoaSA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKQorCQkJCWkgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKKwkJCWF0b21pY19pbmMoJnJjdV90b3J0dXJlX3djb3VudFtpXSk7CisJCQlvbGRfcnAtPnJ0b3J0X3BpcGVfY291bnQrKzsKKwkJCWlmIChncF9ub3JtYWwgPT0gZ3BfZXhwKQorCQkJCWV4cCA9ICEhKHRvcnR1cmVfcmFuZG9tKCZyYW5kKSAmIDB4ODApOworCQkJZWxzZQorCQkJCWV4cCA9IGdwX2V4cDsKKwkJCWlmICghZXhwKSB7CisJCQkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShvbGRfcnApOworCQkJfSBlbHNlIHsKKwkJCQljdXJfb3BzLT5leHBfc3luYygpOworCQkJCWxpc3RfYWRkKCZvbGRfcnAtPnJ0b3J0X2ZyZWUsCisJCQkJCSAmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJwLCBycDEsCisJCQkJCQkJICZyY3VfdG9ydHVyZV9yZW1vdmVkLAorCQkJCQkJCSBydG9ydF9mcmVlKSB7CisJCQkJCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKKwkJCQkJaWYgKGkgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikKKwkJCQkJCWkgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKKwkJCQkJYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKKwkJCQkJaWYgKCsrcnAtPnJ0b3J0X3BpcGVfY291bnQgPj0KKwkJCQkJICAgIFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CisJCQkJCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKKwkJCQkJCWxpc3RfZGVsKCZycC0+cnRvcnRfZnJlZSk7CisJCQkJCQlyY3VfdG9ydHVyZV9mcmVlKHJwKTsKKwkJCQkJfQorCQkJCSB9CisJCQl9CisJCX0KKwkJcmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3MoKytyY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb24pOworCQlzdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX3dyaXRlciIpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX3dyaXRlciIpOworCXJldHVybiAwOworfQorCisvKgorICogUkNVIHRvcnR1cmUgZmFrZSB3cml0ZXIga3RocmVhZC4gIFJlcGVhdGVkbHkgY2FsbHMgc3luYywgd2l0aCBhIHJhbmRvbQorICogZGVsYXkgYmV0d2VlbiBjYWxscy4KKyAqLworc3RhdGljIGludAorcmN1X3RvcnR1cmVfZmFrZXdyaXRlcih2b2lkICphcmcpCit7CisJREVGSU5FX1RPUlRVUkVfUkFORE9NKHJhbmQpOworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RhcnRlZCIpOworCXNldF91c2VyX25pY2UoY3VycmVudCwgTUFYX05JQ0UpOworCisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxICsgdG9ydHVyZV9yYW5kb20oJnJhbmQpJTEwKTsKKwkJdWRlbGF5KHRvcnR1cmVfcmFuZG9tKCZyYW5kKSAmIDB4M2ZmKTsKKwkJaWYgKGN1cl9vcHMtPmNiX2JhcnJpZXIgIT0gTlVMTCAmJgorCQkgICAgdG9ydHVyZV9yYW5kb20oJnJhbmQpICUgKG5mYWtld3JpdGVycyAqIDgpID09IDApIHsKKwkJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKKwkJfSBlbHNlIGlmIChncF9ub3JtYWwgPT0gZ3BfZXhwKSB7CisJCQlpZiAodG9ydHVyZV9yYW5kb20oJnJhbmQpICYgMHg4MCkKKwkJCQljdXJfb3BzLT5zeW5jKCk7CisJCQllbHNlCisJCQkJY3VyX29wcy0+ZXhwX3N5bmMoKTsKKwkJfSBlbHNlIGlmIChncF9ub3JtYWwpIHsKKwkJCWN1cl9vcHMtPnN5bmMoKTsKKwkJfSBlbHNlIHsKKwkJCWN1cl9vcHMtPmV4cF9zeW5jKCk7CisJCX0KKwkJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmN1dG9ydHVyZV90cmFjZV9kdW1wKHZvaWQpCit7CisJc3RhdGljIGF0b21pY190IGJlZW5oZXJlID0gQVRPTUlDX0lOSVQoMCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmJlZW5oZXJlKSkKKwkJcmV0dXJuOworCWlmIChhdG9taWNfeGNoZygmYmVlbmhlcmUsIDEpICE9IDApCisJCXJldHVybjsKKwlmdHJhY2VfZHVtcChEVU1QX0FMTCk7Cit9CisKKy8qCisgKiBSQ1UgdG9ydHVyZSByZWFkZXIgZnJvbSB0aW1lciBoYW5kbGVyLiAgRGVyZWZlcmVuY2VzIHJjdV90b3J0dXJlX2N1cnJlbnQsCisgKiBpbmNyZW1lbnRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgcGlwZWxpbmUgYXJyYXkuICBUaGUKKyAqIGNvdW50ZXIgaW4gdGhlIGVsZW1lbnQgc2hvdWxkIG5ldmVyIGJlIGdyZWF0ZXIgdGhhbiAxLCBvdGhlcndpc2UsIHRoZQorICogUkNVIGltcGxlbWVudGF0aW9uIGlzIGJyb2tlbi4KKyAqLworc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfdGltZXIodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJaW50IGlkeDsKKwlpbnQgY29tcGxldGVkOworCWludCBjb21wbGV0ZWRfZW5kOworCXN0YXRpYyBERUZJTkVfVE9SVFVSRV9SQU5ET00ocmFuZCk7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhyYW5kX2xvY2spOworCXN0cnVjdCByY3VfdG9ydHVyZSAqcDsKKwlpbnQgcGlwZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdHM7CisKKwlpZHggPSBjdXJfb3BzLT5yZWFkbG9jaygpOworCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOworCXRzID0gcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKCk7CisJcCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhyY3VfdG9ydHVyZV9jdXJyZW50LAorCQkJCSAgcmN1X3JlYWRfbG9ja19iaF9oZWxkKCkgfHwKKwkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8CisJCQkJICBzcmN1X3JlYWRfbG9ja19oZWxkKCZzcmN1X2N0bCkpOworCWlmIChwID09IE5VTEwpIHsKKwkJLyogTGVhdmUgYmVjYXVzZSByY3VfdG9ydHVyZV93cml0ZXIgaXMgbm90IHlldCB1bmRlcndheSAqLworCQljdXJfb3BzLT5yZWFkdW5sb2NrKGlkeCk7CisJCXJldHVybjsKKwl9CisJaWYgKHAtPnJ0b3J0X21idGVzdCA9PSAwKQorCQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpOworCXNwaW5fbG9jaygmcmFuZF9sb2NrKTsKKwljdXJfb3BzLT5yZWFkX2RlbGF5KCZyYW5kKTsKKwluX3JjdV90b3J0dXJlX3RpbWVycysrOworCXNwaW5fdW5sb2NrKCZyYW5kX2xvY2spOworCXByZWVtcHRfZGlzYWJsZSgpOworCXBpcGVfY291bnQgPSBwLT5ydG9ydF9waXBlX2NvdW50OworCWlmIChwaXBlX2NvdW50ID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pIHsKKwkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dC4uLiAqLworCQlwaXBlX2NvdW50ID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJfQorCWNvbXBsZXRlZF9lbmQgPSBjdXJfb3BzLT5jb21wbGV0ZWQoKTsKKwlpZiAocGlwZV9jb3VudCA+IDEpIHsKKwkJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAmcC0+cnRvcnRfcmN1LCB0cywKKwkJCQkJICBjb21wbGV0ZWQsIGNvbXBsZXRlZF9lbmQpOworCQlyY3V0b3J0dXJlX3RyYWNlX2R1bXAoKTsKKwl9CisJX190aGlzX2NwdV9pbmMocmN1X3RvcnR1cmVfY291bnRbcGlwZV9jb3VudF0pOworCWNvbXBsZXRlZCA9IGNvbXBsZXRlZF9lbmQgLSBjb21wbGV0ZWQ7CisJaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CisJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KKwkJY29tcGxldGVkID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJfQorCV9fdGhpc19jcHVfaW5jKHJjdV90b3J0dXJlX2JhdGNoW2NvbXBsZXRlZF0pOworCXByZWVtcHRfZW5hYmxlKCk7CisJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOworfQorCisvKgorICogUkNVIHRvcnR1cmUgcmVhZGVyIGt0aHJlYWQuICBSZXBlYXRlZGx5IGRlcmVmZXJlbmNlcyByY3VfdG9ydHVyZV9jdXJyZW50LAorICogaW5jcmVtZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBpcGVsaW5lIGFycmF5LiAgVGhlCisgKiBjb3VudGVyIGluIHRoZSBlbGVtZW50IHNob3VsZCBuZXZlciBiZSBncmVhdGVyIHRoYW4gMSwgb3RoZXJ3aXNlLCB0aGUKKyAqIFJDVSBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4uCisgKi8KK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX3JlYWRlcih2b2lkICphcmcpCit7CisJaW50IGNvbXBsZXRlZDsKKwlpbnQgY29tcGxldGVkX2VuZDsKKwlpbnQgaWR4OworCURFRklORV9UT1JUVVJFX1JBTkRPTShyYW5kKTsKKwlzdHJ1Y3QgcmN1X3RvcnR1cmUgKnA7CisJaW50IHBpcGVfY291bnQ7CisJc3RydWN0IHRpbWVyX2xpc3QgdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdHM7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0YXJ0ZWQiKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIE1BWF9OSUNFKTsKKwlpZiAoaXJxcmVhZGVyICYmIGN1cl9vcHMtPmlycV9jYXBhYmxlKQorCQlzZXR1cF90aW1lcl9vbl9zdGFjaygmdCwgcmN1X3RvcnR1cmVfdGltZXIsIDApOworCisJZG8geworCQlpZiAoaXJxcmVhZGVyICYmIGN1cl9vcHMtPmlycV9jYXBhYmxlKSB7CisJCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnQpKQorCQkJCW1vZF90aW1lcigmdCwgamlmZmllcyArIDEpOworCQl9CisJCWlkeCA9IGN1cl9vcHMtPnJlYWRsb2NrKCk7CisJCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOworCQl0cyA9IHJjdV90cmFjZV9jbG9ja19sb2NhbCgpOworCQlwID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHJjdV90b3J0dXJlX2N1cnJlbnQsCisJCQkJCSAgcmN1X3JlYWRfbG9ja19iaF9oZWxkKCkgfHwKKwkJCQkJICByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQoKSB8fAorCQkJCQkgIHNyY3VfcmVhZF9sb2NrX2hlbGQoJnNyY3VfY3RsKSk7CisJCWlmIChwID09IE5VTEwpIHsKKwkJCS8qIFdhaXQgZm9yIHJjdV90b3J0dXJlX3dyaXRlciB0byBnZXQgdW5kZXJ3YXkgKi8KKwkJCWN1cl9vcHMtPnJlYWR1bmxvY2soaWR4KTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocC0+cnRvcnRfbWJ0ZXN0ID09IDApCisJCQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpOworCQljdXJfb3BzLT5yZWFkX2RlbGF5KCZyYW5kKTsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCXBpcGVfY291bnQgPSBwLT5ydG9ydF9waXBlX2NvdW50OworCQlpZiAocGlwZV9jb3VudCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CisJCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYnV0Li4uICovCisJCQlwaXBlX2NvdW50ID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJCX0KKwkJY29tcGxldGVkX2VuZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOworCQlpZiAocGlwZV9jb3VudCA+IDEpIHsKKwkJCWRvX3RyYWNlX3JjdV90b3J0dXJlX3JlYWQoY3VyX29wcy0+bmFtZSwgJnAtPnJ0b3J0X3JjdSwKKwkJCQkJCSAgdHMsIGNvbXBsZXRlZCwgY29tcGxldGVkX2VuZCk7CisJCQlyY3V0b3J0dXJlX3RyYWNlX2R1bXAoKTsKKwkJfQorCQlfX3RoaXNfY3B1X2luYyhyY3VfdG9ydHVyZV9jb3VudFtwaXBlX2NvdW50XSk7CisJCWNvbXBsZXRlZCA9IGNvbXBsZXRlZF9lbmQgLSBjb21wbGV0ZWQ7CisJCWlmIChjb21wbGV0ZWQgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikgeworCQkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dC4uLiAqLworCQkJY29tcGxldGVkID0gUkNVX1RPUlRVUkVfUElQRV9MRU47CisJCX0KKwkJX190aGlzX2NwdV9pbmMocmN1X3RvcnR1cmVfYmF0Y2hbY29tcGxldGVkXSk7CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCWN1cl9vcHMtPnJlYWR1bmxvY2soaWR4KTsKKwkJc2NoZWR1bGUoKTsKKwkJc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9yZWFkZXIiKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJaWYgKGlycXJlYWRlciAmJiBjdXJfb3BzLT5pcnFfY2FwYWJsZSkKKwkJZGVsX3RpbWVyX3N5bmMoJnQpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygicmN1X3RvcnR1cmVfcmVhZGVyIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gUkNVLXRvcnR1cmUgc3RhdGlzdGljcyBtZXNzYWdlIGluIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZAorcmN1X3RvcnR1cmVfcHJpbnRrKGNoYXIgKnBhZ2UpCit7CisJaW50IGNwdTsKKwlpbnQgaTsKKwlsb25nIHBpcGVzdW1tYXJ5W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0gPSB7IDAgfTsKKwlsb25nIGJhdGNoc3VtbWFyeVtSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDFdID0geyAwIH07CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykgeworCQkJcGlwZXN1bW1hcnlbaV0gKz0gcGVyX2NwdShyY3VfdG9ydHVyZV9jb3VudCwgY3B1KVtpXTsKKwkJCWJhdGNoc3VtbWFyeVtpXSArPSBwZXJfY3B1KHJjdV90b3J0dXJlX2JhdGNoLCBjcHUpW2ldOworCQl9CisJfQorCWZvciAoaSA9IFJDVV9UT1JUVVJFX1BJUEVfTEVOIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHBpcGVzdW1tYXJ5W2ldICE9IDApCisJCQlicmVhazsKKwl9CisJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwKKwkJICAgICAgICJydGM6ICVwIHZlcjogJWx1IHRmbGU6ICVkIHJ0YTogJWQgcnRhZjogJWQgcnRmOiAlZCAiLAorCQkgICAgICAgcmN1X3RvcnR1cmVfY3VycmVudCwKKwkJICAgICAgIHJjdV90b3J0dXJlX2N1cnJlbnRfdmVyc2lvbiwKKwkJICAgICAgIGxpc3RfZW1wdHkoJnJjdV90b3J0dXJlX2ZyZWVsaXN0KSwKKwkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jKSwKKwkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwpLAorCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfZnJlZSkpOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAicnRtYmU6ICVkIHJ0YmtlOiAlbGQgcnRicmU6ICVsZCAiLAorCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvciksCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yLAorCQkgICAgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgInJ0YmY6ICVsZCBydGI6ICVsZCBudDogJWxkICIsCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUsCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0cywKKwkJICAgICAgIG5fcmN1X3RvcnR1cmVfdGltZXJzKTsKKwlwYWdlID0gdG9ydHVyZV9vbm9mZl9zdGF0cyhwYWdlKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgImJhcnJpZXI6ICVsZC8lbGQ6JWxkIiwKKwkJICAgICAgIG5fYmFycmllcl9zdWNjZXNzZXMsCisJCSAgICAgICBuX2JhcnJpZXJfYXR0ZW1wdHMsCisJCSAgICAgICBuX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IpOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4lcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlpZiAoYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvcikgIT0gMCB8fAorCSAgICBuX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IgIT0gMCB8fAorCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yICE9IDAgfHwKKwkgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yICE9IDAgfHwKKwkgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlICE9IDAgfHwKKwkgICAgaSA+IDEpIHsKKwkJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIhISEgIik7CisJCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfZXJyb3IpOworCQlXQVJOX09OX09OQ0UoMSk7CisJfQorCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiUmVhZGVyIFBpcGU6ICIpOworCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykKKwkJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIgJWxkIiwgcGlwZXN1bW1hcnlbaV0pOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4lcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgIlJlYWRlciBCYXRjaDogIik7CisJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQorCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlbGQiLCBiYXRjaHN1bW1hcnlbaV0pOworCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4lcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKKwlwYWdlICs9IHNwcmludGYocGFnZSwgIkZyZWUtQmxvY2sgQ2lyY3VsYXRpb246ICIpOworCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykgeworCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlZCIsCisJCQkgICAgICAgYXRvbWljX3JlYWQoJnJjdV90b3J0dXJlX3djb3VudFtpXSkpOworCX0KKwlwYWdlICs9IHNwcmludGYocGFnZSwgIlxuIik7CisJaWYgKGN1cl9vcHMtPnN0YXRzKQorCQljdXJfb3BzLT5zdGF0cyhwYWdlKTsKK30KKworLyoKKyAqIFByaW50IHRvcnR1cmUgc3RhdGlzdGljcy4gIENhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZXJlIGlzIG9ubHkKKyAqIG9uZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gYXQgYSBnaXZlbiB0aW1lISEhICBUaGlzIGlzIG5vcm1hbGx5CisgKiBhY2NvbXBsaXNoZWQgYnkgcmVseWluZyBvbiB0aGUgbW9kdWxlIHN5c3RlbSB0byBvbmx5IGhhdmUgb25lIGNvcHkKKyAqIG9mIHRoZSBtb2R1bGUgbG9hZGVkLCBhbmQgdGhlbiBieSBnaXZpbmcgdGhlIHJjdV90b3J0dXJlX3N0YXRzCisgKiBrdGhyZWFkIGZ1bGwgY29udHJvbCAob3IgdGhlIGluaXQvY2xlYW51cCBmdW5jdGlvbnMgd2hlbiByY3VfdG9ydHVyZV9zdGF0cworICogdGhyZWFkIGlzIG5vdCBydW5uaW5nKS4KKyAqLworc3RhdGljIHZvaWQKK3JjdV90b3J0dXJlX3N0YXRzX3ByaW50KHZvaWQpCit7CisJaW50IHNpemUgPSBucl9jcHVfaWRzICogMjAwICsgODE5MjsKKwljaGFyICpidWY7CisKKwlidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXByX2VycigicmN1LXRvcnR1cmU6IE91dCBvZiBtZW1vcnksIG5lZWQ6ICVkIiwgc2l6ZSk7CisJCXJldHVybjsKKwl9CisJcmN1X3RvcnR1cmVfcHJpbnRrKGJ1Zik7CisJcHJfYWxlcnQoIiVzIiwgYnVmKTsKKwlrZnJlZShidWYpOworfQorCisvKgorICogUGVyaW9kaWNhbGx5IHByaW50cyB0b3J0dXJlIHN0YXRpc3RpY3MsIGlmIHBlcmlvZGljIHN0YXRpc3RpY3MgcHJpbnRpbmcKKyAqIHdhcyBzcGVjaWZpZWQgdmlhIHRoZSBzdGF0X2ludGVydmFsIG1vZHVsZSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX3N0YXRzKHZvaWQgKmFyZykKK3sKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX3N0YXRzIHRhc2sgc3RhcnRlZCIpOworCWRvIHsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YXRfaW50ZXJ2YWwgKiBIWik7CisJCXJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zdGF0cyIpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX3N0YXRzIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgKmN1cl9vcHMsIGNvbnN0IGNoYXIgKnRhZykKK3sKKwlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkgIi0tLSAlczogbnJlYWRlcnM9JWQgbmZha2V3cml0ZXJzPSVkICIKKwkJICJzdGF0X2ludGVydmFsPSVkIHZlcmJvc2U9JWQgdGVzdF9ub19pZGxlX2h6PSVkICIKKwkJICJzaHVmZmxlX2ludGVydmFsPSVkIHN0dXR0ZXI9JWQgaXJxcmVhZGVyPSVkICIKKwkJICJmcXNfZHVyYXRpb249JWQgZnFzX2hvbGRvZmY9JWQgZnFzX3N0dXR0ZXI9JWQgIgorCQkgInRlc3RfYm9vc3Q9JWQvJWQgdGVzdF9ib29zdF9pbnRlcnZhbD0lZCAiCisJCSAidGVzdF9ib29zdF9kdXJhdGlvbj0lZCBzaHV0ZG93bl9zZWNzPSVkICIKKwkJICJzdGFsbF9jcHU9JWQgc3RhbGxfY3B1X2hvbGRvZmY9JWQgIgorCQkgIm5fYmFycmllcl9jYnM9JWQgIgorCQkgIm9ub2ZmX2ludGVydmFsPSVkIG9ub2ZmX2hvbGRvZmY9JWRcbiIsCisJCSB0b3J0dXJlX3R5cGUsIHRhZywgbnJlYWxyZWFkZXJzLCBuZmFrZXdyaXRlcnMsCisJCSBzdGF0X2ludGVydmFsLCB2ZXJib3NlLCB0ZXN0X25vX2lkbGVfaHosIHNodWZmbGVfaW50ZXJ2YWwsCisJCSBzdHV0dGVyLCBpcnFyZWFkZXIsIGZxc19kdXJhdGlvbiwgZnFzX2hvbGRvZmYsIGZxc19zdHV0dGVyLAorCQkgdGVzdF9ib29zdCwgY3VyX29wcy0+Y2FuX2Jvb3N0LAorCQkgdGVzdF9ib29zdF9pbnRlcnZhbCwgdGVzdF9ib29zdF9kdXJhdGlvbiwgc2h1dGRvd25fc2VjcywKKwkJIHN0YWxsX2NwdSwgc3RhbGxfY3B1X2hvbGRvZmYsCisJCSBuX2JhcnJpZXJfY2JzLAorCQkgb25vZmZfaW50ZXJ2YWwsIG9ub2ZmX2hvbGRvZmYpOworfQorCitzdGF0aWMgdm9pZCByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChpbnQgY3B1KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWlmIChib29zdF90YXNrc1tjcHVdID09IE5VTEwpCisJCXJldHVybjsKKwltdXRleF9sb2NrKCZib29zdF9tdXRleCk7CisJdCA9IGJvb3N0X3Rhc2tzW2NwdV07CisJYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZib29zdF9tdXRleCk7CisKKwkvKiBUaGlzIG11c3QgYmUgb3V0c2lkZSBvZiB0aGUgbXV0ZXgsIG90aGVyd2lzZSBkZWFkbG9jayEgKi8KKwl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9ib29zdCwgdCk7Cit9CisKK3N0YXRpYyBpbnQgcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaW50IGNwdSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGJvb3N0X3Rhc2tzW2NwdV0gIT0gTlVMTCkKKwkJcmV0dXJuIDA7ICAvKiBBbHJlYWR5IGNyZWF0ZWQsIG5vdGhpbmcgbW9yZSB0byBkby4gKi8KKworCS8qIERvbid0IGFsbG93IHRpbWUgcmVjYWxjdWxhdGlvbiB3aGlsZSBjcmVhdGluZyBhIG5ldyB0YXNrLiAqLworCW11dGV4X2xvY2soJmJvb3N0X211dGV4KTsKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoIkNyZWF0aW5nIHJjdV90b3J0dXJlX2Jvb3N0IHRhc2siKTsKKwlib29zdF90YXNrc1tjcHVdID0ga3RocmVhZF9jcmVhdGVfb25fbm9kZShyY3VfdG9ydHVyZV9ib29zdCwgTlVMTCwKKwkJCQkJCSAgY3B1X3RvX25vZGUoY3B1KSwKKwkJCQkJCSAgInJjdV90b3J0dXJlX2Jvb3N0Iik7CisJaWYgKElTX0VSUihib29zdF90YXNrc1tjcHVdKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGJvb3N0X3Rhc2tzW2NwdV0pOworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IHRhc2sgY3JlYXRlIGZhaWxlZCIpOworCQluX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yKys7CisJCWJvb3N0X3Rhc2tzW2NwdV0gPSBOVUxMOworCQltdXRleF91bmxvY2soJmJvb3N0X211dGV4KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJa3RocmVhZF9iaW5kKGJvb3N0X3Rhc2tzW2NwdV0sIGNwdSk7CisJd2FrZV91cF9wcm9jZXNzKGJvb3N0X3Rhc2tzW2NwdV0pOworCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgorICogQ1BVLXN0YWxsIGt0aHJlYWQuICBJdCB3YWl0cyBhcyBzcGVjaWZpZWQgYnkgc3RhbGxfY3B1X2hvbGRvZmYsIHRoZW4KKyAqIGluZHVjZXMgYSBDUFUgc3RhbGwgZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSBzdGFsbF9jcHUuCisgKi8KK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfc3RhbGwodm9pZCAqYXJncykKK3sKKwl1bnNpZ25lZCBsb25nIHN0b3BfYXQ7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX3N0YWxsIHRhc2sgc3RhcnRlZCIpOworCWlmIChzdGFsbF9jcHVfaG9sZG9mZiA+IDApIHsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9zdGFsbCBiZWdpbiBob2xkb2ZmIik7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzdGFsbF9jcHVfaG9sZG9mZiAqIEhaKTsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9zdGFsbCBlbmQgaG9sZG9mZiIpOworCX0KKwlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzdG9wX2F0ID0gZ2V0X3NlY29uZHMoKSArIHN0YWxsX2NwdTsKKwkJLyogUkNVIENQVSBzdGFsbCBpcyBleHBlY3RlZCBiZWhhdmlvciBpbiBmb2xsb3dpbmcgY29kZS4gKi8KKwkJcHJfYWxlcnQoInJjdV90b3J0dXJlX3N0YWxsIHN0YXJ0LlxuIik7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCXdoaWxlIChVTE9OR19DTVBfTFQoZ2V0X3NlY29uZHMoKSwgc3RvcF9hdCkpCisJCQljb250aW51ZTsgIC8qIEluZHVjZSBSQ1UgQ1BVIHN0YWxsIHdhcm5pbmcuICovCisJCXByZWVtcHRfZW5hYmxlKCk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlwcl9hbGVydCgicmN1X3RvcnR1cmVfc3RhbGwgZW5kLlxuIik7CisJfQorCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zdGFsbCIpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMTAgKiBIWik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNwYXduIENQVS1zdGFsbCBrdGhyZWFkLCBpZiBzdGFsbF9jcHUgc3BlY2lmaWVkLiAqLworc3RhdGljIGludCBfX2luaXQgcmN1X3RvcnR1cmVfc3RhbGxfaW5pdCh2b2lkKQoreworCWlmIChzdGFsbF9jcHUgPD0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfc3RhbGwsIE5VTEwsIHN0YWxsX3Rhc2spOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgUkNVIGJhcnJpZXIgdGVzdGluZy4gKi8KK3ZvaWQgcmN1X3RvcnR1cmVfYmFycmllcl9jYmYoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJYXRvbWljX2luYygmYmFycmllcl9jYnNfaW52b2tlZCk7Cit9CisKKy8qIGt0aHJlYWQgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHVzZWQgdG8gdGVzdCBSQ1UgYmFycmllcnMuICovCitzdGF0aWMgaW50IHJjdV90b3J0dXJlX2JhcnJpZXJfY2JzKHZvaWQgKmFyZykKK3sKKwlsb25nIG15aWQgPSAobG9uZylhcmc7CisJYm9vbCBsYXN0cGhhc2UgPSAwOworCWJvb2wgbmV3cGhhc2U7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKworCWluaXRfcmN1X2hlYWRfb25fc3RhY2soJnJjdSk7CisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJyY3VfdG9ydHVyZV9iYXJyaWVyX2NicyB0YXNrIHN0YXJ0ZWQiKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIE1BWF9OSUNFKTsKKwlkbyB7CisJCXdhaXRfZXZlbnQoYmFycmllcl9jYnNfd3FbbXlpZF0sCisJCQkgICAobmV3cGhhc2UgPQorCQkJICAgIEFDQ0VTU19PTkNFKGJhcnJpZXJfcGhhc2UpKSAhPSBsYXN0cGhhc2UgfHwKKwkJCSAgIHRvcnR1cmVfbXVzdF9zdG9wKCkpOworCQlsYXN0cGhhc2UgPSBuZXdwaGFzZTsKKwkJc21wX21iKCk7IC8qIGVuc3VyZSBiYXJyaWVyX3BoYXNlIGxvYWQgYmVmb3JlIC0+Y2FsbCgpLiAqLworCQlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCWJyZWFrOworCQljdXJfb3BzLT5jYWxsKCZyY3UsIHJjdV90b3J0dXJlX2JhcnJpZXJfY2JmKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJhcnJpZXJfY2JzX2NvdW50KSkKKwkJCXdha2VfdXAoJmJhcnJpZXJfd3EpOworCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKwljdXJfb3BzLT5jYl9iYXJyaWVyKCk7CisJZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjaygmcmN1KTsKKwl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInJjdV90b3J0dXJlX2JhcnJpZXJfY2JzIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGt0aHJlYWQgZnVuY3Rpb24gdG8gZHJpdmUgYW5kIGNvb3JkaW5hdGUgUkNVIGJhcnJpZXIgdGVzdGluZy4gKi8KK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfYmFycmllcih2b2lkICphcmcpCit7CisJaW50IGk7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXIgdGFzayBzdGFydGluZyIpOworCWRvIHsKKwkJYXRvbWljX3NldCgmYmFycmllcl9jYnNfaW52b2tlZCwgMCk7CisJCWF0b21pY19zZXQoJmJhcnJpZXJfY2JzX2NvdW50LCBuX2JhcnJpZXJfY2JzKTsKKwkJc21wX21iKCk7IC8qIEVuc3VyZSBiYXJyaWVyX3BoYXNlIGFmdGVyIHByaW9yIGFzc2lnbm1lbnRzLiAqLworCQliYXJyaWVyX3BoYXNlID0gIWJhcnJpZXJfcGhhc2U7CisJCWZvciAoaSA9IDA7IGkgPCBuX2JhcnJpZXJfY2JzOyBpKyspCisJCQl3YWtlX3VwKCZiYXJyaWVyX2Nic193cVtpXSk7CisJCXdhaXRfZXZlbnQoYmFycmllcl93cSwKKwkJCSAgIGF0b21pY19yZWFkKCZiYXJyaWVyX2Nic19jb3VudCkgPT0gMCB8fAorCQkJICAgdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJCWlmICh0b3J0dXJlX211c3Rfc3RvcCgpKQorCQkJYnJlYWs7CisJCW5fYmFycmllcl9hdHRlbXB0cysrOworCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7IC8qIEltcGxpZXMgc21wX21iKCkgZm9yIHdhaXRfZXZlbnQoKS4gKi8KKwkJaWYgKGF0b21pY19yZWFkKCZiYXJyaWVyX2Nic19pbnZva2VkKSAhPSBuX2JhcnJpZXJfY2JzKSB7CisJCQluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IrKzsKKwkJCVdBUk5fT05fT05DRSgxKTsKKwkJfQorCQluX2JhcnJpZXJfc3VjY2Vzc2VzKys7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWiAvIDEwKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJyY3VfdG9ydHVyZV9iYXJyaWVyIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgUkNVIGJhcnJpZXIgdGVzdGluZy4gKi8KK3N0YXRpYyBpbnQgcmN1X3RvcnR1cmVfYmFycmllcl9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmIChuX2JhcnJpZXJfY2JzID09IDApCisJCXJldHVybiAwOworCWlmIChjdXJfb3BzLT5jYWxsID09IE5VTEwgfHwgY3VyX29wcy0+Y2JfYmFycmllciA9PSBOVUxMKSB7CisJCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCisJCQkgIiBDYWxsIG9yIGJhcnJpZXIgb3BzIG1pc3NpbmcgZm9yICVzLFxuIiwKKwkJCSB0b3J0dXJlX3R5cGUsIGN1cl9vcHMtPm5hbWUpOworCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJICIgUkNVIGJhcnJpZXIgdGVzdGluZyBvbWl0dGVkIGZyb20gcnVuLlxuIiwKKwkJCSB0b3J0dXJlX3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisJYXRvbWljX3NldCgmYmFycmllcl9jYnNfY291bnQsIDApOworCWF0b21pY19zZXQoJmJhcnJpZXJfY2JzX2ludm9rZWQsIDApOworCWJhcnJpZXJfY2JzX3Rhc2tzID0KKwkJa3phbGxvYyhuX2JhcnJpZXJfY2JzICogc2l6ZW9mKGJhcnJpZXJfY2JzX3Rhc2tzWzBdKSwKKwkJCUdGUF9LRVJORUwpOworCWJhcnJpZXJfY2JzX3dxID0KKwkJa3phbGxvYyhuX2JhcnJpZXJfY2JzICogc2l6ZW9mKGJhcnJpZXJfY2JzX3dxWzBdKSwKKwkJCUdGUF9LRVJORUwpOworCWlmIChiYXJyaWVyX2Nic190YXNrcyA9PSBOVUxMIHx8ICFiYXJyaWVyX2Nic193cSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IG5fYmFycmllcl9jYnM7IGkrKykgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiYXJyaWVyX2Nic193cVtpXSk7CisJCXJldCA9IHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfYmFycmllcl9jYnMsCisJCQkJCSAgICAgKHZvaWQgKikobG9uZylpLAorCQkJCQkgICAgIGJhcnJpZXJfY2JzX3Rhc2tzW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHJjdV90b3J0dXJlX2JhcnJpZXIsIE5VTEwsIGJhcnJpZXJfdGFzayk7Cit9CisKKy8qIENsZWFuIHVwIGFmdGVyIFJDVSBiYXJyaWVyIHRlc3RpbmcuICovCitzdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9iYXJyaWVyX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX2JhcnJpZXIsIGJhcnJpZXJfdGFzayk7CisJaWYgKGJhcnJpZXJfY2JzX3Rhc2tzICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5fYmFycmllcl9jYnM7IGkrKykKKwkJCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX2JhcnJpZXJfY2JzLAorCQkJCQkgICAgIGJhcnJpZXJfY2JzX3Rhc2tzW2ldKTsKKwkJa2ZyZWUoYmFycmllcl9jYnNfdGFza3MpOworCQliYXJyaWVyX2Nic190YXNrcyA9IE5VTEw7CisJfQorCWlmIChiYXJyaWVyX2Nic193cSAhPSBOVUxMKSB7CisJCWtmcmVlKGJhcnJpZXJfY2JzX3dxKTsKKwkJYmFycmllcl9jYnNfd3EgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCByY3V0b3J0dXJlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwlsb25nIGNwdSA9IChsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJKHZvaWQpcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCQlyY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChjcHUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByY3V0b3J0dXJlX2NwdV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHJjdXRvcnR1cmVfY3B1X25vdGlmeSwKK307CisKK3N0YXRpYyB2b2lkCityY3VfdG9ydHVyZV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlyY3V0b3J0dXJlX3JlY29yZF90ZXN0X3RyYW5zaXRpb24oKTsKKwlpZiAodG9ydHVyZV9jbGVhbnVwKCkpIHsKKwkJaWYgKGN1cl9vcHMtPmNiX2JhcnJpZXIgIT0gTlVMTCkKKwkJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKKwkJcmV0dXJuOworCX0KKworCXJjdV90b3J0dXJlX2JhcnJpZXJfY2xlYW51cCgpOworCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX3N0YWxsLCBzdGFsbF90YXNrKTsKKwl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV93cml0ZXIsIHdyaXRlcl90YXNrKTsKKworCWlmIChyZWFkZXJfdGFza3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKQorCQkJdG9ydHVyZV9zdG9wX2t0aHJlYWQocmN1X3RvcnR1cmVfcmVhZGVyLAorCQkJCQkgICAgIHJlYWRlcl90YXNrc1tpXSk7CisJCWtmcmVlKHJlYWRlcl90YXNrcyk7CisJfQorCXJjdV90b3J0dXJlX2N1cnJlbnQgPSBOVUxMOworCisJaWYgKGZha2V3cml0ZXJfdGFza3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKSB7CisJCQl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9mYWtld3JpdGVyLAorCQkJCQkgICAgIGZha2V3cml0ZXJfdGFza3NbaV0pOworCQl9CisJCWtmcmVlKGZha2V3cml0ZXJfdGFza3MpOworCQlmYWtld3JpdGVyX3Rhc2tzID0gTlVMTDsKKwl9CisKKwl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9zdGF0cywgc3RhdHNfdGFzayk7CisJdG9ydHVyZV9zdG9wX2t0aHJlYWQocmN1X3RvcnR1cmVfZnFzLCBmcXNfdGFzayk7CisJaWYgKCh0ZXN0X2Jvb3N0ID09IDEgJiYgY3VyX29wcy0+Y2FuX2Jvb3N0KSB8fAorCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKKwkJdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCQlyY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChpKTsKKwl9CisKKwkvKiBXYWl0IGZvciBhbGwgUkNVIGNhbGxiYWNrcyB0byBmaXJlLiAgKi8KKworCWlmIChjdXJfb3BzLT5jYl9iYXJyaWVyICE9IE5VTEwpCisJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKKworCXJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7ICAvKiAtQWZ0ZXItIHRoZSBzdGF0cyB0aHJlYWQgaXMgc3RvcHBlZCEgKi8KKworCWlmIChhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9lcnJvcikgfHwgbl9yY3VfdG9ydHVyZV9iYXJyaWVyX2Vycm9yKQorCQlyY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoY3VyX29wcywgIkVuZCBvZiB0ZXN0OiBGQUlMVVJFIik7CisJZWxzZSBpZiAodG9ydHVyZV9vbm9mZl9mYWlsdXJlcygpKQorCQlyY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoY3VyX29wcywKKwkJCQkJICAgICAgICJFbmQgb2YgdGVzdDogUkNVX0hPVFBMVUciKTsKKwllbHNlCisJCXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLCAiRW5kIG9mIHRlc3Q6IFNVQ0NFU1MiKTsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFECitzdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9sZWFrX2NiKHN0cnVjdCByY3VfaGVhZCAqcmhwKQoreworfQorCitzdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9lcnJfY2Ioc3RydWN0IHJjdV9oZWFkICpyaHApCit7CisJLyoKKwkgKiBUaGlzIC1taWdodC0gaGFwcGVuIGR1ZSB0byByYWNlIGNvbmRpdGlvbnMsIGJ1dCBpcyB1bmxpa2VseS4KKwkgKiBUaGUgc2NlbmFyaW8gdGhhdCBsZWFkcyB0byB0aGlzIGhhcHBlbmluZyBpcyB0aGF0IHRoZQorCSAqIGZpcnN0IG9mIHRoZSBwYWlyIG9mIGR1cGxpY2F0ZSBjYWxsYmFja3MgaXMgcXVldWVkLAorCSAqIHNvbWVvbmUgZWxzZSBzdGFydHMgYSBncmFjZSBwZXJpb2QgdGhhdCBpbmNsdWRlcyB0aGF0CisJICogY2FsbGJhY2ssIHRoZW4gdGhlIHNlY29uZCBvZiB0aGUgcGFpciBtdXN0IHdhaXQgZm9yIHRoZQorCSAqIG5leHQgZ3JhY2UgcGVyaW9kLiAgVW5saWtlbHksIGJ1dCBjYW4gaGFwcGVuLiAgSWYgaXQKKwkgKiBkb2VzIGhhcHBlbiwgdGhlIGRlYnVnLW9iamVjdHMgc3Vic3lzdGVtIHdvbid0IGhhdmUgc3BsYXR0ZWQuCisJICovCisJcHJfYWxlcnQoInJjdXRvcnR1cmU6IGR1cGxpY2F0ZWQgY2FsbGJhY2sgd2FzIGludm9rZWQuXG4iKTsKK30KKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQgKi8KKworLyoKKyAqIFZlcmlmeSB0aGF0IGRvdWJsZS1mcmVlIGNhdXNlcyBkZWJ1Zy1vYmplY3RzIHRvIGNvbXBsYWluLCBidXQgb25seQorICogaWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9eS4gIE90aGVyd2lzZSwgc2F5IHRoYXQgdGhlIHRlc3QKKyAqIGNhbm5vdCBiZSBjYXJyaWVkIG91dC4KKyAqLworc3RhdGljIHZvaWQgcmN1X3Rlc3RfZGVidWdfb2JqZWN0cyh2b2lkKQoreworI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFECisJc3RydWN0IHJjdV9oZWFkIHJoMTsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmgyOworCisJaW5pdF9yY3VfaGVhZF9vbl9zdGFjaygmcmgxKTsKKwlpbml0X3JjdV9oZWFkX29uX3N0YWNrKCZyaDIpOworCXByX2FsZXJ0KCJyY3V0b3J0dXJlOiBXQVJOOiBEdXBsaWNhdGUgY2FsbF9yY3UoKSB0ZXN0IHN0YXJ0aW5nLlxuIik7CisKKwkvKiBUcnkgdG8gcXVldWUgdGhlIHJoMiBwYWlyIG9mIGNhbGxiYWNrcyBmb3IgdGhlIHNhbWUgZ3JhY2UgcGVyaW9kLiAqLworCXByZWVtcHRfZGlzYWJsZSgpOyAvKiBQcmV2ZW50IHByZWVtcHRpb24gZnJvbSBpbnRlcnJ1cHRpbmcgdGVzdC4gKi8KKwlyY3VfcmVhZF9sb2NrKCk7IC8qIE1ha2UgaXQgaW1wb3NzaWJsZSB0byBmaW5pc2ggYSBncmFjZSBwZXJpb2QuICovCisJY2FsbF9yY3UoJnJoMSwgcmN1X3RvcnR1cmVfbGVha19jYik7IC8qIFN0YXJ0IGdyYWNlIHBlcmlvZC4gKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOyAvKiBNYWtlIGl0IGhhcmRlciB0byBzdGFydCBhIG5ldyBncmFjZSBwZXJpb2QuICovCisJY2FsbF9yY3UoJnJoMiwgcmN1X3RvcnR1cmVfbGVha19jYik7CisJY2FsbF9yY3UoJnJoMiwgcmN1X3RvcnR1cmVfZXJyX2NiKTsgLyogRHVwbGljYXRlIGNhbGxiYWNrLiAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJLyogV2FpdCBmb3IgdGhlbSBhbGwgdG8gZ2V0IGRvbmUgc28gd2UgY2FuIHNhZmVseSByZXR1cm4uICovCisJcmN1X2JhcnJpZXIoKTsKKwlwcl9hbGVydCgicmN1dG9ydHVyZTogV0FSTjogRHVwbGljYXRlIGNhbGxfcmN1KCkgdGVzdCBjb21wbGV0ZS5cbiIpOworCWRlc3Ryb3lfcmN1X2hlYWRfb25fc3RhY2soJnJoMSk7CisJZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjaygmcmgyKTsKKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLworCXByX2FsZXJ0KCJyY3V0b3J0dXJlOiAhQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQsIG5vdCB0ZXN0aW5nIGR1cGxpY2F0ZSBjYWxsX3JjdSgpXG4iKTsKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQgKi8KK30KKworc3RhdGljIGludCBfX2luaXQKK3JjdV90b3J0dXJlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgY3B1OworCWludCBmaXJzdGVyciA9IDA7CisJc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgKnRvcnR1cmVfb3BzW10gPSB7CisJCSZyY3Vfb3BzLCAmcmN1X2JoX29wcywgJnJjdV9idXN0ZWRfb3BzLCAmc3JjdV9vcHMsICZzY2hlZF9vcHMsCisJfTsKKworCXRvcnR1cmVfaW5pdF9iZWdpbih0b3J0dXJlX3R5cGUsIHZlcmJvc2UsICZyY3V0b3J0dXJlX3J1bm5hYmxlKTsKKworCS8qIFByb2Nlc3MgYXJncyBhbmQgdGVsbCB0aGUgd29ybGQgdGhhdCB0aGUgdG9ydHVyZXIgaXMgb24gdGhlIGpvYi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b3J0dXJlX29wcyk7IGkrKykgeworCQljdXJfb3BzID0gdG9ydHVyZV9vcHNbaV07CisJCWlmIChzdHJjbXAodG9ydHVyZV90eXBlLCBjdXJfb3BzLT5uYW1lKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUodG9ydHVyZV9vcHMpKSB7CisJCXByX2FsZXJ0KCJyY3UtdG9ydHVyZTogaW52YWxpZCB0b3J0dXJlIHR5cGU6IFwiJXNcIlxuIiwKKwkJCSB0b3J0dXJlX3R5cGUpOworCQlwcl9hbGVydCgicmN1LXRvcnR1cmUgdHlwZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKTsgaSsrKQorCQkJcHJfYWxlcnQoIiAlcyIsIHRvcnR1cmVfb3BzW2ldLT5uYW1lKTsKKwkJcHJfYWxlcnQoIlxuIik7CisJCXRvcnR1cmVfaW5pdF9lbmQoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjdXJfb3BzLT5mcXMgPT0gTlVMTCAmJiBmcXNfZHVyYXRpb24gIT0gMCkgeworCQlwcl9hbGVydCgicmN1LXRvcnR1cmU6IC0+ZnFzIE5VTEwgYW5kIG5vbi16ZXJvIGZxc19kdXJhdGlvbiwgZnFzIGRpc2FibGVkLlxuIik7CisJCWZxc19kdXJhdGlvbiA9IDA7CisJfQorCWlmIChjdXJfb3BzLT5pbml0KQorCQljdXJfb3BzLT5pbml0KCk7IC8qIG5vICJnb3RvIHVud2luZCIgcHJpb3IgdG8gdGhpcyBwb2ludCEhISAqLworCisJaWYgKG5yZWFkZXJzID49IDApCisJCW5yZWFscmVhZGVycyA9IG5yZWFkZXJzOworCWVsc2UKKwkJbnJlYWxyZWFkZXJzID0gMiAqIG51bV9vbmxpbmVfY3B1cygpOworCXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLCAiU3RhcnQgb2YgdGVzdCIpOworCisJLyogU2V0IHVwIHRoZSBmcmVlbGlzdC4gKi8KKworCUlOSVRfTElTVF9IRUFEKCZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmN1X3RvcnR1cmVzKTsgaSsrKSB7CisJCXJjdV90b3J0dXJlc1tpXS5ydG9ydF9tYnRlc3QgPSAwOworCQlsaXN0X2FkZF90YWlsKCZyY3VfdG9ydHVyZXNbaV0ucnRvcnRfZnJlZSwKKwkJCSAgICAgICZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyBzbyB0aGF0IGVhY2ggcnVuIGdldHMgaXRzIG93biBudW1iZXJzLiAqLworCisJcmN1X3RvcnR1cmVfY3VycmVudCA9IE5VTEw7CisJcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uID0gMDsKKwlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jLCAwKTsKKwlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwsIDApOworCWF0b21pY19zZXQoJm5fcmN1X3RvcnR1cmVfZnJlZSwgMCk7CisJYXRvbWljX3NldCgmbl9yY3VfdG9ydHVyZV9tYmVycm9yLCAwKTsKKwlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2Vycm9yLCAwKTsKKwluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IgPSAwOworCW5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IgPSAwOworCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvciA9IDA7CisJbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlID0gMDsKKwluX3JjdV90b3J0dXJlX2Jvb3N0cyA9IDA7CisJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQorCQlhdG9taWNfc2V0KCZyY3VfdG9ydHVyZV93Y291bnRbaV0sIDApOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKSB7CisJCQlwZXJfY3B1KHJjdV90b3J0dXJlX2NvdW50LCBjcHUpW2ldID0gMDsKKwkJCXBlcl9jcHUocmN1X3RvcnR1cmVfYmF0Y2gsIGNwdSlbaV0gPSAwOworCQl9CisJfQorCisJLyogU3RhcnQgdXAgdGhlIGt0aHJlYWRzLiAqLworCisJZmlyc3RlcnIgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHJjdV90b3J0dXJlX3dyaXRlciwgTlVMTCwKKwkJCQkJICB3cml0ZXJfdGFzayk7CisJaWYgKGZpcnN0ZXJyKQorCQlnb3RvIHVud2luZDsKKwlmYWtld3JpdGVyX3Rhc2tzID0ga3phbGxvYyhuZmFrZXdyaXRlcnMgKiBzaXplb2YoZmFrZXdyaXRlcl90YXNrc1swXSksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKGZha2V3cml0ZXJfdGFza3MgPT0gTlVMTCkgeworCQlWRVJCT1NFX1RPUk9VVF9FUlJTVFJJTkcoIm91dCBvZiBtZW1vcnkiKTsKKwkJZmlyc3RlcnIgPSAtRU5PTUVNOworCQlnb3RvIHVud2luZDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9jcmVhdGVfa3RocmVhZChyY3VfdG9ydHVyZV9mYWtld3JpdGVyLAorCQkJCQkJICBOVUxMLCBmYWtld3JpdGVyX3Rhc2tzW2ldKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCXJlYWRlcl90YXNrcyA9IGt6YWxsb2MobnJlYWxyZWFkZXJzICogc2l6ZW9mKHJlYWRlcl90YXNrc1swXSksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHJlYWRlcl90YXNrcyA9PSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX0VSUlNUUklORygib3V0IG9mIG1lbW9yeSIpOworCQlmaXJzdGVyciA9IC1FTk9NRU07CisJCWdvdG8gdW53aW5kOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnJlYWxyZWFkZXJzOyBpKyspIHsKKwkJZmlyc3RlcnIgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHJjdV90b3J0dXJlX3JlYWRlciwgTlVMTCwKKwkJCQkJCSAgcmVhZGVyX3Rhc2tzW2ldKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCWlmIChzdGF0X2ludGVydmFsID4gMCkgeworCQlmaXJzdGVyciA9IHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfc3RhdHMsIE5VTEwsCisJCQkJCQkgIHN0YXRzX3Rhc2spOworCQlpZiAoZmlyc3RlcnIpCisJCQlnb3RvIHVud2luZDsKKwl9CisJaWYgKHRlc3Rfbm9faWRsZV9oeikgeworCQlmaXJzdGVyciA9IHRvcnR1cmVfc2h1ZmZsZV9pbml0KHNodWZmbGVfaW50ZXJ2YWwgKiBIWik7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAoc3R1dHRlciA8IDApCisJCXN0dXR0ZXIgPSAwOworCWlmIChzdHV0dGVyKSB7CisJCWZpcnN0ZXJyID0gdG9ydHVyZV9zdHV0dGVyX2luaXQoc3R1dHRlciAqIEhaKTsKKwkJaWYgKGZpcnN0ZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCWlmIChmcXNfZHVyYXRpb24gPCAwKQorCQlmcXNfZHVyYXRpb24gPSAwOworCWlmIChmcXNfZHVyYXRpb24pIHsKKwkJLyogQ3JlYXRlIHRoZSBmcXMgdGhyZWFkICovCisJCXRvcnR1cmVfY3JlYXRlX2t0aHJlYWQocmN1X3RvcnR1cmVfZnFzLCBOVUxMLCBmcXNfdGFzayk7CisJCWlmIChmaXJzdGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlpZiAodGVzdF9ib29zdF9pbnRlcnZhbCA8IDEpCisJCXRlc3RfYm9vc3RfaW50ZXJ2YWwgPSAxOworCWlmICh0ZXN0X2Jvb3N0X2R1cmF0aW9uIDwgMikKKwkJdGVzdF9ib29zdF9kdXJhdGlvbiA9IDI7CisJaWYgKCh0ZXN0X2Jvb3N0ID09IDEgJiYgY3VyX29wcy0+Y2FuX2Jvb3N0KSB8fAorCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKKworCQlib29zdF9zdGFydHRpbWUgPSBqaWZmaWVzICsgdGVzdF9ib29zdF9pbnRlcnZhbCAqIEhaOworCQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJCWlmIChjcHVfaXNfb2ZmbGluZShpKSkKKwkJCQljb250aW51ZTsgIC8qIEhldXJpc3RpYzogQ1BVIGNhbiBnbyBvZmZsaW5lLiAqLworCQkJZmlyc3RlcnIgPSByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChpKTsKKwkJCWlmIChmaXJzdGVycikKKwkJCQlnb3RvIHVud2luZDsKKwkJfQorCX0KKwlmaXJzdGVyciA9IHRvcnR1cmVfc2h1dGRvd25faW5pdChzaHV0ZG93bl9zZWNzLCByY3VfdG9ydHVyZV9jbGVhbnVwKTsKKwlpZiAoZmlyc3RlcnIpCisJCWdvdG8gdW53aW5kOworCWZpcnN0ZXJyID0gdG9ydHVyZV9vbm9mZl9pbml0KG9ub2ZmX2hvbGRvZmYgKiBIWiwgb25vZmZfaW50ZXJ2YWwgKiBIWik7CisJaWYgKGZpcnN0ZXJyKQorCQlnb3RvIHVud2luZDsKKwlmaXJzdGVyciA9IHJjdV90b3J0dXJlX3N0YWxsX2luaXQoKTsKKwlpZiAoZmlyc3RlcnIpCisJCWdvdG8gdW53aW5kOworCWZpcnN0ZXJyID0gcmN1X3RvcnR1cmVfYmFycmllcl9pbml0KCk7CisJaWYgKGZpcnN0ZXJyKQorCQlnb3RvIHVud2luZDsKKwlpZiAob2JqZWN0X2RlYnVnKQorCQlyY3VfdGVzdF9kZWJ1Z19vYmplY3RzKCk7CisJcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7CisJdG9ydHVyZV9pbml0X2VuZCgpOworCXJldHVybiAwOworCit1bndpbmQ6CisJdG9ydHVyZV9pbml0X2VuZCgpOworCXJjdV90b3J0dXJlX2NsZWFudXAoKTsKKwlyZXR1cm4gZmlyc3RlcnI7Cit9CisKK21vZHVsZV9pbml0KHJjdV90b3J0dXJlX2luaXQpOworbW9kdWxlX2V4aXQocmN1X3RvcnR1cmVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3NyY3UuYyBiL2tlcm5lbC9yY3Uvc3JjdS5jCmluZGV4IDMzMThkODIuLmM2Mzk1NTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3Uvc3JjdS5jCisrKyBiL2tlcm5lbC9yY3Uvc3JjdS5jCkBAIC0xMiw4ICsxMiw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNgogICogQ29weXJpZ2h0IChDKSBGdWppdHN1LCAyMDEyCkBAIC0zNiw4ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CiAKLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcmN1Lmg+Ci0KICNpbmNsdWRlICJyY3UuaCIKIAogLyoKQEAgLTM5OCw3ICszOTYsNyBAQAogCXJjdV9iYXRjaF9xdWV1ZSgmc3AtPmJhdGNoX3F1ZXVlLCBoZWFkKTsKIAlpZiAoIXNwLT5ydW5uaW5nKSB7CiAJCXNwLT5ydW5uaW5nID0gdHJ1ZTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzcC0+d29yaywgMCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmc3AtPndvcmssIDApOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+cXVldWVfbG9jaywgZmxhZ3MpOwogfQpAQCAtNjc0LDcgKzY3Miw4IEBACiAJfQogCiAJaWYgKHBlbmRpbmcpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc3AtPndvcmssIFNSQ1VfSU5URVJWQUwpOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkgICAmc3AtPndvcmssIFNSQ1VfSU5URVJWQUwpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90aW55LmMgYi9rZXJuZWwvcmN1L3RpbnkuYwppbmRleCAxMjU0ZjMxLi5kOWVmY2MxMyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90aW55LmMKKysrIGIva2VybmVsL3JjdS90aW55LmMKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKICAqCkBAIC0zNywxMCArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CiAKLSNpZmRlZiBDT05GSUdfUkNVX1RSQUNFCi0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3JjdS5oPgotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFICovCi0KICNpbmNsdWRlICJyY3UuaCIKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHRpbnlfcGx1Z2luLmguICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RpbnlfcGx1Z2luLmggYi9rZXJuZWwvcmN1L3RpbnlfcGx1Z2luLmgKaW5kZXggMjgwZDA2Yy4uNDMxNTI4NSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90aW55X3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3UvdGlueV9wbHVnaW4uaApAQCAtMTQsOCArMTQsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDEwIExpbmFybwogICoKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdG9ydHVyZS5jIGIva2VybmVsL3JjdS90b3J0dXJlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmY4YWUuLjAwMDAwMDAKLS0tIGEva2VybmVsL3JjdS90b3J0dXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQ4ICswLDAgQEAKLS8qCi0gKiBSZWFkLUNvcHkgVXBkYXRlIG1vZHVsZS1iYXNlZCB0b3J0dXJlIHRlc3QgZmFjaWxpdHkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA1LCAyMDA2Ci0gKgotICogQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPgotICoJICBKb3NoIFRyaXBsZXR0IDxqb3NoQGZyZWVkZXNrdG9wLm9yZz4KLSAqCi0gKiBTZWUgYWxzbzogIERvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3JjdS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90cmFjZV9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPiBhbmQgSm9zaCBUcmlwbGV0dCA8am9zaEBmcmVlZGVza3RvcC5vcmc+Iik7Ci0KLU1PRFVMRV9BTElBUygicmN1dG9ydHVyZSIpOwotI2lmZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKLSN1bmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCi0jZW5kaWYKLSNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCAicmN1dG9ydHVyZS4iCi0KLXN0YXRpYyBpbnQgZnFzX2R1cmF0aW9uOwotbW9kdWxlX3BhcmFtKGZxc19kdXJhdGlvbiwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZnFzX2R1cmF0aW9uLCAiRHVyYXRpb24gb2YgZnFzIGJ1cnN0cyAodXMpLCAwIHRvIGRpc2FibGUiKTsKLXN0YXRpYyBpbnQgZnFzX2hvbGRvZmY7Ci1tb2R1bGVfcGFyYW0oZnFzX2hvbGRvZmYsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZxc19ob2xkb2ZmLCAiSG9sZG9mZiB0aW1lIHdpdGhpbiBmcXMgYnVyc3RzICh1cykiKTsKLXN0YXRpYyBpbnQgZnFzX3N0dXR0ZXIgPSAzOwotbW9kdWxlX3BhcmFtKGZxc19zdHV0dGVyLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhmcXNfc3R1dHRlciwgIldhaXQgdGltZSBiZXR3ZWVuIGZxcyBidXJzdHMgKHMpIik7Ci1zdGF0aWMgYm9vbCBncF9leHA7Ci1tb2R1bGVfcGFyYW0oZ3BfZXhwLCBib29sLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZ3BfZXhwLCAiVXNlIGV4cGVkaXRlZCBHUCB3YWl0IHByaW1pdGl2ZXMiKTsKLXN0YXRpYyBib29sIGdwX25vcm1hbDsKLW1vZHVsZV9wYXJhbShncF9ub3JtYWwsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhncF9ub3JtYWwsICJVc2Ugbm9ybWFsIChub24tZXhwZWRpdGVkKSBHUCB3YWl0IHByaW1pdGl2ZXMiKTsKLXN0YXRpYyBpbnQgaXJxcmVhZGVyID0gMTsKLW1vZHVsZV9wYXJhbShpcnFyZWFkZXIsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlycXJlYWRlciwgIkFsbG93IFJDVSByZWFkZXJzIGZyb20gaXJxIGhhbmRsZXJzIik7Ci1zdGF0aWMgaW50IG5fYmFycmllcl9jYnM7Ci1tb2R1bGVfcGFyYW0obl9iYXJyaWVyX2NicywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mobl9iYXJyaWVyX2NicywgIiMgb2YgY2FsbGJhY2tzL2t0aHJlYWRzIGZvciBiYXJyaWVyIHRlc3RpbmciKTsKLXN0YXRpYyBpbnQgbmZha2V3cml0ZXJzID0gNDsKLW1vZHVsZV9wYXJhbShuZmFrZXdyaXRlcnMsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG5mYWtld3JpdGVycywgIk51bWJlciBvZiBSQ1UgZmFrZSB3cml0ZXIgdGhyZWFkcyIpOwotc3RhdGljIGludCBucmVhZGVycyA9IC0xOwotbW9kdWxlX3BhcmFtKG5yZWFkZXJzLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhucmVhZGVycywgIk51bWJlciBvZiBSQ1UgcmVhZGVyIHRocmVhZHMiKTsKLXN0YXRpYyBpbnQgb2JqZWN0X2RlYnVnOwotbW9kdWxlX3BhcmFtKG9iamVjdF9kZWJ1ZywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mob2JqZWN0X2RlYnVnLCAiRW5hYmxlIGRlYnVnLW9iamVjdCBkb3VibGUgY2FsbF9yY3UoKSB0ZXN0aW5nIik7Ci1zdGF0aWMgaW50IG9ub2ZmX2hvbGRvZmY7Ci1tb2R1bGVfcGFyYW0ob25vZmZfaG9sZG9mZiwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mob25vZmZfaG9sZG9mZiwgIlRpbWUgYWZ0ZXIgYm9vdCBiZWZvcmUgQ1BVIGhvdHBsdWdzIChzKSIpOwotc3RhdGljIGludCBvbm9mZl9pbnRlcnZhbDsKLW1vZHVsZV9wYXJhbShvbm9mZl9pbnRlcnZhbCwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mob25vZmZfaW50ZXJ2YWwsICJUaW1lIGJldHdlZW4gQ1BVIGhvdHBsdWdzIChzKSwgMD1kaXNhYmxlIik7Ci1zdGF0aWMgaW50IHNodWZmbGVfaW50ZXJ2YWwgPSAzOwotbW9kdWxlX3BhcmFtKHNodWZmbGVfaW50ZXJ2YWwsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHNodWZmbGVfaW50ZXJ2YWwsICJOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHNodWZmbGVzIik7Ci1zdGF0aWMgaW50IHNodXRkb3duX3NlY3M7Ci1tb2R1bGVfcGFyYW0oc2h1dGRvd25fc2VjcywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc2h1dGRvd25fc2VjcywgIlNodXRkb3duIHRpbWUgKHMpLCA8PSB6ZXJvIHRvIGRpc2FibGUuIik7Ci1zdGF0aWMgaW50IHN0YWxsX2NwdTsKLW1vZHVsZV9wYXJhbShzdGFsbF9jcHUsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHN0YWxsX2NwdSwgIlN0YWxsIGR1cmF0aW9uIChzKSwgemVybyB0byBkaXNhYmxlLiIpOwotc3RhdGljIGludCBzdGFsbF9jcHVfaG9sZG9mZiA9IDEwOwotbW9kdWxlX3BhcmFtKHN0YWxsX2NwdV9ob2xkb2ZmLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhzdGFsbF9jcHVfaG9sZG9mZiwgIlRpbWUgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgc3RhbGwgKHMpLiIpOwotc3RhdGljIGludCBzdGF0X2ludGVydmFsID0gNjA7Ci1tb2R1bGVfcGFyYW0oc3RhdF9pbnRlcnZhbCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc3RhdF9pbnRlcnZhbCwgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc3RhdHMgcHJpbnRrKClzIik7Ci1zdGF0aWMgaW50IHN0dXR0ZXIgPSA1OwotbW9kdWxlX3BhcmFtKHN0dXR0ZXIsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHN0dXR0ZXIsICJOdW1iZXIgb2Ygc2Vjb25kcyB0byBydW4vaGFsdCB0ZXN0Iik7Ci1zdGF0aWMgaW50IHRlc3RfYm9vc3QgPSAxOwotbW9kdWxlX3BhcmFtKHRlc3RfYm9vc3QsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfYm9vc3QsICJUZXN0IFJDVSBwcmlvIGJvb3N0OiAwPW5vLCAxPW1heWJlLCAyPXllcy4iKTsKLXN0YXRpYyBpbnQgdGVzdF9ib29zdF9kdXJhdGlvbiA9IDQ7Ci1tb2R1bGVfcGFyYW0odGVzdF9ib29zdF9kdXJhdGlvbiwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9ib29zdF9kdXJhdGlvbiwgIkR1cmF0aW9uIG9mIGVhY2ggYm9vc3QgdGVzdCwgc2Vjb25kcy4iKTsKLXN0YXRpYyBpbnQgdGVzdF9ib29zdF9pbnRlcnZhbCA9IDc7Ci1tb2R1bGVfcGFyYW0odGVzdF9ib29zdF9pbnRlcnZhbCwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9ib29zdF9pbnRlcnZhbCwgIkludGVydmFsIGJldHdlZW4gYm9vc3QgdGVzdHMsIHNlY29uZHMuIik7Ci1zdGF0aWMgYm9vbCB0ZXN0X25vX2lkbGVfaHogPSB0cnVlOwotbW9kdWxlX3BhcmFtKHRlc3Rfbm9faWRsZV9oeiwgYm9vbCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRlc3Rfbm9faWRsZV9oeiwgIlRlc3Qgc3VwcG9ydCBmb3IgdGlja2xlc3MgaWRsZSBDUFVzIik7Ci1zdGF0aWMgY2hhciAqdG9ydHVyZV90eXBlID0gInJjdSI7Ci1tb2R1bGVfcGFyYW0odG9ydHVyZV90eXBlLCBjaGFycCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRvcnR1cmVfdHlwZSwgIlR5cGUgb2YgUkNVIHRvIHRvcnR1cmUgKHJjdSwgcmN1X2JoLCAuLi4pIik7Ci1zdGF0aWMgYm9vbCB2ZXJib3NlOwotbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAiRW5hYmxlIHZlcmJvc2UgZGVidWdnaW5nIHByaW50aygpcyIpOwotCi0jZGVmaW5lIFRPUlRVUkVfRkxBRyAiLXRvcnR1cmU6IgotI2RlZmluZSBQUklOVEtfU1RSSU5HKHMpIFwKLQlkbyB7IHByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHIHMgIlxuIiwgdG9ydHVyZV90eXBlKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgVkVSQk9TRV9QUklOVEtfU1RSSU5HKHMpIFwKLQlkbyB7IGlmICh2ZXJib3NlKSBwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyBzICJcbiIsIHRvcnR1cmVfdHlwZSk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFZFUkJPU0VfUFJJTlRLX0VSUlNUUklORyhzKSBcCi0JZG8geyBpZiAodmVyYm9zZSkgcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcgIiEhISAiIHMgIlxuIiwgdG9ydHVyZV90eXBlKTsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCBucmVhbHJlYWRlcnM7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp3cml0ZXJfdGFzazsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKipmYWtld3JpdGVyX3Rhc2tzOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnJlYWRlcl90YXNrczsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN0YXRzX3Rhc2s7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzaHVmZmxlcl90YXNrOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3R1dHRlcl90YXNrOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqZnFzX3Rhc2s7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpib29zdF90YXNrc1tOUl9DUFVTXTsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNodXRkb3duX3Rhc2s7Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpvbm9mZl90YXNrOwotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN0YWxsX3Rhc2s7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICoqYmFycmllcl9jYnNfdGFza3M7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpiYXJyaWVyX3Rhc2s7Ci0KLSNkZWZpbmUgUkNVX1RPUlRVUkVfUElQRV9MRU4gMTAKLQotc3RydWN0IHJjdV90b3J0dXJlIHsKLQlzdHJ1Y3QgcmN1X2hlYWQgcnRvcnRfcmN1OwotCWludCBydG9ydF9waXBlX2NvdW50OwotCXN0cnVjdCBsaXN0X2hlYWQgcnRvcnRfZnJlZTsKLQlpbnQgcnRvcnRfbWJ0ZXN0OwotfTsKLQotc3RhdGljIExJU1RfSEVBRChyY3VfdG9ydHVyZV9mcmVlbGlzdCk7Ci1zdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlIF9fcmN1ICpyY3VfdG9ydHVyZV9jdXJyZW50Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uOwotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZSByY3VfdG9ydHVyZXNbMTAgKiBSQ1VfVE9SVFVSRV9QSVBFX0xFTl07Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJjdV90b3J0dXJlX2xvY2spOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGxvbmcgW1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0sIHJjdV90b3J0dXJlX2NvdW50KSA9Ci0JeyAwIH07Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZyBbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXSwgcmN1X3RvcnR1cmVfYmF0Y2gpID0KLQl7IDAgfTsKLXN0YXRpYyBhdG9taWNfdCByY3VfdG9ydHVyZV93Y291bnRbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXTsKLXN0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2FsbG9jOwotc3RhdGljIGF0b21pY190IG5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbDsKLXN0YXRpYyBhdG9taWNfdCBuX3JjdV90b3J0dXJlX2ZyZWU7Ci1zdGF0aWMgYXRvbWljX3Qgbl9yY3VfdG9ydHVyZV9tYmVycm9yOwotc3RhdGljIGF0b21pY190IG5fcmN1X3RvcnR1cmVfZXJyb3I7Ci1zdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3I7Ci1zdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yOwotc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yOwotc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlOwotc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV9ib29zdHM7Ci1zdGF0aWMgbG9uZyBuX3JjdV90b3J0dXJlX3RpbWVyczsKLXN0YXRpYyBsb25nIG5fb2ZmbGluZV9hdHRlbXB0czsKLXN0YXRpYyBsb25nIG5fb2ZmbGluZV9zdWNjZXNzZXM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzdW1fb2ZmbGluZTsKLXN0YXRpYyBpbnQgbWluX29mZmxpbmUgPSAtMTsKLXN0YXRpYyBpbnQgbWF4X29mZmxpbmU7Ci1zdGF0aWMgbG9uZyBuX29ubGluZV9hdHRlbXB0czsKLXN0YXRpYyBsb25nIG5fb25saW5lX3N1Y2Nlc3NlczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN1bV9vbmxpbmU7Ci1zdGF0aWMgaW50IG1pbl9vbmxpbmUgPSAtMTsKLXN0YXRpYyBpbnQgbWF4X29ubGluZTsKLXN0YXRpYyBsb25nIG5fYmFycmllcl9hdHRlbXB0czsKLXN0YXRpYyBsb25nIG5fYmFycmllcl9zdWNjZXNzZXM7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCByY3VfdG9ydHVyZV9yZW1vdmVkOwotc3RhdGljIGNwdW1hc2tfdmFyX3Qgc2h1ZmZsZV90bXBfbWFzazsKLQotc3RhdGljIGludCBzdHV0dGVyX3BhdXNlX3Rlc3Q7Ci0KLSNpZiBkZWZpbmVkKE1PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSkKLSNkZWZpbmUgUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUIDEKLSNlbHNlCi0jZGVmaW5lIFJDVVRPUlRVUkVfUlVOTkFCTEVfSU5JVCAwCi0jZW5kaWYKLWludCByY3V0b3J0dXJlX3J1bm5hYmxlID0gUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUOwotbW9kdWxlX3BhcmFtKHJjdXRvcnR1cmVfcnVubmFibGUsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJjdXRvcnR1cmVfcnVubmFibGUsICJTdGFydCByY3V0b3J0dXJlIGF0IGJvb3QiKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKQotI2RlZmluZSByY3VfY2FuX2Jvb3N0KCkgMQotI2Vsc2UgLyogI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAqLwotI2RlZmluZSByY3VfY2FuX2Jvb3N0KCkgMAotI2VuZGlmIC8qICNlbHNlICNpZiBkZWZpbmVkKENPTkZJR19SQ1VfQk9PU1QpICYmICFkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkgKi8KLQotI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UKLXN0YXRpYyB1NjQgbm90cmFjZSByY3VfdHJhY2VfY2xvY2tfbG9jYWwodm9pZCkKLXsKLQl1NjQgdHMgPSB0cmFjZV9jbG9ja19sb2NhbCgpOwotCXVuc2lnbmVkIGxvbmcgX19tYXliZV91bnVzZWQgdHNfcmVtID0gZG9fZGl2KHRzLCBOU0VDX1BFUl9VU0VDKTsKLQlyZXR1cm4gdHM7Ci19Ci0jZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLwotc3RhdGljIHU2NCBub3RyYWNlIHJjdV90cmFjZV9jbG9ja19sb2NhbCh2b2lkKQotewotCXJldHVybiAwVUxMOwotfQotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNodXRkb3duX3RpbWU7CS8qIGppZmZpZXMgdG8gc3lzdGVtIHNodXRkb3duLiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYm9vc3Rfc3RhcnR0aW1lOwkvKiBqaWZmaWVzIG9mIG5leHQgYm9vc3QgdGVzdCBzdGFydC4gKi8KLURFRklORV9NVVRFWChib29zdF9tdXRleCk7CQkvKiBwcm90ZWN0IHNldHRpbmcgYm9vc3Rfc3RhcnR0aW1lICovCi0JCQkJCS8qICBhbmQgYm9vc3QgdGFzayBjcmVhdGUvZGVzdHJveS4gKi8KLXN0YXRpYyBhdG9taWNfdCBiYXJyaWVyX2Nic19jb3VudDsJLyogQmFycmllciBjYWxsYmFja3MgcmVnaXN0ZXJlZC4gKi8KLXN0YXRpYyBib29sIGJhcnJpZXJfcGhhc2U7CQkvKiBUZXN0IHBoYXNlLiAqLwotc3RhdGljIGF0b21pY190IGJhcnJpZXJfY2JzX2ludm9rZWQ7CS8qIEJhcnJpZXIgY2FsbGJhY2tzIGludm9rZWQuICovCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgKmJhcnJpZXJfY2JzX3dxOyAvKiBDb29yZGluYXRlIGJhcnJpZXIgdGVzdGluZy4gKi8KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChiYXJyaWVyX3dxKTsKLQotLyogTWVkaWF0ZSBybW1vZCBhbmQgc3lzdGVtIHNodXRkb3duLiAgQ29uY3VycmVudCBybW1vZCAmIHNodXRkb3duIGlsbGVnYWwhICovCi0KLSNkZWZpbmUgRlVMTFNUT1BfRE9OVFNUT1AgMAkvKiBOb3JtYWwgb3BlcmF0aW9uLiAqLwotI2RlZmluZSBGVUxMU1RPUF9TSFVURE9XTiAxCS8qIFN5c3RlbSBzaHV0ZG93biB3aXRoIHJjdXRvcnR1cmUgcnVubmluZy4gKi8KLSNkZWZpbmUgRlVMTFNUT1BfUk1NT0QgICAgMgkvKiBOb3JtYWwgcm1tb2Qgb2YgcmN1dG9ydHVyZS4gKi8KLXN0YXRpYyBpbnQgZnVsbHN0b3AgPSBGVUxMU1RPUF9STU1PRDsKLS8qCi0gKiBQcm90ZWN0IGZ1bGxzdG9wIHRyYW5zaXRpb25zIGFuZCBzcGF3bmluZyBvZiBrdGhyZWFkcy4KLSAqLwotc3RhdGljIERFRklORV9NVVRFWChmdWxsc3RvcF9tdXRleCk7Ci0KLS8qIEZvcndhcmQgcmVmZXJlbmNlLiAqLwotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfY2xlYW51cCh2b2lkKTsKLQotLyoKLSAqIERldGVjdCBhbmQgcmVzcG9uZCB0byBhIHN5c3RlbSBzaHV0ZG93bi4KLSAqLwotc3RhdGljIGludAotcmN1dG9ydHVyZV9zaHV0ZG93bl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQxLAotCQkJICAgdW5zaWduZWQgbG9uZyB1bnVzZWQyLCB2b2lkICp1bnVzZWQzKQotewotCW11dGV4X2xvY2soJmZ1bGxzdG9wX211dGV4KTsKLQlpZiAoZnVsbHN0b3AgPT0gRlVMTFNUT1BfRE9OVFNUT1ApCi0JCWZ1bGxzdG9wID0gRlVMTFNUT1BfU0hVVERPV047Ci0JZWxzZQotCQlwcl93YXJuKC8qIGJ1dCBnb2luZyBkb3duIGFueXdheSwgc28uLi4gKi8KLQkJICAgICAgICJDb25jdXJyZW50ICdybW1vZCByY3V0b3J0dXJlJyBhbmQgc2h1dGRvd24gaWxsZWdhbCFcbiIpOwotCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLQotLyoKLSAqIEFic29yYiBrdGhyZWFkcyBpbnRvIGEga2VybmVsIGZ1bmN0aW9uIHRoYXQgd29uJ3QgcmV0dXJuLCBzbyB0aGF0Ci0gKiB0aGV5IHdvbid0IGV2ZXIgYWNjZXNzIG1vZHVsZSB0ZXh0IG9yIGRhdGEgYWdhaW4uCi0gKi8KLXN0YXRpYyB2b2lkIHJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKGNvbnN0IGNoYXIgKnRpdGxlKQotewotCWlmIChBQ0NFU1NfT05DRShmdWxsc3RvcCkgPT0gRlVMTFNUT1BfU0hVVERPV04pIHsKLQkJcHJfbm90aWNlKAotCQkgICAgICAgInJjdXRvcnR1cmUgdGhyZWFkICVzIHBhcmtpbmcgZHVlIHRvIHN5c3RlbSBzaHV0ZG93blxuIiwKLQkJICAgICAgIHRpdGxlKTsKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoTUFYX1NDSEVEVUxFX1RJTUVPVVQpOwotCX0KLX0KLQotLyoKLSAqIEFsbG9jYXRlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmUgKgotcmN1X3RvcnR1cmVfYWxsb2Modm9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCi0Jc3Bpbl9sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmcmN1X3RvcnR1cmVfZnJlZWxpc3QpKSB7Ci0JCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZyY3VfdG9ydHVyZV9sb2NrKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfYWxsb2MpOwotCXAgPSByY3VfdG9ydHVyZV9mcmVlbGlzdC5uZXh0OwotCWxpc3RfZGVsX2luaXQocCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnJjdV90b3J0dXJlX2xvY2spOwotCXJldHVybiBjb250YWluZXJfb2YocCwgc3RydWN0IHJjdV90b3J0dXJlLCBydG9ydF9mcmVlKTsKLX0KLQotLyoKLSAqIEZyZWUgYW4gZWxlbWVudCB0byB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCi0gKi8KLXN0YXRpYyB2b2lkCi1yY3VfdG9ydHVyZV9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcCkKLXsKLQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX2ZyZWUpOwotCXNwaW5fbG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmcC0+cnRvcnRfZnJlZSwgJnJjdV90b3J0dXJlX2ZyZWVsaXN0KTsKLQlzcGluX3VubG9ja19iaCgmcmN1X3RvcnR1cmVfbG9jayk7Ci19Ci0KLXN0cnVjdCByY3VfcmFuZG9tX3N0YXRlIHsKLQl1bnNpZ25lZCBsb25nIHJyc19zdGF0ZTsKLQlsb25nIHJyc19jb3VudDsKLX07Ci0KLSNkZWZpbmUgUkNVX1JBTkRPTV9NVUxUIDM5OTE2ODAxICAvKiBwcmltZSAqLwotI2RlZmluZSBSQ1VfUkFORE9NX0FERAk0NzkwMDE3MDEgLyogcHJpbWUgKi8KLSNkZWZpbmUgUkNVX1JBTkRPTV9SRUZSRVNIIDEwMDAwCi0KLSNkZWZpbmUgREVGSU5FX1JDVV9SQU5ET00obmFtZSkgc3RydWN0IHJjdV9yYW5kb21fc3RhdGUgbmFtZSA9IHsgMCwgMCB9Ci0KLS8qCi0gKiBDcnVkZSBidXQgZmFzdCByYW5kb20tbnVtYmVyIGdlbmVyYXRvci4gIFVzZXMgYSBsaW5lYXIgY29uZ3J1ZW50aWFsCi0gKiBnZW5lcmF0b3IsIHdpdGggb2NjYXNpb25hbCBoZWxwIGZyb20gY3B1X2Nsb2NrKCkuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1yY3VfcmFuZG9tKHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKQotewotCWlmICgtLXJyc3AtPnJyc19jb3VudCA8IDApIHsKLQkJcnJzcC0+cnJzX3N0YXRlICs9ICh1bnNpZ25lZCBsb25nKWxvY2FsX2Nsb2NrKCk7Ci0JCXJyc3AtPnJyc19jb3VudCA9IFJDVV9SQU5ET01fUkVGUkVTSDsKLQl9Ci0JcnJzcC0+cnJzX3N0YXRlID0gcnJzcC0+cnJzX3N0YXRlICogUkNVX1JBTkRPTV9NVUxUICsgUkNVX1JBTkRPTV9BREQ7Ci0JcmV0dXJuIHN3YWh3MzIocnJzcC0+cnJzX3N0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQKLXJjdV9zdHV0dGVyX3dhaXQoY29uc3QgY2hhciAqdGl0bGUpCi17Ci0Jd2hpbGUgKHN0dXR0ZXJfcGF1c2VfdGVzdCB8fCAhcmN1dG9ydHVyZV9ydW5uYWJsZSkgewotCQlpZiAocmN1dG9ydHVyZV9ydW5uYWJsZSkKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKLQkJZWxzZQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoSFopKTsKLQkJcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIodGl0bGUpOwotCX0KLX0KLQotLyoKLSAqIE9wZXJhdGlvbnMgdmVjdG9yIGZvciBzZWxlY3RpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHRlc3RzLgotICovCi0KLXN0cnVjdCByY3VfdG9ydHVyZV9vcHMgewotCXZvaWQgKCppbml0KSh2b2lkKTsKLQlpbnQgKCpyZWFkbG9jaykodm9pZCk7Ci0Jdm9pZCAoKnJlYWRfZGVsYXkpKHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKTsKLQl2b2lkICgqcmVhZHVubG9jaykoaW50IGlkeCk7Ci0JaW50ICgqY29tcGxldGVkKSh2b2lkKTsKLQl2b2lkICgqZGVmZXJyZWRfZnJlZSkoc3RydWN0IHJjdV90b3J0dXJlICpwKTsKLQl2b2lkICgqc3luYykodm9pZCk7Ci0Jdm9pZCAoKmV4cF9zeW5jKSh2b2lkKTsKLQl2b2lkICgqY2FsbCkoc3RydWN0IHJjdV9oZWFkICpoZWFkLCB2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpyY3UpKTsKLQl2b2lkICgqY2JfYmFycmllcikodm9pZCk7Ci0Jdm9pZCAoKmZxcykodm9pZCk7Ci0Jdm9pZCAoKnN0YXRzKShjaGFyICpwYWdlKTsKLQlpbnQgaXJxX2NhcGFibGU7Ci0JaW50IGNhbl9ib29zdDsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgKmN1cl9vcHM7Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgcmN1IHRvcnR1cmUgdGVzdGluZy4KLSAqLwotCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX3JlYWRfbG9jayh2b2lkKSBfX2FjcXVpcmVzKFJDVSkKLXsKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJjdV9yZWFkX2RlbGF5KHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hvcnRkZWxheV91cyA9IDIwMDsKLQljb25zdCB1bnNpZ25lZCBsb25nIGxvbmdkZWxheV9tcyA9IDUwOwotCi0JLyogV2Ugd2FudCBhIHNob3J0IGRlbGF5IHNvbWV0aW1lcyB0byBtYWtlIGEgcmVhZGVyIGRlbGF5IHRoZSBncmFjZQotCSAqIHBlcmlvZCwgYW5kIHdlIHdhbnQgYSBsb25nIGRlbGF5IG9jY2FzaW9uYWxseSB0byB0cmlnZ2VyCi0JICogZm9yY2VfcXVpZXNjZW50X3N0YXRlLiAqLwotCi0JaWYgKCEocmN1X3JhbmRvbShycnNwKSAlIChucmVhbHJlYWRlcnMgKiAyMDAwICogbG9uZ2RlbGF5X21zKSkpCi0JCW1kZWxheShsb25nZGVsYXlfbXMpOwotCWlmICghKHJjdV9yYW5kb20ocnJzcCkgJSAobnJlYWxyZWFkZXJzICogMiAqIHNob3J0ZGVsYXlfdXMpKSkKLQkJdWRlbGF5KHNob3J0ZGVsYXlfdXMpOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JaWYgKCFwcmVlbXB0X2NvdW50KCkgJiYgIShyY3VfcmFuZG9tKHJyc3ApICUgKG5yZWFscmVhZGVycyAqIDIwMDAwKSkpCi0JCXByZWVtcHRfc2NoZWR1bGUoKTsgIC8qIE5vIFFTIGlmIHByZWVtcHRfZGlzYWJsZSgpIGluIGVmZmVjdCAqLwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX3JlYWRfdW5sb2NrKGludCBpZHgpIF9fcmVsZWFzZXMoUkNVKQotewotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX2NvbXBsZXRlZCh2b2lkKQotewotCXJldHVybiByY3VfYmF0Y2hlc19jb21wbGV0ZWQoKTsKLX0KLQotc3RhdGljIHZvaWQKLXJjdV90b3J0dXJlX2NiKHN0cnVjdCByY3VfaGVhZCAqcCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcmN1X3RvcnR1cmUgKnJwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByY3VfdG9ydHVyZSwgcnRvcnRfcmN1KTsKLQotCWlmIChmdWxsc3RvcCAhPSBGVUxMU1RPUF9ET05UU1RPUCkgewotCQkvKiBUZXN0IGlzIGVuZGluZywganVzdCBkcm9wIGNhbGxiYWNrcyBvbiB0aGUgZmxvb3IuICovCi0JCS8qIFRoZSBuZXh0IGluaXRpYWxpemF0aW9uIHdpbGwgcGljayB1cCB0aGUgcGllY2VzLiAqLwotCQlyZXR1cm47Ci0JfQotCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKLQlpZiAoaSA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKQotCQlpID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKLQlpZiAoKytycC0+cnRvcnRfcGlwZV9jb3VudCA+PSBSQ1VfVE9SVFVSRV9QSVBFX0xFTikgewotCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKLQkJcmN1X3RvcnR1cmVfZnJlZShycCk7Ci0JfSBlbHNlIHsKLQkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShycCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHJjdV9ub19jb21wbGV0ZWQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfZGVmZXJyZWRfZnJlZShzdHJ1Y3QgcmN1X3RvcnR1cmUgKnApCi17Ci0JY2FsbF9yY3UoJnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOwotfQotCi1zdGF0aWMgdm9pZCByY3Vfc3luY190b3J0dXJlX2luaXQodm9pZCkKLXsKLQlJTklUX0xJU1RfSEVBRCgmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHJjdV9vcHMgPSB7Ci0JLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAotCS5yZWFkbG9jawk9IHJjdV90b3J0dXJlX3JlYWRfbG9jaywKLQkucmVhZF9kZWxheQk9IHJjdV9yZWFkX2RlbGF5LAotCS5yZWFkdW5sb2NrCT0gcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCi0JLmNvbXBsZXRlZAk9IHJjdV90b3J0dXJlX2NvbXBsZXRlZCwKLQkuZGVmZXJyZWRfZnJlZQk9IHJjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUsCi0JLnN5bmMJCT0gc3luY2hyb25pemVfcmN1LAotCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQsCi0JLmNhbGwJCT0gY2FsbF9yY3UsCi0JLmNiX2JhcnJpZXIJPSByY3VfYmFycmllciwKLQkuZnFzCQk9IHJjdV9mb3JjZV9xdWllc2NlbnRfc3RhdGUsCi0JLnN0YXRzCQk9IE5VTEwsCi0JLmlycV9jYXBhYmxlCT0gMSwKLQkuY2FuX2Jvb3N0CT0gcmN1X2Nhbl9ib29zdCgpLAotCS5uYW1lCQk9ICJyY3UiCi19OwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIHJjdV9iaCB0b3J0dXJlIHRlc3RpbmcuCi0gKi8KLQotc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9yZWFkX2xvY2sodm9pZCkgX19hY3F1aXJlcyhSQ1VfQkgpCi17Ci0JcmN1X3JlYWRfbG9ja19iaCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jayhpbnQgaWR4KSBfX3JlbGVhc2VzKFJDVV9CSCkKLXsKLQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKLX0KLQotc3RhdGljIGludCByY3VfYmhfdG9ydHVyZV9jb21wbGV0ZWQodm9pZCkKLXsKLQlyZXR1cm4gcmN1X2JhdGNoZXNfY29tcGxldGVkX2JoKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJjdV9iaF90b3J0dXJlX2RlZmVycmVkX2ZyZWUoc3RydWN0IHJjdV90b3J0dXJlICpwKQotewotCWNhbGxfcmN1X2JoKCZwLT5ydG9ydF9yY3UsIHJjdV90b3J0dXJlX2NiKTsKLX0KLQotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgcmN1X2JoX29wcyA9IHsKLQkuaW5pdAkJPSByY3Vfc3luY190b3J0dXJlX2luaXQsCi0JLnJlYWRsb2NrCT0gcmN1X2JoX3RvcnR1cmVfcmVhZF9sb2NrLAotCS5yZWFkX2RlbGF5CT0gcmN1X3JlYWRfZGVsYXksICAvKiBqdXN0IHJldXNlIHJjdSdzIHZlcnNpb24uICovCi0JLnJlYWR1bmxvY2sJPSByY3VfYmhfdG9ydHVyZV9yZWFkX3VubG9jaywKLQkuY29tcGxldGVkCT0gcmN1X2JoX3RvcnR1cmVfY29tcGxldGVkLAotCS5kZWZlcnJlZF9mcmVlCT0gcmN1X2JoX3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKLQkuc3luYwkJPSBzeW5jaHJvbml6ZV9yY3VfYmgsCi0JLmV4cF9zeW5jCT0gc3luY2hyb25pemVfcmN1X2JoX2V4cGVkaXRlZCwKLQkuY2FsbAkJPSBjYWxsX3JjdV9iaCwKLQkuY2JfYmFycmllcgk9IHJjdV9iYXJyaWVyX2JoLAotCS5mcXMJCT0gcmN1X2JoX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSwKLQkuc3RhdHMJCT0gTlVMTCwKLQkuaXJxX2NhcGFibGUJPSAxLAotCS5uYW1lCQk9ICJyY3VfYmgiCi19OwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIHNyY3UgdG9ydHVyZSB0ZXN0aW5nLgotICovCi0KLURFRklORV9TVEFUSUNfU1JDVShzcmN1X2N0bCk7Ci0KLXN0YXRpYyBpbnQgc3JjdV90b3J0dXJlX3JlYWRfbG9jayh2b2lkKSBfX2FjcXVpcmVzKCZzcmN1X2N0bCkKLXsKLQlyZXR1cm4gc3JjdV9yZWFkX2xvY2soJnNyY3VfY3RsKTsKLX0KLQotc3RhdGljIHZvaWQgc3JjdV9yZWFkX2RlbGF5KHN0cnVjdCByY3VfcmFuZG9tX3N0YXRlICpycnNwKQotewotCWxvbmcgZGVsYXk7Ci0JY29uc3QgbG9uZyB1c3BlcnRpY2sgPSAxMDAwMDAwIC8gSFo7Ci0JY29uc3QgbG9uZyBsb25nZGVsYXkgPSAxMDsKLQotCS8qIFdlIHdhbnQgdGhlcmUgdG8gYmUgbG9uZy1ydW5uaW5nIHJlYWRlcnMsIGJ1dCBub3QgYWxsIHRoZSB0aW1lLiAqLwotCi0JZGVsYXkgPSByY3VfcmFuZG9tKHJyc3ApICUgKG5yZWFscmVhZGVycyAqIDIgKiBsb25nZGVsYXkgKiB1c3BlcnRpY2spOwotCWlmICghZGVsYXkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShsb25nZGVsYXkpOwotCWVsc2UKLQkJcmN1X3JlYWRfZGVsYXkocnJzcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9yZWFkX3VubG9jayhpbnQgaWR4KSBfX3JlbGVhc2VzKCZzcmN1X2N0bCkKLXsKLQlzcmN1X3JlYWRfdW5sb2NrKCZzcmN1X2N0bCwgaWR4KTsKLX0KLQotc3RhdGljIGludCBzcmN1X3RvcnR1cmVfY29tcGxldGVkKHZvaWQpCi17Ci0JcmV0dXJuIHNyY3VfYmF0Y2hlc19jb21wbGV0ZWQoJnNyY3VfY3RsKTsKLX0KLQotc3RhdGljIHZvaWQgc3JjdV90b3J0dXJlX2RlZmVycmVkX2ZyZWUoc3RydWN0IHJjdV90b3J0dXJlICpycCkKLXsKLQljYWxsX3NyY3UoJnNyY3VfY3RsLCAmcnAtPnJ0b3J0X3JjdSwgcmN1X3RvcnR1cmVfY2IpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfc3luY2hyb25pemUodm9pZCkKLXsKLQlzeW5jaHJvbml6ZV9zcmN1KCZzcmN1X2N0bCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9jYWxsKHN0cnVjdCByY3VfaGVhZCAqaGVhZCwKLQkJCSAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpKQotewotCWNhbGxfc3JjdSgmc3JjdV9jdGwsIGhlYWQsIGZ1bmMpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfYmFycmllcih2b2lkKQotewotCXNyY3VfYmFycmllcigmc3JjdV9jdGwpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfc3RhdHMoY2hhciAqcGFnZSkKLXsKLQlpbnQgY3B1OwotCWludCBpZHggPSBzcmN1X2N0bC5jb21wbGV0ZWQgJiAweDE7Ci0KLQlwYWdlICs9IHNwcmludGYocGFnZSwgIiVzJXMgcGVyLUNQVShpZHg9JWQpOiIsCi0JCSAgICAgICB0b3J0dXJlX3R5cGUsIFRPUlRVUkVfRkxBRywgaWR4KTsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiICVkKCVsdSwlbHUpIiwgY3B1LAotCQkJICAgICAgIHBlcl9jcHVfcHRyKHNyY3VfY3RsLnBlcl9jcHVfcmVmLCBjcHUpLT5jWyFpZHhdLAotCQkJICAgICAgIHBlcl9jcHVfcHRyKHNyY3VfY3RsLnBlcl9jcHVfcmVmLCBjcHUpLT5jW2lkeF0pOwotCX0KLQlzcHJpbnRmKHBhZ2UsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfc3luY2hyb25pemVfZXhwZWRpdGVkKHZvaWQpCi17Ci0Jc3luY2hyb25pemVfc3JjdV9leHBlZGl0ZWQoJnNyY3VfY3RsKTsKLX0KLQotc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgc3JjdV9vcHMgPSB7Ci0JLmluaXQJCT0gcmN1X3N5bmNfdG9ydHVyZV9pbml0LAotCS5yZWFkbG9jawk9IHNyY3VfdG9ydHVyZV9yZWFkX2xvY2ssCi0JLnJlYWRfZGVsYXkJPSBzcmN1X3JlYWRfZGVsYXksCi0JLnJlYWR1bmxvY2sJPSBzcmN1X3RvcnR1cmVfcmVhZF91bmxvY2ssCi0JLmNvbXBsZXRlZAk9IHNyY3VfdG9ydHVyZV9jb21wbGV0ZWQsCi0JLmRlZmVycmVkX2ZyZWUJPSBzcmN1X3RvcnR1cmVfZGVmZXJyZWRfZnJlZSwKLQkuc3luYwkJPSBzcmN1X3RvcnR1cmVfc3luY2hyb25pemUsCi0JLmV4cF9zeW5jCT0gc3JjdV90b3J0dXJlX3N5bmNocm9uaXplX2V4cGVkaXRlZCwKLQkuY2FsbAkJPSBzcmN1X3RvcnR1cmVfY2FsbCwKLQkuY2JfYmFycmllcgk9IHNyY3VfdG9ydHVyZV9iYXJyaWVyLAotCS5zdGF0cwkJPSBzcmN1X3RvcnR1cmVfc3RhdHMsCi0JLm5hbWUJCT0gInNyY3UiCi19OwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIHNjaGVkIHRvcnR1cmUgdGVzdGluZy4KLSAqLwotCi1zdGF0aWMgaW50IHNjaGVkX3RvcnR1cmVfcmVhZF9sb2NrKHZvaWQpCi17Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjaGVkX3RvcnR1cmVfcmVhZF91bmxvY2soaW50IGlkeCkKLXsKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotCi1zdGF0aWMgdm9pZCByY3Vfc2NoZWRfdG9ydHVyZV9kZWZlcnJlZF9mcmVlKHN0cnVjdCByY3VfdG9ydHVyZSAqcCkKLXsKLQljYWxsX3JjdV9zY2hlZCgmcC0+cnRvcnRfcmN1LCByY3VfdG9ydHVyZV9jYik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzIHNjaGVkX29wcyA9IHsKLQkuaW5pdAkJPSByY3Vfc3luY190b3J0dXJlX2luaXQsCi0JLnJlYWRsb2NrCT0gc2NoZWRfdG9ydHVyZV9yZWFkX2xvY2ssCi0JLnJlYWRfZGVsYXkJPSByY3VfcmVhZF9kZWxheSwgIC8qIGp1c3QgcmV1c2UgcmN1J3MgdmVyc2lvbi4gKi8KLQkucmVhZHVubG9jawk9IHNjaGVkX3RvcnR1cmVfcmVhZF91bmxvY2ssCi0JLmNvbXBsZXRlZAk9IHJjdV9ub19jb21wbGV0ZWQsCi0JLmRlZmVycmVkX2ZyZWUJPSByY3Vfc2NoZWRfdG9ydHVyZV9kZWZlcnJlZF9mcmVlLAotCS5zeW5jCQk9IHN5bmNocm9uaXplX3NjaGVkLAotCS5leHBfc3luYwk9IHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCwKLQkuY2FsbAkJPSBjYWxsX3JjdV9zY2hlZCwKLQkuY2JfYmFycmllcgk9IHJjdV9iYXJyaWVyX3NjaGVkLAotCS5mcXMJCT0gcmN1X3NjaGVkX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSwKLQkuc3RhdHMJCT0gTlVMTCwKLQkuaXJxX2NhcGFibGUJPSAxLAotCS5uYW1lCQk9ICJzY2hlZCIKLX07Ci0KLS8qCi0gKiBSQ1UgdG9ydHVyZSBwcmlvcml0eS1ib29zdCB0ZXN0aW5nLiAgUnVucyBvbmUgcmVhbC10aW1lIHRocmVhZCBwZXIKLSAqIENQVSBmb3IgbW9kZXJhdGUgYnVyc3RzLCByZXBlYXRlZGx5IHJlZ2lzdGVyaW5nIFJDVSBjYWxsYmFja3MgYW5kCi0gKiBzcGlubmluZyB3YWl0aW5nIGZvciB0aGVtIHRvIGJlIGludm9rZWQuICBJZiBhIGdpdmVuIGNhbGxiYWNrIHRha2VzCi0gKiB0b28gbG9uZyB0byBiZSBpbnZva2VkLCB3ZSBhc3N1bWUgdGhhdCBwcmlvcml0eSBpbnZlcnNpb24gaGFzIG9jY3VycmVkLgotICovCi0KLXN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQgewotCXN0cnVjdCByY3VfaGVhZCByY3U7Ci0JaW50IGluZmxpZ2h0OwotfTsKLQotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfYm9vc3RfY2Ioc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCXN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQgKnJiaXAgPQotCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJjdV9ib29zdF9pbmZsaWdodCwgcmN1KTsKLQotCXNtcF9tYigpOyAvKiBFbnN1cmUgUkNVLWNvcmUgYWNjZXNzZXMgcHJlY2VkZSBjbGVhcmluZyAtPmluZmxpZ2h0ICovCi0JcmJpcC0+aW5mbGlnaHQgPSAwOwotfQotCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX2Jvb3N0KHZvaWQgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGNhbGxfcmN1X3RpbWU7Ci0JdW5zaWduZWQgbG9uZyBlbmR0aW1lOwotCXVuc2lnbmVkIGxvbmcgb2xkc3RhcnR0aW1lOwotCXN0cnVjdCByY3VfYm9vc3RfaW5mbGlnaHQgcmJpID0geyAuaW5mbGlnaHQgPSAwIH07Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHNwOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9ib29zdCBzdGFydGVkIik7Ci0KLQkvKiBTZXQgcmVhbC10aW1lIHByaW9yaXR5LiAqLwotCXNwLnNjaGVkX3ByaW9yaXR5ID0gMTsKLQlpZiAoc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZzcCkgPCAwKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfYm9vc3QgUlQgcHJpbyBmYWlsZWQhIik7Ci0JCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvcisrOwotCX0KLQotCWluaXRfcmN1X2hlYWRfb25fc3RhY2soJnJiaS5yY3UpOwotCS8qIEVhY2ggcGFzcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbG9vcCBkb2VzIG9uZSBib29zdC10ZXN0IGN5Y2xlLiAqLwotCWRvIHsKLQkJLyogV2FpdCBmb3IgdGhlIG5leHQgdGVzdCBpbnRlcnZhbC4gKi8KLQkJb2xkc3RhcnR0aW1lID0gYm9vc3Rfc3RhcnR0aW1lOwotCQl3aGlsZSAoVUxPTkdfQ01QX0xUKGppZmZpZXMsIG9sZHN0YXJ0dGltZSkpIHsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShvbGRzdGFydHRpbWUgLSBqaWZmaWVzKTsKLQkJCXJjdV9zdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX2Jvb3N0Iik7Ci0JCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8Ci0JCQkgICAgZnVsbHN0b3AgIT0gRlVMTFNUT1BfRE9OVFNUT1ApCi0JCQkJZ290byBjaGVja3dhaXQ7Ci0JCX0KLQotCQkvKiBEbyBvbmUgYm9vc3QtdGVzdCBpbnRlcnZhbC4gKi8KLQkJZW5kdGltZSA9IG9sZHN0YXJ0dGltZSArIHRlc3RfYm9vc3RfZHVyYXRpb24gKiBIWjsKLQkJY2FsbF9yY3VfdGltZSA9IGppZmZpZXM7Ci0JCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllcywgZW5kdGltZSkpIHsKLQkJCS8qIElmIHdlIGRvbid0IGhhdmUgYSBjYWxsYmFjayBpbiBmbGlnaHQsIHBvc3Qgb25lLiAqLwotCQkJaWYgKCFyYmkuaW5mbGlnaHQpIHsKLQkJCQlzbXBfbWIoKTsgLyogUkNVIGNvcmUgYmVmb3JlIC0+aW5mbGlnaHQgPSAxLiAqLwotCQkJCXJiaS5pbmZsaWdodCA9IDE7Ci0JCQkJY2FsbF9yY3UoJnJiaS5yY3UsIHJjdV90b3J0dXJlX2Jvb3N0X2NiKTsKLQkJCQlpZiAoamlmZmllcyAtIGNhbGxfcmN1X3RpbWUgPgotCQkJCQkgdGVzdF9ib29zdF9kdXJhdGlvbiAqIEhaIC0gSFogLyAyKSB7Ci0JCQkJCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfYm9vc3QgYm9vc3RpbmcgZmFpbGVkIik7Ci0JCQkJCW5fcmN1X3RvcnR1cmVfYm9vc3RfZmFpbHVyZSsrOwotCQkJCX0KLQkJCQljYWxsX3JjdV90aW1lID0gamlmZmllczsKLQkJCX0KLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJcmN1X3N0dXR0ZXJfd2FpdCgicmN1X3RvcnR1cmVfYm9vc3QiKTsKLQkJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwKLQkJCSAgICBmdWxsc3RvcCAhPSBGVUxMU1RPUF9ET05UU1RPUCkKLQkJCQlnb3RvIGNoZWNrd2FpdDsKLQkJfQotCi0JCS8qCi0JCSAqIFNldCB0aGUgc3RhcnQgdGltZSBvZiB0aGUgbmV4dCB0ZXN0IGludGVydmFsLgotCQkgKiBZZXMsIHRoaXMgaXMgdnVsbmVyYWJsZSB0byBsb25nIGRlbGF5cywgYnV0IHN1Y2gKLQkJICogZGVsYXlzIHNpbXBseSBjYXVzZSBhIGZhbHNlIG5lZ2F0aXZlIGZvciB0aGUgbmV4dAotCQkgKiBpbnRlcnZhbC4gIEJlc2lkZXMsIHdlIGFyZSBydW5uaW5nIGF0IFJUIHByaW9yaXR5LAotCQkgKiBzbyBkZWxheXMgc2hvdWxkIGJlIHJlbGF0aXZlbHkgcmFyZS4KLQkJICovCi0JCXdoaWxlIChvbGRzdGFydHRpbWUgPT0gYm9vc3Rfc3RhcnR0aW1lICYmCi0JCSAgICAgICAha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCQlpZiAobXV0ZXhfdHJ5bG9jaygmYm9vc3RfbXV0ZXgpKSB7Ci0JCQkJYm9vc3Rfc3RhcnR0aW1lID0gamlmZmllcyArCi0JCQkJCQkgIHRlc3RfYm9vc3RfaW50ZXJ2YWwgKiBIWjsKLQkJCQluX3JjdV90b3J0dXJlX2Jvb3N0cysrOwotCQkJCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCX0KLQotCQkvKiBHbyBkbyB0aGUgc3R1dHRlci4gKi8KLWNoZWNrd2FpdDoJcmN1X3N0dXR0ZXJfd2FpdCgicmN1X3RvcnR1cmVfYm9vc3QiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICA9PSBGVUxMU1RPUF9ET05UU1RPUCk7Ci0KLQkvKiBDbGVhbiB1cCBhbmQgZXhpdC4gKi8KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IHRhc2sgc3RvcHBpbmciKTsKLQlyY3V0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfYm9vc3QiKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCByYmkuaW5mbGlnaHQpCi0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCXNtcF9tYigpOyAvKiBvcmRlciBhY2Nlc3NlcyB0byAtPmluZmxpZ2h0IGJlZm9yZSBzdGFjay1mcmFtZSBkZWF0aC4gKi8KLQlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyYmkucmN1KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJDVSB0b3J0dXJlIGZvcmNlLXF1aWVzY2VudC1zdGF0ZSBrdGhyZWFkLiAgUmVwZWF0ZWRseSBpbmR1Y2VzCi0gKiBidXJzdHMgb2YgY2FsbHMgdG8gZm9yY2VfcXVpZXNjZW50X3N0YXRlKCksIGluY3JlYXNpbmcgdGhlIHByb2JhYmlsaXR5Ci0gKiBvZiBvY2N1cnJlbmNlIG9mIHNvbWUgaW1wb3J0YW50IHR5cGVzIG9mIHJhY2UgY29uZGl0aW9ucy4KLSAqLwotc3RhdGljIGludAotcmN1X3RvcnR1cmVfZnFzKHZvaWQgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZxc19yZXN1bWVfdGltZTsKLQlpbnQgZnFzX2J1cnN0X3JlbWFpbmluZzsKLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfZnFzIHRhc2sgc3RhcnRlZCIpOwotCWRvIHsKLQkJZnFzX3Jlc3VtZV90aW1lID0gamlmZmllcyArIGZxc19zdHV0dGVyICogSFo7Ci0JCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllcywgZnFzX3Jlc3VtZV90aW1lKSAmJgotCQkgICAgICAgIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwotCQl9Ci0JCWZxc19idXJzdF9yZW1haW5pbmcgPSBmcXNfZHVyYXRpb247Ci0JCXdoaWxlIChmcXNfYnVyc3RfcmVtYWluaW5nID4gMCAmJgotCQkgICAgICAgIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQkJY3VyX29wcy0+ZnFzKCk7Ci0JCQl1ZGVsYXkoZnFzX2hvbGRvZmYpOwotCQkJZnFzX2J1cnN0X3JlbWFpbmluZyAtPSBmcXNfaG9sZG9mZjsKLQkJfQotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mcXMiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2ZxcyB0YXNrIHN0b3BwaW5nIik7Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX2ZxcyIpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJDVSB0b3J0dXJlIHdyaXRlciBrdGhyZWFkLiAgUmVwZWF0ZWRseSBzdWJzdGl0dXRlcyBhIG5ldyBzdHJ1Y3R1cmUKLSAqIGZvciB0aGF0IHBvaW50ZWQgdG8gYnkgcmN1X3RvcnR1cmVfY3VycmVudCwgZnJlZWluZyB0aGUgb2xkIHN0cnVjdHVyZQotICogYWZ0ZXIgYSBzZXJpZXMgb2YgZ3JhY2UgcGVyaW9kcyAodGhlICJwaXBlbGluZSIpLgotICovCi1zdGF0aWMgaW50Ci1yY3VfdG9ydHVyZV93cml0ZXIodm9pZCAqYXJnKQotewotCWJvb2wgZXhwOwotCWludCBpOwotCXN0cnVjdCByY3VfdG9ydHVyZSAqcnA7Ci0Jc3RydWN0IHJjdV90b3J0dXJlICpycDE7Ci0Jc3RydWN0IHJjdV90b3J0dXJlICpvbGRfcnA7Ci0Jc3RhdGljIERFRklORV9SQ1VfUkFORE9NKHJhbmQpOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV93cml0ZXIgdGFzayBzdGFydGVkIik7Ci0Jc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0KLQlkbyB7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCQlycCA9IHJjdV90b3J0dXJlX2FsbG9jKCk7Ci0JCWlmIChycCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXJwLT5ydG9ydF9waXBlX2NvdW50ID0gMDsKLQkJdWRlbGF5KHJjdV9yYW5kb20oJnJhbmQpICYgMHgzZmYpOwotCQlvbGRfcnAgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2socmN1X3RvcnR1cmVfY3VycmVudCwKLQkJCQkJICAgICAgIGN1cnJlbnQgPT0gd3JpdGVyX3Rhc2spOwotCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMTsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHJjdV90b3J0dXJlX2N1cnJlbnQsIHJwKTsKLQkJc21wX3dtYigpOyAvKiBNb2RzIHRvIG9sZF9ycCBtdXN0IGZvbGxvdyByY3VfYXNzaWduX3BvaW50ZXIoKSAqLwotCQlpZiAob2xkX3JwKSB7Ci0JCQlpID0gb2xkX3JwLT5ydG9ydF9waXBlX2NvdW50OwotCQkJaWYgKGkgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikKLQkJCQlpID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JCQlhdG9taWNfaW5jKCZyY3VfdG9ydHVyZV93Y291bnRbaV0pOwotCQkJb2xkX3JwLT5ydG9ydF9waXBlX2NvdW50Kys7Ci0JCQlpZiAoZ3Bfbm9ybWFsID09IGdwX2V4cCkKLQkJCQlleHAgPSAhIShyY3VfcmFuZG9tKCZyYW5kKSAmIDB4ODApOwotCQkJZWxzZQotCQkJCWV4cCA9IGdwX2V4cDsKLQkJCWlmICghZXhwKSB7Ci0JCQkJY3VyX29wcy0+ZGVmZXJyZWRfZnJlZShvbGRfcnApOwotCQkJfSBlbHNlIHsKLQkJCQljdXJfb3BzLT5leHBfc3luYygpOwotCQkJCWxpc3RfYWRkKCZvbGRfcnAtPnJ0b3J0X2ZyZWUsCi0JCQkJCSAmcmN1X3RvcnR1cmVfcmVtb3ZlZCk7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJwLCBycDEsCi0JCQkJCQkJICZyY3VfdG9ydHVyZV9yZW1vdmVkLAotCQkJCQkJCSBydG9ydF9mcmVlKSB7Ci0JCQkJCWkgPSBycC0+cnRvcnRfcGlwZV9jb3VudDsKLQkJCQkJaWYgKGkgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikKLQkJCQkJCWkgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKLQkJCQkJYXRvbWljX2luYygmcmN1X3RvcnR1cmVfd2NvdW50W2ldKTsKLQkJCQkJaWYgKCsrcnAtPnJ0b3J0X3BpcGVfY291bnQgPj0KLQkJCQkJICAgIFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7Ci0JCQkJCQlycC0+cnRvcnRfbWJ0ZXN0ID0gMDsKLQkJCQkJCWxpc3RfZGVsKCZycC0+cnRvcnRfZnJlZSk7Ci0JCQkJCQlyY3VfdG9ydHVyZV9mcmVlKHJwKTsKLQkJCQkJfQotCQkJCSB9Ci0JCQl9Ci0JCX0KLQkJcmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3MoKytyY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb24pOwotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV93cml0ZXIiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0b3BwaW5nIik7Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3dyaXRlciIpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJDVSB0b3J0dXJlIGZha2Ugd3JpdGVyIGt0aHJlYWQuICBSZXBlYXRlZGx5IGNhbGxzIHN5bmMsIHdpdGggYSByYW5kb20KLSAqIGRlbGF5IGJldHdlZW4gY2FsbHMuCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX2Zha2V3cml0ZXIodm9pZCAqYXJnKQotewotCURFRklORV9SQ1VfUkFORE9NKHJhbmQpOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RhcnRlZCIpOwotCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCi0JZG8gewotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxICsgcmN1X3JhbmRvbSgmcmFuZCklMTApOwotCQl1ZGVsYXkocmN1X3JhbmRvbSgmcmFuZCkgJiAweDNmZik7Ci0JCWlmIChjdXJfb3BzLT5jYl9iYXJyaWVyICE9IE5VTEwgJiYKLQkJICAgIHJjdV9yYW5kb20oJnJhbmQpICUgKG5mYWtld3JpdGVycyAqIDgpID09IDApIHsKLQkJCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKLQkJfSBlbHNlIGlmIChncF9ub3JtYWwgPT0gZ3BfZXhwKSB7Ci0JCQlpZiAocmN1X3JhbmRvbSgmcmFuZCkgJiAweDgwKQotCQkJCWN1cl9vcHMtPnN5bmMoKTsKLQkJCWVsc2UKLQkJCQljdXJfb3BzLT5leHBfc3luYygpOwotCQl9IGVsc2UgaWYgKGdwX25vcm1hbCkgewotCQkJY3VyX29wcy0+c3luYygpOwotCQl9IGVsc2UgewotCQkJY3VyX29wcy0+ZXhwX3N5bmMoKTsKLQkJfQotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCA9PSBGVUxMU1RPUF9ET05UU1RPUCk7Ci0KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Zha2V3cml0ZXIgdGFzayBzdG9wcGluZyIpOwotCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCXJldHVybiAwOwotfQotCi12b2lkIHJjdXRvcnR1cmVfdHJhY2VfZHVtcCh2b2lkKQotewotCXN0YXRpYyBhdG9taWNfdCBiZWVuaGVyZSA9IEFUT01JQ19JTklUKDApOwotCi0JaWYgKGF0b21pY19yZWFkKCZiZWVuaGVyZSkpCi0JCXJldHVybjsKLQlpZiAoYXRvbWljX3hjaGcoJmJlZW5oZXJlLCAxKSAhPSAwKQotCQlyZXR1cm47Ci0JZnRyYWNlX2R1bXAoRFVNUF9BTEwpOwotfQotCi0vKgotICogUkNVIHRvcnR1cmUgcmVhZGVyIGZyb20gdGltZXIgaGFuZGxlci4gIERlcmVmZXJlbmNlcyByY3VfdG9ydHVyZV9jdXJyZW50LAotICogaW5jcmVtZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBpcGVsaW5lIGFycmF5LiAgVGhlCi0gKiBjb3VudGVyIGluIHRoZSBlbGVtZW50IHNob3VsZCBuZXZlciBiZSBncmVhdGVyIHRoYW4gMSwgb3RoZXJ3aXNlLCB0aGUKLSAqIFJDVSBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4uCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX3RpbWVyKHVuc2lnbmVkIGxvbmcgdW51c2VkKQotewotCWludCBpZHg7Ci0JaW50IGNvbXBsZXRlZDsKLQlpbnQgY29tcGxldGVkX2VuZDsKLQlzdGF0aWMgREVGSU5FX1JDVV9SQU5ET00ocmFuZCk7Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhyYW5kX2xvY2spOwotCXN0cnVjdCByY3VfdG9ydHVyZSAqcDsKLQlpbnQgcGlwZV9jb3VudDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdHM7Ci0KLQlpZHggPSBjdXJfb3BzLT5yZWFkbG9jaygpOwotCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOwotCXRzID0gcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKCk7Ci0JcCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhyY3VfdG9ydHVyZV9jdXJyZW50LAotCQkJCSAgcmN1X3JlYWRfbG9ja19iaF9oZWxkKCkgfHwKLQkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8Ci0JCQkJICBzcmN1X3JlYWRfbG9ja19oZWxkKCZzcmN1X2N0bCkpOwotCWlmIChwID09IE5VTEwpIHsKLQkJLyogTGVhdmUgYmVjYXVzZSByY3VfdG9ydHVyZV93cml0ZXIgaXMgbm90IHlldCB1bmRlcndheSAqLwotCQljdXJfb3BzLT5yZWFkdW5sb2NrKGlkeCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHAtPnJ0b3J0X21idGVzdCA9PSAwKQotCQlhdG9taWNfaW5jKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpOwotCXNwaW5fbG9jaygmcmFuZF9sb2NrKTsKLQljdXJfb3BzLT5yZWFkX2RlbGF5KCZyYW5kKTsKLQluX3JjdV90b3J0dXJlX3RpbWVycysrOwotCXNwaW5fdW5sb2NrKCZyYW5kX2xvY2spOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCXBpcGVfY291bnQgPSBwLT5ydG9ydF9waXBlX2NvdW50OwotCWlmIChwaXBlX2NvdW50ID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pIHsKLQkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dC4uLiAqLwotCQlwaXBlX2NvdW50ID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JfQotCWNvbXBsZXRlZF9lbmQgPSBjdXJfb3BzLT5jb21wbGV0ZWQoKTsKLQlpZiAocGlwZV9jb3VudCA+IDEpIHsKLQkJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAmcC0+cnRvcnRfcmN1LCB0cywKLQkJCQkJICBjb21wbGV0ZWQsIGNvbXBsZXRlZF9lbmQpOwotCQlyY3V0b3J0dXJlX3RyYWNlX2R1bXAoKTsKLQl9Ci0JX190aGlzX2NwdV9pbmMocmN1X3RvcnR1cmVfY291bnRbcGlwZV9jb3VudF0pOwotCWNvbXBsZXRlZCA9IGNvbXBsZXRlZF9lbmQgLSBjb21wbGV0ZWQ7Ci0JaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7Ci0JCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KLQkJY29tcGxldGVkID0gUkNVX1RPUlRVUkVfUElQRV9MRU47Ci0JfQotCV9fdGhpc19jcHVfaW5jKHJjdV90b3J0dXJlX2JhdGNoW2NvbXBsZXRlZF0pOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0JY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwotfQotCi0vKgotICogUkNVIHRvcnR1cmUgcmVhZGVyIGt0aHJlYWQuICBSZXBlYXRlZGx5IGRlcmVmZXJlbmNlcyByY3VfdG9ydHVyZV9jdXJyZW50LAotICogaW5jcmVtZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBpcGVsaW5lIGFycmF5LiAgVGhlCi0gKiBjb3VudGVyIGluIHRoZSBlbGVtZW50IHNob3VsZCBuZXZlciBiZSBncmVhdGVyIHRoYW4gMSwgb3RoZXJ3aXNlLCB0aGUKLSAqIFJDVSBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4uCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX3JlYWRlcih2b2lkICphcmcpCi17Ci0JaW50IGNvbXBsZXRlZDsKLQlpbnQgY29tcGxldGVkX2VuZDsKLQlpbnQgaWR4OwotCURFRklORV9SQ1VfUkFORE9NKHJhbmQpOwotCXN0cnVjdCByY3VfdG9ydHVyZSAqcDsKLQlpbnQgcGlwZV9jb3VudDsKLQlzdHJ1Y3QgdGltZXJfbGlzdCB0OwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0czsKLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfcmVhZGVyIHRhc2sgc3RhcnRlZCIpOwotCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxX2NhcGFibGUpCi0JCXNldHVwX3RpbWVyX29uX3N0YWNrKCZ0LCByY3VfdG9ydHVyZV90aW1lciwgMCk7Ci0KLQlkbyB7Ci0JCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxX2NhcGFibGUpIHsKLQkJCWlmICghdGltZXJfcGVuZGluZygmdCkpCi0JCQkJbW9kX3RpbWVyKCZ0LCBqaWZmaWVzICsgMSk7Ci0JCX0KLQkJaWR4ID0gY3VyX29wcy0+cmVhZGxvY2soKTsKLQkJY29tcGxldGVkID0gY3VyX29wcy0+Y29tcGxldGVkKCk7Ci0JCXRzID0gcmN1X3RyYWNlX2Nsb2NrX2xvY2FsKCk7Ci0JCXAgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2socmN1X3RvcnR1cmVfY3VycmVudCwKLQkJCQkJICByY3VfcmVhZF9sb2NrX2JoX2hlbGQoKSB8fAotCQkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8Ci0JCQkJCSAgc3JjdV9yZWFkX2xvY2tfaGVsZCgmc3JjdV9jdGwpKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJLyogV2FpdCBmb3IgcmN1X3RvcnR1cmVfd3JpdGVyIHRvIGdldCB1bmRlcndheSAqLwotCQkJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChwLT5ydG9ydF9tYnRlc3QgPT0gMCkKLQkJCWF0b21pY19pbmMoJm5fcmN1X3RvcnR1cmVfbWJlcnJvcik7Ci0JCWN1cl9vcHMtPnJlYWRfZGVsYXkoJnJhbmQpOwotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJcGlwZV9jb3VudCA9IHAtPnJ0b3J0X3BpcGVfY291bnQ7Ci0JCWlmIChwaXBlX2NvdW50ID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pIHsKLQkJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KLQkJCXBpcGVfY291bnQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKLQkJfQotCQljb21wbGV0ZWRfZW5kID0gY3VyX29wcy0+Y29tcGxldGVkKCk7Ci0JCWlmIChwaXBlX2NvdW50ID4gMSkgewotCQkJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAmcC0+cnRvcnRfcmN1LAotCQkJCQkJICB0cywgY29tcGxldGVkLCBjb21wbGV0ZWRfZW5kKTsKLQkJCXJjdXRvcnR1cmVfdHJhY2VfZHVtcCgpOwotCQl9Ci0JCV9fdGhpc19jcHVfaW5jKHJjdV90b3J0dXJlX2NvdW50W3BpcGVfY291bnRdKTsKLQkJY29tcGxldGVkID0gY29tcGxldGVkX2VuZCAtIGNvbXBsZXRlZDsKLQkJaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7Ci0JCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYnV0Li4uICovCi0JCQljb21wbGV0ZWQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKLQkJfQotCQlfX3RoaXNfY3B1X2luYyhyY3VfdG9ydHVyZV9iYXRjaFtjb21wbGV0ZWRdKTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwotCQlzY2hlZHVsZSgpOwotCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9yZWFkZXIiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0b3BwaW5nIik7Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3JlYWRlciIpOwotCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxX2NhcGFibGUpCi0JCWRlbF90aW1lcl9zeW5jKCZ0KTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYW4gUkNVLXRvcnR1cmUgc3RhdGlzdGljcyBtZXNzYWdlIGluIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgotICovCi1zdGF0aWMgdm9pZAotcmN1X3RvcnR1cmVfcHJpbnRrKGNoYXIgKnBhZ2UpCi17Ci0JaW50IGNwdTsKLQlpbnQgaTsKLQlsb25nIHBpcGVzdW1tYXJ5W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0gPSB7IDAgfTsKLQlsb25nIGJhdGNoc3VtbWFyeVtSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDFdID0geyAwIH07Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDE7IGkrKykgewotCQkJcGlwZXN1bW1hcnlbaV0gKz0gcGVyX2NwdShyY3VfdG9ydHVyZV9jb3VudCwgY3B1KVtpXTsKLQkJCWJhdGNoc3VtbWFyeVtpXSArPSBwZXJfY3B1KHJjdV90b3J0dXJlX2JhdGNoLCBjcHUpW2ldOwotCQl9Ci0JfQotCWZvciAoaSA9IFJDVV9UT1JUVVJFX1BJUEVfTEVOIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKHBpcGVzdW1tYXJ5W2ldICE9IDApCi0JCQlicmVhazsKLQl9Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlcyVzICIsIHRvcnR1cmVfdHlwZSwgVE9SVFVSRV9GTEFHKTsKLQlwYWdlICs9IHNwcmludGYocGFnZSwKLQkJICAgICAgICJydGM6ICVwIHZlcjogJWx1IHRmbGU6ICVkIHJ0YTogJWQgcnRhZjogJWQgcnRmOiAlZCAiLAotCQkgICAgICAgcmN1X3RvcnR1cmVfY3VycmVudCwKLQkJICAgICAgIHJjdV90b3J0dXJlX2N1cnJlbnRfdmVyc2lvbiwKLQkJICAgICAgIGxpc3RfZW1wdHkoJnJjdV90b3J0dXJlX2ZyZWVsaXN0KSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jKSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwpLAotCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfZnJlZSkpOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAicnRtYmU6ICVkIHJ0YmtlOiAlbGQgcnRicmU6ICVsZCAiLAotCQkgICAgICAgYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvciksCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yLAotCQkgICAgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yKTsKLQlwYWdlICs9IHNwcmludGYocGFnZSwgInJ0YmY6ICVsZCBydGI6ICVsZCBudDogJWxkICIsCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUsCi0JCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0cywKLQkJICAgICAgIG5fcmN1X3RvcnR1cmVfdGltZXJzKTsKLQlwYWdlICs9IHNwcmludGYocGFnZSwKLQkJICAgICAgICJvbm9mZjogJWxkLyVsZDolbGQvJWxkICVkLCVkOiVkLCVkICVsdTolbHUgKEhaPSVkKSAiLAotCQkgICAgICAgbl9vbmxpbmVfc3VjY2Vzc2VzLCBuX29ubGluZV9hdHRlbXB0cywKLQkJICAgICAgIG5fb2ZmbGluZV9zdWNjZXNzZXMsIG5fb2ZmbGluZV9hdHRlbXB0cywKLQkJICAgICAgIG1pbl9vbmxpbmUsIG1heF9vbmxpbmUsCi0JCSAgICAgICBtaW5fb2ZmbGluZSwgbWF4X29mZmxpbmUsCi0JCSAgICAgICBzdW1fb25saW5lLCBzdW1fb2ZmbGluZSwgSFopOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiYmFycmllcjogJWxkLyVsZDolbGQiLAotCQkgICAgICAgbl9iYXJyaWVyX3N1Y2Nlc3NlcywKLQkJICAgICAgIG5fYmFycmllcl9hdHRlbXB0cywKLQkJICAgICAgIG5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvcik7Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJcbiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOwotCWlmIChhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9tYmVycm9yKSAhPSAwIHx8Ci0JICAgIG5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvciAhPSAwIHx8Ci0JICAgIG5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IgIT0gMCB8fAotCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X3J0ZXJyb3IgIT0gMCB8fAotCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUgIT0gMCB8fAotCSAgICBpID4gMSkgewotCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiEhISAiKTsKLQkJYXRvbWljX2luYygmbl9yY3VfdG9ydHVyZV9lcnJvcik7Ci0JCVdBUk5fT05fT05DRSgxKTsKLQl9Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJSZWFkZXIgUGlwZTogIik7Ci0JZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQotCQlwYWdlICs9IHNwcmludGYocGFnZSwgIiAlbGQiLCBwaXBlc3VtbWFyeVtpXSk7Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJcbiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiUmVhZGVyIEJhdGNoOiAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxOyBpKyspCi0JCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiICVsZCIsIGJhdGNoc3VtbWFyeVtpXSk7Ci0JcGFnZSArPSBzcHJpbnRmKHBhZ2UsICJcbiVzJXMgIiwgdG9ydHVyZV90eXBlLCBUT1JUVVJFX0ZMQUcpOwotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiRnJlZS1CbG9jayBDaXJjdWxhdGlvbjogIik7Ci0JZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKSB7Ci0JCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiICVkIiwKLQkJCSAgICAgICBhdG9taWNfcmVhZCgmcmN1X3RvcnR1cmVfd2NvdW50W2ldKSk7Ci0JfQotCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiXG4iKTsKLQlpZiAoY3VyX29wcy0+c3RhdHMpCi0JCWN1cl9vcHMtPnN0YXRzKHBhZ2UpOwotfQotCi0vKgotICogUHJpbnQgdG9ydHVyZSBzdGF0aXN0aWNzLiAgQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgb25seQotICogb25lIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBhdCBhIGdpdmVuIHRpbWUhISEgIFRoaXMgaXMgbm9ybWFsbHkKLSAqIGFjY29tcGxpc2hlZCBieSByZWx5aW5nIG9uIHRoZSBtb2R1bGUgc3lzdGVtIHRvIG9ubHkgaGF2ZSBvbmUgY29weQotICogb2YgdGhlIG1vZHVsZSBsb2FkZWQsIGFuZCB0aGVuIGJ5IGdpdmluZyB0aGUgcmN1X3RvcnR1cmVfc3RhdHMKLSAqIGt0aHJlYWQgZnVsbCBjb250cm9sIChvciB0aGUgaW5pdC9jbGVhbnVwIGZ1bmN0aW9ucyB3aGVuIHJjdV90b3J0dXJlX3N0YXRzCi0gKiB0aHJlYWQgaXMgbm90IHJ1bm5pbmcpLgotICovCi1zdGF0aWMgdm9pZAotcmN1X3RvcnR1cmVfc3RhdHNfcHJpbnQodm9pZCkKLXsKLQlpbnQgc2l6ZSA9IG5yX2NwdV9pZHMgKiAyMDAgKyA4MTkyOwotCWNoYXIgKmJ1ZjsKLQotCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJcHJfZXJyKCJyY3UtdG9ydHVyZTogT3V0IG9mIG1lbW9yeSwgbmVlZDogJWQiLCBzaXplKTsKLQkJcmV0dXJuOwotCX0KLQlyY3VfdG9ydHVyZV9wcmludGsoYnVmKTsKLQlwcl9hbGVydCgiJXMiLCBidWYpOwotCWtmcmVlKGJ1Zik7Ci19Ci0KLS8qCi0gKiBQZXJpb2RpY2FsbHkgcHJpbnRzIHRvcnR1cmUgc3RhdGlzdGljcywgaWYgcGVyaW9kaWMgc3RhdGlzdGljcyBwcmludGluZwotICogd2FzIHNwZWNpZmllZCB2aWEgdGhlIHN0YXRfaW50ZXJ2YWwgbW9kdWxlIHBhcmFtZXRlci4KLSAqCi0gKiBObyBuZWVkIHRvIHdvcnJ5IGFib3V0IGZ1bGxzdG9wIGhlcmUsIHNpbmNlIHRoaXMgb25lIGRvZXNuJ3QgcmVmZXJlbmNlCi0gKiB2b2xhdGlsZSBzdGF0ZSBvciByZWdpc3RlciBjYWxsYmFja3MuCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX3N0YXRzKHZvaWQgKmFyZykKLXsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0YXRzIHRhc2sgc3RhcnRlZCIpOwotCWRvIHsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YXRfaW50ZXJ2YWwgKiBIWik7Ci0JCXJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7Ci0JCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zdGF0cyIpOwotCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc3RhdHMgdGFzayBzdG9wcGluZyIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJjdV9pZGxlX2NwdTsJLyogRm9yY2UgYWxsIHRvcnR1cmUgdGFza3Mgb2ZmIHRoaXMgQ1BVICovCi0KLS8qIFNodWZmbGUgdGFza3Mgc3VjaCB0aGF0IHdlIGFsbG93IEByY3VfaWRsZV9jcHUgdG8gYmVjb21lIGlkbGUuIEEgc3BlY2lhbCBjYXNlCi0gKiBpcyB3aGVuIEByY3VfaWRsZV9jcHUgPSAtMSwgd2hlbiB3ZSBhbGxvdyB0aGUgdGFza3MgdG8gcnVuIG9uIGFsbCBDUFVzLgotICovCi1zdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9zaHVmZmxlX3Rhc2tzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQljcHVtYXNrX3NldGFsbChzaHVmZmxlX3RtcF9tYXNrKTsKLQlnZXRfb25saW5lX2NwdXMoKTsKLQotCS8qIE5vIHBvaW50IGluIHNodWZmbGluZyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBvbmxpbmUgQ1BVIChleDogVVApICovCi0JaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpIHsKLQkJcHV0X29ubGluZV9jcHVzKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocmN1X2lkbGVfY3B1ICE9IC0xKQotCQljcHVtYXNrX2NsZWFyX2NwdShyY3VfaWRsZV9jcHUsIHNodWZmbGVfdG1wX21hc2spOwotCi0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgc2h1ZmZsZV90bXBfbWFzayk7Ci0KLQlpZiAocmVhZGVyX3Rhc2tzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBucmVhbHJlYWRlcnM7IGkrKykKLQkJCWlmIChyZWFkZXJfdGFza3NbaV0pCi0JCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIocmVhZGVyX3Rhc2tzW2ldLAotCQkJCQkJICAgICBzaHVmZmxlX3RtcF9tYXNrKTsKLQl9Ci0JaWYgKGZha2V3cml0ZXJfdGFza3MpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKQotCQkJaWYgKGZha2V3cml0ZXJfdGFza3NbaV0pCi0JCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoZmFrZXdyaXRlcl90YXNrc1tpXSwKLQkJCQkJCSAgICAgc2h1ZmZsZV90bXBfbWFzayk7Ci0JfQotCWlmICh3cml0ZXJfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIod3JpdGVyX3Rhc2ssIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChzdGF0c190YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzdGF0c190YXNrLCBzaHVmZmxlX3RtcF9tYXNrKTsKLQlpZiAoc3R1dHRlcl90YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzdHV0dGVyX3Rhc2ssIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChmcXNfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoZnFzX3Rhc2ssIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChzaHV0ZG93bl90YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzaHV0ZG93bl90YXNrLCBzaHVmZmxlX3RtcF9tYXNrKTsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQlpZiAob25vZmZfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIob25vZmZfdGFzaywgc2h1ZmZsZV90bXBfbWFzayk7Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwotCWlmIChzdGFsbF90YXNrKQotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzdGFsbF90YXNrLCBzaHVmZmxlX3RtcF9tYXNrKTsKLQlpZiAoYmFycmllcl9jYnNfdGFza3MpCi0JCWZvciAoaSA9IDA7IGkgPCBuX2JhcnJpZXJfY2JzOyBpKyspCi0JCQlpZiAoYmFycmllcl9jYnNfdGFza3NbaV0pCi0JCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoYmFycmllcl9jYnNfdGFza3NbaV0sCi0JCQkJCQkgICAgIHNodWZmbGVfdG1wX21hc2spOwotCWlmIChiYXJyaWVyX3Rhc2spCi0JCXNldF9jcHVzX2FsbG93ZWRfcHRyKGJhcnJpZXJfdGFzaywgc2h1ZmZsZV90bXBfbWFzayk7Ci0KLQlpZiAocmN1X2lkbGVfY3B1ID09IC0xKQotCQlyY3VfaWRsZV9jcHUgPSBudW1fb25saW5lX2NwdXMoKSAtIDE7Ci0JZWxzZQotCQlyY3VfaWRsZV9jcHUtLTsKLQotCXB1dF9vbmxpbmVfY3B1cygpOwotfQotCi0vKiBTaHVmZmxlIHRhc2tzIGFjcm9zcyBDUFVzLCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgZWFjaCBDUFUgaW4gdGhlCi0gKiBzeXN0ZW0gdG8gYmVjb21lIGlkbGUgYXQgYSB0aW1lIGFuZCBjdXQgb2ZmIGl0cyB0aW1lciB0aWNrcy4gVGhpcyBpcyBtZWFudAotICogdG8gdGVzdCB0aGUgc3VwcG9ydCBmb3Igc3VjaCB0aWNrbGVzcyBpZGxlIENQVSBpbiBSQ1UuCi0gKi8KLXN0YXRpYyBpbnQKLXJjdV90b3J0dXJlX3NodWZmbGUodm9pZCAqYXJnKQotewotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc2h1ZmZsZSB0YXNrIHN0YXJ0ZWQiKTsKLQlkbyB7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzaHVmZmxlX2ludGVydmFsICogSFopOwotCQlyY3VfdG9ydHVyZV9zaHVmZmxlX3Rhc2tzKCk7Ci0JCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9zaHVmZmxlIik7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7Ci0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9zaHVmZmxlIHRhc2sgc3RvcHBpbmciKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogQ2F1c2UgdGhlIHJjdXRvcnR1cmUgdGVzdCB0byAic3R1dHRlciIsIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBhbGwKLSAqIHRocmVhZHMgcGVyaW9kaWNhbGx5LgotICovCi1zdGF0aWMgaW50Ci1yY3VfdG9ydHVyZV9zdHV0dGVyKHZvaWQgKmFyZykKLXsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0dXR0ZXIgdGFzayBzdGFydGVkIik7Ci0JZG8gewotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc3R1dHRlciAqIEhaKTsKLQkJc3R1dHRlcl9wYXVzZV90ZXN0ID0gMTsKLQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc3R1dHRlciAqIEhaKTsKLQkJc3R1dHRlcl9wYXVzZV90ZXN0ID0gMDsKLQkJcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3N0dXR0ZXIiKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0dXR0ZXIgdGFzayBzdG9wcGluZyIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzICpjdXJfb3BzLCBjb25zdCBjaGFyICp0YWcpCi17Ci0JcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKLQkJICItLS0gJXM6IG5yZWFkZXJzPSVkIG5mYWtld3JpdGVycz0lZCAiCi0JCSAic3RhdF9pbnRlcnZhbD0lZCB2ZXJib3NlPSVkIHRlc3Rfbm9faWRsZV9oej0lZCAiCi0JCSAic2h1ZmZsZV9pbnRlcnZhbD0lZCBzdHV0dGVyPSVkIGlycXJlYWRlcj0lZCAiCi0JCSAiZnFzX2R1cmF0aW9uPSVkIGZxc19ob2xkb2ZmPSVkIGZxc19zdHV0dGVyPSVkICIKLQkJICJ0ZXN0X2Jvb3N0PSVkLyVkIHRlc3RfYm9vc3RfaW50ZXJ2YWw9JWQgIgotCQkgInRlc3RfYm9vc3RfZHVyYXRpb249JWQgc2h1dGRvd25fc2Vjcz0lZCAiCi0JCSAic3RhbGxfY3B1PSVkIHN0YWxsX2NwdV9ob2xkb2ZmPSVkICIKLQkJICJuX2JhcnJpZXJfY2JzPSVkICIKLQkJICJvbm9mZl9pbnRlcnZhbD0lZCBvbm9mZl9ob2xkb2ZmPSVkXG4iLAotCQkgdG9ydHVyZV90eXBlLCB0YWcsIG5yZWFscmVhZGVycywgbmZha2V3cml0ZXJzLAotCQkgc3RhdF9pbnRlcnZhbCwgdmVyYm9zZSwgdGVzdF9ub19pZGxlX2h6LCBzaHVmZmxlX2ludGVydmFsLAotCQkgc3R1dHRlciwgaXJxcmVhZGVyLCBmcXNfZHVyYXRpb24sIGZxc19ob2xkb2ZmLCBmcXNfc3R1dHRlciwKLQkJIHRlc3RfYm9vc3QsIGN1cl9vcHMtPmNhbl9ib29zdCwKLQkJIHRlc3RfYm9vc3RfaW50ZXJ2YWwsIHRlc3RfYm9vc3RfZHVyYXRpb24sIHNodXRkb3duX3NlY3MsCi0JCSBzdGFsbF9jcHUsIHN0YWxsX2NwdV9ob2xkb2ZmLAotCQkgbl9iYXJyaWVyX2NicywKLQkJIG9ub2ZmX2ludGVydmFsLCBvbm9mZl9ob2xkb2ZmKTsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByY3V0b3J0dXJlX3NodXRkb3duX25iID0gewotCS5ub3RpZmllcl9jYWxsID0gcmN1dG9ydHVyZV9zaHV0ZG93bl9ub3RpZnksCi19OwotCi1zdGF0aWMgdm9pZCByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChpbnQgY3B1KQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCWlmIChib29zdF90YXNrc1tjcHVdID09IE5VTEwpCi0JCXJldHVybjsKLQltdXRleF9sb2NrKCZib29zdF9tdXRleCk7Ci0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9ib29zdCB0YXNrIik7Ci0JdCA9IGJvb3N0X3Rhc2tzW2NwdV07Ci0JYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZib29zdF9tdXRleCk7Ci0KLQkvKiBUaGlzIG11c3QgYmUgb3V0c2lkZSBvZiB0aGUgbXV0ZXgsIG90aGVyd2lzZSBkZWFkbG9jayEgKi8KLQlrdGhyZWFkX3N0b3AodCk7Ci0JYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaW50IGNwdSkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKGJvb3N0X3Rhc2tzW2NwdV0gIT0gTlVMTCkKLQkJcmV0dXJuIDA7ICAvKiBBbHJlYWR5IGNyZWF0ZWQsIG5vdGhpbmcgbW9yZSB0byBkby4gKi8KLQotCS8qIERvbid0IGFsbG93IHRpbWUgcmVjYWxjdWxhdGlvbiB3aGlsZSBjcmVhdGluZyBhIG5ldyB0YXNrLiAqLwotCW11dGV4X2xvY2soJmJvb3N0X211dGV4KTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIkNyZWF0aW5nIHJjdV90b3J0dXJlX2Jvb3N0IHRhc2siKTsKLQlib29zdF90YXNrc1tjcHVdID0ga3RocmVhZF9jcmVhdGVfb25fbm9kZShyY3VfdG9ydHVyZV9ib29zdCwgTlVMTCwKLQkJCQkJCSAgY3B1X3RvX25vZGUoY3B1KSwKLQkJCQkJCSAgInJjdV90b3J0dXJlX2Jvb3N0Iik7Ci0JaWYgKElTX0VSUihib29zdF90YXNrc1tjcHVdKSkgewotCQlyZXR2YWwgPSBQVFJfRVJSKGJvb3N0X3Rhc2tzW2NwdV0pOwotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Jvb3N0IHRhc2sgY3JlYXRlIGZhaWxlZCIpOwotCQluX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yKys7Ci0JCWJvb3N0X3Rhc2tzW2NwdV0gPSBOVUxMOwotCQltdXRleF91bmxvY2soJmJvb3N0X211dGV4KTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0Ja3RocmVhZF9iaW5kKGJvb3N0X3Rhc2tzW2NwdV0sIGNwdSk7Ci0Jd2FrZV91cF9wcm9jZXNzKGJvb3N0X3Rhc2tzW2NwdV0pOwotCW11dGV4X3VubG9jaygmYm9vc3RfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi0vKgotICogQ2F1c2UgdGhlIHJjdXRvcnR1cmUgdGVzdCB0byBzaHV0ZG93biB0aGUgc3lzdGVtIGFmdGVyIHRoZSB0ZXN0IGhhcwotICogcnVuIGZvciB0aGUgdGltZSBzcGVjaWZpZWQgYnkgdGhlIHNodXRkb3duX3NlY3MgbW9kdWxlIHBhcmFtZXRlci4KLSAqLwotc3RhdGljIGludAotcmN1X3RvcnR1cmVfc2h1dGRvd24odm9pZCAqYXJnKQotewotCWxvbmcgZGVsdGE7Ci0JdW5zaWduZWQgbG9uZyBqaWZmaWVzX3NuYXA7Ci0KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3NodXRkb3duIHRhc2sgc3RhcnRlZCIpOwotCWppZmZpZXNfc25hcCA9IEFDQ0VTU19PTkNFKGppZmZpZXMpOwotCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllc19zbmFwLCBzaHV0ZG93bl90aW1lKSAmJgotCSAgICAgICAha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWRlbHRhID0gc2h1dGRvd25fdGltZSAtIGppZmZpZXNfc25hcDsKLQkJaWYgKHZlcmJvc2UpCi0JCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCSAicmN1X3RvcnR1cmVfc2h1dGRvd24gdGFzazogJWx1IGppZmZpZXMgcmVtYWluaW5nXG4iLAotCQkJCSB0b3J0dXJlX3R5cGUsIGRlbHRhKTsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGRlbHRhKTsKLQkJamlmZmllc19zbmFwID0gQUNDRVNTX09OQ0UoamlmZmllcyk7Ci0JfQotCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9zaHV0ZG93biB0YXNrIHN0b3BwaW5nIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE9LLCBzaHV0IGRvd24gdGhlIHN5c3RlbS4gKi8KLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc2h1dGRvd24gdGFzayBzaHV0dGluZyBkb3duIHN5c3RlbSIpOwotCXNodXRkb3duX3Rhc2sgPSBOVUxMOwkvKiBBdm9pZCBzZWxmLWtpbGwgZGVhZGxvY2suICovCi0JcmN1X3RvcnR1cmVfY2xlYW51cCgpOwkvKiBHZXQgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBtZXNzYWdlLiAqLwotCWtlcm5lbF9wb3dlcl9vZmYoKTsJLyogU2h1dCBkb3duIHRoZSBzeXN0ZW0uICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQotLyoKLSAqIEV4ZWN1dGUgcmFuZG9tIENQVS1ob3RwbHVnIG9wZXJhdGlvbnMgYXQgdGhlIGludGVydmFsIHNwZWNpZmllZAotICogYnkgdGhlIG9ub2ZmX2ludGVydmFsLgotICovCi1zdGF0aWMgaW50Ci1yY3VfdG9ydHVyZV9vbm9mZih2b2lkICphcmcpCi17Ci0JaW50IGNwdTsKLQl1bnNpZ25lZCBsb25nIGRlbHRhOwotCWludCBtYXhjcHUgPSAtMTsKLQlERUZJTkVfUkNVX1JBTkRPTShyYW5kKTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgc3RhcnR0aW1lOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9vbm9mZiB0YXNrIHN0YXJ0ZWQiKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJbWF4Y3B1ID0gY3B1OwotCVdBUk5fT04obWF4Y3B1IDwgMCk7Ci0JaWYgKG9ub2ZmX2hvbGRvZmYgPiAwKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfb25vZmYgYmVnaW4gaG9sZG9mZiIpOwotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUob25vZmZfaG9sZG9mZiAqIEhaKTsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9vbm9mZiBlbmQgaG9sZG9mZiIpOwotCX0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQljcHUgPSAocmN1X3JhbmRvbSgmcmFuZCkgPj4gNCkgJSAobWF4Y3B1ICsgMSk7Ci0JCWlmIChjcHVfb25saW5lKGNwdSkgJiYgY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmluZyAlZFxuIiwKLQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKLQkJCXN0YXJ0dGltZSA9IGppZmZpZXM7Ci0JCQluX29mZmxpbmVfYXR0ZW1wdHMrKzsKLQkJCXJldCA9IGNwdV9kb3duKGNwdSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCi0JCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmUgJWQgZmFpbGVkOiBlcnJubyAlZFxuIiwKLQkJCQkJCSB0b3J0dXJlX3R5cGUsIGNwdSwgcmV0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCi0JCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmVkICVkXG4iLAotCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKLQkJCQluX29mZmxpbmVfc3VjY2Vzc2VzKys7Ci0JCQkJZGVsdGEgPSBqaWZmaWVzIC0gc3RhcnR0aW1lOwotCQkJCXN1bV9vZmZsaW5lICs9IGRlbHRhOwotCQkJCWlmIChtaW5fb2ZmbGluZSA8IDApIHsKLQkJCQkJbWluX29mZmxpbmUgPSBkZWx0YTsKLQkJCQkJbWF4X29mZmxpbmUgPSBkZWx0YTsKLQkJCQl9Ci0JCQkJaWYgKG1pbl9vZmZsaW5lID4gZGVsdGEpCi0JCQkJCW1pbl9vZmZsaW5lID0gZGVsdGE7Ci0JCQkJaWYgKG1heF9vZmZsaW5lIDwgZGVsdGEpCi0JCQkJCW1heF9vZmZsaW5lID0gZGVsdGE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCQkgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6IG9ubGluaW5nICVkXG4iLAotCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUpOwotCQkJc3RhcnR0aW1lID0gamlmZmllczsKLQkJCW5fb25saW5lX2F0dGVtcHRzKys7Ci0JCQlyZXQgPSBjcHVfdXAoY3B1KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKLQkJCQkJCSAicmN1X3RvcnR1cmVfb25vZmYgdGFzazogb25saW5lICVkIGZhaWxlZDogZXJybm8gJWRcbiIsCi0JCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUsIHJldCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh2ZXJib3NlKQotCQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCQkJICJyY3VfdG9ydHVyZV9vbm9mZiB0YXNrOiBvbmxpbmVkICVkXG4iLAotCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKLQkJCQluX29ubGluZV9zdWNjZXNzZXMrKzsKLQkJCQlkZWx0YSA9IGppZmZpZXMgLSBzdGFydHRpbWU7Ci0JCQkJc3VtX29ubGluZSArPSBkZWx0YTsKLQkJCQlpZiAobWluX29ubGluZSA8IDApIHsKLQkJCQkJbWluX29ubGluZSA9IGRlbHRhOwotCQkJCQltYXhfb25saW5lID0gZGVsdGE7Ci0JCQkJfQotCQkJCWlmIChtaW5fb25saW5lID4gZGVsdGEpCi0JCQkJCW1pbl9vbmxpbmUgPSBkZWx0YTsKLQkJCQlpZiAobWF4X29ubGluZSA8IGRlbHRhKQotCQkJCQltYXhfb25saW5lID0gZGVsdGE7Ci0JCQl9Ci0JCX0KLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG9ub2ZmX2ludGVydmFsICogSFopOwotCX0KLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX29ub2ZmIHRhc2sgc3RvcHBpbmciKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotcmN1X3RvcnR1cmVfb25vZmZfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpZiAob25vZmZfaW50ZXJ2YWwgPD0gMCkKLQkJcmV0dXJuIDA7Ci0Jb25vZmZfdGFzayA9IGt0aHJlYWRfcnVuKHJjdV90b3J0dXJlX29ub2ZmLCBOVUxMLCAicmN1X3RvcnR1cmVfb25vZmYiKTsKLQlpZiAoSVNfRVJSKG9ub2ZmX3Rhc2spKSB7Ci0JCXJldCA9IFBUUl9FUlIob25vZmZfdGFzayk7Ci0JCW9ub2ZmX3Rhc2sgPSBOVUxMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfb25vZmZfY2xlYW51cCh2b2lkKQotewotCWlmIChvbm9mZl90YXNrID09IE5VTEwpCi0JCXJldHVybjsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX29ub2ZmIHRhc2siKTsKLQlrdGhyZWFkX3N0b3Aob25vZmZfdGFzayk7Ci0Jb25vZmZfdGFzayA9IE5VTEw7Ci19Ci0KLSNlbHNlIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KLQotc3RhdGljIGludAotcmN1X3RvcnR1cmVfb25vZmZfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9vbm9mZl9jbGVhbnVwKHZvaWQpCi17Ci19Ci0KLSNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCi0KLS8qCi0gKiBDUFUtc3RhbGwga3RocmVhZC4gIEl0IHdhaXRzIGFzIHNwZWNpZmllZCBieSBzdGFsbF9jcHVfaG9sZG9mZiwgdGhlbgotICogaW5kdWNlcyBhIENQVSBzdGFsbCBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5IHN0YWxsX2NwdS4KLSAqLwotc3RhdGljIGludCByY3VfdG9ydHVyZV9zdGFsbCh2b2lkICphcmdzKQotewotCXVuc2lnbmVkIGxvbmcgc3RvcF9hdDsKLQotCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc3RhbGwgdGFzayBzdGFydGVkIik7Ci0JaWYgKHN0YWxsX2NwdV9ob2xkb2ZmID4gMCkgewotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0YWxsIGJlZ2luIGhvbGRvZmYiKTsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YWxsX2NwdV9ob2xkb2ZmICogSFopOwotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0YWxsIGVuZCBob2xkb2ZmIik7Ci0JfQotCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXN0b3BfYXQgPSBnZXRfc2Vjb25kcygpICsgc3RhbGxfY3B1OwotCQkvKiBSQ1UgQ1BVIHN0YWxsIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGluIGZvbGxvd2luZyBjb2RlLiAqLwotCQlwcl9hbGVydCgicmN1X3RvcnR1cmVfc3RhbGwgc3RhcnQuXG4iKTsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJd2hpbGUgKFVMT05HX0NNUF9MVChnZXRfc2Vjb25kcygpLCBzdG9wX2F0KSkKLQkJCWNvbnRpbnVlOyAgLyogSW5kdWNlIFJDVSBDUFUgc3RhbGwgd2FybmluZy4gKi8KLQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXByX2FsZXJ0KCJyY3VfdG9ydHVyZV9zdGFsbCBlbmQuXG4iKTsKLQl9Ci0JcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3N0YWxsIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxMCAqIEhaKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogU3Bhd24gQ1BVLXN0YWxsIGt0aHJlYWQsIGlmIHN0YWxsX2NwdSBzcGVjaWZpZWQuICovCi1zdGF0aWMgaW50IF9faW5pdCByY3VfdG9ydHVyZV9zdGFsbF9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWlmIChzdGFsbF9jcHUgPD0gMCkKLQkJcmV0dXJuIDA7Ci0Jc3RhbGxfdGFzayA9IGt0aHJlYWRfcnVuKHJjdV90b3J0dXJlX3N0YWxsLCBOVUxMLCAicmN1X3RvcnR1cmVfc3RhbGwiKTsKLQlpZiAoSVNfRVJSKHN0YWxsX3Rhc2spKSB7Ci0JCXJldCA9IFBUUl9FUlIoc3RhbGxfdGFzayk7Ci0JCXN0YWxsX3Rhc2sgPSBOVUxMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIENQVS1zdGFsbCBrdGhyZWFkLCBpZiBvbmUgd2FzIHNwYXduZWQuICovCi1zdGF0aWMgdm9pZCByY3VfdG9ydHVyZV9zdGFsbF9jbGVhbnVwKHZvaWQpCi17Ci0JaWYgKHN0YWxsX3Rhc2sgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfc3RhbGxfdGFzay4iKTsKLQlrdGhyZWFkX3N0b3Aoc3RhbGxfdGFzayk7Ci0Jc3RhbGxfdGFzayA9IE5VTEw7Ci19Ci0KLS8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBSQ1UgYmFycmllciB0ZXN0aW5nLiAqLwotdm9pZCByY3VfdG9ydHVyZV9iYXJyaWVyX2NiZihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlhdG9taWNfaW5jKCZiYXJyaWVyX2Nic19pbnZva2VkKTsKLX0KLQotLyoga3RocmVhZCBmdW5jdGlvbiB0byByZWdpc3RlciBjYWxsYmFja3MgdXNlZCB0byB0ZXN0IFJDVSBiYXJyaWVycy4gKi8KLXN0YXRpYyBpbnQgcmN1X3RvcnR1cmVfYmFycmllcl9jYnModm9pZCAqYXJnKQotewotCWxvbmcgbXlpZCA9IChsb25nKWFyZzsKLQlib29sIGxhc3RwaGFzZSA9IDA7Ci0JYm9vbCBuZXdwaGFzZTsKLQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotCi0JaW5pdF9yY3VfaGVhZF9vbl9zdGFjaygmcmN1KTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXJfY2JzIHRhc2sgc3RhcnRlZCIpOwotCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWRvIHsKLQkJd2FpdF9ldmVudChiYXJyaWVyX2Nic193cVtteWlkXSwKLQkJCSAgIChuZXdwaGFzZSA9Ci0JCQkgICAgQUNDRVNTX09OQ0UoYmFycmllcl9waGFzZSkpICE9IGxhc3RwaGFzZSB8fAotCQkJICAga3RocmVhZF9zaG91bGRfc3RvcCgpIHx8Ci0JCQkgICBmdWxsc3RvcCAhPSBGVUxMU1RPUF9ET05UU1RPUCk7Ci0JCWxhc3RwaGFzZSA9IG5ld3BoYXNlOwotCQlzbXBfbWIoKTsgLyogZW5zdXJlIGJhcnJpZXJfcGhhc2UgbG9hZCBiZWZvcmUgLT5jYWxsKCkuICovCi0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgZnVsbHN0b3AgIT0gRlVMTFNUT1BfRE9OVFNUT1ApCi0JCQlicmVhazsKLQkJY3VyX29wcy0+Y2FsbCgmcmN1LCByY3VfdG9ydHVyZV9iYXJyaWVyX2NiZik7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZiYXJyaWVyX2Nic19jb3VudCkpCi0JCQl3YWtlX3VwKCZiYXJyaWVyX3dxKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXJfY2JzIHRhc2sgc3RvcHBpbmciKTsKLQlyY3V0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfYmFycmllcl9jYnMiKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwotCWN1cl9vcHMtPmNiX2JhcnJpZXIoKTsKLQlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyY3UpOwotCXJldHVybiAwOwotfQotCi0vKiBrdGhyZWFkIGZ1bmN0aW9uIHRvIGRyaXZlIGFuZCBjb29yZGluYXRlIFJDVSBiYXJyaWVyIHRlc3RpbmcuICovCi1zdGF0aWMgaW50IHJjdV90b3J0dXJlX2JhcnJpZXIodm9pZCAqYXJnKQotewotCWludCBpOwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9iYXJyaWVyIHRhc2sgc3RhcnRpbmciKTsKLQlkbyB7Ci0JCWF0b21pY19zZXQoJmJhcnJpZXJfY2JzX2ludm9rZWQsIDApOwotCQlhdG9taWNfc2V0KCZiYXJyaWVyX2Nic19jb3VudCwgbl9iYXJyaWVyX2Nicyk7Ci0JCXNtcF9tYigpOyAvKiBFbnN1cmUgYmFycmllcl9waGFzZSBhZnRlciBwcmlvciBhc3NpZ25tZW50cy4gKi8KLQkJYmFycmllcl9waGFzZSA9ICFiYXJyaWVyX3BoYXNlOwotCQlmb3IgKGkgPSAwOyBpIDwgbl9iYXJyaWVyX2NiczsgaSsrKQotCQkJd2FrZV91cCgmYmFycmllcl9jYnNfd3FbaV0pOwotCQl3YWl0X2V2ZW50KGJhcnJpZXJfd3EsCi0JCQkgICBhdG9taWNfcmVhZCgmYmFycmllcl9jYnNfY291bnQpID09IDAgfHwKLQkJCSAgIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fAotCQkJICAgZnVsbHN0b3AgIT0gRlVMTFNUT1BfRE9OVFNUT1ApOwotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IGZ1bGxzdG9wICE9IEZVTExTVE9QX0RPTlRTVE9QKQotCQkJYnJlYWs7Ci0JCW5fYmFycmllcl9hdHRlbXB0cysrOwotCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7IC8qIEltcGxpZXMgc21wX21iKCkgZm9yIHdhaXRfZXZlbnQoKS4gKi8KLQkJaWYgKGF0b21pY19yZWFkKCZiYXJyaWVyX2Nic19pbnZva2VkKSAhPSBuX2JhcnJpZXJfY2JzKSB7Ci0JCQluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IrKzsKLQkJCVdBUk5fT05fT05DRSgxKTsKLQkJfQotCQluX2JhcnJpZXJfc3VjY2Vzc2VzKys7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWiAvIDEwKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKLQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2JhcnJpZXIgdGFzayBzdG9wcGluZyIpOwotCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9iYXJyaWVyIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogSW5pdGlhbGl6ZSBSQ1UgYmFycmllciB0ZXN0aW5nLiAqLwotc3RhdGljIGludCByY3VfdG9ydHVyZV9iYXJyaWVyX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCi0JaWYgKG5fYmFycmllcl9jYnMgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGN1cl9vcHMtPmNhbGwgPT0gTlVMTCB8fCBjdXJfb3BzLT5jYl9iYXJyaWVyID09IE5VTEwpIHsKLQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKLQkJCSAiIENhbGwgb3IgYmFycmllciBvcHMgbWlzc2luZyBmb3IgJXMsXG4iLAotCQkJIHRvcnR1cmVfdHlwZSwgY3VyX29wcy0+bmFtZSk7Ci0JCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCi0JCQkgIiBSQ1UgYmFycmllciB0ZXN0aW5nIG9taXR0ZWQgZnJvbSBydW4uXG4iLAotCQkJIHRvcnR1cmVfdHlwZSk7Ci0JCXJldHVybiAwOwotCX0KLQlhdG9taWNfc2V0KCZiYXJyaWVyX2Nic19jb3VudCwgMCk7Ci0JYXRvbWljX3NldCgmYmFycmllcl9jYnNfaW52b2tlZCwgMCk7Ci0JYmFycmllcl9jYnNfdGFza3MgPQotCQlremFsbG9jKG5fYmFycmllcl9jYnMgKiBzaXplb2YoYmFycmllcl9jYnNfdGFza3NbMF0pLAotCQkJR0ZQX0tFUk5FTCk7Ci0JYmFycmllcl9jYnNfd3EgPQotCQlremFsbG9jKG5fYmFycmllcl9jYnMgKiBzaXplb2YoYmFycmllcl9jYnNfd3FbMF0pLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGJhcnJpZXJfY2JzX3Rhc2tzID09IE5VTEwgfHwgIWJhcnJpZXJfY2JzX3dxKQotCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgbl9iYXJyaWVyX2NiczsgaSsrKSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJhcnJpZXJfY2JzX3dxW2ldKTsKLQkJYmFycmllcl9jYnNfdGFza3NbaV0gPSBrdGhyZWFkX3J1bihyY3VfdG9ydHVyZV9iYXJyaWVyX2NicywKLQkJCQkJCSAgICh2b2lkICopKGxvbmcpaSwKLQkJCQkJCSAgICJyY3VfdG9ydHVyZV9iYXJyaWVyX2NicyIpOwotCQlpZiAoSVNfRVJSKGJhcnJpZXJfY2JzX3Rhc2tzW2ldKSkgewotCQkJcmV0ID0gUFRSX0VSUihiYXJyaWVyX2Nic190YXNrc1tpXSk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgcmN1X3RvcnR1cmVfYmFycmllcl9jYnMiKTsKLQkJCWJhcnJpZXJfY2JzX3Rhc2tzW2ldID0gTlVMTDsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0JYmFycmllcl90YXNrID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfYmFycmllciwgTlVMTCwKLQkJCQkgICAicmN1X3RvcnR1cmVfYmFycmllciIpOwotCWlmIChJU19FUlIoYmFycmllcl90YXNrKSkgewotCQlyZXQgPSBQVFJfRVJSKGJhcnJpZXJfdGFzayk7Ci0JCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSByY3VfdG9ydHVyZV9iYXJyaWVyIik7Ci0JCWJhcnJpZXJfdGFzayA9IE5VTEw7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBDbGVhbiB1cCBhZnRlciBSQ1UgYmFycmllciB0ZXN0aW5nLiAqLwotc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfYmFycmllcl9jbGVhbnVwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoYmFycmllcl90YXNrICE9IE5VTEwpIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9iYXJyaWVyIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKGJhcnJpZXJfdGFzayk7Ci0JCWJhcnJpZXJfdGFzayA9IE5VTEw7Ci0JfQotCWlmIChiYXJyaWVyX2Nic190YXNrcyAhPSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuX2JhcnJpZXJfY2JzOyBpKyspIHsKLQkJCWlmIChiYXJyaWVyX2Nic190YXNrc1tpXSAhPSBOVUxMKSB7Ci0JCQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9iYXJyaWVyX2NicyB0YXNrIik7Ci0JCQkJa3RocmVhZF9zdG9wKGJhcnJpZXJfY2JzX3Rhc2tzW2ldKTsKLQkJCQliYXJyaWVyX2Nic190YXNrc1tpXSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUoYmFycmllcl9jYnNfdGFza3MpOwotCQliYXJyaWVyX2Nic190YXNrcyA9IE5VTEw7Ci0JfQotCWlmIChiYXJyaWVyX2Nic193cSAhPSBOVUxMKSB7Ci0JCWtmcmVlKGJhcnJpZXJfY2JzX3dxKTsKLQkJYmFycmllcl9jYnNfd3EgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIGludCByY3V0b3J0dXJlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJKHZvaWQpcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQlyY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChjcHUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByY3V0b3J0dXJlX2NwdV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHJjdXRvcnR1cmVfY3B1X25vdGlmeSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1yY3VfdG9ydHVyZV9jbGVhbnVwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7Ci0JaWYgKGZ1bGxzdG9wID09IEZVTExTVE9QX1NIVVRET1dOKSB7Ci0JCXByX3dhcm4oLyogYnV0IGdvaW5nIGRvd24gYW55d2F5LCBzby4uLiAqLwotCQkgICAgICAgIkNvbmN1cnJlbnQgJ3JtbW9kIHJjdXRvcnR1cmUnIGFuZCBzaHV0ZG93biBpbGxlZ2FsIVxuIik7Ci0JCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxMCk7Ci0JCWlmIChjdXJfb3BzLT5jYl9iYXJyaWVyICE9IE5VTEwpCi0JCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7Ci0JCXJldHVybjsKLQl9Ci0JZnVsbHN0b3AgPSBGVUxMU1RPUF9STU1PRDsKLQltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKLQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcmN1dG9ydHVyZV9zaHV0ZG93bl9uYik7Ci0JcmN1X3RvcnR1cmVfYmFycmllcl9jbGVhbnVwKCk7Ci0JcmN1X3RvcnR1cmVfc3RhbGxfY2xlYW51cCgpOwotCWlmIChzdHV0dGVyX3Rhc2spIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zdHV0dGVyIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKHN0dXR0ZXJfdGFzayk7Ci0JfQotCXN0dXR0ZXJfdGFzayA9IE5VTEw7Ci0JaWYgKHNodWZmbGVyX3Rhc2spIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zaHVmZmxlIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKHNodWZmbGVyX3Rhc2spOwotCQlmcmVlX2NwdW1hc2tfdmFyKHNodWZmbGVfdG1wX21hc2spOwotCX0KLQlzaHVmZmxlcl90YXNrID0gTlVMTDsKLQotCWlmICh3cml0ZXJfdGFzaykgewotCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3dyaXRlciB0YXNrIik7Ci0JCWt0aHJlYWRfc3RvcCh3cml0ZXJfdGFzayk7Ci0JfQotCXdyaXRlcl90YXNrID0gTlVMTDsKLQotCWlmIChyZWFkZXJfdGFza3MpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKSB7Ci0JCQlpZiAocmVhZGVyX3Rhc2tzW2ldKSB7Ci0JCQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKAotCQkJCQkiU3RvcHBpbmcgcmN1X3RvcnR1cmVfcmVhZGVyIHRhc2siKTsKLQkJCQlrdGhyZWFkX3N0b3AocmVhZGVyX3Rhc2tzW2ldKTsKLQkJCX0KLQkJCXJlYWRlcl90YXNrc1tpXSA9IE5VTEw7Ci0JCX0KLQkJa2ZyZWUocmVhZGVyX3Rhc2tzKTsKLQkJcmVhZGVyX3Rhc2tzID0gTlVMTDsKLQl9Ci0JcmN1X3RvcnR1cmVfY3VycmVudCA9IE5VTEw7Ci0KLQlpZiAoZmFrZXdyaXRlcl90YXNrcykgewotCQlmb3IgKGkgPSAwOyBpIDwgbmZha2V3cml0ZXJzOyBpKyspIHsKLQkJCWlmIChmYWtld3JpdGVyX3Rhc2tzW2ldKSB7Ci0JCQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKAotCQkJCQkiU3RvcHBpbmcgcmN1X3RvcnR1cmVfZmFrZXdyaXRlciB0YXNrIik7Ci0JCQkJa3RocmVhZF9zdG9wKGZha2V3cml0ZXJfdGFza3NbaV0pOwotCQkJfQotCQkJZmFrZXdyaXRlcl90YXNrc1tpXSA9IE5VTEw7Ci0JCX0KLQkJa2ZyZWUoZmFrZXdyaXRlcl90YXNrcyk7Ci0JCWZha2V3cml0ZXJfdGFza3MgPSBOVUxMOwotCX0KLQotCWlmIChzdGF0c190YXNrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfc3RhdHMgdGFzayIpOwotCQlrdGhyZWFkX3N0b3Aoc3RhdHNfdGFzayk7Ci0JfQotCXN0YXRzX3Rhc2sgPSBOVUxMOwotCi0JaWYgKGZxc190YXNrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfZnFzIHRhc2siKTsKLQkJa3RocmVhZF9zdG9wKGZxc190YXNrKTsKLQl9Ci0JZnFzX3Rhc2sgPSBOVUxMOwotCWlmICgodGVzdF9ib29zdCA9PSAxICYmIGN1cl9vcHMtPmNhbl9ib29zdCkgfHwKLQkgICAgdGVzdF9ib29zdCA9PSAyKSB7Ci0JCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZyY3V0b3J0dXJlX2NwdV9uYik7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQkJcmN1dG9ydHVyZV9ib29zdGVyX2NsZWFudXAoaSk7Ci0JfQotCWlmIChzaHV0ZG93bl90YXNrICE9IE5VTEwpIHsKLQkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zaHV0ZG93biB0YXNrIik7Ci0JCWt0aHJlYWRfc3RvcChzaHV0ZG93bl90YXNrKTsKLQl9Ci0Jc2h1dGRvd25fdGFzayA9IE5VTEw7Ci0JcmN1X3RvcnR1cmVfb25vZmZfY2xlYW51cCgpOwotCi0JLyogV2FpdCBmb3IgYWxsIFJDVSBjYWxsYmFja3MgdG8gZmlyZS4gICovCi0KLQlpZiAoY3VyX29wcy0+Y2JfYmFycmllciAhPSBOVUxMKQotCQljdXJfb3BzLT5jYl9iYXJyaWVyKCk7Ci0KLQlyY3VfdG9ydHVyZV9zdGF0c19wcmludCgpOyAgLyogLUFmdGVyLSB0aGUgc3RhdHMgdGhyZWFkIGlzIHN0b3BwZWQhICovCi0KLQlpZiAoYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfZXJyb3IpIHx8IG5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvcikKLQkJcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsICJFbmQgb2YgdGVzdDogRkFJTFVSRSIpOwotCWVsc2UgaWYgKG5fb25saW5lX3N1Y2Nlc3NlcyAhPSBuX29ubGluZV9hdHRlbXB0cyB8fAotCQkgbl9vZmZsaW5lX3N1Y2Nlc3NlcyAhPSBuX29mZmxpbmVfYXR0ZW1wdHMpCi0JCXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcyhjdXJfb3BzLAotCQkJCQkgICAgICAgIkVuZCBvZiB0ZXN0OiBSQ1VfSE9UUExVRyIpOwotCWVsc2UKLQkJcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKGN1cl9vcHMsICJFbmQgb2YgdGVzdDogU1VDQ0VTUyIpOwotfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQKLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX2xlYWtfY2Ioc3RydWN0IHJjdV9oZWFkICpyaHApCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX2Vycl9jYihzdHJ1Y3QgcmN1X2hlYWQgKnJocCkKLXsKLQkvKgotCSAqIFRoaXMgLW1pZ2h0LSBoYXBwZW4gZHVlIHRvIHJhY2UgY29uZGl0aW9ucywgYnV0IGlzIHVubGlrZWx5LgotCSAqIFRoZSBzY2VuYXJpbyB0aGF0IGxlYWRzIHRvIHRoaXMgaGFwcGVuaW5nIGlzIHRoYXQgdGhlCi0JICogZmlyc3Qgb2YgdGhlIHBhaXIgb2YgZHVwbGljYXRlIGNhbGxiYWNrcyBpcyBxdWV1ZWQsCi0JICogc29tZW9uZSBlbHNlIHN0YXJ0cyBhIGdyYWNlIHBlcmlvZCB0aGF0IGluY2x1ZGVzIHRoYXQKLQkgKiBjYWxsYmFjaywgdGhlbiB0aGUgc2Vjb25kIG9mIHRoZSBwYWlyIG11c3Qgd2FpdCBmb3IgdGhlCi0JICogbmV4dCBncmFjZSBwZXJpb2QuICBVbmxpa2VseSwgYnV0IGNhbiBoYXBwZW4uICBJZiBpdAotCSAqIGRvZXMgaGFwcGVuLCB0aGUgZGVidWctb2JqZWN0cyBzdWJzeXN0ZW0gd29uJ3QgaGF2ZSBzcGxhdHRlZC4KLQkgKi8KLQlwcl9hbGVydCgicmN1dG9ydHVyZTogZHVwbGljYXRlZCBjYWxsYmFjayB3YXMgaW52b2tlZC5cbiIpOwotfQotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLwotCi0vKgotICogVmVyaWZ5IHRoYXQgZG91YmxlLWZyZWUgY2F1c2VzIGRlYnVnLW9iamVjdHMgdG8gY29tcGxhaW4sIGJ1dCBvbmx5Ci0gKiBpZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD15LiAgT3RoZXJ3aXNlLCBzYXkgdGhhdCB0aGUgdGVzdAotICogY2Fubm90IGJlIGNhcnJpZWQgb3V0LgotICovCi1zdGF0aWMgdm9pZCByY3VfdGVzdF9kZWJ1Z19vYmplY3RzKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQKLQlzdHJ1Y3QgcmN1X2hlYWQgcmgxOwotCXN0cnVjdCByY3VfaGVhZCByaDI7Ci0KLQlpbml0X3JjdV9oZWFkX29uX3N0YWNrKCZyaDEpOwotCWluaXRfcmN1X2hlYWRfb25fc3RhY2soJnJoMik7Ci0JcHJfYWxlcnQoInJjdXRvcnR1cmU6IFdBUk46IER1cGxpY2F0ZSBjYWxsX3JjdSgpIHRlc3Qgc3RhcnRpbmcuXG4iKTsKLQotCS8qIFRyeSB0byBxdWV1ZSB0aGUgcmgyIHBhaXIgb2YgY2FsbGJhY2tzIGZvciB0aGUgc2FtZSBncmFjZSBwZXJpb2QuICovCi0JcHJlZW1wdF9kaXNhYmxlKCk7IC8qIFByZXZlbnQgcHJlZW1wdGlvbiBmcm9tIGludGVycnVwdGluZyB0ZXN0LiAqLwotCXJjdV9yZWFkX2xvY2soKTsgLyogTWFrZSBpdCBpbXBvc3NpYmxlIHRvIGZpbmlzaCBhIGdyYWNlIHBlcmlvZC4gKi8KLQljYWxsX3JjdSgmcmgxLCByY3VfdG9ydHVyZV9sZWFrX2NiKTsgLyogU3RhcnQgZ3JhY2UgcGVyaW9kLiAqLwotCWxvY2FsX2lycV9kaXNhYmxlKCk7IC8qIE1ha2UgaXQgaGFyZGVyIHRvIHN0YXJ0IGEgbmV3IGdyYWNlIHBlcmlvZC4gKi8KLQljYWxsX3JjdSgmcmgyLCByY3VfdG9ydHVyZV9sZWFrX2NiKTsKLQljYWxsX3JjdSgmcmgyLCByY3VfdG9ydHVyZV9lcnJfY2IpOyAvKiBEdXBsaWNhdGUgY2FsbGJhY2suICovCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0KLQkvKiBXYWl0IGZvciB0aGVtIGFsbCB0byBnZXQgZG9uZSBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybi4gKi8KLQlyY3VfYmFycmllcigpOwotCXByX2FsZXJ0KCJyY3V0b3J0dXJlOiBXQVJOOiBEdXBsaWNhdGUgY2FsbF9yY3UoKSB0ZXN0IGNvbXBsZXRlLlxuIik7Ci0JZGVzdHJveV9yY3VfaGVhZF9vbl9zdGFjaygmcmgxKTsKLQlkZXN0cm95X3JjdV9oZWFkX29uX3N0YWNrKCZyaDIpOwotI2Vsc2UgLyogI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEICovCi0JcHJfYWxlcnQoInJjdXRvcnR1cmU6ICFDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCwgbm90IHRlc3RpbmcgZHVwbGljYXRlIGNhbGxfcmN1KClcbiIpOwotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLwotfQotCi1zdGF0aWMgaW50IF9faW5pdAotcmN1X3RvcnR1cmVfaW5pdCh2b2lkKQotewotCWludCBpOwotCWludCBjcHU7Ci0JaW50IGZpcnN0ZXJyID0gMDsKLQlpbnQgcmV0dmFsOwotCXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzICp0b3J0dXJlX29wc1tdID0gewotCQkmcmN1X29wcywgJnJjdV9iaF9vcHMsICZzcmN1X29wcywgJnNjaGVkX29wcywKLQl9OwotCi0JbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCi0JLyogUHJvY2VzcyBhcmdzIGFuZCB0ZWxsIHRoZSB3b3JsZCB0aGF0IHRoZSB0b3J0dXJlciBpcyBvbiB0aGUgam9iLiAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKTsgaSsrKSB7Ci0JCWN1cl9vcHMgPSB0b3J0dXJlX29wc1tpXTsKLQkJaWYgKHN0cmNtcCh0b3J0dXJlX3R5cGUsIGN1cl9vcHMtPm5hbWUpID09IDApCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gQVJSQVlfU0laRSh0b3J0dXJlX29wcykpIHsKLQkJcHJfYWxlcnQoInJjdS10b3J0dXJlOiBpbnZhbGlkIHRvcnR1cmUgdHlwZTogXCIlc1wiXG4iLAotCQkJIHRvcnR1cmVfdHlwZSk7Ci0JCXByX2FsZXJ0KCJyY3UtdG9ydHVyZSB0eXBlczoiKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9ydHVyZV9vcHMpOyBpKyspCi0JCQlwcl9hbGVydCgiICVzIiwgdG9ydHVyZV9vcHNbaV0tPm5hbWUpOwotCQlwcl9hbGVydCgiXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoY3VyX29wcy0+ZnFzID09IE5VTEwgJiYgZnFzX2R1cmF0aW9uICE9IDApIHsKLQkJcHJfYWxlcnQoInJjdS10b3J0dXJlOiAtPmZxcyBOVUxMIGFuZCBub24temVybyBmcXNfZHVyYXRpb24sIGZxcyBkaXNhYmxlZC5cbiIpOwotCQlmcXNfZHVyYXRpb24gPSAwOwotCX0KLQlpZiAoY3VyX29wcy0+aW5pdCkKLQkJY3VyX29wcy0+aW5pdCgpOyAvKiBubyAiZ290byB1bndpbmQiIHByaW9yIHRvIHRoaXMgcG9pbnQhISEgKi8KLQotCWlmIChucmVhZGVycyA+PSAwKQotCQlucmVhbHJlYWRlcnMgPSBucmVhZGVyczsKLQllbHNlCi0JCW5yZWFscmVhZGVycyA9IDIgKiBudW1fb25saW5lX2NwdXMoKTsKLQlyY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoY3VyX29wcywgIlN0YXJ0IG9mIHRlc3QiKTsKLQlmdWxsc3RvcCA9IEZVTExTVE9QX0RPTlRTVE9QOwotCi0JLyogU2V0IHVwIHRoZSBmcmVlbGlzdC4gKi8KLQotCUlOSVRfTElTVF9IRUFEKCZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmN1X3RvcnR1cmVzKTsgaSsrKSB7Ci0JCXJjdV90b3J0dXJlc1tpXS5ydG9ydF9tYnRlc3QgPSAwOwotCQlsaXN0X2FkZF90YWlsKCZyY3VfdG9ydHVyZXNbaV0ucnRvcnRfZnJlZSwKLQkJCSAgICAgICZyY3VfdG9ydHVyZV9mcmVlbGlzdCk7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyBzbyB0aGF0IGVhY2ggcnVuIGdldHMgaXRzIG93biBudW1iZXJzLiAqLwotCi0JcmN1X3RvcnR1cmVfY3VycmVudCA9IE5VTEw7Ci0JcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uID0gMDsKLQlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jLCAwKTsKLQlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwsIDApOwotCWF0b21pY19zZXQoJm5fcmN1X3RvcnR1cmVfZnJlZSwgMCk7Ci0JYXRvbWljX3NldCgmbl9yY3VfdG9ydHVyZV9tYmVycm9yLCAwKTsKLQlhdG9taWNfc2V0KCZuX3JjdV90b3J0dXJlX2Vycm9yLCAwKTsKLQluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IgPSAwOwotCW5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IgPSAwOwotCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvciA9IDA7Ci0Jbl9yY3VfdG9ydHVyZV9ib29zdF9mYWlsdXJlID0gMDsKLQluX3JjdV90b3J0dXJlX2Jvb3N0cyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKQotCQlhdG9taWNfc2V0KCZyY3VfdG9ydHVyZV93Y291bnRbaV0sIDApOwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKSB7Ci0JCQlwZXJfY3B1KHJjdV90b3J0dXJlX2NvdW50LCBjcHUpW2ldID0gMDsKLQkJCXBlcl9jcHUocmN1X3RvcnR1cmVfYmF0Y2gsIGNwdSlbaV0gPSAwOwotCQl9Ci0JfQotCi0JLyogU3RhcnQgdXAgdGhlIGt0aHJlYWRzLiAqLwotCi0JVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJDcmVhdGluZyByY3VfdG9ydHVyZV93cml0ZXIgdGFzayIpOwotCXdyaXRlcl90YXNrID0ga3RocmVhZF9jcmVhdGUocmN1X3RvcnR1cmVfd3JpdGVyLCBOVUxMLAotCQkJCSAgICAgInJjdV90b3J0dXJlX3dyaXRlciIpOwotCWlmIChJU19FUlIod3JpdGVyX3Rhc2spKSB7Ci0JCWZpcnN0ZXJyID0gUFRSX0VSUih3cml0ZXJfdGFzayk7Ci0JCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIiKTsKLQkJd3JpdGVyX3Rhc2sgPSBOVUxMOwotCQlnb3RvIHVud2luZDsKLQl9Ci0Jd2FrZV91cF9wcm9jZXNzKHdyaXRlcl90YXNrKTsKLQlmYWtld3JpdGVyX3Rhc2tzID0ga3phbGxvYyhuZmFrZXdyaXRlcnMgKiBzaXplb2YoZmFrZXdyaXRlcl90YXNrc1swXSksCi0JCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKGZha2V3cml0ZXJfdGFza3MgPT0gTlVMTCkgewotCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIm91dCBvZiBtZW1vcnkiKTsKLQkJZmlyc3RlcnIgPSAtRU5PTUVNOwotCQlnb3RvIHVud2luZDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiQ3JlYXRpbmcgcmN1X3RvcnR1cmVfZmFrZXdyaXRlciB0YXNrIik7Ci0JCWZha2V3cml0ZXJfdGFza3NbaV0gPSBrdGhyZWFkX3J1bihyY3VfdG9ydHVyZV9mYWtld3JpdGVyLCBOVUxMLAotCQkJCQkJICAicmN1X3RvcnR1cmVfZmFrZXdyaXRlciIpOwotCQlpZiAoSVNfRVJSKGZha2V3cml0ZXJfdGFza3NbaV0pKSB7Ci0JCQlmaXJzdGVyciA9IFBUUl9FUlIoZmFrZXdyaXRlcl90YXNrc1tpXSk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgZmFrZXdyaXRlciIpOwotCQkJZmFrZXdyaXRlcl90YXNrc1tpXSA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlyZWFkZXJfdGFza3MgPSBremFsbG9jKG5yZWFscmVhZGVycyAqIHNpemVvZihyZWFkZXJfdGFza3NbMF0pLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChyZWFkZXJfdGFza3MgPT0gTlVMTCkgewotCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIm91dCBvZiBtZW1vcnkiKTsKLQkJZmlyc3RlcnIgPSAtRU5PTUVNOwotCQlnb3RvIHVud2luZDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiQ3JlYXRpbmcgcmN1X3RvcnR1cmVfcmVhZGVyIHRhc2siKTsKLQkJcmVhZGVyX3Rhc2tzW2ldID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfcmVhZGVyLCBOVUxMLAotCQkJCQkgICAgICAicmN1X3RvcnR1cmVfcmVhZGVyIik7Ci0JCWlmIChJU19FUlIocmVhZGVyX3Rhc2tzW2ldKSkgewotCQkJZmlyc3RlcnIgPSBQVFJfRVJSKHJlYWRlcl90YXNrc1tpXSk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgcmVhZGVyIik7Ci0JCQlyZWFkZXJfdGFza3NbaV0gPSBOVUxMOwotCQkJZ290byB1bndpbmQ7Ci0JCX0KLQl9Ci0JaWYgKHN0YXRfaW50ZXJ2YWwgPiAwKSB7Ci0JCVZFUkJPU0VfUFJJTlRLX1NUUklORygiQ3JlYXRpbmcgcmN1X3RvcnR1cmVfc3RhdHMgdGFzayIpOwotCQlzdGF0c190YXNrID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfc3RhdHMsIE5VTEwsCi0JCQkJCSJyY3VfdG9ydHVyZV9zdGF0cyIpOwotCQlpZiAoSVNfRVJSKHN0YXRzX3Rhc2spKSB7Ci0JCQlmaXJzdGVyciA9IFBUUl9FUlIoc3RhdHNfdGFzayk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgc3RhdHMiKTsKLQkJCXN0YXRzX3Rhc2sgPSBOVUxMOwotCQkJZ290byB1bndpbmQ7Ci0JCX0KLQl9Ci0JaWYgKHRlc3Rfbm9faWRsZV9oeikgewotCQlyY3VfaWRsZV9jcHUgPSBudW1fb25saW5lX2NwdXMoKSAtIDE7Ci0KLQkJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigmc2h1ZmZsZV90bXBfbWFzaywgR0ZQX0tFUk5FTCkpIHsKLQkJCWZpcnN0ZXJyID0gLUVOT01FTTsKLQkJCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGFsbG9jIG1hc2siKTsKLQkJCWdvdG8gdW53aW5kOwotCQl9Ci0KLQkJLyogQ3JlYXRlIHRoZSBzaHVmZmxlciB0aHJlYWQgKi8KLQkJc2h1ZmZsZXJfdGFzayA9IGt0aHJlYWRfcnVuKHJjdV90b3J0dXJlX3NodWZmbGUsIE5VTEwsCi0JCQkJCSAgInJjdV90b3J0dXJlX3NodWZmbGUiKTsKLQkJaWYgKElTX0VSUihzaHVmZmxlcl90YXNrKSkgewotCQkJZnJlZV9jcHVtYXNrX3ZhcihzaHVmZmxlX3RtcF9tYXNrKTsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihzaHVmZmxlcl90YXNrKTsKLQkJCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSBzaHVmZmxlciIpOwotCQkJc2h1ZmZsZXJfdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlpZiAoc3R1dHRlciA8IDApCi0JCXN0dXR0ZXIgPSAwOwotCWlmIChzdHV0dGVyKSB7Ci0JCS8qIENyZWF0ZSB0aGUgc3R1dHRlciB0aHJlYWQgKi8KLQkJc3R1dHRlcl90YXNrID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfc3R1dHRlciwgTlVMTCwKLQkJCQkJICAicmN1X3RvcnR1cmVfc3R1dHRlciIpOwotCQlpZiAoSVNfRVJSKHN0dXR0ZXJfdGFzaykpIHsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihzdHV0dGVyX3Rhc2spOwotCQkJVkVSQk9TRV9QUklOVEtfRVJSU1RSSU5HKCJGYWlsZWQgdG8gY3JlYXRlIHN0dXR0ZXIiKTsKLQkJCXN0dXR0ZXJfdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlpZiAoZnFzX2R1cmF0aW9uIDwgMCkKLQkJZnFzX2R1cmF0aW9uID0gMDsKLQlpZiAoZnFzX2R1cmF0aW9uKSB7Ci0JCS8qIENyZWF0ZSB0aGUgc3R1dHRlciB0aHJlYWQgKi8KLQkJZnFzX3Rhc2sgPSBrdGhyZWFkX3J1bihyY3VfdG9ydHVyZV9mcXMsIE5VTEwsCi0JCQkJICAgICAgICJyY3VfdG9ydHVyZV9mcXMiKTsKLQkJaWYgKElTX0VSUihmcXNfdGFzaykpIHsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihmcXNfdGFzayk7Ci0JCQlWRVJCT1NFX1BSSU5US19FUlJTVFJJTkcoIkZhaWxlZCB0byBjcmVhdGUgZnFzIik7Ci0JCQlmcXNfdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCX0KLQlpZiAodGVzdF9ib29zdF9pbnRlcnZhbCA8IDEpCi0JCXRlc3RfYm9vc3RfaW50ZXJ2YWwgPSAxOwotCWlmICh0ZXN0X2Jvb3N0X2R1cmF0aW9uIDwgMikKLQkJdGVzdF9ib29zdF9kdXJhdGlvbiA9IDI7Ci0JaWYgKCh0ZXN0X2Jvb3N0ID09IDEgJiYgY3VyX29wcy0+Y2FuX2Jvb3N0KSB8fAotCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKLQotCQlib29zdF9zdGFydHRpbWUgPSBqaWZmaWVzICsgdGVzdF9ib29zdF9pbnRlcnZhbCAqIEhaOwotCQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJCWlmIChjcHVfaXNfb2ZmbGluZShpKSkKLQkJCQljb250aW51ZTsgIC8qIEhldXJpc3RpYzogQ1BVIGNhbiBnbyBvZmZsaW5lLiAqLwotCQkJcmV0dmFsID0gcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaSk7Ci0JCQlpZiAocmV0dmFsIDwgMCkgewotCQkJCWZpcnN0ZXJyID0gcmV0dmFsOwotCQkJCWdvdG8gdW53aW5kOwotCQkJfQotCQl9Ci0JfQotCWlmIChzaHV0ZG93bl9zZWNzID4gMCkgewotCQlzaHV0ZG93bl90aW1lID0gamlmZmllcyArIHNodXRkb3duX3NlY3MgKiBIWjsKLQkJc2h1dGRvd25fdGFzayA9IGt0aHJlYWRfY3JlYXRlKHJjdV90b3J0dXJlX3NodXRkb3duLCBOVUxMLAotCQkJCQkgICAgICAgInJjdV90b3J0dXJlX3NodXRkb3duIik7Ci0JCWlmIChJU19FUlIoc2h1dGRvd25fdGFzaykpIHsKLQkJCWZpcnN0ZXJyID0gUFRSX0VSUihzaHV0ZG93bl90YXNrKTsKLQkJCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSBzaHV0ZG93biIpOwotCQkJc2h1dGRvd25fdGFzayA9IE5VTEw7Ci0JCQlnb3RvIHVud2luZDsKLQkJfQotCQl3YWtlX3VwX3Byb2Nlc3Moc2h1dGRvd25fdGFzayk7Ci0JfQotCWkgPSByY3VfdG9ydHVyZV9vbm9mZl9pbml0KCk7Ci0JaWYgKGkgIT0gMCkgewotCQlmaXJzdGVyciA9IGk7Ci0JCWdvdG8gdW53aW5kOwotCX0KLQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnJjdXRvcnR1cmVfc2h1dGRvd25fbmIpOwotCWkgPSByY3VfdG9ydHVyZV9zdGFsbF9pbml0KCk7Ci0JaWYgKGkgIT0gMCkgewotCQlmaXJzdGVyciA9IGk7Ci0JCWdvdG8gdW53aW5kOwotCX0KLQlyZXR2YWwgPSByY3VfdG9ydHVyZV9iYXJyaWVyX2luaXQoKTsKLQlpZiAocmV0dmFsICE9IDApIHsKLQkJZmlyc3RlcnIgPSByZXR2YWw7Ci0JCWdvdG8gdW53aW5kOwotCX0KLQlpZiAob2JqZWN0X2RlYnVnKQotCQlyY3VfdGVzdF9kZWJ1Z19vYmplY3RzKCk7Ci0JcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKCk7Ci0JbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci0KLXVud2luZDoKLQltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKLQlyY3VfdG9ydHVyZV9jbGVhbnVwKCk7Ci0JcmV0dXJuIGZpcnN0ZXJyOwotfQotCi1tb2R1bGVfaW5pdChyY3VfdG9ydHVyZV9pbml0KTsKLW1vZHVsZV9leGl0KHJjdV90b3J0dXJlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlLmMgYi9rZXJuZWwvcmN1L3RyZWUuYwppbmRleCBiM2QxMTZjLi4wYzQ3ZTMwIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3RyZWUuYworKysgYi9rZXJuZWwvcmN1L3RyZWUuYwpAQCAtMTIsOCArMTIsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwOAogICoKQEAgLTU4LDggKzU4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlICJ0cmVlLmgiCi0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3JjdS5oPgotCiAjaW5jbHVkZSAicmN1LmgiCiAKIE1PRFVMRV9BTElBUygicmN1dHJlZSIpOwpAQCAtODM3LDcgKzgzNSw3IEBACiAJICogdG8gdGhlIG5leHQuICBPbmx5IGRvIHRoaXMgZm9yIHRoZSBwcmltYXJ5IGZsYXZvciBvZiBSQ1UuCiAJICovCiAJaWYgKHJkcC0+cnNwID09IHJjdV9zdGF0ZSAmJgotCSAgICBVTE9OR19DTVBfR0UoQUNDRVNTX09OQ0UoamlmZmllcyksIHJkcC0+cnNwLT5qaWZmaWVzX3Jlc2NoZWQpKSB7CisJICAgIFVMT05HX0NNUF9HRShqaWZmaWVzLCByZHAtPnJzcC0+amlmZmllc19yZXNjaGVkKSkgewogCQlyZHAtPnJzcC0+amlmZmllc19yZXNjaGVkICs9IDU7CiAJCXJlc2NoZWRfY3B1KHJkcC0+Y3B1KTsKIAl9CkBAIC04NDcsNyArODQ1LDcgQEAKIAogc3RhdGljIHZvaWQgcmVjb3JkX2dwX3N0YWxsX2NoZWNrX3RpbWUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQogewotCXVuc2lnbmVkIGxvbmcgaiA9IEFDQ0VTU19PTkNFKGppZmZpZXMpOworCXVuc2lnbmVkIGxvbmcgaiA9IGppZmZpZXM7CiAJdW5zaWduZWQgbG9uZyBqMTsKIAogCXJzcC0+Z3Bfc3RhcnQgPSBqOwpAQCAtMTAwNSw3ICsxMDAzLDcgQEAKIAogCWlmIChyY3VfY3B1X3N0YWxsX3N1cHByZXNzIHx8ICFyY3VfZ3BfaW5fcHJvZ3Jlc3MocnNwKSkKIAkJcmV0dXJuOwotCWogPSBBQ0NFU1NfT05DRShqaWZmaWVzKTsKKwlqID0gamlmZmllczsKIAogCS8qCiAJICogTG90cyBvZiBtZW1vcnkgYmFycmllcnMgdG8gcmVqZWN0IGZhbHNlIHBvc2l0aXZlcy4KQEAgLTE0MjMsMTMgKzE0MjEsMTQgQEAKIAogCS8qIEFkdmFuY2UgdG8gYSBuZXcgZ3JhY2UgcGVyaW9kIGFuZCBpbml0aWFsaXplIHN0YXRlLiAqLwogCXJlY29yZF9ncF9zdGFsbF9jaGVja190aW1lKHJzcCk7Ci0Jc21wX3dtYigpOyAvKiBSZWNvcmQgR1AgdGltZXMgYmVmb3JlIHN0YXJ0aW5nIEdQLiAqLwotCXJzcC0+Z3BudW0rKzsKKwkvKiBSZWNvcmQgR1AgdGltZXMgYmVmb3JlIHN0YXJ0aW5nIEdQLCBoZW5jZSBzbXBfc3RvcmVfcmVsZWFzZSgpLiAqLworCXNtcF9zdG9yZV9yZWxlYXNlKCZyc3AtPmdwbnVtLCByc3AtPmdwbnVtICsgMSk7CiAJdHJhY2VfcmN1X2dyYWNlX3BlcmlvZChyc3AtPm5hbWUsIHJzcC0+Z3BudW0sIFRQUygic3RhcnQiKSk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycSgmcm5wLT5sb2NrKTsKIAogCS8qIEV4Y2x1ZGUgYW55IGNvbmN1cnJlbnQgQ1BVLWhvdHBsdWcgb3BlcmF0aW9ucy4gKi8KIAltdXRleF9sb2NrKCZyc3AtPm9ub2ZmX211dGV4KTsKKwlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7IC8qIC0+Z3BudW0gaW5jcmVtZW50IGJlZm9yZSBHUCEgKi8KIAogCS8qCiAJICogU2V0IHRoZSBxdWllc2NlbnQtc3RhdGUtbmVlZGVkIGJpdHMgaW4gYWxsIHRoZSByY3Vfbm9kZQpAQCAtMTU1NywxMCArMTU1NiwxMSBAQAogCX0KIAlybnAgPSByY3VfZ2V0X3Jvb3QocnNwKTsKIAlyYXdfc3Bpbl9sb2NrX2lycSgmcm5wLT5sb2NrKTsKLQlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7CisJc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOyAvKiBPcmRlciBHUCBiZWZvcmUgLT5jb21wbGV0ZWQgdXBkYXRlLiAqLwogCXJjdV9ub2NiX2dwX3NldChybnAsIG5vY2IpOwogCi0JcnNwLT5jb21wbGV0ZWQgPSByc3AtPmdwbnVtOyAvKiBEZWNsYXJlIGdyYWNlIHBlcmlvZCBkb25lLiAqLworCS8qIERlY2xhcmUgZ3JhY2UgcGVyaW9kIGRvbmUuICovCisJQUNDRVNTX09OQ0UocnNwLT5jb21wbGV0ZWQpID0gcnNwLT5ncG51bTsKIAl0cmFjZV9yY3VfZ3JhY2VfcGVyaW9kKHJzcC0+bmFtZSwgcnNwLT5jb21wbGV0ZWQsIFRQUygiZW5kIikpOwogCXJzcC0+ZnFzX3N0YXRlID0gUkNVX0dQX0lETEU7CiAJcmRwID0gdGhpc19jcHVfcHRyKHJzcC0+cmRhKTsKQEAgLTIzMDQsNyArMjMwNCw3IEBACiAJCWlmIChybnBfb2xkICE9IE5VTEwpCiAJCQlyYXdfc3Bpbl91bmxvY2soJnJucF9vbGQtPmZxc2xvY2spOwogCQlpZiAocmV0KSB7Ci0JCQlyc3AtPm5fZm9yY2VfcXNfbGgrKzsKKwkJCUFDQ0VTU19PTkNFKHJzcC0+bl9mb3JjZV9xc19saCkrKzsKIAkJCXJldHVybjsKIAkJfQogCQlybnBfb2xkID0gcm5wOwpAQCAtMjMxNiw3ICsyMzE2LDcgQEAKIAlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7CiAJcmF3X3NwaW5fdW5sb2NrKCZybnBfb2xkLT5mcXNsb2NrKTsKIAlpZiAoQUNDRVNTX09OQ0UocnNwLT5ncF9mbGFncykgJiBSQ1VfR1BfRkxBR19GUVMpIHsKLQkJcnNwLT5uX2ZvcmNlX3FzX2xoKys7CisJCUFDQ0VTU19PTkNFKHJzcC0+bl9mb3JjZV9xc19saCkrKzsKIAkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucF9vbGQtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOyAgLyogU29tZW9uZSBiZWF0IHVzIHRvIGl0LiAqLwogCX0KQEAgLTI2MzksNiArMjYzOSw1OCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3luY2hyb25pemVfcmN1X2JoKTsKIAorLyoqCisgKiBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1IC0gU25hcHNob3QgY3VycmVudCBSQ1Ugc3RhdGUKKyAqCisgKiBSZXR1cm5zIGEgY29va2llIHRoYXQgaXMgdXNlZCBieSBhIGxhdGVyIGNhbGwgdG8gY29uZF9zeW5jaHJvbml6ZV9yY3UoKQorICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgZnVsbCBncmFjZSBwZXJpb2QgaGFzIGVsYXBzZWQgaW4gdGhlCisgKiBtZWFudGltZS4KKyAqLwordW5zaWduZWQgbG9uZyBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KHZvaWQpCit7CisJLyoKKwkgKiBBbnkgcHJpb3IgbWFuaXB1bGF0aW9uIG9mIFJDVS1wcm90ZWN0ZWQgZGF0YSBtdXN0IGhhcHBlbgorCSAqIGJlZm9yZSB0aGUgbG9hZCBmcm9tIC0+Z3BudW0uCisJICovCisJc21wX21iKCk7ICAvKiBeXl4gKi8KKworCS8qCisJICogTWFrZSBzdXJlIHRoaXMgbG9hZCBoYXBwZW5zIGJlZm9yZSB0aGUgcHVycG9ydGVkbHkKKwkgKiB0aW1lLWNvbnN1bWluZyB3b3JrIGJldHdlZW4gZ2V0X3N0YXRlX3N5bmNocm9uaXplX3JjdSgpCisJICogYW5kIGNvbmRfc3luY2hyb25pemVfcmN1KCkuCisJICovCisJcmV0dXJuIHNtcF9sb2FkX2FjcXVpcmUoJnJjdV9zdGF0ZS0+Z3BudW0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X3N0YXRlX3N5bmNocm9uaXplX3JjdSk7CisKKy8qKgorICogY29uZF9zeW5jaHJvbml6ZV9yY3UgLSBDb25kaXRpb25hbGx5IHdhaXQgZm9yIGFuIFJDVSBncmFjZSBwZXJpb2QKKyAqCisgKiBAb2xkc3RhdGU6IHJldHVybiB2YWx1ZSBmcm9tIGVhcmxpZXIgY2FsbCB0byBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KCkKKyAqCisgKiBJZiBhIGZ1bGwgUkNVIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgZWFybGllciBjYWxsIHRvCisgKiBnZXRfc3RhdGVfc3luY2hyb25pemVfcmN1KCksIGp1c3QgcmV0dXJuLiAgT3RoZXJ3aXNlLCBpbnZva2UKKyAqIHN5bmNocm9uaXplX3JjdSgpIHRvIHdhaXQgZm9yIGEgZnVsbCBncmFjZSBwZXJpb2QuCisgKgorICogWWVzLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgY291bnRlciB3cmFwIGludG8gYWNjb3VudC4gIEJ1dAorICogY291bnRlciB3cmFwIGlzIGhhcm1sZXNzLiAgSWYgdGhlIGNvdW50ZXIgd3JhcHMsIHdlIGhhdmUgd2FpdGVkIGZvcgorICogbW9yZSB0aGFuIDIgYmlsbGlvbiBncmFjZSBwZXJpb2RzIChhbmQgd2F5IG1vcmUgb24gYSA2NC1iaXQgc3lzdGVtISksCisgKiBzbyB3YWl0aW5nIGZvciBvbmUgYWRkaXRpb25hbCBncmFjZSBwZXJpb2Qgc2hvdWxkIGJlIGp1c3QgZmluZS4KKyAqLwordm9pZCBjb25kX3N5bmNocm9uaXplX3JjdSh1bnNpZ25lZCBsb25nIG9sZHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgbmV3c3RhdGU7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoaXMgbG9hZCBoYXBwZW5zIGJlZm9yZSBhbnkgUkNVLWRlc3RydWN0aXZlCisJICogYWN0aW9ucyB0aGUgY2FsbGVyIG1pZ2h0IGNhcnJ5IG91dCBhZnRlciB3ZSByZXR1cm4uCisJICovCisJbmV3c3RhdGUgPSBzbXBfbG9hZF9hY3F1aXJlKCZyY3Vfc3RhdGUtPmNvbXBsZXRlZCk7CisJaWYgKFVMT05HX0NNUF9HRShvbGRzdGF0ZSwgbmV3c3RhdGUpKQorCQlzeW5jaHJvbml6ZV9yY3UoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbmRfc3luY2hyb25pemVfcmN1KTsKKwogc3RhdGljIGludCBzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWRfY3B1X3N0b3Aodm9pZCAqZGF0YSkKIHsKIAkvKgpAQCAtMjg4MCw3ICsyOTMyLDcgQEAKICAqIG5vbi1OVUxMLCBzdG9yZSBhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgYWxsIGNhbGxiYWNrcyBhcmUgbGF6eS4KICAqIChJZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzLCBhbGwgb2YgdGhlbSBhcmUgZGVlbWVkIHRvIGJlIGxhenkuKQogICovCi1zdGF0aWMgaW50IHJjdV9jcHVfaGFzX2NhbGxiYWNrcyhpbnQgY3B1LCBib29sICphbGxfbGF6eSkKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcmN1X2NwdV9oYXNfY2FsbGJhY2tzKGludCBjcHUsIGJvb2wgKmFsbF9sYXp5KQogewogCWJvb2wgYWwgPSB0cnVlOwogCWJvb2wgaGMgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZS5oIGIva2VybmVsL3JjdS90cmVlLmgKaW5kZXggOGMxOTg3My4uNzVkYzNjMyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlLmgKKysrIGIva2VybmVsL3JjdS90cmVlLmgKQEAgLTEzLDggKzEzLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKICAqCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmggYi9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKaW5kZXggNmUyZWY0Yi4uOTYyZDFkNSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaApAQCAtMTQsOCArMTQsOCBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCiAgKgogICogQ29weXJpZ2h0IFJlZCBIYXQsIDIwMDkKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDkKQEAgLTE1ODYsMTEgKzE1ODYsMTMgQEAKICAqIEJlY2F1c2Ugd2Ugbm90IGhhdmUgUkNVX0ZBU1RfTk9fSFosIGp1c3QgY2hlY2sgd2hldGhlciB0aGlzIENQVSBuZWVkcwogICogYW55IGZsYXZvciBvZiBSQ1UuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwKIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgKmRlbHRhX2ppZmZpZXMpCiB7CiAJKmRlbHRhX2ppZmZpZXMgPSBVTE9OR19NQVg7CiAJcmV0dXJuIHJjdV9jcHVfaGFzX2NhbGxiYWNrcyhjcHUsIE5VTEwpOwogfQorI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwgKi8KIAogLyoKICAqIEJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgUkNVX0ZBU1RfTk9fSFosIGRvbid0IGJvdGhlciBjbGVhbmluZyB1cApAQCAtMTY1Niw3ICsxNjU4LDcgQEAKICAqIG9ubHkgaWYgaXQgaGFzIGJlZW4gYXdoaWxlIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZGlkIHNvLiAgQWZ0ZXJ3YXJkcywKICAqIGlmIHRoZXJlIGFyZSBhbnkgY2FsbGJhY2tzIHJlYWR5IGZvciBpbW1lZGlhdGUgaW52b2NhdGlvbiwgcmV0dXJuIHRydWUuCiAgKi8KLXN0YXRpYyBib29sIHJjdV90cnlfYWR2YW5jZV9hbGxfY2JzKHZvaWQpCitzdGF0aWMgYm9vbCBfX21heWJlX3VudXNlZCByY3VfdHJ5X2FkdmFuY2VfYWxsX2Nicyh2b2lkKQogewogCWJvb2wgY2JzX3JlYWR5ID0gZmFsc2U7CiAJc3RydWN0IHJjdV9kYXRhICpyZHA7CkBAIC0xNjk2LDYgKzE2OTgsNyBAQAogICoKICAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGRpc2FibGVkIGludGVycnVwdHMuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwKIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgKmRqKQogewogCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHAgPSAmcGVyX2NwdShyY3VfZHludGlja3MsIGNwdSk7CkBAIC0xNzI2LDYgKzE3MjksNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKyNlbmRpZiAvKiAjaWZuZGVmIENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMICovCiAKIC8qCiAgKiBQcmVwYXJlIGEgQ1BVIGZvciBpZGxlIGZyb20gYW4gUkNVIHBlcnNwZWN0aXZlLiAgVGhlIGZpcnN0IG1ham9yIHRhc2sKQEAgLTE3MzksNiArMTc0Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9wcmVwYXJlX2Zvcl9pZGxlKGludCBjcHUpCiB7CisjaWZuZGVmIENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMCiAJc3RydWN0IHJjdV9kYXRhICpyZHA7CiAJc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCA9ICZwZXJfY3B1KHJjdV9keW50aWNrcywgY3B1KTsKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKQEAgLTE3OTAsNiArMTc5NSw3IEBACiAJCXJjdV9hY2NlbGVyYXRlX2Nicyhyc3AsIHJucCwgcmRwKTsKIAkJcmF3X3NwaW5fdW5sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KIAl9CisjZW5kaWYgLyogI2lmbmRlZiBDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTCAqLwogfQogCiAvKgpAQCAtMTc5OSwxMSArMTgwNSwxMiBAQAogICovCiBzdGF0aWMgdm9pZCByY3VfY2xlYW51cF9hZnRlcl9pZGxlKGludCBjcHUpCiB7Ci0KKyNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwKIAlpZiAocmN1X2lzX25vY2JfY3B1KGNwdSkpCiAJCXJldHVybjsKIAlpZiAocmN1X3RyeV9hZHZhbmNlX2FsbF9jYnMoKSkKIAkJaW52b2tlX3JjdV9jb3JlKCk7CisjZW5kaWYgLyogI2lmbmRlZiBDT05GSUdfUkNVX05PQ0JfQ1BVX0FMTCAqLwogfQogCiAvKgpAQCAtMjEwMSw2ICsyMTA4LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZybnAtPm5vY2JfZ3Bfd3FbMV0pOwogfQogCisjaWZuZGVmIENPTkZJR19SQ1VfTk9DQl9DUFVfQUxMCiAvKiBJcyB0aGUgc3BlY2lmaWVkIENQVSBhIG5vLUNQVXMgQ1BVPyAqLwogYm9vbCByY3VfaXNfbm9jYl9jcHUoaW50IGNwdSkKIHsKQEAgLTIxMDgsNiArMjExNiw3IEBACiAJCXJldHVybiBjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcmN1X25vY2JfbWFzayk7CiAJcmV0dXJuIGZhbHNlOwogfQorI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX1JDVV9OT0NCX0NQVV9BTEwgKi8KIAogLyoKICAqIEVucXVldWUgdGhlIHNwZWNpZmllZCBzdHJpbmcgb2YgcmN1X2hlYWQgc3RydWN0dXJlcyBvbnRvIHRoZSBzcGVjaWZpZWQKQEAgLTI4OTMsNyArMjkwMiw3IEBACiAgKiBDUFUgdW5sZXNzIHRoZSBncmFjZSBwZXJpb2QgaGFzIGV4dGVuZGVkIGZvciB0b28gbG9uZy4KICAqCiAgKiBUaGlzIGNvZGUgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYWxsIE5PX0haX0ZVTEwgQ1BVcyBhcmUgYWxzbwotICogQ09ORklHX1JDVV9OT0NCX0NQVXMuCisgKiBDT05GSUdfUkNVX05PQ0JfQ1BVIENQVXMuCiAgKi8KIHN0YXRpYyBib29sIHJjdV9ub2h6X2Z1bGxfY3B1KHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZV90cmFjZS5jIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKaW5kZXggNGRlZjQ3NS4uNWNkYzYyZSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKKysrIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKICAqCkBAIC0yNzMsNyArMjczLDcgQEAKIAlzZXFfcHJpbnRmKG0sICJuZnFzPSVsdS9uZnFzbmc9JWx1KCVsdSkgZnFsaD0lbHUgb3FsZW49JWxkLyVsZFxuIiwKIAkJICAgcnNwLT5uX2ZvcmNlX3FzLCByc3AtPm5fZm9yY2VfcXNfbmdwLAogCQkgICByc3AtPm5fZm9yY2VfcXMgLSByc3AtPm5fZm9yY2VfcXNfbmdwLAotCQkgICByc3AtPm5fZm9yY2VfcXNfbGgsIHJzcC0+cWxlbl9sYXp5LCByc3AtPnFsZW4pOworCQkgICBBQ0NFU1NfT05DRShyc3AtPm5fZm9yY2VfcXNfbGgpLCByc3AtPnFsZW5fbGF6eSwgcnNwLT5xbGVuKTsKIAlmb3IgKHJucCA9ICZyc3AtPm5vZGVbMF07IHJucCAtICZyc3AtPm5vZGVbMF0gPCByY3VfbnVtX25vZGVzOyBybnArKykgewogCQlpZiAocm5wLT5sZXZlbCAhPSBsZXZlbCkgewogCQkJc2VxX3B1dHMobSwgIlxuIik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3VwZGF0ZS5jIGIva2VybmVsL3JjdS91cGRhdGUuYwppbmRleCBjNTQ2MDlmLi40YzBhOWIwIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3UvdXBkYXRlLmMKQEAgLTEyLDggKzEyLDggQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDEKICAqCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9yY3UuaD4KIAogI2luY2x1ZGUgInJjdS5oIgogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDNmMjg1ZGMuLjY3MzA2MWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC00MzIsMTEgKzQzMiw2IEBACiAJCXJlcy0+ZW5kID0gbWF4OwogfQogCi1zdGF0aWMgYm9vbCByZXNvdXJjZV9jb250YWlucyhzdHJ1Y3QgcmVzb3VyY2UgKnJlczEsIHN0cnVjdCByZXNvdXJjZSAqcmVzMikKLXsKLQlyZXR1cm4gcmVzMS0+c3RhcnQgPD0gcmVzMi0+c3RhcnQgJiYgcmVzMS0+ZW5kID49IHJlczItPmVuZDsKLX0KLQogLyoKICAqIEZpbmQgZW1wdHkgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSB3aXRoIHRoZSBnaXZlbiByYW5nZSBhbmQKICAqIGFsaWdubWVudCBjb25zdHJhaW50cwpAQCAtNDcxLDEwICs0NjYsMTEgQEAKIAkJYXJjaF9yZW1vdmVfcmVzZXJ2YXRpb25zKCZ0bXApOwogCiAJCS8qIENoZWNrIGZvciBvdmVyZmxvdyBhZnRlciBBTElHTigpICovCi0JCWF2YWlsID0gKm5ldzsKIAkJYXZhaWwuc3RhcnQgPSBBTElHTih0bXAuc3RhcnQsIGNvbnN0cmFpbnQtPmFsaWduKTsKIAkJYXZhaWwuZW5kID0gdG1wLmVuZDsKKwkJYXZhaWwuZmxhZ3MgPSBuZXctPmZsYWdzICYgfklPUkVTT1VSQ0VfVU5TRVQ7CiAJCWlmIChhdmFpbC5zdGFydCA+PSB0bXAuc3RhcnQpIHsKKwkJCWFsbG9jLmZsYWdzID0gYXZhaWwuZmxhZ3M7CiAJCQlhbGxvYy5zdGFydCA9IGNvbnN0cmFpbnQtPmFsaWduZihjb25zdHJhaW50LT5hbGlnbmZfZGF0YSwgJmF2YWlsLAogCQkJCQlzaXplLCBjb25zdHJhaW50LT5hbGlnbik7CiAJCQlhbGxvYy5lbmQgPSBhbGxvYy5zdGFydCArIHNpemUgLSAxOwpAQCAtOTQ5LDggKzk0NSw4IEBACiAJcmVzLT5uYW1lID0gbmFtZTsKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAJcmVzLT5lbmQgPSBzdGFydCArIG4gLSAxOwotCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1k7Ci0JcmVzLT5mbGFncyB8PSBmbGFnczsKKwlyZXMtPmZsYWdzID0gcmVzb3VyY2VfdHlwZShwYXJlbnQpOworCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9CVVNZIHwgZmxhZ3M7CiAKIAl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL01ha2VmaWxlIGIva2VybmVsL3NjaGVkL01ha2VmaWxlCmluZGV4IDlhOTVjOGMuLmFiMzJiN2IgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9NYWtlZmlsZQorKysgYi9rZXJuZWwvc2NoZWQvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKIAogb2JqLXkgKz0gY29yZS5vIHByb2MubyBjbG9jay5vIGNwdXRpbWUubwogb2JqLXkgKz0gaWRsZV90YXNrLm8gZmFpci5vIHJ0Lm8gZGVhZGxpbmUubyBzdG9wX3Rhc2subwotb2JqLXkgKz0gd2FpdC5vIGNvbXBsZXRpb24ubworb2JqLXkgKz0gd2FpdC5vIGNvbXBsZXRpb24ubyBpZGxlLm8KIG9iai0kKENPTkZJR19TTVApICs9IGNwdXByaS5vIGNwdWRlYWRsaW5lLm8KIG9iai0kKENPTkZJR19TQ0hFRF9BVVRPR1JPVVApICs9IGF1dG9fZ3JvdXAubwogb2JqLSQoQ09ORklHX1NDSEVEU1RBVFMpICs9IHN0YXRzLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9hdXRvX2dyb3VwLmMgYi9rZXJuZWwvc2NoZWQvYXV0b19ncm91cC5jCmluZGV4IDRhMDczNTMuLmU3M2VmYmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9hdXRvX2dyb3VwLmMKKysrIGIva2VybmVsL3NjaGVkL2F1dG9fZ3JvdXAuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJc3RydWN0IGF1dG9ncm91cCAqYWc7CiAJaW50IGVycjsKIAotCWlmIChuaWNlIDwgLTIwIHx8IG5pY2UgPiAxOSkKKwlpZiAobmljZSA8IE1JTl9OSUNFIHx8IG5pY2UgPiBNQVhfTklDRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAllcnIgPSBzZWN1cml0eV90YXNrX3NldG5pY2UoY3VycmVudCwgbmljZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY29yZS5jIGIva2VybmVsL3NjaGVkL2NvcmUuYwppbmRleCBmNWM2NjM1Li45Y2FlMjg2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY29yZS5jCisrKyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCWlmIChycSA9PSB0aGlzX3JxKCkpIHsKIAkJX19ocnRpY2tfcmVzdGFydChycSk7CiAJfSBlbHNlIGlmICghcnEtPmhydGlja19jc2RfcGVuZGluZykgewotCQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHVfb2YocnEpLCAmcnEtPmhydGlja19jc2QsIDApOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMoY3B1X29mKHJxKSwgJnJxLT5ocnRpY2tfY3NkKTsKIAkJcnEtPmhydGlja19jc2RfcGVuZGluZyA9IDE7CiAJfQogfQpAQCAtNTU1LDEyICs1NTUsMTUgQEAKICAqIHNlbGVjdGluZyBhbiBpZGxlIGNwdSB3aWxsIGFkZCBtb3JlIGRlbGF5cyB0byB0aGUgdGltZXJzIHRoYW4gaW50ZW5kZWQKICAqIChhcyB0aGF0IGNwdSdzIHRpbWVyIGJhc2UgbWF5IG5vdCBiZSB1cHRvZGF0ZSB3cnQgamlmZmllcyBldGMpLgogICovCi1pbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KHZvaWQpCitpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KGludCBwaW5uZWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpbnQgaTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAorCWlmIChwaW5uZWQgfHwgIWdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgfHwgIWlkbGVfY3B1KGNwdSkpCisJCXJldHVybiBjcHU7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKIAkJZm9yX2VhY2hfY3B1KGksIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkgewpAQCAtODIzLDE5ICs4MjYsMTMgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19QQVJBVklSVF9USU1FX0FDQ09VTlRJTkcKIAlpZiAoc3RhdGljX2tleV9mYWxzZSgoJnBhcmF2aXJ0X3N0ZWFsX3JxX2VuYWJsZWQpKSkgewotCQl1NjQgc3Q7Ci0KIAkJc3RlYWwgPSBwYXJhdmlydF9zdGVhbF9jbG9jayhjcHVfb2YocnEpKTsKIAkJc3RlYWwgLT0gcnEtPnByZXZfc3RlYWxfdGltZV9ycTsKIAogCQlpZiAodW5saWtlbHkoc3RlYWwgPiBkZWx0YSkpCiAJCQlzdGVhbCA9IGRlbHRhOwogCi0JCXN0ID0gc3RlYWxfdGlja3Moc3RlYWwpOwotCQlzdGVhbCA9IHN0ICogVElDS19OU0VDOwotCiAJCXJxLT5wcmV2X3N0ZWFsX3RpbWVfcnEgKz0gc3RlYWw7Ci0KIAkJZGVsdGEgLT0gc3RlYWw7CiAJfQogI2VuZGlmCkBAIC0xNzQ1LDggKzE3NDIsMTAgQEAKIAlwLT5udW1hX3NjYW5fc2VxID0gcC0+bW0gPyBwLT5tbS0+bnVtYV9zY2FuX3NlcSA6IDA7CiAJcC0+bnVtYV9zY2FuX3BlcmlvZCA9IHN5c2N0bF9udW1hX2JhbGFuY2luZ19zY2FuX2RlbGF5OwogCXAtPm51bWFfd29yay5uZXh0ID0gJnAtPm51bWFfd29yazsKLQlwLT5udW1hX2ZhdWx0cyA9IE5VTEw7Ci0JcC0+bnVtYV9mYXVsdHNfYnVmZmVyID0gTlVMTDsKKwlwLT5udW1hX2ZhdWx0c19tZW1vcnkgPSBOVUxMOworCXAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnkgPSBOVUxMOworCXAtPmxhc3RfdGFza19udW1hX3BsYWNlbWVudCA9IDA7CisJcC0+bGFzdF9zdW1fZXhlY19ydW50aW1lID0gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZwLT5udW1hX2VudHJ5KTsKIAlwLT5udW1hX2dyb3VwID0gTlVMTDsKQEAgLTIxNDksOCArMjE0OCw2IEBACiAJaWYgKG1tKQogCQltbWRyb3AobW0pOwogCWlmICh1bmxpa2VseShwcmV2X3N0YXRlID09IFRBU0tfREVBRCkpIHsKLQkJdGFza19udW1hX2ZyZWUocHJldik7Ci0KIAkJaWYgKHByZXYtPnNjaGVkX2NsYXNzLT50YXNrX2RlYWQpCiAJCQlwcmV2LT5zY2hlZF9jbGFzcy0+dGFza19kZWFkKHByZXYpOwogCkBAIC0yMTY3LDEzICsyMTY0LDYgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAotLyogYXNzdW1lcyBycS0+bG9jayBpcyBoZWxkICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJlX3NjaGVkdWxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKLXsKLQlpZiAocHJldi0+c2NoZWRfY2xhc3MtPnByZV9zY2hlZHVsZSkKLQkJcHJldi0+c2NoZWRfY2xhc3MtPnByZV9zY2hlZHVsZShycSwgcHJldik7Ci19Ci0KIC8qIHJxLT5sb2NrIGlzIE5PVCBoZWxkLCBidXQgcHJlZW1wdGlvbiBpcyBkaXNhYmxlZCAqLwogc3RhdGljIGlubGluZSB2b2lkIHBvc3Rfc2NoZWR1bGUoc3RydWN0IHJxICpycSkKIHsKQEAgLTIxOTEsMTAgKzIxODEsNiBAQAogCiAjZWxzZQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJlX3NjaGVkdWxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKLXsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHBvc3Rfc2NoZWR1bGUoc3RydWN0IHJxICpycSkKIHsKIH0KQEAgLTI1MTAsOCArMjQ5NiwxMyBAQAogCURFQlVHX0xPQ0tTX1dBUk5fT04oKHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfTUFTSykgPj0KIAkJCQlQUkVFTVBUX01BU0sgLSAxMCk7CiAjZW5kaWYKLQlpZiAocHJlZW1wdF9jb3VudCgpID09IHZhbCkKLQkJdHJhY2VfcHJlZW1wdF9vZmYoQ0FMTEVSX0FERFIwLCBnZXRfcGFyZW50X2lwKENBTExFUl9BRERSMSkpOworCWlmIChwcmVlbXB0X2NvdW50KCkgPT0gdmFsKSB7CisJCXVuc2lnbmVkIGxvbmcgaXAgPSBnZXRfcGFyZW50X2lwKENBTExFUl9BRERSMSk7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKKwkJY3VycmVudC0+cHJlZW1wdF9kaXNhYmxlX2lwID0gaXA7CisjZW5kaWYKKwkJdHJhY2VfcHJlZW1wdF9vZmYoQ0FMTEVSX0FERFIwLCBpcCk7CisJfQogfQogRVhQT1JUX1NZTUJPTChwcmVlbXB0X2NvdW50X2FkZCk7CiAKQEAgLTI1NTQsNiArMjU0NSwxMyBAQAogCXByaW50X21vZHVsZXMoKTsKIAlpZiAoaXJxc19kaXNhYmxlZCgpKQogCQlwcmludF9pcnF0cmFjZV9ldmVudHMocHJldik7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKKwlpZiAoaW5fYXRvbWljX3ByZWVtcHRfb2ZmKCkpIHsKKwkJcHJfZXJyKCJQcmVlbXB0aW9uIGRpc2FibGVkIGF0OiIpOworCQlwcmludF9pcF9zeW0oY3VycmVudC0+cHJlZW1wdF9kaXNhYmxlX2lwKTsKKwkJcHJfY29udCgiXG4iKTsKKwl9CisjZW5kaWYKIAlkdW1wX3N0YWNrKCk7CiAJYWRkX3RhaW50KFRBSU5UX1dBUk4sIExPQ0tERVBfU1RJTExfT0spOwogfQpAQCAtMjU3NywzNiArMjU3NSwzNCBAQAogCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLCBzY2hlZF9jb3VudCk7CiB9CiAKLXN0YXRpYyB2b2lkIHB1dF9wcmV2X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQotewotCWlmIChwcmV2LT5vbl9ycSB8fCBycS0+c2tpcF9jbG9ja191cGRhdGUgPCAwKQotCQl1cGRhdGVfcnFfY2xvY2socnEpOwotCXByZXYtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKLX0KLQogLyoKICAqIFBpY2sgdXAgdGhlIGhpZ2hlc3QtcHJpbyB0YXNrOgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqCi1waWNrX25leHRfdGFzayhzdHJ1Y3QgcnEgKnJxKQorcGlja19uZXh0X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewotCWNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyAqY2xhc3M7CisJY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzICpjbGFzcyA9ICZmYWlyX3NjaGVkX2NsYXNzOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAogCS8qCiAJICogT3B0aW1pemF0aW9uOiB3ZSBrbm93IHRoYXQgaWYgYWxsIHRhc2tzIGFyZSBpbgogCSAqIHRoZSBmYWlyIGNsYXNzIHdlIGNhbiBjYWxsIHRoYXQgZnVuY3Rpb24gZGlyZWN0bHk6CiAJICovCi0JaWYgKGxpa2VseShycS0+bnJfcnVubmluZyA9PSBycS0+Y2ZzLmhfbnJfcnVubmluZykpIHsKLQkJcCA9IGZhaXJfc2NoZWRfY2xhc3MucGlja19uZXh0X3Rhc2socnEpOwotCQlpZiAobGlrZWx5KHApKQorCWlmIChsaWtlbHkocHJldi0+c2NoZWRfY2xhc3MgPT0gY2xhc3MgJiYKKwkJICAgcnEtPm5yX3J1bm5pbmcgPT0gcnEtPmNmcy5oX25yX3J1bm5pbmcpKSB7CisJCXAgPSBmYWlyX3NjaGVkX2NsYXNzLnBpY2tfbmV4dF90YXNrKHJxLCBwcmV2KTsKKwkJaWYgKGxpa2VseShwICYmIHAgIT0gUkVUUllfVEFTSykpCiAJCQlyZXR1cm4gcDsKIAl9CiAKK2FnYWluOgogCWZvcl9lYWNoX2NsYXNzKGNsYXNzKSB7Ci0JCXAgPSBjbGFzcy0+cGlja19uZXh0X3Rhc2socnEpOwotCQlpZiAocCkKKwkJcCA9IGNsYXNzLT5waWNrX25leHRfdGFzayhycSwgcHJldik7CisJCWlmIChwKSB7CisJCQlpZiAodW5saWtlbHkocCA9PSBSRVRSWV9UQVNLKSkKKwkJCQlnb3RvIGFnYWluOwogCQkJcmV0dXJuIHA7CisJCX0KIAl9CiAKIAlCVUcoKTsgLyogdGhlIGlkbGUgY2xhc3Mgd2lsbCBhbHdheXMgaGF2ZSBhIHJ1bm5hYmxlIHRhc2sgKi8KQEAgLTI3MDAsMTMgKzI2OTYsMTAgQEAKIAkJc3dpdGNoX2NvdW50ID0gJnByZXYtPm52Y3N3OwogCX0KIAotCXByZV9zY2hlZHVsZShycSwgcHJldik7CisJaWYgKHByZXYtPm9uX3JxIHx8IHJxLT5za2lwX2Nsb2NrX3VwZGF0ZSA8IDApCisJCXVwZGF0ZV9ycV9jbG9jayhycSk7CiAKLQlpZiAodW5saWtlbHkoIXJxLT5ucl9ydW5uaW5nKSkKLQkJaWRsZV9iYWxhbmNlKGNwdSwgcnEpOwotCi0JcHV0X3ByZXZfdGFzayhycSwgcHJldik7Ci0JbmV4dCA9IHBpY2tfbmV4dF90YXNrKHJxKTsKKwluZXh0ID0gcGlja19uZXh0X3Rhc2socnEsIHByZXYpOwogCWNsZWFyX3Rza19uZWVkX3Jlc2NoZWQocHJldik7CiAJY2xlYXJfcHJlZW1wdF9uZWVkX3Jlc2NoZWQoKTsKIAlycS0+c2tpcF9jbG9ja191cGRhdGUgPSAwOwpAQCAtMjkwOCw3ICsyOTAxLDggQEAKICAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgJ2VmZmVjdGl2ZScgcHJpb3JpdHkgb2YgYSB0YXNrLiBJdCBkb2VzCiAgKiBub3QgdG91Y2ggLT5ub3JtYWxfcHJpbyBsaWtlIF9fc2V0c2NoZWR1bGVyKCkuCiAgKgotICogVXNlZCBieSB0aGUgcnRfbXV0ZXggY29kZSB0byBpbXBsZW1lbnQgcHJpb3JpdHkgaW5oZXJpdGFuY2UgbG9naWMuCisgKiBVc2VkIGJ5IHRoZSBydF9tdXRleCBjb2RlIHRvIGltcGxlbWVudCBwcmlvcml0eSBpbmhlcml0YW5jZQorICogbG9naWMuIENhbGwgc2l0ZSBvbmx5IGNhbGxzIGlmIHRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBjaGFuZ2VkLgogICovCiB2b2lkIHJ0X211dGV4X3NldHByaW8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcHJpbykKIHsKQEAgLTI5OTgsNyArMjk5Miw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcnEgKnJxOwogCi0JaWYgKFRBU0tfTklDRShwKSA9PSBuaWNlIHx8IG5pY2UgPCAtMjAgfHwgbmljZSA+IDE5KQorCWlmICh0YXNrX25pY2UocCkgPT0gbmljZSB8fCBuaWNlIDwgTUlOX05JQ0UgfHwgbmljZSA+IE1BWF9OSUNFKQogCQlyZXR1cm47CiAJLyoKIAkgKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwsIGlmIGNhbGxlZCBmcm9tIHN5c19zZXRwcmlvcml0eSgpLApAQCAtMzA3NiwxMSArMzA3MCwxMSBAQAogCWlmIChpbmNyZW1lbnQgPiA0MCkKIAkJaW5jcmVtZW50ID0gNDA7CiAKLQluaWNlID0gVEFTS19OSUNFKGN1cnJlbnQpICsgaW5jcmVtZW50OwotCWlmIChuaWNlIDwgLTIwKQotCQluaWNlID0gLTIwOwotCWlmIChuaWNlID4gMTkpCi0JCW5pY2UgPSAxOTsKKwluaWNlID0gdGFza19uaWNlKGN1cnJlbnQpICsgaW5jcmVtZW50OworCWlmIChuaWNlIDwgTUlOX05JQ0UpCisJCW5pY2UgPSBNSU5fTklDRTsKKwlpZiAobmljZSA+IE1BWF9OSUNFKQorCQluaWNlID0gTUFYX05JQ0U7CiAKIAlpZiAoaW5jcmVtZW50IDwgMCAmJiAhY2FuX25pY2UoY3VycmVudCwgbmljZSkpCiAJCXJldHVybiAtRVBFUk07CkBAIC0zMTA5LDE4ICszMTAzLDYgQEAKIH0KIAogLyoqCi0gKiB0YXNrX25pY2UgLSByZXR1cm4gdGhlIG5pY2UgdmFsdWUgb2YgYSBnaXZlbiB0YXNrLgotICogQHA6IHRoZSB0YXNrIGluIHF1ZXN0aW9uLgotICoKLSAqIFJldHVybjogVGhlIG5pY2UgdmFsdWUgWyAtMjAgLi4uIDAgLi4uIDE5IF0uCi0gKi8KLWludCB0YXNrX25pY2UoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXJldHVybiBUQVNLX05JQ0UocCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhc2tfbmljZSk7Ci0KLS8qKgogICogaWRsZV9jcHUgLSBpcyBhIGdpdmVuIGNwdSBpZGxlIGN1cnJlbnRseT8KICAqIEBjcHU6IHRoZSBwcm9jZXNzb3IgaW4gcXVlc3Rpb24uCiAgKgpAQCAtMzE4OSw5ICszMTcxLDggQEAKIAlkbF9zZS0+ZGxfbmV3ID0gMTsKIH0KIAotLyogQWN0dWFsbHkgZG8gcHJpb3JpdHkgY2hhbmdlOiBtdXN0IGhvbGQgcGkgJiBycSBsb2NrLiAqLwotc3RhdGljIHZvaWQgX19zZXRzY2hlZHVsZXIoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAotCQkJICAgY29uc3Qgc3RydWN0IHNjaGVkX2F0dHIgKmF0dHIpCitzdGF0aWMgdm9pZCBfX3NldHNjaGVkdWxlcl9wYXJhbXMoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQljb25zdCBzdHJ1Y3Qgc2NoZWRfYXR0ciAqYXR0cikKIHsKIAlpbnQgcG9saWN5ID0gYXR0ci0+c2NoZWRfcG9saWN5OwogCkBAIC0zMjExLDkgKzMxOTIsMjEgQEAKIAkgKiBnZXRwYXJhbSgpL2dldGF0dHIoKSBkb24ndCByZXBvcnQgc2lsbHkgdmFsdWVzIGZvciAhcnQgdGFza3MuCiAJICovCiAJcC0+cnRfcHJpb3JpdHkgPSBhdHRyLT5zY2hlZF9wcmlvcml0eTsKLQogCXAtPm5vcm1hbF9wcmlvID0gbm9ybWFsX3ByaW8ocCk7Ci0JcC0+cHJpbyA9IHJ0X211dGV4X2dldHByaW8ocCk7CisJc2V0X2xvYWRfd2VpZ2h0KHApOworfQorCisvKiBBY3R1YWxseSBkbyBwcmlvcml0eSBjaGFuZ2U6IG11c3QgaG9sZCBwaSAmIHJxIGxvY2suICovCitzdGF0aWMgdm9pZCBfX3NldHNjaGVkdWxlcihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfYXR0ciAqYXR0cikKK3sKKwlfX3NldHNjaGVkdWxlcl9wYXJhbXMocCwgYXR0cik7CisKKwkvKgorCSAqIElmIHdlIGdldCBoZXJlLCB0aGVyZSB3YXMgbm8gcGkgd2FpdGVycyBib29zdGluZyB0aGUKKwkgKiB0YXNrLiBJdCBpcyBzYWZlIHRvIHVzZSB0aGUgbm9ybWFsIHByaW8uCisJICovCisJcC0+cHJpbyA9IG5vcm1hbF9wcmlvKHApOwogCiAJaWYgKGRsX3ByaW8ocC0+cHJpbykpCiAJCXAtPnNjaGVkX2NsYXNzID0gJmRsX3NjaGVkX2NsYXNzOwpAQCAtMzIyMSw4ICszMjE0LDYgQEAKIAkJcC0+c2NoZWRfY2xhc3MgPSAmcnRfc2NoZWRfY2xhc3M7CiAJZWxzZQogCQlwLT5zY2hlZF9jbGFzcyA9ICZmYWlyX3NjaGVkX2NsYXNzOwotCi0Jc2V0X2xvYWRfd2VpZ2h0KHApOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzI3NSw2ICszMjY2LDggQEAKIAkJCQljb25zdCBzdHJ1Y3Qgc2NoZWRfYXR0ciAqYXR0ciwKIAkJCQlib29sIHVzZXIpCiB7CisJaW50IG5ld3ByaW8gPSBkbF9wb2xpY3koYXR0ci0+c2NoZWRfcG9saWN5KSA/IE1BWF9ETF9QUklPIC0gMSA6CisJCSAgICAgIE1BWF9SVF9QUklPIC0gMSAtIGF0dHItPnNjaGVkX3ByaW9yaXR5OwogCWludCByZXR2YWwsIG9sZHByaW8sIG9sZHBvbGljeSA9IC0xLCBvbl9ycSwgcnVubmluZzsKIAlpbnQgcG9saWN5ID0gYXR0ci0+c2NoZWRfcG9saWN5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zMzE5LDcgKzMzMTIsNyBAQAogCSAqLwogCWlmICh1c2VyICYmICFjYXBhYmxlKENBUF9TWVNfTklDRSkpIHsKIAkJaWYgKGZhaXJfcG9saWN5KHBvbGljeSkpIHsKLQkJCWlmIChhdHRyLT5zY2hlZF9uaWNlIDwgVEFTS19OSUNFKHApICYmCisJCQlpZiAoYXR0ci0+c2NoZWRfbmljZSA8IHRhc2tfbmljZShwKSAmJgogCQkJICAgICFjYW5fbmljZShwLCBhdHRyLT5zY2hlZF9uaWNlKSkKIAkJCQlyZXR1cm4gLUVQRVJNOwogCQl9CkBAIC0zMzUyLDcgKzMzNDUsNyBAQAogCQkgKiBTQ0hFRF9OT1JNQUwgaWYgdGhlIFJMSU1JVF9OSUNFIHdvdWxkIG5vcm1hbGx5IHBlcm1pdCBpdC4KIAkJICovCiAJCWlmIChwLT5wb2xpY3kgPT0gU0NIRURfSURMRSAmJiBwb2xpY3kgIT0gU0NIRURfSURMRSkgewotCQkJaWYgKCFjYW5fbmljZShwLCBUQVNLX05JQ0UocCkpKQorCQkJaWYgKCFjYW5fbmljZShwLCB0YXNrX25pY2UocCkpKQogCQkJCXJldHVybiAtRVBFUk07CiAJCX0KIApAQCAtMzM4OSwxNiArMzM4MiwxOCBAQAogCX0KIAogCS8qCi0JICogSWYgbm90IGNoYW5naW5nIGFueXRoaW5nIHRoZXJlJ3Mgbm8gbmVlZCB0byBwcm9jZWVkIGZ1cnRoZXI6CisJICogSWYgbm90IGNoYW5naW5nIGFueXRoaW5nIHRoZXJlJ3Mgbm8gbmVlZCB0byBwcm9jZWVkIGZ1cnRoZXIsCisJICogYnV0IHN0b3JlIGEgcG9zc2libGUgbW9kaWZpY2F0aW9uIG9mIHJlc2V0X29uX2ZvcmsuCiAJICovCiAJaWYgKHVubGlrZWx5KHBvbGljeSA9PSBwLT5wb2xpY3kpKSB7Ci0JCWlmIChmYWlyX3BvbGljeShwb2xpY3kpICYmIGF0dHItPnNjaGVkX25pY2UgIT0gVEFTS19OSUNFKHApKQorCQlpZiAoZmFpcl9wb2xpY3kocG9saWN5KSAmJiBhdHRyLT5zY2hlZF9uaWNlICE9IHRhc2tfbmljZShwKSkKIAkJCWdvdG8gY2hhbmdlOwogCQlpZiAocnRfcG9saWN5KHBvbGljeSkgJiYgYXR0ci0+c2NoZWRfcHJpb3JpdHkgIT0gcC0+cnRfcHJpb3JpdHkpCiAJCQlnb3RvIGNoYW5nZTsKIAkJaWYgKGRsX3BvbGljeShwb2xpY3kpKQogCQkJZ290byBjaGFuZ2U7CiAKKwkJcC0+c2NoZWRfcmVzZXRfb25fZm9yayA9IHJlc2V0X29uX2Zvcms7CiAJCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zNDUyLDYgKzM0NDcsMjQgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKKwlwLT5zY2hlZF9yZXNldF9vbl9mb3JrID0gcmVzZXRfb25fZm9yazsKKwlvbGRwcmlvID0gcC0+cHJpbzsKKworCS8qCisJICogU3BlY2lhbCBjYXNlIGZvciBwcmlvcml0eSBib29zdGVkIHRhc2tzLgorCSAqCisJICogSWYgdGhlIG5ldyBwcmlvcml0eSBpcyBsb3dlciBvciBlcXVhbCAodXNlciBzcGFjZSB2aWV3KQorCSAqIHRoYW4gdGhlIGN1cnJlbnQgKGJvb3N0ZWQpIHByaW9yaXR5LCB3ZSBqdXN0IHN0b3JlIHRoZSBuZXcKKwkgKiBub3JtYWwgcGFyYW1ldGVycyBhbmQgZG8gbm90IHRvdWNoIHRoZSBzY2hlZHVsZXIgY2xhc3MgYW5kCisJICogdGhlIHJ1bnF1ZXVlLiBUaGlzIHdpbGwgYmUgZG9uZSB3aGVuIHRoZSB0YXNrIGRlYm9vc3QKKwkgKiBpdHNlbGYuCisJICovCisJaWYgKHJ0X211dGV4X2NoZWNrX3ByaW8ocCwgbmV3cHJpbykpIHsKKwkJX19zZXRzY2hlZHVsZXJfcGFyYW1zKHAsIGF0dHIpOworCQl0YXNrX3JxX3VubG9jayhycSwgcCwgJmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJb25fcnEgPSBwLT5vbl9ycTsKIAlydW5uaW5nID0gdGFza19jdXJyZW50KHJxLCBwKTsKIAlpZiAob25fcnEpCkBAIC0zNDU5LDE2ICszNDcyLDE4IEBACiAJaWYgKHJ1bm5pbmcpCiAJCXAtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwKTsKIAotCXAtPnNjaGVkX3Jlc2V0X29uX2ZvcmsgPSByZXNldF9vbl9mb3JrOwotCi0Jb2xkcHJpbyA9IHAtPnByaW87CiAJcHJldl9jbGFzcyA9IHAtPnNjaGVkX2NsYXNzOwogCV9fc2V0c2NoZWR1bGVyKHJxLCBwLCBhdHRyKTsKIAogCWlmIChydW5uaW5nKQogCQlwLT5zY2hlZF9jbGFzcy0+c2V0X2N1cnJfdGFzayhycSk7Ci0JaWYgKG9uX3JxKQotCQllbnF1ZXVlX3Rhc2socnEsIHAsIDApOworCWlmIChvbl9ycSkgeworCQkvKgorCQkgKiBXZSBlbnF1ZXVlIHRvIHRhaWwgd2hlbiB0aGUgcHJpb3JpdHkgb2YgYSB0YXNrIGlzCisJCSAqIGluY3JlYXNlZCAodXNlciBzcGFjZSB2aWV3KS4KKwkJICovCisJCWVucXVldWVfdGFzayhycSwgcCwgb2xkcHJpbyA8PSBwLT5wcmlvID8gRU5RVUVVRV9IRUFEIDogMCk7CisJfQogCiAJY2hlY2tfY2xhc3NfY2hhbmdlZChycSwgcCwgcHJldl9jbGFzcywgb2xkcHJpbyk7CiAJdGFza19ycV91bmxvY2socnEsIHAsICZmbGFncyk7CkBAIC0zNjI0LDcgKzM2MzksNyBAQAogCSAqIFhYWDogZG8gd2Ugd2FudCB0byBiZSBsZW5pZW50IGxpa2UgZXhpc3Rpbmcgc3lzY2FsbHM7IG9yIGRvIHdlIHdhbnQKIAkgKiB0byBiZSBzdHJpY3QgYW5kIHJldHVybiBhbiBlcnJvciBvbiBvdXQtb2YtYm91bmRzIHZhbHVlcz8KIAkgKi8KLQlhdHRyLT5zY2hlZF9uaWNlID0gY2xhbXAoYXR0ci0+c2NoZWRfbmljZSwgLTIwLCAxOSk7CisJYXR0ci0+c2NoZWRfbmljZSA9IGNsYW1wKGF0dHItPnNjaGVkX25pY2UsIE1JTl9OSUNFLCBNQVhfTklDRSk7CiAKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtMzg0NSw3ICszODYwLDcgQEAKIAllbHNlIGlmICh0YXNrX2hhc19ydF9wb2xpY3kocCkpCiAJCWF0dHIuc2NoZWRfcHJpb3JpdHkgPSBwLT5ydF9wcmlvcml0eTsKIAllbHNlCi0JCWF0dHIuc2NoZWRfbmljZSA9IFRBU0tfTklDRShwKTsKKwkJYXR0ci5zY2hlZF9uaWNlID0gdGFza19uaWNlKHApOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKQEAgLTQ0ODMsNiArNDQ5OCw3IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlycS0+Y3VyciA9IHJxLT5pZGxlID0gaWRsZTsKKwlpZGxlLT5vbl9ycSA9IDE7CiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQogCWlkbGUtPm9uX2NwdSA9IDE7CiAjZW5kaWYKQEAgLTQ3MDIsOCArNDcxOCwxMCBAQAogCiAJQlVHX09OKGNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CiAKLQlpZiAobW0gIT0gJmluaXRfbW0pCisJaWYgKG1tICE9ICZpbml0X21tKSB7CiAJCXN3aXRjaF9tbShtbSwgJmluaXRfbW0sIGN1cnJlbnQpOworCQlmaW5pc2hfYXJjaF9wb3N0X2xvY2tfc3dpdGNoKCk7CisJfQogCW1tZHJvcChtbSk7CiB9CiAKQEAgLTQ3MjEsNiArNDczOSwyMiBAQAogCQlhdG9taWNfbG9uZ19hZGQoZGVsdGEsICZjYWxjX2xvYWRfdGFza3MpOwogfQogCitzdGF0aWMgdm9pZCBwdXRfcHJldl90YXNrX2Zha2Uoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQoreworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzIGZha2Vfc2NoZWRfY2xhc3MgPSB7CisJLnB1dF9wcmV2X3Rhc2sgPSBwdXRfcHJldl90YXNrX2Zha2UsCit9OworCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0IGZha2VfdGFzayA9IHsKKwkvKgorCSAqIEF2b2lkIHB1bGxfe3J0LGRsfV90YXNrKCkKKwkgKi8KKwkucHJpbyA9IE1BWF9QUklPICsgMSwKKwkuc2NoZWRfY2xhc3MgPSAmZmFrZV9zY2hlZF9jbGFzcywKK307CisKIC8qCiAgKiBNaWdyYXRlIGFsbCB0YXNrcyBmcm9tIHRoZSBycSwgc2xlZXBpbmcgdGFza3Mgd2lsbCBiZSBtaWdyYXRlZCBieQogICogdHJ5X3RvX3dha2VfdXAoKS0+c2VsZWN0X3Rhc2tfcnEoKS4KQEAgLTQ3NjEsNyArNDc5NSw3IEBACiAJCWlmIChycS0+bnJfcnVubmluZyA9PSAxKQogCQkJYnJlYWs7CiAKLQkJbmV4dCA9IHBpY2tfbmV4dF90YXNrKHJxKTsKKwkJbmV4dCA9IHBpY2tfbmV4dF90YXNrKHJxLCAmZmFrZV90YXNrKTsKIAkJQlVHX09OKCFuZXh0KTsKIAkJbmV4dC0+c2NoZWRfY2xhc3MtPnB1dF9wcmV2X3Rhc2socnEsIG5leHQpOwogCkBAIC00ODUxLDcgKzQ4ODUsNyBAQAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgKgogc2RfYWxsb2NfY3RsX2RvbWFpbl90YWJsZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSA9IHNkX2FsbG9jX2N0bF9lbnRyeSgxMyk7CisJc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSBzZF9hbGxvY19jdGxfZW50cnkoMTQpOwogCiAJaWYgKHRhYmxlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwpAQCAtNDg3OSw5ICs0OTEzLDEyIEBACiAJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCwgZmFsc2UpOwogCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMTBdLCAiZmxhZ3MiLCAmc2QtPmZsYWdzLAogCQlzaXplb2YoaW50KSwgMDY0NCwgcHJvY19kb2ludHZlY19taW5tYXgsIGZhbHNlKTsKLQlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzExXSwgIm5hbWUiLCBzZC0+bmFtZSwKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzExXSwgIm1heF9uZXdpZGxlX2xiX2Nvc3QiLAorCQkmc2QtPm1heF9uZXdpZGxlX2xiX2Nvc3QsCisJCXNpemVvZihsb25nKSwgMDY0NCwgcHJvY19kb3Vsb25ndmVjX21pbm1heCwgZmFsc2UpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMTJdLCAibmFtZSIsIHNkLT5uYW1lLAogCQlDT1JFTkFNRV9NQVhfU0laRSwgMDQ0NCwgcHJvY19kb3N0cmluZywgZmFsc2UpOwotCS8qICZ0YWJsZVsxMl0gaXMgdGVybWluYXRvciAqLworCS8qICZ0YWJsZVsxM10gaXMgdGVybWluYXRvciAqLwogCiAJcmV0dXJuIHRhYmxlOwogfQpAQCAtNjg1OCw3ICs2ODk1LDYgQEAKIAogCQlycS0+cnQucnRfcnVudGltZSA9IGRlZl9ydF9iYW5kd2lkdGgucnRfcnVudGltZTsKICNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLQkJSU5JVF9MSVNUX0hFQUQoJnJxLT5sZWFmX3J0X3JxX2xpc3QpOwogCQlpbml0X3RnX3J0X2VudHJ5KCZyb290X3Rhc2tfZ3JvdXAsICZycS0+cnQsIE5VTEwsIGksIE5VTEwpOwogI2VuZGlmCiAKQEAgLTY5NDcsNyArNjk4Myw4IEBACiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9qaWZmeTsJLyogcmF0ZWxpbWl0aW5nICovCiAKIAlyY3Vfc2xlZXBfY2hlY2soKTsgLyogV0FSTl9PTl9PTkNFKCkgYnkgZGVmYXVsdCwgbm8gcmF0ZSBsaW1pdCByZXFkLiAqLwotCWlmICgocHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpICYmICFpcnFzX2Rpc2FibGVkKCkpIHx8CisJaWYgKChwcmVlbXB0X2NvdW50X2VxdWFscyhwcmVlbXB0X29mZnNldCkgJiYgIWlycXNfZGlzYWJsZWQoKSAmJgorCSAgICAgIWlzX2lkbGVfdGFzayhjdXJyZW50KSkgfHwKIAkgICAgc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SVU5OSU5HIHx8IG9vcHNfaW5fcHJvZ3Jlc3MpCiAJCXJldHVybjsKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcHJldl9qaWZmeSArIEhaKSAmJiBwcmV2X2ppZmZ5KQpAQCAtNjk2NSw2ICs3MDAyLDEzIEBACiAJZGVidWdfc2hvd19oZWxkX2xvY2tzKGN1cnJlbnQpOwogCWlmIChpcnFzX2Rpc2FibGVkKCkpCiAJCXByaW50X2lycXRyYWNlX2V2ZW50cyhjdXJyZW50KTsKKyNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAorCWlmICghcHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpKSB7CisJCXByX2VycigiUHJlZW1wdGlvbiBkaXNhYmxlZCBhdDoiKTsKKwkJcHJpbnRfaXBfc3ltKGN1cnJlbnQtPnByZWVtcHRfZGlzYWJsZV9pcCk7CisJCXByX2NvbnQoIlxuIik7CisJfQorI2VuZGlmCiAJZHVtcF9zdGFjaygpOwogfQogRVhQT1JUX1NZTUJPTChfX21pZ2h0X3NsZWVwKTsKQEAgLTcwMTgsNyArNzA2Miw3IEBACiAJCQkgKiBSZW5pY2UgbmVnYXRpdmUgbmljZSBsZXZlbCB1c2Vyc3BhY2UKIAkJCSAqIHRhc2tzIGJhY2sgdG8gMDoKIAkJCSAqLwotCQkJaWYgKFRBU0tfTklDRShwKSA8IDAgJiYgcC0+bW0pCisJCQlpZiAodGFza19uaWNlKHApIDwgMCAmJiBwLT5tbSkKIAkJCQlzZXRfdXNlcl9uaWNlKHAsIDApOwogCQkJY29udGludWU7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMgYi9rZXJuZWwvc2NoZWQvY3B1dGltZS5jCmluZGV4IDk5OTQ3OTEuLmE5NTA5N2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMKKysrIGIva2VybmVsL3NjaGVkL2NwdXRpbWUuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJcC0+dXRpbWVzY2FsZWQgKz0gY3B1dGltZV9zY2FsZWQ7CiAJYWNjb3VudF9ncm91cF91c2VyX3RpbWUocCwgY3B1dGltZSk7CiAKLQlpbmRleCA9IChUQVNLX05JQ0UocCkgPiAwKSA/IENQVVRJTUVfTklDRSA6IENQVVRJTUVfVVNFUjsKKwlpbmRleCA9ICh0YXNrX25pY2UocCkgPiAwKSA/IENQVVRJTUVfTklDRSA6IENQVVRJTUVfVVNFUjsKIAogCS8qIEFkZCB1c2VyIHRpbWUgdG8gY3B1c3RhdC4gKi8KIAl0YXNrX2dyb3VwX2FjY291bnRfZmllbGQocCwgaW5kZXgsIChfX2ZvcmNlIHU2NCkgY3B1dGltZSk7CkBAIC0xNjksNyArMTY5LDcgQEAKIAlwLT5ndGltZSArPSBjcHV0aW1lOwogCiAJLyogQWRkIGd1ZXN0IHRpbWUgdG8gY3B1c3RhdC4gKi8KLQlpZiAoVEFTS19OSUNFKHApID4gMCkgeworCWlmICh0YXNrX25pY2UocCkgPiAwKSB7CiAJCWNwdXN0YXRbQ1BVVElNRV9OSUNFXSArPSAoX19mb3JjZSB1NjQpIGNwdXRpbWU7CiAJCWNwdXN0YXRbQ1BVVElNRV9HVUVTVF9OSUNFXSArPSAoX19mb3JjZSB1NjQpIGNwdXRpbWU7CiAJfSBlbHNlIHsKQEAgLTI1OCwxNiArMjU4LDIyIEBACiB7CiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUCiAJaWYgKHN0YXRpY19rZXlfZmFsc2UoJnBhcmF2aXJ0X3N0ZWFsX2VuYWJsZWQpKSB7Ci0JCXU2NCBzdGVhbCwgc3QgPSAwOworCQl1NjQgc3RlYWw7CisJCWNwdXRpbWVfdCBzdGVhbF9jdDsKIAogCQlzdGVhbCA9IHBhcmF2aXJ0X3N0ZWFsX2Nsb2NrKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCXN0ZWFsIC09IHRoaXNfcnEoKS0+cHJldl9zdGVhbF90aW1lOwogCi0JCXN0ID0gc3RlYWxfdGlja3Moc3RlYWwpOwotCQl0aGlzX3JxKCktPnByZXZfc3RlYWxfdGltZSArPSBzdCAqIFRJQ0tfTlNFQzsKKwkJLyoKKwkJICogY3B1dGltZV90IG1heSBiZSBsZXNzIHByZWNpc2UgdGhhbiBuc2VjcyAoZWc6IGlmIGl0J3MKKwkJICogYmFzZWQgb24gamlmZmllcykuIExldHMgY2FzdCB0aGUgcmVzdWx0IHRvIGNwdXRpbWUKKwkJICogZ3JhbnVsYXJpdHkgYW5kIGFjY291bnQgdGhlIHJlc3Qgb24gdGhlIG5leHQgcm91bmRzLgorCQkgKi8KKwkJc3RlYWxfY3QgPSBuc2Vjc190b19jcHV0aW1lKHN0ZWFsKTsKKwkJdGhpc19ycSgpLT5wcmV2X3N0ZWFsX3RpbWUgKz0gY3B1dGltZV90b19uc2VjcyhzdGVhbF9jdCk7CiAKLQkJYWNjb3VudF9zdGVhbF90aW1lKHN0KTsKLQkJcmV0dXJuIHN0OworCQlhY2NvdW50X3N0ZWFsX3RpbWUoc3RlYWxfY3QpOworCQlyZXR1cm4gc3RlYWxfY3Q7CiAJfQogI2VuZGlmCiAJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwppbmRleCA2ZTc5YjNmLi4yN2VmNDA5IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYworKysgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwpAQCAtMjEwLDYgKzIxMCwxNiBAQAogCiBzdGF0aWMgaW50IHB1c2hfZGxfdGFzayhzdHJ1Y3QgcnEgKnJxKTsKIAorc3RhdGljIGlubGluZSBib29sIG5lZWRfcHVsbF9kbF90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3sKKwlyZXR1cm4gZGxfdGFzayhwcmV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wb3N0X3NjaGVkdWxlKHN0cnVjdCBycSAqcnEpCit7CisJcnEtPnBvc3Rfc2NoZWR1bGUgPSBoYXNfcHVzaGFibGVfZGxfdGFza3MocnEpOworfQorCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lCkBAIC0yMzIsNiArMjQyLDE5IEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZWVkX3B1bGxfZGxfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsX2RsX3Rhc2soc3RydWN0IHJxICpycSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wb3N0X3NjaGVkdWxlKHN0cnVjdCBycSAqcnEpCit7Cit9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiBzdGF0aWMgdm9pZCBlbnF1ZXVlX3Rhc2tfZGwoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOwpAQCAtNTg2LDggKzYwOSw4IEBACiAJICogYXBwcm9hY2ggbmVlZCBmdXJ0aGVyIHN0dWR5LgogCSAqLwogCWRlbHRhX2V4ZWMgPSBycV9jbG9ja190YXNrKHJxKSAtIGN1cnItPnNlLmV4ZWNfc3RhcnQ7Ci0JaWYgKHVubGlrZWx5KChzNjQpZGVsdGFfZXhlYyA8IDApKQotCQlkZWx0YV9leGVjID0gMDsKKwlpZiAodW5saWtlbHkoKHM2NClkZWx0YV9leGVjIDw9IDApKQorCQlyZXR1cm47CiAKIAlzY2hlZHN0YXRfc2V0KGN1cnItPnNlLnN0YXRpc3RpY3MuZXhlY19tYXgsCiAJCSAgICAgIG1heChjdXJyLT5zZS5zdGF0aXN0aWNzLmV4ZWNfbWF4LCBkZWx0YV9leGVjKSk7CkBAIC05NDIsNiArOTY1LDggQEAKIAlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwogfQogCitzdGF0aWMgaW50IHB1bGxfZGxfdGFzayhzdHJ1Y3QgcnEgKnRoaXNfcnEpOworCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAvKgpAQCAtOTg4LDcgKzEwMTMsNyBAQAogCXJldHVybiByYl9lbnRyeShsZWZ0LCBzdHJ1Y3Qgc2NoZWRfZGxfZW50aXR5LCByYl9ub2RlKTsKIH0KIAotc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19kbChzdHJ1Y3QgcnEgKnJxKQorc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19kbChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCiB7CiAJc3RydWN0IHNjaGVkX2RsX2VudGl0eSAqZGxfc2U7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtOTk2LDkgKzEwMjEsMjAgQEAKIAogCWRsX3JxID0gJnJxLT5kbDsKIAorCWlmIChuZWVkX3B1bGxfZGxfdGFzayhycSwgcHJldikpCisJCXB1bGxfZGxfdGFzayhycSk7CisJLyoKKwkgKiBXaGVuIHByZXYgaXMgREwsIHdlIG1heSB0aHJvdHRsZSBpdCBpbiBwdXRfcHJldl90YXNrKCkuCisJICogU28sIHdlIHVwZGF0ZSB0aW1lIGJlZm9yZSB3ZSBjaGVjayBmb3IgZGxfbnJfcnVubmluZy4KKwkgKi8KKwlpZiAocHJldi0+c2NoZWRfY2xhc3MgPT0gJmRsX3NjaGVkX2NsYXNzKQorCQl1cGRhdGVfY3Vycl9kbChycSk7CisKIAlpZiAodW5saWtlbHkoIWRsX3JxLT5kbF9ucl9ydW5uaW5nKSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKwogCWRsX3NlID0gcGlja19uZXh0X2RsX2VudGl0eShycSwgZGxfcnEpOwogCUJVR19PTighZGxfc2UpOwogCkBAIC0xMDEzLDkgKzEwNDksNyBAQAogCQlzdGFydF9ocnRpY2tfZGwocnEsIHApOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU01QCi0JcnEtPnBvc3Rfc2NoZWR1bGUgPSBoYXNfcHVzaGFibGVfZGxfdGFza3MocnEpOwotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwlzZXRfcG9zdF9zY2hlZHVsZShycSk7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTE0MjQsMTMgKzE0NTgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHByZV9zY2hlZHVsZV9kbChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCi17Ci0JLyogVHJ5IHRvIHB1bGwgb3RoZXIgdGFza3MgaGVyZSAqLwotCWlmIChkbF90YXNrKHByZXYpKQotCQlwdWxsX2RsX3Rhc2socnEpOwotfQotCiBzdGF0aWMgdm9pZCBwb3N0X3NjaGVkdWxlX2RsKHN0cnVjdCBycSAqcnEpCiB7CiAJcHVzaF9kbF90YXNrcyhycSk7CkBAIC0xNTU4LDcgKzE1ODUsNyBAQAogCWlmICh1bmxpa2VseShwLT5kbC5kbF90aHJvdHRsZWQpKQogCQlyZXR1cm47CiAKLQlpZiAocC0+b25fcnEgfHwgcnEtPmN1cnIgIT0gcCkgeworCWlmIChwLT5vbl9ycSAmJiBycS0+Y3VyciAhPSBwKSB7CiAjaWZkZWYgQ09ORklHX1NNUAogCQlpZiAocnEtPmRsLm92ZXJsb2FkZWQgJiYgcHVzaF9kbF90YXNrKHJxKSAmJiBycSAhPSB0YXNrX3JxKHApKQogCQkJLyogT25seSByZXNjaGVkdWxlIGlmIHB1c2hpbmcgZmFpbGVkICovCkBAIC0xNjIzLDcgKzE2NTAsNiBAQAogCS5zZXRfY3B1c19hbGxvd2VkICAgICAgID0gc2V0X2NwdXNfYWxsb3dlZF9kbCwKIAkucnFfb25saW5lICAgICAgICAgICAgICA9IHJxX29ubGluZV9kbCwKIAkucnFfb2ZmbGluZSAgICAgICAgICAgICA9IHJxX29mZmxpbmVfZGwsCi0JLnByZV9zY2hlZHVsZQkJPSBwcmVfc2NoZWR1bGVfZGwsCiAJLnBvc3Rfc2NoZWR1bGUJCT0gcG9zdF9zY2hlZHVsZV9kbCwKIAkudGFza193b2tlbgkJPSB0YXNrX3dva2VuX2RsLAogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvZGVidWcuYyBiL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCmluZGV4IGRkNTJlN2YuLmYzMzQ0YzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCisrKyBiL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCkBAIC0zMjEsNiArMzIxLDcgQEAKIAlQKHNjaGVkX2dvaWRsZSk7CiAjaWZkZWYgQ09ORklHX1NNUAogCVA2NChhdmdfaWRsZSk7CisJUDY0KG1heF9pZGxlX2JhbGFuY2VfY29zdCk7CiAjZW5kaWYKIAogCVAodHR3dV9jb3VudCk7CkBAIC01MzMsMTUgKzUzNCwxNSBAQAogCQkJdW5zaWduZWQgbG9uZyBucl9mYXVsdHMgPSAtMTsKIAkJCWludCBjcHVfY3VycmVudCwgaG9tZV9ub2RlOwogCi0JCQlpZiAocC0+bnVtYV9mYXVsdHMpCi0JCQkJbnJfZmF1bHRzID0gcC0+bnVtYV9mYXVsdHNbMipub2RlICsgaV07CisJCQlpZiAocC0+bnVtYV9mYXVsdHNfbWVtb3J5KQorCQkJCW5yX2ZhdWx0cyA9IHAtPm51bWFfZmF1bHRzX21lbW9yeVsyKm5vZGUgKyBpXTsKIAogCQkJY3B1X2N1cnJlbnQgPSAhaSA/ICh0YXNrX25vZGUocCkgPT0gbm9kZSkgOgogCQkJCShwb2wgJiYgbm9kZV9pc3NldChub2RlLCBwb2wtPnYubm9kZXMpKTsKIAogCQkJaG9tZV9ub2RlID0gKHAtPm51bWFfcHJlZmVycmVkX25pZCA9PSBub2RlKTsKIAotCQkJU0VRX3ByaW50ZihtLCAibnVtYV9mYXVsdHMsICVkLCAlZCwgJWQsICVkLCAlbGRcbiIsCisJCQlTRVFfcHJpbnRmKG0sICJudW1hX2ZhdWx0c19tZW1vcnksICVkLCAlZCwgJWQsICVkLCAlbGRcbiIsCiAJCQkJaSwgbm9kZSwgY3B1X2N1cnJlbnQsIGhvbWVfbm9kZSwgbnJfZmF1bHRzKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9mYWlyLmMgYi9rZXJuZWwvc2NoZWQvZmFpci5jCmluZGV4IDliNGM0ZjMuLjdlOWJkMGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9mYWlyLmMKKysrIGIva2VybmVsL3NjaGVkL2ZhaXIuYwpAQCAtMzIyLDEzICszMjIsMTMgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjZnNfcnEsICZycS0+bGVhZl9jZnNfcnFfbGlzdCwgbGVhZl9jZnNfcnFfbGlzdCkKIAogLyogRG8gdGhlIHR3byAoZW5xdWV1ZWQpIGVudGl0aWVzIGJlbG9uZyB0byB0aGUgc2FtZSBncm91cCA/ICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY2ZzX3JxICoKIGlzX3NhbWVfZ3JvdXAoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnBzZSkKIHsKIAlpZiAoc2UtPmNmc19ycSA9PSBwc2UtPmNmc19ycSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiBzZS0+Y2ZzX3JxOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNjaGVkX2VudGl0eSAqcGFyZW50X2VudGl0eShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKQEAgLTMzNiwxNyArMzM2LDYgQEAKIAlyZXR1cm4gc2UtPnBhcmVudDsKIH0KIAotLyogcmV0dXJuIGRlcHRoIGF0IHdoaWNoIGEgc2NoZWQgZW50aXR5IGlzIHByZXNlbnQgaW4gdGhlIGhpZXJhcmNoeSAqLwotc3RhdGljIGlubGluZSBpbnQgZGVwdGhfc2Uoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci0JaW50IGRlcHRoID0gMDsKLQotCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKLQkJZGVwdGgrKzsKLQotCXJldHVybiBkZXB0aDsKLX0KLQogc3RhdGljIHZvaWQKIGZpbmRfbWF0Y2hpbmdfc2Uoc3RydWN0IHNjaGVkX2VudGl0eSAqKnNlLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICoqcHNlKQogewpAQCAtMzYwLDggKzM0OSw4IEBACiAJICovCiAKIAkvKiBGaXJzdCB3YWxrIHVwIHVudGlsIGJvdGggZW50aXRpZXMgYXJlIGF0IHNhbWUgZGVwdGggKi8KLQlzZV9kZXB0aCA9IGRlcHRoX3NlKCpzZSk7Ci0JcHNlX2RlcHRoID0gZGVwdGhfc2UoKnBzZSk7CisJc2VfZGVwdGggPSAoKnNlKS0+ZGVwdGg7CisJcHNlX2RlcHRoID0gKCpwc2UpLT5kZXB0aDsKIAogCXdoaWxlIChzZV9kZXB0aCA+IHBzZV9kZXB0aCkgewogCQlzZV9kZXB0aC0tOwpAQCAtNDI2LDEyICs0MTUsNiBAQAogI2RlZmluZSBmb3JfZWFjaF9sZWFmX2Nmc19ycShycSwgY2ZzX3JxKSBcCiAJCWZvciAoY2ZzX3JxID0gJnJxLT5jZnM7IGNmc19ycTsgY2ZzX3JxID0gTlVMTCkKIAotc3RhdGljIGlubGluZSBpbnQKLWlzX3NhbWVfZ3JvdXAoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnBzZSkKLXsKLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwYXJlbnRfZW50aXR5KHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewogCXJldHVybiBOVUxMOwpAQCAtODE5LDE0ICs4MDIsNiBAQAogLyogU2NhbiBAc2Nhbl9zaXplIE1CIGV2ZXJ5IEBzY2FuX3BlcmlvZCBhZnRlciBhbiBpbml0aWFsIEBzY2FuX2RlbGF5IGluIG1zICovCiB1bnNpZ25lZCBpbnQgc3lzY3RsX251bWFfYmFsYW5jaW5nX3NjYW5fZGVsYXkgPSAxMDAwOwogCi0vKgotICogQWZ0ZXIgc2tpcHBpbmcgYSBwYWdlIG1pZ3JhdGlvbiBvbiBhIHNoYXJlZCBwYWdlLCBza2lwIE4gbW9yZSBudW1hIHBhZ2UKLSAqIG1pZ3JhdGlvbnMgdW5jb25kaXRpb25hbGx5LiBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBOVU1BIG1pZ3JhdGlvbnMKLSAqIGluIHNoYXJlZCBtZW1vcnkgd29ya2xvYWRzLCBhbmQgaGFzIHRoZSBlZmZlY3Qgb2YgcHVsbGluZyB0YXNrcyB0b3dhcmRzCi0gKiB3aGVyZSB0aGVpciBtZW1vcnkgbGl2ZXMsIG92ZXIgcHVsbGluZyB0aGUgbWVtb3J5IHRvd2FyZHMgdGhlIHRhc2suCi0gKi8KLXVuc2lnbmVkIGludCBzeXNjdGxfbnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCA9IDE2OwotCiBzdGF0aWMgdW5zaWduZWQgaW50IHRhc2tfbnJfc2Nhbl93aW5kb3dzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIHJzcyA9IDA7CkBAIC04OTMsMTAgKzg2OCwyNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdGFza19saXN0OwogCiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwlub2RlbWFza190IGFjdGl2ZV9ub2RlczsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX2ZhdWx0czsKKwkvKgorCSAqIEZhdWx0c19jcHUgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciBtZW1vcnkgc2hvdWxkIG1vdmUKKwkgKiB0b3dhcmRzIHRoZSBDUFUuIEFzIGEgY29uc2VxdWVuY2UsIHRoZXNlIHN0YXRzIGFyZSB3ZWlnaHRlZAorCSAqIG1vcmUgYnkgQ1BVIHVzZSB0aGFuIGJ5IG1lbW9yeSBmYXVsdHMuCisJICovCisJdW5zaWduZWQgbG9uZyAqZmF1bHRzX2NwdTsKIAl1bnNpZ25lZCBsb25nIGZhdWx0c1swXTsKIH07CiAKKy8qIFNoYXJlZCBvciBwcml2YXRlIGZhdWx0cy4gKi8KKyNkZWZpbmUgTlJfTlVNQV9ISU5UX0ZBVUxUX1RZUEVTIDIKKworLyogTWVtb3J5IGFuZCBDUFUgbG9jYWxpdHkgKi8KKyNkZWZpbmUgTlJfTlVNQV9ISU5UX0ZBVUxUX1NUQVRTIChOUl9OVU1BX0hJTlRfRkFVTFRfVFlQRVMgKiAyKQorCisvKiBBdmVyYWdlZCBzdGF0aXN0aWNzLCBhbmQgdGVtcG9yYXJ5IGJ1ZmZlcnMuICovCisjZGVmaW5lIE5SX05VTUFfSElOVF9GQVVMVF9CVUNLRVRTIChOUl9OVU1BX0hJTlRfRkFVTFRfU1RBVFMgKiAyKQorCiBwaWRfdCB0YXNrX251bWFfZ3JvdXBfaWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXJldHVybiBwLT5udW1hX2dyb3VwID8gcC0+bnVtYV9ncm91cC0+Z2lkIDogMDsKQEAgLTkwNCwxNiArODk1LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfZmF1bHRzX2lkeChpbnQgbmlkLCBpbnQgcHJpdikKIHsKLQlyZXR1cm4gMiAqIG5pZCArIHByaXY7CisJcmV0dXJuIE5SX05VTUFfSElOVF9GQVVMVF9UWVBFUyAqIG5pZCArIHByaXY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0YXNrX2ZhdWx0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBuaWQpCiB7Ci0JaWYgKCFwLT5udW1hX2ZhdWx0cykKKwlpZiAoIXAtPm51bWFfZmF1bHRzX21lbW9yeSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcC0+bnVtYV9mYXVsdHNbdGFza19mYXVsdHNfaWR4KG5pZCwgMCldICsKLQkJcC0+bnVtYV9mYXVsdHNbdGFza19mYXVsdHNfaWR4KG5pZCwgMSldOworCXJldHVybiBwLT5udW1hX2ZhdWx0c19tZW1vcnlbdGFza19mYXVsdHNfaWR4KG5pZCwgMCldICsKKwkJcC0+bnVtYV9mYXVsdHNfbWVtb3J5W3Rhc2tfZmF1bHRzX2lkeChuaWQsIDEpXTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdyb3VwX2ZhdWx0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBuaWQpCkBAIC05MjUsNiArOTE2LDEyIEBACiAJCXAtPm51bWFfZ3JvdXAtPmZhdWx0c1t0YXNrX2ZhdWx0c19pZHgobmlkLCAxKV07CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBncm91cF9mYXVsdHNfY3B1KHN0cnVjdCBudW1hX2dyb3VwICpncm91cCwgaW50IG5pZCkKK3sKKwlyZXR1cm4gZ3JvdXAtPmZhdWx0c19jcHVbdGFza19mYXVsdHNfaWR4KG5pZCwgMCldICsKKwkJZ3JvdXAtPmZhdWx0c19jcHVbdGFza19mYXVsdHNfaWR4KG5pZCwgMSldOworfQorCiAvKgogICogVGhlc2UgcmV0dXJuIHRoZSBmcmFjdGlvbiBvZiBhY2Nlc3NlcyBkb25lIGJ5IGEgcGFydGljdWxhciB0YXNrLCBvcgogICogdGFzayBncm91cCwgb24gYSBwYXJ0aWN1bGFyIG51bWEgbm9kZS4gIFRoZSBncm91cCB3ZWlnaHQgaXMgZ2l2ZW4gYQpAQCAtOTM1LDcgKzkzMiw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9mYXVsdHM7CiAKLQlpZiAoIXAtPm51bWFfZmF1bHRzKQorCWlmICghcC0+bnVtYV9mYXVsdHNfbWVtb3J5KQogCQlyZXR1cm4gMDsKIAogCXRvdGFsX2ZhdWx0cyA9IHAtPnRvdGFsX251bWFfZmF1bHRzOwpAQCAtOTU0LDYgKzk1MSw2OSBAQAogCXJldHVybiAxMDAwICogZ3JvdXBfZmF1bHRzKHAsIG5pZCkgLyBwLT5udW1hX2dyb3VwLT50b3RhbF9mYXVsdHM7CiB9CiAKK2Jvb2wgc2hvdWxkX251bWFfbWlncmF0ZV9tZW1vcnkoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcGFnZSAqIHBhZ2UsCisJCQkJaW50IHNyY19uaWQsIGludCBkc3RfY3B1KQoreworCXN0cnVjdCBudW1hX2dyb3VwICpuZyA9IHAtPm51bWFfZ3JvdXA7CisJaW50IGRzdF9uaWQgPSBjcHVfdG9fbm9kZShkc3RfY3B1KTsKKwlpbnQgbGFzdF9jcHVwaWQsIHRoaXNfY3B1cGlkOworCisJdGhpc19jcHVwaWQgPSBjcHVfcGlkX3RvX2NwdXBpZChkc3RfY3B1LCBjdXJyZW50LT5waWQpOworCisJLyoKKwkgKiBNdWx0aS1zdGFnZSBub2RlIHNlbGVjdGlvbiBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBwZXJpb2RpYworCSAqIG1pZ3JhdGlvbiBmYXVsdCB0byBidWlsZCBhIHRlbXBvcmFsIHRhc2s8LT5wYWdlIHJlbGF0aW9uLiBCeSB1c2luZworCSAqIGEgdHdvLXN0YWdlIGZpbHRlciB3ZSByZW1vdmUgc2hvcnQvdW5saWtlbHkgcmVsYXRpb25zLgorCSAqCisJICogVXNpbmcgUChwKSB+IG5fcCAvIG5fdCBhcyBwZXIgZnJlcXVlbnRpc3QgcHJvYmFiaWxpdHksIHdlIGNhbiBlcXVhdGUKKwkgKiBhIHRhc2sncyB1c2FnZSBvZiBhIHBhcnRpY3VsYXIgcGFnZSAobl9wKSBwZXIgdG90YWwgdXNhZ2Ugb2YgdGhpcworCSAqIHBhZ2UgKG5fdCkgKGluIGEgZ2l2ZW4gdGltZS1zcGFuKSB0byBhIHByb2JhYmlsaXR5LgorCSAqCisJICogT3VyIHBlcmlvZGljIGZhdWx0cyB3aWxsIHNhbXBsZSB0aGlzIHByb2JhYmlsaXR5IGFuZCBnZXR0aW5nIHRoZQorCSAqIHNhbWUgcmVzdWx0IHR3aWNlIGluIGEgcm93LCBnaXZlbiB0aGVzZSBzYW1wbGVzIGFyZSBmdWxseQorCSAqIGluZGVwZW5kZW50LCBpcyB0aGVuIGdpdmVuIGJ5IFAobileMiwgcHJvdmlkZWQgb3VyIHNhbXBsZSBwZXJpb2QKKwkgKiBpcyBzdWZmaWNpZW50bHkgc2hvcnQgY29tcGFyZWQgdG8gdGhlIHVzYWdlIHBhdHRlcm4uCisJICoKKwkgKiBUaGlzIHF1YWRyaWMgc3F1aXNoZXMgc21hbGwgcHJvYmFiaWxpdGllcywgbWFraW5nIGl0IGxlc3MgbGlrZWx5IHdlCisJICogYWN0IG9uIGFuIHVubGlrZWx5IHRhc2s8LT5wYWdlIHJlbGF0aW9uLgorCSAqLworCWxhc3RfY3B1cGlkID0gcGFnZV9jcHVwaWRfeGNoZ19sYXN0KHBhZ2UsIHRoaXNfY3B1cGlkKTsKKwlpZiAoIWNwdXBpZF9waWRfdW5zZXQobGFzdF9jcHVwaWQpICYmCisJCQkJY3B1cGlkX3RvX25pZChsYXN0X2NwdXBpZCkgIT0gZHN0X25pZCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogQWx3YXlzIGFsbG93IG1pZ3JhdGUgb24gcHJpdmF0ZSBmYXVsdHMgKi8KKwlpZiAoY3B1cGlkX21hdGNoX3BpZChwLCBsYXN0X2NwdXBpZCkpCisJCXJldHVybiB0cnVlOworCisJLyogQSBzaGFyZWQgZmF1bHQsIGJ1dCBwLT5udW1hX2dyb3VwIGhhcyBub3QgYmVlbiBzZXQgdXAgeWV0LiAqLworCWlmICghbmcpCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBEbyBub3QgbWlncmF0ZSBpZiB0aGUgZGVzdGluYXRpb24gaXMgbm90IGEgbm9kZSB0aGF0CisJICogaXMgYWN0aXZlbHkgdXNlZCBieSB0aGlzIG51bWEgZ3JvdXAuCisJICovCisJaWYgKCFub2RlX2lzc2V0KGRzdF9uaWQsIG5nLT5hY3RpdmVfbm9kZXMpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIFNvdXJjZSBpcyBhIG5vZGUgdGhhdCBpcyBub3QgYWN0aXZlbHkgdXNlZCBieSB0aGlzCisJICogbnVtYSBncm91cCwgd2hpbGUgdGhlIGRlc3RpbmF0aW9uIGlzLiBNaWdyYXRlLgorCSAqLworCWlmICghbm9kZV9pc3NldChzcmNfbmlkLCBuZy0+YWN0aXZlX25vZGVzKSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKgorCSAqIEJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgbm9kZXMgaW4gYWN0aXZlCisJICogdXNlIGJ5IHRoaXMgbnVtYSBncm91cC4gTWF4aW1pemUgbWVtb3J5IGJhbmR3aWR0aAorCSAqIGJ5IG1pZ3JhdGluZyBmcm9tIG1vcmUgaGVhdmlseSB1c2VkIGdyb3VwcywgdG8gbGVzcworCSAqIGhlYXZpbHkgdXNlZCBvbmVzLCBzcHJlYWRpbmcgdGhlIGxvYWQgYXJvdW5kLgorCSAqIFVzZSBhIDEvNCBoeXN0ZXJlc2lzIHRvIGF2b2lkIHNwdXJpb3VzIHBhZ2UgbW92ZW1lbnQuCisJICovCisJcmV0dXJuIGdyb3VwX2ZhdWx0cyhwLCBkc3RfbmlkKSA8IChncm91cF9mYXVsdHMocCwgc3JjX25pZCkgKiAzIC8gNCk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHdlaWdodGVkX2NwdWxvYWQoY29uc3QgaW50IGNwdSk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzb3VyY2VfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0YXJnZXRfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSk7CkBAIC0xMjY3LDcgKzEzMjcsNyBAQAogc3RhdGljIHZvaWQgbnVtYV9taWdyYXRlX3ByZWZlcnJlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJLyogVGhpcyB0YXNrIGhhcyBubyBOVU1BIGZhdWx0IHN0YXRpc3RpY3MgeWV0ICovCi0JaWYgKHVubGlrZWx5KHAtPm51bWFfcHJlZmVycmVkX25pZCA9PSAtMSB8fCAhcC0+bnVtYV9mYXVsdHMpKQorCWlmICh1bmxpa2VseShwLT5udW1hX3ByZWZlcnJlZF9uaWQgPT0gLTEgfHwgIXAtPm51bWFfZmF1bHRzX21lbW9yeSkpCiAJCXJldHVybjsKIAogCS8qIFBlcmlvZGljYWxseSByZXRyeSBtaWdyYXRpbmcgdGhlIHRhc2sgdG8gdGhlIHByZWZlcnJlZCBub2RlICovCkBAIC0xMjgyLDYgKzEzNDIsMzggQEAKIH0KIAogLyoKKyAqIEZpbmQgdGhlIG5vZGVzIG9uIHdoaWNoIHRoZSB3b3JrbG9hZCBpcyBhY3RpdmVseSBydW5uaW5nLiBXZSBkbyB0aGlzIGJ5CisgKiB0cmFja2luZyB0aGUgbm9kZXMgZnJvbSB3aGljaCBOVU1BIGhpbnRpbmcgZmF1bHRzIGFyZSB0cmlnZ2VyZWQuIFRoaXMgY2FuCisgKiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgc2V0IG9mIG5vZGVzIHdoZXJlIHRoZSB3b3JrbG9hZCdzIG1lbW9yeSBpcyBjdXJyZW50bHkKKyAqIGxvY2F0ZWQuCisgKgorICogVGhlIGJpdG1hc2sgaXMgdXNlZCB0byBtYWtlIHNtYXJ0ZXIgZGVjaXNpb25zIG9uIHdoZW4gdG8gZG8gTlVNQSBwYWdlCisgKiBtaWdyYXRpb25zLCBUbyBwcmV2ZW50IGZsaXAtZmxvcHBpbmcsIGFuZCBleGNlc3NpdmUgcGFnZSBtaWdyYXRpb25zLCBub2RlcworICogYXJlIGFkZGVkIHdoZW4gdGhleSBjYXVzZSBvdmVyIDYvMTYgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZhdWx0cywgYnV0CisgKiBvbmx5IHJlbW92ZWQgd2hlbiB0aGV5IGRyb3AgYmVsb3cgMy8xNi4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX251bWFfYWN0aXZlX25vZGVfbWFzayhzdHJ1Y3QgbnVtYV9ncm91cCAqbnVtYV9ncm91cCkKK3sKKwl1bnNpZ25lZCBsb25nIGZhdWx0cywgbWF4X2ZhdWx0cyA9IDA7CisJaW50IG5pZDsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlmYXVsdHMgPSBncm91cF9mYXVsdHNfY3B1KG51bWFfZ3JvdXAsIG5pZCk7CisJCWlmIChmYXVsdHMgPiBtYXhfZmF1bHRzKQorCQkJbWF4X2ZhdWx0cyA9IGZhdWx0czsKKwl9CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJZmF1bHRzID0gZ3JvdXBfZmF1bHRzX2NwdShudW1hX2dyb3VwLCBuaWQpOworCQlpZiAoIW5vZGVfaXNzZXQobmlkLCBudW1hX2dyb3VwLT5hY3RpdmVfbm9kZXMpKSB7CisJCQlpZiAoZmF1bHRzID4gbWF4X2ZhdWx0cyAqIDYgLyAxNikKKwkJCQlub2RlX3NldChuaWQsIG51bWFfZ3JvdXAtPmFjdGl2ZV9ub2Rlcyk7CisJCX0gZWxzZSBpZiAoZmF1bHRzIDwgbWF4X2ZhdWx0cyAqIDMgLyAxNikKKwkJCW5vZGVfY2xlYXIobmlkLCBudW1hX2dyb3VwLT5hY3RpdmVfbm9kZXMpOworCX0KK30KKworLyoKICAqIFdoZW4gYWRhcHRpbmcgdGhlIHNjYW4gcmF0ZSwgdGhlIHBlcmlvZCBpcyBkaXZpZGVkIGludG8gTlVNQV9QRVJJT0RfU0xPVFMKICAqIGluY3JlbWVudHMuIFRoZSBtb3JlIGxvY2FsIHRoZSBmYXVsdCBzdGF0aXN0aWNzIGFyZSwgdGhlIGhpZ2hlciB0aGUgc2NhbgogICogcGVyaW9kIHdpbGwgYmUgZm9yIHRoZSBuZXh0IHNjYW4gd2luZG93LiBJZiBsb2NhbC9yZW1vdGUgcmF0aW8gaXMgYmVsb3cKQEAgLTEzNTUsMTEgKzE0NDcsNDEgQEAKIAltZW1zZXQocC0+bnVtYV9mYXVsdHNfbG9jYWxpdHksIDAsIHNpemVvZihwLT5udW1hX2ZhdWx0c19sb2NhbGl0eSkpOwogfQogCisvKgorICogR2V0IHRoZSBmcmFjdGlvbiBvZiB0aW1lIHRoZSB0YXNrIGhhcyBiZWVuIHJ1bm5pbmcgc2luY2UgdGhlIGxhc3QKKyAqIE5VTUEgcGxhY2VtZW50IGN5Y2xlLiBUaGUgc2NoZWR1bGVyIGtlZXBzIHNpbWlsYXIgc3RhdGlzdGljcywgYnV0CisgKiBkZWNheXMgdGhvc2Ugb24gYSAzMm1zIHBlcmlvZCwgd2hpY2ggaXMgb3JkZXJzIG9mIG1hZ25pdHVkZSBvZmYKKyAqIGZyb20gdGhlIGRvemVucy1vZi1zZWNvbmRzIE5VTUEgYmFsYW5jaW5nIHBlcmlvZC4gVXNlIHRoZSBzY2hlZHVsZXIKKyAqIHN0YXRzIG9ubHkgaWYgdGhlIHRhc2sgaXMgc28gbmV3IHRoZXJlIGFyZSBubyBOVU1BIHN0YXRpc3RpY3MgeWV0LgorICovCitzdGF0aWMgdTY0IG51bWFfZ2V0X2F2Z19ydW50aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdTY0ICpwZXJpb2QpCit7CisJdTY0IHJ1bnRpbWUsIGRlbHRhLCBub3c7CisJLyogVXNlIHRoZSBzdGFydCBvZiB0aGlzIHRpbWUgc2xpY2UgdG8gYXZvaWQgY2FsY3VsYXRpb25zLiAqLworCW5vdyA9IHAtPnNlLmV4ZWNfc3RhcnQ7CisJcnVudGltZSA9IHAtPnNlLnN1bV9leGVjX3J1bnRpbWU7CisKKwlpZiAocC0+bGFzdF90YXNrX251bWFfcGxhY2VtZW50KSB7CisJCWRlbHRhID0gcnVudGltZSAtIHAtPmxhc3Rfc3VtX2V4ZWNfcnVudGltZTsKKwkJKnBlcmlvZCA9IG5vdyAtIHAtPmxhc3RfdGFza19udW1hX3BsYWNlbWVudDsKKwl9IGVsc2UgeworCQlkZWx0YSA9IHAtPnNlLmF2Zy5ydW5uYWJsZV9hdmdfc3VtOworCQkqcGVyaW9kID0gcC0+c2UuYXZnLnJ1bm5hYmxlX2F2Z19wZXJpb2Q7CisJfQorCisJcC0+bGFzdF9zdW1fZXhlY19ydW50aW1lID0gcnVudGltZTsKKwlwLT5sYXN0X3Rhc2tfbnVtYV9wbGFjZW1lbnQgPSBub3c7CisKKwlyZXR1cm4gZGVsdGE7Cit9CisKIHN0YXRpYyB2b2lkIHRhc2tfbnVtYV9wbGFjZW1lbnQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWludCBzZXEsIG5pZCwgbWF4X25pZCA9IC0xLCBtYXhfZ3JvdXBfbmlkID0gLTE7CiAJdW5zaWduZWQgbG9uZyBtYXhfZmF1bHRzID0gMCwgbWF4X2dyb3VwX2ZhdWx0cyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmYXVsdF90eXBlc1syXSA9IHsgMCwgMCB9OworCXVuc2lnbmVkIGxvbmcgdG90YWxfZmF1bHRzOworCXU2NCBydW50aW1lLCBwZXJpb2Q7CiAJc3BpbmxvY2tfdCAqZ3JvdXBfbG9jayA9IE5VTEw7CiAKIAlzZXEgPSBBQ0NFU1NfT05DRShwLT5tbS0+bnVtYV9zY2FuX3NlcSk7CkBAIC0xMzY4LDYgKzE0OTAsMTAgQEAKIAlwLT5udW1hX3NjYW5fc2VxID0gc2VxOwogCXAtPm51bWFfc2Nhbl9wZXJpb2RfbWF4ID0gdGFza19zY2FuX21heChwKTsKIAorCXRvdGFsX2ZhdWx0cyA9IHAtPm51bWFfZmF1bHRzX2xvY2FsaXR5WzBdICsKKwkJICAgICAgIHAtPm51bWFfZmF1bHRzX2xvY2FsaXR5WzFdOworCXJ1bnRpbWUgPSBudW1hX2dldF9hdmdfcnVudGltZShwLCAmcGVyaW9kKTsKKwogCS8qIElmIHRoZSB0YXNrIGlzIHBhcnQgb2YgYSBncm91cCBwcmV2ZW50IHBhcmFsbGVsIHVwZGF0ZXMgdG8gZ3JvdXAgc3RhdHMgKi8KIAlpZiAocC0+bnVtYV9ncm91cCkgewogCQlncm91cF9sb2NrID0gJnAtPm51bWFfZ3JvdXAtPmxvY2s7CkBAIC0xMzc5LDI0ICsxNTA1LDM3IEBACiAJCXVuc2lnbmVkIGxvbmcgZmF1bHRzID0gMCwgZ3JvdXBfZmF1bHRzID0gMDsKIAkJaW50IHByaXYsIGk7CiAKLQkJZm9yIChwcml2ID0gMDsgcHJpdiA8IDI7IHByaXYrKykgewotCQkJbG9uZyBkaWZmOworCQlmb3IgKHByaXYgPSAwOyBwcml2IDwgTlJfTlVNQV9ISU5UX0ZBVUxUX1RZUEVTOyBwcml2KyspIHsKKwkJCWxvbmcgZGlmZiwgZl9kaWZmLCBmX3dlaWdodDsKIAogCQkJaSA9IHRhc2tfZmF1bHRzX2lkeChuaWQsIHByaXYpOwotCQkJZGlmZiA9IC1wLT5udW1hX2ZhdWx0c1tpXTsKIAogCQkJLyogRGVjYXkgZXhpc3Rpbmcgd2luZG93LCBjb3B5IGZhdWx0cyBzaW5jZSBsYXN0IHNjYW4gKi8KLQkJCXAtPm51bWFfZmF1bHRzW2ldID4+PSAxOwotCQkJcC0+bnVtYV9mYXVsdHNbaV0gKz0gcC0+bnVtYV9mYXVsdHNfYnVmZmVyW2ldOwotCQkJZmF1bHRfdHlwZXNbcHJpdl0gKz0gcC0+bnVtYV9mYXVsdHNfYnVmZmVyW2ldOwotCQkJcC0+bnVtYV9mYXVsdHNfYnVmZmVyW2ldID0gMDsKKwkJCWRpZmYgPSBwLT5udW1hX2ZhdWx0c19idWZmZXJfbWVtb3J5W2ldIC0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5W2ldIC8gMjsKKwkJCWZhdWx0X3R5cGVzW3ByaXZdICs9IHAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnlbaV07CisJCQlwLT5udW1hX2ZhdWx0c19idWZmZXJfbWVtb3J5W2ldID0gMDsKIAotCQkJZmF1bHRzICs9IHAtPm51bWFfZmF1bHRzW2ldOwotCQkJZGlmZiArPSBwLT5udW1hX2ZhdWx0c1tpXTsKKwkJCS8qCisJCQkgKiBOb3JtYWxpemUgdGhlIGZhdWx0c19mcm9tLCBzbyBhbGwgdGFza3MgaW4gYSBncm91cAorCQkJICogY291bnQgYWNjb3JkaW5nIHRvIENQVSB1c2UsIGluc3RlYWQgb2YgYnkgdGhlIHJhdworCQkJICogbnVtYmVyIG9mIGZhdWx0cy4gVGFza3Mgd2l0aCBsaXR0bGUgcnVudGltZSBoYXZlCisJCQkgKiBsaXR0bGUgb3Zlci1hbGwgaW1wYWN0IG9uIHRocm91Z2hwdXQsIGFuZCB0aHVzIHRoZWlyCisJCQkgKiBmYXVsdHMgYXJlIGxlc3MgaW1wb3J0YW50LgorCQkJICovCisJCQlmX3dlaWdodCA9IGRpdjY0X3U2NChydW50aW1lIDw8IDE2LCBwZXJpb2QgKyAxKTsKKwkJCWZfd2VpZ2h0ID0gKGZfd2VpZ2h0ICogcC0+bnVtYV9mYXVsdHNfYnVmZmVyX2NwdVtpXSkgLworCQkJCSAgICh0b3RhbF9mYXVsdHMgKyAxKTsKKwkJCWZfZGlmZiA9IGZfd2VpZ2h0IC0gcC0+bnVtYV9mYXVsdHNfY3B1W2ldIC8gMjsKKwkJCXAtPm51bWFfZmF1bHRzX2J1ZmZlcl9jcHVbaV0gPSAwOworCisJCQlwLT5udW1hX2ZhdWx0c19tZW1vcnlbaV0gKz0gZGlmZjsKKwkJCXAtPm51bWFfZmF1bHRzX2NwdVtpXSArPSBmX2RpZmY7CisJCQlmYXVsdHMgKz0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5W2ldOwogCQkJcC0+dG90YWxfbnVtYV9mYXVsdHMgKz0gZGlmZjsKIAkJCWlmIChwLT5udW1hX2dyb3VwKSB7CiAJCQkJLyogc2FmZSBiZWNhdXNlIHdlIGNhbiBvbmx5IGNoYW5nZSBvdXIgb3duIGdyb3VwICovCiAJCQkJcC0+bnVtYV9ncm91cC0+ZmF1bHRzW2ldICs9IGRpZmY7CisJCQkJcC0+bnVtYV9ncm91cC0+ZmF1bHRzX2NwdVtpXSArPSBmX2RpZmY7CiAJCQkJcC0+bnVtYV9ncm91cC0+dG90YWxfZmF1bHRzICs9IGRpZmY7CiAJCQkJZ3JvdXBfZmF1bHRzICs9IHAtPm51bWFfZ3JvdXAtPmZhdWx0c1tpXTsKIAkJCX0KQEAgLTE0MTYsNiArMTU1NSw3IEBACiAJdXBkYXRlX3Rhc2tfc2Nhbl9wZXJpb2QocCwgZmF1bHRfdHlwZXNbMF0sIGZhdWx0X3R5cGVzWzFdKTsKIAogCWlmIChwLT5udW1hX2dyb3VwKSB7CisJCXVwZGF0ZV9udW1hX2FjdGl2ZV9ub2RlX21hc2socC0+bnVtYV9ncm91cCk7CiAJCS8qCiAJCSAqIElmIHRoZSBwcmVmZXJyZWQgdGFzayBhbmQgZ3JvdXAgbmlkcyBhcmUgZGlmZmVyZW50LAogCQkgKiBpdGVyYXRlIG92ZXIgdGhlIG5vZGVzIGFnYWluIHRvIGZpbmQgdGhlIGJlc3QgcGxhY2UuCkBAIC0xNDY1LDcgKzE2MDUsNyBAQAogCiAJaWYgKHVubGlrZWx5KCFwLT5udW1hX2dyb3VwKSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnVtYV9ncm91cCkgKwotCQkJCSAgICAyKm5yX25vZGVfaWRzKnNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJCQkgICAgNCpucl9ub2RlX2lkcypzaXplb2YodW5zaWduZWQgbG9uZyk7CiAKIAkJZ3JwID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKIAkJaWYgKCFncnApCkBAIC0xNDc1LDkgKzE2MTUsMTQgQEAKIAkJc3Bpbl9sb2NrX2luaXQoJmdycC0+bG9jayk7CiAJCUlOSVRfTElTVF9IRUFEKCZncnAtPnRhc2tfbGlzdCk7CiAJCWdycC0+Z2lkID0gcC0+cGlkOworCQkvKiBTZWNvbmQgaGFsZiBvZiB0aGUgYXJyYXkgdHJhY2tzIG5pZHMgd2hlcmUgZmF1bHRzIGhhcHBlbiAqLworCQlncnAtPmZhdWx0c19jcHUgPSBncnAtPmZhdWx0cyArIE5SX05VTUFfSElOVF9GQVVMVF9UWVBFUyAqCisJCQkJCQlucl9ub2RlX2lkczsKIAotCQlmb3IgKGkgPSAwOyBpIDwgMipucl9ub2RlX2lkczsgaSsrKQotCQkJZ3JwLT5mYXVsdHNbaV0gPSBwLT5udW1hX2ZhdWx0c1tpXTsKKwkJbm9kZV9zZXQodGFza19ub2RlKGN1cnJlbnQpLCBncnAtPmFjdGl2ZV9ub2Rlcyk7CisKKwkJZm9yIChpID0gMDsgaSA8IE5SX05VTUFfSElOVF9GQVVMVF9TVEFUUyAqIG5yX25vZGVfaWRzOyBpKyspCisJCQlncnAtPmZhdWx0c1tpXSA9IHAtPm51bWFfZmF1bHRzX21lbW9yeVtpXTsKIAogCQlncnAtPnRvdGFsX2ZhdWx0cyA9IHAtPnRvdGFsX251bWFfZmF1bHRzOwogCkBAIC0xNTM0LDkgKzE2NzksOSBAQAogCiAJZG91YmxlX2xvY2soJm15X2dycC0+bG9jaywgJmdycC0+bG9jayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMipucl9ub2RlX2lkczsgaSsrKSB7Ci0JCW15X2dycC0+ZmF1bHRzW2ldIC09IHAtPm51bWFfZmF1bHRzW2ldOwotCQlncnAtPmZhdWx0c1tpXSArPSBwLT5udW1hX2ZhdWx0c1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfTlVNQV9ISU5UX0ZBVUxUX1NUQVRTICogbnJfbm9kZV9pZHM7IGkrKykgeworCQlteV9ncnAtPmZhdWx0c1tpXSAtPSBwLT5udW1hX2ZhdWx0c19tZW1vcnlbaV07CisJCWdycC0+ZmF1bHRzW2ldICs9IHAtPm51bWFfZmF1bHRzX21lbW9yeVtpXTsKIAl9CiAJbXlfZ3JwLT50b3RhbF9mYXVsdHMgLT0gcC0+dG90YWxfbnVtYV9mYXVsdHM7CiAJZ3JwLT50b3RhbF9mYXVsdHMgKz0gcC0+dG90YWxfbnVtYV9mYXVsdHM7CkBAIC0xNTYyLDEyICsxNzA3LDEyIEBACiB7CiAJc3RydWN0IG51bWFfZ3JvdXAgKmdycCA9IHAtPm51bWFfZ3JvdXA7CiAJaW50IGk7Ci0Jdm9pZCAqbnVtYV9mYXVsdHMgPSBwLT5udW1hX2ZhdWx0czsKKwl2b2lkICpudW1hX2ZhdWx0cyA9IHAtPm51bWFfZmF1bHRzX21lbW9yeTsKIAogCWlmIChncnApIHsKIAkJc3Bpbl9sb2NrKCZncnAtPmxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgMipucl9ub2RlX2lkczsgaSsrKQotCQkJZ3JwLT5mYXVsdHNbaV0gLT0gcC0+bnVtYV9mYXVsdHNbaV07CisJCWZvciAoaSA9IDA7IGkgPCBOUl9OVU1BX0hJTlRfRkFVTFRfU1RBVFMgKiBucl9ub2RlX2lkczsgaSsrKQorCQkJZ3JwLT5mYXVsdHNbaV0gLT0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5W2ldOwogCQlncnAtPnRvdGFsX2ZhdWx0cyAtPSBwLT50b3RhbF9udW1hX2ZhdWx0czsKIAogCQlsaXN0X2RlbCgmcC0+bnVtYV9lbnRyeSk7CkBAIC0xNTc3LDE4ICsxNzIyLDIxIEBACiAJCXB1dF9udW1hX2dyb3VwKGdycCk7CiAJfQogCi0JcC0+bnVtYV9mYXVsdHMgPSBOVUxMOwotCXAtPm51bWFfZmF1bHRzX2J1ZmZlciA9IE5VTEw7CisJcC0+bnVtYV9mYXVsdHNfbWVtb3J5ID0gTlVMTDsKKwlwLT5udW1hX2ZhdWx0c19idWZmZXJfbWVtb3J5ID0gTlVMTDsKKwlwLT5udW1hX2ZhdWx0c19jcHU9IE5VTEw7CisJcC0+bnVtYV9mYXVsdHNfYnVmZmVyX2NwdSA9IE5VTEw7CiAJa2ZyZWUobnVtYV9mYXVsdHMpOwogfQogCiAvKgogICogR290IGEgUFJPVF9OT05FIGZhdWx0IGZvciBhIHBhZ2Ugb24gQG5vZGUuCiAgKi8KLXZvaWQgdGFza19udW1hX2ZhdWx0KGludCBsYXN0X2NwdXBpZCwgaW50IG5vZGUsIGludCBwYWdlcywgaW50IGZsYWdzKQordm9pZCB0YXNrX251bWFfZmF1bHQoaW50IGxhc3RfY3B1cGlkLCBpbnQgbWVtX25vZGUsIGludCBwYWdlcywgaW50IGZsYWdzKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CiAJYm9vbCBtaWdyYXRlZCA9IGZsYWdzICYgVE5GX01JR1JBVEVEOworCWludCBjcHVfbm9kZSA9IHRhc2tfbm9kZShjdXJyZW50KTsKIAlpbnQgcHJpdjsKIAogCWlmICghbnVtYWJhbGFuY2luZ19lbmFibGVkKQpAQCAtMTYwMywxNiArMTc1MSwyNCBAQAogCQlyZXR1cm47CiAKIAkvKiBBbGxvY2F0ZSBidWZmZXIgdG8gdHJhY2sgZmF1bHRzIG9uIGEgcGVyLW5vZGUgYmFzaXMgKi8KLQlpZiAodW5saWtlbHkoIXAtPm51bWFfZmF1bHRzKSkgewotCQlpbnQgc2l6ZSA9IHNpemVvZigqcC0+bnVtYV9mYXVsdHMpICogMiAqIG5yX25vZGVfaWRzOworCWlmICh1bmxpa2VseSghcC0+bnVtYV9mYXVsdHNfbWVtb3J5KSkgeworCQlpbnQgc2l6ZSA9IHNpemVvZigqcC0+bnVtYV9mYXVsdHNfbWVtb3J5KSAqCisJCQkgICBOUl9OVU1BX0hJTlRfRkFVTFRfQlVDS0VUUyAqIG5yX25vZGVfaWRzOwogCi0JCS8qIG51bWFfZmF1bHRzIGFuZCBudW1hX2ZhdWx0c19idWZmZXIgc2hhcmUgdGhlIGFsbG9jYXRpb24gKi8KLQkJcC0+bnVtYV9mYXVsdHMgPSBremFsbG9jKHNpemUgKiAyLCBHRlBfS0VSTkVMfF9fR0ZQX05PV0FSTik7Ci0JCWlmICghcC0+bnVtYV9mYXVsdHMpCisJCXAtPm51bWFfZmF1bHRzX21lbW9yeSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1dBUk4pOworCQlpZiAoIXAtPm51bWFfZmF1bHRzX21lbW9yeSkKIAkJCXJldHVybjsKIAotCQlCVUdfT04ocC0+bnVtYV9mYXVsdHNfYnVmZmVyKTsKLQkJcC0+bnVtYV9mYXVsdHNfYnVmZmVyID0gcC0+bnVtYV9mYXVsdHMgKyAoMiAqIG5yX25vZGVfaWRzKTsKKwkJQlVHX09OKHAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnkpOworCQkvKgorCQkgKiBUaGUgYXZlcmFnZWQgc3RhdGlzdGljcywgc2hhcmVkICYgcHJpdmF0ZSwgbWVtb3J5ICYgY3B1LAorCQkgKiBvY2N1cHkgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIGFycmF5LiBUaGUgc2Vjb25kIGhhbGYgb2YgdGhlCisJCSAqIGFycmF5IGlzIGZvciBjdXJyZW50IGNvdW50ZXJzLCB3aGljaCBhcmUgYXZlcmFnZWQgaW50byB0aGUKKwkJICogZmlyc3Qgc2V0IGJ5IHRhc2tfbnVtYV9wbGFjZW1lbnQuCisJCSAqLworCQlwLT5udW1hX2ZhdWx0c19jcHUgPSBwLT5udW1hX2ZhdWx0c19tZW1vcnkgKyAoMiAqIG5yX25vZGVfaWRzKTsKKwkJcC0+bnVtYV9mYXVsdHNfYnVmZmVyX21lbW9yeSA9IHAtPm51bWFfZmF1bHRzX21lbW9yeSArICg0ICogbnJfbm9kZV9pZHMpOworCQlwLT5udW1hX2ZhdWx0c19idWZmZXJfY3B1ID0gcC0+bnVtYV9mYXVsdHNfbWVtb3J5ICsgKDYgKiBucl9ub2RlX2lkcyk7CiAJCXAtPnRvdGFsX251bWFfZmF1bHRzID0gMDsKIAkJbWVtc2V0KHAtPm51bWFfZmF1bHRzX2xvY2FsaXR5LCAwLCBzaXplb2YocC0+bnVtYV9mYXVsdHNfbG9jYWxpdHkpKTsKIAl9CkBAIC0xNjQxLDcgKzE3OTcsOCBAQAogCWlmIChtaWdyYXRlZCkKIAkJcC0+bnVtYV9wYWdlc19taWdyYXRlZCArPSBwYWdlczsKIAotCXAtPm51bWFfZmF1bHRzX2J1ZmZlclt0YXNrX2ZhdWx0c19pZHgobm9kZSwgcHJpdildICs9IHBhZ2VzOworCXAtPm51bWFfZmF1bHRzX2J1ZmZlcl9tZW1vcnlbdGFza19mYXVsdHNfaWR4KG1lbV9ub2RlLCBwcml2KV0gKz0gcGFnZXM7CisJcC0+bnVtYV9mYXVsdHNfYnVmZmVyX2NwdVt0YXNrX2ZhdWx0c19pZHgoY3B1X25vZGUsIHByaXYpXSArPSBwYWdlczsKIAlwLT5udW1hX2ZhdWx0c19sb2NhbGl0eVshIShmbGFncyAmIFRORl9GQVVMVF9MT0NBTCldICs9IHBhZ2VzOwogfQogCkBAIC0yMjE5LDEzICsyMzc2LDIwIEBACiAJCXNlLT5hdmcubG9hZF9hdmdfY29udHJpYiA+Pj0gTklDRV8wX1NISUZUOwogCX0KIH0KLSNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfcnFfcnVubmFibGVfYXZnKHN0cnVjdCBycSAqcnEsIGludCBydW5uYWJsZSkKK3sKKwlfX3VwZGF0ZV9lbnRpdHlfcnVubmFibGVfYXZnKHJxX2Nsb2NrX3Rhc2socnEpLCAmcnEtPmF2ZywgcnVubmFibGUpOworCV9fdXBkYXRlX3RnX3J1bm5hYmxlX2F2ZygmcnEtPmF2ZywgJnJxLT5jZnMpOworfQorI2Vsc2UgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3VwZGF0ZV9jZnNfcnFfdGdfbG9hZF9jb250cmliKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwKIAkJCQkJCSBpbnQgZm9yY2VfdXBkYXRlKSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3RnX3J1bm5hYmxlX2F2ZyhzdHJ1Y3Qgc2NoZWRfYXZnICpzYSwKIAkJCQkJCSAgc3RydWN0IGNmc19ycSAqY2ZzX3JxKSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX2dyb3VwX2VudGl0eV9jb250cmliKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKSB7fQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3JxX3J1bm5hYmxlX2F2ZyhzdHJ1Y3QgcnEgKnJxLCBpbnQgcnVubmFibGUpIHt9CisjZW5kaWYgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3Rhc2tfZW50aXR5X2NvbnRyaWIoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7CkBAIC0yMzIzLDEyICsyNDg3LDYgQEAKIAlfX3VwZGF0ZV9jZnNfcnFfdGdfbG9hZF9jb250cmliKGNmc19ycSwgZm9yY2VfdXBkYXRlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9ycV9ydW5uYWJsZV9hdmcoc3RydWN0IHJxICpycSwgaW50IHJ1bm5hYmxlKQotewotCV9fdXBkYXRlX2VudGl0eV9ydW5uYWJsZV9hdmcocnFfY2xvY2tfdGFzayhycSksICZycS0+YXZnLCBydW5uYWJsZSk7Ci0JX191cGRhdGVfdGdfcnVubmFibGVfYXZnKCZycS0+YXZnLCAmcnEtPmNmcyk7Ci19Ci0KIC8qIEFkZCB0aGUgbG9hZCBnZW5lcmF0ZWQgYnkgc2UgaW50byBjZnNfcnEncyBjaGlsZCBsb2FkLWF2ZXJhZ2UgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBlbnF1ZXVlX2VudGl0eV9sb2FkX2F2ZyhzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsCiAJCQkJCQkgIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLApAQCAtMjQxNiw3ICsyNTc0LDEwIEBACiAJdXBkYXRlX3JxX3J1bm5hYmxlX2F2Zyh0aGlzX3JxLCAwKTsKIH0KIAotI2Vsc2UKK3N0YXRpYyBpbnQgaWRsZV9iYWxhbmNlKHN0cnVjdCBycSAqdGhpc19ycSk7CisKKyNlbHNlIC8qIENPTkZJR19TTVAgKi8KKwogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9lbnRpdHlfbG9hZF9hdmcoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsCiAJCQkJCSAgaW50IHVwZGF0ZV9jZnNfcnEpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3JxX3J1bm5hYmxlX2F2ZyhzdHJ1Y3QgcnEgKnJxLCBpbnQgcnVubmFibGUpIHt9CkBAIC0yNDI4LDcgKzI1ODksMTMgQEAKIAkJCQkJICAgaW50IHNsZWVwKSB7fQogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9jZnNfcnFfYmxvY2tlZF9sb2FkKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwKIAkJCQkJICAgICAgaW50IGZvcmNlX3VwZGF0ZSkge30KLSNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBpZGxlX2JhbGFuY2Uoc3RydWN0IHJxICpycSkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIHZvaWQgZW5xdWV1ZV9zbGVlcGVyKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7CkBAIC0yNTc4LDEwICsyNzQ1LDEwIEBACiB7CiAJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7CiAJCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7Ci0JCWlmIChjZnNfcnEtPmxhc3QgPT0gc2UpCi0JCQljZnNfcnEtPmxhc3QgPSBOVUxMOwotCQllbHNlCisJCWlmIChjZnNfcnEtPmxhc3QgIT0gc2UpCiAJCQlicmVhazsKKworCQljZnNfcnEtPmxhc3QgPSBOVUxMOwogCX0KIH0KIApAQCAtMjU4OSwxMCArMjc1NiwxMCBAQAogewogCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkgewogCQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwotCQlpZiAoY2ZzX3JxLT5uZXh0ID09IHNlKQotCQkJY2ZzX3JxLT5uZXh0ID0gTlVMTDsKLQkJZWxzZQorCQlpZiAoY2ZzX3JxLT5uZXh0ICE9IHNlKQogCQkJYnJlYWs7CisKKwkJY2ZzX3JxLT5uZXh0ID0gTlVMTDsKIAl9CiB9CiAKQEAgLTI2MDAsMTAgKzI3NjcsMTAgQEAKIHsKIAlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpIHsKIAkJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gY2ZzX3JxX29mKHNlKTsKLQkJaWYgKGNmc19ycS0+c2tpcCA9PSBzZSkKLQkJCWNmc19ycS0+c2tpcCA9IE5VTEw7Ci0JCWVsc2UKKwkJaWYgKGNmc19ycS0+c2tpcCAhPSBzZSkKIAkJCWJyZWFrOworCisJCWNmc19ycS0+c2tpcCA9IE5VTEw7CiAJfQogfQogCkBAIC0yNzQ2LDE3ICsyOTEzLDM2IEBACiAgKiAzKSBwaWNrIHRoZSAibGFzdCIgcHJvY2VzcywgZm9yIGNhY2hlIGxvY2FsaXR5CiAgKiA0KSBkbyBub3QgcnVuIHRoZSAic2tpcCIgcHJvY2VzcywgaWYgc29tZXRoaW5nIGVsc2UgaXMgYXZhaWxhYmxlCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwaWNrX25leHRfZW50aXR5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICoKK3BpY2tfbmV4dF9lbnRpdHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpjdXJyKQogewotCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gX19waWNrX2ZpcnN0X2VudGl0eShjZnNfcnEpOwotCXN0cnVjdCBzY2hlZF9lbnRpdHkgKmxlZnQgPSBzZTsKKwlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpsZWZ0ID0gX19waWNrX2ZpcnN0X2VudGl0eShjZnNfcnEpOworCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlOworCisJLyoKKwkgKiBJZiBjdXJyIGlzIHNldCB3ZSBoYXZlIHRvIHNlZSBpZiBpdHMgbGVmdCBvZiB0aGUgbGVmdG1vc3QgZW50aXR5CisJICogc3RpbGwgaW4gdGhlIHRyZWUsIHByb3ZpZGVkIHRoZXJlIHdhcyBhbnl0aGluZyBpbiB0aGUgdHJlZSBhdCBhbGwuCisJICovCisJaWYgKCFsZWZ0IHx8IChjdXJyICYmIGVudGl0eV9iZWZvcmUoY3VyciwgbGVmdCkpKQorCQlsZWZ0ID0gY3VycjsKKworCXNlID0gbGVmdDsgLyogaWRlYWxseSB3ZSBydW4gdGhlIGxlZnRtb3N0IGVudGl0eSAqLwogCiAJLyoKIAkgKiBBdm9pZCBydW5uaW5nIHRoZSBza2lwIGJ1ZGR5LCBpZiBydW5uaW5nIHNvbWV0aGluZyBlbHNlIGNhbgogCSAqIGJlIGRvbmUgd2l0aG91dCBnZXR0aW5nIHRvbyB1bmZhaXIuCiAJICovCiAJaWYgKGNmc19ycS0+c2tpcCA9PSBzZSkgewotCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZWNvbmQgPSBfX3BpY2tfbmV4dF9lbnRpdHkoc2UpOworCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZWNvbmQ7CisKKwkJaWYgKHNlID09IGN1cnIpIHsKKwkJCXNlY29uZCA9IF9fcGlja19maXJzdF9lbnRpdHkoY2ZzX3JxKTsKKwkJfSBlbHNlIHsKKwkJCXNlY29uZCA9IF9fcGlja19uZXh0X2VudGl0eShzZSk7CisJCQlpZiAoIXNlY29uZCB8fCAoY3VyciAmJiBlbnRpdHlfYmVmb3JlKGN1cnIsIHNlY29uZCkpKQorCQkJCXNlY29uZCA9IGN1cnI7CisJCX0KKwogCQlpZiAoc2Vjb25kICYmIHdha2V1cF9wcmVlbXB0X2VudGl0eShzZWNvbmQsIGxlZnQpIDwgMSkKIAkJCXNlID0gc2Vjb25kOwogCX0KQEAgLTI3NzgsNyArMjk2NCw3IEBACiAJcmV0dXJuIHNlOwogfQogCi1zdGF0aWMgdm9pZCBjaGVja19jZnNfcnFfcnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpOworc3RhdGljIGJvb2wgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKTsKIAogc3RhdGljIHZvaWQgcHV0X3ByZXZfZW50aXR5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqcHJldikKIHsKQEAgLTM0MzMsMjIgKzM2MTksMjMgQEAKIH0KIAogLyogY29uZGl0aW9uYWxseSB0aHJvdHRsZSBhY3RpdmUgY2ZzX3JxJ3MgZnJvbSBwdXRfcHJldl9lbnRpdHkoKSAqLwotc3RhdGljIHZvaWQgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQorc3RhdGljIGJvb2wgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCWlmICghY2ZzX2JhbmR3aWR0aF91c2VkKCkpCi0JCXJldHVybjsKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGxpa2VseSghY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQgfHwgY2ZzX3JxLT5ydW50aW1lX3JlbWFpbmluZyA+IDApKQotCQlyZXR1cm47CisJCXJldHVybiBmYWxzZTsKIAogCS8qCiAJICogaXQncyBwb3NzaWJsZSBmb3IgYSB0aHJvdHRsZWQgZW50aXR5IHRvIGJlIGZvcmNlZCBpbnRvIGEgcnVubmluZwogCSAqIHN0YXRlIChlLmcuIHNldF9jdXJyX3Rhc2spLCBpbiB0aGlzIGNhc2Ugd2UncmUgZmluaXNoZWQuCiAJICovCiAJaWYgKGNmc19ycV90aHJvdHRsZWQoY2ZzX3JxKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gdHJ1ZTsKIAogCXRocm90dGxlX2Nmc19ycShjZnNfcnEpOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgc2NoZWRfY2ZzX3NsYWNrX3RpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKQEAgLTM1NTgsNyArMzc0NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFjY291bnRfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCB1NjQgZGVsdGFfZXhlYykge30KLXN0YXRpYyB2b2lkIGNoZWNrX2Nmc19ycV9ydW50aW1lKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkge30KK3N0YXRpYyBib29sIGNoZWNrX2Nmc19ycV9ydW50aW1lKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkgeyByZXR1cm4gZmFsc2U7IH0KIHN0YXRpYyB2b2lkIGNoZWNrX2VucXVldWVfdGhyb3R0bGUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKSB7fQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJldHVybl9jZnNfcnFfcnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpIHt9CiAKQEAgLTQyMTMsMTMgKzQ0MDAsMTQgQEAKIH0KIAogLyoKLSAqIHNjaGVkX2JhbGFuY2Vfc2VsZjogYmFsYW5jZSB0aGUgY3VycmVudCB0YXNrIChydW5uaW5nIG9uIGNwdSkgaW4gZG9tYWlucwotICogdGhhdCBoYXZlIHRoZSAnZmxhZycgZmxhZyBzZXQuIEluIHByYWN0aWNlLCB0aGlzIGlzIFNEX0JBTEFOQ0VfRk9SSyBhbmQKLSAqIFNEX0JBTEFOQ0VfRVhFQy4KKyAqIHNlbGVjdF90YXNrX3JxX2ZhaXI6IFNlbGVjdCB0YXJnZXQgcnVucXVldWUgZm9yIHRoZSB3YWtpbmcgdGFzayBpbiBkb21haW5zCisgKiB0aGF0IGhhdmUgdGhlICdzZF9mbGFnJyBmbGFnIHNldC4gSW4gcHJhY3RpY2UsIHRoaXMgaXMgU0RfQkFMQU5DRV9XQUtFLAorICogU0RfQkFMQU5DRV9GT1JLLCBvciBTRF9CQUxBTkNFX0VYRUMuCiAgKgotICogQmFsYW5jZSwgaWUuIHNlbGVjdCB0aGUgbGVhc3QgbG9hZGVkIGdyb3VwLgorICogQmFsYW5jZXMgbG9hZCBieSBzZWxlY3RpbmcgdGhlIGlkbGVzdCBjcHUgaW4gdGhlIGlkbGVzdCBncm91cCwgb3IgdW5kZXIKKyAqIGNlcnRhaW4gY29uZGl0aW9ucyBhbiBpZGxlIHNpYmxpbmcgY3B1IGlmIHRoZSBkb21haW4gaGFzIFNEX1dBS0VfQUZGSU5FIHNldC4KICAqCi0gKiBSZXR1cm5zIHRoZSB0YXJnZXQgQ1BVIG51bWJlciwgb3IgdGhlIHNhbWUgQ1BVIGlmIG5vIGJhbGFuY2luZyBpcyBuZWVkZWQuCisgKiBSZXR1cm5zIHRoZSB0YXJnZXQgY3B1IG51bWJlci4KICAqCiAgKiBwcmVlbXB0IG11c3QgYmUgZGlzYWJsZWQuCiAgKi8KQEAgLTQ0OTQsMjYgKzQ2ODIsMTI0IEBACiAJCXNldF9sYXN0X2J1ZGR5KHNlKTsKIH0KIAotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfZmFpcihzdHJ1Y3QgcnEgKnJxKQorc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqCitwaWNrX25leHRfdGFza19mYWlyKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gJnJxLT5jZnM7CiAJc3RydWN0IHNjaGVkX2VudGl0eSAqc2U7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCWludCBuZXdfdGFza3M7CiAKK2FnYWluOgorI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECiAJaWYgKCFjZnNfcnEtPm5yX3J1bm5pbmcpCi0JCXJldHVybiBOVUxMOworCQlnb3RvIGlkbGU7CisKKwlpZiAocHJldi0+c2NoZWRfY2xhc3MgIT0gJmZhaXJfc2NoZWRfY2xhc3MpCisJCWdvdG8gc2ltcGxlOworCisJLyoKKwkgKiBCZWNhdXNlIG9mIHRoZSBzZXRfbmV4dF9idWRkeSgpIGluIGRlcXVldWVfdGFza19mYWlyKCkgaXQgaXMgcmF0aGVyCisJICogbGlrZWx5IHRoYXQgYSBuZXh0IHRhc2sgaXMgZnJvbSB0aGUgc2FtZSBjZ3JvdXAgYXMgdGhlIGN1cnJlbnQuCisJICoKKwkgKiBUaGVyZWZvcmUgYXR0ZW1wdCB0byBhdm9pZCBwdXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBlbnRpcmUgY2dyb3VwCisJICogaGllcmFyY2h5LCBvbmx5IGNoYW5nZSB0aGUgcGFydCB0aGF0IGFjdHVhbGx5IGNoYW5nZXMuCisJICovCiAKIAlkbyB7Ci0JCXNlID0gcGlja19uZXh0X2VudGl0eShjZnNfcnEpOworCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpjdXJyID0gY2ZzX3JxLT5jdXJyOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGdvdCBoZXJlIHdpdGhvdXQgZG9pbmcgcHV0X3ByZXZfZW50aXR5KCkgd2UgYWxzbworCQkgKiBoYXZlIHRvIGNvbnNpZGVyIGNmc19ycS0+Y3Vyci4gSWYgaXQgaXMgc3RpbGwgYSBydW5uYWJsZQorCQkgKiBlbnRpdHksIHVwZGF0ZV9jdXJyKCkgd2lsbCB1cGRhdGUgaXRzIHZydW50aW1lLCBvdGhlcndpc2UKKwkJICogZm9yZ2V0IHdlJ3ZlIGV2ZXIgc2VlbiBpdC4KKwkJICovCisJCWlmIChjdXJyICYmIGN1cnItPm9uX3JxKQorCQkJdXBkYXRlX2N1cnIoY2ZzX3JxKTsKKwkJZWxzZQorCQkJY3VyciA9IE5VTEw7CisKKwkJLyoKKwkJICogVGhpcyBjYWxsIHRvIGNoZWNrX2Nmc19ycV9ydW50aW1lKCkgd2lsbCBkbyB0aGUgdGhyb3R0bGUgYW5kCisJCSAqIGRlcXVldWUgaXRzIGVudGl0eSBpbiB0aGUgcGFyZW50KHMpLiBUaGVyZWZvcmUgdGhlICdzaW1wbGUnCisJCSAqIG5yX3J1bm5pbmcgdGVzdCB3aWxsIGluZGVlZCBiZSBjb3JyZWN0LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGNoZWNrX2Nmc19ycV9ydW50aW1lKGNmc19ycSkpKQorCQkJZ290byBzaW1wbGU7CisKKwkJc2UgPSBwaWNrX25leHRfZW50aXR5KGNmc19ycSwgY3Vycik7CisJCWNmc19ycSA9IGdyb3VwX2Nmc19ycShzZSk7CisJfSB3aGlsZSAoY2ZzX3JxKTsKKworCXAgPSB0YXNrX29mKHNlKTsKKworCS8qCisJICogU2luY2Ugd2UgaGF2ZW4ndCB5ZXQgZG9uZSBwdXRfcHJldl9lbnRpdHkgYW5kIGlmIHRoZSBzZWxlY3RlZCB0YXNrCisJICogaXMgYSBkaWZmZXJlbnQgdGFzayB0aGFuIHdlIHN0YXJ0ZWQgb3V0IHdpdGgsIHRyeSBhbmQgdG91Y2ggdGhlCisJICogbGVhc3QgYW1vdW50IG9mIGNmc19ycXMuCisJICovCisJaWYgKHByZXYgIT0gcCkgeworCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwc2UgPSAmcHJldi0+c2U7CisKKwkJd2hpbGUgKCEoY2ZzX3JxID0gaXNfc2FtZV9ncm91cChzZSwgcHNlKSkpIHsKKwkJCWludCBzZV9kZXB0aCA9IHNlLT5kZXB0aDsKKwkJCWludCBwc2VfZGVwdGggPSBwc2UtPmRlcHRoOworCisJCQlpZiAoc2VfZGVwdGggPD0gcHNlX2RlcHRoKSB7CisJCQkJcHV0X3ByZXZfZW50aXR5KGNmc19ycV9vZihwc2UpLCBwc2UpOworCQkJCXBzZSA9IHBhcmVudF9lbnRpdHkocHNlKTsKKwkJCX0KKwkJCWlmIChzZV9kZXB0aCA+PSBwc2VfZGVwdGgpIHsKKwkJCQlzZXRfbmV4dF9lbnRpdHkoY2ZzX3JxX29mKHNlKSwgc2UpOworCQkJCXNlID0gcGFyZW50X2VudGl0eShzZSk7CisJCQl9CisJCX0KKworCQlwdXRfcHJldl9lbnRpdHkoY2ZzX3JxLCBwc2UpOworCQlzZXRfbmV4dF9lbnRpdHkoY2ZzX3JxLCBzZSk7CisJfQorCisJaWYgKGhydGlja19lbmFibGVkKHJxKSkKKwkJaHJ0aWNrX3N0YXJ0X2ZhaXIocnEsIHApOworCisJcmV0dXJuIHA7CitzaW1wbGU6CisJY2ZzX3JxID0gJnJxLT5jZnM7CisjZW5kaWYKKworCWlmICghY2ZzX3JxLT5ucl9ydW5uaW5nKQorCQlnb3RvIGlkbGU7CisKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKworCWRvIHsKKwkJc2UgPSBwaWNrX25leHRfZW50aXR5KGNmc19ycSwgTlVMTCk7CiAJCXNldF9uZXh0X2VudGl0eShjZnNfcnEsIHNlKTsKIAkJY2ZzX3JxID0gZ3JvdXBfY2ZzX3JxKHNlKTsKIAl9IHdoaWxlIChjZnNfcnEpOwogCiAJcCA9IHRhc2tfb2Yoc2UpOworCiAJaWYgKGhydGlja19lbmFibGVkKHJxKSkKIAkJaHJ0aWNrX3N0YXJ0X2ZhaXIocnEsIHApOwogCiAJcmV0dXJuIHA7CisKK2lkbGU6CisJbmV3X3Rhc2tzID0gaWRsZV9iYWxhbmNlKHJxKTsKKwkvKgorCSAqIEJlY2F1c2UgaWRsZV9iYWxhbmNlKCkgcmVsZWFzZXMgKGFuZCByZS1hY3F1aXJlcykgcnEtPmxvY2ssIGl0IGlzCisJICogcG9zc2libGUgZm9yIGFueSBoaWdoZXIgcHJpb3JpdHkgdGFzayB0byBhcHBlYXIuIEluIHRoYXQgY2FzZSB3ZQorCSAqIG11c3QgcmUtc3RhcnQgdGhlIHBpY2tfbmV4dF9lbnRpdHkoKSBsb29wLgorCSAqLworCWlmIChuZXdfdGFza3MgPCAwKQorCQlyZXR1cm4gUkVUUllfVEFTSzsKKworCWlmIChuZXdfdGFza3MgPiAwKQorCQlnb3RvIGFnYWluOworCisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCkBAIC00NzUxLDcgKzUwMzcsNyBAQAogICogSXMgdGhpcyB0YXNrIGxpa2VseSBjYWNoZS1ob3Q6CiAgKi8KIHN0YXRpYyBpbnQKLXRhc2tfaG90KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdTY0IG5vdywgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCit0YXNrX2hvdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHU2NCBub3cpCiB7CiAJczY0IGRlbHRhOwogCkBAIC00Nzg1LDcgKzUwNzEsNyBAQAogewogCWludCBzcmNfbmlkLCBkc3RfbmlkOwogCi0JaWYgKCFzY2hlZF9mZWF0KE5VTUFfRkFWT1VSX0hJR0hFUikgfHwgIXAtPm51bWFfZmF1bHRzIHx8CisJaWYgKCFzY2hlZF9mZWF0KE5VTUFfRkFWT1VSX0hJR0hFUikgfHwgIXAtPm51bWFfZmF1bHRzX21lbW9yeSB8fAogCSAgICAhKGVudi0+c2QtPmZsYWdzICYgU0RfTlVNQSkpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTQ4MTYsNyArNTEwMiw3IEBACiAJaWYgKCFzY2hlZF9mZWF0KE5VTUEpIHx8ICFzY2hlZF9mZWF0KE5VTUFfUkVTSVNUX0xPV0VSKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKCFwLT5udW1hX2ZhdWx0cyB8fCAhKGVudi0+c2QtPmZsYWdzICYgU0RfTlVNQSkpCisJaWYgKCFwLT5udW1hX2ZhdWx0c19tZW1vcnkgfHwgIShlbnYtPnNkLT5mbGFncyAmIFNEX05VTUEpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlzcmNfbmlkID0gY3B1X3RvX25vZGUoZW52LT5zcmNfY3B1KTsKQEAgLTQ5MTIsNyArNTE5OCw3IEBACiAJICogMikgdGFzayBpcyBjYWNoZSBjb2xkLCBvcgogCSAqIDMpIHRvbyBtYW55IGJhbGFuY2UgYXR0ZW1wdHMgaGF2ZSBmYWlsZWQuCiAJICovCi0JdHNrX2NhY2hlX2hvdCA9IHRhc2tfaG90KHAsIHJxX2Nsb2NrX3Rhc2soZW52LT5zcmNfcnEpLCBlbnYtPnNkKTsKKwl0c2tfY2FjaGVfaG90ID0gdGFza19ob3QocCwgcnFfY2xvY2tfdGFzayhlbnYtPnNyY19ycSkpOwogCWlmICghdHNrX2NhY2hlX2hvdCkKIAkJdHNrX2NhY2hlX2hvdCA9IG1pZ3JhdGVfZGVncmFkZXNfbG9jYWxpdHkocCwgZW52KTsKIApAQCAtNTc3NSwxMiArNjA2MSwxMCBAQAogCXB3cl9ub3cgLz0gU0NIRURfUE9XRVJfU0NBTEU7CiAKIAkvKiBBbW91bnQgb2YgbG9hZCB3ZSdkIHN1YnRyYWN0ICovCi0JdG1wID0gKGJ1c2llc3QtPmxvYWRfcGVyX3Rhc2sgKiBTQ0hFRF9QT1dFUl9TQ0FMRSkgLwotCQlidXNpZXN0LT5ncm91cF9wb3dlcjsKLQlpZiAoYnVzaWVzdC0+YXZnX2xvYWQgPiB0bXApIHsKKwlpZiAoYnVzaWVzdC0+YXZnX2xvYWQgPiBzY2FsZWRfYnVzeV9sb2FkX3Blcl90YXNrKSB7CiAJCXB3cl9tb3ZlICs9IGJ1c2llc3QtPmdyb3VwX3Bvd2VyICoKIAkJCSAgICBtaW4oYnVzaWVzdC0+bG9hZF9wZXJfdGFzaywKLQkJCQlidXNpZXN0LT5hdmdfbG9hZCAtIHRtcCk7CisJCQkJYnVzaWVzdC0+YXZnX2xvYWQgLSBzY2FsZWRfYnVzeV9sb2FkX3Blcl90YXNrKTsKIAl9CiAKIAkvKiBBbW91bnQgb2YgbG9hZCB3ZSdkIGFkZCAqLwpAQCAtNjM1OSwxNyArNjY0MywyMyBAQAogICogaWRsZV9iYWxhbmNlIGlzIGNhbGxlZCBieSBzY2hlZHVsZSgpIGlmIHRoaXNfY3B1IGlzIGFib3V0IHRvIGJlY29tZQogICogaWRsZS4gQXR0ZW1wdHMgdG8gcHVsbCB0YXNrcyBmcm9tIG90aGVyIENQVXMuCiAgKi8KLXZvaWQgaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgc3RydWN0IHJxICp0aGlzX3JxKQorc3RhdGljIGludCBpZGxlX2JhbGFuY2Uoc3RydWN0IHJxICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCWludCBwdWxsZWRfdGFzayA9IDA7CiAJdW5zaWduZWQgbG9uZyBuZXh0X2JhbGFuY2UgPSBqaWZmaWVzICsgSFo7CiAJdTY0IGN1cnJfY29zdCA9IDA7CisJaW50IHRoaXNfY3B1ID0gdGhpc19ycS0+Y3B1OwogCisJaWRsZV9lbnRlcl9mYWlyKHRoaXNfcnEpOworCS8qCisJICogV2UgbXVzdCBzZXQgaWRsZV9zdGFtcCBfYmVmb3JlXyBjYWxsaW5nIGlkbGVfYmFsYW5jZSgpLCBzdWNoIHRoYXQgd2UKKwkgKiBtZWFzdXJlIHRoZSBkdXJhdGlvbiBvZiBpZGxlX2JhbGFuY2UoKSBhcyBpZGxlIHRpbWUuCisJICovCiAJdGhpc19ycS0+aWRsZV9zdGFtcCA9IHJxX2Nsb2NrKHRoaXNfcnEpOwogCiAJaWYgKHRoaXNfcnEtPmF2Z19pZGxlIDwgc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0KQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBEcm9wIHRoZSBycS0+bG9jaywgYnV0IGtlZXAgSVJRL3ByZWVtcHQgZGlzYWJsZWQuCkBAIC02NDA3LDE1ICs2Njk3LDIyIEBACiAJCWludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhzZC0+YmFsYW5jZV9pbnRlcnZhbCk7CiAJCWlmICh0aW1lX2FmdGVyKG5leHRfYmFsYW5jZSwgc2QtPmxhc3RfYmFsYW5jZSArIGludGVydmFsKSkKIAkJCW5leHRfYmFsYW5jZSA9IHNkLT5sYXN0X2JhbGFuY2UgKyBpbnRlcnZhbDsKLQkJaWYgKHB1bGxlZF90YXNrKSB7Ci0JCQl0aGlzX3JxLT5pZGxlX3N0YW1wID0gMDsKKwkJaWYgKHB1bGxlZF90YXNrKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyYXdfc3Bpbl9sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKIAorCS8qCisJICogV2hpbGUgYnJvd3NpbmcgdGhlIGRvbWFpbnMsIHdlIHJlbGVhc2VkIHRoZSBycSBsb2NrLgorCSAqIEEgdGFzayBjb3VsZCBoYXZlIGJlIGVucXVldWVkIGluIHRoZSBtZWFudGltZQorCSAqLworCWlmICh0aGlzX3JxLT5jZnMuaF9ucl9ydW5uaW5nICYmICFwdWxsZWRfdGFzaykgeworCQlwdWxsZWRfdGFzayA9IDE7CisJCWdvdG8gb3V0OworCX0KKwogCWlmIChwdWxsZWRfdGFzayB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIHRoaXNfcnEtPm5leHRfYmFsYW5jZSkpIHsKIAkJLyoKIAkJICogV2UgYXJlIGdvaW5nIGlkbGUuIG5leHRfYmFsYW5jZSBtYXkgYmUgc2V0IGJhc2VkIG9uCkBAIC02NDI2LDYgKzY3MjMsMjAgQEAKIAogCWlmIChjdXJyX2Nvc3QgPiB0aGlzX3JxLT5tYXhfaWRsZV9iYWxhbmNlX2Nvc3QpCiAJCXRoaXNfcnEtPm1heF9pZGxlX2JhbGFuY2VfY29zdCA9IGN1cnJfY29zdDsKKworb3V0OgorCS8qIElzIHRoZXJlIGEgdGFzayBvZiBhIGhpZ2ggcHJpb3JpdHkgY2xhc3M/ICovCisJaWYgKHRoaXNfcnEtPm5yX3J1bm5pbmcgIT0gdGhpc19ycS0+Y2ZzLmhfbnJfcnVubmluZyAmJgorCSAgICAodGhpc19ycS0+ZGwuZGxfbnJfcnVubmluZyB8fAorCSAgICAgKHRoaXNfcnEtPnJ0LnJ0X25yX3J1bm5pbmcgJiYgIXJ0X3JxX3Rocm90dGxlZCgmdGhpc19ycS0+cnQpKSkpCisJCXB1bGxlZF90YXNrID0gLTE7CisKKwlpZiAocHVsbGVkX3Rhc2spIHsKKwkJaWRsZV9leGl0X2ZhaXIodGhpc19ycSk7CisJCXRoaXNfcnEtPmlkbGVfc3RhbXAgPSAwOworCX0KKworCXJldHVybiBwdWxsZWRfdGFzazsKIH0KIAogLyoKQEAgLTY0OTYsNiArNjgwNywxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvbl9udWxsX2RvbWFpbihzdHJ1Y3QgcnEgKnJxKQoreworCXJldHVybiB1bmxpa2VseSghcmN1X2RlcmVmZXJlbmNlX3NjaGVkKHJxLT5zZCkpOworfQorCiAjaWZkZWYgQ09ORklHX05PX0haX0NPTU1PTgogLyoKICAqIGlkbGUgbG9hZCBiYWxhbmNpbmcgZGV0YWlscwpAQCAtNjU1MCw4ICs2ODY2LDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbm9oel9iYWxhbmNlX2V4aXRfaWRsZShpbnQgY3B1KQogewogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChOT0haX1RJQ0tfU1RPUFBFRCwgbm9oel9mbGFncyhjcHUpKSkpIHsKLQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKTsKLQkJYXRvbWljX2RlYygmbm9oei5ucl9jcHVzKTsKKwkJLyoKKwkJICogQ29tcGxldGVseSBpc29sYXRlZCBDUFVzIGRvbid0IGV2ZXIgc2V0LCBzbyB3ZSBtdXN0IHRlc3QuCisJCSAqLworCQlpZiAobGlrZWx5KGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKSkpIHsKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbm9oei5pZGxlX2NwdXNfbWFzayk7CisJCQlhdG9taWNfZGVjKCZub2h6Lm5yX2NwdXMpOworCQl9CiAJCWNsZWFyX2JpdChOT0haX1RJQ0tfU1RPUFBFRCwgbm9oel9mbGFncyhjcHUpKTsKIAl9CiB9CkBAIC02NjA1LDYgKzY5MjYsMTIgQEAKIAlpZiAodGVzdF9iaXQoTk9IWl9USUNLX1NUT1BQRUQsIG5vaHpfZmxhZ3MoY3B1KSkpCiAJCXJldHVybjsKIAorCS8qCisJICogSWYgd2UncmUgYSBjb21wbGV0ZWx5IGlzb2xhdGVkIENQVSwgd2UgZG9uJ3QgcGxheS4KKwkgKi8KKwlpZiAob25fbnVsbF9kb21haW4oY3B1X3JxKGNwdSkpKQorCQlyZXR1cm47CisKIAljcHVtYXNrX3NldF9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKTsKIAlhdG9taWNfaW5jKCZub2h6Lm5yX2NwdXMpOwogCXNldF9iaXQoTk9IWl9USUNLX1NUT1BQRUQsIG5vaHpfZmxhZ3MoY3B1KSk7CkBAIC02ODY3LDExICs3MTk0LDYgQEAKIAlub2h6X2lkbGVfYmFsYW5jZSh0aGlzX3JxLCBpZGxlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb25fbnVsbF9kb21haW4oc3RydWN0IHJxICpycSkKLXsKLQlyZXR1cm4gIXJjdV9kZXJlZmVyZW5jZV9zY2hlZChycS0+c2QpOwotfQotCiAvKgogICogVHJpZ2dlciB0aGUgU0NIRURfU09GVElSUSBpZiBpdCBpcyB0aW1lIHRvIGRvIHBlcmlvZGljIGxvYWQgYmFsYW5jaW5nLgogICovCkBAIC03MDM2LDcgKzczNTgsMTUgQEAKICAqLwogc3RhdGljIHZvaWQgc3dpdGNoZWRfdG9fZmFpcihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JaWYgKCFwLT5zZS5vbl9ycSkKKwlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKKyNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAorCS8qCisJICogU2luY2UgdGhlIHJlYWwtZGVwdGggY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgKG9ubHkgRkFJUgorCSAqIGNsYXNzIG1haW50YWluIGRlcHRoIHZhbHVlKSwgcmVzZXQgZGVwdGggcHJvcGVybHkuCisJICovCisJc2UtPmRlcHRoID0gc2UtPnBhcmVudCA/IHNlLT5wYXJlbnQtPmRlcHRoICsgMSA6IDA7CisjZW5kaWYKKwlpZiAoIXNlLT5vbl9ycSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTcwODQsNyArNzQxNCw5IEBACiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKIHN0YXRpYyB2b2lkIHRhc2tfbW92ZV9ncm91cF9mYWlyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG9uX3JxKQogeworCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gJnAtPnNlOwogCXN0cnVjdCBjZnNfcnEgKmNmc19ycTsKKwogCS8qCiAJICogSWYgdGhlIHRhc2sgd2FzIG5vdCBvbiB0aGUgcnEgYXQgdGhlIHRpbWUgb2YgdGhpcyBjZ3JvdXAgbW92ZW1lbnQKIAkgKiBpdCBtdXN0IGhhdmUgYmVlbiBhc2xlZXAsIHNsZWVwaW5nIHRhc2tzIGtlZXAgdGhlaXIgLT52cnVudGltZQpAQCAtNzExMCwyMyArNzQ0MiwyNCBAQAogCSAqIFRvIHByZXZlbnQgYm9vc3Qgb3IgcGVuYWx0eSBpbiB0aGUgbmV3IGNmc19ycSBjYXVzZWQgYnkgZGVsdGEKIAkgKiBtaW5fdnJ1bnRpbWUgYmV0d2VlbiB0aGUgdHdvIGNmc19ycXMsIHdlIHNraXAgdnJ1bnRpbWUgYWRqdXN0bWVudC4KIAkgKi8KLQlpZiAoIW9uX3JxICYmICghcC0+c2Uuc3VtX2V4ZWNfcnVudGltZSB8fCBwLT5zdGF0ZSA9PSBUQVNLX1dBS0lORykpCisJaWYgKCFvbl9ycSAmJiAoIXNlLT5zdW1fZXhlY19ydW50aW1lIHx8IHAtPnN0YXRlID09IFRBU0tfV0FLSU5HKSkKIAkJb25fcnEgPSAxOwogCiAJaWYgKCFvbl9ycSkKLQkJcC0+c2UudnJ1bnRpbWUgLT0gY2ZzX3JxX29mKCZwLT5zZSktPm1pbl92cnVudGltZTsKKwkJc2UtPnZydW50aW1lIC09IGNmc19ycV9vZihzZSktPm1pbl92cnVudGltZTsKIAlzZXRfdGFza19ycShwLCB0YXNrX2NwdShwKSk7CisJc2UtPmRlcHRoID0gc2UtPnBhcmVudCA/IHNlLT5wYXJlbnQtPmRlcHRoICsgMSA6IDA7CiAJaWYgKCFvbl9ycSkgewotCQljZnNfcnEgPSBjZnNfcnFfb2YoJnAtPnNlKTsKLQkJcC0+c2UudnJ1bnRpbWUgKz0gY2ZzX3JxLT5taW5fdnJ1bnRpbWU7CisJCWNmc19ycSA9IGNmc19ycV9vZihzZSk7CisJCXNlLT52cnVudGltZSArPSBjZnNfcnEtPm1pbl92cnVudGltZTsKICNpZmRlZiBDT05GSUdfU01QCiAJCS8qCiAJCSAqIG1pZ3JhdGVfdGFza19ycV9mYWlyKCkgd2lsbCBoYXZlIHJlbW92ZWQgb3VyIHByZXZpb3VzCiAJCSAqIGNvbnRyaWJ1dGlvbiwgYnV0IHdlIG11c3Qgc3luY2hyb25pemUgZm9yIG9uZ29pbmcgZnV0dXJlCiAJCSAqIGRlY2F5LgogCQkgKi8KLQkJcC0+c2UuYXZnLmRlY2F5X2NvdW50ID0gYXRvbWljNjRfcmVhZCgmY2ZzX3JxLT5kZWNheV9jb3VudGVyKTsKLQkJY2ZzX3JxLT5ibG9ja2VkX2xvYWRfYXZnICs9IHAtPnNlLmF2Zy5sb2FkX2F2Z19jb250cmliOworCQlzZS0+YXZnLmRlY2F5X2NvdW50ID0gYXRvbWljNjRfcmVhZCgmY2ZzX3JxLT5kZWNheV9jb3VudGVyKTsKKwkJY2ZzX3JxLT5ibG9ja2VkX2xvYWRfYXZnICs9IHNlLT5hdmcubG9hZF9hdmdfY29udHJpYjsKICNlbmRpZgogCX0KIH0KQEAgLTcyMjIsMTAgKzc1NTUsMTMgQEAKIAlpZiAoIXNlKQogCQlyZXR1cm47CiAKLQlpZiAoIXBhcmVudCkKKwlpZiAoIXBhcmVudCkgewogCQlzZS0+Y2ZzX3JxID0gJnJxLT5jZnM7Ci0JZWxzZQorCQlzZS0+ZGVwdGggPSAwOworCX0gZWxzZSB7CiAJCXNlLT5jZnNfcnEgPSBwYXJlbnQtPm15X3E7CisJCXNlLT5kZXB0aCA9IHBhcmVudC0+ZGVwdGggKyAxOworCX0KIAogCXNlLT5teV9xID0gY2ZzX3JxOwogCS8qIGd1YXJhbnRlZSBncm91cCBlbnRpdGllcyBhbHdheXMgaGF2ZSB3ZWlnaHQgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9pZGxlLmMgYi9rZXJuZWwvc2NoZWQvaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTc2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvc2NoZWQvaWRsZS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogR2VuZXJpYyBlbnRyeSBwb2ludCBmb3IgdGhlIGlkbGUgdGhyZWFkcworICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RhY2twcm90ZWN0b3IuaD4KKworI2luY2x1ZGUgPGFzbS90bGIuaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgorCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgY3B1X2lkbGVfZm9yY2VfcG9sbDsKKwordm9pZCBjcHVfaWRsZV9wb2xsX2N0cmwoYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQljcHVfaWRsZV9mb3JjZV9wb2xsKys7CisJfSBlbHNlIHsKKwkJY3B1X2lkbGVfZm9yY2VfcG9sbC0tOworCQlXQVJOX09OX09OQ0UoY3B1X2lkbGVfZm9yY2VfcG9sbCA8IDApOworCX0KK30KKworI2lmZGVmIENPTkZJR19HRU5FUklDX0lETEVfUE9MTF9TRVRVUAorc3RhdGljIGludCBfX2luaXQgY3B1X2lkbGVfcG9sbF9zZXR1cChjaGFyICpfX3VudXNlZCkKK3sKKwljcHVfaWRsZV9mb3JjZV9wb2xsID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm5vaGx0IiwgY3B1X2lkbGVfcG9sbF9zZXR1cCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdV9pZGxlX25vcG9sbF9zZXR1cChjaGFyICpfX3VudXNlZCkKK3sKKwljcHVfaWRsZV9mb3JjZV9wb2xsID0gMDsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImhsdCIsIGNwdV9pZGxlX25vcG9sbF9zZXR1cCk7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgY3B1X2lkbGVfcG9sbCh2b2lkKQoreworCXJjdV9pZGxlX2VudGVyKCk7CisJdHJhY2VfY3B1X2lkbGVfcmN1aWRsZSgwLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwl3aGlsZSAoIXRpZl9uZWVkX3Jlc2NoZWQoKSkKKwkJY3B1X3JlbGF4KCk7CisJdHJhY2VfY3B1X2lkbGVfcmN1aWRsZShQV1JfRVZFTlRfRVhJVCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlyY3VfaWRsZV9leGl0KCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIFdlYWsgaW1wbGVtZW50YXRpb25zIGZvciBvcHRpb25hbCBhcmNoIHNwZWNpZmljIGZ1bmN0aW9ucyAqLwordm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9wcmVwYXJlKHZvaWQpIHsgfQordm9pZCBfX3dlYWsgYXJjaF9jcHVfaWRsZV9lbnRlcih2b2lkKSB7IH0KK3ZvaWQgX193ZWFrIGFyY2hfY3B1X2lkbGVfZXhpdCh2b2lkKSB7IH0KK3ZvaWQgX193ZWFrIGFyY2hfY3B1X2lkbGVfZGVhZCh2b2lkKSB7IH0KK3ZvaWQgX193ZWFrIGFyY2hfY3B1X2lkbGUodm9pZCkKK3sKKwljcHVfaWRsZV9mb3JjZV9wb2xsID0gMTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBHZW5lcmljIGlkbGUgbG9vcCBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgdm9pZCBjcHVfaWRsZV9sb29wKHZvaWQpCit7CisJd2hpbGUgKDEpIHsKKwkJdGlja19ub2h6X2lkbGVfZW50ZXIoKTsKKworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCQljaGVja19wZ3RfY2FjaGUoKTsKKwkJCXJtYigpOworCisJCQlpZiAoY3B1X2lzX29mZmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKwkJCQlhcmNoX2NwdV9pZGxlX2RlYWQoKTsKKworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCWFyY2hfY3B1X2lkbGVfZW50ZXIoKTsKKworCQkJLyoKKwkJCSAqIEluIHBvbGwgbW9kZSB3ZSByZWVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBzcGluLgorCQkJICoKKwkJCSAqIEFsc28gaWYgd2UgZGV0ZWN0ZWQgaW4gdGhlIHdha2V1cCBmcm9tIGlkbGUKKwkJCSAqIHBhdGggdGhhdCB0aGUgdGljayBicm9hZGNhc3QgZGV2aWNlIGV4cGlyZWQKKwkJCSAqIGZvciB1cywgd2UgZG9uJ3Qgd2FudCB0byBnbyBkZWVwIGlkbGUgYXMgd2UKKwkJCSAqIGtub3cgdGhhdCB0aGUgSVBJIGlzIGdvaW5nIHRvIGFycml2ZSByaWdodAorCQkJICogYXdheQorCQkJICovCisJCQlpZiAoY3B1X2lkbGVfZm9yY2VfcG9sbCB8fCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9leHBpcmVkKCkpIHsKKwkJCQljcHVfaWRsZV9wb2xsKCk7CisJCQl9IGVsc2UgeworCQkJCWlmICghY3VycmVudF9jbHJfcG9sbGluZ19hbmRfdGVzdCgpKSB7CisJCQkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOworCQkJCQlyY3VfaWRsZV9lbnRlcigpOworCQkJCQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkKKwkJCQkJCWFyY2hfY3B1X2lkbGUoKTsKKwkJCQkJaWYgKFdBUk5fT05fT05DRShpcnFzX2Rpc2FibGVkKCkpKQorCQkJCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkJCQlyY3VfaWRsZV9leGl0KCk7CisJCQkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQkJfQorCQkJCV9fY3VycmVudF9zZXRfcG9sbGluZygpOworCQkJfQorCQkJYXJjaF9jcHVfaWRsZV9leGl0KCk7CisJCX0KKworCQkvKgorCQkgKiBTaW5jZSB3ZSBmZWxsIG91dCBvZiB0aGUgbG9vcCBhYm92ZSwgd2Uga25vdworCQkgKiBUSUZfTkVFRF9SRVNDSEVEIG11c3QgYmUgc2V0LCBwcm9wYWdhdGUgaXQgaW50bworCQkgKiBQUkVFTVBUX05FRURfUkVTQ0hFRC4KKwkJICoKKwkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGZvciBwb2xsaW5nIGlkbGUgbG9vcHMgd2Ugd2lsbAorCQkgKiBub3QgaGF2ZSBoYWQgYW4gSVBJIHRvIGZvbGQgdGhlIHN0YXRlIGZvciB1cy4KKwkJICovCisJCXByZWVtcHRfc2V0X25lZWRfcmVzY2hlZCgpOworCQl0aWNrX25vaHpfaWRsZV9leGl0KCk7CisJCXNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQoKTsKKwl9Cit9CisKK3ZvaWQgY3B1X3N0YXJ0dXBfZW50cnkoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSkKK3sKKwkvKgorCSAqIFRoaXMgI2lmZGVmIG5lZWRzIHRvIGRpZSwgYnV0IGl0J3MgdG9vIGxhdGUgaW4gdGhlIGN5Y2xlIHRvCisJICogbWFrZSB0aGlzIGdlbmVyaWMgKGFybSBhbmQgc2ggaGF2ZSBuZXZlciBpbnZva2VkIHRoZSBjYW5hcnkKKwkgKiBpbml0IGZvciB0aGUgbm9uIGJvb3QgY3B1cyEpLiBXaWxsIGJlIGZpeGVkIGluIDMuMTEKKwkgKi8KKyNpZmRlZiBDT05GSUdfWDg2CisJLyoKKwkgKiBJZiB3ZSdyZSB0aGUgbm9uLWJvb3QgQ1BVLCBub3RoaW5nIHNldCB0aGUgc3RhY2sgY2FuYXJ5IHVwCisJICogZm9yIHVzLiBUaGUgYm9vdCBDUFUgYWxyZWFkeSBoYXMgaXQgaW5pdGlhbGl6ZWQgYnV0IG5vIGhhcm0KKwkgKiBpbiBkb2luZyBpdCBhZ2Fpbi4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgZm9yIHVwZGF0aW5nIGl0LCBhcworCSAqIHdlIHdvbnQgZXZlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIChzbyB0aGUgaW52YWxpZAorCSAqIGNhbmFyaWVzIGFscmVhZHkgb24gdGhlIHN0YWNrIHdvbnQgZXZlciB0cmlnZ2VyKS4KKwkgKi8KKwlib290X2luaXRfc3RhY2tfY2FuYXJ5KCk7CisjZW5kaWYKKwlfX2N1cnJlbnRfc2V0X3BvbGxpbmcoKTsKKwlhcmNoX2NwdV9pZGxlX3ByZXBhcmUoKTsKKwljcHVfaWRsZV9sb29wKCk7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMgYi9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMKaW5kZXggNTE2YzNkOS4uODc5ZjJiNyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2lkbGVfdGFzay5jCisrKyBiL2tlcm5lbC9zY2hlZC9pZGxlX3Rhc2suYwpAQCAtMTMsMTggKzEzLDggQEAKIHsKIAlyZXR1cm4gdGFza19jcHUocCk7IC8qIElETEUgdGFza3MgYXMgbmV2ZXIgbWlncmF0ZWQgKi8KIH0KLQotc3RhdGljIHZvaWQgcHJlX3NjaGVkdWxlX2lkbGUoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQotewotCWlkbGVfZXhpdF9mYWlyKHJxKTsKLQlycV9sYXN0X3RpY2tfcmVzZXQocnEpOwotfQotCi1zdGF0aWMgdm9pZCBwb3N0X3NjaGVkdWxlX2lkbGUoc3RydWN0IHJxICpycSkKLXsKLQlpZGxlX2VudGVyX2ZhaXIocnEpOwotfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogLyoKICAqIElkbGUgdGFza3MgYXJlIHVuY29uZGl0aW9uYWxseSByZXNjaGVkdWxlZDoKICAqLwpAQCAtMzMsMTMgKzIzLDEyIEBACiAJcmVzY2hlZF90YXNrKHJxLT5pZGxlKTsKIH0KIAotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfaWRsZShzdHJ1Y3QgcnEgKnJxKQorc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqCitwaWNrX25leHRfdGFza19pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKwogCXNjaGVkc3RhdF9pbmMocnEsIHNjaGVkX2dvaWRsZSk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCS8qIFRyaWdnZXIgdGhlIHBvc3Qgc2NoZWR1bGUgdG8gZG8gYW4gaWRsZV9lbnRlciBmb3IgQ0ZTICovCi0JcnEtPnBvc3Rfc2NoZWR1bGUgPSAxOwotI2VuZGlmCiAJcmV0dXJuIHJxLT5pZGxlOwogfQogCkBAIC01OCw2ICs0Nyw4IEBACiAKIHN0YXRpYyB2b2lkIHB1dF9wcmV2X3Rhc2tfaWRsZShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCiB7CisJaWRsZV9leGl0X2ZhaXIocnEpOworCXJxX2xhc3RfdGlja19yZXNldChycSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRhc2tfdGlja19pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwgaW50IHF1ZXVlZCkKQEAgLTEwMSw4ICs5Miw2IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJLnNlbGVjdF90YXNrX3JxCQk9IHNlbGVjdF90YXNrX3JxX2lkbGUsCi0JLnByZV9zY2hlZHVsZQkJPSBwcmVfc2NoZWR1bGVfaWRsZSwKLQkucG9zdF9zY2hlZHVsZQkJPSBwb3N0X3NjaGVkdWxlX2lkbGUsCiAjZW5kaWYKIAogCS5zZXRfY3Vycl90YXNrICAgICAgICAgID0gc2V0X2N1cnJfdGFza19pZGxlLApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3J0LmMgYi9rZXJuZWwvc2NoZWQvcnQuYwppbmRleCAxOTk5MDIxLi5kOGNkZjE2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvcnQuYworKysgYi9rZXJuZWwvc2NoZWQvcnQuYwpAQCAtMjI5LDYgKzIyOSwxNCBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCitzdGF0aWMgaW50IHB1bGxfcnRfdGFzayhzdHJ1Y3QgcnEgKnRoaXNfcnEpOworCitzdGF0aWMgaW5saW5lIGJvb2wgbmVlZF9wdWxsX3J0X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQoreworCS8qIFRyeSB0byBwdWxsIFJUIHRhc2tzIGhlcmUgaWYgd2UgbG93ZXIgdGhpcyBycSdzIHByaW8gKi8KKwlyZXR1cm4gcnEtPnJ0LmhpZ2hlc3RfcHJpby5jdXJyID4gcHJldi0+cHJpbzsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcnRfb3ZlcmxvYWRlZChzdHJ1Y3QgcnEgKnJxKQogewogCXJldHVybiBhdG9taWNfcmVhZCgmcnEtPnJkLT5ydG9fY291bnQpOwpAQCAtMzE1LDYgKzMyMywxNSBAQAogCXJldHVybiAhcGxpc3RfaGVhZF9lbXB0eSgmcnEtPnJ0LnB1c2hhYmxlX3Rhc2tzKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9wb3N0X3NjaGVkdWxlKHN0cnVjdCBycSAqcnEpCit7CisJLyoKKwkgKiBXZSBkZXRlY3QgdGhpcyBzdGF0ZSBoZXJlIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRha2luZyB0aGUgUlEKKwkgKiBsb2NrIGFnYWluIGxhdGVyIGlmIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHVzaAorCSAqLworCXJxLT5wb3N0X3NjaGVkdWxlID0gaGFzX3B1c2hhYmxlX3Rhc2tzKHJxKTsKK30KKwogc3RhdGljIHZvaWQgZW5xdWV1ZV9wdXNoYWJsZV90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlwbGlzdF9kZWwoJnAtPnB1c2hhYmxlX3Rhc2tzLCAmcnEtPnJ0LnB1c2hhYmxlX3Rhc2tzKTsKQEAgLTM1OSw2ICszNzYsMTkgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBib29sIG5lZWRfcHVsbF9ydF90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB1bGxfcnRfdGFzayhzdHJ1Y3QgcnEgKnRoaXNfcnEpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG9zdF9zY2hlZHVsZShzdHJ1Y3QgcnEgKnJxKQoreworfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgb25fcnRfcnEoc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcnRfc2UpCkBAIC00NDAsMTEgKzQ3MCw2IEBACiAJCWRlcXVldWVfcnRfZW50aXR5KHJ0X3NlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcnRfcnFfdGhyb3R0bGVkKHN0cnVjdCBydF9ycSAqcnRfcnEpCi17Ci0JcmV0dXJuIHJ0X3JxLT5ydF90aHJvdHRsZWQgJiYgIXJ0X3JxLT5ydF9ucl9ib29zdGVkOwotfQotCiBzdGF0aWMgaW50IHJ0X3NlX2Jvb3N0ZWQoc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcnRfc2UpCiB7CiAJc3RydWN0IHJ0X3JxICpydF9ycSA9IGdyb3VwX3J0X3JxKHJ0X3NlKTsKQEAgLTUxNSwxMSArNTQwLDYgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcnRfcnFfdGhyb3R0bGVkKHN0cnVjdCBydF9ycSAqcnRfcnEpCi17Ci0JcmV0dXJuIHJ0X3JxLT5ydF90aHJvdHRsZWQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnNjaGVkX3J0X3BlcmlvZF9tYXNrKHZvaWQpCiB7CiAJcmV0dXJuIGNwdV9vbmxpbmVfbWFzazsKQEAgLTEzMTgsMTUgKzEzMzgsNyBAQAogewogCXN0cnVjdCBzY2hlZF9ydF9lbnRpdHkgKnJ0X3NlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQlzdHJ1Y3QgcnRfcnEgKnJ0X3JxOwotCi0JcnRfcnEgPSAmcnEtPnJ0OwotCi0JaWYgKCFydF9ycS0+cnRfbnJfcnVubmluZykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAocnRfcnFfdGhyb3R0bGVkKHJ0X3JxKSkKLQkJcmV0dXJuIE5VTEw7CisJc3RydWN0IHJ0X3JxICpydF9ycSAgPSAmcnEtPnJ0OwogCiAJZG8gewogCQlydF9zZSA9IHBpY2tfbmV4dF9ydF9lbnRpdHkocnEsIHJ0X3JxKTsKQEAgLTEzNDAsMjEgKzEzNTIsNDUgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfcnQoc3RydWN0IHJxICpycSkKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKgorcGlja19uZXh0X3Rhc2tfcnQoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IF9waWNrX25leHRfdGFza19ydChycSk7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXN0cnVjdCBydF9ycSAqcnRfcnEgPSAmcnEtPnJ0OworCisJaWYgKG5lZWRfcHVsbF9ydF90YXNrKHJxLCBwcmV2KSkgeworCQlwdWxsX3J0X3Rhc2socnEpOworCQkvKgorCQkgKiBwdWxsX3J0X3Rhc2soKSBjYW4gZHJvcCAoYW5kIHJlLWFjcXVpcmUpIHJxLT5sb2NrOyB0aGlzCisJCSAqIG1lYW5zIGEgZGwgdGFzayBjYW4gc2xpcCBpbiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvCisJCSAqIHJlLXN0YXJ0IHRhc2sgc2VsZWN0aW9uLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHJxLT5kbC5kbF9ucl9ydW5uaW5nKSkKKwkJCXJldHVybiBSRVRSWV9UQVNLOworCX0KKworCS8qCisJICogV2UgbWF5IGRlcXVldWUgcHJldidzIHJ0X3JxIGluIHB1dF9wcmV2X3Rhc2soKS4KKwkgKiBTbywgd2UgdXBkYXRlIHRpbWUgYmVmb3JlIHJ0X25yX3J1bm5pbmcgY2hlY2suCisJICovCisJaWYgKHByZXYtPnNjaGVkX2NsYXNzID09ICZydF9zY2hlZF9jbGFzcykKKwkJdXBkYXRlX2N1cnJfcnQocnEpOworCisJaWYgKCFydF9ycS0+cnRfbnJfcnVubmluZykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocnRfcnFfdGhyb3R0bGVkKHJ0X3JxKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKworCXAgPSBfcGlja19uZXh0X3Rhc2tfcnQocnEpOwogCiAJLyogVGhlIHJ1bm5pbmcgdGFzayBpcyBuZXZlciBlbGlnaWJsZSBmb3IgcHVzaGluZyAqLwogCWlmIChwKQogCQlkZXF1ZXVlX3B1c2hhYmxlX3Rhc2socnEsIHApOwogCi0jaWZkZWYgQ09ORklHX1NNUAotCS8qCi0JICogV2UgZGV0ZWN0IHRoaXMgc3RhdGUgaGVyZSBzbyB0aGF0IHdlIGNhbiBhdm9pZCB0YWtpbmcgdGhlIFJRCi0JICogbG9jayBhZ2FpbiBsYXRlciBpZiB0aGVyZSBpcyBubyBuZWVkIHRvIHB1c2gKLQkgKi8KLQlycS0+cG9zdF9zY2hlZHVsZSA9IGhhc19wdXNoYWJsZV90YXNrcyhycSk7Ci0jZW5kaWYKKwlzZXRfcG9zdF9zY2hlZHVsZShycSk7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTE3MjQsMTMgKzE3NjAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHByZV9zY2hlZHVsZV9ydChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCi17Ci0JLyogVHJ5IHRvIHB1bGwgUlQgdGFza3MgaGVyZSBpZiB3ZSBsb3dlciB0aGlzIHJxJ3MgcHJpbyAqLwotCWlmIChycS0+cnQuaGlnaGVzdF9wcmlvLmN1cnIgPiBwcmV2LT5wcmlvKQotCQlwdWxsX3J0X3Rhc2socnEpOwotfQotCiBzdGF0aWMgdm9pZCBwb3N0X3NjaGVkdWxlX3J0KHN0cnVjdCBycSAqcnEpCiB7CiAJcHVzaF9ydF90YXNrcyhycSk7CkBAIC0xODMzLDcgKzE4NjIsNyBAQAogCQlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwogfQogCi12b2lkIGluaXRfc2NoZWRfcnRfY2xhc3Modm9pZCkKK3ZvaWQgX19pbml0IGluaXRfc2NoZWRfcnRfY2xhc3Modm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMjAwNyw3ICsyMDM2LDYgQEAKIAkuc2V0X2NwdXNfYWxsb3dlZCAgICAgICA9IHNldF9jcHVzX2FsbG93ZWRfcnQsCiAJLnJxX29ubGluZSAgICAgICAgICAgICAgPSBycV9vbmxpbmVfcnQsCiAJLnJxX29mZmxpbmUgICAgICAgICAgICAgPSBycV9vZmZsaW5lX3J0LAotCS5wcmVfc2NoZWR1bGUJCT0gcHJlX3NjaGVkdWxlX3J0LAogCS5wb3N0X3NjaGVkdWxlCQk9IHBvc3Rfc2NoZWR1bGVfcnQsCiAJLnRhc2tfd29rZW4JCT0gdGFza193b2tlbl9ydCwKIAkuc3dpdGNoZWRfZnJvbQkJPSBzd2l0Y2hlZF9mcm9tX3J0LApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3NjaGVkLmggYi9rZXJuZWwvc2NoZWQvc2NoZWQuaAppbmRleCBmOTY0YWRkLi5jOTAwN2YyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvc2NoZWQuaAorKysgYi9rZXJuZWwvc2NoZWQvc2NoZWQuaApAQCAtMjQsMjQgKzI0LDYgQEAKIGV4dGVybiB2b2lkIHVwZGF0ZV9jcHVfbG9hZF9hY3RpdmUoc3RydWN0IHJxICp0aGlzX3JxKTsKIAogLyoKLSAqIENvbnZlcnQgdXNlci1uaWNlIHZhbHVlcyBbIC0yMCAuLi4gMCAuLi4gMTkgXQotICogdG8gc3RhdGljIHByaW9yaXR5IFsgTUFYX1JUX1BSSU8uLk1BWF9QUklPLTEgXSwKLSAqIGFuZCBiYWNrLgotICovCi0jZGVmaW5lIE5JQ0VfVE9fUFJJTyhuaWNlKQkoTUFYX1JUX1BSSU8gKyAobmljZSkgKyAyMCkKLSNkZWZpbmUgUFJJT19UT19OSUNFKHByaW8pCSgocHJpbykgLSBNQVhfUlRfUFJJTyAtIDIwKQotI2RlZmluZSBUQVNLX05JQ0UocCkJCVBSSU9fVE9fTklDRSgocCktPnN0YXRpY19wcmlvKQotCi0vKgotICogJ1VzZXIgcHJpb3JpdHknIGlzIHRoZSBuaWNlIHZhbHVlIGNvbnZlcnRlZCB0byBzb21ldGhpbmcgd2UKLSAqIGNhbiB3b3JrIHdpdGggYmV0dGVyIHdoZW4gc2NhbGluZyB2YXJpb3VzIHNjaGVkdWxlciBwYXJhbWV0ZXJzLAotICogaXQncyBhIFsgMCAuLi4gMzkgXSByYW5nZS4KLSAqLwotI2RlZmluZSBVU0VSX1BSSU8ocCkJCSgocCktTUFYX1JUX1BSSU8pCi0jZGVmaW5lIFRBU0tfVVNFUl9QUklPKHApCVVTRVJfUFJJTygocCktPnN0YXRpY19wcmlvKQotI2RlZmluZSBNQVhfVVNFUl9QUklPCQkoVVNFUl9QUklPKE1BWF9QUklPKSkKLQotLyoKICAqIEhlbHBlcnMgZm9yIGNvbnZlcnRpbmcgbmFub3NlY29uZCB0aW1pbmcgdG8gamlmZnkgcmVzb2x1dGlvbgogICovCiAjZGVmaW5lIE5TX1RPX0pJRkZJRVMoVElNRSkJKCh1bnNpZ25lZCBsb25nKShUSU1FKSAvIChOU0VDX1BFUl9TRUMgLyBIWikpCkBAIC00NDEsNiArNDIzLDE4IEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKK3N0YXRpYyBpbmxpbmUgaW50IHJ0X3JxX3Rocm90dGxlZChzdHJ1Y3QgcnRfcnEgKnJ0X3JxKQoreworCXJldHVybiBydF9ycS0+cnRfdGhyb3R0bGVkICYmICFydF9ycS0+cnRfbnJfYm9vc3RlZDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBydF9ycV90aHJvdHRsZWQoc3RydWN0IHJ0X3JxICpydF9ycSkKK3sKKwlyZXR1cm4gcnRfcnEtPnJ0X3Rocm90dGxlZDsKK30KKyNlbmRpZgorCiAvKiBEZWFkbGluZSBjbGFzcycgcmVsYXRlZCBmaWVsZHMgaW4gYSBydW5xdWV1ZSAqLwogc3RydWN0IGRsX3JxIHsKIAkvKiBydW5xdWV1ZSBpcyBhbiByYnRyZWUsIG9yZGVyZWQgYnkgZGVhZGxpbmUgKi8KQEAgLTU1OCwxMSArNTUyLDkgQEAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCS8qIGxpc3Qgb2YgbGVhZiBjZnNfcnEgb24gdGhpcyBjcHU6ICovCiAJc3RydWN0IGxpc3RfaGVhZCBsZWFmX2Nmc19ycV9saXN0OwotI2VuZGlmIC8qIENPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCiAKLSNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxlYWZfcnRfcnFfbGlzdDsKLSNlbmRpZgorCXN0cnVjdCBzY2hlZF9hdmcgYXZnOworI2VuZGlmIC8qIENPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCiAKIAkvKgogCSAqIFRoaXMgaXMgcGFydCBvZiBhIGdsb2JhbCBjb3VudGVyIHdoZXJlIG9ubHkgdGhlIHRvdGFsIHN1bQpAQCAtNjUxLDggKzY0Myw2IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCXN0cnVjdCBsbGlzdF9oZWFkIHdha2VfbGlzdDsKICNlbmRpZgotCi0Jc3RydWN0IHNjaGVkX2F2ZyBhdmc7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBjcHVfb2Yoc3RydWN0IHJxICpycSkKQEAgLTExMTIsNiArMTEwMiw4IEBACiAKICNkZWZpbmUgREVRVUVVRV9TTEVFUAkJMQogCisjZGVmaW5lIFJFVFJZX1RBU0sJCSgodm9pZCAqKS0xVUwpCisKIHN0cnVjdCBzY2hlZF9jbGFzcyB7CiAJY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzICpuZXh0OwogCkBAIC0xMTIyLDE0ICsxMTE0LDIyIEBACiAKIAl2b2lkICgqY2hlY2tfcHJlZW1wdF9jdXJyKSAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOwogCi0Jc3RydWN0IHRhc2tfc3RydWN0ICogKCpwaWNrX25leHRfdGFzaykgKHN0cnVjdCBycSAqcnEpOworCS8qCisJICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwaWNrX25leHRfdGFzaygpIG1ldGhvZCB0aGF0IHdpbGwKKwkgKiByZXR1cm4gdGhlIG5leHQgdGFzayB0byBjYWxsIHB1dF9wcmV2X3Rhc2soKSBvbiB0aGUgQHByZXYgdGFzayBvcgorCSAqIHNvbWV0aGluZyBlcXVpdmFsZW50LgorCSAqCisJICogTWF5IHJldHVybiBSRVRSWV9UQVNLIHdoZW4gaXQgZmluZHMgYSBoaWdoZXIgcHJpbyBjbGFzcyBoYXMgcnVubmFibGUKKwkgKiB0YXNrcy4KKwkgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiAoKnBpY2tfbmV4dF90YXNrKSAoc3RydWN0IHJxICpycSwKKwkJCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldik7CiAJdm9pZCAoKnB1dF9wcmV2X3Rhc2spIChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWludCAgKCpzZWxlY3RfdGFza19ycSkoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgdGFza19jcHUsIGludCBzZF9mbGFnLCBpbnQgZmxhZ3MpOwogCXZvaWQgKCptaWdyYXRlX3Rhc2tfcnEpKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG5leHRfY3B1KTsKIAotCXZvaWQgKCpwcmVfc2NoZWR1bGUpIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKnBvc3Rfc2NoZWR1bGUpIChzdHJ1Y3QgcnEgKnRoaXNfcnEpOwogCXZvaWQgKCp0YXNrX3dha2luZykgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKnRhc2tfd29rZW4pIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CkBAIC0xMTU5LDYgKzExNTksMTEgQEAKICNlbmRpZgogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIHB1dF9wcmV2X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQoreworCXByZXYtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKK30KKwogI2RlZmluZSBzY2hlZF9jbGFzc19oaWdoZXN0ICgmc3RvcF9zY2hlZF9jbGFzcykKICNkZWZpbmUgZm9yX2VhY2hfY2xhc3MoY2xhc3MpIFwKICAgIGZvciAoY2xhc3MgPSBzY2hlZF9jbGFzc19oaWdoZXN0OyBjbGFzczsgY2xhc3MgPSBjbGFzcy0+bmV4dCkKQEAgLTExNzUsMTYgKzExODAsMTQgQEAKIGV4dGVybiB2b2lkIHVwZGF0ZV9ncm91cF9wb3dlcihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSk7CiAKIGV4dGVybiB2b2lkIHRyaWdnZXJfbG9hZF9iYWxhbmNlKHN0cnVjdCBycSAqcnEpOwotZXh0ZXJuIHZvaWQgaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgc3RydWN0IHJxICp0aGlzX3JxKTsKIAogZXh0ZXJuIHZvaWQgaWRsZV9lbnRlcl9mYWlyKHN0cnVjdCBycSAqdGhpc19ycSk7CiBleHRlcm4gdm9pZCBpZGxlX2V4aXRfZmFpcihzdHJ1Y3QgcnEgKnRoaXNfcnEpOwogCi0jZWxzZQkvKiBDT05GSUdfU01QICovCisjZWxzZQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9iYWxhbmNlKGludCBjcHUsIHN0cnVjdCBycSAqcnEpCi17Ci19CitzdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9lbnRlcl9mYWlyKHN0cnVjdCBycSAqcnEpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkbGVfZXhpdF9mYWlyKHN0cnVjdCBycSAqcnEpIHsgfQogCiAjZW5kaWYKIApAQCAtMTIxMywxNiArMTIxNiw2IEBACiAKIGV4dGVybiB2b2lkIGluaXRfdGFza19ydW5uYWJsZV9hdmVyYWdlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNpZmRlZiBDT05GSUdfUEFSQVZJUlQKLXN0YXRpYyBpbmxpbmUgdTY0IHN0ZWFsX3RpY2tzKHU2NCBzdGVhbCkKLXsKLQlpZiAodW5saWtlbHkoc3RlYWwgPiBOU0VDX1BFUl9TRUMpKQotCQlyZXR1cm4gZGl2X3U2NChzdGVhbCwgVElDS19OU0VDKTsKLQotCXJldHVybiBfX2l0ZXJfZGl2X3U2NF9yZW0oc3RlYWwsIFRJQ0tfTlNFQywgJnN0ZWFsKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5jX25yX3J1bm5pbmcoc3RydWN0IHJxICpycSkKIHsKIAlycS0+bnJfcnVubmluZysrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3N0b3BfdGFzay5jIGIva2VybmVsL3NjaGVkL3N0b3BfdGFzay5jCmluZGV4IGZkYjZiYjAuLmQ2Y2U2NWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9zdG9wX3Rhc2suYworKysgYi9rZXJuZWwvc2NoZWQvc3RvcF90YXNrLmMKQEAgLTIzLDE2ICsyMywxOSBAQAogCS8qIHdlJ3JlIG5ldmVyIHByZWVtcHRlZCAqLwogfQogCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19zdG9wKHN0cnVjdCBycSAqcnEpCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICoKK3BpY2tfbmV4dF90YXNrX3N0b3Aoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqc3RvcCA9IHJxLT5zdG9wOwogCi0JaWYgKHN0b3AgJiYgc3RvcC0+b25fcnEpIHsKLQkJc3RvcC0+c2UuZXhlY19zdGFydCA9IHJxX2Nsb2NrX3Rhc2socnEpOwotCQlyZXR1cm4gc3RvcDsKLQl9CisJaWYgKCFzdG9wIHx8ICFzdG9wLT5vbl9ycSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gTlVMTDsKKwlwdXRfcHJldl90YXNrKHJxLCBwcmV2KTsKKworCXN0b3AtPnNlLmV4ZWNfc3RhcnQgPSBycV9jbG9ja190YXNrKHJxKTsKKworCXJldHVybiBzdG9wOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IGZmZWUzNWIuLjA2ZDU3NGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTExNywxMyArMTE3LDQzIEBACiAJY3NkLT5mbGFncyAmPSB+Q1NEX0ZMQUdfTE9DSzsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhLCBjc2RfZGF0YSk7CisKIC8qCiAgKiBJbnNlcnQgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjYWxsX3NpbmdsZV9kYXRhIGVsZW1lbnQKICAqIGZvciBleGVjdXRpb24gb24gdGhlIGdpdmVuIENQVS4gZGF0YSBtdXN0IGFscmVhZHkgaGF2ZQogICogLT5mdW5jLCAtPmluZm8sIGFuZCAtPmZsYWdzIHNldC4KICAqLwotc3RhdGljIHZvaWQgZ2VuZXJpY19leGVjX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLCBpbnQgd2FpdCkKK3N0YXRpYyBpbnQgZ2VuZXJpY19leGVjX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLAorCQkJICAgICAgIHNtcF9jYWxsX2Z1bmNfdCBmdW5jLCB2b2lkICppbmZvLCBpbnQgd2FpdCkKIHsKKwlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSBjc2Rfc3RhY2sgPSB7IC5mbGFncyA9IDAgfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWZ1bmMoaW5mbyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlpZiAoKHVuc2lnbmVkKWNwdSA+PSBucl9jcHVfaWRzIHx8ICFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRU5YSU87CisKKworCWlmICghY3NkKSB7CisJCWNzZCA9ICZjc2Rfc3RhY2s7CisJCWlmICghd2FpdCkKKwkJCWNzZCA9ICZfX2dldF9jcHVfdmFyKGNzZF9kYXRhKTsKKwl9CisKKwljc2RfbG9jayhjc2QpOworCisJY3NkLT5mdW5jID0gZnVuYzsKKwljc2QtPmluZm8gPSBpbmZvOworCiAJaWYgKHdhaXQpCiAJCWNzZC0+ZmxhZ3MgfD0gQ1NEX0ZMQUdfV0FJVDsKIApAQCAtMTQzLDYgKzE3Myw4IEBACiAKIAlpZiAod2FpdCkKIAkJY3NkX2xvY2tfd2FpdChjc2QpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNTEsNyArMTgzLDggQEAKICAqLwogdm9pZCBnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQodm9pZCkKIHsKLQlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpuZXh0OworCXN0cnVjdCBsbGlzdF9ub2RlICplbnRyeTsKKwlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLCAqY3NkX25leHQ7CiAKIAkvKgogCSAqIFNob3VsZG4ndCByZWNlaXZlIHRoaXMgaW50ZXJydXB0IG9uIGEgY3B1IHRoYXQgaXMgbm90IHlldCBvbmxpbmUuCkBAIC0xNjEsMjEgKzE5NCwxMiBAQAogCWVudHJ5ID0gbGxpc3RfZGVsX2FsbCgmX19nZXRfY3B1X3ZhcihjYWxsX3NpbmdsZV9xdWV1ZSkpOwogCWVudHJ5ID0gbGxpc3RfcmV2ZXJzZV9vcmRlcihlbnRyeSk7CiAKLQl3aGlsZSAoZW50cnkpIHsKLQkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZDsKLQotCQluZXh0ID0gZW50cnktPm5leHQ7Ci0KLQkJY3NkID0gbGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhLCBsbGlzdCk7CisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjc2QsIGNzZF9uZXh0LCBlbnRyeSwgbGxpc3QpIHsKIAkJY3NkLT5mdW5jKGNzZC0+aW5mbyk7CiAJCWNzZF91bmxvY2soY3NkKTsKLQotCQllbnRyeSA9IG5leHQ7CiAJfQogfQogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEsIGNzZF9kYXRhKTsKLQogLyoKICAqIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSAtIFJ1biBhIGZ1bmN0aW9uIG9uIGEgc3BlY2lmaWMgQ1BVCiAgKiBAZnVuYzogVGhlIGZ1bmN0aW9uIHRvIHJ1bi4gVGhpcyBtdXN0IGJlIGZhc3QgYW5kIG5vbi1ibG9ja2luZy4KQEAgLTE4NywxMiArMjExLDggQEAKIGludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgc21wX2NhbGxfZnVuY190IGZ1bmMsIHZvaWQgKmluZm8sCiAJCQkgICAgIGludCB3YWl0KQogewotCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIGQgPSB7Ci0JCS5mbGFncyA9IDAsCi0JfTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0aGlzX2NwdTsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCiAJLyoKIAkgKiBwcmV2ZW50IHByZWVtcHRpb24gYW5kIHJlc2NoZWR1bGUgb24gYW5vdGhlciBwcm9jZXNzb3IsCkBAIC0yMDksMjYgKzIyOSw3IEBACiAJV0FSTl9PTl9PTkNFKGNwdV9vbmxpbmUodGhpc19jcHUpICYmIGlycXNfZGlzYWJsZWQoKQogCQkgICAgICYmICFvb3BzX2luX3Byb2dyZXNzKTsKIAotCWlmIChjcHUgPT0gdGhpc19jcHUpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlmdW5jKGluZm8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfSBlbHNlIHsKLQkJaWYgKCh1bnNpZ25lZCljcHUgPCBucl9jcHVfaWRzICYmIGNwdV9vbmxpbmUoY3B1KSkgewotCQkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCA9ICZkOwotCi0JCQlpZiAoIXdhaXQpCi0JCQkJY3NkID0gJl9fZ2V0X2NwdV92YXIoY3NkX2RhdGEpOwotCi0JCQljc2RfbG9jayhjc2QpOwotCi0JCQljc2QtPmZ1bmMgPSBmdW5jOwotCQkJY3NkLT5pbmZvID0gaW5mbzsKLQkJCWdlbmVyaWNfZXhlY19zaW5nbGUoY3B1LCBjc2QsIHdhaXQpOwotCQl9IGVsc2UgewotCQkJZXJyID0gLUVOWElPOwkvKiBDUFUgbm90IG9ubGluZSAqLwotCQl9Ci0JfQorCWVyciA9IGdlbmVyaWNfZXhlY19zaW5nbGUoY3B1LCBOVUxMLCBmdW5jLCBpbmZvLCB3YWl0KTsKIAogCXB1dF9jcHUoKTsKIApAQCAtMjM2LDYgKzIzNywzNCBAQAogfQogRVhQT1JUX1NZTUJPTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUpOwogCisvKioKKyAqIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYygpOiBSdW4gYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9uIGEKKyAqIAkJCSAgICAgICAgIHNwZWNpZmljIENQVS4KKyAqIEBjcHU6IFRoZSBDUFUgdG8gcnVuIG9uLgorICogQGNzZDogUHJlLWFsbG9jYXRlZCBhbmQgc2V0dXAgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBMaWtlIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpLCBidXQgdGhlIGNhbGwgaXMgYXN5bmNob25vdXMgYW5kCisgKiBjYW4gdGh1cyBiZSBkb25lIGZyb20gY29udGV4dHMgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLgorICoKKyAqIFRoZSBjYWxsZXIgcGFzc2VzIGhpcyBvd24gcHJlLWFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZQorICogKGllOiBlbWJlZGRlZCBpbiBhbiBvYmplY3QpIGFuZCBpcyByZXNwb25zaWJsZSBmb3Igc3luY2hyb25pemluZyBpdAorICogc3VjaCB0aGF0IHRoZSBJUElzIHBlcmZvcm1lZCBvbiB0aGUgQGNzZCBhcmUgc3RyaWN0bHkgc2VyaWFsaXplZC4KKyAqCisgKiBOT1RFOiBCZSBjYXJlZnVsLCB0aGVyZSBpcyB1bmZvcnR1bmF0ZWx5IG5vIGN1cnJlbnQgZGVidWdnaW5nIGZhY2lsaXR5IHRvCisgKiB2YWxpZGF0ZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhpcyBzZXJpYWxpemF0aW9uLgorICovCitpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2FzeW5jKGludCBjcHUsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpjc2QpCit7CisJaW50IGVyciA9IDA7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwllcnIgPSBnZW5lcmljX2V4ZWNfc2luZ2xlKGNwdSwgY3NkLCBjc2QtPmZ1bmMsIGNzZC0+aW5mbywgMCk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfYXN5bmMpOworCiAvKgogICogc21wX2NhbGxfZnVuY3Rpb25fYW55IC0gUnVuIGEgZnVuY3Rpb24gb24gYW55IG9mIHRoZSBnaXZlbiBjcHVzCiAgKiBAbWFzazogVGhlIG1hc2sgb2YgY3B1cyBpdCBjYW4gcnVuIG9uLgpAQCAtMjgwLDQ0ICszMDksNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfZnVuY3Rpb25fYW55KTsKIAogLyoqCi0gKiBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpOiBSdW4gYSBmdW5jdGlvbiBvbiBhIHNwZWNpZmljIENQVQotICogQGNwdTogVGhlIENQVSB0byBydW4gb24uCi0gKiBAZGF0YTogUHJlLWFsbG9jYXRlZCBhbmQgc2V0dXAgZGF0YSBzdHJ1Y3R1cmUKLSAqIEB3YWl0OiBJZiB0cnVlLCB3YWl0IHVudGlsIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQgb24gc3BlY2lmaWVkIENQVS4KLSAqCi0gKiBMaWtlIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgpLCBidXQgYWxsb3cgY2FsbGVyIHRvIHBhc3MgaW4gYQotICogcHJlLWFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZS4gVXNlZnVsIGZvciBlbWJlZGRpbmcgQGRhdGEgaW5zaWRlCi0gKiBvdGhlciBzdHJ1Y3R1cmVzLCBmb3IgaW5zdGFuY2UuCi0gKi8KLXZvaWQgX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCwKLQkJCQlpbnQgd2FpdCkKLXsKLQl1bnNpZ25lZCBpbnQgdGhpc19jcHU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXRoaXNfY3B1ID0gZ2V0X2NwdSgpOwotCS8qCi0JICogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KLQkgKiBXZSBhbGxvdyBjcHUncyB0aGF0IGFyZSBub3QgeWV0IG9ubGluZSB0aG91Z2gsIGFzIG5vIG9uZSBlbHNlIGNhbgotCSAqIHNlbmQgc21wIGNhbGwgZnVuY3Rpb24gaW50ZXJydXB0IHRvIHRoaXMgY3B1IGFuZCBhcyBzdWNoIGRlYWRsb2NrcwotCSAqIGNhbid0IGhhcHBlbi4KLQkgKi8KLQlXQVJOX09OX09OQ0UoY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCkpICYmIHdhaXQgJiYgaXJxc19kaXNhYmxlZCgpCi0JCSAgICAgJiYgIW9vcHNfaW5fcHJvZ3Jlc3MpOwotCi0JaWYgKGNwdSA9PSB0aGlzX2NwdSkgewotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWNzZC0+ZnVuYyhjc2QtPmluZm8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfSBlbHNlIHsKLQkJY3NkX2xvY2soY3NkKTsKLQkJZ2VuZXJpY19leGVjX3NpbmdsZShjcHUsIGNzZCwgd2FpdCk7Ci0JfQotCXB1dF9jcHUoKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKLQotLyoqCiAgKiBzbXBfY2FsbF9mdW5jdGlvbl9tYW55KCk6IFJ1biBhIGZ1bmN0aW9uIG9uIGEgc2V0IG9mIG90aGVyIENQVXMuCiAgKiBAbWFzazogVGhlIHNldCBvZiBjcHVzIHRvIHJ1biBvbiAob25seSBydW5zIG9uIG9ubGluZSBzdWJzZXQpLgogICogQGZ1bmM6IFRoZSBmdW5jdGlvbiB0byBydW4uIFRoaXMgbXVzdCBiZSBmYXN0IGFuZCBub24tYmxvY2tpbmcuCmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCA0OTBmY2JiLi5iNTA5OTBhIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvaXJxLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggYzBhNThiZS4uYWRhZWFiNiAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtMTc0LDEwICsxNzQsMTAgQEAKIAogCS8qIG5vcm1hbGl6ZTogYXZvaWQgc2lnbmVkIGRpdmlzaW9uIChyb3VuZGluZyBwcm9ibGVtcykgKi8KIAllcnJvciA9IC1FU1JDSDsKLQlpZiAobmljZXZhbCA8IC0yMCkKLQkJbmljZXZhbCA9IC0yMDsKLQlpZiAobmljZXZhbCA+IDE5KQotCQluaWNldmFsID0gMTk7CisJaWYgKG5pY2V2YWwgPCBNSU5fTklDRSkKKwkJbmljZXZhbCA9IE1JTl9OSUNFOworCWlmIChuaWNldmFsID4gTUFYX05JQ0UpCisJCW5pY2V2YWwgPSBNQVhfTklDRTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDQ5ZTEzZTEuLjA5ZDJlMjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTExMiw5ICsxMTIsNiBAQAogI2lmbmRlZiBDT05GSUdfTU1VCiBleHRlcm4gaW50IHN5c2N0bF9ucl90cmltX3BhZ2VzOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JMT0NLCi1leHRlcm4gaW50IGJsa19pb3BvbGxfZW5hYmxlZDsKLSNlbmRpZgogCiAvKiBDb25zdGFudHMgdXNlZCBmb3IgbWluaW11bSBhbmQgIG1heGltdW0gKi8KICNpZmRlZiBDT05GSUdfTE9DS1VQX0RFVEVDVE9SCkBAIC0zODYsMTMgKzM4Myw2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCiAJewotCQkucHJvY25hbWUgICAgICAgPSAibnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCIsCi0JCS5kYXRhICAgICAgICAgICA9ICZzeXNjdGxfbnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCwKLQkJLm1heGxlbiAgICAgICAgID0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlICAgICAgICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgICA9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7CiAJCS5wcm9jbmFtZQk9ICJudW1hX2JhbGFuY2luZyIsCiAJCS5kYXRhCQk9IE5VTEwsIC8qIGZpbGxlZCBpbiBieSBoYW5kbGVyICovCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCkBAIC0xMDk0LDE1ICsxMDg0LDYgQEAKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19CTE9DSwotCXsKLQkJLnByb2NuYW1lCT0gImJsa19pb3BvbGwiLAotCQkuZGF0YQkJPSAmYmxrX2lvcG9sbF9lbmFibGVkLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKLQl9LAotI2VuZGlmCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9LY29uZmlnIGIva2VybmVsL3RpbWUvS2NvbmZpZwppbmRleCAzY2U2ZThjLi5mNDQ4NTEzIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9LY29uZmlnCisrKyBiL2tlcm5lbC90aW1lL0tjb25maWcKQEAgLTEyNCw3ICsxMjQsNyBAQAogZW5kY2hvaWNlCiAKIGNvbmZpZyBOT19IWl9GVUxMX0FMTAotICAgICAgIGJvb2wgIkZ1bGwgZHludGlja3Mgc3lzdGVtIG9uIGFsbCBDUFVzIGJ5IGRlZmF1bHQiCisgICAgICAgYm9vbCAiRnVsbCBkeW50aWNrcyBzeXN0ZW0gb24gYWxsIENQVXMgYnkgZGVmYXVsdCAoZXhjZXB0IENQVSAwKSIKICAgICAgICBkZXBlbmRzIG9uIE5PX0haX0ZVTEwKICAgICAgICBoZWxwCiAgICAgICAgICBJZiB0aGUgdXNlciBkb2Vzbid0IHBhc3MgdGhlIG5vaHpfZnVsbCBib290IG9wdGlvbiB0bwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvTWFrZWZpbGUgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQppbmRleCA5MjUwMTMwLi41N2E0MTNmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQpAQCAtMyw3ICszLDEwIEBACiAKIG9iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEKQkJKz0gY2xvY2tldmVudHMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpCQkrPSB0aWNrLWNvbW1vbi5vCi1vYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpCSs9IHRpY2stYnJvYWRjYXN0Lm8KK2lmZXEgKCQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUKSx5KQorIG9iai15CQkJCQkJKz0gdGljay1icm9hZGNhc3QubworIG9iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1icm9hZGNhc3QtaHJ0aW1lci5vCitlbmRpZgogb2JqLSQoQ09ORklHX0dFTkVSSUNfU0NIRURfQ0xPQ0spCQkrPSBzY2hlZF9jbG9jay5vCiBvYmotJChDT05GSUdfVElDS19PTkVTSE9UKQkJCSs9IHRpY2stb25lc2hvdC5vCiBvYmotJChDT05GSUdfVElDS19PTkVTSE9UKQkJCSs9IHRpY2stc2NoZWQubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKaW5kZXggMDg2YWQ2MC4uYWQzNjJjMiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYworKysgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCkBAIC00MzksNiArNDM5LDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKTsKIAoraW50IF9fY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCB1MzIgZnJlcSkKK3sKKwljbG9ja2V2ZW50c19jb25maWcoZGV2LCBmcmVxKTsKKworCWlmIChkZXYtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkKKwkJcmV0dXJuIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBkZXYtPm5leHRfZXZlbnQsIGZhbHNlKTsKKworCWlmIChkZXYtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpCisJCWRldi0+c2V0X21vZGUoQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBjbG9ja2V2ZW50c191cGRhdGVfZnJlcSAtIFVwZGF0ZSBmcmVxdWVuY3kgYW5kIHJlcHJvZ3JhbSBhIGNsb2NrIGV2ZW50IGRldmljZS4KICAqIEBkZXY6CWRldmljZSB0byBtb2RpZnkKQEAgLTQ0NiwxNyArNDU5LDIyIEBACiAgKgogICogUmVjb25maWd1cmUgYW5kIHJlcHJvZ3JhbSBhIGNsb2NrIGV2ZW50IGRldmljZSBpbiBvbmVzaG90CiAgKiBtb2RlLiBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgY3B1IGZvciB3aGljaCB0aGUgZGV2aWNlIGRlbGl2ZXJzIHBlcgotICogY3B1IHRpbWVyIGV2ZW50cyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQhICBSZXR1cm5zIDAgb24gc3VjY2VzcywKLSAqIC1FVElNRSB3aGVuIHRoZSBldmVudCBpcyBpbiB0aGUgcGFzdC4KKyAqIGNwdSB0aW1lciBldmVudHMuIElmIGNhbGxlZCBmb3IgdGhlIGJyb2FkY2FzdCBkZXZpY2UgdGhlIGNvcmUgdGFrZXMKKyAqIGNhcmUgb2Ygc2VyaWFsaXphdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVUSU1FIHdoZW4gdGhlIGV2ZW50IGlzIGluIHRoZSBwYXN0LgogICovCiBpbnQgY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCB1MzIgZnJlcSkKIHsKLQljbG9ja2V2ZW50c19jb25maWcoZGV2LCBmcmVxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CiAKLQlpZiAoZGV2LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX09ORVNIT1QpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBkZXYtPm5leHRfZXZlbnQsIGZhbHNlKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0ID0gdGlja19icm9hZGNhc3RfdXBkYXRlX2ZyZXEoZGV2LCBmcmVxKTsKKwlpZiAocmV0ID09IC1FTk9ERVYpCisJCXJldCA9IF9fY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoZGV2LCBmcmVxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTUyNCwxMiArNTQyLDEzIEBACiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKIC8qKgogICogY2xvY2tldmVudHNfbm90aWZ5IC0gbm90aWZpY2F0aW9uIGFib3V0IHJlbGV2YW50IGV2ZW50cworICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFueSBvdGhlciB2YWx1ZSBvbiBlcnJvcgogICovCi12b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQoraW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjcHU7CisJaW50IGNwdSwgcmV0ID0gMDsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tldmVudHNfbG9jaywgZmxhZ3MpOwogCkBAIC01NDIsNyArNTYxLDcgQEAKIAogCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVI6CiAJY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElUOgotCQl0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wocmVhc29uKTsKKwkJcmV0ID0gdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHJlYXNvbik7CiAJCWJyZWFrOwogCiAJY2FzZSBDTE9DS19FVlRfTk9USUZZX0NQVV9EWUlORzoKQEAgLTU4NSw2ICs2MDQsNyBAQAogCQlicmVhazsKIAl9CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZXZlbnRzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xvY2tldmVudHNfbm90aWZ5KTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvbnRwLmMgYi9rZXJuZWwvdGltZS9udHAuYwppbmRleCBhZjhkMWQ0Li40MTlhNTJjIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9udHAuYworKysgYi9rZXJuZWwvdGltZS9udHAuYwpAQCAtNTE0LDEyICs1MTQsMTMgQEAKIAkJbmV4dC50dl9zZWMrKzsKIAkJbmV4dC50dl9uc2VjIC09IE5TRUNfUEVSX1NFQzsKIAl9Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzeW5jX2Ntb3Nfd29yaywgdGltZXNwZWNfdG9famlmZmllcygmbmV4dCkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJICAgJnN5bmNfY21vc193b3JrLCB0aW1lc3BlY190b19qaWZmaWVzKCZuZXh0KSk7CiB9CiAKIHZvaWQgbnRwX25vdGlmeV9jbW9zX3RpbWVyKHZvaWQpCiB7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzeW5jX2Ntb3Nfd29yaywgMCk7CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZzeW5jX2Ntb3Nfd29yaywgMCk7CiB9CiAKICNlbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC1ocnRpbWVyLmMgYi9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC1ocnRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2ODJkNQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYworICogVGhpcyBmaWxlIGVtdWxhdGVzIGEgbG9jYWwgY2xvY2sgZXZlbnQgZGV2aWNlCisgKiB2aWEgYSBwc2V1ZG8gY2xvY2sgZGV2aWNlLgorICovCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgInRpY2staW50ZXJuYWwuaCIKKworc3RhdGljIHN0cnVjdCBocnRpbWVyIGJjdGltZXI7CisKK3N0YXRpYyB2b2lkIGJjX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwkJLyoKKwkJICogTm90ZSwgd2UgY2Fubm90IGNhbmNlbCB0aGUgdGltZXIgaGVyZSBhcyB3ZSBtaWdodAorCQkgKiBydW4gaW50byB0aGUgZm9sbG93aW5nIGxpdmUgbG9jayBzY2VuYXJpbzoKKwkJICoKKwkJICogY3B1IDAJCWNwdTEKKwkJICogbG9jayhicm9hZGNhc3RfbG9jayk7CisJCSAqCQkJaHJ0aW1lcl9pbnRlcnJ1cHQoKQorCQkgKgkJCWJjX2hhbmRsZXIoKQorCQkgKgkJCSAgIHRpY2tfaGFuZGxlX29uZXNob3RfYnJvYWRjYXN0KCk7CisJCSAqCQkJICAgIGxvY2soYnJvYWRjYXN0X2xvY2spOworCQkgKiBocnRpbWVyX2NhbmNlbCgpCisJCSAqICB3YWl0X2Zvcl9jYWxsYmFjaygpCisJCSAqLworCQlocnRpbWVyX3RyeV90b19jYW5jZWwoJmJjdGltZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBndXRzIG9mIHRoZSBicm9hZGNhc3QgY29kZSB3aGVuIHRoZSBjcHUKKyAqIHdoaWNoIGlzIGFib3V0IHRvIGVudGVyIGlkbGUgaGFzIHRoZSBlYXJsaWVzdCBicm9hZGNhc3QgdGltZXIgZXZlbnQuCisgKi8KK3N0YXRpYyBpbnQgYmNfc2V0X25leHQoa3RpbWVfdCBleHBpcmVzLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwkvKgorCSAqIFdlIHRyeSB0byBjYW5jZWwgdGhlIHRpbWVyIGZpcnN0LiBJZiB0aGUgY2FsbGJhY2sgaXMgb24KKwkgKiBmbGlnaHQgb24gc29tZSBvdGhlciBjcHUgdGhlbiB3ZSBsZXQgaXQgaGFuZGxlIGl0LiBJZiB3ZQorCSAqIHdlcmUgYWJsZSB0byBjYW5jZWwgdGhlIHRpbWVyIG5vdGhpbmcgY2FuIHJlYXJtIGl0IGFzIHdlCisJICogb3duIGJyb2FkY2FzdF9sb2NrLgorCSAqCisJICogSG93ZXZlciB3ZSBjYW4gYWxzbyBiZSBjYWxsZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciBvZgorCSAqIGNlX2Jyb2FkY2FzdF9ocnRpbWVyIGl0c2VsZiB3aGVuIGl0IGV4cGlyZXMuIFdlIGNhbm5vdAorCSAqIHJlc3RhcnQgdGhlIHRpbWVyIGJlY2F1c2Ugd2UgYXJlIGluIHRoZSBjYWxsYmFjaywgYnV0IHdlCisJICogY2FuIHNldCB0aGUgZXhwaXJ5IHRpbWUgYW5kIGxldCB0aGUgY2FsbGJhY2sgcmV0dXJuCisJICogSFJUSU1FUl9SRVNUQVJULgorCSAqLworCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJmJjdGltZXIpID49IDApIHsKKwkJaHJ0aW1lcl9zdGFydCgmYmN0aW1lciwgZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCU19QSU5ORUQpOworCQkvKiBCaW5kIHRoZSAiZGV2aWNlIiB0byB0aGUgY3B1ICovCisJCWJjLT5ib3VuZF9vbiA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl9IGVsc2UgaWYgKGJjLT5ib3VuZF9vbiA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJaHJ0aW1lcl9zZXRfZXhwaXJlcygmYmN0aW1lciwgZXhwaXJlcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBjZV9icm9hZGNhc3RfaHJ0aW1lciA9IHsKKwkuc2V0X21vZGUJCT0gYmNfc2V0X21vZGUsCisJLnNldF9uZXh0X2t0aW1lCQk9IGJjX3NldF9uZXh0LAorCS5mZWF0dXJlcwkJPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UIHwKKwkJCQkgIENMT0NLX0VWVF9GRUFUX0tUSU1FIHwKKwkJCQkgIENMT0NLX0VWVF9GRUFUX0hSVElNRVIsCisJLnJhdGluZwkJCT0gMCwKKwkuYm91bmRfb24JCT0gLTEsCisJLm1pbl9kZWx0YV9ucwkJPSAxLAorCS5tYXhfZGVsdGFfbnMJCT0gS1RJTUVfTUFYLAorCS5taW5fZGVsdGFfdGlja3MJPSAxLAorCS5tYXhfZGVsdGFfdGlja3MJPSBVTE9OR19NQVgsCisJLm11bHQJCQk9IDEsCisJLnNoaWZ0CQkJPSAwLAorCS5jcHVtYXNrCQk9IGNwdV9hbGxfbWFzaywKK307CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBiY19oYW5kbGVyKHN0cnVjdCBocnRpbWVyICp0KQoreworCWNlX2Jyb2FkY2FzdF9ocnRpbWVyLmV2ZW50X2hhbmRsZXIoJmNlX2Jyb2FkY2FzdF9ocnRpbWVyKTsKKworCWlmIChjZV9icm9hZGNhc3RfaHJ0aW1lci5uZXh0X2V2ZW50LnR2NjQgPT0gS1RJTUVfTUFYKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisKKwlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOworfQorCit2b2lkIHRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3Qodm9pZCkKK3sKKwlocnRpbWVyX2luaXQoJmJjdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CisJYmN0aW1lci5mdW5jdGlvbiA9IGJjX2hhbmRsZXI7CisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZjZV9icm9hZGNhc3RfaHJ0aW1lcik7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwppbmRleCA5ODk3N2E1Li42NGM1OTkwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKQEAgLTEyMCw2ICsxMjAsMTkgQEAKIAlyZXR1cm4gKGRldiAmJiB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2ID09IGRldik7CiB9CiAKK2ludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKQoreworCWludCByZXQgPSAtRU5PREVWOworCisJaWYgKHRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShkZXYpKSB7CisJCXJhd19zcGluX2xvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOworCQlyZXQgPSBfX2Nsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKGRldiwgZnJlcSk7CisJCXJhd19zcGluX3VubG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIHZvaWQgZXJyX2Jyb2FkY2FzdChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlwcl9jcml0X29uY2UoIkZhaWxlZCB0byBicm9hZGNhc3QgdGltZXIgdGljay4gU29tZSBDUFVzIG1heSBiZSB1bnJlc3BvbnNpdmUuXG4iKTsKQEAgLTI3MiwxMiArMjg1LDggQEAKICAqLwogc3RhdGljIHZvaWQgdGlja19kb19wZXJpb2RpY19icm9hZGNhc3Qodm9pZCkKIHsKLQlyYXdfc3Bpbl9sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKLQogCWNwdW1hc2tfYW5kKHRtcG1hc2ssIGNwdV9vbmxpbmVfbWFzaywgdGlja19icm9hZGNhc3RfbWFzayk7CiAJdGlja19kb19icm9hZGNhc3QodG1wbWFzayk7Ci0KLQlyYXdfc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOwogfQogCiAvKgpAQCAtMjg3LDEzICsyOTYsMTUgQEAKIHsKIAlrdGltZV90IG5leHQ7CiAKKwlyYXdfc3Bpbl9sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKKwogCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CiAKIAkvKgogCSAqIFRoZSBkZXZpY2UgaXMgaW4gcGVyaW9kaWMgbW9kZS4gTm8gcmVwcm9ncmFtbWluZyBuZWNlc3Nhcnk6CiAJICovCiAJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKLQkJcmV0dXJuOworCQlnb3RvIHVubG9jazsKIAogCS8qCiAJICogU2V0dXAgdGhlIG5leHQgcGVyaW9kIGZvciBkZXZpY2VzLCB3aGljaCBkbyBub3QgaGF2ZQpAQCAtMzA2LDkgKzMxNywxMSBAQAogCQluZXh0ID0ga3RpbWVfYWRkKG5leHQsIHRpY2tfcGVyaW9kKTsKIAogCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBmYWxzZSkpCi0JCQlyZXR1cm47CisJCQlnb3RvIHVubG9jazsKIAkJdGlja19kb19wZXJpb2RpY19icm9hZGNhc3QoKTsKIAl9Cit1bmxvY2s6CisJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKIH0KIAogLyoKQEAgLTYzMCwyNCArNjQzLDYxIEBACiAJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKIH0KIAorc3RhdGljIGludCBicm9hZGNhc3RfbmVlZHNfY3B1KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjLCBpbnQgY3B1KQoreworCWlmICghKGJjLT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0hSVElNRVIpKQorCQlyZXR1cm4gMDsKKwlpZiAoYmMtPm5leHRfZXZlbnQudHY2NCA9PSBLVElNRV9NQVgpCisJCXJldHVybiAwOworCXJldHVybiBiYy0+Ym91bmRfb24gPT0gY3B1ID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIHZvaWQgYnJvYWRjYXN0X3NodXRkb3duX2xvY2FsKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjLAorCQkJCSAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCS8qCisJICogRm9yIGhydGltZXIgYmFzZWQgYnJvYWRjYXN0aW5nIHdlIGNhbm5vdCBzaHV0ZG93biB0aGUgY3B1CisJICogbG9jYWwgZGV2aWNlIGlmIG91ciBvd24gZXZlbnQgaXMgdGhlIGZpcnN0IG9uZSB0byBleHBpcmUgb3IKKwkgKiBpZiB3ZSBvd24gdGhlIGJyb2FkY2FzdCB0aW1lci4KKwkgKi8KKwlpZiAoYmMtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfSFJUSU1FUikgeworCQlpZiAoYnJvYWRjYXN0X25lZWRzX2NwdShiYywgc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKwkJCXJldHVybjsKKwkJaWYgKGRldi0+bmV4dF9ldmVudC50djY0IDwgYmMtPm5leHRfZXZlbnQudHY2NCkKKwkJCXJldHVybjsKKwl9CisJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7Cit9CisKK3N0YXRpYyB2b2lkIGJyb2FkY2FzdF9tb3ZlX2JjKGludCBkZWFkY3B1KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKworCWlmICghYmMgfHwgIWJyb2FkY2FzdF9uZWVkc19jcHUoYmMsIGRlYWRjcHUpKQorCQlyZXR1cm47CisJLyogVGhpcyBtb3ZlcyB0aGUgYnJvYWRjYXN0IGFzc2lnbm1lbnQgdG8gdGhpcyBjcHUgKi8KKwljbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KGJjLCBiYy0+bmV4dF9ldmVudCwgMSk7Cit9CisKIC8qCiAgKiBQb3dlcnN0YXRlIGluZm9ybWF0aW9uOiBUaGUgc3lzdGVtIGVudGVycy9sZWF2ZXMgYSBzdGF0ZSwgd2hlcmUKICAqIGFmZmVjdGVkIGRldmljZXMgbWlnaHQgc3RvcAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FQlVTWSBpZiB0aGUgY3B1IGlzIHVzZWQgdG8gYnJvYWRjYXN0IHdha2V1cHMuCiAgKi8KLXZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKQoraW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYywgKmRldjsKIAlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJa3RpbWVfdCBub3c7Ci0JaW50IGNwdTsKKwlpbnQgY3B1LCByZXQgPSAwOwogCiAJLyoKIAkgKiBQZXJpb2RpYyBtb2RlIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGVudGVyL2V4aXQgb2YgcG93ZXIKIAkgKiBzdGF0ZXMKIAkgKi8KIAlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBXZSBhcmUgY2FsbGVkIHdpdGggcHJlZW10aW9uIGRpc2FibGVkIGZyb20gdGhlIGRlcHRoIG9mIHRoZQpAQCAtNjU4LDcgKzcwOCw3IEBACiAJZGV2ID0gdGQtPmV2dGRldjsKIAogCWlmICghKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJYmMgPSB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2OwogCkBAIC02NjYsNyArNzE2LDcgQEAKIAlpZiAocmVhc29uID09IENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSKSB7CiAJCWlmICghY3B1bWFza190ZXN0X2FuZF9zZXRfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgewogCQkJV0FSTl9PTl9PTkNFKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9wZW5kaW5nX21hc2spKTsKLQkJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQkJYnJvYWRjYXN0X3NodXRkb3duX2xvY2FsKGJjLCBkZXYpOwogCQkJLyoKIAkJCSAqIFdlIG9ubHkgcmVwcm9ncmFtIHRoZSBicm9hZGNhc3QgdGltZXIgaWYgd2UKIAkJCSAqIGRpZCBub3QgbWFyayBvdXJzZWxmIGluIHRoZSBmb3JjZSBtYXNrIGFuZApAQCAtNjc5LDYgKzcyOSwxNiBAQAogCQkJICAgIGRldi0+bmV4dF9ldmVudC50djY0IDwgYmMtPm5leHRfZXZlbnQudHY2NCkKIAkJCQl0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoYmMsIGNwdSwgZGV2LT5uZXh0X2V2ZW50LCAxKTsKIAkJfQorCQkvKgorCQkgKiBJZiB0aGUgY3VycmVudCBDUFUgb3ducyB0aGUgaHJ0aW1lciBicm9hZGNhc3QKKwkJICogbWVjaGFuaXNtLCBpdCBjYW5ub3QgZ28gZGVlcCBpZGxlIGFuZCB3ZSByZW1vdmUgdGhlCisJCSAqIENQVSBmcm9tIHRoZSBicm9hZGNhc3QgbWFzay4gV2UgZG9uJ3QgaGF2ZSB0byBnbworCQkgKiB0aHJvdWdoIHRoZSBFWElUIHBhdGggYXMgdGhlIGxvY2FsIHRpbWVyIGlzIG5vdAorCQkgKiBzaHV0ZG93bi4KKwkJICovCisJCXJldCA9IGJyb2FkY2FzdF9uZWVkc19jcHUoYmMsIGNwdSk7CisJCWlmIChyZXQpCisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzayk7CiAJfSBlbHNlIHsKIAkJaWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgewogCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKQEAgLTc0Niw2ICs4MDYsNyBAQAogCX0KIG91dDoKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC04NTIsNiArOTEzLDggQEAKIAljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X3BlbmRpbmdfbWFzayk7CiAJY3B1bWFza19jbGVhcl9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9mb3JjZV9tYXNrKTsKIAorCWJyb2FkY2FzdF9tb3ZlX2JjKGNwdSk7CisKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwppbmRleCAyMGIyZmUzLi4wMTU2NjEyIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKQEAgLTk4LDE4ICs5OCwxOSBAQAogdm9pZCB0aWNrX2hhbmRsZV9wZXJpb2RpYyhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlrdGltZV90IG5leHQ7CisJa3RpbWVfdCBuZXh0ID0gZGV2LT5uZXh0X2V2ZW50OwogCiAJdGlja19wZXJpb2RpYyhjcHUpOwogCiAJaWYgKGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQogCQlyZXR1cm47Ci0JLyoKLQkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCi0JICogcGVyaW9kaWMgbW9kZToKLQkgKi8KLQluZXh0ID0ga3RpbWVfYWRkKGRldi0+bmV4dF9ldmVudCwgdGlja19wZXJpb2QpOwogCWZvciAoOzspIHsKKwkJLyoKKwkJICogU2V0dXAgdGhlIG5leHQgcGVyaW9kIGZvciBkZXZpY2VzLCB3aGljaCBkbyBub3QgaGF2ZQorCQkgKiBwZXJpb2RpYyBtb2RlOgorCQkgKi8KKwkJbmV4dCA9IGt0aW1lX2FkZChuZXh0LCB0aWNrX3BlcmlvZCk7CisKIAkJaWYgKCFjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KGRldiwgbmV4dCwgZmFsc2UpKQogCQkJcmV0dXJuOwogCQkvKgpAQCAtMTE4LDEyICsxMTksMTEgQEAKIAkJICogdG8gYmUgc3VyZSB3ZSdyZSB1c2luZyBhIHJlYWwgaGFyZHdhcmUgY2xvY2tzb3VyY2UuCiAJCSAqIE90aGVyd2lzZSB3ZSBjb3VsZCBnZXQgdHJhcHBlZCBpbiBhbiBpbmZpbml0ZQogCQkgKiBsb29wLCBhcyB0aGUgdGlja19wZXJpb2RpYygpIGluY3JlbWVudHMgamlmZmllcywKLQkJICogd2hlbiB0aGVuIHdpbGwgaW5jcmVtZW50IHRpbWUsIHBvc2libHkgY2F1c2luZworCQkgKiB3aGljaCB0aGVuIHdpbGwgaW5jcmVtZW50IHRpbWUsIHBvc3NpYmx5IGNhdXNpbmcKIAkJICogdGhlIGxvb3AgdG8gdHJpZ2dlciBhZ2FpbiBhbmQgYWdhaW4uCiAJCSAqLwogCQlpZiAodGltZWtlZXBpbmdfdmFsaWRfZm9yX2hyZXMoKSkKIAkJCXRpY2tfcGVyaW9kaWMoY3B1KTsKLQkJbmV4dCA9IGt0aW1lX2FkZChuZXh0LCB0aWNrX3BlcmlvZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWludGVybmFsLmggYi9rZXJuZWwvdGltZS90aWNrLWludGVybmFsLmgKaW5kZXggODMyOTY2OS4uN2FiOTJiMSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCisrKyBiL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaApAQCAtNDYsNyArNDYsNyBAQAogZXh0ZXJuIHZvaWQgdGlja19yZXN1bWVfb25lc2hvdCh2b2lkKTsKICMgaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCiBleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKTsKLWV4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbik7CitleHRlcm4gaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbik7CiBleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKTsKIGV4dGVybiBpbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0X29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpOwpAQCAtNTgsNyArNTgsNyBAQAogewogCUJVRygpOwogfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KHVuc2lnbmVkIGludCAqY3B1cCkgeyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2FjdGl2ZSh2b2lkKSB7IHJldHVybiAwOyB9CkBAIC04Nyw3ICs4Nyw3IEBACiB7CiAJQlVHKCk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHRpY2tfcmVzdW1lX2Jyb2FkY2FzdF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQogewpAQCAtMTExLDYgKzExMSw3IEBACiBleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQKIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KTsKK2ludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKTsKIAogI2Vsc2UgLyogIUJST0FEQ0FTVCAqLwogCkBAIC0xMzMsNiArMTM0LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3N1c3BlbmRfYnJvYWRjYXN0KHZvaWQpIHsgfQogc3RhdGljIGlubGluZSBpbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0KHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9pbml0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19icm9hZGNhc3RfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCQkgICAgIHUzMiBmcmVxKSB7IHJldHVybiAtRU5PREVWOyB9CiAKIC8qCiAgKiBTZXQgdGhlIHBlcmlvZGljIGhhbmRsZXIgaW4gbm9uIGJyb2FkY2FzdCBtb2RlCkBAIC0xNTIsNiArMTU1LDggQEAKIAlyZXR1cm4gIShkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfRFVNTVkpOwogfQogCitpbnQgX19jbG9ja2V2ZW50c191cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKTsKKwogI2VuZGlmCiAKIGV4dGVybiB2b2lkIGRvX3RpbWVyKHVuc2lnbmVkIGxvbmcgdGlja3MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggMGFhNGNlODEuLjViNDAyNzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtMTQzNSw3ICsxNDM1LDggQEAKIG91dDoKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZWtlZXBlcl9sb2NrLCBmbGFncyk7CiAJaWYgKGNsb2NrX3NldCkKLQkJY2xvY2tfd2FzX3NldCgpOworCQkvKiBIYXZlIHRvIGNhbGwgX2RlbGF5ZWQgdmVyc2lvbiwgc2luY2UgaW4gaXJxIGNvbnRleHQqLworCQljbG9ja193YXNfc2V0X2RlbGF5ZWQoKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmdfZGVidWcuYwppbmRleCA4MDI0MzNhLi40ZDU0Zjk3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nX2RlYnVnLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAorI2luY2x1ZGUgInRpbWVrZWVwaW5nX2ludGVybmFsLmgiCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfdGltZV9iaW5bMzJdID0gezB9OwogCiBzdGF0aWMgaW50IHRrX2RlYnVnX3Nob3dfc2xlZXBfdGltZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IGFjY2ZkMjQuLjg3YmQ1MjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC01Miw3ICs1Miw3IEBACiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvdGltZXIuaD4KIAotdTY0IGppZmZpZXNfNjQgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgPSBJTklUSUFMX0pJRkZJRVM7CitfX3Zpc2libGUgdTY0IGppZmZpZXNfNjQgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgPSBJTklUSUFMX0pJRkZJRVM7CiAKIEVYUE9SVF9TWU1CT0woamlmZmllc182NCk7CiAKQEAgLTgxLDYgKzgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRpbWVyX2ppZmZpZXM7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyOwogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3RpbWVyczsKKwl1bnNpZ25lZCBsb25nIGFsbF90aW1lcnM7CiAJc3RydWN0IHR2ZWNfcm9vdCB0djE7CiAJc3RydWN0IHR2ZWMgdHYyOwogCXN0cnVjdCB0dmVjIHR2MzsKQEAgLTMzNyw2ICszMzgsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNldF90aW1lcl9zbGFjayk7CiAKKy8qCisgKiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgY2F0Y2ggdXAgLT50aW1lcl9qaWZmaWVzIHRvIHRoZSBjdXJyZW50IHRpbWUuCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgdHZlY19iYXNlIGxvY2suICBSZXR1cm5zIHRydWUgaWYgdGhlIGxpc3QKKyAqIHdhcyBlbXB0eSBhbmQgdGhlcmVmb3JlIC0+dGltZXJfamlmZmllcyB3YXMgdXBkYXRlZC4KKyAqLworc3RhdGljIGJvb2wgY2F0Y2h1cF90aW1lcl9qaWZmaWVzKHN0cnVjdCB0dmVjX2Jhc2UgKmJhc2UpCit7CisJaWYgKCFiYXNlLT5hbGxfdGltZXJzKSB7CisJCWJhc2UtPnRpbWVyX2ppZmZpZXMgPSBqaWZmaWVzOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdm9pZAogX19pbnRlcm5hbF9hZGRfdGltZXIoc3RydWN0IHR2ZWNfYmFzZSAqYmFzZSwgc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogewpAQCAtMzgzLDE1ICszOTgsMTcgQEAKIAogc3RhdGljIHZvaWQgaW50ZXJuYWxfYWRkX3RpbWVyKHN0cnVjdCB0dmVjX2Jhc2UgKmJhc2UsIHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKKwkodm9pZCljYXRjaHVwX3RpbWVyX2ppZmZpZXMoYmFzZSk7CiAJX19pbnRlcm5hbF9hZGRfdGltZXIoYmFzZSwgdGltZXIpOwogCS8qCiAJICogVXBkYXRlIGJhc2UtPmFjdGl2ZV90aW1lcnMgYW5kIGJhc2UtPm5leHRfdGltZXIKIAkgKi8KIAlpZiAoIXRiYXNlX2dldF9kZWZlcnJhYmxlKHRpbWVyLT5iYXNlKSkgewotCQlpZiAodGltZV9iZWZvcmUodGltZXItPmV4cGlyZXMsIGJhc2UtPm5leHRfdGltZXIpKQorCQlpZiAoIWJhc2UtPmFjdGl2ZV90aW1lcnMrKyB8fAorCQkgICAgdGltZV9iZWZvcmUodGltZXItPmV4cGlyZXMsIGJhc2UtPm5leHRfdGltZXIpKQogCQkJYmFzZS0+bmV4dF90aW1lciA9IHRpbWVyLT5leHBpcmVzOwotCQliYXNlLT5hY3RpdmVfdGltZXJzKys7CiAJfQorCWJhc2UtPmFsbF90aW1lcnMrKzsKIH0KIAogI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwpAQCAtNjcxLDYgKzY4OCw4IEBACiAJZGV0YWNoX3RpbWVyKHRpbWVyLCB0cnVlKTsKIAlpZiAoIXRiYXNlX2dldF9kZWZlcnJhYmxlKHRpbWVyLT5iYXNlKSkKIAkJYmFzZS0+YWN0aXZlX3RpbWVycy0tOworCWJhc2UtPmFsbF90aW1lcnMtLTsKKwkodm9pZCljYXRjaHVwX3RpbWVyX2ppZmZpZXMoYmFzZSk7CiB9CiAKIHN0YXRpYyBpbnQgZGV0YWNoX2lmX3BlbmRpbmcoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCBzdHJ1Y3QgdHZlY19iYXNlICpiYXNlLApAQCAtNjg1LDYgKzcwNCw4IEBACiAJCWlmICh0aW1lci0+ZXhwaXJlcyA9PSBiYXNlLT5uZXh0X3RpbWVyKQogCQkJYmFzZS0+bmV4dF90aW1lciA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7CiAJfQorCWJhc2UtPmFsbF90aW1lcnMtLTsKKwkodm9pZCljYXRjaHVwX3RpbWVyX2ppZmZpZXMoYmFzZSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTczOSwxMiArNzYwLDcgQEAKIAogCWRlYnVnX2FjdGl2YXRlKHRpbWVyLCBleHBpcmVzKTsKIAotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX05PX0haX0NPTU1PTikgJiYgZGVmaW5lZChDT05GSUdfU01QKQotCWlmICghcGlubmVkICYmIGdldF9zeXNjdGxfdGltZXJfbWlncmF0aW9uKCkgJiYgaWRsZV9jcHUoY3B1KSkKLQkJY3B1ID0gZ2V0X25vaHpfdGltZXJfdGFyZ2V0KCk7Ci0jZW5kaWYKKwljcHUgPSBnZXRfbm9oel90aW1lcl90YXJnZXQocGlubmVkKTsKIAluZXdfYmFzZSA9IHBlcl9jcHUodHZlY19iYXNlcywgY3B1KTsKIAogCWlmIChiYXNlICE9IG5ld19iYXNlKSB7CkBAIC05MzksOCArOTU1LDE1IEBACiAJICogd2l0aCB0aGUgdGltZXIgYnkgaG9sZGluZyB0aGUgdGltZXIgYmFzZSBsb2NrLiBUaGlzIGFsc28KIAkgKiBtYWtlcyBzdXJlIHRoYXQgYSBDUFUgb24gdGhlIHdheSB0byBzdG9wIGl0cyB0aWNrIGNhbiBub3QKIAkgKiBldmFsdWF0ZSB0aGUgdGltZXIgd2hlZWwuCisJICoKKwkgKiBTcGFyZSB0aGUgSVBJIGZvciBkZWZlcnJhYmxlIHRpbWVycyBvbiBpZGxlIHRhcmdldHMgdGhvdWdoLgorCSAqIFRoZSBuZXh0IGJ1c3kgdGlja3Mgd2lsbCB0YWtlIGNhcmUgb2YgaXQuIEV4Y2VwdCBmdWxsIGR5bnRpY2tzCisJICogcmVxdWlyZSBzcGVjaWFsIGNhcmUgYWdhaW5zdCByYWNlcyB3aXRoIGlkbGVfY3B1KCksIGxldHMgZGVhbAorCSAqIHdpdGggdGhhdCBsYXRlci4KIAkgKi8KLQl3YWtlX3VwX25vaHpfY3B1KGNwdSk7CisJaWYgKCF0YmFzZV9nZXRfZGVmZXJyYWJsZSh0aW1lci0+YmFzZSkgfHwgdGlja19ub2h6X2Z1bGxfY3B1KGNwdSkpCisJCXdha2VfdXBfbm9oel9jcHUoY3B1KTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF90aW1lcl9vbik7CkBAIC0xMTQ2LDYgKzExNjksMTAgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXI7CiAKIAlzcGluX2xvY2tfaXJxKCZiYXNlLT5sb2NrKTsKKwlpZiAoY2F0Y2h1cF90aW1lcl9qaWZmaWVzKGJhc2UpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJCXJldHVybjsKKwl9CiAJd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCB3b3JrX2xpc3Q7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmd29ya19saXN0OwpAQCAtMTE2MCw3ICsxMTg3LDcgQEAKIAkJCQkJIWNhc2NhZGUoYmFzZSwgJmJhc2UtPnR2NCwgSU5ERVgoMikpKQogCQkJY2FzY2FkZShiYXNlLCAmYmFzZS0+dHY1LCBJTkRFWCgzKSk7CiAJCSsrYmFzZS0+dGltZXJfamlmZmllczsKLQkJbGlzdF9yZXBsYWNlX2luaXQoYmFzZS0+dHYxLnZlYyArIGluZGV4LCAmd29ya19saXN0KTsKKwkJbGlzdF9yZXBsYWNlX2luaXQoYmFzZS0+dHYxLnZlYyArIGluZGV4LCBoZWFkKTsKIAkJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CiAJCQl2b2lkICgqZm4pKHVuc2lnbmVkIGxvbmcpOwogCQkJdW5zaWduZWQgbG9uZyBkYXRhOwpAQCAtMTUyMyw5ICsxNTUwLDggQEAKIAkJCWlmICghYmFzZSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJLyogTWFrZSBzdXJlIHRoYXQgdHZlY19iYXNlIGlzIDIgYnl0ZSBhbGlnbmVkICovCi0JCQlpZiAodGJhc2VfZ2V0X2RlZmVycmFibGUoYmFzZSkpIHsKLQkJCQlXQVJOX09OKDEpOworCQkJLyogTWFrZSBzdXJlIHR2ZWNfYmFzZSBoYXMgVElNRVJfRkxBR19NQVNLIGJpdHMgZnJlZSAqLworCQkJaWYgKFdBUk5fT04oYmFzZSAhPSB0YmFzZV9nZXRfYmFzZShiYXNlKSkpIHsKIAkJCQlrZnJlZShiYXNlKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KQEAgLTE1NTksNiArMTU4NSw3IEBACiAJYmFzZS0+dGltZXJfamlmZmllcyA9IGppZmZpZXM7CiAJYmFzZS0+bmV4dF90aW1lciA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7CiAJYmFzZS0+YWN0aXZlX3RpbWVycyA9IDA7CisJYmFzZS0+YWxsX3RpbWVycyA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NDgsOSArMTY3NSw5IEBACiAKIAllcnIgPSB0aW1lcl9jcHVfbm90aWZ5KCZ0aW1lcnNfbmIsICh1bnNpZ25lZCBsb25nKUNQVV9VUF9QUkVQQVJFLAogCQkJICAgICAgICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpbml0X3RpbWVyX3N0YXRzKCk7Ci0KIAlCVUdfT04oZXJyICE9IE5PVElGWV9PSyk7CisKKwlpbml0X3RpbWVyX3N0YXRzKCk7CiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZ0aW1lcnNfbmIpOwogCW9wZW5fc29mdGlycShUSU1FUl9TT0ZUSVJRLCBydW5fdGltZXJfc29mdGlycSk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdG9ydHVyZS5jIGIva2VybmVsL3RvcnR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M5YWZjCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RvcnR1cmUuYwpAQCAtMCwwICsxLDcxOSBAQAorLyoKKyAqIENvbW1vbiBmdW5jdGlvbnMgZm9yIGluLWtlcm5lbCB0b3J0dXJlIHRlc3RzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDE0CisgKgorICogQXV0aG9yOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQHVzLmlibS5jb20+CisgKglCYXNlZCBvbiBrZXJuZWwvcmN1L3RvcnR1cmUuYy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlX2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RvcnR1cmUuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0B1cy5pYm0uY29tPiIpOworCitzdGF0aWMgY2hhciAqdG9ydHVyZV90eXBlOworc3RhdGljIGJvb2wgdmVyYm9zZTsKKworLyogTWVkaWF0ZSBybW1vZCBhbmQgc3lzdGVtIHNodXRkb3duLiAgQ29uY3VycmVudCBybW1vZCAmIHNodXRkb3duIGlsbGVnYWwhICovCisjZGVmaW5lIEZVTExTVE9QX0RPTlRTVE9QIDAJLyogTm9ybWFsIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgRlVMTFNUT1BfU0hVVERPV04gMQkvKiBTeXN0ZW0gc2h1dGRvd24gd2l0aCB0b3J0dXJlIHJ1bm5pbmcuICovCisjZGVmaW5lIEZVTExTVE9QX1JNTU9EICAgIDIJLyogTm9ybWFsIHJtbW9kIG9mIHRvcnR1cmUuICovCitzdGF0aWMgaW50IGZ1bGxzdG9wID0gRlVMTFNUT1BfUk1NT0Q7CitzdGF0aWMgREVGSU5FX01VVEVYKGZ1bGxzdG9wX211dGV4KTsKK3N0YXRpYyBpbnQgKnRvcnR1cmVfcnVubmFibGU7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworLyoKKyAqIFZhcmlhYmxlcyBmb3Igb25saW5lLW9mZmxpbmUgaGFuZGxpbmcuICBPbmx5IHByZXNlbnQgaWYgQ1BVIGhvdHBsdWcKKyAqIGlzIGVuYWJsZWQsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcuCisgKi8KKworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqb25vZmZfdGFzazsKK3N0YXRpYyBsb25nIG9ub2ZmX2hvbGRvZmY7CitzdGF0aWMgbG9uZyBvbm9mZl9pbnRlcnZhbDsKK3N0YXRpYyBsb25nIG5fb2ZmbGluZV9hdHRlbXB0czsKK3N0YXRpYyBsb25nIG5fb2ZmbGluZV9zdWNjZXNzZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdW1fb2ZmbGluZTsKK3N0YXRpYyBpbnQgbWluX29mZmxpbmUgPSAtMTsKK3N0YXRpYyBpbnQgbWF4X29mZmxpbmU7CitzdGF0aWMgbG9uZyBuX29ubGluZV9hdHRlbXB0czsKK3N0YXRpYyBsb25nIG5fb25saW5lX3N1Y2Nlc3NlczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1bV9vbmxpbmU7CitzdGF0aWMgaW50IG1pbl9vbmxpbmUgPSAtMTsKK3N0YXRpYyBpbnQgbWF4X29ubGluZTsKKworLyoKKyAqIEV4ZWN1dGUgcmFuZG9tIENQVS1ob3RwbHVnIG9wZXJhdGlvbnMgYXQgdGhlIGludGVydmFsIHNwZWNpZmllZAorICogYnkgdGhlIG9ub2ZmX2ludGVydmFsLgorICovCitzdGF0aWMgaW50Cit0b3J0dXJlX29ub2ZmKHZvaWQgKmFyZykKK3sKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgZGVsdGE7CisJaW50IG1heGNwdSA9IC0xOworCURFRklORV9UT1JUVVJFX1JBTkRPTShyYW5kKTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc3RhcnR0aW1lOworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX29ub2ZmIHRhc2sgc3RhcnRlZCIpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQltYXhjcHUgPSBjcHU7CisJV0FSTl9PTihtYXhjcHUgPCAwKTsKKwlpZiAob25vZmZfaG9sZG9mZiA+IDApIHsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX29ub2ZmIGJlZ2luIGhvbGRvZmYiKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG9ub2ZmX2hvbGRvZmYpOworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInRvcnR1cmVfb25vZmYgZW5kIGhvbGRvZmYiKTsKKwl9CisJd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKSB7CisJCWNwdSA9ICh0b3J0dXJlX3JhbmRvbSgmcmFuZCkgPj4gNCkgJSAobWF4Y3B1ICsgMSk7CisJCWlmIChjcHVfb25saW5lKGNwdSkgJiYgY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkgInRvcnR1cmVfb25vZmYgdGFzazogb2ZmbGluaW5nICVkXG4iLAorCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUpOworCQkJc3RhcnR0aW1lID0gamlmZmllczsKKwkJCW5fb2ZmbGluZV9hdHRlbXB0cysrOworCQkJcmV0ID0gY3B1X2Rvd24oY3B1KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKKwkJCQkJCSAidG9ydHVyZV9vbm9mZiB0YXNrOiBvZmZsaW5lICVkIGZhaWxlZDogZXJybm8gJWRcbiIsCisJCQkJCQkgdG9ydHVyZV90eXBlLCBjcHUsIHJldCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkJICJ0b3J0dXJlX29ub2ZmIHRhc2s6IG9mZmxpbmVkICVkXG4iLAorCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKKwkJCQluX29mZmxpbmVfc3VjY2Vzc2VzKys7CisJCQkJZGVsdGEgPSBqaWZmaWVzIC0gc3RhcnR0aW1lOworCQkJCXN1bV9vZmZsaW5lICs9IGRlbHRhOworCQkJCWlmIChtaW5fb2ZmbGluZSA8IDApIHsKKwkJCQkJbWluX29mZmxpbmUgPSBkZWx0YTsKKwkJCQkJbWF4X29mZmxpbmUgPSBkZWx0YTsKKwkJCQl9CisJCQkJaWYgKG1pbl9vZmZsaW5lID4gZGVsdGEpCisJCQkJCW1pbl9vZmZsaW5lID0gZGVsdGE7CisJCQkJaWYgKG1heF9vZmZsaW5lIDwgZGVsdGEpCisJCQkJCW1heF9vZmZsaW5lID0gZGVsdGE7CisJCQl9CisJCX0gZWxzZSBpZiAoY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkgInRvcnR1cmVfb25vZmYgdGFzazogb25saW5pbmcgJWRcbiIsCisJCQkJCSB0b3J0dXJlX3R5cGUsIGNwdSk7CisJCQlzdGFydHRpbWUgPSBqaWZmaWVzOworCQkJbl9vbmxpbmVfYXR0ZW1wdHMrKzsKKwkJCXJldCA9IGNwdV91cChjcHUpOworCQkJaWYgKHJldCkgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkJICJ0b3J0dXJlX29ub2ZmIHRhc2s6IG9ubGluZSAlZCBmYWlsZWQ6IGVycm5vICVkXG4iLAorCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1LCByZXQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKKwkJCQkJCSAidG9ydHVyZV9vbm9mZiB0YXNrOiBvbmxpbmVkICVkXG4iLAorCQkJCQkJIHRvcnR1cmVfdHlwZSwgY3B1KTsKKwkJCQluX29ubGluZV9zdWNjZXNzZXMrKzsKKwkJCQlkZWx0YSA9IGppZmZpZXMgLSBzdGFydHRpbWU7CisJCQkJc3VtX29ubGluZSArPSBkZWx0YTsKKwkJCQlpZiAobWluX29ubGluZSA8IDApIHsKKwkJCQkJbWluX29ubGluZSA9IGRlbHRhOworCQkJCQltYXhfb25saW5lID0gZGVsdGE7CisJCQkJfQorCQkJCWlmIChtaW5fb25saW5lID4gZGVsdGEpCisJCQkJCW1pbl9vbmxpbmUgPSBkZWx0YTsKKwkJCQlpZiAobWF4X29ubGluZSA8IGRlbHRhKQorCQkJCQltYXhfb25saW5lID0gZGVsdGE7CisJCQl9CisJCX0KKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG9ub2ZmX2ludGVydmFsKTsKKwl9CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJ0b3J0dXJlX29ub2ZmIik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCisKKy8qCisgKiBJbml0aWF0ZSBvbmxpbmUtb2ZmbGluZSBoYW5kbGluZy4KKyAqLworaW50IHRvcnR1cmVfb25vZmZfaW5pdChsb25nIG9vaG9sZG9mZiwgbG9uZyBvb2ludGVydmFsKQoreworCWludCByZXQgPSAwOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJb25vZmZfaG9sZG9mZiA9IG9vaG9sZG9mZjsKKwlvbm9mZl9pbnRlcnZhbCA9IG9vaW50ZXJ2YWw7CisJaWYgKG9ub2ZmX2ludGVydmFsIDw9IDApCisJCXJldHVybiAwOworCXJldCA9IHRvcnR1cmVfY3JlYXRlX2t0aHJlYWQodG9ydHVyZV9vbm9mZiwgTlVMTCwgb25vZmZfdGFzayk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX29ub2ZmX2luaXQpOworCisvKgorICogQ2xlYW4gdXAgYWZ0ZXIgb25saW5lL29mZmxpbmUgdGVzdGluZy4KKyAqLworc3RhdGljIHZvaWQgdG9ydHVyZV9vbm9mZl9jbGVhbnVwKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJaWYgKG9ub2ZmX3Rhc2sgPT0gTlVMTCkKKwkJcmV0dXJuOworCVZFUkJPU0VfVE9ST1VUX1NUUklORygiU3RvcHBpbmcgdG9ydHVyZV9vbm9mZiB0YXNrIik7CisJa3RocmVhZF9zdG9wKG9ub2ZmX3Rhc2spOworCW9ub2ZmX3Rhc2sgPSBOVUxMOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfb25vZmZfY2xlYW51cCk7CisKKy8qCisgKiBQcmludCBvbmxpbmUvb2ZmbGluZSB0ZXN0aW5nIHN0YXRpc3RpY3MuCisgKi8KK2NoYXIgKnRvcnR1cmVfb25vZmZfc3RhdHMoY2hhciAqcGFnZSkKK3sKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlwYWdlICs9IHNwcmludGYocGFnZSwKKwkJICAgICAgICJvbm9mZjogJWxkLyVsZDolbGQvJWxkICVkLCVkOiVkLCVkICVsdTolbHUgKEhaPSVkKSAiLAorCQkgICAgICAgbl9vbmxpbmVfc3VjY2Vzc2VzLCBuX29ubGluZV9hdHRlbXB0cywKKwkJICAgICAgIG5fb2ZmbGluZV9zdWNjZXNzZXMsIG5fb2ZmbGluZV9hdHRlbXB0cywKKwkJICAgICAgIG1pbl9vbmxpbmUsIG1heF9vbmxpbmUsCisJCSAgICAgICBtaW5fb2ZmbGluZSwgbWF4X29mZmxpbmUsCisJCSAgICAgICBzdW1fb25saW5lLCBzdW1fb2ZmbGluZSwgSFopOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwlyZXR1cm4gcGFnZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfb25vZmZfc3RhdHMpOworCisvKgorICogV2VyZSBhbGwgdGhlIG9ubGluZS9vZmZsaW5lIG9wZXJhdGlvbnMgc3VjY2Vzc2Z1bD8KKyAqLworYm9vbCB0b3J0dXJlX29ub2ZmX2ZhaWx1cmVzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJcmV0dXJuIG5fb25saW5lX3N1Y2Nlc3NlcyAhPSBuX29ubGluZV9hdHRlbXB0cyB8fAorCSAgICAgICBuX29mZmxpbmVfc3VjY2Vzc2VzICE9IG5fb2ZmbGluZV9hdHRlbXB0czsKKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9vbm9mZl9mYWlsdXJlcyk7CisKKyNkZWZpbmUgVE9SVFVSRV9SQU5ET01fTVVMVAkzOTkxNjgwMSAgLyogcHJpbWUgKi8KKyNkZWZpbmUgVE9SVFVSRV9SQU5ET01fQURECTQ3OTAwMTcwMSAvKiBwcmltZSAqLworI2RlZmluZSBUT1JUVVJFX1JBTkRPTV9SRUZSRVNICTEwMDAwCisKKy8qCisgKiBDcnVkZSBidXQgZmFzdCByYW5kb20tbnVtYmVyIGdlbmVyYXRvci4gIFVzZXMgYSBsaW5lYXIgY29uZ3J1ZW50aWFsCisgKiBnZW5lcmF0b3IsIHdpdGggb2NjYXNpb25hbCBoZWxwIGZyb20gY3B1X2Nsb2NrKCkuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RvcnR1cmVfcmFuZG9tKHN0cnVjdCB0b3J0dXJlX3JhbmRvbV9zdGF0ZSAqdHJzcCkKK3sKKwlpZiAoLS10cnNwLT50cnNfY291bnQgPCAwKSB7CisJCXRyc3AtPnRyc19zdGF0ZSArPSAodW5zaWduZWQgbG9uZylsb2NhbF9jbG9jaygpOworCQl0cnNwLT50cnNfY291bnQgPSBUT1JUVVJFX1JBTkRPTV9SRUZSRVNIOworCX0KKwl0cnNwLT50cnNfc3RhdGUgPSB0cnNwLT50cnNfc3RhdGUgKiBUT1JUVVJFX1JBTkRPTV9NVUxUICsKKwkJVE9SVFVSRV9SQU5ET01fQUREOworCXJldHVybiBzd2FodzMyKHRyc3AtPnRyc19zdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3JhbmRvbSk7CisKKy8qCisgKiBWYXJpYWJsZXMgZm9yIHNodWZmbGluZy4gIFRoZSBpZGVhIGlzIHRvIGVuc3VyZSB0aGF0IGVhY2ggQ1BVIHN0YXlzCisgKiBpZGxlIGZvciBhbiBleHRlbmRlZCBwZXJpb2QgdG8gdGVzdCBpbnRlcmFjdGlvbnMgd2l0aCBkeW50aWNrIGlkbGUsCisgKiBhcyB3ZWxsIGFzIGludGVyYWN0aW9ucyB3aXRoIGFueSBwZXItQ1BVIHZhcmlibGVzLgorICovCitzdHJ1Y3Qgc2h1ZmZsZV90YXNrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0X2w7CisJc3RydWN0IHRhc2tfc3RydWN0ICpzdF90OworfTsKKworc3RhdGljIGxvbmcgc2h1ZmZsZV9pbnRlcnZhbDsJLyogSW4gamlmZmllcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNodWZmbGVyX3Rhc2s7CitzdGF0aWMgY3B1bWFza192YXJfdCBzaHVmZmxlX3RtcF9tYXNrOworc3RhdGljIGludCBzaHVmZmxlX2lkbGVfY3B1OwkvKiBGb3JjZSBhbGwgdG9ydHVyZSB0YXNrcyBvZmYgdGhpcyBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNodWZmbGVfdGFza19saXN0ID0gTElTVF9IRUFEX0lOSVQoc2h1ZmZsZV90YXNrX2xpc3QpOworc3RhdGljIERFRklORV9NVVRFWChzaHVmZmxlX3Rhc2tfbXV0ZXgpOworCisvKgorICogUmVnaXN0ZXIgYSB0YXNrIHRvIGJlIHNodWZmbGVkLiAgSWYgdGhlcmUgaXMgbm8gbWVtb3J5LCBqdXN0IHNwbGF0CisgKiBhbmQgZG9uJ3QgYm90aGVyIHJlZ2lzdGVyaW5nLgorICovCit2b2lkIHRvcnR1cmVfc2h1ZmZsZV90YXNrX3JlZ2lzdGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHApCit7CisJc3RydWN0IHNodWZmbGVfdGFzayAqc3RwOworCisJaWYgKFdBUk5fT05fT05DRSh0cCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCXN0cCA9IGttYWxsb2Moc2l6ZW9mKCpzdHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoV0FSTl9PTl9PTkNFKHN0cCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCXN0cC0+c3RfdCA9IHRwOworCW11dGV4X2xvY2soJnNodWZmbGVfdGFza19tdXRleCk7CisJbGlzdF9hZGQoJnN0cC0+c3RfbCwgJnNodWZmbGVfdGFza19saXN0KTsKKwltdXRleF91bmxvY2soJnNodWZmbGVfdGFza19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodWZmbGVfdGFza19yZWdpc3Rlcik7CisKKy8qCisgKiBVbnJlZ2lzdGVyIGFsbCB0YXNrcywgZm9yIGV4YW1wbGUsIGF0IHRoZSBlbmQgb2YgdGhlIHRvcnR1cmUgcnVuLgorICovCitzdGF0aWMgdm9pZCB0b3J0dXJlX3NodWZmbGVfdGFza191bnJlZ2lzdGVyX2FsbCh2b2lkKQoreworCXN0cnVjdCBzaHVmZmxlX3Rhc2sgKnN0cDsKKwlzdHJ1Y3Qgc2h1ZmZsZV90YXNrICpwOworCisJbXV0ZXhfbG9jaygmc2h1ZmZsZV90YXNrX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3RwLCBwLCAmc2h1ZmZsZV90YXNrX2xpc3QsIHN0X2wpIHsKKwkJbGlzdF9kZWwoJnN0cC0+c3RfbCk7CisJCWtmcmVlKHN0cCk7CisJfQorCW11dGV4X3VubG9jaygmc2h1ZmZsZV90YXNrX211dGV4KTsKK30KKworLyogU2h1ZmZsZSB0YXNrcyBzdWNoIHRoYXQgd2UgYWxsb3cgc2h1ZmZsZV9pZGxlX2NwdSB0byBiZWNvbWUgaWRsZS4KKyAqIEEgc3BlY2lhbCBjYXNlIGlzIHdoZW4gc2h1ZmZsZV9pZGxlX2NwdSA9IC0xLCBpbiB3aGljaCBjYXNlIHdlIGFsbG93CisgKiB0aGUgdGFza3MgdG8gcnVuIG9uIGFsbCBDUFVzLgorICovCitzdGF0aWMgdm9pZCB0b3J0dXJlX3NodWZmbGVfdGFza3Modm9pZCkKK3sKKwlzdHJ1Y3Qgc2h1ZmZsZV90YXNrICpzdHA7CisKKwljcHVtYXNrX3NldGFsbChzaHVmZmxlX3RtcF9tYXNrKTsKKwlnZXRfb25saW5lX2NwdXMoKTsKKworCS8qIE5vIHBvaW50IGluIHNodWZmbGluZyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBvbmxpbmUgQ1BVIChleDogVVApICovCisJaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpIHsKKwkJcHV0X29ubGluZV9jcHVzKCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IENQVS4gIFVwb24gb3ZlcmZsb3csIGRvbid0IGlkbGUgYW55IENQVXMuICovCisJc2h1ZmZsZV9pZGxlX2NwdSA9IGNwdW1hc2tfbmV4dChzaHVmZmxlX2lkbGVfY3B1LCBzaHVmZmxlX3RtcF9tYXNrKTsKKwlpZiAoc2h1ZmZsZV9pZGxlX2NwdSA+PSBucl9jcHVfaWRzKQorCQlzaHVmZmxlX2lkbGVfY3B1ID0gLTE7CisJaWYgKHNodWZmbGVfaWRsZV9jcHUgIT0gLTEpIHsKKwkJY3B1bWFza19jbGVhcl9jcHUoc2h1ZmZsZV9pZGxlX2NwdSwgc2h1ZmZsZV90bXBfbWFzayk7CisJCWlmIChjcHVtYXNrX2VtcHR5KHNodWZmbGVfdG1wX21hc2spKSB7CisJCQlwdXRfb25saW5lX2NwdXMoKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW11dGV4X2xvY2soJnNodWZmbGVfdGFza19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHAsICZzaHVmZmxlX3Rhc2tfbGlzdCwgc3RfbCkKKwkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoc3RwLT5zdF90LCBzaHVmZmxlX3RtcF9tYXNrKTsKKwltdXRleF91bmxvY2soJnNodWZmbGVfdGFza19tdXRleCk7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKK30KKworLyogU2h1ZmZsZSB0YXNrcyBhY3Jvc3MgQ1BVcywgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIGVhY2ggQ1BVIGluIHRoZQorICogc3lzdGVtIHRvIGJlY29tZSBpZGxlIGF0IGEgdGltZSBhbmQgY3V0IG9mZiBpdHMgdGltZXIgdGlja3MuIFRoaXMgaXMgbWVhbnQKKyAqIHRvIHRlc3QgdGhlIHN1cHBvcnQgZm9yIHN1Y2ggdGlja2xlc3MgaWRsZSBDUFUgaW4gUkNVLgorICovCitzdGF0aWMgaW50IHRvcnR1cmVfc2h1ZmZsZSh2b2lkICphcmcpCit7CisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3NodWZmbGUgdGFzayBzdGFydGVkIik7CisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2h1ZmZsZV9pbnRlcnZhbCk7CisJCXRvcnR1cmVfc2h1ZmZsZV90YXNrcygpOworCQl0b3J0dXJlX3NodXRkb3duX2Fic29yYigidG9ydHVyZV9zaHVmZmxlIik7CisJfSB3aGlsZSAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpOworCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygidG9ydHVyZV9zaHVmZmxlIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGFydCB0aGUgc2h1ZmZsZXIsIHdpdGggc2h1ZmZpbnQgaW4gamlmZmllcy4KKyAqLworaW50IHRvcnR1cmVfc2h1ZmZsZV9pbml0KGxvbmcgc2h1ZmZpbnQpCit7CisJc2h1ZmZsZV9pbnRlcnZhbCA9IHNodWZmaW50OworCisJc2h1ZmZsZV9pZGxlX2NwdSA9IC0xOworCisJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigmc2h1ZmZsZV90bXBfbWFzaywgR0ZQX0tFUk5FTCkpIHsKKwkJVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKCJGYWlsZWQgdG8gYWxsb2MgbWFzayIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIHNodWZmbGVyIHRocmVhZCAqLworCXJldHVybiB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHRvcnR1cmVfc2h1ZmZsZSwgTlVMTCwgc2h1ZmZsZXJfdGFzayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodWZmbGVfaW5pdCk7CisKKy8qCisgKiBTdG9wIHRoZSBzaHVmZmxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHRvcnR1cmVfc2h1ZmZsZV9jbGVhbnVwKHZvaWQpCit7CisJdG9ydHVyZV9zaHVmZmxlX3Rhc2tfdW5yZWdpc3Rlcl9hbGwoKTsKKwlpZiAoc2h1ZmZsZXJfdGFzaykgeworCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoIlN0b3BwaW5nIHRvcnR1cmVfc2h1ZmZsZSB0YXNrIik7CisJCWt0aHJlYWRfc3RvcChzaHVmZmxlcl90YXNrKTsKKwkJZnJlZV9jcHVtYXNrX3ZhcihzaHVmZmxlX3RtcF9tYXNrKTsKKwl9CisJc2h1ZmZsZXJfdGFzayA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodWZmbGVfY2xlYW51cCk7CisKKy8qCisgKiBWYXJpYWJsZXMgZm9yIGF1dG8tc2h1dGRvd24uICBUaGlzIGFsbG93cyAibGlnaHRzIG91dCIgdG9ydHVyZSBydW5zCisgKiB0byBiZSBmdWxseSBzY3JpcHRlZC4KKyAqLworc3RhdGljIGludCBzaHV0ZG93bl9zZWNzOwkJLyogZGVzaXJlZCB0ZXN0IGR1cmF0aW9uIGluIHNlY29uZHMuICovCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzaHV0ZG93bl90YXNrOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2h1dGRvd25fdGltZTsJLyogamlmZmllcyB0byBzeXN0ZW0gc2h1dGRvd24uICovCitzdGF0aWMgdm9pZCAoKnRvcnR1cmVfc2h1dGRvd25faG9vaykodm9pZCk7CisKKy8qCisgKiBBYnNvcmIga3RocmVhZHMgaW50byBhIGtlcm5lbCBmdW5jdGlvbiB0aGF0IHdvbid0IHJldHVybiwgc28gdGhhdAorICogdGhleSB3b24ndCBldmVyIGFjY2VzcyBtb2R1bGUgdGV4dCBvciBkYXRhIGFnYWluLgorICovCit2b2lkIHRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKGNvbnN0IGNoYXIgKnRpdGxlKQoreworCXdoaWxlIChBQ0NFU1NfT05DRShmdWxsc3RvcCkgPT0gRlVMTFNUT1BfU0hVVERPV04pIHsKKwkJcHJfbm90aWNlKCJ0b3J0dXJlIHRocmVhZCAlcyBwYXJraW5nIGR1ZSB0byBzeXN0ZW0gc2h1dGRvd25cbiIsCisJCQkgIHRpdGxlKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKTsKKworLyoKKyAqIENhdXNlIHRoZSB0b3J0dXJlIHRlc3QgdG8gc2h1dGRvd24gdGhlIHN5c3RlbSBhZnRlciB0aGUgdGVzdCBoYXMKKyAqIHJ1biBmb3IgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5IHRoZSBzaHV0ZG93bl9zZWNzIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCB0b3J0dXJlX3NodXRkb3duKHZvaWQgKmFyZykKK3sKKwlsb25nIGRlbHRhOworCXVuc2lnbmVkIGxvbmcgamlmZmllc19zbmFwOworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3NodXRkb3duIHRhc2sgc3RhcnRlZCIpOworCWppZmZpZXNfc25hcCA9IGppZmZpZXM7CisJd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzX3NuYXAsIHNodXRkb3duX3RpbWUpICYmCisJICAgICAgICF0b3J0dXJlX211c3Rfc3RvcCgpKSB7CisJCWRlbHRhID0gc2h1dGRvd25fdGltZSAtIGppZmZpZXNfc25hcDsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkJCSAidG9ydHVyZV9zaHV0ZG93biB0YXNrOiAlbHUgamlmZmllcyByZW1haW5pbmdcbiIsCisJCQkJIHRvcnR1cmVfdHlwZSwgZGVsdGEpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZGVsdGEpOworCQlqaWZmaWVzX3NuYXAgPSBqaWZmaWVzOworCX0KKwlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkgeworCQl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInRvcnR1cmVfc2h1dGRvd24iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT0ssIHNodXQgZG93biB0aGUgc3lzdGVtLiAqLworCisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3NodXRkb3duIHRhc2sgc2h1dHRpbmcgZG93biBzeXN0ZW0iKTsKKwlzaHV0ZG93bl90YXNrID0gTlVMTDsJLyogQXZvaWQgc2VsZi1raWxsIGRlYWRsb2NrLiAqLworCWlmICh0b3J0dXJlX3NodXRkb3duX2hvb2spCisJCXRvcnR1cmVfc2h1dGRvd25faG9vaygpOworCWVsc2UKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJObyB0b3J0dXJlX3NodXRkb3duX2hvb2soKSwgc2tpcHBpbmcuIik7CisJa2VybmVsX3Bvd2VyX29mZigpOwkvKiBTaHV0IGRvd24gdGhlIHN5c3RlbS4gKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YXJ0IHVwIHRoZSBzaHV0ZG93biB0YXNrLgorICovCitpbnQgdG9ydHVyZV9zaHV0ZG93bl9pbml0KGludCBzc2Vjcywgdm9pZCAoKmNsZWFudXApKHZvaWQpKQoreworCWludCByZXQgPSAwOworCisJc2h1dGRvd25fc2VjcyA9IHNzZWNzOworCXRvcnR1cmVfc2h1dGRvd25faG9vayA9IGNsZWFudXA7CisJaWYgKHNodXRkb3duX3NlY3MgPiAwKSB7CisJCXNodXRkb3duX3RpbWUgPSBqaWZmaWVzICsgc2h1dGRvd25fc2VjcyAqIEhaOworCQlyZXQgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHRvcnR1cmVfc2h1dGRvd24sIE5VTEwsCisJCQkJCSAgICAgc2h1dGRvd25fdGFzayk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX3NodXRkb3duX2luaXQpOworCisvKgorICogRGV0ZWN0IGFuZCByZXNwb25kIHRvIGEgc3lzdGVtIHNodXRkb3duLgorICovCitzdGF0aWMgaW50IHRvcnR1cmVfc2h1dGRvd25fbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkMSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHVudXNlZDIsIHZvaWQgKnVudXNlZDMpCit7CisJbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOworCWlmIChBQ0NFU1NfT05DRShmdWxsc3RvcCkgPT0gRlVMTFNUT1BfRE9OVFNUT1ApIHsKKwkJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJVbnNjaGVkdWxlZCBzeXN0ZW0gc2h1dGRvd24gZGV0ZWN0ZWQiKTsKKwkJQUNDRVNTX09OQ0UoZnVsbHN0b3ApID0gRlVMTFNUT1BfU0hVVERPV047CisJfSBlbHNlIHsKKwkJcHJfd2FybigiQ29uY3VycmVudCBybW1vZCBhbmQgc2h1dGRvd24gaWxsZWdhbCFcbiIpOworCX0KKwltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdG9ydHVyZV9zaHV0ZG93bl9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHRvcnR1cmVfc2h1dGRvd25fbm90aWZ5LAorfTsKKworLyoKKyAqIFNodXQgZG93biB0aGUgc2h1dGRvd24gdGFzay4gIFNheSB3aGF0Pz8/ICBIZWghICBUaGlzIGNhbiBoYXBwZW4gaWYKKyAqIHRoZSB0b3J0dXJlIG1vZHVsZSBnZXRzIGFuIHJtbW9kIGJlZm9yZSB0aGUgc2h1dGRvd24gdGltZSBhcnJpdmVzLiAgOy0pCisgKi8KK3N0YXRpYyB2b2lkIHRvcnR1cmVfc2h1dGRvd25fY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ0b3J0dXJlX3NodXRkb3duX25iKTsKKwlpZiAoc2h1dGRvd25fdGFzayAhPSBOVUxMKSB7CisJCVZFUkJPU0VfVE9ST1VUX1NUUklORygiU3RvcHBpbmcgdG9ydHVyZV9zaHV0ZG93biB0YXNrIik7CisJCWt0aHJlYWRfc3RvcChzaHV0ZG93bl90YXNrKTsKKwl9CisJc2h1dGRvd25fdGFzayA9IE5VTEw7Cit9CisKKy8qCisgKiBWYXJpYWJsZXMgZm9yIHN0dXR0ZXJpbmcsIHdoaWNoIG1lYW5zIHRvIHBlcmlvZGljYWxseSBwYXVzZSBhbmQKKyAqIHJlc3RhcnQgdGVzdGluZyBpbiBvcmRlciB0byBjYXRjaCBidWdzIHRoYXQgYXBwZWFyIHdoZW4gbG9hZCBpcworICogc3VkZGVubHkgYXBwbGllZCB0byBvciByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3R1dHRlcl90YXNrOworc3RhdGljIGludCBzdHV0dGVyX3BhdXNlX3Rlc3Q7CitzdGF0aWMgaW50IHN0dXR0ZXI7CisKKy8qCisgKiBCbG9jayB1bnRpbCB0aGUgc3R1dHRlciBpbnRlcnZhbCBlbmRzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkKKyAqIGJ5IGFsbCBydW5uaW5nIGt0aHJlYWRzIHRoYXQgbmVlZCB0byBiZSBzdWJqZWN0IHRvIHN0dXR0ZXJpbmcuCisgKi8KK3ZvaWQgc3R1dHRlcl93YWl0KGNvbnN0IGNoYXIgKnRpdGxlKQoreworCXdoaWxlIChBQ0NFU1NfT05DRShzdHV0dGVyX3BhdXNlX3Rlc3QpIHx8CisJICAgICAgICh0b3J0dXJlX3J1bm5hYmxlICYmICFBQ0NFU1NfT05DRSgqdG9ydHVyZV9ydW5uYWJsZSkpKSB7CisJCWlmIChzdHV0dGVyX3BhdXNlX3Rlc3QpCisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CisJCWVsc2UKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKHRpdGxlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHV0dGVyX3dhaXQpOworCisvKgorICogQ2F1c2UgdGhlIHRvcnR1cmUgdGVzdCB0byAic3R1dHRlciIsIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBhbGwKKyAqIHRocmVhZHMgcGVyaW9kaWNhbGx5LgorICovCitzdGF0aWMgaW50IHRvcnR1cmVfc3R1dHRlcih2b2lkICphcmcpCit7CisJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3N0dXR0ZXIgdGFzayBzdGFydGVkIik7CisJZG8geworCQlpZiAoIXRvcnR1cmVfbXVzdF9zdG9wKCkpIHsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzdHV0dGVyKTsKKwkJCUFDQ0VTU19PTkNFKHN0dXR0ZXJfcGF1c2VfdGVzdCkgPSAxOworCQl9CisJCWlmICghdG9ydHVyZV9tdXN0X3N0b3AoKSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzdHV0dGVyKTsKKwkJQUNDRVNTX09OQ0Uoc3R1dHRlcl9wYXVzZV90ZXN0KSA9IDA7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJ0b3J0dXJlX3N0dXR0ZXIiKTsKKwl9IHdoaWxlICghdG9ydHVyZV9tdXN0X3N0b3AoKSk7CisJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJ0b3J0dXJlX3N0dXR0ZXIiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYW5kIGtpY2sgb2ZmIHRoZSB0b3J0dXJlX3N0dXR0ZXIga3RocmVhZC4KKyAqLworaW50IHRvcnR1cmVfc3R1dHRlcl9pbml0KGludCBzKQoreworCWludCByZXQ7CisKKwlzdHV0dGVyID0gczsKKwlyZXQgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHRvcnR1cmVfc3R1dHRlciwgTlVMTCwgc3R1dHRlcl90YXNrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9zdHV0dGVyX2luaXQpOworCisvKgorICogQ2xlYW51cCBhZnRlciB0aGUgdG9ydHVyZV9zdHV0dGVyIGt0aHJlYWQuCisgKi8KK3N0YXRpYyB2b2lkIHRvcnR1cmVfc3R1dHRlcl9jbGVhbnVwKHZvaWQpCit7CisJaWYgKCFzdHV0dGVyX3Rhc2spCisJCXJldHVybjsKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoIlN0b3BwaW5nIHRvcnR1cmVfc3R1dHRlciB0YXNrIik7CisJa3RocmVhZF9zdG9wKHN0dXR0ZXJfdGFzayk7CisJc3R1dHRlcl90YXNrID0gTlVMTDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdG9ydHVyZSBtb2R1bGUuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgLW5vdC0gaW52b2tlZCB2aWEKKyAqIHRoZSB1c3VhbCBtb2R1bGVfaW5pdCgpIG1lY2hhbmlzbSwgYnV0IHJhdGhlciBieSBhbiBleHBsaWNpdCBjYWxsIGZyb20KKyAqIHRoZSBjbGllbnQgdG9ydHVyZSBtb2R1bGUuICBUaGlzIGNhbGwgbXVzdCBiZSBwYWlyZWQgd2l0aCBhIGxhdGVyCisgKiB0b3J0dXJlX2luaXRfZW5kKCkuCisgKgorICogVGhlIHJ1bm5hYmxlIHBhcmFtZXRlciBwb2ludHMgdG8gYSBmbGFnIHRoYXQgY29udHJvbHMgd2hldGhlciBvciBub3QKKyAqIHRoZSB0ZXN0IGlzIGN1cnJlbnRseSBydW5uYWJsZS4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggZmxhZywgcGFzcyBpbiBOVUxMLgorICovCit2b2lkIF9faW5pdCB0b3J0dXJlX2luaXRfYmVnaW4oY2hhciAqdHR5cGUsIGJvb2wgdiwgaW50ICpydW5uYWJsZSkKK3sKKwltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJdG9ydHVyZV90eXBlID0gdHR5cGU7CisJdmVyYm9zZSA9IHY7CisJdG9ydHVyZV9ydW5uYWJsZSA9IHJ1bm5hYmxlOworCWZ1bGxzdG9wID0gRlVMTFNUT1BfRE9OVFNUT1A7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfaW5pdF9iZWdpbik7CisKKy8qCisgKiBUZWxsIHRoZSB0b3J0dXJlIG1vZHVsZSB0aGF0IGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLgorICovCit2b2lkIF9faW5pdCB0b3J0dXJlX2luaXRfZW5kKHZvaWQpCit7CisJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ0b3J0dXJlX3NodXRkb3duX25iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRvcnR1cmVfaW5pdF9lbmQpOworCisvKgorICogQ2xlYW4gdXAgdG9ydHVyZSBtb2R1bGUuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgLW5vdC0gaW52b2tlZCB2aWEKKyAqIHRoZSB1c3VhbCBtb2R1bGVfZXhpdCgpIG1lY2hhbmlzbSwgYnV0IHJhdGhlciBieSBhbiBleHBsaWNpdCBjYWxsIGZyb20KKyAqIHRoZSBjbGllbnQgdG9ydHVyZSBtb2R1bGUuICBSZXR1cm5zIHRydWUgaWYgYSByYWNlIHdpdGggc3lzdGVtIHNodXRkb3duCisgKiBpcyBkZXRlY3RlZCwgb3RoZXJ3aXNlLCBhbGwga3RocmVhZHMgc3RhcnRlZCBieSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlCisgKiB3aWxsIGJlIHNodXQgZG93bi4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbGVyIHN0YXJ0cyBzaHV0dGluZyBkb3duIGl0cyBvd24KKyAqIGt0aHJlYWRzLgorICovCitib29sIHRvcnR1cmVfY2xlYW51cCh2b2lkKQoreworCW11dGV4X2xvY2soJmZ1bGxzdG9wX211dGV4KTsKKwlpZiAoQUNDRVNTX09OQ0UoZnVsbHN0b3ApID09IEZVTExTVE9QX1NIVVRET1dOKSB7CisJCXByX3dhcm4oIkNvbmN1cnJlbnQgcm1tb2QgYW5kIHNodXRkb3duIGlsbGVnYWwhXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEwKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCUFDQ0VTU19PTkNFKGZ1bGxzdG9wKSA9IEZVTExTVE9QX1JNTU9EOworCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOworCXRvcnR1cmVfc2h1dGRvd25fY2xlYW51cCgpOworCXRvcnR1cmVfc2h1ZmZsZV9jbGVhbnVwKCk7CisJdG9ydHVyZV9zdHV0dGVyX2NsZWFudXAoKTsKKwl0b3J0dXJlX29ub2ZmX2NsZWFudXAoKTsKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0b3J0dXJlX2NsZWFudXApOworCisvKgorICogSXMgaXQgdGltZSBmb3IgdGhlIGN1cnJlbnQgdG9ydHVyZSB0ZXN0IHRvIHN0b3A/CisgKi8KK2Jvb2wgdG9ydHVyZV9tdXN0X3N0b3Aodm9pZCkKK3sKKwlyZXR1cm4gdG9ydHVyZV9tdXN0X3N0b3BfaXJxKCkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9tdXN0X3N0b3ApOworCisvKgorICogSXMgaXQgdGltZSBmb3IgdGhlIGN1cnJlbnQgdG9ydHVyZSB0ZXN0IHRvIHN0b3A/ICBUaGlzIGlzIHRoZSBpcnEtc2FmZQorICogdmVyc2lvbiwgaGVuY2Ugbm8gY2hlY2sgZm9yIGt0aHJlYWRfc2hvdWxkX3N0b3AoKS4KKyAqLworYm9vbCB0b3J0dXJlX211c3Rfc3RvcF9pcnEodm9pZCkKK3sKKwlyZXR1cm4gQUNDRVNTX09OQ0UoZnVsbHN0b3ApICE9IEZVTExTVE9QX0RPTlRTVE9QOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9tdXN0X3N0b3BfaXJxKTsKKworLyoKKyAqIEVhY2gga3RocmVhZCBtdXN0IHdhaXQgZm9yIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSBiZWZvcmUgcmV0dXJuaW5nIGZyb20KKyAqIGl0cyB0b3AtbGV2ZWwgZnVuY3Rpb24sIG90aGVyd2lzZSBzZWdmYXVsdHMgZW5zdWUuICBUaGlzIGZ1bmN0aW9uCisgKiBwcmludHMgYSAic3RvcHBpbmciIG1lc3NhZ2UgYW5kIHdhaXRzIGZvciBrdGhyZWFkX3Nob3VsZF9zdG9wKCksIGFuZAorICogc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFsbCB0b3J0dXJlIGt0aHJlYWRzIGltbWVkaWF0ZWx5IHByaW9yIHRvCisgKiByZXR1cm5pbmcuCisgKi8KK3ZvaWQgdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKGNoYXIgKnRpdGxlKQoreworCWlmICh2ZXJib3NlKQorCQlWRVJCT1NFX1RPUk9VVF9TVFJJTkcodGl0bGUpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKHRpdGxlKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwodG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKTsKKworLyoKKyAqIENyZWF0ZSBhIGdlbmVyaWMgdG9ydHVyZSBrdGhyZWFkIHRoYXQgaXMgaW1tZWRpYXRlbHkgcnVubmFibGUuICBJZiB5b3UKKyAqIG5lZWQgdGhlIGt0aHJlYWQgdG8gYmUgc3RvcHBlZCBzbyB0aGF0IHlvdSBjYW4gZG8gc29tZXRoaW5nIHRvIGl0IGJlZm9yZQorICogaXQgc3RhcnRzLCB5b3Ugd2lsbCBuZWVkIHRvIG9wZW4tY29kZSB5b3VyIG93bi4KKyAqLworaW50IF90b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKGludCAoKmZuKSh2b2lkICphcmcpLCB2b2lkICphcmcsIGNoYXIgKnMsIGNoYXIgKm0sCisJCQkgICAgY2hhciAqZiwgc3RydWN0IHRhc2tfc3RydWN0ICoqdHApCit7CisJaW50IHJldCA9IDA7CisKKwlWRVJCT1NFX1RPUk9VVF9TVFJJTkcobSk7CisJKnRwID0ga3RocmVhZF9ydW4oZm4sIGFyZywgcyk7CisJaWYgKElTX0VSUigqdHApKSB7CisJCXJldCA9IFBUUl9FUlIoKnRwKTsKKwkJVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKGYpOworCQkqdHAgPSBOVUxMOworCX0KKwl0b3J0dXJlX3NodWZmbGVfdGFza19yZWdpc3RlcigqdHApOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfdG9ydHVyZV9jcmVhdGVfa3RocmVhZCk7CisKKy8qCisgKiBTdG9wIGEgZ2VuZXJpYyBrdGhyZWFkLCBlbWl0dGluZyBhIG1lc3NhZ2UuCisgKi8KK3ZvaWQgX3RvcnR1cmVfc3RvcF9rdGhyZWFkKGNoYXIgKm0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqKnRwKQoreworCWlmICgqdHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCVZFUkJPU0VfVE9ST1VUX1NUUklORyhtKTsKKwlrdGhyZWFkX3N0b3AoKnRwKTsKKwkqdHAgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX3RvcnR1cmVfc3RvcF9rdGhyZWFkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jIGIva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKaW5kZXggYjQxOGNiMC4uNGYzYTNjMDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCkBAIC03MDIsNiArNzAyLDcgQEAKICAqIGJsa19hZGRfdHJhY2VfcnEgLSBBZGQgYSB0cmFjZSBmb3IgYSByZXF1ZXN0IG9yaWVudGVkIGFjdGlvbgogICogQHE6CQlxdWV1ZSB0aGUgaW8gaXMgZm9yCiAgKiBAcnE6CQl0aGUgc291cmNlIHJlcXVlc3QKKyAqIEBucl9ieXRlczoJbnVtYmVyIG9mIGNvbXBsZXRlZCBieXRlcwogICogQHdoYXQ6CXRoZSBhY3Rpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTcwOSw3ICs3MTAsNyBAQAogICoKICAqKi8KIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnEoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKLQkJCSAgICAgdTMyIHdoYXQpCisJCQkgICAgIHVuc2lnbmVkIGludCBucl9ieXRlcywgdTMyIHdoYXQpCiB7CiAJc3RydWN0IGJsa190cmFjZSAqYnQgPSBxLT5ibGtfdHJhY2U7CiAKQEAgLTcxOCwxMSArNzE5LDExIEBACiAKIAlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0JMT0NLX1BDKSB7CiAJCXdoYXQgfD0gQkxLX1RDX0FDVChCTEtfVENfUEMpOwotCQlfX2Jsa19hZGRfdHJhY2UoYnQsIDAsIGJsa19ycV9ieXRlcyhycSksIHJxLT5jbWRfZmxhZ3MsCisJCV9fYmxrX2FkZF90cmFjZShidCwgMCwgbnJfYnl0ZXMsIHJxLT5jbWRfZmxhZ3MsCiAJCQkJd2hhdCwgcnEtPmVycm9ycywgcnEtPmNtZF9sZW4sIHJxLT5jbWQpOwogCX0gZWxzZSAgewogCQl3aGF0IHw9IEJMS19UQ19BQ1QoQkxLX1RDX0ZTKTsKLQkJX19ibGtfYWRkX3RyYWNlKGJ0LCBibGtfcnFfcG9zKHJxKSwgYmxrX3JxX2J5dGVzKHJxKSwKKwkJX19ibGtfYWRkX3RyYWNlKGJ0LCBibGtfcnFfcG9zKHJxKSwgbnJfYnl0ZXMsCiAJCQkJcnEtPmNtZF9mbGFncywgd2hhdCwgcnEtPmVycm9ycywgMCwgTlVMTCk7CiAJfQogfQpAQCAtNzMwLDMzICs3MzEsMzQgQEAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnFfYWJvcnQodm9pZCAqaWdub3JlLAogCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0FCT1JUKTsKKwlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBibGtfcnFfYnl0ZXMocnEpLCBCTEtfVEFfQUJPUlQpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX3JxX2luc2VydCh2b2lkICppZ25vcmUsCiAJCQkJICAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0lOU0VSVCk7CisJYmxrX2FkZF90cmFjZV9ycShxLCBycSwgYmxrX3JxX2J5dGVzKHJxKSwgQkxLX1RBX0lOU0VSVCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcnFfaXNzdWUodm9pZCAqaWdub3JlLAogCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0lTU1VFKTsKKwlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBibGtfcnFfYnl0ZXMocnEpLCBCTEtfVEFfSVNTVUUpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX3JxX3JlcXVldWUodm9pZCAqaWdub3JlLAogCQkJCSAgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX1JFUVVFVUUpOworCWJsa19hZGRfdHJhY2VfcnEocSwgcnEsIGJsa19ycV9ieXRlcyhycSksIEJMS19UQV9SRVFVRVVFKTsKIH0KIAogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9ycV9jb21wbGV0ZSh2b2lkICppZ25vcmUsCiAJCQkJICAgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCi0JCQkJICAgICAgc3RydWN0IHJlcXVlc3QgKnJxKQorCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0ICpycSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpCiB7Ci0JYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX0NPTVBMRVRFKTsKKwlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBucl9ieXRlcywgQkxLX1RBX0NPTVBMRVRFKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMKaW5kZXggYTU0NTdkNS4uMDQzNGZmMSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyX2JlbmNobWFyay5jCisrKyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlcl9iZW5jaG1hcmsuYwpAQCAtNDAsOCArNDAsOCBAQAogbW9kdWxlX3BhcmFtKHdyaXRlX2l0ZXJhdGlvbiwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHdyaXRlX2l0ZXJhdGlvbiwgIiMgb2Ygd3JpdGVzIGJldHdlZW4gdGltZXN0YW1wIHJlYWRpbmdzIik7CiAKLXN0YXRpYyBpbnQgcHJvZHVjZXJfbmljZSA9IDE5Owotc3RhdGljIGludCBjb25zdW1lcl9uaWNlID0gMTk7CitzdGF0aWMgaW50IHByb2R1Y2VyX25pY2UgPSBNQVhfTklDRTsKK3N0YXRpYyBpbnQgY29uc3VtZXJfbmljZSA9IE1BWF9OSUNFOwogCiBzdGF0aWMgaW50IHByb2R1Y2VyX2ZpZm8gPSAtMTsKIHN0YXRpYyBpbnQgY29uc3VtZXJfZmlmbyA9IC0xOwpAQCAtMzA4LDcgKzMwOCw3IEBACiAKIAkvKiBMZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSB0ZXN0IGlzIHJ1bm5pbmcgYXQgbG93IHByaW9yaXR5ICovCiAJaWYgKHByb2R1Y2VyX2ZpZm8gPCAwICYmIGNvbnN1bWVyX2ZpZm8gPCAwICYmCi0JICAgIHByb2R1Y2VyX25pY2UgPT0gMTkgJiYgY29uc3VtZXJfbmljZSA9PSAxOSkKKwkgICAgcHJvZHVjZXJfbmljZSA9PSBNQVhfTklDRSAmJiBjb25zdW1lcl9uaWNlID09IE1BWF9OSUNFKQogCQl0cmFjZV9wcmludGsoIldBUk5JTkchISEgVGhpcyB0ZXN0IGlzIHJ1bm5pbmcgYXQgbG93ZXN0IHByaW9yaXR5LlxuIik7CiAKIAl0cmFjZV9wcmludGsoIlRpbWU6ICAgICAlbGxkICh1c2VjcylcbiIsIHRpbWUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwppbmRleCA4MTVjODc4Li4yNGMxZjIzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwpAQCAtMTYwMCwxNSArMTYwMCwzMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQpOwogCitzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyICp0ZW1wX2J1ZmZlcjsKKwogc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKIHRyYWNlX2V2ZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUoc3RydWN0IHJpbmdfYnVmZmVyICoqY3VycmVudF9yYiwKIAkJCSAgc3RydWN0IGZ0cmFjZV9ldmVudF9maWxlICpmdHJhY2VfZmlsZSwKIAkJCSAgaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpCiB7CisJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICplbnRyeTsKKwogCSpjdXJyZW50X3JiID0gZnRyYWNlX2ZpbGUtPnRyLT50cmFjZV9idWZmZXIuYnVmZmVyOwotCXJldHVybiB0cmFjZV9idWZmZXJfbG9ja19yZXNlcnZlKCpjdXJyZW50X3JiLAorCWVudHJ5ID0gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZSgqY3VycmVudF9yYiwKIAkJCQkJIHR5cGUsIGxlbiwgZmxhZ3MsIHBjKTsKKwkvKgorCSAqIElmIHRyYWNpbmcgaXMgb2ZmLCBidXQgd2UgaGF2ZSB0cmlnZ2VycyBlbmFibGVkCisJICogd2Ugc3RpbGwgbmVlZCB0byBsb29rIGF0IHRoZSBldmVudCBkYXRhLiBVc2UgdGhlIHRlbXBfYnVmZmVyCisJICogdG8gc3RvcmUgdGhlIHRyYWNlIGV2ZW50IGZvciB0aGUgdGlnZ2VyIHRvIHVzZS4gSXQncyByZWN1c2l2ZQorCSAqIHNhZmUgYW5kIHdpbGwgbm90IGJlIHJlY29yZGVkIGFueXdoZXJlLgorCSAqLworCWlmICghZW50cnkgJiYgZnRyYWNlX2ZpbGUtPmZsYWdzICYgRlRSQUNFX0VWRU5UX0ZMX1RSSUdHRVJfQ09ORCkgeworCQkqY3VycmVudF9yYiA9IHRlbXBfYnVmZmVyOworCQllbnRyeSA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoKmN1cnJlbnRfcmIsCisJCQkJCQkgIHR5cGUsIGxlbiwgZmxhZ3MsIHBjKTsKKwl9CisJcmV0dXJuIGVudHJ5OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfZXZlbnRfYnVmZmVyX2xvY2tfcmVzZXJ2ZSk7CiAKQEAgLTY0OTQsMTEgKzY1MTAsMTYgQEAKIAogCXJhd19zcGluX2xvY2tfaW5pdCgmZ2xvYmFsX3RyYWNlLnN0YXJ0X2xvY2spOwogCisJLyogVXNlZCBmb3IgZXZlbnQgdHJpZ2dlcnMgKi8KKwl0ZW1wX2J1ZmZlciA9IHJpbmdfYnVmZmVyX2FsbG9jKFBBR0VfU0laRSwgUkJfRkxfT1ZFUldSSVRFKTsKKwlpZiAoIXRlbXBfYnVmZmVyKQorCQlnb3RvIG91dF9mcmVlX2NwdW1hc2s7CisKIAkvKiBUT0RPOiBtYWtlIHRoZSBudW1iZXIgb2YgYnVmZmVycyBob3QgcGx1Z2dhYmxlIHdpdGggQ1BVUyAqLwogCWlmIChhbGxvY2F0ZV90cmFjZV9idWZmZXJzKCZnbG9iYWxfdHJhY2UsIHJpbmdfYnVmX3NpemUpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgInRyYWNlcjogZmFpbGVkIHRvIGFsbG9jYXRlIHJpbmcgYnVmZmVyIVxuIik7CiAJCVdBUk5fT04oMSk7Ci0JCWdvdG8gb3V0X2ZyZWVfY3B1bWFzazsKKwkJZ290byBvdXRfZnJlZV90ZW1wX2J1ZmZlcjsKIAl9CiAKIAlpZiAoZ2xvYmFsX3RyYWNlLmJ1ZmZlcl9kaXNhYmxlZCkKQEAgLTY1NDAsNiArNjU2MSw4IEBACiAKIAlyZXR1cm4gMDsKIAorb3V0X2ZyZWVfdGVtcF9idWZmZXI6CisJcmluZ19idWZmZXJfZnJlZSh0ZW1wX2J1ZmZlcik7CiBvdXRfZnJlZV9jcHVtYXNrOgogCWZyZWVfcGVyY3B1KGdsb2JhbF90cmFjZS50cmFjZV9idWZmZXIuZGF0YSk7CiAjaWZkZWYgQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcGVyZi5jCmluZGV4IGU4NTRmNDIuLmM4OTQ2MTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wZXJmLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3BlcmYuYwpAQCAtMzEsOSArMzEsMjUgQEAKIAl9CiAKIAkvKiBUaGUgZnRyYWNlIGZ1bmN0aW9uIHRyYWNlIGlzIGFsbG93ZWQgb25seSBmb3Igcm9vdC4gKi8KLQlpZiAoZnRyYWNlX2V2ZW50X2lzX2Z1bmN0aW9uKHRwX2V2ZW50KSAmJgotCSAgICBwZXJmX3BhcmFub2lkX3RyYWNlcG9pbnRfcmF3KCkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07CisJaWYgKGZ0cmFjZV9ldmVudF9pc19mdW5jdGlvbih0cF9ldmVudCkpIHsKKwkJaWYgKHBlcmZfcGFyYW5vaWRfdHJhY2Vwb2ludF9yYXcoKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgYWxsb3cgdXNlciBzcGFjZSBjYWxsY2hhaW5zIGZvciAgZnVuY3Rpb24gdHJhY2UKKwkJICogZXZlbnQsIGR1ZSB0byBpc3N1ZXMgd2l0aCBwYWdlIGZhdWx0cyB3aGlsZSB0cmFjaW5nIHBhZ2UKKwkJICogZmF1bHQgaGFuZGxlciBhbmQgaXRzIG92ZXJhbGwgdHJpY2tpbmVzcyBuYXR1cmUuCisJCSAqLworCQlpZiAoIXBfZXZlbnQtPmF0dHIuZXhjbHVkZV9jYWxsY2hhaW5fdXNlcikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qCisJCSAqIFNhbWUgcmVhc29uIHRvIGRpc2FibGUgdXNlciBzdGFjayBkdW1wIGFzIGZvciB1c2VyIHNwYWNlCisJCSAqIGNhbGxjaGFpbnMgYWJvdmUuCisJCSAqLworCQlpZiAocF9ldmVudC0+YXR0ci5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1NUQUNLX1VTRVIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBObyB0cmFjaW5nLCBqdXN0IGNvdW50aW5nLCBzbyBubyBvYnZpb3VzIGxlYWsgKi8KIAlpZiAoIShwX2V2ZW50LT5hdHRyLnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUkFXKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYwppbmRleCBmMzk4OWNlLi43YjE2ZDQwIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCkBAIC0yNywxMiArMjcsNiBAQAogCiBERUZJTkVfTVVURVgoZXZlbnRfbXV0ZXgpOwogCi1ERUZJTkVfTVVURVgoZXZlbnRfc3RvcmFnZV9tdXRleCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChldmVudF9zdG9yYWdlX211dGV4KTsKLQotY2hhciBldmVudF9zdG9yYWdlW0VWRU5UX1NUT1JBR0VfU0laRV07Ci1FWFBPUlRfU1lNQk9MX0dQTChldmVudF9zdG9yYWdlKTsKLQogTElTVF9IRUFEKGZ0cmFjZV9ldmVudHMpOwogc3RhdGljIExJU1RfSEVBRChmdHJhY2VfY29tbW9uX2ZpZWxkcyk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYwppbmRleCA3YzNlM2U3Li5lZTBhNTA5IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXhwb3J0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V4cG9ydC5jCkBAIC05NSwxNSArOTUsMTIgQEAKICN1bmRlZiBfX2FycmF5CiAjZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKKwkJY2hhciAqdHlwZV9zdHIgPSAjdHlwZSJbIl9fc3RyaW5naWZ5KGxlbikiXSI7CQlcCiAJCUJVSUxEX0JVR19PTihsZW4gPiBNQVhfRklMVEVSX1NUUl9WQUwpOwkJCVwKLQkJbXV0ZXhfbG9jaygmZXZlbnRfc3RvcmFnZV9tdXRleCk7CQkJXAotCQlzbnByaW50ZihldmVudF9zdG9yYWdlLCBzaXplb2YoZXZlbnRfc3RvcmFnZSksCQlcCi0JCQkgIiVzWyVkXSIsICN0eXBlLCBsZW4pOwkJCQlcCi0JCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCBldmVudF9zdG9yYWdlLCAjaXRlbSwgXAorCQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgdHlwZV9zdHIsICNpdGVtLAlcCiAJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAogCQkJCSBzaXplb2YoZmllbGQuaXRlbSksCQkJXAogCQkJCSBpc19zaWduZWRfdHlwZSh0eXBlKSwgZmlsdGVyX3R5cGUpOwlcCi0JCW11dGV4X3VubG9jaygmZXZlbnRfc3RvcmFnZV9tdXRleCk7CQkJXAogCQlpZiAocmV0KQkJCQkJCVwKIAkJCXJldHVybiByZXQ7CQkJCQlcCiAJfSB3aGlsZSAoMCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2lycXNvZmYuYwppbmRleCAyYWVmYmVlLi44ODdlZjg4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMKQEAgLTQ5OCwxNCArNDk4LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRyYWNlX2hhcmRpcnFzX29mZik7CiAKLXZvaWQgdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKHVuc2lnbmVkIGxvbmcgY2FsbGVyX2FkZHIpCitfX3Zpc2libGUgdm9pZCB0cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIodW5zaWduZWQgbG9uZyBjYWxsZXJfYWRkcikKIHsKIAlpZiAoIXByZWVtcHRfdHJhY2UoKSAmJiBpcnFfdHJhY2UoKSkKIAkJc3RvcF9jcml0aWNhbF90aW1pbmcoQ0FMTEVSX0FERFIwLCBjYWxsZXJfYWRkcik7CiB9CiBFWFBPUlRfU1lNQk9MKHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcik7CiAKLXZvaWQgdHJhY2VfaGFyZGlycXNfb2ZmX2NhbGxlcih1bnNpZ25lZCBsb25nIGNhbGxlcl9hZGRyKQorX192aXNpYmxlIHZvaWQgdHJhY2VfaGFyZGlycXNfb2ZmX2NhbGxlcih1bnNpZ25lZCBsb25nIGNhbGxlcl9hZGRyKQogewogCWlmICghcHJlZW1wdF90cmFjZSgpICYmIGlycV90cmFjZSgpKQogCQlzdGFydF9jcml0aWNhbF90aW1pbmcoQ0FMTEVSX0FERFIwLCBjYWxsZXJfYWRkcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdXAuYyBiL2tlcm5lbC91cC5jCmluZGV4IDUwOTQwM2UuLjE3NjBiZjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91cC5jCisrKyBiL2tlcm5lbC91cC5jCkBAIC0yMiwxNiArMjIsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKIAotdm9pZCBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkLAotCQkJCWludCB3YWl0KQoraW50IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyhpbnQgY3B1LCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3NkLT5mdW5jKGNzZC0+aW5mbyk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSk7CitFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyk7CiAKIGludCBvbl9lYWNoX2NwdShzbXBfY2FsbF9mdW5jX3QgZnVuYywgdm9pZCAqaW5mbywgaW50IHdhaXQpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvd2F0Y2hkb2cuYyBiL2tlcm5lbC93YXRjaGRvZy5jCmluZGV4IDQ0MzE2MTAuLjAxYzZmOTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93YXRjaGRvZy5jCisrKyBiL2tlcm5lbC93YXRjaGRvZy5jCkBAIC01MDUsNyArNTA1LDYgQEAKIAogc3RhdGljIHZvaWQgdXBkYXRlX3RpbWVycyhpbnQgY3B1KQogewotCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhIGRhdGEgPSB7LmZ1bmMgPSByZXN0YXJ0X3dhdGNoZG9nX2hydGltZXJ9OwogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgcGVyZiBldmVudCBjb3VudGVyIHdpbGwgYWRvcHQgdG8gYSBuZXcKIAkgKiBzYW1wbGluZyBwZXJpb2QuIFVwZGF0aW5nIHRoZSBzYW1wbGluZyBwZXJpb2QgZGlyZWN0bHkgd291bGQKQEAgLTUxNSw3ICs1MTQsNyBAQAogCSAqIG1pZ2h0IGJlIGxhdGUgYWxyZWFkeSBzbyB3ZSBoYXZlIHRvIHJlc3RhcnQgdGhlIHRpbWVyIGFzIHdlbGwuCiAJICovCiAJd2F0Y2hkb2dfbm1pX2Rpc2FibGUoY3B1KTsKLQlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsICZkYXRhLCAxKTsKKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCByZXN0YXJ0X3dhdGNoZG9nX2hydGltZXIsIE5VTEwsIDEpOwogCXdhdGNoZG9nX25taV9lbmFibGUoY3B1KTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDE5M2U5NzcuLjBlZTYzYWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTUxNiw2ICs1MTYsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlc3Ryb3lfd29ya19vbl9zdGFjayk7CiAKK3ZvaWQgZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2soc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKK3sKKwlkZXN0cm95X3RpbWVyX29uX3N0YWNrKCZ3b3JrLT50aW1lcik7CisJZGVidWdfb2JqZWN0X2ZyZWUoJndvcmstPndvcmssICZ3b3JrX2RlYnVnX2Rlc2NyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRlc3Ryb3lfZGVsYXllZF93b3JrX29uX3N0YWNrKTsKKwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z193b3JrX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfd29ya19kZWFjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeyB9CkBAIC0zMjI1LDcgKzMyMzIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmYXR0cnMtPm5pY2UpID09IDEgJiYKLQkgICAgYXR0cnMtPm5pY2UgPj0gLTIwICYmIGF0dHJzLT5uaWNlIDw9IDE5KQorCSAgICBhdHRycy0+bmljZSA+PSBNSU5fTklDRSAmJiBhdHRycy0+bmljZSA8PSBNQVhfTklDRSkKIAkJcmV0ID0gYXBwbHlfd29ya3F1ZXVlX2F0dHJzKHdxLCBhdHRycyk7CiAJZWxzZQogCQlyZXQgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBhNDhhYmVhLi5kZDdmODg1IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtOTgwLDYgKzk4MCwyMSBAQAogCSAgVGhlIGZvbGxvd2luZyBsb2NraW5nIEFQSXMgYXJlIGNvdmVyZWQ6IHNwaW5sb2Nrcywgcndsb2NrcywKIAkgIG11dGV4ZXMgYW5kIHJ3c2Vtcy4KIAorY29uZmlnIExPQ0tfVE9SVFVSRV9URVNUCisJdHJpc3RhdGUgInRvcnR1cmUgdGVzdHMgZm9yIGxvY2tpbmciCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlzZWxlY3QgVE9SVFVSRV9URVNUCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgYSBrZXJuZWwgbW9kdWxlIHRoYXQgcnVucyB0b3J0dXJlIHRlc3RzCisJICBvbiBrZXJuZWwgbG9ja2luZyBwcmltaXRpdmVzLiAgVGhlIGtlcm5lbCBtb2R1bGUgbWF5IGJlIGJ1aWx0CisJICBhZnRlciB0aGUgZmFjdCBvbiB0aGUgcnVubmluZyBrZXJuZWwgdG8gYmUgdGVzdGVkLCBpZiBkZXNpcmVkLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb2NraW5nLXByaW1pdGl2ZSB0b3J0dXJlIHRlc3RzCisJICB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwuCisJICBTYXkgTSBpZiB5b3Ugd2FudCB0aGVzZSB0b3J0dXJlIHRlc3RzIHRvIGJ1aWxkIGFzIGEgbW9kdWxlLgorCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKIGVuZG1lbnUgIyBsb2NrIGRlYnVnZ2luZwogCiBjb25maWcgVFJBQ0VfSVJRRkxBR1MKQEAgLTExNDEsOSArMTE1NiwxNCBAQAogCiAJIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgogCitjb25maWcgVE9SVFVSRV9URVNUCisJdHJpc3RhdGUKKwlkZWZhdWx0IG4KKwogY29uZmlnIFJDVV9UT1JUVVJFX1RFU1QKIAl0cmlzdGF0ZSAidG9ydHVyZSB0ZXN0cyBmb3IgUkNVIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJc2VsZWN0IFRPUlRVUkVfVEVTVAogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIGEga2VybmVsIG1vZHVsZSB0aGF0IHJ1bnMgdG9ydHVyZSB0ZXN0cwpkaWZmIC0tZ2l0IGEvbGliL2ZvbnRzL0tjb25maWcgYi9saWIvZm9udHMvS2NvbmZpZwppbmRleCA0ZGMxYjk5Li4zNGZkOTMxIDEwMDY0NAotLS0gYS9saWIvZm9udHMvS2NvbmZpZworKysgYi9saWIvZm9udHMvS2NvbmZpZwpAQCAtOSw3ICs5LDcgQEAKIAogY29uZmlnIEZPTlRTCiAJYm9vbCAiU2VsZWN0IGNvbXBpbGVkLWluIGZvbnRzIgotCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQorCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRSB8fCBTVElfQ09OU09MRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGZvbnRzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQKIAkgIHlvdXIgZnJhbWUgYnVmZmVyIGNvbnNvbGUgdXN1YWxseSB1c2UuCkBAIC0yMiw3ICsyMiw3IEBACiAKIGNvbmZpZyBGT05UXzh4OAogCWJvb2wgIlZHQSA4eDggZm9udCIgaWYgRk9OVFMKLQlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUKKwlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUgfHwgU1RJX0NPTlNPTEUKIAlkZWZhdWx0IHkgaWYgIVNQQVJDICYmICFGT05UUwogCWhlbHAKIAkgIFRoaXMgaXMgdGhlICJoaWdoIHJlc29sdXRpb24iIGZvbnQgZm9yIHRoZSBWR0EgZnJhbWUgYnVmZmVyICh0aGUgb25lCkBAIC00NSw3ICs0NSw3IEBACiAKIGNvbmZpZyBGT05UXzZ4MTEKIAlib29sICJNYWMgY29uc29sZSA2eDExIGZvbnQgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnMpIiBpZiBGT05UUwotCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQorCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRSB8fCBTVElfQ09OU09MRQogCWRlZmF1bHQgeSBpZiAhU1BBUkMgJiYgIUZPTlRTICYmIE1BQwogCWhlbHAKIAkgIFNtYWxsIGNvbnNvbGUgZm9udCB3aXRoIE1hY2ludG9zaC1zdHlsZSBoaWdoLWhhbGYgZ2x5cGhzLiAgU29tZSBNYWMKZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCBiZmU0ZGI0Li4xYmE0OTU2IDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC04NjksNiArODY5LDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlkcl9pbml0KTsKIAorc3RhdGljIGludCBpZHJfaGFzX2VudHJ5KGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMTsKK30KKworYm9vbCBpZHJfaXNfZW1wdHkoc3RydWN0IGlkciAqaWRwKQoreworCXJldHVybiAhaWRyX2Zvcl9lYWNoKGlkcCwgaWRyX2hhc19lbnRyeSwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MKGlkcl9pc19lbXB0eSk7CiAKIC8qKgogICogRE9DOiBJREEgZGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL2xpYi9rb2JqZWN0LmMgYi9saWIva29iamVjdC5jCmluZGV4IGNiMTRhZWEuLjU4NzUxYmIgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0LmMKKysrIGIvbGliL2tvYmplY3QuYwpAQCAtOTQsNyArOTQsNyBAQAogCQlCVUdfT04ob3BzLT50eXBlID49IEtPQkpfTlNfVFlQRVMpOwogCQlCVUdfT04oIWtvYmpfbnNfdHlwZV9yZWdpc3RlcmVkKG9wcy0+dHlwZSkpOwogCi0JCWtlcm5mc19lbmFibGVfbnMoa29iai0+c2QpOworCQlzeXNmc19lbmFibGVfbnMoa29iai0+c2QpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliL3JhbmRvbTMyLmMgYi9saWIvcmFuZG9tMzIuYwppbmRleCAxZTViMmRmLi42MTQ4OTY3IDEwMDY0NAotLS0gYS9saWIvcmFuZG9tMzIuYworKysgYi9saWIvcmFuZG9tMzIuYwpAQCAtMjQ0LDggKzI0NCwxOSBAQAogCXN0YXRpYyBib29sIGxhdGNoID0gZmFsc2U7CiAJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIAorCS8qIEFza2luZyBmb3IgcmFuZG9tIGJ5dGVzIG1pZ2h0IHJlc3VsdCBpbiBieXRlcyBnZXR0aW5nCisJICogbW92ZWQgaW50byB0aGUgbm9uYmxvY2tpbmcgcG9vbCBhbmQgdGh1cyBtYXJraW5nIGl0CisJICogYXMgaW5pdGlhbGl6ZWQuIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCBkb3VibGUgYmFjayBpbnRvCisJICogdGhpcyBmdW5jdGlvbiBhbmQgYXR0ZW1wdCB0byBkbyBhIGxhdGUgcmVzZWVkLgorCSAqIElnbm9yZSB0aGUgcG9pbnRsZXNzIGF0dGVtcHQgdG8gcmVzZWVkIGFnYWluIGlmIHdlJ3JlCisJICogYWxyZWFkeSB3YWl0aW5nIGZvciBieXRlcyB3aGVuIHRoZSBub25ibG9ja2luZyBwb29sCisJICogZ290IGluaXRpYWxpemVkLgorCSAqLworCiAJLyogb25seSBhbGxvdyBpbml0aWFsIHNlZWRpbmcgKGxhdGUgPT0gZmFsc2UpIG9uY2UgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKSkKKwkJcmV0dXJuOworCiAJaWYgKGxhdGNoICYmICFsYXRlKQogCQlnb3RvIG91dDsKIAlsYXRjaCA9IHRydWU7CmRpZmYgLS1naXQgYS9saWIvc3RyaW5nLmMgYi9saWIvc3RyaW5nLmMKaW5kZXggZTU4NzhkZS4uOWIxZjkwNiAxMDA2NDQKLS0tIGEvbGliL3N0cmluZy5jCisrKyBiL2xpYi9zdHJpbmcuYwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgogICovCiAjdW5kZWYgbWVtY21wCi1pbnQgbWVtY21wKGNvbnN0IHZvaWQgKmNzLCBjb25zdCB2b2lkICpjdCwgc2l6ZV90IGNvdW50KQorX192aXNpYmxlIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqY3MsIGNvbnN0IHZvaWQgKmN0LCBzaXplX3QgY291bnQpCiB7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqc3UxLCAqc3UyOwogCWludCByZXMgPSAwOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCAxODViNmQzLi41ZTJjZjZmIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtNzE5LDEwICs3MTksMTUgQEAKIAkJc3BlY3AgPSAmbWVtX3NwZWM7CiAJCWRlY29kZSA9IDA7CiAJfQotCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgKnNwZWNwKTsKLQlpZiAocmVzLT5zdGFydCAhPSByZXMtPmVuZCkgewotCQkqcCsrID0gJy0nOwotCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZW5kLCAqc3BlY3ApOworCWlmIChkZWNvZGUgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpIHsKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAic2l6ZSAiLCBzdHJfc3BlYyk7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCAqc3BlY3ApOworCX0gZWxzZSB7CisJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5zdGFydCwgKnNwZWNwKTsKKwkJaWYgKHJlcy0+c3RhcnQgIT0gcmVzLT5lbmQpIHsKKwkJCSpwKysgPSAnLSc7CisJCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZW5kLCAqc3BlY3ApOworCQl9CiAJfQogCWlmIChkZWNvZGUpIHsKIAkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkKZGlmZiAtLWdpdCBhL21tL2ZyZW1hcC5jIGIvbW0vZnJlbWFwLmMKaW5kZXggYmJjNGQ2Ni4uMzRmZWJhNiAxMDA2NDQKLS0tIGEvbW0vZnJlbWFwLmMKKysrIGIvbW0vZnJlbWFwLmMKQEAgLTIzLDI4ICsyMyw0NCBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorc3RhdGljIGludCBtbV9jb3VudGVyKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBQYWdlQW5vbihwYWdlKSA/IE1NX0FOT05QQUdFUyA6IE1NX0ZJTEVQQUdFUzsKK30KKwogc3RhdGljIHZvaWQgemFwX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCXB0ZV90IHB0ZSA9ICpwdGVwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN3cF9lbnRyeV90IGVudHJ5OwogCiAJaWYgKHB0ZV9wcmVzZW50KHB0ZSkpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KIAkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHB0ZV9wZm4ocHRlKSk7CiAJCXB0ZSA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyLCBwdGVwKTsKIAkJcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRlKTsKIAkJaWYgKHBhZ2UpIHsKIAkJCWlmIChwdGVfZGlydHkocHRlKSkKIAkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCXVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7CisJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihwYWdlKSk7CiAJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKTsKLQkJCWRlY19tbV9jb3VudGVyKG1tLCBNTV9GSUxFUEFHRVMpOwogCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFwdGVfZmlsZShwdGUpKQotCQkJZnJlZV9zd2FwX2FuZF9jYWNoZShwdGVfdG9fc3dwX2VudHJ5KHB0ZSkpOworCX0gZWxzZSB7CS8qIHphcF9wdGUoKSBpcyBub3QgY2FsbGVkIHdoZW4gcHRlX25vbmUoKSAqLworCQlpZiAoIXB0ZV9maWxlKHB0ZSkpIHsKKwkJCXVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7CisJCQllbnRyeSA9IHB0ZV90b19zd3BfZW50cnkocHRlKTsKKwkJCWlmIChub25fc3dhcF9lbnRyeShlbnRyeSkpIHsKKwkJCQlpZiAoaXNfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSkgeworCQkJCQlwYWdlID0gbWlncmF0aW9uX2VudHJ5X3RvX3BhZ2UoZW50cnkpOworCQkJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihwYWdlKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmcmVlX3N3YXBfYW5kX2NhY2hlKGVudHJ5KTsKKwkJCQlkZWNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpOworCQkJfQorCQl9CiAJCXB0ZV9jbGVhcl9ub3RfcHJlc2VudF9mdWxsKG1tLCBhZGRyLCBwdGVwLCAwKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IGFlM2M4ZjMuLjQ3NTVjODUgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC0xNTU2LDEwICsxNTU2LDEwIEBACiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldF9tZW1wb2xpY3koaW50IF9fdXNlciAqcG9saWN5LAotCQkJCSAgICAgY29tcGF0X3Vsb25nX3QgX191c2VyICpubWFzaywKLQkJCQkgICAgIGNvbXBhdF91bG9uZ190IG1heG5vZGUsCi0JCQkJICAgICBjb21wYXRfdWxvbmdfdCBhZGRyLCBjb21wYXRfdWxvbmdfdCBmbGFncykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUoZ2V0X21lbXBvbGljeSwgaW50IF9fdXNlciAqLCBwb2xpY3ksCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKiwgbm1hc2ssCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgbWF4bm9kZSwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBhZGRyLCBjb21wYXRfdWxvbmdfdCwgZmxhZ3MpCiB7CiAJbG9uZyBlcnI7CiAJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5tID0gTlVMTDsKQEAgLTE1ODYsOCArMTU4Niw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2V0X21lbXBvbGljeShpbnQgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICpubWFzaywKLQkJCQkgICAgIGNvbXBhdF91bG9uZ190IG1heG5vZGUpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkUzKHNldF9tZW1wb2xpY3ksIGludCwgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICosIG5tYXNrLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIG1heG5vZGUpCiB7CiAJbG9uZyBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgX191c2VyICpubSA9IE5VTEw7CkBAIC0xNjA5LDkgKzE2MDksOSBAQAogCXJldHVybiBzeXNfc2V0X21lbXBvbGljeShtb2RlLCBubSwgbnJfYml0cysxKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbWJpbmQoY29tcGF0X3Vsb25nX3Qgc3RhcnQsIGNvbXBhdF91bG9uZ190IGxlbiwKLQkJCSAgICAgY29tcGF0X3Vsb25nX3QgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICpubWFzaywKLQkJCSAgICAgY29tcGF0X3Vsb25nX3QgbWF4bm9kZSwgY29tcGF0X3Vsb25nX3QgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KG1iaW5kLCBjb21wYXRfdWxvbmdfdCwgc3RhcnQsIGNvbXBhdF91bG9uZ190LCBsZW4sCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgbW9kZSwgY29tcGF0X3Vsb25nX3QgX191c2VyICosIG5tYXNrLAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIG1heG5vZGUsIGNvbXBhdF91bG9uZ190LCBmbGFncykKIHsKIAlsb25nIGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5tID0gTlVMTDsKQEAgLTIzMDEsMzUgKzIzMDEsNiBAQAogCWttZW1fY2FjaGVfZnJlZShzbl9jYWNoZSwgbik7CiB9CiAKLSNpZmRlZiBDT05GSUdfTlVNQV9CQUxBTkNJTkcKLXN0YXRpYyBib29sIG51bWFfbWlncmF0ZV9kZWZlcnJlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBsYXN0X2NwdXBpZCkKLXsKLQkvKiBOZXZlciBkZWZlciBhIHByaXZhdGUgZmF1bHQgKi8KLQlpZiAoY3B1cGlkX21hdGNoX3BpZChwLCBsYXN0X2NwdXBpZCkpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChwLT5udW1hX21pZ3JhdGVfZGVmZXJyZWQpIHsKLQkJcC0+bnVtYV9taWdyYXRlX2RlZmVycmVkLS07Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZWZlcl9udW1hX21pZ3JhdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXAtPm51bWFfbWlncmF0ZV9kZWZlcnJlZCA9IHN5c2N0bF9udW1hX2JhbGFuY2luZ19taWdyYXRlX2RlZmVycmVkOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgYm9vbCBudW1hX21pZ3JhdGVfZGVmZXJyZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgbGFzdF9jcHVwaWQpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVmZXJfbnVtYV9taWdyYXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKLXsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi8KLQogLyoqCiAgKiBtcG9sX21pc3BsYWNlZCAtIGNoZWNrIHdoZXRoZXIgY3VycmVudCBwYWdlIG5vZGUgaXMgdmFsaWQgaW4gcG9saWN5CiAgKgpAQCAtMjQwMyw1MiArMjM3NCw5IEBACiAKIAkvKiBNaWdyYXRlIHRoZSBwYWdlIHRvd2FyZHMgdGhlIG5vZGUgd2hvc2UgQ1BVIGlzIHJlZmVyZW5jaW5nIGl0ICovCiAJaWYgKHBvbC0+ZmxhZ3MgJiBNUE9MX0ZfTU9ST04pIHsKLQkJaW50IGxhc3RfY3B1cGlkOwotCQlpbnQgdGhpc19jcHVwaWQ7Ci0KIAkJcG9sbmlkID0gdGhpc25pZDsKLQkJdGhpc19jcHVwaWQgPSBjcHVfcGlkX3RvX2NwdXBpZCh0aGlzY3B1LCBjdXJyZW50LT5waWQpOwogCi0JCS8qCi0JCSAqIE11bHRpLXN0YWdlIG5vZGUgc2VsZWN0aW9uIGlzIHVzZWQgaW4gY29uanVuY3Rpb24KLQkJICogd2l0aCBhIHBlcmlvZGljIG1pZ3JhdGlvbiBmYXVsdCB0byBidWlsZCBhIHRlbXBvcmFsCi0JCSAqIHRhc2s8LT5wYWdlIHJlbGF0aW9uLiBCeSB1c2luZyBhIHR3by1zdGFnZSBmaWx0ZXIgd2UKLQkJICogcmVtb3ZlIHNob3J0L3VubGlrZWx5IHJlbGF0aW9ucy4KLQkJICoKLQkJICogVXNpbmcgUChwKSB+IG5fcCAvIG5fdCBhcyBwZXIgZnJlcXVlbnRpc3QKLQkJICogcHJvYmFiaWxpdHksIHdlIGNhbiBlcXVhdGUgYSB0YXNrJ3MgdXNhZ2Ugb2YgYQotCQkgKiBwYXJ0aWN1bGFyIHBhZ2UgKG5fcCkgcGVyIHRvdGFsIHVzYWdlIG9mIHRoaXMKLQkJICogcGFnZSAobl90KSAoaW4gYSBnaXZlbiB0aW1lLXNwYW4pIHRvIGEgcHJvYmFiaWxpdHkuCi0JCSAqCi0JCSAqIE91ciBwZXJpb2RpYyBmYXVsdHMgd2lsbCBzYW1wbGUgdGhpcyBwcm9iYWJpbGl0eSBhbmQKLQkJICogZ2V0dGluZyB0aGUgc2FtZSByZXN1bHQgdHdpY2UgaW4gYSByb3csIGdpdmVuIHRoZXNlCi0JCSAqIHNhbXBsZXMgYXJlIGZ1bGx5IGluZGVwZW5kZW50LCBpcyB0aGVuIGdpdmVuIGJ5Ci0JCSAqIFAobileMiwgcHJvdmlkZWQgb3VyIHNhbXBsZSBwZXJpb2QgaXMgc3VmZmljaWVudGx5Ci0JCSAqIHNob3J0IGNvbXBhcmVkIHRvIHRoZSB1c2FnZSBwYXR0ZXJuLgotCQkgKgotCQkgKiBUaGlzIHF1YWRyaWMgc3F1aXNoZXMgc21hbGwgcHJvYmFiaWxpdGllcywgbWFraW5nCi0JCSAqIGl0IGxlc3MgbGlrZWx5IHdlIGFjdCBvbiBhbiB1bmxpa2VseSB0YXNrPC0+cGFnZQotCQkgKiByZWxhdGlvbi4KLQkJICovCi0JCWxhc3RfY3B1cGlkID0gcGFnZV9jcHVwaWRfeGNoZ19sYXN0KHBhZ2UsIHRoaXNfY3B1cGlkKTsKLQkJaWYgKCFjcHVwaWRfcGlkX3Vuc2V0KGxhc3RfY3B1cGlkKSAmJiBjcHVwaWRfdG9fbmlkKGxhc3RfY3B1cGlkKSAhPSB0aGlzbmlkKSB7Ci0KLQkJCS8qIFNlZSBzeXNjdGxfbnVtYV9iYWxhbmNpbmdfbWlncmF0ZV9kZWZlcnJlZCBjb21tZW50ICovCi0JCQlpZiAoIWNwdXBpZF9tYXRjaF9waWQoY3VycmVudCwgbGFzdF9jcHVwaWQpKQotCQkJCWRlZmVyX251bWFfbWlncmF0ZShjdXJyZW50KTsKLQotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBUaGUgcXVhZHJhdGljIGZpbHRlciBhYm92ZSByZWR1Y2VzIGV4dHJhbmVvdXMgbWlncmF0aW9uCi0JCSAqIG9mIHNoYXJlZCBwYWdlcyBzb21ld2hhdC4gVGhpcyBjb2RlIHJlZHVjZXMgaXQgZXZlbiBtb3JlLAotCQkgKiByZWR1Y2luZyB0aGUgb3ZlcmhlYWQgb2YgcGFnZSBtaWdyYXRpb25zIG9mIHNoYXJlZCBwYWdlcy4KLQkJICogVGhpcyBtYWtlcyB3b3JrbG9hZHMgd2l0aCBzaGFyZWQgcGFnZXMgcmVseSBtb3JlIG9uCi0JCSAqICJtb3ZlIHRhc2sgbmVhciBpdHMgbWVtb3J5IiwgYW5kIGxlc3Mgb24gIm1vdmUgbWVtb3J5Ci0JCSAqIHRvd2FyZHMgaXRzIHRhc2siLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4KLQkJICovCi0JCWlmIChudW1hX21pZ3JhdGVfZGVmZXJyZWQoY3VycmVudCwgbGFzdF9jcHVwaWQpKQorCQlpZiAoIXNob3VsZF9udW1hX21pZ3JhdGVfbWVtb3J5KGN1cnJlbnQsIHBhZ2UsIGN1cm5pZCwgdGhpc2NwdSkpCiAJCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCBiNDk0ZmRiLi5iZWQ0ODgwIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC0xNzgsNiArMTc4LDM3IEBACiB9CiAKIC8qCisgKiBDb25ncmF0dWxhdGlvbnMgdG8gdHJpbml0eSBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcuCisgKiBtbS9mcmVtYXAuYydzIHJlbWFwX2ZpbGVfcGFnZXMoKSBhY2NlcHRzIGFueSByYW5nZSB3aXRoaW4gYSBzaW5nbGUgdm1hIHRvCisgKiBjb252ZXJ0IHRoYXQgdm1hIHRvIFZNX05PTkxJTkVBUjsgYW5kIGdlbmVyaWNfZmlsZV9yZW1hcF9wYWdlcygpIHdpbGwgdGhlbgorICogcmVwbGFjZSB0aGUgc3BlY2lmaWVkIHJhbmdlIGJ5IGZpbGUgcHRlcyB0aHJvdWdob3V0IChtYXliZSBwb3B1bGF0ZWQgYWZ0ZXIpLgorICogSWYgcGFnZSBtaWdyYXRpb24gZmluZHMgYSBwYWdlIHdpdGhpbiB0aGF0IHJhbmdlLCB3aGlsZSBpdCdzIHN0aWxsIGxvY2F0ZWQKKyAqIGJ5IHZtYV9pbnRlcnZhbF90cmVlIHJhdGhlciB0aGFuIGxvc3QgdG8gaV9tbWFwX25vbmxpbmVhciBsaXN0LCBubyBwcm9ibGVtOgorICogemFwX3B0ZSgpIGNsZWFycyB0aGUgdGVtcG9yYXJ5IG1pZ3JhdGlvbiBlbnRyeSBiZWZvcmUgbW1hcF9zZW0gaXMgZHJvcHBlZC4KKyAqIEJ1dCBpZiB0aGUgbWlncmF0aW5nIHBhZ2UgaXMgaW4gYSBwYXJ0IG9mIHRoZSB2bWEgb3V0c2lkZSB0aGUgcmFuZ2UgdG8gYmUKKyAqIHJlbWFwcGVkLCB0aGVuIGl0IHdpbGwgbm90IGJlIGNsZWFyZWQsIGFuZCByZW1vdmVfbWlncmF0aW9uX3B0ZXMoKSBuZWVkcyB0bworICogZGVhbCB3aXRoIGl0LiAgRm9ydHVuYXRlbHksIHRoaXMgcGFydCBvZiB0aGUgdm1hIGlzIG9mIGNvdXJzZSBzdGlsbCBsaW5lYXIsCisgKiBzbyB3ZSBqdXN0IG5lZWQgdG8gdXNlIGxpbmVhciBsb2NhdGlvbiBvbiB0aGUgbm9ubGluZWFyIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX2xpbmVhcl9taWdyYXRpb25fcHRlc19mcm9tX25vbmxpbmVhcihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwkvKiBodWdldGxiZnMgZG9lcyBub3Qgc3VwcG9ydCByZW1hcF9wYWdlcywgc28gbm8gaHVnZSBwZ29mZiB3b3JyaWVzICovCisJcGdvZmZfdCBwZ29mZiA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gUEFHRV9TSElGVCk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bWEsCisJCSZtYXBwaW5nLT5pX21tYXBfbm9ubGluZWFyLCBzaGFyZWQubm9ubGluZWFyKSB7CisKKwkJYWRkciA9IHZtYS0+dm1fc3RhcnQgKyAoKHBnb2ZmIC0gdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVCk7CisJCWlmIChhZGRyID49IHZtYS0+dm1fc3RhcnQgJiYgYWRkciA8IHZtYS0+dm1fZW5kKQorCQkJcmVtb3ZlX21pZ3JhdGlvbl9wdGUocGFnZSwgdm1hLCBhZGRyLCBhcmcpOworCX0KKwlyZXR1cm4gU1dBUF9BR0FJTjsKK30KKworLyoKICAqIEdldCByaWQgb2YgYWxsIG1pZ3JhdGlvbiBlbnRyaWVzIGFuZCByZXBsYWNlIHRoZW0gYnkKICAqIHJlZmVyZW5jZXMgdG8gdGhlIGluZGljYXRlZCBwYWdlLgogICovCkBAIC0xODYsNiArMjE3LDcgQEAKIAlzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0gewogCQkucm1hcF9vbmUgPSByZW1vdmVfbWlncmF0aW9uX3B0ZSwKIAkJLmFyZyA9IG9sZCwKKwkJLmZpbGVfbm9ubGluZWFyID0gcmVtb3ZlX2xpbmVhcl9taWdyYXRpb25fcHRlc19mcm9tX25vbmxpbmVhciwKIAl9OwogCiAJcm1hcF93YWxrKG5ldywgJnJ3Yyk7CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggMjBmZjBjMy4uODFiYTU0ZiAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtMjkxOCw3ICsyOTE4LDcgQEAKICAqIFRoZSBhcnJheSBwb2ludGVyIGFuZCB0aGUgcGFnZXMgaXQgcG9pbnRzIHRvIGFyZSBhc3N1bWVkIHRvIHN0YXkgYWxpdmUKICAqIGZvciBhcyBsb25nIGFzIHRoaXMgbWFwcGluZyBtaWdodCBleGlzdC4KICAqLwotaW50IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorc3RydWN0IHZtX2FyZWFfc3RydWN0ICpfaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHZtX2ZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQogewpAQCAtMjkyNyw3ICsyOTI3LDcgQEAKIAogCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkodm1hID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmdm1hLT5hbm9uX3ZtYV9jaGFpbik7CiAJdm1hLT52bV9tbSA9IG1tOwpAQCAtMjk0OCwxMSArMjk0OCwyMyBAQAogCiAJcGVyZl9ldmVudF9tbWFwKHZtYSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdm1hOwogCiBvdXQ6CiAJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworaW50IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkgICAgdW5zaWduZWQgbG9uZyB2bV9mbGFncywgc3RydWN0IHBhZ2UgKipwYWdlcykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IF9pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwKKwkJCSAgICBhZGRyLCBsZW4sIHZtX2ZsYWdzLCBwYWdlcyk7CisKKwlpZiAoSVNfRVJSKHZtYSkpCisJCXJldHVybiBQVFJfRVJSKHZtYSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBERUZJTkVfTVVURVgobW1fYWxsX2xvY2tzX211dGV4KTsKZGlmZiAtLWdpdCBhL21tL21tdV9jb250ZXh0LmMgYi9tbS9tbXVfY29udGV4dC5jCmluZGV4IDhhOGNkMDIuLmY4MDJjMmQgMTAwNjQ0Ci0tLSBhL21tL21tdV9jb250ZXh0LmMKKysrIGIvbW0vbW11X2NvbnRleHQuYwpAQCAtMzEsNiArMzEsOSBAQAogCXRzay0+bW0gPSBtbTsKIAlzd2l0Y2hfbW0oYWN0aXZlX21tLCBtbSwgdHNrKTsKIAl0YXNrX3VubG9jayh0c2spOworI2lmZGVmIGZpbmlzaF9hcmNoX3Bvc3RfbG9ja19zd2l0Y2gKKwlmaW5pc2hfYXJjaF9wb3N0X2xvY2tfc3dpdGNoKCk7CisjZW5kaWYKIAogCWlmIChhY3RpdmVfbW0gIT0gbW0pCiAJCW1tZHJvcChhY3RpdmVfbW0pOwpkaWZmIC0tZ2l0IGEvbW0vcGVyY3B1LmMgYi9tbS9wZXJjcHUuYwppbmRleCAwMzZjZmUwLi42M2UyNGZiIDEwMDY0NAotLS0gYS9tbS9wZXJjcHUuYworKysgYi9tbS9wZXJjcHUuYwpAQCAtMTAyLDEwICsxMDIsMTEgQEAKIAlpbnQJCQlmcmVlX3NpemU7CS8qIGZyZWUgYnl0ZXMgaW4gdGhlIGNodW5rICovCiAJaW50CQkJY29udGlnX2hpbnQ7CS8qIG1heCBjb250aWd1b3VzIHNpemUgaGludCAqLwogCXZvaWQJCQkqYmFzZV9hZGRyOwkvKiBiYXNlIGFkZHJlc3Mgb2YgdGhpcyBjaHVuayAqLwotCWludAkJCW1hcF91c2VkOwkvKiAjIG9mIG1hcCBlbnRyaWVzIHVzZWQgKi8KKwlpbnQJCQltYXBfdXNlZDsJLyogIyBvZiBtYXAgZW50cmllcyB1c2VkIGJlZm9yZSB0aGUgc2VudHJ5ICovCiAJaW50CQkJbWFwX2FsbG9jOwkvKiAjIG9mIG1hcCBlbnRyaWVzIGFsbG9jYXRlZCAqLwogCWludAkJCSptYXA7CQkvKiBhbGxvY2F0aW9uIG1hcCAqLwogCXZvaWQJCQkqZGF0YTsJCS8qIGNodW5rIGRhdGEgKi8KKwlpbnQJCQlmaXJzdF9mcmVlOwkvKiBubyBmcmVlIGJlbG93IHRoaXMgKi8KIAlib29sCQkJaW1tdXRhYmxlOwkvKiBubyBbZGVdcG9wdWxhdGlvbiBhbGxvd2VkICovCiAJdW5zaWduZWQgbG9uZwkJcG9wdWxhdGVkW107CS8qIHBvcHVsYXRlZCBiaXRtYXAgKi8KIH07CkBAIC0zNTYsMTEgKzM1NywxMSBAQAogewogCWludCBuZXdfYWxsb2M7CiAKLQlpZiAoY2h1bmstPm1hcF9hbGxvYyA+PSBjaHVuay0+bWFwX3VzZWQgKyAyKQorCWlmIChjaHVuay0+bWFwX2FsbG9jID49IGNodW5rLT5tYXBfdXNlZCArIDMpCiAJCXJldHVybiAwOwogCiAJbmV3X2FsbG9jID0gUENQVV9ERkxfTUFQX0FMTE9DOwotCXdoaWxlIChuZXdfYWxsb2MgPCBjaHVuay0+bWFwX3VzZWQgKyAyKQorCXdoaWxlIChuZXdfYWxsb2MgPCBjaHVuay0+bWFwX3VzZWQgKyAzKQogCQluZXdfYWxsb2MgKj0gMjsKIAogCXJldHVybiBuZXdfYWxsb2M7CkBAIC00MTgsNDggKzQxOSw2IEBACiB9CiAKIC8qKgotICogcGNwdV9zcGxpdF9ibG9jayAtIHNwbGl0IGEgbWFwIGJsb2NrCi0gKiBAY2h1bms6IGNodW5rIG9mIGludGVyZXN0Ci0gKiBAaTogaW5kZXggb2YgbWFwIGJsb2NrIHRvIHNwbGl0Ci0gKiBAaGVhZDogaGVhZCBzaXplIGluIGJ5dGVzIChjYW4gYmUgMCkKLSAqIEB0YWlsOiB0YWlsIHNpemUgaW4gYnl0ZXMgKGNhbiBiZSAwKQotICoKLSAqIFNwbGl0IHRoZSBAaSd0aCBtYXAgYmxvY2sgaW50byB0d28gb3IgdGhyZWUgYmxvY2tzLiAgSWYgQGhlYWQgaXMKLSAqIG5vbi16ZXJvLCBAaGVhZCBieXRlcyBibG9jayBpcyBpbnNlcnRlZCBiZWZvcmUgYmxvY2sgQGkgbW92aW5nIGl0Ci0gKiB0byBAaSsxIGFuZCByZWR1Y2luZyBpdHMgc2l6ZSBieSBAaGVhZCBieXRlcy4KLSAqCi0gKiBJZiBAdGFpbCBpcyBub24temVybywgdGhlIHRhcmdldCBibG9jaywgd2hpY2ggY2FuIGJlIEBpIG9yIEBpKzEKLSAqIGRlcGVuZGluZyBvbiBAaGVhZCwgaXMgcmVkdWNlZCBieSBAdGFpbCBieXRlcyBhbmQgQHRhaWwgYnl0ZSBibG9jawotICogaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHRhcmdldCBibG9jay4KLSAqCi0gKiBAY2h1bmstPm1hcCBtdXN0IGhhdmUgZW5vdWdoIGZyZWUgc2xvdHMgdG8gYWNjb21tb2RhdGUgdGhlIHNwbGl0LgotICoKLSAqIENPTlRFWFQ6Ci0gKiBwY3B1X2xvY2suCi0gKi8KLXN0YXRpYyB2b2lkIHBjcHVfc3BsaXRfYmxvY2soc3RydWN0IHBjcHVfY2h1bmsgKmNodW5rLCBpbnQgaSwKLQkJCSAgICAgaW50IGhlYWQsIGludCB0YWlsKQotewotCWludCBucl9leHRyYSA9ICEhaGVhZCArICEhdGFpbDsKLQotCUJVR19PTihjaHVuay0+bWFwX2FsbG9jIDwgY2h1bmstPm1hcF91c2VkICsgbnJfZXh0cmEpOwotCi0JLyogaW5zZXJ0IG5ldyBzdWJibG9ja3MgKi8KLQltZW1tb3ZlKCZjaHVuay0+bWFwW2kgKyBucl9leHRyYV0sICZjaHVuay0+bWFwW2ldLAotCQlzaXplb2YoY2h1bmstPm1hcFswXSkgKiAoY2h1bmstPm1hcF91c2VkIC0gaSkpOwotCWNodW5rLT5tYXBfdXNlZCArPSBucl9leHRyYTsKLQotCWlmIChoZWFkKSB7Ci0JCWNodW5rLT5tYXBbaSArIDFdID0gY2h1bmstPm1hcFtpXSAtIGhlYWQ7Ci0JCWNodW5rLT5tYXBbaSsrXSA9IGhlYWQ7Ci0JfQotCWlmICh0YWlsKSB7Ci0JCWNodW5rLT5tYXBbaSsrXSAtPSB0YWlsOwotCQljaHVuay0+bWFwW2ldID0gdGFpbDsKLQl9Ci19Ci0KLS8qKgogICogcGNwdV9hbGxvY19hcmVhIC0gYWxsb2NhdGUgYXJlYSBmcm9tIGEgcGNwdV9jaHVuawogICogQGNodW5rOiBjaHVuayBvZiBpbnRlcmVzdAogICogQHNpemU6IHdhbnRlZCBzaXplIGluIGJ5dGVzCkBAIC00ODMsMTkgKzQ0MiwyNyBAQAogCWludCBvc2xvdCA9IHBjcHVfY2h1bmtfc2xvdChjaHVuayk7CiAJaW50IG1heF9jb250aWcgPSAwOwogCWludCBpLCBvZmY7CisJYm9vbCBzZWVuX2ZyZWUgPSBmYWxzZTsKKwlpbnQgKnA7CiAKLQlmb3IgKGkgPSAwLCBvZmYgPSAwOyBpIDwgY2h1bmstPm1hcF91c2VkOyBvZmYgKz0gYWJzKGNodW5rLT5tYXBbaSsrXSkpIHsKLQkJYm9vbCBpc19sYXN0ID0gaSArIDEgPT0gY2h1bmstPm1hcF91c2VkOworCWZvciAoaSA9IGNodW5rLT5maXJzdF9mcmVlLCBwID0gY2h1bmstPm1hcCArIGk7IGkgPCBjaHVuay0+bWFwX3VzZWQ7IGkrKywgcCsrKSB7CiAJCWludCBoZWFkLCB0YWlsOworCQlpbnQgdGhpc19zaXplOworCisJCW9mZiA9ICpwOworCQlpZiAob2ZmICYgMSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qIGV4dHJhIGZvciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgKi8KIAkJaGVhZCA9IEFMSUdOKG9mZiwgYWxpZ24pIC0gb2ZmOwotCQlCVUdfT04oaSA9PSAwICYmIGhlYWQgIT0gMCk7CiAKLQkJaWYgKGNodW5rLT5tYXBbaV0gPCAwKQotCQkJY29udGludWU7Ci0JCWlmIChjaHVuay0+bWFwW2ldIDwgaGVhZCArIHNpemUpIHsKLQkJCW1heF9jb250aWcgPSBtYXgoY2h1bmstPm1hcFtpXSwgbWF4X2NvbnRpZyk7CisJCXRoaXNfc2l6ZSA9IChwWzFdICYgfjEpIC0gb2ZmOworCQlpZiAodGhpc19zaXplIDwgaGVhZCArIHNpemUpIHsKKwkJCWlmICghc2Vlbl9mcmVlKSB7CisJCQkJY2h1bmstPmZpcnN0X2ZyZWUgPSBpOworCQkJCXNlZW5fZnJlZSA9IHRydWU7CisJCQl9CisJCQltYXhfY29udGlnID0gbWF4KHRoaXNfc2l6ZSwgbWF4X2NvbnRpZyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC01MDUsNDQgKzQ3Miw1OSBAQAogCQkgKiB0aGFuIHNpemVvZihpbnQpLCB3aGljaCBpcyB2ZXJ5IHNtYWxsIGJ1dCBpc24ndCB0b28KIAkJICogdW5jb21tb24gZm9yIHBlcmNwdSBhbGxvY2F0aW9ucy4KIAkJICovCi0JCWlmIChoZWFkICYmIChoZWFkIDwgc2l6ZW9mKGludCkgfHwgY2h1bmstPm1hcFtpIC0gMV0gPiAwKSkgewotCQkJaWYgKGNodW5rLT5tYXBbaSAtIDFdID4gMCkKLQkJCQljaHVuay0+bWFwW2kgLSAxXSArPSBoZWFkOwotCQkJZWxzZSB7Ci0JCQkJY2h1bmstPm1hcFtpIC0gMV0gLT0gaGVhZDsKKwkJaWYgKGhlYWQgJiYgKGhlYWQgPCBzaXplb2YoaW50KSB8fCAhKHBbLTFdICYgMSkpKSB7CisJCQkqcCA9IG9mZiArPSBoZWFkOworCQkJaWYgKHBbLTFdICYgMSkKIAkJCQljaHVuay0+ZnJlZV9zaXplIC09IGhlYWQ7Ci0JCQl9Ci0JCQljaHVuay0+bWFwW2ldIC09IGhlYWQ7Ci0JCQlvZmYgKz0gaGVhZDsKKwkJCWVsc2UKKwkJCQltYXhfY29udGlnID0gbWF4KCpwIC0gcFstMV0sIG1heF9jb250aWcpOworCQkJdGhpc19zaXplIC09IGhlYWQ7CiAJCQloZWFkID0gMDsKIAkJfQogCiAJCS8qIGlmIHRhaWwgaXMgc21hbGwsIGp1c3Qga2VlcCBpdCBhcm91bmQgKi8KLQkJdGFpbCA9IGNodW5rLT5tYXBbaV0gLSBoZWFkIC0gc2l6ZTsKLQkJaWYgKHRhaWwgPCBzaXplb2YoaW50KSkKKwkJdGFpbCA9IHRoaXNfc2l6ZSAtIGhlYWQgLSBzaXplOworCQlpZiAodGFpbCA8IHNpemVvZihpbnQpKSB7CiAJCQl0YWlsID0gMDsKKwkJCXNpemUgPSB0aGlzX3NpemUgLSBoZWFkOworCQl9CiAKIAkJLyogc3BsaXQgaWYgd2FycmFudGVkICovCiAJCWlmIChoZWFkIHx8IHRhaWwpIHsKLQkJCXBjcHVfc3BsaXRfYmxvY2soY2h1bmssIGksIGhlYWQsIHRhaWwpOworCQkJaW50IG5yX2V4dHJhID0gISFoZWFkICsgISF0YWlsOworCisJCQkvKiBpbnNlcnQgbmV3IHN1YmJsb2NrcyAqLworCQkJbWVtbW92ZShwICsgbnJfZXh0cmEgKyAxLCBwICsgMSwKKwkJCQlzaXplb2YoY2h1bmstPm1hcFswXSkgKiAoY2h1bmstPm1hcF91c2VkIC0gaSkpOworCQkJY2h1bmstPm1hcF91c2VkICs9IG5yX2V4dHJhOworCiAJCQlpZiAoaGVhZCkgewotCQkJCWkrKzsKLQkJCQlvZmYgKz0gaGVhZDsKLQkJCQltYXhfY29udGlnID0gbWF4KGNodW5rLT5tYXBbaSAtIDFdLCBtYXhfY29udGlnKTsKKwkJCQlpZiAoIXNlZW5fZnJlZSkgeworCQkJCQljaHVuay0+Zmlyc3RfZnJlZSA9IGk7CisJCQkJCXNlZW5fZnJlZSA9IHRydWU7CisJCQkJfQorCQkJCSorK3AgPSBvZmYgKz0gaGVhZDsKKwkJCQkrK2k7CisJCQkJbWF4X2NvbnRpZyA9IG1heChoZWFkLCBtYXhfY29udGlnKTsKIAkJCX0KLQkJCWlmICh0YWlsKQotCQkJCW1heF9jb250aWcgPSBtYXgoY2h1bmstPm1hcFtpICsgMV0sIG1heF9jb250aWcpOworCQkJaWYgKHRhaWwpIHsKKwkJCQlwWzFdID0gb2ZmICsgc2l6ZTsKKwkJCQltYXhfY29udGlnID0gbWF4KHRhaWwsIG1heF9jb250aWcpOworCQkJfQogCQl9CiAKKwkJaWYgKCFzZWVuX2ZyZWUpCisJCQljaHVuay0+Zmlyc3RfZnJlZSA9IGkgKyAxOworCiAJCS8qIHVwZGF0ZSBoaW50IGFuZCBtYXJrIGFsbG9jYXRlZCAqLwotCQlpZiAoaXNfbGFzdCkKKwkJaWYgKGkgKyAxID09IGNodW5rLT5tYXBfdXNlZCkKIAkJCWNodW5rLT5jb250aWdfaGludCA9IG1heF9jb250aWc7IC8qIGZ1bGx5IHNjYW5uZWQgKi8KIAkJZWxzZQogCQkJY2h1bmstPmNvbnRpZ19oaW50ID0gbWF4KGNodW5rLT5jb250aWdfaGludCwKIAkJCQkJCSBtYXhfY29udGlnKTsKIAotCQljaHVuay0+ZnJlZV9zaXplIC09IGNodW5rLT5tYXBbaV07Ci0JCWNodW5rLT5tYXBbaV0gPSAtY2h1bmstPm1hcFtpXTsKKwkJY2h1bmstPmZyZWVfc2l6ZSAtPSBzaXplOworCQkqcCB8PSAxOwogCiAJCXBjcHVfY2h1bmtfcmVsb2NhdGUoY2h1bmssIG9zbG90KTsKIAkJcmV0dXJuIG9mZjsKQEAgLTU3MCwzNCArNTUyLDUwIEBACiBzdGF0aWMgdm9pZCBwY3B1X2ZyZWVfYXJlYShzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bmssIGludCBmcmVlbWUpCiB7CiAJaW50IG9zbG90ID0gcGNwdV9jaHVua19zbG90KGNodW5rKTsKLQlpbnQgaSwgb2ZmOworCWludCBvZmYgPSAwOworCXVuc2lnbmVkIGksIGo7CisJaW50IHRvX2ZyZWUgPSAwOworCWludCAqcDsKIAotCWZvciAoaSA9IDAsIG9mZiA9IDA7IGkgPCBjaHVuay0+bWFwX3VzZWQ7IG9mZiArPSBhYnMoY2h1bmstPm1hcFtpKytdKSkKLQkJaWYgKG9mZiA9PSBmcmVlbWUpCi0JCQlicmVhazsKKwlmcmVlbWUgfD0gMTsJLyogd2UgYXJlIHNlYXJjaGluZyBmb3IgPGdpdmVuIG9mZnNldCwgaW4gdXNlPiBwYWlyICovCisKKwlpID0gMDsKKwlqID0gY2h1bmstPm1hcF91c2VkOworCXdoaWxlIChpICE9IGopIHsKKwkJdW5zaWduZWQgayA9IChpICsgaikgLyAyOworCQlvZmYgPSBjaHVuay0+bWFwW2tdOworCQlpZiAob2ZmIDwgZnJlZW1lKQorCQkJaSA9IGsgKyAxOworCQllbHNlIGlmIChvZmYgPiBmcmVlbWUpCisJCQlqID0gazsKKwkJZWxzZQorCQkJaSA9IGogPSBrOworCX0KIAlCVUdfT04ob2ZmICE9IGZyZWVtZSk7Ci0JQlVHX09OKGNodW5rLT5tYXBbaV0gPiAwKTsKIAotCWNodW5rLT5tYXBbaV0gPSAtY2h1bmstPm1hcFtpXTsKLQljaHVuay0+ZnJlZV9zaXplICs9IGNodW5rLT5tYXBbaV07CisJaWYgKGkgPCBjaHVuay0+Zmlyc3RfZnJlZSkKKwkJY2h1bmstPmZpcnN0X2ZyZWUgPSBpOwogCi0JLyogbWVyZ2Ugd2l0aCBwcmV2aW91cz8gKi8KLQlpZiAoaSA+IDAgJiYgY2h1bmstPm1hcFtpIC0gMV0gPj0gMCkgewotCQljaHVuay0+bWFwW2kgLSAxXSArPSBjaHVuay0+bWFwW2ldOwotCQljaHVuay0+bWFwX3VzZWQtLTsKLQkJbWVtbW92ZSgmY2h1bmstPm1hcFtpXSwgJmNodW5rLT5tYXBbaSArIDFdLAotCQkJKGNodW5rLT5tYXBfdXNlZCAtIGkpICogc2l6ZW9mKGNodW5rLT5tYXBbMF0pKTsKLQkJaS0tOwotCX0KKwlwID0gY2h1bmstPm1hcCArIGk7CisJKnAgPSBvZmYgJj0gfjE7CisJY2h1bmstPmZyZWVfc2l6ZSArPSAocFsxXSAmIH4xKSAtIG9mZjsKKwogCS8qIG1lcmdlIHdpdGggbmV4dD8gKi8KLQlpZiAoaSArIDEgPCBjaHVuay0+bWFwX3VzZWQgJiYgY2h1bmstPm1hcFtpICsgMV0gPj0gMCkgewotCQljaHVuay0+bWFwW2ldICs9IGNodW5rLT5tYXBbaSArIDFdOwotCQljaHVuay0+bWFwX3VzZWQtLTsKLQkJbWVtbW92ZSgmY2h1bmstPm1hcFtpICsgMV0sICZjaHVuay0+bWFwW2kgKyAyXSwKLQkJCShjaHVuay0+bWFwX3VzZWQgLSAoaSArIDEpKSAqIHNpemVvZihjaHVuay0+bWFwWzBdKSk7CisJaWYgKCEocFsxXSAmIDEpKQorCQl0b19mcmVlKys7CisJLyogbWVyZ2Ugd2l0aCBwcmV2aW91cz8gKi8KKwlpZiAoaSA+IDAgJiYgIShwWy0xXSAmIDEpKSB7CisJCXRvX2ZyZWUrKzsKKwkJaS0tOworCQlwLS07CisJfQorCWlmICh0b19mcmVlKSB7CisJCWNodW5rLT5tYXBfdXNlZCAtPSB0b19mcmVlOworCQltZW1tb3ZlKHAgKyAxLCBwICsgMSArIHRvX2ZyZWUsCisJCQkoY2h1bmstPm1hcF91c2VkIC0gaSkgKiBzaXplb2YoY2h1bmstPm1hcFswXSkpOwogCX0KIAotCWNodW5rLT5jb250aWdfaGludCA9IG1heChjaHVuay0+bWFwW2ldLCBjaHVuay0+Y29udGlnX2hpbnQpOworCWNodW5rLT5jb250aWdfaGludCA9IG1heChjaHVuay0+bWFwW2kgKyAxXSAtIGNodW5rLT5tYXBbaV0gLSAxLCBjaHVuay0+Y29udGlnX2hpbnQpOwogCXBjcHVfY2h1bmtfcmVsb2NhdGUoY2h1bmssIG9zbG90KTsKIH0KIApAQCAtNjE3LDcgKzYxNSw5IEBACiAJfQogCiAJY2h1bmstPm1hcF9hbGxvYyA9IFBDUFVfREZMX01BUF9BTExPQzsKLQljaHVuay0+bWFwW2NodW5rLT5tYXBfdXNlZCsrXSA9IHBjcHVfdW5pdF9zaXplOworCWNodW5rLT5tYXBbMF0gPSAwOworCWNodW5rLT5tYXBbMV0gPSBwY3B1X3VuaXRfc2l6ZSB8IDE7CisJY2h1bmstPm1hcF91c2VkID0gMTsKIAogCUlOSVRfTElTVF9IRUFEKCZjaHVuay0+bGlzdCk7CiAJY2h1bmstPmZyZWVfc2l6ZSA9IHBjcHVfdW5pdF9zaXplOwpAQCAtNzEzLDYgKzcxMywxNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCBfX3BlcmNwdSAqcHRyOwogCisJLyoKKwkgKiBXZSB3YW50IHRoZSBsb3dlc3QgYml0IG9mIG9mZnNldCBhdmFpbGFibGUgZm9yIGluLXVzZS9mcmVlCisJICogaW5kaWNhdG9yLCBzbyBmb3JjZSA+PSAxNmJpdCBhbGlnbm1lbnQgYW5kIG1ha2Ugc2l6ZSBldmVuLgorCSAqLworCWlmICh1bmxpa2VseShhbGlnbiA8IDIpKQorCQlhbGlnbiA9IDI7CisKKwlpZiAodW5saWtlbHkoc2l6ZSAmIDEpKQorCQlzaXplKys7CisKIAlpZiAodW5saWtlbHkoIXNpemUgfHwgc2l6ZSA+IFBDUFVfTUlOX1VOSVRfU0laRSB8fCBhbGlnbiA+IFBBR0VfU0laRSkpIHsKIAkJV0FSTih0cnVlLCAiaWxsZWdhbCBzaXplICglenUpIG9yIGFsaWduICglenUpIGZvciAiCiAJCSAgICAgInBlcmNwdSBhbGxvY2F0aW9uXG4iLCBzaXplLCBhbGlnbik7CkBAIC0xMzQzLDkgKzEzNTMsMTMgQEAKIAl9CiAJc2NodW5rLT5jb250aWdfaGludCA9IHNjaHVuay0+ZnJlZV9zaXplOwogCi0Jc2NodW5rLT5tYXBbc2NodW5rLT5tYXBfdXNlZCsrXSA9IC1haS0+c3RhdGljX3NpemU7CisJc2NodW5rLT5tYXBbMF0gPSAxOworCXNjaHVuay0+bWFwWzFdID0gYWktPnN0YXRpY19zaXplOworCXNjaHVuay0+bWFwX3VzZWQgPSAxOwogCWlmIChzY2h1bmstPmZyZWVfc2l6ZSkKLQkJc2NodW5rLT5tYXBbc2NodW5rLT5tYXBfdXNlZCsrXSA9IHNjaHVuay0+ZnJlZV9zaXplOworCQlzY2h1bmstPm1hcFsrK3NjaHVuay0+bWFwX3VzZWRdID0gMSB8IChhaS0+c3RhdGljX3NpemUgKyBzY2h1bmstPmZyZWVfc2l6ZSk7CisJZWxzZQorCQlzY2h1bmstPm1hcFsxXSB8PSAxOwogCiAJLyogaW5pdCBkeW5hbWljIGNodW5rIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChkeW5fc2l6ZSkgewpAQCAtMTM1OCw4ICsxMzcyLDEwIEBACiAJCWJpdG1hcF9maWxsKGRjaHVuay0+cG9wdWxhdGVkLCBwY3B1X3VuaXRfcGFnZXMpOwogCiAJCWRjaHVuay0+Y29udGlnX2hpbnQgPSBkY2h1bmstPmZyZWVfc2l6ZSA9IGR5bl9zaXplOwotCQlkY2h1bmstPm1hcFtkY2h1bmstPm1hcF91c2VkKytdID0gLXBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQ7Ci0JCWRjaHVuay0+bWFwW2RjaHVuay0+bWFwX3VzZWQrK10gPSBkY2h1bmstPmZyZWVfc2l6ZTsKKwkJZGNodW5rLT5tYXBbMF0gPSAxOworCQlkY2h1bmstPm1hcFsxXSA9IHBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQ7CisJCWRjaHVuay0+bWFwWzJdID0gKHBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQgKyBkY2h1bmstPmZyZWVfc2l6ZSkgfCAxOworCQlkY2h1bmstPm1hcF91c2VkID0gMjsKIAl9CiAKIAkvKiBsaW5rIHRoZSBmaXJzdCBjaHVuayBpbiAqLwpkaWZmIC0tZ2l0IGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKaW5kZXggZmQyNmQwNC4uM2M1Y2Y2OCAxMDA2NDQKLS0tIGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYworKysgYi9tbS9wcm9jZXNzX3ZtX2FjY2Vzcy5jCkBAIC00NTYsMjUgKzQ1NiwyMyBAQAogCXJldHVybiByYzsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1jb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYoY29tcGF0X3BpZF90IHBpZCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqbHZlYywKLQkJCSAgICB1bnNpZ25lZCBsb25nIGxpb3ZjbnQsCi0JCQkgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnJ2ZWMsCi0JCQkgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KHByb2Nlc3Nfdm1fcmVhZHYsIGNvbXBhdF9waWRfdCwgcGlkLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKiwgbHZlYywKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBsaW92Y250LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKiwgcnZlYywKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCByaW92Y250LAorCQkgICAgICAgY29tcGF0X3Vsb25nX3QsIGZsYWdzKQogewogCXJldHVybiBjb21wYXRfcHJvY2Vzc192bV9ydyhwaWQsIGx2ZWMsIGxpb3ZjbnQsIHJ2ZWMsCiAJCQkJICAgIHJpb3ZjbnQsIGZsYWdzLCAwKTsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1jb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KGNvbXBhdF9waWRfdCBwaWQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpsdmVjLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGxpb3ZjbnQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHJpb3ZjbnQsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU2KHByb2Nlc3Nfdm1fd3JpdGV2LCBjb21wYXRfcGlkX3QsIHBpZCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICosIGx2ZWMsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgbGlvdmNudCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICosIHJ2ZWMsCisJCSAgICAgICBjb21wYXRfdWxvbmdfdCwgcmlvdmNudCwKKwkJICAgICAgIGNvbXBhdF91bG9uZ190LCBmbGFncykKIHsKIAlyZXR1cm4gY29tcGF0X3Byb2Nlc3Nfdm1fcncocGlkLCBsdmVjLCBsaW92Y250LCBydmVjLAogCQkJCSAgICByaW92Y250LCBmbGFncywgMSk7CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggZDlkNDIzMS4uMTFjZjMyMiAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtMTE2NSw2ICsxMTY1LDE2IEBACiAJCX0KIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlLAogCQkJICAgc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHBhZ2UpKSk7CisJfSBlbHNlIGlmIChwdGVfdW51c2VkKHB0ZXZhbCkpIHsKKwkJLyoKKwkJICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm8KKwkJICogaW50ZXJlc3QgYW55bW9yZS4gU2ltcGx5IGRpc2NhcmQgdGhlIHB0ZSwgdm1zY2FuCisJCSAqIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0LgorCQkgKi8KKwkJaWYgKFBhZ2VBbm9uKHBhZ2UpKQorCQkJZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7CisJCWVsc2UKKwkJCWRlY19tbV9jb3VudGVyKG1tLCBNTV9GSUxFUEFHRVMpOwogCX0gZWxzZSBpZiAoUGFnZUFub24ocGFnZSkpIHsKIAkJc3dwX2VudHJ5X3QgZW50cnkgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKIAkJcHRlX3Qgc3dwX3B0ZTsKQEAgLTEzNjAsOCArMTM3MCw5IEBACiB9CiAKIHN0YXRpYyBpbnQgdHJ5X3RvX3VubWFwX25vbmxpbmVhcihzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdm9pZCAqYXJnKQogeworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCWludCByZXQgPSBTV0FQX0FHQUlOOwogCXVuc2lnbmVkIGxvbmcgY3Vyc29yOwogCXVuc2lnbmVkIGxvbmcgbWF4X25sX2N1cnNvciA9IDA7CkBAIC0xNjYzLDcgKzE2NzQsNyBAQAogCWlmIChsaXN0X2VtcHR5KCZtYXBwaW5nLT5pX21tYXBfbm9ubGluZWFyKSkKIAkJZ290byBkb25lOwogCi0JcmV0ID0gcndjLT5maWxlX25vbmxpbmVhcihwYWdlLCBtYXBwaW5nLCB2bWEpOworCXJldCA9IHJ3Yy0+ZmlsZV9ub25saW5lYXIocGFnZSwgbWFwcGluZywgcndjLT5hcmcpOwogCiBkb25lOgogCW11dGV4X3VubG9jaygmbWFwcGluZy0+aV9tbWFwX211dGV4KTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmMgYi9uZXQvODAyMXEvdmxhbi5jCmluZGV4IGVjOTkwOTkuLjE3NTI3M2YgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW4uYwpAQCAtMzA3LDkgKzMwNywxMSBAQAogc3RhdGljIHZvaWQgdmxhbl90cmFuc2Zlcl9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuZGV2KQogeworCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuID0gdmxhbl9kZXZfcHJpdih2bGFuZGV2KTsKKwogCXZsYW5kZXYtPmdzb19tYXhfc2l6ZSA9IGRldi0+Z3NvX21heF9zaXplOwogCi0JaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCkKKwlpZiAodmxhbl9od19vZmZsb2FkX2NhcGFibGUoZGV2LT5mZWF0dXJlcywgdmxhbi0+dmxhbl9wcm90bykpCiAJCXZsYW5kZXYtPmhhcmRfaGVhZGVyX2xlbiA9IGRldi0+aGFyZF9oZWFkZXJfbGVuOwogCWVsc2UKIAkJdmxhbmRldi0+aGFyZF9oZWFkZXJfbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBWTEFOX0hMRU47CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9kZXYuYyBiL25ldC84MDIxcS92bGFuX2Rldi5jCmluZGV4IDRiNjVhYTQuLjI3YmZlMmYgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2Rldi5jCisrKyBiL25ldC84MDIxcS92bGFuX2Rldi5jCkBAIC01NzgsNiArNTc4LDkgQEAKIAogCWRldi0+ZmVhdHVyZXMgfD0gcmVhbF9kZXYtPnZsYW5fZmVhdHVyZXMgfCBORVRJRl9GX0xMVFg7CiAJZGV2LT5nc29fbWF4X3NpemUgPSByZWFsX2Rldi0+Z3NvX21heF9zaXplOworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WTEFOX0ZFQVRVUkVTKQorCQluZXRkZXZfd2FybihyZWFsX2RldiwgIlZMQU4gZmVhdHVyZXMgYXJlIHNldCBpbmNvcnJlY3RseS4gIFEtaW4tUSBjb25maWd1cmF0aW9ucyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LlxuIik7CisKIAogCS8qIGlwdjYgc2hhcmVkIGNhcmQgcmVsYXRlZCBzdHVmZiAqLwogCWRldi0+ZGV2X2lkID0gcmVhbF9kZXYtPmRldl9pZDsKQEAgLTU5Miw3ICs1OTUsOCBAQAogI2VuZGlmCiAKIAlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IHJlYWxfZGV2LT5uZWVkZWRfaGVhZHJvb207Ci0JaWYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYKSB7CisJaWYgKHZsYW5faHdfb2ZmbG9hZF9jYXBhYmxlKHJlYWxfZGV2LT5mZWF0dXJlcywKKwkJCQkgICAgdmxhbl9kZXZfcHJpdihkZXYpLT52bGFuX3Byb3RvKSkgewogCQlkZXYtPmhlYWRlcl9vcHMgICAgICA9ICZ2bGFuX3Bhc3N0aHJ1X2hlYWRlcl9vcHM7CiAJCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gcmVhbF9kZXYtPmhhcmRfaGVhZGVyX2xlbjsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKaW5kZXggNjNmMDQ1NS4uOGZlOGI3MSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC00OSwxNCArNDksMTQgQEAKIAlicnN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKIAl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYnJzdGF0cy0+c3luY3ApOwogCi0JaWYgKCFicl9hbGxvd2VkX2luZ3Jlc3MoYnIsIGJyX2dldF92bGFuX2luZm8oYnIpLCBza2IsICZ2aWQpKQotCQlnb3RvIG91dDsKLQogCUJSX0lOUFVUX1NLQl9DQihza2IpLT5icmRldiA9IGRldjsKIAogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CiAKKwlpZiAoIWJyX2FsbG93ZWRfaW5ncmVzcyhiciwgYnJfZ2V0X3ZsYW5faW5mbyhiciksIHNrYiwgJnZpZCkpCisJCWdvdG8gb3V0OworCiAJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKQogCQlicl9mbG9vZF9kZWxpdmVyKGJyLCBza2IsIGZhbHNlKTsKIAllbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCmluZGV4IDI4ZDU0NDYuLmQwY2NhM2MgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYworKysgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKQEAgLTI5LDYgKzI5LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsICpicmRldiA9IEJSX0lOUFVUX1NLQl9DQihza2IpLT5icmRldjsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihicmRldik7CiAJc3RydWN0IHBjcHVfc3dfbmV0c3RhdHMgKmJyc3RhdHMgPSB0aGlzX2NwdV9wdHIoYnItPnN0YXRzKTsKKwlzdHJ1Y3QgbmV0X3BvcnRfdmxhbnMgKnB2OwogCiAJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYnJzdGF0cy0+c3luY3ApOwogCWJyc3RhdHMtPnJ4X3BhY2tldHMrKzsKQEAgLTM5LDE4ICs0MCwxOCBAQAogCSAqIHBhY2tldCBpcyBhbGxvd2VkIGV4Y2VwdCBpbiBwcm9taXNjIG1vZHVlIHdoZW4gc29tZW9uZQogCSAqIG1heSBiZSBydW5uaW5nIHBhY2tldCBjYXB0dXJlLgogCSAqLworCXB2ID0gYnJfZ2V0X3ZsYW5faW5mbyhicik7CiAJaWYgKCEoYnJkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmCi0JICAgICFicl9hbGxvd2VkX2VncmVzcyhiciwgYnJfZ2V0X3ZsYW5faW5mbyhiciksIHNrYikpIHsKKwkgICAgIWJyX2FsbG93ZWRfZWdyZXNzKGJyLCBwdiwgc2tiKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCX0KIAotCXNrYiA9IGJyX2hhbmRsZV92bGFuKGJyLCBicl9nZXRfdmxhbl9pbmZvKGJyKSwgc2tiKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCiAJaW5kZXYgPSBza2ItPmRldjsKIAlza2ItPmRldiA9IGJyZGV2OworCXNrYiA9IGJyX2hhbmRsZV92bGFuKGJyLCBwdiwgc2tiKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCiAJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX0xPQ0FMX0lOLCBza2IsIGluZGV2LCBOVUxMLAogCQkgICAgICAgbmV0aWZfcmVjZWl2ZV9za2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl92bGFuLmMgYi9uZXQvYnJpZGdlL2JyX3ZsYW4uYwppbmRleCA4MjQ5Y2E3Ni4uZjIzYzc0YiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl92bGFuLmMKKysrIGIvbmV0L2JyaWRnZS9icl92bGFuLmMKQEAgLTExOSwyMiArMTE5LDYgQEAKIAlrZnJlZV9yY3UodiwgcmN1KTsKIH0KIAotLyogU3RyaXAgdGhlIHRhZyBmcm9tIHRoZSBwYWNrZXQuICBXaWxsIHJldHVybiBza2Igd2l0aCB0Y2kgc2V0IDAuICAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICpicl92bGFuX3VudGFnKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7Ci0JCXNrYi0+dmxhbl90Y2kgPSAwOwotCQlyZXR1cm4gc2tiOwotCX0KLQotCXNrYi0+dmxhbl90Y2kgPSAwOwotCXNrYiA9IHZsYW5fdW50YWcoc2tiKTsKLQlpZiAoc2tiKQotCQlza2ItPnZsYW5fdGNpID0gMDsKLQotCXJldHVybiBza2I7Ci19Ci0KIHN0cnVjdCBza19idWZmICpicl9oYW5kbGVfdmxhbihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9wb3J0X3ZsYW5zICpwdiwKIAkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTQ0LDEzICsxMjgsMjcgQEAKIAlpZiAoIWJyLT52bGFuX2VuYWJsZWQpCiAJCWdvdG8gb3V0OwogCisJLyogVmxhbiBmaWx0ZXIgdGFibGUgbXVzdCBiZSBjb25maWd1cmVkIGF0IHRoaXMgcG9pbnQuICBUaGUKKwkgKiBvbmx5IGV4Y2VwdGlvbiBpcyB0aGUgYnJpZGdlIGlzIHNldCBpbiBwcm9taXNjIG1vZGUgYW5kIHRoZQorCSAqIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgdGhlIGJyaWRnZSBkZXZpY2UuICBJbiB0aGlzIGNhc2UKKwkgKiBwYXNzIHRoZSBwYWNrZXQgYXMgaXMuCisJICovCisJaWYgKCFwdikgeworCQlpZiAoKGJyLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmIHNrYi0+ZGV2ID09IGJyLT5kZXYpIHsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwogCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCB0aGUgZnJhbWUgd2FzIGZpbHRlcmVkIGFuZCBjb250YWlucwogCSAqIGEgdmFsaWQgdmxhbiBpZC4gIElmIHRoZSB2bGFuIGlkIGlzIHNldCBpbiB0aGUgdW50YWdnZWQgYml0bWFwLAogCSAqIHNlbmQgdW50YWdnZWQ7IG90aGVyd2lzZSwgc2VuZCB0YWdnZWQuCiAJICovCiAJYnJfdmxhbl9nZXRfdGFnKHNrYiwgJnZpZCk7CiAJaWYgKHRlc3RfYml0KHZpZCwgcHYtPnVudGFnZ2VkX2JpdG1hcCkpCi0JCXNrYiA9IGJyX3ZsYW5fdW50YWcoc2tiKTsKKwkJc2tiLT52bGFuX3RjaSA9IDA7CiAKIG91dDoKIAlyZXR1cm4gc2tiOwpAQCAtMTc0LDYgKzE3MiwxOCBAQAogCWlmICghdikKIAkJcmV0dXJuIGZhbHNlOwogCisJLyogSWYgdmxhbiB0eCBvZmZsb2FkIGlzIGRpc2FibGVkIG9uIGJyaWRnZSBkZXZpY2UgYW5kIGZyYW1lIHdhcworCSAqIHNlbnQgZnJvbSB2bGFuIGRldmljZSBvbiB0aGUgYnJpZGdlIGRldmljZSwgaXQgZG9lcyBub3QgaGF2ZQorCSAqIEhXIGFjY2VsZXJhdGVkIHZsYW4gdGFnLgorCSAqLworCWlmICh1bmxpa2VseSghdmxhbl90eF90YWdfcHJlc2VudChza2IpICYmCisJCSAgICAgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpIHx8CisJCSAgICAgIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMUFEKSkpKSB7CisJCXNrYiA9IHZsYW5fdW50YWcoc2tiKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwogCWVyciA9IGJyX3ZsYW5fZ2V0X3RhZyhza2IsIHZpZCk7CiAJaWYgKCEqdmlkKSB7CiAJCXUxNiBwdmlkID0gYnJfZ2V0X3B2aWQodik7CmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggZjUwMTYxZi4uOWE3NmVhZiAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMzg0LDggKzM4NCw4IEBACiAJcmV0dXJuIHNvY2tfc2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNShzZXRzb2Nrb3B0LCBpbnQsIGZkLCBpbnQsIGxldmVsLCBpbnQsIG9wdG5hbWUsCisJCSAgICAgICBjaGFyIF9fdXNlciAqLCBvcHR2YWwsIHVuc2lnbmVkIGludCwgb3B0bGVuKQogewogCWludCBlcnI7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpOwpAQCAtNTA0LDggKzUwNCw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXBucyk7CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldHNvY2tvcHQoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUoZ2V0c29ja29wdCwgaW50LCBmZCwgaW50LCBsZXZlbCwgaW50LCBvcHRuYW1lLAorCQkgICAgICAgY2hhciBfX3VzZXIgKiwgb3B0dmFsLCBpbnQgX191c2VyICosIG9wdGxlbikKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKQEAgLTczNSwxNSArNzM1LDE1IEBACiB9OwogI3VuZGVmIEFMCiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbmRtc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhzZW5kbXNnLCBpbnQsIGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiwgbXNnLCB1bnNpZ25lZCBpbnQsIGZsYWdzKQogewogCWlmIChmbGFncyAmIE1TR19DTVNHX0NPTVBBVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIF9fc3lzX3NlbmRtc2coZmQsIChzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqKW1zZywgZmxhZ3MgfCBNU0dfQ01TR19DT01QQVQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kbW1zZyhpbnQgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKm1tc2csCi0JCQkJICAgIHVuc2lnbmVkIGludCB2bGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU0KHNlbmRtbXNnLCBpbnQsIGZkLCBzdHJ1Y3QgY29tcGF0X21tc2doZHIgX191c2VyICosIG1tc2csCisJCSAgICAgICB1bnNpZ25lZCBpbnQsIHZsZW4sIHVuc2lnbmVkIGludCwgZmxhZ3MpCiB7CiAJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc1MSwyOCArNzUxLDI4IEBACiAJCQkgICAgICBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Ztc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FMyhyZWN2bXNnLCBpbnQsIGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiwgbXNnLCB1bnNpZ25lZCBpbnQsIGZsYWdzKQogewogCWlmIChmbGFncyAmIE1TR19DTVNHX0NPTVBBVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIF9fc3lzX3JlY3Ztc2coZmQsIChzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqKW1zZywgZmxhZ3MgfCBNU0dfQ01TR19DT01QQVQpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2KGludCBmZCwgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNChyZWN2LCBpbnQsIGZkLCB2b2lkIF9fdXNlciAqLCBidWYsIGNvbXBhdF9zaXplX3QsIGxlbiwgdW5zaWduZWQgaW50LCBmbGFncykKIHsKIAlyZXR1cm4gc3lzX3JlY3YoZmQsIGJ1ZiwgbGVuLCBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Zmcm9tKGludCBmZCwgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICphZGRyLAotCQkJCSAgICBpbnQgX191c2VyICphZGRybGVuKQorQ09NUEFUX1NZU0NBTExfREVGSU5FNihyZWN2ZnJvbSwgaW50LCBmZCwgdm9pZCBfX3VzZXIgKiwgYnVmLCBjb21wYXRfc2l6ZV90LCBsZW4sCisJCSAgICAgICB1bnNpZ25lZCBpbnQsIGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIGFkZHIsCisJCSAgICAgICBpbnQgX191c2VyICosIGFkZHJsZW4pCiB7CiAJcmV0dXJuIHN5c19yZWN2ZnJvbShmZCwgYnVmLCBsZW4sIGZsYWdzIHwgTVNHX0NNU0dfQ09NUEFULCBhZGRyLCBhZGRybGVuKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdm1tc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21tc2doZHIgX191c2VyICptbXNnLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgdmxlbiwgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdGltZW91dCkKK0NPTVBBVF9TWVNDQUxMX0RFRklORTUocmVjdm1tc2csIGludCwgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKiwgbW1zZywKKwkJICAgICAgIHVuc2lnbmVkIGludCwgdmxlbiwgdW5zaWduZWQgaW50LCBmbGFncywKKwkJICAgICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICosIHRpbWVvdXQpCiB7CiAJaW50IGRhdGFncmFtczsKIAlzdHJ1Y3QgdGltZXNwZWMga3RzcGVjOwpAQCAtNzk1LDcgKzc5NSw3IEBACiAJcmV0dXJuIGRhdGFncmFtczsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc29ja2V0Y2FsbChpbnQgY2FsbCwgdTMyIF9fdXNlciAqYXJncykKK0NPTVBBVF9TWVNDQUxMX0RFRklORTIoc29ja2V0Y2FsbCwgaW50LCBjYWxsLCB1MzIgX191c2VyICosIGFyZ3MpCiB7CiAJaW50IHJldDsKIAl1MzIgYVs2XTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggYjFiMGM4ZC4uYmMzYzg5NyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTIyODYsNyArMjI4Niw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNrYl9jaGVja3N1bV9oZWxwKTsKIAotX19iZTE2IHNrYl9uZXR3b3JrX3Byb3RvY29sKHN0cnVjdCBza19idWZmICpza2IpCitfX2JlMTYgc2tiX25ldHdvcmtfcHJvdG9jb2woc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpkZXB0aCkKIHsKIAlfX2JlMTYgdHlwZSA9IHNrYi0+cHJvdG9jb2w7CiAJaW50IHZsYW5fZGVwdGggPSBFVEhfSExFTjsKQEAgLTIzMTMsNiArMjMxMyw4IEBACiAJCXZsYW5fZGVwdGggKz0gVkxBTl9ITEVOOwogCX0KIAorCSpkZXB0aCA9IHZsYW5fZGVwdGg7CisKIAlyZXR1cm4gdHlwZTsKIH0KIApAQCAtMjMyNiwxMiArMjMyOCwxMyBAQAogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRVBST1RPTk9TVVBQT1JUKTsKIAlzdHJ1Y3QgcGFja2V0X29mZmxvYWQgKnB0eXBlOwotCV9fYmUxNiB0eXBlID0gc2tiX25ldHdvcmtfcHJvdG9jb2woc2tiKTsKKwlpbnQgdmxhbl9kZXB0aCA9IHNrYi0+bWFjX2xlbjsKKwlfX2JlMTYgdHlwZSA9IHNrYl9uZXR3b3JrX3Byb3RvY29sKHNrYiwgJnZsYW5fZGVwdGgpOwogCiAJaWYgKHVubGlrZWx5KCF0eXBlKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQlfX3NrYl9wdWxsKHNrYiwgc2tiLT5tYWNfbGVuKTsKKwlfX3NrYl9wdWxsKHNrYiwgdmxhbl9kZXB0aCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHR5cGUsICZvZmZsb2FkX2Jhc2UsIGxpc3QpIHsKQEAgLTI0OTgsOCArMjUwMSwxMCBAQAogCQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogeworCWludCB0bXA7CisKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fTk9ORSAmJgotCSAgICAhY2FuX2NoZWNrc3VtX3Byb3RvY29sKGZlYXR1cmVzLCBza2JfbmV0d29ya19wcm90b2NvbChza2IpKSkgeworCSAgICAhY2FuX2NoZWNrc3VtX3Byb3RvY29sKGZlYXR1cmVzLCBza2JfbmV0d29ya19wcm90b2NvbChza2IsICZ0bXApKSkgewogCQlmZWF0dXJlcyAmPSB+TkVUSUZfRl9BTExfQ1NVTTsKIAl9IGVsc2UgaWYgKGlsbGVnYWxfaGlnaGRtYShkZXYsIHNrYikpIHsKIAkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfU0c7CkBAIC00MTMwLDggKzQxMzUsOCBAQAogCQkJc3RydWN0IHNvZnRuZXRfZGF0YSAqbmV4dCA9IHJlbXNkLT5ycHNfaXBpX25leHQ7CiAKIAkJCWlmIChjcHVfb25saW5lKHJlbXNkLT5jcHUpKQotCQkJCV9fc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKHJlbXNkLT5jcHUsCi0JCQkJCQkJICAgJnJlbXNkLT5jc2QsIDApOworCQkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9hc3luYyhyZW1zZC0+Y3B1LAorCQkJCQkJCSAgICZyZW1zZC0+Y3NkKTsKIAkJCXJlbXNkID0gbmV4dDsKIAkJfQogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IGE2NjRmNzguLmRmOWU2YjEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTc0Miw3ICs3NDIsNyBAQAogCXN0cnVjdCBuZF9tc2cgKm1zZzsKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyOwogCi0JaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfQVJQKSkKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFY2KSkKIAkJcmV0dXJuIGZhbHNlOwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBzaXplb2Yoc3RydWN0IG5kX21zZykpKQogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDFhMGRhYzIuLjEyMGVlY2MgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC0yMTIxLDEyICsyMTIxLDEzIEBACiBzdGF0aWMgaW50IG5sbXNnX3BvcHVsYXRlX2ZkYl9maWxsKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICB1OCAqYWRkciwgdTMyIHBpZCwgdTMyIHNlcSwKLQkJCQkgICBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzKQorCQkJCSAgIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkJICAgaW50IG5sZmxhZ3MpCiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5kbXNnICpuZG07CiAKLQlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCpuZG0pLCBOTE1fRl9NVUxUSSk7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHR5cGUsIHNpemVvZigqbmRtKSwgbmxmbGFncyk7CiAJaWYgKCFubGgpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKQEAgLTIxNjQsNyArMjE2NSw3IEBACiAJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3V0OwogCi0JZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc2tiLCBkZXYsIGFkZHIsIDAsIDAsIHR5cGUsIE5URl9TRUxGKTsKKwllcnIgPSBubG1zZ19wb3B1bGF0ZV9mZGJfZmlsbChza2IsIGRldiwgYWRkciwgMCwgMCwgdHlwZSwgTlRGX1NFTEYsIDApOwogCWlmIChlcnIgPCAwKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlnb3RvIGVycm91dDsKQEAgLTIzODksNyArMjM5MCw4IEBACiAKIAkJZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc2tiLCBkZXYsIGhhLT5hZGRyLAogCQkJCQkgICAgICBwb3J0aWQsIHNlcSwKLQkJCQkJICAgICAgUlRNX05FV05FSUdILCBOVEZfU0VMRik7CisJCQkJCSAgICAgIFJUTV9ORVdORUlHSCwgTlRGX1NFTEYsCisJCQkJCSAgICAgIE5MTV9GX01VTFRJKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogc2tpcDoKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggODY5YzdhZi4uOTBiOTZhMSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTIxMjcsMjUgKzIxMjcsMzEgQEAKICAqCiAgKglUaGUgYGhsZW5gIGFzIGNhbGN1bGF0ZWQgYnkgc2tiX3plcm9jb3B5X2hlYWRsZW4oKSBzcGVjaWZpZXMgdGhlCiAgKgloZWFkcm9vbSBpbiB0aGUgYHRvYCBidWZmZXIuCisgKgorICoJUmV0dXJuIHZhbHVlOgorICoJMDogZXZlcnl0aGluZyBpcyBPSworICoJLUVOT01FTTogY291bGRuJ3Qgb3JwaGFuIGZyYWdzIG9mIEBmcm9tIGR1ZSB0byBsYWNrIG9mIG1lbW9yeQorICoJLUVGQVVMVDogc2tiX2NvcHlfYml0cygpIGZvdW5kIHNvbWUgcHJvYmxlbSB3aXRoIHNrYiBnZW9tZXRyeQogICovCi12b2lkCi1za2JfemVyb2NvcHkoc3RydWN0IHNrX2J1ZmYgKnRvLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSwgaW50IGxlbiwgaW50IGhsZW4pCitpbnQKK3NrYl96ZXJvY29weShzdHJ1Y3Qgc2tfYnVmZiAqdG8sIHN0cnVjdCBza19idWZmICpmcm9tLCBpbnQgbGVuLCBpbnQgaGxlbikKIHsKIAlpbnQgaSwgaiA9IDA7CiAJaW50IHBsZW4gPSAwOyAvKiBsZW5ndGggb2Ygc2tiLT5oZWFkIGZyYWdtZW50ICovCisJaW50IHJldDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCiAJQlVHX09OKCFmcm9tLT5oZWFkX2ZyYWcgJiYgIWhsZW4pOwogCiAJLyogZG9udCBib3RoZXIgd2l0aCBzbWFsbCBwYXlsb2FkcyAqLwotCWlmIChsZW4gPD0gc2tiX3RhaWxyb29tKHRvKSkgewotCQlza2JfY29weV9iaXRzKGZyb20sIDAsIHNrYl9wdXQodG8sIGxlbiksIGxlbik7Ci0JCXJldHVybjsKLQl9CisJaWYgKGxlbiA8PSBza2JfdGFpbHJvb20odG8pKQorCQlyZXR1cm4gc2tiX2NvcHlfYml0cyhmcm9tLCAwLCBza2JfcHV0KHRvLCBsZW4pLCBsZW4pOwogCiAJaWYgKGhsZW4pIHsKLQkJc2tiX2NvcHlfYml0cyhmcm9tLCAwLCBza2JfcHV0KHRvLCBobGVuKSwgaGxlbik7CisJCXJldCA9IHNrYl9jb3B5X2JpdHMoZnJvbSwgMCwgc2tiX3B1dCh0bywgaGxlbiksIGhsZW4pOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXJldHVybiByZXQ7CiAJCWxlbiAtPSBobGVuOwogCX0gZWxzZSB7CiAJCXBsZW4gPSBtaW5fdChpbnQsIHNrYl9oZWFkbGVuKGZyb20pLCBsZW4pOwpAQCAtMjE2Myw2ICsyMTY5LDExIEBACiAJdG8tPmxlbiArPSBsZW4gKyBwbGVuOwogCXRvLT5kYXRhX2xlbiArPSBsZW4gKyBwbGVuOwogCisJaWYgKHVubGlrZWx5KHNrYl9vcnBoYW5fZnJhZ3MoZnJvbSwgR0ZQX0FUT01JQykpKSB7CisJCXNrYl90eF9lcnJvcihmcm9tKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oZnJvbSktPm5yX2ZyYWdzOyBpKyspIHsKIAkJaWYgKCFsZW4pCiAJCQlicmVhazsKQEAgLTIxNzMsNiArMjE4NCw4IEBACiAJCWorKzsKIAl9CiAJc2tiX3NoaW5mbyh0byktPm5yX2ZyYWdzID0gajsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2tiX3plcm9jb3B5KTsKIApAQCAtMjg2Niw4ICsyODc5LDkgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlpbnQgaSA9IDA7CiAJaW50IHBvczsKKwlpbnQgZHVtbXk7CiAKLQlwcm90byA9IHNrYl9uZXR3b3JrX3Byb3RvY29sKGhlYWRfc2tiKTsKKwlwcm90byA9IHNrYl9uZXR3b3JrX3Byb3RvY29sKGhlYWRfc2tiLCAmZHVtbXkpOwogCWlmICh1bmxpa2VseSghcHJvdG8pKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZ3JlX2RlbXV4LmMgYi9uZXQvaXB2NC9ncmVfZGVtdXguYwppbmRleCAxODYzNDIyZi4uMjUwYmU3NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZ3JlX2RlbXV4LmMKKysrIGIvbmV0L2lwdjQvZ3JlX2RlbXV4LmMKQEAgLTE4Miw2ICsxODIsMTQgQEAKIAlpbnQgaTsKIAlib29sIGNzdW1fZXJyID0gZmFsc2U7CiAKKyNpZmRlZiBDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVAorCWlmIChpcHY0X2lzX211bHRpY2FzdChpcF9oZHIoc2tiKS0+ZGFkZHIpKSB7CisJCS8qIExvb3BlZCBiYWNrIHBhY2tldCwgZHJvcCBpdCEgKi8KKwkJaWYgKHJ0X2lzX291dHB1dF9yb3V0ZShza2JfcnRhYmxlKHNrYikpKQorCQkJZ290byBkcm9wOworCX0KKyNlbmRpZgorCiAJaWYgKHBhcnNlX2dyZV9oZWFkZXIoc2tiLCAmdHBpLCAmY3N1bV9lcnIpIDwgMCkKIAkJZ290byBkcm9wOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF90dW5uZWwuYyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCmluZGV4IDc4YTg5ZTYuLmE4MmEyMmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCkBAIC00MTYsOSArNDE2LDYgQEAKIAogI2lmZGVmIENPTkZJR19ORVRfSVBHUkVfQlJPQURDQVNUCiAJaWYgKGlwdjRfaXNfbXVsdGljYXN0KGlwaC0+ZGFkZHIpKSB7Ci0JCS8qIExvb3BlZCBiYWNrIHBhY2tldCwgZHJvcCBpdCEgKi8KLQkJaWYgKHJ0X2lzX291dHB1dF9yb3V0ZShza2JfcnRhYmxlKHNrYikpKQotCQkJZ290byBkcm9wOwogCQl0dW5uZWwtPmRldi0+c3RhdHMubXVsdGljYXN0Kys7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMgYi9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jCmluZGV4IDZmODQ3ZGQuLjhkNjk2MjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfdHVubmVsX2NvcmUuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAJbmZfcmVzZXQoc2tiKTsKIAlzZWNwYXRoX3Jlc2V0KHNrYik7CiAJc2tiX2NsZWFyX2hhc2hfaWZfbm90X2w0KHNrYik7CisJc2tiX2RzdF9kcm9wKHNrYik7CiAJc2tiLT52bGFuX3RjaSA9IDA7CiAJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgMCk7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IGI5YjM0NzIuLjI4ODYzNTcwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC0yMjU1LDEzICsyMjU1LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgaXBtcl9maWxsX21yb3V0ZShzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCBzdHJ1Y3QgbWZjX2NhY2hlICpjLCBpbnQgY21kKQorCQkJICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHN0cnVjdCBtZmNfY2FjaGUgKmMsIGludCBjbWQsCisJCQkgICAgaW50IGZsYWdzKQogewogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBydG1zZyAqcnRtOwogCWludCBlcnI7CiAKLQlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgY21kLCBzaXplb2YoKnJ0bSksIE5MTV9GX01VTFRJKTsKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgY21kLCBzaXplb2YoKnJ0bSksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKQEAgLTIzMjksNyArMjMzMCw3IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAotCWVyciA9IGlwbXJfZmlsbF9tcm91dGUobXJ0LCBza2IsIDAsIDAsIG1mYywgY21kKTsKKwllcnIgPSBpcG1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLCAwLCAwLCBtZmMsIGNtZCwgMCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3V0OwogCkBAIC0yMzY4LDcgKzIzNjksOCBAQAogCQkJCWlmIChpcG1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLAogCQkJCQkJICAgICBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkJICAgICBtZmMsIFJUTV9ORVdST1VURSkgPCAwKQorCQkJCQkJICAgICBtZmMsIFJUTV9ORVdST1VURSwKKwkJCQkJCSAgICAgTkxNX0ZfTVVMVEkpIDwgMCkKIAkJCQkJZ290byBkb25lOwogbmV4dF9lbnRyeToKIAkJCQllKys7CkBAIC0yMzgyLDcgKzIzODQsOCBAQAogCQkJaWYgKGlwbXJfZmlsbF9tcm91dGUobXJ0LCBza2IsCiAJCQkJCSAgICAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCiAJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgICAgIG1mYywgUlRNX05FV1JPVVRFKSA8IDApIHsKKwkJCQkJICAgICBtZmMsIFJUTV9ORVdST1VURSwKKwkJCQkJICAgICBOTE1fRl9NVUxUSSkgPCAwKSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCAzY2Y5NzY1MS4uMWU0ZWFjNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0yNjI4LDcgKzI2MjgsNyBAQAogewogCV9fYmUzMiBkZXN0LCBzcmM7CiAJX191MTYgZGVzdHAsIHNyY3A7Ci0JbG9uZyBkZWx0YSA9IHR3LT50d190dGQgLSBqaWZmaWVzOworCXMzMiBkZWx0YSA9IHR3LT50d190dGQgLSBpbmV0X3R3X3RpbWVfc3RhbXAoKTsKIAogCWRlc3QgID0gdHctPnR3X2RhZGRyOwogCXNyYyAgID0gdHctPnR3X3Jjdl9zYWRkcjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IDM0NGU5NzIuLjZjN2ZhMDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMTMzLDEwICsxMzMsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBpbmV0Nl9hZGRyX2xzdFtJTjZfQUREUl9IU0laRV07CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFkZHJjb25mX2hhc2hfbG9jayk7CiAKLXN0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeV9ydG5sKHZvaWQpOworc3RhdGljIHZvaWQgYWRkcmNvbmZfdmVyaWZ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCi1zdGF0aWMgREVGSU5FX1RJTUVSKGFkZHJfY2hrX3RpbWVyLCBhZGRyY29uZl92ZXJpZnksIDAsIDApOwotc3RhdGljIERFRklORV9TUElOTE9DSyhhZGRyY29uZl92ZXJpZnlfbG9jayk7CitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFkZHJjb25mX3dxOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGFkZHJfY2hrX3dvcmssIGFkZHJjb25mX3ZlcmlmeV93b3JrKTsKIAogc3RhdGljIHZvaWQgYWRkcmNvbmZfam9pbl9hbnljYXN0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCk7CiBzdGF0aWMgdm9pZCBhZGRyY29uZl9sZWF2ZV9hbnljYXN0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCk7CkBAIC0xNTEsNyArMTUzLDcgQEAKIAkJCQkJCSAgdTMyIGZsYWdzLCB1MzIgbm9mbGFncyk7CiAKIHN0YXRpYyB2b2lkIGFkZHJjb25mX2RhZF9zdGFydChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApOwotc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpOwogc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX2NvbXBsZXRlZChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApOwogc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3J1bihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKIHN0YXRpYyB2b2lkIGFkZHJjb25mX3JzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CkBAIC0yNDcsOSArMjQ5LDkgQEAKIAkJX19pbjZfZGV2X3B1dChpZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgYWRkcmNvbmZfZGVsX2RhZF90aW1lcihzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCitzdGF0aWMgdm9pZCBhZGRyY29uZl9kZWxfZGFkX3dvcmsoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewotCWlmIChkZWxfdGltZXIoJmlmcC0+ZGFkX3RpbWVyKSkKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmaWZwLT5kYWRfd29yaykpCiAJCV9faW42X2lmYV9wdXQoaWZwKTsKIH0KIApAQCAtMjYxLDEyICsyNjMsMTIgQEAKIAltb2RfdGltZXIoJmlkZXYtPnJzX3RpbWVyLCBqaWZmaWVzICsgd2hlbik7CiB9CiAKLXN0YXRpYyB2b2lkIGFkZHJjb25mX21vZF9kYWRfdGltZXIoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgd2hlbikKK3N0YXRpYyB2b2lkIGFkZHJjb25mX21vZF9kYWRfd29yayhzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAsCisJCQkJICAgdW5zaWduZWQgbG9uZyBkZWxheSkKIHsKLQlpZiAoIXRpbWVyX3BlbmRpbmcoJmlmcC0+ZGFkX3RpbWVyKSkKKwlpZiAoIWRlbGF5ZWRfd29ya19wZW5kaW5nKCZpZnAtPmRhZF93b3JrKSkKIAkJaW42X2lmYV9ob2xkKGlmcCk7Ci0JbW9kX3RpbWVyKCZpZnAtPmRhZF90aW1lciwgamlmZmllcyArIHdoZW4pOworCW1vZF9kZWxheWVkX3dvcmsoYWRkcmNvbmZfd3EsICZpZnAtPmRhZF93b3JrLCBkZWxheSk7CiB9CiAKIHN0YXRpYyBpbnQgc25tcDZfYWxsb2NfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCkBAIC03NTEsOCArNzUzLDkgQEAKIAogCWluNl9kZXZfcHV0KGlmcC0+aWRldik7CiAKLQlpZiAoZGVsX3RpbWVyKCZpZnAtPmRhZF90aW1lcikpCi0JCXByX25vdGljZSgiVGltZXIgaXMgc3RpbGwgcnVubmluZywgd2hlbiBmcmVlaW5nIGlmYT0lcFxuIiwgaWZwKTsKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmaWZwLT5kYWRfd29yaykpCisJCXByX25vdGljZSgiZGVsYXllZCBEQUQgd29yayB3YXMgcGVuZGluZyB3aGlsZSBmcmVlaW5nIGlmYT0lcFxuIiwKKwkJCSAgaWZwKTsKIAogCWlmIChpZnAtPnN0YXRlICE9IElORVQ2X0lGQUREUl9TVEFURV9ERUFEKSB7CiAJCXByX3dhcm4oIkZyZWVpbmcgYWxpdmUgaW5ldDYgYWRkcmVzcyAlcFxuIiwgaWZwKTsKQEAgLTg0OSw4ICs4NTIsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJmlmYS0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmlmYS0+c3RhdGVfbG9jayk7Ci0Jc2V0dXBfdGltZXIoJmlmYS0+ZGFkX3RpbWVyLCBhZGRyY29uZl9kYWRfdGltZXIsCi0JCSAgICAodW5zaWduZWQgbG9uZylpZmEpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZmEtPmRhZF93b3JrLCBhZGRyY29uZl9kYWRfd29yayk7CiAJSU5JVF9ITElTVF9OT0RFKCZpZmEtPmFkZHJfbHN0KTsKIAlpZmEtPnNjb3BlID0gc2NvcGU7CiAJaWZhLT5wcmVmaXhfbGVuID0gcGZ4bGVuOwpAQCAtOTkwLDYgKzk5Miw4IEBACiAJZW51bSBjbGVhbnVwX3ByZWZpeF9ydF90IGFjdGlvbiA9IENMRUFOVVBfUFJFRklYX1JUX05PUDsKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CiAKKwlBU1NFUlRfUlROTCgpOworCiAJc3Bpbl9sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOwogCXN0YXRlID0gaWZwLT5zdGF0ZTsKIAlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX0RFQUQ7CkBAIC0xMDIxLDcgKzEwMjUsNyBAQAogCiAJd3JpdGVfdW5sb2NrX2JoKCZpZnAtPmlkZXYtPmxvY2spOwogCi0JYWRkcmNvbmZfZGVsX2RhZF90aW1lcihpZnApOworCWFkZHJjb25mX2RlbF9kYWRfd29yayhpZnApOwogCiAJaXB2Nl9pZmFfbm90aWZ5KFJUTV9ERUxBRERSLCBpZnApOwogCkBAIC0xNjA0LDcgKzE2MDgsNyBAQAogewogCWlmIChpZnAtPmZsYWdzJklGQV9GX1BFUk1BTkVOVCkgewogCQlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7Ci0JCWFkZHJjb25mX2RlbF9kYWRfdGltZXIoaWZwKTsKKwkJYWRkcmNvbmZfZGVsX2RhZF93b3JrKGlmcCk7CiAJCWlmcC0+ZmxhZ3MgfD0gSUZBX0ZfVEVOVEFUSVZFOwogCQlpZiAoZGFkX2ZhaWxlZCkKIAkJCWlmcC0+ZmxhZ3MgfD0gSUZBX0ZfREFERkFJTEVEOwpAQCAtMTYyNSwyMCArMTYyOSwyMSBAQAogCQkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAJCX0KIAkJaXB2Nl9kZWxfYWRkcihpZnApOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWlwdjZfZGVsX2FkZHIoaWZwKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYWRkcmNvbmZfZGFkX2VuZChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCiB7CiAJaW50IGVyciA9IC1FTk9FTlQ7CiAKLQlzcGluX2xvY2soJmlmcC0+c3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOwogCWlmIChpZnAtPnN0YXRlID09IElORVQ2X0lGQUREUl9TVEFURV9EQUQpIHsKIAkJaWZwLT5zdGF0ZSA9IElORVQ2X0lGQUREUl9TVEFURV9QT1NUREFEOwogCQllcnIgPSAwOwogCX0KLQlzcGluX3VubG9jaygmaWZwLT5zdGF0ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xNjcxLDcgKzE2NzYsMTIgQEAKIAkJfQogCX0KIAotCWFkZHJjb25mX2RhZF9zdG9wKGlmcCwgMSk7CisJc3Bpbl9sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOworCS8qIHRyYW5zaXRpb24gZnJvbSBfUE9TVERBRCB0byBfRVJSREFEICovCisJaWZwLT5zdGF0ZSA9IElORVQ2X0lGQUREUl9TVEFURV9FUlJEQUQ7CisJc3Bpbl91bmxvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CisKKwlhZGRyY29uZl9tb2RfZGFkX3dvcmsoaWZwLCAwKTsKIH0KIAogLyogSm9pbiB0byBzb2xpY2l0ZWQgYWRkciBtdWx0aWNhc3QgZ3JvdXAuICovCkBAIC0xNjgwLDYgKzE2OTAsOCBAQAogewogCXN0cnVjdCBpbjZfYWRkciBtYWRkcjsKIAorCUFTU0VSVF9SVE5MKCk7CisKIAlpZiAoZGV2LT5mbGFncyYoSUZGX0xPT1BCQUNLfElGRl9OT0FSUCkpCiAJCXJldHVybjsKIApAQCAtMTY5MSw2ICsxNzAzLDggQEAKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgbWFkZHI7CiAKKwlBU1NFUlRfUlROTCgpOworCiAJaWYgKGlkZXYtPmRldi0+ZmxhZ3MmKElGRl9MT09QQkFDS3xJRkZfTk9BUlApKQogCQlyZXR1cm47CiAKQEAgLTE3MDEsNiArMTcxNSw5IEBACiBzdGF0aWMgdm9pZCBhZGRyY29uZl9qb2luX2FueWNhc3Qoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewogCXN0cnVjdCBpbjZfYWRkciBhZGRyOworCisJQVNTRVJUX1JUTkwoKTsKKwogCWlmIChpZnAtPnByZWZpeF9sZW4gPj0gMTI3KSAvKiBSRkMgNjE2NCAqLwogCQlyZXR1cm47CiAJaXB2Nl9hZGRyX3ByZWZpeCgmYWRkciwgJmlmcC0+YWRkciwgaWZwLT5wcmVmaXhfbGVuKTsKQEAgLTE3MTIsNiArMTcyOSw5IEBACiBzdGF0aWMgdm9pZCBhZGRyY29uZl9sZWF2ZV9hbnljYXN0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKworCUFTU0VSVF9SVE5MKCk7CisKIAlpZiAoaWZwLT5wcmVmaXhfbGVuID49IDEyNykgLyogUkZDIDYxNjQgKi8KIAkJcmV0dXJuOwogCWlwdjZfYWRkcl9wcmVmaXgoJmFkZHIsICZpZnAtPmFkZHIsIGlmcC0+cHJlZml4X2xlbik7CkBAIC0yMjcxLDExICsyMjkxLDEzIEBACiAJCQkJcmV0dXJuOwogCQkJfQogCi0JCQlpZnAtPmZsYWdzIHw9IElGQV9GX01BTkFHRVRFTVBBRERSOwogCQkJdXBkYXRlX2xmdCA9IDA7CiAJCQljcmVhdGUgPSAxOworCQkJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOworCQkJaWZwLT5mbGFncyB8PSBJRkFfRl9NQU5BR0VURU1QQUREUjsKIAkJCWlmcC0+Y3N0YW1wID0gamlmZmllczsKIAkJCWlmcC0+dG9rZW5pemVkID0gdG9rZW5pemVkOworCQkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAJCQlhZGRyY29uZl9kYWRfc3RhcnQoaWZwKTsKIAkJfQogCkBAIC0yMzI2LDcgKzIzNDgsNyBAQAogCQkJCQkgY3JlYXRlLCBub3cpOwogCiAJCQlpbjZfaWZhX3B1dChpZnApOwotCQkJYWRkcmNvbmZfdmVyaWZ5KDApOworCQkJYWRkcmNvbmZfdmVyaWZ5KCk7CiAJCX0KIAl9CiAJaW5ldDZfcHJlZml4X25vdGlmeShSVE1fTkVXUFJFRklYLCBpbjZfZGV2LCBwaW5mbyk7CkBAIC0yNDc1LDcgKzI0OTcsNyBAQAogCQkJbWFuYWdlX3RlbXBhZGRycyhpZGV2LCBpZnAsIHZhbGlkX2xmdCwgcHJlZmVyZWRfbGZ0LAogCQkJCQkgdHJ1ZSwgamlmZmllcyk7CiAJCWluNl9pZmFfcHV0KGlmcCk7Ci0JCWFkZHJjb25mX3ZlcmlmeSgwKTsKKwkJYWRkcmNvbmZfdmVyaWZ5X3J0bmwoKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMDExLDcgKzMwMzMsNyBAQAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaWZhLCBoLCBhZGRyX2xzdCkgewogCQkJaWYgKGlmYS0+aWRldiA9PSBpZGV2KSB7CiAJCQkJaGxpc3RfZGVsX2luaXRfcmN1KCZpZmEtPmFkZHJfbHN0KTsKLQkJCQlhZGRyY29uZl9kZWxfZGFkX3RpbWVyKGlmYSk7CisJCQkJYWRkcmNvbmZfZGVsX2RhZF93b3JrKGlmYSk7CiAJCQkJZ290byByZXN0YXJ0OwogCQkJfQogCQl9CkBAIC0zMDQ5LDcgKzMwNzEsNyBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmaWRldi0+YWRkcl9saXN0KSkgewogCQlpZmEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpZGV2LT5hZGRyX2xpc3QsCiAJCQkJICAgICAgIHN0cnVjdCBpbmV0Nl9pZmFkZHIsIGlmX2xpc3QpOwotCQlhZGRyY29uZl9kZWxfZGFkX3RpbWVyKGlmYSk7CisJCWFkZHJjb25mX2RlbF9kYWRfd29yayhpZmEpOwogCiAJCWxpc3RfZGVsKCZpZmEtPmlmX2xpc3QpOwogCkBAIC0zMTQ4LDEwICszMTcwLDEwIEBACiAJCXJhbmRfbnVtID0gcHJhbmRvbV91MzIoKSAlIChpZGV2LT5jbmYucnRyX3NvbGljaXRfZGVsYXkgPyA6IDEpOwogCiAJaWZwLT5kYWRfcHJvYmVzID0gaWRldi0+Y25mLmRhZF90cmFuc21pdHM7Ci0JYWRkcmNvbmZfbW9kX2RhZF90aW1lcihpZnAsIHJhbmRfbnVtKTsKKwlhZGRyY29uZl9tb2RfZGFkX3dvcmsoaWZwLCByYW5kX251bSk7CiB9CiAKLXN0YXRpYyB2b2lkIGFkZHJjb25mX2RhZF9zdGFydChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCitzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfYmVnaW4oc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlkZXYtPmRldjsKQEAgLTMyMDMsMjUgKzMyMjUsNjggQEAKIAlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGFkZHJjb25mX2RhZF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfc3RhcnQoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewotCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCA9IChzdHJ1Y3QgaW5ldDZfaWZhZGRyICopIGRhdGE7CisJYm9vbCBiZWdpbl9kYWQgPSBmYWxzZTsKKworCXNwaW5fbG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKwlpZiAoaWZwLT5zdGF0ZSAhPSBJTkVUNl9JRkFERFJfU1RBVEVfREVBRCkgeworCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX1BSRURBRDsKKwkJYmVnaW5fZGFkID0gdHJ1ZTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CisKKwlpZiAoYmVnaW5fZGFkKQorCQlhZGRyY29uZl9tb2RfZGFkX3dvcmsoaWZwLCAwKTsKK30KKworc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCA9IGNvbnRhaW5lcl9vZih0b19kZWxheWVkX3dvcmsodyksCisJCQkJCQlzdHJ1Y3QgaW5ldDZfaWZhZGRyLAorCQkJCQkJZGFkX3dvcmspOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CiAJc3RydWN0IGluNl9hZGRyIG1jYWRkcjsKIAorCWVudW0geworCQlEQURfUFJPQ0VTUywKKwkJREFEX0JFR0lOLAorCQlEQURfQUJPUlQsCisJfSBhY3Rpb24gPSBEQURfUFJPQ0VTUzsKKworCXJ0bmxfbG9jaygpOworCisJc3Bpbl9sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOworCWlmIChpZnAtPnN0YXRlID09IElORVQ2X0lGQUREUl9TVEFURV9QUkVEQUQpIHsKKwkJYWN0aW9uID0gREFEX0JFR0lOOworCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX0RBRDsKKwl9IGVsc2UgaWYgKGlmcC0+c3RhdGUgPT0gSU5FVDZfSUZBRERSX1NUQVRFX0VSUkRBRCkgeworCQlhY3Rpb24gPSBEQURfQUJPUlQ7CisJCWlmcC0+c3RhdGUgPSBJTkVUNl9JRkFERFJfU1RBVEVfUE9TVERBRDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CisKKwlpZiAoYWN0aW9uID09IERBRF9CRUdJTikgeworCQlhZGRyY29uZl9kYWRfYmVnaW4oaWZwKTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChhY3Rpb24gPT0gREFEX0FCT1JUKSB7CisJCWFkZHJjb25mX2RhZF9zdG9wKGlmcCwgMSk7CisJCWdvdG8gb3V0OworCX0KKwogCWlmICghaWZwLT5kYWRfcHJvYmVzICYmIGFkZHJjb25mX2RhZF9lbmQoaWZwKSkKIAkJZ290byBvdXQ7CiAKLQl3cml0ZV9sb2NrKCZpZGV2LT5sb2NrKTsKKwl3cml0ZV9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAlpZiAoaWRldi0+ZGVhZCB8fCAhKGlkZXYtPmlmX2ZsYWdzICYgSUZfUkVBRFkpKSB7Ci0JCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CisJCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CiAJCWdvdG8gb3V0OwogCX0KIAogCXNwaW5fbG9jaygmaWZwLT5sb2NrKTsKIAlpZiAoaWZwLT5zdGF0ZSA9PSBJTkVUNl9JRkFERFJfU1RBVEVfREVBRCkgewogCQlzcGluX3VubG9jaygmaWZwLT5sb2NrKTsKLQkJd3JpdGVfdW5sb2NrKCZpZGV2LT5sb2NrKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0zMjMyLDcgKzMyOTcsNyBAQAogCiAJCWlmcC0+ZmxhZ3MgJj0gfihJRkFfRl9URU5UQVRJVkV8SUZBX0ZfT1BUSU1JU1RJQ3xJRkFfRl9EQURGQUlMRUQpOwogCQlzcGluX3VubG9jaygmaWZwLT5sb2NrKTsKLQkJd3JpdGVfdW5sb2NrKCZpZGV2LT5sb2NrKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKIAogCQlhZGRyY29uZl9kYWRfY29tcGxldGVkKGlmcCk7CiAKQEAgLTMyNDAsMTYgKzMzMDUsMTcgQEAKIAl9CiAKIAlpZnAtPmRhZF9wcm9iZXMtLTsKLQlhZGRyY29uZl9tb2RfZGFkX3RpbWVyKGlmcCwKLQkJCSAgICAgICBORUlHSF9WQVIoaWZwLT5pZGV2LT5uZF9wYXJtcywgUkVUUkFOU19USU1FKSk7CisJYWRkcmNvbmZfbW9kX2RhZF93b3JrKGlmcCwKKwkJCSAgICAgIE5FSUdIX1ZBUihpZnAtPmlkZXYtPm5kX3Bhcm1zLCBSRVRSQU5TX1RJTUUpKTsKIAlzcGluX3VubG9jaygmaWZwLT5sb2NrKTsKLQl3cml0ZV91bmxvY2soJmlkZXYtPmxvY2spOworCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CiAKIAkvKiBzZW5kIGEgbmVpZ2hib3VyIHNvbGljaXRhdGlvbiBmb3Igb3VyIGFkZHIgKi8KIAlhZGRyY29uZl9hZGRyX3NvbGljdF9tdWx0KCZpZnAtPmFkZHIsICZtY2FkZHIpOwogCW5kaXNjX3NlbmRfbnMoaWZwLT5pZGV2LT5kZXYsIE5VTEwsICZpZnAtPmFkZHIsICZtY2FkZHIsICZpbjZhZGRyX2FueSk7CiBvdXQ6CiAJaW42X2lmYV9wdXQoaWZwKTsKKwlydG5sX3VubG9jaygpOwogfQogCiAvKiBpZnAtPmlkZXYgbXVzdCBiZSBhdCBsZWFzdCByZWFkIGxvY2tlZCAqLwpAQCAtMzI3Niw3ICszMzQyLDcgQEAKIAlzdHJ1Y3QgaW42X2FkZHIgbGxhZGRyOwogCWJvb2wgc2VuZF9ycywgc2VuZF9tbGQ7CiAKLQlhZGRyY29uZl9kZWxfZGFkX3RpbWVyKGlmcCk7CisJYWRkcmNvbmZfZGVsX2RhZF93b3JrKGlmcCk7CiAKIAkvKgogCSAqCUNvbmZpZ3VyZSB0aGUgYWRkcmVzcyBmb3IgcmVjZXB0aW9uLiBOb3cgaXQgaXMgdmFsaWQuCkBAIC0zNTE3LDIzICszNTgzLDIzIEBACiAgKglQZXJpb2RpYyBhZGRyZXNzIHN0YXR1cyB2ZXJpZmljYXRpb24KICAqLwogCi1zdGF0aWMgdm9pZCBhZGRyY29uZl92ZXJpZnkodW5zaWduZWQgbG9uZyBmb28pCitzdGF0aWMgdm9pZCBhZGRyY29uZl92ZXJpZnlfcnRubCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbm93LCBuZXh0LCBuZXh0X3NlYywgbmV4dF9zY2hlZDsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CiAJaW50IGk7CiAKKwlBU1NFUlRfUlROTCgpOworCiAJcmN1X3JlYWRfbG9ja19iaCgpOwotCXNwaW5fbG9jaygmYWRkcmNvbmZfdmVyaWZ5X2xvY2spOwogCW5vdyA9IGppZmZpZXM7CiAJbmV4dCA9IHJvdW5kX2ppZmZpZXNfdXAobm93ICsgQUREUl9DSEVDS19GUkVRVUVOQ1kpOwogCi0JZGVsX3RpbWVyKCZhZGRyX2Noa190aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWRkcl9jaGtfd29yayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSU42X0FERFJfSFNJWkU7IGkrKykgewogcmVzdGFydDoKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1X2JoKGlmcCwKLQkJCQkJICZpbmV0Nl9hZGRyX2xzdFtpXSwgYWRkcl9sc3QpIHsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1X2JoKGlmcCwgJmluZXQ2X2FkZHJfbHN0W2ldLCBhZGRyX2xzdCkgewogCQkJdW5zaWduZWQgbG9uZyBhZ2U7CiAKIAkJCS8qIFdoZW4gc2V0dGluZyBwcmVmZXJyZWRfbGZ0IHRvIGEgdmFsdWUgbm90IHplcm8gb3IKQEAgLTM2MjgsMTMgKzM2OTQsMjIgQEAKIAogCUFEQkcoS0VSTl9ERUJVRyAibm93ID0gJWx1LCBzY2hlZHVsZSA9ICVsdSwgcm91bmRlZCBzY2hlZHVsZSA9ICVsdSA9PiAlbHVcbiIsCiAJICAgICAgbm93LCBuZXh0LCBuZXh0X3NlYywgbmV4dF9zY2hlZCk7Ci0KLQlhZGRyX2Noa190aW1lci5leHBpcmVzID0gbmV4dF9zY2hlZDsKLQlhZGRfdGltZXIoJmFkZHJfY2hrX3RpbWVyKTsKLQlzcGluX3VubG9jaygmYWRkcmNvbmZfdmVyaWZ5X2xvY2spOworCW1vZF9kZWxheWVkX3dvcmsoYWRkcmNvbmZfd3EsICZhZGRyX2Noa193b3JrLCBuZXh0X3NjaGVkIC0gbm93KTsKIAlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIH0KIAorc3RhdGljIHZvaWQgYWRkcmNvbmZfdmVyaWZ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KQoreworCXJ0bmxfbG9jaygpOworCWFkZHJjb25mX3ZlcmlmeV9ydG5sKCk7CisJcnRubF91bmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgYWRkcmNvbmZfdmVyaWZ5KHZvaWQpCit7CisJbW9kX2RlbGF5ZWRfd29yayhhZGRyY29uZl93cSwgJmFkZHJfY2hrX3dvcmssIDApOworfQorCiBzdGF0aWMgc3RydWN0IGluNl9hZGRyICpleHRyYWN0X2FkZHIoc3RydWN0IG5sYXR0ciAqYWRkciwgc3RydWN0IG5sYXR0ciAqbG9jYWwsCiAJCQkJICAgICBzdHJ1Y3QgaW42X2FkZHIgKipwZWVyX3BmeCkKIHsKQEAgLTM2OTEsNiArMzc2Niw4IEBACiAJYm9vbCB3YXNfbWFuYWdldGVtcGFkZHI7CiAJYm9vbCBoYWRfcHJlZml4cm91dGU7CiAKKwlBU1NFUlRfUlROTCgpOworCiAJaWYgKCF2YWxpZF9sZnQgfHwgKHByZWZlcmVkX2xmdCA+IHZhbGlkX2xmdCkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zNzU2LDcgKzM4MzMsNyBAQAogCQkJCSAhd2FzX21hbmFnZXRlbXBhZGRyLCBqaWZmaWVzKTsKIAl9CiAKLQlhZGRyY29uZl92ZXJpZnkoMCk7CisJYWRkcmNvbmZfdmVyaWZ5X3J0bmwoKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDM4Niw2ICs0NDYzLDggQEAKIAlib29sIHVwZGF0ZV9ycyA9IGZhbHNlOwogCXN0cnVjdCBpbjZfYWRkciBsbF9hZGRyOwogCisJQVNTRVJUX1JUTkwoKTsKKwogCWlmICh0b2tlbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoaXB2Nl9hZGRyX2FueSh0b2tlbikpCkBAIC00NDM0LDcgKzQ1MTMsNyBAQAogCX0KIAogCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7Ci0JYWRkcmNvbmZfdmVyaWZ5KDApOworCWFkZHJjb25mX3ZlcmlmeV9ydG5sKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ2MzYsNiArNDcxNSw5IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChpZnAtPmlkZXYtPmRldik7CiAKKwlpZiAoZXZlbnQpCisJCUFTU0VSVF9SVE5MKCk7CisKIAlpbmV0Nl9pZmFfbm90aWZ5KGV2ZW50ID8gOiBSVE1fTkVXQUREUiwgaWZwKTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKQEAgLTUyNDQsNiArNTMyNiwxMiBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9hZGRybGFiZWw7CiAKKwlhZGRyY29uZl93cSA9IGNyZWF0ZV93b3JrcXVldWUoImlwdjZfYWRkcmNvbmYiKTsKKwlpZiAoIWFkZHJjb25mX3dxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vd3E7CisJfQorCiAJLyogVGhlIGFkZHJjb25mIG5ldGRldiBub3RpZmllciByZXF1aXJlcyB0aGF0IGxvb3BiYWNrX2RldgogCSAqIGhhcyBpdCdzIGlwdjYgcHJpdmF0ZSBpbmZvcm1hdGlvbiBhbGxvY2F0ZWQgYW5kIHNldHVwCiAJICogYmVmb3JlIGl0IGNhbiBicmluZyB1cCBhbmQgZ2l2ZSBsaW5rLWxvY2FsIGFkZHJlc3NlcwpAQCAtNTI3NCw3ICs1MzYyLDcgQEAKIAogCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXB2Nl9kZXZfbm90Zik7CiAKLQlhZGRyY29uZl92ZXJpZnkoMCk7CisJYWRkcmNvbmZfdmVyaWZ5KCk7CiAKIAlydG5sX2FmX3JlZ2lzdGVyKCZpbmV0Nl9vcHMpOwogCkBAIC01MzAyLDYgKzUzOTAsOCBAQAogCXJ0bmxfYWZfdW5yZWdpc3RlcigmaW5ldDZfb3BzKTsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXB2Nl9kZXZfbm90Zik7CiBlcnJsbzoKKwlkZXN0cm95X3dvcmtxdWV1ZShhZGRyY29uZl93cSk7CitvdXRfbm93cToKIAl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmFkZHJjb25mX29wcyk7CiBvdXRfYWRkcmxhYmVsOgogCWlwdjZfYWRkcl9sYWJlbF9jbGVhbnVwKCk7CkBAIC01MzM3LDcgKzU0MjcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBJTjZfQUREUl9IU0laRTsgaSsrKQogCQlXQVJOX09OKCFobGlzdF9lbXB0eSgmaW5ldDZfYWRkcl9sc3RbaV0pKTsKIAlzcGluX3VubG9ja19iaCgmYWRkcmNvbmZfaGFzaF9sb2NrKTsKLQotCWRlbF90aW1lcigmYWRkcl9jaGtfdGltZXIpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFkZHJfY2hrX3dvcmspOwogCXJ0bmxfdW5sb2NrKCk7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShhZGRyY29uZl93cSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMTZmOTFhMi4uNjRkNjA3MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtMTEwMSwyMSArMTEwMSwxOSBAQAogCQkJCXVuc2lnbmVkIGludCBmcmFnaGVhZGVybGVuLAogCQkJCXN0cnVjdCBza19idWZmICpza2IsCiAJCQkJc3RydWN0IHJ0Nl9pbmZvICpydCwKLQkJCQlib29sIHBtdHVwcm9iZSkKKwkJCQl1bnNpZ25lZCBpbnQgb3JpZ19tdHUpCiB7CiAJaWYgKCEocnQtPmRzdC5mbGFncyAmIERTVF9YRlJNX1RVTk5FTCkpIHsKIAkJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCQkvKiBmaXJzdCBmcmFnbWVudCwgcmVzZXJ2ZSBoZWFkZXJfbGVuICovCi0JCQkqbXR1ID0gKm10dSAtIHJ0LT5kc3QuaGVhZGVyX2xlbjsKKwkJCSptdHUgPSBvcmlnX210dSAtIHJ0LT5kc3QuaGVhZGVyX2xlbjsKIAogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIHRoaXMgZnJhZ21lbnQgaXMgbm90IGZpcnN0LCB0aGUgaGVhZGVycwogCQkJICogc3BhY2UgaXMgcmVnYXJkZWQgYXMgZGF0YSBzcGFjZS4KIAkJCSAqLwotCQkJKm10dSA9IG1pbigqbXR1LCBwbXR1cHJvYmUgPwotCQkJCSAgIHJ0LT5kc3QuZGV2LT5tdHUgOgotCQkJCSAgIGRzdF9tdHUocnQtPmRzdC5wYXRoKSk7CisJCQkqbXR1ID0gb3JpZ19tdHU7CiAJCX0KIAkJKm1heGZyYWdsZW4gPSAoKCptdHUgLSBmcmFnaGVhZGVybGVuKSAmIH43KQogCQkJICAgICAgKyBmcmFnaGVhZGVybGVuIC0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CkBAIC0xMTMyLDcgKzExMzAsNyBAQAogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAlzdHJ1Y3QgaW5ldF9jb3JrICpjb3JrOwogCXN0cnVjdCBza19idWZmICpza2IsICpza2JfcHJldiA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IG1heGZyYWdsZW4sIGZyYWdoZWFkZXJsZW4sIG10dTsKKwl1bnNpZ25lZCBpbnQgbWF4ZnJhZ2xlbiwgZnJhZ2hlYWRlcmxlbiwgbXR1LCBvcmlnX210dTsKIAlpbnQgZXh0aGRybGVuOwogCWludCBkc3RfZXh0aGRybGVuOwogCWludCBoaF9sZW47CkBAIC0xMjE0LDYgKzEyMTIsNyBAQAogCQlkc3RfZXh0aGRybGVuID0gMDsKIAkJbXR1ID0gY29yay0+ZnJhZ3NpemU7CiAJfQorCW9yaWdfbXR1ID0gbXR1OwogCiAJaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpOwogCkBAIC0xMzExLDggKzEzMTAsNyBAQAogCQkJaWYgKHNrYiA9PSBOVUxMIHx8IHNrYl9wcmV2ID09IE5VTEwpCiAJCQkJaXA2X2FwcGVuZF9kYXRhX210dSgmbXR1LCAmbWF4ZnJhZ2xlbiwKIAkJCQkJCSAgICBmcmFnaGVhZGVybGVuLCBza2IsIHJ0LAotCQkJCQkJICAgIG5wLT5wbXR1ZGlzYyA+PQotCQkJCQkJICAgIElQVjZfUE1UVURJU0NfUFJPQkUpOworCQkJCQkJICAgIG9yaWdfbXR1KTsKIAogCQkJc2tiX3ByZXYgPSBza2I7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IDBlYjQwMzguLjg3Mzc0MDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKKysrIGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtMjM0OSwxMyArMjM0OSwxNCBAQAogfQogCiBzdGF0aWMgaW50IGlwNm1yX2ZpbGxfbXJvdXRlKHN0cnVjdCBtcjZfdGFibGUgKm1ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdTMyIHBvcnRpZCwgdTMyIHNlcSwgc3RydWN0IG1mYzZfY2FjaGUgKmMsIGludCBjbWQpCisJCQkgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHN0cnVjdCBtZmM2X2NhY2hlICpjLCBpbnQgY21kLAorCQkJICAgICBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHJ0bXNnICpydG07CiAJaW50IGVycjsKIAotCW5saCA9IG5sbXNnX3B1dChza2IsIHBvcnRpZCwgc2VxLCBjbWQsIHNpemVvZigqcnRtKSwgTkxNX0ZfTVVMVEkpOworCW5saCA9IG5sbXNnX3B1dChza2IsIHBvcnRpZCwgc2VxLCBjbWQsIHNpemVvZigqcnRtKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIApAQCAtMjQyMyw3ICsyNDI0LDcgQEAKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCi0JZXJyID0gaXA2bXJfZmlsbF9tcm91dGUobXJ0LCBza2IsIDAsIDAsIG1mYywgY21kKTsKKwllcnIgPSBpcDZtcl9maWxsX21yb3V0ZShtcnQsIHNrYiwgMCwgMCwgbWZjLCBjbWQsIDApOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm91dDsKIApAQCAtMjQ2Miw3ICsyNDYzLDggQEAKIAkJCQlpZiAoaXA2bXJfZmlsbF9tcm91dGUobXJ0LCBza2IsCiAJCQkJCQkgICAgICBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJCSAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKLQkJCQkJCSAgICAgIG1mYywgUlRNX05FV1JPVVRFKSA8IDApCisJCQkJCQkgICAgICBtZmMsIFJUTV9ORVdST1VURSwKKwkJCQkJCSAgICAgIE5MTV9GX01VTFRJKSA8IDApCiAJCQkJCWdvdG8gZG9uZTsKIG5leHRfZW50cnk6CiAJCQkJZSsrOwpAQCAtMjQ3Niw3ICsyNDc4LDggQEAKIAkJCWlmIChpcDZtcl9maWxsX21yb3V0ZShtcnQsIHNrYiwKIAkJCQkJICAgICAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCiAJCQkJCSAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKLQkJCQkJICAgICAgbWZjLCBSVE1fTkVXUk9VVEUpIDwgMCkgeworCQkJCQkgICAgICBtZmMsIFJUTV9ORVdST1VURSwKKwkJCQkJICAgICAgTkxNX0ZfTVVMVEkpIDwgMCkgewogCQkJCXNwaW5fdW5sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CiAJCQkJZ290byBkb25lOwogCQkJfQpkaWZmIC0tZ2l0IGEvbmV0L2tleS9hZl9rZXkuYyBiL25ldC9rZXkvYWZfa2V5LmMKaW5kZXggMWEwNGMxMy4uNzkzMjY5NyAxMDA2NDQKLS0tIGEvbmV0L2tleS9hZl9rZXkuYworKysgYi9uZXQva2V5L2FmX2tleS5jCkBAIC00MzMsMTIgKzQzMywxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChjb25zdCBzdHJ1Y3Qgc2FkYl94X3NlY19jdHggKnNlY19jdHgpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChjb25zdCBzdHJ1Y3Qgc2FkYl94X3NlY19jdHggKnNlY19jdHgsCisJCQkJCQkJCSAgICAgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCA9IE5VTEw7CiAJaW50IGN0eF9zaXplID0gc2VjX2N0eC0+c2FkYl94X2N0eF9sZW47CiAKLQl1Y3R4ID0ga21hbGxvYygoc2l6ZW9mKCp1Y3R4KStjdHhfc2l6ZSksIEdGUF9LRVJORUwpOworCXVjdHggPSBrbWFsbG9jKChzaXplb2YoKnVjdHgpK2N0eF9zaXplKSwgZ2ZwKTsKIAogCWlmICghdWN0eCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMTI0LDcgKzExMjUsNyBAQAogCiAJc2VjX2N0eCA9IGV4dF9oZHJzW1NBREJfWF9FWFRfU0VDX0NUWCAtIDFdOwogCWlmIChzZWNfY3R4ICE9IE5VTEwpIHsKLQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChzZWNfY3R4KTsKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChzZWNfY3R4LCBHRlBfS0VSTkVMKTsKIAogCQlpZiAoIXVjdHgpCiAJCQlnb3RvIG91dDsKQEAgLTIyMzEsMTQgKzIyMzIsMTQgQEAKIAogCXNlY19jdHggPSBleHRfaGRyc1tTQURCX1hfRVhUX1NFQ19DVFggLSAxXTsKIAlpZiAoc2VjX2N0eCAhPSBOVUxMKSB7Ci0JCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCA9IHBma2V5X3NhZGIyeGZybV91c2VyX3NlY19jdHgoc2VjX2N0eCk7CisJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCA9IHBma2V5X3NhZGIyeGZybV91c2VyX3NlY19jdHgoc2VjX2N0eCwgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKCF1Y3R4KSB7CiAJCQllcnIgPSAtRU5PQlVGUzsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJnhwLT5zZWN1cml0eSwgdWN0eCk7CisJCWVyciA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKCZ4cC0+c2VjdXJpdHksIHVjdHgsIEdGUF9LRVJORUwpOwogCQlrZnJlZSh1Y3R4KTsKIAogCQlpZiAoZXJyKQpAQCAtMjMzNSwxMiArMjMzNiwxMiBAQAogCiAJc2VjX2N0eCA9IGV4dF9oZHJzW1NBREJfWF9FWFRfU0VDX0NUWCAtIDFdOwogCWlmIChzZWNfY3R4ICE9IE5VTEwpIHsKLQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChzZWNfY3R4KTsKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gcGZrZXlfc2FkYjJ4ZnJtX3VzZXJfc2VjX2N0eChzZWNfY3R4LCBHRlBfS0VSTkVMKTsKIAogCQlpZiAoIXVjdHgpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQllcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYygmcG9sX2N0eCwgdWN0eCk7CisJCWVyciA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKCZwb2xfY3R4LCB1Y3R4LCBHRlBfS0VSTkVMKTsKIAkJa2ZyZWUodWN0eCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMzIzOSw4ICszMjQwLDggQEAKIAkJfQogCQlpZiAoKCpkaXIgPSB2ZXJpZnlfc2VjX2N0eF9sZW4ocCkpKQogCQkJZ290byBvdXQ7Ci0JCXVjdHggPSBwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KHNlY19jdHgpOwotCQkqZGlyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJnhwLT5zZWN1cml0eSwgdWN0eCk7CisJCXVjdHggPSBwZmtleV9zYWRiMnhmcm1fdXNlcl9zZWNfY3R4KHNlY19jdHgsIEdGUF9BVE9NSUMpOworCQkqZGlyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJnhwLT5zZWN1cml0eSwgdWN0eCwgR0ZQX0FUT01JQyk7CiAJCWtmcmVlKHVjdHgpOwogCiAJCWlmICgqZGlyKQpkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9jb3JlLmMgYi9uZXQvbDJ0cC9sMnRwX2NvcmUuYwppbmRleCA4NWQ5ZDk0Li5jODM4MjdlIDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX2NvcmUuYworKysgYi9uZXQvbDJ0cC9sMnRwX2NvcmUuYwpAQCAtMjAxNiw3ICsyMDE2LDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCi0JbDJ0cF93cSA9IGFsbG9jX3dvcmtxdWV1ZSgibDJ0cCIsIFdRX05PTl9SRUVOVFJBTlQgfCBXUV9VTkJPVU5ELCAwKTsKKwlsMnRwX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJsMnRwIiwgV1FfVU5CT1VORCwgMCk7CiAJaWYgKCFsMnRwX3dxKSB7CiAJCXByX2VycigiYWxsb2Nfd29ya3F1ZXVlIGZhaWxlZFxuIik7CiAJCXJjID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlX2NvcmUuYwppbmRleCBmMDcyZmU4Li4xMDgxMjBmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZV9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWVfY29yZS5jCkBAIC0zNTQsMTMgKzM1NCwxNiBAQAogCiAJc2tiID0gbmZuZXRsaW5rX2FsbG9jX3NrYihuZXQsIHNpemUsIHF1ZXVlLT5wZWVyX3BvcnRpZCwKIAkJCQkgIEdGUF9BVE9NSUMpOwotCWlmICghc2tiKQorCWlmICghc2tiKSB7CisJCXNrYl90eF9lcnJvcihlbnRza2IpOwogCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCAwLCAwLAogCQkJTkZOTF9TVUJTWVNfUVVFVUUgPDwgOCB8IE5GUU5MX01TR19QQUNLRVQsCiAJCQlzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSwgMCk7CiAJaWYgKCFubGgpIHsKKwkJc2tiX3R4X2Vycm9yKGVudHNrYik7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC00ODgsMTMgKzQ5MSwxNSBAQAogCQlubGEtPm5sYV90eXBlID0gTkZRQV9QQVlMT0FEOwogCQlubGEtPm5sYV9sZW4gPSBubGFfYXR0cl9zaXplKGRhdGFfbGVuKTsKIAotCQlza2JfemVyb2NvcHkoc2tiLCBlbnRza2IsIGRhdGFfbGVuLCBobGVuKTsKKwkJaWYgKHNrYl96ZXJvY29weShza2IsIGVudHNrYiwgZGF0YV9sZW4sIGhsZW4pKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJfQogCiAJbmxoLT5ubG1zZ19sZW4gPSBza2ItPmxlbjsKIAlyZXR1cm4gc2tiOwogCiBubGFfcHV0X2ZhaWx1cmU6CisJc2tiX3R4X2Vycm9yKGVudHNrYik7CiAJa2ZyZWVfc2tiKHNrYik7CiAJbmV0X2Vycl9yYXRlbGltaXRlZCgibmZfcXVldWU6IGVycm9yIGNyZWF0aW5nIHBhY2tldCBtZXNzYWdlXG4iKTsKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKaW5kZXggZTlhNDhiYS4uMjcwYjc3ZCAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKQEAgLTQ2NCw3ICs0NjQsOSBAQAogCX0KIAlubGEtPm5sYV9sZW4gPSBubGFfYXR0cl9zaXplKHNrYi0+bGVuKTsKIAotCXNrYl96ZXJvY29weSh1c2VyX3NrYiwgc2tiLCBza2ItPmxlbiwgaGxlbik7CisJZXJyID0gc2tiX3plcm9jb3B5KHVzZXJfc2tiLCBza2IsIHNrYi0+bGVuLCBobGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAogCS8qIFBhZCBPVlNfUEFDS0VUX0FUVFJfUEFDS0VUIGlmIGxpbmVhciBjb3B5IHdhcyBwZXJmb3JtZWQgKi8KIAlpZiAoIShkcC0+dXNlcl9mZWF0dXJlcyAmIE9WU19EUF9GX1VOQUxJR05FRCkpIHsKQEAgLTQ3OCw2ICs0ODAsOCBAQAogCiAJZXJyID0gZ2VubG1zZ191bmljYXN0KG92c19kcF9nZXRfbmV0KGRwKSwgdXNlcl9za2IsIHVwY2FsbF9pbmZvLT5wb3J0aWQpOwogb3V0OgorCWlmIChlcnIpCisJCXNrYl90eF9lcnJvcihza2IpOwogCWtmcmVlX3NrYihuc2tiKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTE3NCw3ICsxMTc4LDcgQEAKIAlzdHJ1Y3QgZGF0YXBhdGggKmRwOwogCiAJZHAgPSBsb29rdXBfZGF0YXBhdGgoc29ja19uZXQoc2tiLT5zayksIGluZm8tPnVzZXJoZHIsIGluZm8tPmF0dHJzKTsKLQlpZiAoIWRwKQorCWlmIChJU19FUlIoZHApKQogCQlyZXR1cm47CiAKIAlXQVJOKGRwLT51c2VyX2ZlYXR1cmVzLCAiRHJvcHBpbmcgcHJldmlvdXNseSBhbm5vdW5jZWQgdXNlciBmZWF0dXJlc1xuIik7CkBAIC0xNzYyLDExICsxNzY2LDEyIEBACiAJaW50IGJ1Y2tldCA9IGNiLT5hcmdzWzBdLCBza2lwID0gY2ItPmFyZ3NbMV07CiAJaW50IGksIGogPSAwOwogCi0JZHAgPSBnZXRfZHAoc29ja19uZXQoc2tiLT5zayksIG92c19oZWFkZXItPmRwX2lmaW5kZXgpOwotCWlmICghZHApCi0JCXJldHVybiAtRU5PREVWOwotCiAJcmN1X3JlYWRfbG9jaygpOworCWRwID0gZ2V0X2RwKHNvY2tfbmV0KHNrYi0+c2spLCBvdnNfaGVhZGVyLT5kcF9pZmluZGV4KTsKKwlpZiAoIWRwKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJZm9yIChpID0gYnVja2V0OyBpIDwgRFBfVlBPUlRfSEFTSF9CVUNLRVRTOyBpKyspIHsKIAkJc3RydWN0IHZwb3J0ICp2cG9ydDsKIApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3cuYyBiL25ldC9vcGVudnN3aXRjaC9mbG93LmMKaW5kZXggMTZmNGI0Ni4uMjk5ODk4OSAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Zsb3cuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCkBAIC03Myw2ICs3Myw3IEBACiAKIAlpZiAoKGZsb3ctPmtleS5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkgfHwKIAkgICAgIGZsb3ctPmtleS5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUFY2KSkgJiYKKwkgICAgZmxvdy0+a2V5LmlwLmZyYWcgIT0gT1ZTX0ZSQUdfVFlQRV9MQVRFUiAmJgogCSAgICBmbG93LT5rZXkuaXAucHJvdG8gPT0gSVBQUk9UT19UQ1AgJiYKIAkgICAgbGlrZWx5KHNrYi0+bGVuID49IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpKSB7CiAJCXRjcF9mbGFncyA9IFRDUF9GTEFHU19CRTE2KHRjcF9oZHIoc2tiKSk7CkBAIC05MSw3ICs5Miw3IEBACiAJCSAgICAgICB1bnNpZ25lZCBsb25nICp1c2VkLCBfX2JlMTYgKnRjcF9mbGFncykKIHsKIAlzcGluX2xvY2soJnN0YXRzLT5sb2NrKTsKLQlpZiAodGltZV9hZnRlcihzdGF0cy0+dXNlZCwgKnVzZWQpKQorCWlmICghKnVzZWQgfHwgdGltZV9hZnRlcihzdGF0cy0+dXNlZCwgKnVzZWQpKQogCQkqdXNlZCA9IHN0YXRzLT51c2VkOwogCSp0Y3BfZmxhZ3MgfD0gc3RhdHMtPnRjcF9mbGFnczsKIAlvdnNfc3RhdHMtPm5fcGFja2V0cyArPSBzdGF0cy0+cGFja2V0X2NvdW50OwpAQCAtMTAyLDMwICsxMDMsMjQgQEAKIHZvaWQgb3ZzX2Zsb3dfc3RhdHNfZ2V0KHN0cnVjdCBzd19mbG93ICpmbG93LCBzdHJ1Y3Qgb3ZzX2Zsb3dfc3RhdHMgKm92c19zdGF0cywKIAkJCXVuc2lnbmVkIGxvbmcgKnVzZWQsIF9fYmUxNiAqdGNwX2ZsYWdzKQogewotCWludCBjcHUsIGN1cl9jcHU7CisJaW50IGNwdTsKIAogCSp1c2VkID0gMDsKIAkqdGNwX2ZsYWdzID0gMDsKIAltZW1zZXQob3ZzX3N0YXRzLCAwLCBzaXplb2YoKm92c19zdGF0cykpOwogCisJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWlmICghZmxvdy0+c3RhdHMuaXNfcGVyY3B1KSB7CiAJCXN0YXRzX3JlYWQoZmxvdy0+c3RhdHMuc3RhdCwgb3ZzX3N0YXRzLCB1c2VkLCB0Y3BfZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCWN1cl9jcHUgPSBnZXRfY3B1KCk7CiAJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0czsKIAotCQkJaWYgKGNwdSA9PSBjdXJfY3B1KQotCQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQogCQkJc3RhdHMgPSBwZXJfY3B1X3B0cihmbG93LT5zdGF0cy5jcHVfc3RhdHMsIGNwdSk7CiAJCQlzdGF0c19yZWFkKHN0YXRzLCBvdnNfc3RhdHMsIHVzZWQsIHRjcF9mbGFncyk7Ci0KLQkJCWlmIChjcHUgPT0gY3VyX2NwdSkKLQkJCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJfQotCQlwdXRfY3B1KCk7CiAJfQorCWxvY2FsX2JoX2VuYWJsZSgpOwogfQogCiBzdGF0aWMgdm9pZCBzdGF0c19yZXNldChzdHJ1Y3QgZmxvd19zdGF0cyAqc3RhdHMpCkBAIC0xNDAsMjUgKzEzNSwxNyBAQAogCiB2b2lkIG92c19mbG93X3N0YXRzX2NsZWFyKHN0cnVjdCBzd19mbG93ICpmbG93KQogewotCWludCBjcHUsIGN1cl9jcHU7CisJaW50IGNwdTsKIAorCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlpZiAoIWZsb3ctPnN0YXRzLmlzX3BlcmNwdSkgewogCQlzdGF0c19yZXNldChmbG93LT5zdGF0cy5zdGF0KTsKIAl9IGVsc2UgewotCQljdXJfY3B1ID0gZ2V0X2NwdSgpOwotCiAJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQotCQkJaWYgKGNwdSA9PSBjdXJfY3B1KQotCQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQogCQkJc3RhdHNfcmVzZXQocGVyX2NwdV9wdHIoZmxvdy0+c3RhdHMuY3B1X3N0YXRzLCBjcHUpKTsKLQotCQkJaWYgKGNwdSA9PSBjdXJfY3B1KQotCQkJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQl9Ci0JCXB1dF9jcHUoKTsKIAl9CisJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuYyBiL25ldC90aXBjL3N1YnNjci5jCmluZGV4IDExYzlhZTAuLjY0MjQzNzIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3N1YnNjci5jCisrKyBiL25ldC90aXBjL3N1YnNjci5jCkBAIC0yNjMsOSArMjYzLDkgQEAKICAqCiAgKiBDYWxsZWQgd2l0aCBzdWJzY3JpYmVyIGxvY2sgaGVsZC4KICAqLwotc3RhdGljIHN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqc3Vic2NyX3N1YnNjcmliZShzdHJ1Y3QgdGlwY19zdWJzY3IgKnMsCi0JCQkJCSAgICAgc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKLXsKK3N0YXRpYyBpbnQgc3Vic2NyX3N1YnNjcmliZShzdHJ1Y3QgdGlwY19zdWJzY3IgKnMsCisJCQkgICAgc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlciwKKwkJCSAgICBzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKipzdWJfcCkgewogCXN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqc3ViOwogCWludCBzd2FwOwogCkBAIC0yNzYsMjMgKzI3NiwyMSBAQAogCWlmIChzLT5maWx0ZXIgJiBodG9obChUSVBDX1NVQl9DQU5DRUwsIHN3YXApKSB7CiAJCXMtPmZpbHRlciAmPSB+aHRvaGwoVElQQ19TVUJfQ0FOQ0VMLCBzd2FwKTsKIAkJc3Vic2NyX2NhbmNlbChzLCBzdWJzY3JpYmVyKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAwOwogCX0KIAogCS8qIFJlZnVzZSBzdWJzY3JpcHRpb24gaWYgZ2xvYmFsIGxpbWl0IGV4Y2VlZGVkICovCiAJaWYgKGF0b21pY19yZWFkKCZzdWJzY3JpcHRpb25fY291bnQpID49IFRJUENfTUFYX1NVQlNDUklQVElPTlMpIHsKIAkJcHJfd2FybigiU3Vic2NyaXB0aW9uIHJlamVjdGVkLCBsaW1pdCByZWFjaGVkICgldSlcbiIsCiAJCQlUSVBDX01BWF9TVUJTQ1JJUFRJT05TKTsKLQkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIEFsbG9jYXRlIHN1YnNjcmlwdGlvbiBvYmplY3QgKi8KIAlzdWIgPSBrbWFsbG9jKHNpemVvZigqc3ViKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzdWIpIHsKIAkJcHJfd2FybigiU3Vic2NyaXB0aW9uIHJlamVjdGVkLCBubyBtZW1vcnlcbiIpOwotCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJLyogSW5pdGlhbGl6ZSBzdWJzY3JpcHRpb24gb2JqZWN0ICovCkBAIC0zMDYsOCArMzA0LDcgQEAKIAkgICAgKHN1Yi0+c2VxLmxvd2VyID4gc3ViLT5zZXEudXBwZXIpKSB7CiAJCXByX3dhcm4oIlN1YnNjcmlwdGlvbiByZWplY3RlZCwgaWxsZWdhbCByZXF1ZXN0XG4iKTsKIAkJa2ZyZWUoc3ViKTsKLQkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlJTklUX0xJU1RfSEVBRCgmc3ViLT5uYW1lc2VxX2xpc3QpOwogCWxpc3RfYWRkKCZzdWItPnN1YnNjcmlwdGlvbl9saXN0LCAmc3Vic2NyaWJlci0+c3Vic2NyaXB0aW9uX2xpc3QpOwpAQCAtMzIwLDggKzMxNyw4IEBACiAJCQkgICAgIChIYW5kbGVyKXN1YnNjcl90aW1lb3V0LCAodW5zaWduZWQgbG9uZylzdWIpOwogCQlrX3N0YXJ0X3RpbWVyKCZzdWItPnRpbWVyLCBzdWItPnRpbWVvdXQpOwogCX0KLQotCXJldHVybiBzdWI7CisJKnN1Yl9wID0gc3ViOworCXJldHVybiAwOwogfQogCiAvKiBIYW5kbGUgb25lIHRlcm1pbmF0aW9uIHJlcXVlc3QgZm9yIHRoZSBzdWJzY3JpYmVyICovCkBAIC0zMzUsMTAgKzMzMiwxNCBAQAogCQkJCSAgdm9pZCAqdXNyX2RhdGEsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgdGlwY19zdWJzY3JpYmVyICpzdWJzY3JpYmVyID0gdXNyX2RhdGE7Ci0Jc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWI7CisJc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWIgPSBOVUxMOwogCiAJc3Bpbl9sb2NrX2JoKCZzdWJzY3JpYmVyLT5sb2NrKTsKLQlzdWIgPSBzdWJzY3Jfc3Vic2NyaWJlKChzdHJ1Y3QgdGlwY19zdWJzY3IgKilidWYsIHN1YnNjcmliZXIpOworCWlmIChzdWJzY3Jfc3Vic2NyaWJlKChzdHJ1Y3QgdGlwY19zdWJzY3IgKilidWYsIHN1YnNjcmliZXIsICZzdWIpIDwgMCkgeworCQlzcGluX3VubG9ja19iaCgmc3Vic2NyaWJlci0+bG9jayk7CisJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJCXJldHVybjsKKwl9CiAJaWYgKHN1YikKIAkJdGlwY19uYW1ldGJsX3N1YnNjcmliZShzdWIpOwogCXNwaW5fdW5sb2NrX2JoKCZzdWJzY3JpYmVyLT5sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCBjZTZlYzZjLi45NDQwNGYxIDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC0xNzg3LDggKzE3ODcsMTEgQEAKIAkJZ290byBvdXQ7CiAKIAllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPnJlYWRsb2NrKTsKLQlpZiAoZXJyKSB7Ci0JCWVyciA9IHNvY2tfaW50cl9lcnJubyhzb2NrX3JjdnRpbWVvKHNrLCBub2Jsb2NrKSk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJLyogcmVjdm1zZygpIGluIG5vbiBibG9ja2luZyBtb2RlIGlzIHN1cHBvc2VkIHRvIHJldHVybiAtRUFHQUlOCisJCSAqIHNrX3JjdnRpbWVvIGlzIG5vdCBob25vcmVkIGJ5IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgpCisJCSAqLworCQllcnIgPSBub2Jsb2NrID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUzsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xOTEzLDYgKzE5MTYsNyBAQAogCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTsKIAlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl91biAqLCBzdW5hZGRyLCBtc2ctPm1zZ19uYW1lKTsKIAlpbnQgY29waWVkID0gMDsKKwlpbnQgbm9ibG9jayA9IGZsYWdzICYgTVNHX0RPTlRXQUlUOwogCWludCBjaGVja19jcmVkcyA9IDA7CiAJaW50IHRhcmdldDsKIAlpbnQgZXJyID0gMDsKQEAgLTE5MjgsNyArMTkzMiw3IEBACiAJCWdvdG8gb3V0OwogCiAJdGFyZ2V0ID0gc29ja19yY3Zsb3dhdChzaywgZmxhZ3MmTVNHX1dBSVRBTEwsIHNpemUpOwotCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MmTVNHX0RPTlRXQUlUKTsKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIG5vYmxvY2spOwogCiAJLyogTG9jayB0aGUgc29ja2V0IHRvIHByZXZlbnQgcXVldWUgZGlzb3JkZXJpbmcKIAkgKiB3aGlsZSBzbGVlcHMgaW4gbWVtY3B5X3RvbXNnCkBAIC0xOTQwLDggKzE5NDQsMTEgQEAKIAl9CiAKIAllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPnJlYWRsb2NrKTsKLQlpZiAoZXJyKSB7Ci0JCWVyciA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJLyogcmVjdm1zZygpIGluIG5vbiBibG9ja2luZyBtb2RlIGlzIHN1cHBvc2VkIHRvIHJldHVybiAtRUFHQUlOCisJCSAqIHNrX3JjdnRpbWVvIGlzIG5vdCBob25vcmVkIGJ5IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgpCisJCSAqLworCQllcnIgPSBub2Jsb2NrID8gLUVBR0FJTiA6IC1FUkVTVEFSVFNZUzsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3VzZXIuYyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCmluZGV4IGMyNzQxNzkuLjJmN2RkYzMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fdXNlci5jCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogCQlyZXR1cm4gMDsKIAogCXVjdHggPSBubGFfZGF0YShydCk7Ci0JcmV0dXJuIHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKCZwb2wtPnNlY3VyaXR5LCB1Y3R4KTsKKwlyZXR1cm4gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJnBvbC0+c2VjdXJpdHksIHVjdHgsIEdGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgdm9pZCBjb3B5X3RlbXBsYXRlcyhzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKnV0LApAQCAtMTYyNiw3ICsxNjI2LDcgQEAKIAkJaWYgKHJ0KSB7CiAJCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHggPSBubGFfZGF0YShydCk7CiAKLQkJCWVyciA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKCZjdHgsIHVjdHgpOworCQkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MoJmN0eCwgdWN0eCwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTE5MjgsNyArMTkyOCw3IEBACiAJCWlmIChydCkgewogCQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4ID0gbmxhX2RhdGEocnQpOwogCi0JCQllcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYygmY3R4LCB1Y3R4KTsKKwkJCWVyciA9IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKCZjdHgsIHVjdHgsIEdGUF9LRVJORUwpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQppbmRleCA1NDdlMTVkLi45M2EwZGEyIDEwMDY0NAotLS0gYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisrKyBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKQEAgLTE1NSw2ICsxNTUsMTUgQEAKICMgSW1wb3J0YW50OiBubyBzcGFjZXMgYXJvdW5kIG9wdGlvbnMKIGFyLW9wdGlvbiA9ICQoY2FsbCB0cnktcnVuLCAkKEFSKSByYyQoMSkgIiQkVE1QIiwkKDEpLCQoMikpCiAKKyMgbGQtdmVyc2lvbgorIyBVc2FnZTogJChjYWxsIGxkLXZlcnNpb24pCisjIE5vdGUgdGhpcyBpcyBtYWlubHkgZm9yIEhKIEx1J3MgMyBudW1iZXIgYmludXRpbCB2ZXJzaW9ucworbGQtdmVyc2lvbiA9ICQoc2hlbGwgJChMRCkgLS12ZXJzaW9uIHwgJChzcmN0cmVlKS9zY3JpcHRzL2xkLXZlcnNpb24uc2gpCisKKyMgbGQtaWZ2ZXJzaW9uCisjIFVzYWdlOiAgJChjYWxsIGxkLWlmdmVyc2lvbiwgLWdlLCAyMjI1MiwgeSkKK2xkLWlmdmVyc2lvbiA9ICQoc2hlbGwgWyAkKGNhbGwgbGQtdmVyc2lvbikgJCgxKSAkKDIpIF0gJiYgZWNobyAkKDMpKQorCiAjIyMjIyMKIAogIyMjCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAppbmRleCBkNWQ4NTljLi45ZjBlZTIyIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKQEAgLTE5OCw3ICsxOTgsNyBAQAogJChtdWx0aS1vYmpzLXk6Lm89LmxzdCkgOiBtb2RuYW1lID0gJChtb2RuYW1lLW11bHRpKQogCiBxdWlldF9jbWRfY2Nfc19jID0gQ0MgJChxdWlldF9tb2R0YWcpICAkQAotY21kX2NjX3NfYyAgICAgICA9ICQoQ0MpICQoY19mbGFncykgLWZ2ZXJib3NlLWFzbSAtUyAtbyAkQCAkPAorY21kX2NjX3NfYyAgICAgICA9ICQoQ0MpICQoY19mbGFncykgJChESVNBQkxFX0xUTykgLWZ2ZXJib3NlLWFzbSAtUyAtbyAkQCAkPAogCiAkKG9iaikvJS5zOiAkKHNyYykvJS5jIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX3NfYykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2NjLWxkIGIvc2NyaXB0cy9nY2MtbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkYWI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2NjLWxkCkBAIC0wLDAgKzEsMjkgQEAKKyMhL2Jpbi9zaAorIyBydW4gZ2NjIHdpdGggbGQgb3B0aW9ucworIyB1c2VkIGFzIGEgd3JhcHBlciB0byBleGVjdXRlIGxpbmsgdGltZSBvcHRpbWl6YXRpb25zCisjIHllcyB2aXJnaW5pYSwgdGhpcyBpcyBub3QgcHJldHR5CisKK0FSR1M9Ii1ub3N0ZGxpYiIKKword2hpbGUgWyAiJDEiICE9ICIiIF0gOyBkbworCWNhc2UgIiQxIiBpbgorCS1zYXZlLXRlbXBzfC1tMzJ8LW02NCkgTj0iJDEiIDs7CisJLXIpIE49IiQxIiA7OworCS1bV2ddKikgTj0iJDEiIDs7CisJLVtvbHZdfC1bT2ZkXSp8LW5vc3RkbGliKSBOPSIkMSIgOzsKKwktLWVuZC1ncm91cHwtLXN0YXJ0LWdyb3VwKQorCQkgTj0iLVdsLCQxIiA7OworCS1bUlRGR2hJZXpjYnlZdV0qfFwKKy0tc2NyaXB0fC0tZGVmc3ltfC1pbml0fC1NYXB8LS1vZm9ybWF0fC1ycGF0aHxcCistcnBhdGgtbGlua3wtLXNvcnQtc2VjdGlvbnwtLXNlY3Rpb24tc3RhcnR8LVRic3N8LVRkYXRhfC1UdGV4dHxcCistLXZlcnNpb24tc2NyaXB0fC0tZHluYW1pYy1saXN0fC0tdmVyc2lvbi1leHBvcnRzLXN5bWJvbHwtLXdyYXB8LW0pCisJCUE9IiQxIiA7IHNoaWZ0IDsgTj0iLVdsLCRBLCQxIiA7OworCS1bbV0qKSBOPSIkMSIgOzsKKwktKikgTj0iLVdsLCQxIiA7OworCSopICBOPSIkMSIgOzsKKwllc2FjCisJQVJHUz0iJEFSR1MgJE4iCisJc2hpZnQKK2RvbmUKKworZXhlYyAkQ0MgJEFSR1MKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbGQtdmVyc2lvbi5zaCBiL3NjcmlwdHMvbGQtdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTg1ODBkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9sZC12ZXJzaW9uLnNoCkBAIC0wLDAgKzEsOCBAQAorIyEvdXNyL2Jpbi9hd2sgLWYKKyMgZXh0cmFjdCBsaW5rZXIgdmVyc2lvbiBudW1iZXIgZnJvbSBzdGRpbiBhbmQgdHVybiBpbnRvIHNpbmdsZSBudW1iZXIKKwl7CisJZ3N1YigiLiopIiwgIiIpOworCXNwbGl0KCQxLGEsICIuIik7CisJcHJpbnQgYVsxXSoxMDAwMDAwMCArIGFbMl0qMTAwMDAwICsgYVszXSoxMDAwMCArIGFbNF0qMTAwICsgYVs1XTsKKwlleGl0CisJfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZGV2aWNldGFibGUtb2Zmc2V0cy5jIGIvc2NyaXB0cy9tb2QvZGV2aWNldGFibGUtb2Zmc2V0cy5jCmluZGV4IGJiNWQxMTUuLmYyODI1MTYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL2RldmljZXRhYmxlLW9mZnNldHMuYworKysgYi9zY3JpcHRzL21vZC9kZXZpY2V0YWJsZS1vZmZzZXRzLmMKQEAgLTE3NCw2ICsxNzQsOSBAQAogCURFVklEX0ZJRUxEKHg4Nl9jcHVfaWQsIG1vZGVsKTsKIAlERVZJRF9GSUVMRCh4ODZfY3B1X2lkLCB2ZW5kb3IpOwogCisJREVWSUQoY3B1X2ZlYXR1cmUpOworCURFVklEX0ZJRUxEKGNwdV9mZWF0dXJlLCBmZWF0dXJlKTsKKwogCURFVklEKG1laV9jbF9kZXZpY2VfaWQpOwogCURFVklEX0ZJRUxEKG1laV9jbF9kZXZpY2VfaWQsIG5hbWUpOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKaW5kZXggMjVlNWNiMC4uMjVmNmY1OSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCisrKyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwpAQCAtMTExMCw3ICsxMTEwLDcgQEAKIH0KIEFERF9UT19ERVZUQUJMRSgiYW1iYSIsIGFtYmFfaWQsIGRvX2FtYmFfZW50cnkpOwogCi0vKiBMT09LUyBsaWtlIHg4NmNwdTp2ZW5kb3I6VlZWVjpmYW1pbHk6RkZGRjptb2RlbDpNTU1NOmZlYXR1cmU6KixGRUFULCoKKy8qIExPT0tTIGxpa2UgY3B1OnR5cGU6eDg2LHZlblZWVlZmYW1GRkZGbW9kTU1NTTpmZWF0dXJlOiosRkVBVCwqCiAgKiBBbGwgZmllbGRzIGFyZSBudW1iZXJzLiBJdCB3b3VsZCBiZSBuaWNlciB0byB1c2Ugc3RyaW5ncyBmb3IgdmVuZG9yCiAgKiBhbmQgZmVhdHVyZSwgYnV0IGdldHRpbmcgdGhvc2Ugb3V0IG9mIHRoZSBidWlsZCBzeXN0ZW0gaGVyZSBpcyB0b28KICAqIGNvbXBsaWNhdGVkLgpAQCAtMTEyNCwxMCArMTEyNCwxMCBAQAogCURFRl9GSUVMRChzeW12YWwsIHg4Nl9jcHVfaWQsIG1vZGVsKTsKIAlERUZfRklFTEQoc3ltdmFsLCB4ODZfY3B1X2lkLCB2ZW5kb3IpOwogCi0Jc3RyY3B5KGFsaWFzLCAieDg2Y3B1OiIpOwotCUFERChhbGlhcywgInZlbmRvcjoiLCAgdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU5ZLCB2ZW5kb3IpOwotCUFERChhbGlhcywgIjpmYW1pbHk6IiwgZmFtaWx5ICE9IFg4Nl9GQU1JTFlfQU5ZLCBmYW1pbHkpOwotCUFERChhbGlhcywgIjptb2RlbDoiLCAgbW9kZWwgICE9IFg4Nl9NT0RFTF9BTlksICBtb2RlbCk7CisJc3RyY3B5KGFsaWFzLCAiY3B1OnR5cGU6eDg2LCIpOworCUFERChhbGlhcywgInZlbiIsIHZlbmRvciAhPSBYODZfVkVORE9SX0FOWSwgdmVuZG9yKTsKKwlBREQoYWxpYXMsICJmYW0iLCBmYW1pbHkgIT0gWDg2X0ZBTUlMWV9BTlksIGZhbWlseSk7CisJQUREKGFsaWFzLCAibW9kIiwgbW9kZWwgICE9IFg4Nl9NT0RFTF9BTlksICBtb2RlbCk7CiAJc3RyY2F0KGFsaWFzLCAiOmZlYXR1cmU6KiIpOwogCWlmIChmZWF0dXJlICE9IFg4Nl9GRUFUVVJFX0FOWSkKIAkJc3ByaW50ZihhbGlhcyArIHN0cmxlbihhbGlhcyksICIlMDRYKiIsIGZlYXR1cmUpOwpAQCAtMTEzNSw2ICsxMTM1LDE2IEBACiB9CiBBRERfVE9fREVWVEFCTEUoIng4NmNwdSIsIHg4Nl9jcHVfaWQsIGRvX3g4NmNwdV9lbnRyeSk7CiAKKy8qIExPT0tTIGxpa2UgY3B1OnR5cGU6KjpmZWF0dXJlOipGRUFUKiAqLworc3RhdGljIGludCBkb19jcHVfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKnN5bXZhbCwgY2hhciAqYWxpYXMpCit7CisJREVGX0ZJRUxEKHN5bXZhbCwgY3B1X2ZlYXR1cmUsIGZlYXR1cmUpOworCisJc3ByaW50ZihhbGlhcywgImNwdTp0eXBlOio6ZmVhdHVyZToqJTA0WCoiLCBmZWF0dXJlKTsKKwlyZXR1cm4gMTsKK30KK0FERF9UT19ERVZUQUJMRSgiY3B1IiwgY3B1X2ZlYXR1cmUsIGRvX2NwdV9lbnRyeSk7CisKIC8qIExvb2tzIGxpa2U6IG1laTpTICovCiBzdGF0aWMgaW50IGRvX21laV9lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqc3ltdmFsLAogCQkJY2hhciAqYWxpYXMpCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKaW5kZXggOTlhNDVmZC4uMDY2MzU1NiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwpAQCAtNjIzLDcgKzYyMywxMCBAQAogCiAJc3dpdGNoIChzeW0tPnN0X3NobmR4KSB7CiAJY2FzZSBTSE5fQ09NTU9OOgotCQl3YXJuKCJcIiVzXCIgWyVzXSBpcyBDT01NT04gc3ltYm9sXG4iLCBzeW1uYW1lLCBtb2QtPm5hbWUpOworCQlpZiAoIXN0cm5jbXAoc3ltbmFtZSwgIl9fZ251X2x0b18iLCBzaXplb2YoIl9fZ251X2x0b18iKS0xKSkgeworCQkJLyogU2hvdWxkIHdhcm4gaGVyZSwgYnV0IG1vZHBvc3QgcnVucyBiZWZvcmUgdGhlIGxpbmtlciAqLworCQl9IGVsc2UKKwkJCXdhcm4oIlwiJXNcIiBbJXNdIGlzIENPTU1PTiBzeW1ib2xcbiIsIHN5bW5hbWUsIG1vZC0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgU0hOX1VOREVGOgogCQkvKiB1bmRlZmluZWQgc3ltYm9sICovCkBAIC04NDksNiArODUyLDcgQEAKIAkiLnh0LmxpdCIsICAgICAgICAgLyogeHRlbnNhICovCiAJIi5hcmNleHRtYXAqIiwJCQkvKiBhcmMgKi8KIAkiLmdudS5saW5rb25jZS5hcmNleHQqIiwJLyogYXJjIDogbW9kdWxlcyAqLworCSIuZ251Lmx0byoiLAogCU5VTEwKIH07CiAKQEAgLTE0NTUsNiArMTQ1OSwxMCBAQAogCQl0byA9IGZpbmRfZWxmX3N5bWJvbChlbGYsIHItPnJfYWRkZW5kLCBzeW0pOwogCQl0b3N5bSA9IHN5bV9uYW1lKGVsZiwgdG8pOwogCisJCWlmICghc3RybmNtcChmcm9tc3ltLCAicmVmZXJlbmNlX19faW5pdGNhbGwiLAorCQkJCXNpemVvZigicmVmZXJlbmNlX19faW5pdGNhbGwiKS0xKSkKKwkJCXJldHVybjsKKwogCQkvKiBjaGVjayB3aGl0ZWxpc3QgLSB3ZSBtYXkgaWdub3JlIGl0ICovCiAJCWlmIChzZWNyZWZfd2hpdGVsaXN0KG1pc21hdGNoLAogCQkJCQlmcm9tc2VjLCBmcm9tc3ltLCB0b3NlYywgdG9zeW0pKSB7CkBAIC0xNjkzLDYgKzE3MDEsMTkgQEAKIAl9CiB9CiAKK3N0YXRpYyBjaGFyICpyZW1vdmVfZG90KGNoYXIgKnMpCit7CisJY2hhciAqZW5kOworCWludCBuID0gc3RyY3NwbihzLCAiLiIpOworCisJaWYgKG4gPiAwICYmIHNbbl0gIT0gMCkgeworCQlzdHJ0b3VsKHMgKyBuICsgMSwgJmVuZCwgMTApOworCQlpZiAgKGVuZCA+IHMgKyBuICsgMSAmJiAoKmVuZCA9PSAnLicgfHwgKmVuZCA9PSAwKSkKKwkJCXNbbl0gPSAwOworCX0KKwlyZXR1cm4gczsKK30KKwogc3RhdGljIHZvaWQgcmVhZF9zeW1ib2xzKGNoYXIgKm1vZG5hbWUpCiB7CiAJY29uc3QgY2hhciAqc3ltbmFtZTsKQEAgLTE3MzEsNyArMTc1Miw3IEBACiAJfQogCiAJZm9yIChzeW0gPSBpbmZvLnN5bXRhYl9zdGFydDsgc3ltIDwgaW5mby5zeW10YWJfc3RvcDsgc3ltKyspIHsKLQkJc3ltbmFtZSA9IGluZm8uc3RydGFiICsgc3ltLT5zdF9uYW1lOworCQlzeW1uYW1lID0gcmVtb3ZlX2RvdChpbmZvLnN0cnRhYiArIHN5bS0+c3RfbmFtZSk7CiAKIAkJaGFuZGxlX21vZHZlcnNpb25zKG1vZCwgJmluZm8sIHN5bSwgc3ltbmFtZSk7CiAJCWhhbmRsZV9tb2RkZXZ0YWJsZShtb2QsICZpbmZvLCBzeW0sIHN5bW5hbWUpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5oIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5oCmluZGV4IDUxMjA3ZTQuLjE2OGI0M2QgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL21vZHBvc3QuaAorKysgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmgKQEAgLTEyNyw3ICsxMjcsNyBAQAogCUVsZl9TZWN0aW9uICBleHBvcnRfZ3BsX3NlYzsKIAlFbGZfU2VjdGlvbiAgZXhwb3J0X3VudXNlZF9ncGxfc2VjOwogCUVsZl9TZWN0aW9uICBleHBvcnRfZ3BsX2Z1dHVyZV9zZWM7Ci0JY29uc3QgY2hhciAgICpzdHJ0YWI7CisJY2hhciAgICAgICAgICpzdHJ0YWI7CiAJY2hhcgkgICAgICptb2RpbmZvOwogCXVuc2lnbmVkIGludCBtb2RpbmZvX2xlbjsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvY2FwYWJpbGl0eS5jIGIvc2VjdXJpdHkvY2FwYWJpbGl0eS5jCmluZGV4IDhiNGYyNGEuLjIxZTJiOWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2NhcGFiaWxpdHkuYworKysgYi9zZWN1cml0eS9jYXBhYmlsaXR5LmMKQEAgLTc1Nyw3ICs3NTcsOCBAQAogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogc3RhdGljIGludCBjYXBfeGZybV9wb2xpY3lfYWxsb2Nfc2VjdXJpdHkoc3RydWN0IHhmcm1fc2VjX2N0eCAqKmN0eHAsCi0JCQkJCSAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KQorCQkJCQkgIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwKKwkJCQkJICBnZnBfdCBnZnApCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2NvbXBhdC5jIGIvc2VjdXJpdHkva2V5cy9jb21wYXQuYwppbmRleCBiYmQzMmM3Li4zNDc4OTY1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2NvbXBhdC5jCisrKyBiL3NlY3VyaXR5L2tleXMvY29tcGF0LmMKQEAgLTY1LDggKzY1LDggQEAKICAqIHRha2luZyBhIDMyLWJpdCBzeXNjYWxsIGFyZSB6ZXJvLiAgSWYgeW91IGNhbiwgeW91IHNob3VsZCBjYWxsIHN5c19rZXljdGwoKQogICogZGlyZWN0bHkuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2tleWN0bCh1MzIgb3B0aW9uLAotCQkJCSAgdTMyIGFyZzIsIHUzMiBhcmczLCB1MzIgYXJnNCwgdTMyIGFyZzUpCitDT01QQVRfU1lTQ0FMTF9ERUZJTkU1KGtleWN0bCwgdTMyLCBvcHRpb24sCisJCSAgICAgICB1MzIsIGFyZzIsIHUzMiwgYXJnMywgdTMyLCBhcmc0LCB1MzIsIGFyZzUpCiB7CiAJc3dpdGNoIChvcHRpb24pIHsKIAljYXNlIEtFWUNUTF9HRVRfS0VZUklOR19JRDoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IDE1YjY5MjguLjkxOWNhZDkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtMTMxNyw5ICsxMzE3LDExIEBACiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiAKLWludCBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqY3R4cCwgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KQoraW50IHNlY3VyaXR5X3hmcm1fcG9saWN5X2FsbG9jKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAorCQkJICAgICAgIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwKKwkJCSAgICAgICBnZnBfdCBnZnApCiB7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9wb2xpY3lfYWxsb2Nfc2VjdXJpdHkoY3R4cCwgc2VjX2N0eCk7CisJcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9wb2xpY3lfYWxsb2Nfc2VjdXJpdHkoY3R4cCwgc2VjX2N0eCwgZ2ZwKTsKIH0KIEVYUE9SVF9TWU1CT0woc2VjdXJpdHlfeGZybV9wb2xpY3lfYWxsb2MpOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggNGIzNDg0Ny4uYjMzMmUyYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtNjY4LDcgKzY2OCw3IEBACiAJCWlmIChmbGFnc1tpXSA9PSBTQkxBQkVMX01OVCkKIAkJCWNvbnRpbnVlOwogCQlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKG1vdW50X29wdGlvbnNbaV0sCi0JCQkJCSAgICAgc3RybGVuKG1vdW50X29wdGlvbnNbaV0pLCAmc2lkKTsKKwkJCQkJICAgICBzdHJsZW4obW91bnRfb3B0aW9uc1tpXSksICZzaWQsIEdGUF9LRVJORUwpOwogCQlpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNFTGludXg6IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkIgogCQkJICAgICAgICIoJXMpIGZhaWxlZCBmb3IgKGRldiAlcywgdHlwZSAlcykgZXJybm89JWRcbiIsCkBAIC0yNDg5LDcgKzI0ODksOCBAQAogCQlpZiAoZmxhZ3NbaV0gPT0gU0JMQUJFTF9NTlQpCiAJCQljb250aW51ZTsKIAkJbGVuID0gc3RybGVuKG1vdW50X29wdGlvbnNbaV0pOwotCQlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKG1vdW50X29wdGlvbnNbaV0sIGxlbiwgJnNpZCk7CisJCXJjID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQobW91bnRfb3B0aW9uc1tpXSwgbGVuLCAmc2lkLAorCQkJCQkgICAgIEdGUF9LRVJORUwpOwogCQlpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNFTGludXg6IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkIgogCQkJICAgICAgICIoJXMpIGZhaWxlZCBmb3IgKGRldiAlcywgdHlwZSAlcykgZXJybm89JWRcbiIsCkBAIC0yODkzLDcgKzI4OTQsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh2YWx1ZSwgc2l6ZSwgJm5ld3NpZCk7CisJcmMgPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh2YWx1ZSwgc2l6ZSwgJm5ld3NpZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJjID09IC1FSU5WQUwpIHsKIAkJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKSB7CiAJCQlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYjsKQEAgLTMwNTAsNyArMzA1MSw3IEBACiAJaWYgKCF2YWx1ZSB8fCAhc2l6ZSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKLQlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKCh2b2lkICopdmFsdWUsIHNpemUsICZuZXdzaWQpOworCXJjID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoKHZvaWQgKil2YWx1ZSwgc2l6ZSwgJm5ld3NpZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTU1MjksNyArNTUzMCw3IEBACiAJCQlzdHJbc2l6ZS0xXSA9IDA7CiAJCQlzaXplLS07CiAJCX0KLQkJZXJyb3IgPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh2YWx1ZSwgc2l6ZSwgJnNpZCk7CisJCWVycm9yID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodmFsdWUsIHNpemUsICZzaWQsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyb3IgPT0gLUVJTlZBTCAmJiAhc3RyY21wKG5hbWUsICJmc2NyZWF0ZSIpKSB7CiAJCQlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpIHsKIAkJCQlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYjsKQEAgLTU2MzgsNyArNTYzOSw3IEBACiAKIHN0YXRpYyBpbnQgc2VsaW51eF9zZWNjdHhfdG9fc2VjaWQoY29uc3QgY2hhciAqc2VjZGF0YSwgdTMyIHNlY2xlbiwgdTMyICpzZWNpZCkKIHsKLQlyZXR1cm4gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2VjZGF0YSwgc2VjbGVuLCBzZWNpZCk7CisJcmV0dXJuIHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNlY2RhdGEsIHNlY2xlbiwgc2VjaWQsIEdGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgdm9pZCBzZWxpbnV4X3JlbGVhc2Vfc2VjY3R4KGNoYXIgKnNlY2RhdGEsIHUzMiBzZWNsZW4pCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCmluZGV4IDhlZDhkYWYuLmNlNzg1MmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCkBAIC0xMzQsNyArMTM0LDcgQEAKIGludCBzZWN1cml0eV9zaWRfdG9fY29udGV4dF9mb3JjZSh1MzIgc2lkLCBjaGFyICoqc2NvbnRleHQsIHUzMiAqc2NvbnRleHRfbGVuKTsKIAogaW50IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGNvbnN0IGNoYXIgKnNjb250ZXh0LCB1MzIgc2NvbnRleHRfbGVuLAotCXUzMiAqb3V0X3NpZCk7CisJCQkgICAgdTMyICpvdXRfc2lkLCBnZnBfdCBnZnApOwogCiBpbnQgc2VjdXJpdHlfY29udGV4dF90b19zaWRfZGVmYXVsdChjb25zdCBjaGFyICpzY29udGV4dCwgdTMyIHNjb250ZXh0X2xlbiwKIAkJCQkgICAgdTMyICpvdXRfc2lkLCB1MzIgZGVmX3NpZCwgZ2ZwX3QgZ2ZwX2ZsYWdzKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUveGZybS5oCmluZGV4IDQ4YzNjYzkuLjlmMDU4NDcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3hmcm0uaApAQCAtMTAsNyArMTAsOCBAQAogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CiAKIGludCBzZWxpbnV4X3hmcm1fcG9saWN5X2FsbG9jKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAotCQkJICAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4KTsKKwkJCSAgICAgIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCwKKwkJCSAgICAgIGdmcF90IGdmcCk7CiBpbnQgc2VsaW51eF94ZnJtX3BvbGljeV9jbG9uZShzdHJ1Y3QgeGZybV9zZWNfY3R4ICpvbGRfY3R4LAogCQkJICAgICAgc3RydWN0IHhmcm1fc2VjX2N0eCAqKm5ld19jdHhwKTsKIHZvaWQgc2VsaW51eF94ZnJtX3BvbGljeV9mcmVlKHN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwppbmRleCA1MTIyYWZmLi5kNjBjMGVlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKQEAgLTU3Niw3ICs1NzYsNyBAQAogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoYnVmLCBzaXplLCAmc2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChidWYsIHNpemUsICZzaWQsIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCkBAIC03MzEsMTEgKzczMSwxMyBAQAogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMgJWh1Iiwgc2NvbiwgdGNvbiwgJnRjbGFzcykgIT0gMykKIAkJZ290byBvdXQ7CiAKLQlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCk7CisJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQsCisJCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCkBAIC04MTcsMTEgKzgxOSwxMyBAQAogCQlvYmpuYW1lID0gbmFtZWJ1ZjsKIAl9CiAKLQlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCk7CisJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQsCisJCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCkBAIC04NzgsMTEgKzg4MiwxMyBAQAogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMgJWh1Iiwgc2NvbiwgdGNvbiwgJnRjbGFzcykgIT0gMykKIAkJZ290byBvdXQ7CiAKLQlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCk7CisJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQsCisJCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCkBAIC05MzQsNyArOTQwLDcgQEAKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVzICVzIiwgY29uLCB1c2VyKSAhPSAyKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGNvbiwgc3RybGVuKGNvbikgKyAxLCAmc2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChjb24sIHN0cmxlbihjb24pICsgMSwgJnNpZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKQEAgLTk5NCwxMSArMTAwMCwxMyBAQAogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMgJWh1Iiwgc2NvbiwgdGNvbiwgJnRjbGFzcykgIT0gMykKIAkJZ290byBvdXQ7CiAKLQlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCk7CisJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQsCisJCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkKTsKKwlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggNWQwMTQ0ZS4uNGJjYTQ5NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtMTI4OSwxNiArMTI4OSwxOCBAQAogICogQHNjb250ZXh0OiBzZWN1cml0eSBjb250ZXh0CiAgKiBAc2NvbnRleHRfbGVuOiBsZW5ndGggaW4gYnl0ZXMKICAqIEBzaWQ6IHNlY3VyaXR5IGlkZW50aWZpZXIsIFNJRAorICogQGdmcDogY29udGV4dCBmb3IgdGhlIGFsbG9jYXRpb24KICAqCiAgKiBPYnRhaW5zIGEgU0lEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkgY29udGV4dCB0aGF0CiAgKiBoYXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBzcGVjaWZpZWQgYnkgQHNjb250ZXh0LgogICogUmV0dXJucyAtJUVJTlZBTCBpZiB0aGUgY29udGV4dCBpcyBpbnZhbGlkLCAtJUVOT01FTSBpZiBpbnN1ZmZpY2llbnQKICAqIG1lbW9yeSBpcyBhdmFpbGFibGUsIG9yIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGNvbnN0IGNoYXIgKnNjb250ZXh0LCB1MzIgc2NvbnRleHRfbGVuLCB1MzIgKnNpZCkKK2ludCBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChjb25zdCBjaGFyICpzY29udGV4dCwgdTMyIHNjb250ZXh0X2xlbiwgdTMyICpzaWQsCisJCQkgICAgZ2ZwX3QgZ2ZwKQogewogCXJldHVybiBzZWN1cml0eV9jb250ZXh0X3RvX3NpZF9jb3JlKHNjb250ZXh0LCBzY29udGV4dF9sZW4sCi0JCQkJCSAgICBzaWQsIFNFQ1NJRF9OVUxMLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQkJICAgIHNpZCwgU0VDU0lEX05VTEwsIGdmcCwgMCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC94ZnJtLmMgYi9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYwppbmRleCAwNDYyY2IzLi45OGIwNDI2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYwpAQCAtNzgsNyArNzgsOCBAQAogICogeGZybV91c2VyX3NlY19jdHggY29udGV4dC4KICAqLwogc3RhdGljIGludCBzZWxpbnV4X3hmcm1fYWxsb2NfdXNlcihzdHJ1Y3QgeGZybV9zZWNfY3R4ICoqY3R4cCwKLQkJCQkgICBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgpCisJCQkJICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4LAorCQkJCSAgIGdmcF90IGdmcCkKIHsKIAlpbnQgcmM7CiAJY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjID0gY3VycmVudF9zZWN1cml0eSgpOwpAQCAtOTQsNyArOTUsNyBAQAogCWlmIChzdHJfbGVuID49IFBBR0VfU0laRSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSArIHN0cl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSArIHN0cl9sZW4gKyAxLCBnZnApOwogCWlmICghY3R4KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTAzLDcgKzEwNCw3IEBACiAJY3R4LT5jdHhfbGVuID0gc3RyX2xlbjsKIAltZW1jcHkoY3R4LT5jdHhfc3RyLCAmdWN0eFsxXSwgc3RyX2xlbik7CiAJY3R4LT5jdHhfc3RyW3N0cl9sZW5dID0gJ1wwJzsKLQlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGN0eC0+Y3R4X3N0ciwgc3RyX2xlbiwgJmN0eC0+Y3R4X3NpZCk7CisJcmMgPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChjdHgtPmN0eF9zdHIsIHN0cl9sZW4sICZjdHgtPmN0eF9zaWQsIGdmcCk7CiAJaWYgKHJjKQogCQlnb3RvIGVycjsKIApAQCAtMjgyLDkgKzI4MywxMCBAQAogICogTFNNIGhvb2sgaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvY3MgYW5kIHRyYW5zZmVycyB1Y3R4IHNwZWMgdG8geGZybV9wb2xpY3kuCiAgKi8KIGludCBzZWxpbnV4X3hmcm1fcG9saWN5X2FsbG9jKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAotCQkJICAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4KQorCQkJICAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4LAorCQkJICAgICAgZ2ZwX3QgZ2ZwKQogewotCXJldHVybiBzZWxpbnV4X3hmcm1fYWxsb2NfdXNlcihjdHhwLCB1Y3R4KTsKKwlyZXR1cm4gc2VsaW51eF94ZnJtX2FsbG9jX3VzZXIoY3R4cCwgdWN0eCwgZ2ZwKTsKIH0KIAogLyoKQEAgLTMzMiw3ICszMzQsNyBAQAogaW50IHNlbGludXhfeGZybV9zdGF0ZV9hbGxvYyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwKIAkJCSAgICAgc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4KQogewotCXJldHVybiBzZWxpbnV4X3hmcm1fYWxsb2NfdXNlcigmeC0+c2VjdXJpdHksIHVjdHgpOworCXJldHVybiBzZWxpbnV4X3hmcm1fYWxsb2NfdXNlcigmeC0+c2VjdXJpdHksIHVjdHgsIEdGUF9LRVJORUwpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2FvYS5oIGIvc291bmQvYW9hL2FvYS5oCmluZGV4IGUwODc4OTQuLjM0YzY2OGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9hb2EuaAorKysgYi9zb3VuZC9hb2EvYW9hLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqYWxzYV9jYXJkOwogfTsKICAgICAgICAgCi1leHRlcm4gaW50IGFvYV9zbmRfZGV2aWNlX25ldyhzbmRfZGV2aWNlX3R5cGVfdCB0eXBlLAorZXh0ZXJuIGludCBhb2Ffc25kX2RldmljZV9uZXcoZW51bSBzbmRfZGV2aWNlX3R5cGUgdHlwZSwKIAl2b2lkICogZGV2aWNlX2RhdGEsIHN0cnVjdCBzbmRfZGV2aWNlX29wcyAqIG9wcyk7CiBleHRlcm4gc3RydWN0IHNuZF9jYXJkICphb2FfZ2V0X2NhcmQodm9pZCk7CiBleHRlcm4gaW50IGFvYV9zbmRfY3RsX2FkZChzdHJ1Y3Qgc25kX2tjb250cm9sKiBjb250cm9sKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3Mvb255eC5jIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKaW5kZXggNGNlZGM2OS4uZjAxYmZmYiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKKysrIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKQEAgLTg4OSw3ICs4ODksNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9MT1dMRVZFTCwgb255eCwgJm9wcykpIHsKKwlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9DT0RFQywgb255eCwgJm9wcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIGNyZWF0ZSBvbnl4IHNuZCBkZXZpY2UhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy90YXMuYyBiL3NvdW5kL2FvYS9jb2RlY3MvdGFzLmMKaW5kZXggYzQ5MWFlMC4uY2YzYzYzMCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy90YXMuYworKysgYi9zb3VuZC9hb2EvY29kZWNzL3Rhcy5jCkBAIC04MjYsNyArODI2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKGFvYV9zbmRfZGV2aWNlX25ldyhTTkRSVl9ERVZfTE9XTEVWRUwsIHRhcywgJm9wcykpIHsKKwlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9DT0RFQywgdGFzLCAmb3BzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIHRhcyBzbmQgZGV2aWNlIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3MvdG9vbmllLmMgYi9zb3VuZC9hb2EvY29kZWNzL3Rvb25pZS5jCmluZGV4IDY5ZDJjYjYuLjdlOGMzNDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb2RlY3MvdG9vbmllLmMKKysrIGIvc291bmQvYW9hL2NvZGVjcy90b29uaWUuYwpAQCAtOTIsNyArOTIsNyBAQAogCWlmICh0b29uaWUtPmNvZGVjLmNvbm5lY3RlZCAhPSAxKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCi0JaWYgKGFvYV9zbmRfZGV2aWNlX25ldyhTTkRSVl9ERVZfTE9XTEVWRUwsIHRvb25pZSwgJm9wcykpIHsKKwlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9DT0RFQywgdG9vbmllLCAmb3BzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIHRvb25pZSBzbmQgZGV2aWNlIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL2Fsc2EuYyBiL3NvdW5kL2FvYS9jb3JlL2Fsc2EuYwppbmRleCAwZmEzODU1Li40YTdlNGU2IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29yZS9hbHNhLmMKKysrIGIvc291bmQvYW9hL2NvcmUvYWxzYS5jCkBAIC0yMywxMyArMjMsMTIgQEAKIAkJLyogY2Fubm90IGJlIEVFWElTVCBkdWUgdG8gdXNhZ2UgaW4gYW9hX2ZhYnJpY19yZWdpc3RlciAqLwogCQlyZXR1cm4gLUVCVVNZOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBuYW1lLCBtb2QsIHNpemVvZihzdHJ1Y3QgYW9hX2NhcmQpLAotCQkJICAgICAgJmFsc2FfY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXgsIG5hbWUsIG1vZCwgc2l6ZW9mKHN0cnVjdCBhb2FfY2FyZCksCisJCQkgICAmYWxzYV9jYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlhb2FfY2FyZCA9IGFsc2FfY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWFvYV9jYXJkLT5hbHNhX2NhcmQgPSBhbHNhX2NhcmQ7Ci0JYWxzYV9jYXJkLT5kZXYgPSBkZXY7CiAJc3RybGNweShhbHNhX2NhcmQtPmRyaXZlciwgIkFwcGxlT25iZEF1ZGlvIiwgc2l6ZW9mKGFsc2FfY2FyZC0+ZHJpdmVyKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPnNob3J0bmFtZSwgbmFtZSwgc2l6ZW9mKGFsc2FfY2FyZC0+c2hvcnRuYW1lKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPmxvbmduYW1lLCBuYW1lLCBzaXplb2YoYWxzYV9jYXJkLT5sb25nbmFtZSkpOwpAQCAtNjAsNyArNTksNyBAQAogCX0KIH0KIAotaW50IGFvYV9zbmRfZGV2aWNlX25ldyhzbmRfZGV2aWNlX3R5cGVfdCB0eXBlLAoraW50IGFvYV9zbmRfZGV2aWNlX25ldyhlbnVtIHNuZF9kZXZpY2VfdHlwZSB0eXBlLAogCQkgICAgICAgdm9pZCAqIGRldmljZV9kYXRhLCBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgKiBvcHMpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gYW9hX2dldF9jYXJkKCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vYWFjaS5jIGIvc291bmQvYXJtL2FhY2kuYwppbmRleCBjNDIxZmRiLi4wZTgzYTczIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vYWFjaS5jCisrKyBiL3NvdW5kL2FybS9hYWNpLmMKQEAgLTg5OSw4ICs4OTksOCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJICAgICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgYWFjaSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwkJCSAgIFRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGFhY2kpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDU1LDggKzEwNTUsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0Jc25kX2NhcmRfc2V0X2RldihhYWNpLT5jYXJkLCAmZGV2LT5kZXYpOwotCiAJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoYWFjaS0+Y2FyZCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzXG4iLCBhYWNpLT5jYXJkLT5sb25nbmFtZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jCmluZGV4IDlhMmFjMWUuLjNhMTBkZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jCisrKyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jCkBAIC0xNzksMTIgKzE3OSwxMSBAQAogCQlnb3RvIGVycl9kZXY7CiAJfQogCi0JcmV0ID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAotCQkJICAgICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJmRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCi0JY2FyZC0+ZGV2ID0gJmRldi0+ZGV2OwogCXN0cmxjcHkoY2FyZC0+ZHJpdmVyLCBkZXYtPmRldi5kcml2ZXItPm5hbWUsIHNpemVvZihjYXJkLT5kcml2ZXIpKTsKIAogCXJldCA9IHB4YTJ4eF9wY21fbmV3KGNhcmQsICZweGEyeHhfYWM5N19wY21fY2xpZW50LCAmcHhhMnh4X2FjOTdfcGNtKTsKQEAgLTIxMCw3ICsyMDksNiBAQAogCiAJaWYgKHBkYXRhICYmIHBkYXRhLT5jb2RlY19wZGF0YVswXSkKIAkJc25kX2FjOTdfZGV2X2FkZF9wZGF0YShhYzk3X2J1cy0+Y29kZWNbMF0sIHBkYXRhLT5jb2RlY19wZGF0YVswXSk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT5kZXYpOwogCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChyZXQgPT0gMCkgewogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvYXRtZWwvYWJkYWMuYyBiL3NvdW5kL2F0bWVsL2FiZGFjLmMKaW5kZXggMzUxOTUxOC4uZWRmMmNhNyAxMDA2NDQKLS0tIGEvc291bmQvYXRtZWwvYWJkYWMuYworKysgYi9zb3VuZC9hdG1lbC9hYmRhYy5jCkBAIC00MjksOCArNDI5LDkgQEAKIAl9CiAJY2xrX2VuYWJsZShwY2xrKTsKIAotCXJldHZhbCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKLQkJCVRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGF0bWVsX2FiZGFjKSwgJmNhcmQpOworCXJldHZhbCA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsCisJCQkgICAgICBTTkRSVl9ERUZBVUxUX1NUUjEsIFRISVNfTU9EVUxFLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhdG1lbF9hYmRhYyksICZjYXJkKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgc291bmQgY2FyZCBkZXZpY2VcbiIpOwogCQlnb3RvIG91dF9wdXRfc2FtcGxlX2NsazsKQEAgLTQ2Nyw4ICs0NjgsNiBAQAogCQlnb3RvIG91dF91bm1hcF9yZWdzOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7Ci0KIAlpZiAocGRhdGEtPmR3cy5kbWFfZGV2KSB7CiAJCWRtYV9jYXBfbWFza190IG1hc2s7CiAKQEAgLTQ5Miw3ICs0OTEsNyBAQAogCWlmICghcGRhdGEtPmR3cy5kbWFfZGV2IHx8ICFkYWMtPmRtYS5jaGFuKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgIkRNQSBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKLQkJZ290byBvdXRfdW5zZXRfY2FyZF9kZXY7CisJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAJfQogCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkF0bWVsIEFCREFDIik7CkBAIC01MjEsOSArNTIwLDYgQEAKIG91dF9yZWxlYXNlX2RtYToKIAlkbWFfcmVsZWFzZV9jaGFubmVsKGRhYy0+ZG1hLmNoYW4pOwogCWRhYy0+ZG1hLmNoYW4gPSBOVUxMOwotb3V0X3Vuc2V0X2NhcmRfZGV2OgotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgTlVMTCk7Ci0JZnJlZV9pcnEoaXJxLCBkYWMpOwogb3V0X3VubWFwX3JlZ3M6CiAJaW91bm1hcChkYWMtPnJlZ3MpOwogb3V0X2ZyZWVfY2FyZDoKQEAgLTU3OSw3ICs1NzUsNiBAQAogCiAJZG1hX3JlbGVhc2VfY2hhbm5lbChkYWMtPmRtYS5jaGFuKTsKIAlkYWMtPmRtYS5jaGFuID0gTlVMTDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIE5VTEwpOwogCWlvdW5tYXAoZGFjLT5yZWdzKTsKIAlmcmVlX2lycShkYWMtPmlycSwgZGFjKTsKIAlzbmRfY2FyZF9mcmVlKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvYXRtZWwvYWM5N2MuYyBiL3NvdW5kL2F0bWVsL2FjOTdjLmMKaW5kZXggYzVmMGRkZC4uMDVlYzA0OSAxMDA2NDQKLS0tIGEvc291bmQvYXRtZWwvYWM5N2MuYworKysgYi9zb3VuZC9hdG1lbC9hYzk3Yy5jCkBAIC05NDUsOCArOTQ1LDkgQEAKIAl9CiAJY2xrX2VuYWJsZShwY2xrKTsKIAotCXJldHZhbCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKLQkJCVRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGF0bWVsX2FjOTdjKSwgJmNhcmQpOworCXJldHZhbCA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsCisJCQkgICAgICBTTkRSVl9ERUZBVUxUX1NUUjEsIFRISVNfTU9EVUxFLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhdG1lbF9hYzk3YyksICZjYXJkKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgc291bmQgY2FyZCBkZXZpY2VcbiIpOwogCQlnb3RvIGVycl9zbmRfY2FyZF9uZXc7CkBAIC05OTAsOCArOTkxLDYgQEAKIAkJY2hpcC0+cmVzZXRfcGluID0gLUVJTlZBTDsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwotCiAJYXRtZWxfYWM5N2NfcmVzZXQoY2hpcCk7CiAKIAkvKiBFbmFibGUgb3ZlcnJ1biBpbnRlcnJ1cHQgZnJvbSBjb2RlYyBjaGFubmVsICovCkBAIC0xMTEzLDggKzExMTIsNiBAQAogCQljaGlwLT5kbWEudHhfY2hhbiA9IE5VTEw7CiAJfQogZXJyX2FjOTdfYnVzOgotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgTlVMTCk7Ci0KIAlpZiAoZ3Bpb19pc192YWxpZChjaGlwLT5yZXNldF9waW4pKQogCQlncGlvX2ZyZWUoY2hpcC0+cmVzZXRfcGluKTsKIApAQCAtMTE5NSw3ICsxMTkyLDYgQEAKIAkJY2hpcC0+ZG1hLnR4X2NoYW4gPSBOVUxMOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgTlVMTCk7CiAJc25kX2NhcmRfZnJlZShjYXJkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb21wcmVzc19vZmZsb2FkLmMgYi9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYwppbmRleCA3YTIwODk3Li43NDAzZjM0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYworKysgYi9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJCWtmcmVlKGRhdGEpOwogCX0KIAlzbmRfY2FyZF91bnJlZihjb21wci0+Y2FyZCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzbmRfY29tcHJfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvY29udHJvbC5jIGIvc291bmQvY29yZS9jb250cm9sLmMKaW5kZXggZDhhYTIwNi4uZjAzOGY1YSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sLmMKKysrIGIvc291bmQvY29yZS9jb250cm9sLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFpZCkpCiAJCXJldHVybjsKIAlyZWFkX2xvY2soJmNhcmQtPmN0bF9maWxlc19yd2xvY2spOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9NSVhFUl9PU1MpCiAJY2FyZC0+bWl4ZXJfb3NzX2NoYW5nZV9jb3VudCsrOwogI2VuZGlmCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjdGwsICZjYXJkLT5jdGxfZmlsZXMsIGxpc3QpIHsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQkJZXYtPm1hc2sgPSBtYXNrOwogCQkJbGlzdF9hZGRfdGFpbCgmZXYtPmxpc3QsICZjdGwtPmV2ZW50cyk7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJObyBtZW1vcnkgYXZhaWxhYmxlIHRvIGFsbG9jYXRlIGV2ZW50XG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiTm8gbWVtb3J5IGF2YWlsYWJsZSB0byBhbGxvY2F0ZSBldmVudFxuIik7CiAJCX0KIAlfZm91bmQ6CiAJCXdha2VfdXAoJmN0bC0+Y2hhbmdlX3NsZWVwKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCiAJa2N0bCA9IGt6YWxsb2Moc2l6ZW9mKCprY3RsKSArIHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sX3ZvbGF0aWxlKSAqIGNvbnRyb2wtPmNvdW50LCBHRlBfS0VSTkVMKTsKIAlpZiAoa2N0bCA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbm5vdCBhbGxvY2F0ZSBjb250cm9sIGluc3RhbmNlXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBDYW5ub3QgYWxsb2NhdGUgY29udHJvbCBpbnN0YW5jZVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAkqa2N0bCA9ICpjb250cm9sOwpAQCAtMjQxLDkgKzI0MSw4IEBACiAJaWYgKG5jb250cm9sLT5uYW1lKSB7CiAJCXN0cmxjcHkoa2N0bC5pZC5uYW1lLCBuY29udHJvbC0+bmFtZSwgc2l6ZW9mKGtjdGwuaWQubmFtZSkpOwogCQlpZiAoc3RyY21wKG5jb250cm9sLT5uYW1lLCBrY3RsLmlkLm5hbWUpICE9IDApCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSAgICJDb250cm9sIG5hbWUgJyVzJyB0cnVuY2F0ZWQgdG8gJyVzJ1xuIiwKLQkJCQkgICBuY29udHJvbC0+bmFtZSwga2N0bC5pZC5uYW1lKTsKKwkJCXByX3dhcm4oIkFMU0E6IENvbnRyb2wgbmFtZSAnJXMnIHRydW5jYXRlZCB0byAnJXMnXG4iLAorCQkJCW5jb250cm9sLT5uYW1lLCBrY3RsLmlkLm5hbWUpOwogCX0KIAlrY3RsLmlkLmluZGV4ID0gbmNvbnRyb2wtPmluZGV4OwogCWtjdGwuY291bnQgPSBuY29udHJvbC0+Y291bnQgPyBuY29udHJvbC0+Y291bnQgOiAxOwpAQCAtMzA2LDcgKzMwNSw3IEBACiAJd2hpbGUgKHNuZF9jdGxfcmVtb3ZlX251bWlkX2NvbmZsaWN0KGNhcmQsIGNvdW50KSkgewogCQlpZiAoLS1pdGVyID09IDApIHsKIAkJCS8qIHRoaXMgc2l0dWF0aW9uIGlzIHZlcnkgdW5saWtlbHkgKi8KLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBhbGxvY2F0ZSBuZXcgY29udHJvbCBudW1pZFxuIik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBuZXcgY29udHJvbCBudW1pZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTM0MSw3ICszNDAsNyBAQAogCWRvd25fd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKIAlpZiAoc25kX2N0bF9maW5kX2lkKGNhcmQsICZpZCkpIHsKIAkJdXBfd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKLQkJc25kX3ByaW50ZChLRVJOX0VSUiAiY29udHJvbCAlaTolaTolaTolczolaSBpcyBhbHJlYWR5IHByZXNlbnRcbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY29udHJvbCAlaTolaTolaTolczolaSBpcyBhbHJlYWR5IHByZXNlbnRcbiIsCiAJCQkJCWlkLmlmYWNlLAogCQkJCQlpZC5kZXZpY2UsCiAJCQkJCWlkLnN1YmRldmljZSwKQEAgLTE0MDYsNyArMTQwNSw3IEBACiAJCX0KIAl9CiAJdXBfcmVhZCgmc25kX2lvY3RsX3J3c2VtKTsKLQlzbmRfcHJpbnRkZCgidW5rbm93biBpb2N0bCA9IDB4JXhcbiIsIGNtZCk7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJ1bmtub3duIGlvY3RsID0gMHgleFxuIiwgY21kKTsKIAlyZXR1cm4gLUVOT1RUWTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jIGIvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCmluZGV4IDJiYjk1YTcuLmI5YzA5MTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCX0gZWxzZSB7CiAJCXNpemUgPSBnZXRfZWxlbV9zaXplKHR5cGUsIGNvdW50KTsKIAkJaWYgKHNpemUgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInNuZF9pb2N0bDMyX2N0bF9lbGVtX3ZhbHVlOiB1bmtub3duIHR5cGUgJWRcbiIsIHR5cGUpOworCQkJZGV2X2VycihjYXJkLT5kZXYsICJzbmRfaW9jdGwzMl9jdGxfZWxlbV92YWx1ZTogdW5rbm93biB0eXBlICVkXG4iLCB0eXBlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLT52YWx1ZS5ieXRlcy5kYXRhLApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvZGV2aWNlLmMKaW5kZXggZGY4OGRlZi4uNDFiZWMzMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL2RldmljZS5jCkBAIC00MSwyOCArNDEsNzIgQEAKICAqCiAgKiBSZXR1cm46IFplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLWludCBzbmRfZGV2aWNlX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHNuZF9kZXZpY2VfdHlwZV90IHR5cGUsCitpbnQgc25kX2RldmljZV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBlbnVtIHNuZF9kZXZpY2VfdHlwZSB0eXBlLAogCQkgICB2b2lkICpkZXZpY2VfZGF0YSwgc3RydWN0IHNuZF9kZXZpY2Vfb3BzICpvcHMpCiB7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWRldmljZV9kYXRhIHx8ICFvcHMpKQogCQlyZXR1cm4gLUVOWElPOwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2ID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlIGRldmljZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIGRldmljZSwgdHlwZT0lZFxuIiwgdHlwZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5saXN0KTsKIAlkZXYtPmNhcmQgPSBjYXJkOwogCWRldi0+dHlwZSA9IHR5cGU7CiAJZGV2LT5zdGF0ZSA9IFNORFJWX0RFVl9CVUlMRDsKIAlkZXYtPmRldmljZV9kYXRhID0gZGV2aWNlX2RhdGE7CiAJZGV2LT5vcHMgPSBvcHM7Ci0JbGlzdF9hZGQoJmRldi0+bGlzdCwgJmNhcmQtPmRldmljZXMpOwkvKiBhZGQgdG8gdGhlIGhlYWQgb2YgbGlzdCAqLworCisJLyogaW5zZXJ0IHRoZSBlbnRyeSBpbiBhbiBpbmNyZW1lbnRhbGx5IHNvcnRlZCBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9wcmV2KHAsICZjYXJkLT5kZXZpY2VzKSB7CisJCXN0cnVjdCBzbmRfZGV2aWNlICpwZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX2RldmljZSwgbGlzdCk7CisJCWlmICgodW5zaWduZWQgaW50KXBkZXYtPnR5cGUgPD0gKHVuc2lnbmVkIGludCl0eXBlKQorCQkJYnJlYWs7CisJfQorCisJbGlzdF9hZGQoJmRldi0+bGlzdCwgcCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF9kZXZpY2VfbmV3KTsKKworc3RhdGljIGludCBfX3NuZF9kZXZpY2VfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9SRUdJU1RFUkVEKSB7CisJCWlmIChkZXYtPm9wcy0+ZGV2X2Rpc2Nvbm5lY3QgJiYKKwkJICAgIGRldi0+b3BzLT5kZXZfZGlzY29ubmVjdChkZXYpKQorCQkJZGV2X2VycihkZXYtPmNhcmQtPmRldiwgImRldmljZSBkaXNjb25uZWN0IGZhaWx1cmVcbiIpOworCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX0RJU0NPTk5FQ1RFRDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woc25kX2RldmljZV9uZXcpOworc3RhdGljIHZvaWQgX19zbmRfZGV2aWNlX2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldikKK3sKKwkvKiB1bmxpbmsgKi8KKwlsaXN0X2RlbCgmZGV2LT5saXN0KTsKKworCV9fc25kX2RldmljZV9kaXNjb25uZWN0KGRldik7CisJaWYgKGRldi0+b3BzLT5kZXZfZnJlZSkgeworCQlpZiAoZGV2LT5vcHMtPmRldl9mcmVlKGRldikpCisJCQlkZXZfZXJyKGRldi0+Y2FyZC0+ZGV2LCAiZGV2aWNlIGZyZWUgZmFpbHVyZVxuIik7CisJfQorCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZSAqbG9va19mb3JfZGV2KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpCit7CisJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkKKwkJaWYgKGRldi0+ZGV2aWNlX2RhdGEgPT0gZGV2aWNlX2RhdGEpCisJCQlyZXR1cm4gZGV2OworCisJcmV0dXJuIE5VTEw7Cit9CiAKIC8qKgogICogc25kX2RldmljZV9mcmVlIC0gcmVsZWFzZSB0aGUgZGV2aWNlIGZyb20gdGhlIGNhcmQKQEAgLTcyLDczICsxMTYsMzMgQEAKICAqIFJlbW92ZXMgdGhlIGRldmljZSBmcm9tIHRoZSBsaXN0IG9uIHRoZSBjYXJkIGFuZCBpbnZva2VzIHRoZQogICogY2FsbGJhY2tzLCBkZXZfZGlzY29ubmVjdCBhbmQgZGV2X2ZyZWUsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXRlLgogICogVGhlbiByZWxlYXNlIHRoZSBkZXZpY2UuCi0gKgotICogUmV0dXJuOiBaZXJvIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlIG9yIGlmIHRoZQotICogZGV2aWNlIG5vdCBmb3VuZC4KICAqLwotaW50IHNuZF9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQordm9pZCBzbmRfZGV2aWNlX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSkKIHsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwogCQogCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFkZXZpY2VfZGF0YSkpCi0JCXJldHVybiAtRU5YSU87Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQotCQkJY29udGludWU7Ci0JCS8qIHVubGluayAqLwotCQlsaXN0X2RlbCgmZGV2LT5saXN0KTsKLQkJaWYgKGRldi0+c3RhdGUgPT0gU05EUlZfREVWX1JFR0lTVEVSRUQgJiYKLQkJICAgIGRldi0+b3BzLT5kZXZfZGlzY29ubmVjdCkKLQkJCWlmIChkZXYtPm9wcy0+ZGV2X2Rpc2Nvbm5lY3QoZGV2KSkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSAgICJkZXZpY2UgZGlzY29ubmVjdCBmYWlsdXJlXG4iKTsKLQkJaWYgKGRldi0+b3BzLT5kZXZfZnJlZSkgewotCQkJaWYgKGRldi0+b3BzLT5kZXZfZnJlZShkZXYpKQotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRldmljZSBmcmVlIGZhaWx1cmVcbiIpOwotCQl9Ci0JCWtmcmVlKGRldik7Ci0JCXJldHVybiAwOwotCX0KLQlzbmRfcHJpbnRkKCJkZXZpY2UgZnJlZSAlcCAoZnJvbSAlcEYpLCBub3QgZm91bmRcbiIsIGRldmljZV9kYXRhLAotCQkgICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCXJldHVybiAtRU5YSU87CisJCXJldHVybjsKKwlkZXYgPSBsb29rX2Zvcl9kZXYoY2FyZCwgZGV2aWNlX2RhdGEpOworCWlmIChkZXYpCisJCV9fc25kX2RldmljZV9mcmVlKGRldik7CisJZWxzZQorCQlkZXZfZGJnKGNhcmQtPmRldiwgImRldmljZSBmcmVlICVwIChmcm9tICVwRiksIG5vdCBmb3VuZFxuIiwKKwkJCWRldmljZV9kYXRhLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQotCiBFWFBPUlRfU1lNQk9MKHNuZF9kZXZpY2VfZnJlZSk7CiAKLS8qKgotICogc25kX2RldmljZV9kaXNjb25uZWN0IC0gZGlzY29ubmVjdCB0aGUgZGV2aWNlCi0gKiBAY2FyZDogdGhlIGNhcmQgaW5zdGFuY2UKLSAqIEBkZXZpY2VfZGF0YTogdGhlIGRhdGEgcG9pbnRlciB0byBkaXNjb25uZWN0Ci0gKgotICogVHVybnMgdGhlIGRldmljZSBpbnRvIHRoZSBkaXNjb25uZWN0aW9uIHN0YXRlLCBpbnZva2luZwotICogZGV2X2Rpc2Nvbm5lY3QgY2FsbGJhY2ssIGlmIHRoZSBkZXZpY2Ugd2FzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAqCi0gKiBVc3VhbGx5IGNhbGxlZCBmcm9tIHNuZF9jYXJkX2Rpc2Nvbm5lY3QoKS4KLSAqCi0gKiBSZXR1cm46IFplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUgb3IgaWYgdGhlCi0gKiBkZXZpY2Ugbm90IGZvdW5kLgotICovCi1pbnQgc25kX2RldmljZV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpCitzdGF0aWMgaW50IF9fc25kX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0KLQlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhZGV2aWNlX2RhdGEpKQotCQlyZXR1cm4gLUVOWElPOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkgewotCQlpZiAoZGV2LT5kZXZpY2VfZGF0YSAhPSBkZXZpY2VfZGF0YSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZGV2LT5zdGF0ZSA9PSBTTkRSVl9ERVZfUkVHSVNURVJFRCAmJgotCQkgICAgZGV2LT5vcHMtPmRldl9kaXNjb25uZWN0KSB7Ci0JCQlpZiAoZGV2LT5vcHMtPmRldl9kaXNjb25uZWN0KGRldikpCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZGV2aWNlIGRpc2Nvbm5lY3QgZmFpbHVyZVxuIik7Ci0JCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX0RJU0NPTk5FQ1RFRDsKKwlpZiAoZGV2LT5zdGF0ZSA9PSBTTkRSVl9ERVZfQlVJTEQpIHsKKwkJaWYgKGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIpIHsKKwkJCWludCBlcnIgPSBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKGRldik7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOwogCQl9Ci0JCXJldHVybiAwOworCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX1JFR0lTVEVSRUQ7CiAJfQotCXNuZF9wcmludGQoImRldmljZSBkaXNjb25uZWN0ICVwIChmcm9tICVwRiksIG5vdCBmb3VuZFxuIiwgZGV2aWNlX2RhdGEsCi0JCSAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xNTcsMjYgKzE2MSwxNSBAQAogaW50IHNuZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSkKIHsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwotCWludCBlcnI7CiAKIAlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhZGV2aWNlX2RhdGEpKQogCQlyZXR1cm4gLUVOWElPOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkgewotCQlpZiAoZGV2LT5kZXZpY2VfZGF0YSAhPSBkZXZpY2VfZGF0YSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZGV2LT5zdGF0ZSA9PSBTTkRSVl9ERVZfQlVJTEQgJiYgZGV2LT5vcHMtPmRldl9yZWdpc3RlcikgewotCQkJaWYgKChlcnIgPSBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKGRldikpIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZGV2LT5zdGF0ZSA9IFNORFJWX0RFVl9SRUdJU1RFUkVEOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJc25kX3ByaW50ZCgic25kX2RldmljZV9yZWdpc3RlciBidXN5XG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJZGV2ID0gbG9va19mb3JfZGV2KGNhcmQsIGRldmljZV9kYXRhKTsKKwlpZiAoZGV2KQorCQlyZXR1cm4gX19zbmRfZGV2aWNlX3JlZ2lzdGVyKGRldik7CiAJc25kX0JVRygpOwogCXJldHVybiAtRU5YSU87CiB9Ci0KIEVYUE9SVF9TWU1CT0woc25kX2RldmljZV9yZWdpc3Rlcik7CiAKIC8qCkBAIC0xOTEsMTEgKzE4NCw5IEBACiAJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQogCQlyZXR1cm4gLUVOWElPOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkgewotCQlpZiAoZGV2LT5zdGF0ZSA9PSBTTkRSVl9ERVZfQlVJTEQgJiYgZGV2LT5vcHMtPmRldl9yZWdpc3RlcikgewotCQkJaWYgKChlcnIgPSBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKGRldikpIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZGV2LT5zdGF0ZSA9IFNORFJWX0RFVl9SRUdJU1RFUkVEOwotCQl9CisJCWVyciA9IF9fc25kX2RldmljZV9yZWdpc3RlcihkZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjExLDggKzIwMiw4IEBACiAKIAlpZiAoc25kX0JVR19PTighY2FyZCkpCiAJCXJldHVybiAtRU5YSU87Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChzbmRfZGV2aWNlX2Rpc2Nvbm5lY3QoY2FyZCwgZGV2LT5kZXZpY2VfZGF0YSkgPCAwKQorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CisJCWlmIChfX3NuZF9kZXZpY2VfZGlzY29ubmVjdChkZXYpIDwgMCkKIAkJCWVyciA9IC1FTlhJTzsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTIyMiwyNCArMjEzLDEyIEBACiAgKiByZWxlYXNlIGFsbCB0aGUgZGV2aWNlcyBvbiB0aGUgY2FyZC4KICAqIGNhbGxlZCBmcm9tIGluaXQuYwogICovCi1pbnQgc25kX2RldmljZV9mcmVlX2FsbChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHNuZF9kZXZpY2VfY21kX3QgY21kKQordm9pZCBzbmRfZGV2aWNlX2ZyZWVfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKLQlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IHJhbmdlX2xvdywgcmFuZ2VfaGlnaCwgdHlwZTsKKwlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2LCAqbmV4dDsKIAogCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKLQkJcmV0dXJuIC1FTlhJTzsKLQlyYW5nZV9sb3cgPSAoX19mb3JjZSB1bnNpZ25lZCBpbnQpY21kICogU05EUlZfREVWX1RZUEVfUkFOR0VfU0laRTsKLQlyYW5nZV9oaWdoID0gcmFuZ2VfbG93ICsgU05EUlZfREVWX1RZUEVfUkFOR0VfU0laRSAtIDE7Ci0gICAgICBfX2FnYWluOgotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkgewotCQl0eXBlID0gKF9fZm9yY2UgdW5zaWduZWQgaW50KWRldi0+dHlwZTsKLQkJaWYgKHR5cGUgPj0gcmFuZ2VfbG93ICYmIHR5cGUgPD0gcmFuZ2VfaGlnaCkgewotCQkJaWYgKChlcnIgPSBzbmRfZGV2aWNlX2ZyZWUoY2FyZCwgZGV2LT5kZXZpY2VfZGF0YSkpIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZ290byBfX2FnYWluOwotCQl9Ci0JfQotCXJldHVybiAwOworCQlyZXR1cm47CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoZGV2LCBuZXh0LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkKKwkJX19zbmRfZGV2aWNlX2ZyZWUoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaHJ0aW1lci5jIGIvc291bmQvY29yZS9ocnRpbWVyLmMKaW5kZXggYjhiMzFjNC4uODg2YmU3ZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9ocnRpbWVyLmMKKysrIGIvc291bmQvY29yZS9ocnRpbWVyLmMKQEAgLTEyNiw4ICsxMjYsNyBAQAogCiAJaHJ0aW1lcl9nZXRfcmVzKENMT0NLX01PTk9UT05JQywgJnRwKTsKIAlpZiAodHAudHZfc2VjID4gMCB8fCAhdHAudHZfbnNlYykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAic25kLWhydGltZXI6IEludmFsaWQgcmVzb2x1dGlvbiAldS4lMDl1IiwKKwkJcHJfZXJyKCJzbmQtaHJ0aW1lcjogSW52YWxpZCByZXNvbHV0aW9uICV1LiUwOXUiLAogCQkJICAgKHVuc2lnbmVkKXRwLnR2X3NlYywgKHVuc2lnbmVkKXRwLnR2X25zZWMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2h3ZGVwLmMgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKaW5kZXggZDEwNTA3My4uNjk0NTllNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9od2RlcC5jCisrKyBiL3NvdW5kL2NvcmUvaHdkZXAuYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCSpyaHdkZXAgPSBOVUxMOwogCWh3ZGVwID0ga3phbGxvYyhzaXplb2YoKmh3ZGVwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGh3ZGVwID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaHdkZXA6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiaHdkZXA6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlod2RlcC0+Y2FyZCA9IGNhcmQ7CkBAIC0zOTUsNiArMzk1LDcgQEAKIAkJKnJod2RlcCA9IGh3ZGVwOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfaHdkZXBfbmV3KTsKIAogc3RhdGljIGludCBzbmRfaHdkZXBfZnJlZShzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCkKIHsKQEAgLTQxNSwzNyArNDE2LDYxIEBACiBzdGF0aWMgaW50IHNuZF9od2RlcF9kZXZfcmVnaXN0ZXIoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gaHdkZXAtPmNhcmQ7CisJc3RydWN0IGRldmljZSAqZGV2OwogCWludCBlcnI7CiAJY2hhciBuYW1lWzMyXTsKIAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQlpZiAoc25kX2h3ZGVwX3NlYXJjaChod2RlcC0+Y2FyZCwgaHdkZXAtPmRldmljZSkpIHsKKwlpZiAoc25kX2h3ZGVwX3NlYXJjaChjYXJkLCBod2RlcC0+ZGV2aWNlKSkgewogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJbGlzdF9hZGRfdGFpbCgmaHdkZXAtPmxpc3QsICZzbmRfaHdkZXBfZGV2aWNlcyk7CiAJc3ByaW50ZihuYW1lLCAiaHdDJWlEJWkiLCBod2RlcC0+Y2FyZC0+bnVtYmVyLCBod2RlcC0+ZGV2aWNlKTsKLQlpZiAoKGVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfSFdERVAsCi0JCQkJICAgICAgIGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlLAotCQkJCSAgICAgICAmc25kX2h3ZGVwX2Zfb3BzLCBod2RlcCwgbmFtZSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgaGFyZHdhcmUgZGVwZW5kZW50IGRldmljZSAlaTolaVxuIiwKLQkJCSAgIGh3ZGVwLT5jYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UpOworCWRldiA9IGh3ZGVwLT5kZXY7CisJaWYgKCFkZXYpCisJCWRldiA9IHNuZF9jYXJkX2dldF9kZXZpY2VfbGluayhod2RlcC0+Y2FyZCk7CisJZXJyID0gc25kX3JlZ2lzdGVyX2RldmljZV9mb3JfZGV2KFNORFJWX0RFVklDRV9UWVBFX0hXREVQLAorCQkJCQkgIGh3ZGVwLT5jYXJkLCBod2RlcC0+ZGV2aWNlLAorCQkJCQkgICZzbmRfaHdkZXBfZl9vcHMsIGh3ZGVwLCBuYW1lLCBkZXYpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoZGV2LAorCQkJInVuYWJsZSB0byByZWdpc3RlciBoYXJkd2FyZSBkZXBlbmRlbnQgZGV2aWNlICVpOiVpXG4iLAorCQkJY2FyZC0+bnVtYmVyLCBod2RlcC0+ZGV2aWNlKTsKIAkJbGlzdF9kZWwoJmh3ZGVwLT5saXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiBlcnI7CiAJfQorCisJaWYgKGh3ZGVwLT5ncm91cHMpIHsKKwkJc3RydWN0IGRldmljZSAqZCA9IHNuZF9nZXRfZGV2aWNlKFNORFJWX0RFVklDRV9UWVBFX0hXREVQLAorCQkJCQkJICBod2RlcC0+Y2FyZCwgaHdkZXAtPmRldmljZSk7CisJCWlmIChkKSB7CisJCQlpZiAoaHdkZXAtPnByaXZhdGVfZGF0YSkKKwkJCQlkZXZfc2V0X2RydmRhdGEoZCwgaHdkZXAtPnByaXZhdGVfZGF0YSk7CisJCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXBzKCZkLT5rb2JqLCBod2RlcC0+Z3JvdXBzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWRldl93YXJuKGRldiwKKwkJCQkJICJod2RlcCAlZDolZDogY2Fubm90IGNyZWF0ZSBzeXNmcyBncm91cHNcbiIsCisJCQkJCSBjYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UpOworCQkJcHV0X2RldmljZShkKTsKKwkJfQorCX0KKwogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTAogCWh3ZGVwLT5vc3NyZWcgPSAwOwogCWlmIChod2RlcC0+b3NzX3R5cGUgPj0gMCkgewogCQlpZiAoKGh3ZGVwLT5vc3NfdHlwZSA9PSBTTkRSVl9PU1NfREVWSUNFX1RZUEVfRE1GTSkgJiYgKGh3ZGVwLT5kZXZpY2UgIT0gMCkpIHsKLQkJCXNuZF9wcmludGsgKEtFUk5fV0FSTklORyAib25seSBod2RlcCBkZXZpY2UgMCBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBPU1MgZGlyZWN0IEZNIGRldmljZSFcbiIpOworCQkJZGV2X3dhcm4oZGV2LAorCQkJCSAib25seSBod2RlcCBkZXZpY2UgMCBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBPU1MgZGlyZWN0IEZNIGRldmljZSFcbiIpOwogCQl9IGVsc2UgewogCQkJaWYgKHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKGh3ZGVwLT5vc3NfdHlwZSwKLQkJCQkJCSAgICBod2RlcC0+Y2FyZCwgaHdkZXAtPmRldmljZSwKLQkJCQkJCSAgICAmc25kX2h3ZGVwX2Zfb3BzLCBod2RlcCwKLQkJCQkJCSAgICBod2RlcC0+b3NzX2RldikgPCAwKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIE9TUyBjb21wYXRpYmlsaXR5IGRldmljZSAlaTolaVxuIiwKLQkJCQkJICAgaHdkZXAtPmNhcmQtPm51bWJlciwgaHdkZXAtPmRldmljZSk7CisJCQkJCQkgICAgY2FyZCwgaHdkZXAtPmRldmljZSwKKwkJCQkJCSAgICAmc25kX2h3ZGVwX2Zfb3BzLCBod2RlcCkgPCAwKSB7CisJCQkJZGV2X2VycihkZXYsCisJCQkJCSJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIGNvbXBhdGliaWxpdHkgZGV2aWNlICVpOiVpXG4iLAorCQkJCQljYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UpOwogCQkJfSBlbHNlCiAJCQkJaHdkZXAtPm9zc3JlZyA9IDE7CiAJCX0KQEAgLTU0Myw1ICs1NjgsMyBAQAogCiBtb2R1bGVfaW5pdChhbHNhX2h3ZGVwX2luaXQpCiBtb2R1bGVfZXhpdChhbHNhX2h3ZGVwX2V4aXQpCi0KLUVYUE9SVF9TWU1CT0woc25kX2h3ZGVwX25ldyk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luZm8uYyBiL3NvdW5kL2NvcmUvaW5mby5jCmluZGV4IGU3OWJhYTEuLjA1MWQ1NWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5mby5jCisrKyBiL3NvdW5kL2NvcmUvaW5mby5jCkBAIC00MTgsOSArNDE4LDE0IEBACiAJCQlpZiAoZW50cnktPmMudGV4dC53cml0ZSkgewogCQkJCWVudHJ5LT5jLnRleHQud3JpdGUoZW50cnksIGRhdGEtPndidWZmZXIpOwogCQkJCWlmIChkYXRhLT53YnVmZmVyLT5lcnJvcikgewotCQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiZGF0YSB3cml0ZSBlcnJvciB0byAlcyAoJWkpXG4iLAotCQkJCQkJZW50cnktPm5hbWUsCi0JCQkJCQlkYXRhLT53YnVmZmVyLT5lcnJvcik7CisJCQkJCWlmIChlbnRyeS0+Y2FyZCkKKwkJCQkJCWRldl93YXJuKGVudHJ5LT5jYXJkLT5kZXYsICJpbmZvOiBkYXRhIHdyaXRlIGVycm9yIHRvICVzICglaSlcbiIsCisJCQkJCQkJIGVudHJ5LT5uYW1lLAorCQkJCQkJCSBkYXRhLT53YnVmZmVyLT5lcnJvcik7CisJCQkJCWVsc2UKKwkJCQkJCXByX3dhcm4oIkFMU0E6IGluZm86IGRhdGEgd3JpdGUgZXJyb3IgdG8gJXMgKCVpKVxuIiwKKwkJCQkJCQllbnRyeS0+bmFtZSwKKwkJCQkJCQlkYXRhLT53YnVmZmVyLT5lcnJvcik7CiAJCQkJfQogCQkJfQogCQkJa2ZyZWUoZGF0YS0+d2J1ZmZlci0+YnVmZmVyKTsKQEAgLTU0MCw3ICs1NDUsNyBAQAogCQlzbmRfb3NzX3Jvb3QgPSBlbnRyeTsKIAl9CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfU0VRVUVOQ0VSKQogCXsKIAkJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAkJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9tb2R1bGVfZW50cnkoVEhJU19NT0RVTEUsICJzZXEiLCBOVUxMKSkgPT0gTlVMTCkKQEAgLTU2Nyw3ICs1NzIsNyBAQAogCXNuZF9taW5vcl9pbmZvX2RvbmUoKTsKIAlzbmRfaW5mb192ZXJzaW9uX2RvbmUoKTsKIAlpZiAoc25kX3Byb2Nfcm9vdCkgewotI2lmIGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVIpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TRVFVRU5DRVJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TRVFVRU5DRVIpCiAJCXNuZF9pbmZvX2ZyZWVfZW50cnkoc25kX3NlcV9yb290KTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pbml0LmMgYi9zb3VuZC9jb3JlL2luaXQuYwppbmRleCAwZDQyZmNkLi41ZWU4Mzg0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2luaXQuYworKysgYi9zb3VuZC9jb3JlL2luaXQuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KQEAgLTk0LDcgKzk1LDcgQEAKIAlyZXR1cm4gbWF0Y2g7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfTUlYRVJfT1NTKQogaW50ICgqc25kX21peGVyX29zc19ub3RpZnlfY2FsbGJhY2spKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGZyZWVfZmxhZyk7CiBFWFBPUlRfU1lNQk9MKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKTsKICNlbmRpZgpAQCAtMTEyLDExICsxMTMsMTEgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKChlcnIgPSBzbmRfaW5mb19jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKLQkJc25kX3ByaW50ZCgidW5hYmxlIHRvIGNyZWF0ZSBjYXJkIGluZm9cbiIpOworCQlkZXZfZGJnKGNhcmQtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgY2FyZCBpbmZvXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQsICJpZCIsIGNhcmQtPnByb2Nfcm9vdCkpID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgidW5hYmxlIHRvIGNyZWF0ZSBjYXJkIGVudHJ5XG4iKTsKKwkJZGV2X2RiZyhjYXJkLT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgZW50cnlcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAllbnRyeS0+Yy50ZXh0LnJlYWQgPSBzbmRfY2FyZF9pZF9yZWFkOwpAQCAtMTU2LDggKzE1NywxNyBAQAogCXJldHVybiBtYXNrOyAvKiB1bmNoYW5nZWQgKi8KIH0KIAorc3RhdGljIGludCBzbmRfY2FyZF9kb19mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY2FyZF9kZXZfYXR0cl9ncm91cHNbXTsKKworc3RhdGljIHZvaWQgcmVsZWFzZV9jYXJkX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc25kX2NhcmRfZG9fZnJlZShkZXZfdG9fc25kX2NhcmQoZGV2KSk7Cit9CisKIC8qKgotICogIHNuZF9jYXJkX2NyZWF0ZSAtIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNvdW5kY2FyZCBzdHJ1Y3R1cmUKKyAqICBzbmRfY2FyZF9uZXcgLSBjcmVhdGUgYW5kIGluaXRpYWxpemUgYSBzb3VuZGNhcmQgc3RydWN0dXJlCisgKiAgQHBhcmVudDogdGhlIHBhcmVudCBkZXZpY2Ugb2JqZWN0CiAgKiAgQGlkeDogY2FyZCBpbmRleCAoYWRkcmVzcykgWzAgLi4uIChTTkRSVl9DQVJEUy0xKV0KICAqICBAeGlkOiBjYXJkIGlkZW50aWZpY2F0aW9uIChBU0NJSSBzdHJpbmcpCiAgKiAgQG1vZHVsZTogdG9wIGxldmVsIG1vZHVsZSBmb3IgbG9ja2luZwpAQCAtMTcyLDcgKzE4Miw3IEBACiAgKgogICogIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqLwotaW50IHNuZF9jYXJkX2NyZWF0ZShpbnQgaWR4LCBjb25zdCBjaGFyICp4aWQsCitpbnQgc25kX2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgaW50IGlkeCwgY29uc3QgY2hhciAqeGlkLAogCQkgICAgc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBpbnQgZXh0cmFfc2l6ZSwKIAkJICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRfcmV0KQogewpAQCAtMTg4LDYgKzE5OCw4IEBACiAJY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKCpjYXJkKSArIGV4dHJhX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghY2FyZCkKIAkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGV4dHJhX3NpemUgPiAwKQorCQljYXJkLT5wcml2YXRlX2RhdGEgPSAoY2hhciAqKWNhcmQgKyBzaXplb2Yoc3RydWN0IHNuZF9jYXJkKTsKIAlpZiAoeGlkKQogCQlzdHJsY3B5KGNhcmQtPmlkLCB4aWQsIHNpemVvZihjYXJkLT5pZCkpOwogCWVyciA9IDA7CkBAIC0yMDUsMTQgKzIxNywxNiBAQAogCQllcnIgPSAtRU5PREVWOwogCWlmIChlcnIgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmc25kX2NhcmRfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCB0aGUgc2xvdCBmb3IgaW5kZXggJWQgKHJhbmdlIDAtJWkpLCBlcnJvcjogJWRcbiIsCisJCWRldl9lcnIocGFyZW50LCAiY2Fubm90IGZpbmQgdGhlIHNsb3QgZm9yIGluZGV4ICVkIChyYW5nZSAwLSVpKSwgZXJyb3I6ICVkXG4iLAogCQkJIGlkeCwgc25kX2VjYXJkc19saW1pdCAtIDEsIGVycik7Ci0JCWdvdG8gX19lcnJvcjsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiBlcnI7CiAJfQogCXNldF9iaXQoaWR4LCBzbmRfY2FyZHNfbG9jayk7CQkvKiBsb2NrIGl0ICovCiAJaWYgKGlkeCA+PSBzbmRfZWNhcmRzX2xpbWl0KQogCQlzbmRfZWNhcmRzX2xpbWl0ID0gaWR4ICsgMTsgLyogaW5jcmVhc2UgdGhlIGxpbWl0ICovCiAJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7CisJY2FyZC0+ZGV2ID0gcGFyZW50OwogCWNhcmQtPm51bWJlciA9IGlkeDsKIAljYXJkLT5tb2R1bGUgPSBtb2R1bGU7CiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmRldmljZXMpOwpAQCAtMjIyLDM2ICsyMzYsNDIgQEAKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+Y3RsX2ZpbGVzKTsKIAlzcGluX2xvY2tfaW5pdCgmY2FyZC0+ZmlsZXNfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmZpbGVzX2xpc3QpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPnNodXRkb3duX3NsZWVwKTsKLQlhdG9taWNfc2V0KCZjYXJkLT5yZWZjb3VudCwgMCk7CiAjaWZkZWYgQ09ORklHX1BNCiAJbXV0ZXhfaW5pdCgmY2FyZC0+cG93ZXJfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+cG93ZXJfc2xlZXApOwogI2VuZGlmCisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmY2FyZC0+Y2FyZF9kZXYpOworCWNhcmQtPmNhcmRfZGV2LnBhcmVudCA9IHBhcmVudDsKKwljYXJkLT5jYXJkX2Rldi5jbGFzcyA9IHNvdW5kX2NsYXNzOworCWNhcmQtPmNhcmRfZGV2LnJlbGVhc2UgPSByZWxlYXNlX2NhcmRfZGV2aWNlOworCWNhcmQtPmNhcmRfZGV2Lmdyb3VwcyA9IGNhcmRfZGV2X2F0dHJfZ3JvdXBzOworCWVyciA9IGtvYmplY3Rfc2V0X25hbWUoJmNhcmQtPmNhcmRfZGV2LmtvYmosICJjYXJkJWQiLCBpZHgpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIF9fZXJyb3I7CisKIAkvKiB0aGUgY29udHJvbCBpbnRlcmZhY2UgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gdGhlIHVzZXIgc3BhY2UgdW50aWwgKi8KIAkvKiBzbmRfY2FyZHNfYml0bWFzayBhbmQgc25kX2NhcmRzIGFyZSBzZXQgd2l0aCBzbmRfY2FyZF9yZWdpc3RlciAqLwogCWVyciA9IHNuZF9jdGxfY3JlYXRlKGNhcmQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBjb250cm9sIG1pbm9yc1xuIik7CisJCWRldl9lcnIocGFyZW50LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGNvbnRyb2wgbWlub3JzXG4iKTsKIAkJZ290byBfX2Vycm9yOwogCX0KIAllcnIgPSBzbmRfaW5mb19jYXJkX2NyZWF0ZShjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gY3JlYXRlIGNhcmQgaW5mb1xuIik7CisJCWRldl9lcnIocGFyZW50LCAidW5hYmxlIHRvIGNyZWF0ZSBjYXJkIGluZm9cbiIpOwogCQlnb3RvIF9fZXJyb3JfY3RsOwogCX0KLQlpZiAoZXh0cmFfc2l6ZSA+IDApCi0JCWNhcmQtPnByaXZhdGVfZGF0YSA9IChjaGFyICopY2FyZCArIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmQpOwogCSpjYXJkX3JldCA9IGNhcmQ7CiAJcmV0dXJuIDA7CiAKICAgICAgIF9fZXJyb3JfY3RsOgotCXNuZF9kZXZpY2VfZnJlZV9hbGwoY2FyZCwgU05EUlZfREVWX0NNRF9QUkUpOworCXNuZF9kZXZpY2VfZnJlZV9hbGwoY2FyZCk7CiAgICAgICBfX2Vycm9yOgotCWtmcmVlKGNhcmQpOworCXB1dF9kZXZpY2UoJmNhcmQtPmNhcmRfZGV2KTsKICAgCXJldHVybiBlcnI7CiB9Ci1FWFBPUlRfU1lNQk9MKHNuZF9jYXJkX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKHNuZF9jYXJkX25ldyk7CiAKIC8qIHJldHVybiBub24temVybyBpZiBhIGNhcmQgaXMgYWxyZWFkeSBsb2NrZWQgKi8KIGludCBzbmRfY2FyZF9sb2NrZWQoaW50IGNhcmQpCkBAIC0zOTQsNyArNDE0LDcgQEAKIAkvKiBwaGFzZSAzOiBub3RpZnkgYWxsIGNvbm5lY3RlZCBkZXZpY2VzIGFib3V0IGRpc2Nvbm5lY3Rpb24gKi8KIAkvKiBhdCB0aGlzIHBvaW50LCB0aGV5IGNhbm5vdCByZXNwb25kIHRvIGFueSBjYWxscyBleGNlcHQgcmVsZWFzZSgpICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfTUlYRVJfT1NTKQogCWlmIChzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjaykKIAkJc25kX21peGVyX29zc19ub3RpZnlfY2FsbGJhY2soY2FyZCwgU05EX01JWEVSX09TU19OT1RJRllfRElTQ09OTkVDVCk7CiAjZW5kaWYKQEAgLTQwMiwxMiArNDIyLDEyIEBACiAJLyogbm90aWZ5IGFsbCBkZXZpY2VzIHRoYXQgd2UgYXJlIGRpc2Nvbm5lY3RlZCAqLwogCWVyciA9IHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoY2FyZCk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm5vdCBhbGwgZGV2aWNlcyBmb3IgY2FyZCAlaSBjYW4gYmUgZGlzY29ubmVjdGVkXG4iLCBjYXJkLT5udW1iZXIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIm5vdCBhbGwgZGV2aWNlcyBmb3IgY2FyZCAlaSBjYW4gYmUgZGlzY29ubmVjdGVkXG4iLCBjYXJkLT5udW1iZXIpOwogCiAJc25kX2luZm9fY2FyZF9kaXNjb25uZWN0KGNhcmQpOwotCWlmIChjYXJkLT5jYXJkX2RldikgewotCQlkZXZpY2VfdW5yZWdpc3RlcihjYXJkLT5jYXJkX2Rldik7Ci0JCWNhcmQtPmNhcmRfZGV2ID0gTlVMTDsKKwlpZiAoY2FyZC0+cmVnaXN0ZXJlZCkgeworCQlkZXZpY2VfZGVsKCZjYXJkLT5jYXJkX2Rldik7CisJCWNhcmQtPnJlZ2lzdGVyZWQgPSBmYWxzZTsKIAl9CiAjaWZkZWYgQ09ORklHX1BNCiAJd2FrZV91cCgmY2FyZC0+cG93ZXJfc2xlZXApOwpAQCAtNDMwLDgxICs0NTAsNDggQEAKICAqLwogc3RhdGljIGludCBzbmRfY2FyZF9kb19mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfTUlYRVJfT1NTKQogCWlmIChzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjaykKIAkJc25kX21peGVyX29zc19ub3RpZnlfY2FsbGJhY2soY2FyZCwgU05EX01JWEVSX09TU19OT1RJRllfRlJFRSk7CiAjZW5kaWYKLQlpZiAoc25kX2RldmljZV9mcmVlX2FsbChjYXJkLCBTTkRSVl9ERVZfQ01EX1BSRSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBmcmVlIGFsbCBkZXZpY2VzIChwcmUpXG4iKTsKLQkJLyogRmF0YWwsIGJ1dCB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIgKi8KLQl9Ci0JaWYgKHNuZF9kZXZpY2VfZnJlZV9hbGwoY2FyZCwgU05EUlZfREVWX0NNRF9OT1JNQUwpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZnJlZSBhbGwgZGV2aWNlcyAobm9ybWFsKVxuIik7Ci0JCS8qIEZhdGFsLCBidXQgdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5ldmVyIG9jY3VyICovCi0JfQotCWlmIChzbmRfZGV2aWNlX2ZyZWVfYWxsKGNhcmQsIFNORFJWX0RFVl9DTURfUE9TVCkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBmcmVlIGFsbCBkZXZpY2VzIChwb3N0KVxuIik7Ci0JCS8qIEZhdGFsLCBidXQgdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5ldmVyIG9jY3VyICovCi0JfQorCXNuZF9kZXZpY2VfZnJlZV9hbGwoY2FyZCk7CiAJaWYgKGNhcmQtPnByaXZhdGVfZnJlZSkKIAkJY2FyZC0+cHJpdmF0ZV9mcmVlKGNhcmQpOwogCXNuZF9pbmZvX2ZyZWVfZW50cnkoY2FyZC0+cHJvY19pZCk7CiAJaWYgKHNuZF9pbmZvX2NhcmRfZnJlZShjYXJkKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInVuYWJsZSB0byBmcmVlIGNhcmQgaW5mb1xuIik7CisJCWRldl93YXJuKGNhcmQtPmRldiwgInVuYWJsZSB0byBmcmVlIGNhcmQgaW5mb1xuIik7CiAJCS8qIE5vdCBmYXRhbCBlcnJvciAqLwogCX0KKwlpZiAoY2FyZC0+cmVsZWFzZV9jb21wbGV0aW9uKQorCQljb21wbGV0ZShjYXJkLT5yZWxlYXNlX2NvbXBsZXRpb24pOwogCWtmcmVlKGNhcmQpOwogCXJldHVybiAwOwogfQogCi0vKioKLSAqIHNuZF9jYXJkX3VucmVmIC0gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50ZXIKLSAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQotICoKLSAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudGVyLiAgV2hlbiBpdCByZWFjaGVzIHRvIHplcm8sIHdha2UgdXAKLSAqIHRoZSBzbGVlcGVyIGFuZCBjYWxsIHRoZSBkZXN0cnVjdG9yIGlmIG5lZWRlZC4KLSAqLwotdm9pZCBzbmRfY2FyZF91bnJlZihzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhcmQtPnJlZmNvdW50KSkgewotCQl3YWtlX3VwKCZjYXJkLT5zaHV0ZG93bl9zbGVlcCk7Ci0JCWlmIChjYXJkLT5mcmVlX29uX2xhc3RfY2xvc2UpCi0JCQlzbmRfY2FyZF9kb19mcmVlKGNhcmQpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woc25kX2NhcmRfdW5yZWYpOwotCiBpbnQgc25kX2NhcmRfZnJlZV93aGVuX2Nsb3NlZChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7Ci0JaW50IHJldDsKLQotCWF0b21pY19pbmMoJmNhcmQtPnJlZmNvdW50KTsKLQlyZXQgPSBzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwotCWlmIChyZXQpIHsKLQkJYXRvbWljX2RlYygmY2FyZC0+cmVmY291bnQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWNhcmQtPmZyZWVfb25fbGFzdF9jbG9zZSA9IDE7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhcmQtPnJlZmNvdW50KSkKLQkJc25kX2NhcmRfZG9fZnJlZShjYXJkKTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9mcmVlX3doZW5fY2xvc2VkKTsKLQotaW50IHNuZF9jYXJkX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQotewogCWludCByZXQgPSBzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0KLQkvKiB3YWl0LCB1bnRpbCBhbGwgZGV2aWNlcyBhcmUgcmVhZHkgZm9yIHRoZSBmcmVlIG9wZXJhdGlvbiAqLwotCXdhaXRfZXZlbnQoY2FyZC0+c2h1dGRvd25fc2xlZXAsICFhdG9taWNfcmVhZCgmY2FyZC0+cmVmY291bnQpKTsKLQlzbmRfY2FyZF9kb19mcmVlKGNhcmQpOworCXB1dF9kZXZpY2UoJmNhcmQtPmNhcmRfZGV2KTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX2NhcmRfZnJlZV93aGVuX2Nsb3NlZCk7CiAKK2ludCBzbmRfY2FyZF9mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbiByZWxlYXNlZDsKKwlpbnQgcmV0OworCisJaW5pdF9jb21wbGV0aW9uKCZyZWxlYXNlZCk7CisJY2FyZC0+cmVsZWFzZV9jb21wbGV0aW9uID0gJnJlbGVhc2VkOworCXJldCA9IHNuZF9jYXJkX2ZyZWVfd2hlbl9jbG9zZWQoY2FyZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKiB3YWl0LCB1bnRpbCBhbGwgZGV2aWNlcyBhcmUgcmVhZHkgZm9yIHRoZSBmcmVlIG9wZXJhdGlvbiAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJlbGVhc2VkKTsKKwlyZXR1cm4gMDsKK30KIEVYUE9SVF9TWU1CT0woc25kX2NhcmRfZnJlZSk7CiAKIC8qIHJldHJpZXZlIHRoZSBsYXN0IHdvcmQgb2Ygc2hvcnRuYW1lIG9yIGxvbmduYW1lICovCkBAIC01OTgsNyArNTg1LDcgQEAKIAkJZ290byBhZ2FpbjsKIAl9CiAJLyogbGFzdCByZXNvcnQuLi4gKi8KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gc2V0IGNhcmQgaWQgKCVzKVxuIiwgaWQpOworCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHNldCBjYXJkIGlkICglcylcbiIsIGlkKTsKIAlpZiAoY2FyZC0+cHJvY19yb290LT5uYW1lKQogCQlzdHJsY3B5KGNhcmQtPmlkLCBjYXJkLT5wcm9jX3Jvb3QtPm5hbWUsIHNpemVvZihjYXJkLT5pZCkpOwogfQpAQCAtNjI2LDE1ICs2MTMsMTUgQEAKIGNhcmRfaWRfc2hvd19hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBjYXJkID8gY2FyZC0+aWQgOiAiKG51bGwpIik7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHNuZF9jYXJkLCBjYXJkX2Rldik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGNhcmQtPmlkKTsKIH0KIAogc3RhdGljIHNzaXplX3QKIGNhcmRfaWRfc3RvcmVfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc25kX2NhcmQsIGNhcmRfZGV2KTsKIAljaGFyIGJ1ZjFbc2l6ZW9mKGNhcmQtPmlkKV07CiAJc2l6ZV90IGNvcHkgPSBjb3VudCA+IHNpemVvZihjYXJkLT5pZCkgLSAxID8KIAkJCQkJc2l6ZW9mKGNhcmQtPmlkKSAtIDEgOiBjb3VudDsKQEAgLTY2MCwxOSArNjQ3LDMyIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgY2FyZF9pZF9hdHRycyA9Ci0JX19BVFRSKGlkLCBTX0lSVUdPIHwgU19JV1VTUiwgY2FyZF9pZF9zaG93X2F0dHIsIGNhcmRfaWRfc3RvcmVfYXR0cik7CitzdGF0aWMgREVWSUNFX0FUVFIoaWQsIFNfSVJVR08gfCBTX0lXVVNSLCBjYXJkX2lkX3Nob3dfYXR0ciwgY2FyZF9pZF9zdG9yZV9hdHRyKTsKIAogc3RhdGljIHNzaXplX3QKIGNhcmRfbnVtYmVyX3Nob3dfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgY2FyZCA/IGNhcmQtPm51bWJlciA6IC0xKTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc25kX2NhcmQsIGNhcmRfZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgY2FyZC0+bnVtYmVyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGNhcmRfbnVtYmVyX2F0dHJzID0KLQlfX0FUVFIobnVtYmVyLCBTX0lSVUdPLCBjYXJkX251bWJlcl9zaG93X2F0dHIsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG51bWJlciwgU19JUlVHTywgY2FyZF9udW1iZXJfc2hvd19hdHRyLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNhcmRfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2lkLmF0dHIsCisJJmRldl9hdHRyX251bWJlci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNhcmRfZGV2X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzCT0gY2FyZF9kZXZfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY2FyZF9kZXZfYXR0cl9ncm91cHNbXSA9IHsKKwkmY2FyZF9kZXZfYXR0cl9ncm91cCwKKwlOVUxMCit9OwogCiAvKioKICAqICBzbmRfY2FyZF9yZWdpc3RlciAtIHJlZ2lzdGVyIHRoZSBzb3VuZGNhcmQKQEAgLTY5MiwxMiArNjkyLDExIEBACiAJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghY2FyZC0+Y2FyZF9kZXYpIHsKLQkJY2FyZC0+Y2FyZF9kZXYgPSBkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBjYXJkLT5kZXYsCi0JCQkJCSAgICAgICBNS0RFVigwLCAwKSwgY2FyZCwKLQkJCQkJICAgICAgICJjYXJkJWkiLCBjYXJkLT5udW1iZXIpOwotCQlpZiAoSVNfRVJSKGNhcmQtPmNhcmRfZGV2KSkKLQkJCWNhcmQtPmNhcmRfZGV2ID0gTlVMTDsKKwlpZiAoIWNhcmQtPnJlZ2lzdGVyZWQpIHsKKwkJZXJyID0gZGV2aWNlX2FkZCgmY2FyZC0+Y2FyZF9kZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWNhcmQtPnJlZ2lzdGVyZWQgPSB0cnVlOwogCX0KIAogCWlmICgoZXJyID0gc25kX2RldmljZV9yZWdpc3Rlcl9hbGwoY2FyZCkpIDwgMCkKQEAgLTcyMywxOSArNzIyLDEwIEBACiAJc25kX2NhcmRzW2NhcmQtPm51bWJlcl0gPSBjYXJkOwogCW11dGV4X3VubG9jaygmc25kX2NhcmRfbXV0ZXgpOwogCWluaXRfaW5mb19mb3JfY2FyZChjYXJkKTsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfTUlYRVJfT1NTKQogCWlmIChzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjaykKIAkJc25kX21peGVyX29zc19ub3RpZnlfY2FsbGJhY2soY2FyZCwgU05EX01JWEVSX09TU19OT1RJRllfUkVHSVNURVIpOwogI2VuZGlmCi0JaWYgKGNhcmQtPmNhcmRfZGV2KSB7Ci0JCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShjYXJkLT5jYXJkX2RldiwgJmNhcmRfaWRfYXR0cnMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShjYXJkLT5jYXJkX2RldiwgJmNhcmRfbnVtYmVyX2F0dHJzKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC05MDgsNyArODk4LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWxpc3RfYWRkKCZtZmlsZS0+bGlzdCwgJmNhcmQtPmZpbGVzX2xpc3QpOwotCWF0b21pY19pbmMoJmNhcmQtPnJlZmNvdW50KTsKKwlnZXRfZGV2aWNlKCZjYXJkLT5jYXJkX2Rldik7CiAJc3Bpbl91bmxvY2soJmNhcmQtPmZpbGVzX2xvY2spOwogCXJldHVybiAwOwogfQpAQCAtOTQ3LDExICs5MzcsMTEgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmNhcmQtPmZpbGVzX2xvY2spOwogCWlmICghZm91bmQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUxTQSBjYXJkIGZpbGUgcmVtb3ZlIHByb2JsZW0gKCVwKVxuIiwgZmlsZSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2FyZCBmaWxlIHJlbW92ZSBwcm9ibGVtICglcClcbiIsIGZpbGUpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAJa2ZyZWUoZm91bmQpOwotCXNuZF9jYXJkX3VucmVmKGNhcmQpOworCXB1dF9kZXZpY2UoJmNhcmQtPmNhcmRfZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pc2FkbWEuYyBiL3NvdW5kL2NvcmUvaXNhZG1hLmMKaW5kZXggZTJiMzg2MS4uMzFlODU0NCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pc2FkbWEuYworKysgYi9zb3VuZC9jb3JlL2lzYWRtYS5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkJcmVzdWx0ID0gcmVzdWx0MTsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJaWYgKHJlc3VsdCA+IHNpemUpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBvaW50ZXIgKDB4JXgpIGZvciBETUEgIyVsZCBpcyBncmVhdGVyIHRoYW4gdHJhbnNmZXIgc2l6ZSAoMHgleClcbiIsIHJlc3VsdCwgZG1hLCBzaXplKTsKKwkJcHJfZXJyKCJBTFNBOiBwb2ludGVyICgweCV4KSBmb3IgRE1BICMlbGQgaXMgZ3JlYXRlciB0aGFuIHRyYW5zZmVyIHNpemUgKDB4JXgpXG4iLCByZXN1bHQsIGRtYSwgc2l6ZSk7CiAjZW5kaWYKIAlpZiAocmVzdWx0ID49IHNpemUgfHwgcmVzdWx0ID09IDApCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9tZW1hbGxvYy5jIGIvc291bmQvY29yZS9tZW1hbGxvYy5jCmluZGV4IDQ1OTVmOTMuLjA4MjUwOWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvbWVtYWxsb2MuYworKysgYi9zb3VuZC9jb3JlL21lbWFsbG9jLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAic25kLW1hbGxvYzogaW52YWxpZCBkZXZpY2UgdHlwZSAlZFxuIiwgdHlwZSk7CisJCXByX2Vycigic25kLW1hbGxvYzogaW52YWxpZCBkZXZpY2UgdHlwZSAlZFxuIiwgdHlwZSk7CiAJCWRtYWItPmFyZWEgPSBOVUxMOwogCQlkbWFiLT5hZGRyID0gMDsKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTI4NCw3ICsyODQsNyBAQAogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAic25kLW1hbGxvYzogaW52YWxpZCBkZXZpY2UgdHlwZSAlZFxuIiwgZG1hYi0+ZGV2LnR5cGUpOworCQlwcl9lcnIoInNuZC1tYWxsb2M6IGludmFsaWQgZGV2aWNlIHR5cGUgJWRcbiIsIGRtYWItPmRldi50eXBlKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL21peGVyX29zcy5jIGIvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMKaW5kZXggZThhMWQxOC4uNWU2MzQ5ZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMKKysrIGIvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMKQEAgLTExODcsNyArMTE4Nyw4IEBACiAJCQlpZiAob3NzX21peGVyX25hbWVzW2NoXSAmJiBzdHJjbXAob3NzX21peGVyX25hbWVzW2NoXSwgc3RyKSA9PSAwKQogCQkJCWJyZWFrOwogCQlpZiAoY2ggPj0gU05EUlZfT1NTX01BWF9NSVhFUlMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGVyX29zczogaW52YWxpZCBPU1Mgdm9sdW1lICclcydcbiIsIHN0cik7CisJCQlwcl9lcnIoIkFMU0E6IG1peGVyX29zczogaW52YWxpZCBPU1Mgdm9sdW1lICclcydcbiIsCisJCQkgICAgICAgc3RyKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWNwdHIgPSBzbmRfaW5mb19nZXRfc3RyKHN0ciwgY3B0ciwgc2l6ZW9mKHN0cikpOwpAQCAtMTIwMSw3ICsxMjAyLDcgQEAKIAkJc25kX2luZm9fZ2V0X3N0cihpZHhzdHIsIGNwdHIsIHNpemVvZihpZHhzdHIpKTsKIAkJaWR4ID0gc2ltcGxlX3N0cnRvdWwoaWR4c3RyLCBOVUxMLCAxMCk7CiAJCWlmIChpZHggPj0gMHg0MDAwKSB7IC8qIHRvbyBiaWcgKi8KLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGVyX29zczogaW52YWxpZCBpbmRleCAlZFxuIiwgaWR4KTsKKwkJCXByX2VycigiQUxTQTogbWl4ZXJfb3NzOiBpbnZhbGlkIGluZGV4ICVkXG4iLCBpZHgpOwogCQkJY29udGludWU7CiAJCX0KIAkJbXV0ZXhfbG9jaygmbWl4ZXItPnJlZ19tdXRleCk7CkBAIC0xMjEyLDcgKzEyMTMsNyBAQAogCQkJZ290byBfX3VubG9jazsKIAkJdGJsID0ga21hbGxvYyhzaXplb2YoKnRibCksIEdGUF9LRVJORUwpOwogCQlpZiAoISB0YmwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGVyX29zczogbm8gbWVtb3J5XG4iKTsKKwkJCXByX2VycigiQUxTQTogbWl4ZXJfb3NzOiBubyBtZW1vcnlcbiIpOwogCQkJZ290byBfX3VubG9jazsKIAkJfQogCQl0YmwtPm9zc19pZCA9IGNoOwpAQCAtMTM0MywyMCArMTM0NCwxOCBAQAogCXN0cnVjdCBzbmRfbWl4ZXJfb3NzICptaXhlcjsKIAogCWlmIChjbWQgPT0gU05EX01JWEVSX09TU19OT1RJRllfUkVHSVNURVIpIHsKLQkJY2hhciBuYW1lWzEyOF07CiAJCWludCBpZHgsIGVycjsKIAogCQltaXhlciA9IGtjYWxsb2MoMiwgc2l6ZW9mKCptaXhlciksIEdGUF9LRVJORUwpOwogCQlpZiAobWl4ZXIgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQltdXRleF9pbml0KCZtaXhlci0+cmVnX211dGV4KTsKLQkJc3ByaW50ZihuYW1lLCAibWl4ZXIlaSVpIiwgY2FyZC0+bnVtYmVyLCAwKTsKIAkJaWYgKChlcnIgPSBzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfTUlYRVIsCiAJCQkJCQkgICBjYXJkLCAwLAotCQkJCQkJICAgJnNuZF9taXhlcl9vc3NfZl9vcHMsIGNhcmQsCi0JCQkJCQkgICBuYW1lKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIG1peGVyIGRldmljZSAlaTolaVxuIiwKLQkJCQkgICBjYXJkLT5udW1iZXIsIDApOworCQkJCQkJICAgJnNuZF9taXhlcl9vc3NfZl9vcHMsIGNhcmQpKSA8IDApIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIG1peGVyIGRldmljZSAlaTolaVxuIiwKKwkJCQljYXJkLT5udW1iZXIsIDApOwogCQkJa2ZyZWUobWl4ZXIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMTM2NSw3ICsxMzY0LDggQEAKIAkJaWYgKCpjYXJkLT5taXhlcm5hbWUpCiAJCQlzdHJsY3B5KG1peGVyLT5uYW1lLCBjYXJkLT5taXhlcm5hbWUsIHNpemVvZihtaXhlci0+bmFtZSkpOwogCQllbHNlCi0JCQlzdHJsY3B5KG1peGVyLT5uYW1lLCBuYW1lLCBzaXplb2YobWl4ZXItPm5hbWUpKTsKKwkJCXNucHJpbnRmKG1peGVyLT5uYW1lLCBzaXplb2YobWl4ZXItPm5hbWUpLAorCQkJCSAibWl4ZXIlaSIsIGNhcmQtPm51bWJlcik7CiAjaWZkZWYgU05EUlZfT1NTX0lORk9fREVWX01JWEVSUwogCQlzbmRfb3NzX2luZm9fcmVnaXN0ZXIoU05EUlZfT1NTX0lORk9fREVWX01JWEVSUywKIAkJCQkgICAgICBjYXJkLT5udW1iZXIsCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKaW5kZXggNGMxY2M1MS4uYWRhNjlkNyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwpAQCAtODU0LDcgKzg1NCw3IEBACiAJcGFyYW1zID0ga21hbGxvYyhzaXplb2YoKnBhcmFtcyksIEdGUF9LRVJORUwpOwogCXNwYXJhbXMgPSBrbWFsbG9jKHNpemVvZigqc3BhcmFtcyksIEdGUF9LRVJORUwpOwogCWlmICghc3dfcGFyYW1zIHx8ICFwYXJhbXMgfHwgIXNwYXJhbXMpIHsKLQkJc25kX3ByaW50ZCgiTm8gbWVtb3J5XG4iKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIk5vIG1lbW9yeVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbHVyZTsKIAl9CkBAIC04NzcsNyArODc3LDcgQEAKIAl9CiAJZXJyID0gc25kX3BjbV9od19wYXJhbV9tYXNrKHN1YnN0cmVhbSwgc3BhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0FDQ0VTUywgJm1hc2spOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGQoIk5vIHVzYWJsZSBhY2Nlc3Nlc1xuIik7CisJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sICJObyB1c2FibGUgYWNjZXNzZXNcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGZhaWx1cmU7CiAJfQpAQCAtOTAyLDcgKzkwMiw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKChfX2ZvcmNlIGludClzZm9ybWF0ID4gKF9fZm9yY2UgaW50KVNORFJWX1BDTV9GT1JNQVRfTEFTVCkgewotCQkJc25kX3ByaW50ZCgiQ2Fubm90IGZpbmQgYSBmb3JtYXQhISFcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIkNhbm5vdCBmaW5kIGEgZm9ybWF0ISEhXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGZhaWx1cmU7CiAJCX0KQEAgLTk0MiwxNCArOTQyLDE2IEBACiAJCWlmICgoZXJyID0gc25kX3BjbV9wbHVnX2Zvcm1hdF9wbHVnaW5zKHN1YnN0cmVhbSwKIAkJCQkJCSAgICAgICBwYXJhbXMsIAogCQkJCQkJICAgICAgIHNwYXJhbXMpKSA8IDApIHsKLQkJCXNuZF9wcmludGQoInNuZF9wY21fcGx1Z19mb3JtYXRfcGx1Z2lucyBmYWlsZWQ6ICVpXG4iLCBlcnIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkic25kX3BjbV9wbHVnX2Zvcm1hdF9wbHVnaW5zIGZhaWxlZDogJWlcbiIsIGVycik7CiAJCQlzbmRfcGNtX29zc19wbHVnaW5fY2xlYXIoc3Vic3RyZWFtKTsKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfQogCQlpZiAocnVudGltZS0+b3NzLnBsdWdpbl9maXJzdCkgewogCQkJc3RydWN0IHNuZF9wY21fcGx1Z2luICpwbHVnaW47CiAJCQlpZiAoKGVyciA9IHNuZF9wY21fcGx1Z2luX2J1aWxkX2lvKHN1YnN0cmVhbSwgc3BhcmFtcywgJnBsdWdpbikpIDwgMCkgewotCQkJCXNuZF9wcmludGQoInNuZF9wY21fcGx1Z2luX2J1aWxkX2lvIGZhaWxlZDogJWlcbiIsIGVycik7CisJCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCQkJInNuZF9wY21fcGx1Z2luX2J1aWxkX2lvIGZhaWxlZDogJWlcbiIsIGVycik7CiAJCQkJc25kX3BjbV9vc3NfcGx1Z2luX2NsZWFyKHN1YnN0cmVhbSk7CiAJCQkJZ290byBmYWlsdXJlOwogCQkJfQpAQCAtOTgzLDcgKzk4NSw3IEBACiAJc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfRFJPUCwgTlVMTCk7CiAKIAlpZiAoKGVyciA9IHNuZF9wY21fa2VybmVsX2lvY3RsKHN1YnN0cmVhbSwgU05EUlZfUENNX0lPQ1RMX0hXX1BBUkFNUywgc3BhcmFtcykpIDwgMCkgewotCQlzbmRfcHJpbnRkKCJIV19QQVJBTVMgZmFpbGVkOiAlaVxuIiwgZXJyKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIkhXX1BBUkFNUyBmYWlsZWQ6ICVpXG4iLCBlcnIpOwogCQlnb3RvIGZhaWx1cmU7CiAJfQogCkBAIC0xMDE2LDcgKzEwMTgsNyBAQAogCX0KIAogCWlmICgoZXJyID0gc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfU1dfUEFSQU1TLCBzd19wYXJhbXMpKSA8IDApIHsKLQkJc25kX3ByaW50ZCgiU1dfUEFSQU1TIGZhaWxlZDogJWlcbiIsIGVycik7CisJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sICJTV19QQVJBTVMgZmFpbGVkOiAlaVxuIiwgZXJyKTsKIAkJZ290byBmYWlsdXJlOwogCX0KIApAQCAtMTExMCw3ICsxMTEyLDggQEAKIAogCWVyciA9IHNuZF9wY21fa2VybmVsX2lvY3RsKHN1YnN0cmVhbSwgU05EUlZfUENNX0lPQ1RMX1BSRVBBUkUsIE5VTEwpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGQoInNuZF9wY21fb3NzX3ByZXBhcmU6IFNORFJWX1BDTV9JT0NUTF9QUkVQQVJFIGZhaWxlZFxuIik7CisJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkic25kX3BjbV9vc3NfcHJlcGFyZTogU05EUlZfUENNX0lPQ1RMX1BSRVBBUkUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcnVudGltZS0+b3NzLnByZXBhcmUgPSAwOwpAQCAtMTE3NSwxMiArMTE3OCwxMCBAQAogCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiB8fAogCQkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEKSB7CiAjaWZkZWYgT1NTX0RFQlVHCi0JCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTikKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogd3JpdGU6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBYUlVOXG4iKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogd3JpdGU6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBTVVNQRU5EXG4iKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkJInBjbV9vc3M6IHdyaXRlOiByZWNvdmVyaW5nIGZyb20gJXNcbiIsCisJCQkJcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiA/CisJCQkJIlhSVU4iIDogIlNVU1BFTkQiKTsKICNlbmRpZgogCQkJcmV0ID0gc25kX3BjbV9vc3NfcHJlcGFyZShzdWJzdHJlYW0pOwogCQkJaWYgKHJldCA8IDApCkBAIC0xMjEzLDEyICsxMjE0LDEwIEBACiAJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8CiAJCSAgICBydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpIHsKICNpZmRlZiBPU1NfREVCVUcKLQkJCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiByZWFkOiAiCi0JCQkJICAgICAgICJyZWNvdmVyaW5nIGZyb20gWFJVTlxuIik7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHJlYWQ6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBTVVNQRU5EXG4iKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkJInBjbV9vc3M6IHJlYWQ6IHJlY292ZXJpbmcgZnJvbSAlc1xuIiwKKwkJCQlydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOID8KKwkJCQkiWFJVTiIgOiAiU1VTUEVORCIpOwogI2VuZGlmCiAJCQlyZXQgPSBzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9EUkFJTiwgTlVMTCk7CiAJCQlpZiAocmV0IDwgMCkKQEAgLTEyNjEsMTIgKzEyNjAsMTAgQEAKIAkJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gfHwKIAkJICAgIHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRCkgewogI2lmZGVmIE9TU19ERUJVRwotCQkJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4pCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IHdyaXRldjogIgotCQkJCSAgICAgICAicmVjb3ZlcmluZyBmcm9tIFhSVU5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB3cml0ZXY6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBTVVNQRU5EXG4iKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkJInBjbV9vc3M6IHdyaXRldjogcmVjb3ZlcmluZyBmcm9tICVzXG4iLAorCQkJCXJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gPworCQkJCSJYUlVOIiA6ICJTVVNQRU5EIik7CiAjZW5kaWYKIAkJCXJldCA9IHNuZF9wY21fb3NzX3ByZXBhcmUoc3Vic3RyZWFtKTsKIAkJCWlmIChyZXQgPCAwKQpAQCAtMTI5OSwxMiArMTI5NiwxMCBAQAogCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiB8fAogCQkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEKSB7CiAjaWZkZWYgT1NTX0RFQlVHCi0JCQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTikKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogcmVhZHY6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBYUlVOXG4iKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogcmVhZHY6ICIKLQkJCQkgICAgICAgInJlY292ZXJpbmcgZnJvbSBTVVNQRU5EXG4iKTsKKwkJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkJInBjbV9vc3M6IHJlYWR2OiByZWNvdmVyaW5nIGZyb20gJXNcbiIsCisJCQkJcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiA/CisJCQkJIlhSVU4iIDogIlNVU1BFTkQiKTsKICNlbmRpZgogCQkJcmV0ID0gc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfRFJBSU4sIE5VTEwpOwogCQkJaWYgKHJldCA8IDApCkBAIC0xNTYxLDcgKzE1NTYsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZSgmcnVudGltZS0+c2xlZXAsICZ3YWl0KTsKICNpZmRlZiBPU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAic3luYzE6IHNpemUgPSAlbGlcbiIsIHNpemUpOworCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sICJzeW5jMTogc2l6ZSA9ICVsaVxuIiwgc2l6ZSk7CiAjZW5kaWYKIAl3aGlsZSAoMSkgewogCQlyZXN1bHQgPSBzbmRfcGNtX29zc193cml0ZTIoc3Vic3RyZWFtLCBydW50aW1lLT5vc3MuYnVmZmVyLCBzaXplLCAxKTsKQEAgLTE1ODcsNyArMTU4Miw4IEBACiAJCQlicmVhazsKIAkJfQogCQlpZiAocmVzID09IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIk9TUyBzeW5jIGVycm9yIC0gRE1BIHRpbWVvdXRcbiIpOworCQkJcGNtX2VycihzdWJzdHJlYW0tPnBjbSwKKwkJCQkiT1NTIHN5bmMgZXJyb3IgLSBETUEgdGltZW91dFxuIik7CiAJCQlyZXN1bHQgPSAtRUlPOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE2MTgsNyArMTYxNCw3IEBACiAJCW11dGV4X2xvY2soJnJ1bnRpbWUtPm9zcy5wYXJhbXNfbG9jayk7CiAJCWlmIChydW50aW1lLT5vc3MuYnVmZmVyX3VzZWQgPiAwKSB7CiAjaWZkZWYgT1NTX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAic3luYzogYnVmZmVyX3VzZWRcbiIpOworCQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgInN5bmM6IGJ1ZmZlcl91c2VkXG4iKTsKICNlbmRpZgogCQkJc2l6ZSA9ICg4ICogKHJ1bnRpbWUtPm9zcy5wZXJpb2RfYnl0ZXMgLSBydW50aW1lLT5vc3MuYnVmZmVyX3VzZWQpICsgNykgLyB3aWR0aDsKIAkJCXNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKGZvcm1hdCwKQEAgLTE2MzEsNyArMTYyNyw3IEBACiAJCQl9CiAJCX0gZWxzZSBpZiAocnVudGltZS0+b3NzLnBlcmlvZF9wdHIgPiAwKSB7CiAjaWZkZWYgT1NTX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAic3luYzogcGVyaW9kX3B0clxuIik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLCAic3luYzogcGVyaW9kX3B0clxuIik7CiAjZW5kaWYKIAkJCXNpemUgPSBydW50aW1lLT5vc3MucGVyaW9kX2J5dGVzIC0gcnVudGltZS0+b3NzLnBlcmlvZF9wdHI7CiAJCQlzbmRfcGNtX2Zvcm1hdF9zZXRfc2lsZW5jZShmb3JtYXQsCkBAIC0xOTgzLDcgKzE5NzksNyBAQAogCWludCBlcnIsIGNtZDsKIAogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiB0cmlnZ2VyID0gMHgleFxuIiwgdHJpZ2dlcik7CisJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgInBjbV9vc3M6IHRyaWdnZXIgPSAweCV4XG4iLCB0cmlnZ2VyKTsKICNlbmRpZgogCQogCXBzdWJzdHJlYW0gPSBwY21fb3NzX2ZpbGUtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107CkBAIC0yMjAzLDkgKzIxOTksOSBAQAogCX0KIAogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiBzcGFjZTogYnl0ZXMgPSAlaSwgZnJhZ21lbnRzID0gJWksICIKLQkgICAgICAgImZyYWdzdG90YWwgPSAlaSwgZnJhZ3NpemUgPSAlaVxuIiwKLQkgICAgICAgaW5mby5ieXRlcywgaW5mby5mcmFnbWVudHMsIGluZm8uZnJhZ3N0b3RhbCwgaW5mby5mcmFnc2l6ZSk7CisJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJInBjbV9vc3M6IHNwYWNlOiBieXRlcyA9ICVpLCBmcmFnbWVudHMgPSAlaSwgZnJhZ3N0b3RhbCA9ICVpLCBmcmFnc2l6ZSA9ICVpXG4iLAorCQlpbmZvLmJ5dGVzLCBpbmZvLmZyYWdtZW50cywgaW5mby5mcmFnc3RvdGFsLCBpbmZvLmZyYWdzaXplKTsKICNlbmRpZgogCWlmIChjb3B5X3RvX3VzZXIoX2luZm8sICZpbmZvLCBzaXplb2YoaW5mbykpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIyMTUsNyArMjIxMSw3IEBACiBzdGF0aWMgaW50IHNuZF9wY21fb3NzX2dldF9tYXBidWYoc3RydWN0IHNuZF9wY21fb3NzX2ZpbGUgKnBjbV9vc3NfZmlsZSwgaW50IHN0cmVhbSwgc3RydWN0IGJ1ZmZtZW1fZGVzYyBfX3VzZXIgKiBfaW5mbykKIHsKIAkvLyBpdCB3b24ndCBiZSBwcm9iYWJseSBpbXBsZW1lbnRlZAotCS8vIHNuZF9wcmludGQoIlRPRE86IHNuZF9wY21fb3NzX2dldF9tYXBidWZcbiIpOworCS8vIHByX2RlYnVnKCJUT0RPOiBzbmRfcGNtX29zc19nZXRfbWFwYnVmXG4iKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtMjUxOSw3ICsyNTE1LDcgQEAKIAlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSAhPSAnUCcpCiAJCXJldHVybiAtRUlOVkFMOwogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiBpb2N0bCA9IDB4JXhcbiIsIGNtZCk7CisJcHJfZGVidWcoInBjbV9vc3M6IGlvY3RsID0gMHgleFxuIiwgY21kKTsKICNlbmRpZgogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgpAQCAtMjY0Niw3ICsyNjQyLDcgQEAKIAljYXNlIFNORENUTF9EU1BfUFJPRklMRToKIAkJcmV0dXJuIDA7CS8qIHNpbGVudGx5IGlnbm9yZSAqLwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGQoInBjbV9vc3M6IHVua25vd24gY29tbWFuZCA9IDB4JXhcbiIsIGNtZCk7CisJCXByX2RlYnVnKCJwY21fb3NzOiB1bmtub3duIGNvbW1hbmQgPSAweCV4XG4iLCBjbWQpOwogCX0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KQEAgLTI2NzMsOCArMjY2OSw5IEBACiAjZWxzZQogCXsKIAkJc3NpemVfdCByZXMgPSBzbmRfcGNtX29zc19yZWFkMShzdWJzdHJlYW0sIGJ1ZiwgY291bnQpOwotCQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogcmVhZCAlbGkgYnl0ZXMgIgotCQkgICAgICAgIihyZXR1cm5lZCAlbGkgYnl0ZXMpXG4iLCAobG9uZyljb3VudCwgKGxvbmcpcmVzKTsKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCSJwY21fb3NzOiByZWFkICVsaSBieXRlcyAocmV0dXJuZWQgJWxpIGJ5dGVzKVxuIiwKKwkJCShsb25nKWNvdW50LCAobG9uZylyZXMpOwogCQlyZXR1cm4gcmVzOwogCX0KICNlbmRpZgpAQCAtMjY5Myw3ICsyNjkwLDcgQEAKIAlzdWJzdHJlYW0tPmZfZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKIAlyZXN1bHQgPSBzbmRfcGNtX29zc193cml0ZTEoc3Vic3RyZWFtLCBidWYsIGNvdW50KTsKICNpZmRlZiBPU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAicGNtX29zczogd3JpdGUgJWxpIGJ5dGVzICh3cm90ZSAlbGkgYnl0ZXMpXG4iLAorCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sICJwY21fb3NzOiB3cml0ZSAlbGkgYnl0ZXMgKHdyb3RlICVsaSBieXRlcylcbiIsCiAJICAgICAgIChsb25nKWNvdW50LCAobG9uZylyZXN1bHQpOwogI2VuZGlmCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTI3NzIsNyArMjc2OSw3IEBACiAJaW50IGVycjsKIAogI2lmZGVmIE9TU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJwY21fb3NzOiBtbWFwIGJlZ2luXG4iKTsKKwlwcl9kZWJ1ZygicGNtX29zczogbW1hcCBiZWdpblxuIik7CiAjZW5kaWYKIAlwY21fb3NzX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3dpdGNoICgoYXJlYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX1dSSVRFKSkpIHsKQEAgLTI4MjIsNyArMjgxOSw3IEBACiAJcnVudGltZS0+c2lsZW5jZV90aHJlc2hvbGQgPSAwOwogCXJ1bnRpbWUtPnNpbGVuY2Vfc2l6ZSA9IDA7CiAjaWZkZWYgT1NTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgInBjbV9vc3M6IG1tYXAgb2ssIGJ5dGVzID0gMHgleFxuIiwKKwlwcl9kZWJ1ZygicGNtX29zczogbW1hcCBvaywgYnl0ZXMgPSAweCV4XG4iLAogCSAgICAgICBydW50aW1lLT5vc3MubW1hcF9ieXRlcyk7CiAjZW5kaWYKIAkvKiBJbiBtbWFwIG1vZGUgd2UgbmV2ZXIgc3RvcCAqLwpAQCAtMzAwNywxMiArMzAwNCwxMCBAQAogCiBzdGF0aWMgdm9pZCByZWdpc3Rlcl9vc3NfZHNwKHN0cnVjdCBzbmRfcGNtICpwY20sIGludCBpbmRleCkKIHsKLQljaGFyIG5hbWVbMTI4XTsKLQlzcHJpbnRmKG5hbWUsICJkc3AlaSVpIiwgcGNtLT5jYXJkLT5udW1iZXIsIHBjbS0+ZGV2aWNlKTsKIAlpZiAoc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoU05EUlZfT1NTX0RFVklDRV9UWVBFX1BDTSwKIAkJCQkgICAgcGNtLT5jYXJkLCBpbmRleCwgJnNuZF9wY21fb3NzX2ZfcmVnLAotCQkJCSAgICBwY20sIG5hbWUpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgT1NTIFBDTSBkZXZpY2UgJWk6JWlcbiIsCisJCQkJICAgIHBjbSkgPCAwKSB7CisJCXBjbV9lcnIocGNtLCAidW5hYmxlIHRvIHJlZ2lzdGVyIE9TUyBQQ00gZGV2aWNlICVpOiVpXG4iLAogCQkJICAgcGNtLT5jYXJkLT5udW1iZXIsIHBjbS0+ZGV2aWNlKTsKIAl9CiB9CkBAIC0zMDkzLDEyICszMDg4LDEyIEBACiAJLyogY2hlY2sgZGV2aWNlIG1hcCB0YWJsZSAqLwogCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9DQVJEUzsgaSsrKSB7CiAJCWlmIChkc3BfbWFwW2ldIDwgMCB8fCBkc3BfbWFwW2ldID49IFNORFJWX1BDTV9ERVZJQ0VTKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIGRzcF9tYXBbJWRdID0gJWRcbiIsCisJCQlwcl9lcnIoIkFMU0E6IHBjbV9vc3M6IGludmFsaWQgZHNwX21hcFslZF0gPSAlZFxuIiwKIAkJCQkgICBpLCBkc3BfbWFwW2ldKTsKIAkJCWRzcF9tYXBbaV0gPSAwOwogCQl9CiAJCWlmIChhZHNwX21hcFtpXSA8IDAgfHwgYWRzcF9tYXBbaV0gPj0gU05EUlZfUENNX0RFVklDRVMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgYWRzcF9tYXBbJWRdID0gJWRcbiIsCisJCQlwcl9lcnIoIkFMU0E6IHBjbV9vc3M6IGludmFsaWQgYWRzcF9tYXBbJWRdID0gJWRcbiIsCiAJCQkJICAgaSwgYWRzcF9tYXBbaV0pOwogCQkJYWRzcF9tYXBbaV0gPSAxOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbS5jIGIvc291bmQvY29yZS9wY20uYwppbmRleCBlMWU5ZTBjLi40MzkzMmU4IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtLmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogCXJldHVybiBzbmRfcGNtX3N0YXRlX25hbWVzWyhfX2ZvcmNlIGludClzdGF0ZV07CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgogCiBzdGF0aWMgY29uc3QgY2hhciAqc25kX3BjbV9vc3NfZm9ybWF0X25hbWUoaW50IGZvcm1hdCkKQEAgLTMzOCw3ICszMzgsOCBAQAogCiAJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEgaW5mbykgewotCQlwcmludGsoS0VSTl9ERUJVRyAic25kX3BjbV9wcm9jX2luZm9fcmVhZDogY2Fubm90IG1hbGxvY1xuIik7CisJCXBjbV9kYmcoc3Vic3RyZWFtLT5wY20sCisJCQkic25kX3BjbV9wcm9jX2luZm9fcmVhZDogY2Fubm90IG1hbGxvY1xuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM5OCw3ICszOTksNyBAQAogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInJhdGU6ICV1ICgldS8ldSlcbiIsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPnJhdGVfbnVtLCBydW50aW1lLT5yYXRlX2Rlbik7CQogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInBlcmlvZF9zaXplOiAlbHVcbiIsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsJCiAJc25kX2lwcmludGYoYnVmZmVyLCAiYnVmZmVyX3NpemU6ICVsdVxuIiwgcnVudGltZS0+YnVmZmVyX3NpemUpOwkKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCWlmIChzdWJzdHJlYW0tPm9zcy5vc3MpIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiT1NTIGZvcm1hdDogJXNcbiIsIHNuZF9wY21fb3NzX2Zvcm1hdF9uYW1lKHJ1bnRpbWUtPm9zcy5mb3JtYXQpKTsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiT1NTIGNoYW5uZWxzOiAldVxuIiwgcnVudGltZS0+b3NzLmNoYW5uZWxzKTsJCkBAIC02NTEsNyArNjUyLDcgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9zdHIgKnBzdHIgPSAmcGNtLT5zdHJlYW1zW3N0cmVhbV07CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sICpwcmV2OwogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfUENNX09TUykKIAltdXRleF9pbml0KCZwc3RyLT5vc3Muc2V0dXBfbXV0ZXgpOwogI2VuZGlmCiAJcHN0ci0+c3RyZWFtID0gc3RyZWFtOwpAQCAtNjYwLDcgKzY2MSw3IEBACiAJaWYgKHN1YnN0cmVhbV9jb3VudCA+IDAgJiYgIXBjbS0+aW50ZXJuYWwpIHsKIAkJZXJyID0gc25kX3BjbV9zdHJlYW1fcHJvY19pbml0KHBzdHIpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gc25kX3BjbV9zdHJlYW1fcHJvY19pbml0XG4iKTsKKwkJCXBjbV9lcnIocGNtLCAiRXJyb3IgaW4gc25kX3BjbV9zdHJlYW1fcHJvY19pbml0XG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC02NjgsNyArNjY5LDcgQEAKIAlmb3IgKGlkeCA9IDAsIHByZXYgPSBOVUxMOyBpZHggPCBzdWJzdHJlYW1fY291bnQ7IGlkeCsrKSB7CiAJCXN1YnN0cmVhbSA9IGt6YWxsb2Moc2l6ZW9mKCpzdWJzdHJlYW0pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgUENNIHN1YnN0cmVhbVxuIik7CisJCQlwY21fZXJyKHBjbSwgIkNhbm5vdCBhbGxvY2F0ZSBQQ00gc3Vic3RyZWFtXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXN1YnN0cmVhbS0+cGNtID0gcGNtOwpAQCAtNjg1LDcgKzY4Niw4IEBACiAJCWlmICghcGNtLT5pbnRlcm5hbCkgewogCQkJZXJyID0gc25kX3BjbV9zdWJzdHJlYW1fcHJvY19pbml0KHN1YnN0cmVhbSk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVycm9yIGluIHNuZF9wY21fc3RyZWFtX3Byb2NfaW5pdFxuIik7CisJCQkJcGNtX2VycihwY20sCisJCQkJCSJFcnJvciBpbiBzbmRfcGNtX3N0cmVhbV9wcm9jX2luaXRcbiIpOwogCQkJCWlmIChwcmV2ID09IE5VTEwpCiAJCQkJCXBzdHItPnN1YnN0cmVhbSA9IE5VTEw7CiAJCQkJZWxzZQpAQCAtNzI0LDcgKzcyNiw3IEBACiAJCSpycGNtID0gTlVMTDsKIAlwY20gPSBremFsbG9jKHNpemVvZigqcGNtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBjbSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbm5vdCBhbGxvY2F0ZSBQQ01cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNhbm5vdCBhbGxvY2F0ZSBQQ01cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcGNtLT5jYXJkID0gY2FyZDsKQEAgLTgwNyw3ICs4MDksNyBAQAogc3RhdGljIHZvaWQgc25kX3BjbV9mcmVlX3N0cmVhbShzdHJ1Y3Qgc25kX3BjbV9zdHIgKiBwc3RyKQogewogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCAqc3Vic3RyZWFtX25leHQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfUENNX09TUykKIAlzdHJ1Y3Qgc25kX3BjbV9vc3Nfc2V0dXAgKnNldHVwLCAqc2V0dXBuOwogI2VuZGlmCiAJc3Vic3RyZWFtID0gcHN0ci0+c3Vic3RyZWFtOwpAQCAtODE5LDcgKzgyMSw3IEBACiAJCXN1YnN0cmVhbSA9IHN1YnN0cmVhbV9uZXh0OwogCX0KIAlzbmRfcGNtX3N0cmVhbV9wcm9jX2RvbmUocHN0cik7Ci0jaWYgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfUENNX09TUykKIAlmb3IgKHNldHVwID0gcHN0ci0+b3NzLnNldHVwX2xpc3Q7IHNldHVwOyBzZXR1cCA9IHNldHVwbikgewogCQlzZXR1cG4gPSBzZXR1cC0+bmV4dDsKIAkJa2ZyZWUoc2V0dXAtPnRhc2tfbmFtZSk7CkBAIC0xMDE2LDggKzEwMTgsMjAgQEAKICAgICAgICAgcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIHN0cik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwY21fYXR0cnMgPQotCV9fQVRUUihwY21fY2xhc3MsIFNfSVJVR08sIHNob3dfcGNtX2NsYXNzLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwY21fY2xhc3MsIFNfSVJVR08sIHNob3dfcGNtX2NsYXNzLCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwY21fZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3BjbV9jbGFzcy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBjbV9kZXZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMJPSBwY21fZGV2X2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnBjbV9kZXZfYXR0cl9ncm91cHNbXSA9IHsKKwkmcGNtX2Rldl9hdHRyX2dyb3VwLAorCU5VTEwKK307CiAKIHN0YXRpYyBpbnQgc25kX3BjbV9kZXZfcmVnaXN0ZXIoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKIHsKQEAgLTEwNjcsOCArMTA4MSwxOCBAQAogCQkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9Ci0JCXNuZF9hZGRfZGV2aWNlX3N5c2ZzX2ZpbGUoZGV2dHlwZSwgcGNtLT5jYXJkLCBwY20tPmRldmljZSwKLQkJCQkJICAmcGNtX2F0dHJzKTsKKworCQlkZXYgPSBzbmRfZ2V0X2RldmljZShkZXZ0eXBlLCBwY20tPmNhcmQsIHBjbS0+ZGV2aWNlKTsKKwkJaWYgKGRldikgeworCQkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwcygmZGV2LT5rb2JqLAorCQkJCQkJICBwY21fZGV2X2F0dHJfZ3JvdXBzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWRldl93YXJuKGRldiwKKwkJCQkJICJwY20gJWQ6JWQ6IGNhbm5vdCBjcmVhdGUgc3lzZnMgZ3JvdXBzXG4iLAorCQkJCQkgcGNtLT5jYXJkLT5udW1iZXIsIHBjbS0+ZGV2aWNlKTsKKwkJCXB1dF9kZXZpY2UoZGV2KTsKKwkJfQorCiAJCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW2NpZHhdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCiAJCQlzbmRfcGNtX3RpbWVyX2luaXQoc3Vic3RyZWFtKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9saWIuYyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCmluZGV4IGEyMTA0NjcuLmNlODNkZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCkBAIC0xNzQsNyArMTc0LDcgQEAKIAlpZiAoeHJ1bl9kZWJ1ZyhzdWJzdHJlYW0sIFhSVU5fREVCVUdfQkFTSUMpKSB7CiAJCWNoYXIgbmFtZVsxNl07CiAJCXNuZF9wY21fZGVidWdfbmFtZShzdWJzdHJlYW0sIG5hbWUsIHNpemVvZihuYW1lKSk7Ci0JCXNuZF9wcmludGQoS0VSTl9ERUJVRyAiWFJVTjogJXNcbiIsIG5hbWUpOworCQlwY21fd2FybihzdWJzdHJlYW0tPnBjbSwgIlhSVU46ICVzXG4iLCBuYW1lKTsKIAkJZHVtcF9zdGFja19vbl94cnVuKHN1YnN0cmVhbSk7CiAJfQogfQpAQCAtMTg0LDkgKzE4NCw3IEBACiAJZG8gewkJCQkJCQkJXAogCQlpZiAoeHJ1bl9kZWJ1ZyhzdWJzdHJlYW0sIFhSVU5fREVCVUdfQkFTSUMpKSB7CQlcCiAJCQl4cnVuX2xvZ19zaG93KHN1YnN0cmVhbSk7CQkJXAotCQkJaWYgKHNuZF9wcmludGRfcmF0ZWxpbWl0KCkpIHsJCQlcCi0JCQkJc25kX3ByaW50ZCgiUENNOiAiIGZtdCwgIyNhcmdzKTsJXAotCQkJfQkJCQkJCVwKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgiQUxTQTogUENNOiAiIGZtdCwgIyNhcmdzKTsJXAogCQkJZHVtcF9zdGFja19vbl94cnVuKHN1YnN0cmVhbSk7CQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtMjUzLDcgKzI1MSw3IEBACiAJCWVudHJ5ID0gJmxvZy0+ZW50cmllc1tpZHhdOwogCQlpZiAoZW50cnktPnBlcmlvZF9zaXplID09IDApCiAJCQlicmVhazsKLQkJc25kX3ByaW50ZCgiaHdwdHIgbG9nOiAlczogJXNqPSVsdSwgcG9zPSVsZC8lbGQvJWxkLCAiCisJCXByX2luZm8oImh3cHRyIGxvZzogJXM6ICVzaj0lbHUsIHBvcz0lbGQvJWxkLyVsZCwgIgogCQkJICAgImh3cHRyPSVsZC8lbGRcbiIsCiAJCQkgICBuYW1lLCBlbnRyeS0+aW5faW50ZXJydXB0ID8gIltRXSAiIDogIiIsCiAJCQkgICBlbnRyeS0+amlmZmllcywKQEAgLTM0MiwxNCArMzQwLDE0IEBACiAJCXJldHVybiAtRVBJUEU7CiAJfQogCWlmIChwb3MgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKLQkJaWYgKHNuZF9wcmludGRfcmF0ZWxpbWl0KCkpIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgewogCQkJY2hhciBuYW1lWzE2XTsKIAkJCXNuZF9wY21fZGVidWdfbmFtZShzdWJzdHJlYW0sIG5hbWUsIHNpemVvZihuYW1lKSk7CiAJCQl4cnVuX2xvZ19zaG93KHN1YnN0cmVhbSk7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fRVJSICAiQlVHOiAlcywgcG9zID0gJWxkLCAiCi0JCQkJICAgImJ1ZmZlciBzaXplID0gJWxkLCBwZXJpb2Qgc2l6ZSA9ICVsZFxuIiwKLQkJCQkgICBuYW1lLCBwb3MsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLAotCQkJCSAgIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwkJCXBjbV9lcnIoc3Vic3RyZWFtLT5wY20sCisJCQkJIkJVRzogJXMsIHBvcyA9ICVsZCwgYnVmZmVyIHNpemUgPSAlbGQsIHBlcmlvZCBzaXplID0gJWxkXG4iLAorCQkJCW5hbWUsIHBvcywgcnVudGltZS0+YnVmZmVyX3NpemUsCisJCQkJcnVudGltZS0+cGVyaW9kX3NpemUpOwogCQl9CiAJCXBvcyA9IDA7CiAJfQpAQCAtMzk0LDggKzM5Miw4IEBACiAJCQlYUlVOX0RFQlVHX1BFUklPRFVQREFURSA6IFhSVU5fREVCVUdfSFdQVFJVUERBVEUpKSB7CiAJCWNoYXIgbmFtZVsxNl07CiAJCXNuZF9wY21fZGVidWdfbmFtZShzdWJzdHJlYW0sIG5hbWUsIHNpemVvZihuYW1lKSk7Ci0JCXNuZF9wcmludGQoIiVzX3VwZGF0ZTogJXM6IHBvcz0ldS8ldS8ldSwgIgotCQkJICAgImh3cHRyPSVsZC8lbGQvJWxkLyVsZFxuIiwKKwkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKKwkJCSIlc191cGRhdGU6ICVzOiBwb3M9JXUvJXUvJXUsIGh3cHRyPSVsZC8lbGQvJWxkLyVsZFxuIiwKIAkJCSAgIGluX2ludGVycnVwdCA/ICJwZXJpb2QiIDogImh3cHRyIiwKIAkJCSAgIG5hbWUsCiAJCQkgICAodW5zaWduZWQgaW50KXBvcywKQEAgLTEyNDIsNiArMTI0MCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWFzazY0KTsKIAogLyoqCiAgKiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlciAtIGFwcGx5IGFuIGludGVnZXIgY29uc3RyYWludCB0byBhbiBpbnRlcnZhbApAQCAtMTk0MSw4ICsxOTQwLDkgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmICghdG91dCkgewotCQkJc25kX3ByaW50ZCgiJXMgd3JpdGUgZXJyb3IgKERNQSBvciBJUlEgdHJvdWJsZT8pXG4iLAotCQkJCSAgIGlzX3BsYXliYWNrID8gInBsYXliYWNrIiA6ICJjYXB0dXJlIik7CisJCQlwY21fZGJnKHN1YnN0cmVhbS0+cGNtLAorCQkJCSIlcyB3cml0ZSBlcnJvciAoRE1BIG9yIElSUSB0cm91YmxlPylcbiIsCisJCQkJaXNfcGxheWJhY2sgPyAicGxheWJhY2siIDogImNhcHR1cmUiKTsKIAkJCWVyciA9IC1FSU87CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCAwMWE1ZTA1Li5iNjUzYWIwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtMTkwLDEyICsxOTAsMTIgQEAKIAkJaWYgKCEocGFyYW1zLT5ybWFzayAmICgxIDw8IGspKSkKIAkJCWNvbnRpbnVlOwogI2lmZGVmIFJVTEVTX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyA9ICIsIHNuZF9wY21faHdfcGFyYW1fbmFtZXNba10pOwotCQlwcmludGsoIiUwNHglMDR4JTA0eCUwNHggLT4gIiwgbS0+Yml0c1szXSwgbS0+Yml0c1syXSwgbS0+Yml0c1sxXSwgbS0+Yml0c1swXSk7CisJCXByX2RlYnVnKCIlcyA9ICIsIHNuZF9wY21faHdfcGFyYW1fbmFtZXNba10pOworCQlwcl9jb250KCIlMDR4JTA0eCUwNHglMDR4IC0+ICIsIG0tPmJpdHNbM10sIG0tPmJpdHNbMl0sIG0tPmJpdHNbMV0sIG0tPmJpdHNbMF0pOwogI2VuZGlmCiAJCWNoYW5nZWQgPSBzbmRfbWFza19yZWZpbmUobSwgY29uc3Ryc19tYXNrKGNvbnN0cnMsIGspKTsKICNpZmRlZiBSVUxFU19ERUJVRwotCQlwcmludGsoIiUwNHglMDR4JTA0eCUwNHhcbiIsIG0tPmJpdHNbM10sIG0tPmJpdHNbMl0sIG0tPmJpdHNbMV0sIG0tPmJpdHNbMF0pOworCQlwcl9jb250KCIlMDR4JTA0eCUwNHglMDR4XG4iLCBtLT5iaXRzWzNdLCBtLT5iaXRzWzJdLCBtLT5iaXRzWzFdLCBtLT5iaXRzWzBdKTsKICNlbmRpZgogCQlpZiAoY2hhbmdlZCkKIAkJCXBhcmFtcy0+Y21hc2sgfD0gMSA8PCBrOwpAQCAtMjEwLDIxICsyMTAsMjEgQEAKIAkJaWYgKCEocGFyYW1zLT5ybWFzayAmICgxIDw8IGspKSkKIAkJCWNvbnRpbnVlOwogI2lmZGVmIFJVTEVTX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyA9ICIsIHNuZF9wY21faHdfcGFyYW1fbmFtZXNba10pOworCQlwcl9kZWJ1ZygiJXMgPSAiLCBzbmRfcGNtX2h3X3BhcmFtX25hbWVzW2tdKTsKIAkJaWYgKGktPmVtcHR5KQotCQkJcHJpbnRrKCJlbXB0eSIpOworCQkJcHJfY29udCgiZW1wdHkiKTsKIAkJZWxzZQotCQkJcHJpbnRrKCIlYyV1ICV1JWMiLCAKKwkJCXByX2NvbnQoIiVjJXUgJXUlYyIsCiAJCQkgICAgICAgaS0+b3Blbm1pbiA/ICcoJyA6ICdbJywgaS0+bWluLAogCQkJICAgICAgIGktPm1heCwgaS0+b3Blbm1heCA/ICcpJyA6ICddJyk7Ci0JCXByaW50aygiIC0+ICIpOworCQlwcl9jb250KCIgLT4gIik7CiAjZW5kaWYKIAkJY2hhbmdlZCA9IHNuZF9pbnRlcnZhbF9yZWZpbmUoaSwgY29uc3Ryc19pbnRlcnZhbChjb25zdHJzLCBrKSk7CiAjaWZkZWYgUlVMRVNfREVCVUcKIAkJaWYgKGktPmVtcHR5KQotCQkJcHJpbnRrKCJlbXB0eVxuIik7CisJCQlwcl9jb250KCJlbXB0eVxuIik7CiAJCWVsc2UgCi0JCQlwcmludGsoIiVjJXUgJXUlY1xuIiwgCisJCQlwcl9jb250KCIlYyV1ICV1JWNcbiIsCiAJCQkgICAgICAgaS0+b3Blbm1pbiA/ICcoJyA6ICdbJywgaS0+bWluLAogCQkJICAgICAgIGktPm1heCwgaS0+b3Blbm1heCA/ICcpJyA6ICddJyk7CiAjZW5kaWYKQEAgLTI1NSwxOCArMjU1LDE4IEBACiAJCQlpZiAoIWRvaXQpCiAJCQkJY29udGludWU7CiAjaWZkZWYgUlVMRVNfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICJSdWxlICVkIFslcF06ICIsIGssIHItPmZ1bmMpOworCQkJcHJfZGVidWcoIlJ1bGUgJWQgWyVwXTogIiwgaywgci0+ZnVuYyk7CiAJCQlpZiAoci0+dmFyID49IDApIHsKLQkJCQlwcmludGsoIiVzID0gIiwgc25kX3BjbV9od19wYXJhbV9uYW1lc1tyLT52YXJdKTsKKwkJCQlwcl9jb250KCIlcyA9ICIsIHNuZF9wY21faHdfcGFyYW1fbmFtZXNbci0+dmFyXSk7CiAJCQkJaWYgKGh3X2lzX21hc2soci0+dmFyKSkgewogCQkJCQltID0gaHdfcGFyYW1fbWFzayhwYXJhbXMsIHItPnZhcik7Ci0JCQkJCXByaW50aygiJXgiLCAqbS0+Yml0cyk7CisJCQkJCXByX2NvbnQoIiV4IiwgKm0tPmJpdHMpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWkgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIHItPnZhcik7CiAJCQkJCWlmIChpLT5lbXB0eSkKLQkJCQkJCXByaW50aygiZW1wdHkiKTsKKwkJCQkJCXByX2NvbnQoImVtcHR5Iik7CiAJCQkJCWVsc2UKLQkJCQkJCXByaW50aygiJWMldSAldSVjIiwgCisJCQkJCQlwcl9jb250KCIlYyV1ICV1JWMiLAogCQkJCQkJICAgICAgIGktPm9wZW5taW4gPyAnKCcgOiAnWycsIGktPm1pbiwKIAkJCQkJCSAgICAgICBpLT5tYXgsIGktPm9wZW5tYXggPyAnKScgOiAnXScpOwogCQkJCX0KQEAgLTI3NSwxOSArMjc1LDE5IEBACiAJCQljaGFuZ2VkID0gci0+ZnVuYyhwYXJhbXMsIHIpOwogI2lmZGVmIFJVTEVTX0RFQlVHCiAJCQlpZiAoci0+dmFyID49IDApIHsKLQkJCQlwcmludGsoIiAtPiAiKTsKKwkJCQlwcl9jb250KCIgLT4gIik7CiAJCQkJaWYgKGh3X2lzX21hc2soci0+dmFyKSkKLQkJCQkJcHJpbnRrKCIleCIsICptLT5iaXRzKTsKKwkJCQkJcHJfY29udCgiJXgiLCAqbS0+Yml0cyk7CiAJCQkJZWxzZSB7CiAJCQkJCWlmIChpLT5lbXB0eSkKLQkJCQkJCXByaW50aygiZW1wdHkiKTsKKwkJCQkJCXByX2NvbnQoImVtcHR5Iik7CiAJCQkJCWVsc2UKLQkJCQkJCXByaW50aygiJWMldSAldSVjIiwgCisJCQkJCQlwcl9jb250KCIlYyV1ICV1JWMiLAogCQkJCQkJICAgICAgIGktPm9wZW5taW4gPyAnKCcgOiAnWycsIGktPm1pbiwKIAkJCQkJCSAgICAgICBpLT5tYXgsIGktPm9wZW5tYXggPyAnKScgOiAnXScpOwogCQkJCX0KIAkJCX0KLQkJCXByaW50aygiXG4iKTsKKwkJCXByX2NvbnQoIlxuIik7CiAjZW5kaWYKIAkJCXJzdGFtcHNba10gPSBzdGFtcDsKIAkJCWlmIChjaGFuZ2VkICYmIHItPnZhciA+PSAwKSB7CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJcmV0dXJuIC1FQkFERkQ7CiAJfQogCXNuZF9wY21fc3RyZWFtX3VubG9ja19pcnEoc3Vic3RyZWFtKTsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9QQ01fT1NTKQogCWlmICghc3Vic3RyZWFtLT5vc3Mub3NzKQogI2VuZGlmCiAJCWlmIChhdG9taWNfcmVhZCgmc3Vic3RyZWFtLT5tbWFwX2NvdW50KSkKQEAgLTk1NCw3ICs5NTQsNyBAQAogICoKICAqIFRoZSBzdGF0ZSBvZiBlYWNoIHN0cmVhbSBpcyB0aGVuIGNoYW5nZWQgdG8gdGhlIGdpdmVuIHN0YXRlIHVuY29uZGl0aW9uYWxseS4KICAqCi0gKiBSZXR1cm46IFplcm8gaWYgc3VjY2VzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKiBSZXR1cm46IFplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCiBpbnQgc25kX3BjbV9zdG9wKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzbmRfcGNtX3N0YXRlX3Qgc3RhdGUpCiB7CkBAIC0xNTQxLDcgKzE1NDEsOCBAQAogCQkJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEKQogCQkJCXJlc3VsdCA9IC1FU1RSUElQRTsKIAkJCWVsc2UgewotCQkJCXNuZF9wcmludGQoInBsYXliYWNrIGRyYWluIGVycm9yIChETUEgb3IgSVJRIHRyb3VibGU/KVxuIik7CisJCQkJZGV2X2RiZyhzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LAorCQkJCQkicGxheWJhY2sgZHJhaW4gZXJyb3IgKERNQSBvciBJUlEgdHJvdWJsZT8pXG4iKTsKIAkJCQlzbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfU0VUVVApOwogCQkJCXJlc3VsdCA9IC1FSU87CiAJCQl9CkBAIC0yMDY2LDcgKzIwNjcsNyBAQAogCiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50c19pbml0KHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ZCgic25kX3BjbV9od19jb25zdHJhaW50c19pbml0IGZhaWxlZFxuIik7CisJCXBjbV9kYmcocGNtLCAic25kX3BjbV9od19jb25zdHJhaW50c19pbml0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0yMDc3LDcgKzIwNzgsNyBAQAogCiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50c19jb21wbGV0ZShzdWJzdHJlYW0pOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGQoInNuZF9wY21faHdfY29uc3RyYWludHNfY29tcGxldGUgZmFpbGVkXG4iKTsKKwkJcGNtX2RiZyhwY20sICJzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX2NvbXBsZXRlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0yNjA5LDcgKzI2MTAsNyBAQAogCQlyZXR1cm4gcmVzOwogCX0KIAl9Ci0Jc25kX3ByaW50ZCgidW5rbm93biBpb2N0bCA9IDB4JXhcbiIsIGNtZCk7CisJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgInVua25vd24gaW9jdGwgPSAweCV4XG4iLCBjbWQpOwogCXJldHVybiAtRU5PVFRZOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV90aW1lci5jIGIvc291bmQvY29yZS9wY21fdGltZXIuYwppbmRleCBiMDFkOTQ4Li4yMGVjZDhmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV90aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMKQEAgLTUzLDcgKzUzLDkgQEAKIAkJcG9zdCAqPSAyOwogCX0KIAlpZiAocmF0ZSA9PSAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBjbSB0aW1lciByZXNvbHV0aW9uIG91dCBvZiByYW5nZSAocmF0ZSA9ICV1LCBwZXJpb2Rfc2l6ZSA9ICVsdSlcbiIsIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwkJcGNtX2VycihzdWJzdHJlYW0tPnBjbSwKKwkJCSJwY20gdGltZXIgcmVzb2x1dGlvbiBvdXQgb2YgcmFuZ2UgKHJhdGUgPSAldSwgcGVyaW9kX3NpemUgPSAlbHUpXG4iLAorCQkJcnVudGltZS0+cmF0ZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOwogCQlydW50aW1lLT50aW1lcl9yZXNvbHV0aW9uID0gLTE7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3Jhd21pZGkuYyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCmluZGV4IDdiNTk2YjUuLjZmYzcxYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCkBAIC01Niw2ICs1NiwxMyBAQAogc3RhdGljIExJU1RfSEVBRChzbmRfcmF3bWlkaV9kZXZpY2VzKTsKIHN0YXRpYyBERUZJTkVfTVVURVgocmVnaXN0ZXJfbXV0ZXgpOwogCisjZGVmaW5lIHJtaWRpX2VycihybWlkaSwgZm10LCBhcmdzLi4uKSBcCisJZGV2X2Vycigocm1pZGkpLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBybWlkaV93YXJuKHJtaWRpLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfd2Fybigocm1pZGkpLT5jYXJkLT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBybWlkaV9kYmcocm1pZGksIGZtdCwgYXJncy4uLikgXAorCWRldl9kYmcoKHJtaWRpKS0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKwogc3RhdGljIHN0cnVjdCBzbmRfcmF3bWlkaSAqc25kX3Jhd21pZGlfc2VhcmNoKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldmljZSkKIHsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJhd21pZGk7CkBAIC0xNjUsNiArMTcyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KTsKIAogaW50IHNuZF9yYXdtaWRpX2RyYWluX291dHB1dChzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CkBAIC0xODAsNyArMTg4LDkgQEAKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCWVyciA9IC1FUkVTVEFSVFNZUzsKIAlpZiAocnVudGltZS0+YXZhaWwgPCBydW50aW1lLT5idWZmZXJfc2l6ZSAmJiAhdGltZW91dCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAicmF3bWlkaSBkcmFpbiBlcnJvciAoYXZhaWwgPSAlbGksIGJ1ZmZlcl9zaXplID0gJWxpKVxuIiwgKGxvbmcpcnVudGltZS0+YXZhaWwsIChsb25nKXJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKKwkJcm1pZGlfd2FybihzdWJzdHJlYW0tPnJtaWRpLAorCQkJICAgInJhd21pZGkgZHJhaW4gZXJyb3IgKGF2YWlsID0gJWxpLCBidWZmZXJfc2l6ZSA9ICVsaSlcbiIsCisJCQkgICAobG9uZylydW50aW1lLT5hdmFpbCwgKGxvbmcpcnVudGltZS0+YnVmZmVyX3NpemUpOwogCQllcnIgPSAtRUlPOwogCX0KIAlydW50aW1lLT5kcmFpbiA9IDA7CkBAIC0xOTQsNiArMjA0LDcgQEAKIAl9CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJhaW5fb3V0cHV0KTsKIAogaW50IHNuZF9yYXdtaWRpX2RyYWluX2lucHV0KHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKQEAgLTIwOCw2ICsyMTksNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfZHJhaW5faW5wdXQpOwogCiAvKiBsb29rIGZvciBhbiBhdmFpbGFibGUgc3Vic3RyZWFtIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIGRpcmVjdGlvbjsKICAqIGlmIGEgc3BlY2lmaWMgc3ViZGV2aWNlIGlzIGdpdmVuLCB0cnkgdG8gYXNzaWduIGl0CkBAIC0zNDUsNiArMzU3LDcgQEAKIAkJbW9kdWxlX3B1dChybWlkaS0+Y2FyZC0+bW9kdWxlKTsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfb3Blbik7CiAKIHN0YXRpYyBpbnQgc25kX3Jhd21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKQEAgLTUyMyw2ICs1MzYsNyBAQAogCW1vZHVsZV9wdXQocm1pZGktPmNhcmQtPm1vZHVsZSk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF9yZWxlYXNlKTsKIAogc3RhdGljIGludCBzbmRfcmF3bWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpAQCAtNTk5LDYgKzYxMyw3IEBACiAJfQogCXJldHVybiAtRU5YSU87CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2luZm9fc2VsZWN0KTsKIAogc3RhdGljIGludCBzbmRfcmF3bWlkaV9pbmZvX3NlbGVjdF91c2VyKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJCQkJc3RydWN0IHNuZF9yYXdtaWRpX2luZm8gX191c2VyICpfaW5mbykKQEAgLTY0Niw2ICs2NjEsNyBAQAogCXN1YnN0cmVhbS0+YWN0aXZlX3NlbnNpbmcgPSAhcGFyYW1zLT5ub19hY3RpdmVfc2Vuc2luZzsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfb3V0cHV0X3BhcmFtcyk7CiAKIGludCBzbmRfcmF3bWlkaV9pbnB1dF9wYXJhbXMoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICBzdHJ1Y3Qgc25kX3Jhd21pZGlfcGFyYW1zICogcGFyYW1zKQpAQCAtNjcxLDYgKzY4Nyw3IEBACiAJcnVudGltZS0+YXZhaWxfbWluID0gcGFyYW1zLT5hdmFpbF9taW47CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2lucHV0X3BhcmFtcyk7CiAKIHN0YXRpYyBpbnQgc25kX3Jhd21pZGlfb3V0cHV0X3N0YXR1cyhzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICAgICBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3RhdHVzICogc3RhdHVzKQpAQCAtODAyLDEwICs4MTksOSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9Ci0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJyYXdtaWRpOiB1bmtub3duIGNvbW1hbmQgPSAweCV4XG4iLCBjbWQpOwotI2VuZGlmCisJCXJtaWRpX2RiZyhyZmlsZS0+cm1pZGksCisJCQkgICJyYXdtaWRpOiB1bmtub3duIGNvbW1hbmQgPSAweCV4XG4iLCBjbWQpOwogCX0KIAlyZXR1cm4gLUVOT1RUWTsKIH0KQEAgLTg3NSw3ICs4OTEsOCBAQAogCWlmICghc3Vic3RyZWFtLT5vcGVuZWQpCiAJCXJldHVybiAtRUJBREZEOwogCWlmIChydW50aW1lLT5idWZmZXIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJzbmRfcmF3bWlkaV9yZWNlaXZlOiBpbnB1dCBpcyBub3QgYWN0aXZlISEhXG4iKTsKKwkJcm1pZGlfZGJnKHN1YnN0cmVhbS0+cm1pZGksCisJCQkgICJzbmRfcmF3bWlkaV9yZWNlaXZlOiBpbnB1dCBpcyBub3QgYWN0aXZlISEhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CkBAIC05MjYsNiArOTQzLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfcmVjZWl2ZSk7CiAKIHN0YXRpYyBsb25nIHNuZF9yYXdtaWRpX2tlcm5lbF9yZWFkMShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKQEAgLTk2OCw2ICs5ODYsNyBAQAogCXNuZF9yYXdtaWRpX2lucHV0X3RyaWdnZXIoc3Vic3RyZWFtLCAxKTsKIAlyZXR1cm4gc25kX3Jhd21pZGlfa2VybmVsX3JlYWQxKHN1YnN0cmVhbSwgTlVMTC8qdXNlcmJ1ZiovLCBidWYsIGNvdW50KTsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfa2VybmVsX3JlYWQpOwogCiBzdGF0aWMgc3NpemVfdCBzbmRfcmF3bWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiAJCQkJbG9mZl90ICpvZmZzZXQpCkBAIC0xMDM0LDcgKzEwNTMsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAocnVudGltZS0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgic25kX3Jhd21pZGlfdHJhbnNtaXRfZW1wdHk6IG91dHB1dCBpcyBub3QgYWN0aXZlISEhXG4iKTsKKwkJcm1pZGlfZGJnKHN1YnN0cmVhbS0+cm1pZGksCisJCQkgICJzbmRfcmF3bWlkaV90cmFuc21pdF9lbXB0eTogb3V0cHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOwogCQlyZXR1cm4gMTsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKQEAgLTEwNDIsNiArMTA2Miw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXN1bHQ7CQkKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXRfZW1wdHkpOwogCiAvKioKICAqIHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWsgLSBjb3B5IGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyCkBAIC0xMDY1LDcgKzEwODYsOCBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCiAJaWYgKHJ1bnRpbWUtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoInNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWs6IG91dHB1dCBpcyBub3QgYWN0aXZlISEhXG4iKTsKKwkJcm1pZGlfZGJnKHN1YnN0cmVhbS0+cm1pZGksCisJCQkgICJzbmRfcmF3bWlkaV90cmFuc21pdF9wZWVrOiBvdXRwdXQgaXMgbm90IGFjdGl2ZSEhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXN1bHQgPSAwOwpAQCAtMTA5NywxMSArMTExOSwxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdF9wZWVrKTsKIAogLyoqCiAgKiBzbmRfcmF3bWlkaV90cmFuc21pdF9hY2sgLSBhY2tub3dsZWRnZSB0aGUgdHJhbnNtaXNzaW9uCiAgKiBAc3Vic3RyZWFtOiB0aGUgcmF3bWlkaSBzdWJzdHJlYW0KLSAqIEBjb3VudDogdGhlIHRyYW5mZXJyZWQgY291bnQKKyAqIEBjb3VudDogdGhlIHRyYW5zZmVycmVkIGNvdW50CiAgKgogICogQWR2YW5jZXMgdGhlIGhhcmR3YXJlIHBvaW50ZXIgZm9yIHRoZSBpbnRlcm5hbCBvdXRwdXQgYnVmZmVyIHdpdGgKICAqIHRoZSBnaXZlbiBzaXplIGFuZCB1cGRhdGVzIHRoZSBjb25kaXRpb24uCkBAIC0xMTE1LDcgKzExMzgsOCBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCiAJaWYgKHJ1bnRpbWUtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoInNuZF9yYXdtaWRpX3RyYW5zbWl0X2Fjazogb3V0cHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOworCQlybWlkaV9kYmcoc3Vic3RyZWFtLT5ybWlkaSwKKwkJCSAgInNuZF9yYXdtaWRpX3RyYW5zbWl0X2Fjazogb3V0cHV0IGlzIG5vdCBhY3RpdmUhISFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ1bnRpbWUtPmxvY2ssIGZsYWdzKTsKQEAgLTExMzEsNiArMTE1NSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnVudGltZS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBjb3VudDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrKTsKIAogLyoqCiAgKiBzbmRfcmF3bWlkaV90cmFuc21pdCAtIGNvcHkgZnJvbSB0aGUgYnVmZmVyIHRvIHRoZSBkZXZpY2UKQEAgLTExNTIsNiArMTE3Nyw3IEBACiAJCXJldHVybiBjb3VudDsKIAlyZXR1cm4gc25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrKHN1YnN0cmVhbSwgY291bnQpOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV90cmFuc21pdCk7CiAKIHN0YXRpYyBsb25nIHNuZF9yYXdtaWRpX2tlcm5lbF93cml0ZTEoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICp1c2VyYnVmLApAQCAtMTIxMyw2ICsxMjM5LDcgQEAKIHsKIAlyZXR1cm4gc25kX3Jhd21pZGlfa2VybmVsX3dyaXRlMShzdWJzdHJlYW0sIE5VTEwsIGJ1ZiwgY291bnQpOwogfQorRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfd3JpdGUpOwogCiBzdGF0aWMgc3NpemVfdCBzbmRfcmF3bWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKQEAgLTE0MTMsNyArMTQ0MCw3IEBACiAJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspIHsKIAkJc3Vic3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN1YnN0cmVhbSksIEdGUF9LRVJORUwpOwogCQlpZiAoc3Vic3RyZWFtID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInJhd21pZGk6IGNhbm5vdCBhbGxvY2F0ZSBzdWJzdHJlYW1cbiIpOworCQkJcm1pZGlfZXJyKHJtaWRpLCAicmF3bWlkaTogY2Fubm90IGFsbG9jYXRlIHN1YnN0cmVhbVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzdWJzdHJlYW0tPnN0cmVhbSA9IGRpcmVjdGlvbjsKQEAgLTE0NTgsNyArMTQ4NSw3IEBACiAJCSpycmF3bWlkaSA9IE5VTEw7CiAJcm1pZGkgPSBremFsbG9jKHNpemVvZigqcm1pZGkpLCBHRlBfS0VSTkVMKTsKIAlpZiAocm1pZGkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJyYXdtaWRpOiBjYW5ub3QgYWxsb2NhdGVcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInJhd21pZGk6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlybWlkaS0+Y2FyZCA9IGNhcmQ7CkBAIC0xNDkyLDYgKzE1MTksNyBAQAogCQkqcnJhd21pZGkgPSBybWlkaTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfbmV3KTsKIAogc3RhdGljIHZvaWQgc25kX3Jhd21pZGlfZnJlZV9zdWJzdHJlYW1zKHN0cnVjdCBzbmRfcmF3bWlkaV9zdHIgKnN0cmVhbSkKIHsKQEAgLTE1NTcsNyArMTU4NSw4IEBACiAJaWYgKChlcnIgPSBzbmRfcmVnaXN0ZXJfZGV2aWNlKFNORFJWX0RFVklDRV9UWVBFX1JBV01JREksCiAJCQkJICAgICAgIHJtaWRpLT5jYXJkLCBybWlkaS0+ZGV2aWNlLAogCQkJCSAgICAgICAmc25kX3Jhd21pZGlfZl9vcHMsIHJtaWRpLCBuYW1lKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciByYXdtaWRpIGRldmljZSAlaTolaVxuIiwgcm1pZGktPmNhcmQtPm51bWJlciwgcm1pZGktPmRldmljZSk7CisJCXJtaWRpX2VycihybWlkaSwgInVuYWJsZSB0byByZWdpc3RlciByYXdtaWRpIGRldmljZSAlaTolaVxuIiwKKwkJCSAgcm1pZGktPmNhcmQtPm51bWJlciwgcm1pZGktPmRldmljZSk7CiAJCWxpc3RfZGVsKCZybWlkaS0+bGlzdCk7CiAJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTU3NCw4ICsxNjAzLDEwIEBACiAJaWYgKChpbnQpcm1pZGktPmRldmljZSA9PSBtaWRpX21hcFtybWlkaS0+Y2FyZC0+bnVtYmVyXSkgewogCQlpZiAoc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoU05EUlZfT1NTX0RFVklDRV9UWVBFX01JREksCiAJCQkJCSAgICBybWlkaS0+Y2FyZCwgMCwgJnNuZF9yYXdtaWRpX2Zfb3BzLAotCQkJCQkgICAgcm1pZGksIG5hbWUpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIE9TUyByYXdtaWRpIGRldmljZSAlaTolaVxuIiwgcm1pZGktPmNhcmQtPm51bWJlciwgMCk7CisJCQkJCSAgICBybWlkaSkgPCAwKSB7CisJCQlybWlkaV9lcnIocm1pZGksCisJCQkJICAidW5hYmxlIHRvIHJlZ2lzdGVyIE9TUyByYXdtaWRpIGRldmljZSAlaTolaVxuIiwKKwkJCQkgIHJtaWRpLT5jYXJkLT5udW1iZXIsIDApOwogCQl9IGVsc2UgewogCQkJcm1pZGktPm9zc3JlZysrOwogI2lmZGVmIFNORFJWX09TU19JTkZPX0RFVl9NSURJCkBAIC0xNTg2LDggKzE2MTcsMTAgQEAKIAlpZiAoKGludClybWlkaS0+ZGV2aWNlID09IGFtaWRpX21hcFtybWlkaS0+Y2FyZC0+bnVtYmVyXSkgewogCQlpZiAoc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoU05EUlZfT1NTX0RFVklDRV9UWVBFX01JREksCiAJCQkJCSAgICBybWlkaS0+Y2FyZCwgMSwgJnNuZF9yYXdtaWRpX2Zfb3BzLAotCQkJCQkgICAgcm1pZGksIG5hbWUpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIE9TUyByYXdtaWRpIGRldmljZSAlaTolaVxuIiwgcm1pZGktPmNhcmQtPm51bWJlciwgMSk7CisJCQkJCSAgICBybWlkaSkgPCAwKSB7CisJCQlybWlkaV9lcnIocm1pZGksCisJCQkJICAidW5hYmxlIHRvIHJlZ2lzdGVyIE9TUyByYXdtaWRpIGRldmljZSAlaTolaVxuIiwKKwkJCQkgIHJtaWRpLT5jYXJkLT5udW1iZXIsIDEpOwogCQl9IGVsc2UgewogCQkJcm1pZGktPm9zc3JlZysrOwogCQl9CkBAIC0xNjcwLDYgKzE3MDMsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic3RyZWFtLCAmcm1pZGktPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW1zLCBsaXN0KQogCQlzdWJzdHJlYW0tPm9wcyA9IG9wczsKIH0KK0VYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfc2V0X29wcyk7CiAKIC8qCiAgKiAgRU5UUlkgZnVuY3Rpb25zCkBAIC0xNjg1LDExICsxNzE5LDEzIEBACiAJLyogY2hlY2sgZGV2aWNlIG1hcCB0YWJsZSAqLwogCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9DQVJEUzsgaSsrKSB7CiAJCWlmIChtaWRpX21hcFtpXSA8IDAgfHwgbWlkaV9tYXBbaV0gPj0gU05EUlZfUkFXTUlESV9ERVZJQ0VTKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIG1pZGlfbWFwWyVkXSA9ICVkXG4iLCBpLCBtaWRpX21hcFtpXSk7CisJCQlwcl9lcnIoIkFMU0E6IHJhd21pZGk6IGludmFsaWQgbWlkaV9tYXBbJWRdID0gJWRcbiIsCisJCQkgICAgICAgaSwgbWlkaV9tYXBbaV0pOwogCQkJbWlkaV9tYXBbaV0gPSAwOwogCQl9CiAJCWlmIChhbWlkaV9tYXBbaV0gPCAwIHx8IGFtaWRpX21hcFtpXSA+PSBTTkRSVl9SQVdNSURJX0RFVklDRVMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgYW1pZGlfbWFwWyVkXSA9ICVkXG4iLCBpLCBhbWlkaV9tYXBbaV0pOworCQkJcHJfZXJyKCJBTFNBOiByYXdtaWRpOiBpbnZhbGlkIGFtaWRpX21hcFslZF0gPSAlZFxuIiwKKwkJCSAgICAgICBpLCBhbWlkaV9tYXBbaV0pOwogCQkJYW1pZGlfbWFwW2ldID0gMTsKIAkJfQogCX0KQEAgLTE3MDYsMjEgKzE3NDIsMyBAQAogCiBtb2R1bGVfaW5pdChhbHNhX3Jhd21pZGlfaW5pdCkKIG1vZHVsZV9leGl0KGFsc2FfcmF3bWlkaV9leGl0KQotCi1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX291dHB1dF9wYXJhbXMpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9pbnB1dF9wYXJhbXMpOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9kcm9wX291dHB1dCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2RyYWluX291dHB1dCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2RyYWluX2lucHV0KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfcmVjZWl2ZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX3RyYW5zbWl0X2VtcHR5KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX3RyYW5zbWl0X2Fjayk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX3RyYW5zbWl0KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfbmV3KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfc2V0X29wcyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2luZm9fc2VsZWN0KTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfa2VybmVsX29wZW4pOwotRVhQT1JUX1NZTUJPTChzbmRfcmF3bWlkaV9rZXJuZWxfcmVsZWFzZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9yYXdtaWRpX2tlcm5lbF9yZWFkKTsKLUVYUE9SVF9TWU1CT0woc25kX3Jhd21pZGlfa2VybmVsX3dyaXRlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcnRjdGltZXIuYyBiL3NvdW5kL2NvcmUvcnRjdGltZXIuYwppbmRleCBlODVlNzJiLi5mMzQyMGQxIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9ydGN0aW1lci5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVEMpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfUlRDKQogCiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KIApAQCAtMTMyLDggKzEzMiw3IEBACiAKIAlpZiAocnRjdGltZXJfZnJlcSA8IDIgfHwgcnRjdGltZXJfZnJlcSA+IDgxOTIgfHwKIAkgICAgIWlzX3Bvd2VyX29mXzIocnRjdGltZXJfZnJlcSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicnRjdGltZXI6IGludmFsaWQgZnJlcXVlbmN5ICVkXG4iLAotCQkJICAgcnRjdGltZXJfZnJlcSk7CisJCXByX2VycigiQUxTQTogcnRjdGltZXI6IGludmFsaWQgZnJlcXVlbmN5ICVkXG4iLCBydGN0aW1lcl9mcmVxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xODUsNCArMTg0LDQgQEAKIAogTU9EVUxFX0FMSUFTKCJzbmQtdGltZXItIiBfX3N0cmluZ2lmeShTTkRSVl9USU1FUl9HTE9CQUxfUlRDKSk7CiAKLSNlbmRpZiAvKiBDT05GSUdfUlRDIHx8IENPTkZJR19SVENfTU9EVUxFICovCisjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfUlRDKSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKaW5kZXggOGQ0ZDVlOC4uMTZkNDI2NyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCkBAIC0zOSwxMiArMzksNiBAQAogTU9EVUxFX0FMSUFTX1NORFJWX01JTk9SKFNORFJWX01JTk9SX09TU19TRVFVRU5DRVIpOwogTU9EVUxFX0FMSUFTX1NORFJWX01JTk9SKFNORFJWX01JTk9SX09TU19NVVNJQyk7CiAKLSNpZmRlZiBTTkRSVl9TRVFfT1NTX0RFQlVHCi1tb2R1bGVfcGFyYW0oc2VxX29zc19kZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc2VxX29zc19kZWJ1ZywgImRlYnVnIG9wdGlvbiIpOwotaW50IHNlcV9vc3NfZGVidWcgPSAwOwotI2VuZGlmCi0KIAogLyoKICAqIHByb3RvdHlwZXMKQEAgLTIzMSwyMiArMjI1LDE5IEBACiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCWlmICgocmMgPSBzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfU0VRVUVOQ0VSLAogCQkJCQkgIE5VTEwsIDAsCi0JCQkJCSAgJnNlcV9vc3NfZl9vcHMsIE5VTEwsCi0JCQkJCSAgU05EUlZfU0VRX09TU19ERVZOQU1FKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IHJlZ2lzdGVyIGRldmljZSBzZXFcbiIpOworCQkJCQkgICZzZXFfb3NzX2Zfb3BzLCBOVUxMKSkgPCAwKSB7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlIHNlcVxuIik7CiAJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlyZXR1cm4gcmM7CiAJfQogCWlmICgocmMgPSBzbmRfcmVnaXN0ZXJfb3NzX2RldmljZShTTkRSVl9PU1NfREVWSUNFX1RZUEVfTVVTSUMsCiAJCQkJCSAgTlVMTCwgMCwKLQkJCQkJICAmc2VxX29zc19mX29wcywgTlVMTCwKLQkJCQkJICBTTkRSVl9TRVFfT1NTX0RFVk5BTUUpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlIG11c2ljXG4iKTsKKwkJCQkJICAmc2VxX29zc19mX29wcywgTlVMTCkpIDwgMCkgeworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IHJlZ2lzdGVyIGRldmljZSBtdXNpY1xuIik7CiAJCXNuZF91bnJlZ2lzdGVyX29zc19kZXZpY2UoU05EUlZfT1NTX0RFVklDRV9UWVBFX1NFUVVFTkNFUiwgTlVMTCwgMCk7CiAJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlyZXR1cm4gcmM7CiAJfQotCWRlYnVnX3ByaW50aygoImRldmljZSByZWdpc3RlcmVkXG4iKSk7CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTUsMTEgKzI0NiwxMCBAQAogdW5yZWdpc3Rlcl9kZXZpY2Uodm9pZCkKIHsKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7Ci0JZGVidWdfcHJpbnRrKCgiZGV2aWNlIHVucmVnaXN0ZXJlZFxuIikpOwogCWlmIChzbmRfdW5yZWdpc3Rlcl9vc3NfZGV2aWNlKFNORFJWX09TU19ERVZJQ0VfVFlQRV9NVVNJQywgTlVMTCwgMCkgPCAwKQkJCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHVucmVnaXN0ZXIgZGV2aWNlIG11c2ljXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBlcnJvciB1bnJlZ2lzdGVyIGRldmljZSBtdXNpY1xuIik7CiAJaWYgKHNuZF91bnJlZ2lzdGVyX29zc19kZXZpY2UoU05EUlZfT1NTX0RFVklDRV9UWVBFX1NFUVVFTkNFUiwgTlVMTCwgMCkgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciB1bnJlZ2lzdGVyIGRldmljZSBzZXFcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGVycm9yIHVucmVnaXN0ZXIgZGV2aWNlIHNlcVxuIik7CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2RldmljZS5oIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfZGV2aWNlLmgKaW5kZXggYzAxNTRhOS4uYjQzOTI0MyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfZGV2aWNlLmgKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfZGV2aWNlLmgKQEAgLTMxLDkgKzMxLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9zZXFfa2VybmVsLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogCi0vKiBlbmFibGUgZGVidWcgcHJpbnQgKi8KLSNkZWZpbmUgU05EUlZfU0VRX09TU19ERUJVRwotCiAvKiBtYXguIGFwcGxpY2F0aW9ucyAqLwogI2RlZmluZSBTTkRSVl9TRVFfT1NTX01BWF9DTElFTlRTCTE2CiAjZGVmaW5lIFNORFJWX1NFUV9PU1NfTUFYX1NZTlRIX0RFVlMJMTYKQEAgLTQ2LDcgKzQzLDYgQEAKICNkZWZpbmUgU05EUlZfU0VRX09TU19WRVJTSU9OX1NUUgkiMC4xLjgiCiAKIC8qIGRldmljZSBhbmQgcHJvYyBpbnRlcmZhY2UgbmFtZSAqLwotI2RlZmluZSBTTkRSVl9TRVFfT1NTX0RFVk5BTUUJCSJzZXFfb3NzIgogI2RlZmluZSBTTkRSVl9TRVFfT1NTX1BST0NOQU1FCQkib3NzIgogCiAKQEAgLTE3NywxMyArMTczLDQgQEAKIC8qIG1pc2MuIGZ1bmN0aW9ucyBmb3IgcHJvYyBpbnRlcmZhY2UgKi8KIGNoYXIgKmVuYWJsZWRfc3RyKGludCBib29sKTsKIAotCi0vKiBmb3IgZGVidWcgKi8KLSNpZmRlZiBTTkRSVl9TRVFfT1NTX0RFQlVHCi1leHRlcm4gaW50IHNlcV9vc3NfZGVidWc7Ci0jZGVmaW5lIGRlYnVnX3ByaW50ayh4KQlkbyB7IGlmIChzZXFfb3NzX2RlYnVnID4gMCkgc25kX3ByaW50ZCB4OyB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgZGVidWdfcHJpbnRrKHgpCS8qKi8KLSNlbmRpZgotCiAjZW5kaWYgLyogX19TRVFfT1NTX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMKaW5kZXggYjNmMzliNS4uYjkxODRkMiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW5pdC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYwpAQCAtOTIsNyArOTIsNiBAQAogCQlnb3RvIF9fZXJyb3I7CiAKIAlzeXN0ZW1fY2xpZW50ID0gcmM7Ci0JZGVidWdfcHJpbnRrKCgibmV3IGNsaWVudCA9ICVkXG4iLCByYykpOwogCiAJLyogY3JlYXRlIGFubm91Y2VtZW50IHJlY2VpdmVyIHBvcnQgKi8KIAltZW1zZXQocG9ydCwgMCwgc2l6ZW9mKCpwb3J0KSk7CkBAIC0xOTAsMTAgKzE4OSw5IEBACiAKIAlkcCA9IGt6YWxsb2Moc2l6ZW9mKCpkcCksIEdGUF9LRVJORUwpOwogCWlmICghZHApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgbWFsbG9jIGRldmljZSBpbmZvXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCBtYWxsb2MgZGV2aWNlIGluZm9cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZGVidWdfcHJpbnRrKCgib3NzX29wZW46IGRwID0gJXBcbiIsIGRwKSk7CiAKIAlkcC0+Y3NlcSA9IHN5c3RlbV9jbGllbnQ7CiAJZHAtPnBvcnQgPSAtMTsKQEAgLTIwNiw3ICsyMDQsNyBAQAogCiAJZHAtPmluZGV4ID0gaTsKIAlpZiAoaSA+PSBTTkRSVl9TRVFfT1NTX01BWF9DTElFTlRTKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRvbyBtYW55IGFwcGxpY2F0aW9uc1xuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogdG9vIG1hbnkgYXBwbGljYXRpb25zXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIF9lcnJvcjsKIAl9CkBAIC0yMTYsMjEgKzIxNCwxOSBAQAogCXNuZF9zZXFfb3NzX21pZGlfc2V0dXAoZHApOwogCiAJaWYgKGRwLT5zeW50aF9vcGVuZWQgPT0gMCAmJiBkcC0+bWF4X21pZGlkZXYgPT0gMCkgewotCQkvKiBzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBkZXZpY2UgZm91bmRcbiIpOyAqLworCQkvKiBwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IG5vIGRldmljZSBmb3VuZFxuIik7ICovCiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBfZXJyb3I7CiAJfQogCiAJLyogY3JlYXRlIHBvcnQgKi8KLQlkZWJ1Z19wcmludGsoKCJjcmVhdGUgbmV3IHBvcnRcbiIpKTsKIAlyYyA9IGNyZWF0ZV9wb3J0KGRwKTsKIAlpZiAocmMgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IGNyZWF0ZSBwb3J0XG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCBjcmVhdGUgcG9ydFxuIik7CiAJCWdvdG8gX2Vycm9yOwogCX0KIAogCS8qIGFsbG9jYXRlIHF1ZXVlICovCi0JZGVidWdfcHJpbnRrKCgiYWxsb2NhdGUgcXVldWVcbiIpKTsKIAlyYyA9IGFsbG9jX3NlcV9xdWV1ZShkcCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBfZXJyb3I7CkBAIC0yNDcsNyArMjQzLDYgQEAKIAlkcC0+ZmlsZV9tb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CiAKIAkvKiBpbml0aWFsaXplIHJlYWQgcXVldWUgKi8KLQlkZWJ1Z19wcmludGsoKCJpbml0aWFsaXplIHJlYWQgcXVldWVcbiIpKTsKIAlpZiAoaXNfcmVhZF9tb2RlKGRwLT5maWxlX21vZGUpKSB7CiAJCWRwLT5yZWFkcSA9IHNuZF9zZXFfb3NzX3JlYWRxX25ldyhkcCwgbWF4cWxlbik7CiAJCWlmICghZHAtPnJlYWRxKSB7CkBAIC0yNTcsNyArMjUyLDYgQEAKIAl9CiAKIAkvKiBpbml0aWFsaXplIHdyaXRlIHF1ZXVlICovCi0JZGVidWdfcHJpbnRrKCgiaW5pdGlhbGl6ZSB3cml0ZSBxdWV1ZVxuIikpOwogCWlmIChpc193cml0ZV9tb2RlKGRwLT5maWxlX21vZGUpKSB7CiAJCWRwLT53cml0ZXEgPSBzbmRfc2VxX29zc193cml0ZXFfbmV3KGRwLCBtYXhxbGVuKTsKIAkJaWYgKCFkcC0+d3JpdGVxKSB7CkBAIC0yNjcsMTQgKzI2MSwxMiBAQAogCX0KIAogCS8qIGluaXRpYWxpemUgdGltZXIgKi8KLQlkZWJ1Z19wcmludGsoKCJpbml0aWFsaXplIHRpbWVyXG4iKSk7CiAJZHAtPnRpbWVyID0gc25kX3NlcV9vc3NfdGltZXJfbmV3KGRwKTsKIAlpZiAoIWRwLT50aW1lcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhbGxvYyB0aW1lclxuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgYWxsb2MgdGltZXJcbiIpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gX2Vycm9yOwogCX0KLQlkZWJ1Z19wcmludGsoKCJ0aW1lciBpbml0aWFsaXplZFxuIikpOwogCiAJLyogc2V0IHByaXZhdGUgZGF0YSBwb2ludGVyICovCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZHA7CkBAIC0yODgsNyArMjgwLDYgQEAKIAljbGllbnRfdGFibGVbZHAtPmluZGV4XSA9IGRwOwogCW51bV9jbGllbnRzKys7CiAKLQlkZWJ1Z19wcmludGsoKCJvcGVuIGRvbmVcbiIpKTsKIAlyZXR1cm4gMDsKIAogIF9lcnJvcjoKQEAgLTM0Nyw3ICszMzgsNiBAQAogCQlyZXR1cm4gcmM7CiAKIAlkcC0+cG9ydCA9IHBvcnQuYWRkci5wb3J0OwotCWRlYnVnX3ByaW50aygoIm5ldyBwb3J0ID0gJWRcbiIsIHBvcnQuYWRkci5wb3J0KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2Myw3ICszNTMsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkZWJ1Z19wcmludGsoKCJkZWxldGVfcG9ydCAlaVxuIiwgZHAtPnBvcnQpKTsKIAlyZXR1cm4gc25kX3NlcV9ldmVudF9wb3J0X2RldGFjaChkcC0+Y3NlcSwgZHAtPnBvcnQpOwogfQogCkBAIC00MDEsNyArMzkwLDcgQEAKIAlxaW5mby5xdWV1ZSA9IHF1ZXVlOwogCXJjID0gY2FsbF9jdGwoU05EUlZfU0VRX0lPQ1RMX0RFTEVURV9RVUVVRSwgJnFpbmZvKTsKIAlpZiAocmMgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgInNlcS1vc3M6IHVuYWJsZSB0byBkZWxldGUgcXVldWUgJWQgKCVkKVxuIiwgcXVldWUsIHJjKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiB1bmFibGUgdG8gZGVsZXRlIHF1ZXVlICVkICglZClcbiIsIHF1ZXVlLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC00MzgsMjEgKzQyNywxNiBAQAogCWNsaWVudF90YWJsZVtkcC0+aW5kZXhdID0gTlVMTDsKIAludW1fY2xpZW50cy0tOwogCi0JZGVidWdfcHJpbnRrKCgicmVzZXR0aW5nLi5cbiIpKTsKIAlzbmRfc2VxX29zc19yZXNldChkcCk7CiAKLQlkZWJ1Z19wcmludGsoKCJjbGVhbmluZyB1cC4uXG4iKSk7CiAJc25kX3NlcV9vc3Nfc3ludGhfY2xlYW51cChkcCk7CiAJc25kX3NlcV9vc3NfbWlkaV9jbGVhbnVwKGRwKTsKIAogCS8qIGNsZWFyIHNsb3QgKi8KLQlkZWJ1Z19wcmludGsoKCJyZWxlYXNpbmcgcmVzb3VyY2UuLlxuIikpOwogCXF1ZXVlID0gZHAtPnF1ZXVlOwogCWlmIChkcC0+cG9ydCA+PSAwKQogCQlkZWxldGVfcG9ydChkcCk7CiAJZGVsZXRlX3NlcV9xdWV1ZShxdWV1ZSk7Ci0KLQlkZWJ1Z19wcmludGsoKCJyZWxlYXNlIGRvbmVcbiIpKTsKIH0KIAogCkBAIC00NjYsNyArNDUwLDYgQEAKIAkJcmV0dXJuOwogCWlmIChpc193cml0ZV9tb2RlKGRwLT5maWxlX21vZGUpICYmICFpc19ub25ibG9ja19tb2RlKGRwLT5maWxlX21vZGUpICYmCiAJICAgIGRwLT53cml0ZXEpIHsKLQkJZGVidWdfcHJpbnRrKCgic3luY2luZy4uXG4iKSk7CiAJCXdoaWxlIChzbmRfc2VxX29zc193cml0ZXFfc3luYyhkcC0+d3JpdGVxKSkKIAkJCTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pb2N0bC5jIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW9jdGwuYwppbmRleCA1YWM3MDFjLi41Yjg1MjAxIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pb2N0bC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2lvY3RsLmMKQEAgLTkwLDEyICs5MCwxMCBAQAogCQlyZXR1cm4gc25kX3NlcV9vc3NfdGltZXJfaW9jdGwoZHAtPnRpbWVyLCBjbWQsIGFyZyk7CiAKIAljYXNlIFNORENUTF9TRVFfUEFOSUM6Ci0JCWRlYnVnX3ByaW50aygoInBhbmljXG4iKSk7CiAJCXNuZF9zZXFfb3NzX3Jlc2V0KGRwKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljYXNlIFNORENUTF9TRVFfU1lOQzoKLQkJZGVidWdfcHJpbnRrKCgic3luY1xuIikpOwogCQlpZiAoISBpc193cml0ZV9tb2RlKGRwLT5maWxlX21vZGUpIHx8IGRwLT53cml0ZXEgPT0gTlVMTCkKIAkJCXJldHVybiAwOwogCQl3aGlsZSAoc25kX3NlcV9vc3Nfd3JpdGVxX3N5bmMoZHAtPndyaXRlcSkpCkBAIC0xMDUsNTUgKzEwMyw0NSBAQAogCQlyZXR1cm4gMDsKIAogCWNhc2UgU05EQ1RMX1NFUV9SRVNFVDoKLQkJZGVidWdfcHJpbnRrKCgicmVzZXRcbiIpKTsKIAkJc25kX3NlcV9vc3NfcmVzZXQoZHApOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgU05EQ1RMX1NFUV9URVNUTUlESToKLQkJZGVidWdfcHJpbnRrKCgidGVzdCBtaWRpXG4iKSk7CiAJCWlmIChnZXRfdXNlcihkZXYsIHApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiBzbmRfc2VxX29zc19taWRpX29wZW4oZHAsIGRldiwgZHAtPmZpbGVfbW9kZSk7CiAKIAljYXNlIFNORENUTF9TRVFfR0VUSU5DT1VOVDoKLQkJZGVidWdfcHJpbnRrKCgiZ2V0IGluIGNvdW50XG4iKSk7CiAJCWlmIChkcC0+cmVhZHEgPT0gTlVMTCB8fCAhIGlzX3JlYWRfbW9kZShkcC0+ZmlsZV9tb2RlKSkKIAkJCXJldHVybiAwOwogCQlyZXR1cm4gcHV0X3VzZXIoZHAtPnJlYWRxLT5xbGVuLCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU0VRX0dFVE9VVENPVU5UOgotCQlkZWJ1Z19wcmludGsoKCJnZXQgb3V0IGNvdW50XG4iKSk7CiAJCWlmICghIGlzX3dyaXRlX21vZGUoZHAtPmZpbGVfbW9kZSkgfHwgZHAtPndyaXRlcSA9PSBOVUxMKQogCQkJcmV0dXJuIDA7CiAJCXJldHVybiBwdXRfdXNlcihzbmRfc2VxX29zc193cml0ZXFfZ2V0X2ZyZWVfc2l6ZShkcC0+d3JpdGVxKSwgcCkgPyAtRUZBVUxUIDogMDsKIAogCWNhc2UgU05EQ1RMX1NFUV9HRVRUSU1FOgotCQlkZWJ1Z19wcmludGsoKCJnZXQgdGltZVxuIikpOwogCQlyZXR1cm4gcHV0X3VzZXIoc25kX3NlcV9vc3NfdGltZXJfY3VyX3RpY2soZHAtPnRpbWVyKSwgcCkgPyAtRUZBVUxUIDogMDsKIAogCWNhc2UgU05EQ1RMX1NFUV9SRVNFVFNBTVBMRVM6Ci0JCWRlYnVnX3ByaW50aygoInJlc2V0IHNhbXBsZXNcbiIpKTsKIAkJaWYgKGdldF91c2VyKGRldiwgcCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX3N5bnRoX2lvY3RsKGRwLCBkZXYsIGNtZCwgY2FyZyk7CiAKIAljYXNlIFNORENUTF9TRVFfTlJTWU5USFM6Ci0JCWRlYnVnX3ByaW50aygoIm5yIHN5bnRoc1xuIikpOwogCQlyZXR1cm4gcHV0X3VzZXIoZHAtPm1heF9zeW50aGRldiwgcCkgPyAtRUZBVUxUIDogMDsKIAogCWNhc2UgU05EQ1RMX1NFUV9OUk1JRElTOgotCQlkZWJ1Z19wcmludGsoKCJuciBtaWRpc1xuIikpOwogCQlyZXR1cm4gcHV0X3VzZXIoZHAtPm1heF9taWRpZGV2LCBwKSA/IC1FRkFVTFQgOiAwOwogCiAJY2FzZSBTTkRDVExfU1lOVEhfTUVNQVZMOgotCQlkZWJ1Z19wcmludGsoKCJtZW0gYXZhaWxcbiIpKTsKIAkJaWYgKGdldF91c2VyKGRldiwgcCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJdmFsID0gc25kX3NlcV9vc3Nfc3ludGhfaW9jdGwoZHAsIGRldiwgY21kLCBjYXJnKTsKIAkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCkgPyAtRUZBVUxUIDogMDsKIAogCWNhc2UgU05EQ1RMX0ZNXzRPUF9FTkFCTEU6Ci0JCWRlYnVnX3ByaW50aygoIjRvcFxuIikpOwogCQlpZiAoZ2V0X3VzZXIoZGV2LCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlzbmRfc2VxX29zc19zeW50aF9pb2N0bChkcCwgZGV2LCBjbWQsIGNhcmcpOwpAQCAtMTYxLDE5ICsxNDksMTUgQEAKIAogCWNhc2UgU05EQ1RMX1NZTlRIX0lORk86CiAJY2FzZSBTTkRDVExfU1lOVEhfSUQ6Ci0JCWRlYnVnX3ByaW50aygoInN5bnRoIGluZm9cbiIpKTsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX3N5bnRoX2luZm9fdXNlcihkcCwgYXJnKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9PVVRPRkJBTkQ6Ci0JCWRlYnVnX3ByaW50aygoIm91dCBvZiBiYW5kXG4iKSk7CiAJCXJldHVybiBzbmRfc2VxX29zc19vb2JfdXNlcihkcCwgYXJnKTsKIAogCWNhc2UgU05EQ1RMX01JRElfSU5GTzoKLQkJZGVidWdfcHJpbnRrKCgibWlkaSBpbmZvXG4iKSk7CiAJCXJldHVybiBzbmRfc2VxX29zc19taWRpX2luZm9fdXNlcihkcCwgYXJnKTsKIAogCWNhc2UgU05EQ1RMX1NFUV9USFJFU0hPTEQ6Ci0JCWRlYnVnX3ByaW50aygoInRocmVzaG9sZFxuIikpOwogCQlpZiAoISBpc193cml0ZV9tb2RlKGRwLT5maWxlX21vZGUpKQogCQkJcmV0dXJuIDA7CiAJCWlmIChnZXRfdXNlcih2YWwsIHApKQpAQCAtMTg2LDcgKzE3MCw2IEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBTTkRDVExfTUlESV9QUkVUSU1FOgotCQlkZWJ1Z19wcmludGsoKCJwcmV0aW1lXG4iKSk7CiAJCWlmIChkcC0+cmVhZHEgPT0gTlVMTCB8fCAhaXNfcmVhZF9tb2RlKGRwLT5maWxlX21vZGUpKQogCQkJcmV0dXJuIDA7CiAJCWlmIChnZXRfdXNlcih2YWwsIHApKQpAQCAtMTk5LDcgKzE4Miw2IEBACiAJCXJldHVybiBwdXRfdXNlcih2YWwsIHApID8gLUVGQVVMVCA6IDA7CiAKIAlkZWZhdWx0OgotCQlkZWJ1Z19wcmludGsoKCJvdGhlcnNcbiIpKTsKIAkJaWYgKCEgaXNfd3JpdGVfbW9kZShkcC0+ZmlsZV9tb2RlKSkKIAkJCXJldHVybiAtRUlPOwogCQlyZXR1cm4gc25kX3NlcV9vc3Nfc3ludGhfaW9jdGwoZHAsIDAsIGNtZCwgY2FyZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19taWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19taWRpLmMKaW5kZXggODYyZDg0ODkuLjNhNDU2OTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19taWRpLmMKQEAgLTE1Myw3ICsxNTMsNiBAQAogCXN0cnVjdCBzZXFfb3NzX21pZGkgKm1kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRlYnVnX3ByaW50aygoImNoZWNrIGZvciBNSURJIGNsaWVudCAlZCBwb3J0ICVkXG4iLCBwaW5mby0+YWRkci5jbGllbnQsIHBpbmZvLT5hZGRyLnBvcnQpKTsKIAkvKiB0aGUgcG9ydCBtdXN0IGluY2x1ZGUgZ2VuZXJpYyBtaWRpICovCiAJaWYgKCEgKHBpbmZvLT50eXBlICYgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dFTkVSSUMpKQogCQlyZXR1cm4gMDsKQEAgLTE3NSw3ICsxNzQsNyBAQAogCSAqIGFsbG9jYXRlIG1pZGkgaW5mbyByZWNvcmQKIAkgKi8KIAlpZiAoKG1kZXYgPSBremFsbG9jKHNpemVvZigqbWRldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IG1hbGxvYyBtaWRpIGluZm9cbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyBtaWRpIGluZm9cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE5MSw3ICsxOTAsNyBAQAogCiAJLyogY3JlYXRlIE1JREkgY29kZXIgKi8KIAlpZiAoc25kX21pZGlfZXZlbnRfbmV3KE1BWF9NSURJX0VWRU5UX0JVRiwgJm1kZXYtPmNvZGVyKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgbWFsbG9jIG1pZGkgY29kZXJcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyBtaWRpIGNvZGVyXG4iKTsKIAkJa2ZyZWUobWRldik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTQwNiw3ICs0MDUsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkZWJ1Z19wcmludGsoKCJjbG9zaW5nIGNsaWVudCAlZCBwb3J0ICVkIG1vZGUgJWRcbiIsIG1kZXYtPmNsaWVudCwgbWRldi0+cG9ydCwgbWRldi0+b3BlbmVkKSk7CiAJbWVtc2V0KCZzdWJzLCAwLCBzaXplb2Yoc3VicykpOwogCWlmIChtZGV2LT5vcGVuZWQgJiBQRVJNX1dSSVRFKSB7CiAJCXN1YnMuc2VuZGVyID0gZHAtPmFkZHI7CkBAIC00NzAsNyArNDY4LDYgQEAKIAkJc3RydWN0IHNuZF9zZXFfZXZlbnQgZXY7CiAJCWludCBjOwogCi0JCWRlYnVnX3ByaW50aygoInJlc2V0dGluZyBjbGllbnQgJWQgcG9ydCAlZFxuIiwgbWRldi0+Y2xpZW50LCBtZGV2LT5wb3J0KSk7CiAJCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwogCQlldi5kZXN0LmNsaWVudCA9IG1kZXYtPmNsaWVudDsKIAkJZXYuZGVzdC5wb3J0ID0gbWRldi0+cG9ydDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3JlYWRxLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19yZWFkcS5jCmluZGV4IDczNjYxYzQuLjY1NGQxN2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3JlYWRxLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfcmVhZHEuYwpAQCAtNDgsMTIgKzQ4LDEyIEBACiAJc3RydWN0IHNlcV9vc3NfcmVhZHEgKnE7CiAKIAlpZiAoKHEgPSBremFsbG9jKHNpemVvZigqcSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IG1hbGxvYyByZWFkIHF1ZXVlXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCBtYWxsb2MgcmVhZCBxdWV1ZVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmICgocS0+cSA9IGtjYWxsb2MobWF4bGVuLCBzaXplb2YodW5pb24gZXZyZWMpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBtYWxsb2MgcmVhZCBxdWV1ZSBidWZmZXJcbiIpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyByZWFkIHF1ZXVlIGJ1ZmZlclxuIik7CiAJCWtmcmVlKHEpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYwppbmRleCBjNWI3NzNhLi43MDFmZWI3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoKHJlYyA9IGt6YWxsb2Moc2l6ZW9mKCpyZWMpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBtYWxsb2Mgc3ludGggaW5mb1xuIik7CisJCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIHN5bnRoIGluZm9cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcmVjLT5zZXFfZGV2aWNlID0gLTE7CkBAIC0xMzAsNyArMTMwLDcgQEAKIAlpZiAoaSA+PSBtYXhfc3ludGhfZGV2cykgewogCQlpZiAobWF4X3N5bnRoX2RldnMgPj0gU05EUlZfU0VRX09TU19NQVhfU1lOVEhfREVWUykgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibm8gbW9yZSBzeW50aCBzbG90XG4iKTsKKwkJCXByX2VycigiQUxTQTogc2VxX29zczogbm8gbW9yZSBzeW50aCBzbG90XG4iKTsKIAkJCWtmcmVlKHJlYyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTM4LDcgKzEzOCw2IEBACiAJfQogCXJlYy0+c2VxX2RldmljZSA9IGk7CiAJc3ludGhfZGV2c1tpXSA9IHJlYzsKLQlkZWJ1Z19wcmludGsoKCJzeW50aCAlcyByZWdpc3RlcmVkICVkXG4iLCByZWMtPm5hbWUsIGkpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWdpc3Rlcl9sb2NrLCBmbGFncyk7CiAJZGV2LT5kcml2ZXJfZGF0YSA9IHJlYzsKICNpZmRlZiBTTkRSVl9PU1NfSU5GT19ERVZfU1lOVEgKQEAgLTE2Myw3ICsxNjIsNyBAQAogCX0KIAlpZiAoaW5kZXggPj0gbWF4X3N5bnRoX2RldnMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCB1bnJlZ2lzdGVyIHN5bnRoXG4iKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXFfb3NzOiBjYW4ndCB1bnJlZ2lzdGVyIHN5bnRoXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN5bnRoX2RldnNbaW5kZXhdID0gTlVMTDsKQEAgLTI0OCw3ICsyNDcsNyBAQAogCQlpZiAoaW5mby0+bnJfdm9pY2VzID4gMCkgewogCQkJaW5mby0+Y2ggPSBrY2FsbG9jKGluZm8tPm5yX3ZvaWNlcywgc2l6ZW9mKHN0cnVjdCBzZXFfb3NzX2NoaW5mbyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFpbmZvLT5jaCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbm5vdCBtYWxsb2NcbiIpOworCQkJCXByX2VycigiQUxTQTogc2VxX29zczogQ2Fubm90IG1hbGxvYyB2b2ljZXNcbiIpOwogCQkJCXJlYy0+b3Blci5jbG9zZSgmaW5mby0+YXJnKTsKIAkJCQltb2R1bGVfcHV0KHJlYy0+b3Blci5vd25lcik7CiAJCQkJc25kX3VzZV9sb2NrX2ZyZWUoJnJlYy0+dXNlX2xvY2spOwpAQCAtMjU2LDcgKzI1NSw2IEBACiAJCQl9CiAJCQlyZXNldF9jaGFubmVscyhpbmZvKTsKIAkJfQotCQlkZWJ1Z19wcmludGsoKCJzeW50aCAlZCBhc3NpZ25lZFxuIiwgaSkpOwogCQlpbmZvLT5vcGVuZWQrKzsKIAkJcmVjLT5vcGVuZWQrKzsKIAkJZHAtPnN5bnRoX29wZW5lZCsrOwpAQCAtMzI2LDcgKzMyNCw2IEBACiAJCQlpZiAocmVjID09IE5VTEwpCiAJCQkJY29udGludWU7CiAJCQlpZiAocmVjLT5vcGVuZWQgPiAwKSB7Ci0JCQkJZGVidWdfcHJpbnRrKCgic3ludGggJWQgY2xvc2VkXG4iLCBpKSk7CiAJCQkJcmVjLT5vcGVyLmNsb3NlKCZpbmZvLT5hcmcpOwogCQkJCW1vZHVsZV9wdXQocmVjLT5vcGVyLm93bmVyKTsKIAkJCQlyZWMtPm9wZW5lZCA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc190aW1lci5jIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfdGltZXIuYwppbmRleCBhYjU5Y2JmLi40ZjI0ZWE5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc190aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3RpbWVyLmMKQEAgLTIzMyw3ICsyMzMsNiBAQAogCWludCB2YWx1ZTsKIAogCWlmIChjbWQgPT0gU05EQ1RMX1NFUV9DVFJMUkFURSkgewotCQlkZWJ1Z19wcmludGsoKCJjdHJsIHJhdGVcbiIpKTsKIAkJLyogaWYgKmFyZyA9PSAwLCBqdXN0IHJldHVybiB0aGUgY3VycmVudCByYXRlICovCiAJCWlmIChnZXRfdXNlcih2YWx1ZSwgYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjQ4LDIxICsyNDcsMTYgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRDVExfVE1SX1NUQVJUOgotCQlkZWJ1Z19wcmludGsoKCJ0aW1lciBzdGFydFxuIikpOwogCQlyZXR1cm4gc25kX3NlcV9vc3NfdGltZXJfc3RhcnQodGltZXIpOwogCWNhc2UgU05EQ1RMX1RNUl9TVE9QOgotCQlkZWJ1Z19wcmludGsoKCJ0aW1lciBzdG9wXG4iKSk7CiAJCXJldHVybiBzbmRfc2VxX29zc190aW1lcl9zdG9wKHRpbWVyKTsKIAljYXNlIFNORENUTF9UTVJfQ09OVElOVUU6Ci0JCWRlYnVnX3ByaW50aygoInRpbWVyIGNvbnRpbnVlXG4iKSk7CiAJCXJldHVybiBzbmRfc2VxX29zc190aW1lcl9jb250aW51ZSh0aW1lcik7CiAJY2FzZSBTTkRDVExfVE1SX1RFTVBPOgotCQlkZWJ1Z19wcmludGsoKCJ0aW1lciB0ZW1wb1xuIikpOwogCQlpZiAoZ2V0X3VzZXIodmFsdWUsIGFyZykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIHNuZF9zZXFfb3NzX3RpbWVyX3RlbXBvKHRpbWVyLCB2YWx1ZSk7CiAJY2FzZSBTTkRDVExfVE1SX1RJTUVCQVNFOgotCQlkZWJ1Z19wcmludGsoKCJ0aW1lciB0aW1lYmFzZVxuIikpOwogCQlpZiAoZ2V0X3VzZXIodmFsdWUsIGFyZykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKHZhbHVlIDwgTUlOX09TU19USU1FQkFTRSkKQEAgLTI3Niw3ICsyNzAsNiBAQAogCWNhc2UgU05EQ1RMX1RNUl9NRVRST05PTUU6CiAJY2FzZSBTTkRDVExfVE1SX1NFTEVDVDoKIAljYXNlIFNORENUTF9UTVJfU09VUkNFOgotCQlkZWJ1Z19wcmludGsoKCJ0aW1lciBYWFhcbiIpKTsKIAkJLyogbm90IHN1cHBvcnRlZCAqLwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKaW5kZXggNGRjNmJhZS4uOWNhNWU2NCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiBzdGF0aWMgc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnRwdHIoaW50IGNsaWVudGlkKQogewogCWlmIChjbGllbnRpZCA8IDAgfHwgY2xpZW50aWQgPj0gU05EUlZfU0VRX01BWF9DTElFTlRTKSB7Ci0JCXNuZF9wcmludGQoIlNlcTogb29wcy4gVHJ5aW5nIHRvIGdldCBwb2ludGVyIHRvIGNsaWVudCAlZFxuIiwKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogb29wcy4gVHJ5aW5nIHRvIGdldCBwb2ludGVyIHRvIGNsaWVudCAlZFxuIiwKIAkJCSAgIGNsaWVudGlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTM2LDcgKzEzNiw3IEBACiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQ7CiAKIAlpZiAoY2xpZW50aWQgPCAwIHx8IGNsaWVudGlkID49IFNORFJWX1NFUV9NQVhfQ0xJRU5UUykgewotCQlzbmRfcHJpbnRkKCJTZXE6IG9vcHMuIFRyeWluZyB0byBnZXQgcG9pbnRlciB0byBjbGllbnQgJWRcbiIsCisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG9vcHMuIFRyeWluZyB0byBnZXQgcG9pbnRlciB0byBjbGllbnQgJWRcbiIsCiAJCQkgICBjbGllbnRpZCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTI5MSw4ICsyOTEsOCBAQAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlzd2l0Y2ggKGNsaWVudC0+dHlwZSkgewogCWNhc2UgTk9fQ0xJRU5UOgotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiU2VxOiBUcnlpbmcgdG8gZnJlZSB1bnVzZWQgY2xpZW50ICVkXG4iLAotCQkJICAgY2xpZW50LT5udW1iZXIpOworCQlwcl93YXJuKCJBTFNBOiBzZXE6IFRyeWluZyB0byBmcmVlIHVudXNlZCBjbGllbnQgJWRcbiIsCisJCQljbGllbnQtPm51bWJlcik7CiAJCWJyZWFrOwogCWNhc2UgVVNFUl9DTElFTlQ6CiAJY2FzZSBLRVJORUxfQ0xJRU5UOgpAQCAtMzAxLDcgKzMwMSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiU2VxOiBUcnlpbmcgdG8gZnJlZSBjbGllbnQgJWQgd2l0aCB1bmRlZmluZWQgdHlwZSA9ICVkXG4iLAorCQlwcl9lcnIoIkFMU0E6IHNlcTogVHJ5aW5nIHRvIGZyZWUgY2xpZW50ICVkIHdpdGggdW5kZWZpbmVkIHR5cGUgPSAlZFxuIiwKIAkJCSAgIGNsaWVudC0+bnVtYmVyLCBjbGllbnQtPnR5cGUpOwogCX0KIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKQEAgLTc3Myw3ICs3NzMsNyBAQAogc3RhdGljIGludCBtdWx0aWNhc3RfZXZlbnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBzbmRfc2VxX2V2ZW50ICpldmVudCwKIAkJCSAgIGludCBhdG9taWMsIGludCBob3ApCiB7Ci0Jc25kX3ByaW50ZCgic2VxOiBtdWx0aWNhc3Qgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKKwlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtdWx0aWNhc3Qgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKIAlyZXR1cm4gMDsgLyogaWdub3JlZCAqLwogfQogI2VuZGlmIC8qIFNVUFBPUlRfQlJPQURDQVNUICovCkBAIC03OTQsNyArNzk0LDcgQEAKIAogCWhvcCsrOwogCWlmIChob3AgPj0gU05EUlZfU0VRX01BWF9IT1BTKSB7Ci0JCXNuZF9wcmludGQoInRvbyBsb25nIGRlbGl2ZXJ5IHBhdGggKCVkOiVkLT4lZDolZClcbiIsCisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IHRvbyBsb25nIGRlbGl2ZXJ5IHBhdGggKCVkOiVkLT4lZDolZClcbiIsCiAJCQkgICBldmVudC0+c291cmNlLmNsaWVudCwgZXZlbnQtPnNvdXJjZS5wb3J0LAogCQkJICAgZXZlbnQtPmRlc3QuY2xpZW50LCBldmVudC0+ZGVzdC5wb3J0KTsKIAkJcmV0dXJuIC1FTUxJTks7CkBAIC0yMTk2LDcgKzIxOTYsNyBAQAogCQlpZiAocC0+Y21kID09IGNtZCkKIAkJCXJldHVybiBwLT5mdW5jKGNsaWVudCwgYXJnKTsKIAl9Ci0Jc25kX3ByaW50ZCgic2VxIHVua25vd24gaW9jdGwoKSAweCV4ICh0eXBlPSclYycsIG51bWJlcj0weCUwMngpXG4iLAorCXByX2RlYnVnKCJBTFNBOiBzZXEgdW5rbm93biBpb2N0bCgpIDB4JXggKHR5cGU9JyVjJywgbnVtYmVyPTB4JTAyeClcbiIsCiAJCSAgIGNtZCwgX0lPQ19UWVBFKGNtZCksIF9JT0NfTlIoY21kKSk7CiAJcmV0dXJuIC1FTk9UVFk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKaW5kZXggMDQwYzYwZS4uOTFhNzg2YSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAKIC8qCiAgKiByZWdpc3RlciBhIHNlcXVlbmNlciBkZXZpY2UKLSAqIGNhcmQgPSBjYXJkIGluZm8gKE5VTEwgYWxsb3dlZCkKKyAqIGNhcmQgPSBjYXJkIGluZm8KICAqIGRldmljZSA9IGRldmljZSBudW1iZXIgKGlmIGFueSkKICAqIGlkID0gaWQgb2YgZHJpdmVyCiAgKiByZXN1bHQgPSByZXR1cm4gcG9pbnRlciAoTlVMTCBhbGxvd2VkIGlmIHVubmVjZXNzYXJ5KQpAQCAtMzI1LDcgKzMyNSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpZiAob3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJkcml2ZXJfcmVnaXN0ZXI6IGRyaXZlciAnJXMnIGFscmVhZHkgZXhpc3RzXG4iLCBpZCk7CisJCXByX3dhcm4oIkFMU0E6IHNlcTogZHJpdmVyX3JlZ2lzdGVyOiBkcml2ZXIgJyVzJyBhbHJlYWR5IGV4aXN0c1xuIiwgaWQpOwogCQl1bmxvY2tfZHJpdmVyKG9wcyk7CiAJCXNuZF9zZXFfYXV0b2xvYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0zOTgsNyArMzk4LDcgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAlpZiAoISAob3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEKSB8fAogCSAgICAob3BzLT5kcml2ZXIgJiBEUklWRVJfTE9DS0VEKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkcml2ZXJfdW5yZWdpc3RlcjogY2Fubm90IHVubG9hZCBkcml2ZXIgJyVzJzogc3RhdHVzPSV4XG4iLAorCQlwcl9lcnIoIkFMU0E6IHNlcTogZHJpdmVyX3VucmVnaXN0ZXI6IGNhbm5vdCB1bmxvYWQgZHJpdmVyICclcyc6IHN0YXR1cz0leFxuIiwKIAkJCSAgIGlkLCBvcHMtPmRyaXZlcik7CiAJCXVubG9ja19kcml2ZXIob3BzKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTQxMyw3ICs0MTMsNyBAQAogCiAJb3BzLT5kcml2ZXIgPSAwOwogCWlmIChvcHMtPm51bV9pbml0X2RldmljZXMgPiAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJmcmVlX2RyaXZlcjogaW5pdF9kZXZpY2VzID4gMCEhICglZClcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBmcmVlX2RyaXZlcjogaW5pdF9kZXZpY2VzID4gMCEhICglZClcbiIsCiAJCQkgICBvcHMtPm51bV9pbml0X2RldmljZXMpOwogCW11dGV4X3VubG9jaygmb3BzLT5yZWdfbXV0ZXgpOwogCkBAIC00NTksNyArNDU5LDcgQEAKIAlpZiAoZGV2LT5zdGF0dXMgIT0gU05EUlZfU0VRX0RFVklDRV9GUkVFKQogCQlyZXR1cm4gMDsgLyogYWxyZWFkeSBpbml0aWFsaXplZCAqLwogCWlmIChvcHMtPmFyZ3NpemUgIT0gZGV2LT5hcmdzaXplKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImluY29tcGF0aWJsZSBkZXZpY2UgJyVzJyBmb3IgcGx1Zy1pbiAnJXMnICglZCAlZClcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBpbmNvbXBhdGlibGUgZGV2aWNlICclcycgZm9yIHBsdWctaW4gJyVzJyAoJWQgJWQpXG4iLAogCQkJICAgZGV2LT5uYW1lLCBvcHMtPmlkLCBvcHMtPmFyZ3NpemUsIGRldi0+YXJnc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCQlkZXYtPnN0YXR1cyA9IFNORFJWX1NFUV9ERVZJQ0VfUkVHSVNURVJFRDsKIAkJb3BzLT5udW1faW5pdF9kZXZpY2VzKys7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW5pdF9kZXZpY2UgZmFpbGVkOiAlczogJXNcbiIsCisJCXByX2VycigiQUxTQTogc2VxOiBpbml0X2RldmljZSBmYWlsZWQ6ICVzOiAlc1xuIiwKIAkJCSAgIGRldi0+bmFtZSwgZGV2LT5pZCk7CiAJfQogCkBAIC00ODYsNyArNDg2LDcgQEAKIAlpZiAoZGV2LT5zdGF0dXMgIT0gU05EUlZfU0VRX0RFVklDRV9SRUdJU1RFUkVEKQogCQlyZXR1cm4gMDsgLyogbm90IHJlZ2lzdGVyZWQgKi8KIAlpZiAob3BzLT5hcmdzaXplICE9IGRldi0+YXJnc2l6ZSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbmNvbXBhdGlibGUgZGV2aWNlICclcycgZm9yIHBsdWctaW4gJyVzJyAoJWQgJWQpXG4iLAorCQlwcl9lcnIoIkFMU0E6IHNlcTogaW5jb21wYXRpYmxlIGRldmljZSAnJXMnIGZvciBwbHVnLWluICclcycgKCVkICVkKVxuIiwKIAkJCSAgIGRldi0+bmFtZSwgb3BzLT5pZCwgb3BzLT5hcmdzaXplLCBkZXYtPmFyZ3NpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00OTUsNyArNDk1LDcgQEAKIAkJZGV2LT5kcml2ZXJfZGF0YSA9IE5VTEw7CiAJCW9wcy0+bnVtX2luaXRfZGV2aWNlcy0tOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImZyZWVfZGV2aWNlIGZhaWxlZDogJXM6ICVzXG4iLAorCQlwcl9lcnIoIkFMU0E6IHNlcTogZnJlZV9kZXZpY2UgZmFpbGVkOiAlczogJXNcbiIsCiAJCQkgICBkZXYtPm5hbWUsIGRldi0+aWQpOwogCX0KIApAQCAtNTU5LDcgKzU1OSw3IEBACiAJc25kX2luZm9fZnJlZV9lbnRyeShpbmZvX2VudHJ5KTsKICNlbmRpZgogCWlmIChudW1fb3BzKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkcml2ZXJzIG5vdCByZWxlYXNlZCAoJWQpXG4iLCBudW1fb3BzKTsKKwkJcHJfZXJyKCJBTFNBOiBzZXE6IGRyaXZlcnMgbm90IHJlbGVhc2VkICglZClcbiIsIG51bV9vcHMpOwogfQogCiBtb2R1bGVfaW5pdChhbHNhX3NlcV9kZXZpY2VfaW5pdCkKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kdW1teS5jIGIvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMKaW5kZXggZGJjNTUwNy4uZWM2NjdmMSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCWludCBpOwogCiAJaWYgKHBvcnRzIDwgMSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIG51bWJlciBvZiBwb3J0cyAlZFxuIiwgcG9ydHMpOworCQlwcl9lcnIoIkFMU0E6IHNlcV9kdW1teTogaW52YWxpZCBudW1iZXIgb2YgcG9ydHMgJWRcbiIsIHBvcnRzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfZmlmby5jIGIvc291bmQvY29yZS9zZXEvc2VxX2ZpZm8uYwppbmRleCAwZDc1YWZhLi41NTk5ODk5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZmlmby5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9maWZvLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogCWYgPSBremFsbG9jKHNpemVvZigqZiksIEdGUF9LRVJORUwpOwogCWlmIChmID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgibWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9maWZvX25ldygpIFxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfZmlmb19uZXcoKSBcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbG9jay5jCmluZGV4IDJjZmU1MGMuLjNiNjkzZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYwpAQCAtMzEsMTIgKzMxLDEyIEBACiAJaW50IG1heF9jb3VudCA9IDUgKiBIWjsKIAogCWlmIChhdG9taWNfcmVhZChsb2NrcCkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInNlcV9sb2NrOiBsb2NrIHRyb3VibGUgW2NvdW50ZXIgPSAlZF0gaW4gJXM6JWRcbiIsIGF0b21pY19yZWFkKGxvY2twKSwgZmlsZSwgbGluZSk7CisJCXByX3dhcm4oIkFMU0E6IHNlcV9sb2NrOiBsb2NrIHRyb3VibGUgW2NvdW50ZXIgPSAlZF0gaW4gJXM6JWRcbiIsIGF0b21pY19yZWFkKGxvY2twKSwgZmlsZSwgbGluZSk7CiAJCXJldHVybjsKIAl9CiAJd2hpbGUgKGF0b21pY19yZWFkKGxvY2twKSA+IDApIHsKIAkJaWYgKG1heF9jb3VudCA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAic2VxX2xvY2s6IHRpbWVvdXQgWyVkIGxlZnRdIGluICVzOiVkXG4iLCBhdG9taWNfcmVhZChsb2NrcCksIGZpbGUsIGxpbmUpOworCQkJcHJfd2FybigiQUxTQTogc2VxX2xvY2s6IHRpbWVvdXQgWyVkIGxlZnRdIGluICVzOiVkXG4iLCBhdG9taWNfcmVhZChsb2NrcCksIGZpbGUsIGxpbmUpOwogCQkJYnJlYWs7CiAJCX0KIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKaW5kZXggZjQ3OGY3Ny4uMWUyMDZkZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CiAJaWYgKHBvb2wtPnB0ciA9PSBOVUxMKSB7CS8qIG5vdCBpbml0aWFsaXplZCAqLwotCQlzbmRfcHJpbnRkKCJzZXE6IHBvb2wgaXMgbm90IGluaXRpYWxpemVkXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWRcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpAQCAtMzg4LDcgKzM4OCw3IEBACiAKIAlwb29sLT5wdHIgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NlcV9ldmVudF9jZWxsKSAqIHBvb2wtPnNpemUpOwogCWlmIChwb29sLT5wdHIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJzZXE6IG1hbGxvYyBmb3Igc2VxdWVuY2VyIGV2ZW50cyBmYWlsZWRcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZm9yIHNlcXVlbmNlciBldmVudHMgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00MzEsNyArNDMxLDcgQEAKIAogCXdoaWxlIChhdG9taWNfcmVhZCgmcG9vbC0+Y291bnRlcikgPiAwKSB7CiAJCWlmIChtYXhfY291bnQgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInNuZF9zZXFfcG9vbF9kb25lIHRpbWVvdXQ6ICVkIGNlbGxzIHJlbWFpblxuIiwgYXRvbWljX3JlYWQoJnBvb2wtPmNvdW50ZXIpKTsKKwkJCXByX3dhcm4oIkFMU0E6IHNuZF9zZXFfcG9vbF9kb25lIHRpbWVvdXQ6ICVkIGNlbGxzIHJlbWFpblxuIiwgYXRvbWljX3JlYWQoJnBvb2wtPmNvdW50ZXIpKTsKIAkJCWJyZWFrOwogCQl9CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJLyogY3JlYXRlIHBvb2wgYmxvY2sgKi8KIAlwb29sID0ga3phbGxvYyhzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMKTsKIAlpZiAocG9vbCA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoInNlcTogbWFsbG9jIGZhaWxlZCBmb3IgcG9vbFxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHBvb2xcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKaW5kZXggNjQwNjlkYi4uM2UwNWM1NSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCWlmICgodG1wID0gcnVudGltZS0+YXZhaWwpIDwgY291bnQpIHsKIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIk1JREkgb3V0cHV0IGJ1ZmZlciBvdmVycnVuXG4iKTsKKwkJCXByX2VycigiQUxTQTogc2VxX21pZGk6IE1JREkgb3V0cHV0IGJ1ZmZlciBvdmVycnVuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmIChzbmRfcmF3bWlkaV9rZXJuZWxfd3JpdGUoc3Vic3RyZWFtLCBidWYsIGNvdW50KSA8IGNvdW50KQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJaWYgKGV2LT50eXBlID09IFNORFJWX1NFUV9FVkVOVF9TWVNFWCkgewkvKiBzcGVjaWFsIGNhc2UsIHRvIHNhdmUgc3BhY2UgKi8KIAkJaWYgKChldi0+ZmxhZ3MgJiBTTkRSVl9TRVFfRVZFTlRfTEVOR1RIX01BU0spICE9IFNORFJWX1NFUV9FVkVOVF9MRU5HVEhfVkFSSUFCTEUpIHsKIAkJCS8qIGludmFsaWQgZXZlbnQgKi8KLQkJCXNuZF9wcmludGQoInNlcV9taWRpOiBpbnZhbGlkIHN5c2V4IGV2ZW50IGZsYWdzID0gMHgleFxuIiwgZXYtPmZsYWdzKTsKKwkJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaTogaW52YWxpZCBzeXNleCBldmVudCBmbGFncyA9IDB4JXhcbiIsIGV2LT5mbGFncyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlzbmRfc2VxX2R1bXBfdmFyX2V2ZW50KGV2LCAoc25kX3NlcV9kdW1wX2Z1bmNfdClkdW1wX21pZGksIHN1YnN0cmVhbSk7CkBAIC0xODksNyArMTg5LDcgQEAKIAkJCQkJICAgbXN5bnRoLT5zdWJkZXZpY2UsCiAJCQkJCSAgIFNORFJWX1JBV01JRElfTEZMR19JTlBVVCwKIAkJCQkJICAgJm1zeW50aC0+aW5wdXRfcmZpbGUpKSA8IDApIHsKLQkJc25kX3ByaW50ZCgibWlkaSBpbnB1dCBvcGVuIGZhaWxlZCEhIVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXFfbWlkaTogbWlkaSBpbnB1dCBvcGVuIGZhaWxlZCEhIVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJ1bnRpbWUgPSBtc3ludGgtPmlucHV0X3JmaWxlLmlucHV0LT5ydW50aW1lOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJCQkJCSAgIG1zeW50aC0+c3ViZGV2aWNlLAogCQkJCQkgICBTTkRSVl9SQVdNSURJX0xGTEdfT1VUUFVULAogCQkJCQkgICAmbXN5bnRoLT5vdXRwdXRfcmZpbGUpKSA8IDApIHsKLQkJc25kX3ByaW50ZCgibWlkaSBvdXRwdXQgb3BlbiBmYWlsZWQhISFcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxX21pZGk6IG1pZGkgb3V0cHV0IG9wZW4gZmFpbGVkISEhXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2VtdWwuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2VtdWwuYwppbmRleCA2ZjY0NDcxLi45YjY0NzBjIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9lbXVsLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZW11bC5jCkBAIC04OSw3ICs4OSw3IEBACiAJaW50IGRlc3RfY2hhbm5lbCA9IDA7CiAKIAlpZiAoZXYgPT0gTlVMTCB8fCBjaGFuc2V0ID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgiZXYgb3IgY2hhbmJhc2UgTlVMTCAoc25kX21pZGlfcHJvY2Vzc19ldmVudClcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxX21pZGlfZW11bDogZXYgb3IgY2hhbmJhc2UgTlVMTCAoc25kX21pZGlfcHJvY2Vzc19ldmVudClcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChjaGFuc2V0LT5jaGFubmVscyA9PSBOVUxMKQpAQCAtOTgsNyArOTgsNyBAQAogCWlmIChzbmRfc2VxX2V2X2lzX2NoYW5uZWxfdHlwZShldikpIHsKIAkJZGVzdF9jaGFubmVsID0gZXYtPmRhdGEubm90ZS5jaGFubmVsOwogCQlpZiAoZGVzdF9jaGFubmVsID49IGNoYW5zZXQtPm1heF9jaGFubmVscykgewotCQkJc25kX3ByaW50ZCgiZGVzdCBjaGFubmVsIGlzICVkLCBtYXggaXMgJWRcbiIsCisJCQlwcl9kZWJ1ZygiQUxTQTogc2VxX21pZGlfZW11bDogZGVzdCBjaGFubmVsIGlzICVkLCBtYXggaXMgJWRcbiIsCiAJCQkJICAgZGVzdF9jaGFubmVsLCBjaGFuc2V0LT5tYXhfY2hhbm5lbHMpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0yMzIsNyArMjMyLDcgQEAKIAljYXNlIFNORFJWX1NFUV9FVkVOVF9FQ0hPOgogCW5vdF95ZXQ6CiAJZGVmYXVsdDoKLQkJLypzbmRfcHJpbnRkKCJVbmltcGxlbWVudGVkIGV2ZW50ICVkXG4iLCBldi0+dHlwZSk7Ki8KKwkJLypwcl9kZWJ1ZygiQUxTQTogc2VxX21pZGlfZW11bDogVW5pbXBsZW1lbnRlZCBldmVudCAlZFxuIiwgZXYtPnR5cGUpOyovCiAJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jIGIvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMKaW5kZXggOTUxNmU1Yy4uNzk0YTM0MSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMKQEAgLTEzNSwxNCArMTM1LDE0IEBACiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGNsaWVudC0+bnVtX3BvcnRzID49IFNORFJWX1NFUV9NQVhfUE9SVFMgLSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ0b28gbWFueSBwb3J0cyBmb3IgY2xpZW50ICVkXG4iLCBjbGllbnQtPm51bWJlcik7CisJCXByX3dhcm4oIkFMU0E6IHNlcTogdG9vIG1hbnkgcG9ydHMgZm9yIGNsaWVudCAlZFxuIiwgY2xpZW50LT5udW1iZXIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAkvKiBjcmVhdGUgYSBuZXcgcG9ydCAqLwogCW5ld19wb3J0ID0ga3phbGxvYyhzaXplb2YoKm5ld19wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEgbmV3X3BvcnQpIHsKLQkJc25kX3ByaW50ZCgibWFsbG9jIGZhaWxlZCBmb3IgcmVnaXN0ZXJpbmcgY2xpZW50IHBvcnRcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZmFpbGVkIGZvciByZWdpc3RlcmluZyBjbGllbnQgcG9ydFxuIik7CiAJCXJldHVybiBOVUxMOwkvKiBmYWlsdXJlLCBvdXQgb2YgbWVtb3J5ICovCiAJfQogCS8qIGluaXQgcG9ydCBkYXRhICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfcHJpb3EuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jCmluZGV4IDI5ODk2YWIuLjAyMWIwMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jCkBAIC02MCw3ICs2MCw3IEBACiAKIAlmID0ga3phbGxvYyhzaXplb2YoKmYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZiA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoIm9vcHM6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfcHJpb3FfbmV3KClcbiIpOworCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX3ByaW9xX25ldygpXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCQpAQCAtNzksNyArNzksNyBAQAogCSpmaWZvID0gTlVMTDsKIAogCWlmIChmID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgib29wczogc25kX3NlcV9wcmlvcV9kZWxldGUoKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV9wcmlvcV9kZWxldGUoKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCWN1ciA9IGN1ci0+bmV4dDsKIAkJaWYgKCEgLS1jb3VudCkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZi0+bG9jaywgZmxhZ3MpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGZpbmQgYSBwb2ludGVyLi4gaW5maW5pdGUgbG9vcD9cbiIpOworCQkJcHJfZXJyKCJBTFNBOiBzZXE6IGNhbm5vdCBmaW5kIGEgcG9pbnRlci4uIGluZmluaXRlIGxvb3A/XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjIzLDcgKzIyMyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChmID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgib29wczogc25kX3NlcV9wcmlvcV9jZWxsX2luKCkgY2FsbGVkIHdpdGggTlVMTCBwcmlvcVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IHNuZF9zZXFfcHJpb3FfY2VsbF9pbigpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmYtPmxvY2ssIGZsYWdzKTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogaW50IHNuZF9zZXFfcHJpb3FfYXZhaWwoc3RydWN0IHNuZF9zZXFfcHJpb3EgKiBmKQogewogCWlmIChmID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgib29wczogc25kX3NlcV9wcmlvcV9jZWxsX2luKCkgY2FsbGVkIHdpdGggTlVMTCBwcmlvcVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IHNuZF9zZXFfcHJpb3FfY2VsbF9pbigpIGNhbGxlZCB3aXRoIE5VTEwgcHJpb3FcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIGYtPmNlbGxzOwpAQCAtMjU5LDcgKzI1OSw3IEBACiBzdHJ1Y3Qgc25kX3NlcV9ldmVudF9jZWxsICpzbmRfc2VxX3ByaW9xX2NlbGxfcGVlayhzdHJ1Y3Qgc25kX3NlcV9wcmlvcSAqIGYpCiB7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJvb3BzOiBzbmRfc2VxX3ByaW9xX2NlbGxfaW4oKSBjYWxsZWQgd2l0aCBOVUxMIHByaW9xXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogc25kX3NlcV9wcmlvcV9jZWxsX2luKCkgY2FsbGVkIHdpdGggTlVMTCBwcmlvcVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZi0+aGVhZDsKQEAgLTMyMSw3ICszMjEsNyBAQAogCQkJZnJlZXByZXYgPSBjZWxsOwogCQl9IGVsc2UgewogI2lmIDAKLQkJCXByaW50ayhLRVJOX0RFQlVHICJ0eXBlID0gJWksIHNvdXJjZSA9ICVpLCBkZXN0ID0gJWksICIKKwkJCXByX2RlYnVnKCJBTFNBOiBzZXE6IHR5cGUgPSAlaSwgc291cmNlID0gJWksIGRlc3QgPSAlaSwgIgogCQkJICAgICAgICJjbGllbnQgPSAlaVxuIiwKIAkJCQljZWxsLT5ldmVudC50eXBlLAogCQkJCWNlbGwtPmV2ZW50LnNvdXJjZS5jbGllbnQsCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCmluZGV4IGY5MDc3MzYuLmFhZDQ4NzggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAogCXEgPSBremFsbG9jKHNpemVvZigqcSksIEdGUF9LRVJORUwpOwogCWlmIChxID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgibWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV9xdWV1ZV9uZXcoKVxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfcXVldWVfbmV3KClcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV90aW1lci5jIGIvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMKaW5kZXggMjRkNDRiMi4uZTczNjA1MyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkKIAl0bXIgPSBremFsbG9jKHNpemVvZigqdG1yKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRtciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoIm1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfdGltZXJfbmV3KCkgXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZhaWxlZCBmb3Igc25kX3NlcV90aW1lcl9uZXcoKSBcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJnRtci0+bG9jayk7CkBAIC03OCw3ICs3OCw3IEBACiAJKnRtciA9IE5VTEw7CiAKIAlpZiAodCA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGQoIm9vcHM6IHNuZF9zZXFfdGltZXJfZGVsZXRlKCkgY2FsbGVkIHdpdGggTlVMTCB0aW1lclxuIik7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IHNuZF9zZXFfdGltZXJfZGVsZXRlKCkgY2FsbGVkIHdpdGggTlVMTCB0aW1lclxuIik7CiAJCXJldHVybjsKIAl9CiAJdC0+cnVubmluZyA9IDA7CkBAIC0xOTksNyArMTk5LDcgQEAKIAkJLyogcmVmdXNlIHRvIGNoYW5nZSBwcHEgb24gcnVubmluZyB0aW1lcnMgKi8KIAkJLyogYmVjYXVzZSBpdCB3aWxsIHVwc2V0IHRoZSBzb25nIHBvc2l0aW9uICh0aWNrcykgKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG1yLT5sb2NrLCBmbGFncyk7Ci0JCXNuZF9wcmludGQoInNlcTogY2Fubm90IGNoYW5nZSBwcHEgb2YgYSBydW5uaW5nIHRpbWVyXG4iKTsKKwkJcHJfZGVidWcoIkFMU0E6IHNlcTogY2Fubm90IGNoYW5nZSBwcHEgb2YgYSBydW5uaW5nIHRpbWVyXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogCiAJLyogRklYTUUgKi8KIAlpZiAoYmFzZSAhPSBTS0VXX0JBU0UpIHsKLQkJc25kX3ByaW50ZCgiaW52YWxpZCBza2V3IGJhc2UgMHgleFxuIiwgYmFzZSk7CisJCXByX2RlYnVnKCJBTFNBOiBzZXE6IGludmFsaWQgc2tldyBiYXNlIDB4JXhcbiIsIGJhc2UpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRtci0+bG9jaywgZmxhZ3MpOwpAQCAtMjkyLDcgKzI5Miw3IEBACiAJCX0KIAl9CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic2VxIGZhdGFsIGVycm9yOiBjYW5ub3QgY3JlYXRlIHRpbWVyICglaSlcbiIsIGVycik7CisJCXByX2VycigiQUxTQTogc2VxIGZhdGFsIGVycm9yOiBjYW5ub3QgY3JlYXRlIHRpbWVyICglaSlcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXQtPmNhbGxiYWNrID0gc25kX3NlcV90aW1lcl9pbnRlcnJ1cHQ7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3Zpcm1pZGkuYwppbmRleCA0YjUwZTYwLi41NmUwZjRjZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3Zpcm1pZGkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIAkJLyogc2hvdWxkIGNoZWNrIHByZXNlbmNlIG9mIHBvcnQgbW9yZSBzdHJpY3RseS4uICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInNlcV9tb2RlIGlzIG5vdCBzZXQ6ICVkXG4iLCByZGV2LT5zZXFfbW9kZSk7CisJCXByX2VycigiQUxTQTogc2VxX3Zpcm1pZGk6IHNlcV9tb2RlIGlzIG5vdCBzZXQ6ICVkXG4iLCByZGV2LT5zZXFfbW9kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmQuYyBiL3NvdW5kL2NvcmUvc291bmQuYwppbmRleCA0MzdjMjVlLi4zOGFkMWEwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kLmMKKysrIGIvc291bmQvY29yZS9zb3VuZC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlpZiAobXJlZyAmJiBtcmVnLT50eXBlID09IHR5cGUpIHsKIAkJcHJpdmF0ZV9kYXRhID0gbXJlZy0+cHJpdmF0ZV9kYXRhOwogCQlpZiAocHJpdmF0ZV9kYXRhICYmIG1yZWctPmNhcmRfcHRyKQotCQkJYXRvbWljX2luYygmbXJlZy0+Y2FyZF9wdHItPnJlZmNvdW50KTsKKwkJCWdldF9kZXZpY2UoJm1yZWctPmNhcmRfcHRyLT5jYXJkX2Rldik7CiAJfSBlbHNlCiAJCXByaXZhdGVfZGF0YSA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZzb3VuZF9tdXRleCk7CkBAIC0zNTUsMjIgKzM1NSwyNSBAQAogCiBFWFBPUlRfU1lNQk9MKHNuZF91bnJlZ2lzdGVyX2RldmljZSk7CiAKLWludCBzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKKy8qIGdldCB0aGUgYXNzaWduZWQgZGV2aWNlIHRvIHRoZSBnaXZlbiB0eXBlIGFuZCBkZXZpY2UgbnVtYmVyOworICogdGhlIGNhbGxlciBuZWVkcyB0byByZWxlYXNlIGl0IHZpYSBwdXRfZGV2aWNlKCkgYWZ0ZXIgdXNpbmcgaXQKKyAqLworc3RydWN0IGRldmljZSAqc25kX2dldF9kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldikKIHsKLQlpbnQgbWlub3IsIHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGRldmljZSAqZDsKKwlpbnQgbWlub3I7CisJc3RydWN0IGRldmljZSAqZCA9IE5VTEw7CiAKIAltdXRleF9sb2NrKCZzb3VuZF9tdXRleCk7CiAJbWlub3IgPSBmaW5kX3NuZF9taW5vcih0eXBlLCBjYXJkLCBkZXYpOwotCWlmIChtaW5vciA+PSAwICYmIChkID0gc25kX21pbm9yc1ttaW5vcl0tPmRldikgIT0gTlVMTCkKLQkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGQsIGF0dHIpOworCWlmIChtaW5vciA+PSAwKSB7CisJCWQgPSBzbmRfbWlub3JzW21pbm9yXS0+ZGV2OworCQlpZiAoZCkKKwkJCWdldF9kZXZpY2UoZCk7CisJfQogCW11dGV4X3VubG9jaygmc291bmRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KKwlyZXR1cm4gZDsKIH0KLQotRVhQT1JUX1NZTUJPTChzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKTsKK0VYUE9SVF9TWU1CT0woc25kX2dldF9kZXZpY2UpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIC8qCkBAIC00NTgsNyArNDYxLDcgQEAKIAlzbmRfbWFqb3IgPSBtYWpvcjsKIAlzbmRfZWNhcmRzX2xpbWl0ID0gY2FyZHNfbGltaXQ7CiAJaWYgKHJlZ2lzdGVyX2NocmRldihtYWpvciwgImFsc2EiLCAmc25kX2ZvcHMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciBuYXRpdmUgbWFqb3IgZGV2aWNlIG51bWJlciAlZFxuIiwgbWFqb3IpOworCQlwcl9lcnIoIkFMU0EgY29yZTogdW5hYmxlIHRvIHJlZ2lzdGVyIG5hdGl2ZSBtYWpvciBkZXZpY2UgbnVtYmVyICVkXG4iLCBtYWpvcik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoc25kX2luZm9faW5pdCgpIDwgMCkgewpAQCAtNDY3LDcgKzQ3MCw3IEBACiAJfQogCXNuZF9pbmZvX21pbm9yX3JlZ2lzdGVyKCk7CiAjaWZuZGVmIE1PRFVMRQotCXByaW50ayhLRVJOX0lORk8gIkFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSBEcml2ZXIgSW5pdGlhbGl6ZWQuXG4iKTsKKwlwcl9pbmZvKCJBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgRHJpdmVyIEluaXRpYWxpemVkLlxuIik7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmRfb3NzLmMgYi9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCmluZGV4IDcyNmE0OWEuLjU3M2E2NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKKysrIGIvc291bmQvY29yZS9zb3VuZF9vc3MuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCiAKLSNpZiAhZGVmaW5lZChDT05GSUdfU09VTkQpICYmICEoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX1NPVU5EX01PRFVMRSkpCisjaWYgIUlTX0VOQUJMRUQoQ09ORklHX1NPVU5EKQogI2Vycm9yICJFbmFibGUgdGhlIE9TUyBzb3VuZGNvcmUgbXVsdGlwbGV4ZXIgKENPTkZJR19TT1VORCkgaW4gdGhlIGtlcm5lbC4iCiAjZW5kaWYKIApAQCAtNTUsNyArNTUsNyBAQAogCWlmIChtcmVnICYmIG1yZWctPnR5cGUgPT0gdHlwZSkgewogCQlwcml2YXRlX2RhdGEgPSBtcmVnLT5wcml2YXRlX2RhdGE7CiAJCWlmIChwcml2YXRlX2RhdGEgJiYgbXJlZy0+Y2FyZF9wdHIpCi0JCQlhdG9taWNfaW5jKCZtcmVnLT5jYXJkX3B0ci0+cmVmY291bnQpOworCQkJZ2V0X2RldmljZSgmbXJlZy0+Y2FyZF9wdHItPmNhcmRfZGV2KTsKIAl9IGVsc2UKIAkJcHJpdmF0ZV9kYXRhID0gTlVMTDsKIAltdXRleF91bmxvY2soJnNvdW5kX29zc19tdXRleCk7CkBAIC0xMDUsOCArMTA1LDcgQEAKIH0KIAogaW50IHNuZF9yZWdpc3Rlcl9vc3NfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQkgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsIHZvaWQgKnByaXZhdGVfZGF0YSwKLQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQorCQkJICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZfb3BzLCB2b2lkICpwcml2YXRlX2RhdGEpCiB7CiAJaW50IG1pbm9yID0gc25kX29zc19rZXJuZWxfbWlub3IodHlwZSwgY2FyZCwgZGV2KTsKIAlpbnQgbWlub3JfdW5pdDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvdGltZXIuYyBiL3NvdW5kL2NvcmUvdGltZXIuYwppbmRleCA2ZGRjZjA2Li5jZmQ0NTVhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3RpbWVyLmMKKysrIGIvc291bmQvY29yZS90aW1lci5jCkBAIC0zNSw5ICszNSw5IEBACiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9IUlRJTUVSKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfSFJUSU1FUl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX0hSVElNRVIpCiAjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgNAotI2VsaWYgZGVmaW5lZChDT05GSUdfU05EX1JUQ1RJTUVSKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUlRDVElNRVJfTU9EVUxFKQorI2VsaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX1JUQ1RJTUVSKQogI2RlZmluZSBERUZBVUxUX1RJTUVSX0xJTUlUIDIKICNlbHNlCiAjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgMQpAQCAtMjQwLDcgKzI0MCw4IEBACiAJCS8qIG9wZW4gYSBzbGF2ZSBpbnN0YW5jZSAqLwogCQlpZiAodGlkLT5kZXZfc2NsYXNzIDw9IFNORFJWX1RJTUVSX1NDTEFTU19OT05FIHx8CiAJCSAgICB0aWQtPmRldl9zY2xhc3MgPiBTTkRSVl9USU1FUl9TQ0xBU1NfT1NTX1NFUVVFTkNFUikgewotCQkJc25kX3ByaW50ZCgiaW52YWxpZCBzbGF2ZSBjbGFzcyAlaVxuIiwgdGlkLT5kZXZfc2NsYXNzKTsKKwkJCXByX2RlYnVnKCJBTFNBOiB0aW1lcjogaW52YWxpZCBzbGF2ZSBjbGFzcyAlaVxuIiwKKwkJCQkgdGlkLT5kZXZfc2NsYXNzKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKQEAgLTc3NCw3ICs3NzUsNyBAQAogCQkqcnRpbWVyID0gTlVMTDsKIAl0aW1lciA9IGt6YWxsb2Moc2l6ZW9mKCp0aW1lciksIEdGUF9LRVJORUwpOwogCWlmICh0aW1lciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRpbWVyOiBjYW5ub3QgYWxsb2NhdGVcbiIpOworCQlwcl9lcnIoIkFMU0E6IHRpbWVyOiBjYW5ub3QgYWxsb2NhdGVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJdGltZXItPnRtcl9jbGFzcyA9IHRpZC0+ZGV2X2NsYXNzOwpAQCAtODEzLDcgKzgxNCw3IEBACiAJaWYgKCEgbGlzdF9lbXB0eSgmdGltZXItPm9wZW5fbGlzdF9oZWFkKSkgewogCQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKIAkJc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdGk7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ0aW1lciAlcCBpcyBidXN5P1xuIiwgdGltZXIpOworCQlwcl93YXJuKCJBTFNBOiB0aW1lciAlcCBpcyBidXN5P1xuIiwgdGltZXIpOwogCQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnRpbWVyLT5vcGVuX2xpc3RfaGVhZCkgewogCQkJbGlzdF9kZWxfaW5pdChwKTsKIAkJCXRpID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBvcGVuX2xpc3QpOwpAQCAtMTk1NSwxMiArMTk1NiwxMCBAQAogI2VuZGlmCiAKIAlpZiAoKGVyciA9IHNuZF90aW1lcl9yZWdpc3Rlcl9zeXN0ZW0oKSkgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgc3lzdGVtIHRpbWVyICglaSlcbiIsCi0JCQkgICBlcnIpOworCQlwcl9lcnIoIkFMU0E6IHVuYWJsZSB0byByZWdpc3RlciBzeXN0ZW0gdGltZXIgKCVpKVxuIiwgZXJyKTsKIAlpZiAoKGVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfVElNRVIsIE5VTEwsIDAsCiAJCQkJICAgICAgICZzbmRfdGltZXJfZl9vcHMsIE5VTEwsICJ0aW1lciIpKSA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZWdpc3RlciB0aW1lciBkZXZpY2UgKCVpKVxuIiwKLQkJCSAgIGVycik7CisJCXByX2VycigiQUxTQTogdW5hYmxlIHRvIHJlZ2lzdGVyIHRpbWVyIGRldmljZSAoJWkpXG4iLCBlcnIpOwogCXNuZF90aW1lcl9wcm9jX2luaXQoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvdm1hc3Rlci5jIGIvc291bmQvY29yZS92bWFzdGVyLmMKaW5kZXggODQyYTk3ZC4uNmM1OGU2ZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS92bWFzdGVyLmMKKysrIGIvc291bmQvY29yZS92bWFzdGVyLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCWlmIChzbGF2ZS0+aW5mby5jb3VudCA+IDIgIHx8CiAJICAgIChzbGF2ZS0+aW5mby50eXBlICE9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUiAmJgogCSAgICAgc2xhdmUtPmluZm8udHlwZSAhPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4pKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgc2xhdmUgZWxlbWVudFxuIik7CisJCXByX2VycigiQUxTQTogdm1hc3RlcjogaW52YWxpZCBzbGF2ZSBlbGVtZW50XG4iKTsKIAkJa2ZyZWUodWluZm8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL2Fsb29wLmMgYi9zb3VuZC9kcml2ZXJzL2Fsb29wLmMKaW5kZXggZjc1ODk5Mi4uMmExNmM4NiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9hbG9vcC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvYWxvb3AuYwpAQCAtMTE0Miw4ICsxMTQyLDggQEAKIAlpbnQgZGV2ID0gZGV2cHRyLT5pZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBsb29wYmFjayksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldnB0ci0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgbG9vcGJhY2spLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJbG9vcGJhY2sgPSBjYXJkLT5wcml2YXRlX2RhdGE7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL2R1bW15LmMgYi9zb3VuZC9kcml2ZXJzL2R1bW15LmMKaW5kZXggOTE1YjRkNy4uZmFiOTBiZCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9kdW1teS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvZHVtbXkuYwpAQCAtMTA1NCw4ICsxMDU0LDggQEAKIAlpbnQgaWR4LCBlcnI7CiAJaW50IGRldiA9IGRldnB0ci0+aWQ7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9kdW1teSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldnB0ci0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2R1bW15KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWR1bW15ID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwpAQCAtMTExNCw4ICsxMTE0LDYgQEAKIAogCWR1bW15X3Byb2NfaW5pdChkdW1teSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXZwdHItPmRldik7Ci0KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyID09IDApIHsKIAkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbWw0MDMtYWM5N2NyLmMgYi9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jCmluZGV4IDk1ZWE0YTEuLjMzZWQ3NjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvbWw0MDMtYWM5N2NyLmMKKysrIGIvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYwpAQCAtMTI4MCw3ICsxMjgwLDggQEAKIAlpZiAoIWVuYWJsZVtkZXZdKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGZkZXYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZXJyID0gc25kX21sNDAzX2FjOTdjcl9jcmVhdGUoY2FyZCwgcGZkZXYsICZtbDQwM19hYzk3Y3IpOwpAQCAtMTMxMCw4ICsxMzExLDYgQEAKIAkJKHVuc2lnbmVkIGxvbmcpbWw0MDNfYWM5N2NyLT5wb3J0LCBtbDQwM19hYzk3Y3ItPmlycSwKIAkJbWw0MDNfYWM5N2NyLT5jYXB0dXJlX2lycSwgZGV2ICsgMSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZmRldi0+ZGV2KTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDEuYyBiL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jCmluZGV4IDkwYTNhN2IuLjgzMDE0YjggMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jCkBAIC02NCw3ICs2NCw4IEBACiBzdGF0aWMgaW50IHBucF9yZWdpc3RlcmVkOwogc3RhdGljIHVuc2lnbmVkIGludCBzbmRfbXB1NDAxX2RldmljZXM7CiAKLXN0YXRpYyBpbnQgc25kX21wdTQwMV9jcmVhdGUoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqcmNhcmQpCitzdGF0aWMgaW50IHNuZF9tcHU0MDFfY3JlYXRlKHN0cnVjdCBkZXZpY2UgKmRldnB0ciwgaW50IGRldiwKKwkJCSAgICAgc3RydWN0IHNuZF9jYXJkICoqcmNhcmQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CkBAIC03Myw3ICs3NCw4IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInRoZSB1YXJ0X2VudGVyIG9wdGlvbiBpcyBvYnNvbGV0ZTsgcmVtb3ZlIGl0XG4iKTsKIAogCSpyY2FyZCA9IE5VTEw7Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KGRldnB0ciwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk1QVS00MDEgVUFSVCIpOwpAQCAtMTE0LDEwICsxMTYsOSBAQAogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzcGVjaWZ5IG9yIGRpc2FibGUgSVJRXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWVyciA9IHNuZF9tcHU0MDFfY3JlYXRlKGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9tcHU0MDFfY3JlYXRlKCZkZXZwdHItPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOwogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTk0LDE0ICsxOTUsMTMgQEAKIAkJZXJyID0gc25kX21wdTQwMV9wbnAoZGV2LCBwbnBfZGV2LCBpZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gc25kX21wdTQwMV9jcmVhdGUoZGV2LCAmY2FyZCk7CisJCWVyciA9IHNuZF9tcHU0MDFfY3JlYXRlKCZwbnBfZGV2LT5kZXYsIGRldiwgJmNhcmQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewogCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcG5wX2Rldi0+ZGV2KTsKIAkJcG5wX3NldF9kcnZkYXRhKHBucF9kZXYsIGNhcmQpOwogCQlzbmRfbXB1NDAxX2RldmljZXMrKzsKIAkJKytkZXY7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL210cGF2LmMgYi9zb3VuZC9kcml2ZXJzL210cGF2LmMKaW5kZXggZTVlYzdlYi4uNGI2NmM3ZiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tdHBhdi5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXRwYXYuYwpAQCAtNjk3LDcgKzY5Nyw4IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgbXRwYXYgKm10cF9jYXJkOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIHNpemVvZigqbXRwX2NhcmQpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXYtPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqbXRwX2NhcmQpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTczMiw3ICs3MzMsNiBAQAogCiAJc25kX210cGF2X3BvcnRzY2FuKG10cF9jYXJkKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+ZGV2KTsKIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihtdHBfY2FyZC0+Y2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gX19lcnJvcjsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXRzNjQuYyBiL3NvdW5kL2RyaXZlcnMvbXRzNjQuYwppbmRleCA0ZTBkZDIyLi5mNWZkNDQ4IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL210czY0LmMKKysrIGIvc291bmQvZHJpdmVycy9tdHM2NC5jCkBAIC05NTksNyArOTU5LDggQEAKIAlpZiAoKGVyciA9IHNuZF9tdHM2NF9wcm9iZV9wb3J0KHApKSA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBkZXYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX3ByaW50ZCgiQ2Fubm90IGNyZWF0ZSBjYXJkXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTEwMDksOCArMTAxMCw2IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7Ci0KIAkvKiBBdCB0aGlzIHBvaW50IGNhcmQgd2lsbCBiZSB1c2FibGUgKi8KIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX3ByaW50ZCgiQ2Fubm90IHJlZ2lzdGVyIGNhcmRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbGliLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYwppbmRleCAzM2Q5YTg1Li5mNjZhZjU4IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYwpAQCAtNTAxLDEwICs1MDEsOCBAQAogCWh3LT5wcml2YXRlX2RhdGEgPSBvcGwzOwogCWh3LT5leGNsdXNpdmUgPSAxOwogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTAotCWlmIChkZXZpY2UgPT0gMCkgeworCWlmIChkZXZpY2UgPT0gMCkKIAkJaHctPm9zc190eXBlID0gU05EUlZfT1NTX0RFVklDRV9UWVBFX0RNRk07Ci0JCXNwcmludGYoaHctPm9zc19kZXYsICJkbWZtJWkiLCBjYXJkLT5udW1iZXIpOwotCX0KICNlbmRpZgogCXN0cmNweShody0+bmFtZSwgaHctPmlkKTsKIAlzd2l0Y2ggKG9wbDMtPmhhcmR3YXJlICYgT1BMM19IV19NQVNLKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYwppbmRleCA3NDJhNGI2Li5kZGNjMWEzIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kX2ZtLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfU0VRVUVOQ0VSKQogI2RlZmluZSBPUEwzX1NVUFBPUlRfU1lOVEgKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3AuYwppbmRleCAzMjhiZDI5Li4zNjgwOGNkIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWhydGltZXJfaW5pdCgmcGNzcF9jaGlwLnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCXBjc3BfY2hpcC50aW1lci5mdW5jdGlvbiA9IHBjc3BfZG9fdGltZXI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTI3LDggKzEyNyw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihwY3NwX2NoaXAuY2FyZCwgZGV2KTsKLQogCXN0cmNweShjYXJkLT5kcml2ZXIsICJQQy1TcGVha2VyIik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgInBjc3AiKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiSW50ZXJuYWwgUEMtU3BlYWtlciBhdCBwb3J0IDB4JXgiLApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9wY3NwL3Bjc3BfaW5wdXQuYyBiL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX2lucHV0LmMKaW5kZXggYjg3NGIwYS4uMGVjZjhhNCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9wY3NwL3Bjc3BfaW5wdXQuYworKysgYi9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcF9pbnB1dC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJwY3NwLmgiCisjaW5jbHVkZSAicGNzcF9pbnB1dC5oIgogCiBzdGF0aWMgdm9pZCBwY3Nwa3JfZG9fc291bmQodW5zaWduZWQgaW50IGNvdW50KQogewpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMgYi9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYwppbmRleCA5OTEwMThkLi43OGNjZmE0IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYworKysgYi9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYwpAQCAtNzQ4LDcgKzc0OCw4IEBACiAJaWYgKChlcnIgPSBzbmRfcG9ydG1hbl9wcm9iZV9wb3J0KHApKSA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBkZXYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX3ByaW50ZCgiQ2Fubm90IGNyZWF0ZSBjYXJkXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTc5OCw4ICs3OTksNiBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwotCiAJLyogQXQgdGhpcyBwb2ludCBjYXJkIHdpbGwgYmUgdXNhYmxlICovCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCXNuZF9wcmludGQoIkNhbm5vdCByZWdpc3RlciBjYXJkXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvc2VyaWFsLXUxNjU1MC5jIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKaW5kZXggZTBiZjVlNy4uOWFkNDQxNCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKKysrIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKQEAgLTk0Miw3ICs5NDIsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllcnIgID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyICA9IHNuZF9jYXJkX25ldygmZGV2cHRyLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtOTY5LDggKzk3MCw2IEBACiAJCXVhcnQtPmJhc2UsCiAJCXVhcnQtPmlycSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXZwdHItPmRldik7Ci0KIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCiAJCWdvdG8gX2VycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92aXJtaWRpLmMgYi9zb3VuZC9kcml2ZXJzL3Zpcm1pZGkuYwppbmRleCBhY2UzODc5Li5iMTc4NzI0MjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdmlybWlkaS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvdmlybWlkaS5jCkBAIC05MCw4ICs5MCw4IEBACiAJaW50IGlkeCwgZXJyOwogCWludCBkZXYgPSBkZXZwdHItPmlkOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF92aXJtaWRpKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmZGV2cHRyLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF92aXJtaWRpKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCXZtaWRpID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwpAQCAtMTE4LDggKzExOCw2IEBACiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlZpck1JREkiKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiVmlydHVhbCBNSURJIENhcmQgJWkiLCBkZXYgKyAxKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldnB0ci0+ZGV2KTsKLQogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpID09IDApIHsKIAkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBjYXJkKTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9kaWNlLmMgYi9zb3VuZC9maXJld2lyZS9kaWNlLmMKaW5kZXggYzBhYTY0OS4uMGMzOTQ4NiAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvZGljZS5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2RpY2UuYwpAQCAtMTMyNiwxMCArMTMyNiwxMCBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xLCBOVUxMLCBUSElTX01PRFVMRSwgc2l6ZW9mKCpkaWNlKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmdW5pdC0+ZGV2aWNlLCAtMSwgTlVMTCwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YoKmRpY2UpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdW5pdC0+ZGV2aWNlKTsKIAogCWRpY2UgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJZGljZS0+Y2FyZCA9IGNhcmQ7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9pc2lnaHQuYyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCmluZGV4IGZkNDJlNmIuLjdhYzk0NDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCkBAIC02MzEsMTAgKzYzMSwxMCBAQAogCXN0cnVjdCBpc2lnaHQgKmlzaWdodDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKC0xLCBOVUxMLCBUSElTX01PRFVMRSwgc2l6ZW9mKCppc2lnaHQpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZ1bml0LT5kZXZpY2UsIC0xLCBOVUxMLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqaXNpZ2h0KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnVuaXQtPmRldmljZSk7CiAKIAlpc2lnaHQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJaXNpZ2h0LT5jYXJkID0gY2FyZDsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL3NjczF4LmMgYi9zb3VuZC9maXJld2lyZS9zY3MxeC5jCmluZGV4IDg1ODAyM2MuLjJkYmE4NDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL3NjczF4LmMKKysrIGIvc291bmQvZmlyZXdpcmUvc2NzMXguYwpAQCAtMzkxLDEwICszOTEsMTAgQEAKIAlzdHJ1Y3Qgc2NzICpzY3M7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZSgtMTYsIE5VTEwsIFRISVNfTU9EVUxFLCBzaXplb2YoKnNjcyksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnVuaXQtPmRldmljZSwgLTE2LCBOVUxMLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqc2NzKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnVuaXQtPmRldmljZSk7CiAKIAlzY3MgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJc2NzLT5jYXJkID0gY2FyZDsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL3NwZWFrZXJzLmMgYi9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jCmluZGV4IGNjOGJjM2EuLjlmN2VmMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL3NwZWFrZXJzLmMKKysrIGIvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYwpAQCAtNjY4LDEwICs2NjgsMTAgQEAKIAl1MzIgZmlybXdhcmU7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZSgtMSwgTlVMTCwgVEhJU19NT0RVTEUsIHNpemVvZigqZndzcGspLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZ1bml0LT5kZXZpY2UsIC0xLCBOVUxMLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqZndzcGspLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdW5pdC0+ZGV2aWNlKTsKIAogCWZ3c3BrID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWZ3c3BrLT5jYXJkID0gY2FyZDsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYwppbmRleCBlMDRlNzUwLi4xYTNhNmZhIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExMy5jCkBAIC05OCw3ICs5OCw3IEBACiAJCQlBSzQxMTNfQ0lOVCB8IEFLNDExM19TVEMpOwogCWNoaXAtPnJjczEgPSByZWdfcmVhZChjaGlwLCBBSzQxMTNfUkVHX1JDUzEpOwogCWNoaXAtPnJjczIgPSByZWdfcmVhZChjaGlwLCBBSzQxMTNfUkVHX1JDUzIpOwotCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcyk7CisJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0NPREVDLCBjaGlwLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBfX2ZhaWw7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYwppbmRleCAxNWFlMDI1Li5jN2Y1NjMzIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAljaGlwLT5yY3MwID0gcmVnX3JlYWQoY2hpcCwgQUs0MTE0X1JFR19SQ1MwKSAmIH4oQUs0MTE0X1FJTlQgfCBBSzQxMTRfQ0lOVCk7CiAJY2hpcC0+cmNzMSA9IHJlZ19yZWFkKGNoaXAsIEFLNDExNF9SRUdfUkNTMSk7CiAKLQlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkKKwlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9DT0RFQywgY2hpcCwgJm9wcykpIDwgMCkKIAkJZ290byBfX2ZhaWw7CiAKIAlpZiAocl9hazQxMTQpCmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKaW5kZXggNDBlMzNjOS4uODg0NTJlOCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExNy5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYwpAQCAtNjIsNyArNjIsNyBAQAogCiBzdGF0aWMgdm9pZCBzbmRfYWs0MTE3X2ZyZWUoc3RydWN0IGFrNDExNyAqY2hpcCkKIHsKLQlkZWxfdGltZXIoJmNoaXAtPnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2hpcC0+dGltZXIpOwogCWtmcmVlKGNoaXApOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKaW5kZXggMjZjZTI2YS4uZjQ4MWE0MSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCisrKyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYwpAQCAtMTQ0LDggKzE0NCw5IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCXN0cnVjdCBzbmRfdGltZXIgKnRpbWVyOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfYWQxODE2YSksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwKKwkJCSAgICAgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2FkMTgxNmEpLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0xNTQsNyArMTU1LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCWlmICgoZXJyb3IgPSBzbmRfYWQxODE2YV9jcmVhdGUoY2FyZCwgcG9ydFtkZXZdLAogCQkJCQlpcnFbZGV2XSwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMgYi9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OC5jCmluZGV4IGUzZjQ1NWJkLi4wOTNmMjJhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OC5jCisrKyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKQEAgLTkxLDcgKzkxLDcgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTExOSw4ICsxMTksNiBAQAogCWlmICh0aGlua3BhZFtuXSkKIAkJc3RyY2F0KGNhcmQtPmxvbmduYW1lLCAiIFtUaGlua3BhZF0iKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWRsaWIuYyBiL3NvdW5kL2lzYS9hZGxpYi5jCmluZGV4IDM1NjU5MjEuLjEyMGM1MjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9hZGxpYi5jCisrKyBiL3NvdW5kL2lzYS9hZGxpYi5jCkBAIC01Myw3ICs1Myw3IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGNyZWF0ZSBjYXJkXG4iKTsKIAkJcmV0dXJuIGVycm9yOwpAQCAtODMsOCArODMsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7Ci0KIAllcnJvciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnJvciA8IDApIHsKIAkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgY2FyZFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWxzMTAwLmMgYi9zb3VuZC9pc2EvYWxzMTAwLmMKaW5kZXggMTBmMDhhMS4uMzJkMDE1MiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FsczEwMC5jCisrKyBiL3NvdW5kL2lzYS9hbHMxMDAuYwpAQCAtMTkzLDggKzE5Myw5IEBACiAJc3RydWN0IHNuZF9jYXJkX2FsczEwMCAqYWNhcmQ7CiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9hbHMxMDApLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsCisJCQkgICAgIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FsczEwMCksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAJYWNhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0yMDMsNyArMjA0LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCWlmIChwaWQtPmRyaXZlcl9kYXRhID09IFNCX0hXX0RUMDE5WCkKIAkJZG1hMTZbZGV2XSA9IC0xOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2F6dDIzMjAuYyBiL3NvdW5kL2lzYS9henQyMzIwLmMKaW5kZXggZGIzMDFmZi4uMGVhNzVmYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2F6dDIzMjAuYworKysgYi9zb3VuZC9pc2EvYXp0MjMyMC5jCkBAIC0xODQsOCArMTg0LDkgQEAKIAlzdHJ1Y3Qgc25kX3dzcyAqY2hpcDsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2F6dDIzMjApLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsCisJCQkgICAgIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2F6dDIzMjApLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCWFjYXJkID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwpAQCAtMTk0LDcgKzE5NSw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAKIAlpZiAoKGVycm9yID0gc25kX2NhcmRfYXp0MjMyMF9lbmFibGVfd3NzKHBvcnRbZGV2XSkpKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY21pODMyOC5jIGIvc291bmQvaXNhL2NtaTgzMjguYwppbmRleCBhYjZiMmRjLi40Nzc4ODUyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY21pODMyOC5jCisrKyBiL3NvdW5kL2lzYS9jbWk4MzI4LmMKQEAgLTI5MywxNSArMjkzLDE0IEBACiAJfQogCW91dGIodmFsLCBwb3J0KTsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtuZGV2XSwgaWRbbmRldl0sIFRISVNfTU9EVUxFLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2NtaTgzMjgpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W25kZXZdLCBpZFtuZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jbWk4MzI4KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWNtaSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAljbWktPmNhcmQgPSBjYXJkOwogCWNtaS0+cG9ydCA9IHBvcnQ7CiAJY21pLT53c3NfY2ZnID0gdmFsOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAKIAllcnIgPSBzbmRfd3NzX2NyZWF0ZShjYXJkLCBwb3J0ICsgNCwgLTEsIGlycVtuZGV2XSwgZG1hMVtuZGV2XSwKIAkJCWRtYTJbbmRldl0sIFdTU19IV19ERVRFQ1QsIDAsICZjbWktPndzcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY21pODMzMC5jIGIvc291bmQvaXNhL2NtaTgzMzAuYwppbmRleCAyNzBiOTY1Li5kZmVkZmQ4IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY21pODMzMC5jCisrKyBiL3NvdW5kL2lzYS9jbWk4MzMwLmMKQEAgLTUxNCwxNCArNTE0LDE1IEBACiAKICNkZWZpbmUgUEZYCSJjbWk4MzMwOiAiCiAKLXN0YXRpYyBpbnQgc25kX2NtaTgzMzBfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9jbWk4MzMwX2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBkZXYsIGludCBkZXYsCisJCQkJc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfY21pODMzMCAqYWNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NtaTgzMzApLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfY21pODMzMCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGQgbm90IGdldCBhIG5ldyBjYXJkXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTYzNSwxMCArNjM2LDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jbWk4MzMwX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9jbWk4MzMwX2NhcmRfbmV3KHBkZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJaWYgKChlcnIgPSBzbmRfY21pODMzMF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTY5OCw3ICs2OTgsNyBAQAogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCQkJICAgICAgIAotCXJlcyA9IHNuZF9jbWk4MzMwX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCXJlcyA9IHNuZF9jbWk4MzMwX2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAocmVzIDwgMCkKIAkJcmV0dXJuIHJlczsKIAlpZiAoKHJlcyA9IHNuZF9jbWk4MzMwX3BucChkZXYsIGNhcmQtPnByaXZhdGVfZGF0YSwgcGNhcmQsIHBpZCkpIDwgMCkgewpAQCAtNzA2LDcgKzcwNiw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgocmVzID0gc25kX2NtaTgzMzBfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYwppbmRleCBiYTlhNzRlLi43ZGJhMDdhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jCisrKyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTEzNSw4ICsxMzUsNiBAQAogCQkJZGV2X3dhcm4oZGV2LCAiTVBVNDAxIG5vdCBkZXRlY3RlZFxuIik7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXYpOwotCiAJZXJyb3IgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCmluZGV4IDY5NjE0YWMuLjc1MGY1MWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKKysrIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYwpAQCAtMzY0LDEzICszNjQsMTQgQEAKIAlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGFjYXJkLT5yZXNfc2JfcG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2NzNDIzeF9jYXJkX25ldyhpbnQgZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgc25kX2NzNDIzeF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBpbnQgZGV2LAorCQkJICAgICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9jczQyMzYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9jczQyMzYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2NhcmRfY3M0MjM2X2ZyZWU7CkBAIC00ODcsMTAgKzQ4OCw5IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY3M0MjN4X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9jczQyM3hfY2FyZF9uZXcocGRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9jczQyM3hfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC01NzcsNyArNTc3LDcgQEAKIAkJaWYgKCFzdHJjbXAoY2Rldi0+aWRbMF0uaWQsIGNpZCkpCiAJCQlicmVhazsKIAl9Ci0JZXJyID0gc25kX2NzNDIzeF9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfY3M0MjN4X2NhcmRfbmV3KCZwZGV2LT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IHNuZF9jYXJkX2NzNDIzeF9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBkZXYsIGNkZXYpOwpAQCAtNTg2LDcgKzU4Niw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CiAJaWYgKChlcnIgPSBzbmRfY3M0MjN4X3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjM4LDcgKzYzNyw3IEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXMgPSBzbmRfY3M0MjN4X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCXJlcyA9IHNuZF9jczQyM3hfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCWlmICgocmVzID0gc25kX2NhcmRfY3M0MjN4X3BucGMoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBjYXJkLCBwaWQpKSA8IDApIHsKQEAgLTY0Nyw3ICs2NDYsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gcmVzOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAlpZiAoKHJlcyA9IHNuZF9jczQyM3hfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jIGIvc291bmQvaXNhL2VzMTY4OC9lczE2ODguYwppbmRleCBjZGNmYjU3Li43NjAwMWZlMCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2VzMTY4OC9lczE2ODguYworKysgYi9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCkBAIC0xODcsOCArMTg3LDggQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9lczE2ODgpLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoZGV2LCBpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHNuZF9lczE2ODgpLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xOTYsOCArMTk2LDYgQEAKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKLQogCWVycm9yID0gc25kX2VzMTY4OF9wcm9iZShjYXJkLCBuKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKQEAgLTI3NCw4ICsyNzIsOSBAQAogCWlmIChkZXYgPT0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfZXMxNjg4KSwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LAorCQkJICAgICBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZXMxNjg4KSwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIAljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwpAQCAtMjg1LDcgKzI4NCw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAJZXJyb3IgPSBzbmRfZXMxNjg4X3Byb2JlKGNhcmQsIGRldik7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2VzMTh4eC5jIGIvc291bmQvaXNhL2VzMTh4eC5jCmluZGV4IDEyOTc4YjguLjFjMTY4MzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9lczE4eHguYworKysgYi9zb3VuZC9pc2EvZXMxOHh4LmMKQEAgLTIxMDUsMTAgKzIxMDUsMTEgQEAKICNkZWZpbmUgaXNfaXNhcG5wX3NlbGVjdGVkKGRldikJCTAKICNlbmRpZgogCi1zdGF0aWMgaW50IHNuZF9lczE4eHhfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9lczE4eHhfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKLQlyZXR1cm4gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2VzMTh4eCksIGNhcmRwKTsKKwlyZXR1cm4gc25kX2NhcmRfbmV3KHBkZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc25kX2VzMTh4eCksIGNhcmRwKTsKIH0KIAogc3RhdGljIGludCBzbmRfYXVkaW9kcml2ZV9wcm9iZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYpCkBAIC0yMTc5LDEwICsyMTgwLDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9lczE4eHhfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX2VzMTh4eF9jYXJkX25ldyhkZXZwdHIsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKIAlpZiAoKGVyciA9IHNuZF9hdWRpb2RyaXZlX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtMjI4NCwxNCArMjI4NCwxMyBAQAogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZXJyID0gc25kX2VzMTh4eF9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfZXMxOHh4X2NhcmRfbmV3KCZwZGV2LT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmICgoZXJyID0gc25kX2F1ZGlvZHJpdmVfcG5wKGRldiwgY2FyZC0+cHJpdmF0ZV9kYXRhLCBwZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CiAJaWYgKChlcnIgPSBzbmRfYXVkaW9kcml2ZV9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTIzNDIsNyArMjM0MSw3IEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXMgPSBzbmRfZXMxOHh4X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCXJlcyA9IHNuZF9lczE4eHhfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC0yMzUwLDcgKzIzNDksNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gcmVzOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAlpZiAoKHJlcyA9IHNuZF9hdWRpb2RyaXZlX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2dhbGF4eS9nYWxheHkuYyBiL3NvdW5kL2lzYS9nYWxheHkvZ2FsYXh5LmMKaW5kZXggODEyNDRlNy4uMWViMmIxZSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2dhbGF4eS9nYWxheHkuYworKysgYi9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jCkBAIC01MDYsMTMgKzUwNiwxMSBAQAogCXU4IHR5cGU7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLCBzaXplb2YgKmdhbGF4eSwKLQkJCSAgICAgICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoZGV2LCBpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKCpnYWxheHkpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7Ci0KIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfZ2FsYXh5X2ZyZWU7CiAJZ2FsYXh5ID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c2NsYXNzaWMuYyBiL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCmluZGV4IDFhZGMxYjkuLjdjZTI5ZmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAlzdHJ1Y3Qgc25kX2d1c19jYXJkICpndXM7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVycm9yID0gc25kX2NhcmRfbmV3KGRldiwgaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMTk5LDggKzE5OSw2IEBACiAJCXNwcmludGYoY2FyZC0+bG9uZ25hbWUgKyBzdHJsZW4oY2FyZC0+bG9uZ25hbWUpLAogCQkJIiYlZCIsIGd1cy0+Z2YxLmRtYTIpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXYpOwotCiAJZXJyb3IgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzZXh0cmVtZS5jIGIvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMKaW5kZXggMzhlMWUzMi4uMjhhMTY5MyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMKQEAgLTI0Miw4ICsyNDIsOCBAQAogCXN0cnVjdCBzbmRfb3BsMyAqb3BsMzsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtuXSwgaWRbbl0sIFRISVNfTU9EVUxFLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2VzMTY4OCksICZjYXJkKTsKKwllcnJvciA9IHNuZF9jYXJkX25ldyhkZXYsIGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2VzMTY4OCksICZjYXJkKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTMyOCw4ICszMjgsNiBAQAogCQkiaXJxICVpJiVpLCBkbWEgJWkmJWkiLCBlczE2ODgtPnBvcnQsCiAJCWd1cy0+Z2YxLmlycSwgZXMxNjg4LT5pcnEsIGd1cy0+Z2YxLmRtYTEsIGVzMTY4OC0+ZG1hOCk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7Ci0KIAllcnJvciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNtYXguYyBiL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMKaW5kZXggNjUyZDVkOC4uMzlkZjM2YyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNtYXguYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c21heC5jCkBAIC0yMTQsOCArMjE0LDggQEAKIAlzdHJ1Y3Qgc25kX3dzcyAqd3NzOwogCXN0cnVjdCBzbmRfZ3VzbWF4ICptYXhjYXJkOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZ3VzbWF4KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2d1c21heCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfZ3VzbWF4X2ZyZWU7CkBAIC0zMzcsOCArMzM3LDYgQEAKIAlpZiAoeGRtYTIgPj0gMCkKIAkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSArIHN0cmxlbihjYXJkLT5sb25nbmFtZSksICImJWkiLCB4ZG1hMik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwotCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gX2VycjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMgYi9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCmluZGV4IGFmZWYwZDcuLjVhYmJiZTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKKysrIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwpAQCAtNjI1LDE0ICs2MjUsMTUgQEAKIAkJZnJlZV9pcnEoaXdjYXJkLT5pcnEsICh2b2lkICopaXdjYXJkKTsKIH0KIAotc3RhdGljIGludCBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KGludCBkZXYsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQorc3RhdGljIGludCBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBkZXYsIGludCBkZXYsCisJCQkJICBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9pbnRlcndhdmUgKml3Y2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfaW50ZXJ3YXZlKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2ludGVyd2F2ZSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpd2NhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC03NzksMTEgKzc4MCwxMCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2ludGVyd2F2ZV9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwllcnIgPSBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KGRldnB0ciwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldnB0cik7CiAJaWYgKChlcnIgPSBzbmRfaW50ZXJ3YXZlX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtODc2LDcgKzg3Niw3IEBACiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJCQkJCi0JcmVzID0gc25kX2ludGVyd2F2ZV9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwlyZXMgPSBzbmRfaW50ZXJ3YXZlX2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAocmVzIDwgMCkKIAkJcmV0dXJuIHJlczsKIApAQCAtODg0LDcgKzg4NCw2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiByZXM7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWlmICgocmVzID0gc25kX2ludGVyd2F2ZV9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGUuYyBiL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGUuYwppbmRleCAwYTkwYmQ2Li41MDE2YmY5IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMKKysrIGIvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jCkBAIC05MDUsMTIgKzkwNSwxMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbaWR4XSwgaWRbaWR4XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9tc25kKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX21zbmQpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJY2hpcC0+Y2FyZCA9IGNhcmQ7CiAKQEAgLTExMjIsMTQgKzExMjEsMTQgQEAKIAkgKiBDcmVhdGUgYSBuZXcgQUxTQSBzb3VuZCBjYXJkIGVudHJ5LCBpbiBhbnRpY2lwYXRpb24KIAkgKiBvZiBkZXRlY3Rpbmcgb3VyIGhhcmR3YXJlIC4uLgogCSAqLwotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX21zbmQpLCAmY2FyZCk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LAorCQkJICAgaW5kZXhbaWR4XSwgaWRbaWR4XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9tc25kKSwgJmNhcmQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAljaGlwLT5jYXJkID0gY2FyZDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCS8qCiAJICogUmVhZCB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIG9mZiB0aGUgSVNBIFBuUCBidXMgLi4uCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evb3BsM3NhMi5jIGIvc291bmQvaXNhL29wbDNzYTIuYwppbmRleCBjYzAxYzQxLi5hMjE5YmMzIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evb3BsM3NhMi5jCisrKyBiL3NvdW5kL2lzYS9vcGwzc2EyLmMKQEAgLTYyNywxNCArNjI3LDE1IEBACiAJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShjaGlwLT5yZXNfcG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgc25kX29wbDNzYTJfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF9vcGwzc2EyX2NhcmRfbmV3KHN0cnVjdCBkZXZpY2UgKnBkZXYsIGludCBkZXYsCisJCQkJc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfb3BsM3NhMiAqY2hpcDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfb3BsM3NhMiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9vcGwzc2EyKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCXN0cmNweShjYXJkLT5kcml2ZXIsICJPUEwzU0EyIik7CkBAIC03MzcsMTQgKzczOCwxMyBAQAogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX29wbDNzYTJfY2FyZF9uZXcoJnBkZXYtPmRldiwgZGV2LCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBzbmRfb3BsM3NhMl9wbnAoZGV2LCBjYXJkLT5wcml2YXRlX2RhdGEsIHBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtODAyLDE0ICs4MDIsMTMgQEAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWVyciA9IHNuZF9vcGwzc2EyX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9vcGwzc2EyX2NhcmRfbmV3KCZwZGV2LT5kZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmICgoZXJyID0gc25kX29wbDNzYTJfcG5wKGRldiwgY2FyZC0+cHJpdmF0ZV9kYXRhLCBwZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CiAJaWYgKChlcnIgPSBzbmRfb3BsM3NhMl9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTg4MywxMCArODgyLDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9vcGwzc2EyX2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9vcGwzc2EyX2NhcmRfbmV3KHBkZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJaWYgKChlcnIgPSBzbmRfb3BsM3NhMl9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYyBiL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYwppbmRleCA2MTk3NTNkLi5jMmNhNjgxIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCkBAIC0xNDExLDggKzE0MTEsOCBAQAogCXN0cnVjdCBzbmRfbWlybyAqbWlybzsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAKLQllcnJvciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX21pcm8pLCAmY2FyZCk7CisJZXJyb3IgPSBzbmRfY2FyZF9uZXcoZGV2cHRyLCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHNuZF9taXJvKSwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMTQ3OSw4ICsxNDc5LDYgQEAKIAkJfQogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKLQogCWVycm9yID0gc25kX21pcm9fcHJvYmUoY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpAQCAtMTU4NCw4ICsxNTgyLDggQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAlpZiAoIWlzYXBucCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbWlybyksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9taXJvKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xNjEyLDcgKzE2MTAsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCWVyciA9IHNuZF9taXJvX3Byb2JlKGNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jIGIvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYwppbmRleCA2ZWZmZTk5Li5jOWI1ODI4IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCisrKyBiL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKQEAgLTkzNCwxMyArOTM0LDEzIEBACiAJcmV0dXJuIHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogfQogCi1zdGF0aWMgaW50IHNuZF9vcHRpOXh4X2NhcmRfbmV3KHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQorc3RhdGljIGludCBzbmRfb3B0aTl4eF9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfb3B0aTl4eCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX29wdGk5eHgpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2NhcmRfb3B0aTl4eF9mcmVlOwpAQCAtMTAxMCw3ICsxMDEwLDcgQEAKIAl9CiAjZW5kaWYKIAotCWVycm9yID0gc25kX29wdGk5eHhfY2FyZF9uZXcoJmNhcmQpOworCWVycm9yID0gc25kX29wdGk5eHhfY2FyZF9uZXcoZGV2cHRyLCAmY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xMDE4LDcgKzEwMTgsNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKIAlpZiAoKGVycm9yID0gc25kX29wdGk5eHhfcHJvYmUoY2FyZCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC0xMTAwLDcgKzEwOTksNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCWlmICghIGlzYXBucCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZXJyb3IgPSBzbmRfb3B0aTl4eF9jYXJkX25ldygmY2FyZCk7CisJZXJyb3IgPSBzbmRfb3B0aTl4eF9jYXJkX25ldygmcGNhcmQtPmNhcmQtPmRldiwgJmNhcmQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIAljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwpAQCAtMTEzMSw3ICsxMTMwLDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAlpZiAoKGVycm9yID0gc25kX29wdGk5eHhfcHJvYmUoY2FyZCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2IvamF6ejE2LmMgYi9zb3VuZC9pc2Evc2IvamF6ejE2LmMKaW5kZXggMzU2YTYzMC4uOTBkMmViYSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL2phenoxNi5jCisrKyBiL3NvdW5kL2lzYS9zYi9qYXp6MTYuYwpAQCAtMjI5LDggKzIyOSw4IEBACiAJc3RhdGljIGludCBwb3NzaWJsZV9kbWFzMTZbXSA9IHs1LCA3LCAtMX07CiAJaW50IGVyciwgeGlycSwgeGRtYTgsIHhkbWExNiwgeG1wdV9wb3J0LCB4bXB1X2lycTsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfamF6ejE2KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhkZXZwdHIsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9qYXp6MTYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTMyNyw4ICszMjcsNiBAQAogCQkJCQltcHVfcG9ydFtkZXZdKTsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldnB0cik7Ci0KIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfZnJlZTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2LmMgYi9zb3VuZC9pc2Evc2Ivc2IxNi5jCmluZGV4IGE0MTMwOTkuLjNmNjk0NTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjE2LmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTYuYwpAQCAtMzIzLDEzICszMjMsMTQgQEAKICNkZWZpbmUgaXNfaXNhcG5wX3NlbGVjdGVkKGRldikJCTAKICNlbmRpZgogCi1zdGF0aWMgaW50IHNuZF9zYjE2X2NhcmRfbmV3KGludCBkZXYsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQorc3RhdGljIGludCBzbmRfc2IxNl9jYXJkX25ldyhzdHJ1Y3QgZGV2aWNlICpkZXZwdHIsIGludCBkZXYsCisJCQkgICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9zYjE2KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhkZXZwdHIsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9zYjE2KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9zYjE2X2ZyZWU7CkBAIC00OTMsNyArNDk0LDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9zYjE2X2NhcmRfbmV3KGRldiwgJmNhcmQpOworCWVyciA9IHNuZF9zYjE2X2NhcmRfbmV3KHBkZXYsIGRldiwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC01MDcsNyArNTA4LDYgQEAKIAlhd2VfcG9ydFtkZXZdID0gcG9ydFtkZXZdICsgMHg0MDA7CiAjZW5kaWYKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJaWYgKChlcnIgPSBzbmRfc2IxNl9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTYxMywxMCArNjEzLDkgQEAKIAlmb3IgKCA7IGRldiA8IFNORFJWX0NBUkRTOyBkZXYrKykgewogCQlpZiAoIWVuYWJsZVtkZXZdIHx8ICFpc2FwbnBbZGV2XSkKIAkJCWNvbnRpbnVlOwotCQlyZXMgPSBzbmRfc2IxNl9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwkJcmVzID0gc25kX3NiMTZfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsIGRldiwgJmNhcmQpOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiByZXM7Ci0JCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjYXJkLT5jYXJkLT5kZXYpOwogCQlpZiAoKHJlcyA9IHNuZF9jYXJkX3NiMTZfcG5wKGRldiwgY2FyZC0+cHJpdmF0ZV9kYXRhLCBwY2FyZCwgcGlkKSkgPCAwIHx8CiAJCSAgICAocmVzID0gc25kX3NiMTZfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiOC5jIGIvc291bmQvaXNhL3NiL3NiOC5jCmluZGV4IGE4MDZhZTkuLjZjMzJiM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjguYworKysgYi9zb3VuZC9pc2Evc2Ivc2I4LmMKQEAgLTEwMiw4ICsxMDIsOCBAQAogCXN0cnVjdCBzbmRfb3BsMyAqb3BsMzsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfc2I4KSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhwZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX3NiOCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlhY2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTE5Miw4ICsxOTIsNiBAQAogCQljaGlwLT5wb3J0LAogCQlpcnFbZGV2XSwgZG1hOFtkZXZdKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7Ci0KIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCiAJCWdvdG8gX2VycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NjNjAwMC5jIGIvc291bmQvaXNhL3NjNjAwMC5jCmluZGV4IDA5ZDQ4MWIuLjE1YTE1MmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYzYwMDAuYworKysgYi9zb3VuZC9pc2Evc2M2MDAwLmMKQEAgLTU1OSw4ICs1NTksOCBAQAogCWNoYXIgX19pb21lbSAqdm1zc19wb3J0OwogCiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIHNpemVvZih2cG9ydCksCi0JCQkJJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldyhkZXZwdHIsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHZwb3J0KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC02NjgsOCArNjY4LDYgQEAKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiR2FsbGFudCBTQy02MDAwIGF0IDB4JWx4LCBpcnEgJWQsIGRtYSAlZCIsCiAJCW1zc19wb3J0W2Rldl0sIHhpcnEsIHhkbWEpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwotCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyX3VubWFwMjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zc2NhcGUuYyBiL3NvdW5kL2lzYS9zc2NhcGUuYwppbmRleCA1N2IzMzg5Li40NDQwNWRmIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc3NjYXBlLmMKKysrIGIvc291bmQvaXNhL3NzY2FwZS5jCkBAIC0xMTY5LDggKzExNjksOCBAQAogCXN0cnVjdCBzb3VuZHNjYXBlICpzc2NhcGU7CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRzY2FwZSksICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNvdW5kc2NhcGUpLCAmY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTExNzgsNyArMTE3OCw2IEBACiAJc3NjYXBlLT50eXBlID0gU1NDQVBFOwogCiAJZG1hW2Rldl0gJj0gMHgwMzsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwogCiAJcmV0ID0gY3JlYXRlX3NzY2FwZShkZXYsIGNhcmQpOwogCWlmIChyZXQgPCAwKQpAQCAtMTI1OSw4ICsxMjU4LDkgQEAKIAkgKiBDcmVhdGUgYSBuZXcgQUxTQSBzb3VuZCBjYXJkIGVudHJ5LCBpbiBhbnRpY2lwYXRpb24KIAkgKiBvZiBkZXRlY3Rpbmcgb3VyIGhhcmR3YXJlIC4uLgogCSAqLwotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRzY2FwZSksICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJnBjYXJkLT5jYXJkLT5kZXYsCisJCQkgICBpbmRleFtpZHhdLCBpZFtpZHhdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc291bmRzY2FwZSksICZjYXJkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTI4OCw3ICsxMjg4LDYgQEAKIAkJd3NzX3BvcnRbaWR4XSA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMSk7CiAJCWRtYTJbaWR4XSA9IHBucF9kbWEoZGV2LCAxKTsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNhcmQtPmNhcmQtPmRldik7CiAKIAlyZXQgPSBjcmVhdGVfc3NjYXBlKGlkeCwgY2FyZCk7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwppbmRleCA4MmRkNzY5Li5iZmJmMzhjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKQEAgLTMzNCwxNCArMzM0LDE1IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHNuZF93YXZlZnJvbnRfY2FyZF9uZXcoaW50IGRldiwgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCitzdGF0aWMgaW50IHNuZF93YXZlZnJvbnRfY2FyZF9uZXcoc3RydWN0IGRldmljZSAqcGRldiwgaW50IGRldiwKKwkJCQkgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzbmRfd2F2ZWZyb250X2NhcmRfdCAqYWNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzbmRfd2F2ZWZyb250X2NhcmRfdCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcocGRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc25kX3dhdmVmcm9udF9jYXJkX3QpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTU2NCwxMCArNTY1LDkgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF93YXZlZnJvbnRfY2FyZF9uZXcoZGV2LCAmY2FyZCk7CisJZXJyID0gc25kX3dhdmVmcm9udF9jYXJkX25ldyhwZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwogCWlmICgoZXJyID0gc25kX3dhdmVmcm9udF9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTYxMiw3ICs2MTIsNyBAQAogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmVzID0gc25kX3dhdmVmcm9udF9jYXJkX25ldyhkZXYsICZjYXJkKTsKKwlyZXMgPSBzbmRfd2F2ZWZyb250X2NhcmRfbmV3KCZwY2FyZC0+Y2FyZC0+ZGV2LCBkZXYsICZjYXJkKTsKIAlpZiAocmVzIDwgMCkKIAkJcmV0dXJuIHJlczsKIApAQCAtNjIzLDcgKzYyMyw2IEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2FyZC0+Y2FyZC0+ZGV2KTsKIAogCWlmICgocmVzID0gc25kX3dhdmVmcm9udF9wcm9iZShjYXJkLCBkZXYpKSA8IDApCiAJCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9zb3VuZC9taXBzL2F1MXgwMC5jIGIvc291bmQvbWlwcy9hdTF4MDAuYwppbmRleCAyMjRmNTRiLi5hN2NjNDllIDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL2F1MXgwMC5jCisrKyBiL3NvdW5kL21pcHMvYXUxeDAwLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTk4LDYgKzk5LDcgQEAKIAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJc3RydWN0IGF1ZGlvX3N0cmVhbSAqc3RyZWFtWzJdOwkvKiBwbGF5YmFjayAmIGNhcHR1cmUgKi8KKwlpbnQgZG1haWRbMl07CQkvKiB0eCgwKS9yeCgxKSBETUEgaWRzICovCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2NhbCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNDY1LDE1ICs0NjcsMTcgQEAKIAlzcGluX2xvY2tfaW5pdCgmYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYV9sb2NrKTsKIAogCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQlpZiAoKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gcmVxdWVzdF9hdTEwMDBfZG1hKERNQV9JRF9BQzk3Q19UWCwKKwlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSA9IHJlcXVlc3RfYXUxMDAwX2RtYShhdTEwMDAtPmRtYWlkWzBdLAogCQkJIkFDOTcgVFgiLCBhdTEwMDBfZG1hX2ludGVycnVwdCwgMCwKLQkJCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXSkpIDwgMCkgeworCQkJYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKTsKKwlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEgPCAwKSB7CiAJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KLQlpZiAoKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPSByZXF1ZXN0X2F1MTAwMF9kbWEoRE1BX0lEX0FDOTdDX1JYLAorCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPSByZXF1ZXN0X2F1MTAwMF9kbWEoYXUxMDAwLT5kbWFpZFsxXSwKIAkJCSJBQzk3IFJYIiwgYXUxMDAwX2RtYV9pbnRlcnJ1cHQsIDAsCi0JCQlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSkpIDwgMCl7CisJCQlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSk7CisJaWYgKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPCAwKXsKIAkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtNTUyLDI3ICs1NTYsMTExIEBACiAJc3Bpbl91bmxvY2soJmF1MTAwMC0+YWM5N19sb2NrKTsKIH0KIAotc3RhdGljIGludAotc25kX2F1MTAwMF9hYzk3X25ldyhzdHJ1Y3Qgc25kX2F1MTAwMCAqYXUxMDAwKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dXAgLyBEZXN0cm95IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzbmRfYXUxMDAwX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBzbmRfYXUxMDAwICphdTEwMDAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKSB7CisJICAJaWYgKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID49IDApCisJCQlmcmVlX2F1MTAwMF9kbWEoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdLT5kbWEpOworCQlrZnJlZShhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pOworCX0KKworCWlmIChhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSkgeworCQlpZiAoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA+PSAwKQorCQkJZnJlZV9hdTEwMDBfZG1hKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEpOworCQlrZnJlZShhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSk7CisJfQorCisJaWYgKGF1MTAwMC0+YWM5N19yZXNfcG9ydCkgeworCQkvKiBwdXQgaW50ZXJuYWwgQUM5NyBibG9jayBpbnRvIHJlc2V0ICovCisJCWlmIChhdTEwMDAtPmFjOTdfaW9wb3J0KSB7CisJCQlhdTEwMDAtPmFjOTdfaW9wb3J0LT5jbnRybCA9IEFDOTdDX1JTOworCQkJaW91bm1hcChhdTEwMDAtPmFjOTdfaW9wb3J0KTsKKwkJCWF1MTAwMC0+YWM5N19pb3BvcnQgPSBOVUxMOworCQl9CisJCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoYXUxMDAwLT5hYzk3X3Jlc19wb3J0KTsKKwkJYXUxMDAwLT5hYzk3X3Jlc19wb3J0ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBvcHMgPSB7CisJLndyaXRlCT0gc25kX2F1MTAwMF9hYzk3X3dyaXRlLAorCS5yZWFkCT0gc25kX2F1MTAwMF9hYzk3X3JlYWQsCit9OworCitzdGF0aWMgaW50IGF1MTAwMF9hYzk3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IGVycjsKKwl2b2lkIF9faW9tZW0gKmlvOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9hdTEwMDAgKmF1MTAwMDsKIAlzdHJ1Y3Qgc25kX2FjOTdfYnVzICpwYnVzOwogCXN0cnVjdCBzbmRfYWM5N190ZW1wbGF0ZSBhYzk3OwotIAlzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgb3BzID0gewotCQkud3JpdGUgPSBzbmRfYXUxMDAwX2FjOTdfd3JpdGUsCi0JCS5yZWFkID0gc25kX2F1MTAwMF9hYzk3X3JlYWQsCi0JfTsKIAotCWlmICgoYXUxMDAwLT5hYzk3X3Jlc19wb3J0ID0gcmVxdWVzdF9tZW1fcmVnaW9uKENQSFlTQUREUihBQzk3Q19DT05GSUcpLAotCSAgICAgICAJCTB4MTAwMDAwLCAiQXUxeDAwIEFDOTciKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBTFNBIEFDOTc6IGNhbid0IGdyYXAgQUM5NyBwb3J0XG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JYXUxMDAwLT5hYzk3X2lvcG9ydCA9IChzdHJ1Y3QgYXUxMDAwX2FjOTdfcmVnICopCi0JCUtTRUcxQUREUihhdTEwMDAtPmFjOTdfcmVzX3BvcnQtPnN0YXJ0KTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBkZXYtPmRldiwgLTEsICJBQzk3IiwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9hdTEwMDApLCAmY2FyZCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKKwlhdTEwMDAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisJYXUxMDAwLT5jYXJkID0gY2FyZDsKIAlzcGluX2xvY2tfaW5pdCgmYXUxMDAwLT5hYzk3X2xvY2spOwogCisJLyogZnJvbSBoZXJlIG9uIGxldCBBTFNBIGNhbGwgdGhlIHNwZWNpYWwgZnJlZWluZyBmdW5jdGlvbiAqLworCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9hdTEwMDBfZnJlZTsKKworCS8qIFRYIERNQSBJRCAqLworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOworCWlmICghcikgeworCQllcnIgPSAtRU5PREVWOworCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAibm8gVFggRE1BIHBsYXRmb3JtIHJlc291cmNlIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlhdTEwMDAtPmRtYWlkWzBdID0gci0+c3RhcnQ7CisKKwkvKiBSWCBETUEgSUQgKi8KKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwlpZiAoIXIpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJc25kX3ByaW50ayhLRVJOX0lORk8gIm5vIFJYIERNQSBwbGF0Zm9ybSByZXNvdXJjZSFcbiIpOworCQlnb3RvIG91dDsKKwl9CisJYXUxMDAwLT5kbWFpZFsxXSA9IHItPnN0YXJ0OworCisJYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX3N0cmVhbSksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKQorCQlnb3RvIG91dDsKKwlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSA9IC0xOworCisJYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fc3RyZWFtKSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIWF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdKQorCQlnb3RvIG91dDsKKwlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXS0+ZG1hID0gLTE7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXIpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVCVVNZOworCWF1MTAwMC0+YWM5N19yZXNfcG9ydCA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwKKwkJCQkJci0+ZW5kIC0gci0+c3RhcnQgKyAxLCBwZGV2LT5uYW1lKTsKKwlpZiAoIWF1MTAwMC0+YWM5N19yZXNfcG9ydCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBTFNBIEFDOTc6IGNhbid0IGdyYWIgQUM5NyBwb3J0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaW8gPSBpb3JlbWFwKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOworCWlmICghaW8pCisJCWdvdG8gb3V0OworCisJYXUxMDAwLT5hYzk3X2lvcG9ydCA9IChzdHJ1Y3QgYXUxMDAwX2FjOTdfcmVnICopaW87CisKIAkvKiBjb25maWd1cmUgcGlucyBmb3IgQUMnOTcKIAlUT0RPOiBtb3ZlIHRvIGJvYXJkX3NldHVwLmMgKi8KIAlhdV93cml0ZWwoYXVfcmVhZGwoU1lTX1BJTkZVTkMpICYgfjB4MDIsIFNZU19QSU5GVU5DKTsKQEAgLTU5MCwxMDcgKzY3OCw2MiBAQAogCW1kZWxheSg1KTsKIAogCS8qIEluaXRpYWxpc2UgQUM5NyBtaWRkbGUtbGF5ZXIgKi8KLQlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhhdTEwMDAtPmNhcmQsIDAsICZvcHMsIGF1MTAwMCwgJnBidXMpKSA8IDApCi0gCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9hYzk3X2J1cyhhdTEwMDAtPmNhcmQsIDAsICZvcHMsIGF1MTAwMCwgJnBidXMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKIAogCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKIAlhYzk3LnByaXZhdGVfZGF0YSA9IGF1MTAwMDsKLQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmYXUxMDAwLT5hYzk3KSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNldHVwIC8gRGVzdHJveSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZAotc25kX2F1MTAwMF9mcmVlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3Qgc25kX2F1MTAwMCAqYXUxMDAwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGF1MTAwMC0+YWM5N19yZXNfcG9ydCkgewotCQkvKiBwdXQgaW50ZXJuYWwgQUM5NyBibG9jayBpbnRvIHJlc2V0ICovCi0JCWF1MTAwMC0+YWM5N19pb3BvcnQtPmNudHJsID0gQUM5N0NfUlM7Ci0JCWF1MTAwMC0+YWM5N19pb3BvcnQgPSBOVUxMOwotCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGF1MTAwMC0+YWM5N19yZXNfcG9ydCk7Ci0JfQotCi0JaWYgKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXSkgewotCSAgCWlmIChhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSA+PSAwKQotCQkJZnJlZV9hdTEwMDBfZG1hKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hKTsKLQkJa2ZyZWUoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKTsKLQl9Ci0KLQlpZiAoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0pIHsKLQkJaWYgKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPj0gMCkKLQkJCWZyZWVfYXUxMDAwX2RtYShhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXS0+ZG1hKTsKLQkJa2ZyZWUoYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0pOwotCX0KLX0KLQotCi1zdGF0aWMgc3RydWN0IHNuZF9jYXJkICphdTEwMDBfY2FyZDsKLQotc3RhdGljIGludCBfX2luaXQKLWF1MTAwMF9pbml0KHZvaWQpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHNuZF9hdTEwMDAgKmF1MTAwMDsKLQotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZSgtMSwgIkFDOTciLCBUSElTX01PRFVMRSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2F1MTAwMCksICZjYXJkKTsKKwllcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmF1MTAwMC0+YWM5Nyk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCi0JY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2F1MTAwMF9mcmVlOwotCWF1MTAwMCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKLQlhdTEwMDAtPmNhcmQgPSBjYXJkOwotCi0JYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX3N0cmVhbSksIEdGUF9LRVJORUwpOwotCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkUgXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19zdHJlYW0pLCBHRlBfS0VSTkVMKTsKLQkvKiBzbyB0aGF0IHNuZF9hdTEwMDBfZnJlZSB3aWxsIHdvcmsgYXMgaW50ZW5kZWQgKi8KLSAJYXUxMDAwLT5hYzk3X3Jlc19wb3J0ID0gTlVMTDsKLQlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKQotCQlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10tPmRtYSA9IC0xOwotCWlmIChhdTEwMDAtPnN0cmVhbVtDQVBUVVJFIF0pCi0JCWF1MTAwMC0+c3RyZWFtW0NBUFRVUkUgXS0+ZG1hID0gLTE7Ci0KLQlpZiAoYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdID09IE5VTEwgfHwKLQkgICAgYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRSBdID09IE5VTEwpIHsKLQkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKChlcnIgPSBzbmRfYXUxMDAwX2FjOTdfbmV3KGF1MTAwMCkpIDwgMCApIHsKLQkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoKGVyciA9IHNuZF9hdTEwMDBfcGNtX25ldyhhdTEwMDApKSA8IDApIHsKLQkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZXJyID0gc25kX2F1MTAwMF9wY21fbmV3KGF1MTAwMCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OwogCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkF1MTAwMC1BQzk3Iik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkFNRCBBdTEwMDAtQUM5NyIpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJBTUQgQXUxMDAwLS1BQzk3IEFMU0EgRHJpdmVyIik7CiAKLQlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKLQkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQUxTQSBBQzk3OiBEcml2ZXIgSW5pdGlhbGl6ZWRcbiIpOwotCWF1MTAwMF9jYXJkID0gY2FyZDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCiAJcmV0dXJuIDA7CisKKyBvdXQ6CisJc25kX2NhcmRfZnJlZShjYXJkKTsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXUxMDAwX2V4aXQodm9pZCkKK3N0YXRpYyBpbnQgYXUxMDAwX2FjOTdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc25kX2NhcmRfZnJlZShhdTEwMDBfY2FyZCk7CisJcmV0dXJuIHNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOwogfQogCi1tb2R1bGVfaW5pdChhdTEwMDBfaW5pdCk7Ci1tb2R1bGVfZXhpdChhdTEwMDBfZXhpdCk7CitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1MTAwMF9hYzk3Y19kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAiYXUxMDAwLWFjOTdjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYXUxMDAwX2FjOTdfcHJvYmUsCisJLnJlbW92ZQkJPSBhdTEwMDBfYWM5N19yZW1vdmUsCit9OwogCitzdGF0aWMgaW50IF9faW5pdCBhdTEwMDBfYWM5N19sb2FkKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXUxMDAwX2FjOTdjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdTEwMDBfYWM5N191bmxvYWQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXUxMDAwX2FjOTdjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF1MTAwMF9hYzk3X2xvYWQpOworbW9kdWxlX2V4aXQoYXUxMDAwX2FjOTdfdW5sb2FkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL21pcHMvaGFsMi5jIGIvc291bmQvbWlwcy9oYWwyLmMKaW5kZXggMmI3ZjZlOC4uMjM0NDFiOSAxMDA2NDQKLS0tIGEvc291bmQvbWlwcy9oYWwyLmMKKysrIGIvc291bmQvbWlwcy9oYWwyLmMKQEAgLTg4MCw3ICs4ODAsNyBAQAogCXN0cnVjdCBzbmRfaGFsMiAqY2hpcDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBkZXYtPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC04ODksNyArODg5LDYgQEAKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKIAogCWVyciA9IGhhbDJfcGNtX2NyZWF0ZShjaGlwKTsKIAlpZiAoZXJyIDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9zZ2lvMmF1ZGlvLmMgYi9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYwppbmRleCBjZmU5OWFlLi4wNGJiMDZjIDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYworKysgYi9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYwpAQCAtOTIwLDcgKzkyMCw3IEBACiAJc3RydWN0IHNuZF9zZ2lvMmF1ZGlvICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGRldi0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTkyOSw3ICs5MjksNiBAQAogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwogCiAJZXJyID0gc25kX3NnaW8yYXVkaW9fbmV3X3BjbShjaGlwKTsKIAlpZiAoZXJyIDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL0tjb25maWcgYi9zb3VuZC9vc3MvS2NvbmZpZwppbmRleCAxYTk2NDAyLi40ODU2OGZkIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvS2NvbmZpZworKysgYi9zb3VuZC9vc3MvS2NvbmZpZwpAQCAtMTMsMTUgKzEzLDYgQEAKIAkgIG5vdGUgdGhhdCBDT05GSUdfS0dEQiBzaG91bGQgbm90IGJlIGVuYWJsZWQgYXQgdGhlIHNhbWUKIAkgIHRpbWUsIHNpbmNlIGl0IGFsc28gYXR0ZW1wdHMgdG8gdXNlIHRoaXMgVUFSVCBwb3J0LgogCi1jb25maWcgU09VTkRfVldTTkQKLQl0cmlzdGF0ZSAiU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBTb3VuZCIKLQlkZXBlbmRzIG9uIFg4Nl9WSVNXUwotCWhlbHAKLQkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYW4gU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBhbmQgeW91IHdhbnQgdG8gYmUKLQkgIGFibGUgdG8gdXNlIGl0cyBvbi1ib2FyZCBhdWRpby4gIFJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL3Z3c25kPiBmb3IgbW9yZSBpbmZvIG9uIHRoaXMgZHJpdmVyJ3MKLQkgIGNhcGFiaWxpdGllcy4KLQogY29uZmlnIFNPVU5EX01TTkRDTEFTCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIENsYXNzaWMsIFRhaGl0aSwgTW9udGVyZXkiCiAJZGVwZW5kcyBvbiAobSB8fCAhU1RBTkRBTE9ORSkgJiYgSVNBCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvTWFrZWZpbGUgYi9zb3VuZC9vc3MvTWFrZWZpbGUKaW5kZXggNzdmMjFiNi4uOWJkYmJkZSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL01ha2VmaWxlCisrKyBiL3NvdW5kL29zcy9NYWtlZmlsZQpAQCAtMjQsNyArMjQsNiBAQAogb2JqLSQoQ09ORklHX1NPVU5EX1dBVkVBUlRJU1QpCSs9IHdhdmVhcnRpc3Qubwogb2JqLSQoQ09ORklHX1NPVU5EX01TTkRDTEFTKQkrPSBtc25kLm8gbXNuZF9jbGFzc2ljLm8KIG9iai0kKENPTkZJR19TT1VORF9NU05EUElOKQkrPSBtc25kLm8gbXNuZF9waW5uYWNsZS5vCi1vYmotJChDT05GSUdfU09VTkRfVldTTkQpCSs9IHZ3c25kLm8KIG9iai0kKENPTkZJR19TT1VORF9CQ01fQ1M0Mjk3QSkJKz0gc3dhcm1fY3M0Mjk3YS5vCiAKIG9iai0kKENPTkZJR19ETUFTT1VORCkJCSs9IGRtYXNvdW5kLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3BhczIuaCBiL3NvdW5kL29zcy9wYXMyLmgKaW5kZXggZmExMmM1NS4uZDE5Zjc1NyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3BhczIuaAorKysgYi9zb3VuZC9vc3MvcGFzMi5oCkBAIC0xNSwzICsxNSw2IEBACiAvKglGcm9tIHBhc19taWRpLmMgKi8KIHZvaWQgcGFzX21pZGlfaW5pdCh2b2lkKTsKIHZvaWQgcGFzX21pZGlfaW50ZXJydXB0KHZvaWQpOworCisvKglGcm9tIHBhczJfbWl4ZXIuYyovCit2b2lkIG1peF93cml0ZSh1bnNpZ25lZCBjaGFyIGRhdGEsIGludCBpb2FkZHIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3BhczJfY2FyZC5jIGIvc291bmQvb3NzL3BhczJfY2FyZC5jCmluZGV4IDcwMDRlMjQuLmIwNzk1NGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9wYXMyX2NhcmQuYworKysgYi9zb3VuZC9vc3MvcGFzMl9jYXJkLmMKQEAgLTc0LDggKzc0LDYgQEAKICAqIHRvIHN1cHBvcnQgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBiYXNlIGFkZHJlc3MKICAqLwogCi1leHRlcm4gdm9pZCAgICAgbWl4X3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGlvYWRkcik7Ci0KIHVuc2lnbmVkIGNoYXIgcGFzX3JlYWQoaW50IGlvYWRkcikKIHsKIAlyZXR1cm4gaW5iKGlvYWRkciArIHBhc190cmFuc2xhdGVfY29kZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdndzbmQuYyBiL3NvdW5kL29zcy92d3NuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDc3ZTljLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy92d3NuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwNiArMCwwIEBACi0vKgotICogU291bmQgZHJpdmVyIGZvciBTaWxpY29uIEdyYXBoaWNzIDMyMCBhbmQgNTQwIFZpc3VhbCBXb3Jrc3RhdGlvbnMnCi0gKiBvbmJvYXJkIGF1ZGlvLiAgU2VlIG5vdGVzIGluIERvY3VtZW50YXRpb24vc291bmQvb3NzL3Z3c25kIC4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSN1bmRlZiBWV1NORF9ERUJVRwkJCS8qIGRlZmluZSBmb3IgZGVidWdnaW5nICovCi0KLS8qCi0gKiBYWFggdG8gZG8gLQotICoKLSAqCUV4dGVybmFsIHN5bmMuCi0gKglSZW5hbWUgc3didWYsIGh3YnVmLCB1JmksIGh3cHRyJnN3cHRyIHRvIHNvbWV0aGluZyByYXRpb25hbC4KLSAqCUJ1ZyAtIGlmIHNlbGVjdCgpIGNhbGxlZCBiZWZvcmUgcmVhZCgpLCBwY21fc2V0dXAoKSBub3QgY2FsbGVkLgotICoJQnVnIC0gb3V0cHV0IGRvZXNuJ3Qgc3RvcCBzb29uIGVub3VnaCBpZiBwcm9jZXNzIGtpbGxlZC4KLSAqLwotCi0vKgotICogVGhpbmdzIHRvIHRlc3QgLQotICoKLSAqCVdpbGwgcmVhZHYvd3JpdGV2IHdvcms/ICBXcml0ZSBhIHRlc3QuCi0gKgotICoJaW5zbW9kL3JtbW9kIDEwMCBtaWxsaW9uIHRpbWVzLgotICoKLSAqCVJ1biBJL08gdW50aWwgaW50IHB0cnMgd3JhcCBhcm91bmQgKHJvdWdobHkgNi4yIGhvdXJzIEAgREFUCi0gKglyYXRlKS4KLSAqCi0gKglDb25jdXJyZW50IHRocmVhZHMgYmFuZ2luZyBvbiBtaXhlciBzaW11bHRhbmVvdXNseSwgYm90aCBVUAotICoJYW5kIFNNUCBrZXJuZWxzLiAgRXNwZWNpYWxseSwgd2F0Y2ggZm9yIHRocmVhZCBBIGNoYW5naW5nCi0gKglPVVRTUkMgd2hpbGUgdGhyZWFkIEIgY2hhbmdlcyBnYWluIC0tIGJvdGggd3JpdGUgdG8gdGhlIHNhbWUKLSAqCWFkMTg0MyByZWdpc3Rlci4KLSAqCi0gKglXaGF0IGhhcHBlbnMgaWYgYSBjbGllbnQgb3BlbnMgL2Rldi9hdWRpbyB0aGVuIGZvcmtzPwotICoJRG8gdHdvIHByb2NzIGhhdmUgL2Rldi9hdWRpbyBvcGVuPyAgVGVzdC4KLSAqCi0gKglQdW1wIGF1ZGlvIHRocm91Z2ggdGhlIENELCBNSUMgYW5kIGxpbmUgaW5wdXRzIGFuZCB2ZXJpZnkgdGhhdAotICoJdGhleSBtaXgvbXV0ZSBpbnRvIHRoZSBvdXRwdXQuCi0gKgotICoJQXBwczoKLSAqCQlhbXAKLSAqCQltcGcxMjMKLSAqCQl4MTFhbXAKLSAqCQlteHYKLSAqCQlrbWVkaWEKLSAqCQllc291bmQKLSAqCQluZWVkIG1vcmUgaW5wdXQgYXBwcwotICoKLSAqCVJ1biB0ZXN0cyB3aGlsZSBib21iYXJkaW5nIHdpdGggc2lnbmFscy4gIHNldGl0aW1lcigyKSB3aWxsIGRvIGl0Li4uICAqLwotCi0vKgotICogVGhpcyBkcml2ZXIgaXMgb3JnYW5pemVkIGluIG5pbmUgc2VjdGlvbnMuCi0gKiBUaGUgbmluZSBzZWN0aW9ucyBhcmU6Ci0gKgotICoJZGVidWcgc3R1ZmYKLSAqIAlsb3cgbGV2ZWwgbGl0aGl1bSBhY2Nlc3MKLSAqCWhpZ2ggbGV2ZWwgbGl0aGl1bSBhY2Nlc3MKLSAqCUFEMTg0MyBhY2Nlc3MKLSAqCVBDTSBJL08KLSAqCWF1ZGlvIGRyaXZlcgotICoJbWl4ZXIgZHJpdmVyCi0gKglwcm9iZS9hdHRhY2gvdW5sb2FkCi0gKglpbml0aWFsaXphdGlvbiBhbmQgbG9hZGFibGUga2VybmVsIG1vZHVsZSBpbnRlcmZhY2UKLSAqCi0gKiBUaGF0IGlzIHJvdWdobHkgdGhlIG9yZGVyIG9mIGluY3JlYXNpbmcgYWJzdHJhY3Rpb24sIHNvIGZvcndhcmQKLSAqIGRlcGVuZGVuY2llcyBhcmUgbWluaW1hbC4KLSAqLwotCi0vKgotICogTG9ja2luZyBOb3RlcwotICoKLSAqCUlOQ19VU0VfQ09VTlQgYW5kIERFQ19VU0VfQ09VTlQga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mCi0gKglvcGVuIGRlc2NyaXB0b3JzIHRvIHRoaXMgZHJpdmVyLiBUaGV5IHN0b3JlIGl0IGluIHZ3c25kX3VzZV9jb3VudC4KLSAqIAlUaGUgZ2xvYmFsIGRldmljZSBsaXN0LCB2d3NuZF9kZXZfbGlzdCwJaXMgaW1tdXRhYmxlIHdoZW4gdGhlIElOX1VTRQotICoJaXMgdHJ1ZS4KLSAqCi0gKglkZXZjLT5vcGVuX2xvY2sgaXMgYSBzZW1hcGhvcmUgdGhhdCBpcyB1c2VkIHRvIGVuZm9yY2UgdGhlCi0gKglzaW5nbGUgcmVhZGVyL3NpbmdsZSB3cml0ZXIgcnVsZSBmb3IgL2Rldi9hdWRpby4gIFRoZSBydWxlIGlzCi0gKgl0aGF0IGVhY2ggZGV2aWNlIG1heSBoYXZlIGF0IG1vc3Qgb25lIHJlYWRlciBhbmQgb25lIHdyaXRlci4KLSAqCU9wZW4gd2lsbCBibG9jayB1bnRpbCB0aGUgcHJldmlvdXMgY2xpZW50IGhhcyBjbG9zZWQgdGhlCi0gKglkZXZpY2UsIHVubGVzcyBPX05PTkJMT0NLIGlzIHNwZWNpZmllZC4KLSAqCi0gKglUaGUgc2VtYXBob3JlIGRldmMtPmlvX211dGV4IHNlcmlhbGl6ZXMgUENNIEkvTyBzeXNjYWxscy4gIFRoaXMKLSAqCWlzIHVubmVjZXNzYXJ5IGluIExpbnV4IDIuMiwgYmVjYXVzZSB0aGUga2VybmVsIGxvY2sKLSAqCXNlcmlhbGl6ZXMgcmVhZCwgd3JpdGUsIGFuZCBpb2N0bCBnbG9iYWxseSwgYnV0IGl0J3MgdGhlcmUsCi0gKglyZWFkeSBmb3IgdGhlIGJyYXZlLCBuZXcgcG9zdC1rZXJuZWwtbG9jayB3b3JsZC4KLSAqCi0gKglMb2NraW5nIGJldHdlZW4gaW50ZXJydXB0IGFuZCBiYXNlbGV2ZWwgaXMgaGFuZGxlZCBieSB0aGUKLSAqCSJsb2NrIiBzcGlubG9jayBpbiB2d3NuZF9wb3J0IChvbmUgbG9jayBlYWNoIGZvciByZWFkIGFuZAotICoJd3JpdGUpLiAgRWFjaCBoYWxmIGhvbGRzIHRoZSBsb2NrIGp1c3QgbG9uZyBlbm91Z2ggdG8gc2VlIHdoYXQKLSAqCWFyZWEgaXQgb3ducyBhbmQgdXBkYXRlIGl0cyBwb2ludGVycy4gIFNlZSBwY21fb3V0cHV0KCkgYW5kCi0gKglwY21faW5wdXQoKSBmb3IgbW9zdCBvZiB0aGUgZ29yeSBzdHVmZi4KLSAqCi0gKglkZXZjLT5taXhfbXV0ZXggc2VyaWFsaXplcyBhbGwgbWl4ZXIgaW9jdGxzLiAgVGhpcyBpcyBhbHNvCi0gKglyZWR1bmRhbnQgYmVjYXVzZSBvZiB0aGUga2VybmVsIGxvY2suCi0gKgotICoJVGhlIGxvd2VzdCBsZXZlbCBsb2NrIGlzIGxpdGgtPmxpdGhpdW1fbG9jay4gIEl0IGlzIGEKLSAqCXNwaW5sb2NrIHdoaWNoIGlzIGhlbGQgZHVyaW5nIHRoZSB0d28tcmVnaXN0ZXIgdGFuZ28gb2YKLSAqCXJlYWRpbmcvd3JpdGluZyBhbiBBRDE4NDMgcmVnaXN0ZXIuICBTZWUKLSAqCWxpX3tyZWFkLHdyaXRlfV9hZDE4NDNfcmVnKCkuCi0gKi8KLQotLyoKLSAqIFNhbXBsZSBGb3JtYXQgTm90ZXMKLSAqCi0gKglMaXRoaXVtJ3MgRE1BIGVuZ2luZSBoYXMgdHdvIGZvcm1hdHM6IDE2LWJpdCAyJ3MgY29tcGxlbWVudAotICoJYW5kIDgtYml0IHVuc2lnbmVkIC4gIDE2LWJpdCB0cmFuc2ZlcnMgdGhlIGRhdGEgdW5tb2RpZmllZCwgMgotICoJYnl0ZXMgcGVyIHNhbXBsZS4gIDgtYml0IHVuc2lnbmVkIHRyYW5zZmVycyAxIGJ5dGUgcGVyIHNhbXBsZQotICoJYW5kIFhPUnMgZWFjaCBieXRlIHdpdGggMHg4MC4gIExpdGhpdW0gY2FuIGlucHV0IG9yIG91dHB1dAotICoJZWl0aGVyIG1vbm8gb3Igc3RlcmVvIGluIGVpdGhlciBmb3JtYXQuCi0gKgotICoJVGhlIEFEMTg0MyBoYXMgZm91ciBmb3JtYXRzOiAxNi1iaXQgMidzIGNvbXBsZW1lbnQsIDgtYml0Ci0gKgl1bnNpZ25lZCwgOC1iaXQgbXUtTGF3IGFuZCA4LWJpdCBBLUxhdy4KLSAqCi0gKglUaGlzIGRyaXZlciBzdXBwb3J0cyBmaXZlIGZvcm1hdHM6IEFGTVRfUzgsIEFGTVRfVTgsCi0gKglBRk1UX01VX0xBVywgQUZNVF9BX0xBVywgYW5kIEFGTVRfUzE2X0xFLgotICoKLSAqCUZvciBBRk1UX1U4IG91dHB1dCwgd2Uga2VlcCB0aGUgQUQxODQzIGluIDE2LWJpdCBtb2RlLCBhbmQKLSAqCXJlbHkgb24gTGl0aGl1bSdzIFhPUiB0byB0cmFuc2xhdGUgYmV0d2VlbiBVOCBhbmQgUzguCi0gKgotICoJRm9yIEFGTVRfUzgsIEFGTVRfTVVfTEFXIGFuZCBBRk1UX0FfTEFXIG91dHB1dCwgd2UgaGF2ZSB0byBYT1IKLSAqCXRoZSAweDgwIGJpdCBpbiBzb2Z0d2FyZSB0byBjb21wZW5zYXRlIGZvciBMaXRoaXVtJ3MgWE9SLgotICoJVGhpcyBoYXBwZW5zIGluIHBjbV9jb3B5X3tpbixvdXR9KCkuCi0gKgotICogQ2hhbmdlczoKLSAqIDExLTEwLTIwMDAJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+Ci0gKgkJQWRkZWQgc29tZSBfX2luaXQvX19leGl0Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxhc20vdmlzd3MvY29iYWx0Lmg+Ci0KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotc3RhdGljIERFRklORV9NVVRFWCh2d3NuZF9tdXRleCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlYnVnIHN0dWZmICovCi0KLSNpZmRlZiBWV1NORF9ERUJVRwotCi1zdGF0aWMgaW50IHNodXRfdXAgPSAxOwotCi0vKgotICogZGJnYXNzZXJ0IC0gY2FsbGVkIHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzLgotICovCi0KLXN0YXRpYyB2b2lkIGRiZ2Fzc2VydChjb25zdCBjaGFyICpmY24sIGludCBsaW5lLCBjb25zdCBjaGFyICpleHByKQotewotCWlmIChpbl9pbnRlcnJ1cHQoKSkKLQkJcGFuaWMoIkFTU0VSVElPTiBGQUlMRUQgSU4gSU5URVJSVVBULCAlczolczolZCAlc1xuIiwKLQkJICAgICAgX19GSUxFX18sIGZjbiwgbGluZSwgZXhwcik7Ci0JZWxzZSB7Ci0JCWludCB4OwotCQlwcmludGsoS0VSTl9FUlIgIkFTU0VSVElPTiBGQUlMRUQsICVzOiVzOiVkICVzXG4iLAotCQkgICAgICAgX19GSUxFX18sIGZjbiwgbGluZSwgZXhwcik7Ci0JCXggPSAqICh2b2xhdGlsZSBpbnQgKikgMDsgLyogZm9yY2UgcHJvYyB0byBleGl0ICovCi0JfQotfQotCi0vKgotICogQnVuY2ggb2YgdXNlZnVsIGRlYnVnIG1hY3JvczoKLSAqCi0gKglBU1NFUlQJLSBwcmludCB1bmxlc3MgZSBub256ZXJvIChwYW5pYyBpZiBpbiBpbnRlcnJ1cHQpCi0gKglEQkdETwktIGluY2x1ZGUgYXJiaXRyYXJ5IGNvZGUgaWYgZGVidWdnaW5nCi0gKglEQkdYCS0gZGVidWcgcHJpbnQgcmF3ICh3L28gZnVuY3Rpb24gbmFtZSkKLSAqCURCR1AJLSBkZWJ1ZyBwcmludCB3LyBmdW5jdGlvbiBuYW1lCi0gKglEQkdFCS0gZGVidWcgcHJpbnQgZnVuY3Rpb24gZW50cnkKLSAqCURCR0MJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiBjYWxsCi0gKglEQkdSCS0gZGVidWcgcHJpbnQgZnVuY3Rpb24gcmV0dXJuCi0gKglEQkdYVgktIGRlYnVnIHByaW50IHJhdyB3aGVuIHZlcmJvc2UKLSAqCURCR1BWCS0gZGVidWcgcHJpbnQgd2hlbiB2ZXJib3NlCi0gKglEQkdFVgktIGRlYnVnIHByaW50IGZ1bmN0aW9uIGVudHJ5IHdoZW4gdmVyYm9zZQotICoJREJHUlYJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiByZXR1cm4gd2hlbiB2ZXJib3NlCi0gKi8KLQotI2RlZmluZSBBU1NFUlQoZSkgICAgICAoKGUpID8gKHZvaWQpIDAgOiBkYmdhc3NlcnQoX19mdW5jX18sIF9fTElORV9fLCAjZSkpCi0jZGVmaW5lIERCR0RPKHgpICAgICAgICAgICAgeAotI2RlZmluZSBEQkdYKGZtdCwgYXJncy4uLikgIChpbl9pbnRlcnJ1cHQoKSA/IDAgOiBwcmludGsoS0VSTl9FUlIgZm10LCAjI2FyZ3MpKQotI2RlZmluZSBEQkdQKGZtdCwgYXJncy4uLikgIChEQkdYKCIlczogIiBmbXQsIF9fZnVuY19fICwgIyNhcmdzKSkKLSNkZWZpbmUgREJHRShmbXQsIGFyZ3MuLi4pICAoREJHWCgiJXMiIGZtdCwgX19mdW5jX18gLCAjI2FyZ3MpKQotI2RlZmluZSBEQkdDKHJ0bikgICAgICAgICAgIChEQkdQKCJjYWxsaW5nICVzXG4iLCBydG4pKQotI2RlZmluZSBEQkdSKCkgICAgICAgICAgICAgIChEQkdQKCJyZXR1cm5pbmdcbiIpKQotI2RlZmluZSBEQkdYVihmbXQsIGFyZ3MuLi4pIChzaHV0X3VwID8gMCA6IERCR1goZm10LCAjI2FyZ3MpKQotI2RlZmluZSBEQkdQVihmbXQsIGFyZ3MuLi4pIChzaHV0X3VwID8gMCA6IERCR1AoZm10LCAjI2FyZ3MpKQotI2RlZmluZSBEQkdFVihmbXQsIGFyZ3MuLi4pIChzaHV0X3VwID8gMCA6IERCR0UoZm10LCAjI2FyZ3MpKQotI2RlZmluZSBEQkdDVihydG4pICAgICAgICAgIChzaHV0X3VwID8gMCA6IERCR0MocnRuKSkKLSNkZWZpbmUgREJHUlYoKSAgICAgICAgICAgICAoc2h1dF91cCA/IDAgOiBEQkdSKCkpCi0KLSNlbHNlIC8qICFWV1NORF9ERUJVRyAqLwotCi0jZGVmaW5lIEFTU0VSVChlKSAgICAgICAgICAgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdETyh4KSAgICAgICAgICAgIC8qIGRvbid0ICovCi0jZGVmaW5lIERCR1goZm10LCBhcmdzLi4uKSAgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdQKGZtdCwgYXJncy4uLikgICgodm9pZCkgMCkKLSNkZWZpbmUgREJHRShmbXQsIGFyZ3MuLi4pICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR0MocnRuKSAgICAgICAgICAgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdSKCkgICAgICAgICAgICAgICgodm9pZCkgMCkKLSNkZWZpbmUgREJHUFYoZm10LCBhcmdzLi4uKSAoKHZvaWQpIDApCi0jZGVmaW5lIERCR1hWKGZtdCwgYXJncy4uLikgKCh2b2lkKSAwKQotI2RlZmluZSBEQkdFVihmbXQsIGFyZ3MuLi4pICgodm9pZCkgMCkKLSNkZWZpbmUgREJHQ1YocnRuKSAgICAgICAgICAoKHZvaWQpIDApCi0jZGVmaW5lIERCR1JWKCkgICAgICAgICAgICAgKCh2b2lkKSAwKQotCi0jZW5kaWYgLyogIVZXU05EX0RFQlVHICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGxvdyBsZXZlbCBsaXRoaXVtIGFjY2VzcyAqLwotCi0vKgotICogV2UgbmVlZCB0byB0YWxrIHRvIExpdGhpdW0gcmVnaXN0ZXJzIG9uIHRocmVlIHBhZ2VzLiAgSGVyZSBhcmUKLSAqIHRoZSBwYWdlcycgb2Zmc2V0cyBmcm9tIHRoZSBiYXNlIGFkZHJlc3MgKDB4RkYwMDEwMDApLgotICovCi0KLWVudW0gewotCUxJX1BBR0UwX09GRlNFVCA9IDB4MDEwMDAgLSAweDEwMDAsIC8qIEZGMDAxMDAwICovCi0JTElfUEFHRTFfT0ZGU0VUID0gMHgwRjAwMCAtIDB4MTAwMCwgLyogRkYwMEYwMDAgKi8KLQlMSV9QQUdFMl9PRkZTRVQgPSAweDEwMDAwIC0gMHgxMDAwLCAvKiBGRjAxMDAwMCAqLwotfTsKLQotLyogbG93LWxldmVsIGxpdGhpdW0gZGF0YSAqLwotCi10eXBlZGVmIHN0cnVjdCBsaXRoaXVtIHsKLQl2b2lkICoJCXBhZ2UwOwkJLyogdmlydHVhbCBhZGRyZXNzZXMgKi8KLQl2b2lkICoJCXBhZ2UxOwotCXZvaWQgKgkJcGFnZTI7Ci0Jc3BpbmxvY2tfdAlsb2NrOwkJLyogcHJvdGVjdHMgY29kZWMgYW5kIFVTVC9NU0MgYWNjZXNzICovCi19IGxpdGhpdW1fdDsKLQotLyoKLSAqIGxpX2Rlc3Ryb3kgZGVzdHJveXMgdGhlIGxpdGhpdW1fdCBzdHJ1Y3R1cmUgYW5kIHZtIG1hcHBpbmdzLgotICovCi0KLXN0YXRpYyB2b2lkIGxpX2Rlc3Ryb3kobGl0aGl1bV90ICpsaXRoKQotewotCWlmIChsaXRoLT5wYWdlMCkgewotCQlpb3VubWFwKGxpdGgtPnBhZ2UwKTsKLQkJbGl0aC0+cGFnZTAgPSBOVUxMOwotCX0KLQlpZiAobGl0aC0+cGFnZTEpIHsKLQkJaW91bm1hcChsaXRoLT5wYWdlMSk7Ci0JCWxpdGgtPnBhZ2UxID0gTlVMTDsKLQl9Ci0JaWYgKGxpdGgtPnBhZ2UyKSB7Ci0JCWlvdW5tYXAobGl0aC0+cGFnZTIpOwotCQlsaXRoLT5wYWdlMiA9IE5VTEw7Ci0JfQotfQotCi0vKgotICogbGlfY3JlYXRlIGluaXRpYWxpemVzIHRoZSBsaXRoaXVtX3Qgc3RydWN0dXJlIGFuZCBzZXRzIHVwIHZtIG1hcHBpbmdzCi0gKiB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycy4KLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBsaV9jcmVhdGUobGl0aGl1bV90ICpsaXRoLCB1bnNpZ25lZCBsb25nIGJhc2VhZGRyKQotewotCXNwaW5fbG9ja19pbml0KCZsaXRoLT5sb2NrKTsKLQlsaXRoLT5wYWdlMCA9IGlvcmVtYXBfbm9jYWNoZShiYXNlYWRkciArIExJX1BBR0UwX09GRlNFVCwgUEFHRV9TSVpFKTsKLQlsaXRoLT5wYWdlMSA9IGlvcmVtYXBfbm9jYWNoZShiYXNlYWRkciArIExJX1BBR0UxX09GRlNFVCwgUEFHRV9TSVpFKTsKLQlsaXRoLT5wYWdlMiA9IGlvcmVtYXBfbm9jYWNoZShiYXNlYWRkciArIExJX1BBR0UyX09GRlNFVCwgUEFHRV9TSVpFKTsKLQlpZiAoIWxpdGgtPnBhZ2UwIHx8ICFsaXRoLT5wYWdlMSB8fCAhbGl0aC0+cGFnZTIpIHsKLQkJbGlfZGVzdHJveShsaXRoKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogYmFzaWMgcmVnaXN0ZXIgYWNjZXNzb3JzIC0gcmVhZC93cml0ZSBsb25nL2J5dGUKLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxpX3JlYWRsKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9mZikKLXsKLQlyZXR1cm4gKiAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAobGl0aC0+cGFnZTAgKyBvZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIGxpX3JlYWRiKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9mZikKLXsKLQlyZXR1cm4gKiAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAobGl0aC0+cGFnZTAgKyBvZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpX3dyaXRlbChsaXRoaXVtX3QgKmxpdGgsIGludCBvZmYsIHVuc2lnbmVkIGxvbmcgdmFsKQotewotCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgtPnBhZ2UwICsgb2ZmKSA9IHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBsaV93cml0ZWIobGl0aGl1bV90ICpsaXRoLCBpbnQgb2ZmLCB1bnNpZ25lZCBjaGFyIHZhbCkKLXsKLQkqICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChsaXRoLT5wYWdlMCArIG9mZikgPSB2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEhpZ2ggTGV2ZWwgTGl0aGl1bSBBY2Nlc3MgKi8KLQotLyoKLSAqIExpdGhpdW0gRE1BIE5vdGVzCi0gKgotICogTGl0aGl1bSBoYXMgdHdvIGRlZGljYXRlZCBETUEgY2hhbm5lbHMgZm9yIGF1ZGlvLiAgVGhleSBhcmUga25vd24KLSAqIGFzIGNvbW0xIGFuZCBjb21tMiAoY29tbXVuaWNhdGlvbiBhcmVhcyAxIGFuZCAyKS4gIENvbW0xIGlzIGZvcgotICogaW5wdXQsIGFuZCBjb21tMiBpcyBmb3Igb3V0cHV0LiAgRWFjaCBpcyBjb250cm9sbGVkIGJ5IHRocmVlCi0gKiByZWdpc3RlcnM6IEJBU0UgKGJhc2UgYWRkcmVzcyksIENGRyAoY29uZmlnKSBhbmQgQ0NUTAotICogKGNvbmZpZy9jb250cm9sKS4KLSAqCi0gKiBFYWNoIERNQSBjaGFubmVsIHBvaW50cyB0byBhIHBoeXNpY2FsbHkgY29udGlndW91cyByaW5nIGJ1ZmZlciBpbgotICogbWFpbiBtZW1vcnkgb2YgdXAgdG8gOCBLYnl0ZXMuICAoVGhpcyBkcml2ZXIgYWx3YXlzIHVzZXMgOCBLYi4pCi0gKiBUaGVyZSBhcmUgdGhyZWUgcG9pbnRlcnMgaW50byB0aGUgcmluZyBidWZmZXI6IHJlYWQsIHdyaXRlLCBhbmQKLSAqIHRyaWdnZXIuICBUaGUgcG9pbnRlcnMgYXJlIDggYml0cyBlYWNoLiAgRWFjaCBwb2ludGVyIHBvaW50cyB0bwotICogMzItYnl0ZSAiY2h1bmtzIiBvZiBkYXRhLiAgVGhlIERNQSBlbmdpbmUgbW92ZXMgMzIgYnl0ZXMgYXQgYSB0aW1lLAotICogc28gdGhlcmUgaXMgbm8gZmluZXItZ3JhbnVsYXJpdHkgY29udHJvbC4KLSAqCi0gKiBJbiBjb21tMSwgdGhlIGhhcmR3YXJlIHVwZGF0ZXMgdGhlIHdyaXRlIHB0ciwgYW5kIHNvZnR3YXJlIHVwZGF0ZXMKLSAqIHRoZSByZWFkIHB0ci4gIEluIGNvbW0yLCBpdCdzIHRoZSBvcHBvc2l0ZTogaGFyZHdhcmUgdXBkYXRlcyB0aGUKLSAqIHJlYWQgcHRyLCBhbmQgc29mdHdhcmUgdXBkYXRlcyB0aGUgd3JpdGUgcHRyLiAgSSBkZXNpZ25hdGUgdGhlCi0gKiBoYXJkd2FyZS11cGRhdGVkIHB0ciBhcyB0aGUgaHdwdHIsIGFuZCB0aGUgc29mdHdhcmUtdXBkYXRlZCBwdHIgYXMKLSAqIHRoZSBzd3B0ci4KLSAqCi0gKiBUaGUgdHJpZ2dlciBwdHIgYW5kIHRyaWdnZXIgbWFzayBhcmUgdXNlZCB0byB0cmlnZ2VyIGludGVycnVwdHMuCi0gKiBGcm9tIHRoZSBMaXRoaXVtIHNwZWMsIHNlY3Rpb24gNS42LjgsIHJldmlzaW9uIG9mIDEyLzE1LzE5OTg6Ci0gKgotICoJVHJpZ2dlciBNYXNrIFZhbHVlCi0gKgotICoJQSB0aHJlZSBiaXQgd2lkZSBmaWVsZCB0aGF0IHJlcHJlc2VudHMgYSBwb3dlciBvZiB0d28gbWFzawotICoJdGhhdCBpcyB1c2VkIHdoZW5ldmVyIHRoZSB0cmlnZ2VyIHBvaW50ZXIgaXMgY29tcGFyZWQgdG8gaXRzCi0gKglyZXNwZWN0aXZlIHJlYWQgb3Igd3JpdGUgcG9pbnRlci4gIEEgdmFsdWUgb2YgemVybyBoZXJlCi0gKglpbXBsaWVzIGEgbWFzayBvZiAweEZGIGFuZCBhIHZhbHVlIG9mIHNldmVuIGltcGxpZXMgYSBtYXNrCi0gKgkweDAxLiAgVGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0byBzdWItZGl2aWRlIHRoZSByaW5nIGJ1ZmZlcgotICoJaW50byBwaWUgc2VjdGlvbnMgc28gdGhhdCBpbnRlcnJ1cHRzIG1vbml0b3IgdGhlIHByb2dyZXNzIG9mCi0gKgloYXJkd2FyZSBmcm9tIHNlY3Rpb24gdG8gc2VjdGlvbi4KLSAqCi0gKiBNeSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IGlzLCB3aGVuZXZlciB0aGUgaHcgcHRyIGlzIHVwZGF0ZWQsIGl0IGlzCi0gKiBjb21wYXJlZCB3aXRoIHRoZSB0cmlnZ2VyIHB0ciwgYW5kIHRoZSByZXN1bHQgaXMgbWFza2VkIGJ5IHRoZQotICogdHJpZ2dlciBtYXNrLiAgKEFjdHVhbGx5LCBieSB0aGUgY29tcGxlbWVudCBvZiB0aGUgdHJpZ2dlciBtYXNrLikKLSAqIElmIHRoZSByZXN1bHQgaXMgemVybywgYW4gaW50ZXJydXB0IGlzIHRyaWdnZXJlZC4gIEkuZS4sIGludGVycnVwdAotICogaWYgKChod3B0ciAmIH5tYXNrKSA9PSAodHJwdHIgJiB+bWFzaykpLiAgVGhlIG1hc2sgaXMgZm9ybWVkIGZyb20KLSAqIHRoZSB0cmlnZ2VyIHJlZ2lzdGVyIHZhbHVlIGFzIG1hc2sgPSAoMSA8PCAoOCAtIHRtcmVnKSkgLSAxLgotICoKLSAqIEluIHlldCBkaWZmZXJlbnQgd29yZHMsIHNldHRpbmcgdG1yZWcgdG8gMCBjYXVzZXMgYW4gaW50ZXJydXB0IGFmdGVyCi0gKiBldmVyeSAyNTYgRE1BIGNodW5rcyAoODE5MiBieXRlcykgb3Igb25jZSBwZXIgdHJhdmVyc2FsIG9mIHRoZQotICogcmluZyBidWZmZXIuICBTZXR0aW5nIGl0IHRvIDcgY2F1ZXMgYW4gaW50ZXJydXB0IGV2ZXJ5IDIgRE1BIGNodW5rcwotICogKDY0IGJ5dGVzKSBvciAxMjggdGltZXMgcGVyIHRyYXZlcnNhbCBvZiB0aGUgcmluZyBidWZmZXIuCi0gKi8KLQotLyogTGl0aGl1bSByZWdpc3RlciBvZmZzZXRzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBMSV9IT1NUX0NPTlRST0xMRVIJMHgwMDAKLSMgZGVmaW5lIExJX0hDX1JFU0VUCQkgMHgwMDAwODAwMAotIyBkZWZpbmUgTElfSENfTElOS19FTkFCTEUJIDB4MDAwMDQwMDAKLSMgZGVmaW5lIExJX0hDX0xJTktfRkFJTFVSRQkgMHgwMDAwMDAwNAotIyBkZWZpbmUgTElfSENfTElOS19DT0RFQwkgMHgwMDAwMDAwMgotIyBkZWZpbmUgTElfSENfTElOS19SRUFEWQkgMHgwMDAwMDAwMQotCi0jZGVmaW5lIExJX0lOVFJfU1RBVFVTCQkweDAxMAotI2RlZmluZSBMSV9JTlRSX01BU0sJCTB4MDE0Ci0jIGRlZmluZSBMSV9JTlRSX0xJTktfRVJSCSAweDAwMDA4MDAwCi0jIGRlZmluZSBMSV9JTlRSX0NPTU0yX1RSSUcJIDB4MDAwMDAwMDgKLSMgZGVmaW5lIExJX0lOVFJfQ09NTTJfVU5ERVJGTE9XIDB4MDAwMDAwMDQKLSMgZGVmaW5lIExJX0lOVFJfQ09NTTFfVFJJRwkgMHgwMDAwMDAwMgotIyBkZWZpbmUgTElfSU5UUl9DT01NMV9PVkVSRkxPVyAgMHgwMDAwMDAwMQotCi0jZGVmaW5lIExJX0NPREVDX0NPTU1BTkQJMHgwMTgKLSMgZGVmaW5lIExJX0NDX0JVU1kJCSAweDAwMDA4MDAwCi0jIGRlZmluZSBMSV9DQ19ESVIJCSAweDAwMDAwMDgwCi0jICBkZWZpbmUgTElfQ0NfRElSX1JECQkgIExJX0NDX0RJUgotIyAgZGVmaW5lIExJX0NDX0RJUl9XUgkJKCFMSV9DQ19ESVIpCi0jIGRlZmluZSBMSV9DQ19BRERSX01BU0sJIDB4MDAwMDAwN0YKLQotI2RlZmluZSBMSV9DT0RFQ19EQVRBCQkweDAxQwotCi0jZGVmaW5lIExJX0NPTU0xX0JBU0UJCTB4MTAwCi0jZGVmaW5lIExJX0NPTU0xX0NUTAkJMHgxMDQKLSMgZGVmaW5lIExJX0NDVExfUkVTRVQJCSAweDgwMDAwMDAwCi0jIGRlZmluZSBMSV9DQ1RMX1NJWkUJCSAweDcwMDAwMDAwCi0jIGRlZmluZSBMSV9DQ1RMX0RNQV9FTkFCTEUJIDB4MDgwMDAwMDAKLSMgZGVmaW5lIExJX0NDVExfVE1BU0sJCSAweDA3MDAwMDAwIC8qIHRyaWdnZXIgbWFzayAqLwotIyBkZWZpbmUgTElfQ0NUTF9UUFRSCQkgMHgwMEZGMDAwMCAvKiB0cmlnZ2VyIHBvaW50ZXIgKi8KLSMgZGVmaW5lIExJX0NDVExfUlBUUgkJIDB4MDAwMEZGMDAKLSMgZGVmaW5lIExJX0NDVExfV1BUUgkJIDB4MDAwMDAwRkYKLSNkZWZpbmUgTElfQ09NTTFfQ0ZHCQkweDEwOAotIyBkZWZpbmUgTElfQ0NGR19MT0NLCQkgMHgwMDAwODAwMAotIyBkZWZpbmUgTElfQ0NGR19TTE9UCQkgMHgwMDAwMDA3MAotIyBkZWZpbmUgTElfQ0NGR19ESVJFQ1RJT04JIDB4MDAwMDAwMDgKLSMgIGRlZmluZSBMSV9DQ0ZHX0RJUl9JTgkoIUxJX0NDRkdfRElSRUNUSU9OKQotIyAgZGVmaW5lIExJX0NDRkdfRElSX09VVAkgIExJX0NDRkdfRElSRUNUSU9OCi0jIGRlZmluZSBMSV9DQ0ZHX01PREUJCSAweDAwMDAwMDA0Ci0jICBkZWZpbmUgTElfQ0NGR19NT0RFX01PTk8JKCFMSV9DQ0ZHX01PREUpCi0jICBkZWZpbmUgTElfQ0NGR19NT0RFX1NURVJFTwkgIExJX0NDRkdfTU9ERQotIyBkZWZpbmUgTElfQ0NGR19GT1JNQVQJCSAweDAwMDAwMDAzCi0jICBkZWZpbmUgTElfQ0NGR19GTVRfOEJJVAkgIDB4MDAwMDAwMDAKLSMgIGRlZmluZSBMSV9DQ0ZHX0ZNVF8xNkJJVAkgIDB4MDAwMDAwMDEKLSNkZWZpbmUgTElfQ09NTTJfQkFTRQkJMHgxMEMKLSNkZWZpbmUgTElfQ09NTTJfQ1RMCQkweDExMAotIC8qIGJpdCBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUgYXMgTElfQ09NTTFfQ1RMICovCi0jZGVmaW5lIExJX0NPTU0yX0NGRwkJMHgxMTQKLSAvKiBiaXQgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lIGFzIExJX0NPTU0xX0NGRyAqLwotCi0jZGVmaW5lIExJX1VTVF9MT1cJCTB4MjAwCS8qIDY0LWJpdCBVbmFkanVzdGVkIFN5c3RlbSBUaW1lIGlzICovCi0jZGVmaW5lIExJX1VTVF9ISUdICQkweDIwNAkvKiBtaWNyb3NlY29uZHMgc2luY2UgYm9vdCAqLwotCi0jZGVmaW5lIExJX0FVRElPMV9VU1QJCTB4MzAwCS8qIFVTVC1NU0MgcGFpcnMgKi8KLSNkZWZpbmUgTElfQVVESU8xX01TQwkJMHgzMDQJLyogTVNDIChNZWRpYSBTdHJlYW0gQ291bnRlcikgKi8KLSNkZWZpbmUgTElfQVVESU8yX1VTVAkJMHgzMDgJLyogY291bnRzIHNhbXBsZXMgYWN0dWFsbHkgKi8KLSNkZWZpbmUgTElfQVVESU8yX01TQwkJMHgzMEMJLyogcHJvY2Vzc2VkIGFzIG9mIHRpbWUgVVNUICovCi0KLS8qIAotICogTGl0aGl1bSdzIERNQSBlbmdpbmUgb3BlcmF0ZXMgb24gY2h1bmtzIG9mIDMyIGJ5dGVzLiAgV2UgY2FsbCB0aGF0Ci0gKiBhIERNQUNIVU5LLgotICovCi0KLSNkZWZpbmUgRE1BQ0hVTktfU0hJRlQgNQotI2RlZmluZSBETUFDSFVOS19TSVpFICgxIDw8IERNQUNIVU5LX1NISUZUKQotI2RlZmluZSBCWVRFU19UT19DSFVOS1MoYnl0ZXMpICgoYnl0ZXMpID4+IERNQUNIVU5LX1NISUZUKQotI2RlZmluZSBDSFVOS1NfVE9fQllURVMoY2h1bmtzKSAoKGNodW5rcykgPDwgRE1BQ0hVTktfU0hJRlQpCi0KLS8qCi0gKiBUd28gY29udmVuaWVudCBtYWNyb3MgdG8gc2hpZnQgYml0ZmllbGRzIGludG8vb3V0IG9mIHBvc2l0aW9uLgotICoKLSAqIE9ic2VydmUgdGhhdCAobWFzayAmIC1tYXNrKSBpcyAoMSA8PCBsb3dfc2V0X2JpdF9vZihtYXNrKSkuCi0gKiBBcyBsb25nIGFzIG1hc2sgaXMgY29uc3RhbnQsIHdlIHRydXN0IHRoZSBjb21waWxlciB3aWxsIGNoYW5nZSB0aGUKLSAqIG11bHRpcGx5IGFuZCBkaXZpZGUgaW50byBzaGlmdHMuCi0gKi8KLQotI2RlZmluZSBTSElGVF9GSUVMRCh2YWwsIG1hc2spICgoKHZhbCkgKiAoKG1hc2spICYgLShtYXNrKSkpICYgKG1hc2spKQotI2RlZmluZSBVTlNISUZUX0ZJRUxEKHZhbCwgbWFzaykgKCgodmFsKSAmIChtYXNrKSkgLyAoKG1hc2spICYgLShtYXNrKSkpCi0KLS8qCi0gKiBkbWFfY2hhbl9kZXNjIGlzIGludmFyaWFudCBpbmZvcm1hdGlvbiBhYm91dCBhIExpdGhpdW0KLSAqIERNQSBjaGFubmVsLiAgVGhlcmUgYXJlIHR3byBpbnN0YW5jZXMsIGxpX2NvbW0xIGFuZCBsaV9jb21tMi4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIENDVEwgcmVnaXN0ZXIgZmllbGRzIGFyZSB3cml0ZSBwdHIgYW5kIHJlYWQgcHRyLCBidXQgd2hhdAotICogd2UgY2FyZSBhYm91dCBhcmUgd2hpY2ggcG9pbnRlciBpcyB1cGRhdGVkIGJ5IHNvZnR3YXJlIGFuZCB3aGljaCBieQotICogaGFyZHdhcmUuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZG1hX2NoYW5fZGVzYyB7Ci0JaW50IGJhc2VyZWc7Ci0JaW50IGNmZ3JlZzsKLQlpbnQgY3RscmVnOwotCWludCBod3B0cnJlZzsKLQlpbnQgc3dwdHJyZWc7Ci0JaW50IHVzdHJlZzsKLQlpbnQgbXNjcmVnOwotCXVuc2lnbmVkIGxvbmcgc3dwdHJtYXNrOwotCWludCBhZDE4NDNfc2xvdDsKLQlpbnQgZGlyZWN0aW9uOwkJCS8qIExJX0NDVExfRElSX0lOL09VVCAqLwotfSBkbWFfY2hhbl9kZXNjX3Q7Ci0KLXN0YXRpYyBjb25zdCBkbWFfY2hhbl9kZXNjX3QgbGlfY29tbTEgPSB7Ci0JTElfQ09NTTFfQkFTRSwJCQkvKiBiYXNlIHJlZ2lzdGVyIG9mZnNldCAqLwotCUxJX0NPTU0xX0NGRywJCQkvKiBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JTElfQ09NTTFfQ1RMLAkJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JTElfQ09NTTFfQ1RMICsgMCwJCS8qIGh3IHB0ciByZWcgb2Zmc2V0ICh3cml0ZSBwdHIpICovCi0JTElfQ09NTTFfQ1RMICsgMSwJCS8qIHN3IHB0ciByZWcgb2Zmc2V0IChyZWFkIHB0cikgKi8KLQlMSV9BVURJTzFfVVNULAkJCS8qIHVzdCByZWcgb2Zmc2V0ICovCi0JTElfQVVESU8xX01TQywJCQkvKiBtc2MgcmVnIG9mZnNldCAqLwotCUxJX0NDVExfUlBUUiwJCQkvKiBzdyBwdHIgYml0bWFzayBpbiBjdGx2YWwgKi8KLQkyLAkJCQkvKiBhZDE4NDMgc2VyaWFsIHNsb3QgKi8KLQlMSV9DQ0ZHX0RJUl9JTgkJCS8qIGRpcmVjdGlvbiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGRtYV9jaGFuX2Rlc2NfdCBsaV9jb21tMiA9IHsKLQlMSV9DT01NMl9CQVNFLAkJCS8qIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JTElfQ09NTTJfQ0ZHLAkJCS8qIGNvbmZpZyByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMl9DVEwsCQkJLyogY29udHJvbCByZWdpc3RlciBvZmZzZXQgKi8KLQlMSV9DT01NMl9DVEwgKyAxLAkJLyogaHcgcHRyIHJlZyBvZmZzZXQgKHJlYWQgcHRyKSAqLwotCUxJX0NPTU0yX0NUTCArIDAsCQkvKiBzdyBwdHIgcmVnIG9mZnNldCAod3JpdHIgcHRyKSAqLwotCUxJX0FVRElPMl9VU1QsCQkJLyogdXN0IHJlZyBvZmZzZXQgKi8KLQlMSV9BVURJTzJfTVNDLAkJCS8qIG1zYyByZWcgb2Zmc2V0ICovCi0JTElfQ0NUTF9XUFRSLAkJCS8qIHN3IHB0ciBiaXRtYXNrIGluIGN0bHZhbCAqLwotCTIsCQkJCS8qIGFkMTg0MyBzZXJpYWwgc2xvdCAqLwotCUxJX0NDRkdfRElSX09VVAkJCS8qIGRpcmVjdGlvbiAqLwotfTsKLQotLyoKLSAqIGRtYV9jaGFuIGlzIHZhcmlhYmxlIGluZm9ybWF0aW9uIGFib3V0IGEgTGl0aGl1bSBETUEgY2hhbm5lbC4KLSAqCi0gKiBUaGUgZGVzYyBmaWVsZCBwb2ludHMgdG8gaW52YXJpYW50IGluZm9ybWF0aW9uLgotICogVGhlIGxpdGggZmllbGQgcG9pbnRzIHRvIGEgbGl0aGl1bV90IHdoaWNoIGlzIHBhc3NlZAotICogdG8gbGlfcmVhZCogYW5kIGxpX3dyaXRlKiB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycy4KLSAqIFRoZSAqdmFsIGZpZWxkcyBzaGFkb3cgdGhlIGxpdGhpdW0gcmVnaXN0ZXJzJyBjb250ZW50cy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBkbWFfY2hhbiB7Ci0JY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjOwotCWxpdGhpdW1fdCAgICAgICpsaXRoOwotCXVuc2lnbmVkIGxvbmcgICBiYXNldmFsOwotCXVuc2lnbmVkIGxvbmcJY2ZndmFsOwotCXVuc2lnbmVkIGxvbmcJY3RsdmFsOwotfSBkbWFfY2hhbl90OwotCi0vKgotICogdXN0bXNjIGlzIGEgVVNUL01TQyBwYWlyIChVbmFkanVzdGVkIFN5c3RlbSBUaW1lL01lZGlhIFN0cmVhbSBDb3VudGVyKS4KLSAqIFVTVCBpcyB0aW1lIGluIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgc3lzdGVtIGJvb3RlZCwgYW5kIE1TQyBpcyBhCi0gKiBjb3VudGVyIHRoYXQgaW5jcmVtZW50cyB3aXRoIGV2ZXJ5IGF1ZGlvIHNhbXBsZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB1c3Rtc2MgewotCXVuc2lnbmVkIGxvbmcgbG9uZyB1c3Q7Ci0JdW5zaWduZWQgbG9uZyBtc2M7Ci19IHVzdG1zY190OwotCi0vKgotICogbGlfYWQxODQzX3dhaXQgd2FpdHMgdW50aWwgbGl0aGl1bSBzYXlzIHRoZSBBRDE4NDMgcmVnaXN0ZXIKLSAqIGV4Y2hhbmdlIGlzIG5vdCBidXN5LiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FQlVTWSBvbiB0aW1lb3V0LgotICoKLSAqIExvY2tpbmc6IG11c3QgYmUgY2FsbGVkIHdpdGggbGl0aGl1bV9sb2NrIGhlbGQuCi0gKi8KLQotc3RhdGljIGludCBsaV9hZDE4NDNfd2FpdChsaXRoaXVtX3QgKmxpdGgpCi17Ci0JdW5zaWduZWQgbG9uZyBsYXRlciA9IGppZmZpZXMgKyAyOwotCXdoaWxlIChsaV9yZWFkbChsaXRoLCBMSV9DT0RFQ19DT01NQU5EKSAmIExJX0NDX0JVU1kpCi0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGxhdGVyKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBsaV9yZWFkX2FkMTg0M19yZWcgcmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50cyBvZiBhIDE2IGJpdCBBRDE4NDMgcmVnaXN0ZXIuCi0gKgotICogUmV0dXJucyB1bnNpZ25lZCByZWdpc3RlciB2YWx1ZSBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KLSAqLwotCi1zdGF0aWMgaW50IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoaXVtX3QgKmxpdGgsIGludCByZWcpCi17Ci0JaW50IHZhbDsKLQotCUFTU0VSVCghaW5faW50ZXJydXB0KCkpOwotCXNwaW5fbG9jaygmbGl0aC0+bG9jayk7Ci0JewotCQl2YWwgPSBsaV9hZDE4NDNfd2FpdChsaXRoKTsKLQkJaWYgKHZhbCA9PSAwKSB7Ci0JCQlsaV93cml0ZWwobGl0aCwgTElfQ09ERUNfQ09NTUFORCwgTElfQ0NfRElSX1JEIHwgcmVnKTsKLQkJCXZhbCA9IGxpX2FkMTg0M193YWl0KGxpdGgpOwotCQl9Ci0JCWlmICh2YWwgPT0gMCkKLQkJCXZhbCA9IGxpX3JlYWRsKGxpdGgsIExJX0NPREVDX0RBVEEpOwotCX0KLQlzcGluX3VubG9jaygmbGl0aC0+bG9jayk7Ci0KLQlEQkdYVigibGlfcmVhZF9hZDE4NDNfcmVnKGxpdGg9MHglcCwgcmVnPSVkKSByZXR1cm5zIDB4JTA0eFxuIiwKLQkgICAgICBsaXRoLCByZWcsIHZhbCk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi0vKgotICogbGlfd3JpdGVfYWQxODQzX3JlZyB3cml0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIDE2IGJpdCBBRDE4NDMgcmVnaXN0ZXIuCi0gKi8KLQotc3RhdGljIHZvaWQgbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoaXVtX3QgKmxpdGgsIGludCByZWcsIGludCBuZXd2YWwpCi17Ci0Jc3Bpbl9sb2NrKCZsaXRoLT5sb2NrKTsKLQl7Ci0JCWlmIChsaV9hZDE4NDNfd2FpdChsaXRoKSA9PSAwKSB7Ci0JCQlsaV93cml0ZWwobGl0aCwgTElfQ09ERUNfREFUQSwgbmV3dmFsKTsKLQkJCWxpX3dyaXRlbChsaXRoLCBMSV9DT0RFQ19DT01NQU5ELCBMSV9DQ19ESVJfV1IgfCByZWcpOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKLX0KLQotLyoKLSAqIGxpX3NldHVwX2RtYSBjYWxjdWxhdGVzIGFsbCB0aGUgcmVnaXN0ZXIgc2V0dGluZ3MgZm9yIERNQSBpbiBhIHBhcnRpY3VsYXIKLSAqIG1vZGUuICBJdCB0YWtlcyB0b28gbWFueSBhcmd1bWVudHMuCi0gKi8KLQotc3RhdGljIHZvaWQgbGlfc2V0dXBfZG1hKGRtYV9jaGFuX3QgKmNoYW4sCi0JCQkgY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjLAotCQkJIGxpdGhpdW1fdCAqbGl0aCwKLQkJCSB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9wYWRkciwKLQkJCSBpbnQgYnVmc2hpZnQsCi0JCQkgaW50IGZyYWdzaGlmdCwKLQkJCSBpbnQgY2hhbm5lbHMsCi0JCQkgaW50IHNhbXBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgbW9kZSwgZm9ybWF0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdG1hc2s7Ci0KLQlEQkdFVigiKGNoYW49MHglcCwgZGVzYz0weCVwLCBsaXRoPTB4JXAsIGJ1ZmZlcl9wYWRkcj0weCVseCwgIgotCSAgICAgImJ1ZnNoaWZ0PSVkLCBmcmFnc2hpZnQ9JWQsIGNoYW5uZWxzPSVkLCBzYW1wc2l6ZT0lZClcbiIsCi0JICAgICBjaGFuLCBkZXNjLCBsaXRoLCBidWZmZXJfcGFkZHIsCi0JICAgICBidWZzaGlmdCwgZnJhZ3NoaWZ0LCBjaGFubmVscywgc2FtcHNpemUpOwotCi0JLyogUmVzZXQgdGhlIGNoYW5uZWwgZmlyc3QuICovCi0KLQlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y3RscmVnLCBMSV9DQ1RMX1JFU0VUKTsKLQotCUFTU0VSVChjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IDIpOwotCWlmIChjaGFubmVscyA9PSAyKQotCQltb2RlID0gTElfQ0NGR19NT0RFX1NURVJFTzsKLQllbHNlCi0JCW1vZGUgPSBMSV9DQ0ZHX01PREVfTU9OTzsKLQlBU1NFUlQoc2FtcHNpemUgPT0gMSB8fCBzYW1wc2l6ZSA9PSAyKTsKLQlpZiAoc2FtcHNpemUgPT0gMikKLQkJZm9ybWF0ID0gTElfQ0NGR19GTVRfMTZCSVQ7Ci0JZWxzZQotCQlmb3JtYXQgPSBMSV9DQ0ZHX0ZNVF84QklUOwotCWNoYW4tPmRlc2MgPSBkZXNjOwotCWNoYW4tPmxpdGggPSBsaXRoOwotCi0JLyoKLQkgKiBMaXRoaXVtIERNQSBhZGRyZXNzIHJlZ2lzdGVyIHRha2VzIGEgNDAtYml0IHBoeXNpY2FsCi0JICogYWRkcmVzcywgcmlnaHQtc2hpZnRlZCBieSA4IHNvIGl0IGZpdHMgaW4gMzIgYml0cy4gIEJpdCAzNwotCSAqIG11c3QgYmUgc2V0IC0tIGl0IGVuYWJsZXMgY2FjaGUgY29oZXJlbmNlLgotCSAqLwotCi0JQVNTRVJUKCEoYnVmZmVyX3BhZGRyICYgMHhGRikpOwotCWNoYW4tPmJhc2V2YWwgPSAoYnVmZmVyX3BhZGRyID4+IDgpIHwgMSA8PCAoMzcgLSA4KTsKLQotCWNoYW4tPmNmZ3ZhbCA9ICgoY2hhbi0+Y2ZndmFsICYgfkxJX0NDRkdfTE9DSykgfAotCQkJU0hJRlRfRklFTEQoZGVzYy0+YWQxODQzX3Nsb3QsIExJX0NDRkdfU0xPVCkgfAotCQkJZGVzYy0+ZGlyZWN0aW9uIHwKLQkJCW1vZGUgfAotCQkJZm9ybWF0KTsKLQotCXNpemUgPSBidWZzaGlmdCAtIDY7Ci0JdG1hc2sgPSAxMyAtIGZyYWdzaGlmdDsJCS8qIFNlZSBMaXRoaXVtIERNQSBOb3RlcyBhYm92ZS4gKi8KLQlBU1NFUlQoc2l6ZSA+PSAyICYmIHNpemUgPD0gNyk7Ci0JQVNTRVJUKHRtYXNrID49IDEgJiYgdG1hc2sgPD0gNyk7Ci0JY2hhbi0+Y3RsdmFsID0gKChjaGFuLT5jdGx2YWwgJiB+TElfQ0NUTF9SRVNFVCkgfAotCQkJU0hJRlRfRklFTEQoc2l6ZSwgTElfQ0NUTF9TSVpFKSB8Ci0JCQkoY2hhbi0+Y3RsdmFsICYgfkxJX0NDVExfRE1BX0VOQUJMRSkgfAotCQkJU0hJRlRfRklFTEQodG1hc2ssIExJX0NDVExfVE1BU0spIHwKLQkJCVNISUZUX0ZJRUxEKDAsIExJX0NDVExfVFBUUikpOwotCi0JREJHUFYoImJhc2VyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5iYXNlcmVnLCBjaGFuLT5iYXNldmFsKTsKLQlEQkdQVigiY2ZncmVnIDB4JXggPSAweCVseFxuIiwgZGVzYy0+Y2ZncmVnLCBjaGFuLT5jZmd2YWwpOwotCURCR1BWKCJjdGxyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Ci0KLQlsaV93cml0ZWwobGl0aCwgZGVzYy0+YmFzZXJlZywgY2hhbi0+YmFzZXZhbCk7Ci0JbGlfd3JpdGVsKGxpdGgsIGRlc2MtPmNmZ3JlZywgY2hhbi0+Y2ZndmFsKTsKLQlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOwotCi0JREJHUlYoKTsKLX0KLQotc3RhdGljIHZvaWQgbGlfc2h1dGRvd25fZG1hKGRtYV9jaGFuX3QgKmNoYW4pCi17Ci0JbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKLQl2b2lkICogbGl0aDEgPSBsaXRoLT5wYWdlMTsKLQotCURCR0VWKCIoY2hhbj0weCVwKVxuIiwgY2hhbik7Ci0JCi0JY2hhbi0+Y3RsdmFsICY9IH5MSV9DQ1RMX0RNQV9FTkFCTEU7Ci0JREJHUFYoImN0bHJlZyAweCV4ID0gMHglbHhcbiIsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLQlsaV93cml0ZWwobGl0aCwgY2hhbi0+ZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOwotCi0JLyoKLQkgKiBPZmZzZXQgMHg1MDAgb24gTGl0aGl1bSBwYWdlIDEgaXMgYW4gdW5kb2N1bWVudGVkLAotCSAqIHVuc3VwcG9ydGVkIHJlZ2lzdGVyIHRoYXQgaG9sZHMgdGhlIHplcm8gc2FtcGxlIHZhbHVlLgotCSAqIExpdGhpdW0gaXMgc3VwcG9zZWQgdG8gb3V0cHV0IHplcm8gc2FtcGxlcyB3aGVuIERNQSBpcwotCSAqIGluYWN0aXZlLCBhbmQgcmVwZWF0IHRoZSBsYXN0IHNhbXBsZSB3aGVuIERNQSB1bmRlcmZsb3dzLgotCSAqIEJ1dCBpdCBoYXMgYSBidWcsIHdoZXJlLCBhZnRlciB1bmRlcmZsb3cgb2NjdXJzLCB0aGUgemVybwotCSAqIHNhbXBsZSBpcyBub3QgcmVzZXQuCi0JICoKLQkgKiBJIGV4cGVjdCB0aGlzIHRvIGJyZWFrIGluIGEgZnV0dXJlIHJldiBvZiBMaXRoaXVtLgotCSAqLwotCi0JaWYgKGxpdGgxICYmIGNoYW4tPmRlc2MtPmRpcmVjdGlvbiA9PSBMSV9DQ0ZHX0RJUl9PVVQpCi0JCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgxICsgMHg1MDApID0gMDsKLX0KLQotLyoKLSAqIGxpX2FjdGl2YXRlX2RtYSBhbHdheXMgc3RhcnRzIGRtYSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCi0gKgotICogTi5CLiwgdGhlc2UgbWF5IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdC4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpX2FjdGl2YXRlX2RtYShkbWFfY2hhbl90ICpjaGFuKQotewotCWNoYW4tPmN0bHZhbCB8PSBMSV9DQ1RMX0RNQV9FTkFCTEU7Ci0JREJHUFYoImN0bHZhbCA9IDB4JWx4XG4iLCBjaGFuLT5jdGx2YWwpOwotCWxpX3dyaXRlbChjaGFuLT5saXRoLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpX2RlYWN0aXZhdGVfZG1hKGRtYV9jaGFuX3QgKmNoYW4pCi17Ci0JbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKLQl2b2lkICogbGl0aDIgPSBsaXRoLT5wYWdlMjsKLQotCWNoYW4tPmN0bHZhbCAmPSB+KExJX0NDVExfRE1BX0VOQUJMRSB8IExJX0NDVExfUlBUUiB8IExJX0NDVExfV1BUUik7Ci0JREJHUFYoImN0bHZhbCA9IDB4JWx4XG4iLCBjaGFuLT5jdGx2YWwpOwotCURCR1BWKCJjdGxyZWcgMHgleCA9IDB4JWx4XG4iLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Ci0JbGlfd3JpdGVsKGxpdGgsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKLQotCS8qCi0JICogT2Zmc2V0cyAweDk4IGFuZCAweDlDIG9uIExpdGhpdW0gcGFnZSAyIGFyZSB1bmRvY3VtZW50ZWQsCi0JICogdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzIHRoYXQgYXJlIGludGVybmFsIGNvcGllcyBvZiB0aGUgRE1BCi0JICogcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMuICBCZWNhdXNlIG9mIGEgTGl0aGl1bSBidWcsIHRoZXNlCi0JICogcmVnaXN0ZXJzIGFyZW4ndCB6ZXJvZWQgY29ycmVjdGx5IHdoZW4gRE1BIGlzIHNodXQgb2ZmLiAgU28KLQkgKiB3ZSB3aGFjayB0aGVtIGRpcmVjdGx5LgotCSAqCi0JICogSSBleHBlY3QgdGhpcyB0byBicmVhayBpbiBhIGZ1dHVyZSByZXYgb2YgTGl0aGl1bS4KLQkgKi8KLQotCWlmIChsaXRoMiAmJiBjaGFuLT5kZXNjLT5kaXJlY3Rpb24gPT0gTElfQ0NGR19ESVJfT1VUKSB7Ci0JCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgyICsgMHg5OCkgPSAwOwotCQkqICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChsaXRoMiArIDB4OUMpID0gMDsKLQl9Ci19Ci0KLS8qCi0gKiByZWFkL3dyaXRlIHRoZSByaW5nIGJ1ZmZlciBwb2ludGVycy4gIFRoZXNlIHJvdXRpbmVzJyBhcmd1bWVudHMgYW5kIHJlc3VsdHMKLSAqIGFyZSBieXRlIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nIGJ1ZmZlci4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgbGlfcmVhZF9zd3B0cihkbWFfY2hhbl90ICpjaGFuKQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzayA9IGNoYW4tPmRlc2MtPnN3cHRybWFzazsKLQotCXJldHVybiBDSFVOS1NfVE9fQllURVMoVU5TSElGVF9GSUVMRChjaGFuLT5jdGx2YWwsIG1hc2spKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IGxpX3JlYWRfaHdwdHIoZG1hX2NoYW5fdCAqY2hhbikKLXsKLQlyZXR1cm4gQ0hVTktTX1RPX0JZVEVTKGxpX3JlYWRiKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPmh3cHRycmVnKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfd3JpdGVfc3dwdHIoZG1hX2NoYW5fdCAqY2hhbiwgaW50IHZhbCkKLXsKLQljb25zdCB1bnNpZ25lZCBsb25nIG1hc2sgPSBjaGFuLT5kZXNjLT5zd3B0cm1hc2s7Ci0KLQlBU1NFUlQoISh2YWwgJiB+Q0hVTktTX1RPX0JZVEVTKDB4RkYpKSk7Ci0JdmFsID0gQllURVNfVE9fQ0hVTktTKHZhbCk7Ci0JY2hhbi0+Y3RsdmFsID0gKGNoYW4tPmN0bHZhbCAmIH5tYXNrKSB8IFNISUZUX0ZJRUxEKHZhbCwgbWFzayk7Ci0JbGlfd3JpdGViKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPnN3cHRycmVnLCB2YWwpOwotfQotCi0vKiBsaV9yZWFkX1VTVE1TQygpIHJldHVybnMgYSBVU1QvTVNDIHBhaXIgZm9yIHRoZSBnaXZlbiBjaGFubmVsLiAqLwotCi1zdGF0aWMgdm9pZCBsaV9yZWFkX1VTVE1TQyhkbWFfY2hhbl90ICpjaGFuLCB1c3Rtc2NfdCAqdXN0bXNjKQotewotCWxpdGhpdW1fdCAqbGl0aCA9IGNoYW4tPmxpdGg7Ci0JY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjID0gY2hhbi0+ZGVzYzsKLQl1bnNpZ25lZCBsb25nIG5vd19sb3csIG5vd19oaWdoMCwgbm93X2hpZ2gxLCBjaGFuX3VzdDsKLQotCXNwaW5fbG9jaygmbGl0aC0+bG9jayk7Ci0JewotCQkvKgotCQkgKiByZXRyeSB1bnRpbCB3ZSBkbyBhbGwgZml2ZSByZWFkcyB3aXRob3V0IHRoZQotCQkgKiBoaWdoIHdvcmQgY2hhbmdpbmcuICAoSGlnaCB3b3JkIGluY3JlbWVudHMKLQkJICogZXZlcnkgMl4zMiBtaWNyb3NlY29uZHMsIGkuZS4sIG5vdCBvZnRlbikKLQkJICovCi0JCWRvIHsKLQkJCW5vd19oaWdoMCA9IGxpX3JlYWRsKGxpdGgsIExJX1VTVF9ISUdIKTsKLQkJCW5vd19sb3cgPSBsaV9yZWFkbChsaXRoLCBMSV9VU1RfTE9XKTsKLQotCQkJLyoKLQkJCSAqIExpdGhpdW0gZ3VhcmFudGVlcyB0aGVzZSB0d28gcmVhZHMgd2lsbCBiZQotCQkJICogYXRvbWljIC0tIHVzdCB3aWxsIG5vdCBpbmNyZW1lbnQgYWZ0ZXIgbXNjCi0JCQkgKiBpcyByZWFkLgotCQkJICovCi0KLQkJCXVzdG1zYy0+bXNjID0gbGlfcmVhZGwobGl0aCwgZGVzYy0+bXNjcmVnKTsKLQkJCWNoYW5fdXN0ID0gbGlfcmVhZGwobGl0aCwgZGVzYy0+dXN0cmVnKTsKLQotCQkJbm93X2hpZ2gxID0gbGlfcmVhZGwobGl0aCwgTElfVVNUX0hJR0gpOwotCQl9IHdoaWxlIChub3dfaGlnaDAgIT0gbm93X2hpZ2gxKTsKLQl9CQotCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKLQl1c3Rtc2MtPnVzdCA9ICgodW5zaWduZWQgbG9uZyBsb25nKSBub3dfaGlnaDAgPDwgMzIgfCBjaGFuX3VzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpX2VuYWJsZV9pbnRlcnJ1cHRzKGxpdGhpdW1fdCAqbGl0aCwgdW5zaWduZWQgaW50IG1hc2spCi17Ci0JREJHRVYoIihsaXRoPTB4JXAsIG1hc2s9MHgleClcbiIsIGxpdGgsIG1hc2spOwotCi0JLyogY2xlYXIgYW55IGFscmVhZHktcGVuZGluZyBpbnRlcnJ1cHRzLiAqLwotCi0JbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCBtYXNrKTsKLQotCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4gKi8KLQotCW1hc2sgfD0gbGlfcmVhZGwobGl0aCwgTElfSU5UUl9NQVNLKTsKLQlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9NQVNLLCBtYXNrKTsKLX0KLQotc3RhdGljIHZvaWQgbGlfZGlzYWJsZV9pbnRlcnJ1cHRzKGxpdGhpdW1fdCAqbGl0aCwgdW5zaWduZWQgaW50IG1hc2spCi17Ci0JdW5zaWduZWQgaW50IGtlZXBtYXNrOwotCi0JREJHRVYoIihsaXRoPTB4JXAsIG1hc2s9MHgleClcbiIsIGxpdGgsIG1hc2spOwotCi0JLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0cyAqLwotCi0Ja2VlcG1hc2sgPSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX01BU0spICYgfm1hc2s7Ci0JbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfTUFTSywga2VlcG1hc2spOwotCi0JLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KLQotCWxpX3dyaXRlbChsaXRoLCBMSV9JTlRSX1NUQVRVUywgbWFzayk7Ci19Ci0KLS8qIEdldCB0aGUgaW50ZXJydXB0IHN0YXR1cyBhbmQgY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBsaV9nZXRfY2xlYXJfaW50cl9zdGF0dXMobGl0aGl1bV90ICpsaXRoKQotewotCXVuc2lnbmVkIGludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX1NUQVRVUyk7Ci0JbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCB+MCk7Ci0JcmV0dXJuIHN0YXR1cyAmIGxpX3JlYWRsKGxpdGgsIExJX0lOVFJfTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbnQgbGlfaW5pdChsaXRoaXVtX3QgKmxpdGgpCi17Ci0JLyogMS4gU3lzdGVtIHBvd2VyIHN1cHBsaWVzIHN0YWJpbGl6ZS4gKi8KLQotCS8qIDIuIEFzc2VydCB0aGUgflJFU0VUIHNpZ25hbC4gKi8KLQotCWxpX3dyaXRlbChsaXRoLCBMSV9IT1NUX0NPTlRST0xMRVIsIExJX0hDX1JFU0VUKTsKLQl1ZGVsYXkoMSk7Ci0KLQkvKiAzLiBEZWFzc2VydCB0aGUgflJFU0VUIHNpZ25hbCBhbmQgZW50ZXIgYSB3YWl0IHBlcmlvZCB0byBhbGxvdwotCSAgIHRoZSBBRDE4NDMgaW50ZXJuYWwgY2xvY2tzIGFuZCB0aGUgZXh0ZXJuYWwgY3J5c3RhbCBvc2NpbGxhdG9yCi0JICAgdG8gc3RhYmlsaXplLiAqLwotCi0JbGlfd3JpdGVsKGxpdGgsIExJX0hPU1RfQ09OVFJPTExFUiwgTElfSENfTElOS19FTkFCTEUpOwotCXVkZWxheSgxKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBRDE4NDMgYWNjZXNzICovCi0KLS8qCi0gKiBBRDE4NDMgYml0ZmllbGQgZGVmaW5pdGlvbnMuICBBbGwgYXJlIG5hbWVkIGFzIGluIHRoZSBBRDE4NDMgZGF0YQotICogc2hlZXQsIHdpdGggYWQxODQzXyBwcmVwZW5kZWQgYW5kIGluZGl2aWR1YWwgYml0IG51bWJlcnMgcmVtb3ZlZC4KLSAqCi0gKiBFLmcuLCBiaXRzIExTUzAgdGhyb3VnaCBMU1MyIGJlY29tZSBhZDE4NDNfTFNTLgotICoKLSAqIE9ubHkgdGhlIGJpdGZpZWxkcyB3ZSBuZWVkIGFyZSBkZWZpbmVkLgotICovCi0KLXR5cGVkZWYgc3RydWN0IGFkMTg0M19iaXRmaWVsZCB7Ci0JY2hhciByZWc7Ci0JY2hhciBsb19iaXQ7Ci0JY2hhciBuYml0czsKLX0gYWQxODQzX2JpdGZpZWxkX3Q7Ci0KLXN0YXRpYyBjb25zdCBhZDE4NDNfYml0ZmllbGRfdAotCWFkMTg0M19QRE5PICAgPSB7ICAwLCAxNCwgIDEgfSwJLyogQ29udmVydGVyIFBvd2VyLURvd24gRmxhZyAqLwotCWFkMTg0M19JTklUICAgPSB7ICAwLCAxNSwgIDEgfSwJLyogQ2xvY2sgSW5pdGlhbGl6YXRpb24gRmxhZyAqLwotCWFkMTg0M19SSUcgICAgPSB7ICAyLCAgMCwgIDQgfSwJLyogUmlnaHQgQURDIElucHV0IEdhaW4gKi8KLQlhZDE4NDNfUk1HRSAgID0geyAgMiwgIDQsICAxIH0sCS8qIFJpZ2h0IEFEQyBNaWMgR2FpbiBFbmFibGUgKi8KLQlhZDE4NDNfUlNTICAgID0geyAgMiwgIDUsICAzIH0sCS8qIFJpZ2h0IEFEQyBTb3VyY2UgU2VsZWN0ICovCi0JYWQxODQzX0xJRyAgICA9IHsgIDIsICA4LCAgNCB9LAkvKiBMZWZ0IEFEQyBJbnB1dCBHYWluICovCi0JYWQxODQzX0xNR0UgICA9IHsgIDIsIDEyLCAgMSB9LAkvKiBMZWZ0IEFEQyBNaWMgR2FpbiBFbmFibGUgKi8KLQlhZDE4NDNfTFNTICAgID0geyAgMiwgMTMsICAzIH0sCS8qIExlZnQgQURDIFNvdXJjZSBTZWxlY3QgKi8KLQlhZDE4NDNfUlgxTSAgID0geyAgNCwgIDAsICA1IH0sCS8qIFJpZ2h0IEF1eCAxIE1peCBHYWluL0F0dGVuICovCi0JYWQxODQzX1JYMU1NICA9IHsgIDQsICA3LCAgMSB9LAkvKiBSaWdodCBBdXggMSBNaXggTXV0ZSAqLwotCWFkMTg0M19MWDFNICAgPSB7ICA0LCAgOCwgIDUgfSwJLyogTGVmdCBBdXggMSBNaXggR2Fpbi9BdHRlbiAqLwotCWFkMTg0M19MWDFNTSAgPSB7ICA0LCAxNSwgIDEgfSwJLyogTGVmdCBBdXggMSBNaXggTXV0ZSAqLwotCWFkMTg0M19SWDJNICAgPSB7ICA1LCAgMCwgIDUgfSwJLyogUmlnaHQgQXV4IDIgTWl4IEdhaW4vQXR0ZW4gKi8KLQlhZDE4NDNfUlgyTU0gID0geyAgNSwgIDcsICAxIH0sCS8qIFJpZ2h0IEF1eCAyIE1peCBNdXRlICovCi0JYWQxODQzX0xYMk0gICA9IHsgIDUsICA4LCAgNSB9LAkvKiBMZWZ0IEF1eCAyIE1peCBHYWluL0F0dGVuICovCi0JYWQxODQzX0xYMk1NICA9IHsgIDUsIDE1LCAgMSB9LAkvKiBMZWZ0IEF1eCAyIE1peCBNdXRlICovCi0JYWQxODQzX1JNQ00gICA9IHsgIDcsICAwLCAgNSB9LAkvKiBSaWdodCBNaWMgTWl4IEdhaW4vQXR0ZW4gKi8KLQlhZDE4NDNfUk1DTU0gID0geyAgNywgIDcsICAxIH0sCS8qIFJpZ2h0IE1pYyBNaXggTXV0ZSAqLwotCWFkMTg0M19MTUNNICAgPSB7ICA3LCAgOCwgIDUgfSwJLyogTGVmdCBNaWMgTWl4IEdhaW4vQXR0ZW4gKi8KLQlhZDE4NDNfTE1DTU0gID0geyAgNywgMTUsICAxIH0sCS8qIExlZnQgTWljIE1peCBNdXRlICovCi0JYWQxODQzX0hQT1MgICA9IHsgIDgsICA0LCAgMSB9LAkvKiBIZWFkcGhvbmUgT3V0cHV0IFZvbHRhZ2UgU3dpbmcgKi8KLQlhZDE4NDNfSFBPTSAgID0geyAgOCwgIDUsICAxIH0sCS8qIEhlYWRwaG9uZSBPdXRwdXQgTXV0ZSAqLwotCWFkMTg0M19SREExRyAgPSB7ICA5LCAgMCwgIDYgfSwJLyogUmlnaHQgREFDMSBBbmFsb2cvRGlnaXRhbCBHYWluICovCi0JYWQxODQzX1JEQTFHTSA9IHsgIDksICA3LCAgMSB9LAkvKiBSaWdodCBEQUMxIEFuYWxvZyBNdXRlICovCi0JYWQxODQzX0xEQTFHICA9IHsgIDksICA4LCAgNiB9LAkvKiBMZWZ0IERBQzEgQW5hbG9nL0RpZ2l0YWwgR2FpbiAqLwotCWFkMTg0M19MREExR00gPSB7ICA5LCAxNSwgIDEgfSwJLyogTGVmdCBEQUMxIEFuYWxvZyBNdXRlICovCi0JYWQxODQzX1JEQTFBTSA9IHsgMTEsICA3LCAgMSB9LAkvKiBSaWdodCBEQUMxIERpZ2l0YWwgTXV0ZSAqLwotCWFkMTg0M19MREExQU0gPSB7IDExLCAxNSwgIDEgfSwJLyogTGVmdCBEQUMxIERpZ2l0YWwgTXV0ZSAqLwotCWFkMTg0M19BRExDICAgPSB7IDE1LCAgMCwgIDIgfSwJLyogQURDIExlZnQgU2FtcGxlIFJhdGUgU291cmNlICovCi0JYWQxODQzX0FEUkMgICA9IHsgMTUsICAyLCAgMiB9LAkvKiBBREMgUmlnaHQgU2FtcGxlIFJhdGUgU291cmNlICovCi0JYWQxODQzX0RBMUMgICA9IHsgMTUsICA4LCAgMiB9LAkvKiBEQUMxIFNhbXBsZSBSYXRlIFNvdXJjZSAqLwotCWFkMTg0M19DMUMgICAgPSB7IDE3LCAgMCwgMTYgfSwJLyogQ2xvY2sgMSBTYW1wbGUgUmF0ZSBTZWxlY3QgKi8KLQlhZDE4NDNfQzJDICAgID0geyAyMCwgIDAsIDE2IH0sCS8qIENsb2NrIDEgU2FtcGxlIFJhdGUgU2VsZWN0ICovCi0JYWQxODQzX0RBQURMICA9IHsgMjUsICA0LCAgMiB9LAkvKiBEaWdpdGFsIEFEQyBMZWZ0IFNvdXJjZSBTZWxlY3QgKi8KLQlhZDE4NDNfREFBRFIgID0geyAyNSwgIDYsICAyIH0sCS8qIERpZ2l0YWwgQURDIFJpZ2h0IFNvdXJjZSBTZWxlY3QgKi8KLQlhZDE4NDNfRFJTRkxUID0geyAyNSwgMTUsICAxIH0sCS8qIERpZ2l0YWwgUmVhbXBsZXIgRmlsdGVyIE1vZGUgKi8KLQlhZDE4NDNfQURMRiAgID0geyAyNiwgIDAsICAyIH0sIC8qIEFEQyBMZWZ0IENoYW5uZWwgRGF0YSBGb3JtYXQgKi8KLQlhZDE4NDNfQURSRiAgID0geyAyNiwgIDIsICAyIH0sIC8qIEFEQyBSaWdodCBDaGFubmVsIERhdGEgRm9ybWF0ICovCi0JYWQxODQzX0FEVExLICA9IHsgMjYsICA0LCAgMSB9LAkvKiBBREMgVHJhbnNtaXQgTG9jayBNb2RlIFNlbGVjdCAqLwotCWFkMTg0M19TQ0YgICAgPSB7IDI2LCAgNywgIDEgfSwJLyogU0NMSyBGcmVxdWVuY3kgU2VsZWN0ICovCi0JYWQxODQzX0RBMUYgICA9IHsgMjYsICA4LCAgMiB9LAkvKiBEQUMxIERhdGEgRm9ybWF0IFNlbGVjdCAqLwotCWFkMTg0M19EQTFTTSAgPSB7IDI2LCAxNCwgIDEgfSwJLyogREFDMSBTdGVyZW8vTW9ubyBNb2RlIFNlbGVjdCAqLwotCWFkMTg0M19BRExFTiAgPSB7IDI3LCAgMCwgIDEgfSwJLyogQURDIExlZnQgQ2hhbm5lbCBFbmFibGUgKi8KLQlhZDE4NDNfQURSRU4gID0geyAyNywgIDEsICAxIH0sCS8qIEFEQyBSaWdodCBDaGFubmVsIEVuYWJsZSAqLwotCWFkMTg0M19BQU1FTiAgPSB7IDI3LCAgNCwgIDEgfSwJLyogQW5hbG9nIHRvIEFuYWxvZyBNaXggRW5hYmxlICovCi0JYWQxODQzX0FOQUVOICA9IHsgMjcsICA3LCAgMSB9LAkvKiBBbmFsb2cgQ2hhbm5lbCBFbmFibGUgKi8KLQlhZDE4NDNfREExRU4gID0geyAyNywgIDgsICAxIH0sCS8qIERBQzEgRW5hYmxlICovCi0JYWQxODQzX0RBMkVOICA9IHsgMjcsICA5LCAgMSB9LAkvKiBEQUMyIEVuYWJsZSAqLwotCWFkMTg0M19DMUVOICAgPSB7IDI4LCAxMSwgIDEgfSwJLyogQ2xvY2sgR2VuZXJhdG9yIDEgRW5hYmxlICovCi0JYWQxODQzX0MyRU4gICA9IHsgMjgsIDEyLCAgMSB9LAkvKiBDbG9jayBHZW5lcmF0b3IgMiBFbmFibGUgKi8KLQlhZDE4NDNfUEROSSAgID0geyAyOCwgMTUsICAxIH07CS8qIENvbnZlcnRlciBQb3dlciBEb3duICovCi0KLS8qCi0gKiBUaGUgdmFyaW91cyByZWdpc3RlcnMgb2YgdGhlIEFEMTg0MyB1c2UgdGhyZWUgZGlmZmVyZW50IGZvcm1hdHMgZm9yCi0gKiBzcGVjaWZ5aW5nIGdhaW4uICBUaGUgYWQxODQzX2dhaW4gc3RydWN0dXJlIHBhcmFtZXRlcml6ZXMgdGhlCi0gKiBmb3JtYXRzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IGFkMTg0M19nYWluIHsKLQotCWludAluZWdhdGl2ZTsJCS8qIG5vbnplcm8gaWYgZ2FpbiBpcyBuZWdhdGl2ZS4gKi8KLQljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqbGZpZWxkOwotCWNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpyZmllbGQ7Ci0KLX0gYWQxODQzX2dhaW5fdDsKLQotc3RhdGljIGNvbnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5fUkVDTEVWCi0JCQkJPSB7IDAsICZhZDE4NDNfTElHLCAgICZhZDE4NDNfUklHIH07Ci1zdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9MSU5FCi0JCQkJPSB7IDEsICZhZDE4NDNfTFgxTSwgICZhZDE4NDNfUlgxTSB9Owotc3RhdGljIGNvbnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5fQ0QKLQkJCQk9IHsgMSwgJmFkMTg0M19MWDJNLCAgJmFkMTg0M19SWDJNIH07Ci1zdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9NSUMKLQkJCQk9IHsgMSwgJmFkMTg0M19MTUNNLCAgJmFkMTg0M19STUNNIH07Ci1zdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9QQ00KLQkJCQk9IHsgMSwgJmFkMTg0M19MREExRywgJmFkMTg0M19SREExRyB9OwotCi0vKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIEFEMTg0MyBiaXRmaWVsZC4gKi8KLQotc3RhdGljIGludCBhZDE4NDNfcmVhZF9iaXRzKGxpdGhpdW1fdCAqbGl0aCwgY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKmZpZWxkKQotewotCWludCB3ID0gbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGgsIGZpZWxkLT5yZWcpOwotCWludCB2YWwgPSB3ID4+IGZpZWxkLT5sb19iaXQgJiAoKDEgPDwgZmllbGQtPm5iaXRzKSAtIDEpOwotCi0JREJHWFYoImFkMTg0M19yZWFkX2JpdHMobGl0aD0weCVwLCBmaWVsZC0+eyVkICVkICVkfSkgcmV0dXJucyAweCV4XG4iLAotCSAgICAgIGxpdGgsIGZpZWxkLT5yZWcsIGZpZWxkLT5sb19iaXQsIGZpZWxkLT5uYml0cywgdmFsKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiB3cml0ZSBhIG5ldyB2YWx1ZSB0byBhbiBBRDE4NDMgYml0ZmllbGQgYW5kIHJldHVybiB0aGUgb2xkIHZhbHVlLgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX3dyaXRlX2JpdHMobGl0aGl1bV90ICpsaXRoLAotCQkJICAgICBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZmllbGQsCi0JCQkgICAgIGludCBuZXd2YWwpCi17Ci0JaW50IHcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZyk7Ci0JaW50IG1hc2sgPSAoKDEgPDwgZmllbGQtPm5iaXRzKSAtIDEpIDw8IGZpZWxkLT5sb19iaXQ7Ci0JaW50IG9sZHZhbCA9ICh3ICYgbWFzaykgPj4gZmllbGQtPmxvX2JpdDsKLQlpbnQgbmV3Yml0cyA9IChuZXd2YWwgPDwgZmllbGQtPmxvX2JpdCkgJiBtYXNrOwotCXcgPSAodyAmIH5tYXNrKSB8IG5ld2JpdHM7Ci0JKHZvaWQpIGxpX3dyaXRlX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZywgdyk7Ci0KLQlEQkdYVigiYWQxODQzX3dyaXRlX2JpdHMobGl0aD0weCVwLCBmaWVsZC0+eyVkICVkICVkfSwgdmFsPTB4JXgpICIKLQkgICAgICAicmV0dXJucyAweCV4XG4iLAotCSAgICAgIGxpdGgsIGZpZWxkLT5yZWcsIGZpZWxkLT5sb19iaXQsIGZpZWxkLT5uYml0cywgbmV3dmFsLAotCSAgICAgIG9sZHZhbCk7Ci0KLQlyZXR1cm4gb2xkdmFsOwotfQotCi0vKgotICogYWQxODQzX3JlYWRfbXVsdGkgcmVhZHMgbXVsdGlwbGUgYml0ZmllbGRzIGZyb20gdGhlIHNhbWUgQUQxODQzCi0gKiByZWdpc3Rlci4gIEl0IHVzZXMgYSBzaW5nbGUgcmVhZCBjeWNsZSB0byBkbyBpdC4gIChSZWFkaW5nIHRoZQotICogYWQxODQzIHJlcXVpcmVzIDI1NiBiaXQgdGltZXMgYXQgMTIuMjg4IE1Ieiwgb3IgbmVhcmx5IDIwCi0gKiBtaWNyb3NlY29uZHMuKQotICoKLSAqIENhbGxlZCBpa2UgdGhpcy4KLSAqCi0gKiAgYWQxODQzX3JlYWRfbXVsdGkobGl0aCwgbmZpZWxkcywKLSAqCQkgICAgICAmYWQxODQzX0ZJRUxEMSwgJnZhbDEsCi0gKgkJICAgICAgJmFkMTg0M19GSUVMRDIsICZ2YWwyLCAuLi4pOwotICovCi0KLXN0YXRpYyB2b2lkIGFkMTg0M19yZWFkX211bHRpKGxpdGhpdW1fdCAqbGl0aCwgaW50IGFyZ2NvdW50LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZnA7Ci0JaW50IHcgPSAwLCBtYXNrLCAqdmFsdWUsIHJlZyA9IC0xOwotCi0JdmFfc3RhcnQoYXAsIGFyZ2NvdW50KTsKLQl3aGlsZSAoLS1hcmdjb3VudCA+PSAwKSB7Ci0JCWZwID0gdmFfYXJnKGFwLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqKTsKLQkJdmFsdWUgPSB2YV9hcmcoYXAsIGludCAqKTsKLQkJaWYgKHJlZyA9PSAtMSkgewotCQkJcmVnID0gZnAtPnJlZzsKLQkJCXcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgcmVnKTsKLQkJfQotCQlBU1NFUlQocmVnID09IGZwLT5yZWcpOwotCQltYXNrID0gKDEgPDwgZnAtPm5iaXRzKSAtIDE7Ci0JCSp2YWx1ZSA9IHcgPj4gZnAtPmxvX2JpdCAmIG1hc2s7Ci0JfQotCXZhX2VuZChhcCk7Ci19Ci0KLS8qCi0gKiBhZDE4NDNfd3JpdGVfbXVsdGkgc3RvcmVzIG11bHRpcGxlIGJpdGZpZWxkcyBpbnRvIHRoZSBzYW1lIEFEMTg0MwotICogcmVnaXN0ZXIuICBJdCB1c2VzIG9uZSByZWFkIGFuZCBvbmUgd3JpdGUgY3ljbGUgdG8gZG8gaXQuCi0gKgotICogQ2FsbGVkIGxpa2UgdGhpcy4KLSAqCi0gKiAgYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIG5maWVsZHMsCi0gKgkJICAgICAgICZhZDE4NDNfRklFTEQxLCB2YWwxLAotICoJCSAgICAgICAmYWQxODQzX0ZJRUxGMiwgdmFsMiwgLi4uKTsKLSAqLwotCi1zdGF0aWMgdm9pZCBhZDE4NDNfd3JpdGVfbXVsdGkobGl0aGl1bV90ICpsaXRoLCBpbnQgYXJnY291bnQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCWludCByZWc7Ci0JY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKmZwOwotCWludCB2YWx1ZTsKLQlpbnQgdywgbSwgbWFzaywgYml0czsKLQotCW1hc2sgPSAwOwotCWJpdHMgPSAwOwotCXJlZyA9IC0xOwotCi0JdmFfc3RhcnQoYXAsIGFyZ2NvdW50KTsKLQl3aGlsZSAoLS1hcmdjb3VudCA+PSAwKSB7Ci0JCWZwID0gdmFfYXJnKGFwLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqKTsKLQkJdmFsdWUgPSB2YV9hcmcoYXAsIGludCk7Ci0JCWlmIChyZWcgPT0gLTEpCi0JCQlyZWcgPSBmcC0+cmVnOwotCQlBU1NFUlQoZnAtPnJlZyA9PSByZWcpOwotCQltID0gKCgxIDw8IGZwLT5uYml0cykgLSAxKSA8PCBmcC0+bG9fYml0OwotCQltYXNrIHw9IG07Ci0JCWJpdHMgfD0gKHZhbHVlIDw8IGZwLT5sb19iaXQpICYgbTsKLQl9Ci0JdmFfZW5kKGFwKTsKLQlBU1NFUlQoIShiaXRzICYgfm1hc2spKTsKLQlpZiAofm1hc2sgJiAweEZGRkYpCi0JCXcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgcmVnKTsKLQllbHNlCi0JCXcgPSAwOwotCXcgPSAodyAmIH5tYXNrKSB8IGJpdHM7Ci0JKHZvaWQpIGxpX3dyaXRlX2FkMTg0M19yZWcobGl0aCwgcmVnLCB3KTsKLX0KLQotLyoKLSAqIGFkMTg0M19nZXRfZ2FpbiByZWFkcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFuZCBleHRyYWN0cyB0aGUgZ2FpbiB2YWx1ZQotICogdXNpbmcgdGhlIHN1cHBsaWVkIGdhaW4gdHlwZS4gIEl0IHJldHVybnMgdGhlIGdhaW4gaW4gT1NTIGZvcm1hdC4KLSAqLwotCi1zdGF0aWMgaW50IGFkMTg0M19nZXRfZ2FpbihsaXRoaXVtX3QgKmxpdGgsIGNvbnN0IGFkMTg0M19nYWluX3QgKmdwKQotewotCWludCBsZywgcmc7Ci0JdW5zaWduZWQgc2hvcnQgbWFzayA9ICgxIDw8IGdwLT5sZmllbGQtPm5iaXRzKSAtIDE7Ci0KLQlhZDE4NDNfcmVhZF9tdWx0aShsaXRoLCAyLCBncC0+bGZpZWxkLCAmbGcsIGdwLT5yZmllbGQsICZyZyk7Ci0JaWYgKGdwLT5uZWdhdGl2ZSkgewotCQlsZyA9IG1hc2sgLSBsZzsKLQkJcmcgPSBtYXNrIC0gcmc7Ci0JfQotCWxnID0gKGxnICogMTAwICsgKG1hc2sgPj4gMSkpIC8gbWFzazsKLQlyZyA9IChyZyAqIDEwMCArIChtYXNrID4+IDEpKSAvIG1hc2s7Ci0JcmV0dXJuIGxnIDw8IDAgfCByZyA8PCA4OwotfQotCi0vKgotICogU2V0IGFuIGF1ZGlvIGNoYW5uZWwncyBnYWluLiBDb252ZXJ0cyBmcm9tIE9TUyBmb3JtYXQgdG8gQUQxODQzJ3MKLSAqIGZvcm1hdC4KLSAqCi0gKiBSZXR1cm5zIHRoZSBuZXcgZ2Fpbiwgd2hpY2ggbWF5IGJlIGxvd2VyIHRoYW4gdGhlIG9sZCBnYWluLgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX3NldF9nYWluKGxpdGhpdW1fdCAqbGl0aCwKLQkJCSAgIGNvbnN0IGFkMTg0M19nYWluX3QgKmdwLAotCQkJICAgaW50IG5ld3ZhbCkKLXsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrID0gKDEgPDwgZ3AtPmxmaWVsZC0+bmJpdHMpIC0gMTsKLQotCWludCBsZyA9IG5ld3ZhbCA+PiAwICYgMHhGRjsKLQlpbnQgcmcgPSBuZXd2YWwgPj4gODsKLQlpZiAobGcgPCAwIHx8IGxnID4gMTAwIHx8IHJnIDwgMCB8fCByZyA+IDEwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbGcgPSAobGcgKiBtYXNrICsgKG1hc2sgPj4gMSkpIC8gMTAwOwotCXJnID0gKHJnICogbWFzayArIChtYXNrID4+IDEpKSAvIDEwMDsKLQlpZiAoZ3AtPm5lZ2F0aXZlKSB7Ci0JCWxnID0gbWFzayAtIGxnOwotCQlyZyA9IG1hc2sgLSByZzsKLQl9Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsIGdwLT5sZmllbGQsIGxnLCBncC0+cmZpZWxkLCByZyk7Ci0JcmV0dXJuIGFkMTg0M19nZXRfZ2FpbihsaXRoLCBncCk7Ci19Ci0KLS8qIFJldHVybnMgdGhlIGN1cnJlbnQgcmVjb3JkaW5nIHNvdXJjZSwgaW4gT1NTIGZvcm1hdC4gKi8KLQotc3RhdGljIGludCBhZDE4NDNfZ2V0X3JlY3NyYyhsaXRoaXVtX3QgKmxpdGgpCi17Ci0JaW50IGxzID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xTUyk7Ci0KLQlzd2l0Y2ggKGxzKSB7Ci0JY2FzZSAxOgotCQlyZXR1cm4gU09VTkRfTUFTS19NSUM7Ci0JY2FzZSAyOgotCQlyZXR1cm4gU09VTkRfTUFTS19MSU5FOwotCWNhc2UgMzoKLQkJcmV0dXJuIFNPVU5EX01BU0tfQ0Q7Ci0JY2FzZSA2OgotCQlyZXR1cm4gU09VTkRfTUFTS19QQ007Ci0JZGVmYXVsdDoKLQkJQVNTRVJUKDApOwotCQlyZXR1cm4gLTE7Ci0JfQotfQotCi0vKgotICogRW5hYmxlL2Rpc2FibGUgZGlnaXRhbCByZXNhbXBsZSBtb2RlIGluIHRoZSBBRDE4NDMuCi0gKgotICogVGhlIEFEMTg0MyByZXF1aXJlcyB0aGF0IEFETCwgQURSLCBEQTEgYW5kIERBMiBiZSBwb3dlcmVkIGRvd24KLSAqIHdoaWxlIHN3aXRjaGluZyBtb2Rlcy4gIFNvIHdlIHNhdmUgREExJ3Mgc3RhdGUgKERBMidzIHN0YXRlIGlzIG5vdAotICogaW50ZXJlc3RpbmcpLCBwb3dlciB0aGVtIGRvd24sIHN3aXRjaCBpbnRvL291dCBvZiByZXNhbXBsZSBtb2RlLAotICogcG93ZXIgdGhlbSB1cCwgYW5kIHJlc3RvcmUgc3RhdGUuCi0gKgotICogVGhpcyB3aWxsIGNhdXNlIGF1ZGlibGUgZ2xpdGNoZXMgaWYgRC9BIG9yIEEvRCBpcyBnb2luZyBvbiwgc28gdGhlCi0gKiBkcml2ZXIgZGlzYWxsb3dzIHRoYXQgKGluIG1peGVyX3dyaXRlX2lvY3RsKCkpLgotICoKLSAqIFRoZSBvcGVuIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIHdvcnRoIGRvaW5nPyAgSSdtIGxlYXZpbmcgaXQgaW4sCi0gKiBiZWNhdXNlIGl0J3Mgd3JpdHRlbiwgYnV0Li4uCi0gKi8KLQotc3RhdGljIHZvaWQgYWQxODQzX3NldF9yZXNhbXBsZV9tb2RlKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9ub2ZmKQotewotCS8qIFNhdmUgREExIG11dGUgYW5kIGdhaW4gKGFkZHIgOSBpcyBEQTEgYW5hbG9nIGdhaW4vYXR0ZW51YXRpb24pICovCi0JaW50IHNhdmVfZGExID0gbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGgsIDkpOwotCi0JLyogUG93ZXIgZG93biBBL0QgYW5kIEQvQS4gKi8KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgNCwKLQkJCSAgICZhZDE4NDNfREExRU4sIDAsCi0JCQkgICAmYWQxODQzX0RBMkVOLCAwLAotCQkJICAgJmFkMTg0M19BRExFTiwgMCwKLQkJCSAgICZhZDE4NDNfQURSRU4sIDApOwotCi0JLyogU3dpdGNoIG1vZGUgKi8KLQlBU1NFUlQob25vZmYgPT0gMCB8fCBvbm9mZiA9PSAxKTsKLQlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0RSU0ZMVCwgb25vZmYpOwotCi0gCS8qIFBvd2VyIHVwIEEvRCBhbmQgRC9BLiAqLwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAzLAotCQkJICAgJmFkMTg0M19EQTFFTiwgMSwKLQkJCSAgICZhZDE4NDNfQURMRU4sIDEsCi0JCQkgICAmYWQxODQzX0FEUkVOLCAxKTsKLQotCS8qIFJlc3RvcmUgREExIG11dGUgYW5kIGdhaW4uICovCi0JbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoLCA5LCBzYXZlX2RhMSk7Ci19Ci0KLS8qCi0gKiBTZXQgcmVjb3JkaW5nIHNvdXJjZS4gIEFyZyBuZXdzcmMgc3BlY2lmaWVzIGFuIE9TUyBjaGFubmVsIG1hc2suCi0gKgotICogVGhlIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHdoZW4gd2Ugc3dpdGNoIGludG8vb3V0IG9mIGxvb3BiYWNrIG1vZGUKLSAqIChpLmUuLCBzcmMgPSBTT1VORF9NQVNLX1BDTSksIHdlIGNoYW5nZSB0aGUgQUQxODQzIGludG8vb3V0IG9mCi0gKiBkaWdpdGFsIHJlc2FtcGxpbmcgbW9kZS4KLSAqCi0gKiBSZXR1cm5zIG5ld3NyYyBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KLSAqLwotCi1zdGF0aWMgaW50IGFkMTg0M19zZXRfcmVjc3JjKGxpdGhpdW1fdCAqbGl0aCwgaW50IG5ld3NyYykKLXsKLQlpbnQgYml0czsKLQlpbnQgb2xkYml0czsKLQotCXN3aXRjaCAobmV3c3JjKSB7Ci0JY2FzZSBTT1VORF9NQVNLX1BDTToKLQkJYml0cyA9IDY7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NQVNLX01JQzoKLQkJYml0cyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NQVNLX0xJTkU6Ci0JCWJpdHMgPSAyOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUFTS19DRDoKLQkJYml0cyA9IDM7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW9sZGJpdHMgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFNTKTsKLQlpZiAobmV3c3JjID09IFNPVU5EX01BU0tfUENNICYmIG9sZGJpdHMgIT0gNikgewotCQlEQkdQKCJlbmFibGluZyBkaWdpdGFsIHJlc2FtcGxlIG1vZGVcbiIpOwotCQlhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aCwgMSk7Ci0JCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAotCQkJCSAgICZhZDE4NDNfREFBREwsIDIsCi0JCQkJICAgJmFkMTg0M19EQUFEUiwgMik7Ci0JfSBlbHNlIGlmIChuZXdzcmMgIT0gU09VTkRfTUFTS19QQ00gJiYgb2xkYml0cyA9PSA2KSB7Ci0JCURCR1AoImRpc2FibGluZyBkaWdpdGFsIHJlc2FtcGxlIG1vZGVcbiIpOwotCQlhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aCwgMCk7Ci0JCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAotCQkJCSAgICZhZDE4NDNfREFBREwsIDAsCi0JCQkJICAgJmFkMTg0M19EQUFEUiwgMCk7Ci0JfQotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xTUywgYml0cywgJmFkMTg0M19SU1MsIGJpdHMpOwotCXJldHVybiBuZXdzcmM7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gY3VycmVudCBvdXRwdXQgc291cmNlcywgaW4gT1NTIGZvcm1hdC4KLSAqLwotCi1zdGF0aWMgaW50IGFkMTg0M19nZXRfb3V0c3JjKGxpdGhpdW1fdCAqbGl0aCkKLXsKLQlpbnQgcGNtLCBsaW5lLCBtaWMsIGNkOwotCi0JcGNtICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MREExR00pID8gMCA6IFNPVU5EX01BU0tfUENNOwotCWxpbmUgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFgxTU0pICA/IDAgOiBTT1VORF9NQVNLX0xJTkU7Ci0JY2QgICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MWDJNTSkgID8gMCA6IFNPVU5EX01BU0tfQ0Q7Ci0JbWljICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MTUNNTSkgID8gMCA6IFNPVU5EX01BU0tfTUlDOwotCi0JcmV0dXJuIHBjbSB8IGxpbmUgfCBjZCB8IG1pYzsKLX0KLQotLyoKLSAqIFNldCBvdXRwdXQgc291cmNlcy4gIEFyZyBpcyBhIG1hc2sgb2YgYWN0aXZlIHNvdXJjZXMgaW4gT1NTIGZvcm1hdC4KLSAqCi0gKiBSZXR1cm5zIHNvdXJjZSBtYXNrIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgYWQxODQzX3NldF9vdXRzcmMobGl0aGl1bV90ICpsaXRoLCBpbnQgbWFzaykKLXsKLQlpbnQgcGNtLCBsaW5lLCBtaWMsIGNkOwotCi0JaWYgKG1hc2sgJiB+KFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKLQkJICAgICBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19NSUMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlwY20gID0gKG1hc2sgJiBTT1VORF9NQVNLX1BDTSkgID8gMCA6IDE7Ci0JbGluZSA9IChtYXNrICYgU09VTkRfTUFTS19MSU5FKSA/IDAgOiAxOwotCW1pYyAgPSAobWFzayAmIFNPVU5EX01BU0tfTUlDKSAgPyAwIDogMTsKLQljZCAgID0gKG1hc2sgJiBTT1VORF9NQVNLX0NEKSAgID8gMCA6IDE7Ci0KLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MREExR00sIHBjbSwgJmFkMTg0M19SREExR00sIHBjbSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTFgxTU0sIGxpbmUsICZhZDE4NDNfUlgxTU0sIGxpbmUpOwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xYMk1NLCBjZCwgICAmYWQxODQzX1JYMk1NLCBjZCk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTE1DTU0sIG1pYywgICZhZDE4NDNfUk1DTU0sIG1pYyk7Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotLyogU2V0dXAgYWQxODQzIGZvciBEL0EgY29udmVyc2lvbi4gKi8KLQotc3RhdGljIHZvaWQgYWQxODQzX3NldHVwX2RhYyhsaXRoaXVtX3QgKmxpdGgsCi0JCQkgICAgIGludCBmcmFtZXJhdGUsCi0JCQkgICAgIGludCBmbXQsCi0JCQkgICAgIGludCBjaGFubmVscykKLXsKLQlpbnQgYWRfZm10ID0gMCwgYWRfbW9kZSA9IDA7Ci0KLQlEQkdFVigiKGxpdGg9MHglcCwgZnJhbWVyYXRlPSVkLCBmbXQ9JWQsIGNoYW5uZWxzPSVkKVxuIiwKLQkgICAgICBsaXRoLCBmcmFtZXJhdGUsIGZtdCwgY2hhbm5lbHMpOwotCi0Jc3dpdGNoIChmbXQpIHsKLQljYXNlIEFGTVRfUzg6CQlhZF9mbXQgPSAxOyBicmVhazsKLQljYXNlIEFGTVRfVTg6CQlhZF9mbXQgPSAxOyBicmVhazsKLQljYXNlIEFGTVRfUzE2X0xFOglhZF9mbXQgPSAxOyBicmVhazsKLQljYXNlIEFGTVRfTVVfTEFXOglhZF9mbXQgPSAyOyBicmVhazsKLQljYXNlIEFGTVRfQV9MQVc6CWFkX2ZtdCA9IDM7IGJyZWFrOwotCWRlZmF1bHQ6CQlBU1NFUlQoMCk7Ci0JfQotCi0Jc3dpdGNoIChjaGFubmVscykgewotCWNhc2UgMjoJCQlhZF9tb2RlID0gMDsgYnJlYWs7Ci0JY2FzZSAxOgkJCWFkX21vZGUgPSAxOyBicmVhazsKLQlkZWZhdWx0OgkJQVNTRVJUKDApOwotCX0KLQkJCi0JREJHUFYoImFkX21vZGUgPSAlZCwgYWRfZm10ID0gJWRcbiIsIGFkX21vZGUsIGFkX2ZtdCk7Ci0JQVNTRVJUKGZyYW1lcmF0ZSA+PSA0MDAwICYmIGZyYW1lcmF0ZSA8PSA0OTAwMCk7Ci0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19DMUMsIGZyYW1lcmF0ZSk7Ci0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCi0JCQkgICAmYWQxODQzX0RBMVNNLCBhZF9tb2RlLCAmYWQxODQzX0RBMUYsIGFkX2ZtdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTg0M19zaHV0ZG93bl9kYWMobGl0aGl1bV90ICpsaXRoKQotewotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfREExRiwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTg0M19zZXR1cF9hZGMobGl0aGl1bV90ICpsaXRoLCBpbnQgZnJhbWVyYXRlLCBpbnQgZm10LCBpbnQgY2hhbm5lbHMpCi17Ci0JaW50IGRhX2ZtdCA9IDA7Ci0KLQlEQkdFVigiKGxpdGg9MHglcCwgZnJhbWVyYXRlPSVkLCBmbXQ9JWQsIGNoYW5uZWxzPSVkKVxuIiwKLQkgICAgICBsaXRoLCBmcmFtZXJhdGUsIGZtdCwgY2hhbm5lbHMpOwotCi0Jc3dpdGNoIChmbXQpIHsKLQljYXNlIEFGTVRfUzg6CQlkYV9mbXQgPSAxOyBicmVhazsKLQljYXNlIEFGTVRfVTg6CQlkYV9mbXQgPSAxOyBicmVhazsKLQljYXNlIEFGTVRfUzE2X0xFOglkYV9mbXQgPSAxOyBicmVhazsKLQljYXNlIEFGTVRfTVVfTEFXOglkYV9mbXQgPSAyOyBicmVhazsKLQljYXNlIEFGTVRfQV9MQVc6CWRhX2ZtdCA9IDM7IGJyZWFrOwotCWRlZmF1bHQ6CQlBU1NFUlQoMCk7Ci0JfQotCi0JREJHUFYoImRhX2ZtdCA9ICVkXG4iLCBkYV9mbXQpOwotCUFTU0VSVChmcmFtZXJhdGUgPj0gNDAwMCAmJiBmcmFtZXJhdGUgPD0gNDkwMDApOwotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfQzJDLCBmcmFtZXJhdGUpOwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAotCQkJICAgJmFkMTg0M19BRExGLCBkYV9mbXQsICZhZDE4NDNfQURSRiwgZGFfZm10KTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODQzX3NodXRkb3duX2FkYyhsaXRoaXVtX3QgKmxpdGgpCi17Ci0JLyogbm90aGluZyB0byBkbyAqLwotfQotCi0vKgotICogRnVsbHkgaW5pdGlhbGl6ZSB0aGUgYWQxODQzLiAgQXMgZGVzY3JpYmVkIGluIHRoZSBBRDE4NDMgZGF0YQotICogc2hlZXQsIHNlY3Rpb24gIlNUQVJULVVQIFNFUVVFTkNFIi4gIFRoZSBudW1iZXJlZCBjb21tZW50cyBhcmUKLSAqIHN1YnNlY3Rpb24gaGVhZGluZ3MgZnJvbSB0aGUgZGF0YSBzaGVldC4gIFNlZSB0aGUgZGF0YSBzaGVldCwgcGFnZXMKLSAqIDUyLTU0LCBmb3IgbW9yZSBpbmZvLgotICoKLSAqIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLiAgKi8KLQotc3RhdGljIGludCBfX2luaXQgYWQxODQzX2luaXQobGl0aGl1bV90ICpsaXRoKQotewotCXVuc2lnbmVkIGxvbmcgbGF0ZXI7Ci0JaW50IGVycjsKLQotCWVyciA9IGxpX2luaXQobGl0aCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfSU5JVCkgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ3c25kIHNvdW5kOiBBRDE4NDMgd29uJ3QgaW5pdGlhbGl6ZVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfU0NGLCAxKTsKLQotCS8qIDQuIFB1dCB0aGUgY29udmVyc2lvbiByZXNvdXJjZXMgaW50byBzdGFuZGJ5LiAqLwotCi0JYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19QRE5JLCAwKTsKLQlsYXRlciA9IGppZmZpZXMgKyBIWiAvIDI7CS8qIHJvdWdobHkgaGFsZiBhIHNlY29uZCAqLwotCURCR0RPKHNodXRfdXArKyk7Ci0Jd2hpbGUgKGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19QRE5PKSkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXRlcikpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJ2d3NuZCBhdWRpbzogQUQxODQzIHdvbid0IHBvd2VyIHVwXG4iKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCURCR0RPKHNodXRfdXAtLSk7Ci0KLQkvKiA1LiBQb3dlciB1cCB0aGUgY2xvY2sgZ2VuZXJhdG9ycyBhbmQgZW5hYmxlIGNsb2NrIG91dHB1dCBwaW5zLiAqLwotCi0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfQzFFTiwgMSwgJmFkMTg0M19DMkVOLCAxKTsKLQotCS8qIDYuIENvbmZpZ3VyZSBjb252ZXJzaW9uIHJlc291cmNlcyB3aGlsZSB0aGV5IGFyZSBpbiBzdGFuZGJ5LiAqLwotCi0gCS8qIERBQzEgdXNlcyBjbG9jayAxIGFzIHNvdXJjZSwgQURDIHVzZXMgY2xvY2sgMi4gIEFsd2F5cy4gKi8KLQotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAzLAotCQkJICAgJmFkMTg0M19EQTFDLCAxLAotCQkJICAgJmFkMTg0M19BRExDLCAyLAotCQkJICAgJmFkMTg0M19BRFJDLCAyKTsKLQotCS8qIDcuIEVuYWJsZSBjb252ZXJzaW9uIHJlc291cmNlcy4gKi8KLQotCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfQURUTEssIDEpOwotCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCA1LAotCQkJICAgJmFkMTg0M19BTkFFTiwgMSwKLQkJCSAgICZhZDE4NDNfQUFNRU4sIDEsCi0JCQkgICAmYWQxODQzX0RBMUVOLCAxLAotCQkJICAgJmFkMTg0M19BRExFTiwgMSwKLQkJCSAgICZhZDE4NDNfQURSRU4sIDEpOwotCi0JLyogOC4gQ29uZmlndXJlIGNvbnZlcnNpb24gcmVzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGVuYWJsZWQuICovCi0KLQlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0RBMUMsIDEpOwotCi0JLyogVW5tdXRlIGFsbCBjaGFubmVscy4gKi8KLQotCWFkMTg0M19zZXRfb3V0c3JjKGxpdGgsCi0JCQkgIChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8Ci0JCQkgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MREExQU0sIDAsICZhZDE4NDNfUkRBMUFNLCAwKTsKLQotCS8qIFNldCBkZWZhdWx0IHJlY29yZGluZyBzb3VyY2UgdG8gTGluZSBJbiBhbmQgc2V0Ci0JICogbWljIGdhaW4gdG8gKzIwIGRCLgotCSAqLwotCi0JYWQxODQzX3NldF9yZWNzcmMobGl0aCwgU09VTkRfTUFTS19MSU5FKTsKLQlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MTUdFLCAxLCAmYWQxODQzX1JNR0UsIDEpOwotCi0JLyogU2V0IFNwZWFrZXIgT3V0IGxldmVsIHRvICsvLSA0ViBhbmQgdW5tdXRlIGl0LiAqLwotCi0JYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfSFBPUywgMSwgJmFkMTg0M19IUE9NLCAwKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQQ00gSS9PICovCi0KLSNkZWZpbmUgUkVBRF9JTlRSX01BU0sgIChMSV9JTlRSX0NPTU0xX1RSSUcgfCBMSV9JTlRSX0NPTU0xX09WRVJGTE9XKQotI2RlZmluZSBXUklURV9JTlRSX01BU0sgKExJX0lOVFJfQ09NTTJfVFJJRyB8IExJX0lOVFJfQ09NTTJfVU5ERVJGTE9XKQotCi10eXBlZGVmIGVudW0gdndzbmRfcG9ydF9zd3N0YXRlIHsJLyogc29mdHdhcmUgc3RhdGUgKi8KLQlTV19PRkYsCi0JU1dfSU5JVElBTCwKLQlTV19SVU4sCi0JU1dfRFJBSU4sCi19IHZ3c25kX3BvcnRfc3dzdGF0ZV90OwotCi10eXBlZGVmIGVudW0gdndzbmRfcG9ydF9od3N0YXRlIHsJLyogaGFyZHdhcmUgc3RhdGUgKi8KLQlIV19TVE9QUEVELAotCUhXX1JVTk5JTkcsCi19IHZ3c25kX3BvcnRfaHdzdGF0ZV90OwotCi0vKgotICogVGhlc2UgZmxhZ3MgYXJlIHJlYWQgYnkgSVNSLCBidXQgb25seSB3cml0dGVuIGF0IGJhc2VsaW5lLgotICovCi0KLXR5cGVkZWYgZW51bSB2d3NuZF9wb3J0X2ZsYWdzIHsKLQlESVNBQkxFRCA9IDEgPDwgMCwKLQlFUkZMT1dOICA9IDEgPDwgMSwJCS8qIG92ZXJmbG93biBvciB1bmRlcmZsb3duICovCi0JSFdfQlVTWSAgPSAxIDw8IDIsCi19IHZ3c25kX3BvcnRfZmxhZ3NfdDsKLQotLyoKLSAqIHZ3c25kX3BvcnQgaXMgdGhlIHBlci1wb3J0IGRhdGEgc3RydWN0dXJlLiAgRWFjaCBkZXZpY2UgaGFzIHR3bwotICogcG9ydHMsIG9uZSBmb3IgaW5wdXQgYW5kIG9uZSBmb3Igb3V0cHV0LgotICoKLSAqIExvY2tpbmc6Ci0gKgotICoJcG9ydC0+bG9jayBwcm90ZWN0czogaHdzdGF0ZSwgZmxhZ3MsIHN3Yl9baXVdX2F2YWlsLgotICoKLSAqCWRldmMtPmlvX211dGV4IHByb3RlY3RzOiBzd3N0YXRlLCBzd18qLCBzd2JfW2l1XV9pZHguCi0gKgotICoJZXZlcnl0aGluZyBlbHNlIGlzIG9ubHkgd3JpdHRlbiBieSBvcGVuL3JlbGVhc2Ugb3IKLSAqCXBjbV97c2V0dXAsc2h1dGRvd259KCksIHdoaWNoIGFyZSBzZXJpYWxpemVkIGJ5IGEKLSAqCWNvbWJpbmF0aW9uIG9mIGRldmMtPm9wZW5fbXV0ZXggYW5kIGRldmMtPmlvX211dGV4LgotICovCi0KLXR5cGVkZWYgc3RydWN0IHZ3c25kX3BvcnQgewotCi0Jc3BpbmxvY2tfdAlsb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwotCXZ3c25kX3BvcnRfc3dzdGF0ZV90IHN3c3RhdGU7Ci0JdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZTsKLQl2d3NuZF9wb3J0X2ZsYWdzX3QgZmxhZ3M7Ci0KLQlpbnQJCXN3X2NoYW5uZWxzOwotCWludAkJc3dfc2FtcGxlZm10OwotCWludAkJc3dfZnJhbWVyYXRlOwotCWludAkJc2FtcGxlX3NpemU7Ci0JaW50CQlmcmFtZV9zaXplOwotCXVuc2lnbmVkIGludAl6ZXJvX3dvcmQ7CS8qIHplcm8gZm9yIHRoZSBzYW1wbGUgZm9ybWF0ICovCi0KLQlpbnQJCXN3X2ZyYWdzaGlmdDsKLQlpbnQJCXN3X2ZyYWdjb3VudDsKLQlpbnQJCXN3X3N1YmRpdnNoaWZ0OwotCi0JdW5zaWduZWQgaW50CWh3X2ZyYWdzaGlmdDsKLQl1bnNpZ25lZCBpbnQJaHdfZnJhZ3NpemU7Ci0JdW5zaWduZWQgaW50CWh3X2ZyYWdjb3VudDsKLQotCWludAkJaHdidWZfc2l6ZTsKLQl1bnNpZ25lZCBsb25nCWh3YnVmX3BhZGRyOwotCXVuc2lnbmVkIGxvbmcJaHdidWZfdmFkZHI7Ci0Jdm9pZCAqCQlod2J1ZjsJCS8qIGh3YnVmID09IGh3YnVmX3ZhZGRyICovCi0JaW50CQlod2J1Zl9tYXg7CS8qIG1heCBieXRlcyB0byBwcmVsb2FkICovCi0KLQl2b2lkICoJCXN3YnVmOwotCXVuc2lnbmVkIGludAlzd2J1Zl9zaXplOwkvKiBzaXplIGluIGJ5dGVzICovCi0JdW5zaWduZWQgaW50CXN3Yl91X2lkeDsJLyogaW5kZXggb2YgbmV4dCB1c2VyIGJ5dGUgKi8KLQl1bnNpZ25lZCBpbnQJc3diX2lfaWR4OwkvKiBpbmRleCBvZiBuZXh0IGludHIgYnl0ZSAqLwotCXVuc2lnbmVkIGludAlzd2JfdV9hdmFpbDsJLyogIyBieXRlcyBhdmFpbCB0byB1c2VyICovCi0JdW5zaWduZWQgaW50CXN3Yl9pX2F2YWlsOwkvKiAjIGJ5dGVzIGF2YWlsIHRvIGludHIgKi8KLQotCWRtYV9jaGFuX3QJY2hhbjsKLQotCS8qIEFjY291bnRpbmcgKi8KLQotCWludAkJYnl0ZV9jb3VudDsKLQlpbnQJCWZyYWdfY291bnQ7Ci0JaW50CQlNU0Nfb2Zmc2V0OwotCi19IHZ3c25kX3BvcnRfdDsKLQotLyogdndzbmRfZGV2IGlzIHRoZSBwZXItZGV2aWNlIGRhdGEgc3RydWN0dXJlLiAqLwotCi10eXBlZGVmIHN0cnVjdCB2d3NuZF9kZXYgewotCXN0cnVjdCB2d3NuZF9kZXYgKm5leHRfZGV2OwotCWludAkJYXVkaW9fbWlub3I7CS8qIG1pbm9yIG51bWJlciBvZiBhdWRpbyBkZXZpY2UgKi8KLQlpbnQJCW1peGVyX21pbm9yOwkvKiBtaW5vciBudW1iZXIgb2YgbWl4ZXIgZGV2aWNlICovCi0KLQlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggaW9fbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IG1peF9tdXRleDsKLQlmbW9kZV90CQlvcGVuX21vZGU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwotCi0JbGl0aGl1bV90CWxpdGg7Ci0KLQl2d3NuZF9wb3J0X3QJcnBvcnQ7Ci0JdndzbmRfcG9ydF90CXdwb3J0OwotfSB2d3NuZF9kZXZfdDsKLQotc3RhdGljIHZ3c25kX2Rldl90ICp2d3NuZF9kZXZfbGlzdDsJLyogbGlua2VkIGxpc3Qgb2YgYWxsIGRldmljZXMgKi8KLQotc3RhdGljIGF0b21pY190IHZ3c25kX3VzZV9jb3VudCA9IEFUT01JQ19JTklUKDApOwotCi0jIGRlZmluZSBJTkNfVVNFX0NPVU5UIChhdG9taWNfaW5jKCZ2d3NuZF91c2VfY291bnQpKQotIyBkZWZpbmUgREVDX1VTRV9DT1VOVCAoYXRvbWljX2RlYygmdndzbmRfdXNlX2NvdW50KSkKLSMgZGVmaW5lIElOX1VTRSAgICAgICAgKGF0b21pY19yZWFkKCZ2d3NuZF91c2VfY291bnQpICE9IDApCi0KLS8qCi0gKiBMaXRoaXVtIGNhbiBvbmx5IERNQSBtdWx0aXBsZXMgb2YgMzIgYnl0ZXMuICBJdHMgRE1BIGJ1ZmZlciBtYXkKLSAqIGJlIHVwIHRvIDggS2IuICBUaGlzIGRyaXZlciBhbHdheXMgdXNlcyA4IEtiLgotICoKLSAqIE1lbW9yeSBidWcgd29ya2Fyb3VuZCAtLSBJJ20gbm90IHN1cmUgd2hhdCdzIGdvaW5nIG9uIGhlcmUsIGJ1dAotICogc29tZWhvdyBwY21fY29weV9vdXQoKSB3YXMgdHJpZ2dlcmluZyBzZWd2J3MgZ29pbmcgb24gdG8gdGhlIG5leHQKLSAqIHBhZ2Ugb2YgdGhlIGh3IGJ1ZmZlci4gIFNvLCBJIG1ha2UgdGhlIGh3IGJ1ZmZlciBvbmUgc2l6ZSBiaWdnZXIKLSAqIHRoYW4gd2UgYWN0dWFsbHkgdXNlLiAgVGhhdCB3YXksIHRoZSBmb2xsb3dpbmcgcGFnZSBpcyBhbGxvY2F0ZWQKLSAqIGFuZCBtYXBwZWQsIGFuZCBubyBlcnJvci4gIEkgc3VzcGVjdCB0aGF0IHNvbWV0aGluZyBpcyBicm9rZW4KLSAqIGluIENvYmFsdCwgYnV0IGhhdmVuJ3QgcmVhbGx5IGludmVzdGlnYXRlZC4gIEhCTyBpcyB0aGUgYWN0dWFsCi0gKiBzaXplIG9mIHRoZSBidWZmZXIsIGFuZCBIV0JVRl9PUkRFUiBpcyB3aGF0IHdlIGFsbG9jYXRlLgotICovCi0KLSNkZWZpbmUgSFdCVUZfU0hJRlQgMTMKLSNkZWZpbmUgSFdCVUZfU0laRSAoMSA8PCBIV0JVRl9TSElGVCkKLSMgZGVmaW5lIEhCTyAgICAgICAgIChIV0JVRl9TSElGVCA+IFBBR0VfU0hJRlQgPyBIV0JVRl9TSElGVCAtIFBBR0VfU0hJRlQgOiAwKQotIyBkZWZpbmUgSFdCVUZfT1JERVIgKEhCTyArIDEpCQkvKiBuZXh0IHNpemUgYmlnZ2VyICovCi0jZGVmaW5lIE1JTl9TUEVFRCA0MDAwCi0jZGVmaW5lIE1BWF9TUEVFRCA0OTAwMAotCi0jZGVmaW5lIE1JTl9GUkFHU0hJRlQJCQkoRE1BQ0hVTktfU0hJRlQgKyAxKQotI2RlZmluZSBNQVhfRlJBR1NISUZUCQkJKFBBR0VfU0hJRlQpCi0jZGVmaW5lIE1JTl9GUkFHU0laRQkJCSgxIDw8IE1JTl9GUkFHU0hJRlQpCi0jZGVmaW5lIE1BWF9GUkFHU0laRQkJCSgxIDw8IE1BWF9GUkFHU0hJRlQpCi0jZGVmaW5lIE1JTl9GUkFHQ09VTlQoZnJhZ3NpemUpCQkzCi0jZGVmaW5lIE1BWF9GUkFHQ09VTlQoZnJhZ3NpemUpCQkoMzIgKiBQQUdFX1NJWkUgLyAoZnJhZ3NpemUpKQotI2RlZmluZSBERUZBVUxUX0ZSQUdTSElGVAkJMTIKLSNkZWZpbmUgREVGQVVMVF9GUkFHQ09VTlQJCTE2Ci0jZGVmaW5lIERFRkFVTFRfU1VCRElWU0hJRlQJCTAKLQotLyoKLSAqIFRoZSBzb2Z0d2FyZSBidWZmZXIgKHN3YnVmKSBpcyBhIHJpbmcgYnVmZmVyIHNoYXJlZCBiZXR3ZWVuIHVzZXIKLSAqIGxldmVsIGFuZCBpbnRlcnJ1cHQgbGV2ZWwuICBFYWNoIGxldmVsIG93bnMgc29tZSBvZiB0aGUgYnl0ZXMgaW4KLSAqIHRoZSBidWZmZXIsIGFuZCBtYXkgZ2l2ZSBieXRlcyBhd2F5IGJ5IGNhbGxpbmcgc3diX2luY197dSxpfSgpLgotICogVXNlciBsZXZlbCBjYWxscyBfdSBmb3IgdXNlciwgYW5kIGludGVycnVwdCBsZXZlbCBjYWxscyBfaSBmb3IKLSAqIGludGVycnVwdC4KLSAqCi0gKiBwb3J0LT5zd2Jfe3UsaX1fYXZhaWwgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gdGhhdCBsZXZlbC4KLSAqCi0gKiBwb3J0LT5zd2Jfe3UsaX1faWR4IGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYXZhaWxhYmxlIGJ5dGUgaW4gdGhlCi0gKiBidWZmZXIuCi0gKgotICogRWFjaCBsZXZlbCBjYWxscyBzd2JfaW5jX3t1LGl9KCkgdG8gYXRvbWljYWxseSBpbmNyZW1lbnQgaXRzIGluZGV4LAotICogcmVjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIGJvdGggc2lkZXMsIGFuZAotICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLiAgU2luY2UgZWFjaCBzaWRlIGNhbiBvbmx5Ci0gKiBnaXZlIGF3YXkgYnl0ZXMsIHRoZSBvdGhlciBzaWRlIGNhbiBvbmx5IGluY3JlYXNlIHRoZSBudW1iZXIgb2YKLSAqIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGlzIHNpZGUuICBFYWNoIHNpZGUgdXBkYXRlcyBpdHMgb3duIGluZGV4Ci0gKiB2YXJpYWJsZSwgc3diX3t1LGl9X2lkeCwgc28gbm8gbG9jayBpcyBuZWVkZWQgdG8gcmVhZCBpdC4KLSAqCi0gKiBUbyBxdWVyeSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgY2FsbCBzd2JfaW5jX3t1LGl9IHdpdGggYW4KLSAqIGluY3JlbWVudCBvZiB6ZXJvLgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX3N3Yl9pbmNfdSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCi17Ci0JaWYgKGluYykgewotCQlwb3J0LT5zd2JfdV9pZHggKz0gaW5jOwotCQlwb3J0LT5zd2JfdV9pZHggJT0gcG9ydC0+c3didWZfc2l6ZTsKLQkJcG9ydC0+c3diX3VfYXZhaWwgLT0gaW5jOwotCQlwb3J0LT5zd2JfaV9hdmFpbCArPSBpbmM7Ci0JfQotCXJldHVybiBwb3J0LT5zd2JfdV9hdmFpbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHN3Yl9pbmNfdSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQl7Ci0JCXJldCA9IF9fc3diX2luY191KHBvcnQsIGluYyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgX19zd2JfaW5jX2kodndzbmRfcG9ydF90ICpwb3J0LCBpbnQgaW5jKQotewotCWlmIChpbmMpIHsKLQkJcG9ydC0+c3diX2lfaWR4ICs9IGluYzsKLQkJcG9ydC0+c3diX2lfaWR4ICU9IHBvcnQtPnN3YnVmX3NpemU7Ci0JCXBvcnQtPnN3Yl9pX2F2YWlsIC09IGluYzsKLQkJcG9ydC0+c3diX3VfYXZhaWwgKz0gaW5jOwotCX0KLQlyZXR1cm4gcG9ydC0+c3diX2lfYXZhaWw7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBzd2JfaW5jX2kodndzbmRfcG9ydF90ICpwb3J0LCBpbnQgaW5jKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JewotCQlyZXQgPSBfX3N3Yl9pbmNfaShwb3J0LCBpbmMpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHBjbV9zZXR1cCAtIHRoaXMgcm91dGluZSBpbml0aWFsaXplcyBhbGwgcG9ydCBzdGF0ZSBhZnRlcgotICogbW9kZS1zZXR0aW5nIGlvY3RscyBoYXZlIGJlZW4gZG9uZSwgYnV0IGJlZm9yZSB0aGUgZmlyc3QgSS9PIGlzCi0gKiBkb25lLgotICoKLSAqIExvY2tpbmc6IGNhbGxlZCB3aXRoIGRldmMtPmlvX211dGV4IGhlbGQuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICovCi0KLXN0YXRpYyBpbnQgcGNtX3NldHVwKHZ3c25kX2Rldl90ICpkZXZjLAotCQkgICAgIHZ3c25kX3BvcnRfdCAqcnBvcnQsCi0JCSAgICAgdndzbmRfcG9ydF90ICp3cG9ydCkKLXsKLQl2d3NuZF9wb3J0X3QgKmFwb3J0ID0gcnBvcnQgPyBycG9ydCA6IHdwb3J0OwotCWludCBzYW1wbGVfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgemVyb193b3JkOwotCi0JREJHRVYoIihkZXZjPTB4JXAsIHJwb3J0PTB4JXAsIHdwb3J0PTB4JXApXG4iLCBkZXZjLCBycG9ydCwgd3BvcnQpOwotCi0JQVNTRVJUKGFwb3J0ICE9IE5VTEwpOwotCWlmIChhcG9ydC0+c3didWYgIT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0Jc3dpdGNoIChhcG9ydC0+c3dfc2FtcGxlZm10KSB7Ci0JY2FzZSBBRk1UX01VX0xBVzoKLQkJc2FtcGxlX3NpemUgPSAxOwotCQl6ZXJvX3dvcmQgPSAweEZGRkZGRkZGIF4gMHg4MDgwODA4MDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFGTVRfQV9MQVc6Ci0JCXNhbXBsZV9zaXplID0gMTsKLQkJemVyb193b3JkID0gMHhENUQ1RDVENSBeIDB4ODA4MDgwODA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRk1UX1U4OgotCQlzYW1wbGVfc2l6ZSA9IDE7Ci0JCXplcm9fd29yZCA9IDB4ODA4MDgwODA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRk1UX1M4OgotCQlzYW1wbGVfc2l6ZSA9IDE7Ci0JCXplcm9fd29yZCA9IDB4MDAwMDAwMDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRk1UX1MxNl9MRToKLQkJc2FtcGxlX3NpemUgPSAyOwotCQl6ZXJvX3dvcmQgPSAweDAwMDAwMDAwOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9zaXplID0gMDsJLyogcHJldmVudCBjb21waWxlciB3YXJuaW5nICovCi0JCXplcm9fd29yZCA9IDA7Ci0JCUFTU0VSVCgwKTsKLQl9Ci0JYXBvcnQtPnNhbXBsZV9zaXplICA9IHNhbXBsZV9zaXplOwotCWFwb3J0LT56ZXJvX3dvcmQgICAgPSB6ZXJvX3dvcmQ7Ci0JYXBvcnQtPmZyYW1lX3NpemUgICA9IGFwb3J0LT5zd19jaGFubmVscyAqIGFwb3J0LT5zYW1wbGVfc2l6ZTsKLQlhcG9ydC0+aHdfZnJhZ3NoaWZ0ID0gYXBvcnQtPnN3X2ZyYWdzaGlmdCAtIGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKLQlhcG9ydC0+aHdfZnJhZ3NpemUgID0gMSA8PCBhcG9ydC0+aHdfZnJhZ3NoaWZ0OwotCWFwb3J0LT5od19mcmFnY291bnQgPSBhcG9ydC0+c3dfZnJhZ2NvdW50IDw8IGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKLQlBU1NFUlQoYXBvcnQtPmh3X2ZyYWdzaXplID49IE1JTl9GUkFHU0laRSk7Ci0JQVNTRVJUKGFwb3J0LT5od19mcmFnc2l6ZSA8PSBNQVhfRlJBR1NJWkUpOwotCUFTU0VSVChhcG9ydC0+aHdfZnJhZ2NvdW50ID49IE1JTl9GUkFHQ09VTlQoYXBvcnQtPmh3X2ZyYWdzaXplKSk7Ci0JQVNTRVJUKGFwb3J0LT5od19mcmFnY291bnQgPD0gTUFYX0ZSQUdDT1VOVChhcG9ydC0+aHdfZnJhZ3NpemUpKTsKLQlpZiAocnBvcnQpIHsKLQkJaW50IGh3ZnJhZ3MsIHN3ZnJhZ3M7Ci0JCXJwb3J0LT5od2J1Zl9tYXggPSBhcG9ydC0+aHdidWZfc2l6ZSAtIERNQUNIVU5LX1NJWkU7Ci0JCWh3ZnJhZ3MgPSBycG9ydC0+aHdidWZfbWF4ID4+IGFwb3J0LT5od19mcmFnc2hpZnQ7Ci0JCXN3ZnJhZ3MgPSBhcG9ydC0+aHdfZnJhZ2NvdW50IC0gaHdmcmFnczsKLQkJaWYgKHN3ZnJhZ3MgPCAyKQotCQkJc3dmcmFncyA9IDI7Ci0JCXJwb3J0LT5zd2J1Zl9zaXplID0gc3dmcmFncyAqIGFwb3J0LT5od19mcmFnc2l6ZTsKLQkJREJHUFYoImh3ZnJhZ3MgPSAlZCwgc3dmcmFncyA9ICVkXG4iLCBod2ZyYWdzLCBzd2ZyYWdzKTsKLQkJREJHUFYoInJlYWQgaHdidWZfbWF4ID0gJWQsIHN3YnVmX3NpemUgPSAlZFxuIiwKLQkJICAgICBycG9ydC0+aHdidWZfbWF4LCBycG9ydC0+c3didWZfc2l6ZSk7Ci0JfQotCWlmICh3cG9ydCkgewotCQlpbnQgaHdmcmFncywgc3dmcmFnczsKLQkJaW50IHRvdGFsX2J5dGVzID0gYXBvcnQtPmh3X2ZyYWdjb3VudCAqIGFwb3J0LT5od19mcmFnc2l6ZTsKLQkJd3BvcnQtPmh3YnVmX21heCA9IGFwb3J0LT5od2J1Zl9zaXplIC0gRE1BQ0hVTktfU0laRTsKLQkJaWYgKHdwb3J0LT5od2J1Zl9tYXggPiB0b3RhbF9ieXRlcykKLQkJCXdwb3J0LT5od2J1Zl9tYXggPSB0b3RhbF9ieXRlczsKLQkJaHdmcmFncyA9IHdwb3J0LT5od2J1Zl9tYXggPj4gYXBvcnQtPmh3X2ZyYWdzaGlmdDsKLQkJREJHUFYoImh3ZnJhZ3MgPSAlZFxuIiwgaHdmcmFncyk7Ci0JCXN3ZnJhZ3MgPSBhcG9ydC0+aHdfZnJhZ2NvdW50IC0gaHdmcmFnczsKLQkJaWYgKHN3ZnJhZ3MgPCAyKQotCQkJc3dmcmFncyA9IDI7Ci0JCXdwb3J0LT5zd2J1Zl9zaXplID0gc3dmcmFncyAqIGFwb3J0LT5od19mcmFnc2l6ZTsKLQkJREJHUFYoImh3ZnJhZ3MgPSAlZCwgc3dmcmFncyA9ICVkXG4iLCBod2ZyYWdzLCBzd2ZyYWdzKTsKLQkJREJHUFYoIndyaXRlIGh3YnVmX21heCA9ICVkLCBzd2J1Zl9zaXplID0gJWRcbiIsCi0JCSAgICAgd3BvcnQtPmh3YnVmX21heCwgd3BvcnQtPnN3YnVmX3NpemUpOwotCX0KLQotCWFwb3J0LT5zd2JfdV9pZHggICAgPSAwOwotCWFwb3J0LT5zd2JfaV9pZHggICAgPSAwOwotCWFwb3J0LT5ieXRlX2NvdW50ICAgPSAwOwotCi0JLyoKLQkgKiBJcyB0aGlzIGEgQ29iYWx0IGJ1Zz8gIFdlIG5lZWQgdG8gbWFrZSB0aGlzIGJ1ZmZlciBleHRlbmQKLQkgKiBvbmUgcGFnZSBmdXJ0aGVyIHRoYW4gd2UgYWN0dWFsbHkgdXNlIC0tIHNvbWVob3cgbWVtY3B5Ci0JICogY2F1c2VzIGFuIGV4Y2VwdG9pbiBvdGhlcndpc2UuICBJIHN1c3BlY3QgdGhlcmUncyBhIGJ1ZyBpbgotCSAqIENvYmFsdCAob3Igc29tZXdoZXJlKSB3aGVyZSBpdCdzIGdlbmVyYXRpbmcgYSBmYXVsdCBvbiBhCi0JICogc3BlY3VsYXRpdmUgbG9hZCBvciBzb21ldGhpbmcuICBPYnZpb3VzbHksIEkgaGF2ZW4ndCB0YWtlbgotCSAqIHRoZSB0aW1lIHRvIHRyYWNrIGl0IGRvd24uCi0JICovCi0KLQlhcG9ydC0+c3didWYgICAgICAgID0gdm1hbGxvYyhhcG9ydC0+c3didWZfc2l6ZSArIFBBR0VfU0laRSk7Ci0JaWYgKCFhcG9ydC0+c3didWYpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChycG9ydCAmJiB3cG9ydCkgewotCQlBU1NFUlQoYXBvcnQgPT0gcnBvcnQpOwotCQlBU1NFUlQod3BvcnQtPnN3YnVmID09IE5VTEwpOwotCQkvKiBPbmUgZXh0cmEgcGFnZSAtIHNlZSBjb21tZW50IGFib3ZlLiAqLwotCQl3cG9ydC0+c3didWYgPSB2bWFsbG9jKGFwb3J0LT5zd2J1Zl9zaXplICsgUEFHRV9TSVpFKTsKLQkJaWYgKCF3cG9ydC0+c3didWYpIHsKLQkJCXZmcmVlKGFwb3J0LT5zd2J1Zik7Ci0JCQlhcG9ydC0+c3didWYgPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJd3BvcnQtPnNhbXBsZV9zaXplICA9IHJwb3J0LT5zYW1wbGVfc2l6ZTsKLQkJd3BvcnQtPnplcm9fd29yZCAgICA9IHJwb3J0LT56ZXJvX3dvcmQ7Ci0JCXdwb3J0LT5mcmFtZV9zaXplICAgPSBycG9ydC0+ZnJhbWVfc2l6ZTsKLQkJd3BvcnQtPmh3X2ZyYWdzaGlmdCA9IHJwb3J0LT5od19mcmFnc2hpZnQ7Ci0JCXdwb3J0LT5od19mcmFnc2l6ZSAgPSBycG9ydC0+aHdfZnJhZ3NpemU7Ci0JCXdwb3J0LT5od19mcmFnY291bnQgPSBycG9ydC0+aHdfZnJhZ2NvdW50OwotCQl3cG9ydC0+c3didWZfc2l6ZSAgID0gcnBvcnQtPnN3YnVmX3NpemU7Ci0JCXdwb3J0LT5od2J1Zl9tYXggICAgPSBycG9ydC0+aHdidWZfbWF4OwotCQl3cG9ydC0+c3diX3VfaWR4ICAgID0gcnBvcnQtPnN3Yl91X2lkeDsKLQkJd3BvcnQtPnN3Yl9pX2lkeCAgICA9IHJwb3J0LT5zd2JfaV9pZHg7Ci0JCXdwb3J0LT5ieXRlX2NvdW50ICAgPSBycG9ydC0+Ynl0ZV9jb3VudDsKLQl9Ci0JaWYgKHJwb3J0KSB7Ci0JCXJwb3J0LT5zd2JfdV9hdmFpbCA9IDA7Ci0JCXJwb3J0LT5zd2JfaV9hdmFpbCA9IHJwb3J0LT5zd2J1Zl9zaXplOwotCQlycG9ydC0+c3dzdGF0ZSA9IFNXX1JVTjsKLQkJbGlfc2V0dXBfZG1hKCZycG9ydC0+Y2hhbiwKLQkJCSAgICAgJmxpX2NvbW0xLAotCQkJICAgICAmZGV2Yy0+bGl0aCwKLQkJCSAgICAgcnBvcnQtPmh3YnVmX3BhZGRyLAotCQkJICAgICBIV0JVRl9TSElGVCwKLQkJCSAgICAgcnBvcnQtPmh3X2ZyYWdzaGlmdCwKLQkJCSAgICAgcnBvcnQtPnN3X2NoYW5uZWxzLAotCQkJICAgICBycG9ydC0+c2FtcGxlX3NpemUpOwotCQlhZDE4NDNfc2V0dXBfYWRjKCZkZXZjLT5saXRoLAotCQkJCSBycG9ydC0+c3dfZnJhbWVyYXRlLAotCQkJCSBycG9ydC0+c3dfc2FtcGxlZm10LAotCQkJCSBycG9ydC0+c3dfY2hhbm5lbHMpOwotCQlsaV9lbmFibGVfaW50ZXJydXB0cygmZGV2Yy0+bGl0aCwgUkVBRF9JTlRSX01BU0spOwotCQlpZiAoIShycG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpIHsKLQkJCXVzdG1zY190IHVzdG1zYzsKLQkJCXJwb3J0LT5od3N0YXRlID0gSFdfUlVOTklORzsKLQkJCWxpX2FjdGl2YXRlX2RtYSgmcnBvcnQtPmNoYW4pOwotCQkJbGlfcmVhZF9VU1RNU0MoJnJwb3J0LT5jaGFuLCAmdXN0bXNjKTsKLQkJCXJwb3J0LT5NU0Nfb2Zmc2V0ID0gdXN0bXNjLm1zYzsKLQkJfQotCX0KLQlpZiAod3BvcnQpIHsKLQkJaWYgKHdwb3J0LT5od2J1Zl9tYXggPiB3cG9ydC0+c3didWZfc2l6ZSkKLQkJCXdwb3J0LT5od2J1Zl9tYXggPSB3cG9ydC0+c3didWZfc2l6ZTsKLQkJd3BvcnQtPmZsYWdzICY9IH5FUkZMT1dOOwotCQl3cG9ydC0+c3diX3VfYXZhaWwgPSB3cG9ydC0+c3didWZfc2l6ZTsKLQkJd3BvcnQtPnN3Yl9pX2F2YWlsID0gMDsKLQkJd3BvcnQtPnN3c3RhdGUgPSBTV19SVU47Ci0JCWxpX3NldHVwX2RtYSgmd3BvcnQtPmNoYW4sCi0JCQkgICAgICZsaV9jb21tMiwKLQkJCSAgICAgJmRldmMtPmxpdGgsCi0JCQkgICAgIHdwb3J0LT5od2J1Zl9wYWRkciwKLQkJCSAgICAgSFdCVUZfU0hJRlQsCi0JCQkgICAgIHdwb3J0LT5od19mcmFnc2hpZnQsCi0JCQkgICAgIHdwb3J0LT5zd19jaGFubmVscywKLQkJCSAgICAgd3BvcnQtPnNhbXBsZV9zaXplKTsKLQkJYWQxODQzX3NldHVwX2RhYygmZGV2Yy0+bGl0aCwKLQkJCQkgd3BvcnQtPnN3X2ZyYW1lcmF0ZSwKLQkJCQkgd3BvcnQtPnN3X3NhbXBsZWZtdCwKLQkJCQkgd3BvcnQtPnN3X2NoYW5uZWxzKTsKLQkJbGlfZW5hYmxlX2ludGVycnVwdHMoJmRldmMtPmxpdGgsIFdSSVRFX0lOVFJfTUFTSyk7Ci0JfQotCURCR1JWKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwY21fc2h1dGRvd25fcG9ydCAtIHNodXQgZG93biBvbmUgcG9ydCAoZGlyZWN0aW9uKSBmb3IgUENNIEkvTy4KLSAqIE9ubHkgY2FsbGVkIGZyb20gcGNtX3NodXRkb3duLgotICovCi0KLXN0YXRpYyB2b2lkIHBjbV9zaHV0ZG93bl9wb3J0KHZ3c25kX2Rldl90ICpkZXZjLAotCQkJICAgICAgdndzbmRfcG9ydF90ICphcG9ydCwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZTsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQotCWFwb3J0LT5zd3N0YXRlID0gU1dfSU5JVElBTDsKLQlhZGRfd2FpdF9xdWV1ZSgmYXBvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0Jd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJewotCQkJaHdzdGF0ZSA9IGFwb3J0LT5od3N0YXRlOwotCQl9CQkKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGh3c3RhdGUgPT0gSFdfU1RPUFBFRCkKLQkJCWJyZWFrOwotCQlzY2hlZHVsZSgpOwotCX0KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmYXBvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JbGlfZGlzYWJsZV9pbnRlcnJ1cHRzKCZkZXZjLT5saXRoLCBtYXNrKTsKLQlpZiAoYXBvcnQgPT0gJmRldmMtPnJwb3J0KQotCQlhZDE4NDNfc2h1dGRvd25fYWRjKCZkZXZjLT5saXRoKTsKLQllbHNlIC8qIGFwb3J0ID09ICZkZXZjLT53cG9ydCkgKi8KLQkJYWQxODQzX3NodXRkb3duX2RhYygmZGV2Yy0+bGl0aCk7Ci0JbGlfc2h1dGRvd25fZG1hKCZhcG9ydC0+Y2hhbik7Ci0JdmZyZWUoYXBvcnQtPnN3YnVmKTsKLQlhcG9ydC0+c3didWYgPSBOVUxMOwotCWFwb3J0LT5ieXRlX2NvdW50ID0gMDsKLX0KLQotLyoKLSAqIHBjbV9zaHV0ZG93biB1bmRvZXMgd2hhdCBwY21fc2V0dXAgZGlkLgotICogQWxzbyBzZXRzIHRoZSBwb3J0cycgc3dzdGF0ZSB0byBuZXdzdGF0ZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBwY21fc2h1dGRvd24odndzbmRfZGV2X3QgKmRldmMsCi0JCQkgdndzbmRfcG9ydF90ICpycG9ydCwKLQkJCSB2d3NuZF9wb3J0X3QgKndwb3J0KQotewotCURCR0VWKCIoZGV2Yz0weCVwLCBycG9ydD0weCVwLCB3cG9ydD0weCVwKVxuIiwgZGV2YywgcnBvcnQsIHdwb3J0KTsKLQotCWlmIChycG9ydCAmJiBycG9ydC0+c3didWYpIHsKLQkJREJHUFYoInNodXR0aW5nIGRvd24gcnBvcnRcbiIpOwotCQlwY21fc2h1dGRvd25fcG9ydChkZXZjLCBycG9ydCwgUkVBRF9JTlRSX01BU0spOwotCX0KLQlpZiAod3BvcnQgJiYgd3BvcnQtPnN3YnVmKSB7Ci0JCURCR1BWKCJzaHV0dGluZyBkb3duIHdwb3J0XG4iKTsKLQkJcGNtX3NodXRkb3duX3BvcnQoZGV2Yywgd3BvcnQsIFdSSVRFX0lOVFJfTUFTSyk7Ci0JfQotCURCR1JWKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjbV9jb3B5X2luKHZ3c25kX3BvcnRfdCAqcnBvcnQsIGludCBzd2lkeCwgaW50IGh3aWR4LCBpbnQgbmIpCi17Ci0JY2hhciAqc3JjID0gcnBvcnQtPmh3YnVmICsgaHdpZHg7Ci0JY2hhciAqZHN0ID0gcnBvcnQtPnN3YnVmICsgc3dpZHg7Ci0JaW50IGZtdCA9IHJwb3J0LT5zd19zYW1wbGVmbXQ7Ci0KLQlEQkdQVigic3dpZHggPSAlZCwgaHdpZHggPSAlZFxuIiwgc3dpZHgsIGh3aWR4KTsKLQlBU1NFUlQocnBvcnQtPmh3YnVmICE9IE5VTEwpOwotCUFTU0VSVChycG9ydC0+c3didWYgIT0gTlVMTCk7Ci0JQVNTRVJUKG5iID4gMCAmJiAobmIgJSAzMikgPT0gMCk7Ci0JQVNTRVJUKHN3aWR4ICUgMzIgPT0gMCAmJiBod2lkeCAlIDMyID09IDApOwotCUFTU0VSVChzd2lkeCA+PSAwICYmIHN3aWR4ICsgbmIgPD0gcnBvcnQtPnN3YnVmX3NpemUpOwotCUFTU0VSVChod2lkeCA+PSAwICYmIGh3aWR4ICsgbmIgPD0gcnBvcnQtPmh3YnVmX3NpemUpOwotCi0JaWYgKGZtdCA9PSBBRk1UX01VX0xBVyB8fCBmbXQgPT0gQUZNVF9BX0xBVyB8fCBmbXQgPT0gQUZNVF9TOCkgewotCi0JCS8qIFNlZSBTYW1wbGUgRm9ybWF0IE5vdGVzIGFib3ZlLiAqLwotCi0JCWNoYXIgKmVuZCA9IHNyYyArIG5iOwotCQl3aGlsZSAoc3JjIDwgZW5kKQotCQkJKmRzdCsrID0gKnNyYysrIF4gMHg4MDsKLQl9IGVsc2UKLQkJbWVtY3B5KGRzdCwgc3JjLCBuYik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjbV9jb3B5X291dCh2d3NuZF9wb3J0X3QgKndwb3J0LCBpbnQgc3dpZHgsIGludCBod2lkeCwgaW50IG5iKQotewotCWNoYXIgKnNyYyA9IHdwb3J0LT5zd2J1ZiArIHN3aWR4OwotCWNoYXIgKmRzdCA9IHdwb3J0LT5od2J1ZiArIGh3aWR4OwotCWludCBmbXQgPSB3cG9ydC0+c3dfc2FtcGxlZm10OwotCi0JQVNTRVJUKG5iID4gMCAmJiAobmIgJSAzMikgPT0gMCk7Ci0JQVNTRVJUKHdwb3J0LT5od2J1ZiAhPSBOVUxMKTsKLQlBU1NFUlQod3BvcnQtPnN3YnVmICE9IE5VTEwpOwotCUFTU0VSVChzd2lkeCAlIDMyID09IDAgJiYgaHdpZHggJSAzMiA9PSAwKTsKLQlBU1NFUlQoc3dpZHggPj0gMCAmJiBzd2lkeCArIG5iIDw9IHdwb3J0LT5zd2J1Zl9zaXplKTsKLQlBU1NFUlQoaHdpZHggPj0gMCAmJiBod2lkeCArIG5iIDw9IHdwb3J0LT5od2J1Zl9zaXplKTsKLQlpZiAoZm10ID09IEFGTVRfTVVfTEFXIHx8IGZtdCA9PSBBRk1UX0FfTEFXIHx8IGZtdCA9PSBBRk1UX1M4KSB7Ci0KLQkJLyogU2VlIFNhbXBsZSBGb3JtYXQgTm90ZXMgYWJvdmUuICovCi0KLQkJY2hhciAqZW5kID0gc3JjICsgbmI7Ci0JCXdoaWxlIChzcmMgPCBlbmQpCi0JCQkqZHN0KysgPSAqc3JjKysgXiAweDgwOwotCX0gZWxzZQotCQltZW1jcHkoZHN0LCBzcmMsIG5iKTsKLX0KLQotLyoKLSAqIHBjbV9vdXRwdXQoKSBpcyBjYWxsZWQgYm90aCBmcm9tIGJhc2VsZXZlbCBhbmQgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwuCi0gKiBUaGlzIGlzIHdoZXJlIGF1ZGlvIGZyYW1lcyBhcmUgY29waWVkIGludG8gdGhlIGhhcmR3YXJlLWFjY2Vzc2libGUKLSAqIHJpbmcgYnVmZmVyLgotICoKLSAqIExvY2tpbmcgbm90ZTogVGhlIHBhcnQgb2YgdGhpcyByb3V0aW5lIHRoYXQgZmlndXJlcyBvdXQgd2hhdCB0byBkbwotICogaG9sZHMgd3BvcnQtPmxvY2suICBUaGUgbG9uZ2VyIHBhcnQgcmVsZWFzZXMgd3BvcnQtPmxvY2ssIGJ1dCBzZXRzCi0gKiB3cG9ydC0+ZmxhZ3MgJiBIV19CVVNZLiAgQWZ0ZXJ3YXJkLCBpdCByZWFjcXVpcmVzIHdwb3J0LT5sb2NrLCBhbmQKLSAqIGNoZWNrcyBmb3IgbW9yZSB3b3JrIHRvIGRvLgotICoKLSAqIElmIGFub3RoZXIgdGhyZWFkIGNhbGxzIHBjbV9vdXRwdXQoKSB3aGlsZSBIV19CVVNZIGlzIHNldCwgaXQKLSAqIHJldHVybnMgaW1tZWRpYXRlbHksIGtub3dpbmcgdGhhdCB0aGUgdGhyZWFkIHRoYXQgc2V0IEhXX0JVU1kgd2lsbAotICogbG9vayBmb3IgbW9yZSB3b3JrIHRvIGRvIGJlZm9yZSByZXR1cm5pbmcuCi0gKgotICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHBvcnQtPmxvY2sgaXMgaGVsZCBmb3Igc2V2ZXJhbCBzaG9ydAotICogcGVyaW9kcyBpbnN0ZWFkIG9mIG9uZSBsb25nIHBlcmlvZC4gIEFsc28sIHdoZW4gcGNtX291dHB1dCBpcwotICogY2FsbGVkIGZyb20gYmFzZSBsZXZlbCwgaXQgcmVlbmFibGVzIGludGVycnVwdHMuCi0gKi8KLQotc3RhdGljIHZvaWQgcGNtX291dHB1dCh2d3NuZF9kZXZfdCAqZGV2YywgaW50IGVyZmxvd24sIGludCBuYikKLXsKLQl2d3NuZF9wb3J0X3QgKndwb3J0ID0gJmRldmMtPndwb3J0OwotCWNvbnN0IGludCBod21heCAgPSB3cG9ydC0+aHdidWZfbWF4OwotCWNvbnN0IGludCBod3NpemUgPSB3cG9ydC0+aHdidWZfc2l6ZTsKLQljb25zdCBpbnQgc3dzaXplID0gd3BvcnQtPnN3YnVmX3NpemU7Ci0JY29uc3QgaW50IGZyYWdzaXplID0gd3BvcnQtPmh3X2ZyYWdzaXplOwotCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwotCi0JREJHRVYoIihkZXZjPTB4JXAsIGVyZmxvd249JWQsIG5iPSVkKVxuIiwgZGV2YywgZXJmbG93biwgbmIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQlpZiAoZXJmbG93bikKLQkJd3BvcnQtPmZsYWdzIHw9IEVSRkxPV047Ci0JKHZvaWQpIF9fc3diX2luY191KHdwb3J0LCBuYik7Ci0JaWYgKHdwb3J0LT5mbGFncyAmIEhXX0JVU1kpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7Ci0JCURCR1BWKCJyZXR1cm5pbmc6IEhXIEJVU1lcbiIpOwotCQlyZXR1cm47Ci0JfQotCWlmICh3cG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJREJHUFYoInJldHVybmluZzogRElTQUJMRURcbiIpOwotCQlyZXR1cm47Ci0JfQotCXdwb3J0LT5mbGFncyB8PSBIV19CVVNZOwotCXdoaWxlICgxKSB7Ci0JCWludCBzd3B0ciwgaHdwdHIsIGh3X2F2YWlsLCBzd19hdmFpbCwgc3dpZHg7Ci0JCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGUgPSB3cG9ydC0+aHdzdGF0ZTsKLQkJdndzbmRfcG9ydF9zd3N0YXRlX3Qgc3dzdGF0ZSA9IHdwb3J0LT5zd3N0YXRlOwotCQlpbnQgaHdfdW5hdmFpbDsKLQkJdXN0bXNjX3QgdXN0bXNjOwotCi0JCWh3cHRyID0gbGlfcmVhZF9od3B0cigmd3BvcnQtPmNoYW4pOwotCQlzd3B0ciA9IGxpX3JlYWRfc3dwdHIoJndwb3J0LT5jaGFuKTsKLQkJaHdfdW5hdmFpbCA9IChzd3B0ciAtIGh3cHRyICsgaHdzaXplKSAlIGh3c2l6ZTsKLQkJaHdfYXZhaWwgPSAoaHdtYXggLSBod191bmF2YWlsKSAmIC1mcmFnc2l6ZTsKLQkJc3dfYXZhaWwgPSB3cG9ydC0+c3diX2lfYXZhaWwgJiAtZnJhZ3NpemU7Ci0JCWlmIChzd19hdmFpbCAmJiBzd3N0YXRlID09IFNXX1JVTikgewotCQkJaWYgKHdwb3J0LT5mbGFncyAmIEVSRkxPV04pIHsKLQkJCQl3cG9ydC0+ZmxhZ3MgJj0gfkVSRkxPV047Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3dzdGF0ZSA9PSBTV19JTklUSUFMIHx8Ci0JCQkgc3dzdGF0ZSA9PSBTV19PRkYgfHwKLQkJCSAoc3dzdGF0ZSA9PSBTV19EUkFJTiAmJgotCQkJICAhc3dfYXZhaWwgJiYKLQkJCSAgKHdwb3J0LT5mbGFncyAmIEVSRkxPV04pKSkgewotCQkJREJHUCgic3RvcHBpbmcuICBod3N0YXRlID0gJWRcbiIsIGh3c3RhdGUpOwotCQkJaWYgKGh3c3RhdGUgIT0gSFdfU1RPUFBFRCkgewotCQkJCWxpX2RlYWN0aXZhdGVfZG1hKCZ3cG9ydC0+Y2hhbik7Ci0JCQkJd3BvcnQtPmh3c3RhdGUgPSBIV19TVE9QUEVEOwotCQkJfQotCQkJd2FrZV91cCgmd3BvcnQtPnF1ZXVlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghc3dfYXZhaWwgfHwgIWh3X2F2YWlsKQotCQkJYnJlYWs7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCi0JCS8qCi0JCSAqIFdlIGdhdmUgdXAgdGhlIHBvcnQgbG9jaywgYnV0IHdlIGhhdmUgdGhlIEhXX0JVU1kgZmxhZy4KLQkJICogUHJvY2VlZCB3aXRob3V0IGFjY2Vzc2luZyBhbnkgbm9ubG9jYWwgc3RhdGUuCi0JCSAqIERvIG5vdCBleGl0IHRoZSBsb29wIC0tIG11c3QgY2hlY2sgZm9yIG1vcmUgd29yay4KLQkJICovCi0KLQkJc3dpZHggPSB3cG9ydC0+c3diX2lfaWR4OwotCQluYiA9IGh3X2F2YWlsOwotCQlpZiAobmIgPiBzd19hdmFpbCkKLQkJCW5iID0gc3dfYXZhaWw7Ci0JCWlmIChuYiA+IGh3c2l6ZSAtIHN3cHRyKQotCQkJbmIgPSBod3NpemUgLSBzd3B0cjsgLyogZG9uJ3Qgb3ZlcmZsb3cgaHdidWYgKi8KLQkJaWYgKG5iID4gc3dzaXplIC0gc3dpZHgpCi0JCQluYiA9IHN3c2l6ZSAtIHN3aWR4OyAvKiBkb24ndCBvdmVyZmxvdyBzd2J1ZiAqLwotCQlBU1NFUlQobmIgPiAwKTsKLQkJaWYgKG5iICUgZnJhZ3NpemUpIHsKLQkJCURCR1AoIm5iID0gJWQsIGZyYWdzaXplID0gJWRcbiIsIG5iLCBmcmFnc2l6ZSk7Ci0JCQlEQkdQKCJod19hdmFpbCA9ICVkXG4iLCBod19hdmFpbCk7Ci0JCQlEQkdQKCJzd19hdmFpbCA9ICVkXG4iLCBzd19hdmFpbCk7Ci0JCQlEQkdQKCJod3NpemUgPSAlZCwgc3dwdHIgPSAlZFxuIiwgaHdzaXplLCBzd3B0cik7Ci0JCQlEQkdQKCJzd3NpemUgPSAlZCwgc3dpZHggPSAlZFxuIiwgc3dzaXplLCBzd2lkeCk7Ci0JCX0KLQkJQVNTRVJUKCEobmIgJSBmcmFnc2l6ZSkpOwotCQlEQkdQVigiY29weWluZyBzd2JbJWQuLiVkXSB0byBod2JbJWQuLiVkXVxuIiwKLQkJICAgICAgc3dpZHgsIHN3aWR4ICsgbmIsIHN3cHRyLCBzd3B0ciArIG5iKTsKLQkJcGNtX2NvcHlfb3V0KHdwb3J0LCBzd2lkeCwgc3dwdHIsIG5iKTsKLQkJbGlfd3JpdGVfc3dwdHIoJndwb3J0LT5jaGFuLCAoc3dwdHIgKyBuYikgJSBod3NpemUpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7Ci0JCWlmIChod3N0YXRlID09IEhXX1NUT1BQRUQpIHsKLQkJCURCR1BWKCJzdGFydGluZ1xuIik7Ci0JCQlsaV9hY3RpdmF0ZV9kbWEoJndwb3J0LT5jaGFuKTsKLQkJCXdwb3J0LT5od3N0YXRlID0gSFdfUlVOTklORzsKLQkJCWxpX3JlYWRfVVNUTVNDKCZ3cG9ydC0+Y2hhbiwgJnVzdG1zYyk7Ci0JCQlBU1NFUlQod3BvcnQtPmJ5dGVfY291bnQgJSB3cG9ydC0+ZnJhbWVfc2l6ZSA9PSAwKTsKLQkJCXdwb3J0LT5NU0Nfb2Zmc2V0ID0gdXN0bXNjLm1zYyAtIHdwb3J0LT5ieXRlX2NvdW50IC8gd3BvcnQtPmZyYW1lX3NpemU7Ci0JCX0KLQkJX19zd2JfaW5jX2kod3BvcnQsIG5iKTsKLQkJd3BvcnQtPmJ5dGVfY291bnQgKz0gbmI7Ci0JCXdwb3J0LT5mcmFnX2NvdW50ICs9IG5iIC8gZnJhZ3NpemU7Ci0JCUFTU0VSVChuYiAlIGZyYWdzaXplID09IDApOwotCQl3YWtlX3VwKCZ3cG9ydC0+cXVldWUpOwotCX0KLQl3cG9ydC0+ZmxhZ3MgJj0gfkhXX0JVU1k7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7Ci0JREJHUlYoKTsKLX0KLQotLyoKLSAqIHBjbV9pbnB1dCgpIGlzIGNhbGxlZCBib3RoIGZyb20gYmFzZWxldmVsIGFuZCBmcm9tIGludGVycnVwdCBsZXZlbC4KLSAqIFRoaXMgaXMgd2hlcmUgYXVkaW8gZnJhbWVzIGFyZSBjb3BpZWQgb3V0IG9mIHRoZSBoYXJkd2FyZS1hY2Nlc3NpYmxlCi0gKiByaW5nIGJ1ZmZlci4KLSAqCi0gKiBMb2NraW5nIG5vdGU6IFRoZSBwYXJ0IG9mIHRoaXMgcm91dGluZSB0aGF0IGZpZ3VyZXMgb3V0IHdoYXQgdG8gZG8KLSAqIGhvbGRzIHJwb3J0LT5sb2NrLiAgVGhlIGxvbmdlciBwYXJ0IHJlbGVhc2VzIHJwb3J0LT5sb2NrLCBidXQgc2V0cwotICogcnBvcnQtPmZsYWdzICYgSFdfQlVTWS4gIEFmdGVyd2FyZCwgaXQgcmVhY3F1aXJlcyBycG9ydC0+bG9jaywgYW5kCi0gKiBjaGVja3MgZm9yIG1vcmUgd29yayB0byBkby4KLSAqCi0gKiBJZiBhbm90aGVyIHRocmVhZCBjYWxscyBwY21faW5wdXQoKSB3aGlsZSBIV19CVVNZIGlzIHNldCwgaXQKLSAqIHJldHVybnMgaW1tZWRpYXRlbHksIGtub3dpbmcgdGhhdCB0aGUgdGhyZWFkIHRoYXQgc2V0IEhXX0JVU1kgd2lsbAotICogbG9vayBmb3IgbW9yZSB3b3JrIHRvIGRvIGJlZm9yZSByZXR1cm5pbmcuCi0gKgotICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHBvcnQtPmxvY2sgaXMgaGVsZCBmb3Igc2V2ZXJhbCBzaG9ydAotICogcGVyaW9kcyBpbnN0ZWFkIG9mIG9uZSBsb25nIHBlcmlvZC4gIEFsc28sIHdoZW4gcGNtX2lucHV0IGlzCi0gKiBjYWxsZWQgZnJvbSBiYXNlIGxldmVsLCBpdCByZWVuYWJsZXMgaW50ZXJydXB0cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBwY21faW5wdXQodndzbmRfZGV2X3QgKmRldmMsIGludCBlcmZsb3duLCBpbnQgbmIpCi17Ci0JdndzbmRfcG9ydF90ICpycG9ydCA9ICZkZXZjLT5ycG9ydDsKLQljb25zdCBpbnQgaHdtYXggID0gcnBvcnQtPmh3YnVmX21heDsKLQljb25zdCBpbnQgaHdzaXplID0gcnBvcnQtPmh3YnVmX3NpemU7Ci0JY29uc3QgaW50IHN3c2l6ZSA9IHJwb3J0LT5zd2J1Zl9zaXplOwotCWNvbnN0IGludCBmcmFnc2l6ZSA9IHJwb3J0LT5od19mcmFnc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGlmbGFnczsKLQotCURCR0VWKCIoZGV2Yz0weCVwLCBlcmZsb3duPSVkLCBuYj0lZClcbiIsIGRldmMsIGVyZmxvd24sIG5iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKLQlpZiAoZXJmbG93bikKLQkJcnBvcnQtPmZsYWdzIHw9IEVSRkxPV047Ci0JKHZvaWQpIF9fc3diX2luY191KHJwb3J0LCBuYik7Ci0JaWYgKHJwb3J0LT5mbGFncyAmIEhXX0JVU1kgfHwgIXJwb3J0LT5zd2J1ZikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJREJHUFYoInJldHVybmluZzogSFcgQlVTWSBvciAhc3didWZcbiIpOwotCQlyZXR1cm47Ci0JfQotCWlmIChycG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJREJHUFYoInJldHVybmluZzogRElTQUJMRURcbiIpOwotCQlyZXR1cm47Ci0JfQotCXJwb3J0LT5mbGFncyB8PSBIV19CVVNZOwotCXdoaWxlICgxKSB7Ci0JCWludCBzd3B0ciwgaHdwdHIsIGh3X2F2YWlsLCBzd19hdmFpbCwgc3dpZHg7Ci0JCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGUgPSBycG9ydC0+aHdzdGF0ZTsKLQkJdndzbmRfcG9ydF9zd3N0YXRlX3Qgc3dzdGF0ZSA9IHJwb3J0LT5zd3N0YXRlOwotCi0JCWh3cHRyID0gbGlfcmVhZF9od3B0cigmcnBvcnQtPmNoYW4pOwotCQlzd3B0ciA9IGxpX3JlYWRfc3dwdHIoJnJwb3J0LT5jaGFuKTsKLQkJaHdfYXZhaWwgPSAoaHdwdHIgLSBzd3B0ciArIGh3c2l6ZSkgJSBod3NpemUgJiAtZnJhZ3NpemU7Ci0JCWlmIChod19hdmFpbCA+IGh3bWF4KQotCQkJaHdfYXZhaWwgPSBod21heDsKLQkJc3dfYXZhaWwgPSBycG9ydC0+c3diX2lfYXZhaWwgJiAtZnJhZ3NpemU7Ci0JCWlmIChzd3N0YXRlICE9IFNXX1JVTikgewotCQkJREJHUCgic3RvcHBpbmcuICBod3N0YXRlID0gJWRcbiIsIGh3c3RhdGUpOwotCQkJaWYgKGh3c3RhdGUgIT0gSFdfU1RPUFBFRCkgewotCQkJCWxpX2RlYWN0aXZhdGVfZG1hKCZycG9ydC0+Y2hhbik7Ci0JCQkJcnBvcnQtPmh3c3RhdGUgPSBIV19TVE9QUEVEOwotCQkJfQotCQkJd2FrZV91cCgmcnBvcnQtPnF1ZXVlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghc3dfYXZhaWwgfHwgIWh3X2F2YWlsKQotCQkJYnJlYWs7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOwotCi0JCS8qCi0JCSAqIFdlIGdhdmUgdXAgdGhlIHBvcnQgbG9jaywgYnV0IHdlIGhhdmUgdGhlIEhXX0JVU1kgZmxhZy4KLQkJICogUHJvY2VlZCB3aXRob3V0IGFjY2Vzc2luZyBhbnkgbm9ubG9jYWwgc3RhdGUuCi0JCSAqIERvIG5vdCBleGl0IHRoZSBsb29wIC0tIG11c3QgY2hlY2sgZm9yIG1vcmUgd29yay4KLQkJICovCi0KLQkJc3dpZHggPSBycG9ydC0+c3diX2lfaWR4OwotCQluYiA9IGh3X2F2YWlsOwotCQlpZiAobmIgPiBzd19hdmFpbCkKLQkJCW5iID0gc3dfYXZhaWw7Ci0JCWlmIChuYiA+IGh3c2l6ZSAtIHN3cHRyKQotCQkJbmIgPSBod3NpemUgLSBzd3B0cjsgLyogZG9uJ3Qgb3ZlcmZsb3cgaHdidWYgKi8KLQkJaWYgKG5iID4gc3dzaXplIC0gc3dpZHgpCi0JCQluYiA9IHN3c2l6ZSAtIHN3aWR4OyAvKiBkb24ndCBvdmVyZmxvdyBzd2J1ZiAqLwotCQlBU1NFUlQobmIgPiAwKTsKLQkJaWYgKG5iICUgZnJhZ3NpemUpIHsKLQkJCURCR1AoIm5iID0gJWQsIGZyYWdzaXplID0gJWRcbiIsIG5iLCBmcmFnc2l6ZSk7Ci0JCQlEQkdQKCJod19hdmFpbCA9ICVkXG4iLCBod19hdmFpbCk7Ci0JCQlEQkdQKCJzd19hdmFpbCA9ICVkXG4iLCBzd19hdmFpbCk7Ci0JCQlEQkdQKCJod3NpemUgPSAlZCwgc3dwdHIgPSAlZFxuIiwgaHdzaXplLCBzd3B0cik7Ci0JCQlEQkdQKCJzd3NpemUgPSAlZCwgc3dpZHggPSAlZFxuIiwgc3dzaXplLCBzd2lkeCk7Ci0JCX0KLQkJQVNTRVJUKCEobmIgJSBmcmFnc2l6ZSkpOwotCQlEQkdQVigiY29weWluZyBod2JbJWQuLiVkXSB0byBzd2JbJWQuLiVkXVxuIiwKLQkJICAgICAgc3dwdHIsIHN3cHRyICsgbmIsIHN3aWR4LCBzd2lkeCArIG5iKTsKLQkJcGNtX2NvcHlfaW4ocnBvcnQsIHN3aWR4LCBzd3B0ciwgbmIpOwotCQlsaV93cml0ZV9zd3B0cigmcnBvcnQtPmNoYW4sIChzd3B0ciArIG5iKSAlIGh3c2l6ZSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKLQkJX19zd2JfaW5jX2kocnBvcnQsIG5iKTsKLQkJcnBvcnQtPmJ5dGVfY291bnQgKz0gbmI7Ci0JCXJwb3J0LT5mcmFnX2NvdW50ICs9IG5iIC8gZnJhZ3NpemU7Ci0JCUFTU0VSVChuYiAlIGZyYWdzaXplID09IDApOwotCQl3YWtlX3VwKCZycG9ydC0+cXVldWUpOwotCX0KLQlycG9ydC0+ZmxhZ3MgJj0gfkhXX0JVU1k7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7Ci0JREJHUlYoKTsKLX0KLQotLyoKLSAqIHBjbV9mbHVzaF9mcmFnKCkgd3JpdGVzIHplcm8gc2FtcGxlcyB0byBmaWxsIHRoZSBjdXJyZW50IGZyYWdtZW50LAotICogdGhlbiBmbHVzaGVzIGl0IHRvIHRoZSBoYXJkd2FyZS4KLSAqCi0gKiBJdCBpcyBvbmx5IG1lYW5pbmdmdWwgdG8gZmx1c2ggb3V0cHV0LCBub3QgaW5wdXQuCi0gKi8KLQotc3RhdGljIHZvaWQgcGNtX2ZsdXNoX2ZyYWcodndzbmRfZGV2X3QgKmRldmMpCi17Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9ICZkZXZjLT53cG9ydDsKLQotCURCR1BWKCJzd3N0YXRlID0gJWRcbiIsIHdwb3J0LT5zd3N0YXRlKTsKLQlpZiAod3BvcnQtPnN3c3RhdGUgPT0gU1dfUlVOKSB7Ci0JCWludCBpZHggPSB3cG9ydC0+c3diX3VfaWR4OwotCQlpbnQgZW5kID0gKGlkeCArIHdwb3J0LT5od19mcmFnc2l6ZSAtIDEpCi0JCQk+PiB3cG9ydC0+aHdfZnJhZ3NoaWZ0Ci0JCQk8PCB3cG9ydC0+aHdfZnJhZ3NoaWZ0OwotCQlpbnQgbmIgPSBlbmQgLSBpZHg7Ci0JCURCR1BWKCJjbGVhcmluZyAlZCBieXRlc1xuIiwgbmIpOwotCQlpZiAobmIpCi0JCQltZW1zZXQod3BvcnQtPnN3YnVmICsgaWR4LAotCQkJICAgICAgIChjaGFyKSB3cG9ydC0+emVyb193b3JkLAotCQkJICAgICAgIG5iKTsKLQkJd3BvcnQtPnN3c3RhdGUgPSBTV19EUkFJTjsKLQkJcGNtX291dHB1dChkZXZjLCAwLCBuYik7Ci0JfQotCURCR1JWKCk7Ci19Ci0KLS8qCi0gKiBXYWl0IGZvciBvdXRwdXQgdG8gZHJhaW4uICBUaGlzIHNsZWVwcyB1bmludGVycnVwdGlibHkgYmVjYXVzZQotICogdGhlcmUgaXMgbm90aGluZyBpbnRlbGxpZ2VudCB3ZSBjYW4gZG8gaWYgaW50ZXJydXB0ZWQuICBUaGlzCi0gKiBtZWFucyB0aGUgcHJvY2VzcyB3aWxsIGJlIGRlbGF5ZWQgaW4gcmVzcG9uZGluZyB0byB0aGUgc2lnbmFsLgotICovCi0KLXN0YXRpYyB2b2lkIHBjbV93cml0ZV9zeW5jKHZ3c25kX2Rldl90ICpkZXZjKQotewotCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlOwotCi0JREJHRVYoIihkZXZjPTB4JXApXG4iLCBkZXZjKTsKLQlhZGRfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0Jd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJewotCQkJaHdzdGF0ZSA9IHdwb3J0LT5od3N0YXRlOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCWlmIChod3N0YXRlID09IEhXX1NUT1BQRUQpCi0JCQlicmVhazsKLQkJc2NoZWR1bGUoKTsKLQl9Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOwotCURCR1BWKCJzd3N0YXRlID0gJWQsIGh3c3RhdGUgPSAlZFxuIiwgd3BvcnQtPnN3c3RhdGUsIHdwb3J0LT5od3N0YXRlKTsKLQlEQkdSVigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBhdWRpbyBkcml2ZXIgKi8KLQotLyoKLSAqIHNlZWsgb24gYW4gYXVkaW8gZGV2aWNlIGFsd2F5cyBmYWlscy4KLSAqLwotCi1zdGF0aWMgdm9pZCB2d3NuZF9hdWRpb19yZWFkX2ludHIodndzbmRfZGV2X3QgKmRldmMsIHVuc2lnbmVkIGludCBzdGF0dXMpCi17Ci0JaW50IG92ZXJmbG93biA9IHN0YXR1cyAmIExJX0lOVFJfQ09NTTFfT1ZFUkZMT1c7Ci0KLQlpZiAoc3RhdHVzICYgUkVBRF9JTlRSX01BU0spCi0JCXBjbV9pbnB1dChkZXZjLCBvdmVyZmxvd24sIDApOwotfQotCi1zdGF0aWMgdm9pZCB2d3NuZF9hdWRpb193cml0ZV9pbnRyKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgc3RhdHVzKQotewotCWludCB1bmRlcmZsb3duID0gc3RhdHVzICYgTElfSU5UUl9DT01NMl9VTkRFUkZMT1c7Ci0KLQlpZiAoc3RhdHVzICYgV1JJVEVfSU5UUl9NQVNLKQotCQlwY21fb3V0cHV0KGRldmMsIHVuZGVyZmxvd24sIDApOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdndzbmRfYXVkaW9faW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBkZXZfaWQ7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCURCR0VWKCIoaXJxPSVkLCBkZXZfaWQ9MHglcClcbiIsIGlycSwgZGV2X2lkKTsKLQotCXN0YXR1cyA9IGxpX2dldF9jbGVhcl9pbnRyX3N0YXR1cygmZGV2Yy0+bGl0aCk7Ci0JdndzbmRfYXVkaW9fcmVhZF9pbnRyKGRldmMsIHN0YXR1cyk7Ci0JdndzbmRfYXVkaW9fd3JpdGVfaW50cihkZXZjLCBzdGF0dXMpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHNzaXplX3QgdndzbmRfYXVkaW9fZG9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICBjaGFyICpidWZmZXIsCi0JCQkJICAgc2l6ZV90IGNvdW50LAotCQkJCSAgIGxvZmZfdCAqcHBvcykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl2d3NuZF9wb3J0X3QgKnJwb3J0ID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/Ci0JCQkgICAgICAgJmRldmMtPnJwb3J0IDogTlVMTCk7Ci0JaW50IHJldCwgbmI7Ci0KLQlEQkdFVigiKGZpbGU9MHglcCwgYnVmZmVyPTB4JXAsIGNvdW50PSVkLCBwcG9zPTB4JXApXG4iLAotCSAgICAgZmlsZSwgYnVmZmVyLCBjb3VudCwgcHBvcyk7Ci0KLQlpZiAoIXJwb3J0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChycG9ydC0+c3didWYgPT0gTlVMTCkgewotCQl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA/Ci0JCQkmZGV2Yy0+d3BvcnQgOiBOVUxMOwotCQlyZXQgPSBwY21fc2V0dXAoZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0ID0gMDsKLQl3aGlsZSAoY291bnQpIHsKLQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JCWFkZF93YWl0X3F1ZXVlKCZycG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJd2hpbGUgKChuYiA9IHN3Yl9pbmNfdShycG9ydCwgMCkpID09IDApIHsKLQkJCURCR1BWKCJibG9ja2luZ1xuIik7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJaWYgKHJwb3J0LT5mbGFncyAmIERJU0FCTEVEIHx8Ci0JCQkgICAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnBvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47Ci0JCQl9Ci0JCQlzY2hlZHVsZSgpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7Ci0JCQl9Ci0JCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZycG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJcGNtX2lucHV0KGRldmMsIDAsIDApOwotCQkvKiBuYiBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHVzZXJidWYuICovCi0JCWlmIChuYiA+IGNvdW50KQotCQkJbmIgPSBjb3VudDsKLQkJREJHUFYoIm5iID0gJWRcbiIsIG5iKTsKLQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHJwb3J0LT5zd2J1ZiArIHJwb3J0LT5zd2JfdV9pZHgsIG5iKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQkodm9pZCkgc3diX2luY191KHJwb3J0LCBuYik7Ci0JCWJ1ZmZlciArPSBuYjsKLQkJY291bnQgLT0gbmI7Ci0JCXJldCArPSBuYjsKLQl9Ci0JREJHUFYoInJldHVybmluZyAlZFxuIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNoYXIgKmJ1ZmZlciwKLQkJCQlzaXplX3QgY291bnQsCi0JCQkJbG9mZl90ICpwcG9zKQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNzaXplX3QgcmV0OwotCi0JbXV0ZXhfbG9jaygmZGV2Yy0+aW9fbXV0ZXgpOwotCXJldCA9IHZ3c25kX2F1ZGlvX2RvX3JlYWQoZmlsZSwgYnVmZmVyLCBjb3VudCwgcHBvcyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgdndzbmRfYXVkaW9fZG9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwKLQkJCQkgICAgc2l6ZV90IGNvdW50LAotCQkJCSAgICBsb2ZmX3QgKnBwb3MpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdndzbmRfcG9ydF90ICp3cG9ydCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KLQkJCSAgICAgICAmZGV2Yy0+d3BvcnQgOiBOVUxMKTsKLQlpbnQgcmV0LCBuYjsKLQotCURCR0VWKCIoZmlsZT0weCVwLCBidWZmZXI9MHglcCwgY291bnQ9JWQsIHBwb3M9MHglcClcbiIsCi0JICAgICAgZmlsZSwgYnVmZmVyLCBjb3VudCwgcHBvcyk7Ci0KLQlpZiAoIXdwb3J0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh3cG9ydC0+c3didWYgPT0gTlVMTCkgewotCQl2d3NuZF9wb3J0X3QgKnJwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KLQkJCSZkZXZjLT5ycG9ydCA6IE5VTEw7Ci0JCXJldCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldCA9IDA7Ci0Jd2hpbGUgKGNvdW50KSB7Ci0JCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCQlhZGRfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JCXdoaWxlICgobmIgPSBzd2JfaW5jX3Uod3BvcnQsIDApKSA9PSAwKSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJaWYgKHdwb3J0LT5mbGFncyAmIERJU0FCTEVEIHx8Ci0JCQkgICAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7Ci0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47Ci0JCQl9Ci0JCQlzY2hlZHVsZSgpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCQkJcmVtb3ZlX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOwotCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7Ci0JCQl9Ci0JCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKLQkJLyogbmIgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiB1c2VyYnVmLiAqLwotCQlpZiAobmIgPiBjb3VudCkKLQkJCW5iID0gY291bnQ7Ci0JCURCR1BWKCJuYiA9ICVkXG4iLCBuYik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcih3cG9ydC0+c3didWYgKyB3cG9ydC0+c3diX3VfaWR4LCBidWZmZXIsIG5iKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwY21fb3V0cHV0KGRldmMsIDAsIG5iKTsKLQkJYnVmZmVyICs9IG5iOwotCQljb3VudCAtPSBuYjsKLQkJcmV0ICs9IG5iOwotCX0KLQlEQkdQVigicmV0dXJuaW5nICVkXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZ3c25kX2F1ZGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSBjb25zdCBjaGFyICpidWZmZXIsCi0JCQkJIHNpemVfdCBjb3VudCwKLQkJCQkgbG9mZl90ICpwcG9zKQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNzaXplX3QgcmV0OwotCi0JbXV0ZXhfbG9jaygmZGV2Yy0+aW9fbXV0ZXgpOwotCXJldCA9IHZ3c25kX2F1ZGlvX2RvX3dyaXRlKGZpbGUsIGJ1ZmZlciwgY291bnQsIHBwb3MpOwotCW11dGV4X3VubG9jaygmZGV2Yy0+aW9fbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCB2d3NuZF9hdWRpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gKHZ3c25kX2Rldl90ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQl2d3NuZF9wb3J0X3QgKnJwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KLQkJJmRldmMtPnJwb3J0IDogTlVMTDsKLQl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA/Ci0JCSZkZXZjLT53cG9ydCA6IE5VTEw7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JREJHRVYoIihmaWxlPTB4JXAsIHdhaXQ9MHglcClcbiIsIGZpbGUsIHdhaXQpOwotCi0JQVNTRVJUKHJwb3J0IHx8IHdwb3J0KTsKLQlpZiAocnBvcnQpIHsKLQkJcG9sbF93YWl0KGZpbGUsICZycG9ydC0+cXVldWUsIHdhaXQpOwotCQlpZiAoc3diX2luY191KHJwb3J0LCAwKSkKLQkJCW1hc2sgfD0gKFBPTExJTiB8IFBPTExSRE5PUk0pOwotCX0KLQlpZiAod3BvcnQpIHsKLQkJcG9sbF93YWl0KGZpbGUsICZ3cG9ydC0+cXVldWUsIHdhaXQpOwotCQlpZiAod3BvcnQtPnN3YnVmID09IE5VTEwgfHwgc3diX2luY191KHdwb3J0LCAwKSkKLQkJCW1hc2sgfD0gKFBPTExPVVQgfCBQT0xMV1JOT1JNKTsKLQl9Ci0KLQlEQkdQVigicmV0dXJuaW5nIDB4JXhcbiIsIG1hc2spOwotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgaW50IHZ3c25kX2F1ZGlvX2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPwotCQkmZGV2Yy0+cnBvcnQgOiBOVUxMOwotCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KLQkJJmRldmMtPndwb3J0IDogTlVMTDsKLQl2d3NuZF9wb3J0X3QgKmFwb3J0ID0gcnBvcnQgPyBycG9ydCA6IHdwb3J0OwotCXN0cnVjdCBhdWRpb19idWZfaW5mbyBidWZfaW5mbzsKLQlzdHJ1Y3QgY291bnRfaW5mbyBpbmZvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGl2YWw7Ci0KLQkKLQlEQkdFVigiKGZpbGU9MHglcCwgY21kPTB4JXgsIGFyZz0weCVseClcbiIsCi0JICAgICAgZmlsZSwgY21kLCBhcmcpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPU1NfR0VUVkVSU0lPTjoJCS8qIF9TSU9SICgnTScsIDExOCwgaW50KSAqLwotCQlEQkdYKCJPU1NfR0VUVkVSU0lPTlxuIik7Ci0JCWl2YWwgPSBTT1VORF9WRVJTSU9OOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CS8qIF9TSU9SICgnUCcsMTUsIGludCkgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRDQVBTXG4iKTsKLQkJaXZhbCA9IERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUjsKLQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvKiBfU0lPUiAoJ1AnLDExLCBpbnQpICovCi0JCURCR1goIlNORENUTF9EU1BfR0VURk1UU1xuIik7Ci0JCWl2YWwgPSAoQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgfAotCQkJQUZNVF9VOCB8IEFGTVRfUzgpOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToJLyogX1NJT1IgKCdQJywgMiwgaW50KSAqLwotCQlEQkdYKCJTT1VORF9QQ01fUkVBRF9SQVRFXG4iKTsKLQkJaXZhbCA9IGFwb3J0LT5zd19mcmFtZXJhdGU7Ci0JCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgkvKiBfU0lPUiAoJ1AnLCA2LCBpbnQpICovCi0JCURCR1goIlNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTXG4iKTsKLQkJaXZhbCA9IGFwb3J0LT5zd19jaGFubmVsczsKLQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoJCS8qIF9TSU9XUignUCcsIDIsIGludCkgKi8KLQkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NQRUVEICVkXG4iLCBpdmFsKTsKLQkJaWYgKGl2YWwpIHsKLQkJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKSB7Ci0JCQkJREJHWCgiU05EQ1RMX0RTUF9TUEVFRCBmYWlsZWQ6IHN3c3RhdGUgPSAlZFxuIiwKLQkJCQkgICAgIGFwb3J0LT5zd3N0YXRlKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWlmIChpdmFsIDwgTUlOX1NQRUVEKQotCQkJCWl2YWwgPSBNSU5fU1BFRUQ7Ci0JCQlpZiAoaXZhbCA+IE1BWF9TUEVFRCkKLQkJCQlpdmFsID0gTUFYX1NQRUVEOwotCQkJaWYgKHJwb3J0KQotCQkJCXJwb3J0LT5zd19mcmFtZXJhdGUgPSBpdmFsOwotCQkJaWYgKHdwb3J0KQotCQkJCXdwb3J0LT5zd19mcmFtZXJhdGUgPSBpdmFsOwotCQl9IGVsc2UKLQkJCWl2YWwgPSBhcG9ydC0+c3dfZnJhbWVyYXRlOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1NURVJFTzoJCS8qIF9TSU9XUignUCcsIDMsIGludCkgKi8KLQkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NURVJFTyAlZFxuIiwgaXZhbCk7Ci0JCWlmIChpdmFsICE9IDAgJiYgaXZhbCAhPSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChycG9ydCkKLQkJCXJwb3J0LT5zd19jaGFubmVscyA9IGl2YWwgKyAxOwotCQlpZiAod3BvcnQpCi0JCQl3cG9ydC0+c3dfY2hhbm5lbHMgPSBpdmFsICsgMTsKLQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoJLyogX1NJT1dSKCdQJywgNiwgaW50KSAqLwotCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURCR1goIlNORENUTF9EU1BfQ0hBTk5FTFMgJWRcbiIsIGl2YWwpOwotCQlpZiAoaXZhbCAhPSAxICYmIGl2YWwgIT0gMikKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoYXBvcnQtPnN3c3RhdGUgIT0gU1dfSU5JVElBTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAocnBvcnQpCi0JCQlycG9ydC0+c3dfY2hhbm5lbHMgPSBpdmFsOwotCQlpZiAod3BvcnQpCi0JCQl3cG9ydC0+c3dfY2hhbm5lbHMgPSBpdmFsOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CS8qIF9TSU9XUignUCcsIDQsIGludCkgKi8KLQkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAoaXZhbCA8IDApIHsKLQkJCURCR1goIlNORENUTF9EU1BfR0VUQkxLU0laRSBmYWlsZWQsIGVycm5vICVkXG4iLCBpdmFsKTsKLQkJCXJldHVybiBpdmFsOwotCQl9Ci0JCWl2YWwgPSAxIDw8IGFwb3J0LT5zd19mcmFnc2hpZnQ7Ci0JCURCR1goIlNORENUTF9EU1BfR0VUQkxLU0laRSByZXR1cm5pbmcgJWRcbiIsIGl2YWwpOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgkvKiBfU0lPV1IoJ1AnLDEwLCBpbnQpICovCi0JCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREJHWCgiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCAlZDolZFxuIiwKLQkJICAgICBpdmFsID4+IDE2LCBpdmFsICYgMHhGRkZGKTsKLQkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJewotCQkJaW50IHN3X2ZyYWdzaGlmdCA9IGl2YWwgJiAweEZGRkY7Ci0JCQlpbnQgc3dfc3ViZGl2c2hpZnQgPSBhcG9ydC0+c3dfc3ViZGl2c2hpZnQ7Ci0JCQlpbnQgaHdfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0IC0gc3dfc3ViZGl2c2hpZnQ7Ci0JCQlpbnQgc3dfZnJhZ2NvdW50ID0gKGl2YWwgPj4gMTYpICYgMHhGRkZGOwotCQkJaW50IGh3X2ZyYWdzaXplOwotCQkJaWYgKGh3X2ZyYWdzaGlmdCA8IE1JTl9GUkFHU0hJRlQpCi0JCQkJaHdfZnJhZ3NoaWZ0ID0gTUlOX0ZSQUdTSElGVDsKLQkJCWlmIChod19mcmFnc2hpZnQgPiBNQVhfRlJBR1NISUZUKQotCQkJCWh3X2ZyYWdzaGlmdCA9IE1BWF9GUkFHU0hJRlQ7Ci0JCQlzd19mcmFnc2hpZnQgPSBod19mcmFnc2hpZnQgKyBhcG9ydC0+c3dfc3ViZGl2c2hpZnQ7Ci0JCQlod19mcmFnc2l6ZSA9IDEgPDwgaHdfZnJhZ3NoaWZ0OwotCQkJaWYgKHN3X2ZyYWdjb3VudCA8IE1JTl9GUkFHQ09VTlQoaHdfZnJhZ3NpemUpKQotCQkJCXN3X2ZyYWdjb3VudCA9IE1JTl9GUkFHQ09VTlQoaHdfZnJhZ3NpemUpOwotCQkJaWYgKHN3X2ZyYWdjb3VudCA+IE1BWF9GUkFHQ09VTlQoaHdfZnJhZ3NpemUpKQotCQkJCXN3X2ZyYWdjb3VudCA9IE1BWF9GUkFHQ09VTlQoaHdfZnJhZ3NpemUpOwotCQkJREJHUFYoInN3X2ZyYWdzaGlmdCA9ICVkXG4iLCBzd19mcmFnc2hpZnQpOwotCQkJREJHUFYoInJwb3J0ID0gMHglcCwgd3BvcnQgPSAweCVwXG4iLCBycG9ydCwgd3BvcnQpOwotCQkJaWYgKHJwb3J0KSB7Ci0JCQkJcnBvcnQtPnN3X2ZyYWdzaGlmdCA9IHN3X2ZyYWdzaGlmdDsKLQkJCQlycG9ydC0+c3dfZnJhZ2NvdW50ID0gc3dfZnJhZ2NvdW50OwotCQkJfQotCQkJaWYgKHdwb3J0KSB7Ci0JCQkJd3BvcnQtPnN3X2ZyYWdzaGlmdCA9IHN3X2ZyYWdzaGlmdDsKLQkJCQl3cG9ydC0+c3dfZnJhZ2NvdW50ID0gc3dfZnJhZ2NvdW50OwotCQkJfQotCQkJaXZhbCA9IHN3X2ZyYWdjb3VudCA8PCAxNiB8IHN3X2ZyYWdzaGlmdDsKLQkJfQotCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UIHJldHVybnMgJWQ6JWRcbiIsCi0JCSAgICAgIGl2YWwgPj4gMTYsIGl2YWwgJiAweEZGRkYpOwotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToJLyogX1NJT1dSKCdQJywgOSwgaW50KSAqLwotICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREJHWCgiU05EQ1RMX0RTUF9TVUJESVZJREUgJWRcbiIsIGl2YWwpOwotCQlpZiAoYXBvcnQtPnN3c3RhdGUgIT0gU1dfSU5JVElBTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl7Ci0JCQlpbnQgc3ViZGl2c2hpZnQ7Ci0JCQlpbnQgaHdfZnJhZ3NoaWZ0LCBod19mcmFnc2l6ZSwgaHdfZnJhZ2NvdW50OwotCQkJc3dpdGNoIChpdmFsKSB7Ci0JCQljYXNlIDE6IHN1YmRpdnNoaWZ0ID0gMDsgYnJlYWs7Ci0JCQljYXNlIDI6IHN1YmRpdnNoaWZ0ID0gMTsgYnJlYWs7Ci0JCQljYXNlIDQ6IHN1YmRpdnNoaWZ0ID0gMjsgYnJlYWs7Ci0JCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWh3X2ZyYWdzaGlmdCA9IGFwb3J0LT5zd19mcmFnc2hpZnQgLSBzdWJkaXZzaGlmdDsKLQkJCWlmIChod19mcmFnc2hpZnQgPCBNSU5fRlJBR1NISUZUIHx8Ci0JCQkgICAgaHdfZnJhZ3NoaWZ0ID4gTUFYX0ZSQUdTSElGVCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWh3X2ZyYWdzaXplID0gMSA8PCBod19mcmFnc2hpZnQ7Ci0JCQlod19mcmFnY291bnQgPSBhcG9ydC0+c3dfZnJhZ2NvdW50ID4+IHN1YmRpdnNoaWZ0OwotCQkJaWYgKGh3X2ZyYWdjb3VudCA8IE1JTl9GUkFHQ09VTlQoaHdfZnJhZ3NpemUpIHx8Ci0JCQkgICAgaHdfZnJhZ2NvdW50ID4gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAocnBvcnQpCi0JCQkJcnBvcnQtPnN3X3N1YmRpdnNoaWZ0ID0gc3ViZGl2c2hpZnQ7Ci0JCQlpZiAod3BvcnQpCi0JCQkJd3BvcnQtPnN3X3N1YmRpdnNoaWZ0ID0gc3ViZGl2c2hpZnQ7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURk1UOgkJLyogX1NJT1dSKCdQJyw1LCBpbnQpICovCi0JCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREJHWCgiU05EQ1RMX0RTUF9TRVRGTVQgJWRcbiIsIGl2YWwpOwotCQlpZiAoaXZhbCAhPSBBRk1UX1FVRVJZKSB7Ci0JCQlpZiAoYXBvcnQtPnN3c3RhdGUgIT0gU1dfSU5JVElBTCkgewotCQkJCURCR1AoIlNFVEZNVCBmYWlsZWQsIHN3c3RhdGUgPSAlZFxuIiwKLQkJCQkgICAgIGFwb3J0LT5zd3N0YXRlKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXN3aXRjaCAoaXZhbCkgewotCQkJY2FzZSBBRk1UX01VX0xBVzoKLQkJCWNhc2UgQUZNVF9BX0xBVzoKLQkJCWNhc2UgQUZNVF9VODoKLQkJCWNhc2UgQUZNVF9TODoKLQkJCWNhc2UgQUZNVF9TMTZfTEU6Ci0JCQkJaWYgKHJwb3J0KQotCQkJCQlycG9ydC0+c3dfc2FtcGxlZm10ID0gaXZhbDsKLQkJCQlpZiAod3BvcnQpCi0JCQkJCXdwb3J0LT5zd19zYW1wbGVmbXQgPSBpdmFsOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCQlpdmFsID0gYXBvcnQtPnN3X3NhbXBsZWZtdDsKLQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CS8qIF9TSU9SICgnUCcsMTIsIGF1ZGlvX2J1Zl9pbmZvKSAqLwotCQlEQkdYVigiU05EQ1RMX0RTUF9HRVRPU1BBQ0VcbiIpOwotCQlpZiAoIXdwb3J0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWl2YWwgPSBwY21fc2V0dXAoZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJaWYgKGl2YWwgPCAwKQotCQkJcmV0dXJuIGl2YWw7Ci0JCWl2YWwgPSBzd2JfaW5jX3Uod3BvcnQsIDApOwotCQlidWZfaW5mby5mcmFnbWVudHMgPSBpdmFsID4+IHdwb3J0LT5zd19mcmFnc2hpZnQ7Ci0JCWJ1Zl9pbmZvLmZyYWdzdG90YWwgPSB3cG9ydC0+c3dfZnJhZ2NvdW50OwotCQlidWZfaW5mby5mcmFnc2l6ZSA9IDEgPDwgd3BvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJYnVmX2luZm8uYnl0ZXMgPSBpdmFsOwotCQlEQkdYVigiU05EQ1RMX0RTUF9HRVRPU1BBQ0UgcmV0dXJucyB7ICVkICVkICVkICVkIH1cbiIsCi0JCSAgICAgYnVmX2luZm8uZnJhZ21lbnRzLCBidWZfaW5mby5mcmFnc3RvdGFsLAotCQkgICAgIGJ1Zl9pbmZvLmZyYWdzaXplLCBidWZfaW5mby5ieXRlcyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYnVmX2luZm8sIHNpemVvZiBidWZfaW5mbykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgkvKiBfU0lPUiAoJ1AnLDEzLCBhdWRpb19idWZfaW5mbykgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRJU1BBQ0VcbiIpOwotCQlpZiAoIXJwb3J0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWl2YWwgPSBwY21fc2V0dXAoZGV2YywgcnBvcnQsIHdwb3J0KTsKLQkJaWYgKGl2YWwgPCAwKQotCQkJcmV0dXJuIGl2YWw7Ci0JCWl2YWwgPSBzd2JfaW5jX3UocnBvcnQsIDApOwotCQlidWZfaW5mby5mcmFnbWVudHMgPSBpdmFsID4+IHJwb3J0LT5zd19mcmFnc2hpZnQ7Ci0JCWJ1Zl9pbmZvLmZyYWdzdG90YWwgPSBycG9ydC0+c3dfZnJhZ2NvdW50OwotCQlidWZfaW5mby5mcmFnc2l6ZSA9IDEgPDwgcnBvcnQtPnN3X2ZyYWdzaGlmdDsKLQkJYnVmX2luZm8uYnl0ZXMgPSBpdmFsOwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVElTUEFDRSByZXR1cm5zIHsgJWQgJWQgJWQgJWQgfVxuIiwKLQkJICAgICBidWZfaW5mby5mcmFnbWVudHMsIGJ1Zl9pbmZvLmZyYWdzdG90YWwsCi0JCSAgICAgYnVmX2luZm8uZnJhZ3NpemUsIGJ1Zl9pbmZvLmJ5dGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZidWZfaW5mbywgc2l6ZW9mIGJ1Zl9pbmZvKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoJLyogX1NJTyAgKCdQJywxNCkgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9OT05CTE9DS1xuIik7Ci0JCXNwaW5fbG9jaygmZmlsZS0+Zl9sb2NrKTsKLQkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwotCQlzcGluX3VubG9jaygmZmlsZS0+Zl9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfUkVTRVQ6CQkvKiBfU0lPICAoJ1AnLCAwKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX1JFU0VUXG4iKTsKLQkJLyoKLQkJICogTm90aGluZyBzcGVjaWFsIG5lZWRzIHRvIGJlIGRvbmUgZm9yIGlucHV0LiAgSW5wdXQKLQkJICogc2FtcGxlcyBzaXQgaW4gc3didWYsIGJ1dCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQKLQkJICogdG8gZW1wdHkgd2hlbiBwY21fc2V0dXAoKSBpcyBjYWxsZWQuCi0JCSAqLwotCQlpZiAod3BvcnQgJiYgd3BvcnQtPnN3YnVmKSB7Ci0JCQl3cG9ydC0+c3dzdGF0ZSA9IFNXX0lOSVRJQUw7Ci0JCQlwY21fb3V0cHV0KGRldmMsIDAsIDApOwotCQkJcGNtX3dyaXRlX3N5bmMoZGV2Yyk7Ci0JCX0KLQkJcGNtX3NodXRkb3duKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX1NZTkM6CQkvKiBfU0lPICAoJ1AnLCAxKSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX1NZTkNcbiIpOwotCQlpZiAod3BvcnQpIHsKLQkJCXBjbV9mbHVzaF9mcmFnKGRldmMpOwotCQkJcGNtX3dyaXRlX3N5bmMoZGV2Yyk7Ci0JCX0KLQkJcGNtX3NodXRkb3duKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX1BPU1Q6CQkvKiBfU0lPICAoJ1AnLCA4KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX1BPU1RcbiIpOwotCQlpZiAoIXdwb3J0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXBjbV9mbHVzaF9mcmFnKGRldmMpOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgkvKiBfU0lPUiAoJ1AnLCAxNywgY291bnRfaW5mbykgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRJUFRSXG4iKTsKLQkJaWYgKCFycG9ydCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJewotCQkJdXN0bXNjX3QgdXN0bXNjOwotCQkJaWYgKHJwb3J0LT5od3N0YXRlID09IEhXX1JVTk5JTkcpIHsKLQkJCQlBU1NFUlQocnBvcnQtPnN3c3RhdGUgPT0gU1dfUlVOKTsKLQkJCQlsaV9yZWFkX1VTVE1TQygmcnBvcnQtPmNoYW4sICZ1c3Rtc2MpOwotCQkJCWluZm8uYnl0ZXMgPSB1c3Rtc2MubXNjIC0gcnBvcnQtPk1TQ19vZmZzZXQ7Ci0JCQkJaW5mby5ieXRlcyAqPSBycG9ydC0+ZnJhbWVfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5mby5ieXRlcyA9IHJwb3J0LT5ieXRlX2NvdW50OwotCQkJfQotCQkJaW5mby5ibG9ja3MgPSBycG9ydC0+ZnJhZ19jb3VudDsKLQkJCWluZm8ucHRyID0gMDsJLyogbm90IGltcGxlbWVudGVkICovCi0JCQlycG9ydC0+ZnJhZ19jb3VudCA9IDA7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZpbmZvLCBzaXplb2YgaW5mbykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoJLyogX1NJT1IgKCdQJywxOCwgY291bnRfaW5mbykgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRPUFRSXG4iKTsKLQkJaWYgKCF3cG9ydCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJewotCQkJdXN0bXNjX3QgdXN0bXNjOwotCQkJaWYgKHdwb3J0LT5od3N0YXRlID09IEhXX1JVTk5JTkcpIHsKLQkJCQlBU1NFUlQod3BvcnQtPnN3c3RhdGUgPT0gU1dfUlVOKTsKLQkJCQlsaV9yZWFkX1VTVE1TQygmd3BvcnQtPmNoYW4sICZ1c3Rtc2MpOwotCQkJCWluZm8uYnl0ZXMgPSB1c3Rtc2MubXNjIC0gd3BvcnQtPk1TQ19vZmZzZXQ7Ci0JCQkJaW5mby5ieXRlcyAqPSB3cG9ydC0+ZnJhbWVfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5mby5ieXRlcyA9IHdwb3J0LT5ieXRlX2NvdW50OwotCQkJfQotCQkJaW5mby5ibG9ja3MgPSB3cG9ydC0+ZnJhZ19jb3VudDsKLQkJCWluZm8ucHRyID0gMDsJLyogbm90IGltcGxlbWVudGVkICovCi0JCQl3cG9ydC0+ZnJhZ19jb3VudCA9IDA7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZpbmZvLCBzaXplb2YgaW5mbykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgkvKiBfU0lPUiAoJ1AnLCAyMywgaW50KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX0dFVE9ERUxBWVxuIik7Ci0JCWlmICghd3BvcnQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCXsKLQkJCWludCBmc2l6ZSA9IHdwb3J0LT5mcmFtZV9zaXplOwotCQkJaXZhbCA9IHdwb3J0LT5zd2JfaV9hdmFpbCAvIGZzaXplOwotCQkJaWYgKHdwb3J0LT5od3N0YXRlID09IEhXX1JVTk5JTkcpIHsKLQkJCQlpbnQgc3dwdHIsIGh3cHRyLCBod2ZyYW1lcywgaHdieXRlcywgaHdzaXplOwotCQkJCWludCB0b3RhbGh3Ynl0ZXM7Ci0JCQkJdXN0bXNjX3QgdXN0bXNjOwotCi0JCQkJaHdzaXplID0gd3BvcnQtPmh3YnVmX3NpemU7Ci0JCQkJc3dwdHIgPSBsaV9yZWFkX3N3cHRyKCZ3cG9ydC0+Y2hhbik7Ci0JCQkJbGlfcmVhZF9VU1RNU0MoJndwb3J0LT5jaGFuLCAmdXN0bXNjKTsKLQkJCQlod2ZyYW1lcyA9IHVzdG1zYy5tc2MgLSB3cG9ydC0+TVNDX29mZnNldDsKLQkJCQl0b3RhbGh3Ynl0ZXMgPSBod2ZyYW1lcyAqIGZzaXplOwotCQkJCWh3cHRyID0gdG90YWxod2J5dGVzICUgaHdzaXplOwotCQkJCWh3Ynl0ZXMgPSAoc3dwdHIgLSBod3B0ciArIGh3c2l6ZSkgJSBod3NpemU7Ci0JCQkJaXZhbCArPSBod2J5dGVzIC8gZnNpemU7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9QUk9GSUxFOgkvKiBfU0lPVyAoJ1AnLCAyMywgaW50KSAqLwotCQlEQkdYKCJTTkRDVExfRFNQX1BST0ZJTEVcbiIpOwotCi0JCS8qCi0JCSAqIFRob21hcyBTYWlsZXIgZXhwbGFpbnMgU05EQ1RMX0RTUF9QUk9GSUxFCi0JCSAqIChwcml2YXRlIGVtYWlsLCBNYXJjaCAyNCwgMTk5OSk6Ci0JCSAqCi0JCSAqICAgICBUaGlzIGdpdmVzIHRoZSBzb3VuZCBkcml2ZXIgYSBoaW50IG9uIHdoYXQgaXQKLQkJICogICAgIHNob3VsZCBkbyB3aXRoIHBhcnRpYWwgZnJhZ21lbnRzCi0JCSAqICAgICAoaS5lLiBmcmFnbWVudHMgcGFydGlhbGx5IGZpbGxlZCB3aXRoIHdyaXRlKS4KLQkJICogICAgIFRoaXMgY2FuIGRpcmVjdCB0aGUgZHJpdmVyIHRvIHplcm8gdGhlbSBvcgotCQkgKiAgICAgbGVhdmUgdGhlbSBhbG9uZS4gIEJ1dCBkb24ndCBhc2sgbWUgd2hhdCB0aGlzCi0JCSAqICAgICBpcyBnb29kIGZvciwgbXkgZHJpdmVyIGp1c3QgemVyb2VzIHRoZSBsYXN0Ci0JCSAqICAgICBmcmFnbWVudCBiZWZvcmUgdGhlIHJlY2VpdmVyIHN0b3BzLCBubyBpZGVhCi0JCSAqICAgICB3aGF0IGdvb2QgZm9yIGFueSBvdGhlciBiZWhhdmlvdXIgY291bGQKLQkJICogICAgIGJlLiBJbXBsZW1lbnRpbmcgaXQgYXMgTk9QIHNlZW1zIHNhZmUuCi0JCSAqLwotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CS8qIF9TSU9SICgnUCcsMTYsIGludCkgKi8KLQkJREJHWCgiU05EQ1RMX0RTUF9HRVRUUklHR0VSXG4iKTsKLQkJaXZhbCA9IDA7Ci0JCWlmIChycG9ydCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCQl7Ci0JCQkJaWYgKCEocnBvcnQtPmZsYWdzICYgRElTQUJMRUQpKQotCQkJCQlpdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0JCWlmICh3cG9ydCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCQl7Ci0JCQkJaWYgKCEod3BvcnQtPmZsYWdzICYgRElTQUJMRUQpKQotCQkJCQlpdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CS8qIF9TSU9XICgnUCcsMTYsIGludCkgKi8KLQkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEQkdYKCJTTkRDVExfRFNQX1NFVFRSSUdHRVIgJWRcbiIsIGl2YWwpOwotCi0JCS8qCi0JCSAqIElmIHVzZXIgaXMgZGlzYWJsaW5nIEkvTyBhbmQgcG9ydCBpcyBub3QgaW4gaW5pdGlhbAotCQkgKiBzdGF0ZSwgZmFpbCB3aXRoIEVJTlZBTC4KLQkJICovCi0KLQkJaWYgKCgocnBvcnQgJiYgIShpdmFsICYgUENNX0VOQUJMRV9JTlBVVCkpIHx8Ci0JCSAgICAgKHdwb3J0ICYmICEoaXZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSkpICYmCi0JCSAgICBhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKHJwb3J0KSB7Ci0JCQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCQl7Ci0JCQkJaHdzdGF0ZSA9IHJwb3J0LT5od3N0YXRlOwotCQkJCWlmIChpdmFsICYgUENNX0VOQUJMRV9JTlBVVCkKLQkJCQkJcnBvcnQtPmZsYWdzICY9IH5ESVNBQkxFRDsKLQkJCQllbHNlCi0JCQkJCXJwb3J0LT5mbGFncyB8PSBESVNBQkxFRDsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCQlpZiAoaHdzdGF0ZSAhPSBIV19SVU5OSU5HICYmIGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7Ci0KLQkJCQlpZiAocnBvcnQtPnN3c3RhdGUgPT0gU1dfSU5JVElBTCkKLQkJCQkJcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7Ci0JCQkJZWxzZQotCQkJCQlsaV9hY3RpdmF0ZV9kbWEoJnJwb3J0LT5jaGFuKTsKLQkJCX0KLQkJfQotCQlpZiAod3BvcnQpIHsKLQkJCXZ3c25kX3BvcnRfZmxhZ3NfdCBwZmxhZ3M7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXsKLQkJCQlwZmxhZ3MgPSB3cG9ydC0+ZmxhZ3M7Ci0JCQkJaWYgKGl2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkKLQkJCQkJd3BvcnQtPmZsYWdzICY9IH5ESVNBQkxFRDsKLQkJCQllbHNlCi0JCQkJCXdwb3J0LT5mbGFncyB8PSBESVNBQkxFRDsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCQlpZiAocGZsYWdzICYgRElTQUJMRUQgJiYgaXZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7Ci0JCQkJaWYgKHdwb3J0LT5zd3N0YXRlID09IFNXX1JVTikKLQkJCQkJcGNtX291dHB1dChkZXZjLCAwLCAwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCURCR1AoInVua25vd24gaW9jdGwgMHgleFxuIiwgY21kKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCURCR1AoInVuaW1wbGVtZW50ZWQgaW9jdGwgMHgleFxuIiwgY21kKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGxvbmcgdndzbmRfYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJnZ3c25kX211dGV4KTsKLQltdXRleF9sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JcmV0ID0gdndzbmRfYXVkaW9fZG9faW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCW11dGV4X3VubG9jaygmZGV2Yy0+aW9fbXV0ZXgpOwotCW11dGV4X3VubG9jaygmdndzbmRfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogTm8gbW1hcC4gKi8KLQotc3RhdGljIGludCB2d3NuZF9hdWRpb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlEQkdFKCIoZmlsZT0weCVwLCB2bWE9MHglcClcbiIsIGZpbGUsIHZtYSk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLS8qCi0gKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHJlYWQgYW5kL29yIHdyaXRlLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KLSAqLwotCi1zdGF0aWMgaW50IHZ3c25kX2F1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JdndzbmRfZGV2X3QgKmRldmM7Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlpbnQgc3dfc2FtcGxlZm10OwotCURFRklORV9XQUlUKHdhaXQpOwotCi0JREJHRSgiKGlub2RlPTB4JXAsIGZpbGU9MHglcClcbiIsIGlub2RlLCBmaWxlKTsKLQotCW11dGV4X2xvY2soJnZ3c25kX211dGV4KTsKLQlJTkNfVVNFX0NPVU5UOwotCWZvciAoZGV2YyA9IHZ3c25kX2Rldl9saXN0OyBkZXZjOyBkZXZjID0gZGV2Yy0+bmV4dF9kZXYpCi0JCWlmICgoZGV2Yy0+YXVkaW9fbWlub3IgJiB+MHgwRikgPT0gKG1pbm9yICYgfjB4MEYpKQotCQkJYnJlYWs7Ci0KLQlpZiAoZGV2YyA9PSBOVUxMKSB7Ci0JCURFQ19VU0VfQ09VTlQ7Ci0JCW11dGV4X3VubG9jaygmdndzbmRfbXV0ZXgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQltdXRleF9sb2NrKCZkZXZjLT5vcGVuX211dGV4KTsKLQl3aGlsZSAoMSkgewotCQlwcmVwYXJlX3RvX3dhaXQoJmRldmMtPm9wZW5fd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmICghKGRldmMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkpCi0JCQlicmVhazsKLQotCQltdXRleF91bmxvY2soJmRldmMtPm9wZW5fbXV0ZXgpOwotCQltdXRleF91bmxvY2soJnZ3c25kX211dGV4KTsKLQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQlERUNfVVNFX0NPVU5UOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlzY2hlZHVsZSgpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCURFQ19VU0VfQ09VTlQ7Ci0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQl9Ci0JCW11dGV4X2xvY2soJnZ3c25kX211dGV4KTsKLQkJbXV0ZXhfbG9jaygmZGV2Yy0+b3Blbl9tdXRleCk7Ci0JfQotCWZpbmlzaF93YWl0KCZkZXZjLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlkZXZjLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5vcGVuX211dGV4KTsKLQotCS8qIGdldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQgZnJvbSBtaW5vciBudW1iZXIuICovCi0KLQlzd19zYW1wbGVmbXQgPSAwOwotCWlmICgobWlub3IgJiAweEYpID09IFNORF9ERVZfRFNQKQotCQlzd19zYW1wbGVmbXQgPSBBRk1UX1U4OwotCWVsc2UgaWYgKChtaW5vciAmIDB4RikgPT0gU05EX0RFVl9BVURJTykKLQkJc3dfc2FtcGxlZm10ID0gQUZNVF9NVV9MQVc7Ci0JZWxzZSBpZiAoKG1pbm9yICYgMHhGKSA9PSBTTkRfREVWX0RTUDE2KQotCQlzd19zYW1wbGVmbXQgPSBBRk1UX1MxNl9MRTsKLQllbHNlCi0JCUFTU0VSVCgwKTsKLQotCS8qIEluaXRpYWxpemUgdndzbmRfcG9ydHMuICovCi0KLQltdXRleF9sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0JewotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJZGV2Yy0+cnBvcnQuc3dzdGF0ZSAgICAgICAgPSBTV19JTklUSUFMOwotCQkJZGV2Yy0+cnBvcnQuZmxhZ3MgICAgICAgICAgPSAwOwotCQkJZGV2Yy0+cnBvcnQuc3dfY2hhbm5lbHMgICAgPSAxOwotCQkJZGV2Yy0+cnBvcnQuc3dfc2FtcGxlZm10ICAgPSBzd19zYW1wbGVmbXQ7Ci0JCQlkZXZjLT5ycG9ydC5zd19mcmFtZXJhdGUgICA9IDgwMDA7Ci0JCQlkZXZjLT5ycG9ydC5zd19mcmFnc2hpZnQgICA9IERFRkFVTFRfRlJBR1NISUZUOwotCQkJZGV2Yy0+cnBvcnQuc3dfZnJhZ2NvdW50ICAgPSBERUZBVUxUX0ZSQUdDT1VOVDsKLQkJCWRldmMtPnJwb3J0LnN3X3N1YmRpdnNoaWZ0ID0gREVGQVVMVF9TVUJESVZTSElGVDsKLQkJCWRldmMtPnJwb3J0LmJ5dGVfY291bnQgICAgID0gMDsKLQkJCWRldmMtPnJwb3J0LmZyYWdfY291bnQgICAgID0gMDsKLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCWRldmMtPndwb3J0LnN3c3RhdGUgICAgICAgID0gU1dfSU5JVElBTDsKLQkJCWRldmMtPndwb3J0LmZsYWdzICAgICAgICAgID0gMDsKLQkJCWRldmMtPndwb3J0LnN3X2NoYW5uZWxzICAgID0gMTsKLQkJCWRldmMtPndwb3J0LnN3X3NhbXBsZWZtdCAgID0gc3dfc2FtcGxlZm10OwotCQkJZGV2Yy0+d3BvcnQuc3dfZnJhbWVyYXRlICAgPSA4MDAwOwotCQkJZGV2Yy0+d3BvcnQuc3dfZnJhZ3NoaWZ0ICAgPSBERUZBVUxUX0ZSQUdTSElGVDsKLQkJCWRldmMtPndwb3J0LnN3X2ZyYWdjb3VudCAgID0gREVGQVVMVF9GUkFHQ09VTlQ7Ci0JCQlkZXZjLT53cG9ydC5zd19zdWJkaXZzaGlmdCA9IERFRkFVTFRfU1VCRElWU0hJRlQ7Ci0JCQlkZXZjLT53cG9ydC5ieXRlX2NvdW50ICAgICA9IDA7Ci0JCQlkZXZjLT53cG9ydC5mcmFnX2NvdW50ICAgICA9IDA7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5pb19tdXRleCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZjOwotCURCR1JWKCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZWxlYXNlIChjbG9zZSkgdGhlIGF1ZGlvIGRldmljZS4KLSAqLwotCi1zdGF0aWMgaW50IHZ3c25kX2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSBOVUxMLCAqcnBvcnQgPSBOVUxMOwotCWludCBlcnIgPSAwOwotCi0JbXV0ZXhfbG9jaygmdndzbmRfbXV0ZXgpOwotCW11dGV4X2xvY2soJmRldmMtPmlvX211dGV4KTsKLQl7Ci0JCURCR0VWKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJcnBvcnQgPSAmZGV2Yy0+cnBvcnQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7Ci0JCQlwY21fZmx1c2hfZnJhZyhkZXZjKTsKLQkJCXBjbV93cml0ZV9zeW5jKGRldmMpOwotCQl9Ci0JCXBjbV9zaHV0ZG93bihkZXZjLCBycG9ydCwgd3BvcnQpOwotCQlpZiAocnBvcnQpCi0JCQlycG9ydC0+c3dzdGF0ZSA9IFNXX09GRjsKLQkJaWYgKHdwb3J0KQotCQkJd3BvcnQtPnN3c3RhdGUgPSBTV19PRkY7Ci0JfQotCW11dGV4X3VubG9jaygmZGV2Yy0+aW9fbXV0ZXgpOwotCi0JbXV0ZXhfbG9jaygmZGV2Yy0+b3Blbl9tdXRleCk7Ci0JewotCQlkZXZjLT5vcGVuX21vZGUgJj0gfmZpbGUtPmZfbW9kZTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5vcGVuX211dGV4KTsKLQl3YWtlX3VwKCZkZXZjLT5vcGVuX3dhaXQpOwotCURFQ19VU0VfQ09VTlQ7Ci0JREJHUigpOwotCW11dGV4X3VubG9jaygmdndzbmRfbXV0ZXgpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZ3c25kX2F1ZGlvX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLmxsc2VlayA9CW5vX2xsc2VlaywKLQkucmVhZCA9CQl2d3NuZF9hdWRpb19yZWFkLAotCS53cml0ZSA9CXZ3c25kX2F1ZGlvX3dyaXRlLAotCS5wb2xsID0JCXZ3c25kX2F1ZGlvX3BvbGwsCi0JLnVubG9ja2VkX2lvY3RsID0gdndzbmRfYXVkaW9faW9jdGwsCi0JLm1tYXAgPQkJdndzbmRfYXVkaW9fbW1hcCwKLQkub3BlbiA9CQl2d3NuZF9hdWRpb19vcGVuLAotCS5yZWxlYXNlID0JdndzbmRfYXVkaW9fcmVsZWFzZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIG1peGVyIGRyaXZlciAqLwotCi0vKiBvcGVuIHRoZSBtaXhlciBkZXZpY2UuICovCi0KLXN0YXRpYyBpbnQgdndzbmRfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl2d3NuZF9kZXZfdCAqZGV2YzsKLQotCURCR0VWKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOwotCi0JSU5DX1VTRV9DT1VOVDsKLQltdXRleF9sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JZm9yIChkZXZjID0gdndzbmRfZGV2X2xpc3Q7IGRldmM7IGRldmMgPSBkZXZjLT5uZXh0X2RldikKLQkJaWYgKGRldmMtPm1peGVyX21pbm9yID09IGltaW5vcihpbm9kZSkpCi0JCQlicmVhazsKLQotCWlmIChkZXZjID09IE5VTEwpIHsKLQkJREVDX1VTRV9DT1VOVDsKLQkJbXV0ZXhfdW5sb2NrKCZ2d3NuZF9tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZjOwotCW11dGV4X3VubG9jaygmdndzbmRfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi0vKiByZWxlYXNlIChjbG9zZSkgdGhlIG1peGVyIGRldmljZS4gKi8KLQotc3RhdGljIGludCB2d3NuZF9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCURCR0VWKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOwotCURFQ19VU0VfQ09VTlQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG1peGVyX3JlYWRfaW9jdGwgaGFuZGxlcyBhbGwgcmVhZCBpb2N0bHMgb24gdGhlIG1peGVyIGRldmljZS4gKi8KLQotc3RhdGljIGludCBtaXhlcl9yZWFkX2lvY3RsKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHZhbCA9IC0xOwotCi0JREJHRVYoIihkZXZjPTB4JXAsIG5yPTB4JXgsIGFyZz0weCVwKVxuIiwgZGV2YywgbnIsIGFyZyk7Ci0KLQlzd2l0Y2ggKG5yKSB7Ci0JY2FzZSBTT1VORF9NSVhFUl9DQVBTOgotCQl2YWwgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6Ci0JCXZhbCA9IChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1JFQ0xFVik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgotCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAotCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19SRUNMRVYpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfT1VUTUFTSzoKLQkJdmFsID0gKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgotCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAotCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1BDTToKLQkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUENNKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX0xJTkU6Ci0JCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0xJTkUpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfTUlDOgotCQl2YWwgPSBhZDE4NDNfZ2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9NSUMpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfQ0Q6Ci0JCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0NEKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKLQkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUkVDTEVWKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJdmFsID0gYWQxODQzX2dldF9yZWNzcmMoJmRldmMtPmxpdGgpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgotCQl2YWwgPSBhZDE4NDNfZ2V0X291dHNyYygmZGV2Yy0+bGl0aCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZyk7Ci19Ci0KLS8qIG1peGVyX3dyaXRlX2lvY3RsIGhhbmRsZXMgYWxsIHdyaXRlIGlvY3RscyBvbiB0aGUgbWl4ZXIgZGV2aWNlLiAqLwotCi1zdGF0aWMgaW50IG1peGVyX3dyaXRlX2lvY3RsKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHZhbDsKLQlpbnQgZXJyOwotCi0JREJHRVYoIihkZXZjPTB4JXAsIG5yPTB4JXgsIGFyZz0weCVwKVxuIiwgZGV2YywgbnIsIGFyZyk7Ci0KLQllcnIgPSBnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jc3dpdGNoIChucikgewotCWNhc2UgU09VTkRfTUlYRVJfUENNOgotCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9QQ00sIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9MSU5FOgotCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9MSU5FLCB2YWwpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfTUlDOgotCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9NSUMsIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9DRDoKLQkJdmFsID0gYWQxODQzX3NldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fQ0QsIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9SRUNMRVY6Ci0JCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX1JFQ0xFViwgdmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJaWYgKGRldmMtPnJwb3J0LnN3YnVmIHx8IGRldmMtPndwb3J0LnN3YnVmKQotCQkJcmV0dXJuIC1FQlVTWTsJLyogY2FuJ3QgY2hhbmdlIHJlY3NyYyB3aGlsZSBydW5uaW5nICovCi0JCXZhbCA9IGFkMTg0M19zZXRfcmVjc3JjKCZkZXZjLT5saXRoLCB2YWwpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgotCQl2YWwgPSBhZDE4NDNfc2V0X291dHNyYygmZGV2Yy0+bGl0aCwgdmFsKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHZhbCA8IDApCi0JCXJldHVybiB2YWw7Ci0JcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKTsKLX0KLQotLyogVGhpcyBpcyB0aGUgaW9jdGwgZW50cnkgdG8gdGhlIG1peGVyIGRyaXZlci4gKi8KLQotc3RhdGljIGxvbmcgdndzbmRfbWl4ZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IHVuc2lnbmVkIGludCBucm1hc2sgPSBfSU9DX05STUFTSyA8PCBfSU9DX05SU0hJRlQ7Ci0JY29uc3QgdW5zaWduZWQgaW50IG5yID0gKGNtZCAmIG5ybWFzaykgPj4gX0lPQ19OUlNISUZUOwotCWludCByZXR2YWw7Ci0KLQlEQkdFVigiKGRldmM9MHglcCwgY21kPTB4JXgsIGFyZz0weCVseClcbiIsIGRldmMsIGNtZCwgYXJnKTsKLQotCW11dGV4X2xvY2soJnZ3c25kX211dGV4KTsKLQltdXRleF9sb2NrKCZkZXZjLT5taXhfbXV0ZXgpOwotCXsKLQkJaWYgKChjbWQgJiB+bnJtYXNrKSA9PSBNSVhFUl9SRUFEKDApKQotCQkJcmV0dmFsID0gbWl4ZXJfcmVhZF9pb2N0bChkZXZjLCBuciwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWVsc2UgaWYgKChjbWQgJiB+bnJtYXNrKSA9PSBNSVhFUl9XUklURSgwKSkKLQkJCXJldHZhbCA9IG1peGVyX3dyaXRlX2lvY3RsKGRldmMsIG5yLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJZWxzZQotCQkJcmV0dmFsID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZjLT5taXhfbXV0ZXgpOwotCW11dGV4X3VubG9jaygmdndzbmRfbXV0ZXgpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZ3c25kX21peGVyX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLmxsc2VlayA9CW5vX2xsc2VlaywKLQkudW5sb2NrZWRfaW9jdGwgPSB2d3NuZF9taXhlcl9pb2N0bCwKLQkub3BlbiA9CQl2d3NuZF9taXhlcl9vcGVuLAotCS5yZWxlYXNlID0JdndzbmRfbWl4ZXJfcmVsZWFzZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHByb2JlL2F0dGFjaC91bmxvYWQgKi8KLQotLyogZHJpdmVyIHByb2JlIHJvdXRpbmUuICBSZXR1cm4gbm9uemVybyBpZiBoYXJkd2FyZSBpcyBmb3VuZC4gKi8KLQotc3RhdGljIGludCBfX2luaXQgcHJvYmVfdndzbmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQotewotCWxpdGhpdW1fdCBsaXRoOwotCWludCB3OwotCXVuc2lnbmVkIGxvbmcgbGF0ZXI7Ci0KLQlEQkdFVigiKGh3X2NvbmZpZz0weCVwKVxuIiwgaHdfY29uZmlnKTsKLQotCS8qIFhYWCB2ZXJpZnkgbGl0aGl1bSBwcmVzZW50ICh0byBwcmV2ZW50IGNyYXNoIG9uIG5vbi12dykgKi8KLQotCWlmIChsaV9jcmVhdGUoJmxpdGgsIGh3X2NvbmZpZy0+aW9fYmFzZSkgIT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9iZV92d3NuZDogY2FuJ3QgbWFwIGxpdGhpdW1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbGF0ZXIgPSBqaWZmaWVzICsgMjsKLQlsaV93cml0ZWwoJmxpdGgsIExJX0hPU1RfQ09OVFJPTExFUiwgTElfSENfTElOS19FTkFCTEUpOwotCWRvIHsKLQkJdyA9IGxpX3JlYWRsKCZsaXRoLCBMSV9IT1NUX0NPTlRST0xMRVIpOwotCX0gd2hpbGUgKHcgPT0gTElfSENfTElOS19FTkFCTEUgJiYgdGltZV9iZWZvcmUoamlmZmllcywgbGF0ZXIpKTsKLQkKLQlsaV9kZXN0cm95KCZsaXRoKTsKLQotCURCR1BWKCJIQyA9IDB4JTA0eFxuIiwgdyk7Ci0KLQlpZiAoKHcgPT0gTElfSENfTElOS19FTkFCTEUpIHx8ICh3ICYgTElfSENfTElOS19DT0RFQykpIHsKLQotCQkvKiBUaGlzIG1heSBpbmRpY2F0ZSBhIGJldGEgbWFjaGluZSB3aXRoIG5vIGF1ZGlvLAotCQkgKiBvciBhIGZ1dHVyZSBtYWNoaW5lIHdpdGggZGlmZmVyZW50IGF1ZGlvLgotCQkgKiBPbiBiZXRhLXJlbGVhc2UgMzIwIHcvIG5vIGF1ZGlvLCBIQyA9PSAweDQwMDAgKi8KLQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9iZV92d3NuZDogYXVkaW8gY29kZWMgbm90IGZvdW5kXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHcgJiBMSV9IQ19MSU5LX0ZBSUxVUkUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHJvYmVfdndzbmQ6IGNhbid0IGluaXQgYXVkaW8gY29kZWNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJ2d3NuZDogbGl0aGl1bSBhdWRpbyBhdCBtbWlvICUjeCBpcnEgJWRcbiIsCi0JCWh3X2NvbmZpZy0+aW9fYmFzZSwgaHdfY29uZmlnLT5pcnEpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBkcml2ZXIgYXR0YWNoIHJvdXRpbmUuICBJbml0aWFsaXplIGRyaXZlciBkYXRhIHN0cnVjdHVyZXMgYW5kCi0gKiBpbml0aWFsaXplIGhhcmR3YXJlLiAgQSBuZXcgdndzbmRfZGV2X3QgaXMgYWxsb2NhdGVkIGFuZCBwdXQKLSAqIG9udG8gdGhlIGdsb2JhbCBsaXN0LCB2d3NuZF9kZXZfbGlzdC4KLSAqCi0gKiBSZXR1cm4gK21pbm9yX2RldiBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhdHRhY2hfdndzbmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQotewotCXZ3c25kX2Rldl90ICpkZXZjID0gTlVMTDsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCURCR0VWKCIoaHdfY29uZmlnPTB4JXApXG4iLCBod19jb25maWcpOwotCi0JZGV2YyA9IGttYWxsb2Moc2l6ZW9mICh2d3NuZF9kZXZfdCksIEdGUF9LRVJORUwpOwotCWlmIChkZXZjID09IE5VTEwpCi0JCWdvdG8gZmFpbDA7Ci0KLQllcnIgPSBsaV9jcmVhdGUoJmRldmMtPmxpdGgsIGh3X2NvbmZpZy0+aW9fYmFzZSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsMTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmMtPm9wZW5fd2FpdCk7Ci0KLQlkZXZjLT5ycG9ydC5od2J1Zl9zaXplID0gSFdCVUZfU0laRTsKLQlkZXZjLT5ycG9ydC5od2J1Zl92YWRkciA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgSFdCVUZfT1JERVIpOwotCWlmICghZGV2Yy0+cnBvcnQuaHdidWZfdmFkZHIpCi0JCWdvdG8gZmFpbDI7Ci0JZGV2Yy0+cnBvcnQuaHdidWYgPSAodm9pZCAqKSBkZXZjLT5ycG9ydC5od2J1Zl92YWRkcjsKLQlkZXZjLT5ycG9ydC5od2J1Zl9wYWRkciA9IHZpcnRfdG9fcGh5cyhkZXZjLT5ycG9ydC5od2J1Zik7Ci0KLQkvKgotCSAqIFF1b3RlIGZyb20gdGhlIE5UIGRyaXZlcjoKLQkgKgotCSAqIC8vIFdBUk5JTkchISEgSEFDSyB0byBzZXR1cCBvdXRwdXQgZG1hISEhCi0JICogLy8gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGV2ZW4gb24gb3V0cHV0IHRoZXJlIGlzIHNvbWUgZGF0YQotCSAqIC8vIHRyaWNrbGluZyBpbnRvIHRoZSBpbnB1dCBETUEgY2hhbm5lbC4gIFRoaXMgaXMgYSBidWcgaW4gdGhlCi0JICogLy8gTGl0aGl1bSBtaWNyb2NvZGUuCi0JICogLy8gLS1zZGUKLQkgKgotCSAqIFdlIHNldCB0aGUgaW5wdXQgc2lkZSdzIERNQSBiYXNlIGFkZHJlc3MgaGVyZS4gIEl0IHdpbGwgcmVtYWluCi0JICogdmFsaWQgdW50aWwgdGhlIGRyaXZlciBpcyB1bmxvYWRlZC4KLQkgKi8KLQotCWxpX3dyaXRlbCgmZGV2Yy0+bGl0aCwgTElfQ09NTTFfQkFTRSwKLQkJICBkZXZjLT5ycG9ydC5od2J1Zl9wYWRkciA+PiA4IHwgMSA8PCAoMzcgLSA4KSk7Ci0KLQlkZXZjLT53cG9ydC5od2J1Zl9zaXplID0gSFdCVUZfU0laRTsKLQlkZXZjLT53cG9ydC5od2J1Zl92YWRkciA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgSFdCVUZfT1JERVIpOwotCWlmICghZGV2Yy0+d3BvcnQuaHdidWZfdmFkZHIpCi0JCWdvdG8gZmFpbDM7Ci0JZGV2Yy0+d3BvcnQuaHdidWYgPSAodm9pZCAqKSBkZXZjLT53cG9ydC5od2J1Zl92YWRkcjsKLQlkZXZjLT53cG9ydC5od2J1Zl9wYWRkciA9IHZpcnRfdG9fcGh5cyhkZXZjLT53cG9ydC5od2J1Zik7Ci0JREJHUCgid3BvcnQgaHdidWYgPSAweCVwXG4iLCBkZXZjLT53cG9ydC5od2J1Zik7Ci0KLQlEQkdETyhzaHV0X3VwKyspOwotCWVyciA9IGFkMTg0M19pbml0KCZkZXZjLT5saXRoKTsKLQlEQkdETyhzaHV0X3VwLS0pOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbDQ7Ci0KLQkvKiBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyICovCi0KLQllcnIgPSByZXF1ZXN0X2lycShod19jb25maWctPmlycSwgdndzbmRfYXVkaW9faW50ciwgMCwgInZ3c25kIiwgZGV2Yyk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsNTsKLQotCS8qIHJlZ2lzdGVyIHRoaXMgZGV2aWNlJ3MgZHJpdmVycy4gKi8KLQotCWRldmMtPmF1ZGlvX21pbm9yID0gcmVnaXN0ZXJfc291bmRfZHNwKCZ2d3NuZF9hdWRpb19mb3BzLCAtMSk7Ci0JaWYgKChlcnIgPSBkZXZjLT5hdWRpb19taW5vcikgPCAwKSB7Ci0JCURCR0RPKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgImF0dGFjaF92d3NuZDogcmVnaXN0ZXJfc291bmRfZHNwIGVycm9yICVkXG4iLAotCQkJICAgICBlcnIpKTsKLQkJZ290byBmYWlsNjsKLQl9Ci0JZGV2Yy0+bWl4ZXJfbWlub3IgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmdndzbmRfbWl4ZXJfZm9wcywKLQkJCQkJCSBkZXZjLT5hdWRpb19taW5vciA+PiA0KTsKLQlpZiAoKGVyciA9IGRldmMtPm1peGVyX21pbm9yKSA8IDApIHsKLQkJREJHRE8ocHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAiYXR0YWNoX3Z3c25kOiByZWdpc3Rlcl9zb3VuZF9taXhlciBlcnJvciAlZFxuIiwKLQkJCSAgICAgZXJyKSk7Ci0JCWdvdG8gZmFpbDc7Ci0JfQotCi0JLyogU3F1aXJyZWwgYXdheSBkZXZpY2UgaW5kaWNlcyBmb3IgdW5sb2FkIHJvdXRpbmUuICovCi0KLQlod19jb25maWctPnNsb3RzWzBdID0gZGV2Yy0+YXVkaW9fbWlub3I7Ci0KLQkvKiBJbml0aWFsaXplIGFzIG11Y2ggb2YgKmRldmMgYXMgcG9zc2libGUgKi8KLQotCW11dGV4X2luaXQoJmRldmMtPm9wZW5fbXV0ZXgpOwotCW11dGV4X2luaXQoJmRldmMtPmlvX211dGV4KTsKLQltdXRleF9pbml0KCZkZXZjLT5taXhfbXV0ZXgpOwotCWRldmMtPm9wZW5fbW9kZSA9IDA7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldmMtPnJwb3J0LmxvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmMtPnJwb3J0LnF1ZXVlKTsKLQlkZXZjLT5ycG9ydC5zd3N0YXRlID0gU1dfT0ZGOwotCWRldmMtPnJwb3J0Lmh3c3RhdGUgPSBIV19TVE9QUEVEOwotCWRldmMtPnJwb3J0LmZsYWdzID0gMDsKLQlkZXZjLT5ycG9ydC5zd2J1ZiA9IE5VTEw7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldmMtPndwb3J0LmxvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmMtPndwb3J0LnF1ZXVlKTsKLQlkZXZjLT53cG9ydC5zd3N0YXRlID0gU1dfT0ZGOwotCWRldmMtPndwb3J0Lmh3c3RhdGUgPSBIV19TVE9QUEVEOwotCWRldmMtPndwb3J0LmZsYWdzID0gMDsKLQlkZXZjLT53cG9ydC5zd2J1ZiA9IE5VTEw7Ci0KLQkvKiBTdWNjZXNzLiAgTGluayB1cyBvbnRvIHRoZSBsb2NhbCBkZXZpY2UgbGlzdC4gKi8KLQotCWRldmMtPm5leHRfZGV2ID0gdndzbmRfZGV2X2xpc3Q7Ci0JdndzbmRfZGV2X2xpc3QgPSBkZXZjOwotCXJldHVybiBkZXZjLT5hdWRpb19taW5vcjsKLQotCS8qIFNvIG1hbnkgd2F5cyB0byBmYWlsLiAgVW5kbyB3aGF0IHdlIGRpZC4gKi8KLQotIGZhaWw3OgotCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldmMtPmF1ZGlvX21pbm9yKTsKLSBmYWlsNjoKLQlmcmVlX2lycShod19jb25maWctPmlycSwgZGV2Yyk7Ci0gZmFpbDU6Ci0gZmFpbDQ6Ci0JZnJlZV9wYWdlcyhkZXZjLT53cG9ydC5od2J1Zl92YWRkciwgSFdCVUZfT1JERVIpOwotIGZhaWwzOgotCWZyZWVfcGFnZXMoZGV2Yy0+cnBvcnQuaHdidWZfdmFkZHIsIEhXQlVGX09SREVSKTsKLSBmYWlsMjoKLQlsaV9kZXN0cm95KCZkZXZjLT5saXRoKTsKLSBmYWlsMToKLQlrZnJlZShkZXZjKTsKLSBmYWlsMDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCB1bmxvYWRfdndzbmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQotewotCXZ3c25kX2Rldl90ICpkZXZjLCAqKmRldmNwOwotCi0JREJHRSgiKClcbiIpOwotCi0JZGV2Y3AgPSAmdndzbmRfZGV2X2xpc3Q7Ci0Jd2hpbGUgKChkZXZjID0gKmRldmNwKSkgewotCQlpZiAoZGV2Yy0+YXVkaW9fbWlub3IgPT0gaHdfY29uZmlnLT5zbG90c1swXSkgewotCQkJKmRldmNwID0gZGV2Yy0+bmV4dF9kZXY7Ci0JCQlicmVhazsKLQkJfQotCQlkZXZjcCA9ICZkZXZjLT5uZXh0X2RldjsKLQl9Ci0KLQlpZiAoIWRldmMpCi0JCXJldHVybiAtRU5PREVWOwotCi0JdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihkZXZjLT5taXhlcl9taW5vcik7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2Yy0+YXVkaW9fbWlub3IpOwotCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBkZXZjKTsKLQlmcmVlX3BhZ2VzKGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7Ci0JZnJlZV9wYWdlcyhkZXZjLT5ycG9ydC5od2J1Zl92YWRkciwgSFdCVUZfT1JERVIpOwotCWxpX2Rlc3Ryb3koJmRldmMtPmxpdGgpOwotCWtmcmVlKGRldmMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGluaXRpYWxpemF0aW9uIGFuZCBsb2FkYWJsZSBrZXJuZWwgbW9kdWxlIGludGVyZmFjZSAqLwotCi1zdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyB0aGVfaHdfY29uZmlnID0gewotCTB4RkYwMDEwMDAsCQkJLyogbGl0aGl1bSBwaHlzIGFkZHIgICovCi0JQ09fSVJRKENPX0FQSUNfTElfQVVESU8pCS8qIGlycSAqLwotfTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIHNvdW5kIG1vZHVsZSIpOwotTU9EVUxFX0FVVEhPUigiQm9iIE1pbGxlciA8a2JvYkBzZ2kuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X3Z3c25kKHZvaWQpCi17Ci0JaW50IGVycjsKLQotCURCR1hWKCJcbiIpOwotCURCR1hWKCJzb3VuZDo6dndzbmQ6OmluaXRfbW9kdWxlKClcbiIpOwotCi0JaWYgKCFwcm9iZV92d3NuZCgmdGhlX2h3X2NvbmZpZykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZXJyID0gYXR0YWNoX3Z3c25kKCZ0aGVfaHdfY29uZmlnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfdndzbmQodm9pZCkKLXsKLQlEQkdYKCJzb3VuZDo6dndzbmQ6OmNsZWFudXBfbW9kdWxlKClcbiIpOwotCi0JdW5sb2FkX3Z3c25kKCZ0aGVfaHdfY29uZmlnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF92d3NuZCk7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX3Z3c25kKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BhcmlzYy9oYXJtb255LmMgYi9zb3VuZC9wYXJpc2MvaGFybW9ueS5jCmluZGV4IDY3ZjU2YTIuLjRiMjBiZTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BhcmlzYy9oYXJtb255LmMKKysrIGIvc291bmQvcGFyaXNjL2hhcm1vbnkuYwpAQCAtOTU5LDggKzk1OSw2IEBACiAgICAgICAgICAgICAgICAgZ290byBmcmVlX2FuZF9yZXQ7CiAgICAgICAgIH0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBhZGV2LT5kZXYpOwotCiAJKnJjaGlwID0gaDsKIAogCXJldHVybiAwOwpAQCAtOTc3LDcgKzk3NSw3IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfaGFybW9ueSAqaDsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwYWRldi0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9LY29uZmlnIGIvc291bmQvcGNpL0tjb25maWcKaW5kZXggODc1NmM4ZS4uMGIwYzBjZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL0tjb25maWcKKysrIGIvc291bmQvcGNpL0tjb25maWcKQEAgLTI3Niw3ICsyNzYsNyBAQAogCiBjb25maWcgU05EX0NTNTUzMAogCXRyaXN0YXRlICJDUzU1MzAgQXVkaW8iCi0JZGVwZW5kcyBvbiBJU0FfRE1BX0FQSQorCWRlcGVuZHMgb24gSVNBX0RNQV9BUEkgJiYgKFg4Nl8zMiB8fCBDT01QSUxFX1RFU1QpCiAJc2VsZWN0IFNORF9TQjE2X0RTUAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBhdWRpbyBvbiBDeXJpeC9OYXRTZW1pIENTNTUzMCBjaGlwcy4KQEAgLTI4Niw2ICsyODYsNyBAQAogCiBjb25maWcgU05EX0NTNTUzNUFVRElPCiAJdHJpc3RhdGUgIkNTNTUzNS9DUzU1MzYgQXVkaW8iCisJZGVwZW5kcyBvbiBYODZfMzIgfHwgTUlQUyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU05EX1BDTQogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwogCWhlbHAKQEAgLTU3OCw4ICs1NzksNiBAQAogCSAgRk04MDEgY2hpcCB3aXRoIGEgVEVBNTc1NyB0dW5lciAoTWVkaWFGb3J0ZSBTRjI1Ni1QQ1MsIFNGMjU2LVBDUCBhbmQKIAkgIFNGNjQtUENSKSBpbnRvIHRoZSBzbmQtZm04MDEgZHJpdmVyLgogCi1zb3VyY2UgInNvdW5kL3BjaS9oZGEvS2NvbmZpZyIKLQogY29uZmlnIFNORF9IRFNQCiAJdHJpc3RhdGUgIlJNRSBIYW1tZXJmYWxsIERTUCBBdWRpbyIKIAlzZWxlY3QgRldfTE9BREVSCkBAIC03OTYsNyArNzk1LDcgQEAKIAogY29uZmlnIFNORF9TSVM3MDE5CiAJdHJpc3RhdGUgIlNpUyA3MDE5IEF1ZGlvIEFjY2VsZXJhdG9yIgotCWRlcGVuZHMgb24gWDg2ICYmICFYODZfNjQKKwlkZXBlbmRzIG9uIFg4Nl8zMgogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwogCXNlbGVjdCBaT05FX0RNQQogCWhlbHAKQEAgLTg4OSwzICs4ODgsNSBAQAogCSAgd2lsbCBiZSBjYWxsZWQgc25kLXltZnBjaS4KIAogZW5kaWYJIyBTTkRfUENJCisKK3NvdXJjZSAic291bmQvcGNpL2hkYS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCmluZGV4IGJmNTc4YmEyLi4xNGFkNTRiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC0yMTQsNiArMjE0LDEyIEBACiAjZGVmaW5lIGFjOTdfaXNfcG93ZXJfc2F2ZV9tb2RlKGFjOTcpIDAKICNlbmRpZgogCisjZGVmaW5lIGFjOTdfZXJyKGFjOTcsIGZtdCwgYXJncy4uLikJXAorCWRldl9lcnIoKGFjOTcpLT5idXMtPmNhcmQtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIGFjOTdfd2FybihhYzk3LCBmbXQsIGFyZ3MuLi4pCVwKKwlkZXZfd2FybigoYWM5NyktPmJ1cy0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgYWM5N19kYmcoYWM5NywgZm10LCBhcmdzLi4uKQlcCisJZGV2X2RiZygoYWM5NyktPmJ1cy0+Y2FyZC0+ZGV2LCBmbXQsICMjYXJncykKIAogLyoKICAqICBJL08gcm91dGluZXMKQEAgLTE2NzMsNyArMTY3OSw3IEBACiAJaW50IGVyciwgaWR4OwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAiQUM5N19HUElPX0NGRyA9ICV4XG4iLAorCWFjOTdfZGJnKGFjOTcsICJBQzk3X0dQSU9fQ0ZHID0gJXhcbiIsCiAJICAgICAgIHNuZF9hYzk3X3JlYWQoYWM5NyxBQzk3X0dQSU9fQ0ZHKSk7CiAJKi8KIAlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X0dQSU9fQ0ZHLCAweGZmZmYgJiB+KEFDOTdfR1BJT19MSU5FMV9PSCkpOwpAQCAtMTk2Myw3ICsxOTY5LDcgQEAKIAkJICAgICBhYzk3LT5idXMtPmNhcmQtPm51bWJlciwgYWM5Ny0+bnVtLAogCQkgICAgIHNuZF9hYzk3X2dldF9zaG9ydF9uYW1lKGFjOTcpKTsKIAlpZiAoKGVyciA9IGRldmljZV9yZWdpc3RlcigmYWM5Ny0+ZGV2KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbid0IHJlZ2lzdGVyIGFjOTcgYnVzXG4iKTsKKwkJYWM5N19lcnIoYWM5NywgIkNhbid0IHJlZ2lzdGVyIGFjOTcgYnVzXG4iKTsKIAkJYWM5Ny0+ZGV2LmJ1cyA9IE5VTEw7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjA4OSw3ICsyMDk1LDggQEAKIAkJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSwgMSk7CiAJCX0KIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJBQyc5NyAlZCBkb2VzIG5vdCByZXNwb25kIC0gUkVTRVRcbiIsIGFjOTctPm51bSk7CisJCQlhYzk3X3dhcm4oYWM5NywgIkFDJzk3ICVkIGRvZXMgbm90IHJlc3BvbmQgLSBSRVNFVFxuIiwKKwkJCQkgYWM5Ny0+bnVtKTsKIAkJCS8qIHByb2NlZWQgYW55d2F5IC0gaXQncyBvZnRlbiBub24tY3JpdGljYWwgKi8KIAkJfQogCX0KQEAgLTIwOTgsNyArMjEwNSw5IEBACiAJYWM5Ny0+aWQgfD0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1ZFTkRPUl9JRDIpOwogCWlmICghIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9ERVRFQ1RfQllfVkVORE9SKSAmJgogCSAgICAoYWM5Ny0+aWQgPT0gMHgwMDAwMDAwMCB8fCBhYzk3LT5pZCA9PSAweGZmZmZmZmZmKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyAlZCBhY2Nlc3MgaXMgbm90IHZhbGlkIFsweCV4XSwgcmVtb3ZpbmcgbWl4ZXIuXG4iLCBhYzk3LT5udW0sIGFjOTctPmlkKTsKKwkJYWM5N19lcnIoYWM5NywKKwkJCSAiQUMnOTcgJWQgYWNjZXNzIGlzIG5vdCB2YWxpZCBbMHgleF0sIHJlbW92aW5nIG1peGVyLlxuIiwKKwkJCSBhYzk3LT5udW0sIGFjOTctPmlkKTsKIAkJc25kX2FjOTdfZnJlZShhYzk3KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjEzMSw3ICsyMTQwLDkgQEAKIAogCWlmICghYWM5N19pc19hdWRpbyhhYzk3KSAmJiAhYWM5N19pc19tb2RlbShhYzk3KSkgewogCQlpZiAoIShhYzk3LT5zY2FwcyAmIChBQzk3X1NDQVBfU0tJUF9BVURJT3xBQzk3X1NDQVBfU0tJUF9NT0RFTSkpKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgJWQgYWNjZXNzIGVycm9yIChub3QgYXVkaW8gb3IgbW9kZW0gY29kZWMpXG4iLCBhYzk3LT5udW0pOworCQkJYWM5N19lcnIoYWM5NywKKwkJCQkgIkFDJzk3ICVkIGFjY2VzcyBlcnJvciAobm90IGF1ZGlvIG9yIG1vZGVtIGNvZGVjKVxuIiwKKwkJCQkgYWM5Ny0+bnVtKTsKIAkJc25kX2FjOTdfZnJlZShhYzk3KTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQpAQCAtMjE1Niw3ICsyMTY3LDggQEAKIAkJCQlnb3RvIF9fcmVhZHlfb2s7CiAJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAkJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiQUMnOTcgJWQgYW5hbG9nIHN1YnNlY3Rpb25zIG5vdCByZWFkeVxuIiwgYWM5Ny0+bnVtKTsKKwkJYWM5N193YXJuKGFjOTcsCisJCQkgICJBQyc5NyAlZCBhbmFsb2cgc3Vic2VjdGlvbnMgbm90IHJlYWR5XG4iLCBhYzk3LT5udW0pOwogCX0KIAogCS8qIEZJWE1FOiBhZGQgcG93ZXJkb3duIGNvbnRyb2wgKi8KQEAgLTIxODgsNyArMjIwMCwxMCBAQAogCQkJCWdvdG8gX19yZWFkeV9vazsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCQl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJNQyc5NyAlZCBjb252ZXJ0ZXJzIGFuZCBHUElPIG5vdCByZWFkeSAoMHgleClcbiIsIGFjOTctPm51bSwgc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMpKTsKKwkJYWM5N193YXJuKGFjOTcsCisJCQkgICJNQyc5NyAlZCBjb252ZXJ0ZXJzIGFuZCBHUElPIG5vdCByZWFkeSAoMHgleClcbiIsCisJCQkgIGFjOTctPm51bSwKKwkJCSAgc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX01TVEFUVVMpKTsKIAl9CiAJCiAgICAgICBfX3JlYWR5X29rOgpAQCAtMjcyMyw3ICsyNzM4LDcgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCBzY2ZnOwogCWlmICgoYWM5Ny0+aWQgJiAweGZmZmZmZjAwKSAhPSAweDQxNDQ1MzAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFjOTdfcXVpcmsgQURfU0hBUklORyBpcyBvbmx5IGZvciBBRCBjb2RlY3NcbiIpOworCQlhYzk3X2VycihhYzk3LCAiYWM5N19xdWlyayBBRF9TSEFSSU5HIGlzIG9ubHkgZm9yIEFEIGNvZGVjc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBUdXJuIG9uIE9NUyBiaXQgdG8gcm91dGUgbWljcm9waG9uZSB0byBiYWNrIHBhbmVsICovCkBAIC0yNzM5LDcgKzI3NTQsOCBAQAogc3RhdGljIGludCB0dW5lX2FsY19qYWNrKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKIAlpZiAoKGFjOTctPmlkICYgMHhmZmZmZmYwMCkgIT0gMHg0MTRjNDcwMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhYzk3X3F1aXJrIEFMQ19KQUNLIGlzIG9ubHkgZm9yIFJlYWx0ZWsgY29kZWNzXG4iKTsKKwkJYWM5N19lcnIoYWM5NywKKwkJCSAiYWM5N19xdWlyayBBTENfSkFDSyBpcyBvbmx5IGZvciBSZWFsdGVrIGNvZGVjc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCAweDdhLCAweDIwLCAweDIwKTsgLyogc2VsZWN0IGphY2sgZGV0ZWN0IGZ1bmN0aW9uICovCkBAIC0yODk5LDcgKzI5MTUsOCBAQAogCWlmIChvdmVycmlkZSAmJiBzdHJjbXAob3ZlcnJpZGUsICItMSIpICYmIHN0cmNtcChvdmVycmlkZSwgImRlZmF1bHQiKSkgewogCQlyZXN1bHQgPSBhcHBseV9xdWlya19zdHIoYWM5Nywgb3ZlcnJpZGUpOwogCQlpZiAocmVzdWx0IDwgMCkKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImFwcGx5aW5nIHF1aXJrIHR5cGUgJXMgZmFpbGVkICglZClcbiIsIG92ZXJyaWRlLCByZXN1bHQpOworCQkJYWM5N19lcnIoYWM5NywgImFwcGx5aW5nIHF1aXJrIHR5cGUgJXMgZmFpbGVkICglZClcbiIsCisJCQkJIG92ZXJyaWRlLCByZXN1bHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtMjkxMywxMCArMjkzMCwxNCBAQAogCQkgICAgcXVpcmstPnN1YmRldmljZSA9PSAocXVpcmstPm1hc2sgJiBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlKSkgewogCQkJaWYgKHF1aXJrLT5jb2RlY19pZCAmJiBxdWlyay0+Y29kZWNfaWQgIT0gYWM5Ny0+aWQpCiAJCQkJY29udGludWU7Ci0JCQlzbmRfcHJpbnRkZCgiYWM5NyBxdWlyayBmb3IgJXMgKCUwNHg6JTA0eClcbiIsIHF1aXJrLT5uYW1lLCBhYzk3LT5zdWJzeXN0ZW1fdmVuZG9yLCBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKwkJCWFjOTdfZGJnKGFjOTcsICJhYzk3IHF1aXJrIGZvciAlcyAoJTA0eDolMDR4KVxuIiwKKwkJCQkgcXVpcmstPm5hbWUsIGFjOTctPnN1YnN5c3RlbV92ZW5kb3IsCisJCQkJIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UpOwogCQkJcmVzdWx0ID0gYXBwbHlfcXVpcmsoYWM5NywgcXVpcmstPnR5cGUpOwogCQkJaWYgKHJlc3VsdCA8IDApCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXBwbHlpbmcgcXVpcmsgdHlwZSAlZCBmb3IgJXMgZmFpbGVkICglZClcbiIsIHF1aXJrLT50eXBlLCBxdWlyay0+bmFtZSwgcmVzdWx0KTsKKwkJCQlhYzk3X2VycihhYzk3LAorCQkJCQkgImFwcGx5aW5nIHF1aXJrIHR5cGUgJWQgZm9yICVzIGZhaWxlZCAoJWQpXG4iLAorCQkJCQkgcXVpcmstPnR5cGUsIHF1aXJrLT5uYW1lLCByZXN1bHQpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYwppbmRleCA2NmEzYmM5Li45OTE3NjIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCkBAIC0zNDc3LDcgKzM0NzcsOCBAQAogCiAJCXNjdGwgPSBzbmRfYWM5N19maW5kX21peGVyX2N0bChhYzk3LCAqcyk7CiAJCWlmICghc2N0bCkgewotCQkJc25kX3ByaW50ZGQoIkNhbm5vdCBmaW5kIHNsYXZlICVzLCBza2lwcGVkXG4iLCAqcyk7CisJCQlkZXZfZGJnKGFjOTctPmJ1cy0+Y2FyZC0+ZGV2LAorCQkJCSJDYW5ub3QgZmluZCBzbGF2ZSAlcywgc2tpcHBlZFxuIiwgKnMpOwogCQkJY29udGludWU7CiAJCX0KIAkJZXJyID0gc25kX2N0bF9hZGRfc2xhdmUoa2N0bCwgc2N0bCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYwppbmRleCBlYWIwZmM5Li5kMTUyOTdhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKQEAgLTYwNCw3ICs2MDQsOSBAQAogCQl9CiAJCWlmICghb2tfZmxhZykgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZwY20tPmJ1cy0+YnVzX2xvY2spOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGZpbmQgY29uZmlndXJhdGlvbiBmb3IgQUM5NyBzbG90ICVpXG4iLCBpKTsKKwkJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsCisJCQkJImNhbm5vdCBmaW5kIGNvbmZpZ3VyYXRpb24gZm9yIEFDOTcgc2xvdCAlaVxuIiwKKwkJCQlpKTsKIAkJCWVyciA9IC1FQUdBSU47CiAJCQlnb3RvIGVycm9yOwogCQl9CkBAIC02MTgsMTUgKzYyMCwyMCBAQAogCQkJaWYgKHBjbS0+cltyXS5yc2xvdHNbY2lkeF0gJiAoMSA8PCBpKSkgewogCQkJCXJlZyA9IGdldF9zbG90X3JlZyhwY20sIGNpZHgsIGksIHIpOwogCQkJCWlmIChyZWcgPT0gMHhmZikgewotCQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIEFDOTcgc2xvdCAlaT9cbiIsIGkpOworCQkJCQlkZXZfZXJyKGJ1cy0+Y2FyZC0+ZGV2LAorCQkJCQkJImludmFsaWQgQUM5NyBzbG90ICVpP1xuIiwgaSk7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQlpZiAocmVnX29rW2NpZHhdICYgKDEgPDwgKHJlZyAtIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKSkpCiAJCQkJCWNvbnRpbnVlOwotCQkJCS8vcHJpbnRrKEtFUk5fREVCVUcgInNldHRpbmcgYWM5NyByZWcgMHgleCB0byByYXRlICVkXG4iLCByZWcsIHJhdGUpOworCQkJCWRldl9kYmcoYnVzLT5jYXJkLT5kZXYsCisJCQkJCSJzZXR0aW5nIGFjOTcgcmVnIDB4JXggdG8gcmF0ZSAlZFxuIiwKKwkJCQkJcmVnLCByYXRlKTsKIAkJCQllcnIgPSBzbmRfYWM5N19zZXRfcmF0ZShwY20tPnJbcl0uY29kZWNbY2lkeF0sIHJlZywgcmF0ZSk7CiAJCQkJaWYgKGVyciA8IDApCi0JCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIGluIHNuZF9hYzk3X3NldF9yYXRlOiBjaWR4PSVkLCByZWc9MHgleCwgcmF0ZT0lZCwgZXJyPSVkXG4iLCBjaWR4LCByZWcsIHJhdGUsIGVycik7CisJCQkJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsCisJCQkJCQkiZXJyb3IgaW4gc25kX2FjOTdfc2V0X3JhdGU6IGNpZHg9JWQsIHJlZz0weCV4LCByYXRlPSVkLCBlcnI9JWRcbiIsCisJCQkJCQljaWR4LCByZWcsIHJhdGUsIGVycik7CiAJCQkJZWxzZQogCQkJCQlyZWdfb2tbY2lkeF0gfD0gKDEgPDwgKHJlZyAtIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKSk7CiAJCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWQxODg5LmMgYi9zb3VuZC9wY2kvYWQxODg5LmMKaW5kZXggYjY4MGQwMy4uNDg4Zjk2NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FkMTg4OS5jCisrKyBiL3NvdW5kL3BjaS9hZDE4ODkuYwpAQCAtNzcsOSArNzcsNiBAQAogI2RlZmluZSBERVZOQU1FICJhZDE4ODkiCiAjZGVmaW5lIFBGWAlERVZOQU1FICI6ICIKIAotLyogbGV0J3MgdXNlIHRoZSBnbG9iYWwgc291bmQgZGVidWcgaW50ZXJmYWNlcyAqLwotI2RlZmluZSBhZDE4ODlfZGVidWcoZm10LCBhcmcuLi4pIHNuZF9wcmludGQoS0VSTl9ERUJVRyBmbXQsICMjIGFyZykKLQogLyoga2VlcCB0cmFjayBvZiBzb21lIGh3IHJlZ2lzdGVycyAqLwogc3RydWN0IGFkMTg4OV9yZWdpc3Rlcl9zdGF0ZSB7CiAJdTE2IHJlZzsJLyogcmVnIHNldHVwICovCkBAIC0yNjQsMTEgKzI2MSwxMSBAQAogCQkJJiYgLS1yZXRyeSkKIAkJbWRlbGF5KDEpOwogCWlmICghcmV0cnkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggIlslc10gTGluayBpcyBub3QgcmVhZHkuXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlslc10gTGluayBpcyBub3QgcmVhZHkuXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JYWQxODg5X2RlYnVnKCJbJXNdIHJlYWR5IGFmdGVyICVkIG1zXG4iLCBfX2Z1bmNfXywgNDAwIC0gcmV0cnkpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiWyVzXSByZWFkeSBhZnRlciAlZCBtc1xuIiwgX19mdW5jX18sIDQwMCAtIHJldHJ5KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDA1LDkgKzQwMiw5IEBACiAJCiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5sb2NrKTsKIAkKLQlhZDE4ODlfZGVidWcoInByZXBhcmUgcGxheWJhY2s6IGFkZHIgPSAweCV4LCBjb3VudCA9ICV1LCAiCi0JCQkic2l6ZSA9ICV1LCByZWcgPSAweCV4LCByYXRlID0gJXVcbiIsIGNoaXAtPndhdmUuYWRkciwKLQkJCWNvdW50LCBzaXplLCByZWcsIHJ0LT5yYXRlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInByZXBhcmUgcGxheWJhY2s6IGFkZHIgPSAweCV4LCBjb3VudCA9ICV1LCBzaXplID0gJXUsIHJlZyA9IDB4JXgsIHJhdGUgPSAldVxuIiwKKwkJY2hpcC0+d2F2ZS5hZGRyLCBjb3VudCwgc2l6ZSwgcmVnLCBydC0+cmF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1Miw5ICs0NDksOSBAQAogCQogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+bG9jayk7CiAJCi0JYWQxODg5X2RlYnVnKCJwcmVwYXJlIGNhcHR1cmU6IGFkZHIgPSAweCV4LCBjb3VudCA9ICV1LCAiCi0JCQkic2l6ZSA9ICV1LCByZWcgPSAweCV4LCByYXRlID0gJXVcbiIsIGNoaXAtPnJhbWMuYWRkciwKLQkJCWNvdW50LCBzaXplLCByZWcsIHJ0LT5yYXRlKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInByZXBhcmUgY2FwdHVyZTogYWRkciA9IDB4JXgsIGNvdW50ID0gJXUsIHNpemUgPSAldSwgcmVnID0gMHgleCwgcmF0ZSA9ICV1XG4iLAorCQljaGlwLT5yYW1jLmFkZHIsIGNvdW50LCBzaXplLCByZWcsIHJ0LT5yYXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjE0LDcgKzYxMSw4IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWlmIChzdCAmIChBRF9ETUFfRElTUl9QTUFJfEFEX0RNQV9ESVNSX1BUQUkpKQotCQlhZDE4ODlfZGVidWcoIlVuZXhwZWN0ZWQgbWFzdGVyIG9yIHRhcmdldCBhYm9ydCBpbnRlcnJ1cHQhXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiVW5leHBlY3RlZCBtYXN0ZXIgb3IgdGFyZ2V0IGFib3J0IGludGVycnVwdCFcbiIpOwogCiAJaWYgKChzdCAmIEFEX0RNQV9ESVNSX1dBVkkpICYmIGNoaXAtPnBzdWJzKQogCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnBzdWJzKTsKQEAgLTY1Niw3ICs2NTQsNyBAQAogCQkJCQkJQlVGRkVSX0JZVEVTX01BWCk7CiAKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiYnVmZmVyIGFsbG9jYXRpb24gZXJyb3I6ICVkXG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImJ1ZmZlciBhbGxvY2F0aW9uIGVycm9yOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJCkBAIC05MTIsNyArOTEwLDcgQEAKIAkvKiBjaGVjayBQQ0kgYXZhaWxhYmlsaXR5ICgzMmJpdCBETUEpICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImVycm9yIHNldHRpbmcgMzItYml0IERNQSBtYXNrLlxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3Igc2V0dGluZyAzMi1iaXQgRE1BIG1hc2suXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtOTM1LDcgKzkzMyw3IEBACiAJY2hpcC0+YmFyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJY2hpcC0+aW9iYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKGNoaXAtPmlvYmFzZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byByZXNlcnZlIHJlZ2lvbi5cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byByZXNlcnZlIHJlZ2lvbi5cbiIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZnJlZV9hbmRfcmV0OwogCX0KQEAgLTk0Niw3ICs5NDQsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYWQxODg5X2ludGVycnVwdCwKIAkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IG9idGFpbiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3Qgb2J0YWluIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfYWQxODg5X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtOTY1LDggKzk2Myw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAogCXJldHVybiAwOwpAQCAtOTk2LDcgKzk5Miw4IEBACiAJfQogCiAJLyogKDIpICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm5vXSwgaWRbZGV2bm9dLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldm5vXSwgaWRbZGV2bm9dLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAkvKiBYWFggUkVWSVNJVDogd2UgY2FuIHByb2JhYmx5IGFsbG9jYXRlIGNoaXAgaW4gdGhpcyBjYWxsICovCiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKaW5kZXggYzY4MzVhMy4uZmViMjljMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpAQCAtNjUsMTggKzY1LDYgQEAKIAogCiAvKgotICogIERlYnVnIHBhcnQgZGVmaW5pdGlvbnMKLSAqLwotCi0vKiAjZGVmaW5lIEFMSV9ERUJVRyAqLwotCi0jaWZkZWYgQUxJX0RFQlVHCi0jZGVmaW5lIHNuZF9hbGlfcHJpbnRrKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpOwotI2Vsc2UKLSNkZWZpbmUgc25kX2FsaV9wcmludGsoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLS8qCiAgKiAgQ29uc3RhbnRzIGRlZmluaXRpb24KICAqLwogCkBAIC0zMjEsNyArMzA5LDcgQEAKIAl9CiAKIAlzbmRfYWxpXzU0NTFfcG9rZShjb2RlYywgcG9ydCwgcmVzICYgfjB4ODAwMCk7Ci0Jc25kX3ByaW50ZGQoImFsaV9jb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5LlxuICIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImFsaV9jb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5LlxuICIpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC0zNDIsNyArMzMwLDcgQEAKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfQogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX3N0aW1lcl9yZWFkOiBzdGltZXIgaXMgbm90IHJlYWR5LlxuIik7CisJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX3N0aW1lcl9yZWFkOiBzdGltZXIgaXMgbm90IHJlYWR5LlxuIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTM1NCw3ICszNDIsOCBAQAogCXVuc2lnbmVkIGludCBwb3J0OwogCiAJaWYgKHJlZyA+PSAweDgwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9jb2RlY19wb2tlOiByZWcoJXhoKSBpbnZhbGlkLlxuIiwgcmVnKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LAorCQkJImFsaV9jb2RlY19wb2tlOiByZWcoJXhoKSBpbnZhbGlkLlxuIiwgcmVnKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzg1LDcgKzM3NCw4IEBACiAJdW5zaWduZWQgaW50IHBvcnQ7CiAKIAlpZiAocmVnID49IDB4ODApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2NvZGVjX3BlZWs6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOworCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkiYWxpX2NvZGVjX3BlZWs6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOwogCQlyZXR1cm4gfjA7CiAJfQogCkBAIC00MTcsNyArNDA3LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBhYzk3LT5wcml2YXRlX2RhdGE7CiAKLQlzbmRfYWxpX3ByaW50aygiY29kZWNfd3JpdGU6IHJlZz0leGggZGF0YT0leGguXG4iLCByZWcsIHZhbCk7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiY29kZWNfd3JpdGU6IHJlZz0leGggZGF0YT0leGguXG4iLCByZWcsIHZhbCk7CiAJaWYgKHJlZyA9PSBBQzk3X0dQSU9fU1RBVFVTKSB7CiAJCW91dGwoKHZhbCA8PCBBTElfQUM5N19HUElPX0RBVEFfU0hJRlQpIHwgQUxJX0FDOTdfR1BJT19FTkFCTEUsCiAJCSAgICAgQUxJX1JFRyhjb2RlYywgQUxJX0FDOTdfR1BJTykpOwpAQCAtNDMzLDcgKzQyMyw3IEBACiB7CiAJc3RydWN0IHNuZF9hbGkgKmNvZGVjID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOwogCi0Jc25kX2FsaV9wcmludGsoImNvZGVjX3JlYWQgcmVnPSV4aC5cbiIsIHJlZyk7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiY29kZWNfcmVhZCByZWc9JXhoLlxuIiwgcmVnKTsKIAlyZXR1cm4gc25kX2FsaV9jb2RlY19wZWVrKGNvZGVjLCBhYzk3LT5udW0sIHJlZyk7CiB9CiAKQEAgLTQ3NCw3ICs0NjQsNyBAQAogCX0KIAogCS8qIG5vbi1mYXRhbCBpZiB5b3UgaGF2ZSBhIG5vbiBQTSBjYXBhYmxlIGNvZGVjICovCi0JLyogc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImFsaTU0NTE6IHJlc2V0IHRpbWUgb3V0XG4iKTsgKi8KKwkvKiBkZXZfd2Fybihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpNTQ1MTogcmVzZXQgdGltZSBvdXRcbiIpOyAqLwogCXJldHVybiAwOwogfQogCkBAIC01MjgsNyArNTE4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbWFzazsKIAlzdHJ1Y3Qgc25kX2FsaV9jaGFubmVsX2NvbnRyb2wgKnBjaHJlZ3MgPSAmKGNvZGVjLT5jaHJlZ3MpOwogCi0Jc25kX2FsaV9wcmludGsoImRpc2FibGVfdm9pY2VfaXJxIGNoYW5uZWw9JWRcbiIsY2hhbm5lbCk7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiZGlzYWJsZV92b2ljZV9pcnEgY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7CiAKIAltYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwogCXBjaHJlZ3MtPmRhdGEuYWludGVuICA9IGlubChBTElfUkVHKGNvZGVjLCBwY2hyZWdzLT5yZWdzLmFpbnRlbikpOwpAQCAtNTQxLDcgKzUzMSw3IEBACiAJdW5zaWduZWQgaW50IGlkeCA9ICBjaGFubmVsICYgMHgxZjsKIAogCWlmIChjb2RlYy0+c3ludGguY2hjbnQgPj0gQUxJX0NIQU5ORUxTKXsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCiAJCQkgICAiYWxpX2FsbG9jX3BjbV9jaGFubmVsOiBubyBmcmVlIGNoYW5uZWxzLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC01NDksNyArNTM5LDcgQEAKIAlpZiAoIShjb2RlYy0+c3ludGguY2htYXAgJiAoMSA8PCBpZHgpKSkgewogCQljb2RlYy0+c3ludGguY2htYXAgfD0gMSA8PCBpZHg7CiAJCWNvZGVjLT5zeW50aC5jaGNudCsrOwotCQlzbmRfYWxpX3ByaW50aygiYWxsb2NfcGNtX2NoYW5uZWwgbm8uICVkLlxuIixpZHgpOworCQlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJhbGxvY19wY21fY2hhbm5lbCBuby4gJWQuXG4iLCBpZHgpOwogCQlyZXR1cm4gaWR4OwogCX0KIAlyZXR1cm4gLTE7CkBAIC01NjAsNyArNTUwLDggQEAKIAlpbnQgaWR4OwogCWludCByZXN1bHQgPSAtMTsKIAotCXNuZF9hbGlfcHJpbnRrKCJmaW5kX2ZyZWVfY2hhbm5lbDogZm9yICVzXG4iLHJlYyA/ICJyZWMiIDogInBjbSIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwKKwkJImZpbmRfZnJlZV9jaGFubmVsOiBmb3IgJXNcbiIsIHJlYyA/ICJyZWMiIDogInBjbSIpOwogCiAJLyogcmVjb3JkaW5nICovCiAJaWYgKHJlYykgewpAQCAtNTc1LDggKzU2Niw4IEBACiAJCWlmIChyZXN1bHQgPj0gMCkKIAkJCXJldHVybiByZXN1bHQ7CiAJCWVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiAiCi0JCQkJICAgInJlY29yZCBjaGFubmVsIGlzIGJ1c3kgbm93LlxuIik7CisJCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkJImFsaV9maW5kX2ZyZWVfY2hhbm5lbDogcmVjb3JkIGNoYW5uZWwgaXMgYnVzeSBub3cuXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KQEAgLTU5MCw4ICs1ODEsOCBAQAogCQlpZiAocmVzdWx0ID49IDApCiAJCQlyZXR1cm4gcmVzdWx0OwogCQllbHNlCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6ICIKLQkJCQkgICAiUy9QRElGIG91dCBjaGFubmVsIGlzIGluIGJ1c3kgbm93LlxuIik7CisJCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkJImFsaV9maW5kX2ZyZWVfY2hhbm5lbDogUy9QRElGIG91dCBjaGFubmVsIGlzIGluIGJ1c3kgbm93LlxuIik7CiAJfQogCiAJZm9yIChpZHggPSAwOyBpZHggPCBBTElfQ0hBTk5FTFM7IGlkeCsrKSB7CkBAIC01OTksNyArNTkwLDcgQEAKIAkJaWYgKHJlc3VsdCA+PSAwKQogCQkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiBubyBmcmVlIGNoYW5uZWxzLlxuIik7CisJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiBubyBmcmVlIGNoYW5uZWxzLlxuIik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC02MDcsMTQgKzU5OCwxNSBAQAogewogCXVuc2lnbmVkIGludCBpZHggPSBjaGFubmVsICYgMHgwMDAwMDAxZjsKIAotCXNuZF9hbGlfcHJpbnRrKCJmcmVlX2NoYW5uZWxfcGNtIGNoYW5uZWw9JWRcbiIsY2hhbm5lbCk7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAiZnJlZV9jaGFubmVsX3BjbSBjaGFubmVsPSVkXG4iLCBjaGFubmVsKTsKIAogCWlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID49IEFMSV9DSEFOTkVMUykKIAkJcmV0dXJuOwogCiAJaWYgKCEoY29kZWMtPnN5bnRoLmNobWFwICYgKDEgPDwgaWR4KSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2ZyZWVfY2hhbm5lbF9wY206ICIKLQkJCSAgICJjaGFubmVsICVkIGlzIG5vdCBpbiB1c2UuXG4iLCBjaGFubmVsKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LAorCQkJImFsaV9mcmVlX2NoYW5uZWxfcGNtOiBjaGFubmVsICVkIGlzIG5vdCBpbiB1c2UuXG4iLAorCQkJY2hhbm5lbCk7CiAJCXJldHVybjsKIAl9IGVsc2UgewogCQljb2RlYy0+c3ludGguY2htYXAgJj0gfigxIDw8IGlkeCk7CkBAIC02MjYsNyArNjE4LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKIAotCXNuZF9hbGlfcHJpbnRrKCJzdG9wX3ZvaWNlOiBjaGFubmVsPSVkXG4iLGNoYW5uZWwpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInN0b3Bfdm9pY2U6IGNoYW5uZWw9JWRcbiIsIGNoYW5uZWwpOwogCW91dGwobWFzaywgQUxJX1JFRyhjb2RlYywgY29kZWMtPmNocmVncy5yZWdzLnN0b3ApKTsKIH0KIApAQCAtNjY3LDcgKzY1OSw3IEBACiAJfQogCiAJaWYgKGNvdW50ID4gNTAwMDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2RldGVjdF9zcGRpZl9yYXRlOiB0aW1lb3V0IVxuIik7CisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZTogdGltZW91dCFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC02ODIsNyArNjc0LDcgQEAKIAl9CiAKIAlpZiAoY291bnQgPiA1MDAwMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZGV0ZWN0X3NwZGlmX3JhdGU6IHRpbWVvdXQhXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LCAiYWxpX2RldGVjdF9zcGRpZl9yYXRlOiB0aW1lb3V0IVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg1Nyw5ICs4NDksNiBAQAogCXN0cnVjdCBzbmRfYWxpX3ZvaWNlICpwdm9pY2U7CiAJc3RydWN0IHNuZF9hbGlfY2hhbm5lbF9jb250cm9sICpwY2hyZWdzOwogCXVuc2lnbmVkIGludCBvbGQsIG1hc2s7Ci0jaWZkZWYgQUxJX0RFQlVHCi0JdW5zaWduZWQgaW50IHRlbXAsIGNzcGY7Ci0jZW5kaWYKIAogCXBjaHJlZ3MgPSAmKGNvZGVjLT5jaHJlZ3MpOwogCkBAIC04NzcsMTQgKzg2NiwxMSBAQAogCiAJaWYgKHB2b2ljZS0+cGNtICYmIHB2b2ljZS0+c3Vic3RyZWFtKSB7CiAJCS8qIHBjbSBpbnRlcnJ1cHQgKi8KLSNpZmRlZiBBTElfREVCVUcKLQkJb3V0YigodTgpKHB2b2ljZS0+bnVtYmVyKSwgQUxJX1JFRyhjb2RlYywgQUxJX0dDX0NJUikpOwotCQl0ZW1wID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9DU09fQUxQSEFfRk1TICsgMikpOwotCQljc3BmID0gKGlubChBTElfUkVHKGNvZGVjLCBBTElfQ1NQRikpICYgbWFzaykgPT0gbWFzazsKLSNlbmRpZgogCQlpZiAocHZvaWNlLT5ydW5uaW5nKSB7Ci0JCQlzbmRfYWxpX3ByaW50aygidXBkYXRlX3B0cjogY3NvPSU0LjR4IGNzcGY9JWQuXG4iLAotCQkJCSAgICAgICAodTE2KXRlbXAsIGNzcGYpOworCQkJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LAorCQkJCSJ1cGRhdGVfcHRyOiBjc289JTQuNHggY3NwZj0lZC5cbiIsCisJCQkJaW53KEFMSV9SRUcoY29kZWMsIEFMSV9DU09fQUxQSEFfRk1TICsgMikpLAorCQkJCShpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0NTUEYpKSAmIG1hc2spID09IG1hc2spOwogCQkJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7CiAJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHB2b2ljZS0+c3Vic3RyZWFtKTsKIAkJCXNwaW5fbG9jaygmY29kZWMtPnJlZ19sb2NrKTsKQEAgLTk0MCwxNCArOTI2LDE0IEBACiAJc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZTsKIAlpbnQgaWR4OwogCi0Jc25kX2FsaV9wcmludGsoImFsbG9jX3ZvaWNlOiB0eXBlPSVkIHJlYz0lZFxuIiwgdHlwZSwgcmVjKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJhbGxvY192b2ljZTogdHlwZT0lZCByZWM9JWRcbiIsIHR5cGUsIHJlYyk7CiAKIAlzcGluX2xvY2tfaXJxKCZjb2RlYy0+dm9pY2VfYWxsb2MpOwogCWlmICh0eXBlID09IFNORFJWX0FMSV9WT0lDRV9UWVBFX1BDTSkgewogCQlpZHggPSBjaGFubmVsID4gMCA/IHNuZF9hbGlfYWxsb2NfcGNtX2NoYW5uZWwoY29kZWMsIGNoYW5uZWwpIDoKIAkJCXNuZF9hbGlfZmluZF9mcmVlX2NoYW5uZWwoY29kZWMscmVjKTsKIAkJaWYgKGlkeCA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9hbGxvY192b2ljZTogZXJyLlxuIik7CisJCQlkZXZfZXJyKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfYWxsb2Nfdm9pY2U6IGVyci5cbiIpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZjb2RlYy0+dm9pY2VfYWxsb2MpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTk3MCw3ICs5NTYsNyBAQAogCXZvaWQgKCpwcml2YXRlX2ZyZWUpKHZvaWQgKik7CiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwogCi0Jc25kX2FsaV9wcmludGsoImZyZWVfdm9pY2U6IGNoYW5uZWw9JWRcbiIscHZvaWNlLT5udW1iZXIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImZyZWVfdm9pY2U6IGNoYW5uZWw9JWRcbiIsIHB2b2ljZS0+bnVtYmVyKTsKIAlpZiAoIXB2b2ljZS0+dXNlKQogCQlyZXR1cm47CiAJc25kX2FsaV9jbGVhcl92b2ljZXMoY29kZWMsIHB2b2ljZS0+bnVtYmVyLCBwdm9pY2UtPm51bWJlcik7CkBAIC0xMTUzLDcgKzExMzksNyBAQAogCW91dGwodmFsLCBBTElfUkVHKGNvZGVjLCBBTElfQUlOVEVOKSk7CiAJaWYgKGRvX3N0YXJ0KQogCQlvdXRsKHdoYXQsIEFMSV9SRUcoY29kZWMsIEFMSV9TVEFSVCkpOwotCXNuZF9hbGlfcHJpbnRrKCJ0cmlnZ2VyOiB3aGF0PSV4aCB3aGF0aT0leGhcbiIsIHdoYXQsIHdoYXRpKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJ0cmlnZ2VyOiB3aGF0PSV4aCB3aGF0aT0leGhcbiIsIHdoYXQsIHdoYXRpKTsKIAlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMTIzOSw3ICsxMjI1LDcgQEAKIAl1bnNpZ25lZCBpbnQgVk9MOwogCXVuc2lnbmVkIGludCBFQzsKIAkKLQlzbmRfYWxpX3ByaW50aygicGxheWJhY2tfcHJlcGFyZSAuLi5cbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInBsYXliYWNrX3ByZXBhcmUgLi4uXG4iKTsKIAogCXNwaW5fbG9ja19pcnEoJmNvZGVjLT5yZWdfbG9jayk7CQogCQpAQCAtMTI2Niw3ICsxMjUyLDcgQEAKIAkvKiBzZXQgdGFyZ2V0IEVTTyBmb3IgY2hhbm5lbCAqLwogCXB2b2ljZS0+ZXNvID0gcnVudGltZS0+YnVmZmVyX3NpemU7IAogCi0Jc25kX2FsaV9wcmludGsoInBsYXliYWNrX3ByZXBhcmU6IGVzbz0leGggY291bnQ9JXhoXG4iLAorCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgInBsYXliYWNrX3ByZXBhcmU6IGVzbz0leGggY291bnQ9JXhoXG4iLAogCQkgICAgICAgcHZvaWNlLT5lc28sIHB2b2ljZS0+Y291bnQpOwogCiAJLyogc2V0IEVTTyB0byBjYXB0dXJlIGZpcnN0IE1JRExQIGludGVycnVwdCAqLwpAQCAtMTI3OCw4ICsxMjY0LDkgQEAKIAlQQU4gPSAwOwogCVZPTCA9IDA7CiAJRUMgPSAwOwotCXNuZF9hbGlfcHJpbnRrKCJwbGF5YmFja19wcmVwYXJlOlxuIik7Ci0Jc25kX2FsaV9wcmludGsoImNoPSVkLCBSYXRlPSVkIERlbHRhPSV4aCxHVlNFTD0leGgsUEFOPSV4aCxDVFJMPSV4aFxuIiwKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJwbGF5YmFja19wcmVwYXJlOlxuIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LAorCQkiY2g9JWQsIFJhdGU9JWQgRGVsdGE9JXhoLEdWU0VMPSV4aCxQQU49JXhoLENUUkw9JXhoXG4iLAogCQkgICAgICAgcHZvaWNlLT5udW1iZXIscnVudGltZS0+cmF0ZSxEZWx0YSxHVlNFTCxQQU4sQ1RSTCk7CiAJc25kX2FsaV93cml0ZV92b2ljZV9yZWdzKGNvZGVjLAogCQkJCSBwdm9pY2UtPm51bWJlciwKQEAgLTEzMzIsNyArMTMxOSw3IEBACiAKIAlzcGluX2xvY2tfaXJxKCZjb2RlYy0+cmVnX2xvY2spOwogCi0Jc25kX2FsaV9wcmludGsoImFsaV9wcmVwYXJlLi4uXG4iKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJhbGlfcHJlcGFyZS4uLlxuIik7CiAKIAlzbmRfYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoY29kZWMscHZvaWNlLT5udW1iZXIpOwogCkBAIC0xMzUxLDE1ICsxMzM4LDE2IEBACiAKIAkJcmF0ZSA9IHNuZF9hbGlfZ2V0X3NwZGlmX2luX3JhdGUoY29kZWMpOwogCQlpZiAocmF0ZSA9PSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpX2NhcHR1cmVfcHJlYXByZTogIgotCQkJCSAgICJzcGRpZiByYXRlIGRldGVjdCBlcnIhXG4iKTsKKwkJCWRldl93YXJuKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkJICJhbGlfY2FwdHVyZV9wcmVhcHJlOiBzcGRpZiByYXRlIGRldGVjdCBlcnIhXG4iKTsKIAkJCXJhdGUgPSA0ODAwMDsKIAkJfQogCQlzcGluX2xvY2tfaXJxKCZjb2RlYy0+cmVnX2xvY2spOwogCQliVmFsdWUgPSBpbmIoQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCkpOwogCQlpZiAoYlZhbHVlICYgMHgxMCkgewogCQkJb3V0YihiVmFsdWUsQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCkpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2xlYXIgU1BESUYgcGFyaXR5IGVycm9yIGZsYWcuXG4iKTsKKwkJCWRldl93YXJuKGNvZGVjLT5jYXJkLT5kZXYsCisJCQkJICJjbGVhciBTUERJRiBwYXJpdHkgZXJyb3IgZmxhZy5cbiIpOwogCQl9CiAKIAkJaWYgKHJhdGUgIT0gNDgwMDApCkBAIC0xNDE4LDcgKzE0MDYsNyBAQAogCW91dGIocHZvaWNlLT5udW1iZXIsIEFMSV9SRUcoY29kZWMsIEFMSV9HQ19DSVIpKTsKIAljc28gPSBpbncoQUxJX1JFRyhjb2RlYywgQUxJX0NTT19BTFBIQV9GTVMgKyAyKSk7CiAJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7Ci0Jc25kX2FsaV9wcmludGsoInBsYXliYWNrIHBvaW50ZXIgcmV0dXJuZWQgY3NvPSV4aC5cbiIsIGNzbyk7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAicGxheWJhY2sgcG9pbnRlciByZXR1cm5lZCBjc289JXhoLlxuIiwgY3NvKTsKIAogCXJldHVybiBjc287CiB9CkBAIC0xNjg1LDcgKzE2NzMsOCBAQAogCWVyciA9IHNuZF9wY21fbmV3KGNvZGVjLT5jYXJkLCBkZXNjLT5uYW1lLCBkZXZpY2UsCiAJCQkgIGRlc2MtPnBsYXliYWNrX251bSwgZGVzYy0+Y2FwdHVyZV9udW0sICZwY20pOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInNuZF9hbGlfcGNtOiBlcnIgY2FsbGVkIHNuZF9wY21fbmV3LlxuIik7CisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwKKwkJCSJzbmRfYWxpX3BjbTogZXJyIGNhbGxlZCBzbmRfcGNtX25ldy5cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlwY20tPnByaXZhdGVfZGF0YSA9IGNvZGVjOwpAQCAtMTg2MSw3ICsxODUwLDcgQEAKIAkJYWM5Ny5udW0gPSBpOwogCQllcnIgPSBzbmRfYWM5N19taXhlcihjb2RlYy0+YWM5N19idXMsICZhYzk3LCAmY29kZWMtPmFjOTdbaV0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQkJZGV2X2Vycihjb2RlYy0+Y2FyZC0+ZGV2LAogCQkJCSAgICJhbGkgbWl4ZXIgJWQgY3JlYXRpbmcgZXJyb3IuXG4iLCBpKTsKIAkJCWlmIChpID09IDApCiAJCQkJcmV0dXJuIGVycjsKQEAgLTE5NDcsOCArMTkzNiw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbGk1NDUxOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yMDEzLDEwICsyMDAxLDEwIEBACiAJdW5zaWduZWQgY2hhciB0ZW1wOwogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwogCi0Jc25kX2FsaV9wcmludGsoImNoaXAgaW5pdGlhbGl6aW5nIC4uLiBcbiIpOworCWRldl9kYmcoY29kZWMtPmNhcmQtPmRldiwgImNoaXAgaW5pdGlhbGl6aW5nIC4uLlxuIik7CiAKIAlpZiAoc25kX2FsaV9yZXNldF81NDUxKGNvZGVjKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfY2hpcF9pbml0OiByZXNldCA1NDUxIGVycm9yLlxuIik7CisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwgImFsaV9jaGlwX2luaXQ6IHJlc2V0IDU0NTEgZXJyb3IuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMjA2Miw3ICsyMDUwLDcgQEAKIAkJICAgICBBTElfUkVHKGNvZGVjLCBBTElfU0NUUkwpKTsKIAl9CiAKLQlzbmRfYWxpX3ByaW50aygiY2hpcCBpbml0aWFsaXplIHN1Y2NlZWQuXG4iKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJjaGlwIGluaXRpYWxpemUgc3VjY2VlZC5cbiIpOwogCXJldHVybiAwOwogCiB9CkBAIC0yMDg4LDcgKzIwNzYsNyBAQAogewogCWludCBlcnI7CiAKLQlzbmRfYWxpX3ByaW50aygicmVzb3VyY2VzIGFsbG9jYXRpb24gLi4uXG4iKTsKKwlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJyZXNvdXJjZXMgYWxsb2NhdGlvbiAuLi5cbiIpOwogCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoY29kZWMtPnBjaSwgIkFMSSA1NDUxIik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0yMDk2LDExICsyMDg0LDExIEBACiAKIAlpZiAocmVxdWVzdF9pcnEoY29kZWMtPnBjaS0+aXJxLCBzbmRfYWxpX2NhcmRfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjb2RlYykpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlcXVlc3QgaXJxLlxuIik7CisJCWRldl9lcnIoY29kZWMtPmNhcmQtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IGlycS5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAljb2RlYy0+aXJxID0gY29kZWMtPnBjaS0+aXJxOwotCXNuZF9hbGlfcHJpbnRrKCJyZXNvdXJjZXMgYWxsb2NhdGVkLlxuIik7CisJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAicmVzb3VyY2VzIGFsbG9jYXRlZC5cbiIpOwogCXJldHVybiAwOwogfQogc3RhdGljIGludCBzbmRfYWxpX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCkBAIC0yMTI1LDcgKzIxMTMsNyBAQAogCiAJKnJfYWxpID0gTlVMTDsKIAotCXNuZF9hbGlfcHJpbnRrKCJjcmVhdGluZyAuLi5cbiIpOworCWRldl9kYmcoY2FyZC0+ZGV2LCAiY3JlYXRpbmcgLi4uXG4iKTsKIAogCS8qIGVuYWJsZSBQQ0kgZGV2aWNlICovCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKQEAgLTIxMzQsOCArMjEyMiw4IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAzMSBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzEpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMxKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0ICIKLQkJCSAgICIzMWJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMxYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMjE5OSw0OCArMjE4Nyw0NiBAQAogCS8qIE0xNTMzOiBzb3V0aGJyaWRnZSAqLwogCWNvZGVjLT5wY2lfbTE1MzMgPSBwY2lfZ2V0X2RldmljZSgweDEwYjksIDB4MTUzMywgTlVMTCk7CiAJaWYgKCFjb2RlYy0+cGNpX20xNTMzKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaTU0NTE6IGNhbm5vdCBmaW5kIEFMaSAxNTMzIGNoaXAuXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgZmluZCBBTGkgMTUzMyBjaGlwLlxuIik7CiAJCXNuZF9hbGlfZnJlZShjb2RlYyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAkvKiBNNzEwMTogcG93ZXIgbWFuYWdlbWVudCAqLwogCWNvZGVjLT5wY2lfbTcxMDEgPSBwY2lfZ2V0X2RldmljZSgweDEwYjksIDB4NzEwMSwgTlVMTCk7CiAJaWYgKCFjb2RlYy0+cGNpX203MTAxICYmIGNvZGVjLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpNTQ1MTogY2Fubm90IGZpbmQgQUxpIDcxMDEgY2hpcC5cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBmaW5kIEFMaSA3MTAxIGNoaXAuXG4iKTsKIAkJc25kX2FsaV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25kX2FsaV9wcmludGsoInNuZF9kZXZpY2VfbmV3IGlzIGNhbGxlZC5cbiIpOworCWRldl9kYmcoY2FyZC0+ZGV2LCAic25kX2RldmljZV9uZXcgaXMgY2FsbGVkLlxuIik7CiAJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjb2RlYywgJm9wcyk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2FsaV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkvKiBpbml0aWFsaXNlIHN5bnRoIHZvaWNlcyovCiAJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKQogCQljb2RlYy0+c3ludGgudm9pY2VzW2ldLm51bWJlciA9IGk7CiAKIAllcnIgPSBzbmRfYWxpX2NoaXBfaW5pdChjb2RlYyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpIGNyZWF0ZTogY2hpcCBpbml0IGVycm9yLlxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiYWxpIGNyZWF0ZTogY2hpcCBpbml0IGVycm9yLlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJY29kZWMtPmltYWdlID0ga21hbGxvYyhzaXplb2YoKmNvZGVjLT5pbWFnZSksIEdGUF9LRVJORUwpOwogCWlmICghY29kZWMtPmltYWdlKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CisJCWRldl93YXJuKGNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIGFwbSBidWZmZXJcbiIpOwogI2VuZGlmCiAKIAlzbmRfYWxpX2VuYWJsZV9hZGRyZXNzX2ludGVycnVwdChjb2RlYyk7CiAJY29kZWMtPmh3X2luaXRpYWxpemVkID0gMTsKIAogCSpyX2FsaSA9IGNvZGVjOwotCXNuZF9hbGlfcHJpbnRrKCJjcmVhdGVkLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjcmVhdGVkLlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNTEsOSArMjIzNyw5IEBACiAJc3RydWN0IHNuZF9hbGkgKmNvZGVjOwogCWludCBlcnI7CiAKLQlzbmRfYWxpX3ByaW50aygicHJvYmUgLi4uXG4iKTsKKwlkZXZfZGJnKCZwY2ktPmRldiwgInByb2JlIC4uLlxuIik7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjI2MiwxMiArMjI0OCwxMiBAQAogCQlnb3RvIGVycm9yOwogCWNhcmQtPnByaXZhdGVfZGF0YSA9IGNvZGVjOwogCi0Jc25kX2FsaV9wcmludGsoIm1peGVyIGJ1aWxkaW5nIC4uLlxuIik7CisJZGV2X2RiZygmcGNpLT5kZXYsICJtaXhlciBidWlsZGluZyAuLi5cbiIpOwogCWVyciA9IHNuZF9hbGlfbWl4ZXIoY29kZWMpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwogCQotCXNuZF9hbGlfcHJpbnRrKCJwY20gYnVpbGRpbmcgLi4uXG4iKTsKKwlkZXZfZGJnKCZwY2ktPmRldiwgInBjbSBidWlsZGluZyAuLi5cbiIpOwogCWVyciA9IHNuZF9hbGlfYnVpbGRfcGNtcyhjb2RlYyk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CkBAIC0yMjgwLDcgKzIyNjYsNyBAQAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVpIiwKIAkJY2FyZC0+c2hvcnRuYW1lLCBjb2RlYy0+cG9ydCwgY29kZWMtPmlycSk7CiAKLQlzbmRfYWxpX3ByaW50aygicmVnaXN0ZXIgY2FyZC5cbiIpOworCWRldl9kYmcoJnBjaS0+ZGV2LCAicmVnaXN0ZXIgY2FyZC5cbiIpOwogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsczMwMC5jIGIvc291bmQvcGNpL2FsczMwMC5jCmluZGV4IDU5MWVmYjYuLmNjOWExNWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hbHMzMDAuYworKysgYi9zb3VuZC9wY2kvYWxzMzAwLmMKQEAgLTg3LDE5ICs4Nyw4IEBACiAjZGVmaW5lIFBMQVlCQUNLX0JMT0NLX0NPVU5URVIJMHg5QQogI2RlZmluZSBSRUNPUkRfQkxPQ0tfQ09VTlRFUgkweDlCCiAKLSNkZWZpbmUgREVCVUdfQ0FMTFMJMAogI2RlZmluZSBERUJVR19QTEFZX1JFQwkwCiAKLSNpZiBERUJVR19DQUxMUwotI2RlZmluZSBzbmRfYWxzMzAwX2RiZ2NhbGxzKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCkgcHJpbnRrKEtFUk5fRVJSICItLT4gJXNcbiIsIF9fZnVuY19fKQotI2RlZmluZSBzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpIHByaW50ayhLRVJOX0VSUiAiPC0tICVzXG4iLCBfX2Z1bmNfXykKLSNlbHNlCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbHMoZm9ybWF0LCBhcmdzLi4uKQotI2RlZmluZSBzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpCi0jZGVmaW5lIHNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCkKLSNlbmRpZgotCiAjaWYgREVCVUdfUExBWV9SRUMKICNkZWZpbmUgc25kX2FsczMwMF9kYmdwbGF5KGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIGZvcm1hdCwgIyNhcmdzKQogI2Vsc2UKQEAgLTE3Nyw3ICsxNjYsNiBAQAogc3RhdGljIHZvaWQgc25kX2FsczMwMF9zZXRfaXJxX2ZsYWcoc3RydWN0IHNuZF9hbHMzMDAgKmNoaXAsIGludCBjbWQpCiB7CiAJdTMyIHRtcCA9IHNuZF9hbHMzMDBfZ2NyX3JlYWQoY2hpcC0+cG9ydCwgTUlTQ19DT05UUk9MKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCiAJLyogYm9vbGVhbiBYT1IgY2hlY2ssIHNpbmNlIG9sZCB2cy4gbmV3IGhhcmR3YXJlIGhhdmUKIAkgICBkaXJlY3RseSByZXZlcnNlZCBiaXQgc2V0dGluZyBmb3IgRU5BQkxFIGFuZCBESVNBQkxFLgpAQCAtMTg4LDE5ICsxNzYsMTYgQEAKIAllbHNlCiAJCXRtcCAmPSB+SVJRX1NFVF9CSVQ7CiAJc25kX2FsczMwMF9nY3Jfd3JpdGUoY2hpcC0+cG9ydCwgTUlTQ19DT05UUk9MLCB0bXApOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2FsczMwMF9mcmVlKHN0cnVjdCBzbmRfYWxzMzAwICpjaGlwKQogewotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJc25kX2FsczMwMF9zZXRfaXJxX2ZsYWcoY2hpcCwgSVJRX0RJU0FCTEUpOwogCWlmIChjaGlwLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CiAJa2ZyZWUoY2hpcCk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjgwLDkgKzI2NSw3IEBACiAKIHN0YXRpYyB2b2lkIHNuZF9hbHMzMDBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCiB7Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2FsczMwMF9hYzk3X3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LApAQCAtMzMwLDE0ICszMTMsMTIgQEAKIAkJLnJlYWQgPSBzbmRfYWxzMzAwX2FjOTdfcmVhZCwKIAl9OwogCi0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjaGlwLT5jYXJkLCAwLCAmb3BzLCBOVUxMLCAmYnVzKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOwogCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIHNuZF9hYzk3X21peGVyKGJ1cywgJmFjOTcsICZjaGlwLT5hYzk3KTsKIH0KIApAQCAtMzk1LDEzICszNzYsMTEgQEAKIAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJcnVudGltZS0+aHcgPSBzbmRfYWxzMzAwX3BsYXliYWNrX2h3OwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGRhdGE7CiAJZGF0YS0+Y29udHJvbF9yZWdpc3RlciA9IFBMQVlCQUNLX0NPTlRST0w7CiAJZGF0YS0+YmxvY2tfY291bnRlcl9yZWdpc3RlciA9IFBMQVlCQUNLX0JMT0NLX0NPVU5URVI7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDExLDExICszOTAsOSBAQAogCXN0cnVjdCBzbmRfYWxzMzAwX3N1YnN0cmVhbV9kYXRhICpkYXRhOwogCiAJZGF0YSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJa2ZyZWUoZGF0YSk7CiAJY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKIAlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDI4LDEzICs0MDUsMTEgQEAKIAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF9hbHMzMDBfY2FwdHVyZV9odzsKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBkYXRhOwogCWRhdGEtPmNvbnRyb2xfcmVnaXN0ZXIgPSBSRUNPUkRfQ09OVFJPTDsKIAlkYXRhLT5ibG9ja19jb3VudGVyX3JlZ2lzdGVyID0gUkVDT1JEX0JMT0NLX0NPVU5URVI7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ0LDExICs0MTksOSBAQAogCXN0cnVjdCBzbmRfYWxzMzAwX3N1YnN0cmVhbV9kYXRhICpkYXRhOwogCiAJZGF0YSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJa2ZyZWUoZGF0YSk7CiAJY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBOVUxMOwogCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC00NzIsNyArNDQ1LDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBwZXJpb2RfYnl0ZXMgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKIAl1bnNpZ25lZCBzaG9ydCBidWZmZXJfYnl0ZXMgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKIAkKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAl0bXAgPSBzbmRfYWxzMzAwX2djcl9yZWFkKGNoaXAtPnBvcnQsIFBMQVlCQUNLX0NPTlRST0wpOwogCXRtcCAmPSB+VFJBTlNGRVJfU1RBUlQ7CkBAIC00OTEsNyArNDYzLDYgQEAKIAlzbmRfYWxzMzAwX2djcl93cml0ZShjaGlwLT5wb3J0LCBQTEFZQkFDS19FTkQsCiAJCQkJCXJ1bnRpbWUtPmRtYV9hZGRyICsgYnVmZmVyX2J5dGVzIC0gMSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTAzLDcgKzQ3NCw2IEBACiAJdW5zaWduZWQgc2hvcnQgcGVyaW9kX2J5dGVzID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CiAJdW5zaWduZWQgc2hvcnQgYnVmZmVyX2J5dGVzID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CiAKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAl0bXAgPSBzbmRfYWxzMzAwX2djcl9yZWFkKGNoaXAtPnBvcnQsIFJFQ09SRF9DT05UUk9MKTsKIAl0bXAgJj0gflRSQU5TRkVSX1NUQVJUOwpAQCAtNTIyLDcgKzQ5Miw2IEBACiAJc25kX2FsczMwMF9nY3Jfd3JpdGUoY2hpcC0+cG9ydCwgUkVDT1JEX0VORCwKIAkJCQkJcnVudGltZS0+ZG1hX2FkZHIgKyBidWZmZXJfYnl0ZXMgLSAxKTsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlzbmRfYWxzMzAwX2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC01MzcsNyArNTA2LDYgQEAKIAlkYXRhID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJcmVnID0gZGF0YS0+Y29udHJvbF9yZWdpc3RlcjsKIAotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgpAQCAtNTY4LDcgKzUzNiw2IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01ODIsNyArNTQ5LDYgQEAKIAlkYXRhID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJcGVyaW9kX2J5dGVzID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CiAJCi0Jc25kX2FsczMwMF9kYmdjYWxsZW50ZXIoKTsKIAlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAljdXJyZW50X3B0ciA9ICh1MTYpIHNuZF9hbHMzMDBfZ2NyX3JlYWQoY2hpcC0+cG9ydCwKIAkJCQkJZGF0YS0+YmxvY2tfY291bnRlcl9yZWdpc3RlcikgKyA0OwpAQCAtNTk1LDcgKzU2MSw2IEBACiAJaWYgKGRhdGEtPnBlcmlvZF9mbGlwZmxvcCA9PSAwKQogCQljdXJyZW50X3B0ciArPSBwZXJpb2RfYnl0ZXM7CiAJc25kX2FsczMwMF9kYmdwbGF5KCJQb2ludGVyIChieXRlcyk6ICVkXG4iLCBjdXJyZW50X3B0cik7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgY3VycmVudF9wdHIpOwogfQogCkBAIC02MjYsNyArNTkxLDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CiAKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBTFMzMDAiLCAwLCAxLCAxLCAmcGNtKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTY0Myw3ICs2MDcsNiBAQAogCS8qIHByZS1hbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKi8KIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAogCXNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwgNjQqMTAyNCwgNjQqMTAyNCk7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjUyLDcgKzYxNSw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdG1wOwogCQotCXNuZF9hbHMzMDBfZGJnY2FsbGVudGVyKCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJY2hpcC0+cmV2aXNpb24gPSAoc25kX2FsczMwMF9nY3JfcmVhZChjaGlwLT5wb3J0LCBNSVNDX0NPTlRST0wpID4+IDE2KQogCQkJCQkJCQkmIDB4MDAwMDAwMEY7CkBAIC02NzksNyArNjQxLDYgQEAKIAlzbmRfYWxzMzAwX2djcl93cml0ZShjaGlwLT5wb3J0LCBQTEFZQkFDS19DT05UUk9MLAogCQkJdG1wICYgflRSQU5TRkVSX1NUQVJUKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2FsczMwMF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLApAQCAtNjk1LDEzICs2NTYsMTIgQEAKIAl9OwogCSpyY2hpcCA9IE5VTEw7CiAKLQlzbmRfYWxzMzAwX2RiZ2NhbGxlbnRlcigpOwogCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDAgfHwKIAkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXJyb3Igc2V0dGluZyAyOGJpdCBETUEgbWFza1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3Igc2V0dGluZyAyOGJpdCBETUEgbWFza1xuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTczMyw3ICs2OTMsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBpcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9hbHMzMDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC03NDQsMTMgKzcwNCwxMyBAQAogCiAJZXJyID0gc25kX2FsczMwMF9hYzk3KGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgY3JlYXRlIGFjOTdcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNvdWxkIG5vdCBjcmVhdGUgYWM5N1xuIik7CiAJCXNuZF9hbHMzMDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAlpZiAoKGVyciA9IHNuZF9hbHMzMDBfbmV3X3BjbShjaGlwKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgY3JlYXRlIFBDTVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGNyZWF0ZSBQQ01cbiIpOwogCQlzbmRfYWxzMzAwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNzYxLDEwICs3MjEsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IGNoaXA7Ci0Jc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzk0LDggKzc1MSw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHMzMDA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTgyOSw3ICs3ODUsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsczQwMDAuYyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKaW5kZXggZmZjODIxYi4uYjc1MWMzOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczQwMDAuYworKysgYi9zb3VuZC9wY2kvYWxzNDAwMC5jCkBAIC01NzgsNyArNTc4LDcgQEAKIAkJc25kX2FsczRrX2lvYmFzZV9yZWFkYihjaGlwLT5hbHRfcG9ydCwKIAkJCQkJQUxTNEtfSU9CXzE2X0FDS19GT1JfQ1IxRSk7CiAKLQkvKiBwcmludGsoS0VSTl9JTkZPICJhbHM0MDAwOiBpcnEgMHglMDR4IDB4JTA0eFxuIiwKKwkvKiBkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImFsczQwMDA6IGlycSAweCUwNHggMHglMDR4XG4iLAogCQkJCQkgcGNpX2lycXN0YXR1cywgc2JfaXJxc3RhdHVzKTsgKi8KIAogCS8qIG9ubHkgYWNrIHRoZSB0aGluZ3Mgd2UgYWN0dWFsbHkgaGFuZGxlZCBhYm92ZSAqLwpAQCAtNzkxLDEzICs3OTEsMTMgQEAKIAl9CiAKIAlpZiAoIXIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxzNDAwMDogY2Fubm90IHJlc2VydmUgam95c3RpY2sgcG9ydHNcbiIpOworCQlkZXZfd2FybigmYWNhcmQtPnBjaS0+ZGV2LCAiY2Fubm90IHJlc2VydmUgam95c3RpY2sgcG9ydHNcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWFjYXJkLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoJmFjYXJkLT5wY2ktPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtODczLDcgKzg3Myw3IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyNCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI0KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTg4OCw5ICs4ODgsOSBAQAogCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIFBDSV9DT01NQU5ELCB3b3JkIHwgUENJX0NPTU1BTkRfSU8pOwogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAJCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAKLQkJCSAgICAgIHNpemVvZigqYWNhcmQpIC8qIHByaXZhdGVfZGF0YTogYWNhcmQgKi8sCi0JCQkgICAgICAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YoKmFjYXJkKSAvKiBwcml2YXRlX2RhdGE6IGFjYXJkICovLAorCQkJICAgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CkBAIC05MjAsNyArOTIwLDYgQEAKIAogCWNoaXAtPnBjaSA9IHBjaTsKIAljaGlwLT5hbHRfcG9ydCA9IGlvYmFzZTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAKIAlzbmRfYWxzNDAwMF9jb25maWd1cmUoY2hpcCk7CiAKQEAgLTkzNCw3ICs5MzMsNyBAQAogCQkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKIAkJCQkJTVBVNDAxX0lORk9fSVJRX0hPT0ssCiAJCQkJCS0xLCAmY2hpcC0+cm1pZGkpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCisJCWRldl9lcnIoJnBjaS0+ZGV2LCAibm8gTVBVLTQwMSBkZXZpY2UgYXQgMHglbHg/XG4iLAogCQkJCWlvYmFzZSArIEFMUzRLX0lPQl8zMF9NSURJX0RBVEEpOwogCQlnb3RvIG91dF9lcnI7CiAJfQpAQCAtOTU1LDcgKzk1NCw3IEBACiAJCQkJaW9iYXNlICsgQUxTNEtfSU9CXzEwX0FETElCX0FERFIwLAogCQkJCWlvYmFzZSArIEFMUzRLX0lPQl8xMl9BRExJQl9BRERSMiwKIAkJCSAgICBPUEwzX0hXX0FVVE8sIDEsICZvcGwzKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBubyBPUEwgZGV2aWNlIGF0IDB4JWx4LTB4JWx4P1xuIiwKKwkJZGV2X2VycigmcGNpLT5kZXYsICJubyBPUEwgZGV2aWNlIGF0IDB4JWx4LTB4JWx4P1xuIiwKIAkJCSAgIGlvYmFzZSArIEFMUzRLX0lPQl8xMF9BRExJQl9BRERSMCwKIAkJCSAgIGlvYmFzZSArIEFMUzRLX0lPQl8xMl9BRExJQl9BRERSMik7CiAJfSBlbHNlIHsKQEAgLTEwMTUsOCArMTAxNCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwppbmRleCA1ZjJhY2QzLi45MDFjOTQ5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKQEAgLTEyNTMsMTEgKzEyNTMsMTIgQEAKIAkJCW51bV9vdXRzdHJlYW1zLAludW1faW5zdHJlYW1zLCAmcGNtKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwogCS8qIHBvaW50ZXIgdG8gb3BzIHN0cnVjdCBpcyBzdG9yZWQsIGRvbnQgY2hhbmdlIG9wcyBhZnRlcndhcmRzISAqLwotCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAotCQkJCSZzbmRfY2FyZF9hc2locGlfcGxheWJhY2tfbW1hcF9vcHMpOwotCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCi0JCQkJJnNuZF9jYXJkX2FzaWhwaV9jYXB0dXJlX21tYXBfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJJnNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19tbWFwX29wcyk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAorCQkJJnNuZF9jYXJkX2FzaWhwaV9jYXB0dXJlX21tYXBfb3BzKTsKIAogCXBjbS0+cHJpdmF0ZV9kYXRhID0gYXNpaHBpOwogCXBjbS0+aW5mb19mbGFncyA9IDA7CkBAIC0yODI3LDE3ICsyODI4LDEzIEBACiAJaHBpID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwogCWFkYXB0ZXJfaW5kZXggPSBocGktPmFkYXB0ZXItPmluZGV4OwogCS8qIGZpcnN0IHRyeSB0byBnaXZlIHRoZSBjYXJkIHRoZSBzYW1lIGluZGV4IGFzIGl0cyBoYXJkd2FyZSBpbmRleCAqLwotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShhZGFwdGVyX2luZGV4LAotCQkJICAgICAgaWRbYWRhcHRlcl9pbmRleF0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9hc2locGkpLAotCQkJICAgICAgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpX2Rldi0+ZGV2LCBhZGFwdGVyX2luZGV4LCBpZFthZGFwdGVyX2luZGV4XSwKKwkJCSAgIFRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FzaWhwaSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQkvKiBpZiB0aGF0IGZhaWxzLCB0cnkgdGhlIGRlZmF1bHQgaW5kZXg9PW5leHQgYXZhaWxhYmxlICovCi0JCWVyciA9Ci0JCSAgICBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwKLQkJCQkgICAgVEhJU19NT0RVTEUsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NhcmRfYXNpaHBpKSwKLQkJCQkgICAgJmNhcmQpOworCQllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaV9kZXYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwKKwkJCQkgICBUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBzbmRfY2FyZF9hc2locGkpLAorCQkJCSAgICZjYXJkKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtMjg0NSw4ICsyODQyLDYgQEAKIAkJCWFkYXB0ZXJfaW5kZXgsIGNhcmQtPm51bWJlcik7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpX2Rldi0+ZGV2KTsKLQogCWFzaWhwaSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlhc2locGktPmNhcmQgPSBjYXJkOwogCWFzaWhwaS0+cGNpID0gcGNpX2RldjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHAuYyBiL3NvdW5kL3BjaS9hdGlpeHAuYwppbmRleCBmNmRlYzNlLi5hZTA3YjQ5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cC5jCkBAIC00MzIsNyArNDMyLDcgQEAKIAogCXdoaWxlIChhdGlpeHBfcmVhZChjaGlwLCBQSFlTX09VVF9BRERSKSAmIEFUSV9SRUdfUEhZU19PVVRfQUREUl9FTikgewogCQlpZiAoISB0aW1lb3V0LS0pIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhdGlpeHA6IGNvZGVjIGFjcXVpcmUgdGltZW91dFxuIik7CisJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyBhY3F1aXJlIHRpbWVvdXRcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQl1ZGVsYXkoMSk7CkBAIC00NjMsNyArNDYzLDcgQEAKIAl9IHdoaWxlICgtLXRpbWVvdXQpOwogCS8qIHRpbWUgb3V0IG1heSBoYXBwZW4gZHVyaW5nIHJlc2V0ICovCiAJaWYgKHJlZyA8IDB4N2MpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhdGlpeHA6IGNvZGVjIHJlYWQgdGltZW91dCAocmVnICV4KVxuIiwgcmVnKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWMgcmVhZCB0aW1lb3V0IChyZWcgJXgpXG4iLCByZWcpOwogCXJldHVybiAweGZmZmY7CiB9CiAKQEAgLTUyMyw3ICs1MjMsNyBAQAogCQltZGVsYXkoMSk7CiAJCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9BQ19SRVNFVCwgQVRJX1JFR19DTURfQUNfUkVTRVQpOwogCQlpZiAoIS0tdGltZW91dCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBjb2RlYyByZXNldCB0aW1lb3V0XG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWMgcmVzZXQgdGltZW91dFxuIik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTU2Nyw5ICs1NjcsOCBAQAogCiAJcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgYXRpaXhwX3F1aXJrcyk7CiAJaWYgKHEpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPCi0JCQkgICAgIkF0aWl4cCBxdWlyayBmb3IgJXMuICBGb3JjaW5nIGNvZGVjICVkXG4iLAotCQkJICAgIHNuZF9wY2lfcXVpcmtfbmFtZShxKSwgcS0+dmFsdWUpOworCQlkZXZfZGJnKCZwY2ktPmRldiwgImF0aWl4cCBxdWlyayBmb3IgJXMuICBGb3JjaW5nIGNvZGVjICVkXG4iLAorCQkJc25kX3BjaV9xdWlya19uYW1lKHEpLCBxLT52YWx1ZSk7CiAJCXJldHVybiBxLT52YWx1ZTsKIAl9CiAJLyogdGhpcyBoYXJkd2FyZSBkb2Vzbid0IG5lZWQgd29ya2Fyb3VuZHMuICBQcm9iZSBmb3IgY29kZWMgKi8KQEAgLTYwMCw3ICs1OTksNyBAQAogCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsIDApOyAvKiBkaXNhYmxlIGlycXMgKi8KIAogCWlmICgoY2hpcC0+Y29kZWNfbm90X3JlYWR5X2JpdHMgJiBBTExfQ09ERUNfTk9UX1JFQURZKSA9PSBBTExfQ09ERUNfTk9UX1JFQURZKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImF0aWl4cDogbm8gY29kZWMgZGV0ZWN0ZWQhXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJubyBjb2RlYyBkZXRlY3RlZCFcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTY3Niw3ICs2NzUsNyBAQAogCQkJY29udGludWU7CiAJCXJldHVybiBieXRlc190b19mcmFtZXMocnVudGltZSwgY3VycHRyKTsKIAl9Ci0Jc25kX3ByaW50ZCgiYXRpaXhwOiBpbnZhbGlkIERNQSBwb2ludGVyIHJlYWQgMHgleCAoYnVmPSV4KVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludmFsaWQgRE1BIHBvaW50ZXIgcmVhZCAweCV4IChidWY9JXgpXG4iLAogCQkgICByZWFkbChjaGlwLT5yZW1hcF9hZGRyICsgZG1hLT5vcHMtPmR0X2N1ciksIGRtYS0+YnVmX2FkZHIpOwogCXJldHVybiAwOwogfQpAQCAtNjg4LDcgKzY4Nyw3IEBACiB7CiAJaWYgKCEgZG1hLT5zdWJzdHJlYW0gfHwgISBkbWEtPnJ1bm5pbmcpCiAJCXJldHVybjsKLQlzbmRfcHJpbnRkZCgiYXRpaXhwOiBYUlVOIGRldGVjdGVkIChETUEgJWQpXG4iLCBkbWEtPm9wcy0+dHlwZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJYUlVOIGRldGVjdGVkIChETUEgJWQpXG4iLCBkbWEtPm9wcy0+dHlwZSk7CiAJc25kX3BjbV9zdHJlYW1fbG9jayhkbWEtPnN1YnN0cmVhbSk7CiAJc25kX3BjbV9zdG9wKGRtYS0+c3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfWFJVTik7CiAJc25kX3BjbV9zdHJlYW1fdW5sb2NrKGRtYS0+c3Vic3RyZWFtKTsKQEAgLTE0NTMsMTQgKzE0NTIsMTUgQEAKIAkJCWFjOTcuc2NhcHMgfD0gQUM5N19TQ0FQX05PX1NQRElGOwogCQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY2hpcC0+YWM5N1tpXSkpIDwgMCkgewogCQkJY2hpcC0+YWM5N1tpXSA9IE5VTEw7IC8qIHRvIGJlIHN1cmUgKi8KLQkJCXNuZF9wcmludGRkKCJhdGlpeHA6IGNvZGVjICVkIG5vdCBhdmFpbGFibGUgZm9yIGF1ZGlvXG4iLCBpKTsKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb2RlYyAlZCBub3QgYXZhaWxhYmxlIGZvciBhdWRpb1xuIiwgaSk7CiAJCQljb250aW51ZTsKIAkJfQogCQljb2RlY19jb3VudCsrOwogCX0KIAogCWlmICghIGNvZGVjX2NvdW50KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImF0aWl4cDogbm8gY29kZWMgYXZhaWxhYmxlXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJubyBjb2RlYyBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE1MTEsOCArMTUxMSw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdGlpeHA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE2MzcsMTQgKzE2MzYsMTQgQEAKIAljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJY2hpcC0+cmVtYXBfYWRkciA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDApOwogCWlmIChjaGlwLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOwogCQlzbmRfYXRpaXhwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F0aWl4cF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfYXRpaXhwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTY1Nyw4ICsxNjU2LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcl9jaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NzEsNyArMTY2OCw3IEBACiAJc3RydWN0IGF0aWl4cCAqY2hpcDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwppbmRleCAyODk1NjNlLi5iOWRjOTZjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCkBAIC00MDAsNyArNDAwLDcgQEAKIAogCXdoaWxlIChhdGlpeHBfcmVhZChjaGlwLCBQSFlTX09VVF9BRERSKSAmIEFUSV9SRUdfUEhZU19PVVRfQUREUl9FTikgewogCQlpZiAoISB0aW1lb3V0LS0pIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhdGlpeHAtbW9kZW06IGNvZGVjIGFjcXVpcmUgdGltZW91dFxuIik7CisJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyBhY3F1aXJlIHRpbWVvdXRcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQl1ZGVsYXkoMSk7CkBAIC00MzMsNyArNDMzLDcgQEAKIAl9IHdoaWxlICgtLXRpbWVvdXQpOwogCS8qIHRpbWUgb3V0IG1heSBoYXBwZW4gZHVyaW5nIHJlc2V0ICovCiAJaWYgKHJlZyA8IDB4N2MpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhdGlpeHAtbW9kZW06IGNvZGVjIHJlYWQgdGltZW91dCAocmVnICV4KVxuIiwgcmVnKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWMgcmVhZCB0aW1lb3V0IChyZWcgJXgpXG4iLCByZWcpOwogCXJldHVybiAweGZmZmY7CiB9CiAKQEAgLTQ5OSw3ICs0OTksNyBAQAogCQltc2xlZXAoMSk7CiAJCWF0aWl4cF91cGRhdGUoY2hpcCwgQ01ELCBBVElfUkVHX0NNRF9BQ19SRVNFVCwgQVRJX1JFR19DTURfQUNfUkVTRVQpOwogCQlpZiAoIS0tdGltZW91dCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwLW1vZGVtOiBjb2RlYyByZXNldCB0aW1lb3V0XG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWMgcmVzZXQgdGltZW91dFxuIik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTU1Myw3ICs1NTMsNyBAQAogCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsIDApOyAvKiBkaXNhYmxlIGlycXMgKi8KIAogCWlmICgoY2hpcC0+Y29kZWNfbm90X3JlYWR5X2JpdHMgJiBBTExfQ09ERUNfTk9UX1JFQURZKSA9PSBBTExfQ09ERUNfTk9UX1JFQURZKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImF0aWl4cC1tb2RlbTogbm8gY29kZWMgZGV0ZWN0ZWQhXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJubyBjb2RlYyBkZXRlY3RlZCFcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTYyNCw3ICs2MjQsNyBAQAogCQkJY29udGludWU7CiAJCXJldHVybiBieXRlc190b19mcmFtZXMocnVudGltZSwgY3VycHRyKTsKIAl9Ci0Jc25kX3ByaW50ZCgiYXRpaXhwLW1vZGVtOiBpbnZhbGlkIERNQSBwb2ludGVyIHJlYWQgMHgleCAoYnVmPSV4KVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludmFsaWQgRE1BIHBvaW50ZXIgcmVhZCAweCV4IChidWY9JXgpXG4iLAogCQkgICByZWFkbChjaGlwLT5yZW1hcF9hZGRyICsgZG1hLT5vcHMtPmR0X2N1ciksIGRtYS0+YnVmX2FkZHIpOwogCXJldHVybiAwOwogfQpAQCAtNjM3LDcgKzYzNyw3IEBACiB7CiAJaWYgKCEgZG1hLT5zdWJzdHJlYW0gfHwgISBkbWEtPnJ1bm5pbmcpCiAJCXJldHVybjsKLQlzbmRfcHJpbnRkZCgiYXRpaXhwLW1vZGVtOiBYUlVOIGRldGVjdGVkIChETUEgJWQpXG4iLCBkbWEtPm9wcy0+dHlwZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJYUlVOIGRldGVjdGVkIChETUEgJWQpXG4iLCBkbWEtPm9wcy0+dHlwZSk7CiAJc25kX3BjbV9zdHJlYW1fbG9jayhkbWEtPnN1YnN0cmVhbSk7CiAJc25kX3BjbV9zdG9wKGRtYS0+c3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfWFJVTik7CiAJc25kX3BjbV9zdHJlYW1fdW5sb2NrKGRtYS0+c3Vic3RyZWFtKTsKQEAgLTEwOTgsMTQgKzEwOTgsMTUgQEAKIAkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPIHwgQUM5N19TQ0FQX1BPV0VSX1NBVkU7CiAJCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZjaGlwLT5hYzk3W2ldKSkgPCAwKSB7CiAJCQljaGlwLT5hYzk3W2ldID0gTlVMTDsgLyogdG8gYmUgc3VyZSAqLwotCQkJc25kX3ByaW50ZGQoImF0aWl4cC1tb2RlbTogY29kZWMgJWQgbm90IGF2YWlsYWJsZSBmb3IgbW9kZW1cbiIsIGkpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjICVkIG5vdCBhdmFpbGFibGUgZm9yIG1vZGVtXG4iLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWNvZGVjX2NvdW50Kys7CiAJfQogCiAJaWYgKCEgY29kZWNfY291bnQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXRpaXhwLW1vZGVtOiBubyBjb2RlYyBhdmFpbGFibGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5vIGNvZGVjIGF2YWlsYWJsZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTE1MCw4ICsxMTUxLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImF0aWl4cC1tb2RlbTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTI2MiwxNCArMTI2MiwxNCBAQAogCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5yZW1hcF9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMCk7CiAJaWYgKGNoaXAtPnJlbWFwX2FkZHIgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXRpaXhwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9hdGlpeHBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xMjgyLDggKzEyODIsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2NoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpAQCAtMTI5Niw3ICsxMjk0LDcgQEAKIAlzdHJ1Y3QgYXRpaXhwX21vZGVtICpjaGlwOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMKaW5kZXggNzA1OWRkNi4uYWZiMWI0NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCkBAIC0yMTEsOCArMjExLDYgQEAKIAkJZ290byBhbGxvY19vdXQ7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAogCXJldHVybiAwOwpAQCAtMjUwLDcgKzI0OCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAkvLyAoMikKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jIGIvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCmluZGV4IDI5MjUyMjAuLjEyMGQwZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYworKysgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCS8qIGNoZWNrIFBDSSBhdmFpbGFiaWxpdHkgKDMyYml0IERNQSkgKi8KIAlpZiAoKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDApIHx8CiAJICAgIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXcyOiBJbXBvc3NpYmxlIHRvIHNldCAzMmJpdCBtYXNrIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiSW1wb3NzaWJsZSB0byBzZXQgMzJiaXQgbWFzayBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0yOTAsNyArMjkwLDcgQEAKIAkJCQlwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkpOwogCiAJaWYgKGNoaXAtPmlvYmFzZV92aXJ0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24iKTsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2kpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJa2ZyZWUoY2hpcCk7CkBAIC0zMDIsNyArMzAyLDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F3Ml9zYWE3MTQ2X2ludGVycnVwdCwKIAkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IENhbm5vdCBncmFiIGlycSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNhbm5vdCBncmFiIGlycSAlZFxuIiwgcGNpLT5pcnEpOwogCiAJCWlvdW5tYXAoY2hpcC0+aW9iYXNlX3ZpcnQpOwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CkBAIC0zMjIsMTIgKzMyMiwxMCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAkqcmNoaXAgPSBjaGlwOwogCi0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAgICAiQXVkaW93ZXJrIDIgc291bmQgY2FyZCAoc2FhNzE0NiBjaGlwc2V0KSBkZXRlY3RlZCBhbmQgIgotCSAgICAgICAibWFuYWdlZFxuIik7CisJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkgIkF1ZGlvd2VyayAyIHNvdW5kIGNhcmQgKHNhYTcxNDYgY2hpcHNldCkgZGV0ZWN0ZWQgYW5kIG1hbmFnZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0zNDksNyArMzQ3LDggQEAKIAl9CiAKIAkvKiAoMikgQ3JlYXRlIGNhcmQgaW5zdGFuY2UgKi8KLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzk5LDcgKzM5OCw3IEBACiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAotCXNuZF9wcmludGRkKEtFUk5fREVCVUcgImF3MjogUGxheWJhY2tfb3BlblxuIik7CisJZGV2X2RiZyhzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCAiUGxheWJhY2tfb3BlblxuIik7CiAJcnVudGltZS0+aHcgPSBzbmRfYXcyX3BsYXliYWNrX2h3OwogCXJldHVybiAwOwogfQpAQCAtNDE1LDcgKzQxNCw3IEBACiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAotCXNuZF9wcmludGRkKEtFUk5fREVCVUcgImF3MjogQ2FwdHVyZV9vcGVuXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICJDYXB0dXJlX29wZW5cbiIpOwogCXJ1bnRpbWUtPmh3ID0gc25kX2F3Ml9jYXB0dXJlX2h3OwogCXJldHVybiAwOwogfQpAQCAtNjAzLDcgKzYwMiw3IEBACiAJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkF1ZGlvd2VyazIgYW5hbG9nIHBsYXliYWNrIiwgMCwgMSwgMCwKIAkJCSAgJnBjbV9wbGF5YmFja19hbmEpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXcyOiBzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX3BjbV9uZXcgZXJyb3IgKDB4JVgpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjMzLDE0ICs2MzIsMTUgQEAKIAkJCQkJCSAgICAoY2hpcC0+cGNpKSwKIAkJCQkJCSAgICA2NCAqIDEwMjQsIDY0ICogMTAyNCk7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgIgotCQkgICAgICAgImVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkic25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCBlcnJvciAoMHglWClcbiIsCisJCQllcnIpOwogCiAJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkF1ZGlvd2VyazIgZGlnaXRhbCBwbGF5YmFjayIsIDEsIDEsIDAsCiAJCQkgICZwY21fcGxheWJhY2tfbnVtKTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXcyOiBzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX3BjbV9uZXcgZXJyb3IgKDB4JVgpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAkvKiBDcmVhdGlvbiBvayAqLwpAQCAtNjY5LDE3ICs2NjksMTUgQEAKIAkJCQkJCSAgICAoY2hpcC0+cGNpKSwKIAkJCQkJCSAgICA2NCAqIDEwMjQsIDY0ICogMTAyNCk7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYXcyOiBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsIGVycm9yICIKLQkJICAgICAgICIoMHglWClcbiIsIGVycik7Ci0KLQorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsIGVycm9yICgweCVYKVxuIiwKKwkJCWVycik7CiAKIAllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQXVkaW93ZXJrMiBjYXB0dXJlIiwgMiwgMCwgMSwKIAkJCSAgJnBjbV9jYXB0dXJlKTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXcyOiBzbmRfcGNtX25ldyBlcnJvciAoMHglWClcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX3BjbV9uZXcgZXJyb3IgKDB4JVgpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNzA5LDE1ICs3MDcsMTUgQEAKIAkJCQkJCSAgICAoY2hpcC0+cGNpKSwKIAkJCQkJCSAgICA2NCAqIDEwMjQsIDY0ICogMTAyNCk7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYXcyOiBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsIGVycm9yICIKLQkJICAgICAgICIoMHglWClcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwgZXJyb3IgKDB4JVgpXG4iLAorCQkJZXJyKTsKIAogCiAJLyogQ3JlYXRlIGNvbnRyb2wgKi8KIAllcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJmF3Ml9jb250cm9sLCBjaGlwKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IHNuZF9jdGxfYWRkIGVycm9yICgweCVYKVxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzbmRfY3RsX2FkZCBlcnJvciAoMHglWClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXcyL2F3Mi1zYWE3MTQ2LmMgYi9zb3VuZC9wY2kvYXcyL2F3Mi1zYWE3MTQ2LmMKaW5kZXggNDQzOTYzNi4uNmQyNGU5NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F3Mi9hdzItc2FhNzE0Ni5jCisrKyBiL3NvdW5kL3BjaS9hdzIvYXcyLXNhYTcxNDYuYwpAQCAtMjA0LDggKzIwNCw3IEBACiAJCS8qIERlZmluZSB1cHBlciBsaW1pdCBmb3IgRE1BIGFjY2VzcyAqLwogCQlXUklURVJFRyhkbWFfYWRkciArIGJ1ZmZlcl9zaXplLCBQcm90QTFfb3V0KTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJhdzI6IHNuZF9hdzJfc2FhNzE0Nl9wY21faW5pdF9wbGF5YmFjazogIgorCQlwcl9lcnIoImF3Mjogc25kX2F3Ml9zYWE3MTQ2X3BjbV9pbml0X3BsYXliYWNrOiAiCiAJCSAgICAgICAiU3Vic3RyZWFtIG51bWJlciBpcyBub3QgMCBvciAxIC0+IG5vdCBtYW5hZ2VkXG4iKTsKIAl9CiB9CkBAIC0yNTEsOCArMjUwLDcgQEAKIAkJLyogRGVmaW5lIHVwcGVyIGxpbWl0IGZvciBETUEgYWNjZXNzICAqLwogCQlXUklURVJFRyhkbWFfYWRkciArIGJ1ZmZlcl9zaXplLCBQcm90QTFfaW4pOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImF3Mjogc25kX2F3Ml9zYWE3MTQ2X3BjbV9pbml0X2NhcHR1cmU6ICIKKwkJcHJfZXJyKCJhdzI6IHNuZF9hdzJfc2FhNzE0Nl9wY21faW5pdF9jYXB0dXJlOiAiCiAJCSAgICAgICAiU3Vic3RyZWFtIG51bWJlciBpcyBub3QgMCAtPiBub3QgbWFuYWdlZFxuIik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggMWFlZjcxMi4uYzkyMTZjMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguYworKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCkBAIC0yMzgsNjEgKzIzOCw2IEBACiAgICAgMj4vZGV2L251bGwKICovCiAKLSNkZWZpbmUgREVCVUdfTUlTQwkwCi0jZGVmaW5lIERFQlVHX0NBTExTCTAKLSNkZWZpbmUgREVCVUdfTUlYRVIJMAotI2RlZmluZSBERUJVR19DT0RFQwkwCi0jZGVmaW5lIERFQlVHX1RJTUVSCTAKLSNkZWZpbmUgREVCVUdfR0FNRQkwCi0jZGVmaW5lIERFQlVHX1BNCTAKLSNkZWZpbmUgTUlYRVJfVEVTVElORwkwCi0KLSNpZiBERUJVR19NSVNDCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ21pc2MoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKLSNlbHNlCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ21pc2MoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNpZiBERUJVR19DQUxMUwotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxscyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQsICMjYXJncykKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCkgcHJpbnRrKEtFUk5fREVCVUcgIi0tPiAlc1xuIiwgX19mdW5jX18pCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpIHByaW50ayhLRVJOX0RFQlVHICI8LS0gJXNcbiIsIF9fZnVuY19fKQotI2Vsc2UKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnY2FsbHMoZm9ybWF0LCBhcmdzLi4uKQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKQotI2VuZGlmCi0KLSNpZiBERUJVR19NSVhFUgotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdtaXhlcihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnbWl4ZXIoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNpZiBERUJVR19DT0RFQwotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdjb2RlYyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnY29kZWMoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLSNpZiBERUJVR19NSVNDCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ3RpbWVyKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmd0aW1lcihmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX0dBTUUKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnZ2FtZShmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgc25kX2F6ZjMzMjhfZGJnZ2FtZShmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIERFQlVHX1BNCi0jZGVmaW5lIHNuZF9hemYzMzI4X2RiZ3BtKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBzbmRfYXpmMzMyOF9kYmdwbShmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQogc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KIG1vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgQVpGMzMyOCBzb3VuZGNhcmQuIik7CkBAIC00NzUsNiArNDIwLDEyIEBACiAJcmV0dXJuIGluYihjaGlwLT5jdHJsX2lvICsgcmVnKTsKIH0KIAorc3RhdGljIGlubGluZSB1MTYKK3NuZF9hemYzMzI4X2N0cmxfaW53KGNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwgdW5zaWduZWQgcmVnKQoreworCXJldHVybiBpbncoY2hpcC0+Y3RybF9pbyArIHJlZyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogc25kX2F6ZjMzMjhfY3RybF9vdXR3KGNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwgdW5zaWduZWQgcmVnLCB1MTYgdmFsdWUpCiB7CkBAIC01NzgsMTEgKzUyOSwxMiBAQAogI2lmZGVmIEFaRl9VU0VfQUM5N19MQVlFUgogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNuZF9hemYzMzI4X21peGVyX2FjOTdfbWFwX3Vuc3VwcG9ydGVkKHVuc2lnbmVkIHNob3J0IHJlZywgY29uc3QgY2hhciAqbW9kZSkKK3NuZF9hemYzMzI4X21peGVyX2FjOTdfbWFwX3Vuc3VwcG9ydGVkKGNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcmVnLCBjb25zdCBjaGFyICptb2RlKQogewogCS8qIG5lZWQgdG8gYWRkIHNvbWUgbW9yZSBvciBsZXNzIGNsZXZlciBlbXVsYXRpb24/ICovCi0JcHJpbnRrKEtFUk5fV0FSTklORwotCQkiYXp0MzMyODogbWlzc2luZyAlcyBlbXVsYXRpb24gZm9yIEFDOTcgcmVnaXN0ZXIgMHglMDJ4IVxuIiwKKwlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCSJtaXNzaW5nICVzIGVtdWxhdGlvbiBmb3IgQUM5NyByZWdpc3RlciAweCUwMnghXG4iLAogCQltb2RlLCByZWcpOwogfQogCkBAIC03MTcsMTAgKzY2OSw4IEBACiAJdW5zaWduZWQgc2hvcnQgcmVnX3ZhbCA9IDA7CiAJYm9vbCB1bnN1cHBvcnRlZCA9IGZhbHNlOwogCi0Jc25kX2F6ZjMzMjhfZGJnbWl4ZXIoCi0JCSJzbmRfYXpmMzMyOF9taXhlcl9hYzk3X3JlYWQgcmVnX2FjOTcgJXVcbiIsCi0JCQlyZWdfYWM5NwotCSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzbmRfYXpmMzMyOF9taXhlcl9hYzk3X3JlYWQgcmVnX2FjOTcgJXVcbiIsCisJCXJlZ19hYzk3KTsKIAlpZiAocmVnX2F6ZiAmIEFaRl9BQzk3X1JFR19VTlNVUFBPUlRFRCkKIAkJdW5zdXBwb3J0ZWQgPSB0cnVlOwogCWVsc2UgewpAQCAtNzY1LDcgKzcxNSw3IEBACiAJCX0KIAl9CiAJaWYgKHVuc3VwcG9ydGVkKQotCQlzbmRfYXpmMzMyOF9taXhlcl9hYzk3X21hcF91bnN1cHBvcnRlZChyZWdfYWM5NywgInJlYWQiKTsKKwkJc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfdW5zdXBwb3J0ZWQoY2hpcCwgcmVnX2FjOTcsICJyZWFkIik7CiAKIAlyZXR1cm4gcmVnX3ZhbDsKIH0KQEAgLTc3OCwxMCArNzI4LDkgQEAKIAl1bnNpZ25lZCBzaG9ydCByZWdfYXpmID0gc25kX2F6ZjMzMjhfbWl4ZXJfYWM5N19tYXBfcmVnX2lkeChyZWdfYWM5Nyk7CiAJYm9vbCB1bnN1cHBvcnRlZCA9IGZhbHNlOwogCi0Jc25kX2F6ZjMzMjhfZGJnbWl4ZXIoCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSJzbmRfYXpmMzMyOF9taXhlcl9hYzk3X3dyaXRlIHJlZ19hYzk3ICV1IHZhbCAldVxuIiwKLQkJCXJlZ19hYzk3LCB2YWwKLQkpOworCQlyZWdfYWM5NywgdmFsKTsKIAlpZiAocmVnX2F6ZiAmIEFaRl9BQzk3X1JFR19VTlNVUFBPUlRFRCkKIAkJdW5zdXBwb3J0ZWQgPSB0cnVlOwogCWVsc2UgewpAQCAtODE0LDcgKzc2Myw3IEBACiAJCX0KIAl9CiAJaWYgKHVuc3VwcG9ydGVkKQotCQlzbmRfYXpmMzMyOF9taXhlcl9hYzk3X21hcF91bnN1cHBvcnRlZChyZWdfYWM5NywgIndyaXRlIik7CisJCXNuZF9hemYzMzI4X21peGVyX2FjOTdfbWFwX3Vuc3VwcG9ydGVkKGNoaXAsIHJlZ19hYzk3LCAid3JpdGUiKTsKIH0KIAogc3RhdGljIGludApAQCAtODUwLDcgKzc5OSw3IEBACiAJCSAqIGR1ZSB0byB0aGlzIGNhcmQgYmVpbmcgYSB2ZXJ5IHF1aXJreSBBQzk3ICJsb29rYWxpa2UiLgogCQkgKi8KIAlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUiAiYXp0MzMyODogQUM5NyBpbml0IGZhaWxlZCwgZXJyICVkIVxuIiwgcmMpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDOTcgaW5pdCBmYWlsZWQsIGVyciAlZCFcbiIsIHJjKTsKIAogCS8qIElmIHdlIHJldHVybiBhbiBlcnJvciBoZXJlLCB0aGVuIHNuZF9jYXJkX2ZyZWUoKSBzaG91bGQKIAkgKiBmcmVlIHVwIGFueSBhYzk3IGNvZGVjcyB0aGF0IGdvdCBjcmVhdGVkLCBhcyB3ZWxsIGFzIHRoZSBidXMuCkBAIC04NzAsOCArODE5LDYgQEAKIAl1bnNpZ25lZCBjaGFyIGN1cnJfdm9sX2xlZnQgPSAwLCBjdXJyX3ZvbF9yaWdodCA9IDA7CiAJaW50IGxlZnRfY2hhbmdlID0gMCwgcmlnaHRfY2hhbmdlID0gMDsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwotCiAJaWYgKGNoYW5fc2VsICYgU0VUX0NIQU5fTEVGVCkgewogCQljdXJyX3ZvbF9sZWZ0ICA9IGluYihwb3J0YmFzZSArIDEpOwogCkBAIC05MTIsNyArODU5LDYgQEAKIAkJaWYgKGRlbGF5KQogCQkJbWRlbGF5KGRlbGF5KTsKIAl9IHdoaWxlICgobGVmdF9jaGFuZ2UpIHx8IChyaWdodF9jaGFuZ2UpKTsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogLyoKQEAgLTk5MCwxNCArOTM2LDEyIEBACiB7CiAJc3RydWN0IGF6ZjMzMjhfbWl4ZXJfcmVnIHJlZzsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCXNuZF9hemYzMzI4X21peGVyX3JlZ19kZWNvZGUoJnJlZywga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOwogCXVpbmZvLT50eXBlID0gcmVnLm1hc2sgPT0gMSA/CiAJCVNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKIAl1aW5mby0+Y291bnQgPSByZWcuc3RlcmVvICsgMTsKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IHJlZy5tYXNrOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDA5LDcgKzk1Myw2IEBACiAJc3RydWN0IGF6ZjMzMjhfbWl4ZXJfcmVnIHJlZzsKIAl1MTYgb3JlZywgdmFsOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc25kX2F6ZjMzMjhfbWl4ZXJfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAKIAlvcmVnID0gc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHJlZy5yZWcpOwpAQCAtMTAyMywxMiArOTY2LDExIEBACiAJCQl2YWwgPSByZWcubWFzayAtIHZhbDsKIAkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSB2YWw7CiAJfQotCXNuZF9hemYzMzI4X2RiZ21peGVyKCJnZXQ6ICUwMnggaXMgJTA0eCAtPiB2b2wgJTAybHh8JTAybHggIgotCQkJICAgICAiKHNoaWZ0ICUwMmR8JTAyZCwgbWFzayAlMDJ4LCBpbnYuICVkLCBzdGVyZW8gJWQpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiZ2V0OiAlMDJ4IGlzICUwNHggLT4gdm9sICUwMmx4fCUwMmx4IChzaGlmdCAlMDJkfCUwMmQsIG1hc2sgJTAyeCwgaW52LiAlZCwgc3RlcmVvICVkKVxuIiwKIAkJcmVnLnJlZywgb3JlZywKIAkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdLAogCQlyZWcubGNoYW5fc2hpZnQsIHJlZy5yY2hhbl9zaGlmdCwgcmVnLm1hc2ssIHJlZy5pbnZlcnQsIHJlZy5zdGVyZW8pOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDQwLDcgKzk4Miw2IEBACiAJc3RydWN0IGF6ZjMzMjhfbWl4ZXJfcmVnIHJlZzsKIAl1MTYgb3JlZywgbnJlZywgdmFsOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc25kX2F6ZjMzMjhfbWl4ZXJfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJb3JlZyA9IHNuZF9hemYzMzI4X21peGVyX2ludyhjaGlwLCByZWcucmVnKTsKIAl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIHJlZy5tYXNrOwpAQCAtMTA2NCwxMiArMTAwNSwxMSBAQAogCWVsc2UKICAgICAgICAgCXNuZF9hemYzMzI4X21peGVyX291dHcoY2hpcCwgcmVnLnJlZywgbnJlZyk7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXhlcigicHV0OiAlMDJ4IHRvICUwMmx4fCUwMmx4LCAiCi0JCQkgICAgICJvcmVnICUwNHg7IHNoaWZ0ICUwMmR8JTAyZCAtPiBucmVnICUwNHg7IGFmdGVyOiAlMDR4XG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicHV0OiAlMDJ4IHRvICUwMmx4fCUwMmx4LCBvcmVnICUwNHg7IHNoaWZ0ICUwMmR8JTAyZCAtPiBucmVnICUwNHg7IGFmdGVyOiAlMDR4XG4iLAogCQlyZWcucmVnLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sCiAJCW9yZWcsIHJlZy5sY2hhbl9zaGlmdCwgcmVnLnJjaGFuX3NoaWZ0LAogCQlucmVnLCBzbmRfYXpmMzMyOF9taXhlcl9pbncoY2hpcCwgcmVnLnJlZykpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAobnJlZyAhPSBvcmVnKTsKIH0KIApAQCAtMTEzNSw3ICsxMDc1LDggQEAKIAl9IGVsc2UKICAgICAgICAgCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IHJlZy5sY2hhbl9zaGlmdCkgJiAocmVnLmVudW1fYyAtIDEpOwogCi0Jc25kX2F6ZjMzMjhfZGJnbWl4ZXIoImdldF9lbnVtOiAlMDJ4IGlzICUwNHggLT4gJWR8JWQgKHNoaWZ0ICUwMmQsIGVudW1fYyAlZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJnZXRfZW51bTogJTAyeCBpcyAlMDR4IC0+ICVkfCVkIChzaGlmdCAlMDJkLCBlbnVtX2MgJWQpXG4iLAogCQlyZWcucmVnLCB2YWwsIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0sIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0sCiAJCXJlZy5sY2hhbl9zaGlmdCwgcmVnLmVudW1fYyk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTE2Nyw3ICsxMTA4LDggQEAKIAlzbmRfYXpmMzMyOF9taXhlcl9vdXR3KGNoaXAsIHJlZy5yZWcsIHZhbCk7CiAJbnJlZyA9IHZhbDsKIAotCXNuZF9hemYzMzI4X2RiZ21peGVyKCJwdXRfZW51bTogJTAyeCB0byAlMDR4LCBvcmVnICUwNHhcbiIsIHJlZy5yZWcsIHZhbCwgb3JlZyk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJwdXRfZW51bTogJTAyeCB0byAlMDR4LCBvcmVnICUwNHhcbiIsIHJlZy5yZWcsIHZhbCwgb3JlZyk7CiAJcmV0dXJuIChucmVnICE9IG9yZWcpOwogfQogCkBAIC0xMjUzLDcgKzExOTUsNiBAQAogCXVuc2lnbmVkIGludCBpZHg7CiAJaW50IGVycjsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCWlmIChzbmRfQlVHX09OKCFjaGlwIHx8ICFjaGlwLT5jYXJkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEyNzksNyArMTIyMCw2IEBACiAJc25kX2NvbXBvbmVudF9hZGQoY2FyZCwgIkFaRjMzMjggbWl4ZXIiKTsKIAlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiQVpGMzMyOCBtaXhlciIpOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQVpGX1VTRV9BQzk3X0xBWUVSICovCkBAIC0xMjg4LDE5ICsxMjI4LDEzIEBACiBzbmRfYXpmMzMyOF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewotCWludCByZXM7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7Ci0JcmVzID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKLQlyZXR1cm4gcmVzOworCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwogfQogCiBzdGF0aWMgaW50CiBzbmRfYXpmMzMyOF9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMxNSw3ICsxMjQ5LDYgQEAKIAl1MTYgdmFsID0gMHhmZjAwOwogCXU4IGZyZXEgPSAwOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc3dpdGNoIChiaXRyYXRlKSB7CiAJY2FzZSBBWkZfRlJFUV80MDAwOiAgZnJlcSA9IFNPVU5ERk9STUFUX0ZSRVFfU1VTUEVDVEVEXzQwMDA7IGJyZWFrOwogCWNhc2UgQVpGX0ZSRVFfNDgwMDogIGZyZXEgPSBTT1VOREZPUk1BVF9GUkVRX1NVU1BFQ1RFRF80ODAwOyBicmVhazsKQEAgLTEzNzksNyArMTMxMiw2IEBACiAJCSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNvZGVjLT5sb2NrLCBmbGFncyk7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTQwNCwxNSArMTMzNiwxNiBAQAogCQljaGlwLT5zaGFkb3dfcmVnX2N0cmxfNkFIIHw9IGJpdG1hc2s7CiAJZWxzZQogCQljaGlwLT5zaGFkb3dfcmVnX2N0cmxfNkFIICY9IH5iaXRtYXNrOwotCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCI2QUhfdXBkYXRlIG1hc2sgMHglMDR4IGRvX21hc2sgJWQ6IHZhbCAweCUwNHhcbiIsCi0JCQliaXRtYXNrLCBkb19tYXNrLCBjaGlwLT5zaGFkb3dfcmVnX2N0cmxfNkFIKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIjZBSF91cGRhdGUgbWFzayAweCUwNHggZG9fbWFzayAlZDogdmFsIDB4JTA0eFxuIiwKKwkJYml0bWFzaywgZG9fbWFzaywgY2hpcC0+c2hhZG93X3JlZ19jdHJsXzZBSCk7CiAJc25kX2F6ZjMzMjhfY3RybF9vdXR3KGNoaXAsIElEWF9JT182QUgsIGNoaXAtPnNoYWRvd19yZWdfY3RybF82QUgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHNuZF9hemYzMzI4X2N0cmxfZW5hYmxlX2NvZGVjcyhzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsIGJvb2wgZW5hYmxlKQogewotCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCJjb2RlY19lbmFibGUgJWRcbiIsIGVuYWJsZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjb2RlY19lbmFibGUgJWRcbiIsIGVuYWJsZSk7CiAJLyogbm8gaWRlYSB3aGF0IGV4YWN0bHkgaXMgYmVpbmcgZG9uZSBoZXJlLCBidXQgSSBzdHJvbmdseSBhc3N1bWUgaXQncwogCSAqIFBNIHJlbGF0ZWQgKi8KIAlzbmRfYXpmMzMyOF9jdHJsX3JlZ182QUhfdXBkYXRlKApAQCAtMTQyOSw3ICsxMzYyLDcgQEAKIAlzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMgPSAmY2hpcC0+Y29kZWNzW2NvZGVjX3R5cGVdOwogCWJvb2wgbmVlZF9jaGFuZ2UgPSAoY29kZWMtPnJ1bm5pbmcgIT0gZW5hYmxlKTsKIAotCXNuZF9hemYzMzI4X2RiZ2NvZGVjKAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkiY29kZWNfYWN0aXZpdHk6ICVzIGNvZGVjLCBlbmFibGUgJWQsIG5lZWRfY2hhbmdlICVkXG4iLAogCQkJCWNvZGVjLT5uYW1lLCBlbmFibGUsIG5lZWRfY2hhbmdlCiAJKTsKQEAgLTE0NzAsMTMgKzE0MDMsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjLAotCQkJCXVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQl1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzLAotCQkJCXVuc2lnbmVkIGludCBidWZmZXJfYnl0ZXMKK3NuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAorCQkJICBzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMsCisJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcywKKwkJCSAgdW5zaWduZWQgaW50IGJ1ZmZlcl9ieXRlcwogKQogewotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCVdBUk5fT05DRShwZXJpb2RfYnl0ZXMgJiAxLCAib2RkIHBlcmlvZCBsZW5ndGghP1xuIik7CiAJV0FSTl9PTkNFKGJ1ZmZlcl9ieXRlcyAhPSAyICogcGVyaW9kX2J5dGVzLAogCQkgIm1pc3NlZCBvdXIgaW5wdXQgZXhwZWN0YXRpb25zISAldSB2cy4gJXVcbiIsCkBAIC0xNDk5LDcgKzE0MzIsNyBAQAogCQlzZXR1cF9pby5kbWFfc3RhcnRfMSA9IGFkZHI7CiAJCXNldHVwX2lvLmRtYV9zdGFydF8yID0gYWRkcithcmVhX2xlbmd0aDsKIAotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCQkic2V0ZG1hOiBidWZmZXJzICUwOHhbJXVdIC8gJTA4eFsldV0sICV1LCAldVxuIiwKIAkJCQlzZXR1cF9pby5kbWFfc3RhcnRfMSwgYXJlYV9sZW5ndGgsCiAJCQkJc2V0dXBfaW8uZG1hX3N0YXJ0XzIsIGFyZWFfbGVuZ3RoLApAQCAtMTUyMiw3ICsxNDU1LDYgQEAKIAkJKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjb2RlYy0+bG9jaywgZmxhZ3MpOwogCX0KLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogc3RhdGljIGludApAQCAtMTUzNSw4ICsxNDY3LDYgQEAKIAl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKICNlbmRpZgogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7Ci0KIAljb2RlYy0+ZG1hX2Jhc2UgPSBydW50aW1lLT5kbWFfYWRkcjsKIAogI2lmIDAKQEAgLTE1NDQsMTAgKzE0NzQsOSBAQAogCQlydW50aW1lLT5yYXRlLAogCQlzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpLAogCQlydW50aW1lLT5jaGFubmVscyk7Ci0Jc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShjb2RlYywKKwlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNoaXAsIGNvZGVjLAogCQkJCQlydW50aW1lLT5kbWFfYWRkciwgY291bnQsIHNpemUpOwogI2VuZGlmCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NjIsMTEgKzE0OTEsOSBAQAogCWJvb2wgcHJldmlvdXNseV9tdXRlZCA9IGZhbHNlOwogCWJvb2wgaXNfbWFpbl9taXhlcl9wbGF5YmFja19jb2RlYyA9IChBWkZfQ09ERUNfUExBWUJBQ0sgPT0gY29kZWMtPnR5cGUpOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbHMoInNuZF9hemYzMzI4X3BjbV90cmlnZ2VyIGNtZCAlZFxuIiwgY21kKTsKLQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNUQVJUICVzXG4iLCBjb2RlYy0+bmFtZSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiU1RBUlQgUENNICVzXG4iLCBjb2RlYy0+bmFtZSk7CiAKIAkJaWYgKGlzX21haW5fbWl4ZXJfcGxheWJhY2tfY29kZWMpIHsKIAkJCS8qIG11dGUgV2F2ZU91dCAoYXZvaWQgY2xpY2tpbmcgZHVyaW5nIHNldHVwKSAqLwpAQCAtMTU5Myw3ICsxNTIwLDcgQEAKIAkJc25kX2F6ZjMzMjhfY29kZWNfb3V0dyhjb2RlYywgSURYX0lPX0NPREVDX0lSUVRZUEUsIDB4ZmZmZik7CiAJCXNwaW5fdW5sb2NrKGNvZGVjLT5sb2NrKTsKIAotCQlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNvZGVjLCBydW50aW1lLT5kbWFfYWRkciwKKwkJc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShjaGlwLCBjb2RlYywgcnVudGltZS0+ZG1hX2FkZHIsCiAJCQlzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSwKIAkJCXNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pCiAJCSk7CkBAIC0xNjMzLDEwICsxNTYwLDEwIEBACiAJCQkJKTsKIAkJfQogCi0JCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCJTVEFSVEVEICVzXG4iLCBjb2RlYy0+bmFtZSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiUENNIFNUQVJURUQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCJSRVNVTUUgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJQQ00gUkVTVU1FICVzXG4iLCBjb2RlYy0+bmFtZSk7CiAJCS8qIHJlc3VtZSBjb2RlYyBpZiB3ZSB3ZXJlIGFjdGl2ZSAqLwogCQlzcGluX2xvY2soY29kZWMtPmxvY2spOwogCQlpZiAoY29kZWMtPnJ1bm5pbmcpCkBAIC0xNjQ4LDcgKzE1NzUsNyBAQAogCQlzcGluX3VubG9jayhjb2RlYy0+bG9jayk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNUT1AgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJQQ00gU1RPUCAlc1xuIiwgY29kZWMtPm5hbWUpOwogCiAJCWlmIChpc19tYWluX21peGVyX3BsYXliYWNrX2NvZGVjKSB7CiAJCQkvKiBtdXRlIFdhdmVPdXQgKGF2b2lkIGNsaWNraW5nIGR1cmluZyBzZXR1cCkgKi8KQEAgLTE2ODQsMTAgKzE2MTEsMTAgQEAKIAkJCQkpOwogCQl9CiAKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNUT1BQRUQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJQQ00gU1RPUFBFRCAlc1xuIiwgY29kZWMtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCJTVVNQRU5EICVzXG4iLCBjb2RlYy0+bmFtZSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiUENNIFNVU1BFTkQgJXNcbiIsIGNvZGVjLT5uYW1lKTsKIAkJLyogbWFrZSBzdXJlIGNvZGVjIGlzIHN0b3BwZWQgKi8KIAkJc25kX2F6ZjMzMjhfY29kZWNfb3V0dyhjb2RlYywgSURYX0lPX0NPREVDX0RNQV9GTEFHUywKIAkJCXNuZF9hemYzMzI4X2NvZGVjX2ludygKQEAgLTE2OTYsMTcgKzE2MjMsMTYgQEAKIAkJKTsKIAkJYnJlYWs7CiAgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0ggTklZIVxuIik7CisJCVdBUk4oMSwgIkZJWE1FOiBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIIE5JWSFcbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkZJWE1FOiBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFIE5JWSFcbiIpOworCQlXQVJOKDEsICJGSVhNRTogU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRSBOSVkhXG4iKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRklYTUU6IHVua25vd24gdHJpZ2dlciBtb2RlIVxuIik7CisJCVdBUk4oMSwgIkZJWE1FOiB1bmtub3duIHRyaWdnZXIgbW9kZSFcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogCX0KIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE3MjgsOCArMTY1NCw4IEBACiAJcmVzdWx0IC09IGNvZGVjLT5kbWFfYmFzZTsKICNlbmRpZgogCWZybXJlcyA9IGJ5dGVzX3RvX2ZyYW1lcyggc3Vic3RyZWFtLT5ydW50aW1lLCByZXN1bHQpOwotCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCIlMDhsaSAlcyBAIDB4JThseCwgZnJhbWVzICU4bGRcbiIsCi0JCQkJamlmZmllcywgY29kZWMtPm5hbWUsIHJlc3VsdCwgZnJtcmVzKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICIlMDhsaSAlcyBAIDB4JThseCwgZnJhbWVzICU4bGRcbiIsCisJCWppZmZpZXMsIGNvZGVjLT5uYW1lLCByZXN1bHQsIGZybXJlcyk7CiAJcmV0dXJuIGZybXJlczsKIH0KIApAQCAtMTc5Miw3ICsxNzE4LDcgQEAKIAkgKiBza2VsZXRvbiBoYW5kbGVyIG9ubHkKIAkgKiAod2UgZG8gbm90IHdhbnQgYXhpcyByZWFkaW5nIGluIGludGVycnVwdCBoYW5kbGVyIC0gdG9vIG11Y2ggbG9hZCEpCiAJICovCi0Jc25kX2F6ZjMzMjhfZGJnZ2FtZSgiZ2FtZXBvcnQgaXJxXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImdhbWVwb3J0IGlycVxuIik7CiAKIAkgLyogdGhpcyBzaG91bGQgQUNLIHRoZSBnYW1lcG9ydCBJUlEgcHJvcGVybHksIGhvcGVmdWxseS4gKi8KIAlzbmRfYXpmMzMyOF9nYW1lX2ludyhjaGlwLCBJRFhfR0FNRV9BWElTX1ZBTFVFKTsKQEAgLTE4MDQsNyArMTczMCw3IEBACiAJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CiAJaW50IHJlczsKIAotCXNuZF9hemYzMzI4X2RiZ2dhbWUoImdhbWVwb3J0X29wZW4sIG1vZGUgJWRcbiIsIG1vZGUpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZ2FtZXBvcnRfb3BlbiwgbW9kZSAlZFxuIiwgbW9kZSk7CiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBHQU1FUE9SVF9NT0RFX0NPT0tFRDoKIAljYXNlIEdBTUVQT1JUX01PREVfUkFXOgpAQCAtMTgyNyw3ICsxNzUzLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKIAotCXNuZF9hemYzMzI4X2RiZ2dhbWUoImdhbWVwb3J0X2Nsb3NlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImdhbWVwb3J0X2Nsb3NlXG4iKTsKIAlzbmRfYXpmMzMyOF9nYW1lcG9ydF9zZXRfY291bnRlcl9mcmVxdWVuY3koY2hpcCwKIAkJCQlHQU1FX0hXQ0ZHX0FEQ19DT1VOVEVSX0ZSRVFfMV8yMDApOwogCXNuZF9hemYzMzI4X2dhbWVwb3J0X2F4aXNfY2lyY3VpdF9lbmFibGUoY2hpcCwgMCk7CkBAIC0xODkyLDkgKzE4MTgsOCBAQAogCQkJYXhlc1tpXSA9IC0xOwogCX0KIAotCXNuZF9hemYzMzI4X2RiZ2dhbWUoImNvb2tlZF9yZWFkOiBheGVzICVkICVkICVkICVkIGJ1dHRvbnMgJWRcbiIsCi0JCWF4ZXNbMF0sIGF4ZXNbMV0sIGF4ZXNbMl0sIGF4ZXNbM10sICpidXR0b25zCi0JKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNvb2tlZF9yZWFkOiBheGVzICVkICVkICVkICVkIGJ1dHRvbnMgJWRcbiIsCisJCWF4ZXNbMF0sIGF4ZXNbMV0sIGF4ZXNbMl0sIGF4ZXNbM10sICpidXR0b25zKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkwNiw3ICsxODMxLDcgQEAKIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImF6dDMzMjg6IGNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTk1MCwyMyArMTg3NSwyMyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBzbmRfYXpmMzMyOF9nYW1lcG9ydF9pbnRlcnJ1cHQoc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwKQogewotCXByaW50ayhLRVJOX1dBUk5JTkcgImh1aCwgZ2FtZSBwb3J0IElSUSBvY2N1cnJlZCE/XG4iKTsKKwlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJodWgsIGdhbWUgcG9ydCBJUlEgb2NjdXJyZWQhP1xuIik7CiB9CiAjZW5kaWYgLyogU1VQUE9SVF9HQU1FUE9SVCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNuZF9hemYzMzI4X2lycV9sb2dfdW5rbm93bl90eXBlKHU4IHdoaWNoKQorc25kX2F6ZjMzMjhfaXJxX2xvZ191bmtub3duX3R5cGUoc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLCB1OCB3aGljaCkKIHsKLQlzbmRfYXpmMzMyOF9kYmdjb2RlYygKLQkiYXp0MzMyODogdW5rbm93biBJUlEgdHlwZSAoJXgpIG9jY3VycmVkLCBwbGVhc2UgcmVwb3J0IVxuIiwKLQkJd2hpY2gKLQkpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkidW5rbm93biBJUlEgdHlwZSAoJXgpIG9jY3VycmVkLCBwbGVhc2UgcmVwb3J0IVxuIiwKKwkJd2hpY2gpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNuZF9hemYzMzI4X3BjbV9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmZpcnN0X2NvZGVjLAorc25kX2F6ZjMzMjhfcGNtX2ludGVycnVwdChzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAsCisJCQkgIGNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpmaXJzdF9jb2RlYywKIAkJCSAgdTggc3RhdHVzCiApCiB7CkBAIC0xOTkwLDE3ICsxOTE1LDE1IEBACiAKIAkJaWYgKGNvZGVjLT5zdWJzdHJlYW0pIHsKIAkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY29kZWMtPnN1YnN0cmVhbSk7Ci0JCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiJXMgcGVyaW9kIGRvbmUgKCMleCksIEAgJXhcbiIsCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIiVzIHBlcmlvZCBkb25lICgjJXgpLCBAICV4XG4iLAogCQkJCWNvZGVjLT5uYW1lLAogCQkJCXdoaWNoLAogCQkJCXNuZF9hemYzMzI4X2NvZGVjX2lubCgKLQkJCQkJY29kZWMsIElEWF9JT19DT0RFQ19ETUFfQ1VSUlBPUwotCQkJCSkKLQkJCSk7CisJCQkJCWNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX0NVUlJQT1MpKTsKIAkJfSBlbHNlCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJhenQzMzI4OiBpcnEgaGFuZGxlciBwcm9ibGVtIVxuIik7CisJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJpcnEgaGFuZGxlciBwcm9ibGVtIVxuIik7CiAJCWlmICh3aGljaCAmIElSUV9TT01FVEhJTkcpCi0JCQlzbmRfYXpmMzMyOF9pcnFfbG9nX3Vua25vd25fdHlwZSh3aGljaCk7CisJCQlzbmRfYXpmMzMyOF9pcnFfbG9nX3Vua25vd25fdHlwZShjaGlwLCB3aGljaCk7CiAJfQogfQogCkBAIC0yMDA5LDkgKzE5MzIsNyBAQAogewogCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IGRldl9pZDsKIAl1OCBzdGF0dXM7Ci0jaWYgREVCVUdfQ09ERUMKIAlzdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfY291bnQ7Ci0jZW5kaWYKIAogCXN0YXR1cyA9IHNuZF9hemYzMzI4X2N0cmxfaW5iKGNoaXAsIElEWF9JT19JUlFTVEFUVVMpOwogCkBAIC0yMDIyLDE0ICsxOTQzLDEzIEBACiAJKSkKIAkJcmV0dXJuIElSUV9OT05FOyAvKiBtdXN0IGJlIGludGVycnVwdCBmb3IgYW5vdGhlciBkZXZpY2UgKi8KIAotCXNuZF9hemYzMzI4X2RiZ2NvZGVjKAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkiaXJxX2NvdW50ICVsZCEgSURYX0lPX0lSUVNUQVRVUyAlMDR4XG4iLAogCQkJaXJxX2NvdW50KysgLyogZGVidWctb25seSAqLywKLQkJCXN0YXR1cwotCSk7CisJCQlzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyAmIElSUV9USU1FUikgewotCQkvKiBzbmRfYXpmMzMyOF9kYmdjb2RlYygidGltZXIgJWxkXG4iLAorCQkvKiBkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInRpbWVyICVsZFxuIiwKIAkJCXNuZF9hemYzMzI4X2NvZGVjX2lubChjaGlwLCBJRFhfSU9fVElNRVJfVkFMVUUpCiAJCQkJJiBUSU1FUl9WQUxVRV9NQVNLCiAJCSk7ICovCkBAIC0yMDM5LDExICsxOTU5LDExIEBACiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJCXNuZF9hemYzMzI4X2N0cmxfb3V0YihjaGlwLCBJRFhfSU9fVElNRVJfVkFMVUUgKyAzLCAweDA3KTsKIAkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJc25kX2F6ZjMzMjhfZGJnY29kZWMoImF6dDMzMjg6IHRpbWVyIElSUVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAidGltZXIgSVJRXG4iKTsKIAl9CiAKIAlpZiAoc3RhdHVzICYgKElSUV9QTEFZQkFDS3xJUlFfUkVDT1JESU5HfElSUV9JMlNfT1VUKSkKLQkJc25kX2F6ZjMzMjhfcGNtX2ludGVycnVwdChjaGlwLT5jb2RlY3MsIHN0YXR1cyk7CisJCXNuZF9hemYzMzI4X3BjbV9pbnRlcnJ1cHQoY2hpcCwgY2hpcC0+Y29kZWNzLCBzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyAmIElSUV9HQU1FUE9SVCkKIAkJc25kX2F6ZjMzMjhfZ2FtZXBvcnRfaW50ZXJydXB0KGNoaXApOwpAQCAtMjA1NSw3ICsxOTc1LDcgQEAKIAogCQkvKiBobW0sIGRvIHdlIGhhdmUgdG8gYWNrIHRoZSBJUlEgaGVyZSBzb21laG93PwogCQkgKiBJZiBzbywgdGhlbiBJIGRvbid0IGtub3cgaG93IHlldC4uLiAqLwotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygiYXp0MzMyODogTVBVNDAxIElSUVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTVBVNDAxIElSUVxuIik7CiAJfQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTIxMzMsNyArMjA1Myw2IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMgPSAmY2hpcC0+Y29kZWNzW2NvZGVjX3R5cGVdOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJY29kZWMtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAogCS8qIHNhbWUgcGFyYW1ldGVycyBmb3IgYWxsIG91ciBjb2RlY3MgLSBhdCBsZWFzdCB3ZSB0aGluayBzby4uLiAqLwpAQCAtMjE0Miw3ICsyMDYxLDYgQEAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkgICAmc25kX2F6ZjMzMjhfaHdfY29uc3RyYWludHNfcmF0ZXMpOwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGNvZGVjOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTcxLDkgKzIwODksNyBAQAogCXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9CiAJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJY29kZWMtPnN1YnN0cmVhbSA9IE5VTEw7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyMjAsOCArMjEzNiw2IEBACiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlpbnQgZXJyOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7Ci0KIAllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQVpGMzMyOCBEU1AiLCBBWkZfUENNREVWX1NURCwKIAkJCQkJCQkJMSwgMSwgJnBjbSk7CiAJaWYgKGVyciA8IDApCkBAIC0yMjU4LDcgKzIxNzIsNiBAQAogCQkJCQkJc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAogCQkJCQkJCTY0KjEwMjQsIDY0KjEwMjQpOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyODEsNyArMjE5NCw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgZGVsYXk7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAljaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOwogCWRlbGF5ID0gKCh0aW1lci0+c3RpY2tzICogc2VxdGltZXJfc2NhbGluZykgLSAxKSAmIFRJTUVSX1ZBTFVFX01BU0s7CiAJaWYgKGRlbGF5IDwgNDkpIHsKQEAgLTIyODksMTUgKzIyMDEsMTQgQEAKIAkJICogdGhpcyB0aW1pbmcgdHdlYWsKIAkJICogKHdlIG5lZWQgdG8gZG8gaXQgdG8gYXZvaWQgYSBsb2NrdXAsIHRob3VnaCkgKi8KIAotCQlzbmRfYXpmMzMyOF9kYmd0aW1lcigiZGVsYXkgd2FzIHRvbyBsb3cgKCVkKSFcbiIsIGRlbGF5KTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkZWxheSB3YXMgdG9vIGxvdyAoJWQpIVxuIiwgZGVsYXkpOwogCQlkZWxheSA9IDQ5OyAvKiBtaW5pbXVtIHRpbWUgaXMgNDkgdGlja3MgKi8KIAl9Ci0Jc25kX2F6ZjMzMjhfZGJndGltZXIoInNldHRpbmcgdGltZXIgY291bnRkb3duIHZhbHVlICVkXG4iLCBkZWxheSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzZXR0aW5nIHRpbWVyIGNvdW50ZG93biB2YWx1ZSAlZFxuIiwgZGVsYXkpOwogCWRlbGF5IHw9IFRJTUVSX0NPVU5URE9XTl9FTkFCTEUgfCBUSU1FUl9JUlFfRU5BQkxFOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogCXNuZF9hemYzMzI4X2N0cmxfb3V0bChjaGlwLCBJRFhfSU9fVElNRVJfVkFMVUUsIGRlbGF5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzA3LDcgKzIyMTgsNiBAQAogCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJY2hpcCA9IHNuZF90aW1lcl9jaGlwKHRpbWVyKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAkvKiBkaXNhYmxlIHRpbWVyIGNvdW50ZG93biBhbmQgaW50ZXJydXB0ICovCkBAIC0yMzE5LDcgKzIyMjksNiBAQAogCSAgIHRoZSBoYXJkd2FyZS9BTFNBIGludGVycnVwdCBhY3Rpdml0eS4gKi8KIAlzbmRfYXpmMzMyOF9jdHJsX291dGIoY2hpcCwgSURYX0lPX1RJTUVSX1ZBTFVFICsgMywgMHgwNCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjMyOCwxMCArMjIzNyw4IEBACiBzbmRfYXpmMzMyOF90aW1lcl9wcmVjaXNlX3Jlc29sdXRpb24oc3RydWN0IHNuZF90aW1lciAqdGltZXIsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpudW0sIHVuc2lnbmVkIGxvbmcgKmRlbikKIHsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAkqbnVtID0gMTsKIAkqZGVuID0gMTAyNDAwMCAvIHNlcXRpbWVyX3NjYWxpbmc7Ci0Jc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzNTEsNyArMjI1OCw2IEBACiAJc3RydWN0IHNuZF90aW1lcl9pZCB0aWQ7CiAJaW50IGVycjsKIAotCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwogCXRpZC5kZXZfY2xhc3MgPSBTTkRSVl9USU1FUl9DTEFTU19DQVJEOwogCXRpZC5kZXZfc2NsYXNzID0gU05EUlZfVElNRVJfU0NMQVNTX05PTkU7CiAJdGlkLmNhcmQgPSBjaGlwLT5jYXJkLT5udW1iZXI7CkBAIC0yMzc2LDcgKzIyODIsNiBAQAogCWVyciA9IDA7CiAKIG91dDoKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNDM4LDM0ICsyMzQzLDM0IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHNuZF9hemYzMzI4X2RlYnVnX3Nob3dfcG9ydHMoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwKQogewotI2lmIERFQlVHX01JU0MKIAl1MTYgdG1wOwogCi0Jc25kX2F6ZjMzMjhfZGJnbWlzYygKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJImN0cmxfaW8gMHglbHgsIGdhbWVfaW8gMHglbHgsIG1wdV9pbyAweCVseCwgIgogCQkib3BsM19pbyAweCVseCwgbWl4ZXJfaW8gMHglbHgsIGlycSAlZFxuIiwKIAkJY2hpcC0+Y3RybF9pbywgY2hpcC0+Z2FtZV9pbywgY2hpcC0+bXB1X2lvLAotCQljaGlwLT5vcGwzX2lvLCBjaGlwLT5taXhlcl9pbywgY2hpcC0+aXJxCi0JKTsKKwkJY2hpcC0+b3BsM19pbywgY2hpcC0+bWl4ZXJfaW8sIGNoaXAtPmlycSk7CiAKLQlzbmRfYXpmMzMyOF9kYmdtaXNjKCJnYW1lICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiZ2FtZSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKIAkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgMCksCiAJCXNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIDEpLAogCQlzbmRfYXpmMzMyOF9nYW1lX2luYihjaGlwLCAyKSwKIAkJc25kX2F6ZjMzMjhfZ2FtZV9pbmIoY2hpcCwgMyksCiAJCXNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIDQpLAotCQlzbmRfYXpmMzMyOF9nYW1lX2luYihjaGlwLCA1KQotCSk7CisJCXNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIDUpKTsKIAogCWZvciAodG1wID0gMDsgdG1wIDwgMHgwNzsgdG1wICs9IDEpCi0JCXNuZF9hemYzMzI4X2RiZ21pc2MoIm1wdV9pbyAweCUwNHhcbiIsIGluYihjaGlwLT5tcHVfaW8gKyB0bXApKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkibXB1X2lvIDB4JTA0eFxuIiwgaW5iKGNoaXAtPm1wdV9pbyArIHRtcCkpOwogCiAJZm9yICh0bXAgPSAwOyB0bXAgPD0gMHgwNzsgdG1wICs9IDEpCi0JCXNuZF9hemYzMzI4X2RiZ21pc2MoIjB4JTAyeDogZ2FtZTIwMCAweCUwNHgsIGdhbWUyMDggMHglMDR4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSIweCUwMng6IGdhbWUyMDAgMHglMDR4LCBnYW1lMjA4IDB4JTA0eFxuIiwKIAkJCXRtcCwgaW5iKDB4MjAwICsgdG1wKSwgaW5iKDB4MjA4ICsgdG1wKSk7CiAKIAlmb3IgKHRtcCA9IDA7IHRtcCA8PSAweDAxOyB0bXAgKz0gMSkKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCQkiMHglMDJ4OiBtcHUzMDAgMHglMDR4LCBtcHUzMTAgMHglMDR4LCBtcHUzMjAgMHglMDR4LCAiCiAJCQkibXB1MzMwIDB4JTA0eCBvcGwzODggMHglMDR4IG9wbDM4YyAweCUwNHhcbiIsCiAJCQkJdG1wLApAQCAtMjQ3NCwxOSArMjM3OSwxNyBAQAogCQkJCWluYigweDMyMCArIHRtcCksCiAJCQkJaW5iKDB4MzMwICsgdG1wKSwKIAkJCQlpbmIoMHgzODggKyB0bXApLAotCQkJCWluYigweDM4YyArIHRtcCkKLQkJKTsKKwkJCQlpbmIoMHgzOGMgKyB0bXApKTsKIAogCWZvciAodG1wID0gMDsgdG1wIDwgQVpGX0lPX1NJWkVfQ1RSTDsgdG1wICs9IDIpCi0JCXNuZF9hemYzMzI4X2RiZ21pc2MoImN0cmwgMHglMDJ4OiAweCUwNHhcbiIsCi0JCQl0bXAsIHNuZF9hemYzMzI4X2N0cmxfaW53KGNoaXAsIHRtcCkKLQkJKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiY3RybCAweCUwMng6IDB4JTA0eFxuIiwKKwkJCXRtcCwgc25kX2F6ZjMzMjhfY3RybF9pbncoY2hpcCwgdG1wKSk7CiAKIAlmb3IgKHRtcCA9IDA7IHRtcCA8IEFaRl9JT19TSVpFX01JWEVSOyB0bXAgKz0gMikKLQkJc25kX2F6ZjMzMjhfZGJnbWlzYygibWl4ZXIgMHglMDJ4OiAweCUwNHhcbiIsCi0JCQl0bXAsIHNuZF9hemYzMzI4X21peGVyX2ludyhjaGlwLCB0bXApCi0JCSk7Ci0jZW5kaWYgLyogREVCVUdfTUlTQyAqLworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJtaXhlciAweCUwMng6IDB4JTA0eFxuIiwKKwkJCXRtcCwgc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHRtcCkpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yNTIzLDggKzI0MjYsOCBAQAogCS8qIGNoZWNrIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyNCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI0KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0ICIKLQkJCQkJIjI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iCisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iCiAJCSk7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBvdXRfZXJyOwpAQCAtMjU2MCw3ICsyNDYzLDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F6ZjMzMjhfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIG91dF9lcnI7CiAJfQpAQCAtMjU5OSw4ICsyNTAyLDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKGNvZGVjLT5sb2NrKTsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCiAJZXJyID0gMDsKQEAgLTI2MjQsNyArMjUyNSw2IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWludCBlcnI7CiAKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwpAQCAtMjYzNSw3ICsyNTM1LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0yNjU3LDcgKzI1NTgsNyBAQAogCQktMSwgJmNoaXAtPnJtaWRpCiAJKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhemYzMzI4OiBubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibm8gTVBVLTQwMSBkZXZpY2UgYXQgMHglbHg/XG4iLAogCQkJCWNoaXAtPm1wdV9pbwogCQkpOwogCQlnb3RvIG91dF9lcnI7CkBAIC0yNjczLDcgKzI1NzQsNyBAQAogCiAJaWYgKHNuZF9vcGwzX2NyZWF0ZShjYXJkLCBjaGlwLT5vcGwzX2lvLCBjaGlwLT5vcGwzX2lvKzIsCiAJCQkgICAgT1BMM19IV19BVVRPLCAxLCAmb3BsMykgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImF6ZjMzMjg6IG5vIE9QTDMgZGV2aWNlIGF0IDB4JWx4LTB4JWx4P1xuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJubyBPUEwzIGRldmljZSBhdCAweCVseC0weCVseD9cbiIsCiAJCQkgICBjaGlwLT5vcGwzX2lvLCBjaGlwLT5vcGwzX2lvKzIKIAkJKTsKIAl9IGVsc2UgewpAQCAtMjY5NSwxMiArMjU5NiwxNSBAQAogCQlnb3RvIG91dF9lcnI7CiAKICNpZmRlZiBNT0RVTEUKLQlwcmludGsoS0VSTl9JTkZPCi0iYXp0MzMyODogU291bmQgZHJpdmVyIGZvciBBenRlY2ggQVpGMzMyOC1iYXNlZCBzb3VuZGNhcmRzIHN1Y2ggYXMgUENJMTY4LlxuIgotImF6dDMzMjg6IEhhcmR3YXJlIHdhcyBjb21wbGV0ZWx5IHVuZG9jdW1lbnRlZCwgdW5mb3J0dW5hdGVseS5cbiIKLSJhenQzMzI4OiBGZWVsIGZyZWUgdG8gY29udGFjdCBhbmRpIEFUIGxpc2FzLmRlIGZvciBidWcgcmVwb3J0cyBldGMuIVxuIgotImF6dDMzMjg6IFVzZXItc2NhbGFibGUgc2VxdWVuY2VyIHRpbWVyIHNldCB0byAlZEh6ICgxMDI0MDAwSHogLyAlZCkuXG4iLAotCTEwMjQwMDAgLyBzZXF0aW1lcl9zY2FsaW5nLCBzZXF0aW1lcl9zY2FsaW5nKTsKKwlkZXZfaW5mbyhjYXJkLT5kZXYsCisJCSAiU291bmQgZHJpdmVyIGZvciBBenRlY2ggQVpGMzMyOC1iYXNlZCBzb3VuZGNhcmRzIHN1Y2ggYXMgUENJMTY4LlxuIik7CisJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkgIkhhcmR3YXJlIHdhcyBjb21wbGV0ZWx5IHVuZG9jdW1lbnRlZCwgdW5mb3J0dW5hdGVseS5cbiIpOworCWRldl9pbmZvKGNhcmQtPmRldiwKKwkJICJGZWVsIGZyZWUgdG8gY29udGFjdCBhbmRpIEFUIGxpc2FzLmRlIGZvciBidWcgcmVwb3J0cyBldGMuIVxuIik7CisJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkgIlVzZXItc2NhbGFibGUgc2VxdWVuY2VyIHRpbWVyIHNldCB0byAlZEh6ICgxMDI0MDAwSHogLyAlZCkuXG4iLAorCQkgMTAyNDAwMCAvIHNlcXRpbWVyX3NjYWxpbmcsIHNlcXRpbWVyX3NjYWxpbmcpOwogI2VuZGlmCiAKIAlzbmRfYXpmMzMyOF9nYW1lcG9ydChjaGlwLCBkZXYpOwpAQCAtMjcxMiwzMSArMjYxNiwyOSBAQAogCWdvdG8gb3V0OwogCiBvdXRfZXJyOgotCXNuZF9wcmludGsoS0VSTl9FUlIgImF6ZjMzMjg6IHNvbWV0aGluZyBmYWlsZWQsIGV4aXRpbmdcbiIpOworCWRldl9lcnIoY2FyZC0+ZGV2LCAic29tZXRoaW5nIGZhaWxlZCwgZXhpdGluZ1xuIik7CiAJc25kX2NhcmRfZnJlZShjYXJkKTsKIAogb3V0OgotCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkCiBzbmRfYXpmMzMyOF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKIHsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKIAlzbmRfY2FyZF9mcmVlKHBjaV9nZXRfZHJ2ZGF0YShwY2kpKTsKLQlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGlubGluZSB2b2lkCi1zbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3ModW5zaWduZWQgbG9uZyBpb19hZGRyLCB1bnNpZ25lZCBjb3VudCwgdTMyICpzYXZlZF9yZWdzKQorc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwKKwkJCSB1bnNpZ25lZCBsb25nIGlvX2FkZHIsIHVuc2lnbmVkIGNvdW50LCB1MzIgKnNhdmVkX3JlZ3MpCiB7CiAJdW5zaWduZWQgcmVnOwogCiAJZm9yIChyZWcgPSAwOyByZWcgPCBjb3VudDsgKytyZWcpIHsKIAkJKnNhdmVkX3JlZ3MgPSBpbmwoaW9fYWRkcik7Ci0JCXNuZF9hemYzMzI4X2RiZ3BtKCJzdXNwZW5kOiBpbyAweCUwNGx4OiAweCUwOHhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3VzcGVuZDogaW8gMHglMDRseDogMHglMDh4XG4iLAogCQkJaW9fYWRkciwgKnNhdmVkX3JlZ3MpOwogCQkrK3NhdmVkX3JlZ3M7CiAJCWlvX2FkZHIgKz0gc2l6ZW9mKCpzYXZlZF9yZWdzKTsKQEAgLTI3NDQsNyArMjY0Niw4IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY29uc3QgdTMyICpzYXZlZF9yZWdzLAorc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAorCQkJY29uc3QgdTMyICpzYXZlZF9yZWdzLAogCQkJdW5zaWduZWQgbG9uZyBpb19hZGRyLAogCQkJdW5zaWduZWQgY291bnQKICkKQEAgLTI3NTMsNyArMjY1Niw4IEBACiAKIAlmb3IgKHJlZyA9IDA7IHJlZyA8IGNvdW50OyArK3JlZykgewogCQlvdXRsKCpzYXZlZF9yZWdzLCBpb19hZGRyKTsKLQkJc25kX2F6ZjMzMjhfZGJncG0oInJlc3VtZTogaW8gMHglMDRseDogMHglMDh4IC0tPiAweCUwOHhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInJlc3VtZTogaW8gMHglMDRseDogMHglMDh4IC0tPiAweCUwOHhcbiIsCiAJCQlpb19hZGRyLCAqc2F2ZWRfcmVncywgaW5sKGlvX2FkZHIpKTsKIAkJKytzYXZlZF9yZWdzOwogCQlpb19hZGRyICs9IHNpemVvZigqc2F2ZWRfcmVncyk7CkBAIC0yNzY2LDcgKzI2NzAsNyBAQAogI2lmZGVmIEFaRl9VU0VfQUM5N19MQVlFUgogCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5Nyk7CiAjZWxzZQotCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLT5taXhlcl9pbywKKwlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcCwgY2hpcC0+bWl4ZXJfaW8sCiAJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19taXhlciksIGNoaXAtPnNhdmVkX3JlZ3NfbWl4ZXIpOwogCiAJLyogbWFrZSBzdXJlIHRvIGRpc2FibGUgbWFzdGVyIHZvbHVtZSBldGMuIHRvIHByZXZlbnQgbG9vcGluZyBzb3VuZCAqLwpAQCAtMjc4MSw3ICsyNjg1LDcgQEAKICNpZmRlZiBBWkZfVVNFX0FDOTdfTEFZRVIKIAlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CiAjZWxzZQotCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAtPnNhdmVkX3JlZ3NfbWl4ZXIsIGNoaXAtPm1peGVyX2lvLAorCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAsIGNoaXAtPnNhdmVkX3JlZ3NfbWl4ZXIsIGNoaXAtPm1peGVyX2lvLAogCQkJCQlBUlJBWV9TSVpFKGNoaXAtPnNhdmVkX3JlZ3NfbWl4ZXIpKTsKIAogCS8qIHVuZm9ydHVuYXRlbHkgd2l0aCAzMmJpdCB0cmFuc2ZlcnMsIElEWF9NSVhFUl9QTEFZX01BU1RFUiAoMHgwMikKQEAgLTI4MDgsMTggKzI3MTIsMTggQEAKIAogCXNuZF9hemYzMzI4X3N1c3BlbmRfYWM5NyhjaGlwKTsKIAotCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLT5jdHJsX2lvLAorCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLCBjaGlwLT5jdHJsX2lvLAogCQlBUlJBWV9TSVpFKGNoaXAtPnNhdmVkX3JlZ3NfY3RybCksIGNoaXAtPnNhdmVkX3JlZ3NfY3RybCk7CiAKIAkvKiBtYW51YWxseSBzdG9yZSB0aGUgb25lIGN1cnJlbnRseSByZWxldmFudCB3cml0ZS1vbmx5IHJlZywgdG9vICovCiAJc2F2ZWRfcmVnc19jdHJsX3UxNiA9ICh1MTYgKiljaGlwLT5zYXZlZF9yZWdzX2N0cmw7CiAJc2F2ZWRfcmVnc19jdHJsX3UxNltJRFhfSU9fNkFIIC8gMl0gPSBjaGlwLT5zaGFkb3dfcmVnX2N0cmxfNkFIOwogCi0Jc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAtPmdhbWVfaW8sCisJc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAsIGNoaXAtPmdhbWVfaW8sCiAJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19nYW1lKSwgY2hpcC0+c2F2ZWRfcmVnc19nYW1lKTsKLQlzbmRfYXpmMzMyOF9zdXNwZW5kX3JlZ3MoY2hpcC0+bXB1X2lvLAorCXNuZF9hemYzMzI4X3N1c3BlbmRfcmVncyhjaGlwLCBjaGlwLT5tcHVfaW8sCiAJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19tcHUpLCBjaGlwLT5zYXZlZF9yZWdzX21wdSk7Ci0Jc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAtPm9wbDNfaW8sCisJc25kX2F6ZjMzMjhfc3VzcGVuZF9yZWdzKGNoaXAsIGNoaXAtPm9wbDNfaW8sCiAJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19vcGwzKSwgY2hpcC0+c2F2ZWRfcmVnc19vcGwzKTsKIAogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwpAQCAtMjgzOCwyMyArMjc0MiwyMiBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXp0MzMyODogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKLQlzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjaGlwLT5zYXZlZF9yZWdzX2dhbWUsIGNoaXAtPmdhbWVfaW8sCisJc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcCwgY2hpcC0+c2F2ZWRfcmVnc19nYW1lLCBjaGlwLT5nYW1lX2lvLAogCQkJCQlBUlJBWV9TSVpFKGNoaXAtPnNhdmVkX3JlZ3NfZ2FtZSkpOwotCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAtPnNhdmVkX3JlZ3NfbXB1LCBjaGlwLT5tcHVfaW8sCisJc25kX2F6ZjMzMjhfcmVzdW1lX3JlZ3MoY2hpcCwgY2hpcC0+c2F2ZWRfcmVnc19tcHUsIGNoaXAtPm1wdV9pbywKIAkJCQkJQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzX21wdSkpOwotCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAtPnNhdmVkX3JlZ3Nfb3BsMywgY2hpcC0+b3BsM19pbywKKwlzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjaGlwLCBjaGlwLT5zYXZlZF9yZWdzX29wbDMsIGNoaXAtPm9wbDNfaW8sCiAJCQkJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19vcGwzKSk7CiAKIAlzbmRfYXpmMzMyOF9yZXN1bWVfYWM5NyhjaGlwKTsKIAotCXNuZF9hemYzMzI4X3Jlc3VtZV9yZWdzKGNoaXAtPnNhdmVkX3JlZ3NfY3RybCwgY2hpcC0+Y3RybF9pbywKKwlzbmRfYXpmMzMyOF9yZXN1bWVfcmVncyhjaGlwLCBjaGlwLT5zYXZlZF9yZWdzX2N0cmwsIGNoaXAtPmN0cmxfaW8sCiAJCQkJCUFSUkFZX1NJWkUoY2hpcC0+c2F2ZWRfcmVnc19jdHJsKSk7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCmluZGV4IDE4ODAyMDMuLjg1NDY3MTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9idDg3eC5jCisrKyBiL3NvdW5kL3BjaS9idDg3eC5jCkBAIC0yOTMsMTcgKzI5MywyMyBAQAogCQlQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfCBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWTsKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCBQQ0lfU1RBVFVTLCBwY2lfc3RhdHVzKTsKIAlpZiAocGNpX3N0YXR1cyAhPSBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQWllZWUgLSBQQ0kgZXJyb3IhIHN0YXR1cyAlIzA4eCwgUENJIHN0YXR1cyAlIzA0eFxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiQWllZWUgLSBQQ0kgZXJyb3IhIHN0YXR1cyAlIzA4eCwgUENJIHN0YXR1cyAlIzA0eFxuIiwKIAkJCSAgIHN0YXR1cyAmIEVSUk9SX0lOVEVSUlVQVFMsIHBjaV9zdGF0dXMpOwogCWVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBaWVlZSAtIFBDSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQhXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiQWllZWUgLSBQQ0kgcGFyaXR5IGVycm9yIGRldGVjdGVkIVxuIik7CiAJCS8qIGVycm9yICdoYW5kbGluZycgc2ltaWxhciB0byBhaWM3eHh4X3BjaS5jOiAqLwogCQljaGlwLT5wY2lfcGFyaXR5X2Vycm9ycysrOwogCQlpZiAoY2hpcC0+cGNpX3Bhcml0eV9lcnJvcnMgPiAyMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVG9vIG1hbnkgUENJIHBhcml0eSBlcnJvcnMgb2JzZXJ2ZWQuXG4iKTsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlNvbWUgZGV2aWNlIG9uIHRoaXMgYnVzIGlzIGdlbmVyYXRpbmcgYmFkIHBhcml0eS5cbiIpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVGhpcyBpcyBhbiBlcnJvciAqb2JzZXJ2ZWQgYnkqLCBub3QgKmdlbmVyYXRlZCBieSosIHRoaXMgY2FyZC5cbiIpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiUENJIHBhcml0eSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkaXNhYmxlZC5cbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIlRvbyBtYW55IFBDSSBwYXJpdHkgZXJyb3JzIG9ic2VydmVkLlxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiU29tZSBkZXZpY2Ugb24gdGhpcyBidXMgaXMgZ2VuZXJhdGluZyBiYWQgcGFyaXR5LlxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiVGhpcyBpcyBhbiBlcnJvciAqb2JzZXJ2ZWQgYnkqLCBub3QgKmdlbmVyYXRlZCBieSosIHRoaXMgY2FyZC5cbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIlBDSSBwYXJpdHkgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZGlzYWJsZWQuXG4iKTsKIAkJCWNoaXAtPmludGVycnVwdF9tYXNrICY9IH4oSU5UX1BQRVJSIHwgSU5UX1JJUEVSUik7CiAJCQlzbmRfYnQ4N3hfd3JpdGVsKGNoaXAsIFJFR19JTlRfTUFTSywgY2hpcC0+aW50ZXJydXB0X21hc2spOwogCQl9CkBAIC0zMjMsOSArMzI5LDExIEBACiAKIAlpZiAoaXJxX3N0YXR1cyAmIEVSUk9SX0lOVEVSUlVQVFMpIHsKIAkJaWYgKGlycV9zdGF0dXMgJiAoSU5UX0ZCVVMgfCBJTlRfRlRSR1QpKQotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkZJRk8gb3ZlcnJ1biwgc3RhdHVzICUjMDh4XG4iLCBzdGF0dXMpOworCQkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSAiRklGTyBvdmVycnVuLCBzdGF0dXMgJSMwOHhcbiIsIHN0YXR1cyk7CiAJCWlmIChpcnFfc3RhdHVzICYgSU5UX09DRVJSKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZXJuYWwgUklTQyBlcnJvciwgc3RhdHVzICUjMDh4XG4iLCBzdGF0dXMpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImludGVybmFsIFJJU0MgZXJyb3IsIHN0YXR1cyAlIzA4eFxuIiwgc3RhdHVzKTsKIAkJaWYgKGlycV9zdGF0dXMgJiAoSU5UX1BQRVJSIHwgSU5UX1JJUEVSUiB8IElOVF9QQUJPUlQpKQogCQkJc25kX2J0ODd4X3BjaV9lcnJvcihjaGlwLCBpcnFfc3RhdHVzKTsKIAl9CkBAIC03NDcsNyArNzU1LDcgQEAKIAl9CiAJY2hpcC0+bW1pbyA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDApOwogCWlmICghY2hpcC0+bW1pbykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVtYXAgaW8gbWVtb3J5XG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgcmVtYXAgaW8gbWVtb3J5XG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTc2Miw3ICs3NzAsNyBAQAogCWVyciA9IHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYnQ4N3hfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCSAgS0JVSUxEX01PRE5BTUUsIGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBncmFiIGlycSAlZFxuIiwgcGNpLT5pcnEpOwogCQlnb3RvIGZhaWw7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpAQCAtNzczLDcgKzc4MSw2IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZmFpbDsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAkqcmNoaXAgPSBjaGlwOwogCXJldHVybiAwOwogCkBAIC04NTEsMTQgKzg1OCwxNSBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJsYWNrbGlzdCk7ICsraSkKIAkJaWYgKGJsYWNrbGlzdFtpXS5zdWJ2ZW5kb3IgPT0gcGNpLT5zdWJzeXN0ZW1fdmVuZG9yICYmCiAJCSAgICBibGFja2xpc3RbaV0uc3ViZGV2aWNlID09IHBjaS0+c3Vic3lzdGVtX2RldmljZSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYXJkICUjMDR4LSUjMDR4OiUjMDR4IGhhcyBubyBhdWRpb1xuIiwKKwkJCWRldl9kYmcoJnBjaS0+ZGV2LAorCQkJCSJjYXJkICUjMDR4LSUjMDR4OiUjMDR4IGhhcyBubyBhdWRpb1xuIiwKIAkJCQkgICAgcGNpLT5kZXZpY2UsIHBjaS0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAotCXNuZF9wcmludGsoS0VSTl9JTkZPICJ1bmtub3duIGNhcmQgJSMwNHgtJSMwNHg6JSMwNHhcbiIsCisJZGV2X2luZm8oJnBjaS0+ZGV2LCAidW5rbm93biBjYXJkICUjMDR4LSUjMDR4OiUjMDR4XG4iLAogCQkgICBwY2ktPmRldmljZSwgcGNpLT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUsIGFuZCwgIgorCWRldl9pbmZvKCZwY2ktPmRldiwgInBsZWFzZSBtYWlsIGlkLCBib2FyZCBuYW1lLCBhbmQsICIKIAkJICAgImlmIGl0IHdvcmtzLCB0aGUgY29ycmVjdCBkaWdpdGFsX3JhdGUgb3B0aW9uIHRvICIKIAkJICAgIjxhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmc+XG4iKTsKIAlyZXR1cm4gU05EX0JUODdYX0JPQVJEX1VOS05PV047CkBAIC04ODgsNyArODk2LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTkyNSw3ICs5MzQsNyBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gX2Vycm9yOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiYnQ4N3glZDogVXNpbmcgYm9hcmQgJWQsICVzYW5hbG9nLCAlc2RpZ2l0YWwgIgorCWRldl9pbmZvKGNhcmQtPmRldiwgImJ0ODd4JWQ6IFVzaW5nIGJvYXJkICVkLCAlc2FuYWxvZywgJXNkaWdpdGFsICIKIAkJICAgIihyYXRlICVkIEh6KVxuIiwgZGV2LCBib2FyZGlkLAogCQkgICBjaGlwLT5ib2FyZC5ub19hbmFsb2cgPyAibm8gIiA6ICIiLAogCQkgICBjaGlwLT5ib2FyZC5ub19kaWdpdGFsID8gIm5vICIgOiAiIiwgY2hpcC0+Ym9hcmQuZGlnX3JhdGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCmluZGV4IGY0ZGI1NTguLmY5NGNjNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKQEAgLTQxNywxMyArNDE3LDEzIEBACiAJaW50IHN0YXR1czsKIAlpbnQgcmV0cnk7CiAJaWYgKChyZWcgPiAweDdmKSB8fCAodmFsdWUgPiAweDFmZikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaTJjX3dyaXRlOiBpbnZhbGlkIHZhbHVlcy5cbiIpOworCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LCAiaTJjX3dyaXRlOiBpbnZhbGlkIHZhbHVlcy5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl0bXAgPSByZWcgPDwgMjUgfCB2YWx1ZSA8PCAxNjsKIAkvKgotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiSTJDLXdyaXRlOnJlZz0weCV4LCB2YWx1ZT0weCV4XG4iLCByZWcsIHZhbHVlKTsKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiSTJDLXdyaXRlOnJlZz0weCV4LCB2YWx1ZT0weCV4XG4iLCByZWcsIHZhbHVlKTsKIAkqLwogCS8qIE5vdCBzdXJlIHdoYXQgdGhpcyBJMkMgY2hhbm5lbCBjb250cm9scy4gKi8KIAkvKiBzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIEkyQ19EMCwgMCwgdG1wKTsgKi8KQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQkvKiBXYWl0IHRpbGwgdGhlIHRyYW5zYWN0aW9uIGVuZHMgKi8KIAkJd2hpbGUgKDEpIHsKIAkJCXN0YXR1cyA9IHNuZF9jYTAxMDZfcHRyX3JlYWQoZW11LCBJMkNfQSwgMCk7Ci0JCQkvKnNuZF9wcmludGsoS0VSTl9ERUJVRyAiSTJDOnN0YXR1cz0weCV4XG4iLCBzdGF0dXMpOyovCisJCQkvKmRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJJMkM6c3RhdHVzPTB4JXhcbiIsIHN0YXR1cyk7Ki8KIAkJCXRpbWVvdXQrKzsKIAkJCWlmICgoc3RhdHVzICYgSTJDX0FfQURDX1NUQVJUKSA9PSAwKQogCQkJCWJyZWFrOwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJfQogCiAJaWYgKHJldHJ5ID09IDEwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIldyaXRpbmcgdG8gQURDIGZhaWxlZCFcbiIpOworCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LCAiV3JpdGluZyB0byBBREMgZmFpbGVkIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KICAgICAKQEAgLTUxNiw3ICs1MTYsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBzbmRfY2EwMTA2X2NoYW5uZWxfZGFjKHN0cnVjdCBzbmRfY2EwMTA2X2RldGFpbHMgKmRldGFpbHMsCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfY2hhbm5lbF9kYWMoc3RydWN0IHNuZF9jYTAxMDYgKmNoaXAsCisJCQkJICBzdHJ1Y3Qgc25kX2NhMDEwNl9kZXRhaWxzICpkZXRhaWxzLAogCQkJCSAgaW50IGNoYW5uZWxfaWQpCiB7CiAJc3dpdGNoIChjaGFubmVsX2lkKSB7CkBAIC01MjksNyArNTMwLDcgQEAKIAljYXNlIFBDTV9VTktOT1dOX0NIQU5ORUw6CiAJCXJldHVybiAoZGV0YWlscy0+c3BpX2RhYyAmIDB4MDAwZikgPj4gKDQgKiAwKTsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImNhMDEwNjogdW5rbm93biBjaGFubmVsX2lkICVkXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNhMDEwNjogdW5rbm93biBjaGFubmVsX2lkICVkXG4iLAogCQkJICAgY2hhbm5lbF9pZCk7CiAJfQogCXJldHVybiAwOwpAQCAtNTM5LDcgKzU0MCw3IEBACiAJCQkJICAgIGludCBwb3dlcikKIHsKIAlpZiAoY2hpcC0+ZGV0YWlscy0+c3BpX2RhYykgewotCQljb25zdCBpbnQgZGFjID0gc25kX2NhMDEwNl9jaGFubmVsX2RhYyhjaGlwLT5kZXRhaWxzLAorCQljb25zdCBpbnQgZGFjID0gc25kX2NhMDEwNl9jaGFubmVsX2RhYyhjaGlwLCBjaGlwLT5kZXRhaWxzLAogCQkJCQkJICAgICAgIGNoYW5uZWxfaWQpOwogCQljb25zdCBpbnQgcmVnID0gc3BpX2RhY2RfcmVnW2RhY107CiAJCWNvbnN0IGludCBiaXQgPSBzcGlfZGFjZF9iaXRbZGFjXTsKQEAgLTU4Myw3ICs1ODQsNyBAQAogCiAJY2hhbm5lbC0+dXNlID0gMTsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCiAJICAgICAgIGNoYW5uZWxfaWQsIGNoaXAsIGNoYW5uZWwpOwogCSovCiAgICAgICAgIC8vY2hhbm5lbC0+aW50ZXJydXB0ID0gc25kX2NhMDEwNl9wY21fY2hhbm5lbF9pbnRlcnJ1cHQ7CkBAIC02NjAsNyArNjYxLDggQEAKIAogCWVwY20gPSBremFsbG9jKHNpemVvZigqZXBjbSksIEdGUF9LRVJORUwpOwogCWlmIChlcGNtID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAib3Blbl9jYXB0dXJlX2NoYW5uZWw6IGZhaWxlZCBlcGNtIGFsbG9jXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkib3Blbl9jYXB0dXJlX2NoYW5uZWw6IGZhaWxlZCBlcGNtIGFsbG9jXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAgICAgICAgIH0KIAllcGNtLT5lbXUgPSBjaGlwOwpAQCAtNjc3LDcgKzY3OSw3IEBACiAKIAljaGFubmVsLT51c2UgPSAxOwogCS8qCi0gICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCiAJICAgICAgIGNoYW5uZWxfaWQsIGNoaXAsIGNoYW5uZWwpOwogCSovCiAgICAgICAgIC8vY2hhbm5lbC0+aW50ZXJydXB0ID0gc25kX2NhMDEwNl9wY21fY2hhbm5lbF9pbnRlcnJ1cHQ7CkBAIC03NzEsNyArNzczLDcgQEAKIAlpbnQgaTsKIAkKICNpZiAwIC8qIGRlYnVnICovCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKIAkJICAgInByZXBhcmU6Y2hhbm5lbF9udW1iZXI9JWQsIHJhdGU9JWQsIGZvcm1hdD0weCV4LCAiCiAJCSAgICJjaGFubmVscz0lZCwgYnVmZmVyX3NpemU9JWxkLCBwZXJpb2Rfc2l6ZT0lbGQsICIKIAkJICAgInBlcmlvZHM9JXUsIGZyYW1lc190b19ieXRlcz0lZFxuIiwKQEAgLTc3OSw5ICs3ODEsMTEgQEAKIAkJICAgcnVudGltZS0+Y2hhbm5lbHMsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLAogCQkgICBydW50aW1lLT5wZXJpb2Rfc2l6ZSwgcnVudGltZS0+cGVyaW9kcywKIAkJICAgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDEpKTsKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgdGFibGVfYmFzZT0lcFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCB0YWJsZV9iYXNlPSVwXG4iLAogCQkgICBydW50aW1lLT5kbWFfYWRkciwgcnVudGltZS0+ZG1hX2FyZWEsIHRhYmxlX2Jhc2UpOwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCBkbWFfYnl0ZXMoc2l6ZSk9JXhcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgZG1hX2J5dGVzKHNpemUpPSV4XG4iLAogCQkgICBlbXUtPmJ1ZmZlci5hZGRyLCBlbXUtPmJ1ZmZlci5hcmVhLCBlbXUtPmJ1ZmZlci5ieXRlcyk7CiAjZW5kaWYgLyogZGVidWcgKi8KIAkvKiBSYXRlIGNhbiBiZSBzZXQgcGVyIGNoYW5uZWwuICovCkBAIC04NzYsNyArODgwLDcgQEAKIAl1MzIgcmVnNzE7CiAJCiAjaWYgMCAvKiBkZWJ1ZyAqLwotCXNuZF9wcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJCSAgICJwcmVwYXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCBmb3JtYXQ9MHgleCwgIgogCQkgICAiY2hhbm5lbHM9JWQsIGJ1ZmZlcl9zaXplPSVsZCwgcGVyaW9kX3NpemU9JWxkLCAiCiAJCSAgICJwZXJpb2RzPSV1LCBmcmFtZXNfdG9fYnl0ZXM9JWRcbiIsCkBAIC04ODQsOSArODg4LDExIEBACiAJCSAgIHJ1bnRpbWUtPmNoYW5uZWxzLCBydW50aW1lLT5idWZmZXJfc2l6ZSwKIAkJICAgcnVudGltZS0+cGVyaW9kX3NpemUsIHJ1bnRpbWUtPnBlcmlvZHMsCiAJCSAgIGZyYW1lc190b19ieXRlcyhydW50aW1lLCAxKSk7Ci0gICAgICAgIHNuZF9wcmludGsoS0VSTl9ERUJVRyAiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCB0YWJsZV9iYXNlPSVwXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIHRhYmxlX2Jhc2U9JXBcbiIsCiAJCSAgIHJ1bnRpbWUtPmRtYV9hZGRyLCBydW50aW1lLT5kbWFfYXJlYSwgdGFibGVfYmFzZSk7Ci0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIGRtYV9ieXRlcyhzaXplKT0leFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkiZG1hX2FkZHI9JXgsIGRtYV9hcmVhPSVwLCBkbWFfYnl0ZXMoc2l6ZSk9JXhcbiIsCiAJCSAgIGVtdS0+YnVmZmVyLmFkZHIsIGVtdS0+YnVmZmVyLmFyZWEsIGVtdS0+YnVmZmVyLmJ5dGVzKTsKICNlbmRpZiAvKiBkZWJ1ZyAqLwogCS8qIHJlZzcxIGNvbnRyb2xzIEFEQyByYXRlLiAqLwpAQCAtOTM0LDcgKzk0MCw3IEBACiAKIAogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAogCSAgICAgICAicHJlcGFyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgZm9ybWF0PTB4JXgsIGNoYW5uZWxzPSVkLCAiCiAJICAgICAgICJidWZmZXJfc2l6ZT0lbGQsIHBlcmlvZF9zaXplPSVsZCwgZnJhbWVzX3RvX2J5dGVzPSVkXG4iLAogCSAgICAgICBjaGFubmVsLCBydW50aW1lLT5yYXRlLCBydW50aW1lLT5mb3JtYXQsIHJ1bnRpbWUtPmNoYW5uZWxzLApAQCAtOTgyLDEzICs5ODgsMTMgQEAKIAkJcnVudGltZSA9IHMtPnJ1bnRpbWU7CiAJCWVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCWNoYW5uZWwgPSBlcGNtLT5jaGFubmVsX2lkOwotCQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImNoYW5uZWw9JWRcbiIsIGNoYW5uZWwpOyAqLworCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7ICovCiAJCWVwY20tPnJ1bm5pbmcgPSBydW5uaW5nOwogCQliYXNpYyB8PSAoMHgxIDw8IGNoYW5uZWwpOwogCQlleHRlbmRlZCB8PSAoMHgxMCA8PCBjaGFubmVsKTsKICAgICAgICAgICAgICAgICBzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwogICAgICAgICB9Ci0JLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJiYXNpYz0weCV4LCBleHRlbmRlZD0weCV4XG4iLGJhc2ljLCBleHRlbmRlZCk7ICovCisJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImJhc2ljPTB4JXgsIGV4dGVuZGVkPTB4JXhcbiIsYmFzaWMsIGV4dGVuZGVkKTsgKi8KIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKQEAgLTEwNzAsNyArMTA3Niw3IEBACiAJCQlyZXR1cm4gcHRyOwogCQlwcmV2X3B0ciA9IHB0cjsKIAl9IHdoaWxlICgtLXRpbWVvdXQpOwotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJjYTAxMDY6IHVuc3RhYmxlIERNQSBwb2ludGVyIVxuIik7CisJZGV2X3dhcm4oZW11LT5jYXJkLT5kZXYsICJjYTAxMDY6IHVuc3RhYmxlIERNQSBwb2ludGVyIVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTMsNyArMTA5OSw3IEBACiAgICAgICAgIGlmIChwdHIgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCiAJCXB0ciAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgIgorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJwdHIxID0gMHglbHgsIHB0cjI9MHglbHgsIHB0cj0weCVseCwgIgogCSAgICAgICAiYnVmZmVyX3NpemUgPSAweCV4LCBwZXJpb2Rfc2l6ZSA9IDB4JXgsIGJpdHM9JWQsIHJhdGU9JWRcbiIsCiAJICAgICAgIHB0cjEsIHB0cjIsIHB0ciwgKGludClydW50aW1lLT5idWZmZXJfc2l6ZSwKIAkgICAgICAgKGludClydW50aW1lLT5wZXJpb2Rfc2l6ZSwgKGludClydW50aW1lLT5mcmFtZV9iaXRzLApAQCAtMTI4NCw5ICsxMjkwLDkgQEAKIAogICAgICAgICBzdGF0NzYgPSBzbmRfY2EwMTA2X3B0cl9yZWFkKGNoaXAsIEVYVEVOREVEX0lOVCwgMCk7CiAJLyoKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImludGVycnVwdCBzdGF0dXMgPSAweCUwOHgsIHN0YXQ3Nj0weCUwOHhcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImludGVycnVwdCBzdGF0dXMgPSAweCUwOHgsIHN0YXQ3Nj0weCUwOHhcbiIsCiAJCSAgIHN0YXR1cywgc3RhdDc2KTsKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInB0cj0weCUwOHhcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInB0cj0weCUwOHhcbiIsCiAJCSAgIHNuZF9jYTAxMDZfcHRyX3JlYWQoY2hpcCwgUExBWUJBQ0tfUE9JTlRFUiwgMCkpOwogCSovCiAgICAgICAgIG1hc2sgPSAweDExOyAvKiAweDEgZm9yIG9uZSBoYWxmLCAweDEwIGZvciB0aGUgb3RoZXIgaGFsZiBwZXJpb2QuICovCkBAIC0xMjk2LDExICsxMzAyLDEzIEBACiAvKiBGSVhNRTogU2VsZWN0IHRoZSBjb3JyZWN0IHN1YnN0cmVhbSBmb3IgcGVyaW9kIGVsYXBzZWQgKi8KIAkJCWlmKHBjaGFubmVsLT51c2UpIHsKIAkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBjaGFubmVsLT5lcGNtLT5zdWJzdHJlYW0pOwotCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7CisJCQkJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImludGVycnVwdCBbJWRdIHVzZWRcbiIsIGkpOyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCQl9Ci0JICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImNoYW5uZWw9JXBcbiIscGNoYW5uZWwpOwotCSAgICAgICAgLy9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgc3RhdDc2WyVkXSA9ICUwOHgsIHVzZT0lZCwgY2hhbm5lbD0lZFxuIiwgaSwgc3RhdDc2LCBwY2hhbm5lbC0+dXNlLCBwY2hhbm5lbC0+bnVtYmVyKTsKKwkJLyoKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImNoYW5uZWw9JXBcbiIsIHBjaGFubmVsKTsKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQkqLwogCQltYXNrIDw8PSAxOwogCX0KICAgICAgICAgbWFzayA9IDB4MTEwMDAwOyAvKiAweDEgZm9yIG9uZSBoYWxmLCAweDEwIGZvciB0aGUgb3RoZXIgaGFsZiBwZXJpb2QuICovCkBAIC0xMzEwLDExICsxMzE4LDEzIEBACiAvKiBGSVhNRTogU2VsZWN0IHRoZSBjb3JyZWN0IHN1YnN0cmVhbSBmb3IgcGVyaW9kIGVsYXBzZWQgKi8KIAkJCWlmKHBjaGFubmVsLT51c2UpIHsKIAkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBjaGFubmVsLT5lcGNtLT5zdWJzdHJlYW0pOwotCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaW50ZXJydXB0IFslZF0gdXNlZFxuIiwgaSk7CisJCQkJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImludGVycnVwdCBbJWRdIHVzZWRcbiIsIGkpOyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCQl9Ci0JICAgICAgICAvL3ByaW50ayhLRVJOX0lORk8gImNoYW5uZWw9JXBcbiIscGNoYW5uZWwpOwotCSAgICAgICAgLy9wcmludGsoS0VSTl9JTkZPICJpbnRlcnJ1cHQgc3RhdDc2WyVkXSA9ICUwOHgsIHVzZT0lZCwgY2hhbm5lbD0lZFxuIiwgaSwgc3RhdDc2LCBwY2hhbm5lbC0+dXNlLCBwY2hhbm5lbC0+bnVtYmVyKTsKKwkJLyoKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImNoYW5uZWw9JXBcbiIsIHBjaGFubmVsKTsKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImludGVycnVwdCBzdGF0NzZbJWRdID0gJTA4eCwgdXNlPSVkLCBjaGFubmVsPSVkXG4iLCBpLCBzdGF0NzYsIHBjaGFubmVsLT51c2UsIHBjaGFubmVsLT5udW1iZXIpOworCQkqLwogCQltYXNrIDw8PSAxOwogCX0KIApAQCAtMTYwMyw3ICsxNjEzLDcgQEAKIAkJaW50IHNpemUsIG47CiAKIAkJc2l6ZSA9IEFSUkFZX1NJWkUoaTJjX2FkY19pbml0KTsKLQkJLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJJMkM6YXJyYXkgc2l6ZT0weCV4XG4iLCBzaXplKTsgKi8KKwkJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgIkkyQzphcnJheSBzaXplPTB4JXhcbiIsIHNpemUpOyAqLwogCQlmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbisrKQogCQkJc25kX2NhMDEwNl9pMmNfd3JpdGUoY2hpcCwgaTJjX2FkY19pbml0W25dWzBdLAogCQkJCQkgICAgIGkyY19hZGNfaW5pdFtuXVsxXSk7CkBAIC0xNjY4LDcgKzE2NzgsNyBAQAogCQlyZXR1cm4gZXJyOwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSkgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVycm9yIHRvIHNldCAzMmJpdCBtYXNrIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgdG8gc2V0IDMyYml0IG1hc2sgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMTY4OSwxNCArMTY5OSwxNCBAQAogCWNoaXAtPnJlc19wb3J0ID0gcmVxdWVzdF9yZWdpb24oY2hpcC0+cG9ydCwgMHgyMCwgInNuZF9jYTAxMDYiKTsKIAlpZiAoIWNoaXAtPnJlc19wb3J0KSB7CiAJCXNuZF9jYTAxMDZfZnJlZShjaGlwKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgYWxsb2NhdGUgdGhlIHBvcnRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgcG9ydFxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY2EwMTA2X2ludGVycnVwdCwKIAkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJc25kX2NhMDEwNl9mcmVlKGNoaXApOwotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGdyYWIgaXJxXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7CkBAIC0xNzEyLDcgKzE3MjIsNyBAQAogCS8qIHJlYWQgc2VyaWFsICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZjaGlwLT5zZXJpYWwpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJmNoaXAtPm1vZGVsKTsKLQlwcmludGsoS0VSTl9JTkZPICJzbmQtY2EwMTA2OiBNb2RlbCAlMDR4IFJldiAlMDh4IFNlcmlhbCAlMDh4XG4iLAorCWRldl9pbmZvKGNhcmQtPmRldiwgIk1vZGVsICUwNHggUmV2ICUwOHggU2VyaWFsICUwOHhcbiIsCiAJICAgICAgIGNoaXAtPm1vZGVsLCBwY2ktPnJldmlzaW9uLCBjaGlwLT5zZXJpYWwpOwogCXN0cmNweShjYXJkLT5kcml2ZXIsICJDQTAxMDYiKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiQ0EwMTA2Iik7CkBAIC0xNzI2LDcgKzE3MzYsNyBAQAogCX0KIAljaGlwLT5kZXRhaWxzID0gYzsKIAlpZiAoc3Vic3lzdGVtW2Rldl0pIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic25kLWNhMDEwNjogU291bmQgY2FyZCBuYW1lPSVzLCAiCisJCWRldl9pbmZvKGNhcmQtPmRldiwgIlNvdW5kIGNhcmQgbmFtZT0lcywgIgogCQkgICAgICAgInN1YnN5c3RlbT0weCV4LiBGb3JjZWQgdG8gc3Vic3lzdGVtPTB4JXhcbiIsCiAJCSAgICAgICBjLT5uYW1lLCBjaGlwLT5zZXJpYWwsIHN1YnN5c3RlbVtkZXZdKTsKIAl9CkBAIC0xODQzLDcgKzE4NTMsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTg2OCwxOCArMTg3OSwxNiBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwogCi0Jc25kX3ByaW50ZGQoImNhMDEwNjogcHJvYmUgZm9yIE1JREkgY2hhbm5lbCBBIC4uLiIpOworCWRldl9kYmcoY2FyZC0+ZGV2LCAicHJvYmUgZm9yIE1JREkgY2hhbm5lbCBBIC4uLiIpOwogCWVyciA9IHNuZF9jYTAxMDZfbWlkaShjaGlwLCBDQTAxMDZfTUlESV9DSEFOX0EpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwotCXNuZF9wcmludGRkKCIgZG9uZS5cbiIpOworCWRldl9kYmcoY2FyZC0+ZGV2LCAiIGRvbmUuXG4iKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJc25kX2NhMDEwNl9wcm9jX2luaXQoY2hpcCk7CiAjZW5kaWYKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYV9taWRpLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYwppbmRleCA4YmJkZjI2Li5iOTFjN2Y2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYwpAQCAtNDYsNyArNDYsNyBAQAogCQljYV9taWRpX3JlYWRfZGF0YShtaWRpKTsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJaWYgKHRpbWVvdXQgPD0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FfbWlkaV9jbGVhcl9yeDogdGltZW91dCAoc3RhdHVzID0gMHgleClcbiIsCisJCXByX2VycigiY2FfbWlkaV9jbGVhcl9yeDogdGltZW91dCAoc3RhdHVzID0gMHgleClcbiIsCiAJCQkgICBjYV9taWRpX3JlYWRfc3RhdChtaWRpKSk7CiAjZW5kaWYKIH0KQEAgLTExMyw3ICsxMTMsNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpLT5pbnB1dF9sb2NrLCBmbGFncyk7CiAJaWYgKCFvaykKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FfbWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JXggKHN0YXR1cyA9IDB4JXgsIGRhdGEgPSAweCV4KSEhIVxuIiwKKwkJcHJfZXJyKCJjYV9taWRpX2NtZDogMHgleCBmYWlsZWQgYXQgMHgleCAoc3RhdHVzID0gMHgleCwgZGF0YSA9IDB4JXgpISEhXG4iLAogCQkJICAgY21kLAogCQkJICAgbWlkaS0+Z2V0X2Rldl9pZF9wb3J0KG1pZGktPmRldl9pZCksCiAJCQkgICBjYV9taWRpX3JlYWRfc3RhdChtaWRpKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCAyNzU1ZWM1Li4xMmMzMThlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC03OTYsNyArNzk2LDcgQEAKIAlpZiAocnVudGltZS0+Y2hhbm5lbHMgPiAxKQogCQlyZWMtPmZtdCB8PSAweDAxOwogCWlmIChyZWMtPmlzX2RhYyAmJiBzZXRfZGFjX2NoYW5uZWxzKGNtLCByZWMsIHJ1bnRpbWUtPmNoYW5uZWxzKSA8IDApIHsKLQkJc25kX3ByaW50ZCgiY2Fubm90IHNldCBkYWMgY2hhbm5lbHNcbiIpOworCQlkZXZfZGJnKGNtLT5jYXJkLT5kZXYsICJjYW5ub3Qgc2V0IGRhYyBjaGFubmVsc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODI3LDcgKzgyNyw3IEBACiAJZWxzZQogCQljbS0+Y3RybCB8PSB2YWw7CiAJc25kX2NtaXBjaV93cml0ZShjbSwgQ01fUkVHX0ZVTkNUUkwwLCBjbS0+Y3RybCk7Ci0JLy9zbmRfcHJpbnRkKCJjbWlwY2k6IGZ1bmN0cmwwID0gJTA4eFxuIiwgY20tPmN0cmwpOworCS8qIGRldl9kYmcoY20tPmNhcmQtPmRldiwgImZ1bmN0cmwwID0gJTA4eFxuIiwgY20tPmN0cmwpOyAqLwogCiAJLyogc2V0IHNhbXBsZSByYXRlICovCiAJZnJlcSA9IDA7CkBAIC04NTAsNyArODUwLDcgQEAKIAkJdmFsIHw9IChmcmVxIDw8IENNX0FTRkNfU0hJRlQpICYgQ01fQVNGQ19NQVNLOwogCX0KIAlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDEsIHZhbCk7Ci0JLy9zbmRfcHJpbnRkKCJjbWlwY2k6IGZ1bmN0cmwxID0gJTA4eFxuIiwgdmFsKTsKKwlkZXZfZGJnKGNtLT5jYXJkLT5kZXYsICJmdW5jdHJsMSA9ICUwOHhcbiIsIHZhbCk7CiAKIAkvKiBzZXQgZm9ybWF0ICovCiAJdmFsID0gc25kX2NtaXBjaV9yZWFkKGNtLCBDTV9SRUdfQ0hGT1JNQVQpOwpAQCAtODY2LDcgKzg2Niw3IEBACiAJCXZhbCB8PSBmcmVxX2V4dCA8PCAocmVjLT5jaCAqIDIpOwogCX0KIAlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfQ0hGT1JNQVQsIHZhbCk7Ci0JLy9zbmRfcHJpbnRkKCJjbWlwY2k6IGNoZm9ybWF0ID0gJTA4eFxuIiwgdmFsKTsKKwlkZXZfZGJnKGNtLT5jYXJkLT5kZXYsICJjaGZvcm1hdCA9ICUwOHhcbiIsIHZhbCk7CiAKIAlpZiAoIXJlYy0+aXNfZGFjICYmIGNtLT5jaGlwX3ZlcnNpb24pIHsKIAkJaWYgKHJ1bnRpbWUtPnJhdGUgPiA0NDEwMCkKQEAgLTkwNCw3ICs5MDQsNyBAQAogCQljbS0+Y3RybCB8PSBjaGVuOwogCQkvKiBlbmFibGUgY2hhbm5lbCAqLwogCQlzbmRfY21pcGNpX3dyaXRlKGNtLCBDTV9SRUdfRlVOQ1RSTDAsIGNtLT5jdHJsKTsKLQkJLy9zbmRfcHJpbnRkKCJjbWlwY2k6IGZ1bmN0cmwwID0gJTA4eFxuIiwgY20tPmN0cmwpOworCQlkZXZfZGJnKGNtLT5jYXJkLT5kZXYsICJmdW5jdHJsMCA9ICUwOHhcbiIsIGNtLT5jdHJsKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCQlyZWMtPnJ1bm5pbmcgPSAwOwpAQCAtOTUyLDcgKzk1Miw3IEBACiAJCWlmIChyZW0gPCByZWMtPmRtYV9zaXplKQogCQkJZ290byBvazsKIAl9IAotCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBpbnZhbGlkIFBDTSBwb2ludGVyOiAlI3hcbiIsIHJlbSk7CisJZGV2X2VycihjbS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBQQ00gcG9pbnRlcjogJSN4XG4iLCByZW0pOwogCXJldHVybiBTTkRSVl9QQ01fUE9TX1hSVU47CiBvazoKIAlwdHIgPSAocmVjLT5kbWFfc2l6ZSAtIChyZW0gKyAxKSkgPj4gcmVjLT5zaGlmdDsKQEAgLTI4ODksMTMgKzI4ODksMTMgQEAKIAl9CiAKIAlpZiAoIXIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY21pcGNpOiBjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CisJCWRldl93YXJuKGNtLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0c1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJY20tPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNtLT5jYXJkLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2Uocik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI5OTUsMTMgKzI5OTUsMTQgQEAKIAogCQlpZiAoc25kX29wbDNfY3JlYXRlKGNtLT5jYXJkLCBpb3N5bnRoLCBpb3N5bnRoICsgMiwKIAkJCQkgICAgT1BMM19IV19PUEwzLCAwLCAmb3BsMykgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogbm8gT1BMIGRldmljZSBhdCAlI2x4LCAiCi0JCQkgICAgICAgInNraXBwaW5nLi4uXG4iLCBpb3N5bnRoKTsKKwkJCWRldl9lcnIoY20tPmNhcmQtPmRldiwKKwkJCQkibm8gT1BMIGRldmljZSBhdCAlI2x4LCBza2lwcGluZy4uLlxuIiwKKwkJCQlpb3N5bnRoKTsKIAkJCWdvdG8gZGlzYWJsZV9mbTsKIAkJfQogCX0KIAlpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBjYW5ub3QgY3JlYXRlIE9QTDMgaHdkZXBcbiIpOworCQlkZXZfZXJyKGNtLT5jYXJkLT5kZXYsICJjYW5ub3QgY3JlYXRlIE9QTDMgaHdkZXBcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMwNjAsNyArMzA2MSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jbWlwY2lfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjbSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9jbWlwY2lfZnJlZShjbSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMzE5Miw4ICszMTkzLDkgQEAKIAkJCS8qIGVuYWJsZSBVQVJUICovCiAJCQlzbmRfY21pcGNpX3NldF9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwgQ01fVUFSVF9FTik7CiAJCQlpZiAoaW5iKGlvbWlkaSArIDEpID09IDB4ZmYpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZW5hYmxlIE1QVS00MDEgcG9ydCIKLQkJCQkJICAgIiBhdCAlI2x4XG4iLCBpb21pZGkpOworCQkJCWRldl9lcnIoY20tPmNhcmQtPmRldiwKKwkJCQkJImNhbm5vdCBlbmFibGUgTVBVLTQwMSBwb3J0IGF0ICUjbHhcbiIsCisJCQkJCWlvbWlkaSk7CiAJCQkJc25kX2NtaXBjaV9jbGVhcl9iaXQoY20sIENNX1JFR19GVU5DVFJMMSwKIAkJCQkJCSAgICAgQ01fVUFSVF9FTik7CiAJCQkJaW9taWRpID0gMDsKQEAgLTMyMzcsNyArMzIzOSw4IEBACiAJCQkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVEIDogMCkgfAogCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCiAJCQkJCSAgICAgICAtMSwgJmNtLT5ybWlkaSkpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjbWlwY2k6IG5vIFVBUlQ0MDEgZGV2aWNlIGF0IDB4JWx4XG4iLCBpb21pZGkpOworCQkJZGV2X2VycihjbS0+Y2FyZC0+ZGV2LAorCQkJCSJubyBVQVJUNDAxIGRldmljZSBhdCAweCVseFxuIiwgaW9taWRpKTsKIAkJfQogCX0KIApAQCAtMzI1NCw4ICszMjU3LDYgQEAKIAlpZiAoc25kX2NtaXBjaV9jcmVhdGVfZ2FtZXBvcnQoY20sIGRldikgPCAwKQogCQlzbmRfY21pcGNpX2NsZWFyX2JpdChjbSwgQ01fUkVHX0ZVTkNUUkwxLCBDTV9KWVNUS19FTik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNtaXBjaSA9IGNtOwogCXJldHVybiAwOwogfQpAQCAtMzI4MCw3ICszMjgxLDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJCkBAIC0zMzgxLDggKzMzODMsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0MjgxLmMgYi9zb3VuZC9wY2kvY3M0MjgxLmMKaW5kZXggMWRjNzkzZS4uNDNkMWY5MSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDI4MS5jCisrKyBiL3NvdW5kL3BjaS9jczQyODEuYwpAQCAtNTY0LDcgKzU2NCw4IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd3JpdGUgcHJvYmxlbSwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgd3JpdGUgcHJvYmxlbSwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2NzNDI4MV9hYzk3X3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LApAQCAtNjI0LDcgKzYyNSw4IEBACiAJCQlnb3RvIF9fb2sxOwogCX0KIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleFxuIiwgcmVnKTsKIAlyZXN1bHQgPSAweGZmZmY7CiAJZ290byBfX2VuZDsKIAkKQEAgLTY0Myw3ICs2NDUsOCBAQAogCQl1ZGVsYXkoMTApOwogCX0KIAkKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyByZWFkIHByb2JsZW0gKEFDU1RTX1ZTVFMpLCByZWcgPSAweCV4XG4iLCByZWcpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgcmVnID0gMHgleFxuIiwgcmVnKTsKIAlyZXN1bHQgPSAweGZmZmY7CiAJZ290byBfX2VuZDsKIApAQCAtODM1LDggKzgzOCw5IEBACiAJc3RydWN0IGNzNDI4MSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgIkRDQyA9IDB4JXgsIGJ1ZmZlcl9zaXplID0gMHgleCwgamlmZmllcyA9ICVsaVxuIiwKLQkgICAgICAgc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIGRtYS0+cmVnRENDKSwgcnVudGltZS0+YnVmZmVyX3NpemUsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJEQ0MgPSAweCV4LCBidWZmZXJfc2l6ZSA9IDB4JXgsIGppZmZpZXMgPSAlbGlcbiIsCisJCXNuZF9jczQyODFfcGVla0JBMChjaGlwLCBkbWEtPnJlZ0RDQyksIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLAogCSAgICAgICBqaWZmaWVzKTsKIAkqLwogCXJldHVybiBydW50aW1lLT5idWZmZXJfc2l6ZSAtCkBAIC0xMjY1LDcgKzEyNjksOCBAQAogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0MjgxOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMzYxLDcgKzEzNjYsNyBAQAogCWNoaXAtPmlycSA9IC0xOwogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAJaWYgKGR1YWxfY29kZWMgPCAwIHx8IGR1YWxfY29kZWMgPiAzKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgZHVhbF9jb2RlYyBvcHRpb24gJWRcbiIsIGR1YWxfY29kZWMpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImludmFsaWQgZHVhbF9jb2RlYyBvcHRpb24gJWRcbiIsIGR1YWxfY29kZWMpOwogCQlkdWFsX2NvZGVjID0gMDsKIAl9CiAJY2hpcC0+ZHVhbF9jb2RlYyA9IGR1YWxfY29kZWM7CkBAIC0xMzgzLDcgKzEzODgsNyBAQAogCQogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2NzNDI4MV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfY3M0MjgxX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTE0MDIsOCArMTQwNyw2IEBACiAKIAlzbmRfY3M0MjgxX3Byb2NfaW5pdChjaGlwKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDI1LDcgKzE0MjgsOCBAQAogCQlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0NGTFIsIEJBMF9DRkxSX0RFRkFVTFQpOwogCQl0bXAgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0NGTFIpOwogCQlpZiAodG1wICE9IEJBMF9DRkxSX0RFRkFVTFQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNGTFIgc2V0dXAgZmFpbGVkICgweCV4KVxuIiwgdG1wKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJDRkxSIHNldHVwIGZhaWxlZCAoMHgleClcbiIsIHRtcCk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KQEAgLTE0MzYsMTEgKzE0NDAsMTMgQEAKIAlzbmRfY3M0MjgxX3Bva2VCQTAoY2hpcCwgQkEwX0NXUFIsIDB4NDI4MSk7CiAJCiAJaWYgKCh0bXAgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX1NFUkMxKSkgIT0gKEJBMF9TRVJDMV9TTzFFTiB8IEJBMF9TRVJDMV9BQzk3KSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTRVJDMSBBQyc5NyBjaGVjayBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJTRVJDMSBBQyc5NyBjaGVjayBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWYgKCh0bXAgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX1NFUkMyKSkgIT0gKEJBMF9TRVJDMl9TSTFFTiB8IEJBMF9TRVJDMl9BQzk3KSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTRVJDMiBBQyc5NyBjaGVjayBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJTRVJDMiBBQyc5NyBjaGVjayBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE1MDIsNyArMTUwOCw3IEBACiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIkRMTFJEWSBub3Qgc2VlblxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJETExSRFkgbm90IHNlZW5cbiIpOwogCXJldHVybiAtRUlPOwogCiAgICAgICBfX29rMDoKQEAgLTE1MjgsNyArMTUzNCw5IEBACiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIm5ldmVyIHJlYWQgY29kZWMgcmVhZHkgZnJvbSBBQyc5NyAoMHgleClcbiIsIHNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQUNTVFMpKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIm5ldmVyIHJlYWQgY29kZWMgcmVhZHkgZnJvbSBBQyc5NyAoMHgleClcbiIsCisJCXNuZF9jczQyODFfcGVla0JBMChjaGlwLCBCQTBfQUNTVFMpKTsKIAlyZXR1cm4gLUVJTzsKIAogICAgICAgX19vazE6CkBAIC0xNTM5LDcgKzE1NDcsOCBAQAogCQkJCWdvdG8gX19jb2RlYzJfb2s7CiAJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAkJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAic2Vjb25kYXJ5IGNvZGVjIGRvZXNuJ3QgcmVzcG9uZC4gZGlzYWJsZSBpdC4uLlxuIik7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAic2Vjb25kYXJ5IGNvZGVjIGRvZXNuJ3QgcmVzcG9uZC4gZGlzYWJsZSBpdC4uLlxuIik7CiAJCWNoaXAtPmR1YWxfY29kZWMgPSAwOwogCV9fY29kZWMyX29rOiA7CiAJfQpAQCAtMTU2OSw3ICsxNTc4LDcgQEAKIAogCWlmICgtLXJldHJ5X2NvdW50ID4gMCkKIAkJZ290byBfX3JldHJ5OwotCXNuZF9wcmludGsoS0VSTl9FUlIgIm5ldmVyIHJlYWQgSVNWMyBhbmQgSVNWNCBmcm9tIEFDJzk3XG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5ldmVyIHJlYWQgSVNWMyBhbmQgSVNWNCBmcm9tIEFDJzk3XG4iKTsKIAlyZXR1cm4gLUVJTzsKIAogICAgICAgX19vazI6CkBAIC0xOTE3LDcgKzE5MjYsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjA1NSw4ICsyMDY1LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDI4MTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKaW5kZXggYjAzNDk4My4uYWYwZWFjYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCkBAIC04OCw3ICs4OCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmICgoZXJyID0gc25kX2NzNDZ4eF9jcmVhdGUoY2FyZCwgcGNpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwppbmRleCAwNjIzOThlLi4zMmI0NGYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAKIAl0bXAgPSBzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDQ1RMKTsKIAlpZiAoKHRtcCAmIEFDQ1RMX1ZGUk0pID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgICJjczQ2eHg6IEFDQ1RMX1ZGUk0gbm90IHNldCAweCV4XG4iLHRtcCk7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIkFDQ1RMX1ZGUk0gbm90IHNldCAweCV4XG4iLCB0bXApOwogCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0FDQ1RMLCAodG1wICYgKH5BQ0NUTF9FU1lOKSkgfCBBQ0NUTF9WRlJNICk7CiAJCW1zbGVlcCg1MCk7CiAJCXRtcCA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfQUNDVEwgKyBvZmZzZXQpOwpAQCAtMTY4LDcgKzE2OCw4IEBACiAJCQlnb3RvIG9rMTsKIAl9CiAKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyByZWFkIHByb2JsZW0gKEFDQ1RMX0RDViksIHJlZyA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJBQyc5NyByZWFkIHByb2JsZW0gKEFDQ1RMX0RDViksIHJlZyA9IDB4JXhcbiIsIHJlZyk7CiAJcmVzdWx0ID0gMHhmZmZmOwogCWdvdG8gZW5kOwogCQpAQCAtMTg3LDcgKzE4OCw5IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNTVFNfVlNUUyksIGNvZGVjX2luZGV4ICVkLCByZWcgPSAweCV4XG4iLCBjb2RlY19pbmRleCwgcmVnKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIkFDJzk3IHJlYWQgcHJvYmxlbSAoQUNTVFNfVlNUUyksIGNvZGVjX2luZGV4ICVkLCByZWcgPSAweCV4XG4iLAorCQljb2RlY19pbmRleCwgcmVnKTsKIAlyZXN1bHQgPSAweGZmZmY7CiAJZ290byBlbmQ7CiAKQEAgLTE5Nyw3ICsyMDAsOCBAQAogCSAqICBBQ1NEQSA9IFN0YXR1cyBEYXRhIFJlZ2lzdGVyID0gNDc0aAogCSAqLwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAiZSkgcmVnID0gMHgleCwgdmFsID0gMHgleCwgQkEwX0FDQ0FEID0gMHgleFxuIiwgcmVnLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiZSkgcmVnID0gMHgleCwgdmFsID0gMHgleCwgQkEwX0FDQ0FEID0gMHgleFxuIiwgcmVnLAogCQkJc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ1NEQSksCiAJCQlzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDQ0FEKSk7CiAjZW5kaWYKQEAgLTI4Niw3ICsyOTAsOSBAQAogCQkJZ290byBlbmQ7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd3JpdGUgcHJvYmxlbSwgY29kZWNfaW5kZXggPSAlZCwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgY29kZWNfaW5kZXgsIHJlZywgdmFsKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIkFDJzk3IHdyaXRlIHByb2JsZW0sIGNvZGVjX2luZGV4ID0gJWQsIHJlZyA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsCisJCWNvZGVjX2luZGV4LCByZWcsIHZhbCk7CiAgZW5kOgogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC0xKTsKIH0KQEAgLTYwOCw4ICs2MTQsOCBAQAogCX0KICAgCiAJaWYoc3RhdHVzICYgU0VSQlNUX1dCU1kpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBmYWlsdXJlIHdhaXRpbmcgZm9yICIKLQkJCSAgICJGSUZPIGNvbW1hbmQgdG8gY29tcGxldGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJmYWlsdXJlIHdhaXRpbmcgZm9yIEZJRk8gY29tbWFuZCB0byBjb21wbGV0ZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjQ2LDcgKzY1Miw5IEBACiAJCSAqICBNYWtlIHN1cmUgdGhlIHByZXZpb3VzIEZJRk8gd3JpdGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCiAJCSAqLwogCQlpZiAoY3M0Nnh4X3dhaXRfZm9yX2ZpZm8oY2hpcCwxKSkgewotCQkJc25kX3ByaW50ZGQgKCJmYWlsZWQgd2FpdGluZyBmb3IgRklGTyBhdCBhZGRyICglMDJYKVxuIixpZHgpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJImZhaWxlZCB3YWl0aW5nIGZvciBGSUZPIGF0IGFkZHIgKCUwMlgpXG4iLAorCQkJCWlkeCk7CiAKIAkJCWlmIChwb3dlcmRvd24pCiAJCQkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9DTEtDUjEsIHRtcCk7CkBAIC02OTQsNyArNzAyLDcgQEAKIAl9CiAKIAlpZiAoc25kX2NzNDZ4eF9wZWVrKGNoaXAsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlNQQ1JfUlVORlIgbmV2ZXIgcmVzZXRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlNQQ1JfUlVORlIgbmV2ZXIgcmVzZXRcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBzbmRfY3M0Nnh4X3Byb2Nfc3RvcChzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCkKQEAgLTEwNTQsNyArMTA2Miw4IEBACiAJCWNwY20tPnBjbV9jaGFubmVsID0gY3M0Nnh4X2RzcF9jcmVhdGVfcGNtX2NoYW5uZWwgKGNoaXAsIHNhbXBsZV9yYXRlLCAKIAkJCQkJCQkJICAgY3BjbSwgY3BjbS0+aHdfYnVmLmFkZHIsY3BjbS0+cGNtX2NoYW5uZWxfaWQpOwogCQlpZiAoY3BjbS0+cGNtX2NoYW5uZWwgPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBmYWlsZWQgdG8gY3JlYXRlIHZpcnR1YWwgUENNIGNoYW5uZWxcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImZhaWxlZCB0byBjcmVhdGUgdmlydHVhbCBQQ00gY2hhbm5lbFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQljcGNtLT5wY21fY2hhbm5lbC0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKQEAgLTEwNjcsNyArMTA3Niw4IEBACiAJCWlmICggKGNwY20tPnBjbV9jaGFubmVsID0gY3M0Nnh4X2RzcF9jcmVhdGVfcGNtX2NoYW5uZWwgKGNoaXAsIHNhbXBsZV9yYXRlLCBjcGNtLCAKIAkJCQkJCQkJCSBjcGNtLT5od19idWYuYWRkciwKIAkJCQkJCQkJCSBjcGNtLT5wY21fY2hhbm5lbF9pZCkpID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNzNDZ4eDogZmFpbGVkIHRvIHJlLWNyZWF0ZSB2aXJ0dWFsIFBDTSBjaGFubmVsXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gcmUtY3JlYXRlIHZpcnR1YWwgUENNIGNoYW5uZWxcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMTExNiw3ICsxMTI2LDggQEAKIAkJIHJldHVybiAtRUlOVkFMOwogCSB9CiAKLQlzbmRfcHJpbnRkZCAoInBlcmlvZF9zaXplICglZCksIHBlcmlvZHMgKCVkKSBidWZmZXJfc2l6ZSglZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJwZXJpb2Rfc2l6ZSAoJWQpLCBwZXJpb2RzICglZCkgYnVmZmVyX3NpemUoJWQpXG4iLAogCQkgICAgIHBlcmlvZF9zaXplLCBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpLAogCQkgICAgIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiAjZW5kaWYKQEAgLTE1MzEsMjIgKzE1NDIsMjAgQEAKIAogc3RhdGljIGludCBzbmRfY3M0Nnh4X3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc25kX3ByaW50ZGQoIm9wZW4gZnJvbnQgY2hhbm5lbFxuIik7CisJZGV2X2RiZyhzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCAib3BlbiBmcm9udCBjaGFubmVsXG4iKTsKIAlyZXR1cm4gX2NzNDZ4eF9wbGF5YmFja19vcGVuX2NoYW5uZWwoc3Vic3RyZWFtLERTUF9QQ01fTUFJTl9DSEFOTkVMKTsKIH0KIAogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKIHN0YXRpYyBpbnQgc25kX2NzNDZ4eF9wbGF5YmFja19vcGVuX3JlYXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc25kX3ByaW50ZGQoIm9wZW4gcmVhciBjaGFubmVsXG4iKTsKLQorCWRldl9kYmcoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIm9wZW4gcmVhciBjaGFubmVsXG4iKTsKIAlyZXR1cm4gX2NzNDZ4eF9wbGF5YmFja19vcGVuX2NoYW5uZWwoc3Vic3RyZWFtLERTUF9QQ01fUkVBUl9DSEFOTkVMKTsKIH0KIAogc3RhdGljIGludCBzbmRfY3M0Nnh4X3BsYXliYWNrX29wZW5fY2xmZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlzbmRfcHJpbnRkZCgib3BlbiBjZW50ZXIgLSBMRkUgY2hhbm5lbFxuIik7Ci0KKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICJvcGVuIGNlbnRlciAtIExGRSBjaGFubmVsXG4iKTsKIAlyZXR1cm4gX2NzNDZ4eF9wbGF5YmFja19vcGVuX2NoYW5uZWwoc3Vic3RyZWFtLERTUF9QQ01fQ0VOVEVSX0xGRV9DSEFOTkVMKTsKIH0KIApAQCAtMTU1NCw3ICsxNTYzLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAotCXNuZF9wcmludGRkKCJvcGVuIHJhdyBpZWM5NTggY2hhbm5lbFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvcGVuIHJhdyBpZWM5NTggY2hhbm5lbFxuIik7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5zcG9zX211dGV4KTsKIAljczQ2eHhfaWVjOTU4X3ByZV9vcGVuIChjaGlwKTsKQEAgLTE1NzAsNyArMTU3OSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKICAgCi0Jc25kX3ByaW50ZGQoImNsb3NlIHJhdyBpZWM5NTggY2hhbm5lbFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjbG9zZSByYXcgaWVjOTU4IGNoYW5uZWxcbiIpOwogCiAJZXJyID0gc25kX2NzNDZ4eF9wbGF5YmFja19jbG9zZShzdWJzdHJlYW0pOwogCkBAIC0yNDIxLDEwICsyNDMwLDEwIEBACiAKIAkvKiBzZXQgdGhlIGRlc2lyZWQgQ09ERUMgbW9kZSAqLwogCWlmIChhYzk3LT5udW0gPT0gQ1M0NlhYX1BSSU1BUllfQ09ERUNfSU5ERVgpIHsKLQkJc25kX3ByaW50ZGQoImNzNDZ4eDogQ09ERUMxIG1vZGUgJTA0eFxuIiwgMHgwKTsKKwkJZGV2X2RiZyhhYzk3LT5idXMtPmNhcmQtPmRldiwgIkNPREVDMSBtb2RlICUwNHhcbiIsIDB4MCk7CiAJCXNuZF9jczQ2eHhfYWM5N193cml0ZShhYzk3LCBBQzk3X0NTUl9BQ01PREUsIDB4MCk7CiAJfSBlbHNlIGlmIChhYzk3LT5udW0gPT0gQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWCkgewotCQlzbmRfcHJpbnRkZCgiY3M0Nnh4OiBDT0RFQzIgbW9kZSAlMDR4XG4iLCAweDMpOworCQlkZXZfZGJnKGFjOTctPmJ1cy0+Y2FyZC0+ZGV2LCAiQ09ERUMyIG1vZGUgJTA0eFxuIiwgMHgzKTsKIAkJc25kX2NzNDZ4eF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfQ1NSX0FDTU9ERSwgMHgzKTsKIAl9IGVsc2UgewogCQlzbmRfQlVHKCk7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gLi4uICovCkBAIC0yNDU2LDcgKzI0NjUsOCBAQAogCQltc2xlZXAoMTApOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIkNTNDZ4eCBzZWNvbmRhcnkgY29kZWMgZG9lc24ndCByZXNwb25kIVxuIik7ICAKKwlkZXZfZXJyKGFjOTctPmJ1cy0+Y2FyZC0+ZGV2LAorCQkiQ1M0Nnh4IHNlY29uZGFyeSBjb2RlYyBkb2Vzbid0IHJlc3BvbmQhXG4iKTsKIH0KICNlbmRpZgogCkBAIC0yNDc2LDcgKzI0ODYsOCBAQAogCQlzbmRfY3M0Nnh4X2NvZGVjX3dyaXRlKGNoaXAsIEFDOTdfUkVTRVQsIDAsIGNvZGVjKTsKIAkJdWRlbGF5KDEwKTsKIAkJaWYgKHNuZF9jczQ2eHhfY29kZWNfcmVhZChjaGlwLCBBQzk3X1JFU0VULCBjb2RlYykgJiAweDgwMDApIHsKLQkJCXNuZF9wcmludGRkKCJzbmRfY3M0Nnh4OiBzZWNvbmFkcnkgY29kZWMgbm90IHByZXNlbnRcbiIpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJInNlY29uYWRyeSBjb2RlYyBub3QgcHJlc2VudFxuIik7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJfQpAQCAtMjQ4OSw3ICsyNTAwLDcgQEAKIAkJfQogCQltc2xlZXAoMTApOwogCX0KLQlzbmRfcHJpbnRkZCgic25kX2NzNDZ4eDogY29kZWMgJWQgZGV0ZWN0aW9uIHRpbWVvdXRcbiIsIGNvZGVjKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjICVkIGRldGVjdGlvbiB0aW1lb3V0XG4iLCBjb2RlYyk7CiAJcmV0dXJuIC1FTlhJTzsKIH0KIApAQCAtMjUwOSw3ICsyNTIwLDcgQEAKIAogCS8qIGRldGVjdCBwcmltYXJ5IGNvZGVjICovCiAJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAwOwotCXNuZF9wcmludGRkKCJzbmRfY3M0Nnh4OiBkZXRlY3RpbmcgcHJpbWFyeSBjb2RlY1xuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkZXRlY3RpbmcgcHJpbWFyeSBjb2RlY1xuIik7CiAJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoY2FyZCwgMCwgJm9wcywgY2hpcCwgJmNoaXAtPmFjOTdfYnVzKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCWNoaXAtPmFjOTdfYnVzLT5wcml2YXRlX2ZyZWUgPSBzbmRfY3M0Nnh4X21peGVyX2ZyZWVfYWM5N19idXM7CkBAIC0yNTE5LDcgKzI1MzAsNyBAQAogCWNoaXAtPm5yX2FjOTdfY29kZWNzID0gMTsKIAogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKLQlzbmRfcHJpbnRkZCgic25kX2NzNDZ4eDogZGV0ZWN0aW5nIHNlY29uYWRyeSBjb2RlY1xuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkZXRlY3Rpbmcgc2Vjb25hZHJ5IGNvZGVjXG4iKTsKIAkvKiB0cnkgZGV0ZWN0IGEgc2Vjb25kYXJ5IGNvZGVjICovCiAJaWYgKCEgY3M0Nnh4X2RldGVjdF9jb2RlYyhjaGlwLCBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSkKIAkJY2hpcC0+bnJfYWM5N19jb2RlY3MgPSAyOwpAQCAtMjU1NCw3ICsyNTY1LDcgQEAKIAl9CiAJLyogZG8gc291bmRjYXJkIHNwZWNpZmljIG1peGVyIHNldHVwICovCiAJaWYgKGNoaXAtPm1peGVyX2luaXQpIHsKLQkJc25kX3ByaW50ZGQgKCJjYWxsaW5nIGNoaXAtPm1peGVyX2luaXQoY2hpcCk7XG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjYWxsaW5nIGNoaXAtPm1peGVyX2luaXQoY2hpcCk7XG4iKTsKIAkJY2hpcC0+bWl4ZXJfaW5pdChjaGlwKTsKIAl9CiAjZW5kaWYKQEAgLTI4MDEsNyArMjgxMiw4IEBACiAKIAljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTMxMzgsOCArMzE1MCwxMCBAQAogCX0KIAogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY3JlYXRlIC0gbmV2ZXIgcmVhZCBjb2RlYyByZWFkeSBmcm9tIEFDJzk3XG4iKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpdCBpcyBub3QgcHJvYmFibHkgYnVnLCB0cnkgdG8gdXNlIENTNDIzNiBkcml2ZXJcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiY3JlYXRlIC0gbmV2ZXIgcmVhZCBjb2RlYyByZWFkeSBmcm9tIEFDJzk3XG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJIml0IGlzIG5vdCBwcm9iYWJseSBidWcsIHRyeSB0byB1c2UgQ1M0MjM2IGRyaXZlclxuIik7CiAJcmV0dXJuIC1FSU87CiAgb2sxOgogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKQEAgLTMxNTcsNyArMzE3MSw4IEBACiAJCSAqICBNYWtlIHN1cmUgQ09ERUMgaXMgUkVBRFkuCiAJCSAqLwogCQlpZiAoIShzbmRfY3M0Nnh4X3BlZWtCQTAoY2hpcCwgQkEwX0FDU1RTMikgJiBBQ1NUU19DUkRZKSkKLQkJCXNuZF9wcmludGRkKCJjczQ2eHg6IG5ldmVyIHJlYWQgY2FyZCByZWFkeSBmcm9tIHNlY29uZGFyeSBBQyc5N1xuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkibmV2ZXIgcmVhZCBjYXJkIHJlYWR5IGZyb20gc2Vjb25kYXJ5IEFDJzk3XG4iKTsKIAl9CiAjZW5kaWYKIApAQCAtMzE4NywxNyArMzIwMiwyMSBAQAogCX0KIAogI2lmbmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY3JlYXRlIC0gbmV2ZXIgcmVhZCBJU1YzICYgSVNWNCBmcm9tIEFDJzk3XG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImNyZWF0ZSAtIG5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7CiAJcmV0dXJuIC1FSU87CiAjZWxzZQogCS8qIFRoaXMgbWF5IGhhcHBlbiBvbiBhIGNvbGQgYm9vdCB3aXRoIGEgVGVycmF0ZWMgU2lYUGFjayA1LjEuCiAJICAgUmVsb2FkaW5nIHRoZSBkcml2ZXIgbWF5IGhlbHAsIGlmIHRoZXJlJ3Mgb3RoZXIgc291bmRjYXJkcyAKIAkgICB3aXRoIHRoZSBzYW1lIHByb2JsZW0gSSB3b3VsZCBsaWtlIHRvIGtub3cuIChCZW5ueSkgKi8KIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SOiBzbmQtY3M0Nnh4OiBuZXZlciByZWFkIElTVjMgJiBJU1Y0IGZyb20gQUMnOTdcbiIpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIiAgICAgICBUcnkgcmVsb2FkaW5nIHRoZSBBTFNBIGRyaXZlciwgaWYgeW91IGZpbmQgc29tZXRoaW5nXG4iKTsKLSAgICAgICAgc25kX3ByaW50ayhLRVJOX0VSUiAiICAgICAgIGJyb2tlbiBvciBub3Qgd29ya2luZyBvbiB5b3VyIHNvdW5kY2FyZCB1cG9uXG4iKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICIgICAgICAgdGhpcyBtZXNzYWdlIHBsZWFzZSByZXBvcnQgdG8gYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIm5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJUcnkgcmVsb2FkaW5nIHRoZSBBTFNBIGRyaXZlciwgaWYgeW91IGZpbmQgc29tZXRoaW5nXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImJyb2tlbiBvciBub3Qgd29ya2luZyBvbiB5b3VyIHNvdW5kY2FyZCB1cG9uXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJInRoaXMgbWVzc2FnZSBwbGVhc2UgcmVwb3J0IHRvIGFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZ1xuIik7CiAKIAlyZXR1cm4gLUVJTzsKICNlbmRpZgpAQCAtMzI2NiwxMyArMzI4NSwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBDUzQ2WFhfRFNQX01PRFVMRVM7IGkrKykgewogCQllcnIgPSBsb2FkX2Zpcm13YXJlKGNoaXAsICZjaGlwLT5tb2R1bGVzW2ldLCBtb2R1bGVfbmFtZXNbaV0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZmlybXdhcmUgbG9hZCBlcnJvciBbJXNdXG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmaXJtd2FyZSBsb2FkIGVycm9yIFslc11cbiIsCiAJCQkJICAgbW9kdWxlX25hbWVzW2ldKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJZXJyID0gY3M0Nnh4X2RzcF9sb2FkX21vZHVsZShjaGlwLCBjaGlwLT5tb2R1bGVzW2ldKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImltYWdlIGRvd25sb2FkIGVycm9yIFslc11cbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImltYWdlIGRvd25sb2FkIGVycm9yIFslc11cbiIsCiAJCQkJICAgbW9kdWxlX25hbWVzW2ldKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTMyODgsNyArMzMwNyw3IEBACiAJLyogb2xkIGltYWdlICovCiAJZXJyID0gc25kX2NzNDZ4eF9kb3dubG9hZF9pbWFnZShjaGlwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbWFnZSBkb3dubG9hZCBlcnJvclxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW1hZ2UgZG93bmxvYWQgZXJyb3JcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMzM0MSw3ICszMzYwLDcgQEAKIAl1MzIgaWR4LCB2YWxpZF9zbG90cyx0bXAscG93ZXJkb3duID0gMDsKIAl1MTYgbW9kZW1fcG93ZXIscGluX2NvbmZpZyxsb2dpY190eXBlOwogCi0Jc25kX3ByaW50ZGQgKCJjczQ2eHg6IGNzNDZ4eF9zZXR1cF9lYXBkX3Nsb3QoKStcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY3M0Nnh4X3NldHVwX2VhcGRfc2xvdCgpK1xuIik7CiAKIAkvKgogCSAqICBTZWUgaWYgdGhlIGRldmljZXMgYXJlIHBvd2VyZWQgZG93bi4gIElmIHNvLCB3ZSBtdXN0IHBvd2VyIHRoZW0gdXAgZmlyc3QKQEAgLTMzNTksNyArMzM3OCw4IEBACiAJICogc3R1ZmYuCiAJICovCiAJaWYoY2hpcC0+bnJfYWM5N19jb2RlY3MgIT0gMikgewotCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiY3M0Nnh4OiBjczQ2eHhfc2V0dXBfZWFwZF9zbG90KCkgLSBubyBzZWNvbmRhcnkgY29kZWMgY29uZmlndXJlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNzNDZ4eF9zZXR1cF9lYXBkX3Nsb3QoKSAtIG5vIHNlY29uZGFyeSBjb2RlYyBjb25maWd1cmVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zNDAwLDcgKzM0MjAsNyBAQAogCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfQUNPU1YsIHZhbGlkX3Nsb3RzKTsKIAogCWlmICggY3M0Nnh4X3dhaXRfZm9yX2ZpZm8oY2hpcCwxKSApIHsKLQkgIHNuZF9wcmludGRkKCJGSUZPIGlzIGJ1c3lcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkZJRk8gaXMgYnVzeVxuIik7CiAJICAKIAkgIHJldHVybiAtRUlOVkFMOwogCX0KQEAgLTM0MjEsNyArMzQ0MSw5IEBACiAJCSAqIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUKIAkJICovCiAJCWlmICggY3M0Nnh4X3dhaXRfZm9yX2ZpZm8oY2hpcCwyMDApICkgewotCQkJc25kX3ByaW50ZGQoImZhaWxlZCB3YWl0aW5nIGZvciBGSUZPIGF0IGFkZHIgKCUwMlgpXG4iLGlkeCk7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZmFpbGVkIHdhaXRpbmcgZm9yIEZJRk8gYXQgYWRkciAoJTAyWClcbiIsCisJCQkJaWR4KTsKIAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTM1MTAsMTQgKzM1MzIsMTQgQEAKIAogCWNoaXAtPmFtcGxpZmllciArPSBjaGFuZ2U7CiAJaWYgKGNoaXAtPmFtcGxpZmllciAmJiAhb2xkKSB7Ci0JCXNuZF9wcmludGRkICgiSGVyY3VsZXMgYW1wbGlmaWVyIE9OXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJIZXJjdWxlcyBhbXBsaWZpZXIgT05cbiIpOwogCiAJCXNuZF9jczQ2eHhfcG9rZUJBMChjaGlwLCBCQTBfRUdQSU9EUiwgCiAJCQkJICAgRUdQSU9EUl9HUE9FMiB8IHZhbDEpOyAgICAgLyogZW5hYmxlIEVHUElPMiBvdXRwdXQgKi8KIAkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT1BUUiwgCiAJCQkJICAgRUdQSU9QVFJfR1BQVDIgfCB2YWwyKTsgICAvKiBvcGVuLWRyYWluIG9uIG91dHB1dCAqLwogCX0gZWxzZSBpZiAob2xkICYmICFjaGlwLT5hbXBsaWZpZXIpIHsKLQkJc25kX3ByaW50ZGQgKCJIZXJjdWxlcyBhbXBsaWZpZXIgT0ZGXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJIZXJjdWxlcyBhbXBsaWZpZXIgT0ZGXG4iKTsKIAkJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT0RSLCAgdmFsMSAmIH5FR1BJT0RSX0dQT0UyKTsgLyogZGlzYWJsZSAqLwogCQlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0VHUElPUFRSLCB2YWwyICYgfkVHUElPUFRSX0dQUFQyKTsgLyogZGlzYWJsZSAqLwogCX0KQEAgLTM1MjUsNyArMzU0Nyw3IEBACiAKIHN0YXRpYyB2b2lkIHZveWV0cmFfbWl4ZXJfaW5pdCAoc3RydWN0IHNuZF9jczQ2eHggKmNoaXApCiB7Ci0Jc25kX3ByaW50ZGQgKCJpbml0aWFsaXppbmcgVm95ZXRyYSBtaXhlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbml0aWFsaXppbmcgVm95ZXRyYSBtaXhlclxuIik7CiAKIAkvKiBFbmFibGUgU1BESUYgb3V0ICovCiAJc25kX2NzNDZ4eF9wb2tlQkEwKGNoaXAsIEJBMF9FR1BJT0RSLCBFR1BJT0RSX0dQT0UwKTsKQEAgLTM1NDMsNyArMzU2NSw3IEBACiAJLyogc2V0IEVHUElPIHRvIGRlZmF1bHQgKi8KIAloZXJjdWxlc19pbml0KGNoaXApOwogCi0Jc25kX3ByaW50ZGQgKCJpbml0aWFsaXppbmcgSGVyY3VsZXMgbWl4ZXJcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW5pdGlhbGl6aW5nIEhlcmN1bGVzIG1peGVyXG4iKTsKIAogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKIAlpZiAoY2hpcC0+aW5fc3VzcGVuZCkKQEAgLTM1NTQsNyArMzU3Niw5IEBACiAKIAkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2hlcmN1bGVzX2NvbnRyb2xzW2lkeF0sIGNoaXApOwogCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSA8IDApIHsKLQkJCXByaW50ayAoS0VSTl9FUlIgImNzNDZ4eDogZmFpbGVkIHRvIGluaXRpYWxpemUgSGVyY3VsZXMgbWl4ZXIgKCVkKVxuIixlcnIpOworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJImZhaWxlZCB0byBpbml0aWFsaXplIEhlcmN1bGVzIG1peGVyICglZClcbiIsCisJCQkJZXJyKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzgyNiw4ICszODUwLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzkzMiw3ICszOTU1LDggQEAKIAljaGlwLT5iYTFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOwogCWlmIChjaGlwLT5iYTBfYWRkciA9PSAwIHx8IGNoaXAtPmJhMF9hZGRyID09ICh1bnNpZ25lZCBsb25nKX4wIHx8CiAJICAgIGNoaXAtPmJhMV9hZGRyID09IDAgfHwgY2hpcC0+YmExX2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpfjApIHsKLQkgICAgCXNuZF9wcmludGsoS0VSTl9FUlIgIndyb25nIGFkZHJlc3MoZXMpIC0gYmEwID0gMHglbHgsIGJhMSA9IDB4JWx4XG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ3cm9uZyBhZGRyZXNzKGVzKSAtIGJhMCA9IDB4JWx4LCBiYTEgPSAweCVseFxuIiwKIAkJCSAgIGNoaXAtPmJhMF9hZGRyLCBjaGlwLT5iYTFfYWRkcik7CiAJICAgIAlzbmRfY3M0Nnh4X2ZyZWUoY2hpcCk7CiAJICAgIAlyZXR1cm4gLUVOT01FTTsKQEAgLTM5NjksNyArMzk5Myw4IEBACiAKIAlmb3IgKGNwID0gJmNhcmRzWzBdOyBjcC0+bmFtZTsgY3ArKykgewogCQlpZiAoY3AtPnZlbmRvciA9PSBzc192ZW5kb3IgJiYgY3AtPmlkID09IHNzX2NhcmQpIHsKLQkJCXNuZF9wcmludGRkICgiaGFjayBmb3IgJXMgZW5hYmxlZFxuIiwgY3AtPm5hbWUpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJoYWNrIGZvciAlcyBlbmFibGVkXG4iLAorCQkJCWNwLT5uYW1lKTsKIAogCQkJY2hpcC0+YW1wbGlmaWVyX2N0cmwgPSBjcC0+YW1wOwogCQkJY2hpcC0+YWN0aXZlX2N0cmwgPSBjcC0+YWN0aXZlOwpAQCAtMzk4MiwxMiArNDAwNywxNCBAQAogCX0KIAogCWlmIChleHRlcm5hbF9hbXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkNyeXN0YWwgRUFQRCBzdXBwb3J0IGZvcmNlZCBvbi5cbiIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkgIkNyeXN0YWwgRUFQRCBzdXBwb3J0IGZvcmNlZCBvbi5cbiIpOwogCQljaGlwLT5hbXBsaWZpZXJfY3RybCA9IGFtcF92b3lldHJhOwogCX0KIAogCWlmICh0aGlua3BhZCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiQWN0aXZhdGluZyBDTEtSVU4gaGFjayBmb3IgVGhpbmtwYWQuXG4iKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOwogCQljaGlwLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOwogCQljbGtydW5faW5pdChjaGlwKTsKIAl9CkBAIC00MDA1LDE0ICs0MDMyLDE2IEBACiAJCXJlZ2lvbiA9ICZjaGlwLT5yZWdpb24uaWR4W2lkeF07CiAJCWlmICgocmVnaW9uLT5yZXNvdXJjZSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZWdpb24tPmJhc2UsIHJlZ2lvbi0+c2l6ZSwKIAkJCQkJCQkgICByZWdpb24tPm5hbWUpKSA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJInVuYWJsZSB0byByZXF1ZXN0IG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCiAJCQkJICAgcmVnaW9uLT5iYXNlLCByZWdpb24tPmJhc2UgKyByZWdpb24tPnNpemUgLSAxKTsKIAkJCXNuZF9jczQ2eHhfZnJlZShjaGlwKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJcmVnaW9uLT5yZW1hcF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKHJlZ2lvbi0+YmFzZSwgcmVnaW9uLT5zaXplKTsKIAkJaWYgKHJlZ2lvbi0+cmVtYXBfYWRkciA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlcyBpb3JlbWFwIHByb2JsZW1cbiIsIHJlZ2lvbi0+bmFtZSk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiJXMgaW9yZW1hcCBwcm9ibGVtXG4iLCByZWdpb24tPm5hbWUpOwogCQkJc25kX2NzNDZ4eF9mcmVlKGNoaXApOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTQwMjAsNyArNDA0OSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jczQ2eHhfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2NzNDZ4eF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTQwNTgsOCArNDA4Nyw2IEBACiAKIAljaGlwLT5hY3RpdmVfY3RybChjaGlwLCAtMSk7IC8qIGRpc2FibGUgQ0xLUlVOICovCiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCmluZGV4IDE2ODZiNGYuLjFjNGEwZmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKQEAgLTg1LDEyICs4NSwxNSBAQAogCQkJCQkJYWRkcmVzcyAgPSAoaGl2YWwgJiAweDAwRkZGKSA8PCA1OwogCQkJCQkJYWRkcmVzcyB8PSAgbG92YWwgPj4gMTU7CiAgICAgICAgICAgICAKLQkJCQkJCXNuZF9wcmludGRkKCJoYW5kbGVfd2lkZW9wWzFdOiAlMDV4OiUwNXggYWRkciAlMDR4XG4iLGhpdmFsLGxvdmFsLGFkZHJlc3MpOworCQkJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCQkJImhhbmRsZV93aWRlb3BbMV06ICUwNXg6JTA1eCBhZGRyICUwNHhcbiIsCisJCQkJCQkJaGl2YWwsIGxvdmFsLCBhZGRyZXNzKTsKICAgICAgICAgICAgIAogCQkJCQkJaWYgKCAhKGFkZHJlc3MgJiAweDgwMDApICkgewogCQkJCQkJCWFkZHJlc3MgKz0gKGlucy0+Y29kZS5vZmZzZXQgLyAyKSAtIG92ZXJsYXlfYmVnaW5fYWRkcmVzczsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc25kX3ByaW50ZGQoImhhbmRsZV93aWRlb3BbMV06IFJPTSBzeW1ib2wgbm90IHJlYWxsb2NhdGVkXG4iKTsKKwkJCQkJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJCQkJImhhbmRsZV93aWRlb3BbMV06IFJPTSBzeW1ib2wgbm90IHJlYWxsb2NhdGVkXG4iKTsKIAkJCQkJCX0KICAgICAgICAgICAgIAogCQkJCQkJaGl2YWwgJj0gMHhGRjAwMDsKQEAgLTEwMiw4ICsxMDUsOSBAQAogCQkJCQkJYWRkcmVzcyAgPSAoaGl2YWwgJiAweDAwRkZGKSA8PCA1OwogCQkJCQkJYWRkcmVzcyB8PSAgbG92YWwgPj4gMTU7CiAgICAgICAgICAgICAKLQkJCQkJCXNuZF9wcmludGRkKCJoYW5kbGVfd2lkZW9wOlsyXSAlMDV4OiUwNXggYWRkciAlMDR4XG4iLGhpdmFsLGxvdmFsLGFkZHJlc3MpOyAgICAgICAgICAgIAotCQkJCQkJbnJlYWxsb2NhdGVkICsrOworCQkJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCQkJImhhbmRsZV93aWRlb3A6WzJdICUwNXg6JTA1eCBhZGRyICUwNHhcbiIsCisJCQkJCQkJaGl2YWwsIGxvdmFsLCBhZGRyZXNzKTsJCQkJCQlucmVhbGxvY2F0ZWQrKzsKIAkJCQkJfSAvKiB3aWRlX29wY29kZXNbal0gPT0gd2lkZV9vcCAqLwogCQkJCX0gLyogZm9yICovCiAJCQl9IC8qIG1vZF90eXBlID09IDAgLi4uICovCkBAIC0xMTMsNyArMTE3LDggQEAKIAkJaW5zLT5jb2RlLmRhdGFbaW5zLT5jb2RlLnNpemUrK10gPSBoaXZhbDsKIAl9CiAKLQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6ICVkIGluc3RydWN0aW9ucyByZWFsbG9jYXRlZFxuIixucmVhbGxvY2F0ZWQpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiZHNwX3Nwb3M6ICVkIGluc3RydWN0aW9ucyByZWFsbG9jYXRlZFxuIiwgbnJlYWxsb2NhdGVkKTsKIAlyZXR1cm4gbnJlYWxsb2NhdGVkOwogfQogCkBAIC0xNTcsNyArMTYyLDggQEAKIAogCWZvciAoaSA9IDA7aSA8IG1vZHVsZS0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzOyArK2kpIHsKIAkJaWYgKGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzID09IChEU1BfTUFYX1NZTUJPTFMgLSAxKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCB0YWJsZSBpcyBmdWxsXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3Bvczogc3ltYm9sIHRhYmxlIGlzIGZ1bGxcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMTc2LDggKzE4MiwxMSBAQAogCiAJCQlpbnMtPnN5bWJvbF90YWJsZS5uc3ltYm9scysrOwogCQl9IGVsc2UgewotICAgICAgICAgIC8qIGlmICgwKSBwcmludGsgKCJkc3Bfc3Bvczogc3ltYm9sIDwlcz4gZHVwbGljYXRlZCwgcHJvYmFibHkgbm90aGluZyB3cm9uZyB3aXRoIHRoYXQgKENpcnJ1cz8pXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLnN5bWJvbF9uYW1lKTsgKi8KKyNpZiAwCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZHNwX3Nwb3M6IHN5bWJvbCA8JXM+IGR1cGxpY2F0ZWQsIHByb2JhYmx5IG5vdGhpbmcgd3Jvbmcgd2l0aCB0aGF0IChDaXJydXM/KVxuIiwKKwkJCQltb2R1bGUtPnN5bWJvbF90YWJsZS5zeW1ib2xzW2ldLnN5bWJvbF9uYW1lKTsgKi8KKyNlbmRpZgogCQl9CiAJfQogCkBAIC0xOTIsMTQgKzIwMSwxNSBAQAogCWludCBpbmRleDsKIAogCWlmIChpbnMtPnN5bWJvbF90YWJsZS5uc3ltYm9scyA9PSAoRFNQX01BWF9TWU1CT0xTIC0gMSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCB0YWJsZSBpcyBmdWxsXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3Bvczogc3ltYm9sIHRhYmxlIGlzIGZ1bGxcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAgIAogCWlmIChjczQ2eHhfZHNwX2xvb2t1cF9zeW1ib2woY2hpcCwKIAkJCQkgICAgIHN5bWJvbF9uYW1lLAogCQkJCSAgICAgdHlwZSkgIT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIDwlcz4gZHVwbGljYXRlZFxuIiwgc3ltYm9sX25hbWUpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIDwlcz4gZHVwbGljYXRlZFxuIiwgc3ltYm9sX25hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTMwNSwxOSArMzE1LDIwIEBACiAJdTMyIGRvZmZzZXQsIGRzaXplOwogCiAJaWYgKCFwYXJhbWV0ZXIpIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBtb2R1bGUgZ290IG5vIHBhcmFtZXRlciBzZWdtZW50XG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gcGFyYW1ldGVyIHNlZ21lbnRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlkb2Zmc2V0ID0gKHBhcmFtZXRlci0+b2Zmc2V0ICogNCArIERTUF9QQVJBTUVURVJfQllURV9PRkZTRVQpOwogCWRzaXplICAgPSBwYXJhbWV0ZXItPnNpemUgKiA0OwogCi0Jc25kX3ByaW50ZGQoImRzcF9zcG9zOiAiCi0JCSAgICAiZG93bmxvYWRpbmcgcGFyYW1ldGVyIGRhdGEgdG8gY2hpcCAoJTA4eC0lMDh4KVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImRzcF9zcG9zOiBkb3dubG9hZGluZyBwYXJhbWV0ZXIgZGF0YSB0byBjaGlwICglMDh4LSUwOHgpXG4iLAogCQkgICAgZG9mZnNldCxkb2Zmc2V0ICsgZHNpemUpOwogCWlmIChzbmRfY3M0Nnh4X2Rvd25sb2FkIChjaGlwLCBwYXJhbWV0ZXItPmRhdGEsIGRvZmZzZXQsIGRzaXplKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogIgotCQkJICAgImZhaWxlZCB0byBkb3dubG9hZCBwYXJhbWV0ZXIgZGF0YSB0byBEU1BcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGRvd25sb2FkIHBhcmFtZXRlciBkYXRhIHRvIERTUFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMyOSwxOCArMzQwLDIxIEBACiAJdTMyIGRvZmZzZXQsIGRzaXplOwogCiAJaWYgKCFzYW1wbGUpIHsKLQkJc25kX3ByaW50ZGQoImRzcF9zcG9zOiBtb2R1bGUgZ290IG5vIHNhbXBsZSBzZWdtZW50XG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gc2FtcGxlIHNlZ21lbnRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlkb2Zmc2V0ID0gKHNhbXBsZS0+b2Zmc2V0ICogNCAgKyBEU1BfU0FNUExFX0JZVEVfT0ZGU0VUKTsKIAlkc2l6ZSAgID0gIHNhbXBsZS0+c2l6ZSAqIDQ7CiAKLQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IGRvd25sb2FkaW5nIHNhbXBsZSBkYXRhIHRvIGNoaXAgKCUwOHgtJTA4eClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJkc3Bfc3BvczogZG93bmxvYWRpbmcgc2FtcGxlIGRhdGEgdG8gY2hpcCAoJTA4eC0lMDh4KVxuIiwKIAkJICAgIGRvZmZzZXQsZG9mZnNldCArIGRzaXplKTsKIAogCWlmIChzbmRfY3M0Nnh4X2Rvd25sb2FkIChjaGlwLHNhbXBsZS0+ZGF0YSxkb2Zmc2V0LGRzaXplKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIHNhbXBsZSBkYXRhIHRvIERTUFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBmYWlsZWQgdG8gc2FtcGxlIGRhdGEgdG8gRFNQXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtMzU0LDE0ICszNjgsMTYgQEAKIAlpbnQgZXJyOwogCiAJaWYgKGlucy0+bm1vZHVsZXMgPT0gRFNQX01BWF9NT0RVTEVTIC0gMSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogdG8gbWFueSBtb2R1bGVzIGxvYWRlZCBpbnRvIERTUFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiB0byBtYW55IG1vZHVsZXMgbG9hZGVkIGludG8gRFNQXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc25kX3ByaW50ZGQoImRzcF9zcG9zOiBsb2FkaW5nIG1vZHVsZSAlcyBpbnRvIERTUFxuIiwgbW9kdWxlLT5tb2R1bGVfbmFtZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJkc3Bfc3BvczogbG9hZGluZyBtb2R1bGUgJXMgaW50byBEU1BcbiIsIG1vZHVsZS0+bW9kdWxlX25hbWUpOwogICAKIAlpZiAoaW5zLT5ubW9kdWxlcyA9PSAwKSB7Ci0JCXNuZF9wcmludGRkKCJkc3Bfc3BvczogY2xlYXJpbmcgcGFyYW1ldGVyIGFyZWFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBjbGVhcmluZyBwYXJhbWV0ZXIgYXJlYVxuIik7CiAJCXNuZF9jczQ2eHhfY2xlYXJfQkExKGNoaXAsIERTUF9QQVJBTUVURVJfQllURV9PRkZTRVQsIERTUF9QQVJBTUVURVJfQllURV9TSVpFKTsKIAl9CiAgIApAQCAtMzcxLDcgKzM4Nyw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlpZiAoaW5zLT5ubW9kdWxlcyA9PSAwKSB7Ci0JCXNuZF9wcmludGRkKCJkc3Bfc3BvczogY2xlYXJpbmcgc2FtcGxlIGFyZWFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBjbGVhcmluZyBzYW1wbGUgYXJlYVxuIik7CiAJCXNuZF9jczQ2eHhfY2xlYXJfQkExKGNoaXAsIERTUF9TQU1QTEVfQllURV9PRkZTRVQsIERTUF9TQU1QTEVfQllURV9TSVpFKTsKIAl9CiAKQEAgLTM4MSwxNSArMzk3LDE3IEBACiAJCXJldHVybiBlcnI7CiAKIAlpZiAoaW5zLT5ubW9kdWxlcyA9PSAwKSB7Ci0JCXNuZF9wcmludGRkKCJkc3Bfc3BvczogY2xlYXJpbmcgY29kZSBhcmVhXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogY2xlYXJpbmcgY29kZSBhcmVhXG4iKTsKIAkJc25kX2NzNDZ4eF9jbGVhcl9CQTEoY2hpcCwgRFNQX0NPREVfQllURV9PRkZTRVQsIERTUF9DT0RFX0JZVEVfU0laRSk7CiAJfQogCiAJaWYgKGNvZGUgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gY29kZSBzZWdtZW50XG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IG1vZHVsZSBnb3Qgbm8gY29kZSBzZWdtZW50XG4iKTsKIAl9IGVsc2UgewogCQlpZiAoaW5zLT5jb2RlLm9mZnNldCArIGNvZGUtPnNpemUgPiBEU1BfQ09ERV9CWVRFX1NJWkUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBubyBzcGFjZSBhdmFpbGFibGUgaW4gRFNQXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3Bvczogbm8gc3BhY2UgYXZhaWxhYmxlIGluIERTUFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC00MDEsMTkgKzQxOSwyMiBAQAogCQlpZiAoc25kX0JVR19PTighbW9kdWxlLT5zeW1ib2xfdGFibGUuc3ltYm9scykpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaWYgKGFkZF9zeW1ib2xzKGNoaXAsbW9kdWxlKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBsb2FkIHN5bWJvbCB0YWJsZVxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZHNwX3Nwb3M6IGZhaWxlZCB0byBsb2FkIHN5bWJvbCB0YWJsZVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogICAgIAogCQlkb2Zmc2V0ID0gKGNvZGUtPm9mZnNldCAqIDQgKyBpbnMtPmNvZGUub2Zmc2V0ICogNCArIERTUF9DT0RFX0JZVEVfT0ZGU0VUKTsKIAkJZHNpemUgICA9IGNvZGUtPnNpemUgKiA0OwotCQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IGRvd25sb2FkaW5nIGNvZGUgdG8gY2hpcCAoJTA4eC0lMDh4KVxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IGRvd25sb2FkaW5nIGNvZGUgdG8gY2hpcCAoJTA4eC0lMDh4KVxuIiwKIAkJCSAgICBkb2Zmc2V0LGRvZmZzZXQgKyBkc2l6ZSk7ICAgCiAKIAkJbW9kdWxlLT5uZml4dXBzID0gc2hhZG93X2FuZF9yZWFsbG9jYXRlX2NvZGUoY2hpcCxjb2RlLT5kYXRhLGNvZGUtPnNpemUsbW9kdWxlLT5vdmVybGF5X2JlZ2luX2FkZHJlc3MpOwogCiAJCWlmIChzbmRfY3M0Nnh4X2Rvd25sb2FkIChjaGlwLChpbnMtPmNvZGUuZGF0YSArIGlucy0+Y29kZS5vZmZzZXQpLGRvZmZzZXQsZHNpemUpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGRvd25sb2FkIGNvZGUgdG8gRFNQXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3BvczogZmFpbGVkIHRvIGRvd25sb2FkIGNvZGUgdG8gRFNQXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTQ0Nyw3ICs0NjgsNyBAQAogCX0KIAogI2lmIDAKLQlwcmludGsgKCJkc3Bfc3Bvczogc3ltYm9sIDwlcz4gdHlwZSAlMDJ4IG5vdCBmb3VuZFxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImRzcF9zcG9zOiBzeW1ib2wgPCVzPiB0eXBlICUwMnggbm90IGZvdW5kXG4iLAogCQlzeW1ib2xfbmFtZSxzeW1ib2xfdHlwZSk7CiAjZW5kaWYKIApAQCAtOTEwLDcgKzkzMSw2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAotc3RhdGljIGludCBkZWJ1Z190cmVlOwogc3RhdGljIHZvaWQgX2RzcF9jcmVhdGVfdGFza190cmVlIChzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCwgdTMyICogdGFza19kYXRhLAogCQkJCSAgIHUzMiAgZGVzdCwgaW50IHNpemUpCiB7CkBAIC05MTksMTMgKzkzOSwxMyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgewotCQlpZiAoZGVidWdfdHJlZSkgcHJpbnRrICgiYWRkciAlcCwgdmFsICUwOHhcbiIsc3Bkc3QsdGFza19kYXRhW2ldKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhZGRyICVwLCB2YWwgJTA4eFxuIiwKKwkJCXNwZHN0LCB0YXNrX2RhdGFbaV0pOwogCQl3cml0ZWwodGFza19kYXRhW2ldLHNwZHN0KTsKIAkJc3Bkc3QgKz0gc2l6ZW9mKHUzMik7CiAJfQogfQogCi1zdGF0aWMgaW50IGRlYnVnX3NjYjsKIHN0YXRpYyB2b2lkIF9kc3BfY3JlYXRlX3NjYiAoc3RydWN0IHNuZF9jczQ2eHggKmNoaXAsIHUzMiAqIHNjYl9kYXRhLCB1MzIgZGVzdCkKIHsKIAl2b2lkIF9faW9tZW0gKnNwZHN0ID0gY2hpcC0+cmVnaW9uLmlkeFsxXS5yZW1hcF9hZGRyICsgCkBAIC05MzMsNyArOTUzLDggQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAweDEwOyArK2kpIHsKLQkJaWYgKGRlYnVnX3NjYikgcHJpbnRrICgiYWRkciAlcCwgdmFsICUwOHhcbiIsc3Bkc3Qsc2NiX2RhdGFbaV0pOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImFkZHIgJXAsIHZhbCAlMDh4XG4iLAorCQkJc3Bkc3QsIHNjYl9kYXRhW2ldKTsKIAkJd3JpdGVsKHNjYl9kYXRhW2ldLHNwZHN0KTsKIAkJc3Bkc3QgKz0gc2l6ZW9mKHUzMik7CiAJfQpAQCAtOTYwLDcgKzk4MSw4IEBACiAJaW50IGluZGV4OwogCiAJaWYgKGlucy0+bnNjYiA9PSBEU1BfTUFYX1NDQl9ERVNDIC0gMSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZ290IG5vIHBsYWNlIGZvciBvdGhlciBTQ0JcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogZ290IG5vIHBsYWNlIGZvciBvdGhlciBTQ0JcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTk5MSw3ICsxMDEzLDggQEAKIAlzdHJ1Y3QgZHNwX3Rhc2tfZGVzY3JpcHRvciAqIGRlc2MgPSBOVUxMOwogCiAJaWYgKGlucy0+bnRhc2sgPT0gRFNQX01BWF9UQVNLX0RFU0MgLSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBnb3Qgbm8gcGxhY2UgZm9yIG90aGVyIFRBU0tcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3BvczogZ290IG5vIHBsYWNlIGZvciBvdGhlciBUQVNLXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMDMxLDcgKzEwNTQsNyBAQAogCQlkZXNjLT5kYXRhID0gc2NiX2RhdGE7CiAJCV9kc3BfY3JlYXRlX3NjYihjaGlwLHNjYl9kYXRhLGRlc3QpOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBmYWlsZWQgdG8gbWFwIFNDQlxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IGZhaWxlZCB0byBtYXAgU0NCXG4iKTsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAkJa2ZyZWUoc2NiX2RhdGEpOwogI2VuZGlmCkBAIC0xMDUyLDcgKzEwNzUsNyBAQAogCQlkZXNjLT5kYXRhID0gdGFza19kYXRhOwogCQlfZHNwX2NyZWF0ZV90YXNrX3RyZWUoY2hpcCx0YXNrX2RhdGEsZGVzdCxzaXplKTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIG1hcCBUQVNLXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogZmFpbGVkIHRvIG1hcCBUQVNLXG4iKTsKIAl9CiAKIAlyZXR1cm4gZGVzYzsKQEAgLTExMDUsMzEgKzExMjgsMzYgQEAKIAogCW51bGxfYWxnb3JpdGhtICA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiTlVMTEFMR09SSVRITSIsIFNZTUJPTF9DT0RFKTsKIAlpZiAobnVsbF9hbGdvcml0aG0gPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIE5VTExBTEdPUklUSE0gbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBOVUxMQUxHT1JJVEhNIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWZnX3Rhc2tfdHJlZV9oZWFkZXJfY29kZSA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiRkdUQVNLVFJFRUhFQURFUkNPREUiLCBTWU1CT0xfQ09ERSk7ICAKIAlpZiAoZmdfdGFza190cmVlX2hlYWRlcl9jb2RlID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBGR1RBU0tUUkVFSEVBREVSQ09ERSBub3QgZm91bmRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIEZHVEFTS1RSRUVIRUFERVJDT0RFIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCXRhc2tfdHJlZV9oZWFkZXJfY29kZSA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiVEFTS1RSRUVIRUFERVJDT0RFIiwgU1lNQk9MX0NPREUpOyAgCiAJaWYgKHRhc2tfdHJlZV9oZWFkZXJfY29kZSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgVEFTS1RSRUVIRUFERVJDT0RFIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgVEFTS1RSRUVIRUFERVJDT0RFIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KICAgCiAJdGFza190cmVlX3RocmVhZCA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiVEFTS1RSRUVUSFJFQUQiLCBTWU1CT0xfQ09ERSk7CiAJaWYgKHRhc2tfdHJlZV90aHJlYWQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFRBU0tUUkVFVEhSRUFEIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgVEFTS1RSRUVUSFJFQUQgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJbWFnaWNfc25vb3BfdGFzayA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiTUFHSUNTTk9PUFRBU0siLCBTWU1CT0xfQ09ERSk7CiAJaWYgKG1hZ2ljX3Nub29wX3Rhc2sgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIE1BR0lDU05PT1BUQVNLIG5vdCBmb3VuZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBzeW1ib2wgTUFHSUNTTk9PUFRBU0sgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogICAKQEAgLTE0NzYsNyArMTUwNCw3IEBACiAJcmV0dXJuIDA7CiAKICBfZmFpbF9lbmQ6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBzZXR1cCBTQ0IncyBpbiBEU1BcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IGZhaWxlZCB0byBzZXR1cCBTQ0IncyBpbiBEU1BcbiIpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC0xNDkxLDE4ICsxNTE5LDIxIEBACiAKIAlzMTZfYXN5bmNfY29kZWNfaW5wdXRfdGFzayA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiUzE2X0FTWU5DQ09ERUNJTlBVVFRBU0siLCBTWU1CT0xfQ09ERSk7CiAJaWYgKHMxNl9hc3luY19jb2RlY19pbnB1dF90YXNrID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBTMTZfQVNZTkNDT0RFQ0lOUFVUVEFTSyBub3QgZm91bmRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIFMxNl9BU1lOQ0NPREVDSU5QVVRUQVNLIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlzcGRpZm9fdGFzayA9IGNzNDZ4eF9kc3BfbG9va3VwX3N5bWJvbChjaGlwLCAiU1BESUZPVEFTSyIsIFNZTUJPTF9DT0RFKTsKIAlpZiAoc3BkaWZvX3Rhc2sgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3Bvczogc3ltYm9sIFNQRElGT1RBU0sgbm90IGZvdW5kXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCBTUERJRk9UQVNLIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCXNwZGlmaV90YXNrID0gY3M0Nnh4X2RzcF9sb29rdXBfc3ltYm9sKGNoaXAsICJTUERJRklUQVNLIiwgU1lNQk9MX0NPREUpOwogCWlmIChzcGRpZmlfdGFzayA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgU1BESUZJVEFTSyBub3QgZm91bmRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJkc3Bfc3Bvczogc3ltYm9sIFNQRElGSVRBU0sgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xODgzLDcgKzE5MTQsOCBAQAogCX0KIAogCWlmIChpID09IDI1KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiBTUElPV3JpdGVUYXNrIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IFNQSU9Xcml0ZVRhc2sgbm90IHJlc3BvbmRpbmdcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19zY2JfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYwppbmRleCA0MDllODc2Li44Mjg0YmM5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYwpAQCAtMjMzLDggKzIzMywxMSBAQAogewogCWlmIChzY2ItPnByb2NfaW5mbykgewogCQlzdHJ1Y3QgcHJvY19zY2JfaW5mbyAqIHNjYl9pbmZvID0gc2NiLT5wcm9jX2luZm8tPnByaXZhdGVfZGF0YTsKKwkJc3RydWN0IHNuZF9jczQ2eHggKmNoaXAgPSBzY2JfaW5mby0+Y2hpcDsKIAotCQlzbmRfcHJpbnRkZCgiY3M0Nnh4X2RzcF9wcm9jX2ZyZWVfc2NiX2Rlc2M6IGZyZWVpbmcgJXNcbiIsc2NiLT5zY2JfbmFtZSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNzNDZ4eF9kc3BfcHJvY19mcmVlX3NjYl9kZXNjOiBmcmVlaW5nICVzXG4iLAorCQkJc2NiLT5zY2JfbmFtZSk7CiAKIAkJc25kX2luZm9fZnJlZV9lbnRyeShzY2ItPnByb2NfaW5mbyk7CiAJCXNjYi0+cHJvY19pbmZvID0gTlVMTDsKQEAgLTMwNSw3ICszMDgsNyBAQAogCXNjYl9kYXRhW1NDQmZ1bmNFbnRyeVB0cl0gJj0gMHhGRkZGMDAwMDsKIAlzY2JfZGF0YVtTQ0JmdW5jRW50cnlQdHJdIHw9IHRhc2tfZW50cnktPmFkZHJlc3M7CiAKLQlzbmRfcHJpbnRkZCgiZHNwX3Nwb3M6IGNyZWF0aW5nIFNDQiA8JXM+XG4iLG5hbWUpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZHNwX3Nwb3M6IGNyZWF0aW5nIFNDQiA8JXM+XG4iLCBuYW1lKTsKIAogCXNjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX3NjYihjaGlwLG5hbWUsc2NiX2RhdGEsZGVzdCk7CiAKQEAgLTMyMCw5ICszMjMsMTUgQEAKIAkvKiB1cGRhdGUgcGFyZW50IFNDQiAqLwogCWlmIChzY2ItPnBhcmVudF9zY2JfcHRyKSB7CiAjaWYgMAotCQlwcmludGsgKCJzY2ItPnBhcmVudF9zY2JfcHRyID0gJXNcbiIsc2NiLT5wYXJlbnRfc2NiX3B0ci0+c2NiX25hbWUpOwotCQlwcmludGsgKCJzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPSAlc1xuIixzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHItPnNjYl9uYW1lKTsKLQkJcHJpbnRrICgic2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyID0gJXNcbiIsc2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyLT5zY2JfbmFtZSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNjYi0+cGFyZW50X3NjYl9wdHIgPSAlc1xuIiwKKwkJCXNjYi0+cGFyZW50X3NjYl9wdHItPnNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkic2NiLT5wYXJlbnRfc2NiX3B0ci0+bmV4dF9zY2JfcHRyID0gJXNcbiIsCisJCQlzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHItPnNjYl9uYW1lKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkic2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyID0gJXNcbiIsCisJCQlzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHItPnNjYl9uYW1lKTsKICNlbmRpZgogCQkvKiBsaW5rIHRvICBwYXJlbnQgU0NCICovCiAJCWlmIChzY2JfY2hpbGRfdHlwZSA9PSBTQ0JfT05fUEFSRU5UX05FWFRfU0NCKSB7CkBAIC0zNjgsNyArMzc3LDggQEAKIAkJCQkJICAgICAgIFNZTUJPTF9DT0RFKTsKICAgCiAJaWYgKHRhc2tfZW50cnkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCAlcyBub3QgZm91bmRcbiIsdGFza19lbnRyeV9uYW1lKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IHN5bWJvbCAlcyBub3QgZm91bmRcbiIsIHRhc2tfZW50cnlfbmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KICAgCkBAIC01ODIsNyArNTkyLDggQEAKIAkJCQkJCQkJIFNZTUJPTF9DT0RFKTsKICAgICAKIAkJaWYgKGlucy0+bnVsbF9hbGdvcml0aG0gPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayAoS0VSTl9FUlIgImRzcF9zcG9zOiBzeW1ib2wgTlVMTEFMR09SSVRITSBub3QgZm91bmRcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImRzcF9zcG9zOiBzeW1ib2wgTlVMTEFMR09SSVRITSBub3QgZm91bmRcbiIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0gICAgCiAJfQpAQCAtNjEyLDcgKzYyMyw4IEBACiAJdW5zaWduZWQgaW50IHBoaUluY3I7CiAJdW5zaWduZWQgaW50IGNvcnJlY3Rpb25QZXJHT0YsIGNvcnJlY3Rpb25QZXJTZWM7CiAKLQlzbmRfcHJpbnRkZCggImRzcF9zcG9zOiBzZXR0aW5nICVzIHJhdGUgdG8gJXVcbiIsc2NiX25hbWUscmF0ZSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3Bvczogc2V0dGluZyAlcyByYXRlIHRvICV1XG4iLAorCQlzY2JfbmFtZSwgcmF0ZSk7CiAKIAkvKgogCSAqICBDb21wdXRlIHRoZSB2YWx1ZXMgdXNlZCB0byBkcml2ZSB0aGUgYWN0dWFsIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCkBAIC02NzAsNyArNjgyLDggQEAKIAkJCQkJCQkJIFNZTUJPTF9DT0RFKTsKIAkJCQogCQkJaWYgKGlucy0+czE2X3VwID09IE5VTEwpIHsKLQkJCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IHN5bWJvbCBTMTZfVVBTUkMgbm90IGZvdW5kXG4iKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJImRzcF9zcG9zOiBzeW1ib2wgUzE2X1VQU1JDIG5vdCBmb3VuZFxuIik7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9ICAgIAogCQl9CkBAIC0xMjY1LDcgKzEyNzgsNyBAQAogCQkgICB0aGUgU2FtcGxlIFJhdGUgQ29udmVydGVkICh3aGljaCBjb3VsZAogCQkgICBhbHRlciB0aGUgcmF3IGRhdGEgc3RyZWFtIC4uLikgKi8KIAkJaWYgKHNhbXBsZV9yYXRlID09IDQ4MDAwKSB7Ci0JCQlzbmRfcHJpbnRkZCAoIklFQzk1OCBwYXNzIHRocm91Z2hcbiIpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJJRUM5NTggcGFzcyB0aHJvdWdoXG4iKTsKIAkJCS8qIEhhY2sgdG8gYnlwYXNzIGNyZWF0aW5nIGEgbmV3IFNSQyAqLwogCQkJcGFzc190aHJvdWdoID0gMTsKIAkJfQpAQCAtMTI5OSwxMyArMTMxMiwxNCBAQAogCX0KIAogCWlmIChwY21faW5kZXggPT0gLTEpIHsKLQkJc25kX3ByaW50ayAoS0VSTl9FUlIgImRzcF9zcG9zOiBubyBmcmVlIFBDTSBjaGFubmVsXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3Bvczogbm8gZnJlZSBQQ00gY2hhbm5lbFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmIChzcmNfc2NiID09IE5VTEwpIHsKIAkJaWYgKGlucy0+bnNyY19zY2IgPj0gRFNQX01BWF9TUkNfTlIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImRzcF9zcG9zOiB0byBtYW55IFNSQyBpbnN0YW5jZXNcbiEiKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJkc3Bfc3BvczogdG8gbWFueSBTUkMgaW5zdGFuY2VzXG4hIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCkBAIC0xMzMxLDcgKzEzNDUsOCBAQAogCiAJCXNucHJpbnRmIChzY2JfbmFtZSxEU1BfTUFYX1NDQl9OQU1FLCJTcmNUYXNrX1NDQiVkIixzcmNfaW5kZXgpOwogCQkKLQkJc25kX3ByaW50ZGQoICJkc3Bfc3BvczogY3JlYXRpbmcgU1JDIFwiJXNcIlxuIixzY2JfbmFtZSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImRzcF9zcG9zOiBjcmVhdGluZyBTUkMgXCIlc1wiXG4iLCBzY2JfbmFtZSk7CiAJCXNyY19zY2IgPSBjczQ2eHhfZHNwX2NyZWF0ZV9zcmNfdGFza19zY2IoY2hpcCxzY2JfbmFtZSwKIAkJCQkJCQkgc2FtcGxlX3JhdGUsCiAJCQkJCQkJIHNyY19vdXRwdXRfYnVmZmVyX2FkZHJbc3JjX2luZGV4XSwKQEAgLTEzNDMsNyArMTM1OCw4IEBACiAJCQkJCQkJIHBhc3NfdGhyb3VnaCk7CiAKIAkJaWYgKCFzcmNfc2NiKSB7Ci0JCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBjcmVhdGUgU1JDdGFza1NDQlxuIik7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiZHNwX3Nwb3M6IGZhaWxlZCB0byBjcmVhdGUgU1JDdGFza1NDQlxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCkBAIC0xMzU1LDggKzEzNzEsOCBAQAogICAKIAlzbnByaW50ZiAoc2NiX25hbWUsRFNQX01BWF9TQ0JfTkFNRSwiUENNUmVhZGVyX1NDQiVkIixwY21faW5kZXgpOwogCi0Jc25kX3ByaW50ZGQoICJkc3Bfc3BvczogY3JlYXRpbmcgUENNIFwiJXNcIiAoJWQpXG4iLHNjYl9uYW1lLAotICAgICAgICAgICAgICAgICBwY21fY2hhbm5lbF9pZCk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkc3Bfc3BvczogY3JlYXRpbmcgUENNIFwiJXNcIiAoJWQpXG4iLAorCQlzY2JfbmFtZSwgcGNtX2NoYW5uZWxfaWQpOwogCiAJcGNtX3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX3BjbV9yZWFkZXJfc2NiKGNoaXAsc2NiX25hbWUsCiAJCQkJCQkgICBwY21fcmVhZGVyX2J1ZmZlcl9hZGRyW3BjbV9pbmRleF0sCkBAIC0xMzY5LDcgKzEzODUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogCWlmICghcGNtX3NjYikgewotCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiZHNwX3Nwb3M6IGZhaWxlZCB0byBjcmVhdGUgUENNcmVhZGVyU0NCXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiZHNwX3Nwb3M6IGZhaWxlZCB0byBjcmVhdGUgUENNcmVhZGVyU0NCXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCQpAQCAtMTQxOSw3ICsxNDM2LDggQEAKIAkJdGVtcCB8PSBETUFfUlFfQzFfU09VUkNFX01PRDE2OwogCQlicmVhazsgCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZGQgKCJwZXJpb2Qgc2l6ZSAoJWQpIG5vdCBzdXBwb3J0ZWQgYnkgSFdcbiIsIHBlcmlvZF9zaXplKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicGVyaW9kIHNpemUgKCVkKSBub3Qgc3VwcG9ydGVkIGJ5IEhXXG4iLCBwZXJpb2Rfc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTQ1Nyw3ICsxNDc1LDggQEAKIAkJdGVtcCB8PSBETUFfUlFfQzFfREVTVF9NT0QxNjsKIAkJYnJlYWs7IAogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGRkICgicGVyaW9kIHNpemUgKCVkKSBub3Qgc3VwcG9ydGVkIGJ5IEhXXG4iLCBwZXJpb2Rfc2l6ZSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInBlcmlvZCBzaXplICglZCkgbm90IHN1cHBvcnRlZCBieSBIV1xuIiwgcGVyaW9kX3NpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzAuYyBiL3NvdW5kL3BjaS9jczU1MzAuYwppbmRleCBjNmI4MmM4Li5iNGUwZmY2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTMwLmMKKysrIGIvc291bmQvcGNpL2NzNTUzMC5jCkBAIC0xNjAsMTcgKzE2MCwxNyBAQAogCXNiX2Jhc2UgPSAweDIyMCArIDB4MjAgKiAobWFwICYgMyk7CiAKIAlpZiAobWFwICYgKDE8PDIpKQotCQlwcmludGsoS0VSTl9JTkZPICJDUzU1MzA6IFhwcmVzc0F1ZGlvIGF0IDB4JWx4XG4iLCBzYl9iYXNlKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiWHByZXNzQXVkaW8gYXQgMHglbHhcbiIsIHNiX2Jhc2UpOwogCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIFhwcmVzc0F1ZGlvIVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ291bGQgbm90IGZpbmQgWHByZXNzQXVkaW8hXG4iKTsKIAkJc25kX2NzNTUzMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAobWFwICYgKDE8PDUpKQotCQlwcmludGsoS0VSTl9JTkZPICJDUzU1MzA6IE1QVSBhdCAweDMwMFxuIik7CisJCWRldl9pbmZvKGNhcmQtPmRldiwgIk1QVSBhdCAweDMwMFxuIik7CiAJZWxzZSBpZiAobWFwICYgKDE8PDYpKQotCQlwcmludGsoS0VSTl9JTkZPICJDUzU1MzA6IE1QVSBhdCAweDMzMFxuIik7CisJCWRldl9pbmZvKGNhcmQtPmRldiwgIk1QVSBhdCAweDMzMFxuIik7CiAKIAlpcnEgPSBzbmRfY3M1NTMwX21peGVyX3JlYWQoc2JfYmFzZSwgMHg4MCkgJiAweDBGOwogCWRtYTggPSBzbmRfY3M1NTMwX21peGVyX3JlYWQoc2JfYmFzZSwgMHg4MSk7CkBAIC0xODIsNyArMTgyLDcgQEAKIAllbHNlIGlmIChkbWE4ICYgMHg4MCkKIAkJZG1hMTYgPSA3OwogCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIkNTNTUzMDogTm8gMTZiaXQgRE1BIGVuYWJsZWRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIk5vIDE2Yml0IERNQSBlbmFibGVkXG4iKTsKIAkJc25kX2NzNTUzMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xOTQsNyArMTk0LDcgQEAKIAllbHNlIGlmIChkbWE4ICYgMHgwOCkKIAkJZG1hOCA9IDM7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ1M1NTMwOiBObyA4Yml0IERNQSBlbmFibGVkXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJObyA4Yml0IERNQSBlbmFibGVkXG4iKTsKIAkJc25kX2NzNTUzMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMDgsMzIgKzIwOCwzMSBAQAogCWVsc2UgaWYgKGlycSAmIDgpCiAJCWlycSA9IDEwOwogCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIkNTNTUzMDogU291bmRCbGFzdGVyIElSUSBub3Qgc2V0XG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJTb3VuZEJsYXN0ZXIgSVJRIG5vdCBzZXRcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIkNTNTUzMDogSVJROiAlZCBETUE4OiAlZCBETUExNjogJWRcbiIsIGlycSwgZG1hOCwgCi0JCQkJCQkJCQlkbWExNik7CisJZGV2X2luZm8oY2FyZC0+ZGV2LCAiSVJROiAlZCBETUE4OiAlZCBETUExNjogJWRcbiIsIGlycSwgZG1hOCwgZG1hMTYpOwogCiAJZXJyID0gc25kX3NiZHNwX2NyZWF0ZShjYXJkLCBzYl9iYXNlLCBpcnEsIHNuZF9zYjE2ZHNwX2ludGVycnVwdCwgZG1hOCwKIAkJCQkJCWRtYTE2LCBTQl9IV19DUzU1MzAsICZjaGlwLT5zYik7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDUzU1MzA6IENvdWxkIG5vdCBjcmVhdGUgU291bmRCbGFzdGVyXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb3VsZCBub3QgY3JlYXRlIFNvdW5kQmxhc3RlclxuIik7CiAJCXNuZF9jczU1MzBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAllcnIgPSBzbmRfc2IxNmRzcF9wY20oY2hpcC0+c2IsIDAsICZjaGlwLT5zYi0+cGNtKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNTNTUzMDogQ291bGQgbm90IGNyZWF0ZSBQQ01cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNvdWxkIG5vdCBjcmVhdGUgUENNXG4iKTsKIAkJc25kX2NzNTUzMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IHNuZF9zYm1peGVyX25ldyhjaGlwLT5zYik7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDUzU1MzA6IENvdWxkIG5vdCBjcmVhdGUgTWl4ZXJcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNvdWxkIG5vdCBjcmVhdGUgTWl4ZXJcbiIpOwogCQlzbmRfY3M1NTMwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjQ0LDcgKzI0Myw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwogCSpyY2hpcCA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjQsNyArMjYyLDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKaW5kZXggYzBkMjgzNS4uZWRjYmJkYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKQEAgLTg0LDcgKzg0LDggQEAKIAkJdWRlbGF5KDEpOwogCX0gd2hpbGUgKC0tdGltZW91dCk7CiAJaWYgKCF0aW1lb3V0KQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJGYWlsdXJlIHdyaXRpbmcgdG8gY3M1NTM1IGNvZGVjXG4iKTsKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LAorCQkJIkZhaWx1cmUgd3JpdGluZyB0byBjczU1MzUgY29kZWNcbiIpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2NzNTUzNWF1ZGlvX2NvZGVjX3JlYWQoc3RydWN0IGNzNTUzNWF1ZGlvICpjczU1MzVhdSwKQEAgLTEwOSw4ICsxMTAsOSBAQAogCQl1ZGVsYXkoMSk7CiAJfSB3aGlsZSAoLS10aW1lb3V0KTsKIAlpZiAoIXRpbWVvdXQpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkZhaWx1cmUgcmVhZGluZyBjb2RlYyByZWcgMHgleCwiCi0JCQkJCSJMYXN0IHZhbHVlPTB4JXhcbiIsIHJlZywgdmFsKTsKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LAorCQkJIkZhaWx1cmUgcmVhZGluZyBjb2RlYyByZWcgMHgleCwgTGFzdCB2YWx1ZT0weCV4XG4iLAorCQkJcmVnLCB2YWwpOwogCiAJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCkgdmFsOwogfQpAQCAtMTY4LDcgKzE3MCw3IEBACiAJb2xwY19wcmVxdWlya3MoY2FyZCwgJmFjOTcpOwogCiAJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNzNTUzNWF1LT5hYzk3KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGVyIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibWl4ZXIgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE3Niw3ICsxNzgsNyBAQAogCiAJZXJyID0gb2xwY19xdWlya3MoY2FyZCwgY3M1NTM1YXUtPmFjOTcpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm9scGMgcXVpcmtzIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAib2xwYyBxdWlya3MgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE5NCw4ICsxOTYsOSBAQAogCQlkbWEgPSBjczU1MzVhdS0+cGxheWJhY2tfc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY3M1NTM1YXUtPnBsYXliYWNrX3N1YnN0cmVhbSk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBibTAgaXJxIHNyYywgYm1fc3RhdD0leFxuIiwKLQkJCQkJYm1fc3RhdCk7CisJCWRldl9lcnIoY3M1NTM1YXUtPmNhcmQtPmRldiwKKwkJCSJ1bmV4cGVjdGVkIGJtMCBpcnEgc3JjLCBibV9zdGF0PSV4XG4iLAorCQkJYm1fc3RhdCk7CiAJfQogfQogCkBAIC0yNDEsOCArMjQ0LDkgQEAKIAkJCQlwcm9jZXNzX2JtMV9pcnEoY3M1NTM1YXUpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmV4cGVjdGVkIGlycSBzcmM6ICIKLQkJCQkJCSIweCV4XG4iLCBhY2NfaXJxX3N0YXQpOworCQkJCWRldl9lcnIoY3M1NTM1YXUtPmNhcmQtPmRldiwKKwkJCQkJIlVuZXhwZWN0ZWQgaXJxIHNyYzogMHgleFxuIiwKKwkJCQkJYWNjX2lycV9zdGF0KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMjg3LDcgKzI5MSw3IEBACiAKIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzIpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGdldCAzMmJpdCBkbWFcbiIpOworCQlkZXZfd2FybihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ2V0IDMyYml0IGRtYVxuIik7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBwY2lmYWlsOwogCX0KQEAgLTMxMiw3ICszMTYsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY3M1NTM1YXVkaW9faW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjczU1MzVhdSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBzbmRmYWlsOwogCX0KQEAgLTMyNCw4ICszMjgsNiBAQAogCQkJCSAgY3M1NTM1YXUsICZvcHMpKSA8IDApCiAJCWdvdG8gc25kZmFpbDsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY3M1NTM1YXUgPSBjczU1MzVhdTsKIAlyZXR1cm4gMDsKIApAQCAtMzUzLDcgKzM1NSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fb2xwYy5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX29scGMuYwppbmRleCBlNmE0NDUwLi4zYjBmZGFjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fb2xwYy5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19vbHBjLmMKQEAgLTM2LDcgKzM2LDggQEAKIAllcnIgPSBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX1RFU1QyLAogCQkJMSA8PCBBQzk3X0FEX0hQRkRfU0hJRlQsIG9uIDw8IEFDOTdfQURfSFBGRF9TSElGVCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic2V0dGluZyBIaWdoIFBhc3MgRmlsdGVyIC0gJWRcbiIsIGVycik7CisJCWRldl9lcnIoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsCisJCQkic2V0dGluZyBIaWdoIFBhc3MgRmlsdGVyIC0gJWRcbiIsIGVycik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU4LDcgKzU5LDcgQEAKIAllcnIgPSBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX01JU0MsCiAJCQkxIDw8IEFDOTdfQURfVlJFRkRfU0hJRlQsIG9uIDw8IEFDOTdfQURfVlJFRkRfU0hJRlQpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzZXR0aW5nIE1JQyBCaWFzIC0gJWRcbiIsIGVycik7CisJCWRldl9lcnIoYWM5Ny0+YnVzLT5jYXJkLT5kZXYsICJzZXR0aW5nIE1JQyBCaWFzIC0gJWRcbiIsIGVycik7CiB9CiAKIHN0YXRpYyBpbnQgb2xwY19kY19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCkBAIC0xNTMsNyArMTU0LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZ3Bpb19yZXF1ZXN0KE9MUENfR1BJT19NSUNfQUMsIERSVl9OQU1FKSkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogdW5hYmxlIHRvIGFsbG9jYXRlIE1JQyBHUElPXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgTUlDIEdQSU9cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE9MUENfR1BJT19NSUNfQUMsIDApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCmluZGV4IDlhYjAxYTcuLjljMmRjOTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKQEAgLTMxNyw3ICszMTcsNyBAQAogCQlkbWEtPm9wcy0+ZGlzYWJsZV9kbWEoY3M1NTM1YXUpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmhhbmRsZWQgdHJpZ2dlclxuIik7CisJCWRldl9lcnIoY3M1NTM1YXUtPmNhcmQtPmRldiwgInVuaGFuZGxlZCB0cmlnZ2VyXG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQpAQCAtMzM1LDEzICszMzUsMTMgQEAKIAlkbWEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAljdXJkbWEgPSBkbWEtPm9wcy0+cmVhZF9kbWFfcG50cihjczU1MzVhdSk7CiAJaWYgKGN1cmRtYSA8IGRtYS0+YnVmX2FkZHIpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3VyZG1hPSV4IDwgJXggYnVmYWRkci5cbiIsCisJCWRldl9lcnIoY3M1NTM1YXUtPmNhcmQtPmRldiwgImN1cmRtYT0leCA8ICV4IGJ1ZmFkZHIuXG4iLAogCQkJCQljdXJkbWEsIGRtYS0+YnVmX2FkZHIpOwogCQlyZXR1cm4gMDsKIAl9CiAJY3VyZG1hIC09IGRtYS0+YnVmX2FkZHI7CiAJaWYgKGN1cmRtYSA+PSBkbWEtPmJ1Zl9ieXRlcykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkaWZmPSV4ID49ICV4IGJ1Zl9ieXRlcy5cbiIsCisJCWRldl9lcnIoY3M1NTM1YXUtPmNhcmQtPmRldiwgImRpZmY9JXggPj0gJXggYnVmX2J5dGVzLlxuIiwKIAkJCQkJY3VyZG1hLCBkbWEtPmJ1Zl9ieXRlcyk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wbS5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMKaW5kZXggNmMzNGRlZi4uMzRjYzYwMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlzbmRfY3M1NTM1YXVkaW9fc3RvcF9oYXJkd2FyZShjczU1MzVhdSk7CiAKIAlpZiAocGNpX3NhdmVfc3RhdGUocGNpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNTUzNWF1ZGlvOiBwY2lfc2F2ZV9zdGF0ZSBmYWlsZWQhXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfc2F2ZV9zdGF0ZSBmYWlsZWQhXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwpAQCAtOTQsOCArOTQsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M1NTM1YXVkaW86IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTExMyw3ICsxMTIsNyBAQAogCX0gd2hpbGUgKC0tdGltZW91dCk7CiAKIAlpZiAoIXRpbWVvdXQpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkZhaWx1cmUgZ2V0dGluZyBBQyBMaW5rIHJlYWR5XG4iKTsKKwkJZGV2X2VycihjczU1MzVhdS0+Y2FyZC0+ZGV2LCAiRmFpbHVyZSBnZXR0aW5nIEFDIExpbmsgcmVhZHlcbiIpOwogCiAJLyogc2V0IHVwIHJhdGUgcmVncywgZG1hLiBhY3R1YWwgaW5pdGlhdGlvbiBpcyBkb25lIGluIHRyaWcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0NTNTUzNUFVRElPX0RNQVM7IGkrKykgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMgYi9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYwppbmRleCBlYjg2ODI5Li5hZjYzMmJkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYwpAQCAtMTczOSw4ICsxNzM5LDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjE7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmF0YyA9IGF0YzsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL3hmaS5jIGIvc291bmQvcGNpL2N0eGZpL3hmaS5jCmluZGV4IGQ0NjRhZDIuLjk4NDI2ZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS94ZmkuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkveGZpLmMKQEAgLTcxLDcgKzcxLDggQEAKIAkJZGV2Kys7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCWlmICgocmVmZXJlbmNlX3JhdGUgIT0gNDgwMDApICYmIChyZWZlcmVuY2VfcmF0ZSAhPSA0NDEwMCkpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCmluZGV4IDA1Y2ZlNTUuLjlmMTBjOWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwpAQCAtNTgsNyArNTgsOCBAQAogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImVhLyVzIiwgY2FyZF9md1tmd19pbmRleF0uZGF0YSk7CiAJZXJyID0gcmVxdWVzdF9maXJtd2FyZShmd19lbnRyeSwgbmFtZSwgcGNpX2RldmljZShjaGlwKSk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgImdldF9maXJtd2FyZSgpOiBGaXJtd2FyZSBub3QgYXZhaWxhYmxlICglZClcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImdldF9maXJtd2FyZSgpOiBGaXJtd2FyZSBub3QgYXZhaWxhYmxlICglZClcbiIsIGVycik7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJZWxzZQogCQljaGlwLT5md19jYWNoZVtmd19pbmRleF0gPSAqZndfZW50cnk7CkBAIC01NjMsNyArNTY0LDcgQEAKIAllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAogCQkJCSAgICAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm1hbGxvY19wYWdlcyBlcnI9JWRcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibWFsbG9jX3BhZ2VzIGVycj0lZFxuIiwgZXJyKTsKIAkJc3Bpbl9sb2NrX2lycSgmY2hpcC0+bG9jayk7CiAJCWZyZWVfcGlwZXMoY2hpcCwgcGlwZSk7CiAJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+bG9jayk7CkBAIC0xOTg5LDggKzE5OTAsOCBAQAogCiAJaWYgKChjaGlwLT5pb3JlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihjaGlwLT5kc3BfcmVnaXN0ZXJzX3BoeXMsIHN6LAogCQkJCQkgICAgICBFQ0hPQ0FSRF9OQU1FKSkgPT0gTlVMTCkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBnZXQgbWVtb3J5IHJlZ2lvblxuIik7CiAJCXNuZF9lY2hvX2ZyZWUoY2hpcCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBnZXQgbWVtb3J5IHJlZ2lvblxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNoaXAtPmRzcF9yZWdpc3RlcnMgPSAodm9sYXRpbGUgdTMyIF9faW9tZW0gKikKQEAgLTE5OTgsOCArMTk5OSw4IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lY2hvX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlzbmRfZWNob19mcmVlKGNoaXApOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKQEAgLTIwMTEsOCArMjAxMiw4IEBACiAJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCiAJCQkJc2l6ZW9mKHN0cnVjdCBjb21tX3BhZ2UpLAogCQkJCSZjaGlwLT5jb21tcGFnZV9kbWFfYnVmKSA8IDApIHsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgdGhlIGNvbW0gcGFnZVxuIik7CiAJCXNuZF9lY2hvX2ZyZWUoY2hpcCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY29tbSBwYWdlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWNoaXAtPmNvbW1fcGFnZV9waHlzID0gY2hpcC0+Y29tbXBhZ2VfZG1hX2J1Zi5hZGRyOwpAQCAtMjA1OCwxMiArMjA1OSwxMSBAQAogCiAJREVfSU5JVCgoIkVjaG9hdWRpbyBkcml2ZXIgc3RhcnRpbmcuLi5cbiIpKTsKIAlpID0gMDsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCWNoaXAgPSBOVUxMOwkvKiBUZWxscyBzbmRfZWNob19jcmVhdGUgdG8gYWxsb2NhdGUgY2hpcCAqLwogCWlmICgoZXJyID0gc25kX2VjaG9fY3JlYXRlKGNhcmQsIHBjaSwgJmNoaXApKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKQEAgLTIwODIsNyArMjA4Miw3IEBACiAJCWNoaXAtPmRzcF9yZWdpc3RlcnNfcGh5cywgY2hpcC0+aXJxKTsKIAogCWlmICgoZXJyID0gc25kX2VjaG9fbmV3X3BjbShjaGlwKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm5ldyBwY20gZXJyb3IgJWRcbiIsIGVycik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAibmV3IHBjbSBlcnJvciAlZFxuIiwgZXJyKTsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yMDkwLDcgKzIwOTAsNyBAQAogI2lmZGVmIEVDSE9DQVJEX0hBU19NSURJCiAJaWYgKGNoaXAtPmhhc19taWRpKSB7CS8qIFNvbWUgTWlhJ3MgZG8gbm90IGhhdmUgbWlkaSAqLwogCQlpZiAoKGVyciA9IHNuZF9lY2hvX21pZGlfY3JlYXRlKGNhcmQsIGNoaXApKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm5ldyBtaWRpIGVycm9yICVkXG4iLCBlcnIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJuZXcgbWlkaSBlcnJvciAlZFxuIiwgZXJyKTsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC0yMTg5LDE0ICsyMTg5LDE0IEBACiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gY3RsX2Vycm9yOwotCXNuZF9wcmludGsoS0VSTl9JTkZPICJDYXJkIHJlZ2lzdGVyZWQ6ICVzXG4iLCBjYXJkLT5sb25nbmFtZSk7CisJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQ2FyZCByZWdpc3RlcmVkOiAlc1xuIiwgY2FyZC0+bG9uZ25hbWUpOwogCiAJcGNpX3NldF9kcnZkYXRhKHBjaSwgY2hpcCk7CiAJZGV2Kys7CiAJcmV0dXJuIDA7CiAKIGN0bF9lcnJvcjoKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJuZXcgY29udHJvbCBlcnJvciAlZFxuIiwgZXJyKTsKKwlkZXZfZXJyKGNhcmQtPmRldiwgIm5ldyBjb250cm9sIGVycm9yICVkXG4iLCBlcnIpOwogCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIyOTEsOCArMjI5MSw4IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lY2hvX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlzbmRfZWNob19mcmVlKGNoaXApOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMKaW5kZXggZDhjNjcwYy4uNWE2YTIxNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJdWRlbGF5KDEpOwogCX0KIAotCXNuZF9wcmludGsoS0VSTl9FUlIgIndhaXRfaGFuZHNoYWtlKCk6IFRpbWVvdXQgd2FpdGluZyBmb3IgRFNQXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIndhaXRfaGFuZHNoYWtlKCk6IFRpbWVvdXQgd2FpdGluZyBmb3IgRFNQXG4iKTsKIAlyZXR1cm4gLUVCVVNZOwogfQogCkBAIC0xNDksNyArMTQ5LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJaWYgKHJlYWRfZHNwKGNoaXAsICZzbltpXSkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWFkIHNlcmlhbCBudW1iZXJcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkZhaWxlZCB0byByZWFkIHNlcmlhbCBudW1iZXJcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CkBAIC0xODQsNyArMTg1LDcgQEAKIAogCWVyciA9IGdldF9maXJtd2FyZSgmZncsIGNoaXAsIGFzaWMpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJGaXJtd2FyZSBub3QgZm91bmQgIVxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIkZpcm13YXJlIG5vdCBmb3VuZCAhXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTI0Nyw3ICsyNDgsNyBAQAogCiAJaSA9IGdldF9maXJtd2FyZSgmZncsIGNoaXAsIEZXXzM2MV9MT0FERVIpOwogCWlmIChpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiRmlybXdhcmUgbm90IGZvdW5kICFcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJGaXJtd2FyZSBub3QgZm91bmQgIVxuIik7CiAJCXJldHVybiBpOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9taWRpLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pZGkuYwppbmRleCBhYmZkNTFjLi43ZjRkZmFlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21pZGkuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pZGkuYwpAQCAtMjIxLDcgKzIyMSw4IEBACiAJCURFX01JRCgoIlRyeSB0byBzZW5kICVkIGJ5dGVzLi4uXG4iLCBieXRlcykpOwogCQlzZW50ID0gd3JpdGVfbWlkaShjaGlwLCBidWYsIGJ5dGVzKTsKIAkJaWYgKHNlbnQgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ3cml0ZV9taWRpKCkgZXJyb3IgJWRcbiIsIHNlbnQpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIndyaXRlX21pZGkoKSBlcnJvciAlZFxuIiwgc2VudCk7CiAJCQkvKiByZXRyeSBsYXRlciAqLwogCQkJc2VudCA9IDkwMDA7CiAJCQljaGlwLT5taWRpX2Z1bGwgPSAxOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCmluZGV4IDllMWJkMGMuLmFkOWQ5ZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKQEAgLTExNyw3ICsxMTcsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAobWF4X2J1ZmZlcl9zaXplW2Rldl0gPCAzMikKQEAgLTE2OSw3ICsxNzAsOCBAQAogCWlmIChzbmRfc2VxX2RldmljZV9uZXcoY2FyZCwgMSwgU05EUlZfU0VRX0RFVl9JRF9FTVUxMEsxX1NZTlRILAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2VtdTEwazFfc3ludGhfYXJnKSwgJndhdmUpIDwgMCB8fAogCSAgICB3YXZlID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImNhbid0IGluaXRpYWxpemUgRW11MTBrMSB3YXZldGFibGUgc3ludGhcbiIpOworCQlkZXZfd2FybihlbXUtPmNhcmQtPmRldiwKKwkJCSAiY2FuJ3QgaW5pdGlhbGl6ZSBFbXUxMGsxIHdhdmV0YWJsZSBzeW50aFxuIik7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNuZF9lbXUxMGsxX3N5bnRoX2FyZyAqYXJnOwogCQlhcmcgPSBTTkRSVl9TRVFfREVWSUNFX0FSR1BUUih3YXZlKTsKQEAgLTI0Niw4ICsyNDgsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCmluZGV4IGNhZTM2NTkuLjNmM2VmMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfY2FsbGJhY2suYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQkJdnAgPSAmZW11LT52b2ljZXNbYmVzdFtpXS52b2ljZV07CiAJCQlpZiAoKGNoID0gdnAtPmNoKSA8IDApIHsKIAkJCQkvKgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQlkZXZfd2FybihlbXUtPmNhcmQtPmRldiwKIAkJCQkgICAgICAgInN5bnRoX2dldF92b2ljZTogY2ggPCAwICglZCkgPz8iLCBpKTsKIAkJCQkqLwogCQkJCWNvbnRpbnVlOwpAQCAtMzM5LDcgKzMzOSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWVtZW0tPm1hcF9sb2NrZWQrKzsKIAlpZiAoc25kX2VtdTEwazFfbWVtYmxrX21hcChodywgZW1lbSkgPCAwKSB7Ci0JCS8qIHByaW50ayhLRVJOX0VSUiAiZW11OiBjYW5ub3QgbWFwIVxuIik7ICovCisJCS8qIGRldl9lcnIoaHctPmNhcmQtPmRldkssICJlbXU6IGNhbm5vdCBtYXAhXG4iKTsgKi8KIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1hcHBlZF9vZmZzZXQgPSBzbmRfZW11MTBrMV9tZW1ibGtfb2Zmc2V0KGVtZW0pID4+IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCmluZGV4IGJkZDg4OGUuLjIyOTI2OTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAl9CiAJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhMDEwOF9jaGlwKSB7IC8qIGF1ZGlneTIgVmFsdWUgKi8KIAkJLyogSGFja3MgZm9yIEFsaWNlMyB0byB3b3JrIGluZGVwZW5kZW50IG9mIGhhUDE2ViBkcml2ZXIgKi8KLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkF1ZGlneTIgdmFsdWU6IFNwZWNpYWwgY29uZmlnLlxuIik7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiQXVkaWd5MiB2YWx1ZTogU3BlY2lhbCBjb25maWcuXG4iKTsKIAkJLyogU2V0dXAgU1JDTXVsdGlfSTJTIFNhbXBsaW5nUmF0ZSAqLwogCQl0bXAgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7CiAJCXRtcCAmPSAweGZmZmZmMWZmOwpAQCAtNzIzLDcgKzcyMyw4IEBACiAJCWlmIChyZWcgJiBFTVVfSEFOQV9PUFRJT05fRE9DS19PRkZMSU5FKSB7CiAJCQkvKiBBdWRpbyBEb2NrIGF0dGFjaGVkICovCiAJCQkvKiBSZXR1cm4gdG8gQXVkaW8gRG9jayBwcm9ncmFtbWluZyBtb2RlICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogTG9hZGluZyBBdWRpbyBEb2NrIEZpcm13YXJlXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogTG9hZGluZyBBdWRpbyBEb2NrIEZpcm13YXJlXG4iKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9GUEdBX0NPTkZJRywgRU1VX0hBTkFfRlBHQV9DT05GSUdfQVVESU9ET0NLKTsKIAogCQkJaWYgKCFlbXUtPmRvY2tfZncpIHsKQEAgLTc1NiwxOSArNzU3LDI1IEBACiAKIAkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9GUEdBX0NPTkZJRywgMCk7CiAJCQlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JUlFfU1RBVFVTLCAmcmVnKTsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBFTVVfSEFOQStET0NLX0lSUV9TVEFUVVMgPSAweCV4XG4iLCByZWcpOworCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJICJlbXUxMDEwOiBFTVVfSEFOQStET0NLX0lSUV9TVEFUVVMgPSAweCV4XG4iLAorCQkJCSByZWcpOwogCQkJLyogSUQsIHNob3VsZCByZWFkICYgMHg3ZiA9IDB4NTUgd2hlbiBGUEdBIHByb2dyYW1tZWQuICovCiAJCQlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JRCwgJnJlZyk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogRU1VX0hBTkErRE9DS19JRCA9IDB4JXhcbiIsIHJlZyk7CisJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCQkgImVtdTEwMTA6IEVNVV9IQU5BK0RPQ0tfSUQgPSAweCV4XG4iLCByZWcpOwogCQkJaWYgKChyZWcgJiAweDFmKSAhPSAweDE1KSB7CiAJCQkJLyogRlBHQSBmYWlsZWQgdG8gYmUgcHJvZ3JhbW1lZCAqLwotCQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmUgZmlsZSBmYWlsZWQsIHJlZyA9IDB4JXhcbiIsIHJlZyk7CisJCQkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCQkJCSAiZW11MTAxMDogTG9hZGluZyBBdWRpbyBEb2NrIEZpcm13YXJlIGZpbGUgZmFpbGVkLCByZWcgPSAweCV4XG4iLAorCQkJCQkgcmVnKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBBdWRpbyBEb2NrIEZpcm13YXJlIGxvYWRlZFxuIik7CisJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCQkgImVtdTEwMTA6IEF1ZGlvIERvY2sgRmlybXdhcmUgbG9hZGVkXG4iKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9ET0NLX01BSk9SX1JFViwgJnRtcCk7CiAJCQlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfRE9DS19NSU5PUl9SRVYsICZ0bXAyKTsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJBdWRpbyBEb2NrIHZlcjogJXUuJXVcbiIsCisJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgIkF1ZGlvIERvY2sgdmVyOiAldS4ldVxuIiwKIAkJCQkgICB0bXAsIHRtcDIpOwogCQkJLyogU3luYyBjbG9ja2luZyBiZXR3ZWVuIDEwMTAgYW5kIERvY2sgKi8KIAkJCS8qIEFsbG93IERMTCB0byBzZXR0bGUgKi8KQEAgLTc3Nyw3ICs3ODQsNyBAQAogCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1VOTVVURSwgRU1VX1VOTVVURSk7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IGZpcm13YXJlIHRocmVhZCBzdG9wcGluZ1xuIik7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBmaXJtd2FyZSB0aHJlYWQgc3RvcHBpbmdcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC04MTgsNyArODI1LDcgQEAKIAl1MzIgdG1wLCB0bXAyLCByZWc7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBTcGVjaWFsIGNvbmZpZy5cbiIpOworCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogU3BlY2lhbCBjb25maWcuXG4iKTsKIAkvKiBBQzk3IDIuMSwgQW55IDE2TWVnIG9mIDRHaWcgYWRkcmVzcywgQXV0by1NdXRlLCBFTVUzMiBTbGF2ZSwKIAkgKiBMb2NrIFNvdW5kIE1lbW9yeSBDYWNoZSwgTG9jayBUYW5rIE1lbW9yeSBDYWNoZSwKIAkgKiBNdXRlIGFsbCBjb2RlY3MuCkBAIC04NDMsNyArODUwLDcgQEAKIAogCS8qIElELCBzaG91bGQgcmVhZCAmIDB4N2YgPSAweDU1LiAoQml0IDcgaXMgdGhlIElSUSBiaXQpICovCiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSUQsICZyZWcpOwotCXNuZF9wcmludGRkKCJyZWcxID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicmVnMSA9IDB4JXhcbiIsIHJlZyk7CiAJaWYgKChyZWcgJiAweDNmKSA9PSAweDE1KSB7CiAJCS8qIEZQR0EgbmV0bGlzdCBhbHJlYWR5IHByZXNlbnQgc28gY2xlYXIgaXQgKi8KIAkJLyogUmV0dXJuIHRvIHByb2dyYW1taW5nIG1vZGUgKi8KQEAgLTg1MSwxMyArODU4LDE0IEBACiAJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9GUEdBX0NPTkZJRywgMHgwMik7CiAJfQogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lELCAmcmVnKTsKLQlzbmRfcHJpbnRkZCgicmVnMiA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInJlZzIgPSAweCV4XG4iLCByZWcpOwogCWlmICgocmVnICYgMHgzZikgPT0gMHgxNSkgewogCQkvKiBGUEdBIGZhaWxlZCB0byByZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZSAqLwotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogRlBHQSBmYWlsZWQgdG8gcmV0dXJuIHRvIHByb2dyYW1taW5nIG1vZGVcbiIpOworCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCSAiZW11MTAxMDogRlBHQSBmYWlsZWQgdG8gcmV0dXJuIHRvIHByb2dyYW1taW5nIG1vZGVcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEVNVV9IQU5BX0lEID0gMHgleFxuIiwgcmVnKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IEVNVV9IQU5BX0lEID0gMHgleFxuIiwgcmVnKTsKIAogCWlmICghZW11LT5maXJtd2FyZSkgewogCQljb25zdCBjaGFyICpmaWxlbmFtZTsKQEAgLTg4MCwxNiArODg4LDE5IEBACiAKIAkJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZW11LT5maXJtd2FyZSwgZmlsZW5hbWUsICZlbXUtPnBjaS0+ZGV2KTsKIAkJaWYgKGVyciAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbXUxMDEwOiBmaXJtd2FyZTogJXMgbm90IGZvdW5kLiBFcnIgPSAlZFxuIiwgZmlsZW5hbWUsIGVycik7CisJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCQkgImVtdTEwMTA6IGZpcm13YXJlOiAlcyBub3QgZm91bmQuIEVyciA9ICVkXG4iLAorCQkJCSBmaWxlbmFtZSwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IGZpcm13YXJlIGZpbGUgPSAlcywgc2l6ZSA9IDB4JXp4XG4iLAorCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwKKwkJCSAiZW11MTAxMDogZmlybXdhcmUgZmlsZSA9ICVzLCBzaXplID0gMHglenhcbiIsCiAJCQkgICBmaWxlbmFtZSwgZW11LT5maXJtd2FyZS0+c2l6ZSk7CiAJfQogCiAJZXJyID0gc25kX2VtdTEwMTBfbG9hZF9maXJtd2FyZShlbXUsIGVtdS0+ZmlybXdhcmUpOwogCWlmIChlcnIgIT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogTG9hZGluZyBGaXJtd2FyZSBmYWlsZWRcbiIpOworCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IExvYWRpbmcgRmlybXdhcmUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTg5NywyMSArOTA4LDIzIEBACiAJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSUQsICZyZWcpOwogCWlmICgocmVnICYgMHgzZikgIT0gMHgxNSkgewogCQkvKiBGUEdBIGZhaWxlZCB0byBiZSBwcm9ncmFtbWVkICovCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEhhbmEgRmlybXdhcmUgZmlsZSBmYWlsZWQsIHJlZyA9IDB4JXhcbiIsIHJlZyk7CisJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJICJlbXUxMDEwOiBMb2FkaW5nIEhhbmEgRmlybXdhcmUgZmlsZSBmYWlsZWQsIHJlZyA9IDB4JXhcbiIsCisJCQkgcmVnKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEhhbmEgRmlybXdhcmUgbG9hZGVkXG4iKTsKKwlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IEhhbmEgRmlybXdhcmUgbG9hZGVkXG4iKTsKIAlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9NQUpPUl9SRVYsICZ0bXApOwogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX01JTk9SX1JFViwgJnRtcDIpOwotCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBIYW5hIHZlcnNpb246ICV1LiV1XG4iLCB0bXAsIHRtcDIpOworCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogSGFuYSB2ZXJzaW9uOiAldS4ldVxuIiwgdG1wLCB0bXAyKTsKIAkvKiBFbmFibGUgNDhWb2x0IHBvd2VyIHRvIEF1ZGlvIERvY2sgKi8KIAlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfRE9DS19QV1IsIEVNVV9IQU5BX0RPQ0tfUFdSX09OKTsKIAogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX09QVElPTl9DQVJEUywgJnJlZyk7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IENhcmQgb3B0aW9ucyA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBDYXJkIG9wdGlvbnMgPSAweCV4XG4iLCByZWcpOwogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX09QVElPTl9DQVJEUywgJnJlZyk7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IENhcmQgb3B0aW9ucyA9IDB4JXhcbiIsIHJlZyk7CisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJlbXUxMDEwOiBDYXJkIG9wdGlvbnMgPSAweCV4XG4iLCByZWcpOwogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX09QVElDQUxfVFlQRSwgJnRtcCk7CiAJLyogT3B0aWNhbCAtPiBBREFUIEkvTyAgKi8KIAkvKiAwIDogU1BESUYKQEAgLTk1MCw3ICs5NjMsNyBAQAogCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9JUlFfRU5BQkxFLCAweDAwKTsKIAogCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX09QVElPTl9DQVJEUywgJnJlZyk7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IENhcmQgb3B0aW9uczMgPSAweCV4XG4iLCByZWcpOworCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiZW11MTAxMDogQ2FyZCBvcHRpb25zMyA9IDB4JXhcbiIsIHJlZyk7CiAJLyogRGVmYXVsdCBXQ0xLIHNldCB0byA0OGtIei4gKi8KIAlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfREVGQ0xPQ0ssIDB4MDApOwogCS8qIFdvcmQgQ2xvY2sgc291cmNlLCBJbnRlcm5hbCA0OGtIeiB4MSAqLwpAQCAtMTgwOCw3ICsxODIxLDkgQEAKIAllbXUtPnJldmlzaW9uID0gcGNpLT5yZXZpc2lvbjsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmVtdS0+c2VyaWFsKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZlbXUtPm1vZGVsKTsKLQlzbmRfcHJpbnRkZCgidmVuZG9yID0gMHgleCwgZGV2aWNlID0gMHgleCwgc3Vic3lzdGVtX3ZlbmRvcl9pZCA9IDB4JXgsIHN1YnN5c3RlbV9pZCA9IDB4JXhcbiIsIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSwgZW11LT5zZXJpYWwsIGVtdS0+bW9kZWwpOworCWRldl9kYmcoY2FyZC0+ZGV2LAorCQkidmVuZG9yID0gMHgleCwgZGV2aWNlID0gMHgleCwgc3Vic3lzdGVtX3ZlbmRvcl9pZCA9IDB4JXgsIHN1YnN5c3RlbV9pZCA9IDB4JXhcbiIsCisJCXBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSwgZW11LT5zZXJpYWwsIGVtdS0+bW9kZWwpOwogCiAJZm9yIChjID0gZW11X2NoaXBfZGV0YWlsczsgYy0+dmVuZG9yOyBjKyspIHsKIAkJaWYgKGMtPnZlbmRvciA9PSBwY2ktPnZlbmRvciAmJiBjLT5kZXZpY2UgPT0gcGNpLT5kZXZpY2UpIHsKQEAgLTE4MjcsMjEgKzE4NDIsMjEgQEAKIAkJfQogCX0KIAlpZiAoYy0+dmVuZG9yID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogQ2FyZCBub3QgcmVjb2duaXNlZFxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZW11MTBrMTogQ2FyZCBub3QgcmVjb2duaXNlZFxuIik7CiAJCWtmcmVlKGVtdSk7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAJZW11LT5jYXJkX2NhcGFiaWxpdGllcyA9IGM7CiAJaWYgKGMtPnN1YnN5c3RlbSAmJiAhc3Vic3lzdGVtKQotCQlzbmRfcHJpbnRkZCgiU291bmQgY2FyZCBuYW1lID0gJXNcbiIsIGMtPm5hbWUpOworCQlkZXZfZGJnKGNhcmQtPmRldiwgIlNvdW5kIGNhcmQgbmFtZSA9ICVzXG4iLCBjLT5uYW1lKTsKIAllbHNlIGlmIChzdWJzeXN0ZW0pCi0JCXNuZF9wcmludGRkKCJTb3VuZCBjYXJkIG5hbWUgPSAlcywgIgorCQlkZXZfZGJnKGNhcmQtPmRldiwgIlNvdW5kIGNhcmQgbmFtZSA9ICVzLCAiCiAJCQkidmVuZG9yID0gMHgleCwgZGV2aWNlID0gMHgleCwgc3Vic3lzdGVtID0gMHgleC4gIgogCQkJIkZvcmNlZCB0byBzdWJzeXN0ZW0gPSAweCV4XG4iLAljLT5uYW1lLAogCQkJcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlLCBlbXUtPnNlcmlhbCwgYy0+c3Vic3lzdGVtKTsKIAllbHNlCi0JCXNuZF9wcmludGRkKCJTb3VuZCBjYXJkIG5hbWUgPSAlcywgIgorCQlkZXZfZGJnKGNhcmQtPmRldiwgIlNvdW5kIGNhcmQgbmFtZSA9ICVzLCAiCiAJCQkidmVuZG9yID0gMHgleCwgZGV2aWNlID0gMHgleCwgc3Vic3lzdGVtID0gMHgleC5cbiIsCiAJCQljLT5uYW1lLCBwY2ktPnZlbmRvciwgcGNpLT5kZXZpY2UsCiAJCQllbXUtPnNlcmlhbCk7CkBAIC0xODY5LDcgKzE4ODQsOSBAQAogCWVtdS0+ZG1hX21hc2sgPSBpc19hdWRpZ3kgPyBBVURJR1lfRE1BX01BU0sgOiBFTVUxMEsxX0RNQV9NQVNLOwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgZW11LT5kbWFfbWFzaykgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIGVtdS0+ZG1hX21hc2spIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCBQQ0kgYnVzbWFzdGVyIERNQSB3aXRoIG1hc2sgMHglbHhcbiIsIGVtdS0+ZG1hX21hc2spOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCBQQ0kgYnVzbWFzdGVyIERNQSB3aXRoIG1hc2sgMHglbHhcbiIsCisJCQllbXUtPmRtYV9tYXNrKTsKIAkJa2ZyZWUoZW11KTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CkBAIC0yMDIxLDcgKzIwMzgsNiBAQAogCXNuZF9lbXUxMGsxX3Byb2NfaW5pdChlbXUpOwogI2VuZGlmCiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJKnJlbXUgPSBlbXU7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfcGF0Y2guYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfcGF0Y2guYwppbmRleCA2NjJhNDU4Li4wZTA2OWFlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3BhdGNoLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jCkBAIC01MCw3ICs1MCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHNwLT52LnNpemUgPT0gMCkgewotCQlzbmRfcHJpbnRkKCJlbXU6IHJvbSBmb250IGZvciBzYW1wbGUgJWRcbiIsIHNwLT52LnNhbXBsZSk7CisJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCQkiZW11OiByb20gZm9udCBmb3Igc2FtcGxlICVkXG4iLCBzcC0+di5zYW1wbGUpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTkyLDcgKzkzLDggQEAKIAkJYmxvY2tzaXplICo9IDI7CiAJc3AtPmJsb2NrID0gc25kX2VtdTEwazFfc3ludGhfYWxsb2MoZW11LCBibG9ja3NpemUpOwogCWlmIChzcC0+YmxvY2sgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRkKCJlbXUxMGsxOiBzeW50aCBtYWxsb2MgZmFpbGVkIChzaXplPSVkKVxuIiwgYmxvY2tzaXplKTsKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJCSJzeW50aCBtYWxsb2MgZmFpbGVkIChzaXplPSVkKVxuIiwgYmxvY2tzaXplKTsKIAkJLyogbm90IEVOT01FTSAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBPU1MpICovCiAJCXJldHVybiAtRU5PU1BDOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCmluZGV4IDU2YWQ5ZDYuLmVmZTAxNzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpAQCAtMzY5LDcgKzM2OSw4IEBACiAJaWYgKGVwY20tPnN1YnN0cmVhbSA9PSBOVUxMKQogCQlyZXR1cm47CiAjaWYgMAotCXNuZF9wcmludGsoS0VSTl9JTkZPICJJUlE6IHBvc2l0aW9uID0gMHgleCwgcGVyaW9kID0gMHgleCwgc2l6ZSA9IDB4JXhcbiIsCisJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsCisJCSAiSVJROiBwb3NpdGlvbiA9IDB4JXgsIHBlcmlvZCA9IDB4JXgsIHNpemUgPSAweCV4XG4iLAogCQkgICBlcGNtLT5zdWJzdHJlYW0tPm9wcy0+cG9pbnRlcihlcGNtLT5zdWJzdHJlYW0pLAogCQkgICBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoZXBjbS0+c3Vic3RyZWFtKSwKIAkJICAgc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKGVwY20tPnN1YnN0cmVhbSkpOwpAQCAtNDg3LDcgKzQ4OCwxMSBAQAogCWludCBjaGFubmVsID0gZXBjbS0+dm9pY2UtPm51bWJlcjsKIAlpbnQgcmVzdWx0ID0gMDsKIAotLy8Jc25kX3ByaW50ayhLRVJOX0lORk8gInRyaWdnZXIgLSBlbXUxMGsxeCA9IDB4JXgsIGNtZCA9ICVpLCBwb2ludGVyID0gJWRcbiIsIChpbnQpZW11LCBjbWQsIChpbnQpc3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoc3Vic3RyZWFtKSk7CisJLyoKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkidHJpZ2dlciAtIGVtdTEwazF4ID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlZFxuIiwKKwkJKGludCllbXUsIGNtZCwgKGludClzdWJzdHJlYW0tPm9wcy0+cG9pbnRlcihzdWJzdHJlYW0pKTsKKwkqLwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgpAQCAtODI2LDcgKzgzMSw3IEBACiAJLy8gYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCBpZiBuZWNlc3NhcnkKIAlvdXRsKHN0YXR1cywgY2hpcC0+cG9ydCArIElQUik7CiAKLQkvLyBzbmRfcHJpbnRrKEtFUk5fSU5GTyAiaW50ZXJydXB0ICUwOHhcbiIsIHN0YXR1cyk7CisJLyogZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQgJTA4eFxuIiwgc3RhdHVzKTsgKi8KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTkxOSw3ICs5MjQsNyBAQAogCQlyZXR1cm4gZXJyOwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciB0byBzZXQgMjhiaXQgbWFzayBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImVycm9yIHRvIHNldCAyOGJpdCBtYXNrIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTk0MCwxNCArOTQ1LDE1IEBACiAJY2hpcC0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlmICgoY2hpcC0+cmVzX3BvcnQgPSByZXF1ZXN0X3JlZ2lvbihjaGlwLT5wb3J0LCA4LAogCQkJCQkgICAgICJFTVUxMEsxWCIpKSA9PSBOVUxMKSB7IAotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxeDogY2Fubm90IGFsbG9jYXRlIHRoZSBwb3J0IDB4JWx4XG4iLCBjaGlwLT5wb3J0KTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgdGhlIHBvcnQgMHglbHhcbiIsCisJCQljaGlwLT5wb3J0KTsKIAkJc25kX2VtdTEwazF4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZW11MTBrMXhfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxeDogY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lbXUxMGsxeF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTk2NCw3ICs5NzAsNyBAQAogCWNoaXAtPnJldmlzaW9uID0gcGNpLT5yZXZpc2lvbjsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmNoaXAtPnNlcmlhbCk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmY2hpcC0+bW9kZWwpOwotCXNuZF9wcmludGsoS0VSTl9JTkZPICJNb2RlbCAlMDR4IFJldiAlMDh4IFNlcmlhbCAlMDh4XG4iLCBjaGlwLT5tb2RlbCwKKwlkZXZfaW5mbyhjYXJkLT5kZXYsICJNb2RlbCAlMDR4IFJldiAlMDh4IFNlcmlhbCAlMDh4XG4iLCBjaGlwLT5tb2RlbCwKIAkJICAgY2hpcC0+cmV2aXNpb24sIGNoaXAtPnNlcmlhbCk7CiAKIAlvdXRsKDAsIGNoaXAtPnBvcnQgKyBJTlRFKTsJCkBAIC0xMjQ4LDcgKzEyNTQsOSBAQAogCQltcHU0MDFfcmVhZF9kYXRhKGVtdSwgbXB1KTsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJaWYgKHRpbWVvdXQgPD0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY21kOiBjbGVhciByeCB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwgbXB1NDAxX3JlYWRfc3RhdChlbXUsIG1wdSkpOworCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJImNtZDogY2xlYXIgcnggdGltZW91dCAoc3RhdHVzID0gMHgleClcbiIsCisJCQltcHU0MDFfcmVhZF9zdGF0KGVtdSwgbXB1KSk7CiAjZW5kaWYKIH0KIApAQCAtMTMyMiw3ICsxMzMwLDggQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaS0+aW5wdXRfbG9jaywgZmxhZ3MpOwogCWlmICghb2spIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkibWlkaV9jbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4IChzdGF0dXMgPSAweCV4LCBkYXRhID0gMHgleCkhISFcbiIsCiAJCQkgICBjbWQsIGVtdS0+cG9ydCwKIAkJCSAgIG1wdTQwMV9yZWFkX3N0YXQoZW11LCBtaWRpKSwKIAkJCSAgIG1wdTQwMV9yZWFkX2RhdGEoZW11LCBtaWRpKSk7CkBAIC0xNTY0LDcgKzE1NzMsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTYwOCw4ICsxNjE4LDYgQEAKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHggaXJxICVpIiwKIAkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5wb3J0LCBjaGlwLT5pcnEpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwppbmRleCAxZjljN2M0Li43NDVmMDYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKQEAgLTE1NDcsNyArMTU0Nyw3IEBACiAJLyogQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9GUk9OVF9MLCBBX0VYVE9VVF9GUk9OVF9SLCBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKTsgKi8KIAlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11X21vZGVsKSB7CiAJCS8qIEVNVTEwMTAgT3V0cHV0cyBmcm9tIFBDTSBGcm9udCwgUmVhciwgQ2VudGVyLCBMRkUsIFNpZGUgKi8KLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkVNVSBvdXRwdXRzIG9uXG4iKTsKKwkJZGV2X2luZm8oZW11LT5jYXJkLT5kZXYsICJFTVUgb3V0cHV0cyBvblxuIik7CiAJCWZvciAoeiA9IDA7IHogPCA4OyB6KyspIHsKIAkJCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5jYTAxMDhfY2hpcCkgewogCQkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBM19FTVUzMk9VVCh6KSwgQV9HUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIHopLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CkBAIC0xNTcxLDcgKzE1NzEsOSBAQAogCQlBX1NXSVRDSChpY29kZSwgJnB0ciwgdG1wICsgMSwgcGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIHosIHRtcCArIDEpOwogCQlpZiAoKHo9PTEpICYmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5zcGRpZl9idWcpKSB7CiAJCQkvKiBEdWUgdG8gYSBTUERJRiBvdXRwdXQgYnVnIG9uIHNvbWUgQXVkaWd5IGNhcmRzLCB0aGlzIGNvZGUgZGVsYXlzIHRoZSBSaWdodCBjaGFubmVsIGJ5IDEgc2FtcGxlICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSW5zdGFsbGluZyBzcGRpZl9idWcgcGF0Y2g6ICVzXG4iLCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5uYW1lKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiSW5zdGFsbGluZyBzcGRpZl9idWcgcGF0Y2g6ICVzXG4iLAorCQkJCSBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5uYW1lKTsKIAkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0VYVE9VVChBX0VYVE9VVF9GUk9OVF9MICsgeiksIEFfR1BSKGdwciAtIDMpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CiAJCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIoZ3ByIC0gMyksIEFfR1BSKHRtcCArIDApLCBBX0dQUih0bXAgKyAxKSwgQV9DXzAwMDAwMDAwKTsKIAkJfSBlbHNlIHsKQEAgLTE1OTUsNyArMTU5Nyw3IEBACiAKIAlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11X21vZGVsKSB7CiAJCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5jYTAxMDhfY2hpcCkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkVNVTIgaW5wdXRzIG9uXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiRU1VMiBpbnB1dHMgb25cbiIpOwogCQkJZm9yICh6ID0gMDsgeiA8IDB4MTA7IHorKykgewogCQkJCXNuZF9lbXUxMGsxX2F1ZGlneV9kc3BfY29udmVydF8zMl90b18yeDE2KCBpY29kZSwgJnB0ciwgdG1wLCAKIAkJCQkJCQkJCWJpdF9zaGlmdGVyMTYsCkBAIC0xNjAzLDExICsxNjA1LDExIEBACiAJCQkJCQkJCQlBX0ZYQlVTMih6KjIpICk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRU1VIGlucHV0cyBvblxuIik7CisJCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgIkVNVSBpbnB1dHMgb25cbiIpOwogCQkJLyogQ2FwdHVyZSAxNiAob3JpZ2luYWxseSA4KSBjaGFubmVscyBvZiBTMzJfTEUgc291bmQgKi8KIAogCQkJLyoKLQkJCXByaW50ayhLRVJOX0RFQlVHICJlbXVmeC5jOiBncHI9MHgleCwgdG1wPTB4JXhcbiIsCisJCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiZW11ZnguYzogZ3ByPTB4JXgsIHRtcD0weCV4XG4iLAogCQkJICAgICAgIGdwciwgdG1wKTsKIAkJCSovCiAJCQkvKiBGb3IgdGhlIEVNVTEwMTA6IEhvdyB0byBnZXQgMzJiaXQgdmFsdWVzIGZyb20gdGhlIERTUC4gSGlnaCAxNmJpdHMgaW50byBMLCBsb3cgMTZiaXRzIGludG8gUi4gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCmluZGV4IGY2YzNkYTAuLmM1YWUyYTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYwpAQCAtMTg1Myw4ICsxODUzLDEwIEBACiAJCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZlbXUtPmFjOTcpKSA8IDApIHsKIAkJCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5hYzk3X2NoaXAgPT0gMSkKIAkJCQlyZXR1cm4gZXJyOwotCQkJc25kX3ByaW50ZChLRVJOX0lORk8gImVtdTEwazE6IEFDOTcgaXMgb3B0aW9uYWwgb24gdGhpcyBib2FyZFxuIik7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyIgICAgICAgICAgUHJvY2VlZGluZyB3aXRob3V0IGFjOTcgbWl4ZXJzLi4uXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiQUM5NyBpcyBvcHRpb25hbCBvbiB0aGlzIGJvYXJkXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiUHJvY2VlZGluZyB3aXRob3V0IGFjOTcgbWl4ZXJzLi4uXG4iKTsKIAkJCXNuZF9kZXZpY2VfZnJlZShlbXUtPmNhcmQsIHBidXMpOwogCQkJZ290byBub19hYzk3OyAvKiBGSVhNRTogZ2V0IHJpZCBvZiB1Z2x5IGdvdG9zLi4gKi8KIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11bXB1NDAxLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtcHU0MDEuYwppbmRleCAxZWM5MTI0Li5mZGYyYjBhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVtcHU0MDEuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtcHU0MDEuYwpAQCAtNjQsNyArNjQsOSBAQAogCQltcHU0MDFfcmVhZF9kYXRhKGVtdSwgbXB1KTsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJaWYgKHRpbWVvdXQgPD0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY21kOiBjbGVhciByeCB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwgbXB1NDAxX3JlYWRfc3RhdChlbXUsIG1wdSkpOworCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJImNtZDogY2xlYXIgcnggdGltZW91dCAoc3RhdHVzID0gMHgleClcbiIsCisJCQltcHU0MDFfcmVhZF9zdGF0KGVtdSwgbXB1KSk7CiAjZW5kaWYKIH0KIApAQCAtMTQxLDcgKzE0Myw4IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGktPmlucHV0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIW9rKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pZGlfY21kOiAweCV4IGZhaWxlZCBhdCAweCVseCAoc3RhdHVzID0gMHgleCwgZGF0YSA9IDB4JXgpISEhXG4iLAorCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJIm1pZGlfY21kOiAweCV4IGZhaWxlZCBhdCAweCVseCAoc3RhdHVzID0gMHgleCwgZGF0YSA9IDB4JXgpISEhXG4iLAogCQkJICAgY21kLCBlbXUtPnBvcnQsCiAJCQkgICBtcHU0MDFfcmVhZF9zdGF0KGVtdSwgbWlkaSksCiAJCQkgICBtcHU0MDFfcmVhZF9kYXRhKGVtdSwgbWlkaSkpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYwppbmRleCA1YWUxZDA0Li5mODI0ODFiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYwpAQCAtNDQsNyArNDQsOCBAQAogCWlmIChlcGNtLT5zdWJzdHJlYW0gPT0gTlVMTCkKIAkJcmV0dXJuOwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAiSVJROiBwb3NpdGlvbiA9IDB4JXgsIHBlcmlvZCA9IDB4JXgsIHNpemUgPSAweCV4XG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJJUlE6IHBvc2l0aW9uID0gMHgleCwgcGVyaW9kID0gMHgleCwgc2l6ZSA9IDB4JXhcbiIsCiAJCQllcGNtLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LT5wb2ludGVyKGVtdSwgZXBjbS0+c3Vic3RyZWFtKSwKIAkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhlcGNtLT5zdWJzdHJlYW0pLAogCQkJc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKGVwY20tPnN1YnN0cmVhbSkpOwpAQCAtMTQ3LDcgKzE0OCw3IEBACiAJCQkJCSAgICAgICZlcGNtLT5leHRyYSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbV9jaGFubmVsX2FsbG9jOiAiCisJCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicGNtX2NoYW5uZWxfYWxsb2M6ICIKIAkJCSAgICAgICAiZmFpbGVkIGV4dHJhOiB2b2ljZXM9JWQsIGZyYW1lPSVkXG4iLAogCQkJICAgICAgIHZvaWNlcywgZnJhbWUpOwogCQkJKi8KQEAgLTc2MSw3ICs3NjIsOCBAQAogCWludCByZXN1bHQgPSAwOwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAidHJpZ2dlciAtIGVtdTEwazEgPSAweCV4LCBjbWQgPSAlaSwgcG9pbnRlciA9ICVpXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJ0cmlnZ2VyIC0gZW11MTBrMSA9IDB4JXgsIGNtZCA9ICVpLCBwb2ludGVyID0gJWlcbiIsCiAJICAgICAgIChpbnQpZW11LCBjbWQsIHN1YnN0cmVhbS0+b3BzLT5wb2ludGVyKHN1YnN0cmVhbSkpCiAJKi8KIAlzcGluX2xvY2soJmVtdS0+cmVnX2xvY2spOwpAQCAtODE1LDcgKzgxNyw3IEBACiAJCW91dGwoZXBjbS0+Y2FwdHVyZV9pcHIsIGVtdS0+cG9ydCArIElQUik7CiAJCXNuZF9lbXUxMGsxX2ludHJfZW5hYmxlKGVtdSwgZXBjbS0+Y2FwdHVyZV9pbnRlKTsKIAkJLyoKLQkJcHJpbnRrKEtFUk5fREVCVUcgImFkY2NyID0gMHgleCwgYWRjYnMgPSAweCV4XG4iLAorCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiYWRjY3IgPSAweCV4LCBhZGNicyA9IDB4JXhcbiIsCiAJCSAgICAgICBlcGNtLT5hZGNjciwgZXBjbS0+YWRjYnMpOwogCQkqLwogCQlzd2l0Y2ggKGVwY20tPnR5cGUpIHsKQEAgLTgyNiw3ICs4MjgsMTAgQEAKIAkJCWlmIChlbXUtPmF1ZGlneSkgewogCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhXQzEsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsKTsKIAkJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0ZYV0MyLCAwLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbDIpOwotCQkJCXNuZF9wcmludGRkKCJjcl92YWw9MHgleCwgY3JfdmFsMj0weCV4XG4iLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwyKTsKKwkJCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCQkiY3JfdmFsPTB4JXgsIGNyX3ZhbDI9MHgleFxuIiwKKwkJCQkJZXBjbS0+Y2FwdHVyZV9jcl92YWwsCisJCQkJCWVwY20tPmNhcHR1cmVfY3JfdmFsMik7CiAJCQl9IGVsc2UKIAkJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGWFdDLCAwLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbCk7CiAJCQlicmVhazsKQEAgLTg4OSw3ICs4OTQsNyBAQAogCX0KICNlbmRpZgogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAogCSAgICAgICAicHRyID0gMHglbHgsIGJ1ZmZlcl9zaXplID0gMHglbHgsIHBlcmlvZF9zaXplID0gMHglbHhcbiIsCiAJICAgICAgIChsb25nKXB0ciwgKGxvbmcpcnVudGltZS0+YnVmZmVyX3NpemUsCiAJICAgICAgIChsb25nKXJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKQEAgLTE1OTQsNyArMTU5OSw4IEBACiAJCQkJCQkgICB1bnNpZ25lZCBpbnQgdHJhbV9zaGlmdCkKIHsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJ0cmFtX3Bva2UxOiBkc3RfbGVmdCA9IDB4JXAsIGRzdF9yaWdodCA9IDB4JXAsICIKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkidHJhbV9wb2tlMTogZHN0X2xlZnQgPSAweCVwLCBkc3RfcmlnaHQgPSAweCVwLCAiCiAJICAgICAgICJzcmMgPSAweCVwLCBjb3VudCA9IDB4JXhcbiIsCiAJICAgICAgIGRzdF9sZWZ0LCBkc3RfcmlnaHQsIHNyYywgY291bnQpOwogCSovCkBAIC0xNjc1LDcgKzE2ODEsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCQogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgInByZXBhcmU6IGV0cmFtX3BhZ2VzID0gMHglcCwgZG1hX2FyZWEgPSAweCV4LCAiCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInByZXBhcmU6IGV0cmFtX3BhZ2VzID0gMHglcCwgZG1hX2FyZWEgPSAweCV4LCAiCiAJICAgICAgICJidWZmZXJfc2l6ZSA9IDB4JXggKDB4JXgpXG4iLAogCSAgICAgICBlbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcywgcnVudGltZS0+ZG1hX2FyZWEsCiAJICAgICAgIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5idWZmZXJfc2l6ZSA8PCAyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9pby5jCmluZGV4IGU0ZmJhNDkuLjcwNmI0ZjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvaW8uYwpAQCAtNzEsMTEgKzcxLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBtYXNrOwogCi0JaWYgKCFlbXUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicHRyX3dyaXRlOiBlbXUgaXMgbnVsbCFcbiIpOwotCQlkdW1wX3N0YWNrKCk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCiAJCXJldHVybjsKLQl9CiAJbWFzayA9IGVtdS0+YXVkaWd5ID8gQV9QVFJfQUREUkVTU19NQVNLIDogUFRSX0FERFJFU1NfTUFTSzsKIAlyZWdwdHIgPSAoKHJlZyA8PCAxNikgJiBtYXNrKSB8IChjaG4gJiBQVFJfQ0hBTk5FTE5VTV9NQVNLKTsKIApAQCAtMTk5LDcgKzE5Niw3IEBACiAJaW50IGVyciA9IDA7CiAKIAlpZiAoKHJlZyA+IDB4N2YpIHx8ICh2YWx1ZSA+IDB4MWZmKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpMmNfd3JpdGU6IGludmFsaWQgdmFsdWVzLlxuIik7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJpMmNfd3JpdGU6IGludmFsaWQgdmFsdWVzLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjI3LDcgKzIyNCw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWlmICh0aW1lb3V0ID4gMTAwMCkgewotICAgICAgICAgICAgICAgIAkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQlkZXZfd2FybihlbXUtPmNhcmQtPmRldiwKIAkJCQkJICAgImVtdTEwazE6STJDOnRpbWVvdXQgc3RhdHVzPTB4JXhcbiIsCiAJCQkJCSAgIHN0YXR1cyk7CiAJCQkJYnJlYWs7CkBAIC0yMzksOCArMjM2LDggQEAKIAl9CiAKIAlpZiAocmV0cnkgPT0gMTApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiV3JpdGluZyB0byBBREMgZmFpbGVkIVxuIik7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInN0YXR1cz0weCV4LCByZWc9JWQsIHZhbHVlPSVkXG4iLAorCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LCAiV3JpdGluZyB0byBBREMgZmFpbGVkIVxuIik7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJzdGF0dXM9MHgleCwgcmVnPSVkLCB2YWx1ZT0lZFxuIiwKIAkJCXN0YXR1cywgcmVnLCB2YWx1ZSk7CiAJCS8qIGR1bXBfc3RhY2soKTsgKi8KIAkJZXJyID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2lycS5jIGIvc291bmQvcGNpL2VtdTEwazEvaXJxLmMKaW5kZXggMzBiZmVkNi4uM2M1YzVlMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvaXJxLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvaXJxLmMKQEAgLTQxLDExICs0MSwxMiBAQAogCQlvcmlnX3N0YXR1cyA9IHN0YXR1czsKIAkJaGFuZGxlZCA9IDE7CiAJCWlmICgoc3RhdHVzICYgMHhmZmZmZmZmZikgPT0gMHhmZmZmZmZmZikgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gInNuZC1lbXUxMGsxOiBTdXNwZWN0ZWQgc291bmQgY2FyZCByZW1vdmFsXG4iKTsKKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiU3VzcGVjdGVkIHNvdW5kIGNhcmQgcmVtb3ZhbFxuIik7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoc3RhdHVzICYgSVBSX1BDSUVSUk9SKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQ6IFBDSSBlcnJvclxuIik7CisJCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0OiBQQ0kgZXJyb3JcbiIpOwogCQkJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgSU5URV9QQ0lFUlJPUkVOQUJMRSk7CiAJCQlzdGF0dXMgJj0gfklQUl9QQ0lFUlJPUjsKIAkJfQpAQCAtMTU3LDE5ICsxNTgsMjIgQEAKIAkJCQlzdHJ1Y3Qgc25kX2VtdTEwazFfdm9pY2UgKnB2b2ljZSA9ICYoZW11LT5wMTZ2X3ZvaWNlc1swXSk7CiAJCQkJc3RydWN0IHNuZF9lbXUxMGsxX3ZvaWNlICpjdm9pY2UgPSAmKGVtdS0+cDE2dl9jYXB0dXJlX3ZvaWNlKTsKIAotCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAic3RhdHVzMj0weCV4XG4iLCBzdGF0dXMyKTsKKwkJCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAic3RhdHVzMj0weCV4XG4iLCBzdGF0dXMyKTsgKi8KIAkJCQlvcmlnX3N0YXR1czIgPSBzdGF0dXMyOwogCQkJCWlmKHN0YXR1czIgJiBtYXNrKSB7CiAJCQkJCWlmKHB2b2ljZS0+dXNlKSB7CiAJCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHB2b2ljZS0+ZXBjbS0+c3Vic3RyZWFtKTsKIAkJCQkJfSBlbHNlIHsgCi0JCQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwMTZ2OiBzdGF0dXM6IDB4JTA4eCwgbWFzaz0weCUwOHgsIHB2b2ljZT0lcCwgdXNlPSVkXG4iLCBzdGF0dXMyLCBtYXNrLCBwdm9pY2UsIHB2b2ljZS0+dXNlKTsKKwkJCQkJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkJCQkJInAxNnY6IHN0YXR1czogMHglMDh4LCBtYXNrPTB4JTA4eCwgcHZvaWNlPSVwLCB1c2U9JWRcbiIsCisJCQkJCQkJc3RhdHVzMiwgbWFzaywgcHZvaWNlLAorCQkJCQkJCXB2b2ljZS0+dXNlKTsKIAkJCQkJfQogCQkJCX0KIAkJCQlpZihzdGF0dXMyICYgMHgxMTAwMDApIHsKLQkJCQkJLy9wcmludGsoS0VSTl9JTkZPICJjYXB0dXJlIGludCBmb3VuZFxuIik7CisJCQkJCS8qIGRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiY2FwdHVyZSBpbnQgZm91bmRcbiIpOyAqLwogCQkJCQlpZihjdm9pY2UtPnVzZSkgewotCQkJCQkJLy9wcmludGsoS0VSTl9JTkZPICJjYXB0dXJlIHBlcmlvZF9lbGFwc2VkXG4iKTsKKwkJCQkJCS8qIGRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LCAiY2FwdHVyZSBwZXJpb2RfZWxhcHNlZFxuIik7ICovCiAJCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGN2b2ljZS0+ZXBjbS0+c3Vic3RyZWFtKTsKIAkJCQkJfQogCQkJCX0KQEAgLTE4MCw3ICsxODQsOCBAQAogCiAJCWlmIChzdGF0dXMpIHsKIAkJCXVuc2lnbmVkIGludCBiaXRzOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5oYW5kbGVkIGludGVycnVwdDogMHglMDh4XG4iLCBzdGF0dXMpOworCQkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCQkidW5oYW5kbGVkIGludGVycnVwdDogMHglMDh4XG4iLCBzdGF0dXMpOwogCQkJLy9tYWtlIHN1cmUgYW55IGludGVycnVwdHMgd2UgZG9uJ3QgaGFuZGxlIGFyZSBkaXNhYmxlZDoKIAkJCWJpdHMgPSBJTlRFX0ZYRFNQRU5BQkxFIHwKIAkJCQlJTlRFX1BDSUVSUk9SRU5BQkxFIHwKQEAgLTIwMiw3ICsyMDcsNyBAQAogCQlvdXRsKG9yaWdfc3RhdHVzLCBlbXUtPnBvcnQgKyBJUFIpOyAvKiBhY2sgYWxsICovCiAJfQogCWlmICh0aW1lb3V0ID09IDEwMDApCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMGsxIGlycSByb3V0aW5lIGZhaWx1cmVcbiIpOworCQlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwazEgaXJxIHJvdXRpbmUgZmFpbHVyZVxuIik7CiAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL21lbW9yeS5jIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKaW5kZXggYWU3MDljMS4uYzY4ZTZkZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKQEAgLTIzNiwxMSArMjM2LDEzIEBACiBzdGF0aWMgaW50IGlzX3ZhbGlkX3BhZ2Uoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIGRtYV9hZGRyX3QgYWRkcikKIHsKIAlpZiAoYWRkciAmIH5lbXUtPmRtYV9tYXNrKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm1heCBtZW1vcnkgc2l6ZSBpcyAweCVseCAoYWRkciA9IDB4JWx4KSEhXG4iLCBlbXUtPmRtYV9tYXNrLCAodW5zaWduZWQgbG9uZylhZGRyKTsKKwkJZGV2X2VycihlbXUtPmNhcmQtPmRldiwKKwkJCSJtYXggbWVtb3J5IHNpemUgaXMgMHglbHggKGFkZHIgPSAweCVseCkhIVxuIiwKKwkJCWVtdS0+ZG1hX21hc2ssICh1bnNpZ25lZCBsb25nKWFkZHIpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGFkZHIgJiAoRU1VUEFHRVNJWkUtMSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGFnZSBpcyBub3QgYWxpZ25lZFxuIik7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsICJwYWdlIGlzIG5vdCBhbGlnbmVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAxOwpAQCAtMzMxLDcgKzMzMyw4IEBACiAJCWVsc2UKIAkJCWFkZHIgPSBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHN1YnN0cmVhbSwgb2ZzKTsKIAkJaWYgKCEgaXNfdmFsaWRfcGFnZShlbXUsIGFkZHIpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVtdTogZmFpbHVyZSBwYWdlID0gJWRcbiIsIGlkeCk7CisJCQlkZXZfZXJyKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSJlbXU6IGZhaWx1cmUgcGFnZSA9ICVkXG4iLCBpZHgpOwogCQkJbXV0ZXhfdW5sb2NrKCZoZHItPmJsb2NrX211dGV4KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CkBAIC01MDcsNyArNTEwLDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJcHRyID0gZW11LT5wYWdlX3B0cl90YWJsZVtwYWdlXTsKIAlpZiAoISBwdHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBhY2Nlc3MgdG8gTlVMTCBwdHI6IHBhZ2UgPSAlZFxuIiwgcGFnZSk7CisJCWRldl9lcnIoZW11LT5jYXJkLT5kZXYsCisJCQkiYWNjZXNzIHRvIE5VTEwgcHRyOiBwYWdlID0gJWRcbiIsIHBhZ2UpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcHRyICs9IG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYwppbmRleCA3ZTIwMjVjLi5hNGZlN2YwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfcGNtICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwogICAKIAlpZiAoZXBjbSkgewotICAgICAgICAJLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcGNtIGZyZWU6ICVwXG4iLCBlcGNtKTsgKi8KKwkJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImVwY20gZnJlZTogJXBcbiIsIGVwY20pOyAqLwogCQlrZnJlZShlcGNtKTsKIAl9CiB9CkBAIC0xODMsMTQgKzE4MywxNCBAQAogCWludCBlcnI7CiAKIAllcGNtID0ga3phbGxvYyhzaXplb2YoKmVwY20pLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcGNtIGtjYWxsb2M6ICVwXG4iLCBlcGNtKTsgKi8KKwkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiZXBjbSBrY2FsbG9jOiAlcFxuIiwgZXBjbSk7ICovCiAKIAlpZiAoZXBjbSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAllcGNtLT5lbXUgPSBlbXU7CiAJZXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCS8qCi0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcGNtIGRldmljZT0lZCwgY2hhbm5lbF9pZD0lZFxuIiwKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiZXBjbSBkZXZpY2U9JWQsIGNoYW5uZWxfaWQ9JWRcbiIsCiAJCSAgIHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UsIGNoYW5uZWxfaWQpOwogCSovCiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKQEAgLTIwMywxMCArMjAzLDEwIEBACiAKICAgICAgICAgY2hhbm5lbC0+dXNlPTE7CiAjaWYgMCAvKiBkZWJ1ZyAqLwotCXNuZF9wcmludGsoS0VSTl9ERUJVRworCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJCSAgICJwMTZ2OiBvcGVuIGNoYW5uZWxfaWQ9JWQsIGNoYW5uZWw9JXAsIHVzZT0weCV4XG4iLAogCQkgICBjaGFubmVsX2lkLCBjaGFubmVsLCBjaGFubmVsLT51c2UpOwotCXByaW50ayhLRVJOX0RFQlVHICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgIm9wZW46Y2hhbm5lbF9pZD0lZCwgY2hpcD0lcCwgY2hhbm5lbD0lcFxuIiwKIAkgICAgICAgY2hhbm5lbF9pZCwgY2hpcCwgY2hhbm5lbCk7CiAjZW5kaWYgLyogZGVidWcgKi8KIAkvKiBjaGFubmVsLT5pbnRlcnJ1cHQgPSBzbmRfcDE2dl9wY21fY2hhbm5lbF9pbnRlcnJ1cHQ7ICovCkBAIC0yMzEsMTQgKzIzMSwxNCBAQAogCWludCBlcnI7CiAKIAllcGNtID0ga3phbGxvYyhzaXplb2YoKmVwY20pLCBHRlBfS0VSTkVMKTsKLQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20ga2NhbGxvYzogJXBcbiIsIGVwY20pOyAqLworCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlcGNtIGtjYWxsb2M6ICVwXG4iLCBlcGNtKTsgKi8KIAogCWlmIChlcGNtID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCWVwY20tPmVtdSA9IGVtdTsKIAllcGNtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJLyoKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVwY20gZGV2aWNlPSVkLCBjaGFubmVsX2lkPSVkXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJlcGNtIGRldmljZT0lZCwgY2hhbm5lbF9pZD0lZFxuIiwKIAkJICAgc3Vic3RyZWFtLT5wY20tPmRldmljZSwgY2hhbm5lbF9pZCk7CiAJKi8KIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBlcGNtOwpAQCAtMjUxLDEwICsyNTEsMTAgQEAKIAogCWNoYW5uZWwtPnVzZT0xOwogI2lmIDAgLyogZGVidWcgKi8KLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAogCQkgICAicDE2djogb3BlbiBjaGFubmVsX2lkPSVkLCBjaGFubmVsPSVwLCB1c2U9MHgleFxuIiwKIAkJICAgY2hhbm5lbF9pZCwgY2hhbm5lbCwgY2hhbm5lbC0+dXNlKTsKLQlwcmludGsoS0VSTl9ERUJVRyAib3BlbjpjaGFubmVsX2lkPSVkLCBjaGlwPSVwLCBjaGFubmVsPSVwXG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJvcGVuOmNoYW5uZWxfaWQ9JWQsIGNoaXA9JXAsIGNoYW5uZWw9JXBcbiIsCiAJICAgICAgIGNoYW5uZWxfaWQsIGNoaXAsIGNoYW5uZWwpOwogI2VuZGlmIC8qIGRlYnVnICovCiAJLyogY2hhbm5lbC0+aW50ZXJydXB0ID0gc25kX3AxNnZfcGNtX2NoYW5uZWxfaW50ZXJydXB0OyAqLwpAQCAtMzQ5LDE1ICszNDksMTggQEAKIAl1MzIgdG1wOwogCQogI2lmIDAgLyogZGVidWcgKi8KLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInByZXBhcmU6Y2hhbm5lbF9udW1iZXI9JWQsIHJhdGU9JWQsICIKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAorCQkicHJlcGFyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgIgogCQkgICAiZm9ybWF0PTB4JXgsIGNoYW5uZWxzPSVkLCBidWZmZXJfc2l6ZT0lbGQsICIKIAkJICAgInBlcmlvZF9zaXplPSVsZCwgcGVyaW9kcz0ldSwgZnJhbWVzX3RvX2J5dGVzPSVkXG4iLAogCQkgICBjaGFubmVsLCBydW50aW1lLT5yYXRlLCBydW50aW1lLT5mb3JtYXQsIHJ1bnRpbWUtPmNoYW5uZWxzLAogCQkgICBydW50aW1lLT5idWZmZXJfc2l6ZSwgcnVudGltZS0+cGVyaW9kX3NpemUsCiAJCSAgIHJ1bnRpbWUtPnBlcmlvZHMsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCAxKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0RFQlVHICJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIHRhYmxlX2Jhc2U9JXBcbiIsCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwKKwkJImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgdGFibGVfYmFzZT0lcFxuIiwKIAkJICAgcnVudGltZS0+ZG1hX2FkZHIsIHJ1bnRpbWUtPmRtYV9hcmVhLCB0YWJsZV9iYXNlKTsKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRtYV9hZGRyPSV4LCBkbWFfYXJlYT0lcCwgZG1hX2J5dGVzKHNpemUpPSV4XG4iLAorCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCisJCSJkbWFfYWRkcj0leCwgZG1hX2FyZWE9JXAsIGRtYV9ieXRlcyhzaXplKT0leFxuIiwKIAkJICAgZW11LT5wMTZ2X2J1ZmZlci5hZGRyLCBlbXUtPnAxNnZfYnVmZmVyLmFyZWEsCiAJCSAgIGVtdS0+cDE2dl9idWZmZXIuYnl0ZXMpOwogI2VuZGlmIC8qIGRlYnVnICovCkBAIC00MDUsNyArNDA4LDcgQEAKIAl1MzIgdG1wOwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAicHJlcGFyZSBjYXB0dXJlOmNoYW5uZWxfbnVtYmVyPSVkLCByYXRlPSVkLCAiCisJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInByZXBhcmUgY2FwdHVyZTpjaGFubmVsX251bWJlcj0lZCwgcmF0ZT0lZCwgIgogCSAgICAgICAiZm9ybWF0PTB4JXgsIGNoYW5uZWxzPSVkLCBidWZmZXJfc2l6ZT0lbGQsIHBlcmlvZF9zaXplPSVsZCwgIgogCSAgICAgICAiZnJhbWVzX3RvX2J5dGVzPSVkXG4iLAogCSAgICAgICBjaGFubmVsLCBydW50aW1lLT5yYXRlLCBydW50aW1lLT5mb3JtYXQsIHJ1bnRpbWUtPmNoYW5uZWxzLApAQCAtNDkxLDEzICs0OTQsMTMgQEAKIAkJcnVudGltZSA9IHMtPnJ1bnRpbWU7CiAJCWVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCWNoYW5uZWwgPSBzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlLWVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0OwotCQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgInAxNnYgY2hhbm5lbD0lZFxuIiwgY2hhbm5lbCk7ICovCisJCS8qIGRldl9kYmcoZW11LT5jYXJkLT5kZXYsICJwMTZ2IGNoYW5uZWw9JWRcbiIsIGNoYW5uZWwpOyAqLwogCQllcGNtLT5ydW5uaW5nID0gcnVubmluZzsKIAkJYmFzaWMgfD0gKDB4MTw8Y2hhbm5lbCk7CiAJCWludGUgfD0gKElOVEUyX1BMQVlCQUNLX0NIXzBfTE9PUDw8Y2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKICAgICAgICAgfQotCS8qIHNuZF9wcmludGsoS0VSTl9ERUJVRyAiYmFzaWM9MHgleCwgaW50ZT0weCV4XG4iLCBiYXNpYywgaW50ZSk7ICovCisJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImJhc2ljPTB4JXgsIGludGU9MHgleFxuIiwgYmFzaWMsIGludGUpOyAqLwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgpAQCAtNTg4LDEwICs1OTEsMTAgQEAKIAlwdHI9cHRyMjsKIAlpZiAocHRyID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CiAJCXB0ciAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnVmZmVyIGNhcHR1cmUgbGltaXRlZCFcbiIpOworCQlkZXZfd2FybihlbXUtPmNhcmQtPmRldiwgImJ1ZmZlciBjYXB0dXJlIGxpbWl0ZWQhXG4iKTsKIAl9CiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAicHRyMSA9IDB4JWx4LCBwdHIyPTB4JWx4LCBwdHI9MHglbHgsICIKKwlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAicHRyMSA9IDB4JWx4LCBwdHIyPTB4JWx4LCBwdHI9MHglbHgsICIKIAkgICAgICAgImJ1ZmZlcl9zaXplID0gMHgleCwgcGVyaW9kX3NpemUgPSAweCV4LCBiaXRzPSVkLCByYXRlPSVkXG4iLAogCSAgICAgICBwdHIxLCBwdHIyLCBwdHIsIChpbnQpcnVudGltZS0+YnVmZmVyX3NpemUsCiAJICAgICAgIChpbnQpcnVudGltZS0+cGVyaW9kX3NpemUsIChpbnQpcnVudGltZS0+ZnJhbWVfYml0cywKQEAgLTYzMCw3ICs2MzMsNyBAQAogCWlmIChjaGlwLT5wMTZ2X2J1ZmZlci5hcmVhKSB7CiAJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+cDE2dl9idWZmZXIpOwogCQkvKgotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInBlcmlvZCBsYWJsZXMgZnJlZTogJXBcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAicGVyaW9kIGxhYmxlcyBmcmVlOiAlcFxuIiwKIAkJCSAgICZjaGlwLT5wMTZ2X2J1ZmZlcik7CiAJCSovCiAJfQpAQCAtNjQ0LDcgKzY0Nyw3IEBACiAJaW50IGVycjsKICAgICAgICAgaW50IGNhcHR1cmU9MTsKICAgCi0JLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJzbmRfcDE2dl9wY20gY2FsbGVkLiBkZXZpY2U9JWRcbiIsIGRldmljZSk7ICovCisJLyogZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInNuZF9wMTZ2X3BjbSBjYWxsZWQuIGRldmljZT0lZFxuIiwgZGV2aWNlKTsgKi8KIAllbXUtPnAxNnZfZGV2aWNlX29mZnNldCA9IGRldmljZTsKIAlpZiAocnBjbSkKIAkJKnJwY20gPSBOVUxMOwpAQCAtNjcyLDcgKzY3NSw3IEBACiAJCQkJCQkJICgoNjU1MzYgLSA2NCkgKiA4KSwgKCg2NTUzNiAtIDY0KSAqIDgpKSkgPCAwKSAKIAkJCXJldHVybiBlcnI7CiAJCS8qCi0JCXNuZF9wcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LAogCQkJICAgInByZWFsbG9jYXRlIHBsYXliYWNrIHN1YnN0cmVhbTogZXJyPSVkXG4iLCBlcnIpOwogCQkqLwogCX0KQEAgLTY4Niw3ICs2ODksNyBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNiAtIDY0LCA2NTUzNiAtIDY0KSkgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJLyoKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoZW11LT5jYXJkLT5kZXYsCiAJCQkgICAicHJlYWxsb2NhdGUgY2FwdHVyZSBzdWJzdHJlYW06IGVycj0lZFxuIiwgZXJyKTsKIAkJKi8KIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwppbmRleCAxMDFlN2NiLi5mMTZmZDVjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAlmaXJzdF92b2ljZSA9IGxhc3Rfdm9pY2UgPSAwOwogCWZvciAoaSA9IGVtdS0+bmV4dF9mcmVlX3ZvaWNlLCBqID0gMDsgaiA8IE5VTV9HIDsgaSArPSBudW1iZXIsIGogKz0gbnVtYmVyKSB7CiAJCS8qCi0JCXByaW50ayhLRVJOX0RFQlVHICJpICVkIGogJWQgbmV4dCBmcmVlICVkIVxuIiwKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgImkgJWQgaiAlZCBuZXh0IGZyZWUgJWQhXG4iLAogCQkgICAgICAgaSwgaiwgZW11LT5uZXh0X2ZyZWVfdm9pY2UpOwogCQkqLwogCQlpICU9IE5VTV9HOwpAQCAtNzUsNyArNzUsNyBAQAogCQkJfQogCQl9CiAJCWlmICghc2tpcCkgewotCQkJLyogcHJpbnRrKEtFUk5fREVCVUcgImFsbG9jYXRlZCB2b2ljZSAlZFxuIiwgaSk7ICovCisJCQkvKiBkZXZfZGJnKGVtdS0+Y2FyZC0+ZGV2LCAiYWxsb2NhdGVkIHZvaWNlICVkXG4iLCBpKTsgKi8KIAkJCWZpcnN0X3ZvaWNlID0gaTsKIAkJCWxhc3Rfdm9pY2UgPSAoaSArIG51bWJlcikgJSBOVU1fRzsKIAkJCWVtdS0+bmV4dF9mcmVlX3ZvaWNlID0gbGFzdF92b2ljZTsKQEAgLTg5LDcgKzg5LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKIAkJdm9pY2UgPSAmZW11LT52b2ljZXNbKGZpcnN0X3ZvaWNlICsgaSkgJSBOVU1fR107CiAJCS8qCi0JCXByaW50ayhrRVJOX0RFQlVHICJ2b2ljZSBhbGxvYyAtICVpLCAlaSBvZiAlaVxuIiwKKwkJZGV2X2RiZyhlbXUtPmNhcmQtPmRldiwgInZvaWNlIGFsbG9jIC0gJWksICVpIG9mICVpXG4iLAogCQkgICAgICAgdm9pY2UtPm51bWJlciwgaWR4LWZpcnN0X3ZvaWNlKzEsIG51bWJlcik7CiAJCSovCiAJCXZvaWNlLT51c2UgPSAxOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VuczEzNzAuYyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKaW5kZXggNjEyNjJmMy4uMjljZDMzOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VuczEzNzAuYworKysgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCkBAIC01MjUsNyArNTI1LDcgQEAKIAkJCXJldHVybiByOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAid2FpdCBzcmMgcmVhZHkgdGltZW91dCAweCVseCBbMHgleF1cbiIsCisJZGV2X2VycihlbnNvbmlxLT5jYXJkLT5kZXYsICJ3YWl0IHNyYyByZWFkeSB0aW1lb3V0IDB4JWx4IFsweCV4XVxuIiwKIAkJICAgRVNfUkVHKGVuc29uaXEsIDEzNzFfU01QUkFURSksIHIpOwogCXJldHVybiAwOwogfQpAQCAtNTg3LDcgKzU4Nyw3IEBACiAJdW5zaWduZWQgbG9uZyBlbmRfdGltZSA9IGppZmZpZXMgKyBIWiAvIDEwOwogCiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHCisJZGV2X2RiZyhlbnNvbmlxLT5jYXJkLT5kZXYsCiAJICAgICAgICJDT0RFQyBXUklURTogcmVnID0gMHgleCwgdmFsID0gMHgleCAoMHgleCksIGNyZWcgPSAweCV4XG4iLAogCSAgICAgICByZWcsIHZhbCwgRVNfMTM3MF9DT0RFQ19XUklURShyZWcsIHZhbCksIEVTX1JFRyhlbnNvbmlxLCAxMzcwX0NPREVDKSk7CiAjZW5kaWYKQEAgLTU5OCw3ICs1OTgsNyBAQAogCQl9CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXIoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlYyB3cml0ZSB0aW1lb3V0LCBzdGF0dXMgPSAweCV4XG4iLAorCWRldl9lcnIoZW5zb25pcS0+Y2FyZC0+ZGV2LCAiY29kZWMgd3JpdGUgdGltZW91dCwgc3RhdHVzID0gMHgleFxuIiwKIAkJICAgaW5sKEVTX1JFRyhlbnNvbmlxLCBTVEFUVVMpKSk7CiB9CiAKQEAgLTY0OSw3ICs2NDksNyBAQAogCQl9CiAJfQogCW11dGV4X3VubG9jaygmZW5zb25pcS0+c3JjX211dGV4KTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlYyB3cml0ZSB0aW1lb3V0IGF0IDB4JWx4IFsweCV4XVxuIiwKKwlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwgImNvZGVjIHdyaXRlIHRpbWVvdXQgYXQgMHglbHggWzB4JXhdXG4iLAogCQkgICBFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQyksIGlubChFU19SRUcoZW5zb25pcSwgMTM3MV9DT0RFQykpKTsKIH0KIApAQCAtNzA2LDggKzcwNiw4IEBACiAJCQl9CiAJCQltdXRleF91bmxvY2soJmVuc29uaXEtPnNyY19tdXRleCk7CiAJCQlpZiAoKytmYWlsID4gMTApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlYyByZWFkIHRpbWVvdXQgKGZpbmFsKSAiCi0JCQkJCSAgICJhdCAweCVseCwgcmVnID0gMHgleCBbMHgleF1cbiIsCisJCQkJZGV2X2VycihlbnNvbmlxLT5jYXJkLT5kZXYsCisJCQkJCSJjb2RlYyByZWFkIHRpbWVvdXQgKGZpbmFsKSBhdCAweCVseCwgcmVnID0gMHgleCBbMHgleF1cbiIsCiAJCQkJCSAgIEVTX1JFRyhlbnNvbmlxLCAxMzcxX0NPREVDKSwgcmVnLAogCQkJCQkgICBpbmwoRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpKSk7CiAJCQkJcmV0dXJuIDA7CkBAIC03MTYsNyArNzE2LDcgQEAKIAkJfQogCX0KIAltdXRleF91bmxvY2soJmVuc29uaXEtPnNyY19tdXRleCk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiZXMxMzcxOiBjb2RlYyByZWFkIHRpbWVvdXQgYXQgMHglbHggWzB4JXhdXG4iLAorCWRldl9lcnIoZW5zb25pcS0+Y2FyZC0+ZGV2LCAiY29kZWMgcmVhZCB0aW1lb3V0IGF0IDB4JWx4IFsweCV4XVxuIiwKIAkJICAgRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpLCBpbmwoRVNfUkVHKGVuc29uaXEsIDEzNzFfQ09ERUMpKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzk2LDcgKzE3OTYsNyBAQAogI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKIAogI2lmZGVmIENISVAxMzcxCi1zdGF0aWMgaW50IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KGludCBkZXYpCitzdGF0aWMgaW50IHNuZF9lbnNvbmlxX2dldF9qb3lzdGlja19wb3J0KHN0cnVjdCBlbnNvbmlxICplbnNvbmlxLCBpbnQgZGV2KQogewogCXN3aXRjaCAoam95c3RpY2tfcG9ydFtkZXZdKSB7CiAJY2FzZSAwOiAvKiBkaXNhYmxlZCAqLwpAQCAtMTgwOCwxMiArMTgwOCwxMyBAQAogCQlyZXR1cm4gam95c3RpY2tfcG9ydFtkZXZdOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJlbnMxMzcxOiBpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4Iiwgam95c3RpY2tfcG9ydFtkZXZdKTsKKwkJZGV2X2VycihlbnNvbmlxLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCBqb3lzdGljayBwb3J0ICUjeCIsIGpveXN0aWNrX3BvcnRbZGV2XSk7CiAJCXJldHVybiAwOwogCX0KIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBzbmRfZW5zb25pcV9nZXRfam95c3RpY2tfcG9ydChpbnQgZGV2KQorc3RhdGljIGludCBzbmRfZW5zb25pcV9nZXRfam95c3RpY2tfcG9ydChzdHJ1Y3QgZW5zb25pcSAqZW5zb25pcSwgaW50IGRldikKIHsKIAlyZXR1cm4gam95c3RpY2tbZGV2XSA/IDB4MjAwIDogMDsKIH0KQEAgLTE4MjQsNyArMTgyNSw3IEBACiAJc3RydWN0IGdhbWVwb3J0ICpncDsKIAlpbnQgaW9fcG9ydDsKIAotCWlvX3BvcnQgPSBzbmRfZW5zb25pcV9nZXRfam95c3RpY2tfcG9ydChkZXYpOworCWlvX3BvcnQgPSBzbmRfZW5zb25pcV9nZXRfam95c3RpY2tfcG9ydChlbnNvbmlxLCBkZXYpOwogCiAJc3dpdGNoIChpb19wb3J0KSB7CiAJY2FzZSAwOgpAQCAtMTgzNSwxNCArMTgzNiwxNiBAQAogCQkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIDgsICJlbnMxMzd4OiBnYW1lcG9ydCIpKQogCQkJCWJyZWFrOwogCQlpZiAoaW9fcG9ydCA+IDB4MjE4KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbnMxMzd4OiBubyBnYW1lcG9ydCBwb3J0cyBhdmFpbGFibGVcbiIpOworCQkJZGV2X3dhcm4oZW5zb25pcS0+Y2FyZC0+ZGV2LAorCQkJCSAibm8gZ2FtZXBvcnQgcG9ydHMgYXZhaWxhYmxlXG4iKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIDgsICJlbnMxMzd4OiBnYW1lcG9ydCIpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbnMxMzd4OiBnYW1lcG9ydCBpbyBwb3J0ICUjeCBpbiB1c2VcbiIsCisJCQlkZXZfd2FybihlbnNvbmlxLT5jYXJkLT5kZXYsCisJCQkJICJnYW1lcG9ydCBpbyBwb3J0ICUjeCBpbiB1c2VcbiIsCiAJCQkgICAgICAgaW9fcG9ydCk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CkBAIC0xODUxLDcgKzE4NTQsOCBAQAogCiAJZW5zb25pcS0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW5zMTM3eDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGVuc29uaXEtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJlbGVhc2VfcmVnaW9uKGlvX3BvcnQsIDgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMDgyLDggKzIwODYsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yMTM3LDcgKzIxNDAsNyBAQAogCWVuc29uaXEtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9hdWRpb3BjaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGVuc29uaXEpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfZW5zb25pcV9mcmVlKGVuc29uaXEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTIxNDUsNyArMjE0OCw3IEBACiAjaWZkZWYgQ0hJUDEzNzAKIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEocGNpKSwKIAkJCQkxNiwgJmVuc29uaXEtPmRtYV9idWcpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHBoYW50b20gYXJlYSAtIGRtYV9idWdcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgcGhhbnRvbSBhcmVhIC0gZG1hX2J1Z1xuIik7CiAJCXNuZF9lbnNvbmlxX2ZyZWUoZW5zb25pcSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjE4MCw4ICsyMTgzLDYgQEAKIAogCXNuZF9lbnNvbmlxX3Byb2NfaW5pdChlbnNvbmlxKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyZW5zb25pcSA9IGVuc29uaXE7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDM3LDcgKzI0MzgsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTkzOC5jIGIvc291bmQvcGNpL2VzMTkzOC5jCmluZGV4IDkyMTNmYjMuLjM0ZDk1YmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5MzguYworKysgYi9zb3VuZC9wY2kvZXMxOTM4LmMKQEAgLTI1NCw3ICsyNTQsNiBAQAogI2RlZmluZSBXUklURV9MT09QX1RJTUVPVVQJMHgxMDAwMAogI2RlZmluZSBHRVRfTE9PUF9USU1FT1VUCTB4MDEwMDAKIAotI3VuZGVmIFJFR19ERUJVRwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFdyaXRlIHRvIGEgbWl4ZXIgcmVnaXN0ZXIKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI2NSw5ICsyNjQsNyBAQAogCW91dGIocmVnLCBTTFNCX1JFRyhjaGlwLCBNSVhFUkFERFIpKTsKIAlvdXRiKHZhbCwgU0xTQl9SRUcoY2hpcCwgTUlYRVJEQVRBKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bWl4ZXJfbG9jaywgZmxhZ3MpOwotI2lmZGVmIFJFR19ERUJVRwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiTWl4ZXIgcmVnICUwMnggc2V0IHRvICUwMnhcbiIsIHJlZywgdmFsKTsKLSNlbmRpZgorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTWl4ZXIgcmVnICUwMnggc2V0IHRvICUwMnhcbiIsIHJlZywgdmFsKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI4MSw5ICsyNzgsNyBAQAogCW91dGIocmVnLCBTTFNCX1JFRyhjaGlwLCBNSVhFUkFERFIpKTsKIAlkYXRhID0gaW5iKFNMU0JfUkVHKGNoaXAsIE1JWEVSREFUQSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPm1peGVyX2xvY2ssIGZsYWdzKTsKLSNpZmRlZiBSRUdfREVCVUcKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgIk1peGVyIHJlZyAlMDJ4IG5vdyBpcyAlMDJ4XG4iLCByZWcsIGRhdGEpOwotI2VuZGlmCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJNaXhlciByZWcgJTAyeCBub3cgaXMgJTAyeFxuIiwgcmVnLCBkYXRhKTsKIAlyZXR1cm4gZGF0YTsKIH0KIApAQCAtMzAyLDEwICsyOTcsOSBAQAogCWlmICh2YWwgIT0gb3ZhbCkgewogCQluZXcgPSAob2xkICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOwogCQlvdXRiKG5ldywgU0xTQl9SRUcoY2hpcCwgTUlYRVJEQVRBKSk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiTWl4ZXIgcmVnICUwMnggd2FzICUwMngsIHNldCB0byAlMDJ4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJNaXhlciByZWcgJTAyeCB3YXMgJTAyeCwgc2V0IHRvICUwMnhcbiIsCiAJCQkgICByZWcsIG9sZCwgbmV3KTsKLSNlbmRpZgogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5taXhlcl9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIG92YWw7CkBAIC0zMjQsNyArMzE4LDggQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQlwcmludGsoS0VSTl9FUlIgInNuZF9lczE5Mzhfd3JpdGVfY21kIHRpbWVvdXQgKDB4MDIleC8weDAyJXgpXG4iLCBjbWQsIHYpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkic25kX2VzMTkzOF93cml0ZV9jbWQgdGltZW91dCAoMHgwMiV4LzB4MDIleClcbiIsIGNtZCwgdik7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMzcsNyArMzMyLDcgQEAKIAlmb3IgKGkgPSBHRVRfTE9PUF9USU1FT1VUOyBpOyBpLS0pCiAJCWlmICgodiA9IGluYihTTFNCX1JFRyhjaGlwLCBTVEFUVVMpKSkgJiAweDgwKQogCQkJcmV0dXJuIGluYihTTFNCX1JFRyhjaGlwLCBSRUFEREFUQSkpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgImdldF9ieXRlIHRpbWVvdXQ6IHN0YXR1cyAweDAyJXhcbiIsIHYpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZ2V0X2J5dGUgdGltZW91dDogc3RhdHVzIDB4MDIleFxuIiwgdik7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTM1MSw5ICszNDYsNyBAQAogCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIHJlZyk7CiAJc25kX2VzMTkzOF93cml0ZV9jbWQoY2hpcCwgdmFsKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotI2lmZGVmIFJFR19ERUJVRwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiUmVnICUwMnggc2V0IHRvICUwMnhcbiIsIHJlZywgdmFsKTsKLSNlbmRpZgorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiUmVnICUwMnggc2V0IHRvICUwMnhcbiIsIHJlZywgdmFsKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM2OCw5ICszNjEsNyBAQAogCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIHJlZyk7CiAJdmFsID0gc25kX2VzMTkzOF9nZXRfYnl0ZShjaGlwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotI2lmZGVmIFJFR19ERUJVRwotCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiUmVnICUwMnggbm93IGlzICUwMnhcbiIsIHJlZywgdmFsKTsKLSNlbmRpZgorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiUmVnICUwMnggbm93IGlzICUwMnhcbiIsIHJlZywgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQogCkBAIC0zOTEsMTAgKzM4Miw4IEBACiAJCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIHJlZyk7CiAJCW5ldyA9IChvbGQgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CiAJCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIG5ldyk7Ci0jaWZkZWYgUkVHX0RFQlVHCi0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiUmVnICUwMnggd2FzICUwMngsIHNldCB0byAlMDJ4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlJlZyAlMDJ4IHdhcyAlMDJ4LCBzZXQgdG8gJTAyeFxuIiwKIAkJCSAgIHJlZywgb2xkLCBuZXcpOwotI2VuZGlmCiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIG92YWw7CkBAIC00MTYsNyArNDA1LDcgQEAKIAkJCQlnb3RvIF9fbmV4dDsKIAkJfQogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJFU1MgU29sby0xIHJlc2V0IGZhaWxlZFxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJFU1MgU29sby0xIHJlc2V0IGZhaWxlZFxuIik7CiAKICAgICAgX19uZXh0OgogCXNuZF9lczE5Mzhfd3JpdGVfY21kKGNoaXAsIEVTU19DTURfRU5BQkxFRVhUKTsKQEAgLTE1MDQsMTYgKzE0OTMsMTUgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZXMxOTM4X2ludGVycnVwdCwKIAkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IHVuYWJsZSB0byBncmFiIElSUSAlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWQsIGRpc2FibGluZyBkZXZpY2VcbiIsCisJCQlwY2ktPmlycSk7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE1NDUsNyArMTUzMyw4IEBACiAKIAljaGlwLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwogCWlmICghZ3ApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE2MTIsNyArMTYwMSw4IEBACiAgICAgICAgIC8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjQgYml0cyAqLwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI0KSkgPCAwIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKICAgICAgICAgfQpAQCAtMTYzOSwxNSArMTYyOSwxNCBAQAogCWNoaXAtPmdhbWVfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDQpOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VzMTkzOF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfZXMxOTM4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwotI2lmZGVmIEVTMTkzOF9EREVCVUcKLQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImNyZWF0ZTogaW86IDB4JWx4LCBzYjogMHglbHgsIHZjOiAweCVseCwgbXB1OiAweCVseCwgZ2FtZTogMHglbHhcbiIsCisJZGV2X2RiZyhjYXJkLT5kZXYsCisJCSJjcmVhdGU6IGlvOiAweCVseCwgc2I6IDB4JWx4LCB2YzogMHglbHgsIG1wdTogMHglbHgsIGdhbWU6IDB4JWx4XG4iLAogCQkgICBjaGlwLT5pb19wb3J0LCBjaGlwLT5zYl9wb3J0LCBjaGlwLT52Y19wb3J0LCBjaGlwLT5tcHVfcG9ydCwgY2hpcC0+Z2FtZV9wb3J0KTsKLSNlbmRpZgogCiAJY2hpcC0+ZGRtYV9wb3J0ID0gY2hpcC0+dmNfcG9ydCArIDB4MDA7CQkvKiBmaXggZnJvbSBUaG9tYXMgU2FpbGVyICovCiAKQEAgLTE2NTgsOCArMTY0Nyw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NzUsMjEgKzE2NjIsMjIgQEAKIAogCXN0YXR1cyA9IGluYihTTElPX1JFRyhjaGlwLCBJUlFDT05UUk9MKSk7CiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJFczE5MzhkZWJ1ZyAtIGludGVycnVwdCBzdGF0dXM6ID0weCV4XG4iLCBzdGF0dXMpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkiRXMxOTM4ZGVidWcgLSBpbnRlcnJ1cHQgc3RhdHVzOiA9MHgleFxuIiwgc3RhdHVzKTsKICNlbmRpZgogCQogCS8qIEFVRElPIDEgKi8KIAlpZiAoc3RhdHVzICYgMHgxMCkgewogI2lmIDAKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgICAgICJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMSBpbnRlcnJ1cHRcbiIpOwotCQlwcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgICAgICJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMSBETUFDIERNQSBjb3VudDogJXVcbiIsCiAJCSAgICAgICBpbncoU0xETV9SRUcoY2hpcCwgRE1BQ09VTlQpKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIERNQUMgRE1BIGJhc2U6ICV1XG4iLAogCQkgICAgICAgaW5sKFNMRE1fUkVHKGNoaXAsIERNQUFERFIpKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkgICAgICAgIkVzMTkzOGRlYnVnIC0gQVVESU8gY2hhbm5lbCAxIERNQUMgRE1BIHN0YXR1czogMHgleFxuIiwKIAkJICAgICAgIGlubChTTERNX1JFRyhjaGlwLCBETUFTVEFUVVMpKSk7CiAjZW5kaWYKQEAgLTE3MDUsMTIgKzE2OTMsMTIgQEAKIAkvKiBBVURJTyAyICovCiAJaWYgKHN0YXR1cyAmIDB4MjApIHsKICNpZiAwCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSAgICAgICAiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDIgaW50ZXJydXB0XG4iKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCiAJCSAgICAgICAiRXMxOTM4ZGVidWcgLSBBVURJTyBjaGFubmVsIDIgRE1BQyBETUEgY291bnQ6ICV1XG4iLAogCQkgICAgICAgaW53KFNMSU9fUkVHKGNoaXAsIEFVRElPMkRNQUNPVU5UKSkpOwotCQlwcmludGsoS0VSTl9ERUJVRworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgICAgICJFczE5MzhkZWJ1ZyAtIEFVRElPIGNoYW5uZWwgMiBETUFDIERNQSBiYXNlOiAldVxuIiwKIAkJICAgICAgIGlubChTTElPX1JFRyhjaGlwLCBBVURJTzJETUFBRERSKSkpOwogCkBAIC0xODA4LDcgKzE3OTYsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IDU7IGlkeCsrKSB7CkBAIC0xODQzLDcgKzE4MzIsNyBAQAogCQkJICAgIFNMU0JfUkVHKGNoaXAsIEZNTE9XQUREUiksCiAJCQkgICAgU0xTQl9SRUcoY2hpcCwgRk1ISUdIQUREUiksCiAJCQkgICAgT1BMM19IV19PUEwzLCAxLCAmb3BsMykgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXMxOTM4OiBPUEwzIG5vdCBkZXRlY3RlZCBhdCAweCVseFxuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJPUEwzIG5vdCBkZXRlY3RlZCBhdCAweCVseFxuIiwKIAkJCSAgIFNMU0JfUkVHKGNoaXAsIEZNTE9XQUREUikpOwogCX0gZWxzZSB7CiAJICAgICAgICBpZiAoKGVyciA9IHNuZF9vcGwzX3RpbWVyX25ldyhvcGwzLCAwLCAxKSkgPCAwKSB7CkBAIC0xODU5LDcgKzE4NDgsNyBAQAogCQkJCWNoaXAtPm1wdV9wb3J0LAogCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfCBNUFU0MDFfSU5GT19JUlFfSE9PSywKIAkJCQktMSwgJmNoaXAtPnJtaWRpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IHVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDFcbiIpOwogCX0gZWxzZSB7CiAJCS8vIHRoaXMgbGluZSBpcyB2aXRhbCBmb3IgTUlESSBpbnRlcnJ1cHQgaGFuZGxpbmcgb24gZXNzLXNvbG8xCiAJCS8vIGFuZHJlYXNAZmx5aW5nLXNuYWlsLmRlCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTY4LmMgYi9zb3VuZC9wY2kvZXMxOTY4LmMKaW5kZXggNzcyY2MzNi4uNWJiMWNmNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTk2OC5jCisrKyBiL3NvdW5kL3BjaS9lczE5NjguYwpAQCAtNjMyLDcgKzYzMiw3IEBACiAJCQlyZXR1cm4gMDsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQotCXNuZF9wcmludGQoImVzMTk2ODogYWM5NyB0aW1lb3V0XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImFjOTcgdGltZW91dFxuIik7CiAJcmV0dXJuIDE7IC8qIHRpbWVvdXQgKi8KIH0KIApAQCAtNjQ0LDcgKzY0NCw3IEBACiAJCWlmICghKGluYihjaGlwLT5pb19wb3J0ICsgRVNNX0FDOTdfSU5ERVgpICYgMSkpCiAJCQlyZXR1cm4gMDsKIAl9Ci0Jc25kX3ByaW50ZCgiZXMxOTY4OiBhYzk3IHRpbWVvdXRcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWM5NyB0aW1lb3V0XG4iKTsKIAlyZXR1cm4gMTsgLyogdGltZW91dCAqLwogfQogCkBAIC02ODcsNyArNjg3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQogCQlpZiAoX19tYWVzdHJvX3JlYWQoY2hpcCwgSURSMV9DUkFNX1BPSU5URVIpID09IGluZGV4KQogCQkJcmV0dXJuOwotCXNuZF9wcmludGQoImVzMTk2ODogQVBVIHJlZ2lzdGVyIHNlbGVjdCBmYWlsZWQuIChUaW1lb3V0KVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJBUFUgcmVnaXN0ZXIgc2VsZWN0IGZhaWxlZC4gKFRpbWVvdXQpXG4iKTsKIH0KIAogLyogbm8gc3BpbmxvY2sgKi8KQEAgLTY5OSw3ICs2OTksNyBAQAogCQkJcmV0dXJuOwogCQlfX21hZXN0cm9fd3JpdGUoY2hpcCwgSURSMF9EQVRBX1BPUlQsIGRhdGEpOwogCX0KLQlzbmRfcHJpbnRkKCJlczE5Njg6IEFQVSByZWdpc3RlciBzZXQgcHJvYmFibHkgZmFpbGVkIChUaW1lb3V0KSFcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiQVBVIHJlZ2lzdGVyIHNldCBwcm9iYWJseSBmYWlsZWQgKFRpbWVvdXQpIVxuIik7CiB9CiAKIC8qIG5vIHNwaW5sb2NrICovCkBAIC0xNDQyLDEzICsxNDQyLDE0IEBACiAJCQkJCSAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKIAkJCQkJICAgY2hpcC0+dG90YWxfYnVmc2l6ZSwgJmNoaXAtPmRtYSk7CiAJaWYgKGVyciA8IDAgfHwgISBjaGlwLT5kbWEuYXJlYSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IGNhbid0IGFsbG9jYXRlIGRtYSBwYWdlcyBmb3Igc2l6ZSAlZFxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2FuJ3QgYWxsb2NhdGUgZG1hIHBhZ2VzIGZvciBzaXplICVkXG4iLAogCQkJICAgY2hpcC0+dG90YWxfYnVmc2l6ZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpZiAoKGNoaXAtPmRtYS5hZGRyICsgY2hpcC0+ZG1hLmJ5dGVzIC0gMSkgJiB+KCgxIDw8IDI4KSAtIDEpKSB7CiAJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+ZG1hKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXMxOTY4OiBETUEgYnVmZmVyIGJleW9uZCAyNTZNQi5cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkRNQSBidWZmZXIgYmV5b25kIDI1Nk1CLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTQ4OSw3ICsxNDkwLDggQEAKIAl9CiAJY2hhbi0+bWVtb3J5ID0gc25kX2VzMTk2OF9uZXdfbWVtb3J5KGNoaXAsIHNpemUpOwogCWlmIChjaGFuLT5tZW1vcnkgPT0gTlVMTCkgewotCQkvLyBzbmRfcHJpbnRkKCJjYW5ub3QgYWxsb2NhdGUgZG1hIGJ1ZmZlcjogc2l6ZSA9ICVkXG4iLCBzaXplKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIGRtYSBidWZmZXI6IHNpemUgPSAlZFxuIiwgc2l6ZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZjaGFuLT5tZW1vcnktPmJ1Zik7CkBAIC0xNzE1LDExICsxNzE3LDEzIEBACiAKIAkvKiBzZWFyY2ggMiBBUFVzIChhbHRob3VnaCBvbmUgYXB1IGlzIGVub3VnaCkgKi8KIAlpZiAoKGFwdSA9IHNuZF9lczE5NjhfYWxsb2NfYXB1X3BhaXIoY2hpcCwgRVNNX0FQVV9QQ01fUExBWSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIbW0sIGNhbm5vdCBmaW5kIGVtcHR5IEFQVSBwYWlyIT9cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkhtbSwgY2Fubm90IGZpbmQgZW1wdHkgQVBVIHBhaXIhP1xuIik7CiAJCXJldHVybjsKIAl9CiAJaWYgKChtZW1vcnkgPSBzbmRfZXMxOTY4X25ld19tZW1vcnkoY2hpcCwgQ0xPQ0tfTUVBU1VSRV9CVUZTSVpFKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgYWxsb2NhdGUgZG1hIGJ1ZmZlciAtIHVzaW5nIGRlZmF1bHQgY2xvY2sgJWRcbiIsIGNoaXAtPmNsb2NrKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJjYW5ub3QgYWxsb2NhdGUgZG1hIGJ1ZmZlciAtIHVzaW5nIGRlZmF1bHQgY2xvY2sgJWRcbiIsCisJCQkgY2hpcC0+Y2xvY2spOwogCQlzbmRfZXMxOTY4X2ZyZWVfYXB1X3BhaXIoY2hpcCwgYXB1KTsKIAkJcmV0dXJuOwogCX0KQEAgLTE3ODAsNyArMTc4NCw3IEBACiAJZWxzZQogCQl0ICs9IHN0b3BfdGltZS50dl91c2VjIC0gc3RhcnRfdGltZS50dl91c2VjOwogCWlmICh0ID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiPz8gY2FsY3VsYXRpb24gZXJyb3IuLlxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiPz8gY2FsY3VsYXRpb24gZXJyb3IuLlxuIik7CiAJfSBlbHNlIHsKIAkJb2Zmc2V0ICo9IDEwMDA7CiAJCW9mZnNldCA9IChvZmZzZXQgLyB0KSAqIDEwMDAgKyAoKG9mZnNldCAlIHQpICogMTAwMCkgLyB0OwpAQCAtMTc4OCw3ICsxNzkyLDcgQEAKIAkJCWlmIChvZmZzZXQgPj0gNDAwMDAgJiYgb2Zmc2V0IDw9IDUwMDAwKQogCQkJCWNoaXAtPmNsb2NrID0gKGNoaXAtPmNsb2NrICogb2Zmc2V0KSAvIDQ4MDAwOwogCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gImVzMTk2ODogY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmNsb2NrKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LCAiY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmNsb2NrKTsKIAl9CiAJc25kX2VzMTk2OF9mcmVlX21lbW9yeShjaGlwLCBtZW1vcnkpOwogCXNuZF9lczE5NjhfZnJlZV9hcHVfcGFpcihjaGlwLCBhcHUpOwpAQCAtMjEwOCw3ICsyMTEyLDcgQEAKIAlvdXR3KGludyhpb2FkZHIgKyAweDNjKSAmIDB4ZmZmYywgaW9hZGRyICsgMHgzYyk7CiAKICNpZiAwCQkJCS8qIHRoZSBsb29wIGhlcmUgbmVlZHMgdG8gYmUgbXVjaCBiZXR0ZXIgaWYgd2Ugd2FudCBpdC4uICovCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gInRyeWluZyBzb2Z0d2FyZSByZXNldFxuIik7CisJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LCAidHJ5aW5nIHNvZnR3YXJlIHJlc2V0XG4iKTsKIAkvKiB0cnkgYW5kIGRvIGEgc29mdHdhcmUgcmVzZXQgKi8KIAlvdXRiKDB4ODAgfCAweDdjLCBpb2FkZHIgKyAweDMwKTsKIAlmb3IgKHcgPSAwOzsgdysrKSB7CkBAIC0yNDE2LDggKzI0MjAsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXMxOTY4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNDc5LDcgKzI0ODIsOCBAQAogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXMxOTY4OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjcwNiw3ICsyNzEwLDggQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI4IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTI3NDAsNyArMjc0NSw3IEBACiAJY2hpcC0+aW9fcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VzMTk2OF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfZXMxOTY4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjc3MCw3ICsyNzc1LDcgQEAKIAkJfQogCQlpZiAoZG9fcG0gPiAxKSB7CiAJCQkvKiBub3QgbWF0Y2hlZDsgZGlzYWJsaW5nIHBtICovCi0JCQlwcmludGsoS0VSTl9JTkZPICJlczE5Njg6IG5vdCBhdHRlbXB0aW5nIHBvd2VyIG1hbmFnZW1lbnQuXG4iKTsKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgIm5vdCBhdHRlbXB0aW5nIHBvd2VyIG1hbmFnZW1lbnQuXG4iKTsKIAkJCWRvX3BtID0gMDsKIAkJfQogCX0KQEAgLTI3ODMsOCArMjc4OCw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAjaWZkZWYgQ09ORklHX1NORF9FUzE5NjhfUkFESU8KIAkvKiBkb24ndCBwbGF5IHdpdGggR1BJT3Mgb24gbGFwdG9wcyAqLwogCWlmIChjaGlwLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgIT0gMHgxMjVkKQpAQCAtMjgwMiw3ICsyODA1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfZXMxOTY4X3RlYTU3NXhfZ3Bpb3MpOyBpKyspIHsKIAkJY2hpcC0+dGVhNTc1eF90dW5lciA9IGk7CiAJCWlmICghc25kX3RlYTU3NXhfaW5pdCgmY2hpcC0+dGVhLCBUSElTX01PRFVMRSkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlczE5Njg6IGRldGVjdGVkIFRFQTU3NXggcmFkaW8gdHlwZSAlc1xuIiwKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgImRldGVjdGVkIFRFQTU3NXggcmFkaW8gdHlwZSAlc1xuIiwKIAkJCQkgICBnZXRfdGVhNTc1eF9ncGlvKGNoaXApLT5uYW1lKTsKIAkJCXN0cmxjcHkoY2hpcC0+dGVhLmNhcmQsIGdldF90ZWE1NzV4X2dwaW8oY2hpcCktPm5hbWUsCiAJCQkJc2l6ZW9mKGNoaXAtPnRlYS5jYXJkKSk7CkBAIC0yODM2LDcgKzI4MzksOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICAKQEAgLTI5MDAsNyArMjkwNCw3IEBACiAJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKIAkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lSUV9IT09LLAogCQkJCQkgICAgICAgLTEsICZjaGlwLT5ybWlkaSkpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXMxOTY4OiBza2lwcGluZyBNUFUtNDAxIE1JREkgc3VwcG9ydC4uXG4iKTsKKwkJCWRldl93YXJuKGNhcmQtPmRldiwgInNraXBwaW5nIE1QVS00MDEgTUlESSBzdXBwb3J0Li5cbiIpOwogCQl9CiAJfQogCkBAIC0yOTA5LDggKzI5MTMsOCBAQAogI2lmZGVmIENPTkZJR19TTkRfRVMxOTY4X0lOUFVUCiAJZXJyID0gc25kX2VzMTk2OF9pbnB1dF9yZWdpc3RlcihjaGlwKTsKIAlpZiAoZXJyKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiAiCi0JCQkiZmFpbGVkIHdpdGggZXJyb3IgJWkiLCBlcnIpOworCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkgIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWkiLCBlcnIpOwogI2VuZGlmCiAKIAlzbmRfZXMxOTY4X3N0YXJ0X2lycShjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9mbTgwMS5jIGIvc291bmQvcGNpL2ZtODAxLmMKaW5kZXggNDViYzhhOS4uZGIxOGNjYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ZtODAxLmMKKysrIGIvc291bmQvcGNpL2ZtODAxLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogCQkJZ290byBvazE7CiAJCXVkZWxheSgxMCk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGludGVyZmFjZSBpcyBidXN5ICgxKVxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyBpbnRlcmZhY2UgaXMgYnVzeSAoMSlcbiIpOwogCXJldHVybjsKIAogIG9rMToKQEAgLTI2OSw3ICsyNjksNyBAQAogCQkJcmV0dXJuOwogCQl1ZGVsYXkoMTApOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBpbnRlcmZhY2UgIyVkIGlzIGJ1c3kgKDIpXG4iLCBhYzk3LT5udW0pOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgaW50ZXJmYWNlICMlZCBpcyBidXN5ICgyKVxuIiwgYWM5Ny0+bnVtKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9mbTgwMV9jb2RlY19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQpAQCAtMjg1LDcgKzI4NSw3IEBACiAJCQlnb3RvIG9rMTsKIAkJdWRlbGF5KDEwKTsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgaW50ZXJmYWNlIGlzIGJ1c3kgKDEpXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IGludGVyZmFjZSBpcyBidXN5ICgxKVxuIik7CiAJcmV0dXJuIDA7CiAKICBvazE6CkBAIC0yOTcsNyArMjk3LDcgQEAKIAkJCWdvdG8gb2syOwogCQl1ZGVsYXkoMTApOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBpbnRlcmZhY2UgIyVkIGlzIGJ1c3kgKDIpXG4iLCBhYzk3LT5udW0pOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgaW50ZXJmYWNlICMlZCBpcyBidXN5ICgyKVxuIiwgYWM5Ny0+bnVtKTsKIAlyZXR1cm4gMDsKIAogIG9rMjoKQEAgLTMwNiw3ICszMDYsNyBAQAogCQkJZ290byBvazM7CiAJCXVkZWxheSgxMCk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgbm90IHZhbGlkICgyKVxuIiwgYWM5Ny0+bnVtKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IGludGVyZmFjZSAjJWQgaXMgbm90IHZhbGlkICgyKVxuIiwgYWM5Ny0+bnVtKTsKIAlyZXR1cm4gMDsKIAogIG9rMzoKQEAgLTExMDAsOCArMTEwMCw4IEBACiAKIAlpZiAod2FpdF9mb3JfY29kZWMoY2hpcCwgMCwgQUM5N19SRVNFVCwgbXNlY3NfdG9famlmZmllcyg3NTApKSA8IDApCiAJCWlmICghcmVzdW1lKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiUHJpbWFyeSBBQyc5NyBjb2RlYyBub3QgZm91bmQsICIKLQkJCQkJICAgICJhc3N1bWUgU0Y2NC1QQ1IgKHR1bmVyLW9ubHkpXG4iKTsKKwkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgIlByaW1hcnkgQUMnOTcgY29kZWMgbm90IGZvdW5kLCBhc3N1bWUgU0Y2NC1QQ1IgKHR1bmVyLW9ubHkpXG4iKTsKIAkJCWNoaXAtPnRlYTU3NXhfdHVuZXIgPSAzIHwgVFVORVJfT05MWTsKIAkJCWdvdG8gX19hYzk3X29rOwogCQl9CkBAIC0xMjI1LDcgKzEyMjUsNyBAQAogCWlmICgodGVhNTc1eF90dW5lciAmIFRVTkVSX09OTFkpID09IDApIHsKIAkJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZm04MDFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgY2hpcC0+aXJxKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBjaGlwLT5pcnEpOwogCQkJc25kX2ZtODAxX2ZyZWUoY2hpcCk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CkBAIC0xMjUxLDggKzEyNTEsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogI2lmZGVmIENPTkZJR19TTkRfRk04MDFfVEVBNTc1WF9CT09MCiAJZXJyID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJnBjaS0+ZGV2LCAmY2hpcC0+djRsMl9kZXYpOwogCWlmIChlcnIgPCAwKSB7CkBAIC0xMjY3LDcgKzEyNjUsNyBAQAogCWlmICgodGVhNTc1eF90dW5lciAmIFRVTkVSX1RZUEVfTUFTSykgPiAwICYmCiAJICAgICh0ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSA8IDQpIHsKIAkJaWYgKHNuZF90ZWE1NzV4X2luaXQoJmNoaXAtPnRlYSwgVEhJU19NT0RVTEUpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJURUE1NzV4IHJhZGlvIG5vdCBmb3VuZFxuIik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgIlRFQTU3NXggcmFkaW8gbm90IGZvdW5kXG4iKTsKIAkJCXNuZF9mbTgwMV9mcmVlKGNoaXApOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTEyNzYsMTMgKzEyNzQsMTQgQEAKIAkJZm9yICh0ZWE1NzV4X3R1bmVyID0gMTsgdGVhNTc1eF90dW5lciA8PSAzOyB0ZWE1NzV4X3R1bmVyKyspIHsKIAkJCWNoaXAtPnRlYTU3NXhfdHVuZXIgPSB0ZWE1NzV4X3R1bmVyOwogCQkJaWYgKCFzbmRfdGVhNTc1eF9pbml0KCZjaGlwLT50ZWEsIFRISVNfTU9EVUxFKSkgewotCQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJkZXRlY3RlZCBURUE1NzV4IHJhZGlvIHR5cGUgJXNcbiIsCisJCQkJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkJCQkgImRldGVjdGVkIFRFQTU3NXggcmFkaW8gdHlwZSAlc1xuIiwKIAkJCQkJICAgZ2V0X3RlYTU3NXhfZ3BpbyhjaGlwKS0+bmFtZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJaWYgKHRlYTU3NXhfdHVuZXIgPT0gNCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVEVBNTc1eCByYWRpbyBub3QgZm91bmRcbiIpOworCQkJZGV2X2VycihjYXJkLT5kZXYsICJURUE1NzV4IHJhZGlvIG5vdCBmb3VuZFxuIik7CiAJCQljaGlwLT50ZWE1NzV4X3R1bmVyID0gVFVORVJfRElTQUJMRUQ7CiAJCX0KIAl9CkBAIC0xMzEyLDcgKzEzMTEsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAoKGVyciA9IHNuZF9mbTgwMV9jcmVhdGUoY2FyZCwgcGNpLCB0ZWE1NzV4X3R1bmVyW2Rldl0sIHJhZGlvX25yW2Rldl0sICZjaGlwKSkgPCAwKSB7CkBAIC0xNDExLDggKzE0MTEsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZm04MDE6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvS2NvbmZpZyBiL3NvdW5kL3BjaS9oZGEvS2NvbmZpZwppbmRleCAwZTUzNjM0Li5hYzE3YzNmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL0tjb25maWcKKysrIGIvc291bmQvcGNpL2hkYS9LY29uZmlnCkBAIC0xLDggKzEsMTUgQEAKLW1lbnVjb25maWcgU05EX0hEQV9JTlRFTAotCXRyaXN0YXRlICJJbnRlbCBIRCBBdWRpbyIKK21lbnUgIkhELUF1ZGlvIgorCitjb25maWcgU05EX0hEQQorCXRyaXN0YXRlCiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgU05EX1ZNQVNURVIKIAlzZWxlY3QgU05EX0tDVExfSkFDSworCitjb25maWcgU05EX0hEQV9JTlRFTAorCXRyaXN0YXRlICJIRCBBdWRpbyBQQ0kiCisJZGVwZW5kcyBvbiBTTkRfUENJCisJc2VsZWN0IFNORF9IREEKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgSW50ZWwgIkhpZ2ggRGVmaW5pdGlvbgogCSAgQXVkaW8iIChBemFsaWEpIGFuZCBpdHMgY29tcGF0aWJsZSBkZXZpY2VzLgpAQCAtMTMsNyArMjAsNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc25kLWhkYS1pbnRlbC4KIAotaWYgU05EX0hEQV9JTlRFTAoraWYgU05EX0hEQQogCiBjb25maWcgU05EX0hEQV9EU1BfTE9BREVSCiAJYm9vbApAQCAtNDEsNyArNDgsNiBAQAogCiBjb25maWcgU05EX0hEQV9SRUNPTkZJRwogCWJvb2wgIkFsbG93IGR5bmFtaWMgY29kZWMgcmVjb25maWd1cmF0aW9uIgotCWRlcGVuZHMgb24gU05EX0hEQV9IV0RFUAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBIRC1hdWRpbyBjb2RlYyByZS1jb25maWd1cmF0aW9uIGZlYXR1cmUuCiAJICBUaGlzIGFkZHMgdGhlIHN5c2ZzIGludGVyZmFjZXMgdG8gYWxsb3cgdXNlciB0byBjbGVhciB0aGUgd2hvbGUKQEAgLTUwLDcgKzU2LDcgQEAKIAogY29uZmlnIFNORF9IREFfSU5QVVRfQkVFUAogCWJvb2wgIlN1cHBvcnQgZGlnaXRhbCBiZWVwIHZpYSBpbnB1dCBsYXllciIKLQlkZXBlbmRzIG9uIElOUFVUPXkgfHwgSU5QVVQ9U05EX0hEQV9JTlRFTAorCWRlcGVuZHMgb24gSU5QVVQ9eSB8fCBJTlBVVD1TTkRfSERBCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBidWlsZCBhIGRpZ2l0YWwgYmVlcCBpbnRlcmZhY2UgZm9yIEhELWF1ZGlvCiAJICBkcml2ZXIuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gZ2VuZXJhdGUgZGlnaXRhbCBiZWVwcy4KQEAgLTc2LDcgKzgyLDYgQEAKIGNvbmZpZyBTTkRfSERBX1BBVENIX0xPQURFUgogCWJvb2wgIlN1cHBvcnQgaW5pdGlhbGl6YXRpb24gcGF0Y2ggbG9hZGluZyBmb3IgSEQtYXVkaW8iCiAJc2VsZWN0IEZXX0xPQURFUgotCXNlbGVjdCBTTkRfSERBX0hXREVQCiAJc2VsZWN0IFNORF9IREFfUkVDT05GSUcKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGFsbG93IHRoZSBIRC1hdWRpbyBkcml2ZXIgdG8gbG9hZCBhIHBzZXVkbwpAQCAtODQsOCArODksNiBAQAogCSAgc3RhcnQgdXAuICBUaGUgInBhdGNoIiBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgdmlhIHBhdGNoIG1vZHVsZQogCSAgb3B0aW9uLCBzdWNoIGFzIHBhdGNoPWhkYS1pbml0LgogCi0JICBUaGlzIG9wdGlvbiB0dXJucyBvbiBod2RlcCBhbmQgcmVjb25maWcgZmVhdHVyZXMgYXV0b21hdGljYWxseS4KLQogY29uZmlnIFNORF9IREFfQ09ERUNfUkVBTFRFSwogCXRyaXN0YXRlICJCdWlsZCBSZWFsdGVrIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCiAJc2VsZWN0IFNORF9IREFfR0VORVJJQwpAQCAtOTQsNyArOTcsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgQUxDODgwLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX1JFQUxURUs9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfUkVBTFRFSz1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0FOQUxPRwogCXRyaXN0YXRlICJCdWlsZCBBbmFsb2cgRGV2aWNlIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCkBAIC0xMDQsNyArMTA3LDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBzdWNoIGFzIEFEMTk4NkEuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfQU5BTE9HPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX0FOQUxPRz1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX1NJR01BVEVMCiAJdHJpc3RhdGUgIkJ1aWxkIElEVC9TaWdtYXRlbCBIRC1hdWRpbyBjb2RlYyBzdXBwb3J0IgpAQCAtMTE0LDcgKzExNyw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBTVEFDOTIwMC4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19TSUdNQVRFTD1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19TSUdNQVRFTD1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX1ZJQQogCXRyaXN0YXRlICJCdWlsZCBWSUEgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKQEAgLTEyNCw3ICsxMjcsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgVlQxNzA4LgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX1ZJQT1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19WSUE9bQogCiBjb25maWcgU05EX0hEQV9DT0RFQ19IRE1JCiAJdHJpc3RhdGUgIkJ1aWxkIEhETUkvRGlzcGxheVBvcnQgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCIKQEAgLTEzNCw3ICsxMzcsNyBAQAogCSAgSW50ZWwgYW5kIE52aWRpYSBIRE1JL0Rpc3BsYXlQb3J0IGNvZGVjcy4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19IRE1JPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX0hETUk9bQogCiBjb25maWcgU05EX0hEQV9JOTE1CiAJYm9vbApAQCAtMTQ5LDcgKzE1Miw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgc3VjaCBhcyBDUzQyMDYuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfQ0lSUlVTPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX0NJUlJVUz1tCiAKIGNvbmZpZyBTTkRfSERBX0NPREVDX0NPTkVYQU5UCiAJdHJpc3RhdGUgIkJ1aWxkIENvbmV4YW50IEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCkBAIC0xNTksNyArMTYyLDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBzdWNoIGFzIENYMjA1NDkuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfQ09ORVhBTlQ9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfQ09ORVhBTlQ9bQogCiBjb25maWcgU05EX0hEQV9DT0RFQ19DQTAxMTAKIAl0cmlzdGF0ZSAiQnVpbGQgQ3JlYXRpdmUgQ0EwMTEwLUlCRyBjb2RlYyBzdXBwb3J0IgpAQCAtMTY5LDcgKzE3Miw3IEBACiAJICBzbmQtaGRhLWludGVsIGRyaXZlciwgZm91bmQgb24gc29tZSBDcmVhdGl2ZSBYLUZpIGNhcmRzLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX0NBMDExMD1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19DQTAxMTA9bQogCiBjb25maWcgU05EX0hEQV9DT0RFQ19DQTAxMzIKIAl0cmlzdGF0ZSAiQnVpbGQgQ3JlYXRpdmUgQ0EwMTMyIGNvZGVjIHN1cHBvcnQiCkBAIC0xNzgsNyArMTgxLDcgQEAKIAkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLgogCiBjb21tZW50ICJTZXQgdG8gWSBpZiB5b3Ugd2FudCBhdXRvLWxvYWRpbmcgdGhlIGNvZGVjIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNORF9IREFfSU5URUw9eSAmJiBTTkRfSERBX0NPREVDX0NBMDEzMj1tCisJZGVwZW5kcyBvbiBTTkRfSERBPXkgJiYgU05EX0hEQV9DT0RFQ19DQTAxMzI9bQogCiBjb25maWcgU05EX0hEQV9DT0RFQ19DQTAxMzJfRFNQCiAJYm9vbCAiU3VwcG9ydCBuZXcgRFNQIGNvZGUgZm9yIENBMDEzMiBjb2RlYyIKQEAgLTIwMCw3ICsyMDMsNyBAQAogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgQ01JOTg4MC4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9DT0RFQ19DTUVESUE9bQorCWRlcGVuZHMgb24gU05EX0hEQT15ICYmIFNORF9IREFfQ09ERUNfQ01FRElBPW0KIAogY29uZmlnIFNORF9IREFfQ09ERUNfU0kzMDU0CiAJdHJpc3RhdGUgIkJ1aWxkIFNpbGljb24gTGFicyAzMDU0IEhELW1vZGVtIGNvZGVjIHN1cHBvcnQiCkBAIC0yMDksNyArMjEyLDcgQEAKIAkgIChhbmQgY29tcGF0aWJsZXMpIHN1cHBvcnQgaW4gc25kLWhkYS1pbnRlbCBkcml2ZXIuCiAKIGNvbW1lbnQgIlNldCB0byBZIGlmIHlvdSB3YW50IGF1dG8tbG9hZGluZyB0aGUgY29kZWMgZHJpdmVyIgotCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTD15ICYmIFNORF9IREFfQ09ERUNfU0kzMDU0PW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0NPREVDX1NJMzA1ND1tCiAKIGNvbmZpZyBTTkRfSERBX0dFTkVSSUMKIAl0cmlzdGF0ZSAiRW5hYmxlIGdlbmVyaWMgSEQtYXVkaW8gY29kZWMgcGFyc2VyIgpAQCAtMjE4LDcgKzIyMSw3IEBACiAJICBpbiBzbmQtaGRhLWludGVsIGRyaXZlci4KIAogY29tbWVudCAiU2V0IHRvIFkgaWYgeW91IHdhbnQgYXV0by1sb2FkaW5nIHRoZSBjb2RlYyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMPXkgJiYgU05EX0hEQV9HRU5FUklDPW0KKwlkZXBlbmRzIG9uIFNORF9IREE9eSAmJiBTTkRfSERBX0dFTkVSSUM9bQogCiBjb25maWcgU05EX0hEQV9QT1dFUl9TQVZFX0RFRkFVTFQKIAlpbnQgIkRlZmF1bHQgdGltZS1vdXQgZm9yIEhELWF1ZGlvIHBvd2VyLXNhdmUgbW9kZSIKQEAgLTIyOSwzICsyMzIsNSBAQAogCSAgcG93ZXItc2F2ZSBtb2RlLiAgMCBtZWFucyB0byBkaXNhYmxlIHRoZSBwb3dlci1zYXZlIG1vZGUuCiAKIGVuZGlmCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCmluZGV4IDFmY2IxMTguLmQwZDBjMTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKKysrIGIvc291bmQvcGNpL2hkYS9NYWtlZmlsZQpAQCAtMSwxNSArMSwxNiBAQAogc25kLWhkYS1pbnRlbC1vYmpzIDo9IGhkYV9pbnRlbC5vCitzbmQtaGRhLWNvbnRyb2xsZXItb2JqcyA6PSBoZGFfY29udHJvbGxlci5vCiAjIGZvciBoYXN3ZWxsIHBvd2VyIHdlbGwKIHNuZC1oZGEtaW50ZWwtJChDT05GSUdfU05EX0hEQV9JOTE1KSArPQloZGFfaTkxNS5vCiAKLXNuZC1oZGEtY29kZWMteSA6PSBoZGFfY29kZWMubyBoZGFfamFjay5vIGhkYV9hdXRvX3BhcnNlci5vCitzbmQtaGRhLWNvZGVjLXkgOj0gaGRhX2NvZGVjLm8gaGRhX2phY2subyBoZGFfYXV0b19wYXJzZXIubyBoZGFfc3lzZnMubwogc25kLWhkYS1jb2RlYy0kKENPTkZJR19QUk9DX0ZTKSArPSBoZGFfcHJvYy5vCiBzbmQtaGRhLWNvZGVjLSQoQ09ORklHX1NORF9IREFfSFdERVApICs9IGhkYV9od2RlcC5vCiBzbmQtaGRhLWNvZGVjLSQoQ09ORklHX1NORF9IREFfSU5QVVRfQkVFUCkgKz0gaGRhX2JlZXAubwogCiAjIGZvciB0cmFjZS1wb2ludHMKIENGTEFHU19oZGFfY29kZWMubyA6PSAtSSQoc3JjKQotQ0ZMQUdTX2hkYV9pbnRlbC5vIDo9IC1JJChzcmMpCitDRkxBR1NfaGRhX2NvbnRyb2xsZXIubyA6PSAtSSQoc3JjKQogCiBzbmQtaGRhLWNvZGVjLWdlbmVyaWMtb2JqcyA6PQloZGFfZ2VuZXJpYy5vCiBzbmQtaGRhLWNvZGVjLXJlYWx0ZWstb2JqcyA6PQlwYXRjaF9yZWFsdGVrLm8KQEAgLTI1LDcgKzI2LDggQEAKIHNuZC1oZGEtY29kZWMtaGRtaS1vYmpzIDo9CXBhdGNoX2hkbWkubyBoZGFfZWxkLm8KIAogIyBjb21tb24gZHJpdmVyCi1vYmotJChDT05GSUdfU05EX0hEQV9JTlRFTCkgOj0gc25kLWhkYS1jb2RlYy5vCitvYmotJChDT05GSUdfU05EX0hEQSkgOj0gc25kLWhkYS1jb2RlYy5vCitvYmotJChDT05GSUdfU05EX0hEQSkgKz0gc25kLWhkYS1jb250cm9sbGVyLm8KIAogIyBjb2RlYyBkcml2ZXJzCiBvYmotJChDT05GSUdfU05EX0hEQV9HRU5FUklDKSArPSBzbmQtaGRhLWNvZGVjLWdlbmVyaWMubwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfYXV0b19wYXJzZXIuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2F1dG9fcGFyc2VyLmMKaW5kZXggNDdhZDMxYy4uOTBkMmZkYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfYXV0b19wYXJzZXIuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9hdXRvX3BhcnNlci5jCkBAIC0yMjcsMTAgKzIyNywxOCBAQAogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFhc3NvY19saW5lX291dCkKIAkJCQlhc3NvY19saW5lX291dCA9IGFzc29jOwotCQkJZWxzZSBpZiAoYXNzb2NfbGluZV9vdXQgIT0gYXNzb2MpCisJCQllbHNlIGlmIChhc3NvY19saW5lX291dCAhPSBhc3NvYykgeworCQkJCWNvZGVjX2luZm8oY29kZWMsCisJCQkJCSAgICJpZ25vcmUgcGluIDB4JXggd2l0aCBtaXNtYXRjaGluZyBhc3NvYyMgMHgleCB2cyAweCV4XG4iLAorCQkJCQkgICBuaWQsIGFzc29jLCBhc3NvY19saW5lX291dCk7CiAJCQkJY29udGludWU7Ci0JCQlpZiAoY2ZnLT5saW5lX291dHMgPj0gQVJSQVlfU0laRShjZmctPmxpbmVfb3V0X3BpbnMpKQorCQkJfQorCQkJaWYgKGNmZy0+bGluZV9vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5saW5lX291dF9waW5zKSkgeworCQkJCWNvZGVjX2luZm8oY29kZWMsCisJCQkJCSAgICJpZ25vcmUgcGluIDB4JXgsIHRvbyBtYW55IGFzc2lnbmVkIHBpbnNcbiIsCisJCQkJCSAgIG5pZCk7CiAJCQkJY29udGludWU7CisJCQl9CiAJCQlsaW5lX291dFtjZmctPmxpbmVfb3V0c10ucGluID0gbmlkOwogCQkJbGluZV9vdXRbY2ZnLT5saW5lX291dHNdLnNlcSA9IHNlcTsKIAkJCWNmZy0+bGluZV9vdXRzKys7CkBAIC0yMzgsOCArMjQ2LDEyIEBACiAJCWNhc2UgQUNfSkFDS19TUEVBS0VSOgogCQkJc2VxID0gZ2V0X2RlZmNmZ19zZXF1ZW5jZShkZWZfY29uZik7CiAJCQlhc3NvYyA9IGdldF9kZWZjZmdfYXNzb2NpYXRpb24oZGVmX2NvbmYpOwotCQkJaWYgKGNmZy0+c3BlYWtlcl9vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5zcGVha2VyX3BpbnMpKQorCQkJaWYgKGNmZy0+c3BlYWtlcl9vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5zcGVha2VyX3BpbnMpKSB7CisJCQkJY29kZWNfaW5mbyhjb2RlYywKKwkJCQkJICAgImlnbm9yZSBwaW4gMHgleCwgdG9vIG1hbnkgYXNzaWduZWQgcGluc1xuIiwKKwkJCQkJICAgbmlkKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAkJCXNwZWFrZXJfb3V0W2NmZy0+c3BlYWtlcl9vdXRzXS5waW4gPSBuaWQ7CiAJCQlzcGVha2VyX291dFtjZmctPnNwZWFrZXJfb3V0c10uc2VxID0gKGFzc29jIDw8IDQpIHwgc2VxOwogCQkJY2ZnLT5zcGVha2VyX291dHMrKzsKQEAgLTI0Nyw4ICsyNTksMTIgQEAKIAkJY2FzZSBBQ19KQUNLX0hQX09VVDoKIAkJCXNlcSA9IGdldF9kZWZjZmdfc2VxdWVuY2UoZGVmX2NvbmYpOwogCQkJYXNzb2MgPSBnZXRfZGVmY2ZnX2Fzc29jaWF0aW9uKGRlZl9jb25mKTsKLQkJCWlmIChjZmctPmhwX291dHMgPj0gQVJSQVlfU0laRShjZmctPmhwX3BpbnMpKQorCQkJaWYgKGNmZy0+aHBfb3V0cyA+PSBBUlJBWV9TSVpFKGNmZy0+aHBfcGlucykpIHsKKwkJCQljb2RlY19pbmZvKGNvZGVjLAorCQkJCQkgICAiaWdub3JlIHBpbiAweCV4LCB0b28gbWFueSBhc3NpZ25lZCBwaW5zXG4iLAorCQkJCQkgICBuaWQpOwogCQkJCWNvbnRpbnVlOworCQkJfQogCQkJaHBfb3V0W2NmZy0+aHBfb3V0c10ucGluID0gbmlkOwogCQkJaHBfb3V0W2NmZy0+aHBfb3V0c10uc2VxID0gKGFzc29jIDw8IDQpIHwgc2VxOwogCQkJY2ZnLT5ocF9vdXRzKys7CkBAIC0yNjcsOCArMjgzLDEyIEBACiAJCQlicmVhazsKIAkJY2FzZSBBQ19KQUNLX1NQRElGX09VVDoKIAkJY2FzZSBBQ19KQUNLX0RJR19PVEhFUl9PVVQ6Ci0JCQlpZiAoY2ZnLT5kaWdfb3V0cyA+PSBBUlJBWV9TSVpFKGNmZy0+ZGlnX291dF9waW5zKSkKKwkJCWlmIChjZmctPmRpZ19vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5kaWdfb3V0X3BpbnMpKSB7CisJCQkJY29kZWNfaW5mbyhjb2RlYywKKwkJCQkJICAgImlnbm9yZSBwaW4gMHgleCwgdG9vIG1hbnkgYXNzaWduZWQgcGluc1xuIiwKKwkJCQkJICAgbmlkKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAkJCWNmZy0+ZGlnX291dF9waW5zW2NmZy0+ZGlnX291dHNdID0gbmlkOwogCQkJY2ZnLT5kaWdfb3V0X3R5cGVbY2ZnLT5kaWdfb3V0c10gPQogCQkJCShsb2MgPT0gQUNfSkFDS19MT0NfSERNSSkgPwpAQCAtMzEzLDkgKzMzMyw5IEBACiAJCX0KIAogCQlpZiAoaHNtaWMpCi0JCQlzbmRfcHJpbnRkZCgiVG9sZCB0byBsb29rIGZvciBhIGhlYWRzZXQgbWljLCBidXQgZGlkbid0IGZpbmQgYW55LlxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJUb2xkIHRvIGxvb2sgZm9yIGEgaGVhZHNldCBtaWMsIGJ1dCBkaWRuJ3QgZmluZCBhbnkuXG4iKTsKIAkJaWYgKGhwbWljKQotCQkJc25kX3ByaW50ZGQoIlRvbGQgdG8gbG9vayBmb3IgYSBoZWFkcGhvbmUgbWljLCBidXQgZGlkbid0IGZpbmQgYW55LlxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJUb2xkIHRvIGxvb2sgZm9yIGEgaGVhZHBob25lIG1pYywgYnV0IGRpZG4ndCBmaW5kIGFueS5cbiIpOwogCX0KIAogCS8qIEZJWC1VUDoKQEAgLTM4NCwzMyArNDA0LDMzIEBACiAJLyoKIAkgKiBkZWJ1ZyBwcmludHMgb2YgdGhlIHBhcnNlZCByZXN1bHRzCiAJICovCi0Jc25kX3ByaW50ZCgiYXV0b2NvbmZpZzogbGluZV9vdXRzPSVkICgweCV4LzB4JXgvMHgleC8weCV4LzB4JXgpIHR5cGU6JXNcbiIsCisJY29kZWNfaW5mbyhjb2RlYywgImF1dG9jb25maWc6IGxpbmVfb3V0cz0lZCAoMHgleC8weCV4LzB4JXgvMHgleC8weCV4KSB0eXBlOiVzXG4iLAogCQkgICBjZmctPmxpbmVfb3V0cywgY2ZnLT5saW5lX291dF9waW5zWzBdLCBjZmctPmxpbmVfb3V0X3BpbnNbMV0sCiAJCSAgIGNmZy0+bGluZV9vdXRfcGluc1syXSwgY2ZnLT5saW5lX291dF9waW5zWzNdLAogCQkgICBjZmctPmxpbmVfb3V0X3BpbnNbNF0sCiAJCSAgIGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9IUF9PVVQgPyAiaHAiIDoKIAkJICAgKGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCA/CiAJCSAgICAic3BlYWtlciIgOiAibGluZSIpKTsKLQlzbmRfcHJpbnRkKCIgICBzcGVha2VyX291dHM9JWQgKDB4JXgvMHgleC8weCV4LzB4JXgvMHgleClcbiIsCisJY29kZWNfaW5mbyhjb2RlYywgIiAgIHNwZWFrZXJfb3V0cz0lZCAoMHgleC8weCV4LzB4JXgvMHgleC8weCV4KVxuIiwKIAkJICAgY2ZnLT5zcGVha2VyX291dHMsIGNmZy0+c3BlYWtlcl9waW5zWzBdLAogCQkgICBjZmctPnNwZWFrZXJfcGluc1sxXSwgY2ZnLT5zcGVha2VyX3BpbnNbMl0sCiAJCSAgIGNmZy0+c3BlYWtlcl9waW5zWzNdLCBjZmctPnNwZWFrZXJfcGluc1s0XSk7Ci0Jc25kX3ByaW50ZCgiICAgaHBfb3V0cz0lZCAoMHgleC8weCV4LzB4JXgvMHgleC8weCV4KVxuIiwKKwljb2RlY19pbmZvKGNvZGVjLCAiICAgaHBfb3V0cz0lZCAoMHgleC8weCV4LzB4JXgvMHgleC8weCV4KVxuIiwKIAkJICAgY2ZnLT5ocF9vdXRzLCBjZmctPmhwX3BpbnNbMF0sCiAJCSAgIGNmZy0+aHBfcGluc1sxXSwgY2ZnLT5ocF9waW5zWzJdLAogCQkgICBjZmctPmhwX3BpbnNbM10sIGNmZy0+aHBfcGluc1s0XSk7Ci0Jc25kX3ByaW50ZCgiICAgbW9ubzogbW9ub19vdXQ9MHgleFxuIiwgY2ZnLT5tb25vX291dF9waW4pOworCWNvZGVjX2luZm8oY29kZWMsICIgICBtb25vOiBtb25vX291dD0weCV4XG4iLCBjZmctPm1vbm9fb3V0X3Bpbik7CiAJaWYgKGNmZy0+ZGlnX291dHMpCi0JCXNuZF9wcmludGQoIiAgIGRpZy1vdXQ9MHgleC8weCV4XG4iLAorCQljb2RlY19pbmZvKGNvZGVjLCAiICAgZGlnLW91dD0weCV4LzB4JXhcbiIsCiAJCQkgICBjZmctPmRpZ19vdXRfcGluc1swXSwgY2ZnLT5kaWdfb3V0X3BpbnNbMV0pOwotCXNuZF9wcmludGQoIiAgIGlucHV0czpcbiIpOworCWNvZGVjX2luZm8oY29kZWMsICIgICBpbnB1dHM6XG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspIHsKLQkJc25kX3ByaW50ZCgiICAgICAlcz0weCV4XG4iLAorCQljb2RlY19pbmZvKGNvZGVjLCAiICAgICAlcz0weCV4XG4iLAogCQkJICAgIGhkYV9nZXRfYXV0b2NmZ19pbnB1dF9sYWJlbChjb2RlYywgY2ZnLCBpKSwKIAkJCSAgICBjZmctPmlucHV0c1tpXS5waW4pOwogCX0KIAlpZiAoY2ZnLT5kaWdfaW5fcGluKQotCQlzbmRfcHJpbnRkKCIgICBkaWctaW49MHgleFxuIiwgY2ZnLT5kaWdfaW5fcGluKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIiAgIGRpZy1pbj0weCV4XG4iLCBjZmctPmRpZ19pbl9waW4pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NzQsMzggKzc5NCwzMyBAQAogCQljYXNlIEhEQV9GSVhVUF9QSU5TOgogCQkJaWYgKGFjdGlvbiAhPSBIREFfRklYVVBfQUNUX1BSRV9QUk9CRSB8fCAhZml4LT52LnBpbnMpCiAJCQkJYnJlYWs7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gU0ZYCi0JCQkJICAgICIlczogQXBwbHkgcGluY2ZnIGZvciAlc1xuIiwKKwkJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBBcHBseSBwaW5jZmcgZm9yICVzXG4iLAogCQkJCSAgICBjb2RlYy0+Y2hpcF9uYW1lLCBtb2RlbG5hbWUpOwogCQkJc25kX2hkYV9hcHBseV9waW5jZmdzKGNvZGVjLCBmaXgtPnYucGlucyk7CiAJCQlicmVhazsKIAkJY2FzZSBIREFfRklYVVBfVkVSQlM6CiAJCQlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJPQkUgfHwgIWZpeC0+di52ZXJicykKIAkJCQlicmVhazsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyBTRlgKLQkJCQkgICAgIiVzOiBBcHBseSBmaXgtdmVyYnMgZm9yICVzXG4iLAorCQkJY29kZWNfZGJnKGNvZGVjLCAiJXM6IEFwcGx5IGZpeC12ZXJicyBmb3IgJXNcbiIsCiAJCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlzbmRfaGRhX2FkZF92ZXJicyhjb2RlYywgZml4LT52LnZlcmJzKTsKIAkJCWJyZWFrOwogCQljYXNlIEhEQV9GSVhVUF9GVU5DOgogCQkJaWYgKCFmaXgtPnYuZnVuYykKIAkJCQlicmVhazsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyBTRlgKLQkJCQkgICAgIiVzOiBBcHBseSBmaXgtZnVuYyBmb3IgJXNcbiIsCisJCQljb2RlY19kYmcoY29kZWMsICIlczogQXBwbHkgZml4LWZ1bmMgZm9yICVzXG4iLAogCQkJCSAgICBjb2RlYy0+Y2hpcF9uYW1lLCBtb2RlbG5hbWUpOwogCQkJZml4LT52LmZ1bmMoY29kZWMsIGZpeCwgYWN0aW9uKTsKIAkJCWJyZWFrOwogCQljYXNlIEhEQV9GSVhVUF9QSU5DVExTOgogCQkJaWYgKGFjdGlvbiAhPSBIREFfRklYVVBfQUNUX1BST0JFIHx8ICFmaXgtPnYucGlucykKIAkJCQlicmVhazsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyBTRlgKLQkJCQkgICAgIiVzOiBBcHBseSBwaW5jdGwgZm9yICVzXG4iLAorCQkJY29kZWNfZGJnKGNvZGVjLCAiJXM6IEFwcGx5IHBpbmN0bCBmb3IgJXNcbiIsCiAJCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlzZXRfcGluX3RhcmdldHMoY29kZWMsIGZpeC0+di5waW5zKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlgKLQkJCQkgICAiJXM6IEludmFsaWQgZml4dXAgdHlwZSAlZFxuIiwKKwkJCWNvZGVjX2Vycihjb2RlYywgIiVzOiBJbnZhbGlkIGZpeHVwIHR5cGUgJWRcbiIsCiAJCQkJICAgY29kZWMtPmNoaXBfbmFtZSwgZml4LT50eXBlKTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMKaW5kZXggMDU4OWIzOS4uOGM2YzUwYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwpAQCAtMjAsNyArMjAsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KQEAgLTE0MCw3ICsxMzksMTAgQEAKIAogc3RhdGljIHZvaWQgc25kX2hkYV9kb19kZXRhY2goc3RydWN0IGhkYV9iZWVwICpiZWVwKQogewotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJlZXAtPmRldik7CisJaWYgKGJlZXAtPnJlZ2lzdGVyZWQpCisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJlZXAtPmRldik7CisJZWxzZQorCQlpbnB1dF9mcmVlX2RldmljZShiZWVwLT5kZXYpOwogCWJlZXAtPmRldiA9IE5VTEw7CiAJdHVybl9vZmZfYmVlcChiZWVwKTsKIH0KQEAgLTE0OSw3ICsxNTEsNiBAQAogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGJlZXAtPmNvZGVjOwotCWludCBlcnI7CiAKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWlucHV0X2RldikKQEAgLTE2NywxNSArMTY4LDkgQEAKIAlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfU05EKTsKIAlpbnB1dF9kZXYtPnNuZGJpdFswXSA9IEJJVF9NQVNLKFNORF9CRUxMKSB8IEJJVF9NQVNLKFNORF9UT05FKTsKIAlpbnB1dF9kZXYtPmV2ZW50ID0gc25kX2hkYV9iZWVwX2V2ZW50OwotCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZjb2RlYy0+YnVzLT5wY2ktPmRldjsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmY29kZWMtPmRldjsKIAlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIGJlZXApOwogCi0JZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7Ci0JaWYgKGVyciA8IDApIHsKLQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2JlZXA6IHVuYWJsZSB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KIAliZWVwLT5kZXYgPSBpbnB1dF9kZXY7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDUsNiArMjQwLDI3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZSk7CiAKK2ludCBzbmRfaGRhX3JlZ2lzdGVyX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBoZGFfYmVlcCAqYmVlcCA9IGNvZGVjLT5iZWVwOworCWludCBlcnI7CisKKwlpZiAoIWJlZXAgfHwgIWJlZXAtPmRldikKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYmVlcC0+ZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQljb2RlY19lcnIoY29kZWMsICJoZGFfYmVlcDogdW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGJlZXAtPmRldik7CisJCWNvZGVjLT5iZWVwID0gTlVMTDsKKwkJa2ZyZWUoYmVlcCk7CisJCXJldHVybiBlcnI7CisJfQorCWJlZXAtPnJlZ2lzdGVyZWQgPSB0cnVlOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9yZWdpc3Rlcl9iZWVwX2RldmljZSk7CisKIHN0YXRpYyBib29sIGN0bF9oYXNfbXV0ZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaAppbmRleCBjYjg4NDY0Li5hNjNiNWUwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCkBAIC0zNCw2ICszNCw3IEBACiAJY2hhciBwaHlzWzMyXTsKIAlpbnQgdG9uZTsKIAloZGFfbmlkX3QgbmlkOworCXVuc2lnbmVkIGludCByZWdpc3RlcmVkOjE7CiAJdW5zaWduZWQgaW50IGVuYWJsZWQ6MTsKIAl1bnNpZ25lZCBpbnQgbGluZWFyX3RvbmU6MTsJLyogbGluZWFyIHRvbmUgZm9yIElEVC9TVEFDIGNvZGVjICovCiAJdW5zaWduZWQgaW50IHBsYXlpbmc6MTsKQEAgLTQ1LDYgKzQ2LDcgQEAKIGludCBzbmRfaGRhX2VuYWJsZV9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSk7CiBpbnQgc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBuaWQpOwogdm9pZCBzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CitpbnQgc25kX2hkYV9yZWdpc3Rlcl9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBuaWQpCiB7CkBAIC01Myw1ICs1NSw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiB9CitzdGF0aWMgaW5saW5lIGludCBzbmRfaGRhX3JlZ2lzdGVyX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IGRhZmNmODIuLjRjMjAyNzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CkBAIC02OCw2ICs2Nyw3IEBACiAJeyAweDE3ZTgsICJDaHJvbnRlbCIgfSwKIAl7IDB4MTg1NCwgIkxHIiB9LAogCXsgMHgxYWVjLCAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIiB9LAorCXsgMHgxYWY0LCAiUUVNVSIgfSwKIAl7IDB4NDM0ZCwgIkMtTWVkaWEiIH0sCiAJeyAweDgwODYsICJJbnRlbCIgfSwKIAl7IDB4ODM4NCwgIlNpZ21hVGVsIiB9LApAQCAtMjAxLDcgKzIwMSw3IEBACiAKIAlpZiAoKGNvZGVjLT5hZGRyICYgfjB4ZikgfHwgKG5pZCAmIH4weDdmKSB8fAogCSAgICAodmVyYiAmIH4weGZmZikgfHwgKHBhcm0gJiB+MHhmZmZmKSkgewotCQlwcmludGsoS0VSTl9FUlIgImhkYS1jb2RlYzogb3V0IG9mIHJhbmdlIGNtZCAleDoleDoleDoleFxuIiwKKwkJY29kZWNfZXJyKGNvZGVjLCAiaGRhLWNvZGVjOiBvdXQgb2YgcmFuZ2UgY21kICV4OiV4OiV4OiV4XG4iLAogCQkgICAgICAgY29kZWMtPmFkZHIsIG5pZCwgdmVyYiwgcGFybSk7CiAJCXJldHVybiB+MDsKIAl9CkBAIC0yNDksOCArMjQ5LDggQEAKIAlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwogCWlmICghY29kZWNfaW5fcG0oY29kZWMpICYmIHJlcyAmJiAqcmVzID09IC0xICYmIGJ1cy0+cmlyYl9lcnJvcikgewogCQlpZiAoYnVzLT5yZXNwb25zZV9yZXNldCkgewotCQkJc25kX3ByaW50ZCgiaGRhX2NvZGVjOiByZXNldHRpbmcgQlVTIGR1ZSB0byAiCi0JCQkJICAgImZhdGFsIGNvbW11bmljYXRpb24gZXJyb3JcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLAorCQkJCSAgInJlc2V0dGluZyBCVVMgZHVlIHRvIGZhdGFsIGNvbW11bmljYXRpb24gZXJyb3JcbiIpOwogCQkJdHJhY2VfaGRhX2J1c19yZXNldChidXMpOwogCQkJYnVzLT5vcHMuYnVzX3Jlc2V0KGJ1cyk7CiAJCX0KQEAgLTQ3NSw4ICs0NzUsNyBAQAogCiAJaWYgKGxlbiA+IDAgJiYgY29ubl9saXN0KSB7CiAJCWlmIChsZW4gPiBtYXhfY29ubnMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogIgotCQkJCSAgICJUb28gbWFueSBjb25uZWN0aW9ucyAlZCBmb3IgTklEIDB4JXhcbiIsCisJCQljb2RlY19lcnIoY29kZWMsICJUb28gbWFueSBjb25uZWN0aW9ucyAlZCBmb3IgTklEIDB4JXhcbiIsCiAJCQkJICAgbGVuLCBuaWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTU3NCw4ICs1NzMsOCBAQAogCQlyYW5nZV92YWwgPSAhIShwYXJtICYgKDEgPDwgKHNoaWZ0LTEpKSk7IC8qIHJhbmdlcyAqLwogCQl2YWwgPSBwYXJtICYgbWFzazsKIAkJaWYgKHZhbCA9PSAwICYmIG51bGxfY291bnQrKykgeyAgLyogbm8gc2Vjb25kIGNoYW5jZSAqLwotCQkJc25kX3ByaW50ZGQoImhkYV9jb2RlYzogIgotCQkJCSAgICJpbnZhbGlkIENPTk5FQ1RfTElTVCB2ZXJiICV4WyVpXToleFxuIiwKKwkJCWNvZGVjX2RiZyhjb2RlYywKKwkJCQkgICJpbnZhbGlkIENPTk5FQ1RfTElTVCB2ZXJiICV4WyVpXToleFxuIiwKIAkJCQkgICAgbmlkLCBpLCBwYXJtKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC01ODMsNyArNTgyLDcgQEAKIAkJaWYgKHJhbmdlX3ZhbCkgewogCQkJLyogcmFuZ2VzIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCB0aGlzIG9uZSAqLwogCQkJaWYgKCFwcmV2X25pZCB8fCBwcmV2X25pZCA+PSB2YWwpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiAiCisJCQkJY29kZWNfd2Fybihjb2RlYywKIAkJCQkJICAgImludmFsaWQgZGVwX3JhbmdlX3ZhbCAleDoleFxuIiwKIAkJCQkJICAgcHJldl9uaWQsIHZhbCk7CiAJCQkJY29udGludWU7CkBAIC02NjAsNyArNjU5LDcgQEAKIAlpZiAoIXJlY3Vyc2l2ZSkKIAkJcmV0dXJuIC0xOwogCWlmIChyZWN1cnNpdmUgPiAxMCkgewotCQlzbmRfcHJpbnRkKCJoZGFfY29kZWM6IHRvbyBkZWVwIGNvbm5lY3Rpb24gZm9yIDB4JXhcbiIsIG5pZCk7CisJCWNvZGVjX2RiZyhjb2RlYywgInRvbyBkZWVwIGNvbm5lY3Rpb24gZm9yIDB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiAtMTsKIAl9CiAJcmVjdXJzaXZlKys7CkBAIC04MDgsOCArODA3LDcgQEAKIAogCXVuc29sID0ga3phbGxvYyhzaXplb2YoKnVuc29sKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1bnNvbCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6ICIKLQkJCSAgICJjYW4ndCBhbGxvY2F0ZSB1bnNvbGljaXRlZCBxdWV1ZVxuIik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSB1bnNvbGljaXRlZCBxdWV1ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlJTklUX1dPUksoJnVuc29sLT53b3JrLCBwcm9jZXNzX3Vuc29sX2V2ZW50cyk7CkBAIC04MjEsNTEgKzgxOSwzNiBAQAogLyoKICAqIGRlc3RydWN0b3IKICAqLwotc3RhdGljIHZvaWQgc25kX2hkYV9jb2RlY19mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKLQotc3RhdGljIGludCBzbmRfaGRhX2J1c19mcmVlKHN0cnVjdCBoZGFfYnVzICpidXMpCitzdGF0aWMgdm9pZCBzbmRfaGRhX2J1c19mcmVlKHN0cnVjdCBoZGFfYnVzICpidXMpCiB7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsICpuOwotCiAJaWYgKCFidXMpCi0JCXJldHVybiAwOworCQlyZXR1cm47CisKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZidXMtPmNvZGVjX2xpc3QpKTsKIAlpZiAoYnVzLT53b3JrcSkKIAkJZmx1c2hfd29ya3F1ZXVlKGJ1cy0+d29ya3EpOwogCWlmIChidXMtPnVuc29sKQogCQlrZnJlZShidXMtPnVuc29sKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29kZWMsIG4sICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJc25kX2hkYV9jb2RlY19mcmVlKGNvZGVjKTsKLQl9CiAJaWYgKGJ1cy0+b3BzLnByaXZhdGVfZnJlZSkKIAkJYnVzLT5vcHMucHJpdmF0ZV9mcmVlKGJ1cyk7CiAJaWYgKGJ1cy0+d29ya3EpCiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGJ1cy0+d29ya3EpOwogCiAJa2ZyZWUoYnVzKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzbmRfaGRhX2J1c19kZXZfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBoZGFfYnVzICpidXMgPSBkZXZpY2UtPmRldmljZV9kYXRhOwotCWJ1cy0+c2h1dGRvd24gPSAxOwotCXJldHVybiBzbmRfaGRhX2J1c19mcmVlKGJ1cyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9IV0RFUAotc3RhdGljIGludCBzbmRfaGRhX2J1c19kZXZfcmVnaXN0ZXIoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgaGRhX2J1cyAqYnVzID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCXNuZF9oZGFfaHdkZXBfYWRkX3N5c2ZzKGNvZGVjKTsKLQkJc25kX2hkYV9od2RlcF9hZGRfcG93ZXJfc3lzZnMoY29kZWMpOwotCX0KKwlzbmRfaGRhX2J1c19mcmVlKGRldmljZS0+ZGV2aWNlX2RhdGEpOwogCXJldHVybiAwOwogfQotI2Vsc2UKLSNkZWZpbmUgc25kX2hkYV9idXNfZGV2X3JlZ2lzdGVyCU5VTEwKLSNlbmRpZgorCitzdGF0aWMgaW50IHNuZF9oZGFfYnVzX2Rldl9kaXNjb25uZWN0KHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGhkYV9idXMgKmJ1cyA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJYnVzLT5zaHV0ZG93biA9IDE7CisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogc25kX2hkYV9idXNfbmV3IC0gY3JlYXRlIGEgSERBIGJ1cwpAQCAtODgyLDcgKzg2NSw3IEBACiAJc3RydWN0IGhkYV9idXMgKmJ1czsKIAlpbnQgZXJyOwogCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgZGV2X29wcyA9IHsKLQkJLmRldl9yZWdpc3RlciA9IHNuZF9oZGFfYnVzX2Rldl9yZWdpc3RlciwKKwkJLmRldl9kaXNjb25uZWN0ID0gc25kX2hkYV9idXNfZGV2X2Rpc2Nvbm5lY3QsCiAJCS5kZXZfZnJlZSA9IHNuZF9oZGFfYnVzX2Rldl9mcmVlLAogCX07CiAKQEAgLTg5Niw3ICs4NzksNyBAQAogCiAJYnVzID0ga3phbGxvYyhzaXplb2YoKmJ1cyksIEdGUF9LRVJORUwpOwogCWlmIChidXMgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBzdHJ1Y3QgaGRhX2J1c1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgc3RydWN0IGhkYV9idXNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTkxNSw3ICs4OTgsNyBAQAogCQkgImhkLWF1ZGlvJWQiLCBjYXJkLT5udW1iZXIpOwogCWJ1cy0+d29ya3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShidXMtPndvcmtxX25hbWUpOwogCWlmICghYnVzLT53b3JrcSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIHdvcmtxdWV1ZSAlc1xuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgY3JlYXRlIHdvcmtxdWV1ZSAlc1xuIiwKIAkJCSAgIGJ1cy0+d29ya3FfbmFtZSk7CiAJCWtmcmVlKGJ1cyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTU5LDcgKzk0Miw3IEBACiAJbXV0ZXhfbG9jaygmcHJlc2V0X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRibCwgJmhkYV9wcmVzZXRfdGFibGVzLCBsaXN0KSB7CiAJCWlmICghdHJ5X21vZHVsZV9nZXQodGJsLT5vd25lcikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2Fubm90IG1vZHVsZV9nZXRcbiIpOworCQkJY29kZWNfZXJyKGNvZGVjLCAiY2Fubm90IG1vZHVsZV9nZXRcbiIpOwogCQkJY29udGludWU7CiAJCX0KIAkJZm9yIChwcmVzZXQgPSB0YmwtPnByZXNldDsgcHJlc2V0LT5pZDsgcHJlc2V0KyspIHsKQEAgLTExODUsNyArMTE2OCw3IEBACiB7CiAJc3RydWN0IGhkYV9waW5jZmcgKnBpbjsKIAotI2lmZGVmIENPTkZJR19TTkRfSERBX0hXREVQCisjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKIAl7CiAJCXVuc2lnbmVkIGludCBjZmcgPSAwOwogCQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CkBAIC0xMzAwLDcgKzEyODMsNyBAQAogc3RhdGljIHZvaWQgZnJlZV9pbml0X3BpbmNmZ3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5kcml2ZXJfcGlucyk7Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfSFdERVAKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwogCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+dXNlcl9waW5zKTsKICNlbmRpZgogCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+aW5pdF9waW5zKTsKQEAgLTEzNzQsNiArMTM1Nyw3IEBACiAJaWYgKGNvZGVjLT5wYXRjaF9vcHMuZnJlZSkKIAkJY29kZWMtPnBhdGNoX29wcy5mcmVlKGNvZGVjKTsKIAloZGFfY2FsbF9wbV9ub3RpZnkoY29kZWMsIGZhbHNlKTsgLyogY2FuY2VsIGxlZnRvdmVyIHJlZmNvdW50cyAqLworCXNuZF9oZGFfc3lzZnNfY2xlYXIoY29kZWMpOwogCXVubG9hZF9wYXJzZXIoY29kZWMpOwogCW1vZHVsZV9wdXQoY29kZWMtPm93bmVyKTsKIAlmcmVlX2hkYV9jYWNoZSgmY29kZWMtPmFtcF9jYWNoZSk7CkBAIC0xMzgzLDcgKzEzNjcsNyBAQAogCWtmcmVlKGNvZGVjLT5tb2RlbG5hbWUpOwogCWtmcmVlKGNvZGVjLT53Y2Fwcyk7CiAJY29kZWMtPmJ1cy0+bnVtX2NvZGVjcy0tOwotCWtmcmVlKGNvZGVjKTsKKwlwdXRfZGV2aWNlKCZjb2RlYy0+ZGV2KTsKIH0KIAogc3RhdGljIGJvb2wgc25kX2hkYV9jb2RlY19nZXRfc3VwcG9ydGVkX3BzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMTM5Miw2ICsxMzc2LDM4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGhkYV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKTsKIAorc3RhdGljIGludCBzbmRfaGRhX2NvZGVjX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlpbnQgZXJyID0gZGV2aWNlX2FkZCgmY29kZWMtPmRldik7CisKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzbmRfaGRhX3JlZ2lzdGVyX2JlZXBfZGV2aWNlKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRhX2NvZGVjX2Rldl9kaXNjb25uZWN0KHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCisJc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoY29kZWMpOworCWRldmljZV9kZWwoJmNvZGVjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZGFfY29kZWNfZGV2X2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKK3sKKwlzbmRfaGRhX2NvZGVjX2ZyZWUoZGV2aWNlLT5kZXZpY2VfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGp1c3QgZnJlZSB0aGUgY29udGFpbmVyICovCitzdGF0aWMgdm9pZCBzbmRfaGRhX2NvZGVjX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlrZnJlZShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaGRhX2NvZGVjLCBkZXYpKTsKK30KKwogLyoqCiAgKiBzbmRfaGRhX2NvZGVjX25ldyAtIGNyZWF0ZSBhIEhEQSBjb2RlYwogICogQGJ1czogdGhlIGJ1cyB0byBhc3NpZ24KQEAgLTE0MDgsNiArMTQyNCwxMSBAQAogCWNoYXIgY29tcG9uZW50WzMxXTsKIAloZGFfbmlkX3QgZmc7CiAJaW50IGVycjsKKwlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIGRldl9vcHMgPSB7CisJCS5kZXZfcmVnaXN0ZXIgPSBzbmRfaGRhX2NvZGVjX2Rldl9yZWdpc3RlciwKKwkJLmRldl9kaXNjb25uZWN0ID0gc25kX2hkYV9jb2RlY19kZXZfZGlzY29ubmVjdCwKKwkJLmRldl9mcmVlID0gc25kX2hkYV9jb2RlY19kZXZfZnJlZSwKKwl9OwogCiAJaWYgKHNuZF9CVUdfT04oIWJ1cykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQxNSwxNyArMTQzNiwyNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChidXMtPmNhZGRyX3RibFtjb2RlY19hZGRyXSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6ICIKLQkJCSAgICJhZGRyZXNzIDB4JXggaXMgYWxyZWFkeSBvY2N1cGllZFxuIiwgY29kZWNfYWRkcik7CisJCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsCisJCQkiYWRkcmVzcyAweCV4IGlzIGFscmVhZHkgb2NjdXBpZWRcbiIsCisJCQljb2RlY19hZGRyKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAljb2RlYyA9IGt6YWxsb2Moc2l6ZW9mKCpjb2RlYyksIEdGUF9LRVJORUwpOwogCWlmIChjb2RlYyA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jYXRlIHN0cnVjdCBoZGFfY29kZWNcbiIpOworCQlkZXZfZXJyKGJ1cy0+Y2FyZC0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgc3RydWN0IGhkYV9jb2RlY1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWRldmljZV9pbml0aWFsaXplKCZjb2RlYy0+ZGV2KTsKKwljb2RlYy0+ZGV2LnBhcmVudCA9ICZidXMtPmNhcmQtPmNhcmRfZGV2OworCWNvZGVjLT5kZXYuY2xhc3MgPSBzb3VuZF9jbGFzczsKKwljb2RlYy0+ZGV2LnJlbGVhc2UgPSBzbmRfaGRhX2NvZGVjX2Rldl9yZWxlYXNlOworCWNvZGVjLT5kZXYuZ3JvdXBzID0gc25kX2hkYV9kZXZfYXR0cl9ncm91cHM7CisJZGV2X3NldF9uYW1lKCZjb2RlYy0+ZGV2LCAiaGRhdWRpb0MlZEQlZCIsIGJ1cy0+Y2FyZC0+bnVtYmVyLAorCQkgICAgIGNvZGVjX2FkZHIpOworCWRldl9zZXRfZHJ2ZGF0YSgmY29kZWMtPmRldiwgY29kZWMpOyAvKiBmb3Igc3lzZnMgKi8KKwogCWNvZGVjLT5idXMgPSBidXM7CiAJY29kZWMtPmFkZHIgPSBjb2RlY19hZGRyOwogCW11dGV4X2luaXQoJmNvZGVjLT5zcGRpZl9tdXRleCk7CkBAIC0xNDU2LDExICsxNDg3LDEzIEBACiAJaGRhX2tlZXBfcG93ZXJfb24oY29kZWMpOwogI2VuZGlmCiAKKwlzbmRfaGRhX3N5c2ZzX2luaXQoY29kZWMpOworCiAJaWYgKGNvZGVjLT5idXMtPm1vZGVsbmFtZSkgewogCQljb2RlYy0+bW9kZWxuYW1lID0ga3N0cmR1cChjb2RlYy0+YnVzLT5tb2RlbG5hbWUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWNvZGVjLT5tb2RlbG5hbWUpIHsKLQkJCXNuZF9oZGFfY29kZWNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIGVycm9yOwogCQl9CiAJfQogCkBAIC0xNDg0LDcgKzE1MTcsNyBAQAogCiAJc2V0dXBfZmdfbm9kZXMoY29kZWMpOwogCWlmICghY29kZWMtPmFmZyAmJiAhY29kZWMtPm1mZykgewotCQlzbmRfcHJpbnRkZCgiaGRhX2NvZGVjOiBubyBBRkcgb3IgTUZHIG5vZGUgZm91bmRcbiIpOworCQlkZXZfZXJyKGJ1cy0+Y2FyZC0+ZGV2LCAibm8gQUZHIG9yIE1GRyBub2RlIGZvdW5kXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNDkyLDcgKzE1MjUsNyBAQAogCWZnID0gY29kZWMtPmFmZyA/IGNvZGVjLT5hZmcgOiBjb2RlYy0+bWZnOwogCWVyciA9IHJlYWRfd2lkZ2V0X2NhcHMoY29kZWMsIGZnKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IGNhbm5vdCBtYWxsb2NcbiIpOworCQlkZXZfZXJyKGJ1cy0+Y2FyZC0+ZGV2LCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWVyciA9IHJlYWRfcGluX2RlZmF1bHRzKGNvZGVjKTsKQEAgLTE1MjgsNiArMTU2MSwxMCBAQAogCQljb2RlYy0+c3Vic3lzdGVtX2lkLCBjb2RlYy0+cmV2aXNpb25faWQpOwogCXNuZF9jb21wb25lbnRfYWRkKGNvZGVjLT5idXMtPmNhcmQsIGNvbXBvbmVudCk7CiAKKwllcnIgPSBzbmRfZGV2aWNlX25ldyhidXMtPmNhcmQsIFNORFJWX0RFVl9DT0RFQywgY29kZWMsICZkZXZfb3BzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwogCWlmIChjb2RlY3ApCiAJCSpjb2RlY3AgPSBjb2RlYzsKIAlyZXR1cm4gMDsKQEAgLTE1NTAsNyArMTU4Nyw3IEBACiAJZmcgPSBjb2RlYy0+YWZnID8gY29kZWMtPmFmZyA6IGNvZGVjLT5tZmc7CiAJZXJyID0gcmVhZF93aWRnZXRfY2Fwcyhjb2RlYywgZmcpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2Fubm90IG1hbGxvY1xuIik7CisJCWNvZGVjX2Vycihjb2RlYywgImNhbm5vdCBtYWxsb2NcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTYyNyw3ICsxNjY0LDcgQEAKICNlbmRpZgogCQl9CiAJCWlmICghcGF0Y2gpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGRhLWNvZGVjOiBObyBjb2RlYyBwYXJzZXIgaXMgYXZhaWxhYmxlXG4iKTsKKwkJCWNvZGVjX2Vycihjb2RlYywgIk5vIGNvZGVjIHBhcnNlciBpcyBhdmFpbGFibGVcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xNzExLDkgKzE3NDgsOSBAQAogCWlmICghbmlkKQogCQlyZXR1cm47CiAKLQlzbmRfcHJpbnRkZCgiaGRhX2NvZGVjX3NldHVwX3N0cmVhbTogIgotCQkgICAgIk5JRD0weCV4LCBzdHJlYW09MHgleCwgY2hhbm5lbD0lZCwgZm9ybWF0PTB4JXhcbiIsCi0JCSAgICBuaWQsIHN0cmVhbV90YWcsIGNoYW5uZWxfaWQsIGZvcm1hdCk7CisJY29kZWNfZGJnKGNvZGVjLAorCQkgICJoZGFfY29kZWNfc2V0dXBfc3RyZWFtOiBOSUQ9MHgleCwgc3RyZWFtPTB4JXgsIGNoYW5uZWw9JWQsIGZvcm1hdD0weCV4XG4iLAorCQkgIG5pZCwgc3RyZWFtX3RhZywgY2hhbm5lbF9pZCwgZm9ybWF0KTsKIAlwID0gZ2V0X2hkYV9jdnRfc2V0dXAoY29kZWMsIG5pZCk7CiAJaWYgKCFwKQogCQlyZXR1cm47CkBAIC0xNzYwLDcgKzE3OTcsNyBAQAogCWlmIChjb2RlYy0+bm9fc3RpY2t5X3N0cmVhbSkKIAkJZG9fbm93ID0gMTsKIAotCXNuZF9wcmludGRkKCJoZGFfY29kZWNfY2xlYW51cF9zdHJlYW06IE5JRD0weCV4XG4iLCBuaWQpOworCWNvZGVjX2RiZyhjb2RlYywgImhkYV9jb2RlY19jbGVhbnVwX3N0cmVhbTogTklEPTB4JXhcbiIsIG5pZCk7CiAJcCA9IGdldF9oZGFfY3Z0X3NldHVwKGNvZGVjLCBuaWQpOwogCWlmIChwKSB7CiAJCS8qIGhlcmUgd2UganVzdCBjbGVhciB0aGUgYWN0aXZlIGZsYWcgd2hlbiBkb19ub3cgaXNuJ3Qgc2V0OwpAQCAtMjI4Miw5ICsyMzE5LDkgQEAKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IGdldF9hbXBfbWF4X3ZhbHVlKGNvZGVjLCBuaWQsIGRpciwgb2ZzKTsKIAlpZiAoIXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6ICIKLQkJICAgICAgICJudW1fc3RlcHMgPSAwIGZvciBOSUQ9MHgleCAoY3RsID0gJXMpXG4iLCBuaWQsCi0JCSAgICAgICBrY29udHJvbC0+aWQubmFtZSk7CisJCWNvZGVjX3dhcm4oY29kZWMsCisJCQkgICAibnVtX3N0ZXBzID0gMCBmb3IgTklEPTB4JXggKGN0bCA9ICVzKVxuIiwKKwkJCSAgIG5pZCwga2NvbnRyb2wtPmlkLm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yNTU4LDggKzI1OTUsOCBAQAogCQlpdGVtLT5uaWQgPSBuaWQ7CiAJCXJldHVybiAwOwogCX0KLQlwcmludGsoS0VSTl9FUlIgImhkYS1jb2RlYzogbm8gTklEIGZvciBtYXBwaW5nIGNvbnRyb2wgJXM6JWQ6JWRcbiIsCi0JICAgICAgIGtjdGwtPmlkLm5hbWUsIGtjdGwtPmlkLmluZGV4LCBpbmRleCk7CisJY29kZWNfZXJyKGNvZGVjLCAibm8gTklEIGZvciBtYXBwaW5nIGNvbnRyb2wgJXM6JWQ6JWRcbiIsCisJCSAga2N0bC0+aWQubmFtZSwga2N0bC0+aWQuaW5kZXgsIGluZGV4KTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfYWRkX25pZCk7CkBAIC0yNjYwLDYgKzI2OTcsNyBAQAogCQkJCSAgYnVzLT5wY21fZGV2X2JpdHMpOwogCQl9CiAJfQorCXNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKGNvZGVjKTsKIAlpZiAoY29kZWMtPnBhdGNoX29wcy5mcmVlKQogCQljb2RlYy0+cGF0Y2hfb3BzLmZyZWUoY29kZWMpOwogCW1lbXNldCgmY29kZWMtPnBhdGNoX29wcywgMCwgc2l6ZW9mKGNvZGVjLT5wYXRjaF9vcHMpKTsKQEAgLTI3NTEsNyArMjc4OSw3IEBACiAJCQlyZXR1cm4gLTE7CiAJCWlmICgqc3RlcF90b19jaGVjayAmJiAqc3RlcF90b19jaGVjayAhPSBzdGVwKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IE1pc21hdGNoaW5nIGRCIHN0ZXAgZm9yIHZtYXN0ZXIgc2xhdmUgKCVkIT0lZClcbiIsCi0JCQkJICAgKnN0ZXBfdG9fY2hlY2ssIHN0ZXApOworLQkJCQkgICAqc3RlcF90b19jaGVjaywgc3RlcCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJKnN0ZXBfdG9fY2hlY2sgPSBzdGVwOwpAQCAtMjgyMSw3ICsyODU5LDcgQEAKIAogCWVyciA9IG1hcF9zbGF2ZXMoY29kZWMsIHNsYXZlcywgc3VmZml4LCBjaGVja19zbGF2ZV9wcmVzZW50LCBOVUxMKTsKIAlpZiAoZXJyICE9IDEpIHsKLQkJc25kX3ByaW50ZGQoIk5vIHNsYXZlIGZvdW5kIGZvciAlc1xuIiwgbmFtZSk7CisJCWNvZGVjX2RiZyhjb2RlYywgIk5vIHNsYXZlIGZvdW5kIGZvciAlc1xuIiwgbmFtZSk7CiAJCXJldHVybiAwOwogCX0KIAlrY3RsID0gc25kX2N0bF9tYWtlX3ZpcnR1YWxfbWFzdGVyKG5hbWUsIHRsdik7CkBAIC0zNDg3LDcgKzM1MjUsNyBAQAogCiAJaWR4ID0gZmluZF9lbXB0eV9taXhlcl9jdGxfaWR4KGNvZGVjLCAiSUVDOTU4IFBsYXliYWNrIFN3aXRjaCIsIGlkeCk7CiAJaWYgKGlkeCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IHRvbyBtYW55IElFQzk1OCBvdXRwdXRzXG4iKTsKKwkJY29kZWNfZXJyKGNvZGVjLCAidG9vIG1hbnkgSUVDOTU4IG91dHB1dHNcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlzcGRpZiA9IHNuZF9hcnJheV9uZXcoJmNvZGVjLT5zcGRpZl9vdXQpOwpAQCAtMzY5MSw3ICszNzI5LDcgQEAKIAogCWlkeCA9IGZpbmRfZW1wdHlfbWl4ZXJfY3RsX2lkeChjb2RlYywgIklFQzk1OCBDYXB0dXJlIFN3aXRjaCIsIDApOwogCWlmIChpZHggPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiB0b28gbWFueSBJRUM5NTggaW5wdXRzXG4iKTsKKwkJY29kZWNfZXJyKGNvZGVjLCAidG9vIG1hbnkgSUVDOTU4IGlucHV0c1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWZvciAoZGlnX21peCA9IGRpZ19pbl9jdGxzOyBkaWdfbWl4LT5uYW1lOyBkaWdfbWl4KyspIHsKQEAgLTQwMTAsNyArNDA0OCw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1NORF9IREFfSFdERVAKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRwogLyogZXhlY3V0ZSBhZGRpdGlvbmFsIGluaXQgdmVyYnMgKi8KIHN0YXRpYyB2b2lkIGhkYV9leGVjX2luaXRfdmVyYnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CkBAIC00MTE4LDEyICs0MTU2LDEzIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewogCQlpbnQgZXJyID0gc25kX2hkYV9jb2RlY19idWlsZF9jb250cm9scyhjb2RlYyk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2Fubm90IGJ1aWxkIGNvbnRyb2xzICIKLQkJCSAgICAgICAiZm9yICMlZCAoZXJyb3IgJWQpXG4iLCBjb2RlYy0+YWRkciwgZXJyKTsKKwkJCWNvZGVjX2Vycihjb2RlYywKKwkJCQkgICJjYW5ub3QgYnVpbGQgY29udHJvbHMgZm9yICMlZCAoZXJyb3IgJWQpXG4iLAorCQkJCSAgY29kZWMtPmFkZHIsIGVycik7CiAJCQllcnIgPSBzbmRfaGRhX2NvZGVjX3Jlc2V0KGNvZGVjKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJoZGFfY29kZWM6IGNhbm5vdCByZXZlcnQgY29kZWNcbiIpOworCQkJCWNvZGVjX2Vycihjb2RlYywKKwkJCQkJICAiY2Fubm90IHJldmVydCBjb2RlY1xuIik7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQpAQCAtNDI5NCw3ICs0MzMzLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc25kX3ByaW50ZGQoImludmFsaWQgZm9ybWF0IHdpZHRoICVkXG4iLAotCQkJICAgIHNuZF9wY21fZm9ybWF0X3dpZHRoKGZvcm1hdCkpOworCQkJICBzbmRfcGNtX2Zvcm1hdF93aWR0aChmb3JtYXQpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00MzcwLDEwICs0NDA5LDEwIEBACiAJCQkJcmF0ZXMgfD0gcmF0ZV9iaXRzW2ldLmFsc2FfYml0czsKIAkJfQogCQlpZiAocmF0ZXMgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiByYXRlcyA9PSAwICIKLQkJCQkgICAiKG5pZD0weCV4LCB2YWw9MHgleCwgb3ZyZD0laSlcbiIsCi0JCQkJCW5pZCwgdmFsLAotCQkJCQkod2NhcHMgJiBBQ19XQ0FQX0ZPUk1BVF9PVlJEKSA/IDEgOiAwKTsKKwkJCWNvZGVjX2Vycihjb2RlYywKKwkJCQkgICJyYXRlcyA9PSAwIChuaWQ9MHgleCwgdmFsPTB4JXgsIG92cmQ9JWkpXG4iLAorCQkJCSAgbmlkLCB2YWwsCisJCQkJICAod2NhcHMgJiBBQ19XQ0FQX0ZPUk1BVF9PVlJEKSA/IDEgOiAwKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCSpyYXRlc3AgPSByYXRlczsKQEAgLTQ0MzMsMTIgKzQ0NzIsMTEgQEAKIAkJCWJwcyA9IDg7CiAJCX0KIAkJaWYgKGZvcm1hdHMgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBmb3JtYXRzID09IDAgIgotCQkJCSAgICIobmlkPTB4JXgsIHZhbD0weCV4LCBvdnJkPSVpLCAiCi0JCQkJICAgInN0cmVhbXM9MHgleClcbiIsCi0JCQkJCW5pZCwgdmFsLAotCQkJCQkod2NhcHMgJiBBQ19XQ0FQX0ZPUk1BVF9PVlJEKSA/IDEgOiAwLAotCQkJCQlzdHJlYW1zKTsKKwkJCWNvZGVjX2Vycihjb2RlYywKKwkJCQkgICJmb3JtYXRzID09IDAgKG5pZD0weCV4LCB2YWw9MHgleCwgb3ZyZD0laSwgc3RyZWFtcz0weCV4KVxuIiwKKwkJCQkgIG5pZCwgdmFsLAorCQkJCSAgKHdjYXBzICYgQUNfV0NBUF9GT1JNQVRfT1ZSRCkgPyAxIDogMCwKKwkJCQkgIHN0cmVhbXMpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJaWYgKGZvcm1hdHNwKQpAQCAtNDYyOSw3ICs0NjY3LDcgQEAKIAlpbnQgaTsKIAogCWlmICh0eXBlID49IEhEQV9QQ01fTlRZUEVTKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIFBDTSB0eXBlICVkXG4iLCB0eXBlKTsKKwkJZGV2X2VycihidXMtPmNhcmQtPmRldiwgIkludmFsaWQgUENNIHR5cGUgJWRcbiIsIHR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ2NTAsMTAgKzQ2ODgsMTEgQEAKIAl9CiAjZW5kaWYKIAotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJUb28gbWFueSAlcyBkZXZpY2VzXG4iLAorCWRldl93YXJuKGJ1cy0+Y2FyZC0+ZGV2LCAiVG9vIG1hbnkgJXMgZGV2aWNlc1xuIiwKIAkJc25kX2hkYV9wY21fdHlwZV9uYW1lW3R5cGVdKTsKICNpZm5kZWYgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUwotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJDb25zaWRlciBidWlsZGluZyB0aGUga2VybmVsIHdpdGggQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15XG4iKTsKKwlkZXZfd2FybihidXMtPmNhcmQtPmRldiwKKwkJICJDb25zaWRlciBidWlsZGluZyB0aGUga2VybmVsIHdpdGggQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15XG4iKTsKICNlbmRpZgogCXJldHVybiAtRUFHQUlOOwogfQpAQCAtNDY5MSwxMiArNDczMCwxMyBAQAogCQkJcmV0dXJuIDA7CiAJCWVyciA9IGNvZGVjLT5wYXRjaF9vcHMuYnVpbGRfcGNtcyhjb2RlYyk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2Fubm90IGJ1aWxkIFBDTXMiCi0JCQkgICAgICAgImZvciAjJWQgKGVycm9yICVkKVxuIiwgY29kZWMtPmFkZHIsIGVycik7CisJCQljb2RlY19lcnIoY29kZWMsCisJCQkJICAiY2Fubm90IGJ1aWxkIFBDTXMgZm9yICMlZCAoZXJyb3IgJWQpXG4iLAorCQkJCSAgY29kZWMtPmFkZHIsIGVycik7CiAJCQllcnIgPSBzbmRfaGRhX2NvZGVjX3Jlc2V0KGNvZGVjKTsKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJoZGFfY29kZWM6IGNhbm5vdCByZXZlcnQgY29kZWNcbiIpOworCQkJCWNvZGVjX2Vycihjb2RlYywKKwkJCQkJICAiY2Fubm90IHJldmVydCBjb2RlY1xuIik7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQpAQCAtNDcxNSw5ICs0NzU1LDkgQEAKIAkJCWNwY20tPmRldmljZSA9IGRldjsKIAkJCWVyciA9IHNuZF9oZGFfYXR0YWNoX3BjbShjb2RlYywgY3BjbSk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW5ub3QgYXR0YWNoICIKLQkJCQkgICAgICAgIlBDTSBzdHJlYW0gJWQgZm9yIGNvZGVjICMlZFxuIiwKLQkJCQkgICAgICAgZGV2LCBjb2RlYy0+YWRkcik7CisJCQkJY29kZWNfZXJyKGNvZGVjLAorCQkJCQkgICJjYW5ub3QgYXR0YWNoIFBDTSBzdHJlYW0gJWQgZm9yIGNvZGVjICMlZFxuIiwKKwkJCQkJICBkZXYsIGNvZGVjLT5hZGRyKTsKIAkJCQljb250aW51ZTsgLyogbm8gZmF0YWwgZXJyb3IgKi8KIAkJCX0KIAkJfQpAQCAtNDc4Niw4ICs0ODI2LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IG51bV9jb25maWdzOyBpKyspIHsKIAkJCWlmIChtb2RlbHNbaV0gJiYKIAkJCSAgICAhc3RyY21wKGNvZGVjLT5tb2RlbG5hbWUsIG1vZGVsc1tpXSkpIHsKLQkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzICIKLQkJCQkJICAgInNlbGVjdGVkXG4iLCBtb2RlbHNbaV0pOworCQkJCWNvZGVjX2luZm8oY29kZWMsICJtb2RlbCAnJXMnIGlzIHNlbGVjdGVkXG4iLAorCQkJCQkgICBtb2RlbHNbaV0pOwogCQkJCXJldHVybiBpOwogCQkJfQogCQl9CkBAIC00ODA5LDEwICs0ODQ5LDkgQEAKIAkJCXNwcmludGYodG1wLCAiIyVkIiwgdGJsLT52YWx1ZSk7CiAJCQltb2RlbCA9IHRtcDsKIAkJfQotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogbW9kZWwgJyVzJyBpcyBzZWxlY3RlZCAiCi0JCQkgICAgImZvciBjb25maWcgJXg6JXggKCVzKVxuIiwKLQkJCSAgICBtb2RlbCwgdGJsLT5zdWJ2ZW5kb3IsIHRibC0+c3ViZGV2aWNlLAotCQkJICAgICh0YmwtPm5hbWUgPyB0YmwtPm5hbWUgOiAiVW5rbm93biBkZXZpY2UiKSk7CisJCWNvZGVjX2luZm8oY29kZWMsICJtb2RlbCAnJXMnIGlzIHNlbGVjdGVkIGZvciBjb25maWcgJXg6JXggKCVzKVxuIiwKKwkJCSAgIG1vZGVsLCB0YmwtPnN1YnZlbmRvciwgdGJsLT5zdWJkZXZpY2UsCisJCQkgICAodGJsLT5uYW1lID8gdGJsLT5uYW1lIDogIlVua25vd24gZGV2aWNlIikpOwogI2VuZGlmCiAJCXJldHVybiB0YmwtPnZhbHVlOwogCX0KQEAgLTQ4NzAsMTAgKzQ5MDksOSBAQAogCQkJc3ByaW50Zih0bXAsICIjJWQiLCB0YmwtPnZhbHVlKTsKIAkJCW1vZGVsID0gdG1wOwogCQl9Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzIHNlbGVjdGVkICIKLQkJCSAgICAiZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAotCQkJICAgIG1vZGVsLCB0YmwtPnN1YnZlbmRvciwgdGJsLT5zdWJkZXZpY2UsCi0JCQkgICAgKHRibC0+bmFtZSA/IHRibC0+bmFtZSA6ICJVbmtub3duIGRldmljZSIpKTsKKwkJY29kZWNfaW5mbyhjb2RlYywgIm1vZGVsICclcycgaXMgc2VsZWN0ZWQgZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAorCQkJICAgbW9kZWwsIHRibC0+c3VidmVuZG9yLCB0YmwtPnN1YmRldmljZSwKKwkJCSAgICh0YmwtPm5hbWUgPyB0YmwtPm5hbWUgOiAiVW5rbm93biBkZXZpY2UiKSk7CiAjZW5kaWYKIAkJcmV0dXJuIHRibC0+dmFsdWU7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKaW5kZXggYWIyYTQ0NC4uYTQyMzMxMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCkBAIC0yNzEsNiArMjcxLDcgQEAKIAogLyogY29kZWMgaW5mb3JtYXRpb24gKi8KIHN0cnVjdCBoZGFfY29kZWMgeworCXN0cnVjdCBkZXZpY2UgZGV2OwogCXN0cnVjdCBoZGFfYnVzICpidXM7CiAJdW5zaWduZWQgaW50IGFkZHI7CS8qIGNvZGVjIGFkZHIqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbGlzdCBwb2ludCAqLwpAQCAtMzMyLDE0ICszMzMsMTcgQEAKIAlzdHJ1Y3Qgc25kX2FycmF5IGRyaXZlcl9waW5zOwkvKiBwaW4gY29uZmlncyBzZXQgYnkgY29kZWMgcGFyc2VyICovCiAJc3RydWN0IHNuZF9hcnJheSBjdnRfc2V0dXBzOwkvKiBhdWRpbyBjb252ZXJ0IHNldHVwcyAqLwogCi0jaWZkZWYgQ09ORklHX1NORF9IREFfSFdERVAKIAlzdHJ1Y3QgbXV0ZXggdXNlcl9tdXRleDsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcDsJLyogYXNzaWduZWQgaHdkZXAgZGV2aWNlICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKIAlzdHJ1Y3Qgc25kX2FycmF5IGluaXRfdmVyYnM7CS8qIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyAqLwogCXN0cnVjdCBzbmRfYXJyYXkgaGludHM7CQkvKiBhZGRpdGlvbmFsIGhpbnRzICovCiAJc3RydWN0IHNuZF9hcnJheSB1c2VyX3BpbnM7CS8qIGRlZmF1bHQgcGluIGNvbmZpZ3MgdG8gb3ZlcnJpZGUgKi8KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NORF9IREFfSFdERVAKKwlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcDsJLyogYXNzaWduZWQgaHdkZXAgZGV2aWNlICovCisjZW5kaWYKKwogCS8qIG1pc2MgZmxhZ3MgKi8KIAl1bnNpZ25lZCBpbnQgc3BkaWZfc3RhdHVzX3Jlc2V0IDoxOyAvKiBuZWVkcyB0byB0b2dnbGUgU1BESUYgZm9yIGVhY2gKIAkJCQkJICAgICAqIHN0YXR1cyBjaGFuZ2UKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzk5M2UxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jCkBAIC0wLDAgKzEsMjAzMSBAQAorLyoKKyAqCisgKiAgSW1wbGVtZW50YXRpb24gb2YgcHJpbWFyeSBhbHNhIGRyaXZlciBjb2RlIGJhc2UgZm9yIEludGVsIEhEIEF1ZGlvLgorICoKKyAqICBDb3B5cmlnaHQoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICAgUGVpU2VuIEhvdSA8cHNob3VAcmVhbHRlay5jb20udHc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlICJoZGFfcHJpdi5oIgorI2luY2x1ZGUgImhkYV9jb250cm9sbGVyLmgiCisKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgImhkYV9pbnRlbF90cmFjZS5oIgorCisvKiBEU1AgbG9jayBoZWxwZXJzICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgorI2RlZmluZSBkc3BfbG9ja19pbml0KGRldikJbXV0ZXhfaW5pdCgmKGRldiktPmRzcF9tdXRleCkKKyNkZWZpbmUgZHNwX2xvY2soZGV2KQkJbXV0ZXhfbG9jaygmKGRldiktPmRzcF9tdXRleCkKKyNkZWZpbmUgZHNwX3VubG9jayhkZXYpCQltdXRleF91bmxvY2soJihkZXYpLT5kc3BfbXV0ZXgpCisjZGVmaW5lIGRzcF9pc19sb2NrZWQoZGV2KQkoKGRldiktPmxvY2tlZCkKKyNlbHNlCisjZGVmaW5lIGRzcF9sb2NrX2luaXQoZGV2KQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZHNwX2xvY2soZGV2KQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRzcF91bmxvY2soZGV2KQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRzcF9pc19sb2NrZWQoZGV2KQkwCisjZW5kaWYKKworLyoKKyAqIEFaWCBzdHJlYW0gb3BlcmF0aW9ucy4KKyAqLworCisvKiBzdGFydCBhIHN0cmVhbSAqLworc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9zdGFydChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwkvKgorCSAqIEJlZm9yZSBzdHJlYW0gc3RhcnQsIGluaXRpYWxpemUgcGFyYW1ldGVyCisJICovCisJYXp4X2Rldi0+aW5zdWZmaWNpZW50ID0gMTsKKworCS8qIGVuYWJsZSBTSUUgKi8KKwlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwKKwkJICAgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgfCAoMSA8PCBhenhfZGV2LT5pbmRleCkpOworCS8qIHNldCBETUEgc3RhcnQgYW5kIGludGVycnVwdCBtYXNrICovCisJYXp4X3NkX3dyaXRlYihjaGlwLCBhenhfZGV2LCBTRF9DVEwsCisJCSAgICAgIGF6eF9zZF9yZWFkYihjaGlwLCBhenhfZGV2LCBTRF9DVEwpIHwKKwkJICAgICAgU0RfQ1RMX0RNQV9TVEFSVCB8IFNEX0lOVF9NQVNLKTsKK30KKworLyogc3RvcCBETUEgKi8KK3N0YXRpYyB2b2lkIGF6eF9zdHJlYW1fY2xlYXIoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCit7CisJYXp4X3NkX3dyaXRlYihjaGlwLCBhenhfZGV2LCBTRF9DVEwsCisJCSAgICAgIGF6eF9zZF9yZWFkYihjaGlwLCBhenhfZGV2LCBTRF9DVEwpICYKKwkJICAgICAgfihTRF9DVExfRE1BX1NUQVJUIHwgU0RfSU5UX01BU0spKTsKKwlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOyAvKiB0byBiZSBzdXJlICovCit9CisKKy8qIHN0b3AgYSBzdHJlYW0gKi8KK3ZvaWQgYXp4X3N0cmVhbV9zdG9wKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCWF6eF9zdHJlYW1fY2xlYXIoY2hpcCwgYXp4X2Rldik7CisJLyogZGlzYWJsZSBTSUUgKi8KKwlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwKKwkJICAgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgJiB+KDEgPDwgYXp4X2Rldi0+aW5kZXgpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9zdHJlYW1fc3RvcCk7CisKKy8qIHJlc2V0IHN0cmVhbSAqLworc3RhdGljIHZvaWQgYXp4X3N0cmVhbV9yZXNldChzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlpbnQgdGltZW91dDsKKworCWF6eF9zdHJlYW1fY2xlYXIoY2hpcCwgYXp4X2Rldik7CisKKwlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwKKwkJICAgICAgYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkgfAorCQkgICAgICBTRF9DVExfU1RSRUFNX1JFU0VUKTsKKwl1ZGVsYXkoMyk7CisJdGltZW91dCA9IDMwMDsKKwl3aGlsZSAoISgodmFsID0gYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkpICYKKwkJIFNEX0NUTF9TVFJFQU1fUkVTRVQpICYmIC0tdGltZW91dCkKKwkJOworCXZhbCAmPSB+U0RfQ1RMX1NUUkVBTV9SRVNFVDsKKwlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwgdmFsKTsKKwl1ZGVsYXkoMyk7CisKKwl0aW1lb3V0ID0gMzAwOworCS8qIHdhaXRpbmcgZm9yIGhhcmR3YXJlIHRvIHJlcG9ydCB0aGF0IHRoZSBzdHJlYW0gaXMgb3V0IG9mIHJlc2V0ICovCisJd2hpbGUgKCgodmFsID0gYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkpICYKKwkJU0RfQ1RMX1NUUkVBTV9SRVNFVCkgJiYgLS10aW1lb3V0KQorCQk7CisKKwkvKiByZXNldCBmaXJzdCBwb3NpdGlvbiAtIG1heSBub3QgYmUgc3luY2VkIHdpdGggaHcgYXQgdGhpcyB0aW1lICovCisJKmF6eF9kZXYtPnBvc2J1ZiA9IDA7Cit9CisKKy8qCisgKiBzZXQgdXAgdGhlIFNEIGZvciBzdHJlYW1pbmcKKyAqLworc3RhdGljIGludCBhenhfc2V0dXBfY29udHJvbGxlcihzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCS8qIG1ha2Ugc3VyZSB0aGUgcnVuIGJpdCBpcyB6ZXJvIGZvciBTRCAqLworCWF6eF9zdHJlYW1fY2xlYXIoY2hpcCwgYXp4X2Rldik7CisJLyogcHJvZ3JhbSB0aGUgc3RyZWFtX3RhZyAqLworCXZhbCA9IGF6eF9zZF9yZWFkbChjaGlwLCBhenhfZGV2LCBTRF9DVEwpOworCXZhbCA9ICh2YWwgJiB+U0RfQ1RMX1NUUkVBTV9UQUdfTUFTSykgfAorCQkoYXp4X2Rldi0+c3RyZWFtX3RhZyA8PCBTRF9DVExfU1RSRUFNX1RBR19TSElGVCk7CisJaWYgKCFhenhfc25vb3AoY2hpcCkpCisJCXZhbCB8PSBTRF9DVExfVFJBRkZJQ19QUklPOworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLCB2YWwpOworCisJLyogcHJvZ3JhbSB0aGUgbGVuZ3RoIG9mIHNhbXBsZXMgaW4gY3ljbGljIGJ1ZmZlciAqLworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQ0JMLCBhenhfZGV2LT5idWZzaXplKTsKKworCS8qIHByb2dyYW0gdGhlIHN0cmVhbSBmb3JtYXQgKi8KKwkvKiB0aGlzIHZhbHVlIG5lZWRzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcHJvZ3JhbW1lZCAqLworCWF6eF9zZF93cml0ZXcoY2hpcCwgYXp4X2RldiwgU0RfRk9STUFULCBhenhfZGV2LT5mb3JtYXRfdmFsKTsKKworCS8qIHByb2dyYW0gdGhlIHN0cmVhbSBMVkkgKGxhc3QgdmFsaWQgaW5kZXgpIG9mIHRoZSBCREwgKi8KKwlhenhfc2Rfd3JpdGV3KGNoaXAsIGF6eF9kZXYsIFNEX0xWSSwgYXp4X2Rldi0+ZnJhZ3MgLSAxKTsKKworCS8qIHByb2dyYW0gdGhlIEJETCBhZGRyZXNzICovCisJLyogbG93ZXIgQkRMIGFkZHJlc3MgKi8KKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBMLCAodTMyKWF6eF9kZXYtPmJkbC5hZGRyKTsKKwkvKiB1cHBlciBCREwgYWRkcmVzcyAqLworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUFUsCisJCSAgICAgIHVwcGVyXzMyX2JpdHMoYXp4X2Rldi0+YmRsLmFkZHIpKTsKKworCS8qIGVuYWJsZSB0aGUgcG9zaXRpb24gYnVmZmVyICovCisJaWYgKGNoaXAtPnBvc2l0aW9uX2ZpeFswXSAhPSBQT1NfRklYX0xQSUIgfHwKKwkgICAgY2hpcC0+cG9zaXRpb25fZml4WzFdICE9IFBPU19GSVhfTFBJQikgeworCQlpZiAoIShhenhfcmVhZGwoY2hpcCwgRFBMQkFTRSkgJiBJQ0g2X0RQTEJBU0VfRU5BQkxFKSkKKwkJCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwKKwkJCQkodTMyKWNoaXAtPnBvc2J1Zi5hZGRyIHwgSUNINl9EUExCQVNFX0VOQUJMRSk7CisJfQorCisJLyogc2V0IHRoZSBpbnRlcnJ1cHQgZW5hYmxlIGJpdHMgaW4gdGhlIGRlc2NyaXB0b3IgY29udHJvbCByZWdpc3RlciAqLworCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLAorCQkgICAgICBhenhfc2RfcmVhZGwoY2hpcCwgYXp4X2RldiwgU0RfQ1RMKSB8IFNEX0lOVF9NQVNLKTsKKworCXJldHVybiAwOworfQorCisvKiBhc3NpZ24gYSBzdHJlYW0gZm9yIHRoZSBQQ00gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF6eF9kZXYgKgorYXp4X2Fzc2lnbl9kZXZpY2Uoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IGRldiwgaSwgbnVtczsKKwlzdHJ1Y3QgYXp4X2RldiAqcmVzID0gTlVMTDsKKwkvKiBtYWtlIGEgbm9uLXplcm8gdW5pcXVlIGtleSBmb3IgdGhlIHN1YnN0cmVhbSAqLworCWludCBrZXkgPSAoc3Vic3RyZWFtLT5wY20tPmRldmljZSA8PCAxNikgfCAoc3Vic3RyZWFtLT5udW1iZXIgPDwgMikgfAorCQkoc3Vic3RyZWFtLT5zdHJlYW0gKyAxKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWRldiA9IGNoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldDsKKwkJbnVtcyA9IGNoaXAtPnBsYXliYWNrX3N0cmVhbXM7CisJfSBlbHNlIHsKKwkJZGV2ID0gY2hpcC0+Y2FwdHVyZV9pbmRleF9vZmZzZXQ7CisJCW51bXMgPSBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyssIGRldisrKSB7CisJCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbZGV2XTsKKwkJZHNwX2xvY2soYXp4X2Rldik7CisJCWlmICghYXp4X2Rldi0+b3BlbmVkICYmICFkc3BfaXNfbG9ja2VkKGF6eF9kZXYpKSB7CisJCQlyZXMgPSBhenhfZGV2OworCQkJaWYgKHJlcy0+YXNzaWduZWRfa2V5ID09IGtleSkgeworCQkJCXJlcy0+b3BlbmVkID0gMTsKKwkJCQlyZXMtPmFzc2lnbmVkX2tleSA9IGtleTsKKwkJCQlkc3BfdW5sb2NrKGF6eF9kZXYpOworCQkJCXJldHVybiBhenhfZGV2OworCQkJfQorCQl9CisJCWRzcF91bmxvY2soYXp4X2Rldik7CisJfQorCWlmIChyZXMpIHsKKwkJZHNwX2xvY2socmVzKTsKKwkJcmVzLT5vcGVuZWQgPSAxOworCQlyZXMtPmFzc2lnbmVkX2tleSA9IGtleTsKKwkJZHNwX3VubG9jayhyZXMpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiByZWxlYXNlIHRoZSBhc3NpZ25lZCBzdHJlYW0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhenhfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCit7CisJYXp4X2Rldi0+b3BlbmVkID0gMDsKK30KKworc3RhdGljIGN5Y2xlX3QgYXp4X2NjX3JlYWQoY29uc3Qgc3RydWN0IGN5Y2xlY291bnRlciAqY2MpCit7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBjb250YWluZXJfb2YoY2MsIHN0cnVjdCBhenhfZGV2LCBhenhfY2MpOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gYXp4X2Rldi0+c3Vic3RyZWFtOworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCisJcmV0dXJuIGF6eF9yZWFkbChjaGlwLCBXQUxMQ0xLKTsKK30KKworc3RhdGljIHZvaWQgYXp4X3RpbWVjb3VudGVyX2luaXQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJYm9vbCBmb3JjZSwgY3ljbGVfdCBsYXN0KQoreworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgdGltZWNvdW50ZXIgKnRjID0gJmF6eF9kZXYtPmF6eF90YzsKKwlzdHJ1Y3QgY3ljbGVjb3VudGVyICpjYyA9ICZhenhfZGV2LT5henhfY2M7CisJdTY0IG5zZWM7CisKKwljYy0+cmVhZCA9IGF6eF9jY19yZWFkOworCWNjLT5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMik7CisKKwkvKgorCSAqIENvbnZlcnRpbmcgZnJvbSAyNCBNSHogdG8gbnMgbWVhbnMgYXBwbHlpbmcgYSAxMjUvMyBmYWN0b3IuCisJICogVG8gYXZvaWQgYW55IHNhdHVyYXRpb24gaXNzdWVzIGluIGludGVybWVkaWF0ZSBvcGVyYXRpb25zLAorCSAqIHRoZSAxMjUgZmFjdG9yIGlzIGFwcGxpZWQgZmlyc3QuIFRoZSBkaXZpc2lvbiBpcyBhcHBsaWVkCisJICogbGFzdCBhZnRlciByZWFkaW5nIHRoZSB0aW1lY291bnRlciB2YWx1ZS4KKwkgKiBBcHBseWluZyB0aGUgMS8zIGZhY3RvciBhcyBwYXJ0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbgorCSAqIHJlcXVpcmVzIGF0IGxlYXN0IDIwIGJpdHMgZm9yIGEgZGVjZW50IHByZWNpc2lvbiwgaG93ZXZlcgorCSAqIG92ZXJmbG93cyBvY2N1ciBhZnRlciBhYm91dCA0IGhvdXJzIG9yIGxlc3MsIG5vdCBhIG9wdGlvbi4KKwkgKi8KKworCWNjLT5tdWx0ID0gMTI1OyAvKiBzYXR1cmF0aW9uIGFmdGVyIDE5NSB5ZWFycyAqLworCWNjLT5zaGlmdCA9IDA7CisKKwluc2VjID0gMDsgLyogYXVkaW8gdGltZSBpcyBlbGFwc2VkIHRpbWUgc2luY2UgdHJpZ2dlciAqLworCXRpbWVjb3VudGVyX2luaXQodGMsIGNjLCBuc2VjKTsKKwlpZiAoZm9yY2UpCisJCS8qCisJCSAqIGZvcmNlIHRpbWVjb3VudGVyIHRvIHVzZSBwcmVkZWZpbmVkIHZhbHVlLAorCQkgKiB1c2VkIGZvciBzeW5jaHJvbml6ZWQgc3RhcnRzCisJCSAqLworCQl0Yy0+Y3ljbGVfbGFzdCA9IGxhc3Q7Cit9CisKK3N0YXRpYyB1NjQgYXp4X2FkanVzdF9jb2RlY19kZWxheShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQl1NjQgbnNlYykKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXU2NCBjb2RlY19mcmFtZXMsIGNvZGVjX25zZWNzOworCisJaWYgKCFoaW5mby0+b3BzLmdldF9kZWxheSkKKwkJcmV0dXJuIG5zZWM7CisKKwljb2RlY19mcmFtZXMgPSBoaW5mby0+b3BzLmdldF9kZWxheShoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7CisJY29kZWNfbnNlY3MgPSBkaXZfdTY0KGNvZGVjX2ZyYW1lcyAqIDEwMDAwMDAwMDBMTCwKKwkJCSAgICAgIHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlyZXR1cm4gbnNlYyArIGNvZGVjX25zZWNzOworCisJcmV0dXJuIChuc2VjID4gY29kZWNfbnNlY3MpID8gbnNlYyAtIGNvZGVjX25zZWNzIDogMDsKK30KKworLyoKKyAqIHNldCB1cCBhIEJETCBlbnRyeQorICovCitzdGF0aWMgaW50IHNldHVwX2JkbGUoc3RydWN0IGF6eCAqY2hpcCwKKwkJICAgICAgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiLAorCQkgICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiwgdTMyICoqYmRscCwKKwkJICAgICAgaW50IG9mcywgaW50IHNpemUsIGludCB3aXRoX2lvYykKK3sKKwl1MzIgKmJkbCA9ICpiZGxwOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWRtYV9hZGRyX3QgYWRkcjsKKwkJaW50IGNodW5rOworCisJCWlmIChhenhfZGV2LT5mcmFncyA+PSBBWlhfTUFYX0JETF9FTlRSSUVTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJYWRkciA9IHNuZF9zZ2J1Zl9nZXRfYWRkcihkbWFiLCBvZnMpOworCQkvKiBwcm9ncmFtIHRoZSBhZGRyZXNzIGZpZWxkIG9mIHRoZSBCREwgZW50cnkgKi8KKwkJYmRsWzBdID0gY3B1X3RvX2xlMzIoKHUzMilhZGRyKTsKKwkJYmRsWzFdID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhhZGRyKSk7CisJCS8qIHByb2dyYW0gdGhlIHNpemUgZmllbGQgb2YgdGhlIEJETCBlbnRyeSAqLworCQljaHVuayA9IHNuZF9zZ2J1Zl9nZXRfY2h1bmtfc2l6ZShkbWFiLCBvZnMsIHNpemUpOworCQkvKiBvbmUgQkRMRSBjYW5ub3QgY3Jvc3MgNEsgYm91bmRhcnkgb24gQ1RIREEgY2hpcHMgKi8KKwkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTXzRLX0JETEVfQk9VTkRBUlkpIHsKKwkJCXUzMiByZW1haW4gPSAweDEwMDAgLSAob2ZzICYgMHhmZmYpOworCQkJaWYgKGNodW5rID4gcmVtYWluKQorCQkJCWNodW5rID0gcmVtYWluOworCQl9CisJCWJkbFsyXSA9IGNwdV90b19sZTMyKGNodW5rKTsKKwkJLyogcHJvZ3JhbSB0aGUgSU9DIHRvIGVuYWJsZSBpbnRlcnJ1cHQKKwkJICogb25seSB3aGVuIHRoZSB3aG9sZSBmcmFnbWVudCBpcyBwcm9jZXNzZWQKKwkJICovCisJCXNpemUgLT0gY2h1bms7CisJCWJkbFszXSA9IChzaXplIHx8ICF3aXRoX2lvYykgPyAwIDogY3B1X3RvX2xlMzIoMHgwMSk7CisJCWJkbCArPSA0OworCQlhenhfZGV2LT5mcmFncysrOworCQlvZnMgKz0gY2h1bms7CisJfQorCSpiZGxwID0gYmRsOworCXJldHVybiBvZnM7Cit9CisKKy8qCisgKiBzZXQgdXAgQkRMIGVudHJpZXMKKyAqLworc3RhdGljIGludCBhenhfc2V0dXBfcGVyaW9kcyhzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCit7CisJdTMyICpiZGw7CisJaW50IGksIG9mcywgcGVyaW9kcywgcGVyaW9kX2J5dGVzOworCWludCBwb3NfYWRqID0gMDsKKworCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQTCwgMCk7CisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQVSwgMCk7CisKKwlwZXJpb2RfYnl0ZXMgPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisJcGVyaW9kcyA9IGF6eF9kZXYtPmJ1ZnNpemUgLyBwZXJpb2RfYnl0ZXM7CisKKwkvKiBwcm9ncmFtIHRoZSBpbml0aWFsIEJETCBlbnRyaWVzICovCisJYmRsID0gKHUzMiAqKWF6eF9kZXYtPmJkbC5hcmVhOworCW9mcyA9IDA7CisJYXp4X2Rldi0+ZnJhZ3MgPSAwOworCisJaWYgKGNoaXAtPmJkbF9wb3NfYWRqKQorCQlwb3NfYWRqID0gY2hpcC0+YmRsX3Bvc19hZGpbY2hpcC0+ZGV2X2luZGV4XTsKKwlpZiAoIWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXAgJiYgcG9zX2FkaiA+IDApIHsKKwkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwkJaW50IHBvc19hbGlnbiA9IHBvc19hZGo7CisJCXBvc19hZGogPSAocG9zX2FkaiAqIHJ1bnRpbWUtPnJhdGUgKyA0Nzk5OSkgLyA0ODAwMDsKKwkJaWYgKCFwb3NfYWRqKQorCQkJcG9zX2FkaiA9IHBvc19hbGlnbjsKKwkJZWxzZQorCQkJcG9zX2FkaiA9ICgocG9zX2FkaiArIHBvc19hbGlnbiAtIDEpIC8gcG9zX2FsaWduKSAqCisJCQkJcG9zX2FsaWduOworCQlwb3NfYWRqID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHBvc19hZGopOworCQlpZiAocG9zX2FkaiA+PSBwZXJpb2RfYnl0ZXMpIHsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwiVG9vIGJpZyBhZGp1c3RtZW50ICVkXG4iLAorCQkJCSBwb3NfYWRqKTsKKwkJCXBvc19hZGogPSAwOworCQl9IGVsc2UgeworCQkJb2ZzID0gc2V0dXBfYmRsZShjaGlwLCBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSksCisJCQkJCSBhenhfZGV2LAorCQkJCQkgJmJkbCwgb2ZzLCBwb3NfYWRqLCB0cnVlKTsKKwkJCWlmIChvZnMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UKKwkJcG9zX2FkaiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGVyaW9kczsgaSsrKSB7CisJCWlmIChpID09IHBlcmlvZHMgLSAxICYmIHBvc19hZGopCisJCQlvZnMgPSBzZXR1cF9iZGxlKGNoaXAsIHNuZF9wY21fZ2V0X2RtYV9idWYoc3Vic3RyZWFtKSwKKwkJCQkJIGF6eF9kZXYsICZiZGwsIG9mcywKKwkJCQkJIHBlcmlvZF9ieXRlcyAtIHBvc19hZGosIDApOworCQllbHNlCisJCQlvZnMgPSBzZXR1cF9iZGxlKGNoaXAsIHNuZF9wY21fZ2V0X2RtYV9idWYoc3Vic3RyZWFtKSwKKwkJCQkJIGF6eF9kZXYsICZiZGwsIG9mcywKKwkJCQkJIHBlcmlvZF9ieXRlcywKKwkJCQkJICFhenhfZGV2LT5ub19wZXJpb2Rfd2FrZXVwKTsKKwkJaWYgKG9mcyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKwlyZXR1cm4gMDsKKworIGVycm9yOgorCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiVG9vIG1hbnkgQkRMIGVudHJpZXM6IGJ1ZmZlcj0lZCwgcGVyaW9kPSVkXG4iLAorCQlhenhfZGV2LT5idWZzaXplLCBwZXJpb2RfYnl0ZXMpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogUENNIG9wcworICovCisKK3N0YXRpYyBpbnQgYXp4X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbXV0ZXhfbG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJYXp4X2Rldi0+c3Vic3RyZWFtID0gTlVMTDsKKwlhenhfZGV2LT5ydW5uaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWF6eF9yZWxlYXNlX2RldmljZShhenhfZGV2KTsKKwloaW5mby0+b3BzLmNsb3NlKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOworCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXp4X3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCWludCByZXQ7CisKKwlkc3BfbG9jayhnZXRfYXp4X2RldihzdWJzdHJlYW0pKTsKKwlpZiAoZHNwX2lzX2xvY2tlZChnZXRfYXp4X2RldihzdWJzdHJlYW0pKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJldCA9IGNoaXAtPm9wcy0+c3Vic3RyZWFtX2FsbG9jX3BhZ2VzKGNoaXAsIHN1YnN0cmVhbSwKKwkJCQkJICBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwordW5sb2NrOgorCWRzcF91bmxvY2soZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhenhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07CisJaW50IGVycjsKKworCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCisJZHNwX2xvY2soYXp4X2Rldik7CisJaWYgKCFkc3BfaXNfbG9ja2VkKGF6eF9kZXYpKSB7CisJCWF6eF9zZF93cml0ZWwoY2hpcCwgYXp4X2RldiwgU0RfQkRMUEwsIDApOworCQlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKKwkJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9DVEwsIDApOworCQlhenhfZGV2LT5idWZzaXplID0gMDsKKwkJYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gMDsKKwkJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7CisJfQorCisJc25kX2hkYV9jb2RlY19jbGVhbnVwKGFwY20tPmNvZGVjLCBoaW5mbywgc3Vic3RyZWFtKTsKKworCWVyciA9IGNoaXAtPm9wcy0+c3Vic3RyZWFtX2ZyZWVfcGFnZXMoY2hpcCwgc3Vic3RyZWFtKTsKKwlhenhfZGV2LT5wcmVwYXJlZCA9IDA7CisJZHNwX3VubG9jayhhenhfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF6eF9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXVuc2lnbmVkIGludCBidWZzaXplLCBwZXJpb2RfYnl0ZXMsIGZvcm1hdF92YWwsIHN0cmVhbV90YWc7CisJaW50IGVycjsKKwlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPQorCQlzbmRfaGRhX3NwZGlmX291dF9vZl9uaWQoYXBjbS0+Y29kZWMsIGhpbmZvLT5uaWQpOworCXVuc2lnbmVkIHNob3J0IGN0bHMgPSBzcGRpZiA/IHNwZGlmLT5jdGxzIDogMDsKKworCWRzcF9sb2NrKGF6eF9kZXYpOworCWlmIChkc3BfaXNfbG9ja2VkKGF6eF9kZXYpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJYXp4X3N0cmVhbV9yZXNldChjaGlwLCBhenhfZGV2KTsKKwlmb3JtYXRfdmFsID0gc25kX2hkYV9jYWxjX3N0cmVhbV9mb3JtYXQocnVudGltZS0+cmF0ZSwKKwkJCQkJCXJ1bnRpbWUtPmNoYW5uZWxzLAorCQkJCQkJcnVudGltZS0+Zm9ybWF0LAorCQkJCQkJaGluZm8tPm1heGJwcywKKwkJCQkJCWN0bHMpOworCWlmICghZm9ybWF0X3ZhbCkgeworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJpbnZhbGlkIGZvcm1hdF92YWwsIHJhdGU9JWQsIGNoPSVkLCBmb3JtYXQ9JWRcbiIsCisJCQlydW50aW1lLT5yYXRlLCBydW50aW1lLT5jaGFubmVscywgcnVudGltZS0+Zm9ybWF0KTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJYnVmc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXBlcmlvZF9ieXRlcyA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhenhfcGNtX3ByZXBhcmU6IGJ1ZnNpemU9MHgleCwgZm9ybWF0PTB4JXhcbiIsCisJCWJ1ZnNpemUsIGZvcm1hdF92YWwpOworCisJaWYgKGJ1ZnNpemUgIT0gYXp4X2Rldi0+YnVmc2l6ZSB8fAorCSAgICBwZXJpb2RfYnl0ZXMgIT0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzIHx8CisJICAgIGZvcm1hdF92YWwgIT0gYXp4X2Rldi0+Zm9ybWF0X3ZhbCB8fAorCSAgICBydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwICE9IGF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXApIHsKKwkJYXp4X2Rldi0+YnVmc2l6ZSA9IGJ1ZnNpemU7CisJCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IHBlcmlvZF9ieXRlczsKKwkJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IGZvcm1hdF92YWw7CisJCWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXAgPSBydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwOworCQllcnIgPSBhenhfc2V0dXBfcGVyaW9kcyhjaGlwLCBzdWJzdHJlYW0sIGF6eF9kZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIHdoZW4gTFBJQiBkZWxheSBjb3JyZWN0aW9uIGdpdmVzIGEgc21hbGwgbmVnYXRpdmUgdmFsdWUsCisJICogd2UgaWdub3JlIGl0OyBjdXJyZW50bHkgc2V0IHRoZSB0aHJlc2hvbGQgc3RhdGljYWxseSB0bworCSAqIDY0IGZyYW1lcworCSAqLworCWlmIChydW50aW1lLT5wZXJpb2Rfc2l6ZSA+IDY0KQorCQlhenhfZGV2LT5kZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQgPSAtZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIDY0KTsKKwllbHNlCisJCWF6eF9kZXYtPmRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZCA9IDA7CisKKwkvKiB3YWxsY2xrIGhhcyAyNE1oeiBjbG9jayBzb3VyY2UgKi8KKwlhenhfZGV2LT5wZXJpb2Rfd2FsbGNsayA9ICgoKHJ1bnRpbWUtPnBlcmlvZF9zaXplICogMjQwMDApIC8KKwkJCQkJCXJ1bnRpbWUtPnJhdGUpICogMTAwMCk7CisJYXp4X3NldHVwX2NvbnRyb2xsZXIoY2hpcCwgYXp4X2Rldik7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWF6eF9kZXYtPmZpZm9fc2l6ZSA9CisJCQlhenhfc2RfcmVhZHcoY2hpcCwgYXp4X2RldiwgU0RfRklGT1NJWkUpICsgMTsKKwllbHNlCisJCWF6eF9kZXYtPmZpZm9fc2l6ZSA9IDA7CisKKwlzdHJlYW1fdGFnID0gYXp4X2Rldi0+c3RyZWFtX3RhZzsKKwkvKiBDQS1JQkcgY2hpcHMgbmVlZCB0aGUgcGxheWJhY2sgc3RyZWFtIHN0YXJ0aW5nIGZyb20gMSAqLworCWlmICgoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQpICYmCisJICAgIHN0cmVhbV90YWcgPiBjaGlwLT5jYXB0dXJlX3N0cmVhbXMpCisJCXN0cmVhbV90YWcgLT0gY2hpcC0+Y2FwdHVyZV9zdHJlYW1zOworCWVyciA9IHNuZF9oZGFfY29kZWNfcHJlcGFyZShhcGNtLT5jb2RlYywgaGluZm8sIHN0cmVhbV90YWcsCisJCQkJICAgICBhenhfZGV2LT5mb3JtYXRfdmFsLCBzdWJzdHJlYW0pOworCisgdW5sb2NrOgorCWlmICghZXJyKQorCQlhenhfZGV2LT5wcmVwYXJlZCA9IDE7CisJZHNwX3VubG9jayhhenhfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF6eF9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7CisJaW50IHJzdGFydCA9IDAsIHN0YXJ0LCBuc3luYyA9IDAsIHNiaXRzID0gMDsKKwlpbnQgbndhaXQsIHRpbWVvdXQ7CisKKwlhenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwl0cmFjZV9henhfcGNtX3RyaWdnZXIoY2hpcCwgYXp4X2RldiwgY21kKTsKKworCWlmIChkc3BfaXNfbG9ja2VkKGF6eF9kZXYpIHx8ICFhenhfZGV2LT5wcmVwYXJlZCkKKwkJcmV0dXJuIC1FUElQRTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJcnN0YXJ0ID0gMTsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCXN0YXJ0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXN0YXJ0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKKwkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCWNvbnRpbnVlOworCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYocyk7CisJCXNiaXRzIHw9IDEgPDwgYXp4X2Rldi0+aW5kZXg7CisJCW5zeW5jKys7CisJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CisJfQorCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwkvKiBmaXJzdCwgc2V0IFNZTkMgYml0cyBvZiBjb3JyZXNwb25kaW5nIHN0cmVhbXMgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfT0xEX1NTWU5DKQorCQlhenhfd3JpdGVsKGNoaXAsIE9MRF9TU1lOQywKKwkJCWF6eF9yZWFkbChjaGlwLCBPTERfU1NZTkMpIHwgc2JpdHMpOworCWVsc2UKKwkJYXp4X3dyaXRlbChjaGlwLCBTU1lOQywgYXp4X3JlYWRsKGNoaXAsIFNTWU5DKSB8IHNiaXRzKTsKKworCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CisJCWlmIChzLT5wY20tPmNhcmQgIT0gc3Vic3RyZWFtLT5wY20tPmNhcmQpCisJCQljb250aW51ZTsKKwkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOworCQlpZiAoc3RhcnQpIHsKKwkJCWF6eF9kZXYtPnN0YXJ0X3dhbGxjbGsgPSBhenhfcmVhZGwoY2hpcCwgV0FMTENMSyk7CisJCQlpZiAoIXJzdGFydCkKKwkJCQlhenhfZGV2LT5zdGFydF93YWxsY2xrIC09CisJCQkJCQlhenhfZGV2LT5wZXJpb2Rfd2FsbGNsazsKKwkJCWF6eF9zdHJlYW1fc3RhcnQoY2hpcCwgYXp4X2Rldik7CisJCX0gZWxzZSB7CisJCQlhenhfc3RyZWFtX3N0b3AoY2hpcCwgYXp4X2Rldik7CisJCX0KKwkJYXp4X2Rldi0+cnVubmluZyA9IHN0YXJ0OworCX0KKwlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCWlmIChzdGFydCkgeworCQkvKiB3YWl0IHVudGlsIGFsbCBGSUZPcyBnZXQgcmVhZHkgKi8KKwkJZm9yICh0aW1lb3V0ID0gNTAwMDsgdGltZW91dDsgdGltZW91dC0tKSB7CisJCQlud2FpdCA9IDA7CisJCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgeworCQkJCWlmIChzLT5wY20tPmNhcmQgIT0gc3Vic3RyZWFtLT5wY20tPmNhcmQpCisJCQkJCWNvbnRpbnVlOworCQkJCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKKwkJCQlpZiAoIShhenhfc2RfcmVhZGIoY2hpcCwgYXp4X2RldiwgU0RfU1RTKSAmCisJCQkJICAgICAgU0RfU1RTX0ZJRk9fUkVBRFkpKQorCQkJCQlud2FpdCsrOworCQkJfQorCQkJaWYgKCFud2FpdCkKKwkJCQlicmVhazsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJfSBlbHNlIHsKKwkJLyogd2FpdCB1bnRpbCBhbGwgUlVOIGJpdHMgYXJlIGNsZWFyZWQgKi8KKwkJZm9yICh0aW1lb3V0ID0gNTAwMDsgdGltZW91dDsgdGltZW91dC0tKSB7CisJCQlud2FpdCA9IDA7CisJCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgeworCQkJCWlmIChzLT5wY20tPmNhcmQgIT0gc3Vic3RyZWFtLT5wY20tPmNhcmQpCisJCQkJCWNvbnRpbnVlOworCQkJCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKKwkJCQlpZiAoYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkgJgorCQkJCSAgICBTRF9DVExfRE1BX1NUQVJUKQorCQkJCQlud2FpdCsrOworCQkJfQorCQkJaWYgKCFud2FpdCkKKwkJCQlicmVhazsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJfQorCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCS8qIHJlc2V0IFNZTkMgYml0cyAqLworCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19PTERfU1NZTkMpCisJCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAorCQkJYXp4X3JlYWRsKGNoaXAsIE9MRF9TU1lOQykgJiB+c2JpdHMpOworCWVsc2UKKwkJYXp4X3dyaXRlbChjaGlwLCBTU1lOQywgYXp4X3JlYWRsKGNoaXAsIFNTWU5DKSAmIH5zYml0cyk7CisJaWYgKHN0YXJ0KSB7CisJCWF6eF90aW1lY291bnRlcl9pbml0KHN1YnN0cmVhbSwgMCwgMCk7CisJCWlmIChuc3luYyA+IDEpIHsKKwkJCWN5Y2xlX3QgY3ljbGVfbGFzdDsKKworCQkJLyogc2FtZSBzdGFydCBjeWNsZSBmb3IgbWFzdGVyIGFuZCBncm91cCAqLworCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJCQljeWNsZV9sYXN0ID0gYXp4X2Rldi0+YXp4X3RjLmN5Y2xlX2xhc3Q7CisKKwkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CisJCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKKwkJCQkJY29udGludWU7CisJCQkJYXp4X3RpbWVjb3VudGVyX2luaXQocywgMSwgY3ljbGVfbGFzdCk7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogZ2V0IHRoZSBjdXJyZW50IERNQSBwb3NpdGlvbiB3aXRoIGNvcnJlY3Rpb24gb24gVklBIGNoaXBzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF6eF92aWFfZ2V0X3Bvc2l0aW9uKHN0cnVjdCBhenggKmNoaXAsCisJCQkJCSBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKK3sKKwl1bnNpZ25lZCBpbnQgbGlua19wb3MsIG1pbmlfcG9zLCBib3VuZF9wb3M7CisJdW5zaWduZWQgaW50IG1vZF9saW5rX3BvcywgbW9kX2RtYV9wb3MsIG1vZF9taW5pX3BvczsKKwl1bnNpZ25lZCBpbnQgZmlmb19zaXplOworCisJbGlua19wb3MgPSBhenhfc2RfcmVhZGwoY2hpcCwgYXp4X2RldiwgU0RfTFBJQik7CisJaWYgKGF6eF9kZXYtPnN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJLyogUGxheWJhY2ssIG5vIHByb2JsZW0gdXNpbmcgbGluayBwb3NpdGlvbiAqLworCQlyZXR1cm4gbGlua19wb3M7CisJfQorCisJLyogQ2FwdHVyZSAqLworCS8qIEZvciBuZXcgY2hpcHNldCwKKwkgKiB1c2UgbW9kIHRvIGdldCB0aGUgRE1BIHBvc2l0aW9uIGp1c3QgbGlrZSBvbGQgY2hpcHNldAorCSAqLworCW1vZF9kbWFfcG9zID0gbGUzMl90b19jcHUoKmF6eF9kZXYtPnBvc2J1Zik7CisJbW9kX2RtYV9wb3MgJT0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzOworCisJLyogYXp4X2Rldi0+Zmlmb19zaXplIGNhbid0IGdldCBGSUZPIHNpemUgb2YgaW4gc3RyZWFtLgorCSAqIEdldCBmcm9tIGJhc2UgYWRkcmVzcyArIG9mZnNldC4KKwkgKi8KKwlmaWZvX3NpemUgPSByZWFkdyhjaGlwLT5yZW1hcF9hZGRyICsgVklBX0lOX1NUUkVBTTBfRklGT19TSVpFX09GRlNFVCk7CisKKwlpZiAoYXp4X2Rldi0+aW5zdWZmaWNpZW50KSB7CisJCS8qIExpbmsgcG9zaXRpb24gbmV2ZXIgZ2F0aGVyIHRoYW4gRklGTyBzaXplICovCisJCWlmIChsaW5rX3BvcyA8PSBmaWZvX3NpemUpCisJCQlyZXR1cm4gMDsKKworCQlhenhfZGV2LT5pbnN1ZmZpY2llbnQgPSAwOworCX0KKworCWlmIChsaW5rX3BvcyA8PSBmaWZvX3NpemUpCisJCW1pbmlfcG9zID0gYXp4X2Rldi0+YnVmc2l6ZSArIGxpbmtfcG9zIC0gZmlmb19zaXplOworCWVsc2UKKwkJbWluaV9wb3MgPSBsaW5rX3BvcyAtIGZpZm9fc2l6ZTsKKworCS8qIEZpbmQgbmVhcmVzdCBwcmV2aW91cyBib3VkYXJ5ICovCisJbW9kX21pbmlfcG9zID0gbWluaV9wb3MgJSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisJbW9kX2xpbmtfcG9zID0gbGlua19wb3MgJSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisJaWYgKG1vZF9saW5rX3BvcyA+PSBmaWZvX3NpemUpCisJCWJvdW5kX3BvcyA9IGxpbmtfcG9zIC0gbW9kX2xpbmtfcG9zOworCWVsc2UgaWYgKG1vZF9kbWFfcG9zID49IG1vZF9taW5pX3BvcykKKwkJYm91bmRfcG9zID0gbWluaV9wb3MgLSBtb2RfbWluaV9wb3M7CisJZWxzZSB7CisJCWJvdW5kX3BvcyA9IG1pbmlfcG9zIC0gbW9kX21pbmlfcG9zICsgYXp4X2Rldi0+cGVyaW9kX2J5dGVzOworCQlpZiAoYm91bmRfcG9zID49IGF6eF9kZXYtPmJ1ZnNpemUpCisJCQlib3VuZF9wb3MgPSAwOworCX0KKworCS8qIENhbGN1bGF0ZSByZWFsIERNQSBwb3NpdGlvbiB3ZSB3YW50ICovCisJcmV0dXJuIGJvdW5kX3BvcyArIG1vZF9kbWFfcG9zOworfQorCit1bnNpZ25lZCBpbnQgYXp4X2dldF9wb3NpdGlvbihzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJICAgICAgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYsCisJCQkgICAgICBib29sIHdpdGhfY2hlY2spCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBhenhfZGV2LT5zdWJzdHJlYW07CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJdW5zaWduZWQgaW50IHBvczsKKwlpbnQgc3RyZWFtID0gc3Vic3RyZWFtLT5zdHJlYW07CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N0cmVhbV07CisJaW50IGRlbGF5ID0gMDsKKworCXN3aXRjaCAoY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0pIHsKKwljYXNlIFBPU19GSVhfTFBJQjoKKwkJLyogcmVhZCBMUElCICovCisJCXBvcyA9IGF6eF9zZF9yZWFkbChjaGlwLCBhenhfZGV2LCBTRF9MUElCKTsKKwkJYnJlYWs7CisJY2FzZSBQT1NfRklYX1ZJQUNPTUJPOgorCQlwb3MgPSBhenhfdmlhX2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdXNlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwkJcG9zID0gbGUzMl90b19jcHUoKmF6eF9kZXYtPnBvc2J1Zik7CisJCWlmICh3aXRoX2NoZWNrICYmIGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID09IFBPU19GSVhfQVVUTykgeworCQkJaWYgKCFwb3MgfHwgcG9zID09ICh1MzIpLTEpIHsKKwkJCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSAiSW52YWxpZCBwb3NpdGlvbiBidWZmZXIsIHVzaW5nIExQSUIgcmVhZCBtZXRob2QgaW5zdGVhZC5cbiIpOworCQkJCWNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID0gUE9TX0ZJWF9MUElCOworCQkJCXBvcyA9IGF6eF9zZF9yZWFkbChjaGlwLCBhenhfZGV2LCBTRF9MUElCKTsKKwkJCX0gZWxzZQorCQkJCWNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID0gUE9TX0ZJWF9QT1NCVUY7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKHBvcyA+PSBhenhfZGV2LT5idWZzaXplKQorCQlwb3MgPSAwOworCisJLyogY2FsY3VsYXRlIHJ1bnRpbWUgZGVsYXkgZnJvbSBMUElCICovCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZSAmJgorCSAgICBjaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9PSBQT1NfRklYX1BPU0JVRiAmJgorCSAgICAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQ09VTlRfTFBJQl9ERUxBWSkpIHsKKwkJdW5zaWduZWQgaW50IGxwaWJfcG9zID0gYXp4X3NkX3JlYWRsKGNoaXAsIGF6eF9kZXYsIFNEX0xQSUIpOworCQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQlkZWxheSA9IHBvcyAtIGxwaWJfcG9zOworCQllbHNlCisJCQlkZWxheSA9IGxwaWJfcG9zIC0gcG9zOworCQlpZiAoZGVsYXkgPCAwKSB7CisJCQlpZiAoZGVsYXkgPj0gYXp4X2Rldi0+ZGVsYXlfbmVnYXRpdmVfdGhyZXNob2xkKQorCQkJCWRlbGF5ID0gMDsKKwkJCWVsc2UKKwkJCQlkZWxheSArPSBhenhfZGV2LT5idWZzaXplOworCQl9CisJCWlmIChkZWxheSA+PSBhenhfZGV2LT5wZXJpb2RfYnl0ZXMpIHsKKwkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgIlVuc3RhYmxlIExQSUIgKCVkID49ICVkKTsgZGlzYWJsaW5nIExQSUIgZGVsYXkgY291bnRpbmdcbiIsCisJCQkJIGRlbGF5LCBhenhfZGV2LT5wZXJpb2RfYnl0ZXMpOworCQkJZGVsYXkgPSAwOworCQkJY2hpcC0+ZHJpdmVyX2NhcHMgJj0gfkFaWF9EQ0FQU19DT1VOVF9MUElCX0RFTEFZOworCQl9CisJCWRlbGF5ID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgZGVsYXkpOworCX0KKworCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUpIHsKKwkJaWYgKGhpbmZvLT5vcHMuZ2V0X2RlbGF5KQorCQkJZGVsYXkgKz0gaGluZm8tPm9wcy5nZXRfZGVsYXkoaGluZm8sIGFwY20tPmNvZGVjLAorCQkJCQkJICAgICAgc3Vic3RyZWFtKTsKKwkJc3Vic3RyZWFtLT5ydW50aW1lLT5kZWxheSA9IGRlbGF5OworCX0KKworCXRyYWNlX2F6eF9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2RldiwgcG9zLCBkZWxheSk7CisJcmV0dXJuIHBvczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9nZXRfcG9zaXRpb24pOworCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgYXp4X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCSAgICAgICBhenhfZ2V0X3Bvc2l0aW9uKGNoaXAsIGF6eF9kZXYsIGZhbHNlKSk7Cit9CisKK3N0YXRpYyBpbnQgYXp4X2dldF93YWxsY2xvY2tfdHN0YW1wKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXU2NCBuc2VjOworCisJbnNlYyA9IHRpbWVjb3VudGVyX3JlYWQoJmF6eF9kZXYtPmF6eF90Yyk7CisJbnNlYyA9IGRpdl91NjQobnNlYywgMyk7IC8qIGNhbiBiZSBvcHRpbWl6ZWQgKi8KKwluc2VjID0gYXp4X2FkanVzdF9jb2RlY19kZWxheShzdWJzdHJlYW0sIG5zZWMpOworCisJKnRzID0gbnNfdG9fdGltZXNwZWMobnNlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGF6eF9wY21faHcgPSB7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAvKiBObyBmdWxsLXJlc3VtZSB5ZXQgaW1wbGVtZW50ZWQgKi8KKwkJCQkgLyogU05EUlZfUENNX0lORk9fUkVTVU1FIHwqLworCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19IQVNfV0FMTF9DTE9DSyB8CisJCQkJIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVApLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMiwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQlBWlhfTUFYX0JVRl9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JMTI4LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JQVpYX01BWF9CVUZfU0laRSAvIDIsCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCUFaWF9NQVhfRlJBRywKKwkuZmlmb19zaXplID0JCTAsCit9OworCitzdGF0aWMgaW50IGF6eF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCWludCBidWZmX3N0ZXA7CisKKwltdXRleF9sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwlhenhfZGV2ID0gYXp4X2Fzc2lnbl9kZXZpY2UoY2hpcCwgc3Vic3RyZWFtKTsKKwlpZiAoYXp4X2RldiA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJ1bnRpbWUtPmh3ID0gYXp4X3BjbV9odzsKKwlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSBoaW5mby0+Y2hhbm5lbHNfbWluOworCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGhpbmZvLT5jaGFubmVsc19tYXg7CisJcnVudGltZS0+aHcuZm9ybWF0cyA9IGhpbmZvLT5mb3JtYXRzOworCXJ1bnRpbWUtPmh3LnJhdGVzID0gaGluZm8tPnJhdGVzOworCXNuZF9wY21fbGltaXRfaHdfcmF0ZXMocnVudGltZSk7CisJc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCisJLyogYXZvaWQgd3JhcC1hcm91bmQgd2l0aCB3YWxsLWNsb2NrICovCisJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1RJTUUsCisJCQkJICAgICAyMCwKKwkJCQkgICAgIDE3ODAwMDAwMCk7CisKKwlpZiAoY2hpcC0+YWxpZ25fYnVmZmVyX3NpemUpCisJCS8qIGNvbnN0cmFpbiBidWZmZXIgc2l6ZXMgdG8gYmUgbXVsdGlwbGUgb2YgMTI4CisJCSAgIGJ5dGVzLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IGluIHRlcm1zIG9mIG1lbW9yeQorCQkgICBhY2Nlc3MgYnV0IGlzbid0IHJlcXVpcmVkIGJ5IHRoZSBIREEgc3BlYyBhbmQKKwkJICAgcHJldmVudHMgdXNlcnMgZnJvbSBzcGVjaWZ5aW5nIGV4YWN0IHBlcmlvZC9idWZmZXIKKwkJICAgc2l6ZXMuIEZvciBleGFtcGxlIGZvciA0NC4xa0h6LCBhIHBlcmlvZCBzaXplIHNldAorCQkgICB0byAyMG1zIHdpbGwgYmUgcm91bmRlZCB0byAxOS41OW1zLiAqLworCQlidWZmX3N0ZXAgPSAxMjg7CisJZWxzZQorCQkvKiBEb24ndCBlbmZvcmNlIHN0ZXBzIG9uIGJ1ZmZlciBzaXplcywgc3RpbGwgbmVlZCB0bworCQkgICBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChIREEgc3BlYykuIFRlc3RlZCBvbiBJbnRlbAorCQkgICBIREEgY29udHJvbGxlcnMsIG1heSBub3Qgd29yayBvbiBhbGwgZGV2aWNlcyB3aGVyZQorCQkgICBvcHRpb24gbmVlZHMgdG8gYmUgZGlzYWJsZWQgKi8KKwkJYnVmZl9zdGVwID0gNDsKKworCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCisJCQkJICAgYnVmZl9zdGVwKTsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLAorCQkJCSAgIGJ1ZmZfc3RlcCk7CisJc25kX2hkYV9wb3dlcl91cF9kM3dhaXQoYXBjbS0+Y29kZWMpOworCWVyciA9IGhpbmZvLT5vcHMub3BlbihoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7CisJaWYgKGVyciA8IDApIHsKKwkJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOworCQlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOworCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOworCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOworCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChzbmRfQlVHX09OKCFydW50aW1lLT5ody5jaGFubmVsc19taW4pIHx8CisJICAgIHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCkgfHwKKwkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcuZm9ybWF0cykgfHwKKwkgICAgc25kX0JVR19PTighcnVudGltZS0+aHcucmF0ZXMpKSB7CisJCWF6eF9yZWxlYXNlX2RldmljZShhenhfZGV2KTsKKwkJaGluZm8tPm9wcy5jbG9zZShoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7CisJCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7CisJCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRpc2FibGUgV0FMTENMT0NLIHRpbWVzdGFtcHMgZm9yIGNhcHR1cmUgc3RyZWFtcworCSAgIHVudGlsIHdlIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSBkaWdpdGFsIGlucHV0cyAqLworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXJ1bnRpbWUtPmh3LmluZm8gJj0gflNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJYXp4X2Rldi0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBhenhfZGV2OworCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKKwltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF6eF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlpZiAoY2hpcC0+b3BzLT5wY21fbW1hcF9wcmVwYXJlKQorCQljaGlwLT5vcHMtPnBjbV9tbWFwX3ByZXBhcmUoc3Vic3RyZWFtLCBhcmVhKTsKKwlyZXR1cm4gc25kX3BjbV9saWJfZGVmYXVsdF9tbWFwKHN1YnN0cmVhbSwgYXJlYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgYXp4X3BjbV9vcHMgPSB7CisJLm9wZW4gPSBhenhfcGNtX29wZW4sCisJLmNsb3NlID0gYXp4X3BjbV9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gYXp4X3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPSBhenhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPSBhenhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPSBhenhfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPSBhenhfcGNtX3BvaW50ZXIsCisJLndhbGxfY2xvY2sgPSAgYXp4X2dldF93YWxsY2xvY2tfdHN0YW1wLAorCS5tbWFwID0gYXp4X3BjbV9tbWFwLAorCS5wYWdlID0gc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSwKK307CisKK3N0YXRpYyB2b2lkIGF6eF9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXN0cnVjdCBhenhfcGNtICphcGNtID0gcGNtLT5wcml2YXRlX2RhdGE7CisJaWYgKGFwY20pIHsKKwkJbGlzdF9kZWwoJmFwY20tPmxpc3QpOworCQlrZnJlZShhcGNtKTsKKwl9Cit9CisKKyNkZWZpbmUgTUFYX1BSRUFMTE9DX1NJWkUJKDMyICogMTAyNCAqIDEwMjQpCisKK3N0YXRpYyBpbnQgYXp4X2F0dGFjaF9wY21fc3RyZWFtKHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3QgaGRhX3BjbSAqY3BjbSkKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbTsKKwlpbnQgcGNtX2RldiA9IGNwY20tPmRldmljZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgcywgZXJyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhcGNtLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGFwY20tPnBjbS0+ZGV2aWNlID09IHBjbV9kZXYpIHsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiUENNICVkIGFscmVhZHkgZXhpc3RzXG4iLAorCQkJCXBjbV9kZXYpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBjcGNtLT5uYW1lLCBwY21fZGV2LAorCQkJICBjcGNtLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtcywKKwkJCSAgY3BjbS0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcywKKwkJCSAgJnBjbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJc3RybGNweShwY20tPm5hbWUsIGNwY20tPm5hbWUsIHNpemVvZihwY20tPm5hbWUpKTsKKwlhcGNtID0ga3phbGxvYyhzaXplb2YoKmFwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoYXBjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhcGNtLT5jaGlwID0gY2hpcDsKKwlhcGNtLT5wY20gPSBwY207CisJYXBjbS0+Y29kZWMgPSBjb2RlYzsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGFwY207CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBhenhfcGNtX2ZyZWU7CisJaWYgKGNwY20tPnBjbV90eXBlID09IEhEQV9QQ01fVFlQRV9NT0RFTSkKKwkJcGNtLT5kZXZfY2xhc3MgPSBTTkRSVl9QQ01fQ0xBU1NfTU9ERU07CisJbGlzdF9hZGRfdGFpbCgmYXBjbS0+bGlzdCwgJmNoaXAtPnBjbV9saXN0KTsKKwljcGNtLT5wY20gPSBwY207CisJZm9yIChzID0gMDsgcyA8IDI7IHMrKykgeworCQlhcGNtLT5oaW5mb1tzXSA9ICZjcGNtLT5zdHJlYW1bc107CisJCWlmIChjcGNtLT5zdHJlYW1bc10uc3Vic3RyZWFtcykKKwkJCXNuZF9wY21fc2V0X29wcyhwY20sIHMsICZhenhfcGNtX29wcyk7CisJfQorCS8qIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbiAqLworCXNpemUgPSBDT05GSUdfU05EX0hEQV9QUkVBTExPQ19TSVpFICogMTAyNDsKKwlpZiAoc2l6ZSA+IE1BWF9QUkVBTExPQ19TSVpFKQorCQlzaXplID0gTUFYX1BSRUFMTE9DX1NJWkU7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKKwkJCQkJICAgICAgY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkgICAgICBzaXplLCBNQVhfUFJFQUxMT0NfU0laRSk7CisJLyogbGluayB0byBjb2RlYyAqLworCXBjbS0+ZGV2ID0gJmNvZGVjLT5kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDT1JCIC8gUklSQiBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBhenhfYWxsb2NfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IGVycjsKKworCS8qIHNpbmdsZSBwYWdlIChhdCBsZWFzdCA0MDk2IGJ5dGVzKSBtdXN0IHN1ZmZpY2UgZm9yIGJvdGggcmluZ2J1ZmZlcyAqLworCWVyciA9IGNoaXAtPm9wcy0+ZG1hX2FsbG9jX3BhZ2VzKGNoaXAsIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJIFBBR0VfU0laRSwgJmNoaXAtPnJiKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgQ09SQi9SSVJCXG4iKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2FsbG9jX2NtZF9pbyk7CisKK3N0YXRpYyB2b2lkIGF6eF9pbml0X2NtZF9pbyhzdHJ1Y3QgYXp4ICpjaGlwKQoreworCWludCB0aW1lb3V0OworCisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCS8qIENPUkIgc2V0IHVwICovCisJY2hpcC0+Y29yYi5hZGRyID0gY2hpcC0+cmIuYWRkcjsKKwljaGlwLT5jb3JiLmJ1ZiA9ICh1MzIgKiljaGlwLT5yYi5hcmVhOworCWF6eF93cml0ZWwoY2hpcCwgQ09SQkxCQVNFLCAodTMyKWNoaXAtPmNvcmIuYWRkcik7CisJYXp4X3dyaXRlbChjaGlwLCBDT1JCVUJBU0UsIHVwcGVyXzMyX2JpdHMoY2hpcC0+Y29yYi5hZGRyKSk7CisKKwkvKiBzZXQgdGhlIGNvcmIgc2l6ZSB0byAyNTYgZW50cmllcyAoVUxJIHJlcXVpcmVzIGV4cGxpY2l0bHkpICovCisJYXp4X3dyaXRlYihjaGlwLCBDT1JCU0laRSwgMHgwMik7CisJLyogc2V0IHRoZSBjb3JiIHdyaXRlIHBvaW50ZXIgdG8gMCAqLworCWF6eF93cml0ZXcoY2hpcCwgQ09SQldQLCAwKTsKKworCS8qIHJlc2V0IHRoZSBjb3JiIGh3IHJlYWQgcG9pbnRlciAqLworCWF6eF93cml0ZXcoY2hpcCwgQ09SQlJQLCBJQ0g2X0NPUkJSUF9SU1QpOworCWZvciAodGltZW91dCA9IDEwMDA7IHRpbWVvdXQgPiAwOyB0aW1lb3V0LS0pIHsKKwkJaWYgKChhenhfcmVhZHcoY2hpcCwgQ09SQlJQKSAmIElDSDZfQ09SQlJQX1JTVCkgPT0gSUNINl9DT1JCUlBfUlNUKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKHRpbWVvdXQgPD0gMCkKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDT1JCIHJlc2V0IHRpbWVvdXQjMSwgQ09SQlJQID0gJWRcbiIsCisJCQlhenhfcmVhZHcoY2hpcCwgQ09SQlJQKSk7CisKKwlhenhfd3JpdGV3KGNoaXAsIENPUkJSUCwgMCk7CisJZm9yICh0aW1lb3V0ID0gMTAwMDsgdGltZW91dCA+IDA7IHRpbWVvdXQtLSkgeworCQlpZiAoYXp4X3JlYWR3KGNoaXAsIENPUkJSUCkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWlmICh0aW1lb3V0IDw9IDApCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ09SQiByZXNldCB0aW1lb3V0IzIsIENPUkJSUCA9ICVkXG4iLAorCQkJYXp4X3JlYWR3KGNoaXAsIENPUkJSUCkpOworCisJLyogZW5hYmxlIGNvcmIgZG1hICovCisJYXp4X3dyaXRlYihjaGlwLCBDT1JCQ1RMLCBJQ0g2X0NPUkJDVExfUlVOKTsKKworCS8qIFJJUkIgc2V0IHVwICovCisJY2hpcC0+cmlyYi5hZGRyID0gY2hpcC0+cmIuYWRkciArIDIwNDg7CisJY2hpcC0+cmlyYi5idWYgPSAodTMyICopKGNoaXAtPnJiLmFyZWEgKyAyMDQ4KTsKKwljaGlwLT5yaXJiLndwID0gY2hpcC0+cmlyYi5ycCA9IDA7CisJbWVtc2V0KGNoaXAtPnJpcmIuY21kcywgMCwgc2l6ZW9mKGNoaXAtPnJpcmIuY21kcykpOworCWF6eF93cml0ZWwoY2hpcCwgUklSQkxCQVNFLCAodTMyKWNoaXAtPnJpcmIuYWRkcik7CisJYXp4X3dyaXRlbChjaGlwLCBSSVJCVUJBU0UsIHVwcGVyXzMyX2JpdHMoY2hpcC0+cmlyYi5hZGRyKSk7CisKKwkvKiBzZXQgdGhlIHJpcmIgc2l6ZSB0byAyNTYgZW50cmllcyAoVUxJIHJlcXVpcmVzIGV4cGxpY2l0bHkpICovCisJYXp4X3dyaXRlYihjaGlwLCBSSVJCU0laRSwgMHgwMik7CisJLyogcmVzZXQgdGhlIHJpcmIgaHcgd3JpdGUgcG9pbnRlciAqLworCWF6eF93cml0ZXcoY2hpcCwgUklSQldQLCBJQ0g2X1JJUkJXUF9SU1QpOworCS8qIHNldCBOPTEsIGdldCBSSVJCIHJlc3BvbnNlIGludGVycnVwdCBmb3IgbmV3IGVudHJ5ICovCisJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX0NUWF9XT1JLQVJPVU5EKQorCQlhenhfd3JpdGV3KGNoaXAsIFJJTlRDTlQsIDB4YzApOworCWVsc2UKKwkJYXp4X3dyaXRldyhjaGlwLCBSSU5UQ05ULCAxKTsKKwkvKiBlbmFibGUgcmlyYiBkbWEgYW5kIHJlc3BvbnNlIGlycSAqLworCWF6eF93cml0ZWIoY2hpcCwgUklSQkNUTCwgSUNINl9SQkNUTF9ETUFfRU4gfCBJQ0g2X1JCQ1RMX0lSUV9FTik7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfaW5pdF9jbWRfaW8pOworCitzdGF0aWMgdm9pZCBhenhfZnJlZV9jbWRfaW8oc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJLyogZGlzYWJsZSByaW5nYnVmZmVyIERNQXMgKi8KKwlhenhfd3JpdGViKGNoaXAsIFJJUkJDVEwsIDApOworCWF6eF93cml0ZWIoY2hpcCwgQ09SQkNUTCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfZnJlZV9jbWRfaW8pOworCitzdGF0aWMgdW5zaWduZWQgaW50IGF6eF9jb21tYW5kX2FkZHIodTMyIGNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgYWRkciA9IGNtZCA+PiAyODsKKworCWlmIChhZGRyID49IEFaWF9NQVhfQ09ERUNTKSB7CisJCXNuZF9CVUcoKTsKKwkJYWRkciA9IDA7CisJfQorCisJcmV0dXJuIGFkZHI7Cit9CisKKy8qIHNlbmQgYSBjb21tYW5kICovCitzdGF0aWMgaW50IGF6eF9jb3JiX3NlbmRfY21kKHN0cnVjdCBoZGFfYnVzICpidXMsIHUzMiB2YWwpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBhZGRyID0gYXp4X2NvbW1hbmRfYWRkcih2YWwpOworCXVuc2lnbmVkIGludCB3cCwgcnA7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisKKwkvKiBhZGQgY29tbWFuZCB0byBjb3JiICovCisJd3AgPSBhenhfcmVhZHcoY2hpcCwgQ09SQldQKTsKKwlpZiAod3AgPT0gMHhmZmZmKSB7CisJCS8qIHNvbWV0aGluZyB3cm9uZywgY29udHJvbGxlciBsaWtlbHkgdHVybmVkIHRvIEQzICovCisJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisJd3ArKzsKKwl3cCAlPSBJQ0g2X01BWF9DT1JCX0VOVFJJRVM7CisKKwlycCA9IGF6eF9yZWFkdyhjaGlwLCBDT1JCUlApOworCWlmICh3cCA9PSBycCkgeworCQkvKiBvb3BzLCBpdCdzIGZ1bGwgKi8KKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWNoaXAtPnJpcmIuY21kc1thZGRyXSsrOworCWNoaXAtPmNvcmIuYnVmW3dwXSA9IGNwdV90b19sZTMyKHZhbCk7CisJYXp4X3dyaXRldyhjaGlwLCBDT1JCV1AsIHdwKTsKKworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSUNINl9SSVJCX0VYX1VOU09MX0VWCSgxPDw0KQorCisvKiByZXRyaWV2ZSBSSVJCIGVudHJ5IC0gY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIGF6eF91cGRhdGVfcmlyYihzdHJ1Y3QgYXp4ICpjaGlwKQoreworCXVuc2lnbmVkIGludCBycCwgd3A7CisJdW5zaWduZWQgaW50IGFkZHI7CisJdTMyIHJlcywgcmVzX2V4OworCisJd3AgPSBhenhfcmVhZHcoY2hpcCwgUklSQldQKTsKKwlpZiAod3AgPT0gMHhmZmZmKSB7CisJCS8qIHNvbWV0aGluZyB3cm9uZywgY29udHJvbGxlciBsaWtlbHkgdHVybmVkIHRvIEQzICovCisJCXJldHVybjsKKwl9CisKKwlpZiAod3AgPT0gY2hpcC0+cmlyYi53cCkKKwkJcmV0dXJuOworCWNoaXAtPnJpcmIud3AgPSB3cDsKKworCXdoaWxlIChjaGlwLT5yaXJiLnJwICE9IHdwKSB7CisJCWNoaXAtPnJpcmIucnArKzsKKwkJY2hpcC0+cmlyYi5ycCAlPSBJQ0g2X01BWF9SSVJCX0VOVFJJRVM7CisKKwkJcnAgPSBjaGlwLT5yaXJiLnJwIDw8IDE7IC8qIGFuIFJJUkIgZW50cnkgaXMgOC1ieXRlcyAqLworCQlyZXNfZXggPSBsZTMyX3RvX2NwdShjaGlwLT5yaXJiLmJ1ZltycCArIDFdKTsKKwkJcmVzID0gbGUzMl90b19jcHUoY2hpcC0+cmlyYi5idWZbcnBdKTsKKwkJYWRkciA9IHJlc19leCAmIDB4ZjsKKwkJaWYgKChhZGRyID49IEFaWF9NQVhfQ09ERUNTKSB8fCAhKGNoaXAtPmNvZGVjX21hc2sgJiAoMSA8PCBhZGRyKSkpIHsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic3B1cmlvdXMgcmVzcG9uc2UgJSN4OiUjeCwgcnAgPSAlZCwgd3AgPSAlZCIsCisJCQkJcmVzLCByZXNfZXgsCisJCQkJY2hpcC0+cmlyYi5ycCwgd3ApOworCQkJc25kX0JVRygpOworCQl9CisJCWVsc2UgaWYgKHJlc19leCAmIElDSDZfUklSQl9FWF9VTlNPTF9FVikKKwkJCXNuZF9oZGFfcXVldWVfdW5zb2xfZXZlbnQoY2hpcC0+YnVzLCByZXMsIHJlc19leCk7CisJCWVsc2UgaWYgKGNoaXAtPnJpcmIuY21kc1thZGRyXSkgeworCQkJY2hpcC0+cmlyYi5yZXNbYWRkcl0gPSByZXM7CisJCQlzbXBfd21iKCk7CisJCQljaGlwLT5yaXJiLmNtZHNbYWRkcl0tLTsKKwkJfSBlbHNlIGlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic3B1cmlvdXMgcmVzcG9uc2UgJSN4OiUjeCwgbGFzdCBjbWQ9JSMwOHhcbiIsCisJCQkJcmVzLCByZXNfZXgsCisJCQkJY2hpcC0+bGFzdF9jbWRbYWRkcl0pOworCQl9CisJfQorfQorCisvKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3JpcmJfZ2V0X3Jlc3BvbnNlKHN0cnVjdCBoZGFfYnVzICpidXMsCisJCQkJCSAgdW5zaWduZWQgaW50IGFkZHIpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGxvb3Bjb3VudGVyOworCWludCBkb19wb2xsID0gMDsKKworIGFnYWluOgorCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKKworCWZvciAobG9vcGNvdW50ZXIgPSAwOzsgbG9vcGNvdW50ZXIrKykgeworCQlpZiAoY2hpcC0+cG9sbGluZ19tb2RlIHx8IGRvX3BvbGwpIHsKKwkJCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkJCWF6eF91cGRhdGVfcmlyYihjaGlwKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCQl9CisJCWlmICghY2hpcC0+cmlyYi5jbWRzW2FkZHJdKSB7CisJCQlzbXBfcm1iKCk7CisJCQlidXMtPnJpcmJfZXJyb3IgPSAwOworCisJCQlpZiAoIWRvX3BvbGwpCisJCQkJY2hpcC0+cG9sbF9jb3VudCA9IDA7CisJCQlyZXR1cm4gY2hpcC0+cmlyYi5yZXNbYWRkcl07IC8qIHRoZSBsYXN0IHZhbHVlICovCisJCX0KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlicmVhazsKKwkJaWYgKGJ1cy0+bmVlZHNfZGFtbl9sb25nX2RlbGF5IHx8IGxvb3Bjb3VudGVyID4gMzAwMCkKKwkJCW1zbGVlcCgyKTsgLyogdGVtcG9yYXJ5IHdvcmthcm91bmQgKi8KKwkJZWxzZSB7CisJCQl1ZGVsYXkoMTApOworCQkJY29uZF9yZXNjaGVkKCk7CisJCX0KKwl9CisKKwlpZiAoIWJ1cy0+bm9fcmVzcG9uc2VfZmFsbGJhY2spCisJCXJldHVybiAtMTsKKworCWlmICghY2hpcC0+cG9sbGluZ19tb2RlICYmIGNoaXAtPnBvbGxfY291bnQgPCAyKSB7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgcG9sbGluZyB0aGUgY29kZWMgb25jZTogbGFzdCBjbWQ9MHglMDh4XG4iLAorCQkJY2hpcC0+bGFzdF9jbWRbYWRkcl0pOworCQlkb19wb2xsID0gMTsKKwkJY2hpcC0+cG9sbF9jb3VudCsrOworCQlnb3RvIGFnYWluOworCX0KKworCisJaWYgKCFjaGlwLT5wb2xsaW5nX21vZGUpIHsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJhenhfZ2V0X3Jlc3BvbnNlIHRpbWVvdXQsIHN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGU6IGxhc3QgY21kPTB4JTA4eFxuIiwKKwkJCSBjaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJCWNoaXAtPnBvbGxpbmdfbW9kZSA9IDE7CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKGNoaXAtPm1zaSkgeworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgIk5vIHJlc3BvbnNlIGZyb20gY29kZWMsIGRpc2FibGluZyBNU0k6IGxhc3QgY21kPTB4JTA4eFxuIiwKKwkJCSBjaGlwLT5sYXN0X2NtZFthZGRyXSk7CisJCWlmIChjaGlwLT5vcHMtPmRpc2FibGVfbXNpX3Jlc2V0X2lycShjaGlwKSAmJgorCQkgICAgY2hpcC0+b3BzLT5kaXNhYmxlX21zaV9yZXNldF9pcnEoY2hpcCkgPCAwKSB7CisJCQlidXMtPnJpcmJfZXJyb3IgPSAxOworCQkJcmV0dXJuIC0xOworCQl9CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKGNoaXAtPnByb2JpbmcpIHsKKwkJLyogSWYgdGhpcyBjcml0aWNhbCB0aW1lb3V0IGhhcHBlbnMgZHVyaW5nIHRoZSBjb2RlYyBwcm9iaW5nCisJCSAqIHBoYXNlLCB0aGlzIGlzIGxpa2VseSBhbiBhY2Nlc3MgdG8gYSBub24tZXhpc3RpbmcgY29kZWMKKwkJICogc2xvdC4gIEJldHRlciB0byByZXR1cm4gYW4gZXJyb3IgYW5kIHJlc2V0IHRoZSBzeXN0ZW0uCisJCSAqLworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYSBmYXRhbCBjb21tdW5pY2F0aW9uIGVycm9yOyBuZWVkIGVpdGhlciB0byByZXNldCBvciB0byBmYWxsYmFjaworCSAqIHRvIHRoZSBzaW5nbGVfY21kIG1vZGUKKwkgKi8KKwlidXMtPnJpcmJfZXJyb3IgPSAxOworCWlmIChidXMtPmFsbG93X2J1c19yZXNldCAmJiAhYnVzLT5yZXNwb25zZV9yZXNldCAmJiAhYnVzLT5pbl9yZXNldCkgeworCQlidXMtPnJlc3BvbnNlX3Jlc2V0ID0gMTsKKwkJcmV0dXJuIC0xOyAvKiBnaXZlIGEgY2hhbmNlIHRvIHJldHJ5ICovCisJfQorCisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJhenhfZ2V0X3Jlc3BvbnNlIHRpbWVvdXQsIHN3aXRjaGluZyB0byBzaW5nbGVfY21kIG1vZGU6IGxhc3QgY21kPTB4JTA4eFxuIiwKKwkJY2hpcC0+bGFzdF9jbWRbYWRkcl0pOworCWNoaXAtPnNpbmdsZV9jbWQgPSAxOworCWJ1cy0+cmVzcG9uc2VfcmVzZXQgPSAwOworCS8qIHJlbGVhc2UgQ09SQi9SSVJCICovCisJYXp4X2ZyZWVfY21kX2lvKGNoaXApOworCS8qIGRpc2FibGUgdW5zb2xpY2l0ZWQgcmVzcG9uc2VzICovCisJYXp4X3dyaXRlbChjaGlwLCBHQ1RMLCBhenhfcmVhZGwoY2hpcCwgR0NUTCkgJiB+SUNINl9HQ1RMX1VOU09MKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBVc2UgdGhlIHNpbmdsZSBpbW1lZGlhdGUgY29tbWFuZCBpbnN0ZWFkIG9mIENPUkIvUklSQiBmb3Igc2ltcGxpY2l0eQorICoKKyAqIE5vdGU6IGFjY29yZGluZyB0byBJbnRlbCwgdGhpcyBpcyBub3QgcHJlZmVycmVkIHVzZS4gIFRoZSBjb21tYW5kIHdhcworICogICAgICAgaW50ZW5kZWQgZm9yIHRoZSBCSU9TIG9ubHksIGFuZCBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggdW5zb2xpY2l0ZWQKKyAqICAgICAgIHJlc3BvbnNlcy4gIFNvLCB3ZSBzaG91bGRuJ3QgdXNlIGl0IGZvciBub3JtYWwgb3BlcmF0aW9uIGZyb20gdGhlCisgKiAgICAgICBkcml2ZXIuCisgKiAgICAgICBJIGxlZnQgdGhlIGNvZGVzLCBob3dldmVyLCBmb3IgZGVidWdnaW5nL3Rlc3RpbmcgcHVycG9zZXMuCisgKi8KKworLyogcmVjZWl2ZSBhIHJlc3BvbnNlICovCitzdGF0aWMgaW50IGF6eF9zaW5nbGVfd2FpdF9mb3JfcmVzcG9uc2Uoc3RydWN0IGF6eCAqY2hpcCwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJaW50IHRpbWVvdXQgPSA1MDsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJLyogY2hlY2sgSVJWIGJ1c3kgYml0ICovCisJCWlmIChhenhfcmVhZHcoY2hpcCwgSVJTKSAmIElDSDZfSVJTX1ZBTElEKSB7CisJCQkvKiByZXVzZSByaXJiLnJlcyBhcyB0aGUgcmVzcG9uc2UgcmV0dXJuIHZhbHVlICovCisJCQljaGlwLT5yaXJiLnJlc1thZGRyXSA9IGF6eF9yZWFkbChjaGlwLCBJUik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZ2V0X3Jlc3BvbnNlIHRpbWVvdXQ6IElSUz0weCV4XG4iLAorCQkJYXp4X3JlYWR3KGNoaXAsIElSUykpOworCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gLTE7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qIHNlbmQgYSBjb21tYW5kICovCitzdGF0aWMgaW50IGF6eF9zaW5nbGVfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGFkZHIgPSBhenhfY29tbWFuZF9hZGRyKHZhbCk7CisJaW50IHRpbWVvdXQgPSA1MDsKKworCWJ1cy0+cmlyYl9lcnJvciA9IDA7CisJd2hpbGUgKHRpbWVvdXQtLSkgeworCQkvKiBjaGVjayBJQ0IgYnVzeSBiaXQgKi8KKwkJaWYgKCEoKGF6eF9yZWFkdyhjaGlwLCBJUlMpICYgSUNINl9JUlNfQlVTWSkpKSB7CisJCQkvKiBDbGVhciBJUlYgdmFsaWQgYml0ICovCisJCQlhenhfd3JpdGV3KGNoaXAsIElSUywgYXp4X3JlYWR3KGNoaXAsIElSUykgfAorCQkJCSAgIElDSDZfSVJTX1ZBTElEKTsKKwkJCWF6eF93cml0ZWwoY2hpcCwgSUMsIHZhbCk7CisJCQlhenhfd3JpdGV3KGNoaXAsIElSUywgYXp4X3JlYWR3KGNoaXAsIElSUykgfAorCQkJCSAgIElDSDZfSVJTX0JVU1kpOworCQkJcmV0dXJuIGF6eF9zaW5nbGVfd2FpdF9mb3JfcmVzcG9uc2UoY2hpcCwgYWRkcik7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKwlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzZW5kX2NtZCB0aW1lb3V0OiBJUlM9MHgleCwgdmFsPTB4JXhcbiIsCisJCQlhenhfcmVhZHcoY2hpcCwgSVJTKSwgdmFsKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogcmVjZWl2ZSBhIHJlc3BvbnNlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF6eF9zaW5nbGVfZ2V0X3Jlc3BvbnNlKHN0cnVjdCBoZGFfYnVzICpidXMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGNoaXAtPnJpcmIucmVzW2FkZHJdOworfQorCisvKgorICogVGhlIGJlbG93IGFyZSB0aGUgbWFpbiBjYWxsYmFja3MgZnJvbSBoZGFfY29kZWMuCisgKgorICogVGhleSBhcmUganVzdCB0aGUgc2tlbGV0b24gdG8gY2FsbCBzdWItY2FsbGJhY2tzIGFjY29yZGluZyB0byB0aGUKKyAqIGN1cnJlbnQgc2V0dGluZyBvZiBjaGlwLT5zaW5nbGVfY21kLgorICovCisKKy8qIHNlbmQgYSBjb21tYW5kICovCitzdGF0aWMgaW50IGF6eF9zZW5kX2NtZChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKworCWlmIChjaGlwLT5kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJY2hpcC0+bGFzdF9jbWRbYXp4X2NvbW1hbmRfYWRkcih2YWwpXSA9IHZhbDsKKwlpZiAoY2hpcC0+c2luZ2xlX2NtZCkKKwkJcmV0dXJuIGF6eF9zaW5nbGVfc2VuZF9jbWQoYnVzLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIGF6eF9jb3JiX3NlbmRfY21kKGJ1cywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9zZW5kX2NtZCk7CisKKy8qIGdldCBhIHJlc3BvbnNlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF6eF9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBhZGRyKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hpcC0+ZGlzYWJsZWQpCisJCXJldHVybiAwOworCWlmIChjaGlwLT5zaW5nbGVfY21kKQorCQlyZXR1cm4gYXp4X3NpbmdsZV9nZXRfcmVzcG9uc2UoYnVzLCBhZGRyKTsKKwllbHNlCisJCXJldHVybiBhenhfcmlyYl9nZXRfcmVzcG9uc2UoYnVzLCBhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9nZXRfcmVzcG9uc2UpOworCisjaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgorLyoKKyAqIERTUCBsb2FkaW5nIGNvZGUgKGUuZy4gZm9yIENBMDEzMikKKyAqLworCisvKiB1c2UgdGhlIGZpcnN0IHN0cmVhbSBmb3IgbG9hZGluZyBEU1AgKi8KK3N0YXRpYyBzdHJ1Y3QgYXp4X2RldiAqCithenhfZ2V0X2RzcF9sb2FkZXJfZGV2KHN0cnVjdCBhenggKmNoaXApCit7CisJcmV0dXJuICZjaGlwLT5henhfZGV2W2NoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldF07Cit9CisKK3N0YXRpYyBpbnQgYXp4X2xvYWRfZHNwX3ByZXBhcmUoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQl1bnNpZ25lZCBpbnQgYnl0ZV9zaXplLAorCQkJCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmcCkKK3sKKwl1MzIgKmJkbDsKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7CisJaW50IGVycjsKKworCWF6eF9kZXYgPSBhenhfZ2V0X2RzcF9sb2FkZXJfZGV2KGNoaXApOworCisJZHNwX2xvY2soYXp4X2Rldik7CisJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCWlmIChhenhfZGV2LT5ydW5uaW5nIHx8IGF6eF9kZXYtPmxvY2tlZCkgeworCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIHVubG9jazsKKwl9CisJYXp4X2Rldi0+cHJlcGFyZWQgPSAwOworCWNoaXAtPnNhdmVkX2F6eF9kZXYgPSAqYXp4X2RldjsKKwlhenhfZGV2LT5sb2NrZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCisJZXJyID0gY2hpcC0+b3BzLT5kbWFfYWxsb2NfcGFnZXMoY2hpcCwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkgYnl0ZV9zaXplLCBidWZwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfYWxsb2M7CisKKwlhenhfZGV2LT5idWZzaXplID0gYnl0ZV9zaXplOworCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IGJ5dGVfc2l6ZTsKKwlhenhfZGV2LT5mb3JtYXRfdmFsID0gZm9ybWF0OworCisJYXp4X3N0cmVhbV9yZXNldChjaGlwLCBhenhfZGV2KTsKKworCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQTCwgMCk7CisJYXp4X3NkX3dyaXRlbChjaGlwLCBhenhfZGV2LCBTRF9CRExQVSwgMCk7CisKKwlhenhfZGV2LT5mcmFncyA9IDA7CisJYmRsID0gKHUzMiAqKWF6eF9kZXYtPmJkbC5hcmVhOworCWVyciA9IHNldHVwX2JkbGUoY2hpcCwgYnVmcCwgYXp4X2RldiwgJmJkbCwgMCwgYnl0ZV9zaXplLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWF6eF9zZXR1cF9jb250cm9sbGVyKGNoaXAsIGF6eF9kZXYpOworCWRzcF91bmxvY2soYXp4X2Rldik7CisJcmV0dXJuIGF6eF9kZXYtPnN0cmVhbV90YWc7CisKKyBlcnJvcjoKKwljaGlwLT5vcHMtPmRtYV9mcmVlX3BhZ2VzKGNoaXAsIGJ1ZnApOworIGVycl9hbGxvYzoKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKGF6eF9kZXYtPm9wZW5lZCkKKwkJKmF6eF9kZXYgPSBjaGlwLT5zYXZlZF9henhfZGV2OworCWF6eF9kZXYtPmxvY2tlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisgdW5sb2NrOgorCWRzcF91bmxvY2soYXp4X2Rldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX3RyaWdnZXIoc3RydWN0IGhkYV9idXMgKmJ1cywgYm9vbCBzdGFydCkKK3sKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBhenhfZ2V0X2RzcF9sb2FkZXJfZGV2KGNoaXApOworCisJaWYgKHN0YXJ0KQorCQlhenhfc3RyZWFtX3N0YXJ0KGNoaXAsIGF6eF9kZXYpOworCWVsc2UKKwkJYXp4X3N0cmVhbV9zdG9wKGNoaXAsIGF6eF9kZXYpOworCWF6eF9kZXYtPnJ1bm5pbmcgPSBzdGFydDsKK30KKworc3RhdGljIHZvaWQgYXp4X2xvYWRfZHNwX2NsZWFudXAoc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCQkgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGF6eF9nZXRfZHNwX2xvYWRlcl9kZXYoY2hpcCk7CisKKwlpZiAoIWRtYWItPmFyZWEgfHwgIWF6eF9kZXYtPmxvY2tlZCkKKwkJcmV0dXJuOworCisJZHNwX2xvY2soYXp4X2Rldik7CisJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKKwlhenhfc2Rfd3JpdGVsKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCwgMCk7CisJYXp4X2Rldi0+YnVmc2l6ZSA9IDA7CisJYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gMDsKKwlhenhfZGV2LT5mb3JtYXRfdmFsID0gMDsKKworCWNoaXAtPm9wcy0+ZG1hX2ZyZWVfcGFnZXMoY2hpcCwgZG1hYik7CisJZG1hYi0+YXJlYSA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJaWYgKGF6eF9kZXYtPm9wZW5lZCkKKwkJKmF6eF9kZXYgPSBjaGlwLT5zYXZlZF9henhfZGV2OworCWF6eF9kZXYtPmxvY2tlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJZHNwX3VubG9jayhhenhfZGV2KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSICovCisKK2ludCBhenhfYWxsb2Nfc3RyZWFtX3BhZ2VzKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IGksIGVycjsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjaGlwLT5jYXJkOworCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJZHNwX2xvY2tfaW5pdCgmY2hpcC0+YXp4X2RldltpXSk7CisJCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEJETCBmb3IgZWFjaCBzdHJlYW0gKi8KKwkJZXJyID0gY2hpcC0+b3BzLT5kbWFfYWxsb2NfcGFnZXMoY2hpcCwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkJIEJETF9TSVpFLAorCQkJCQkJICZjaGlwLT5henhfZGV2W2ldLmJkbCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBCRExcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcG9zaXRpb24gYnVmZmVyICovCisJZXJyID0gY2hpcC0+b3BzLT5kbWFfYWxsb2NfcGFnZXMoY2hpcCwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgY2hpcC0+bnVtX3N0cmVhbXMgKiA4LCAmY2hpcC0+cG9zYnVmKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBwb3NidWZcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBDT1JCL1JJUkIgKi8KKwllcnIgPSBhenhfYWxsb2NfY21kX2lvKGNoaXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2FsbG9jX3N0cmVhbV9wYWdlcyk7CisKK3ZvaWQgYXp4X2ZyZWVfc3RyZWFtX3BhZ2VzKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IGk7CisJaWYgKGNoaXAtPmF6eF9kZXYpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspCisJCQlpZiAoY2hpcC0+YXp4X2RldltpXS5iZGwuYXJlYSkKKwkJCQljaGlwLT5vcHMtPmRtYV9mcmVlX3BhZ2VzKAorCQkJCQljaGlwLCAmY2hpcC0+YXp4X2RldltpXS5iZGwpOworCX0KKwlpZiAoY2hpcC0+cmIuYXJlYSkKKwkJY2hpcC0+b3BzLT5kbWFfZnJlZV9wYWdlcyhjaGlwLCAmY2hpcC0+cmIpOworCWlmIChjaGlwLT5wb3NidWYuYXJlYSkKKwkJY2hpcC0+b3BzLT5kbWFfZnJlZV9wYWdlcyhjaGlwLCAmY2hpcC0+cG9zYnVmKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9mcmVlX3N0cmVhbV9wYWdlcyk7CisKKy8qCisgKiBMb3dsZXZlbCBpbnRlcmZhY2UKKyAqLworCisvKiBlbnRlciBsaW5rIHJlc2V0ICovCit2b2lkIGF6eF9lbnRlcl9saW5rX3Jlc2V0KHN0cnVjdCBhenggKmNoaXApCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogcmVzZXQgY29udHJvbGxlciAqLworCWF6eF93cml0ZWwoY2hpcCwgR0NUTCwgYXp4X3JlYWRsKGNoaXAsIEdDVEwpICYgfklDSDZfR0NUTF9SRVNFVCk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwl3aGlsZSAoKGF6eF9yZWFkYihjaGlwLCBHQ1RMKSAmIElDSDZfR0NUTF9SRVNFVCkgJiYKKwkJCXRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQl1c2xlZXBfcmFuZ2UoNTAwLCAxMDAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9lbnRlcl9saW5rX3Jlc2V0KTsKKworLyogZXhpdCBsaW5rIHJlc2V0ICovCitzdGF0aWMgdm9pZCBhenhfZXhpdF9saW5rX3Jlc2V0KHN0cnVjdCBhenggKmNoaXApCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJYXp4X3dyaXRlYihjaGlwLCBHQ1RMLCBhenhfcmVhZGIoY2hpcCwgR0NUTCkgfCBJQ0g2X0dDVExfUkVTRVQpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJd2hpbGUgKCFhenhfcmVhZGIoY2hpcCwgR0NUTCkgJiYKKwkJCXRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQl1c2xlZXBfcmFuZ2UoNTAwLCAxMDAwKTsKK30KKworLyogcmVzZXQgY29kZWMgbGluayAqLworc3RhdGljIGludCBhenhfcmVzZXQoc3RydWN0IGF6eCAqY2hpcCwgaW50IGZ1bGxfcmVzZXQpCit7CisJaWYgKCFmdWxsX3Jlc2V0KQorCQlnb3RvIF9fc2tpcDsKKworCS8qIGNsZWFyIFNUQVRFU1RTICovCisJYXp4X3dyaXRldyhjaGlwLCBTVEFURVNUUywgU1RBVEVTVFNfSU5UX01BU0spOworCisJLyogcmVzZXQgY29udHJvbGxlciAqLworCWF6eF9lbnRlcl9saW5rX3Jlc2V0KGNoaXApOworCisJLyogZGVsYXkgZm9yID49IDEwMHVzIGZvciBjb2RlYyBQTEwgdG8gc2V0dGxlIHBlciBzcGVjCisJICogUmV2IDAuOSBzZWN0aW9uIDUuNS4xCisJICovCisJdXNsZWVwX3JhbmdlKDUwMCwgMTAwMCk7CisKKwkvKiBCcmluZyBjb250cm9sbGVyIG91dCBvZiByZXNldCAqLworCWF6eF9leGl0X2xpbmtfcmVzZXQoY2hpcCk7CisKKwkvKiBCcmVudCBDaGFydHJhbmQgc2FpZCB0byB3YWl0ID49IDU0MHVzIGZvciBjb2RlY3MgdG8gaW5pdGlhbGl6ZSAqLworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMjAwKTsKKworICAgICAgX19za2lwOgorCS8qIGNoZWNrIHRvIHNlZSBpZiBjb250cm9sbGVyIGlzIHJlYWR5ICovCisJaWYgKCFhenhfcmVhZGIoY2hpcCwgR0NUTCkpIHsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhenhfcmVzZXQ6IGNvbnRyb2xsZXIgbm90IHJlYWR5IVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogQWNjZXB0IHVuc29saWNpdGVkIHJlc3BvbnNlcyAqLworCWlmICghY2hpcC0+c2luZ2xlX2NtZCkKKwkJYXp4X3dyaXRlbChjaGlwLCBHQ1RMLCBhenhfcmVhZGwoY2hpcCwgR0NUTCkgfAorCQkJICAgSUNINl9HQ1RMX1VOU09MKTsKKworCS8qIGRldGVjdCBjb2RlY3MgKi8KKwlpZiAoIWNoaXAtPmNvZGVjX21hc2spIHsKKwkJY2hpcC0+Y29kZWNfbWFzayA9IGF6eF9yZWFkdyhjaGlwLCBTVEFURVNUUyk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWNfbWFzayA9IDB4JXhcbiIsCisJCQljaGlwLT5jb2RlY19tYXNrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5hYmxlIGludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkIGF6eF9pbnRfZW5hYmxlKHN0cnVjdCBhenggKmNoaXApCit7CisJLyogZW5hYmxlIGNvbnRyb2xsZXIgQ0lFIGFuZCBHSUUgKi8KKwlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgfAorCQkgICBJQ0g2X0lOVF9DVFJMX0VOIHwgSUNINl9JTlRfR0xPQkFMX0VOKTsKK30KKworLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZCBhenhfaW50X2Rpc2FibGUoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgaTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBpbiBzdHJlYW0gZGVzY3JpcHRvciAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7CisJCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07CisJCWF6eF9zZF93cml0ZWIoY2hpcCwgYXp4X2RldiwgU0RfQ1RMLAorCQkJICAgICAgYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX0NUTCkgJgorCQkJCQl+U0RfSU5UX01BU0spOworCX0KKworCS8qIGRpc2FibGUgU0lFIGZvciBhbGwgc3RyZWFtcyAqLworCWF6eF93cml0ZWIoY2hpcCwgSU5UQ1RMLCAwKTsKKworCS8qIGRpc2FibGUgY29udHJvbGxlciBDSUUgYW5kIEdJRSAqLworCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLCBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSAmCisJCSAgIH4oSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0dMT0JBTF9FTikpOworfQorCisvKiBjbGVhciBpbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZCBhenhfaW50X2NsZWFyKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IGk7CisKKwkvKiBjbGVhciBzdHJlYW0gc3RhdHVzICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKKwkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKKwkJYXp4X3NkX3dyaXRlYihjaGlwLCBhenhfZGV2LCBTRF9TVFMsIFNEX0lOVF9NQVNLKTsKKwl9CisKKwkvKiBjbGVhciBTVEFURVNUUyAqLworCWF6eF93cml0ZXcoY2hpcCwgU1RBVEVTVFMsIFNUQVRFU1RTX0lOVF9NQVNLKTsKKworCS8qIGNsZWFyIHJpcmIgc3RhdHVzICovCisJYXp4X3dyaXRlYihjaGlwLCBSSVJCU1RTLCBSSVJCX0lOVF9NQVNLKTsKKworCS8qIGNsZWFyIGludCBzdGF0dXMgKi8KKwlhenhfd3JpdGVsKGNoaXAsIElOVFNUUywgSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0FMTF9TVFJFQU0pOworfQorCisvKgorICogcmVzZXQgYW5kIHN0YXJ0IHRoZSBjb250cm9sbGVyIHJlZ2lzdGVycworICovCit2b2lkIGF6eF9pbml0X2NoaXAoc3RydWN0IGF6eCAqY2hpcCwgaW50IGZ1bGxfcmVzZXQpCit7CisJaWYgKGNoaXAtPmluaXRpYWxpemVkKQorCQlyZXR1cm47CisKKwkvKiByZXNldCBjb250cm9sbGVyICovCisJYXp4X3Jlc2V0KGNoaXAsIGZ1bGxfcmVzZXQpOworCisJLyogaW5pdGlhbGl6ZSBpbnRlcnJ1cHRzICovCisJYXp4X2ludF9jbGVhcihjaGlwKTsKKwlhenhfaW50X2VuYWJsZShjaGlwKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGNvZGVjIGNvbW1hbmQgSS9PICovCisJaWYgKCFjaGlwLT5zaW5nbGVfY21kKQorCQlhenhfaW5pdF9jbWRfaW8oY2hpcCk7CisKKwkvKiBwcm9ncmFtIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KKwlhenhfd3JpdGVsKGNoaXAsIERQTEJBU0UsICh1MzIpY2hpcC0+cG9zYnVmLmFkZHIpOworCWF6eF93cml0ZWwoY2hpcCwgRFBVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5wb3NidWYuYWRkcikpOworCisJY2hpcC0+aW5pdGlhbGl6ZWQgPSAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2luaXRfY2hpcCk7CisKK3ZvaWQgYXp4X3N0b3BfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwKQoreworCWlmICghY2hpcC0+aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWF6eF9pbnRfZGlzYWJsZShjaGlwKTsKKwlhenhfaW50X2NsZWFyKGNoaXApOworCisJLyogZGlzYWJsZSBDT1JCL1JJUkIgKi8KKwlhenhfZnJlZV9jbWRfaW8oY2hpcCk7CisKKwkvKiBkaXNhYmxlIHBvc2l0aW9uIGJ1ZmZlciAqLworCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwgMCk7CisJYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCAwKTsKKworCWNoaXAtPmluaXRpYWxpemVkID0gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9zdG9wX2NoaXApOworCisvKgorICogaW50ZXJydXB0IGhhbmRsZXIKKyAqLworaXJxcmV0dXJuX3QgYXp4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGF6eCAqY2hpcCA9IGRldl9pZDsKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKKwl1MzIgc3RhdHVzOworCXU4IHNkX3N0YXR1czsKKwlpbnQgaTsKKworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BNX1JVTlRJTUUpCisJCWlmIChjaGlwLT5jYXJkLT5kZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzICE9IFJQTV9BQ1RJVkUpCisJCQlyZXR1cm4gSVJRX05PTkU7CisjZW5kaWYKKworCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJaWYgKGNoaXAtPmRpc2FibGVkKSB7CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzdGF0dXMgPSBhenhfcmVhZGwoY2hpcCwgSU5UU1RTKTsKKwlpZiAoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IDB4ZmZmZmZmZmYpIHsKKwkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7CisJCWF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKKwkJaWYgKHN0YXR1cyAmIGF6eF9kZXYtPnNkX2ludF9zdGFfbWFzaykgeworCQkJc2Rfc3RhdHVzID0gYXp4X3NkX3JlYWRiKGNoaXAsIGF6eF9kZXYsIFNEX1NUUyk7CisJCQlhenhfc2Rfd3JpdGViKGNoaXAsIGF6eF9kZXYsIFNEX1NUUywgU0RfSU5UX01BU0spOworCQkJaWYgKCFhenhfZGV2LT5zdWJzdHJlYW0gfHwgIWF6eF9kZXYtPnJ1bm5pbmcgfHwKKwkJCSAgICAhKHNkX3N0YXR1cyAmIFNEX0lOVF9DT01QTEVURSkpCisJCQkJY29udGludWU7CisJCQkvKiBjaGVjayB3aGV0aGVyIHRoaXMgSVJRIGlzIHJlYWxseSBhY2NlcHRhYmxlICovCisJCQlpZiAoIWNoaXAtPm9wcy0+cG9zaXRpb25fY2hlY2sgfHwKKwkJCSAgICBjaGlwLT5vcHMtPnBvc2l0aW9uX2NoZWNrKGNoaXAsIGF6eF9kZXYpKSB7CisJCQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGF6eF9kZXYtPnN1YnN0cmVhbSk7CisJCQkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjbGVhciByaXJiIGludCAqLworCXN0YXR1cyA9IGF6eF9yZWFkYihjaGlwLCBSSVJCU1RTKTsKKwlpZiAoc3RhdHVzICYgUklSQl9JTlRfTUFTSykgeworCQlpZiAoc3RhdHVzICYgUklSQl9JTlRfUkVTUE9OU0UpIHsKKwkJCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSkKKwkJCQl1ZGVsYXkoODApOworCQkJYXp4X3VwZGF0ZV9yaXJiKGNoaXApOworCQl9CisJCWF6eF93cml0ZWIoY2hpcCwgUklSQlNUUywgUklSQl9JTlRfTUFTSyk7CisJfQorCisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9pbnRlcnJ1cHQpOworCisvKgorICogQ29kZWMgaW5pdGVyZmFjZQorICovCisKKy8qCisgKiBQcm9iZSB0aGUgZ2l2ZW4gY29kZWMgYWRkcmVzcworICovCitzdGF0aWMgaW50IHByb2JlX2NvZGVjKHN0cnVjdCBhenggKmNoaXAsIGludCBhZGRyKQoreworCXVuc2lnbmVkIGludCBjbWQgPSAoYWRkciA8PCAyOCkgfCAoQUNfTk9ERV9ST09UIDw8IDIwKSB8CisJCShBQ19WRVJCX1BBUkFNRVRFUlMgPDwgOCkgfCBBQ19QQVJfVkVORE9SX0lEOworCXVuc2lnbmVkIGludCByZXM7CisKKwltdXRleF9sb2NrKCZjaGlwLT5idXMtPmNtZF9tdXRleCk7CisJY2hpcC0+cHJvYmluZyA9IDE7CisJYXp4X3NlbmRfY21kKGNoaXAtPmJ1cywgY21kKTsKKwlyZXMgPSBhenhfZ2V0X3Jlc3BvbnNlKGNoaXAtPmJ1cywgYWRkcik7CisJY2hpcC0+cHJvYmluZyA9IDA7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5idXMtPmNtZF9tdXRleCk7CisJaWYgKHJlcyA9PSAtMSkKKwkJcmV0dXJuIC1FSU87CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJjb2RlYyAjJWQgcHJvYmVkIE9LXG4iLCBhZGRyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXp4X2J1c19yZXNldChzdHJ1Y3QgaGRhX2J1cyAqYnVzKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKworCWJ1cy0+aW5fcmVzZXQgPSAxOworCWF6eF9zdG9wX2NoaXAoY2hpcCk7CisJYXp4X2luaXRfY2hpcChjaGlwLCAxKTsKKyNpZmRlZiBDT05GSUdfUE0KKwlpZiAoY2hpcC0+aW5pdGlhbGl6ZWQpIHsKKwkJc3RydWN0IGF6eF9wY20gKnA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNoaXAtPnBjbV9saXN0LCBsaXN0KQorCQkJc25kX3BjbV9zdXNwZW5kX2FsbChwLT5wY20pOworCQlzbmRfaGRhX3N1c3BlbmQoY2hpcC0+YnVzKTsKKwkJc25kX2hkYV9yZXN1bWUoY2hpcC0+YnVzKTsKKwl9CisjZW5kaWYKKwlidXMtPmluX3Jlc2V0ID0gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyogcG93ZXItdXAvZG93biB0aGUgY29udHJvbGxlciAqLworc3RhdGljIHZvaWQgYXp4X3Bvd2VyX25vdGlmeShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHBvd2VyX3VwKQoreworCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKKworCWlmICghKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BNX1JVTlRJTUUpKQorCQlyZXR1cm47CisKKwlpZiAocG93ZXJfdXApCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoY2hpcC0+Y2FyZC0+ZGV2KTsKKwllbHNlCisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoY2hpcC0+Y2FyZC0+ZGV2KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdldF9qYWNrcG9sbF9pbnRlcnZhbChzdHJ1Y3QgYXp4ICpjaGlwKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBqOworCisJaWYgKCFjaGlwLT5qYWNrcG9sbF9tcykKKwkJcmV0dXJuIDA7CisKKwlpID0gY2hpcC0+amFja3BvbGxfbXNbY2hpcC0+ZGV2X2luZGV4XTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoaSA8IDUwIHx8IGkgPiA2MDAwMCkKKwkJaiA9IDA7CisJZWxzZQorCQlqID0gbXNlY3NfdG9famlmZmllcyhpKTsKKwlpZiAoaiA9PSAwKQorCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgImphY2twb2xsX21zIHZhbHVlIG91dCBvZiByYW5nZTogJWRcbiIsIGkpOworCXJldHVybiBqOworfQorCisvKiBDb2RlYyBpbml0aWFsaXphdGlvbiAqLworaW50IGF6eF9jb2RlY19jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCwgY29uc3QgY2hhciAqbW9kZWwsCisJCSAgICAgdW5zaWduZWQgaW50IG1heF9zbG90cywKKwkJICAgICBpbnQgKnBvd2VyX3NhdmVfdG8pCit7CisJc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgYnVzX3RlbXA7CisJaW50IGMsIGNvZGVjcywgZXJyOworCisJbWVtc2V0KCZidXNfdGVtcCwgMCwgc2l6ZW9mKGJ1c190ZW1wKSk7CisJYnVzX3RlbXAucHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlidXNfdGVtcC5tb2RlbG5hbWUgPSBtb2RlbDsKKwlidXNfdGVtcC5wY2kgPSBjaGlwLT5wY2k7CisJYnVzX3RlbXAub3BzLmNvbW1hbmQgPSBhenhfc2VuZF9jbWQ7CisJYnVzX3RlbXAub3BzLmdldF9yZXNwb25zZSA9IGF6eF9nZXRfcmVzcG9uc2U7CisJYnVzX3RlbXAub3BzLmF0dGFjaF9wY20gPSBhenhfYXR0YWNoX3BjbV9zdHJlYW07CisJYnVzX3RlbXAub3BzLmJ1c19yZXNldCA9IGF6eF9idXNfcmVzZXQ7CisjaWZkZWYgQ09ORklHX1BNCisJYnVzX3RlbXAucG93ZXJfc2F2ZSA9IHBvd2VyX3NhdmVfdG87CisJYnVzX3RlbXAub3BzLnBtX25vdGlmeSA9IGF6eF9wb3dlcl9ub3RpZnk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCisJYnVzX3RlbXAub3BzLmxvYWRfZHNwX3ByZXBhcmUgPSBhenhfbG9hZF9kc3BfcHJlcGFyZTsKKwlidXNfdGVtcC5vcHMubG9hZF9kc3BfdHJpZ2dlciA9IGF6eF9sb2FkX2RzcF90cmlnZ2VyOworCWJ1c190ZW1wLm9wcy5sb2FkX2RzcF9jbGVhbnVwID0gYXp4X2xvYWRfZHNwX2NsZWFudXA7CisjZW5kaWYKKworCWVyciA9IHNuZF9oZGFfYnVzX25ldyhjaGlwLT5jYXJkLCAmYnVzX3RlbXAsICZjaGlwLT5idXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1JJUkJfREVMQVkpIHsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJFbmFibGUgZGVsYXkgaW4gUklSQiBoYW5kbGluZ1xuIik7CisJCWNoaXAtPmJ1cy0+bmVlZHNfZGFtbl9sb25nX2RlbGF5ID0gMTsKKwl9CisKKwljb2RlY3MgPSAwOworCWlmICghbWF4X3Nsb3RzKQorCQltYXhfc2xvdHMgPSBBWlhfREVGQVVMVF9DT0RFQ1M7CisKKwkvKiBGaXJzdCB0cnkgdG8gcHJvYmUgYWxsIGdpdmVuIGNvZGVjIHNsb3RzICovCisJZm9yIChjID0gMDsgYyA8IG1heF9zbG90czsgYysrKSB7CisJCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIGNoaXAtPmNvZGVjX3Byb2JlX21hc2spIHsKKwkJCWlmIChwcm9iZV9jb2RlYyhjaGlwLCBjKSA8IDApIHsKKwkJCQkvKiBTb21lIEJJT1NlbiBnaXZlIHlvdSB3cm9uZyBjb2RlYyBhZGRyZXNzZXMKKwkJCQkgKiB0aGF0IGRvbid0IGV4aXN0CisJCQkJICovCisJCQkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkgIkNvZGVjICMlZCBwcm9iZSBlcnJvcjsgZGlzYWJsaW5nIGl0Li4uXG4iLCBjKTsKKwkJCQljaGlwLT5jb2RlY19tYXNrICY9IH4oMSA8PCBjKTsKKwkJCQkvKiBNb3JlIGJhZGx5LCBhY2Nlc3NpbmcgdG8gYSBub24tZXhpc3RpbmcKKwkJCQkgKiBjb2RlYyBvZnRlbiBzY3Jld3MgdXAgdGhlIGNvbnRyb2xsZXIgY2hpcCwKKwkJCQkgKiBhbmQgZGlzdHVyYnMgdGhlIGZ1cnRoZXIgY29tbXVuaWNhdGlvbnMuCisJCQkJICogVGh1cyBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHByb2JpbmcsCisJCQkJICogYmV0dGVyIHRvIHJlc2V0IHRoZSBjb250cm9sbGVyIGNoaXAgdG8KKwkJCQkgKiBnZXQgYmFjayB0byB0aGUgc2FuaXR5IHN0YXRlLgorCQkJCSAqLworCQkJCWF6eF9zdG9wX2NoaXAoY2hpcCk7CisJCQkJYXp4X2luaXRfY2hpcChjaGlwLCAxKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEFNRCBjaGlwc2V0cyBvZnRlbiBjYXVzZSB0aGUgY29tbXVuaWNhdGlvbiBzdGFsbHMgdXBvbiBjZXJ0YWluCisJICogc2VxdWVuY2UgbGlrZSB0aGUgcGluLWRldGVjdGlvbi4gIEl0IHNlZW1zIHRoYXQgZm9yY2luZyB0aGUgc3luY2VkCisJICogYWNjZXNzIHdvcmtzIGFyb3VuZCB0aGUgc3RhbGwuICBHcnJyLi4uCisJICovCisJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1NZTkNfV1JJVEUpIHsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJFbmFibGUgc3luY193cml0ZSBmb3Igc3RhYmxlIGNvbW11bmljYXRpb25cbiIpOworCQljaGlwLT5idXMtPnN5bmNfd3JpdGUgPSAxOworCQljaGlwLT5idXMtPmFsbG93X2J1c19yZXNldCA9IDE7CisJfQorCisJLyogVGhlbiBjcmVhdGUgY29kZWMgaW5zdGFuY2VzICovCisJZm9yIChjID0gMDsgYyA8IG1heF9zbG90czsgYysrKSB7CisJCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIGNoaXAtPmNvZGVjX3Byb2JlX21hc2spIHsKKwkJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCQkJZXJyID0gc25kX2hkYV9jb2RlY19uZXcoY2hpcC0+YnVzLCBjLCAmY29kZWMpOworCQkJaWYgKGVyciA8IDApCisJCQkJY29udGludWU7CisJCQljb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwgPSBnZXRfamFja3BvbGxfaW50ZXJ2YWwoY2hpcCk7CisJCQljb2RlYy0+YmVlcF9tb2RlID0gY2hpcC0+YmVlcF9tb2RlOworCQkJY29kZWNzKys7CisJCX0KKwl9CisJaWYgKCFjb2RlY3MpIHsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJubyBjb2RlY3MgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGF6eF9jb2RlY19jcmVhdGUpOworCisvKiBjb25maWd1cmUgZWFjaCBjb2RlYyBpbnN0YW5jZSAqLworaW50IGF6eF9jb2RlY19jb25maWd1cmUoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmY2hpcC0+YnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CisJCXNuZF9oZGFfY29kZWNfY29uZmlndXJlKGNvZGVjKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhenhfY29kZWNfY29uZmlndXJlKTsKKworLyogbWl4ZXIgY3JlYXRpb24gLSBhbGwgc3R1ZmYgaXMgaW1wbGVtZW50ZWQgaW4gaGRhIG1vZHVsZSAqLworaW50IGF6eF9taXhlcl9jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlyZXR1cm4gc25kX2hkYV9idWlsZF9jb250cm9scyhjaGlwLT5idXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X21peGVyX2NyZWF0ZSk7CisKKworLyogaW5pdGlhbGl6ZSBTRCBzdHJlYW1zICovCitpbnQgYXp4X2luaXRfc3RyZWFtKHN0cnVjdCBhenggKmNoaXApCit7CisJaW50IGk7CisKKwkvKiBpbml0aWFsaXplIGVhY2ggc3RyZWFtIChha2EgZGV2aWNlKQorCSAqIGFzc2lnbiB0aGUgc3RhcnRpbmcgYmRsIGFkZHJlc3MgdG8gZWFjaCBzdHJlYW0gKGRldmljZSkKKwkgKiBhbmQgaW5pdGlhbGl6ZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7CisJCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07CisJCWF6eF9kZXYtPnBvc2J1ZiA9ICh1MzIgX19pb21lbSAqKShjaGlwLT5wb3NidWYuYXJlYSArIGkgKiA4KTsKKwkJLyogb2Zmc2V0OiBTREkwPTB4ODAsIFNESTE9MHhhMCwgLi4uIFNETzM9MHgxNjAgKi8KKwkJYXp4X2Rldi0+c2RfYWRkciA9IGNoaXAtPnJlbWFwX2FkZHIgKyAoMHgyMCAqIGkgKyAweDgwKTsKKwkJLyogaW50IG1hc2s6IFNESTA9MHgwMSwgU0RJMT0weDAyLCAuLi4gU0RPMz0weDgwICovCisJCWF6eF9kZXYtPnNkX2ludF9zdGFfbWFzayA9IDEgPDwgaTsKKwkJLyogc3RyZWFtIHRhZzogbXVzdCBiZSBub24temVybyBhbmQgdW5pcXVlICovCisJCWF6eF9kZXYtPmluZGV4ID0gaTsKKwkJYXp4X2Rldi0+c3RyZWFtX3RhZyA9IGkgKyAxOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2luaXRfc3RyZWFtKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21tb24gSERBIGRyaXZlciBmdW5jaXRvbnMiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDJlM2JlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAgQ29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBhbHNhIGRyaXZlciBjb2RlIGJhc2UgZm9yIEhEIEF1ZGlvLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19TT1VORF9IREFfQ09OVFJPTExFUl9ICisjZGVmaW5lIF9fU09VTkRfSERBX0NPTlRST0xMRVJfSAorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfcHJpdi5oIgorCisvKiBQQ00gc2V0dXAgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF6eF9kZXYgKmdldF9henhfZGV2KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKK30KK3Vuc2lnbmVkIGludCBhenhfZ2V0X3Bvc2l0aW9uKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiwKKwkJCSAgICAgIGJvb2wgd2l0aF9jaGVjayk7CisKKy8qIFN0cmVhbSBjb250cm9sLiAqLwordm9pZCBhenhfc3RyZWFtX3N0b3Aoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpOworCisvKiBBbGxvY2F0aW9uIGZ1bmN0aW9ucy4gKi8KK2ludCBhenhfYWxsb2Nfc3RyZWFtX3BhZ2VzKHN0cnVjdCBhenggKmNoaXApOwordm9pZCBhenhfZnJlZV9zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCk7CisKKy8qIExvdyBsZXZlbCBhenggaW50ZXJmYWNlICovCit2b2lkIGF6eF9pbml0X2NoaXAoc3RydWN0IGF6eCAqY2hpcCwgaW50IGZ1bGxfcmVzZXQpOwordm9pZCBhenhfc3RvcF9jaGlwKHN0cnVjdCBhenggKmNoaXApOwordm9pZCBhenhfZW50ZXJfbGlua19yZXNldChzdHJ1Y3QgYXp4ICpjaGlwKTsKK2lycXJldHVybl90IGF6eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKworLyogQ29kZWMgaW50ZXJmYWNlICovCitpbnQgYXp4X2NvZGVjX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwLCBjb25zdCBjaGFyICptb2RlbCwKKwkJICAgICB1bnNpZ25lZCBpbnQgbWF4X3Nsb3RzLAorCQkgICAgIGludCAqcG93ZXJfc2F2ZV90byk7CitpbnQgYXp4X2NvZGVjX2NvbmZpZ3VyZShzdHJ1Y3QgYXp4ICpjaGlwKTsKK2ludCBhenhfbWl4ZXJfY3JlYXRlKHN0cnVjdCBhenggKmNoaXApOworaW50IGF6eF9pbml0X3N0cmVhbShzdHJ1Y3QgYXp4ICpjaGlwKTsKKworI2VuZGlmIC8qIF9fU09VTkRfSERBX0NPTlRST0xMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9lbGQuYwppbmRleCA3OWNhODBmLi40NjY5MGE3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9lbGQuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9lbGQuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCiAJCQkJCUFDX1ZFUkJfR0VUX0hETUlfRUxERCwgYnl0ZV9pbmRleCk7CiAjaWZkZWYgQkVfUEFSQU5PSUQKLQlwcmludGsoS0VSTl9JTkZPICJIRE1JOiBFTEQgZGF0YSBieXRlICVkOiAweCV4XG4iLCBieXRlX2luZGV4LCB2YWwpOworCWNvZGVjX2luZm8oY29kZWMsICJIRE1JOiBFTEQgZGF0YSBieXRlICVkOiAweCV4XG4iLCBieXRlX2luZGV4LCB2YWwpOwogI2VuZGlmCiAJcmV0dXJuIHZhbDsKIH0KQEAgLTMzMiwxMSArMzMyLDExIEBACiAJc2l6ZSA9IHNuZF9oZG1pX2dldF9lbGRfc2l6ZShjb2RlYywgbmlkKTsKIAlpZiAoc2l6ZSA9PSAwKSB7CiAJCS8qIHdmZzogd29ya2Fyb3VuZCBmb3IgQVNVUyBQNUUtVk0gSERNSSBib2FyZCAqLwotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSTogRUxEIGJ1ZiBzaXplIGlzIDAsIGZvcmNlIDEyOFxuIik7CisJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JOiBFTEQgYnVmIHNpemUgaXMgMCwgZm9yY2UgMTI4XG4iKTsKIAkJc2l6ZSA9IDEyODsKIAl9CiAJaWYgKHNpemUgPCBFTERfRklYRURfQllURVMgfHwgc2l6ZSA+IEVMRF9NQVhfU0laRSkgewotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSTogaW52YWxpZCBFTEQgYnVmIHNpemUgJWRcbiIsIHNpemUpOworCQljb2RlY19pbmZvKGNvZGVjLCAiSERNSTogaW52YWxpZCBFTEQgYnVmIHNpemUgJWRcbiIsIHNpemUpOwogCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKQEAgLTM0OCw4ICszNDgsNyBAQAogCQkgKiBKdXN0IGFib3J0LiBUaGUgY2FsbGVyIHdpbGwgcmVwb2xsIGFmdGVyIGEgd2hpbGUuCiAJCSAqLwogCQlpZiAoISh2YWwgJiBBQ19FTEREX0VMRF9WQUxJRCkpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPCi0JCQkJICAiSERNSTogaW52YWxpZCBFTEQgZGF0YSBieXRlICVkXG4iLCBpKTsKKwkJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JOiBpbnZhbGlkIEVMRCBkYXRhIGJ5dGUgJWRcbiIsIGkpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KQEAgLTM2MSw3ICszNjAsNyBAQAogCQkgKiBjb3JyZWN0bHkgd3JpdGVzIEVMRCBjb250ZW50IGJlZm9yZSBzZXR0aW5nIEVMRF92YWxpZCBiaXQuCiAJCSAqLwogCQlpZiAoIXZhbCAmJiAhaSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJIRE1JOiAwIEVMRCBkYXRhXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgIkhETUk6IDAgRUxEIGRhdGFcbiIpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KQEAgLTY4MSw3ICs2ODAsNyBAQAogCXNwa2FsbG9jID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFUSV9WRVJCX0dFVF9TUEVBS0VSX0FMTE9DQVRJT04sIDApOwogCiAJaWYgKHNwa2FsbG9jIDw9IDApIHsKLQkJc25kX3ByaW50ZChLRVJOX0lORk8gIkhETUkgQVRJL0FNRDogbm8gc3BlYWtlciBhbGxvY2F0aW9uIGZvciBFTERcbiIpOworCQljb2RlY19pbmZvKGNvZGVjLCAiSERNSSBBVEkvQU1EOiBubyBzcGVha2VyIGFsbG9jYXRpb24gZm9yIEVMRFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzIyLDcgKzcyMSw3IEBACiAJCXNpbmtfZGVzY19sZW4gPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQVRJX1ZFUkJfR0VUX1NJTktfSU5GT19EQVRBLCAwKTsKIAogCQlpZiAoc2lua19kZXNjX2xlbiA+IEVMRF9NQVhfTU5MKSB7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSSBBVEkvQU1EOiBUcnVuY2F0aW5nIEhETUkgc2luayBkZXNjcmlwdGlvbiB3aXRoIGxlbmd0aCAlZFxuIiwKKwkJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JIEFUSS9BTUQ6IFRydW5jYXRpbmcgSERNSSBzaW5rIGRlc2NyaXB0aW9uIHdpdGggbGVuZ3RoICVkXG4iLAogCQkJCSAgIHNpbmtfZGVzY19sZW4pOwogCQkJc2lua19kZXNjX2xlbiA9IEVMRF9NQVhfTU5MOwogCQl9CkBAIC03NjQsNyArNzYzLDcgQEAKIAl9CiAKIAlpZiAocG9zID09IEVMRF9GSVhFRF9CWVRFUyArIHNpbmtfZGVzY19sZW4pIHsKLQkJc25kX3ByaW50ZChLRVJOX0lORk8gIkhETUkgQVRJL0FNRDogbm8gYXVkaW8gZGVzY3JpcHRvcnMgZm9yIEVMRFxuIik7CisJCWNvZGVjX2luZm8oY29kZWMsICJIRE1JIEFUSS9BTUQ6IG5vIGF1ZGlvIGRlc2NyaXB0b3JzIGZvciBFTERcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYwppbmRleCBkOWEwOWJkLi4xNjEzMzg4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCkBAIC03OSw3ICs3OSw3IEBACiAJc25kX2FycmF5X2ZyZWUoJnNwZWMtPmtjdGxzKTsKIH0KIAotdm9pZCBzbmRfaGRhX2dlbl9zcGVjX2ZyZWUoc3RydWN0IGhkYV9nZW5fc3BlYyAqc3BlYykKK3N0YXRpYyB2b2lkIHNuZF9oZGFfZ2VuX3NwZWNfZnJlZShzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjKQogewogCWlmICghc3BlYykKIAkJcmV0dXJuOwpAQCAtODcsNyArODcsNiBAQAogCXNuZF9hcnJheV9mcmVlKCZzcGVjLT5wYXRocyk7CiAJc25kX2FycmF5X2ZyZWUoJnNwZWMtPmxvb3BiYWNrX2xpc3QpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZW5fc3BlY19mcmVlKTsKIAogLyoKICAqIHN0b3JlIHVzZXIgaGludHMKQEAgLTM0Nyw3ICszNDYsOCBAQAogCXJldHVybiBpc19jdGxfdXNlZChjb2RlYywgdmFsLCB0eXBlKTsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfbmlkX3BhdGgoY29uc3QgY2hhciAqcGZ4LCBzdHJ1Y3QgbmlkX3BhdGggKnBhdGgpCitzdGF0aWMgdm9pZCBwcmludF9uaWRfcGF0aChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgIGNvbnN0IGNoYXIgKnBmeCwgc3RydWN0IG5pZF9wYXRoICpwYXRoKQogewogCWNoYXIgYnVmWzQwXTsKIAlpbnQgaTsKQEAgLTM1OSw3ICszNTksNyBAQAogCQlzcHJpbnRmKHRtcCwgIjolMDJ4IiwgcGF0aC0+cGF0aFtpXSk7CiAJCXN0cmxjYXQoYnVmLCB0bXAsIHNpemVvZihidWYpKTsKIAl9Ci0Jc25kX3ByaW50ZGQoIiVzIHBhdGg6IGRlcHRoPSVkICVzXG4iLCBwZngsIHBhdGgtPmRlcHRoLCBidWYpOworCWNvZGVjX2RiZyhjb2RlYywgIiVzIHBhdGg6IGRlcHRoPSVkICVzXG4iLCBwZngsIHBhdGgtPmRlcHRoLCBidWYpOwogfQogCiAvKiBjYWxsZWQgcmVjdXJzaXZlbHkgKi8KQEAgLTc2Miw3ICs3NjIsNyBAQAogCQkJCQkJICAgIEFDX1BXUlNUX0QwKTsKIAkJfQogCQlpZiAoZW5hYmxlICYmIHBhdGgtPm11bHRpW2ldKQotCQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAorCQkJc25kX2hkYV9jb2RlY191cGRhdGVfY2FjaGUoY29kZWMsIG5pZCwgMCwKIAkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAogCQkJCQkgICAgcGF0aC0+aWR4W2ldKTsKIAkJaWYgKGhhc19hbXBfaW4oY29kZWMsIHBhdGgsIGkpKQpAQCAtMTI2MSw3ICsxMjYxLDcgQEAKIAkJCWRhYyA9IGRhY3NbaV0gPSAwOwogCQkJYmFkbmVzcyArPSBiYWQtPm5vX2RhYzsKIAkJfSBlbHNlIHsKLQkJCS8qIHByaW50X25pZF9wYXRoKCJvdXRwdXQiLCBwYXRoKTsgKi8KKwkJCS8qIHByaW50X25pZF9wYXRoKGNvZGVjLCAib3V0cHV0IiwgcGF0aCk7ICovCiAJCQlwYXRoLT5hY3RpdmUgPSB0cnVlOwogCQkJcGF0aF9pZHhbaV0gPSBzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiAJCQliYWRuZXNzICs9IGFzc2lnbl9vdXRfcGF0aF9jdGxzKGNvZGVjLCBwYXRoKTsKQEAgLTEzODgsNyArMTM4OCw3IEBACiAJCQkJYmFkbmVzcysrOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJLyogcHJpbnRfbmlkX3BhdGgoIm11bHRpaW8iLCBwYXRoKTsgKi8KKwkJCS8qIHByaW50X25pZF9wYXRoKGNvZGVjLCAibXVsdGlpbyIsIHBhdGgpOyAqLwogCQkJc3BlYy0+bXVsdGlfaW9bc3BlYy0+bXVsdGlfaW9zXS5waW4gPSBuaWQ7CiAJCQlzcGVjLT5tdWx0aV9pb1tzcGVjLT5tdWx0aV9pb3NdLmRhYyA9IGRhYzsKIAkJCXNwZWMtPm91dF9wYXRoc1tjZmctPmxpbmVfb3V0cyArIHNwZWMtPm11bHRpX2lvc10gPQpAQCAtMTQ0NSw3ICsxNDQ1LDcgQEAKIAkJaWYgKHBhdGgpIHsKIAkJCWRhY3NbaV0gPSBkYWM7CiAJCQlmb3VuZCA9IHRydWU7Ci0JCQkvKiBwcmludF9uaWRfcGF0aCgib3V0cHV0IiwgcGF0aCk7ICovCisJCQkvKiBwcmludF9uaWRfcGF0aChjb2RlYywgIm91dHB1dCIsIHBhdGgpOyAqLwogCQkJcGF0aC0+YWN0aXZlID0gdHJ1ZTsKIAkJCXBhdGhfaWR4W2ldID0gc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwogCQl9CkBAIC0xNDgzLDcgKzE0ODMsNyBAQAogCX0KIAlpZiAoIXBhdGgpCiAJCXJldHVybiAwOwotCS8qIHByaW50X25pZF9wYXRoKCJvdXRwdXQtYWFtaXgiLCBwYXRoKTsgKi8KKwkvKiBwcmludF9uaWRfcGF0aChjb2RlYywgIm91dHB1dC1hYW1peCIsIHBhdGgpOyAqLwogCXBhdGgtPmFjdGl2ZSA9IGZhbHNlOyAvKiB1bnVzZWQgYXMgZGVmYXVsdCAqLwogCXJldHVybiBzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiB9CkBAIC0xNzAwLDcgKzE3MDAsNyBAQAogI2RlZmluZSBERUJVR19CQURORVNTCiAKICNpZmRlZiBERUJVR19CQURORVNTCi0jZGVmaW5lIGRlYnVnX2JhZG5lc3MJc25kX3ByaW50ZGQKKyNkZWZpbmUgZGVidWdfYmFkbmVzcyhmbXQsIGFyZ3MuLi4pCWNvZGVjX2RiZyhjb2RlYywgZm10LCAjI2FyZ3MpCiAjZWxzZQogI2RlZmluZSBkZWJ1Z19iYWRuZXNzKC4uLikKICNlbmRpZgpAQCAtMTcxMyw3ICsxNzEzLDcgQEAKIAogCXBhdGggPSBzbmRfaGRhX2dldF9wYXRoX2Zyb21faWR4KGNvZGVjLCBpZHgpOwogCWlmIChwYXRoKQotCQlwcmludF9uaWRfcGF0aChwZngsIHBhdGgpOworCQlwcmludF9uaWRfcGF0aChjb2RlYywgcGZ4LCBwYXRoKTsKIH0KIAogc3RhdGljIHZvaWQgZGVidWdfc2hvd19jb25maWdzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMTc4MSw3ICsxNzgxLDcgQEAKIAkJaWYgKGdldF93Y2Fwc190eXBlKGdldF93Y2Fwcyhjb2RlYywgbmlkKSkgIT0gQUNfV0lEX0FVRF9PVVQpCiAJCQljb250aW51ZTsKIAkJaWYgKHNwZWMtPm51bV9hbGxfZGFjcyA+PSBBUlJBWV9TSVpFKHNwZWMtPmFsbF9kYWNzKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhOiBUb28gbWFueSBEQUNzIVxuIik7CisJCQljb2RlY19lcnIoY29kZWMsICJUb28gbWFueSBEQUNzIVxuIik7CiAJCQlicmVhazsKIAkJfQogCQlzcGVjLT5hbGxfZGFjc1tzcGVjLT5udW1fYWxsX2RhY3MrK10gPSBuaWQ7CkBAIC0yNDMwLDcgKzI0MzAsNyBAQAogCXNwZWMtPmhwX21pY19waW4gPSBuaWQ7CiAJLyogd2UgY2FuJ3QgaGFuZGxlIGF1dG8tbWljIHRvZ2V0aGVyIHdpdGggSFAtbWljICovCiAJc3BlYy0+c3VwcHJlc3NfYXV0b19taWMgPSAxOwotCXNuZF9wcmludGRkKCJoZGEtY29kZWM6IEVuYWJsZSBzaGFyZWQgSS9PIGphY2sgb24gTklEIDB4JXhcbiIsIG5pZCk7CisJY29kZWNfZGJnKGNvZGVjLCAiRW5hYmxlIHNoYXJlZCBJL08gamFjayBvbiBOSUQgMHgleFxuIiwgbmlkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg4NCw3ICsyODg0LDcgQEAKIAlwYXRoID0gc25kX2hkYV9hZGRfbmV3X3BhdGgoY29kZWMsIHBpbiwgbWl4X25pZCwgMCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwcmludF9uaWRfcGF0aCgibG9vcGJhY2siLCBwYXRoKTsKKwlwcmludF9uaWRfcGF0aChjb2RlYywgImxvb3BiYWNrIiwgcGF0aCk7CiAJc3BlYy0+bG9vcGJhY2tfcGF0aHNbaW5wdXRfaWR4XSA9IHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIAogCWlkeCA9IHBhdGgtPmlkeFtwYXRoLT5kZXB0aCAtIDFdOwpAQCAtMjkxMiw3ICsyOTEyLDcgQEAKIAkJcGF0aCA9IHNuZF9oZGFfYWRkX25ld19wYXRoKGNvZGVjLCBzcGVjLT5taXhlcl9uaWQsCiAJCQkJCSAgICBzcGVjLT5taXhlcl9tZXJnZV9uaWQsIDApOwogCQlpZiAocGF0aCkgewotCQkJcHJpbnRfbmlkX3BhdGgoImxvb3BiYWNrLW1lcmdlIiwgcGF0aCk7CisJCQlwcmludF9uaWRfcGF0aChjb2RlYywgImxvb3BiYWNrLW1lcmdlIiwgcGF0aCk7CiAJCQlwYXRoLT5hY3RpdmUgPSB0cnVlOwogCQkJc3BlYy0+bG9vcGJhY2tfbWVyZ2VfcGF0aCA9CiAJCQkJc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwpAQCAtMjk5MSw3ICsyOTkxLDcgQEAKIAkJCX0KIAkJfQogCi0JCXNuZF9wcmludGRkKCJoZGEtY29kZWM6IGVuYWJsaW5nIEFEQyBzd2l0Y2hpbmdcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJlbmFibGluZyBBREMgc3dpdGNoaW5nXG4iKTsKIAkJc3BlYy0+ZHluX2FkY19zd2l0Y2ggPSAxOwogCX0gZWxzZSBpZiAobnVtcyAhPSBzcGVjLT5udW1fYWRjX25pZHMpIHsKIAkJLyogc2hyaW5rIHRoZSBpbnZhbGlkIGFkY3MgYW5kIGlucHV0IHBhdGhzICovCkBAIC0zMDE1LDcgKzMwMTUsNyBAQAogCiAJaWYgKGltdXgtPm51bV9pdGVtcyA9PSAxIHx8CiAJICAgIChpbXV4LT5udW1faXRlbXMgPT0gMiAmJiBzcGVjLT5ocF9taWMpKSB7Ci0JCXNuZF9wcmludGRkKCJoZGEtY29kZWM6IHJlZHVjaW5nIHRvIGEgc2luZ2xlIEFEQ1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgInJlZHVjaW5nIHRvIGEgc2luZ2xlIEFEQ1xuIik7CiAJCXNwZWMtPm51bV9hZGNfbmlkcyA9IDE7IC8qIHJlZHVjZSB0byBhIHNpbmdsZSBBREMgKi8KIAl9CiAKQEAgLTMwNDYsNyArMzA0Niw3IEBACiAJCXBhdGggPSBzbmRfaGRhX2FkZF9uZXdfcGF0aChjb2RlYywgcGluLCBhZGMsIGFuY2hvcik7CiAJCWlmICghcGF0aCkKIAkJCWNvbnRpbnVlOwotCQlwcmludF9uaWRfcGF0aCgiaW5wdXQiLCBwYXRoKTsKKwkJcHJpbnRfbmlkX3BhdGgoY29kZWMsICJpbnB1dCIsIHBhdGgpOwogCQlzcGVjLT5pbnB1dF9wYXRoc1tpbXV4X2lkeF1bY10gPQogCQkJc25kX2hkYV9nZXRfcGF0aF9pZHgoY29kZWMsIHBhdGgpOwogCkBAIC0zNzEyLDcgKzM3MTIsNyBAQAogCQlwYXRoID0gc25kX2hkYV9hZGRfbmV3X3BhdGgoY29kZWMsIGRpZ19uaWQsIHBpbiwgMCk7CiAJCWlmICghcGF0aCkKIAkJCWNvbnRpbnVlOwotCQlwcmludF9uaWRfcGF0aCgiZGlnb3V0IiwgcGF0aCk7CisJCXByaW50X25pZF9wYXRoKGNvZGVjLCAiZGlnb3V0IiwgcGF0aCk7CiAJCXBhdGgtPmFjdGl2ZSA9IHRydWU7CiAJCXNwZWMtPmRpZ291dF9wYXRoc1tpXSA9IHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIAkJc2V0X3Bpbl90YXJnZXQoY29kZWMsIHBpbiwgUElOX09VVCwgZmFsc2UpOwpAQCAtMzczOSw3ICszNzM5LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCXBhdGggPSBzbmRfaGRhX2FkZF9uZXdfcGF0aChjb2RlYywgcGluLCBkaWdfbmlkLCAwKTsKIAkJCWlmIChwYXRoKSB7Ci0JCQkJcHJpbnRfbmlkX3BhdGgoImRpZ2luIiwgcGF0aCk7CisJCQkJcHJpbnRfbmlkX3BhdGgoY29kZWMsICJkaWdpbiIsIHBhdGgpOwogCQkJCXBhdGgtPmFjdGl2ZSA9IHRydWU7CiAJCQkJc3BlYy0+ZGlnX2luX25pZCA9IGRpZ19uaWQ7CiAJCQkJc3BlYy0+ZGlnaW5fcGF0aCA9IHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKQEAgLTQxNzAsOCArNDE3MCw3IEBACiAJCWhkYV9uaWRfdCBuaWQgPSBjZmctPmhwX3BpbnNbaV07CiAJCWlmICghaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBuaWQpKQogCQkJY29udGludWU7Ci0JCXNuZF9wcmludGRkKCJoZGEtY29kZWM6IEVuYWJsZSBIUCBhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwKLQkJCSAgICBuaWQpOworCQljb2RlY19kYmcoY29kZWMsICJFbmFibGUgSFAgYXV0by1tdXRpbmcgb24gTklEIDB4JXhcbiIsIG5pZCk7CiAJCXNuZF9oZGFfamFja19kZXRlY3RfZW5hYmxlX2NhbGxiYWNrKGNvZGVjLCBuaWQsIEhEQV9HRU5fSFBfRVZFTlQsCiAJCQkJCQkgICAgY2FsbF9ocF9hdXRvbXV0ZSk7CiAJCXNwZWMtPmRldGVjdF9ocCA9IDE7CkBAIC00MTgzLDcgKzQxODIsNyBAQAogCQkJCWhkYV9uaWRfdCBuaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CiAJCQkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIG5pZCkpCiAJCQkJCWNvbnRpbnVlOwotCQkJCXNuZF9wcmludGRkKCJoZGEtY29kZWM6IEVuYWJsZSBMaW5lLU91dCBhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwgbmlkKTsKKwkJCQljb2RlY19kYmcoY29kZWMsICJFbmFibGUgTGluZS1PdXQgYXV0by1tdXRpbmcgb24gTklEIDB4JXhcbiIsIG5pZCk7CiAJCQkJc25kX2hkYV9qYWNrX2RldGVjdF9lbmFibGVfY2FsbGJhY2soY29kZWMsIG5pZCwKIAkJCQkJCQkJICAgIEhEQV9HRU5fRlJPTlRfRVZFTlQsCiAJCQkJCQkJCSAgICBjYWxsX2xpbmVfYXV0b211dGUpOwpAQCAtNDMwMyw3ICs0MzAyLDcgQEAKIAlzcGVjLT5hdXRvX21pYyA9IDE7CiAJc3BlYy0+bnVtX2FkY19uaWRzID0gMTsKIAlzcGVjLT5jdXJfbXV4WzBdID0gc3BlYy0+YW1fZW50cnlbMF0uaWR4OwotCXNuZF9wcmludGRkKCJoZGEtY29kZWM6IEVuYWJsZSBhdXRvLW1pYyBzd2l0Y2ggb24gTklEIDB4JXgvMHgleC8weCV4XG4iLAorCWNvZGVjX2RiZyhjb2RlYywgIkVuYWJsZSBhdXRvLW1pYyBzd2l0Y2ggb24gTklEIDB4JXgvMHgleC8weCV4XG4iLAogCQkgICAgc3BlYy0+YW1fZW50cnlbMF0ucGluLAogCQkgICAgc3BlYy0+YW1fZW50cnlbMV0ucGluLAogCQkgICAgc3BlYy0+YW1fZW50cnlbMl0ucGluKTsKQEAgLTUzNTAsNyArNTM0OSw3IEBACiAgKi8KIHZvaWQgc25kX2hkYV9nZW5fZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShjb2RlYyk7CisJc25kX2hkYV9hcHBseV9maXh1cChjb2RlYywgSERBX0ZJWFVQX0FDVF9GUkVFKTsKIAlzbmRfaGRhX2dlbl9zcGVjX2ZyZWUoY29kZWMtPnNwZWMpOwogCWtmcmVlKGNvZGVjLT5zcGVjKTsKIAljb2RlYy0+c3BlYyA9IE5VTEw7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmgKaW5kZXggYzkwOGFmYi4uYmIyZGVhNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuaApAQCAtMjk3LDcgKzI5Nyw2IEBACiB9OwogCiBpbnQgc25kX2hkYV9nZW5fc3BlY19pbml0KHN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMpOwotdm9pZCBzbmRfaGRhX2dlbl9zcGVjX2ZyZWUoc3RydWN0IGhkYV9nZW5fc3BlYyAqc3BlYyk7CiAKIGludCBzbmRfaGRhX2dlbl9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIHZvaWQgc25kX2hkYV9nZW5fZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9od2RlcC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaHdkZXAuYwppbmRleCA3MmQ4Mzg5Li4wMTRhNzg0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9od2RlcC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMKQEAgLTIwLDI0ICsyMCwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9sb2NhbC5oIgogI2luY2x1ZGUgPHNvdW5kL2hkYV9od2RlcC5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogCi0vKiBoaW50IHN0cmluZyBwYWlyICovCi1zdHJ1Y3QgaGRhX2hpbnQgewotCWNvbnN0IGNoYXIgKmtleTsKLQljb25zdCBjaGFyICp2YWw7CS8qIGNvbnRhaW5lZCBpbiB0aGUgc2FtZSBhbGxvYyBhcyBrZXkgKi8KLX07Ci0KIC8qCiAgKiB3cml0ZS9yZWFkIGFuIG91dC1vZi1ib3VuZCB2ZXJiCiAgKi8KQEAgLTEwNSwyNiArOTQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhcl9od2RlcF9lbGVtZW50cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgaTsKLQotCS8qIGNsZWFyIGluaXQgdmVyYnMgKi8KLQlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmluaXRfdmVyYnMpOwotCS8qIGNsZWFyIGhpbnRzICovCi0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5oaW50cy51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9oaW50ICpoaW50ID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5oaW50cywgaSk7Ci0JCWtmcmVlKGhpbnQtPmtleSk7IC8qIHdlIGRvbid0IG5lZWQgdG8gZnJlZSBoaW50LT52YWwgKi8KLQl9Ci0Jc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5oaW50cyk7Ci0Jc25kX2FycmF5X2ZyZWUoJmNvZGVjLT51c2VyX3BpbnMpOwotfQotCi1zdGF0aWMgdm9pZCBod2RlcF9mcmVlKHN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwKQotewotCWNsZWFyX2h3ZGVwX2VsZW1lbnRzKGh3ZGVwLT5wcml2YXRlX2RhdGEpOwotfQotCiBpbnQgc25kX2hkYV9jcmVhdGVfaHdkZXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJY2hhciBod25hbWVbMTZdOwpAQCAtMTM5LDggKzEwOCw4IEBACiAJc3ByaW50Zihod2RlcC0+bmFtZSwgIkhEQSBDb2RlYyAlZCIsIGNvZGVjLT5hZGRyKTsKIAlod2RlcC0+aWZhY2UgPSBTTkRSVl9IV0RFUF9JRkFDRV9IREE7CiAJaHdkZXAtPnByaXZhdGVfZGF0YSA9IGNvZGVjOwotCWh3ZGVwLT5wcml2YXRlX2ZyZWUgPSBod2RlcF9mcmVlOwogCWh3ZGVwLT5leGNsdXNpdmUgPSAxOworCWh3ZGVwLT5ncm91cHMgPSBzbmRfaGRhX2Rldl9hdHRyX2dyb3VwczsKIAogCWh3ZGVwLT5vcHMub3BlbiA9IGhkYV9od2RlcF9vcGVuOwogCWh3ZGVwLT5vcHMuaW9jdGwgPSBoZGFfaHdkZXBfaW9jdGw7CkBAIC0xNDgsNzQwICsxMTcsOCBAQAogCWh3ZGVwLT5vcHMuaW9jdGxfY29tcGF0ID0gaGRhX2h3ZGVwX2lvY3RsX2NvbXBhdDsKICNlbmRpZgogCi0JbXV0ZXhfaW5pdCgmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+aW5pdF92ZXJicywgc2l6ZW9mKHN0cnVjdCBoZGFfdmVyYiksIDMyKTsKLQlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPmhpbnRzLCBzaXplb2Yoc3RydWN0IGhkYV9oaW50KSwgMzIpOwotCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+dXNlcl9waW5zLCBzaXplb2Yoc3RydWN0IGhkYV9waW5jZmcpLCAxNik7CisJLyogbGluayB0byBjb2RlYyAqLworCWh3ZGVwLT5kZXYgPSAmY29kZWMtPmRldjsKIAogCXJldHVybiAwOwogfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgc3NpemVfdCBwb3dlcl9vbl9hY2N0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChjb2RlYyk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGppZmZpZXNfdG9fbXNlY3MoY29kZWMtPnBvd2VyX29uX2FjY3QpKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcG93ZXJfb2ZmX2FjY3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwotCXNuZF9oZGFfdXBkYXRlX3Bvd2VyX2FjY3QoY29kZWMpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBqaWZmaWVzX3RvX21zZWNzKGNvZGVjLT5wb3dlcl9vZmZfYWNjdCkpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcG93ZXJfYXR0cnNbXSA9IHsKLQlfX0FUVFJfUk8ocG93ZXJfb25fYWNjdCksCi0JX19BVFRSX1JPKHBvd2VyX29mZl9hY2N0KSwKLX07Ci0KLWludCBzbmRfaGRhX2h3ZGVwX2FkZF9wb3dlcl9zeXNmcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGNvZGVjLT5od2RlcDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvd2VyX2F0dHJzKTsgaSsrKQotCQlzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKFNORFJWX0RFVklDRV9UWVBFX0hXREVQLCBod2RlcC0+Y2FyZCwKLQkJCQkJICBod2RlcC0+ZGV2aWNlLCAmcG93ZXJfYXR0cnNbaV0pOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKLQotLyoKLSAqIHN5c2ZzIGludGVyZmFjZQotICovCi0KLXN0YXRpYyBpbnQgY2xlYXJfY29kZWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOwotCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlRoZSBjb2RlYyBpcyBiZWluZyB1c2VkLCBjYW4ndCBmcmVlLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCWNsZWFyX2h3ZGVwX2VsZW1lbnRzKGNvZGVjKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWNvbmZpZ19jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgZXJyOwotCi0Jc25kX2hkYV9wb3dlcl91cChjb2RlYyk7Ci0Jc25kX3ByaW50ayhLRVJOX0lORk8gImhkYS1jb2RlYzogcmVjb25maWd1cmluZ1xuIik7Ci0JZXJyID0gc25kX2hkYV9jb2RlY19yZXNldChjb2RlYyk7Ci0JaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJICAgIlRoZSBjb2RlYyBpcyBiZWluZyB1c2VkLCBjYW4ndCByZWNvbmZpZ3VyZS5cbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQllcnIgPSBzbmRfaGRhX2NvZGVjX2NvbmZpZ3VyZShjb2RlYyk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JLyogcmVidWlsZCBQQ01zICovCi0JZXJyID0gc25kX2hkYV9jb2RlY19idWlsZF9wY21zKGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJvcjsKLQkvKiByZWJ1aWxkIG1peGVycyAqLwotCWVyciA9IHNuZF9oZGFfY29kZWNfYnVpbGRfY29udHJvbHMoY29kZWMpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycm9yOwotCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNvZGVjLT5idXMtPmNhcmQpOwotIGVycm9yOgotCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIGFsbG9jYXRlIGEgc3RyaW5nIGF0IG1vc3QgbGVuIGNoYXJzLCBhbmQgcmVtb3ZlIHRoZSB0cmFpbGluZyBFT0wKLSAqLwotc3RhdGljIGNoYXIgKmtzdHJuZHVwX25vZW9sKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGxlbikKLXsKLQljaGFyICpzID0ga3N0cm5kdXAoc3JjLCBsZW4sIEdGUF9LRVJORUwpOwotCWNoYXIgKnA7Ci0JaWYgKCFzKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gc3RyY2hyKHMsICdcbicpOwotCWlmIChwKQotCQkqcCA9IDA7Ci0JcmV0dXJuIHM7Ci19Ci0KLSNkZWZpbmUgQ09ERUNfSU5GT19TSE9XKHR5cGUpCQkJCQlcCi1zdGF0aWMgc3NpemVfdCB0eXBlIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCSAgIGNoYXIgKmJ1ZikJCQkJXAotewkJCQkJCQkJXAotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCi0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwkJXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIGNvZGVjLT50eXBlKTsJCVwKLX0KLQotI2RlZmluZSBDT0RFQ19JTkZPX1NUUl9TSE9XKHR5cGUpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHR5cGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkJCWNoYXIgKmJ1ZikJCVwKLXsJCQkJCQkJCVwKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsJCVwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwJCQkJXAotCQkgICAgICAgY29kZWMtPnR5cGUgPyBjb2RlYy0+dHlwZSA6ICIiKTsJCVwKLX0KLQotQ09ERUNfSU5GT19TSE9XKHZlbmRvcl9pZCk7Ci1DT0RFQ19JTkZPX1NIT1coc3Vic3lzdGVtX2lkKTsKLUNPREVDX0lORk9fU0hPVyhyZXZpc2lvbl9pZCk7Ci1DT0RFQ19JTkZPX1NIT1coYWZnKTsKLUNPREVDX0lORk9fU0hPVyhtZmcpOwotQ09ERUNfSU5GT19TVFJfU0hPVyh2ZW5kb3JfbmFtZSk7Ci1DT0RFQ19JTkZPX1NUUl9TSE9XKGNoaXBfbmFtZSk7Ci1DT0RFQ19JTkZPX1NUUl9TSE9XKG1vZGVsbmFtZSk7Ci0KLSNkZWZpbmUgQ09ERUNfSU5GT19TVE9SRSh0eXBlKQkJCQkJXAotc3RhdGljIHNzaXplX3QgdHlwZSMjX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCi0JCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAotewkJCQkJCQkJXAotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCi0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwkJXAotCXVuc2lnbmVkIGxvbmcgdmFsOwkJCQkJXAotCWludCBlcnIgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOwkJCVwKLQlpZiAoZXJyIDwgMCkJCQkJCQlcCi0JCXJldHVybiBlcnI7CQkJCQlcCi0JY29kZWMtPnR5cGUgPSB2YWw7CQkJCQlcCi0JcmV0dXJuIGNvdW50OwkJCQkJCVwKLX0KLQotI2RlZmluZSBDT0RFQ19JTkZPX1NUUl9TVE9SRSh0eXBlKQkJCQlcCi1zdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CQlcCi0JY2hhciAqcyA9IGtzdHJuZHVwX25vZW9sKGJ1ZiwgNjQpOwkJCVwKLQlpZiAoIXMpCQkJCQkJCVwKLQkJcmV0dXJuIC1FTk9NRU07CQkJCQlcCi0Ja2ZyZWUoY29kZWMtPnR5cGUpOwkJCQkJXAotCWNvZGVjLT50eXBlID0gczsJCQkJCVwKLQlyZXR1cm4gY291bnQ7CQkJCQkJXAotfQotCi1DT0RFQ19JTkZPX1NUT1JFKHZlbmRvcl9pZCk7Ci1DT0RFQ19JTkZPX1NUT1JFKHN1YnN5c3RlbV9pZCk7Ci1DT0RFQ19JTkZPX1NUT1JFKHJldmlzaW9uX2lkKTsKLUNPREVDX0lORk9fU1RSX1NUT1JFKHZlbmRvcl9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NUT1JFKGNoaXBfbmFtZSk7Ci1DT0RFQ19JTkZPX1NUUl9TVE9SRShtb2RlbG5hbWUpOwotCi0jZGVmaW5lIENPREVDX0FDVElPTl9TVE9SRSh0eXBlKQkJCQlcCi1zdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CQlcCi0JaW50IGVyciA9IDA7CQkJCQkJXAotCWlmICgqYnVmKQkJCQkJCVwKLQkJZXJyID0gdHlwZSMjX2NvZGVjKGNvZGVjKTsJCQlcCi0JcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBjb3VudDsJCQkJXAotfQotCi1DT0RFQ19BQ1RJT05fU1RPUkUocmVjb25maWcpOwotQ09ERUNfQUNUSU9OX1NUT1JFKGNsZWFyKTsKLQotc3RhdGljIHNzaXplX3QgaW5pdF92ZXJic19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0JaW50IGksIGxlbiA9IDA7Ci0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+aW5pdF92ZXJicy51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV92ZXJiICp2ID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5pbml0X3ZlcmJzLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLAotCQkJCSIweCUwMnggMHglMDN4IDB4JTA0eFxuIiwKLQkJCQl2LT5uaWQsIHYtPnZlcmIsIHYtPnBhcmFtKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBwYXJzZV9pbml0X3ZlcmJzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGhkYV92ZXJiICp2OwotCWludCBuaWQsIHZlcmIsIHBhcmFtOwotCi0JaWYgKHNzY2FuZihidWYsICIlaSAlaSAlaSIsICZuaWQsICZ2ZXJiLCAmcGFyYW0pICE9IDMpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghbmlkIHx8ICF2ZXJiKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JdiA9IHNuZF9hcnJheV9uZXcoJmNvZGVjLT5pbml0X3ZlcmJzKTsKLQlpZiAoIXYpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl2LT5uaWQgPSBuaWQ7Ci0Jdi0+dmVyYiA9IHZlcmI7Ci0Jdi0+cGFyYW0gPSBwYXJhbTsKLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgaW5pdF92ZXJic19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0JaW50IGVyciA9IHBhcnNlX2luaXRfdmVyYnMoY29kZWMsIGJ1Zik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBoaW50c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlpbnQgaSwgbGVuID0gMDsKLQltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5oaW50cy51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9oaW50ICpoaW50ID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5oaW50cywgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbiwKLQkJCQkiJXMgPSAlc1xuIiwgaGludC0+a2V5LCBoaW50LT52YWwpOwotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3RydWN0IGhkYV9oaW50ICpnZXRfaGludChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqa2V5KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5oaW50cy51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9oaW50ICpoaW50ID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5oaW50cywgaSk7Ci0JCWlmICghc3RyY21wKGhpbnQtPmtleSwga2V5KSkKLQkJCXJldHVybiBoaW50OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX3RyYWlsX3NwYWNlcyhjaGFyICpzdHIpCi17Ci0JY2hhciAqcDsKLQlpZiAoISpzdHIpCi0JCXJldHVybjsKLQlwID0gc3RyICsgc3RybGVuKHN0cikgLSAxOwotCWZvciAoOyBpc3NwYWNlKCpwKTsgcC0tKSB7Ci0JCSpwID0gMDsKLQkJaWYgKHAgPT0gc3RyKQotCQkJcmV0dXJuOwotCX0KLX0KLQotI2RlZmluZSBNQVhfSElOVFMJMTAyNAotCi1zdGF0aWMgaW50IHBhcnNlX2hpbnRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpidWYpCi17Ci0JY2hhciAqa2V5LCAqdmFsOwotCXN0cnVjdCBoZGFfaGludCAqaGludDsKLQlpbnQgZXJyID0gMDsKLQotCWJ1ZiA9IHNraXBfc3BhY2VzKGJ1Zik7Ci0JaWYgKCEqYnVmIHx8ICpidWYgPT0gJyMnIHx8ICpidWYgPT0gJ1xuJykKLQkJcmV0dXJuIDA7Ci0JaWYgKCpidWYgPT0gJz0nKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlrZXkgPSBrc3RybmR1cF9ub2VvbChidWYsIDEwMjQpOwotCWlmICgha2V5KQotCQlyZXR1cm4gLUVOT01FTTsKLQkvKiBleHRyYWN0IGtleSBhbmQgdmFsICovCi0JdmFsID0gc3RyY2hyKGtleSwgJz0nKTsKLQlpZiAoIXZhbCkgewotCQlrZnJlZShrZXkpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JKnZhbCsrID0gMDsKLQl2YWwgPSBza2lwX3NwYWNlcyh2YWwpOwotCXJlbW92ZV90cmFpbF9zcGFjZXMoa2V5KTsKLQlyZW1vdmVfdHJhaWxfc3BhY2VzKHZhbCk7Ci0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCWhpbnQgPSBnZXRfaGludChjb2RlYywga2V5KTsKLQlpZiAoaGludCkgewotCQkvKiByZXBsYWNlICovCi0JCWtmcmVlKGhpbnQtPmtleSk7Ci0JCWhpbnQtPmtleSA9IGtleTsKLQkJaGludC0+dmFsID0gdmFsOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JLyogYWxsb2NhdGUgYSBuZXcgaGludCBlbnRyeSAqLwotCWlmIChjb2RlYy0+aGludHMudXNlZCA+PSBNQVhfSElOVFMpCi0JCWhpbnQgPSBOVUxMOwotCWVsc2UKLQkJaGludCA9IHNuZF9hcnJheV9uZXcoJmNvZGVjLT5oaW50cyk7Ci0JaWYgKGhpbnQpIHsKLQkJaGludC0+a2V5ID0ga2V5OwotCQloaW50LT52YWwgPSB2YWw7Ci0JfSBlbHNlIHsKLQkJZXJyID0gLUVOT01FTTsKLQl9Ci0gdW5sb2NrOgotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCWlmIChlcnIpCi0JCWtmcmVlKGtleSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHNzaXplX3QgaGludHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlpbnQgZXJyID0gcGFyc2VfaGludHMoY29kZWMsIGJ1Zik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBwaW5fY29uZmlnc19zaG93KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCXN0cnVjdCBzbmRfYXJyYXkgKmxpc3QsCi0JCQkJY2hhciAqYnVmKQotewotCWludCBpLCBsZW4gPSAwOwotCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+dXNlZDsgaSsrKSB7Ci0JCXN0cnVjdCBoZGFfcGluY2ZnICpwaW4gPSBzbmRfYXJyYXlfZWxlbShsaXN0LCBpKTsKLQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiMHglMDJ4IDB4JTA4eFxuIiwKLQkJCSAgICAgICBwaW4tPm5pZCwgcGluLT5jZmcpOwotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBpbml0X3Bpbl9jb25maWdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHBpbl9jb25maWdzX3Nob3coY29kZWMsICZjb2RlYy0+aW5pdF9waW5zLCBidWYpOwotfQotCi1zdGF0aWMgc3NpemVfdCB1c2VyX3Bpbl9jb25maWdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHBpbl9jb25maWdzX3Nob3coY29kZWMsICZjb2RlYy0+dXNlcl9waW5zLCBidWYpOwotfQotCi1zdGF0aWMgc3NpemVfdCBkcml2ZXJfcGluX2NvbmZpZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHBpbl9jb25maWdzX3Nob3coY29kZWMsICZjb2RlYy0+ZHJpdmVyX3BpbnMsIGJ1Zik7Ci19Ci0KLSNkZWZpbmUgTUFYX1BJTl9DT05GSUdTCQkzMgotCi1zdGF0aWMgaW50IHBhcnNlX3VzZXJfcGluX2NvbmZpZ3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKLXsKLQlpbnQgbmlkLCBjZmcsIGVycjsKLQotCWlmIChzc2NhbmYoYnVmLCAiJWkgJWkiLCAmbmlkLCAmY2ZnKSAhPSAyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIW5pZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCWVyciA9IHNuZF9oZGFfYWRkX3BpbmNmZyhjb2RlYywgJmNvZGVjLT51c2VyX3BpbnMsIG5pZCwgY2ZnKTsKLQltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3NpemVfdCB1c2VyX3Bpbl9jb25maWdzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKLQlpbnQgZXJyID0gcGFyc2VfdXNlcl9waW5fY29uZmlncyhjb2RlYywgYnVmKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLSNkZWZpbmUgQ09ERUNfQVRUUl9SVyh0eXBlKSBcCi0JX19BVFRSKHR5cGUsIDA2NDQsIHR5cGUjI19zaG93LCB0eXBlIyNfc3RvcmUpCi0jZGVmaW5lIENPREVDX0FUVFJfUk8odHlwZSkgXAotCV9fQVRUUl9STyh0eXBlKQotI2RlZmluZSBDT0RFQ19BVFRSX1dPKHR5cGUpIFwKLQlfX0FUVFIodHlwZSwgMDIwMCwgTlVMTCwgdHlwZSMjX3N0b3JlKQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgY29kZWNfYXR0cnNbXSA9IHsKLQlDT0RFQ19BVFRSX1JXKHZlbmRvcl9pZCksCi0JQ09ERUNfQVRUUl9SVyhzdWJzeXN0ZW1faWQpLAotCUNPREVDX0FUVFJfUlcocmV2aXNpb25faWQpLAotCUNPREVDX0FUVFJfUk8oYWZnKSwKLQlDT0RFQ19BVFRSX1JPKG1mZyksCi0JQ09ERUNfQVRUUl9SVyh2ZW5kb3JfbmFtZSksCi0JQ09ERUNfQVRUUl9SVyhjaGlwX25hbWUpLAotCUNPREVDX0FUVFJfUlcobW9kZWxuYW1lKSwKLQlDT0RFQ19BVFRSX1JXKGluaXRfdmVyYnMpLAotCUNPREVDX0FUVFJfUlcoaGludHMpLAotCUNPREVDX0FUVFJfUk8oaW5pdF9waW5fY29uZmlncyksCi0JQ09ERUNfQVRUUl9SVyh1c2VyX3Bpbl9jb25maWdzKSwKLQlDT0RFQ19BVFRSX1JPKGRyaXZlcl9waW5fY29uZmlncyksCi0JQ09ERUNfQVRUUl9XTyhyZWNvbmZpZyksCi0JQ09ERUNfQVRUUl9XTyhjbGVhciksCi19OwotCi0vKgotICogY3JlYXRlIHN5c2ZzIGZpbGVzIG9uIGh3ZGVwIGRpcmVjdG9yeQotICovCi1pbnQgc25kX2hkYV9od2RlcF9hZGRfc3lzZnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBjb2RlYy0+aHdkZXA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2RlY19hdHRycyk7IGkrKykKLQkJc25kX2FkZF9kZXZpY2Vfc3lzZnNfZmlsZShTTkRSVl9ERVZJQ0VfVFlQRV9IV0RFUCwgaHdkZXAtPmNhcmQsCi0JCQkJCSAgaHdkZXAtPmRldmljZSwgJmNvZGVjX2F0dHJzW2ldKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIExvb2sgZm9yIGhpbnQgc3RyaW5nCi0gKi8KLWNvbnN0IGNoYXIgKnNuZF9oZGFfZ2V0X2hpbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmtleSkKLXsKLQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBnZXRfaGludChjb2RlYywga2V5KTsKLQlyZXR1cm4gaGludCA/IGhpbnQtPnZhbCA6IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dldF9oaW50KTsKLQotaW50IHNuZF9oZGFfZ2V0X2Jvb2xfaGludChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqa2V5KQotewotCWNvbnN0IGNoYXIgKnA7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKLQlwID0gc25kX2hkYV9nZXRfaGludChjb2RlYywga2V5KTsKLQlpZiAoIXAgfHwgISpwKQotCQlyZXQgPSAtRU5PRU5UOwotCWVsc2UgewotCQlzd2l0Y2ggKHRvdXBwZXIoKnApKSB7Ci0JCWNhc2UgJ1QnOiAvKiB0cnVlICovCi0JCWNhc2UgJ1knOiAvKiB5ZXMgKi8KLQkJY2FzZSAnMSc6Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZ2V0X2Jvb2xfaGludCk7Ci0KLWludCBzbmRfaGRhX2dldF9pbnRfaGludChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqa2V5LCBpbnQgKnZhbHApCi17Ci0JY29uc3QgY2hhciAqcDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXAgPSBzbmRfaGRhX2dldF9oaW50KGNvZGVjLCBrZXkpOwotCWlmICghcCkKLQkJcmV0ID0gLUVOT0VOVDsKLQllbHNlIGlmIChrc3RydG91bChwLCAwLCAmdmFsKSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlIHsKLQkJKnZhbHAgPSB2YWw7Ci0JCXJldCA9IDA7Ci0JfQotCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dldF9pbnRfaGludCk7Ci0jZW5kaWYgLyogQ09ORklHX1NORF9IREFfUkVDT05GSUcgKi8KLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgotCi0vKiBwYXJzZXIgbW9kZSAqLwotZW51bSB7Ci0JTElORV9NT0RFX05PTkUsCi0JTElORV9NT0RFX0NPREVDLAotCUxJTkVfTU9ERV9NT0RFTCwKLQlMSU5FX01PREVfUElOQ0ZHLAotCUxJTkVfTU9ERV9WRVJCLAotCUxJTkVfTU9ERV9ISU5ULAotCUxJTkVfTU9ERV9WRU5ET1JfSUQsCi0JTElORV9NT0RFX1NVQlNZU1RFTV9JRCwKLQlMSU5FX01PREVfUkVWSVNJT05fSUQsCi0JTElORV9NT0RFX0NISVBfTkFNRSwKLQlOVU1fTElORV9NT0RFUywKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHN0cm1hdGNoKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCi17Ci0JcmV0dXJuIHN0cm5pY21wKGEsIGIsIHN0cmxlbihiKSkgPT0gMDsKLX0KLQotLyogcGFyc2UgdGhlIGNvbnRlbnRzIGFmdGVyIHRoZSBsaW5lICJbY29kZWNdIgotICogYWNjZXB0IG9ubHkgdGhlIGxpbmUgd2l0aCB0aHJlZSBudW1iZXJzLCBhbmQgYXNzaWduIHRoZSBjdXJyZW50IGNvZGVjCi0gKi8KLXN0YXRpYyB2b2lkIHBhcnNlX2NvZGVjX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJICAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQotewotCWludCB2ZW5kb3JpZCwgc3ViaWQsIGNhZGRyOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCi0JKmNvZGVjcCA9IE5VTEw7Ci0JaWYgKHNzY2FuZihidWYsICIlaSAlaSAlaSIsICZ2ZW5kb3JpZCwgJnN1YmlkLCAmY2FkZHIpID09IDMpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewotCQkJaWYgKCh2ZW5kb3JpZCA8PSAwIHx8IGNvZGVjLT52ZW5kb3JfaWQgPT0gdmVuZG9yaWQpICYmCi0JCQkgICAgKHN1YmlkIDw9IDAgfHwgY29kZWMtPnN1YnN5c3RlbV9pZCA9PSBzdWJpZCkgJiYKLQkJCSAgICBjb2RlYy0+YWRkciA9PSBjYWRkcikgewotCQkJCSpjb2RlY3AgPSBjb2RlYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyogcGFyc2UgdGhlIGNvbnRlbnRzIGFmdGVyIHRoZSBvdGhlciBjb21tYW5kIHRhZ3MsIFtwaW5jZmddLCBbdmVyYl0sCi0gKiBbdmVuZG9yX2lkXSwgW3N1YnN5c3RlbV9pZF0sIFtyZXZpc2lvbl9pZF0sIFtjaGlwX25hbWVdLCBbaGludF0gYW5kIFttb2RlbF0KLSAqIGp1c3QgcGFzcyB0byB0aGUgc3lzZnMgaGVscGVyIChvbmx5IHdoZW4gYW55IGNvZGVjIHdhcyBzcGVjaWZpZWQpCi0gKi8KLXN0YXRpYyB2b2lkIHBhcnNlX3BpbmNmZ19tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCi17Ci0JcGFyc2VfdXNlcl9waW5fY29uZmlncygqY29kZWNwLCBidWYpOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZV92ZXJiX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCi17Ci0JcGFyc2VfaW5pdF92ZXJicygqY29kZWNwLCBidWYpOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZV9oaW50X21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCi17Ci0JcGFyc2VfaGludHMoKmNvZGVjcCwgYnVmKTsKLX0KLQotc3RhdGljIHZvaWQgcGFyc2VfbW9kZWxfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCi17Ci0Ja2ZyZWUoKCpjb2RlY3ApLT5tb2RlbG5hbWUpOwotCSgqY29kZWNwKS0+bW9kZWxuYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOwotfQotCi1zdGF0aWMgdm9pZCBwYXJzZV9jaGlwX25hbWVfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkJIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCi17Ci0Ja2ZyZWUoKCpjb2RlY3ApLT5jaGlwX25hbWUpOwotCSgqY29kZWNwKS0+Y2hpcF9uYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOwotfQotCi0jZGVmaW5lIERFRklORV9QQVJTRV9JRF9NT0RFKG5hbWUpIFwKLXN0YXRpYyB2b2lkIHBhcnNlXyMjbmFtZSMjX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBcCi0JCQkJIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApIFwKLXsgXAotCXVuc2lnbmVkIGxvbmcgdmFsOyBcCi0JaWYgKCFrc3RydG91bChidWYsIDAsICZ2YWwpKSBcCi0JCSgqY29kZWNwKS0+bmFtZSA9IHZhbDsgXAotfQotCi1ERUZJTkVfUEFSU0VfSURfTU9ERSh2ZW5kb3JfaWQpOwotREVGSU5FX1BBUlNFX0lEX01PREUoc3Vic3lzdGVtX2lkKTsKLURFRklORV9QQVJTRV9JRF9NT0RFKHJldmlzaW9uX2lkKTsKLQotCi1zdHJ1Y3QgaGRhX3BhdGNoX2l0ZW0gewotCWNvbnN0IGNoYXIgKnRhZzsKLQljb25zdCBjaGFyICphbGlhczsKLQl2b2lkICgqcGFyc2VyKShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKipyZXRjKTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaGRhX3BhdGNoX2l0ZW0gcGF0Y2hfaXRlbXNbTlVNX0xJTkVfTU9ERVNdID0gewotCVtMSU5FX01PREVfQ09ERUNdID0gewotCQkudGFnID0gIltjb2RlY10iLAotCQkucGFyc2VyID0gcGFyc2VfY29kZWNfbW9kZSwKLQl9LAotCVtMSU5FX01PREVfTU9ERUxdID0gewotCQkudGFnID0gIlttb2RlbF0iLAotCQkucGFyc2VyID0gcGFyc2VfbW9kZWxfbW9kZSwKLQl9LAotCVtMSU5FX01PREVfVkVSQl0gPSB7Ci0JCS50YWcgPSAiW3ZlcmJdIiwKLQkJLmFsaWFzID0gIltpbml0X3ZlcmJzXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV92ZXJiX21vZGUsCi0JfSwKLQlbTElORV9NT0RFX1BJTkNGR10gPSB7Ci0JCS50YWcgPSAiW3BpbmNmZ10iLAotCQkuYWxpYXMgPSAiW3VzZXJfcGluX2NvbmZpZ3NdIiwKLQkJLnBhcnNlciA9IHBhcnNlX3BpbmNmZ19tb2RlLAotCX0sCi0JW0xJTkVfTU9ERV9ISU5UXSA9IHsKLQkJLnRhZyA9ICJbaGludF0iLAotCQkuYWxpYXMgPSAiW2hpbnRzXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9oaW50X21vZGUKLQl9LAotCVtMSU5FX01PREVfVkVORE9SX0lEXSA9IHsKLQkJLnRhZyA9ICJbdmVuZG9yX2lkXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV92ZW5kb3JfaWRfbW9kZSwKLQl9LAotCVtMSU5FX01PREVfU1VCU1lTVEVNX0lEXSA9IHsKLQkJLnRhZyA9ICJbc3Vic3lzdGVtX2lkXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9zdWJzeXN0ZW1faWRfbW9kZSwKLQl9LAotCVtMSU5FX01PREVfUkVWSVNJT05fSURdID0gewotCQkudGFnID0gIltyZXZpc2lvbl9pZF0iLAotCQkucGFyc2VyID0gcGFyc2VfcmV2aXNpb25faWRfbW9kZSwKLQl9LAotCVtMSU5FX01PREVfQ0hJUF9OQU1FXSA9IHsKLQkJLnRhZyA9ICJbY2hpcF9uYW1lXSIsCi0JCS5wYXJzZXIgPSBwYXJzZV9jaGlwX25hbWVfbW9kZSwKLQl9LAotfTsKLQotLyogY2hlY2sgdGhlIGxpbmUgc3RhcnRpbmcgd2l0aCAnWycgLS0gY2hhbmdlIHRoZSBwYXJzZXIgbW9kZSBhY2NvZGluZ2x5ICovCi1zdGF0aWMgaW50IHBhcnNlX2xpbmVfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGF0Y2hfaXRlbXMpOyBpKyspIHsKLQkJaWYgKCFwYXRjaF9pdGVtc1tpXS50YWcpCi0JCQljb250aW51ZTsKLQkJaWYgKHN0cm1hdGNoKGJ1ZiwgcGF0Y2hfaXRlbXNbaV0udGFnKSkKLQkJCXJldHVybiBpOwotCQlpZiAocGF0Y2hfaXRlbXNbaV0uYWxpYXMgJiYgc3RybWF0Y2goYnVmLCBwYXRjaF9pdGVtc1tpXS5hbGlhcykpCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIExJTkVfTU9ERV9OT05FOwotfQotCi0vKiBjb3B5IG9uZSBsaW5lIGZyb20gdGhlIGJ1ZmZlciBpbiBmdywgYW5kIHVwZGF0ZSB0aGUgZmllbGRzIGluIGZ3Ci0gKiByZXR1cm4gemVybyBpZiBpdCByZWFjaGVzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgb3Igbm9uLXplcm8KLSAqIGlmIHN1Y2Nlc3NmdWxseSBjb3BpZWQgYSBsaW5lCi0gKgotICogdGhlIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIHRoZSBsaW5lIGFyZSBzdHJpcHBlZAotICovCi1zdGF0aWMgaW50IGdldF9saW5lX2Zyb21fZncoY2hhciAqYnVmLCBpbnQgc2l6ZSwgc2l6ZV90ICpmd19zaXplX3AsCi0JCQkgICAgY29uc3Qgdm9pZCAqKmZ3X2RhdGFfcCkKLXsKLQlpbnQgbGVuOwotCXNpemVfdCBmd19zaXplID0gKmZ3X3NpemVfcDsKLQljb25zdCBjaGFyICpwID0gKmZ3X2RhdGFfcDsKLQotCXdoaWxlIChpc3NwYWNlKCpwKSAmJiBmd19zaXplKSB7Ci0JCXArKzsKLQkJZndfc2l6ZS0tOwotCX0KLQlpZiAoIWZ3X3NpemUpCi0JCXJldHVybiAwOwotCi0JZm9yIChsZW4gPSAwOyBsZW4gPCBmd19zaXplOyBsZW4rKykgewotCQlpZiAoISpwKQotCQkJYnJlYWs7Ci0JCWlmICgqcCA9PSAnXG4nKSB7Ci0JCQlwKys7Ci0JCQlsZW4rKzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChsZW4gPCBzaXplKQotCQkJKmJ1ZisrID0gKnArKzsKLQl9Ci0JKmJ1ZiA9IDA7Ci0JKmZ3X3NpemVfcCA9IGZ3X3NpemUgLSBsZW47Ci0JKmZ3X2RhdGFfcCA9IHA7Ci0JcmVtb3ZlX3RyYWlsX3NwYWNlcyhidWYpOwotCXJldHVybiAxOwotfQotCi0vKgotICogbG9hZCBhICJwYXRjaCIgZmlybXdhcmUgZmlsZSBhbmQgcGFyc2UgaXQKLSAqLwotaW50IHNuZF9oZGFfbG9hZF9wYXRjaChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBzaXplX3QgZndfc2l6ZSwgY29uc3Qgdm9pZCAqZndfYnVmKQotewotCWNoYXIgYnVmWzEyOF07Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JaW50IGxpbmVfbW9kZTsKLQotCWxpbmVfbW9kZSA9IExJTkVfTU9ERV9OT05FOwotCWNvZGVjID0gTlVMTDsKLQl3aGlsZSAoZ2V0X2xpbmVfZnJvbV9mdyhidWYsIHNpemVvZihidWYpIC0gMSwgJmZ3X3NpemUsICZmd19idWYpKSB7Ci0JCWlmICghKmJ1ZiB8fCAqYnVmID09ICcjJyB8fCAqYnVmID09ICdcbicpCi0JCQljb250aW51ZTsKLQkJaWYgKCpidWYgPT0gJ1snKQotCQkJbGluZV9tb2RlID0gcGFyc2VfbGluZV9tb2RlKGJ1ZiwgYnVzKTsKLQkJZWxzZSBpZiAocGF0Y2hfaXRlbXNbbGluZV9tb2RlXS5wYXJzZXIgJiYKLQkJCSAoY29kZWMgfHwgbGluZV9tb2RlIDw9IExJTkVfTU9ERV9DT0RFQykpCi0JCQlwYXRjaF9pdGVtc1tsaW5lX21vZGVdLnBhcnNlcihidWYsIGJ1cywgJmNvZGVjKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2xvYWRfcGF0Y2gpOwotI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaTkxNS5jIGIvc291bmQvcGNpL2hkYS9oZGFfaTkxNS5jCmluZGV4IDc2YzEzZDUuLjlkMDdlNGVkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaTkxNS5jCkBAIC0zMCw3ICszMCw3IEBACiAJaWYgKCFnZXRfcG93ZXIgfHwgIXB1dF9wb3dlcikKIAkJcmV0dXJuOwogCi0Jc25kX3ByaW50ZGQoIkhEQSBkaXNwbGF5IHBvd2VyICVzIFxuIiwKKwlwcl9kZWJ1ZygiSERBIGRpc3BsYXkgcG93ZXIgJXMgXG4iLAogCQkJZW5hYmxlID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIpOwogCWlmIChlbmFibGUpCiAJCWdldF9wb3dlcigpOwpAQCAtNDQsNyArNDQsNyBAQAogCiAJZ2V0X3Bvd2VyID0gc3ltYm9sX3JlcXVlc3QoaTkxNV9yZXF1ZXN0X3Bvd2VyX3dlbGwpOwogCWlmICghZ2V0X3Bvd2VyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGEtaTkxNTogZ2V0X3Bvd2VyIHN5bWJvbCBnZXQgZmFpbFxuIik7CisJCXByX3dhcm4oImhkYS1pOTE1OiBnZXRfcG93ZXIgc3ltYm9sIGdldCBmYWlsXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC01NSw3ICs1NSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNuZF9wcmludGQoIkhEQSBkcml2ZXIgZ2V0IHN5bWJvbCBzdWNjZXNzZnVsbHkgZnJvbSBpOTE1IG1vZHVsZVxuIik7CisJcHJfZGVidWcoIkhEQSBkcml2ZXIgZ2V0IHN5bWJvbCBzdWNjZXNzZnVsbHkgZnJvbSBpOTE1IG1vZHVsZVxuIik7CiAKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggZTM1NGFiMS4uNzdjYTg5NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC02Myw2ICs2Myw4IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfaTkxNS5oIgorI2luY2x1ZGUgImhkYV9jb250cm9sbGVyLmgiCisjaW5jbHVkZSAiaGRhX3ByaXYuaCIKIAogCiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwpAQCAtMTI3LDYgKzEyOSw3IEBACiAjZGVmaW5lIHBhcmFtX2NoZWNrX3hpbnQgcGFyYW1fY2hlY2tfaW50CiAKIHN0YXRpYyBpbnQgcG93ZXJfc2F2ZSA9IENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkVfREVGQVVMVDsKK3N0YXRpYyBpbnQgKnBvd2VyX3NhdmVfYWRkciA9ICZwb3dlcl9zYXZlOwogbW9kdWxlX3BhcmFtKHBvd2VyX3NhdmUsIHhpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zYXZlLCAiQXV0b21hdGljIHBvd2VyLXNhdmluZyB0aW1lb3V0ICIKIAkJICIoaW4gc2Vjb25kLCAwID0gZGlzYWJsZSkuIik7CkBAIC0xMzgsNiArMTQxLDggQEAKIHN0YXRpYyBib29sIHBvd2VyX3NhdmVfY29udHJvbGxlciA9IDE7CiBtb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZV9jb250cm9sbGVyLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG93ZXJfc2F2ZV9jb250cm9sbGVyLCAiUmVzZXQgY29udHJvbGxlciBpbiBwb3dlciBzYXZlIG1vZGUuIik7CisjZWxzZQorc3RhdGljIGludCAqcG93ZXJfc2F2ZV9hZGRyOwogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgaW50IGFsaWduX2J1ZmZlcl9zaXplID0gLTE7CkBAIC0xNDksMTAgKzE1NCw4IEBACiBzdGF0aWMgYm9vbCBoZGFfc25vb3AgPSB0cnVlOwogbW9kdWxlX3BhcmFtX25hbWVkKHNub29wLCBoZGFfc25vb3AsIGJvb2wsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzbm9vcCwgIkVuYWJsZS9kaXNhYmxlIHNub29waW5nIik7Ci0jZGVmaW5lIGF6eF9zbm9vcChjaGlwKQkJKGNoaXApLT5zbm9vcAogI2Vsc2UKICNkZWZpbmUgaGRhX3Nub29wCQl0cnVlCi0jZGVmaW5lIGF6eF9zbm9vcChjaGlwKQkJdHJ1ZQogI2VuZGlmCiAKIApAQCAtMTkxLDEyICsxOTQsNiBAQAogCQkJICJ7VUxJLCBNNTQ2MX19Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIEhEQSBkcml2ZXIiKTsKIAotI2lmZGVmIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsKLSNkZWZpbmUgU0ZYCS8qIG5vcCAqLwotI2Vsc2UKLSNkZWZpbmUgU0ZYCSJoZGEtaW50ZWwgIgotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfVkdBX1NXSVRDSEVST08pCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX0hEQV9DT0RFQ19IRE1JKQogI2RlZmluZSBTVVBQT1JUX1ZHQV9TV0lUQ0hFUk9PCkBAIC0yMDUsMzY0ICsyMDIsNyBAQAogCiAKIC8qCi0gKiByZWdpc3RlcnMKICAqLwotI2RlZmluZSBJQ0g2X1JFR19HQ0FQCQkJMHgwMAotI2RlZmluZSAgIElDSDZfR0NBUF82NE9LCSgxIDw8IDApICAgLyogNjRiaXQgYWRkcmVzcyBzdXBwb3J0ICovCi0jZGVmaW5lICAgSUNINl9HQ0FQX05TRE8JKDMgPDwgMSkgICAvKiAjIG9mIHNlcmlhbCBkYXRhIG91dCBzaWduYWxzICovCi0jZGVmaW5lICAgSUNINl9HQ0FQX0JTUwkJKDMxIDw8IDMpICAvKiAjIG9mIGJpZGlyZWN0aW9uYWwgc3RyZWFtcyAqLwotI2RlZmluZSAgIElDSDZfR0NBUF9JU1MJCSgxNSA8PCA4KSAgLyogIyBvZiBpbnB1dCBzdHJlYW1zICovCi0jZGVmaW5lICAgSUNINl9HQ0FQX09TUwkJKDE1IDw8IDEyKSAvKiAjIG9mIG91dHB1dCBzdHJlYW1zICovCi0jZGVmaW5lIElDSDZfUkVHX1ZNSU4JCQkweDAyCi0jZGVmaW5lIElDSDZfUkVHX1ZNQUoJCQkweDAzCi0jZGVmaW5lIElDSDZfUkVHX09VVFBBWQkJCTB4MDQKLSNkZWZpbmUgSUNINl9SRUdfSU5QQVkJCQkweDA2Ci0jZGVmaW5lIElDSDZfUkVHX0dDVEwJCQkweDA4Ci0jZGVmaW5lICAgSUNINl9HQ1RMX1JFU0VUCSgxIDw8IDApICAgLyogY29udHJvbGxlciByZXNldCAqLwotI2RlZmluZSAgIElDSDZfR0NUTF9GQ05UUkwJKDEgPDwgMSkgICAvKiBmbHVzaCBjb250cm9sICovCi0jZGVmaW5lICAgSUNINl9HQ1RMX1VOU09MCSgxIDw8IDgpICAgLyogYWNjZXB0IHVuc29sLiByZXNwb25zZSBlbmFibGUgKi8KLSNkZWZpbmUgSUNINl9SRUdfV0FLRUVOCQkJMHgwYwotI2RlZmluZSBJQ0g2X1JFR19TVEFURVNUUwkJMHgwZQotI2RlZmluZSBJQ0g2X1JFR19HU1RTCQkJMHgxMAotI2RlZmluZSAgIElDSDZfR1NUU19GU1RTCSgxIDw8IDEpICAgLyogZmx1c2ggc3RhdHVzICovCi0jZGVmaW5lIElDSDZfUkVHX0lOVENUTAkJCTB4MjAKLSNkZWZpbmUgSUNINl9SRUdfSU5UU1RTCQkJMHgyNAotI2RlZmluZSBJQ0g2X1JFR19XQUxMQ0xLCQkweDMwCS8qIDI0TWh6IHNvdXJjZSAqLwotI2RlZmluZSBJQ0g2X1JFR19PTERfU1NZTkMJCTB4MzQJLyogU1NZTkMgZm9yIG9sZCBJQ0ggKi8KLSNkZWZpbmUgSUNINl9SRUdfU1NZTkMJCQkweDM4Ci0jZGVmaW5lIElDSDZfUkVHX0NPUkJMQkFTRQkJMHg0MAotI2RlZmluZSBJQ0g2X1JFR19DT1JCVUJBU0UJCTB4NDQKLSNkZWZpbmUgSUNINl9SRUdfQ09SQldQCQkJMHg0OAotI2RlZmluZSBJQ0g2X1JFR19DT1JCUlAJCQkweDRhCi0jZGVmaW5lICAgSUNINl9DT1JCUlBfUlNUCSgxIDw8IDE1KSAgLyogcmVhZCBwb2ludGVyIHJlc2V0ICovCi0jZGVmaW5lIElDSDZfUkVHX0NPUkJDVEwJCTB4NGMKLSNkZWZpbmUgICBJQ0g2X0NPUkJDVExfUlVOCSgxIDw8IDEpICAgLyogZW5hYmxlIERNQSAqLwotI2RlZmluZSAgIElDSDZfQ09SQkNUTF9DTUVJRQkoMSA8PCAwKSAgIC8qIGVuYWJsZSBtZW1vcnkgZXJyb3IgaXJxICovCi0jZGVmaW5lIElDSDZfUkVHX0NPUkJTVFMJCTB4NGQKLSNkZWZpbmUgICBJQ0g2X0NPUkJTVFNfQ01FSQkoMSA8PCAwKSAgIC8qIG1lbW9yeSBlcnJvciBpbmRpY2F0aW9uICovCi0jZGVmaW5lIElDSDZfUkVHX0NPUkJTSVpFCQkweDRlCi0KLSNkZWZpbmUgSUNINl9SRUdfUklSQkxCQVNFCQkweDUwCi0jZGVmaW5lIElDSDZfUkVHX1JJUkJVQkFTRQkJMHg1NAotI2RlZmluZSBJQ0g2X1JFR19SSVJCV1AJCQkweDU4Ci0jZGVmaW5lICAgSUNINl9SSVJCV1BfUlNUCSgxIDw8IDE1KSAgLyogd3JpdGUgcG9pbnRlciByZXNldCAqLwotI2RlZmluZSBJQ0g2X1JFR19SSU5UQ05UCQkweDVhCi0jZGVmaW5lIElDSDZfUkVHX1JJUkJDVEwJCTB4NWMKLSNkZWZpbmUgICBJQ0g2X1JCQ1RMX0lSUV9FTgkoMSA8PCAwKSAgIC8qIGVuYWJsZSBJUlEgKi8KLSNkZWZpbmUgICBJQ0g2X1JCQ1RMX0RNQV9FTgkoMSA8PCAxKSAgIC8qIGVuYWJsZSBETUEgKi8KLSNkZWZpbmUgICBJQ0g2X1JCQ1RMX09WRVJSVU5fRU4JKDEgPDwgMikgICAvKiBlbmFibGUgb3ZlcnJ1biBpcnEgKi8KLSNkZWZpbmUgSUNINl9SRUdfUklSQlNUUwkJMHg1ZAotI2RlZmluZSAgIElDSDZfUkJTVFNfSVJRCSgxIDw8IDApICAgLyogcmVzcG9uc2UgaXJxICovCi0jZGVmaW5lICAgSUNINl9SQlNUU19PVkVSUlVOCSgxIDw8IDIpICAgLyogb3ZlcnJ1biBpcnEgKi8KLSNkZWZpbmUgSUNINl9SRUdfUklSQlNJWkUJCTB4NWUKLQotI2RlZmluZSBJQ0g2X1JFR19JQwkJCTB4NjAKLSNkZWZpbmUgSUNINl9SRUdfSVIJCQkweDY0Ci0jZGVmaW5lIElDSDZfUkVHX0lSUwkJCTB4NjgKLSNkZWZpbmUgICBJQ0g2X0lSU19WQUxJRAkoMTw8MSkKLSNkZWZpbmUgICBJQ0g2X0lSU19CVVNZCQkoMTw8MCkKLQotI2RlZmluZSBJQ0g2X1JFR19EUExCQVNFCQkweDcwCi0jZGVmaW5lIElDSDZfUkVHX0RQVUJBU0UJCTB4NzQKLSNkZWZpbmUgICBJQ0g2X0RQTEJBU0VfRU5BQkxFCTB4MQkvKiBFbmFibGUgcG9zaXRpb24gYnVmZmVyICovCi0KLS8qIFNEIG9mZnNldDogU0RJMD0weDgwLCBTREkxPTB4YTAsIC4uLiBTRE8zPTB4MTYwICovCi1lbnVtIHsgU0RJMCwgU0RJMSwgU0RJMiwgU0RJMywgU0RPMCwgU0RPMSwgU0RPMiwgU0RPMyB9OwotCi0vKiBzdHJlYW0gcmVnaXN0ZXIgb2Zmc2V0cyBmcm9tIHN0cmVhbSBiYXNlICovCi0jZGVmaW5lIElDSDZfUkVHX1NEX0NUTAkJCTB4MDAKLSNkZWZpbmUgSUNINl9SRUdfU0RfU1RTCQkJMHgwMwotI2RlZmluZSBJQ0g2X1JFR19TRF9MUElCCQkweDA0Ci0jZGVmaW5lIElDSDZfUkVHX1NEX0NCTAkJCTB4MDgKLSNkZWZpbmUgSUNINl9SRUdfU0RfTFZJCQkJMHgwYwotI2RlZmluZSBJQ0g2X1JFR19TRF9GSUZPVwkJMHgwZQotI2RlZmluZSBJQ0g2X1JFR19TRF9GSUZPU0laRQkJMHgxMAotI2RlZmluZSBJQ0g2X1JFR19TRF9GT1JNQVQJCTB4MTIKLSNkZWZpbmUgSUNINl9SRUdfU0RfQkRMUEwJCTB4MTgKLSNkZWZpbmUgSUNINl9SRUdfU0RfQkRMUFUJCTB4MWMKLQotLyogUENJIHNwYWNlICovCi0jZGVmaW5lIElDSDZfUENJUkVHX1RDU0VMCTB4NDQKLQotLyoKLSAqIG90aGVyIGNvbnN0YW50cwotICovCi0KLS8qIG1heCBudW1iZXIgb2YgU0RzICovCi0vKiBJQ0gsIEFUSSBhbmQgVklBIGhhdmUgNCBwbGF5YmFjayBhbmQgNCBjYXB0dXJlICovCi0jZGVmaW5lIElDSDZfTlVNX0NBUFRVUkUJNAotI2RlZmluZSBJQ0g2X05VTV9QTEFZQkFDSwk0Ci0KLS8qIFVMSSBoYXMgNiBwbGF5YmFjayBhbmQgNSBjYXB0dXJlICovCi0jZGVmaW5lIFVMSV9OVU1fQ0FQVFVSRQkJNQotI2RlZmluZSBVTElfTlVNX1BMQVlCQUNLCTYKLQotLyogQVRJIEhETUkgbWF5IGhhdmUgdXAgdG8gOCBwbGF5YmFja3MgYW5kIDAgY2FwdHVyZSAqLwotI2RlZmluZSBBVElIRE1JX05VTV9DQVBUVVJFCTAKLSNkZWZpbmUgQVRJSERNSV9OVU1fUExBWUJBQ0sJOAotCi0vKiBURVJBIGhhcyA0IHBsYXliYWNrIGFuZCAzIGNhcHR1cmUgKi8KLSNkZWZpbmUgVEVSQV9OVU1fQ0FQVFVSRQkzCi0jZGVmaW5lIFRFUkFfTlVNX1BMQVlCQUNLCTQKLQotLyogdGhpcyBudW1iZXIgaXMgc3RhdGljYWxseSBkZWZpbmVkIGZvciBzaW1wbGljaXR5ICovCi0jZGVmaW5lIE1BWF9BWlhfREVWCQkxNgotCi0vKiBtYXggbnVtYmVyIG9mIGZyYWdtZW50cyAtIHdlIG1heSB1c2UgbW9yZSBpZiBhbGxvY2F0aW5nIG1vcmUgcGFnZXMgZm9yIEJETCAqLwotI2RlZmluZSBCRExfU0laRQkJNDA5NgotI2RlZmluZSBBWlhfTUFYX0JETF9FTlRSSUVTCShCRExfU0laRSAvIDE2KQotI2RlZmluZSBBWlhfTUFYX0ZSQUcJCTMyCi0vKiBtYXggYnVmZmVyIHNpemUgLSBubyBoL3cgbGltaXQsIHlvdSBjYW4gaW5jcmVhc2UgYXMgeW91IGxpa2UgKi8KLSNkZWZpbmUgQVpYX01BWF9CVUZfU0laRQkoMTAyNCoxMDI0KjEwMjQpCi0KLS8qIFJJUkIgaW50IG1hc2s6IG92ZXJydW5bMl0sIHJlc3BvbnNlWzBdICovCi0jZGVmaW5lIFJJUkJfSU5UX1JFU1BPTlNFCTB4MDEKLSNkZWZpbmUgUklSQl9JTlRfT1ZFUlJVTgkweDA0Ci0jZGVmaW5lIFJJUkJfSU5UX01BU0sJCTB4MDUKLQotLyogU1RBVEVTVFMgaW50IG1hc2s6IFMzLFNEMixTRDEsU0QwICovCi0jZGVmaW5lIEFaWF9NQVhfQ09ERUNTCQk4Ci0jZGVmaW5lIEFaWF9ERUZBVUxUX0NPREVDUwk0Ci0jZGVmaW5lIFNUQVRFU1RTX0lOVF9NQVNLCSgoMSA8PCBBWlhfTUFYX0NPREVDUykgLSAxKQotCi0vKiBTRF9DVEwgYml0cyAqLwotI2RlZmluZSBTRF9DVExfU1RSRUFNX1JFU0VUCTB4MDEJLyogc3RyZWFtIHJlc2V0IGJpdCAqLwotI2RlZmluZSBTRF9DVExfRE1BX1NUQVJUCTB4MDIJLyogc3RyZWFtIERNQSBzdGFydCBiaXQgKi8KLSNkZWZpbmUgU0RfQ1RMX1NUUklQRQkJKDMgPDwgMTYpCS8qIHN0cmlwZSBjb250cm9sICovCi0jZGVmaW5lIFNEX0NUTF9UUkFGRklDX1BSSU8JKDEgPDwgMTgpCS8qIHRyYWZmaWMgcHJpb3JpdHkgKi8KLSNkZWZpbmUgU0RfQ1RMX0RJUgkJKDEgPDwgMTkpCS8qIGJpLWRpcmVjdGlvbmFsIHN0cmVhbSAqLwotI2RlZmluZSBTRF9DVExfU1RSRUFNX1RBR19NQVNLCSgweGYgPDwgMjApCi0jZGVmaW5lIFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUCTIwCi0KLS8qIFNEX0NUTCBhbmQgU0RfU1RTICovCi0jZGVmaW5lIFNEX0lOVF9ERVNDX0VSUgkJMHgxMAkvKiBkZXNjcmlwdG9yIGVycm9yIGludGVycnVwdCAqLwotI2RlZmluZSBTRF9JTlRfRklGT19FUlIJCTB4MDgJLyogRklGTyBlcnJvciBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0RfSU5UX0NPTVBMRVRFCQkweDA0CS8qIGNvbXBsZXRpb24gaW50ZXJydXB0ICovCi0jZGVmaW5lIFNEX0lOVF9NQVNLCQkoU0RfSU5UX0RFU0NfRVJSfFNEX0lOVF9GSUZPX0VSUnxcCi0JCQkJIFNEX0lOVF9DT01QTEVURSkKLQotLyogU0RfU1RTICovCi0jZGVmaW5lIFNEX1NUU19GSUZPX1JFQURZCTB4MjAJLyogRklGTyByZWFkeSAqLwotCi0vKiBJTlRDVEwgYW5kIElOVFNUUyAqLwotI2RlZmluZSBJQ0g2X0lOVF9BTExfU1RSRUFNCTB4ZmYJICAgLyogYWxsIHN0cmVhbSBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIElDSDZfSU5UX0NUUkxfRU4JMHg0MDAwMDAwMCAvKiBjb250cm9sbGVyIGludGVycnVwdCBlbmFibGUgYml0ICovCi0jZGVmaW5lIElDSDZfSU5UX0dMT0JBTF9FTgkweDgwMDAwMDAwIC8qIGdsb2JhbCBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLwotCi0vKiBiZWxvdyBhcmUgc28gZmFyIGhhcmRjb2RlZCAtIHNob3VsZCByZWFkIHJlZ2lzdGVycyBpbiBmdXR1cmUgKi8KLSNkZWZpbmUgSUNINl9NQVhfQ09SQl9FTlRSSUVTCTI1NgotI2RlZmluZSBJQ0g2X01BWF9SSVJCX0VOVFJJRVMJMjU2Ci0KLS8qIHBvc2l0aW9uIGZpeCBtb2RlICovCi1lbnVtIHsKLQlQT1NfRklYX0FVVE8sCi0JUE9TX0ZJWF9MUElCLAotCVBPU19GSVhfUE9TQlVGLAotCVBPU19GSVhfVklBQ09NQk8sCi0JUE9TX0ZJWF9DT01CTywKLX07Ci0KLS8qIERlZmluZXMgZm9yIEFUSSBIRCBBdWRpbyBzdXBwb3J0IGluIFNCNDUwIHNvdXRoIGJyaWRnZSAqLwotI2RlZmluZSBBVElfU0I0NTBfSERBVURJT19NSVNDX0NOVFIyX0FERFIgICAweDQyCi0jZGVmaW5lIEFUSV9TQjQ1MF9IREFVRElPX0VOQUJMRV9TTk9PUCAgICAgIDB4MDIKLQotLyogRGVmaW5lcyBmb3IgTnZpZGlhIEhEQSBzdXBwb3J0ICovCi0jZGVmaW5lIE5WSURJQV9IREFfVFJBTlNSRUdfQUREUiAgICAgIDB4NGUKLSNkZWZpbmUgTlZJRElBX0hEQV9FTkFCTEVfQ09IQklUUyAgICAgMHgwZgotI2RlZmluZSBOVklESUFfSERBX0lTVFJNX0NPSCAgICAgICAgICAweDRkCi0jZGVmaW5lIE5WSURJQV9IREFfT1NUUk1fQ09IICAgICAgICAgIDB4NGMKLSNkZWZpbmUgTlZJRElBX0hEQV9FTkFCTEVfQ09IQklUICAgICAgMHgwMQotCi0vKiBEZWZpbmVzIGZvciBJbnRlbCBTQ0ggSERBIHNub29wIGNvbnRyb2wgKi8KLSNkZWZpbmUgSU5URUxfU0NIX0hEQV9ERVZDICAgICAgMHg3OAotI2RlZmluZSBJTlRFTF9TQ0hfSERBX0RFVkNfTk9TTk9PUCAgICAgICAoMHgxPDwxMSkKLQotLyogRGVmaW5lIElOIHN0cmVhbSAwIEZJRk8gc2l6ZSBvZmZzZXQgaW4gVklBIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgVklBX0lOX1NUUkVBTTBfRklGT19TSVpFX09GRlNFVAkweDkwCi0vKiBEZWZpbmUgVklBIEhEIEF1ZGlvIERldmljZSBJRCovCi0jZGVmaW5lIFZJQV9IREFDX0RFVklDRV9JRAkJMHgzMjg4Ci0KLS8qIEhEIEF1ZGlvIGNsYXNzIGNvZGUgKi8KLSNkZWZpbmUgUENJX0NMQVNTX01VTFRJTUVESUFfSERfQVVESU8JMHgwNDAzCi0KLS8qCi0gKi8KLQotc3RydWN0IGF6eF9kZXYgewotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBiZGw7IC8qIEJETCBidWZmZXIgKi8KLQl1MzIgKnBvc2J1ZjsJCS8qIHBvc2l0aW9uIGJ1ZmZlciBwb2ludGVyICovCi0KLQl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsJLyogc2l6ZSBvZiB0aGUgcGxheSBidWZmZXIgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzOyAvKiBzaXplIG9mIHRoZSBwZXJpb2QgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQgZnJhZ3M7CS8qIG51bWJlciBmb3IgcGVyaW9kIGluIHRoZSBwbGF5IGJ1ZmZlciAqLwotCXVuc2lnbmVkIGludCBmaWZvX3NpemU7CS8qIEZJRk8gc2l6ZSAqLwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfd2FsbGNsazsJLyogc3RhcnQgKyBtaW5pbXVtIHdhbGxjbGsgKi8KLQl1bnNpZ25lZCBsb25nIHBlcmlvZF93YWxsY2xrOwkvKiB3YWxsY2xrIGZvciBwZXJpb2QgKi8KLQotCXZvaWQgX19pb21lbSAqc2RfYWRkcjsJLyogc3RyZWFtIGRlc2NyaXB0b3IgcG9pbnRlciAqLwotCi0JdTMyIHNkX2ludF9zdGFfbWFzazsJLyogc3RyZWFtIGludCBzdGF0dXMgbWFzayAqLwotCi0JLyogcGNtIHN1cHBvcnQgKi8KLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsJLyogYXNzaWduZWQgc3Vic3RyZWFtLAotCQkJCQkJICogc2V0IGluIFBDTSBvcGVuCi0JCQkJCQkgKi8KLQl1bnNpZ25lZCBpbnQgZm9ybWF0X3ZhbDsJLyogZm9ybWF0IHZhbHVlIHRvIGJlIHNldCBpbiB0aGUKLQkJCQkJICogY29udHJvbGxlciBhbmQgdGhlIGNvZGVjCi0JCQkJCSAqLwotCXVuc2lnbmVkIGNoYXIgc3RyZWFtX3RhZzsJLyogYXNzaWduZWQgc3RyZWFtICovCi0JdW5zaWduZWQgY2hhciBpbmRleDsJCS8qIHN0cmVhbSBpbmRleCAqLwotCWludCBhc3NpZ25lZF9rZXk7CQkvKiBsYXN0IGRldmljZSMga2V5IGFzc2lnbmVkIHRvICovCi0KLQl1bnNpZ25lZCBpbnQgb3BlbmVkIDoxOwotCXVuc2lnbmVkIGludCBydW5uaW5nIDoxOwotCXVuc2lnbmVkIGludCBpcnFfcGVuZGluZyA6MTsKLQl1bnNpZ25lZCBpbnQgcHJlcGFyZWQ6MTsKLQl1bnNpZ25lZCBpbnQgbG9ja2VkOjE7Ci0JLyoKLQkgKiBGb3IgVklBOgotCSAqICBBIGZsYWcgdG8gZW5zdXJlIERNQSBwb3NpdGlvbiBpcyAwCi0JICogIHdoZW4gbGluayBwb3NpdGlvbiBpcyBub3QgZ3JlYXRlciB0aGFuIEZJRk8gc2l6ZQotCSAqLwotCXVuc2lnbmVkIGludCBpbnN1ZmZpY2llbnQgOjE7Ci0JdW5zaWduZWQgaW50IHdjX21hcmtlZDoxOwotCXVuc2lnbmVkIGludCBub19wZXJpb2Rfd2FrZXVwOjE7Ci0KLQlzdHJ1Y3QgdGltZWNvdW50ZXIgIGF6eF90YzsKLQlzdHJ1Y3QgY3ljbGVjb3VudGVyIGF6eF9jYzsKLQotCWludCBkZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQ7Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCi0Jc3RydWN0IG11dGV4IGRzcF9tdXRleDsKLSNlbmRpZgotfTsKLQotLyogRFNQIGxvY2sgaGVscGVycyAqLwotI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKLSNkZWZpbmUgZHNwX2xvY2tfaW5pdChkZXYpCW11dGV4X2luaXQoJihkZXYpLT5kc3BfbXV0ZXgpCi0jZGVmaW5lIGRzcF9sb2NrKGRldikJCW11dGV4X2xvY2soJihkZXYpLT5kc3BfbXV0ZXgpCi0jZGVmaW5lIGRzcF91bmxvY2soZGV2KQkJbXV0ZXhfdW5sb2NrKCYoZGV2KS0+ZHNwX211dGV4KQotI2RlZmluZSBkc3BfaXNfbG9ja2VkKGRldikJKChkZXYpLT5sb2NrZWQpCi0jZWxzZQotI2RlZmluZSBkc3BfbG9ja19pbml0KGRldikJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGRzcF9sb2NrKGRldikJCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBkc3BfdW5sb2NrKGRldikJCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBkc3BfaXNfbG9ja2VkKGRldikJMAotI2VuZGlmCi0KLS8qIENPUkIvUklSQiAqLwotc3RydWN0IGF6eF9yYiB7Ci0JdTMyICpidWY7CQkvKiBDT1JCL1JJUkIgYnVmZmVyCi0JCQkJICogRWFjaCBDT1JCIGVudHJ5IGlzIDRieXRlLCBSSVJCIGlzIDhieXRlCi0JCQkJICovCi0JZG1hX2FkZHJfdCBhZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIENPUkIvUklSQiBidWZmZXIgKi8KLQkvKiBmb3IgUklSQiAqLwotCXVuc2lnbmVkIHNob3J0IHJwLCB3cDsJLyogcmVhZC93cml0ZSBwb2ludGVycyAqLwotCWludCBjbWRzW0FaWF9NQVhfQ09ERUNTXTsJLyogbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMgKi8KLQl1MzIgcmVzW0FaWF9NQVhfQ09ERUNTXTsJLyogbGFzdCByZWFkIHZhbHVlICovCi19OwotCi1zdHJ1Y3QgYXp4X3BjbSB7Ci0Jc3RydWN0IGF6eCAqY2hpcDsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm9bMl07Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotc3RydWN0IGF6eCB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBwY2lfZGV2ICpwY2k7Ci0JaW50IGRldl9pbmRleDsKLQotCS8qIGNoaXAgdHlwZSBzcGVjaWZpYyAqLwotCWludCBkcml2ZXJfdHlwZTsKLQl1bnNpZ25lZCBpbnQgZHJpdmVyX2NhcHM7Ci0JaW50IHBsYXliYWNrX3N0cmVhbXM7Ci0JaW50IHBsYXliYWNrX2luZGV4X29mZnNldDsKLQlpbnQgY2FwdHVyZV9zdHJlYW1zOwotCWludCBjYXB0dXJlX2luZGV4X29mZnNldDsKLQlpbnQgbnVtX3N0cmVhbXM7Ci0KLQkvKiBwY2kgcmVzb3VyY2VzICovCi0JdW5zaWduZWQgbG9uZyBhZGRyOwotCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKLQlpbnQgaXJxOwotCi0JLyogbG9ja3MgKi8KLQlzcGlubG9ja190IHJlZ19sb2NrOwotCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwotCXN0cnVjdCBjb21wbGV0aW9uIHByb2JlX3dhaXQ7Ci0KLQkvKiBzdHJlYW1zICh4IG51bV9zdHJlYW1zKSAqLwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OwotCi0JLyogUENNICovCi0Jc3RydWN0IGxpc3RfaGVhZCBwY21fbGlzdDsgLyogYXp4X3BjbSBsaXN0ICovCi0KLQkvKiBIRCBjb2RlYyAqLwotCXVuc2lnbmVkIHNob3J0IGNvZGVjX21hc2s7Ci0JaW50ICBjb2RlY19wcm9iZV9tYXNrOyAvKiBjb3BpZWQgZnJvbSBwcm9iZV9tYXNrIG9wdGlvbiAqLwotCXN0cnVjdCBoZGFfYnVzICpidXM7Ci0JdW5zaWduZWQgaW50IGJlZXBfbW9kZTsKLQotCS8qIENPUkIvUklSQiAqLwotCXN0cnVjdCBhenhfcmIgY29yYjsKLQlzdHJ1Y3QgYXp4X3JiIHJpcmI7Ci0KLQkvKiBDT1JCL1JJUkIgYW5kIHBvc2l0aW9uIGJ1ZmZlcnMgKi8KLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgcmI7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyIHBvc2J1ZjsKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0jZW5kaWYKLQotCS8qIGZsYWdzICovCi0JaW50IHBvc2l0aW9uX2ZpeFsyXTsgLyogZm9yIGJvdGggcGxheWJhY2svY2FwdHVyZSBzdHJlYW1zICovCi0JaW50IHBvbGxfY291bnQ7Ci0JdW5zaWduZWQgaW50IHJ1bm5pbmcgOjE7Ci0JdW5zaWduZWQgaW50IGluaXRpYWxpemVkIDoxOwotCXVuc2lnbmVkIGludCBzaW5nbGVfY21kIDoxOwotCXVuc2lnbmVkIGludCBwb2xsaW5nX21vZGUgOjE7Ci0JdW5zaWduZWQgaW50IG1zaSA6MTsKLQl1bnNpZ25lZCBpbnQgaXJxX3BlbmRpbmdfd2FybmVkIDoxOwotCXVuc2lnbmVkIGludCBwcm9iaW5nIDoxOyAvKiBjb2RlYyBwcm9iaW5nIHBoYXNlICovCi0JdW5zaWduZWQgaW50IHNub29wOjE7Ci0JdW5zaWduZWQgaW50IGFsaWduX2J1ZmZlcl9zaXplOjE7Ci0JdW5zaWduZWQgaW50IHJlZ2lvbl9yZXF1ZXN0ZWQ6MTsKLQotCS8qIFZHQS1zd2l0Y2hlcm9vIHNldHVwICovCi0JdW5zaWduZWQgaW50IHVzZV92Z2Ffc3dpdGNoZXJvbzoxOwotCXVuc2lnbmVkIGludCB2Z2Ffc3dpdGNoZXJvb19yZWdpc3RlcmVkOjE7Ci0JdW5zaWduZWQgaW50IGluaXRfZmFpbGVkOjE7IC8qIGRlbGF5ZWQgaW5pdCBmYWlsZWQgKi8KLQl1bnNpZ25lZCBpbnQgZGlzYWJsZWQ6MTsgLyogZGlzYWJsZWQgYnkgVkdBLXN3aXRjaGVyICovCi0KLQkvKiBmb3IgZGVidWdnaW5nICovCi0JdW5zaWduZWQgaW50IGxhc3RfY21kW0FaWF9NQVhfQ09ERUNTXTsKLQotCS8qIGZvciBwZW5kaW5nIGlycXMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXJxX3BlbmRpbmdfd29yazsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCBwcm9iZV93b3JrOwotCi0JLyogcmVib290IG5vdGlmaWVyIChmb3IgbXlzdGVyaW91cyBoYW5ndXAgcHJvYmxlbSBhdCBwb3dlci1kb3duKSAqLwotCXN0cnVjdCBub3RpZmllcl9ibG9jayByZWJvb3Rfbm90aWZpZXI7Ci0KLQkvKiBjYXJkIGxpc3QgKGZvciBwb3dlcl9zYXZlIHRyaWdnZXIpICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgotCXN0cnVjdCBhenhfZGV2IHNhdmVkX2F6eF9kZXY7Ci0jZW5kaWYKLQotCS8qIHNlY29uZGFyeSBwb3dlciBkb21haW4gZm9yIGhkbWkgYXVkaW8gdW5kZXIgdmdhIGRldmljZSAqLwotCXN0cnVjdCBkZXZfcG1fZG9tYWluIGhkbWlfcG1fZG9tYWluOwotfTsKLQotI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCi0jaW5jbHVkZSAiaGRhX2ludGVsX3RyYWNlLmgiCiAKIC8qIGRyaXZlciB0eXBlcyAqLwogZW51bSB7CkBAIC01ODQsMjggKzIyNCw2IEBACiAJQVpYX05VTV9EUklWRVJTLCAvKiBrZWVwIHRoaXMgYXMgbGFzdCBlbnRyeSAqLwogfTsKIAotLyogZHJpdmVyIHF1aXJrcyAoY2FwYWJpbGl0aWVzKSAqLwotLyogYml0cyAwLTcgYXJlIHVzZWQgZm9yIGluZGljYXRpbmcgZHJpdmVyIHR5cGUgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX05PX1RDU0VMCSgxIDw8IDgpCS8qIE5vIEludGVsIFRDU0VMIGJpdCAqLwotI2RlZmluZSBBWlhfRENBUFNfTk9fTVNJCSgxIDw8IDkpCS8qIE5vIE1TSSBzdXBwb3J0ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19BVElfU05PT1AJKDEgPDwgMTApCS8qIEFUSSBzbm9vcCBlbmFibGUgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX05WSURJQV9TTk9PUAkoMSA8PCAxMSkJLyogTnZpZGlhIHNub29wIGVuYWJsZSAqLwotI2RlZmluZSBBWlhfRENBUFNfU0NIX1NOT09QCSgxIDw8IDEyKQkvKiBTQ0gvUENIIHNub29wIGVuYWJsZSAqLwotI2RlZmluZSBBWlhfRENBUFNfUklSQl9ERUxBWQkoMSA8PCAxMykJLyogTG9uZyBkZWxheSBpbiByZWFkIGxvb3AgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZICgxIDw8IDE0KQkvKiBQdXQgYSBkZWxheSBiZWZvcmUgcmVhZCAqLwotI2RlZmluZSBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQgKDEgPDwgMTUpCS8qIFgtRmkgd29ya2Fyb3VuZCAqLwotI2RlZmluZSBBWlhfRENBUFNfUE9TRklYX0xQSUIJKDEgPDwgMTYpCS8qIFVzZSBMUElCIGFzIGRlZmF1bHQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1BPU0ZJWF9WSUEJKDEgPDwgMTcpCS8qIFVzZSBWSUFDT01CTyBhcyBkZWZhdWx0ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19OT182NEJJVAkoMSA8PCAxOCkJLyogTm8gNjRiaXQgYWRkcmVzcyAqLwotI2RlZmluZSBBWlhfRENBUFNfU1lOQ19XUklURQkoMSA8PCAxOSkJLyogc3luYyBlYWNoIGNtZCB3cml0ZSAqLwotI2RlZmluZSBBWlhfRENBUFNfT0xEX1NTWU5DCSgxIDw8IDIwKQkvKiBPbGQgU1NZTkMgcmVnIGZvciBJQ0ggKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0JVRlNJWkUJKDEgPDwgMjEpCS8qIG5vIGJ1ZmZlciBzaXplIGFsaWdubWVudCAqLwotI2RlZmluZSBBWlhfRENBUFNfQUxJR05fQlVGU0laRQkoMSA8PCAyMikJLyogYnVmZmVyIHNpemUgYWxpZ25tZW50ICovCi0jZGVmaW5lIEFaWF9EQ0FQU180S19CRExFX0JPVU5EQVJZICgxIDw8IDIzKQkvKiBCRExFIGluIDRrIGJvdW5kYXJ5ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19DT1VOVF9MUElCX0RFTEFZICAoMSA8PCAyNSkJLyogVGFrZSBMUElCIGFzIGRlbGF5ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19QTV9SVU5USU1FCSgxIDw8IDI2KQkvKiBydW50aW1lIFBNIHN1cHBvcnQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0k5MTVfUE9XRVJXRUxMICgxIDw8IDI3KQkvKiBIU1cgaTkxNSBwb3dlciB3ZWxsIHN1cHBvcnQgKi8KLQogLyogcXVpcmtzIGZvciBJbnRlbCBQQ0ggKi8KICNkZWZpbmUgQVpYX0RDQVBTX0lOVEVMX1BDSF9OT1BNIFwKIAkoQVpYX0RDQVBTX1NDSF9TTk9PUCB8IEFaWF9EQ0FQU19CVUZTSVpFIHwgXApAQCAtNjYzLDM4ICsyODEsNiBAQAogCVtBWlhfRFJJVkVSX0dFTkVSSUNdID0gIkhELUF1ZGlvIEdlbmVyaWMiLAogfTsKIAotLyoKLSAqIG1hY3JvcyBmb3IgZWFzeSB1c2UKLSAqLwotI2RlZmluZSBhenhfd3JpdGVsKGNoaXAscmVnLHZhbHVlKSBcCi0Jd3JpdGVsKHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3JlYWRsKGNoaXAscmVnKSBcCi0JcmVhZGwoKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF93cml0ZXcoY2hpcCxyZWcsdmFsdWUpIFwKLQl3cml0ZXcodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfcmVhZHcoY2hpcCxyZWcpIFwKLQlyZWFkdygoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3dyaXRlYihjaGlwLHJlZyx2YWx1ZSkgXAotCXdyaXRlYih2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9yZWFkYihjaGlwLHJlZykgXAotCXJlYWRiKChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKQotCi0jZGVmaW5lIGF6eF9zZF93cml0ZWwoZGV2LHJlZyx2YWx1ZSkgXAotCXdyaXRlbCh2YWx1ZSwgKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3NkX3JlYWRsKGRldixyZWcpIFwKLQlyZWFkbCgoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfc2Rfd3JpdGV3KGRldixyZWcsdmFsdWUpIFwKLQl3cml0ZXcodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0jZGVmaW5lIGF6eF9zZF9yZWFkdyhkZXYscmVnKSBcCi0JcmVhZHcoKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykKLSNkZWZpbmUgYXp4X3NkX3dyaXRlYihkZXYscmVnLHZhbHVlKSBcCi0Jd3JpdGViKHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKQotI2RlZmluZSBhenhfc2RfcmVhZGIoZGV2LHJlZykgXAotCXJlYWRiKChkZXYpLT5zZF9hZGRyICsgSUNINl9SRUdfIyNyZWcpCi0KLS8qIGZvciBwY20gc3VwcG9ydCAqLwotI2RlZmluZSBnZXRfYXp4X2RldihzdWJzdHJlYW0pIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YSkKLQogI2lmZGVmIENPTkZJR19YODYKIHN0YXRpYyB2b2lkIF9fbWFya19wYWdlc193YyhzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIsIGJvb2wgb24pCiB7CkBAIC03NDksNTc4ICszMzUsNiBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQgYXp4X2FjcXVpcmVfaXJxKHN0cnVjdCBhenggKmNoaXAsIGludCBkb19kaXNjb25uZWN0KTsKLXN0YXRpYyBpbnQgYXp4X3NlbmRfY21kKHN0cnVjdCBoZGFfYnVzICpidXMsIHVuc2lnbmVkIGludCB2YWwpOwotLyoKLSAqIEludGVyZmFjZSBmb3IgSEQgY29kZWMKLSAqLwotCi0vKgotICogQ09SQiAvIFJJUkIgaW50ZXJmYWNlCi0gKi8KLXN0YXRpYyBpbnQgYXp4X2FsbG9jX2NtZF9pbyhzdHJ1Y3QgYXp4ICpjaGlwKQotewotCWludCBlcnI7Ci0KLQkvKiBzaW5nbGUgcGFnZSAoYXQgbGVhc3QgNDA5NiBieXRlcykgbXVzdCBzdWZmaWNlIGZvciBib3RoIHJpbmdidWZmZXMgKi8KLQllcnIgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwKLQkJCQkgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKLQkJCQkgIFBBR0VfU0laRSwgJmNoaXAtPnJiKTsKLQlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBDT1JCL1JJUkJcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQlyZXR1cm4gZXJyOwotCX0KLQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5yYiwgdHJ1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF6eF9pbml0X2NtZF9pbyhzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkvKiBDT1JCIHNldCB1cCAqLwotCWNoaXAtPmNvcmIuYWRkciA9IGNoaXAtPnJiLmFkZHI7Ci0JY2hpcC0+Y29yYi5idWYgPSAodTMyICopY2hpcC0+cmIuYXJlYTsKLQlhenhfd3JpdGVsKGNoaXAsIENPUkJMQkFTRSwgKHUzMiljaGlwLT5jb3JiLmFkZHIpOwotCWF6eF93cml0ZWwoY2hpcCwgQ09SQlVCQVNFLCB1cHBlcl8zMl9iaXRzKGNoaXAtPmNvcmIuYWRkcikpOwotCi0JLyogc2V0IHRoZSBjb3JiIHNpemUgdG8gMjU2IGVudHJpZXMgKFVMSSByZXF1aXJlcyBleHBsaWNpdGx5KSAqLwotCWF6eF93cml0ZWIoY2hpcCwgQ09SQlNJWkUsIDB4MDIpOwotCS8qIHNldCB0aGUgY29yYiB3cml0ZSBwb2ludGVyIHRvIDAgKi8KLQlhenhfd3JpdGV3KGNoaXAsIENPUkJXUCwgMCk7Ci0JLyogcmVzZXQgdGhlIGNvcmIgaHcgcmVhZCBwb2ludGVyICovCi0JYXp4X3dyaXRldyhjaGlwLCBDT1JCUlAsIElDSDZfQ09SQlJQX1JTVCk7Ci0JLyogZW5hYmxlIGNvcmIgZG1hICovCi0JYXp4X3dyaXRlYihjaGlwLCBDT1JCQ1RMLCBJQ0g2X0NPUkJDVExfUlVOKTsKLQotCS8qIFJJUkIgc2V0IHVwICovCi0JY2hpcC0+cmlyYi5hZGRyID0gY2hpcC0+cmIuYWRkciArIDIwNDg7Ci0JY2hpcC0+cmlyYi5idWYgPSAodTMyICopKGNoaXAtPnJiLmFyZWEgKyAyMDQ4KTsKLQljaGlwLT5yaXJiLndwID0gY2hpcC0+cmlyYi5ycCA9IDA7Ci0JbWVtc2V0KGNoaXAtPnJpcmIuY21kcywgMCwgc2l6ZW9mKGNoaXAtPnJpcmIuY21kcykpOwotCWF6eF93cml0ZWwoY2hpcCwgUklSQkxCQVNFLCAodTMyKWNoaXAtPnJpcmIuYWRkcik7Ci0JYXp4X3dyaXRlbChjaGlwLCBSSVJCVUJBU0UsIHVwcGVyXzMyX2JpdHMoY2hpcC0+cmlyYi5hZGRyKSk7Ci0KLQkvKiBzZXQgdGhlIHJpcmIgc2l6ZSB0byAyNTYgZW50cmllcyAoVUxJIHJlcXVpcmVzIGV4cGxpY2l0bHkpICovCi0JYXp4X3dyaXRlYihjaGlwLCBSSVJCU0laRSwgMHgwMik7Ci0JLyogcmVzZXQgdGhlIHJpcmIgaHcgd3JpdGUgcG9pbnRlciAqLwotCWF6eF93cml0ZXcoY2hpcCwgUklSQldQLCBJQ0g2X1JJUkJXUF9SU1QpOwotCS8qIHNldCBOPTEsIGdldCBSSVJCIHJlc3BvbnNlIGludGVycnVwdCBmb3IgbmV3IGVudHJ5ICovCi0JaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX0NUWF9XT1JLQVJPVU5EKQotCQlhenhfd3JpdGV3KGNoaXAsIFJJTlRDTlQsIDB4YzApOwotCWVsc2UKLQkJYXp4X3dyaXRldyhjaGlwLCBSSU5UQ05ULCAxKTsKLQkvKiBlbmFibGUgcmlyYiBkbWEgYW5kIHJlc3BvbnNlIGlycSAqLwotCWF6eF93cml0ZWIoY2hpcCwgUklSQkNUTCwgSUNINl9SQkNUTF9ETUFfRU4gfCBJQ0g2X1JCQ1RMX0lSUV9FTik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF6eF9mcmVlX2NtZF9pbyhzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkvKiBkaXNhYmxlIHJpbmdidWZmZXIgRE1BcyAqLwotCWF6eF93cml0ZWIoY2hpcCwgUklSQkNUTCwgMCk7Ci0JYXp4X3dyaXRlYihjaGlwLCBDT1JCQ1RMLCAwKTsKLQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBhenhfY29tbWFuZF9hZGRyKHUzMiBjbWQpCi17Ci0JdW5zaWduZWQgaW50IGFkZHIgPSBjbWQgPj4gMjg7Ci0KLQlpZiAoYWRkciA+PSBBWlhfTUFYX0NPREVDUykgewotCQlzbmRfQlVHKCk7Ci0JCWFkZHIgPSAwOwotCX0KLQotCXJldHVybiBhZGRyOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9yZXNwb25zZV9hZGRyKHUzMiByZXMpCi17Ci0JdW5zaWduZWQgaW50IGFkZHIgPSByZXMgJiAweGY7Ci0KLQlpZiAoYWRkciA+PSBBWlhfTUFYX0NPREVDUykgewotCQlzbmRfQlVHKCk7Ci0JCWFkZHIgPSAwOwotCX0KLQotCXJldHVybiBhZGRyOwotfQotCi0vKiBzZW5kIGEgY29tbWFuZCAqLwotc3RhdGljIGludCBhenhfY29yYl9zZW5kX2NtZChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1MzIgdmFsKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IGF6eF9jb21tYW5kX2FkZHIodmFsKTsKLQl1bnNpZ25lZCBpbnQgd3AsIHJwOwotCi0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCi0JLyogYWRkIGNvbW1hbmQgdG8gY29yYiAqLwotCXdwID0gYXp4X3JlYWR3KGNoaXAsIENPUkJXUCk7Ci0JaWYgKHdwID09IDB4ZmZmZikgewotCQkvKiBzb21ldGhpbmcgd3JvbmcsIGNvbnRyb2xsZXIgbGlrZWx5IHR1cm5lZCB0byBEMyAqLwotCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXdwKys7Ci0Jd3AgJT0gSUNINl9NQVhfQ09SQl9FTlRSSUVTOwotCi0JcnAgPSBhenhfcmVhZHcoY2hpcCwgQ09SQlJQKTsKLQlpZiAod3AgPT0gcnApIHsKLQkJLyogb29wcywgaXQncyBmdWxsICovCi0JCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQljaGlwLT5yaXJiLmNtZHNbYWRkcl0rKzsKLQljaGlwLT5jb3JiLmJ1Zlt3cF0gPSBjcHVfdG9fbGUzMih2YWwpOwotCWF6eF93cml0ZWwoY2hpcCwgQ09SQldQLCB3cCk7Ci0KLQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIElDSDZfUklSQl9FWF9VTlNPTF9FVgkoMTw8NCkKLQotLyogcmV0cmlldmUgUklSQiBlbnRyeSAtIGNhbGxlZCBmcm9tIGludGVycnVwdCBoYW5kbGVyICovCi1zdGF0aWMgdm9pZCBhenhfdXBkYXRlX3JpcmIoc3RydWN0IGF6eCAqY2hpcCkKLXsKLQl1bnNpZ25lZCBpbnQgcnAsIHdwOwotCXVuc2lnbmVkIGludCBhZGRyOwotCXUzMiByZXMsIHJlc19leDsKLQotCXdwID0gYXp4X3JlYWR3KGNoaXAsIFJJUkJXUCk7Ci0JaWYgKHdwID09IDB4ZmZmZikgewotCQkvKiBzb21ldGhpbmcgd3JvbmcsIGNvbnRyb2xsZXIgbGlrZWx5IHR1cm5lZCB0byBEMyAqLwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHdwID09IGNoaXAtPnJpcmIud3ApCi0JCXJldHVybjsKLQljaGlwLT5yaXJiLndwID0gd3A7Ci0KLQl3aGlsZSAoY2hpcC0+cmlyYi5ycCAhPSB3cCkgewotCQljaGlwLT5yaXJiLnJwKys7Ci0JCWNoaXAtPnJpcmIucnAgJT0gSUNINl9NQVhfUklSQl9FTlRSSUVTOwotCi0JCXJwID0gY2hpcC0+cmlyYi5ycCA8PCAxOyAvKiBhbiBSSVJCIGVudHJ5IGlzIDgtYnl0ZXMgKi8KLQkJcmVzX2V4ID0gbGUzMl90b19jcHUoY2hpcC0+cmlyYi5idWZbcnAgKyAxXSk7Ci0JCXJlcyA9IGxlMzJfdG9fY3B1KGNoaXAtPnJpcmIuYnVmW3JwXSk7Ci0JCWFkZHIgPSBhenhfcmVzcG9uc2VfYWRkcihyZXNfZXgpOwotCQlpZiAocmVzX2V4ICYgSUNINl9SSVJCX0VYX1VOU09MX0VWKQotCQkJc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudChjaGlwLT5idXMsIHJlcywgcmVzX2V4KTsKLQkJZWxzZSBpZiAoY2hpcC0+cmlyYi5jbWRzW2FkZHJdKSB7Ci0JCQljaGlwLT5yaXJiLnJlc1thZGRyXSA9IHJlczsKLQkJCXNtcF93bWIoKTsKLQkJCWNoaXAtPnJpcmIuY21kc1thZGRyXS0tOwotCQl9IGVsc2UgaWYgKHByaW50a19yYXRlbGltaXQoKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBzcHVyaW91cyByZXNwb25zZSAlI3g6JSN4LCBsYXN0IGNtZD0lIzA4eFxuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLAotCQkJCSAgIHJlcywgcmVzX2V4LAotCQkJCSAgIGNoaXAtPmxhc3RfY21kW2FkZHJdKTsKLQkJfQotCX0KLX0KLQotLyogcmVjZWl2ZSBhIHJlc3BvbnNlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9yaXJiX2dldF9yZXNwb25zZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLAotCQkJCQkgIHVuc2lnbmVkIGludCBhZGRyKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBsb29wY291bnRlcjsKLQlpbnQgZG9fcG9sbCA9IDA7Ci0KLSBhZ2FpbjoKLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7Ci0KLQlmb3IgKGxvb3Bjb3VudGVyID0gMDs7IGxvb3Bjb3VudGVyKyspIHsKLQkJaWYgKGNoaXAtPnBvbGxpbmdfbW9kZSB8fCBkb19wb2xsKSB7Ci0JCQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JCQlhenhfdXBkYXRlX3JpcmIoY2hpcCk7Ci0JCQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQkJfQotCQlpZiAoIWNoaXAtPnJpcmIuY21kc1thZGRyXSkgewotCQkJc21wX3JtYigpOwotCQkJYnVzLT5yaXJiX2Vycm9yID0gMDsKLQotCQkJaWYgKCFkb19wb2xsKQotCQkJCWNoaXAtPnBvbGxfY291bnQgPSAwOwotCQkJcmV0dXJuIGNoaXAtPnJpcmIucmVzW2FkZHJdOyAvKiB0aGUgbGFzdCB2YWx1ZSAqLwotCQl9Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQkJYnJlYWs7Ci0JCWlmIChidXMtPm5lZWRzX2RhbW5fbG9uZ19kZWxheSB8fCBsb29wY291bnRlciA+IDMwMDApCi0JCQltc2xlZXAoMik7IC8qIHRlbXBvcmFyeSB3b3JrYXJvdW5kICovCi0JCWVsc2UgewotCQkJdWRlbGF5KDEwKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQl9Ci0JfQotCi0JaWYgKCFidXMtPm5vX3Jlc3BvbnNlX2ZhbGxiYWNrKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIWNoaXAtPnBvbGxpbmdfbW9kZSAmJiBjaGlwLT5wb2xsX2NvdW50IDwgMikgewotCQlzbmRfcHJpbnRkZChTRlggIiVzOiBhenhfZ2V0X3Jlc3BvbnNlIHRpbWVvdXQsICIKLQkJCSAgICJwb2xsaW5nIHRoZSBjb2RlYyBvbmNlOiBsYXN0IGNtZD0weCUwOHhcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBjaGlwLT5sYXN0X2NtZFthZGRyXSk7Ci0JCWRvX3BvbGwgPSAxOwotCQljaGlwLT5wb2xsX2NvdW50Kys7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0KLQlpZiAoIWNoaXAtPnBvbGxpbmdfbW9kZSkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlggIiVzOiBhenhfZ2V0X3Jlc3BvbnNlIHRpbWVvdXQsICIKLQkJCSAgICJzd2l0Y2hpbmcgdG8gcG9sbGluZyBtb2RlOiBsYXN0IGNtZD0weCUwOHhcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBjaGlwLT5sYXN0X2NtZFthZGRyXSk7Ci0JCWNoaXAtPnBvbGxpbmdfbW9kZSA9IDE7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0JaWYgKGNoaXAtPm1zaSkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlggIiVzOiBObyByZXNwb25zZSBmcm9tIGNvZGVjLCAiCi0JCQkgICAiZGlzYWJsaW5nIE1TSTogbGFzdCBjbWQ9MHglMDh4XG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgY2hpcC0+bGFzdF9jbWRbYWRkcl0pOwotCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwotCQljaGlwLT5pcnEgPSAtMTsKLQkJcGNpX2Rpc2FibGVfbXNpKGNoaXAtPnBjaSk7Ci0JCWNoaXAtPm1zaSA9IDA7Ci0JCWlmIChhenhfYWNxdWlyZV9pcnEoY2hpcCwgMSkgPCAwKSB7Ci0JCQlidXMtPnJpcmJfZXJyb3IgPSAxOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0JaWYgKGNoaXAtPnByb2JpbmcpIHsKLQkJLyogSWYgdGhpcyBjcml0aWNhbCB0aW1lb3V0IGhhcHBlbnMgZHVyaW5nIHRoZSBjb2RlYyBwcm9iaW5nCi0JCSAqIHBoYXNlLCB0aGlzIGlzIGxpa2VseSBhbiBhY2Nlc3MgdG8gYSBub24tZXhpc3RpbmcgY29kZWMKLQkJICogc2xvdC4gIEJldHRlciB0byByZXR1cm4gYW4gZXJyb3IgYW5kIHJlc2V0IHRoZSBzeXN0ZW0uCi0JCSAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogYSBmYXRhbCBjb21tdW5pY2F0aW9uIGVycm9yOyBuZWVkIGVpdGhlciB0byByZXNldCBvciB0byBmYWxsYmFjawotCSAqIHRvIHRoZSBzaW5nbGVfY21kIG1vZGUKLQkgKi8KLQlidXMtPnJpcmJfZXJyb3IgPSAxOwotCWlmIChidXMtPmFsbG93X2J1c19yZXNldCAmJiAhYnVzLT5yZXNwb25zZV9yZXNldCAmJiAhYnVzLT5pbl9yZXNldCkgewotCQlidXMtPnJlc3BvbnNlX3Jlc2V0ID0gMTsKLQkJcmV0dXJuIC0xOyAvKiBnaXZlIGEgY2hhbmNlIHRvIHJldHJ5ICovCi0JfQotCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2ludGVsOiBhenhfZ2V0X3Jlc3BvbnNlIHRpbWVvdXQsICIKLQkJICAgInN3aXRjaGluZyB0byBzaW5nbGVfY21kIG1vZGU6IGxhc3QgY21kPTB4JTA4eFxuIiwKLQkJICAgY2hpcC0+bGFzdF9jbWRbYWRkcl0pOwotCWNoaXAtPnNpbmdsZV9jbWQgPSAxOwotCWJ1cy0+cmVzcG9uc2VfcmVzZXQgPSAwOwotCS8qIHJlbGVhc2UgQ09SQi9SSVJCICovCi0JYXp4X2ZyZWVfY21kX2lvKGNoaXApOwotCS8qIGRpc2FibGUgdW5zb2xpY2l0ZWQgcmVzcG9uc2VzICovCi0JYXp4X3dyaXRlbChjaGlwLCBHQ1RMLCBhenhfcmVhZGwoY2hpcCwgR0NUTCkgJiB+SUNINl9HQ1RMX1VOU09MKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBVc2UgdGhlIHNpbmdsZSBpbW1lZGlhdGUgY29tbWFuZCBpbnN0ZWFkIG9mIENPUkIvUklSQiBmb3Igc2ltcGxpY2l0eQotICoKLSAqIE5vdGU6IGFjY29yZGluZyB0byBJbnRlbCwgdGhpcyBpcyBub3QgcHJlZmVycmVkIHVzZS4gIFRoZSBjb21tYW5kIHdhcwotICogICAgICAgaW50ZW5kZWQgZm9yIHRoZSBCSU9TIG9ubHksIGFuZCBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggdW5zb2xpY2l0ZWQKLSAqICAgICAgIHJlc3BvbnNlcy4gIFNvLCB3ZSBzaG91bGRuJ3QgdXNlIGl0IGZvciBub3JtYWwgb3BlcmF0aW9uIGZyb20gdGhlCi0gKiAgICAgICBkcml2ZXIuCi0gKiAgICAgICBJIGxlZnQgdGhlIGNvZGVzLCBob3dldmVyLCBmb3IgZGVidWdnaW5nL3Rlc3RpbmcgcHVycG9zZXMuCi0gKi8KLQotLyogcmVjZWl2ZSBhIHJlc3BvbnNlICovCi1zdGF0aWMgaW50IGF6eF9zaW5nbGVfd2FpdF9mb3JfcmVzcG9uc2Uoc3RydWN0IGF6eCAqY2hpcCwgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0JaW50IHRpbWVvdXQgPSA1MDsKLQotCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJLyogY2hlY2sgSVJWIGJ1c3kgYml0ICovCi0JCWlmIChhenhfcmVhZHcoY2hpcCwgSVJTKSAmIElDSDZfSVJTX1ZBTElEKSB7Ci0JCQkvKiByZXVzZSByaXJiLnJlcyBhcyB0aGUgcmVzcG9uc2UgcmV0dXJuIHZhbHVlICovCi0JCQljaGlwLT5yaXJiLnJlc1thZGRyXSA9IGF6eF9yZWFkbChjaGlwLCBJUik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQl1ZGVsYXkoMSk7Ci0JfQotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXNuZF9wcmludGQoU0ZYICIlczogZ2V0X3Jlc3BvbnNlIHRpbWVvdXQ6IElSUz0weCV4XG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgYXp4X3JlYWR3KGNoaXAsIElSUykpOwotCWNoaXAtPnJpcmIucmVzW2FkZHJdID0gLTE7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLS8qIHNlbmQgYSBjb21tYW5kICovCi1zdGF0aWMgaW50IGF6eF9zaW5nbGVfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgaW50IGFkZHIgPSBhenhfY29tbWFuZF9hZGRyKHZhbCk7Ci0JaW50IHRpbWVvdXQgPSA1MDsKLQotCWJ1cy0+cmlyYl9lcnJvciA9IDA7Ci0Jd2hpbGUgKHRpbWVvdXQtLSkgewotCQkvKiBjaGVjayBJQ0IgYnVzeSBiaXQgKi8KLQkJaWYgKCEoKGF6eF9yZWFkdyhjaGlwLCBJUlMpICYgSUNINl9JUlNfQlVTWSkpKSB7Ci0JCQkvKiBDbGVhciBJUlYgdmFsaWQgYml0ICovCi0JCQlhenhfd3JpdGV3KGNoaXAsIElSUywgYXp4X3JlYWR3KGNoaXAsIElSUykgfAotCQkJCSAgIElDSDZfSVJTX1ZBTElEKTsKLQkJCWF6eF93cml0ZWwoY2hpcCwgSUMsIHZhbCk7Ci0JCQlhenhfd3JpdGV3KGNoaXAsIElSUywgYXp4X3JlYWR3KGNoaXAsIElSUykgfAotCQkJCSAgIElDSDZfSVJTX0JVU1kpOwotCQkJcmV0dXJuIGF6eF9zaW5nbGVfd2FpdF9mb3JfcmVzcG9uc2UoY2hpcCwgYWRkcik7Ci0JCX0KLQkJdWRlbGF5KDEpOwotCX0KLQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQlzbmRfcHJpbnRkKFNGWCAiJXM6IHNlbmRfY21kIHRpbWVvdXQ6IElSUz0weCV4LCB2YWw9MHgleFxuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIGF6eF9yZWFkdyhjaGlwLCBJUlMpLCB2YWwpOwotCXJldHVybiAtRUlPOwotfQotCi0vKiByZWNlaXZlIGEgcmVzcG9uc2UgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3NpbmdsZV9nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYV9idXMgKmJ1cywKLQkJCQkJICAgIHVuc2lnbmVkIGludCBhZGRyKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gY2hpcC0+cmlyYi5yZXNbYWRkcl07Ci19Ci0KLS8qCi0gKiBUaGUgYmVsb3cgYXJlIHRoZSBtYWluIGNhbGxiYWNrcyBmcm9tIGhkYV9jb2RlYy4KLSAqCi0gKiBUaGV5IGFyZSBqdXN0IHRoZSBza2VsZXRvbiB0byBjYWxsIHN1Yi1jYWxsYmFja3MgYWNjb3JkaW5nIHRvIHRoZQotICogY3VycmVudCBzZXR0aW5nIG9mIGNoaXAtPnNpbmdsZV9jbWQuCi0gKi8KLQotLyogc2VuZCBhIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQgYXp4X3NlbmRfY21kKHN0cnVjdCBoZGFfYnVzICpidXMsIHVuc2lnbmVkIGludCB2YWwpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGNoaXAtPmRpc2FibGVkKQotCQlyZXR1cm4gMDsKLQljaGlwLT5sYXN0X2NtZFthenhfY29tbWFuZF9hZGRyKHZhbCldID0gdmFsOwotCWlmIChjaGlwLT5zaW5nbGVfY21kKQotCQlyZXR1cm4gYXp4X3NpbmdsZV9zZW5kX2NtZChidXMsIHZhbCk7Ci0JZWxzZQotCQlyZXR1cm4gYXp4X2NvcmJfc2VuZF9jbWQoYnVzLCB2YWwpOwotfQotCi0vKiBnZXQgYSByZXNwb25zZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhenhfZ2V0X3Jlc3BvbnNlKHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgYWRkcikKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGNoaXAtPmRpc2FibGVkKQotCQlyZXR1cm4gMDsKLQlpZiAoY2hpcC0+c2luZ2xlX2NtZCkKLQkJcmV0dXJuIGF6eF9zaW5nbGVfZ2V0X3Jlc3BvbnNlKGJ1cywgYWRkcik7Ci0JZWxzZQotCQlyZXR1cm4gYXp4X3JpcmJfZ2V0X3Jlc3BvbnNlKGJ1cywgYWRkcik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyB2b2lkIGF6eF9wb3dlcl9ub3RpZnkoc3RydWN0IGhkYV9idXMgKmJ1cywgYm9vbCBwb3dlcl91cCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKLXN0YXRpYyBpbnQgYXp4X2xvYWRfZHNwX3ByZXBhcmUoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGZvcm1hdCwKLQkJCQl1bnNpZ25lZCBpbnQgYnl0ZV9zaXplLAotCQkJCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmcCk7Ci1zdGF0aWMgdm9pZCBhenhfbG9hZF9kc3BfdHJpZ2dlcihzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHN0YXJ0KTsKLXN0YXRpYyB2b2lkIGF6eF9sb2FkX2RzcF9jbGVhbnVwKHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkJIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYik7Ci0jZW5kaWYKLQotLyogZW50ZXIgbGluayByZXNldCAqLwotc3RhdGljIHZvaWQgYXp4X2VudGVyX2xpbmtfcmVzZXQoc3RydWN0IGF6eCAqY2hpcCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQkvKiByZXNldCBjb250cm9sbGVyICovCi0JYXp4X3dyaXRlbChjaGlwLCBHQ1RMLCBhenhfcmVhZGwoY2hpcCwgR0NUTCkgJiB+SUNINl9HQ1RMX1JFU0VUKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwotCXdoaWxlICgoYXp4X3JlYWRiKGNoaXAsIEdDVEwpICYgSUNINl9HQ1RMX1JFU0VUKSAmJgotCQkJdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCi0JCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOwotfQotCi0vKiBleGl0IGxpbmsgcmVzZXQgKi8KLXN0YXRpYyB2b2lkIGF6eF9leGl0X2xpbmtfcmVzZXQoc3RydWN0IGF6eCAqY2hpcCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlhenhfd3JpdGViKGNoaXAsIEdDVEwsIGF6eF9yZWFkYihjaGlwLCBHQ1RMKSB8IElDSDZfR0NUTF9SRVNFVCk7Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKLQl3aGlsZSAoIWF6eF9yZWFkYihjaGlwLCBHQ1RMKSAmJgotCQkJdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCi0JCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOwotfQotCi0vKiByZXNldCBjb2RlYyBsaW5rICovCi1zdGF0aWMgaW50IGF6eF9yZXNldChzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZnVsbF9yZXNldCkKLXsKLQlpZiAoIWZ1bGxfcmVzZXQpCi0JCWdvdG8gX19za2lwOwotCi0JLyogY2xlYXIgU1RBVEVTVFMgKi8KLQlhenhfd3JpdGV3KGNoaXAsIFNUQVRFU1RTLCBTVEFURVNUU19JTlRfTUFTSyk7Ci0KLQkvKiByZXNldCBjb250cm9sbGVyICovCi0JYXp4X2VudGVyX2xpbmtfcmVzZXQoY2hpcCk7Ci0KLQkvKiBkZWxheSBmb3IgPj0gMTAwdXMgZm9yIGNvZGVjIFBMTCB0byBzZXR0bGUgcGVyIHNwZWMKLQkgKiBSZXYgMC45IHNlY3Rpb24gNS41LjEKLQkgKi8KLQl1c2xlZXBfcmFuZ2UoNTAwLCAxMDAwKTsKLQotCS8qIEJyaW5nIGNvbnRyb2xsZXIgb3V0IG9mIHJlc2V0ICovCi0JYXp4X2V4aXRfbGlua19yZXNldChjaGlwKTsKLQotCS8qIEJyZW50IENoYXJ0cmFuZCBzYWlkIHRvIHdhaXQgPj0gNTQwdXMgZm9yIGNvZGVjcyB0byBpbml0aWFsaXplICovCi0JdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOwotCi0gICAgICBfX3NraXA6Ci0JLyogY2hlY2sgdG8gc2VlIGlmIGNvbnRyb2xsZXIgaXMgcmVhZHkgKi8KLQlpZiAoIWF6eF9yZWFkYihjaGlwLCBHQ1RMKSkgewotCQlzbmRfcHJpbnRkKFNGWCAiJXM6IGF6eF9yZXNldDogY29udHJvbGxlciBub3QgcmVhZHkhXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQkvKiBBY2NlcHQgdW5zb2xpY2l0ZWQgcmVzcG9uc2VzICovCi0JaWYgKCFjaGlwLT5zaW5nbGVfY21kKQotCQlhenhfd3JpdGVsKGNoaXAsIEdDVEwsIGF6eF9yZWFkbChjaGlwLCBHQ1RMKSB8Ci0JCQkgICBJQ0g2X0dDVExfVU5TT0wpOwotCi0JLyogZGV0ZWN0IGNvZGVjcyAqLwotCWlmICghY2hpcC0+Y29kZWNfbWFzaykgewotCQljaGlwLT5jb2RlY19tYXNrID0gYXp4X3JlYWR3KGNoaXAsIFNUQVRFU1RTKTsKLQkJc25kX3ByaW50ZGQoU0ZYICIlczogY29kZWNfbWFzayA9IDB4JXhcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGNoaXAtPmNvZGVjX21hc2spOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBMb3dsZXZlbCBpbnRlcmZhY2UKLSAqLyAgCi0KLS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCi1zdGF0aWMgdm9pZCBhenhfaW50X2VuYWJsZShzdHJ1Y3QgYXp4ICpjaGlwKQotewotCS8qIGVuYWJsZSBjb250cm9sbGVyIENJRSBhbmQgR0lFICovCi0JYXp4X3dyaXRlbChjaGlwLCBJTlRDVEwsIGF6eF9yZWFkbChjaGlwLCBJTlRDVEwpIHwKLQkJICAgSUNINl9JTlRfQ1RSTF9FTiB8IElDSDZfSU5UX0dMT0JBTF9FTik7Ci19Ci0KLS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotc3RhdGljIHZvaWQgYXp4X2ludF9kaXNhYmxlKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaW50IGk7Ci0KLQkvKiBkaXNhYmxlIGludGVycnVwdHMgaW4gc3RyZWFtIGRlc2NyaXB0b3IgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewotCQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwotCQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwKLQkJCSAgICAgIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpICYgflNEX0lOVF9NQVNLKTsKLQl9Ci0KLQkvKiBkaXNhYmxlIFNJRSBmb3IgYWxsIHN0cmVhbXMgKi8KLQlhenhfd3JpdGViKGNoaXAsIElOVENUTCwgMCk7Ci0KLQkvKiBkaXNhYmxlIGNvbnRyb2xsZXIgQ0lFIGFuZCBHSUUgKi8KLQlhenhfd3JpdGVsKGNoaXAsIElOVENUTCwgYXp4X3JlYWRsKGNoaXAsIElOVENUTCkgJgotCQkgICB+KElDSDZfSU5UX0NUUkxfRU4gfCBJQ0g2X0lOVF9HTE9CQUxfRU4pKTsKLX0KLQotLyogY2xlYXIgaW50ZXJydXB0cyAqLwotc3RhdGljIHZvaWQgYXp4X2ludF9jbGVhcihzdHJ1Y3QgYXp4ICpjaGlwKQotewotCWludCBpOwotCi0JLyogY2xlYXIgc3RyZWFtIHN0YXR1cyAqLwotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0JCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbaV07Ci0JCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfU1RTLCBTRF9JTlRfTUFTSyk7Ci0JfQotCi0JLyogY2xlYXIgU1RBVEVTVFMgKi8KLQlhenhfd3JpdGV3KGNoaXAsIFNUQVRFU1RTLCBTVEFURVNUU19JTlRfTUFTSyk7Ci0KLQkvKiBjbGVhciByaXJiIHN0YXR1cyAqLwotCWF6eF93cml0ZWIoY2hpcCwgUklSQlNUUywgUklSQl9JTlRfTUFTSyk7Ci0KLQkvKiBjbGVhciBpbnQgc3RhdHVzICovCi0JYXp4X3dyaXRlbChjaGlwLCBJTlRTVFMsIElDSDZfSU5UX0NUUkxfRU4gfCBJQ0g2X0lOVF9BTExfU1RSRUFNKTsKLX0KLQotLyogc3RhcnQgYSBzdHJlYW0gKi8KLXN0YXRpYyB2b2lkIGF6eF9zdHJlYW1fc3RhcnQoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCi17Ci0JLyoKLQkgKiBCZWZvcmUgc3RyZWFtIHN0YXJ0LCBpbml0aWFsaXplIHBhcmFtZXRlcgotCSAqLwotCWF6eF9kZXYtPmluc3VmZmljaWVudCA9IDE7Ci0KLQkvKiBlbmFibGUgU0lFICovCi0JYXp4X3dyaXRlbChjaGlwLCBJTlRDVEwsCi0JCSAgIGF6eF9yZWFkbChjaGlwLCBJTlRDVEwpIHwgKDEgPDwgYXp4X2Rldi0+aW5kZXgpKTsKLQkvKiBzZXQgRE1BIHN0YXJ0IGFuZCBpbnRlcnJ1cHQgbWFzayAqLwotCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfQ1RMLCBhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSB8Ci0JCSAgICAgIFNEX0NUTF9ETUFfU1RBUlQgfCBTRF9JTlRfTUFTSyk7Ci19Ci0KLS8qIHN0b3AgRE1BICovCi1zdGF0aWMgdm9pZCBhenhfc3RyZWFtX2NsZWFyKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQotewotCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfQ1RMLCBhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfQ1RMKSAmCi0JCSAgICAgIH4oU0RfQ1RMX0RNQV9TVEFSVCB8IFNEX0lOVF9NQVNLKSk7Ci0JYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9TVFMsIFNEX0lOVF9NQVNLKTsgLyogdG8gYmUgc3VyZSAqLwotfQotCi0vKiBzdG9wIGEgc3RyZWFtICovCi1zdGF0aWMgdm9pZCBhenhfc3RyZWFtX3N0b3Aoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCi17Ci0JYXp4X3N0cmVhbV9jbGVhcihjaGlwLCBhenhfZGV2KTsKLQkvKiBkaXNhYmxlIFNJRSAqLwotCWF6eF93cml0ZWwoY2hpcCwgSU5UQ1RMLAotCQkgICBhenhfcmVhZGwoY2hpcCwgSU5UQ1RMKSAmIH4oMSA8PCBhenhfZGV2LT5pbmRleCkpOwotfQotCi0KLS8qCi0gKiByZXNldCBhbmQgc3RhcnQgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCi0gKi8KLXN0YXRpYyB2b2lkIGF6eF9pbml0X2NoaXAoc3RydWN0IGF6eCAqY2hpcCwgaW50IGZ1bGxfcmVzZXQpCi17Ci0JaWYgKGNoaXAtPmluaXRpYWxpemVkKQotCQlyZXR1cm47Ci0KLQkvKiByZXNldCBjb250cm9sbGVyICovCi0JYXp4X3Jlc2V0KGNoaXAsIGZ1bGxfcmVzZXQpOwotCi0JLyogaW5pdGlhbGl6ZSBpbnRlcnJ1cHRzICovCi0JYXp4X2ludF9jbGVhcihjaGlwKTsKLQlhenhfaW50X2VuYWJsZShjaGlwKTsKLQotCS8qIGluaXRpYWxpemUgdGhlIGNvZGVjIGNvbW1hbmQgSS9PICovCi0JaWYgKCFjaGlwLT5zaW5nbGVfY21kKQotCQlhenhfaW5pdF9jbWRfaW8oY2hpcCk7Ci0KLQkvKiBwcm9ncmFtIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KLQlhenhfd3JpdGVsKGNoaXAsIERQTEJBU0UsICh1MzIpY2hpcC0+cG9zYnVmLmFkZHIpOwotCWF6eF93cml0ZWwoY2hpcCwgRFBVQkFTRSwgdXBwZXJfMzJfYml0cyhjaGlwLT5wb3NidWYuYWRkcikpOwotCi0JY2hpcC0+aW5pdGlhbGl6ZWQgPSAxOwotfQogCiAvKgogICogaW5pdGlhbGl6ZSB0aGUgUENJIHJlZ2lzdGVycwpAQCAtMTM0Niw3ICszNjAsNyBAQAogCSAqIFRoZSBQQ0kgcmVnaXN0ZXIgVENTRUwgaXMgZGVmaW5lZCBpbiB0aGUgSW50ZWwgbWFudWFscy4KIAkgKi8KIAlpZiAoIShjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19OT19UQ1NFTCkpIHsKLQkJc25kX3ByaW50ZGQoU0ZYICIlczogQ2xlYXJpbmcgVENTRUxcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkNsZWFyaW5nIFRDU0VMXG4iKTsKIAkJdXBkYXRlX3BjaV9ieXRlKGNoaXAtPnBjaSwgSUNINl9QQ0lSRUdfVENTRUwsIDB4MDcsIDApOwogCX0KIApAQCAtMTM1NCw3ICszNjgsOCBAQAogCSAqIHdlIG5lZWQgdG8gZW5hYmxlIHNub29wLgogCSAqLwogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19BVElfU05PT1ApIHsKLQkJc25kX3ByaW50ZGQoU0ZYICIlczogU2V0dGluZyBBVEkgc25vb3A6ICVkXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpLCBhenhfc25vb3AoY2hpcCkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlNldHRpbmcgQVRJIHNub29wOiAlZFxuIiwKKwkJCWF6eF9zbm9vcChjaGlwKSk7CiAJCXVwZGF0ZV9wY2lfYnl0ZShjaGlwLT5wY2ksCiAJCQkJQVRJX1NCNDUwX0hEQVVESU9fTUlTQ19DTlRSMl9BRERSLCAweDA3LAogCQkJCWF6eF9zbm9vcChjaGlwKSA/IEFUSV9TQjQ1MF9IREFVRElPX0VOQUJMRV9TTk9PUCA6IDApOwpAQCAtMTM2Miw3ICszNzcsOCBAQAogCiAJLyogRm9yIE5WSURJQSBIREEsIGVuYWJsZSBzbm9vcCAqLwogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19OVklESUFfU05PT1ApIHsKLQkJc25kX3ByaW50ZGQoU0ZYICIlczogU2V0dGluZyBOdmlkaWEgc25vb3A6ICVkXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpLCBhenhfc25vb3AoY2hpcCkpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlNldHRpbmcgTnZpZGlhIHNub29wOiAlZFxuIiwKKwkJCWF6eF9zbm9vcChjaGlwKSk7CiAJCXVwZGF0ZV9wY2lfYnl0ZShjaGlwLT5wY2ksCiAJCQkJTlZJRElBX0hEQV9UUkFOU1JFR19BRERSLAogCQkJCTB4MGYsIE5WSURJQV9IREFfRU5BQkxFX0NPSEJJVFMpOwpAQCAtMTM4NywxMTEyICs0MDMsMjkgQEAKIAkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwKIAkJCQlJTlRFTF9TQ0hfSERBX0RFVkMsICZzbm9vcCk7CiAJCX0KLQkJc25kX3ByaW50ZGQoU0ZYICIlczogU0NIIHNub29wOiAlc1xuIiwKLQkJCQlwY2lfbmFtZShjaGlwLT5wY2kpLCAoc25vb3AgJiBJTlRFTF9TQ0hfSERBX0RFVkNfTk9TTk9PUCkKLQkJCQk/ICJEaXNhYmxlZCIgOiAiRW5hYmxlZCIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIlNDSCBzbm9vcDogJXNcbiIsCisJCQkoc25vb3AgJiBJTlRFTF9TQ0hfSERBX0RFVkNfTk9TTk9PUCkgPworCQkJIkRpc2FibGVkIiA6ICJFbmFibGVkIik7CiAgICAgICAgIH0KIH0KIAotCiBzdGF0aWMgaW50IGF6eF9wb3NpdGlvbl9vayhzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2Rldik7CiAKLS8qCi0gKiBpbnRlcnJ1cHQgaGFuZGxlcgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXp4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisvKiBjYWxsZWQgZnJvbSBJUlEgKi8KK3N0YXRpYyBpbnQgYXp4X3Bvc2l0aW9uX2NoZWNrKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQogewotCXN0cnVjdCBhenggKmNoaXAgPSBkZXZfaWQ7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7Ci0JdTMyIHN0YXR1czsKLQl1OCBzZF9zdGF0dXM7Ci0JaW50IGksIG9rOworCWludCBvazsKIAotI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCi0JaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BNX1JVTlRJTUUpCi0JCWlmIChjaGlwLT5wY2ktPmRldi5wb3dlci5ydW50aW1lX3N0YXR1cyAhPSBSUE1fQUNUSVZFKQotCQkJcmV0dXJuIElSUV9OT05FOwotI2VuZGlmCi0KLQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCWlmIChjaGlwLT5kaXNhYmxlZCkgewotCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0Jc3RhdHVzID0gYXp4X3JlYWRsKGNoaXAsIElOVFNUUyk7Ci0JaWYgKHN0YXR1cyA9PSAwIHx8IHN0YXR1cyA9PSAweGZmZmZmZmZmKSB7Ci0JCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKLQkJYXp4X2RldiA9ICZjaGlwLT5henhfZGV2W2ldOwotCQlpZiAoc3RhdHVzICYgYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrKSB7Ci0JCQlzZF9zdGF0dXMgPSBhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfU1RTKTsKLQkJCWF6eF9zZF93cml0ZWIoYXp4X2RldiwgU0RfU1RTLCBTRF9JTlRfTUFTSyk7Ci0JCQlpZiAoIWF6eF9kZXYtPnN1YnN0cmVhbSB8fCAhYXp4X2Rldi0+cnVubmluZyB8fAotCQkJICAgICEoc2Rfc3RhdHVzICYgU0RfSU5UX0NPTVBMRVRFKSkKLQkJCQljb250aW51ZTsKLQkJCS8qIGNoZWNrIHdoZXRoZXIgdGhpcyBJUlEgaXMgcmVhbGx5IGFjY2VwdGFibGUgKi8KLQkJCW9rID0gYXp4X3Bvc2l0aW9uX29rKGNoaXAsIGF6eF9kZXYpOwotCQkJaWYgKG9rID09IDEpIHsKLQkJCQlhenhfZGV2LT5pcnFfcGVuZGluZyA9IDA7Ci0JCQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGF6eF9kZXYtPnN1YnN0cmVhbSk7Ci0JCQkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JCQl9IGVsc2UgaWYgKG9rID09IDAgJiYgY2hpcC0+YnVzICYmIGNoaXAtPmJ1cy0+d29ya3EpIHsKLQkJCQkvKiBib2d1cyBJUlEsIHByb2Nlc3MgaXQgbGF0ZXIgKi8KLQkJCQlhenhfZGV2LT5pcnFfcGVuZGluZyA9IDE7Ci0JCQkJcXVldWVfd29yayhjaGlwLT5idXMtPndvcmtxLAotCQkJCQkgICAmY2hpcC0+aXJxX3BlbmRpbmdfd29yayk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBjbGVhciByaXJiIGludCAqLwotCXN0YXR1cyA9IGF6eF9yZWFkYihjaGlwLCBSSVJCU1RTKTsKLQlpZiAoc3RhdHVzICYgUklSQl9JTlRfTUFTSykgewotCQlpZiAoc3RhdHVzICYgUklSQl9JTlRfUkVTUE9OU0UpIHsKLQkJCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSkKLQkJCQl1ZGVsYXkoODApOwotCQkJYXp4X3VwZGF0ZV9yaXJiKGNoaXApOwotCQl9Ci0JCWF6eF93cml0ZWIoY2hpcCwgUklSQlNUUywgUklSQl9JTlRfTUFTSyk7Ci0JfQotCi0jaWYgMAotCS8qIGNsZWFyIHN0YXRlIHN0YXR1cyBpbnQgKi8KLQlpZiAoYXp4X3JlYWR3KGNoaXAsIFNUQVRFU1RTKSAmIDB4MDQpCi0JCWF6eF93cml0ZXcoY2hpcCwgU1RBVEVTVFMsIDB4MDQpOwotI2VuZGlmCi0Jc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotLyoKLSAqIHNldCB1cCBhIEJETCBlbnRyeQotICovCi1zdGF0aWMgaW50IHNldHVwX2JkbGUoc3RydWN0IGF6eCAqY2hpcCwKLQkJICAgICAgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiLAotCQkgICAgICBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiwgdTMyICoqYmRscCwKLQkJICAgICAgaW50IG9mcywgaW50IHNpemUsIGludCB3aXRoX2lvYykKLXsKLQl1MzIgKmJkbCA9ICpiZGxwOwotCi0Jd2hpbGUgKHNpemUgPiAwKSB7Ci0JCWRtYV9hZGRyX3QgYWRkcjsKLQkJaW50IGNodW5rOwotCi0JCWlmIChhenhfZGV2LT5mcmFncyA+PSBBWlhfTUFYX0JETF9FTlRSSUVTKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJYWRkciA9IHNuZF9zZ2J1Zl9nZXRfYWRkcihkbWFiLCBvZnMpOwotCQkvKiBwcm9ncmFtIHRoZSBhZGRyZXNzIGZpZWxkIG9mIHRoZSBCREwgZW50cnkgKi8KLQkJYmRsWzBdID0gY3B1X3RvX2xlMzIoKHUzMilhZGRyKTsKLQkJYmRsWzFdID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhhZGRyKSk7Ci0JCS8qIHByb2dyYW0gdGhlIHNpemUgZmllbGQgb2YgdGhlIEJETCBlbnRyeSAqLwotCQljaHVuayA9IHNuZF9zZ2J1Zl9nZXRfY2h1bmtfc2l6ZShkbWFiLCBvZnMsIHNpemUpOwotCQkvKiBvbmUgQkRMRSBjYW5ub3QgY3Jvc3MgNEsgYm91bmRhcnkgb24gQ1RIREEgY2hpcHMgKi8KLQkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTXzRLX0JETEVfQk9VTkRBUlkpIHsKLQkJCXUzMiByZW1haW4gPSAweDEwMDAgLSAob2ZzICYgMHhmZmYpOwotCQkJaWYgKGNodW5rID4gcmVtYWluKQotCQkJCWNodW5rID0gcmVtYWluOwotCQl9Ci0JCWJkbFsyXSA9IGNwdV90b19sZTMyKGNodW5rKTsKLQkJLyogcHJvZ3JhbSB0aGUgSU9DIHRvIGVuYWJsZSBpbnRlcnJ1cHQKLQkJICogb25seSB3aGVuIHRoZSB3aG9sZSBmcmFnbWVudCBpcyBwcm9jZXNzZWQKLQkJICovCi0JCXNpemUgLT0gY2h1bms7Ci0JCWJkbFszXSA9IChzaXplIHx8ICF3aXRoX2lvYykgPyAwIDogY3B1X3RvX2xlMzIoMHgwMSk7Ci0JCWJkbCArPSA0OwotCQlhenhfZGV2LT5mcmFncysrOwotCQlvZnMgKz0gY2h1bms7Ci0JfQotCSpiZGxwID0gYmRsOwotCXJldHVybiBvZnM7Ci19Ci0KLS8qCi0gKiBzZXQgdXAgQkRMIGVudHJpZXMKLSAqLwotc3RhdGljIGludCBhenhfc2V0dXBfcGVyaW9kcyhzdHJ1Y3QgYXp4ICpjaGlwLAotCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCi17Ci0JdTMyICpiZGw7Ci0JaW50IGksIG9mcywgcGVyaW9kcywgcGVyaW9kX2J5dGVzOwotCWludCBwb3NfYWRqOwotCi0JLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKLQotCXBlcmlvZF9ieXRlcyA9IGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKLQlwZXJpb2RzID0gYXp4X2Rldi0+YnVmc2l6ZSAvIHBlcmlvZF9ieXRlczsKLQotCS8qIHByb2dyYW0gdGhlIGluaXRpYWwgQkRMIGVudHJpZXMgKi8KLQliZGwgPSAodTMyICopYXp4X2Rldi0+YmRsLmFyZWE7Ci0Jb2ZzID0gMDsKLQlhenhfZGV2LT5mcmFncyA9IDA7Ci0JcG9zX2FkaiA9IGJkbF9wb3NfYWRqW2NoaXAtPmRldl9pbmRleF07Ci0JaWYgKCFhenhfZGV2LT5ub19wZXJpb2Rfd2FrZXVwICYmIHBvc19hZGogPiAwKSB7Ci0JCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JCWludCBwb3NfYWxpZ24gPSBwb3NfYWRqOwotCQlwb3NfYWRqID0gKHBvc19hZGogKiBydW50aW1lLT5yYXRlICsgNDc5OTkpIC8gNDgwMDA7Ci0JCWlmICghcG9zX2FkaikKLQkJCXBvc19hZGogPSBwb3NfYWxpZ247Ci0JCWVsc2UKLQkJCXBvc19hZGogPSAoKHBvc19hZGogKyBwb3NfYWxpZ24gLSAxKSAvIHBvc19hbGlnbikgKgotCQkJCXBvc19hbGlnbjsKLQkJcG9zX2FkaiA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBwb3NfYWRqKTsKLQkJaWYgKHBvc19hZGogPj0gcGVyaW9kX2J5dGVzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBTRlggIiVzOiBUb28gYmlnIGFkanVzdG1lbnQgJWRcbiIsCi0JCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgYmRsX3Bvc19hZGpbY2hpcC0+ZGV2X2luZGV4XSk7Ci0JCQlwb3NfYWRqID0gMDsKLQkJfSBlbHNlIHsKLQkJCW9mcyA9IHNldHVwX2JkbGUoY2hpcCwgc25kX3BjbV9nZXRfZG1hX2J1ZihzdWJzdHJlYW0pLAotCQkJCQkgYXp4X2RldiwKLQkJCQkJICZiZGwsIG9mcywgcG9zX2FkaiwgdHJ1ZSk7Ci0JCQlpZiAob2ZzIDwgMCkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0JfSBlbHNlCi0JCXBvc19hZGogPSAwOwotCWZvciAoaSA9IDA7IGkgPCBwZXJpb2RzOyBpKyspIHsKLQkJaWYgKGkgPT0gcGVyaW9kcyAtIDEgJiYgcG9zX2FkaikKLQkJCW9mcyA9IHNldHVwX2JkbGUoY2hpcCwgc25kX3BjbV9nZXRfZG1hX2J1ZihzdWJzdHJlYW0pLAotCQkJCQkgYXp4X2RldiwgJmJkbCwgb2ZzLAotCQkJCQkgcGVyaW9kX2J5dGVzIC0gcG9zX2FkaiwgMCk7Ci0JCWVsc2UKLQkJCW9mcyA9IHNldHVwX2JkbGUoY2hpcCwgc25kX3BjbV9nZXRfZG1hX2J1ZihzdWJzdHJlYW0pLAotCQkJCQkgYXp4X2RldiwgJmJkbCwgb2ZzLAotCQkJCQkgcGVyaW9kX2J5dGVzLAotCQkJCQkgIWF6eF9kZXYtPm5vX3BlcmlvZF93YWtldXApOwotCQlpZiAob2ZzIDwgMCkKLQkJCWdvdG8gZXJyb3I7CisJb2sgPSBhenhfcG9zaXRpb25fb2soY2hpcCwgYXp4X2Rldik7CisJaWYgKG9rID09IDEpIHsKKwkJYXp4X2Rldi0+aXJxX3BlbmRpbmcgPSAwOworCQlyZXR1cm4gb2s7CisJfSBlbHNlIGlmIChvayA9PSAwICYmIGNoaXAtPmJ1cyAmJiBjaGlwLT5idXMtPndvcmtxKSB7CisJCS8qIGJvZ3VzIElSUSwgcHJvY2VzcyBpdCBsYXRlciAqLworCQlhenhfZGV2LT5pcnFfcGVuZGluZyA9IDE7CisJCXF1ZXVlX3dvcmsoY2hpcC0+YnVzLT53b3JrcSwgJmNoaXAtPmlycV9wZW5kaW5nX3dvcmspOwogCX0KIAlyZXR1cm4gMDsKLQotIGVycm9yOgotCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogVG9vIG1hbnkgQkRMIGVudHJpZXM6IGJ1ZmZlcj0lZCwgcGVyaW9kPSVkXG4iLAotCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBhenhfZGV2LT5idWZzaXplLCBwZXJpb2RfYnl0ZXMpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKiByZXNldCBzdHJlYW0gKi8KLXN0YXRpYyB2b2lkIGF6eF9zdHJlYW1fcmVzZXQoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCi17Ci0JdW5zaWduZWQgY2hhciB2YWw7Ci0JaW50IHRpbWVvdXQ7Ci0KLQlhenhfc3RyZWFtX2NsZWFyKGNoaXAsIGF6eF9kZXYpOwotCi0JYXp4X3NkX3dyaXRlYihhenhfZGV2LCBTRF9DVEwsIGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpIHwKLQkJICAgICAgU0RfQ1RMX1NUUkVBTV9SRVNFVCk7Ci0JdWRlbGF5KDMpOwotCXRpbWVvdXQgPSAzMDA7Ci0Jd2hpbGUgKCEoKHZhbCA9IGF6eF9zZF9yZWFkYihhenhfZGV2LCBTRF9DVEwpKSAmIFNEX0NUTF9TVFJFQU1fUkVTRVQpICYmCi0JICAgICAgIC0tdGltZW91dCkKLQkJOwotCXZhbCAmPSB+U0RfQ1RMX1NUUkVBTV9SRVNFVDsKLQlhenhfc2Rfd3JpdGViKGF6eF9kZXYsIFNEX0NUTCwgdmFsKTsKLQl1ZGVsYXkoMyk7Ci0KLQl0aW1lb3V0ID0gMzAwOwotCS8qIHdhaXRpbmcgZm9yIGhhcmR3YXJlIHRvIHJlcG9ydCB0aGF0IHRoZSBzdHJlYW0gaXMgb3V0IG9mIHJlc2V0ICovCi0Jd2hpbGUgKCgodmFsID0gYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkpICYgU0RfQ1RMX1NUUkVBTV9SRVNFVCkgJiYKLQkgICAgICAgLS10aW1lb3V0KQotCQk7Ci0KLQkvKiByZXNldCBmaXJzdCBwb3NpdGlvbiAtIG1heSBub3QgYmUgc3luY2VkIHdpdGggaHcgYXQgdGhpcyB0aW1lICovCi0JKmF6eF9kZXYtPnBvc2J1ZiA9IDA7Ci19Ci0KLS8qCi0gKiBzZXQgdXAgdGhlIFNEIGZvciBzdHJlYW1pbmcKLSAqLwotc3RhdGljIGludCBhenhfc2V0dXBfY29udHJvbGxlcihzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCS8qIG1ha2Ugc3VyZSB0aGUgcnVuIGJpdCBpcyB6ZXJvIGZvciBTRCAqLwotCWF6eF9zdHJlYW1fY2xlYXIoY2hpcCwgYXp4X2Rldik7Ci0JLyogcHJvZ3JhbSB0aGUgc3RyZWFtX3RhZyAqLwotCXZhbCA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpOwotCXZhbCA9ICh2YWwgJiB+U0RfQ1RMX1NUUkVBTV9UQUdfTUFTSykgfAotCQkoYXp4X2Rldi0+c3RyZWFtX3RhZyA8PCBTRF9DVExfU1RSRUFNX1RBR19TSElGVCk7Ci0JaWYgKCFhenhfc25vb3AoY2hpcCkpCi0JCXZhbCB8PSBTRF9DVExfVFJBRkZJQ19QUklPOwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ1RMLCB2YWwpOwotCi0JLyogcHJvZ3JhbSB0aGUgbGVuZ3RoIG9mIHNhbXBsZXMgaW4gY3ljbGljIGJ1ZmZlciAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ0JMLCBhenhfZGV2LT5idWZzaXplKTsKLQotCS8qIHByb2dyYW0gdGhlIHN0cmVhbSBmb3JtYXQgKi8KLQkvKiB0aGlzIHZhbHVlIG5lZWRzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcHJvZ3JhbW1lZCAqLwotCWF6eF9zZF93cml0ZXcoYXp4X2RldiwgU0RfRk9STUFULCBhenhfZGV2LT5mb3JtYXRfdmFsKTsKLQotCS8qIHByb2dyYW0gdGhlIHN0cmVhbSBMVkkgKGxhc3QgdmFsaWQgaW5kZXgpIG9mIHRoZSBCREwgKi8KLQlhenhfc2Rfd3JpdGV3KGF6eF9kZXYsIFNEX0xWSSwgYXp4X2Rldi0+ZnJhZ3MgLSAxKTsKLQotCS8qIHByb2dyYW0gdGhlIEJETCBhZGRyZXNzICovCi0JLyogbG93ZXIgQkRMIGFkZHJlc3MgKi8KLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBMLCAodTMyKWF6eF9kZXYtPmJkbC5hZGRyKTsKLQkvKiB1cHBlciBCREwgYWRkcmVzcyAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUFUsIHVwcGVyXzMyX2JpdHMoYXp4X2Rldi0+YmRsLmFkZHIpKTsKLQotCS8qIGVuYWJsZSB0aGUgcG9zaXRpb24gYnVmZmVyICovCi0JaWYgKGNoaXAtPnBvc2l0aW9uX2ZpeFswXSAhPSBQT1NfRklYX0xQSUIgfHwKLQkgICAgY2hpcC0+cG9zaXRpb25fZml4WzFdICE9IFBPU19GSVhfTFBJQikgewotCQlpZiAoIShhenhfcmVhZGwoY2hpcCwgRFBMQkFTRSkgJiBJQ0g2X0RQTEJBU0VfRU5BQkxFKSkKLQkJCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwKLQkJCQkodTMyKWNoaXAtPnBvc2J1Zi5hZGRyIHwgSUNINl9EUExCQVNFX0VOQUJMRSk7Ci0JfQotCi0JLyogc2V0IHRoZSBpbnRlcnJ1cHQgZW5hYmxlIGJpdHMgaW4gdGhlIGRlc2NyaXB0b3IgY29udHJvbCByZWdpc3RlciAqLwotCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ1RMLAotCQkgICAgICBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfQ1RMKSB8IFNEX0lOVF9NQVNLKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogUHJvYmUgdGhlIGdpdmVuIGNvZGVjIGFkZHJlc3MKLSAqLwotc3RhdGljIGludCBwcm9iZV9jb2RlYyhzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgY21kID0gKGFkZHIgPDwgMjgpIHwgKEFDX05PREVfUk9PVCA8PCAyMCkgfAotCQkoQUNfVkVSQl9QQVJBTUVURVJTIDw8IDgpIHwgQUNfUEFSX1ZFTkRPUl9JRDsKLQl1bnNpZ25lZCBpbnQgcmVzOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+YnVzLT5jbWRfbXV0ZXgpOwotCWNoaXAtPnByb2JpbmcgPSAxOwotCWF6eF9zZW5kX2NtZChjaGlwLT5idXMsIGNtZCk7Ci0JcmVzID0gYXp4X2dldF9yZXNwb25zZShjaGlwLT5idXMsIGFkZHIpOwotCWNoaXAtPnByb2JpbmcgPSAwOwotCW11dGV4X3VubG9jaygmY2hpcC0+YnVzLT5jbWRfbXV0ZXgpOwotCWlmIChyZXMgPT0gLTEpCi0JCXJldHVybiAtRUlPOwotCXNuZF9wcmludGRkKFNGWCAiJXM6IGNvZGVjICMlZCBwcm9iZWQgT0tcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGFkZHIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF6eF9hdHRhY2hfcGNtX3N0cmVhbShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkgc3RydWN0IGhkYV9wY20gKmNwY20pOwotc3RhdGljIHZvaWQgYXp4X3N0b3BfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwKTsKLQotc3RhdGljIHZvaWQgYXp4X2J1c19yZXNldChzdHJ1Y3QgaGRhX2J1cyAqYnVzKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQotCWJ1cy0+aW5fcmVzZXQgPSAxOwotCWF6eF9zdG9wX2NoaXAoY2hpcCk7Ci0JYXp4X2luaXRfY2hpcChjaGlwLCAxKTsKLSNpZmRlZiBDT05GSUdfUE0KLQlpZiAoY2hpcC0+aW5pdGlhbGl6ZWQpIHsKLQkJc3RydWN0IGF6eF9wY20gKnA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNoaXAtPnBjbV9saXN0LCBsaXN0KQotCQkJc25kX3BjbV9zdXNwZW5kX2FsbChwLT5wY20pOwotCQlzbmRfaGRhX3N1c3BlbmQoY2hpcC0+YnVzKTsKLQkJc25kX2hkYV9yZXN1bWUoY2hpcC0+YnVzKTsKLQl9Ci0jZW5kaWYKLQlidXMtPmluX3Jlc2V0ID0gMDsKLX0KLQotc3RhdGljIGludCBnZXRfamFja3BvbGxfaW50ZXJ2YWwoc3RydWN0IGF6eCAqY2hpcCkKLXsKLQlpbnQgaSA9IGphY2twb2xsX21zW2NoaXAtPmRldl9pbmRleF07Ci0JdW5zaWduZWQgaW50IGo7Ci0JaWYgKGkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGkgPCA1MCB8fCBpID4gNjAwMDApCi0JCWogPSAwOwotCWVsc2UKLQkJaiA9IG1zZWNzX3RvX2ppZmZpZXMoaSk7Ci0JaWYgKGogPT0gMCkKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYCi0JCQkgICAiamFja3BvbGxfbXMgdmFsdWUgb3V0IG9mIHJhbmdlOiAlZFxuIiwgaSk7Ci0JcmV0dXJuIGo7Ci19Ci0KLS8qCi0gKiBDb2RlYyBpbml0aWFsaXphdGlvbgotICovCi0KLS8qIG51bWJlciBvZiBjb2RlYyBzbG90cyBmb3IgZWFjaCBjaGlwc2V0OiAwID0gZGVmYXVsdCBzbG90cyAoaS5lLiA0KSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhenhfbWF4X2NvZGVjc1tBWlhfTlVNX0RSSVZFUlNdID0gewotCVtBWlhfRFJJVkVSX05WSURJQV0gPSA4LAotCVtBWlhfRFJJVkVSX1RFUkFdID0gMSwKLX07Ci0KLXN0YXRpYyBpbnQgYXp4X2NvZGVjX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwLCBjb25zdCBjaGFyICptb2RlbCkKLXsKLQlzdHJ1Y3QgaGRhX2J1c190ZW1wbGF0ZSBidXNfdGVtcDsKLQlpbnQgYywgY29kZWNzLCBlcnI7Ci0JaW50IG1heF9zbG90czsKLQotCW1lbXNldCgmYnVzX3RlbXAsIDAsIHNpemVvZihidXNfdGVtcCkpOwotCWJ1c190ZW1wLnByaXZhdGVfZGF0YSA9IGNoaXA7Ci0JYnVzX3RlbXAubW9kZWxuYW1lID0gbW9kZWw7Ci0JYnVzX3RlbXAucGNpID0gY2hpcC0+cGNpOwotCWJ1c190ZW1wLm9wcy5jb21tYW5kID0gYXp4X3NlbmRfY21kOwotCWJ1c190ZW1wLm9wcy5nZXRfcmVzcG9uc2UgPSBhenhfZ2V0X3Jlc3BvbnNlOwotCWJ1c190ZW1wLm9wcy5hdHRhY2hfcGNtID0gYXp4X2F0dGFjaF9wY21fc3RyZWFtOwotCWJ1c190ZW1wLm9wcy5idXNfcmVzZXQgPSBhenhfYnVzX3Jlc2V0OwotI2lmZGVmIENPTkZJR19QTQotCWJ1c190ZW1wLnBvd2VyX3NhdmUgPSAmcG93ZXJfc2F2ZTsKLQlidXNfdGVtcC5vcHMucG1fbm90aWZ5ID0gYXp4X3Bvd2VyX25vdGlmeTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKLQlidXNfdGVtcC5vcHMubG9hZF9kc3BfcHJlcGFyZSA9IGF6eF9sb2FkX2RzcF9wcmVwYXJlOwotCWJ1c190ZW1wLm9wcy5sb2FkX2RzcF90cmlnZ2VyID0gYXp4X2xvYWRfZHNwX3RyaWdnZXI7Ci0JYnVzX3RlbXAub3BzLmxvYWRfZHNwX2NsZWFudXAgPSBhenhfbG9hZF9kc3BfY2xlYW51cDsKLSNlbmRpZgotCi0JZXJyID0gc25kX2hkYV9idXNfbmV3KGNoaXAtPmNhcmQsICZidXNfdGVtcCwgJmNoaXAtPmJ1cyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUklSQl9ERUxBWSkgewotCQlzbmRfcHJpbnRkKFNGWCAiJXM6IEVuYWJsZSBkZWxheSBpbiBSSVJCIGhhbmRsaW5nXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKLQkJY2hpcC0+YnVzLT5uZWVkc19kYW1uX2xvbmdfZGVsYXkgPSAxOwotCX0KLQotCWNvZGVjcyA9IDA7Ci0JbWF4X3Nsb3RzID0gYXp4X21heF9jb2RlY3NbY2hpcC0+ZHJpdmVyX3R5cGVdOwotCWlmICghbWF4X3Nsb3RzKQotCQltYXhfc2xvdHMgPSBBWlhfREVGQVVMVF9DT0RFQ1M7Ci0KLQkvKiBGaXJzdCB0cnkgdG8gcHJvYmUgYWxsIGdpdmVuIGNvZGVjIHNsb3RzICovCi0JZm9yIChjID0gMDsgYyA8IG1heF9zbG90czsgYysrKSB7Ci0JCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIGNoaXAtPmNvZGVjX3Byb2JlX21hc2spIHsKLQkJCWlmIChwcm9iZV9jb2RlYyhjaGlwLCBjKSA8IDApIHsKLQkJCQkvKiBTb21lIEJJT1NlbiBnaXZlIHlvdSB3cm9uZyBjb2RlYyBhZGRyZXNzZXMKLQkJCQkgKiB0aGF0IGRvbid0IGV4aXN0Ci0JCQkJICovCi0JCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYCi0JCQkJCSAgICIlczogQ29kZWMgIyVkIHByb2JlIGVycm9yOyAiCi0JCQkJCSAgICJkaXNhYmxpbmcgaXQuLi5cbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGMpOwotCQkJCWNoaXAtPmNvZGVjX21hc2sgJj0gfigxIDw8IGMpOwotCQkJCS8qIE1vcmUgYmFkbHksIGFjY2Vzc2luZyB0byBhIG5vbi1leGlzdGluZwotCQkJCSAqIGNvZGVjIG9mdGVuIHNjcmV3cyB1cCB0aGUgY29udHJvbGxlciBjaGlwLAotCQkJCSAqIGFuZCBkaXN0dXJicyB0aGUgZnVydGhlciBjb21tdW5pY2F0aW9ucy4KLQkJCQkgKiBUaHVzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgcHJvYmluZywKLQkJCQkgKiBiZXR0ZXIgdG8gcmVzZXQgdGhlIGNvbnRyb2xsZXIgY2hpcCB0bwotCQkJCSAqIGdldCBiYWNrIHRvIHRoZSBzYW5pdHkgc3RhdGUuCi0JCQkJICovCi0JCQkJYXp4X3N0b3BfY2hpcChjaGlwKTsKLQkJCQlhenhfaW5pdF9jaGlwKGNoaXAsIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogQU1EIGNoaXBzZXRzIG9mdGVuIGNhdXNlIHRoZSBjb21tdW5pY2F0aW9uIHN0YWxscyB1cG9uIGNlcnRhaW4KLQkgKiBzZXF1ZW5jZSBsaWtlIHRoZSBwaW4tZGV0ZWN0aW9uLiAgSXQgc2VlbXMgdGhhdCBmb3JjaW5nIHRoZSBzeW5jZWQKLQkgKiBhY2Nlc3Mgd29ya3MgYXJvdW5kIHRoZSBzdGFsbC4gIEdycnIuLi4KLQkgKi8KLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfU1lOQ19XUklURSkgewotCQlzbmRfcHJpbnRkKFNGWCAiJXM6IEVuYWJsZSBzeW5jX3dyaXRlIGZvciBzdGFibGUgY29tbXVuaWNhdGlvblxuIiwKLQkJCXBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQljaGlwLT5idXMtPnN5bmNfd3JpdGUgPSAxOwotCQljaGlwLT5idXMtPmFsbG93X2J1c19yZXNldCA9IDE7Ci0JfQotCi0JLyogVGhlbiBjcmVhdGUgY29kZWMgaW5zdGFuY2VzICovCi0JZm9yIChjID0gMDsgYyA8IG1heF9zbG90czsgYysrKSB7Ci0JCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIGNoaXAtPmNvZGVjX3Byb2JlX21hc2spIHsKLQkJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCQkJZXJyID0gc25kX2hkYV9jb2RlY19uZXcoY2hpcC0+YnVzLCBjLCAmY29kZWMpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJY29udGludWU7Ci0JCQljb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwgPSBnZXRfamFja3BvbGxfaW50ZXJ2YWwoY2hpcCk7Ci0JCQljb2RlYy0+YmVlcF9tb2RlID0gY2hpcC0+YmVlcF9tb2RlOwotCQkJY29kZWNzKys7Ci0JCX0KLQl9Ci0JaWYgKCFjb2RlY3MpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBubyBjb2RlY3MgaW5pdGlhbGl6ZWRcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogY29uZmlndXJlIGVhY2ggY29kZWMgaW5zdGFuY2UgKi8KLXN0YXRpYyBpbnQgYXp4X2NvZGVjX2NvbmZpZ3VyZShzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjaGlwLT5idXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJc25kX2hkYV9jb2RlY19jb25maWd1cmUoY29kZWMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogUENNIHN1cHBvcnQKLSAqLwotCi0vKiBhc3NpZ24gYSBzdHJlYW0gZm9yIHRoZSBQQ00gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGF6eF9kZXYgKgotYXp4X2Fzc2lnbl9kZXZpY2Uoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IGRldiwgaSwgbnVtczsKLQlzdHJ1Y3QgYXp4X2RldiAqcmVzID0gTlVMTDsKLQkvKiBtYWtlIGEgbm9uLXplcm8gdW5pcXVlIGtleSBmb3IgdGhlIHN1YnN0cmVhbSAqLwotCWludCBrZXkgPSAoc3Vic3RyZWFtLT5wY20tPmRldmljZSA8PCAxNikgfCAoc3Vic3RyZWFtLT5udW1iZXIgPDwgMikgfAotCQkoc3Vic3RyZWFtLT5zdHJlYW0gKyAxKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWRldiA9IGNoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldDsKLQkJbnVtcyA9IGNoaXAtPnBsYXliYWNrX3N0cmVhbXM7Ci0JfSBlbHNlIHsKLQkJZGV2ID0gY2hpcC0+Y2FwdHVyZV9pbmRleF9vZmZzZXQ7Ci0JCW51bXMgPSBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyssIGRldisrKSB7Ci0JCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gJmNoaXAtPmF6eF9kZXZbZGV2XTsKLQkJZHNwX2xvY2soYXp4X2Rldik7Ci0JCWlmICghYXp4X2Rldi0+b3BlbmVkICYmICFkc3BfaXNfbG9ja2VkKGF6eF9kZXYpKSB7Ci0JCQlyZXMgPSBhenhfZGV2OwotCQkJaWYgKHJlcy0+YXNzaWduZWRfa2V5ID09IGtleSkgewotCQkJCXJlcy0+b3BlbmVkID0gMTsKLQkJCQlyZXMtPmFzc2lnbmVkX2tleSA9IGtleTsKLQkJCQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCQkJCXJldHVybiBhenhfZGV2OwotCQkJfQotCQl9Ci0JCWRzcF91bmxvY2soYXp4X2Rldik7Ci0JfQotCWlmIChyZXMpIHsKLQkJZHNwX2xvY2socmVzKTsKLQkJcmVzLT5vcGVuZWQgPSAxOwotCQlyZXMtPmFzc2lnbmVkX2tleSA9IGtleTsKLQkJZHNwX3VubG9jayhyZXMpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKiByZWxlYXNlIHRoZSBhc3NpZ25lZCBzdHJlYW0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhenhfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCi17Ci0JYXp4X2Rldi0+b3BlbmVkID0gMDsKLX0KLQotc3RhdGljIGN5Y2xlX3QgYXp4X2NjX3JlYWQoY29uc3Qgc3RydWN0IGN5Y2xlY291bnRlciAqY2MpCi17Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBjb250YWluZXJfb2YoY2MsIHN0cnVjdCBhenhfZGV2LCBhenhfY2MpOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gYXp4X2Rldi0+c3Vic3RyZWFtOwotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwotCi0JcmV0dXJuIGF6eF9yZWFkbChjaGlwLCBXQUxMQ0xLKTsKLX0KLQotc3RhdGljIHZvaWQgYXp4X3RpbWVjb3VudGVyX2luaXQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJYm9vbCBmb3JjZSwgY3ljbGVfdCBsYXN0KQotewotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgdGltZWNvdW50ZXIgKnRjID0gJmF6eF9kZXYtPmF6eF90YzsKLQlzdHJ1Y3QgY3ljbGVjb3VudGVyICpjYyA9ICZhenhfZGV2LT5henhfY2M7Ci0JdTY0IG5zZWM7Ci0KLQljYy0+cmVhZCA9IGF6eF9jY19yZWFkOwotCWNjLT5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMik7Ci0KLQkvKgotCSAqIENvbnZlcnRpbmcgZnJvbSAyNCBNSHogdG8gbnMgbWVhbnMgYXBwbHlpbmcgYSAxMjUvMyBmYWN0b3IuCi0JICogVG8gYXZvaWQgYW55IHNhdHVyYXRpb24gaXNzdWVzIGluIGludGVybWVkaWF0ZSBvcGVyYXRpb25zLAotCSAqIHRoZSAxMjUgZmFjdG9yIGlzIGFwcGxpZWQgZmlyc3QuIFRoZSBkaXZpc2lvbiBpcyBhcHBsaWVkCi0JICogbGFzdCBhZnRlciByZWFkaW5nIHRoZSB0aW1lY291bnRlciB2YWx1ZS4KLQkgKiBBcHBseWluZyB0aGUgMS8zIGZhY3RvciBhcyBwYXJ0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbgotCSAqIHJlcXVpcmVzIGF0IGxlYXN0IDIwIGJpdHMgZm9yIGEgZGVjZW50IHByZWNpc2lvbiwgaG93ZXZlcgotCSAqIG92ZXJmbG93cyBvY2N1ciBhZnRlciBhYm91dCA0IGhvdXJzIG9yIGxlc3MsIG5vdCBhIG9wdGlvbi4KLQkgKi8KLQotCWNjLT5tdWx0ID0gMTI1OyAvKiBzYXR1cmF0aW9uIGFmdGVyIDE5NSB5ZWFycyAqLwotCWNjLT5zaGlmdCA9IDA7Ci0KLQluc2VjID0gMDsgLyogYXVkaW8gdGltZSBpcyBlbGFwc2VkIHRpbWUgc2luY2UgdHJpZ2dlciAqLwotCXRpbWVjb3VudGVyX2luaXQodGMsIGNjLCBuc2VjKTsKLQlpZiAoZm9yY2UpCi0JCS8qCi0JCSAqIGZvcmNlIHRpbWVjb3VudGVyIHRvIHVzZSBwcmVkZWZpbmVkIHZhbHVlLAotCQkgKiB1c2VkIGZvciBzeW5jaHJvbml6ZWQgc3RhcnRzCi0JCSAqLwotCQl0Yy0+Y3ljbGVfbGFzdCA9IGxhc3Q7Ci19Ci0KLXN0YXRpYyB1NjQgYXp4X2FkanVzdF9jb2RlY19kZWxheShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQl1NjQgbnNlYykKLXsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOwotCXU2NCBjb2RlY19mcmFtZXMsIGNvZGVjX25zZWNzOwotCi0JaWYgKCFoaW5mby0+b3BzLmdldF9kZWxheSkKLQkJcmV0dXJuIG5zZWM7Ci0KLQljb2RlY19mcmFtZXMgPSBoaW5mby0+b3BzLmdldF9kZWxheShoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7Ci0JY29kZWNfbnNlY3MgPSBkaXZfdTY0KGNvZGVjX2ZyYW1lcyAqIDEwMDAwMDAwMDBMTCwKLQkJCSAgICAgIHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSk7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlyZXR1cm4gbnNlYyArIGNvZGVjX25zZWNzOwotCi0JcmV0dXJuIChuc2VjID4gY29kZWNfbnNlY3MpID8gbnNlYyAtIGNvZGVjX25zZWNzIDogMDsKLX0KLQotc3RhdGljIGludCBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHRpbWVzcGVjICp0cykKLXsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7Ci0JdTY0IG5zZWM7Ci0KLQluc2VjID0gdGltZWNvdW50ZXJfcmVhZCgmYXp4X2Rldi0+YXp4X3RjKTsKLQluc2VjID0gZGl2X3U2NChuc2VjLCAzKTsgLyogY2FuIGJlIG9wdGltaXplZCAqLwotCW5zZWMgPSBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN1YnN0cmVhbSwgbnNlYyk7Ci0KLQkqdHMgPSBuc190b190aW1lc3BlYyhuc2VjKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgYXp4X3BjbV9odyA9IHsKLQkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJIC8qIE5vIGZ1bGwtcmVzdW1lIHlldCBpbXBsZW1lbnRlZCAqLwotCQkJCSAvKiBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfCovCi0JCQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKLQkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLIHwKLQkJCQkgU05EUlZfUENNX0lORk9fTk9fUEVSSU9EX1dBS0VVUCksCi0JLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCS5yYXRlX21pbiA9CQk0ODAwMCwKLQkucmF0ZV9tYXggPQkJNDgwMDAsCi0JLmNoYW5uZWxzX21pbiA9CQkyLAotCS5jaGFubmVsc19tYXggPQkJMiwKLQkuYnVmZmVyX2J5dGVzX21heCA9CUFaWF9NQVhfQlVGX1NJWkUsCi0JLnBlcmlvZF9ieXRlc19taW4gPQkxMjgsCi0JLnBlcmlvZF9ieXRlc19tYXggPQlBWlhfTUFYX0JVRl9TSVpFIC8gMiwKLQkucGVyaW9kc19taW4gPQkJMiwKLQkucGVyaW9kc19tYXggPQkJQVpYX01BWF9GUkFHLAotCS5maWZvX3NpemUgPQkJMCwKLX07Ci0KLXN0YXRpYyBpbnQgYXp4X3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXY7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnI7Ci0JaW50IGJ1ZmZfc3RlcDsKLQotCW11dGV4X2xvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCWF6eF9kZXYgPSBhenhfYXNzaWduX2RldmljZShjaGlwLCBzdWJzdHJlYW0pOwotCWlmIChhenhfZGV2ID09IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JcnVudGltZS0+aHcgPSBhenhfcGNtX2h3OwotCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IGhpbmZvLT5jaGFubmVsc19taW47Ci0JcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gaGluZm8tPmNoYW5uZWxzX21heDsKLQlydW50aW1lLT5ody5mb3JtYXRzID0gaGluZm8tPmZvcm1hdHM7Ci0JcnVudGltZS0+aHcucmF0ZXMgPSBoaW5mby0+cmF0ZXM7Ci0Jc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7Ci0KLQkvKiBhdm9pZCB3cmFwLWFyb3VuZCB3aXRoIHdhbGwtY2xvY2sgKi8KLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfVElNRSwKLQkJCQkyMCwKLQkJCQkxNzgwMDAwMDApOwotCi0JaWYgKGNoaXAtPmFsaWduX2J1ZmZlcl9zaXplKQotCQkvKiBjb25zdHJhaW4gYnVmZmVyIHNpemVzIHRvIGJlIG11bHRpcGxlIG9mIDEyOAotCQkgICBieXRlcy4gVGhpcyBpcyBtb3JlIGVmZmljaWVudCBpbiB0ZXJtcyBvZiBtZW1vcnkKLQkJICAgYWNjZXNzIGJ1dCBpc24ndCByZXF1aXJlZCBieSB0aGUgSERBIHNwZWMgYW5kCi0JCSAgIHByZXZlbnRzIHVzZXJzIGZyb20gc3BlY2lmeWluZyBleGFjdCBwZXJpb2QvYnVmZmVyCi0JCSAgIHNpemVzLiBGb3IgZXhhbXBsZSBmb3IgNDQuMWtIeiwgYSBwZXJpb2Qgc2l6ZSBzZXQKLQkJICAgdG8gMjBtcyB3aWxsIGJlIHJvdW5kZWQgdG8gMTkuNTltcy4gKi8KLQkJYnVmZl9zdGVwID0gMTI4OwotCWVsc2UKLQkJLyogRG9uJ3QgZW5mb3JjZSBzdGVwcyBvbiBidWZmZXIgc2l6ZXMsIHN0aWxsIG5lZWQgdG8KLQkJICAgYmUgbXVsdGlwbGUgb2YgNCBieXRlcyAoSERBIHNwZWMpLiBUZXN0ZWQgb24gSW50ZWwKLQkJICAgSERBIGNvbnRyb2xsZXJzLCBtYXkgbm90IHdvcmsgb24gYWxsIGRldmljZXMgd2hlcmUKLQkJICAgb3B0aW9uIG5lZWRzIHRvIGJlIGRpc2FibGVkICovCi0JCWJ1ZmZfc3RlcCA9IDQ7Ci0KLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAotCQkJCSAgIGJ1ZmZfc3RlcCk7Ci0Jc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKLQkJCQkgICBidWZmX3N0ZXApOwotCXNuZF9oZGFfcG93ZXJfdXBfZDN3YWl0KGFwY20tPmNvZGVjKTsKLQllcnIgPSBoaW5mby0+b3BzLm9wZW4oaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOwotCWlmIChlcnIgPCAwKSB7Ci0JCWF6eF9yZWxlYXNlX2RldmljZShhenhfZGV2KTsKLQkJc25kX2hkYV9wb3dlcl9kb3duKGFwY20tPmNvZGVjKTsKLQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0Jc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAoc25kX0JVR19PTighcnVudGltZS0+aHcuY2hhbm5lbHNfbWluKSB8fAotCSAgICBzbmRfQlVHX09OKCFydW50aW1lLT5ody5jaGFubmVsc19tYXgpIHx8Ci0JICAgIHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LmZvcm1hdHMpIHx8Ci0JICAgIHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LnJhdGVzKSkgewotCQlhenhfcmVsZWFzZV9kZXZpY2UoYXp4X2Rldik7Ci0JCWhpbmZvLT5vcHMuY2xvc2UoaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOwotCQlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOwotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBkaXNhYmxlIFdBTExDTE9DSyB0aW1lc3RhbXBzIGZvciBjYXB0dXJlIHN0cmVhbXMKLQkgICB1bnRpbCB3ZSBmaWd1cmUgb3V0IGhvdyB0byBoYW5kbGUgZGlnaXRhbCBpbnB1dHMgKi8KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlydW50aW1lLT5ody5pbmZvICY9IH5TTkRSVl9QQ01fSU5GT19IQVNfV0FMTF9DTE9DSzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWF6eF9kZXYtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQlhenhfZGV2LT5ydW5uaW5nID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gYXp4X2RldjsKLQlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhenhfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlhenhfZGV2LT5zdWJzdHJlYW0gPSBOVUxMOwotCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOwotCWhpbmZvLT5vcHMuY2xvc2UoaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOwotCXNuZF9oZGFfcG93ZXJfZG93bihhcGNtLT5jb2RlYyk7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhenhfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOwotCWludCByZXQ7Ci0KLQlkc3BfbG9jayhhenhfZGV2KTsKLQlpZiAoZHNwX2lzX2xvY2tlZChhenhfZGV2KSkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCW1hcmtfcnVudGltZV93YyhjaGlwLCBhenhfZGV2LCBzdWJzdHJlYW0sIGZhbHNlKTsKLQlhenhfZGV2LT5idWZzaXplID0gMDsKLQlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSAwOwotCWF6eF9kZXYtPmZvcm1hdF92YWwgPSAwOwotCXJldCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCi0JCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gdW5sb2NrOwotCW1hcmtfcnVudGltZV93YyhjaGlwLCBhenhfZGV2LCBzdWJzdHJlYW0sIHRydWUpOwotIHVubG9jazoKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOwotCi0JLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KLQlkc3BfbG9jayhhenhfZGV2KTsKLQlpZiAoIWRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKLQkJYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQTCwgMCk7Ci0JCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQkRMUFUsIDApOwotCQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0NUTCwgMCk7Ci0JCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOwotCQlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSAwOwotCQlhenhfZGV2LT5mb3JtYXRfdmFsID0gMDsKLQl9Ci0KLQlzbmRfaGRhX2NvZGVjX2NsZWFudXAoYXBjbS0+Y29kZWMsIGhpbmZvLCBzdWJzdHJlYW0pOwotCi0JbWFya19ydW50aW1lX3djKGNoaXAsIGF6eF9kZXYsIHN1YnN0cmVhbSwgZmFsc2UpOwotCWF6eF9kZXYtPnByZXBhcmVkID0gMDsKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXp4X3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JdW5zaWduZWQgaW50IGJ1ZnNpemUsIHBlcmlvZF9ieXRlcywgZm9ybWF0X3ZhbCwgc3RyZWFtX3RhZzsKLQlpbnQgZXJyOwotCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9Ci0JCXNuZF9oZGFfc3BkaWZfb3V0X29mX25pZChhcGNtLT5jb2RlYywgaGluZm8tPm5pZCk7Ci0JdW5zaWduZWQgc2hvcnQgY3RscyA9IHNwZGlmID8gc3BkaWYtPmN0bHMgOiAwOwotCi0JZHNwX2xvY2soYXp4X2Rldik7Ci0JaWYgKGRzcF9pc19sb2NrZWQoYXp4X2RldikpIHsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlhenhfc3RyZWFtX3Jlc2V0KGNoaXAsIGF6eF9kZXYpOwotCWZvcm1hdF92YWwgPSBzbmRfaGRhX2NhbGNfc3RyZWFtX2Zvcm1hdChydW50aW1lLT5yYXRlLAotCQkJCQkJcnVudGltZS0+Y2hhbm5lbHMsCi0JCQkJCQlydW50aW1lLT5mb3JtYXQsCi0JCQkJCQloaW5mby0+bWF4YnBzLAotCQkJCQkJY3Rscyk7Ci0JaWYgKCFmb3JtYXRfdmFsKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYCi0JCQkgICAiJXM6IGludmFsaWQgZm9ybWF0X3ZhbCwgcmF0ZT0lZCwgY2g9JWQsIGZvcm1hdD0lZFxuIiwKLQkJCSAgIHBjaV9uYW1lKGNoaXAtPnBjaSksIHJ1bnRpbWUtPnJhdGUsIHJ1bnRpbWUtPmNoYW5uZWxzLCBydW50aW1lLT5mb3JtYXQpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlidWZzaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7Ci0JcGVyaW9kX2J5dGVzID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7Ci0KLQlzbmRfcHJpbnRkZChTRlggIiVzOiBhenhfcGNtX3ByZXBhcmU6IGJ1ZnNpemU9MHgleCwgZm9ybWF0PTB4JXhcbiIsCi0JCSAgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBidWZzaXplLCBmb3JtYXRfdmFsKTsKLQotCWlmIChidWZzaXplICE9IGF6eF9kZXYtPmJ1ZnNpemUgfHwKLQkgICAgcGVyaW9kX2J5dGVzICE9IGF6eF9kZXYtPnBlcmlvZF9ieXRlcyB8fAotCSAgICBmb3JtYXRfdmFsICE9IGF6eF9kZXYtPmZvcm1hdF92YWwgfHwKLQkgICAgcnVudGltZS0+bm9fcGVyaW9kX3dha2V1cCAhPSBhenhfZGV2LT5ub19wZXJpb2Rfd2FrZXVwKSB7Ci0JCWF6eF9kZXYtPmJ1ZnNpemUgPSBidWZzaXplOwotCQlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSBwZXJpb2RfYnl0ZXM7Ci0JCWF6eF9kZXYtPmZvcm1hdF92YWwgPSBmb3JtYXRfdmFsOwotCQlhenhfZGV2LT5ub19wZXJpb2Rfd2FrZXVwID0gcnVudGltZS0+bm9fcGVyaW9kX3dha2V1cDsKLQkJZXJyID0gYXp4X3NldHVwX3BlcmlvZHMoY2hpcCwgc3Vic3RyZWFtLCBhenhfZGV2KTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIHVubG9jazsKLQl9Ci0KLQkvKiB3aGVuIExQSUIgZGVsYXkgY29ycmVjdGlvbiBnaXZlcyBhIHNtYWxsIG5lZ2F0aXZlIHZhbHVlLAotCSAqIHdlIGlnbm9yZSBpdDsgY3VycmVudGx5IHNldCB0aGUgdGhyZXNob2xkIHN0YXRpY2FsbHkgdG8KLQkgKiA2NCBmcmFtZXMKLQkgKi8KLQlpZiAocnVudGltZS0+cGVyaW9kX3NpemUgPiA2NCkKLQkJYXp4X2Rldi0+ZGVsYXlfbmVnYXRpdmVfdGhyZXNob2xkID0gLWZyYW1lc190b19ieXRlcyhydW50aW1lLCA2NCk7Ci0JZWxzZQotCQlhenhfZGV2LT5kZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQgPSAwOwotCi0JLyogd2FsbGNsayBoYXMgMjRNaHogY2xvY2sgc291cmNlICovCi0JYXp4X2Rldi0+cGVyaW9kX3dhbGxjbGsgPSAoKChydW50aW1lLT5wZXJpb2Rfc2l6ZSAqIDI0MDAwKSAvCi0JCQkJCQlydW50aW1lLT5yYXRlKSAqIDEwMDApOwotCWF6eF9zZXR1cF9jb250cm9sbGVyKGNoaXAsIGF6eF9kZXYpOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlhenhfZGV2LT5maWZvX3NpemUgPSBhenhfc2RfcmVhZHcoYXp4X2RldiwgU0RfRklGT1NJWkUpICsgMTsKLQllbHNlCi0JCWF6eF9kZXYtPmZpZm9fc2l6ZSA9IDA7Ci0KLQlzdHJlYW1fdGFnID0gYXp4X2Rldi0+c3RyZWFtX3RhZzsKLQkvKiBDQS1JQkcgY2hpcHMgbmVlZCB0aGUgcGxheWJhY2sgc3RyZWFtIHN0YXJ0aW5nIGZyb20gMSAqLwotCWlmICgoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQpICYmCi0JICAgIHN0cmVhbV90YWcgPiBjaGlwLT5jYXB0dXJlX3N0cmVhbXMpCi0JCXN0cmVhbV90YWcgLT0gY2hpcC0+Y2FwdHVyZV9zdHJlYW1zOwotCWVyciA9IHNuZF9oZGFfY29kZWNfcHJlcGFyZShhcGNtLT5jb2RlYywgaGluZm8sIHN0cmVhbV90YWcsCi0JCQkJICAgICBhenhfZGV2LT5mb3JtYXRfdmFsLCBzdWJzdHJlYW0pOwotCi0gdW5sb2NrOgotCWlmICghZXJyKQotCQlhenhfZGV2LT5wcmVwYXJlZCA9IDE7Ci0JZHNwX3VubG9jayhhenhfZGV2KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGF6eF9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7Ci0JaW50IHJzdGFydCA9IDAsIHN0YXJ0LCBuc3luYyA9IDAsIHNiaXRzID0gMDsKLQlpbnQgbndhaXQsIHRpbWVvdXQ7Ci0KLQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQl0cmFjZV9henhfcGNtX3RyaWdnZXIoY2hpcCwgYXp4X2RldiwgY21kKTsKLQotCWlmIChkc3BfaXNfbG9ja2VkKGF6eF9kZXYpIHx8ICFhenhfZGV2LT5wcmVwYXJlZCkKLQkJcmV0dXJuIC1FUElQRTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQkJcnN0YXJ0ID0gMTsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCXN0YXJ0ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCXN0YXJ0ID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKLQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCWNvbnRpbnVlOwotCQlhenhfZGV2ID0gZ2V0X2F6eF9kZXYocyk7Ci0JCXNiaXRzIHw9IDEgPDwgYXp4X2Rldi0+aW5kZXg7Ci0JCW5zeW5jKys7Ci0JCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQkvKiBmaXJzdCwgc2V0IFNZTkMgYml0cyBvZiBjb3JyZXNwb25kaW5nIHN0cmVhbXMgKi8KLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfT0xEX1NTWU5DKQotCQlhenhfd3JpdGVsKGNoaXAsIE9MRF9TU1lOQywKLQkJCWF6eF9yZWFkbChjaGlwLCBPTERfU1NZTkMpIHwgc2JpdHMpOwotCWVsc2UKLQkJYXp4X3dyaXRlbChjaGlwLCBTU1lOQywgYXp4X3JlYWRsKGNoaXAsIFNTWU5DKSB8IHNiaXRzKTsKLQotCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7Ci0JCWlmIChzLT5wY20tPmNhcmQgIT0gc3Vic3RyZWFtLT5wY20tPmNhcmQpCi0JCQljb250aW51ZTsKLQkJYXp4X2RldiA9IGdldF9henhfZGV2KHMpOwotCQlpZiAoc3RhcnQpIHsKLQkJCWF6eF9kZXYtPnN0YXJ0X3dhbGxjbGsgPSBhenhfcmVhZGwoY2hpcCwgV0FMTENMSyk7Ci0JCQlpZiAoIXJzdGFydCkKLQkJCQlhenhfZGV2LT5zdGFydF93YWxsY2xrIC09Ci0JCQkJCQlhenhfZGV2LT5wZXJpb2Rfd2FsbGNsazsKLQkJCWF6eF9zdHJlYW1fc3RhcnQoY2hpcCwgYXp4X2Rldik7Ci0JCX0gZWxzZSB7Ci0JCQlhenhfc3RyZWFtX3N0b3AoY2hpcCwgYXp4X2Rldik7Ci0JCX0KLQkJYXp4X2Rldi0+cnVubmluZyA9IHN0YXJ0OwotCX0KLQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCWlmIChzdGFydCkgewotCQkvKiB3YWl0IHVudGlsIGFsbCBGSUZPcyBnZXQgcmVhZHkgKi8KLQkJZm9yICh0aW1lb3V0ID0gNTAwMDsgdGltZW91dDsgdGltZW91dC0tKSB7Ci0JCQlud2FpdCA9IDA7Ci0JCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewotCQkJCWlmIChzLT5wY20tPmNhcmQgIT0gc3Vic3RyZWFtLT5wY20tPmNhcmQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKLQkJCQlpZiAoIShhenhfc2RfcmVhZGIoYXp4X2RldiwgU0RfU1RTKSAmCi0JCQkJICAgICAgU0RfU1RTX0ZJRk9fUkVBRFkpKQotCQkJCQlud2FpdCsrOwotCQkJfQotCQkJaWYgKCFud2FpdCkKLQkJCQlicmVhazsKLQkJCWNwdV9yZWxheCgpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogd2FpdCB1bnRpbCBhbGwgUlVOIGJpdHMgYXJlIGNsZWFyZWQgKi8KLQkJZm9yICh0aW1lb3V0ID0gNTAwMDsgdGltZW91dDsgdGltZW91dC0tKSB7Ci0JCQlud2FpdCA9IDA7Ci0JCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewotCQkJCWlmIChzLT5wY20tPmNhcmQgIT0gc3Vic3RyZWFtLT5wY20tPmNhcmQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWF6eF9kZXYgPSBnZXRfYXp4X2RldihzKTsKLQkJCQlpZiAoYXp4X3NkX3JlYWRiKGF6eF9kZXYsIFNEX0NUTCkgJgotCQkJCSAgICBTRF9DVExfRE1BX1NUQVJUKQotCQkJCQlud2FpdCsrOwotCQkJfQotCQkJaWYgKCFud2FpdCkKLQkJCQlicmVhazsKLQkJCWNwdV9yZWxheCgpOwotCQl9Ci0JfQotCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCS8qIHJlc2V0IFNZTkMgYml0cyAqLwotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19PTERfU1NZTkMpCi0JCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAotCQkJYXp4X3JlYWRsKGNoaXAsIE9MRF9TU1lOQykgJiB+c2JpdHMpOwotCWVsc2UKLQkJYXp4X3dyaXRlbChjaGlwLCBTU1lOQywgYXp4X3JlYWRsKGNoaXAsIFNTWU5DKSAmIH5zYml0cyk7Ci0JaWYgKHN0YXJ0KSB7Ci0JCWF6eF90aW1lY291bnRlcl9pbml0KHN1YnN0cmVhbSwgMCwgMCk7Ci0JCWlmIChuc3luYyA+IDEpIHsKLQkJCWN5Y2xlX3QgY3ljbGVfbGFzdDsKLQotCQkJLyogc2FtZSBzdGFydCBjeWNsZSBmb3IgbWFzdGVyIGFuZCBncm91cCAqLwotCQkJYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7Ci0JCQljeWNsZV9sYXN0ID0gYXp4X2Rldi0+YXp4X3RjLmN5Y2xlX2xhc3Q7Ci0KLQkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7Ci0JCQkJaWYgKHMtPnBjbS0+Y2FyZCAhPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXp4X3RpbWVjb3VudGVyX2luaXQocywgMSwgY3ljbGVfbGFzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogZ2V0IHRoZSBjdXJyZW50IERNQSBwb3NpdGlvbiB3aXRoIGNvcnJlY3Rpb24gb24gVklBIGNoaXBzICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF92aWFfZ2V0X3Bvc2l0aW9uKHN0cnVjdCBhenggKmNoaXAsCi0JCQkJCSBzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldikKLXsKLQl1bnNpZ25lZCBpbnQgbGlua19wb3MsIG1pbmlfcG9zLCBib3VuZF9wb3M7Ci0JdW5zaWduZWQgaW50IG1vZF9saW5rX3BvcywgbW9kX2RtYV9wb3MsIG1vZF9taW5pX3BvczsKLQl1bnNpZ25lZCBpbnQgZmlmb19zaXplOwotCi0JbGlua19wb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQik7Ci0JaWYgKGF6eF9kZXYtPnN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJLyogUGxheWJhY2ssIG5vIHByb2JsZW0gdXNpbmcgbGluayBwb3NpdGlvbiAqLwotCQlyZXR1cm4gbGlua19wb3M7Ci0JfQotCi0JLyogQ2FwdHVyZSAqLwotCS8qIEZvciBuZXcgY2hpcHNldCwKLQkgKiB1c2UgbW9kIHRvIGdldCB0aGUgRE1BIHBvc2l0aW9uIGp1c3QgbGlrZSBvbGQgY2hpcHNldAotCSAqLwotCW1vZF9kbWFfcG9zID0gbGUzMl90b19jcHUoKmF6eF9kZXYtPnBvc2J1Zik7Ci0JbW9kX2RtYV9wb3MgJT0gYXp4X2Rldi0+cGVyaW9kX2J5dGVzOwotCi0JLyogYXp4X2Rldi0+Zmlmb19zaXplIGNhbid0IGdldCBGSUZPIHNpemUgb2YgaW4gc3RyZWFtLgotCSAqIEdldCBmcm9tIGJhc2UgYWRkcmVzcyArIG9mZnNldC4KLQkgKi8KLQlmaWZvX3NpemUgPSByZWFkdyhjaGlwLT5yZW1hcF9hZGRyICsgVklBX0lOX1NUUkVBTTBfRklGT19TSVpFX09GRlNFVCk7Ci0KLQlpZiAoYXp4X2Rldi0+aW5zdWZmaWNpZW50KSB7Ci0JCS8qIExpbmsgcG9zaXRpb24gbmV2ZXIgZ2F0aGVyIHRoYW4gRklGTyBzaXplICovCi0JCWlmIChsaW5rX3BvcyA8PSBmaWZvX3NpemUpCi0JCQlyZXR1cm4gMDsKLQotCQlhenhfZGV2LT5pbnN1ZmZpY2llbnQgPSAwOwotCX0KLQotCWlmIChsaW5rX3BvcyA8PSBmaWZvX3NpemUpCi0JCW1pbmlfcG9zID0gYXp4X2Rldi0+YnVmc2l6ZSArIGxpbmtfcG9zIC0gZmlmb19zaXplOwotCWVsc2UKLQkJbWluaV9wb3MgPSBsaW5rX3BvcyAtIGZpZm9fc2l6ZTsKLQotCS8qIEZpbmQgbmVhcmVzdCBwcmV2aW91cyBib3VkYXJ5ICovCi0JbW9kX21pbmlfcG9zID0gbWluaV9wb3MgJSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7Ci0JbW9kX2xpbmtfcG9zID0gbGlua19wb3MgJSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7Ci0JaWYgKG1vZF9saW5rX3BvcyA+PSBmaWZvX3NpemUpCi0JCWJvdW5kX3BvcyA9IGxpbmtfcG9zIC0gbW9kX2xpbmtfcG9zOwotCWVsc2UgaWYgKG1vZF9kbWFfcG9zID49IG1vZF9taW5pX3BvcykKLQkJYm91bmRfcG9zID0gbWluaV9wb3MgLSBtb2RfbWluaV9wb3M7Ci0JZWxzZSB7Ci0JCWJvdW5kX3BvcyA9IG1pbmlfcG9zIC0gbW9kX21pbmlfcG9zICsgYXp4X2Rldi0+cGVyaW9kX2J5dGVzOwotCQlpZiAoYm91bmRfcG9zID49IGF6eF9kZXYtPmJ1ZnNpemUpCi0JCQlib3VuZF9wb3MgPSAwOwotCX0KLQotCS8qIENhbGN1bGF0ZSByZWFsIERNQSBwb3NpdGlvbiB3ZSB3YW50ICovCi0JcmV0dXJuIGJvdW5kX3BvcyArIG1vZF9kbWFfcG9zOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKLQkJCQkgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LAotCQkJCSAgICAgYm9vbCB3aXRoX2NoZWNrKQotewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gYXp4X2Rldi0+c3Vic3RyZWFtOwotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXVuc2lnbmVkIGludCBwb3M7Ci0JaW50IHN0cmVhbSA9IHN1YnN0cmVhbS0+c3RyZWFtOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSBhcGNtLT5oaW5mb1tzdHJlYW1dOwotCWludCBkZWxheSA9IDA7Ci0KLQlzd2l0Y2ggKGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dKSB7Ci0JY2FzZSBQT1NfRklYX0xQSUI6Ci0JCS8qIHJlYWQgTFBJQiAqLwotCQlwb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQik7Ci0JCWJyZWFrOwotCWNhc2UgUE9TX0ZJWF9WSUFDT01CTzoKLQkJcG9zID0gYXp4X3ZpYV9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2Rldik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIHVzZSB0aGUgcG9zaXRpb24gYnVmZmVyICovCi0JCXBvcyA9IGxlMzJfdG9fY3B1KCphenhfZGV2LT5wb3NidWYpOwotCQlpZiAod2l0aF9jaGVjayAmJiBjaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9PSBQT1NfRklYX0FVVE8pIHsKLQkJCWlmICghcG9zIHx8IHBvcyA9PSAodTMyKS0xKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSAgICAgICAiaGRhLWludGVsOiBJbnZhbGlkIHBvc2l0aW9uIGJ1ZmZlciwgIgotCQkJCSAgICAgICAidXNpbmcgTFBJQiByZWFkIG1ldGhvZCBpbnN0ZWFkLlxuIik7Ci0JCQkJY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPSBQT1NfRklYX0xQSUI7Ci0JCQkJcG9zID0gYXp4X3NkX3JlYWRsKGF6eF9kZXYsIFNEX0xQSUIpOwotCQkJfSBlbHNlCi0JCQkJY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPSBQT1NfRklYX1BPU0JVRjsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAocG9zID49IGF6eF9kZXYtPmJ1ZnNpemUpCi0JCXBvcyA9IDA7Ci0KLQkvKiBjYWxjdWxhdGUgcnVudGltZSBkZWxheSBmcm9tIExQSUIgKi8KLQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lICYmCi0JICAgIGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID09IFBPU19GSVhfUE9TQlVGICYmCi0JICAgIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19DT1VOVF9MUElCX0RFTEFZKSkgewotCQl1bnNpZ25lZCBpbnQgbHBpYl9wb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQik7Ci0JCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJCWRlbGF5ID0gcG9zIC0gbHBpYl9wb3M7Ci0JCWVsc2UKLQkJCWRlbGF5ID0gbHBpYl9wb3MgLSBwb3M7Ci0JCWlmIChkZWxheSA8IDApIHsKLQkJCWlmIChkZWxheSA+PSBhenhfZGV2LT5kZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQpCi0JCQkJZGVsYXkgPSAwOwotCQkJZWxzZQotCQkJCWRlbGF5ICs9IGF6eF9kZXYtPmJ1ZnNpemU7Ci0JCX0KLQkJaWYgKGRlbGF5ID49IGF6eF9kZXYtPnBlcmlvZF9ieXRlcykgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYCi0JCQkJICAgIiVzOiBVbnN0YWJsZSBMUElCICglZCA+PSAlZCk7ICIKLQkJCQkgICAiZGlzYWJsaW5nIExQSUIgZGVsYXkgY291bnRpbmdcbiIsCi0JCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgZGVsYXksIGF6eF9kZXYtPnBlcmlvZF9ieXRlcyk7Ci0JCQlkZWxheSA9IDA7Ci0JCQljaGlwLT5kcml2ZXJfY2FwcyAmPSB+QVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVk7Ci0JCX0KLQkJZGVsYXkgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkZWxheSk7Ci0JfQotCi0JaWYgKHN1YnN0cmVhbS0+cnVudGltZSkgewotCQlpZiAoaGluZm8tPm9wcy5nZXRfZGVsYXkpCi0JCQlkZWxheSArPSBoaW5mby0+b3BzLmdldF9kZWxheShoaW5mbywgYXBjbS0+Y29kZWMsCi0JCQkJCQkgICAgICBzdWJzdHJlYW0pOwotCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRlbGF5ID0gZGVsYXk7Ci0JfQotCi0JdHJhY2VfYXp4X2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2LCBwb3MsIGRlbGF5KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgYXp4X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwKLQkJCSAgICAgICBhenhfZ2V0X3Bvc2l0aW9uKGNoaXAsIGF6eF9kZXYsIGZhbHNlKSk7CiB9CiAKIC8qCkBAIC0yNTIxLDcgKzQ1NCw3IEBACiAJaWYgKHdhbGxjbGsgPCAoYXp4X2Rldi0+cGVyaW9kX3dhbGxjbGsgKiA1KSAvIDQgJiYKIAkgICAgcG9zICUgYXp4X2Rldi0+cGVyaW9kX2J5dGVzID4gYXp4X2Rldi0+cGVyaW9kX2J5dGVzIC8gMikKIAkJLyogTkcgLSBpdCdzIGJlbG93IHRoZSBmaXJzdCBuZXh0IHBlcmlvZCBib3VuZGFyeSAqLwotCQlyZXR1cm4gYmRsX3Bvc19hZGpbY2hpcC0+ZGV2X2luZGV4XSA/IDAgOiAtMTsKKwkJcmV0dXJuIGNoaXAtPmJkbF9wb3NfYWRqW2NoaXAtPmRldl9pbmRleF0gPyAwIDogLTE7CiAJYXp4X2Rldi0+c3RhcnRfd2FsbGNsayArPSB3YWxsY2xrOwogCXJldHVybiAxOyAvKiBPSywgaXQncyBmaW5lICovCiB9CkBAIC0yNTM1LDEwICs0NjgsOSBAQAogCWludCBpLCBwZW5kaW5nLCBvazsKIAogCWlmICghY2hpcC0+aXJxX3BlbmRpbmdfd2FybmVkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJoZGEtaW50ZWw6IElSUSB0aW1pbmcgd29ya2Fyb3VuZCBpcyBhY3RpdmF0ZWQgIgotCQkgICAgICAgImZvciBjYXJkICMlZC4gU3VnZ2VzdCBhIGJpZ2dlciBiZGxfcG9zX2Fkai5cbiIsCi0JCSAgICAgICBjaGlwLT5jYXJkLT5udW1iZXIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkgIklSUSB0aW1pbmcgd29ya2Fyb3VuZCBpcyBhY3RpdmF0ZWQgZm9yIGNhcmQgIyVkLiBTdWdnZXN0IGEgYmlnZ2VyIGJkbF9wb3NfYWRqLlxuIiwKKwkJCSBjaGlwLT5jYXJkLT5udW1iZXIpOwogCQljaGlwLT5pcnFfcGVuZGluZ193YXJuZWQgPSAxOwogCX0KIApAQCAtMjU4MCwxMzkgKzUxMiwxNCBAQAogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogfQogCi0jaWZkZWYgQ09ORklHX1g4Ngotc3RhdGljIGludCBhenhfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpCi17Ci0Jc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0JaWYgKCFhenhfc25vb3AoY2hpcCkpCi0JCWFyZWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUoYXJlYS0+dm1fcGFnZV9wcm90KTsKLQlyZXR1cm4gc25kX3BjbV9saWJfZGVmYXVsdF9tbWFwKHN1YnN0cmVhbSwgYXJlYSk7Ci19Ci0jZWxzZQotI2RlZmluZSBhenhfcGNtX21tYXAJTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgYXp4X3BjbV9vcHMgPSB7Ci0JLm9wZW4gPSBhenhfcGNtX29wZW4sCi0JLmNsb3NlID0gYXp4X3BjbV9jbG9zZSwKLQkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0gYXp4X3BjbV9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBhenhfcGNtX2h3X2ZyZWUsCi0JLnByZXBhcmUgPSBhenhfcGNtX3ByZXBhcmUsCi0JLnRyaWdnZXIgPSBhenhfcGNtX3RyaWdnZXIsCi0JLnBvaW50ZXIgPSBhenhfcGNtX3BvaW50ZXIsCi0JLndhbGxfY2xvY2sgPSAgYXp4X2dldF93YWxsY2xvY2tfdHN0YW1wLAotCS5tbWFwID0gYXp4X3BjbV9tbWFwLAotCS5wYWdlID0gc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSwKLX07Ci0KLXN0YXRpYyB2b2lkIGF6eF9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQotewotCXN0cnVjdCBhenhfcGNtICphcGNtID0gcGNtLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGFwY20pIHsKLQkJbGlzdF9kZWwoJmFwY20tPmxpc3QpOwotCQlrZnJlZShhcGNtKTsKLQl9Ci19Ci0KLSNkZWZpbmUgTUFYX1BSRUFMTE9DX1NJWkUJKDMyICogMTAyNCAqIDEwMjQpCi0KLXN0YXRpYyBpbnQKLWF6eF9hdHRhY2hfcGNtX3N0cmVhbShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJICAgICAgc3RydWN0IGhkYV9wY20gKmNwY20pCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci0Jc3RydWN0IGF6eF9wY20gKmFwY207Ci0JaW50IHBjbV9kZXYgPSBjcGNtLT5kZXZpY2U7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JaW50IHMsIGVycjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoYXBjbSwgJmNoaXAtPnBjbV9saXN0LCBsaXN0KSB7Ci0JCWlmIChhcGNtLT5wY20tPmRldmljZSA9PSBwY21fZGV2KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IFBDTSAlZCBhbHJlYWR5IGV4aXN0c1xuIiwKLQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpLCBwY21fZGV2KTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQl9Ci0JZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgY3BjbS0+bmFtZSwgcGNtX2RldiwKLQkJCSAgY3BjbS0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbXMsCi0JCQkgIGNwY20tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbXMsCi0JCQkgICZwY20pOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXN0cmxjcHkocGNtLT5uYW1lLCBjcGNtLT5uYW1lLCBzaXplb2YocGNtLT5uYW1lKSk7Ci0JYXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCphcGNtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFwY20gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JYXBjbS0+Y2hpcCA9IGNoaXA7Ci0JYXBjbS0+cGNtID0gcGNtOwotCWFwY20tPmNvZGVjID0gY29kZWM7Ci0JcGNtLT5wcml2YXRlX2RhdGEgPSBhcGNtOwotCXBjbS0+cHJpdmF0ZV9mcmVlID0gYXp4X3BjbV9mcmVlOwotCWlmIChjcGNtLT5wY21fdHlwZSA9PSBIREFfUENNX1RZUEVfTU9ERU0pCi0JCXBjbS0+ZGV2X2NsYXNzID0gU05EUlZfUENNX0NMQVNTX01PREVNOwotCWxpc3RfYWRkX3RhaWwoJmFwY20tPmxpc3QsICZjaGlwLT5wY21fbGlzdCk7Ci0JY3BjbS0+cGNtID0gcGNtOwotCWZvciAocyA9IDA7IHMgPCAyOyBzKyspIHsKLQkJYXBjbS0+aGluZm9bc10gPSAmY3BjbS0+c3RyZWFtW3NdOwotCQlpZiAoY3BjbS0+c3RyZWFtW3NdLnN1YnN0cmVhbXMpCi0JCQlzbmRfcGNtX3NldF9vcHMocGNtLCBzLCAmYXp4X3BjbV9vcHMpOwotCX0KLQkvKiBidWZmZXIgcHJlLWFsbG9jYXRpb24gKi8KLQlzaXplID0gQ09ORklHX1NORF9IREFfUFJFQUxMT0NfU0laRSAqIDEwMjQ7Ci0JaWYgKHNpemUgPiBNQVhfUFJFQUxMT0NfU0laRSkKLQkJc2l6ZSA9IE1BWF9QUkVBTExPQ19TSVpFOwotCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCi0JCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKLQkJCQkJICAgICAgc2l6ZSwgTUFYX1BSRUFMTE9DX1NJWkUpOwotCXJldHVybiAwOwotfQotCi0vKgotICogbWl4ZXIgY3JlYXRpb24gLSBhbGwgc3R1ZmYgaXMgaW1wbGVtZW50ZWQgaW4gaGRhIG1vZHVsZQotICovCi1zdGF0aWMgaW50IGF6eF9taXhlcl9jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCkKLXsKLQlyZXR1cm4gc25kX2hkYV9idWlsZF9jb250cm9scyhjaGlwLT5idXMpOwotfQotCi0KLS8qCi0gKiBpbml0aWFsaXplIFNEIHN0cmVhbXMKLSAqLwotc3RhdGljIGludCBhenhfaW5pdF9zdHJlYW0oc3RydWN0IGF6eCAqY2hpcCkKLXsKLQlpbnQgaTsKLQotCS8qIGluaXRpYWxpemUgZWFjaCBzdHJlYW0gKGFrYSBkZXZpY2UpCi0JICogYXNzaWduIHRoZSBzdGFydGluZyBiZGwgYWRkcmVzcyB0byBlYWNoIHN0cmVhbSAoZGV2aWNlKQotCSAqIGFuZCBpbml0aWFsaXplCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKLQkJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSAmY2hpcC0+YXp4X2RldltpXTsKLQkJYXp4X2Rldi0+cG9zYnVmID0gKHUzMiBfX2lvbWVtICopKGNoaXAtPnBvc2J1Zi5hcmVhICsgaSAqIDgpOwotCQkvKiBvZmZzZXQ6IFNESTA9MHg4MCwgU0RJMT0weGEwLCAuLi4gU0RPMz0weDE2MCAqLwotCQlhenhfZGV2LT5zZF9hZGRyID0gY2hpcC0+cmVtYXBfYWRkciArICgweDIwICogaSArIDB4ODApOwotCQkvKiBpbnQgbWFzazogU0RJMD0weDAxLCBTREkxPTB4MDIsIC4uLiBTRE8zPTB4ODAgKi8KLQkJYXp4X2Rldi0+c2RfaW50X3N0YV9tYXNrID0gMSA8PCBpOwotCQkvKiBzdHJlYW0gdGFnOiBtdXN0IGJlIG5vbi16ZXJvIGFuZCB1bmlxdWUgKi8KLQkJYXp4X2Rldi0+aW5kZXggPSBpOwotCQlhenhfZGV2LT5zdHJlYW1fdGFnID0gaSArIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYXp4X2FjcXVpcmVfaXJxKHN0cnVjdCBhenggKmNoaXAsIGludCBkb19kaXNjb25uZWN0KQogewogCWlmIChyZXF1ZXN0X2lycShjaGlwLT5wY2ktPmlycSwgYXp4X2ludGVycnVwdCwKIAkJCWNoaXAtPm1zaSA/IDAgOiBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImhkYS1pbnRlbDogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgY2hpcC0+cGNpLT5pcnEpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ1bmFibGUgdG8gZ3JhYiBJUlEgJWQsIGRpc2FibGluZyBkZXZpY2VcbiIsCisJCQljaGlwLT5wY2ktPmlycSk7CiAJCWlmIChkb19kaXNjb25uZWN0KQogCQkJc25kX2NhcmRfZGlzY29ubmVjdChjaGlwLT5jYXJkKTsKIAkJcmV0dXJuIC0xOwpAQCAtMjcyMiwxNjAgKzUyOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgYXp4X3N0b3BfY2hpcChzdHJ1Y3QgYXp4ICpjaGlwKQotewotCWlmICghY2hpcC0+aW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCWF6eF9pbnRfZGlzYWJsZShjaGlwKTsKLQlhenhfaW50X2NsZWFyKGNoaXApOwotCi0JLyogZGlzYWJsZSBDT1JCL1JJUkIgKi8KLQlhenhfZnJlZV9jbWRfaW8oY2hpcCk7Ci0KLQkvKiBkaXNhYmxlIHBvc2l0aW9uIGJ1ZmZlciAqLwotCWF6eF93cml0ZWwoY2hpcCwgRFBMQkFTRSwgMCk7Ci0JYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCAwKTsKLQotCWNoaXAtPmluaXRpYWxpemVkID0gMDsKLX0KLQotI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKLS8qCi0gKiBEU1AgbG9hZGluZyBjb2RlIChlLmcuIGZvciBDQTAxMzIpCi0gKi8KLQotLyogdXNlIHRoZSBmaXJzdCBzdHJlYW0gZm9yIGxvYWRpbmcgRFNQICovCi1zdGF0aWMgc3RydWN0IGF6eF9kZXYgKgotYXp4X2dldF9kc3BfbG9hZGVyX2RldihzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXJldHVybiAmY2hpcC0+YXp4X2RldltjaGlwLT5wbGF5YmFja19pbmRleF9vZmZzZXRdOwotfQotCi1zdGF0aWMgaW50IGF6eF9sb2FkX2RzcF9wcmVwYXJlKHN0cnVjdCBoZGFfYnVzICpidXMsIHVuc2lnbmVkIGludCBmb3JtYXQsCi0JCQkJdW5zaWduZWQgaW50IGJ5dGVfc2l6ZSwKLQkJCQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZnApCi17Ci0JdTMyICpiZGw7Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OwotCWludCBlcnI7Ci0KLQlhenhfZGV2ID0gYXp4X2dldF9kc3BfbG9hZGVyX2RldihjaGlwKTsKLQotCWRzcF9sb2NrKGF6eF9kZXYpOwotCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlpZiAoYXp4X2Rldi0+cnVubmluZyB8fCBhenhfZGV2LT5sb2NrZWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCWF6eF9kZXYtPnByZXBhcmVkID0gMDsKLQljaGlwLT5zYXZlZF9henhfZGV2ID0gKmF6eF9kZXY7Ci0JYXp4X2Rldi0+bG9ja2VkID0gMTsKLQlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQotCWVyciA9IHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWX1NHLAotCQkJCSAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCSAgYnl0ZV9zaXplLCBidWZwKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJfYWxsb2M7Ci0KLQltYXJrX3BhZ2VzX3djKGNoaXAsIGJ1ZnAsIHRydWUpOwotCWF6eF9kZXYtPmJ1ZnNpemUgPSBieXRlX3NpemU7Ci0JYXp4X2Rldi0+cGVyaW9kX2J5dGVzID0gYnl0ZV9zaXplOwotCWF6eF9kZXYtPmZvcm1hdF92YWwgPSBmb3JtYXQ7Ci0KLQlhenhfc3RyZWFtX3Jlc2V0KGNoaXAsIGF6eF9kZXYpOwotCi0JLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBMLCAwKTsKLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0JETFBVLCAwKTsKLQotCWF6eF9kZXYtPmZyYWdzID0gMDsKLQliZGwgPSAodTMyICopYXp4X2Rldi0+YmRsLmFyZWE7Ci0JZXJyID0gc2V0dXBfYmRsZShjaGlwLCBidWZwLCBhenhfZGV2LCAmYmRsLCAwLCBieXRlX3NpemUsIDApOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JYXp4X3NldHVwX2NvbnRyb2xsZXIoY2hpcCwgYXp4X2Rldik7Ci0JZHNwX3VubG9jayhhenhfZGV2KTsKLQlyZXR1cm4gYXp4X2Rldi0+c3RyZWFtX3RhZzsKLQotIGVycm9yOgotCW1hcmtfcGFnZXNfd2MoY2hpcCwgYnVmcCwgZmFsc2UpOwotCXNuZF9kbWFfZnJlZV9wYWdlcyhidWZwKTsKLSBlcnJfYWxsb2M6Ci0Jc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCWlmIChhenhfZGV2LT5vcGVuZWQpCi0JCSphenhfZGV2ID0gY2hpcC0+c2F2ZWRfYXp4X2RldjsKLQlhenhfZGV2LT5sb2NrZWQgPSAwOwotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotIHVubG9jazoKLQlkc3BfdW5sb2NrKGF6eF9kZXYpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIGF6eF9sb2FkX2RzcF90cmlnZ2VyKHN0cnVjdCBoZGFfYnVzICpidXMsIGJvb2wgc3RhcnQpCi17Ci0Jc3RydWN0IGF6eCAqY2hpcCA9IGJ1cy0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gYXp4X2dldF9kc3BfbG9hZGVyX2RldihjaGlwKTsKLQotCWlmIChzdGFydCkKLQkJYXp4X3N0cmVhbV9zdGFydChjaGlwLCBhenhfZGV2KTsKLQllbHNlCi0JCWF6eF9zdHJlYW1fc3RvcChjaGlwLCBhenhfZGV2KTsKLQlhenhfZGV2LT5ydW5uaW5nID0gc3RhcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF6eF9sb2FkX2RzcF9jbGVhbnVwKHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkJIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYikKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBhenhfZ2V0X2RzcF9sb2FkZXJfZGV2KGNoaXApOwotCi0JaWYgKCFkbWFiLT5hcmVhIHx8ICFhenhfZGV2LT5sb2NrZWQpCi0JCXJldHVybjsKLQotCWRzcF9sb2NrKGF6eF9kZXYpOwotCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCi0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQTCwgMCk7Ci0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9CRExQVSwgMCk7Ci0JYXp4X3NkX3dyaXRlbChhenhfZGV2LCBTRF9DVEwsIDApOwotCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOwotCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7Ci0JYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7Ci0KLQltYXJrX3BhZ2VzX3djKGNoaXAsIGRtYWIsIGZhbHNlKTsKLQlzbmRfZG1hX2ZyZWVfcGFnZXMoZG1hYik7Ci0JZG1hYi0+YXJlYSA9IE5VTEw7Ci0KLQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKGF6eF9kZXYtPm9wZW5lZCkKLQkJKmF6eF9kZXYgPSBjaGlwLT5zYXZlZF9henhfZGV2OwotCWF6eF9kZXYtPmxvY2tlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JZHNwX3VubG9jayhhenhfZGV2KTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSICovCi0KICNpZmRlZiBDT05GSUdfUE0KLS8qIHBvd2VyLXVwL2Rvd24gdGhlIGNvbnRyb2xsZXIgKi8KLXN0YXRpYyB2b2lkIGF6eF9wb3dlcl9ub3RpZnkoc3RydWN0IGhkYV9idXMgKmJ1cywgYm9vbCBwb3dlcl91cCkKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gYnVzLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIShjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19QTV9SVU5USU1FKSkKLQkJcmV0dXJuOwotCi0JaWYgKHBvd2VyX3VwKQotCQlwbV9ydW50aW1lX2dldF9zeW5jKCZjaGlwLT5wY2ktPmRldik7Ci0JZWxzZQotCQlwbV9ydW50aW1lX3B1dF9zeW5jKCZjaGlwLT5wY2ktPmRldik7Ci19Ci0KIHN0YXRpYyBERUZJTkVfTVVURVgoY2FyZF9saXN0X2xvY2spOwogc3RhdGljIExJU1RfSEVBRChjYXJkX2xpc3QpOwogCkBAIC0yOTY5LDggKzYyMyw4IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoZGEtaW50ZWw6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0zMTI3LDM2ICs3ODEsMzIgQEAKIAlpZiAoIWNoaXAtPmJ1cykgewogCQljaGlwLT5kaXNhYmxlZCA9IGRpc2FibGVkOwogCQlpZiAoIWRpc2FibGVkKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyBTRlgKLQkJCQkgICAiJXM6IFN0YXJ0IGRlbGF5ZWQgaW5pdGlhbGl6YXRpb25cbiIsCi0JCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJTdGFydCBkZWxheWVkIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJCWlmIChhenhfcHJvYmVfY29udGludWUoY2hpcCkgPCAwKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlgKLQkJCQkJICAgIiVzOiBpbml0aWFsaXphdGlvbiBlcnJvclxuIiwKLQkJCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJpbml0aWFsaXphdGlvbiBlcnJvclxuIik7CiAJCQkJY2hpcC0+aW5pdF9mYWlsZWQgPSB0cnVlOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gU0ZYCi0JCQkgICAiJXM6ICVzIHZpYSBWR0Etc3dpdGNoZXJvb1xuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSwKLQkJCSAgIGRpc2FibGVkID8gIkRpc2FibGluZyIgOiAiRW5hYmxpbmciKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LCAiJXMgdmlhIFZHQS1zd2l0Y2hlcm9vXG4iLAorCQkJIGRpc2FibGVkID8gIkRpc2FibGluZyIgOiAiRW5hYmxpbmciKTsKIAkJaWYgKGRpc2FibGVkKSB7Ci0JCQlwbV9ydW50aW1lX3B1dF9zeW5jX3N1c3BlbmQoJnBjaS0+ZGV2KTsKLQkJCWF6eF9zdXNwZW5kKCZwY2ktPmRldik7CisJCQlwbV9ydW50aW1lX3B1dF9zeW5jX3N1c3BlbmQoY2FyZC0+ZGV2KTsKKwkJCWF6eF9zdXNwZW5kKGNhcmQtPmRldik7CiAJCQkvKiB3aGVuIHdlIGdldCBzdXNwZW5kZWQgYnkgdmdhIHN3aXRjaGVyb28gd2UgZW5kIHVwIGluIEQzY29sZCwKIAkJCSAqIGhvd2V2ZXIgd2UgaGF2ZSBubyBBQ1BJIGhhbmRsZSwgc28gcGNpL2FjcGkgY2FuJ3QgcHV0IHVzIHRoZXJlLAogCQkJICogcHV0IG91cnNlbHZlcyB0aGVyZSAqLwogCQkJcGNpLT5jdXJyZW50X3N0YXRlID0gUENJX0QzY29sZDsKIAkJCWNoaXAtPmRpc2FibGVkID0gdHJ1ZTsKIAkJCWlmIChzbmRfaGRhX2xvY2tfZGV2aWNlcyhjaGlwLT5idXMpKQotCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiJXM6IENhbm5vdCBsb2NrIGRldmljZXMhXG4iLAotCQkJCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSAiQ2Fubm90IGxvY2sgZGV2aWNlcyFcbiIpOwogCQl9IGVsc2UgewogCQkJc25kX2hkYV91bmxvY2tfZGV2aWNlcyhjaGlwLT5idXMpOwotCQkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJnBjaS0+ZGV2KTsKKwkJCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGNhcmQtPmRldik7CiAJCQljaGlwLT5kaXNhYmxlZCA9IGZhbHNlOwotCQkJYXp4X3Jlc3VtZSgmcGNpLT5kZXYpOworCQkJYXp4X3Jlc3VtZShjYXJkLT5kZXYpOwogCQl9CiAJfQogfQpAQCAtMzE4MSw5ICs4MzEsOCBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpwID0gZ2V0X2JvdW5kX3ZnYShjaGlwLT5wY2kpOwogCWlmIChwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPIFNGWAotCQkJICAgIiVzOiBIYW5kbGUgVkdBLXN3aXRjaGVyb28gYXVkaW8gY2xpZW50XG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAiSGFuZGxlIFZHQS1zd2l0Y2hlcm9vIGF1ZGlvIGNsaWVudFxuIik7CiAJCWNoaXAtPnVzZV92Z2Ffc3dpdGNoZXJvbyA9IDE7CiAJCXBjaV9kZXZfcHV0KHApOwogCX0KQEAgLTMyMTEsNyArODYwLDggQEAKIAljaGlwLT52Z2Ffc3dpdGNoZXJvb19yZWdpc3RlcmVkID0gMTsKIAogCS8qIHJlZ2lzdGVyIGFzIGFuIG9wdGltdXMgaGRtaSBhdWRpbyBwb3dlciBkb21haW4gKi8KLQl2Z2Ffc3dpdGNoZXJvb19pbml0X2RvbWFpbl9wbV9vcHRpbXVzX2hkbWlfYXVkaW8oJmNoaXAtPnBjaS0+ZGV2LCAmY2hpcC0+aGRtaV9wbV9kb21haW4pOworCXZnYV9zd2l0Y2hlcm9vX2luaXRfZG9tYWluX3BtX29wdGltdXNfaGRtaV9hdWRpbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCQkJICZjaGlwLT5oZG1pX3BtX2RvbWFpbik7CiAJcmV0dXJuIDA7CiB9CiAjZWxzZQpAQCAtMzI2MCwyMSArOTEwLDcgQEAKIAlpZiAoY2hpcC0+cmVtYXBfYWRkcikKIAkJaW91bm1hcChjaGlwLT5yZW1hcF9hZGRyKTsKIAotCWlmIChjaGlwLT5henhfZGV2KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKQotCQkJaWYgKGNoaXAtPmF6eF9kZXZbaV0uYmRsLmFyZWEpIHsKLQkJCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5henhfZGV2W2ldLmJkbCwgZmFsc2UpOwotCQkJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YXp4X2RldltpXS5iZGwpOwotCQkJfQotCX0KLQlpZiAoY2hpcC0+cmIuYXJlYSkgewotCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5yYiwgZmFsc2UpOwotCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPnJiKTsKLQl9Ci0JaWYgKGNoaXAtPnBvc2J1Zi5hcmVhKSB7Ci0JCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPnBvc2J1ZiwgZmFsc2UpOwotCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPnBvc2J1Zik7Ci0JfQorCWF6eF9mcmVlX3N0cmVhbV9wYWdlcyhjaGlwKTsKIAlpZiAoY2hpcC0+cmVnaW9uX3JlcXVlc3RlZCkKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOwogCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOwpAQCAtMzM3NCwyMCArMTAxMCwxOSBAQAogCiAJcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKGNoaXAtPnBjaSwgcG9zaXRpb25fZml4X2xpc3QpOwogCWlmIChxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJoZGFfaW50ZWw6IHBvc2l0aW9uX2ZpeCBzZXQgdG8gJWQgIgotCQkgICAgICAgImZvciBkZXZpY2UgJTA0eDolMDR4XG4iLAotCQkgICAgICAgcS0+dmFsdWUsIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJICJwb3NpdGlvbl9maXggc2V0IHRvICVkIGZvciBkZXZpY2UgJTA0eDolMDR4XG4iLAorCQkJIHEtPnZhbHVlLCBxLT5zdWJ2ZW5kb3IsIHEtPnN1YmRldmljZSk7CiAJCXJldHVybiBxLT52YWx1ZTsKIAl9CiAKIAkvKiBDaGVjayBWSUEvQVRJIEhEIEF1ZGlvIENvbnRyb2xsZXIgZXhpc3QgKi8KIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE9TRklYX1ZJQSkgewotCQlzbmRfcHJpbnRkKFNGWCAiJXM6IFVzaW5nIFZJQUNPTUJPIHBvc2l0aW9uIGZpeFxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiVXNpbmcgVklBQ09NQk8gcG9zaXRpb24gZml4XG4iKTsKIAkJcmV0dXJuIFBPU19GSVhfVklBQ09NQk87CiAJfQogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19QT1NGSVhfTFBJQikgewotCQlzbmRfcHJpbnRkKFNGWCAiJXM6IFVzaW5nIExQSUIgcG9zaXRpb24gZml4XG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJVc2luZyBMUElCIHBvc2l0aW9uIGZpeFxuIik7CiAJCXJldHVybiBQT1NfRklYX0xQSUI7CiAJfQogCXJldHVybiBQT1NfRklYX0FVVE87CkBAIC0zNDI1LDEwICsxMDYwLDkgQEAKIAlpZiAoY2hpcC0+Y29kZWNfcHJvYmVfbWFzayA9PSAtMSkgewogCQlxID0gc25kX3BjaV9xdWlya19sb29rdXAoY2hpcC0+cGNpLCBwcm9iZV9tYXNrX2xpc3QpOwogCQlpZiAocSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJoZGFfaW50ZWw6IHByb2JlX21hc2sgc2V0IHRvIDB4JXggIgotCQkJICAgICAgICJmb3IgZGV2aWNlICUwNHg6JTA0eFxuIiwKLQkJCSAgICAgICBxLT52YWx1ZSwgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UpOworCQkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSAicHJvYmVfbWFzayBzZXQgdG8gMHgleCBmb3IgZGV2aWNlICUwNHg6JTA0eFxuIiwKKwkJCQkgcS0+dmFsdWUsIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlKTsKIAkJCWNoaXAtPmNvZGVjX3Byb2JlX21hc2sgPSBxLT52YWx1ZTsKIAkJfQogCX0KQEAgLTM0MzcsOCArMTA3MSw4IEBACiAJaWYgKGNoaXAtPmNvZGVjX3Byb2JlX21hc2sgIT0gLTEgJiYKIAkgICAgKGNoaXAtPmNvZGVjX3Byb2JlX21hc2sgJiBBWlhfRk9SQ0VfQ09ERUNfTUFTSykpIHsKIAkJY2hpcC0+Y29kZWNfbWFzayA9IGNoaXAtPmNvZGVjX3Byb2JlX21hc2sgJiAweGZmOwotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfaW50ZWw6IGNvZGVjX21hc2sgZm9yY2VkIHRvIDB4JXhcbiIsCi0JCSAgICAgICBjaGlwLT5jb2RlY19tYXNrKTsKKwkJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWNfbWFzayBmb3JjZWQgdG8gMHgleFxuIiwKKwkJCSBjaGlwLT5jb2RlY19tYXNrKTsKIAl9CiB9CiAKQEAgLTM0NzAsMTYgKzExMDQsMTYgQEAKIAljaGlwLT5tc2kgPSAxOwkvKiBlbmFibGUgTVNJIGFzIGRlZmF1bHQgKi8KIAlxID0gc25kX3BjaV9xdWlya19sb29rdXAoY2hpcC0+cGNpLCBtc2lfYmxhY2tfbGlzdCk7CiAJaWYgKHEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgImhkYV9pbnRlbDogbXNpIGZvciBkZXZpY2UgJTA0eDolMDR4IHNldCB0byAlZFxuIiwKLQkJICAgICAgIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlLCBxLT52YWx1ZSk7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCSAibXNpIGZvciBkZXZpY2UgJTA0eDolMDR4IHNldCB0byAlZFxuIiwKKwkJCSBxLT5zdWJ2ZW5kb3IsIHEtPnN1YmRldmljZSwgcS0+dmFsdWUpOwogCQljaGlwLT5tc2kgPSBxLT52YWx1ZTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIE5WaWRpYSBjaGlwc2V0cyBzZWVtIHRvIGNhdXNlIHRyb3VibGVzIHdpdGggTVNJICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05PX01TSSkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfaW50ZWw6IERpc2FibGluZyBNU0lcbiIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJEaXNhYmxpbmcgTVNJXG4iKTsKIAkJY2hpcC0+bXNpID0gMDsKIAl9CiB9CkBAIC0zNTExLDggKzExNDUsOCBAQAogCX0KIAogCWlmIChzbm9vcCAhPSBjaGlwLT5zbm9vcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyBTRlggIiVzOiBGb3JjZSB0byAlcyBtb2RlXG4iLAotCQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSwgc25vb3AgPyAic25vb3AiIDogIm5vbi1zbm9vcCIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJGb3JjZSB0byAlcyBtb2RlXG4iLAorCQkJIHNub29wID8gInNub29wIiA6ICJub24tc25vb3AiKTsKIAkJY2hpcC0+c25vb3AgPSBzbm9vcDsKIAl9CiB9CkBAIC0zNTI3LDYgKzExNjEsNyBAQAogICovCiBzdGF0aWMgaW50IGF6eF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkgICAgICBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgZHJpdmVyX2NhcHMsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBoZGFfY29udHJvbGxlcl9vcHMgKmhkYV9vcHMsCiAJCSAgICAgIHN0cnVjdCBhenggKipyY2hpcCkKIHsKIAlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKQEAgLTM1NDMsNyArMTE3OCw3IEBACiAKIAljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBDYW5ub3QgYWxsb2NhdGUgY2hpcFxuIiwgcGNpX25hbWUocGNpKSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzU1MiwxMSArMTE4NywxMyBAQAogCW11dGV4X2luaXQoJmNoaXAtPm9wZW5fbXV0ZXgpOwogCWNoaXAtPmNhcmQgPSBjYXJkOwogCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5vcHMgPSBoZGFfb3BzOwogCWNoaXAtPmlycSA9IC0xOwogCWNoaXAtPmRyaXZlcl9jYXBzID0gZHJpdmVyX2NhcHM7CiAJY2hpcC0+ZHJpdmVyX3R5cGUgPSBkcml2ZXJfY2FwcyAmIDB4ZmY7CiAJY2hlY2tfbXNpKGNoaXApOwogCWNoaXAtPmRldl9pbmRleCA9IGRldjsKKwljaGlwLT5qYWNrcG9sbF9tcyA9IGphY2twb2xsX21zOwogCUlOSVRfV09SSygmY2hpcC0+aXJxX3BlbmRpbmdfd29yaywgYXp4X2lycV9wZW5kaW5nX3dvcmspOwogCUlOSVRfTElTVF9IRUFEKCZjaGlwLT5wY21fbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPmxpc3QpOwpAQCAtMzU4OCwxMSArMTIyNSwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAl9CisJY2hpcC0+YmRsX3Bvc19hZGogPSBiZGxfcG9zX2FkajsKIAogCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBFcnJvciBjcmVhdGluZyBkZXZpY2UgW2NhcmRdIVxuIiwKLQkJICAgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiRXJyb3IgY3JlYXRpbmcgZGV2aWNlIFtjYXJkXSFcbiIpOwogCQlhenhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0zNjEwLDcgKzEyNDcsNyBAQAogCWludCBkZXYgPSBjaGlwLT5kZXZfaW5kZXg7CiAJc3RydWN0IHBjaV9kZXYgKnBjaSA9IGNoaXAtPnBjaTsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjaGlwLT5jYXJkOwotCWludCBpLCBlcnI7CisJaW50IGVycjsKIAl1bnNpZ25lZCBzaG9ydCBnY2FwOwogCiAjaWYgQklUU19QRVJfTE9ORyAhPSA2NApAQCAtMzYzMSw3ICsxMjY4LDcgQEAKIAljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJY2hpcC0+cmVtYXBfYWRkciA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDApOwogCWlmIChjaGlwLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBpb3JlbWFwIGVycm9yXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJpb3JlbWFwIGVycm9yXG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKQEAgLTM2NDYsNyArMTI4Myw3IEBACiAJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAKIAlnY2FwID0gYXp4X3JlYWR3KGNoaXAsIEdDQVApOwotCXNuZF9wcmludGRkKFNGWCAiJXM6IGNoaXBzZXQgZ2xvYmFsIGNhcGFiaWxpdGllcyA9IDB4JXhcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSksIGdjYXApOworCWRldl9kYmcoY2FyZC0+ZGV2LCAiY2hpcHNldCBnbG9iYWwgY2FwYWJpbGl0aWVzID0gMHgleFxuIiwgZ2NhcCk7CiAKIAkvKiBkaXNhYmxlIFNCNjAwIDY0Yml0IHN1cHBvcnQgZm9yIHNhZmV0eSAqLwogCWlmIChjaGlwLT5wY2ktPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FUSSkgewpAQCAtMzY2Myw3ICsxMzAwLDcgQEAKIAogCS8qIGRpc2FibGUgNjRiaXQgRE1BIGFkZHJlc3Mgb24gc29tZSBkZXZpY2VzICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05PXzY0QklUKSB7Ci0JCXNuZF9wcmludGQoU0ZYICIlczogRGlzYWJsaW5nIDY0Yml0IERNQVxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiRGlzYWJsaW5nIDY0Yml0IERNQVxuIik7CiAJCWdjYXAgJj0gfklDSDZfR0NBUF82NE9LOwogCX0KIApAQCAtMzcxOCwzMyArMTM1NSwxMSBAQAogCWNoaXAtPmF6eF9kZXYgPSBrY2FsbG9jKGNoaXAtPm51bV9zdHJlYW1zLCBzaXplb2YoKmNoaXAtPmF6eF9kZXYpLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghY2hpcC0+YXp4X2RldikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IGNhbm5vdCBtYWxsb2MgYXp4X2RldlxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IG1hbGxvYyBhenhfZGV2XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zdHJlYW1zOyBpKyspIHsKLQkJZHNwX2xvY2tfaW5pdCgmY2hpcC0+YXp4X2RldltpXSk7Ci0JCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEJETCBmb3IgZWFjaCBzdHJlYW0gKi8KLQkJZXJyID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsCi0JCQkJCSAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCQkgIEJETF9TSVpFLCAmY2hpcC0+YXp4X2RldltpXS5iZGwpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBjYW5ub3QgYWxsb2NhdGUgQkRMXG4iLCBwY2lfbmFtZShjaGlwLT5wY2kpKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCW1hcmtfcGFnZXNfd2MoY2hpcCwgJmNoaXAtPmF6eF9kZXZbaV0uYmRsLCB0cnVlKTsKLQl9Ci0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcG9zaXRpb24gYnVmZmVyICovCi0JZXJyID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsCi0JCQkJICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJICBjaGlwLT5udW1fc3RyZWFtcyAqIDgsICZjaGlwLT5wb3NidWYpOwotCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICIlczogY2Fubm90IGFsbG9jYXRlIHBvc2J1ZlxuIiwgcGNpX25hbWUoY2hpcC0+cGNpKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5wb3NidWYsIHRydWUpOwotCS8qIGFsbG9jYXRlIENPUkIvUklSQiAqLwotCWVyciA9IGF6eF9hbGxvY19jbWRfaW8oY2hpcCk7CisJZXJyID0gYXp4X2FsbG9jX3N0cmVhbV9wYWdlcyhjaGlwKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzc1Nyw3ICsxMzcyLDcgQEAKIAogCS8qIGNvZGVjIGRldGVjdGlvbiAqLwogCWlmICghY2hpcC0+Y29kZWNfbWFzaykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiJXM6IG5vIGNvZGVjcyBmb3VuZCFcbiIsIHBjaV9uYW1lKGNoaXAtPnBjaSkpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIm5vIGNvZGVjcyBmb3VuZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTM3OTMsOCArMTQwOCw3IEBACiAJc3RydWN0IHBjaV9kZXYgKnBjaSA9IGNoaXAtPnBjaTsKIAogCWlmICghZncpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBDYW5ub3QgbG9hZCBmaXJtd2FyZSwgYWJvcnRpbmdcbiIsCi0JCQkgICBwY2lfbmFtZShjaGlwLT5wY2kpKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDYW5ub3QgbG9hZCBmaXJtd2FyZSwgYWJvcnRpbmdcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMzgxMiw2ICsxNDI2LDEzMiBAQAogfQogI2VuZGlmCiAKKy8qCisgKiBIREEgY29udHJvbGxlciBvcHMuCisgKi8KKworLyogUENJIHJlZ2lzdGVyIGFjY2Vzcy4gKi8KK3N0YXRpYyB2b2lkIHBjaV9henhfd3JpdGVsKHUzMiB2YWx1ZSwgdTMyIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGVsKHZhbHVlLCBhZGRyKTsKK30KKworc3RhdGljIHUzMiBwY2lfYXp4X3JlYWRsKHUzMiBfX2lvbWVtICphZGRyKQoreworCXJldHVybiByZWFkbChhZGRyKTsKK30KKworc3RhdGljIHZvaWQgcGNpX2F6eF93cml0ZXcodTE2IHZhbHVlLCB1MTYgX19pb21lbSAqYWRkcikKK3sKKwl3cml0ZXcodmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgdTE2IHBjaV9henhfcmVhZHcodTE2IF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWR3KGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBwY2lfYXp4X3dyaXRlYih1OCB2YWx1ZSwgdTggX19pb21lbSAqYWRkcikKK3sKKwl3cml0ZWIodmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgdTggcGNpX2F6eF9yZWFkYih1OCBfX2lvbWVtICphZGRyKQoreworCXJldHVybiByZWFkYihhZGRyKTsKK30KKworc3RhdGljIGludCBkaXNhYmxlX21zaV9yZXNldF9pcnEoc3RydWN0IGF6eCAqY2hpcCkKK3sKKwlpbnQgZXJyOworCisJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKKwljaGlwLT5pcnEgPSAtMTsKKwlwY2lfZGlzYWJsZV9tc2koY2hpcC0+cGNpKTsKKwljaGlwLT5tc2kgPSAwOworCWVyciA9IGF6eF9hY3F1aXJlX2lycShjaGlwLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKiBETUEgcGFnZSBhbGxvY2F0aW9uIGhlbHBlcnMuICAqLworc3RhdGljIGludCBkbWFfYWxsb2NfcGFnZXMoc3RydWN0IGF6eCAqY2hpcCwKKwkJCSAgIGludCB0eXBlLAorCQkJICAgc2l6ZV90IHNpemUsCisJCQkgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2RtYV9hbGxvY19wYWdlcyh0eXBlLAorCQkJCSAgY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSAgc2l6ZSwgYnVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwltYXJrX3BhZ2VzX3djKGNoaXAsIGJ1ZiwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9mcmVlX3BhZ2VzKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmKQoreworCW1hcmtfcGFnZXNfd2MoY2hpcCwgYnVmLCBmYWxzZSk7CisJc25kX2RtYV9mcmVlX3BhZ2VzKGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgc3Vic3RyZWFtX2FsbG9jX3BhZ2VzKHN0cnVjdCBhenggKmNoaXAsCisJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CisJaW50IHJldDsKKworCW1hcmtfcnVudGltZV93YyhjaGlwLCBhenhfZGV2LCBzdWJzdHJlYW0sIGZhbHNlKTsKKwlhenhfZGV2LT5idWZzaXplID0gMDsKKwlhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPSAwOworCWF6eF9kZXYtPmZvcm1hdF92YWwgPSAwOworCXJldCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHNpemUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW1hcmtfcnVudGltZV93YyhjaGlwLCBhenhfZGV2LCBzdWJzdHJlYW0sIHRydWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1YnN0cmVhbV9mcmVlX3BhZ2VzKHN0cnVjdCBhenggKmNoaXAsCisJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCW1hcmtfcnVudGltZV93YyhjaGlwLCBhenhfZGV2LCBzdWJzdHJlYW0sIGZhbHNlKTsKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBwY21fbW1hcF9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpCit7CisjaWZkZWYgQ09ORklHX1g4NgorCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCWlmICghYXp4X3Nub29wKGNoaXApKQorCQlhcmVhLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKGFyZWEtPnZtX3BhZ2VfcHJvdCk7CisjZW5kaWYKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29udHJvbGxlcl9vcHMgcGNpX2hkYV9vcHMgPSB7CisJLnJlZ193cml0ZWwgPSBwY2lfYXp4X3dyaXRlbCwKKwkucmVnX3JlYWRsID0gcGNpX2F6eF9yZWFkbCwKKwkucmVnX3dyaXRldyA9IHBjaV9henhfd3JpdGV3LAorCS5yZWdfcmVhZHcgPSBwY2lfYXp4X3JlYWR3LAorCS5yZWdfd3JpdGViID0gcGNpX2F6eF93cml0ZWIsCisJLnJlZ19yZWFkYiA9IHBjaV9henhfcmVhZGIsCisJLmRpc2FibGVfbXNpX3Jlc2V0X2lycSA9IGRpc2FibGVfbXNpX3Jlc2V0X2lycSwKKwkuZG1hX2FsbG9jX3BhZ2VzID0gZG1hX2FsbG9jX3BhZ2VzLAorCS5kbWFfZnJlZV9wYWdlcyA9IGRtYV9mcmVlX3BhZ2VzLAorCS5zdWJzdHJlYW1fYWxsb2NfcGFnZXMgPSBzdWJzdHJlYW1fYWxsb2NfcGFnZXMsCisJLnN1YnN0cmVhbV9mcmVlX3BhZ2VzID0gc3Vic3RyZWFtX2ZyZWVfcGFnZXMsCisJLnBjbV9tbWFwX3ByZXBhcmUgPSBwY21fbW1hcF9wcmVwYXJlLAorCS5wb3NpdGlvbl9jaGVjayA9IGF6eF9wb3NpdGlvbl9jaGVjaywKK307CisKIHN0YXRpYyBpbnQgYXp4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCiAJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKIHsKQEAgLTM4MjgsMTUgKzE1NjgsMTUgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhLWludGVsOiBFcnJvciBjcmVhdGluZyBjYXJkIVxuIik7CisJCWRldl9lcnIoJnBjaS0+ZGV2LCAiRXJyb3IgY3JlYXRpbmcgY2FyZCFcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQotCWVyciA9IGF6eF9jcmVhdGUoY2FyZCwgcGNpLCBkZXYsIHBjaV9pZC0+ZHJpdmVyX2RhdGEsICZjaGlwKTsKKwllcnIgPSBhenhfY3JlYXRlKGNhcmQsIHBjaSwgZGV2LCBwY2lfaWQtPmRyaXZlcl9kYXRhLAorCQkJICZwY2lfaGRhX29wcywgJmNoaXApOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCWNhcmQtPnByaXZhdGVfZGF0YSA9IGNoaXA7CkBAIC0zODQ1LDE1ICsxNTg1LDEzIEBACiAKIAllcnIgPSByZWdpc3Rlcl92Z2Ffc3dpdGNoZXJvbyhjaGlwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWAotCQkJICAgIiVzOiBFcnJvciByZWdpc3RlcmluZyBWR0Etc3dpdGNoZXJvbyBjbGllbnRcbiIsIHBjaV9uYW1lKHBjaSkpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkVycm9yIHJlZ2lzdGVyaW5nIFZHQS1zd2l0Y2hlcm9vIGNsaWVudFxuIik7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJaWYgKGNoZWNrX2hkbWlfZGlzYWJsZWQocGNpKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyBTRlggIiVzOiBWR0EgY29udHJvbGxlciBpcyBkaXNhYmxlZFxuIiwKLQkJCSAgIHBjaV9uYW1lKHBjaSkpOwotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyBTRlggIiVzOiBEZWxheWluZyBpbml0aWFsaXphdGlvblxuIiwgcGNpX25hbWUocGNpKSk7CisJCWRldl9pbmZvKGNhcmQtPmRldiwgIlZHQSBjb250cm9sbGVyIGlzIGRpc2FibGVkXG4iKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiRGVsYXlpbmcgaW5pdGlhbGl6YXRpb25cbiIpOwogCQljaGlwLT5kaXNhYmxlZCA9IHRydWU7CiAJfQogCkBAIC0zODYxLDggKzE1OTksOCBAQAogCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSCiAJaWYgKHBhdGNoW2Rldl0gJiYgKnBhdGNoW2Rldl0pIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIiVzOiBBcHBseWluZyBwYXRjaCBmaXJtd2FyZSAnJXMnXG4iLAotCQkJICAgcGNpX25hbWUocGNpKSwgcGF0Y2hbZGV2XSk7CisJCWRldl9pbmZvKGNhcmQtPmRldiwgIkFwcGx5aW5nIHBhdGNoIGZpcm13YXJlICclcydcbiIsCisJCQkgcGF0Y2hbZGV2XSk7CiAJCWVyciA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCB0cnVlLCBwYXRjaFtkZXZdLAogCQkJCQkgICAgICAmcGNpLT5kZXYsIEdGUF9LRVJORUwsIGNhcmQsCiAJCQkJCSAgICAgIGF6eF9maXJtd2FyZV9jYik7CkBAIC0zODc0LDcgKzE2MTIsNyBAQAogCiAjaWZuZGVmIENPTkZJR19TTkRfSERBX0k5MTUKIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfSTkxNV9QT1dFUldFTEwpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICJIYXN3ZWxsIG11c3QgYnVpbGQgaW4gQ09ORklHX1NORF9IREFfSTkxNVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiSGFzd2VsbCBtdXN0IGJ1aWxkIGluIENPTkZJR19TTkRfSERBX0k5MTVcbiIpOwogI2VuZGlmCiAKIAlpZiAoc2NoZWR1bGVfcHJvYmUpCkBAIC0zODkwLDYgKzE2MjgsMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiBudW1iZXIgb2YgY29kZWMgc2xvdHMgZm9yIGVhY2ggY2hpcHNldDogMCA9IGRlZmF1bHQgc2xvdHMgKGkuZS4gNCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X21heF9jb2RlY3NbQVpYX05VTV9EUklWRVJTXSA9IHsKKwlbQVpYX0RSSVZFUl9OVklESUFdID0gOCwKKwlbQVpYX0RSSVZFUl9URVJBXSA9IDEsCit9OworCiBzdGF0aWMgaW50IGF6eF9wcm9iZV9jb250aW51ZShzdHJ1Y3QgYXp4ICpjaGlwKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSBjaGlwLT5wY2k7CkBAIC0zOTAxLDcgKzE2NDUsOCBAQAogI2lmZGVmIENPTkZJR19TTkRfSERBX0k5MTUKIAkJZXJyID0gaGRhX2k5MTVfaW5pdCgpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIkVycm9yIHJlcXVlc3QgcG93ZXItd2VsbCBmcm9tIGk5MTVcbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkVycm9yIHJlcXVlc3QgcG93ZXItd2VsbCBmcm9tIGk5MTVcbiIpOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQogI2VuZGlmCkBAIC0zOTE3LDcgKzE2NjIsMTAgQEAKICNlbmRpZgogCiAJLyogY3JlYXRlIGNvZGVjIGluc3RhbmNlcyAqLwotCWVyciA9IGF6eF9jb2RlY19jcmVhdGUoY2hpcCwgbW9kZWxbZGV2XSk7CisJZXJyID0gYXp4X2NvZGVjX2NyZWF0ZShjaGlwLCBtb2RlbFtkZXZdLAorCQkJICAgICAgIGF6eF9tYXhfY29kZWNzW2NoaXAtPmRyaXZlcl90eXBlXSwKKwkJCSAgICAgICBwb3dlcl9zYXZlX2FkZHIpOworCiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X2ZyZWU7CiAjaWZkZWYgQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSCkBAIC00MTQyLDcgKzE4OTAsNyBAQAogCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9DVEhEQSB8IEFaWF9EQ0FQU19QUkVTRVRfQ1RIREEgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxMTAyLCAweDAwMTIpLAogCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9DVEhEQSB8IEFaWF9EQ0FQU19QUkVTRVRfQ1RIREEgfSwKLSNpZiAhZGVmaW5lZChDT05GSUdfU05EX0NUWEZJKSAmJiAhZGVmaW5lZChDT05GSUdfU05EX0NUWEZJX01PRFVMRSkKKyNpZiAhSVNfRU5BQkxFRChDT05GSUdfU05EX0NUWEZJKQogCS8qIHRoZSBmb2xsb3dpbmcgZW50cnkgY29uZmxpY3RzIHdpdGggc25kLWN0eGZpIGRyaXZlciwKIAkgKiBhcyBjdHhmaSBkcml2ZXIgbXV0YXRlcyBmcm9tIEhELWF1ZGlvIHRvIG5hdGl2ZSBtb2RlIHdpdGgKIAkgKiBhIHNwZWNpYWwgY29tbWFuZCBzZXF1ZW5jZS4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCmluZGV4IGRhODBjNWIuLmU1MWQxNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaApAQCAtNTk3LDIzICs1OTcsMTAgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfY3JlYXRlX2h3ZGVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19TTkRfSERBX0hXREVQKQotaW50IHNuZF9oZGFfaHdkZXBfYWRkX3Bvd2VyX3N5c2ZzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBzbmRfaGRhX2h3ZGVwX2FkZF9wb3dlcl9zeXNmcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgordm9pZCBzbmRfaGRhX3N5c2ZzX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwordm9pZCBzbmRfaGRhX3N5c2ZzX2NsZWFyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIAotI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCi1pbnQgc25kX2hkYV9od2RlcF9hZGRfc3lzZnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfaHdkZXBfYWRkX3N5c2ZzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCitleHRlcm4gY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqc25kX2hkYV9kZXZfYXR0cl9ncm91cHNbXTsKIAogI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCiBjb25zdCBjaGFyICpzbmRfaGRhX2dldF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpOwpAQCAtNzcxLDQgKzc1OCwxMSBAQAogI2RlZmluZSBTTkRfUFJJTlRfQ0hBTk5FTF9BTExPQ0FUSU9OX0FEVklTRURfQlVGU0laRSA4MAogdm9pZCBzbmRfcHJpbnRfY2hhbm5lbF9hbGxvY2F0aW9uKGludCBzcGtfYWxsb2MsIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CiAKKy8qCisgKi8KKyNkZWZpbmUgY29kZWNfZXJyKGNvZGVjLCBmbXQsIGFyZ3MuLi4pIGRldl9lcnIoJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIGNvZGVjX3dhcm4oY29kZWMsIGZtdCwgYXJncy4uLikgZGV2X3dhcm4oJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIGNvZGVjX2luZm8oY29kZWMsIGZtdCwgYXJncy4uLikgZGV2X2luZm8oJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIGNvZGVjX2RiZyhjb2RlYywgZm10LCBhcmdzLi4uKSBkZXZfZGJnKCYoY29kZWMpLT5kZXYsIGZtdCwgIyNhcmdzKQorCiAjZW5kaWYgLyogX19TT1VORF9IREFfTE9DQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfcHJpdi5oIGIvc291bmQvcGNpL2hkYS9oZGFfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzhiODEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9wcml2LmgKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiAgQ29tbW9uIGRlZmluZXMgZm9yIHRoZSBhbHNhIGRyaXZlciBjb2RlIGJhc2UgZm9yIEhEIEF1ZGlvLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19TT1VORF9IREFfUFJJVl9ICisjZGVmaW5lIF9fU09VTkRfSERBX1BSSVZfSAorCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisKKy8qCisgKiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBJQ0g2X1JFR19HQ0FQCQkJMHgwMAorI2RlZmluZSAgIElDSDZfR0NBUF82NE9LCSgxIDw8IDApICAgLyogNjRiaXQgYWRkcmVzcyBzdXBwb3J0ICovCisjZGVmaW5lICAgSUNINl9HQ0FQX05TRE8JKDMgPDwgMSkgICAvKiAjIG9mIHNlcmlhbCBkYXRhIG91dCBzaWduYWxzICovCisjZGVmaW5lICAgSUNINl9HQ0FQX0JTUwkJKDMxIDw8IDMpICAvKiAjIG9mIGJpZGlyZWN0aW9uYWwgc3RyZWFtcyAqLworI2RlZmluZSAgIElDSDZfR0NBUF9JU1MJCSgxNSA8PCA4KSAgLyogIyBvZiBpbnB1dCBzdHJlYW1zICovCisjZGVmaW5lICAgSUNINl9HQ0FQX09TUwkJKDE1IDw8IDEyKSAvKiAjIG9mIG91dHB1dCBzdHJlYW1zICovCisjZGVmaW5lIElDSDZfUkVHX1ZNSU4JCQkweDAyCisjZGVmaW5lIElDSDZfUkVHX1ZNQUoJCQkweDAzCisjZGVmaW5lIElDSDZfUkVHX09VVFBBWQkJCTB4MDQKKyNkZWZpbmUgSUNINl9SRUdfSU5QQVkJCQkweDA2CisjZGVmaW5lIElDSDZfUkVHX0dDVEwJCQkweDA4CisjZGVmaW5lICAgSUNINl9HQ1RMX1JFU0VUCSgxIDw8IDApICAgLyogY29udHJvbGxlciByZXNldCAqLworI2RlZmluZSAgIElDSDZfR0NUTF9GQ05UUkwJKDEgPDwgMSkgICAvKiBmbHVzaCBjb250cm9sICovCisjZGVmaW5lICAgSUNINl9HQ1RMX1VOU09MCSgxIDw8IDgpICAgLyogYWNjZXB0IHVuc29sLiByZXNwb25zZSBlbmFibGUgKi8KKyNkZWZpbmUgSUNINl9SRUdfV0FLRUVOCQkJMHgwYworI2RlZmluZSBJQ0g2X1JFR19TVEFURVNUUwkJMHgwZQorI2RlZmluZSBJQ0g2X1JFR19HU1RTCQkJMHgxMAorI2RlZmluZSAgIElDSDZfR1NUU19GU1RTCSgxIDw8IDEpICAgLyogZmx1c2ggc3RhdHVzICovCisjZGVmaW5lIElDSDZfUkVHX0lOVENUTAkJCTB4MjAKKyNkZWZpbmUgSUNINl9SRUdfSU5UU1RTCQkJMHgyNAorI2RlZmluZSBJQ0g2X1JFR19XQUxMQ0xLCQkweDMwCS8qIDI0TWh6IHNvdXJjZSAqLworI2RlZmluZSBJQ0g2X1JFR19PTERfU1NZTkMJCTB4MzQJLyogU1NZTkMgZm9yIG9sZCBJQ0ggKi8KKyNkZWZpbmUgSUNINl9SRUdfU1NZTkMJCQkweDM4CisjZGVmaW5lIElDSDZfUkVHX0NPUkJMQkFTRQkJMHg0MAorI2RlZmluZSBJQ0g2X1JFR19DT1JCVUJBU0UJCTB4NDQKKyNkZWZpbmUgSUNINl9SRUdfQ09SQldQCQkJMHg0OAorI2RlZmluZSBJQ0g2X1JFR19DT1JCUlAJCQkweDRhCisjZGVmaW5lICAgSUNINl9DT1JCUlBfUlNUCSgxIDw8IDE1KSAgLyogcmVhZCBwb2ludGVyIHJlc2V0ICovCisjZGVmaW5lIElDSDZfUkVHX0NPUkJDVEwJCTB4NGMKKyNkZWZpbmUgICBJQ0g2X0NPUkJDVExfUlVOCSgxIDw8IDEpICAgLyogZW5hYmxlIERNQSAqLworI2RlZmluZSAgIElDSDZfQ09SQkNUTF9DTUVJRQkoMSA8PCAwKSAgIC8qIGVuYWJsZSBtZW1vcnkgZXJyb3IgaXJxICovCisjZGVmaW5lIElDSDZfUkVHX0NPUkJTVFMJCTB4NGQKKyNkZWZpbmUgICBJQ0g2X0NPUkJTVFNfQ01FSQkoMSA8PCAwKSAgIC8qIG1lbW9yeSBlcnJvciBpbmRpY2F0aW9uICovCisjZGVmaW5lIElDSDZfUkVHX0NPUkJTSVpFCQkweDRlCisKKyNkZWZpbmUgSUNINl9SRUdfUklSQkxCQVNFCQkweDUwCisjZGVmaW5lIElDSDZfUkVHX1JJUkJVQkFTRQkJMHg1NAorI2RlZmluZSBJQ0g2X1JFR19SSVJCV1AJCQkweDU4CisjZGVmaW5lICAgSUNINl9SSVJCV1BfUlNUCSgxIDw8IDE1KSAgLyogd3JpdGUgcG9pbnRlciByZXNldCAqLworI2RlZmluZSBJQ0g2X1JFR19SSU5UQ05UCQkweDVhCisjZGVmaW5lIElDSDZfUkVHX1JJUkJDVEwJCTB4NWMKKyNkZWZpbmUgICBJQ0g2X1JCQ1RMX0lSUV9FTgkoMSA8PCAwKSAgIC8qIGVuYWJsZSBJUlEgKi8KKyNkZWZpbmUgICBJQ0g2X1JCQ1RMX0RNQV9FTgkoMSA8PCAxKSAgIC8qIGVuYWJsZSBETUEgKi8KKyNkZWZpbmUgICBJQ0g2X1JCQ1RMX09WRVJSVU5fRU4JKDEgPDwgMikgICAvKiBlbmFibGUgb3ZlcnJ1biBpcnEgKi8KKyNkZWZpbmUgSUNINl9SRUdfUklSQlNUUwkJMHg1ZAorI2RlZmluZSAgIElDSDZfUkJTVFNfSVJRCSgxIDw8IDApICAgLyogcmVzcG9uc2UgaXJxICovCisjZGVmaW5lICAgSUNINl9SQlNUU19PVkVSUlVOCSgxIDw8IDIpICAgLyogb3ZlcnJ1biBpcnEgKi8KKyNkZWZpbmUgSUNINl9SRUdfUklSQlNJWkUJCTB4NWUKKworI2RlZmluZSBJQ0g2X1JFR19JQwkJCTB4NjAKKyNkZWZpbmUgSUNINl9SRUdfSVIJCQkweDY0CisjZGVmaW5lIElDSDZfUkVHX0lSUwkJCTB4NjgKKyNkZWZpbmUgICBJQ0g2X0lSU19WQUxJRAkoMTw8MSkKKyNkZWZpbmUgICBJQ0g2X0lSU19CVVNZCQkoMTw8MCkKKworI2RlZmluZSBJQ0g2X1JFR19EUExCQVNFCQkweDcwCisjZGVmaW5lIElDSDZfUkVHX0RQVUJBU0UJCTB4NzQKKyNkZWZpbmUgICBJQ0g2X0RQTEJBU0VfRU5BQkxFCTB4MQkvKiBFbmFibGUgcG9zaXRpb24gYnVmZmVyICovCisKKy8qIFNEIG9mZnNldDogU0RJMD0weDgwLCBTREkxPTB4YTAsIC4uLiBTRE8zPTB4MTYwICovCitlbnVtIHsgU0RJMCwgU0RJMSwgU0RJMiwgU0RJMywgU0RPMCwgU0RPMSwgU0RPMiwgU0RPMyB9OworCisvKiBzdHJlYW0gcmVnaXN0ZXIgb2Zmc2V0cyBmcm9tIHN0cmVhbSBiYXNlICovCisjZGVmaW5lIElDSDZfUkVHX1NEX0NUTAkJCTB4MDAKKyNkZWZpbmUgSUNINl9SRUdfU0RfU1RTCQkJMHgwMworI2RlZmluZSBJQ0g2X1JFR19TRF9MUElCCQkweDA0CisjZGVmaW5lIElDSDZfUkVHX1NEX0NCTAkJCTB4MDgKKyNkZWZpbmUgSUNINl9SRUdfU0RfTFZJCQkJMHgwYworI2RlZmluZSBJQ0g2X1JFR19TRF9GSUZPVwkJMHgwZQorI2RlZmluZSBJQ0g2X1JFR19TRF9GSUZPU0laRQkJMHgxMAorI2RlZmluZSBJQ0g2X1JFR19TRF9GT1JNQVQJCTB4MTIKKyNkZWZpbmUgSUNINl9SRUdfU0RfQkRMUEwJCTB4MTgKKyNkZWZpbmUgSUNINl9SRUdfU0RfQkRMUFUJCTB4MWMKKworLyogUENJIHNwYWNlICovCisjZGVmaW5lIElDSDZfUENJUkVHX1RDU0VMCTB4NDQKKworLyoKKyAqIG90aGVyIGNvbnN0YW50cworICovCisKKy8qIG1heCBudW1iZXIgb2YgU0RzICovCisvKiBJQ0gsIEFUSSBhbmQgVklBIGhhdmUgNCBwbGF5YmFjayBhbmQgNCBjYXB0dXJlICovCisjZGVmaW5lIElDSDZfTlVNX0NBUFRVUkUJNAorI2RlZmluZSBJQ0g2X05VTV9QTEFZQkFDSwk0CisKKy8qIFVMSSBoYXMgNiBwbGF5YmFjayBhbmQgNSBjYXB0dXJlICovCisjZGVmaW5lIFVMSV9OVU1fQ0FQVFVSRQkJNQorI2RlZmluZSBVTElfTlVNX1BMQVlCQUNLCTYKKworLyogQVRJIEhETUkgbWF5IGhhdmUgdXAgdG8gOCBwbGF5YmFja3MgYW5kIDAgY2FwdHVyZSAqLworI2RlZmluZSBBVElIRE1JX05VTV9DQVBUVVJFCTAKKyNkZWZpbmUgQVRJSERNSV9OVU1fUExBWUJBQ0sJOAorCisvKiBURVJBIGhhcyA0IHBsYXliYWNrIGFuZCAzIGNhcHR1cmUgKi8KKyNkZWZpbmUgVEVSQV9OVU1fQ0FQVFVSRQkzCisjZGVmaW5lIFRFUkFfTlVNX1BMQVlCQUNLCTQKKworLyogdGhpcyBudW1iZXIgaXMgc3RhdGljYWxseSBkZWZpbmVkIGZvciBzaW1wbGljaXR5ICovCisjZGVmaW5lIE1BWF9BWlhfREVWCQkxNgorCisvKiBtYXggbnVtYmVyIG9mIGZyYWdtZW50cyAtIHdlIG1heSB1c2UgbW9yZSBpZiBhbGxvY2F0aW5nIG1vcmUgcGFnZXMgZm9yIEJETCAqLworI2RlZmluZSBCRExfU0laRQkJNDA5NgorI2RlZmluZSBBWlhfTUFYX0JETF9FTlRSSUVTCShCRExfU0laRSAvIDE2KQorI2RlZmluZSBBWlhfTUFYX0ZSQUcJCTMyCisvKiBtYXggYnVmZmVyIHNpemUgLSBubyBoL3cgbGltaXQsIHlvdSBjYW4gaW5jcmVhc2UgYXMgeW91IGxpa2UgKi8KKyNkZWZpbmUgQVpYX01BWF9CVUZfU0laRQkoMTAyNCoxMDI0KjEwMjQpCisKKy8qIFJJUkIgaW50IG1hc2s6IG92ZXJydW5bMl0sIHJlc3BvbnNlWzBdICovCisjZGVmaW5lIFJJUkJfSU5UX1JFU1BPTlNFCTB4MDEKKyNkZWZpbmUgUklSQl9JTlRfT1ZFUlJVTgkweDA0CisjZGVmaW5lIFJJUkJfSU5UX01BU0sJCTB4MDUKKworLyogU1RBVEVTVFMgaW50IG1hc2s6IFMzLFNEMixTRDEsU0QwICovCisjZGVmaW5lIEFaWF9NQVhfQ09ERUNTCQk4CisjZGVmaW5lIEFaWF9ERUZBVUxUX0NPREVDUwk0CisjZGVmaW5lIFNUQVRFU1RTX0lOVF9NQVNLCSgoMSA8PCBBWlhfTUFYX0NPREVDUykgLSAxKQorCisvKiBTRF9DVEwgYml0cyAqLworI2RlZmluZSBTRF9DVExfU1RSRUFNX1JFU0VUCTB4MDEJLyogc3RyZWFtIHJlc2V0IGJpdCAqLworI2RlZmluZSBTRF9DVExfRE1BX1NUQVJUCTB4MDIJLyogc3RyZWFtIERNQSBzdGFydCBiaXQgKi8KKyNkZWZpbmUgU0RfQ1RMX1NUUklQRQkJKDMgPDwgMTYpCS8qIHN0cmlwZSBjb250cm9sICovCisjZGVmaW5lIFNEX0NUTF9UUkFGRklDX1BSSU8JKDEgPDwgMTgpCS8qIHRyYWZmaWMgcHJpb3JpdHkgKi8KKyNkZWZpbmUgU0RfQ1RMX0RJUgkJKDEgPDwgMTkpCS8qIGJpLWRpcmVjdGlvbmFsIHN0cmVhbSAqLworI2RlZmluZSBTRF9DVExfU1RSRUFNX1RBR19NQVNLCSgweGYgPDwgMjApCisjZGVmaW5lIFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUCTIwCisKKy8qIFNEX0NUTCBhbmQgU0RfU1RTICovCisjZGVmaW5lIFNEX0lOVF9ERVNDX0VSUgkJMHgxMAkvKiBkZXNjcmlwdG9yIGVycm9yIGludGVycnVwdCAqLworI2RlZmluZSBTRF9JTlRfRklGT19FUlIJCTB4MDgJLyogRklGTyBlcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0RfSU5UX0NPTVBMRVRFCQkweDA0CS8qIGNvbXBsZXRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lIFNEX0lOVF9NQVNLCQkoU0RfSU5UX0RFU0NfRVJSfFNEX0lOVF9GSUZPX0VSUnxcCisJCQkJIFNEX0lOVF9DT01QTEVURSkKKworLyogU0RfU1RTICovCisjZGVmaW5lIFNEX1NUU19GSUZPX1JFQURZCTB4MjAJLyogRklGTyByZWFkeSAqLworCisvKiBJTlRDVEwgYW5kIElOVFNUUyAqLworI2RlZmluZSBJQ0g2X0lOVF9BTExfU1RSRUFNCTB4ZmYJICAgLyogYWxsIHN0cmVhbSBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElDSDZfSU5UX0NUUkxfRU4JMHg0MDAwMDAwMCAvKiBjb250cm9sbGVyIGludGVycnVwdCBlbmFibGUgYml0ICovCisjZGVmaW5lIElDSDZfSU5UX0dMT0JBTF9FTgkweDgwMDAwMDAwIC8qIGdsb2JhbCBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworCisvKiBiZWxvdyBhcmUgc28gZmFyIGhhcmRjb2RlZCAtIHNob3VsZCByZWFkIHJlZ2lzdGVycyBpbiBmdXR1cmUgKi8KKyNkZWZpbmUgSUNINl9NQVhfQ09SQl9FTlRSSUVTCTI1NgorI2RlZmluZSBJQ0g2X01BWF9SSVJCX0VOVFJJRVMJMjU2CisKKy8qIGRyaXZlciBxdWlya3MgKGNhcGFiaWxpdGllcykgKi8KKy8qIGJpdHMgMC03IGFyZSB1c2VkIGZvciBpbmRpY2F0aW5nIGRyaXZlciB0eXBlICovCisjZGVmaW5lIEFaWF9EQ0FQU19OT19UQ1NFTAkoMSA8PCA4KQkvKiBObyBJbnRlbCBUQ1NFTCBiaXQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX05PX01TSQkoMSA8PCA5KQkvKiBObyBNU0kgc3VwcG9ydCAqLworI2RlZmluZSBBWlhfRENBUFNfQVRJX1NOT09QCSgxIDw8IDEwKQkvKiBBVEkgc25vb3AgZW5hYmxlICovCisjZGVmaW5lIEFaWF9EQ0FQU19OVklESUFfU05PT1AJKDEgPDwgMTEpCS8qIE52aWRpYSBzbm9vcCBlbmFibGUgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1NDSF9TTk9PUAkoMSA8PCAxMikJLyogU0NIL1BDSCBzbm9vcCBlbmFibGUgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1JJUkJfREVMQVkJKDEgPDwgMTMpCS8qIExvbmcgZGVsYXkgaW4gcmVhZCBsb29wICovCisjZGVmaW5lIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSAoMSA8PCAxNCkJLyogUHV0IGEgZGVsYXkgYmVmb3JlIHJlYWQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX0NUWF9XT1JLQVJPVU5EICgxIDw8IDE1KQkvKiBYLUZpIHdvcmthcm91bmQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1BPU0ZJWF9MUElCCSgxIDw8IDE2KQkvKiBVc2UgTFBJQiBhcyBkZWZhdWx0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19QT1NGSVhfVklBCSgxIDw8IDE3KQkvKiBVc2UgVklBQ09NQk8gYXMgZGVmYXVsdCAqLworI2RlZmluZSBBWlhfRENBUFNfTk9fNjRCSVQJKDEgPDwgMTgpCS8qIE5vIDY0Yml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1NZTkNfV1JJVEUJKDEgPDwgMTkpCS8qIHN5bmMgZWFjaCBjbWQgd3JpdGUgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX09MRF9TU1lOQwkoMSA8PCAyMCkJLyogT2xkIFNTWU5DIHJlZyBmb3IgSUNIICovCisjZGVmaW5lIEFaWF9EQ0FQU19CVUZTSVpFCSgxIDw8IDIxKQkvKiBubyBidWZmZXIgc2l6ZSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX0FMSUdOX0JVRlNJWkUJKDEgPDwgMjIpCS8qIGJ1ZmZlciBzaXplIGFsaWdubWVudCAqLworI2RlZmluZSBBWlhfRENBUFNfNEtfQkRMRV9CT1VOREFSWSAoMSA8PCAyMykJLyogQkRMRSBpbiA0ayBib3VuZGFyeSAqLworI2RlZmluZSBBWlhfRENBUFNfQ09VTlRfTFBJQl9ERUxBWSAgKDEgPDwgMjUpCS8qIFRha2UgTFBJQiBhcyBkZWxheSAqLworI2RlZmluZSBBWlhfRENBUFNfUE1fUlVOVElNRQkoMSA8PCAyNikJLyogcnVudGltZSBQTSBzdXBwb3J0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19JOTE1X1BPV0VSV0VMTCAoMSA8PCAyNykJLyogSFNXIGk5MTUgcG93ZXJ3ZWxsIHN1cHBvcnQgKi8KKworLyogcG9zaXRpb24gZml4IG1vZGUgKi8KK2VudW0geworCVBPU19GSVhfQVVUTywKKwlQT1NfRklYX0xQSUIsCisJUE9TX0ZJWF9QT1NCVUYsCisJUE9TX0ZJWF9WSUFDT01CTywKKwlQT1NfRklYX0NPTUJPLAorfTsKKworLyogRGVmaW5lcyBmb3IgQVRJIEhEIEF1ZGlvIHN1cHBvcnQgaW4gU0I0NTAgc291dGggYnJpZGdlICovCisjZGVmaW5lIEFUSV9TQjQ1MF9IREFVRElPX01JU0NfQ05UUjJfQUREUiAgIDB4NDIKKyNkZWZpbmUgQVRJX1NCNDUwX0hEQVVESU9fRU5BQkxFX1NOT09QICAgICAgMHgwMgorCisvKiBEZWZpbmVzIGZvciBOdmlkaWEgSERBIHN1cHBvcnQgKi8KKyNkZWZpbmUgTlZJRElBX0hEQV9UUkFOU1JFR19BRERSICAgICAgMHg0ZQorI2RlZmluZSBOVklESUFfSERBX0VOQUJMRV9DT0hCSVRTICAgICAweDBmCisjZGVmaW5lIE5WSURJQV9IREFfSVNUUk1fQ09IICAgICAgICAgIDB4NGQKKyNkZWZpbmUgTlZJRElBX0hEQV9PU1RSTV9DT0ggICAgICAgICAgMHg0YworI2RlZmluZSBOVklESUFfSERBX0VOQUJMRV9DT0hCSVQgICAgICAweDAxCisKKy8qIERlZmluZXMgZm9yIEludGVsIFNDSCBIREEgc25vb3AgY29udHJvbCAqLworI2RlZmluZSBJTlRFTF9TQ0hfSERBX0RFVkMgICAgICAweDc4CisjZGVmaW5lIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QICAgICAgICgweDE8PDExKQorCisvKiBEZWZpbmUgSU4gc3RyZWFtIDAgRklGTyBzaXplIG9mZnNldCBpbiBWSUEgY29udHJvbGxlciAqLworI2RlZmluZSBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUCTB4OTAKKy8qIERlZmluZSBWSUEgSEQgQXVkaW8gRGV2aWNlIElEKi8KKyNkZWZpbmUgVklBX0hEQUNfREVWSUNFX0lECQkweDMyODgKKworLyogSEQgQXVkaW8gY2xhc3MgY29kZSAqLworI2RlZmluZSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9IRF9BVURJTwkweDA0MDMKKworc3RydWN0IGF6eF9kZXYgeworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBiZGw7IC8qIEJETCBidWZmZXIgKi8KKwl1MzIgKnBvc2J1ZjsJCS8qIHBvc2l0aW9uIGJ1ZmZlciBwb2ludGVyICovCisKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsJLyogc2l6ZSBvZiB0aGUgcGxheSBidWZmZXIgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzOyAvKiBzaXplIG9mIHRoZSBwZXJpb2QgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgZnJhZ3M7CS8qIG51bWJlciBmb3IgcGVyaW9kIGluIHRoZSBwbGF5IGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBmaWZvX3NpemU7CS8qIEZJRk8gc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgc3RhcnRfd2FsbGNsazsJLyogc3RhcnQgKyBtaW5pbXVtIHdhbGxjbGsgKi8KKwl1bnNpZ25lZCBsb25nIHBlcmlvZF93YWxsY2xrOwkvKiB3YWxsY2xrIGZvciBwZXJpb2QgKi8KKworCXZvaWQgX19pb21lbSAqc2RfYWRkcjsJLyogc3RyZWFtIGRlc2NyaXB0b3IgcG9pbnRlciAqLworCisJdTMyIHNkX2ludF9zdGFfbWFzazsJLyogc3RyZWFtIGludCBzdGF0dXMgbWFzayAqLworCisJLyogcGNtIHN1cHBvcnQgKi8KKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsJLyogYXNzaWduZWQgc3Vic3RyZWFtLAorCQkJCQkJICogc2V0IGluIFBDTSBvcGVuCisJCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgZm9ybWF0X3ZhbDsJLyogZm9ybWF0IHZhbHVlIHRvIGJlIHNldCBpbiB0aGUKKwkJCQkJICogY29udHJvbGxlciBhbmQgdGhlIGNvZGVjCisJCQkJCSAqLworCXVuc2lnbmVkIGNoYXIgc3RyZWFtX3RhZzsJLyogYXNzaWduZWQgc3RyZWFtICovCisJdW5zaWduZWQgY2hhciBpbmRleDsJCS8qIHN0cmVhbSBpbmRleCAqLworCWludCBhc3NpZ25lZF9rZXk7CQkvKiBsYXN0IGRldmljZSMga2V5IGFzc2lnbmVkIHRvICovCisKKwl1bnNpZ25lZCBpbnQgb3BlbmVkOjE7CisJdW5zaWduZWQgaW50IHJ1bm5pbmc6MTsKKwl1bnNpZ25lZCBpbnQgaXJxX3BlbmRpbmc6MTsKKwl1bnNpZ25lZCBpbnQgcHJlcGFyZWQ6MTsKKwl1bnNpZ25lZCBpbnQgbG9ja2VkOjE7CisJLyoKKwkgKiBGb3IgVklBOgorCSAqICBBIGZsYWcgdG8gZW5zdXJlIERNQSBwb3NpdGlvbiBpcyAwCisJICogIHdoZW4gbGluayBwb3NpdGlvbiBpcyBub3QgZ3JlYXRlciB0aGFuIEZJRk8gc2l6ZQorCSAqLworCXVuc2lnbmVkIGludCBpbnN1ZmZpY2llbnQ6MTsKKwl1bnNpZ25lZCBpbnQgd2NfbWFya2VkOjE7CisJdW5zaWduZWQgaW50IG5vX3BlcmlvZF93YWtldXA6MTsKKworCXN0cnVjdCB0aW1lY291bnRlciAgYXp4X3RjOworCXN0cnVjdCBjeWNsZWNvdW50ZXIgYXp4X2NjOworCisJaW50IGRlbGF5X25lZ2F0aXZlX3RocmVzaG9sZDsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKKwkvKiBBbGxvd3MgZHNwIGxvYWQgdG8gaGF2ZSBzb2xlIGFjY2VzcyB0byB0aGUgcGxheWJhY2sgc3RyZWFtLiAqLworCXN0cnVjdCBtdXRleCBkc3BfbXV0ZXg7CisjZW5kaWYKK307CisKKy8qIENPUkIvUklSQiAqLworc3RydWN0IGF6eF9yYiB7CisJdTMyICpidWY7CQkvKiBDT1JCL1JJUkIgYnVmZmVyCisJCQkJICogRWFjaCBDT1JCIGVudHJ5IGlzIDRieXRlLCBSSVJCIGlzIDhieXRlCisJCQkJICovCisJZG1hX2FkZHJfdCBhZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIENPUkIvUklSQiBidWZmZXIgKi8KKwkvKiBmb3IgUklSQiAqLworCXVuc2lnbmVkIHNob3J0IHJwLCB3cDsJLyogcmVhZC93cml0ZSBwb2ludGVycyAqLworCWludCBjbWRzW0FaWF9NQVhfQ09ERUNTXTsJLyogbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwl1MzIgcmVzW0FaWF9NQVhfQ09ERUNTXTsJLyogbGFzdCByZWFkIHZhbHVlICovCit9OworCitzdHJ1Y3QgYXp4OworCisvKiBGdW5jdGlvbnMgdG8gcmVhZC93cml0ZSB0byBoZGEgcmVnaXN0ZXJzLiAqLworc3RydWN0IGhkYV9jb250cm9sbGVyX29wcyB7CisJLyogUmVnaXN0ZXIgQWNjZXNzICovCisJdm9pZCAoKnJlZ193cml0ZWwpKHUzMiB2YWx1ZSwgdTMyIF9faW9tZW0gKmFkZHIpOworCXUzMiAoKnJlZ19yZWFkbCkodTMyIF9faW9tZW0gKmFkZHIpOworCXZvaWQgKCpyZWdfd3JpdGV3KSh1MTYgdmFsdWUsIHUxNiBfX2lvbWVtICphZGRyKTsKKwl1MTYgKCpyZWdfcmVhZHcpKHUxNiBfX2lvbWVtICphZGRyKTsKKwl2b2lkICgqcmVnX3dyaXRlYikodTggdmFsdWUsIHU4IF9faW9tZW0gKmFkZHIpOworCXU4ICgqcmVnX3JlYWRiKSh1OCBfX2lvbWVtICphZGRyKTsKKwkvKiBEaXNhYmxlIG1zaSBpZiBzdXBwb3J0ZWQsIFBDSSBvbmx5ICovCisJaW50ICgqZGlzYWJsZV9tc2lfcmVzZXRfaXJxKShzdHJ1Y3QgYXp4ICopOworCS8qIEFsbG9jYXRpb24gb3BzICovCisJaW50ICgqZG1hX2FsbG9jX3BhZ2VzKShzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJICAgICAgIGludCB0eXBlLAorCQkJICAgICAgIHNpemVfdCBzaXplLAorCQkJICAgICAgIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmKTsKKwl2b2lkICgqZG1hX2ZyZWVfcGFnZXMpKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmKTsKKwlpbnQgKCpzdWJzdHJlYW1fYWxsb2NfcGFnZXMpKHN0cnVjdCBhenggKmNoaXAsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgICAgIHNpemVfdCBzaXplKTsKKwlpbnQgKCpzdWJzdHJlYW1fZnJlZV9wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOworCXZvaWQgKCpwY21fbW1hcF9wcmVwYXJlKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKTsKKwkvKiBDaGVjayBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGFjY2VwdGFibGUgKi8KKwlpbnQgKCpwb3NpdGlvbl9jaGVjaykoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpOworfTsKKworc3RydWN0IGF6eF9wY20geworCXN0cnVjdCBhenggKmNoaXA7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvWzJdOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBhenggeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCWludCBkZXZfaW5kZXg7CisKKwkvKiBjaGlwIHR5cGUgc3BlY2lmaWMgKi8KKwlpbnQgZHJpdmVyX3R5cGU7CisJdW5zaWduZWQgaW50IGRyaXZlcl9jYXBzOworCWludCBwbGF5YmFja19zdHJlYW1zOworCWludCBwbGF5YmFja19pbmRleF9vZmZzZXQ7CisJaW50IGNhcHR1cmVfc3RyZWFtczsKKwlpbnQgY2FwdHVyZV9pbmRleF9vZmZzZXQ7CisJaW50IG51bV9zdHJlYW1zOworCWNvbnN0IGludCAqamFja3BvbGxfbXM7IC8qIHBlci1jYXJkIGphY2sgcG9sbCBpbnRlcnZhbCAqLworCisJLyogUmVnaXN0ZXIgaW50ZXJhY3Rpb24uICovCisJY29uc3Qgc3RydWN0IGhkYV9jb250cm9sbGVyX29wcyAqb3BzOworCisJLyogcGNpIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl2b2lkIF9faW9tZW0gKnJlbWFwX2FkZHI7CisJaW50IGlycTsKKworCS8qIGxvY2tzICovCisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsgLyogUHJldmVudHMgY29uY3VycmVudCBvcGVuL2Nsb3NlIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBwcm9iZV93YWl0OworCisJLyogc3RyZWFtcyAoeCBudW1fc3RyZWFtcykgKi8KKwlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKKworCS8qIFBDTSAqLworCXN0cnVjdCBsaXN0X2hlYWQgcGNtX2xpc3Q7IC8qIGF6eF9wY20gbGlzdCAqLworCisJLyogSEQgY29kZWMgKi8KKwl1bnNpZ25lZCBzaG9ydCBjb2RlY19tYXNrOworCWludCAgY29kZWNfcHJvYmVfbWFzazsgLyogY29waWVkIGZyb20gcHJvYmVfbWFzayBvcHRpb24gKi8KKwlzdHJ1Y3QgaGRhX2J1cyAqYnVzOworCXVuc2lnbmVkIGludCBiZWVwX21vZGU7CisKKwkvKiBDT1JCL1JJUkIgKi8KKwlzdHJ1Y3QgYXp4X3JiIGNvcmI7CisJc3RydWN0IGF6eF9yYiByaXJiOworCisJLyogQ09SQi9SSVJCIGFuZCBwb3NpdGlvbiBidWZmZXJzICovCisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIHJiOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBwb3NidWY7CisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworI2VuZGlmCisKKwkvKiBmbGFncyAqLworCWludCBwb3NpdGlvbl9maXhbMl07IC8qIGZvciBib3RoIHBsYXliYWNrL2NhcHR1cmUgc3RyZWFtcyAqLworCWNvbnN0IGludCAqYmRsX3Bvc19hZGo7CisJaW50IHBvbGxfY291bnQ7CisJdW5zaWduZWQgaW50IHJ1bm5pbmc6MTsKKwl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQ6MTsKKwl1bnNpZ25lZCBpbnQgc2luZ2xlX2NtZDoxOworCXVuc2lnbmVkIGludCBwb2xsaW5nX21vZGU6MTsKKwl1bnNpZ25lZCBpbnQgbXNpOjE7CisJdW5zaWduZWQgaW50IGlycV9wZW5kaW5nX3dhcm5lZDoxOworCXVuc2lnbmVkIGludCBwcm9iaW5nOjE7IC8qIGNvZGVjIHByb2JpbmcgcGhhc2UgKi8KKwl1bnNpZ25lZCBpbnQgc25vb3A6MTsKKwl1bnNpZ25lZCBpbnQgYWxpZ25fYnVmZmVyX3NpemU6MTsKKwl1bnNpZ25lZCBpbnQgcmVnaW9uX3JlcXVlc3RlZDoxOworCisJLyogVkdBLXN3aXRjaGVyb28gc2V0dXAgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX3ZnYV9zd2l0Y2hlcm9vOjE7CisJdW5zaWduZWQgaW50IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyZWQ6MTsKKwl1bnNpZ25lZCBpbnQgaW5pdF9mYWlsZWQ6MTsgLyogZGVsYXllZCBpbml0IGZhaWxlZCAqLworCXVuc2lnbmVkIGludCBkaXNhYmxlZDoxOyAvKiBkaXNhYmxlZCBieSBWR0Etc3dpdGNoZXIgKi8KKworCS8qIGZvciBkZWJ1Z2dpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9jbWRbQVpYX01BWF9DT0RFQ1NdOworCisJLyogZm9yIHBlbmRpbmcgaXJxcyAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfcGVuZGluZ193b3JrOworCisJc3RydWN0IHdvcmtfc3RydWN0IHByb2JlX3dvcms7CisKKwkvKiByZWJvb3Qgbm90aWZpZXIgKGZvciBteXN0ZXJpb3VzIGhhbmd1cCBwcm9ibGVtIGF0IHBvd2VyLWRvd24pICovCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJlYm9vdF9ub3RpZmllcjsKKworCS8qIGNhcmQgbGlzdCAoZm9yIHBvd2VyX3NhdmUgdHJpZ2dlcikgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCisJc3RydWN0IGF6eF9kZXYgc2F2ZWRfYXp4X2RldjsKKyNlbmRpZgorCisJLyogc2Vjb25kYXJ5IHBvd2VyIGRvbWFpbiBmb3IgaGRtaSBhdWRpbyB1bmRlciB2Z2EgZGV2aWNlICovCisJc3RydWN0IGRldl9wbV9kb21haW4gaGRtaV9wbV9kb21haW47Cit9OworCisjaWZkZWYgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USworI2RlZmluZSBTRlgJLyogbm9wICovCisjZWxzZQorI2RlZmluZSBTRlgJImhkYS1pbnRlbCAiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODYKKyNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQkoKGNoaXApLT5zbm9vcCkKKyNlbHNlCisjZGVmaW5lIGF6eF9zbm9vcChjaGlwKQkJdHJ1ZQorI2VuZGlmCisKKy8qCisgKiBtYWNyb3MgZm9yIGVhc3kgdXNlCisgKi8KKworI2RlZmluZSBhenhfd3JpdGVsKGNoaXAsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWwodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3JlYWRsKGNoaXAsIHJlZykgXAorCSgoY2hpcCktPm9wcy0+cmVnX3JlYWRsKChjaGlwKS0+cmVtYXBfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3dyaXRldyhjaGlwLCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGV3KHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9yZWFkdyhjaGlwLCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkdygoY2hpcCktPnJlbWFwX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF93cml0ZWIoY2hpcCwgcmVnLCB2YWx1ZSkgXAorCSgoY2hpcCktPm9wcy0+cmVnX3dyaXRlYih2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfcmVhZGIoY2hpcCwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZGIoKGNoaXApLT5yZW1hcF9hZGRyICsgSUNINl9SRUdfIyNyZWcpKQorCisjZGVmaW5lIGF6eF9zZF93cml0ZWwoY2hpcCwgZGV2LCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGVsKHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3JlYWRsKGNoaXAsIGRldiwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZGwoKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9zZF93cml0ZXcoY2hpcCwgZGV2LCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGV3KHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3JlYWR3KGNoaXAsIGRldiwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZHcoKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9zZF93cml0ZWIoY2hpcCwgZGV2LCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGViKHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIElDSDZfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3JlYWRiKGNoaXAsIGRldiwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZGIoKGRldiktPnNkX2FkZHIgKyBJQ0g2X1JFR18jI3JlZykpCisKKyNlbmRpZiAvKiBfX1NPVU5EX0hEQV9QUklWX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3N5c2ZzLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDc5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9zeXNmcy5jCkBAIC0wLDAgKzEsNzgwIEBACisvKgorICogc3lzZnMgaW50ZXJmYWNlIGZvciBIRC1hdWRpbyBjb2RlYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogc3BsaXQgZnJvbSBoZGFfaHdkZXAuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCisjaW5jbHVkZSA8c291bmQvaGRhX2h3ZGVwLmg+CisjaW5jbHVkZSA8c291bmQvbWlub3JzLmg+CisKKy8qIGhpbnQgc3RyaW5nIHBhaXIgKi8KK3N0cnVjdCBoZGFfaGludCB7CisJY29uc3QgY2hhciAqa2V5OworCWNvbnN0IGNoYXIgKnZhbDsJLyogY29udGFpbmVkIGluIHRoZSBzYW1lIGFsbG9jIGFzIGtleSAqLworfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHNzaXplX3QgcG93ZXJfb25fYWNjdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChjb2RlYyk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGppZmZpZXNfdG9fbXNlY3MoY29kZWMtPnBvd2VyX29uX2FjY3QpKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXJfb2ZmX2FjY3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChjb2RlYyk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGppZmZpZXNfdG9fbXNlY3MoY29kZWMtPnBvd2VyX29mZl9hY2N0KSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcl9vbl9hY2N0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcl9vZmZfYWNjdCk7CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKyNkZWZpbmUgQ09ERUNfSU5GT19TSE9XKHR5cGUpCQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCSAgIGNoYXIgKmJ1ZikJCQkJXAorewkJCQkJCQkJXAorCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgY29kZWMtPnR5cGUpOwkJXAorfQorCisjZGVmaW5lIENPREVDX0lORk9fU1RSX1NIT1codHlwZSkJCQkJXAorc3RhdGljIHNzaXplX3QgdHlwZSMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkJY2hhciAqYnVmKQkJXAorewkJCQkJCQkJXAorCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsCQkJCVwKKwkJICAgICAgIGNvZGVjLT50eXBlID8gY29kZWMtPnR5cGUgOiAiIik7CQlcCit9CisKK0NPREVDX0lORk9fU0hPVyh2ZW5kb3JfaWQpOworQ09ERUNfSU5GT19TSE9XKHN1YnN5c3RlbV9pZCk7CitDT0RFQ19JTkZPX1NIT1cocmV2aXNpb25faWQpOworQ09ERUNfSU5GT19TSE9XKGFmZyk7CitDT0RFQ19JTkZPX1NIT1cobWZnKTsKK0NPREVDX0lORk9fU1RSX1NIT1codmVuZG9yX25hbWUpOworQ09ERUNfSU5GT19TVFJfU0hPVyhjaGlwX25hbWUpOworQ09ERUNfSU5GT19TVFJfU0hPVyhtb2RlbG5hbWUpOworCitzdGF0aWMgc3NpemVfdCBwaW5fY29uZmlnc19zaG93KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCXN0cnVjdCBzbmRfYXJyYXkgKmxpc3QsCisJCQkJY2hhciAqYnVmKQoreworCWludCBpLCBsZW4gPSAwOworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+dXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfcGluY2ZnICpwaW4gPSBzbmRfYXJyYXlfZWxlbShsaXN0LCBpKTsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiMHglMDJ4IDB4JTA4eFxuIiwKKwkJCSAgICAgICBwaW4tPm5pZCwgcGluLT5jZmcpOworCX0KKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBpbml0X3Bpbl9jb25maWdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gcGluX2NvbmZpZ3Nfc2hvdyhjb2RlYywgJmNvZGVjLT5pbml0X3BpbnMsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRyaXZlcl9waW5fY29uZmlnc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBwaW5fY29uZmlnc19zaG93KGNvZGVjLCAmY29kZWMtPmRyaXZlcl9waW5zLCBidWYpOworfQorCisjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKKworLyoKKyAqIHN5c2ZzIGludGVyZmFjZQorICovCisKK3N0YXRpYyBpbnQgY2xlYXJfY29kZWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9oZGFfY29kZWNfcmVzZXQoY29kZWMpOworCWlmIChlcnIgPCAwKSB7CisJCWNvZGVjX2Vycihjb2RlYywgIlRoZSBjb2RlYyBpcyBiZWluZyB1c2VkLCBjYW4ndCBmcmVlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCXNuZF9oZGFfc3lzZnNfY2xlYXIoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlY29uZmlnX2NvZGVjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWludCBlcnI7CisKKwlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKKwljb2RlY19pbmZvKGNvZGVjLCAiaGRhLWNvZGVjOiByZWNvbmZpZ3VyaW5nXG4iKTsKKwllcnIgPSBzbmRfaGRhX2NvZGVjX3Jlc2V0KGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkgeworCQljb2RlY19lcnIoY29kZWMsCisJCQkgICAiVGhlIGNvZGVjIGlzIGJlaW5nIHVzZWQsIGNhbid0IHJlY29uZmlndXJlLlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWVyciA9IHNuZF9oZGFfY29kZWNfY29uZmlndXJlKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiByZWJ1aWxkIFBDTXMgKi8KKwllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX3BjbXMoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIHJlYnVpbGQgbWl4ZXJzICovCisJZXJyID0gc25kX2hkYV9jb2RlY19idWlsZF9jb250cm9scyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY29kZWMtPmJ1cy0+Y2FyZCk7CisgZXJyb3I6CisJc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYWxsb2NhdGUgYSBzdHJpbmcgYXQgbW9zdCBsZW4gY2hhcnMsIGFuZCByZW1vdmUgdGhlIHRyYWlsaW5nIEVPTAorICovCitzdGF0aWMgY2hhciAqa3N0cm5kdXBfbm9lb2woY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbGVuKQoreworCWNoYXIgKnMgPSBrc3RybmR1cChzcmMsIGxlbiwgR0ZQX0tFUk5FTCk7CisJY2hhciAqcDsKKwlpZiAoIXMpCisJCXJldHVybiBOVUxMOworCXAgPSBzdHJjaHIocywgJ1xuJyk7CisJaWYgKHApCisJCSpwID0gMDsKKwlyZXR1cm4gczsKK30KKworI2RlZmluZSBDT0RFQ19JTkZPX1NUT1JFKHR5cGUpCQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwl1bnNpZ25lZCBsb25nIHZhbDsJCQkJCVwKKwlpbnQgZXJyID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsJCQlcCisJaWYgKGVyciA8IDApCQkJCQkJXAorCQlyZXR1cm4gZXJyOwkJCQkJXAorCWNvZGVjLT50eXBlID0gdmFsOwkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQlcCit9CisKKyNkZWZpbmUgQ09ERUNfSU5GT19TVFJfU1RPUkUodHlwZSkJCQkJXAorc3RhdGljIHNzaXplX3QgdHlwZSMjX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJXAorCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCisJY2hhciAqcyA9IGtzdHJuZHVwX25vZW9sKGJ1ZiwgNjQpOwkJCVwKKwlpZiAoIXMpCQkJCQkJCVwKKwkJcmV0dXJuIC1FTk9NRU07CQkJCQlcCisJa2ZyZWUoY29kZWMtPnR5cGUpOwkJCQkJXAorCWNvZGVjLT50eXBlID0gczsJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJXAorfQorCitDT0RFQ19JTkZPX1NUT1JFKHZlbmRvcl9pZCk7CitDT0RFQ19JTkZPX1NUT1JFKHN1YnN5c3RlbV9pZCk7CitDT0RFQ19JTkZPX1NUT1JFKHJldmlzaW9uX2lkKTsKK0NPREVDX0lORk9fU1RSX1NUT1JFKHZlbmRvcl9uYW1lKTsKK0NPREVDX0lORk9fU1RSX1NUT1JFKGNoaXBfbmFtZSk7CitDT0RFQ19JTkZPX1NUUl9TVE9SRShtb2RlbG5hbWUpOworCisjZGVmaW5lIENPREVDX0FDVElPTl9TVE9SRSh0eXBlKQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwlpbnQgZXJyID0gMDsJCQkJCQlcCisJaWYgKCpidWYpCQkJCQkJXAorCQllcnIgPSB0eXBlIyNfY29kZWMoY29kZWMpOwkJCVwKKwlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IGNvdW50OwkJCQlcCit9CisKK0NPREVDX0FDVElPTl9TVE9SRShyZWNvbmZpZyk7CitDT0RFQ19BQ1RJT05fU1RPUkUoY2xlYXIpOworCitzdGF0aWMgc3NpemVfdCBpbml0X3ZlcmJzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpLCBsZW4gPSAwOworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmluaXRfdmVyYnMudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfdmVyYiAqdiA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+aW5pdF92ZXJicywgaSk7CisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbiwKKwkJCQkiMHglMDJ4IDB4JTAzeCAweCUwNHhcbiIsCisJCQkJdi0+bmlkLCB2LT52ZXJiLCB2LT5wYXJhbSk7CisJfQorCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaW5pdF92ZXJicyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfdmVyYiAqdjsKKwlpbnQgbmlkLCB2ZXJiLCBwYXJhbTsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkgJWkgJWkiLCAmbmlkLCAmdmVyYiwgJnBhcmFtKSAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW5pZCB8fCAhdmVyYikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXYgPSBzbmRfYXJyYXlfbmV3KCZjb2RlYy0+aW5pdF92ZXJicyk7CisJaWYgKCF2KSB7CisJCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdi0+bmlkID0gbmlkOworCXYtPnZlcmIgPSB2ZXJiOworCXYtPnBhcmFtID0gcGFyYW07CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGluaXRfdmVyYnNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVyciA9IHBhcnNlX2luaXRfdmVyYnMoY29kZWMsIGJ1Zik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBoaW50c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpLCBsZW4gPSAwOworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgeworCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLAorCQkJCSIlcyA9ICVzXG4iLCBoaW50LT5rZXksIGhpbnQtPnZhbCk7CisJfQorCW11dGV4X3VubG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2hpbnQgKmdldF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgeworCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKKwkJaWYgKCFzdHJjbXAoaGludC0+a2V5LCBrZXkpKQorCQkJcmV0dXJuIGhpbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfdHJhaWxfc3BhY2VzKGNoYXIgKnN0cikKK3sKKwljaGFyICpwOworCWlmICghKnN0cikKKwkJcmV0dXJuOworCXAgPSBzdHIgKyBzdHJsZW4oc3RyKSAtIDE7CisJZm9yICg7IGlzc3BhY2UoKnApOyBwLS0pIHsKKwkJKnAgPSAwOworCQlpZiAocCA9PSBzdHIpCisJCQlyZXR1cm47CisJfQorfQorCisjZGVmaW5lIE1BWF9ISU5UUwkxMDI0CisKK3N0YXRpYyBpbnQgcGFyc2VfaGludHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwljaGFyICprZXksICp2YWw7CisJc3RydWN0IGhkYV9oaW50ICpoaW50OworCWludCBlcnIgPSAwOworCisJYnVmID0gc2tpcF9zcGFjZXMoYnVmKTsKKwlpZiAoISpidWYgfHwgKmJ1ZiA9PSAnIycgfHwgKmJ1ZiA9PSAnXG4nKQorCQlyZXR1cm4gMDsKKwlpZiAoKmJ1ZiA9PSAnPScpCisJCXJldHVybiAtRUlOVkFMOworCWtleSA9IGtzdHJuZHVwX25vZW9sKGJ1ZiwgMTAyNCk7CisJaWYgKCFrZXkpCisJCXJldHVybiAtRU5PTUVNOworCS8qIGV4dHJhY3Qga2V5IGFuZCB2YWwgKi8KKwl2YWwgPSBzdHJjaHIoa2V5LCAnPScpOworCWlmICghdmFsKSB7CisJCWtmcmVlKGtleSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkqdmFsKysgPSAwOworCXZhbCA9IHNraXBfc3BhY2VzKHZhbCk7CisJcmVtb3ZlX3RyYWlsX3NwYWNlcyhrZXkpOworCXJlbW92ZV90cmFpbF9zcGFjZXModmFsKTsKKwltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJaGludCA9IGdldF9oaW50KGNvZGVjLCBrZXkpOworCWlmIChoaW50KSB7CisJCS8qIHJlcGxhY2UgKi8KKwkJa2ZyZWUoaGludC0+a2V5KTsKKwkJaGludC0+a2V5ID0ga2V5OworCQloaW50LT52YWwgPSB2YWw7CisJCWdvdG8gdW5sb2NrOworCX0KKwkvKiBhbGxvY2F0ZSBhIG5ldyBoaW50IGVudHJ5ICovCisJaWYgKGNvZGVjLT5oaW50cy51c2VkID49IE1BWF9ISU5UUykKKwkJaGludCA9IE5VTEw7CisJZWxzZQorCQloaW50ID0gc25kX2FycmF5X25ldygmY29kZWMtPmhpbnRzKTsKKwlpZiAoaGludCkgeworCQloaW50LT5rZXkgPSBrZXk7CisJCWhpbnQtPnZhbCA9IHZhbDsKKwl9IGVsc2UgeworCQllcnIgPSAtRU5PTUVNOworCX0KKyB1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJaWYgKGVycikKKwkJa2ZyZWUoa2V5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3NpemVfdCBoaW50c19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVyciA9IHBhcnNlX2hpbnRzKGNvZGVjLCBidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgdXNlcl9waW5fY29uZmlnc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHBpbl9jb25maWdzX3Nob3coY29kZWMsICZjb2RlYy0+dXNlcl9waW5zLCBidWYpOworfQorCisjZGVmaW5lIE1BWF9QSU5fQ09ORklHUwkJMzIKKworc3RhdGljIGludCBwYXJzZV91c2VyX3Bpbl9jb25maWdzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpidWYpCit7CisJaW50IG5pZCwgY2ZnLCBlcnI7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVpICVpIiwgJm5pZCwgJmNmZykgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFuaWQpCisJCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwllcnIgPSBzbmRfaGRhX2FkZF9waW5jZmcoY29kZWMsICZjb2RlYy0+dXNlcl9waW5zLCBuaWQsIGNmZyk7CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgdXNlcl9waW5fY29uZmlnc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyID0gcGFyc2VfdXNlcl9waW5fY29uZmlncyhjb2RlYywgYnVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHN5c2ZzIGF0dHJpYnV0ZXMgZXhwb3NlZCBvbmx5IHdoZW4gQ09ORklHX1NORF9IREFfUkVDT05GSUc9eSAqLworc3RhdGljIERFVklDRV9BVFRSX1JXKGluaXRfdmVyYnMpOworc3RhdGljIERFVklDRV9BVFRSX1JXKGhpbnRzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyh1c2VyX3Bpbl9jb25maWdzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyhyZWNvbmZpZyk7CitzdGF0aWMgREVWSUNFX0FUVFJfV08oY2xlYXIpOworCisvKgorICogTG9vayBmb3IgaGludCBzdHJpbmcKKyAqLworY29uc3QgY2hhciAqc25kX2hkYV9nZXRfaGludChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqa2V5KQoreworCXN0cnVjdCBoZGFfaGludCAqaGludCA9IGdldF9oaW50KGNvZGVjLCBrZXkpOworCXJldHVybiBoaW50ID8gaGludC0+dmFsIDogTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZ2V0X2hpbnQpOworCitpbnQgc25kX2hkYV9nZXRfYm9vbF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXkpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY29kZWMtPnVzZXJfbXV0ZXgpOworCXAgPSBzbmRfaGRhX2dldF9oaW50KGNvZGVjLCBrZXkpOworCWlmICghcCB8fCAhKnApCisJCXJldCA9IC1FTk9FTlQ7CisJZWxzZSB7CisJCXN3aXRjaCAodG91cHBlcigqcCkpIHsKKwkJY2FzZSAnVCc6IC8qIHRydWUgKi8KKwkJY2FzZSAnWSc6IC8qIHllcyAqLworCQljYXNlICcxJzoKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmNvZGVjLT51c2VyX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfYm9vbF9oaW50KTsKKworaW50IHNuZF9oZGFfZ2V0X2ludF9oaW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICprZXksIGludCAqdmFscCkKK3sKKwljb25zdCBjaGFyICpwOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcCA9IHNuZF9oZGFfZ2V0X2hpbnQoY29kZWMsIGtleSk7CisJaWYgKCFwKQorCQlyZXQgPSAtRU5PRU5UOworCWVsc2UgaWYgKGtzdHJ0b3VsKHAsIDAsICZ2YWwpKQorCQlyZXQgPSAtRUlOVkFMOworCWVsc2UgeworCQkqdmFscCA9IHZhbDsKKwkJcmV0ID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+dXNlcl9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZ2V0X2ludF9oaW50KTsKKyNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRyAqLworCisvKgorICogY29tbW9uIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX1JFQ09ORklHCisjZGVmaW5lIFJFQ09ORklHX0RFVklDRV9BVFRSKG5hbWUpCURFVklDRV9BVFRSX1JXKG5hbWUpCisjZWxzZQorI2RlZmluZSBSRUNPTkZJR19ERVZJQ0VfQVRUUihuYW1lKQlERVZJQ0VfQVRUUl9STyhuYW1lKQorI2VuZGlmCitzdGF0aWMgUkVDT05GSUdfREVWSUNFX0FUVFIodmVuZG9yX2lkKTsKK3N0YXRpYyBSRUNPTkZJR19ERVZJQ0VfQVRUUihzdWJzeXN0ZW1faWQpOworc3RhdGljIFJFQ09ORklHX0RFVklDRV9BVFRSKHJldmlzaW9uX2lkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhhZmcpOworc3RhdGljIERFVklDRV9BVFRSX1JPKG1mZyk7CitzdGF0aWMgUkVDT05GSUdfREVWSUNFX0FUVFIodmVuZG9yX25hbWUpOworc3RhdGljIFJFQ09ORklHX0RFVklDRV9BVFRSKGNoaXBfbmFtZSk7CitzdGF0aWMgUkVDT05GSUdfREVWSUNFX0FUVFIobW9kZWxuYW1lKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhpbml0X3Bpbl9jb25maWdzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhkcml2ZXJfcGluX2NvbmZpZ3MpOworCisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKKworLyogcGFyc2VyIG1vZGUgKi8KK2VudW0geworCUxJTkVfTU9ERV9OT05FLAorCUxJTkVfTU9ERV9DT0RFQywKKwlMSU5FX01PREVfTU9ERUwsCisJTElORV9NT0RFX1BJTkNGRywKKwlMSU5FX01PREVfVkVSQiwKKwlMSU5FX01PREVfSElOVCwKKwlMSU5FX01PREVfVkVORE9SX0lELAorCUxJTkVfTU9ERV9TVUJTWVNURU1fSUQsCisJTElORV9NT0RFX1JFVklTSU9OX0lELAorCUxJTkVfTU9ERV9DSElQX05BTUUsCisJTlVNX0xJTkVfTU9ERVMsCit9OworCitzdGF0aWMgaW5saW5lIGludCBzdHJtYXRjaChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCXJldHVybiBzdHJuaWNtcChhLCBiLCBzdHJsZW4oYikpID09IDA7Cit9CisKKy8qIHBhcnNlIHRoZSBjb250ZW50cyBhZnRlciB0aGUgbGluZSAiW2NvZGVjXSIKKyAqIGFjY2VwdCBvbmx5IHRoZSBsaW5lIHdpdGggdGhyZWUgbnVtYmVycywgYW5kIGFzc2lnbiB0aGUgY3VycmVudCBjb2RlYworICovCitzdGF0aWMgdm9pZCBwYXJzZV9jb2RlY19tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCSAgICAgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKK3sKKwlpbnQgdmVuZG9yaWQsIHN1YmlkLCBjYWRkcjsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKworCSpjb2RlY3AgPSBOVUxMOworCWlmIChzc2NhbmYoYnVmLCAiJWkgJWkgJWkiLCAmdmVuZG9yaWQsICZzdWJpZCwgJmNhZGRyKSA9PSAzKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKKwkJCWlmICgodmVuZG9yaWQgPD0gMCB8fCBjb2RlYy0+dmVuZG9yX2lkID09IHZlbmRvcmlkKSAmJgorCQkJICAgIChzdWJpZCA8PSAwIHx8IGNvZGVjLT5zdWJzeXN0ZW1faWQgPT0gc3ViaWQpICYmCisJCQkgICAgY29kZWMtPmFkZHIgPT0gY2FkZHIpIHsKKwkJCQkqY29kZWNwID0gY29kZWM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIHBhcnNlIHRoZSBjb250ZW50cyBhZnRlciB0aGUgb3RoZXIgY29tbWFuZCB0YWdzLCBbcGluY2ZnXSwgW3ZlcmJdLAorICogW3ZlbmRvcl9pZF0sIFtzdWJzeXN0ZW1faWRdLCBbcmV2aXNpb25faWRdLCBbY2hpcF9uYW1lXSwgW2hpbnRdIGFuZCBbbW9kZWxdCisgKiBqdXN0IHBhc3MgdG8gdGhlIHN5c2ZzIGhlbHBlciAob25seSB3aGVuIGFueSBjb2RlYyB3YXMgc3BlY2lmaWVkKQorICovCitzdGF0aWMgdm9pZCBwYXJzZV9waW5jZmdfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCisJCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQoreworCXBhcnNlX3VzZXJfcGluX2NvbmZpZ3MoKmNvZGVjcCwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfdmVyYl9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCSAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQoreworCXBhcnNlX2luaXRfdmVyYnMoKmNvZGVjcCwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfaGludF9tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywKKwkJCSAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQoreworCXBhcnNlX2hpbnRzKCpjb2RlY3AsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX21vZGVsX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJICAgICBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQoreworCWtmcmVlKCgqY29kZWNwKS0+bW9kZWxuYW1lKTsKKwkoKmNvZGVjcCktPm1vZGVsbmFtZSA9IGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfY2hpcF9uYW1lX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLAorCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQoreworCWtmcmVlKCgqY29kZWNwKS0+Y2hpcF9uYW1lKTsKKwkoKmNvZGVjcCktPmNoaXBfbmFtZSA9IGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKK30KKworI2RlZmluZSBERUZJTkVfUEFSU0VfSURfTU9ERShuYW1lKSBcCitzdGF0aWMgdm9pZCBwYXJzZV8jI25hbWUjI19tb2RlKGNoYXIgKmJ1Ziwgc3RydWN0IGhkYV9idXMgKmJ1cywgXAorCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKSBcCit7IFwKKwl1bnNpZ25lZCBsb25nIHZhbDsgXAorCWlmICgha3N0cnRvdWwoYnVmLCAwLCAmdmFsKSkgXAorCQkoKmNvZGVjcCktPm5hbWUgPSB2YWw7IFwKK30KKworREVGSU5FX1BBUlNFX0lEX01PREUodmVuZG9yX2lkKTsKK0RFRklORV9QQVJTRV9JRF9NT0RFKHN1YnN5c3RlbV9pZCk7CitERUZJTkVfUEFSU0VfSURfTU9ERShyZXZpc2lvbl9pZCk7CisKKworc3RydWN0IGhkYV9wYXRjaF9pdGVtIHsKKwljb25zdCBjaGFyICp0YWc7CisJY29uc3QgY2hhciAqYWxpYXM7CisJdm9pZCAoKnBhcnNlcikoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBzdHJ1Y3QgaGRhX2NvZGVjICoqcmV0Yyk7Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wYXRjaF9pdGVtIHBhdGNoX2l0ZW1zW05VTV9MSU5FX01PREVTXSA9IHsKKwlbTElORV9NT0RFX0NPREVDXSA9IHsKKwkJLnRhZyA9ICJbY29kZWNdIiwKKwkJLnBhcnNlciA9IHBhcnNlX2NvZGVjX21vZGUsCisJfSwKKwlbTElORV9NT0RFX01PREVMXSA9IHsKKwkJLnRhZyA9ICJbbW9kZWxdIiwKKwkJLnBhcnNlciA9IHBhcnNlX21vZGVsX21vZGUsCisJfSwKKwlbTElORV9NT0RFX1ZFUkJdID0geworCQkudGFnID0gIlt2ZXJiXSIsCisJCS5hbGlhcyA9ICJbaW5pdF92ZXJic10iLAorCQkucGFyc2VyID0gcGFyc2VfdmVyYl9tb2RlLAorCX0sCisJW0xJTkVfTU9ERV9QSU5DRkddID0geworCQkudGFnID0gIltwaW5jZmddIiwKKwkJLmFsaWFzID0gIlt1c2VyX3Bpbl9jb25maWdzXSIsCisJCS5wYXJzZXIgPSBwYXJzZV9waW5jZmdfbW9kZSwKKwl9LAorCVtMSU5FX01PREVfSElOVF0gPSB7CisJCS50YWcgPSAiW2hpbnRdIiwKKwkJLmFsaWFzID0gIltoaW50c10iLAorCQkucGFyc2VyID0gcGFyc2VfaGludF9tb2RlCisJfSwKKwlbTElORV9NT0RFX1ZFTkRPUl9JRF0gPSB7CisJCS50YWcgPSAiW3ZlbmRvcl9pZF0iLAorCQkucGFyc2VyID0gcGFyc2VfdmVuZG9yX2lkX21vZGUsCisJfSwKKwlbTElORV9NT0RFX1NVQlNZU1RFTV9JRF0gPSB7CisJCS50YWcgPSAiW3N1YnN5c3RlbV9pZF0iLAorCQkucGFyc2VyID0gcGFyc2Vfc3Vic3lzdGVtX2lkX21vZGUsCisJfSwKKwlbTElORV9NT0RFX1JFVklTSU9OX0lEXSA9IHsKKwkJLnRhZyA9ICJbcmV2aXNpb25faWRdIiwKKwkJLnBhcnNlciA9IHBhcnNlX3JldmlzaW9uX2lkX21vZGUsCisJfSwKKwlbTElORV9NT0RFX0NISVBfTkFNRV0gPSB7CisJCS50YWcgPSAiW2NoaXBfbmFtZV0iLAorCQkucGFyc2VyID0gcGFyc2VfY2hpcF9uYW1lX21vZGUsCisJfSwKK307CisKKy8qIGNoZWNrIHRoZSBsaW5lIHN0YXJ0aW5nIHdpdGggJ1snIC0tIGNoYW5nZSB0aGUgcGFyc2VyIG1vZGUgYWNjb2RpbmdseSAqLworc3RhdGljIGludCBwYXJzZV9saW5lX21vZGUoY2hhciAqYnVmLCBzdHJ1Y3QgaGRhX2J1cyAqYnVzKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhdGNoX2l0ZW1zKTsgaSsrKSB7CisJCWlmICghcGF0Y2hfaXRlbXNbaV0udGFnKQorCQkJY29udGludWU7CisJCWlmIChzdHJtYXRjaChidWYsIHBhdGNoX2l0ZW1zW2ldLnRhZykpCisJCQlyZXR1cm4gaTsKKwkJaWYgKHBhdGNoX2l0ZW1zW2ldLmFsaWFzICYmIHN0cm1hdGNoKGJ1ZiwgcGF0Y2hfaXRlbXNbaV0uYWxpYXMpKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiBMSU5FX01PREVfTk9ORTsKK30KKworLyogY29weSBvbmUgbGluZSBmcm9tIHRoZSBidWZmZXIgaW4gZncsIGFuZCB1cGRhdGUgdGhlIGZpZWxkcyBpbiBmdworICogcmV0dXJuIHplcm8gaWYgaXQgcmVhY2hlcyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIG9yIG5vbi16ZXJvCisgKiBpZiBzdWNjZXNzZnVsbHkgY29waWVkIGEgbGluZQorICoKKyAqIHRoZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZCBvZiB0aGUgbGluZSBhcmUgc3RyaXBwZWQKKyAqLworc3RhdGljIGludCBnZXRfbGluZV9mcm9tX2Z3KGNoYXIgKmJ1ZiwgaW50IHNpemUsIHNpemVfdCAqZndfc2l6ZV9wLAorCQkJICAgIGNvbnN0IHZvaWQgKipmd19kYXRhX3ApCit7CisJaW50IGxlbjsKKwlzaXplX3QgZndfc2l6ZSA9ICpmd19zaXplX3A7CisJY29uc3QgY2hhciAqcCA9ICpmd19kYXRhX3A7CisKKwl3aGlsZSAoaXNzcGFjZSgqcCkgJiYgZndfc2l6ZSkgeworCQlwKys7CisJCWZ3X3NpemUtLTsKKwl9CisJaWYgKCFmd19zaXplKQorCQlyZXR1cm4gMDsKKworCWZvciAobGVuID0gMDsgbGVuIDwgZndfc2l6ZTsgbGVuKyspIHsKKwkJaWYgKCEqcCkKKwkJCWJyZWFrOworCQlpZiAoKnAgPT0gJ1xuJykgeworCQkJcCsrOworCQkJbGVuKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAobGVuIDwgc2l6ZSkKKwkJCSpidWYrKyA9ICpwKys7CisJfQorCSpidWYgPSAwOworCSpmd19zaXplX3AgPSBmd19zaXplIC0gbGVuOworCSpmd19kYXRhX3AgPSBwOworCXJlbW92ZV90cmFpbF9zcGFjZXMoYnVmKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGxvYWQgYSAicGF0Y2giIGZpcm13YXJlIGZpbGUgYW5kIHBhcnNlIGl0CisgKi8KK2ludCBzbmRfaGRhX2xvYWRfcGF0Y2goc3RydWN0IGhkYV9idXMgKmJ1cywgc2l6ZV90IGZ3X3NpemUsIGNvbnN0IHZvaWQgKmZ3X2J1ZikKK3sKKwljaGFyIGJ1ZlsxMjhdOworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCWludCBsaW5lX21vZGU7CisKKwlsaW5lX21vZGUgPSBMSU5FX01PREVfTk9ORTsKKwljb2RlYyA9IE5VTEw7CisJd2hpbGUgKGdldF9saW5lX2Zyb21fZncoYnVmLCBzaXplb2YoYnVmKSAtIDEsICZmd19zaXplLCAmZndfYnVmKSkgeworCQlpZiAoISpidWYgfHwgKmJ1ZiA9PSAnIycgfHwgKmJ1ZiA9PSAnXG4nKQorCQkJY29udGludWU7CisJCWlmICgqYnVmID09ICdbJykKKwkJCWxpbmVfbW9kZSA9IHBhcnNlX2xpbmVfbW9kZShidWYsIGJ1cyk7CisJCWVsc2UgaWYgKHBhdGNoX2l0ZW1zW2xpbmVfbW9kZV0ucGFyc2VyICYmCisJCQkgKGNvZGVjIHx8IGxpbmVfbW9kZSA8PSBMSU5FX01PREVfQ09ERUMpKQorCQkJcGF0Y2hfaXRlbXNbbGluZV9tb2RlXS5wYXJzZXIoYnVmLCBidXMsICZjb2RlYyk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9sb2FkX3BhdGNoKTsKKyNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIgKi8KKworLyoKKyAqIHN5c2ZzIGVudHJpZXMKKyAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmhkYV9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdmVuZG9yX2lkLmF0dHIsCisJJmRldl9hdHRyX3N1YnN5c3RlbV9pZC5hdHRyLAorCSZkZXZfYXR0cl9yZXZpc2lvbl9pZC5hdHRyLAorCSZkZXZfYXR0cl9hZmcuYXR0ciwKKwkmZGV2X2F0dHJfbWZnLmF0dHIsCisJJmRldl9hdHRyX3ZlbmRvcl9uYW1lLmF0dHIsCisJJmRldl9hdHRyX2NoaXBfbmFtZS5hdHRyLAorCSZkZXZfYXR0cl9tb2RlbG5hbWUuYXR0ciwKKwkmZGV2X2F0dHJfaW5pdF9waW5fY29uZmlncy5hdHRyLAorCSZkZXZfYXR0cl9kcml2ZXJfcGluX2NvbmZpZ3MuYXR0ciwKKyNpZmRlZiBDT05GSUdfUE0KKwkmZGV2X2F0dHJfcG93ZXJfb25fYWNjdC5hdHRyLAorCSZkZXZfYXR0cl9wb3dlcl9vZmZfYWNjdC5hdHRyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKKwkmZGV2X2F0dHJfaW5pdF92ZXJicy5hdHRyLAorCSZkZXZfYXR0cl9oaW50cy5hdHRyLAorCSZkZXZfYXR0cl91c2VyX3Bpbl9jb25maWdzLmF0dHIsCisJJmRldl9hdHRyX3JlY29uZmlnLmF0dHIsCisJJmRldl9hdHRyX2NsZWFyLmF0dHIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBoZGFfZGV2X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzCT0gaGRhX2Rldl9hdHRycywKK307CisKK2NvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnNuZF9oZGFfZGV2X2F0dHJfZ3JvdXBzW10gPSB7CisJJmhkYV9kZXZfYXR0cl9ncm91cCwKKwlOVUxMCit9OworCit2b2lkIHNuZF9oZGFfc3lzZnNfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwltdXRleF9pbml0KCZjb2RlYy0+dXNlcl9tdXRleCk7CisjaWZkZWYgQ09ORklHX1NORF9IREFfUkVDT05GSUcKKwlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPmluaXRfdmVyYnMsIHNpemVvZihzdHJ1Y3QgaGRhX3ZlcmIpLCAzMik7CisJc25kX2FycmF5X2luaXQoJmNvZGVjLT5oaW50cywgc2l6ZW9mKHN0cnVjdCBoZGFfaGludCksIDMyKTsKKwlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPnVzZXJfcGlucywgc2l6ZW9mKHN0cnVjdCBoZGFfcGluY2ZnKSwgMTYpOworI2VuZGlmCit9CisKK3ZvaWQgc25kX2hkYV9zeXNmc19jbGVhcihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9SRUNPTkZJRworCWludCBpOworCisJLyogY2xlYXIgaW5pdCB2ZXJicyAqLworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+aW5pdF92ZXJicyk7CisJLyogY2xlYXIgaGludHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmhpbnRzLnVzZWQ7IGkrKykgeworCQlzdHJ1Y3QgaGRhX2hpbnQgKmhpbnQgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmhpbnRzLCBpKTsKKwkJa2ZyZWUoaGludC0+a2V5KTsgLyogd2UgZG9uJ3QgbmVlZCB0byBmcmVlIGhpbnQtPnZhbCAqLworCX0KKwlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmhpbnRzKTsKKwlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPnVzZXJfcGlucyk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCmluZGV4IDhlZDBiY2MuLjQwYmEwNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtMjEsNyArMjEsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jCmluZGV4IDMwYjNhNGIuLjVlNjU5OTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYwpAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwppbmRleCA0NmVjZGJiLi4wOTJmMmJkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgpAQCAtODY4LDcgKzg2Nyw3IEBACiAJaW50IHN0YXR1cyA9IDA7CiAKIAlpZiAoZGF0YSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJjaGlwaW9fd3JpdGVfZGF0YSBudWxsIHB0clxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImNoaXBpb193cml0ZV9kYXRhIG51bGwgcHRyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNDA3LDEyICsxNDA2LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGRpciA9PSBTQ1BfR0VUICYmIHJlcGx5ID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImRzcGlvX3NjcCBnZXQgYnV0IGhhcyBubyBidWZmZXJcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3Bpb19zY3AgZ2V0IGJ1dCBoYXMgbm8gYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHJlcGx5ICE9IE5VTEwgJiYgKHJlcGx5X2xlbiA9PSBOVUxMIHx8ICgqcmVwbHlfbGVuID09IDApKSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZHNwaW9fc2NwIGJhZCByZXNwIGJ1ZiBsZW4gcGFybXNcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3Bpb19zY3AgYmFkIHJlc3AgYnVmIGxlbiBwYXJtc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTQzMCw3ICsxNDI5LDcgQEAKIAkJCQkJc2l6ZW9mKHNjcF9yZXBseSksICZyZXRfYnl0ZXMpOwogCiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImRzcGlvX3NjcDogc2VuZCBzY3AgbXNnIGZhaWxlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcGlvX3NjcDogc2VuZCBzY3AgbXNnIGZhaWxlZFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0xNDQ5LDE3ICsxNDQ4LDE3IEBACiAJCQkJCS8gc2l6ZW9mKHVuc2lnbmVkIGludCk7CiAKIAkJaWYgKCpyZXBseV9sZW4gPCByZXRfc2l6ZSpzaXplb2YodW5zaWduZWQgaW50KSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlcGx5IHRvbyBsb25nIGZvciBidWZcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAicmVwbHkgdG9vIGxvbmcgZm9yIGJ1ZlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlIGlmIChyZXRfc2l6ZSAhPSByZXBseV9kYXRhX3NpemUpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJSZXRMZW4gYW5kIEhkckxlbiAuTkUuXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgIlJldExlbiBhbmQgSGRyTGVuIC5ORS5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0gZWxzZSB7CiAJCQkqcmVwbHlfbGVuID0gcmV0X3NpemUqc2l6ZW9mKHVuc2lnbmVkIGludCk7CiAJCQltZW1jcHkocmVwbHksIHNjcF9yZXBseS5kYXRhLCAqcmVwbHlfbGVuKTsKIAkJfQogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJyZXBseSBpbGwtZm9ybWVkIG9yIGVycmZsYWcgc2V0XG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAicmVwbHkgaWxsLWZvcm1lZCBvciBlcnJmbGFnIHNldFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTQ4OSwyMiArMTQ4OCwyMiBAQAogCWludCBzdGF0dXMgPSAwOwogCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZW9mKGRtYV9jaGFuKTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3Bpb19hbGxvY19kbWFfY2hhbigpIC0tIGJlZ2luXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICAgIGRzcGlvX2FsbG9jX2RtYV9jaGFuKCkgLS0gYmVnaW5cbiIpOwogCXN0YXR1cyA9IGRzcGlvX3NjcChjb2RlYywgTUFTVEVSQ09OVFJPTCwgTUFTVEVSQ09OVFJPTF9BTExPQ19ETUFfQ0hBTiwKIAkJCVNDUF9HRVQsIE5VTEwsIDAsIGRtYV9jaGFuLCAmc2l6ZSk7CiAKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImRzcGlvX2FsbG9jX2RtYV9jaGFuOiBTQ1AgRmFpbGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fYWxsb2NfZG1hX2NoYW46IFNDUCBGYWlsZWRcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCWlmICgoKmRtYV9jaGFuICsgMSkgPT0gMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5vIGZyZWUgZG1hIGNoYW5uZWxzIHRvIGFsbG9jYXRlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAibm8gZnJlZSBkbWEgY2hhbm5lbHMgdG8gYWxsb2NhdGVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXNuZF9wcmludGRkKCJkc3Bpb19hbGxvY19kbWFfY2hhbjogY2hhbj0lZFxuIiwgKmRtYV9jaGFuKTsKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgICAgZHNwaW9fYWxsb2NfZG1hX2NoYW4oKSAtLSBjb21wbGV0ZVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiZHNwaW9fYWxsb2NfZG1hX2NoYW46IGNoYW49JWRcbiIsICpkbWFfY2hhbik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3Bpb19hbGxvY19kbWFfY2hhbigpIC0tIGNvbXBsZXRlXG4iKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNTE3LDE4ICsxNTE2LDE4IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJdW5zaWduZWQgaW50IGR1bW15ID0gMDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3Bpb19mcmVlX2RtYV9jaGFuKCkgLS0gYmVnaW5cbiIpOwotCXNuZF9wcmludGRkKCJkc3Bpb19mcmVlX2RtYV9jaGFuOiBjaGFuPSVkXG4iLCBkbWFfY2hhbik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgICBkc3Bpb19mcmVlX2RtYV9jaGFuKCkgLS0gYmVnaW5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImRzcGlvX2ZyZWVfZG1hX2NoYW46IGNoYW49JWRcbiIsIGRtYV9jaGFuKTsKIAogCXN0YXR1cyA9IGRzcGlvX3NjcChjb2RlYywgTUFTVEVSQ09OVFJPTCwgTUFTVEVSQ09OVFJPTF9BTExPQ19ETUFfQ0hBTiwKIAkJCSAgIFNDUF9TRVQsICZkbWFfY2hhbiwgc2l6ZW9mKGRtYV9jaGFuKSwgTlVMTCwgJmR1bW15KTsKIAogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNwaW9fZnJlZV9kbWFfY2hhbjogU0NQIEZhaWxlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcGlvX2ZyZWVfZG1hX2NoYW46IFNDUCBGYWlsZWRcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3Bpb19mcmVlX2RtYV9jaGFuKCkgLS0gY29tcGxldGVcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwaW9fZnJlZV9kbWFfY2hhbigpIC0tIGNvbXBsZXRlXG4iKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNTc2LDE0ICsxNTc1LDE0IEBACiAJdW5zaWduZWQgaW50IHJlczsKIAlpbnQgcmV0cnkgPSAyMDsKIAotCXNuZF9wcmludGRkKCJkc3BfcmVzZXRcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImRzcF9yZXNldFxuIik7CiAJZG8gewogCQlyZXMgPSBkc3Bpb19zZW5kKGNvZGVjLCBWRU5ET1JfRFNQSU9fRFNQX0lOSVQsIDApOwogCQlyZXRyeS0tOwogCX0gd2hpbGUgKHJlcyA9PSAtRUlPICYmIHJldHJ5KTsKIAogCWlmICghcmV0cnkpIHsKLQkJc25kX3ByaW50ZGQoImRzcF9yZXNldCB0aW1lb3V0XG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwX3Jlc2V0IHRpbWVvdXRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE2MzYsMzkgKzE2MzUsMzkgQEAKIAl1bnNpZ25lZCBpbnQgYWN0aXZlOwogCWJvb2wgY29kZSwgeXJhbTsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zZXR1cF9jb21tb24oKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgLS0gQmVnaW4gLS0tLS0tLS0tXG4iKTsKIAogCWlmIChkbWFfY2hhbiA+PSBEU1BETUFDX0RNQV9DRkdfQ0hBTk5FTF9DT1VOVCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZG1hIGNoYW4gbnVtIGludmFsaWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkbWEgY2hhbiBudW0gaW52YWxpZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChkc3BfaXNfZG1hX2FjdGl2ZShjb2RlYywgZG1hX2NoYW4pKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkbWEgYWxyZWFkeSBhY3RpdmVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkbWEgYWxyZWFkeSBhY3RpdmVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWRzcF9hZGR4ID0gZHNwX2NoaXBfdG9fZHNwX2FkZHgoY2hpcF9hZGR4LCAmY29kZSwgJnlyYW0pOwogCiAJaWYgKGRzcF9hZGR4ID09IElOVkFMSURfQ0hJUF9BRERSRVNTKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJpbnZhbGlkIGNoaXAgYWRkclxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImludmFsaWQgY2hpcCBhZGRyXG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKIAljaG5sX3Byb3AgPSBEU1BETUFDX0NITkxQUk9QX0FDX01BU0s7CiAJYWN0aXZlID0gMDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBzdGFydCByZWcgcGdtXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIHN0YXJ0IHJlZyBwZ21cbiIpOwogCiAJaWYgKG92bHkpIHsKIAkJc3RhdHVzID0gY2hpcGlvX3JlYWQoY29kZWMsIERTUERNQUNfQ0hOTFBST1BfSU5TVF9PRkZTRVQsCiAJCQkJICAgICAmY2hubF9wcm9wKTsKIAogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInJlYWQgQ0hOTFBST1AgUmVnIGZhaWxcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAicmVhZCBDSE5MUFJPUCBSZWcgZmFpbFxuIik7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNwX2RtYV9zZXR1cF9jb21tb24oKSBSZWFkIENITkxQUk9QXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwX2RtYV9zZXR1cF9jb21tb24oKSBSZWFkIENITkxQUk9QXG4iKTsKIAl9CiAKIAlpZiAoIWNvZGUpCkBAIC0xNjgwLDIwICsxNjc5LDIwIEBACiAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfQ0hOTFBST1BfSU5TVF9PRkZTRVQsIGNobmxfcHJvcCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIENITkxQUk9QIFJlZyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAid3JpdGUgQ0hOTFBST1AgUmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgICAgV3JpdGUgQ0hOTFBST1BcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgICAgV3JpdGUgQ0hOTFBST1BcbiIpOwogCiAJaWYgKG92bHkpIHsKIAkJc3RhdHVzID0gY2hpcGlvX3JlYWQoY29kZWMsIERTUERNQUNfQUNUSVZFX0lOU1RfT0ZGU0VULAogCQkJCSAgICAgJmFjdGl2ZSk7CiAKIAkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJyZWFkIEFDVElWRSBSZWcgZmFpbFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJyZWFkIEFDVElWRSBSZWcgZmFpbFxuIik7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNwX2RtYV9zZXR1cF9jb21tb24oKSBSZWFkIEFDVElWRVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImRzcF9kbWFfc2V0dXBfY29tbW9uKCkgUmVhZCBBQ1RJVkVcbiIpOwogCX0KIAogCWFjdGl2ZSAmPSAofigxIDw8IChEU1BETUFDX0FDVElWRV9BQVJfTE9CSVQgKyBkbWFfY2hhbikpKSAmCkBAIC0xNzAxLDM1ICsxNzAwLDM1IEBACiAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfQUNUSVZFX0lOU1RfT0ZGU0VULCBhY3RpdmUpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBBQ1RJVkUgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBBQ1RJVkUgUmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBBQ1RJVkVcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgICAgV3JpdGUgQUNUSVZFXG4iKTsKIAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19BVURDSFNFTF9JTlNUX09GRlNFVChkbWFfY2hhbiksCiAJCQkgICAgICBwb3J0X21hcF9tYXNrKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgQVVEQ0hTRUwgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBBVURDSFNFTCBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBBVURDSFNFTFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBBVURDSFNFTFxuIik7CiAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfSVJRQ05UX0lOU1RfT0ZGU0VUKGRtYV9jaGFuKSwKIAkJCURTUERNQUNfSVJRQ05UX0JJQ05UX01BU0sgfCBEU1BETUFDX0lSUUNOVF9DSUNOVF9NQVNLKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgSVJRQ05UIFJlZyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAid3JpdGUgSVJRQ05UIFJlZyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwX2NvbW1vbigpICAgIFdyaXRlIElSUUNOVFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cF9jb21tb24oKSAgICBXcml0ZSBJUlFDTlRcbiIpOwogCi0Jc25kX3ByaW50ZGQoCisJY29kZWNfZGJnKGNvZGVjLAogCQkgICAiQ2hpcEE9MHgleCxEc3BBPTB4JXgsZG1hQ2g9JXUsICIKIAkJICAgIkNIU0VMPTB4JXgsQ0hQUk9QPTB4JXgsQWN0aXZlPTB4JXhcbiIsCiAJCSAgIGNoaXBfYWRkeCwgZHNwX2FkZHgsIGRtYV9jaGFuLAogCQkgICBwb3J0X21hcF9tYXNrLCBjaG5sX3Byb3AsIGFjdGl2ZSk7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc2V0dXBfY29tbW9uKCkgLS0gQ29tcGxldGUgLS0tLS0tXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICItLSBkc3BfZG1hX3NldHVwX2NvbW1vbigpIC0tIENvbXBsZXRlIC0tLS0tLVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3NTUsMjAgKzE3NTQsMjAgQEAKIAljb25zdCB1bnNpZ25lZCBpbnQgbWF4X2RtYV9jb3VudCA9IDEgPDwgKERTUERNQUNfWEZSQ05UX0JDTlRfSElCSVQgLQogCQkJCQkJRFNQRE1BQ19YRlJDTlRfQkNOVF9MT0JJVCArIDEpOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3NldHVwKCkgLS0gQmVnaW4gLS0tLS0tLS0tXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICItLSBkc3BfZG1hX3NldHVwKCkgLS0gQmVnaW4gLS0tLS0tLS0tXG4iKTsKIAogCWlmIChjb3VudCA+IG1heF9kbWFfY291bnQpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImNvdW50IHRvbyBiaWdcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJjb3VudCB0b28gYmlnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZHNwX2FkZHggPSBkc3BfY2hpcF90b19kc3BfYWRkeChjaGlwX2FkZHgsICZjb2RlLCAmeXJhbSk7CiAJaWYgKGRzcF9hZGR4ID09IElOVkFMSURfQ0hJUF9BRERSRVNTKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJpbnZhbGlkIGNoaXAgYWRkclxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImludmFsaWQgY2hpcCBhZGRyXG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBzdGFydCByZWcgcGdtXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwKCkgICAgc3RhcnQgcmVnIHBnbVxuIik7CiAKIAlhZGRyX2ZpZWxkID0gZHNwX2FkZHggPDwgRFNQRE1BQ19ETUFDRkdfREJBRFJfTE9CSVQ7CiAJaW5jcl9maWVsZCAgID0gMDsKQEAgLTE3ODUsMTAgKzE3ODQsMTAgQEAKIAlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIERTUERNQUNfRE1BQ0ZHX0lOU1RfT0ZGU0VUKGRtYV9jaGFuKSwKIAkJCQlkbWFfY2ZnKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgRE1BQ0ZHIFJlZyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAid3JpdGUgRE1BQ0ZHIFJlZyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICBkc3BfZG1hX3NldHVwKCkgICAgV3JpdGUgRE1BQ0ZHXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICBkc3BfZG1hX3NldHVwKCkgICAgV3JpdGUgRE1BQ0ZHXG4iKTsKIAogCWFkcl9vZnMgPSAoY291bnQgLSAxKSA8PCAoRFNQRE1BQ19EU1BBRFJPRlNfQk9GU19MT0JJVCArCiAJCQkJCQkJKGNvZGUgPyAwIDogMSkpOwpAQCAtMTc5NiwxMCArMTc5NSwxMCBAQAogCXN0YXR1cyA9IGNoaXBpb193cml0ZShjb2RlYywgRFNQRE1BQ19EU1BBRFJPRlNfSU5TVF9PRkZTRVQoZG1hX2NoYW4pLAogCQkJCWFkcl9vZnMpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBEU1BBRFJPRlMgUmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBEU1BBRFJPRlMgUmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBXcml0ZSBEU1BBRFJPRlNcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgIGRzcF9kbWFfc2V0dXAoKSAgICBXcml0ZSBEU1BBRFJPRlNcbiIpOwogCiAJYmFzZV9jbnQgPSAoY291bnQgLSAxKSA8PCBEU1BETUFDX1hGUkNOVF9CQ05UX0xPQklUOwogCkBAIC0xODEwLDE3ICsxODA5LDE3IEBACiAJc3RhdHVzID0gY2hpcGlvX3dyaXRlKGNvZGVjLAogCQkJCURTUERNQUNfWEZSQ05UX0lOU1RfT0ZGU0VUKGRtYV9jaGFuKSwgeGZyX2NudCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIndyaXRlIFhGUkNOVCBSZWcgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIndyaXRlIFhGUkNOVCBSZWcgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgZHNwX2RtYV9zZXR1cCgpICAgIFdyaXRlIFhGUkNOVFxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiICAgZHNwX2RtYV9zZXR1cCgpICAgIFdyaXRlIFhGUkNOVFxuIik7CiAKLQlzbmRfcHJpbnRkZCgKKwljb2RlY19kYmcoY29kZWMsCiAJCSAgICJDaGlwQT0weCV4LCBjbnQ9MHgleCwgRE1BQ0ZHPTB4JXgsICIKIAkJICAgIkFEUk9GUz0weCV4LCBYRlJDTlQ9MHgleFxuIiwKIAkJICAgY2hpcF9hZGR4LCBjb3VudCwgZG1hX2NmZywgYWRyX29mcywgeGZyX2NudCk7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc2V0dXAoKSAtLSBDb21wbGV0ZSAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc2V0dXAoKSAtLSBDb21wbGV0ZSAtLS0tLS0tLS1cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODM0LDE3ICsxODMzLDE3IEBACiAJdW5zaWduZWQgaW50IHJlZyA9IDA7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc3RhcnQoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc3RhcnQoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOwogCiAJaWYgKG92bHkpIHsKIAkJc3RhdHVzID0gY2hpcGlvX3JlYWQoY29kZWMsCiAJCQkJICAgICBEU1BETUFDX0NITkxTVEFSVF9JTlNUX09GRlNFVCwgJnJlZyk7CiAKIAkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJyZWFkIENITkxTVEFSVCByZWcgZmFpbFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJyZWFkIENITkxTVEFSVCByZWcgZmFpbFxuIik7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zdGFydCgpICAgIFJlYWQgQ0hOTFNUQVJUXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiLS0gZHNwX2RtYV9zdGFydCgpICAgIFJlYWQgQ0hOTFNUQVJUXG4iKTsKIAogCQlyZWcgJj0gfihEU1BETUFDX0NITkxTVEFSVF9FTl9NQVNLIHwKIAkJCQlEU1BETUFDX0NITkxTVEFSVF9ESVNfTUFTSyk7CkBAIC0xODUzLDEwICsxODUyLDEwIEBACiAJc3RhdHVzID0gY2hpcGlvX3dyaXRlKGNvZGVjLCBEU1BETUFDX0NITkxTVEFSVF9JTlNUX09GRlNFVCwKIAkJCXJlZyB8ICgxIDw8IChkbWFfY2hhbiArIERTUERNQUNfQ0hOTFNUQVJUX0VOX0xPQklUKSkpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJ3cml0ZSBDSE5MU1RBUlQgcmVnIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJ3cml0ZSBDSE5MU1RBUlQgcmVnIGZhaWxcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tIGRzcF9kbWFfc3RhcnQoKSAtLSBDb21wbGV0ZSAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc3RhcnQoKSAtLSBDb21wbGV0ZSAtLS0tLS0tLS1cbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE4NzAsMTcgKzE4NjksMTcgQEAKIAl1bnNpZ25lZCBpbnQgcmVnID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zdG9wKCkgLS0gQmVnaW4gLS0tLS0tLS0tXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICItLSBkc3BfZG1hX3N0b3AoKSAtLSBCZWdpbiAtLS0tLS0tLS1cbiIpOwogCiAJaWYgKG92bHkpIHsKIAkJc3RhdHVzID0gY2hpcGlvX3JlYWQoY29kZWMsCiAJCQkJICAgICBEU1BETUFDX0NITkxTVEFSVF9JTlNUX09GRlNFVCwgJnJlZyk7CiAKIAkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJyZWFkIENITkxTVEFSVCByZWcgZmFpbFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJyZWFkIENITkxTVEFSVCByZWcgZmFpbFxuIik7CiAJCQlyZXR1cm4gc3RhdHVzOwogCQl9Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0gZHNwX2RtYV9zdG9wKCkgICAgUmVhZCBDSE5MU1RBUlRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICItLSBkc3BfZG1hX3N0b3AoKSAgICBSZWFkIENITkxTVEFSVFxuIik7CiAJCXJlZyAmPSB+KERTUERNQUNfQ0hOTFNUQVJUX0VOX01BU0sgfAogCQkJCURTUERNQUNfQ0hOTFNUQVJUX0RJU19NQVNLKTsKIAl9CkBAIC0xODg4LDEwICsxODg3LDEwIEBACiAJc3RhdHVzID0gY2hpcGlvX3dyaXRlKGNvZGVjLCBEU1BETUFDX0NITkxTVEFSVF9JTlNUX09GRlNFVCwKIAkJCXJlZyB8ICgxIDw8IChkbWFfY2hhbiArIERTUERNQUNfQ0hOTFNUQVJUX0RJU19MT0JJVCkpKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAid3JpdGUgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAid3JpdGUgQ0hOTFNUQVJUIHJlZyBmYWlsXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICItLSBkc3BfZG1hX3N0b3AoKSAtLSBDb21wbGV0ZSAtLS0tLS0tLS1cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIi0tIGRzcF9kbWFfc3RvcCgpIC0tIENvbXBsZXRlIC0tLS0tLS0tLVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTk3NCwxNyArMTk3MywxNyBAQAogewogCWludCBzdGF0dXM7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgICAgZHNwX2FsbG9jYXRlX3BvcnRzKCkgLS0gYmVnaW5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwX2FsbG9jYXRlX3BvcnRzKCkgLS0gYmVnaW5cbiIpOwogCiAJaWYgKChyYXRlX211bHRpICE9IDEpICYmIChyYXRlX211bHRpICE9IDIpICYmIChyYXRlX211bHRpICE9IDQpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJiYWQgcmF0ZSBtdWx0aXBsZVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImJhZCByYXRlIG11bHRpcGxlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3RhdHVzID0gZHNwX2FsbG9jYXRlX3JvdXRlcl9wb3J0cyhjb2RlYywgbnVtX2NoYW5zLAogCQkJCQkgICByYXRlX211bHRpLCAwLCBwb3J0X21hcCk7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIiAgICAgZHNwX2FsbG9jYXRlX3BvcnRzKCkgLS0gY29tcGxldGVcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwX2FsbG9jYXRlX3BvcnRzKCkgLS0gY29tcGxldGVcbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIwMDEsNyArMjAwMCw3IEBACiAJdW5zaWduZWQgaW50IHJhdGVfbXVsdGkgPSBzYW1wbGVfcmF0ZV9tdWwgLyBzYW1wbGVfcmF0ZV9kaXY7CiAKIAlpZiAoKHJhdGVfbXVsdGkgIT0gMSkgJiYgKHJhdGVfbXVsdGkgIT0gMikgJiYgKHJhdGVfbXVsdGkgIT0gNCkpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImJhZCByYXRlIG11bHRpcGxlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiYmFkIHJhdGUgbXVsdGlwbGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIwMTksMTQgKzIwMTgsMTQgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICIgICAgIGRzcF9mcmVlX3BvcnRzKCkgLS0gYmVnaW5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIiAgICAgZHNwX2ZyZWVfcG9ydHMoKSAtLSBiZWdpblxuIik7CiAKIAlzdGF0dXMgPSBkc3BfZnJlZV9yb3V0ZXJfcG9ydHMoY29kZWMpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJmcmVlIHJvdXRlciBwb3J0cyBmYWlsXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZnJlZSByb3V0ZXIgcG9ydHMgZmFpbFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiICAgICBkc3BfZnJlZV9wb3J0cygpIC0tIGNvbXBsZXRlXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICIgICAgIGRzcF9mcmVlX3BvcnRzKCkgLS0gY29tcGxldGVcbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIwOTIsOCArMjA5MSw2IEBACiB7CiAJYm9vbCBjbWQ7CiAKLQlzbmRfcHJpbnRkZCgiZG1hX3NldF9zdGF0ZSBzdGF0ZT0lZFxuIiwgc3RhdGUpOwotCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgRE1BX1NUQVRFX1NUT1A6CiAJCWNtZCA9IGZhbHNlOwpAQCAtMjE5Niw3ICsyMTkzLDcgQEAKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAKIAlpZiAoZmxzID09IE5VTEwgfHwgZmxzLT5jaGlwX2FkZHIgIT0gZ19jaGlwX2FkZHJfbWFnaWNfdmFsdWUpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImhjaV93cml0ZSBpbnZhbGlkIHBhcmFtc1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImhjaV93cml0ZSBpbnZhbGlkIHBhcmFtc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjIwNSw3ICsyMjAyLDcgQEAKIAl3aGlsZSAoY291bnQgPj0gMikgewogCQlzdGF0dXMgPSBjaGlwaW9fd3JpdGUoY29kZWMsIGRhdGFbMF0sIGRhdGFbMV0pOwogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImhjaV93cml0ZSBjaGlwaW8gZmFpbGVkXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgImhjaV93cml0ZSBjaGlwaW8gZmFpbGVkXG4iKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KIAkJY291bnQgLT0gMjsKQEAgLTIyNjUsMTIgKzIyNjIsMTIgQEAKIAl9CiAKIAlpZiAoaGNpX3dyaXRlICYmICghZmxzIHx8IGlzX2xhc3QoZmxzKSkpIHsKLQkJc25kX3ByaW50ZGQoImhjaV93cml0ZVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImhjaV93cml0ZVxuIik7CiAJCXJldHVybiBkc3B4ZnJfaGNpX3dyaXRlKGNvZGVjLCBoY2lfd3JpdGUpOwogCX0KIAogCWlmIChmbHMgPT0gTlVMTCB8fCBkbWFfZW5naW5lID09IE5VTEwgfHwgcG9ydF9tYXBfbWFzayA9PSAwKSB7Ci0JCXNuZF9wcmludGRkKCJJbnZhbGlkIFBhcmFtc1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkludmFsaWQgUGFyYW1zXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjg2LDcgKzIyODMsNyBAQAogCWlmICghVUNfUkFOR0UoY2hpcF9hZGR4LCB3b3Jkc190b193cml0ZSkgJiYKIAkgICAgIVhfUkFOR0VfQUxMKGNoaXBfYWRkeCwgd29yZHNfdG9fd3JpdGUpICYmCiAJICAgICFZX1JBTkdFX0FMTChjaGlwX2FkZHgsIHdvcmRzX3RvX3dyaXRlKSkgewotCQlzbmRfcHJpbnRkZCgiSW52YWxpZCBjaGlwX2FkZHggUGFyYW1zXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiSW52YWxpZCBjaGlwX2FkZHggUGFyYW1zXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjk2LDcgKzIyOTMsNyBAQAogCWJ1ZmZlcl9hZGR4ID0gZG1hX2dldF9idWZmZXJfYWRkcihkbWFfZW5naW5lKTsKIAogCWlmIChidWZmZXJfYWRkeCA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJkbWFfZW5naW5lIGJ1ZmZlciBOVUxMXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZG1hX2VuZ2luZSBidWZmZXIgTlVMTFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjMwOSw3ICsyMzA2LDcgQEAKIAkJCShudW1fY2hhbnMgKiBzYW1wbGVfcmF0ZV9tdWwgLyBzYW1wbGVfcmF0ZV9kaXYpKTsKIAogCWlmIChoZGFfZnJhbWVfc2l6ZV93b3JkcyA9PSAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJmcm1zeiB6ZXJvXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZnJtc3ogemVyb1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjMxNywxNCArMjMxNCwxNCBAQAogCQkJCSh1bnNpZ25lZCBpbnQpKFVDX1JBTkdFKGNoaXBfYWRkeCwgMSkgPwogCQkJCTY1NTM2IDogMzI3NjgpKTsKIAlidWZmZXJfc2l6ZV93b3JkcyAtPSBidWZmZXJfc2l6ZV93b3JkcyAlIGhkYV9mcmFtZV9zaXplX3dvcmRzOwotCXNuZF9wcmludGRkKAorCWNvZGVjX2RiZyhjb2RlYywKIAkJICAgImNocGFkcj0weCUwOHggZnJtc3o9JXUgbmNoYW49JXUgIgogCQkgICAicmF0ZV9tdWw9JXUgZGl2PSV1IGJ1ZnN6PSV1XG4iLAogCQkgICBjaGlwX2FkZHgsIGhkYV9mcmFtZV9zaXplX3dvcmRzLCBudW1fY2hhbnMsCiAJCSAgIHNhbXBsZV9yYXRlX211bCwgc2FtcGxlX3JhdGVfZGl2LCBidWZmZXJfc2l6ZV93b3Jkcyk7CiAKIAlpZiAoYnVmZmVyX3NpemVfd29yZHMgPCBoZGFfZnJhbWVfc2l6ZV93b3JkcykgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZHNweGZyX29uZV9zZWc6ZmFpbGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNweGZyX29uZV9zZWc6ZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzM4LDcgKzIzMzUsNyBAQAogCiAJd2hpbGUgKHdvcmRzX3RvX3dyaXRlICE9IDApIHsKIAkJcnVuX3NpemVfd29yZHMgPSBtaW4oYnVmZmVyX3NpemVfd29yZHMsIHdvcmRzX3RvX3dyaXRlKTsKLQkJc25kX3ByaW50ZGQoImRzcHhmciAoc2VnIGxvb3ApY250PSV1IHJzPSV1IHJlbWFpbmRlcj0ldVxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNweGZyIChzZWcgbG9vcCljbnQ9JXUgcnM9JXUgcmVtYWluZGVyPSV1XG4iLAogCQkJICAgIHdvcmRzX3RvX3dyaXRlLCBydW5fc2l6ZV93b3JkcywgcmVtYWluZGVyX3dvcmRzKTsKIAkJZG1hX3hmZXIoZG1hX2VuZ2luZSwgZGF0YSwgcnVuX3NpemVfd29yZHMqc2l6ZW9mKHUzMikpOwogCQlpZiAoIWNvbW1fZG1hX3NldHVwX2RvbmUpIHsKQEAgLTIzNjAsNyArMjM1Nyw3IEBACiAJCWlmIChzdGF0dXMgPCAwKQogCQkJcmV0dXJuIHN0YXR1czsKIAkJaWYgKCFkc3BfaXNfZG1hX2FjdGl2ZShjb2RlYywgZG1hX2NoYW4pKSB7Ci0JCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZHNweGZyOkRNQSBkaWQgbm90IHN0YXJ0XG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgImRzcHhmcjpETUEgZGlkIG5vdCBzdGFydFxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlzdGF0dXMgPSBkbWFfc2V0X3N0YXRlKGRtYV9lbmdpbmUsIERNQV9TVEFURV9SVU4pOwpAQCAtMjM5Miw3ICsyMzg5LDcgQEAKIAkJaWYgKGRtYV9hY3RpdmUpCiAJCQlicmVhazsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIisrKysrIERNQSBjb21wbGV0ZVxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIisrKysrIERNQSBjb21wbGV0ZVxuIik7CiAJCWRtYV9zZXRfc3RhdGUoZG1hX2VuZ2luZSwgRE1BX1NUQVRFX1NUT1ApOwogCQlzdGF0dXMgPSBkbWFfcmVzZXQoZG1hX2VuZ2luZSk7CiAKQEAgLTI0NjYsNyArMjQ2Myw3IEBACiAJCQkJCWhkYV9mb3JtYXQsICZyZXNwb25zZSk7CiAKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAic2V0IGNvbnZlcnRlciBmb3JtYXQgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgInNldCBjb252ZXJ0ZXIgZm9ybWF0IGZhaWxcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0yNDgxLDcgKzI0NzgsNyBAQAogCWlmIChvdmx5KSB7CiAJCXN0YXR1cyA9IGRzcGlvX2FsbG9jX2RtYV9jaGFuKGNvZGVjLCAmZG1hX2NoYW4pOwogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImFsbG9jIGRtYWNoYW4gZmFpbFxuIik7CisJCQljb2RlY19kYmcoY29kZWMsICJhbGxvYyBkbWFjaGFuIGZhaWxcbiIpOwogCQkJZG1hX2NoYW4gPSBJTlZBTElEX0RNQV9DSEFOTkVMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0yNDkxLDcgKzI0ODgsNyBAQAogCXN0YXR1cyA9IGRzcF9hbGxvY2F0ZV9wb3J0c19mb3JtYXQoY29kZWMsIGhkYV9mb3JtYXQsCiAJCQkJCSZwb3J0X21hcF9tYXNrKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiYWxsb2MgcG9ydHMgZmFpbFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImFsbG9jIHBvcnRzIGZhaWxcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0yNDk5LDEzICsyNDk2LDEzIEBACiAJc3RhdHVzID0gY29kZWNfc2V0X2NvbnZlcnRlcl9zdHJlYW1fY2hhbm5lbChjb2RlYywKIAkJCVdJREdFVF9DSElQX0NUUkwsIHN0cmVhbV9pZCwgMCwgJnJlc3BvbnNlKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAic2V0IHN0cmVhbSBjaGFuIGZhaWxcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJzZXQgc3RyZWFtIGNoYW4gZmFpbFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAl3aGlsZSAoKGZsc19kYXRhICE9IE5VTEwpICYmICFpc19sYXN0KGZsc19kYXRhKSkgewogCQlpZiAoIWlzX3ZhbGlkKGZsc19kYXRhKSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIkZMUyBjaGVjayBmYWlsXG4iKTsKKwkJCWNvZGVjX2RiZyhjb2RlYywgIkZMUyBjaGVjayBmYWlsXG4iKTsKIAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTI1NDgsNyArMjU0NSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRzcGxvYWRfcG9zdF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIi0tLS0gZHNwbG9hZF9wb3N0X3NldHVwIC0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0tLSBkc3Bsb2FkX3Bvc3Rfc2V0dXAgLS0tLS0tXG4iKTsKIAogCS8qc2V0IERTUCBzcGVha2VyIHRvIDIuMCBjb25maWd1cmF0aW9uKi8KIAljaGlwaW9fd3JpdGUoY29kZWMsIFhSQU1fWFJBTV9JTlNUX09GRlNFVCgweDE4KSwgMHgwODA4MDA4MCk7CkBAIC0yNTg2LDcgKzI1ODMsNyBAQAogCXVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZTsKIAl1bnNpZ25lZCBzaG9ydCBjaGFubmVsczsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiLS0tLSBkc3Bsb2FkX2ltYWdlIGJlZ2luIC0tLS0tLVxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiLS0tLSBkc3Bsb2FkX2ltYWdlIGJlZ2luIC0tLS0tLVxuIik7CiAJaWYgKHJvdXRlcl9jaGFucyA9PSAwKSB7CiAJCWlmICghb3ZseSkKIAkJCXJvdXRlcl9jaGFucyA9IERNQV9UUkFOU0ZFUl9GUkFNRV9TSVpFX05XT1JEUzsKQEAgLTI2MDMsMjcgKzI2MDAsMjcgQEAKIAl9CiAKIAlkbyB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiUmVhZHkgdG8gcHJvZ3JhbSBETUFcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJSZWFkeSB0byBwcm9ncmFtIERNQVxuIik7CiAJCWlmICghb3ZseSkKIAkJCXN0YXR1cyA9IGRzcF9yZXNldChjb2RlYyk7CiAKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlicmVhazsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImRzcF9yZXNldCgpIGNvbXBsZXRlXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiZHNwX3Jlc2V0KCkgY29tcGxldGVcbiIpOwogCQlzdGF0dXMgPSBkc3B4ZnJfaW1hZ2UoY29kZWMsIGZscywgcmVsb2MsIHNhbXBsZV9yYXRlLCBjaGFubmVscywKIAkJCQkgICAgICBvdmx5KTsKIAogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiZHNweGZyX2ltYWdlKCkgY29tcGxldGVcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJkc3B4ZnJfaW1hZ2UoKSBjb21wbGV0ZVxuIik7CiAJCWlmIChhdXRvc3RhcnQgJiYgIW92bHkpIHsKIAkJCWRzcGxvYWRfcG9zdF9zZXR1cChjb2RlYyk7CiAJCQlzdGF0dXMgPSBkc3Bfc2V0X3J1bl9zdGF0ZShjb2RlYyk7CiAJCX0KIAotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIkxPQUQgRklOSVNIRURcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJMT0FEIEZJTklTSEVEXG4iKTsKIAl9IHdoaWxlICgwKTsKIAogCXJldHVybiBzdGF0dXM7CkBAIC0zMTMyLDcgKzMxMjksNyBAQAogCXVuc2lnbmVkIGludCB0bXA7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3NlbGVjdF9vdXRcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9zZWxlY3Rfb3V0XG4iKTsKIAogCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOwogCkBAIC0zMTUwLDcgKzMxNDcsNyBAQAogCQlzcGVjLT5jdXJfb3V0X3R5cGUgPSBTUEVBS0VSX09VVDsKIAogCWlmIChzcGVjLT5jdXJfb3V0X3R5cGUgPT0gU1BFQUtFUl9PVVQpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfc2VsZWN0X291dCBzcGVha2VyXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3NlbGVjdF9vdXQgc3BlYWtlclxuIik7CiAJCS8qc3BlYWtlciBvdXQgY29uZmlnKi8KIAkJdG1wID0gRkxPQVRfT05FOwogCQllcnIgPSBkc3Bpb19zZXRfdWludF9wYXJhbShjb2RlYywgMHg4MCwgMHgwNCwgdG1wKTsKQEAgLTMxODMsNyArMzE4MCw3IEBACiAJCXNuZF9oZGFfc2V0X3Bpbl9jdGwoY29kZWMsIHNwZWMtPm91dF9waW5zWzBdLAogCQkJCSAgICBwaW5fY3RsIHwgUElOX09VVCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfc2VsZWN0X291dCBocFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9zZWxlY3Rfb3V0IGhwXG4iKTsKIAkJLypoZWFkcGhvbmUgb3V0IGNvbmZpZyovCiAJCXRtcCA9IEZMT0FUX1pFUk87CiAJCWVyciA9IGRzcGlvX3NldF91aW50X3BhcmFtKGNvZGVjLCAweDgwLCAweDA0LCB0bXApOwpAQCAtMzI4OCw3ICszMjg1LDcgQEAKIAlpbnQgamFja19wcmVzZW50OwogCWludCBhdXRvX2phY2s7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9zZWxlY3RfbWljXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfc2VsZWN0X21pY1xuIik7CiAKIAlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKIApAQCAtMzQxMCw3ICszNDA3LDcgQEAKIAkJCXZhbCA9IDA7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfZWZmZWN0X3NldDogbmlkPTB4JXgsIHZhbD0lbGRcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX2VmZmVjdF9zZXQ6IG5pZD0weCV4LCB2YWw9JWxkXG4iLAogCQkgICAgbmlkLCB2YWwpOwogCiAJb24gPSAodmFsID09IDApID8gRkxPQVRfWkVSTyA6IEZMT0FUX09ORTsKQEAgLTM0MzIsNyArMzQyOSw3IEBACiAJaGRhX25pZF90IG5pZDsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3BlX3N3aXRjaF9zZXQ6IHZhbD0lbGRcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3BlX3N3aXRjaF9zZXQ6IHZhbD0lbGRcbiIsCiAJCSAgICBzcGVjLT5lZmZlY3RzX3N3aXRjaFtQTEFZX0VOSEFOQ0VNRU5UIC0gRUZGRUNUX1NUQVJUX05JRF0pOwogCiAJaSA9IE9VVF9FRkZFQ1RfU1RBUlRfTklEIC0gRUZGRUNUX1NUQVJUX05JRDsKQEAgLTM0NzgsNyArMzQ3NSw3IEBACiAJaW50IGksIHJldCA9IDA7CiAJdW5zaWduZWQgaW50IG9sZHZhbDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX2N2b2ljZV9zd2l0Y2hfc2V0OiB2YWw9JWxkXG4iLAorCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl9jdm9pY2Vfc3dpdGNoX3NldDogdmFsPSVsZFxuIiwKIAkJICAgIHNwZWMtPmVmZmVjdHNfc3dpdGNoW0NSWVNUQUxfVk9JQ0UgLSBFRkZFQ1RfU1RBUlRfTklEXSk7CiAKIAlpID0gSU5fRUZGRUNUX1NUQVJUX05JRCAtIEVGRkVDVF9TVEFSVF9OSUQ7CkBAIC0zNjA4LDcgKzM2MDUsNyBAQAogCWlmIChzZWwgPj0gaXRlbXMpCiAJCXJldHVybiAwOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjYTAxMzJfdm9pY2VmeF9wdXQ6IHNlbD0lZCwgcHJlc2V0PSVzXG4iLAorCWNvZGVjX2RiZyhjb2RlYywgImNhMDEzMl92b2ljZWZ4X3B1dDogc2VsPSVkLCBwcmVzZXQ9JXNcbiIsCiAJCSAgICBzZWwsIGNhMDEzMl92b2ljZWZ4X3ByZXNldHNbc2VsXS5uYW1lKTsKIAogCS8qCkBAIC0zNjc5LDcgKzM2NzYsNyBAQAogCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKIAlpbnQgY2hhbmdlZCA9IDE7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImNhMDEzMl9zd2l0Y2hfcHV0OiBuaWQ9MHgleCwgdmFsPSVsZFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfc3dpdGNoX3B1dDogbmlkPTB4JXgsIHZhbD0lbGRcbiIsCiAJCSAgICBuaWQsICp2YWxwKTsKIAogCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOwpAQCAtNDE0Miw3ICs0MTM5LDcgQEAKIAl1OCB2YWw7CiAJdW5zaWduZWQgaW50IG9sZHZhbDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3NldF9kbWljOiBlbmFibGU9JWRcbiIsIGVuYWJsZSk7CisJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3NldF9kbWljOiBlbmFibGU9JWRcbiIsIGVuYWJsZSk7CiAKIAlvbGR2YWwgPSBzdG9wX21pYzEoY29kZWMpOwogCWNhMDEzMl9zZXRfdmlwc291cmNlKGNvZGVjLCAwKTsKQEAgLTQyNTAsNyArNDI0Nyw3IEBACiAJaW50IGk7CiAJaGRhX25pZF90IG5pZDsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3JlZnJlc2hfd2lkZ2V0X2NhcHMuXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfcmVmcmVzaF93aWRnZXRfY2Fwcy5cbiIpOwogCW5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7CiAJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fbm9kZXM7IGkrKywgbmlkKyspCiAJCWNvZGVjLT53Y2Fwc1tpXSA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLApAQCAtNDM5NCw3ICs0MzkxLDcgQEAKIHsKIAlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAotCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiY2EwMTMyX3Byb2Nlc3NfZHNwX3Jlc3BvbnNlXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfcHJvY2Vzc19kc3BfcmVzcG9uc2VcbiIpOwogCWlmIChzcGVjLT53YWl0X3NjcCkgewogCQlpZiAoZHNwaW9fZ2V0X3Jlc3BvbnNlX2RhdGEoY29kZWMpID49IDApCiAJCQlzcGVjLT53YWl0X3NjcCA9IDA7CkBAIC00NDEzLDcgKzQ0MTAsNyBAQAogCQlyZXMgPSBzbmRfaGRhX2phY2tfZ2V0X2FjdGlvbihjb2RlYywKIAkJCQkocmVzID4+IEFDX1VOU09MX1JFU19UQUdfU0hJRlQpICYgMHgzZik7CiAKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJzbmRfaGRhX2phY2tfZ2V0X2FjdGlvbjogMHgleFxuIiwgcmVzKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAic25kX2hkYV9qYWNrX2dldF9hY3Rpb246IDB4JXhcbiIsIHJlcyk7CiAKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSBVTlNPTF9UQUdfSFA6CkBAIC00NjU4LDcgKzQ2NTUsNyBAQAogCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYzsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ZGQoInBhdGNoX2NhMDEzMlxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAicGF0Y2hfY2EwMTMyXG4iKTsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmICghc3BlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCmluZGV4IGZjNDkyYWMuLjM4N2YwYjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYwpAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwppbmRleCA5YzZjZTczLi4wNjFlYTU5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgpAQCAtMzIsNiArMzEsOSBAQAogI2luY2x1ZGUgImhkYV9qYWNrLmgiCiAjaW5jbHVkZSAiaGRhX2dlbmVyaWMuaCIKIAorI3VuZGVmIEVOQUJMRV9DTUlfU1RBVElDX1FVSVJLUworCisjaWZkZWYgRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTCiAjZGVmaW5lIE5VTV9QSU5TCTExCiAKIApAQCAtNDUsMTAgKzQ3LDEyIEBACiAJQ01JX0FVVE8sCS8qIGxldCBkcml2ZXIgZ3Vlc3MgaXQgKi8KIAlDTUlfTU9ERUxTCiB9OworI2VuZGlmIC8qIEVOQUJMRV9DTUlfU1RBVElDX1FVSVJLUyAqLwogCiBzdHJ1Y3QgY21pX3NwZWMgewogCXN0cnVjdCBoZGFfZ2VuX3NwZWMgZ2VuOwogCisjaWZkZWYgRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTCiAJLyogYmVsb3cgYXJlIG9ubHkgZm9yIHN0YXRpYyBtb2RlbHMgKi8KIAogCWludCBib2FyZF9jb25maWc7CkBAIC04MSw4ICs4NSwxMCBAQAogCiAJLyogbXVsdGljaGFubmVsIHBpbnMgKi8KIAlzdHJ1Y3QgaGRhX3ZlcmIgbXVsdGlfaW5pdFs5XTsJLyogMiB2ZXJicyBmb3IgZWFjaCBwaW4gKyB0ZXJtaW5hdG9yICovCisjZW5kaWYgLyogRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTICovCiB9OwogCisjaWZkZWYgRU5BQkxFX0NNSV9TVEFUSUNfUVVJUktTCiAvKgogICogaW5wdXQgTVVYCiAgKi8KQEAgLTU2Niw2ICs1NzIsNyBAQAogCS5pbml0ID0gY21pOTg4MF9pbml0LAogCS5mcmVlID0gY21pOTg4MF9mcmVlLAogfTsKKyNlbmRpZiAvKiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MgKi8KIAogLyoKICAqIHN0dWZmIGZvciBhdXRvLXBhcnNlcgpAQCAtNTg4LDE1ICs1OTUsMjAgQEAKIAogCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZmNmZyhjb2RlYywgY2ZnLCBOVUxMLCAwKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJvcjsKIAllcnIgPSBzbmRfaGRhX2dlbl9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgY2ZnKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJvcjsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBjbWlfYXV0b19wYXRjaF9vcHM7CiAJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlzbmRfaGRhX2dlbl9mcmVlKGNvZGVjKTsKKwlyZXR1cm4gZXJyOwogfQogCisKIHN0YXRpYyBpbnQgcGF0Y2hfY21pOTg4MChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY21pX3NwZWMgKnNwZWM7CkBAIC02MDYsMjMgKzYxOCwxOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNvZGVjLT5zcGVjID0gc3BlYzsKKyNpZmRlZiBFTkFCTEVfQ01JX1NUQVRJQ19RVUlSS1MKIAlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQ01JX01PREVMUywKIAkJCQkJCQljbWk5ODgwX21vZGVscywKIAkJCQkJCQljbWk5ODgwX2NmZ190YmwpOwogCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAorCQljb2RlY19kYmcoY29kZWMsICIlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAogCQkJICAgIGNvZGVjLT5jaGlwX25hbWUpOwogCQlzcGVjLT5ib2FyZF9jb25maWcgPSBDTUlfQVVUTzsgLyogdHJ5IGV2ZXJ5dGhpbmcgKi8KIAl9CiAKLQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID09IENNSV9BVVRPKSB7Ci0JCWludCBlcnIgPSBjbWlfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX2hkYV9nZW5fZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID09IENNSV9BVVRPKQorCQlyZXR1cm4gY21pX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKIAogCS8qIGNvcHkgZGVmYXVsdCBEQUMgTklEcyAqLwogCW1lbWNweShzcGVjLT5kYWNfbmlkcywgY21pOTg4MF9kYWNfbmlkcywgc2l6ZW9mKHNwZWMtPmRhY19uaWRzKSk7CkBAIC02NjksNiArNjc2LDkgQEAKIAljb2RlYy0+cGF0Y2hfb3BzID0gY21pOTg4MF9wYXRjaF9vcHM7CiAKIAlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIGNtaV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisjZW5kaWYKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwppbmRleCBiY2Y5MWJlLi4xZGM3ZTk3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CkBAIC0zNSw3ICszNCw3IEBACiAjaW5jbHVkZSAiaGRhX2phY2suaCIKICNpbmNsdWRlICJoZGFfZ2VuZXJpYy5oIgogCi0jZGVmaW5lIEVOQUJMRV9DWFRfU1RBVElDX1FVSVJLUworI3VuZGVmIEVOQUJMRV9DWFRfU1RBVElDX1FVSVJLUwogCiAjZGVmaW5lIENYVF9QSU5fRElSX0lOICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIENYVF9QSU5fRElSX09VVCAgICAgICAgICAgICAweDAxCkBAIC02OCw2ICs2NywxMiBAQAogCiAJdW5zaWduZWQgaW50IHBhcnNlX2ZsYWdzOyAvKiBmbGFnIGZvciBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZjZmcoKSAqLwogCisJLyogT1BMQyBYTyBzcGVjaWZpYyAqLworCWJvb2wgcmVjb3JkaW5nOworCWJvb2wgZGNfZW5hYmxlOworCXVuc2lnbmVkIGludCBkY19pbnB1dF9iaWFzOyAvKiBvZmZzZXQgaW50byBvbHBjX3hvX2RjX2JpYXMgKi8KKwlzdHJ1Y3QgbmlkX3BhdGggKmRjX21vZGVfcGF0aDsKKwogI2lmZGVmIEVOQUJMRV9DWFRfU1RBVElDX1FVSVJLUwogCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICptaXhlcnNbNV07CiAJaW50IG51bV9taXhlcnM7CkBAIC0xMjMsMTkgKzEyOCw2IEBACiAJdW5zaWduZWQgaW50IGhwX2xhcHRvcDoxOwogCXVuc2lnbmVkIGludCBhc3VzOjE7CiAKLQl1bnNpZ25lZCBpbnQgZXh0X21pY19wcmVzZW50OwotCXVuc2lnbmVkIGludCByZWNvcmRpbmc7Ci0Jdm9pZCAoKmNhcHR1cmVfcHJlcGFyZSkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotCXZvaWQgKCpjYXB0dXJlX2NsZWFudXApKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKLQotCS8qIE9MUEMgWE8tMS41IHN1cHBvcnRzIERDIGlucHV0IG1vZGUgKGUuZy4gZm9yIHVzZSB3aXRoIGFuYWxvZyBzZW5zb3JzKQotCSAqIHRocm91Z2ggdGhlIG1pY3JvcGhvbmUgamFjay4KLQkgKiBXaGVuIHRoZSB1c2VyIGVuYWJsZXMgdGhpcyB0aHJvdWdoIGEgbWl4ZXIgc3dpdGNoLCBib3RoIGludGVybmFsIGFuZAotCSAqIGV4dGVybmFsIG1pY3JvcGhvbmVzIGFyZSBkaXNhYmxlZC4gR2FpbiBpcyBmaXhlZCBhdCAwZEIuIEluIHRoaXMgbW9kZSwKLQkgKiB3ZSBhbHNvIGFsbG93IHRoZSBiaWFzIHRvIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIHNlcGFyYXRlIG1peGVyCi0JICogY29udHJvbC4gKi8KLQl1bnNpZ25lZCBpbnQgZGNfZW5hYmxlOwotCXVuc2lnbmVkIGludCBkY19pbnB1dF9iaWFzOyAvKiBvZmZzZXQgaW50byBjeHQ1MDY2X29scGNfZGNfYmlhcyAqLwogCXVuc2lnbmVkIGludCBtaWNfYm9vc3Q7IC8qIG9mZnNldCBpbnRvIGN4dDUwNjZfYW5hbG9nX21pY19ib29zdCAqLwogI2VuZGlmIC8qIEVOQUJMRV9DWFRfU1RBVElDX1FVSVJLUyAqLwogfTsKQEAgLTI1Myw4ICsyNDUsNiBAQAogCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaWYgKHNwZWMtPmNhcHR1cmVfcHJlcGFyZSkKLQkJc3BlYy0+Y2FwdHVyZV9wcmVwYXJlKGNvZGVjKTsKIAlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdLAogCQkJCSAgIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CiAJcmV0dXJuIDA7CkBAIC0yNjYsOCArMjU2LDYgQEAKIHsKIAlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXNuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXSk7Ci0JaWYgKHNwZWMtPmNhcHR1cmVfY2xlYW51cCkKLQkJc3BlYy0+Y2FwdHVyZV9jbGVhbnVwKGNvZGVjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU3LDkgKzQ0NSw3IEBACiAKIHN0YXRpYyB2b2lkIGNvbmV4YW50X2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShjb2RlYyk7Ci0Ja2ZyZWUoc3BlYyk7CisJa2ZyZWUoY29kZWMtPnNwZWMpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0X2NhcHR1cmVfbWl4ZXJzW10gPSB7CkBAIC02NzMsMTQgKzY1OSw2IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGN4dDUwNDVfY2FwdHVyZV9zb3VyY2VfaHA1MzAgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAgICAgICAgICAweDEgfSwKLQkJeyAiSW50ZXJuYWwgTWljIiwgMHgyIH0sCi0JfQotfTsKLQogLyogdHVybiBvbi9vZmYgRUFQRCAoKyBtdXRlIEhQKSBhcyBhIG1hc3RlciBzd2l0Y2ggKi8KIHN0YXRpYyBpbnQgY3h0NTA0NV9ocF9tYXN0ZXJfc3dfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTc5NiwyOCArNzc0LDYgQEAKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNDVfbWl4ZXJzX2hwNTMwW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDFhLCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmY3h0NTA0NV9ocF9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuaW5mbyA9IGN4dF9lYXBkX2luZm8sCi0JCS5nZXQgPSBjeHRfZWFwZF9nZXQsCi0JCS5wdXQgPSBjeHQ1MDQ1X2hwX21hc3Rlcl9zd19wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMHgxMCwKLQl9LAotCi0Je30KLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0NV9pbml0X3ZlcmJzW10gPSB7CiAJLyogTGluZSBpbiwgTWljICovCiAJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfEFDX1BJTkNUTF9WUkVGXzgwIH0sCkBAIC0xMDAwLDcgKzk1Niw2IEBACiAJQ1hUNTA0NV9MQVBUT1BfTUlDU0VOU0UsCiAJQ1hUNTA0NV9MQVBUT1BfSFBNSUNTRU5TRSwKIAlDWFQ1MDQ1X0JFTlEsCi0JQ1hUNTA0NV9MQVBUT1BfSFA1MzAsCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwogCUNYVDUwNDVfVEVTVCwKICNlbmRpZgpAQCAtMTAxMyw3ICs5NjgsNiBAQAogCVtDWFQ1MDQ1X0xBUFRPUF9NSUNTRU5TRV0JPSAibGFwdG9wLW1pY3NlbnNlIiwKIAlbQ1hUNTA0NV9MQVBUT1BfSFBNSUNTRU5TRV0JPSAibGFwdG9wLWhwbWljc2Vuc2UiLAogCVtDWFQ1MDQ1X0JFTlFdCQkJPSAiYmVucSIsCi0JW0NYVDUwNDVfTEFQVE9QX0hQNTMwXQkJPSAibGFwdG9wLWhwNTMwIiwKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJW0NYVDUwNDVfVEVTVF0JCT0gInRlc3QiLAogI2VuZGlmCkBAIC0xMDIxLDggKzk3NSw2IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0NV9jZmdfdGJsW10gPSB7Ci0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBkNSwgIkhQIDUzMCIsIENYVDUwNDVfTEFQVE9QX0hQNTMwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjMxLCAiVG9zaGliYSBQMTA1IiwgQ1hUNTA0NV9MQVBUT1BfTUlDU0VOU0UpLAogCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3NTMsICJCZW5xIFI1NUUiLCBDWFQ1MDQ1X0JFTlEpLAogCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwYWQsICJGdWppdHN1IFNpMTUyMCIsIENYVDUwNDVfTEFQVE9QX01JQ1NFTlNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMGNiLCAiRnVqaXRzdSBTaTM1MTUiLCBDWFQ1MDQ1X0xBUFRPUF9IUE1JQ1NFTlNFKSwKQEAgLTExMTMsMTQgKzEwNjUsNiBAQAogCQlzcGVjLT5udW1fbWl4ZXJzID0gMjsKIAkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA0NV9pbml0OwogCQlicmVhazsKLQljYXNlIENYVDUwNDVfTEFQVE9QX0hQNTMwOgotCQljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gY3h0NTA0NV9ocF91bnNvbF9ldmVudDsKLQkJc3BlYy0+aW5wdXRfbXV4ID0gJmN4dDUwNDVfY2FwdHVyZV9zb3VyY2VfaHA1MzA7Ci0JCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMjsKLQkJc3BlYy0+aW5pdF92ZXJic1sxXSA9IGN4dDUwNDVfaHBfc2Vuc2VfaW5pdF92ZXJiczsKLQkJc3BlYy0+bWl4ZXJzWzBdID0gY3h0NTA0NV9taXhlcnNfaHA1MzA7Ci0JCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IGN4dDUwNDVfaW5pdDsKLQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwogCWNhc2UgQ1hUNTA0NV9URVNUOgogCQlzcGVjLT5pbnB1dF9tdXggPSAmY3h0NTA0NV90ZXN0X2NhcHR1cmVfc291cmNlOwpAQCAtMTk0MCwxMSArMTg4NCw2IEBACiBzdGF0aWMgY29uc3QgaGRhX25pZF90IGN4dDUwNjZfY2Fwc3JjX25pZHNbMV0gPSB7IDB4MTcgfTsKIHN0YXRpYyBjb25zdCBoZGFfbmlkX3QgY3h0NTA2Nl9kaWdvdXRfcGluX25pZHNbMl0gPSB7IDB4MjAsIDB4MjIgfTsKIAotLyogT0xQQydzIG1pY3JvcGhvbmUgcG9ydCBpcyBEQyBjb3VwbGVkIGZvciB1c2Ugd2l0aCBleHRlcm5hbCBzZW5zb3JzLAotICogdGhlcmVmb3JlIHdlIHVzZSBhIDUwJSBtaWMgYmlhcyBpbiBvcmRlciB0byBjZW50ZXIgdGhlIGlucHV0IHNpZ25hbCB3aXRoCi0gKiB0aGUgREMgaW5wdXQgcmFuZ2Ugb2YgdGhlIGNvZGVjLiAqLwotI2RlZmluZSBDWFQ1MDY2X09MUENfRVhUX01JQ19CSUFTIFBJTl9WUkVGNTAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGN4dDUwNjZfbW9kZXNbMV0gPSB7CiAJeyAyLCBOVUxMIH0sCiB9OwpAQCAtMTk1OSw3ICsxODk4LDggQEAKIAlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXVuc2lnbmVkIGludCBwaW5jdGw7CiAKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogdXBkYXRlIHNwZWFrZXIsIGhwX3ByZXNlbnQ9JWQsIGN1cl9lYXBkPSVkXG4iLAorCWNvZGVjX2RiZyhjb2RlYywKKwkJICAiQ1hUNTA2NjogdXBkYXRlIHNwZWFrZXIsIGhwX3ByZXNlbnQ9JWQsIGN1cl9lYXBkPSVkXG4iLAogCQkgICAgc3BlYy0+aHBfcHJlc2VudCwgc3BlYy0+Y3VyX2VhcGQpOwogCiAJLyogUG9ydCBBIChIUCkgKi8KQEAgLTE5OTcsODggKzE5MzcsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggY3h0NTA2Nl9vbHBjX2RjX2JpYXMgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJPZmYiLCBQSU5fSU4gfSwKLQkJeyAiNTAlIiwgUElOX1ZSRUY1MCB9LAotCQl7ICI4MCUiLCBQSU5fVlJFRjgwIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgY3h0NTA2Nl9zZXRfb2xwY19kY19iaWFzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JLyogRXZlbiB0aG91Z2ggcG9ydCBGIGlzIHRoZSBEQyBpbnB1dCwgdGhlIGJpYXMgaXMgY29udHJvbGxlZCBvbiBwb3J0IEIuCi0JICogd2UgYWxzbyBsZWF2ZSB0aGF0IHBvcnQgYXMgYW4gYWN0aXZlIGlucHV0IChidXQgdW5zZWxlY3RlZCkgaW4gREMgbW9kZQotCSAqIGp1c3QgaW4gY2FzZSB0aGF0IGlzIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBiaWFzIHNldHRpbmcgdGFrZSBlZmZlY3QuICovCi0JcmV0dXJuIHNuZF9oZGFfc2V0X3Bpbl9jdGxfY2FjaGUoY29kZWMsIDB4MWEsCi0JCWN4dDUwNjZfb2xwY19kY19iaWFzLml0ZW1zW3NwZWMtPmRjX2lucHV0X2JpYXNdLmluZGV4KTsKLX0KLQotLyogT0xQQyBkZWZlcnMgbWljIHdpZGdldCBjb250cm9sIHVudGlsIHdoZW4gY2FwdHVyZSBpcyBzdGFydGVkIGJlY2F1c2UgdGhlCi0gKiBtaWNyb3Bob25lIExFRCBjb21lcyBvbiBhcyBzb29uIGFzIHRoZXNlIHNldHRpbmdzIGFyZSBwdXQgaW4gcGxhY2UuIGlmIHdlCi0gKiBkaWQgdGhpcyBiZWZvcmUgcmVjb3JkaW5nLCBpdCB3b3VsZCBnaXZlIHRoZSBmYWxzZSBpbmRpY2F0aW9uIHRoYXQgcmVjb3JkaW5nCi0gKiBpcyBoYXBwZW5pbmcgd2hlbiBpdCBpcyBub3QuICovCi1zdGF0aWMgdm9pZCBjeHQ1MDY2X29scGNfc2VsZWN0X21pYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWlmICghc3BlYy0+cmVjb3JkaW5nKQotCQlyZXR1cm47Ci0KLQlpZiAoc3BlYy0+ZGNfZW5hYmxlKSB7Ci0JCS8qIGluIERDIG1vZGUgd2UgaWdub3JlIHByZXNlbmNlIGRldGVjdGlvbiBhbmQganVzdCB1c2UgdGhlIGphY2sKLQkJICogdGhyb3VnaCBvdXIgc3BlY2lhbCBEQyBwb3J0ICovCi0JCWNvbnN0IHN0cnVjdCBoZGFfdmVyYiBlbmFibGVfZGNfbW9kZVtdID0gewotCQkJLyogZGlzYmxlIGludGVybmFsIG1pYywgcG9ydCBDICovCi0JCQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCQkJLyogZW5hYmxlIERDIGNhcHR1cmUsIHBvcnQgRiAqLwotCQkJezB4MWUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQkJCXt9LAotCQl9OwotCi0JCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGVuYWJsZV9kY19tb2RlKTsKLQkJLyogcG9ydCBCIGlucHV0IGRpc2FibGVkIChhbmQgYmlhcyBzZXQpIHRocm91Z2ggdGhlIGZvbGxvd2luZyBjYWxsICovCi0JCWN4dDUwNjZfc2V0X29scGNfZGNfYmlhcyhjb2RlYyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBkaXNhYmxlIERDIChwb3J0IEYpICovCi0Jc25kX2hkYV9zZXRfcGluX2N0bChjb2RlYywgMHgxZSwgMCk7Ci0KLQkvKiBleHRlcm5hbCBtaWMsIHBvcnQgQiAqLwotCXNuZF9oZGFfc2V0X3Bpbl9jdGwoY29kZWMsIDB4MWEsCi0JCXNwZWMtPmV4dF9taWNfcHJlc2VudCA/IENYVDUwNjZfT0xQQ19FWFRfTUlDX0JJQVMgOiAwKTsKLQotCS8qIGludGVybmFsIG1pYywgcG9ydCBDICovCi0Jc25kX2hkYV9zZXRfcGluX2N0bChjb2RlYywgMHgxYiwKLQkJc3BlYy0+ZXh0X21pY19wcmVzZW50ID8gMCA6IFBJTl9WUkVGODApOwotfQotCi0vKiB0b2dnbGUgaW5wdXQgb2YgYnVpbHQtaW4gYW5kIG1pYyBqYWNrIGFwcHJvcHJpYXRlbHkgKi8KLXN0YXRpYyB2b2lkIGN4dDUwNjZfb2xwY19hdXRvbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JdW5zaWduZWQgaW50IHByZXNlbnQ7Ci0KLQlpZiAoc3BlYy0+ZGNfZW5hYmxlKSAvKiBkb24ndCBkbyBwcmVzZW5jZSBkZXRlY3Rpb24gaW4gREMgbW9kZSAqLwotCQlyZXR1cm47Ci0KLQlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFhLCAwLAotCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7Ci0JaWYgKHByZXNlbnQpCi0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKLQllbHNlCi0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGFic2VudFxuIik7Ci0KLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDE3LCAwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKLQkJcHJlc2VudCA/IDAgOiAxKTsKLQlzcGVjLT5leHRfbWljX3ByZXNlbnQgPSAhIXByZXNlbnQ7Ci0KLQljeHQ1MDY2X29scGNfc2VsZWN0X21pYyhjb2RlYyk7Ci19Ci0KIC8qIHRvZ2dsZSBpbnB1dCBvZiBidWlsdC1pbiBkaWdpdGFsIG1pYyBhbmQgbWljIGphY2sgYXBwcm9wcmlhdGVseSAqLwogc3RhdGljIHZvaWQgY3h0NTA2Nl92b3N0cm9fYXV0b21pYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTIxMTAsMTAgKzE5NjgsMTAgQEAKIAogCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFhKTsKIAlpZiAocHJlc2VudCkgewotCQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX3ByZXNlbnQpOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGFic2VudFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKIAkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZXh0X21pY19hYnNlbnQpOwogCX0KIH0KQEAgLTIxMzgsMTAgKzE5OTYsMTAgQEAKIAogCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFiKTsKIAlpZiAocHJlc2VudCkgewotCQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBkZXRlY3RlZFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX3ByZXNlbnQpOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGFic2VudFxuIik7CisJCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKIAkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZXh0X21pY19hYnNlbnQpOwogCX0KIH0KQEAgLTIxNTMsNyArMjAxMSw3IEBACiAJdW5zaWduZWQgaW50IHByZXNlbnQ7CiAKIAlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxYik7Ci0Jc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgcHJlc2VudD0lZFxuIiwgcHJlc2VudCk7CisJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBwcmVzZW50PSVkXG4iLCBwcmVzZW50KTsKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDE3LCAwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKIAkJCSAgICBwcmVzZW50ID8gMSA6IDApOwogfQpAQCAtMjE2NSw3ICsyMDIzLDcgQEAKIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKIAogCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFiKTsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBwcmVzZW50PSVkXG4iLCBwcmVzZW50KTsKKwljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIHByZXNlbnQ9JWRcbiIsIHByZXNlbnQpOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTcsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAogCQkJICAgIHByZXNlbnQgPyAxIDogMyk7CiB9CkBAIC0yMjA0LDEzICsyMDYyLDEzIEBACiAJZXh0X3ByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFiKTsKIAlkb2NrX3ByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFhKTsKIAlpZiAoZXh0X3ByZXNlbnQpIHsKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgZGV0ZWN0ZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiBleHRlcm5hbCBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKIAkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZXh0X21pY19wcmVzZW50KTsKIAl9IGVsc2UgaWYgKGRvY2tfcHJlc2VudCkgewotCQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogZG9jayBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZG9jayBtaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKIAkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgZG9ja19taWNfcHJlc2VudCk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoIkNYVDUwNjY6IGV4dGVybmFsIG1pY3JvcGhvbmUgYWJzZW50XG4iKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiQ1hUNTA2NjogZXh0ZXJuYWwgbWljcm9waG9uZSBhYnNlbnRcbiIpOwogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBleHRfbWljX2Fic2VudCk7CiAJfQogfQpAQCAtMjIyOSw3ICsyMDg3LDcgQEAKIAogCXNwZWMtPmhwX3ByZXNlbnQgPSBwb3J0QSA/IEhQX1BSRVNFTlRfUE9SVF9BIDogMDsKIAlzcGVjLT5ocF9wcmVzZW50IHw9IHBvcnREID8gSFBfUFJFU0VOVF9QT1JUX0QgOiAwOwotCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBocCBhdXRvbXV0ZSBwb3J0QT0leCBwb3J0RD0leCBwcmVzZW50PSVkXG4iLAorCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGhwIGF1dG9tdXRlIHBvcnRBPSV4IHBvcnREPSV4IHByZXNlbnQ9JWRcbiIsCiAJCXBvcnRBLCBwb3J0RCwgc3BlYy0+aHBfcHJlc2VudCk7CiAJY3h0NTA2Nl91cGRhdGVfc3BlYWtlcihjb2RlYyk7CiB9CkBAIC0yMjUyLDI2ICsyMTEwLDkgQEAKIH0KIAogLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIGphY2sgc2Vuc2luZyAqLwotc3RhdGljIHZvaWQgY3h0NTA2Nl9vbHBjX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVzKQotewotCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc25kX3ByaW50ZGQoIkNYVDUwNjY6IHVuc29sIGV2ZW50ICV4ICgleClcbiIsIHJlcywgcmVzID4+IDI2KTsKLQlzd2l0Y2ggKHJlcyA+PiAyNikgewotCWNhc2UgQ09ORVhBTlRfSFBfRVZFTlQ6Ci0JCWN4dDUwNjZfaHBfYXV0b211dGUoY29kZWMpOwotCQlicmVhazsKLQljYXNlIENPTkVYQU5UX01JQ19FVkVOVDoKLQkJLyogaWdub3JlIG1pYyBldmVudHMgaW4gREMgbW9kZTsgd2UncmUgYWx3YXlzIHVzaW5nIHRoZSBqYWNrICovCi0JCWlmICghc3BlYy0+ZGNfZW5hYmxlKQotCQkJY3h0NTA2Nl9vbHBjX2F1dG9taWMoY29kZWMpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIHVuc29saWNpdGVkIGV2ZW50IGZvciBqYWNrIHNlbnNpbmcgKi8KIHN0YXRpYyB2b2lkIGN4dDUwNjZfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCiB7Ci0Jc25kX3ByaW50ZGQoIkNYVDUwNjY6IHVuc29sIGV2ZW50ICV4ICgleClcbiIsIHJlcywgcmVzID4+IDI2KTsKKwljb2RlY19kYmcoY29kZWMsICJDWFQ1MDY2OiB1bnNvbCBldmVudCAleCAoJXgpXG4iLCByZXMsIHJlcyA+PiAyNik7CiAJc3dpdGNoIChyZXMgPj4gMjYpIHsKIAljYXNlIENPTkVYQU5UX0hQX0VWRU5UOgogCQljeHQ1MDY2X2hwX2F1dG9tdXRlKGNvZGVjKTsKQEAgLTIzMzgsMTI0ICsyMTc5LDEwIEBACiAJCWlkeCA9IGltdXgtPm51bV9pdGVtcyAtIDE7CiAKIAlzcGVjLT5taWNfYm9vc3QgPSBpZHg7Ci0JaWYgKCFzcGVjLT5kY19lbmFibGUpCi0JCWN4dDUwNjZfc2V0X21pY19ib29zdChjb2RlYyk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGN4dDUwNjZfZW5hYmxlX2RjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWNvbnN0IHN0cnVjdCBoZGFfdmVyYiBlbmFibGVfZGNfbW9kZVtdID0gewotCQkvKiBkaXNhYmxlIGdhaW4gKi8KLQkJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCQkvKiBzd2l0Y2ggdG8gREMgaW5wdXQgKi8KLQkJezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAzfSwKLQkJe30KLQl9OwotCi0JLyogY29uZmlndXJlIGFzIGlucHV0IHNvdXJjZSAqLwotCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGVuYWJsZV9kY19tb2RlKTsKLQljeHQ1MDY2X29scGNfc2VsZWN0X21pYyhjb2RlYyk7IC8qIGFsc28gc2V0cyBjb25maWd1cmVkIGJpYXMgKi8KLX0KLQotc3RhdGljIHZvaWQgY3h0NTA2Nl9kaXNhYmxlX2RjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCS8qIHJlY29uZmlndXJlIGlucHV0IHNvdXJjZSAqLwogCWN4dDUwNjZfc2V0X21pY19ib29zdChjb2RlYyk7Ci0JLyogYXV0b21pYyBhbHNvIHNlbGVjdHMgdGhlIHJpZ2h0IG1pYyBpZiB3ZSdyZSByZWNvcmRpbmcgKi8KLQljeHQ1MDY2X29scGNfYXV0b21pYyhjb2RlYyk7Ci19Ci0KLXN0YXRpYyBpbnQgY3h0NTA2Nl9vbHBjX2RjX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwZWMtPmRjX2VuYWJsZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjeHQ1MDY2X29scGNfZGNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBkY19lbmFibGUgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JaWYgKGRjX2VuYWJsZSA9PSBzcGVjLT5kY19lbmFibGUpCi0JCXJldHVybiAwOwotCi0Jc3BlYy0+ZGNfZW5hYmxlID0gZGNfZW5hYmxlOwotCWlmIChkY19lbmFibGUpCi0JCWN4dDUwNjZfZW5hYmxlX2RjKGNvZGVjKTsKLQllbHNlCi0JCWN4dDUwNjZfZGlzYWJsZV9kYyhjb2RlYyk7Ci0KIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBjeHQ1MDY2X29scGNfZGNfYmlhc19lbnVtX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oJmN4dDUwNjZfb2xwY19kY19iaWFzLCB1aW5mbyk7Ci19Ci0KLXN0YXRpYyBpbnQgY3h0NTA2Nl9vbHBjX2RjX2JpYXNfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc3BlYy0+ZGNfaW5wdXRfYmlhczsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjeHQ1MDY2X29scGNfZGNfYmlhc19lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJmN4dDUwNjZfYW5hbG9nX21pY19ib29zdDsKLQl1bnNpZ25lZCBpbnQgaWR4OwotCi0JaWR4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQlpZiAoaWR4ID49IGltdXgtPm51bV9pdGVtcykKLQkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKLQotCXNwZWMtPmRjX2lucHV0X2JpYXMgPSBpZHg7Ci0JaWYgKHNwZWMtPmRjX2VuYWJsZSkKLQkJY3h0NTA2Nl9zZXRfb2xwY19kY19iaWFzKGNvZGVjKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgY3h0NTA2Nl9vbHBjX2NhcHR1cmVfcHJlcGFyZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCS8qIG1hcmsgYXMgcmVjb3JkaW5nIGFuZCBjb25maWd1cmUgdGhlIG1pY3JvcGhvbmUgd2lkZ2V0IHNvIHRoYXQgdGhlCi0JICogcmVjb3JkaW5nIExFRCBjb21lcyBvbi4gKi8KLQlzcGVjLT5yZWNvcmRpbmcgPSAxOwotCWN4dDUwNjZfb2xwY19zZWxlY3RfbWljKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgY3h0NTA2Nl9vbHBjX2NhcHR1cmVfY2xlYW51cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWNvbnN0IHN0cnVjdCBoZGFfdmVyYiBkaXNhYmxlX21pY3NbXSA9IHsKLQkJLyogZGlzYWJsZSBleHRlcm5hbCBtaWMsIHBvcnQgQiAqLwotCQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQotCQkvKiBkaXNibGUgaW50ZXJuYWwgbWljLCBwb3J0IEMgKi8KLQkJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkJLyogZGlzYWJsZSBEQyBjYXB0dXJlLCBwb3J0IEYgKi8KLQkJezB4MWUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JCXt9LAotCX07Ci0KLQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBkaXNhYmxlX21pY3MpOwotCXNwZWMtPnJlY29yZGluZyA9IDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGNvbmV4YW50X2NoZWNrX2RpZ19vdXRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCSAgICBjb25zdCBoZGFfbmlkX3QgKmRpZ19waW5zLAogCQkJCSAgICBpbnQgbnVtX3BpbnMpCkBAIC0yNTA2LDQzICsyMjMzLDYgQEAKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNjZfbWl4ZXJfbWFzdGVyX29scGNbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHwKLQkJCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfQ0FMTEJBQ0ssCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX0FNUF9GTEFHLAotCQkuaW5mbyA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9pbmZvLAotCQkuZ2V0ID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldCwKLQkJLnB1dCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9wdXQsCi0JCS50bHYgPSB7IC5jID0gc25kX2hkYV9taXhlcl9hbXBfdGx2IH0sCi0JCS8qIG9mZnNldCBieSAyOCB2b2x1bWUgc3RlcHMgdG8gbGltaXQgbWluaW11bSBnYWluIHRvIC00NmRCICovCi0JCS5wcml2YXRlX3ZhbHVlID0KLQkJCUhEQV9DT01QT1NFX0FNUF9WQUxfT0ZTKDB4MTAsIDMsIDAsIEhEQV9PVVRQVVQsIDI4KSwKLQl9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA2Nl9taXhlcl9vbHBjX2RjW10gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiREMgTW9kZSBFbmFibGUgU3dpdGNoIiwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gY3h0NTA2Nl9vbHBjX2RjX2dldCwKLQkJLnB1dCA9IGN4dDUwNjZfb2xwY19kY19wdXQsCi0JfSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJEQyBJbnB1dCBCaWFzIEVudW0iLAotCQkuaW5mbyA9IGN4dDUwNjZfb2xwY19kY19iaWFzX2VudW1faW5mbywKLQkJLmdldCA9IGN4dDUwNjZfb2xwY19kY19iaWFzX2VudW1fZ2V0LAotCQkucHV0ID0gY3h0NTA2Nl9vbHBjX2RjX2JpYXNfZW51bV9wdXQsCi0JfSwKLQl7fQotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNjZfbWl4ZXJzW10gPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKQEAgLTI2MzMsNjcgKzIzMjMsNiBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA2Nl9pbml0X3ZlcmJzX29scGNbXSA9IHsKLQkvKiBQb3J0IEE6IGhlYWRwaG9uZXMgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIERBQzEgKi8KLQotCS8qIFBvcnQgQjogZXh0ZXJuYWwgbWljcm9waG9uZSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCi0JLyogUG9ydCBDOiBpbnRlcm5hbCBtaWNyb3Bob25lICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBQb3J0IEQ6IHVudXNlZCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCi0JLyogUG9ydCBFOiB1bnVzZWQsIGJ1dCBoYXMgcHJpbWFyeSBFQVBEICovCi0JezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDJ9LCAvKiBkZWZhdWx0IG9uICovCi0KLQkvKiBQb3J0IEY6IGV4dGVybmFsIERDIGlucHV0IHRocm91Z2ggbWljcm9waG9uZSBwb3J0ICovCi0JezB4MWUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBQb3J0IEc6IGludGVybmFsIHNwZWFrZXJzICovCi0JezB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogREFDMSAqLwotCi0JLyogREFDMSAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBEQUMyOiB1bnVzZWQgKi8KLQl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApIHwgMHg1MH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCi0JLyogRGlzYWJsZSBkaWdpdGFsIG1pY3JvcGhvbmUgcG9ydCAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCi0JLyogQXVkaW8gaW5wdXQgc2VsZWN0b3JzICovCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIHwgMHgzfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0KLQkvKiBEaXNhYmxlIFNQRElGICovCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0KLQkvKiBlbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnRzIGZvciBQb3J0IEEgYW5kIEIgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IENPTkVYQU5UX0hQX0VWRU5UfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IENPTkVYQU5UX01JQ19FVkVOVH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDY2X2luaXRfdmVyYnNfdm9zdHJvW10gPSB7CiAJLyogUG9ydCBBOiBoZWFkcGhvbmVzICovCiAJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCkBAIC0yODc5LDcgKzI1MDgsNyBAQAogLyogaW5pdGlhbGl6ZSBqYWNrLXNlbnNpbmcsIHRvbyAqLwogc3RhdGljIGludCBjeHQ1MDY2X2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0Jc25kX3ByaW50ZGQoIkNYVDUwNjY6IGluaXRcbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIkNYVDUwNjY6IGluaXRcbiIpOwogCWNvbmV4YW50X2luaXQoY29kZWMpOwogCWlmIChjb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50KSB7CiAJCWN4dDUwNjZfaHBfYXV0b211dGUoY29kZWMpOwpAQCAtMjg4OSwyNSArMjUxOCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3h0NTA2Nl9vbHBjX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzbmRfcHJpbnRkZCgiQ1hUNTA2NjogaW5pdFxuIik7Ci0JY29uZXhhbnRfaW5pdChjb2RlYyk7Ci0JY3h0NTA2Nl9ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JaWYgKCFzcGVjLT5kY19lbmFibGUpIHsKLQkJY3h0NTA2Nl9zZXRfbWljX2Jvb3N0KGNvZGVjKTsKLQkJY3h0NTA2Nl9vbHBjX2F1dG9taWMoY29kZWMpOwotCX0gZWxzZSB7Ci0JCWN4dDUwNjZfZW5hYmxlX2RjKGNvZGVjKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIGVudW0gewogCUNYVDUwNjZfTEFQVE9QLAkJLyogTGFwdG9wcyB3LyBFQVBEIHN1cHBvcnQgKi8KIAlDWFQ1MDY2X0RFTExfTEFQVE9QLAkvKiBEZWxsIExhcHRvcCAqLwotCUNYVDUwNjZfT0xQQ19YT18xXzUsCS8qIE9MUEMgWE8gMS41ICovCiAJQ1hUNTA2Nl9ERUxMX1ZPU1RSTywJLyogRGVsbCBWb3N0cm8gMTAxNWkgKi8KIAlDWFQ1MDY2X0lERUFQQUQsCS8qIExlbm92byBJZGVhUGFkIFUxNTAgKi8KIAlDWFQ1MDY2X1RISU5LUEFELAkvKiBMZW5vdm8gVGhpbmtQYWQgVDQxMHMsIG90aGVycz8gKi8KQEAgLTI5MjAsNyArMjUzMyw2IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGN4dDUwNjZfbW9kZWxzW0NYVDUwNjZfTU9ERUxTXSA9IHsKIAlbQ1hUNTA2Nl9MQVBUT1BdCT0gImxhcHRvcCIsCiAJW0NYVDUwNjZfREVMTF9MQVBUT1BdCT0gImRlbGwtbGFwdG9wIiwKLQlbQ1hUNTA2Nl9PTFBDX1hPXzFfNV0JPSAib2xwYy14by0xXzUiLAogCVtDWFQ1MDY2X0RFTExfVk9TVFJPXQk9ICJkZWxsLXZvc3RybyIsCiAJW0NYVDUwNjZfSURFQVBBRF0JPSAiaWRlYXBhZCIsCiAJW0NYVDUwNjZfVEhJTktQQURdCT0gInRoaW5rcGFkIiwKQEAgLTI5NDEsMTAgKzI1NTMsOCBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2NDMsICJBc3VzIEs1MkpVIiwgQ1hUNTA2Nl9BU1VTKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTkzLCAiQXN1cyBVNTBGIiwgQ1hUNTA2Nl9BU1VTKSwKIAlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjFlLCAiVG9zaGliYSBTYXRlbGxpdGUgQzY1MEQiLCBDWFQ1MDY2X0lERUFQQUQpLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmNTAsICJUb3NoaWJhIFNhdGVsbGl0ZSBQNTAwLVBTUEdTQy0wMTgwMFQiLCBDWFQ1MDY2X09MUENfWE9fMV81KSwKIAlTTkRfUENJX1FVSVJLKDB4MTRmMSwgMHgwMTAxLCAiQ29uZXhhbnQgUmVmZXJlbmNlIGJvYXJkIiwKIAkJICAgICAgQ1hUNTA2Nl9MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA4MzMsICJPTFBDIFhPLTEuNSIsIENYVDUwNjZfT0xQQ19YT18xXzUpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwZjIsICJMZW5vdm8gVDQwMHMiLCBDWFQ1MDY2X1RISU5LUEFEKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWM1LCAiVGhpbmtwYWQgRWRnZSAxMyIsIENYVDUwNjZfVEhJTktQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxYzYsICJUaGlua3BhZCBFZGdlIDEzIiwgQ1hUNTA2Nl9BU1VTKSwKQEAgLTMwMzAsMzIgKzI2NDAsMTEgQEAKIAkJc3BlYy0+bWljX2Jvb3N0ID0gMzsgLyogZGVmYXVsdCAzMGRCIGdhaW4gKi8KIAkJYnJlYWs7CiAKLQljYXNlIENYVDUwNjZfT0xQQ19YT18xXzU6Ci0JCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IGN4dDUwNjZfb2xwY19pbml0OwotCQljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gY3h0NTA2Nl9vbHBjX3Vuc29sX2V2ZW50OwotCQlzcGVjLT5pbml0X3ZlcmJzWzBdID0gY3h0NTA2Nl9pbml0X3ZlcmJzX29scGM7Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gY3h0NTA2Nl9taXhlcl9tYXN0ZXJfb2xwYzsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyX29scGNfZGM7Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gY3h0NTA2Nl9taXhlcnM7Ci0JCXNwZWMtPnBvcnRfZF9tb2RlID0gMDsKLQkJc3BlYy0+bWljX2Jvb3N0ID0gMzsgLyogZGVmYXVsdCAzMGRCIGdhaW4gKi8KLQotCQkvKiBubyBTL1BESUYgb3V0ICovCi0JCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gMDsKLQotCQkvKiBpbnB1dCBzb3VyY2UgYXV0b21hdGljYWxseSBzZWxlY3RlZCAqLwotCQlzcGVjLT5pbnB1dF9tdXggPSBOVUxMOwotCi0JCS8qIG91ciBjYXB0dXJlIGhvb2tzIHdoaWNoIGFsbG93IHVzIHRvIHR1cm4gb24gdGhlIG1pY3JvcGhvbmUgTEVECi0JCSAqIGF0IHRoZSByaWdodCB0aW1lICovCi0JCXNwZWMtPmNhcHR1cmVfcHJlcGFyZSA9IGN4dDUwNjZfb2xwY19jYXB0dXJlX3ByZXBhcmU7Ci0JCXNwZWMtPmNhcHR1cmVfY2xlYW51cCA9IGN4dDUwNjZfb2xwY19jYXB0dXJlX2NsZWFudXA7Ci0JCWJyZWFrOwogCWNhc2UgQ1hUNTA2Nl9ERUxMX1ZPU1RSTzoKIAkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA2Nl9pbml0OwogCQljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gY3h0NTA2Nl91bnNvbF9ldmVudDsKIAkJc3BlYy0+aW5pdF92ZXJic1swXSA9IGN4dDUwNjZfaW5pdF92ZXJic192b3N0cm87Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gY3h0NTA2Nl9taXhlcl9tYXN0ZXJfb2xwYzsKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyX21hc3RlcjsKIAkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X21peGVyczsKIAkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBjeHQ1MDY2X3Zvc3Ryb19taXhlcnM7CiAJCXNwZWMtPnBvcnRfZF9tb2RlID0gMDsKQEAgLTMyMDcsMTEgKzI3OTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjeF9hdXRvX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc25kX2hkYV9hcHBseV9maXh1cChjb2RlYywgSERBX0ZJWFVQX0FDVF9GUkVFKTsKLQlzbmRfaGRhX2dlbl9mcmVlKGNvZGVjKTsKLX0KKyNkZWZpbmUgY3hfYXV0b19mcmVlCXNuZF9oZGFfZ2VuX2ZyZWUKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29kZWNfb3BzIGN4X2F1dG9fcGF0Y2hfb3BzID0gewogCS5idWlsZF9jb250cm9scyA9IGN4X2F1dG9fYnVpbGRfY29udHJvbHMsCkBAIC0zMjM4LDYgKzI4MjMsMTEgQEAKIAlDWFRfRklYVVBfSEVBRFBIT05FX01JQywKIAlDWFRfRklYVVBfR1BJTzEsCiAJQ1hUX0ZJWFVQX1RISU5LUEFEX0FDUEksCisJQ1hUX0ZJWFVQX09MUENfWE8sCisJQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QLAorCUNYVF9GSVhVUF9UT1NISUJBX1AxMDUsCisJQ1hUX0ZJWFVQX0hQXzUzMCwKKwlDWFRfRklYVVBfQ0FQX01JWF9BTVBfNTA0NywKIH07CiAKIC8qIGZvciBoZGFfZml4dXBfdGhpbmtwYWRfYWNwaSgpICovCkBAIC0zMzE2LDYgKzI5MDYsMjg4IEBACiAJfQogfQogCisvKiBPUExDIFhPIDEuNSBmaXh1cCAqLworCisvKiBPTFBDIFhPLTEuNSBzdXBwb3J0cyBEQyBpbnB1dCBtb2RlIChlLmcuIGZvciB1c2Ugd2l0aCBhbmFsb2cgc2Vuc29ycykKKyAqIHRocm91Z2ggdGhlIG1pY3JvcGhvbmUgamFjay4KKyAqIFdoZW4gdGhlIHVzZXIgZW5hYmxlcyB0aGlzIHRocm91Z2ggYSBtaXhlciBzd2l0Y2gsIGJvdGggaW50ZXJuYWwgYW5kCisgKiBleHRlcm5hbCBtaWNyb3Bob25lcyBhcmUgZGlzYWJsZWQuIEdhaW4gaXMgZml4ZWQgYXQgMGRCLiBJbiB0aGlzIG1vZGUsCisgKiB3ZSBhbHNvIGFsbG93IHRoZSBiaWFzIHRvIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIHNlcGFyYXRlIG1peGVyCisgKiBjb250cm9sLiAqLworCisjZGVmaW5lIHVwZGF0ZV9taWNfcGluKGNvZGVjLCBuaWQsIHZhbCkJCQkJCVwKKwlzbmRfaGRhX2NvZGVjX3VwZGF0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAkJCVwKKwkJCQkgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIHZhbCkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IG9scGNfeG9fZGNfYmlhcyA9IHsKKwkubnVtX2l0ZW1zID0gMywKKwkuaXRlbXMgPSB7CisJCXsgIk9mZiIsIFBJTl9JTiB9LAorCQl7ICI1MCUiLCBQSU5fVlJFRjUwIH0sCisJCXsgIjgwJSIsIFBJTl9WUkVGODAgfSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgb2xwY194b191cGRhdGVfbWljX2Jvb3N0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGNoLCB2YWw7CisKKwlmb3IgKGNoID0gMDsgY2ggPCAyOyBjaCsrKSB7CisJCXZhbCA9IEFDX0FNUF9TRVRfT1VUUFVUIHwKKwkJCShjaCA/IEFDX0FNUF9TRVRfUklHSFQgOiBBQ19BTVBfU0VUX0xFRlQpOworCQlpZiAoIXNwZWMtPmRjX2VuYWJsZSkKKwkJCXZhbCB8PSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCAweDE3LCBjaCwgSERBX09VVFBVVCwgMCk7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTcsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbHBjX3hvX3VwZGF0ZV9taWNfcGlucyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBjdXJfaW5wdXQsIHZhbDsKKwlzdHJ1Y3QgbmlkX3BhdGggKnBhdGg7CisKKwljdXJfaW5wdXQgPSBzcGVjLT5nZW4uaW5wdXRfcGF0aHNbMF1bc3BlYy0+Z2VuLmN1cl9tdXhbMF1dOworCisJLyogU2V0IHVwIG1pYyBwaW5zIGZvciBwb3J0LUIsIEMgYW5kIEYgZHluYW1pY2FsbHkgYXMgdGhlIHJlY29yZGluZworCSAqIExFRCBpcyB0dXJuZWQgb24vb2ZmIGJ5IHRoZXNlIHBpbiBjb250cm9scworCSAqLworCWlmICghc3BlYy0+ZGNfZW5hYmxlKSB7CisJCS8qIGRpc2FibGUgREMgYmlhcyBwYXRoIGFuZCBwaW4gZm9yIHBvcnQgRiAqLworCQl1cGRhdGVfbWljX3Bpbihjb2RlYywgMHgxZSwgMCk7CisJCXNuZF9oZGFfYWN0aXZhdGVfcGF0aChjb2RlYywgc3BlYy0+ZGNfbW9kZV9wYXRoLCBmYWxzZSwgZmFsc2UpOworCisJCS8qIHVwZGF0ZSBwb3J0IEIgKGV4dCBtaWMpIGFuZCBDIChpbnQgbWljKSAqLworCQkvKiBPTFBDIGRlZmVycyBtaWMgd2lkZ2V0IGNvbnRyb2wgdW50aWwgd2hlbiBjYXB0dXJlIGlzCisJCSAqIHN0YXJ0ZWQgYmVjYXVzZSB0aGUgbWljcm9waG9uZSBMRUQgY29tZXMgb24gYXMgc29vbiBhcworCQkgKiB0aGVzZSBzZXR0aW5ncyBhcmUgcHV0IGluIHBsYWNlLiBpZiB3ZSBkaWQgdGhpcyBiZWZvcmUKKwkJICogcmVjb3JkaW5nLCBpdCB3b3VsZCBnaXZlIHRoZSBmYWxzZSBpbmRpY2F0aW9uIHRoYXQKKwkJICogcmVjb3JkaW5nIGlzIGhhcHBlbmluZyB3aGVuIGl0IGlzIG5vdC4KKwkJICovCisJCXVwZGF0ZV9taWNfcGluKGNvZGVjLCAweDFhLCBzcGVjLT5yZWNvcmRpbmcgPworCQkJICAgICAgIHNuZF9oZGFfY29kZWNfZ2V0X3Bpbl90YXJnZXQoY29kZWMsIDB4MWEpIDogMCk7CisJCXVwZGF0ZV9taWNfcGluKGNvZGVjLCAweDFiLCBzcGVjLT5yZWNvcmRpbmcgPworCQkJICAgICAgIHNuZF9oZGFfY29kZWNfZ2V0X3Bpbl90YXJnZXQoY29kZWMsIDB4MWIpIDogMCk7CisJCS8qIGVuYWJsZSBub3JtYWwgbWljIHBhdGggKi8KKwkJcGF0aCA9IHNuZF9oZGFfZ2V0X3BhdGhfZnJvbV9pZHgoY29kZWMsIGN1cl9pbnB1dCk7CisJCWlmIChwYXRoKQorCQkJc25kX2hkYV9hY3RpdmF0ZV9wYXRoKGNvZGVjLCBwYXRoLCB0cnVlLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBub3JtYWwgbWljIHBhdGggKi8KKwkJcGF0aCA9IHNuZF9oZGFfZ2V0X3BhdGhfZnJvbV9pZHgoY29kZWMsIGN1cl9pbnB1dCk7CisJCWlmIChwYXRoKQorCQkJc25kX2hkYV9hY3RpdmF0ZV9wYXRoKGNvZGVjLCBwYXRoLCBmYWxzZSwgZmFsc2UpOworCisJCS8qIEV2ZW4gdGhvdWdoIHBvcnQgRiBpcyB0aGUgREMgaW5wdXQsIHRoZSBiaWFzIGlzIGNvbnRyb2xsZWQKKwkJICogb24gcG9ydCBCLiAgV2UgYWxzbyBsZWF2ZSB0aGF0IHBvcnQgYXMgYW4gYWN0aXZlIGlucHV0IChidXQKKwkJICogdW5zZWxlY3RlZCkgaW4gREMgbW9kZSBqdXN0IGluIGNhc2UgdGhhdCBpcyBuZWNlc3NhcnkgdG8KKwkJICogbWFrZSB0aGUgYmlhcyBzZXR0aW5nIHRha2UgZWZmZWN0LgorCQkgKi8KKwkJaWYgKHNwZWMtPnJlY29yZGluZykKKwkJCXZhbCA9IG9scGNfeG9fZGNfYmlhcy5pdGVtc1tzcGVjLT5kY19pbnB1dF9iaWFzXS5pbmRleDsKKwkJZWxzZQorCQkJdmFsID0gMDsKKwkJdXBkYXRlX21pY19waW4oY29kZWMsIDB4MWEsIHZhbCk7CisJCXVwZGF0ZV9taWNfcGluKGNvZGVjLCAweDFiLCAwKTsKKwkJLyogZW5hYmxlIERDIGJpYXMgcGF0aCBhbmQgcGluICovCisJCXVwZGF0ZV9taWNfcGluKGNvZGVjLCAweDFlLCBzcGVjLT5yZWNvcmRpbmcgPyBQSU5fSU4gOiAwKTsKKwkJc25kX2hkYV9hY3RpdmF0ZV9wYXRoKGNvZGVjLCBzcGVjLT5kY19tb2RlX3BhdGgsIHRydWUsIGZhbHNlKTsKKwl9Cit9CisKKy8qIG1pY19hdXRvc3dpdGNoIGhvb2sgKi8KK3N0YXRpYyB2b2lkIG9scGNfeG9fYXV0b21pYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9qYWNrX3RibCAqamFjaykKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBzYXZlZF9jYWNoZWRfd3JpdGUgPSBjb2RlYy0+Y2FjaGVkX3dyaXRlOworCisJY29kZWMtPmNhY2hlZF93cml0ZSA9IDE7CisJLyogaW4gREMgbW9kZSwgd2UgZG9uJ3QgaGFuZGxlIGF1dG9taWMgKi8KKwlpZiAoIXNwZWMtPmRjX2VuYWJsZSkKKwkJc25kX2hkYV9nZW5fbWljX2F1dG9zd2l0Y2goY29kZWMsIGphY2spOworCW9scGNfeG9fdXBkYXRlX21pY19waW5zKGNvZGVjKTsKKwlzbmRfaGRhX2NvZGVjX2ZsdXNoX2NhY2hlKGNvZGVjKTsKKwljb2RlYy0+Y2FjaGVkX3dyaXRlID0gc2F2ZWRfY2FjaGVkX3dyaXRlOworCWlmIChzcGVjLT5kY19lbmFibGUpCisJCW9scGNfeG9fdXBkYXRlX21pY19ib29zdChjb2RlYyk7Cit9CisKKy8qIHBjbV9jYXB0dXJlIGhvb2sgKi8KK3N0YXRpYyB2b2lkIG9scGNfeG9fY2FwdHVyZV9ob29rKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJLyogdG9nZ2xlIHNwZWMtPnJlY29yZGluZyBmbGFnIGFuZCB1cGRhdGUgbWljIHBpbnMgYWNjb3JkaW5nbHkKKwkgKiBmb3IgdHVybmluZyBvbi9vZmYgTEVECisJICovCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIEhEQV9HRU5fUENNX0FDVF9QUkVQQVJFOgorCQlzcGVjLT5yZWNvcmRpbmcgPSAxOworCQlvbHBjX3hvX3VwZGF0ZV9taWNfcGlucyhjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgSERBX0dFTl9QQ01fQUNUX0NMRUFOVVA6CisJCXNwZWMtPnJlY29yZGluZyA9IDA7CisJCW9scGNfeG9fdXBkYXRlX21pY19waW5zKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG9scGNfeG9fZGNfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwZWMtPmRjX2VuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbHBjX3hvX2RjX21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGRjX2VuYWJsZSA9ICEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAoZGNfZW5hYmxlID09IHNwZWMtPmRjX2VuYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlzcGVjLT5kY19lbmFibGUgPSBkY19lbmFibGU7CisJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOworCW9scGNfeG9fdXBkYXRlX21pY19ib29zdChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgb2xwY194b19kY19iaWFzX2VudW1fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5kY19pbnB1dF9iaWFzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9scGNfeG9fZGNfYmlhc19lbnVtX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9pbmZvKCZvbHBjX3hvX2RjX2JpYXMsIHVpbmZvKTsKK30KKworc3RhdGljIGludCBvbHBjX3hvX2RjX2JpYXNfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmb2xwY194b19kY19iaWFzOworCXVuc2lnbmVkIGludCBpZHg7CisKKwlpZHggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmIChpZHggPj0gaW11eC0+bnVtX2l0ZW1zKQorCQlpZHggPSBpbXV4LT5udW1faXRlbXMgLSAxOworCWlmIChzcGVjLT5kY19pbnB1dF9iaWFzID09IGlkeCkKKwkJcmV0dXJuIDA7CisKKwlzcGVjLT5kY19pbnB1dF9iaWFzID0gaWR4OworCWlmIChzcGVjLT5kY19lbmFibGUpCisJCW9scGNfeG9fdXBkYXRlX21pY19waW5zKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG9scGNfeG9fbWl4ZXJzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiREMgTW9kZSBFbmFibGUgU3dpdGNoIiwKKwkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAorCQkuZ2V0ID0gb2xwY194b19kY19tb2RlX2dldCwKKwkJLnB1dCA9IG9scGNfeG9fZGNfbW9kZV9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEQyBJbnB1dCBCaWFzIEVudW0iLAorCQkuaW5mbyA9IG9scGNfeG9fZGNfYmlhc19lbnVtX2luZm8sCisJCS5nZXQgPSBvbHBjX3hvX2RjX2JpYXNfZW51bV9nZXQsCisJCS5wdXQgPSBvbHBjX3hvX2RjX2JpYXNfZW51bV9wdXQsCisJfSwKKwl7fQorfTsKKworLyogb3ZlcnJpZGluZyBtaWMgYm9vc3QgcHV0IGNhbGxiYWNrOyB1cGRhdGUgbWljIGJvb3N0IHZvbHVtZSBvbmx5IHdoZW4KKyAqIERDIG1vZGUgaXMgZGlzYWJsZWQKKyAqLworc3RhdGljIGludCBvbHBjX3hvX21pY19ib29zdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHJldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9wdXQoa2NvbnRyb2wsIHVjb250cm9sKTsKKwlpZiAocmV0ID4gMCAmJiBzcGVjLT5kY19lbmFibGUpCisJCW9scGNfeG9fdXBkYXRlX21pY19ib29zdChjb2RlYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY3h0X2ZpeHVwX29scGNfeG8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpOworCisJaWYgKGFjdGlvbiAhPSBIREFfRklYVVBfQUNUX1BST0JFKQorCQlyZXR1cm47CisKKwlzcGVjLT5nZW4ubWljX2F1dG9zd2l0Y2hfaG9vayA9IG9scGNfeG9fYXV0b21pYzsKKwlzcGVjLT5nZW4ucGNtX2NhcHR1cmVfaG9vayA9IG9scGNfeG9fY2FwdHVyZV9ob29rOworCXNwZWMtPmRjX21vZGVfcGF0aCA9IHNuZF9oZGFfYWRkX25ld19wYXRoKGNvZGVjLCAweDFlLCAweDE0LCAwKTsKKworCXNuZF9oZGFfYWRkX25ld19jdGxzKGNvZGVjLCBvbHBjX3hvX21peGVycyk7CisKKwkvKiBPTFBDJ3MgbWljcm9waG9uZSBwb3J0IGlzIERDIGNvdXBsZWQgZm9yIHVzZSB3aXRoIGV4dGVybmFsIHNlbnNvcnMsCisJICogdGhlcmVmb3JlIHdlIHVzZSBhIDUwJSBtaWMgYmlhcyBpbiBvcmRlciB0byBjZW50ZXIgdGhlIGlucHV0IHNpZ25hbAorCSAqIHdpdGggdGhlIERDIGlucHV0IHJhbmdlIG9mIHRoZSBjb2RlYy4KKwkgKi8KKwlzbmRfaGRhX2NvZGVjX3NldF9waW5fdGFyZ2V0KGNvZGVjLCAweDFhLCBQSU5fVlJFRjUwKTsKKworCS8qIG92ZXJyaWRlIG1pYyBib29zdCBjb250cm9sICovCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPmdlbi5rY3Rscy51c2VkOyBpKyspIHsKKwkJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGwgPQorCQkJc25kX2FycmF5X2VsZW0oJnNwZWMtPmdlbi5rY3RscywgaSk7CisJCWlmICghc3RyY21wKGtjdGwtPm5hbWUsICJNaWMgQm9vc3QgVm9sdW1lIikpIHsKKwkJCWtjdGwtPnB1dCA9IG9scGNfeG9fbWljX2Jvb3N0X3B1dDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogRml4IG1heCBpbnB1dCBsZXZlbCBvbiBtaXhlciB3aWRnZXQgdG8gMGRCCisgKiAob3JpZ2luYWxseSBpdCBoYXMgMHgyYiBzdGVwcyB3aXRoIDBkQiBvZmZzZXQgMHgxNCkKKyAqLworc3RhdGljIHZvaWQgY3h0X2ZpeHVwX2NhcF9taXhfYW1wKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgY29uc3Qgc3RydWN0IGhkYV9maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCXNuZF9oZGFfb3ZlcnJpZGVfYW1wX2NhcHMoY29kZWMsIDB4MTcsIEhEQV9JTlBVVCwKKwkJCQkgICgweDE0IDw8IEFDX0FNUENBUF9PRkZTRVRfU0hJRlQpIHwKKwkJCQkgICgweDE0IDw8IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQpIHwKKwkJCQkgICgweDA1IDw8IEFDX0FNUENBUF9TVEVQX1NJWkVfU0hJRlQpIHwKKwkJCQkgICgxIDw8IEFDX0FNUENBUF9NVVRFX1NISUZUKSk7Cit9CisKKy8qCisgKiBGaXggbWF4IGlucHV0IGxldmVsIG9uIG1peGVyIHdpZGdldCB0byAwZEIKKyAqIChvcmlnaW5hbGx5IGl0IGhhcyAweDFlIHN0ZXBzIHdpdGggMCBkQiBvZmZzZXQgMHgxNykKKyAqLworc3RhdGljIHZvaWQgY3h0X2ZpeHVwX2NhcF9taXhfYW1wXzUwNDcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJc25kX2hkYV9vdmVycmlkZV9hbXBfY2Fwcyhjb2RlYywgMHgxMCwgSERBX0lOUFVULAorCQkJCSAgKDB4MTcgPDwgQUNfQU1QQ0FQX09GRlNFVF9TSElGVCkgfAorCQkJCSAgKDB4MTcgPDwgQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVCkgfAorCQkJCSAgKDB4MDUgPDwgQUNfQU1QQ0FQX1NURVBfU0laRV9TSElGVCkgfAorCQkJCSAgKDEgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKTsKK30KIAogLyogVGhpbmtQYWQgWDIwMCAmIGNvIHdpdGggY3h0NTA1MSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGludGJsIGN4dF9waW5jZmdfbGVub3ZvX3gyMDBbXSA9IHsKQEAgLTM0MDEsNiArMzI3Myw2OCBAQAogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAogCQkudi5mdW5jID0gaGRhX2ZpeHVwX3RoaW5rcGFkX2FjcGksCiAJfSwKKwlbQ1hUX0ZJWFVQX09MUENfWE9dID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gY3h0X2ZpeHVwX29scGNfeG8sCisJfSwKKwlbQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKKwkJLnYuZnVuYyA9IGN4dF9maXh1cF9jYXBfbWl4X2FtcCwKKwl9LAorCVtDWFRfRklYVVBfVE9TSElCQV9QMTA1XSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CisJCQl7IDB4MTAsIDB4OTYxNzAxZjAgfSwgLyogc3BlYWtlci9ocCAqLworCQkJeyAweDEyLCAweDAyYTE5MDFlIH0sIC8qIGV4dCBtaWMgKi8KKwkJCXsgMHgxNCwgMHg5NWE3MDExMCB9LCAvKiBpbnQgbWljICovCisJCQl7fQorCQl9LAorCX0sCisJW0NYVF9GSVhVUF9IUF81MzBdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsgMHgxMiwgMHg5MGE2MDE2MCB9LCAvKiBpbnQgbWljICovCisJCQl7fQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IENYVF9GSVhVUF9DQVBfTUlYX0FNUCwKKwl9LAorCVtDWFRfRklYVVBfQ0FQX01JWF9BTVBfNTA0N10gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBjeHRfZml4dXBfY2FwX21peF9hbXBfNTA0NywKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGN4dDUwNDVfZml4dXBzW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBkNSwgIkhQIDUzMCIsIENYVF9GSVhVUF9IUF81MzApLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMzEsICJUb3NoaWJhIFAxMDUiLCBDWFRfRklYVVBfVE9TSElCQV9QMTA1KSwKKwkvKiBIUCwgUGFja2FyZCBCZWxsLCBGdWppdHN1LVNpZW1lbnMgJiBMZW5vdm8gbGFwdG9wcyBoYXZlCisJICogcmVhbGx5IGJhZCBzb3VuZCBvdmVyIDBkQiBvbiBOSUQgMHgxNy4KKwkgKi8KKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDEwM2MsICJIUCIsIENYVF9GSVhVUF9DQVBfTUlYX0FNUCksCisJU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxNjMxLCAiUGFja2FyZCBCZWxsIiwgQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QKSwKKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE3MzQsICJGdWppdHN1IiwgQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QKSwKKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE3YWEsICJMZW5vdm8iLCBDWFRfRklYVVBfQ0FQX01JWF9BTVApLAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9tb2RlbF9maXh1cCBjeHQ1MDQ1X2ZpeHVwX21vZGVsc1tdID0geworCXsgLmlkID0gQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QLCAubmFtZSA9ICJjYXAtbWl4LWFtcCIgfSwKKwl7IC5pZCA9IENYVF9GSVhVUF9UT1NISUJBX1AxMDUsIC5uYW1lID0gInRvc2hpYmEtcDEwNSIgfSwKKwl7IC5pZCA9IENYVF9GSVhVUF9IUF81MzAsIC5uYW1lID0gImhwLTUzMCIgfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGN4dDUwNDdfZml4dXBzW10gPSB7CisJLyogSFAgbGFwdG9wcyBoYXZlIHJlYWxseSBiYWQgc291bmQgb3ZlciAwIGRCIG9uIE5JRCAweDEwLgorCSAqLworCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTAzYywgIkhQIiwgQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QXzUwNDcpLAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9tb2RlbF9maXh1cCBjeHQ1MDQ3X2ZpeHVwX21vZGVsc1tdID0geworCXsgLmlkID0gQ1hUX0ZJWFVQX0NBUF9NSVhfQU1QXzUwNDcsIC5uYW1lID0gImNhcC1taXgtYW1wIiB9LAorCXt9CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA1MV9maXh1cHNbXSA9IHsKQEAgLTM0MDgsMTAgKzMzNDIsMTYgQEAKIAl7fQogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfbW9kZWxfZml4dXAgY3h0NTA1MV9maXh1cF9tb2RlbHNbXSA9IHsKKwl7IC5pZCA9IENYVF9QSU5DRkdfTEVOT1ZPX1gyMDAsIC5uYW1lID0gImxlbm92by14MjAwIiB9LAorCXt9Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA2Nl9maXh1cHNbXSA9IHsKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNTQzLCAiQWNlciBBc3BpcmUgT25lIDUyMiIsIENYVF9GSVhVUF9TVEVSRU9fRE1JQyksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDU0YywgIkFjZXIgQXNwaXJlIDM4MzBURyIsIENYVF9GSVhVUF9HUElPMSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTM4ZCwgIkFzdXMiLCBDWFRfRklYVVBfSEVBRFBIT05FX01JQ19QSU4pLAorCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA4MzMsICJPTFBDIFhPLTEuNSIsIENYVF9GSVhVUF9PTFBDX1hPKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMGYyLCAiTGVub3ZvIFQ0MDAiLCBDWFRfUElOQ0ZHX0xFTk9WT19UUDQxMCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjE1ZSwgIkxlbm92byBUNDEwIiwgQ1hUX1BJTkNGR19MRU5PVk9fVFA0MTApLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxNWYsICJMZW5vdm8gVDUxMCIsIENYVF9QSU5DRkdfTEVOT1ZPX1RQNDEwKSwKQEAgLTM0MjgsNiArMzM2OCwxNyBAQAogCXt9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9tb2RlbF9maXh1cCBjeHQ1MDY2X2ZpeHVwX21vZGVsc1tdID0geworCXsgLmlkID0gQ1hUX0ZJWFVQX1NURVJFT19ETUlDLCAubmFtZSA9ICJzdGVyZW8tZG1pYyIgfSwKKwl7IC5pZCA9IENYVF9GSVhVUF9HUElPMSwgLm5hbWUgPSAiZ3BpbzEiIH0sCisJeyAuaWQgPSBDWFRfRklYVVBfSEVBRFBIT05FX01JQ19QSU4sIC5uYW1lID0gImhlYWRwaG9uZS1taWMtcGluIiB9LAorCXsgLmlkID0gQ1hUX1BJTkNGR19MRU5PVk9fVFA0MTAsIC5uYW1lID0gInRwNDEwIiB9LAorCXsgLmlkID0gQ1hUX0ZJWFVQX1RISU5LUEFEX0FDUEksIC5uYW1lID0gInRoaW5rcGFkIiB9LAorCXsgLmlkID0gQ1hUX1BJTkNGR19MRU1PVEVfQTEwMDQsIC5uYW1lID0gImxlbW90ZS1hMTAwNCIgfSwKKwl7IC5pZCA9IENYVF9GSVhVUF9PTFBDX1hPLCAubmFtZSA9ICJvbHBjLXhvIiB9LAorCXt9Cit9OworCiAvKiBhZGQgImZha2UiIG11dGUgYW1wLWNhcHMgdG8gREFDcyBvbiBjeDUwNTEgc28gdGhhdCBtaXhlciBtdXRlIHN3aXRjaGVzCiAgKiBjYW4gYmUgY3JlYXRlZCAoYmtvIzQyODI1KQogICovCkBAIC0zNDQ5LDggKzM0MDAsNyBAQAogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjOwogCWludCBlcnI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOworCWNvZGVjX2luZm8oY29kZWMsICIlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLCBjb2RlYy0+Y2hpcF9uYW1lKTsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmICghc3BlYykKQEAgLTM0NjcsMTkgKzM0MTcsMjggQEAKIAlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKIAljYXNlIDB4MTRmMTUwNDU6CiAJCWNvZGVjLT5zaW5nbGVfYWRjX2FtcCA9IDE7CisJCXNwZWMtPmdlbi5taXhlcl9uaWQgPSAweDE3OworCQlzcGVjLT5nZW4uYWRkX3N0ZXJlb19taXhfaW5wdXQgPSAxOworCQlzbmRfaGRhX3BpY2tfZml4dXAoY29kZWMsIGN4dDUwNDVfZml4dXBfbW9kZWxzLAorCQkJCSAgIGN4dDUwNDVfZml4dXBzLCBjeHRfZml4dXBzKTsKIAkJYnJlYWs7CiAJY2FzZSAweDE0ZjE1MDQ3OgogCQljb2RlYy0+cGluX2FtcF93b3JrYXJvdW5kID0gMTsKIAkJc3BlYy0+Z2VuLm1peGVyX25pZCA9IDB4MTk7CisJCXNwZWMtPmdlbi5hZGRfc3RlcmVvX21peF9pbnB1dCA9IDE7CisJCXNuZF9oZGFfcGlja19maXh1cChjb2RlYywgY3h0NTA0N19maXh1cF9tb2RlbHMsCisJCQkJICAgY3h0NTA0N19maXh1cHMsIGN4dF9maXh1cHMpOwogCQlicmVhazsKIAljYXNlIDB4MTRmMTUwNTE6CiAJCWFkZF9jeDUwNTFfZmFrZV9tdXRlcyhjb2RlYyk7CiAJCWNvZGVjLT5waW5fYW1wX3dvcmthcm91bmQgPSAxOwotCQlzbmRfaGRhX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGN4dDUwNTFfZml4dXBzLCBjeHRfZml4dXBzKTsKKwkJc25kX2hkYV9waWNrX2ZpeHVwKGNvZGVjLCBjeHQ1MDUxX2ZpeHVwX21vZGVscywKKwkJCQkgICBjeHQ1MDUxX2ZpeHVwcywgY3h0X2ZpeHVwcyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNvZGVjLT5waW5fYW1wX3dvcmthcm91bmQgPSAxOwotCQlzbmRfaGRhX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGN4dDUwNjZfZml4dXBzLCBjeHRfZml4dXBzKTsKKwkJc25kX2hkYV9waWNrX2ZpeHVwKGNvZGVjLCBjeHQ1MDY2X2ZpeHVwX21vZGVscywKKwkJCQkgICBjeHQ1MDY2X2ZpeHVwcywgY3h0X2ZpeHVwcyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzUxMyw3ICszNDcyLDcgQEAKIAkgKiBCZXR0ZXIgdG8gbWFrZSByZXNldCwgdGhlbi4KIAkgKi8KIAlpZiAoIWNvZGVjLT5idXMtPnN5bmNfd3JpdGUpIHsKLQkJc25kX3ByaW50ZCgiaGRhX2NvZGVjOiAiCisJCWNvZGVjX2luZm8oY29kZWMsCiAJCQkgICAiRW5hYmxlIHN5bmNfd3JpdGUgZm9yIHN0YWJsZSBjb21tdW5pY2F0aW9uXG4iKTsKIAkJY29kZWMtPmJ1cy0+c3luY193cml0ZSA9IDE7CiAJCWNvZGVjLT5idXMtPmFsbG93X2J1c19yZXNldCA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2hkbWkuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCmluZGV4IDVlZjk1MDMuLjBjYjViODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCkBAIC02OCw2ICs2OCw3IEBACiAJaGRhX25pZF90IHBpbl9uaWQ7CiAJaW50IG51bV9tdXhfbmlkczsKIAloZGFfbmlkX3QgbXV4X25pZHNbSERBX01BWF9DT05ORUNUSU9OU107CisJaW50IG11eF9pZHg7CiAJaGRhX25pZF90IGN2dF9uaWQ7CiAKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKQEAgLTM1Myw0MCArMzU0LDQzIEBACiAjZGVmaW5lIGdldF9wY21fcmVjKHNwZWMsIGlkeCkgXAogCSgoc3RydWN0IGhkYV9wY20gKilzbmRfYXJyYXlfZWxlbSgmc3BlYy0+cGNtX3JlYywgaWR4KSkKIAotc3RhdGljIGludCBwaW5fbmlkX3RvX3Bpbl9pbmRleChzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluX25pZCkKK3N0YXRpYyBpbnQgcGluX25pZF90b19waW5faW5kZXgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW5fbmlkKQogeworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgcGluX2lkeDsKIAogCWZvciAocGluX2lkeCA9IDA7IHBpbl9pZHggPCBzcGVjLT5udW1fcGluczsgcGluX2lkeCsrKQogCQlpZiAoZ2V0X3BpbihzcGVjLCBwaW5faWR4KS0+cGluX25pZCA9PSBwaW5fbmlkKQogCQkJcmV0dXJuIHBpbl9pZHg7CiAKLQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogcGluIG5pZCAlZCBub3QgcmVnaXN0ZXJlZFxuIiwgcGluX25pZCk7CisJY29kZWNfd2Fybihjb2RlYywgIkhETUk6IHBpbiBuaWQgJWQgbm90IHJlZ2lzdGVyZWRcbiIsIHBpbl9uaWQpOwogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGhpbmZvX3RvX3Bpbl9pbmRleChzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjLAorc3RhdGljIGludCBoaW5mb190b19waW5faW5kZXgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkgICAgICBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvKQogeworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgcGluX2lkeDsKIAogCWZvciAocGluX2lkeCA9IDA7IHBpbl9pZHggPCBzcGVjLT5udW1fcGluczsgcGluX2lkeCsrKQogCQlpZiAoZ2V0X3BjbV9yZWMoc3BlYywgcGluX2lkeCktPnN0cmVhbSA9PSBoaW5mbykKIAkJCXJldHVybiBwaW5faWR4OwogCi0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkhETUk6IGhpbmZvICVwIG5vdCByZWdpc3RlcmVkXG4iLCBoaW5mbyk7CisJY29kZWNfd2Fybihjb2RlYywgIkhETUk6IGhpbmZvICVwIG5vdCByZWdpc3RlcmVkXG4iLCBoaW5mbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgY3Z0X25pZF90b19jdnRfaW5kZXgoc3RydWN0IGhkbWlfc3BlYyAqc3BlYywgaGRhX25pZF90IGN2dF9uaWQpCitzdGF0aWMgaW50IGN2dF9uaWRfdG9fY3Z0X2luZGV4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgY3Z0X25pZCkKIHsKKwlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGN2dF9pZHg7CiAKIAlmb3IgKGN2dF9pZHggPSAwOyBjdnRfaWR4IDwgc3BlYy0+bnVtX2N2dHM7IGN2dF9pZHgrKykKIAkJaWYgKGdldF9jdnQoc3BlYywgY3Z0X2lkeCktPmN2dF9uaWQgPT0gY3Z0X25pZCkKIAkJCXJldHVybiBjdnRfaWR4OwogCi0Jc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkhETUk6IGN2dCBuaWQgJWQgbm90IHJlZ2lzdGVyZWRcbiIsIGN2dF9uaWQpOworCWNvZGVjX3dhcm4oY29kZWMsICJIRE1JOiBjdnQgbmlkICVkIG5vdCByZWdpc3RlcmVkXG4iLCBjdnRfbmlkKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtNzA2LDcgKzcxMCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWNoYW5uZWwgPSBzcGVjLT5vcHMucGluX2dldF9zbG90X2NoYW5uZWwoY29kZWMsIHBpbl9uaWQsIGkpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiSERNSTogQVNQIGNoYW5uZWwgJWQgPT4gc2xvdCAlZFxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLCAiSERNSTogQVNQIGNoYW5uZWwgJWQgPT4gc2xvdCAlZFxuIiwKIAkJCQkJCWNoYW5uZWwsIGkpOwogCX0KICNlbmRpZgpAQCAtNzU1LDggKzc1OSw3IEBACiAJCWludCBjaGFubmVsID0gKHNsb3RzZXR1cCAmIDB4ZjApID4+IDQ7CiAJCWVyciA9IHNwZWMtPm9wcy5waW5fc2V0X3Nsb3RfY2hhbm5lbChjb2RlYywgcGluX25pZCwgaGRtaV9zbG90LCBjaGFubmVsKTsKIAkJaWYgKGVycikgewotCQkJc25kX3ByaW50ZGQoS0VSTl9OT1RJQ0UKLQkJCQkgICAgIkhETUk6IGNoYW5uZWwgbWFwcGluZyBmYWlsZWRcbiIpOworCQkJY29kZWNfZGJnKGNvZGVjLCAiSERNSTogY2hhbm5lbCBtYXBwaW5nIGZhaWxlZFxuIik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTk2NywxMiArOTcwLDEyIEBACiAJaW50IHNpemU7CiAKIAlzaXplID0gc25kX2hkbWlfZ2V0X2VsZF9zaXplKGNvZGVjLCBwaW5fbmlkKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiSERNSTogRUxEIGJ1ZiBzaXplIGlzICVkXG4iLCBzaXplKTsKKwljb2RlY19kYmcoY29kZWMsICJIRE1JOiBFTEQgYnVmIHNpemUgaXMgJWRcbiIsIHNpemUpOwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlzaXplID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBwaW5fbmlkLCAwLAogCQkJCQkJQUNfVkVSQl9HRVRfSERNSV9ESVBfU0laRSwgaSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJIRE1JOiBESVAgR1BbJWRdIGJ1ZiBzaXplIGlzICVkXG4iLCBpLCBzaXplKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiSERNSTogRElQIEdQWyVkXSBidWYgc2l6ZSBpcyAlZFxuIiwgaSwgc2l6ZSk7CiAJfQogI2VuZGlmCiB9CkBAIC05OTQsMTIgKzk5NywxMiBAQAogCQkJaGRtaV93cml0ZV9kaXBfYnl0ZShjb2RlYywgcGluX25pZCwgMHgwKTsKIAkJCWhkbWlfZ2V0X2RpcF9pbmRleChjb2RlYywgcGluX25pZCwgJnBpLCAmYmkpOwogCQkJaWYgKHBpICE9IGkpCi0JCQkJc25kX3ByaW50ZChLRVJOX0lORk8gImRpcCBpbmRleCAlZDogJWQgIT0gJWRcbiIsCisJCQkJY29kZWNfZGJnKGNvZGVjLCAiZGlwIGluZGV4ICVkOiAlZCAhPSAlZFxuIiwKIAkJCQkJCWJpLCBwaSwgaSk7CiAJCQlpZiAoYmkgPT0gMCkgLyogYnl0ZSBpbmRleCB3cmFwcGVkIGFyb3VuZCAqLwogCQkJCWJyZWFrOwogCQl9Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPCisJCWNvZGVjX2RiZyhjb2RlYywKIAkJCSJIRE1JOiBESVAgR1BbJWRdIGJ1ZiByZXBvcnRlZCBzaXplPSVkLCB3cml0dGVuPSVkXG4iLAogCQkJaSwgc2l6ZSwgaik7CiAJfQpAQCAtMTA2Miw2ICsxMDY1LDcgQEAKIHsKIAl1bmlvbiBhdWRpb19pbmZvZnJhbWUgYWk7CiAKKwltZW1zZXQoJmFpLCAwLCBzaXplb2YoYWkpKTsKIAlpZiAoY29ubl90eXBlID09IDApIHsgLyogSERNSSAqLwogCQlzdHJ1Y3QgaGRtaV9hdWRpb19pbmZvZnJhbWUgKmhkbWlfYWkgPSAmYWkuaGRtaTsKIApAQCAtMTA4MCw3ICsxMDg0LDcgQEAKIAkJZHBfYWktPkNDMDJfQ1Q0Nwk9IGFjdGl2ZV9jaGFubmVscyAtIDE7CiAJCWRwX2FpLT5DQQkJPSBjYTsKIAl9IGVsc2UgewotCQlzbmRfcHJpbnRkKCJIRE1JOiB1bmtub3duIGNvbm5lY3Rpb24gdHlwZSBhdCBwaW4gJWRcbiIsCisJCWNvZGVjX2RiZyhjb2RlYywgIkhETUk6IHVua25vd24gY29ubmVjdGlvbiB0eXBlIGF0IHBpbiAlZFxuIiwKIAkJCSAgICBwaW5fbmlkKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEwOTIsOCArMTA5Niw4IEBACiAJICovCiAJaWYgKCFoZG1pX2luZm9mcmFtZV91cHRvZGF0ZShjb2RlYywgcGluX25pZCwgYWkuYnl0ZXMsCiAJCQkJCXNpemVvZihhaSkpKSB7Ci0JCXNuZF9wcmludGRkKCJoZG1pX3Bpbl9zZXR1cF9pbmZvZnJhbWU6ICIKLQkJCSAgICAicGluPSVkIGNoYW5uZWxzPSVkIGNhPTB4JTAyeFxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLAorCQkJICAiaGRtaV9waW5fc2V0dXBfaW5mb2ZyYW1lOiBwaW49JWQgY2hhbm5lbHM9JWQgY2E9MHglMDJ4XG4iLAogCQkJICAgIHBpbl9uaWQsCiAJCQkgICAgYWN0aXZlX2NoYW5uZWxzLCBjYSk7CiAJCWhkbWlfc3RvcF9pbmZvZnJhbWVfdHJhbnMoY29kZWMsIHBpbl9uaWQpOwpAQCAtMTE2MSw3ICsxMTY1LDcgQEAKIHN0YXRpYyB2b2lkIGphY2tfY2FsbGJhY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfamFja190YmwgKmphY2spCiB7CiAJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBwaW5faWR4ID0gcGluX25pZF90b19waW5faW5kZXgoc3BlYywgamFjay0+bmlkKTsKKwlpbnQgcGluX2lkeCA9IHBpbl9uaWRfdG9fcGluX2luZGV4KGNvZGVjLCBqYWNrLT5uaWQpOwogCWlmIChwaW5faWR4IDwgMCkKIAkJcmV0dXJuOwogCkBAIC0xMTgwLDcgKzExODQsNyBAQAogCQlyZXR1cm47CiAJamFjay0+amFja19kaXJ0eSA9IDE7CiAKLQlfc25kX3ByaW50ZChTTkRfUFJfVkVSQk9TRSwKKwljb2RlY19kYmcoY29kZWMsCiAJCSJIRE1JIGhvdCBwbHVnIGV2ZW50OiBDb2RlYz0lZCBQaW49JWQgRGV2aWNlPSVkIEluYWN0aXZlPSVkIFByZXNlbmNlX0RldGVjdD0lZCBFTERfVmFsaWQ9JWRcbiIsCiAJCWNvZGVjLT5hZGRyLCBqYWNrLT5uaWQsIGRldl9lbnRyeSwgISEocmVzICYgQUNfVU5TT0xfUkVTX0lBKSwKIAkJISEocmVzICYgQUNfVU5TT0xfUkVTX1BEKSwgISEocmVzICYgQUNfVU5TT0xfUkVTX0VMRFYpKTsKQEAgLTExOTUsNyArMTE5OSw3IEBACiAJaW50IGNwX3N0YXRlID0gISEocmVzICYgQUNfVU5TT0xfUkVTX0NQX1NUQVRFKTsKIAlpbnQgY3BfcmVhZHkgPSAhIShyZXMgJiBBQ19VTlNPTF9SRVNfQ1BfUkVBRFkpOwogCi0JcHJpbnRrKEtFUk5fSU5GTworCWNvZGVjX2luZm8oY29kZWMsCiAJCSJIRE1JIENQIGV2ZW50OiBDT0RFQz0lZCBUQUc9JWQgU1VCVEFHPTB4JXggQ1BfU1RBVEU9JWQgQ1BfUkVBRFk9JWRcbiIsCiAJCWNvZGVjLT5hZGRyLAogCQl0YWcsCkBAIC0xMjE3LDcgKzEyMjEsNyBAQAogCWludCBzdWJ0YWcgPSAocmVzICYgQUNfVU5TT0xfUkVTX1NVQlRBRykgPj4gQUNfVU5TT0xfUkVTX1NVQlRBR19TSElGVDsKIAogCWlmICghc25kX2hkYV9qYWNrX3RibF9nZXRfZnJvbV90YWcoY29kZWMsIHRhZykpIHsKLQkJc25kX3ByaW50ZChLRVJOX0lORk8gIlVuZXhwZWN0ZWQgSERNSSBldmVudCB0YWcgMHgleFxuIiwgdGFnKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiVW5leHBlY3RlZCBIRE1JIGV2ZW50IHRhZyAweCV4XG4iLCB0YWcpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjQ0LDcgKzEyNDgsNyBAQAogCQltc2xlZXAoNDApOwogCQlwd3IgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9HRVRfUE9XRVJfU1RBVEUsIDApOwogCQlwd3IgPSAocHdyICYgQUNfUFdSU1RfQUNUVUFMKSA+PiBBQ19QV1JTVF9BQ1RVQUxfU0hJRlQ7Ci0JCXNuZF9wcmludGQoIkhhc3dlbGwgSERNSSBhdWRpbzogUG93ZXIgZm9yIHBpbiAweCV4IGlzIG5vdyBEJWRcbiIsIG5pZCwgcHdyKTsKKwkJY29kZWNfZGJnKGNvZGVjLCAiSGFzd2VsbCBIRE1JIGF1ZGlvOiBQb3dlciBmb3IgcGluIDB4JXggaXMgbm93IEQlZFxuIiwgbmlkLCBwd3IpOwogCX0KIH0KIApAQCAtMTI3NCw4ICsxMjc4LDggQEAKIAkJZWxzZQogCQkJbmV3X3BpbmN0bCB8PSBBQ19QSU5DVExfRVBUX05BVElWRTsKIAotCQlzbmRfcHJpbnRkZCgiaGRtaV9waW5faGJyX3NldHVwOiAiCi0JCQkgICAgIk5JRD0weCV4LCAlc3BpbmN0bD0weCV4XG4iLAorCQljb2RlY19kYmcoY29kZWMsCisJCQkgICJoZG1pX3Bpbl9oYnJfc2V0dXA6IE5JRD0weCV4LCAlc3BpbmN0bD0weCV4XG4iLAogCQkJICAgIHBpbl9uaWQsCiAJCQkgICAgcGluY3RsID09IG5ld19waW5jdGwgPyAiIiA6ICJuZXctIiwKIAkJCSAgICBuZXdfcGluY3RsKTsKQEAgLTEzMDIsNyArMTMwNiw3IEBACiAJZXJyID0gc3BlYy0+b3BzLnBpbl9oYnJfc2V0dXAoY29kZWMsIHBpbl9uaWQsIGlzX2hicl9mb3JtYXQoZm9ybWF0KSk7CiAKIAlpZiAoZXJyKSB7Ci0JCXNuZF9wcmludGRkKCJoZG1pX3NldHVwX3N0cmVhbTogSEJSIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQljb2RlY19kYmcoY29kZWMsICJoZG1pX3NldHVwX3N0cmVhbTogSEJSIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTM0MSw2ICsxMzQ1LDggQEAKIAlpZiAoY3Z0X2lkeCA9PSBzcGVjLT5udW1fY3Z0cykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlwZXJfcGluLT5tdXhfaWR4ID0gbXV4X2lkeDsKKwogCWlmIChjdnRfaWQpCiAJCSpjdnRfaWQgPSBjdnRfaWR4OwogCWlmIChtdXhfaWQpCkBAIC0xMzQ5LDYgKzEzNTUsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogQXNzdXJlIHRoZSBwaW4gc2VsZWN0IHRoZSByaWdodCBjb252ZXRvciAqLworc3RhdGljIHZvaWQgaW50ZWxfdmVyaWZ5X3Bpbl9jdnRfY29ubmVjdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbikKK3sKKwloZGFfbmlkX3QgcGluX25pZCA9IHBlcl9waW4tPnBpbl9uaWQ7CisJaW50IG11eF9pZHgsIGN1cnI7CisKKwltdXhfaWR4ID0gcGVyX3Bpbi0+bXV4X2lkeDsKKwljdXJyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBwaW5fbmlkLCAwLAorCQkJCQkgIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLCAwKTsKKwlpZiAoY3VyciAhPSBtdXhfaWR4KQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBwaW5fbmlkLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCisJCQkJCSAgICBtdXhfaWR4KTsKK30KKwogLyogSW50ZWwgSERNSSB3b3JrYXJvdW5kIHRvIGZpeCBhdWRpbyByb3V0aW5nIGlzc3VlOgogICogRm9yIHNvbWUgSW50ZWwgZGlzcGxheSBjb2RlY3MsIHBpbnMgc2hhcmUgdGhlIHNhbWUgY29ubmVjdGlvbiBsaXN0LgogICogU28gYSBjb252ZXRlciBjYW4gYmUgc2VsZWN0ZWQgYnkgbXVsdGlwbGUgcGlucyBhbmQgcGxheWJhY2sgb24gYW55IG9mIHRoZXNlCkBAIC0xMzg5LDcgKzE0MTEsOCBAQAogCQlmb3IgKGN2dF9pZHggPSAwOyBjdnRfaWR4IDwgc3BlYy0+bnVtX2N2dHM7IGN2dF9pZHgrKykgewogCQkJcGVyX2N2dCA9IGdldF9jdnQoc3BlYywgY3Z0X2lkeCk7CiAJCQlpZiAoIXBlcl9jdnQtPmFzc2lnbmVkKSB7Ci0JCQkJc25kX3ByaW50ZGQoImNob29zZSBjdnQgJWQgZm9yIHBpbiBuaWQgJWRcbiIsCisJCQkJY29kZWNfZGJnKGNvZGVjLAorCQkJCQkgICJjaG9vc2UgY3Z0ICVkIGZvciBwaW4gbmlkICVkXG4iLAogCQkJCQljdnRfaWR4LCBuaWQpOwogCQkJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIG5pZCwgMCwKIAkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLApAQCAtMTQxNiw3ICsxNDM5LDcgQEAKIAlpbnQgZXJyOwogCiAJLyogVmFsaWRhdGUgaGluZm8gKi8KLQlwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KHNwZWMsIGhpbmZvKTsKKwlwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KGNvZGVjLCBoaW5mbyk7CiAJaWYgKHNuZF9CVUdfT04ocGluX2lkeCA8IDApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlwZXJfcGluID0gZ2V0X3BpbihzcGVjLCBwaW5faWR4KTsKQEAgLTE0ODIsOSArMTUwNSw4IEBACiAJaGRhX25pZF90IHBpbl9uaWQgPSBwZXJfcGluLT5waW5fbmlkOwogCiAJaWYgKCEoZ2V0X3djYXBzKGNvZGVjLCBwaW5fbmlkKSAmIEFDX1dDQVBfQ09OTl9MSVNUKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgIkhETUk6IHBpbiAlZCB3Y2FwcyAlI3ggIgotCQkJICAgImRvZXMgbm90IHN1cHBvcnQgY29ubmVjdGlvbiBsaXN0XG4iLAorCQljb2RlY193YXJuKGNvZGVjLAorCQkJICAgIkhETUk6IHBpbiAlZCB3Y2FwcyAlI3ggZG9lcyBub3Qgc3VwcG9ydCBjb25uZWN0aW9uIGxpc3RcbiIsCiAJCQkgICBwaW5fbmlkLCBnZXRfd2NhcHMoY29kZWMsIHBpbl9uaWQpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTUyNyw3ICsxNTQ5LDcgQEAKIAllbHNlCiAJCWVsZC0+ZWxkX3ZhbGlkID0gZmFsc2U7CiAKLQlfc25kX3ByaW50ZChTTkRfUFJfVkVSQk9TRSwKKwljb2RlY19kYmcoY29kZWMsCiAJCSJIRE1JIHN0YXR1czogQ29kZWM9JWQgUGluPSVkIFByZXNlbmNlX0RldGVjdD0lZCBFTERfVmFsaWQ9JWRcbiIsCiAJCWNvZGVjLT5hZGRyLCBwaW5fbmlkLCBwaW5fZWxkLT5tb25pdG9yX3ByZXNlbnQsIGVsZC0+ZWxkX3ZhbGlkKTsKIApAQCAtMTY5MCw3ICsxNzEyLDcgQEAKIAogCW5vZGVzID0gc25kX2hkYV9nZXRfc3ViX25vZGVzKGNvZGVjLCBjb2RlYy0+YWZnLCAmbmlkKTsKIAlpZiAoIW5pZCB8fCBub2RlcyA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkhETUk6IGZhaWxlZCB0byBnZXQgYWZnIHN1YiBub2Rlc1xuIik7CisJCWNvZGVjX3dhcm4oY29kZWMsICJIRE1JOiBmYWlsZWQgdG8gZ2V0IGFmZyBzdWIgbm9kZXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3NDQsMTIgKzE3NjYsMjUgQEAKIHsKIAloZGFfbmlkX3QgY3Z0X25pZCA9IGhpbmZvLT5uaWQ7CiAJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KHNwZWMsIGhpbmZvKTsKKwlpbnQgcGluX2lkeCA9IGhpbmZvX3RvX3Bpbl9pbmRleChjb2RlYywgaGluZm8pOwogCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbiA9IGdldF9waW4oc3BlYywgcGluX2lkeCk7CiAJaGRhX25pZF90IHBpbl9uaWQgPSBwZXJfcGluLT5waW5fbmlkOwogCWJvb2wgbm9uX3BjbTsKIAlpbnQgcGluY3RsOwogCisJaWYgKGlzX2hhc3dlbGxfcGx1cyhjb2RlYykgfHwgaXNfdmFsbGV5dmlldyhjb2RlYykpIHsKKwkJLyogVmVyaWZ5IHBpbjpjdnQgc2VsZWN0aW9ucyB0byBhdm9pZCBzaWxlbnQgYXVkaW8gYWZ0ZXIgUzMuCisJCSAqIEFmdGVyIFMzLCB0aGUgYXVkaW8gZHJpdmVyIHJlc3RvcmVzIHBpbjpjdnQgc2VsZWN0aW9ucworCQkgKiBidXQgdGhpcyBjYW4gaGFwcGVuIGJlZm9yZSBnZnggaXMgcmVhZHkgYW5kIHN1Y2ggc2VsZWN0aW9uCisJCSAqIGlzIG92ZXJsb29rZWQgYnkgSFcuIFRodXMgbXVsdGlwbGUgcGlucyBjYW4gc2hhcmUgYSBzYW1lCisJCSAqIGRlZmF1bHQgY29udmVydG9yIGFuZCBtdXRlIGNvbnRyb2wgd2lsbCBhZmZlY3QgZWFjaCBvdGhlciwKKwkJICogd2hpY2ggY2FuIGNhdXNlIGEgcmVzdW1lZCBhdWRpbyBwbGF5YmFjayBiZWNvbWUgc2lsZW50CisJCSAqIGFmdGVyIFMzLgorCQkgKi8KKwkJaW50ZWxfdmVyaWZ5X3Bpbl9jdnRfY29ubmVjdChjb2RlYywgcGVyX3Bpbik7CisJCWludGVsX25vdF9zaGFyZV9hc3NpZ25lZF9jdnQoY29kZWMsIHBpbl9uaWQsIHBlcl9waW4tPm11eF9pZHgpOworCX0KKwogCW5vbl9wY20gPSBjaGVja19ub25fcGNtX3Blcl9jdnQoY29kZWMsIGN2dF9uaWQpOwogCW11dGV4X2xvY2soJnBlcl9waW4tPmxvY2spOwogCXBlcl9waW4tPmNoYW5uZWxzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKQEAgLTE3ODgsNyArMTgyMyw3IEBACiAJaW50IHBpbmN0bDsKIAogCWlmIChoaW5mby0+bmlkKSB7Ci0JCWN2dF9pZHggPSBjdnRfbmlkX3RvX2N2dF9pbmRleChzcGVjLCBoaW5mby0+bmlkKTsKKwkJY3Z0X2lkeCA9IGN2dF9uaWRfdG9fY3Z0X2luZGV4KGNvZGVjLCBoaW5mby0+bmlkKTsKIAkJaWYgKHNuZF9CVUdfT04oY3Z0X2lkeCA8IDApKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXBlcl9jdnQgPSBnZXRfY3Z0KHNwZWMsIGN2dF9pZHgpOwpAQCAtMTc5Nyw3ICsxODMyLDcgQEAKIAkJcGVyX2N2dC0+YXNzaWduZWQgPSAwOwogCQloaW5mby0+bmlkID0gMDsKIAotCQlwaW5faWR4ID0gaGluZm9fdG9fcGluX2luZGV4KHNwZWMsIGhpbmZvKTsKKwkJcGluX2lkeCA9IGhpbmZvX3RvX3Bpbl9pbmRleChjb2RlYywgaGluZm8pOwogCQlpZiAoc25kX0JVR19PTihwaW5faWR4IDwgMCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcGVyX3BpbiA9IGdldF9waW4oc3BlYywgcGluX2lkeCk7CkBAIC0yMjExLDcgKzIyNDYsNyBAQAogCQlyZXR1cm47CiAKIAkvKiBvdmVycmlkZSBwaW5zIGNvbm5lY3Rpb24gbGlzdCAqLwotCXNuZF9wcmludGRkKCJoZG1pOiBoYXN3ZWxsOiBvdmVycmlkZSBwaW4gY29ubmVjdGlvbiAweCV4XG4iLCBuaWQpOworCWNvZGVjX2RiZyhjb2RlYywgImhkbWk6IGhhc3dlbGw6IG92ZXJyaWRlIHBpbiBjb25uZWN0aW9uIDB4JXhcbiIsIG5pZCk7CiAJc25kX2hkYV9vdmVycmlkZV9jb25uX2xpc3QoY29kZWMsIG5pZCwgc3BlYy0+bnVtX2N2dHMsIHNwZWMtPmN2dF9uaWRzKTsKIH0KIApAQCAtMzEzMiw4ICszMTY3LDggQEAKIAkJZWxzZQogCQkJaGJyX2N0bF9uZXcgPSBoYnJfY3RsICYgfkFUSV9IQlJfRU5BQkxFOwogCi0JCXNuZF9wcmludGRkKCJhdGloZG1pX3Bpbl9oYnJfc2V0dXA6ICIKLQkJCQkiTklEPTB4JXgsICVzaGJyLWN0bD0weCV4XG4iLAorCQljb2RlY19kYmcoY29kZWMsCisJCQkgICJhdGloZG1pX3Bpbl9oYnJfc2V0dXA6IE5JRD0weCV4LCAlc2hici1jdGw9MHgleFxuIiwKIAkJCQlwaW5fbmlkLAogCQkJCWhicl9jdGwgPT0gaGJyX2N0bF9uZXcgPyAiIiA6ICJuZXctIiwKIAkJCQloYnJfY3RsX25ldyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCmluZGV4IDhkMGE4NDQuLmVhMjM1MWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCkBAIC0zOTUsNiArMzk1LDggQEAKIAkJZ290byBkb19za3U7CiAJfQogCisJaWYgKCFjb2RlYy0+YnVzLT5wY2kpCisJCXJldHVybiAtMTsKIAlhc3MgPSBjb2RlYy0+c3Vic3lzdGVtX2lkICYgMHhmZmZmOwogCWlmIChhc3MgIT0gY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlICYmIChhc3MgJiAxKSkKIAkJZ290byBkb19za3U7CkBAIC00MDUsOCArNDA3LDggQEAKIAlhc3MgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCk7CiAKIAlpZiAoIShhc3MgJiAxKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBTS1Ugbm90IHJlYWR5IDB4JTA4eFxuIiwKLQkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUsIGFzcyk7CisJCWNvZGVjX2luZm8oY29kZWMsICIlczogU0tVIG5vdCByZWFkeSAweCUwOHhcbiIsCisJCQkgICBjb2RlYy0+Y2hpcF9uYW1lLCBhc3MpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC00MzAsMTcgKzQzMiwxNyBAQAogCXNwZWMtPmNkZWZpbmUuc3dhcCA9IChhc3MgJiAweDIpID4+IDE7CiAJc3BlYy0+Y2RlZmluZS5vdmVycmlkZSA9IGFzcyAmIDB4MTsKIAotCXNuZF9wcmludGQoIlNLVTogTmlkPTB4JXggc2t1X2NmZz0weCUwOHhcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAiU0tVOiBOaWQ9MHgleCBza3VfY2ZnPTB4JTA4eFxuIiwKIAkJICAgbmlkLCBzcGVjLT5jZGVmaW5lLnNrdV9jZmcpOwotCXNuZF9wcmludGQoIlNLVTogcG9ydF9jb25uZWN0aXZpdHk9MHgleFxuIiwKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IHBvcnRfY29ubmVjdGl2aXR5PTB4JXhcbiIsCiAJCSAgIHNwZWMtPmNkZWZpbmUucG9ydF9jb25uZWN0aXZpdHkpOwotCXNuZF9wcmludGQoIlNLVTogZW5hYmxlX3BjYmVlcD0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLmVuYWJsZV9wY2JlZXApOwotCXNuZF9wcmludGQoIlNLVTogY2hlY2tfc3VtPTB4JTA4eFxuIiwgc3BlYy0+Y2RlZmluZS5jaGVja19zdW0pOwotCXNuZF9wcmludGQoIlNLVTogY3VzdG9taXphdGlvbj0weCUwOHhcbiIsIHNwZWMtPmNkZWZpbmUuY3VzdG9taXphdGlvbik7Ci0Jc25kX3ByaW50ZCgiU0tVOiBleHRlcm5hbF9hbXA9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5leHRlcm5hbF9hbXApOwotCXNuZF9wcmludGQoIlNLVTogcGxhdGZvcm1fdHlwZT0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUpOwotCXNuZF9wcmludGQoIlNLVTogc3dhcD0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLnN3YXApOwotCXNuZF9wcmludGQoIlNLVTogb3ZlcnJpZGU9MHgleFxuIiwgc3BlYy0+Y2RlZmluZS5vdmVycmlkZSk7CisJY29kZWNfZGJnKGNvZGVjLCAiU0tVOiBlbmFibGVfcGNiZWVwPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuZW5hYmxlX3BjYmVlcCk7CisJY29kZWNfZGJnKGNvZGVjLCAiU0tVOiBjaGVja19zdW09MHglMDh4XG4iLCBzcGVjLT5jZGVmaW5lLmNoZWNrX3N1bSk7CisJY29kZWNfZGJnKGNvZGVjLCAiU0tVOiBjdXN0b21pemF0aW9uPTB4JTA4eFxuIiwgc3BlYy0+Y2RlZmluZS5jdXN0b21pemF0aW9uKTsKKwljb2RlY19kYmcoY29kZWMsICJTS1U6IGV4dGVybmFsX2FtcD0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLmV4dGVybmFsX2FtcCk7CisJY29kZWNfZGJnKGNvZGVjLCAiU0tVOiBwbGF0Zm9ybV90eXBlPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUucGxhdGZvcm1fdHlwZSk7CisJY29kZWNfZGJnKGNvZGVjLCAiU0tVOiBzd2FwPTB4JXhcbiIsIHNwZWMtPmNkZWZpbmUuc3dhcCk7CisJY29kZWNfZGJnKGNvZGVjLCAiU0tVOiBvdmVycmlkZT0weCV4XG4iLCBzcGVjLT5jZGVmaW5lLm92ZXJyaWRlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDgzLDcgKzQ4NSw4IEBACiAJfQogCiAJYXNzID0gY29kZWMtPnN1YnN5c3RlbV9pZCAmIDB4ZmZmZjsKLQlpZiAoKGFzcyAhPSBjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpICYmIChhc3MgJiAxKSkKKwlpZiAoY29kZWMtPmJ1cy0+cGNpICYmCisJICAgIGFzcyAhPSBjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgJiYgKGFzcyAmIDEpKQogCQlnb3RvIGRvX3NrdTsKIAogCS8qIGludmFsaWQgU1NJRCwgY2hlY2sgdGhlIHNwZWNpYWwgTklEIHBpbiBkZWZjZmcgaW5zdGVhZCAqLwpAQCAtNDk5LDggKzUwMiw4IEBACiAJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDI2MCkKIAkJbmlkID0gMHgxNzsKIAlhc3MgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCk7Ci0Jc25kX3ByaW50ZCgicmVhbHRlazogTm8gdmFsaWQgU1NJRCwgIgotCQkgICAiY2hlY2tpbmcgcGluY2ZnIDB4JTA4eCBmb3IgTklEIDB4JXhcbiIsCisJY29kZWNfZGJnKGNvZGVjLAorCQkgICJyZWFsdGVrOiBObyB2YWxpZCBTU0lELCBjaGVja2luZyBwaW5jZmcgMHglMDh4IGZvciBOSUQgMHgleFxuIiwKIAkJICAgYXNzLCBuaWQpOwogCWlmICghKGFzcyAmIDEpKQogCQlyZXR1cm4gMDsKQEAgLTUxNiw3ICs1MTksNyBAQAogCWlmICgoKGFzcyA+PiAxNikgJiAweGYpICE9IHRtcCkKIAkJcmV0dXJuIDA7CiBkb19za3U6Ci0Jc25kX3ByaW50ZCgicmVhbHRlazogRW5hYmxpbmcgaW5pdCBBU01fSUQ9MHglMDR4IENPREVDX0lEPSUwOHhcbiIsCisJY29kZWNfZGJnKGNvZGVjLCAicmVhbHRlazogRW5hYmxpbmcgaW5pdCBBU01fSUQ9MHglMDR4IENPREVDX0lEPSUwOHhcbiIsCiAJCSAgIGFzcyAmIDB4ZmZmZiwgY29kZWMtPnZlbmRvcl9pZCk7CiAJLyoKIAkgKiAwIDogb3ZlcnJpZGUKQEAgLTU3NCw4ICs1NzcsOCBAQAogewogCWlmICghYWxjX3N1YnN5c3RlbV9pZChjb2RlYywgcG9ydHMpKSB7CiAJCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCQlzbmRfcHJpbnRkKCJyZWFsdGVrOiAiCi0JCQkgICAiRW5hYmxlIGRlZmF1bHQgc2V0dXAgZm9yIGF1dG8gbW9kZSBhcyBmYWxsYmFja1xuIik7CisJCWNvZGVjX2RiZyhjb2RlYywKKwkJCSAgInJlYWx0ZWs6IEVuYWJsZSBkZWZhdWx0IHNldHVwIGZvciBhdXRvIG1vZGUgYXMgZmFsbGJhY2tcbiIpOwogCQlzcGVjLT5pbml0X2FtcCA9IEFMQ19JTklUX0RFRkFVTFQ7CiAJfQogfQpAQCAtODQ1LDExICs4NDgsNyBAQAogCQlzbmRfaGRhX3NodXR1cF9waW5zKGNvZGVjKTsKIH0KIAotc3RhdGljIHZvaWQgYWxjX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc25kX2hkYV9hcHBseV9maXh1cChjb2RlYywgSERBX0ZJWFVQX0FDVF9GUkVFKTsKLQlzbmRfaGRhX2dlbl9mcmVlKGNvZGVjKTsKLX0KKyNkZWZpbmUgYWxjX2ZyZWUJc25kX2hkYV9nZW5fZnJlZQogCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgdm9pZCBhbGNfcG93ZXJfZWFwZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTk3MCw2ICs5NjksOCBAQAogCQkJcmV0dXJuIGFsY19jb2RlY19yZW5hbWUoY29kZWMsIHAtPm5hbWUpOwogCX0KIAorCWlmICghY29kZWMtPmJ1cy0+cGNpKQorCQlyZXR1cm4gMDsKIAlmb3IgKHEgPSByZW5hbWVfcGNpX3RibDsgcS0+Y29kZWNfdmVuZG9yX2lkOyBxKyspIHsKIAkJaWYgKHEtPmNvZGVjX3ZlbmRvcl9pZCAhPSBjb2RlYy0+dmVuZG9yX2lkKQogCQkJY29udGludWU7CkBAIC05OTMsNiArOTk0LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGJlZXBfd2hpdGVfbGlzdFtdID0gewogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwM2MsICJBU1VTIiwgMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTE1ZCwgIkFTVVMiLCAxKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MjlmLCAiQVNVUyIsIDEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgzNzYsICJFZWVQQyIsIDEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgzY2UsICJFZWVQQyIsIDEpLApAQCAtMjc4Niw2ICsyNzg4LDIzNyBAQAogCXNuZF9oZGFfc2h1dHVwX3BpbnMoY29kZWMpOwogfQogCitzdGF0aWMgdm9pZCBhbGMyODJfcmVzdG9yZV9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWludCB2YWw7CisKKwkvKiBQb3dlciBEb3duIENvbnRyb2wgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDMsIDB4MDAwMik7CisJLyogRklGTyBhbmQgZmlsdGVyIGNsb2NrICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA1LCAweDA3MDApOworCS8qIERNSUMgY29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwNywgMHgwMjAwKTsKKwkvKiBBbmFsb2cgY2xvY2sgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwNik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA2LCAodmFsICYgfjB4MDBmMCkgfCAweDApOworCS8qIEpEICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MDgpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwOCwgKHZhbCAmIH4weGZmZmMpIHwgMHgwYzJjKTsKKwkvKiBKRCBvZmZzZXQxICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDBhLCAweGNjY2MpOworCS8qIEpEIG9mZnNldDIgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGIsIDB4Y2NjYyk7CisJLyogTERPMS8yLzMsIERBQy9BREMgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGUsIDB4NmUwMCk7CisJLyogSkQgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwZik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDBmLCAodmFsICYgfjB4ZjgwMCkgfCAweDEwMDApOworCS8qIENhcGxlc3MgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxMCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDEwLCAodmFsICYgfjB4ZmMwMCkgfCAweDBjMDApOworCS8qIENsYXNzIEQgdGVzdCA0ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZmLCAweDApOworCS8qIElPIHBvd2VyIGRvd24gZGlyZWN0bHkgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwYyk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDBjLCAodmFsICYgfjB4ZmUwMCkgfCAweDApOworCS8qIEFOQyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzNCwgMHhhMGMwKTsKKwkvKiBBR0MgTVVYICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MTYpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxNiwgKHZhbCAmIH4weDAwMDgpIHwgMHgwKTsKKwkvKiBEQUMgc2ltcGxlIGNvbnRlbnQgcHJvdGVjdGlvbiAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDFkKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWQsICh2YWwgJiB+MHgwMGUwKSB8IDB4MCk7CisJLyogQURDIHNpbXBsZSBjb250ZW50IHByb3RlY3Rpb24gKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxZik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFmLCAodmFsICYgfjB4MDBlMCkgfCAweDApOworCS8qIERBQyBBREMgWmVybyBEZXRlY3Rpb24gKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MjEsIDB4ODgwNCk7CisJLyogUExMICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDYzLCAweDI5MDIpOworCS8qIGNhcGxlc3MgY29udHJvbCAyICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDY4LCAweGEwODApOworCS8qIGNhcGxlc3MgY29udHJvbCAzICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDY5LCAweDM0MDApOworCS8qIGNhcGxlc3MgY29udHJvbCA0ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZhLCAweDJmM2UpOworCS8qIGNhcGxlc3MgY29udHJvbCA1ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZiLCAweDApOworCS8qIGNsYXNzIEQgdGVzdCAyICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NmQpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg2ZCwgKHZhbCAmIH4weDBmZmYpIHwgMHgwOTAwKTsKKwkvKiBjbGFzcyBEIHRlc3QgMyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg2ZSwgMHgxMTBhKTsKKwkvKiBjbGFzcyBEIHRlc3QgNSAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDcwKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NzAsICh2YWwgJiB+MHgwMGY4KSB8IDB4MDBkOCk7CisJLyogY2xhc3MgRCB0ZXN0IDYgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NzEsIDB4MDAxNCk7CisJLyogY2xhc3NEIE9DUCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3MiwgMHhjMmJhKTsKKwkvKiBjbGFzc0QgcHVyZSBEQyB0ZXN0ICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NzcpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3NywgKHZhbCAmIH4weDBmODApIHwgMHgwKTsKKwkvKiBDbGFzcyBEIGFtcCBjb250cm9sICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZjLCAweGZjMDYpOworfQorCitzdGF0aWMgdm9pZCBhbGMyODJfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgaHBfcGluID0gc3BlYy0+Z2VuLmF1dG9jZmcuaHBfcGluc1swXTsKKwlib29sIGhwX3Bpbl9zZW5zZTsKKwlpbnQgY29lZjc4OworCisJYWxjMjgyX3Jlc3RvcmVfZGVmYXVsdF92YWx1ZShjb2RlYyk7CisKKwlpZiAoIWhwX3BpbikKKwkJcmV0dXJuOworCWhwX3Bpbl9zZW5zZSA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIGhwX3Bpbik7CisJY29lZjc4ID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NzgpOworCisJLyogSW5kZXggMHg3OCBEaXJlY3QgRHJpdmUgSFAgQU1QIExQTSBDb250cm9sIDEgKi8KKwkvKiBIZWFkcGhvbmUgY2FwbGVzcyBzZXQgdG8gaGlnaCBwb3dlciBtb2RlICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDc4LCAweDkwMDQpOworCisJaWYgKGhwX3Bpbl9zZW5zZSkKKwkJbXNsZWVwKDIpOworCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgaHBfcGluLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSk7CisKKwlpZiAoaHBfcGluX3NlbnNlKQorCQltc2xlZXAoODUpOworCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgaHBfcGluLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCk7CisKKwlpZiAoaHBfcGluX3NlbnNlKQorCQltc2xlZXAoMTAwKTsKKworCS8qIEhlYWRwaG9uZSBjYXBsZXNzIHNldCB0byBub3JtYWwgbW9kZSAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg3OCwgY29lZjc4KTsKK30KKworc3RhdGljIHZvaWQgYWxjMjgyX3NodXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgaHBfcGluID0gc3BlYy0+Z2VuLmF1dG9jZmcuaHBfcGluc1swXTsKKwlib29sIGhwX3Bpbl9zZW5zZTsKKwlpbnQgY29lZjc4OworCisJaWYgKCFocF9waW4pIHsKKwkJYWxjMjY5X3NodXR1cChjb2RlYyk7CisJCXJldHVybjsKKwl9CisKKwlocF9waW5fc2Vuc2UgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBocF9waW4pOworCWNvZWY3OCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDc4KTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NzgsIDB4OTAwNCk7CisKKwlpZiAoaHBfcGluX3NlbnNlKQorCQltc2xlZXAoMik7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBocF9waW4sIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFKTsKKworCWlmIChocF9waW5fc2Vuc2UpCisJCW1zbGVlcCg4NSk7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBocF9waW4sIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDApOworCisJaWYgKGhwX3Bpbl9zZW5zZSkKKwkJbXNsZWVwKDEwMCk7CisKKwlhbGNfYXV0b19zZXR1cF9lYXBkKGNvZGVjLCBmYWxzZSk7CisJc25kX2hkYV9zaHV0dXBfcGlucyhjb2RlYyk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDc4LCBjb2VmNzgpOworfQorCitzdGF0aWMgdm9pZCBhbGMyODNfcmVzdG9yZV9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWludCB2YWw7CisKKwkvKiBQb3dlciBEb3duIENvbnRyb2wgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDMsIDB4MDAwMik7CisJLyogRklGTyBhbmQgZmlsdGVyIGNsb2NrICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA1LCAweDA3MDApOworCS8qIERNSUMgY29udHJvbCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwNywgMHgwMjAwKTsKKwkvKiBBbmFsb2cgY2xvY2sgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwNik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA2LCAodmFsICYgfjB4MDBmMCkgfCAweDApOworCS8qIEpEICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MDgpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwOCwgKHZhbCAmIH4weGZmZmMpIHwgMHgwYzJjKTsKKwkvKiBKRCBvZmZzZXQxICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDBhLCAweGNjY2MpOworCS8qIEpEIG9mZnNldDIgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGIsIDB4Y2NjYyk7CisJLyogTERPMS8yLzMsIERBQy9BREMgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MGUsIDB4NmZjMCk7CisJLyogSkQgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwZik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDBmLCAodmFsICYgfjB4ZjgwMCkgfCAweDEwMDApOworCS8qIENhcGxlc3MgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxMCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDEwLCAodmFsICYgfjB4ZmMwMCkgfCAweDBjMDApOworCS8qIENsYXNzIEQgdGVzdCA0ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDNhLCAweDApOworCS8qIElPIHBvd2VyIGRvd24gZGlyZWN0bHkgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwYyk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDBjLCAodmFsICYgfjB4ZmUwMCkgfCAweDApOworCS8qIEFOQyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgyMiwgMHhhMGMwKTsKKwkvKiBBR0MgTVVYICovCisJdmFsID0gYWxjX3JlYWRfY29lZmV4X2lkeChjb2RlYywgMHg1MywgMHgwMSk7CisJYWxjX3dyaXRlX2NvZWZleF9pZHgoY29kZWMsIDB4NTMsIDB4MDEsICh2YWwgJiB+MHgwMDBmKSB8IDB4MDAwOCk7CisJLyogREFDIHNpbXBsZSBjb250ZW50IHByb3RlY3Rpb24gKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxZCk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFkLCAodmFsICYgfjB4MDBlMCkgfCAweDApOworCS8qIEFEQyBzaW1wbGUgY29udGVudCBwcm90ZWN0aW9uICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MWYpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxZiwgKHZhbCAmIH4weDAwZTApIHwgMHgwKTsKKwkvKiBEQUMgQURDIFplcm8gRGV0ZWN0aW9uICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDIxLCAweDg4MDQpOworCS8qIFBMTCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgyZSwgMHgyOTAyKTsKKwkvKiBjYXBsZXNzIGNvbnRyb2wgMiAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzMywgMHhhMDgwKTsKKwkvKiBjYXBsZXNzIGNvbnRyb2wgMyAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzNCwgMHgzNDAwKTsKKwkvKiBjYXBsZXNzIGNvbnRyb2wgNCAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzNSwgMHgyZjNlKTsKKwkvKiBjYXBsZXNzIGNvbnRyb2wgNSAqLworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgzNiwgMHgwKTsKKwkvKiBjbGFzcyBEIHRlc3QgMiAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDM4KTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MzgsICh2YWwgJiB+MHgwZmZmKSB8IDB4MDkwMCk7CisJLyogY2xhc3MgRCB0ZXN0IDMgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MzksIDB4MTEwYSk7CisJLyogY2xhc3MgRCB0ZXN0IDUgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgzYik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDNiLCAodmFsICYgfjB4MDBmOCkgfCAweDAwZDgpOworCS8qIGNsYXNzIEQgdGVzdCA2ICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDNjLCAweDAwMTQpOworCS8qIGNsYXNzRCBPQ1AgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4M2QsIDB4YzJiYSk7CisJLyogY2xhc3NEIHB1cmUgREMgdGVzdCAqLworCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDQyKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDIsICh2YWwgJiB+MHgwZjgwKSB8IDB4MCk7CisJLyogdGVzdCBtb2RlICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQ5LCAweDApOworCS8qIENsYXNzIEQgREMgZW5hYmxlICovCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NDApOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg0MCwgKHZhbCAmIH4weGY4MDApIHwgMHg5ODAwKTsKKwkvKiBEQyBvZmZzZXQgKi8KKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg0Mik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQyLCAodmFsICYgfjB4ZjAwMCkgfCAweDIwMDApOworCS8qIENsYXNzIEQgYW1wIGNvbnRyb2wgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MzcsIDB4ZmMwNik7Cit9CisKIHN0YXRpYyB2b2lkIGFsYzI4M19pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtMjc5Myw2ICszMDI2LDggQEAKIAlib29sIGhwX3Bpbl9zZW5zZTsKIAlpbnQgdmFsOwogCisJYWxjMjgzX3Jlc3RvcmVfZGVmYXVsdF92YWx1ZShjb2RlYyk7CisKIAlpZiAoIWhwX3BpbikKIAkJcmV0dXJuOwogCWhwX3Bpbl9zZW5zZSA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIGhwX3Bpbik7CkBAIC0zMTY5LDcgKzM0MDQsOCBAQAogCQlzcGVjLT5nZW4udm1hc3Rlcl9tdXRlLmhvb2sgPSBhbGMyNjlfZml4dXBfbWljX211dGVfaG9vazsKIAkJc3BlYy0+Z2VuLnZtYXN0ZXJfbXV0ZV9lbnVtID0gMTsKIAkJY29kZWMtPnBvd2VyX2ZpbHRlciA9IGxlZF9wb3dlcl9maWx0ZXI7Ci0JCXNuZF9wcmludGQoIkRldGVjdGVkIG11dGUgTEVEIGZvciAleDolZFxuIiwgc3BlYy0+bXV0ZV9sZWRfbmlkLAorCQljb2RlY19kYmcoY29kZWMsCisJCQkgICJEZXRlY3RlZCBtdXRlIExFRCBmb3IgJXg6JWRcbiIsIHNwZWMtPm11dGVfbGVkX25pZCwKIAkJCSAgIHNwZWMtPm11dGVfbGVkX3BvbGFyaXR5KTsKIAkJYnJlYWs7CiAJfQpAQCAtMzI5NSw3ICszNTMxLDcgQEAKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGI3LCAweDgwMmIpOwogCQlicmVhazsKIAl9Ci0Jc25kX3ByaW50ZGQoIkhlYWRzZXQgamFjayBzZXQgdG8gdW5wbHVnZ2VkIG1vZGUuXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJIZWFkc2V0IGphY2sgc2V0IHRvIHVucGx1Z2dlZCBtb2RlLlxuIik7CiB9CiAKIApAQCAtMzMzOCw3ICszNTc0LDcgQEAKIAkJc25kX2hkYV9zZXRfcGluX2N0bF9jYWNoZShjb2RlYywgbWljX3BpbiwgUElOX1ZSRUY1MCk7CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIHNldCB0byBtaWMtaW4gbW9kZS5cbiIpOworCWNvZGVjX2RiZyhjb2RlYywgIkhlYWRzZXQgamFjayBzZXQgdG8gbWljLWluIG1vZGUuXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjX2hlYWRzZXRfbW9kZV9kZWZhdWx0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMzM2Niw3ICszNjAyLDcgQEAKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGI3LCAweDgwMmIpOwogCQlicmVhazsKIAl9Ci0Jc25kX3ByaW50ZGQoIkhlYWRzZXQgamFjayBzZXQgdG8gaGVhZHBob25lIChkZWZhdWx0KSBtb2RlLlxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiSGVhZHNldCBqYWNrIHNldCB0byBoZWFkcGhvbmUgKGRlZmF1bHQpIG1vZGUuXG4iKTsKIH0KIAogLyogSXBob25lIHR5cGUgKi8KQEAgLTMzOTUsNyArMzYzMSw3IEBACiAJCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHhjMywgMHgwMDAwKTsKIAkJYnJlYWs7CiAJfQotCXNuZF9wcmludGRkKCJIZWFkc2V0IGphY2sgc2V0IHRvIGlQaG9uZS1zdHlsZSBoZWFkc2V0IG1vZGUuXG4iKTsKKwljb2RlY19kYmcoY29kZWMsICJIZWFkc2V0IGphY2sgc2V0IHRvIGlQaG9uZS1zdHlsZSBoZWFkc2V0IG1vZGUuXG4iKTsKIH0KIAogLyogTm9raWEgdHlwZSAqLwpAQCAtMzQyNCw3ICszNjYwLDcgQEAKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGMzLCAweDAwMDApOwogCQlicmVhazsKIAl9Ci0Jc25kX3ByaW50ZGQoIkhlYWRzZXQgamFjayBzZXQgdG8gTm9raWEtc3R5bGUgaGVhZHNldCBtb2RlLlxuIik7CisJY29kZWNfZGJnKGNvZGVjLCAiSGVhZHNldCBqYWNrIHNldCB0byBOb2tpYS1zdHlsZSBoZWFkc2V0IG1vZGUuXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjX2RldGVybWluZV9oZWFkc2V0X3R5cGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0zNDY2LDcgKzM3MDIsNyBAQAogCQlicmVhazsKIAl9CiAKLQlzbmRfcHJpbnRkZCgiSGVhZHNldCBqYWNrIGRldGVjdGVkIGlQaG9uZS1zdHlsZSBoZWFkc2V0OiAlc1xuIiwKKwljb2RlY19kYmcoY29kZWMsICJIZWFkc2V0IGphY2sgZGV0ZWN0ZWQgaVBob25lLXN0eWxlIGhlYWRzZXQ6ICVzXG4iLAogCQkgICAgaXNfY3RpYSA/ICJ5ZXMiIDogIm5vIik7CiAJc3BlYy0+Y3VycmVudF9oZWFkc2V0X3R5cGUgPSBpc19jdGlhID8gQUxDX0hFQURTRVRfVFlQRV9DVElBIDogQUxDX0hFQURTRVRfVFlQRV9PTVRQOwogfQpAQCAtMzU5MiwyMSArMzgyOCwzOCBAQAogCQlhbGNfZml4dXBfaGVhZHNldF9tb2RlKGNvZGVjLCBmaXgsIGFjdGlvbik7CiB9CiAKK3N0YXRpYyB2b2lkIGFsYzI1NV9zZXRfZGVmYXVsdF9qYWNrX3R5cGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJLyogU2V0IHRvIGlwaG9uZSB0eXBlICovCisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFiLCAweDg4MGIpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg0NSwgMHhkMDg5KTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWIsIDB4MDgwYik7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQ2LCAweDAwMDQpOworCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxYiwgMHgwYzBiKTsKKwltc2xlZXAoMzApOworfQorCiBzdGF0aWMgdm9pZCBhbGNfZml4dXBfaGVhZHNldF9tb2RlX2FsYzI1NShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQljb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCiB7CiAJaWYgKGFjdGlvbiA9PSBIREFfRklYVVBfQUNUX1BSRV9QUk9CRSkgewotCQkvKiBTZXQgdG8gaXBob25lIHR5cGUgKi8KLQkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFiLCAweDg4MGIpOwotCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NDUsIDB4ZDA4OSk7Ci0JCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxYiwgMHgwODBiKTsKLQkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQ2LCAweDAwMDQpOwotCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWIsIDB4MGMwYik7Ci0JCW1zbGVlcCgzMCk7CisJCWFsYzI1NV9zZXRfZGVmYXVsdF9qYWNrX3R5cGUoY29kZWMpOwogCX0KIAlhbGNfZml4dXBfaGVhZHNldF9tb2RlKGNvZGVjLCBmaXgsIGFjdGlvbik7CiB9CiAKK3N0YXRpYyB2b2lkIGFsY19maXh1cF9oZWFkc2V0X21vZGVfYWxjMjU1X25vX2hwX21pYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQljb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJaWYgKGFjdGlvbiA9PSBIREFfRklYVVBfQUNUX1BSRV9QUk9CRSkgeworCQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwkJc3BlYy0+cGFyc2VfZmxhZ3MgfD0gSERBX1BJTkNGR19IRUFEU0VUX01JQzsKKwkJYWxjMjU1X3NldF9kZWZhdWx0X2phY2tfdHlwZShjb2RlYyk7CisJfSAKKwllbHNlCisJCWFsY19maXh1cF9oZWFkc2V0X21vZGUoY29kZWMsIGZpeCwgYWN0aW9uKTsKK30KKwogc3RhdGljIHZvaWQgYWxjX2ZpeHVwX2F1dG9fbXV0ZV92aWFfYW1wKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCQljb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCiB7CkBAIC0zODg3LDcgKzQxNDAsOSBAQAogCUFMQzI5MF9GSVhVUF9TVUJXT09GRVJfSFNKQUNLLAogCUFMQzI2OV9GSVhVUF9USElOS1BBRF9BQ1BJLAogCUFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCisJQUxDMjU1X0ZJWFVQX0RFTEwyX01JQ19OT19QUkVTRU5DRSwKIAlBTEMyNTVfRklYVVBfSEVBRFNFVF9NT0RFLAorCUFMQzI1NV9GSVhVUF9IRUFEU0VUX01PREVfTk9fSFBfTUlDLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfZml4dXAgYWxjMjY5X2ZpeHVwc1tdID0gewpAQCAtNDI2NCwxMCArNDUxOSwyMyBAQAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzI1NV9GSVhVUF9IRUFEU0VUX01PREUKIAl9LAorCVtBTEMyNTVfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CisJCQl7IDB4MTksIDB4MDFhMTkxM2MgfSwgLyogdXNlIGFzIGhlYWRzZXQgbWljLCB3aXRob3V0IGl0cyBvd24gamFjayBkZXRlY3QgKi8KKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzI1NV9GSVhVUF9IRUFEU0VUX01PREVfTk9fSFBfTUlDCisJfSwKIAlbQUxDMjU1X0ZJWFVQX0hFQURTRVRfTU9ERV0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBhbGNfZml4dXBfaGVhZHNldF9tb2RlX2FsYzI1NSwKIAl9LAorCVtBTEMyNTVfRklYVVBfSEVBRFNFVF9NT0RFX05PX0hQX01JQ10gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBhbGNfZml4dXBfaGVhZHNldF9tb2RlX2FsYzI1NV9ub19ocF9taWMsCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjlfZml4dXBfdGJsW10gPSB7CkBAIC00MzE5LDYgKzQ1ODcsOSBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2MTYsICJEZWxsIFZvc3RybyA1NDcwIiwgQUxDMjkwX0ZJWFVQX1NVQldPT0ZFUl9IU0pBQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2MWYsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYyOSwgIkRlbGwiLCBBTEMyNjlfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjJjLCAiRGVsbCIsIEFMQzI2OV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2MmUsICJEZWxsIiwgQUxDMjY5X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYzMiwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjM4LCAiRGVsbCBJbnNwaXJvbiA1NDM5IiwgQUxDMjkwX0ZJWFVQX01PTk9fU1BFQUtFUlNfSFNKQUNLKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjNlLCAiRGVsbCIsIEFMQzI2OV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2M2YsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCkBAIC00MzMxLDYgKzQ2MDIsOCBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NTgsICJEZWxsIiwgQUxDMjY5X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY1ZiwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjYyLCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2NjgsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwyX01JQ19OT19QUkVTRU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDY2OSwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgxNWNjLCAiRGVsbCBYNSBQcmVjaXNpb24iLCBBTEMyNjlfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgxNWNkLCAiRGVsbCBYNSBQcmVjaXNpb24iLCBBTEMyNjlfRklYVVBfREVMTDJfTUlDX05PX1BSRVNFTkNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxNTg2LCAiSFAiLCBBTEMyNjlfRklYVVBfSFBfTVVURV9MRURfTUlDMiksCkBAIC00NTczLDEzICs0ODQ2LDE1IEBACiAJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNjlWQTsKIAkJc3dpdGNoIChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIDB4MDBmMCkgewogCQljYXNlIDB4MDAxMDoKLQkJCWlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDI1ICYmCisJCQlpZiAoY29kZWMtPmJ1cy0+cGNpICYmCisJCQkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgogCQkJICAgIHNwZWMtPmNkZWZpbmUucGxhdGZvcm1fdHlwZSA9PSAxKQogCQkJCWVyciA9IGFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNzFYIik7CiAJCQlzcGVjLT5jb2RlY192YXJpYW50ID0gQUxDMjY5X1RZUEVfQUxDMjY5VkI7CiAJCQlicmVhazsKIAkJY2FzZSAweDAwMjA6Ci0JCQlpZiAoY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTdhYSAmJgorCQkJaWYgKGNvZGVjLT5idXMtPnBjaSAmJgorCQkJICAgIGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDE3YWEgJiYKIAkJCSAgICBjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgyMWYzKQogCQkJCWVyciA9IGFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMzMjAyIik7CiAJCQlzcGVjLT5jb2RlY192YXJpYW50ID0gQUxDMjY5X1RZUEVfQUxDMjY5VkM7CkBAIC00NjAyLDYgKzQ4NzcsOCBAQAogCQlicmVhazsKIAljYXNlIDB4MTBlYzAyODI6CiAJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyODI7CisJCXNwZWMtPnNodXR1cCA9IGFsYzI4Ml9zaHV0dXA7CisJCXNwZWMtPmluaXRfaG9vayA9IGFsYzI4Ml9pbml0OwogCQlicmVhazsKIAljYXNlIDB4MTBlYzAyMzM6CiAJY2FzZSAweDEwZWMwMjgzOgpAQCAtNDkxOSw4ICs1MTk2LDcgQEAKIAkJCQkgICAgICAoMHgzYiA8PCBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUKSB8CiAJCQkJICAgICAgKDB4MDMgPDwgQUNfQU1QQ0FQX1NURVBfU0laRV9TSElGVCkgfAogCQkJCSAgICAgICgwIDw8IEFDX0FNUENBUF9NVVRFX1NISUZUKSkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJoZGFfY29kZWM6IGZhaWxlZCB0byBvdmVycmlkZSBhbXAgY2FwcyBmb3IgTklEIDB4MlxuIik7CisJCWNvZGVjX3dhcm4oY29kZWMsICJmYWlsZWQgdG8gb3ZlcnJpZGUgYW1wIGNhcHMgZm9yIE5JRCAweDJcbiIpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fY2htYXBfZWxlbSBhc3VzX3BjbV8yXzFfY2htYXBzW10gPSB7CkBAIC00OTQyLDggKzUyMTgsNTQgQEAKIAl9CiB9CiAKKy8qIHR1cm4gb24vb2ZmIG11dGUgTEVEIHBlciB2bWFzdGVyIGhvb2sgKi8KK3N0YXRpYyB2b2lkIGFsYzY2Ml9sZWRfZ3BpbzFfbXV0ZV9ob29rKHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBwcml2YXRlX2RhdGE7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IG9sZHZhbCA9IHNwZWMtPmdwaW9fbGVkOworCisJaWYgKGVuYWJsZWQpCisJCXNwZWMtPmdwaW9fbGVkICY9IH4weDAxOworCWVsc2UKKwkJc3BlYy0+Z3Bpb19sZWQgfD0gMHgwMTsKKwlpZiAoc3BlYy0+Z3Bpb19sZWQgIT0gb2xkdmFsKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDAxLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsCisJCQkJICAgIHNwZWMtPmdwaW9fbGVkKTsKK30KKworLyogYXZvaWQgRDMgZm9yIGtlZXBpbmcgR1BJTyB1cCAqLworc3RhdGljIHVuc2lnbmVkIGludCBncGlvX2xlZF9wb3dlcl9maWx0ZXIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgaGRhX25pZF90IG5pZCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGUpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKG5pZCA9PSBjb2RlYy0+YWZnICYmIHBvd2VyX3N0YXRlID09IEFDX1BXUlNUX0QzICYmIHNwZWMtPmdwaW9fbGVkKQorCQlyZXR1cm4gQUNfUFdSU1RfRDA7CisJcmV0dXJuIHBvd2VyX3N0YXRlOworfQorCitzdGF0aWMgdm9pZCBhbGM2NjJfZml4dXBfbGVkX2dwaW8xKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGdwaW9faW5pdFtdID0geworCQl7IDB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMSB9LAorCQl7IDB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAxIH0sCisJCXt9CisJfTsKKworCWlmIChhY3Rpb24gPT0gSERBX0ZJWFVQX0FDVF9QUkVfUFJPQkUpIHsKKwkJc3BlYy0+Z2VuLnZtYXN0ZXJfbXV0ZS5ob29rID0gYWxjNjYyX2xlZF9ncGlvMV9tdXRlX2hvb2s7CisJCXNwZWMtPmdwaW9fbGVkID0gMDsKKwkJc25kX2hkYV9hZGRfdmVyYnMoY29kZWMsIGdwaW9faW5pdCk7CisJCWNvZGVjLT5wb3dlcl9maWx0ZXIgPSBncGlvX2xlZF9wb3dlcl9maWx0ZXI7CisJfQorfQorCiBlbnVtIHsKIAlBTEM2NjJfRklYVVBfQVNQSVJFLAorCUFMQzY2Ml9GSVhVUF9MRURfR1BJTzEsCiAJQUxDNjYyX0ZJWFVQX0lERUFQQUQsCiAJQUxDMjcyX0ZJWFVQX01BUklPLAogCUFMQzY2Ml9GSVhVUF9DWkNfUDEwVCwKQEAgLTQ5NjIsOSArNTI4NCwxMCBAQAogCUFMQzY2Ml9GSVhVUF9JTlZfRE1JQywKIAlBTEM2NjhfRklYVVBfREVMTF9NSUNfTk9fUFJFU0VOQ0UsCiAJQUxDNjY4X0ZJWFVQX0hFQURTRVRfTU9ERSwKLQlBTEM2NjJfRklYVVBfQkFTU19DSE1BUCwKKwlBTEM2NjJfRklYVVBfQkFTU19NT0RFNF9DSE1BUCwKKwlBTEM2NjJfRklYVVBfQkFTU18xNiwKIAlBTEM2NjJfRklYVVBfQkFTU18xQSwKLQlBTEM2NjJfRklYVVBfQkFTU18xQV9DSE1BUCwKKwlBTEM2NjJfRklYVVBfQkFTU19DSE1BUCwKIAlBTEM2NjhfRklYVVBfQVVUT19NVVRFLAogfTsKIApAQCAtNDk3NiwxMiArNTI5OSwxOCBAQAogCQkJeyB9CiAJCX0KIAl9LAorCVtBTEM2NjJfRklYVVBfTEVEX0dQSU8xXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKKwkJLnYuZnVuYyA9IGFsYzY2Ml9maXh1cF9sZWRfZ3BpbzEsCisJfSwKIAlbQUxDNjYyX0ZJWFVQX0lERUFQQURdID0gewogCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAogCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKIAkJCXsgMHgxNywgMHg5OTEzMDExMiB9LCAvKiBzdWJ3b29mZXIgKi8KIAkJCXsgfQotCQl9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX0xFRF9HUElPMSwKIAl9LAogCVtBTEMyNzJfRklYVVBfTUFSSU9dID0gewogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLApAQCAtNTE0NiwyNCArNTQ3NSwzMyBAQAogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAogCQkudi5mdW5jID0gYWxjX2ZpeHVwX2hlYWRzZXRfbW9kZV9hbGM2NjgsCiAJfSwKLQlbQUxDNjYyX0ZJWFVQX0JBU1NfQ0hNQVBdID0geworCVtBTEM2NjJfRklYVVBfQkFTU19NT0RFNF9DSE1BUF0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBhbGNfZml4dXBfYmFzc19jaG1hcCwKIAkJLmNoYWluZWQgPSB0cnVlLAogCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNAogCX0sCisJW0FMQzY2Ml9GSVhVUF9CQVNTXzE2XSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CisJCQl7MHgxNiwgMHg4MDEwNjExMX0sIC8qIGJhc3Mgc3BlYWtlciAqLworCQkJe30KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfQkFTU19DSE1BUCwKKwl9LAogCVtBTEM2NjJfRklYVVBfQkFTU18xQV0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCiAJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgewogCQkJezB4MWEsIDB4ODAxMDYxMTF9LCAvKiBiYXNzIHNwZWFrZXIgKi8KIAkJCXt9CiAJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX0JBU1NfQ0hNQVAsCiAJfSwKLQlbQUxDNjYyX0ZJWFVQX0JBU1NfMUFfQ0hNQVBdID0geworCVtBTEM2NjJfRklYVVBfQkFTU19DSE1BUF0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBhbGNfZml4dXBfYmFzc19jaG1hcCwKLQkJLmNoYWluZWQgPSB0cnVlLAotCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfQkFTU18xQSwKIAl9LAogfTsKIApAQCAtNTE4NSw5ICs1NTIzLDExIEBACiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDYyOCwgIkRlbGwiLCBBTEM2NjhfRklYVVBfQVVUT19NVVRFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNjRlLCAiRGVsbCIsIEFMQzY2OF9GSVhVUF9BVVRPX01VVEUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDE2MzIsICJIUCBSUDU4MDAiLCBBTEM2NjJfRklYVVBfSFBfUlA1ODAwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWNkLCAiQXN1cyBONTUwIiwgQUxDNjYyX0ZJWFVQX0JBU1NfMUFfQ0hNQVApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0NzcsICJBU1VTIE41NlZaIiwgQUxDNjYyX0ZJWFVQX0JBU1NfQ0hNQVApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDFiZjMsICJBU1VTIE43NlZaIiwgQUxDNjYyX0ZJWFVQX0JBU1NfQ0hNQVApLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExY2QsICJBc3VzIE41NTAiLCBBTEM2NjJfRklYVVBfQkFTU18xQSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ3NywgIkFTVVMgTjU2VloiLCBBTEM2NjJfRklYVVBfQkFTU19NT0RFNF9DSE1BUCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVhNywgIkFTVVMgVVg1MVZaSCIsIEFMQzY2Ml9GSVhVUF9CQVNTXzE2KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxYjczLCAiQVNVUyBONTVTRiIsIEFMQzY2Ml9GSVhVUF9CQVNTXzE2KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxYmYzLCAiQVNVUyBONzZWWiIsIEFMQzY2Ml9GSVhVUF9CQVNTX01PREU0X0NITUFQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4NDY5LCAiQVNVUyBtb2JvIiwgQUxDNjYyX0ZJWFVQX05PX0pBQ0tfREVURUNUKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA1YiwgMHgwY2Q2LCAiRm94Y29ubiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUyKSwKIAlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMDUxLCAiU2Ftc3VuZyBSNzIwIiwgQUxDNjYyX0ZJWFVQX0lERUFQQUQpLApAQCAtNTMyOCw3ICs1NjY4LDcgQEAKIAkJc3BlYy0+Z2VuLmJlZXBfbmlkID0gMHgwMTsKIAogCWlmICgoYWxjX2dldF9jb2VmMChjb2RlYykgJiAoMSA8PCAxNCkpICYmCi0JICAgIGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjUgJiYKKwkgICAgY29kZWMtPmJ1cy0+cGNpICYmIGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjUgJiYKIAkgICAgc3BlYy0+Y2RlZmluZS5wbGF0Zm9ybV90eXBlID09IDEpIHsKIAkJZXJyID0gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3MlgiKTsKIAkJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaTMwNTQuYwppbmRleCA2Njc5YTUwLi4zMjA4YWQ2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCX0gd2hpbGUgKCh2YWwgJiBTSTMwNTRfTUVJX1JFQURZKSAhPSBTSTMwNTRfTUVJX1JFQURZICYmIHdhaXRfY291bnQtLSk7CiAKIAlpZigodmFsJlNJMzA1NF9NRUlfUkVBRFkpICE9IFNJMzA1NF9NRUlfUkVBRFkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic2kzMDU0OiBjYW5ub3QgaW5pdGlhbGl6ZS4gRVhUIE1JRCA9ICUwNHhcbiIsIHZhbCk7CisJCWNvZGVjX2Vycihjb2RlYywgInNpMzA1NDogY2Fubm90IGluaXRpYWxpemUuIEVYVCBNSUQgPSAlMDR4XG4iLCB2YWwpOwogCQkvKiBsZXQncyBwcmF5IHRoYXQgdGhpcyBpcyBubyBmYXRhbCBlcnJvciAqLwogCQkvKiByZXR1cm4gLUVBQ0NFUzsgKi8KIAl9CkBAIC0yNDcsNyArMjQ3LDggQEAKIAlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9DRkcxLDB4MjAwKTsKIAogCWlmKChHRVRfUkVHKGNvZGVjLFNJMzA1NF9MSU5FX1NUQVRVUykgJiAoMTw8NikpID09IDApIHsKLQkJc25kX3ByaW50ZCgiTGluayBGcmFtZSBEZXRlY3QoRkRUKSBpcyBub3QgcmVhZHkgKGxpbmUgc3RhdHVzOiAlMDR4KVxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLAorCQkJICAiTGluayBGcmFtZSBEZXRlY3QoRkRUKSBpcyBub3QgcmVhZHkgKGxpbmUgc3RhdHVzOiAlMDR4KVxuIiwKIAkJCQlHRVRfUkVHKGNvZGVjLFNJMzA1NF9MSU5FX1NUQVRVUykpOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDNiYzI5YzkuLjc1NTE1YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogewogCXVuc2lnbmVkIGludCBncGlvc3RhdGUsIGdwaW9tYXNrLCBncGlvZGlyOwogCi0Jc25kX3ByaW50ZGQoIiVzIG1zayAleCBkaXIgJXggZ3BpbyAleFxuIiwgX19mdW5jX18sIG1hc2ssIGRpcl9tYXNrLCBkYXRhKTsKKwljb2RlY19kYmcoY29kZWMsICIlcyBtc2sgJXggZGlyICV4IGdwaW8gJXhcbiIsIF9fZnVuY19fLCBtYXNrLCBkaXJfbWFzaywgZGF0YSk7CiAKIAlncGlvc3RhdGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCiAJCQkJICAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7CkBAIC0zNTksNyArMzU5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHBpbmN0bDsKIAotCXNuZF9wcmludGRkKCIlcywgbmlkICV4IGN0bCAleFxuIiwgX19mdW5jX18sIG5pZCwgbmV3X3ZyZWYpOworCWNvZGVjX2RiZyhjb2RlYywgIiVzLCBuaWQgJXggY3RsICV4XG4iLCBfX2Z1bmNfXywgbmlkLCBuZXdfdnJlZik7CiAJcGluY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCiAJCQkJQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKIApAQCAtMjA4Niw5ICsyMDg2LDEyIEBACiAJfQogCiAJaWYgKGZpbmRfbXV0ZV9sZWRfY2ZnKGNvZGVjLCBzcGVjLT5kZWZhdWx0X3BvbGFyaXR5KSkKLQkJc25kX3ByaW50ZCgibXV0ZSBMRUQgZ3BpbyAlZCBwb2xhcml0eSAlZFxuIiwKKwkJY29kZWNfZGJnKGNvZGVjLCAibXV0ZSBMRUQgZ3BpbyAlZCBwb2xhcml0eSAlZFxuIiwKIAkJCQlzcGVjLT5ncGlvX2xlZCwKIAkJCQlzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSk7CisKKwkvKiBhbGxvdyBhdXRvLXN3aXRjaGluZyBvZiBkb2NrIGxpbmUtaW4gKi8KKwlzcGVjLT5nZW4ubGluZV9pbl9hdXRvX3N3aXRjaCA9IHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YWM5MmhkODN4eHhfZml4dXBfaHBfemVwaHlyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMzA3Nyw3ICszMDgwLDcgQEAKIAl9CiAKIAlpZiAoZmluZF9tdXRlX2xlZF9jZmcoY29kZWMsIDEpKQotCQlzbmRfcHJpbnRkKCJtdXRlIExFRCBncGlvICVkIHBvbGFyaXR5ICVkXG4iLAorCQljb2RlY19kYmcoY29kZWMsICJtdXRlIExFRCBncGlvICVkIHBvbGFyaXR5ICVkXG4iLAogCQkJCXNwZWMtPmdwaW9fbGVkLAogCQkJCXNwZWMtPmdwaW9fbGVkX3BvbGFyaXR5KTsKIApAQCAtNDQyMiw4ICs0NDI1LDggQEAKIAogCW51bV9kYWNzID0gc25kX2hkYV9nZXRfbnVtX2Nvbm5zKGNvZGVjLCAweDBhKSAtIDE7CiAJaWYgKG51bV9kYWNzIDwgMyB8fCBudW1fZGFjcyA+IDUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiBDb3VsZCBub3QgZGV0ZXJtaW5lICIKLQkJICAgICAgICJudW1iZXIgb2YgY2hhbm5lbHMgZGVmYXVsdGluZyB0byBEQUMgY291bnRcbiIpOworCQljb2RlY193YXJuKGNvZGVjLAorCQkJICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIGNoYW5uZWxzIGRlZmF1bHRpbmcgdG8gREFDIGNvdW50XG4iKTsKIAkJbnVtX2RhY3MgPSA1OwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKaW5kZXggZjg0MTk1Zi4uNzc4MTY2MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCkBAIC00NjUsMTQgKzQ2NSw4IEBACiAKIHN0YXRpYyB2b2lkIHZpYV9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0JaWYgKCFzcGVjKQotCQlyZXR1cm47Ci0KIAl2dDE3MDhfc3RvcF9ocF93b3JrKGNvZGVjKTsKLQlzbmRfaGRhX2dlbl9zcGVjX2ZyZWUoJnNwZWMtPmdlbik7Ci0Ja2ZyZWUoc3BlYyk7CisJc25kX2hkYV9nZW5fZnJlZShjb2RlYyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvdGhpbmtwYWRfaGVscGVyLmMgYi9zb3VuZC9wY2kvaGRhL3RoaW5rcGFkX2hlbHBlci5jCmluZGV4IDhmZTNiOGMuLjZiYTBiNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvdGhpbmtwYWRfaGVscGVyLmMKKysrIGIvc291bmQvcGNpL2hkYS90aGlua3BhZF9oZWxwZXIuYwpAQCAtNjMsNyArNjMsOCBAQAogCQlpZiAoIWxlZF9zZXRfZnVuYykKIAkJCWxlZF9zZXRfZnVuYyA9IHN5bWJvbF9yZXF1ZXN0KHRwYWNwaV9sZWRfc2V0KTsKIAkJaWYgKCFsZWRfc2V0X2Z1bmMpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gZmluZCB0aGlua3BhZC1hY3BpIHN5bWJvbCB0cGFjcGlfbGVkX3NldFxuIik7CisJCQljb2RlY193YXJuKGNvZGVjLAorCQkJCSAgICJGYWlsZWQgdG8gZmluZCB0aGlua3BhZC1hY3BpIHN5bWJvbCB0cGFjcGlfbGVkX3NldFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNzUsNyArNzYsOCBAQAogCQl9CiAJCWlmIChsZWRfc2V0X2Z1bmMoVFBBQ1BJX0xFRF9NSUNNVVRFLCBmYWxzZSkgPj0gMCkgewogCQkJaWYgKHNwZWMtPm51bV9hZGNfbmlkcyA+IDEpCi0JCQkJc25kX3ByaW50ZGQoIlNraXBwaW5nIG1pY211dGUgTEVEIGNvbnRyb2wgZHVlIHRvIHNldmVyYWwgQURDcyIpOworCQkJCWNvZGVjX2RiZyhjb2RlYywKKwkJCQkJICAiU2tpcHBpbmcgbWljbXV0ZSBMRUQgY29udHJvbCBkdWUgdG8gc2V2ZXJhbCBBRENzIik7CiAJCQllbHNlIHsKIAkJCQlzcGVjLT5jYXBfc3luY19ob29rID0gdXBkYXRlX3RwYWNwaV9taWNtdXRlX2xlZDsKIAkJCQlyZW1vdmVmdW5jID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCmluZGV4IDU1OTAyZWMuLjNiM2NmNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCkBAIC0xOTM3LDkgKzE5MzcsMTIgQEAKIAkJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCQlpZCA9IGF1cmVvbl9jczg0MTVfZ2V0KGljZSwgQ1M4NDE1X0lEKTsKIAkJaWYgKGlkICE9IDB4NDEpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiTm8gQ1M4NDE1IGNoaXAuIFNraXBwaW5nIENTODQxNSBjb250cm9scy5cbiIpOworCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJICJObyBDUzg0MTUgY2hpcC4gU2tpcHBpbmcgQ1M4NDE1IGNvbnRyb2xzLlxuIik7CiAJCWVsc2UgaWYgKChpZCAmIDB4MEYpICE9IDB4MDEpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiRGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgQ1M4NDE1IHJldi4gKCVjKVxuIiwgKGNoYXIpKChpZCAmIDB4MEYpICsgJ0EnIC0gMSkpOworCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJICJEZXRlY3RlZCB1bnN1cHBvcnRlZCBDUzg0MTUgcmV2LiAoJWMpXG4iLAorCQkJCSAoY2hhcikoKGlkICYgMHgwRikgKyAnQScgLSAxKSk7CiAJCWVsc2UgewogCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M4NDE1X2NvbnRyb2xzKTsgaSsrKSB7CiAJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCmluZGV4IDllMjhjYzEuLmVkMjE0NGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYwpAQCAtNDI1LDcgKzQyNSw4IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlpZiAoc25kX2kyY19zZW5kYnl0ZXMoaWNlLT5jczg0MjcsICZyZWcsIDEpICE9IDEpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBzZW5kIHJlZ2lzdGVyIDB4JXggYnl0ZSB0byBDUzg0MjdcbiIsIHJlZyk7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIHNlbmQgcmVnaXN0ZXIgMHgleCBieXRlIHRvIENTODQyN1xuIiwgcmVnKTsKIAlzbmRfaTJjX3JlYWRieXRlcyhpY2UtPmNzODQyNywgJnJlZywgMSk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAocmVnICYgQ1M4NDI3X1VOTE9DSykgPyAxIDogMDsKIAlyZXR1cm4gMDsKQEAgLTU3NSw2ICs1NzYsMzAgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2RlbHRhX3Jlc3VtZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFrbV9iYWNrdXBbQUs0WFhYX0lNQUdFX1NJWkVdOworCS8qIGluaXQgY29kZWMgYW5kIHJlc3RvcmUgcmVnaXN0ZXJzICovCisJaWYgKGljZS0+YWttX2NvZGVjcykgeworCQltZW1jcHkoYWttX2JhY2t1cCwgaWNlLT5ha20tPmltYWdlcywgc2l6ZW9mKGFrbV9iYWNrdXApKTsKKwkJc25kX2FrbTR4eHhfaW5pdChpY2UtPmFrbSk7CisJCW1lbWNweShpY2UtPmFrbS0+aW1hZ2VzLCBha21fYmFja3VwLCBzaXplb2YoYWttX2JhY2t1cCkpOworCQlzbmRfYWttNHh4eF9yZXNldChpY2UtPmFrbSwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfZGVsdGFfc3VzcGVuZChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwlpZiAoaWNlLT5ha21fY29kZWNzKSAvKiByZXNldCAmIG11dGUgY29kZWMgKi8KKwkJc25kX2FrbTR4eHhfcmVzZXQoaWNlLT5ha20sIDEpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBzbmRfaWNlMTcxMl9kZWx0YV9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCWludCBlcnI7CkBAIC02MjEsNyArNjQ2LDExIEBACiAJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSA0OwogCQlicmVhazsKIAl9Ci0KKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwlpY2UtPnBtX3Jlc3VtZSA9IHNuZF9pY2UxNzEyX2RlbHRhX3Jlc3VtZTsKKwlpY2UtPnBtX3N1c3BlbmQgPSBzbmRfaWNlMTcxMl9kZWx0YV9zdXNwZW5kOworCWljZS0+cG1fc3VzcGVuZF9lbmFibGVkID0gMTsKKyNlbmRpZgogCS8qIGluaXRpYWxpemUgdGhlIFNQSSBjbG9jayB0byBoaWdoICovCiAJdG1wID0gc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19HUElPX0RBVEEpOwogCXRtcCB8PSBJQ0UxNzEyX0RFTFRBX0FQX0NDTEs7CkBAIC02MzcsNyArNjY2LDcgQEAKIAljYXNlIElDRTE3MTJfU1VCREVWSUNFX1ZYNDQyOgogCWNhc2UgSUNFMTcxMl9TVUJERVZJQ0VfREVMVEE2NkU6CiAJCWlmICgoZXJyID0gc25kX2kyY19idXNfY3JlYXRlKGljZS0+Y2FyZCwgIklDRTE3MTIgR1BJTyAxIiwgTlVMTCwgJmljZS0+aTJjKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gY3JlYXRlIEkyQyBidXNcbiIpOworCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgSTJDIGJ1c1xuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWljZS0+aTJjLT5wcml2YXRlX2RhdGEgPSBpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCmluZGV4IGJjMmU3MDEuLjgxN2ExYmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCkBAIC0xNjMsNyArMTYzLDggQEAKIAogICAgICBfX2Vycm9yOgogCXNuZF9pMmNfdW5sb2NrKGljZS0+aTJjKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBSzQ1MjQgY2hpcCBzZWxlY3QgZmFpbGVkLCBjaGVjayBjYWJsZSB0byB0aGUgZnJvbnQgbW9kdWxlXG4iKTsKKwlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkiQUs0NTI0IGNoaXAgc2VsZWN0IGZhaWxlZCwgY2hlY2sgY2FibGUgdG8gdGhlIGZyb250IG1vZHVsZVxuIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTE3NCw3ICsxNzUsNyBAQAogCXVuc2lnbmVkIGNoYXIgdG1wOwogCS8qIGFzc2VydCBBSzQ1MjQgQ1MgKi8KIAlpZiAoc25kX2ljZTE3MTJfZXdzODhtdF9jaGlwX3NlbGVjdChpY2UsIH4oMSA8PCBjaGlwKSAmIDB4MGYpIDwgMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZmF0YWwgZXJyb3IgKGV3czg4bXQgY2hpcCBzZWxlY3QpXG4iKTsKKwkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwgImZhdGFsIGVycm9yIChld3M4OG10IGNoaXAgc2VsZWN0KVxuIik7CiAJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCXRtcCA9IElDRTE3MTJfRVdTODhfU0VSSUFMX0RBVEEgfAogCQlJQ0UxNzEyX0VXUzg4X1NFUklBTF9DTE9DSyB8CkBAIC00NTYsNyArNDU3LDcgQEAKIAogCS8qIGNyZWF0ZSBpMmMgKi8KIAlpZiAoKGVyciA9IHNuZF9pMmNfYnVzX2NyZWF0ZShpY2UtPmNhcmQsICJJQ0UxNzEyIEdQSU8gMSIsIE5VTEwsICZpY2UtPmkyYykpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gY3JlYXRlIEkyQyBidXNcbiIpOworCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBJMkMgYnVzXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWNlLT5pMmMtPnByaXZhdGVfZGF0YSA9IGljZTsKQEAgLTQ2OSw3ICs0NzAsOCBAQAogCQkJCQkgICAgSUNFMTcxMl82RklSRV9QQ0Y5NTU0X0FERFIsCiAJCQkJCSAgICAmc3BlYy0+aTJjZGV2c1tFV1NfSTJDXzZGSVJFXSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJQQ0Y5NTU0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkJCSJQQ0Y5NTU0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXNuZF9pY2UxNzEyXzZmaXJlX3dyaXRlX3BjYShpY2UsIFBDRjk1NTRfUkVHX0NPTkZJRywgMHg4MCk7CkBAIC04MzQsNyArODM2LDcgQEAKIAlieXRlID0gMDsKIAlpZiAoc25kX2kyY19yZWFkYnl0ZXMoc3BlYy0+aTJjZGV2c1tFV1NfSTJDXzZGSVJFXSwgJmJ5dGUsIDEpICE9IDEpIHsKIAkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOwotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCByZWFkIHBjYVxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVhZCBwY2FcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IDI4ZWM4NzIuLjI5MTY3MmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCWVyciA9IHNuZF9jczg0MjdfY3JlYXRlKGljZS0+aTJjLCBhZGRyLAogCQkoaWNlLT5jczg0MjdfdGltZW91dCAqIEhaKSAvIDEwMDAsICZpY2UtPmNzODQyNyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ1M4NDI3IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJDUzg0MjcgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWNlLT5zcGRpZi5vcHMub3BlbiA9IG9wZW5fY3M4NDI3OwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJCQl1MTYgcGJrc3RhdHVzOwogCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJCQlwYmtzdGF0dXMgPSBpbncoSUNFRFMoaWNlLCBJTlRTVEFUKSk7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAicGJrc3RhdHVzID0gMHgleFxuIiwgcGJrc3RhdHVzKTsgKi8KKwkJCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJwYmtzdGF0dXMgPSAweCV4XG4iLCBwYmtzdGF0dXMpOyAqLwogCQkJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgewogCQkJCWlmICgocGJrc3RhdHVzICYgKDMgPDwgKGlkeCAqIDIpKSkgPT0gMCkKIAkJCQkJY29udGludWU7CkBAIC05MDMsNyArOTAzLDggQEAKIAlpZiAocnBjbSkKIAkJKnJwY20gPSBwY207CiAKLQlwcmludGsoS0VSTl9XQVJOSU5HICJDb25zdW1lciBQQ00gY29kZSBkb2VzIG5vdCB3b3JrIHdlbGwgYXQgdGhlIG1vbWVudCAtLWprXG4iKTsKKwlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJICJDb25zdW1lciBQQ00gY29kZSBkb2VzIG5vdCB3b3JrIHdlbGwgYXQgdGhlIG1vbWVudCAtLWprXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTUzNCw3ICsxNTM1LDggQEAKIAkJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfaWNlMTcxMl9taXhlcl9mcmVlX2FjOTc7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBhYzk3IGZvciBjb25zdW1lciwgc2tpcHBlZFxuIik7CisJCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJCQkgImNhbm5vdCBpbml0aWFsaXplIGFjOTcgZm9yIGNvbnN1bWVyLCBza2lwcGVkXG4iKTsKIAkJZWxzZSB7CiAJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfZGlnbWl4X3JvdXRlX2FjOTcsIGljZSkpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xNTUyLDcgKzE1NTQsOCBAQAogCQlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9pY2UxNzEyX21peGVyX2ZyZWVfYWM5NzsKIAkJZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImljZTE3MTI6IGNhbm5vdCBpbml0aWFsaXplIHBybyBhYzk3LCBza2lwcGVkXG4iKTsKKwkJCWRldl93YXJuKGljZS0+Y2FyZC0+ZGV2LAorCQkJCSAiY2Fubm90IGluaXRpYWxpemUgcHJvIGFjOTcsIHNraXBwZWRcbiIpOwogCQllbHNlCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC0yMzMyLDcgKzIzMzUsOCBAQAogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaWNlLT5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZkZXZpY2UpOwogCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gKCh1bnNpZ25lZCBpbnQpc3dhYjE2KHZlbmRvcikgPDwgMTYpIHwgc3dhYjE2KGRldmljZSk7CiAJCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IDAgfHwgaWNlLT5lZXByb20uc3VidmVuZG9yID09ICh1bnNpZ25lZCBpbnQpLTEpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImljZTE3MTI6IE5vIHZhbGlkIElEIGlzIGZvdW5kXG4iKTsKKwkJCQlkZXZfZXJyKGljZS0+Y2FyZC0+ZGV2LAorCQkJCQkiTm8gdmFsaWQgSUQgaXMgZm91bmRcbiIpOwogCQkJCXJldHVybiAtRU5YSU87CiAJCQl9CiAJCX0KQEAgLTIzNDAsMjEgKzIzNDQsMjIgQEAKIAlmb3IgKHRibCA9IGNhcmRfdGFibGVzOyAqdGJsOyB0YmwrKykgewogCQlmb3IgKGMgPSAqdGJsOyBjLT5zdWJ2ZW5kb3I7IGMrKykgewogCQkJaWYgKG1vZGVsbmFtZSAmJiBjLT5tb2RlbCAmJiAhc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWNlMTcxMjogVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsIGMtPm5hbWUpOworCQkJCWRldl9pbmZvKGljZS0+Y2FyZC0+ZGV2LAorCQkJCQkgIlVzaW5nIGJvYXJkIG1vZGVsICVzXG4iLCBjLT5uYW1lKTsKIAkJCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSBjLT5zdWJ2ZW5kb3I7CiAJCQl9IGVsc2UgaWYgKGMtPnN1YnZlbmRvciAhPSBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpCiAJCQkJY29udGludWU7CiAJCQlpZiAoIWMtPmVlcHJvbV9zaXplIHx8ICFjLT5lZXByb21fZGF0YSkKIAkJCQlnb3RvIGZvdW5kOwogCQkJLyogaWYgdGhlIEVFUFJPTSBpcyBnaXZlbiBieSB0aGUgZHJpdmVyLCB1c2UgaXQgKi8KLQkJCXNuZF9wcmludGRkKCJ1c2luZyB0aGUgZGVmaW5lZCBlZXByb20uLlxuIik7CisJCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAidXNpbmcgdGhlIGRlZmluZWQgZWVwcm9tLi5cbiIpOwogCQkJaWNlLT5lZXByb20udmVyc2lvbiA9IDE7CiAJCQlpY2UtPmVlcHJvbS5zaXplID0gYy0+ZWVwcm9tX3NpemUgKyA2OwogCQkJbWVtY3B5KGljZS0+ZWVwcm9tLmRhdGEsIGMtPmVlcHJvbV9kYXRhLCBjLT5lZXByb21fc2l6ZSk7CiAJCQlnb3RvIHJlYWRfc2tpcHBlZDsKIAkJfQogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBObyBtYXRjaGluZyBtb2RlbCBmb3VuZCBmb3IgSUQgMHgleFxuIiwKKwlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwgIk5vIG1hdGNoaW5nIG1vZGVsIGZvdW5kIGZvciBJRCAweCV4XG4iLAogCSAgICAgICBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpOwogCiAgZm91bmQ6CkBAIC0yMzYyLDEyICsyMzY3LDEzIEBACiAJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQogCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7IC8qIEZJWE1FOiBhbnkgY2FyZHMgd2l0aG91dCB0aGUgY29ycmVjdCBzaXplPyAqLwogCWVsc2UgaWYgKGljZS0+ZWVwcm9tLnNpemUgPiAzMikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIEVFUFJPTSAoc2l6ZSA9ICVpKVxuIiwgaWNlLT5lZXByb20uc2l6ZSk7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCBFRVBST00gKHNpemUgPSAlaSlcbiIsIGljZS0+ZWVwcm9tLnNpemUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWNlLT5lZXByb20udmVyc2lvbiA9IHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDA1KTsKIAlpZiAoaWNlLT5lZXByb20udmVyc2lvbiAhPSAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgRUVQUk9NIHZlcnNpb24gJWlcbiIsCisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJpbnZhbGlkIEVFUFJPTSB2ZXJzaW9uICVpXG4iLAogCQkJICAgaWNlLT5lZXByb20udmVyc2lvbik7CiAJCS8qIHJldHVybiAtRUlPOyAqLwogCX0KQEAgLTI0MjgsNiArMjQzNCwxMyBAQAogCQlzbmRfaWNlMTcxMl93cml0ZShpY2UsIElDRTE3MTJfSVJFR19DT05TVU1FUl9QT1dFUkRPV04sIDApOwogCX0KIAlzbmRfaWNlMTcxMl9zZXRfcHJvX3JhdGUoaWNlLCA0ODAwMCwgMSk7CisJLyogdW5tYXNrIHVzZWQgaW50ZXJydXB0cyAqLworCW91dGIoKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSA9PSAwID8KKwkgICAgICBJQ0UxNzEyX0lSUV9NUFUyIDogMCkgfAorCSAgICAgKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSA/CisJICAgICAgSUNFMTcxMl9JUlFfUEJLRFMgfCBJQ0UxNzEyX0lSUV9DT05DQVAgfCBJQ0UxNzEyX0lSUV9DT05QQksgOiAwKSwKKwkgICAgIElDRVJFRyhpY2UsIElSUU1BU0spKTsKKwlvdXRiKDB4MDAsIElDRU1UKGljZSwgSVJRKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NTMsNyArMjU2Niw4IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAyOCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDI4KSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI4Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0yNTg5LDYgKzI2MDMsNyBAQAogCWljZS0+cGNpID0gcGNpOwogCWljZS0+aXJxID0gLTE7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwkvKiBkaXNhYmxlIGxlZ2FjeSBlbXVsYXRpb24gKi8KIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaWNlLT5wY2ksIDB4NDAsIDB4ODA3Zik7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGljZS0+cGNpLCAweDQyLCAweDAwMDYpOwogCXNuZF9pY2UxNzEyX3Byb2NfaW5pdChpY2UpOwpAQCAtMjYwOSw3ICsyNjI0LDcgQEAKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ljZTE3MTJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBpY2UpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaWNlMTcxMl9mcmVlKGljZSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI2MjUsMjIgKzI2NDAsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JLyogdW5tYXNrIHVzZWQgaW50ZXJydXB0cyAqLwotCW91dGIoKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSA9PSAwID8KLQkgICAgICBJQ0UxNzEyX0lSUV9NUFUyIDogMCkgfAotCSAgICAgKChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSA/Ci0JICAgICAgSUNFMTcxMl9JUlFfUEJLRFMgfCBJQ0UxNzEyX0lSUV9DT05DQVAgfCBJQ0UxNzEyX0lSUV9DT05QQksgOiAwKSwKLQkgICAgIElDRVJFRyhpY2UsIElSUU1BU0spKTsKLQlvdXRiKDB4MDAsIElDRU1UKGljZSwgSVJRKSk7Ci0KIAllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGljZSwgJm9wcyk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2ljZTE3MTJfZnJlZShpY2UpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2ljZTE3MTIgPSBpY2U7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjcwLDcgKzI2NzUsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjgwOSwxMSArMjgxNSw4MCBAQAogCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgc25kX2ljZTE3MTJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaSA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCWlmICghaWNlLT5wbV9zdXNwZW5kX2VuYWJsZWQpCisJCXJldHVybiAwOworCisJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCisJc25kX3BjbV9zdXNwZW5kX2FsbChpY2UtPnBjbSk7CisJc25kX3BjbV9zdXNwZW5kX2FsbChpY2UtPnBjbV9wcm8pOworCXNuZF9wY21fc3VzcGVuZF9hbGwoaWNlLT5wY21fZHMpOworCXNuZF9hYzk3X3N1c3BlbmQoaWNlLT5hYzk3KTsKKworCWlmIChpY2UtPnBtX3N1c3BlbmQpCisJCWljZS0+cG1fc3VzcGVuZChpY2UpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaWNlMTcxMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWljZS0+cG1fc3VzcGVuZF9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCWlmIChzbmRfaWNlMTcxMl9jaGlwX2luaXQoaWNlKSA8IDApIHsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGljZS0+cG1fcmVzdW1lKQorCQlpY2UtPnBtX3Jlc3VtZShpY2UpOworCisJaWYgKGljZS0+YWM5NykKKwkJc25kX2FjOTdfcmVzdW1lKGljZS0+YWM5Nyk7CisKKwlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzbmRfaWNlMTcxMl9wbSwgc25kX2ljZTE3MTJfc3VzcGVuZCwgc25kX2ljZTE3MTJfcmVzdW1lKTsKKyNkZWZpbmUgU05EX1ZUMTcxMl9QTV9PUFMJJnNuZF9pY2UxNzEyX3BtCisjZWxzZQorI2RlZmluZSBTTkRfVlQxNzEyX1BNX09QUwlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpY2UxNzEyX2RyaXZlciA9IHsKIAkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9pY2UxNzEyX2lkcywKIAkucHJvYmUgPSBzbmRfaWNlMTcxMl9wcm9iZSwKIAkucmVtb3ZlID0gc25kX2ljZTE3MTJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5wbSA9IFNORF9WVDE3MTJfUE1fT1BTLAorCX0sCiB9OwogCiBtb2R1bGVfcGNpX2RyaXZlcihpY2UxNzEyX2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKaW5kZXggNTAwNDcxNy4uNWU3OTQ4ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCQljb250aW51ZTsKIAkJcmV0dXJuIG9sZF9jbWQ7CiAJfQotCXNuZF9wcmludGQoS0VSTl9FUlIgInNuZF92dDE3MjRfYWM5N19yZWFkeTogdGltZW91dFxuIik7CisJZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgInNuZF92dDE3MjRfYWM5N19yZWFkeTogdGltZW91dFxuIik7CiAJcmV0dXJuIG9sZF9jbWQ7CiB9CiAKQEAgLTE1Niw3ICsxNTYsNyBAQAogCWZvciAodG0gPSAwOyB0bSA8IDB4MTAwMDA7IHRtKyspCiAJCWlmICgoaW5iKElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSkgJiBiaXQpID09IDApCiAJCQlyZXR1cm4gMDsKLQlzbmRfcHJpbnRkKEtFUk5fRVJSICJzbmRfdnQxNzI0X2FjOTdfd2FpdF9iaXQ6IHRpbWVvdXRcbiIpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJzbmRfdnQxNzI0X2FjOTdfd2FpdF9iaXQ6IHRpbWVvdXRcbiIpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC00MzAsMTAgKzQzMCwxMCBAQAogCQlzcGluX2xvY2soJmljZS0+cmVnX2xvY2spOwogCQlpZiAoKyt0aW1lb3V0ID4gMTApIHsKIAkJCXN0YXR1cyA9IGluYihJQ0VSRUcxNzI0KGljZSwgSVJRU1RBVCkpOwotCQkJcHJpbnRrKEtFUk5fRVJSICJpY2UxNzI0OiBUb28gbG9uZyBpcnEgbG9vcCwgIgotCQkJICAgICAgICJzdGF0dXMgPSAweCV4XG4iLCBzdGF0dXMpOworCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwKKwkJCQkiVG9vIGxvbmcgaXJxIGxvb3AsIHN0YXR1cyA9IDB4JXhcbiIsIHN0YXR1cyk7CiAJCQlpZiAoc3RhdHVzICYgVlQxNzI0X0lSUV9NUFVfVFgpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImljZTE3MjQ6IERpc2FibGluZyBNUFVfVFhcbiIpOworCQkJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJEaXNhYmxpbmcgTVBVX1RYXG4iKTsKIAkJCQllbmFibGVfbWlkaV9pcnEoaWNlLCBWVDE3MjRfSVJRX01QVV9UWCwgMCk7CiAJCQl9CiAJCQlzcGluX3VubG9jaygmaWNlLT5yZWdfbG9jayk7CkBAIC04MDEsNyArODAxLDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwogCiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAicHJvIHByZXBhcmU6IGNoID0gJWQsIGFkZHIgPSAweCV4LCAiCisJZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgInBybyBwcmVwYXJlOiBjaCA9ICVkLCBhZGRyID0gMHgleCwgIgogCSAgICAgICAiYnVmZmVyID0gMHgleCwgcGVyaW9kID0gMHgleFxuIiwKIAkgICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscywKIAkgICAgICAgKHVuc2lnbmVkIGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLApAQCAtODIxLDEzICs4MjEsMTMgQEAKICNpZiAwIC8qIHJlYWQgUExBWUJBQ0tfQUREUiAqLwogCXB0ciA9IGlubChJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19BRERSKSk7CiAJaWYgKHB0ciA8IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIpIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBuZWdhdGl2ZSBwdHJcbiIpOworCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBuZWdhdGl2ZSBwdHJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcHRyIC09IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CiAJcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKIAlpZiAocHRyID49IHN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAorCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAogCQkJICAgKGludClwdHIsIChpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTg0MCw3ICs4NDAsNyBAQAogCWVsc2UgaWYgKHB0ciA8PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQlwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gcHRyOwogCWVsc2UgewotCQlzbmRfcHJpbnRkKCJpY2UxNzI0OiBpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsCisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpbnZhbGlkIHB0ciAlZCAoc2l6ZT0lZClcbiIsCiAJCQkgICAoaW50KXB0ciwgKGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKIAkJcHRyID0gMDsKIAl9CkBAIC04ODQsNyArODg0LDcgQEAKIAllbHNlIGlmIChwdHIgPD0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJcHRyID0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSAtIHB0cjsKIAllbHNlIHsKLQkJc25kX3ByaW50ZCgiaWNlMTcyNDogaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAorCQlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBwdHIgJWQgKHNpemU9JWQpXG4iLAogCQkJICAgKGludClwdHIsIChpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSk7CiAJCXB0ciA9IDA7CiAJfQpAQCAtMTUwOCw3ICsxNTA4LDggQEAKIAkJYWM5Ny5wcml2YXRlX2RhdGEgPSBpY2U7CiAJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm8gYWM5Nywgc2tpcHBlZFxuIik7CisJCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwKKwkJCQkgImNhbm5vdCBpbml0aWFsaXplIHBybyBhYzk3LCBza2lwcGVkXG4iKTsKIAkJZWxzZQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtMjI3MSw3ICsyMjcyLDcgQEAKIAl3aGlsZSAoKGluYihJQ0VSRUcxNzI0KGljZSwgSTJDX0NUUkwpKSAmIFZUMTcyNF9JMkNfQlVTWSkgJiYgdC0tKQogCQk7CiAJaWYgKHQgPT0gLTEpCi0JCXByaW50ayhLRVJOX0VSUiAiaWNlMTcyNDogaTJjIGJ1c3kgdGltZW91dFxuIik7CisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJpMmMgYnVzeSB0aW1lb3V0XG4iKTsKIH0KIAogdW5zaWduZWQgY2hhciBzbmRfdnQxNzI0X3JlYWRfaTJjKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLApAQCAtMjI4Nyw3ICsyMjg4LDcgQEAKIAl2YWwgPSBpbmIoSUNFUkVHMTcyNChpY2UsIEkyQ19EQVRBKSk7CiAJbXV0ZXhfdW5sb2NrKCZpY2UtPmkyY19tdXRleCk7CiAJLyoKLQlwcmludGsoS0VSTl9ERUJVRyAiaTJjX3JlYWQ6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCB2YWwpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpMmNfcmVhZDogWzB4JXgsMHgleF0gPSAweCV4XG4iLCBkZXYsIGFkZHIsIHZhbCk7CiAJKi8KIAlyZXR1cm4gdmFsOwogfQpAQCAtMjI5OCw3ICsyMjk5LDcgQEAKIAltdXRleF9sb2NrKCZpY2UtPmkyY19tdXRleCk7CiAJd2FpdF9pMmNfYnVzeShpY2UpOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgImkyY193cml0ZTogWzB4JXgsMHgleF0gPSAweCV4XG4iLCBkZXYsIGFkZHIsIGRhdGEpOworCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJpMmNfd3JpdGU6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCBkYXRhKTsKIAkqLwogCW91dGIoYWRkciwgSUNFUkVHMTcyNChpY2UsIEkyQ19CWVRFX0FERFIpKTsKIAlvdXRiKGRhdGEsIElDRVJFRzE3MjQoaWNlLCBJMkNfREFUQSkpOwpAQCAtMjMzNSw3ICsyMzM2LDggQEAKIAkJCQkoKHVuc2lnbmVkIGludClzd2FiMTYodmVuZG9yKSA8PCAxNikgfCBzd2FiMTYoZGV2aWNlKTsKIAkJCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gMCB8fAogCQkJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSAodW5zaWduZWQgaW50KS0xKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJpY2UxNzI0OiBObyB2YWxpZCBJRCBpcyBmb3VuZFxuIik7CisJCQkJZGV2X2VycihpY2UtPmNhcmQtPmRldiwKKwkJCQkJIk5vIHZhbGlkIElEIGlzIGZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gLUVOWElPOwogCQkJfQogCQl9CkBAIC0yMzQ0LDcgKzIzNDYsOCBAQAogCQlmb3IgKGMgPSAqdGJsOyBjLT5uYW1lOyBjKyspIHsKIAkJCWlmIChtb2RlbG5hbWUgJiYgYy0+bW9kZWwgJiYKIAkJCSAgICAhc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWNlMTcyNDogVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsCisJCQkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsCisJCQkJCSAiVXNpbmcgYm9hcmQgbW9kZWwgJXNcbiIsCiAJCQkJICAgICAgIGMtPm5hbWUpOwogCQkJCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9IGMtPnN1YnZlbmRvcjsKIAkJCX0gZWxzZSBpZiAoYy0+c3VidmVuZG9yICE9IGljZS0+ZWVwcm9tLnN1YnZlbmRvcikKQEAgLTIzNTMsMTQgKzIzNTYsMTQgQEAKIAkJCWlmICghYy0+ZWVwcm9tX3NpemUgfHwgIWMtPmVlcHJvbV9kYXRhKQogCQkJCWdvdG8gZm91bmQ7CiAJCQkvKiBpZiB0aGUgRUVQUk9NIGlzIGdpdmVuIGJ5IHRoZSBkcml2ZXIsIHVzZSBpdCAqLwotCQkJc25kX3ByaW50ZGQoInVzaW5nIHRoZSBkZWZpbmVkIGVlcHJvbS4uXG4iKTsKKwkJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJ1c2luZyB0aGUgZGVmaW5lZCBlZXByb20uLlxuIik7CiAJCQlpY2UtPmVlcHJvbS52ZXJzaW9uID0gMjsKIAkJCWljZS0+ZWVwcm9tLnNpemUgPSBjLT5lZXByb21fc2l6ZSArIDY7CiAJCQltZW1jcHkoaWNlLT5lZXByb20uZGF0YSwgYy0+ZWVwcm9tX2RhdGEsIGMtPmVlcHJvbV9zaXplKTsKIAkJCWdvdG8gcmVhZF9za2lwcGVkOwogCQl9CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgImljZTE3MjQ6IE5vIG1hdGNoaW5nIG1vZGVsIGZvdW5kIGZvciBJRCAweCV4XG4iLAorCWRldl93YXJuKGljZS0+Y2FyZC0+ZGV2LCAiTm8gbWF0Y2hpbmcgbW9kZWwgZm91bmQgZm9yIElEIDB4JXhcbiIsCiAJICAgICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvcik7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJLyogYXNzdW1lIEFDOTctb25seSBjYXJkIHdoaWNoIGNhbiBzdXNwZW5kIHdpdGhvdXQgYWRkaXRpb25hbCBjb2RlICovCkBAIC0yMzcyLDEzICsyMzc1LDEzIEBACiAJaWYgKGljZS0+ZWVwcm9tLnNpemUgPCA2KQogCQlpY2UtPmVlcHJvbS5zaXplID0gMzI7CiAJZWxzZSBpZiAoaWNlLT5lZXByb20uc2l6ZSA+IDMyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaWNlMTcyNDogSW52YWxpZCBFRVBST00gKHNpemUgPSAlaSlcbiIsCisJCWRldl9lcnIoaWNlLT5jYXJkLT5kZXYsICJJbnZhbGlkIEVFUFJPTSAoc2l6ZSA9ICVpKVxuIiwKIAkJICAgICAgIGljZS0+ZWVwcm9tLnNpemUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWNlLT5lZXByb20udmVyc2lvbiA9IHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBkZXYsIDB4MDUpOwogCWlmIChpY2UtPmVlcHJvbS52ZXJzaW9uICE9IDEgJiYgaWNlLT5lZXByb20udmVyc2lvbiAhPSAyKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzI0OiBJbnZhbGlkIEVFUFJPTSB2ZXJzaW9uICVpXG4iLAorCQlkZXZfd2FybihpY2UtPmNhcmQtPmRldiwgIkludmFsaWQgRUVQUk9NIHZlcnNpb24gJWlcbiIsCiAJCSAgICAgICBpY2UtPmVlcHJvbS52ZXJzaW9uKTsKIAlzaXplID0gaWNlLT5lZXByb20uc2l6ZSAtIDY7CiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTI1ODYsNyArMjU4OSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92dDE3MjRfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBpY2UpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdnQxNzI0X2ZyZWUoaWNlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjYwOSw4ICsyNjEyLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcl9pY2UxNzEyID0gaWNlOwogCXJldHVybiAwOwogfQpAQCAtMjYzOCw3ICsyNjM5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYwppbmRleCA4ODU1OTMzLi43YTZjMDc4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkvKiBBSzUzODUgZmlyc3QsIHNpbmNlIGl0IHJlcXVpcmVzIGNvbGQgcmVzZXQgYWZmZWN0aW5nIGJvdGggY29kZWNzICovCiAJb2xkX2dwaW8gPSBpY2UtPmdwaW8uZ2V0X2RhdGEoaWNlKTsKIAluZXdfZ3BpbyA9ICAob2xkX2dwaW8gJiB+R1BJT19BSzUzODVBX01BU0spIHwgYWs1Mzg1X3BpbnM7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIkpVTEkgLSBhazUzODUgc2V0X3JhdGVfdmFsOiBuZXcgZ3BpbyAweCV4XG4iLAorCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJKVUxJIC0gYWs1Mzg1IHNldF9yYXRlX3ZhbDogbmV3IGdwaW8gMHgleFxuIiwKIAkJbmV3X2dwaW8pOyAqLwogCWljZS0+Z3Bpby5zZXRfZGF0YShpY2UsIG5ld19ncGlvKTsKIApAQCAtMzQ0LDcgKzM0NCw3IEBACiAJCQluZXdfZ3BpbyA9ICBvbGRfZ3BpbyAmCiAJCQkJfigodW5zaWduZWQgaW50KSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJfQotCS8qIHByaW50ayhLRVJOX0RFQlVHCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwKIAkJIkpVTEkgLSBtdXRlL3VubXV0ZTogY29udHJvbF92YWx1ZTogMHgleCwgb2xkX2dwaW86IDB4JXgsICIKIAkJIm5ld19ncGlvIDB4JXhcbiIsCiAJCSh1bnNpZ25lZCBpbnQpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sIG9sZF9ncGlvLApAQCAtNDM5LDkgKzQzOSw5IEBACiB7CiAJZm9yICg7ICpsaXN0OyBsaXN0KyspIHsKIAkJc3RydWN0IHNuZF9rY29udHJvbCAqc2xhdmUgPSBjdGxfZmluZChjYXJkLCAqbGlzdCk7Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJhZGRfc2xhdmVzIC0gJXNcbiIsICpsaXN0KTsgKi8KKwkJLyogZGV2X2RiZyhjYXJkLT5kZXYsICJhZGRfc2xhdmVzIC0gJXNcbiIsICpsaXN0KTsgKi8KIAkJaWYgKHNsYXZlKSB7Ci0JCQkvKiBwcmludGsoS0VSTl9ERUJVRyAic2xhdmUgJXMgZm91bmRcbiIsICpsaXN0KTsgKi8KKwkJCS8qIGRldl9kYmcoY2FyZC0+ZGV2LCAic2xhdmUgJXMgZm91bmRcbiIsICpsaXN0KTsgKi8KIAkJCXNuZF9jdGxfYWRkX3NsYXZlKG1hc3Rlciwgc2xhdmUpOwogCQl9CiAJfQpAQCAtNTM2LDcgKzUzNiw3IEBACiAKIAlvbGQgPSBpY2UtPmdwaW8uZ2V0X2RhdGEoaWNlKTsKIAluZXcgPSAgKG9sZCAmIH5HUElPX1JBVEVfTUFTSykgfCBnZXRfZ3Bpb192YWwocmF0ZSk7Ci0JLyogcHJpbnRrKEtFUk5fREVCVUcgIkpVTEkgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgIkpVTEkgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCiAJCQlvbGQgJiBHUElPX1JBVEVfTUFTSywKIAkJCW5ldyAmIEdQSU9fUkFURV9NQVNLKTsgKi8KIApAQCAtNTczLDcgKzU3Myw3IEBACiAJaWYgKGljZS0+aXNfc3BkaWZfbWFzdGVyKGljZSkgJiYgYzEpIHsKIAkJLyogb25seSBmb3IgU1BESUYgbWFzdGVyIG1vZGUsIHJhdGUgd2FzIGNoYW5nZWQgKi8KIAkJcmF0ZSA9IHNuZF9hazQxMTRfZXh0ZXJuYWxfcmF0ZShhazQxMTQpOwotCQkvKiBwcmludGsoS0VSTl9ERUJVRyAiYWs0MTE0IC0gaW5wdXQgcmF0ZSBjaGFuZ2VkIHRvICVkXG4iLAorCQkvKiBkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiYWs0MTE0IC0gaW5wdXQgcmF0ZSBjaGFuZ2VkIHRvICVkXG4iLAogCQkJCXJhdGUpOyAqLwogCQlqdWxpX2FrbV9zZXRfcmF0ZV92YWwoaWNlLT5ha20sIHJhdGUpOwogCX0KQEAgLTYyOCw3ICs2MjgsNyBAQAogI2VuZGlmCiAKIAlpZiAoc3BlYy0+YW5hbG9nKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImp1bGlAOiBhbmFsb2cgSS9PIGRldGVjdGVkXG4iKTsKKwkJZGV2X2luZm8oaWNlLT5jYXJkLT5kZXYsICJqdWxpQDogYW5hbG9nIEkvTyBkZXRlY3RlZFxuIik7CiAJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOwogCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jCmluZGV4IGU2MTAzMzkuLmYzYjQ5MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAluZXcgPSAofm11dGUgPDwgNyAmIDB4ODApIHwgKG9sZCAmIH4weDgwKTsKIAljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CiAJaWYgKGNoYW5nZSkKLQkJLypwcmludGsgKCJWb2x1bWUgcmVnaXN0ZXIgMHglMDJ4OiAweCUwMnhcbiIsIGlkeCwgbmV3KTsqLworCQkvKiBkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiVm9sdW1lIHJlZ2lzdGVyIDB4JTAyeDogMHglMDJ4XG4iLCBpZHgsIG5ldyk7Ki8KIAkJc3RhYzk0NjBfcHV0KGljZSwgaWR4LCBuZXcpOwogCXJldHVybiBjaGFuZ2U7CiB9CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkvKiBkdWUgdG8gcG9zc2libGUgY29uZmxpY3RzIHdpdGggc3RhYzk0NjBfc2V0X3JhdGVfdmFsLCBtdXRleGluZyAqLwogCW11dGV4X2xvY2soJnNwZWMtPm11dGVfbXV0ZXgpOwogCS8qCi0JcHJpbnRrKEtFUk5fREVCVUcgIk11dGUgcHV0OiByZWcgMHglMDJ4LCBjdHJsIHZhbHVlOiAweCUwMnhcbiIsIGlkeCwKKwlkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiTXV0ZSBwdXQ6IHJlZyAweCUwMngsIGN0cmwgdmFsdWU6IDB4JTAyeFxuIiwgaWR4LAogCSAgICAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CiAJKi8KIAljaGFuZ2UgPSBzdGFjOTQ2MF9kYWNfbXV0ZShpY2UsIGlkeCwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJaWYgKGNoYW5nZSkgewogCQlvdm9sID0gICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCk7CiAJCS8qCi0JCXByaW50ayhLRVJOX0RFQlVHICJEQUMgVm9sdW1lOiByZWcgMHglMDJ4OiAweCUwMnhcbiIsCisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJEQUMgVm9sdW1lOiByZWcgMHglMDJ4OiAweCUwMnhcbiIsCiAJCSAgICAgICBpZHgsIG92b2wpOwogCQkqLwogCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCkpOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJZm9yIChpZHggPSAwOyBpZHggPCA3IDsgKytpZHgpCiAJCWNoYW5nZWRbaWR4XSA9IHN0YWM5NDYwX2RhY19tdXRlKGljZSwKIAkJCQlTVEFDOTQ2WF9NQVNURVJfVk9MVU1FICsgaWR4LCAwKTsKLQkvKnByaW50ayhLRVJOX0RFQlVHICJSYXRlIGNoYW5nZTogJWQsIG5ldyBNQzogMHglMDJ4XG4iLCByYXRlLCBuZXcpOyovCisJLypkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiUmF0ZSBjaGFuZ2U6ICVkLCBuZXcgTUM6IDB4JTAyeFxuIiwgcmF0ZSwgbmV3KTsqLwogCXN0YWM5NDYwX3B1dChpY2UsIFNUQUM5NDZYX01BU1RFUl9DTE9DS0lORywgbmV3KTsKIAl1ZGVsYXkoMTApOwogCS8qIHVubXV0aW5nIC0gb25seSBvcmlnaW5hbGx5IHVubXV0ZWQgZGFjcyAtCkBAIC03NjgsOSArNzY4LDEwIEBACiAJCS8qIGZyb20gdGhpcyBtb21lbnQgaWYgZXJyID0gMCB0aGVuCiAJCSAqIHNwZWMtPmFrNDExNCBzaG91bGQgbm90IGJlIG51bGwKIAkJICovCi0JCXNuZF9wcmludGRkKCJBSzQxMTQgaW5pdGlhbGl6ZWQgd2l0aCBzdGF0dXMgJWRcbiIsIGVycik7CisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsCisJCQkiQUs0MTE0IGluaXRpYWxpemVkIHdpdGggc3RhdHVzICVkXG4iLCBlcnIpOwogCX0gZWxzZQotCQlzbmRfcHJpbnRkZCgiQUs0MTE0IG5vdCBmb3VuZFxuIik7CisJCWRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJBSzQxMTQgbm90IGZvdW5kXG4iKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcXVhcnRldC5jIGIvc291bmQvcGNpL2ljZTE3MTIvcXVhcnRldC5jCmluZGV4IDcxYzYwMDMuLjJjMmRmNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3F1YXJ0ZXQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9xdWFydGV0LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAJaWYgKHNuZF9CVUdfT04oY2hpcCA8IDAgfHwgY2hpcCA+PSA0KSkKIAkJcmV0dXJuOwotCS8qcHJpbnRrKEtFUk5fREVCVUcgIldyaXRpbmcgdG8gQUs0NjIwOiBjaGlwPSVkLCBhZGRyPTB4JXgsCisJLypkZXZfZGJnKGljZS0+Y2FyZC0+ZGV2LCAiV3JpdGluZyB0byBBSzQ2MjA6IGNoaXA9JWQsIGFkZHI9MHgleCwKIAkgIGRhdGE9MHgleFxuIiwgY2hpcCwgYWRkciwgZGF0YSk7Ki8KIAlvcmlnX2RpciA9IGljZS0+Z3Bpby5nZXRfZGlyKGljZSk7CiAJaWNlLT5ncGlvLnNldF9kaXIoaWNlLCBvcmlnX2RpciB8IEdQSU9fU1BJX0FMTCk7CkBAIC04OTgsNyArODk4LDcgQEAKIAluZXcgPSAgKGdldF9jcGxkKGljZSkgJiB+Q1BMRF9DS1NfTUFTSykgfCBnZXRfY2tzX3ZhbChyYXRlKTsKIAkvKiBzd2l0Y2ggdG8gaW50ZXJuYWwgY2xvY2ssIGRyb3AgQ1BMRF9TWU5DX1NFTCAqLwogCW5ldyAmPSB+Q1BMRF9TWU5DX1NFTDsKLQkvKiBwcmludGsoS0VSTl9ERUJVRyAiUVQgLSBzZXRfcmF0ZTogb2xkICV4LCBuZXcgJXhcbiIsCisJLyogZGV2X2RiZyhpY2UtPmNhcmQtPmRldiwgIlFUIC0gc2V0X3JhdGU6IG9sZCAleCwgbmV3ICV4XG4iLAogCSAgIGdldF9jcGxkKGljZSksIG5ldyk7ICovCiAJc2V0X2NwbGQoaWNlLCBuZXcpOwogfQpAQCAtOTc4LDcgKzk3OCw3IEBACiAJCQljMSkgewogCQkvKiBvbmx5IGZvciBTUERJRiBtYXN0ZXIgbW9kZSwgcmF0ZSB3YXMgY2hhbmdlZCAqLwogCQlyYXRlID0gc25kX2FrNDExM19leHRlcm5hbF9yYXRlKGFrNDExMyk7Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJhazQxMTMgLSBpbnB1dCByYXRlIGNoYW5nZWQgdG8gJWRcbiIsCisJCS8qIGRldl9kYmcoaWNlLT5jYXJkLT5kZXYsICJhazQxMTMgLSBpbnB1dCByYXRlIGNoYW5nZWQgdG8gJWRcbiIsCiAJCSAgIHJhdGUpOyAqLwogCQlxdGV0X2FrbV9zZXRfcmF0ZV92YWwoaWNlLT5ha20sIHJhdGUpOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggMDhkODczMy4uNjgzNDBkNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTU0Nyw3ICs1NDcsOCBAQAogCS8qIGFjY2VzcyB0byBzb21lIGZvcmJpZGRlbiAobm9uIGV4aXN0ZW50KSBhYzk3IHJlZ2lzdGVycyB3aWxsIG5vdAogCSAqIHJlc2V0IHRoZSBzZW1hcGhvcmUuIFNvIGV2ZW4gaWYgeW91IGRvbid0IGdldCB0aGUgc2VtYXBob3JlLCBzdGlsbAogCSAqIGNvbnRpbnVlIHRoZSBhY2Nlc3MuIFdlIGRvbid0IG5lZWQgdGhlIHNlbWFwaG9yZSBhbnl3YXkuICovCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfc2VtYXBob3JlOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IFsweCV4XVsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImNvZGVjX3NlbWFwaG9yZTogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBbMHgleF1bMHgleF1cbiIsCiAJCQlpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoQUNDX1NFTUEpKSwgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKTsKIAlpYWdldHdvcmQoY2hpcCwgMCk7CS8qIGNsZWFyIHNlbWFwaG9yZSBmbGFnICovCiAJLyogSSBkb24ndCBjYXJlIGFib3V0IHRoZSBzZW1hcGhvcmUgKi8KQEAgLTU2Miw3ICs1NjMsOSBAQAogCQogCWlmIChzbmRfaW50ZWw4eDBfY29kZWNfc2VtYXBob3JlKGNoaXAsIGFjOTctPm51bSkgPCAwKSB7CiAJCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3dyaXRlICVkOiBzZW1hcGhvcmUgaXMgbm90IHJlYWR5IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWNfd3JpdGUgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCX0KIAlpYXB1dHdvcmQoY2hpcCwgcmVnICsgYWM5Ny0+bnVtICogMHg4MCwgdmFsKTsKIH0KQEAgLTU3Niw3ICs1NzksOSBAQAogCiAJaWYgKHNuZF9pbnRlbDh4MF9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQlyZXMgPSAweGZmZmY7CiAJfSBlbHNlIHsKIAkJcmVzID0gaWFnZXR3b3JkKGNoaXAsIHJlZyArIGFjOTctPm51bSAqIDB4ODApOwpAQCAtNTg1LDcgKzU5MCw5IEBACiAJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwgdG1wICYKIAkJCQkgIH4oY2hpcC0+Y29kZWNfcmVhZHlfYml0cyB8IElDSF9HU0NJKSk7CiAJCQlpZiAoISBjaGlwLT5pbl9hYzk3X2luaXQpCi0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogcmVhZCB0aW1lb3V0IGZvciByZWdpc3RlciAweCV4XG4iLCBhYzk3LT5udW0sIHJlZyk7CisJCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSJjb2RlY19yZWFkICVkOiByZWFkIHRpbWVvdXQgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJCWFjOTctPm51bSwgcmVnKTsKIAkJCXJlcyA9IDB4ZmZmZjsKIAkJfQogCX0KQEAgLTYxOSw3ICs2MjYsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJc25kX3ByaW50ZChLRVJOX1dBUk5JTkcgImludGVsOHgwOiBBQzk3IGNvZGVjIHJlYWR5IHRpbWVvdXQuXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiQUM5NyBjb2RlYyByZWFkeSB0aW1lb3V0LlxuIik7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtNjMxLDcgKzYzOCw3IEBACiAJd2hpbGUgKC0tdGltZSAmJiAoaWdldGR3b3JkKGNoaXAsIElDSFJFRyhBTElfQ0FTKSkgJiBBTElfQ0FTX1NFTV9CVVNZKSkKIAkJdWRlbGF5KDEpOwogCWlmICghIHRpbWUgJiYgISBjaGlwLT5pbl9hYzk3X2luaXQpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhbGlfY29kZWNfc2VtYXBob3JlIHRpbWVvdXRcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJhbGlfY29kZWNfc2VtYXBob3JlIHRpbWVvdXRcbiIpOwogCXJldHVybiBzbmRfaW50ZWw4eDBfYWxpX2NvZGVjX3JlYWR5KGNoaXAsIEFMSV9DU1BTUl9DT0RFQ19SRUFEWSk7CiB9CiAKQEAgLTcwMCw3ICs3MDcsNyBAQAogCQkJYmRiYXJbaWR4ICsgMV0gPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwIHwgLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KIAkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZSA+PiBpY2hkZXYtPnBvc19zaGlmdCk7CiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJkYmFyWyVpXSA9IDB4JXggWzB4JXhdXG4iLAorCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwKIAkJCSAgICAgICBpZHggKyAwLCBiZGJhcltpZHggKyAwXSwgYmRiYXJbaWR4ICsgMV0pOwogI2VuZGlmCiAJCX0KQEAgLTcxMiw4ICs3MTksOCBAQAogCWljaGRldi0+bHZpX2ZyYWcgPSBJQ0hfUkVHX0xWSV9NQVNLICUgaWNoZGV2LT5mcmFnczsKIAlpY2hkZXYtPnBvc2l0aW9uID0gMDsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgIgotCSAgICAgICAicGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKIAkgICAgICAgaWNoZGV2LT5sdmlfZnJhZywgaWNoZGV2LT5mcmFncywgaWNoZGV2LT5mcmFnc2l6ZSwKIAkgICAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2VuZGlmCkBAIC03ODEsOCArNzg4LDggQEAKIAkJaWNoZGV2LT5sdmlfZnJhZyAlPSBpY2hkZXYtPmZyYWdzOwogCQlpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0gPSBjcHVfdG9fbGUzMihpY2hkZXYtPnBoeXNidWYgKyBpY2hkZXYtPmx2aV9mcmFnICogaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAibmV3OiBiZGJhclslaV0gPSAweCV4IFsweCV4XSwgcHJlZmV0Y2ggPSAlaSwgIgotCSAgICAgICAiYWxsID0gMHgleCwgMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIm5ldzogYmRiYXJbJWldID0gMHgleCBbMHgleF0sIHByZWZldGNoID0gJWksIGFsbCA9IDB4JXgsIDB4JXhcbiIsCiAJICAgICAgIGljaGRldi0+bHZpICogMiwgaWNoZGV2LT5iZGJhcltpY2hkZXYtPmx2aSAqIDJdLAogCSAgICAgICBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMiArIDFdLCBpbmIoSUNIX1JFR19PRkZfUElWICsgcG9ydCksCiAJICAgICAgIGlubChwb3J0ICsgNCksIGluYihwb3J0ICsgSUNIX1JFR19PRkZfQ1IpKTsKQEAgLTIyODksNyArMjI5Niw4IEBACiAJCWFjOTcubnVtID0gaTsKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbaV0pKSA8IDApIHsKIAkJCWlmIChlcnIgIT0gLUVBQ0NFUykKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjb2RlYyAjJWRcbiIsIGkpOworCQkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgY29kZWMgIyVkXG4iLCBpKTsKIAkJCWlmIChpID09IDApCiAJCQkJZ290byBfX2VycjsKIAkJfQpAQCAtMjQ0MSw3ICsyNDQ5LDcgQEAKIAkJCXJldHVybiAwOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd2FybSByZXNldCBzdGlsbCBpbiBwcm9ncmVzcz8gWzB4JXhdXG4iLAorCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQUMnOTcgd2FybSByZXNldCBzdGlsbCBpbiBwcm9ncmVzcz8gWzB4JXhdXG4iLAogCQkgICBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSkpOwogCXJldHVybiAtRUlPOwogfQpAQCAtMjQ4Myw3ICsyNDkxLDggQEAKIAkJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwogCQlpZiAoISBzdGF0dXMpIHsKIAkJCS8qIG5vIGNvZGVjIGlzIGZvdW5kICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb2RlY19yZWFkeTogY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKIAkJCQkgICBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KQEAgLTI1NDcsNyArMjU1Niw3IEBACiAJCQlnb3RvIF9fb2s7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyByZXNldCBmYWlsZWQuXG4iKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IHJlc2V0IGZhaWxlZC5cbiIpOwogCWlmIChwcm9iaW5nKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMjU5MSw3ICsyNjAwLDcgQEAKICAgICAgICAgCQkgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MDogcmVzZXQgb2YgcmVnaXN0ZXJzIGZhaWxlZD9cbiIpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJyZXNldCBvZiByZWdpc3RlcnMgZmFpbGVkP1xuIik7CiAgICAgICAgIH0KIAkvKiBpbml0aWFsaXplIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3RzICovCiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJkYmFyc19jb3VudDsgaSsrKQpAQCAtMjY5Miw4ICsyNzAxLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNzAxLDggKzI3MDksOCBAQAogCXNuZF9pbnRlbDh4MF9jaGlwX2luaXQoY2hpcCwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaW50ZWw4eDBfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iLAorCQkJcGNpLT5pcnEpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNzc5LDcgKzI3ODcsOCBAQAogICAgICAgX19hZ2FpbjoKIAlzdWJzID0gY2hpcC0+cGNtWzBdLT5zdHJlYW1zWzBdLnN1YnN0cmVhbTsKIAlpZiAoISBzdWJzIHx8IHN1YnMtPmRtYV9idWZmZXIuYnl0ZXMgPCBJTlRFTDhYMF9URVNUQlVGX1NJWkUpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm5vIHBsYXliYWNrIGJ1ZmZlciBhbGxvY2F0ZWQgLSBhYm9ydGluZyBtZWFzdXJlIGFjOTcgY2xvY2tcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCisJCQkgIm5vIHBsYXliYWNrIGJ1ZmZlciBhbGxvY2F0ZWQgLSBhYm9ydGluZyBtZWFzdXJlIGFjOTcgY2xvY2tcbiIpOwogCQlyZXR1cm47CiAJfQogCWljaGRldiA9ICZjaGlwLT5pY2hkW0lDSERfUENNT1VUXTsKQEAgLTI3ODksNyArMjc5OCw4IEBACiAKIAkvKiBzZXQgcmF0ZSAqLwogCWlmIChzbmRfYWM5N19zZXRfcmF0ZShjaGlwLT5hYzk3WzBdLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwgNDgwMDApIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc2V0IGFjOTcgcmF0ZTogY2xvY2sgPSAlZFxuIiwgY2hpcC0+YWM5N19idXMtPmNsb2NrKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3Qgc2V0IGFjOTcgcmF0ZTogY2xvY2sgPSAlZFxuIiwKKwkJCWNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CiAJCXJldHVybjsKIAl9CiAJc25kX2ludGVsOHgwX3NldHVwX3BlcmlvZHMoY2hpcCwgaWNoZGV2KTsKQEAgLTI4NDMsNyArMjg1Myw4IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlpZiAocG9zID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IG1lYXN1cmUgLSB1bnJlbGlhYmxlIERNQSBwb3NpdGlvbi4uXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibWVhc3VyZSAtIHVucmVsaWFibGUgRE1BIHBvc2l0aW9uLi5cbiIpOwogCSAgICAgIF9fcmV0cnk6CiAJCWlmIChhdHRlbXB0IDwgMykgewogCQkJbXNsZWVwKDMwMCk7CkBAIC0yODU3LDE2ICsyODY4LDE3IEBACiAJdCA9IHN0b3BfdGltZS50dl9zZWMgLSBzdGFydF90aW1lLnR2X3NlYzsKIAl0ICo9IDEwMDAwMDA7CiAJdCArPSAoc3RvcF90aW1lLnR2X25zZWMgLSBzdGFydF90aW1lLnR2X25zZWMpIC8gMTAwMDsKLQlwcmludGsoS0VSTl9JTkZPICIlczogbWVhc3VyZWQgJWx1IHVzZWNzICglbHUgc2FtcGxlcylcbiIsIF9fZnVuY19fLCB0LCBwb3MpOworCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJICIlczogbWVhc3VyZWQgJWx1IHVzZWNzICglbHUgc2FtcGxlcylcbiIsIF9fZnVuY19fLCB0LCBwb3MpOwogCWlmICh0ID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6ID8/IGNhbGN1bGF0aW9uIGVycm9yLi5cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIj8/IGNhbGN1bGF0aW9uIGVycm9yLi5cbiIpOwogCQlnb3RvIF9fcmV0cnk7CiAJfQogCXBvcyAqPSAxMDAwOwogCXBvcyA9IChwb3MgLyB0KSAqIDEwMDAgKyAoKHBvcyAlIHQpICogMTAwMCkgLyB0OwogCWlmIChwb3MgPCA0MDAwMCB8fCBwb3MgPj0gNjAwMDApIHsKIAkJLyogYWJub3JtYWwgdmFsdWUuIGh3IHByb2JsZW0/ICovCi0JCXByaW50ayhLRVJOX0lORk8gImludGVsOHgwOiBtZWFzdXJlZCBjbG9jayAlbGQgcmVqZWN0ZWRcbiIsIHBvcyk7CisJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIm1lYXN1cmVkIGNsb2NrICVsZCByZWplY3RlZFxuIiwgcG9zKTsKIAkJZ290byBfX3JldHJ5OwogCX0gZWxzZSBpZiAocG9zID4gNDA1MDAgJiYgcG9zIDwgNDE1MDApCiAJCS8qIGZpcnN0IGV4Y2VwdGlvbiAtIDQxMDAwSHogcmVmZXJlbmNlIGNsb2NrICovCkBAIC0yODc4LDcgKzI4OTAsNyBAQAogCQkvKiBub3QgNDgwMDBIeiwgdHVuaW5nIHRoZSBjbG9jay4uICovCiAJCWNoaXAtPmFjOTdfYnVzLT5jbG9jayA9IChjaGlwLT5hYzk3X2J1cy0+Y2xvY2sgKiA0ODAwMCkgLyBwb3M7CiAgICAgICBfX2VuZDoKLQlwcmludGsoS0VSTl9JTkZPICJpbnRlbDh4MDogY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CisJZGV2X2luZm8oY2hpcC0+Y2FyZC0+ZGV2LCAiY2xvY2tpbmcgdG8gJWRcbiIsIGNoaXAtPmFjOTdfYnVzLT5jbG9jayk7CiAJc25kX2FjOTdfdXBkYXRlX3Bvd2VyKGNoaXAtPmFjOTdbMF0sIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCAwKTsKIH0KIApAQCAtMjg5OSw3ICsyOTExLDcgQEAKIAl3bCA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgaW50ZWw4eDBfY2xvY2tfbGlzdCk7CiAJaWYgKCF3bCkKIAkJcmV0dXJuIDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6IHdoaXRlIGxpc3QgcmF0ZSBmb3IgJTA0eDolMDR4IGlzICVpXG4iLAorCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwgIndoaXRlIGxpc3QgcmF0ZSBmb3IgJTA0eDolMDR4IGlzICVpXG4iLAogCSAgICAgICBwY2ktPnN1YnN5c3RlbV92ZW5kb3IsIHBjaS0+c3Vic3lzdGVtX2RldmljZSwgd2wtPnZhbHVlKTsKIAljaGlwLT5hYzk3X2J1cy0+Y2xvY2sgPSB3bC0+dmFsdWU7CiAJcmV0dXJuIDE7CkBAIC0zMDAzLDcgKzMwMTUsNyBAQAogCiBmaW5pOgogCWlmIChtc2cgIT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6ICVzIG9wdGltaXphdGlvblxuIiwgbXNnKTsKKwkJZGV2X2luZm8oJnBjaS0+ZGV2LCAiJXMgb3B0aW1pemF0aW9uXG4iLCBtc2cpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTMwOTgsNyArMzExMCw3IEBACiAJZWxzZQogCQljaGlwLT5hZGRyID0gcGNpX2lvbWFwKHBjaSwgMCwgMCk7CiAJaWYgKCFjaGlwLT5hZGRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKIAkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTMxMDcsNyArMzExOSw3IEBACiAJZWxzZQogCQljaGlwLT5ibWFkZHIgPSBwY2lfaW9tYXAocGNpLCAxLCAwKTsKIAlpZiAoIWNoaXAtPmJtYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ29udHJvbGxlciBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOwogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzE1Miw3ICszMTY0LDcgQEAKIAkJCQljaGlwLT5iZGJhcnNfY291bnQgKiBzaXplb2YodTMyKSAqIElDSF9NQVhfRlJBR1MgKiAyLAogCQkJCSZjaGlwLT5iZGJhcnMpIDwgMCkgewogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IGNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnNcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJLyogdGFibGVzIG11c3QgYmUgYWxpZ25lZCB0byA4IGJ5dGVzIGhlcmUsIGJ1dCB0aGUga2VybmVsIHBhZ2VzCkBAIC0zMjA2LDcgKzMyMTgsNyBAQAogCS8qIHJlcXVlc3QgaXJxIGFmdGVyIGluaXRpYWxpemFpbmcgaW50X3N0YV9tYXNrLCBldGMgKi8KIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0zMjE3LDggKzMyMjksNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX2ludGVsOHgwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTMyNjUsMTIgKzMyNzUsMTIgQEAKIAl3ID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBzcGRpZl9hY2xpbmtfZGVmYXVsdHMpOwogCWlmICh3KSB7CiAJCWlmICh3LT52YWx1ZSkKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTwotCQkJCSAgICAiaW50ZWw4eDA6IFVzaW5nIFNQRElGIG92ZXIgQUMtTGluayBmb3IgJXNcbiIsCisJCQlkZXZfZGJnKCZwY2ktPmRldiwKKwkJCQkiVXNpbmcgU1BESUYgb3ZlciBBQy1MaW5rIGZvciAlc1xuIiwKIAkJCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHcpKTsKIAkJZWxzZQotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPCi0JCQkJICAgICJpbnRlbDh4MDogVXNpbmcgaW50ZWdyYXRlZCBTUERJRiBETUEgZm9yICVzXG4iLAorCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJIlVzaW5nIGludGVncmF0ZWQgU1BESUYgRE1BIGZvciAlc1xuIiwKIAkJCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHcpKTsKIAkJcmV0dXJuIHctPnZhbHVlOwogCX0KQEAgLTMyODUsNyArMzI5NSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlICpuYW1lOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCAzNTczYzExLi5iNTRkM2U5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0zMzQsNyArMzM0LDggQEAKIAkvKiBhY2Nlc3MgdG8gc29tZSBmb3JiaWRkZW4gKG5vbiBleGlzdGVudCkgYWM5NyByZWdpc3RlcnMgd2lsbCBub3QKIAkgKiByZXNldCB0aGUgc2VtYXBob3JlLiBTbyBldmVuIGlmIHlvdSBkb24ndCBnZXQgdGhlIHNlbWFwaG9yZSwgc3RpbGwKIAkgKiBjb250aW51ZSB0aGUgYWNjZXNzLiBXZSBkb24ndCBuZWVkIHRoZSBzZW1hcGhvcmUgYW55d2F5LiAqLwotCXNuZF9wcmludGsoS0VSTl9FUlIgImNvZGVjX3NlbWFwaG9yZTogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBbMHgleF1bMHgleF1cbiIsCisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCSJjb2RlY19zZW1hcGhvcmU6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgWzB4JXhdWzB4JXhdXG4iLAogCQkJaWdldGJ5dGUoY2hpcCwgSUNIUkVHKEFDQ19TRU1BKSksIGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKSk7CiAJaWFnZXR3b3JkKGNoaXAsIDApOwkvKiBjbGVhciBzZW1hcGhvcmUgZmxhZyAqLwogCS8qIEkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgc2VtYXBob3JlICovCkBAIC0zNDksNyArMzUwLDkgQEAKIAkKIAlpZiAoc25kX2ludGVsOHgwbV9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfd3JpdGUgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsIGFjOTctPm51bSwgcmVnKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb2RlY193cml0ZSAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwKKwkJCQlhYzk3LT5udW0sIHJlZyk7CiAJfQogCWlhcHV0d29yZChjaGlwLCByZWcgKyBhYzk3LT5udW0gKiAweDgwLCB2YWwpOwogfQpAQCAtMzYzLDcgKzM2Niw5IEBACiAKIAlpZiAoc25kX2ludGVsOHgwbV9jb2RlY19zZW1hcGhvcmUoY2hpcCwgYWM5Ny0+bnVtKSA8IDApIHsKIAkJaWYgKCEgY2hpcC0+aW5fYWM5N19pbml0KQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZCAlZDogc2VtYXBob3JlIGlzIG5vdCByZWFkeSBmb3IgcmVnaXN0ZXIgMHgleFxuIiwgYWM5Ny0+bnVtLCByZWcpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQgJWQ6IHNlbWFwaG9yZSBpcyBub3QgcmVhZHkgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsCisJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQlyZXMgPSAweGZmZmY7CiAJfSBlbHNlIHsKIAkJcmVzID0gaWFnZXR3b3JkKGNoaXAsIHJlZyArIGFjOTctPm51bSAqIDB4ODApOwpAQCAtMzcyLDcgKzM3Nyw5IEBACiAJCQlpcHV0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSwKIAkJCQkgIHRtcCAmIH4oSUNIX1NSSXxJQ0hfUFJJfElDSF9UUkl8SUNIX0dTQ0kpKTsKIAkJCWlmICghIGNoaXAtPmluX2FjOTdfaW5pdCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkICVkOiByZWFkIHRpbWVvdXQgZm9yIHJlZ2lzdGVyIDB4JXhcbiIsIGFjOTctPm51bSwgcmVnKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJImNvZGVjX3JlYWQgJWQ6IHJlYWQgdGltZW91dCBmb3IgcmVnaXN0ZXIgMHgleFxuIiwKKwkJCQkJYWM5Ny0+bnVtLCByZWcpOwogCQkJcmVzID0gMHhmZmZmOwogCQl9CiAJfQpAQCAtNDEyLDcgKzQxOSw3IEBACiAJCQliZGJhcltpZHggKyAxXSA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDAgfCAvKiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLwogCQkJCQkJICAgICBpY2hkZXYtPmZyYWdzaXplID4+IGNoaXAtPnBjbV9wb3Nfc2hpZnQpOwogCQkJLyoKLQkJCXByaW50ayhLRVJOX0RFQlVHICJiZGJhclslaV0gPSAweCV4IFsweCV4XVxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYmRiYXJbJWldID0gMHgleCBbMHgleF1cbiIsCiAJCQkgICAgICAgaWR4ICsgMCwgYmRiYXJbaWR4ICsgMF0sIGJkYmFyW2lkeCArIDFdKTsKIAkJCSovCiAJCX0KQEAgLTQyNCw4ICs0MzEsOCBAQAogCWljaGRldi0+bHZpX2ZyYWcgPSBJQ0hfUkVHX0xWSV9NQVNLICUgaWNoZGV2LT5mcmFnczsKIAlpY2hkZXYtPnBvc2l0aW9uID0gMDsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgIgotCSAgICAgICAicGVyaW9kX3NpemUxID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImx2aV9mcmFnID0gJWksIGZyYWdzID0gJWksIHBlcmlvZF9zaXplID0gMHgleCwgcGVyaW9kX3NpemUxID0gMHgleFxuIiwKIAkgICAgICAgaWNoZGV2LT5sdmlfZnJhZywgaWNoZGV2LT5mcmFncywgaWNoZGV2LT5mcmFnc2l6ZSwKIAkgICAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2VuZGlmCkBAIC00NzAsOCArNDc3LDggQEAKIAkJCQkJCQkgICAgIGljaGRldi0+bHZpX2ZyYWcgKgogCQkJCQkJCSAgICAgaWNoZGV2LT5mcmFnc2l6ZTEpOwogI2lmIDAKLQkJcHJpbnRrKEtFUk5fREVCVUcgIm5ldzogYmRiYXJbJWldID0gMHgleCBbMHgleF0sICIKLQkJICAgICAgICJwcmVmZXRjaCA9ICVpLCBhbGwgPSAweCV4LCAweCV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJuZXc6IGJkYmFyWyVpXSA9IDB4JXggWzB4JXhdLCBwcmVmZXRjaCA9ICVpLCBhbGwgPSAweCV4LCAweCV4XG4iLAogCQkgICAgICAgaWNoZGV2LT5sdmkgKiAyLCBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMl0sCiAJCSAgICAgICBpY2hkZXYtPmJkYmFyW2ljaGRldi0+bHZpICogMiArIDFdLCBpbmIoSUNIX1JFR19PRkZfUElWICsgcG9ydCksCiAJCSAgICAgICBpbmwocG9ydCArIDQpLCBpbmIocG9ydCArIElDSF9SRUdfT0ZGX0NSKSk7CkBAIC04NTAsNyArODU3LDggQEAKIAlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKIAlhYzk3Lm51bSA9IGdsb2Jfc3RhICYgSUNIX1NDUiA/IDEgOiAwOwogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZ4OTcpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGluaXRpYWxpemUgY29kZWMgIyVkXG4iLCBhYzk3Lm51bSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIlVuYWJsZSB0byBpbml0aWFsaXplIGNvZGVjICMlZFxuIiwgYWM5Ny5udW0pOwogCQlpZiAoYWM5Ny5udW0gPT0gMCkKIAkJCWdvdG8gX19lcnI7CiAJCXJldHVybiBlcnI7CkBAIC05MDEsNyArOTA5LDcgQEAKIAkJCWdvdG8gX19vazsKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkFDJzk3IHdhcm0gcmVzZXQgc3RpbGwgaW4gcHJvZ3Jlc3M/IFsweCV4XVxuIiwKIAkJICAgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX0NOVCkpKTsKIAlyZXR1cm4gLUVJTzsKIApAQCAtOTIxLDcgKzkyOSw4IEBACiAJCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKIAkJaWYgKCEgc3RhdHVzKSB7CiAJCQkvKiBubyBjb2RlYyBpcyBmb3VuZCAqLwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiY29kZWNfcmVhZHk6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCiAJCQkJICAgaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xMDQyLDE2ICsxMDUxLDE1IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MG06IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwbV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDBtOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iLAorCQkJcGNpLT5pcnEpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMTY1LDcgKzExNzMsNyBAQAogCWVsc2UKIAkJY2hpcC0+YWRkciA9IHBjaV9pb21hcChwY2ksIDAsIDApOwogCWlmICghY2hpcC0+YWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9pbnRlbDh4MG1fZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE3NCw3ICsxMTgyLDcgQEAKIAllbHNlCiAJCWNoaXAtPmJtYWRkciA9IHBjaV9pb21hcChwY2ksIDEsIDApOwogCWlmICghY2hpcC0+Ym1hZGRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CiAJCXNuZF9pbnRlbDh4MG1fZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE4Miw3ICsxMTkwLDcgQEAKICBwb3J0X2luaXRlZDoKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MG1faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2ludGVsOHgwbV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEyNDMsOCArMTI1MSw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfaW50ZWw4eDBtID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEyODMsNyArMTI4OSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc2hvcnRuYW1lX3RhYmxlICpuYW1lOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKaW5kZXggOWNmOTgyOS4uOGYzNmQ3NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKKysrIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKQEAgLTI0MTgsOCArMjQxOCw2IEBACiAKICAgICAgICAgc25kX2tvcmcxMjEyX3Byb2NfaW5pdChrb3JnMTIxMik7CiAgICAgICAgIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogICAgICAgICAqIHJjaGlwID0ga29yZzEyMTI7CiAJcmV0dXJuIDA7CiAKQEAgLTI0NDUsNyArMjQ0Myw4IEBACiAJCWRldisrOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGEuYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwppbmRleCAwNTY4NTQwLi42ODgyNGNkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYS5jCkBAIC03NSw3ICs3NSw3IEBACiBzdGF0aWMgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogI2RlZmluZSB2ZXJib3NlX2RlYnVnKGZtdCwgYXJncy4uLikJCQlcCi0JZG8geyBpZiAoZGVidWcgPiAxKSBwcmludGsoS0VSTl9ERUJVRyBTRlggZm10LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorCWRvIHsgaWYgKGRlYnVnID4gMSkgcHJfZGVidWcoU0ZYIGZtdCwgIyNhcmdzKTsgfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIHZlcmJvc2VfZGVidWcoZm10LCBhcmdzLi4uKQogI2VuZGlmCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJCXZlcmJvc2VfZGVidWcoImdldF9yZXNwb25zZTogJXgsICV4XG4iLAogCQkJCSAgICAgIGNoaXAtPnJlcywgY2hpcC0+cmVzX2V4KTsKIAkJCWlmIChjaGlwLT5yZXNfZXggJiBMT0xBX1JJUkJfRVhfRVJST1IpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiUklSQiBFUlJPUjogIgorCQkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIlJJUkIgRVJST1I6ICIKIAkJCQkgICAgICAgIk5JRD0leCwgdmVyYj0leCwgZGF0YT0leCwgZXh0PSV4XG4iLAogCQkJCSAgICAgICBjaGlwLT5sYXN0X2NtZF9uaWQsCiAJCQkJICAgICAgIGNoaXAtPmxhc3RfdmVyYiwgY2hpcC0+bGFzdF9kYXRhLApAQCAtMTgyLDkgKzE4Miw5IEBACiAJCXVkZWxheSgyMCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiUklSQiByZXNwb25zZSBlcnJvclxuIik7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiUklSQiByZXNwb25zZSBlcnJvclxuIik7CiAJaWYgKCFjaGlwLT5wb2xsaW5nX21vZGUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBTRlggInN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGVcbiIpOworCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJzd2l0Y2hpbmcgdG8gcG9sbGluZyBtb2RlXG4iKTsKIAkJY2hpcC0+cG9sbGluZ19tb2RlID0gMTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CiAJaWYgKCFnY3RsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCByZXNldCBjb250cm9sbGVyXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVzZXQgY29udHJvbGxlclxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQ1Miw0MCArNDUyLDQwIEBACiAKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgMCwgTE9MQV9QQVJfVkVORE9SX0lELCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIFZFTkRPUl9JRFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBWRU5ET1JfSURcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl2YWwgPj49IDE2OwogCWlmICh2YWwgIT0gMHgxMzY5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIlVua25vd24gY29kZWMgdmVuZG9yIDB4JXhcbiIsIHZhbCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiVW5rbm93biBjb2RlYyB2ZW5kb3IgMHgleFxuIiwgdmFsKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIDEsIExPTEFfUEFSX0ZVTkNUSU9OX1RZUEUsICZ2YWwpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkNhbid0IHJlYWQgRlVOQ1RJT05fVFlQRVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBGVU5DVElPTl9UWVBFXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWYgKHZhbCAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIlVua25vd24gZnVuY3Rpb24gdHlwZSAlZFxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJVbmtub3duIGZ1bmN0aW9uIHR5cGUgJWRcbiIsIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVyciA9IGxvbGFfcmVhZF9wYXJhbShjaGlwLCAxLCBMT0xBX1BBUl9TUEVDSUZJQ19DQVBTLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIFNQRUNDQVBTXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIFNQRUNDQVBTXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJY2hpcC0+bG9sYV9jYXBzID0gdmFsOwogCWNoaXAtPnBpbltDQVBUXS5udW1fcGlucyA9IExPTEFfQUZHX0lOUFVUX1BJTl9DT1VOVChjaGlwLT5sb2xhX2NhcHMpOwogCWNoaXAtPnBpbltQTEFZXS5udW1fcGlucyA9IExPTEFfQUZHX09VVFBVVF9QSU5fQ09VTlQoY2hpcC0+bG9sYV9jYXBzKTsKLQlzbmRfcHJpbnRkZChTRlggInNwZWNjYXBzPTB4JXgsIHBpbnMgaW49JWQsIG91dD0lZFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInNwZWNjYXBzPTB4JXgsIHBpbnMgaW49JWQsIG91dD0lZFxuIiwKIAkJICAgIGNoaXAtPmxvbGFfY2FwcywKIAkJICAgIGNoaXAtPnBpbltDQVBUXS5udW1fcGlucywgY2hpcC0+cGluW1BMQVldLm51bV9waW5zKTsKIAogCWlmIChjaGlwLT5waW5bQ0FQVF0ubnVtX3BpbnMgPiBNQVhfQVVESU9fSU5PVVRfQ09VTlQgfHwKIAkgICAgY2hpcC0+cGluW1BMQVldLm51bV9waW5zID4gTUFYX0FVRElPX0lOT1VUX0NPVU5UKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkludmFsaWQgTG9sYS1zcGVjIGNhcHMgMHgleFxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJJbnZhbGlkIExvbGEtc3BlYyBjYXBzIDB4JXhcbiIsIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTg2LDcgKzU4Niw2IEBACiAKIAljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTYwOSw3ICs2MDgsNyBAQAogCQljaGlwLT5zYW1wbGVfcmF0ZV9tYXggPSAxOTIwMDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIFNGWAorCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsCiAJCQkgICAiSW52YWxpZCBncmFudWxhcml0eSAlZCwgcmVzZXQgdG8gJWRcbiIsCiAJCQkgICBjaGlwLT5ncmFudWxhcml0eSwgTE9MQV9HUkFOVUxBUklUWV9NQVgpOwogCQljaGlwLT5ncmFudWxhcml0eSA9IExPTEFfR1JBTlVMQVJJVFlfTUFYOwpAQCAtNjE4LDcgKzYxNyw3IEBACiAJfQogCWNoaXAtPnNhbXBsZV9yYXRlX21pbiA9IHNhbXBsZV9yYXRlX21pbltkZXZdOwogCWlmIChjaGlwLT5zYW1wbGVfcmF0ZV9taW4gPiBjaGlwLT5zYW1wbGVfcmF0ZV9tYXgpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgU0ZYCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICJJbnZhbGlkIHNhbXBsZV9yYXRlX21pbiAlZCwgcmVzZXQgdG8gMTYwMDBcbiIsCiAJCQkgICBjaGlwLT5zYW1wbGVfcmF0ZV9taW4pOwogCQljaGlwLT5zYW1wbGVfcmF0ZV9taW4gPSAxNjAwMDsKQEAgLTYzNiw3ICs2MzUsNyBAQAogCWNoaXAtPmJhclsxXS5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CiAJY2hpcC0+YmFyWzFdLnJlbWFwX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAyKTsKIAlpZiAoIWNoaXAtPmJhclswXS5yZW1hcF9hZGRyIHx8ICFjaGlwLT5iYXJbMV0ucmVtYXBfYWRkcikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiaW9yZW1hcCBlcnJvclxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW9yZW1hcCBlcnJvclxuIik7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBlcnJvdXQ7CiAJfQpAQCAtNjQ5LDcgKzY0OCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGxvbGFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGVycm91dDsKIAl9CkBAIC02NjAsNyArNjU5LDcgQEAKIAljaGlwLT5wY21bQ0FQVF0ubnVtX3N0cmVhbXMgPSAoZGV2ZXIgPj4gMCkgJiAweDNmZjsKIAljaGlwLT5wY21bUExBWV0ubnVtX3N0cmVhbXMgPSAoZGV2ZXIgPj4gMTApICYgMHgzZmY7CiAJY2hpcC0+dmVyc2lvbiA9IChkZXZlciA+PiAyNCkgJiAweGZmOwotCXNuZF9wcmludGRkKFNGWCAic3RyZWFtcyBpbj0lZCwgb3V0PSVkLCB2ZXJzaW9uPTB4JXhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdHJlYW1zIGluPSVkLCBvdXQ9JWQsIHZlcnNpb249MHgleFxuIiwKIAkJICAgIGNoaXAtPnBjbVtDQVBUXS5udW1fc3RyZWFtcywgY2hpcC0+cGNtW1BMQVldLm51bV9zdHJlYW1zLAogCQkgICAgY2hpcC0+dmVyc2lvbik7CiAKQEAgLTY2OSw3ICs2NjgsNyBAQAogCSAgICBjaGlwLT5wY21bUExBWV0ubnVtX3N0cmVhbXMgPiBNQVhfU1RSRUFNX09VVF9DT1VOVCB8fAogCSAgICAoIWNoaXAtPnBjbVtDQVBUXS5udW1fc3RyZWFtcyAmJgogCSAgICAgIWNoaXAtPnBjbVtQTEFZXS5udW1fc3RyZWFtcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiaW52YWxpZCBERVZFUiA9ICV4XG4iLCBkZXZlcik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiaW52YWxpZCBERVZFUiA9ICV4XG4iLCBkZXZlcik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3V0OwogCX0KQEAgLTY4MCw3ICs2NzksNyBAQAogCiAJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgZGV2aWNlIFtjYXJkXSFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkVycm9yIGNyZWF0aW5nIGRldmljZSBbY2FyZF0hXG4iKTsKIAkJZ290byBlcnJvdXQ7CiAJfQogCkBAIC03MTcsMTQgKzcxNiwxMyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiRXJyb3IgY3JlYXRpbmcgY2FyZCFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkVycm9yIGNyZWF0aW5nIGNhcmQhXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAllcnIgPSBsb2xhX2NyZWF0ZShjYXJkLCBwY2ksIGRldiwgJmNoaXApOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2xvbGEvbG9sYV9jbG9jay5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9jbG9jay5jCmluZGV4IGViMWQ2YjkuLjJiZWY2YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfY2xvY2suYworKysgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX2Nsb2NrLmMKQEAgLTEyOCwyMSArMTI4LDIxIEBACiAKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgbmlkLCBMT0xBX1BBUl9BVURJT19XSURHRVRfQ0FQLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IHJlYWQgd2NhcHMgZm9yIDB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKCh2YWwgJiAweGZmZjAwMDAwKSAhPSAweDAxZjAwMDAwKSB7IC8qIHRlc3QgU3ViVHlwZSBhbmQgVHlwZSAqLwotCQlzbmRfcHJpbnRkZCgiTm8gdmFsaWQgY2xvY2sgd2lkZ2V0XG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJObyB2YWxpZCBjbG9jayB3aWRnZXRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAljaGlwLT5jbG9jay5uaWQgPSBuaWQ7CiAJY2hpcC0+Y2xvY2suaXRlbXMgPSB2YWwgJiAweGZmOwotCXNuZF9wcmludGRkKCJjbG9ja19saXN0IG5pZD0leCwgZW50cmllcz0lZFxuIiwgbmlkLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY2xvY2tfbGlzdCBuaWQ9JXgsIGVudHJpZXM9JWRcbiIsIG5pZCwKIAkJICAgIGNoaXAtPmNsb2NrLml0ZW1zKTsKIAlpZiAoY2hpcC0+Y2xvY2suaXRlbXMgPiBNQVhfU0FNUExFX0NMT0NLX0NPVU5UKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBTRlggIkNMT0NLX0xJU1QgdG9vIGJpZzogJWRcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ0xPQ0tfTElTVCB0b28gYmlnOiAlZFxuIiwKIAkJICAgICAgIGNoaXAtPmNsb2NrLml0ZW1zKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCWVyciA9IGxvbGFfY29kZWNfcmVhZChjaGlwLCBuaWQsIExPTEFfVkVSQl9HRVRfQ0xPQ0tfTElTVCwKIAkJCQkgICAgICBpZHgsIDAsICZ2YWwsICZyZXNfZXgpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCBDTE9DS19MSVNUXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiQ2FuJ3QgcmVhZCBDTE9DS19MSVNUXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBTRlggImVycm9yIGluIGVuYWJsZV9jbG9ja19ldmVudHMgJWRcbiIsCisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIGluIGVuYWJsZV9jbG9ja19ldmVudHMgJWRcbiIsCiAJCSAgICAgICByZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNDIsNyArMjQyLDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAocmVzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICJlcnJvciBpbiBzZXRfY2xvY2sgJWRcbiIsIHJlcyk7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIGluIHNldF9jbG9jayAlZFxuIiwgcmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2xvbGEvbG9sYV9taXhlci5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9taXhlci5jCmluZGV4IDUyYzhkNmIuLjc4MmY0ZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX21peGVyLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlwaW4tPm5pZCA9IG5pZDsKIAllcnIgPSBsb2xhX3JlYWRfcGFyYW0oY2hpcCwgbmlkLCBMT0xBX1BBUl9BVURJT19XSURHRVRfQ0FQLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IHJlYWQgd2NhcHMgZm9yIDB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCXZhbCAmPSAweDAwZjAwZmZmOyAvKiB0ZXN0IFRZUEUgYW5kIGJpdHMgMC4uMTEgKi8KQEAgLTQ4LDcgKzQ4LDcgQEAKIAllbHNlIGlmICh2YWwgPT0gMHgwMDQwMDAwYyAmJiBkaXIgPT0gUExBWSkgLyogRGlnPTAsIE91dEFtcC9vdnJkICovCiAJCXBpbi0+aXNfYW5hbG9nID0gdHJ1ZTsKIAllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLCB2YWwsIG5pZCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLCB2YWwsIG5pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjIsNyArNjIsNyBAQAogCWVsc2UKIAkJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQU1QX0lOX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCBBTVAtY2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIEFNUC1jYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNzksNyArNzksNyBAQAogCWVyciA9IGxvbGFfY29kZWNfcmVhZChjaGlwLCBuaWQsIExPTEFfVkVSQl9HRVRfTUFYX0xFVkVMLCAwLCAwLCAmdmFsLAogCQkJICAgICAgTlVMTCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgZ2V0IE1BWF9MRVZFTCAweCV4XG4iLCBuaWQpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIkNhbid0IGdldCBNQVhfTEVWRUwgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGluLT5tYXhfbGV2ZWwgPSB2YWwgJiAweDNmZjsgICAvKiAxMCBiaXRzICovCkBAIC0xMTksMTIgKzExOSwxMiBAQAogCiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQVVESU9fV0lER0VUX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCB3Y2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICgodmFsICYgMHhmZmYwMDAwMCkgIT0gMHgwMmYwMDAwMCkgeyAvKiB0ZXN0IFN1YlR5cGUgYW5kIFR5cGUgKi8KLQkJc25kX3ByaW50ZGQoIk5vIHZhbGlkIG1peGVyIHdpZGdldFxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTm8gdmFsaWQgbWl4ZXIgd2lkZ2V0XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKi8KIAlpZiAoY2hpcC0+bWl4ZXIuc3JjX3N0cmVhbV9vdXRfb2ZzID4gTUFYX0FVRElPX0lOT1VUX0NPVU5UIHx8CiAJICAgIGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzID4gTUFYX1NUUkVBTV9JTl9DT1VOVCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJJbnZhbGlkIG1peGVyIHdpZGdldCBzaXplXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJJbnZhbGlkIG1peGVyIHdpZGdldCBzaXplXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJKCgoMVUgPDwgY2hpcC0+bWl4ZXIuZGVzdF9waHlzX291dHMpIC0gMSkKIAkJIDw8IGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzKTsKIAotCXNuZF9wcmludGRkKCJNaXhlciBzcmNfbWFzaz0leCwgZGVzdF9tYXNrPSV4XG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiTWl4ZXIgc3JjX21hc2s9JXgsIGRlc3RfbWFzaz0leFxuIiwKIAkJICAgIGNoaXAtPm1peGVyLnNyY19tYXNrLCBjaGlwLT5taXhlci5kZXN0X21hc2spOwogCiAJcmV0dXJuIDA7CkBAIC0yMzYsNyArMjM2LDggQEAKIAkgICAgKGdhaW4gPT0gcmVhZHcoJmNoaXAtPm1peGVyLmFycmF5LT5zcmNfZ2FpbltpZF0pKSkKIAkJcmV0dXJuIDA7CiAKLQlzbmRfcHJpbnRkZCgibG9sYV9taXhlcl9zZXRfc3JjX2dhaW4gKGlkPSVkLCBnYWluPSVkKSBlbmFibGU9JXhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJsb2xhX21peGVyX3NldF9zcmNfZ2FpbiAoaWQ9JWQsIGdhaW49JWQpIGVuYWJsZT0leFxuIiwKIAkJCWlkLCBnYWluLCB2YWwpOwogCXdyaXRldyhnYWluLCAmY2hpcC0+bWl4ZXIuYXJyYXktPnNyY19nYWluW2lkXSk7CiAJd3JpdGVsKHZhbCwgJmNoaXAtPm1peGVyLmFycmF5LT5zcmNfZ2Fpbl9lbmFibGUpOwpAQCAtNDA5LDcgKzQxMCw4IEBACiAJCXJldHVybiAwOwogCWlmIChleHRlcm5hbF9jYWxsKQogCQlsb2xhX2NvZGVjX2ZsdXNoKGNoaXApOwotCXNuZF9wcmludGRkKCJzZXRfYW5hbG9nX3ZvbHVtZSAoZGlyPSVkIGlkeD0lZCwgdm9sdW1lPSVkKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJInNldF9hbmFsb2dfdm9sdW1lIChkaXI9JWQgaWR4PSVkLCB2b2x1bWU9JWQpXG4iLAogCQkJZGlyLCBpZHgsIHZhbCk7CiAJZXJyID0gbG9sYV9jb2RlY193cml0ZShjaGlwLCBwaW4tPm5pZCwKIAkJCSAgICAgICBMT0xBX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIHZhbCwgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9wY20uYwppbmRleCA1ZWE4NWU4Li4zYmQ2OTg1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9sb2xhL2xvbGFfcGNtLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQkJcmV0dXJuOwogCQltc2xlZXAoMSk7CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgU0ZYICJTUlNUIG5vdCBjbGVhciAoc3RyZWFtICVkKVxuIiwgc3RyLT5kc2QpOworCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgIlNSU1Qgbm90IGNsZWFyIChzdHJlYW0gJWQpXG4iLCBzdHItPmRzZCk7CiB9CiAKIHN0YXRpYyBpbnQgbG9sYV9zdHJlYW1fd2FpdF9mb3JfZmlmbyhzdHJ1Y3QgbG9sYSAqY2hpcCwKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJcmV0dXJuIDA7CiAJCW1zbGVlcCgxKTsKIAl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyBTRlggIkZJRk8gbm90IHJlYWR5IChzdHJlYW0gJWQpXG4iLCBzdHItPmRzZCk7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBub3QgcmVhZHkgKHN0cmVhbSAlZClcbiIsIHN0ci0+ZHNkKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTU2LDcgKzE1Niw3IEBACiAJCQlyZXR1cm4gMDsKIAkJbXNsZWVwKDEpOwogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HIFNGWCAiRklGTyBub3QgcmVhZHkgKHBlbmRpbmcgJWQpXG4iLCBwZW5kaW5nIC0gMSk7CisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiRklGTyBub3QgcmVhZHkgKHBlbmRpbmcgJWQpXG4iLCBwZW5kaW5nIC0gMSk7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTM3Myw3ICszNzMsNyBAQAogCXJldHVybiAwOwogCiAgZXJyb3I6Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiBTRlggIlRvbyBtYW55IEJETCBlbnRyaWVzOiBidWZmZXI9JWQsIHBlcmlvZD0lZFxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlRvbyBtYW55IEJETCBlbnRyaWVzOiBidWZmZXI9JWQsIHBlcmlvZD0lZFxuIiwKIAkJICAgc3RyLT5idWZzaXplLCBwZXJpb2RfYnl0ZXMpOwogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtNDE1LDcgKzQxNSw3IEBACiAJZXJyID0gbG9sYV9jb2RlY19yZWFkKGNoaXAsIHN0ci0+bmlkLCBMT0xBX1ZFUkJfU0VUX1NUUkVBTV9GT1JNQVQsCiAJCQkgICAgICBzdHItPmZvcm1hdF92ZXJiLCAwLCAmdmFsLCBOVUxMKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW5ub3Qgc2V0IHN0cmVhbSBmb3JtYXQgMHgleFxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW5ub3Qgc2V0IHN0cmVhbSBmb3JtYXQgMHgleFxuIiwKIAkJICAgICAgIHN0ci0+Zm9ybWF0X3ZlcmIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTQyNyw3ICs0MjcsOCBAQAogCQkJCSAgICAgIExPTEFfVkVSQl9TRVRfQ0hBTk5FTF9TVFJFQU1JRCwgMCwgdmVyYiwKIAkJCQkgICAgICAmdmFsLCBOVUxMKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBTRlggIkNhbm5vdCBzZXQgc3RyZWFtIGNoYW5uZWwgJWRcbiIsIGkpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkNhbm5vdCBzZXQgc3RyZWFtIGNoYW5uZWwgJWRcbiIsIGkpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTY1MSwxMyArNjUyLDE0IEBACiAJCXN0ci0+ZHNkICs9IE1BWF9TVFJFQU1fSU5fQ09VTlQ7CiAJZXJyID0gbG9sYV9yZWFkX3BhcmFtKGNoaXAsIG5pZCwgTE9MQV9QQVJfQVVESU9fV0lER0VUX0NBUCwgJnZhbCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiQ2FuJ3QgcmVhZCB3Y2FwcyBmb3IgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIHdjYXBzIGZvciAweCV4XG4iLCBuaWQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoZGlyID09IFBMQVkpIHsKIAkJLyogdGVzdCBUWVBFIGFuZCBiaXRzIDAuLjExIChubyB0ZXN0IGJpdDkgOiBEaWdpdGFsID0gMC8xKSAqLwogCQlpZiAoKHZhbCAmIDB4MDBmMDBkZmYpICE9IDB4MDAwMDAwMTApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBTRlggIkludmFsaWQgd2NhcHMgMHgleCBmb3IgMHgleFxuIiwKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJJbnZhbGlkIHdjYXBzIDB4JXggZm9yIDB4JXhcbiIsCiAJCQkgICAgICAgdmFsLCBuaWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTY2Niw3ICs2NjgsOCBAQAogCQkgKiAoYnVnIDogaWdub3JlIGJpdDg6IENvbm4gbGlzdCA9IDAvMSkKIAkJICovCiAJCWlmICgodmFsICYgMHgwMGYwMGNmZikgIT0gMHgwMDEwMDAxMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCB3Y2FwcyAweCV4IGZvciAweCV4XG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJIkludmFsaWQgd2NhcHMgMHgleCBmb3IgMHgleFxuIiwKIAkJCSAgICAgICB2YWwsIG5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNjc3LDE0ICs2ODAsMTUgQEAKIAogCWVyciA9IGxvbGFfcmVhZF9wYXJhbShjaGlwLCBuaWQsIExPTEFfUEFSX1NUUkVBTV9GT1JNQVRTLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgU0ZYICJDYW4ndCByZWFkIEZPUk1BVFMgMHgleFxuIiwgbmlkKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJDYW4ndCByZWFkIEZPUk1BVFMgMHgleFxuIiwgbmlkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJdmFsICY9IDM7CiAJaWYgKHZhbCA9PSAzKQogCQlzdHItPmNhbl9mbG9hdCA9IHRydWU7CiAJaWYgKCEodmFsICYgMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFNGWCAiSW52YWxpZCBmb3JtYXRzIDB4JXggZm9yIDB4JXgiLCB2YWwsIG5pZCk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIkludmFsaWQgZm9ybWF0cyAweCV4IGZvciAweCV4IiwgdmFsLCBuaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCmluZGV4IDVmY2FhYTYuLjI3ZjYwY2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCisrKyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCkBAIC0xMTIsMTYgKzExMiwxNiBAQAogCiAJc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX3NpemUgPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAotCXNuZF9wcmludGQoTFhQICJhbGxvY2F0aW5nIHBpcGUgZm9yICVkIGNoYW5uZWxzXG4iLCBjaGFubmVscyk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJhbGxvY2F0aW5nIHBpcGUgZm9yICVkIGNoYW5uZWxzXG4iLCBjaGFubmVscyk7CiAJZXJyID0gbHhfcGlwZV9hbGxvY2F0ZShjaGlwLCAwLCBpc19jYXB0dXJlLCBjaGFubmVscyk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImFsbG9jYXRpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgTFhQICJhbGxvY2F0aW5nIHBpcGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAllcnIgPSBseF9zZXRfZ3JhbnVsYXJpdHkoY2hpcCwgcGVyaW9kX3NpemUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzZXR0aW5nIGdyYW51bGFyaXR5IHRvICVsZCBmYWlsZWRcbiIsCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic2V0dGluZyBncmFudWxhcml0eSB0byAlbGQgZmFpbGVkXG4iLAogCQkJICAgcGVyaW9kX3NpemUpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTEzNiwyNCArMTM2LDI0IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpbnQgaXNfY2FwdHVyZSA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCi0Jc25kX3ByaW50ZChMWFAgInNldHRpbmcgc3RyZWFtIGZvcm1hdFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzZXR0aW5nIHN0cmVhbSBmb3JtYXRcbiIpOwogCWVyciA9IGx4X3N0cmVhbV9zZXRfZm9ybWF0KGNoaXAsIHJ1bnRpbWUsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzZXR0aW5nIHN0cmVhbSBmb3JtYXQgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJzZXR0aW5nIHN0cmVhbSBmb3JtYXQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAic3RhcnRpbmcgcGlwZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdGFydGluZyBwaXBlXG4iKTsKIAllcnIgPSBseF9waXBlX3N0YXJ0KGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJzdGFydGluZyBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmcgcGlwZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGQoTFhQICJ3YWl0aW5nIGZvciBwaXBlIHRvIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIndhaXRpbmcgZm9yIHBpcGUgdG8gc3RhcnRcbiIpOwogCWVyciA9IGx4X3BpcGVfd2FpdF9mb3Jfc3RhcnQoY2hpcCwgMCwgaXNfY2FwdHVyZSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIndhaXRpbmcgZm9yIHBpcGUgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJ3YWl0aW5nIGZvciBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xNjcsMjQgKzE2NywyNCBAQAogCWludCBlcnIgPSAwOwogCWludCBpc19jYXB0dXJlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAKLQlzbmRfcHJpbnRkKExYUCAicGF1c2luZyBwaXBlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInBhdXNpbmcgcGlwZVxuIik7CiAJZXJyID0gbHhfcGlwZV9wYXVzZShjaGlwLCAwLCBpc19jYXB0dXJlKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAicGF1c2luZyBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAicGF1c2luZyBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX3ByaW50ZChMWFAgIndhaXRpbmcgZm9yIHBpcGUgdG8gYmVjb21lIGlkbGVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdGluZyBmb3IgcGlwZSB0byBiZWNvbWUgaWRsZVxuIik7CiAJZXJyID0gbHhfcGlwZV93YWl0X2Zvcl9pZGxlKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJ3YWl0aW5nIGZvciBwaXBlIGZhaWxlZFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAid2FpdGluZyBmb3IgcGlwZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGQoTFhQICJzdG9wcGluZyBwaXBlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nIHBpcGVcbiIpOwogCWVyciA9IGx4X3BpcGVfc3RvcChjaGlwLCAwLCBpc19jYXB0dXJlKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKExYUCAic3RvcHBpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nIHBpcGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE5OCwxMCArMTk4LDEwIEBACiAJaW50IGVyciA9IDA7CiAJaW50IGlzX2NhcHR1cmUgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKIAotCXNuZF9wcmludGQoTFhQICJyZWxlYXNpbmcgcGlwZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJyZWxlYXNpbmcgcGlwZVxuIik7CiAJZXJyID0gbHhfcGlwZV9yZWxlYXNlKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoTFhQICJyZWxlYXNpbmcgcGlwZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInJlbGVhc2luZyBwaXBlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgYm9hcmRfcmF0ZTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9vcGVuXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfcGNtX29wZW5cbiIpOwogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIAogCS8qIGNvcHkgdGhlIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHN0cnVjdCAqLwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKIAkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBMWFAgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kc1xuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kc1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAjZW5kaWYKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQkJCQkgICBib2FyZF9yYXRlLCBib2FyZF9yYXRlKTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiY291bGQgbm90IGNvbnN0cmFpbiBwZXJpb2RzXG4iKTsKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiY291bGQgbm90IGNvbnN0cmFpbiBwZXJpb2RzXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCQkJCSAgIE1JQ1JPQkxBWkVfSUJMX01JTiwKIAkJCQkJICAgTUlDUk9CTEFaRV9JQkxfTUFYKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBMWFAKKwkJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNvdWxkIG5vdCBjb25zdHJhaW4gcGVyaW9kIHNpemVcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMjYzLDE0ICsyNjMsMTQgQEAKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5zZXR1cF9tdXRleCk7Ci0Jc25kX3ByaW50ZGQoIjwtbHhfcGNtX29wZW4sICVkXG4iLCBlcnIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiPC1seF9wY21fb3BlbiwgJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBseF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJaW50IGVyciA9IDA7Ci0Jc25kX3ByaW50ZGQoIi0+bHhfcGNtX2Nsb3NlXG4iKTsKKwlkZXZfZGJnKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsICItPmx4X3BjbV9jbG9zZVxuIik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjg1LDEzICsyODUsMTMgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpseF9zdHJlYW0gPSBpc19jYXB0dXJlID8gJmNoaXAtPmNhcHR1cmVfc3RyZWFtIDoKIAkJJmNoaXAtPnBsYXliYWNrX3N0cmVhbTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9zdHJlYW1fcG9pbnRlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X3BjbV9zdHJlYW1fcG9pbnRlclxuIik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOwogCXBvcyA9IGx4X3N0cmVhbS0+ZnJhbWVfcG9zICogc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5sb2NrLCBmbGFncyk7CiAKLQlzbmRfcHJpbnRkZChMWFAgInN0cmVhbV9wb2ludGVyIGF0ICVsZFxuIiwgcG9zKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0cmVhbV9wb2ludGVyIGF0ICVsZFxuIiwgcG9zKTsKIAlyZXR1cm4gcG9zOwogfQogCkBAIC0zMDEsMzcgKzMwMSwzNyBAQAogCWludCBlcnIgPSAwOwogCWNvbnN0IGludCBpc19jYXB0dXJlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9wY21fcHJlcGFyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X3BjbV9wcmVwYXJlXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIAogCWlmIChjaGlwLT5oYXJkd2FyZV9ydW5uaW5nW2lzX2NhcHR1cmVdKSB7CiAJCWVyciA9IGx4X2hhcmR3YXJlX3N0b3AoY2hpcCwgc3Vic3RyZWFtKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJmYWlsZWQgdG8gc3RvcCBoYXJkd2FyZS4gIgorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmYWlsZWQgdG8gc3RvcCBoYXJkd2FyZS4gIgogCQkJCSAgICJFcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCQkJZ290byBleGl0OwogCQl9CiAKIAkJZXJyID0gbHhfaGFyZHdhcmVfY2xvc2UoY2hpcCwgc3Vic3RyZWFtKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJmYWlsZWQgdG8gY2xvc2UgaGFyZHdhcmUuICIKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIGNsb3NlIGhhcmR3YXJlLiAiCiAJCQkJICAgIkVycm9yIGNvZGUgJWRcbiIsIGVycik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAib3BlbmluZyBoYXJkd2FyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvcGVuaW5nIGhhcmR3YXJlXG4iKTsKIAllcnIgPSBseF9oYXJkd2FyZV9vcGVuKGNoaXAsIHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBvcGVuIGhhcmR3YXJlLiAiCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIG9wZW4gaGFyZHdhcmUuICIKIAkJCSAgICJFcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gbHhfaGFyZHdhcmVfc3RhcnQoY2hpcCwgc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiZmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlLiAiCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlLiAiCiAJCQkgICAiRXJyb3IgY29kZSAlZFxuIiwgZXJyKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTM1NCw3ICszNTQsNyBAQAogCXN0cnVjdCBseDY0NjRlcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgZXJyID0gMDsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV9od19wYXJhbXNcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9wY21faHdfcGFyYW1zXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNldHVwX211dGV4KTsKIApAQCAtMzg5LDIwICszODksMjAgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgaXNfY2FwdHVyZSA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfcGNtX2h3X2ZyZWVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9wY21faHdfZnJlZVxuIik7CiAJbXV0ZXhfbG9jaygmY2hpcC0+c2V0dXBfbXV0ZXgpOwogCiAJaWYgKGNoaXAtPmhhcmR3YXJlX3J1bm5pbmdbaXNfY2FwdHVyZV0pIHsKIAkJZXJyID0gbHhfaGFyZHdhcmVfc3RvcChjaGlwLCBzdWJzdHJlYW0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBzdG9wIGhhcmR3YXJlLiAiCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImZhaWxlZCB0byBzdG9wIGhhcmR3YXJlLiAiCiAJCQkJICAgIkVycm9yIGNvZGUgJWRcbiIsIGVycik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAogCQllcnIgPSBseF9oYXJkd2FyZV9jbG9zZShjaGlwLCBzdWJzdHJlYW0pOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgImZhaWxlZCB0byBjbG9zZSBoYXJkd2FyZS4gIgorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmYWlsZWQgdG8gY2xvc2UgaGFyZHdhcmUuICIKIAkJCQkgICAiRXJyb3IgY29kZSAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtNDQ2LDI1ICs0NDYsMjUgQEAKIAogCQllcnIgPSBseF9idWZmZXJfYXNrKGNoaXAsIDAsIGlzX2NhcHR1cmUsICZuZWVkZWQsICZmcmVlZCwKIAkJCQkgICAgc2l6ZV9hcnJheSk7Ci0JCXNuZF9wcmludGRkKExYUCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCiAJCQkgICAgbmVlZGVkLCBmcmVlZCk7CiAKIAkJZXJyID0gbHhfYnVmZmVyX2dpdmUoY2hpcCwgMCwgaXNfY2FwdHVyZSwgcGVyaW9kX2J5dGVzLAogCQkJCSAgICAgbG93ZXJfMzJfYml0cyhidWYpLCB1cHBlcl8zMl9iaXRzKGJ1ZiksCiAJCQkJICAgICAmYnVmZmVyX2luZGV4KTsKIAotCQlzbmRfcHJpbnRkZChMWFAgInN0YXJ0aW5nOiBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzdGFydGluZzogYnVmZmVyIGluZGV4ICV4IG9uIDB4JWx4ICglZCBieXRlcylcbiIsCiAJCQkgICAgYnVmZmVyX2luZGV4LCAodW5zaWduZWQgbG9uZylidWYsIHBlcmlvZF9ieXRlcyk7CiAJCWJ1ZiArPSBwZXJpb2RfYnl0ZXM7CiAJfQogCiAJZXJyID0gbHhfYnVmZmVyX2FzayhjaGlwLCAwLCBpc19jYXB0dXJlLCAmbmVlZGVkLCAmZnJlZWQsIHNpemVfYXJyYXkpOwotCXNuZF9wcmludGRkKExYUCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOwogCi0Jc25kX3ByaW50ZChMWFAgInN0YXJ0aW5nOiBzdGFydGluZyBzdHJlYW1cbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic3RhcnRpbmc6IHN0YXJ0aW5nIHN0cmVhbVxuIik7CiAJZXJyID0gbHhfc3RyZWFtX3N0YXJ0KGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY291bGRuJ3Qgc3RhcnQgc3RyZWFtXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJjb3VsZG4ndCBzdGFydCBzdHJlYW1cbiIpOwogCWVsc2UKIAkJbHhfc3RyZWFtLT5zdGF0dXMgPSBMWF9TVFJFQU1fU1RBVFVTX1JVTk5JTkc7CiAKQEAgLTQ3NiwxMCArNDc2LDEwIEBACiAJY29uc3QgdW5zaWduZWQgaW50IGlzX2NhcHR1cmUgPSBseF9zdHJlYW0tPmlzX2NhcHR1cmU7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGQoTFhQICJzdG9wcGluZzogc3RvcHBpbmcgc3RyZWFtXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInN0b3BwaW5nOiBzdG9wcGluZyBzdHJlYW1cbiIpOwogCWVyciA9IGx4X3N0cmVhbV9zdG9wKGNoaXAsIDAsIGlzX2NhcHR1cmUpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY291bGRuJ3Qgc3RvcCBzdHJlYW1cbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkbid0IHN0b3Agc3RyZWFtXG4iKTsKIAllbHNlCiAJCWx4X3N0cmVhbS0+c3RhdHVzID0gTFhfU1RSRUFNX1NUQVRVU19GUkVFOwogCkBAIC01MDcsNyArNTA3LDcgQEAKIAlzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXAgPSAoc3RydWN0IGx4NjQ2NGVzICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfdHJpZ2dlcl90YXNrbGV0XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdHJpZ2dlcl90YXNrbGV0XG4iKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CiAJbHhfdHJpZ2dlcl90YXNrbGV0X2Rpc3BhdGNoX3N0cmVhbShjaGlwLCAmY2hpcC0+Y2FwdHVyZV9zdHJlYW0pOwpAQCAtNTQ3LDE0ICs1NDcsMTQgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpzdHJlYW0gPSBpc19jYXB0dXJlID8gJmNoaXAtPmNhcHR1cmVfc3RyZWFtIDoKIAkJJmNoaXAtPnBsYXliYWNrX3N0cmVhbTsKIAotCXNuZF9wcmludGRkKCItPmx4X3BjbV90cmlnZ2VyXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfcGNtX3RyaWdnZXJcbiIpOwogCiAJcmV0dXJuIGx4X3BjbV90cmlnZ2VyX2Rpc3BhdGNoKGNoaXAsIHN0cmVhbSwgY21kKTsKIH0KIAogc3RhdGljIGludCBzbmRfbHg2NDY0ZXNfZnJlZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXApCiB7Ci0Jc25kX3ByaW50ZGQoIi0+c25kX2x4NjQ2NGVzX2ZyZWVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5zbmRfbHg2NDY0ZXNfZnJlZVxuIik7CiAKIAlseF9pcnFfZGlzYWJsZShjaGlwKTsKIApAQCAtNTgzLDcgKzU4Myw3IEBACiAJaW50IGk7CiAJdTMyIHBseF9yZWcgPSBseF9wbHhfcmVnX3JlYWQoY2hpcCwgZVBMWF9DSElQU0MpOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfaW5pdF94aWxpbnhfcmVzZXRcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pbml0X3hpbGlueF9yZXNldFxuIik7CiAKIAkvKiBhY3RpdmF0ZSByZXNldCBvZiB4aWxpbnggKi8KIAlwbHhfcmVnICY9IH5DSElQU0NfUkVTRVRfWElMSU5YOwpAQCAtNjAzLDggKzYwMyw4IEBACiAJCW1zbGVlcCgxMCk7CiAJCXJlZ19tYm94MyA9IGx4X3BseF9yZWdfcmVhZChjaGlwLCBlUExYX01CT1gzKTsKIAkJaWYgKHJlZ19tYm94MykgewotCQkJc25kX3ByaW50ZChMWFAgInhpbGlueCByZXNldCBkb25lXG4iKTsKLQkJCXNuZF9wcmludGRkKExYUCAieGlsaW54IHRvb2sgJWQgbG9vcHNcbiIsIGkpOworCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ4aWxpbnggcmVzZXQgZG9uZVxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInhpbGlueCB0b29rICVkIGxvb3BzXG4iLCBpKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNjI0LDcgKzYyNCw3IEBACiB7CiAJdTMyIHJlZzsKIAotCXNuZF9wcmludGRkKCItPmx4X2luaXRfeGlsaW54X3Rlc3RcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pbml0X3hpbGlueF90ZXN0XG4iKTsKIAogCS8qIFRFU1QgaWYgd2UgaGF2ZSBhY2Nlc3MgdG8gWGlsaW54L01pY3JvQmxhemUgKi8KIAlseF9kc3BfcmVnX3dyaXRlKGNoaXAsIGVSZWdfQ1NNLCAwKTsKQEAgLTYzMiwxOSArNjMyLDE5IEBACiAJcmVnID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NNKTsKIAogCWlmIChyZWcpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIlByb2JsZW06IFJlZ19DU00gJXguXG4iLCByZWcpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgIlByb2JsZW06IFJlZ19DU00gJXguXG4iLCByZWcpOwogCiAJCS8qIFBDSTkwNTZfU1BBQ0UwX1JFTUFQICovCiAJCWx4X3BseF9yZWdfd3JpdGUoY2hpcCwgZVBMWF9QQ0lDUiwgMSk7CiAKIAkJcmVnID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NNKTsKIAkJaWYgKHJlZykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIkVycm9yOiBSZWdfQ1NNICV4LlxuIiwgcmVnKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRXJyb3I6IFJlZ19DU00gJXguXG4iLCByZWcpOwogCQkJcmV0dXJuIC1FQUdBSU47IC8qIHNlZW1zIHRvIGJlIGFwcHJvcHJpYXRlICovCiAJCX0KIAl9CiAKLQlzbmRfcHJpbnRkKExYUCAiWGlsaW54L01pY3JvQmxhemUgYWNjZXNzIHRlc3Qgc3VjY2Vzc2Z1bFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJYaWxpbngvTWljcm9CbGF6ZSBhY2Nlc3MgdGVzdCBzdWNjZXNzZnVsXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjYxLDcgKzY2MSw3IEBACiAJCSg2NCA8PCBJT0NSX09VVFBVVFNfT0ZGU0VUKSB8CiAJCShGUkVRX1JBVElPX1NJTkdMRV9NT0RFIDw8IEZSRVFfUkFUSU9fT0ZGU0VUKTsKIAotCXNuZF9wcmludGRkKCItPmx4X2luaXRfZXRoZXJzb3VuZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2luaXRfZXRoZXJzb3VuZFxuIik7CiAKIAljaGlwLT5mcmVxX3JhdGlvID0gRlJFUV9SQVRJT19TSU5HTEVfTU9ERTsKIApAQCAtNjc1LDE4ICs2NzUsMTggQEAKIAogCWZvciAoaSA9IDA7IGkgIT0gMTAwMDsgKytpKSB7CiAJCWlmIChseF9kc3BfcmVnX3JlYWQoY2hpcCwgZVJlZ19DU0VTKSAmIDQpIHsKLQkJCXNuZF9wcmludGQoTFhQICJldGhlcnNvdW5kIGluaXRpYWxpemVkIGFmdGVyICVkbXNcbiIsCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImV0aGVyc291bmQgaW5pdGlhbGl6ZWQgYWZ0ZXIgJWRtc1xuIiwKIAkJCQkgICBpKTsKIAkJCWdvdG8gZXRoZXJzb3VuZF9pbml0aWFsaXplZDsKIAkJfQogCQltc2xlZXAoMSk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUAorCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKIAkJICAgImV0aGVyc291bmQgY291bGQgbm90IGJlIGluaXRpYWxpemVkIGFmdGVyICVkbXNcbiIsIGkpOwogCXJldHVybiAtRVRJTUVET1VUOwogCiAgZXRoZXJzb3VuZF9pbml0aWFsaXplZDoKLQlzbmRfcHJpbnRkKExYUCAiZXRoZXJzb3VuZCBpbml0aWFsaXplZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJldGhlcnNvdW5kIGluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjk2LDE0ICs2OTYsMTQgQEAKIAogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9pbml0X2dldF92ZXJzaW9uX2ZlYXR1cmVzXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfaW5pdF9nZXRfdmVyc2lvbl9mZWF0dXJlc1xuIik7CiAKIAllcnIgPSBseF9kc3BfZ2V0X3ZlcnNpb24oY2hpcCwgJmRzcF92ZXJzaW9uKTsKIAogCWlmIChlcnIgPT0gMCkgewogCQl1MzIgZnJlcTsKIAotCQlzbmRfcHJpbnRrKExYUCAiRFNQIHZlcnNpb246IFYlMDJkLiUwMmQgIyVkXG4iLAorCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJEU1AgdmVyc2lvbjogViUwMmQuJTAyZCAjJWRcbiIsCiAJCQkgICAoZHNwX3ZlcnNpb24+PjE2KSAmIDB4ZmYsIChkc3BfdmVyc2lvbj4+OCkgJiAweGZmLAogCQkJICAgZHNwX3ZlcnNpb24gJiAweGZmKTsKIApAQCAtNzE4LDkgKzcxOCw5IEBACiAJCWVyciA9IGx4X2RzcF9nZXRfY2xvY2tfZnJlcXVlbmN5KGNoaXAsICZmcmVxKTsKIAkJaWYgKGVyciA9PSAwKQogCQkJY2hpcC0+Ym9hcmRfc2FtcGxlX3JhdGUgPSBmcmVxOwotCQlzbmRfcHJpbnRkKExYUCAiYWN0dWFsIGNsb2NrIGZyZXF1ZW5jeSAlZFxuIiwgZnJlcSk7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiYWN0dWFsIGNsb2NrIGZyZXF1ZW5jeSAlZFxuIiwgZnJlcSk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAgIkRTUCBjb3JydXB0ZWQgXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJEU1AgY29ycnVwdGVkIFxuIik7CiAJCWVyciA9IC1FQUdBSU47CiAJfQogCkBAIC03MzIsNyArNzMyLDcgQEAKIAlpbnQgZXJyID0gMDsKIAl1MzIgc25hcHBlZF9ncmFuID0gTUlDUk9CTEFaRV9JQkxfTUlOOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfc2V0X2dyYW51bGFyaXR5XG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfc2V0X2dyYW51bGFyaXR5XG4iKTsKIAogCS8qIGJsb2Nrc2l6ZSBpcyBhIHBvd2VyIG9mIDIgKi8KIAl3aGlsZSAoKHNuYXBwZWRfZ3JhbiA8IGdyYW4pICYmCkBAIC03NDUsMTQgKzc0NSwxNCBAQAogCiAJZXJyID0gbHhfZHNwX3NldF9ncmFudWxhcml0eShjaGlwLCBzbmFwcGVkX2dyYW4pOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiY291bGQgbm90IHNldCBncmFudWxhcml0eVxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBzZXQgZ3JhbnVsYXJpdHlcbiIpOwogCQllcnIgPSAtRUFHQUlOOwogCX0KIAogCWlmIChzbmFwcGVkX2dyYW4gIT0gZ3JhbikKLQkJc25kX3ByaW50ayhMWFAgInNuYXBwZWQgYmxvY2tzaXplIHRvICVkXG4iLCBzbmFwcGVkX2dyYW4pOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInNuYXBwZWQgYmxvY2tzaXplIHRvICVkXG4iLCBzbmFwcGVkX2dyYW4pOwogCi0Jc25kX3ByaW50ZChMWFAgInNldCBibG9ja3NpemUgb24gYm9hcmQgJWRcbiIsIHNuYXBwZWRfZ3Jhbik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzZXQgYmxvY2tzaXplIG9uIGJvYXJkICVkXG4iLCBzbmFwcGVkX2dyYW4pOwogCWNoaXAtPnBjbV9ncmFudWxhcml0eSA9IHNuYXBwZWRfZ3JhbjsKIAogCXJldHVybiBlcnI7CkBAIC03NjQsMTkgKzc2NCwxOSBAQAogCWludCBlcnI7CiAJaW50IGk7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF9pbml0X2RzcFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2luaXRfZHNwXG4iKTsKIAotCXNuZF9wcmludGQoTFhQICJpbml0aWFsaXplIGJvYXJkXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImluaXRpYWxpemUgYm9hcmRcbiIpOwogCWVyciA9IGx4X2luaXRfeGlsaW54X3Jlc2V0KGNoaXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkKExYUCAidGVzdGluZyBib2FyZFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJ0ZXN0aW5nIGJvYXJkXG4iKTsKIAllcnIgPSBseF9pbml0X3hpbGlueF90ZXN0KGNoaXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkKExYUCAiaW5pdGlhbGl6ZSBldGhlcnNvdW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW5pdGlhbGl6ZSBldGhlcnNvdW5kIGNvbmZpZ3VyYXRpb25cbiIpOwogCWVyciA9IGx4X2luaXRfZXRoZXJzb3VuZF9jb25maWcoY2hpcCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTc5Nyw4ICs3OTcsOSBAQAogCXJldHVybiAtRVRJTUVET1VUOwogCiBtYWNfcmVhZHk6Ci0Jc25kX3ByaW50ZChMWFAgIm1hYyBhZGRyZXNzIHJlYWR5IHJlYWQgYWZ0ZXI6ICVkbXNcbiIsIGkpOwotCXNuZF9wcmludGsoTFhQICJtYWMgYWRkcmVzczogJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYLiUwMlhcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJtYWMgYWRkcmVzcyByZWFkeSByZWFkIGFmdGVyOiAlZG1zXG4iLCBpKTsKKwlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCSAibWFjIGFkZHJlc3M6ICUwMlguJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYXG4iLAogCQkgICBjaGlwLT5tYWNfYWRkcmVzc1swXSwgY2hpcC0+bWFjX2FkZHJlc3NbMV0sIGNoaXAtPm1hY19hZGRyZXNzWzJdLAogCQkgICBjaGlwLT5tYWNfYWRkcmVzc1szXSwgY2hpcC0+bWFjX2FkZHJlc3NbNF0sIGNoaXAtPm1hY19hZGRyZXNzWzVdKTsKIApAQCAtOTc3LDcgKzk3OCw3IEBACiAJCS5kZXZfZnJlZSA9IHNuZF9seDY0NjRlc19kZXZfZnJlZSwKIAl9OwogCi0Jc25kX3ByaW50ZGQoIi0+c25kX2x4NjQ2NGVzX2NyZWF0ZVxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICItPnNuZF9seDY0NjRlc19jcmVhdGVcbiIpOwogCiAJKnJjaGlwID0gTlVMTDsKIApAQCAtOTkxLDggKzk5Miw4IEBACiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgIjMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xMDM0LDcgKzEwMzUsNyBAQAogCWVyciA9IHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBseF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gcmVxdWVzdF9pcnFfZmFpbGVkOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKQEAgLTEwNDUsNyArMTA0Niw3IEBACiAKIAllcnIgPSBseF9pbml0X2RzcChjaGlwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiZXJyb3IgZHVyaW5nIERTUCBpbml0aWFsaXphdGlvblxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgZHVyaW5nIERTUCBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMDYyLDggKzEwNjMsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIApAQCAtMTA5MCw3ICsxMDg5LDcgQEAKIAlzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXA7CiAJaW50IGVycjsKIAotCXNuZF9wcmludGRkKCItPnNuZF9seDY0NjRlc19wcm9iZVxuIik7CisJZGV2X2RiZygmcGNpLT5kZXYsICItPnNuZF9seDY0NjRlc19wcm9iZVxuIik7CiAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEwOTksMTMgKzEwOTgsMTQgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAllcnIgPSBzbmRfbHg2NDY0ZXNfY3JlYXRlKGNhcmQsIHBjaSwgJmNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJlcnJvciBkdXJpbmcgc25kX2x4NjQ2NGVzX2NyZWF0ZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiZXJyb3IgZHVyaW5nIHNuZF9seDY0NjRlc19jcmVhdGVcbiIpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIApAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNuZF9wcmludGRkKExYUCAiaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bFxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsXG4iKTsKIAlwY2lfc2V0X2RydmRhdGEocGNpLCBjYXJkKTsKIAlkZXYrKzsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHhfY29yZS5jCmluZGV4IDYyNmVjYWQuLjJkOGU5NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMKKysrIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4X2NvcmUuYwpAQCAtMTQxLDYzICsxNDEsNiBAQAogCWlvd3JpdGUzMihkYXRhLCBhZGRyZXNzKTsKIH0KIAotdTMyIGx4X3BseF9tYm94X3JlYWQoc3RydWN0IGx4NjQ2NGVzICpjaGlwLCBpbnQgbWJveF9ucikKLXsKLQlpbnQgaW5kZXg7Ci0KLQlzd2l0Y2ggKG1ib3hfbnIpIHsKLQljYXNlIDE6Ci0JCWluZGV4ID0gZVBMWF9NQk9YMTsgICAgYnJlYWs7Ci0JY2FzZSAyOgotCQlpbmRleCA9IGVQTFhfTUJPWDI7ICAgIGJyZWFrOwotCWNhc2UgMzoKLQkJaW5kZXggPSBlUExYX01CT1gzOyAgICBicmVhazsKLQljYXNlIDQ6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNDsgICAgYnJlYWs7Ci0JY2FzZSA1OgotCQlpbmRleCA9IGVQTFhfTUJPWDU7ICAgIGJyZWFrOwotCWNhc2UgNjoKLQkJaW5kZXggPSBlUExYX01CT1g2OyAgICBicmVhazsKLQljYXNlIDc6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNzsgICAgYnJlYWs7Ci0JY2FzZSAwOgkJCS8qIHJlc2VydmVkIGZvciBIRiBmbGFncyAqLwotCQlzbmRfQlVHKCk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDB4ZGVhZGJlZWY7Ci0JfQotCi0JcmV0dXJuIGx4X3BseF9yZWdfcmVhZChjaGlwLCBpbmRleCk7Ci19Ci0KLWludCBseF9wbHhfbWJveF93cml0ZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXAsIGludCBtYm94X25yLCB1MzIgdmFsdWUpCi17Ci0JaW50IGluZGV4ID0gLTE7Ci0KLQlzd2l0Y2ggKG1ib3hfbnIpIHsKLQljYXNlIDE6Ci0JCWluZGV4ID0gZVBMWF9NQk9YMTsgICAgYnJlYWs7Ci0JY2FzZSAzOgotCQlpbmRleCA9IGVQTFhfTUJPWDM7ICAgIGJyZWFrOwotCWNhc2UgNDoKLQkJaW5kZXggPSBlUExYX01CT1g0OyAgICBicmVhazsKLQljYXNlIDU6Ci0JCWluZGV4ID0gZVBMWF9NQk9YNTsgICAgYnJlYWs7Ci0JY2FzZSA2OgotCQlpbmRleCA9IGVQTFhfTUJPWDY7ICAgIGJyZWFrOwotCWNhc2UgNzoKLQkJaW5kZXggPSBlUExYX01CT1g3OyAgICBicmVhazsKLQljYXNlIDA6CQkJLyogcmVzZXJ2ZWQgZm9yIEhGIGZsYWdzICovCi0JY2FzZSAyOgkJCS8qIHJlc2VydmVkIGZvciBQaXBlIFN0YXRlcwotCQkJCSAqIHRoZSBEU1Aga2VlcHMgYW4gaW1hZ2Ugb2YgaXQgKi8KLQkJc25kX0JVRygpOwotCQlyZXR1cm4gLUVCQURSUUM7Ci0JfQotCi0JbHhfcGx4X3JlZ193cml0ZShjaGlwLCBpbmRleCwgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi0KIC8qIHJtaCAqLwogCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwpAQCAtMzMwLDcgKzI3Myw3IEBACiAJaW50IGR3bG9vcDsKIAogCWlmIChseF9kc3BfcmVnX3JlYWQoY2hpcCwgZVJlZ19DU00pICYgKFJlZ19DU01fTUMgfCBSZWdfQ1NNX01SKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiUElPU2VuZE1lc3NhZ2UgZVJlZ19DU00gJXhcbiIsIHJlZyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiUElPU2VuZE1lc3NhZ2UgZVJlZ19DU00gJXhcbiIsIHJlZyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0zNTEsNyArMjk0LDcgQEAKIAkJfSBlbHNlCiAJCQl1ZGVsYXkoMSk7CiAJfQotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAiVElNRU9VVCBseF9tZXNzYWdlX3NlbmRfYXRvbWljISAiCisJZGV2X3dhcm4oY2hpcC0+Y2FyZC0+ZGV2LCAiVElNRU9VVCBseF9tZXNzYWdlX3NlbmRfYXRvbWljISAiCiAJCSAgICJwb2xsaW5nIGZhaWxlZFxuIik7CiAKIHBvbGxpbmdfc3VjY2Vzc2Z1bDoKQEAgLTM2MywxOCArMzA2LDE4IEBACiAJCQkJCSAgIHJtaC0+c3RhdF9sZW4pOwogCQl9CiAJfSBlbHNlCi0JCXNuZF9wcmludGsoTFhQICJybWggZXJyb3I6ICUwOHhcbiIsIHJlZyk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAicm1oIGVycm9yOiAlMDh4XG4iLCByZWcpOwogCiAJLyogY2xlYXIgUmVnX0NTTV9NUiAqLwogCWx4X2RzcF9yZWdfd3JpdGUoY2hpcCwgZVJlZ19DU00sIDApOwogCiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIEVEX0RTUF9USU1FRF9PVVQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAibHhfbWVzc2FnZV9zZW5kOiBkc3AgdGltZW91dFxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImx4X21lc3NhZ2Vfc2VuZDogZHNwIHRpbWVvdXRcbiIpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAogCWNhc2UgRURfRFNQX0NSQVNIRUQ6Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HIExYUCAibHhfbWVzc2FnZV9zZW5kOiBkc3AgY3Jhc2hlZFxuIik7CisJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwgImx4X21lc3NhZ2Vfc2VuZDogZHNwIGNyYXNoZWRcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTQ5MSwzMyArNDM0LDYgQEAKICNkZWZpbmUgQ1NFU19CUk9BRENBU1QgICAgICAweDAwMDIKICNkZWZpbmUgQ1NFU19VUERBVEVfTERTViAgICAweDAwMDQKIAotaW50IGx4X2RzcF9lc19jaGVja19waXBlbGluZShzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXApCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpICE9IENTRVNfVElNRU9VVDsgKytpKSB7Ci0JCS8qCi0JCSAqIGxlIGJpdCBDU0VTX1VQREFURV9MRFNWIGVzdCDDg8KgIDEgZMODwqlzIHF1ZSBsZSBtYWNwcm9nCi0JCSAqIGVzdCBwcmV0LiBpbCByZS1wYXNzZSDDg8KgIDAgbG9yc3F1ZSBsZSBwcmVtaWVyIHJlYWQgYQotCQkgKiDDg8KpdMODwqkgZmFpdC4gcG91ciBsJ2luc3RhbnQgb24gcmV0aXJlIGxlIHRlc3QgY2FyIGNlIGJpdAotCQkgKiBwYXNzZSBhIDEgZW52aXJvbiAyMDAgw4PCoCA0MDAgbXMgYXByw4PCqXMgcXVlIGxlIHJlZ2lzdHJlCi0JCSAqIGNvbmZFUyDDg8KgIMODwql0w4PCqSDDg8KpY3JpdCAoa2ljayBkdSB4aWxpbnggRVMpLgotCQkgKgotCQkgKiBPbiBuZSB0ZXN0ZSBxdWUgbGUgYml0IENFLgotCQkgKiAqLwotCi0JCXUzMiBjc2VzID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQ1NFUyk7Ci0KLQkJaWYgKChjc2VzICYgQ1NFU19DRSkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLQotCiAjZGVmaW5lIFBJUEVfSU5GT19UT19DTUQoY2FwdHVyZSwgcGlwZSkJCQkJCVwKIAkoKHUzMikoKHUzMikocGlwZSkgfCAoKGNhcHR1cmUpID8gSURfSVNfQ0FQVFVSRSA6IDBMKSkgPDwgSURfT0ZGU0VUKQogCkBAIC01NDIsNyArNDU4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5tc2dfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGVyciAhPSAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJseDY0NjRlczogY291bGQgbm90IGFsbG9jYXRlIHBpcGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBwaXBlXG4iKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC02MDQsMTEgKzUyMCwxMyBAQAogCQl9CiAKICNpZiAwCi0JCXNuZF9wcmludGRkKExYUCAiQ01EXzA4X0FTS19CVUZGRVJTOiBuZWVkZWQgJWQsIGZyZWVkICVkXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJDTURfMDhfQVNLX0JVRkZFUlM6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsCiAJCQkgICAgKnJfbmVlZGVkLCAqcl9mcmVlZCk7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNX0JVRkZFUjsgKytpKSB7CiAJCQlmb3IgKGkgPSAwOyBpICE9IGNoaXAtPnJtaC5zdGF0X2xlbjsgKytpKQotCQkJCXNuZF9wcmludGRkKCIgIHN0YXRbJWRdOiAleCwgJXhcbiIsIGksCisJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSIgIHN0YXRbJWRdOiAleCwgJXhcbiIsIGksCiAJCQkJCSAgICBjaGlwLT5ybWguc3RhdFtpXSwKIAkJCQkJICAgIGNoaXAtPnJtaC5zdGF0W2ldICYgTUFTS19EQVRBX1NJWkUpOwogCQl9CkBAIC03MDEsOCArNjE5LDggQEAKIAllcnIgPSBseF9tZXNzYWdlX3NlbmRfYXRvbWljKGNoaXAsICZjaGlwLT5ybWgpOyAvKiBkb24ndCBzbGVlcCEgKi8KIAogCWlmIChlcnIgIT0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJICAgImx4NjQ2NGVzOiBjb3VsZCBub3QgcXVlcnkgcGlwZSdzIHNhbXBsZSBjb3VudFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc2FtcGxlIGNvdW50XG4iKTsKIAllbHNlIHsKIAkJKnJzYW1wbGVfY291bnQgPSAoKHU2NCkoY2hpcC0+cm1oLnN0YXRbMF0gJiBNQVNLX1NQTF9DT1VOVF9ISSkKIAkJCQkgIDw8IDI0KSAgICAgLyogaGkgcGFydCAqLwpAQCAtNzI4LDcgKzY0Niw3IEBACiAJZXJyID0gbHhfbWVzc2FnZV9zZW5kX2F0b21pYyhjaGlwLCAmY2hpcC0+cm1oKTsKIAogCWlmIChlcnIgIT0gMCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAibHg2NDY0ZXM6IGNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc3RhdGVcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvdWxkIG5vdCBxdWVyeSBwaXBlJ3Mgc3RhdGVcbiIpOwogCWVsc2UKIAkJKnJzdGF0ZSA9IChjaGlwLT5ybWguc3RhdFswXSA+PiBQU1RBVEVfT0ZGU0VUKSAmIDB4MEY7CiAKQEAgLTgwMSw3ICs3MTksNyBAQAogCXUzMiBjaGFubmVscyA9IHJ1bnRpbWUtPmNoYW5uZWxzOwogCiAJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzICE9IGNoYW5uZWxzKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIExYUCAiY2hhbm5lbCBjb3VudCBtaXNtYXRjaDogJWQgdnMgJWQiLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNoYW5uZWwgY291bnQgbWlzbWF0Y2g6ICVkIHZzICVkIiwKIAkJCSAgIHJ1bnRpbWUtPmNoYW5uZWxzLCBjaGFubmVscyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bXNnX2xvY2ssIGZsYWdzKTsKQEAgLTkwNCwxMyArODIyLDE2IEBACiAJfQogCiAJaWYgKGVyciA9PSBFQl9SQlVGRkVSU19UQUJMRV9PVkVSRkxPVykKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX1JCVUZGRVJTX1RBQkxFX09WRVJGTE9XXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfUkJVRkZFUlNfVEFCTEVfT1ZFUkZMT1dcbiIpOwogCiAJaWYgKGVyciA9PSBFQl9JTlZBTElEX1NUUkVBTSkKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX0lOVkFMSURfU1RSRUFNXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfSU5WQUxJRF9TVFJFQU1cbiIpOwogCiAJaWYgKGVyciA9PSBFQl9DTURfUkVGVVNFRCkKLQkJc25kX3ByaW50ayhMWFAgImx4X2J1ZmZlcl9naXZlIEVCX0NNRF9SRUZVU0VEXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibHhfYnVmZmVyX2dpdmUgRUJfQ01EX1JFRlVTRURcbiIpOwogCiAgZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5tc2dfbG9jaywgZmxhZ3MpOwpAQCAtOTgzLDcgKzkwNCw4IEBACiAJY2hpcC0+cm1oLmNtZFsxXSA9ICh1MzIpKG11dGVfbWFzayA+PiAodTY0KTMyKTsJICAgICAgIC8qIGhpIHBhcnQgKi8KIAljaGlwLT5ybWguY21kWzJdID0gKHUzMikobXV0ZV9tYXNrICYgKHU2NCkweEZGRkZGRkZGKTsgLyogbG8gcGFydCAqLwogCi0Jc25kX3ByaW50aygibXV0ZSAleCAleCAleFxuIiwgY2hpcC0+cm1oLmNtZFswXSwgY2hpcC0+cm1oLmNtZFsxXSwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJIm11dGUgJXggJXggJXhcbiIsIGNoaXAtPnJtaC5jbWRbMF0sIGNoaXAtPnJtaC5jbWRbMV0sCiAJCSAgIGNoaXAtPnJtaC5jbWRbMl0pOwogCiAJZXJyID0gbHhfbWVzc2FnZV9zZW5kX2F0b21pYyhjaGlwLCAmY2hpcC0+cm1oKTsKQEAgLTEwOTMsNyArMTAxNSw3IEBACiAJfQogCiAJaWYgKGlycV9hc3luYykgewotCQkvKiBzbmRfcHJpbnRkKCJpbnRlcnJ1cHQ6IGFzeW5jIGV2ZW50IHBlbmRpbmdcbiIpOyAqLworCQkvKiBkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogYXN5bmMgZXZlbnQgcGVuZGluZ1xuIik7ICovCiAJCSpyX2FzeW5jX3BlbmRpbmcgPSAxOwogCX0KIApAQCAtMTEzOSwxMyArMTA2MSwxMyBAQAogCWlmIChlYl9wZW5kaW5nX2luKSB7CiAJCSpyX25vdGlmaWVkX2luX3BpcGVfbWFzayA9ICgodTY0KXN0YXRbM10gPDwgMzIpCiAJCQkrIHN0YXRbNF07Ci0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBFT0JJIHBlbmRpbmcgJWxseFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IEVPQkkgcGVuZGluZyAlbGx4XG4iLAogCQkJICAgICpyX25vdGlmaWVkX2luX3BpcGVfbWFzayk7CiAJfQogCWlmIChlYl9wZW5kaW5nX291dCkgewogCQkqcl9ub3RpZmllZF9vdXRfcGlwZV9tYXNrID0gKCh1NjQpc3RhdFsxXSA8PCAzMikKIAkJCSsgc3RhdFsyXTsKLQkJc25kX3ByaW50ZGQoTFhQICJpbnRlcnJ1cHQ6IEVPQk8gcGVuZGluZyAlbGx4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogRU9CTyBwZW5kaW5nICVsbHhcbiIsCiAJCQkgICAgKnJfbm90aWZpZWRfb3V0X3BpcGVfbWFzayk7CiAJfQogCkBAIC0xMTgxLDE3ICsxMTAzLDE5IEBACiAJdTMyIG5lZWRlZCwgZnJlZWQ7CiAJdTMyIHNpemVfYXJyYXlbTUFYX1NUUkVBTV9CVUZGRVJdOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfaW50ZXJydXB0X3JlcXVlc3RfbmV3X2J1ZmZlclxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2ludGVycnVwdF9yZXF1ZXN0X25ld19idWZmZXJcbiIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKIAogCWVyciA9IGx4X2J1ZmZlcl9hc2soY2hpcCwgMCwgaXNfY2FwdHVyZSwgJm5lZWRlZCwgJmZyZWVkLCBzaXplX2FycmF5KTsKLQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogbmVlZGVkICVkLCBmcmVlZCAlZFxuIiwgbmVlZGVkLCBmcmVlZCk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJpbnRlcnJ1cHQ6IG5lZWRlZCAlZCwgZnJlZWQgJWRcbiIsIG5lZWRlZCwgZnJlZWQpOwogCiAJdW5wYWNrX3BvaW50ZXIoYnVmLCAmYnVmX2xvLCAmYnVmX2hpKTsKIAllcnIgPSBseF9idWZmZXJfZ2l2ZShjaGlwLCAwLCBpc19jYXB0dXJlLCBwZXJpb2RfYnl0ZXMsIGJ1Zl9sbywgYnVmX2hpLAogCQkJICAgICAmYnVmZmVyX2luZGV4KTsKLQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogZ2F2ZSBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJImludGVycnVwdDogZ2F2ZSBidWZmZXIgaW5kZXggJXggb24gMHglbHggKCVkIGJ5dGVzKVxuIiwKIAkJICAgIGJ1ZmZlcl9pbmRleCwgKHVuc2lnbmVkIGxvbmcpYnVmLCBwZXJpb2RfYnl0ZXMpOwogCiAJbHhfc3RyZWFtLT5mcmFtZV9wb3MgPSBuZXh0X3BvczsKQEAgLTEyMDYsMTEgKzExMzAsMTEgQEAKIAlzdHJ1Y3QgbHhfc3RyZWFtICpseF9zdHJlYW0gPSAmY2hpcC0+cGxheWJhY2tfc3RyZWFtOwogCWludCBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiLT5seF90YXNrbGV0X3BsYXliYWNrXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdGFza2xldF9wbGF5YmFja1xuIik7CiAKIAllcnIgPSBseF9pbnRlcnJ1cHRfcmVxdWVzdF9uZXdfYnVmZmVyKGNoaXAsIGx4X3N0cmVhbSk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNhbm5vdCByZXF1ZXN0IG5ldyBidWZmZXIgZm9yIHBsYXliYWNrXG4iKTsKIAogCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQobHhfc3RyZWFtLT5zdHJlYW0pOwpAQCAtMTIyMiwxMCArMTE0NiwxMCBAQAogCXN0cnVjdCBseF9zdHJlYW0gKmx4X3N0cmVhbSA9ICZjaGlwLT5jYXB0dXJlX3N0cmVhbTsKIAlpbnQgZXJyOwogCi0Jc25kX3ByaW50ZGQoIi0+bHhfdGFza2xldF9jYXB0dXJlXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIi0+bHhfdGFza2xldF9jYXB0dXJlXG4iKTsKIAllcnIgPSBseF9pbnRlcnJ1cHRfcmVxdWVzdF9uZXdfYnVmZmVyKGNoaXAsIGx4X3N0cmVhbSk7CiAJaWYgKGVyciA8IDApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgImNhbm5vdCByZXF1ZXN0IG5ldyBidWZmZXIgZm9yIGNhcHR1cmVcbiIpOwogCiAJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChseF9zdHJlYW0tPnN0cmVhbSk7CkBAIC0xMjQwLDEyICsxMTY0LDE0IEBACiAJaW50IGVyciA9IDA7CiAKIAlpZiAobm90aWZpZWRfaW5fcGlwZV9tYXNrKSB7Ci0JCXNuZF9wcmludGRkKExYUCAicmVxdWVzdGluZyBhdWRpbyB0cmFuc2ZlciBmb3IgY2FwdHVyZVxuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInJlcXVlc3RpbmcgYXVkaW8gdHJhbnNmZXIgZm9yIGNhcHR1cmVcbiIpOwogCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjaGlwLT50YXNrbGV0X2NhcHR1cmUpOwogCX0KIAogCWlmIChub3RpZmllZF9vdXRfcGlwZV9tYXNrKSB7Ci0JCXNuZF9wcmludGRkKExYUCAicmVxdWVzdGluZyBhdWRpbyB0cmFuc2ZlciBmb3IgcGxheWJhY2tcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJyZXF1ZXN0aW5nIGF1ZGlvIHRyYW5zZmVyIGZvciBwbGF5YmFja1xuIik7CiAJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmNoaXAtPnRhc2tsZXRfcGxheWJhY2spOwogCX0KIApAQCAtMTI2MSwxMSArMTE4NywxMiBAQAogCiAJc3Bpbl9sb2NrKCZjaGlwLT5sb2NrKTsKIAotCXNuZF9wcmludGRkKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAKIAlpZiAoIWx4X2ludGVycnVwdF9hY2soY2hpcCwgJmlycXNyYywgJmFzeW5jX3BlbmRpbmcsICZhc3luY19lc2NtZCkpIHsKIAkJc3Bpbl91bmxvY2soJmNoaXAtPmxvY2spOwotCQlzbmRfcHJpbnRkZCgiSVJRX05PTkVcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIklSUV9OT05FXG4iKTsKIAkJcmV0dXJuIElSUV9OT05FOyAvKiB0aGlzIGRldmljZSBkaWQgbm90IGNhdXNlIHRoZSBpbnRlcnJ1cHQgKi8KIAl9CiAKQEAgLTEyNzQsMTYgKzEyMDEsMTYgQEAKIAogI2lmIDAKIAlpZiAoaXJxc3JjICYgTUFTS19TWVNfU1RBVFVTX0VPQkkpCi0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBFT0JJXG4iKTsKKwkJZGV2X2RnZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IEVPQklcbiIpOwogCiAJaWYgKGlycXNyYyAmIE1BU0tfU1lTX1NUQVRVU19FT0JPKQotCQlzbmRfcHJpbnRkZChMWFAgImludGVycnVwdDogRU9CT1xuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0OiBFT0JPXG4iKTsKIAogCWlmIChpcnFzcmMgJiBNQVNLX1NZU19TVEFUVVNfVVJVTikKLQkJc25kX3ByaW50ZGQoTFhQICJpbnRlcnJ1cHQ6IFVSVU5cbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImludGVycnVwdDogVVJVTlxuIik7CiAKIAlpZiAoaXJxc3JjICYgTUFTS19TWVNfU1RBVFVTX09SVU4pCi0JCXNuZF9wcmludGRkKExYUCAiaW50ZXJydXB0OiBPUlVOXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJpbnRlcnJ1cHQ6IE9SVU5cbiIpOwogI2VuZGlmCiAKIAlpZiAoYXN5bmNfcGVuZGluZykgewpAQCAtMTI5OCw3ICsxMjI1LDcgQEAKIAkJCQkJCSAgICAgICAmbm90aWZpZWRfaW5fcGlwZV9tYXNrLAogCQkJCQkJICAgICAgICZub3RpZmllZF9vdXRfcGlwZV9tYXNrKTsKIAkJaWYgKGVycikKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQCisJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKIAkJCQkgICAiZXJyb3IgaGFuZGxpbmcgYXN5bmMgZXZlbnRzXG4iKTsKIAogCQllcnIgPSBseF9pbnRlcnJ1cHRfaGFuZGxlX2F1ZGlvX3RyYW5zZmVyKGNoaXAsCkBAIC0xMzA2LDcgKzEyMzMsNyBAQAogCQkJCQkJCSBub3RpZmllZF9vdXRfcGlwZV9tYXNrCiAJCQkpOwogCQlpZiAoZXJyKQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBMWFAKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJCSAgICJlcnJvciBkdXJpbmcgYXVkaW8gdHJhbnNmZXJcbiIpOwogCX0KIApAQCAtMTMxOCw3ICsxMjQ1LDcgQEAKIAkJICoKIAkJICogKi8KIAotCQlzbmRfcHJpbnRkZCgibHg2NDY0ZXM6IGludGVycnVwdCByZXF1ZXN0cyBlc2NtZCBoYW5kbGluZ1xuIik7CisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiaW50ZXJydXB0IHJlcXVlc3RzIGVzY21kIGhhbmRsaW5nXG4iKTsKICNlbmRpZgogCX0KIApAQCAtMTM0NiwxMiArMTI3MywxMiBAQAogCiB2b2lkIGx4X2lycV9lbmFibGUoc3RydWN0IGx4NjQ2NGVzICpjaGlwKQogewotCXNuZF9wcmludGRkKCItPmx4X2lycV9lbmFibGVcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiLT5seF9pcnFfZW5hYmxlXG4iKTsKIAlseF9pcnFfc2V0KGNoaXAsIDEpOwogfQogCiB2b2lkIGx4X2lycV9kaXNhYmxlKHN0cnVjdCBseDY0NjRlcyAqY2hpcCkKIHsKLQlzbmRfcHJpbnRkZCgiLT5seF9pcnFfZGlzYWJsZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICItPmx4X2lycV9kaXNhYmxlXG4iKTsKIAlseF9pcnFfc2V0KGNoaXAsIDApOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21hZXN0cm8zLmMgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwppbmRleCBkNTQxNzM2Li4wZDNlYTNlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWFlc3RybzMuYworKysgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwpAQCAtMTQwMyw3ICsxNDAzLDcgQEAKIAkvKiBzZXQgYnVmZmVyIGFkZHJlc3MgKi8KIAlzLT5idWZmZXJfYWRkciA9IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CiAJaWYgKHMtPmJ1ZmZlcl9hZGRyICYgMHgzKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm9oIG15LCBub3QgYWxpZ25lZFxuIik7CisJCWRldl9lcnIoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgIm9oIG15LCBub3QgYWxpZ25lZFxuIik7CiAJCXMtPmJ1ZmZlcl9hZGRyID0gcy0+YnVmZmVyX2FkZHIgJiB+MHgzOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE5MDAsNyArMTkwMCw3IEBACiAJCWNwdV9yZWxheCgpOwogCX0gd2hpbGUgKGktLSA+IDApOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiYWM5NyBzZXJpYWwgYnVzIGJ1c3lcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiYWM5NyBzZXJpYWwgYnVzIGJ1c3lcbiIpOwogCXJldHVybiAxOwogfQogCkBAIC0yMDE1LDcgKzIwMTUsOCBAQAogCQlkZWxheTEgKz0gMTA7CiAJCWRlbGF5MiArPSAxMDA7CiAKLQkJc25kX3ByaW50ZCgibWFlc3RybzM6IHJldHJ5aW5nIGNvZGVjIHJlc2V0IHdpdGggZGVsYXlzIG9mICVkIGFuZCAlZCBtc1xuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkicmV0cnlpbmcgY29kZWMgcmVzZXQgd2l0aCBkZWxheXMgb2YgJWQgYW5kICVkIG1zXG4iLAogCQkJICAgZGVsYXkxLCBkZWxheTIpOwogCX0KIApAQCAtMjE5NCw3ICsyMTk1LDggQEAKIAlhZGRyZXNzID0gMHgxMTAwICsgKChkYXRhX2J5dGVzLzIpICogaW5kZXgpOwogCiAJaWYgKChhZGRyZXNzICsgKGRhdGFfYnl0ZXMvMikpID49IDB4MWMwMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yICVkIGJ5dGVzIGF0IGluZCAlZCAoYWRkciAweCV4KVxuIiwKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkibm8gbWVtb3J5IGZvciAlZCBieXRlcyBhdCBpbmQgJWQgKGFkZHIgMHgleClcbiIsCiAJCQkgICBkYXRhX2J5dGVzLCBpbmRleCwgYWRkcmVzcyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI0MzksOCArMjQ0MSw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtYWVzdG9yMzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjU1Myw3ICsyNTU0LDggQEAKIAkvKiBjaGVjaywgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDI4IGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyOCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjgpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjhiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTI1ODYsOSArMjU4OCw4IEBACiAJZWxzZSB7CiAJCXF1aXJrID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBtM19hbXBfcXVpcmtfbGlzdCk7CiAJCWlmIChxdWlyaykgewotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPCi0JCQkJICAgICJtYWVzdHJvMzogc2V0IGFtcC1ncGlvIGZvciAnJXMnXG4iLAotCQkJCSAgICBzbmRfcGNpX3F1aXJrX25hbWUocXVpcmspKTsKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgInNldCBhbXAtZ3BpbyBmb3IgJyVzJ1xuIiwKKwkJCQkgc25kX3BjaV9xdWlya19uYW1lKHF1aXJrKSk7CiAJCQljaGlwLT5hbXBfZ3BpbyA9IHF1aXJrLT52YWx1ZTsKIAkJfSBlbHNlIGlmIChjaGlwLT5hbGxlZ3JvX2ZsYWcpCiAJCQljaGlwLT5hbXBfZ3BpbyA9IEdQT19FWFRfQU1QX0FMTEVHUk87CkBAIC0yNTk4LDkgKzI1OTksOCBAQAogCiAJcXVpcmsgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIG0zX2lyZGFfcXVpcmtfbGlzdCk7CiAJaWYgKHF1aXJrKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTwotCQkJICAgICJtYWVzdHJvMzogZW5hYmxlZCBpcmRhIHdvcmthcm91bmQgZm9yICclcydcbiIsCi0JCQkgICAgc25kX3BjaV9xdWlya19uYW1lKHF1aXJrKSk7CisJCWRldl9pbmZvKGNhcmQtPmRldiwgImVuYWJsZWQgaXJkYSB3b3JrYXJvdW5kIGZvciAnJXMnXG4iLAorCQkJIHNuZF9wY2lfcXVpcmtfbmFtZShxdWlyaykpOwogCQljaGlwLT5pcmRhX3dvcmthcm91bmQgPSAxOwogCX0KIAlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbTNfaHZfcXVpcmtfbGlzdCk7CkBAIC0yNjUyLDcgKzI2NTIsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbTNfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX20zX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI2NjEsNyArMjY2MSw3IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJY2hpcC0+c3VzcGVuZF9tZW0gPSB2bWFsbG9jKHNpemVvZih1MTYpICogKFJFVl9CX0NPREVfTUVNT1JZX0xFTkdUSCArIFJFVl9CX0RBVEFfTUVNT1JZX0xFTkdUSCkpOwogCWlmIChjaGlwLT5zdXNwZW5kX21lbSA9PSBOVUxMKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CisJCWRldl93YXJuKGNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIGFwbSBidWZmZXJcbiIpOwogI2VuZGlmCiAKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgewpAQCAtMjY4NSwxNiArMjY4NSwxNSBAQAogCWlmIChjaGlwLT5odl9jb25maWcgJiBIVl9DVFJMX0VOQUJMRSkgewogCQllcnIgPSBzbmRfbTNfaW5wdXRfcmVnaXN0ZXIoY2hpcCk7CiAJCWlmIChlcnIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiAiCi0JCQkJImZhaWxlZCB3aXRoIGVycm9yICVpIiwgZXJyKTsKKwkJCWRldl93YXJuKGNhcmQtPmRldiwKKwkJCQkgIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWkiLAorCQkJCSBlcnIpOwogCX0KICNlbmRpZgogCiAJc25kX20zX2VuYWJsZV9pbnRzKGNoaXApOwogCXNuZF9tM19hc3NwX2NvbnRpbnVlKGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKmNoaXBfcmV0ID0gY2hpcDsKIAogCXJldHVybiAwOyAKQEAgLTI3MjEsNyArMjcyMCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNzY0LDcgKzI3NjQsNyBAQAogCQkJCSAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAogCQkJCSAgLTEsICZjaGlwLT5ybWlkaSk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm8zOiBubyBNSURJIHN1cHBvcnQuXG4iKTsKKwkJZGV2X3dhcm4oY2FyZC0+ZGV2LCAibm8gTUlESSBzdXBwb3J0LlxuIik7CiAjZW5kaWYKIAogCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggMWUwZjZlZS4uYTkzZTdhZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC04Nyw3ICs4Nyw4IEBACiAJCWlmKCFzdGFydCkgcmV0dXJuIDA7IC8qIGFscmVhZHkgc3RvcHBlZCAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X3BpcGVfc3RhdGUgY2FsbGVkIHdpdGggd3JvbmcgcGlwZS0+c3RhdHVzIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3IgbWl4YXJ0X3NldF9waXBlX3N0YXRlIGNhbGxlZCB3aXRoIHdyb25nIHBpcGUtPnN0YXR1cyFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsgICAgICAvKiBmdW5jdGlvbiBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlIHN0YXR1cyAqLwogCX0KIApAQCAtMTAyLDcgKzEwMyw4IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnX3dhaXRfbm90aWYobWdyLCAmcmVxdWVzdCwgc3lzdGVtX21zZ191aWQpOwogCWlmKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciA6IE1TR19TWVNURU1fV0FJVF9TWU5DSFJPX0NNRCB3YXMgbm90IG5vdGlmaWVkICFcbiIpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJImVycm9yIDogTVNHX1NZU1RFTV9XQUlUX1NZTkNIUk9fQ01EIHdhcyBub3Qgbm90aWZpZWQgIVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMjMsNyArMTI1LDkgQEAKIAogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGdyb3VwX3N0YXRlX3Jlc3ApLCAmZ3JvdXBfc3RhdGVfcmVzcCk7CiAJaWYgKGVyciA8IDAgfHwgZ3JvdXBfc3RhdGVfcmVzcC50eHhfc3RhdHVzICE9IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NUUkVBTV9TVCoqKl9TVFJFQU1fR1JQX1BBQ0tFVCBlcnI9JXggc3RhdD0leCAhXG4iLCBlcnIsIGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3IgTVNHX1NUUkVBTV9TVCoqKl9TVFJFQU1fR1JQX1BBQ0tFVCBlcnI9JXggc3RhdD0leCAhXG4iLAorCQkJZXJyLCBncm91cF9zdGF0ZV9yZXNwLnR4eF9zdGF0dXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEzNCw3ICsxMzgsOSBAQAogCiAJCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGdyb3VwX3N0YXRlX3Jlc3ApLCAmZ3JvdXBfc3RhdGVfcmVzcCk7CiAJCWlmIChlcnIgPCAwIHx8IGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1RSRUFNX1NUQVJUX1NUUkVBTV9HUlBfUEFDS0VUIGVycj0leCBzdGF0PSV4ICFcbiIsIGVyciwgZ3JvdXBfc3RhdGVfcmVzcC50eHhfc3RhdHVzKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fU1RBUlRfU1RSRUFNX0dSUF9QQUNLRVQgZXJyPSV4IHN0YXQ9JXggIVxuIiwKKwkJCQllcnIsIGdyb3VwX3N0YXRlX3Jlc3AudHh4X3N0YXR1cyk7CiAgCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtMTQ3LDcgKzE1Myw5IEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2Yoc3RhdCksICZzdGF0KTsKIAkJaWYgKGVyciA8IDAgfHwgc3RhdCAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX1NFTkRfU1lOQ0hST19DTUQgZXJyPSV4IHN0YXQ9JXggIVxuIiwgZXJyLCBzdGF0KTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TWVNURU1fU0VORF9TWU5DSFJPX0NNRCBlcnI9JXggc3RhdD0leCAhXG4iLAorCQkJCWVyciwgc3RhdCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xNzgsNyArMTg2LDkgQEAKIAkJaWYocmF0ZSA9PSAwKQogCQkJcmV0dXJuIDA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KIAkJZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X2Nsb2NrKCVkKSBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlLT5zdGF0dXMgIVxuIiwgcmF0ZSk7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJlcnJvciBtaXhhcnRfc2V0X2Nsb2NrKCVkKSBjYWxsZWQgd2l0aCB3cm9uZyBwaXBlLT5zdGF0dXMgIVxuIiwKKwkJCQlyYXRlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTkwLDcgKzIwMCw3IEBACiAJY2xvY2tfcHJvcGVydGllcy5uYl9jYWxsZXJzID0gMTsgLyogb25seSBvbmUgZW50cnkgaW4gdWlkX2NhbGxlciAhICovCiAJY2xvY2tfcHJvcGVydGllcy51aWRfY2FsbGVyWzBdID0gcGlwZS0+Z3JvdXBfdWlkOwogCi0Jc25kX3ByaW50ZGQoIm1peGFydF9zZXRfY2xvY2sgdG8gJWQga0h6XG4iLCByYXRlKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAibWl4YXJ0X3NldF9jbG9jayB0byAlZCBrSHpcbiIsIHJhdGUpOwogCiAJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NMT0NLX1NFVF9QUk9QRVJUSUVTOwogCXJlcXVlc3QudWlkID0gbWdyLT51aWRfY29uc29sZV9tYW5hZ2VyOwpAQCAtMTk5LDcgKzIwOSw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihjbG9ja19wcm9wX3Jlc3ApLCAmY2xvY2tfcHJvcF9yZXNwKTsKIAlpZiAoZXJyIDwgMCB8fCBjbG9ja19wcm9wX3Jlc3Auc3RhdHVzICE9IDAgfHwgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUgIT0gQ01fU1RBTkRBTE9ORSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ0xPQ0tfU0VUX1BST1BFUlRJRVMgZXJyPSV4IHN0YXQ9JXggbW9kPSV4ICFcbiIsIGVyciwgY2xvY2tfcHJvcF9yZXNwLnN0YXR1cywgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJImVycm9yIE1TR19DTE9DS19TRVRfUFJPUEVSVElFUyBlcnI9JXggc3RhdD0leCBtb2Q9JXggIVxuIiwKKwkJCWVyciwgY2xvY2tfcHJvcF9yZXNwLnN0YXR1cywgY2xvY2tfcHJvcF9yZXNwLmNsb2NrX21vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI1Miw3ICsyNjQsOSBAQAogCQkJc3RydWN0IG1peGFydF9zdHJlYW1pbmdfZ3JvdXAgc2dyb3VwX3Jlc3A7CiAJCX0gKmJ1ZjsKIAotCQlzbmRfcHJpbnRkZCgiYWRkX3JlZl9waXBlIGF1ZGlvIGNoaXAoJWQpIHBjbSglZClcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiYWRkX3JlZl9waXBlIGF1ZGlvIGNoaXAoJWQpIHBjbSglZClcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgcGNtX251bWJlcik7CiAKIAkJYnVmID0ga21hbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZikKQEAgLTMwMiw3ICszMTYsOSBAQAogCiAJCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2coY2hpcC0+bWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGJ1Zi0+c2dyb3VwX3Jlc3ApLCAmYnVmLT5zZ3JvdXBfcmVzcCk7CiAJCWlmKChlcnIgPCAwKSB8fCAoYnVmLT5zZ3JvdXBfcmVzcC5zdGF0dXMgIT0gMCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TVFJFQU1fQUREXyoqUFVUX0dST1VQIGVycj0leCBzdGF0PSV4ICFcbiIsIGVyciwgYnVmLT5zZ3JvdXBfcmVzcC5zdGF0dXMpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fQUREXyoqUFVUX0dST1VQIGVycj0leCBzdGF0PSV4ICFcbiIsCisJCQkJZXJyLCBidWYtPnNncm91cF9yZXNwLnN0YXR1cyk7CiAJCQlrZnJlZShidWYpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTM0MywxMyArMzU5LDE0IEBACiAJCS8qIHJlbGVhc2UgdGhlIGNsb2NrICovCiAJCWVyciA9IG1peGFydF9zZXRfY2xvY2soIG1nciwgcGlwZSwgMCk7CiAJCWlmKCBlcnIgPCAwICkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWl4YXJ0X3NldF9jbG9jaygwKSByZXR1cm4gZXJyb3IhXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJIm1peGFydF9zZXRfY2xvY2soMCkgcmV0dXJuIGVycm9yIVxuIik7CiAJCX0KIAogCQkvKiBzdG9wIHRoZSBwaXBlICovCiAJCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShtZ3IsIHBpcGUsIDApOwogCQlpZiggZXJyIDwgMCApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0b3BwaW5nIHBpcGUhXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CiAJCX0KIAogCQlyZXF1ZXN0Lm1lc3NhZ2VfaWQgPSBNU0dfU1RSRUFNX0RFTEVURV9HUk9VUDsKQEAgLTM2MCw3ICszNzcsOSBAQAogCQkvKiBkZWxldGUgdGhlIHBpcGUgKi8KIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoZGVsZXRlX3Jlc3ApLCAmZGVsZXRlX3Jlc3ApOwogCQlpZiAoKGVyciA8IDApIHx8IChkZWxldGVfcmVzcC5zdGF0dXMgIT0gMCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TVFJFQU1fREVMRVRFX0dST1VQIGVycigleCksIHN0YXR1cygleClcbiIsIGVyciwgZGVsZXRlX3Jlc3Auc3RhdHVzKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19TVFJFQU1fREVMRVRFX0dST1VQIGVycigleCksIHN0YXR1cygleClcbiIsCisJCQkJZXJyLCBkZWxldGVfcmVzcC5zdGF0dXMpOwogCQl9CiAKIAkJcGlwZS0+Z3JvdXBfdWlkID0gKHN0cnVjdCBtaXhhcnRfdWlkKXswLDB9OwpAQCAtNDE0LDcgKzQzMyw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCi0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7CiAKIAkJLyogU1RBUlRfU1RSRUFNICovCiAJCWlmKCBtaXhhcnRfc2V0X3N0cmVhbV9zdGF0ZShzdHJlYW0sIDEpICkKQEAgLTQzMSwxOSArNDUwLDE5IEBACiAKIAkJc3RyZWFtLT5zdGF0dXMgPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19PUEVOOwogCi0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVE9QXG4iKTsKKwkJZGV2X2RiZyhzdWJzLT5wY20tPmNhcmQtPmRldiwgIlNORFJWX1BDTV9UUklHR0VSX1NUT1BcbiIpOwogCiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgogCQkvKiBUT0RPICovCiAJCXN0cmVhbS0+c3RhdHVzID0gTUlYQVJUX1NUUkVBTV9TVEFUVVNfUEFVU0U7Ci0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fUEFVU0VfUFVTSFxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fUEFVU0VfUFVTSFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJLyogVE9ETyAqLwogCQlzdHJlYW0tPnN0YXR1cyA9IE1JWEFSVF9TVFJFQU1fU1RBVFVTX1JVTk5JTkc7Ci0JCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fUEFVU0VfUkVMRUFTRVxuIik7CisJCWRldl9kYmcoc3Vicy0+cGNtLT5jYXJkLT5kZXYsICJTTkRSVl9QQ01fUEFVU0VfUkVMRUFTRVxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDU2LDcgKzQ3NSw4IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCXdoaWxlIChhdG9taWNfcmVhZCgmbWdyLT5tc2dfcHJvY2Vzc2VkKSA+IDApIHsKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1peGFydDogY2Fubm90IHByb2Nlc3Mgbm9uYmxvY2sgZXZlbnRzIVxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJtaXhhcnQ6IGNhbm5vdCBwcm9jZXNzIG5vbmJsb2NrIGV2ZW50cyFcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKQEAgLTQ3NCw3ICs0OTQsNyBAQAogCiAJLyogVE9ETyBkZSBmYcOnb24gbm9uIGJsb3F1YW50ZSwgcsOpYXBwbGlxdWVyIGxlcyBod19wYXJhbXMgKHJhdGUsIGJpdHMsIGNvZGVjKSAqLwogCi0Jc25kX3ByaW50ZGQoInNuZF9taXhhcnRfcHJlcGFyZVxuIik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJzbmRfbWl4YXJ0X3ByZXBhcmVcbiIpOwogCiAJbWl4YXJ0X3N5bmNfbm9uYmxvY2tfZXZlbnRzKGNoaXAtPm1ncik7CiAKQEAgLTU0MiwxMSArNTYyLDEzIEBACiAJCXN0cmVhbV9wYXJhbS5zYW1wbGVfc2l6ZSA9IDMyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBtaXhhcnRfc2V0X2Zvcm1hdCgpIDogdW5rbm93biBmb3JtYXRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBtaXhhcnRfc2V0X2Zvcm1hdCgpIDogdW5rbm93biBmb3JtYXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzbmRfcHJpbnRkZCgic2V0IFNORFJWX1BDTV9GT1JNQVQgc2FtcGxlX3R5cGUoJWQpIHNhbXBsZV9zaXplKCVkKSBmcmVxKCVkKSBjaGFubmVscyglZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJzZXQgU05EUlZfUENNX0ZPUk1BVCBzYW1wbGVfdHlwZSglZCkgc2FtcGxlX3NpemUoJWQpIGZyZXEoJWQpIGNoYW5uZWxzKCVkKVxuIiwKIAkJICAgc3RyZWFtX3BhcmFtLnNhbXBsZV90eXBlLCBzdHJlYW1fcGFyYW0uc2FtcGxlX3NpemUsIHN0cmVhbV9wYXJhbS5zYW1wbGluZ19mcmVxLCBzdHJlYW0tPmNoYW5uZWxzKTsKIAogCS8qIFRPRE86IHdoYXQgZWxzZSB0byBjb25maWd1cmUgPyAqLwpAQCAtNTY2LDcgKzU4OCw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKGNoaXAtPm1nciwgJnJlcXVlc3QsIHNpemVvZihyZXNwKSwgJnJlc3ApOwogCWlmKChlcnIgPCAwKSB8fCByZXNwLmVycm9yX2NvZGUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiTVNHX1NUUkVBTV9TRVRfSU5QVVRfU1RBR0VfUEFSQU0gZXJyPSV4OyByZXNwPSV4XG4iLCBlcnIsIHJlc3AuZXJyb3JfY29kZSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk1TR19TVFJFQU1fU0VUX0lOUFVUX1NUQUdFX1BBUkFNIGVycj0leDsgcmVzcD0leFxuIiwKKwkJCWVyciwgcmVzcC5lcnJvcl9jb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtNjI3LDggKzY1MSw5IEBACiAJCWJ1ZmZlcmluZm9baV0uYXZhaWxhYmxlX2xlbmd0aCA9IHN1YnMtPnJ1bnRpbWUtPmRtYV9ieXRlczsKIAkJLyogYnVmZmVyaW5mb1tpXS5idWZmZXJfaWQgIGlzIGFscmVhZHkgZGVmaW5lZCAqLwogCi0JCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X2h3X3BhcmFtcyhwY20gJWQpIDogZG1hX2FkZHIoJXgpIGRtYV9ieXRlcygleCkgc3Vicy1udW1iZXIoJWQpXG4iLCBpLAotCQkJCWJ1ZmZlcmluZm9baV0uYnVmZmVyX2FkZHJlc3MsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInNuZF9taXhhcnRfaHdfcGFyYW1zKHBjbSAlZCkgOiBkbWFfYWRkcigleCkgZG1hX2J5dGVzKCV4KSBzdWJzLW51bWJlciglZClcbiIsCisJCQlpLCBidWZmZXJpbmZvW2ldLmJ1ZmZlcl9hZGRyZXNzLAogCQkJCWJ1ZmZlcmluZm9baV0uYXZhaWxhYmxlX2xlbmd0aCwKIAkJCQlzdWJzLT5udW1iZXIpOwogCX0KQEAgLTcxNCwxNCArNzM5LDE4IEBACiAJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0RJR0lUQUw7CiAJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9kaWdpdGFsX2NhcHM7CiAJfQotCXNuZF9wcmludGRkKCJzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwKKwkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAKIAkvKiBnZXQgc3RyZWFtIGluZm8gKi8KIAlzdHJlYW0gPSAmKGNoaXAtPnBsYXliYWNrX3N0cmVhbVtwY21fbnVtYmVyXVtzdWJzLT5udW1iZXJdKTsKIAogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKIAkJLyogc3RyZWFtcyBpbiB1c2UgKi8KLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9wbGF5YmFja19vcGVuIEMlZC9QJWQvU3ViJWQgaW4gdXNlXG4iLCBjaGlwLT5jaGlwX2lkeCwgcGNtX251bWJlciwgc3Vicy0+bnVtYmVyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkic25kX21peGFydF9wbGF5YmFja19vcGVuIEMlZC9QJWQvU3ViJWQgaW4gdXNlXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfZXhpdF9vcGVuOwogCX0KQEAgLTczNyw3ICs3NjYsNyBAQAogCS8qIHN0YXJ0IHRoZSBwaXBlIGlmIG5lY2Vzc2FyeSAqLwogCWVyciA9IG1peGFydF9zZXRfcGlwZV9zdGF0ZShjaGlwLT5tZ3IsIHBpcGUsIDEpOwogCWlmKCBlcnIgPCAwICkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzdGFydGluZyBwaXBlIVxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiZXJyb3Igc3RhcnRpbmcgcGlwZSFcbiIpOwogCQlzbmRfbWl4YXJ0X2tpbGxfcmVmX3BpcGUoY2hpcC0+bWdyLCBwaXBlLCAwKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBfZXhpdF9vcGVuOwpAQCAtNzkyLDE0ICs4MjEsMTcgQEAKIAogCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IDI7IC8qIGZvciBpbnN0YW5jZSwgbm8gbW9ubyAqLwogCi0Jc25kX3ByaW50ZGQoInNuZF9taXhhcnRfY2FwdHVyZV9vcGVuIEMlZC9QJWQvU3ViJWRcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZFxuIiwKKwkJY2hpcC0+Y2hpcF9pZHgsIHBjbV9udW1iZXIsIHN1YnMtPm51bWJlcik7CiAKIAkvKiBnZXQgc3RyZWFtIGluZm8gKi8KIAlzdHJlYW0gPSAmKGNoaXAtPmNhcHR1cmVfc3RyZWFtW3BjbV9udW1iZXJdKTsKIAogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBNSVhBUlRfU1RSRUFNX1NUQVRVU19GUkVFKXsKIAkJLyogc3RyZWFtcyBpbiB1c2UgKi8KLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic25kX21peGFydF9jYXB0dXJlX29wZW4gQyVkL1AlZC9TdWIlZCBpbiB1c2VcbiIsIGNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJzbmRfbWl4YXJ0X2NhcHR1cmVfb3BlbiBDJWQvUCVkL1N1YiVkIGluIHVzZVxuIiwKKwkJCWNoaXAtPmNoaXBfaWR4LCBwY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gX2V4aXRfb3BlbjsKIAl9CkBAIC04MTUsNyArODQ3LDcgQEAKIAkvKiBzdGFydCB0aGUgcGlwZSBpZiBuZWNlc3NhcnkgKi8KIAllcnIgPSBtaXhhcnRfc2V0X3BpcGVfc3RhdGUoY2hpcC0+bWdyLCBwaXBlLCAxKTsKIAlpZiggZXJyIDwgMCApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3Igc3RhcnRpbmcgcGlwZSFcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImVycm9yIHN0YXJ0aW5nIHBpcGUhXG4iKTsKIAkJc25kX21peGFydF9raWxsX3JlZl9waXBlKGNoaXAtPm1nciwgcGlwZSwgMCk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX2V4aXRfb3BlbjsKQEAgLTg1NSw3ICs4ODcsOCBAQAogCiAJbXV0ZXhfbG9jaygmbWdyLT5zZXR1cF9tdXRleCk7CiAKLQlzbmRfcHJpbnRkZCgic25kX21peGFydF9jbG9zZSBDJWQvUCVkL1N1YiVkXG4iLCBjaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAic25kX21peGFydF9jbG9zZSBDJWQvUCVkL1N1YiVkXG4iLAorCQljaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyLCBzdWJzLT5udW1iZXIpOwogCiAJLyogc2FtcGxlIHJhdGUgcmVsZWFzZWQgKi8KIAlpZigtLW1nci0+cmVmX2NvdW50X3JhdGUgPT0gMCkgewpAQCAtODY1LDcgKzg5OCw5IEBACiAJLyogZGVsZXRlIHBpcGUgKi8KIAlpZiAoc25kX21peGFydF9raWxsX3JlZl9waXBlKG1nciwgc3RyZWFtLT5waXBlLCAwICkgPCAwKSB7CiAKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3Igc25kX21peGFydF9raWxsX3JlZl9waXBlIEMlZFAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgsIHN0cmVhbS0+cGNtX251bWJlcik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImVycm9yIHNuZF9taXhhcnRfa2lsbF9yZWZfcGlwZSBDJWRQJWRcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgc3RyZWFtLT5wY21fbnVtYmVyKTsKIAl9CiAKIAlzdHJlYW0tPnBpcGUgICAgICA9IE5VTEw7CkBAIC05NDAsNyArOTc1LDggQEAKIAlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIG5hbWUsIE1JWEFSVF9QQ01fQU5BTE9HLAogCQkJICAgICAgIE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TLAogCQkJICAgICAgIE1JWEFSVF9DQVBUVVJFX1NUUkVBTVMsICZwY20pKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSB0aGUgYW5hbG9nIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY3JlYXRlIHRoZSBhbmFsb2cgcGNtICVkXG4iLCBjaGlwLT5jaGlwX2lkeCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC05NzEsNyArMTAwNyw4IEBACiAJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBNSVhBUlRfUENNX0RJR0lUQUwsCiAJCQkgICAgICAgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMsCiAJCQkgICAgICAgTUlYQVJUX0NBUFRVUkVfU1RSRUFNUywgJnBjbSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIHRoZSBkaWdpdGFsIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY3JlYXRlIHRoZSBkaWdpdGFsIHBjbSAlZFxuIiwgY2hpcC0+Y2hpcF9pZHgpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTAxNCw3ICsxMDUxLDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghIGNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMDI4LDggKzEwNjUsNiBAQAogCX0KIAogCW1nci0+Y2hpcFtpZHhdID0gY2hpcDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtZ3ItPnBjaS0+ZGV2KTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDczLDcgKzExMDgsNyBAQAogCS8qIHJlc2V0IGJvYXJkIGlmIHNvbWUgZmlybXdhcmUgd2FzIGxvYWRlZCAqLwogCWlmKG1nci0+ZHNwX2xvYWRlZCkgewogCQlzbmRfbWl4YXJ0X3Jlc2V0X2JvYXJkKG1ncik7Ci0JCXNuZF9wcmludGRkKCJyZXNldCBtaVhhcnQgIVxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJyZXNldCBtaVhhcnQgIVxuIik7CiAJfQogCiAJLyogcmVsZWFzZSB0aGUgaS9vIHBvcnRzICovCkBAIC0xMjM0LDcgKzEyNjksOCBAQAogCiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCWRldl9lcnIoJnBjaS0+ZGV2LAorCQkJImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMTI2MCw3ICsxMjk2LDcgQEAKIAkJbWdyLT5tZW1baV0ucGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIGkpOwogCQltZ3ItPm1lbVtpXS52aXJ0ID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgaSk7CiAJCWlmICghbWdyLT5tZW1baV0udmlydCkgewotCQkgICAgICAgIHByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIHJlc291cmNlIDB4JWx4XG4iLAorCQkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgcmVzb3VyY2UgMHglbHhcbiIsCiAJCQkgICAgICAgbWdyLT5tZW1baV0ucGh5cyk7CiAJCQlzbmRfbWl4YXJ0X2ZyZWUobWdyKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0xMjY5LDcgKzEzMDUsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbWl4YXJ0X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX21peGFydF9mcmVlKG1ncik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTMwOCwxMCArMTM0NCwxMSBAQAogCQllbHNlCiAJCQlpZHggPSBpbmRleFtkZXZdICsgaTsKIAkJc25wcmludGYodG1waWQsIHNpemVvZih0bXBpZCksICIlcy0lZCIsIGlkW2Rldl0gPyBpZFtkZXZdIDogIk1JWEFSVCIsIGkpOwotCQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaWR4LCB0bXBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwkJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaWR4LCB0bXBpZCwgVEhJU19NT0RVTEUsCisJCQkJICAgMCwgJmNhcmQpOwogCiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgYWxsb2NhdGUgdGhlIGNhcmQgJWRcbiIsIGkpOworCQkJZGV2X2VycigmcGNpLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgdGhlIGNhcmQgJWRcbiIsIGkpOwogCQkJc25kX21peGFydF9mcmVlKG1ncik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMKaW5kZXggM2RmMGY1My4uNzFmNGJkYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2NvcmUuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTk0LDcgKzk1LDggQEAKIAogCWlmKCAoc2l6ZSA8IE1TR19ERVNDUklQVE9SX1NJWkUpIHx8IChyZXNwLT5zaXplIDwgKHNpemUgLSBNU0dfREVTQ1JJUFRPUl9TSVpFKSkpIHsKIAkJZXJyID0gLUVJTlZBTDsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicHJvYmxlbSB3aXRoIHJlc3BvbnNlIHNpemUgPSAlZFxuIiwgc2l6ZSk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkicHJvYmxlbSB3aXRoIHJlc3BvbnNlIHNpemUgPSAlZFxuIiwgc2l6ZSk7CiAJCWdvdG8gX2NsZWFuX2V4aXQ7CiAJfQogCXNpemUgLT0gTVNHX0RFU0NSSVBUT1JfU0laRTsKQEAgLTE2MSw3ICsxNjMsNyBAQAogCWhlYWRwdHIgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgTVNHX0lOQk9VTkRfRlJFRV9IRUFEKSk7CiAKIAlpZiAodGFpbHB0ciA9PSBoZWFkcHRyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yOiBubyBtZXNzYWdlIGZyYW1lIGF2YWlsYWJsZVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvcjogbm8gbWVzc2FnZSBmcmFtZSBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjY1LDcgKzI2Nyw4IEBACiAJaWYgKCEgdGltZW91dCkgewogCQkvKiBlcnJvciAtIG5vIGFjayAqLwogCQltdXRleF91bmxvY2soJm1nci0+bXNnX211dGV4KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3I6IG5vIHJlc3BvbnNlIG9uIG1zZyAleFxuIiwgbXNnX2ZyYW1lKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvcjogbm8gcmVzcG9uc2Ugb24gbXNnICV4XG4iLCBtc2dfZnJhbWUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTI3OCw3ICsyODEsNyBAQAogCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgbXNnX2ZyYW1lKTsKIAogCWlmKCByZXF1ZXN0LT5tZXNzYWdlX2lkICE9IHJlc3AubWVzc2FnZV9pZCApCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlJFU1BPTlNFIEVSUk9SIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJSRVNQT05TRSBFUlJPUiFcbiIpOwogCiAJbXV0ZXhfdW5sb2NrKCZtZ3ItPm1zZ19tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTMyMSw3ICszMjQsOCBAQAogCWlmICghIHRpbWVvdXQpIHsKIAkJLyogZXJyb3IgLSBubyBhY2sgKi8KIAkJbXV0ZXhfdW5sb2NrKCZtZ3ItPm1zZ19tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yOiBub3RpZmljYXRpb24gJXggbm90IHJlY2VpdmVkXG4iLCBub3RpZl9ldmVudCk7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkiZXJyb3I6IG5vdGlmaWNhdGlvbiAleCBub3QgcmVjZWl2ZWRcbiIsIG5vdGlmX2V2ZW50KTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0zNzgsNyArMzgyLDkgQEAKIAkJCXJlc3Auc2l6ZSA9IHNpemVvZihtaXhhcnRfbXNnX2RhdGEpOwogCQkJZXJyID0gZ2V0X21zZyhtZ3IsICZyZXNwLCBhZGRyKTsKIAkJCWlmKCBlcnIgPCAwICkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInRhc2tsZXQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLCBlcnIsIG1zZyk7CisJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkJInRhc2tsZXQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLAorCQkJCQllcnIsIG1zZyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTM4OCwxMCArMzk0LDEzIEBACiAJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9JTlBVVF9TVEFHRV9QQUNLRVQ6CiAJCQljYXNlIE1TR19TVFJFQU1fU1RPUF9PVVRQVVRfU1RBR0VfUEFDS0VUOgogCQkJCWlmKG1peGFydF9tc2dfZGF0YVswXSkKLQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGFza2xldCA6IGVycm9yIE1TR19TVFJFQU1fU1QqKipfKioqUFVUX1NUQUdFX1BBQ0tFVCBzdGF0dXM9JXhcbiIsIG1peGFydF9tc2dfZGF0YVswXSk7CisJCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCQkidGFza2xldCA6IGVycm9yIE1TR19TVFJFQU1fU1QqKipfKioqUFVUX1NUQUdFX1BBQ0tFVCBzdGF0dXM9JXhcbiIsCisJCQkJCQltaXhhcnRfbXNnX2RhdGFbMF0pOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlzbmRfcHJpbnRkZCgidGFza2xldCByZWNlaXZlZCBtZigleCkgOiBtc2dfaWQoJXgpIHVpZCgleCwgJXgpIHNpemUoJXpkKVxuIiwKKwkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkidGFza2xldCByZWNlaXZlZCBtZigleCkgOiBtc2dfaWQoJXgpIHVpZCgleCwgJXgpIHNpemUoJXpkKVxuIiwKIAkJCQkJICAgbXNnLCByZXNwLm1lc3NhZ2VfaWQsIHJlc3AudWlkLm9iamVjdF9pZCwgcmVzcC51aWQuZGVzYywgcmVzcC5zaXplKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTQwMSw3ICs0MTAsOSBAQAogCQljYXNlIE1TR19UWVBFX0NPTU1BTkQ6CiAJCQkvKiBnZXRfbXNnKCkgbmVjZXNzYXJ5ICovCiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0YXNrbGV0IGRvZXNuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggbWVzc2FnZSAleFxuIiwgbXNnKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJInRhc2tsZXQgZG9lc24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBtZXNzYWdlICV4XG4iLAorCQkJCW1zZyk7CiAJCX0gLyogc3dpdGNoIHR5cGUgKi8KIAogCQkvKiBkZWNyZW1lbnQgY291bnRlciAqLwpAQCAtNDUxLDcgKzQ2Miw5IEBACiAJCQlyZXNwLnNpemUgPSBzaXplb2YobWl4YXJ0X21zZ19kYXRhKTsKIAkJCWVyciA9IGdldF9tc2cobWdyLCAmcmVzcCwgbXNnICYgfk1TR19UWVBFX01BU0spOwogCQkJaWYoIGVyciA8IDAgKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0OiBlcnJvciglZCkgcmVhZGluZyBtZiAleFxuIiwgZXJyLCBtc2cpOworCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJpbnRlcnJ1cHQ6IGVycm9yKCVkKSByZWFkaW5nIG1mICV4XG4iLAorCQkJCQllcnIsIG1zZyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTQ3Miw3ICs0ODUsOCBAQAogCQkJCQlzdHJ1Y3QgbWl4YXJ0X3N0cmVhbSAqc3RyZWFtOwogCiAJCQkJCWlmICgoY2hpcF9udW1iZXIgPj0gbWdyLT5udW1fY2FyZHMpIHx8IChwY21fbnVtYmVyID49IE1JWEFSVF9QQ01fVE9UQUwpIHx8IChzdWJfbnVtYmVyID49IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TKSkgewotCQkJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NFUlZJQ0VTX1RJTUVSX05PVElGWSBidWZmZXJfaWQgKCV4KSBwb3MoJWQpXG4iLAorCQkJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkJCQkiZXJyb3IgTVNHX1NFUlZJQ0VTX1RJTUVSX05PVElGWSBidWZmZXJfaWQgKCV4KSBwb3MoJWQpXG4iLAogCQkJCQkJCSAgIGJ1ZmZlcl9pZCwgbm90aWZ5LT5zdHJlYW1zW2ldLnNhbXBsZV9wb3NfbG93X3BhcnQpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KQEAgLTUyNCwxOCArNTM4LDIyIEBACiAJCQkJCX0KICNlbmRpZgogCQkJCQkoKGNoYXIqKW1peGFydF9tc2dfZGF0YSlbcmVzcC5zaXplIC0gMV0gPSAwOwotCQkJCQlzbmRfcHJpbnRkZCgiTUlYQVJUIFRSQUNFIDogJXNcbiIsIChjaGFyKiltaXhhcnRfbXNnX2RhdGEpOworCQkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkJIk1JWEFSVCBUUkFDRSA6ICVzXG4iLAorCQkJCQkJKGNoYXIgKiltaXhhcnRfbXNnX2RhdGEpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KIAotCQkJc25kX3ByaW50ZGQoImNvbW1hbmQgJXggbm90IGhhbmRsZWRcbiIsIHJlc3AubWVzc2FnZV9pZCk7CisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiY29tbWFuZCAleCBub3QgaGFuZGxlZFxuIiwKKwkJCQlyZXNwLm1lc3NhZ2VfaWQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNU0dfVFlQRV9OT1RJRlk6CiAJCQlpZihtc2cgJiBNU0dfQ0FOQ0VMX05PVElGWV9NQVNLKSB7CiAJCQkJbXNnICY9IH5NU0dfQ0FOQ0VMX05PVElGWV9NQVNLOwotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbmNlbGVkIG5vdGlmaWNhdGlvbiAleCAhXG4iLCBtc2cpOworCQkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJjYW5jZWxlZCBub3RpZmljYXRpb24gJXggIVxuIiwgbXNnKTsKIAkJCX0KIAkJCS8qIG5vIGJyZWFrLCBjb250aW51ZSAhICovCiAJCWNhc2UgTVNHX1RZUEVfQU5TV0VSOgpAQCAtNTU2LDcgKzU3NCw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBNU0dfVFlQRV9SRVFVRVNUOgogCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ZGQoImludGVycnVwdCByZWNlaXZlZCByZXF1ZXN0ICV4XG4iLCBtc2cpOworCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkiaW50ZXJydXB0IHJlY2VpdmVkIHJlcXVlc3QgJXhcbiIsIG1zZyk7CiAJCQkvKiBUT0RPIDogYXJlIHRoZXJlIHRoaW5ncyB0byBkbyBoZXJlID8gKi8KIAkJCWJyZWFrOwogCQl9IC8qIHN3aXRjaCBvbiBtc2cgdHlwZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMKaW5kZXggZWNlMWY4My4uNTgxZTFlNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jCkBAIC0xNjUsNyArMTY1LDggQEAKIAogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKCpjb25uZWN0b3IpLCBjb25uZWN0b3IpOwogCWlmKChlcnIgPCAwKSB8fCAoY29ubmVjdG9yLT5lcnJvcl9jb2RlKSB8fCAoY29ubmVjdG9yLT51aWRfY291bnQgPiBNSVhBUlRfTUFYX1BIWVNfQ09OTkVDVE9SUykpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NZU1RFTV9FTlVNX1BMQVlfQ09OTkVDVE9SXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUExBWV9DT05ORUNUT1JcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpAQCAtMTg0LDcgKzE4NSw3IEBACiAJCQlwaXBlLT51aWRfbGVmdF9jb25uZWN0b3IgPSBjb25uZWN0b3ItPnVpZFtrXTsgICAgLyogZXZlbiAqLwogCQl9CiAKLQkJLyogc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGF5YmFjayBjb25uZWN0b3JbJWRdLm9iamVjdF9pZCA9ICV4XG4iLCBrLCBjb25uZWN0b3ItPnVpZFtrXS5vYmplY3RfaWQpOyAqLworCQkvKiBkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicGxheWJhY2sgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KIAogCQkvKiBUT0RPOiByZWFsbHkgbmVlZCBzZW5kX21zZyBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPIGZvciBlYWNoIGNvbm5lY3RvciA/IHBlcmhhcHMgZm9yIGFuYWxvZyBsZXZlbCBjYXBzID8gKi8KIAkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NPTk5FQ1RPUl9HRVRfQVVESU9fSU5GTzsKQEAgLTE5NCwxMCArMTk1LDExIEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKIAkJaWYoIGVyciA8IDAgKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk9cbiIpOwogCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJwbGF5ICBhbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCA9ICV4XG4iLCBhdWRpb19pbmZvLT5pbmZvLmFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50KTsqLworCQkvKmRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJwbGF5ICBhbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCA9ICV4XG4iLCBhdWRpb19pbmZvLT5pbmZvLmFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50KTsqLwogCX0KIAogCXJlcXVlc3QubWVzc2FnZV9pZCA9IE1TR19TWVNURU1fRU5VTV9SRUNPUkRfQ09OTkVDVE9SOwpAQCAtMjA3LDcgKzIwOSw4IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZigqY29ubmVjdG9yKSwgY29ubmVjdG9yKTsKIAlpZigoZXJyIDwgMCkgfHwgKGNvbm5lY3Rvci0+ZXJyb3JfY29kZSkgfHwgKGNvbm5lY3Rvci0+dWlkX2NvdW50ID4gTUlYQVJUX01BWF9QSFlTX0NPTk5FQ1RPUlMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIE1TR19TWVNURU1fRU5VTV9SRUNPUkRfQ09OTkVDVE9SXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUkVDT1JEX0NPTk5FQ1RPUlxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CkBAIC0yMjYsNyArMjI5LDcgQEAKIAkJCXBpcGUtPnVpZF9sZWZ0X2Nvbm5lY3RvciA9IGNvbm5lY3Rvci0+dWlkW2tdOyAgICAvKiBldmVuICovCiAJCX0KIAotCQkvKiBzbmRfcHJpbnRrKEtFUk5fREVCVUcgImNhcHR1cmUgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KKwkJLyogZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgImNhcHR1cmUgY29ubmVjdG9yWyVkXS5vYmplY3RfaWQgPSAleFxuIiwgaywgY29ubmVjdG9yLT51aWRba10ub2JqZWN0X2lkKTsgKi8KIAogCQkvKiBUT0RPOiByZWFsbHkgbmVlZCBzZW5kX21zZyBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPIGZvciBlYWNoIGNvbm5lY3RvciA/IHBlcmhhcHMgZm9yIGFuYWxvZyBsZXZlbCBjYXBzID8gKi8KIAkJcmVxdWVzdC5tZXNzYWdlX2lkID0gTVNHX0NPTk5FQ1RPUl9HRVRfQVVESU9fSU5GTzsKQEAgLTIzNiwxMCArMjM5LDExIEBACiAKIAkJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoKmF1ZGlvX2luZm8pLCBhdWRpb19pbmZvKTsKIAkJaWYoIGVyciA8IDAgKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfQ09OTkVDVE9SX0dFVF9BVURJT19JTkZPXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVycm9yIE1TR19DT05ORUNUT1JfR0VUX0FVRElPX0lORk9cbiIpOwogCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCS8qc25kX3ByaW50ayhLRVJOX0RFQlVHICJyZWMgIGFuYWxvZ19pbmZvLmFuYWxvZ19sZXZlbF9wcmVzZW50ID0gJXhcbiIsIGF1ZGlvX2luZm8tPmluZm8uYW5hbG9nX2luZm8uYW5hbG9nX2xldmVsX3ByZXNlbnQpOyovCisJCS8qZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInJlYyAgYW5hbG9nX2luZm8uYW5hbG9nX2xldmVsX3ByZXNlbnQgPSAleFxuIiwgYXVkaW9faW5mby0+aW5mby5hbmFsb2dfaW5mby5hbmFsb2dfbGV2ZWxfcHJlc2VudCk7Ki8KIAl9CiAJZXJyID0gMDsKIApAQCAtMjcyLDcgKzI3Niw5IEBACiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhtZ3IsICZyZXF1ZXN0LCBzaXplb2YoY29uc29sZV9tZ3IpLCAmY29uc29sZV9tZ3IpOwogCiAJaWYoIChlcnIgPCAwKSB8fCAoY29uc29sZV9tZ3IuZXJyb3JfY29kZSAhPSAwKSApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEIDogZXJyPSV4XG4iLCBjb25zb2xlX21nci5lcnJvcl9jb2RlKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfQ09OU09MRV9HRVRfQ0xPQ0tfVUlEIDogZXJyPSV4XG4iLAorCQkJY29uc29sZV9tZ3IuZXJyb3JfY29kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjg2LDcgKzI5Miw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKG1nciwgJnJlcXVlc3QsIHNpemVvZihwaHlzX2lvKSwgJnBoeXNfaW8pOwogCWlmKCAoZXJyIDwgMCkgfHwgKCBwaHlzX2lvLmVycm9yX2NvZGUgIT0gMCApICkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUEhZU0lDQUxfSU8gZXJyKCV4KSBlcnJvcl9jb2RlKCV4KVxuIiwgZXJyLCBwaHlzX2lvLmVycm9yX2NvZGUgKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCSJlcnJvciBNU0dfU1lTVEVNX0VOVU1fUEhZU0lDQUxfSU8gZXJyKCV4KSBlcnJvcl9jb2RlKCV4KVxuIiwKKwkJCWVyciwgcGh5c19pby5lcnJvcl9jb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMjIsNyArMzMwLDcgQEAKIAkvKiB0aGlzIGNvbW1hbmQgaGFzIG5vIGRhdGEuIHJlc3BvbnNlIGlzIGEgMzIgYml0IHN0YXR1cyAqLwogCWVyciA9IHNuZF9taXhhcnRfc2VuZF9tc2cobWdyLCAmcmVxdWVzdCwgc2l6ZW9mKGspLCAmayk7CiAJaWYoIChlcnIgPCAwKSB8fCAoayAhPSAwKSApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgTVNHX1NZU1RFTV9TRU5EX1NZTkNIUk9fQ01EXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVycm9yIE1TR19TWVNURU1fU0VORF9TWU5DSFJPX0NNRFxuIik7CiAJCXJldHVybiBlcnIgPT0gMCA/IC1FSU5WQUwgOiBlcnI7CiAJfQogCkBAIC0zNDgsNyArMzU2LDcgQEAKIAogCS8qIG1vdGhlcmJvYXJkIHhpbGlueCBzdGF0dXMgNSB3aWxsIHNheSB0aGF0IHRoZSBib2FyZCBpcyBwZXJmb3JtaW5nIGEgcmVzZXQgKi8KIAlpZiAoc3RhdHVzX3hpbGlueCA9PSA1KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pWGFydCBpcyByZXNldHRpbmcgIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJtaVhhcnQgaXMgcmVzZXR0aW5nICFcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsgLyogdHJ5IGFnYWluIGxhdGVyICovCiAJfQogCkBAIC0zNTcsMTIgKzM2NSwxMyBAQAogCiAJCS8qIHhpbGlueCBhbHJlYWR5IGxvYWRlZCA/ICovIAogCQlpZiAoc3RhdHVzX3hpbGlueCA9PSA0KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInhpbGlueCBpcyBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJ4aWxpbnggaXMgYWxyZWFkeSBsb2FkZWQgIVxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQkvKiB0aGUgc3RhdHVzIHNob3VsZCBiZSAwID09ICJpZGxlIiAqLwogCQlpZiAoc3RhdHVzX3hpbGlueCAhPSAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ4aWxpbnggbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkieGlsaW54IGxvYWQgZXJyb3IgISBzdGF0dXMgPSAlZFxuIiwKIAkJCQkgICBzdGF0dXNfeGlsaW54KTsKIAkJCXJldHVybiAtRUlPOyAvKiBtb2Rwcm9iIC1yIG1heSBoZWxwID8gKi8KIAkJfQpAQCAtMzkzLDEzICs0MDIsMTQgQEAKIAljYXNlIE1JWEFSVF9NT1RIRVJCT0FSRF9FTEZfSU5ERVg6CiAKIAkJaWYgKHN0YXR1c19lbGYgPT0gNCkgewotCQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlbGYgZmlsZSBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJlbGYgZmlsZSBhbHJlYWR5IGxvYWRlZCAhXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogdGhlIHN0YXR1cyBzaG91bGQgYmUgMCA9PSAiaWRsZSIgKi8KIAkJaWYgKHN0YXR1c19lbGYgIT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZWxmIGxvYWQgZXJyb3IgISBzdGF0dXMgPSAlZFxuIiwKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJImVsZiBsb2FkIGVycm9yICEgc3RhdHVzID0gJWRcbiIsCiAJCQkJICAgc3RhdHVzX2VsZik7CiAJCQlyZXR1cm4gLUVJTzsgLyogbW9kcHJvYiAtciBtYXkgaGVscCA/ICovCiAJCX0KQEAgLTQwNyw3ICs0MTcsNyBAQAogCQkvKiB3YWl0IGZvciB4aWxpbnggc3RhdHVzID09IDQgKi8KIAkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19NWExYX1NUQVRVU19PRkZTRVQsIDEsIDQsIDUwMCk7IC8qIDVzZWMgKi8KIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInhpbGlueCB3YXMgbm90IGxvYWRlZCBvciAiCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAieGlsaW54IHdhcyBub3QgbG9hZGVkIG9yICIKIAkJCQkgICAiY291bGQgbm90IGJlIHN0YXJ0ZWRcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtNDI5LDcgKzQzOSw3IEBACiAJCS8qIHdhaXQgZm9yIGVsZiBzdGF0dXMgPT0gNCAqLwogCQllcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0VMRl9TVEFUVVNfT0ZGU0VULCAxLCA0LCAzMDApOyAvKiAzc2VjICovCiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlbGYgY291bGQgbm90IGJlIHN0YXJ0ZWRcbiIpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVsZiBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTQ0Myw3ICs0NTMsNyBAQAogCiAJCS8qIGVsZiBhbmQgeGlsaW54IHNob3VsZCBiZSBsb2FkZWQgKi8KIAkJaWYgKHN0YXR1c19lbGYgIT0gNCB8fCBzdGF0dXNfeGlsaW54ICE9IDQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAieGlsaW54IG9yIGVsZiBub3QgIgorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInhpbGlueCBvciBlbGYgbm90ICIKIAkJCSAgICAgICAic3VjY2Vzc2Z1bGx5IGxvYWRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsgLyogbW9kcHJvYiAtciBtYXkgaGVscCA/ICovCiAJCX0KQEAgLTQ1MSw3ICs0NjEsNyBAQAogCQkvKiB3YWl0IGZvciBkYXVnaHRlciBkZXRlY3Rpb24gIT0gMCAqLwogCQllcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RCUkRfUFJFU0VOQ0VfT0ZGU0VULCAwLCAwLCAzMCk7IC8qIDMwMG1zZWMgKi8KIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHN0YXJ0aW5nIGVsZiBmaWxlXG4iKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdGFydGluZyBlbGYgZmlsZVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTQ2Nyw3ICs0NzcsOCBAQAogCiAJCS8qIGRhdWdodGVyIHNob3VsZCBiZSBpZGxlICovCiAJCWlmIChzdGF0dXNfZGF1Z2h0ICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZGF1Z2h0ZXIgbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAorCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkiZGF1Z2h0ZXIgbG9hZCBlcnJvciAhIHN0YXR1cyA9ICVkXG4iLAogCQkJICAgICAgIHN0YXR1c19kYXVnaHQpOwogCQkJcmV0dXJuIC1FSU87IC8qIG1vZHByb2IgLXIgbWF5IGhlbHAgPyAqLwogCQl9CkBAIC00ODcsNyArNDk4LDcgQEAKIAkJLyogd2FpdCBmb3Igc3RhdHVzID09IDIgKi8KIAkJZXJyID0gbWl4YXJ0X3dhaXRfbmljZV9mb3JfcmVnaXN0ZXJfdmFsdWUoIG1nciwgTUlYQVJUX1BTRVVET1JFR19EWExYX1NUQVRVU19PRkZTRVQsIDEsIDIsIDMwKTsgLyogMzAwbXNlYyAqLwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZGF1Z2h0ZXIgYm9hcmQgbG9hZCBlcnJvclxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZGF1Z2h0ZXIgYm9hcmQgbG9hZCBlcnJvclxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKQEAgLTUwOSw3ICs1MjAsNyBAQAogICAgICAgICAvKiB3YWl0IGZvciBkYXVnaHRlciBzdGF0dXMgPT0gMyAqLwogICAgICAgICBlcnIgPSBtaXhhcnRfd2FpdF9uaWNlX2Zvcl9yZWdpc3Rlcl92YWx1ZSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX0RYTFhfU1RBVFVTX09GRlNFVCwgMSwgMywgMzAwKTsgLyogM3NlYyAqLwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkgICAiZGF1Z2h0ZXIgYm9hcmQgY291bGQgbm90IGJlIGluaXRpYWxpc2VkXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC01MjAsNyArNTMxLDcgQEAKIAkvKiBmaXJzdCBjb21tdW5pY2F0aW9uIHdpdGggZW1iZWRkZWQgKi8KIAllcnIgPSBtaXhhcnRfZmlyc3RfaW5pdChtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtaVhhcnQgY291bGQgbm90IGJlIHNldCB1cFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJtaVhhcnQgY291bGQgbm90IGJlIHNldCB1cFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC01NDAsNyArNTUxLDggQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX3ByaW50ZGQoIm1pWGFydCBmaXJtd2FyZSBkb3dubG9hZGVkIGFuZCBzdWNjZXNzZnVsbHkgc2V0IHVwXG4iKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkibWlYYXJ0IGZpcm13YXJlIGRvd25sb2FkZWQgYW5kIHN1Y2Nlc3NmdWxseSBzZXQgdXBcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTksNyArNTcxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXNwcmludGYocGF0aCwgIm1peGFydC8lcyIsIGZ3X2ZpbGVzW2ldKTsKIAkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBwYXRoLCAmbWdyLT5wY2ktPmRldikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1pWGFydDogY2FuJ3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwgcGF0aCk7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJtaVhhcnQ6IGNhbid0IGxvYWQgZmlybXdhcmUgJXNcbiIsIHBhdGgpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAkJLyogZmFrZSBod2RlcCBkc3AgcmVjb3JkICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYwppbmRleCAzYmE2MTc0Li4yNGExOTU1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMKQEAgLTMyOSw3ICszMjksOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKIAlpZigoZXJyPDApIHx8IChyZXNwLmVycm9yX2NvZGUpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMIGNhcmQoJWQpIGlzX2NhcHR1cmUoJWQpIGVycm9yX2NvZGUoJXgpXG4iLCBjaGlwLT5jaGlwX2lkeCwgaXNfY2FwdHVyZSwgcmVzcC5lcnJvcl9jb2RlKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZXJyb3IgTVNHX1BIWVNJQ0FMSU9fU0VUX0xFVkVMIGNhcmQoJWQpIGlzX2NhcHR1cmUoJWQpIGVycm9yX2NvZGUoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIGlzX2NhcHR1cmUsIHJlc3AuZXJyb3JfY29kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTc2Miw3ICs3NjQsOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2Yoc3RhdHVzKSwgJnN0YXR1cyk7CiAJaWYoKGVycjwwKSB8fCBzdGF0dXMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfU1RSRUFNX1NFVF9PVVRfU1RSRUFNX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdGF0dXMpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBNU0dfU1RSRUFNX1NFVF9PVVRfU1RSRUFNX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsCisJCQljaGlwLT5jaGlwX2lkeCwgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtODA1LDcgKzgwOSw5IEBACiAKIAllcnIgPSBzbmRfbWl4YXJ0X3NlbmRfbXNnKGNoaXAtPm1nciwgJnJlcXVlc3QsIHNpemVvZihzdGF0dXMpLCAmc3RhdHVzKTsKIAlpZigoZXJyPDApIHx8IHN0YXR1cykgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIE1TR19TVFJFQU1fU0VUX0lOX0FVRElPX0xFVkVMIGNhcmQoJWQpIHN0YXR1cygleClcbiIsIGNoaXAtPmNoaXBfaWR4LCBzdGF0dXMpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciBNU0dfU1RSRUFNX1NFVF9JTl9BVURJT19MRVZFTCBjYXJkKCVkKSBzdGF0dXMoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHN0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTk3Nyw3ICs5ODMsOSBAQAogCiAJZXJyID0gc25kX21peGFydF9zZW5kX21zZyhjaGlwLT5tZ3IsICZyZXF1ZXN0LCBzaXplb2YocmVzcCksICZyZXNwKTsKIAlpZigoZXJyPDApIHx8IHJlc3ApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciBNU0dfQ09OTkVDVE9SX1NFVF9PVVRfQVVESU9fTEVWRUwgY2FyZCglZCkgcmVzcCgleClcbiIsIGNoaXAtPmNoaXBfaWR4LCByZXNwKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZXJyb3IgTVNHX0NPTk5FQ1RPUl9TRVRfT1VUX0FVRElPX0xFVkVMIGNhcmQoJWQpIHJlc3AoJXgpXG4iLAorCQkJY2hpcC0+Y2hpcF9pZHgsIHJlc3ApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCmluZGV4IGZlNzlmZmYuLmRkYzYwMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCisrKyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCkBAIC0zMTgsNyArMzE4LDggQEAKIAlvZmZzZXQgLT0gY2hpcC0+YnVmZmVyX3N0YXJ0OwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gY2hpcC0+YnVmZmVyX3NpemUpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAid3JpdGVfYnVmZmVyIGludmFsaWQgb2Zmc2V0ID0gJWQgc2l6ZSA9ICVkXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ3cml0ZV9idWZmZXIgaW52YWxpZCBvZmZzZXQgPSAlZCBzaXplID0gJWRcbiIsCiAJCQkgICBvZmZzZXQsIHNpemUpOwogCQlyZXR1cm47CiAJfQpAQCAtMzY2LDcgKzM2Nyw4IEBACiAJCSBOTV9SRUNPUkRfUkVHX09GRlNFVCA6IE5NX1BMQVlCQUNLX1JFR19PRkZTRVQpOwogCiAJaWYgKHNuZF9ubTI1Nl9yZWFkYihjaGlwLCBwb2Zmc2V0KSAmIDEpIHsKLQkJc25kX3ByaW50ZCgiTk0yNTY6IEVuZ2luZSB3YXMgZW5hYmxlZCB3aGlsZSBsb2FkaW5nIGNvZWZmaWNpZW50cyFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJOTTI1NjogRW5naW5lIHdhcyBlbmFibGVkIHdoaWxlIGxvYWRpbmcgY29lZmZpY2llbnRzIVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ2Niw3ICs0NjgsOCBAQAogCWlmIChjaGlwLT5pcnEgPCAwKSB7CiAJCWlmIChyZXF1ZXN0X2lycShjaGlwLT5wY2ktPmlycSwgY2hpcC0+aW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgY2hpcC0+cGNpLT5pcnEpOworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgY2hpcC0+cGNpLT5pcnEpOwogCQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pcnFfbXV0ZXgpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQpAQCAtMTAzOSw3ICsxMDQyLDcgQEAKIAlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMSkgewogCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzE7CiAJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMSk7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOwogCQlzbmRfbm0yNTZfd3JpdGV3KGNoaXAsIE5NX0lOVF9SRUcsIDB4ODAwMCk7CiAJCWNieXRlID0gc25kX25tMjU2X3JlYWRiKGNoaXAsIDB4NDAwKTsKIAkJc25kX25tMjU2X3dyaXRlYihjaGlwLCAweDQwMCwgY2J5dGUgfCAyKTsKQEAgLTEwNDgsMTQgKzEwNTEsMTUgQEAKIAlpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMikgewogCQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzI7CiAJCU5NX0FDS19JTlQoY2hpcCwgTk1fTUlTQ19JTlRfMik7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOwogCQljYnl0ZSA9IHNuZF9ubTI1Nl9yZWFkYihjaGlwLCAweDQwMCk7CiAJCXNuZF9ubTI1Nl93cml0ZWIoY2hpcCwgMHg0MDAsIGNieXRlICYgfjIpOwogCX0KIAogCS8qIFVua25vd24gaW50ZXJydXB0LiAqLwogCWlmIChzdGF0dXMpIHsKLQkJc25kX3ByaW50ZCgiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAogCQkJICAgc3RhdHVzKTsKIAkJLyogUHJheS4gKi8KIAkJTk1fQUNLX0lOVChjaGlwLCBzdGF0dXMpOwpAQCAtMTEwNCw3ICsxMTA4LDcgQEAKIAlpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzEpIHsKIAkJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMTsKIAkJTk0yX0FDS19JTlQoY2hpcCwgTk0yX01JU0NfSU5UXzEpOwotCQlzbmRfcHJpbnRkKCJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKIAkJY2J5dGUgPSBzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHg0MDApOwogCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NDAwLCBjYnl0ZSB8IDIpOwogCX0KQEAgLTExMTIsMTQgKzExMTYsMTUgQEAKIAlpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzIpIHsKIAkJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMjsKIAkJTk0yX0FDS19JTlQoY2hpcCwgTk0yX01JU0NfSU5UXzIpOwotCQlzbmRfcHJpbnRkKCJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKIAkJY2J5dGUgPSBzbmRfbm0yNTZfcmVhZGIoY2hpcCwgMHg0MDApOwogCQlzbmRfbm0yNTZfd3JpdGViKGNoaXAsIDB4NDAwLCBjYnl0ZSAmIH4yKTsKIAl9CiAKIAkvKiBVbmtub3duIGludGVycnVwdC4gKi8KIAlpZiAoc3RhdHVzKSB7Ci0JCXNuZF9wcmludGQoIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKIAkJCSAgIHN0YXR1cyk7CiAJCS8qIFByYXkuICovCiAJCU5NMl9BQ0tfSU5UKGNoaXAsIHN0YXR1cyk7CkBAIC0xMjQ1LDcgKzEyNTAsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCXNuZF9wcmludGQoIm5tMjU2OiBhYzk3IGNvZGVjIG5vdCByZWFkeS4uXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm5tMjU2OiBhYzk3IGNvZGVjIG5vdCByZWFkeS4uXG4iKTsKIH0KIAogLyogc3RhdGljIHJlc29sdXRpb24gdGFibGUgKi8KQEAgLTEzNDcsNyArMTM1Miw4IEBACiAKIAl0ZW1wID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmJ1ZmZlcl9hZGRyICsgY2hpcC0+YnVmZmVyX2VuZCAtIDB4NDAwLCAxNik7CiAJaWYgKHRlbXAgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gc2NhbiBmb3IgY2FyZCBzaWduYXR1cmUgaW4gdmlkZW8gUkFNXG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiVW5hYmxlIHRvIHNjYW4gZm9yIGNhcmQgc2lnbmF0dXJlIGluIHZpZGVvIFJBTVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0xMzYxLDEyICsxMzY3LDE0IEBACiAJCWlmIChwb2ludGVyID09IDB4ZmZmZmZmZmYgfHwKIAkJICAgIHBvaW50ZXIgPCBjaGlwLT5idWZmZXJfc2l6ZSB8fAogCQkgICAgcG9pbnRlciA+IGNoaXAtPmJ1ZmZlcl9lbmQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgc2lnbmF0dXJlIGZvdW5kOiAweCV4XG4iLCBwb2ludGVyKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJpbnZhbGlkIHNpZ25hdHVyZSBmb3VuZDogMHgleFxuIiwgcG9pbnRlcik7CiAJCQlpb3VubWFwKHRlbXApOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0gZWxzZSB7CiAJCQlwb2ludGVyX2ZvdW5kID0gcG9pbnRlcjsKLQkJCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBmb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCisJCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJICJmb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCiAJCQkgICAgICAgcG9pbnRlcik7CiAJCX0KIAl9CkBAIC0xNDExLDggKzE0MTksNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm0yNTY6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgotCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE1MjAsMTQgKzE1MjcsMTUgQEAKIAljaGlwLT5yZXNfY3BvcnQgPSByZXF1ZXN0X21lbV9yZWdpb24oY2hpcC0+Y3BvcnRfYWRkciwgTk1fUE9SVDJfU0laRSwKIAkJCQkJICAgICBjYXJkLT5kcml2ZXIpOwogCWlmIChjaGlwLT5yZXNfY3BvcnQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtZW1vcnkgcmVnaW9uIDB4JWx4IChzaXplIDB4JXgpIGJ1c3lcbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAibWVtb3J5IHJlZ2lvbiAweCVseCAoc2l6ZSAweCV4KSBidXN5XG4iLAogCQkJICAgY2hpcC0+Y3BvcnRfYWRkciwgTk1fUE9SVDJfU0laRSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfX2Vycm9yOwogCX0KIAljaGlwLT5jcG9ydCA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5jcG9ydF9hZGRyLCBOTV9QT1JUMl9TSVpFKTsKIAlpZiAoY2hpcC0+Y3BvcnQgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gbWFwIGNvbnRyb2wgcG9ydCAlbHhcbiIsIGNoaXAtPmNwb3J0X2FkZHIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBtYXAgY29udHJvbCBwb3J0ICVseFxuIiwKKwkJCWNoaXAtPmNwb3J0X2FkZHIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpAQCAtMTUzNywxMiArMTU0NSwxNCBAQAogCQlwdmFsID0gc25kX25tMjU2X3JlYWR3KGNoaXAsIE5NX01JWEVSX1BSRVNFTkNFKTsKIAkJaWYgKChwdmFsICYgTk1fUFJFU0VOQ0VfTUFTSykgIT0gTk1fUFJFU0VOQ0VfVkFMVUUpIHsKIAkJCWlmICghIGZvcmNlX2FjOTcpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm5tMjU2OiBubyBhYzk3IGlzIGZvdW5kIVxuIik7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIgIGZvcmNlIHRoZSBkcml2ZXIgdG8gbG9hZCBieSAiCi0JCQkJICAgICAgICJwYXNzaW5nIGluIHRoZSBtb2R1bGUgcGFyYW1ldGVyXG4iKTsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiAgICBmb3JjZV9hYzk3PTFcbiIpOwotCQkJCXByaW50ayhLRVJOX0VSUiAiICBvciB0cnkgc2IxNiwgb3BsM3NhMiwgb3IgIgotCQkJCSAgICAgICAiY3M0MjN4IGRyaXZlcnMgaW5zdGVhZC5cbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkibm8gYWM5NyBpcyBmb3VuZCFcbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkiZm9yY2UgdGhlIGRyaXZlciB0byBsb2FkIGJ5IHBhc3NpbmcgaW4gdGhlIG1vZHVsZSBwYXJhbWV0ZXJcbiIpOworCQkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCQkiIGZvcmNlX2FjOTc9MVxuIik7CisJCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJCSJvciB0cnkgc2IxNiwgb3BsM3NhMiwgb3IgY3M0MjN4IGRyaXZlcnMgaW5zdGVhZC5cbiIpOwogCQkJCWVyciA9IC1FTlhJTzsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CkBAIC0xNTgxLDE0ICsxNTkxLDE0IEBACiAJY2hpcC0+YnVmZmVyX3N0YXJ0ID0gY2hpcC0+YnVmZmVyX2VuZCAtIGNoaXAtPmJ1ZmZlcl9zaXplOwogCWNoaXAtPmJ1ZmZlcl9hZGRyICs9IGNoaXAtPmJ1ZmZlcl9zdGFydDsKIAotCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBNYXBwaW5nIHBvcnQgMSBmcm9tIDB4JXggLSAweCV4XG4iLAorCWRldl9pbmZvKGNhcmQtPmRldiwgIk1hcHBpbmcgcG9ydCAxIGZyb20gMHgleCAtIDB4JXhcbiIsCiAJICAgICAgIGNoaXAtPmJ1ZmZlcl9zdGFydCwgY2hpcC0+YnVmZmVyX2VuZCk7CiAKIAljaGlwLT5yZXNfYnVmZmVyID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNoaXAtPmJ1ZmZlcl9hZGRyLAogCQkJCQkgICAgICBjaGlwLT5idWZmZXJfc2l6ZSwKIAkJCQkJICAgICAgY2FyZC0+ZHJpdmVyKTsKIAlpZiAoY2hpcC0+cmVzX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIm5tMjU2OiBidWZmZXIgMHglbHggKHNpemUgMHgleCkgYnVzeVxuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsICJidWZmZXIgMHglbHggKHNpemUgMHgleCkgYnVzeVxuIiwKIAkJCSAgIGNoaXAtPmJ1ZmZlcl9hZGRyLCBjaGlwLT5idWZmZXJfc2l6ZSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBfX2Vycm9yOwpAQCAtMTU5Niw3ICsxNjA2LDggQEAKIAljaGlwLT5idWZmZXIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YnVmZmVyX2FkZHIsIGNoaXAtPmJ1ZmZlcl9zaXplKTsKIAlpZiAoY2hpcC0+YnVmZmVyID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIG1hcCByaW5nIGJ1ZmZlciBhdCAlbHhcbiIsIGNoaXAtPmJ1ZmZlcl9hZGRyKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gbWFwIHJpbmcgYnVmZmVyIGF0ICVseFxuIiwKKwkJCWNoaXAtPmJ1ZmZlcl9hZGRyKTsKIAkJZ290byBfX2Vycm9yOwogCX0KIApAQCAtMTYyNiw4ICsxNjM3LDYgQEAKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkKIAkJZ290byBfX2Vycm9yOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKmNoaXBfcmV0ID0gY2hpcDsKIAlyZXR1cm4gMDsKIApAQCAtMTY2MCwxMiArMTY2OSwxMiBAQAogCiAJcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbm0yNTZfcXVpcmtzKTsKIAlpZiAocSkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5tMjU2OiBFbmFibGVkIHF1aXJrIGZvciAlcy5cbiIsCisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiRW5hYmxlZCBxdWlyayBmb3IgJXMuXG4iLAogCQkJICAgIHNuZF9wY2lfcXVpcmtfbmFtZShxKSk7CiAJCXN3aXRjaCAocS0+dmFsdWUpIHsKIAkJY2FzZSBOTV9CTEFDS0xJU1RFRDoKLQkJCXByaW50ayhLRVJOX0lORk8gIm5tMjU2OiBUaGUgZGV2aWNlIGlzIGJsYWNrbGlzdGVkLiAiCi0JCQkgICAgICAgIkxvYWRpbmcgc3RvcHBlZFxuIik7CisJCQlkZXZfaW5mbygmcGNpLT5kZXYsCisJCQkJICJUaGUgZGV2aWNlIGlzIGJsYWNrbGlzdGVkLiBMb2FkaW5nIHN0b3BwZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWNhc2UgTk1fUkVTRVRfV09SS0FST1VORF8yOgogCQkJcmVzZXRfd29ya2Fyb3VuZF8yID0gMTsKQEAgLTE2NzYsNyArMTY4NSw3IEBACiAJCX0KIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTY5MSw3ICsxNzAwLDcgQEAKIAkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk5NMjU2WEwrIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgZGV2aWNlIGlkIDB4JXhcbiIsIHBjaS0+ZGV2aWNlKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJpbnZhbGlkIGRldmljZSBpZCAweCV4XG4iLCBwY2ktPmRldmljZSk7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3MTQsMTIgKzE3MjMsMTIgQEAKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCiAJaWYgKHJlc2V0X3dvcmthcm91bmQpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJubTI1NjogcmVzZXRfd29ya2Fyb3VuZCBhY3RpdmF0ZWRcbiIpOworCQlkZXZfZGJnKCZwY2ktPmRldiwgInJlc2V0X3dvcmthcm91bmQgYWN0aXZhdGVkXG4iKTsKIAkJY2hpcC0+cmVzZXRfd29ya2Fyb3VuZCA9IDE7CiAJfQogCiAJaWYgKHJlc2V0X3dvcmthcm91bmRfMikgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5tMjU2OiByZXNldF93b3JrYXJvdW5kXzIgYWN0aXZhdGVkXG4iKTsKKwkJZGV2X2RiZygmcGNpLT5kZXYsICJyZXNldF93b3JrYXJvdW5kXzIgYWN0aXZhdGVkXG4iKTsKIAkJY2hpcC0+cmVzZXRfd29ya2Fyb3VuZF8yID0gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCmluZGV4IDMyNzQ5MDcuLjRiOGEzMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgd3JpdGUgdGltZW91dFxuIik7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyB3cml0ZSB0aW1lb3V0XG4iKTsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3dyaXRlX2FjOTcpOwogCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJCXJlZyBePSAweGZmZmY7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgcmVhZCB0aW1lb3V0IG9uIGNvZGVjICV1XG4iLCBjb2RlYyk7CisJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJBQyc5NyByZWFkIHRpbWVvdXQgb24gY29kZWMgJXVcbiIsIGNvZGVjKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3JlYWRfYWM5Nyk7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAkJCQkJCU9YWUdFTl9TUElfQlVTWSkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJveHlnZW46IFNQSSB3YWl0IHRpbWVvdXRcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAib3h5Z2VuOiBTUEkgd2FpdCB0aW1lb3V0XG4iKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMjg4LDUgKzI4OCw1IEBACiAJCSAgICAgICYgT1hZR0VOX0VFUFJPTV9CVVNZKSkKIAkJCXJldHVybjsKIAl9Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiRUVQUk9NIHdyaXRlIHRpbWVvdXRcbiIpOworCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiRUVQUk9NIHdyaXRlIHRpbWVvdXRcbiIpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwppbmRleCBiMGNiNDhhLi5iNjdlMzA2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJCW94eWdlbl9jbGVhcl9iaXRzOChjaGlwLCBPWFlHRU5fTUlTQywKIAkJCQkgICBPWFlHRU5fTUlTQ19XUklURV9QQ0lfU1VCSUQpOwogCi0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJFRVBST00gSUQgcmVzdG9yZWRcbiIpOworCQlkZXZfaW5mbyhjaGlwLT5jYXJkLT5kZXYsICJFRVBST00gSUQgcmVzdG9yZWRcbiIpOwogCX0KIH0KIApAQCAtNTk1LDcgKzU5NSw4IEBACiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgb3duZXIsIHNpemVvZigqY2hpcCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleCwgaWQsIG93bmVyLAorCQkJICAgc2l6ZW9mKCpjaGlwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC02MTYsMTMgKzYxNywxMyBAQAogCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIERSSVZFUik7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7CiAJCWdvdG8gZXJyX3BjaV9lbmFibGU7CiAJfQogCiAJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMCkgJiBJT1JFU09VUkNFX0lPKSB8fAogCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkgPCBPWFlHRU5fSU9fU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIFBDSSBJL08gcmFuZ2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImludmFsaWQgUENJIEkvTyByYW5nZVxuIik7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBlcnJfcGNpX3JlZ2lvbnM7CiAJfQpAQCAtNjQ4LDcgKzY0OSw2IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gb3h5Z2VuX2NhcmRfZnJlZTsKIAogCWNvbmZpZ3VyZV9wY2llX2JyaWRnZShwY2kpOwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIG94eWdlbl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaW50ZXJydXB0ICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGdyYWIgaW50ZXJydXB0ICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gZXJyX2NhcmQ7CiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwpAQCAtNzk2LDcgKzc5Niw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlZW5hYmxlIGRldmljZSIpOworCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWVuYWJsZSBkZXZpY2UiKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5jIGIvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5jCmluZGV4IGVkNmYxOTkuLjRjZjMyMDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGcuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnLmMKQEAgLTIzOCwxMSArMjM4LDIxIEBACiAJY3M0MjQ1X3dyaXRlX3NwaShjaGlwLCBDUzQyNDVfTUNMS19GUkVRKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2hpZnRfYml0cyh1bnNpZ25lZCBpbnQgdmFsdWUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNoaWZ0X2Zyb20sCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNoaWZ0X3RvLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtYXNrKQoreworCWlmIChzaGlmdF9mcm9tIDwgc2hpZnRfdG8pCisJCXJldHVybiAodmFsdWUgPDwgKHNoaWZ0X3RvIC0gc2hpZnRfZnJvbSkpICYgbWFzazsKKwllbHNlCisJCXJldHVybiAodmFsdWUgPj4gKHNoaWZ0X2Zyb20gLSBzaGlmdF90bykpICYgbWFzazsKK30KKwogdW5zaWduZWQgaW50IGFkanVzdF9kZ19kYWNfcm91dGluZyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJCQkgIHVuc2lnbmVkIGludCBwbGF5X3JvdXRpbmcpCiB7CiAJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQl1bnNpZ25lZCBpbnQgcm91dGluZyA9IDA7CiAKIAlzd2l0Y2ggKGRhdGEtPm91dHB1dF9zZWwpIHsKIAljYXNlIFBMQVlCQUNLX0RTVF9IUDoKQEAgLTI1MiwxNSArMjYyLDIzIEBACiAJCQlPWFlHRU5fUExBWV9NVVRFNjcsIE9YWUdFTl9QTEFZX01VVEVfTUFTSyk7CiAJCWJyZWFrOwogCWNhc2UgUExBWUJBQ0tfRFNUX01VTFRJQ0g6Ci0JCXJvdXRpbmcgPSAoMCA8PCBPWFlHRU5fUExBWV9EQUMwX1NPVVJDRV9TSElGVCkgfAotCQkJICAoMiA8PCBPWFlHRU5fUExBWV9EQUMxX1NPVVJDRV9TSElGVCkgfAotCQkJICAoMSA8PCBPWFlHRU5fUExBWV9EQUMyX1NPVVJDRV9TSElGVCkgfAotCQkJICAoMCA8PCBPWFlHRU5fUExBWV9EQUMzX1NPVVJDRV9TSElGVCk7CiAJCW94eWdlbl93cml0ZThfbWFza2VkKGNoaXAsIE9YWUdFTl9QTEFZX1JPVVRJTkcsCiAJCQlPWFlHRU5fUExBWV9NVVRFMDEsIE9YWUdFTl9QTEFZX01VVEVfTUFTSyk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gcm91dGluZzsKKwlyZXR1cm4gKHBsYXlfcm91dGluZyAmIE9YWUdFTl9QTEFZX0RBQzBfU09VUkNFX01BU0spIHwKKwkgICAgICAgc2hpZnRfYml0cyhwbGF5X3JvdXRpbmcsCisJCQkgIE9YWUdFTl9QTEFZX0RBQzJfU09VUkNFX1NISUZULAorCQkJICBPWFlHRU5fUExBWV9EQUMxX1NPVVJDRV9TSElGVCwKKwkJCSAgT1hZR0VOX1BMQVlfREFDMV9TT1VSQ0VfTUFTSykgfAorCSAgICAgICBzaGlmdF9iaXRzKHBsYXlfcm91dGluZywKKwkJCSAgT1hZR0VOX1BMQVlfREFDMV9TT1VSQ0VfU0hJRlQsCisJCQkgIE9YWUdFTl9QTEFZX0RBQzJfU09VUkNFX1NISUZULAorCQkJICBPWFlHRU5fUExBWV9EQUMyX1NPVVJDRV9NQVNLKSB8CisJICAgICAgIHNoaWZ0X2JpdHMocGxheV9yb3V0aW5nLAorCQkJICBPWFlHRU5fUExBWV9EQUMwX1NPVVJDRV9TSElGVCwKKwkJCSAgT1hZR0VOX1BMQVlfREFDM19TT1VSQ0VfU0hJRlQsCisJCQkgIE9YWUdFTl9QTEFZX0RBQzNfU09VUkNFX01BU0spOwogfQogCiB2b2lkIGR1bXBfY3M0MjQ1X3JlZ2lzdGVycyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2hkbWkuYwppbmRleCAxMzZkYWM2YS4uOTFkOTJiYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCWlmIChjaGlwLT51YXJ0X2lucHV0X2NvdW50ID49IDIgJiYKIAkgICAgY2hpcC0+dWFydF9pbnB1dFtjaGlwLT51YXJ0X2lucHV0X2NvdW50IC0gMl0gPT0gJ08nICYmCiAJICAgIGNoaXAtPnVhcnRfaW5wdXRbY2hpcC0+dWFydF9pbnB1dF9jb3VudCAtIDFdID09ICdLJykgewotCQlwcmludGsoS0VSTl9ERUJVRyAibWVzc2FnZSBmcm9tIEhETUkgY2hpcCByZWNlaXZlZDpcbiIpOworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIm1lc3NhZ2UgZnJvbSBIRE1JIGNoaXAgcmVjZWl2ZWQ6XG4iKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwKIAkJCQkgICAgIGNoaXAtPnVhcnRfaW5wdXQsIGNoaXAtPnVhcnRfaW5wdXRfY291bnQpOwogCQljaGlwLT51YXJ0X2lucHV0X2NvdW50ID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2xpYi5jCmluZGV4IDBlYmU3ZjUuLjcwNmIxYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfbGliLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9saWIuYwpAQCAtNTYsOSArNTYsOSBAQAogCWlmIChoYXNfcG93ZXIgIT0gZGF0YS0+aGFzX3Bvd2VyKSB7CiAJCWRhdGEtPmhhc19wb3dlciA9IGhhc19wb3dlcjsKIAkJaWYgKGhhc19wb3dlcikgewotCQkJc25kX3ByaW50ayhLRVJOX05PVElDRSAicG93ZXIgcmVzdG9yZWRcbiIpOworCQkJZGV2X25vdGljZShjaGlwLT5jYXJkLT5kZXYsICJwb3dlciByZXN0b3JlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fQ1JJVAorCQkJZGV2X2NyaXQoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJCSAgICJIZXkhIERvbid0IHVucGx1ZyB0aGUgcG93ZXIgY2FibGUhXG4iKTsKIAkJCS8qIFRPRE86IHN0b3AgUENNcyAqLwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IGQzNzliMjguLjhkMDk0NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAkJCXJtaC5jbWRfbGVuID0gMzsKIAkJCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgJnJtaCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgQ01EX0FDQ0VTU19JT19XUklURSAiCiAJCQkJCSAgICJmb3IgUExMIHJlZ2lzdGVyIDogJXghXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CkBAIC0zNTcsNyArMzU3LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCS8qIHNldCB0aGUgbmV3IGZyZXF1ZW5jeSAqLwotCXNuZF9wcmludGRkKCJjbG9jayByZWdpc3RlciA6IHNldCAleFxuIiwgdmFsKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiY2xvY2sgcmVnaXN0ZXIgOiBzZXQgJXhcbiIsIHZhbCk7CiAJZXJyID0gcGN4aHJfd3JpdGVfaW9fbnVtX3JlZ19jb250KG1nciwgUENYSFJfRlJFUV9SRUdfTUFTSywKIAkJCQkJICB2YWwsIGNoYW5nZWQpOwogCWlmIChlcnIpCkBAIC0zODAsNyArMzgwLDcgQEAKIAkJbWdyLT5jb2RlY19zcGVlZCA9IHNwZWVkOwkvKiBzYXZlIG5ldyBjb2RlYyBzcGVlZCAqLwogCX0KIAotCXNuZF9wcmludGRkKCJwY3hocl9zdWJfc2V0X2Nsb2NrIHRvICVkSHogKHJlYWxmcmVxPSVkKVxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicGN4aHJfc3ViX3NldF9jbG9jayB0byAlZEh6IChyZWFsZnJlcT0lZClcbiIsCiAJCSAgICByYXRlLCByZWFsZnJlcSk7CiAJcmV0dXJuIDA7CiB9CkBAIC00ODAsNyArNDgwLDcgQEAKIAljYXNlIFJFR19TVEFUVVNfU1lOQ18xOTIwMDAgOglyYXRlID0gMTkyMDAwOyBicmVhazsKIAlkZWZhdWx0OiByYXRlID0gMDsKIAl9Ci0Jc25kX3ByaW50ZGQoIkV4dGVybmFsIGNsb2NrIGlzIGF0ICVkIEh6XG4iLCByYXRlKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiRXh0ZXJuYWwgY2xvY2sgaXMgYXQgJWQgSHpcbiIsIHJhdGUpOwogCSpzYW1wbGVfcmF0ZSA9IHJhdGU7CiAJcmV0dXJuIDA7CiB9CkBAIC01MzcsOCArNTM3LDggQEAKIAogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1IgcGN4aHJfc2V0X3N0cmVhbV9zdGF0ZSBlcnI9JXg7XG4iLAotCQkJICAgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiRVJST1IgcGN4aHJfc2V0X3N0cmVhbV9zdGF0ZSBlcnI9JXg7XG4iLCBlcnIpOwogCXN0cmVhbS0+c3RhdHVzID0KIAkgIHN0YXJ0ID8gUENYSFJfU1RSRUFNX1NUQVRVU19TVEFSVEVEIDogUENYSFJfU1RSRUFNX1NUQVRVU19TVE9QUEVEOwogCXJldHVybiBlcnI7CkBAIC02MjgsNyArNjI4LDggQEAKIAlybWguY21kW3JtaC5jbWRfbGVuKytdID0gKGhlYWRlciAmIDB4ZmYpIDw8IDE2OwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRVJST1IgcGN4aHJfc2V0X2Zvcm1hdCBlcnI9JXg7XG4iLCBlcnIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJFUlJPUiBwY3hocl9zZXRfZm9ybWF0IGVycj0leDtcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjY1LDcgKzY2Niw3IEBACiAJcm1oLmNtZF9sZW4gPSA0OwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVycikKLQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICJFUlJPUiBDTURfVVBEQVRFX1JfQlVGRkVSUyBlcnI9JXg7XG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC03MzUsMTEgKzczNiwxMSBAQAogCX0KIAlpZiAoY2FwdHVyZV9tYXNrID09IDAgJiYgcGxheWJhY2tfbWFzayA9PSAwKSB7CiAJCW11dGV4X3VubG9jaygmbWdyLT5zZXR1cF9tdXRleCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6IG5vIHBpcGVzXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6IG5vIHBpcGVzXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXNuZF9wcmludGRkKCJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInBjeGhyX3RyaWdnZXJfdGFza2xldCA6ICIKIAkJICAgICJwbGF5YmFja19tYXNrPSV4IGNhcHR1cmVfbWFzaz0leFxuIiwKIAkJICAgIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzayk7CiAKQEAgLTc0Nyw3ICs3NDgsNyBAQAogCWVyciA9IHBjeGhyX3NldF9waXBlX3N0YXRlKG1nciwgIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzaywgMCk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJm1nci0+c2V0dXBfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCiAJCQkgICAiZXJyb3Igc3RvcCBwaXBlcyAoUCV4IEMleClcbiIsCiAJCQkgICBwbGF5YmFja19tYXNrLCBjYXB0dXJlX21hc2spOwogCQlyZXR1cm47CkBAIC03OTIsNyArNzkzLDcgQEAKIAllcnIgPSBwY3hocl9zZXRfcGlwZV9zdGF0ZShtZ3IsIHBsYXliYWNrX21hc2ssIGNhcHR1cmVfbWFzaywgMSk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJm1nci0+c2V0dXBfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hocl90cmlnZ2VyX3Rhc2tsZXQgOiAiCiAJCQkgICAiZXJyb3Igc3RhcnQgcGlwZXMgKFAleCBDJXgpXG4iLAogCQkJICAgcGxheWJhY2tfbWFzaywgY2FwdHVyZV9tYXNrKTsKIAkJcmV0dXJuOwpAQCAtODI1LDcgKzgyNiw3IEBACiAKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHX1ZFUkJPU0UKIAlkb19nZXR0aW1lb2ZkYXkoJm15X3R2Mik7Ci0Jc25kX3ByaW50ZGQoIioqKlRSSUdHRVIgVEFTS0xFVCoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgIioqKlRSSUdHRVIgVEFTS0xFVCoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCiAJCSAgICAobG9uZykobXlfdHYyLnR2X3VzZWMgLSBteV90djEudHZfdXNlYyksIGVycik7CiAjZW5kaWYKIH0KQEAgLTkwMiw3ICs5MDMsNyBAQAogCX0KIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBwY3hocl9oYXJkd2FyZV90aW1lciBlcnIoJXgpXG4iLAorCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGN4aHJfaGFyZHdhcmVfdGltZXIgZXJyKCV4KVxuIiwKIAkJCSAgIGVycik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTkxNiw3ICs5MTcsOCBAQAogCXN0cnVjdCBwY3hocl9tZ3IgKm1nciA9IGNoaXAtPm1ncjsKIAlpbnQgZXJyID0gMDsKIAotCXNuZF9wcmludGRkKCJwY3hocl9wcmVwYXJlIDogcGVyaW9kX3NpemUoJWx4KSBwZXJpb2RzKCV4KSBidWZmZXJfc2l6ZSglbHgpXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkicGN4aHJfcHJlcGFyZSA6IHBlcmlvZF9zaXplKCVseCkgcGVyaW9kcygleCkgYnVmZmVyX3NpemUoJWx4KVxuIiwKIAkJICAgIHN1YnMtPnJ1bnRpbWUtPnBlcmlvZF9zaXplLCBzdWJzLT5ydW50aW1lLT5wZXJpb2RzLAogCQkgICAgc3Vicy0+cnVudGltZS0+YnVmZmVyX3NpemUpOwogCkBAIC0xMDI1LDExICsxMDI3LDExIEBACiAJcnVudGltZS0+aHcgPSBwY3hocl9jYXBzOwogCiAJaWYoIHN1YnMtPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLICkgewotCQlzbmRfcHJpbnRkZCgicGN4aHJfb3BlbiBwbGF5YmFjayBjaGlwJWQgc3VicyVkXG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInBjeGhyX29wZW4gcGxheWJhY2sgY2hpcCVkIHN1YnMlZFxuIiwKIAkJCSAgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJc3RyZWFtID0gJmNoaXAtPnBsYXliYWNrX3N0cmVhbVtzdWJzLT5udW1iZXJdOwogCX0gZWxzZSB7Ci0JCXNuZF9wcmludGRkKCJwY3hocl9vcGVuIGNhcHR1cmUgY2hpcCVkIHN1YnMlZFxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJwY3hocl9vcGVuIGNhcHR1cmUgY2hpcCVkIHN1YnMlZFxuIiwKIAkJCSAgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJaWYgKG1nci0+bW9ub19jYXB0dXJlKQogCQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gMTsKQEAgLTEwMzksNyArMTA0MSw3IEBACiAJfQogCWlmIChzdHJlYW0tPnN0YXR1cyAhPSBQQ1hIUl9TVFJFQU1fU1RBVFVTX0ZSRUUpewogCQkvKiBzdHJlYW1zIGluIHVzZSAqLwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl9vcGVuIGNoaXAlZCBzdWJzJWQgaW4gdXNlXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgInBjeGhyX29wZW4gY2hpcCVkIHN1YnMlZCBpbiB1c2VcbiIsCiAJCQkgICBjaGlwLT5jaGlwX2lkeCwgc3Vicy0+bnVtYmVyKTsKIAkJbXV0ZXhfdW5sb2NrKCZtZ3ItPnNldHVwX211dGV4KTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTExMDUsNyArMTEwNyw3IEBACiAKIAltdXRleF9sb2NrKCZtZ3ItPnNldHVwX211dGV4KTsKIAotCXNuZF9wcmludGRkKCJwY3hocl9jbG9zZSBjaGlwJWQgc3VicyVkXG4iLAorCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAicGN4aHJfY2xvc2UgY2hpcCVkIHN1YnMlZFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBzdWJzLT5udW1iZXIpOwogCiAJLyogc2FtcGxlIHJhdGUgcmVsZWFzZWQgKi8KQEAgLTExNjgsNyArMTE3MCw3IEBACiAJaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCAwLAogCQkJICAgICAgIGNoaXAtPm5iX3N0cmVhbXNfcGxheSwKIAkJCSAgICAgICBjaGlwLT5uYl9zdHJlYW1zX2NhcHQsICZwY20pKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBwY20gJXNcbiIsIG5hbWUpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNhbm5vdCBjcmVhdGUgcGNtICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOwpAQCAtMTIxNCw3ICsxMjE2LDcgQEAKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghIGNoaXApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIGNoaXBcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjM5LDcgKzEyNDEsNiBAQAogCX0KIAogCW1nci0+Y2hpcFtpZHhdID0gY2hpcDsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZtZ3ItPnBjaS0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ4OCw3ICsxNDg5LDcgQEAKIAkvKiByZXNldCBib2FyZCBpZiBzb21lIGZpcm13YXJlIHdhcyBsb2FkZWQgKi8KIAlpZihtZ3ItPmRzcF9sb2FkZWQpIHsKIAkJcGN4aHJfcmVzZXRfYm9hcmQobWdyKTsKLQkJc25kX3ByaW50ZGQoInJlc2V0IHBjeGhyICFcbiIpOworCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAicmVzZXQgcGN4aHIgIVxuIik7CiAJfQogCiAJLyogcmVsZWFzZSBpcnEgICovCkBAIC0xNTM3LDggKzE1MzgsOCBAQAogCiAJLyogY2hlY2sgaWYgd2UgY2FuIHJlc3RyaWN0IFBDSSBETUEgdHJhbnNmZXJzIHRvIDMyIGJpdHMgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygzMikpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAiCi0JCQkgICAiMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKCZwY2ktPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTE1ODksNyArMTU5MCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHBjeGhyX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycigmcGNpLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcGN4aHJfZnJlZShtZ3IpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE2MzgsMTAgKzE2MzksMTEgQEAKIAogCQlzbnByaW50Zih0bXBpZCwgc2l6ZW9mKHRtcGlkKSwgIiVzLSVkIiwKIAkJCSBpZFtkZXZdID8gaWRbZGV2XSA6IGNhcmRfbmFtZSwgaSk7Ci0JCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpZHgsIHRtcGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCQllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpZHgsIHRtcGlkLCBUSElTX01PRFVMRSwKKwkJCQkgICAwLCAmY2FyZCk7CiAKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZCAlZFxuIiwgaSk7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZCAlZFxuIiwgaSk7CiAJCQlwY3hocl9mcmVlKG1ncik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfY29yZS5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2NvcmUuYwppbmRleCAzN2I0MzFiLi5kZjkzNzE5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfY29yZS5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9jb3JlLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgInBjeGhyLmgiCkBAIC0xMzIsMTQgKzEzMywxNCBAQAogCQkqcmVhZCA9IFBDWEhSX0lOUEIobWdyLCByZWcpOwogCQlpZiAoKCpyZWFkICYgbWFzaykgPT0gYml0KSB7CiAJCQlpZiAoaSA+IDEwMCkKLQkJCQlzbmRfcHJpbnRkZCgiQVRURU5USU9OISBjaGVja19yZWcoJXgpICIKLQkJCQkJICAgICJsb29wY291bnQ9JWRcbiIsCisJCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkJIkFUVEVOVElPTiEgY2hlY2tfcmVnKCV4KSBsb29wY291bnQ9JWRcbiIsCiAJCQkJCSAgICByZWcsIGkpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSsrOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKIAkJICAgInBjeGhyX2NoZWNrX3JlZ19iaXQ6IHRpbWVvdXQsIHJlZz0leCwgbWFzaz0weCV4LCB2YWw9JXhcbiIsCiAJCSAgIHJlZywgbWFzaywgKnJlYWQpOwogCXJldHVybiAtRUlPOwpAQCAtMjE2LDcgKzIxNyw3IEBACiAJZXJyID0gcGN4aHJfY2hlY2tfcmVnX2JpdChtZ3IsIFBDWEhSX0RTUF9DVlIsICBQQ1hIUl9DVlJfSEkwOF9IQywgMCwKIAkJCQkgIFBDWEhSX1RJTUVPVVRfRFNQLCAmcmVnKTsKIAlpZiAoZXJyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInBjeGhyX3NlbmRfaXRfZHNwIDogVElNRU9VVCBDVlJcbiIpOworCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAicGN4aHJfc2VuZF9pdF9kc3AgOiBUSU1FT1VUIENWUlxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCWlmIChpdGRzcCAmIFBDWEhSX01BU0tfSVRfTUFOQUdFX0hGNSkgewpAQCAtMjI3LDcgKzIyOCw3IEBACiAJCQkJCSAgUENYSFJfVElNRU9VVF9EU1AsCiAJCQkJCSAgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkJICAgInBjeGhyX3NlbmRfaXRfZHNwIDogVElNRU9VVCBIRjVcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMjk0LDcgKzI5NSw3IEBACiAJICovCiAJaWYoc2Vjb25kKSB7CiAJCWlmICgoY2hpcHNjICYgUENYSFJfQ0hJUFNDX0dQSV9VU0VSSSkgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiZXJyb3IgbG9hZGluZyBmaXJzdCB4aWxpbnhcbiIpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgImVycm9yIGxvYWRpbmcgZmlyc3QgeGlsaW54XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qIGFjdGl2YXRlIHNlY29uZCB4aWxpbnggKi8KQEAgLTM2MCw3ICszNjEsNyBAQAogCQkJCQkgIFBDWEhSX0lTUl9ISTA4X1RSRFksCiAJCQkJCSAgUENYSFJfVElNRU9VVF9EU1AsICZkdW1teSk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkJICAgImRzcCBsb2FkaW5nIGVycm9yIGF0IHBvc2l0aW9uICVkXG4iLCBpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTM5Niw3ICszOTcsNyBAQAogCQltc2xlZXAoUENYSFJfV0FJVF9ERUZBVUxUKTsKIAkJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfSUNSLCByZWcpOwogCQltc2xlZXAoUENYSFJfV0FJVF9ERUZBVUxUKTsKLQkJc25kX3ByaW50ZGQoIm5vIG5lZWQgdG8gbG9hZCBlZXByb20gYm9vdFxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJubyBuZWVkIHRvIGxvYWQgZWVwcm9tIGJvb3RcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfSUNSLCByZWcpOwpAQCAtNTYxLDkgKzU2Miw5IEBACiAJCQkJCSAgUENYSFJfSVNSX0hJMDhfUlhERiwKIAkJCQkJICBQQ1hIUl9USU1FT1VUX0RTUCwgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSCBzdGF0OiAiCi0JCQkJICAgIklTUjpSWERGPTEgKElTUiA9ICV4OyBpPSVkIClcbiIsCi0JCQkJICAgcmVnLCBpKTsKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJIkVSUk9SIFJNSCBzdGF0OiBJU1I6UlhERj0xIChJU1IgPSAleDsgaT0lZCApXG4iLAorCQkJCXJlZywgaSk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCS8qIHJlYWQgZGF0YSAqLwpAQCAtNTkxLDEzICs1OTIsMTMgQEAKIAkJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCQlpZiAocm1oLT5jbWRfaWR4IDwgQ01EX0xBU1RfSU5ERVgpCi0JCQlzbmRfcHJpbnRkZCgiICAgIHN0YXRbJWRdPSV4XG4iLCBpLCBkYXRhKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICIgICAgc3RhdFslZF09JXhcbiIsIGksIGRhdGEpOwogI2VuZGlmCiAJCWlmIChpIDwgbWF4X3N0YXRfbGVuKQogCQkJcm1oLT5zdGF0W2ldID0gZGF0YTsKIAl9CiAJaWYgKHJtaC0+c3RhdF9sZW4gPiBtYXhfc3RhdF9sZW4pIHsKLQkJc25kX3ByaW50ZGQoIlBDWEhSIDogcm1oLT5zdGF0X2xlbj0leCB0b28gYmlnXG4iLAorCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiUENYSFIgOiBybWgtPnN0YXRfbGVuPSV4IHRvbyBiaWdcbiIsCiAJCQkgICAgcm1oLT5zdGF0X2xlbik7CiAJCXJtaC0+c3RhdF9sZW4gPSBtYXhfc3RhdF9sZW47CiAJfQpAQCAtNjE1LDcgKzYxNiw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWVyciA9IHBjeGhyX3NlbmRfaXRfZHNwKG1nciwgUENYSFJfSVRfTUVTU0FHRSwgMSk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl9zZW5kX21lc3NhZ2UgOiBFRF9EU1BfQ1JBU0hFRFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkicGN4aHJfc2VuZF9tZXNzYWdlIDogRURfRFNQX0NSQVNIRURcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAkvKiB3YWl0IGZvciBjaGsgYml0ICovCkBAIC02NDEsNyArNjQzLDcgQEAKIAkJZGF0YSAmPSAweGZmN2ZmZjsJLyogTUFTS18xX1dPUkRfQ09NTUFORCAqLwogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWlmIChybWgtPmNtZF9pZHggPCBDTURfTEFTVF9JTkRFWCkKLQkJc25kX3ByaW50ZGQoIk1TRyBjbWRbMF09JXggKCVzKVxuIiwKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgIk1TRyBjbWRbMF09JXggKCVzKVxuIiwKIAkJCSAgICBkYXRhLCBjbWRfbmFtZXNbcm1oLT5jbWRfaWR4XSk7CiAjZW5kaWYKIApAQCAtNjcxLDcgKzY3Myw4IEBACiAJCQlkYXRhID0gcm1oLT5jbWRbaV07CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJCQlpZiAocm1oLT5jbWRfaWR4IDwgQ01EX0xBU1RfSU5ERVgpCi0JCQkJc25kX3ByaW50ZGQoIiAgICBjbWRbJWRdPSV4XG4iLCBpLCBkYXRhKTsKKwkJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCQkiICAgIGNtZFslZF09JXhcbiIsIGksIGRhdGEpOwogI2VuZGlmCiAJCQllcnIgPSBwY3hocl9jaGVja19yZWdfYml0KG1nciwgUENYSFJfRFNQX0lTUiwKIAkJCQkJCSAgUENYSFJfSVNSX0hJMDhfVFJEWSwKQEAgLTY5NywxNCArNzAwLDE1IEBACiAJCQkJCSAgUENYSFJfSVNSX0hJMDhfUlhERiwKIAkJCQkJICBQQ1hIUl9USU1FT1VUX0RTUCwgJnJlZyk7CiAJCWlmIChlcnIpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSDogSVNSOlJYREY9MSAoSVNSID0gJXgpXG4iLCByZWcpOworCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKKwkJCQkiRVJST1IgUk1IOiBJU1I6UlhERj0xIChJU1IgPSAleClcbiIsIHJlZyk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCS8qIHJlYWQgZXJyb3IgY29kZSAqLwogCQlkYXRhICA9IFBDWEhSX0lOUEIobWdyLCBQQ1hIUl9EU1BfVFhIKSA8PCAxNjsKIAkJZGF0YSB8PSBQQ1hIUl9JTlBCKG1nciwgUENYSFJfRFNQX1RYTSkgPDwgODsKIAkJZGF0YSB8PSBQQ1hIUl9JTlBCKG1nciwgUENYSFJfRFNQX1RYTCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkVSUk9SIFJNSCglZCk6IDB4JXhcbiIsCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJFUlJPUiBSTUgoJWQpOiAweCV4XG4iLAogCQkJICAgcm1oLT5jbWRfaWR4LCBkYXRhKTsKIAkJZXJyID0gLUVJTlZBTDsKIAl9IGVsc2UgewpAQCAtNzgwLDcgKzc4NCw3IEBACiAJICogKFBDWEhSX1BJUEVfU1RBVEVfQ0FQVFVSRV9PRkZTRVQpCiAJICovCiAJc3RhcnRfbWFzayAmPSAweGZmZmZmZjsKLQlzbmRfcHJpbnRkZCgiQ01EX1BJUEVfU1RBVEUgTUJPWDI9MHglMDZ4XG4iLCBzdGFydF9tYXNrKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiQ01EX1BJUEVfU1RBVEUgTUJPWDI9MHglMDZ4XG4iLCBzdGFydF9tYXNrKTsKIAlyZXR1cm4gc3RhcnRfbWFzazsKIH0KIApAQCAtODA5LDcgKzgxMyw3IEBACiAJCQl9CiAJCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCQkJaWYgKGVycikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgcGlwZSBzdGFydCAiCiAJCQkJCSAgICIoQ01EX0NBTl9TVEFSVF9QSVBFKSBlcnI9JXghXG4iLAogCQkJCQkgICBlcnIpOwpAQCAtODQ3LDcgKzg1MSw3IEBACiAJCQl9CiAJCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCQkJaWYgKGVycikgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCQkgICAiZXJyb3IgcGlwZSBzdG9wICIKIAkJCQkJICAgIihDTURfU1RPUF9QSVBFKSBlcnI9JXghXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CkBAIC04NzYsNyArODgwLDcgQEAKIAkJCQkJCQkgIDEgPDwgKGF1ZGlvIC0gUENYSFJfUElQRV9TVEFURV9DQVBUVVJFX09GRlNFVCkpOwogCQkJZXJyID0gcGN4aHJfc2VuZF9tc2cobWdyLCAmcm1oKTsKIAkJCWlmIChlcnIpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwKIAkJCQkJICAgImVycm9yIHBpcGUgc3RhcnQgIgogCQkJCQkgICAiKENNRF9DT05GX1BJUEUpIGVycj0leCFcbiIsIGVycik7CiAJCQkJcmV0dXJuIGVycjsKQEAgLTg4OSw3ICs4OTMsNyBAQAogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9TRU5EX0lSUUEpOwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgJnJtaCk7CiAJaWYgKGVycikgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCiAJCQkgICAiZXJyb3IgcGlwZSBzdGFydCAoQ01EX1NFTkRfSVJRQSkgZXJyPSV4IVxuIiwKIAkJCSAgIGVycik7CiAJCXJldHVybiBlcnI7CkBAIC05MTMsNyArOTE3LDggQEAKIAkJICAgICAgKGNhcHR1cmVfbWFzayA8PCBQQ1hIUl9QSVBFX1NUQVRFX0NBUFRVUkVfT0ZGU0VUKSk7CiAJLyogY3VycmVudCBwaXBlIHN0YXRlIChwbGF5YmFjayArIHJlY29yZCkgKi8KIAlzdGF0ZSA9IHBjeGhyX3BpcGVzX3J1bm5pbmcobWdyKTsKLQlzbmRfcHJpbnRkZCgicGN4aHJfc2V0X3BpcGVfc3RhdGUgJXMgKG1hc2sgJXggY3VycmVudCAleClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJInBjeGhyX3NldF9waXBlX3N0YXRlICVzIChtYXNrICV4IGN1cnJlbnQgJXgpXG4iLAogCQkgICAgc3RhcnQgPyAiU1RBUlQiIDogIlNUT1AiLCBhdWRpb19tYXNrLCBzdGF0ZSk7CiAJaWYgKHN0YXJ0KSB7CiAJCS8qIHN0YXJ0IG9ubHkgcGlwZXMgdGhhdCBhcmUgbm90IHlldCBzdGFydGVkICovCkBAIC05NDQsNyArOTQ5LDcgQEAKIAkJaWYgKChzdGF0ZSAmIGF1ZGlvX21hc2spID09IChzdGFydCA/IGF1ZGlvX21hc2sgOiAwKSkKIAkJCWJyZWFrOwogCQlpZiAoKytpID49IE1BWF9XQUlUX0ZPUl9EU1AgKiAxMDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHBpcGUgc3RhcnQvc3RvcFxuIik7CisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGlwZSBzdGFydC9zdG9wXG4iKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJdWRlbGF5KDEwKTsJCQkvKiB3YWl0IDEwIG1pY3Jvc2Vjb25kcyAqLwpAQCAtOTU2LDcgKzk2MSw3IEBACiAJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWRvX2dldHRpbWVvZmRheSgmbXlfdHYyKTsKLQlzbmRfcHJpbnRkZCgiKioqU0VUIFBJUEUgU1RBVEUqKiogVElNRSA9ICVsZCAoZXJyID0gJXgpXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICIqKipTRVQgUElQRSBTVEFURSoqKiBUSU1FID0gJWxkIChlcnIgPSAleClcbiIsCiAJCSAgICAobG9uZykobXlfdHYyLnR2X3VzZWMgLSBteV90djEudHZfdXNlYyksIGVycik7CiAjZW5kaWYKIAlyZXR1cm4gMDsKQEAgLTk3MSw3ICs5NzYsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1nci0+bXNnX2xvY2ssIGZsYWdzKTsKIAlpZiAoKG1nci0+aW9fbnVtX3JlZ19jb250ICYgbWFzaykgPT0gdmFsdWUpIHsKLQkJc25kX3ByaW50ZGQoIklPX05VTV9SRUdfQ09OVCBtYXNrICV4IGFscmVhZHkgaXMgc2V0IHRvICV4XG4iLAorCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJIklPX05VTV9SRUdfQ09OVCBtYXNrICV4IGFscmVhZHkgaXMgc2V0IHRvICV4XG4iLAogCQkJICAgIG1hc2ssIHZhbHVlKTsKIAkJaWYgKGNoYW5nZWQpCiAJCQkqY2hhbmdlZCA9IDA7CkBAIC0xMDI0LDcgKzEwMzAsNyBAQAogCQllcnIgPSAoKGVyciA+PiAxMikgJiAweGZmZik7CiAJaWYgKCFlcnIpCiAJCXJldHVybiAwOwotCXNuZF9wcmludGRkKCJDTURfQVNZTkMgOiBFcnJvciAlcyAlcyBQaXBlICVkIGVycj0leFxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LCAiQ01EX0FTWU5DIDogRXJyb3IgJXMgJXMgUGlwZSAlZCBlcnI9JXhcbiIsCiAJCSAgICBlcnJfc3JjX25hbWVbZXJyX3NyY10sCiAJCSAgICBpc19jYXB0dXJlID8gIlJlY29yZCIgOiAiUGxheSIsIHBpcGUsIGVycik7CiAJaWYgKGVyciA9PSAweGUwMSkKQEAgLTEwNDUsMjAgKzEwNTEsMjQgQEAKIAlpbnQgaSwgajsKIAogCWlmIChtZ3ItPnNyY19pdF9kc3AgJiBQQ1hIUl9JUlFfRlJFUV9DSEFOR0UpCi0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIGV2ZW50IG9jY3VycmVkXG4iKTsKIAlpZiAobWdyLT5zcmNfaXRfZHNwICYgUENYSFJfSVJRX1RJTUVfQ09ERSkKLQkJc25kX3ByaW50ZGQoIlRBU0tMRVQgOiBQQ1hIUl9JUlFfVElNRV9DT0RFIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX1RJTUVfQ09ERSBldmVudCBvY2N1cnJlZFxuIik7CiAJaWYgKG1nci0+c3JjX2l0X2RzcCAmIFBDWEhSX0lSUV9OT1RJRlkpCi0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX05PVElGWSBldmVudCBvY2N1cnJlZFxuIik7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkiVEFTS0xFVCA6IFBDWEhSX0lSUV9OT1RJRlkgZXZlbnQgb2NjdXJyZWRcbiIpOwogCWlmIChtZ3ItPnNyY19pdF9kc3AgJiAoUENYSFJfSVJRX0ZSRVFfQ0hBTkdFIHwgUENYSFJfSVJRX1RJTUVfQ09ERSkpIHsKIAkJLyogY2xlYXIgZXZlbnRzIEZSRVFfQ0hBTkdFIGFuZCBUSU1FX0NPREUgKi8KIAkJcGN4aHJfaW5pdF9ybWgocHJtaCwgQ01EX1RFU1RfSVQpOwogCQllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsIHBybWgpOwotCQlzbmRfcHJpbnRkZCgiQ01EX1RFU1RfSVQgOiBlcnI9JXgsIHN0YXQ9JXhcbiIsCisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJDTURfVEVTVF9JVCA6IGVycj0leCwgc3RhdD0leFxuIiwKIAkJCSAgICBlcnIsIHBybWgtPnN0YXRbMF0pOwogCX0KIAlpZiAobWdyLT5zcmNfaXRfZHNwICYgUENYSFJfSVJRX0FTWU5DKSB7Ci0JCXNuZF9wcmludGRkKCJUQVNLTEVUIDogUENYSFJfSVJRX0FTWU5DIGV2ZW50IG9jY3VycmVkXG4iKTsKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJUQVNLTEVUIDogUENYSFJfSVJRX0FTWU5DIGV2ZW50IG9jY3VycmVkXG4iKTsKIAogCQlwY3hocl9pbml0X3JtaChwcm1oLCBDTURfQVNZTkMpOwogCQlwcm1oLT5jbWRbMF0gfD0gMTsJLyogYWRkIFNFTF9BU1lOQ19FVkVOVFMgKi8KQEAgLTEwNjYsNyArMTA3Niw3IEBACiAJCXBybWgtPnN0YXRfbGVuID0gUENYSFJfU0laRV9NQVhfTE9OR19TVEFUVVM7CiAJCWVyciA9IHBjeGhyX3NlbmRfbXNnKG1nciwgcHJtaCk7CiAJCWlmIChlcnIpCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJFUlJPUiBwY3hocl9tc2dfdGFza2xldD0leDtcbiIsCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiRVJST1IgcGN4aHJfbXNnX3Rhc2tsZXQ9JXg7XG4iLAogCQkJCSAgIGVycik7CiAJCWkgPSAxOwogCQl3aGlsZSAoaSA8IHBybWgtPnN0YXRfbGVuKSB7CkBAIC0xMDc5LDcgKzEwODksOCBAQAogCQkJdTMyIGVycjI7CiAKIAkJCWlmIChwcm1oLT5zdGF0W2ldICYgMHg4MDAwMDApIHsJLyogaWYgQklUX0VORCAqLwotCQkJCXNuZF9wcmludGRkKCJUQVNLTEVUIDogRW5kJXNQaXBlICVkXG4iLAorCQkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJCSJUQVNLTEVUIDogRW5kJXNQaXBlICVkXG4iLAogCQkJCQkgICAgaXNfY2FwdHVyZSA/ICJSZWNvcmQiIDogIlBsYXkiLAogCQkJCQkgICAgcGlwZSk7CiAJCQl9CkBAIC0xMTM2LDcgKzExNDcsOCBAQAogCWh3X3NhbXBsZV9jb3VudCA9ICgodV9pbnQ2NF90KXJtaC5zdGF0WzBdKSA8PCAyNDsKIAlod19zYW1wbGVfY291bnQgKz0gKHVfaW50NjRfdClybWguc3RhdFsxXTsKIAotCXNuZF9wcmludGRkKCJzdHJlYW0gJWMlZCA6IGFicyBzYW1wbGVzIHJlYWwoJWxsdSkgdGltZXIoJWxsdSlcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJInN0cmVhbSAlYyVkIDogYWJzIHNhbXBsZXMgcmVhbCglbGx1KSB0aW1lciglbGx1KVxuIiwKIAkJICAgIHN0cmVhbS0+cGlwZS0+aXNfY2FwdHVyZSA/ICdDJyA6ICdQJywKIAkJICAgIHN0cmVhbS0+c3Vic3RyZWFtLT5udW1iZXIsCiAJCSAgICBod19zYW1wbGVfY291bnQsCkBAIC0xMjAyLDcgKzEyMTQsNyBAQAogCQkJCSh1X2ludDMyX3QpKG5ld19zYW1wbGVfY291bnQgLQogCQkJCQkgICAgc3RyZWFtLT50aW1lcl9hYnNfcGVyaW9kcyk7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LAogCQkJCSAgICJFUlJPUiBuZXdfc2FtcGxlX2NvdW50IHRvbyBzbWFsbCA/Pz8gJWxkXG4iLAogCQkJCSAgIChsb25nIHVuc2lnbmVkIGludCluZXdfc2FtcGxlX2NvdW50KTsKIAkJfQpAQCAtMTI0NywzMyArMTI1OSwzOSBAQAogCQkgICAgKG1nci0+ZHNwX3RpbWVfbGFzdCAhPSBQQ1hIUl9EU1BfVElNRV9JTlZBTElEKSkgewogCQkJLyogaGFuZGxlIGRzcCBjb3VudGVyIHdyYXBhcm91bmQgd2l0aG91dCByZXN5bmMgKi8KIAkJCWludCB0bXBfZGlmZiA9IGRzcF90aW1lX2RpZmYgKyBQQ1hIUl9EU1BfVElNRV9NQVNLICsgMTsKLQkJCXNuZF9wcmludGRkKCJXQVJOSU5HIERTUCB0aW1lc3RhbXAgb2xkKCVkKSBuZXcoJWQpIiwKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJIldBUk5JTkcgRFNQIHRpbWVzdGFtcCBvbGQoJWQpIG5ldyglZCkiLAogCQkJCSAgICBtZ3ItPmRzcF90aW1lX2xhc3QsIGRzcF90aW1lX25ldyk7CiAJCQlpZiAodG1wX2RpZmYgPiAwICYmIHRtcF9kaWZmIDw9ICgyKm1nci0+Z3JhbnVsYXJpdHkpKSB7Ci0JCQkJc25kX3ByaW50ZGQoIi0+IHRpbWVzdGFtcCB3cmFwYXJvdW5kIE9LOiAiCisJCQkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCQkJIi0+IHRpbWVzdGFtcCB3cmFwYXJvdW5kIE9LOiAiCiAJCQkJCSAgICAiZGlmZj0lZFxuIiwgdG1wX2RpZmYpOwogCQkJCWRzcF90aW1lX2RpZmYgPSB0bXBfZGlmZjsKIAkJCX0gZWxzZSB7Ci0JCQkJc25kX3ByaW50ZGQoIi0+IHJlc3luY2hyb25pemUgYWxsIHN0cmVhbXNcbiIpOworCQkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJCSItPiByZXN5bmNocm9uaXplIGFsbCBzdHJlYW1zXG4iKTsKIAkJCQltZ3ItPmRzcF90aW1lX2VycisrOwogCQkJfQogCQl9CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJCWlmIChkc3BfdGltZV9kaWZmID09IDApCi0JCQlzbmRfcHJpbnRkZCgiRVJST1IgRFNQIFRJTUUgTk8gRElGRiB0aW1lKCVkKVxuIiwKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkJIkVSUk9SIERTUCBUSU1FIE5PIERJRkYgdGltZSglZClcbiIsCiAJCQkJICAgIGRzcF90aW1lX25ldyk7CiAJCWVsc2UgaWYgKGRzcF90aW1lX2RpZmYgPj0gKDIqbWdyLT5ncmFudWxhcml0eSkpCi0JCQlzbmRfcHJpbnRkZCgiRVJST1IgRFNQIFRJTUUgVE9PIEJJRyBvbGQoJWQpIGFkZCglZClcbiIsCisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJFUlJPUiBEU1AgVElNRSBUT08gQklHIG9sZCglZCkgYWRkKCVkKVxuIiwKIAkJCQkgICAgbWdyLT5kc3BfdGltZV9sYXN0LAogCQkJCSAgICBkc3BfdGltZV9uZXcgLSBtZ3ItPmRzcF90aW1lX2xhc3QpOwogCQllbHNlIGlmIChkc3BfdGltZV9kaWZmICUgbWdyLT5ncmFudWxhcml0eSkKLQkJCXNuZF9wcmludGRkKCJFUlJPUiBEU1AgVElNRSBpbmNyZWFzZWQgYnkgJWRcbiIsCisJCQlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkJCSJFUlJPUiBEU1AgVElNRSBpbmNyZWFzZWQgYnkgJWRcbiIsCiAJCQkJICAgIGRzcF90aW1lX2RpZmYpOwogI2VuZGlmCiAJCW1nci0+ZHNwX3RpbWVfbGFzdCA9IGRzcF90aW1lX25ldzsKIAogCQlpZiAodGltZXJfdG9nZ2xlID09IG1nci0+dGltZXJfdG9nZ2xlKSB7Ci0JCQlzbmRfcHJpbnRkZCgiRVJST1IgVElNRVIgVE9HR0xFXG4iKTsKKwkJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJFUlJPUiBUSU1FUiBUT0dHTEVcbiIpOwogCQkJbWdyLT5kc3BfdGltZV9lcnIrKzsKIAkJfQogCQltZ3ItPnRpbWVyX3RvZ2dsZSA9IHRpbWVyX3RvZ2dsZTsKQEAgLTEzMDgsNyArMTMyNiw3IEBACiAJfQogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCWlmIChyZWcgJiBQQ1hIUl9GQVRBTF9EU1BfRVJSKQotCQlzbmRfcHJpbnRkZCgiRkFUQUwgRFNQIEVSUk9SIDogJXhcbiIsIHJlZyk7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJGQVRBTCBEU1AgRVJST1IgOiAleFxuIiwgcmVnKTsKICNlbmRpZgogCXNwaW5fdW5sb2NrKCZtZ3ItPmxvY2spOwogCXJldHVybiBJUlFfSEFORExFRDsJLyogdGhpcyBkZXZpY2UgY2F1c2VkIHRoZSBpbnRlcnJ1cHQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9od2RlcC5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKaW5kZXggZDk5NTE3NS4uMTVhOGNlNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKQEAgLTcyLDcgKzcyLDggQEAKIAkvKiB0ZXN0IG1heCBuYiBzdWJzdHJlYW0gcGVyIHBpcGUgKi8KIAlpZiAoKChybWguc3RhdFsxXSA+PiA3KSAmIDB4NUYpIDwgUENYSFJfUExBWUJBQ0tfU1RSRUFNUykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jc25kX3ByaW50ZGQoInN1cHBvcnRlZCBmb3JtYXRzIDogcGxheWJhY2s9JXggY2FwdHVyZT0leFxuIiwKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkic3VwcG9ydGVkIGZvcm1hdHMgOiBwbGF5YmFjaz0leCBjYXB0dXJlPSV4XG4iLAogCQkgICAgcm1oLnN0YXRbMl0sIHJtaC5zdGF0WzNdKTsKIAogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9WRVJTSU9OKTsKQEAgLTg0LDcgKzg1LDggQEAKIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0Jc25kX3ByaW50ZGQoIlBDWEhSIERTUCB2ZXJzaW9uIGlzICVkLiVkLiVkXG4iLCAocm1oLnN0YXRbMF0+PjE2KSYweGZmLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCSJQQ1hIUiBEU1AgdmVyc2lvbiBpcyAlZC4lZC4lZFxuIiwgKHJtaC5zdGF0WzBdPj4xNikmMHhmZiwKIAkJICAgIChybWguc3RhdFswXT4+OCkmMHhmZiwgcm1oLnN0YXRbMF0mMHhmZik7CiAJbWdyLT5kc3BfdmVyc2lvbiA9IHJtaC5zdGF0WzBdOwogCkBAIC0xNzksNyArMTgxLDcgQEAKIAkJc3RyZWFtX2NvdW50ID0gUENYSFJfUExBWUJBQ0tfU1RSRUFNUzsKIAkJYXVkaW9fY291bnQgPSAyOwkvKiBhbHdheXMgc3RlcmVvICovCiAJfQotCXNuZF9wcmludGRkKCJzbmRfYWRkX3JlZl9waXBlIHBpbiglZCkgcGNtJWMwXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJzbmRfYWRkX3JlZl9waXBlIHBpbiglZCkgcGNtJWMwXG4iLAogCQkgICAgcGluLCBpc19jYXB0dXJlID8gJ2MnIDogJ3AnKTsKIAlwaXBlLT5pc19jYXB0dXJlID0gaXNfY2FwdHVyZTsKIAlwaXBlLT5maXJzdF9hdWRpbyA9IHBpbjsKQEAgLTE5NCw3ICsxOTYsNyBAQAogCX0KIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImVycm9yIHBpcGUgYWxsb2NhdGlvbiAiCisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBwaXBlIGFsbG9jYXRpb24gIgogCQkJICAgIihDTURfUkVTX1BJUEUpIGVycj0leCFcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjIyLDE0ICsyMjQsMTQgQEAKIAkvKiBzdG9wIG9uZSBwaXBlICovCiAJZXJyID0gcGN4aHJfc2V0X3BpcGVfc3RhdGUobWdyLCBwbGF5YmFja19tYXNrLCBjYXB0dXJlX21hc2ssIDApOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJlcnJvciBzdG9wcGluZyBwaXBlIVxuIik7CiAJLyogcmVsZWFzZSB0aGUgcGlwZSAqLwogCXBjeGhyX2luaXRfcm1oKCZybWgsIENNRF9GUkVFX1BJUEUpOwogCXBjeGhyX3NldF9waXBlX2NtZF9wYXJhbXMoJnJtaCwgcGlwZS0+aXNfY2FwdHVyZSwgcGlwZS0+Zmlyc3RfYXVkaW8sCiAJCQkJICAwLCAwKTsKIAllcnIgPSBwY3hocl9zZW5kX21zZyhtZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJlcnJvciBwaXBlIHJlbGVhc2UgIgorCQlkZXZfZXJyKCZtZ3ItPnBjaS0+ZGV2LCAiZXJyb3IgcGlwZSByZWxlYXNlICIKIAkJCSAgICIoQ01EX0ZSRUVfUElQRSkgZXJyKCV4KVxuIiwgZXJyKTsKIAlwaXBlLT5zdGF0dXMgPSBQQ1hIUl9QSVBFX1VOREVGSU5FRDsKIAlyZXR1cm4gZXJyOwpAQCAtMjg5LDcgKzI5MSw4IEBACiB7CiAJaW50IGVyciwgY2FyZF9pbmRleDsKIAotCXNuZF9wcmludGRkKCJsb2FkaW5nIGRzcCBbJWRdIHNpemUgPSAlWmRcbiIsIGluZGV4LCBkc3AtPnNpemUpOworCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCSJsb2FkaW5nIGRzcCBbJWRdIHNpemUgPSAlWmRcbiIsIGluZGV4LCBkc3AtPnNpemUpOwogCiAJc3dpdGNoIChpbmRleCkgewogCWNhc2UgUENYSFJfRklSTVdBUkVfWExYX0lOVF9JTkRFWDoKQEAgLTMxMywxOSArMzE2LDE5IEBACiAJCQlyZXR1cm4gZXJyOwogCQlicmVhazsJLyogY29udGludWUgd2l0aCBmaXJzdCBpbml0ICovCiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAid3JvbmcgZmlsZSBpbmRleFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJ3cm9uZyBmaWxlIGluZGV4XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfSAvKiBlbmQgb2Ygc3dpdGNoIGZpbGUgaW5kZXgqLwogCiAJLyogZmlyc3QgY29tbXVuaWNhdGlvbiB3aXRoIGVtYmVkZGVkICovCiAJZXJyID0gcGN4aHJfaW5pdF9ib2FyZChtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hociBjb3VsZCBub3QgYmUgc2V0IHVwXG4iKTsKKwkJZGV2X2VycigmbWdyLT5wY2ktPmRldiwgInBjeGhyIGNvdWxkIG5vdCBiZSBzZXQgdXBcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAllcnIgPSBwY3hocl9jb25maWdfcGlwZXMobWdyKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGN4aHIgcGlwZXMgY291bGQgbm90IGJlIHNldCB1cFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc2V0IHVwXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAgICAgICAgCS8qIGNyZWF0ZSBkZXZpY2VzIGFuZCBtaXhlciBpbiBhY2NvcmRhbmNlIHdpdGggSFcgb3B0aW9ucyovCkBAIC0zNDQsMTAgKzM0NywxMSBAQAogCX0KIAllcnIgPSBwY3hocl9zdGFydF9waXBlcyhtZ3IpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CisJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsICJwY3hociBwaXBlcyBjb3VsZCBub3QgYmUgc3RhcnRlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCXNuZF9wcmludGRkKCJwY3hociBmaXJtd2FyZSBkb3dubG9hZGVkIGFuZCBzdWNjZXNzZnVsbHkgc2V0IHVwXG4iKTsKKwlkZXZfZGJnKCZtZ3ItPnBjaS0+ZGV2LAorCQkicGN4aHIgZmlybXdhcmUgZG93bmxvYWRlZCBhbmQgc3VjY2Vzc2Z1bGx5IHNldCB1cFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM4Miw3ICszODYsOCBAQAogCQkJY29udGludWU7CiAJCXNwcmludGYocGF0aCwgInBjeGhyLyVzIiwgZndfZmlsZXNbZndfc2V0XVtpXSk7CiAJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcGF0aCwgJm1nci0+cGNpLT5kZXYpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocjogY2FuJ3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwKKwkJCWRldl9lcnIoJm1nci0+cGNpLT5kZXYsCisJCQkJInBjeGhyOiBjYW4ndCBsb2FkIGZpcm13YXJlICVzXG4iLAogCQkJCSAgIHBhdGgpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXgyMi5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKaW5kZXggODRmZTU3Ni4uNmE1NmU1MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peDIyLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgpAQCAtMjkwLDcgKzI5MSw4IEBACiAJcmVnID0gUENYSFJfSU5QQihtZ3IsIFBDWEhSX1hMWF9TVEFUVVMpOwogCWlmIChyZWcgJiBQQ1hIUl9TVEFUX01JQ19DQVBTKQogCQltZ3ItPmJvYXJkX2hhc19taWMgPSAxOwkvKiBtaWNyb3Bob25lIGF2YWlsYWJsZSAqLwotCXNuZF9wcmludGRkKCJNSUMgaW5wdXQgYXZhaWxhYmxlID0gJWRcbiIsIG1nci0+Ym9hcmRfaGFzX21pYyk7CisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJIk1JQyBpbnB1dCBhdmFpbGFibGUgPSAlZFxuIiwgbWdyLT5ib2FyZF9oYXNfbWljKTsKIAogCS8qIHJlc2V0IGNvZGVjICovCiAJUENYSFJfT1VUUEIobWdyLCBQQ1hIUl9EU1BfUkVTRVQsCkBAIC00MDUsNyArNDA3LDcgQEAKIAogCWhyMjIyX2NvbmZpZ19ha20obWdyLCBBS01fVU5NVVRFX0NNRCk7CiAKLQlzbmRfcHJpbnRkZCgic2V0X2Nsb2NrIHRvICVkSHogKHJlYWxmcmVxPSVkIHBsbHJlZz0leClcbiIsCisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgInNldF9jbG9jayB0byAlZEh6IChyZWFsZnJlcT0lZCBwbGxyZWc9JXgpXG4iLAogCQkgICAgcmF0ZSwgcmVhbGZyZXEsIHBsbHJlZyk7CiAJcmV0dXJuIDA7CiB9CkBAIC00MzEsMTMgKzQzMywxNSBAQAogCQlyZWcgPSBQQ1hIUl9TVEFUX0ZSRVFfVUVSMV9NQVNLOwogCiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZGQoImdldF9leHRlcm5hbF9jbG9jayA6IHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwKKwkJCSJnZXRfZXh0ZXJuYWxfY2xvY2sgOiB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQkgICAgY2xvY2tfdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOyAvKiBvdGhlciBjbG9ja3Mgbm90IHN1cHBvcnRlZCAqLwogCX0KIAogCWlmICgoUENYSFJfSU5QQihtZ3IsIFBDWEhSX1hMWF9DU1VFUikgJiBtYXNrKSAhPSBtYXNrKSB7Ci0JCXNuZF9wcmludGRkKCJnZXRfZXh0ZXJuYWxfY2xvY2soJWQpID0gMCBIelxuIiwgY2xvY2tfdHlwZSk7CisJCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsCisJCQkiZ2V0X2V4dGVybmFsX2Nsb2NrKCVkKSA9IDAgSHpcbiIsIGNsb2NrX3R5cGUpOwogCQkqc2FtcGxlX3JhdGUgPSAwOwogCQlyZXR1cm4gMDsgLyogbm8gZXh0ZXJuYWwgY2xvY2sgbG9ja2VkICovCiAJfQpAQCAtNDk1LDcgKzQ5OSw3IEBACiAJZWxzZQogCQlyYXRlID0gMDsKIAotCXNuZF9wcmludGRkKCJFeHRlcm5hbCBjbG9jayBpcyBhdCAlZCBIeiAobWVhc3VyZWQgJWQgSHopXG4iLAorCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJFeHRlcm5hbCBjbG9jayBpcyBhdCAlZCBIeiAobWVhc3VyZWQgJWQgSHopXG4iLAogCQkgICAgcmF0ZSwgY2FsY19yYXRlKTsKIAkqc2FtcGxlX3JhdGUgPSByYXRlOwogCXJldHVybiAwOwpAQCAtNTQyLDcgKzU0Niw4IEBACiBpbnQgaHIyMjJfdXBkYXRlX2FuYWxvZ19hdWRpb19sZXZlbChzdHJ1Y3Qgc25kX3BjeGhyICpjaGlwLAogCQkJCSAgICBpbnQgaXNfY2FwdHVyZSwgaW50IGNoYW5uZWwpCiB7Ci0Jc25kX3ByaW50ZGQoImhyMjIyX3VwZGF0ZV9hbmFsb2dfYXVkaW9fbGV2ZWwoJXMgY2hhbj0lZClcbiIsCisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCSJocjIyMl91cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsKCVzIGNoYW49JWQpXG4iLAogCQkgICAgaXNfY2FwdHVyZSA/ICJjYXB0dXJlIiA6ICJwbGF5YmFjayIsIGNoYW5uZWwpOwogCWlmIChpc19jYXB0dXJlKSB7CiAJCWludCBsZXZlbF9sLCBsZXZlbF9yLCBsZXZlbF9taWM7CkBAIC02NDIsNyArNjQ3LDcgQEAKIAkJaWYgKFBDWEhSX0lOUEIoY2hpcC0+bWdyLCBQQ1hIUl9YTFhfQ1NVRVIpICYgbWFzaykKIAkJCXRlbXAgfD0gMTsKIAl9Ci0Jc25kX3ByaW50ZGQoInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBhZXNfaWR4LCB0ZW1wKTsKIAkqYWVzX2JpdHMgPSB0ZW1wOwogCXJldHVybiAwOwpAQCAtNjg0LDcgKzY4OSw3IEBACiAKIAlQQ1hIUl9PVVRQQihtZ3IsIFBDWEhSX1hMWF9TRUxNSUMsIG1nci0+eGx4X3NlbG1pYyk7CiAKLQlzbmRfcHJpbnRkZCgiaHIyMjJfbWljcm9fYm9vc3QgOiBzZXQgJXhcbiIsIGJvb3N0X21hc2spOworCWRldl9kYmcoJm1nci0+cGNpLT5kZXYsICJocjIyMl9taWNyb19ib29zdCA6IHNldCAleFxuIiwgYm9vc3RfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGhyMjIyX3BoYW50b21fcG93ZXIoc3RydWN0IHBjeGhyX21nciAqbWdyLCBpbnQgcG93ZXIpCkBAIC02OTYsNyArNzAxLDcgQEAKIAogCVBDWEhSX09VVFBCKG1nciwgUENYSFJfWExYX1NFTE1JQywgbWdyLT54bHhfc2VsbWljKTsKIAotCXNuZF9wcmludGRkKCJocjIyMl9waGFudG9tX3Bvd2VyIDogc2V0ICVkXG4iLCBwb3dlcik7CisJZGV2X2RiZygmbWdyLT5wY2ktPmRldiwgImhyMjIyX3BoYW50b21fcG93ZXIgOiBzZXQgJWRcbiIsIHBvd2VyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfbWl4ZXIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCmluZGV4IGZlYzA0OTMuLjk1Yzk1NzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCkBAIC03Miw3ICs3Miw4IEBACiAJcm1oLmNtZF9sZW4gPSAzOwogCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJlcnJvciB1cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsIGNhcmQoJWQpIgorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciB1cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsIGNhcmQoJWQpIgogCQkJICAgIiBpc19jYXB0dXJlKCVkKSBlcnIoJXgpXG4iLAogCQkJICAgY2hpcC0+Y2hpcF9pZHgsIGlzX2NhcHR1cmUsIGVycik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjg0LDcgKzI4NSw3IEBACiAKIAllcnIgPSBwY3hocl9zZW5kX21zZyhjaGlwLT5tZ3IsICZybWgpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgdXBkYXRlX3BsYXliYWNrX3N0cmVhbV9sZXZlbCAiCisJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZXJyb3IgdXBkYXRlX3BsYXliYWNrX3N0cmVhbV9sZXZlbCAiCiAJCQkgICAiY2FyZCglZCkgZXJyKCV4KVxuIiwgY2hpcC0+Y2hpcF9pZHgsIGVycik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMzNSw3ICszMzYsOCBAQAogCiAJZXJyID0gcGN4aHJfc2VuZF9tc2coY2hpcC0+bWdyLCAmcm1oKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIHVwZGF0ZV9hdWRpb19sZXZlbCglZCkgZXJyPSV4XG4iLAorCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJlcnJvciB1cGRhdGVfYXVkaW9fbGV2ZWwoJWQpIGVycj0leFxuIiwKIAkJCSAgIGNoaXAtPmNoaXBfaWR4LCBlcnIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05MzAsNyArOTMyLDcgQEAKIAkJCQl0ZW1wIHw9IDE7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgInJlYWQgaWVjOTU4IEFFUyAlZCBieXRlICVkID0gMHgleFxuIiwKIAkJICAgIGNoaXAtPmNoaXBfaWR4LCBhZXNfaWR4LCB0ZW1wKTsKIAkqYWVzX2JpdHMgPSB0ZW1wOwogCXJldHVybiAwOwpAQCAtOTkyLDcgKzk5NCw4IEBACiAJCQlybWguY21kWzBdIHw9IElPX05VTV9SRUdfQ1VFUjsKIAkJCXJtaC5jbWRbMV0gPSBjbWQ7CiAJCQlybWguY21kX2xlbiA9IDI7Ci0JCQlzbmRfcHJpbnRkZCgid3JpdGUgaWVjOTU4IEFFUyAlZCBieXRlICVkIGJpdCAlZCAoY21kICV4KVxuIiwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJ3cml0ZSBpZWM5NTggQUVTICVkIGJ5dGUgJWQgYml0ICVkIChjbWQgJXgpXG4iLAogCQkJCSAgICBjaGlwLT5jaGlwX2lkeCwgYWVzX2lkeCwgaSwgY21kKTsKIAkJCWVyciA9IHBjeGhyX3NlbmRfbXNnKGNoaXAtPm1nciwgJnJtaCk7CiAJCQlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCmluZGV4IDU2Y2M4OTEuLmI0YTgyNzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYworKysgYi9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKQEAgLTE5MTYsOCArMTkxNiw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJjaGlwID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwODYsNyArMjA4NCw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IHNuZF9yaXB0aWRlX2NyZWF0ZShjYXJkLCBwY2ksICZjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWUzMi5jIGIvc291bmQvcGNpL3JtZTMyLmMKaW5kZXggY2MyNjM0Ni4uY2MyZjBjMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTMyLmMKKysrIGIvc291bmQvcGNpL3JtZTMyLmMKQEAgLTEzNDksMTQgKzEzNDksMTUgQEAKIAogCXJtZTMyLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocm1lMzItPnBvcnQsIFJNRTMyX0lPX1NJWkUpOwogCWlmICghcm1lMzItPmlvYmFzZSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwKKwkJZGV2X2VycihybWUzMi0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAogCQkJICAgcm1lMzItPnBvcnQsIHJtZTMyLT5wb3J0ICsgUk1FMzJfSU9fU0laRSAtIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWUzMl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHJtZTMyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihybWUzMi0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXJtZTMyLT5pcnEgPSBwY2ktPmlycTsKQEAgLTE5MzgsMTUgKzE5MzksMTQgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBybWUzMiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgcm1lMzIpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3JtZTMyX2NhcmRfZnJlZTsKIAlybWUzMiA9IChzdHJ1Y3Qgcm1lMzIgKikgY2FyZC0+cHJpdmF0ZV9kYXRhOwogCXJtZTMyLT5jYXJkID0gY2FyZDsKIAlybWUzMi0+cGNpID0gcGNpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKICAgICAgICAgaWYgKGZ1bGxkdXBsZXhbZGV2XSkKIAkJcm1lMzItPmZ1bGxkdXBsZXhfbW9kZSA9IDE7CiAJaWYgKChlcnIgPSBzbmRfcm1lMzJfY3JlYXRlKHJtZTMyKSkgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTYuYyBiL3NvdW5kL3BjaS9ybWU5Ni5jCmluZGV4IDAyMzYzNjMuLjc2MTY5OTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5Ni5jCisrKyBiL3NvdW5kL3BjaS9ybWU5Ni5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAogCXU4IHJldjsgLyogY2FyZCByZXZpc2lvbiBudW1iZXIgKi8KIAotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXUzMiBwbGF5YmFja19wb2ludGVyOwogCXUzMiBjYXB0dXJlX3BvaW50ZXI7CiAJdm9pZCAqcGxheWJhY2tfc3VzcGVuZF9idWZmZXI7CkBAIC0xNTcwLDcgKzE1NzAsNyBAQAogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHJtZTk2LT5wY2kpOwogCQlybWU5Ni0+cG9ydCA9IDA7CiAJfQotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXZmcmVlKHJtZTk2LT5wbGF5YmFja19zdXNwZW5kX2J1ZmZlcik7CiAJdmZyZWUocm1lOTYtPmNhcHR1cmVfc3VzcGVuZF9idWZmZXIpOwogI2VuZGlmCkBAIC0xNjA5LDEzICsxNjA5LDE1IEBACiAKIAlybWU5Ni0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJtZTk2LT5wb3J0LCBSTUU5Nl9JT19TSVpFKTsKIAlpZiAoIXJtZTk2LT5pb2Jhc2UpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsIHJtZTk2LT5wb3J0LCBybWU5Ni0+cG9ydCArIFJNRTk2X0lPX1NJWkUgLSAxKTsKKwkJZGV2X2VycihybWU5Ni0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAorCQkJcm1lOTYtPnBvcnQsIHJtZTk2LT5wb3J0ICsgUk1FOTZfSU9fU0laRSAtIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWU5Nl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHJtZTk2KSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihybWU5Ni0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXJtZTk2LT5pcnEgPSBwY2ktPmlycTsKQEAgLTIzNzIsMTMgKzIzNzQsMTIgQEAKICAqIENhcmQgaW5pdGlhbGlzYXRpb24KICAqLwogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAKLXN0YXRpYyBpbnQKLXNuZF9ybWU5Nl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCSAgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBybWU5Nl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBybWU5NiAqcm1lOTYgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CkBAIC0yNDA3LDE1ICsyNDA4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXNuZF9ybWU5Nl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3N0YXRpYyBpbnQgcm1lOTZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBybWU5NiAqcm1lOTYgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInJtZTk2OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgZGlzYWJsaW5nIGRldmljZVxuIik7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI0NTEsNyArMjQ1MiwxMSBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhybWU5Nl9wbSwgcm1lOTZfc3VzcGVuZCwgcm1lOTZfcmVzdW1lKTsKKyNkZWZpbmUgUk1FOTZfUE1fT1BTCSZybWU5Nl9wbQorI2Vsc2UKKyNkZWZpbmUgUk1FOTZfUE1fT1BTCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIHZvaWQgc25kX3JtZTk2X2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CkBAIC0yNDc1LDMxICsyNDgwLDMwIEBACiAJCWRldisrOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBybWU5NiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgcm1lOTYpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX3JtZTk2X2NhcmRfZnJlZTsKIAlybWU5NiA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlybWU5Ni0+Y2FyZCA9IGNhcmQ7CiAJcm1lOTYtPnBjaSA9IHBjaTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJaWYgKChlcnIgPSBzbmRfcm1lOTZfY3JlYXRlKHJtZTk2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCQotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCXJtZTk2LT5wbGF5YmFja19zdXNwZW5kX2J1ZmZlciA9IHZtYWxsb2MoUk1FOTZfQlVGRkVSX1NJWkUpOwogCWlmICghcm1lOTYtPnBsYXliYWNrX3N1c3BlbmRfYnVmZmVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJZGV2X2VycihjYXJkLT5kZXYsCiAJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHBsYXliYWNrIHN1c3BlbmQgYnVmZmVyIVxuIik7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlybWU5Ni0+Y2FwdHVyZV9zdXNwZW5kX2J1ZmZlciA9IHZtYWxsb2MoUk1FOTZfQlVGRkVSX1NJWkUpOwogCWlmICghcm1lOTYtPmNhcHR1cmVfc3VzcGVuZF9idWZmZXIpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQlkZXZfZXJyKGNhcmQtPmRldiwKIAkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY2FwdHVyZSBzdXNwZW5kIGJ1ZmZlciFcbiIpOwogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI1NDgsMTAgKzI1NTIsOSBAQAogCS5pZF90YWJsZSA9IHNuZF9ybWU5Nl9pZHMsCiAJLnByb2JlID0gc25kX3JtZTk2X3Byb2JlLAogCS5yZW1vdmUgPSBzbmRfcm1lOTZfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gc25kX3JtZTk2X3N1c3BlbmQsCi0JLnJlc3VtZSA9IHNuZF9ybWU5Nl9yZXN1bWUsCi0jZW5kaWYKKwkuZHJpdmVyID0geworCQkucG0gPSBSTUU5Nl9QTV9PUFMsCisJfSwKIH07CiAKIG1vZHVsZV9wY2lfZHJpdmVyKHJtZTk2X2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggYmQ5MGM4MC4uNGM2ZjVkMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpAQCAtNjc1LDE0ICs2NzUsMTUgQEAKIAkJaWYgKDAgPT0gKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmCiAJCQkJCUhEU1BfQ29uZmlnRXJyb3IpKSB7CiAJCQlpZiAoaSkgewotCQkJCXNuZF9wcmludGQoIkhhbW1lcmZhbGwtRFNQOiBJTyBib3ggZm91bmQgYWZ0ZXIgJWQgbXNcbiIsCisJCQkJZGV2X2RiZyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJJTyBib3ggZm91bmQgYWZ0ZXIgJWQgbXNcbiIsCiAJCQkJCQkoMjAgKiBpKSk7CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQogCQltc2xlZXAoMjApOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogbm8gSU8gYm94IGNvbm5lY3RlZCFcbiIpOworCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LCAibm8gSU8gYm94IGNvbm5lY3RlZCFcbiIpOwogCWhkc3AtPnN0YXRlICY9IH5IRFNQX0Zpcm13YXJlTG9hZGVkOwogCXJldHVybiAtRUlPOwogfQpAQCAtNjk5LDEzICs3MDAsMTMgQEAKIAkJaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfQ29uZmlnRXJyb3IpCiAJCQltc2xlZXAoZGVsYXkpOwogCQllbHNlIHsKLQkJCXNuZF9wcmludGQoIkhhbW1lcmZhbGwtRFNQOiBpb2JveCBmb3VuZCBhZnRlciAldW1zIVxuIiwKKwkJCWRldl9kYmcoaGRzcC0+Y2FyZC0+ZGV2LCAiaW9ib3ggZm91bmQgYWZ0ZXIgJXVtcyFcbiIsCiAJCQkJICAgaSAqIGRlbGF5KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IG5vIElPIGJveCBjb25uZWN0ZWQhXG4iKTsKKwlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJubyBJTyBib3ggY29ubmVjdGVkIVxuIik7CiAJaGRzcC0+c3RhdGUgJj0gfkhEU1BfRmlybXdhcmVMb2FkZWQ7CiAJcmV0dXJuIC1FSU87CiB9CkBAIC03MjgsMTMgKzcyOSwxNCBAQAogCiAJaWYgKChoZHNwX3JlYWQgKGhkc3AsIEhEU1Bfc3RhdHVzUmVnaXN0ZXIpICYgSERTUF9EbGxFcnJvcikgIT0gMCkgewogCi0JCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogbG9hZGluZyBmaXJtd2FyZVxuIik7CisJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgImxvYWRpbmcgZmlybXdhcmVcbiIpOwogCiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIEhEU1BfU19QUk9HUkFNKTsKIAkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9maWZvRGF0YSwgMCk7CiAKIAkJaWYgKGhkc3BfZmlmb193YWl0IChoZHNwLCAwLCBIRFNQX0xPTkdfV0FJVCkpIHsKLQkJCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogdGltZW91dCB3YWl0aW5nIGZvciBkb3dubG9hZCBwcmVwYXJhdGlvblxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGRvd25sb2FkIHByZXBhcmF0aW9uXG4iKTsKIAkJCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9TMjAwKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC03NDQsNyArNzQ2LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IEhEU1BfRklSTVdBUkVfU0laRSAvIDQ7ICsraSkgewogCQkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCBjYWNoZVtpXSk7CiAJCQlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDEyNywgSERTUF9MT05HX1dBSVQpKSB7Ci0JCQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiB0aW1lb3V0IGR1cmluZyBmaXJtd2FyZSBsb2FkaW5nXG4iKTsKKwkJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSAidGltZW91dCBkdXJpbmcgZmlybXdhcmUgbG9hZGluZ1xuIik7CiAJCQkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2wyUmVnLCBIRFNQX1MyMDApOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQpAQCAtNzYwLDExICs3NjMsMTIgQEAKIAkJaGRzcC0+Y29udHJvbDJfcmVnaXN0ZXIgPSAwOwogI2VuZGlmCiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIGhkc3AtPmNvbnRyb2wyX3JlZ2lzdGVyKTsKLQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiBmaW5pc2hlZCBmaXJtd2FyZSBsb2FkaW5nXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LCAiZmluaXNoZWQgZmlybXdhcmUgbG9hZGluZ1xuIik7CiAKIAl9CiAJaWYgKGhkc3AtPnN0YXRlICYgSERTUF9Jbml0aWFsaXphdGlvbkNvbXBsZXRlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJIYW1tZXJmYWxsLURTUDogZmlybXdhcmUgbG9hZGVkIGZyb20gY2FjaGUsIHJlc3RvcmluZyBkZWZhdWx0c1xuIik7CisJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwKKwkJCSAiZmlybXdhcmUgbG9hZGVkIGZyb20gY2FjaGUsIHJlc3RvcmluZyBkZWZhdWx0c1xuIik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoZHNwLT5sb2NrLCBmbGFncyk7CiAJCXNuZF9oZHNwX3NldF9kZWZhdWx0cyhoZHNwKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGRzcC0+bG9jaywgZmxhZ3MpOwpAQCAtNzkxLDcgKzc5NSw3IEBACiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfZmlmb0RhdGEsIDApOwogCQlpZiAoaGRzcF9maWZvX3dhaXQoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKSA8IDApIHsKIAkJCWhkc3AtPmlvX3R5cGUgPSBNdWx0aWZhY2U7Ci0JCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogTXVsdGlmYWNlIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgIk11bHRpZmFjZSBmb3VuZFxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC03OTksNyArODAzLDcgQEAKIAkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKIAkJaWYgKGhkc3BfZmlmb193YWl0KGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkgPT0gMCkgewogCQkJaGRzcC0+aW9fdHlwZSA9IERpZ2lmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IERpZ2lmYWNlIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwgIkRpZ2lmYWNlIGZvdW5kXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTgwOCw3ICs4MTIsNyBAQAogCQloZHNwX3dyaXRlKGhkc3AsIEhEU1BfZmlmb0RhdGEsIDApOwogCQlpZiAoaGRzcF9maWZvX3dhaXQoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKSA9PSAwKSB7CiAJCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE11bHRpZmFjZSBmb3VuZFxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJNdWx0aWZhY2UgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtODE3LDEyICs4MjEsMTIgQEAKIAkJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZpZm9EYXRhLCAwKTsKIAkJaWYgKGhkc3BfZmlmb193YWl0KGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkgPCAwKSB7CiAJCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOwotCQkJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IE11bHRpZmFjZSBmb3VuZFxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsICJNdWx0aWZhY2UgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCQloZHNwLT5pb190eXBlID0gUlBNOwotCQlzbmRfcHJpbnRrKCJIYW1tZXJmYWxsLURTUDogUlBNIGZvdW5kXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LCAiUlBNIGZvdW5kXG4iKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJLyogZmlybXdhcmUgd2FzIGFscmVhZHkgbG9hZGVkLCBnZXQgaW9ib3ggdHlwZSAqLwpAQCAtODQ3LDIwICs4NTEsMTggQEAKIAkJaGRzcC0+c3RhdGUgJj0gfkhEU1BfRmlybXdhcmVMb2FkZWQ7CiAJCWlmICghIGxvYWRfb25fZGVtYW5kKQogCQkJcmV0dXJuIC1FSU87Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiBmaXJtd2FyZSBub3QgcHJlc2VudC5cbiIpOworCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwgImZpcm13YXJlIG5vdCBwcmVzZW50LlxuIik7CiAJCS8qIHRyeSB0byBsb2FkIGZpcm13YXJlICovCiAJCWlmICghIChoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVDYWNoZWQpKSB7CiAJCQlpZiAoISBoZHNwX3JlcXVlc3RfZndfbG9hZGVyKGhkc3ApKQogCQkJCXJldHVybiAwOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCSAgICJIYW1tZXJmYWxsLURTUDogTm8gZmlybXdhcmUgbG9hZGVkIG5vciAiCi0JCQkJICAgImNhY2hlZCwgcGxlYXNlIHVwbG9hZCBmaXJtd2FyZS5cbiIpOworCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJICAgIk5vIGZpcm13YXJlIGxvYWRlZCBub3IgY2FjaGVkLCBwbGVhc2UgdXBsb2FkIGZpcm13YXJlLlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlpZiAoc25kX2hkc3BfbG9hZF9maXJtd2FyZV9mcm9tX2NhY2hlKGhkc3ApICE9IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCQkgICAiSGFtbWVyZmFsbC1EU1A6IEZpcm13YXJlIGxvYWRpbmcgZnJvbSAiCi0JCQkJICAgImNhY2hlIGZhaWxlZCwgcGxlYXNlIHVwbG9hZCBtYW51YWxseS5cbiIpOworCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJICAgIkZpcm13YXJlIGxvYWRpbmcgZnJvbSBjYWNoZSBmYWlsZWQsIHBsZWFzZSB1cGxvYWQgbWFudWFsbHkuXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQpAQCAtODg4LDcgKzg5MCw4IEBACiAJCXVkZWxheSAoMTAwKTsKIAl9CiAKLQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHdhaXQgZm9yIEZJRk8gc3RhdHVzIDw9ICVkIGZhaWxlZCBhZnRlciAlZCBpdGVyYXRpb25zXG4iLAorCWRldl93YXJuKGhkc3AtPmNhcmQtPmRldiwKKwkJICJ3YWl0IGZvciBGSUZPIHN0YXR1cyA8PSAlZCBmYWlsZWQgYWZ0ZXIgJWQgaXRlcmF0aW9uc1xuIiwKIAkJICAgIGNvdW50LCB0aW1lb3V0KTsKIAlyZXR1cm4gLTE7CiB9CkBAIC0xMDA1LDcgKzEwMDgsOSBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlzbmRfcHJpbnRrICgiSGFtbWVyZmFsbC1EU1A6IHVua25vd24gc3BkaWYgZnJlcXVlbmN5IHN0YXR1czsgYml0cyA9IDB4JXgsIHN0YXR1cyA9IDB4JXhcbiIsIHJhdGVfYml0cywgc3RhdHVzKTsKKwlkZXZfd2FybihoZHNwLT5jYXJkLT5kZXYsCisJCSAidW5rbm93biBzcGRpZiBmcmVxdWVuY3kgc3RhdHVzOyBiaXRzID0gMHgleCwgc3RhdHVzID0gMHgleFxuIiwKKwkJIHJhdGVfYml0cywgc3RhdHVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzOSw3ICsxMTQ0LDggQEAKIAlpZiAoIShoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9DbG9ja01vZGVNYXN0ZXIpKSB7CiAJCWlmIChjYWxsZWRfaW50ZXJuYWxseSkgewogCQkJLyogcmVxdWVzdCBmcm9tIGN0bCBvciBjYXJkIGluaXRpYWxpemF0aW9uICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyOiBjYW5ub3Qgc2V0IHNhbXBsZSByYXRlLlxuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyOiBjYW5ub3Qgc2V0IHNhbXBsZSByYXRlLlxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0gZWxzZSB7CiAJCQkvKiBod19wYXJhbSByZXF1ZXN0IHdoaWxlIGluIEF1dG9TeW5jIG1vZGUgKi8KQEAgLTExNDcsMTEgKzExNTMsMTQgQEAKIAkJCWludCBzcGRpZl9mcmVxID0gaGRzcF9zcGRpZl9zYW1wbGVfcmF0ZShoZHNwKTsKIAogCQkJaWYgKChzcGRpZl9mcmVxID09IGV4dGVybmFsX2ZyZXEqMikgJiYgKGhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApID49IEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSkpCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBEZXRlY3RlZCBBREFUIGluIGRvdWJsZSBzcGVlZCBtb2RlXG4iKTsKKwkJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSAiRGV0ZWN0ZWQgQURBVCBpbiBkb3VibGUgc3BlZWQgbW9kZVxuIik7CiAJCQllbHNlIGlmIChoZHNwLT5pb190eXBlID09IEg5NjMyICYmIChzcGRpZl9mcmVxID09IGV4dGVybmFsX2ZyZXEqNCkgJiYgKGhkc3BfYXV0b3N5bmNfcmVmKGhkc3ApID49IEhEU1BfQVVUT1NZTkNfRlJPTV9BREFUMSkpCi0JCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBEZXRlY3RlZCBBREFUIGluIHF1YWQgc3BlZWQgbW9kZVxuIik7CisJCQkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCQkgIkRldGVjdGVkIEFEQVQgaW4gcXVhZCBzcGVlZCBtb2RlXG4iKTsKIAkJCWVsc2UgaWYgKHJhdGUgIT0gZXh0ZXJuYWxfZnJlcSkgewotCQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJIYW1tZXJmYWxsLURTUDogTm8gQXV0b1N5bmMgc291cmNlIGZvciByZXF1ZXN0ZWQgcmF0ZVxuIik7CisJCQkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCQkgIk5vIEF1dG9TeW5jIHNvdXJjZSBmb3IgcmVxdWVzdGVkIHJhdGVcbiIpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQpAQCAtMTIyMyw3ICsxMjMyLDggQEAKIAl9CiAKIAlpZiAocmVqZWN0X2lmX29wZW4gJiYgKGhkc3AtPmNhcHR1cmVfcGlkID49IDAgfHwgaGRzcC0+cGxheWJhY2tfcGlkID49IDApKSB7Ci0JCXNuZF9wcmludGsgKCJIYW1tZXJmYWxsLURTUDogY2Fubm90IGNoYW5nZSBzcGVlZCBtb2RlIChjYXB0dXJlIFBJRCA9ICVkLCBwbGF5YmFjayBQSUQgPSAlZClcbiIsCisJCWRldl93YXJuKGhkc3AtPmNhcmQtPmRldiwKKwkJCSAiY2Fubm90IGNoYW5nZSBzcGVlZCBtb2RlIChjYXB0dXJlIFBJRCA9ICVkLCBwbGF5YmFjayBQSUQgPSAlZClcbiIsCiAJCQkgICAgaGRzcC0+Y2FwdHVyZV9waWQsCiAJCQkgICAgaGRzcC0+cGxheWJhY2tfcGlkKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTM3ODUsNyArMzc5NSw4IEBACiAJICAgIHNuZF9oYW1tZXJmYWxsX2dldF9idWZmZXIoaGRzcC0+cGNpLCAmaGRzcC0+cGxheWJhY2tfZG1hX2J1ZiwgSERTUF9ETUFfQVJFQV9CWVRFUykgPCAwKSB7CiAJCWlmIChoZHNwLT5jYXB0dXJlX2RtYV9idWYuYXJlYSkKIAkJCXNuZF9kbWFfZnJlZV9wYWdlcygmaGRzcC0+Y2FwdHVyZV9kbWFfYnVmKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIsIGhkc3AtPmNhcmRfbmFtZSk7CisJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBubyBidWZmZXJzIGF2YWlsYWJsZVxuIiwgaGRzcC0+Y2FyZF9uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00NzQ3LDcgKzQ3NTgsOCBAQAogCQkJcmV0dXJuIGVycjsKIAogCQlpZiAoIShoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVMb2FkZWQpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZmlybXdhcmUgbmVlZHMgdG8gYmUgdXBsb2FkZWQgdG8gdGhlIGNhcmQuXG4iKTsKKwkJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LAorCQkJCSJmaXJtd2FyZSBuZWVkcyB0byBiZSB1cGxvYWRlZCB0byB0aGUgY2FyZC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtNDg1OCw3ICs0ODcwLDggQEAKIAkJaWYgKGhkc3AtPnN0YXRlICYgKEhEU1BfRmlybXdhcmVDYWNoZWQgfCBIRFNQX0Zpcm13YXJlTG9hZGVkKSkKIAkJCXJldHVybiAtRUJVU1k7CiAKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBpbml0aWFsaXppbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKKwkJZGV2X2luZm8oaGRzcC0+Y2FyZC0+ZGV2LAorCQkJICJpbml0aWFsaXppbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKIAkJZmlybXdhcmUgPSAoc3RydWN0IGhkc3BfZmlybXdhcmUgX191c2VyICopYXJncDsKIAogCQlpZiAoZ2V0X3VzZXIoZmlybXdhcmVfZGF0YSwgJmZpcm13YXJlLT5maXJtd2FyZV9kYXRhKSkKQEAgLTQ4OTMsNyArNDkwNiw4IEBACiAJCQlzbmRfaGRzcF9pbml0aWFsaXplX21pZGlfZmx1c2goaGRzcCk7CiAKIAkJCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX2Fsc2FfZGV2aWNlcyhoZHNwLT5jYXJkLCBoZHNwKSkgPCAwKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGFsc2EgZGV2aWNlc1xuIik7CisJCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJlcnJvciBjcmVhdGluZyBhbHNhIGRldmljZXNcbiIpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0KQEAgLTQ5ODMsNyArNDk5Nyw4IEBACiAJaW50IGk7CiAKIAlpZiAoaGRzcF9maWZvX3dhaXQgKGhkc3AsIDAsIDEwMCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVuYWJsZV9pbyBmaWZvX3dhaXQgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkiZW5hYmxlX2lvIGZpZm9fd2FpdCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTUwNTcsMjUgKzUwNzIsMjkgQEAKIAlpbnQgZXJyOwogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfcGNtKGNhcmQsIGhkc3ApKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IEVycm9yIGNyZWF0aW5nIHBjbSBpbnRlcmZhY2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJFcnJvciBjcmVhdGluZyBwY20gaW50ZXJmYWNlXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAogCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX21pZGkoY2FyZCwgaGRzcCwgMCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3IgY3JlYXRpbmcgZmlyc3QgbWlkaSBpbnRlcmZhY2VcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJFcnJvciBjcmVhdGluZyBmaXJzdCBtaWRpIGludGVyZmFjZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKGhkc3AtPmlvX3R5cGUgPT0gRGlnaWZhY2UgfHwgaGRzcC0+aW9fdHlwZSA9PSBIOTY1MikgewogCQlpZiAoKGVyciA9IHNuZF9oZHNwX2NyZWF0ZV9taWRpKGNhcmQsIGhkc3AsIDEpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiBFcnJvciBjcmVhdGluZyBzZWNvbmQgbWlkaSBpbnRlcmZhY2VcbiIpOworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIkVycm9yIGNyZWF0aW5nIHNlY29uZCBtaWRpIGludGVyZmFjZVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfY29udHJvbHMoY2FyZCwgaGRzcCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3IgY3JlYXRpbmcgY3RsIGludGVyZmFjZVxuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkVycm9yIGNyZWF0aW5nIGN0bCBpbnRlcmZhY2VcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTA4OCw3ICs1MTA3LDggQEAKIAloZHNwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOwogCiAJaWYgKChlcnIgPSBzbmRfaGRzcF9zZXRfZGVmYXVsdHMoaGRzcCkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogRXJyb3Igc2V0dGluZyBkZWZhdWx0IHZhbHVlc1xuIik7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkVycm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXNcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTA5OCw3ICs1MTE4LDggQEAKIAkJCWhkc3AtPnBvcnQsIGhkc3AtPmlycSk7CiAKIAkJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogZXJyb3IgcmVnaXN0ZXJpbmcgY2FyZFxuIik7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiZXJyb3IgcmVnaXN0ZXJpbmcgY2FyZFxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWhkc3AtPnN0YXRlIHw9IEhEU1BfSW5pdGlhbGl6YXRpb25Db21wbGV0ZTsKQEAgLTUxNDEsMTYgKzUxNjIsMTkgQEAKIAkJCWZ3ZmlsZSA9ICJkaWdpZmFjZV9maXJtd2FyZV9yZXYxMS5iaW4iOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogaW52YWxpZCBpb190eXBlICVkXG4iLCBoZHNwLT5pb190eXBlKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCBpb190eXBlICVkXG4iLCBoZHNwLT5pb190eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd2ZpbGUsICZoZHNwLT5wY2ktPmRldikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGNhbm5vdCBsb2FkIGZpcm13YXJlICVzXG4iLCBmd2ZpbGUpOworCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgbG9hZCBmaXJtd2FyZSAlc1xuIiwgZndmaWxlKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCWlmIChmdy0+c2l6ZSA8IEhEU1BfRklSTVdBUkVfU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdG9vIHNob3J0IGZpcm13YXJlIHNpemUgJWQgKGV4cGVjdGVkICVkKVxuIiwKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkidG9vIHNob3J0IGZpcm13YXJlIHNpemUgJWQgKGV4cGVjdGVkICVkKVxuIiwKIAkJCSAgIChpbnQpZnctPnNpemUsIEhEU1BfRklSTVdBUkVfU0laRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUxNjcsMTMgKzUxOTEsMTUgQEAKIAkJCXJldHVybiBlcnI7CiAKIAkJaWYgKChlcnIgPSBzbmRfaGRzcF9jcmVhdGVfaHdkZXAoaGRzcC0+Y2FyZCwgaGRzcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGh3ZGVwIGRldmljZVxuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZXJyb3IgY3JlYXRpbmcgaHdkZXAgZGV2aWNlXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJc25kX2hkc3BfaW5pdGlhbGl6ZV9jaGFubmVscyhoZHNwKTsKIAkJc25kX2hkc3BfaW5pdGlhbGl6ZV9taWRpX2ZsdXNoKGhkc3ApOwogCQlpZiAoKGVyciA9IHNuZF9oZHNwX2NyZWF0ZV9hbHNhX2RldmljZXMoaGRzcC0+Y2FyZCwgaGRzcCkpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSGFtbWVyZmFsbC1EU1A6IGVycm9yIGNyZWF0aW5nIGFsc2EgZGV2aWNlc1xuIik7CisJCQlkZXZfZXJyKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkiZXJyb3IgY3JlYXRpbmcgYWxzYSBkZXZpY2VzXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC01MjQ5LDEzICs1Mjc1LDE0IEBACiAJCXJldHVybiBlcnI7CiAJaGRzcC0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlmICgoaGRzcC0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGhkc3AtPnBvcnQsIEhEU1BfSU9fRVhURU5UKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwgaGRzcC0+cG9ydCwgaGRzcC0+cG9ydCArIEhEU1BfSU9fRVhURU5UIC0gMSk7CisJCWRldl9lcnIoaGRzcC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwKKwkJCWhkc3AtPnBvcnQsIGhkc3AtPnBvcnQgKyBIRFNQX0lPX0VYVEVOVCAtIDEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2hkc3BfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBoZHNwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogdW5hYmxlIHRvIHVzZSBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsICJ1bmFibGUgdG8gdXNlIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtNTI4MSwxNyArNTMwOCwyMCBAQAogCQkJCSAgIGlmIHVzZXJzcGFjZSBpcyBub3QgcmVhZHkgZm9yCiAJCQkJICAgZmlybXdhcmUgdXBsb2FkCiAJCQkJKi8KLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIYW1tZXJmYWxsLURTUDogY291bGRuJ3QgZ2V0IGZpcm13YXJlIGZyb20gdXNlcnNwYWNlLiB0cnkgdXNpbmcgaGRzcGxvYWRlclxuIik7CisJCQkJZGV2X2VycihoZHNwLT5jYXJkLT5kZXYsCisJCQkJCSJjb3VsZG4ndCBnZXQgZmlybXdhcmUgZnJvbSB1c2Vyc3BhY2UuIHRyeSB1c2luZyBoZHNwbG9hZGVyXG4iKTsKIAkJCWVsc2UKIAkJCQkvKiBpbml0IGlzIGNvbXBsZXRlLCB3ZSByZXR1cm4gKi8KIAkJCQlyZXR1cm4gMDsKIAkJCS8qIHdlIGRlZmVyIGluaXRpYWxpemF0aW9uICovCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSGFtbWVyZmFsbC1EU1A6IGNhcmQgaW5pdGlhbGl6YXRpb24gcGVuZGluZyA6IHdhaXRpbmcgZm9yIGZpcm13YXJlXG4iKTsKKwkJCWRldl9pbmZvKGhkc3AtPmNhcmQtPmRldiwKKwkJCQkgImNhcmQgaW5pdGlhbGl6YXRpb24gcGVuZGluZyA6IHdhaXRpbmcgZm9yIGZpcm13YXJlXG4iKTsKIAkJCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlX2h3ZGVwKGNhcmQsIGhkc3ApKSA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhhbW1lcmZhbGwtRFNQOiBGaXJtd2FyZSBhbHJlYWR5IHByZXNlbnQsIGluaXRpYWxpemluZyBjYXJkLlxuIik7CisJCQlkZXZfaW5mbyhoZHNwLT5jYXJkLT5kZXYsCisJCQkJICJGaXJtd2FyZSBhbHJlYWR5IHByZXNlbnQsIGluaXRpYWxpemluZyBjYXJkLlxuIik7CiAJCQlpZiAoaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzMlJlZ2lzdGVyKSAmIEhEU1BfdmVyc2lvbjIpCiAJCQkJaGRzcC0+aW9fdHlwZSA9IFJQTTsKIAkJCWVsc2UgaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1czJSZWdpc3RlcikgJiBIRFNQX3ZlcnNpb24xKQpAQCAtNTM3NSw4ICs1NDA1LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBoZHNwKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBoZHNwKSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC01Mzg0LDcgKzU0MTQsNiBAQAogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9oZHNwX2NhcmRfZnJlZTsKIAloZHNwLT5kZXYgPSBkZXY7CiAJaGRzcC0+cGNpID0gcGNpOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAogCWlmICgoZXJyID0gc25kX2hkc3BfY3JlYXRlKGNhcmQsIGhkc3ApKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IGU5OGRjMDAuLmNiODJiNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtMTY1MSw5ICsxNjUxLDggQEAKIAkJCSAgIGp1c3QgbWFrZSBhIHdhcm5pbmcgYW4gcmVtZW1iZXIgc2V0dGluZwogCQkJICAgZm9yIGZ1dHVyZSBtYXN0ZXIgbW9kZSBzd2l0Y2hpbmcgKi8KIAotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkhEU1BNOiAiCi0JCQkJICAgIldhcm5pbmc6IGRldmljZSBpcyBub3QgcnVubmluZyAiCi0JCQkJICAgImFzIGEgY2xvY2sgbWFzdGVyLlxuIik7CisJCQlkZXZfd2FybihoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiV2FybmluZzogZGV2aWNlIGlzIG5vdCBydW5uaW5nIGFzIGEgY2xvY2sgbWFzdGVyLlxuIik7CiAJCQlub3Rfc2V0ID0gMTsKIAkJfSBlbHNlIHsKIApAQCAtMTY2NCwxNSArMTY2MywxNCBAQAogCQkJaWYgKGhkc3BtX2F1dG9zeW5jX3JlZihoZHNwbSkgPT0KIAkJCSAgICBIRFNQTV9BVVRPU1lOQ19GUk9NX05PTkUpIHsKIAotCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJIRFNQTTogIgotCQkJCQkgICAiRGV0ZWN0ZWQgbm8gRXh0ZXJuZWwgU3luYyBcbiIpOworCQkJCWRldl93YXJuKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJCSAiRGV0ZWN0ZWQgbm8gRXh0ZXJuZWwgU3luY1xuIik7CiAJCQkJbm90X3NldCA9IDE7CiAKIAkJCX0gZWxzZSBpZiAocmF0ZSAhPSBleHRlcm5hbF9mcmVxKSB7CiAKLQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERTUE06ICIKLQkJCQkJICAgIldhcm5pbmc6IE5vIEF1dG9TeW5jIHNvdXJjZSBmb3IgIgotCQkJCQkgICAicmVxdWVzdGVkIHJhdGVcbiIpOworCQkJCWRldl93YXJuKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJCSAiV2FybmluZzogTm8gQXV0b1N5bmMgc291cmNlIGZvciByZXF1ZXN0ZWQgcmF0ZVxuIik7CiAJCQkJbm90X3NldCA9IDE7CiAJCQl9CiAJCX0KQEAgLTE3MzgsMTMgKzE3MzYsMTEgQEAKIAogCWlmIChjdXJyZW50X3NwZWVkICE9IHRhcmdldF9zcGVlZAogCSAgICAmJiAoaGRzcG0tPmNhcHR1cmVfcGlkID49IDAgfHwgaGRzcG0tPnBsYXliYWNrX3BpZCA+PSAwKSkgewotCQlzbmRfcHJpbnRrCi0JCSAgICAoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCSAgICAgImNhbm5vdCBjaGFuZ2UgZnJvbSAlcyBzcGVlZCB0byAlcyBzcGVlZCBtb2RlICIKLQkJICAgICAiKGNhcHR1cmUgUElEID0gJWQsIHBsYXliYWNrIFBJRCA9ICVkKVxuIiwKLQkJICAgICBoZHNwbV9zcGVlZF9uYW1lc1tjdXJyZW50X3NwZWVkXSwKLQkJICAgICBoZHNwbV9zcGVlZF9uYW1lc1t0YXJnZXRfc3BlZWRdLAotCQkgICAgIGhkc3BtLT5jYXB0dXJlX3BpZCwgaGRzcG0tPnBsYXliYWNrX3BpZCk7CisJCWRldl9lcnIoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgY2hhbmdlIGZyb20gJXMgc3BlZWQgdG8gJXMgc3BlZWQgbW9kZSAoY2FwdHVyZSBQSUQgPSAlZCwgcGxheWJhY2sgUElEID0gJWQpXG4iLAorCQkJaGRzcG1fc3BlZWRfbmFtZXNbY3VycmVudF9zcGVlZF0sCisJCQloZHNwbV9zcGVlZF9uYW1lc1t0YXJnZXRfc3BlZWRdLAorCQkJaGRzcG0tPmNhcHR1cmVfcGlkLCBoZHNwbS0+cGxheWJhY2tfcGlkKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTU0NDYsNyArNTQ0Miw3IEBACiAJICogICAgICAgICAgMCAgICAgICAgIDY0ICAgICB+Mzk5ODIzMSAgICAgICB+ODE5MTU1OAogCSAqKi8KIAkvKgotCSAgIHNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1faW50ZXJydXB0ICVsbHUgQCAlbGx4XG4iLAorCSAgZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwgInNuZF9oZHNwbV9pbnRlcnJ1cHQgJWxsdSBAICVsbHhcbiIsCiAJICAgbm93LWhkc3BtLT5sYXN0X2ludGVycnVwdCwgc3RhdHVzICYgMHhGRkMwKTsKIAkgICBoZHNwbS0+bGFzdF9pbnRlcnJ1cHQgPSBub3c7CiAJKi8KQEAgLTU1ODMsNyArNTU3OSw3IEBACiAJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCWVyciA9IGhkc3BtX3NldF9yYXRlKGhkc3BtLCBwYXJhbXNfcmF0ZShwYXJhbXMpLCAwKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZXJyIG9uIGhkc3BtX3NldF9yYXRlOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwgImVyciBvbiBoZHNwbV9zZXRfcmF0ZTogJWRcbiIsIGVycik7CiAJCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCQlfc25kX3BjbV9od19wYXJhbV9zZXRlbXB0eShwYXJhbXMsCiAJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwpAQCAtNTU5NCw3ICs1NTkwLDggQEAKIAllcnIgPSBoZHNwbV9zZXRfaW50ZXJydXB0X2ludGVydmFsKGhkc3BtLAogCQkJcGFyYW1zX3BlcmlvZF9zaXplKHBhcmFtcykpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlcnIgb24gaGRzcG1fc2V0X2ludGVycnVwdF9pbnRlcnZhbDogJWRcbiIsIGVycik7CisJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkgImVyciBvbiBoZHNwbV9zZXRfaW50ZXJydXB0X2ludGVydmFsOiAlZFxuIiwgZXJyKTsKIAkJX3NuZF9wY21faHdfcGFyYW1fc2V0ZW1wdHkocGFyYW1zLAogCQkJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSk7CiAJCXJldHVybiBlcnI7CkBAIC01NjEwLDcgKzU2MDcsOCBAQAogCWVyciA9CiAJCXNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIEhEU1BNX0RNQV9BUkVBX0JZVEVTKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZXJyIG9uIHNuZF9wY21fbGliX21hbGxvY19wYWdlczogJWRcbiIsIGVycik7CisJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkgImVyciBvbiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXM6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTYyNCw3ICs1NjIyLDggQEAKIAogCQloZHNwbS0+cGxheWJhY2tfYnVmZmVyID0KIAkJCSh1bnNpZ25lZCBjaGFyICopIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7Ci0JCXNuZF9wcmludGRkKCJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgcGxheWJhY2sgYXQgJXBcbiIsCisJCWRldl9kYmcoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgcGxheWJhY2sgYXQgJXBcbiIsCiAJCQkJaGRzcG0tPnBsYXliYWNrX2J1ZmZlcik7CiAJfSBlbHNlIHsKIAkJaGRzcG1fc2V0X3NnYnVmKGhkc3BtLCBzdWJzdHJlYW0sIEhEU1BNX3BhZ2VBZGRyZXNzQnVmZmVySW4sCkBAIC01NjM1LDE4ICs1NjM0LDIxIEBACiAKIAkJaGRzcG0tPmNhcHR1cmVfYnVmZmVyID0KIAkJCSh1bnNpZ25lZCBjaGFyICopIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7Ci0JCXNuZF9wcmludGRkKCJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgY2FwdHVyZSBhdCAlcFxuIiwKKwkJZGV2X2RiZyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciBjYXB0dXJlIGF0ICVwXG4iLAogCQkJCWhkc3BtLT5jYXB0dXJlX2J1ZmZlcik7CiAJfQogCiAJLyoKLQkgICBzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yICVzIGF0IDB4JTA4WFxuIiwKKwkgICBkZXZfZGJnKGhkc3BtLT5jYXJkLT5kZXYsCisJICAgIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciAlcyBhdCAweCUwOFhcbiIsCiAJICAgc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/CiAJICAgInBsYXliYWNrIiA6ICJjYXB0dXJlIiwKIAkgICBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHN1YnN0cmVhbSwgMCkpOwogCSAgICovCiAJLyoKLQkgICBzbmRfcHJpbnRkZCgic2V0X2h3cGFyYW1zOiAlcyAlZCBIeiwgJWQgY2hhbm5lbHMsIGJzID0gJWRcbiIsCisJICAgZGV2X2RiZyhoZHNwbS0+Y2FyZC0+ZGV2LAorCSAgICJzZXRfaHdwYXJhbXM6ICVzICVkIEh6LCAlZCBjaGFubmVscywgYnMgPSAlZFxuIiwKIAkgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KIAkgICAicGxheWJhY2siIDogImNhcHR1cmUiLAogCSAgIHBhcmFtc19yYXRlKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLApAQCAtNTY2NywxMiArNTY2OSwxNCBAQAogCS8qIFN3aXRjaCB0byBuYXRpdmUgZmxvYXQgZm9ybWF0IGlmIHJlcXVlc3RlZCAqLwogCWlmIChTTkRSVl9QQ01fRk9STUFUX0ZMT0FUX0xFID09IHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCQlpZiAoIShoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BlX0ZMT0FUX0ZPUk1BVCkpCi0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiaGRzcG06IFN3aXRjaGluZyB0byBuYXRpdmUgMzJiaXQgTEUgZmxvYXQgZm9ybWF0LlxuIik7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiU3dpdGNoaW5nIHRvIG5hdGl2ZSAzMmJpdCBMRSBmbG9hdCBmb3JtYXQuXG4iKTsKIAogCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQZV9GTE9BVF9GT1JNQVQ7CiAJfSBlbHNlIGlmIChTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSA9PSBwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKIAkJaWYgKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUGVfRkxPQVRfRk9STUFUKQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gImhkc3BtOiBTd2l0Y2hpbmcgdG8gbmF0aXZlIDMyYml0IExFIGludGVnZXIgZm9ybWF0LlxuIik7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAiU3dpdGNoaW5nIHRvIG5hdGl2ZSAzMmJpdCBMRSBpbnRlZ2VyIGZvcm1hdC5cbiIpOwogCiAJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQZV9GTE9BVF9GT1JNQVQ7CiAJfQpAQCAtNTcxNSwxMiArNTcxOSwxNiBAQAogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJaWYgKHNuZF9CVUdfT04oaW5mby0+Y2hhbm5lbCA+PSBoZHNwbS0+bWF4X2NoYW5uZWxzX291dCkpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCBvdXQgb2YgcmFuZ2UgKCVkKVxuIiwgaW5mby0+Y2hhbm5lbCk7CisJCQlkZXZfaW5mbyhoZHNwbS0+Y2FyZC0+ZGV2LAorCQkJCSAic25kX2hkc3BtX2NoYW5uZWxfaW5mbzogb3V0cHV0IGNoYW5uZWwgb3V0IG9mIHJhbmdlICglZClcbiIsCisJCQkJIGluZm8tPmNoYW5uZWwpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQlpZiAoaGRzcG0tPmNoYW5uZWxfbWFwX291dFtpbmZvLT5jaGFubmVsXSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCAlZCBtYXBwZWQgb3V0XG4iLCBpbmZvLT5jaGFubmVsKTsKKwkJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBvdXRwdXQgY2hhbm5lbCAlZCBtYXBwZWQgb3V0XG4iLAorCQkJCSBpbmZvLT5jaGFubmVsKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTU3MjgsMTIgKzU3MzYsMTYgQEAKIAkJCUhEU1BNX0NIQU5ORUxfQlVGRkVSX0JZVEVTOwogCX0gZWxzZSB7CiAJCWlmIChzbmRfQlVHX09OKGluZm8tPmNoYW5uZWwgPj0gaGRzcG0tPm1heF9jaGFubmVsc19pbikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsIG91dCBvZiByYW5nZSAoJWQpXG4iLCBpbmZvLT5jaGFubmVsKTsKKwkJCWRldl9pbmZvKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkJICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsIG91dCBvZiByYW5nZSAoJWQpXG4iLAorCQkJCSBpbmZvLT5jaGFubmVsKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAkJaWYgKGhkc3BtLT5jaGFubmVsX21hcF9pbltpbmZvLT5jaGFubmVsXSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJzbmRfaGRzcG1fY2hhbm5lbF9pbmZvOiBpbnB1dCBjaGFubmVsICVkIG1hcHBlZCBvdXRcbiIsIGluZm8tPmNoYW5uZWwpOworCQkJZGV2X2luZm8oaGRzcG0tPmNhcmQtPmRldiwKKwkJCQkgInNuZF9oZHNwbV9jaGFubmVsX2luZm86IGlucHV0IGNoYW5uZWwgJWQgbWFwcGVkIG91dFxuIiwKKwkJCQkgaW5mby0+Y2hhbm5lbCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC02MjgzLDcgKzYyOTUsNyBAQAogCiAJCXMgPSBjb3B5X3RvX3VzZXIoYXJncCwgbGV2ZWxzLCBzaXplb2Yoc3RydWN0IGhkc3BtX3BlYWtfcm1zKSk7CiAJCWlmICgwICE9IHMpIHsKLQkJCS8qIHNuZF9wcmludGsoS0VSTl9FUlIgImNvcHlfdG9fdXNlciguLiwgLi4sICVsdSk6ICVsdQorCQkJLyogZGV2X2VycihoZHNwbS0+Y2FyZC0+ZGV2LCAiY29weV90b191c2VyKC4uLCAuLiwgJWx1KTogJWx1CiAJCQkgW0xldmVsc11cbiIsIHNpemVvZihzdHJ1Y3QgaGRzcG1fcGVha19ybXMpLCBzKTsKIAkJCSAqLwogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC02MzI5LDcgKzYzNDEsNyBAQAogCQlzID0gY29weV90b191c2VyKGFyZ3AsICZsdGMsIHNpemVvZihzdHJ1Y3QgaGRzcG1fbHRjKSk7CiAJCWlmICgwICE9IHMpIHsKIAkJCS8qCi0JCQkgc25kX3ByaW50ayhLRVJOX0VSUiAiY29weV90b191c2VyKC4uLCAuLiwgJWx1KTogJWx1IFtMVENdXG4iLCBzaXplb2Yoc3RydWN0IGhkc3BtX2x0YyksIHMpOyAqLworCQkJICBkZXZfZXJyKGhkc3BtLT5jYXJkLT5kZXYsICJjb3B5X3RvX3VzZXIoLi4sIC4uLCAlbHUpOiAlbHUgW0xUQ11cbiIsIHNpemVvZihzdHJ1Y3QgaGRzcG1fbHRjKSwgcyk7ICovCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCkBAIC02NDk0LDExICs2NTA2LDEzIEBACiAJCQkJCQkgICB3YW50ZWQsCiAJCQkJCQkgICB3YW50ZWQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGRkKCJDb3VsZCBub3QgcHJlYWxsb2NhdGUgJXpkIEJ5dGVzXG4iLCB3YW50ZWQpOworCQlkZXZfZGJnKGhkc3BtLT5jYXJkLT5kZXYsCisJCQkiQ291bGQgbm90IHByZWFsbG9jYXRlICV6ZCBCeXRlc1xuIiwgd2FudGVkKTsKIAogCQlyZXR1cm4gZXJyOwogCX0gZWxzZQotCQlzbmRfcHJpbnRkZCgiIFByZWFsbG9jYXRlZCAlemQgQnl0ZXNcbiIsIHdhbnRlZCk7CisJCWRldl9kYmcoaGRzcG0tPmNhcmQtPmRldiwKKwkJCSIgUHJlYWxsb2NhdGVkICV6ZCBCeXRlc1xuIiwgd2FudGVkKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjU1OSw3ICs2NTczLDcgQEAKIHsKIAlpbnQgZXJyLCBpOwogCi0Jc25kX3ByaW50ZGQoIkNyZWF0ZSBjYXJkLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIkNyZWF0ZSBjYXJkLi4uXG4iKTsKIAllcnIgPSBzbmRfaGRzcG1fY3JlYXRlX3BjbShjYXJkLCBoZHNwbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC02NTgxLDcgKzY1OTUsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX3ByaW50ZGQoInByb2MgaW5pdC4uLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJwcm9jIGluaXQuLi5cbiIpOwogCXNuZF9oZHNwbV9wcm9jX2luaXQoaGRzcG0pOwogCiAJaGRzcG0tPnN5c3RlbV9zYW1wbGVfcmF0ZSA9IC0xOwpAQCAtNjU5MiwyMyArNjYwNiwyMyBAQAogCWhkc3BtLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CiAJaGRzcG0tPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CiAKLQlzbmRfcHJpbnRkZCgiU2V0IGRlZmF1bHRzLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIlNldCBkZWZhdWx0cy4uLlxuIik7CiAJZXJyID0gc25kX2hkc3BtX3NldF9kZWZhdWx0cyhoZHNwbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfcHJpbnRkZCgiVXBkYXRlIG1peGVyIGNvbnRyb2xzLi4uXG4iKTsKKwlkZXZfZGJnKGNhcmQtPmRldiwgIlVwZGF0ZSBtaXhlciBjb250cm9scy4uLlxuIik7CiAJaGRzcG1fdXBkYXRlX3NpbXBsZV9taXhlcl9jb250cm9scyhoZHNwbSk7CiAKLQlzbmRfcHJpbnRkZCgiSW5pdGlhbGl6ZWluZyBjb21wbGV0ZSA/Pz9cbiIpOworCWRldl9kYmcoY2FyZC0+ZGV2LCAiSW5pdGlhbGl6ZWluZyBjb21wbGV0ZSA/Pz9cbiIpOwogCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSERTUE06IGVycm9yIHJlZ2lzdGVyaW5nIGNhcmRcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImVycm9yIHJlZ2lzdGVyaW5nIGNhcmRcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9wcmludGRkKCIuLi4geWVzIG5vd1xuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICIuLi4geWVzIG5vd1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2NjIsOCArNjY3Niw4IEBACiAJCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBNQURJIjsKIAkJCWhkc3BtLT5taWRpUG9ydHMgPSAzOwogCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCSJIRFNQTTogdW5rbm93biBmaXJtd2FyZSByZXZpc2lvbiAleFxuIiwKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJ1bmtub3duIGZpcm13YXJlIHJldmlzaW9uICV4XG4iLAogCQkJCWhkc3BtLT5maXJtd2FyZV9yZXYpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTY2ODIsMzYgKzY2OTYsMzUgQEAKIAloZHNwbS0+cG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWlvX2V4dGVudCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKTsKIAotCXNuZF9wcmludGRkKCJncmFiYmVkIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJZGV2X2RiZyhjYXJkLT5kZXYsICJncmFiYmVkIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCiAJCQloZHNwbS0+cG9ydCwgaGRzcG0tPnBvcnQgKyBpb19leHRlbnQgLSAxKTsKIAogCWhkc3BtLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaGRzcG0tPnBvcnQsIGlvX2V4dGVudCk7CiAJaWYgKCFoZHNwbS0+aW9iYXNlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCQkJInVuYWJsZSB0byByZW1hcCByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHJlbWFwIHJlZ2lvbiAweCVseC0weCVseFxuIiwKIAkJCQloZHNwbS0+cG9ydCwgaGRzcG0tPnBvcnQgKyBpb19leHRlbnQgLSAxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0Jc25kX3ByaW50ZGQoInJlbWFwcGVkIHJlZ2lvbiAoMHglbHgpIDB4JWx4LTB4JWx4XG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAicmVtYXBwZWQgcmVnaW9uICgweCVseCkgMHglbHgtMHglbHhcbiIsCiAJCQkodW5zaWduZWQgbG9uZyloZHNwbS0+aW9iYXNlLCBoZHNwbS0+cG9ydCwKIAkJCWhkc3BtLT5wb3J0ICsgaW9fZXh0ZW50IC0gMSk7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9oZHNwbV9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGhkc3BtKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJIRFNQTTogdW5hYmxlIHRvIHVzZSBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gdXNlIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXNuZF9wcmludGRkKCJ1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJ1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAKIAloZHNwbS0+aXJxID0gcGNpLT5pcnE7CiAKLQlzbmRfcHJpbnRkZCgia21hbGxvYyBNaXhlciBtZW1vcnkgb2YgJXpkIEJ5dGVzXG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAia21hbGxvYyBNaXhlciBtZW1vcnkgb2YgJXpkIEJ5dGVzXG4iLAogCQkJc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpOwogCWhkc3BtLT5taXhlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlciksIEdGUF9LRVJORUwpOwogCWlmICghaGRzcG0tPm1peGVyKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiAiCi0JCQkJInVuYWJsZSB0byBrbWFsbG9jIE1peGVyIG1lbW9yeSBvZiAlZCBCeXRlc1xuIiwKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGttYWxsb2MgTWl4ZXIgbWVtb3J5IG9mICVkIEJ5dGVzXG4iLAogCQkJCShpbnQpc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NzgwLDE0ICs2NzkzLDE0IEBACiAJCWhkc3BtLT5xc19vdXRfY2hhbm5lbHMgPSBBSU9fT1VUX1FTX0NIQU5ORUxTOwogCiAJCWlmICgwID09IChoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpICYgSERTUE1fczJfQUVCSV9EKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBRUIgaW5wdXQgYm9hcmQgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQUVCIGlucHV0IGJvYXJkIGZvdW5kXG4iKTsKIAkJCWhkc3BtLT5zc19pbl9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPmRzX2luX2NoYW5uZWxzICs9IDQ7CiAJCQloZHNwbS0+cXNfaW5fY2hhbm5lbHMgKz0gNDsKIAkJfQogCiAJCWlmICgwID09IChoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpICYgSERTUE1fczJfQUVCT19EKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBRUIgb3V0cHV0IGJvYXJkIGZvdW5kXG4iKTsKKwkJCWRldl9pbmZvKGNhcmQtPmRldiwgIkFFQiBvdXRwdXQgYm9hcmQgZm91bmRcbiIpOwogCQkJaGRzcG0tPnNzX291dF9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPmRzX291dF9jaGFubmVscyArPSA0OwogCQkJaGRzcG0tPnFzX291dF9jaGFubmVscyArPSA0OwpAQCAtNjg1NCw3ICs2ODY3LDcgQEAKIAkJCWlmIChOVUxMICE9IGhkc3BtLT50Y28pIHsKIAkJCQloZHNwbV90Y29fd3JpdGUoaGRzcG0pOwogCQkJfQotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkhEU1BNOiBBSU8vUmF5REFUIFRDTyBtb2R1bGUgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiQUlPL1JheURBVCBUQ08gbW9kdWxlIGZvdW5kXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWhkc3BtLT50Y28gPSBOVUxMOwogCQl9CkBAIC02ODY5LDcgKzY4ODIsNyBAQAogCQkJaWYgKE5VTEwgIT0gaGRzcG0tPnRjbykgewogCQkJCWhkc3BtX3Rjb193cml0ZShoZHNwbSk7CiAJCQl9Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSERTUE06IE1BREkvQUVTIFRDTyBtb2R1bGUgZm91bmRcbiIpOworCQkJZGV2X2luZm8oY2FyZC0+ZGV2LCAiTUFESS9BRVMgVENPIG1vZHVsZSBmb3VuZFxuIik7CiAJCX0gZWxzZSB7CiAJCQloZHNwbS0+dGNvID0gTlVMTDsKIAkJfQpAQCAtNjk1MSw3ICs2OTY0LDcgQEAKIAkJfQogCX0KIAotCXNuZF9wcmludGRkKCJjcmVhdGUgYWxzYSBkZXZpY2VzLlxuIik7CisJZGV2X2RiZyhjYXJkLT5kZXYsICJjcmVhdGUgYWxzYSBkZXZpY2VzLlxuIik7CiAJZXJyID0gc25kX2hkc3BtX2NyZWF0ZV9hbHNhX2RldmljZXMoY2FyZCwgaGRzcG0pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNzAxNiw4ICs3MDI5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sCi0JCQlUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBoZHNwbSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBjaS0+ZGV2LCBpbmRleFtkZXZdLCBpZFtkZXZdLAorCQkJICAgVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgaGRzcG0pLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTcwMjYsOCArNzAzOSw2IEBACiAJaGRzcG0tPmRldiA9IGRldjsKIAloZHNwbS0+cGNpID0gcGNpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJZXJyID0gc25kX2hkc3BtX2NyZWF0ZShjYXJkLCBoZHNwbSk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwppbmRleCAxNTAzZWUzLi4xZDliZTkwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCkBAIC0zOTQsNyArMzk0LDkgQEAKIAlpZiAob2Zmc2V0IDwgcGVyaW9kX3NpemUpIHsKIAkJaWYgKG9mZnNldCA+IHJtZTk2NTItPm1heF9qaXR0ZXIpIHsKIAkJCWlmIChmcmFnKQotCQkJCXByaW50ayhLRVJOX0VSUiAiVW5leHBlY3RlZCBod19wb2ludGVyIHBvc2l0aW9uIChidWZpZCA9PSAwKTogc3RhdHVzOiAleCBvZmZzZXQ6ICVkXG4iLCBzdGF0dXMsIG9mZnNldCk7CisJCQkJZGV2X2VycihybWU5NjUyLT5jYXJkLT5kZXYsCisJCQkJCSJVbmV4cGVjdGVkIGh3X3BvaW50ZXIgcG9zaXRpb24gKGJ1ZmlkID09IDApOiBzdGF0dXM6ICV4IG9mZnNldDogJWRcbiIsCisJCQkJCXN0YXR1cywgb2Zmc2V0KTsKIAkJfSBlbHNlIGlmICghZnJhZykKIAkJCXJldHVybiAwOwogCQlvZmZzZXQgLT0gcm1lOTY1Mi0+bWF4X2ppdHRlcjsKQEAgLTQwMyw3ICs0MDUsOSBAQAogCX0gZWxzZSB7CiAJCWlmIChvZmZzZXQgPiBwZXJpb2Rfc2l6ZSArIHJtZTk2NTItPm1heF9qaXR0ZXIpIHsKIAkJCWlmICghZnJhZykKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuZXhwZWN0ZWQgaHdfcG9pbnRlciBwb3NpdGlvbiAoYnVmaWQgPT0gMSk6IHN0YXR1czogJXggb2Zmc2V0OiAlZFxuIiwgc3RhdHVzLCBvZmZzZXQpOworCQkJCWRldl9lcnIocm1lOTY1Mi0+Y2FyZC0+ZGV2LAorCQkJCQkiVW5leHBlY3RlZCBod19wb2ludGVyIHBvc2l0aW9uIChidWZpZCA9PSAxKTogc3RhdHVzOiAleCBvZmZzZXQ6ICVkXG4iLAorCQkJCQlzdGF0dXMsIG9mZnNldCk7CiAJCX0gZWxzZSBpZiAoZnJhZykKIAkJCXJldHVybiBwZXJpb2Rfc2l6ZTsKIAkJb2Zmc2V0IC09IHJtZTk2NTItPm1heF9qaXR0ZXI7CkBAIC03NjksNyArNzczLDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogdW5rbm93biBTL1BESUYgaW5wdXQgcmF0ZSAoYml0cyA9IDB4JXgpXG4iLAorCQlkZXZfZXJyKHMtPmNhcmQtPmRldiwKKwkJCSIlczogdW5rbm93biBTL1BESUYgaW5wdXQgcmF0ZSAoYml0cyA9IDB4JXgpXG4iLAogCQkJICAgcy0+Y2FyZF9uYW1lLCByYXRlX2JpdHMpOwogCQlyZXR1cm4gMDsKIAkJYnJlYWs7CkBAIC0xNzkwLDcgKzE3OTUsOCBAQAogCSAgICBzbmRfaGFtbWVyZmFsbF9nZXRfYnVmZmVyKHJtZTk2NTItPnBjaSwgJnJtZTk2NTItPnBsYXliYWNrX2RtYV9idWYsIFJNRTk2NTJfRE1BX0FSRUFfQllURVMpIDwgMCkgewogCQlpZiAocm1lOTY1Mi0+Y2FwdHVyZV9kbWFfYnVmLmFyZWEpCiAJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnJtZTk2NTItPmNhcHR1cmVfZG1hX2J1Zik7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGJ1ZmZlcnMgYXZhaWxhYmxlXG4iLCBybWU5NjUyLT5jYXJkX25hbWUpOworCQlkZXZfZXJyKHJtZTk2NTItPmNhcmQtPmRldiwKKwkJCSIlczogbm8gYnVmZmVycyBhdmFpbGFibGVcbiIsIHJtZTk2NTItPmNhcmRfbmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjQ2OCwxMyArMjQ3NCwxNCBAQAogCXJtZTk2NTItPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAlybWU5NjUyLT5pb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocm1lOTY1Mi0+cG9ydCwgUk1FOTY1Ml9JT19FWFRFTlQpOwogCWlmIChybWU5NjUyLT5pb2Jhc2UgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVtYXAgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBybWU5NjUyLT5wb3J0LCBybWU5NjUyLT5wb3J0ICsgUk1FOTY1Ml9JT19FWFRFTlQgLSAxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVtYXAgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAorCQkJcm1lOTY1Mi0+cG9ydCwgcm1lOTY1Mi0+cG9ydCArIFJNRTk2NTJfSU9fRVhURU5UIC0gMSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCQogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JtZTk2NTJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBybWU5NjUyKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJcm1lOTY1Mi0+aXJxID0gcGNpLT5pcnE7CkBAIC0yNTg3LDggKzI1OTQsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9ybWU5NjUyKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfcm1lOTY1MiksICZjYXJkKTsKIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMjU5Nyw3ICsyNjA0LDYgQEAKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfcm1lOTY1Ml9jYXJkX2ZyZWU7CiAJcm1lOTY1Mi0+ZGV2ID0gZGV2OwogCXJtZTk2NTItPnBjaSA9IHBjaTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAKIAlpZiAoKGVyciA9IHNuZF9ybWU5NjUyX2NyZWF0ZShjYXJkLCBybWU5NjUyLCBwcmVjaXNlX3B0cltkZXZdKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc2lzNzAxOS5jIGIvc291bmQvcGNpL3NpczcwMTkuYwppbmRleCBlNDEzYjRlLi42YjI2YjkzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc2lzNzAxOS5jCisrKyBiL3NvdW5kL3BjaS9zaXM3MDE5LmMKQEAgLTE0MDQsOCArMTQwNCw2IEBACiAJaWYgKHJjKQogCQlnb3RvIGVycm9yX291dF9jbGVhbnVwOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJcmV0dXJuIDA7CiAKIGVycm9yX291dF9jbGVhbnVwOgpAQCAtMTQ0MCw3ICsxNDM4LDggQEAKIAlpZiAoIWNvZGVjcykKIAkJY29kZWNzID0gU0lTX1BSSU1BUllfQ09ERUNfUFJFU0VOVDsKIAotCXJjID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIHNpemVvZigqc2lzKSwgJmNhcmQpOworCXJjID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwKKwkJCSAgc2l6ZW9mKCpzaXMpLCAmY2FyZCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBlcnJvcl9vdXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCmluZGV4IDJhNDZiZjkuLjIwNDRkYzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKKysrIGIvc291bmQvcGNpL3NvbmljdmliZXMuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJb3V0bChjb3VudCwgc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9DT1VOVDApOwogCW91dGIoMHgxOCwgc29uaWMtPmRtYWFfcG9ydCArIFNWX0RNQV9NT0RFKTsKICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgInByb2dyYW0gZG1hYTogYWRkciA9IDB4JXgsIHBhZGRyID0gMHgleFxuIiwKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsICJwcm9ncmFtIGRtYWE6IGFkZHIgPSAweCV4LCBwYWRkciA9IDB4JXhcbiIsCiAJICAgICAgIGFkZHIsIGlubChzb25pYy0+ZG1hYV9wb3J0ICsgU1ZfRE1BX0FERFIwKSk7CiAjZW5kaWYKIH0KQEAgLTI4OSw3ICsyODksNyBAQAogCW91dGwoY291bnQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfQ09VTlQwKTsKIAlvdXRiKDB4MTQsIHNvbmljLT5kbWFjX3BvcnQgKyBTVl9ETUFfTU9ERSk7CiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJwcm9ncmFtIGRtYWM6IGFkZHIgPSAweCV4LCBwYWRkciA9IDB4JXhcbiIsCisJZGV2X2RiZyhzb25pYy0+Y2FyZC0+ZGV2LCAicHJvZ3JhbSBkbWFjOiBhZGRyID0gMHgleCwgcGFkZHIgPSAweCV4XG4iLAogCSAgICAgICBhZGRyLCBpbmwoc29uaWMtPmRtYWNfcG9ydCArIFNWX0RNQV9BRERSMCkpOwogI2VuZGlmCiB9CkBAIC0zNTcsMTA1ICszNTcsMTA1IEBACiAjaWYgMAogc3RhdGljIHZvaWQgc25kX3NvbmljdmliZXNfZGVidWcoc3RydWN0IHNvbmljdmliZXMgKiBzb25pYykKIHsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiU1YgUkVHUzogICAgICAgICAgSU5ERVggPSAweCUwMnggICIsIGluYihTVl9SRUcoc29uaWMsIElOREVYKSkpOwotCXByaW50aygiICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsIGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAwOiBsZWZ0IGlucHV0ICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAwKSk7Ci0JcHJpbnRrKCIgIDB4MjA6IHN5bnRoIHJhdGUgbG93ICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjApKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAxOiByaWdodCBpbnB1dCAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAxKSk7Ci0JcHJpbnRrKCIgIDB4MjE6IHN5bnRoIHJhdGUgaGlnaCA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAyOiBsZWZ0IEFVWDEgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAyKSk7Ci0JcHJpbnRrKCIgIDB4MjI6IEFEQyBjbG9jayAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDAzOiByaWdodCBBVVgxICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAzKSk7Ci0JcHJpbnRrKCIgIDB4MjM6IEFEQyBhbHQgcmF0ZSAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA0OiBsZWZ0IENEICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA0KSk7Ci0JcHJpbnRrKCIgIDB4MjQ6IEFEQyBwbGwgTSAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA1OiByaWdodCBDRCAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA1KSk7Ci0JcHJpbnRrKCIgIDB4MjU6IEFEQyBwbGwgTiAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA2OiBsZWZ0IGxpbmUgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA2KSk7Ci0JcHJpbnRrKCIgIDB4MjY6IFN5bnRoIHBsbCBNICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA3OiByaWdodCBsaW5lICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA3KSk7Ci0JcHJpbnRrKCIgIDB4Mjc6IFN5bnRoIHBsbCBOICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjcpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA4OiBNSUMgICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA4KSk7Ci0JcHJpbnRrKCIgIDB4Mjg6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjgpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDA5OiBHYW1lIHBvcnQgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA5KSk7Ci0JcHJpbnRrKCIgIDB4Mjk6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjkpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBhOiBsZWZ0IHN5bnRoICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBhKSk7Ci0JcHJpbnRrKCIgIDB4MmE6IE1QVTQwMSAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBiOiByaWdodCBzeW50aCAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBiKSk7Ci0JcHJpbnRrKCIgIDB4MmI6IGRyaXZlIGN0cmwgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBjOiBsZWZ0IEFVWDIgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBjKSk7Ci0JcHJpbnRrKCIgIDB4MmM6IFNSUyBzcGFjZSAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBkOiByaWdodCBBVVgyICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBkKSk7Ci0JcHJpbnRrKCIgIDB4MmQ6IFNSUyBjZW50ZXIgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBlOiBsZWZ0IGFuYWxvZyAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBlKSk7Ci0JcHJpbnRrKCIgIDB4MmU6IHdhdmUgc291cmNlICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDBmOiByaWdodCBhbmFsb2cgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBmKSk7Ci0JcHJpbnRrKCIgIDB4MmY6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEwOiBsZWZ0IFBDTSAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEwKSk7Ci0JcHJpbnRrKCIgIDB4MzA6IGFuYWxvZyBwb3dlciAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzApKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDExOiByaWdodCBQQ00gICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDExKSk7Ci0JcHJpbnRrKCIgIDB4MzE6IGFuYWxvZyBwb3dlciAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzEpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEyOiBETUEgZGF0YSBmb3JtYXQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEyKSk7Ci0JcHJpbnRrKCIgIDB4MzI6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzIpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDEzOiBQL0MgZW5hYmxlICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEzKSk7Ci0JcHJpbnRrKCIgIDB4MzM6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzMpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE0OiBVL0QgYnV0dG9uICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE0KSk7Ci0JcHJpbnRrKCIgIDB4MzQ6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzQpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE1OiByZXZpc2lvbiAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE1KSk7Ci0JcHJpbnRrKCIgIDB4MzU6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzUpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE2OiBBREMgb3V0cHV0IGN0cmwgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE2KSk7Ci0JcHJpbnRrKCIgIDB4MzY6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzYpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE3OiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE3KSk7Ci0JcHJpbnRrKCIgIDB4Mzc6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzcpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE4OiBETUEgQSB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE4KSk7Ci0JcHJpbnRrKCIgIDB4Mzg6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzgpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDE5OiBETUEgQSBsb3dlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE5KSk7Ci0JcHJpbnRrKCIgIDB4Mzk6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzkpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFhOiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFhKSk7Ci0JcHJpbnRrKCIgIDB4M2E6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2EpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFiOiAtLS0gICAgICAgICAgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFiKSk7Ci0JcHJpbnRrKCIgIDB4M2I6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2IpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFjOiBETUEgQyB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFjKSk7Ci0JcHJpbnRrKCIgIDB4M2M6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2MpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFkOiBETUEgQyB1cHBlciBjbnQgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFkKSk7Ci0JcHJpbnRrKCIgIDB4M2Q6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2QpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFlOiBQQ00gcmF0ZSBsb3cgICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFlKSk7Ci0JcHJpbnRrKCIgIDB4M2U6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2UpKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiICAweDFmOiBQQ00gcmF0ZSBoaWdoICAgPSAweCUwMnggICIsIHNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFmKSk7Ci0JcHJpbnRrKCIgIDB4M2Y6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeFxuIiwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2YpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSJTViBSRUdTOiAgICAgICAgICBJTkRFWCA9IDB4JTAyeCAgICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsCisJCWluYihTVl9SRUcoc29uaWMsIElOREVYKSksIGluYihTVl9SRUcoc29uaWMsIFNUQVRVUykpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDA6IGxlZnQgaW5wdXQgICAgICA9IDB4JTAyeCAgICAweDIwOiBzeW50aCByYXRlIGxvdyAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAwKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjApKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDE6IHJpZ2h0IGlucHV0ICAgICA9IDB4JTAyeCAgICAweDIxOiBzeW50aCByYXRlIGhpZ2ggPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAxKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDI6IGxlZnQgQVVYMSAgICAgICA9IDB4JTAyeCAgICAweDIyOiBBREMgY2xvY2sgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAyKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDM6IHJpZ2h0IEFVWDEgICAgICA9IDB4JTAyeCAgICAweDIzOiBBREMgYWx0IHJhdGUgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDAzKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDQ6IGxlZnQgQ0QgICAgICAgICA9IDB4JTAyeCAgICAweDI0OiBBREMgcGxsIE0gICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA0KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDU6IHJpZ2h0IENEICAgICAgICA9IDB4JTAyeCAgICAweDI1OiBBREMgcGxsIE4gICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA1KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDY6IGxlZnQgbGluZSAgICAgICA9IDB4JTAyeCAgICAweDI2OiBTeW50aCBwbGwgTSAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA2KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDc6IHJpZ2h0IGxpbmUgICAgICA9IDB4JTAyeCAgICAweDI3OiBTeW50aCBwbGwgTiAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA3KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjcpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDg6IE1JQyAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDI4OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA4KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjgpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MDk6IEdhbWUgcG9ydCAgICAgICA9IDB4JTAyeCAgICAweDI5OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDA5KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MjkpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGE6IGxlZnQgc3ludGggICAgICA9IDB4JTAyeCAgICAweDJhOiBNUFU0MDEgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBhKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGI6IHJpZ2h0IHN5bnRoICAgICA9IDB4JTAyeCAgICAweDJiOiBkcml2ZSBjdHJsICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBiKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGM6IGxlZnQgQVVYMiAgICAgICA9IDB4JTAyeCAgICAweDJjOiBTUlMgc3BhY2UgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBjKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGQ6IHJpZ2h0IEFVWDIgICAgICA9IDB4JTAyeCAgICAweDJkOiBTUlMgY2VudGVyICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBkKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGU6IGxlZnQgYW5hbG9nICAgICA9IDB4JTAyeCAgICAweDJlOiB3YXZlIHNvdXJjZSAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBlKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MGY6IHJpZ2h0IGFuYWxvZyAgICA9IDB4JTAyeCAgICAweDJmOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDBmKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MmYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTA6IGxlZnQgUENNICAgICAgICA9IDB4JTAyeCAgICAweDMwOiBhbmFsb2cgcG93ZXIgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEwKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzApKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTE6IHJpZ2h0IFBDTSAgICAgICA9IDB4JTAyeCAgICAweDMxOiBhbmFsb2cgcG93ZXIgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDExKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzEpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTI6IERNQSBkYXRhIGZvcm1hdCA9IDB4JTAyeCAgICAweDMyOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEyKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzIpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTM6IFAvQyBlbmFibGUgICAgICA9IDB4JTAyeCAgICAweDMzOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDEzKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzMpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTQ6IFUvRCBidXR0b24gICAgICA9IDB4JTAyeCAgICAweDM0OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE0KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzQpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTU6IHJldmlzaW9uICAgICAgICA9IDB4JTAyeCAgICAweDM1OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE1KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzUpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTY6IEFEQyBvdXRwdXQgY3RybCA9IDB4JTAyeCAgICAweDM2OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE2KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzYpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTc6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDM3OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE3KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzcpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTg6IERNQSBBIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDM4OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE4KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzgpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MTk6IERNQSBBIGxvd2VyIGNudCA9IDB4JTAyeCAgICAweDM5OiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDE5KSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4MzkpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWE6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDNhOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFhKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2EpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWI6IC0tLSAgICAgICAgICAgICA9IDB4JTAyeCAgICAweDNiOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFiKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2IpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWM6IERNQSBDIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDNjOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFjKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2MpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWQ6IERNQSBDIHVwcGVyIGNudCA9IDB4JTAyeCAgICAweDNkOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFkKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2QpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWU6IFBDTSByYXRlIGxvdyAgICA9IDB4JTAyeCAgICAweDNlOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFlKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2UpKTsKKwlkZXZfZGJnKHNvbmljLT5jYXJkLT5kZXYsCisJCSIgIDB4MWY6IFBDTSByYXRlIGhpZ2ggICA9IDB4JTAyeCAgICAweDNmOiAtLS0gICAgICAgICAgICAgPSAweCUwMnhcbiIsCisJCXNuZF9zb25pY3ZpYmVzX2luKHNvbmljLCAweDFmKSwgc25kX3NvbmljdmliZXNfaW4oc29uaWMsIDB4M2YpKTsKIH0KIAogI2VuZGlmCkBAIC01MTEsOCArNTExLDEwIEBACiAJKnJlc19tID0gbTsKIAkqcmVzX24gPSBuOwogI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAibWV0cmljID0gJWksIHhtID0gJWksIHhuID0gJWlcbiIsIG1ldHJpYywgeG0sIHhuKTsKLQlwcmludGsoS0VSTl9ERUJVRyAicGxsOiBtID0gMHgleCwgciA9IDB4JXgsIG4gPSAweCV4XG4iLCByZWcsIG0sIHIsIG4pOworCWRldl9kYmcoc29uaWMtPmNhcmQtPmRldiwKKwkJIm1ldHJpYyA9ICVpLCB4bSA9ICVpLCB4biA9ICVpXG4iLCBtZXRyaWMsIHhtLCB4bik7CisJZGV2X2RiZyhzb25pYy0+Y2FyZC0+ZGV2LAorCQkicGxsOiBtID0gMHgleCwgciA9IDB4JXgsIG4gPSAweCV4XG4iLCByZWcsIG0sIHIsIG4pOwogI2VuZGlmCiB9CiAKQEAgLTYyNCw3ICs2MjYsOCBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJaWYgKHN0YXR1cyA9PSAweGZmKSB7CS8qIGZhaWx1cmUgKi8KIAkJb3V0Yihzb25pYy0+aXJxbWFzayA9IH4wLCBTVl9SRUcoc29uaWMsIElSUU1BU0spKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSVJRIGZhaWx1cmUgLSBpbnRlcnJ1cHRzIGRpc2FibGVkISFcbiIpOworCQlkZXZfZXJyKHNvbmljLT5jYXJkLT5kZXYsCisJCQkiSVJRIGZhaWx1cmUgLSBpbnRlcnJ1cHRzIGRpc2FibGVkISFcbiIpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCWlmIChzb25pYy0+cGNtKSB7CkBAIC0xMTk4LDcgKzEyMDEsOCBAQAogCiAJc29uaWMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgInNvbmljdmliZXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2Vycihzb25pYy0+Y2FyZC0+ZGV2LAorCQkJInNvbmljdmliZXM6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjY3LDcgKzEyNzEsOCBAQAogCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjQgYml0cyAqLwogICAgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSygyNCkpIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMjQpKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CiAgICAgICAgIH0KQEAgLTEyOTYsNyArMTMwMSw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9zb25pY3ZpYmVzX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgc29uaWMpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xMzEwLDI0ICsxMzE1LDMyIEBACiAJaWYgKCFkbWFhKSB7CiAJCWRtYWEgPSBkbWFpbzsKIAkJZG1haW8gKz0gMHgxMDsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkJJT1MgZGlkIG5vdCBhbGxvY2F0ZSBERE1BIGNoYW5uZWwgQSBpL28sIGFsbG9jYXRlZCBhdCAweCV4XG4iLCBkbWFhKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkJICJCSU9TIGRpZCBub3QgYWxsb2NhdGUgRERNQSBjaGFubmVsIEEgaS9vLCBhbGxvY2F0ZWQgYXQgMHgleFxuIiwKKwkJCSBkbWFhKTsKIAl9CiAJaWYgKCFkbWFjKSB7CiAJCWRtYWMgPSBkbWFpbzsKIAkJZG1haW8gKz0gMHgxMDsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkJJT1MgZGlkIG5vdCBhbGxvY2F0ZSBERE1BIGNoYW5uZWwgQyBpL28sIGFsbG9jYXRlZCBhdCAweCV4XG4iLCBkbWFjKTsKKwkJZGV2X2luZm8oY2FyZC0+ZGV2LAorCQkJICJCSU9TIGRpZCBub3QgYWxsb2NhdGUgRERNQSBjaGFubmVsIEMgaS9vLCBhbGxvY2F0ZWQgYXQgMHgleFxuIiwKKwkJCSBkbWFjKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIDB4NDAsIGRtYWEpOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCAweDQ4LCBkbWFjKTsKIAogCWlmICgoc29uaWMtPnJlc19kbWFhID0gcmVxdWVzdF9yZWdpb24oZG1hYSwgMHgxMCwgIlMzIFNvbmljVmliZXMgRERNQS1BIikpID09IE5VTEwpIHsKIAkJc25kX3NvbmljdmliZXNfZnJlZShzb25pYyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIERETUEtQSBwb3J0IGF0IDB4JXgtMHgleFxuIiwgZG1hYSwgZG1hYSArIDB4MTAgLSAxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGdyYWIgRERNQS1BIHBvcnQgYXQgMHgleC0weCV4XG4iLAorCQkJZG1hYSwgZG1hYSArIDB4MTAgLSAxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaWYgKChzb25pYy0+cmVzX2RtYWMgPSByZXF1ZXN0X3JlZ2lvbihkbWFjLCAweDEwLCAiUzMgU29uaWNWaWJlcyBERE1BLUMiKSkgPT0gTlVMTCkgewogCQlzbmRfc29uaWN2aWJlc19mcmVlKHNvbmljKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgRERNQS1DIHBvcnQgYXQgMHgleC0weCV4XG4iLCBkbWFjLCBkbWFjICsgMHgxMCAtIDEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJ1bmFibGUgdG8gZ3JhYiBERE1BLUMgcG9ydCBhdCAweCV4LTB4JXhcbiIsCisJCQlkbWFjLCBkbWFjICsgMHgxMCAtIDEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMTM5Miw4ICsxNDA1LDYgQEAKIAogCXNuZF9zb25pY3ZpYmVzX3Byb2NfaW5pdChzb25pYyk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcnNvbmljID0gc29uaWM7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDU5LDcgKzE0NzAsOCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAgCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZm9yIChpZHggPSAwOyBpZHggPCA1OyBpZHgrKykgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCmluZGV4IGIzYjU4OGIuLmQ4NTI0NTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMKQEAgLTg5LDcgKzg5LDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKaW5kZXggZmIwZTE1OC4uMTI3MmMxOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKQEAgLTY5LDQwICs2OSw0MCBAQAogewogCXVuc2lnbmVkIGludCB2YWwsIHRtcDsKIAotCXByaW50ayhLRVJOX0RFQlVHICJUcmlkZW50IHZvaWNlICVpOlxuIiwgdm9pY2UpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiVHJpZGVudCB2b2ljZSAlaTpcbiIsIHZvaWNlKTsKIAlvdXRiKHZvaWNlLCBUUklEX1JFRyh0cmlkZW50LCBUNERfTEZPX0dDX0NJUikpOwogCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9MQkEpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTEJBOiAweCV4XG4iLCB2YWwpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiTEJBOiAweCV4XG4iLCB2YWwpOwogCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9HVlNFTF9QQU5fVk9MX0NUUkxfRUMpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiR1ZTZWw6ICVpXG4iLCB2YWwgPj4gMzEpOwotCXByaW50ayhLRVJOX0RFQlVHICJQYW46IDB4JXhcbiIsICh2YWwgPj4gMjQpICYgMHg3Zik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlZvbDogMHgleFxuIiwgKHZhbCA+PiAxNikgJiAweGZmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiQ1RSTDogMHgleFxuIiwgKHZhbCA+PiAxMikgJiAweDBmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiRUM6IDB4JXhcbiIsIHZhbCAmIDB4MGZmZik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJHVlNlbDogJWlcbiIsIHZhbCA+PiAzMSk7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJQYW46IDB4JXhcbiIsICh2YWwgPj4gMjQpICYgMHg3Zik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJWb2w6IDB4JXhcbiIsICh2YWwgPj4gMTYpICYgMHhmZik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJDVFJMOiAweCV4XG4iLCAodmFsID4+IDEyKSAmIDB4MGYpOworCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiRUM6IDB4JXhcbiIsIHZhbCAmIDB4MGZmZik7CiAJaWYgKHRyaWRlbnQtPmRldmljZSAhPSBUUklERU5UX0RFVklDRV9JRF9OWCkgewogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfQ1NPX0FMUEhBX0ZNUykpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ1NPOiAweCV4XG4iLCB2YWwgPj4gMTYpOwotCQlwcmludGsoIkFscGhhOiAweCV4XG4iLCAodmFsID4+IDQpICYgMHgwZmZmKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkZNUzogMHgleFxuIiwgdmFsICYgMHgwZik7CisJCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQ1NPOiAweCV4XG4iLCB2YWwgPj4gMTYpOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFscGhhOiAweCV4XG4iLCAodmFsID4+IDQpICYgMHgwZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJGTVM6IDB4JXhcbiIsIHZhbCAmIDB4MGYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfRFhfRVNPX0RFTFRBKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFU086IDB4JXhcbiIsIHZhbCA+PiAxNik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJEZWx0YTogMHgleFxuIiwgdmFsICYgMHhmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJFU086IDB4JXhcbiIsIHZhbCA+PiAxNik7CisJCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiRGVsdGE6IDB4JXhcbiIsIHZhbCAmIDB4ZmZmZik7CiAJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9EWF9GTUNfUlZPTF9DVk9MKSk7CiAJfSBlbHNlIHsJCS8vIFRSSURFTlRfREVWSUNFX0lEX05YCiAJCXZhbCA9IGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9OWF9ERUxUQV9DU08pKTsKIAkJdG1wID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ1NPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJDU086IDB4JXhcbiIsIHZhbCAmIDB4MDBmZmZmZmYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfREVMVEFfRVNPKSk7CiAJCXRtcCB8PSAodmFsID4+IDE2KSAmIDB4ZmYwMDsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkRlbHRhOiAweCV4XG4iLCB0bXApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiRVNPOiAweCV4XG4iLCB2YWwgJiAweDAwZmZmZmZmKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJEZWx0YTogMHgleFxuIiwgdG1wKTsKKwkJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICJFU086IDB4JXhcbiIsIHZhbCAmIDB4MDBmZmZmZmYpOwogCQl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfTlhfQUxQSEFfRk1TX0ZNQ19SVk9MX0NWT0wpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkFscGhhOiAweCV4XG4iLCB2YWwgPj4gMjApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiRk1TOiAweCV4XG4iLCAodmFsID4+IDE2KSAmIDB4MGYpOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFscGhhOiAweCV4XG4iLCB2YWwgPj4gMjApOworCQlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkZNUzogMHgleFxuIiwgKHZhbCA+PiAxNikgJiAweDBmKTsKIAl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkZNQzogMHgleFxuIiwgKHZhbCA+PiAxNCkgJiAzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUlZvbDogMHgleFxuIiwgKHZhbCA+PiA3KSAmIDB4N2YpOwotCXByaW50ayhLRVJOX0RFQlVHICJDVm9sOiAweCV4XG4iLCB2YWwgJiAweDdmKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkZNQzogMHgleFxuIiwgKHZhbCA+PiAxNCkgJiAzKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIlJWb2w6IDB4JXhcbiIsICh2YWwgPj4gNykgJiAweDdmKTsKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIkNWb2w6IDB4JXhcbiIsIHZhbCAmIDB4N2YpOwogfQogI2VuZGlmCiAKQEAgLTE1Niw3ICsxNTYsOCBAQAogCX0KIAogCWlmIChjb3VudCA9PSAwICYmICF0cmlkZW50LT5hYzk3X2RldGVjdCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhYzk3IGNvZGVjIHJlYWQgVElNRU9VVCBbMHgleC8weCV4XSEhIVxuIiwKKwkJZGV2X2Vycih0cmlkZW50LT5jYXJkLT5kZXYsCisJCQkiYWM5NyBjb2RlYyByZWFkIFRJTUVPVVQgWzB4JXgvMHgleF0hISFcbiIsCiAJCQkgICByZWcsIGRhdGEpOwogCQlkYXRhID0gMDsKIAl9CkBAIC00OTcsMTYgKzQ5OCwxNiBAQAogCW91dGwocmVnc1s0XSwgVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyAxNikpOwogCiAjaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJ3cml0dGVuICVpIGNoYW5uZWw6XG4iLCB2b2ljZS0+bnVtYmVyKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICByZWdzWzBdID0gMHgleC8weCV4XG4iLAorCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAid3JpdHRlbiAlaSBjaGFubmVsOlxuIiwgdm9pY2UtPm51bWJlcik7CisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbMF0gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbMF0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDApKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiAgcmVnc1sxXSA9IDB4JXgvMHgleFxuIiwKKwlkZXZfZGJnKHRyaWRlbnQtPmNhcmQtPmRldiwgIiAgcmVnc1sxXSA9IDB4JXgvMHgleFxuIiwKIAkgICAgICAgcmVnc1sxXSwgaW5sKFRSSURfUkVHKHRyaWRlbnQsIENIX1NUQVJUICsgNCkpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICByZWdzWzJdID0gMHgleC8weCV4XG4iLAorCWRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAiICByZWdzWzJdID0gMHgleC8weCV4XG4iLAogCSAgICAgICByZWdzWzJdLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgQ0hfU1RBUlQgKyA4KSkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIHJlZ3NbM10gPSAweCV4LzB4JXhcbiIsCisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbM10gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbM10sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDEyKSkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIHJlZ3NbNF0gPSAweCV4LzB4JXhcbiIsCisJZGV2X2RiZyh0cmlkZW50LT5jYXJkLT5kZXYsICIgIHJlZ3NbNF0gPSAweCV4LzB4JXhcbiIsCiAJICAgICAgIHJlZ3NbNF0sIGlubChUUklEX1JFRyh0cmlkZW50LCBDSF9TVEFSVCArIDE2KSkpOwogI2VuZGlmCiB9CkBAIC01ODksNyArNTkwLDcgQEAKIAkJb3V0Yih2b2ljZS0+Vm9sID4+IDIsIFRSSURfUkVHKHRyaWRlbnQsIENIX0dWU0VMX1BBTl9WT0xfQ1RSTF9FQyArIDIpKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6Ci0JCS8qIHByaW50ayhLRVJOX0RFQlVHICJ2b2ljZS0+Vm9sID0gMHgleFxuIiwgdm9pY2UtPlZvbCk7ICovCisJCS8qIGRldl9kYmcodHJpZGVudC0+Y2FyZC0+ZGV2LCAidm9pY2UtPlZvbCA9IDB4JXhcbiIsIHZvaWNlLT5Wb2wpOyAqLwogCQlvdXR3KCh2b2ljZS0+Q1RSTCA8PCAxMikgfCB2b2ljZS0+Vm9sLAogCQkgICAgIFRSSURfUkVHKHRyaWRlbnQsIENIX0dWU0VMX1BBTl9WT0xfQ1RSTF9FQykpOwogCQlicmVhazsKQEAgLTMwMTMsMTMgKzMwMTQsMTUgQEAKIAkJX2FjOTcubnVtID0gMTsKIAkJZXJyID0gc25kX2FjOTdfbWl4ZXIodHJpZGVudC0+YWM5N19idXMsICZfYWM5NywgJnRyaWRlbnQtPmFjOTdfc2VjKTsKIAkJaWYgKGVyciA8IDApCi0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTSTcwMTg6IHRoZSBzZWNvbmRhcnkgY29kZWMgLSBpbnZhbGlkIGFjY2Vzc1xuIik7CisJCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwKKwkJCQkiU0k3MDE4OiB0aGUgc2Vjb25kYXJ5IGNvZGVjIC0gaW52YWxpZCBhY2Nlc3NcbiIpOwogI2lmIDAJLy8gb25seSBmb3IgbXkgdGVzdGluZyBwdXJwb3NlIC0tamsKIAkJewogCQkJc3RydWN0IHNuZF9hYzk3ICptYzk3OwogCQkJZXJyID0gc25kX2FjOTdfbW9kZW0odHJpZGVudC0+Y2FyZCwgJl9hYzk3LCAmbWM5Nyk7CiAJCQlpZiAoZXJyIDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzbmRfYWM5N19tb2RlbSByZXR1cm5lZCBlcnJvciAlaVxuIiwgZXJyKTsKKwkJCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwKKwkJCQkJInNuZF9hYzk3X21vZGVtIHJldHVybmVkIGVycm9yICVpXG4iLCBlcnIpOwogCQl9CiAjZW5kaWYKIAl9CkBAIC0zMTk3LDcgKzMyMDAsOCBAQAogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzI3MCw3ICszMjc0LDggQEAKIAkJCWdvdG8gX19zaTcwMThfb2s7CiAJCWRvX2RlbGF5KHRyaWRlbnQpOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBjb2RlYyByZWFkeSBlcnJvciBbMHgleF1cbiIsIGlubChUUklEX1JFRyh0cmlkZW50LCBTSV9TRVJJQUxfSU5URl9DVFJMKSkpOworCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLAorCQlpbmwoVFJJRF9SRUcodHJpZGVudCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpKTsKIAlpZiAoci0tID4gMCkgewogCQllbmRfdGltZSA9IGppZmZpZXMgKyBIWjsKIAkJZG8gewpAQCAtMzM2Nyw3ICszMzcyLDcgQEAKIAogCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgc25kX2RtYV9wY2lfZGF0YSh0cmlkZW50LT5wY2kpLAogCQkJCTIgKiBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQsICZ0cmlkZW50LT50bGIuYnVmZmVyKSA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIFRMQiBidWZmZXJcbiIpOworCQlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBUTEIgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXRyaWRlbnQtPnRsYi5lbnRyaWVzID0gKHVuc2lnbmVkIGludCopQUxJR04oKHVuc2lnbmVkIGxvbmcpdHJpZGVudC0+dGxiLmJ1ZmZlci5hcmVhLCBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIDQpOwpAQCAtMzM3NSwxMyArMzM4MCwxNCBAQAogCS8qIGFsbG9jYXRlIHNoYWRvdyBUTEIgcGFnZSB0YWJsZSAodmlydHVhbCBhZGRyZXNzZXMpICovCiAJdHJpZGVudC0+dGxiLnNoYWRvd19lbnRyaWVzID0gdm1hbGxvYyhTTkRSVl9UUklERU5UX01BWF9QQUdFUypzaXplb2YodW5zaWduZWQgbG9uZykpOwogCWlmICh0cmlkZW50LT50bGIuc2hhZG93X2VudHJpZXMgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgc2hhZG93IFRMQiBlbnRyaWVzXG4iKTsKKwkJZGV2X2Vycih0cmlkZW50LT5jYXJkLT5kZXYsCisJCQkidW5hYmxlIHRvIGFsbG9jYXRlIHNoYWRvdyBUTEIgZW50cmllc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAkvKiBhbGxvY2F0ZSBhbmQgc2V0dXAgc2lsZW50IHBhZ2UgYW5kIGluaXRpYWxpc2UgVExCIGVudHJpZXMgKi8KIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEodHJpZGVudC0+cGNpKSwKIAkJCQlTTkRSVl9UUklERU5UX1BBR0VfU0laRSwgJnRyaWRlbnQtPnRsYi5zaWxlbnRfcGFnZSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBzaWxlbnQgcGFnZVxuIik7CisJCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHNpbGVudCBwYWdlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1lbXNldCh0cmlkZW50LT50bGIuc2lsZW50X3BhZ2UuYXJlYSwgMCwgU05EUlZfVFJJREVOVF9QQUdFX1NJWkUpOwpAQCAtMzQzOSw3ICszNDQ1LDcgQEAKIAkJCWdvdG8gX19keF9vazsKIAkJZG9fZGVsYXkodHJpZGVudCk7CiAJfSB3aGlsZSAodGltZV9hZnRlcl9lcShlbmRfdGltZSwgamlmZmllcykpOwotCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IGNvZGVjIHJlYWR5IGVycm9yXG4iKTsKKwlkZXZfZXJyKHRyaWRlbnQtPmNhcmQtPmRldiwgIkFDJzk3IGNvZGVjIHJlYWR5IGVycm9yXG4iKTsKIAlyZXR1cm4gLUVJTzsKIAogIF9fZHhfb2s6CkBAIC0zNDc3LDcgKzM0ODMsOCBAQAogCQkJZ290byBfX254X29rOwogCQlkb19kZWxheSh0cmlkZW50KTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKGVuZF90aW1lLCBqaWZmaWVzKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLCBpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSkpOworCWRldl9lcnIodHJpZGVudC0+Y2FyZC0+ZGV2LCAiQUMnOTcgY29kZWMgcmVhZHkgZXJyb3IgWzB4JXhdXG4iLAorCQlpbmwoVFJJRF9SRUcodHJpZGVudCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSkpOwogCXJldHVybiAtRUlPOwogCiAgX19ueF9vazoKQEAgLTM1NjIsNyArMzU2OSw4IEBACiAJLyogY2hlY2ssIGlmIHdlIGNhbiByZXN0cmljdCBQQ0kgRE1BIHRyYW5zZmVycyB0byAzMCBiaXRzICovCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soMzApKSA8IDAgfHwKIAkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaSwgRE1BX0JJVF9NQVNLKDMwKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMwYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzBiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0zNjAwLDcgKzM2MDgsNyBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdHJpZGVudF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHRyaWRlbnQpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdHJpZGVudF9mcmVlKHRyaWRlbnQpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTM2NjQsNyArMzY3Miw2IEBACiAJc25kX3RyaWRlbnRfZW5hYmxlX2Vzbyh0cmlkZW50KTsKIAogCXNuZF90cmlkZW50X3Byb2NfaW5pdCh0cmlkZW50KTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CiAJKnJ0cmlkZW50ID0gdHJpZGVudDsKIAlyZXR1cm4gMDsKIH0KQEAgLTM5NTAsOCArMzk1Nyw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCA1YWU2ZjA0Li45NWI5OGY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CisJCQkJZGV2X2VycigmcGNpLT5kZXYsICJ0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CkBAIC00NzQsOCArNDc0LDkgQEAKIAkJCX0gZWxzZQogCQkJCWZsYWcgPSAwOyAvKiBwZXJpb2QgY29udGludWVzIHRvIHRoZSBuZXh0ICovCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZpYTogdGJsICVkOiBhdCAlZCAgc2l6ZSAlZCAiCi0JCQkgICAgICAgIihyZXN0ICVkKVxuIiwgaWR4LCBvZnMsIHIsIHJlc3QpOworCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJInRibCAlZDogYXQgJWQgIHNpemUgJWQgKHJlc3QgJWQpXG4iLAorCQkJCWlkeCwgb2ZzLCByLCByZXN0KTsKIAkJCSovCiAJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbKGlkeDw8MSkgKyAxXSA9IGNwdV90b19sZTMyKHIgfCBmbGFnKTsKIAkJCWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ID0gb2ZzOwpAQCAtNTI4LDcgKzUyOSw3IEBACiAJCWlmICghKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkpCiAJCQlyZXR1cm4gdmFsICYgMHhmZmZmOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgJWkgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAogCQkgICBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTU4Nyw3ICs1ODgsOCBAQAogCXh2YWwgfD0gKHJlZyAmIDB4N2YpIDw8IFZJQV9SRUdfQUM5N19DTURfU0hJRlQ7CiAgICAgICAJd2hpbGUgKDEpIHsKICAgICAgIAkJaWYgKGFnYWluKysgPiAzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkOiBjb2RlYyAlaSBpcyBub3QgdmFsaWQgWzB4JXhdXG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQ6IGNvZGVjICVpIGlzIG5vdCB2YWxpZCBbMHgleF1cbiIsCiAJCQkJICAgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CiAJCSAgICAgIAlyZXR1cm4gMHhmZmZmOwogCQl9CkBAIC03NzcsNyArNzc5LDkgQEAKIAkoKHBvcykgPCB2aWFkZXYtPmxhc3Rwb3MgJiYgKChwb3MpID49IHZpYWRldi0+YnVmc2l6ZTIgfHxcCiAJCQkJICAgICB2aWFkZXYtPmxhc3Rwb3MgPCB2aWFkZXYtPmJ1ZnNpemUyKSkKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19saW5lYXJfcG9zKHN0cnVjdCB2aWFkZXYgKnZpYWRldiwgdW5zaWduZWQgaW50IGlkeCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfbGluZWFyX3BvcyhzdHJ1Y3QgdmlhODJ4eCAqY2hpcCwKKwkJCQkJICAgc3RydWN0IHZpYWRldiAqdmlhZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaWR4LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IHNpemUsIGJhc2UsIHJlczsKQEAgLTc5MCw3ICs3OTQsOCBAQAogCiAJLyogY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9uICovCiAJaWYgKHNpemUgPCBjb3VudCkgewotCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoc2l6ZSA9ICVkLCBjb3VudCA9ICVkKVxuIiwKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKHNpemUgPSAlZCwgY291bnQgPSAlZClcbiIsCiAJCQkgICAoaW50KXNpemUsIChpbnQpY291bnQpOwogCQlyZXMgPSB2aWFkZXYtPmxhc3Rwb3M7CiAJfSBlbHNlIHsKQEAgLTgwNyw5ICs4MTIsOSBAQAogCQl9CiAJCWlmIChjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYsIHJlcykpIHsKICNpZmRlZiBQT0lOVEVSX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiZmFpbDogaWR4ID0gJWkvJWksIGxhc3Rwb3MgPSAweCV4LCAiCi0JCQkgICAgICAgImJ1ZnNpemUyID0gMHgleCwgb2Zmc2l6ZSA9IDB4JXgsIHNpemUgPSAweCV4LCAiCi0JCQkgICAgICAgImNvdW50ID0gMHgleFxuIiwgaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLAorCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgYnVmc2l6ZTIgPSAweCV4LCBvZmZzaXplID0gMHgleCwgc2l6ZSA9IDB4JXgsIGNvdW50ID0gMHgleFxuIiwKKwkJCQlpZHgsIHZpYWRldi0+dGJsX2VudHJpZXMsCiAJCQkgICAgICAgdmlhZGV2LT5sYXN0cG9zLCB2aWFkZXYtPmJ1ZnNpemUyLAogCQkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0LAogCQkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0uc2l6ZSwgY291bnQpOwpAQCAtODE3LDggKzgyMiw4IEBACiAJCQkvKiBjb3VudCByZWdpc3RlciByZXR1cm5zIGZ1bGwgc2l6ZSB3aGVuIGVuZCBvZiBidWZmZXIgaXMgcmVhY2hlZCAqLwogCQkJcmVzID0gYmFzZSArIHNpemU7CiAJCQlpZiAoY2hlY2tfaW52YWxpZF9wb3ModmlhZGV2LCByZXMpKSB7Ci0JCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKDIpLCAiCi0JCQkJCSAgICJ1c2luZyBsYXN0IHZhbGlkIHBvaW50ZXJcbiIpOworCQkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIgKDIpLCB1c2luZyBsYXN0IHZhbGlkIHBvaW50ZXJcbiIpOwogCQkJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAkJCX0KIAkJfQpAQCAtODUwLDcgKzg1NSw3IEBACiAJCWlkeCA9IDA7CiAJZWxzZSAvKiBDVVJSX1BUUiBob2xkcyB0aGUgYWRkcmVzcyArIDggKi8KIAkJaWR4ID0gKChwdHIgLSAodW5zaWduZWQgaW50KXZpYWRldi0+dGFibGUuYWRkcikgLyA4IC0gMSkgJSB2aWFkZXYtPnRibF9lbnRyaWVzOwotCXJlcyA9IGNhbGNfbGluZWFyX3Bvcyh2aWFkZXYsIGlkeCwgY291bnQpOworCXJlcyA9IGNhbGNfbGluZWFyX3BvcyhjaGlwLCB2aWFkZXYsIGlkeCwgY291bnQpOwogCXZpYWRldi0+bGFzdHBvcyA9IHJlczsgLyogcmVtZW1iZXIgdGhlIGxhc3QgcG9zaXRpb24gKi8KIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCkBAIC04ODksMTMgKzg5NCwxNCBAQAogCQlpZHggPSBjb3VudCA+PiAyNDsKIAkJaWYgKGlkeCA+PSB2aWFkZXYtPnRibF9lbnRyaWVzKSB7CiAjaWZkZWYgUE9JTlRFUl9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWw6IGludmFsaWQgaWR4ID0gJWkvJWlcbiIsIGlkeCwKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJmYWlsOiBpbnZhbGlkIGlkeCA9ICVpLyVpXG4iLCBpZHgsCiAJCQkgICAgICAgdmlhZGV2LT50YmxfZW50cmllcyk7CiAjZW5kaWYKIAkJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAkJfSBlbHNlIHsKIAkJCWNvdW50ICY9IDB4ZmZmZmZmOwotCQkJcmVzID0gY2FsY19saW5lYXJfcG9zKHZpYWRldiwgaWR4LCBjb3VudCk7CisJCQlyZXMgPSBjYWxjX2xpbmVhcl9wb3MoY2hpcCwgdmlhZGV2LCBpZHgsIGNvdW50KTsKIAkJfQogCX0gZWxzZSB7CiAJCXJlcyA9IHZpYWRldi0+aHdwdHJfZG9uZTsKQEAgLTE5NDAsMTQgKzE5NDYsMTUgQEAKIAogCXIgPSByZXF1ZXN0X3JlZ2lvbihKT1lTVElDS19BRERSLCA4LCAiVklBNjg2IGdhbWVwb3J0Iik7CiAJaWYgKCFyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInZpYTgyeHg6IGNhbm5vdCByZXNlcnZlIGpveXN0aWNrIHBvcnQgJSN4XG4iLAorCQlkZXZfd2FybihjaGlwLT5jYXJkLT5kZXYsICJjYW5ub3QgcmVzZXJ2ZSBqb3lzdGljayBwb3J0ICUjeFxuIiwKIAkJICAgICAgIEpPWVNUSUNLX0FERFIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWNoaXAtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCkgewotCQlwcmludGsoS0VSTl9FUlIgInZpYTgyeHg6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOwogCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKHIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMDE2LDcgKzIwMjMsOCBAQAogCQlzdHJjcHkoc2lkLm5hbWUsICJQQ00gUGxheWJhY2sgVm9sdW1lIik7CiAJCXNpZC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOwogCQlpZiAoISBzbmRfY3RsX2ZpbmRfaWQoY2hpcC0+Y2FyZCwgJnNpZCkpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9JTkZPICJVc2luZyBEWFMgYXMgUENNIFBsYXliYWNrXG4iKTsKKwkJCWRldl9pbmZvKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgIlVzaW5nIERYUyBhcyBQQ00gUGxheWJhY2tcbiIpOwogCQkJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfdmlhODIzM19wY21keHNfdm9sdW1lX2NvbnRyb2wsIGNoaXApKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CkBAIC0yMTAyLDggKzIxMTAsOSBAQAogCQkJCQltcHVfcG9ydCwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8CiAJCQkJCU1QVTQwMV9JTkZPX0lSUV9IT09LLCAtMSwKIAkJCQkJJmNoaXAtPnJtaWRpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDEiCi0JCQkgICAgICAgIiBhdCAweCVseCwgc2tpcHBpbmdcbiIsIG1wdV9wb3J0KTsKKwkJCWRldl93YXJuKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDEgYXQgMHglbHgsIHNraXBwaW5nXG4iLAorCQkJCSBtcHVfcG9ydCk7CiAJCQlsZWdhY3kgJj0gflZJQV9GVU5DX0VOQUJMRV9NSURJOwogCQl9IGVsc2UgewogCQkJbGVnYWN5ICY9IH5WSUFfRlVOQ19NSURJX0lSUU1BU0s7CS8qIGVuYWJsZSBNSURJIGludGVycnVwdCAqLwpAQCAtMjIwMyw3ICsyMjEyLDggQEAKIAl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOwogCiAJaWYgKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgdmFsKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiQUMnOTcgY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwgdmFsKTsKIAogI2lmIDAgLyogRklYTUU6IHdlIGRvbid0IHN1cHBvcnQgdGhlIHNlY29uZCBjb2RlYyB5ZXQgc28gc2tpcCB0aGUgZGV0ZWN0aW9uIG5vdy4uICovCiAJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKQEAgLTIzMDMsOCArMjMxMyw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNDE3LDcgKzI0MjYsNyBAQAogCQkJc25kX3ZpYTgyMzNfaW50ZXJydXB0IDoJc25kX3ZpYTY4Nl9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX3ZpYTgyeHhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNDQxLDggKzI0NTAsNiBAQAogCSAqIFdlIGNhbGwgcGNpX3NldF9tYXN0ZXIgaGVyZSBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQuICovCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyX3ZpYSA9IGNoaXA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTE2LDcgKzI1MjMsNyBAQAogCiAJdyA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgZHhzX3doaXRlbGlzdCk7CiAJaWYgKHcpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJ2aWE4Mnh4OiBEWFMgd2hpdGUgbGlzdCBmb3IgJXMgZm91bmRcbiIsCisJCWRldl9kYmcoJnBjaS0+ZGV2LCAiRFhTIHdoaXRlIGxpc3QgZm9yICVzIGZvdW5kXG4iLAogCQkJICAgIHNuZF9wY2lfcXVpcmtfbmFtZSh3KSk7CiAJCXJldHVybiB3LT52YWx1ZTsKIAl9CkBAIC0yNTI4LDEwICsyNTM1LDEwIEBACiAJLyoKIAkgKiBub3QgZGV0ZWN0ZWQsIHRyeSA0OGsgcmF0ZSBvbmx5IHRvIGJlIHN1cmUuCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTyAidmlhODJ4eDogQXNzdW1pbmcgRFhTIGNoYW5uZWxzIHdpdGggNDhrIGZpeGVkIHNhbXBsZSByYXRlLlxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgUGxlYXNlIHRyeSBkeHNfc3VwcG9ydD01IG9wdGlvblxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgYW5kIHJlcG9ydCBpZiBpdCB3b3JrcyBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWFkIEFMU0EtQ29uZmlndXJhdGlvbi50eHQuXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICJBc3N1bWluZyBEWFMgY2hhbm5lbHMgd2l0aCA0OGsgZml4ZWQgc2FtcGxlIHJhdGUuXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICIgICAgICAgICBQbGVhc2UgdHJ5IGR4c19zdXBwb3J0PTUgb3B0aW9uXG4iKTsKKwlkZXZfaW5mbygmcGNpLT5kZXYsICIgICAgICAgICBhbmQgcmVwb3J0IGlmIGl0IHdvcmtzIG9uIHlvdXIgbWFjaGluZS5cbiIpOworCWRldl9pbmZvKCZwY2ktPmRldiwgIiAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlYWQgQUxTQS1Db25maWd1cmF0aW9uLnR4dC5cbiIpOwogCXJldHVybiBWSUFfRFhTXzQ4SzsKIH07CiAKQEAgLTI1NDQsNyArMjU1MSw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNTg0LDcgKzI1OTEsNyBAQAogCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlZJQTgyMzMiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBjYXJkIHR5cGUgJWRcbiIsIGNhcmRfdHlwZSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiaW52YWxpZCBjYXJkIHR5cGUgJWRcbiIsIGNhcmRfdHlwZSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwppbmRleCBjYTE5MDI4Li40NmEwNTI2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CisJCQkJZGV2X2VycigmcGNpLT5kZXYsICJ0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CkBAIC0zMjksOCArMzI5LDkgQEAKIAkJCX0gZWxzZQogCQkJCWZsYWcgPSAwOyAvKiBwZXJpb2QgY29udGludWVzIHRvIHRoZSBuZXh0ICovCiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZpYTogdGJsICVkOiBhdCAlZCAgc2l6ZSAlZCAiCi0JCQkgICAgICAgIihyZXN0ICVkKVxuIiwgaWR4LCBvZnMsIHIsIHJlc3QpOworCQkJZGV2X2RiZygmcGNpLT5kZXYsCisJCQkJInRibCAlZDogYXQgJWQgIHNpemUgJWQgKHJlc3QgJWQpXG4iLAorCQkJCWlkeCwgb2ZzLCByLCByZXN0KTsKIAkJCSovCiAJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbKGlkeDw8MSkgKyAxXSA9IGNwdV90b19sZTMyKHIgfCBmbGFnKTsKIAkJCWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ID0gb2ZzOwpAQCAtMzgyLDcgKzM4Myw3IEBACiAJCWlmICghKCh2YWwgPSBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSkgJiBWSUFfUkVHX0FDOTdfQlVTWSkpCiAJCQlyZXR1cm4gdmFsICYgMHhmZmZmOwogCX0KLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkeTogY29kZWMgJWkgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwgImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAogCQkgICBzZWNvbmRhcnksIHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTQ0Myw3ICs0NDQsOCBAQAogCXh2YWwgfD0gKHJlZyAmIDB4N2YpIDw8IFZJQV9SRUdfQUM5N19DTURfU0hJRlQ7CiAgICAgICAJd2hpbGUgKDEpIHsKICAgICAgIAkJaWYgKGFnYWluKysgPiAzKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb2RlY19yZWFkOiBjb2RlYyAlaSBpcyBub3QgdmFsaWQgWzB4JXhdXG4iLAorCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkJImNvZGVjX3JlYWQ6IGNvZGVjICVpIGlzIG5vdCB2YWxpZCBbMHgleF1cbiIsCiAJCQkJICAgYWM5Ny0+bnVtLCBzbmRfdmlhODJ4eF9jb2RlY194cmVhZChjaGlwKSk7CiAJCSAgICAgIAlyZXR1cm4gMHhmZmZmOwogCQl9CkBAIC01NjAsNyArNTYyLDkgQEAKIAkoKHBvcykgPCB2aWFkZXYtPmxhc3Rwb3MgJiYgKChwb3MpID49IHZpYWRldi0+YnVmc2l6ZTIgfHxcCiAJCQkJICAgICB2aWFkZXYtPmxhc3Rwb3MgPCB2aWFkZXYtPmJ1ZnNpemUyKSkKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19saW5lYXJfcG9zKHN0cnVjdCB2aWFkZXYgKnZpYWRldiwgdW5zaWduZWQgaW50IGlkeCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfbGluZWFyX3BvcyhzdHJ1Y3QgdmlhODJ4eF9tb2RlbSAqY2hpcCwKKwkJCQkJICAgc3RydWN0IHZpYWRldiAqdmlhZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgaWR4LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IHNpemUsIHJlczsKQEAgLTU3MCwyMCArNTc0LDIxIEBACiAKIAkvKiBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGNhbGN1bGF0ZWQgcG9zaXRpb24gKi8KIAlpZiAoc2l6ZSA8IGNvdW50KSB7Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgdmlhODJ4eF9jdXJfcHRyIChzaXplID0gJWQsIGNvdW50ID0gJWQpXG4iLAorCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoc2l6ZSA9ICVkLCBjb3VudCA9ICVkKVxuIiwKIAkJCSAgIChpbnQpc2l6ZSwgKGludCljb3VudCk7CiAJCXJlcyA9IHZpYWRldi0+bGFzdHBvczsKIAl9IGVsc2UgaWYgKGNoZWNrX2ludmFsaWRfcG9zKHZpYWRldiwgcmVzKSkgewogI2lmZGVmIFBPSU5URVJfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWw6IGlkeCA9ICVpLyVpLCBsYXN0cG9zID0gMHgleCwgIgotCQkgICAgICAgImJ1ZnNpemUyID0gMHgleCwgb2Zmc2l6ZSA9IDB4JXgsIHNpemUgPSAweCV4LCAiCi0JCSAgICAgICAiY291bnQgPSAweCV4XG4iLCBpZHgsIHZpYWRldi0+dGJsX2VudHJpZXMsIHZpYWRldi0+bGFzdHBvcywKKwkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkiZmFpbDogaWR4ID0gJWkvJWksIGxhc3Rwb3MgPSAweCV4LCBidWZzaXplMiA9IDB4JXgsIG9mZnNpemUgPSAweCV4LCBzaXplID0gMHgleCwgY291bnQgPSAweCV4XG4iLAorCQkJaWR4LCB2aWFkZXYtPnRibF9lbnRyaWVzLCB2aWFkZXYtPmxhc3Rwb3MsCiAJCSAgICAgICB2aWFkZXYtPmJ1ZnNpemUyLCB2aWFkZXYtPmlkeF90YWJsZVtpZHhdLm9mZnNldCwKIAkJICAgICAgIHZpYWRldi0+aWR4X3RhYmxlW2lkeF0uc2l6ZSwgY291bnQpOwogI2VuZGlmCiAJCWlmIChjb3VudCAmJiBzaXplIDwgY291bnQpIHsKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImludmFsaWQgdmlhODJ4eF9jdXJfcHRyLCAiCi0JCQkJICAgInVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkiaW52YWxpZCB2aWE4Mnh4X2N1cl9wdHIsIHVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CiAJCQlyZXMgPSB2aWFkZXYtPmxhc3Rwb3M7CiAJCX0gZWxzZSB7CiAJCQlpZiAoISBjb3VudCkKQEAgLTU5NSw4ICs2MDAsOCBAQAogCQkJCSAqLwogCQkJCXJlcyA9IHZpYWRldi0+aWR4X3RhYmxlW2lkeF0ub2Zmc2V0ICsgc2l6ZTsKIAkJCWlmIChjaGVja19pbnZhbGlkX3Bvcyh2aWFkZXYsIHJlcykpIHsKLQkJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoMiksICIKLQkJCQkJICAgInVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CisJCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCisJCQkJCSJpbnZhbGlkIHZpYTgyeHhfY3VyX3B0ciAoMiksIHVzaW5nIGxhc3QgdmFsaWQgcG9pbnRlclxuIik7CiAJCQkJcmVzID0gdmlhZGV2LT5sYXN0cG9zOwogCQkJfQogCQl9CkBAIC02MzIsNyArNjM3LDcgQEAKIAllbHNlIC8qIENVUlJfUFRSIGhvbGRzIHRoZSBhZGRyZXNzICsgOCAqLwogCQlpZHggPSAoKHB0ciAtICh1bnNpZ25lZCBpbnQpdmlhZGV2LT50YWJsZS5hZGRyKSAvIDggLSAxKSAlCiAJCQl2aWFkZXYtPnRibF9lbnRyaWVzOwotCXJlcyA9IGNhbGNfbGluZWFyX3Bvcyh2aWFkZXYsIGlkeCwgY291bnQpOworCXJlcyA9IGNhbGNfbGluZWFyX3BvcyhjaGlwLCB2aWFkZXYsIGlkeCwgY291bnQpOwogCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcmVzKTsKQEAgLTk5MSw3ICs5OTYsOCBAQAogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CiAKIAlpZiAoKHZhbCA9IHNuZF92aWE4Mnh4X2NvZGVjX3hyZWFkKGNoaXApKSAmIFZJQV9SRUdfQUM5N19CVVNZKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCB2YWwpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJBQyc5NyBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLCB2YWwpOwogCiAJc25kX3ZpYTgyeHhfY29kZWNfeHdyaXRlKGNoaXAsIFZJQV9SRUdfQUM5N19SRUFEIHwKIAkJCQkgVklBX1JFR19BQzk3X1NFQ09OREFSWV9WQUxJRCB8CkBAIC0xMDU0LDggKzEwNjAsNyBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidmlhODJ4eC1tb2RlbTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTEzNyw3ICsxMTQyLDcgQEAKIAljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfdmlhODJ4eF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfdmlhODJ4eF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTExNjEsOCArMTE2Niw2IEBACiAJICogV2UgY2FsbCBwY2lfc2V0X21hc3RlciBoZXJlIGJlY2F1c2UgaXQgZG9lcyBub3QgaHVydC4gKi8KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwotCiAJKnJfdmlhID0gY2hpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNzcsNyArMTE4MCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZwY2ktPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMTg4LDcgKzExOTEsNyBAQAogCQlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlZJQSA4MlhYIG1vZGVtIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOworCQlkZXZfZXJyKGNhcmQtPmRldiwgImludmFsaWQgY2FyZCB0eXBlICVkXG4iLCBjYXJkX3R5cGUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwppbmRleCBhYjhhOWIxLi5mZjkwNzRkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdngyMjIvdngyMjIuYworKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92eF9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF92eDIyMl9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE4MSw4ICsxODEsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKLQogCSpyY2hpcCA9IHZ4OwogCXJldHVybiAwOwogfQpAQCAtMjA0LDcgKzIwMiw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMjksNyArMjI4LDcgQEAKIAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCAmIDB4JWx4LCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIHZ4LT5wb3J0WzBdLCB2eC0+cG9ydFsxXSwgdngtPmNvcmUuaXJxKTsKLQlzbmRfcHJpbnRkZCgiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVpXG4iLAorCWRldl9kYmcoY2FyZC0+ZGV2LCAiJXMgYXQgMHglbHggJiAweCVseCwgaXJxICVpXG4iLAogCQkgICAgY2FyZC0+c2hvcnRuYW1lLCB2eC0+cG9ydFswXSwgdngtPnBvcnRbMV0sIHZ4LT5jb3JlLmlycSk7CiAKICNpZmRlZiBTTkRfVlhfRldfTE9BREVSCkBAIC0yODAsOCArMjc5LDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ4MjIyOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKLQkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsIGRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMKaW5kZXggYTY5ZTc3NC4uMmQxNTcwMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jCisrKyBiL3NvdW5kL3BjaS92eDIyMi92eDIyMl9vcHMuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiB7CiAJb3V0Yih2YWwsIHZ4Ml9yZWdfYWRkcihjaGlwLCBvZmZzZXQpKTsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJvdXRiOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvdXRiOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CiAJKi8KIH0KIApAQCAtMTI5LDcgKzEyOSw3IEBACiBzdGF0aWMgdm9pZCB2eDJfb3V0bChzdHJ1Y3QgdnhfY29yZSAqY2hpcCwgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHZhbCkKIHsKIAkvKgotCXByaW50ayhLRVJOX0RFQlVHICJvdXRsOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CisJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJvdXRsOiAleCAtPiAleFxuIiwgdmFsLCB2eDJfcmVnX2FkZHIoY2hpcCwgb2Zmc2V0KSk7CiAJKi8KIAlvdXRsKHZhbCwgdngyX3JlZ19hZGRyKGNoaXAsIG9mZnNldCkpOwogfQpAQCAtMTczLDcgKzE3Myw3IEBACiAJc3RydWN0IHNuZF92eDIyMiAqY2hpcCA9IChzdHJ1Y3Qgc25kX3Z4MjIyICopX2NoaXA7CiAJdW5zaWduZWQgaW50IGRhdGE7CiAKLQlzbmRfcHJpbnRkZCgidGVzdGluZyB4aWxpbnguLi5cbiIpOworCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgInRlc3RpbmcgeGlsaW54Li4uXG4iKTsKIAkvKiBUaGlzIHRlc3QgdXNlcyBzZXZlcmFsIHdyaXRlL3JlYWQgc2VxdWVuY2VzIG9uIFRFU1QwIGFuZCBURVNUMSBiaXRzCiAJICogdG8gZmlndXJlIG91dCB3aGV2ZXIgb3Igbm90IHRoZSB4aWxpbnggd2FzIGNvcnJlY3RseSBsb2FkZWQKIAkgKi8KQEAgLTE4Myw3ICsxODMsNyBAQAogCXZ4X2lubChjaGlwLCBJU1IpOwogCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAlpZiAoKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QwX01BU0spID09IFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSykgewotCQlzbmRfcHJpbnRkZCgiYmFkIVxuIik7CisJCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgImJhZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXZ4X2lubChjaGlwLCBJU1IpOwogCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAlpZiAoISAoZGF0YSAmIFZYX1NUQVRVU19WQUxfVEVTVDBfTUFTSykpIHsKLQkJc25kX3ByaW50ZGQoImJhZCEgIzJcbiIpOworCQlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJiYWQhICMyXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJdnhfaW5sKGNoaXAsIElTUik7CiAJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAkJaWYgKChkYXRhICYgVlhfU1RBVFVTX1ZBTF9URVNUMV9NQVNLKSA9PSBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spIHsKLQkJCXNuZF9wcmludGRkKCJiYWQhICMzXG4iKTsKKwkJCWRldl9kYmcoX2NoaXAtPmNhcmQtPmRldiwgImJhZCEgIzNcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIApAQCAtMjEyLDExICsyMTIsMTEgQEAKIAkJdnhfaW5sKGNoaXAsIElTUik7CiAJCWRhdGEgPSB2eF9pbmwoY2hpcCwgU1RBVFVTKTsKIAkJaWYgKCEgKGRhdGEgJiBWWF9TVEFUVVNfVkFMX1RFU1QxX01BU0spKSB7Ci0JCQlzbmRfcHJpbnRkZCgiYmFkISAjNFxuIik7CisJCQlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJiYWQhICM0XG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQotCXNuZF9wcmludGRkKCJvaywgeGlsaW54IGZpbmUuXG4iKTsKKwlkZXZfZGJnKF9jaGlwLT5jYXJkLT5kZXYsICJvaywgeGlsaW54IGZpbmUuXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk3LDcgKzM5Nyw4IEBACiAJCWkgPSB2eF9pbmwoY2hpcCwgR1BJT0MpOwogCQlpZiAoaSAmIDB4MDEwMCkKIAkJCXJldHVybiAwOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2eDIyMjogeGlsaW54IHRlc3QgZmFpbGVkIGFmdGVyIGxvYWQsIEdQSU9DPTB4JXhcbiIsIGkpOworCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJ4aWxpbnggdGVzdCBmYWlsZWQgYWZ0ZXIgbG9hZCwgR1BJT0M9MHgleFxuIiwgaSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMKaW5kZXggZTg5MzJiMi4uODJlZWQxNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jCkBAIC0xMDYsNyArMTA2LDggQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoIXIpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogbm8gZ2FtZXBvcnQgcG9ydHMgYXZhaWxhYmxlXG4iKTsKKwkJCQlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJCQkJIm5vIGdhbWVwb3J0IHBvcnRzIGF2YWlsYWJsZVxuIik7CiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIAkJfQpAQCAtMTE2LDE5ICsxMTcsMjIgQEAKIAkJY2FzZSAweDIwNDogbGVnYWN5X2N0cmwyIHw9IDIgPDwgNjsgYnJlYWs7CiAJCWNhc2UgMHgyMDU6IGxlZ2FjeV9jdHJsMiB8PSAzIDw8IDY7IGJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IGludmFsaWQgam95c3RpY2sgcG9ydCAlI3giLCBpb19wb3J0KTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJpbnZhbGlkIGpveXN0aWNrIHBvcnQgJSN4IiwgaW9fcG9ydCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAogCWlmICghciAmJiAhKHIgPSByZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCAxLCAiWU1GUENJIGdhbWVwb3J0IikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBqb3lzdGljayBwb3J0ICUjeCBpcyBpbiB1c2UuXG4iLCBpb19wb3J0KTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsCisJCQkiam95c3RpY2sgcG9ydCAlI3ggaXMgaW4gdXNlLlxuIiwgaW9fcG9ydCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJY2hpcC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKIAlpZiAoIWdwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTg3LDcgKzE5MSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmcGNpLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zMTMsNyArMzE4LDkgQEAKIAkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAogCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCiAJCQkJCSAgICAgICAtMSwgJmNoaXAtPnJhd21pZGkpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogY2Fubm90IGluaXRpYWxpemUgTVBVNDAxIGF0IDB4JWx4LCBza2lwcGluZy4uLlxuIiwgbXB1X3BvcnRbZGV2XSk7CisJCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkJICJjYW5ub3QgaW5pdGlhbGl6ZSBNUFU0MDEgYXQgMHglbHgsIHNraXBwaW5nLi4uXG4iLAorCQkJCSBtcHVfcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX01JRU47IC8qIGRpc2FibGUgTVBVNDAxIGlycSAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgbGVnYWN5X2N0cmwpOwogCQl9CkBAIC0zMjMsMTIgKzMzMCwxNCBAQAogCQkJCQkgICBmbV9wb3J0W2Rldl0sCiAJCQkJCSAgIGZtX3BvcnRbZGV2XSArIDIsCiAJCQkJCSAgIE9QTDNfSFdfT1BMMywgMSwgJm9wbDMpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogY2Fubm90IGluaXRpYWxpemUgRk0gT1BMMyBhdCAweCVseCwgc2tpcHBpbmcuLi5cbiIsIGZtX3BvcnRbZGV2XSk7CisJCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkJICJjYW5ub3QgaW5pdGlhbGl6ZSBGTSBPUEwzIGF0IDB4JWx4LCBza2lwcGluZy4uLlxuIiwKKwkJCQkgZm1fcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX0ZNRU47CiAJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCBQQ0lSX0RTWEdfTEVHQUNZLCBsZWdhY3lfY3RybCk7CiAJCX0gZWxzZSBpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7CiAJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBvcGwzIGh3ZGVwXG4iKTsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBvcGwzIGh3ZGVwXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggZDU5MWMxNS4uODFjOTE2YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtODYsNyArODYsOSBAQAogCQkJcmV0dXJuIDA7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY29kZWNfcmVhZHk6IGNvZGVjICVpIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsIHNlY29uZGFyeSwgc25kX3ltZnBjaV9yZWFkdyhjaGlwLCByZWcpKTsKKwlkZXZfZXJyKGNoaXAtPmNhcmQtPmRldiwKKwkJImNvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAorCQlzZWNvbmRhcnksIHNuZF95bWZwY2lfcmVhZHcoY2hpcCwgcmVnKSk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtMzE5LDcgKzMyMSw3IEBACiAJCXlwY20tPmxhc3RfcG9zID0gcG9zOwogCQlpZiAoeXBjbS0+cGVyaW9kX3BvcyA+PSB5cGNtLT5wZXJpb2Rfc2l6ZSkgewogCQkJLyoKLQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKIAkJCSAgICAgICAiZG9uZSAtIGFjdGl2ZV9iYW5rID0gMHgleCwgc3RhcnQgPSAweCV4XG4iLAogCQkJICAgICAgIGNoaXAtPmFjdGl2ZV9iYW5rLAogCQkJICAgICAgIHZvaWNlLT5iYW5rW2NoaXAtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CkBAIC0zNzIsNyArMzc0LDcgQEAKIAkJaWYgKHlwY20tPnBlcmlvZF9wb3MgPj0geXBjbS0+cGVyaW9kX3NpemUpIHsKIAkJCXlwY20tPnBlcmlvZF9wb3MgJT0geXBjbS0+cGVyaW9kX3NpemU7CiAJCQkvKgotCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LAogCQkJICAgICAgICJkb25lIC0gYWN0aXZlX2JhbmsgPSAweCV4LCBzdGFydCA9IDB4JXhcbiIsCiAJCQkgICAgICAgY2hpcC0+YWN0aXZlX2JhbmssCiAJCQkgICAgICAgdm9pY2UtPmJhbmtbY2hpcC0+YWN0aXZlX2JhbmtdLnN0YXJ0KTsKQEAgLTIwNjcsNyArMjA2OSw4IEBACiAJCQkgICAgICAgJmNoaXAtPnBjaS0+ZGV2KTsKIAlpZiAoZXJyID49IDApIHsKIAkJaWYgKGNoaXAtPmRzcF9taWNyb2NvZGUtPnNpemUgIT0gWURTWEdfRFNQTEVOR1RIKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJEU1AgbWljcm9jb2RlIGhhcyB3cm9uZyBzaXplXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJEU1AgbWljcm9jb2RlIGhhcyB3cm9uZyBzaXplXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMDgyLDggKzIwODUsOCBAQAogCQkJICAgICAgICZjaGlwLT5wY2ktPmRldik7CiAJaWYgKGVyciA+PSAwKSB7CiAJCWlmIChjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZS0+c2l6ZSAhPSBZRFNYR19DVFJMTEVOR1RIKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjb250cm9sbGVyIG1pY3JvY29kZSIKLQkJCQkgICAiIGhhcyB3cm9uZyBzaXplXG4iKTsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJCSJjb250cm9sbGVyIG1pY3JvY29kZSBoYXMgd3Jvbmcgc2l6ZVxuIik7CiAJCQllcnIgPSAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjM2MCw4ICsyMzYzLDcgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCWRldl9lcnIoZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCBkaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjQzMywxMyArMjQzNSwxNSBAQAogCWNoaXAtPnNyYzQ0MV91c2VkID0gLTE7CiAKIAlpZiAoKGNoaXAtPnJlc19yZWdfYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihjaGlwLT5yZWdfYXJlYV9waHlzLCAweDgwMDAsICJZTUZQQ0kiKSkgPT0gTlVMTCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBjaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJInVuYWJsZSB0byBncmFiIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCisJCQljaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfeW1mcGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CisJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yNDUzLDcgKzI0NTcsNyBAQAogCiAJZXJyID0gc25kX3ltZnBjaV9yZXF1ZXN0X2Zpcm13YXJlKGNoaXApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJmaXJtd2FyZSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsIGVycik7CiAJCXNuZF95bWZwY2lfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yNDg3LDggKzI0OTEsNiBAQAogCiAJc25kX3ltZnBjaV9wcm9jX2luaXQoY2FyZCwgY2hpcCk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7Ci0KIAkqcmNoaXAgPSBjaGlwOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggOGY0ODlkZS4uNTZiZGExMiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0xMTIsNyArMTEyLDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7IC8qIGRpc2FibGVkIGV4cGxpY2l0bHkgKi8KIAogCS8qIG9rLCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmxpbmstPmRldiwgaW5kZXhbaV0sIGlkW2ldLCBUSElTX01PRFVMRSwKKwkJCSAgIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwZGFjZjogY2Fubm90IGNyZWF0ZSBhIGNhcmQgaW5zdGFuY2VcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTMxLDggKzEzMiw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmbGluay0+ZGV2KTsKLQogCXBkYWNmLT5pbmRleCA9IGk7CiAJY2FyZF9saXN0W2ldID0gY2FyZDsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCBkNGRiN2VjLi43ODZlN2UxIDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtMjM4LDcgKzIzOCw2IEBACiAJCWdvdG8gZmFpbGVkOwogCiAJY2hpcC0+ZGV2ID0gJmxpbmstPmRldjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsIGNoaXAtPmRldik7CiAKIAlpZiAoc25kX3Z4cG9ja2V0X2Fzc2lnbl9yZXNvdXJjZXMoY2hpcCwgbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0LAogCQkJCQkJbGluay0+aXJxKSA8IDApCkBAIC0zMDcsNyArMzA2LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7IC8qIGRpc2FibGVkIGV4cGxpY2l0bHkgKi8KIAogCS8qIG9rLCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlICovCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJnBfZGV2LT5kZXYsIGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsCisJCQkgICAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidnhwb2NrZXQ6IGNhbm5vdCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlXG4iKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKaW5kZXggOGFiYjUyMS4uMzUwYTdjOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jCisrKyBiL3NvdW5kL3BwYy9wb3dlcm1hYy5jCkBAIC01OCw3ICs1OCw3IEBACiAJY2hhciAqbmFtZV9leHQ7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMjIsOCArMTIyLDYgQEAKIAlpZiAoZW5hYmxlX2JlZXApCiAJCXNuZF9wbWFjX2F0dGFjaF9iZWVwKGNoaXApOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOwotCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKQogCQlnb3RvIF9fZXJyb3I7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9zbmRfcHMzLmMgYi9zb3VuZC9wcGMvc25kX3BzMy5jCmluZGV4IGViYjc2ZjIuLjU4ZjI5MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9zbmRfcHMzLmMKKysrIGIvc291bmQvcHBjL3NuZF9wczMuYwpAQCAtOTg0LDcgKzk4NCw4IEBACiAJfQogCiAJLyogY3JlYXRlIGNhcmQgaW5zdGFuY2UgKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIGlkLCBUSElTX01PRFVMRSwgMCwgJnRoZV9jYXJkLmNhcmQpOworCXJldCA9IHNuZF9jYXJkX25ldygmZGV2LT5jb3JlLCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJnRoZV9jYXJkLmNhcmQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGNsZWFuX2lycTsKIApAQCAtMTA1Miw3ICsxMDUzLDYgQEAKIAlzbmRfcHMzX2luaXRfYXZzZXR0aW5nKCZ0aGVfY2FyZCk7CiAKIAkvKiByZWdpc3RlciB0aGUgY2FyZCAqLwotCXNuZF9jYXJkX3NldF9kZXYodGhlX2NhcmQuY2FyZCwgJmRldi0+Y29yZSk7CiAJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIodGhlX2NhcmQuY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gY2xlYW5fZG1hX21hcDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NoL2FpY2EuYyBiL3NvdW5kL3NoL2FpY2EuYwppbmRleCA3OGEzNjk3Li40Nzg0OWVhIDEwMDY0NAotLS0gYS9zb3VuZC9zaC9haWNhLmMKKysrIGIvc291bmQvc2gvYWljYS5jCkBAIC02MDgsOCArNjA4LDggQEAKIAlkcmVhbWNhc3RjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9jYXJkX2FpY2EpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWRyZWFtY2FzdGNhcmQpKQogCQlyZXR1cm4gLUVOT01FTTsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXgsIFNORF9BSUNBX0RSSVZFUiwgVEhJU19NT0RVTEUsIDAsCi0JCQkgICAgICAmZHJlYW1jYXN0Y2FyZC0+Y2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaW5kZXgsIFNORF9BSUNBX0RSSVZFUiwKKwkJCSAgIFRISVNfTU9EVUxFLCAwLCAmZHJlYW1jYXN0Y2FyZC0+Y2FyZCk7CiAJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CiAJCWtmcmVlKGRyZWFtY2FzdGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjI0LDcgKzYyNCw2IEBACiAJZXJyID0gc25kX2FpY2FwY21jaGlwKGRyZWFtY2FzdGNhcmQsIDApOwogCWlmICh1bmxpa2VseShlcnIgPCAwKSkKIAkJZ290byBmcmVlZHJlYW1jYXN0OwotCXNuZF9jYXJkX3NldF9kZXYoZHJlYW1jYXN0Y2FyZC0+Y2FyZCwgJmRldnB0ci0+ZGV2KTsKIAlkcmVhbWNhc3RjYXJkLT50aW1lci5kYXRhID0gMDsKIAlkcmVhbWNhc3RjYXJkLT5jaGFubmVsID0gTlVMTDsKIAkvKiBBZGQgYmFzaWMgY29udHJvbHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKaW5kZXggN2M5NDIyYy4uZDFmYjc0ZCAxMDA2NDQKLS0tIGEvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKKysrIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKQEAgLTM5Niw3ICszOTYsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmRldnB0ci0+ZGV2LCBpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSB0aGUgY2FyZFxuIik7CiAJCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL0tjb25maWcgYi9zb3VuZC9zb2MvS2NvbmZpZwppbmRleCBkNjJjZTQ4Li4wMDYwYjMxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvS2NvbmZpZwpAQCAtNTAsNiArNTAsNyBAQAogc291cmNlICJzb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvczYwMDAvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3NoL0tjb25maWciCitzb3VyY2UgInNvdW5kL3NvYy9zaXJmL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zcGVhci9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvdGVncmEvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3R4eDkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9NYWtlZmlsZQppbmRleCA2MmExODIyZTcuLjVmMWRmMDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBzYW1zdW5nLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHM2MDAwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNoLworb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNpcmYvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gc3BlYXIvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gdGVncmEvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gdHh4OS8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9LY29uZmlnIGIvc291bmQvc29jL2F0bWVsL0tjb25maWcKaW5kZXggZTYzNGViNy4uNDc4OTYxOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL0tjb25maWcKKysrIGIvc291bmQvc29jL2F0bWVsL0tjb25maWcKQEAgLTU4LDYgKzU4LDYgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBBVE1FTF9TU0MgJiYgQVJDSF9BVDkxICYmIE1BQ0hfQUZFQjkyNjAgJiYgU05EX0FUTUVMX1NPQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX1BEQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX1NTQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHNvdW5kIG9uIEFGRUI5MjYwIGJvYXJkLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKaW5kZXggMWVhZDNjOS4uZGU0MzNjZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwpAQCAtMzQxLDYgKzM0MSw3IEBACiB7CiAJaW50IGlkID0gZGFpLT5pZDsKIAlzdHJ1Y3QgYXRtZWxfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW2lkXTsKKwlzdHJ1Y3Qgc3NjX2RldmljZSAqc3NjID0gc3NjX3AtPnNzYzsKIAlzdHJ1Y3QgYXRtZWxfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CiAJaW50IGRpciwgY2hhbm5lbHMsIGJpdHM7CiAJdTMyIHRmbXIsIHJmbXIsIHRjbXIsIHJjbXI7CkBAIC00NjYsNyArNDY3LDggQEAKIAkJCXwgU1NDX0JGKFJDTVJfU1RBUlQsIHN0YXJ0X2V2ZW50KQogCQkJfCBTU0NfQkYoUkNNUl9DS0ksIFNTQ19DS0lfUklTSU5HKQogCQkJfCBTU0NfQkYoUkNNUl9DS08sIFNTQ19DS09fTk9ORSkKLQkJCXwgU1NDX0JGKFJDTVJfQ0tTLCBTU0NfQ0tTX0NMT0NLKTsKKwkJCXwgU1NDX0JGKFJDTVJfQ0tTLCBzc2MtPmNsa19mcm9tX3JrX3BpbiA/CisJCQkJCSAgIFNTQ19DS1NfUElOIDogU1NDX0NLU19DTE9DSyk7CiAKIAkJcmZtciA9CSAgU1NDX0JGKFJGTVJfRlNFREdFLCBTU0NfRlNFREdFX1BPU0lUSVZFKQogCQkJfCBTU0NfQkYoUkZNUl9GU09TLCBTU0NfRlNPU19OT05FKQpAQCAtNDgxLDcgKzQ4Myw4IEBACiAJCQl8IFNTQ19CRihUQ01SX1NUQVJULCBzdGFydF9ldmVudCkKIAkJCXwgU1NDX0JGKFRDTVJfQ0tJLCBTU0NfQ0tJX0ZBTExJTkcpCiAJCQl8IFNTQ19CRihUQ01SX0NLTywgU1NDX0NLT19OT05FKQotCQkJfCBTU0NfQkYoVENNUl9DS1MsIFNTQ19DS1NfUElOKTsKKwkJCXwgU1NDX0JGKFRDTVJfQ0tTLCBzc2MtPmNsa19mcm9tX3JrX3BpbiA/CisJCQkJCSAgIFNTQ19DS1NfQ0xPQ0sgOiBTU0NfQ0tTX1BJTik7CiAKIAkJdGZtciA9CSAgU1NDX0JGKFRGTVJfRlNFREdFLCBTU0NfRlNFREdFX1BPU0lUSVZFKQogCQkJfCBTU0NfQkYoVEZNUl9GU0RFTiwgMCkKQEAgLTU1MCw3ICs1NTMsOCBAQAogCQkJfCBTU0NfQkYoUkNNUl9TVEFSVCwgU1NDX1NUQVJUX1JJU0lOR19SRikKIAkJCXwgU1NDX0JGKFJDTVJfQ0tJLCBTU0NfQ0tJX1JJU0lORykKIAkJCXwgU1NDX0JGKFJDTVJfQ0tPLCBTU0NfQ0tPX05PTkUpCi0JCQl8IFNTQ19CRihSQ01SX0NLUywgU1NDX0NLU19QSU4pOworCQkJfCBTU0NfQkYoUkNNUl9DS1MsIHNzYy0+Y2xrX2Zyb21fcmtfcGluID8KKwkJCQkJICAgU1NDX0NLU19QSU4gOiBTU0NfQ0tTX0NMT0NLKTsKIAogCQlyZm1yID0JICBTU0NfQkYoUkZNUl9GU0VER0UsIFNTQ19GU0VER0VfUE9TSVRJVkUpCiAJCQl8IFNTQ19CRihSRk1SX0ZTT1MsIFNTQ19GU09TX05PTkUpCkBAIC01NjUsNyArNTY5LDggQEAKIAkJCXwgU1NDX0JGKFRDTVJfU1RBUlQsIFNTQ19TVEFSVF9SSVNJTkdfUkYpCiAJCQl8IFNTQ19CRihUQ01SX0NLSSwgU1NDX0NLSV9GQUxMSU5HKQogCQkJfCBTU0NfQkYoVENNUl9DS08sIFNTQ19DS09fTk9ORSkKLQkJCXwgU1NDX0JGKFRDTVJfQ0tTLCBTU0NfQ0tTX1BJTik7CisJCQl8IFNTQ19CRihSQ01SX0NLUywgc3NjLT5jbGtfZnJvbV9ya19waW4gPworCQkJCQkgICBTU0NfQ0tTX0NMT0NLIDogU1NDX0NLU19QSU4pOwogCiAJCXRmbXIgPQkgIFNTQ19CRihURk1SX0ZTRURHRSwgU1NDX0ZTRURHRV9QT1NJVElWRSkKIAkJCXwgU1NDX0JGKFRGTVJfRlNERU4sIDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCmluZGV4IGYxNWJmZjEuLjE3NGJkNTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCkBAIC0xNTUsMjUgKzE1NSwxNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIEFkZCBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhdDkxc2FtOWcyMGVrX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoYXQ5MXNhbTlnMjBla19kYXBtX3dpZGdldHMpKTsKLQkvKiBTZXQgdXAgc3BlY2lmaWMgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKLQogCS8qIG5vdCBjb25uZWN0ZWQgKi8KIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSTElORUlOIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTExJTkVJTiIpOwogCi0jaWZkZWYgRU5BQkxFX01JQ19JTlBVVAotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJJbnQgTWljIik7Ci0jZWxzZQotCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkludCBNaWMiKTsKKyNpZm5kZWYgRU5BQkxFX01JQ19JTlBVVAorCXNuZF9zb2NfZGFwbV9uY19waW4oJnJ0ZC0+Y2FyZC0+ZGFwbSwgIkludCBNaWMiKTsKICNlbmRpZgogCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk0LDYgKzE4MywxMSBAQAogCS5kYWlfbGluayA9ICZhdDkxc2FtOWcyMGVrX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhdDkxc2FtOWcyMGVrX3NldF9iaWFzX2xldmVsLAorCisJLmRhcG1fd2lkZ2V0cyA9IGF0OTFzYW05ZzIwZWtfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhdDkxc2FtOWcyMGVrX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAogfTsKIAogc3RhdGljIGludCBhdDkxc2FtOWcyMGVrX2F1ZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCmluZGV4IDQ1NDRkOGUuLjYzNDdkNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCkBAIC0xNCw3ICsxNCw4IEBACiAJZGVwZW5kcyBvbiBTTkRfQkY1WFhfSTJTICYmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX0JGNVhYX1NPQ19JMlMgaWYgIUJGNjB4CiAJc2VsZWN0IFNORF9CRjZYWF9TT0NfSTJTIGlmIEJGNjB4Ci0Jc2VsZWN0IFNORF9TT0NfU1NNMjYwMgorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDJfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyX0kyQyBpZiBJMkMKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCiAJICBTU00yNjAyIEF1ZGlvIENvZGVjIEFkZC1PbiBDYXJkLgpAQCAtNDYsNyArNDcsOCBAQAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgRVZBTC1BREFWODBYIGJvYXJkcyBvbiBCbGFja2ZpbiBldmFsIGJvYXJkcyIKIAlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfQkY1WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX0FEQVY4MFgKKwlzZWxlY3QgU05EX1NPQ19BREFWODAxIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BREFWODAzIGlmIEkyQwogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQW5hbG9nIERldmljZXMgRVZBTC1BREFWODAxIG9yCiAJICBFVkFMLUFEQVY4MDMgYm9hcmQgY29ubmVjdGVkIHRvIG9uZSBvZiB0aGUgQmxhY2tmaW4gZXZhbHVhdGlvbiBib2FyZHMKQEAgLTY3LDcgKzY5LDggQEAKIAl0cmlzdGF0ZSAiU29DIEFEMTkzWCBBdWRpbyBzdXBwb3J0IGZvciBCbGFja2ZpbiIKIAlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfQkY1WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX0FEMTkzWAorCXNlbGVjdCBTTkRfU09DX0FEMTkzWF9JMkMgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfQUQxOTNYX1NQSSBpZiBTUElfTUFTVEVSCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEFEMTkzWCBjb2RlYyBvbiBCbGFja2Zpbi4KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEFEMTkzNiwgQUQxOTM3LCBBRDE5MzggYW5kIEFEMTkzOS4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jaXJydXMvS2NvbmZpZyBiL3NvdW5kL3NvYy9jaXJydXMvS2NvbmZpZwppbmRleCAwNmY5MzhkLi41NDc3YzU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY2lycnVzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NpcnJ1cy9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFNORF9FUDkzWFhfU09DCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciB0aGUgQ2lycnVzIExvZ2ljIEVQOTN4eCBzZXJpZXMiCi0JZGVwZW5kcyBvbiAoQVJDSF9FUDkzWFggfHwgQ09NUElMRV9URVNUKSAmJiBTTkRfU09DCisJZGVwZW5kcyBvbiBBUkNIX0VQOTNYWCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU05EX1NPQ19HRU5FUklDX0RNQUVOR0lORV9QQ00KIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KQEAgLTE4LDcgKzE4LDcgQEAKICAgICAgICAgdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUgbW9kdWxlIgogICAgICAgICBkZXBlbmRzIG9uIFNORF9FUDkzWFhfU09DICYmIE1BQ0hfU05BUFBFUl9DTDE1CiAgICAgICAgIHNlbGVjdCBTTkRfRVA5M1hYX1NPQ19JMlMKLSAgICAgICAgc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKyAgICAgICAgc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAgICAgICAgIGhlbHAKICAgICAgICAgICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEkyUyBhdWRpbyBvbiB0aGUKICAgICAgICAgICBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NpcnJ1cy9zbmFwcGVyY2wxNS5jIGIvc291bmQvc29jL2NpcnJ1cy9zbmFwcGVyY2wxNS5jCmluZGV4IDI5MjM4YTcuLjViNjhiMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jaXJydXMvc25hcHBlcmNsMTUuYworKysgYi9zb3VuZC9zb2MvY2lycnVzL3NuYXBwZXJjbDE1LmMKQEAgLTY1LDE4ICs2NSw2IEBACiAJeyJNSUNJTiIsIE5VTEwsICJNaWMgSmFjayJ9LAogfTsKIAotc3RhdGljIGludCBzbmFwcGVyY2wxNV90bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbmFwcGVyY2wxNV9kYWkgPSB7CiAJLm5hbWUJCT0gInRsdjMyMGFpYzIzIiwKIAkuc3RyZWFtX25hbWUJPSAiQUlDMjMiLApAQCAtODQsNyArNzIsNiBAQAogCS5jb2RlY19kYWlfbmFtZQk9ICJ0bHYzMjBhaWMyMy1oaWZpIiwKIAkuY29kZWNfbmFtZQk9ICJ0bHYzMjBhaWMyMy1jb2RlYy4wLTAwMWEiLAogCS5wbGF0Zm9ybV9uYW1lCT0gImVwOTN4eC1pMnMiLAotCS5pbml0CQk9IHNuYXBwZXJjbDE1X3RsdjMyMGFpYzIzX2luaXQsCiAJLmRhaV9mbXQJPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9JRiB8CiAJCQkgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJLm9wcwkJPSAmc25hcHBlcmNsMTVfb3BzLApAQCAtOTUsNiArODIsMTEgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rCT0gJnNuYXBwZXJjbDE1X2RhaSwKIAkubnVtX2xpbmtzCT0gMSwKKworCS5kYXBtX3dpZGdldHMJCT0gdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcwkJPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgc25hcHBlcmNsMTVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwppbmRleCA2NDdhNzJjLi5iMDdlMTcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCkBAIC00NDgsMzggKzQ0OCwzOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqcG04NjB4X3BhX3RleHRzW10gPSB7Ii0zMyUiLCAiMCUiLCAiMzMlIiwgIjY2JSJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczFfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzFfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMxX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0hTMV9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzJfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMyX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0hTMl9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczFfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzFfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMxX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0hTMV9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9oczJfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9IUzJfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfaHMyX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0hTMl9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzFfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzFfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8xX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0xPMV9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzJfQ1RSTCwgNSwgNCwgcG04NjB4X29wYW1wX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8yX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0xPMl9DVFJMLCA1LCBwbTg2MHhfb3BhbXBfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzFfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzFfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8xX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0xPMV9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9sbzJfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9MTzJfQ1RSTCwgMywgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfbG8yX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0xPMl9DVFJMLCAzLCBwbTg2MHhfcGFfdGV4dHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBtODYweF9zcGtfcGFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9FQVJfQ1RSTF8xLCA1LCA0LCBwbTg2MHhfcGFfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHBtODYweF9zcGtfcGFfZW51bSwKKwkJCSAgICBQTTg2MFhfRUFSX0NUUkxfMSwgNSwgcG04NjB4X3BhX3RleHRzKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwbTg2MHhfZWFyX3BhX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfRUFSX0NUUkxfMiwgMCwgNCwgcG04NjB4X3BhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwbTg2MHhfZWFyX3BhX2VudW0sCisJCQkgICAgUE04NjBYX0VBUl9DVFJMXzIsIDAsIHBtODYweF9wYV90ZXh0cyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcG04NjB4X3Nwa19lYXJfb3BhbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9FQVJfQ1RSTF8xLCAzLCA0LCBwbTg2MHhfb3BhbXBfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHBtODYweF9zcGtfZWFyX29wYW1wX2VudW0sCisJCQkgICAgUE04NjBYX0VBUl9DVFJMXzEsIDMsIHBtODYweF9vcGFtcF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwbTg2MHhfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiQURDIENhcHR1cmUgVm9sdW1lIiwgUE04NjBYX0FEQ19BTkFfMiwKQEAgLTU2MSw4ICs1NjEsOCBAQAogCSJQQ00gTCIsICJQQ00gUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZjFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9QQ01fSUZBQ0VfMywgNiwgMiwgYWlmMV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWYxX2VudW0sCisJCQkgICAgUE04NjBYX1BDTV9JRkFDRV8zLCA2LCBhaWYxX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlBDTSBNdXgiLCBhaWYxX2VudW0pOwpAQCAtNTcyLDggKzU3Miw4IEBACiAJIkRJTiIsICJESU4xIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaTJzX2Rpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0kyU19JRkFDRV8zLCAxLCAyLCBpMnNfZGluX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGkyc19kaW5fZW51bSwKKwkJCSAgICBQTTg2MFhfSTJTX0lGQUNFXzMsIDEsIGkyc19kaW5fdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpMnNfZGluX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSTJTIERJTiBNdXgiLCBpMnNfZGluX2VudW0pOwpAQCAtNTgzLDggKzU4Myw4IEBACiAJIkV4IFBBIiwgIkFEQyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGkyc19taWNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9JMlNfSUZBQ0VfMywgNCwgMiwgaTJzX21pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChpMnNfbWljX2VudW0sCisJCQkgICAgUE04NjBYX0kyU19JRkFDRV8zLCA0LCBpMnNfbWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaTJzX21pY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkkyUyBNaWMgTXV4IiwgaTJzX21pY19lbnVtKTsKQEAgLTU5NCw4ICs1OTQsOCBAQAogCSJBRENSIiwgIkFEQ0wiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfUENNX0lGQUNFXzMsIDQsIDIsIGFkY2xfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjbF9lbnVtLAorCQkJICAgIFBNODYwWF9QQ01fSUZBQ0VfMywgNCwgYWRjbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBREMgTGVmdCBNdXgiLCBhZGNsX2VudW0pOwpAQCAtNjA1LDggKzYwNSw4IEBACiAJIkFEQ0wiLCAiQURDUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY3JfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9QQ01fSUZBQ0VfMywgMiwgMiwgYWRjcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNyX2VudW0sCisJCQkgICAgUE04NjBYX1BDTV9JRkFDRV8zLCAyLCBhZGNyX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBSaWdodCBNdXgiLCBhZGNyX2VudW0pOwpAQCAtNjE2LDggKzYxNiw4IEBACiAJIkFEQ1IiLCAiRUMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNyX2VjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQURDX0VOXzIsIDMsIDIsIGFkY3JfZWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjcl9lY19lbnVtLAorCQkJICAgIFBNODYwWF9BRENfRU5fMiwgMywgYWRjcl9lY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY3JfZWNfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBRENSIEVDIE11eCIsIGFkY3JfZWNfZW51bSk7CkBAIC02MjcsOCArNjI3LDggQEAKIAkiTGVmdCIsICJSaWdodCIsICJMZWZ0ICsgUmlnaHQiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBlY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0VDX1BBVEgsIDEsIDMsIGVjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVjX2VudW0sCisJCQkgICAgUE04NjBYX0VDX1BBVEgsIDEsIGVjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZWNfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJFQyBNdXgiLCBlY19lbnVtKTsKQEAgLTYzOCwzNiArNjM4LDM2IEBACiB9OwogCiAvKiBEQUMgSGVhZHNldCAxIE11eCAvIE11eDEwICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19oczFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDAsIDQsIGRhY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfaHMxX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgMCwgZGFjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjX2hzMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBIUzEgTXV4IiwgZGFjX2hzMV9lbnVtKTsKIAogLyogREFDIEhlYWRzZXQgMiBNdXggLyBNdXgxMSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfaHMyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX0lOUFVUX1NFTF8xLCAyLCA0LCBkYWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2hzMl9lbnVtLAorCQkJICAgIFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDIsIGRhY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY19oczJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEQUMgSFMyIE11eCIsIGRhY19oczJfZW51bSk7CiAKIC8qIERBQyBMaW5lb3V0IDEgTXV4IC8gTXV4MTIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2xvMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgNCwgNCwgZGFjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19sbzFfZW51bSwKKwkJCSAgICBQTTg2MFhfQU5BX0lOUFVUX1NFTF8xLCA0LCBkYWNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNfbG8xX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDIExPMSBNdXgiLCBkYWNfbG8xX2VudW0pOwogCiAvKiBEQUMgTGluZW91dCAyIE11eCAvIE11eDEzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19sbzJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfSU5QVVRfU0VMXzEsIDYsIDQsIGRhY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfbG8yX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9JTlBVVF9TRUxfMSwgNiwgZGFjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjX2xvMl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBMTzIgTXV4IiwgZGFjX2xvMl9lbnVtKTsKIAogLyogREFDIFNwZWFya2VyIEVhcnBob25lIE11eCAvIE11eDE0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19zcGtfZWFyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX0lOUFVUX1NFTF8yLCAwLCA0LCBkYWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX3Nwa19lYXJfZW51bSwKKwkJCSAgICBQTTg2MFhfQU5BX0lOUFVUX1NFTF8yLCAwLCBkYWNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNfc3BrX2Vhcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBTUCBNdXgiLCBkYWNfc3BrX2Vhcl9lbnVtKTsKQEAgLTY3NywyOSArNjc3LDI5IEBACiAJIkRpZ2l0YWwiLCAiQW5hbG9nIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHMxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMCwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHMxX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDAsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHMxX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSGVhZHNldDEgTXV4IiwgaHMxX2VudW0pOwogCiAvKiBIZWFkc2V0IDIgTXV4IC8gTXV4MTYgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHMyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMSwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHMyX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDEsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHMyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiSGVhZHNldDIgTXV4IiwgaHMyX2VudW0pOwogCiAvKiBMaW5lb3V0IDEgTXV4IC8gTXV4MTcgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG8xX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMiwgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG8xX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDIsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG8xX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGluZW91dDEgTXV4IiwgbG8xX2VudW0pOwogCiAvKiBMaW5lb3V0IDIgTXV4IC8gTXV4MTggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG8yX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShQTTg2MFhfQU5BX1RPX0FOQSwgMywgMiwgaW5fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG8yX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDMsIGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG8yX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGluZW91dDIgTXV4IiwgbG8yX2VudW0pOwpAQCAtNzA5LDggKzcwOSw4IEBACiAJIkVhcnBpZWNlIiwgIlNwZWFrZXIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFBNODYwWF9BTkFfVE9fQU5BLCA2LCAyLCBzcGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrX2VudW0sCisJCQkgICAgUE04NjBYX0FOQV9UT19BTkEsIDYsIHNwa190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa19kZW11eCA9CiAJU09DX0RBUE1fRU5VTSgiU3BlYWtlciBFYXJwaWVjZSBEZW11eCIsIHNwa19lbnVtKTsKQEAgLTcyMCw4ICs3MjAsOCBAQAogCSJNaWMgMSIsICJNaWMgMiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoUE04NjBYX0FEQ19BTkFfNCwgNCwgMiwgbWljX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY19lbnVtLAorCQkJICAgIFBNODYwWF9BRENfQU5BXzQsIDQsIG1pY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1pY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIk1JQyBNdXgiLCBtaWNfZW51bSk7CkBAIC0xMzI3LDggKzEzMjcsNyBAQAogCiAJcG04NjB4LT5jb2RlYyA9IGNvZGVjOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHBtODYweC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIHBtODYweC0+cmVnbWFwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKaW5kZXggOTgzZDA4N2EuLmYwZTg0MDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTgsNiArOCw4IEBACiAJZGVmYXVsdCB5IGlmIEkyQz15CiAJZGVmYXVsdCB5IGlmIFNQSV9NQVNURVI9eQogCittZW51ICJDT0RFQyBkcml2ZXJzIgorCiBjb25maWcgU05EX1NPQ19BTExfQ09ERUNTCiAJdHJpc3RhdGUgIkJ1aWxkIGFsbCBBU29DIENPREVDIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBDT01QSUxFX1RFU1QKQEAgLTE2LDE1ICsxOCwyMCBAQAogCXNlbGVjdCBTTkRfU09DX0FCODUwMF9DT0RFQyBpZiBBQlg1MDBfQ09SRQogCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMgaWYgU05EX1NPQ19BQzk3X0JVUwogCXNlbGVjdCBTTkRfU09DX0FEMTgzNiBpZiBTUElfTUFTVEVSCi0Jc2VsZWN0IFNORF9TT0NfQUQxOTNYIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKKwlzZWxlY3QgU05EX1NPQ19BRDE5M1hfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BRDE5M1hfSTJDIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0FEMTk4MCBpZiBTTkRfU09DX0FDOTdfQlVTCiAJc2VsZWN0IFNORF9TT0NfQUQ3MzMxMQogCXNlbGVjdCBTTkRfU09DX0FEQVUxMzczIGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX0FEQVY4MFggaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX0FEQVY4MDEgaWYgU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX0FEQVY4MDMgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfQURBVTE5NzdfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19BREFVMTk3N19JMkMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQURBVTE3MDEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQURTMTE3WAogCXNlbGVjdCBTTkRfU09DX0FLNDEwNCBpZiBTUElfTUFTVEVSCiAJc2VsZWN0IFNORF9TT0NfQUs0NTM1IGlmIEkyQworCXNlbGVjdCBTTkRfU09DX0FLNDU1NAogCXNlbGVjdCBTTkRfU09DX0FLNDY0MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19BSzQ2NDIgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQUs0NjcxIGlmIEkyQwpAQCAtMzcsNiArNDQsNyBAQAogCXNlbGVjdCBTTkRfU09DX0NTNDJMNzMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQ1M0MjcwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0NTNDI3MSBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfQ1M0MlhYOF9JMkMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQ1gyMDQ0MiBpZiBUVFkKIAlzZWxlY3QgU05EX1NPQ19EQTcyMTAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfREE3MjEzIGlmIEkyQwpAQCAtNTksMjAgKzY3LDI2IEBACiAJc2VsZWN0IFNORF9TT0NfUENNMTY4MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19QQ00xNzkyQSBpZiBTUElfTUFTVEVSCiAJc2VsZWN0IFNORF9TT0NfUENNMzAwOAorCXNlbGVjdCBTTkRfU09DX1BDTTUxMnhfSTJDIGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1BDTTUxMnhfU1BJIGlmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19SVDU2MzEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUlQ1NjQwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NHVEw1MDAwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NJNDc2WCBpZiBNRkRfU0k0NzZYX0NPUkUKKwlzZWxlY3QgU05EX1NPQ19TSVJGX0FVRElPX0NPREVDCiAJc2VsZWN0IFNORF9TT0NfU045NTAzMSBpZiBJTlRFTF9TQ1VfSVBDCiAJc2VsZWN0IFNORF9TT0NfU1BESUYKIAlzZWxlY3QgU05EX1NPQ19TU00yNTE4IGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDJfU1BJIGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyX0kyQyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TVEEzMlggaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfU1RBNTI5IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1NUQUM5NzY2IGlmIFNORF9TT0NfQUM5N19CVVMKIAlzZWxlY3QgU05EX1NPQ19UQVM1MDg2IGlmIEkyQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzIGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzX0kyQyBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19TUEkgaWYgU1BJX01BU1RFUgogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzI2IGlmIFNQSV9NQVNURVIKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzMVhYIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzMyWDQgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDM1ggaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVFBBNjEzMEEyIGlmIEkyQwpAQCAtMTgyLDYgKzE5NiwxNCBAQAogY29uZmlnIFNORF9TT0NfQUQxOTNYCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQUQxOTNYX1NQSQorCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQUQxOTNYCisKK2NvbmZpZyBTTkRfU09DX0FEMTkzWF9JMkMKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX0FEMTkzWAorCiBjb25maWcgU05EX1NPQ19BRDE5ODAKIAl0cmlzdGF0ZQogCkBAIC0xODksNDEgKzIxMSw2NiBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX0FEQVUxNzAxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEQVUxNzAxIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfU0lHTUFEU1AKLQl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BREFVMTM3MwogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0FEQVUxOTc3CisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfQURBVTE5NzdfU1BJCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19BREFVMTk3NworCXNlbGVjdCBSRUdNQVBfU1BJCisKK2NvbmZpZyBTTkRfU09DX0FEQVUxOTc3X0kyQworCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQURBVTE5NzcKKwlzZWxlY3QgUkVHTUFQX0kyQworCiBjb25maWcgU05EX1NPQ19BREFWODBYCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQURBVjgwMQorCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfQURBVjgwWAorCitjb25maWcgU05EX1NPQ19BREFWODAzCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19BREFWODBYCisKIGNvbmZpZyBTTkRfU09DX0FEUzExN1gKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQxMDQKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0MTA0IENPREVDIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgogCiBjb25maWcgU05EX1NPQ19BSzQ1MzUKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQ1NTQKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0NTU0IENPREVDIgogCiBjb25maWcgU05EX1NPQ19BSzQ2NDEKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19BSzQ2NDIKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJBS00gQUs0NjQyIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX0FLNDY3MQogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX0FLNTM4NgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIkFLTSBBSzU2MzggQ09ERUMiCiAKIGNvbmZpZyBTTkRfU09DX0FMQzU2MjMKICAgICAgICB0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19BTEM1NjMyCiAJdHJpc3RhdGUKIApAQCAtMjM0LDE0ICsyODEsMTcgQEAKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19DUzQyTDUyCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDJMNTIgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfQ1M0Mkw3MwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBDUzQyTDczIENPREVDIgorCWRlcGVuZHMgb24gSTJDCiAKICMgQ2lycnVzIExvZ2ljIENTNDI3MCBDb2RlYwogY29uZmlnIFNORF9TT0NfQ1M0MjcwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDI3MCBDT0RFQyIKKwlkZXBlbmRzIG9uIEkyQwogCiAjIENpcnJ1cyBMb2dpYyBDUzQyNzAgQ29kZWMgVkQgPSAzLjNWIEVycmF0YQogIyBTZWxlY3QgaWYgeW91IGFyZSBhZmZlY3RlZCBieSB0aGUgZXJyYXRhIHdoZXJlIHRoZSBwYXJ0IHdpbGwgbm90IGZ1bmN0aW9uCkBAIC0yNTIsOCArMzAyLDE4IEBACiAJZGVwZW5kcyBvbiBTTkRfU09DX0NTNDI3MAogCiBjb25maWcgU05EX1NPQ19DUzQyNzEKKwl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIENTNDI3MSBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKKworY29uZmlnIFNORF9TT0NfQ1M0MlhYOAogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0NTNDJYWDhfSTJDCisJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBDUzQyNDQ4L0NTNDI4ODggQ09ERUMgKEkyQykiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgU05EX1NPQ19DUzQyWFg4CisJc2VsZWN0IFJFR01BUF9JMkMKKwogY29uZmlnIFNORF9TT0NfQ1gyMDQ0MgogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBUVFkKQEAgLTI4Myw2ICszNDMsOSBAQAogY29uZmlnIFNORF9TT0NfRE1JQwogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX0hETUlfQ09ERUMKKyAgICAgICB0cmlzdGF0ZSAiSERNSSBzdHViIENPREVDIgorCiBjb25maWcgU05EX1NPQ19JU0FCRUxMRQogICAgICAgICB0cmlzdGF0ZQogCkBAIC0zMDEsMTggKzM2NCwzMiBAQAogY29uZmlnIFNORF9TT0NfTUFYOTg1MAogCXRyaXN0YXRlCiAKLWNvbmZpZyBTTkRfU09DX0hETUlfQ09ERUMKLSAgICAgICB0cmlzdGF0ZQotCiBjb25maWcgU05EX1NPQ19QQ00xNjgxCi0gICAgICAgdHJpc3RhdGUKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgUENNMTY4MSBDT0RFQyIKKwlkZXBlbmRzIG9uIEkyQwogCiBjb25maWcgU05EX1NPQ19QQ00xNzkyQQotICAgICAgIHRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTE3OTJBIENPREVDIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgogCiBjb25maWcgU05EX1NPQ19QQ00zMDA4CiAgICAgICAgdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfUENNNTEyeAorCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX1BDTTUxMnhfSTJDCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTUxMnggQ09ERUNzIC0gSTJDIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFNORF9TT0NfUENNNTEyeAorCXNlbGVjdCBSRUdNQVBfSTJDCisKK2NvbmZpZyBTTkRfU09DX1BDTTUxMnhfU1BJCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFBDTTUxMnggQ09ERUNzIC0gU1BJIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX1BDTTUxMngKKwlzZWxlY3QgUkVHTUFQX1NQSQorCiBjb25maWcgU05EX1NPQ19SVDU2MzEKIAl0cmlzdGF0ZQogCkBAIC0zMjEsNyArMzk4LDggQEAKIAogI0ZyZWVzY2FsZSBzZ3RsNTAwMCBjb2RlYwogY29uZmlnIFNORF9TT0NfU0dUTDUwMDAKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJGcmVlc2NhbGUgU0dUTDUwMDAgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfU0k0NzZYCiAJdHJpc3RhdGUKQEAgLTMzMCwxMSArNDA4LDE1IEBACiAJdHJpc3RhdGUKIAlzZWxlY3QgQ1JDMzIKIAorY29uZmlnIFNORF9TT0NfU0lSRl9BVURJT19DT0RFQworCXRyaXN0YXRlICJTaVJGIFNvQyBpbnRlcm5hbCBhdWRpbyBjb2RlYyIKKwlzZWxlY3QgUkVHTUFQX01NSU8KKwogY29uZmlnIFNORF9TT0NfU045NTAzMQogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1NQRElGCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiUy9QRElGIENPREVDIgogCiBjb25maWcgU05EX1NPQ19TU00yNTE4CiAJdHJpc3RhdGUKQEAgLTM0Miw2ICs0MjQsMTQgQEAKIGNvbmZpZyBTTkRfU09DX1NTTTI2MDIKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19TU00yNjAyX1NQSQorCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19TU00yNjAyX0kyQworCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19TVEEzMlgKIAl0cmlzdGF0ZQogCkBAIC0zNTIsMjAgKzQ0MiwzMyBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RBUzUwODYKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUQVM1MDg2IHNwZWFrZXIgYW1wbGlmaWVyIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzIzCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMworCitjb25maWcgU05EX1NPQ19UTFYzMjBBSUMyM19TUEkKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzI2CiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFNQSQogCitjb25maWcgU05EX1NPQ19UTFYzMjBBSUMzMVhYCisgICAgICAgIHRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzMyWDQKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX1NPQ19UTFYzMjBBSUMzWAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRMVjMyMEFJQzN4IENPREVDcyIKKwlkZXBlbmRzIG9uIEkyQwogCiBjb25maWcgU05EX1NPQ19UTFYzMjBEQUMzMwogCXRyaXN0YXRlCkBAIC00MTQsNTUgKzUxNyw2OSBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODUxMAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MTAgQ09ERUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODUyMwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MjMgREFDIgorCWRlcGVuZHMgb24gSTJDCiAKIGNvbmZpZyBTTkRfU09DX1dNODU4MAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg1MjMgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004NzExCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODcxMSBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzI3CiAJdHJpc3RhdGUKIAogY29uZmlnIFNORF9TT0NfV004NzI4Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODcyOCBEQUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODczMQotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg3MzEgQ09ERUMiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODczNwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg3MzcgQURDIgorCWRlcGVuZHMgb24gU05EX1NPQ19JMkNfQU5EX1NQSQogCiBjb25maWcgU05EX1NPQ19XTTg3NDEKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004NzM3IERBQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzUwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc1MCBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzUzCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc1MyBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzcwCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc3MCBDT0RFQyIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKIAogY29uZmlnIFNORF9TT0NfV004Nzc2Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc3NiBDT0RFQyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKIAogY29uZmlnIFNORF9TT0NfV004NzgyCiAJdHJpc3RhdGUKIAogY29uZmlnIFNORF9TT0NfV004ODA0Ci0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODgwNCBTL1BESUYgdHJhbnNjZWl2ZXIiCisJZGVwZW5kcyBvbiBTTkRfU09DX0kyQ19BTkRfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODkwMAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODkwMwotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg5MDMgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004OTA0CiAJdHJpc3RhdGUKQEAgLTQ4MCw3ICs1OTcsOCBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODk2MgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg5NjIgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfV004OTcxCiAJdHJpc3RhdGUKQEAgLTU1Myw0ICs2NzEsNyBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RQQTYxMzBBMgotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRQQTYxMzBBMiBoZWFkcGhvbmUgYW1wbGlmaWVyIgorCWRlcGVuZHMgb24gSTJDCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCmluZGV4IGJjMTI2NzYuLjNjNGQyNzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQpAQCAtMywxMSArMywxOCBAQAogc25kLXNvYy1hYzk3LW9ianMgOj0gYWM5Ny5vCiBzbmQtc29jLWFkMTgzNi1vYmpzIDo9IGFkMTgzNi5vCiBzbmQtc29jLWFkMTkzeC1vYmpzIDo9IGFkMTkzeC5vCitzbmQtc29jLWFkMTkzeC1zcGktb2JqcyA6PSBhZDE5M3gtc3BpLm8KK3NuZC1zb2MtYWQxOTN4LWkyYy1vYmpzIDo9IGFkMTkzeC1pMmMubwogc25kLXNvYy1hZDE5ODAtb2JqcyA6PSBhZDE5ODAubwogc25kLXNvYy1hZDczMzExLW9ianMgOj0gYWQ3MzMxMS5vCiBzbmQtc29jLWFkYXUxNzAxLW9ianMgOj0gYWRhdTE3MDEubwogc25kLXNvYy1hZGF1MTM3My1vYmpzIDo9IGFkYXUxMzczLm8KK3NuZC1zb2MtYWRhdTE5Nzctb2JqcyA6PSBhZGF1MTk3Ny5vCitzbmQtc29jLWFkYXUxOTc3LXNwaS1vYmpzIDo9IGFkYXUxOTc3LXNwaS5vCitzbmQtc29jLWFkYXUxOTc3LWkyYy1vYmpzIDo9IGFkYXUxOTc3LWkyYy5vCiBzbmQtc29jLWFkYXY4MHgtb2JqcyA6PSBhZGF2ODB4Lm8KK3NuZC1zb2MtYWRhdjgwMS1vYmpzIDo9IGFkYXY4MDEubworc25kLXNvYy1hZGF2ODAzLW9ianMgOj0gYWRhdjgwMy5vCiBzbmQtc29jLWFkczExN3gtb2JqcyA6PSBhZHMxMTd4Lm8KIHNuZC1zb2MtYWs0MTA0LW9ianMgOj0gYWs0MTA0Lm8KIHNuZC1zb2MtYWs0NTM1LW9ianMgOj0gYWs0NTM1Lm8KQEAgLTIzLDYgKzMwLDggQEAKIHNuZC1zb2MtY3M0Mmw3My1vYmpzIDo9IGNzNDJsNzMubwogc25kLXNvYy1jczQyNzAtb2JqcyA6PSBjczQyNzAubwogc25kLXNvYy1jczQyNzEtb2JqcyA6PSBjczQyNzEubworc25kLXNvYy1jczQyeHg4LW9ianMgOj0gY3M0Mnh4OC5vCitzbmQtc29jLWNzNDJ4eDgtaTJjLW9ianMgOj0gY3M0Mnh4OC1pMmMubwogc25kLXNvYy1jeDIwNDQyLW9ianMgOj0gY3gyMDQ0Mi5vCiBzbmQtc29jLWRhNzIxMC1vYmpzIDo9IGRhNzIxMC5vCiBzbmQtc29jLWRhNzIxMy1vYmpzIDo9IGRhNzIxMy5vCkBAIC00Niw2ICs1NSw5IEBACiBzbmQtc29jLXBjbTE2ODEtb2JqcyA6PSBwY20xNjgxLm8KIHNuZC1zb2MtcGNtMTc5MmEtY29kZWMtb2JqcyA6PSBwY20xNzkyYS5vCiBzbmQtc29jLXBjbTMwMDgtb2JqcyA6PSBwY20zMDA4Lm8KK3NuZC1zb2MtcGNtNTEyeC1vYmpzIDo9IHBjbTUxMngubworc25kLXNvYy1wY201MTJ4LWkyYy1vYmpzIDo9IHBjbTUxMngtaTJjLm8KK3NuZC1zb2MtcGNtNTEyeC1zcGktb2JqcyA6PSBwY201MTJ4LXNwaS5vCiBzbmQtc29jLXJ0NTYzMS1vYmpzIDo9IHJ0NTYzMS5vCiBzbmQtc29jLXJ0NTY0MC1vYmpzIDo9IHJ0NTY0MC5vCiBzbmQtc29jLXNndGw1MDAwLW9ianMgOj0gc2d0bDUwMDAubwpAQCAtNTMsMTkgKzY1LDI1IEBACiBzbmQtc29jLWFsYzU2MzItb2JqcyA6PSBhbGM1NjMyLm8KIHNuZC1zb2Mtc2lnbWFkc3Atb2JqcyA6PSBzaWdtYWRzcC5vCiBzbmQtc29jLXNpNDc2eC1vYmpzIDo9IHNpNDc2eC5vCitzbmQtc29jLXNpcmYtYXVkaW8tY29kZWMtb2JqcyA6PSBzaXJmLWF1ZGlvLWNvZGVjLm8KIHNuZC1zb2Mtc245NTAzMS1vYmpzIDo9IHNuOTUwMzEubwogc25kLXNvYy1zcGRpZi10eC1vYmpzIDo9IHNwZGlmX3RyYW5zbWl0dGVyLm8KIHNuZC1zb2Mtc3BkaWYtcngtb2JqcyA6PSBzcGRpZl9yZWNlaXZlci5vCiBzbmQtc29jLXNzbTI1MTgtb2JqcyA6PSBzc20yNTE4Lm8KIHNuZC1zb2Mtc3NtMjYwMi1vYmpzIDo9IHNzbTI2MDIubworc25kLXNvYy1zc20yNjAyLXNwaS1vYmpzIDo9IHNzbTI2MDItc3BpLm8KK3NuZC1zb2Mtc3NtMjYwMi1pMmMtb2JqcyA6PSBzc20yNjAyLWkyYy5vCiBzbmQtc29jLXN0YTMyeC1vYmpzIDo9IHN0YTMyeC5vCiBzbmQtc29jLXN0YTUyOS1vYmpzIDo9IHN0YTUyOS5vCiBzbmQtc29jLXN0YWM5NzY2LW9ianMgOj0gc3RhYzk3NjYubwogc25kLXNvYy10YXM1MDg2LW9ianMgOj0gdGFzNTA4Ni5vCiBzbmQtc29jLXRsdjMyMGFpYzIzLW9ianMgOj0gdGx2MzIwYWljMjMubworc25kLXNvYy10bHYzMjBhaWMyMy1pMmMtb2JqcyA6PSB0bHYzMjBhaWMyMy1pMmMubworc25kLXNvYy10bHYzMjBhaWMyMy1zcGktb2JqcyA6PSB0bHYzMjBhaWMyMy1zcGkubwogc25kLXNvYy10bHYzMjBhaWMyNi1vYmpzIDo9IHRsdjMyMGFpYzI2Lm8KLXNuZC1zb2MtdGx2MzIwYWljM3gtb2JqcyA6PSB0bHYzMjBhaWMzeC5vCitzbmQtc29jLXRsdjMyMGFpYzMxeHgtb2JqcyA6PSB0bHYzMjBhaWMzMXh4Lm8KIHNuZC1zb2MtdGx2MzIwYWljMzJ4NC1vYmpzIDo9IHRsdjMyMGFpYzMyeDQubworc25kLXNvYy10bHYzMjBhaWMzeC1vYmpzIDo9IHRsdjMyMGFpYzN4Lm8KIHNuZC1zb2MtdGx2MzIwZGFjMzMtb2JqcyA6PSB0bHYzMjBkYWMzMy5vCiBzbmQtc29jLXR3bDQwMzAtb2JqcyA6PSB0d2w0MDMwLm8KIHNuZC1zb2MtdHdsNjA0MC1vYmpzIDo9IHR3bDYwNDAubwpAQCAtMTM0LDExICsxNTIsMTggQEAKIG9iai0kKENPTkZJR19TTkRfU09DX0FDOTdfQ09ERUMpCSs9IHNuZC1zb2MtYWM5Ny5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE4MzYpCSs9IHNuZC1zb2MtYWQxODM2Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FEMTkzWCkJKz0gc25kLXNvYy1hZDE5M3gubworb2JqLSQoQ09ORklHX1NORF9TT0NfQUQxOTNYX1NQSSkJKz0gc25kLXNvYy1hZDE5M3gtc3BpLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FEMTkzWF9JMkMpCSs9IHNuZC1zb2MtYWQxOTN4LWkyYy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE5ODApCSs9IHNuZC1zb2MtYWQxOTgwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FENzMzMTEpICs9IHNuZC1zb2MtYWQ3MzMxMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTM3MykJKz0gc25kLXNvYy1hZGF1MTM3My5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTk3NykJCSs9IHNuZC1zb2MtYWRhdTE5Nzcubworb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVTE5NzdfU1BJKQkrPSBzbmQtc29jLWFkYXUxOTc3LXNwaS5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTk3N19JMkMpCSs9IHNuZC1zb2MtYWRhdTE5NzctaTJjLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FEQVUxNzAxKSAgKz0gc25kLXNvYy1hZGF1MTcwMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFWODBYKSAgKz0gc25kLXNvYy1hZGF2ODB4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0FEQVY4MDEpICArPSBzbmQtc29jLWFkYXY4MDEubworb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVjgwMykgICs9IHNuZC1zb2MtYWRhdjgwMy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRFMxMTdYKQkrPSBzbmQtc29jLWFkczExN3gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQUs0MTA0KQkrPSBzbmQtc29jLWFrNDEwNC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BSzQ1MzUpCSs9IHNuZC1zb2MtYWs0NTM1Lm8KQEAgLTE1Niw2ICsxODEsOCBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0Mkw3MykJKz0gc25kLXNvYy1jczQybDczLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0NTNDI3MCkJKz0gc25kLXNvYy1jczQyNzAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0MjcxKQkrPSBzbmQtc29jLWNzNDI3MS5vCitvYmotJChDT05GSUdfU05EX1NPQ19DUzQyWFg4KQkrPSBzbmQtc29jLWNzNDJ4eDgubworb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0MlhYOF9JMkMpICs9IHNuZC1zb2MtY3M0Mnh4OC1pMmMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1gyMDQ0MikJKz0gc25kLXNvYy1jeDIwNDQyLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0RBNzIxMCkJKz0gc25kLXNvYy1kYTcyMTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfREE3MjEzKQkrPSBzbmQtc29jLWRhNzIxMy5vCkBAIC0xNzksNiArMjA2LDkgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1BDTTE2ODEpCSs9IHNuZC1zb2MtcGNtMTY4MS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19QQ00xNzkyQSkJKz0gc25kLXNvYy1wY20xNzkyYS1jb2RlYy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19QQ00zMDA4KQkrPSBzbmQtc29jLXBjbTMwMDgubworb2JqLSQoQ09ORklHX1NORF9TT0NfUENNNTEyeCkJKz0gc25kLXNvYy1wY201MTJ4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1BDTTUxMnhfSTJDKQkrPSBzbmQtc29jLXBjbTUxMngtaTJjLm8KK29iai0kKENPTkZJR19TTkRfU09DX1BDTTUxMnhfU1BJKQkrPSBzbmQtc29jLXBjbTUxMngtc3BpLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTYzMSkJKz0gc25kLXNvYy1ydDU2MzEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjQwKQkrPSBzbmQtc29jLXJ0NTY0MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TR1RMNTAwMCkgICs9IHNuZC1zb2Mtc2d0bDUwMDAubwpAQCAtMTg4LDE0ICsyMTgsMTkgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1NQRElGKQkrPSBzbmQtc29jLXNwZGlmLXJ4Lm8gc25kLXNvYy1zcGRpZi10eC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TU00yNTE4KQkrPSBzbmQtc29jLXNzbTI1MTgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1NNMjYwMikJKz0gc25kLXNvYy1zc20yNjAyLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NTTTI2MDJfU1BJKQkrPSBzbmQtc29jLXNzbTI2MDItc3BpLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NTTTI2MDJfSTJDKQkrPSBzbmQtc29jLXNzbTI2MDItaTJjLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NUQTMyWCkgICArPSBzbmQtc29jLXN0YTMyeC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TVEE1MjkpICAgKz0gc25kLXNvYy1zdGE1Mjkubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1RBQzk3NjYpCSs9IHNuZC1zb2Mtc3RhYzk3NjYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVEFTNTA4NikJKz0gc25kLXNvYy10YXM1MDg2Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzKQkrPSBzbmQtc29jLXRsdjMyMGFpYzIzLm8KK29iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzX0kyQykJKz0gc25kLXNvYy10bHYzMjBhaWMyMy1pMmMubworb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjNfU1BJKQkrPSBzbmQtc29jLXRsdjMyMGFpYzIzLXNwaS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMyNikJKz0gc25kLXNvYy10bHYzMjBhaWMyNi5vCi1vYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzWCkJKz0gc25kLXNvYy10bHYzMjBhaWMzeC5vCitvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzMVhYKSAgICAgKz0gc25kLXNvYy10bHYzMjBhaWMzMXh4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzMyWDQpICAgICArPSBzbmQtc29jLXRsdjMyMGFpYzMyeDQubworb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDM1gpCSs9IHNuZC1zb2MtdGx2MzIwYWljM3gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwREFDMzMpCSs9IHNuZC1zb2MtdGx2MzIwZGFjMzMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVFdMNDAzMCkJKz0gc25kLXNvYy10d2w0MDMwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RXTDYwNDApCSs9IHNuZC1zb2MtdHdsNjA0MC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwppbmRleCA3N2Y0NTk4Li42ODU5OThkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKQEAgLTQwLDggKzQwLDggQEAKICAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmFkMTgzNl9kZWVtcFtdID0geyJOb25lIiwgIjQ0LjFrSHoiLCAiMzJrSHoiLCAiNDhrSHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZDE4MzZfZGVlbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFEMTgzNl9EQUNfQ1RSTDEsIDgsIDQsIGFkMTgzNl9kZWVtcCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWQxODM2X2RlZW1wX2VudW0sCisJCQkgICAgQUQxODM2X0RBQ19DVFJMMSwgOCwgYWQxODM2X2RlZW1wKTsKIAogI2RlZmluZSBBRDE4MzZfREFDX1ZPTFVNRSh4KSBcCiAJU09DX0RPVUJMRV9SKCJEQUMiICN4ICIgUGxheWJhY2sgVm9sdW1lIiwgQUQxODM2X0RBQ19MX1ZPTCh4KSwgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtaTJjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNhMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtaTJjLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEFEMTkzNi9BRDE5MzcgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkMTkzeC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7CisJeyAiYWQxOTM2IiwgMCB9LAorCXsgImFkMTkzNyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQxOTN4X2lkKTsKKworc3RhdGljIGludCBhZDE5M3hfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkMTkzeF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gODsKKworCXJldHVybiBhZDE5M3hfcHJvYmUoJmNsaWVudC0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZDE5M3hfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQxOTN4X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQxOTN4IiwKKwl9LAorCS5wcm9iZSAgICA9IGFkMTkzeF9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gYWQxOTN4X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gYWQxOTN4X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGFkMTkzeF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEMTkzNi9BRDE5MzcgYXVkaW8gQ09ERUMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LXNwaS5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3gtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwY2VmOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LXNwaS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBBRDE5MzgvQUQxOTM5IGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAiYWQxOTN4LmgiCisKK3N0YXRpYyBpbnQgYWQxOTN4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkMTkzeF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gMTY7CisJY29uZmlnLnJlYWRfZmxhZ19tYXNrID0gMHgwOTsKKwljb25maWcud3JpdGVfZmxhZ19tYXNrID0gMHgwODsKKworCXJldHVybiBhZDE5M3hfcHJvYmUoJnNwaS0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZDE5M3hfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQxOTN4X3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWQxOTN4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQxOTN4X3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFkMTkzeF9zcGlfcmVtb3ZlLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGFkMTkzeF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEMTkzOC9BRDE5MzkgYXVkaW8gQ09ERUMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCmluZGV4IDVhNDJkY2EuLjY4NDRkMGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYwpAQCAtNiwxMiArNiwxMCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC0xOSw2ICsxNyw3IEBACiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCiAjaW5jbHVkZSAiYWQxOTN4LmgiCiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwpAQCAtMzIsOCArMzEsOCBAQAogICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkMTkzeF9kZWVtcFtdID0geyJOb25lIiwgIjQ4a0h6IiwgIjQ0LjFrSHoiLCAiMzJrSHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZDE5M3hfZGVlbXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFEMTkzWF9EQUNfQ1RSTDIsIDEsIDQsIGFkMTkzeF9kZWVtcCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWQxOTN4X2RlZW1wX2VudW0sIEFEMTkzWF9EQUNfQ1RSTDIsIDEsCisJCQkgICAgYWQxOTN4X2RlZW1wKTsKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX01JTk1BWChhZGF1MTkzeF90bHYsIC05NTYzLCAwKTsKIApAQCAtMzIwLDE3ICszMTksOSBAQAogCS5vcHMgPSAmYWQxOTN4X2RhaV9vcHMsCiB9OwogCi1zdGF0aWMgaW50IGFkMTkzeF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IGFkMTkzeF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3ggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFkMTkzeC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qIGRlZmF1bHQgc2V0dGluZyBmb3IgYWQxOTN4ICovCiAKQEAgLTM0OCwxMSArMzM5LDExIEBACiAJcmVnbWFwX3dyaXRlKGFkMTkzeC0+cmVnbWFwLCBBRDE5M1hfUExMX0NMS19DVFJMMCwgMHg5OSk7IC8qIG1jbGs9MjQuNTc2TWh6OiAweDlEOyBtY2xrPTEyLjI4OE1oejogMHg5OSAqLwogCXJlZ21hcF93cml0ZShhZDE5M3gtPnJlZ21hcCwgQUQxOTNYX1BMTF9DTEtfQ1RSTDEsIDB4MDQpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FkMTkzeCA9IHsKLQkucHJvYmUgPSAJYWQxOTN4X3Byb2JlLAorCS5wcm9iZSA9IGFkMTkzeF9jb2RlY19wcm9iZSwKIAkuY29udHJvbHMgPSBhZDE5M3hfc25kX2NvbnRyb2xzLAogCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkMTkzeF9zbmRfY29udHJvbHMpLAogCS5kYXBtX3dpZGdldHMgPSBhZDE5M3hfZGFwbV93aWRnZXRzLApAQCAtMzY2LDE0MCArMzU3LDMxIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9zcGlfcmVnbWFwX2NvbmZpZyA9IHsKLQkudmFsX2JpdHMgPSA4LAotCS5yZWdfYml0cyA9IDE2LAotCS5yZWFkX2ZsYWdfbWFzayA9IDB4MDksCi0JLndyaXRlX2ZsYWdfbWFzayA9IDB4MDgsCi0KK2NvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9yZWdtYXBfY29uZmlnID0gewogCS5tYXhfcmVnaXN0ZXIgPSBBRDE5M1hfTlVNX1JFR1MgLSAxLAogCS52b2xhdGlsZV9yZWcgPSBhZGF1MTkzeF9yZWdfdm9sYXRpbGUsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoYWQxOTN4X3JlZ21hcF9jb25maWcpOwogCi1zdGF0aWMgaW50IGFkMTkzeF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK2ludCBhZDE5M3hfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3g7CiAKLQlhZDE5M3ggPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2Yoc3RydWN0IGFkMTkzeF9wcml2KSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCWFkMTkzeCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqYWQxOTN4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFkMTkzeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWFkMTkzeC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmYWQxOTN4X3NwaV9yZWdtYXBfY29uZmlnKTsKLQlpZiAoSVNfRVJSKGFkMTkzeC0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWQxOTN4LT5yZWdtYXApOworCWFkMTkzeC0+cmVnbWFwID0gcmVnbWFwOwogCi0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgYWQxOTN4KTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZDE5M3gpOwogCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCi0JCQkmYWQxOTN4X2RhaSwgMSk7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCisJCSZhZDE5M3hfZGFpLCAxKTsKIH0KLQotc3RhdGljIGludCBhZDE5M3hfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQxOTN4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiYWQxOTN4IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gYWQxOTN4X3NwaV9wcm9iZSwKLQkucmVtb3ZlCQk9IGFkMTkzeF9zcGlfcmVtb3ZlLAotfTsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWQxOTN4X2kyY19yZWdtYXBfY29uZmlnID0gewotCS52YWxfYml0cyA9IDgsCi0JLnJlZ19iaXRzID0gOCwKLQotCS5tYXhfcmVnaXN0ZXIgPSBBRDE5M1hfTlVNX1JFR1MgLSAxLAotCS52b2xhdGlsZV9yZWcgPSBhZGF1MTkzeF9yZWdfdm9sYXRpbGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7Ci0JeyAiYWQxOTM2IiwgMCB9LAotCXsgImFkMTkzNyIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQxOTN4X2lkKTsKLQotc3RhdGljIGludCBhZDE5M3hfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBhZDE5M3hfcHJpdiAqYWQxOTN4OwotCi0JYWQxOTN4ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhZDE5M3hfcHJpdiksCi0JCQkgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoYWQxOTN4ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYWQxOTN4LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZhZDE5M3hfaTJjX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoYWQxOTN4LT5yZWdtYXApKQotCQlyZXR1cm4gUFRSX0VSUihhZDE5M3gtPnJlZ21hcCk7Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhZDE5M3gpOwotCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LCAmc29jX2NvZGVjX2Rldl9hZDE5M3gsCi0JCQkmYWQxOTN4X2RhaSwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxOTN4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkMTkzeF9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkMTkzeCIsCi0JfSwKLQkucHJvYmUgICAgPSBhZDE5M3hfaTJjX3Byb2JlLAotCS5yZW1vdmUgICA9IGFkMTkzeF9pMmNfcmVtb3ZlLAotCS5pZF90YWJsZSA9IGFkMTkzeF9pZCwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgYWQxOTN4X21vZGluaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9ICBpMmNfYWRkX2RyaXZlcigmYWQxOTN4X2kyY19kcml2ZXIpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBBRDE5M1ggSTJDIGRyaXZlcjogJWRcbiIsCi0JCQkJcmV0KTsKLQl9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQxOTN4X3NwaV9kcml2ZXIpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBBRDE5M1ggU1BJIGRyaXZlcjogJWRcbiIsCi0JCQkJcmV0KTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotbW9kdWxlX2luaXQoYWQxOTN4X21vZGluaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWQxOTN4X21vZGV4aXQodm9pZCkKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQxOTN4X3NwaV9kcml2ZXIpOwotI2VuZGlmCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0JaTJjX2RlbF9kcml2ZXIoJmFkMTkzeF9pMmNfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoYWQxOTN4X21vZGV4aXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYWQxOTN4X3Byb2JlKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIGFkMTkzeCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmgKaW5kZXggNDczMzg4MC4uYWI5YTk5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5oCkBAIC05LDYgKzksMTMgQEAKICNpZm5kZWYgX19BRDE5M1hfSF9fCiAjZGVmaW5lIF9fQUQxOTNYX0hfXwogCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKK3N0cnVjdCBkZXZpY2U7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhZDE5M3hfcmVnbWFwX2NvbmZpZzsKK2ludCBhZDE5M3hfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOworCiAjZGVmaW5lIEFEMTkzWF9QTExfQ0xLX0NUUkwwICAgIDB4MDAKICNkZWZpbmUgQUQxOTNYX1BMTF9QT1dFUkRPV04gICAgICAgICAgIDB4MDEKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF9NQVNLICAgMHg2CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKaW5kZXggZWI4MzZlZC4uODc3ZjU3MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuYwpAQCAtMzQ1LDE1ICszNDUsMTUgQEAKIAkiQ2hhbm5lbCA1IiwKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKIAlBREFVMTM3M19GRFNQX1NFTDEsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAogCUFEQVUxMzczX0ZEU1BfU0VMMSwgMCwgYWRhdTEzNzNfZmRzcF9zZWxfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCiAJQURBVTEzNzNfRkRTUF9TRUwyLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY2hhbm5lbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2hwZl9jaGFubmVsX2VudW0sCiAJQURBVTEzNzNfRkRTUF9TRUwzLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSwKIAlBREFVMTM3M19GRFNQX1NFTDQsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfaHBmX2N1dG9mZl90ZXh0W10gPSB7CkBAIC0zNjIsNyArMzYyLDcgQEAKIAkiODAwSHoiLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2hwZl9jdXRvZmZfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY3V0b2ZmX2VudW0sCiAJQURBVTEzNzNfSFBGX0NUUkwsIDMsIGFkYXUxMzczX2hwZl9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dFtdID0gewpAQCAtMzg4LDE0ICszODgsMTQgQEAKIAk1LCA3LCBUTFZfREJfU0NBTEVfSVRFTSgxNDAwLCAxNTAsIDApLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAogCUFEQVUxMzczX0JBU1MxLCA1LCBhZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKIAlBREFVMTM3M19CQVNTMSwgMiwgNywgYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3RleHQsCiAJYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3ZhbHVlcyk7CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKIAlBREFVMTM3M19CQVNTMSwgMCwgYWRhdTEzNzNfYmFzc19ocGZfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfM2RfbGV2ZWxfdGV4dFtdID0gewpAQCAtNDA5LDkgKzQwOSw5IEBACiAJIjAuMTY4NzUgZnMiLCAiMC4yNzA4MyBmcyIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M18zZF9sZXZlbF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2xldmVsX2VudW0sCiAJQURBVTEzNzNfM0RfQ1RSTDEsIDQsIGFkYXUxMzczXzNkX2xldmVsX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtLAogCUFEQVUxMzczXzNEX0NUUkwxLCAwLCBhZGF1MTM3M18zZF9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTEzNzNfM2RfdGx2W10gPSB7CkBAIC00MjcsMTEgKzQyNywxMSBAQAogCSJTdGVyZW8iLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAogCUFEQVUxMzczX09VVFBVVF9DVFJMLCA0LCBhZGF1MTM3M19scl9tdXhfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCiAJQURBVTEzNzNfT1VUUFVUX0NUUkwsIDYsIGFkYXUxMzczX2xyX211eF90ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19zcGVha2VyX2xyX211eF9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX3NwZWFrZXJfbHJfbXV4X2VudW0sCiAJQURBVTEzNzNfTFNfQ1RSTCwgNCwgYWRhdTEzNzNfbHJfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfY29udHJvbHNbXSA9IHsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCSJETUlDMSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYXUxMzczX2RlY2ltYXRvcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgMiwgYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9WSVJUX0RFQ0woYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0sCisJYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfZGVjaW1hdG9yX211eCA9CiAJU09DX0RBUE1fRU5VTV9WSVJUKCJEZWNpbWF0b3IgTXV4IiwgYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0pOwpAQCAtMTM3NiwxNSArMTM3Niw4IEBACiAJc3RydWN0IGFkYXUxMzczX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlib29sIGxpbmVvdXRfZGlmZmVyZW50aWFsID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgcmV0OwogCWludCBpOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlpZiAocGRhdGEpIHsKIAkJaWYgKHBkYXRhLT5udW1fZHJjID4gQVJSQVlfU0laRShwZGF0YS0+ZHJjX3NldHRpbmcpKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAwZThjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1pMmMuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQURBVTE5NzcvQURBVTE5NzgvQURBVTE5NzkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkYXUxOTc3LmgiCisKK3N0YXRpYyBpbnQgYWRhdTE5NzdfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZzsKKworCWNvbmZpZyA9IGFkYXUxOTc3X3JlZ21hcF9jb25maWc7CisJY29uZmlnLnZhbF9iaXRzID0gODsKKwljb25maWcucmVnX2JpdHMgPSA4OworCisJcmV0dXJuIGFkYXUxOTc3X3Byb2JlKCZjbGllbnQtPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmY29uZmlnKSwKKwkJaWQtPmRyaXZlcl9kYXRhLCBOVUxMKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGF1MTk3N19pMmNfaWRzW10gPSB7CisJeyAiYWRhdTE5NzciLCBBREFVMTk3NyB9LAorCXsgImFkYXUxOTc4IiwgQURBVTE5NzggfSwKKwl7ICJhZGF1MTk3OSIsIEFEQVUxOTc4IH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkYXUxOTc3X2kyY19pZHMpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdTE5NzdfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGF1MTk3NyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRhdTE5NzdfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBhZGF1MTk3N19pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYXUxOTc3X2kyY19pZHMsCit9OworbW9kdWxlX2kyY19kcml2ZXIoYWRhdTE5NzdfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBBREFVMTk3Ny9BREFVMTk3OC9BREFVMTk3OSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny1zcGkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5Nzctc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1Y2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5Nzctc3BpLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAiYWRhdTE5NzcuaCIKKworc3RhdGljIHZvaWQgYWRhdTE5Nzdfc3BpX3N3aXRjaF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJLyoKKwkgKiBUbyBnZXQgdGhlIGRldmljZSBpbnRvIFNQSSBtb2RlIENMQVRDSCBoYXMgdG8gYmUgcHVsbGVkIGxvdyB0aHJlZQorCSAqIHRpbWVzLiAgRG8gdGhpcyBieSBpc3N1aW5nIHRocmVlIGR1bW15IHJlYWRzLgorCSAqLworCXNwaV93OHI4KHNwaSwgMHgwMCk7CisJc3BpX3c4cjgoc3BpLCAweDAwKTsKKwlzcGlfdzhyOChzcGksIDB4MDApOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICppZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSk7CisJc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOworCisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb25maWcgPSBhZGF1MTk3N19yZWdtYXBfY29uZmlnOworCWNvbmZpZy52YWxfYml0cyA9IDg7CisJY29uZmlnLnJlZ19iaXRzID0gMTY7CisJY29uZmlnLnJlYWRfZmxhZ19tYXNrID0gMHgxOworCisJcmV0dXJuIGFkYXUxOTc3X3Byb2JlKCZzcGktPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmY29uZmlnKSwKKwkJaWQtPmRyaXZlcl9kYXRhLCBhZGF1MTk3N19zcGlfc3dpdGNoX21vZGUpOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYXUxOTc3X3NwaV9pZHNbXSA9IHsKKwl7ICJhZGF1MTk3NyIsIEFEQVUxOTc3IH0sCisJeyAiYWRhdTE5NzgiLCBBREFVMTk3OCB9LAorCXsgImFkYXUxOTc5IiwgQURBVTE5NzggfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRhdTE5Nzdfc3BpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGF1MTk3N19zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYXUxOTc3IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGF1MTk3N19zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGFkYXUxOTc3X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlID0gYWRhdTE5Nzdfc3BpX2lkcywKK307Cittb2R1bGVfc3BpX2RyaXZlcihhZGF1MTk3N19zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1NWRhNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYwpAQCAtMCwwICsxLDEwMTggQEAKKy8qCisgKiBBREFVMTk3Ny9BREFVMTk3OC9BREFVMTk3OSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgQXV0aG9yOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2FkYXUxOTc3Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJhZGF1MTk3Ny5oIgorCisjZGVmaW5lIEFEQVUxOTc3X1JFR19QT1dFUgkJMHgwMAorI2RlZmluZSBBREFVMTk3N19SRUdfUExMCQkweDAxCisjZGVmaW5lIEFEQVUxOTc3X1JFR19CT09TVAkJMHgwMgorI2RlZmluZSBBREFVMTk3N19SRUdfTUlDQklBUwkJMHgwMworI2RlZmluZSBBREFVMTk3N19SRUdfQkxPQ0tfUE9XRVJfU0FJCTB4MDQKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1NBSV9DVFJMMAkJMHgwNQorI2RlZmluZSBBREFVMTk3N19SRUdfU0FJX0NUUkwxCQkweDA2CisjZGVmaW5lIEFEQVUxOTc3X1JFR19DTUFQMTIJCTB4MDcKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0NNQVAzNAkJMHgwOAorI2RlZmluZSBBREFVMTk3N19SRUdfU0FJX09WRVJURU1QCTB4MDkKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1BPU1RfQURDX0dBSU4oeCkJKDB4MGEgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1JFR19NSVNDX0NPTlRST0wJMHgwZQorI2RlZmluZSBBREFVMTk3N19SRUdfRElBR19DT05UUk9MCTB4MTAKKyNkZWZpbmUgQURBVTE5NzdfUkVHX1NUQVRVUyh4KQkJKDB4MTEgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1JFR19ESUFHX0lSUTEJCTB4MTUKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0RJQUdfSVJRMgkJMHgxNgorI2RlZmluZSBBREFVMTk3N19SRUdfQURKVVNUMQkJMHgxNworI2RlZmluZSBBREFVMTk3N19SRUdfQURKVVNUMgkJMHgxOAorI2RlZmluZSBBREFVMTk3N19SRUdfQURDX0NMSVAJCTB4MTkKKyNkZWZpbmUgQURBVTE5NzdfUkVHX0RDX0hQRl9DQUwJCTB4MWEKKworI2RlZmluZSBBREFVMTk3N19QT1dFUl9SRVNFVAkJCUJJVCg3KQorI2RlZmluZSBBREFVMTk3N19QT1dFUl9QV1VQCQkJQklUKDApCisKKyNkZWZpbmUgQURBVTE5NzdfUExMX0NMS19TCQkJQklUKDQpCisjZGVmaW5lIEFEQVUxOTc3X1BMTF9NQ1NfTUFTSwkJCTB4NworCisjZGVmaW5lIEFEQVUxOTc3X01JQ0JJQVNfTUJfVk9MVFNfTUFTSwkJMHhmMAorI2RlZmluZSBBREFVMTk3N19NSUNCSUFTX01CX1ZPTFRTX09GRlNFVAk0CisKKyNkZWZpbmUgQURBVTE5NzdfQkxPQ0tfUE9XRVJfU0FJX0xSX1BPTAkJQklUKDcpCisjZGVmaW5lIEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0UJQklUKDYpCisjZGVmaW5lIEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9MRE9fRU4JCUJJVCg1KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfTUFTSwkJKDB4MyA8PCA2KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0kyUwkJKDB4MCA8PCA2KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0xKCQkoMHgxIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQJCSgweDIgPDwgNikKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9SSl8xNkJJVAkJKDB4MyA8PCA2KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfTUFTSwkJKDB4NyA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX0kyUwkJKDB4MCA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV8yCQkoMHgxIDw8IDMpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzQJCSgweDIgPDwgMykKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9URE1fOAkJKDB4MyA8PCAzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV8xNgkJKDB4NCA8PCAzKQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GU19NQVNLCQkoMHg3KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfODAwMF8xMjAwMAkoMHgwKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMTYwMDBfMjQwMDAJKDB4MSkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzMyMDAwXzQ4MDAwCSgweDIpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMF9GU182NDAwMF85NjAwMAkoMHgzKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMTI4MDAwXzE5MjAwMAkoMHg0KQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9TTE9UX1dJRFRIX01BU0sJKDB4MyA8PCA1KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfU0xPVF9XSURUSF8zMgkoMHgwIDw8IDUpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9TTE9UX1dJRFRIXzI0CSgweDEgPDwgNSkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMTYJKDB4MiA8PCA1KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfREFUQV9XSURUSF9NQVNLCSgweDEgPDwgNCkKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMTZCSVQJKDB4MSA8PCA0KQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfREFUQV9XSURUSF8yNEJJVAkoMHgwIDw8IDQpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9MUkNMS19QVUxTRQkJQklUKDMpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9NU0IJCQlCSVQoMikKKyNkZWZpbmUgQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFXzE2CQkoMHgxIDw8IDEpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9CQ0xLUkFURV8zMgkJKDB4MCA8PCAxKQorI2RlZmluZSBBREFVMTk3N19TQUlfQ1RSTDFfQkNMS1JBVEVfTUFTSwkoMHgxIDw8IDEpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVIJCUJJVCgwKQorCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9PVkVSVEVNUF9EUlZfQyh4KQkJQklUKDQgKyAoeCkpCisjZGVmaW5lIEFEQVUxOTc3X1NBSV9PVkVSVEVNUF9EUlZfSElaCQlCSVQoMykKKworI2RlZmluZSBBREFVMTk3N19NSVNDX0NPTlRST0xfU1VNX01PREVfTUFTSwkoMHgzIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9TVU1fTU9ERV8xQ0gJKDB4MiA8PCA2KQorI2RlZmluZSBBREFVMTk3N19NSVNDX0NPTlRST0xfU1VNX01PREVfMkNICSgweDEgPDwgNikKKyNkZWZpbmUgQURBVTE5NzdfTUlTQ19DT05UUk9MX1NVTV9NT0RFXzRDSAkoMHgwIDw8IDYpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9NTVVURQkJQklUKDQpCisjZGVmaW5lIEFEQVUxOTc3X01JU0NfQ09OVFJPTF9EQ19DQUwJCUJJVCgwKQorCisjZGVmaW5lIEFEQVUxOTc3X0NIQU5fTUFQX1NFQ09ORF9TTE9UX09GRlNFVAk0CisjZGVmaW5lIEFEQVUxOTc3X0NIQU5fTUFQX0ZJUlNUX1NMT1RfT0ZGU0VUCTAKKworc3RydWN0IGFkYXUxOTc3IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJYm9vbCByaWdodF9qOworCXVuc2lnbmVkIGludCBzeXNjbGs7CisJZW51bSBhZGF1MTk3N19zeXNjbGtfc3JjIHN5c2Nsa19zcmM7CisJc3RydWN0IGdwaW9fZGVzYyAqcmVzZXRfZ3BpbzsKKwllbnVtIGFkYXUxOTc3X3R5cGUgdHlwZTsKKworCXN0cnVjdCByZWd1bGF0b3IgKmF2ZGRfcmVnOworCXN0cnVjdCByZWd1bGF0b3IgKmR2ZGRfcmVnOworCisJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzOworCisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgKCpzd2l0Y2hfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKworCXVuc2lnbmVkIGludCBtYXhfbWFzdGVyX2ZzOworCXVuc2lnbmVkIGludCBzbG90X3dpZHRoOworCWJvb2wgZW5hYmxlZDsKKwlib29sIG1hc3RlcjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgYWRhdTE5NzdfcmVnX2RlZmF1bHRzW10gPSB7CisJeyAweDAwLCAweDAwIH0sCisJeyAweDAxLCAweDQxIH0sCisJeyAweDAyLCAweDRhIH0sCisJeyAweDAzLCAweDdkIH0sCisJeyAweDA0LCAweDNkIH0sCisJeyAweDA1LCAweDAyIH0sCisJeyAweDA2LCAweDAwIH0sCisJeyAweDA3LCAweDEwIH0sCisJeyAweDA4LCAweDMyIH0sCisJeyAweDA5LCAweGYwIH0sCisJeyAweDBhLCAweGEwIH0sCisJeyAweDBiLCAweGEwIH0sCisJeyAweDBjLCAweGEwIH0sCisJeyAweDBkLCAweGEwIH0sCisJeyAweDBlLCAweDAyIH0sCisJeyAweDEwLCAweDBmIH0sCisJeyAweDE1LCAweDIwIH0sCisJeyAweDE2LCAweDAwIH0sCisJeyAweDE3LCAweDAwIH0sCisJeyAweDE4LCAweDAwIH0sCisJeyAweDFhLCAweDAwIH0sCit9OworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYX01VVEUoYWRhdTE5NzdfYWRjX2dhaW4sIC0zNTYyLCA2MDAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkYXUxOTc3X21pY2JpYXNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUyIsIEFEQVUxOTc3X1JFR19NSUNCSUFTLAorCQkzLCAwLCBOVUxMLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkYXUxOTc3X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9TVVBQTFkoIlZyZWYiLCBBREFVMTk3N19SRUdfQkxPQ0tfUE9XRVJfU0FJLAorCQk0LCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9BREMoIkFEQzEiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzIiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDEsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzMiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDIsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQzQiLCAiQ2FwdHVyZSIsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksIDMsIDApLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4zIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU40IiksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJWUkVGIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhZGF1MTk3N19kYXBtX3JvdXRlc1tdID0geworCXsgIkFEQzEiLCBOVUxMLCAiQUlOMSIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIkFJTjIiIH0sCisJeyAiQURDMyIsIE5VTEwsICJBSU4zIiB9LAorCXsgIkFEQzQiLCBOVUxMLCAiQUlONCIgfSwKKworCXsgIkFEQzEiLCBOVUxMLCAiVnJlZiIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIlZyZWYiIH0sCisJeyAiQURDMyIsIE5VTEwsICJWcmVmIiB9LAorCXsgIkFEQzQiLCBOVUxMLCAiVnJlZiIgfSwKKworCXsgIlZSRUYiLCBOVUxMLCAiVnJlZiIgfSwKK307CisKKyNkZWZpbmUgQURBVTE5NzdfVk9MVU1FKHgpIFwKKwlTT0NfU0lOR0xFX1RMVigiQURDIiAjeCAiIENhcHR1cmUgVm9sdW1lIiwgXAorCQlBREFVMTk3N19SRUdfUE9TVF9BRENfR0FJTigoeCkgLSAxKSwgXAorCQkwLCAyNTUsIDEsIGFkYXUxOTc3X2FkY19nYWluKQorCisjZGVmaW5lIEFEQVUxOTc3X0hQRl9TV0lUQ0goeCkgXAorCVNPQ19TSU5HTEUoIkFEQyIgI3ggIiBIaWdocGFzcy1GaWx0ZXIgQ2FwdHVyZSBTd2l0Y2giLCBcCisJCUFEQVUxOTc3X1JFR19EQ19IUEZfQ0FMLCAoeCkgLSAxLCAxLCAwKQorCisjZGVmaW5lIEFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goeCkgXAorCVNPQ19TSU5HTEUoIkFEQyIgI3ggIiBEQyBTdWJzdHJhY3Rpb24gQ2FwdHVyZSBTd2l0Y2giLCBcCisJCUFEQVUxOTc3X1JFR19EQ19IUEZfQ0FMLCAoeCkgKyAzLCAxLCAwKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTE5Nzdfc25kX2NvbnRyb2xzW10gPSB7CisJQURBVTE5NzdfVk9MVU1FKDEpLAorCUFEQVUxOTc3X1ZPTFVNRSgyKSwKKwlBREFVMTk3N19WT0xVTUUoMyksCisJQURBVTE5NzdfVk9MVU1FKDQpLAorCisJQURBVTE5NzdfSFBGX1NXSVRDSCgxKSwKKwlBREFVMTk3N19IUEZfU1dJVENIKDIpLAorCUFEQVUxOTc3X0hQRl9TV0lUQ0goMyksCisJQURBVTE5NzdfSFBGX1NXSVRDSCg0KSwKKworCUFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goMSksCisJQURBVTE5NzdfRENfU1VCX1NXSVRDSCgyKSwKKwlBREFVMTk3N19EQ19TVUJfU1dJVENIKDMpLAorCUFEQVUxOTc3X0RDX1NVQl9TV0lUQ0goNCksCit9OworCitzdGF0aWMgaW50IGFkYXUxOTc3X3Jlc2V0KHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcpCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIHJlc2V0IGJpdCBpcyBvYnZpb3VzbHkgdm9sYXRpbGUsIGJ1dCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY2FjaGUKKwkgKiB0aGUgb3RoZXIgYml0cyBpbiB0aGUgcmVnaXN0ZXIsIHNvIHdlIGNhbid0IGp1c3QgbWFyayB0aGUgd2hvbGUKKwkgKiByZWdpc3RlciBhcyB2b2xhdGlsZS4gU2luY2UgdGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSdsbCBldmVyCisJICogdG91Y2ggdGhlIHJlc2V0IGJpdCBqdXN0IGJ5cGFzcyB0aGUgY2FjaGUgZm9yIHRoaXMgb3BlcmF0aW9uLgorCSAqLworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhZGF1MTk3Ny0+cmVnbWFwLCB0cnVlKTsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BPV0VSLAorCQkJQURBVTE5NzdfUE9XRVJfUkVTRVQpOworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhhZGF1MTk3Ny0+cmVnbWFwLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIGZvciB0aHMgRlMgZmllbGQgaW4gdGhlIENUUkwwIHJlZ2lzdGVyCisgKiBkZXBlbmRpbmcgb24gdGhlIHJhdGUuCisgKi8KK3N0YXRpYyBpbnQgYWRhdTE5NzdfbG9va3VwX2ZzKHVuc2lnbmVkIGludCByYXRlKQoreworCWlmIChyYXRlID49IDgwMDAgJiYgcmF0ZSA8PSAxMjAwMCkKKwkJcmV0dXJuIEFEQVUxOTc3X1NBSV9DVFJMMF9GU184MDAwXzEyMDAwOworCWVsc2UgaWYgKHJhdGUgPj0gMTYwMDAgJiYgcmF0ZSA8PSAyNDAwMCkKKwkJcmV0dXJuIEFEQVUxOTc3X1NBSV9DVFJMMF9GU18xNjAwMF8yNDAwMDsKKwllbHNlIGlmIChyYXRlID49IDMyMDAwICYmIHJhdGUgPD0gNDgwMDApCisJCXJldHVybiBBREFVMTk3N19TQUlfQ1RSTDBfRlNfMzIwMDBfNDgwMDA7CisJZWxzZSBpZiAocmF0ZSA+PSA2NDAwMCAmJiByYXRlIDw9IDk2MDAwKQorCQlyZXR1cm4gQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzY0MDAwXzk2MDAwOworCWVsc2UgaWYgKHJhdGUgPj0gMTI4MDAwICYmIHJhdGUgPD0gMTkyMDAwKQorCQlyZXR1cm4gQURBVTE5NzdfU0FJX0NUUkwwX0ZTXzEyODAwMF8xOTIwMDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19sb29rdXBfbWNzKHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcsIHVuc2lnbmVkIGludCByYXRlLAorCXVuc2lnbmVkIGludCBmcykKK3sKKwl1bnNpZ25lZCBpbnQgbWNzOworCisJLyoKKwkgKiByYXRlID0gc3lzY2xrIC8gKDUxMiAqIG1jc19sdXRbbWNzXSkgKiAyKipmcworCSAqID0+IG1jc19sdXRbbWNzXSA9IHN5c2NsayAvICg1MTIgKiByYXRlKSAqIDIqKmZzCisJICogPT4gbWNzX2x1dFttY3NdID0gc3lzY2xrIC8gKCg1MTIgLyAyKipmcykgKiByYXRlKQorCSAqLworCisJcmF0ZSAqPSA1MTIgPj4gZnM7CisKKwlpZiAoYWRhdTE5NzctPnN5c2NsayAlIHJhdGUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY3MgPSBhZGF1MTk3Ny0+c3lzY2xrIC8gcmF0ZTsKKworCS8qIFRoZSBmYWN0b3JzIGNvbmZpZ3VyZWQgYnkgTUNTIGFyZSAxLCAyLCAzLCA0LCA2ICovCisJaWYgKG1jcyA8IDEgfHwgbWNzID4gNiB8fCBtY3MgPT0gNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY3MgPSBtY3MgLSAxOworCWlmIChtY3MgPT0gNSkKKwkJbWNzID0gNDsKKworCXJldHVybiBtY3M7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE5NzdfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJdW5zaWduZWQgaW50IHNsb3Rfd2lkdGg7CisJdW5zaWduZWQgaW50IGN0cmwwLCBjdHJsMF9tYXNrOworCXVuc2lnbmVkIGludCBjdHJsMTsKKwlpbnQgbWNzLCBmczsKKwlpbnQgcmV0OworCisJZnMgPSBhZGF1MTk3N19sb29rdXBfZnMocmF0ZSk7CisJaWYgKGZzIDwgMCkKKwkJcmV0dXJuIGZzOworCisJaWYgKGFkYXUxOTc3LT5zeXNjbGtfc3JjID09IEFEQVUxOTc3X1NZU0NMS19TUkNfTUNMSykgeworCQltY3MgPSBhZGF1MTk3N19sb29rdXBfbWNzKGFkYXUxOTc3LCByYXRlLCBmcyk7CisJCWlmIChtY3MgPCAwKQorCQkJcmV0dXJuIG1jczsKKwl9IGVsc2UgeworCQltY3MgPSAwOworCX0KKworCWN0cmwwX21hc2sgPSBBREFVMTk3N19TQUlfQ1RSTDBfRlNfTUFTSzsKKwljdHJsMCA9IGZzOworCisJaWYgKGFkYXUxOTc3LT5yaWdodF9qKSB7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMTZCSVQ7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWN0cmwwX21hc2sgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9NQVNLOworCX0KKworCWlmIChhZGF1MTk3Ny0+bWFzdGVyKSB7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMTZCSVQ7CisJCQlzbG90X3dpZHRoID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJY2FzZSAzMjoKKwkJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX0RBVEFfV0lEVEhfMjRCSVQ7CisJCQlzbG90X3dpZHRoID0gMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogSW4gVERNIG1vZGUgdGhlcmUgaXMgYSBmaXhlZCBzbG90IHdpZHRoICovCisJCWlmIChhZGF1MTk3Ny0+c2xvdF93aWR0aCkKKwkJCXNsb3Rfd2lkdGggPSBhZGF1MTk3Ny0+c2xvdF93aWR0aDsKKworCQlpZiAoc2xvdF93aWR0aCA9PSAxNikKKwkJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9CQ0xLUkFURV8xNjsKKwkJZWxzZQorCQkJY3RybDEgfD0gQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFXzMyOworCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLAorCQkJQURBVTE5NzdfUkVHX1NBSV9DVFJMMSwKKwkJCUFEQVUxOTc3X1NBSV9DVFJMMV9EQVRBX1dJRFRIX01BU0sgfAorCQkJQURBVTE5NzdfU0FJX0NUUkwxX0JDTEtSQVRFX01BU0ssCisJCQljdHJsMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9DVFJMMCwKKwkJCQljdHJsMF9tYXNrLCBjdHJsMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19QTEwsCisJCQkJQURBVTE5NzdfUExMX01DU19NQVNLLCBtY3MpOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3Bvd2VyX2Rpc2FibGUoc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghYWRhdTE5NzctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19QT1dFUiwKKwkJQURBVTE5NzdfUE9XRVJfUFdVUCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlZ2NhY2hlX21hcmtfZGlydHkoYWRhdTE5NzctPnJlZ21hcCk7CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pCisJCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMCk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGFkYXUxOTc3LT5yZWdtYXAsIHRydWUpOworCisJcmVndWxhdG9yX2Rpc2FibGUoYWRhdTE5NzctPmF2ZGRfcmVnKTsKKwlpZiAoYWRhdTE5NzctPmR2ZGRfcmVnKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhZGF1MTk3Ny0+ZHZkZF9yZWcpOworCisJYWRhdTE5NzctPmVuYWJsZWQgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3Bvd2VyX2VuYWJsZShzdHJ1Y3QgYWRhdTE5NzcgKmFkYXUxOTc3KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWRhdTE5NzctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhZGF1MTk3Ny0+YXZkZF9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYWRhdTE5NzctPmR2ZGRfcmVnKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWRhdTE5NzctPmR2ZGRfcmVnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2Rpc2FibGVfYXZkZDsKKwl9CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pCisJCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMSk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGFkYXUxOTc3LT5yZWdtYXAsIGZhbHNlKTsKKworCWlmIChhZGF1MTk3Ny0+c3dpdGNoX21vZGUpCisJCWFkYXUxOTc3LT5zd2l0Y2hfbW9kZShhZGF1MTk3Ny0+ZGV2KTsKKworCXJldCA9IGFkYXUxOTc3X3Jlc2V0KGFkYXUxOTc3KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BPV0VSLAorCQlBREFVMTk3N19QT1dFUl9QV1VQLCBBREFVMTk3N19QT1dFUl9QV1VQKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlyZXQgPSByZWdjYWNoZV9zeW5jKGFkYXUxOTc3LT5yZWdtYXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rpc2FibGVfZHZkZDsKKworCS8qCisJICogVGhlIFBMTCByZWdpc3RlciBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHNvZnR3YXJlIHJlc2V0LiBJdCBpcworCSAqIHBvc3NpYmxlIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciB3YXMgY2hhbmdlZCB0byB0aGUKKwkgKiBkZWZhdWx0IHZhbHVlIHdoaWxlIHdlIHdlcmUgaW4gY2FjaGUgb25seSBtb2RlLiBJbiB0aGlzIGNhc2UKKwkgKiByZWdjYWNoZV9zeW5jIHdpbGwgc2tpcCBvdmVyIGl0IGFuZCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHN5bmMKKwkgKiBpdC4KKwkgKi8KKwlyZXQgPSByZWdtYXBfcmVhZChhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfUExMLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kaXNhYmxlX2R2ZGQ7CisKKwlpZiAodmFsID09IDB4NDEpIHsKKwkJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGFkYXUxOTc3LT5yZWdtYXAsIHRydWUpOworCQlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1BMTCwKKwkJCTB4NDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZGlzYWJsZV9kdmRkOworCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoYWRhdTE5NzctPnJlZ21hcCwgZmFsc2UpOworCX0KKworCWFkYXUxOTc3LT5lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiByZXQ7CisKK2Vycl9kaXNhYmxlX2R2ZGQ6CisJaWYgKGFkYXUxOTc3LT5kdmRkX3JlZykKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWRhdTE5NzctPmR2ZGRfcmVnKTsKK2Vycl9kaXNhYmxlX2F2ZGQ6CisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFkYXUxOTc3LT5hdmRkX3JlZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQorCQkJcmV0ID0gYWRhdTE5NzdfcG93ZXJfZW5hYmxlKGFkYXUxOTc3KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlyZXQgPSBhZGF1MTk3N19wb3dlcl9kaXNhYmxlKGFkYXUxOTc3KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NldF90ZG1fc2xvdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IHR4X21hc2ssCisJdW5zaWduZWQgaW50IHJ4X21hc2ssIGludCBzbG90cywgaW50IHdpZHRoKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXVuc2lnbmVkIGludCBjdHJsMCwgY3RybDEsIGRydjsKKwl1bnNpZ25lZCBpbnQgc2xvdFs0XTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKHNsb3RzID09IDApIHsKKwkJLyogMCA9IE5vIGZpeGVkIHNsb3Qgd2lkdGggKi8KKwkJYWRhdTE5NzctPnNsb3Rfd2lkdGggPSAwOworCQlhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyA9IDE5MjAwMDsKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLAorCQkJQURBVTE5NzdfUkVHX1NBSV9DVFJMMCwgQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9NQVNLLAorCQkJQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9JMlMpOworCX0KKworCWlmIChyeF9tYXNrID09IDAgfHwgdHhfbWFzayAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRydiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzbG90W2ldID0gX19mZnMocnhfbWFzayk7CisJCWRydiB8PSBBREFVMTk3N19TQUlfT1ZFUlRFTVBfRFJWX0MoaSk7CisJCXJ4X21hc2sgJj0gfigxIDw8IHNsb3RbaV0pOworCQlpZiAoc2xvdFtpXSA+PSBzbG90cykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocnhfbWFzayA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHJ4X21hc2sgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSAxNjoKKwkJY3RybDEgPSBBREFVMTk3N19TQUlfQ1RSTDFfU0xPVF9XSURUSF8xNjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJLyogV2UgY2FuIG9ubHkgZ2VuZXJhdGUgMTYgYml0IG9yIDMyIGJpdCB3aWRlIHNsb3RzICovCisJCWlmIChhZGF1MTk3Ny0+bWFzdGVyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMjQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWN0cmwxID0gQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc2xvdHMpIHsKKwljYXNlIDI6CisJCWN0cmwwID0gQURBVTE5NzdfU0FJX0NUUkwwX1NBSV9URE1fMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljdHJsMCA9IEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzQ7CisJCWJyZWFrOworCWNhc2UgODoKKwkJY3RybDAgPSBBREFVMTk3N19TQUlfQ1RSTDBfU0FJX1RETV84OworCQlicmVhazsKKwljYXNlIDE2OgorCQljdHJsMCA9IEFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfVERNXzE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9PVkVSVEVNUCwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDApIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDEpIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDIpIHwKKwkJQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9DKDMpLCBkcnYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX0NNQVAxMiwKKwkJKHNsb3RbMV0gPDwgQURBVTE5NzdfQ0hBTl9NQVBfU0VDT05EX1NMT1RfT0ZGU0VUKSB8CisJCShzbG90WzBdIDw8IEFEQVUxOTc3X0NIQU5fTUFQX0ZJUlNUX1NMT1RfT0ZGU0VUKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ21hcF93cml0ZShhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfQ01BUDM0LAorCQkoc2xvdFszXSA8PCBBREFVMTk3N19DSEFOX01BUF9TRUNPTkRfU0xPVF9PRkZTRVQpIHwKKwkJKHNsb3RbMl0gPDwgQURBVTE5NzdfQ0hBTl9NQVBfRklSU1RfU0xPVF9PRkZTRVQpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDAsCisJCUFEQVUxOTc3X1NBSV9DVFJMMF9TQUlfTUFTSywgY3RybDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX1NBSV9DVFJMMSwKKwkJQURBVTE5NzdfU0FJX0NUUkwxX1NMT1RfV0lEVEhfTUFTSywgY3RybDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZGF1MTk3Ny0+c2xvdF93aWR0aCA9IHdpZHRoOworCisJLyogSW4gbWFzdGVyIG1vZGUgdGhlIG1heGltdW0gYml0Y2xvY2sgaXMgMjQuNTc2IE1IeiAqLworCWFkYXUxOTc3LT5tYXhfbWFzdGVyX2ZzID0gbWluKDE5MjAwMCwgMjQ1NzYwMDAgLyB3aWR0aCAvIHNsb3RzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAobXV0ZSkKKwkJdmFsID0gQURBVTE5NzdfTUlTQ19DT05UUk9MX01NVVRFOworCWVsc2UKKwkJdmFsID0gMDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX01JU0NfQ09OVFJPTCwKKwkJCUFEQVUxOTc3X01JU0NfQ09OVFJPTF9NTVVURSwgdmFsKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3QgYWRhdTE5NzcgKmFkYXUxOTc3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgY3RybDAgPSAwLCBjdHJsMSA9IDAsIGJsb2NrX3Bvd2VyID0gMDsKKwlib29sIGludmVydF9scmNsazsKKwlpbnQgcmV0OworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYWRhdTE5NzctPm1hc3RlciA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVI7CisJCWFkYXUxOTc3LT5tYXN0ZXIgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWJsb2NrX3Bvd2VyIHw9IEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0U7CisJCWludmVydF9scmNsayA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpbnZlcnRfbHJjbGsgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQlibG9ja19wb3dlciB8PSBBREFVMTk3N19CTE9DS19QT1dFUl9TQUlfQkNMS19FREdFOworCQlpbnZlcnRfbHJjbGsgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGF1MTk3Ny0+cmlnaHRfaiA9IGZhbHNlOworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJY3RybDAgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9JMlM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQljdHJsMCB8PSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0xKOworCQlpbnZlcnRfbHJjbGsgPSAhaW52ZXJ0X2xyY2xrOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWN0cmwwIHw9IEFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfUkpfMjRCSVQ7CisJCWFkYXUxOTc3LT5yaWdodF9qID0gdHJ1ZTsKKwkJaW52ZXJ0X2xyY2xrID0gIWludmVydF9scmNsazsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJY3RybDEgfD0gQURBVTE5NzdfU0FJX0NUUkwxX0xSQ0xLX1BVTFNFOworCQljdHJsMCB8PSBBREFVMTk3N19TQUlfQ1RSTDBfRk1UX0kyUzsKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWN0cmwxIHw9IEFEQVUxOTc3X1NBSV9DVFJMMV9MUkNMS19QVUxTRTsKKwkJY3RybDAgfD0gQURBVTE5NzdfU0FJX0NUUkwwX0ZNVF9MSjsKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbnZlcnRfbHJjbGspCisJCWJsb2NrX3Bvd2VyIHw9IEFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9MUl9QT0w7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWRhdTE5NzctPnJlZ21hcCwgQURBVTE5NzdfUkVHX0JMT0NLX1BPV0VSX1NBSSwKKwkJQURBVTE5NzdfQkxPQ0tfUE9XRVJfU0FJX0xSX1BPTCB8CisJCUFEQVUxOTc3X0JMT0NLX1BPV0VSX1NBSV9CQ0xLX0VER0UsIGJsb2NrX3Bvd2VyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDAsCisJCUFEQVUxOTc3X1NBSV9DVFJMMF9GTVRfTUFTSywKKwkJY3RybDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19TQUlfQ1RSTDEsCisJCUFEQVUxOTc3X1NBSV9DVFJMMV9NQVNURVIgfCBBREFVMTk3N19TQUlfQ1RSTDFfTFJDTEtfUFVMU0UsCisJCWN0cmwxKTsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXU2NCBmb3JtYXRzID0gMDsKKworCWlmIChhZGF1MTk3Ny0+c2xvdF93aWR0aCA9PSAxNikKKwkJZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkU7CisJZWxzZSBpZiAoYWRhdTE5NzctPnJpZ2h0X2ogfHwgYWRhdTE5NzctPnNsb3Rfd2lkdGggPT0gMjQpCisJCWZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkU7CisKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmYWRhdTE5NzctPmNvbnN0cmFpbnRzKTsKKworCWlmIChhZGF1MTk3Ny0+bWFzdGVyKQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCA4MDAwLCBhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyk7CisKKwlpZiAoZm9ybWF0cyAhPSAwKQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWFzazY0KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsIGZvcm1hdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE5Nzdfc2V0X3RyaXN0YXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgdHJpc3RhdGUpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICh0cmlzdGF0ZSkKKwkJdmFsID0gQURBVTE5NzdfU0FJX09WRVJURU1QX0RSVl9ISVo7CisJZWxzZQorCQl2YWwgPSAwOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfU0FJX09WRVJURU1QLAorCQlBREFVMTk3N19TQUlfT1ZFUlRFTVBfRFJWX0hJWiwgdmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWRhdTE5NzdfZGFpX29wcyA9IHsKKwkuc3RhcnR1cAk9IGFkYXUxOTc3X3N0YXJ0dXAsCisJLmh3X3BhcmFtcwk9IGFkYXUxOTc3X2h3X3BhcmFtcywKKwkubXV0ZV9zdHJlYW0JPSBhZGF1MTk3N19tdXRlLAorCS5zZXRfZm10CT0gYWRhdTE5Nzdfc2V0X2RhaV9mbXQsCisJLnNldF90ZG1fc2xvdAk9IGFkYXUxOTc3X3NldF90ZG1fc2xvdCwKKwkuc2V0X3RyaXN0YXRlCT0gYWRhdTE5Nzdfc2V0X3RyaXN0YXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWRhdTE5NzdfZGFpID0geworCS5uYW1lID0gImFkYXUxOTc3LWhpZmkiLAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCQkuc2lnX2JpdHMgPSAyNCwKKwl9LAorCS5vcHMgPSAmYWRhdTE5NzdfZGFpX29wcywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTE5NzdfcmF0ZXNbXSA9IHsKKwk4MDAwLCAxNjAwMCwgMzIwMDAsIDY0MDAwLCAxMjgwMDAsCisJMTEwMjUsIDIyMDUwLCA0NDEwMCwgODgyMDAsIDE3MjQwMCwKKwkxMjAwMCwgMjQwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwLAorfTsKKworI2RlZmluZSBBREFVMTk3N19SQVRFX0NPTlNUUkFJTlRfTUFTS18zMjAwMCAweDAwMWYKKyNkZWZpbmUgQURBVTE5NzdfUkFURV9DT05TVFJBSU5UX01BU0tfNDQxMDAgMHgwM2UwCisjZGVmaW5lIEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLXzQ4MDAwIDB4N2MwMAorLyogQWxsIHJhdGVzID49IDMyMDAwICovCisjZGVmaW5lIEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLX0xSQ0xLIDB4NzM5YworCitzdGF0aWMgYm9vbCBhZGF1MTk3N19jaGVja19zeXNjbGsodW5zaWduZWQgaW50IG1jbGssIHVuc2lnbmVkIGludCBiYXNlX2ZyZXEpCit7CisJdW5zaWduZWQgaW50IG1jczsKKworCWlmIChtY2xrICUgKGJhc2VfZnJlcSAqIDEyOCkgIT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJbWNzID0gbWNsayAvICgxMjggKiBiYXNlX2ZyZXEpOworCWlmIChtY3MgPCAxIHx8IG1jcyA+IDYgfHwgbWNzID09IDUpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGFkYXUxOTc3X3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWludCBjbGtfaWQsIGludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGNsa19zcmM7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmIChkaXIgIT0gU05EX1NPQ19DTE9DS19JTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2xrX2lkICE9IEFEQVUxOTc3X1NZU0NMSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgQURBVTE5NzdfU1lTQ0xLX1NSQ19NQ0xLOgorCQljbGtfc3JjID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBREFVMTk3N19TWVNDTEtfU1JDX0xSQ0xLOgorCQljbGtfc3JjID0gQURBVTE5NzdfUExMX0NMS19TOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZnJlcSAhPSAwICYmIHNvdXJjZSA9PSBBREFVMTk3N19TWVNDTEtfU1JDX01DTEspIHsKKwkJaWYgKGZyZXEgPCA0MDAwMDAwIHx8IGZyZXEgPiAzNjg2NDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChhZGF1MTk3N19jaGVja19zeXNjbGsoZnJlcSwgMzIwMDApKQorCQkJbWFzayB8PSBBREFVMTk3N19SQVRFX0NPTlNUUkFJTlRfTUFTS18zMjAwMDsKKwkJaWYgKGFkYXUxOTc3X2NoZWNrX3N5c2NsayhmcmVxLCA0NDEwMCkpCisJCQltYXNrIHw9IEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLXzQ0MTAwOworCQlpZiAoYWRhdTE5NzdfY2hlY2tfc3lzY2xrKGZyZXEsIDQ4MDAwKSkKKwkJCW1hc2sgfD0gQURBVTE5NzdfUkFURV9DT05TVFJBSU5UX01BU0tfNDgwMDA7CisKKwkJaWYgKG1hc2sgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoc291cmNlID09IEFEQVUxOTc3X1NZU0NMS19TUkNfTFJDTEspIHsKKwkJbWFzayA9IEFEQVUxOTc3X1JBVEVfQ09OU1RSQUlOVF9NQVNLX0xSQ0xLOworCX0KKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhZGF1MTk3Ny0+cmVnbWFwLCBBREFVMTk3N19SRUdfUExMLAorCQlBREFVMTk3N19QTExfQ0xLX1MsIGNsa19zcmMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZGF1MTk3Ny0+Y29uc3RyYWludHMubWFzayA9IG1hc2s7CisJYWRhdTE5NzctPnN5c2Nsa19zcmMgPSBzb3VyY2U7CisJYWRhdTE5NzctPnN5c2NsayA9IGZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGF1MTk3N19jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGFkYXUxOTc3LT50eXBlKSB7CisJY2FzZSBBREFVMTk3NzoKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygmY29kZWMtPmRhcG0sCisJCQlhZGF1MTk3N19taWNiaWFzX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoYWRhdTE5NzdfbWljYmlhc19kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBhZGF1MTk3N19jb2RlY19kcml2ZXIgPSB7CisJLnByb2JlID0gYWRhdTE5NzdfY29kZWNfcHJvYmUsCisJLnNldF9iaWFzX2xldmVsID0gYWRhdTE5Nzdfc2V0X2JpYXNfbGV2ZWwsCisJLnNldF9zeXNjbGsgPSBhZGF1MTk3N19zZXRfc3lzY2xrLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKworCS5jb250cm9scyA9IGFkYXUxOTc3X3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF1MTk3N19zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBhZGF1MTk3N19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXUxOTc3X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYWRhdTE5NzdfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfZGFwbV9yb3V0ZXMpLAorfTsKKworc3RhdGljIGludCBhZGF1MTk3N19zZXR1cF9taWNiaWFzKHN0cnVjdCBhZGF1MTk3NyAqYWRhdTE5NzcpCit7CisJc3RydWN0IGFkYXUxOTc3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gYWRhdTE5NzctPmRldi0+cGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWljYmlhczsKKworCWlmIChwZGF0YSkgeworCQltaWNiaWFzID0gcGRhdGEtPm1pY2JpYXM7CisJCWlmIChtaWNiaWFzID4gQURBVTE5NzdfTUlDQklBU185VjApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0gZWxzZSB7CisJCW1pY2JpYXMgPSBBREFVMTk3N19NSUNCSUFTXzhWNTsKKwl9CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19NSUNCSUFTLAorCQlBREFVMTk3N19NSUNCSUFTX01CX1ZPTFRTX01BU0ssCisJCW1pY2JpYXMgPDwgQURBVTE5NzdfTUlDQklBU19NQl9WT0xUU19PRkZTRVQpOworfQorCitpbnQgYWRhdTE5NzdfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJZW51bSBhZGF1MTk3N190eXBlIHR5cGUsIHZvaWQgKCpzd2l0Y2hfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2KSkKK3sKKwl1bnNpZ25lZCBpbnQgcG93ZXJfb2ZmX21hc2s7CisJc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NzsKKwlpbnQgcmV0OworCisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCisJYWRhdTE5NzcgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkYXUxOTc3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXUxOTc3ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhdTE5NzctPmRldiA9IGRldjsKKwlhZGF1MTk3Ny0+dHlwZSA9IHR5cGU7CisJYWRhdTE5NzctPnJlZ21hcCA9IHJlZ21hcDsKKwlhZGF1MTk3Ny0+c3dpdGNoX21vZGUgPSBzd2l0Y2hfbW9kZTsKKwlhZGF1MTk3Ny0+bWF4X21hc3Rlcl9mcyA9IDE5MjAwMDsKKworCWFkYXUxOTc3LT5jb25zdHJhaW50cy5saXN0ID0gYWRhdTE5NzdfcmF0ZXM7CisJYWRhdTE5NzctPmNvbnN0cmFpbnRzLmNvdW50ID0gQVJSQVlfU0laRShhZGF1MTk3N19yYXRlcyk7CisKKwlhZGF1MTk3Ny0+YXZkZF9yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAiQVZERCIpOworCWlmIChJU19FUlIoYWRhdTE5NzctPmF2ZGRfcmVnKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRhdTE5NzctPmF2ZGRfcmVnKTsKKworCWFkYXUxOTc3LT5kdmRkX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJEVkREIik7CisJaWYgKElTX0VSUihhZGF1MTk3Ny0+ZHZkZF9yZWcpKSB7CisJCWlmIChQVFJfRVJSKGFkYXUxOTc3LT5kdmRkX3JlZykgIT0gLUVOT0RFVikKKwkJCXJldHVybiBQVFJfRVJSKGFkYXUxOTc3LT5kdmRkX3JlZyk7CisJCWFkYXUxOTc3LT5kdmRkX3JlZyA9IE5VTEw7CisJfQorCisJYWRhdTE5NzctPnJlc2V0X2dwaW8gPSBkZXZtX2dwaW9kX2dldChkZXYsICJyZXNldCIpOworCWlmIChJU19FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pKSB7CisJCXJldCA9IFBUUl9FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pOworCQlpZiAocmV0ICE9IC1FTk9FTlQgJiYgcmV0ICE9IC1FTk9TWVMpCisJCQlyZXR1cm4gUFRSX0VSUihhZGF1MTk3Ny0+cmVzZXRfZ3Bpbyk7CisJCWFkYXUxOTc3LT5yZXNldF9ncGlvID0gTlVMTDsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZGF1MTk3Nyk7CisKKwlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pIHsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQluZGVsYXkoMTAwKTsKKwl9CisKKwlyZXQgPSBhZGF1MTk3N19wb3dlcl9lbmFibGUoYWRhdTE5NzcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodHlwZSA9PSBBREFVMTk3NykgeworCQlyZXQgPSBhZGF1MTk3N19zZXR1cF9taWNiaWFzKGFkYXUxOTc3KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3Bvd2Vyb2ZmOworCX0KKworCWlmIChhZGF1MTk3Ny0+ZHZkZF9yZWcpCisJCXBvd2VyX29mZl9tYXNrID0gfjA7CisJZWxzZQorCQlwb3dlcl9vZmZfbWFzayA9IH5BREFVMTk3N19CTE9DS19QT1dFUl9TQUlfTERPX0VOOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFkYXUxOTc3LT5yZWdtYXAsIEFEQVUxOTc3X1JFR19CTE9DS19QT1dFUl9TQUksCisJCQkJcG93ZXJfb2ZmX21hc2ssIDB4MDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2Vyb2ZmOworCisJcmV0ID0gYWRhdTE5NzdfcG93ZXJfZGlzYWJsZShhZGF1MTk3Nyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXUxOTc3X2NvZGVjX2RyaXZlciwKKwkJCSZhZGF1MTk3N19kYWksIDEpOworCitlcnJfcG93ZXJvZmY6CisJYWRhdTE5NzdfcG93ZXJfZGlzYWJsZShhZGF1MTk3Nyk7CisJcmV0dXJuIHJldDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRhdTE5NzdfcHJvYmUpOworCitzdGF0aWMgYm9vbCBhZGF1MTk3N19yZWdpc3Rlcl92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFEQVUxOTc3X1JFR19TVEFUVVMoMCk6CisJY2FzZSBBREFVMTk3N19SRUdfU1RBVFVTKDEpOgorCWNhc2UgQURBVTE5NzdfUkVHX1NUQVRVUygyKToKKwljYXNlIEFEQVUxOTc3X1JFR19TVEFUVVMoMyk6CisJY2FzZSBBREFVMTk3N19SRUdfQURDX0NMSVA6CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWRhdTE5NzdfcmVnbWFwX2NvbmZpZyA9IHsKKwkubWF4X3JlZ2lzdGVyID0gQURBVTE5NzdfUkVHX0RDX0hQRl9DQUwsCisJLnZvbGF0aWxlX3JlZyA9IGFkYXUxOTc3X3JlZ2lzdGVyX3ZvbGF0aWxlLAorCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IGFkYXUxOTc3X3JlZ19kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfcmVnX2RlZmF1bHRzKSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhZGF1MTk3N19yZWdtYXBfY29uZmlnKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVUxOTc3L0FEQVUxOTc4L0FEQVUxOTc5IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmggYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNzE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQURBVTE5NzcvQURBVTE5NzgvQURBVTE5NzkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICogIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpZm5kZWYgX19TT1VORF9TT0NfQ09ERUNTX0FEQVUxOTc3X0hfXworI2RlZmluZSBfX1NPVU5EX1NPQ19DT0RFQ1NfQURBVTE5NzdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworc3RydWN0IGRldmljZTsKKworZW51bSBhZGF1MTk3N190eXBlIHsKKwlBREFVMTk3NywKKwlBREFVMTk3OCwKKwlBREFVMTk3OSwKK307CisKK2ludCBhZGF1MTk3N19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwllbnVtIGFkYXUxOTc3X3R5cGUgdHlwZSwgdm9pZCAoKnN3aXRjaF9tb2RlKShzdHJ1Y3QgZGV2aWNlICpkZXYpKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXUxOTc3X3JlZ21hcF9jb25maWc7CisKK2VudW0gYWRhdTE5NzdfY2xrX2lkIHsKKwlBREFVMTk3N19TWVNDTEssCit9OworCitlbnVtIGFkYXUxOTc3X3N5c2Nsa19zcmMgeworCUFEQVUxOTc3X1NZU0NMS19TUkNfTUNMSywKKwlBREFVMTk3N19TWVNDTEtfU1JDX0xSQ0xLLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGZjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MDEuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQURBVjgwMSBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImFkYXY4MHguaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYXY4MHhfc3BpX2lkW10gPSB7CisJeyAiYWRhdjgwMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRhdjgweF9zcGlfaWQpOworCitzdGF0aWMgaW50IGFkYXY4MHhfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOworCisJY29uZmlnID0gYWRhdjgweF9yZWdtYXBfY29uZmlnOworCWNvbmZpZy5yZWFkX2ZsYWdfbWFzayA9IDB4MDE7CisKKwlyZXR1cm4gYWRhdjgweF9idXNfcHJvYmUoJnNwaS0+ZGV2LCBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZjb25maWcpKTsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkYXY4MHhfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZGF2ODAxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWRhdjgweF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBhZGF2ODB4X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gYWRhdjgweF9zcGlfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIoYWRhdjgweF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVY4MDEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIllpIExpIDx5aS5saUBhbmFsb2cuY29tPj4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMy5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF2ODAzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkOWZjZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgwMy5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBBREFWODAzIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJhZGF2ODB4LmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGF2ODAzX2lkW10gPSB7CisJeyAiYWRhdjgwMyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRhdjgwM19pZCk7CisKK3N0YXRpYyBpbnQgYWRhdjgwM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGFkYXY4MHhfYnVzX3Byb2JlKCZjbGllbnQtPmRldiwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWRhdjgweF9yZWdtYXBfY29uZmlnKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRhdjgwM19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkYXY4MDNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYXY4MDMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkYXY4MDNfcHJvYmUsCisJLnJlbW92ZSA9IGFkYXY4MDNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYXY4MDNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIoYWRhdjgwM19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgQURBVjgwMyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0FVVEhPUigiWWkgTGkgPHlpLmxpQGFuYWxvZy5jb20+PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwppbmRleCBmNzhiMjdhLi41MDYyZTM0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpAQCAtOCwxNyArOCwxNSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKICNpbmNsdWRlICJhZGF2ODB4LmgiCiAKQEAgLTU0MSw2ICs1MzksNyBAQAogCQkJICAgICAgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAlpZiAoZGlyID09IFNORF9TT0NfQ0xPQ0tfSU4pIHsKIAkJc3dpdGNoIChjbGtfaWQpIHsKQEAgLTU3Myw3ICs1NzIsNyBAQAogCQkJcmVnbWFwX3dyaXRlKGFkYXY4MHgtPnJlZ21hcCwgQURBVjgwWF9JQ0xLX0NUUkwyLAogCQkJCWljbGtfY3RybDIpOwogCi0JCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJCX0KIAl9IGVsc2UgewogCQl1bnNpZ25lZCBpbnQgbWFzazsKQEAgLTYwMCwxNyArNTk5LDIxIEBACiAJCQlhZGF2ODB4LT5zeXNjbGtfcGRbY2xrX2lkXSA9IGZhbHNlOwogCQl9CiAKKwkJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKIAkJaWYgKGFkYXY4MHgtPnN5c2Nsa19wZFswXSkKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwxIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDEiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMSIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDEiKTsKIAogCQlpZiAoYWRhdjgweC0+c3lzY2xrX3BkWzFdIHx8IGFkYXY4MHgtPnN5c2Nsa19wZFsyXSkKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDIiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMiIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlBMTDIiKTsKIAotCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCX0KIAogCXJldHVybiAwOwpAQCAtNzIyLDcgKzcyNSw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JaWYgKCFjb2RlYy0+YWN0aXZlIHx8ICFhZGF2ODB4LT5yYXRlKQorCWlmICghc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpIHx8ICFhZGF2ODB4LT5yYXRlKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKQEAgLTczNSw3ICs3MzgsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAotCWlmICghY29kZWMtPmFjdGl2ZSkKKwlpZiAoIXNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkKIAkJYWRhdjgweC0+cmF0ZSA9IDA7CiB9CiAKQEAgLTc5OCwxNSArODAxLDggQEAKIAogc3RhdGljIGludCBhZGF2ODB4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMCwgMCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEZvcmNlIFBMTHMgb24gZm9yIFNZU0NMSyBvdXRwdXQgKi8KIAlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJQTEwxIik7CiAJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMiIpOwpAQCAtODY0LDM5ICs4NjAsMjYgQEAKIAkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF2ODB4X2RhcG1fcm91dGVzKSwKIH07CiAKLXN0YXRpYyBpbnQgYWRhdjgweF9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCitpbnQgYWRhdjgweF9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHg7Ci0JaW50IHJldDsKIAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKIAotCWFkYXY4MHggPSBremFsbG9jKHNpemVvZigqYWRhdjgweCksIEdGUF9LRVJORUwpOworCWFkYXY4MHggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkYXY4MHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXY4MHgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0KIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZGF2ODB4KTsKIAlhZGF2ODB4LT5yZWdtYXAgPSByZWdtYXA7CiAKLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXY4MHhfY29kZWNfZHJpdmVyLAorCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmFkYXY4MHhfY29kZWNfZHJpdmVyLAogCQlhZGF2ODB4X2RhaXMsIEFSUkFZX1NJWkUoYWRhdjgweF9kYWlzKSk7Ci0JaWYgKHJldCkKLQkJa2ZyZWUoYWRhdjgweCk7Ci0KLQlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRhdjgweF9idXNfcHJvYmUpOwogCi1zdGF0aWMgaW50IGFkYXY4MHhfYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKGRldik7Ci0Ja2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCXJldHVybiAwOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhZGF2ODB4X3NwaV9yZWdtYXBfY29uZmlnID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWRhdjgweF9yZWdtYXBfY29uZmlnID0gewogCS52YWxfYml0cyA9IDgsCiAJLnBhZF9iaXRzID0gMSwKIAkucmVnX2JpdHMgPSA3LApAQCAtOTA4LDEwNSArODkxLDcgQEAKIAkucmVnX2RlZmF1bHRzID0gYWRhdjgweF9yZWdfZGVmYXVsdHMsCiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKGFkYXY4MHhfcmVnX2RlZmF1bHRzKSwKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZGF2ODB4X3NwaV9pZFtdID0gewotCXsgImFkYXY4MDEiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkYXY4MHhfc3BpX2lkKTsKLQotc3RhdGljIGludCBhZGF2ODB4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXJldHVybiBhZGF2ODB4X2J1c19wcm9iZSgmc3BpLT5kZXYsCi0JCWRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmFkYXY4MHhfc3BpX3JlZ21hcF9jb25maWcpKTsKLX0KLQotc3RhdGljIGludCBhZGF2ODB4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlyZXR1cm4gYWRhdjgweF9idXNfcmVtb3ZlKCZzcGktPmRldik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGF2ODB4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiYWRhdjgwMSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlCQk9IGFkYXY4MHhfc3BpX3Byb2JlLAotCS5yZW1vdmUJCT0gYWRhdjgweF9zcGlfcmVtb3ZlLAotCS5pZF90YWJsZQk9IGFkYXY4MHhfc3BpX2lkLAotfTsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXY4MHhfaTJjX3JlZ21hcF9jb25maWcgPSB7Ci0JLnZhbF9iaXRzID0gOCwKLQkucGFkX2JpdHMgPSAxLAotCS5yZWdfYml0cyA9IDcsCi0KLQkubWF4X3JlZ2lzdGVyID0gQURBVjgwWF9QTExfT1VURSwKLQotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAotCS5yZWdfZGVmYXVsdHMgPSBhZGF2ODB4X3JlZ19kZWZhdWx0cywKLQkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWRhdjgweF9yZWdfZGVmYXVsdHMpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkYXY4MHhfaTJjX2lkW10gPSB7Ci0JeyAiYWRhdjgwMyIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRhdjgweF9pMmNfaWQpOwotCi1zdGF0aWMgaW50IGFkYXY4MHhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlyZXR1cm4gYWRhdjgweF9idXNfcHJvYmUoJmNsaWVudC0+ZGV2LAotCQlkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZhZGF2ODB4X2kyY19yZWdtYXBfY29uZmlnKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWRhdjgweF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIGFkYXY4MHhfYnVzX3JlbW92ZSgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdjgweF9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkYXY4MDMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IGFkYXY4MHhfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBhZGF2ODB4X2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlID0gYWRhdjgweF9pMmNfaWQsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGFkYXY4MHhfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9IGkyY19hZGRfZHJpdmVyKCZhZGF2ODB4X2kyY19kcml2ZXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKLSNlbmRpZgotCi0JcmV0dXJuIHJldDsKLX0KLW1vZHVsZV9pbml0KGFkYXY4MHhfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhZGF2ODB4X2V4aXQodm9pZCkKLXsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0JaTJjX2RlbF9kcml2ZXIoJmFkYXY4MHhfaTJjX2RyaXZlcik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoYWRhdjgweF9leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGFkYXY4MHhfcmVnbWFwX2NvbmZpZyk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBBREFWODB4IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCmluZGV4IGFkYjBmYzcuLjhhMWQ3YzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCkBAIC05LDYgKzksMTMgQEAKICNpZm5kZWYgX0FEQVY4MFhfSAogI2RlZmluZSBfQURBVjgwWF9ICiAKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworc3RydWN0IGRldmljZTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkYXY4MHhfcmVnbWFwX2NvbmZpZzsKK2ludCBhZGF2ODB4X2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCk7CisKIGVudW0gYWRhdjgweF9wbGxfc3JjIHsKIAlBREFWODBYX1BMTF9TUkNfWElOLAogCUFEQVY4MFhfUExMX1NSQ19YVEFMLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKaW5kZXggYjQ4MTlkYy4uMTBhZGYyNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCkBAIC0xNzQsOCArMTc0LDYgQEAKIAlzdHJ1Y3QgYWs0MTA0X3ByaXZhdGUgKmFrNDEwNCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWs0MTA0LT5yZWdtYXA7Ci0KIAkvKiBzZXQgcG93ZXItdXAgYW5kIG5vbi1yZXNldCBiaXRzICovCiAJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFrNDEwNC0+cmVnbWFwLCBBSzQxMDRfUkVHX0NPTlRST0wxLAogCQkJCSBBSzQxMDRfQ09OVFJPTDFfUFcgfCBBSzQxMDRfQ09OVFJPTDFfUlNUTiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCmluZGV4IDY4NGZlOTEuLjMwZTI5NzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwpAQCAtMzg4LDE1ICszODgsNiBAQAogCiBzdGF0aWMgaW50IGFrNDUzNV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGFrNDUzNV9wcml2ICphazQ1MzUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFrNDUzNS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlhazQ1MzVfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKaW5kZXggOTRjYmU1MC4uODY4YzBlMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCkBAIC0xMTMsMTQgKzExMywxNCBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGF1eF9pbl90bHYsIC0yMTAwLCAzMDAsIDApOwogCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21vbm9fb3V0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSzQ2NDFfU0lHMSwgNiwgMiwgYWs0NjQxX21vbm9fb3V0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX2hwX291dF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUs0NjQxX01PREUyLCAyLCAyLCBhazQ2NDFfaHBfb3V0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21pY19zZWxlY3RfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFLNDY0MV9NSUMsIDEsIDIsIGFrNDY0MV9taWNfc2VsZWN0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWs0NjQxX21pY19vcl9kYWNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFLNDY0MV9CVElGLCA0LCAyLCBhazQ2NDFfbWljX29yX2RhYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21vbm9fb3V0X2VudW0sCisJCQkgICAgQUs0NjQxX1NJRzEsIDYsIGFrNDY0MV9tb25vX291dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX2hwX291dF9lbnVtLAorCQkJICAgIEFLNDY0MV9NT0RFMiwgMiwgYWs0NjQxX2hwX291dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21pY19zZWxlY3RfZW51bSwKKwkJCSAgICBBSzQ2NDFfTUlDLCAxLCBhazQ2NDFfbWljX3NlbGVjdCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjQxX21pY19vcl9kYWNfZW51bSwKKwkJCSAgICBBSzQ2NDFfQlRJRiwgNCwgYWs0NjQxX21pY19vcl9kYWMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWs0NjQxX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJNb25vIDEgT3V0cHV0IiwgYWs0NjQxX21vbm9fb3V0X2VudW0pLApAQCAtNTE5LDE0ICs1MTksNiBAQAogCiBzdGF0aWMgaW50IGFrNDY0MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlhazQ2NDFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKaW5kZXggMWY2NDZjNi4uOTI2NTVjYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCkBAIC00NjUsMTQgKzQ2NSw2IEBACiAKIHN0YXRpYyBpbnQgYWs0NjQyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJYWs0NjQyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCmluZGV4IDI1YmRmNmEuLjk5OGZhMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0yMywxMDQgKzI0LDk5IEBACiAjaW5jbHVkZSAiYWs0NjcxLmgiCiAKIAotLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCi1zdHJ1Y3QgYWs0NjcxX3ByaXYgewotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotfTsKLQogLyogYWs0NjcxIHJlZ2lzdGVyIGNhY2hlICYgZGVmYXVsdCByZWdpc3RlciBzZXR0aW5ncyAqLwotc3RhdGljIGNvbnN0IHU4IGFrNDY3MV9yZWdbQUs0NjcxX0NBQ0hFUkVHTlVNXSA9IHsKLQkweDAwLAkvKiBBSzQ2NzFfQURfREFfUE9XRVJfTUFOQUdFTUVOVAkoMHgwMCkJKi8KLQkweGY2LAkvKiBBSzQ2NzFfUExMX01PREVfU0VMRUNUMAkJKDB4MDEpCSovCi0JMHgwMCwJLyogQUs0NjcxX1BMTF9NT0RFX1NFTEVDVDEJCSgweDAyKQkqLwotCTB4MDIsCS8qIEFLNDY3MV9GT1JNQVRfU0VMRUNUCQkJKDB4MDMpCSovCi0JMHgwMCwJLyogQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNUCQkoMHgwNCkJKi8KLQkweDU1LAkvKiBBSzQ2NzFfTUlDX0FNUF9HQUlOCQkJKDB4MDUpCSovCi0JMHgwMCwJLyogQUs0NjcxX01JWElOR19QT1dFUl9NQU5BR0VNRU5UMAkoMHgwNikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQxCSgweDA3KQkqLwotCTB4YjUsCS8qIEFLNDY3MV9PVVRQVVRfVk9MVU1FX0NPTlRST0wJCSgweDA4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9MT1VUMV9TSUdOQUxfU0VMRUNUCQkoMHgwOSkJKi8KLQkweDAwLAkvKiBBSzQ2NzFfUk9VVDFfU0lHTkFMX1NFTEVDVAkJKDB4MGEpCSovCi0JMHgwMCwJLyogQUs0NjcxX0xPVVQyX1NJR05BTF9TRUxFQ1QJCSgweDBiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ST1VUMl9TSUdOQUxfU0VMRUNUCQkoMHgwYykJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTE9VVDNfU0lHTkFMX1NFTEVDVAkJKDB4MGQpCSovCi0JMHgwMCwJLyogQUs0NjcxX1JPVVQzX1NJR05BTF9TRUxFQ1QJCSgweDBlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9MT1VUMV9QT1dFUl9NQU5BR0VSTUVOVAkoMHgwZikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfTE9VVDJfUE9XRVJfTUFOQUdFUk1FTlQJKDB4MTApCSovCi0JMHg4MCwJLyogQUs0NjcxX0xPVVQzX1BPV0VSX01BTkFHRVJNRU5UCSgweDExKQkqLwotCTB4OTEsCS8qIEFLNDY3MV9MQ0hfSU5QVVRfVk9MVU1FX0NPTlRST0wJKDB4MTIpCSovCi0JMHg5MSwJLyogQUs0NjcxX1JDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMykJKi8KLQkweGUxLAkvKiBBSzQ2NzFfQUxDX1JFRkVSRU5DRV9TRUxFQ1QJCSgweDE0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ESUdJVEFMX01JWElOR19DT05UUk9MCSgweDE1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9BTENfVElNRVJfU0VMRUNUCQkoMHgxNikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfQUxDX01PREVfQ09OVFJPTAkJKDB4MTcpCSovCi0JMHgwMiwJLyogQUs0NjcxX01PREVfQ09OVFJPTDEJCQkoMHgxOCkJKi8KLQkweDAxLAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMgkJCSgweDE5KQkqLwotCTB4MTgsCS8qIEFLNDY3MV9MQ0hfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCSgweDFhKQkqLwotCTB4MTgsCS8qIEFLNDY3MV9SQ0hfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCSgweDFiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9TSURFVE9ORV9BX0NPTlRST0wJCSgweDFjKQkqLwotCTB4MDIsCS8qIEFLNDY3MV9ESUdJVEFMX0ZJTFRFUl9TRUxFQ1QJCSgweDFkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwzX0NPRUZGSUNJRU5UMAkJKDB4MWUpCSovCi0JMHgwMCwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQxCQkoMHgxZikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMM19DT0VGRklDSUVOVDIJCSgweDIwKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwzX0NPRUZGSUNJRU5UMwkJKDB4MjEpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMAkJKDB4MjIpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMQkJKDB4MjMpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMgkJKDB4MjQpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMwkJKDB4MjUpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UNAkJKDB4MjYpCSovCi0JMHgwMCwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UNQkJKDB4MjcpCSovCi0JMHhhOSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQwCQkoMHgyOCkJKi8KLQkweDFmLAkvKiBBSzQ2NzFfRklMMV9DT0VGRklDSUVOVDEJCSgweDI5KQkqLwotCTB4YWQsCS8qIEFLNDY3MV9GSUwxX0NPRUZGSUNJRU5UMgkJKDB4MmEpCSovCi0JMHgyMCwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQzCQkoMHgyYikJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMMl9DT0VGRklDSUVOVDAJCSgweDJjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9GSUwyX0NPRUZGSUNJRU5UMQkJKDB4MmQpCSovCi0JMHgwMCwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQyCQkoMHgyZSkJKi8KLQkweDAwLAkvKiBBSzQ2NzFfRklMMl9DT0VGRklDSUVOVDMJCSgweDJmKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9ESUdJVEFMX0ZJTFRFUl9TRUxFQ1QyCSgweDMwKQkqLwotCTB4MDAsCS8qIHRoaXMgcmVnaXN0ZXIgbm90IHVzZWQJCQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDAJCSgweDMyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDEJCSgweDMzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDIJCSgweDM0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDMJCSgweDM1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDQJCSgweDM2KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDUJCSgweDM3KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDAJCSgweDM4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDEJCSgweDM5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDIJCSgweDNhKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDMJCSgweDNiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDQJCSgweDNjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDUJCSgweDNkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDAJCSgweDNlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDEJCSgweDNmKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDIJCSgweDQwKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDMJCSgweDQxKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDQJCSgweDQyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDUJCSgweDQzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDAJCSgweDQ0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDEJCSgweDQ1KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDIJCSgweDQ2KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDMJCSgweDQ3KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDQJCSgweDQ4KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDUJCSgweDQ5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDAJCSgweDRhKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDEJCSgweDRiKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDIJCSgweDRjKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDMJCSgweDRkKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDQJCSgweDRlKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDUJCSgweDRmKQkqLwotCTB4ODgsCS8qIEFLNDY3MV9FUV9DT05UUk9MXzI1MEhaXzEwMEhaCSgweDUwKQkqLwotCTB4ODgsCS8qIEFLNDY3MV9FUV9DT05UUk9MXzM1MDBIWl8xS0haCSgweDUxKQkqLwotCTB4MDgsCS8qIEFLNDY3MV9FUV9DT05UUk9fMTBLSFoJCSgweDUyKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDAJCSgweDUzKQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDEJCSgweDU0KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDIJCSgweDU1KQkqLwotCTB4MTgsCS8qIEFLNDY3MV9ESUdJVEFMX1ZPTFVNRV9CX0NPTlRST0wJKDB4NTYpCSovCi0JMHgxOCwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0NfQ09OVFJPTAkoMHg1NykJKi8KLQkweDAwLAkvKiBBSzQ2NzFfU0lERVRPTkVfVk9MVU1FX0NPTlRST0wJKDB4NTgpCSovCi0JMHgwMCwJLyogQUs0NjcxX0RJR0lUQUxfTUlYSU5HX0NPTlRST0wyCSgweDU5KQkqLwotCTB4MDAsCS8qIEFLNDY3MV9TQVJfQURDX0NPTlRST0wJCSgweDVhKQkqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBhazQ2NzFfcmVnX2RlZmF1bHRzW10gPSB7CisJeyAweDAwLCAweDAwIH0sCS8qIEFLNDY3MV9BRF9EQV9QT1dFUl9NQU5BR0VNRU5UCSgweDAwKQkqLworCXsgMHgwMSwgMHhmNiB9LAkvKiBBSzQ2NzFfUExMX01PREVfU0VMRUNUMAkJKDB4MDEpCSovCisJeyAweDAyLCAweDAwIH0sCS8qIEFLNDY3MV9QTExfTU9ERV9TRUxFQ1QxCQkoMHgwMikJKi8KKwl7IDB4MDMsIDB4MDIgfSwJLyogQUs0NjcxX0ZPUk1BVF9TRUxFQ1QJCQkoMHgwMykJKi8KKwl7IDB4MDQsIDB4MDAgfSwJLyogQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNUCQkoMHgwNCkJKi8KKwl7IDB4MDUsIDB4NTUgfSwJLyogQUs0NjcxX01JQ19BTVBfR0FJTgkJCSgweDA1KQkqLworCXsgMHgwNiwgMHgwMCB9LAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQwCSgweDA2KQkqLworCXsgMHgwNywgMHgwMCB9LAkvKiBBSzQ2NzFfTUlYSU5HX1BPV0VSX01BTkFHRU1FTlQxCSgweDA3KQkqLworCXsgMHgwOCwgMHhiNSB9LAkvKiBBSzQ2NzFfT1VUUFVUX1ZPTFVNRV9DT05UUk9MCQkoMHgwOCkJKi8KKwl7IDB4MDksIDB4MDAgfSwJLyogQUs0NjcxX0xPVVQxX1NJR05BTF9TRUxFQ1QJCSgweDA5KQkqLworCXsgMHgwYSwgMHgwMCB9LAkvKiBBSzQ2NzFfUk9VVDFfU0lHTkFMX1NFTEVDVAkJKDB4MGEpCSovCisJeyAweDBiLCAweDAwIH0sCS8qIEFLNDY3MV9MT1VUMl9TSUdOQUxfU0VMRUNUCQkoMHgwYikJKi8KKwl7IDB4MGMsIDB4MDAgfSwJLyogQUs0NjcxX1JPVVQyX1NJR05BTF9TRUxFQ1QJCSgweDBjKQkqLworCXsgMHgwZCwgMHgwMCB9LAkvKiBBSzQ2NzFfTE9VVDNfU0lHTkFMX1NFTEVDVAkJKDB4MGQpCSovCisJeyAweDBlLCAweDAwIH0sCS8qIEFLNDY3MV9ST1VUM19TSUdOQUxfU0VMRUNUCQkoMHgwZSkJKi8KKwl7IDB4MGYsIDB4MDAgfSwJLyogQUs0NjcxX0xPVVQxX1BPV0VSX01BTkFHRVJNRU5UCSgweDBmKQkqLworCXsgMHgxMCwgMHgwMCB9LAkvKiBBSzQ2NzFfTE9VVDJfUE9XRVJfTUFOQUdFUk1FTlQJKDB4MTApCSovCisJeyAweDExLCAweDgwIH0sCS8qIEFLNDY3MV9MT1VUM19QT1dFUl9NQU5BR0VSTUVOVAkoMHgxMSkJKi8KKwl7IDB4MTIsIDB4OTEgfSwJLyogQUs0NjcxX0xDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMikJKi8KKwl7IDB4MTMsIDB4OTEgfSwJLyogQUs0NjcxX1JDSF9JTlBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxMykJKi8KKwl7IDB4MTQsIDB4ZTEgfSwJLyogQUs0NjcxX0FMQ19SRUZFUkVOQ0VfU0VMRUNUCQkoMHgxNCkJKi8KKwl7IDB4MTUsIDB4MDAgfSwJLyogQUs0NjcxX0RJR0lUQUxfTUlYSU5HX0NPTlRST0wJKDB4MTUpCSovCisJeyAweDE2LCAweDAwIH0sCS8qIEFLNDY3MV9BTENfVElNRVJfU0VMRUNUCQkoMHgxNikJKi8KKwl7IDB4MTcsIDB4MDAgfSwJLyogQUs0NjcxX0FMQ19NT0RFX0NPTlRST0wJCSgweDE3KQkqLworCXsgMHgxOCwgMHgwMiB9LAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMQkJCSgweDE4KQkqLworCXsgMHgxOSwgMHgwMSB9LAkvKiBBSzQ2NzFfTU9ERV9DT05UUk9MMgkJCSgweDE5KQkqLworCXsgMHgxYSwgMHgxOCB9LAkvKiBBSzQ2NzFfTENIX09VVFBVVF9WT0xVTUVfQ09OVFJPTAkoMHgxYSkJKi8KKwl7IDB4MWIsIDB4MTggfSwJLyogQUs0NjcxX1JDSF9PVVRQVVRfVk9MVU1FX0NPTlRST0wJKDB4MWIpCSovCisJeyAweDFjLCAweDAwIH0sCS8qIEFLNDY3MV9TSURFVE9ORV9BX0NPTlRST0wJCSgweDFjKQkqLworCXsgMHgxZCwgMHgwMiB9LAkvKiBBSzQ2NzFfRElHSVRBTF9GSUxURVJfU0VMRUNUCQkoMHgxZCkJKi8KKwl7IDB4MWUsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQwCQkoMHgxZSkJKi8KKwl7IDB4MWYsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQxCQkoMHgxZikJKi8KKwl7IDB4MjAsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQyCQkoMHgyMCkJKi8KKwl7IDB4MjEsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDNfQ09FRkZJQ0lFTlQzCQkoMHgyMSkJKi8KKwl7IDB4MjIsIDB4MDAgfSwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMAkJKDB4MjIpCSovCisJeyAweDIzLCAweDAwIH0sCS8qIEFLNDY3MV9FUV9DT0VGRklDSUVOVDEJCSgweDIzKQkqLworCXsgMHgyNCwgMHgwMCB9LAkvKiBBSzQ2NzFfRVFfQ09FRkZJQ0lFTlQyCQkoMHgyNCkJKi8KKwl7IDB4MjUsIDB4MDAgfSwJLyogQUs0NjcxX0VRX0NPRUZGSUNJRU5UMwkJKDB4MjUpCSovCisJeyAweDI2LCAweDAwIH0sCS8qIEFLNDY3MV9FUV9DT0VGRklDSUVOVDQJCSgweDI2KQkqLworCXsgMHgyNywgMHgwMCB9LAkvKiBBSzQ2NzFfRVFfQ09FRkZJQ0lFTlQ1CQkoMHgyNykJKi8KKwl7IDB4MjgsIDB4YTkgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQwCQkoMHgyOCkJKi8KKwl7IDB4MjksIDB4MWYgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQxCQkoMHgyOSkJKi8KKwl7IDB4MmEsIDB4YWQgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQyCQkoMHgyYSkJKi8KKwl7IDB4MmIsIDB4MjAgfSwJLyogQUs0NjcxX0ZJTDFfQ09FRkZJQ0lFTlQzCQkoMHgyYikJKi8KKwl7IDB4MmMsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQwCQkoMHgyYykJKi8KKwl7IDB4MmQsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQxCQkoMHgyZCkJKi8KKwl7IDB4MmUsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQyCQkoMHgyZSkJKi8KKwl7IDB4MmYsIDB4MDAgfSwJLyogQUs0NjcxX0ZJTDJfQ09FRkZJQ0lFTlQzCQkoMHgyZikJKi8KKwl7IDB4MzAsIDB4MDAgfSwJLyogQUs0NjcxX0RJR0lUQUxfRklMVEVSX1NFTEVDVDIJKDB4MzApCSovCisKKwl7IDB4MzIsIDB4MDAgfSwJLyogQUs0NjcxX0UxX0NPRUZGSUNJRU5UMAkJKDB4MzIpCSovCisJeyAweDMzLCAweDAwIH0sCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDEJCSgweDMzKQkqLworCXsgMHgzNCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTFfQ09FRkZJQ0lFTlQyCQkoMHgzNCkJKi8KKwl7IDB4MzUsIDB4MDAgfSwJLyogQUs0NjcxX0UxX0NPRUZGSUNJRU5UMwkJKDB4MzUpCSovCisJeyAweDM2LCAweDAwIH0sCS8qIEFLNDY3MV9FMV9DT0VGRklDSUVOVDQJCSgweDM2KQkqLworCXsgMHgzNywgMHgwMCB9LAkvKiBBSzQ2NzFfRTFfQ09FRkZJQ0lFTlQ1CQkoMHgzNykJKi8KKwl7IDB4MzgsIDB4MDAgfSwJLyogQUs0NjcxX0UyX0NPRUZGSUNJRU5UMAkJKDB4MzgpCSovCisJeyAweDM5LCAweDAwIH0sCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDEJCSgweDM5KQkqLworCXsgMHgzYSwgMHgwMCB9LAkvKiBBSzQ2NzFfRTJfQ09FRkZJQ0lFTlQyCQkoMHgzYSkJKi8KKwl7IDB4M2IsIDB4MDAgfSwJLyogQUs0NjcxX0UyX0NPRUZGSUNJRU5UMwkJKDB4M2IpCSovCisJeyAweDNjLCAweDAwIH0sCS8qIEFLNDY3MV9FMl9DT0VGRklDSUVOVDQJCSgweDNjKQkqLworCXsgMHgzZCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTJfQ09FRkZJQ0lFTlQ1CQkoMHgzZCkJKi8KKwl7IDB4M2UsIDB4MDAgfSwJLyogQUs0NjcxX0UzX0NPRUZGSUNJRU5UMAkJKDB4M2UpCSovCisJeyAweDNmLCAweDAwIH0sCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDEJCSgweDNmKQkqLworCXsgMHg0MCwgMHgwMCB9LAkvKiBBSzQ2NzFfRTNfQ09FRkZJQ0lFTlQyCQkoMHg0MCkJKi8KKwl7IDB4NDEsIDB4MDAgfSwJLyogQUs0NjcxX0UzX0NPRUZGSUNJRU5UMwkJKDB4NDEpCSovCisJeyAweDQyLCAweDAwIH0sCS8qIEFLNDY3MV9FM19DT0VGRklDSUVOVDQJCSgweDQyKQkqLworCXsgMHg0MywgMHgwMCB9LAkvKiBBSzQ2NzFfRTNfQ09FRkZJQ0lFTlQ1CQkoMHg0MykJKi8KKwl7IDB4NDQsIDB4MDAgfSwJLyogQUs0NjcxX0U0X0NPRUZGSUNJRU5UMAkJKDB4NDQpCSovCisJeyAweDQ1LCAweDAwIH0sCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDEJCSgweDQ1KQkqLworCXsgMHg0NiwgMHgwMCB9LAkvKiBBSzQ2NzFfRTRfQ09FRkZJQ0lFTlQyCQkoMHg0NikJKi8KKwl7IDB4NDcsIDB4MDAgfSwJLyogQUs0NjcxX0U0X0NPRUZGSUNJRU5UMwkJKDB4NDcpCSovCisJeyAweDQ4LCAweDAwIH0sCS8qIEFLNDY3MV9FNF9DT0VGRklDSUVOVDQJCSgweDQ4KQkqLworCXsgMHg0OSwgMHgwMCB9LAkvKiBBSzQ2NzFfRTRfQ09FRkZJQ0lFTlQ1CQkoMHg0OSkJKi8KKwl7IDB4NGEsIDB4MDAgfSwJLyogQUs0NjcxX0U1X0NPRUZGSUNJRU5UMAkJKDB4NGEpCSovCisJeyAweDRiLCAweDAwIH0sCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDEJCSgweDRiKQkqLworCXsgMHg0YywgMHgwMCB9LAkvKiBBSzQ2NzFfRTVfQ09FRkZJQ0lFTlQyCQkoMHg0YykJKi8KKwl7IDB4NGQsIDB4MDAgfSwJLyogQUs0NjcxX0U1X0NPRUZGSUNJRU5UMwkJKDB4NGQpCSovCisJeyAweDRlLCAweDAwIH0sCS8qIEFLNDY3MV9FNV9DT0VGRklDSUVOVDQJCSgweDRlKQkqLworCXsgMHg0ZiwgMHgwMCB9LAkvKiBBSzQ2NzFfRTVfQ09FRkZJQ0lFTlQ1CQkoMHg0ZikJKi8KKwl7IDB4NTAsIDB4ODggfSwJLyogQUs0NjcxX0VRX0NPTlRST0xfMjUwSFpfMTAwSFoJKDB4NTApCSovCisJeyAweDUxLCAweDg4IH0sCS8qIEFLNDY3MV9FUV9DT05UUk9MXzM1MDBIWl8xS0haCSgweDUxKQkqLworCXsgMHg1MiwgMHgwOCB9LAkvKiBBSzQ2NzFfRVFfQ09OVFJPXzEwS0haCQkoMHg1MikJKi8KKwl7IDB4NTMsIDB4MDAgfSwJLyogQUs0NjcxX1BDTV9JRl9DT05UUk9MMAkJKDB4NTMpCSovCisJeyAweDU0LCAweDAwIH0sCS8qIEFLNDY3MV9QQ01fSUZfQ09OVFJPTDEJCSgweDU0KQkqLworCXsgMHg1NSwgMHgwMCB9LAkvKiBBSzQ2NzFfUENNX0lGX0NPTlRST0wyCQkoMHg1NSkJKi8KKwl7IDB4NTYsIDB4MTggfSwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0JfQ09OVFJPTAkoMHg1NikJKi8KKwl7IDB4NTcsIDB4MTggfSwJLyogQUs0NjcxX0RJR0lUQUxfVk9MVU1FX0NfQ09OVFJPTAkoMHg1NykJKi8KKwl7IDB4NTgsIDB4MDAgfSwJLyogQUs0NjcxX1NJREVUT05FX1ZPTFVNRV9DT05UUk9MCSgweDU4KQkqLworCXsgMHg1OSwgMHgwMCB9LAkvKiBBSzQ2NzFfRElHSVRBTF9NSVhJTkdfQ09OVFJPTDIJKDB4NTkpCSovCisJeyAweDVhLCAweDAwIH0sCS8qIEFLNDY3MV9TQVJfQURDX0NPTlRST0wJCSgweDVhKQkqLwogfTsKIAogLyoKQEAgLTI0MSwxOSArMjM3LDE3IEBACiAvKiBJbnB1dCBNVVhzICovCiBzdGF0aWMgY29uc3QgY2hhciAqYWs0NjcxX2xpbl9tdXhfdGV4dHNbXSA9CiAJCXsiTElOMSIsICJMSU4yIiwgIkxJTjMiLCAiTElONCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhazQ2NzFfbGluX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUs0NjcxX01JQ19TSUdOQUxfU0VMRUNULCAwLAotCQkJQVJSQVlfU0laRShhazQ2NzFfbGluX211eF90ZXh0cyksCi0JCQlhazQ2NzFfbGluX211eF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWs0NjcxX2xpbl9tdXhfZW51bSwKKwkJCSAgICBBSzQ2NzFfTUlDX1NJR05BTF9TRUxFQ1QsIDAsCisJCQkgICAgYWs0NjcxX2xpbl9tdXhfdGV4dHMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFrNDY3MV9saW5fbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWs0NjcxX2xpbl9tdXhfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphazQ2NzFfcmluX211eF90ZXh0c1tdID0KIAkJeyJSSU4xIiwgIlJJTjIiLCAiUklOMyIsICJSSU40In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFrNDY3MV9yaW5fbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSzQ2NzFfTUlDX1NJR05BTF9TRUxFQ1QsIDIsCi0JCQlBUlJBWV9TSVpFKGFrNDY3MV9yaW5fbXV4X3RleHRzKSwKLQkJCWFrNDY3MV9yaW5fbXV4X3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhazQ2NzFfcmluX211eF9lbnVtLAorCQkJICAgIEFLNDY3MV9NSUNfU0lHTkFMX1NFTEVDVCwgMiwKKwkJCSAgICBhazQ2NzFfcmluX211eF90ZXh0cyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWs0NjcxX3Jpbl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhazQ2NzFfcmluX211eF9lbnVtKTsKIApAQCAtNjE5LDIxICs2MTMsNyBAQAogCiBzdGF0aWMgaW50IGFrNDY3MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGFrNDY3MV9wcml2ICphazQ2NzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIGFrNDY3MS0+Y29udHJvbF90eXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGFrNDY3MV9zbmRfY29udHJvbHMsCi0JCQkgICAgIEFSUkFZX1NJWkUoYWs0NjcxX3NuZF9jb250cm9scykpOwotCi0JYWs0NjcxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBhazQ2NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIH0KIAogc3RhdGljIGludCBhazQ2NzFfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTY0NiwyOCArNjI2LDM2IEBACiAJLnByb2JlID0gYWs0NjcxX3Byb2JlLAogCS5yZW1vdmUgPSBhazQ2NzFfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IGFrNDY3MV9zZXRfYmlhc19sZXZlbCwKLQkucmVnX2NhY2hlX3NpemUgPSBBSzQ2NzFfQ0FDSEVSRUdOVU0sCi0JLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTgpLAotCS5yZWdfY2FjaGVfZGVmYXVsdCA9IGFrNDY3MV9yZWcsCisJLmNvbnRyb2xzID0gYWs0NjcxX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhazQ2NzFfc25kX2NvbnRyb2xzKSwKIAkuZGFwbV93aWRnZXRzID0gYWs0NjcxX2RhcG1fd2lkZ2V0cywKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs0NjcxX2RhcG1fd2lkZ2V0cyksCiAJLmRhcG1fcm91dGVzID0gYWs0NjcxX2ludGVyY29uLAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNDY3MV9pbnRlcmNvbiksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWs0NjcxX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gQUs0NjcxX1NBUl9BRENfQ09OVFJPTCwKKwkucmVnX2RlZmF1bHRzID0gYWs0NjcxX3JlZ19kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUoYWs0NjcxX3JlZ19kZWZhdWx0cyksCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCit9OworCiBzdGF0aWMgaW50IGFrNDY3MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RydWN0IGFrNDY3MV9wcml2ICphazQ2NzE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWludCByZXQ7CiAKLQlhazQ2NzEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGFrNDY3MV9wcml2KSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmIChhazQ2NzEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhazQ2NzEpOwotCWFrNDY3MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWs0NjcxX3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHJlZ21hcDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCiAJCQkmc29jX2NvZGVjX2Rldl9hazQ2NzEsICZhazQ2NzFfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmggYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5oCmluZGV4IDYxY2I3YWIuLjM5NGEzNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuaApAQCAtMTA1LDggKzEwNSw2IEBACiAjZGVmaW5lIEFLNDY3MV9ESUdJVEFMX01JWElOR19DT05UUk9MMgkJMHg1OQogI2RlZmluZSBBSzQ2NzFfU0FSX0FEQ19DT05UUk9MCQkJMHg1YQogCi0jZGVmaW5lIEFLNDY3MV9DQUNIRVJFR05VTQkJCShBSzQ2NzFfU0FSX0FEQ19DT05UUk9MICsgMSkKLQogLyogQml0ZmllbGQgRGVmaW5pdGlvbnMgKi8KIAogLyogQUs0NjcxX0FEX0RBX1BPV0VSX01BTkFHRU1FTlQgKDB4MDApIEZpZWxkcyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hbGM1NjIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYwppbmRleCBkMzAzNjI4Li4wOWY3ZTc3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtMzgsMjYgKzM5LDEzIEBACiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IGFsYzU2MjNfcHJpdiB7Ci0JZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXU4IGlkOwogCXVuc2lnbmVkIGludCBzeXNjbGs7Ci0JdTE2IHJlZ19jYWNoZVtBTEM1NjIzX1ZFTkRPUl9JRDIrMl07CiAJdW5zaWduZWQgaW50IGFkZF9jdHJsOwogCXVuc2lnbmVkIGludCBqYWNrX2RldF9jdHJsOwogfTsKIAotc3RhdGljIHZvaWQgYWxjNTYyM19maWxsX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgaSwgc3RlcCA9IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JLyogbm90IHJlYWxseSBlZmZpY2llbnQgLi4uICovCi0JY29kZWMtPmNhY2hlX2J5cGFzcyA9IDE7Ci0JZm9yIChpID0gMCA7IGkgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSA7IGkgKz0gc3RlcCkKLQkJY2FjaGVbaV0gPSBzbmRfc29jX3JlYWQoY29kZWMsIGkpOwotCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBhbGM1NjIzX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19SRVNFVCwgMCk7CkBAIC0yMjgsMzIgKzIxNiwzNyBAQAogCQkiVm1pZCIsICJIUE91dCBNaXgiLCAiU3BlYWtlciBNaXgiLCAiTW9ubyBNaXgifTsKIAogLyogYXV4b3V0IG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYyM19hdXhfb3V0X2lucHV0X2VudW0gPQotU09DX0VOVU1fU0lOR0xFKEFMQzU2MjNfT1VUUFVUX01JWEVSX0NUUkwsIDYsIDQsIGFsYzU2MjNfYXV4X291dF9pbnB1dF9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MjNfYXV4X291dF9pbnB1dF9lbnVtLAorCQkJICAgIEFMQzU2MjNfT1VUUFVUX01JWEVSX0NUUkwsIDYsCisJCQkgICAgYWxjNTYyM19hdXhfb3V0X2lucHV0X3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19hdXhvdXRfbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWxjNTYyM19hdXhfb3V0X2lucHV0X2VudW0pOwogCiAvKiBzcGVha2VyIG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYyM19zcGtvdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTAsIDQsIGFsYzU2MjNfc3Brb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYyM19zcGtvdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxMCwKKwkJCSAgICBhbGM1NjIzX3Nwa291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfc3Brb3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfc3Brb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgbGVmdCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfaHBsX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA5LCAyLCBhbGM1NjIzX2hwbF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjIzX2hwbF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA5LAorCQkJICAgIGFsYzU2MjNfaHBsX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHBsX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2hwbF9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIGhlYWRwaG9uZSByaWdodCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfaHByX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA4LCAyLCBhbGM1NjIzX2hwcl9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjIzX2hwcl9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA4LAorCQkJICAgIGFsYzU2MjNfaHByX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHByX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2hwcl9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIHNwZWFrZXIgb3V0cHV0IE4gc2VsZWN0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfc3BrX25fc291cl9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxNCwgNCwgYWxjNTYyM19zcGtfbl9zb3VyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYyM19zcGtfbl9zb3VyX2VudW0sCisJCQkgICAgQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTQsCisJCQkgICAgYWxjNTYyM19zcGtfbl9zb3VyX3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19zcGtvdXRuX211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfc3BrX25fc291cl9lbnVtKTsKIApAQCAtMzM4LDggKzMzMSw5IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjNTYyM19hbXBfbmFtZXNbXSA9IHsiQUIgQW1wIiwgIkQgQW1wIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfYW1wX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxMywgMiwgYWxjNTYyM19hbXBfbmFtZXMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MjNfYW1wX2VudW0sCisJCQkgICAgQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTMsCisJCQkgICAgYWxjNTYyM19hbXBfbmFtZXMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfYW1wX211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2FtcF9lbnVtKTsKIApAQCAtODY5LDE4ICs4NjMsMjggQEAKIAogc3RhdGljIGludCBhbGM1NjIzX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogeworCXN0cnVjdCBhbGM1NjIzX3ByaXYgKmFsYzU2MjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwogCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWxjNTYyMy0+cmVnbWFwLCB0cnVlKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFsYzU2MjNfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaSwgc3RlcCA9IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCXN0cnVjdCBhbGM1NjIzX3ByaXYgKmFsYzU2MjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OwogCiAJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KLQlmb3IgKGkgPSAyIDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIDsgaSArPSBzdGVwKQotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBpLCBjYWNoZVtpXSk7CisJcmVnY2FjaGVfY2FjaGVfb25seShhbGM1NjIzLT5yZWdtYXAsIGZhbHNlKTsKKwlyZXQgPSByZWdjYWNoZV9zeW5jKGFsYzU2MjMtPnJlZ21hcCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzeW5jIHJlZ2lzdGVyIGNhY2hlOiAlZFxuIiwKKwkJCXJldCk7CisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWxjNTYyMy0+cmVnbWFwLCB0cnVlKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlhbGM1NjIzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKQEAgLTkwMCwxNCArOTA0LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgYWxjNTYyMy0+Y29udHJvbF90eXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJYWxjNTYyM19yZXNldChjb2RlYyk7Ci0JYWxjNTYyM19maWxsX2NhY2hlKGNvZGVjKTsKIAogCS8qIHBvd2VyIG9uIGRldmljZSAqLwogCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKQEAgLTk4MCw5ICs5NzcsMTUgQEAKIAkuc3VzcGVuZCA9IGFsYzU2MjNfc3VzcGVuZCwKIAkucmVzdW1lID0gYWxjNTYyM19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gYWxjNTYyM19zZXRfYmlhc19sZXZlbCwKLQkucmVnX2NhY2hlX3NpemUgPSBBTEM1NjIzX1ZFTkRPUl9JRDIrMiwKLQkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAotCS5yZWdfY2FjaGVfc3RlcCA9IDIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWxjNTYyM19yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSAxNiwKKwkucmVnX3N0cmlkZSA9IDIsCisKKwkubWF4X3JlZ2lzdGVyID0gQUxDNTYyM19WRU5ET1JfSUQyLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAogfTsKIAogLyoKQEAgLTk5NiwxOSArOTk5LDMyIEBACiB7CiAJc3RydWN0IGFsYzU2MjNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGFsYzU2MjNfcHJpdiAqYWxjNTYyMzsKLQlpbnQgcmV0LCB2aWQxLCB2aWQyOworCXVuc2lnbmVkIGludCB2aWQxLCB2aWQyOworCWludCByZXQ7CiAKLQl2aWQxID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgQUxDNTYyM19WRU5ET1JfSUQxKTsKLQlpZiAodmlkMSA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBJMkNcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwlhbGM1NjIzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhbGM1NjIzX3ByaXYpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmIChhbGM1NjIzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWxjNTYyMy0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmYWxjNTYyM19yZWdtYXApOworCWlmIChJU19FUlIoYWxjNTYyMy0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKGFsYzU2MjMtPnJlZ21hcCk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpc2UgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfcmVhZChhbGM1NjIzLT5yZWdtYXAsIEFMQzU2MjNfVkVORE9SX0lEMSwgJnZpZDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgdmVuZG9yIElEMTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCXZpZDEgPSAoKHZpZDEgJiAweGZmKSA8PCA4KSB8ICh2aWQxID4+IDgpOwogCi0JdmlkMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFMQzU2MjNfVkVORE9SX0lEMik7Ci0JaWYgKHZpZDIgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgSTJDXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJcmV0ID0gcmVnbWFwX3JlYWQoYWxjNTYyMy0+cmVnbWFwLCBBTEM1NjIzX1ZFTkRPUl9JRDIsICZ2aWQyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWFkIHZlbmRvciBJRDI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmICgodmlkMSAhPSAweDEwZWMpIHx8ICh2aWQyICE9IGlkLT5kcml2ZXJfZGF0YSkpIHsKQEAgLTEwMjEsMTEgKzEwMzcsNiBAQAogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGb3VuZCBjb2RlYyBpZCA6IGFsYzU2JTAyeFxuIiwgdmlkMik7CiAKLQlhbGM1NjIzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBhbGM1NjIzX3ByaXYpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChhbGM1NjIzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWlmIChwZGF0YSkgewogCQlhbGM1NjIzLT5hZGRfY3RybCA9IHBkYXRhLT5hZGRfY3RybDsKQEAgLTEwNDgsNyArMTA1OSw2IEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWxjNTYyMyk7Ci0JYWxjNTYyMy0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCiAJCSZzb2NfY29kZWNfZGV2aWNlX2FsYzU2MjMsICZhbGM1NjIzX2RhaSwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MzIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCmluZGV4IGZiMDAxYzUuLmVjMDcxYTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jCkBAIC0yOTMsNTEgKzI5Myw1OSBAQAogCQkiQURDIExSIiwgIlZvaWNlIFN0ZXJlbyBEaWdpdGFsIn07CiAKIC8qIGF1eG91dCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfYXV4X291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA2LCA0LCBhbGM1NjMyX2F1eF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2F1eF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA2LAorCQkJICAgIGFsYzU2MzJfYXV4X291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfYXV4b3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJBdXhPdXQgTXV4IiwgYWxjNTYzMl9hdXhfb3V0X2lucHV0X2VudW0pOwogCiAvKiBzcGVha2VyIG91dHB1dCBtdXggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYzMl9zcGtvdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTAsIDQsIGFsYzU2MzJfc3Brb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9zcGtvdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCAxMCwKKwkJCSAgICBhbGM1NjMyX3Nwa291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfc3Brb3V0X211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJTcGVha2VyT3V0IE11eCIsIGFsYzU2MzJfc3Brb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgbGVmdCBvdXRwdXQgbXV4ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfaHBsX291dF9pbnB1dF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA5LCAyLCBhbGM1NjMyX2hwbF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2hwbF9vdXRfaW5wdXRfZW51bSwKKwkJCSAgICBBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCA5LAorCQkJICAgIGFsYzU2MzJfaHBsX291dF9pbnB1dF9zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfaHBsX291dF9tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiTGVmdCBIZWFkcGhvbmUgTXV4IiwgYWxjNTYzMl9ocGxfb3V0X2lucHV0X2VudW0pOwogCiAvKiBoZWFkcGhvbmUgcmlnaHQgb3V0cHV0IG11eCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgOCwgMiwgYWxjNTYzMl9ocHJfb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9ocHJfb3V0X2lucHV0X2VudW0sCisJCQkgICAgQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgOCwKKwkJCSAgICBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfc2VsKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjMyX2hwcl9vdXRfbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJpZ2h0IEhlYWRwaG9uZSBNdXgiLCBhbGM1NjMyX2hwcl9vdXRfaW5wdXRfZW51bSk7CiAKIC8qIHNwZWFrZXIgb3V0cHV0IE4gc2VsZWN0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MzJfc3BrX25fc291cl9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShBTEM1NjMyX09VVFBVVF9NSVhFUl9DVFJMLCAxNCwgNCwgYWxjNTYzMl9zcGtfbl9zb3VyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9zcGtfbl9zb3VyX2VudW0sCisJCQkgICAgQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTQsCisJCQkgICAgYWxjNTYzMl9zcGtfbl9zb3VyX3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYzMl9zcGtvdXRuX211eF9jb250cm9scyA9CiBTT0NfREFQTV9FTlVNKCJTcGVha2VyT3V0IE4gTXV4IiwgYWxjNTYzMl9zcGtfbl9zb3VyX2VudW0pOwogCiAvKiBzcGVha2VyIGFtcGxpZmllciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmFsYzU2MzJfYW1wX25hbWVzW10gPSB7IkFCIEFtcCIsICJEIEFtcCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2FtcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9PVVRQVVRfTUlYRVJfQ1RSTCwgMTMsIDIsIGFsYzU2MzJfYW1wX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGM1NjMyX2FtcF9lbnVtLAorCQkJICAgIEFMQzU2MzJfT1VUUFVUX01JWEVSX0NUUkwsIDEzLAorCQkJICAgIGFsYzU2MzJfYW1wX25hbWVzKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjMyX2FtcF9tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIkFCLUQgQW1wIE11eCIsIGFsYzU2MzJfYW1wX2VudW0pOwogCiAvKiBBREMgb3V0cHV0IHNlbGVjdCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2FkY3JfZnVuY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUxDNTYzMl9EQUNfRlVOQ19TRUxFQ1QsIDUsIDIsIGFsYzU2MzJfYWRjcl9mdW5jX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjNTYzMl9hZGNyX2Z1bmNfZW51bSwKKwkJCSAgICBBTEM1NjMyX0RBQ19GVU5DX1NFTEVDVCwgNSwKKwkJCSAgICBhbGM1NjMyX2FkY3JfZnVuY19zZWwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MzJfYWRjcl9mdW5jX2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJBRENSIE11eCIsIGFsYzU2MzJfYWRjcl9mdW5jX2VudW0pOwogCiAvKiBJMlMgb3V0IHNlbGVjdCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjMyX2kyc19vdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFMQzU2MzJfSTJTX09VVF9DVEwsIDUsIDIsIGFsYzU2MzJfaTJzX291dF9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzU2MzJfaTJzX291dF9lbnVtLAorCQkJICAgIEFMQzU2MzJfSTJTX09VVF9DVEwsIDUsCisJCQkgICAgYWxjNTYzMl9pMnNfb3V0X3NlbCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYzMl9pMnNfb3V0X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJJMlNPdXQgTXV4IiwgYWxjNTYzMl9pMnNfb3V0X2VudW0pOwogCkBAIC0xMDU1LDE0ICsxMDYzLDYgQEAKIAlzdHJ1Y3QgYWxjNTYzMl9wcml2ICphbGM1NjMyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBhbGM1NjMyLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIHBvd2VyIG9uIGRldmljZSAgKi8KIAlhbGM1NjMyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKaW5kZXggZTQyOTVmZS4uMjllMTk4ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKQEAgLTUzLDYgKzUzLDE0IEBACiAjZGVmaW5lIEFSSVpPTkFfQUlGX1JYX0VOQUJMRVMgICAgICAgICAgICAgICAgICAweDFBCiAjZGVmaW5lIEFSSVpPTkFfQUlGX0ZPUkNFX1dSSVRFICAgICAgICAgICAgICAgICAweDFCCiAKKyNkZWZpbmUgQVJJWk9OQV9GTExfVkNPX0NPUk5FUiAxNDE5MDAwMDAKKyNkZWZpbmUgQVJJWk9OQV9GTExfTUFYX0ZSRUYgICAxMzUwMDAwMAorI2RlZmluZSBBUklaT05BX0ZMTF9NSU5fRlZDTyAgIDkwMDAwMDAwCisjZGVmaW5lIEFSSVpPTkFfRkxMX01BWF9GUkFUSU8gMTYKKyNkZWZpbmUgQVJJWk9OQV9GTExfTUFYX1JFRkRJViA4CisjZGVmaW5lIEFSSVpPTkFfRkxMX01JTl9PVVRESVYgMgorI2RlZmluZSBBUklaT05BX0ZMTF9NQVhfT1VURElWIDcKKwogI2RlZmluZSBhcml6b25hX2ZsbF9lcnIoX2ZsbCwgZm10LCAuLi4pIFwKIAlkZXZfZXJyKF9mbGwtPmFyaXpvbmEtPmRldiwgIkZMTCVkOiAiIGZtdCwgX2ZsbC0+aWQsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIGFyaXpvbmFfZmxsX3dhcm4oX2ZsbCwgZm10LCAuLi4pIFwKQEAgLTU0Miw2NyArNTUwLDc2IEBACiAJIjE1bXMvNmRCIiwgIjMwbXMvNmRCIiwKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2luX3ZkX3JhbXAgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0lOUFVUX1ZPTFVNRV9SQU1QLAotCQkJQVJJWk9OQV9JTl9WRF9SQU1QX1NISUZULCA3LCBhcml6b25hX3ZvbF9yYW1wX3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9pbl92ZF9yYW1wLAorCQkgICAgIEFSSVpPTkFfSU5QVVRfVk9MVU1FX1JBTVAsCisJCSAgICAgQVJJWk9OQV9JTl9WRF9SQU1QX1NISUZULAorCQkgICAgIGFyaXpvbmFfdm9sX3JhbXBfdGV4dCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX2luX3ZkX3JhbXApOwogCi1jb25zdCBzdHJ1Y3Qgc29jX2VudW0gYXJpem9uYV9pbl92aV9yYW1wID0KLQlTT0NfRU5VTV9TSU5HTEUoQVJJWk9OQV9JTlBVVF9WT0xVTUVfUkFNUCwKLQkJCUFSSVpPTkFfSU5fVklfUkFNUF9TSElGVCwgNywgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfaW5fdmlfcmFtcCwKKwkJICAgICBBUklaT05BX0lOUFVUX1ZPTFVNRV9SQU1QLAorCQkgICAgIEFSSVpPTkFfSU5fVklfUkFNUF9TSElGVCwKKwkJICAgICBhcml6b25hX3ZvbF9yYW1wX3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9pbl92aV9yYW1wKTsKIAotY29uc3Qgc3RydWN0IHNvY19lbnVtIGFyaXpvbmFfb3V0X3ZkX3JhbXAgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX09VVFBVVF9WT0xVTUVfUkFNUCwKLQkJCUFSSVpPTkFfT1VUX1ZEX1JBTVBfU0hJRlQsIDcsIGFyaXpvbmFfdm9sX3JhbXBfdGV4dCk7CitTT0NfRU5VTV9TSU5HTEVfREVDTChhcml6b25hX291dF92ZF9yYW1wLAorCQkgICAgIEFSSVpPTkFfT1VUUFVUX1ZPTFVNRV9SQU1QLAorCQkgICAgIEFSSVpPTkFfT1VUX1ZEX1JBTVBfU0hJRlQsCisJCSAgICAgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfb3V0X3ZkX3JhbXApOwogCi1jb25zdCBzdHJ1Y3Qgc29jX2VudW0gYXJpem9uYV9vdXRfdmlfcmFtcCA9Ci0JU09DX0VOVU1fU0lOR0xFKEFSSVpPTkFfT1VUUFVUX1ZPTFVNRV9SQU1QLAotCQkJQVJJWk9OQV9PVVRfVklfUkFNUF9TSElGVCwgNywgYXJpem9uYV92b2xfcmFtcF90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfb3V0X3ZpX3JhbXAsCisJCSAgICAgQVJJWk9OQV9PVVRQVVRfVk9MVU1FX1JBTVAsCisJCSAgICAgQVJJWk9OQV9PVVRfVklfUkFNUF9TSElGVCwKKwkJICAgICBhcml6b25hX3ZvbF9yYW1wX3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9vdXRfdmlfcmFtcCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphcml6b25hX2xocGZfbW9kZV90ZXh0W10gPSB7CiAJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYxX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGMV8xLCBBUklaT05BX0xIUEYxX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjFfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGMV8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjFfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjFfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGMl8xLCBBUklaT05BX0xIUEYyX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjJfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGMl8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjJfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjJfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGYzX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGM18xLCBBUklaT05BX0xIUEYzX01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjNfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGM18xLAorCQkgICAgIEFSSVpPTkFfTEhQRjNfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjNfbW9kZSk7CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2xocGY0X21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX0hQTFBGNF8xLCBBUklaT05BX0xIUEY0X01PREVfU0hJRlQsIDIsCi0JCQlhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKGFyaXpvbmFfbGhwZjRfbW9kZSwKKwkJICAgICBBUklaT05BX0hQTFBGNF8xLAorCQkgICAgIEFSSVpPTkFfTEhQRjRfTU9ERV9TSElGVCwKKwkJICAgICBhcml6b25hX2xocGZfbW9kZV90ZXh0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfbGhwZjRfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphcml6b25hX25nX2hvbGRfdGV4dFtdID0gewogCSIzMG1zIiwgIjEyMG1zIiwgIjI1MG1zIiwgIjUwMG1zIiwKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX25nX2hvbGQgPQotCVNPQ19FTlVNX1NJTkdMRShBUklaT05BX05PSVNFX0dBVEVfQ09OVFJPTCwgQVJJWk9OQV9OR0FURV9IT0xEX1NISUZULAotCQkJNCwgYXJpem9uYV9uZ19ob2xkX3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9uZ19ob2xkLAorCQkgICAgIEFSSVpPTkFfTk9JU0VfR0FURV9DT05UUk9MLAorCQkgICAgIEFSSVpPTkFfTkdBVEVfSE9MRF9TSElGVCwKKwkJICAgICBhcml6b25hX25nX2hvbGRfdGV4dCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX25nX2hvbGQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFyaXpvbmFfaW5faHBmX2N1dF90ZXh0W10gPSB7CiAJIjIuNUh6IiwgIjVIeiIsICIxMEh6IiwgIjIwSHoiLCAiNDBIeiIKIH07CiAKLWNvbnN0IHN0cnVjdCBzb2NfZW51bSBhcml6b25hX2luX2hwZl9jdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFSSVpPTkFfSFBGX0NPTlRST0wsIEFSSVpPTkFfSU5fSFBGX0NVVF9TSElGVCwKLQkJCUFSUkFZX1NJWkUoYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpLAotCQkJYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpOworU09DX0VOVU1fU0lOR0xFX0RFQ0woYXJpem9uYV9pbl9ocGZfY3V0X2VudW0sCisJCSAgICAgQVJJWk9OQV9IUEZfQ09OVFJPTCwKKwkJICAgICBBUklaT05BX0lOX0hQRl9DVVRfU0hJRlQsCisJCSAgICAgYXJpem9uYV9pbl9ocGZfY3V0X3RleHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXJpem9uYV9pbl9ocGZfY3V0X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFyaXpvbmFfaW5fZG1pY19vc3JfdGV4dFtdID0gewpAQCAtMTM3Nyw3NCArMTM5NCwxNDcgQEAKIAlpbnQgZ2FpbjsKIH07CiAKK3N0YXRpYyBpbnQgYXJpem9uYV92YWxpZGF0ZV9mbGwoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwsCisJCQkJdW5zaWduZWQgaW50IEZyZWYsCisJCQkJdW5zaWduZWQgaW50IEZvdXQpCit7CisJdW5zaWduZWQgaW50IEZ2Y29fbWluOworCisJaWYgKEZyZWYgLyBBUklaT05BX0ZMTF9NQVhfUkVGRElWID4gQVJJWk9OQV9GTExfTUFYX0ZSRUYpIHsKKwkJYXJpem9uYV9mbGxfZXJyKGZsbCwKKwkJCQkiQ2FuJ3Qgc2NhbGUgJWRNSHogaW4gdG8gPD0xMy41TUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlGdmNvX21pbiA9IEFSSVpPTkFfRkxMX01JTl9GVkNPICogZmxsLT52Y29fbXVsdDsKKwlpZiAoRm91dCAqIEFSSVpPTkFfRkxMX01BWF9PVVRESVYgPCBGdmNvX21pbikgeworCQlhcml6b25hX2ZsbF9lcnIoZmxsLCAiTm8gRkxMX09VVERJViBmb3IgRm91dD0ldUh6XG4iLAorCQkJCUZvdXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcml6b25hX2ZpbmRfZnJhdGlvKHVuc2lnbmVkIGludCBGcmVmLCBpbnQgKmZyYXRpbykKK3sKKwlpbnQgaTsKKworCS8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgRkxMX0ZSQVRJTyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZsbF9mcmF0aW9zKTsgaSsrKSB7CisJCWlmIChmbGxfZnJhdGlvc1tpXS5taW4gPD0gRnJlZiAmJiBGcmVmIDw9IGZsbF9mcmF0aW9zW2ldLm1heCkgeworCQkJaWYgKGZyYXRpbykKKwkJCQkqZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZnJhdGlvOworCQkJcmV0dXJuIGZsbF9mcmF0aW9zW2ldLnJhdGlvOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYXJpem9uYV9jYWxjX2ZyYXRpbyhzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwKKwkJCSAgICAgICBzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnICpjZmcsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdldCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgRnJlZiwgYm9vbCBzeW5jKQoreworCWludCBpbml0X3JhdGlvLCByYXRpbzsKKwlpbnQgcmVmZGl2LCBkaXY7CisKKwkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6LCBmaW5kIGluaXRpYWwgcmVmZGl2ICovCisJZGl2ID0gMTsKKwljZmctPnJlZmRpdiA9IDA7CisJd2hpbGUgKEZyZWYgPiBBUklaT05BX0ZMTF9NQVhfRlJFRikgeworCQlkaXYgKj0gMjsKKwkJRnJlZiAvPSAyOworCQljZmctPnJlZmRpdisrOworCisJCWlmIChkaXYgPiBBUklaT05BX0ZMTF9NQVhfUkVGRElWKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRmluZCBhbiBhcHByb3ByaWF0ZSBGTExfRlJBVElPICovCisJaW5pdF9yYXRpbyA9IGFyaXpvbmFfZmluZF9mcmF0aW8oRnJlZiwgJmNmZy0+ZnJhdGlvKTsKKwlpZiAoaW5pdF9yYXRpbyA8IDApIHsKKwkJYXJpem9uYV9mbGxfZXJyKGZsbCwgIlVuYWJsZSB0byBmaW5kIEZSQVRJTyBmb3IgRnJlZj0ldUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gaW5pdF9yYXRpbzsKKwl9CisKKwlzd2l0Y2ggKGZsbC0+YXJpem9uYS0+dHlwZSkgeworCWNhc2UgV001MTEwOgorCQlpZiAoZmxsLT5hcml6b25hLT5yZXYgPCAzIHx8IHN5bmMpCisJCQlyZXR1cm4gaW5pdF9yYXRpbzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGluaXRfcmF0aW87CisJfQorCisJY2ZnLT5mcmF0aW8gPSBpbml0X3JhdGlvIC0gMTsKKworCS8qIEFkanVzdCBGUkFUSU8vcmVmZGl2IHRvIGF2b2lkIGludGVnZXIgbW9kZSBpZiBwb3NzaWJsZSAqLworCXJlZmRpdiA9IGNmZy0+cmVmZGl2OworCisJd2hpbGUgKGRpdiA8PSBBUklaT05BX0ZMTF9NQVhfUkVGRElWKSB7CisJCWZvciAocmF0aW8gPSBpbml0X3JhdGlvOyByYXRpbyA8PSBBUklaT05BX0ZMTF9NQVhfRlJBVElPOworCQkgICAgIHJhdGlvKyspIHsKKwkJCWlmICh0YXJnZXQgJSAocmF0aW8gKiBGcmVmKSkgeworCQkJCWNmZy0+cmVmZGl2ID0gcmVmZGl2OworCQkJCWNmZy0+ZnJhdGlvID0gcmF0aW8gLSAxOworCQkJCXJldHVybiByYXRpbzsKKwkJCX0KKwkJfQorCisJCWZvciAocmF0aW8gPSBpbml0X3JhdGlvIC0gMTsgcmF0aW8gPj0gMDsgcmF0aW8tLSkgeworCQkJaWYgKEFSSVpPTkFfRkxMX1ZDT19DT1JORVIgLyAoZmxsLT52Y29fbXVsdCAqIHJhdGlvKSA8CisJCQkgICAgRnJlZikKKwkJCQlicmVhazsKKworCQkJaWYgKHRhcmdldCAlIChyYXRpbyAqIEZyZWYpKSB7CisJCQkJY2ZnLT5yZWZkaXYgPSByZWZkaXY7CisJCQkJY2ZnLT5mcmF0aW8gPSByYXRpbyAtIDE7CisJCQkJcmV0dXJuIHJhdGlvOworCQkJfQorCQl9CisKKwkJZGl2ICo9IDI7CisJCUZyZWYgLz0gMjsKKwkJcmVmZGl2Kys7CisJCWluaXRfcmF0aW8gPSBhcml6b25hX2ZpbmRfZnJhdGlvKEZyZWYsIE5VTEwpOworCX0KKworCWFyaXpvbmFfZmxsX3dhcm4oZmxsLCAiRmFsbGluZyBiYWNrIHRvIGludGVnZXIgbW9kZSBvcGVyYXRpb25cbiIpOworCXJldHVybiBjZmctPmZyYXRpbyArIDE7Cit9CisKIHN0YXRpYyBpbnQgYXJpem9uYV9jYWxjX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwKIAkJCSAgICBzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnICpjZmcsCi0JCQkgICAgdW5zaWduZWQgaW50IEZyZWYsCi0JCQkgICAgdW5zaWduZWQgaW50IEZvdXQpCisJCQkgICAgdW5zaWduZWQgaW50IEZyZWYsIGJvb2wgc3luYykKIHsKIAl1bnNpZ25lZCBpbnQgdGFyZ2V0LCBkaXYsIGdjZF9mbGw7CiAJaW50IGksIHJhdGlvOwogCi0JYXJpem9uYV9mbGxfZGJnKGZsbCwgIkZyZWY9JXUgRm91dD0ldVxuIiwgRnJlZiwgRm91dCk7Ci0KLQkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6ICovCi0JZGl2ID0gMTsKLQljZmctPnJlZmRpdiA9IDA7Ci0Jd2hpbGUgKChGcmVmIC8gZGl2KSA+IDEzNTAwMDAwKSB7Ci0JCWRpdiAqPSAyOwotCQljZmctPnJlZmRpdisrOwotCi0JCWlmIChkaXYgPiA4KSB7Ci0JCQlhcml6b25hX2ZsbF9lcnIoZmxsLAotCQkJCQkiQ2FuJ3Qgc2NhbGUgJWRNSHogaW4gdG8gPD0xMy41TUh6XG4iLAotCQkJCQlGcmVmKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JLyogQXBwbHkgdGhlIGRpdmlzaW9uIGZvciBvdXIgcmVtYWluaW5nIGNhbGN1bGF0aW9ucyAqLwotCUZyZWYgLz0gZGl2OworCWFyaXpvbmFfZmxsX2RiZyhmbGwsICJGcmVmPSV1IEZvdXQ9JXVcbiIsIEZyZWYsIGZsbC0+Zm91dCk7CiAKIAkvKiBGdmNvIHNob3VsZCBiZSBvdmVyIHRoZSB0YXJndDsgZG9uJ3QgY2hlY2sgdGhlIHVwcGVyIGJvdW5kICovCi0JZGl2ID0gMTsKLQl3aGlsZSAoRm91dCAqIGRpdiA8IDkwMDAwMDAwICogZmxsLT52Y29fbXVsdCkgeworCWRpdiA9IEFSSVpPTkFfRkxMX01JTl9PVVRESVY7CisJd2hpbGUgKGZsbC0+Zm91dCAqIGRpdiA8IEFSSVpPTkFfRkxMX01JTl9GVkNPICogZmxsLT52Y29fbXVsdCkgewogCQlkaXYrKzsKLQkJaWYgKGRpdiA+IDcpIHsKLQkJCWFyaXpvbmFfZmxsX2VycihmbGwsICJObyBGTExfT1VURElWIGZvciBGb3V0PSV1SHpcbiIsCi0JCQkJCUZvdXQpOworCQlpZiAoZGl2ID4gQVJJWk9OQV9GTExfTUFYX09VVERJVikKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAJfQotCXRhcmdldCA9IEZvdXQgKiBkaXYgLyBmbGwtPnZjb19tdWx0OworCXRhcmdldCA9IGZsbC0+Zm91dCAqIGRpdiAvIGZsbC0+dmNvX211bHQ7CiAJY2ZnLT5vdXRkaXYgPSBkaXY7CiAKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiRnZjbz0lZEh6XG4iLCB0YXJnZXQpOwogCi0JLyogRmluZCBhbiBhcHByb3ByYWl0ZSBGTExfRlJBVElPIGFuZCBmYWN0b3IgaXQgb3V0IG9mIHRoZSB0YXJnZXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmbGxfZnJhdGlvcyk7IGkrKykgewotCQlpZiAoZmxsX2ZyYXRpb3NbaV0ubWluIDw9IEZyZWYgJiYgRnJlZiA8PSBmbGxfZnJhdGlvc1tpXS5tYXgpIHsKLQkJCWNmZy0+ZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZnJhdGlvOwotCQkJcmF0aW8gPSBmbGxfZnJhdGlvc1tpXS5yYXRpbzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IEFSUkFZX1NJWkUoZmxsX2ZyYXRpb3MpKSB7Ci0JCWFyaXpvbmFfZmxsX2VycihmbGwsICJVbmFibGUgdG8gZmluZCBGUkFUSU8gZm9yIEZyZWY9JXVIelxuIiwKLQkJCQlGcmVmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgRkxMX0ZSQVRJTyBhbmQgcmVmZGl2ICovCisJcmF0aW8gPSBhcml6b25hX2NhbGNfZnJhdGlvKGZsbCwgY2ZnLCB0YXJnZXQsIEZyZWYsIHN5bmMpOworCWlmIChyYXRpbyA8IDApCisJCXJldHVybiByYXRpbzsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZsbF9nYWlucyk7IGkrKykgewotCQlpZiAoZmxsX2dhaW5zW2ldLm1pbiA8PSBGcmVmICYmIEZyZWYgPD0gZmxsX2dhaW5zW2ldLm1heCkgewotCQkJY2ZnLT5nYWluID0gZmxsX2dhaW5zW2ldLmdhaW47Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSBBUlJBWV9TSVpFKGZsbF9nYWlucykpIHsKLQkJYXJpem9uYV9mbGxfZXJyKGZsbCwgIlVuYWJsZSB0byBmaW5kIGdhaW4gZm9yIEZyZWY9JXVIelxuIiwKLQkJCQlGcmVmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIEFwcGx5IHRoZSBkaXZpc2lvbiBmb3Igb3VyIHJlbWFpbmluZyBjYWxjdWxhdGlvbnMgKi8KKwlGcmVmID0gRnJlZiAvICgxIDw8IGNmZy0+cmVmZGl2KTsKIAogCWNmZy0+biA9IHRhcmdldCAvIChyYXRpbyAqIEZyZWYpOwogCkBAIC0xNDY5LDYgKzE1NTksMTggQEAKIAkJY2ZnLT5sYW1iZGEgPj49IDE7CiAJfQogCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmxsX2dhaW5zKTsgaSsrKSB7CisJCWlmIChmbGxfZ2FpbnNbaV0ubWluIDw9IEZyZWYgJiYgRnJlZiA8PSBmbGxfZ2FpbnNbaV0ubWF4KSB7CisJCQljZmctPmdhaW4gPSBmbGxfZ2FpbnNbaV0uZ2FpbjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUoZmxsX2dhaW5zKSkgeworCQlhcml6b25hX2ZsbF9lcnIoZmxsLCAiVW5hYmxlIHRvIGZpbmQgZ2FpbiBmb3IgRnJlZj0ldUh6XG4iLAorCQkJCUZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiTj0leCBUSEVUQT0leCBMQU1CREE9JXhcbiIsCiAJCQljZmctPm4sIGNmZy0+dGhldGEsIGNmZy0+bGFtYmRhKTsKIAlhcml6b25hX2ZsbF9kYmcoZmxsLCAiRlJBVElPPSV4KCVkKSBPVVRESVY9JXggUkVGQ0xLX0RJVj0leFxuIiwKQEAgLTE0OTYsMTQgKzE1OTgsMTggQEAKIAkJCQkgY2ZnLT5yZWZkaXYgPDwgQVJJWk9OQV9GTEwxX0NMS19SRUZfRElWX1NISUZUIHwKIAkJCQkgc291cmNlIDw8IEFSSVpPTkFfRkxMMV9DTEtfUkVGX1NSQ19TSElGVCk7CiAKLQlpZiAoc3luYykKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgYmFzZSArIDB4NywKLQkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCi0JCQkJCSBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOwotCWVsc2UKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgYmFzZSArIDB4OSwKLQkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCi0JCQkJCSBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOworCWlmIChzeW5jKSB7CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsIGJhc2UgKyAweDcsCisJCQkJICAgQVJJWk9OQV9GTEwxX0dBSU5fTUFTSywKKwkJCQkgICBjZmctPmdhaW4gPDwgQVJJWk9OQV9GTEwxX0dBSU5fU0hJRlQpOworCX0gZWxzZSB7CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsIGJhc2UgKyAweDUsCisJCQkJICAgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLLAorCQkJCSAgIGNmZy0+b3V0ZGl2IDw8IEFSSVpPTkFfRkxMMV9PVVRESVZfU0hJRlQpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMoYXJpem9uYS0+cmVnbWFwLCBiYXNlICsgMHg5LAorCQkJCSAgIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssCisJCQkJICAgY2ZnLT5nYWluIDw8IEFSSVpPTkFfRkxMMV9HQUlOX1NISUZUKTsKKwl9CiAKIAlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBiYXNlICsgMiwKIAkJCQkgQVJJWk9OQV9GTEwxX0NUUkxfVVBEIHwgQVJJWk9OQV9GTEwxX05fTUFTSywKQEAgLTE1MjYsMTMgKzE2MzIsMTIgQEAKIAlyZXR1cm4gcmVnICYgQVJJWk9OQV9GTEwxX0VOQTsKIH0KIAotc3RhdGljIHZvaWQgYXJpem9uYV9lbmFibGVfZmxsKHN0cnVjdCBhcml6b25hX2ZsbCAqZmxsLAotCQkJICAgICAgc3RydWN0IGFyaXpvbmFfZmxsX2NmZyAqcmVmLAotCQkJICAgICAgc3RydWN0IGFyaXpvbmFfZmxsX2NmZyAqc3luYykKK3N0YXRpYyB2b2lkIGFyaXpvbmFfZW5hYmxlX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCkKIHsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGZsbC0+YXJpem9uYTsKIAlpbnQgcmV0OwogCWJvb2wgdXNlX3N5bmMgPSBmYWxzZTsKKwlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIGNmZzsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSBib3RoIFJFRkNMSyBhbmQgU1lOQ0NMSyB0aGVuIGVuYWJsZSBib3RoLApAQCAtMTU0MCwyMyArMTY0NSwyMSBAQAogCSAqLwogCWlmIChmbGwtPnJlZl9zcmMgPj0gMCAmJiBmbGwtPnJlZl9mcmVxICYmCiAJICAgIGZsbC0+cmVmX3NyYyAhPSBmbGwtPnN5bmNfc3JjKSB7Ci0JCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDUsCi0JCQkJCSBBUklaT05BX0ZMTDFfT1VURElWX01BU0ssCi0JCQkJCSByZWYtPm91dGRpdiA8PCBBUklaT05BX0ZMTDFfT1VURElWX1NISUZUKTsKKwkJYXJpem9uYV9jYWxjX2ZsbChmbGwsICZjZmcsIGZsbC0+cmVmX2ZyZXEsIGZhbHNlKTsKIAotCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsIHJlZiwgZmxsLT5yZWZfc3JjLAorCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsICZjZmcsIGZsbC0+cmVmX3NyYywKIAkJCQkgIGZhbHNlKTsKIAkJaWYgKGZsbC0+c3luY19zcmMgPj0gMCkgewotCQkJYXJpem9uYV9hcHBseV9mbGwoYXJpem9uYSwgZmxsLT5iYXNlICsgMHgxMCwgc3luYywKKwkJCWFyaXpvbmFfY2FsY19mbGwoZmxsLCAmY2ZnLCBmbGwtPnN5bmNfZnJlcSwgdHJ1ZSk7CisKKwkJCWFyaXpvbmFfYXBwbHlfZmxsKGFyaXpvbmEsIGZsbC0+YmFzZSArIDB4MTAsICZjZmcsCiAJCQkJCSAgZmxsLT5zeW5jX3NyYywgdHJ1ZSk7CiAJCQl1c2Vfc3luYyA9IHRydWU7CiAJCX0KIAl9IGVsc2UgaWYgKGZsbC0+c3luY19zcmMgPj0gMCkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyA1LAotCQkJCQkgQVJJWk9OQV9GTEwxX09VVERJVl9NQVNLLAotCQkJCQkgc3luYy0+b3V0ZGl2IDw8IEFSSVpPTkFfRkxMMV9PVVRESVZfU0hJRlQpOworCQlhcml6b25hX2NhbGNfZmxsKGZsbCwgJmNmZywgZmxsLT5zeW5jX2ZyZXEsIGZhbHNlKTsKIAotCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsIHN5bmMsCisJCWFyaXpvbmFfYXBwbHlfZmxsKGFyaXpvbmEsIGZsbC0+YmFzZSwgJmNmZywKIAkJCQkgIGZsbC0+c3luY19zcmMsIGZhbHNlKTsKIAogCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAweDExLApAQCAtMTYxOCwzMiArMTcyMSwyMiBAQAogaW50IGFyaXpvbmFfc2V0X2ZsbF9yZWZjbGsoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwsIGludCBzb3VyY2UsCiAJCQkgICB1bnNpZ25lZCBpbnQgRnJlZiwgdW5zaWduZWQgaW50IEZvdXQpCiB7Ci0Jc3RydWN0IGFyaXpvbmFfZmxsX2NmZyByZWYsIHN5bmM7CiAJaW50IHJldDsKIAogCWlmIChmbGwtPnJlZl9zcmMgPT0gc291cmNlICYmIGZsbC0+cmVmX2ZyZXEgPT0gRnJlZikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZmxsLT5mb3V0KSB7Ci0JCWlmIChGcmVmID4gMCkgewotCQkJcmV0ID0gYXJpem9uYV9jYWxjX2ZsbChmbGwsICZyZWYsIEZyZWYsIGZsbC0+Zm91dCk7Ci0JCQlpZiAocmV0ICE9IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWlmIChmbGwtPnN5bmNfc3JjID49IDApIHsKLQkJCXJldCA9IGFyaXpvbmFfY2FsY19mbGwoZmxsLCAmc3luYywgZmxsLT5zeW5jX2ZyZXEsCi0JCQkJCSAgICAgICBmbGwtPmZvdXQpOwotCQkJaWYgKHJldCAhPSAwKQotCQkJCXJldHVybiByZXQ7Ci0JCX0KKwlpZiAoZmxsLT5mb3V0ICYmIEZyZWYgPiAwKSB7CisJCXJldCA9IGFyaXpvbmFfdmFsaWRhdGVfZmxsKGZsbCwgRnJlZiwgZmxsLT5mb3V0KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlmbGwtPnJlZl9zcmMgPSBzb3VyY2U7CiAJZmxsLT5yZWZfZnJlcSA9IEZyZWY7CiAKIAlpZiAoZmxsLT5mb3V0ICYmIEZyZWYgPiAwKSB7Ci0JCWFyaXpvbmFfZW5hYmxlX2ZsbChmbGwsICZyZWYsICZzeW5jKTsKKwkJYXJpem9uYV9lbmFibGVfZmxsKGZsbCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjUzLDcgKzE3NDYsNiBAQAogaW50IGFyaXpvbmFfc2V0X2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwgaW50IHNvdXJjZSwKIAkJICAgIHVuc2lnbmVkIGludCBGcmVmLCB1bnNpZ25lZCBpbnQgRm91dCkKIHsKLQlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIHJlZiwgc3luYzsKIAlpbnQgcmV0OwogCiAJaWYgKGZsbC0+c3luY19zcmMgPT0gc291cmNlICYmCkBAIC0xNjYyLDEzICsxNzU0LDEyIEBACiAKIAlpZiAoRm91dCkgewogCQlpZiAoZmxsLT5yZWZfc3JjID49IDApIHsKLQkJCXJldCA9IGFyaXpvbmFfY2FsY19mbGwoZmxsLCAmcmVmLCBmbGwtPnJlZl9mcmVxLAotCQkJCQkgICAgICAgRm91dCk7CisJCQlyZXQgPSBhcml6b25hX3ZhbGlkYXRlX2ZsbChmbGwsIGZsbC0+cmVmX2ZyZXEsIEZvdXQpOwogCQkJaWYgKHJldCAhPSAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlyZXQgPSBhcml6b25hX2NhbGNfZmxsKGZsbCwgJnN5bmMsIEZyZWYsIEZvdXQpOworCQlyZXQgPSBhcml6b25hX3ZhbGlkYXRlX2ZsbChmbGwsIEZyZWYsIEZvdXQpOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE2NzgsNyArMTc2OSw3IEBACiAJZmxsLT5mb3V0ID0gRm91dDsKIAogCWlmIChGb3V0KSB7Ci0JCWFyaXpvbmFfZW5hYmxlX2ZsbChmbGwsICZyZWYsICZzeW5jKTsKKwkJYXJpem9uYV9lbmFibGVfZmxsKGZsbCk7CiAJfSBlbHNlIHsKIAkJYXJpem9uYV9kaXNhYmxlX2ZsbChmbGwpOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCmluZGV4IDQzNzM3YTI3Li4xZTI1YzdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMKQEAgLTEzOCw5ICsxMzgsOCBAQAogCXN0cnVjdCBkYXZpbmNpX3ZjICpkYXZpbmNpX3ZjID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAogCWRhdmluY2lfdmMtPmNxOTN2Yy5jb2RlYyA9IGNvZGVjOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBkYXZpbmNpX3ZjLT5yZWdtYXA7CiAKLQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMzIsIDMyLCBTTkRfU09DX1JFR01BUCk7CisJc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIGRhdmluY2lfdmMtPnJlZ21hcCk7CiAKIAkvKiBPZmYsIHdpdGggcG93ZXIgb24gKi8KIAljcTkzdmNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IDgzYzgzNWQuLjM5MjBlNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtNTA2LDE1ICs1MDYsNiBAQAogCXN0cnVjdCBjczQyNzBfcHJpdmF0ZSAqY3M0MjcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCS8qIFRlbGwgQVNvQyB3aGF0IGtpbmQgb2YgSS9PIHRvIHVzZSB0byByZWFkIHRoZSByZWdpc3RlcnMuICBBU29DIHdpbGwKLQkgKiB0aGVuIGRvIHRoZSBJMkMgdHJhbnNhY3Rpb25zIGl0c2VsZi4KLQkgKi8KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9PIChyZXQ9JWkpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIERpc2FibGUgYXV0by1tdXRlLiAgVGhpcyBmZWF0dXJlIGFwcGVhcnMgdG8gYmUgYnVnZ3kuICBJbiBzb21lCiAJICogc2l0dWF0aW9ucywgYXV0by1tdXRlIHdpbGwgbm90IGRlYWN0aXZhdGUgd2hlbiBpdCBzaG91bGQsIHNvIHdlIHdhbnQKIAkgKiB0aGlzIGZlYXR1cmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIEFuIGFwcGxpY2F0aW9uIChlLmcuIGFsc2FjdGwpIGNhbgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKaW5kZXggY2UwNWZkOS4uYWVmNDk2NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCkBAIC0xNTksNyArMTU5LDYgQEAKIH0KIAogc3RydWN0IGNzNDI3MV9wcml2YXRlIHsKLQkvKiBTTkRfU09DX0kyQyBvciBTTkRfU09DX1NQSSAqLwogCXVuc2lnbmVkIGludAkJCW1jbGs7CiAJYm9vbAkJCQltYXN0ZXI7CiAJYm9vbAkJCQlkZWVtcGg7CkBAIC01NDAsMTQgKzUzOSwxMCBAQAogCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IGNzNDI3MV9wbGF0Zm9ybV9kYXRhICpjczQyNzFwbGF0ID0gY29kZWMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlpbnQgcmV0OwotCWludCBncGlvX25yZXNldCA9IC1FSU5WQUw7CiAJYm9vbCBhbXV0ZWNfZXFfYm11dGVjID0gZmFsc2U7CiAKICNpZmRlZiBDT05GSUdfT0YKIAlpZiAob2ZfbWF0Y2hfZGV2aWNlKGNzNDI3MV9kdF9pZHMsIGNvZGVjLT5kZXYpKSB7Ci0JCWdwaW9fbnJlc2V0ID0gb2ZfZ2V0X25hbWVkX2dwaW8oY29kZWMtPmRldi0+b2Zfbm9kZSwKLQkJCQkJCSJyZXNldC1ncGlvIiwgMCk7Ci0KIAkJaWYgKG9mX2dldF9wcm9wZXJ0eShjb2RlYy0+ZGV2LT5vZl9ub2RlLAogCQkJCSAgICAgImNpcnJ1cyxhbXV0ZWMtZXEtYm11dGVjIiwgTlVMTCkpCiAJCQlhbXV0ZWNfZXFfYm11dGVjID0gdHJ1ZTsKQEAgLTU1OSwyNyArNTU0LDE5IEBACiAjZW5kaWYKIAogCWlmIChjczQyNzFwbGF0KSB7Ci0JCWlmIChncGlvX2lzX3ZhbGlkKGNzNDI3MXBsYXQtPmdwaW9fbnJlc2V0KSkKLQkJCWdwaW9fbnJlc2V0ID0gY3M0MjcxcGxhdC0+Z3Bpb19ucmVzZXQ7Ci0KIAkJYW11dGVjX2VxX2JtdXRlYyA9IGNzNDI3MXBsYXQtPmFtdXRlY19lcV9ibXV0ZWM7CiAJCWNzNDI3MS0+ZW5hYmxlX3NvZnRfcmVzZXQgPSBjczQyNzFwbGF0LT5lbmFibGVfc29mdF9yZXNldDsKIAl9CiAKLQlpZiAoZ3Bpb19ucmVzZXQgPj0gMCkKLQkJaWYgKGRldm1fZ3Bpb19yZXF1ZXN0KGNvZGVjLT5kZXYsIGdwaW9fbnJlc2V0LCAiQ1M0MjcxIFJlc2V0IikpCi0JCQlncGlvX25yZXNldCA9IC1FSU5WQUw7Ci0JaWYgKGdwaW9fbnJlc2V0ID49IDApIHsKKwlpZiAoZ3Bpb19pc192YWxpZChjczQyNzEtPmdwaW9fbnJlc2V0KSkgewogCQkvKiBSZXNldCBjb2RlYyAqLwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpb19ucmVzZXQsIDApOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoY3M0MjcxLT5ncGlvX25yZXNldCwgMCk7CiAJCXVkZWxheSgxKTsKLQkJZ3Bpb19zZXRfdmFsdWUoZ3Bpb19ucmVzZXQsIDEpOworCQlncGlvX3NldF92YWx1ZShjczQyNzEtPmdwaW9fbnJlc2V0LCAxKTsKIAkJLyogR2l2ZSB0aGUgY29kZWMgdGltZSB0byB3YWtlIHVwICovCiAJCXVkZWxheSgxKTsKIAl9CiAKLQljczQyNzEtPmdwaW9fbnJlc2V0ID0gZ3Bpb19ucmVzZXQ7Ci0KIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY3M0MjcxLT5yZWdtYXAsIENTNDI3MV9NT0RFMiwKIAkJCQkgQ1M0MjcxX01PREUyX1BETiB8IENTNDI3MV9NT0RFMl9DUEVOLAogCQkJCSBDUzQyNzFfTU9ERTJfUEROIHwgQ1M0MjcxX01PREUyX0NQRU4pOwpAQCAtNjI1LDYgKzYxMiwzNiBAQAogCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDI3MV9kYXBtX3JvdXRlcyksCiB9OwogCitzdGF0aWMgaW50IGNzNDI3MV9jb21tb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqKmMpCit7CisJc3RydWN0IGNzNDI3MV9wbGF0Zm9ybV9kYXRhICpjczQyNzFwbGF0ID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxOworCisJY3M0MjcxID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjczQyNzEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNzNDI3MSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAob2ZfbWF0Y2hfZGV2aWNlKGNzNDI3MV9kdF9pZHMsIGRldikpCisJCWNzNDI3MS0+Z3Bpb19ucmVzZXQgPQorCQkJb2ZfZ2V0X25hbWVkX2dwaW8oZGV2LT5vZl9ub2RlLCAicmVzZXQtZ3BpbyIsIDApOworCisJaWYgKGNzNDI3MXBsYXQpCisJCWNzNDI3MS0+Z3Bpb19ucmVzZXQgPSBjczQyNzFwbGF0LT5ncGlvX25yZXNldDsKKworCWlmIChncGlvX2lzX3ZhbGlkKGNzNDI3MS0+Z3Bpb19ucmVzZXQpKSB7CisJCWludCByZXQ7CisKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3QoZGV2LCBjczQyNzEtPmdwaW9fbnJlc2V0LAorCQkJCQkiQ1M0MjcxIFJlc2V0Iik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkqYyA9IGNzNDI3MTsKKwlyZXR1cm4gMDsKK30KKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQyNzFfc3BpX3JlZ21hcCA9IHsKQEAgLTY0NCwxMCArNjYxLDExIEBACiBzdGF0aWMgaW50IGNzNDI3MV9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgY3M0MjcxX3ByaXZhdGUgKmNzNDI3MTsKKwlpbnQgcmV0OwogCi0JY3M0MjcxID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpjczQyNzEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNzNDI3MSkKLQkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gY3M0MjcxX2NvbW1vbl9wcm9iZSgmc3BpLT5kZXYsICZjczQyNzEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgY3M0MjcxKTsKIAljczQyNzEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmNzNDI3MV9zcGlfcmVnbWFwKTsKQEAgLTY5OCwxMCArNzE2LDExIEBACiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxOworCWludCByZXQ7CiAKLQljczQyNzEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmNzNDI3MSksIEdGUF9LRVJORUwpOwotCWlmICghY3M0MjcxKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBjczQyNzFfY29tbW9uX3Byb2JlKCZjbGllbnQtPmRldiwgJmNzNDI3MSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjczQyNzEpOwogCWNzNDI3MS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmY3M0MjcxX2kyY19yZWdtYXApOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwppbmRleCA2ZTllYTgzLi42YzBkYTJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KIAogI2luY2x1ZGUgImNzNDJsNTEuaCIKIApAQCAtNDAsNyArNDEsNiBAQAogfTsKIAogc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSB7Ci0JZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJdW5zaWduZWQgaW50IG1jbGs7CiAJdW5zaWduZWQgaW50IGF1ZGlvX21vZGU7CS8qIFRoZSBtb2RlIChJMlMgb3IgbGVmdC1qdXN0aWZpZWQpICovCiAJZW51bSBtYXN0ZXJfc2xhdmVfbW9kZSBmdW5jOwpAQCAtNTIsMjQgKzUyLDYgQEAKIAkJU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0JFIHwgXAogCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSAgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSkKIAotc3RhdGljIGludCBjczQybDUxX2ZpbGxfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXU4ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGUgKyAxOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKLQlzMzIgbGVuZ3RoOwotCi0JbGVuZ3RoID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoaTJjX2NsaWVudCwKLQkJCUNTNDJMNTFfRklSU1RSRUcgfCAweDgwLCBDUzQyTDUxX05VTVJFR1MsIGNhY2hlKTsKLQlpZiAobGVuZ3RoICE9IENTNDJMNTFfTlVNUkVHUykgewotCQlkZXZfZXJyKCZpMmNfY2xpZW50LT5kZXYsCi0JCQkJIkkyQyByZWFkIGZhaWx1cmUsIGFkZHI9MHgleCAocmV0PSVkIHZzICVkKVxuIiwKLQkJCQlpMmNfY2xpZW50LT5hZGRyLCBsZW5ndGgsIENTNDJMNTFfTlVNUkVHUyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGNzNDJsNTFfZ2V0X2NoYW5fbWl4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CkBAIC0xMjQsOSArMTA2LDggQEAKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY19wY21fdGx2LCAtNTE1MCwgNTAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHRvbmVfdGx2LCAtMTA1MCwgMTUwLCAwKTsKLS8qIFRoaXMgaXMgYSBsaWUuIGFmdGVyIC0xMDIgZGIsIGl0IHN0YXlzIGF0IC0xMDIgKi8KLS8qIG1heWJlIGEgcmFuZ2Ugd291bGQgYmUgYmV0dGVyICovCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW91dF90bHYsIC0xMTU1MCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW91dF90bHYsIC0xMDIwMCwgNTAsIDApOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYm9vc3RfdGx2LCAxNjAwLCAxNjAwLCAwKTsKIHN0YXRpYyBjb25zdCBjaGFyICpjaGFuX21peFtdID0gewpAQCAtMTM1LDEzICsxMTYsMTIgQEAKIAkiUiBMIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9jaGFuX21peCA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGNoYW5fbWl4KSwgY2hhbl9taXgpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChjczQybDUxX2NoYW5fbWl4LCBjaGFuX21peCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczQybDUxX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfUl9TWF9UTFYoIlBDTSBQbGF5YmFjayBWb2x1bWUiLAogCQkJQ1M0Mkw1MV9QQ01BX1ZPTCwgQ1M0Mkw1MV9QQ01CX1ZPTCwKLQkJCTYsIDB4MTksIDB4N0YsIGFkY19wY21fdGx2KSwKKwkJCTAsIDB4MTksIDB4N0YsIGFkY19wY21fdGx2KSwKIAlTT0NfRE9VQkxFX1IoIlBDTSBQbGF5YmFjayBTd2l0Y2giLAogCQkJQ1M0Mkw1MV9QQ01BX1ZPTCwgQ1M0Mkw1MV9QQ01CX1ZPTCwgNywgMSwgMSksCiAJU09DX0RPVUJMRV9SX1NYX1RMVigiQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsCkBAIC0xNDksNyArMTI5LDcgQEAKIAkJCTAsIDB4MzQsIDB4RTQsIGFvdXRfdGx2KSwKIAlTT0NfRE9VQkxFX1JfU1hfVExWKCJBREMgTWl4ZXIgVm9sdW1lIiwKIAkJCUNTNDJMNTFfQURDQV9WT0wsIENTNDJMNTFfQURDQl9WT0wsCi0JCQk2LCAweDE5LCAweDdGLCBhZGNfcGNtX3RsdiksCisJCQkwLCAweDE5LCAweDdGLCBhZGNfcGNtX3RsdiksCiAJU09DX0RPVUJMRV9SKCJBREMgTWl4ZXIgU3dpdGNoIiwKIAkJCUNTNDJMNTFfQURDQV9WT0wsIENTNDJMNTFfQURDQl9WT0wsIDcsIDEsIDEpLAogCVNPQ19TSU5HTEUoIlBsYXliYWNrIERlZW1waGFzaXMgU3dpdGNoIiwgQ1M0Mkw1MV9EQUNfQ1RMLCAzLCAxLCAwKSwKQEAgLTE5MiwyMiArMTcyLDIyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpjczQybDUxX2RhY19uYW1lc1tdID0geyJEaXJlY3QgUENNIiwKIAkiRFNQIFBDTSIsICJBREMifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9kYWNfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUxX0RBQ19DVEwsIDYsIDMsIGNzNDJsNTFfZGFjX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjczQybDUxX2RhY19tdXhfZW51bSwKKwkJCSAgICBDUzQyTDUxX0RBQ19DVEwsIDYsIGNzNDJsNTFfZGFjX25hbWVzKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczQybDUxX2RhY19tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgY3M0Mmw1MV9kYWNfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY3M0Mmw1MV9hZGNsX25hbWVzW10gPSB7IkFJTjEgTGVmdCIsICJBSU4yIExlZnQiLAogCSJNSUMgTGVmdCIsICJNSUMrcHJlYW1wIExlZnQifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY3M0Mmw1MV9hZGNsX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1MV9BRENfSU5QVVQsIDQsIDQsIGNzNDJsNTFfYWRjbF9uYW1lcyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY3M0Mmw1MV9hZGNsX211eF9lbnVtLAorCQkJICAgIENTNDJMNTFfQURDX0lOUFVULCA0LCBjczQybDUxX2FkY2xfbmFtZXMpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzNDJsNTFfYWRjbF9tdXhfY29udHJvbHMgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgY3M0Mmw1MV9hZGNsX211eF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNzNDJsNTFfYWRjcl9uYW1lc1tdID0geyJBSU4xIFJpZ2h0IiwgIkFJTjIgUmlnaHQiLAogCSJNSUMgUmlnaHQiLCAiTUlDK3ByZWFtcCBSaWdodCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjczQybDUxX2FkY3JfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUxX0FEQ19JTlBVVCwgNiwgNCwgY3M0Mmw1MV9hZGNyX25hbWVzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjczQybDUxX2FkY3JfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw1MV9BRENfSU5QVVQsIDYsIGNzNDJsNTFfYWRjcl9uYW1lcyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3M0Mmw1MV9hZGNyX211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBjczQybDUxX2FkY3JfbXV4X2VudW0pOwogCkBAIC01MDUsMjEgKzQ4NSw4IEBACiAKIHN0YXRpYyBpbnQgY3M0Mmw1MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSAqY3M0Mmw1MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQsIHJlZzsKIAotCXJldCA9IGNzNDJsNTFfZmlsbF9jYWNoZShjb2RlYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIGZpbGwgcmVnaXN0ZXIgY2FjaGVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBjczQybDUxLT5jb250cm9sX3R5cGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKgogCSAqIERBQyBjb25maWd1cmF0aW9uCiAJICogLSBVc2Ugc2lnbmFsIHByb2Nlc3NvcgpAQCAtNTM4LDggKzUwNSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9jczQybDUxID0gewogCS5wcm9iZSA9IGNzNDJsNTFfcHJvYmUsCi0JLnJlZ19jYWNoZV9zaXplID0gQ1M0Mkw1MV9OVU1SRUdTICsgMSwKLQkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1OCksCiAKIAkuY29udHJvbHMgPSBjczQybDUxX3NuZF9jb250cm9scywKIAkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQybDUxX3NuZF9jb250cm9scyksCkBAIC01NDksMzggKzUxNCw1MyBAQAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJsNTFfcm91dGVzKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQybDUxX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gQ1M0Mkw1MV9DSEFSR0VfRlJFUSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CisKIHN0YXRpYyBpbnQgY3M0Mmw1MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQsCiAJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBjczQybDUxX3ByaXZhdGUgKmNzNDJsNTE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXVuc2lnbmVkIGludCB2YWw7CiAJaW50IHJldDsKIAorCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyY19jbGllbnQsICZjczQybDUxX3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJZGV2X2VycigmaTJjX2NsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSByZWdtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAkvKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgQ1M0Mkw1MSAqLwotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpMmNfY2xpZW50LCBDUzQyTDUxX0NISVBfUkVWX0lEKTsKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIENTNDJMNTFfQ0hJUF9SRVZfSUQsICZ2YWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgImZhaWxlZCB0byByZWFkIEkyQ1xuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKChyZXQgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQSkpICYmCi0JICAgIChyZXQgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQikpKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZFxuIik7CisJaWYgKCh2YWwgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQSkpICYmCisJICAgICh2YWwgIT0gQ1M0Mkw1MV9NS19DSElQX1JFVihDUzQyTDUxX0NISVBfSUQsIENTNDJMNTFfQ0hJUF9SRVZfQikpKSB7CisJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZDogJXhcbiIsIHZhbCk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJZGV2X2luZm8oJmkyY19jbGllbnQtPmRldiwgImZvdW5kIGRldmljZSBjczQybDUxIHJldiAlZFxuIiwKLQkJCQlyZXQgJiA3KTsKKwkJIHZhbCAmIDcpOwogCiAJY3M0Mmw1MSA9IGRldm1fa3phbGxvYygmaTJjX2NsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSksCiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjczQybDUxKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBjb2RlY1xuIik7CisJaWYgKCFjczQybDUxKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgY3M0Mmw1MSk7Ci0JY3M0Mmw1MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjX2NsaWVudC0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZpY2VfY3M0Mmw1MSwgJmNzNDJsNTFfZGFpLCAxKTsKQEAgLTYwMCwxMCArNTgwLDE3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNzNDJsNTFfaWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjczQybDUxX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJjaXJydXMsY3M0Mmw1MSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY3M0Mmw1MV9vZl9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBjczQybDUxX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiY3M0Mmw1MS1jb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBjczQybDUxX29mX21hdGNoLAogCX0sCiAJLmlkX3RhYmxlID0gY3M0Mmw1MV9pZCwKIAkucHJvYmUgPSBjczQybDUxX2kyY19wcm9iZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKaW5kZXggMGJhYzZkNS4uZjBjYTZiZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKQEAgLTIxMCwxMyArMjEwLDExIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNTJfYWRjYl90ZXh0W10gPSB7CiAJIklucHV0MUIiLCAiSW5wdXQyQiIsICJJbnB1dDNCIiwgIklucHV0NEIiLCAiUEdBIElucHV0IFJpZ2h0In07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUEdBX0EsIDUsCi0JCUFSUkFZX1NJWkUoY3M0Mmw1Ml9hZGNhX3RleHQpLCBjczQybDUyX2FkY2FfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjYV9lbnVtLAorCQkJICAgIENTNDJMNTJfQURDX1BHQV9BLCA1LCBjczQybDUyX2FkY2FfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjYl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUEdBX0IsIDUsCi0JCUFSUkFZX1NJWkUoY3M0Mmw1Ml9hZGNiX3RleHQpLCBjczQybDUyX2FkY2JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjYl9lbnVtLAorCQkJICAgIENTNDJMNTJfQURDX1BHQV9CLCA1LCBjczQybDUyX2FkY2JfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNhX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBBREMgSW5wdXQgQ2FwdHVyZSBNdXgiLCBhZGNhX2VudW0pOwpAQCAtMjI5LDI2ICsyMjcsMjIgQEAKIAkiMC44ICtWQSIsICIwLjgzICtWQSIsICIwLjkxICtWQSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWljX2JpYXNfbGV2ZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfSUZBQ0VfQ1RMMiwgMCwKLQkJCUFSUkFZX1NJWkUobWljX2JpYXNfbGV2ZWxfdGV4dCksIG1pY19iaWFzX2xldmVsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY19iaWFzX2xldmVsX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9JRkFDRV9DVEwyLCAwLCBtaWNfYmlhc19sZXZlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjczQybDUyX21pY190ZXh0W10gPSB7ICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWljYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9NSUNBX0NUTCwgNSwKLQkJCUFSUkFZX1NJWkUoY3M0Mmw1Ml9taWNfdGV4dCksIGNzNDJsNTJfbWljX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1pY2FfZW51bSwKKwkJCSAgICBDUzQyTDUyX01JQ0FfQ1RMLCA1LCBjczQybDUyX21pY190ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtaWNiX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX01JQ0JfQ1RMLCA1LAotCQkJQVJSQVlfU0laRShjczQybDUyX21pY190ZXh0KSwgY3M0Mmw1Ml9taWNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljYl9lbnVtLAorCQkJICAgIENTNDJMNTJfTUlDQl9DVEwsIDUsIGNzNDJsNTJfbWljX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRpZ2l0YWxfb3V0cHV0X211eF90ZXh0W10gPSB7IkFEQyIsICJEU1AifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkaWdpdGFsX291dHB1dF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX01JU0NfQ1RMLCA2LAotCQkJQVJSQVlfU0laRShkaWdpdGFsX291dHB1dF9tdXhfdGV4dCksCi0JCQlkaWdpdGFsX291dHB1dF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGlnaXRhbF9vdXRwdXRfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9BRENfTUlTQ19DVEwsIDYsCisJCQkgICAgZGlnaXRhbF9vdXRwdXRfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGlnaXRhbF9vdXRwdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEaWdpdGFsIE91dHB1dCBNdXgiLCBkaWdpdGFsX291dHB1dF9tdXhfZW51bSk7CkBAIC0yNTgsMTggKzI1MiwxOCBAQAogCSIwLjcwOTkiLCAiMC44Mzk5IiwgIjEuMDAwIiwgIjEuMTQzMCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaHBfZ2Fpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9QQl9DVEwxLCA1LAotCQlBUlJBWV9TSVpFKGhwX2dhaW5fbnVtX3RleHQpLCBocF9nYWluX251bV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChocF9nYWluX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9QQl9DVEwxLCA1LAorCQkJICAgIGhwX2dhaW5fbnVtX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfcGl0Y2hfdGV4dFtdID0gewogCSJDNCIsICJDNSIsICJENSIsICJFNSIsICJGNSIsICJHNSIsICJBNSIsICJCNSIsCiAJIkM2IiwgIkQ2IiwgIkU2IiwgIkY2IiwgIkc2IiwgIkE2IiwgIkI2IiwgIkM3IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX3BpdGNoX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX0JFRVBfRlJFUSwgNCwKLQkJCUFSUkFZX1NJWkUoYmVlcF9waXRjaF90ZXh0KSwgYmVlcF9waXRjaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX3BpdGNoX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9CRUVQX0ZSRVEsIDQsCisJCQkgICAgYmVlcF9waXRjaF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZWVwX29udGltZV90ZXh0W10gPSB7CiAJIjg2IG1zIiwgIjQzMCBtcyIsICI3ODAgbXMiLCAiMS4yMCBzIiwgIjEuNTAgcyIsCkBAIC0yNzcsNjYgKzI3MSw2NiBAQAogCSIzLjUwIHMiLCAiMy44MCBzIiwgIjQuMjAgcyIsICI0LjUwIHMiLCAiNC44MCBzIiwgIjUuMjAgcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYmVlcF9vbnRpbWVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQkVFUF9GUkVRLCAwLAotCQkJQVJSQVlfU0laRShiZWVwX29udGltZV90ZXh0KSwgYmVlcF9vbnRpbWVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmVlcF9vbnRpbWVfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfRlJFUSwgMCwKKwkJCSAgICBiZWVwX29udGltZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZWVwX29mZnRpbWVfdGV4dFtdID0gewogCSIxLjIzIHMiLCAiMi41OCBzIiwgIjMuOTAgcyIsICI1LjIwIHMiLAogCSI2LjYwIHMiLCAiOC4wNSBzIiwgIjkuMzUgcyIsICIxMC44MCBzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX29mZnRpbWVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfQkVFUF9WT0wsIDUsCi0JCQlBUlJBWV9TSVpFKGJlZXBfb2ZmdGltZV90ZXh0KSwgYmVlcF9vZmZ0aW1lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJlZXBfb2ZmdGltZV9lbnVtLAorCQkJICAgIENTNDJMNTJfQkVFUF9WT0wsIDUsCisJCQkgICAgYmVlcF9vZmZ0aW1lX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfY29uZmlnX3RleHRbXSA9IHsKIAkiT2ZmIiwgIlNpbmdsZSIsICJNdWx0aXBsZSIsICJDb250aW51b3VzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiZWVwX2NvbmZpZ19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9CRUVQX1RPTkVfQ1RMLCA2LAotCQkJQVJSQVlfU0laRShiZWVwX2NvbmZpZ190ZXh0KSwgYmVlcF9jb25maWdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmVlcF9jb25maWdfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDYsCisJCQkgICAgYmVlcF9jb25maWdfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmVlcF9iYXNzX3RleHRbXSA9IHsKIAkiNTAgSHoiLCAiMTAwIEh6IiwgIjIwMCBIeiIsICIyNTAgSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJlZXBfYmFzc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9CRUVQX1RPTkVfQ1RMLCAxLAotCQkJQVJSQVlfU0laRShiZWVwX2Jhc3NfdGV4dCksIGJlZXBfYmFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX2Jhc3NfZW51bSwKKwkJCSAgICBDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDEsCisJCQkgICAgYmVlcF9iYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlZXBfdHJlYmxlX3RleHRbXSA9IHsKIAkiNSBrSHoiLCAiNyBrSHoiLCAiMTAga0h6IiwgIiAxNSBrSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJlZXBfdHJlYmxlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDUyX0JFRVBfVE9ORV9DVEwsIDMsCi0JCQlBUlJBWV9TSVpFKGJlZXBfdHJlYmxlX3RleHQpLCBiZWVwX3RyZWJsZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiZWVwX3RyZWJsZV9lbnVtLAorCQkJICAgIENTNDJMNTJfQkVFUF9UT05FX0NUTCwgMywKKwkJCSAgICBiZWVwX3RyZWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuZ190aHJlc2hvbGRfdGV4dFtdID0gewogCSItMzRkQiIsICItMzdkQiIsICItNDBkQiIsICItNDNkQiIsCiAJIi00NmRCIiwgIi01MmRCIiwgIi01OGRCIiwgIi02NGRCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ190aHJlc2hvbGRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNTJfTk9JU0VfR0FURV9DVEwsIDIsCi0JCUFSUkFZX1NJWkUobmdfdGhyZXNob2xkX3RleHQpLCBuZ190aHJlc2hvbGRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobmdfdGhyZXNob2xkX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMiwKKwkJCSAgICBuZ190aHJlc2hvbGRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3M0Mmw1Ml9uZ19kZWxheV90ZXh0W10gPSB7CiAJIjUwbXMiLCAiMTAwbXMiLCAiMTUwbXMiLCAiMjAwbXMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ19kZWxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMCwKLQkJQVJSQVlfU0laRShjczQybDUyX25nX2RlbGF5X3RleHQpLCBjczQybDUyX25nX2RlbGF5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX2RlbGF5X2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgMCwKKwkJCSAgICBjczQybDUyX25nX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNTJfbmdfdHlwZV90ZXh0W10gPSB7CiAJIkFwcGx5IFNwZWNpZmljIiwgIkFwcGx5IEFsbCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmdfdHlwZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgNiwKLQkJQVJSQVlfU0laRShjczQybDUyX25nX3R5cGVfdGV4dCksIGNzNDJsNTJfbmdfdHlwZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChuZ190eXBlX2VudW0sCisJCQkgICAgQ1M0Mkw1Ml9OT0lTRV9HQVRFX0NUTCwgNiwKKwkJCSAgICBjczQybDUyX25nX3R5cGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGVmdF9zd2FwX3RleHRbXSA9IHsKIAkiTGVmdCIsICJMUiAyIiwgIlJpZ2h0In07CkBAIC0zNDcsNyArMzQxLDcgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3dhcF92YWx1ZXNbXSA9IHsgMCwgMSwgMyB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY2Ffc3dhcF9lbnVtID0KLQlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUENNX01JWEVSLCAyLCAxLAorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDIsIDMsCiAJCQkgICAgICBBUlJBWV9TSVpFKGxlZnRfc3dhcF90ZXh0KSwKIAkJCSAgICAgIGxlZnRfc3dhcF90ZXh0LAogCQkJICAgICAgc3dhcF92YWx1ZXMpOwpAQCAtMzU2LDcgKzM1MCw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhZGNhX3N3YXBfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtYV9zd2FwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDYsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgNiwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUobGVmdF9zd2FwX3RleHQpLAogCQkJICAgICAgbGVmdF9zd2FwX3RleHQsCiAJCQkgICAgICBzd2FwX3ZhbHVlcyk7CkBAIC0zNjUsNyArMzU5LDcgQEAKIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHBjbWFfc3dhcF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNiX3N3YXBfZW51bSA9Ci0JU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgMCwgMSwKKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw1Ml9BRENfUENNX01JWEVSLCAwLCAzLAogCQkJICAgICAgQVJSQVlfU0laRShyaWdodF9zd2FwX3RleHQpLAogCQkJICAgICAgcmlnaHRfc3dhcF90ZXh0LAogCQkJICAgICAgc3dhcF92YWx1ZXMpOwpAQCAtMzc0LDcgKzM2OCw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhZGNiX3N3YXBfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtYl9zd2FwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDUyX0FEQ19QQ01fTUlYRVIsIDQsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNTJfQURDX1BDTV9NSVhFUiwgNCwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUocmlnaHRfc3dhcF90ZXh0KSwKIAkJCSAgICAgIHJpZ2h0X3N3YXBfdGV4dCwKIAkJCSAgICAgIHN3YXBfdmFsdWVzKTsKQEAgLTExMTUsMTQgKzExMDksNyBAQAogc3RhdGljIGludCBjczQybDUyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY3M0Mmw1Ml9wcml2YXRlICpjczQybDUyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBjczQybDUyLT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQogCXJlZ2NhY2hlX2NhY2hlX29ubHkoY3M0Mmw1Mi0+cmVnbWFwLCB0cnVlKTsKIAogCWNzNDJsNTJfYWRkX21pY19jb250cm9scyhjb2RlYyk7CkBAIC0xMTM0LDcgKzExMjEsNyBAQAogCWNzNDJsNTItPnN5c2NsayA9IENTNDJMNTJfREVGQVVMVF9DTEs7CiAJY3M0Mmw1Mi0+Y29uZmlnLmZvcm1hdCA9IENTNDJMNTJfREVGQVVMVF9GT1JNQVQ7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNzNDJsNTJfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw3My5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKaW5kZXggNTQ5ZDVkNi4uMGVlNjBhMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMKQEAgLTI3OCwxMyArMjc4LDEzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfcGdhYV90ZXh0W10gPSB7ICJMaW5lIEEiLCAiTWljIDEiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfcGdhYl90ZXh0W10gPSB7ICJMaW5lIEIiLCAiTWljIDIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGdhYV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19BRENJUEMsIDMsCi0JCUFSUkFZX1NJWkUoY3M0Mmw3M19wZ2FhX3RleHQpLCBjczQybDczX3BnYWFfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocGdhYV9lbnVtLAorCQkJICAgIENTNDJMNzNfQURDSVBDLCAzLAorCQkJICAgIGNzNDJsNzNfcGdhYV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwZ2FiX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDczX0FEQ0lQQywgNywKLQkJQVJSQVlfU0laRShjczQybDczX3BnYWJfdGV4dCksIGNzNDJsNzNfcGdhYl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwZ2FiX2VudW0sCisJCQkgICAgQ1M0Mkw3M19BRENJUEMsIDcsCisJCQkgICAgY3M0Mmw3M19wZ2FiX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGdhYV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQW5hbG9nIElucHV0IENhcHR1cmUgTXV4IiwgcGdhYV9lbnVtKTsKQEAgLTMwOSw5ICszMDksOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjczQybDczX25nX2RlbGF5X3RleHRbXSA9IHsKIAkiNTBtcyIsICIxMDBtcyIsICIxNTBtcyIsICIyMDBtcyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuZ19kZWxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19OR0NBQiwgMCwKLQkJQVJSQVlfU0laRShjczQybDczX25nX2RlbGF5X3RleHQpLCBjczQybDczX25nX2RlbGF5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX2RlbGF5X2VudW0sCisJCQkgICAgQ1M0Mkw3M19OR0NBQiwgMCwKKwkJCSAgICBjczQybDczX25nX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfbW9ub19taXhfdGV4dHNbXSA9IHsKIAkiTGVmdCIsICJSaWdodCIsICJNb25vIE1peCJ9OwpAQCAtMzE5LDcgKzMxOSw3IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNzNDJsNzNfbW9ub19taXhfdmFsdWVzW10gPSB7IDAsIDEsIDIgfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtfYXNwX2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDczX01NSVhDVEwsIDYsIDEsCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNzNfTU1JWENUTCwgNiwgMywKIAkJCSAgICAgIEFSUkFZX1NJWkUoY3M0Mmw3M19tb25vX21peF90ZXh0cyksCiAJCQkgICAgICBjczQybDczX21vbm9fbWl4X3RleHRzLAogCQkJICAgICAgY3M0Mmw3M19tb25vX21peF92YWx1ZXMpOwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBzcGtfeHNwX2VudW0pOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGVzbF9hc3BfZW51bSA9Ci0JU09DX1ZBTFVFX0VOVU1fU0lOR0xFKENTNDJMNzNfTU1JWENUTCwgMiwgNSwKKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NTUlYQ1RMLCAyLCAzLAogCQkJICAgICAgQVJSQVlfU0laRShjczQybDczX21vbm9fbWl4X3RleHRzKSwKIAkJCSAgICAgIGNzNDJsNzNfbW9ub19taXhfdGV4dHMsCiAJCQkgICAgICBjczQybDczX21vbm9fbWl4X3ZhbHVlcyk7CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGVzbF9hc3BfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZXNsX3hzcF9lbnVtID0KLQlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NTUlYQ1RMLCAwLCA3LAorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShDUzQyTDczX01NSVhDVEwsIDAsIDMsCiAJCQkgICAgICBBUlJBWV9TSVpFKGNzNDJsNzNfbW9ub19taXhfdGV4dHMpLAogCQkJICAgICAgY3M0Mmw3M19tb25vX21peF90ZXh0cywKIAkJCSAgICAgIGNzNDJsNzNfbW9ub19taXhfdmFsdWVzKTsKQEAgLTM1NywxOSArMzU3LDE5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzNDJsNzNfaXBfc3dhcF90ZXh0W10gPSB7CiAJIlN0ZXJlbyIsICJNb25vIEEiLCAiTW9ubyBCIiwgIlN3YXAgQS1CIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaXBfc3dhcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQ1M0Mkw3M19NSU9QQywgNiwKLQkJQVJSQVlfU0laRShjczQybDczX2lwX3N3YXBfdGV4dCksIGNzNDJsNzNfaXBfc3dhcF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChpcF9zd2FwX2VudW0sCisJCQkgICAgQ1M0Mkw3M19NSU9QQywgNiwKKwkJCSAgICBjczQybDczX2lwX3N3YXBfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dFtdID0geyJNb25vIiwgIlN0ZXJlbyJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHZzcF9vdXRwdXRfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShDUzQyTDczX01JWEVSQ1RMLCA1LAotCQlBUlJBWV9TSVpFKGNzNDJsNzNfc3BvX21peGVyX3RleHQpLCBjczQybDczX3Nwb19taXhlcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh2c3Bfb3V0cHV0X211eF9lbnVtLAorCQkJICAgIENTNDJMNzNfTUlYRVJDVEwsIDUsCisJCQkgICAgY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0geHNwX291dHB1dF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKENTNDJMNzNfTUlYRVJDVEwsIDQsCi0JCUFSUkFZX1NJWkUoY3M0Mmw3M19zcG9fbWl4ZXJfdGV4dCksIGNzNDJsNzNfc3BvX21peGVyX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHhzcF9vdXRwdXRfbXV4X2VudW0sCisJCQkgICAgQ1M0Mkw3M19NSVhFUkNUTCwgNCwKKwkJCSAgICBjczQybDczX3Nwb19taXhlcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZzcF9vdXRwdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHZzcF9vdXRwdXRfbXV4X2VudW0pOwpAQCAtMTEwOCw3ICsxMTA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBjczQybDczX2FzcmNfcmF0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3M0Mmw3M19hc3JjX3JhdGVzW10gPSB7CiAJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsCiAJMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKIH07CkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCQkJCQkweDdGLCB0cmlzdGF0ZSA8PCA3KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xMl8yNCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTJfMjQgPSB7CiAJLmNvdW50ICA9IEFSUkFZX1NJWkUoY3M0Mmw3M19hc3JjX3JhdGVzKSwKIAkubGlzdCAgID0gY3M0Mmw3M19hc3JjX3JhdGVzLAogfTsKQEAgLTEyNTUsOSArMTI1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNORFJWX1BDTV9SQVRFX0tOT1QgLT4gMTIwMDAsIDI0MDAwIEh6LCBsaW1pdCB3aXRoIGNvbnN0cmFpbnQgbGlzdCAqLwotI2RlZmluZSBDUzQyTDczX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfS05PVCkKLQogCiAjZGVmaW5lIENTNDJMNzNfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfFwKIAlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKQEAgLTEyNzgsMTQgKzEyNzUsMTQgQEAKIAkJCS5zdHJlYW1fbmFtZSA9ICJYU1AgUGxheWJhY2siLAogCQkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IENTNDJMNzNfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAogCQkJLmZvcm1hdHMgPSBDUzQyTDczX0ZPUk1BVFMsCiAJCX0sCiAJCS5jYXB0dXJlID0gewogCQkJLnN0cmVhbV9uYW1lID0gIlhTUCBDYXB0dXJlIiwKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBDUzQyTDczX1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKIAkJCS5mb3JtYXRzID0gQ1M0Mkw3M19GT1JNQVRTLAogCQl9LAogCQkub3BzID0gJmNzNDJsNzNfb3BzLApAQCAtMTI5OCwxNCArMTI5NSwxNCBAQAogCQkJLnN0cmVhbV9uYW1lID0gIkFTUCBQbGF5YmFjayIsCiAJCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQ1M0Mkw3M19SQVRFUywKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCiAJCQkuZm9ybWF0cyA9IENTNDJMNzNfRk9STUFUUywKIAkJfSwKIAkJLmNhcHR1cmUgPSB7CiAJCQkuc3RyZWFtX25hbWUgPSAiQVNQIENhcHR1cmUiLAogCQkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IENTNDJMNzNfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAogCQkJLmZvcm1hdHMgPSBDUzQyTDczX0ZPUk1BVFMsCiAJCX0sCiAJCS5vcHMgPSAmY3M0Mmw3M19vcHMsCkBAIC0xMzE4LDE0ICsxMzE1LDE0IEBACiAJCQkuc3RyZWFtX25hbWUgPSAiVlNQIFBsYXliYWNrIiwKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBDUzQyTDczX1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKIAkJCS5mb3JtYXRzID0gQ1M0Mkw3M19GT1JNQVRTLAogCQl9LAogCQkuY2FwdHVyZSA9IHsKIAkJCS5zdHJlYW1fbmFtZSA9ICJWU1AgQ2FwdHVyZSIsCiAJCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQ1M0Mkw3M19SQVRFUywKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCiAJCQkuZm9ybWF0cyA9IENTNDJMNzNfRk9STUFUUywKIAkJfSwKIAkJLm9wcyA9ICZjczQybDczX29wcywKQEAgLTEzNDgsMTcgKzEzNDUsOCBAQAogCiBzdGF0aWMgaW50IGNzNDJsNzNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7CiAJc3RydWN0IGNzNDJsNzNfcHJpdmF0ZSAqY3M0Mmw3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNzNDJsNzMtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWNzNDJsNzNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCS8qIFNldCBDaGFyZ2UgUHVtcCBGcmVxdWVuY3kgKi8KQEAgLTEzNzEsNyArMTM1OSw3IEBACiAJY3M0Mmw3My0+bWNsa3NlbCA9IENTNDJMNzNfQ0xLSURfTUNMSzE7CiAJY3M0Mmw3My0+bWNsayA9IDA7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNzNDJsNzNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC1pMmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdkY2UyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LWkyYy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIERBSSBJMkMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogQXV0aG9yOiBOaWNvbGluIENoZW4gPEd1YW5neXUuQ2hlbkBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgImNzNDJ4eDguaCIKKworc3RhdGljIGludCBjczQyeHg4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJdTMyIHJldCA9IGNzNDJ4eDhfcHJvYmUoJmkyYy0+ZGV2LAorCQkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmY3M0Mnh4OF9yZWdtYXBfY29uZmlnKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZpMmMtPmRldik7CisJcG1fcmVxdWVzdF9pZGxlKCZpMmMtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmkyYy0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgY3M0Mnh4OF9pMmNfaWRbXSA9IHsKKwl7ImNzNDI0NDgiLCAoa2VybmVsX3Vsb25nX3QpJmNzNDI0NDhfZGF0YX0sCisJeyJjczQyODg4IiwgKGtlcm5lbF91bG9uZ190KSZjczQyODg4X2RhdGF9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNzNDJ4eDhfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGNzNDJ4eDhfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjczQyeHg4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZjczQyeHg4X3BtLAorCX0sCisJLnByb2JlID0gY3M0Mnh4OF9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IGNzNDJ4eDhfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBjczQyeHg4X2kyY19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGNzNDJ4eDhfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ2lycnVzIExvZ2ljIENTNDI0NDgvQ1M0Mjg4OCBBTFNBIFNvQyBDb2RlYyBJMkMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODIyOTlhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMKQEAgLTAsMCArMSw2MDIgQEAKKy8qCisgKiBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlIChEQUkpIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogTmljb2xpbiBDaGVuIDxHdWFuZ3l1LkNoZW5AZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJjczQyeHg4LmgiCisKKyNkZWZpbmUgQ1M0MlhYOF9OVU1fU1VQUExJRVMgNAorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNzNDJ4eDhfc3VwcGx5X25hbWVzW0NTNDJYWDhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiVkEiLAorCSJWRCIsCisJIlZMUyIsCisJIlZMQyIsCit9OworCisjZGVmaW5lIENTNDJYWDhfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCisJCQkgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBjczQyeHg4X3ByaXYgeworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0NTNDJYWDhfTlVNX1NVUFBMSUVTXTsKKwljb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSAqZHJ2ZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqY2xrOworCisJYm9vbCBzbGF2ZV9tb2RlOworCXVuc2lnbmVkIGxvbmcgc3lzY2xrOworfTsKKworLyogLTEyNy41ZEIgdG8gMGRCIHdpdGggc3RlcCBvZiAwLjVkQiAqLworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRhY190bHYsIC0xMjc1MCwgNTAsIDEpOworLyogLTY0ZEIgdG8gMjRkQiB3aXRoIHN0ZXAgb2YgMC41ZEIgKi8KK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfdGx2LCAtNjQwMCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY3M0Mnh4OF9hZGNfc2luZ2xlW10gPSB7ICJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLUVuZGVkIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNzNDJ4eDhfc3pjW10gPSB7ICJJbW1lZGlhdGUgQ2hhbmdlIiwgIlplcm8gQ3Jvc3MiLAorCQkJCQkiU29mdCBSYW1wIiwgIlNvZnQgUmFtcCBvbiBaZXJvIENyb3NzIiB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzFfc2luZ2xlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShDUzQyWFg4X0FEQ0NUTCwgNCwgMiwgY3M0Mnh4OF9hZGNfc2luZ2xlKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjMl9zaW5nbGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKENTNDJYWDhfQURDQ1RMLCAzLCAyLCBjczQyeHg4X2FkY19zaW5nbGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGMzX3NpbmdsZV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQ1M0MlhYOF9BRENDVEwsIDIsIDIsIGNzNDJ4eDhfYWRjX3NpbmdsZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19zemNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKENTNDJYWDhfVFhDVEwsIDUsIDQsIGNzNDJ4eDhfc3pjKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX3N6Y19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQ1M0MlhYOF9UWENUTCwgMCwgNCwgY3M0Mnh4OF9zemMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3M0Mnh4OF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUMxIFBsYXliYWNrIFZvbHVtZSIsIENTNDJYWDhfVk9MQU9VVDEsCisJCQkgQ1M0MlhYOF9WT0xBT1VUMiwgMCwgMHhmZiwgMSwgZGFjX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiREFDMiBQbGF5YmFjayBWb2x1bWUiLCBDUzQyWFg4X1ZPTEFPVVQzLAorCQkJIENTNDJYWDhfVk9MQU9VVDQsIDAsIDB4ZmYsIDEsIGRhY190bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzMgUGxheWJhY2sgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBT1VUNSwKKwkJCSBDUzQyWFg4X1ZPTEFPVVQ2LCAwLCAweGZmLCAxLCBkYWNfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUM0IFBsYXliYWNrIFZvbHVtZSIsIENTNDJYWDhfVk9MQU9VVDcsCisJCQkgQ1M0MlhYOF9WT0xBT1VUOCwgMCwgMHhmZiwgMSwgZGFjX3RsdiksCisJU09DX0RPVUJMRV9SX1NfVExWKCJBREMxIENhcHR1cmUgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBSU4xLAorCQkJICAgQ1M0MlhYOF9WT0xBSU4yLCAwLCAtMHg4MCwgMHgzMCwgNywgMCwgYWRjX3RsdiksCisJU09DX0RPVUJMRV9SX1NfVExWKCJBREMyIENhcHR1cmUgVm9sdW1lIiwgQ1M0MlhYOF9WT0xBSU4zLAorCQkJICAgQ1M0MlhYOF9WT0xBSU40LCAwLCAtMHg4MCwgMHgzMCwgNywgMCwgYWRjX3RsdiksCisJU09DX0RPVUJMRSgiREFDMSBJbnZlcnQgU3dpdGNoIiwgQ1M0MlhYOF9EQUNJTlYsIDAsIDEsIDEsIDApLAorCVNPQ19ET1VCTEUoIkRBQzIgSW52ZXJ0IFN3aXRjaCIsIENTNDJYWDhfREFDSU5WLCAyLCAzLCAxLCAwKSwKKwlTT0NfRE9VQkxFKCJEQUMzIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0RBQ0lOViwgNCwgNSwgMSwgMCksCisJU09DX0RPVUJMRSgiREFDNCBJbnZlcnQgU3dpdGNoIiwgQ1M0MlhYOF9EQUNJTlYsIDYsIDcsIDEsIDApLAorCVNPQ19ET1VCTEUoIkFEQzEgSW52ZXJ0IFN3aXRjaCIsIENTNDJYWDhfQURDSU5WLCAwLCAxLCAxLCAwKSwKKwlTT0NfRE9VQkxFKCJBREMyIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0FEQ0lOViwgMiwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIEhpZ2gtUGFzcyBGaWx0ZXIgU3dpdGNoIiwgQ1M0MlhYOF9BRENDVEwsIDcsIDEsIDEpLAorCVNPQ19TSU5HTEUoIkRBQyBEZS1lbXBoYXNpcyBTd2l0Y2giLCBDUzQyWFg4X0FEQ0NUTCwgNSwgMSwgMCksCisJU09DX0VOVU0oIkFEQzEgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjMV9zaW5nbGVfZW51bSksCisJU09DX0VOVU0oIkFEQzIgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjMl9zaW5nbGVfZW51bSksCisJU09DX1NJTkdMRSgiREFDIFNpbmdsZSBWb2x1bWUgQ29udHJvbCBTd2l0Y2giLCBDUzQyWFg4X1RYQ1RMLCA3LCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDIFNvZnQgUmFtcCAmIFplcm8gQ3Jvc3MgQ29udHJvbCBTd2l0Y2giLCBkYWNfc3pjX2VudW0pLAorCVNPQ19TSU5HTEUoIkRBQyBBdXRvIE11dGUgU3dpdGNoIiwgQ1M0MlhYOF9UWENUTCwgNCwgMSwgMCksCisJU09DX1NJTkdMRSgiTXV0ZSBBREMgU2VyaWFsIFBvcnQgU3dpdGNoIiwgQ1M0MlhYOF9UWENUTCwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIFNpbmdsZSBWb2x1bWUgQ29udHJvbCBTd2l0Y2giLCBDUzQyWFg4X1RYQ1RMLCAyLCAxLCAwKSwKKwlTT0NfRU5VTSgiQURDIFNvZnQgUmFtcCAmIFplcm8gQ3Jvc3MgQ29udHJvbCBTd2l0Y2giLCBhZGNfc3pjX2VudW0pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzNDJ4eDhfYWRjM19zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQzMgQ2FwdHVyZSBWb2x1bWUiLCBDUzQyWFg4X1ZPTEFJTjUsCisJCQkgICBDUzQyWFg4X1ZPTEFJTjYsIDAsIC0weDgwLCAweDMwLCA3LCAwLCBhZGNfdGx2KSwKKwlTT0NfRE9VQkxFKCJBREMzIEludmVydCBTd2l0Y2giLCBDUzQyWFg4X0FEQ0lOViwgNCwgNSwgMSwgMCksCisJU09DX0VOVU0oIkFEQzMgU2luZ2xlIEVuZGVkIE1vZGUgU3dpdGNoIiwgYWRjM19zaW5nbGVfZW51bSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgY3M0Mnh4OF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMxIiwgIlBsYXliYWNrIiwgQ1M0MlhYOF9QV1JDVEwsIDEsIDEpLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQzIiLCAiUGxheWJhY2siLCBDUzQyWFg4X1BXUkNUTCwgMiwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDMyIsICJQbGF5YmFjayIsIENTNDJYWDhfUFdSQ1RMLCAzLCAxKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUM0IiwgIlBsYXliYWNrIiwgQ1M0MlhYOF9QV1JDVEwsIDQsIDEpLAorCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDFMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDJMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDJSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDNMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDNSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDRMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU9VVDRSIiksCisKKwlTTkRfU09DX0RBUE1fQURDKCJBREMxIiwgIkNhcHR1cmUiLCBDUzQyWFg4X1BXUkNUTCwgNSwgMSksCisJU05EX1NPQ19EQVBNX0FEQygiQURDMiIsICJDYXB0dXJlIiwgQ1M0MlhYOF9QV1JDVEwsIDYsIDEpLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOMVIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjJMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yUiIpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUFdSIiwgQ1M0MlhYOF9QV1JDVEwsIDAsIDEsIE5VTEwsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGNzNDJ4eDhfYWRjM19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQURDKCJBREMzIiwgIkNhcHR1cmUiLCBDUzQyWFg4X1BXUkNUTCwgNywgMSksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjNMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4zUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY3M0Mnh4OF9kYXBtX3JvdXRlc1tdID0geworCS8qIFBsYXliYWNrICovCisJeyAiQU9VVDFMIiwgTlVMTCwgIkRBQzEiIH0sCisJeyAiQU9VVDFSIiwgTlVMTCwgIkRBQzEiIH0sCisJeyAiREFDMSIsIE5VTEwsICJQV1IiIH0sCisKKwl7ICJBT1VUMkwiLCBOVUxMLCAiREFDMiIgfSwKKwl7ICJBT1VUMlIiLCBOVUxMLCAiREFDMiIgfSwKKwl7ICJEQUMyIiwgTlVMTCwgIlBXUiIgfSwKKworCXsgIkFPVVQzTCIsIE5VTEwsICJEQUMzIiB9LAorCXsgIkFPVVQzUiIsIE5VTEwsICJEQUMzIiB9LAorCXsgIkRBQzMiLCBOVUxMLCAiUFdSIiB9LAorCisJeyAiQU9VVDRMIiwgTlVMTCwgIkRBQzQiIH0sCisJeyAiQU9VVDRSIiwgTlVMTCwgIkRBQzQiIH0sCisJeyAiREFDNCIsIE5VTEwsICJQV1IiIH0sCisKKwkvKiBDYXB0dXJlICovCisJeyAiQURDMSIsIE5VTEwsICJBSU4xTCIgfSwKKwl7ICJBREMxIiwgTlVMTCwgIkFJTjFSIiB9LAorCXsgIkFEQzEiLCBOVUxMLCAiUFdSIiB9LAorCisJeyAiQURDMiIsIE5VTEwsICJBSU4yTCIgfSwKKwl7ICJBREMyIiwgTlVMTCwgIkFJTjJSIiB9LAorCXsgIkFEQzIiLCBOVUxMLCAiUFdSIiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY3M0Mnh4OF9hZGMzX2RhcG1fcm91dGVzW10gPSB7CisJLyogQ2FwdHVyZSAqLworCXsgIkFEQzMiLCBOVUxMLCAiQUlOM0wiIH0sCisJeyAiQURDMyIsIE5VTEwsICJBSU4zUiIgfSwKKwl7ICJBREMzIiwgTlVMTCwgIlBXUiIgfSwKK307CisKK3N0cnVjdCBjczQyeHg4X3JhdGlvcyB7CisJdW5zaWduZWQgaW50IHJhdGlvOworCXVuc2lnbmVkIGNoYXIgc3BlZWQ7CisJdW5zaWduZWQgY2hhciBtY2xrOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjczQyeHg4X3JhdGlvcyBjczQyeHg4X3JhdGlvc1tdID0geworCXsgNjQsIENTNDJYWDhfRk1fUVVBRCwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzI1Nig0KSB9LAorCXsgOTYsIENTNDJYWDhfRk1fUVVBRCwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzM4NCg0KSB9LAorCXsgMTI4LCBDUzQyWFg4X0ZNX1FVQUQsIENTNDJYWDhfRlVOQ01PRF9NRlJFUV81MTIoNCkgfSwKKwl7IDE5MiwgQ1M0MlhYOF9GTV9RVUFELCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNzY4KDQpIH0sCisJeyAyNTYsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMjU2KDEpIH0sCisJeyAzODQsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMzg0KDEpIH0sCisJeyA1MTIsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNTEyKDEpIH0sCisJeyA3NjgsIENTNDJYWDhfRk1fU0lOR0xFLCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfNzY4KDEpIH0sCisJeyAxMDI0LCBDUzQyWFg4X0ZNX1NJTkdMRSwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzEwMjQoMSkgfQorfTsKKworc3RhdGljIGludCBjczQyeHg4X3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJCSAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwljczQyeHg4LT5zeXNjbGsgPSBmcmVxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M0Mnh4OF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IGNzNDJ4eDhfcHJpdiAqY3M0Mnh4OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUzMiB2YWw7CisKKwkvKiBTZXQgREFJIGZvcm1hdCAqLworCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJdmFsID0gQ1M0MlhYOF9JTlRGX0RBQ19ESUZfTEVGVEogfCBDUzQyWFg4X0lOVEZfQURDX0RJRl9MRUZUSjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCXZhbCA9IENTNDJYWDhfSU5URl9EQUNfRElGX0kyUyB8IENTNDJYWDhfSU5URl9BRENfRElGX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQl2YWwgPSBDUzQyWFg4X0lOVEZfREFDX0RJRl9SSUdIVEogfCBDUzQyWFg4X0lOVEZfQURDX0RJRl9SSUdIVEo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgInVuc3VwcG9ydGVkIGRhaSBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0lOVEYsCisJCQkgICBDUzQyWFg4X0lOVEZfREFDX0RJRl9NQVNLIHwKKwkJCSAgIENTNDJYWDhfSU5URl9BRENfRElGX01BU0ssIHZhbCk7CisKKwkvKiBTZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWNzNDJ4eDgtPnNsYXZlX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWNzNDJ4eDgtPnNsYXZlX21vZGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgbWFzdGVyL3NsYXZlIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBjczQyeHg4X3ByaXYgKmNzNDJ4eDggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlib29sIHR4ID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwl1MzIgcmF0aW8gPSBjczQyeHg4LT5zeXNjbGsgLyBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXUzMiBpLCBmbSwgdmFsLCBtYXNrOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M0Mnh4OF9yYXRpb3MpOyBpKyspIHsKKwkJaWYgKGNzNDJ4eDhfcmF0aW9zW2ldLnJhdGlvID09IHJhdGlvKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShjczQyeHg4X3JhdGlvcykpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgc3lzY2xrIHJhdGlvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFzayA9IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9NQVNLOworCXZhbCA9IGNzNDJ4eDhfcmF0aW9zW2ldLm1jbGs7CisKKwlmbSA9IGNzNDJ4eDgtPnNsYXZlX21vZGUgPyBDUzQyWFg4X0ZNX0FVVE8gOiBjczQyeHg4X3JhdGlvc1tpXS5zcGVlZDsKKworCXJlZ21hcF91cGRhdGVfYml0cyhjczQyeHg4LT5yZWdtYXAsIENTNDJYWDhfRlVOQ01PRCwKKwkJCSAgIENTNDJYWDhfRlVOQ01PRF94Q19GTV9NQVNLKHR4KSB8IG1hc2ssCisJCQkgICBDUzQyWFg4X0ZVTkNNT0RfeENfRk0odHgsIGZtKSB8IHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQyeHg4X2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0RBQ01VVEUsCisJCQkgICBDUzQyWFg4X0RBQ01VVEVfQUxMLCBtdXRlID8gQ1M0MlhYOF9EQUNNVVRFX0FMTCA6IDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGNzNDJ4eDhfZGFpX29wcyA9IHsKKwkuc2V0X2ZtdAk9IGNzNDJ4eDhfc2V0X2RhaV9mbXQsCisJLnNldF9zeXNjbGsJPSBjczQyeHg4X3NldF9kYWlfc3lzY2xrLAorCS5od19wYXJhbXMJPSBjczQyeHg4X2h3X3BhcmFtcywKKwkuZGlnaXRhbF9tdXRlCT0gY3M0Mnh4OF9kaWdpdGFsX211dGUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBjczQyeHg4X2RhaSA9IHsKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5mb3JtYXRzID0gQ1M0MlhYOF9GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCQkuZm9ybWF0cyA9IENTNDJYWDhfRk9STUFUUywKKwl9LAorCS5vcHMgPSAmY3M0Mnh4OF9kYWlfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBjczQyeHg4X3JlZ1tdID0geworCXsgMHgwMSwgMHgwMSB9LCAgIC8qIENoaXAgSS5ELiBhbmQgUmV2aXNpb24gUmVnaXN0ZXIgKi8KKwl7IDB4MDIsIDB4MDAgfSwgICAvKiBQb3dlciBDb250cm9sICovCisJeyAweDAzLCAweEYwIH0sICAgLyogRnVuY3Rpb25hbCBNb2RlICovCisJeyAweDA0LCAweDQ2IH0sICAgLyogSW50ZXJmYWNlIEZvcm1hdHMgKi8KKwl7IDB4MDUsIDB4MDAgfSwgICAvKiBBREMgQ29udHJvbCAmIERBQyBEZS1FbXBoYXNpcyAqLworCXsgMHgwNiwgMHgxMCB9LCAgIC8qIFRyYW5zaXRpb24gQ29udHJvbCAqLworCXsgMHgwNywgMHgwMCB9LCAgIC8qIERBQyBDaGFubmVsIE11dGUgKi8KKwl7IDB4MDgsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUMSAqLworCXsgMHgwOSwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQyICovCisJeyAweDBhLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQU9VVDMgKi8KKwl7IDB4MGIsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUNCAqLworCXsgMHgwYywgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQ1ICovCisJeyAweDBkLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQU9VVDYgKi8KKwl7IDB4MGUsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBT1VUNyAqLworCXsgMHgwZiwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFPVVQ4ICovCisJeyAweDEwLCAweDAwIH0sICAgLyogREFDIENoYW5uZWwgSW52ZXJ0ICovCisJeyAweDExLCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQUlOMSAqLworCXsgMHgxMiwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFJTjIgKi8KKwl7IDB4MTMsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBSU4zICovCisJeyAweDE0LCAweDAwIH0sICAgLyogVm9sdW1lIENvbnRyb2wgQUlONCAqLworCXsgMHgxNSwgMHgwMCB9LCAgIC8qIFZvbHVtZSBDb250cm9sIEFJTjUgKi8KKwl7IDB4MTYsIDB4MDAgfSwgICAvKiBWb2x1bWUgQ29udHJvbCBBSU42ICovCisJeyAweDE3LCAweDAwIH0sICAgLyogQURDIENoYW5uZWwgSW52ZXJ0ICovCisJeyAweDE4LCAweDAwIH0sICAgLyogU3RhdHVzIENvbnRyb2wgKi8KKwl7IDB4MWEsIDB4MDAgfSwgICAvKiBTdGF0dXMgTWFzayAqLworCXsgMHgxYiwgMHgwMCB9LCAgIC8qIE1VVEVDIFBpbiBDb250cm9sICovCit9OworCitzdGF0aWMgYm9vbCBjczQyeHg4X3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQ1M0MlhYOF9TVEFUVVM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGNzNDJ4eDhfd3JpdGVhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQ1M0MlhYOF9DSElQSUQ6CisJY2FzZSBDUzQyWFg4X1NUQVRVUzoKKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiB0cnVlOworCX0KK30KKworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mnh4OF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5tYXhfcmVnaXN0ZXIgPSBDUzQyWFg4X0xBU1RSRUcsCisJLnJlZ19kZWZhdWx0cyA9IGNzNDJ4eDhfcmVnLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShjczQyeHg4X3JlZyksCisJLnZvbGF0aWxlX3JlZyA9IGNzNDJ4eDhfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLndyaXRlYWJsZV9yZWcgPSBjczQyeHg4X3dyaXRlYWJsZV9yZWdpc3RlciwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyeHg4X3JlZ21hcF9jb25maWcpOworCitzdGF0aWMgaW50IGNzNDJ4eDhfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjczQyeHg4X3ByaXYgKmNzNDJ4eDggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwlzd2l0Y2ggKGNzNDJ4eDgtPmRydmRhdGEtPm51bV9hZGNzKSB7CisJY2FzZSAzOgorCQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgY3M0Mnh4OF9hZGMzX3NuZF9jb250cm9scywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfc25kX2NvbnRyb2xzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgY3M0Mnh4OF9hZGMzX2RhcG1fd2lkZ2V0cywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGNzNDJ4eDhfYWRjM19kYXBtX3JvdXRlcywKKwkJCQkJQVJSQVlfU0laRShjczQyeHg4X2FkYzNfZGFwbV9yb3V0ZXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogTXV0ZSBhbGwgREFDIGNoYW5uZWxzICovCisJcmVnbWFwX3dyaXRlKGNzNDJ4eDgtPnJlZ21hcCwgQ1M0MlhYOF9EQUNNVVRFLCBDUzQyWFg4X0RBQ01VVEVfQUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIGNzNDJ4eDhfZHJpdmVyID0geworCS5wcm9iZSA9IGNzNDJ4eDhfY29kZWNfcHJvYmUsCisJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAorCisJLmNvbnRyb2xzID0gY3M0Mnh4OF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBjczQyeHg4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGNzNDJ4eDhfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3JvdXRlcyksCit9OworCitjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyNDQ4X2RhdGEgPSB7CisJLm5hbWUgPSAiY3M0MjQ0OCIsCisJLm51bV9hZGNzID0gMywKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyNDQ4X2RhdGEpOworCitjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyODg4X2RhdGEgPSB7CisJLm5hbWUgPSAiY3M0Mjg4OCIsCisJLm51bV9hZGNzID0gMiwKK307CitFWFBPUlRfU1lNQk9MX0dQTChjczQyODg4X2RhdGEpOworCitjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNzNDJ4eDhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImNpcnJ1cyxjczQyNDQ4IiwgLmRhdGEgPSAmY3M0MjQ0OF9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2lycnVzLGNzNDI4ODgiLCAuZGF0YSA9ICZjczQyODg4X2RhdGEsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY3M0Mnh4OF9vZl9tYXRjaCk7CitFWFBPUlRfU1lNQk9MX0dQTChjczQyeHg4X29mX21hdGNoKTsKKworaW50IGNzNDJ4eDhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UoY3M0Mnh4OF9vZl9tYXRjaCwgZGV2KTsKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4OworCWludCByZXQsIHZhbCwgaTsKKworCWNzNDJ4eDggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNzNDJ4eDgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3M0Mnh4OCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNzNDJ4eDgpOworCisJaWYgKG9mX2lkKQorCQljczQyeHg4LT5kcnZkYXRhID0gb2ZfaWQtPmRhdGE7CisKKwlpZiAoIWNzNDJ4eDgtPmRydmRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmluZCBkcml2ZXIgZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNzNDJ4eDgtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJtY2xrIik7CisJaWYgKElTX0VSUihjczQyeHg4LT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCB0aGUgY2xvY2s6ICVsZFxuIiwKKwkJCQlQVFJfRVJSKGNzNDJ4eDgtPmNsaykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljczQyeHg4LT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY3M0Mnh4OC0+Y2xrKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKTsgaSsrKQorCQljczQyeHg4LT5zdXBwbGllc1tpXS5zdXBwbHkgPSBjczQyeHg4X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGRldiwKKwkJCUFSUkFZX1NJWkUoY3M0Mnh4OC0+c3VwcGxpZXMpLCBjczQyeHg4LT5zdXBwbGllcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShjczQyeHg4LT5zdXBwbGllcyksCisJCQkJICAgIGNzNDJ4eDgtPnN1cHBsaWVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogTWFrZSBzdXJlIGhhcmR3YXJlIHJlc2V0IGRvbmUgKi8KKwltc2xlZXAoNSk7CisKKwljczQyeHg4LT5yZWdtYXAgPSByZWdtYXA7CisJaWYgKElTX0VSUihjczQyeHg4LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIoY3M0Mnh4OC0+cmVnbWFwKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVnbWFwOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCS8qCisJICogV2UgaGF2ZW4ndCBtYXJrZWQgdGhlIGNoaXAgcmV2aXNpb24gYXMgdm9sYXRpbGUgZHVlIHRvCisJICogc2hhcmluZyBhIHJlZ2lzdGVyIHdpdGggdGhlIHJpZ2h0IGlucHV0IHZvbHVtZTsgZXhwbGljaXRseQorCSAqIGJ5cGFzcyB0aGUgY2FjaGUgdG8gcmVhZCBpdC4KKwkgKi8KKwlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoY3M0Mnh4OC0+cmVnbWFwLCB0cnVlKTsKKworCS8qIFZhbGlkYXRlIHRoZSBjaGlwIElEICovCisJcmVnbWFwX3JlYWQoY3M0Mnh4OC0+cmVnbWFwLCBDUzQyWFg4X0NISVBJRCwgJnZhbCk7CisJaWYgKHZhbCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGRldmljZSBJRDogJXgiLCB2YWwpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJLyogVGhlIHRvcCBmb3VyIGJpdHMgb2YgdGhlIGNoaXAgSUQgc2hvdWxkIGJlIDAwMDAgKi8KKwlpZiAoKHZhbCAmIENTNDJYWDhfQ0hJUElEX0NISVBfSURfTUFTSykgIT0gMHgwMCkgeworCQlkZXZfZXJyKGRldiwgInVubWF0Y2hlZCBjaGlwIElEOiAlZFxuIiwKKwkJCQl2YWwgJiBDUzQyWFg4X0NISVBJRF9DSElQX0lEX01BU0spOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJZGV2X2luZm8oZGV2LCAiZm91bmQgZGV2aWNlLCByZXZpc2lvbiAlWFxuIiwKKwkJCXZhbCAmIENTNDJYWDhfQ0hJUElEX1JFVl9JRF9NQVNLKTsKKworCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhjczQyeHg4LT5yZWdtYXAsIGZhbHNlKTsKKworCWNzNDJ4eDhfZGFpLm5hbWUgPSBjczQyeHg4LT5kcnZkYXRhLT5uYW1lOworCisJLyogRWFjaCBhZGMgc3VwcG9ydHMgc3RlcmVvIGlucHV0ICovCisJY3M0Mnh4OF9kYWkuY2FwdHVyZS5jaGFubmVsc19tYXggPSBjczQyeHg4LT5kcnZkYXRhLT5udW1fYWRjcyAqIDI7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmNzNDJ4eDhfZHJpdmVyLCAmY3M0Mnh4OF9kYWksIDEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWM6JWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2VuYWJsZTsKKwl9CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KGNzNDJ4eDgtPnJlZ21hcCwgdHJ1ZSk7CisKK2Vycl9lbmFibGU6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3M0Mnh4OF9wcm9iZSk7CisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBjczQyeHg4X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3M0Mnh4OF9wcml2ICpjczQyeHg4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShjczQyeHg4LT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIG1jbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCQkgICAgY3M0Mnh4OC0+c3VwcGxpZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSByZXNldCBkb25lICovCisJbXNsZWVwKDUpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShjczQyeHg4LT5yZWdtYXAsIGZhbHNlKTsKKworCXJldCA9IHJlZ2NhY2hlX3N5bmMoY3M0Mnh4OC0+cmVnbWFwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHN5bmMgcmVnbWFwOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfYnVsazsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2J1bGs6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CitlcnJfY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShjczQyeHg4LT5jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjczQyeHg4X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNzNDJ4eDhfcHJpdiAqY3M0Mnh4OCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShjczQyeHg4LT5yZWdtYXAsIHRydWUpOworCisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGNzNDJ4eDgtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBjczQyeHg4LT5zdXBwbGllcyk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY3M0Mnh4OC0+Y2xrKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK2NvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGNzNDJ4eDhfcG0gPSB7CisJU0VUX1JVTlRJTUVfUE1fT1BTKGNzNDJ4eDhfcnVudGltZV9zdXNwZW5kLCBjczQyeHg4X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNzNDJ4eDhfcG0pOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNpcnJ1cyBMb2dpYyBDUzQyNDQ4L0NTNDI4ODggQUxTQSBTb0MgQ29kZWMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmggYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBiOTRhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmgKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBjczQyeHg4LmggLSBDaXJydXMgTG9naWMgQ1M0MjQ0OC9DUzQyODg4IEF1ZGlvIENPREVDIGRyaXZlciBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogTmljb2xpbiBDaGVuIDxHdWFuZ3l1LkNoZW5AZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX0NTNDJYWDhfSAorI2RlZmluZSBfQ1M0MlhYOF9ICisKK3N0cnVjdCBjczQyeHg4X2RyaXZlcl9kYXRhIHsKKwljaGFyIG5hbWVbMzJdOworCWludCBudW1fYWRjczsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBjczQyeHg4X3BtOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjczQyeHg4X2RyaXZlcl9kYXRhIGNzNDI0NDhfZGF0YTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY3M0Mnh4OF9kcml2ZXJfZGF0YSBjczQyODg4X2RhdGE7CitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mnh4OF9yZWdtYXBfY29uZmlnOworaW50IGNzNDJ4eDhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOworCisvKiBDUzQyODg4IHJlZ2lzdGVyIG1hcCAqLworI2RlZmluZSBDUzQyWFg4X0NISVBJRAkJCQkweDAxCS8qIENoaXAgSUQgKi8KKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVEwJCQkJMHgwMgkvKiBQb3dlciBDb250cm9sICovCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRAkJCQkweDAzCS8qIEZ1bmN0aW9uYWwgTW9kZSAqLworI2RlZmluZSBDUzQyWFg4X0lOVEYJCQkJMHgwNAkvKiBJbnRlcmZhY2UgRm9ybWF0cyAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0NUTAkJCQkweDA1CS8qIEFEQyBDb250cm9sICovCisjZGVmaW5lIENTNDJYWDhfVFhDVEwJCQkJMHgwNgkvKiBUcmFuc2l0aW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MlhYOF9EQUNNVVRFCQkJCTB4MDcJLyogREFDIE11dGUgQ29udHJvbCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQxCQkJMHgwOAkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMSAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQyCQkJMHgwOQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMiAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQzCQkJMHgwQQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUMyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ0CQkJMHgwQgkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ1CQkJMHgwQwkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNSAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ2CQkJMHgwRAkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNiAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ3CQkJMHgwRQkvKiBWb2x1bWUgQ29udHJvbCBBT1VUNyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFPVVQ4CQkJMHgwRgkvKiBWb2x1bWUgQ29udHJvbCBBT1VUOCAqLworI2RlZmluZSBDUzQyWFg4X0RBQ0lOVgkJCQkweDEwCS8qIERBQyBDaGFubmVsIEludmVydCAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFJTjEJCQkJMHgxMQkvKiBWb2x1bWUgQ29udHJvbCBBSU4xICovCisjZGVmaW5lIENTNDJYWDhfVk9MQUlOMgkJCQkweDEyCS8qIFZvbHVtZSBDb250cm9sIEFJTjIgKi8KKyNkZWZpbmUgQ1M0MlhYOF9WT0xBSU4zCQkJCTB4MTMJLyogVm9sdW1lIENvbnRyb2wgQUlOMyAqLworI2RlZmluZSBDUzQyWFg4X1ZPTEFJTjQJCQkJMHgxNAkvKiBWb2x1bWUgQ29udHJvbCBBSU40ICovCisjZGVmaW5lIENTNDJYWDhfVk9MQUlONQkJCQkweDE1CS8qIFZvbHVtZSBDb250cm9sIEFJTjUgKi8KKyNkZWZpbmUgQ1M0MlhYOF9WT0xBSU42CQkJCTB4MTYJLyogVm9sdW1lIENvbnRyb2wgQUlONiAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0lOVgkJCQkweDE3CS8qIEFEQyBDaGFubmVsIEludmVydCAqLworI2RlZmluZSBDUzQyWFg4X1NUQVRVU0NUTAkJCTB4MTgJLyogU3RhdHVzIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVMJCQkJMHgxOQkvKiBTdGF0dXMgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNNCQkJCTB4MUEJLyogU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQwkJCQkweDFCCS8qIE1VVEVDIFBpbiBDb250cm9sICovCisKKyNkZWZpbmUgQ1M0MlhYOF9GSVJTVFJFRwkJCUNTNDJYWDhfQ0hJUElECisjZGVmaW5lIENTNDJYWDhfTEFTVFJFRwkJCQlDUzQyWFg4X01VVEVDCisjZGVmaW5lIENTNDJYWDhfTlVNUkVHUwkJCQkoQ1M0MlhYOF9MQVNUUkVHIC0gQ1M0MlhYOF9GSVJTVFJFRyArIDEpCisjZGVmaW5lIENTNDJYWDhfSTJDX0lOQ1IJCQkweDgwCisKKy8qIENoaXAgSS5ELiBhbmQgUmV2aXNpb24gUmVnaXN0ZXIgKEFkZHJlc3MgMDFoKSAqLworI2RlZmluZSBDUzQyWFg4X0NISVBJRF9DSElQX0lEX01BU0sJCTB4RjAKKyNkZWZpbmUgQ1M0MlhYOF9DSElQSURfUkVWX0lEX01BU0sJCTB4MEYKKworLyogUG93ZXIgQ29udHJvbCAoQWRkcmVzcyAwMmgpICovCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUCQk3CisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMwkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9BREMzX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVAkJNgorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9NQVNLCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzIJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fQURDMl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQJCTUKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfTUFTSwkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9BREMxCQkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0FEQzFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUCQk0CisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDNAkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUM0X1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVAkJMworI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19NQVNLCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzMJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fREFDM19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMyCQkJKDEgPDwgQ1M0MlhYOF9QV1JDVExfUEROX0RBQzJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUCQkxCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX01BU0sJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fREFDMQkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9EQUMxX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1BXUkNUTF9QRE5fU0hJRlQJCTAKKyNkZWZpbmUgQ1M0MlhYOF9QV1JDVExfUEROX01BU0sJCQkoMSA8PCBDUzQyWFg4X1BXUkNUTF9QRE5fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfUFdSQ1RMX1BETgkJCSgxIDw8IENTNDJYWDhfUFdSQ1RMX1BETl9TSElGVCkKKworLyogRnVuY3Rpb25hbCBNb2RlIChBZGRyZXNzIDAzaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX0RBQ19GTV9TSElGVAkJNgorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9EQUNfRk1fTUFTSwkJKCgoMSA8PCBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfRlVOQ01PRF9EQUNfRk1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9EQUNfRk0odikJCSgodikgPDwgQ1M0MlhYOF9GVU5DTU9EX0RBQ19GTV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX0FEQ19GTV9TSElGVAkJNAorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9BRENfRk1fTUFTSwkJKCgoMSA8PCBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfRlVOQ01PRF9BRENfRk1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9BRENfRk0odikJCSgodikgPDwgQ1M0MlhYOF9GVU5DTU9EX0FEQ19GTV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX3hDX0ZNX01BU0soeCkJCSgoeCkgPyBDUzQyWFg4X0ZVTkNNT0RfREFDX0ZNX01BU0sgOiBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNX01BU0spCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF94Q19GTSh4LCB2KQkJKCh4KSA/IENTNDJYWDhfRlVOQ01PRF9EQUNfRk0odikgOiBDUzQyWFg4X0ZVTkNNT0RfQURDX0ZNKHYpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQJCTEKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX01GUkVRX1dJRFRICQkzCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV9NQVNLCQkoKCgxIDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9XSURUSCkgLSAxKSA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV8yNTYocykJCSgoMCA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpID4+IChzID4+IDEpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMzg0KHMpCQkoKDEgPDwgQ1M0MlhYOF9GVU5DTU9EX01GUkVRX1NISUZUKSA+PiAocyA+PiAxKSkKKyNkZWZpbmUgQ1M0MlhYOF9GVU5DTU9EX01GUkVRXzUxMihzKQkJKCgyIDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9TSElGVCkgPj4gKHMgPj4gMSkpCisjZGVmaW5lIENTNDJYWDhfRlVOQ01PRF9NRlJFUV83NjgocykJCSgoMyA8PCBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfU0hJRlQpID4+IChzID4+IDEpKQorI2RlZmluZSBDUzQyWFg4X0ZVTkNNT0RfTUZSRVFfMTAyNChzKQkJKCg0IDw8IENTNDJYWDhfRlVOQ01PRF9NRlJFUV9TSElGVCkgPj4gKHMgPj4gMSkpCisKKyNkZWZpbmUgQ1M0MlhYOF9GTV9TSU5HTEUJCQkwCisjZGVmaW5lIENTNDJYWDhfRk1fRE9VQkxFCQkJMQorI2RlZmluZSBDUzQyWFg4X0ZNX1FVQUQJCQkJMgorI2RlZmluZSBDUzQyWFg4X0ZNX0FVVE8JCQkJMworCisvKiBJbnRlcmZhY2UgRm9ybWF0cyAoQWRkcmVzcyAwNGgpICovCisjZGVmaW5lIENTNDJYWDhfSU5URl9GUkVFWkVfU0hJRlQJCTcKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0ZSRUVaRV9NQVNLCQkoMSA8PCBDUzQyWFg4X0lOVEZfRlJFRVpFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfRlJFRVpFCQkJKDEgPDwgQ1M0MlhYOF9JTlRGX0ZSRUVaRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQJCTYKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfTUFTSwkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BVVhfRElGCQkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FVWF9ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUCQkzCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX1dJRFRICQkzCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX01BU0sJCSgoKDEgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX0xFRlRKCQkoMCA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfSTJTCQkoMSA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfUklHSFRKCQkoMiA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfUklHSFRKXzE2CQkoMyA8PCBDUzQyWFg4X0lOVEZfREFDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfT05FTElORV8yMAkJKDQgPDwgQ1M0MlhYOF9JTlRGX0RBQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9EQUNfRElGX09ORUxJTkVfMjQJCSg2IDw8IENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfREFDX0RJRl9URE0JCSg3IDw8IENTNDJYWDhfSU5URl9EQUNfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVAkJMAorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9XSURUSAkJMworI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9NQVNLCQkoKCgxIDw8IENTNDJYWDhfSU5URl9BRENfRElGX1dJRFRIKSAtIDEpIDw8IENTNDJYWDhfSU5URl9BRENfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9MRUZUSgkJKDAgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX0kyUwkJKDEgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX1JJR0hUSgkJKDIgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX1JJR0hUSl8xNgkJKDMgPDwgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfSU5URl9BRENfRElGX09ORUxJTkVfMjAJCSg0IDw8IENTNDJYWDhfSU5URl9BRENfRElGX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0lOVEZfQURDX0RJRl9PTkVMSU5FXzI0CQkoNiA8PCBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9JTlRGX0FEQ19ESUZfVERNCQkoNyA8PCBDUzQyWFg4X0lOVEZfQURDX0RJRl9TSElGVCkKKworLyogQURDIENvbnRyb2wgJiBEQUMgRGUtRW1waGFzaXMgKEFkZHJlc3MgMDVoKSAqLworI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BRENfSFBGX0ZSRUVaRV9TSElGVAk3CisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQ19IUEZfRlJFRVpFX01BU0sJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDX0hQRl9GUkVFWkVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQ19IUEZfRlJFRVpFCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BRENfSFBGX0ZSRUVaRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfREFDX0RFTV9TSElGVAkJNQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9EQUNfREVNX01BU0sJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0RBQ19ERU1fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0RBQ19ERU0JCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9EQUNfREVNX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMxX1NJTkdMRV9TSElGVAk0CisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzFfU0lOR0xFX01BU0sJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0FEQzFfU0lOR0xFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMxX1NJTkdMRQkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDMV9TSU5HTEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzJfU0lOR0xFX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDMl9TSU5HTEVfTUFTSwkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQURDMl9TSU5HTEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FEQzJfU0lOR0xFCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BREMyX1NJTkdMRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDM19TSU5HTEVfU0hJRlQJMgorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BREMzX1NJTkdMRV9NQVNLCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BREMzX1NJTkdMRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQURDM19TSU5HTEUJCSgxIDw8IENTNDJYWDhfQURDQ1RMX0FEQzNfU0lOR0xFX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVAkJMQorI2RlZmluZSBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9NQVNLCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONV9NVVgJCQkoMSA8PCBDUzQyWFg4X0FEQ0NUTF9BSU41X01VWF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQJCTAKKyNkZWZpbmUgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfTUFTSwkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfQURDQ1RMX0FJTjZfTVVYCQkJKDEgPDwgQ1M0MlhYOF9BRENDVExfQUlONl9NVVhfU0hJRlQpCisKKy8qIFRyYW5zaXRpb24gQ29udHJvbCAoQWRkcmVzcyAwNmgpICovCisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NOR1ZPTF9TSElGVAkJNworI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TTkdWT0xfTUFTSwkJKDEgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU05HVk9MX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TTkdWT0wJCSgxIDw8IENTNDJYWDhfVFhDVExfREFDX1NOR1ZPTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUCQk1CisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NaQ19XSURUSAkJMgorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfTUFTSwkJKCgoMSA8PCBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfSUMJCSgwIDw8IENTNDJYWDhfVFhDVExfREFDX1NaQ19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1pDCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfREFDX1NaQ19TUgkJKDIgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0RBQ19TWkNfU1JaQwkJKDMgPDwgQ1M0MlhYOF9UWENUTF9EQUNfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FNVVRFX1NISUZUCQk0CisjZGVmaW5lIENTNDJYWDhfVFhDVExfQU1VVEVfTUFTSwkJKDEgPDwgQ1M0MlhYOF9UWENUTF9BTVVURV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BTVVURQkJCSgxIDw8IENTNDJYWDhfVFhDVExfQU1VVEVfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfTVVURV9BRENfU1BfU0hJRlQJCTMKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9NVVRFX0FEQ19TUF9NQVNLCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX01VVEVfQURDX1NQX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TTkdWT0xfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU05HVk9MX01BU0sJCSgxIDw8IENTNDJYWDhfVFhDVExfQURDX1NOR1ZPTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU05HVk9MCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TTkdWT0xfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfQURDX1NaQ19TSElGVAkJMAorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfTUFTSwkJKCgoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfV0lEVEgpIC0gMSkgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfSUMJCSgwIDw8IENTNDJYWDhfVFhDVExfQURDX1NaQ19TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1pDCQkoMSA8PCBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfVFhDVExfQURDX1NaQ19TUgkJKDIgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1RYQ1RMX0FEQ19TWkNfU1JaQwkJKDMgPDwgQ1M0MlhYOF9UWENUTF9BRENfU1pDX1NISUZUKQorCisvKiBEQUMgQ2hhbm5lbCBNdXRlIChBZGRyZXNzIDA3aCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9EQUNNVVRFX0FPVVQobikJCQkoMHgxIDw8IG4pCisjZGVmaW5lIENTNDJYWDhfREFDTVVURV9BTEwJCQkweGZmCisKKy8qIFN0YXR1cyBDb250cm9sIChBZGRyZXNzIDE4aCkqLworI2RlZmluZSBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQJCTIKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNDVExfSU5JX1dJRFRICQkyCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9NQVNLCQkoKCgxIDw8IENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9XSURUSCkgLSAxKSA8PCBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOVF9BQ1RJVkVfSElHSAkoMCA8PCBDUzQyWFg4X1NUQVRVU0NUTF9JTklfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTQ1RMX0lOVF9BQ1RJVkVfTE9XCSgxIDw8IENTNDJYWDhfU1RBVFVTQ1RMX0lOSV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNDVExfSU5UX09QRU5fRFJBSU4JKDIgPDwgQ1M0MlhYOF9TVEFUVVNDVExfSU5JX1NISUZUKQorCisvKiBTdGF0dXMgKEFkZHJlc3MgMTloKSovCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0RBQ19DTEtfRVJSX1NISUZUCTQKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQ19DTEtfRVJSX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzNfT1ZGTF9TSElGVAkJMgorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BREMzX09WRkxfTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BREMyX09WRkxfU0hJRlQJCTEKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01BU0sJCSgxIDw8IENTNDJYWDhfU1RBVFVTX0FEQzJfT1ZGTF9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX1NISUZUCQkwCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzFfT1ZGTF9NQVNLCQkoMSA8PCBDUzQyWFg4X1NUQVRVU19BREMxX09WRkxfU0hJRlQpCisKKy8qIFN0YXR1cyBNYXNrIChBZGRyZXNzIDFBaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfREFDX0NMS19FUlJfTV9TSElGVAk0CisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0RBQ19DTEtfRVJSX01fTUFTSwkoMSA8PCBDUzQyWFg4X1NUQVRVU19EQUNfQ0xLX0VSUl9NX1NISUZUKQorI2RlZmluZSBDUzQyWFg4X1NUQVRVU19BRENfQ0xLX0VSUl9NX1NISUZUCTMKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDX0NMS19FUlJfTV9NQVNLCSgxIDw8IENTNDJYWDhfU1RBVFVTX0FEQ19DTEtfRVJSX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzNfT1ZGTF9NX1NISUZUCTIKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDM19PVkZMX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzJfT1ZGTF9NX1NISUZUCTEKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDMl9PVkZMX01fU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfU1RBVFVTX0FEQzFfT1ZGTF9NX1NISUZUCTAKKyNkZWZpbmUgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX01fTUFTSwkJKDEgPDwgQ1M0MlhYOF9TVEFUVVNfQURDMV9PVkZMX01fU0hJRlQpCisKKy8qIE1VVEVDIFBpbiBDb250cm9sIChBZGRyZXNzIDFCaCkgKi8KKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NQ1BPTEFSSVRZX1NISUZUCQkxCisjZGVmaW5lIENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9NQVNLCQkoMSA8PCBDUzQyWFg4X01VVEVDX01DUE9MQVJJVFlfU0hJRlQpCisjZGVmaW5lIENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9BQ1RJVkVfTE9XCSgwIDw8IENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NQ1BPTEFSSVRZX0FDVElWRV9ISUdICSgxIDw8IENTNDJYWDhfTVVURUNfTUNQT0xBUklUWV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NVVRFQ19BQ1RJVkVfU0hJRlQJMAorI2RlZmluZSBDUzQyWFg4X01VVEVDX01VVEVDX0FDVElWRV9NQVNLCQkoMSA8PCBDUzQyWFg4X01VVEVDX01VVEVDX0FDVElWRV9TSElGVCkKKyNkZWZpbmUgQ1M0MlhYOF9NVVRFQ19NVVRFQ19BQ1RJVkUJCSgxIDw8IENTNDJYWDhfTVVURUNfTVVURUNfQUNUSVZFX1NISUZUKQorI2VuZGlmIC8qIF9DUzQyWFg4X0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCmluZGV4IGU2MmUyOTQuLjEzN2U4ZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYwpAQCAtMzA3LDI5ICszMDcsMjkgQEAKIAkiRnMvODE5MipwaSIsICJGcy80MDk2KnBpIiwgIkZzLzIwNDgqcGkiLCAiRnMvMTAyNCpwaSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEwX2RhY19ocGZfY3V0b2ZmID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEwX0RBQ19IUEYsIDAsIDQsIGRhNzIxMF9ocGZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2RhY19ocGZfY3V0b2ZmLAorCQkJICAgIERBNzIxMF9EQUNfSFBGLCAwLCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9hZGNfaHBmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCAwLCA0LCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxMF9hZGNfaHBmX2N1dG9mZiwKKwkJCSAgICBEQTcyMTBfQURDX0hQRiwgMCwgZGE3MjEwX2hwZl9jdXRvZmZfdHh0KTsKIAogLyogQURDIGFuZCBEQUMgdm9pY2UgKDhrSHopIGhpZ2ggcGFzcyBjdXRvZmYgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEwX3ZmX2N1dG9mZl90eHRbXSA9IHsKIAkiMi41SHoiLCAiMjVIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjMwMEh6IiwgIjQwMEh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTBfZGFjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9EQUNfSFBGLCA0LCA4LCBkYTcyMTBfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2RhY192Zl9jdXRvZmYsCisJCQkgICAgREE3MjEwX0RBQ19IUEYsIDQsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTBfYWRjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCA0LCA4LCBkYTcyMTBfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2FkY192Zl9jdXRvZmYsCisJCQkgICAgREE3MjEwX0FEQ19IUEYsIDQsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRhNzIxMF9ocF9tb2RlX3R4dFtdID0gewogCSJDbGFzcyBIIiwgIkNsYXNzIEciCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9ocF9tb2RlX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxMF9IUF9DRkcsIDAsIDIsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEwX2hwX21vZGVfc2VsLAorCQkJICAgIERBNzIxMF9IUF9DRkcsIDAsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CiAKIC8qIEFMQyBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIG5vaXNlIHN1cHByZXNzaW9uIGlzIGRpc2FibGVkICovCiBzdGF0aWMgaW50IGRhNzIxMF9wdXRfYWxjX3N3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMTA3MSwxNyArMTA3MSw5IEBACiBzdGF0aWMgaW50IGRhNzIxMF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGRhNzIxMF9wcml2ICpkYTcyMTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwogCiAJZGV2X2luZm8oY29kZWMtPmRldiwgIkRBNzIxMCBBdWRpbyBDb2RlYyAlc1xuIiwgREE3MjEwX1ZFUlNJT04pOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhNzIxMC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWRhNzIxMC0+bWNsa19yYXRlICAgICAgID0gMDsgICAgLyogVGhpcyB3aWxsIGJlIHNldCBmcm9tIHNldF9zeXNjbGsoKSAqLwogCWRhNzIxMC0+bWFzdGVyICAgICAgICAgID0gMDsgICAgLyogVGhpcyB3aWxsIGJlIHNldCBmcm9tIHNldF9mbXQoKSAqLwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuYwppbmRleCAwYzc3ZTdhLi43MzhmYTE4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmMKQEAgLTYzLDMwICs2MywzMCBAQAogCSIyLjVIeiIsICIyNUh6IiwgIjUwSHoiLCAiMTAwSHoiLCAiMTUwSHoiLCAiMjAwSHoiLCAiMzAwSHoiLCAiNDAwSHoiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfdm9pY2VfaHBmX2Nvcm5lciA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfRklMVEVSUzEsIERBNzIxM19WT0lDRV9IUEZfQ09STkVSX1NISUZULAotCQkJREE3MjEzX1ZPSUNFX0hQRl9DT1JORVJfTUFYLAotCQkJZGE3MjEzX3ZvaWNlX2hwZl9jb3JuZXJfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX3ZvaWNlX2hwZl9jb3JuZXIsCisJCQkgICAgREE3MjEzX0RBQ19GSUxURVJTMSwKKwkJCSAgICBEQTcyMTNfVk9JQ0VfSFBGX0NPUk5FUl9TSElGVCwKKwkJCSAgICBkYTcyMTNfdm9pY2VfaHBmX2Nvcm5lcl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19hZGNfdm9pY2VfaHBmX2Nvcm5lciA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BRENfRklMVEVSUzEsIERBNzIxM19WT0lDRV9IUEZfQ09STkVSX1NISUZULAotCQkJREE3MjEzX1ZPSUNFX0hQRl9DT1JORVJfTUFYLAotCQkJZGE3MjEzX3ZvaWNlX2hwZl9jb3JuZXJfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWRjX3ZvaWNlX2hwZl9jb3JuZXIsCisJCQkgICAgREE3MjEzX0FEQ19GSUxURVJTMSwKKwkJCSAgICBEQTcyMTNfVk9JQ0VfSFBGX0NPUk5FUl9TSElGVCwKKwkJCSAgICBkYTcyMTNfdm9pY2VfaHBmX2Nvcm5lcl90eHQpOwogCiAvKiBBREMgYW5kIERBQyBoaWdoIHBhc3MgZmlsdGVyIGN1dG9mZiB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfYXVkaW9faHBmX2Nvcm5lcl90eHRbXSA9IHsKIAkiRnMvMjQwMDAiLCAiRnMvMTIwMDAiLCAiRnMvNjAwMCIsICJGcy8zMDAwIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX2F1ZGlvX2hwZl9jb3JuZXIgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfREFDX0ZJTFRFUlMxLCBEQTcyMTNfQVVESU9fSFBGX0NPUk5FUl9TSElGVCwKLQkJCURBNzIxM19BVURJT19IUEZfQ09STkVSX01BWCwKLQkJCWRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhY19hdWRpb19ocGZfY29ybmVyLAorCQkJICAgIERBNzIxM19EQUNfRklMVEVSUzEKKwkJCSAgICAsIERBNzIxM19BVURJT19IUEZfQ09STkVSX1NISUZULAorCQkJICAgIGRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FkY19hdWRpb19ocGZfY29ybmVyID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0FEQ19GSUxURVJTMSwgREE3MjEzX0FVRElPX0hQRl9DT1JORVJfU0hJRlQsCi0JCQlEQTcyMTNfQVVESU9fSFBGX0NPUk5FUl9NQVgsCi0JCQlkYTcyMTNfYXVkaW9faHBmX2Nvcm5lcl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hZGNfYXVkaW9faHBmX2Nvcm5lciwKKwkJCSAgICBEQTcyMTNfQURDX0ZJTFRFUlMxLAorCQkJICAgIERBNzIxM19BVURJT19IUEZfQ09STkVSX1NISUZULAorCQkJICAgIGRhNzIxM19hdWRpb19ocGZfY29ybmVyX3R4dCk7CiAKIC8qIEdhaW4gcmFtcGluZyByYXRlIHZhbHVlICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19nYWluX3JhbXBfcmF0ZV90eHRbXSA9IHsKQEAgLTk0LDUyICs5NCw1MCBAQAogCSJub21pbmFsIHJhdGUgLyAzMiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2dhaW5fcmFtcF9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0dBSU5fUkFNUF9DVFJMLCBEQTcyMTNfR0FJTl9SQU1QX1JBVEVfU0hJRlQsCi0JCQlEQTcyMTNfR0FJTl9SQU1QX1JBVEVfTUFYLCBkYTcyMTNfZ2Fpbl9yYW1wX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZ2Fpbl9yYW1wX3JhdGUsCisJCQkgICAgREE3MjEzX0dBSU5fUkFNUF9DVFJMLAorCQkJICAgIERBNzIxM19HQUlOX1JBTVBfUkFURV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZ2Fpbl9yYW1wX3JhdGVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgc2V0dXAgdGltZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0W10gPSB7CiAJIjI1NiBzYW1wbGVzIiwgIjUxMiBzYW1wbGVzIiwgIjEwMjQgc2FtcGxlcyIsICIyMDQ4IHNhbXBsZXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfbmdfc2V0dXBfdGltZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfTkdfU0VUVVBfVElNRSwKLQkJCURBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9TSElGVCwKLQkJCURBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9NQVgsCi0JCQlkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX25nX3NldHVwX3RpbWUsCisJCQkgICAgREE3MjEzX0RBQ19OR19TRVRVUF9USU1FLAorCQkJICAgIERBNzIxM19EQUNfTkdfU0VUVVBfVElNRV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcHVwIHJhdGUgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEzX2RhY19uZ19yYW1wdXBfdHh0W10gPSB7CiAJIjAuMDIgbXMvZEIiLCAiMC4xNiBtcy9kQiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhY19uZ19yYW1wdXBfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19EQUNfTkdfU0VUVVBfVElNRSwKLQkJCURBNzIxM19EQUNfTkdfUkFNUFVQX1JBVEVfU0hJRlQsCi0JCQlEQTcyMTNfREFDX05HX1JBTVBfUkFURV9NQVgsCi0JCQlkYTcyMTNfZGFjX25nX3JhbXB1cF90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfbmdfcmFtcHVwX3JhdGUsCisJCQkgICAgREE3MjEzX0RBQ19OR19TRVRVUF9USU1FLAorCQkJICAgIERBNzIxM19EQUNfTkdfUkFNUFVQX1JBVEVfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhY19uZ19yYW1wdXBfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcGRvd24gcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3R4dFtdID0gewogCSIwLjY0IG1zL2RCIiwgIjIwLjQ4IG1zL2RCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfREFDX05HX1NFVFVQX1RJTUUsCi0JCQlEQTcyMTNfREFDX05HX1JBTVBETl9SQVRFX1NISUZULAotCQkJREE3MjEzX0RBQ19OR19SQU1QX1JBVEVfTUFYLAotCQkJZGE3MjEzX2RhY19uZ19yYW1wZG93bl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfbmdfcmFtcGRvd25fcmF0ZSwKKwkJCSAgICBEQTcyMTNfREFDX05HX1NFVFVQX1RJTUUsCisJCQkgICAgREE3MjEzX0RBQ19OR19SQU1QRE5fUkFURV9TSElGVCwKKwkJCSAgICBkYTcyMTNfZGFjX25nX3JhbXBkb3duX3R4dCk7CiAKIC8qIERBQyBzb2Z0IG11dGUgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlX3R4dFtdID0gewogCSIxIiwgIjIiLCAiNCIsICI4IiwgIjE2IiwgIjMyIiwgIjY0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0RBQ19GSUxURVJTNSwgREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX1NISUZULAotCQkJREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX01BWCwKLQkJCWRhNzIxM19kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfZGFjX3NvZnRfbXV0ZV9yYXRlLAorCQkJICAgIERBNzIxM19EQUNfRklMVEVSUzUsCisJCQkgICAgREE3MjEzX0RBQ19TT0ZUTVVURV9SQVRFX1NISUZULAorCQkJICAgIGRhNzIxM19kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKIAogLyogQUxDIEF0dGFjayBSYXRlIHNlbGVjdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTcyMTNfYWxjX2F0dGFja19yYXRlX3R4dFtdID0gewpAQCAtMTQ3LDkgKzE0NSwxMCBAQAogCSI1NjMyL2ZzIiwgIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19hdHRhY2tfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDIsIERBNzIxM19BTENfQVRUQUNLX1NISUZULAotCQkJREE3MjEzX0FMQ19BVFRBQ0tfTUFYLCBkYTcyMTNfYWxjX2F0dGFja19yYXRlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2FsY19hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwyLAorCQkJICAgIERBNzIxM19BTENfQVRUQUNLX1NISUZULAorCQkJICAgIGRhNzIxM19hbGNfYXR0YWNrX3JhdGVfdHh0KTsKIAogLyogQUxDIFJlbGVhc2UgUmF0ZSBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE3MjEzX2FsY19yZWxlYXNlX3JhdGVfdHh0W10gPSB7CkBAIC0xNTcsOSArMTU2LDEwIEBACiAJIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfQUxDX0NUUkwyLCBEQTcyMTNfQUxDX1JFTEVBU0VfU0hJRlQsCi0JCQlEQTcyMTNfQUxDX1JFTEVBU0VfTUFYLCBkYTcyMTNfYWxjX3JlbGVhc2VfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hbGNfcmVsZWFzZV9yYXRlLAorCQkJICAgIERBNzIxM19BTENfQ1RSTDIsCisJCQkgICAgREE3MjEzX0FMQ19SRUxFQVNFX1NISUZULAorCQkJICAgIGRhNzIxM19hbGNfcmVsZWFzZV9yYXRlX3R4dCk7CiAKIC8qIEFMQyBIb2xkIFRpbWUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19hbGNfaG9sZF90aW1lX3R4dFtdID0gewpAQCAtMTY4LDIyICsxNjgsMjUgQEAKIAkiMjUzOTUyL2ZzIiwgIjUwNzkwNC9mcyIsICIxMDE1ODA4L2ZzIiwgIjIwMzE2MTYvZnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19hbGNfaG9sZF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MjEzX0FMQ19DVFJMMywgREE3MjEzX0FMQ19IT0xEX1NISUZULAotCQkJREE3MjEzX0FMQ19IT0xEX01BWCwgZGE3MjEzX2FsY19ob2xkX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWxjX2hvbGRfdGltZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwzLAorCQkJICAgIERBNzIxM19BTENfSE9MRF9TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2hvbGRfdGltZV90eHQpOwogCiAvKiBBTEMgSW5wdXQgU2lnbmFsIFRyYWNraW5nIHJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhNzIxM19hbGNfaW50ZWdfcmF0ZV90eHRbXSA9IHsKIAkiMS80IiwgIjEvMTYiLCAiMS8yNTYiLCAiMS82NTUzNiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2FsY19pbnRlZ19hdHRhY2tfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDMsIERBNzIxM19BTENfSU5URUdfQVRUQUNLX1NISUZULAotCQkJREE3MjEzX0FMQ19JTlRFR19NQVgsIGRhNzIxM19hbGNfaW50ZWdfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19hbGNfaW50ZWdfYXR0YWNrX3JhdGUsCisJCQkgICAgREE3MjEzX0FMQ19DVFJMMywKKwkJCSAgICBEQTcyMTNfQUxDX0lOVEVHX0FUVEFDS19TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfYWxjX2ludGVnX3JlbGVhc2VfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19BTENfQ1RSTDMsIERBNzIxM19BTENfSU5URUdfUkVMRUFTRV9TSElGVCwKLQkJCURBNzIxM19BTENfSU5URUdfTUFYLCBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfYWxjX2ludGVnX3JlbGVhc2VfcmF0ZSwKKwkJCSAgICBEQTcyMTNfQUxDX0NUUkwzLAorCQkJICAgIERBNzIxM19BTENfSU5URUdfUkVMRUFTRV9TSElGVCwKKwkJCSAgICBkYTcyMTNfYWxjX2ludGVnX3JhdGVfdHh0KTsKIAogCiAvKgpAQCAtNTg0LDE1ICs1ODcsMTcgQEAKIAkiRGlmZmVyZW50aWFsIiwgIk1JQ19QIiwgIk1JQ19OIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfbWljXzFfYW1wX2luX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19NSUNfMV9DVFJMLCBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCi0JCQlEQTcyMTNfTUlDX0FNUF9JTl9TRUxfTUFYLCBkYTcyMTNfbWljX2FtcF9pbl9zZWxfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfbWljXzFfYW1wX2luX3NlbCwKKwkJCSAgICBEQTcyMTNfTUlDXzFfQ1RSTCwKKwkJCSAgICBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCisJCQkgICAgZGE3MjEzX21pY19hbXBfaW5fc2VsX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX21pY18xX2FtcF9pbl9zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNaWMgMSBBbXAgU291cmNlIE1VWCIsIGRhNzIxM19taWNfMV9hbXBfaW5fc2VsKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTcyMTNfbWljXzJfYW1wX2luX3NlbCA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19NSUNfMl9DVFJMLCBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCi0JCQlEQTcyMTNfTUlDX0FNUF9JTl9TRUxfTUFYLCBkYTcyMTNfbWljX2FtcF9pbl9zZWxfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTcyMTNfbWljXzJfYW1wX2luX3NlbCwKKwkJCSAgICBEQTcyMTNfTUlDXzJfQ1RSTCwKKwkJCSAgICBEQTcyMTNfTUlDX0FNUF9JTl9TRUxfU0hJRlQsCisJCQkgICAgZGE3MjEzX21pY19hbXBfaW5fc2VsX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX21pY18yX2FtcF9pbl9zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNaWMgMiBBbXAgU291cmNlIE1VWCIsIGRhNzIxM19taWNfMl9hbXBfaW5fc2VsKTsKIApAQCAtNjAxLDE1ICs2MDYsMTcgQEAKIAkiQURDIExlZnQiLCAiQURDIFJpZ2h0IiwgIkRBSSBJbnB1dCBMZWZ0IiwgIkRBSSBJbnB1dCBSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhaV9sX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19ESUdfUk9VVElOR19EQUksIERBNzIxM19EQUlfTF9TUkNfU0hJRlQsCi0JCQlEQTcyMTNfREFJX1NSQ19NQVgsIGRhNzIxM19kYWlfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhaV9sX3NyYywKKwkJCSAgICBEQTcyMTNfRElHX1JPVVRJTkdfREFJLAorCQkJICAgIERBNzIxM19EQUlfTF9TUkNfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhaV9zcmNfdHh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTNfZGFpX2xfc3JjX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFJIExlZnQgU291cmNlIE1VWCIsIGRhNzIxM19kYWlfbF9zcmMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWlfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfRElHX1JPVVRJTkdfREFJLCBEQTcyMTNfREFJX1JfU1JDX1NISUZULAotCQkJREE3MjEzX0RBSV9TUkNfTUFYLCBkYTcyMTNfZGFpX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWlfcl9zcmMsCisJCQkgICAgREE3MjEzX0RJR19ST1VUSU5HX0RBSSwKKwkJCSAgICBEQTcyMTNfREFJX1JfU1JDX1NISUZULAorCQkJICAgIGRhNzIxM19kYWlfc3JjX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX2RhaV9yX3NyY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBSSBSaWdodCBTb3VyY2UgTVVYIiwgZGE3MjEzX2RhaV9yX3NyYyk7CiAKQEAgLTYxOSwxNSArNjI2LDE3IEBACiAJIkRBSSBJbnB1dCBSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEzX2RhY19sX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzIxM19ESUdfUk9VVElOR19EQUMsIERBNzIxM19EQUNfTF9TUkNfU0hJRlQsCi0JCQlEQTcyMTNfREFDX1NSQ19NQVgsIGRhNzIxM19kYWNfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MjEzX2RhY19sX3NyYywKKwkJCSAgICBEQTcyMTNfRElHX1JPVVRJTkdfREFDLAorCQkJICAgIERBNzIxM19EQUNfTF9TUkNfU0hJRlQsCisJCQkgICAgZGE3MjEzX2RhY19zcmNfdHh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTNfZGFjX2xfc3JjX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDIExlZnQgU291cmNlIE1VWCIsIGRhNzIxM19kYWNfbF9zcmMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxM19kYWNfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTcyMTNfRElHX1JPVVRJTkdfREFDLCBEQTcyMTNfREFDX1JfU1JDX1NISUZULAotCQkJREE3MjEzX0RBQ19TUkNfTUFYLCBkYTcyMTNfZGFjX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzIxM19kYWNfcl9zcmMsCisJCQkgICAgREE3MjEzX0RJR19ST1VUSU5HX0RBQywKKwkJCSAgICBEQTcyMTNfREFDX1JfU1JDX1NISUZULAorCQkJICAgIGRhNzIxM19kYWNfc3JjX3R4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEzX2RhY19yX3NyY19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkRBQyBSaWdodCBTb3VyY2UgTVVYIiwgZGE3MjEzX2RhY19yX3NyYyk7CiAKQEAgLTEzODQsMTcgKzEzOTMsOSBAQAogCiBzdGF0aWMgaW50IGRhNzIxM19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGE3MjEzX3ByaXYgKmRhNzIxMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCBkYTcyMTNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYTcyMTMtPnBkYXRhOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhNzIxMy0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIERlZmF1bHQgdG8gdXNpbmcgQUxDIGF1dG8gb2Zmc2V0IGNhbGlicmF0aW9uIG1vZGUuICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX0FMQ19DVFJMMSwKIAkJCSAgICBEQTcyMTNfQUxDX0NBTElCX01PREVfTUFOLCAwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCmluZGV4IGY0ZDk2NWViYy4uN2QxNjhlYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTczMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCkBAIC0yNjksODEgKzI2OSw2NSBAQAogCSIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzFfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMxX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMxX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzJfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzJfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMyX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzNfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzNfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMzX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMzX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzFfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMxX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMxX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzJfaHBmX21vZGVfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzJfSFBGLCBEQTczMlhfSFBGX01PREVfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01PREVfTUFYLCBkYTczMnhfaHBmX21vZGUpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMyX2hwZl9tb2RlX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9NT0RFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbW9kZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzFfaHBfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19EQUMxX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKLQkJCURBNzMyWF9IUEZfTVVTSUNfTUFYLCBkYTczMnhfaHBmX211c2ljKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfZGFjMV9ocF9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbXVzaWMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9kYWMyX2hwX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfREFDMl9IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01VU0lDX01BWCwgZGE3MzJ4X2hwZl9tdXNpYykKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2RhYzJfaHBfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX211c2ljKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfZGFjM19ocF9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzNfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAotCQkJREE3MzJYX0hQRl9NVVNJQ19NQVgsIGRhNzMyeF9ocGZfbXVzaWMpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMzX2hwX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfREFDM19IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl9tdXNpYyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzFfaHBfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19BREMxX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKLQkJCURBNzMyWF9IUEZfTVVTSUNfTUFYLCBkYTczMnhfaHBmX211c2ljKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfYWRjMV9ocF9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX01VU0lDX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfbXVzaWMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9hZGMyX2hwX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfQURDMl9IUEYsIERBNzMyWF9IUEZfTVVTSUNfU0hJRlQsCi0JCQlEQTczMlhfSFBGX01VU0lDX01BWCwgZGE3MzJ4X2hwZl9tdXNpYykKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2FkYzJfaHBfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9NVVNJQ19TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX211c2ljKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfZGFjMV92b2ljZV9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0RBQzFfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAotCQkJREE3MzJYX0hQRl9WT0lDRV9NQVgsIGRhNzMyeF9ocGZfdm9pY2UpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9kYWMxX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfREFDMV9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2RhYzJfdm9pY2VfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19EQUMyX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKLQkJCURBNzMyWF9IUEZfVk9JQ0VfTUFYLCBkYTczMnhfaHBmX3ZvaWNlKQotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfZGFjMl92b2ljZV9maWx0ZXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0RBQzJfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAorCQkJICAgIGRhNzMyeF9ocGZfdm9pY2UpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9kYWMzX3ZvaWNlX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfREFDM19IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCi0JCQlEQTczMlhfSFBGX1ZPSUNFX01BWCwgZGE3MzJ4X2hwZl92b2ljZSkKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2RhYzNfdm9pY2VfZmlsdGVyX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19EQUMzX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKKwkJCSAgICBkYTczMnhfaHBmX3ZvaWNlKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfYWRjMV92b2ljZV9maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0FEQzFfSFBGLCBEQTczMlhfSFBGX1ZPSUNFX1NISUZULAotCQkJREE3MzJYX0hQRl9WT0lDRV9NQVgsIGRhNzMyeF9ocGZfdm9pY2UpCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMxX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfQURDMV9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2FkYzJfdm9pY2VfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19BREMyX0hQRiwgREE3MzJYX0hQRl9WT0lDRV9TSElGVCwKLQkJCURBNzMyWF9IUEZfVk9JQ0VfTUFYLCBkYTczMnhfaHBmX3ZvaWNlKQotfTsKLQorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9hZGMyX3ZvaWNlX2ZpbHRlcl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfQURDMl9IUEYsIERBNzMyWF9IUEZfVk9JQ0VfU0hJRlQsCisJCQkgICAgZGE3MzJ4X2hwZl92b2ljZSk7CiAKIHN0YXRpYyBpbnQgZGE3MzJ4X2hwZl9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtNzE0LDY1ICs2OTgsNjUgQEAKIH07CiAKIC8qIEFEQzFMTVVYICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzFsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMxTF9NVVhfU0VMX1NISUZULAotCQkJREE3MzJYX0FEQ0xfTVVYX01BWCwgYWRjbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGMxbF9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzFMX01VWF9TRUxfU0hJRlQsCisJCQkgICAgYWRjbF90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGMxbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBSb3V0ZSIsIGFkYzFsX2VudW0pOwogCiAvKiBBREMxUk1VWCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGMxcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19JTlBfTVVYLCBEQTczMlhfQURDMVJfTVVYX1NFTF9TSElGVCwKLQkJCURBNzMyWF9BRENSX01VWF9NQVgsIGFkY3JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjMXJfZW51bSwKKwkJCSAgICBEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMxUl9NVVhfU0VMX1NISUZULAorCQkJICAgIGFkY3JfdGV4dCk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjMXJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBREMgUm91dGUiLCBhZGMxcl9lbnVtKTsKIAogLyogQURDMkxNVVggKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjMmxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzJMX01VWF9TRUxfU0hJRlQsCi0JCQlEQTczMlhfQURDTF9NVVhfTUFYLCBhZGNsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYzJsX2VudW0sCisJCQkgICAgREE3MzJYX1JFR19JTlBfTVVYLCBEQTczMlhfQURDMkxfTVVYX1NFTF9TSElGVCwKKwkJCSAgICBhZGNsX3RleHQpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYzJsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQURDIFJvdXRlIiwgYWRjMmxfZW51bSk7CiAKIC8qIEFEQzJSTVVYICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYzJyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0lOUF9NVVgsIERBNzMyWF9BREMyUl9NVVhfU0VMX1NISUZULAotCQkJREE3MzJYX0FEQ1JfTVVYX01BWCwgYWRjcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGMycl9lbnVtLAorCQkJICAgIERBNzMyWF9SRUdfSU5QX01VWCwgREE3MzJYX0FEQzJSX01VWF9TRUxfU0hJRlQsCisJCQkgICAgYWRjcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYzJyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQURDIFJvdXRlIiwgYWRjMnJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MzJ4X2hwX2xlZnRfb3V0cHV0ID0KLQlTT0NfRU5VTV9TSU5HTEUoREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAotCQkJREE3MzJYX0RBQ19FTl9NQVgsIGVuYWJsZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTczMnhfaHBfbGVmdF9vdXRwdXQsCisJCQkgICAgREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQTCBTd2l0Y2giLCBkYTczMnhfaHBfbGVmdF9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9ocF9yaWdodF9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0hQUiwgREE3MzJYX0hQX09VVF9EQUNfRU5fU0hJRlQsCi0JCQlEQTczMlhfREFDX0VOX01BWCwgZW5hYmxlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhNzMyeF9ocF9yaWdodF9vdXRwdXQsCisJCQkgICAgREE3MzJYX1JFR19IUFIsIERBNzMyWF9IUF9PVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBTd2l0Y2giLCBkYTczMnhfaHBfcmlnaHRfb3V0cHV0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTczMnhfc3BlYWtlcl9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjMsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X3NwZWFrZXJfb3V0cHV0LAorCQkJICAgIERBNzMyWF9SRUdfTElOMywgREE3MzJYX0xPVVRfREFDX0VOX1NISUZULAorCQkJICAgIGVuYWJsZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa19tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNQSyBTd2l0Y2giLCBkYTczMnhfc3BlYWtlcl9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9sb3V0NF9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjQsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2xvdXQ0X291dHB1dCwKKwkJCSAgICBEQTczMlhfUkVHX0xJTjQsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKKwkJCSAgICBlbmFibGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0NF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxPVVQ0IFN3aXRjaCIsIGRhNzMyeF9sb3V0NF9vdXRwdXQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzMyeF9sb3V0Ml9vdXRwdXQgPQotCVNPQ19FTlVNX1NJTkdMRShEQTczMlhfUkVHX0xJTjIsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKLQkJCURBNzMyWF9EQUNfRU5fTUFYLCBlbmFibGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE3MzJ4X2xvdXQyX291dHB1dCwKKwkJCSAgICBEQTczMlhfUkVHX0xJTjIsIERBNzMyWF9MT1VUX0RBQ19FTl9TSElGVCwKKwkJCSAgICBlbmFibGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0Ml9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxPVVQyIFN3aXRjaCIsIGRhNzMyeF9sb3V0Ml9vdXRwdXQpOwpAQCAtMTMxMyw5ICsxMjk3LDkgQEAKIAltc2xlZXAoREE3MzJYX1dBSVRfRk9SX1NUQUJJTElaQVRJT04pOwogCiAJLyogQ2hlY2sgREFDIG9mZnNldCBzaWduICovCi0Jc2lnbltEQTczMlhfSFBMX0RBQ10gPSAoY29kZWMtPmh3X3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBMX0RBQ19PRkZfQ05UTCkgJgorCXNpZ25bREE3MzJYX0hQTF9EQUNdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUExfREFDX09GRl9DTlRMKSAmCiAJCQkJREE3MzJYX0hQX0RBQ19PRkZfQ05UTF9DT01QTyk7Ci0Jc2lnbltEQTczMlhfSFBSX0RBQ10gPSAoY29kZWMtPmh3X3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSX0RBQ19PRkZfQ05UTCkgJgorCXNpZ25bREE3MzJYX0hQUl9EQUNdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFJfREFDX09GRl9DTlRMKSAmCiAJCQkJREE3MzJYX0hQX0RBQ19PRkZfQ05UTF9DT01QTyk7CiAKIAkvKiBCaW5hcnkgc2VhcmNoIERBQyBvZmZzZXQgdmFsdWVzIChib3RoIGNoYW5uZWxzIGF0IG9uY2UpICovCkBAIC0xMzMyLDEwICsxMzE2LDEwIEBACiAKIAkJbXNsZWVwKERBNzMyWF9XQUlUX0ZPUl9TVEFCSUxJWkFUSU9OKTsKIAotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTF9EQUNfT0ZGX0NOVEwpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBMX0RBQ19PRkZfQ05UTCkgJgogCQkgICAgIERBNzMyWF9IUF9EQUNfT0ZGX0NOVExfQ09NUE8pIF4gc2lnbltEQTczMlhfSFBMX0RBQ10pCiAJCQlvZmZzZXRbREE3MzJYX0hQTF9EQUNdICY9IH5zdGVwOwotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQUl9EQUNfT0ZGX0NOVEwpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSX0RBQ19PRkZfQ05UTCkgJgogCQkgICAgIERBNzMyWF9IUF9EQUNfT0ZGX0NOVExfQ09NUE8pIF4gc2lnbltEQTczMlhfSFBSX0RBQ10pCiAJCQlvZmZzZXRbREE3MzJYX0hQUl9EQUNdICY9IH5zdGVwOwogCkBAIC0xMzc2LDkgKzEzNjAsOSBAQAogCW1zbGVlcChEQTczMlhfV0FJVF9GT1JfU1RBQklMSVpBVElPTik7CiAKIAkvKiBDaGVjayBvdXRwdXQgb2Zmc2V0IHNpZ24gKi8KLQlzaWduW0RBNzMyWF9IUExfQU1QXSA9IGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgorCXNpZ25bREE3MzJYX0hQTF9BTVBdID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgogCQkJICAgICAgIERBNzMyWF9IUF9PVVRfQ09NUE87Ci0Jc2lnbltEQTczMlhfSFBSX0FNUF0gPSBjb2RlYy0+aHdfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKKwlzaWduW0RBNzMyWF9IUFJfQU1QXSA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKIAkJCSAgICAgICBEQTczMlhfSFBfT1VUX0NPTVBPOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgREE3MzJYX1JFR19IUEwsIERBNzMyWF9IUF9PVVRfQ09NUCB8CkBAIC0xMzk5LDEwICsxMzgzLDEwIEBACiAKIAkJbXNsZWVwKERBNzMyWF9XQUlUX0ZPUl9TVEFCSUxJWkFUSU9OKTsKIAotCQlpZiAoKGNvZGVjLT5od19yZWFkKGNvZGVjLCBEQTczMlhfUkVHX0hQTCkgJgorCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUEwpICYKIAkJICAgICBEQTczMlhfSFBfT1VUX0NPTVBPKSBeIHNpZ25bREE3MzJYX0hQTF9BTVBdKQogCQkJb2Zmc2V0W0RBNzMyWF9IUExfQU1QXSAmPSB+c3RlcDsKLQkJaWYgKChjb2RlYy0+aHdfcmVhZChjb2RlYywgREE3MzJYX1JFR19IUFIpICYKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzMyWF9SRUdfSFBSKSAmCiAJCSAgICAgREE3MzJYX0hQX09VVF9DT01QTykgXiBzaWduW0RBNzMyWF9IUFJfQU1QXSkKIAkJCW9mZnNldFtEQTczMlhfSFBSX0FNUF0gJj0gfnN0ZXA7CiAKQEAgLTE0OTksOCArMTQ4Myw4IEBACiAKIAkJCWRhNzMyeF9ocF9kY19vZmZzZXRfY2FuY2VsbGF0aW9uKGNvZGVjKTsKIAotCQkJcmVnY2FjaGVfY2FjaGVfb25seShjb2RlYy0+Y29udHJvbF9kYXRhLCBmYWxzZSk7Ci0JCQlyZWdjYWNoZV9zeW5jKGNvZGVjLT5jb250cm9sX2RhdGEpOworCQkJcmVnY2FjaGVfY2FjaGVfb25seShkYTczMngtPnJlZ21hcCwgZmFsc2UpOworCQkJcmVnY2FjaGVfc3luYyhkYTczMngtPnJlZ21hcCk7CiAJCX0gZWxzZSB7CiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTczMlhfUkVHX0JJQVNfRU4sCiAJCQkJCSAgICBEQTczMlhfQklBU19CT09TVF9NQVNLLApAQCAtMTUxMSw3ICsxNDk1LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgdHJ1ZSk7CisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoZGE3MzJ4LT5yZWdtYXAsIHRydWUpOwogCQlkYTczMnhfc2V0X2NoYXJnZV9wdW1wKGNvZGVjLCBEQTczMlhfRElTQUJMRV9DUCk7CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzMyWF9SRUdfQklBU19FTiwgREE3MzJYX0JJQVNfRU4sCiAJCQkJICAgIERBNzMyWF9CSUFTX0RJUyk7CkBAIC0xNTI4LDIzICsxNTEyLDE0IEBACiB7CiAJc3RydWN0IGRhNzMyeF9wcml2ICpkYTczMnggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IHJldCA9IDA7CiAKIAlkYTczMngtPmNvZGVjID0gY29kZWM7CiAKIAlkYXBtLT5pZGxlX2JpYXNfb2ZmID0gZmFsc2U7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gZGE3MzJ4LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWMuXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCiAJZGE3MzJ4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRhNzMyeF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpAQCAtMTU2Niw3ICsxNTQxLDYgQEAKIAkuZGFwbV9yb3V0ZXMJCT0gZGE3MzJ4X2RhcG1fcm91dGVzLAogCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzMyeF9kYXBtX3JvdXRlcyksCiAJLnNldF9wbGwJCT0gZGE3MzJ4X3NldF9kYWlfcGxsLAotCS5yZWdfY2FjaGVfc2l6ZQkJPSBBUlJBWV9TSVpFKGRhNzMyeF9yZWdfY2FjaGUpLAogfTsKIAogc3RhdGljIGludCBkYTczMnhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5oIGIvc291bmQvc29jL2NvZGVjcy9kYTczMnguaAppbmRleCBjOGNlNTQ3Li4xZGNlYWZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmgKQEAgLTExMyw5ICsxMTMsNiBAQAogI2RlZmluZQlEQTczMlhfRVFfT1ZFUkFMTF9WT0xfREJfTUlOCS0xODAwCiAjZGVmaW5lCURBNzMyWF9FUV9PVkVSQUxMX1ZPTF9EQl9JTkMJNjAwCiAKLSNkZWZpbmUgREE3MzJYX1NPQ19FTlVNX0RPVUJMRV9SKHhyZWcsIHhycmVnLCB4bWF4LCB4dGV4dCkgXAotCXsucmVnID0geHJlZywgLnJlZzIgPSB4cnJlZywgLm1heCA9IHhtYXgsIC50ZXh0cyA9IHh0ZXh0fQotCiBlbnVtIGRhNzMyeF9zeXNjdGwgewogCURBNzMyWF9TUl84S0haCQk9IDB4MSwKIAlEQTczMlhfU1JfMTFfMDI1S0haCT0gMHgyLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE5MDU1LmMKaW5kZXggNDIyODEyNi4uNGZmMDZiNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzIxLDIyICszMjMsMjIgQEAKIAkiRnMvMjQwMDAiLCAiRnMvMTIwMDAiLCAiRnMvNjAwMCIsICJGcy8zMDAwIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfREFDX0ZJTFRFUlMxLCA0LCA0LCBkYTkwNTVfaHBmX2N1dG9mZl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9kYWNfaHBmX2N1dG9mZiwKKwkJCSAgICBEQTkwNTVfREFDX0ZJTFRFUlMxLCA0LCBkYTkwNTVfaHBmX2N1dG9mZl90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9hZGNfaHBmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9BRENfRklMVEVSUzEsIDQsIDQsIGRhOTA1NV9ocGZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2FkY19ocGZfY3V0b2ZmLAorCQkJICAgIERBOTA1NV9BRENfRklMVEVSUzEsIDQsIGRhOTA1NV9ocGZfY3V0b2ZmX3R4dCk7CiAKIC8qIEFEQyBhbmQgREFDIHZvaWNlIG1vZGUgKDhrSHopIGhpZ2ggcGFzcyBjdXRvZmYgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X3ZmX2N1dG9mZl90eHRbXSA9IHsKIAkiMi41SHoiLCAiMjVIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjMwMEh6IiwgIjQwMEh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3ZmX2N1dG9mZiA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9EQUNfRklMVEVSUzEsIDAsIDgsIGRhOTA1NV92Zl9jdXRvZmZfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3ZmX2N1dG9mZiwKKwkJCSAgICBEQTkwNTVfREFDX0ZJTFRFUlMxLCAwLCBkYTkwNTVfdmZfY3V0b2ZmX3R4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2FkY192Zl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQURDX0ZJTFRFUlMxLCAwLCA4LCBkYTkwNTVfdmZfY3V0b2ZmX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2FkY192Zl9jdXRvZmYsCisJCQkgICAgREE5MDU1X0FEQ19GSUxURVJTMSwgMCwgZGE5MDU1X3ZmX2N1dG9mZl90eHQpOwogCiAvKiBHYWluIHJhbXBpbmcgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZ2Fpbl9yYW1waW5nX3R4dFtdID0gewpAQCAtMzQ0LDQ0ICszNDYsNDQgQEAKIAkibm9taW5hbCByYXRlIC8gOCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2dhaW5fcmFtcGluZ19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0dBSU5fUkFNUF9DVFJMLCAwLCA0LCBkYTkwNTVfZ2Fpbl9yYW1waW5nX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2dhaW5fcmFtcGluZ19yYXRlLAorCQkJICAgIERBOTA1NV9HQUlOX1JBTVBfQ1RSTCwgMCwgZGE5MDU1X2dhaW5fcmFtcGluZ190eHQpOwogCiAvKiBEQUMgbm9pc2UgZ2F0ZSBzZXR1cCB0aW1lIHZhbHVlICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9kYWNfbmdfc2V0dXBfdGltZV90eHRbXSA9IHsKIAkiMjU2IHNhbXBsZXMiLCAiNTEyIHNhbXBsZXMiLCAiMTAyNCBzYW1wbGVzIiwgIjIwNDggc2FtcGxlcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RBQ19OR19TRVRVUF9USU1FLCAwLCA0LAotCQkJZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19zZXR1cF90aW1lLAorCQkJICAgIERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMCwKKwkJCSAgICBkYTkwNTVfZGFjX25nX3NldHVwX3RpbWVfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcHVwIHJhdGUgdmFsdWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X2RhY19uZ19yYW1wdXBfdHh0W10gPSB7CiAJIjAuMDIgbXMvZEIiLCAiMC4xNiBtcy9kQiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2RhY19uZ19yYW1wdXBfcmF0ZSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMiwgMiwKLQkJCWRhOTA1NV9kYWNfbmdfcmFtcHVwX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19yYW1wdXBfcmF0ZSwKKwkJCSAgICBEQTkwNTVfREFDX05HX1NFVFVQX1RJTUUsIDIsCisJCQkgICAgZGE5MDU1X2RhY19uZ19yYW1wdXBfdHh0KTsKIAogLyogREFDIG5vaXNlIGdhdGUgcmFtcGRvd24gcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dFtdID0gewogCSIwLjY0IG1zL2RCIiwgIjIwLjQ4IG1zL2RCIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfREFDX05HX1NFVFVQX1RJTUUsIDMsIDIsCi0JCQlkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2RhY19uZ19yYW1wZG93bl9yYXRlLAorCQkJICAgIERBOTA1NV9EQUNfTkdfU0VUVVBfVElNRSwgMywKKwkJCSAgICBkYTkwNTVfZGFjX25nX3JhbXBkb3duX3R4dCk7CiAKIC8qIERBQyBzb2Z0IG11dGUgcmF0ZSB2YWx1ZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlX3R4dFtdID0gewogCSIxIiwgIjIiLCAiNCIsICI4IiwgIjE2IiwgIjMyIiwgIjY0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RBQ19GSUxURVJTNSwgNCwgNywKLQkJCWRhOTA1NV9kYWNfc29mdF9tdXRlX3JhdGVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3NvZnRfbXV0ZV9yYXRlLAorCQkJICAgIERBOTA1NV9EQUNfRklMVEVSUzUsIDQsCisJCQkgICAgZGE5MDU1X2RhY19zb2Z0X211dGVfcmF0ZV90eHQpOwogCiAvKiBEQUMgcm91dGluZyBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X2RhY19zcmNfdHh0W10gPSB7CkBAIC0zODksNDAgKzM5MSw0MCBAQAogCSJBSUYgaW5wdXQgcmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9kYWNfbF9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfRElHX1JPVVRJTkdfREFDLCAwLCA0LCBkYTkwNTVfZGFjX3NyY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9kYWNfbF9zcmMsCisJCQkgICAgREE5MDU1X0RJR19ST1VUSU5HX0RBQywgMCwgZGE5MDU1X2RhY19zcmNfdHh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfZGFjX3Jfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0RJR19ST1VUSU5HX0RBQywgNCwgNCwgZGE5MDU1X2RhY19zcmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfZGFjX3Jfc3JjLAorCQkJICAgIERBOTA1NV9ESUdfUk9VVElOR19EQUMsIDQsIGRhOTA1NV9kYWNfc3JjX3R4dCk7CiAKIC8qIE1JQyBQR0EgTGVmdCBzb3VyY2Ugc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9taWNfbF9zcmNfdHh0W10gPSB7CiAJIk1JQzFfUF9OIiwgIk1JQzFfUCIsICJNSUMxX04iLCAiTUlDMl9MIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfbWljX2xfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X01JWElOX0xfU0VMRUNULCA0LCA0LCBkYTkwNTVfbWljX2xfc3JjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X21pY19sX3NyYywKKwkJCSAgICBEQTkwNTVfTUlYSU5fTF9TRUxFQ1QsIDQsIGRhOTA1NV9taWNfbF9zcmNfdHh0KTsKIAogLyogTUlDIFBHQSBSaWdodCBzb3VyY2Ugc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9taWNfcl9zcmNfdHh0W10gPSB7CiAJIk1JQzJfUl9MIiwgIk1JQzJfUiIsICJNSUMyX0wiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9taWNfcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfTUlYSU5fUl9TRUxFQ1QsIDQsIDMsIGRhOTA1NV9taWNfcl9zcmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfbWljX3Jfc3JjLAorCQkJICAgIERBOTA1NV9NSVhJTl9SX1NFTEVDVCwgNCwgZGE5MDU1X21pY19yX3NyY190eHQpOwogCiAvKiBBTEMgSW5wdXQgU2lnbmFsIFRyYWNraW5nIHJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHRbXSA9IHsKIAkiMS80IiwgIjEvMTYiLCAiMS8yNTYiLCAiMS82NTUzNiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2ludGVnX2F0dGFja19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMywgNCwgNCwKLQkJCWRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9pbnRlZ19hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwzLCA0LAorCQkJICAgIGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9pbnRlZ19yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQUxDX0NUUkwzLCA2LCA0LAotCQkJZGE5MDU1X3NpZ25hbF90cmFja2luZ19yYXRlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGE5MDU1X2ludGVnX3JlbGVhc2VfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwzLCA2LAorCQkJICAgIGRhOTA1NV9zaWduYWxfdHJhY2tpbmdfcmF0ZV90eHQpOwogCiAvKiBBTEMgQXR0YWNrIFJhdGUgc2VsZWN0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhOTA1NV9hdHRhY2tfcmF0ZV90eHRbXSA9IHsKQEAgLTQzMCw4ICs0MzIsOCBAQAogCSI1NjMyL2ZzIiwgIjExMjY0L2ZzIiwgIjIyNTI4L2ZzIiwgIjQ1MDU2L2ZzIiwgIjkwMTEyL2ZzIiwgIjE4MDIyNC9mcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE5MDU1X2F0dGFja19yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMiwgMCwgMTMsIGRhOTA1NV9hdHRhY2tfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9hdHRhY2tfcmF0ZSwKKwkJCSAgICBEQTkwNTVfQUxDX0NUUkwyLCAwLCBkYTkwNTVfYXR0YWNrX3JhdGVfdHh0KTsKIAogLyogQUxDIFJlbGVhc2UgUmF0ZSBzZWxlY3QgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHRbXSA9IHsKQEAgLTQzOSw4ICs0NDEsOCBAQAogCSIxMTI2NC9mcyIsICIyMjUyOC9mcyIsICI0NTA1Ni9mcyIsICI5MDExMi9mcyIsICIxODAyMjQvZnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhOTA1NV9yZWxlYXNlX3JhdGUgPQotCVNPQ19FTlVNX1NJTkdMRShEQTkwNTVfQUxDX0NUUkwyLCA0LCAxMSwgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhOTA1NV9yZWxlYXNlX3JhdGUsCisJCQkgICAgREE5MDU1X0FMQ19DVFJMMiwgNCwgZGE5MDU1X3JlbGVhc2VfcmF0ZV90eHQpOwogCiAvKiBBTEMgSG9sZCBUaW1lIHNlbGVjdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYTkwNTVfaG9sZF90aW1lX3R4dFtdID0gewpAQCAtNDQ5LDggKzQ1MSw4IEBACiAJIjI1Mzk1Mi9mcyIsICI1MDc5MDQvZnMiLCAiMTAxNTgwOC9mcyIsICIyMDMxNjE2L2ZzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYTkwNTVfaG9sZF90aW1lID0KLQlTT0NfRU5VTV9TSU5HTEUoREE5MDU1X0FMQ19DVFJMMywgMCwgMTYsIGRhOTA1NV9ob2xkX3RpbWVfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYTkwNTVfaG9sZF90aW1lLAorCQkJICAgIERBOTA1NV9BTENfQ1RSTDMsIDAsIGRhOTA1NV9ob2xkX3RpbWVfdHh0KTsKIAogc3RhdGljIGludCBkYTkwNTVfZ2V0X2FsY19kYXRhKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTggcmVnX3ZhbCkKIHsKQEAgLTEzODEsMTYgKzEzODMsOCBAQAogCiBzdGF0aWMgaW50IGRhOTA1NV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZGE5MDU1X3ByaXYgKmRhOTA1NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhOTA1NS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEVuYWJsZSBhbGwgR2FpbiBSYW1wcyAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBOTA1NV9BVVhfTF9DVFJMLAogCQkJICAgIERBOTA1NV9HQUlOX1JBTVBJTkdfRU4sIERBOTA1NV9HQUlOX1JBTVBJTkdfRU4pOwpAQCAtMTUzNiwxMSArMTUzMCwxNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkYTkwNTVfaTJjX2lkKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGE5MDU1X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJkbGcsZGE5MDU1LWNvZGVjIiwgfSwKKwl7IH0KK307CisKIC8qIEkyQyBjb2RlYyBjb250cm9sIGxheWVyICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZGE5MDU1X2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiZGE5MDU1LWNvZGVjIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkYTkwNTVfb2ZfbWF0Y2gpLAogCX0sCiAJLnByb2JlCQk9IGRhOTA1NV9pMmNfcHJvYmUsCiAJLnJlbW92ZQkJPSBkYTkwNTVfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jIGIvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jCmluZGV4IGNiNzM2ZGQuLjNhODljZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2lzYWJlbGxlLmMKQEAgLTkxOCw4ICs5MTgsNyBAQAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXUxNiBhaWYgPSAwOwogCXVuc2lnbmVkIGludCBmc192YWwgPSAwOwogCkBAIC0xMDkwLDIzICsxMDg5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBpc2FiZWxsZV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldiwgTlVMTCk7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2lzYWJlbGxlID0gewotCS5wcm9iZSA9IGlzYWJlbGxlX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IGlzYWJlbGxlX3NldF9iaWFzX2xldmVsLAogCS5jb250cm9scyA9IGlzYWJlbGxlX3NuZF9jb250cm9scywKIAkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShpc2FiZWxsZV9zbmRfY29udHJvbHMpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbG00ODU3LmMKaW5kZXggMGU1NzQzZS4uNGYwNDhkYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDg1Ny5jCkBAIC0xMDEsOCArMTAxLDcgQEAKIAkiSGVhZHBob25lIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00ODU3X21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGxtNDg1N19tb2RlKSwgbG00ODU3X21vZGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChsbTQ4NTdfbW9kZV9lbnVtLCBsbTQ4NTdfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBsbTQ4NTdfZGFwbV93aWRnZXRzW10gPSB7CiAJU05EX1NPQ19EQVBNX0lOUFVUKCJJTiIpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ5NDUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwppbmRleCBlMTk0OTBjLi4yNzViM2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwpAQCAtMTk1LDMzICsxOTUsMzEgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxtNDk0NTNfbWljMm1vZGVfdGV4dFtdID0geyJTaW5nbGUgRW5kZWQiLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX21pYzJtb2RlX2VudW0sIExNNDk0NTNfUDBfTUlDUl9SRUcsIDUsCi0JCQkJICBsbTQ5NDUzX21pYzJtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfbWljMm1vZGVfZW51bSwgTE00OTQ1M19QMF9NSUNSX1JFRywgNSwKKwkJCSAgICBsbTQ5NDUzX21pYzJtb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbG00OTQ1M19kbWljX2NmZ190ZXh0W10gPSB7IkRNSUNEQVQxIiwgIkRNSUNEQVQyIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2RtaWMxMl9jZmdfZW51bSwKLQkJCQkgIExNNDk0NTNfUDBfRElHSVRBTF9NSUMxX0NPTkZJR19SRUcsCi0JCQkJICA3LCBsbTQ5NDUzX2RtaWNfY2ZnX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfZG1pYzEyX2NmZ19lbnVtLAorCQkJICAgIExNNDk0NTNfUDBfRElHSVRBTF9NSUMxX0NPTkZJR19SRUcsIDcsCisJCQkgICAgbG00OTQ1M19kbWljX2NmZ190ZXh0KTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxtNDk0NTNfZG1pYzM0X2NmZ19lbnVtLAotCQkJCSAgTE00OTQ1M19QMF9ESUdJVEFMX01JQzJfQ09ORklHX1JFRywKLQkJCQkgIDcsIGxtNDk0NTNfZG1pY19jZmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG00OTQ1M19kbWljMzRfY2ZnX2VudW0sCisJCQkgICAgTE00OTQ1M19QMF9ESUdJVEFMX01JQzJfQ09ORklHX1JFRywgNywKKwkJCSAgICBsbTQ5NDUzX2RtaWNfY2ZnX3RleHQpOwogCiAvKiBNVVggQ29udHJvbHMgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpsbTQ5NDUzX2FkY2xfbXV4X3RleHRbXSA9IHsgIk1JQzEiLCAiQXV4X0wiIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpsbTQ5NDUzX2FkY3JfbXV4X3RleHRbXSA9IHsgIk1JQzIiLCAiQXV4X1IiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00OTQ1M19hZGNsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAwLAotCQkJQVJSQVlfU0laRShsbTQ5NDUzX2FkY2xfbXV4X3RleHQpLAotCQkJbG00OTQ1M19hZGNsX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2FkY2xfZW51bSwKKwkJCSAgICBMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAwLAorCQkJICAgIGxtNDk0NTNfYWRjbF9tdXhfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG00OTQ1M19hZGNyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAxLAotCQkJQVJSQVlfU0laRShsbTQ5NDUzX2FkY3JfbXV4X3RleHQpLAotCQkJbG00OTQ1M19hZGNyX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsbTQ5NDUzX2FkY3JfZW51bSwKKwkJCSAgICBMTTQ5NDUzX1AwX0FOQUxPR19NSVhFUl9BRENfUkVHLCAxLAorCQkJICAgIGxtNDk0NTNfYWRjcl9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsbTQ5NDUzX2FkY2xfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIkFEQyBMZWZ0IE11eCIsIGxtNDk0NTNfYWRjbF9lbnVtKTsKQEAgLTE0MDksMjIgKzE0MDcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxtNDk0NTNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBsbTQ5NDUzX3ByaXYgKmxtNDk0NTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0ID0gMDsKLQotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBsbTQ5NDUzLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogcG93ZXIgZG93biBjaGlwICovCiBzdGF0aWMgaW50IGxtNDk0NTNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKQEAgLTE0MzMsNyArMTQxNSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9sbTQ5NDUzID0gewotCS5wcm9iZSA9IGxtNDk0NTNfcHJvYmUsCiAJLnJlbW92ZSA9IGxtNDk0NTNfcmVtb3ZlLAogCS5zdXNwZW5kID0gbG00OTQ1M19zdXNwZW5kLAogCS5yZXN1bWUgPSBsbTQ5NDUzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTc2OC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKaW5kZXggMzFmOTE1Ni4uZWM0ODFmYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5NzY4LmMKQEAgLTEzNSwxMSArMTM1LDYgQEAKIAlzdHJ1Y3QgbWF4OTc2OCAqbWF4OTc2OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gbWF4OTc2OC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAyLCA2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWlmIChtYXg5NzY4LT5mbGFncyAmIE1BWDk3NjhfRkxBR19DTEFTU0lDX1BXTSkgewogCQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBNQVg5NzY4X0NUUkwsIE1BWDk3NjhfQ1RSTF9QV00pOwogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCmluZGV4IGVlNjYwZTIuLmVmN2NmODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKQEAgLTU5NywyOCArNTk3LDI3IEBACiAgICAgICAgMHgwMCwgMHg0MywgMHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwgMHgxMSwgMHgyMiwgMHgzMgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9leG1vZGVfZW51bSA9Ci0gICAgICAgU09DX1ZBTFVFX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfNDFfU1BLREhQLCAwLCAxMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUobWF4OTgwODhfZXhtb2RlX3RleHRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODhfZXhtb2RlX3RleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg5ODA4OF9leG1vZGVfdmFsdWVzKTsKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9leG1vZGVfZW51bSwKKwkJCQkgIE05ODA4OF9SRUdfNDFfU1BLREhQLCAwLCAxMjcsCisJCQkJICBtYXg5ODA4OF9leG1vZGVfdGV4dHMsCisJCQkJICBtYXg5ODA4OF9leG1vZGVfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDg4X2V4X3RocmVzaFtdID0geyAvKiB2b2x0cyBQUCAqLwogICAgICAgICIwLjYiLCAiMS4yIiwgIjEuOCIsICIyLjQiLCAiMy4wIiwgIjMuNiIsICI0LjIiLCAiNC44In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDg4X2V4X3RocmVzaF9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfNDJfU1BLREhQX1RIUkVTSCwgMCwgOCwKLSAgICAgICAgICAgICAgIG1heDk4MDg4X2V4X3RocmVzaCksCi19Oworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDg4X2V4X3RocmVzaF9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfNDJfU1BLREhQX1RIUkVTSCwgMCwKKwkJCSAgICBtYXg5ODA4OF9leF90aHJlc2gpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwODhfZmx0cl9tb2RlW10gPSB7IlZvaWNlIiwgIk11c2ljIiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA3LCAyLCBtYXg5ODA4OF9mbHRyX21vZGUpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9maWx0ZXJfbW9kZV9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA3LAorCQkJICAgIG1heDk4MDg4X2ZsdHJfbW9kZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA4OF9leHRtaWNfdGV4dFtdID0geyAiTm9uZSIsICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwODhfZXh0bWljX2VudW0gPQotICAgICAgIFNPQ19FTlVNX1NJTkdMRShNOTgwODhfUkVHXzQ4X0NGR19NSUMsIDAsIDMsIG1heDk4MDg4X2V4dG1pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9leHRtaWNfZW51bSwKKwkJCSAgICBNOTgwODhfUkVHXzQ4X0NGR19NSUMsIDAsCisJCQkgICAgbWF4OTgwODhfZXh0bWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwODhfZXh0bWljX211eCA9CiAgICAgICAgU09DX0RBUE1fRU5VTSgiRXh0ZXJuYWwgTUlDIE11eCIsIG1heDk4MDg4X2V4dG1pY19lbnVtKTsKQEAgLTYyNiwxMiArNjI1LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwODhfZGFpMV9mbHRyW10gPSB7CiAgICAgICAgIk9mZiIsICJmYz0yNTgvZnM9MTZrIiwgImZjPTUwMC9mcz0xNmsiLAogICAgICAgICJmYz0yNTgvZnM9OGsiLCAiZmM9NTAwL2ZzPThrIiwgImZjPTIwMCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA4OF9kYWkxX2RhY19maWx0ZXJfZW51bVtdID0gewotICAgICAgIFNPQ19FTlVNX1NJTkdMRShNOTgwODhfUkVHXzE4X0RBSTFfRklMVEVSUywgMCwgNiwgbWF4OTgwODhfZGFpMV9mbHRyKSwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDg4X2RhaTFfYWRjX2ZpbHRlcl9lbnVtW10gPSB7Ci0gICAgICAgU09DX0VOVU1fU0lOR0xFKE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA0LCA2LCBtYXg5ODA4OF9kYWkxX2ZsdHIpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA4OF9kYWkxX2RhY19maWx0ZXJfZW51bSwKKwkJCSAgICBNOTgwODhfUkVHXzE4X0RBSTFfRklMVEVSUywgMCwKKwkJCSAgICBtYXg5ODA4OF9kYWkxX2ZsdHIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDg4X2RhaTFfYWRjX2ZpbHRlcl9lbnVtLAorCQkJICAgIE05ODA4OF9SRUdfMThfREFJMV9GSUxURVJTLCA0LAorCQkJICAgIG1heDk4MDg4X2RhaTFfZmx0cik7CiAKIHN0YXRpYyBpbnQgbWF4OTgwODhfbWljMXByZV9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0xODQ5LDcgKzE4NDgsNyBAQAogCiAgICAgICAgLyogTm93IHBvaW50IHRoZSBzb2NfZW51bSB0byAudGV4dHMgYXJyYXkgaXRlbXMgKi8KICAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS50ZXh0cyA9IG1heDk4MDg4LT5lcV90ZXh0czsKLSAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS5tYXggPSBtYXg5ODA4OC0+ZXFfdGV4dGNudDsKKyAgICAgICBtYXg5ODA4OC0+ZXFfZW51bS5pdGVtcyA9IG1heDk4MDg4LT5lcV90ZXh0Y250OwogCiAgICAgICAgcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CiAgICAgICAgaWYgKHJldCAhPSAwKQpAQCAtMTkxNSwxMiArMTkxNCw2IEBACiAKICAgICAgICByZWdjYWNoZV9tYXJrX2RpcnR5KG1heDk4MDg4LT5yZWdtYXApOwogCi0gICAgICAgcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLSAgICAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgICAgICAgIGRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLSAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgfQotCiAgICAgICAgLyogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KIAogICAgICAgIG1heDk4MDg4LT5zeXNjbGsgPSAodW5zaWduZWQpLTE7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmMKaW5kZXggOWY3MTRlYS4uOThjNmUxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuYwpAQCAtNTEzLDY1ICs1MTMsNzUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9wd3JfcGVyZl90ZXh0W10gPQogCXsgIkxvdyBQb3dlciIsICJIaWdoIFBlcmZvcm1hbmNlIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfQklBU19DT05UUk9MLCBNOTgwOTBfVkNNX01PREVfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcHdyX3BlcmZfdGV4dCksIG1heDk4MDkwX3B3cl9wZXJmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0JJQVNfQ09OVFJPTCwKKwkJCSAgICBNOTgwOTBfVkNNX01PREVfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9vc3IxMjhfdGV4dFtdID0geyAiNjQqZnMiLCAiMTI4KmZzIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX29zcjEyOF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19BRENfQ09OVFJPTCwgTTk4MDkwX09TUjEyOF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9vc3IxMjhfdGV4dCksIG1heDk4MDkwX29zcjEyOF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9vc3IxMjhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0FEQ19DT05UUk9MLAorCQkJICAgIE05ODA5MF9PU1IxMjhfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfb3NyMTI4X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfbW9kZV90ZXh0W10gPSB7ICJWb2ljZSIsICJNdXNpYyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0ZJTFRFUl9DT05GSUcsIE05ODA5MF9NT0RFX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX21vZGVfdGV4dCksIG1heDk4MDkwX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfbW9kZV9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfRklMVEVSX0NPTkZJRywKKwkJCSAgICBNOTgwOTBfTU9ERV9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2ZpbHRlcl9kbWljMzRtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0ZJTFRFUl9DT05GSUcsCi0JCU05ODA5MF9GTFRfRE1JQzM0TU9ERV9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9tb2RlX3RleHQpLCBtYXg5ODA5MF9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2ZpbHRlcl9kbWljMzRtb2RlX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19GSUxURVJfQ09ORklHLAorCQkJICAgIE05ODA5MF9GTFRfRE1JQzM0TU9ERV9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfZHJjYXRrX3RleHRbXSA9CiAJeyAiMC41bXMiLCAiMW1zIiwgIjVtcyIsICIxMG1zIiwgIjI1bXMiLCAiNTBtcyIsICIxMDBtcyIsICIyMDBtcyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9kcmNhdGtfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfRFJDX1RJTUlORywgTTk4MDkwX0RSQ0FUS19TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9kcmNhdGtfdGV4dCksIG1heDk4MDkwX2RyY2F0a190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9kcmNhdGtfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0RSQ19USU1JTkcsCisJCQkgICAgTTk4MDkwX0RSQ0FUS19TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9kcmNhdGtfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICptYXg5ODA5MF9kcmNybHNfdGV4dFtdID0KIAl7ICI4cyIsICI0cyIsICIycyIsICIxcyIsICIwLjVzIiwgIjAuMjVzIiwgIjAuMTI1cyIsICIwLjA2MjVzIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RyY3Jsc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfVElNSU5HLCBNOTgwOTBfRFJDUkxTX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX2RyY3Jsc190ZXh0KSwgbWF4OTgwOTBfZHJjcmxzX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RyY3Jsc19lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfRFJDX1RJTUlORywKKwkJCSAgICBNOTgwOTBfRFJDUkxTX1NISUZULAorCQkJICAgIG1heDk4MDkwX2RyY3Jsc190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDkwX2FsY2NtcF90ZXh0W10gPQogCXsgIjE6MSIsICIxOjEuNSIsICIxOjIiLCAiMTo0IiwgIjE6SU5GIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2FsY2NtcF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfQ09NUFJFU1NPUiwgTTk4MDkwX0RSQ0NNUF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9hbGNjbXBfdGV4dCksIG1heDk4MDkwX2FsY2NtcF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9hbGNjbXBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0RSQ19DT01QUkVTU09SLAorCQkJICAgIE05ODA5MF9EUkNDTVBfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfYWxjY21wX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWF4OTgwOTBfZHJjZXhwX3RleHRbXSA9IHsgIjE6MSIsICIyOjEiLCAiMzoxIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RyY2V4cF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19EUkNfRVhQQU5ERVIsIE05ODA5MF9EUkNFWFBfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfZHJjZXhwX3RleHQpLCBtYXg5ODA5MF9kcmNleHBfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfZHJjZXhwX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19EUkNfRVhQQU5ERVIsCisJCQkgICAgTTk4MDkwX0RSQ0VYUF9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9kcmNleHBfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfZGFjX3BlcmZtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0RBQ19DT05UUk9MLCBNOTgwOTBfUEVSRk1PREVfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcGVyZl9wd3JfdGV4dCksIG1heDk4MDkwX3BlcmZfcHdyX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RhY19wZXJmbW9kZV9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfREFDX0NPTlRST0wsCisJCQkgICAgTTk4MDkwX1BFUkZNT0RFX1NISUZULAorCQkJICAgIG1heDk4MDkwX3BlcmZfcHdyX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDkwX2RhY2hwX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0RBQ19DT05UUk9MLCBNOTgwOTBfREFDSFBfU0hJRlQsCi0JCUFSUkFZX1NJWkUobWF4OTgwOTBfcHdyX3BlcmZfdGV4dCksIG1heDk4MDkwX3B3cl9wZXJmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX2RhY2hwX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19EQUNfQ09OVFJPTCwKKwkJCSAgICBNOTgwOTBfREFDSFBfU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfYWRjaHBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfQURDX0NPTlRST0wsIE05ODA5MF9BRENIUF9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9wd3JfcGVyZl90ZXh0KSwgbWF4OTgwOTBfcHdyX3BlcmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTBfYWRjaHBfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0FEQ19DT05UUk9MLAorCQkJICAgIE05ODA5MF9BRENIUF9TSElGVCwKKwkJCSAgICBtYXg5ODA5MF9wd3JfcGVyZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJNSUMgQmlhcyBWQ00gQmFuZGdhcCIsIG1heDk4MDkwX3ZjbWJhbmRnYXBfZW51bSksCkBAIC04NDIsMzkgKzg1Miw0MiBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbWljMV9tdXhfdGV4dFtdID0geyAiSU4xMiIsICJJTjU2IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pYzFfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0lOUFVUX01PREUsIE05ODA5MF9FWFRNSUMxX1NISUZULAotCQlBUlJBWV9TSVpFKG1pYzFfbXV4X3RleHQpLCBtaWMxX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaWMxX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU5QVVRfTU9ERSwKKwkJCSAgICBNOTgwOTBfRVhUTUlDMV9TSElGVCwKKwkJCSAgICBtaWMxX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX21pYzFfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSUMxIE11eCIsIG1pYzFfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWljMl9tdXhfdGV4dFtdID0geyAiSU4zNCIsICJJTjU2IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pYzJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0lOUFVUX01PREUsIE05ODA5MF9FWFRNSUMyX1NISUZULAotCQlBUlJBWV9TSVpFKG1pYzJfbXV4X3RleHQpLCBtaWMyX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaWMyX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU5QVVRfTU9ERSwKKwkJCSAgICBNOTgwOTBfRVhUTUlDMl9TSElGVCwKKwkJCSAgICBtaWMyX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX21pYzJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSUMyIE11eCIsIG1pYzJfbXV4X2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZG1pY19tdXhfdGV4dFtdID0geyAiQURDIiwgIkRNSUMiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZG1pY19tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGRtaWNfbXV4X3RleHQpLCBkbWljX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfVklSVF9ERUNMKGRtaWNfbXV4X2VudW0sIGRtaWNfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTBfZG1pY19tdXggPQogCVNPQ19EQVBNX0VOVU1fVklSVCgiRE1JQyBNdXgiLCBkbWljX211eF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1heDk4MDkwX21pY3ByZV90ZXh0W10gPSB7ICJPZmYiLCAiT24iIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTBfcGExZW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfTUlDMV9JTlBVVF9MRVZFTCwgTTk4MDkwX01JQ19QQTFFTl9TSElGVCwKLQkJQVJSQVlfU0laRShtYXg5ODA5MF9taWNwcmVfdGV4dCksIG1heDk4MDkwX21pY3ByZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5MF9wYTFlbl9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfTUlDMV9JTlBVVF9MRVZFTCwKKwkJCSAgICBNOTgwOTBfTUlDX1BBMUVOX1NISUZULAorCQkJICAgIG1heDk4MDkwX21pY3ByZV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5MF9wYTJlbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19NSUMyX0lOUFVUX0xFVkVMLCBNOTgwOTBfTUlDX1BBMkVOX1NISUZULAotCQlBUlJBWV9TSVpFKG1heDk4MDkwX21pY3ByZV90ZXh0KSwgbWF4OTgwOTBfbWljcHJlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDkwX3BhMmVuX2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19NSUMyX0lOUFVUX0xFVkVMLAorCQkJICAgIE05ODA5MF9NSUNfUEEyRU5fU0hJRlQsCisJCQkgICAgbWF4OTgwOTBfbWljcHJlX3RleHQpOwogCiAvKiBMSU5FQSBtaXhlciBzd2l0Y2ggKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9saW5lYV9taXhlcl9jb250cm9sc1tdID0gewpAQCAtOTM4LDEzICs5NTEsMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmx0ZW5fbXV4X3RleHRbXSA9IHsgIk5vcm1hbCIsICJMb29wdGhyb3VnaCIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsdGVubF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xURU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobHRlbl9tdXhfdGV4dCksIGx0ZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGx0ZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTFRFTl9TSElGVCwKKwkJCSAgICBsdGVuX211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsdGVucl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xURU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobHRlbl9tdXhfdGV4dCksIGx0ZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGx0ZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTFRFTl9TSElGVCwKKwkJCSAgICBsdGVuX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2x0ZW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTFRFTkwgTXV4IiwgbHRlbmxfbXV4X2VudW0pOwpAQCAtOTU0LDEzICs5NjksMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxiZW5fbXV4X3RleHRbXSA9IHsgIk5vcm1hbCIsICJMb29wYmFjayIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsYmVubF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xCRU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobGJlbl9tdXhfdGV4dCksIGxiZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxiZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTEJFTl9TSElGVCwKKwkJCSAgICBsYmVuX211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsYmVucl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwgTTk4MDkwX0xCRU5fU0hJRlQsCi0JCUFSUkFZX1NJWkUobGJlbl9tdXhfdGV4dCksIGxiZW5fbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxiZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfSU9fQ09ORklHVVJBVElPTiwKKwkJCSAgICBNOTgwOTBfTEJFTl9TSElGVCwKKwkJCSAgICBsYmVuX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2xiZW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTEJFTkwgTXV4IiwgbGJlbmxfbXV4X2VudW0pOwpAQCAtOTcyLDEzICs5ODksMTUgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0ZW5yX211eF90ZXh0W10gPSB7ICJOb3JtYWwiLCAiU2lkZXRvbmUgUmlnaHQiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RlbmxfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0FEQ19TSURFVE9ORSwgTTk4MDkwX0RTVFNMX1NISUZULAotCQlBUlJBWV9TSVpFKHN0ZW5sX211eF90ZXh0KSwgc3RlbmxfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZW5sX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfQURDX1NJREVUT05FLAorCQkJICAgIE05ODA5MF9EU1RTTF9TSElGVCwKKwkJCSAgICBzdGVubF9tdXhfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RlbnJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTBfUkVHX0FEQ19TSURFVE9ORSwgTTk4MDkwX0RTVFNSX1NISUZULAotCQlBUlJBWV9TSVpFKHN0ZW5yX211eF90ZXh0KSwgc3RlbnJfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZW5yX211eF9lbnVtLAorCQkJICAgIE05ODA5MF9SRUdfQURDX1NJREVUT05FLAorCQkJICAgIE05ODA5MF9EU1RTUl9TSElGVCwKKwkJCSAgICBzdGVucl9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9zdGVubF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNURU5MIE11eCIsIHN0ZW5sX211eF9lbnVtKTsKQEAgLTEwODYsOSArMTEwNSwxMCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbGlubW9kX211eF90ZXh0W10gPSB7ICJMZWZ0IE9ubHkiLCAiTGVmdCBhbmQgUmlnaHQiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlubW9kX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19MT1VUUl9NSVhFUiwgTTk4MDkwX0xJTk1PRF9TSElGVCwKLQkJQVJSQVlfU0laRShsaW5tb2RfbXV4X3RleHQpLCBsaW5tb2RfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxpbm1vZF9tdXhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0xPVVRSX01JWEVSLAorCQkJICAgIE05ODA5MF9MSU5NT0RfU0hJRlQsCisJCQkgICAgbGlubW9kX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDkwX2xpbm1vZF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxJTk1PRCBNdXgiLCBsaW5tb2RfbXV4X2VudW0pOwpAQCAtMTA5OCwxNiArMTExOCwxOCBAQAogLyoKICAqIFRoaXMgaXMgYSBtdXggYXMgaXQgc2VsZWN0cyB0aGUgSFAgb3V0cHV0LCBidXQgdG8gREFQTSBpdCBpcyBhIE1peGVyIGVuYWJsZQogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1peGhwbHNlbF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5MF9SRUdfSFBfQ09OVFJPTCwgTTk4MDkwX01JWEhQTFNFTF9TSElGVCwKLQkJQVJSQVlfU0laRShtaXhocHNlbF9tdXhfdGV4dCksIG1peGhwc2VsX211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtaXhocGxzZWxfbXV4X2VudW0sCisJCQkgICAgTTk4MDkwX1JFR19IUF9DT05UUk9MLAorCQkJICAgIE05ODA5MF9NSVhIUExTRUxfU0hJRlQsCisJCQkgICAgbWl4aHBzZWxfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTBfbWl4aHBsc2VsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTUlYSFBMU0VMIE11eCIsIG1peGhwbHNlbF9tdXhfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWl4aHByc2VsX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDkwX1JFR19IUF9DT05UUk9MLCBNOTgwOTBfTUlYSFBSU0VMX1NISUZULAotCQlBUlJBWV9TSVpFKG1peGhwc2VsX211eF90ZXh0KSwgbWl4aHBzZWxfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1peGhwcnNlbF9tdXhfZW51bSwKKwkJCSAgICBNOTgwOTBfUkVHX0hQX0NPTlRST0wsCisJCQkgICAgTTk4MDkwX01JWEhQUlNFTF9TSElGVCwKKwkJCSAgICBtaXhocHNlbF9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODA5MF9taXhocHJzZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNSVhIUFJTRUwgTXV4IiwgbWl4aHByc2VsX211eF9lbnVtKTsKQEAgLTIxOTYsMTQgKzIyMTgsNiBAQAogCiAJbWF4OTgwOTAtPmNvZGVjID0gY29kZWM7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gbWF4OTgwOTAtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBSZXNldCB0aGUgY29kZWMsIHRoZSBEU1AgY29yZSwgYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KIAltYXg5ODA5MF9yZXNldChtYXg5ODA5MCk7CiAKQEAgLTIzMjksNyArMjM0Myw2IEBACiAKIAltYXg5ODA5MC0+ZGV2dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBtYXg5ODA5MCk7Ci0JbWF4OTgwOTAtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAltYXg5ODA5MC0+cGRhdGEgPSBpMmMtPmRldi5wbGF0Zm9ybV9kYXRhOwogCW1heDk4MDkwLT5pcnEgPSBpMmMtPmlycTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5oIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5oCmluZGV4IDdlMTAzZjIuLjFhNGUyMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmgKQEAgLTE1MjMsNyArMTUyMyw2IEBACiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAllbnVtIG1heDk4MDkwX3R5cGUgZGV2dHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJc3RydWN0IG1heDk4MDkwX3BkYXRhICpwZGF0YTsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCXVuc2lnbmVkIGludCBiY2xrOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCmluZGV4IDNiYTExNzAuLjAzZjA1MzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKQEAgLTU2MCwyNSArNTYwLDI3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF4OTgwOTVfZmx0cl9tb2RlW10gPSB7ICJWb2ljZSIsICJNdXNpYyIgfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpMV9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMkVfREFJMV9GSUxURVJTLCA3LCAyLCBtYXg5ODA5NV9mbHRyX21vZGUpLAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpMl9maWx0ZXJfbW9kZV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMzhfREFJMl9GSUxURVJTLCA3LCAyLCBtYXg5ODA5NV9mbHRyX21vZGUpLAotfTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkxX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgTTk4MDk1XzAyRV9EQUkxX0ZJTFRFUlMsIDcsCisJCQkgICAgbWF4OTgwOTVfZmx0cl9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkyX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgTTk4MDk1XzAzOF9EQUkyX0ZJTFRFUlMsIDcsCisJCQkgICAgbWF4OTgwOTVfZmx0cl9tb2RlKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9leHRtaWNfdGV4dFtdID0geyAiTm9uZSIsICJNSUMxIiwgIk1JQzIiIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZXh0bWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTVfMDg3X0NGR19NSUMsIDAsIDMsIG1heDk4MDk1X2V4dG1pY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9leHRtaWNfZW51bSwKKwkJCSAgICBNOTgwOTVfMDg3X0NGR19NSUMsIDAsCisJCQkgICAgbWF4OTgwOTVfZXh0bWljX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTgwOTVfZXh0bWljX211eCA9CiAJU09DX0RBUE1fRU5VTSgiRXh0ZXJuYWwgTUlDIE11eCIsIG1heDk4MDk1X2V4dG1pY19lbnVtKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9saW5laW5fdGV4dFtdID0geyAiSU5BIiwgIklOQiIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5NV9saW5laW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wODZfQ0ZHX0xJTkUsIDYsIDIsIG1heDk4MDk1X2xpbmVpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9saW5laW5fZW51bSwKKwkJCSAgICBNOTgwOTVfMDg2X0NGR19MSU5FLCA2LAorCQkJICAgIG1heDk4MDk1X2xpbmVpbl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4MDk1X2xpbmVpbl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxpbmVpbiBJbnB1dCBNdXgiLCBtYXg5ODA5NV9saW5laW5fZW51bSk7CkBAIC01ODYsMjQgKzU4OCwyNiBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXg5ODA5NV9saW5lX21vZGVfdGV4dFtdID0gewogCSJTdGVyZW8iLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfbGluZWluX21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wODZfQ0ZHX0xJTkUsIDcsIDIsIG1heDk4MDk1X2xpbmVfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9saW5laW5fbW9kZV9lbnVtLAorCQkJICAgIE05ODA5NV8wODZfQ0ZHX0xJTkUsIDcsCisJCQkgICAgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDk1X2xpbmVvdXRfbW9kZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDk1XzA4Nl9DRkdfTElORSwgNCwgMiwgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDk1X2xpbmVvdXRfbW9kZV9lbnVtLAorCQkJICAgIE05ODA5NV8wODZfQ0ZHX0xJTkUsIDQsCisJCQkgICAgbWF4OTgwOTVfbGluZV9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1heDk4MDk1X2RhaV9mbHRyW10gPSB7CiAJIk9mZiIsICJFbGxpcHRpY2FsLUhQRi0xNmsiLCAiQnV0dGVyd29ydGgtSFBGLTE2ayIsCiAJIkVsbGlwdGljYWwtSFBGLThrIiwgIkJ1dHRlcndvcnRoLUhQRi04ayIsICJCdXR0ZXJ3b3J0aC1IUEYtRnMvMjQwIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1heDk4MDk1X2RhaTFfZGFjX2ZpbHRlcl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKE05ODA5NV8wMkVfREFJMV9GSUxURVJTLCAwLCA2LCBtYXg5ODA5NV9kYWlfZmx0ciksCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODA5NV9kYWkyX2RhY19maWx0ZXJfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShNOTgwOTVfMDM4X0RBSTJfRklMVEVSUywgMCwgNiwgbWF4OTgwOTVfZGFpX2ZsdHIpLAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTgwOTVfZGFpM19kYWNfZmlsdGVyX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEUoTTk4MDk1XzA0Ml9EQUkzX0ZJTFRFUlMsIDAsIDYsIG1heDk4MDk1X2RhaV9mbHRyKSwKLX07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTgwOTVfZGFpMV9kYWNfZmlsdGVyX2VudW0sCisJCQkgICAgTTk4MDk1XzAyRV9EQUkxX0ZJTFRFUlMsIDAsCisJCQkgICAgbWF4OTgwOTVfZGFpX2ZsdHIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1heDk4MDk1X2RhaTJfZGFjX2ZpbHRlcl9lbnVtLAorCQkJICAgIE05ODA5NV8wMzhfREFJMl9GSUxURVJTLCAwLAorCQkJICAgIG1heDk4MDk1X2RhaV9mbHRyKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtYXg5ODA5NV9kYWkzX2RhY19maWx0ZXJfZW51bSwKKwkJCSAgICBNOTgwOTVfMDQyX0RBSTNfRklMVEVSUywgMCwKKwkJCSAgICBtYXg5ODA5NV9kYWlfZmx0cik7CiAKIHN0YXRpYyBpbnQgbWF4OTgwOTVfbWljMXByZV9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0xODYxLDcgKzE4NjUsNyBAQAogCiAJLyogTm93IHBvaW50IHRoZSBzb2NfZW51bSB0byAudGV4dHMgYXJyYXkgaXRlbXMgKi8KIAltYXg5ODA5NS0+ZXFfZW51bS50ZXh0cyA9IG1heDk4MDk1LT5lcV90ZXh0czsKLQltYXg5ODA5NS0+ZXFfZW51bS5tYXggPSBtYXg5ODA5NS0+ZXFfdGV4dGNudDsKKwltYXg5ODA5NS0+ZXFfZW51bS5pdGVtcyA9IG1heDk4MDk1LT5lcV90ZXh0Y250OwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CiAJaWYgKHJldCAhPSAwKQpAQCAtMjAxNiw3ICsyMDIwLDcgQEAKIAogCS8qIE5vdyBwb2ludCB0aGUgc29jX2VudW0gdG8gLnRleHRzIGFycmF5IGl0ZW1zICovCiAJbWF4OTgwOTUtPmJxX2VudW0udGV4dHMgPSBtYXg5ODA5NS0+YnFfdGV4dHM7Ci0JbWF4OTgwOTUtPmJxX2VudW0ubWF4ID0gbWF4OTgwOTUtPmJxX3RleHRjbnQ7CisJbWF4OTgwOTUtPmJxX2VudW0uaXRlbXMgPSBtYXg5ODA5NS0+YnFfdGV4dGNudDsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBjb250cm9scywgQVJSQVlfU0laRShjb250cm9scykpOwogCWlmIChyZXQgIT0gMCkKQEAgLTIyMzQsMTIgKzIyMzgsNiBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJaW50IHJldCA9IDA7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogcmVzZXQgdGhlIGNvZGVjLCB0aGUgRFNQIGNvcmUsIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCiAJbWF4OTgwOTVfcmVzZXQoY29kZWMpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCmluZGV4IDgyNzU3ZWIuLjRmZGY1YWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCkBAIC0zMTIsMTQgKzMxMiw2IEBACiAKIHN0YXRpYyBpbnQgbWF4OTg1MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIGVuYWJsZSB6ZXJvLWRldGVjdCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1BWDk4NTBfR0VORVJBTF9QVVJQT1NFLCAxLCAxKTsKIAkvKiBlbmFibGUgc2xldy1yYXRlIGNvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWMxMzc4My5jIGIvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKaW5kZXggNTgyYzJiYi4uMmM1OWIxZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMKQEAgLTEwNiw4ICsxMDYsNyBAQAogCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJdW5zaWduZWQgaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCWludCBpOwogCkBAIC0xMjYsOCArMTI1LDcgQEAKIAkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXVuc2lnbmVkIGludCByYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC00MDgsOCArNDA2LDcgQEAKIAkiTUMxTCIsICJSWElOTCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY2xfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKDAsIDAsIEFSUkFZX1NJWkUoYWRjbF9lbnVtX3RleHQpLCBhZGNsX2VudW1fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChhZGNsX2VudW0sIGFkY2xfZW51bV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfaW5wdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIlJvdXRlIiwgYWRjbF9lbnVtKTsKQEAgLTQxOCw4ICs0MTUsNyBAQAogCSJNQzFSIiwgIk1DMiIsICJSWElOUiIsICJUWElOIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgQVJSQVlfU0laRShhZGNyX2VudW1fdGV4dCksIGFkY3JfZW51bV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfVklSVF9ERUNMKGFkY3JfZW51bSwgYWRjcl9lbnVtX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfaW5wdXRfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIlJvdXRlIiwgYWRjcl9lbnVtKTsKQEAgLTQzMCw4ICs0MjYsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGVha2VyX2FtcF9zb3VyY2VfdGV4dFtdID0gewogCSJDT0RFQyIsICJSaWdodCIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9hbXBfc291cmNlLCBNQzEzNzgzX0FVRElPX1JYMCwgNCwKLQkJCQkgIHNwZWFrZXJfYW1wX3NvdXJjZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGVha2VyX2FtcF9zb3VyY2UsIE1DMTM3ODNfQVVESU9fUlgwLCA0LAorCQkJICAgIHNwZWFrZXJfYW1wX3NvdXJjZV90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGVha2VyX2FtcF9zb3VyY2VfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTcGVha2VyIEFtcCBTb3VyY2UgTVVYIiwgc3BlYWtlcl9hbXBfc291cmNlKTsKIApAQCAtNDM5LDggKzQzNSw4IEBACiAJIkNPREVDIiwgIk1peGVyIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhlYWRzZXRfYW1wX3NvdXJjZSwgTUMxMzc4M19BVURJT19SWDAsIDExLAotCQkJCSAgaGVhZHNldF9hbXBfc291cmNlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhlYWRzZXRfYW1wX3NvdXJjZSwgTUMxMzc4M19BVURJT19SWDAsIDExLAorCQkJICAgIGhlYWRzZXRfYW1wX3NvdXJjZV90ZXh0KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZWFkc2V0X2FtcF9zb3VyY2VfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIZWFkc2V0IEFtcCBTb3VyY2UgTVVYIiwgaGVhZHNldF9hbXBfc291cmNlKTsKIApAQCAtNTgwLDkgKzU3Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1jMTM3ODNfM2RfbWl4ZXJbXSA9IHsiU3RlcmVvIiwgIlBoYXNlIE1peCIsCiAJCQkJCQkiTW9ubyIsICJNb25vIE1peCJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1jMTM3ODNfZW51bV8zZF9taXhlciA9Ci0JU09DX0VOVU1fU0lOR0xFKE1DMTM3ODNfQVVESU9fUlgxLCAxNiwgQVJSQVlfU0laRShtYzEzNzgzXzNkX21peGVyKSwKLQkJCW1jMTM3ODNfM2RfbWl4ZXIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1jMTM3ODNfZW51bV8zZF9taXhlciwKKwkJCSAgICBNQzEzNzgzX0FVRElPX1JYMSwgMTYsCisJCQkgICAgbWMxMzc4M18zZF9taXhlcik7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYzEzNzgzX2NvbnRyb2xfbGlzdFtdID0gewogCVNPQ19TSU5HTEUoIkxvdWRzcGVha2VyIGVuYWJsZSIsIE1DMTM3ODNfQVVESU9fUlgwLCA1LCAxLCAwKSwKQEAgLTYxNCw4ICs2MTAsOCBAQAogCXN0cnVjdCBtYzEzNzgzX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYtPnBhcmVudCwgTlVMTCk7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDI0LCBTTkRfU09DX1JFR01BUCk7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsCisJCQlkZXZfZ2V0X3JlZ21hcChjb2RlYy0+ZGV2LT5wYXJlbnQsIE5VTEwpKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMgYi9zb3VuZC9zb2MvY29kZWNzL21sMjYxMjQuYwppbmRleCAxODVmYTNiYy4uZTY2MWU4NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKQEAgLTczLDExICs3MywxMSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtbDI2MTI0X2NvbXBhbmRpbmdbXSA9IHsiMTZiaXQgUENNIiwgInUtbGF3IiwKIAkJCQkJCSAgIkEtbGF3In07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWwyNjEyNF9hZGNfY29tcGFuZGluZ19lbnVtCi0JPSBTT0NfRU5VTV9TSU5HTEUoTUwyNjEyNF9TQUlfVFJBTlNfQ1RMLCA2LCAzLCBtbDI2MTI0X2NvbXBhbmRpbmcpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1sMjYxMjRfYWRjX2NvbXBhbmRpbmdfZW51bSwKKwkJCSAgICBNTDI2MTI0X1NBSV9UUkFOU19DVEwsIDYsIG1sMjYxMjRfY29tcGFuZGluZyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWwyNjEyNF9kYWNfY29tcGFuZGluZ19lbnVtCi0JPSBTT0NfRU5VTV9TSU5HTEUoTUwyNjEyNF9TQUlfUkNWX0NUTCwgNiwgMywgbWwyNjEyNF9jb21wYW5kaW5nKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtbDI2MTI0X2RhY19jb21wYW5kaW5nX2VudW0sCisJCQkgICAgTUwyNjEyNF9TQUlfUkNWX0NUTCwgNiwgbWwyNjEyNF9jb21wYW5kaW5nKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1sMjYxMjRfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRV9UTFYoIkNhcHR1cmUgRGlnaXRhbCBWb2x1bWUiLCBNTDI2MTI0X1JFQ09SRF9ESUdfVk9MLCAwLApAQCAtMTM2LDggKzEzNiw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1sMjYxMjRfaW5wdXRfc2VsZWN0W10gPSB7IkFuYWxvZyBNSUMgU2luZ2xlRW5kZWQgaW4iLAogCQkJCSJEaWdpdGFsIE1JQyBpbiIsICJBbmFsb2cgTUlDIERpZmZlcmVudGlhbCBpbiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1sMjYxMjRfaW5zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1MMjYxMjRfTUlDX0lGX0NUTCwgMCwgMywgbWwyNjEyNF9pbnB1dF9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1sMjYxMjRfaW5zZWxfZW51bSwKKwkJCSAgICBNTDI2MTI0X01JQ19JRl9DVEwsIDAsIG1sMjYxMjRfaW5wdXRfc2VsZWN0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1sMjYxMjRfaW5wdXRfbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJJbnB1dCBTZWxlY3QiLCBtbDI2MTI0X2luc2VsX2VudW0pOwpAQCAtNTg2LDE2ICs1ODYsNiBAQAogCiBzdGF0aWMgaW50IG1sMjYxMjRfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7Ci0Jc3RydWN0IG1sMjYxMjRfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBTb2Z0d2FyZSBSZXNldCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1MMjYxMjRfU1dfUlNULCAweDAxLCAxKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNTDI2MTI0X1NXX1JTVCwgMHgwMSwgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCmluZGV4IDczZjljMzYuLmU0Mjc1NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCkBAIC0xNzIsMTYgKzE3MiwyMSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHBjbTE2ODFfcHJpdmF0ZSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCB2YWwgPSAwLCByZXQ7Ci0JaW50IHBjbV9mb3JtYXQgPSBwYXJhbXNfZm9ybWF0KHBhcmFtcyk7CiAKIAlwcml2LT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAogCXN3aXRjaCAocHJpdi0+Zm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6Ci0JCWlmIChwY21fZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQotCQkJdmFsID0gMHgwMDsKLQkJZWxzZSBpZiAocGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkKLQkJCXZhbCA9IDB4MDM7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAyNDoKKwkJCXZhbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCXZhbCA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgogCQl2YWwgPSAweDA0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jCmluZGV4IDcxNDY2NTNhLi4zYTgwYmE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE3OTJhLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzkyYS5jCkBAIC0xMDcsMjQgKzEwNywzNSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHBjbTE3OTJhX3ByaXZhdGUgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgdmFsID0gMCwgcmV0OwotCWludCBwY21fZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChwYXJhbXMpOwogCiAJcHJpdi0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAKIAlzd2l0Y2ggKHByaXYtPmZvcm1hdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgotCQlpZiAocGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSB8fAotCQkgICAgcGNtX2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSkKLQkJCXZhbCA9IDB4MDI7Ci0JCWVsc2UgaWYgKHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCi0JCQl2YWwgPSAweDAwOworCQlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CisJCWNhc2UgMjQ6CisJCWNhc2UgMzI6CisJCQl2YWwgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQl2YWwgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKLQkJaWYgKHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUgfHwKLQkJICAgIHBjbV9mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpCi0JCQl2YWwgPSAweDA1OwotCQllbHNlIGlmIChwY21fZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKQotCQkJdmFsID0gMHgwNDsKKwkJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCQljYXNlIDI0OgorCQljYXNlIDMyOgorCQkJdmFsID0gNTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJdmFsID0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBEQUkgZm9ybWF0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1pMmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDYyMjMwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LWkyYy5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBQQ001MTJ4IENPREVDcworICoKKyAqIEF1dGhvcjoJTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPgorICoJCUNvcHlyaWdodCAyMDE0IExpbmFybyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgInBjbTUxMnguaCIKKworc3RhdGljIGludCBwY201MTJ4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmcGNtNTEyeF9yZWdtYXApOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCXJldHVybiBwY201MTJ4X3Byb2JlKCZpMmMtPmRldiwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCBwY201MTJ4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlwY201MTJ4X3JlbW92ZSgmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGNtNTEyeF9pMmNfaWRbXSA9IHsKKwl7ICJwY201MTIxIiwgfSwKKwl7ICJwY201MTIyIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGNtNTEyeF9pMmNfaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwY201MTJ4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxwY201MTIxIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHBjbTUxMjIiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBjbTUxMnhfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNtNTEyeF9pMmNfZHJpdmVyID0geworCS5wcm9iZSAJCT0gcGNtNTEyeF9pMmNfcHJvYmUsCisJLnJlbW92ZSAJPSBwY201MTJ4X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlCT0gcGNtNTEyeF9pMmNfaWQsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInBjbTUxMngiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcGNtNTEyeF9vZl9tYXRjaCwKKwkJLnBtICAgICA9ICZwY201MTJ4X3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIocGNtNTEyeF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFBDTTUxMnggY29kZWMgZHJpdmVyIC0gSTJDIik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMngtc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMngtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5NzA1OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC1zcGkuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUENNNTEyeCBDT0RFQ3MKKyAqCisgKiBBdXRob3I6CU1hcmsgQnJvd24gPGJyb29uaWVAbGluYXJvLm9yZz4KKyAqCQlDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAicGNtNTEyeC5oIgorCitzdGF0aWMgaW50IHBjbTUxMnhfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCByZXQ7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZwY201MTJ4X3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcGNtNTEyeF9wcm9iZSgmc3BpLT5kZXYsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcGNtNTEyeF9yZW1vdmUoJnNwaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHBjbTUxMnhfc3BpX2lkW10gPSB7CisJeyAicGNtNTEyMSIsIH0sCisJeyAicGNtNTEyMiIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBwY201MTJ4X3NwaV9pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjbTUxMnhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHBjbTUxMjEiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGkscGNtNTEyMiIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcGNtNTEyeF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwY201MTJ4X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBjbTUxMnhfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gcGNtNTEyeF9zcGlfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHBjbTUxMnhfc3BpX2lkLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInBjbTUxMngiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcGNtNTEyeF9vZl9tYXRjaCwKKwkJLnBtICAgICA9ICZwY201MTJ4X3BtX29wcywKKwl9LAorfTsKKworbW9kdWxlX3NwaV9kcml2ZXIocGNtNTEyeF9zcGlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0YzBjNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jCkBAIC0wLDAgKzEsNTg5IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUENNNTEyeCBDT0RFQ3MKKyAqCisgKiBBdXRob3I6CU1hcmsgQnJvd24gPGJyb29uaWVAbGluYXJvLm9yZz4KKyAqCQlDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInBjbTUxMnguaCIKKworI2RlZmluZSBQQ001MTJ4X05VTV9TVVBQTElFUyAzCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjbTUxMnhfc3VwcGx5X25hbWVzW1BDTTUxMnhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiQVZERCIsCisJIkRWREQiLAorCSJDUFZERCIsCit9OworCitzdHJ1Y3QgcGNtNTEyeF9wcml2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqc2NsazsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tQQ001MTJ4X05VTV9TVVBQTElFU107CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHN1cHBseV9uYltQQ001MTJ4X05VTV9TVVBQTElFU107Cit9OworCisvKgorICogV2UgY2FuJ3QgdXNlIHRoZSBzYW1lIG5vdGlmaWVyIGJsb2NrIGZvciBtb3JlIHRoYW4gb25lIHN1cHBseSBhbmQKKyAqIHRoZXJlJ3Mgbm8gd2F5IEkgY2FuIHNlZSB0byBnZXQgZnJvbSBhIGNhbGxiYWNrIHRvIHRoZSBjYWxsZXIKKyAqIGV4Y2VwdCBjb250YWluZXJfb2YoKS4KKyAqLworI2RlZmluZSBQQ001MTJ4X1JFR1VMQVRPUl9FVkVOVChuKSBcCitzdGF0aWMgaW50IHBjbTUxMnhfcmVndWxhdG9yX2V2ZW50XyMjbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCBcCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkgICAgXAoreyBcCisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHBjbTUxMnhfcHJpdiwgXAorCQkJCQkJICAgIHN1cHBseV9uYltuXSk7IFwKKwlpZiAoZXZlbnQgJiBSRUdVTEFUT1JfRVZFTlRfRElTQUJMRSkgeyBcCisJCXJlZ2NhY2hlX21hcmtfZGlydHkocGNtNTEyeC0+cmVnbWFwKTsJXAorCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHBjbTUxMngtPnJlZ21hcCwgdHJ1ZSk7CVwKKwl9IFwKKwlyZXR1cm4gMDsgXAorfQorCitQQ001MTJ4X1JFR1VMQVRPUl9FVkVOVCgwKQorUENNNTEyeF9SRUdVTEFUT1JfRVZFTlQoMSkKK1BDTTUxMnhfUkVHVUxBVE9SX0VWRU5UKDIpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgcGNtNTEyeF9yZWdfZGVmYXVsdHNbXSA9IHsKKwl7IFBDTTUxMnhfUkVTRVQsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfUE9XRVIsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfTVVURSwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRFNQLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfUExMX1JFRiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfREFDX1JPVVRJTkcsICAgICAgIDB4MTEgfSwKKwl7IFBDTTUxMnhfRFNQX1BST0dSQU0sICAgICAgIDB4MDEgfSwKKwl7IFBDTTUxMnhfQ0xLREVULCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQVVUT19NVVRFLCAgICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRVJST1JfREVURUNULCAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMSwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMiwgIDB4MzAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMywgIDB4MzAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsICAgIDB4MjIgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzIsICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfRElHSVRBTF9NVVRFXzMsICAgIDB4MDcgfSwKKwl7IFBDTTUxMnhfT1VUUFVUX0FNUExJVFVERSwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTCwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1QsIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX01VVEVfQ1RSTCwgIDB4MDAgfSwKKwl7IFBDTTUxMnhfQU5BTE9HX0dBSU5fQk9PU1QsIDB4MDAgfSwKKwl7IFBDTTUxMnhfVkNPTV9DVFJMXzEsICAgICAgIDB4MDAgfSwKKwl7IFBDTTUxMnhfVkNPTV9DVFJMXzIsICAgICAgIDB4MDEgfSwKK307CisKK3N0YXRpYyBib29sIHBjbTUxMnhfcmVhZGFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQQ001MTJ4X1JFU0VUOgorCWNhc2UgUENNNTEyeF9QT1dFUjoKKwljYXNlIFBDTTUxMnhfTVVURToKKwljYXNlIFBDTTUxMnhfUExMX0VOOgorCWNhc2UgUENNNTEyeF9TUElfTUlTT19GVU5DVElPTjoKKwljYXNlIFBDTTUxMnhfRFNQOgorCWNhc2UgUENNNTEyeF9HUElPX0VOOgorCWNhc2UgUENNNTEyeF9CQ0xLX0xSQ0xLX0NGRzoKKwljYXNlIFBDTTUxMnhfRFNQX0dQSU9fSU5QVVQ6CisJY2FzZSBQQ001MTJ4X01BU1RFUl9NT0RFOgorCWNhc2UgUENNNTEyeF9QTExfUkVGOgorCWNhc2UgUENNNTEyeF9QTExfQ09FRkZfMDoKKwljYXNlIFBDTTUxMnhfUExMX0NPRUZGXzE6CisJY2FzZSBQQ001MTJ4X1BMTF9DT0VGRl8yOgorCWNhc2UgUENNNTEyeF9QTExfQ09FRkZfMzoKKwljYXNlIFBDTTUxMnhfUExMX0NPRUZGXzQ6CisJY2FzZSBQQ001MTJ4X0RTUF9DTEtESVY6CisJY2FzZSBQQ001MTJ4X0RBQ19DTEtESVY6CisJY2FzZSBQQ001MTJ4X05DUF9DTEtESVY6CisJY2FzZSBQQ001MTJ4X09TUl9DTEtESVY6CisJY2FzZSBQQ001MTJ4X01BU1RFUl9DTEtESVZfMToKKwljYXNlIFBDTTUxMnhfTUFTVEVSX0NMS0RJVl8yOgorCWNhc2UgUENNNTEyeF9GU19TUEVFRF9NT0RFOgorCWNhc2UgUENNNTEyeF9JREFDXzE6CisJY2FzZSBQQ001MTJ4X0lEQUNfMjoKKwljYXNlIFBDTTUxMnhfRVJST1JfREVURUNUOgorCWNhc2UgUENNNTEyeF9JMlNfMToKKwljYXNlIFBDTTUxMnhfSTJTXzI6CisJY2FzZSBQQ001MTJ4X0RBQ19ST1VUSU5HOgorCWNhc2UgUENNNTEyeF9EU1BfUFJPR1JBTToKKwljYXNlIFBDTTUxMnhfQ0xLREVUOgorCWNhc2UgUENNNTEyeF9BVVRPX01VVEU6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzE6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzI6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzM6CisJY2FzZSBQQ001MTJ4X0RJR0lUQUxfTVVURV8xOgorCWNhc2UgUENNNTEyeF9ESUdJVEFMX01VVEVfMjoKKwljYXNlIFBDTTUxMnhfRElHSVRBTF9NVVRFXzM6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzE6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzI6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzM6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzQ6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzU6CisJY2FzZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzY6CisJY2FzZSBQQ001MTJ4X0dQSU9fQ09OVFJPTF8xOgorCWNhc2UgUENNNTEyeF9HUElPX0NPTlRST0xfMjoKKwljYXNlIFBDTTUxMnhfT1ZFUkZMT1c6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzE6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzI6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzM6CisJY2FzZSBQQ001MTJ4X1JBVEVfREVUXzQ6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19NVVRFX0RFVDoKKwljYXNlIFBDTTUxMnhfR1BJTjoKKwljYXNlIFBDTTUxMnhfRElHSVRBTF9NVVRFX0RFVDoKKwljYXNlIFBDTTUxMnhfT1VUUFVUX0FNUExJVFVERToKKwljYXNlIFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTDoKKwljYXNlIFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1Q6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19NVVRFX0NUUkw6CisJY2FzZSBQQ001MTJ4X0FOQUxPR19HQUlOX0JPT1NUOgorCWNhc2UgUENNNTEyeF9WQ09NX0NUUkxfMToKKwljYXNlIFBDTTUxMnhfVkNPTV9DVFJMXzI6CisJY2FzZSBQQ001MTJ4X0NSQU1fQ1RSTDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJLyogVGhlcmUgYXJlIDI1NiByYXcgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisJCXJldHVybiByZWcgPCAweGZmOworCX0KK30KKworc3RhdGljIGJvb2wgcGNtNTEyeF92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBDTTUxMnhfUExMX0VOOgorCWNhc2UgUENNNTEyeF9PVkVSRkxPVzoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMToKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMjoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfMzoKKwljYXNlIFBDTTUxMnhfUkFURV9ERVRfNDoKKwljYXNlIFBDTTUxMnhfQU5BTE9HX01VVEVfREVUOgorCWNhc2UgUENNNTEyeF9HUElOOgorCWNhc2UgUENNNTEyeF9ESUdJVEFMX01VVEVfREVUOgorCWNhc2UgUENNNTEyeF9DUkFNX0NUUkw6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCS8qIFRoZXJlIGFyZSAyNTYgcmF3IHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworCQlyZXR1cm4gcmVnIDwgMHhmZjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEwMzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW5hbG9nX3RsdiwgLTYwMCwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShib29zdF90bHYsIDAsIDgwLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY201MTJ4X2RzcF9wcm9ncmFtX3RleHRzW10gPSB7CisJIkZJUiBpbnRlcnBvbGF0aW9uIHdpdGggZGUtZW1waGFzaXMiLAorCSJMb3cgbGF0ZW5jeSBJSVIgd2l0aCBkZS1lbXBoYXNpcyIsCisJIkZpeGVkIHByb2Nlc3MgZmxvdyIsCisJIkhpZ2ggYXR0ZW51YXRpb24gd2l0aCBkZS1lbXBoYXNpcyIsCisJIlJpbmdpbmctbGVzcyBsb3cgbGF0ZW5jeSBGSVIiLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY201MTJ4X2RzcF9wcm9ncmFtX3ZhbHVlc1tdID0geworCTEsCisJMiwKKwkzLAorCTUsCisJNywKK307CisKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChwY201MTJ4X2RzcF9wcm9ncmFtLAorCQkJCSAgUENNNTEyeF9EU1BfUFJPR1JBTSwgMCwgMHgxZiwKKwkJCQkgIHBjbTUxMnhfZHNwX3Byb2dyYW1fdGV4dHMsCisJCQkJICBwY201MTJ4X2RzcF9wcm9ncmFtX3ZhbHVlcyk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtNTEyeF9jbGtfbWlzc2luZ190ZXh0W10gPSB7CisJIjFzIiwgIjJzIiwgIjNzIiwgIjRzIiwgIjVzIiwgIjZzIiwgIjdzIiwgIjhzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X2Nsa19taXNzaW5nID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9DTEtERVQsIDAsICA4LCBwY201MTJ4X2Nsa19taXNzaW5nX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjbTUxMnhfYXV0b21fdGV4dFtdID0geworCSIyMW1zIiwgIjEwNm1zIiwgIjIxM21zIiwgIjUzM21zIiwgIjEuMDdzIiwgIjIuMTNzIiwgIjUuMzNzIiwgIjEwLjY2cyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtNTEyeF9hdXRvbV9sID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9BVVRPX01VVEUsIFBDTTUxMnhfQVRNTF9TSElGVCwgOCwKKwkJCXBjbTUxMnhfYXV0b21fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcGNtNTEyeF9hdXRvbV9yID0KKwlTT0NfRU5VTV9TSU5HTEUoUENNNTEyeF9BVVRPX01VVEUsIFBDTTUxMnhfQVRNUl9TSElGVCwgOCwKKwkJCXBjbTUxMnhfYXV0b21fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtNTEyeF9yYW1wX3JhdGVfdGV4dFtdID0geworCSIxIHNhbXBsZS91cGRhdGUiLCAiMiBzYW1wbGVzL3VwZGF0ZSIsICI0IHNhbXBsZXMvdXBkYXRlIiwKKwkiSW1tZWRpYXRlIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZuZGYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8xLCBQQ001MTJ4X1ZOREZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZudWYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8xLCBQQ001MTJ4X1ZOVUZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBwY201MTJ4X3ZlZGYgPQorCVNPQ19FTlVNX1NJTkdMRShQQ001MTJ4X0RJR0lUQUxfTVVURV8yLCBQQ001MTJ4X1ZFREZfU0hJRlQsIDQsCisJCQlwY201MTJ4X3JhbXBfcmF0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY201MTJ4X3JhbXBfc3RlcF90ZXh0W10gPSB7CisJIjRkQi9zdGVwIiwgIjJkQi9zdGVwIiwgIjFkQi9zdGVwIiwgIjAuNWRCL3N0ZXAiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdm5kcyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsIFBDTTUxMnhfVk5EU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdm51cyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzEsIFBDTTUxMnhfVk5VU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHBjbTUxMnhfdmVkcyA9CisJU09DX0VOVU1fU0lOR0xFKFBDTTUxMnhfRElHSVRBTF9NVVRFXzIsIFBDTTUxMnhfVkVEU19TSElGVCwgNCwKKwkJCXBjbTUxMnhfcmFtcF9zdGVwX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGNtNTEyeF9jb250cm9sc1tdID0geworU09DX0RPVUJMRV9SX1RMVigiUGxheWJhY2sgRGlnaXRhbCBWb2x1bWUiLCBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzIsCisJCSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzMsIDAsIDI1NSwgMSwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTCwKKwkgICAgICAgUENNNTEyeF9MQUdOX1NISUZULCBQQ001MTJ4X1JBR05fU0hJRlQsIDEsIDEsIGFuYWxvZ190bHYpLAorU09DX0RPVUJMRV9UTFYoIlBsYXliYWNrIEJvb3N0IFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQk9PU1QsCisJICAgICAgIFBDTTUxMnhfQUdCTF9TSElGVCwgUENNNTEyeF9BR0JSX1NISUZULCAxLCAwLCBib29zdF90bHYpLAorU09DX0RPVUJMRSgiUGxheWJhY2sgRGlnaXRhbCBTd2l0Y2giLCBQQ001MTJ4X01VVEUsIFBDTTUxMnhfUlFNTF9TSElGVCwKKwkgICBQQ001MTJ4X1JRTVJfU0hJRlQsIDEsIDEpLAorCitTT0NfU0lOR0xFKCJEZWVtcGhhc2lzIFN3aXRjaCIsIFBDTTUxMnhfRFNQLCBQQ001MTJ4X0RFTVBfU0hJRlQsIDEsIDEpLAorU09DX1ZBTFVFX0VOVU0oIkRTUCBQcm9ncmFtIiwgcGNtNTEyeF9kc3BfcHJvZ3JhbSksCisKK1NPQ19FTlVNKCJDbG9jayBNaXNzaW5nIFBlcmlvZCIsIHBjbTUxMnhfY2xrX21pc3NpbmcpLAorU09DX0VOVU0oIkF1dG8gTXV0ZSBUaW1lIExlZnQiLCBwY201MTJ4X2F1dG9tX2wpLAorU09DX0VOVU0oIkF1dG8gTXV0ZSBUaW1lIFJpZ2h0IiwgcGNtNTEyeF9hdXRvbV9yKSwKK1NPQ19TSU5HTEUoIkF1dG8gTXV0ZSBNb25vIFN3aXRjaCIsIFBDTTUxMnhfRElHSVRBTF9NVVRFXzMsCisJICAgUENNNTEyeF9BQ1RMX1NISUZULCAxLCAwKSwKK1NPQ19ET1VCTEUoIkF1dG8gTXV0ZSBTd2l0Y2giLCBQQ001MTJ4X0RJR0lUQUxfTVVURV8zLCBQQ001MTJ4X0FNTEVfU0hJRlQsCisJICAgUENNNTEyeF9BTUxSX1NISUZULCAxLCAwKSwKKworU09DX0VOVU0oIlZvbHVtZSBSYW1wIERvd24gUmF0ZSIsIHBjbTUxMnhfdm5kZiksCitTT0NfRU5VTSgiVm9sdW1lIFJhbXAgRG93biBTdGVwIiwgcGNtNTEyeF92bmRzKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBVcCBSYXRlIiwgcGNtNTEyeF92bnVmKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBVcCBTdGVwIiwgcGNtNTEyeF92bnVzKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBEb3duIEVtZXJnZW5jeSBSYXRlIiwgcGNtNTEyeF92ZWRmKSwKK1NPQ19FTlVNKCJWb2x1bWUgUmFtcCBEb3duIEVtZXJnZW5jeSBTdGVwIiwgcGNtNTEyeF92ZWRzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBwY201MTJ4X2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX0RBQygiREFDTCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCitTTkRfU09DX0RBUE1fREFDKCJEQUNSIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcGNtNTEyeF9kYXBtX3JvdXRlc1tdID0geworCXsgIkRBQ0wiLCBOVUxMLCAiUGxheWJhY2siIH0sCisJeyAiREFDUiIsIE5VTEwsICJQbGF5YmFjayIgfSwKKworCXsgIk9VVEwiLCBOVUxMLCAiREFDTCIgfSwKKwl7ICJPVVRSIiwgTlVMTCwgIkRBQ1IiIH0sCit9OworCitzdGF0aWMgaW50IHBjbTUxMnhfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkJIFBDTTUxMnhfUlFTVCwgMCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlbW92ZSBzdGFuZGJ5OiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkJIFBDTTUxMnhfUlFTVCwgUENNNTEyeF9SUVNUKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBzdGFuZGJ5OiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgcGNtNTEyeF9kYWkgPSB7CisJLm5hbWUgPSAicGNtNTEyeC1oaWZpIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBwY201MTJ4X2NvZGVjX2RyaXZlciA9IHsKKwkuc2V0X2JpYXNfbGV2ZWwgPSBwY201MTJ4X3NldF9iaWFzX2xldmVsLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKKworCS5jb250cm9scyA9IHBjbTUxMnhfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocGNtNTEyeF9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHBjbTUxMnhfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gcGNtNTEyeF9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBwY201MTJ4X3JhbmdlID0geworCS5uYW1lID0gIlBhZ2VzIiwgLnJhbmdlX21pbiA9IFBDTTUxMnhfVklSVF9CQVNFLAorCS5yYW5nZV9tYXggPSBQQ001MTJ4X01BWF9SRUdJU1RFUiwKKwkuc2VsZWN0b3JfcmVnID0gUENNNTEyeF9QQUdFLAorCS5zZWxlY3Rvcl9tYXNrID0gMHhmZiwKKwkud2luZG93X3N0YXJ0ID0gMCwgLndpbmRvd19sZW4gPSAweDEwMCwKK307CisKK2NvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHBjbTUxMnhfcmVnbWFwID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKworCS5yZWFkYWJsZV9yZWcgPSBwY201MTJ4X3JlYWRhYmxlLAorCS52b2xhdGlsZV9yZWcgPSBwY201MTJ4X3ZvbGF0aWxlLAorCisJLnJhbmdlcyA9ICZwY201MTJ4X3JhbmdlLAorCS5udW1fcmFuZ2VzID0gMSwKKworCS5tYXhfcmVnaXN0ZXIgPSBQQ001MTJ4X01BWF9SRUdJU1RFUiwKKwkucmVnX2RlZmF1bHRzID0gcGNtNTEyeF9yZWdfZGVmYXVsdHMsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHBjbTUxMnhfcmVnX2RlZmF1bHRzKSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3JlZ21hcCk7CisKK2ludCBwY201MTJ4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMng7CisJaW50IGksIHJldDsKKworCXBjbTUxMnggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBjbTUxMnhfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcGNtNTEyeCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBwY201MTJ4KTsKKwlwY201MTJ4LT5yZWdtYXAgPSByZWdtYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyk7IGkrKykKKwkJcGNtNTEyeC0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gcGNtNTEyeF9zdXBwbHlfbmFtZXNbaV07CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChkZXYsIEFSUkFZX1NJWkUocGNtNTEyeC0+c3VwcGxpZXMpLAorCQkJCSAgICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwY201MTJ4LT5zdXBwbHlfbmJbMF0ubm90aWZpZXJfY2FsbCA9IHBjbTUxMnhfcmVndWxhdG9yX2V2ZW50XzA7CisJcGNtNTEyeC0+c3VwcGx5X25iWzFdLm5vdGlmaWVyX2NhbGwgPSBwY201MTJ4X3JlZ3VsYXRvcl9ldmVudF8xOworCXBjbTUxMngtPnN1cHBseV9uYlsyXS5ub3RpZmllcl9jYWxsID0gcGNtNTEyeF9yZWd1bGF0b3JfZXZlbnRfMjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKTsgaSsrKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9yZWdpc3Rlcl9ub3RpZmllcihwY201MTJ4LT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCQkJCSAgJnBjbTUxMngtPnN1cHBseV9uYltpXSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3Igbm90aWZpZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCX0KKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyksCisJCQkJICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXNldCB0aGUgZGV2aWNlLCB2ZXJpZnlpbmcgSS9PIGluIHRoZSBwcm9jZXNzIGZvciBJMkMgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBQQ001MTJ4X1JFU0VULAorCQkJICAgUENNNTEyeF9SU1RNIHwgUENNNTEyeF9SU1RSKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVzZXQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgUENNNTEyeF9SRVNFVCwgMCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc2V0IGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXBjbTUxMngtPnNjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBjbTUxMngtPnNjbGspKSB7CisJCWlmIChQVFJfRVJSKHBjbTUxMngtPnNjbGspID09IC1FUFJPQkVfREVGRVIpCisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCQlkZXZfaW5mbyhkZXYsICJObyBTQ0xLLCB1c2luZyBCQ0xLOiAlbGRcbiIsCisJCQkgUFRSX0VSUihwY201MTJ4LT5zY2xrKSk7CisKKwkJLyogRGlzYWJsZSByZXBvcnRpbmcgb2YgbWlzc2luZyBTQ0xLIGFzIGFuIGVycm9yICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFBDTTUxMnhfRVJST1JfREVURUNULAorCQkJCSAgIFBDTTUxMnhfSURDSCwgUENNNTEyeF9JRENIKTsKKworCQkvKiBTd2l0Y2ggUExMIGlucHV0IHRvIEJDTEsgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgUENNNTEyeF9QTExfUkVGLAorCQkJCSAgIFBDTTUxMnhfU1JFRiwgUENNNTEyeF9TUkVGKTsKKwl9IGVsc2UgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGNtNTEyeC0+c2Nsayk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFNDTEs6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIERlZmF1bHQgdG8gc3RhbmRieSBtb2RlICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkgUENNNTEyeF9SUVNULCBQQ001MTJ4X1JRU1QpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN0YW5kYnk6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcG1fcnVudGltZV9pZGxlKGRldik7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJnBjbTUxMnhfY29kZWNfZHJpdmVyLAorCQkJCSAgICAmcGNtNTEyeF9kYWksIDEpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBDT0RFQzogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3BtOworCX0KKworCXJldHVybiAwOworCitlcnJfcG06CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CitlcnJfY2xrOgorCWlmICghSVNfRVJSKHBjbTUxMngtPnNjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGNtNTEyeC0+c2Nsayk7CitlcnI6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKSwKKwkJCQkgICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNtNTEyeF9wcm9iZSk7CisKK3ZvaWQgcGNtNTEyeF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYyhkZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCWlmICghSVNfRVJSKHBjbTUxMngtPnNjbGspKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGNtNTEyeC0+c2Nsayk7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHBjbTUxMngtPnN1cHBsaWVzKSwKKwkJCSAgICAgICBwY201MTJ4LT5zdXBwbGllcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3JlbW92ZSk7CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwY201MTJ4LT5yZWdtYXAsIFBDTTUxMnhfUE9XRVIsCisJCQkJIFBDTTUxMnhfUlFQRCwgUENNNTEyeF9SUVBEKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBwb3dlciBkb3duOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUocGNtNTEyeC0+c3VwcGxpZXMpLAorCQkJCSAgICAgcGNtNTEyeC0+c3VwcGxpZXMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBkaXNhYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIUlTX0VSUihwY201MTJ4LT5zY2xrKSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBjbTUxMngtPnNjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKCFJU19FUlIocGNtNTEyeC0+c2NsaykpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBjbTUxMngtPnNjbGspOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBTQ0xLOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShwY201MTJ4LT5zdXBwbGllcyksCisJCQkJICAgIHBjbTUxMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHBjbTUxMngtPnJlZ21hcCwgZmFsc2UpOworCXJldCA9IHJlZ2NhY2hlX3N5bmMocGNtNTEyeC0+cmVnbWFwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc3luYyBjYWNoZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjbTUxMngtPnJlZ21hcCwgUENNNTEyeF9QT1dFUiwKKwkJCQkgUENNNTEyeF9SUVBELCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVtb3ZlIHBvd2VyIGRvd246ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY201MTJ4X3BtX29wcyA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFMocGNtNTEyeF9zdXNwZW5kLCBwY201MTJ4X3Jlc3VtZSwgTlVMTCkKK307CitFWFBPUlRfU1lNQk9MX0dQTChwY201MTJ4X3BtX29wcyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBQQ001MTJ4IGNvZGVjIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmggYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU3NmFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBQQ001MTJ4IENPREVDcworICoKKyAqIEF1dGhvcjoJTWFyayBCcm93biA8YnJvb25pZUBsaW5hcm8ub3JnPgorICoJCUNvcHlyaWdodCAyMDE0IExpbmFybyBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfU05EX1NPQ19QQ001MTJYCisjZGVmaW5lIF9TTkRfU09DX1BDTTUxMlgKKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgUENNNTEyeF9WSVJUX0JBU0UgMHgxMDAKKyNkZWZpbmUgUENNNTEyeF9QQUdFX0xFTiAgMHgxMDAKKyNkZWZpbmUgUENNNTEyeF9QQUdFX0JBU0UobikgIChQQ001MTJ4X1ZJUlRfQkFTRSArIChQQ001MTJ4X1BBR0VfTEVOICogbikpCisKKyNkZWZpbmUgUENNNTEyeF9QQUdFICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgUENNNTEyeF9SRVNFVCAgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDEpCisjZGVmaW5lIFBDTTUxMnhfUE9XRVIgICAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICAyKQorI2RlZmluZSBQQ001MTJ4X01VVEUgICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAgMykKKyNkZWZpbmUgUENNNTEyeF9QTExfRU4gICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDQpCisjZGVmaW5lIFBDTTUxMnhfU1BJX01JU09fRlVOQ1RJT04gKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICA2KQorI2RlZmluZSBQQ001MTJ4X0RTUCAgICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAgNykKKyNkZWZpbmUgUENNNTEyeF9HUElPX0VOICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgIDgpCisjZGVmaW5lIFBDTTUxMnhfQkNMS19MUkNMS19DRkcgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgICA5KQorI2RlZmluZSBQQ001MTJ4X0RTUF9HUElPX0lOUFVUICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAxMCkKKyNkZWZpbmUgUENNNTEyeF9NQVNURVJfTU9ERSAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMTIpCisjZGVmaW5lIFBDTTUxMnhfUExMX1JFRiAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDEzKQorI2RlZmluZSBQQ001MTJ4X1BMTF9DT0VGRl8wICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyMCkKKyNkZWZpbmUgUENNNTEyeF9QTExfQ09FRkZfMSAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjEpCisjZGVmaW5lIFBDTTUxMnhfUExMX0NPRUZGXzIgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDIyKQorI2RlZmluZSBQQ001MTJ4X1BMTF9DT0VGRl8zICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyMykKKyNkZWZpbmUgUENNNTEyeF9QTExfQ09FRkZfNCAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjQpCisjZGVmaW5lIFBDTTUxMnhfRFNQX0NMS0RJViAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDI3KQorI2RlZmluZSBQQ001MTJ4X0RBQ19DTEtESVYgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAyOCkKKyNkZWZpbmUgUENNNTEyeF9OQ1BfQ0xLRElWICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMjkpCisjZGVmaW5lIFBDTTUxMnhfT1NSX0NMS0RJViAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDMwKQorI2RlZmluZSBQQ001MTJ4X01BU1RFUl9DTEtESVZfMSAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAzMikKKyNkZWZpbmUgUENNNTEyeF9NQVNURVJfQ0xLRElWXzIgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMzMpCisjZGVmaW5lIFBDTTUxMnhfRlNfU1BFRURfTU9ERSAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDM0KQorI2RlZmluZSBQQ001MTJ4X0lEQUNfMSAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICAzNSkKKyNkZWZpbmUgUENNNTEyeF9JREFDXzIgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgMzYpCisjZGVmaW5lIFBDTTUxMnhfRVJST1JfREVURUNUICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDM3KQorI2RlZmluZSBQQ001MTJ4X0kyU18xICAgICAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA0MCkKKyNkZWZpbmUgUENNNTEyeF9JMlNfMiAgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNDEpCisjZGVmaW5lIFBDTTUxMnhfREFDX1JPVVRJTkcgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDQyKQorI2RlZmluZSBQQ001MTJ4X0RTUF9QUk9HUkFNICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA0MykKKyNkZWZpbmUgUENNNTEyeF9DTEtERVQgICAgICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNDQpCisjZGVmaW5lIFBDTTUxMnhfQVVUT19NVVRFICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDU5KQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfVk9MVU1FXzEgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA2MCkKKyNkZWZpbmUgUENNNTEyeF9ESUdJVEFMX1ZPTFVNRV8yICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNjEpCisjZGVmaW5lIFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMyAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDYyKQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfTVVURV8xICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA2MykKKyNkZWZpbmUgUENNNTEyeF9ESUdJVEFMX01VVEVfMiAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgNjQpCisjZGVmaW5lIFBDTTUxMnhfRElHSVRBTF9NVVRFXzMgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDY1KQorI2RlZmluZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzEgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4MCkKKyNkZWZpbmUgUENNNTEyeF9HUElPX09VVFBVVF8yICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODEpCisjZGVmaW5lIFBDTTUxMnhfR1BJT19PVVRQVVRfMyAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDgyKQorI2RlZmluZSBQQ001MTJ4X0dQSU9fT1VUUFVUXzQgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4MykKKyNkZWZpbmUgUENNNTEyeF9HUElPX09VVFBVVF81ICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODQpCisjZGVmaW5lIFBDTTUxMnhfR1BJT19PVVRQVVRfNiAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDg1KQorI2RlZmluZSBQQ001MTJ4X0dQSU9fQ09OVFJPTF8xICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA4NikKKyNkZWZpbmUgUENNNTEyeF9HUElPX0NPTlRST0xfMiAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgODcpCisjZGVmaW5lIFBDTTUxMnhfT1ZFUkZMT1cgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDkwKQorI2RlZmluZSBQQ001MTJ4X1JBVEVfREVUXzEgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA5MSkKKyNkZWZpbmUgUENNNTEyeF9SQVRFX0RFVF8yICAgICAgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAgOTIpCisjZGVmaW5lIFBDTTUxMnhfUkFURV9ERVRfMyAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgIDkzKQorI2RlZmluZSBQQ001MTJ4X1JBVEVfREVUXzQgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArICA5NCkKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfTVVURV9ERVQgICAoUENNNTEyeF9QQUdFX0JBU0UoMCkgKyAxMDgpCisjZGVmaW5lIFBDTTUxMnhfR1BJTiAgICAgICAgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDApICsgMTE5KQorI2RlZmluZSBQQ001MTJ4X0RJR0lUQUxfTVVURV9ERVQgIChQQ001MTJ4X1BBR0VfQkFTRSgwKSArIDEyMCkKKworI2RlZmluZSBQQ001MTJ4X09VVFBVVF9BTVBMSVRVREUgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgMSkKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfR0FJTl9DVFJMICAoUENNNTEyeF9QQUdFX0JBU0UoMSkgKyAgIDIpCisjZGVmaW5lIFBDTTUxMnhfVU5ERVJWT0xUQUdFX1BST1QgKFBDTTUxMnhfUEFHRV9CQVNFKDEpICsgICA1KQorI2RlZmluZSBQQ001MTJ4X0FOQUxPR19NVVRFX0NUUkwgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgNikKKyNkZWZpbmUgUENNNTEyeF9BTkFMT0dfR0FJTl9CT09TVCAoUENNNTEyeF9QQUdFX0JBU0UoMSkgKyAgIDcpCisjZGVmaW5lIFBDTTUxMnhfVkNPTV9DVFJMXzEgICAgICAgKFBDTTUxMnhfUEFHRV9CQVNFKDEpICsgICA4KQorI2RlZmluZSBQQ001MTJ4X1ZDT01fQ1RSTF8yICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSgxKSArICAgOSkKKworI2RlZmluZSBQQ001MTJ4X0NSQU1fQ1RSTCAgICAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSg0NCkgKyAgMSkKKworI2RlZmluZSBQQ001MTJ4X01BWF9SRUdJU1RFUiAgICAgIChQQ001MTJ4X1BBR0VfQkFTRSg0NCkgKyAgMSkKKworLyogUGFnZSAwLCBSZWdpc3RlciAxIC0gcmVzZXQgKi8KKyNkZWZpbmUgUENNNTEyeF9SU1RSICgxIDw8IDApCisjZGVmaW5lIFBDTTUxMnhfUlNUTSAoMSA8PCA0KQorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDIgLSBwb3dlciAqLworI2RlZmluZSBQQ001MTJ4X1JRUEQgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUENNNTEyeF9SUVBEX1NISUZUIDAKKyNkZWZpbmUgUENNNTEyeF9SUVNUICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFBDTTUxMnhfUlFTVF9TSElGVCA0CisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgMyAtIG11dGUgKi8KKyNkZWZpbmUgUENNNTEyeF9SUU1SX1NISUZUIDAKKyNkZWZpbmUgUENNNTEyeF9SUU1MX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciA0IC0gUExMICovCisjZGVmaW5lIFBDTTUxMnhfUExDRSAgICAgICAoMSA8PCAwKQorI2RlZmluZSBQQ001MTJ4X1JMQ0VfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X1BMQ0sgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUENNNTEyeF9QTENLX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciA3IC0gRFNQICovCisjZGVmaW5lIFBDTTUxMnhfU0RTTCAgICAgICAoMSA8PCAwKQorI2RlZmluZSBQQ001MTJ4X1NEU0xfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X0RFTVAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgUENNNTEyeF9ERU1QX1NISUZUIDQKKworLyogUGFnZSAwLCBSZWdpc3RlciAxMyAtIFBMTCByZWZlcmVuY2UgKi8KKyNkZWZpbmUgUENNNTEyeF9TUkVGICgxIDw8IDQpCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgMzcgLSBFcnJvciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUENNNTEyeF9JUExLICgxIDw8IDApCisjZGVmaW5lIFBDTTUxMnhfRENBUyAoMSA8PCAxKQorI2RlZmluZSBQQ001MTJ4X0lEQ00gKDEgPDwgMikKKyNkZWZpbmUgUENNNTEyeF9JRENIICgxIDw8IDMpCisjZGVmaW5lIFBDTTUxMnhfSURTSyAoMSA8PCA0KQorI2RlZmluZSBQQ001MTJ4X0lEQksgKDEgPDwgNSkKKyNkZWZpbmUgUENNNTEyeF9JREZTICgxIDw8IDYpCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNDIgLSBEQUMgcm91dGluZyAqLworI2RlZmluZSBQQ001MTJ4X0FVUFJfU0hJRlQgMAorI2RlZmluZSBQQ001MTJ4X0FVUExfU0hJRlQgNAorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDU5IC0gYXV0byBtdXRlICovCisjZGVmaW5lIFBDTTUxMnhfQVRNUl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfQVRNTF9TSElGVCA0CisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNjMgLSByYW1wIHJhdGVzICovCisjZGVmaW5lIFBDTTUxMnhfVk5ERl9TSElGVCA2CisjZGVmaW5lIFBDTTUxMnhfVk5EU19TSElGVCA0CisjZGVmaW5lIFBDTTUxMnhfVk5VRl9TSElGVCAyCisjZGVmaW5lIFBDTTUxMnhfVk5VU19TSElGVCAwCisKKy8qIFBhZ2UgMCwgUmVnaXN0ZXIgNjQgLSBlbWVyZ2VuY3kgcmFtcCByYXRlcyAqLworI2RlZmluZSBQQ001MTJ4X1ZFREZfU0hJRlQgNgorI2RlZmluZSBQQ001MTJ4X1ZFRFNfU0hJRlQgNAorCisvKiBQYWdlIDAsIFJlZ2lzdGVyIDY1IC0gRGlnaXRhbCBtdXRlIGVuYWJsZXMgKi8KKyNkZWZpbmUgUENNNTEyeF9BQ1RMX1NISUZUIDIKKyNkZWZpbmUgUENNNTEyeF9BTUxFX1NISUZUIDEKKyNkZWZpbmUgUENNNTEyeF9BTUxSX1NISUZUIDAKKworLyogUGFnZSAxLCBSZWdpc3RlciAyIC0gYW5hbG9nIHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFBDTTUxMnhfUkFHTl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfTEFHTl9TSElGVCA0CisKKy8qIFBhZ2UgMSwgUmVnaXN0ZXIgNyAtIGFuYWxvZyBib29zdCBjb250cm9sICovCisjZGVmaW5lIFBDTTUxMnhfQUdCUl9TSElGVCAwCisjZGVmaW5lIFBDTTUxMnhfQUdCTF9TSElGVCA0CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY201MTJ4X3BtX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBwY201MTJ4X3JlZ21hcDsKKworaW50IHBjbTUxMnhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApOwordm9pZCBwY201MTJ4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jCmluZGV4IDkxMmM5Y2IuLmQ0YzIyOWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpAQCAtMjEwLDI2ICsyMTAsMjIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaW5wdXRfbW9kZVtdID0gewogCSJTaW5nbGUgZW5kZWQiLCAiRGlmZmVyZW50aWFsIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbWljMV9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAotCVJUNTYzMV9NSUMxX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfbWljMV9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAorCQkJICAgIFJUNTYzMV9NSUMxX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9taWMyX21vZGVfZW51bSwgUlQ1NjMxX01JQ19DVFJMXzEsCi0JUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVCwgcnQ1NjMxX2lucHV0X21vZGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9taWMyX21vZGVfZW51bSwgUlQ1NjMxX01JQ19DVFJMXzEsCisJCQkgICAgUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVCwgcnQ1NjMxX2lucHV0X21vZGUpOwogCiAvKiBNT05PIElucHV0IFR5cGUgKi8KLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbW9ub2luX21vZGVfZW51bSwgUlQ1NjMxX01PTk9fSU5QVVRfVk9MLAotCVJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfbW9ub2luX21vZGVfZW51bSwgUlQ1NjMxX01PTk9fSU5QVVRfVk9MLAorCQkJICAgIFJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKIAogLyogU1BLIFJhdGlvIEdhaW4gQ29udHJvbCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGtfcmF0aW9bXSA9IHsiMS4wMHgiLCAiMS4wOXgiLCAiMS4yN3giLCAiMS40NHgiLAogCQkJIjEuNTZ4IiwgIjEuNjh4IiwgIjEuOTl4IiwgIjIuMzR4In07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfc3BrX3JhdGlvX2VudW0sIFJUNTYzMV9HRU5fUFVSX0NUUkxfUkVHLAotCVJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfU0hJRlQsIHJ0NTYzMV9zcGtfcmF0aW8pOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcGtfcmF0aW9fZW51bSwgUlQ1NjMxX0dFTl9QVVJfQ1RSTF9SRUcsCisJCQkgICAgUlQ1NjMxX1NQS19BTVBfUkFUSU9fQ1RSTF9TSElGVCwgcnQ1NjMxX3Nwa19yYXRpbyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogTUlDICovCkBAIC03NTksOSArNzU1LDggQEAKIC8qIExlZnQgU1BLIFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xsX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWEwifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcGt2b2xsX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKLQlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbGxfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfc3Brdm9sbF9lbnVtLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCQkgICAgUlQ1NjMxX0xfRU5fU0hJRlQsIHJ0NTYzMV9zcGt2b2xsX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Brdm9sbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTUEtWT0wgU1JDIiwgcnQ1NjMxX3Nwa3ZvbGxfZW51bSk7CkBAIC03NjksOSArNzY0LDggQEAKIC8qIExlZnQgSFAgVm9sdW1lIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwdm9sbF9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhMIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHB2b2xsX2VudW0sIFJUNTYzMV9IUF9PVVRfVk9MLAotCVJUNTYzMV9MX0VOX1NISUZULCBydDU2MzFfaHB2b2xsX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjMxX2hwdm9sbF9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwkJCSAgICBSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX2hwdm9sbF9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9sbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBIUFZPTCBTUkMiLCBydDU2MzFfaHB2b2xsX2VudW0pOwpAQCAtNzc5LDkgKzc3Myw4IEBACiAvKiBMZWZ0IE91dCBWb2x1bWUgSW5wdXQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfb3V0dm9sbF9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhMIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfb3V0dm9sbF9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKLQlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX291dHZvbGxfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfb3V0dm9sbF9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwkJCSAgICBSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX291dHZvbGxfc2VsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9vdXR2b2xsX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IE9VVFZPTCBTUkMiLCBydDU2MzFfb3V0dm9sbF9lbnVtKTsKQEAgLTc4OSw5ICs3ODIsOCBAQAogLyogUmlnaHQgT3V0IFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9vdXR2b2xyX3NlbFtdID0geyJWbWlkIiwgIk9VVE1JWFIifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9vdXR2b2xyX2VudW0sIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MLAotCVJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfb3V0dm9scl9zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9vdXR2b2xyX2VudW0sIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MLAorCQkJICAgIFJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfb3V0dm9scl9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX291dHZvbHJfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IE9VVFZPTCBTUkMiLCBydDU2MzFfb3V0dm9scl9lbnVtKTsKQEAgLTc5OSw5ICs3OTEsOCBAQAogLyogUmlnaHQgSFAgVm9sdW1lIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwdm9scl9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhSIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHB2b2xyX2VudW0sIFJUNTYzMV9IUF9PVVRfVk9MLAotCVJUNTYzMV9SX0VOX1NISUZULCBydDU2MzFfaHB2b2xyX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjMxX2hwdm9scl9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwkJCSAgICBSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX2hwdm9scl9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9scl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgSFBWT0wgU1JDIiwgcnQ1NjMxX2hwdm9scl9lbnVtKTsKQEAgLTgwOSw5ICs4MDAsOCBAQAogLyogUmlnaHQgU1BLIFZvbHVtZSBJbnB1dCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xyX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWFIifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcGt2b2xyX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKLQlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbHJfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfc3Brdm9scl9lbnVtLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCQkgICAgUlQ1NjMxX1JfRU5fU0hJRlQsIHJ0NTYzMV9zcGt2b2xyX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Brdm9scl9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgU1BLVk9MIFNSQyIsIHJ0NTYzMV9zcGt2b2xyX2VudW0pOwpAQCAtODIwLDkgKzgxMCw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb2xfc3JjX3NlbFtdID0gewogCSJTUE9MTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ0wifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcG9sX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX1NQS19MX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9sX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcG9sX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX1NQS19MX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9sX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb2xfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlNQT0wgU1JDIiwgcnQ1NjMxX3Nwb2xfc3JjX2VudW0pOwpAQCAtODMxLDkgKzgyMCw4IEBACiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb3Jfc3JjX3NlbFtdID0gewogCSJTUE9STUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ1IifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb3JfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlNQT1IgU1JDIiwgcnQ1NjMxX3Nwb3Jfc3JjX2VudW0pOwpAQCAtODQxLDkgKzgyOSw4IEBACiAvKiBNT05PIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX21vbm9fc3JjX3NlbFtdID0geyJNT05PTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfbW9ub19zcmNfZW51bSwgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMLAotCVJUNTYzMV9NT05PX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9tb25vX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9tb25vX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX01PTk9fTVVYX1NFTF9TSElGVCwgcnQ1NjMxX21vbm9fc3JjX3NlbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfbW9ub19tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiTU9OTyBTUkMiLCBydDU2MzFfbW9ub19zcmNfZW51bSk7CkBAIC04NTEsOSArODM4LDggQEAKIC8qIExlZnQgSFBPIElucHV0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwbF9zcmNfc2VsW10gPSB7IkxlZnQgSFBWT0wiLCAiTGVmdCBEQUMifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTYzMV9ocGxfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKLQlSVDU2MzFfSFBfTF9NVVhfU0VMX1NISUZULCBydDU2MzFfaHBsX3NyY19zZWwpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTYzMV9ocGxfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKKwkJCSAgICBSVDU2MzFfSFBfTF9NVVhfU0VMX1NISUZULCBydDU2MzFfaHBsX3NyY19zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiSFBMIFNSQyIsIHJ0NTYzMV9ocGxfc3JjX2VudW0pOwpAQCAtODYxLDkgKzg0Nyw4IEBACiAvKiBSaWdodCBIUE8gSW5wdXQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaHByX3NyY19zZWxbXSA9IHsiUmlnaHQgSFBWT0wiLCAiUmlnaHQgREFDIn07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2MzFfaHByX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCi0JUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwcl9zcmNfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2MzFfaHByX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJCQkgICAgUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwcl9zcmNfc2VsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9ocHJfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBTUkMiLCBydDU2MzFfaHByX3NyY19lbnVtKTsKQEAgLTE1ODUsMTUgKzE1NzAsNiBAQAogewogCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHJ0NTYzMS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAl2YWwgPSBydDU2MzFfcmVhZF9pbmRleChjb2RlYywgUlQ1NjMxX0FEREFfTUlYRVJfSU5UTF9SRUczKTsKIAlpZiAodmFsICYgMHgwMDAyKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmMKaW5kZXggODg2OTI0OS4uMDA2MWFlNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5jCkBAIC0zNjEsMjUgKzM2MSwyNCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2NDBfZGF0YV9zZWxlY3RbXSA9IHsKIAkiTm9ybWFsIiwgImxlZnQgY29weSB0byByaWdodCIsICJyaWdodCBjb3B5IHRvIGxlZnQiLCAiU3dhcCJ9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMV9kYWNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKLQkJCQlSVDU2NDBfSUYxX0RBQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjFfZGFjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCisJCQkgICAgUlQ1NjQwX0lGMV9EQUNfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjFfYWRjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCi0JCQkJUlQ1NjQwX0lGMV9BRENfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfaWYxX2FkY19lbnVtLCBSVDU2NDBfRElHX0lORl9EQVRBLAorCQkJICAgIFJUNTY0MF9JRjFfQURDX1NFTF9TRlQsIHJ0NTY0MF9kYXRhX3NlbGVjdCk7CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfaWYyX2RhY19lbnVtLCBSVDU2NDBfRElHX0lORl9EQVRBLAotCQkJCVJUNTY0MF9JRjJfREFDX1NFTF9TRlQsIHJ0NTY0MF9kYXRhX3NlbGVjdCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMl9kYWNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKKwkJCSAgICBSVDU2NDBfSUYyX0RBQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2lmMl9hZGNfZW51bSwgUlQ1NjQwX0RJR19JTkZfREFUQSwKLQkJCQlSVDU2NDBfSUYyX0FEQ19TRUxfU0ZULCBydDU2NDBfZGF0YV9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9pZjJfYWRjX2VudW0sIFJUNTY0MF9ESUdfSU5GX0RBVEEsCisJCQkgICAgUlQ1NjQwX0lGMl9BRENfU0VMX1NGVCwgcnQ1NjQwX2RhdGFfc2VsZWN0KTsKIAogLyogQ2xhc3MgRCBzcGVha2VyIGdhaW4gcmF0aW8gKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjQwX2Nsc2Rfc3BrX3JhdGlvW10gPSB7IjEuNjZ4IiwgIjEuODN4IiwgIjEuOTR4IiwKIAkiMngiLCAiMi4xMXgiLCAiMi4yMngiLCAiMi4zM3giLCAiMi40NHgiLCAiMi41NXgiLCAiMi42NngiLCAiMi43N3gifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9jbHNkX3Nwa19yYXRpb19lbnVtLCBSVDU2NDBfQ0xTX0RfT1VULAotCVJUNTY0MF9DTFNEX1JBVElPX1NGVCwgcnQ1NjQwX2Nsc2Rfc3BrX3JhdGlvKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfY2xzZF9zcGtfcmF0aW9fZW51bSwgUlQ1NjQwX0NMU19EX09VVCwKKwkJCSAgICBSVDU2NDBfQ0xTRF9SQVRJT19TRlQsIHJ0NTY0MF9jbHNkX3Nwa19yYXRpbyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogU3BlYWtlciBPdXRwdXQgVm9sdW1lICovCkBAIC03NTMsOSArNzUyLDggQEAKIAkiRElHIE1JWCIsICJBREMiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX3N0ZXJlb19hZGMxX2VudW0sIFJUNTY0MF9TVE9fQURDX01JWEVSLAotCVJUNTY0MF9BRENfMV9TUkNfU0ZULCBydDU2NDBfc3RlcmVvX2FkYzFfc3JjKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfc3RlcmVvX2FkYzFfZW51bSwgUlQ1NjQwX1NUT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX0FEQ18xX1NSQ19TRlQsIHJ0NTY0MF9zdGVyZW9fYWRjMV9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX3N0b19hZGNfMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlN0ZXJlbyBBREMxIE11eCIsIHJ0NTY0MF9zdGVyZW9fYWRjMV9lbnVtKTsKQEAgLTc2NCw5ICs3NjIsOCBAQAogCSJETUlDMSIsICJETUlDMiIsICJESUcgTUlYIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9zdGVyZW9fYWRjMl9lbnVtLCBSVDU2NDBfU1RPX0FEQ19NSVhFUiwKLQlSVDU2NDBfQURDXzJfU1JDX1NGVCwgcnQ1NjQwX3N0ZXJlb19hZGMyX3NyYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX3N0ZXJlb19hZGMyX2VudW0sIFJUNTY0MF9TVE9fQURDX01JWEVSLAorCQkJICAgIFJUNTY0MF9BRENfMl9TUkNfU0ZULCBydDU2NDBfc3RlcmVvX2FkYzJfc3JjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9zdG9fYWRjXzJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTdGVyZW8gQURDMiBNdXgiLCBydDU2NDBfc3RlcmVvX2FkYzJfZW51bSk7CkBAIC03NzYsOSArNzczLDggQEAKIAkiTW9ubyBEQUMgTUlYTCIsICJBRENMIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9tb25vX2FkY19sMV9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCi0JUlQ1NjQwX01PTk9fQURDX0wxX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMV9zcmMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9tb25vX2FkY19sMV9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX01PTk9fQURDX0wxX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMV9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX21vbm9fYWRjX2wxX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTW9ubyBBREMxIGxlZnQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX2wxX2VudW0pOwpAQCAtNzg3LDkgKzc4Myw4IEBACiAJIkRNSUMgTDEiLCAiRE1JQyBMMiIsICJNb25vIERBQyBNSVhMIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9tb25vX2FkY19sMl9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCi0JUlQ1NjQwX01PTk9fQURDX0wyX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMl9zcmMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY0MF9tb25vX2FkY19sMl9lbnVtLCBSVDU2NDBfTU9OT19BRENfTUlYRVIsCisJCQkgICAgUlQ1NjQwX01PTk9fQURDX0wyX1NSQ19TRlQsIHJ0NTY0MF9tb25vX2FkY19sMl9zcmMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX21vbm9fYWRjX2wyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTW9ubyBBREMyIGxlZnQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX2wyX2VudW0pOwpAQCAtNzk4LDkgKzc5Myw4IEBACiAJIk1vbm8gREFDIE1JWFIiLCAiQURDUiIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfbW9ub19hZGNfcjFfZW51bSwgUlQ1NjQwX01PTk9fQURDX01JWEVSLAotCVJUNTY0MF9NT05PX0FEQ19SMV9TUkNfU0ZULCBydDU2NDBfbW9ub19hZGNfcjFfc3JjKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfbW9ub19hZGNfcjFfZW51bSwgUlQ1NjQwX01PTk9fQURDX01JWEVSLAorCQkJICAgIFJUNTY0MF9NT05PX0FEQ19SMV9TUkNfU0ZULCBydDU2NDBfbW9ub19hZGNfcjFfc3JjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9tb25vX2FkY19yMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIk1vbm8gQURDMSByaWdodCBzb3VyY2UiLCBydDU2NDBfbW9ub19hZGNfcjFfZW51bSk7CkBAIC04MDksOSArODAzLDggQEAKIAkiRE1JQyBSMSIsICJETUlDIFIyIiwgIk1vbm8gREFDIE1JWFIiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX21vbm9fYWRjX3IyX2VudW0sIFJUNTY0MF9NT05PX0FEQ19NSVhFUiwKLQlSVDU2NDBfTU9OT19BRENfUjJfU1JDX1NGVCwgcnQ1NjQwX21vbm9fYWRjX3IyX3NyYyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX21vbm9fYWRjX3IyX2VudW0sIFJUNTY0MF9NT05PX0FEQ19NSVhFUiwKKwkJCSAgICBSVDU2NDBfTU9OT19BRENfUjJfU1JDX1NGVCwgcnQ1NjQwX21vbm9fYWRjX3IyX3NyYyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfbW9ub19hZGNfcjJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJNb25vIEFEQzIgcmlnaHQgc291cmNlIiwgcnQ1NjQwX21vbm9fYWRjX3IyX2VudW0pOwpAQCAtODI2LDkgKzgxOSw5IEBACiAJMywKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfZGFjX2wyX2VudW0sIFJUNTY0MF9EU1BfUEFUSDIsIFJUNTY0MF9EQUNfTDJfU0VMX1NGVCwKLQkweDMsIHJ0NTY0MF9kYWNfbDJfc3JjLCBydDU2NDBfZGFjX2wyX3ZhbHVlcyk7CitzdGF0aWMgU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2RhY19sMl9lbnVtLAorCQkJCSAgUlQ1NjQwX0RTUF9QQVRIMiwgUlQ1NjQwX0RBQ19MMl9TRUxfU0ZULAorCQkJCSAgMHgzLCBydDU2NDBfZGFjX2wyX3NyYywgcnQ1NjQwX2RhY19sMl92YWx1ZXMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX2RhY19sMl9tdXggPQogCVNPQ19EQVBNX1ZBTFVFX0VOVU0oIkRBQzIgbGVmdCBjaGFubmVsIHNvdXJjZSIsIHJ0NTY0MF9kYWNfbDJfZW51bSk7CkBAIC04NDEsOSArODM0LDkgQEAKIAkwLAogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19WQUxVRV9FTlVNX1NJTkdMRV9ERUNMKAotCXJ0NTY0MF9kYWNfcjJfZW51bSwgUlQ1NjQwX0RTUF9QQVRIMiwgUlQ1NjQwX0RBQ19SMl9TRUxfU0ZULAotCTB4MywgcnQ1NjQwX2RhY19yMl9zcmMsIHJ0NTY0MF9kYWNfcjJfdmFsdWVzKTsKK3N0YXRpYyBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfZGFjX3IyX2VudW0sCisJCQkJICBSVDU2NDBfRFNQX1BBVEgyLCBSVDU2NDBfREFDX1IyX1NFTF9TRlQsCisJCQkJICAweDMsIHJ0NTY0MF9kYWNfcjJfc3JjLCBydDU2NDBfZGFjX3IyX3ZhbHVlcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NDBfZGFjX3IyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiREFDMiByaWdodCBjaGFubmVsIHNvdXJjZSIsIHJ0NTY0MF9kYWNfcjJfZW51bSk7CkBAIC04NjAsOSArODUzLDEwIEBACiAJNywKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTCgKLQlydDU2NDBfZGFpX2lpc19tYXBfZW51bSwgUlQ1NjQwX0kyUzFfU0RQLCBSVDU2NDBfSTJTX0lGX1NGVCwKLQkweDcsIHJ0NTY0MF9kYWlfaWlzX21hcCwgcnQ1NjQwX2RhaV9paXNfbWFwX3ZhbHVlcyk7CitzdGF0aWMgU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjQwX2RhaV9paXNfbWFwX2VudW0sCisJCQkJICBSVDU2NDBfSTJTMV9TRFAsIFJUNTY0MF9JMlNfSUZfU0ZULAorCQkJCSAgMHg3LCBydDU2NDBfZGFpX2lpc19tYXAsCisJCQkJICBydDU2NDBfZGFpX2lpc19tYXBfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY0MF9kYWlfbXV4ID0KIAlTT0NfREFQTV9WQUxVRV9FTlVNKCJEQUkgc2VsZWN0IiwgcnQ1NjQwX2RhaV9paXNfbWFwX2VudW0pOwpAQCAtODcyLDkgKzg2Niw4IEBACiAJIklGMSIsICJJRjIiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCi0JcnQ1NjQwX3NkaV9zZWxfZW51bSwgUlQ1NjQwX0kyUzJfU0RQLAotCVJUNTY0MF9JMlMyX1NESV9TRlQsIHJ0NTY0MF9zZGlfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NDBfc2RpX3NlbF9lbnVtLCBSVDU2NDBfSTJTMl9TRFAsCisJCQkgICAgUlQ1NjQwX0kyUzJfU0RJX1NGVCwgcnQ1NjQwX3NkaV9zZWwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjQwX3NkaV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlNESSBzZWxlY3QiLCBydDU2NDBfc2RpX3NlbF9lbnVtKTsKQEAgLTE2MDEsOCArMTU5NCw3IEBACiBzdGF0aWMgaW50IHJ0NTY0MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHJ0NTY0MF9wcml2ICpydDU2NDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1bnNpZ25lZCBpbnQgdmFsX2xlbiA9IDAsIHZhbF9jbGssIG1hc2tfY2xrOwogCWludCBkYWlfc2VsLCBwcmVfZGl2LCBiY2xrX21zLCBmcmFtZV9zaXplOwpAQCAtMTk0MywxNiArMTkzNSw4IEBACiBzdGF0aWMgaW50IHJ0NTY0MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHJ0NTY0MF9wcml2ICpydDU2NDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwogCiAJcnQ1NjQwLT5jb2RlYyA9IGNvZGVjOwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBydDU2NDAtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQogCiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAJcnQ1NjQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwppbmRleCAwZmNiZTkwLi5kM2VkMWJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCkBAIC0xODcsOCArMTg3LDkgQEAKIAkiTUlDX0lOIiwgIkxJTkVfSU4iCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShTR1RMNTAwMF9DSElQX0FOQV9DVFJMLCAyLCAyLCBhZGNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19lbnVtLAorCQkJICAgIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsIDIsCisJCQkgICAgYWRjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY19tdXggPQogU09DX0RBUE1fRU5VTSgiQ2FwdHVyZSBNdXgiLCBhZGNfZW51bSk7CkBAIC0xOTgsOCArMTk5LDkgQEAKIAkiREFDIiwgIkxJTkVfSU4iCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShTR1RMNTAwMF9DSElQX0FOQV9DVFJMLCA2LCAyLCBkYWNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19lbnVtLAorCQkJICAgIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsIDYsCisJCQkgICAgZGFjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY19tdXggPQogU09DX0RBUE1fRU5VTSgiSGVhZHBob25lIE11eCIsIGRhY19lbnVtKTsKQEAgLTEzNTAsMTQgKzEzNTIsNiBAQAogCWludCByZXQ7CiAJc3RydWN0IHNndGw1MDAwX3ByaXYgKnNndGw1MDAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQkvKiBzZXR1cCBpMmMgZGF0YSBvcHMgKi8KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc2d0bDUwMDAtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHNndGw1MDAwX2VuYWJsZV9yZWd1bGF0b3JzKGNvZGVjKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2k0NzZ4LmMKaW5kZXggZmEyYjhlMC4uMjQ0YzA5NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpNDc2eC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKQEAgLTIwOSw4ICsyMTAsOSBAQAogCiBzdGF0aWMgaW50IHNpNDc2eF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYtPnBhcmVudCwgTlVMTCk7Ci0JcmV0dXJuIHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldi0+cGFyZW50LCBOVUxMKTsKKworCXJldHVybiBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcmVnbWFwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2k0NzZ4X2RhaV9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTdjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuYwpAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIFNpUkYgYXVkaW8gY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorCisjaW5jbHVkZSAic2lyZi1hdWRpby1jb2RlYy5oIgorCitzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyB7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwl1MzIgcmVnX2N0cmwwLCByZWdfY3RybDE7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlucHV0X21vZGVfbXV4W10gPSB7IlNpbmdsZS1lbmRlZCIsCisJIkRpZmZlcmVudGlhbCJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlucHV0X21vZGVfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShBVURJT19JQ19DT0RFQ19DVFJMMSwgNCwgMiwgaW5wdXRfbW9kZV9tdXgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2lyZl9hdWRpb19jb2RlY19pbnB1dF9tb2RlX2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgaW5wdXRfbW9kZV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwbGF5YmFja192b2xfdGx2LCAtMTI0MDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoY2FwdHVyZV92b2xfdGx2X3ByaW1hMiwgNTAwLCAxMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1JBTkdFKGNhcHR1cmVfdm9sX3Rsdl9hdGxhczYsCisJMCwgNywgVExWX0RCX1NDQUxFX0lURU0oLTEwMCwgMTAwLCAwKSwKKwkweDIyLCAweDNGLCBUTFZfREJfU0NBTEVfSVRFTSg3MDAsIDEwMCwgMCksCispOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm9sdW1lX2NvbnRyb2xzX2F0bGFzNltdID0geworCVNPQ19ET1VCTEVfVExWKCJQbGF5YmFjayBWb2x1bWUiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMjEsIDE0LAorCQkJMHg3RiwgMCwgcGxheWJhY2tfdm9sX3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDE2LCAxMCwKKwkJCTB4M0YsIDAsIGNhcHR1cmVfdm9sX3Rsdl9hdGxhczYpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZvbHVtZV9jb250cm9sc19wcmltYTJbXSA9IHsKKwlTT0NfRE9VQkxFX1RMVigiU3BlYWtlciBWb2x1bWUiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMjEsIDE0LAorCQkJMHg3RiwgMCwgcGxheWJhY2tfdm9sX3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDE1LCAxMCwKKwkJCTB4MUYsIDAsIGNhcHR1cmVfdm9sX3Rsdl9wcmltYTIpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfaW5wdXRfcGF0aF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTGluZSBMZWZ0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA2LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCAzLCAxLCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9pbnB1dF9wYXRoX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIFJpZ2h0IFN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA1LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBSaWdodCBTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMSwgMiwgMSwgMCksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wgPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsIDksIDEsIDApOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9kYWNfdG9faHBfcmlnaHRfYW1wX3N3aXRjaF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCA4LCAxLCAwKTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpZ2h0X2RhY190b19ocF9sZWZ0X2FtcF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgNywgMSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9kYWNfdG9faHBfcmlnaHRfYW1wX3N3aXRjaF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCA2LCAxLCAwKTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMTEsIDEsIDApOworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMTAsIDEsIDApOworCisvKiBBZnRlciBlbmFibGUgYWRjLCBEZWxheSAyMDBtcyB0byBhdm9pZCBwb3Agbm9pc2UgKi8KK3N0YXRpYyBpbnQgYWRjX2VuYWJsZV9kZWxheV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCW1zbGVlcCgyMDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2FuZF9yZXNldF9jb2RlYyhzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCXUzMiBjb2RlY19lbmFibGVfYml0cywgdTMyIGNvZGVjX3Jlc2V0X2JpdHMpCit7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQljb2RlY19lbmFibGVfYml0cyB8IGNvZGVjX3Jlc2V0X2JpdHMsCisJCQljb2RlY19lbmFibGVfYml0cyB8IH5jb2RlY19yZXNldF9iaXRzKTsKKwltc2xlZXAoMjApOworCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIEFVRElPX0lDX0NPREVDX0NUUkwxLAorCQkJY29kZWNfcmVzZXRfYml0cywgY29kZWNfcmVzZXRfYml0cyk7Cit9CisKK3N0YXRpYyBpbnQgYXRsYXM2X2NvZGVjX2VuYWJsZV9hbmRfcmVzZXRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisjZGVmaW5lIEFUTEFTNl9DT0RFQ19FTkFCTEVfQklUUyAoMSA8PCAyOSkKKyNkZWZpbmUgQVRMQVM2X0NPREVDX1JFU0VUX0JJVFMgKDEgPDwgMjgpCisJc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEody0+Y29kZWMtPmRldik7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWVuYWJsZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVRMQVM2X0NPREVDX0VOQUJMRV9CSVRTLCBBVExBUzZfQ09ERUNfUkVTRVRfQklUUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDEsIEFUTEFTNl9DT0RFQ19FTkFCTEVfQklUUywKKwkJCX5BVExBUzZfQ09ERUNfRU5BQkxFX0JJVFMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmltYTJfY29kZWNfZW5hYmxlX2FuZF9yZXNldF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKyNkZWZpbmUgUFJJTUEyX0NPREVDX0VOQUJMRV9CSVRTICgxIDw8IDI3KQorI2RlZmluZSBQUklNQTJfQ09ERUNfUkVTRVRfQklUUyAoMSA8PCAyNikKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyAqc2lyZl9hdWRpb19jb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YSh3LT5jb2RlYy0+ZGV2KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWVuYWJsZV9hbmRfcmVzZXRfY29kZWMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJUFJJTUEyX0NPREVDX0VOQUJMRV9CSVRTLCBQUklNQTJfQ09ERUNfUkVTRVRfQklUUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLAorCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDEsIFBSSU1BMl9DT0RFQ19FTkFCTEVfQklUUywKKwkJCX5QUklNQTJfQ09ERUNfRU5BQkxFX0JJVFMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGF0bGFzNl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9PVVRfRFJWKCJIUCBMZWZ0IERyaXZlciIsIEFVRElPX0lDX0NPREVDX0NUUkwxLAorCQkJMjUsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9PVVRfRFJWKCJIUCBSaWdodCBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTI2LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiU3BlYWtlciBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTI3LCAwLCBOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBwcmltYTJfb3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgTGVmdCBEcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJCTIzLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiSFAgUmlnaHQgRHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQkyNCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIlNwZWFrZXIgRHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCQkyNSwgMCwgTlVMTCwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYXRsYXM2X2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0ID0KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJjb2RlY2NsayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCWF0bGFzNl9jb2RlY19lbmFibGVfYW5kX3Jlc2V0X2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcHJpbWEyX2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0ID0KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJjb2RlY2NsayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCXByaW1hMl9jb2RlY19lbmFibGVfYW5kX3Jlc2V0X2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2lyZl9hdWRpb19jb2RlY19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgbGVmdCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwwLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgcmlnaHQiLCBOVUxMLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTGVmdCBkYWMgdG8gaHAgbGVmdCBhbXAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmbGVmdF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkxlZnQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZsZWZ0X2RhY190b19ocF9yaWdodF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlJpZ2h0IGRhYyB0byBocCBsZWZ0IGFtcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZyaWdodF9kYWNfdG9faHBfbGVmdF9hbXBfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlJpZ2h0IGRhYyB0byBocCByaWdodCBhbXAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmcmlnaHRfZGFjX3RvX2hwX3JpZ2h0X2FtcF9zd2l0Y2hfY29udHJvbCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCBsZWZ0IGRyaXZlciIsIEFVRElPX0lDX0NPREVDX0NUUkwwLCAzLCAwLAorCQkJTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIkhQIGFtcCByaWdodCBkcml2ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMCwgMywgMCwKKwkJCU5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJmxlZnRfZGFjX3RvX3NwZWFrZXJfbGluZW91dF9zd2l0Y2hfY29udHJvbCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZyaWdodF9kYWNfdG9fc3BlYWtlcl9saW5lb3V0X3N3aXRjaF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVigiU3BlYWtlciBhbXAgZHJpdmVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsIDQsIDAsCisJCQlOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS09VVCIpLAorCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREMgbGVmdCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA4LCAwLAorCQkJYWRjX2VuYWJsZV9kZWxheV9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyByaWdodCIsIE5VTEwsIEFVRElPX0lDX0NPREVDX0NUUkwxLCA3LCAwLAorCQkJYWRjX2VuYWJsZV9kZWxheV9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxlZnQgUEdBIG1peGVyIiwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsIDEsIDAsCisJCSZsZWZ0X2lucHV0X3BhdGhfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUobGVmdF9pbnB1dF9wYXRoX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSaWdodCBQR0EgbWl4ZXIiLCBBVURJT19JQ19DT0RFQ19DVFJMMSwgMCwgMCwKKwkJJnJpZ2h0X2lucHV0X3BhdGhfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUocmlnaHRfaW5wdXRfcGF0aF9jb250cm9scykpLAorCisJU05EX1NPQ19EQVBNX01VWCgiTWljIGlucHV0IG1vZGUgbXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnNpcmZfYXVkaW9fY29kZWNfaW5wdXRfbW9kZV9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBBVURJT19JQ19DT0RFQ19QV1IsIDMsIDApLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDSU4xIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNJTjIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTkVJTjEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTkVJTjIiKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkhTTCBQaGFzZSBPcHBvc2l0ZSIsIEFVRElPX0lDX0NPREVDX0NUUkwwLAorCQkJMzAsIDAsIE5VTEwsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgc2lyZl9hdWRpb19jb2RlY19tYXBbXSA9IHsKKwl7IlNQS09VVCIsIE5VTEwsICJTcGVha2VyIERyaXZlciJ9LAorCXsiU3BlYWtlciBEcml2ZXIiLCBOVUxMLCAiU3BlYWtlciBhbXAgZHJpdmVyIn0sCisJeyJTcGVha2VyIGFtcCBkcml2ZXIiLCBOVUxMLCAiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0In0sCisJeyJTcGVha2VyIGFtcCBkcml2ZXIiLCBOVUxMLCAiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCJ9LAorCXsiTGVmdCBkYWMgdG8gc3BlYWtlciBsaW5lb3V0IiwgIlN3aXRjaCIsICJEQUMgbGVmdCJ9LAorCXsiUmlnaHQgZGFjIHRvIHNwZWFrZXIgbGluZW91dCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJIUE9VVEwiLCBOVUxMLCAiSFAgTGVmdCBEcml2ZXIifSwKKwl7IkhQT1VUUiIsIE5VTEwsICJIUCBSaWdodCBEcml2ZXIifSwKKwl7IkhQIExlZnQgRHJpdmVyIiwgTlVMTCwgIkhQIGFtcCBsZWZ0IGRyaXZlciJ9LAorCXsiSFAgUmlnaHQgRHJpdmVyIiwgTlVMTCwgIkhQIGFtcCByaWdodCBkcml2ZXIifSwKKwl7IkhQIGFtcCBsZWZ0IGRyaXZlciIsIE5VTEwsICJSaWdodCBkYWMgdG8gaHAgbGVmdCBhbXAifSwKKwl7IkhQIGFtcCByaWdodCBkcml2ZXIiLCBOVUxMICwgIlJpZ2h0IGRhYyB0byBocCByaWdodCBhbXAifSwKKwl7IkhQIGFtcCBsZWZ0IGRyaXZlciIsIE5VTEwsICJMZWZ0IGRhYyB0byBocCBsZWZ0IGFtcCJ9LAorCXsiSFAgYW1wIHJpZ2h0IGRyaXZlciIsIE5VTEwgLCAiUmlnaHQgZGFjIHRvIGhwIHJpZ2h0IGFtcCJ9LAorCXsiUmlnaHQgZGFjIHRvIGhwIGxlZnQgYW1wIiwgIlN3aXRjaCIsICJEQUMgbGVmdCJ9LAorCXsiUmlnaHQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJMZWZ0IGRhYyB0byBocCBsZWZ0IGFtcCIsICJTd2l0Y2giLCAiREFDIGxlZnQifSwKKwl7IkxlZnQgZGFjIHRvIGhwIHJpZ2h0IGFtcCIsICJTd2l0Y2giLCAiREFDIHJpZ2h0In0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJjb2RlY2NsayJ9LAorCXsiREFDIHJpZ2h0IiwgTlVMTCwgImNvZGVjY2xrIn0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJQbGF5YmFjayJ9LAorCXsiREFDIHJpZ2h0IiwgTlVMTCwgIlBsYXliYWNrIn0sCisJeyJEQUMgbGVmdCIsIE5VTEwsICJIU0wgUGhhc2UgT3Bwb3NpdGUifSwKKwl7IkRBQyByaWdodCIsIE5VTEwsICJIU0wgUGhhc2UgT3Bwb3NpdGUifSwKKworCXsiQ2FwdHVyZSIsIE5VTEwsICJBREMgbGVmdCJ9LAorCXsiQ2FwdHVyZSIsIE5VTEwsICJBREMgcmlnaHQifSwKKwl7IkFEQyBsZWZ0IiwgTlVMTCwgImNvZGVjY2xrIn0sCisJeyJBREMgcmlnaHQiLCBOVUxMLCAiY29kZWNjbGsifSwKKwl7IkFEQyBsZWZ0IiwgTlVMTCwgIkxlZnQgUEdBIG1peGVyIn0sCisJeyJBREMgcmlnaHQiLCBOVUxMLCAiUmlnaHQgUEdBIG1peGVyIn0sCisJeyJMZWZ0IFBHQSBtaXhlciIsICJMaW5lIExlZnQgU3dpdGNoIiwgIkxJTkVJTjIifSwKKwl7IlJpZ2h0IFBHQSBtaXhlciIsICJMaW5lIFJpZ2h0IFN3aXRjaCIsICJMSU5FSU4xIn0sCisJeyJMZWZ0IFBHQSBtaXhlciIsICJNaWMgTGVmdCBTd2l0Y2giLCAiTUlDSU4yIn0sCisJeyJSaWdodCBQR0EgbWl4ZXIiLCAiTWljIFJpZ2h0IFN3aXRjaCIsICJNaWMgaW5wdXQgbW9kZSBtdXgifSwKKwl7Ik1pYyBpbnB1dCBtb2RlIG11eCIsICJTaW5nbGUtZW5kZWQiLCAiTUlDSU4xIn0sCisJeyJNaWMgaW5wdXQgbW9kZSBtdXgiLCAiRGlmZmVyZW50aWFsIiwgIk1JQ0lOMSJ9LAorfTsKKworc3RhdGljIGludCBzaXJmX2F1ZGlvX2NvZGVjX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCWludCBjbWQsCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCBwbGF5YmFjayA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MzIgdmFsID0gMDsKKworCS8qCisJICogVGhpcyBpcyBhIHdvcmthcm91bmQsIFdoZW4gc3RvcCBwbGF5YmFjaywKKwkgKiBuZWVkIGRpc2FibGUgSFAgYW1wLCBhdm9pZCB0aGUgY3VycmVudCBub2lzZS4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJaWYgKHBsYXliYWNrKQorCQkJdmFsID0gSUNfSFNMRU4gfCBJQ19IU1JFTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBsYXliYWNrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBVURJT19JQ19DT0RFQ19DVFJMMCwKKwkJCUlDX0hTTEVOIHwgSUNfSFNSRU4sIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2lyZl9hdWRpb19jb2RlY19kYWlfb3BzID0geworCS50cmlnZ2VyID0gc2lyZl9hdWRpb19jb2RlY190cmlnZ2VyLAorfTsKKworc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzaXJmX2F1ZGlvX2NvZGVjX2RhaSA9IHsKKwkubmFtZSA9ICJzaXJmLWF1ZGlvLWNvZGVjIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCisJLm9wcyA9ICZzaXJmX2F1ZGlvX2NvZGVjX2RhaV9vcHMsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGNvZGVjLT5kZXYpOworCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvZGVjLT5kZXYtPm9mX25vZGUsICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIpKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCXByaW1hMl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUocHJpbWEyX291dHB1dF9kcml2ZXJfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCSZwcmltYTJfY29kZWNfY2xvY2tfZGFwbV93aWRnZXQsIDEpOworCQlyZXR1cm4gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsCisJCQl2b2x1bWVfY29udHJvbHNfcHJpbWEyLAorCQkJQVJSQVlfU0laRSh2b2x1bWVfY29udHJvbHNfcHJpbWEyKSk7CisJfQorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb2RlYy0+ZGV2LT5vZl9ub2RlLCAic2lyZixhdGxhczYtYXVkaW8tY29kZWMiKSkgeworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQlhdGxhczZfb3V0cHV0X2RyaXZlcl9kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKGF0bGFzNl9vdXRwdXRfZHJpdmVyX2RhcG1fd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQkmYXRsYXM2X2NvZGVjX2Nsb2NrX2RhcG1fd2lkZ2V0LCAxKTsKKwkJcmV0dXJuIHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLAorCQkJdm9sdW1lX2NvbnRyb2xzX2F0bGFzNiwKKwkJCUFSUkFZX1NJWkUodm9sdW1lX2NvbnRyb2xzX2F0bGFzNikpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlwbV9ydW50aW1lX2Rpc2FibGUoY29kZWMtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9zaXJmX2F1ZGlvX2NvZGVjID0geworCS5wcm9iZSA9IHNpcmZfYXVkaW9fY29kZWNfcHJvYmUsCisJLnJlbW92ZSA9IHNpcmZfYXVkaW9fY29kZWNfcmVtb3ZlLAorCS5kYXBtX3dpZGdldHMgPSBzaXJmX2F1ZGlvX2NvZGVjX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2lyZl9hdWRpb19jb2RlY19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IHNpcmZfYXVkaW9fY29kZWNfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNpcmZfYXVkaW9fY29kZWNfbWFwKSwKKwkuaWRsZV9iaWFzX29mZiA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaXJmX2F1ZGlvX2NvZGVjX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1hdWRpby1jb2RlYyIgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2lyZl9hdWRpb19jb2RlY19vZl9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzaXJmX2F1ZGlvX2NvZGVjX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS52YWxfYml0cyA9IDMyLAorCS5tYXhfcmVnaXN0ZXIgPSBBVURJT19JQ19DT0RFQ19DVFJMMywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jb2RlYyAqc2lyZl9hdWRpb19jb2RlYzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlc291cmNlICptZW1fcmVzOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNpcmZfYXVkaW9fY29kZWNfb2ZfbWF0Y2gsIHBkZXYtPmRldi5vZl9ub2RlKTsKKworCXNpcmZfYXVkaW9fY29kZWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJc2l6ZW9mKHN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaXJmX2F1ZGlvX2NvZGVjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNpcmZfYXVkaW9fY29kZWMpOworCisJbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW1fcmVzKTsKKwlpZiAoYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pbygmcGRldi0+ZGV2LCBiYXNlLAorCQkJCQkgICAgJnNpcmZfYXVkaW9fY29kZWNfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXApOworCisJc2lyZl9hdWRpb19jb2RlYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJHZXQgY2xvY2sgZmFpbGVkLlxuIik7CisJCXJldHVybiBQVFJfRVJSKHNpcmZfYXVkaW9fY29kZWMtPmNsayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNpcmZfYXVkaW9fY29kZWMtPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFbmFibGUgY2xvY2sgZmFpbGVkLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmKHBkZXYtPmRldiksCisJCQkmc29jX2NvZGVjX2RldmljZV9zaXJmX2F1ZGlvX2NvZGVjLAorCQkJJnNpcmZfYXVkaW9fY29kZWNfZGFpLCAxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlZ2lzdGVyIEF1ZGlvIENvZGVjIGRhaSBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfY2xrX3B1dDsKKwl9CisKKwkvKgorCSAqIEFsd2F5cyBvcGVuIGNoYXJnZSBwdW1wLCBpZiBub3QsIHdoZW4gdGhlIGNoYXJnZSBwdW1wIGNsb3NlZCB0aGUKKwkgKiBhZGMgd2lsbCBub3Qgc3RhYmxlCisJICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsCisJCUlDX0NQRlJFUSwgSUNfQ1BGUkVRKTsKKworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYsYXRsYXM2LWF1ZGlvLWNvZGVjIikpCisJCXJlZ21hcF91cGRhdGVfYml0cyhzaXJmX2F1ZGlvX2NvZGVjLT5yZWdtYXAsCisJCQkJQVVESU9fSUNfQ09ERUNfQ1RSTDAsIElDX0NQRU4sIElDX0NQRU4pOworCXJldHVybiAwOworCitlcnJfY2xrX3B1dDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlvX2NvZGVjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc2lyZl9hdWRpb19jb2RlYy0+Y2xrKTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJihwZGV2LT5kZXYpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fY29kZWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpcmZfYXVkaW9fY29kZWMgKnNpcmZfYXVkaW9fY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJlZ21hcF9yZWFkKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDAsCisJCSZzaXJmX2F1ZGlvX2NvZGVjLT5yZWdfY3RybDApOworCXJlZ21hcF9yZWFkKHNpcmZfYXVkaW9fY29kZWMtPnJlZ21hcCwgQVVESU9fSUNfQ09ERUNfQ1RSTDEsCisJCSZzaXJmX2F1ZGlvX2NvZGVjLT5yZWdfY3RybDEpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lyZl9hdWRpb19jb2RlY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXJmX2F1ZGlvX2NvZGVjICpzaXJmX2F1ZGlvX2NvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzaXJmX2F1ZGlvX2NvZGVjLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZWdtYXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLCBBVURJT19JQ19DT0RFQ19DVFJMMCwKKwkJc2lyZl9hdWRpb19jb2RlYy0+cmVnX2N0cmwwKTsKKwlyZWdtYXBfd3JpdGUoc2lyZl9hdWRpb19jb2RlYy0+cmVnbWFwLCBBVURJT19JQ19DT0RFQ19DVFJMMSwKKwkJc2lyZl9hdWRpb19jb2RlYy0+cmVnX2N0cmwxKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzaXJmX2F1ZGlvX2NvZGVjX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhzaXJmX2F1ZGlvX2NvZGVjX3N1c3BlbmQsIHNpcmZfYXVkaW9fY29kZWNfcmVzdW1lKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2lyZl9hdWRpb19jb2RlY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZi1hdWRpby1jb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzaXJmX2F1ZGlvX2NvZGVjX29mX21hdGNoLAorCQkucG0gPSAmc2lyZl9hdWRpb19jb2RlY19wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBzaXJmX2F1ZGlvX2NvZGVjX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gc2lyZl9hdWRpb19jb2RlY19kcml2ZXJfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaXJmX2F1ZGlvX2NvZGVjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2lSRiBhdWRpbyBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJvbmdKdW4gWWluZyA8Um9uZ2p1bi5ZaW5nQGNzci5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc2lyZi1hdWRpby1jb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzE4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NpcmYtYXVkaW8tY29kZWMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogU2lSRiBpbm5lciBjb2RlYyBjb250cm9sbGVycyBkZWZpbmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfU0lSRl9BVURJT19DT0RFQ19ICisjZGVmaW5lIF9TSVJGX0FVRElPX0NPREVDX0gKKworCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX1BXUgkJCSgweDAwRTApCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX0NUUkwwCQkJKDB4MDBFNCkKKyNkZWZpbmUgQVVESU9fSUNfQ09ERUNfQ1RSTDEJCQkoMHgwMEU4KQorI2RlZmluZSBBVURJT19JQ19DT0RFQ19DVFJMMgkJCSgweDAwRUMpCisjZGVmaW5lIEFVRElPX0lDX0NPREVDX0NUUkwzCQkJKDB4MDBGMCkKKworI2RlZmluZSBNSUNCSUFTRU4JCSgxIDw8IDMpCisKKyNkZWZpbmUgSUNfUkRBQ0VOCQkoMSA8PCAwKQorI2RlZmluZSBJQ19MREFDRU4JCSgxIDw8IDEpCisjZGVmaW5lIElDX0hTUkVOCQkoMSA8PCAyKQorI2RlZmluZSBJQ19IU0xFTgkJKDEgPDwgMykKKyNkZWZpbmUgSUNfU1BFTgkJCSgxIDw8IDQpCisjZGVmaW5lIElDX0NQRU4JCQkoMSA8PCA1KQorCisjZGVmaW5lIElDX0hQUlNFTFIJCSgxIDw8IDYpCisjZGVmaW5lIElDX0hQTFNFTFIJCSgxIDw8IDcpCisjZGVmaW5lIElDX0hQUlNFTEwJCSgxIDw8IDgpCisjZGVmaW5lIElDX0hQTFNFTEwJCSgxIDw8IDkpCisjZGVmaW5lIElDX1NQU0VMUgkJKDEgPDwgMTApCisjZGVmaW5lIElDX1NQU0VMTAkJKDEgPDwgMTEpCisKKyNkZWZpbmUgSUNfTU9OT1IJCSgxIDw8IDEyKQorI2RlZmluZSBJQ19NT05PTAkJKDEgPDwgMTMpCisKKyNkZWZpbmUgSUNfUlhPU1JTRUwJCSgxIDw8IDI4KQorI2RlZmluZSBJQ19DUEZSRVEJCSgxIDw8IDI5KQorI2RlZmluZSBJQ19IU0lOVkVOCQkoMSA8PCAzMCkKKworI2RlZmluZSBJQ19NSUNJTlJFTgkJKDEgPDwgMCkKKyNkZWZpbmUgSUNfTUlDSU5MRU4JCSgxIDw8IDEpCisjZGVmaW5lIElDX01JQ0lOMVNFTAkJKDEgPDwgMikKKyNkZWZpbmUgSUNfTUlDSU4yU0VMCQkoMSA8PCAzKQorI2RlZmluZSBJQ19NSUNESUZTRUwJCSgxIDw8IDQpCisjZGVmaW5lCUlDX0xJTkVJTjFTRUwJCSgxIDw8IDUpCisjZGVmaW5lCUlDX0xJTkVJTjJTRUwJCSgxIDw8IDYpCisjZGVmaW5lCUlDX1JBRENFTgkJKDEgPDwgNykKKyNkZWZpbmUJSUNfTEFEQ0VOCQkoMSA8PCA4KQorI2RlZmluZQlJQ19BTE0JCQkoMSA8PCA5KQorCisjZGVmaW5lIElDX0RJR01JQ0VOICAgICAgICAgICAgICgxIDw8IDIyKQorI2RlZmluZSBJQ19ESUdNSUNGUkVRICAgICAgICAgICAoMSA8PCAyMykKKyNkZWZpbmUgSUNfQURDMTRCXzEyICAgICAgICAgICAgKDEgPDwgMjQpCisjZGVmaW5lIElDX0ZJUkRBQ19IU0xfRU4gICAgICAgICgxIDw8IDI1KQorI2RlZmluZSBJQ19GSVJEQUNfSFNSX0VOICAgICAgICAoMSA8PCAyNikKKyNkZWZpbmUgSUNfRklSREFDX0xPVVRfRU4gICAgICAgKDEgPDwgMjcpCisjZGVmaW5lIElDX1BPUiAgICAgICAgICAgICAgICAgICgxIDw8IDI4KQorI2RlZmluZSBJQ19DT0RFQ19DTEtfRU4gICAgICAgICAoMSA8PCAyOSkKKyNkZWZpbmUgSUNfSFBfM0RCX0JPT1NUICAgICAgICAgKDEgPDwgMzApCisKKyNkZWZpbmUgSUNfQURDX0xFRlRfR0FJTl9TSElGVAkxNgorI2RlZmluZSBJQ19BRENfUklHSFRfR0FJTl9TSElGVCAxMAorI2RlZmluZSBJQ19BRENfR0FJTl9NQVNLCTB4M0YKKyNkZWZpbmUgSUNfTUlDX01BWF9HQUlOCQkweDM5CisKKyNkZWZpbmUgSUNfUlhQR0FSX01BU0sJCTB4M0YKKyNkZWZpbmUgSUNfUlhQR0FSX1NISUZUCQkxNAorI2RlZmluZSBJQ19SWFBHQUxfTUFTSwkJMHgzRgorI2RlZmluZSBJQ19SWFBHQUxfU0hJRlQJCTIxCisjZGVmaW5lIElDX1JYUEdBUgkJMHg3QgorI2RlZmluZSBJQ19SWFBHQUwJCTB4N0IKKworI2VuZGlmIC8qX19TSVJGX0FVRElPX0NPREVDX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwppbmRleCAxMzA0NWYyLi40MmRmZjI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwpAQCAtMzEyLDE0ICszMTIsMTQgQEAKIC8qIG11eCBjb250cm9scyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnNuOTUwMzFfbWljX3RleHRzW10gPSB7ICJBTUlDIiwgIkxpbmVJbiIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbjk1MDMxX21pY2xfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfQURDQ09ORklHLCAxLCAyLCBzbjk1MDMxX21pY190ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc245NTAzMV9taWNsX2VudW0sCisJCQkgICAgU045NTAzMV9BRENDT05GSUcsIDEsIHNuOTUwMzFfbWljX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfbWljbF9tdXhfY29udHJvbCA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBzbjk1MDMxX21pY2xfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9taWNyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FEQ0NPTkZJRywgMywgMiwgc245NTAzMV9taWNfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfbWljcl9lbnVtLAorCQkJICAgIFNOOTUwMzFfQURDQ09ORklHLCAzLCBzbjk1MDMxX21pY190ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbjk1MDMxX21pY3JfbXV4X2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgc245NTAzMV9taWNyX2VudW0pOwpAQCAtMzI4LDI2ICszMjgsMjYgQEAKIAkJCQkJCSJETUlDNCIsICJETUlDNSIsICJETUlDNiIsCiAJCQkJCQkiQURDIExlZnQiLCAiQURDIFJpZ2h0IiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMTIsIDAsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQxX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDEyLCAwLCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQxX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQxX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMTIsIDQsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQyX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDEyLCA0LCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQyX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQyX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMzQsIDAsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQzX2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDM0LCAwLCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQzX211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQzX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfaW5wdXQ0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0FVRElPTVVYMzQsIDQsIDgsIHNuOTUwMzFfaW5wdXRfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfaW5wdXQ0X2VudW0sCisJCQkgICAgU045NTAzMV9BVURJT01VWDM0LCA0LCBzbjk1MDMxX2lucHV0X3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuOTUwMzFfaW5wdXQ0X211eF9jb250cm9sID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHNuOTUwMzFfaW5wdXQ0X2VudW0pOwpAQCAtMzU5LDE5ICszNTksMTkgQEAKIC8qIDBkQiB0byAzMGRCIGluIDEwZEIgc3RlcHMgKi8KIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfdGx2LCAwLCAxMCwgMCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9taWNtb2RlMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU045NTAzMV9NSUNBTVAxLCAxLCAyLCBzbjk1MDMxX21pY21vZGVfdGV4dCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfbWljbW9kZTJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfTUlDQU1QMiwgMSwgMiwgc245NTAzMV9taWNtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfbWljbW9kZTFfZW51bSwKKwkJCSAgICBTTjk1MDMxX01JQ0FNUDEsIDEsIHNuOTUwMzFfbWljbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzbjk1MDMxX21pY21vZGUyX2VudW0sCisJCQkgICAgU045NTAzMV9NSUNBTVAyLCAxLCBzbjk1MDMxX21pY21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbjk1MDMxX2RtaWNfY2ZnX3RleHRbXSA9IHsiR1BPIiwgIkRNSUMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbjk1MDMxX2RtaWMxMl9jZmdfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNOOTUwMzFfRE1JQ01VWCwgMCwgMiwgc245NTAzMV9kbWljX2NmZ190ZXh0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc245NTAzMV9kbWljMzRfY2ZnX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTjk1MDMxX0RNSUNNVVgsIDEsIDIsIHNuOTUwMzFfZG1pY19jZmdfdGV4dCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNuOTUwMzFfZG1pYzU2X2NmZ19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU045NTAzMV9ETUlDTVVYLCAyLCAyLCBzbjk1MDMxX2RtaWNfY2ZnX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNuOTUwMzFfZG1pYzEyX2NmZ19lbnVtLAorCQkJICAgIFNOOTUwMzFfRE1JQ01VWCwgMCwgc245NTAzMV9kbWljX2NmZ190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzbjk1MDMxX2RtaWMzNF9jZmdfZW51bSwKKwkJCSAgICBTTjk1MDMxX0RNSUNNVVgsIDEsIHNuOTUwMzFfZG1pY19jZmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc245NTAzMV9kbWljNTZfY2ZnX2VudW0sCisJCQkgICAgU045NTAzMV9ETUlDTVVYLCAyLCBzbjk1MDMxX2RtaWNfY2ZnX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc245NTAzMV9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfRU5VTSgiTWljMU1vZGUgQ2FwdHVyZSBSb3V0ZSIsIHNuOTUwMzFfbWljbW9kZTFfZW51bSksCkBAIC04MjUsOCArODI1LDYgQEAKIHsKIAlwcl9kZWJ1ZygiY29kZWNfcHJvYmUgY2FsbGVkXG4iKTsKIAotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0KIAkvKiBQQ00gaW50ZXJmYWNlIGNvbmZpZwogCSAqIFRoaXMgc2V0cyB0aGUgcGNtIHJ4IHNsb3QgY29uZ3VyYXRpb24gdG8gbWF4IDYgc2xvdHMKIAkgKiBmb3IgbWF4IDQgZGFpcyAoMiBzdGVyZW8gYW5kIDIgbW9ubykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjUxOC5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKaW5kZXggY2M4ZGViYy4uNTZhZGIzZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKQEAgLTE2OSwxOSArMTY5LDE5IEBACiAJIjY4Mi4yNCBtcyIsICIxMzY0IG1zIiwKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9hdHRhY2tfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ18yLCA0LCBzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9yZWxlYXNlX3RpbWVfZW51bSwKIAlTU00yNTE4X1JFR19EUkNfMiwgMCwgc3NtMjUxOF9kcmNfcGVha19kZXRlY3Rvcl9yZWxlYXNlX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfYXR0YWNrX3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19hdHRhY2tfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ182LCA0LCBzc20yNTE4X2RyY19wZWFrX2RldGVjdG9yX2F0dGFja190aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2RlY2F5X3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19kZWNheV90aW1lX2VudW0sCiAJU1NNMjUxOF9SRUdfRFJDXzYsIDAsIHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2hvbGRfdGltZV9lbnVtLAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNzbTI1MThfZHJjX2hvbGRfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ183LCA0LCBzc20yNTE4X2RyY19ob2xkX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfbm9pc2VfZ2F0ZV9ob2xkX3RpbWVfZW51bSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzc20yNTE4X2RyY19ub2lzZV9nYXRlX2hvbGRfdGltZV9lbnVtLAogCVNTTTI1MThfUkVHX0RSQ183LCAwLCBzc20yNTE4X2RyY19ob2xkX3RpbWVfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcm1zX2F2ZXJhZ2luZ190aW1lX2VudW0sCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3NtMjUxOF9kcmNfcm1zX2F2ZXJhZ2luZ190aW1lX2VudW0sCiAJU1NNMjUxOF9SRUdfRFJDXzksIDAsIHNzbTI1MThfZHJjX3BlYWtfZGV0ZWN0b3JfcmVsZWFzZV90aW1lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3NtMjUxOF9zbmRfY29udHJvbHNbXSA9IHsKQEAgLTY0OCwxNiArNjQ4LDYgQEAKIAogc3RhdGljIGludCBzc20yNTE4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgc3NtMjUxOCAqc3NtMjUxOCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQ7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc3NtMjUxOC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAwLCAwLCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldHVybiBzc20yNTE4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDYzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItaTJjLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFNTTTI2MDIvU1NNMjYwMy9TU00yNjA0IEkyQyBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAic3NtMjYwMi5oIgorCisvKgorICogc3NtMjYwMiAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81CisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCitzdGF0aWMgaW50IHNzbTI2MDJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gc3NtMjYwMl9wcm9iZSgmY2xpZW50LT5kZXYsIGlkLT5kcml2ZXJfZGF0YSwKKwkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmc3NtMjYwMl9yZWdtYXBfY29uZmlnKSk7Cit9CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzc20yNjAyX2kyY19pZFtdID0geworCXsgInNzbTI2MDIiLCBTU00yNjAyIH0sCisJeyAic3NtMjYwMyIsIFNTTTI2MDIgfSwKKwl7ICJzc20yNjA0IiwgU1NNMjYwNCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzc20yNjAyX2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzc20yNjAyX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic3NtMjYwMiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gc3NtMjYwMl9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IHNzbTI2MDJfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBzc20yNjAyX2kyY19pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihzc20yNjAyX2kyY19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMi9TU00yNjAzL1NTTTI2MDQgSTJDIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDItc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmNTVlMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi1zcGkuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogU1NNMjYwMiBTUEkgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTQgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJzc20yNjAyLmgiCisKK3N0YXRpYyBpbnQgc3NtMjYwMl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gc3NtMjYwMl9wcm9iZSgmc3BpLT5kZXYsIFNTTTI2MDIsCisJCWRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJnNzbTI2MDJfcmVnbWFwX2NvbmZpZykpOworfQorCitzdGF0aWMgaW50IHNzbTI2MDJfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgc3NtMjYwMl9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInNzbTI2MDIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzc20yNjAyX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IHNzbTI2MDJfc3BpX3JlbW92ZSwKK307Cittb2R1bGVfc3BpX2RyaXZlcihzc20yNjAyX3NwaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMiBTUEkgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKaW5kZXggYWY3NmJiZC4uOTdiMDQ1NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKQEAgLTI3LDMyICsyNywyMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCiAjaW5jbHVkZSAic3NtMjYwMi5oIgogCi1lbnVtIHNzbTI2MDJfdHlwZSB7Ci0JU1NNMjYwMiwKLQlTU00yNjA0LAotfTsKLQogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3Qgc3NtMjYwMl9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwotCXN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCAqc3lzY2xrX2NvbnN0cmFpbnRzOworCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCAqc3lzY2xrX2NvbnN0cmFpbnRzOwogCiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCkBAIC03NSwxNSArNjMsMTYgQEAKIAogLypBcHBlbmRpbmcgc2V2ZXJhbCAiTm9uZSJzIGp1c3QgZm9yIE9TUyBtaXhlciB1c2UqLwogc3RhdGljIGNvbnN0IGNoYXIgKnNzbTI2MDJfaW5wdXRfc2VsZWN0W10gPSB7Ci0JIkxpbmUiLCAiTWljIiwgIk5vbmUiLCAiTm9uZSIsICJOb25lIiwKLQkiTm9uZSIsICJOb25lIiwgIk5vbmUiLAorCSJMaW5lIiwgIk1pYyIsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3NtMjYwMl9kZWVtcGhbXSA9IHsiTm9uZSIsICIzMktoeiIsICI0NC4xS2h6IiwgIjQ4S2h6In07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3NtMjYwMl9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKFNTTTI2MDJfQVBBTkEsIDIsIDIsIHNzbTI2MDJfaW5wdXRfc2VsZWN0KSwKLQlTT0NfRU5VTV9TSU5HTEUoU1NNMjYwMl9BUERJR0ksIDEsIDQsIHNzbTI2MDJfZGVlbXBoKSwKKwlTT0NfRU5VTV9TSU5HTEUoU1NNMjYwMl9BUEFOQSwgMiwgQVJSQVlfU0laRShzc20yNjAyX2lucHV0X3NlbGVjdCksCisJCQlzc20yNjAyX2lucHV0X3NlbGVjdCksCisJU09DX0VOVU1fU0lOR0xFKFNTTTI2MDJfQVBESUdJLCAxLCBBUlJBWV9TSVpFKHNzbTI2MDJfZGVlbXBoKSwKKwkJCXNzbTI2MDJfZGVlbXBoKSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3NtMjYweF9vdXRtaXhfdGx2W10gPSB7CkBAIC0xOTcsNyArMTg2LDcgQEAKIAk4MDAwLCAxNjAwMCwgMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3NtMjYwMl9jb25zdHJhaW50c18xMjI4ODAwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3NtMjYwMl9jb25zdHJhaW50c18xMjI4ODAwMCA9IHsKIAkubGlzdCA9IHNzbTI2MDJfcmF0ZXNfMTIyODgwMDAsCiAJLmNvdW50ID0gQVJSQVlfU0laRShzc20yNjAyX3JhdGVzXzEyMjg4MDAwKSwKIH07CkBAIC0yMDYsNyArMTk1LDcgQEAKIAk4MDAwLCA0NDEwMCwgODgyMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHNzbTI2MDJfY29uc3RyYWludHNfMTEyODk2MDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHNzbTI2MDJfY29uc3RyYWludHNfMTEyODk2MDAgPSB7CiAJLmxpc3QgPSBzc20yNjAyX3JhdGVzXzExMjg5NjAwLAogCS5jb3VudCA9IEFSUkFZX1NJWkUoc3NtMjYwMl9yYXRlc18xMTI4OTYwMCksCiB9OwpAQCAtNTI5LDcgKzUxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3NtMjYwMl9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IHNzbTI2MDJfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CkBAIC01NTQsNyArNTQzLDcgQEAKIAkJCUFSUkFZX1NJWkUoc3NtMjYwMl9yb3V0ZXMpKTsKIH0KIAotc3RhdGljIGludCBzc20yNjA0X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyBpbnQgc3NtMjYwNF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CkBAIC01NjgsMTggKzU1NywxMSBAQAogCQkJQVJSQVlfU0laRShzc20yNjA0X3JvdXRlcykpOwogfQogCi1zdGF0aWMgaW50IHNzbTI2MHhfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIGludCBzc20yNjB4X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzc20yNjAyLT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gcmVnbWFwX3dyaXRlKHNzbTI2MDItPnJlZ21hcCwgU1NNMjYwMl9SRVNFVCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKQEAgLTU5NywxMCArNTc5LDEwIEBACiAKIAlzd2l0Y2ggKHNzbTI2MDItPnR5cGUpIHsKIAljYXNlIFNTTTI2MDI6Ci0JCXJldCA9IHNzbTI2MDJfcHJvYmUoY29kZWMpOworCQlyZXQgPSBzc20yNjAyX2NvZGVjX3Byb2JlKGNvZGVjKTsKIAkJYnJlYWs7CiAJY2FzZSBTU00yNjA0OgotCQlyZXQgPSBzc20yNjA0X3Byb2JlKGNvZGVjKTsKKwkJcmV0ID0gc3NtMjYwNF9jb2RlY19wcm9iZShjb2RlYyk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjIwLDcgKzYwMiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9zc20yNjAyID0gewotCS5wcm9iZSA9CXNzbTI2MHhfcHJvYmUsCisJLnByb2JlID0Jc3NtMjYweF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0Jc3NtMjYwMl9yZW1vdmUsCiAJLnN1c3BlbmQgPQlzc20yNjAyX3N1c3BlbmQsCiAJLnJlc3VtZSA9CXNzbTI2MDJfcmVzdW1lLApAQCAtNjM5LDcgKzYyMSw3IEBACiAJcmV0dXJuIHJlZyA9PSBTU00yNjAyX1JFU0VUOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnID0gewogCS52YWxfYml0cyA9IDksCiAJLnJlZ19iaXRzID0gNywKIApAQCAtNjUwLDEzNCArNjMyLDI4IEBACiAJLnJlZ19kZWZhdWx0c19yYXcgPSBzc20yNjAyX3JlZywKIAkubnVtX3JlZ19kZWZhdWx0c19yYXcgPSBBUlJBWV9TSVpFKHNzbTI2MDJfcmVnKSwKIH07CitFWFBPUlRfU1lNQk9MX0dQTChzc20yNjAyX3JlZ21hcF9jb25maWcpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyBpbnQgc3NtMjYwMl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK2ludCBzc20yNjAyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBzc20yNjAyX3R5cGUgdHlwZSwKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJc3RydWN0IHNzbTI2MDJfcHJpdiAqc3NtMjYwMjsKLQlpbnQgcmV0OwogCi0Jc3NtMjYwMiA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3NtMjYwMl9wcml2KSwKLQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisKKwlzc20yNjAyID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc20yNjAyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNzbTI2MDIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGlfc2V0X2RydmRhdGEoc3BpLCBzc20yNjAyKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBzc20yNjAyKTsKIAlzc20yNjAyLT50eXBlID0gU1NNMjYwMjsKKwlzc20yNjAyLT5yZWdtYXAgPSByZWdtYXA7CiAKLQlzc20yNjAyLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZzc20yNjAyX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoc3NtMjYwMi0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoc3NtMjYwMi0+cmVnbWFwKTsKLQotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAotCQkJJnNvY19jb2RlY19kZXZfc3NtMjYwMiwgJnNzbTI2MDJfZGFpLCAxKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJnNvY19jb2RlY19kZXZfc3NtMjYwMiwKKwkJJnNzbTI2MDJfZGFpLCAxKTsKIH0KLQotc3RhdGljIGludCBzc20yNjAyX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHNzbTI2MDJfc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJzc20yNjAyIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gc3NtMjYwMl9zcGlfcHJvYmUsCi0JLnJlbW92ZQkJPSBzc20yNjAyX3NwaV9yZW1vdmUsCi19OwotI2VuZGlmCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCi0vKgotICogc3NtMjYwMiAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81Ci0gKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KLSAqICAgIGxvdyAgPSAweDFhCi0gKiAgICBoaWdoID0gMHgxYgotICovCi1zdGF0aWMgaW50IHNzbTI2MDJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyOwotCWludCByZXQ7Ci0KLQlzc20yNjAyID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBzc20yNjAyX3ByaXYpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChzc20yNjAyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaTJjX3NldF9jbGllbnRkYXRhKGkyYywgc3NtMjYwMik7Ci0Jc3NtMjYwMi0+dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKLQotCXNzbTI2MDItPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnNzbTI2MDJfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUihzc20yNjAyLT5yZWdtYXApKQotCQlyZXR1cm4gUFRSX0VSUihzc20yNjAyLT5yZWdtYXApOwotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl9zc20yNjAyLCAmc3NtMjYwMl9kYWksIDEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3NtMjYwMl9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzc20yNjAyX2kyY19pZFtdID0gewotCXsgInNzbTI2MDIiLCBTU00yNjAyIH0sCi0JeyAic3NtMjYwMyIsIFNTTTI2MDIgfSwKLQl7ICJzc20yNjA0IiwgU1NNMjYwNCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzc20yNjAyX2kyY19pZCk7Ci0KLS8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc3NtMjYwMl9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInNzbTI2MDIiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IHNzbTI2MDJfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBzc20yNjAyX2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlID0gc3NtMjYwMl9pMmNfaWQsCi19OwotI2VuZGlmCi0KLQotc3RhdGljIGludCBfX2luaXQgc3NtMjYwMl9tb2Rpbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQotCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnNzbTI2MDJfc3BpX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQotCXJldCA9IGkyY19hZGRfZHJpdmVyKCZzc20yNjAyX2kyY19kcml2ZXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci19Ci1tb2R1bGVfaW5pdChzc20yNjAyX21vZGluaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3NtMjYwMl9leGl0KHZvaWQpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNzbTI2MDJfc3BpX2RyaXZlcik7Ci0jZW5kaWYKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKLQlpMmNfZGVsX2RyaXZlcigmc3NtMjYwMl9pMmNfZHJpdmVyKTsKLSNlbmRpZgotfQotbW9kdWxlX2V4aXQoc3NtMjYwMl9leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNzbTI2MDJfcHJvYmUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1NNMjYwMi9TU00yNjAzL1NTTTI2MDQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5oIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKaW5kZXggZmJkMDdkNy4uNzQ3NTM4OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKQEAgLTI4LDYgKzI4LDIwIEBACiAjaWZuZGVmIF9TU00yNjAyX0gKICNkZWZpbmUgX1NTTTI2MDJfSAogCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKK3N0cnVjdCBkZXZpY2U7CisKK2VudW0gc3NtMjYwMl90eXBlIHsKKwlTU00yNjAyLAorCVNTTTI2MDQsCit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtMjYwMl9yZWdtYXBfY29uZmlnOworCitpbnQgc3NtMjYwMl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gc3NtMjYwMl90eXBlIHR5cGUsCisJc3RydWN0IHJlZ21hcCAqcmVnbWFwKTsKKwogLyogU1NNMjYwMiBDb2RlYyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwogCiAjZGVmaW5lIFNTTTI2MDJfTElOVk9MICAgMHgwMApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKaW5kZXggMjczNTM2MS4uMTI1Nzc3NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCkBAIC04NzIsMTYgKzg3Miw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogVGVsbCBBU29DIHdoYXQga2luZCBvZiBJL08gdG8gdXNlIHRvIHJlYWQgdGhlIHJlZ2lzdGVycy4gIEFTb0Mgd2lsbAotCSAqIHRoZW4gZG8gdGhlIEkyQyB0cmFuc2FjdGlvbnMgaXRzZWxmLgotCSAqLwotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzdGEzMngtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9PIChyZXQ9JWkpXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAkvKiBDaGlwIGRvY3VtZW50YXRpb24gZXhwbGljaXRseSByZXF1aXJlcyB0aGF0IHRoZSByZXNldCB2YWx1ZXMKIAkgKiBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzIGFyZSBsZWZ0IHVudG91Y2hlZC4KIAkgKiBXcml0ZSB0aGUgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSB0byBjYWNoZSBmb3IgcmVzZXJ2ZWQgcmVnaXN0ZXJzLApAQCAtOTQ2LDEwICs5MzYsNiBAQAogCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzdGEzMnhfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTUyOS5jCmluZGV4IDQwYzA3YmUuLmE0MGM0YjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGE1MjkuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfZ2Fpbl90bHYsIC05MTUwLCA1MCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobWFzdGVyX3ZvbF90bHYsIC0xMjc1MCwgNTAsIDApOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHB3bV9zcmMsIFNUQTUyOV9GRlhDRkcxLCA0LCBwd21fbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChwd21fc3JjLCBTVEE1MjlfRkZYQ0ZHMSwgNCwgcHdtX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGE1Mjlfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBTVEE1MjlfTFZPTCwgU1RBNTI5X1JWT0wsIDAsCkBAIC0xOTMsOCArMTkzLDcgQEAKIAkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJaW50IHBkYXRhLCBwbGF5X2ZyZXFfdmFsLCByZWNvcmRfZnJlcV92YWw7CiAJaW50IGJjbGtfdG9fZnNfcmF0aW87CiAKQEAgLTMyMiwxNiArMzIxLDYgQEAKIAogc3RhdGljIGludCBzdGE1MjlfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCBzdGE1MjkgKnN0YTUyOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQ7Ci0KLQljb2RlYy0+Y29udHJvbF9kYXRhID0gc3RhNTI5LT5yZWdtYXA7Ci0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAJc3RhNTI5X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYwppbmRleCBhNTQ1NWMxLi41M2I4MTBkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jCkBAIC02MiwyNSArNjIsMjUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpzdGFjOTc2Nl9ib29zdDJbXSA9IHsiMGRCIiwgIjIwZEIifTsKIHN0YXRpYyBjb25zdCBjaGFyICpzdGFjOTc2Nl9zdGVyZW9fbWljW10gPSB7Ik9mZiIsICJPbiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YWM5NzY2X3JlY29yZF9lbnVtID0KLQlTT0NfRU5VTV9ET1VCTEUoQUM5N19SRUNfU0VMLCA4LCAwLCA4LCBzdGFjOTc2Nl9yZWNvcmRfbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfbW9ub19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19HRU5FUkFMX1BVUlBPU0UsIDksIDIsIHN0YWM5NzY2X21vbm9fbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfbWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMiwgc3RhYzk3NjZfbWljX211eCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YWM5NzY2X1NQRElGX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfREFfQ09OVFJPTCwgMSwgMiwgc3RhYzk3NjZfU1BESUZfbXV4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfcG9wYnlwYXNzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIDIsIHN0YWM5NzY2X3BvcGJ5cGFzc19tdXgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9yZWNvcmRfYWxsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDEyLCAyLAotCQkJc3RhYzk3NjZfcmVjb3JkX2FsbF9tdXgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9ib29zdDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKEFDOTdfTUlDLCA2LCAyLCBzdGFjOTc2Nl9ib29zdDEpOyAvKiAwLzEwZEIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhYzk3NjZfYm9vc3QyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDIsIDIsIHN0YWM5NzY2X2Jvb3N0Mik7IC8qIDAvMjBkQiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGFjOTc2Nl9zdGVyZW9fbWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X1NUQUNfU1RFUkVPX01JQywgMiwgMSwgc3RhYzk3NjZfc3RlcmVvX21pYyk7CitzdGF0aWMgU09DX0VOVU1fRE9VQkxFX0RFQ0woc3RhYzk3NjZfcmVjb3JkX2VudW0sCisJCQkgICAgQUM5N19SRUNfU0VMLCA4LCAwLCBzdGFjOTc2Nl9yZWNvcmRfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9tb25vX2VudW0sCisJCQkgICAgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDksIHN0YWM5NzY2X21vbm9fbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9taWNfZW51bSwKKwkJCSAgICBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgc3RhYzk3NjZfbWljX211eCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RhYzk3NjZfU1BESUZfZW51bSwKKwkJCSAgICBBQzk3X1NUQUNfREFfQ09OVFJPTCwgMSwgc3RhYzk3NjZfU1BESUZfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9wb3BieXBhc3NfZW51bSwKKwkJCSAgICBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTUsIHN0YWM5NzY2X3BvcGJ5cGFzc19tdXgpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0YWM5NzY2X3JlY29yZF9hbGxfZW51bSwKKwkJCSAgICBBQzk3X1NUQUNfQU5BTE9HX1NQRUNJQUwsIDEyLAorCQkJICAgIHN0YWM5NzY2X3JlY29yZF9hbGxfbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9ib29zdDFfZW51bSwKKwkJCSAgICBBQzk3X01JQywgNiwgc3RhYzk3NjZfYm9vc3QxKTsgLyogMC8xMGRCICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RhYzk3NjZfYm9vc3QyX2VudW0sCisJCQkgICAgQUM5N19TVEFDX0FOQUxPR19TUEVDSUFMLCAyLCBzdGFjOTc2Nl9ib29zdDIpOyAvKiAwLzIwZEIgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGFjOTc2Nl9zdGVyZW9fbWljX2VudW0sCisJCQkgICAgQUM5N19TVEFDX1NURVJFT19NSUMsIDIsIHN0YWM5NzY2X3N0ZXJlb19taWMpOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1hc3Rlcl90bHYsIC00NjAwLCAwKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIocmVjb3JkX3RsdiwgMCwgMjI1MCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZjNDYwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1pMmMuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQUxTQSBTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIEkyQyBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6ICAgICAgQXJ1biBLUywgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4KKyAqIENvcHlyaWdodDogICAoQykgMjAwOCBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLiwKKyAqCisgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGJ5IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJ0bHYzMjBhaWMyMy5oIgorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoaTJjLT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnRsdjMyMGFpYzIzX3JlZ21hcCk7CisJcmV0dXJuIHRsdjMyMGFpYzIzX3Byb2JlKCZpMmMtPmRldiwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCBfX2V4aXQgdGx2MzIwYWljMjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGx2MzIwYWljMjNfaWRbXSA9IHsKKwl7InRsdjMyMGFpYzIzIiwgMH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bHYzMjBhaWMyM19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bHYzMjBhaWMyM19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKKwkJICAgfSwKKwkucHJvYmUgPSB0bHYzMjBhaWMyM19pMmNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZXhpdF9wKHRsdjMyMGFpYzIzX2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IHRsdjMyMGFpYzIzX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIodGx2MzIwYWljMjNfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBUTFYzMjBBSUMyMyBjb2RlYyBkcml2ZXIgSTJDIik7CitNT0RVTEVfQVVUSE9SKCJBcnVuIEtTIDxhcnVua3NAbWlzdHJhbHNvbHV0aW9ucy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLXNwaS5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM4N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1zcGkuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogQUxTQSBTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIFNQSSBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6ICAgICAgQXJ1biBLUywgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4KKyAqIENvcHlyaWdodDogICAoQykgMjAwOCBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLiwKKyAqCisgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGJ5IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSAidGx2MzIwYWljMjMuaCIKKworc3RhdGljIGludCBhaWMyM19zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAicHJvYmluZyB0bHYzMjBhaWMyMyBzcGkgZGV2aWNlXG4iKTsKKworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzA7CisJcmV0ID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZ0bHYzMjBhaWMyM19yZWdtYXApOworCXJldHVybiB0bHYzMjBhaWMyM19wcm9iZSgmc3BpLT5kZXYsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgYWljMjNfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWljMjNfc3BpID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRsdjMyMGFpYzIzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhaWMyM19zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGFpYzIzX3NwaV9yZW1vdmUsCit9OworCittb2R1bGVfc3BpX2RyaXZlcihhaWMyM19zcGkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIFNQSSIpOworTU9EVUxFX0FVVEhPUigiQXJ1biBLUyA8YXJ1bmtzQG1pc3RyYWxzb2x1dGlvbnMuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCmluZGV4IDVkNDMwY2MuLjIwODY0ZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC01MSw3ICs1MCw3IEBACiAJeyAgOSwgMHgwMDAwIH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwID0geworY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwID0gewogCS5yZWdfYml0cyA9IDcsCiAJLnZhbF9iaXRzID0gOSwKIApAQCAtNjAsMjAgKzU5LDIxIEBACiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3JlZyksCiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OworRVhQT1JUX1NZTUJPTCh0bHYzMjBhaWMyM19yZWdtYXApOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmVjX3NyY190ZXh0W10gPSB7ICJMaW5lIiwgIk1pYyIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdGV4dFtdID0geyJOb25lIiwgIjMyS2h6IiwgIjQ0LjFLaHoiLCAiNDhLaHoifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByZWNfc3JjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUTFYzMjBBSUMyM19BTkxHLCAyLCAyLCByZWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJlY19zcmNfZW51bSwKKwkJCSAgICBUTFYzMjBBSUMyM19BTkxHLCAyLCByZWNfc3JjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGx2MzIwYWljMjNfcmVjX3NyY19tdXhfY29udHJvbHMgPQogU09DX0RBUE1fRU5VTSgiSW5wdXQgU2VsZWN0IiwgcmVjX3NyY19lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0bHYzMjBhaWMyM19yZWNfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfQU5MRywgMiwgMiwgcmVjX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdGx2MzIwYWljMjNfZGVlbXBoID0KLQlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfRElHVCwgMSwgNCwgZGVlbXBoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHRsdjMyMGFpYzIzX3JlY19zcmMsCisJCQkgICAgVExWMzIwQUlDMjNfQU5MRywgMiwgcmVjX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0bHYzMjBhaWMyM19kZWVtcGgsCisJCQkgICAgVExWMzIwQUlDMjNfRElHVCwgMSwgZGVlbXBoX3RleHQpOwogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X2dhaW5fdGx2LCAtMTIxMDAsIDEwMCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaW5wdXRfZ2Fpbl90bHYsIC0xNzI1LCA3NSwgMCk7CkBAIC00MDAsNyArNDAwLDcgQEAKIAlzdHJ1Y3QgYWljMjMgKmFpYzIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAkvKiBkZWFjdGl2YXRlICovCi0JaWYgKCFjb2RlYy0+YWN0aXZlKSB7CisJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykpIHsKIAkJdWRlbGF5KDUwKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQUNUSVZFLCAweDApOwogCX0KQEAgLTU1NywxNiArNTU3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogUmVzZXQgY29kZWMgKi8KIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SRVNFVCwgMCk7CiAKQEAgLTYwNCw3ICs1OTYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfdGx2MzIwYWljMjMgPSB7Ci0JLnByb2JlID0gdGx2MzIwYWljMjNfcHJvYmUsCisJLnByb2JlID0gdGx2MzIwYWljMjNfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9IHRsdjMyMGFpYzIzX3JlbW92ZSwKIAkuc3VzcGVuZCA9IHRsdjMyMGFpYzIzX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHRsdjMyMGFpYzIzX3Jlc3VtZSwKQEAgLTYxNyw1NiArNjA5LDI1IEBACiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfaW50ZXJjb24pLAogfTsKIAotLyoKLSAqIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKLSAqIGFyb3VuZAotICovCi1zdGF0aWMgaW50IHRsdjMyMGFpYzIzX2NvZGVjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCi0JCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKK2ludCB0bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKIAlzdHJ1Y3QgYWljMjMgKmFpYzIzOwotCWludCByZXQ7CiAKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGkyYy0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOwogCi0JYWljMjMgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IGFpYzIzKSwgR0ZQX0tFUk5FTCk7CisJYWljMjMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGFpYzIzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFpYzIzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYWljMjMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnRsdjMyMGFpYzIzX3JlZ21hcCk7Ci0JaWYgKElTX0VSUihhaWMyMy0+cmVnbWFwKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWljMjMtPnJlZ21hcCk7CisJYWljMjMtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFpYzIzKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBhaWMyMyk7CiAKLQlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl90bHYzMjBhaWMyMywgJnRsdjMyMGFpYzIzX2RhaSwgMSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhkZXYsICZzb2NfY29kZWNfZGV2X3RsdjMyMGFpYzIzLAorCQkJCSAgICAgICZ0bHYzMjBhaWMyM19kYWksIDEpOwogfQotc3RhdGljIGludCBfX2V4aXQgdGx2MzIwYWljMjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGx2MzIwYWljMjNfaWRbXSA9IHsKLQl7InRsdjMyMGFpYzIzIiwgMH0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bHYzMjBhaWMyM19pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bHYzMjBhaWMyM19pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKLQkJICAgfSwKLQkucHJvYmUgPSB0bHYzMjBhaWMyM19jb2RlY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AodGx2MzIwYWljMjNfaTJjX3JlbW92ZSksCi0JLmlkX3RhYmxlID0gdGx2MzIwYWljMjNfaWQsCi19OwotCi1tb2R1bGVfaTJjX2RyaXZlcih0bHYzMjBhaWMyM19pMmNfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0wodGx2MzIwYWljMjNfcHJvYmUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJBcnVuIEtTIDxhcnVua3NAbWlzdHJhbHNvbHV0aW9ucy5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmggYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmgKaW5kZXggZTgwNDEyMC4uM2E3MjM1YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuaApAQCAtMTIsNiArMTIsMTIgQEAKICNpZm5kZWYgX1RMVjMyMEFJQzIzX0gKICNkZWZpbmUgX1RMVjMyMEFJQzIzX0gKIAorc3RydWN0IGRldmljZTsKK3N0cnVjdCByZWdtYXBfY29uZmlnOworCitleHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGx2MzIwYWljMjNfcmVnbWFwOworaW50IHRsdjMyMGFpYzIzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKTsKKwogLyogQ29kZWMgVExWMzIwQUlDMjMgKi8KICNkZWZpbmUgVExWMzIwQUlDMjNfTElOVk9MCQkweDAwCiAjZGVmaW5lIFRMVjMyMEFJQzIzX1JJTlZPTAkJMHgwMQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCmluZGV4IDk0YTY1OGYuLjQzMDY5ZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKQEAgLTIzOCw4ICsyMzgsOSBAQAogICogQUxTQSBjb250cm9scwogICovCiBzdGF0aWMgY29uc3QgY2hhciAqYWljMjZfY2FwdHVyZV9zcmNfdGV4dFtdID0geyJNaWMiLCAiQXV4In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpYzI2X2NhcHR1cmVfc3JjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShBSUMyNl9SRUdfQVVESU9fQ1RSTDEsIDEyLCAyLCBhaWMyNl9jYXB0dXJlX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWMyNl9jYXB0dXJlX3NyY19lbnVtLAorCQkJICAgIEFJQzI2X1JFR19BVURJT19DVFJMMSwgMTIsCisJCQkgICAgYWljMjZfY2FwdHVyZV9zcmNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMyNl9zbmRfY29udHJvbHNbXSA9IHsKIAkvKiBPdXRwdXQgKi8KQEAgLTI5NSw4ICsyOTYsNiBAQAogCXN0cnVjdCBhaWMyNiAqYWljMjYgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CiAJaW50IHJldCwgcmVnOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCiAJYWljMjYtPmNvZGVjID0gY29kZWM7CiAKIAkvKiBSZXNldCB0aGUgY29kZWMgdG8gcG93ZXIgb24gZGVmYXVsdHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExNThjZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jCkBAIC0wLDAgKzEsMTI4MCBAQAorLyoKKyAqIEFMU0EgU29DIFRMVjMyMEFJQzMxWFggY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBKeXJpIFNhcmhhIDxqc2FyaGFAdGkuY29tPgorICoKKyAqIEJhc2VkIG9uIGdyb3VuZCB3b3JrIGJ5OiBBaml0IEt1bGthcm5pIDx4MDE3NTc2NUB0aS5jb20+CisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgQVMgSVMgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogVGhlIFRMVjMyMEFJQzMxeHggc2VyaWVzIG9mIGF1ZGlvIGNvZGVjIGlzIGEgbG93LXBvd2VyLCBoaWdobHkgaW50ZWdyYXRlZAorICogaGlnaCBwZXJmb3JtYW5jZSBjb2RlYyB3aGljaCBwcm92aWRlcyBhIHN0ZXJlbyBEQUMsIGEgbW9ubyBBREMsCisgKiBhbmQgbW9uby9zdGVyZW8gQ2xhc3MtRCBzcGVha2VyIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgtbWljYmlhcy5oPgorCisjaW5jbHVkZSAidGx2MzIwYWljMzF4eC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IGFpYzMxeHhfcmVnX2RlZmF1bHRzW10gPSB7CisJeyBBSUMzMVhYX0NMS01VWCwgMHgwMCB9LAorCXsgQUlDMzFYWF9QTExQUiwgMHgxMSB9LAorCXsgQUlDMzFYWF9QTExKLCAweDA0IH0sCisJeyBBSUMzMVhYX1BMTERNU0IsIDB4MDAgfSwKKwl7IEFJQzMxWFhfUExMRExTQiwgMHgwMCB9LAorCXsgQUlDMzFYWF9OREFDLCAweDAxIH0sCisJeyBBSUMzMVhYX01EQUMsIDB4MDEgfSwKKwl7IEFJQzMxWFhfRE9TUk1TQiwgMHgwMCB9LAorCXsgQUlDMzFYWF9ET1NSTFNCLCAweDgwIH0sCisJeyBBSUMzMVhYX05BREMsIDB4MDEgfSwKKwl7IEFJQzMxWFhfTUFEQywgMHgwMSB9LAorCXsgQUlDMzFYWF9BT1NSLCAweDgwIH0sCisJeyBBSUMzMVhYX0lGQUNFMSwgMHgwMCB9LAorCXsgQUlDMzFYWF9EQVRBX09GRlNFVCwgMHgwMCB9LAorCXsgQUlDMzFYWF9JRkFDRTIsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQkNMS04sIDB4MDEgfSwKKwl7IEFJQzMxWFhfREFDU0VUVVAsIDB4MTQgfSwKKwl7IEFJQzMxWFhfREFDTVVURSwgMHgwYyB9LAorCXsgQUlDMzFYWF9MREFDVk9MLCAweDAwIH0sCisJeyBBSUMzMVhYX1JEQUNWT0wsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQURDU0VUVVAsIDB4MDAgfSwKKwl7IEFJQzMxWFhfQURDRkdBLCAweDgwIH0sCisJeyBBSUMzMVhYX0FEQ1ZPTCwgMHgwMCB9LAorCXsgQUlDMzFYWF9IUERSSVZFUiwgMHgwNCB9LAorCXsgQUlDMzFYWF9TUEtBTVAsIDB4MDYgfSwKKwl7IEFJQzMxWFhfREFDTUlYRVJST1VURSwgMHgwMCB9LAorCXsgQUlDMzFYWF9MQU5BTE9HSFBMLCAweDdmIH0sCisJeyBBSUMzMVhYX1JBTkFMT0dIUFIsIDB4N2YgfSwKKwl7IEFJQzMxWFhfTEFOQUxPR1NQTCwgMHg3ZiB9LAorCXsgQUlDMzFYWF9SQU5BTE9HU1BSLCAweDdmIH0sCisJeyBBSUMzMVhYX0hQTEdBSU4sIDB4MDIgfSwKKwl7IEFJQzMxWFhfSFBSR0FJTiwgMHgwMiB9LAorCXsgQUlDMzFYWF9TUExHQUlOLCAweDAwIH0sCisJeyBBSUMzMVhYX1NQUkdBSU4sIDB4MDAgfSwKKwl7IEFJQzMxWFhfTUlDQklBUywgMHgwMCB9LAorCXsgQUlDMzFYWF9NSUNQR0EsIDB4ODAgfSwKKwl7IEFJQzMxWFhfTUlDUEdBUEksIDB4MDAgfSwKKwl7IEFJQzMxWFhfTUlDUEdBTUksIDB4MDAgfSwKK307CisKK3N0YXRpYyBib29sIGFpYzMxeHhfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBBSUMzMVhYX1BBR0VDVEw6IC8qIHJlZ21hcCBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGlzICovCisJY2FzZSBBSUMzMVhYX1JFU0VUOiAvKiBhbHdheXMgY2xlYXJzIGFmdGVyIHdyaXRlICovCisJY2FzZSBBSUMzMVhYX09UX0ZMQUc6CisJY2FzZSBBSUMzMVhYX0FEQ0ZMQUc6CisJY2FzZSBBSUMzMVhYX0RBQ0ZMQUcxOgorCWNhc2UgQUlDMzFYWF9EQUNGTEFHMjoKKwljYXNlIEFJQzMxWFhfT0ZGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJEQUNGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJBRENGTEFHOiAvKiBTdGlja3kgaW50ZXJydXB0IGZsYWdzICovCisJY2FzZSBBSUMzMVhYX0lOVFJEQUNGTEFHMjoKKwljYXNlIEFJQzMxWFhfSU5UUkFEQ0ZMQUcyOgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBhaWMzMXh4X3dyaXRlYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFJQzMxWFhfT1RfRkxBRzoKKwljYXNlIEFJQzMxWFhfQURDRkxBRzoKKwljYXNlIEFJQzMxWFhfREFDRkxBRzE6CisJY2FzZSBBSUMzMVhYX0RBQ0ZMQUcyOgorCWNhc2UgQUlDMzFYWF9PRkZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkRBQ0ZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkFEQ0ZMQUc6IC8qIFN0aWNreSBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwljYXNlIEFJQzMxWFhfSU5UUkRBQ0ZMQUcyOgorCWNhc2UgQUlDMzFYWF9JTlRSQURDRkxBRzI6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBhaWMzMXh4X3Jhbmdlc1tdID0geworCXsKKwkJLnJhbmdlX21pbiA9IDAsCisJCS5yYW5nZV9tYXggPSAxMiAqIDEyOCwKKwkJLnNlbGVjdG9yX3JlZyA9IEFJQzMxWFhfUEFHRUNUTCwKKwkJLnNlbGVjdG9yX21hc2sgPSAweGZmLAorCQkuc2VsZWN0b3Jfc2hpZnQgPSAwLAorCQkud2luZG93X3N0YXJ0ID0gMCwKKwkJLndpbmRvd19sZW4gPSAxMjgsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhaWMzMXh4X2kyY19yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS53cml0ZWFibGVfcmVnID0gYWljMzF4eF93cml0ZWFibGUsCisJLnZvbGF0aWxlX3JlZyA9IGFpYzMxeHhfdm9sYXRpbGUsCisJLnJlZ19kZWZhdWx0cyA9IGFpYzMxeHhfcmVnX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShhaWMzMXh4X3JlZ19kZWZhdWx0cyksCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJhbmdlcyA9IGFpYzMxeHhfcmFuZ2VzLAorCS5udW1fcmFuZ2VzID0gQVJSQVlfU0laRShhaWMzMXh4X3JhbmdlcyksCisJLm1heF9yZWdpc3RlciA9IDEyICogMTI4LAorfTsKKworI2RlZmluZSBBSUMzMVhYX05VTV9TVVBQTElFUwk2CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFpYzMxeHhfc3VwcGx5X25hbWVzW0FJQzMxWFhfTlVNX1NVUFBMSUVTXSA9IHsKKwkiSFBWREQiLAorCSJTUFJWREQiLAorCSJTUExWREQiLAorCSJBVkREIiwKKwkiSU9WREQiLAorCSJEVkREIiwKK307CisKK3N0cnVjdCBhaWMzMXh4X2Rpc2FibGVfbmIgeworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4OworfTsKKworc3RydWN0IGFpYzMxeHhfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXU4IGkyY19yZWdzX3N0YXR1czsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBhaWMzMXh4X3BkYXRhIHBkYXRhOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0FJQzMxWFhfTlVNX1NVUFBMSUVTXTsKKwlzdHJ1Y3QgYWljMzF4eF9kaXNhYmxlX25iIGRpc2FibGVfbmJbQUlDMzFYWF9OVU1fU1VQUExJRVNdOworCXVuc2lnbmVkIGludCBzeXNjbGs7CisJaW50IHJhdGVfZGl2X2xpbmU7Cit9OworCitzdHJ1Y3QgYWljMzF4eF9yYXRlX2RpdnMgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXU4IHBfdmFsOworCXU4IHBsbF9qOworCXUxNiBwbGxfZDsKKwl1MTYgZG9zcjsKKwl1OCBuZGFjOworCXU4IG1kYWM7CisJdTggYW9zcjsKKwl1OCBuYWRjOworCXU4IG1hZGM7Cit9OworCisvKiBBREMgZGl2aWRlcnMgY2FuIGJlIGRpc2FibGVkIGJ5IGNvZmlndXJpbmcgdGhlbSB0byAwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFpYzMxeHhfcmF0ZV9kaXZzIGFpYzMxeHhfZGl2c1tdID0geworCS8qIG1jbGsgICAgICByYXRlICBwbGw6IHAgIGoJIGQgICAgIGRvc3IgbmRhYyBtZGFjICBhb3JzIG5hZGMgbWFkYyAqLworCS8qIDhrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAgODAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgNDgsICAyLAkxMjgsICA0OCwgIDJ9LAorCXsyNDAwMDAwMCwgICA4MDAwLAkyLCA4LCAxOTIwLAkxMjgsICA0OCwgIDIsCTEyOCwgIDQ4LCAgMn0sCisJezI1MDAwMDAwLCAgIDgwMDAsCTIsIDcsIDg2NDMsCTEyOCwgIDQ4LCAgMiwJMTI4LCAgNDgsICAyfSwKKwkvKiAxMS4wMjVrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAxMTAyNSwJMSwgNywgNTI2NCwJMTI4LCAgMzIsICAyLAkxMjgsICAzMiwgIDJ9LAorCXsyNDAwMDAwMCwgIDExMDI1LAkyLCA3LCA1MjY0LAkxMjgsICAzMiwgIDIsCTEyOCwgIDMyLCAgMn0sCisJezI1MDAwMDAwLCAgMTEwMjUsCTIsIDcsIDIyNTMsCTEyOCwgIDMyLCAgMiwJMTI4LCAgMzIsICAyfSwKKwkvKiAxNmsgcmF0ZSAqLworCXsxMjAwMDAwMCwgIDE2MDAwLAkxLCA4LCAxOTIwLAkxMjgsICAyNCwgIDIsCTEyOCwgIDI0LCAgMn0sCisJezI0MDAwMDAwLCAgMTYwMDAsCTIsIDgsIDE5MjAsCTEyOCwgIDI0LCAgMiwJMTI4LCAgMjQsICAyfSwKKwl7MjUwMDAwMDAsICAxNjAwMCwJMiwgNywgODY0MywJMTI4LCAgMjQsICAyLAkxMjgsICAyNCwgIDJ9LAorCS8qIDIyLjA1ayByYXRlICovCisJezEyMDAwMDAwLCAgMjIwNTAsCTEsIDcsIDUyNjQsCTEyOCwgIDE2LCAgMiwJMTI4LCAgMTYsICAyfSwKKwl7MjQwMDAwMDAsICAyMjA1MCwJMiwgNywgNTI2NCwJMTI4LCAgMTYsICAyLAkxMjgsICAxNiwgIDJ9LAorCXsyNTAwMDAwMCwgIDIyMDUwLAkyLCA3LCAyMjUzLAkxMjgsICAxNiwgIDIsCTEyOCwgIDE2LCAgMn0sCisJLyogMzJrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICAzMjAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgMTIsICAyLAkxMjgsICAxMiwgIDJ9LAorCXsyNDAwMDAwMCwgIDMyMDAwLAkyLCA4LCAxOTIwLAkxMjgsICAxMiwgIDIsCTEyOCwgIDEyLCAgMn0sCisJezI1MDAwMDAwLCAgMzIwMDAsCTIsIDcsIDg2NDMsCTEyOCwgIDEyLCAgMiwJMTI4LCAgMTIsICAyfSwKKwkvKiA0NC4xayByYXRlICovCisJezEyMDAwMDAwLCAgNDQxMDAsCTEsIDcsIDUyNjQsCTEyOCwgICA4LCAgMiwJMTI4LCAgIDgsICAyfSwKKwl7MjQwMDAwMDAsICA0NDEwMCwJMiwgNywgNTI2NCwJMTI4LCAgIDgsICAyLAkxMjgsICAgOCwgIDJ9LAorCXsyNTAwMDAwMCwgIDQ0MTAwLAkyLCA3LCAyMjUzLAkxMjgsICAgOCwgIDIsCTEyOCwgICA4LCAgMn0sCisJLyogNDhrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICA0ODAwMCwJMSwgOCwgMTkyMCwJMTI4LCAgIDgsICAyLAkxMjgsICAgOCwgIDJ9LAorCXsyNDAwMDAwMCwgIDQ4MDAwLAkyLCA4LCAxOTIwLAkxMjgsICAgOCwgIDIsCTEyOCwgICA4LCAgMn0sCisJezI1MDAwMDAwLCAgNDgwMDAsCTIsIDcsIDg2NDMsCTEyOCwgICA4LCAgMiwJMTI4LCAgIDgsICAyfSwKKwkvKiA4OC4yayByYXRlICovCisJezEyMDAwMDAwLCAgODgyMDAsCTEsIDcsIDUyNjQsCSA2NCwgICA4LCAgMiwJIDY0LCAgIDgsICAyfSwKKwl7MjQwMDAwMDAsICA4ODIwMCwJMiwgNywgNTI2NCwJIDY0LCAgIDgsICAyLAkgNjQsICAgOCwgIDJ9LAorCXsyNTAwMDAwMCwgIDg4MjAwLAkyLCA3LCAyMjUzLAkgNjQsICAgOCwgIDIsCSA2NCwgICA4LCAgMn0sCisJLyogOTZrIHJhdGUgKi8KKwl7MTIwMDAwMDAsICA5NjAwMCwJMSwgOCwgMTkyMCwJIDY0LCAgIDgsICAyLAkgNjQsICAgOCwgIDJ9LAorCXsyNDAwMDAwMCwgIDk2MDAwLAkyLCA4LCAxOTIwLAkgNjQsICAgOCwgIDIsCSA2NCwgICA4LCAgMn0sCisJezI1MDAwMDAwLCAgOTYwMDAsCTIsIDcsIDg2NDMsCSA2NCwgICA4LCAgMiwJIDY0LCAgIDgsICAyfSwKKwkvKiAxNzYuNGsgcmF0ZSAqLworCXsxMjAwMDAwMCwgMTc2NDAwLAkxLCA3LCA1MjY0LAkgMzIsICAgOCwgIDIsCSAzMiwgICA4LCAgMn0sCisJezI0MDAwMDAwLCAxNzY0MDAsCTIsIDcsIDUyNjQsCSAzMiwgICA4LCAgMiwJIDMyLCAgIDgsICAyfSwKKwl7MjUwMDAwMDAsIDE3NjQwMCwJMiwgNywgMjI1MywJIDMyLCAgIDgsICAyLAkgMzIsICAgOCwgIDJ9LAorCS8qIDE5MmsgcmF0ZSAqLworCXsxMjAwMDAwMCwgMTkyMDAwLAkxLCA4LCAxOTIwLAkgMzIsICAgOCwgIDIsCSAzMiwgICA4LCAgMn0sCisJezI0MDAwMDAwLCAxOTIwMDAsCTIsIDgsIDE5MjAsCSAzMiwgICA4LCAgMiwJIDMyLCAgIDgsICAyfSwKKwl7MjUwMDAwMDAsIDE5MjAwMCwJMiwgNywgODY0MywJIDMyLCAgIDgsICAyLAkgMzIsICAgOCwgIDJ9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZGFjX2luX3RleHRbXSA9IHsKKwkiT2ZmIiwgIkxlZnQgRGF0YSIsICJSaWdodCBEYXRhIiwgIk1vbm8iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJkYWNfaW5fdGV4dFtdID0geworCSJPZmYiLCAiUmlnaHQgRGF0YSIsICJMZWZ0IERhdGEiLCAiTW9ubyIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsZGFjX2luX2VudW0sIEFJQzMxWFhfREFDU0VUVVAsIDQsIGxkYWNfaW5fdGV4dCk7CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyZGFjX2luX2VudW0sIEFJQzMxWFhfREFDU0VUVVAsIDIsIHJkYWNfaW5fdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWljX3NlbGVjdF90ZXh0W10gPSB7CisJIk9mZiIsICJGRlIgMTAgT2htIiwgIkZGUiAyMCBPaG0iLCAiRkZSIDQwIE9obSIKK307CisKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMWxwX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgNiwgbWljX3NlbGVjdF90ZXh0KTsKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMXJwX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgNCwgbWljX3NlbGVjdF90ZXh0KTsKK3N0YXRpYyBjb25zdAorU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljMWxtX3BfZW51bSwgQUlDMzFYWF9NSUNQR0FQSSwgMiwgbWljX3NlbGVjdF90ZXh0KTsKKworc3RhdGljIGNvbnN0CitTT0NfRU5VTV9TSU5HTEVfREVDTChjbV9tX2VudW0sIEFJQzMxWFhfTUlDUEdBTUksIDYsIG1pY19zZWxlY3RfdGV4dCk7CitzdGF0aWMgY29uc3QKK1NPQ19FTlVNX1NJTkdMRV9ERUNMKG1pYzFsbV9tX2VudW0sIEFJQzMxWFhfTUlDUEdBTUksIDQsIG1pY19zZWxlY3RfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdm9sX3RsdiwgLTYzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfZmdhaW5fdGx2LCAwLCAxMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX2NnYWluX3RsdiwgLTIwMDAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfcGdhX3RsdiwgMCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGhwX2Rydl90bHYsIDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoY2xhc3NfRF9kcnZfdGx2LCA2MDAsIDYwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfdm9sX3RsdiwgLTYzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzcF92b2xfdGx2LCAtNjM1MCwgNTAsIDApOworCisvKgorICogY29udHJvbHMgdG8gYmUgZXhwb3J0ZWQgdG8gdGhlIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SX1NfVExWKCJEQUMgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MREFDVk9MLAorCQkJICAgQUlDMzFYWF9SREFDVk9MLCAwLCAtMTI3LCA0OCwgNywgMCwgZGFjX3ZvbF90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIkFEQyBGaW5lIENhcHR1cmUgVm9sdW1lIiwgQUlDMzFYWF9BRENGR0EsIDQsIDQsIDEsCisJCSAgICAgICBhZGNfZmdhaW5fdGx2KSwKKworCVNPQ19TSU5HTEUoIkFEQyBDYXB0dXJlIFN3aXRjaCIsIEFJQzMxWFhfQURDRkdBLCA3LCAxLCAxKSwKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIEFJQzMxWFhfQURDVk9MLCBBSUMzMVhYX0FEQ1ZPTCwKKwkJCSAgIDAsIC0yNCwgNDAsIDYsIDAsIGFkY19jZ2Fpbl90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIk1pYyBQR0EgQ2FwdHVyZSBWb2x1bWUiLCBBSUMzMVhYX01JQ1BHQSwgMCwKKwkJICAgICAgIDExOSwgMCwgbWljX3BnYV90bHYpLAorCisJU09DX0RPVUJMRV9SKCJIUCBEcml2ZXIgUGxheWJhY2sgU3dpdGNoIiwgQUlDMzFYWF9IUExHQUlOLAorCQkgICAgIEFJQzMxWFhfSFBSR0FJTiwgMiwgMSwgMCksCisJU09DX0RPVUJMRV9SX1RMVigiSFAgRHJpdmVyIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfSFBMR0FJTiwKKwkJCSBBSUMzMVhYX0hQUkdBSU4sIDMsIDB4MDksIDAsIGhwX2Rydl90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiSFAgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR0hQTCwKKwkJCSBBSUMzMVhYX1JBTkFMT0dIUFIsIDAsIDB4N0YsIDEsIGhwX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxMXhfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgICAgQUlDMzFYWF9TUFJHQUlOLCAyLCAxLCAwKSwKKwlTT0NfRE9VQkxFX1JfVExWKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX1NQTEdBSU4sCisJCQkgQUlDMzFYWF9TUFJHQUlOLCAzLCAzLCAwLCBjbGFzc19EX2Rydl90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiU3BlYWtlciBBbmFsb2cgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MQU5BTE9HU1BMLAorCQkJIEFJQzMxWFhfUkFOQUxPR1NQUiwgMCwgMHg3RiwgMSwgc3Bfdm9sX3RsdiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzEweF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgIDIsIDEsIDApLAorCVNPQ19TSU5HTEVfVExWKCJTcGVha2VyIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX1NQTEdBSU4sCisJCSAgICAgICAzLCAzLCAwLCBjbGFzc19EX2Rydl90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIlNwZWFrZXIgQW5hbG9nIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTEFOQUxPR1NQTCwKKwkJICAgICAgIDAsIDB4N0YsIDEsIHNwX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxkYWNfaW5fY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiREFDIExlZnQgSW5wdXQiLCBsZGFjX2luX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmRhY19pbl9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJEQUMgUmlnaHQgSW5wdXQiLCByZGFjX2luX2VudW0pOworCitzdGF0aWMgaW50IGFpYzMxeHhfd2FpdF9iaXRzKHN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHgsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgd2JpdHMsIGludCBzbGVlcCwKKwkJCSAgICAgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGludCBiaXRzOworCWludCBjb3VudGVyID0gY291bnQ7CisJaW50IHJldCA9IHJlZ21hcF9yZWFkKGFpYzMxeHgtPnJlZ21hcCwgcmVnLCAmYml0cyk7CisJd2hpbGUgKChiaXRzICYgbWFzaykgIT0gd2JpdHMgJiYgY291bnRlciAmJiAhcmV0KSB7CisJCXVzbGVlcF9yYW5nZShzbGVlcCwgc2xlZXAgKiAyKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYWljMzF4eC0+cmVnbWFwLCByZWcsICZiaXRzKTsKKwkJY291bnRlci0tOworCX0KKwlpZiAoKGJpdHMgJiBtYXNrKSAhPSB3Yml0cykgeworCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwKKwkJCSIlczogRmFpbGVkISAweCV4IHdhcyAweCV4IGV4cGVjdGVkIDB4JXggKCVkLCAweCV4LCAlZCB1cylcbiIsCisJCQlfX2Z1bmNfXywgcmVnLCBiaXRzLCB3Yml0cywgcmV0LCBtYXNrLAorCQkJKGNvdW50IC0gY291bnRlcikgKiBzbGVlcCk7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFdJREdFVF9CSVQocmVnLCBzaGlmdCkgKCgoc2hpZnQpIDw8IDgpIHwgKHJlZykpCisKK3N0YXRpYyBpbnQgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKHctPmNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gQUlDMzFYWF9EQUNGTEFHMTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCXN3aXRjaCAoV0lER0VUX0JJVCh3LT5yZWcsIHctPnNoaWZ0KSkgeworCWNhc2UgV0lER0VUX0JJVChBSUMzMVhYX0RBQ1NFVFVQLCA3KToKKwkJbWFzayA9IEFJQzMxWFhfTERBQ1BXUlNUQVRVU19NQVNLOworCQlicmVhazsKKwljYXNlIFdJREdFVF9CSVQoQUlDMzFYWF9EQUNTRVRVUCwgNik6CisJCW1hc2sgPSBBSUMzMVhYX1JEQUNQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfSFBEUklWRVIsIDcpOgorCQltYXNrID0gQUlDMzFYWF9IUExEUlZQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfSFBEUklWRVIsIDYpOgorCQltYXNrID0gQUlDMzFYWF9IUFJEUlZQV1JTVEFUVVNfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBXSURHRVRfQklUKEFJQzMxWFhfU1BLQU1QLCA3KToKKwkJbWFzayA9IEFJQzMxWFhfU1BMRFJWUFdSU1RBVFVTX01BU0s7CisJCWJyZWFrOworCWNhc2UgV0lER0VUX0JJVChBSUMzMVhYX1NQS0FNUCwgNik6CisJCW1hc2sgPSBBSUMzMVhYX1NQUkRSVlBXUlNUQVRVU19NQVNLOworCQlicmVhazsKKwljYXNlIFdJREdFVF9CSVQoQUlDMzFYWF9BRENTRVRVUCwgNyk6CisJCW1hc2sgPSBBSUMzMVhYX0FEQ1BXUlNUQVRVU19NQVNLOworCQlyZWcgPSBBSUMzMVhYX0FEQ0ZMQUc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIody0+Y29kZWMtPmRldiwgIlVua25vd24gd2lkZ2V0ICclcycgY2FsbGluZyAlcy9uIiwKKwkJCXctPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlyZXR1cm4gYWljMzF4eF93YWl0X2JpdHMoYWljMzF4eCwgcmVnLCBtYXNrLCBtYXNrLCA1MDAwLCAxMDApOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXR1cm4gYWljMzF4eF93YWl0X2JpdHMoYWljMzF4eCwgcmVnLCBtYXNrLCAwLCA1MDAwLCAxMDApOworCWRlZmF1bHQ6CisJCWRldl9kYmcody0+Y29kZWMtPmRldiwKKwkJCSJVbmhhbmRsZWQgZGFwbSB3aWRnZXQgZXZlbnQgJWQgZnJvbSAlc1xuIiwKKwkJCWV2ZW50LCB3LT5uYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsZWZ0X291dHB1dF9zd2l0Y2hlc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBMZWZ0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFMUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIFJpZ2h0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMSwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcF90ZXJtX21pYzFscCA9CisJU09DX0RBUE1fRU5VTSgiTUlDMUxQIFAtVGVybWluYWwiLCBtaWMxbHBfcF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBfdGVybV9taWMxcnAgPQorCVNPQ19EQVBNX0VOVU0oIk1JQzFSUCBQLVRlcm1pbmFsIiwgbWljMXJwX3BfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwX3Rlcm1fbWljMWxtID0KKwlTT0NfREFQTV9FTlVNKCJNSUMxTE0gUC1UZXJtaW5hbCIsIG1pYzFsbV9wX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbV90ZXJtX21pYzFsbSA9CisJU09DX0RBUE1fRU5VTSgiTUlDMUxNIE0tVGVybWluYWwiLCBtaWMxbG1fbV9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfZGFwbV9ocGxfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFJQzMxWFhfTEFOQUxPR0hQTCwgNywgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMXh4X2RhcG1faHByX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBBSUMzMVhYX1JBTkFMT0dIUFIsIDcsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzF4eF9kYXBtX3NwbF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgQUlDMzFYWF9MQU5BTE9HU1BMLCA3LCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfZGFwbV9zcHJfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIEFJQzMxWFhfUkFOQUxPR1NQUiwgNywgMSwgMCk7CisKK3N0YXRpYyBpbnQgbWljX2JpYXNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyogY2hhbmdlIG1pYyBiaWFzIHZvbHRhZ2UgdG8gdXNlciBkZWZpbmVkICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUlDQklBUywKKwkJCQkgICAgQUlDMzFYWF9NSUNCSUFTX01BU0ssCisJCQkJICAgIGFpYzMxeHgtPnBkYXRhLm1pY2JpYXNfdmcgPDwKKwkJCQkgICAgQUlDMzFYWF9NSUNCSUFTX1NISUZUKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHR1cm5lZCBvblxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQkvKiB0dXJuIG1pYyBiaWFzIG9mZiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01JQ0JJQVMsCisJCQkJICAgIEFJQzMxWFhfTUlDQklBU19NQVNLLCAwKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHR1cm5lZCBvZmZcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWljMzF4eF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJEQUMgSU4iLCAiREFDIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkRBQyBMZWZ0IElucHV0IiwKKwkJCSBTTkRfU09DX05PUE0sIDAsIDAsICZsZGFjX2luX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIkRBQyBSaWdodCBJbnB1dCIsCisJCQkgU05EX1NPQ19OT1BNLCAwLCAwLCAmcmRhY19pbl9jb250cm9sKSwKKwkvKiBEQUNzICovCisJU05EX1NPQ19EQVBNX0RBQ19FKCJEQUMgTGVmdCIsICJMZWZ0IFBsYXliYWNrIiwKKwkJCSAgIEFJQzMxWFhfREFDU0VUVVAsIDcsIDAsIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fREFDX0UoIkRBQyBSaWdodCIsICJSaWdodCBQbGF5YmFjayIsCisJCQkgICBBSUMzMVhYX0RBQ1NFVFVQLCA2LCAwLCBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyogT3V0cHV0IE1peGVycyAqLworCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IExlZnQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBsZWZ0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUobGVmdF9vdXRwdXRfc3dpdGNoZXMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIHJpZ2h0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUocmlnaHRfb3V0cHV0X3N3aXRjaGVzKSksCisKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJIUCBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICZhaWMzMXh4X2RhcG1faHBsX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiSFAgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpYzMxeHhfZGFwbV9ocHJfc3dpdGNoKSwKKworCS8qIE91dHB1dCBkcml2ZXJzICovCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSFBMIERyaXZlciIsIEFJQzMxWFhfSFBEUklWRVIsIDcsIDAsCisJCQkgICAgICAgTlVMTCwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSFBSIERyaXZlciIsIEFJQzMxWFhfSFBEUklWRVIsIDYsIDAsCisJCQkgICAgICAgTlVMTCwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwkvKiBBREMgKi8KKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyIsICJDYXB0dXJlIiwgQUlDMzFYWF9BRENTRVRVUCwgNywgMCwKKwkJCSAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwkvKiBJbnB1dCBTZWxlY3Rpb24gdG8gTUlDX1BHQSAqLworCVNORF9TT0NfREFQTV9NVVgoIk1JQzFMUCBQLVRlcm1pbmFsIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICZwX3Rlcm1fbWljMWxwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJNSUMxUlAgUC1UZXJtaW5hbCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAmcF90ZXJtX21pYzFycCksCisJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIFAtVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJnBfdGVybV9taWMxbG0pLAorCisJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIE0tVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJm1fdGVybV9taWMxbG0pLAorCS8qIEVuYWJsaW5nICYgRGlzYWJsaW5nIE1JQyBHYWluIEN0bCAqLworCVNORF9TT0NfREFQTV9QR0EoIk1JQ19HQUlOX0NUTCIsIEFJQzMxWFhfTUlDUEdBLAorCQkJIDcsIDEsIE5VTEwsIDApLAorCisJLyogTWljIEJpYXMgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBtaWNfYmlhc19ldmVudCwKKwkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwkvKiBPdXRwdXRzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCisKKwkvKiBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFMUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMVJQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxTE0iKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMTF4X2RhcG1fd2lkZ2V0c1tdID0geworCS8qIEFJQzMxMTEgYW5kIEFJQzMxMTAgaGF2ZSBzdGVyZW8gY2xhc3MtRCBhbXBsaWZpZXIgKi8KKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJTUEwgQ2xhc3NEIiwgQUlDMzFYWF9TUEtBTVAsIDcsIDAsIE5VTEwsIDAsCisJCQkgICAgICAgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiU1BSIENsYXNzRCIsIEFJQzMxWFhfU1BLQU1QLCA2LCAwLCBOVUxMLCAwLAorCQkJICAgICAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlNwZWFrZXIgTGVmdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAmYWljMzF4eF9kYXBtX3NwbF9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlNwZWFrZXIgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpYzMxeHhfZGFwbV9zcHJfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUFIiKSwKK307CisKKy8qIEFJQzMxMDAgYW5kIEFJQzMxMjAgaGF2ZSBvbmx5IG1vbm8gY2xhc3MtRCBhbXBsaWZpZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMTB4X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIlNQSyBDbGFzc0QiLCBBSUMzMVhYX1NQS0FNUCwgNywgMCwgTlVMTCwgMCwKKwkJCSAgICAgICBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJTcGVha2VyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICZhaWMzMXh4X2RhcG1fc3BsX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorYWljMzF4eF9hdWRpb19tYXBbXSA9IHsKKwkvKiBEQUMgSW5wdXQgUm91dGluZyAqLworCXsiREFDIExlZnQgSW5wdXQiLCAiTGVmdCBEYXRhIiwgIkRBQyBJTiJ9LAorCXsiREFDIExlZnQgSW5wdXQiLCAiUmlnaHQgRGF0YSIsICJEQUMgSU4ifSwKKwl7IkRBQyBMZWZ0IElucHV0IiwgIk1vbm8iLCAiREFDIElOIn0sCisJeyJEQUMgUmlnaHQgSW5wdXQiLCAiTGVmdCBEYXRhIiwgIkRBQyBJTiJ9LAorCXsiREFDIFJpZ2h0IElucHV0IiwgIlJpZ2h0IERhdGEiLCAiREFDIElOIn0sCisJeyJEQUMgUmlnaHQgSW5wdXQiLCAiTW9ubyIsICJEQUMgSU4ifSwKKwl7IkRBQyBMZWZ0IiwgTlVMTCwgIkRBQyBMZWZ0IElucHV0In0sCisJeyJEQUMgUmlnaHQiLCBOVUxMLCAiREFDIFJpZ2h0IElucHV0In0sCisKKwkvKiBNaWMgaW5wdXQgKi8KKwl7Ik1JQzFMUCBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMUxQIn0sCisJeyJNSUMxTFAgUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFMUCJ9LAorCXsiTUlDMUxQIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxTFAifSwKKwl7Ik1JQzFSUCBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMVJQIn0sCisJeyJNSUMxUlAgUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFSUCJ9LAorCXsiTUlDMVJQIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxUlAifSwKKwl7Ik1JQzFMTSBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMUxNIn0sCisJeyJNSUMxTE0gUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFMTSJ9LAorCXsiTUlDMUxNIFAtVGVybWluYWwiLCAiRkZSIDQwIE9obSIsICJNSUMxTE0ifSwKKworCXsiTUlDMUxNIE0tVGVybWluYWwiLCAiRkZSIDEwIE9obSIsICJNSUMxTE0ifSwKKwl7Ik1JQzFMTSBNLVRlcm1pbmFsIiwgIkZGUiAyMCBPaG0iLCAiTUlDMUxNIn0sCisJeyJNSUMxTE0gTS1UZXJtaW5hbCIsICJGRlIgNDAgT2htIiwgIk1JQzFMTSJ9LAorCisJeyJNSUNfR0FJTl9DVEwiLCBOVUxMLCAiTUlDMUxQIFAtVGVybWluYWwifSwKKwl7Ik1JQ19HQUlOX0NUTCIsIE5VTEwsICJNSUMxUlAgUC1UZXJtaW5hbCJ9LAorCXsiTUlDX0dBSU5fQ1RMIiwgTlVMTCwgIk1JQzFMTSBQLVRlcm1pbmFsIn0sCisJeyJNSUNfR0FJTl9DVEwiLCBOVUxMLCAiTUlDMUxNIE0tVGVybWluYWwifSwKKworCXsiQURDIiwgTlVMTCwgIk1JQ19HQUlOX0NUTCJ9LAorCisJLyogTGVmdCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gTGVmdCBEQUMiLCAiREFDIExlZnQifSwKKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gTUlDMUxQIiwgIk1JQzFMUCJ9LAorCXsiT3V0cHV0IExlZnQiLCAiRnJvbSBNSUMxUlAiLCAiTUlDMVJQIn0sCisKKwkvKiBSaWdodCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIFJpZ2h0IERBQyIsICJEQUMgUmlnaHQifSwKKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIE1JQzFSUCIsICJNSUMxUlAifSwKKworCS8qIEhQTCBwYXRoICovCisJeyJIUCBMZWZ0IiwgIlN3aXRjaCIsICJPdXRwdXQgTGVmdCJ9LAorCXsiSFBMIERyaXZlciIsIE5VTEwsICJIUCBMZWZ0In0sCisJeyJIUEwiLCBOVUxMLCAiSFBMIERyaXZlciJ9LAorCisJLyogSFBSIHBhdGggKi8KKwl7IkhQIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKKwl7IkhQUiBEcml2ZXIiLCBOVUxMLCAiSFAgUmlnaHQifSwKKwl7IkhQUiIsIE5VTEwsICJIUFIgRHJpdmVyIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorYWljMzExeF9hdWRpb19tYXBbXSA9IHsKKwkvKiBTUCBMIHBhdGggKi8KKwl7IlNwZWFrZXIgTGVmdCIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKKwl7IlNQTCBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciBMZWZ0In0sCisJeyJTUEwiLCBOVUxMLCAiU1BMIENsYXNzRCJ9LAorCisJLyogU1AgUiBwYXRoICovCisJeyJTcGVha2VyIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKKwl7IlNQUiBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciBSaWdodCJ9LAorCXsiU1BSIiwgTlVMTCwgIlNQUiBDbGFzc0QifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlCithaWMzMTB4X2F1ZGlvX21hcFtdID0geworCS8qIFNQIEwgcGF0aCAqLworCXsiU3BlYWtlciIsICJTd2l0Y2giLCAiT3V0cHV0IExlZnQifSwKKwl7IlNQSyBDbGFzc0QiLCBOVUxMLCAiU3BlYWtlciJ9LAorCXsiU1BLIiwgTlVMTCwgIlNQSyBDbGFzc0QifSwKK307CisKK3N0YXRpYyBpbnQgYWljMzF4eF9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQpCisJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKAorCQkJY29kZWMsIGFpYzMxMXhfc25kX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShhaWMzMTF4X3NuZF9jb250cm9scykpOworCWVsc2UKKwkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoCisJCQljb2RlYywgYWljMzEweF9zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGFpYzMxMHhfc25kX2NvbnRyb2xzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoCisJCQlkYXBtLCBhaWMzMTF4X2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoYWljMzExeF9kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYWljMzExeF9hdWRpb19tYXAsCisJCQkJCSAgICAgIEFSUkFZX1NJWkUoYWljMzExeF9hdWRpb19tYXApKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygKKwkJCWRhcG0sIGFpYzMxMHhfZGFwbV93aWRnZXRzLAorCQkJQVJSQVlfU0laRShhaWMzMTB4X2RhcG1fd2lkZ2V0cykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhaWMzMTB4X2F1ZGlvX21hcCwKKwkJCQkJICAgICAgQVJSQVlfU0laRShhaWMzMTB4X2F1ZGlvX21hcCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3NldHVwX3BsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgYmNsa19uID0gMDsKKwlpbnQgaTsKKworCS8qIFVzZSBQTEwgYXMgQ09ERUNfQ0xLSU4gYW5kIERBQ19DTEsgYXMgQkRJVl9DTEtJTiAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfQ0xLTVVYLAorCQkJICAgIEFJQzMxWFhfQ09ERUNfQ0xLSU5fTUFTSywgQUlDMzFYWF9DT0RFQ19DTEtJTl9QTEwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfSUZBQ0UyLAorCQkJICAgIEFJQzMxWFhfQkRJVkNMS19NQVNLLCBBSUMzMVhYX0RBQzJCQ0xLKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzMxeHhfZGl2cyk7IGkrKykgeworCQlpZiAoYWljMzF4eF9kaXZzW2ldLnJhdGUgPT0gcGFyYW1zX3JhdGUocGFyYW1zKSAmJgorCQkgICAgYWljMzF4eF9kaXZzW2ldLm1jbGsgPT0gYWljMzF4eC0+c3lzY2xrKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShhaWMzMXh4X2RpdnMpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBTYW1wbGluZyByYXRlICV1IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBMTCBjb25maWd1cmF0aW9uICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9QTExQUiwgQUlDMzFYWF9QTExfTUFTSywKKwkJCSAgICAoYWljMzF4eF9kaXZzW2ldLnBfdmFsIDw8IDQpIHwgMHgwMSk7CisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExKLCBhaWMzMXh4X2RpdnNbaV0ucGxsX2opOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExETVNCLAorCQkgICAgICBhaWMzMXh4X2RpdnNbaV0ucGxsX2QgPj4gOCk7CisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9QTExETFNCLAorCQkgICAgICBhaWMzMXh4X2RpdnNbaV0ucGxsX2QgJiAweGZmKTsKKworCS8qIERBQyBkaXZpZGVycyBjb25maWd1cmF0aW9uICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9OREFDLCBBSUMzMVhYX1BMTF9NQVNLLAorCQkJICAgIGFpYzMxeHhfZGl2c1tpXS5uZGFjKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01EQUMsIEFJQzMxWFhfUExMX01BU0ssCisJCQkgICAgYWljMzF4eF9kaXZzW2ldLm1kYWMpOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzFYWF9ET1NSTVNCLCBhaWMzMXh4X2RpdnNbaV0uZG9zciA+PiA4KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMVhYX0RPU1JMU0IsIGFpYzMxeHhfZGl2c1tpXS5kb3NyICYgMHhmZik7CisKKwkvKiBBREMgZGl2aWRlcnMgY29uZmlndXJhdGlvbi4gV3JpdGUgcmVzZXQgdmFsdWUgMSBpZiBub3QgdXNlZC4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX05BREMsIEFJQzMxWFhfUExMX01BU0ssCisJCQkgICAgYWljMzF4eF9kaXZzW2ldLm5hZGMgPyBhaWMzMXh4X2RpdnNbaV0ubmFkYyA6IDEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUFEQywgQUlDMzFYWF9QTExfTUFTSywKKwkJCSAgICBhaWMzMXh4X2RpdnNbaV0ubWFkYyA/IGFpYzMxeHhfZGl2c1tpXS5tYWRjIDogMSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMVhYX0FPU1IsIGFpYzMxeHhfZGl2c1tpXS5hb3NyKTsKKworCS8qIEJpdCBjbG9jayBkaXZpZGVyIGNvbmZpZ3VyYXRpb24uICovCisJYmNsa19uID0gKGFpYzMxeHhfZGl2c1tpXS5kb3NyICogYWljMzF4eF9kaXZzW2ldLm1kYWMpCisJCS8gc25kX3NvY19wYXJhbXNfdG9fZnJhbWVfc2l6ZShwYXJhbXMpOworCWlmIChiY2xrX24gPT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogTm90IGVub3VnaCBCTENLIGJhbmR3aWR0aFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9CQ0xLTiwKKwkJCSAgICBBSUMzMVhYX1BMTF9NQVNLLCBiY2xrX24pOworCisJYWljMzF4eC0+cmF0ZV9kaXZfbGluZSA9IGk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSJwbGwgJWQuJTA0ZC8lZCBkb3NyICVkIG4gJWQgbSAlZCBhb3NyICVkIG4gJWQgbSAlZCBiY2xrX24gJWRcbiIsCisJCWFpYzMxeHhfZGl2c1tpXS5wbGxfaiwgYWljMzF4eF9kaXZzW2ldLnBsbF9kLAorCQlhaWMzMXh4X2RpdnNbaV0ucF92YWwsIGFpYzMxeHhfZGl2c1tpXS5kb3NyLAorCQlhaWMzMXh4X2RpdnNbaV0ubmRhYywgYWljMzF4eF9kaXZzW2ldLm1kYWMsCisJCWFpYzMxeHhfZGl2c1tpXS5hb3NyLCBhaWMzMXh4X2RpdnNbaV0ubmFkYywKKwkJYWljMzF4eF9kaXZzW2ldLm1hZGMsIGJjbGtfbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJdTggZGF0YSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIjIyAlczogZm9ybWF0ICVkIHdpZHRoICVkIHJhdGUgJWRcbiIsCisJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcyksIHBhcmFtc193aWR0aChwYXJhbXMpLAorCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwljYXNlIDE2OgorCQlicmVhazsKKwljYXNlIDIwOgorCQlkYXRhID0gKEFJQzMxWFhfV09SRF9MRU5fMjBCSVRTIDw8CisJCQlBSUMzMVhYX0lGQUNFMV9EQVRBTEVOX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJZGF0YSA9IChBSUMzMVhYX1dPUkRfTEVOXzI0QklUUyA8PAorCQkJQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9TSElGVCk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWRhdGEgPSAoQUlDMzFYWF9XT1JEX0xFTl8zMkJJVFMgPDwKKwkJCUFJQzMxWFhfSUZBQ0UxX0RBVEFMRU5fU0hJRlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVW5zdXBwb3J0ZWQgZm9ybWF0ICVkXG4iLAorCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfSUZBQ0UxLAorCQkJICAgIEFJQzMxWFhfSUZBQ0UxX0RBVEFMRU5fTUFTSywKKwkJCSAgICBkYXRhKTsKKworCXJldHVybiBhaWMzMXh4X3NldHVwX3BsbChjb2RlYywgcGFyYW1zKTsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2RhY19tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCisJaWYgKG11dGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9EQUNNVVRFLAorCQkJCSAgICBBSUMzMVhYX0RBQ01VVEVfTUFTSywKKwkJCQkgICAgQUlDMzFYWF9EQUNNVVRFX01BU0spOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfREFDTVVURSwKKwkJCQkgICAgQUlDMzFYWF9EQUNNVVRFX01BU0ssIDB4MCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTggaWZhY2VfcmVnMSA9IDA7CisJdTggaWZhY2VfcmVnMyA9IDA7CisJdTggZHNwX2FfdmFsID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiBmbXQgPSAweCV4XG4iLCBfX2Z1bmNfXywgZm10KTsKKworCS8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJaWZhY2VfcmVnMSB8PSBBSUMzMVhYX0JDTEtfTUFTVEVSIHwgQUlDMzFYWF9XQ0xLX01BU1RFUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2FsZXJ0KGNvZGVjLT5kZXYsICJJbnZhbGlkIERBSSBtYXN0ZXIvc2xhdmUgaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW50ZXJmYWNlIGZvcm1hdCAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJZHNwX2FfdmFsID0gMHgxOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCS8qIE5PVEU6IEJDTEtJTlYgYml0IHZhbHVlIDEgZXF1YXMgTkIgYW5kIDAgZXF1YWxzIElCICovCisJCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJCWlmYWNlX3JlZzMgfD0gQUlDMzFYWF9CQ0xLSU5WX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWZhY2VfcmVnMSB8PSAoQUlDMzFYWF9EU1BfTU9ERSA8PAorCQkJICAgICAgIEFJQzMxWFhfSUZBQ0UxX0RBVEFUWVBFX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlpZmFjZV9yZWcxIHw9IChBSUMzMVhYX1JJR0hUX0pVU1RJRklFRF9NT0RFIDw8CisJCQkgICAgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfU0hJRlQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaWZhY2VfcmVnMSB8PSAoQUlDMzFYWF9MRUZUX0pVU1RJRklFRF9NT0RFIDw8CisJCQkgICAgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfU0hJRlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIERBSSBpbnRlcmZhY2UgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9JRkFDRTEsCisJCQkgICAgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfTUFTSyB8CisJCQkgICAgQUlDMzFYWF9JRkFDRTFfTUFTVEVSX01BU0ssCisJCQkgICAgaWZhY2VfcmVnMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9EQVRBX09GRlNFVCwKKwkJCSAgICBBSUMzMVhYX0RBVEFfT0ZGU0VUX01BU0ssCisJCQkgICAgZHNwX2FfdmFsKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0lGQUNFMiwKKwkJCSAgICBBSUMzMVhYX0JDTEtJTlZfTUFTSywKKwkJCSAgICBpZmFjZV9yZWczKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJICBpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiBjbGtfaWQgPSAlZCwgZnJlcSA9ICVkLCBkaXIgPSAlZFxuIiwKKwkJX19mdW5jX18sIGNsa19pZCwgZnJlcSwgZGlyKTsKKworCWZvciAoaSA9IDA7IGFpYzMxeHhfZGl2c1tpXS5tY2xrICE9IGZyZXE7IGkrKykgeworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKGFpYzMxeHhfZGl2cykpIHsKKwkJCWRldl9lcnIoYWljMzF4eC0+ZGV2LCAiJXM6IFVuc3VwcG9ydGVkIGZyZXF1ZW5jeSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZnJlcSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIHNldCBjbG9jayBvbiBNQ0xLLCBCQ0xLLCBvciBHUElPMSBhcyBQTEwgaW5wdXQgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0NMS01VWCwgQUlDMzFYWF9QTExfQ0xLSU5fTUFTSywKKwkJCSAgICBjbGtfaWQgPDwgQUlDMzFYWF9QTExfQ0xLSU5fU0hJRlQpOworCisJYWljMzF4eC0+c3lzY2xrID0gZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3JlZ3VsYXRvcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFpYzMxeHhfZGlzYWJsZV9uYiAqZGlzYWJsZV9uYiA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGFpYzMxeHhfZGlzYWJsZV9uYiwgbmIpOworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBkaXNhYmxlX25iLT5haWMzMXh4OworCisJaWYgKGV2ZW50ICYgUkVHVUxBVE9SX0VWRU5UX0RJU0FCTEUpIHsKKwkJLyoKKwkJICogUHV0IGNvZGVjIHRvIHJlc2V0IGFuZCBhcyBhdCBsZWFzdCBvbmUgb2YgdGhlCisJCSAqIHN1cHBsaWVzIHdhcyBkaXNhYmxlZC4KKwkJICovCisJCWlmIChncGlvX2lzX3ZhbGlkKGFpYzMxeHgtPnBkYXRhLmdwaW9fcmVzZXQpKQorCQkJZ3Bpb19zZXRfdmFsdWUoYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCwgMCk7CisKKwkJcmVnY2FjaGVfbWFya19kaXJ0eShhaWMzMXh4LT5yZWdtYXApOworCQlkZXZfZGJnKGFpYzMxeHgtPmRldiwgIiMjICVzOiBESVNBQkxFIHJlY2VpdmVkXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpYzMxeHhfY2xrX29uKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTggbWFzayA9IEFJQzMxWFhfUE1fTUFTSzsKKwl1OCBvbiA9IEFJQzMxWFhfUE1fTUFTSzsKKworCWRldl9kYmcoY29kZWMtPmRldiwgImNvZGVjIGNsb2NrIC0+IG9uIChyYXRlICVkKVxuIiwKKwkJYWljMzF4eF9kaXZzW2FpYzMxeHgtPnJhdGVfZGl2X2xpbmVdLnJhdGUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfUExMUFIsIG1hc2ssIG9uKTsKKwltZGVsYXkoMTApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTkRBQywgbWFzaywgb24pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTURBQywgbWFzaywgb24pOworCWlmIChhaWMzMXh4X2RpdnNbYWljMzF4eC0+cmF0ZV9kaXZfbGluZV0ubmFkYykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9OQURDLCBtYXNrLCBvbik7CisJaWYgKGFpYzMxeHhfZGl2c1thaWMzMXh4LT5yYXRlX2Rpdl9saW5lXS5tYWRjKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX01BREMsIG1hc2ssIG9uKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0JDTEtOLCBtYXNrLCBvbik7Cit9CisKK3N0YXRpYyB2b2lkIGFpYzMxeHhfY2xrX29mZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTggbWFzayA9IEFJQzMxWFhfUE1fTUFTSzsKKwl1OCBvZmYgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiY29kZWMgY2xvY2sgLT4gb2ZmXG4iKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX0JDTEtOLCBtYXNrLCBvZmYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTUFEQywgbWFzaywgb2ZmKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX05BREMsIG1hc2ssIG9mZik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzFYWF9NREFDLCBtYXNrLCBvZmYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMxWFhfTkRBQywgbWFzaywgb2ZmKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMVhYX1BMTFBSLCBtYXNrLCBvZmYpOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfcG93ZXJfb24oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKSwKKwkJCQkgICAgYWljMzF4eC0+c3VwcGxpZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZ3Bpb19pc192YWxpZChhaWMzMXh4LT5wZGF0YS5ncGlvX3Jlc2V0KSkgeworCQlncGlvX3NldF92YWx1ZShhaWMzMXh4LT5wZGF0YS5ncGlvX3Jlc2V0LCAxKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWljMzF4eC0+cmVnbWFwLCBmYWxzZSk7CisJcmV0ID0gcmVnY2FjaGVfc3luYyhhaWMzMXh4LT5yZWdtYXApOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiRmFpbGVkIHRvIHJlc3RvcmUgY2FjaGU6ICVkXG4iLCByZXQpOworCQlyZWdjYWNoZV9jYWNoZV9vbmx5KGFpYzMxeHgtPnJlZ21hcCwgdHJ1ZSk7CisJCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhaWMzMXh4LT5zdXBwbGllcyksCisJCQkJICAgICAgIGFpYzMxeHgtPnN1cHBsaWVzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9wb3dlcl9vZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0ID0gMDsKKworCXJlZ2NhY2hlX2NhY2hlX29ubHkoYWljMzF4eC0+cmVnbWFwLCB0cnVlKTsKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoYWljMzF4eC0+c3VwcGxpZXMpLAorCQkJCSAgICAgYWljMzF4eC0+c3VwcGxpZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCWRldl9kYmcoY29kZWMtPmRldiwgIiMjICVzOiAlZCAtPiAlZFxuIiwgX19mdW5jX18sCisJCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwsIGxldmVsKTsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpCisJCQlhaWMzMXh4X2Nsa19vbihjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXN3aXRjaCAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCkgeworCQljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCQlhaWMzMXh4X3Bvd2VyX29uKGNvZGVjKTsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkJYWljMzF4eF9jbGtfb2ZmKGNvZGVjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCWFpYzMxeHhfcG93ZXJfb2ZmKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJYWljMzF4eF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMzF4eF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWFpYzMxeHhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMzMXh4X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGk7CisKKwlkZXZfZGJnKGFpYzMxeHgtPmRldiwgIiMjICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlhaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlhaWMzMXh4LT5jb2RlYyA9IGNvZGVjOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljMzF4eC0+c3VwcGxpZXMpOyBpKyspIHsKKwkJYWljMzF4eC0+ZGlzYWJsZV9uYltpXS5uYi5ub3RpZmllcl9jYWxsID0KKwkJCWFpYzMxeHhfcmVndWxhdG9yX2V2ZW50OworCQlhaWMzMXh4LT5kaXNhYmxlX25iW2ldLmFpYzMxeHggPSBhaWMzMXh4OworCQlyZXQgPSByZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoYWljMzF4eC0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCisJCQkJCQkgICZhaWMzMXh4LT5kaXNhYmxlX25iW2ldLm5iKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCByZWd1bGF0b3Igbm90aWZpZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmVnY2FjaGVfY2FjaGVfb25seShhaWMzMXh4LT5yZWdtYXAsIHRydWUpOworCXJlZ2NhY2hlX21hcmtfZGlydHkoYWljMzF4eC0+cmVnbWFwKTsKKworCXJldCA9IGFpYzMxeHhfYWRkX2NvbnRyb2xzKGNvZGVjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWljMzF4eF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGk7CisJLyogcG93ZXIgZG93biBjaGlwICovCisJYWljMzF4eF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaWMzMXh4LT5zdXBwbGllcyk7IGkrKykKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIoYWljMzF4eC0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCisJCQkJCSAgICAgICZhaWMzMXh4LT5kaXNhYmxlX25iW2ldLm5iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kcml2ZXJfYWljMzF4eCA9IHsKKwkucHJvYmUJCQk9IGFpYzMxeHhfY29kZWNfcHJvYmUsCisJLnJlbW92ZQkJCT0gYWljMzF4eF9jb2RlY19yZW1vdmUsCisJLnN1c3BlbmQJCT0gYWljMzF4eF9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGFpYzMxeHhfcmVzdW1lLAorCS5zZXRfYmlhc19sZXZlbAkJPSBhaWMzMXh4X3NldF9iaWFzX2xldmVsLAorCS5jb250cm9scwkJPSBhaWMzMXh4X3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWljMzF4eF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMJCT0gYWljMzF4eF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFpYzMxeHhfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJCT0gYWljMzF4eF9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWljMzF4eF9hdWRpb19tYXApLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWljMzF4eF9kYWlfb3BzID0geworCS5od19wYXJhbXMJPSBhaWMzMXh4X2h3X3BhcmFtcywKKwkuc2V0X3N5c2Nsawk9IGFpYzMxeHhfc2V0X2RhaV9zeXNjbGssCisJLnNldF9mbXQJPSBhaWMzMXh4X3NldF9kYWlfZm10LAorCS5kaWdpdGFsX211dGUJPSBhaWMzMXh4X2RhY19tdXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWljMzF4eF9kYWlfZHJpdmVyW10gPSB7CisJeworCQkubmFtZSA9ICJ0bHYzMjBhaWMzMXh4LWhpZmkiLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUJID0gIlBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4JID0gMSwKKwkJCS5jaGFubmVsc19tYXgJID0gMiwKKwkJCS5yYXRlcwkJID0gQUlDMzFYWF9SQVRFUywKKwkJCS5mb3JtYXRzCSA9IEFJQzMxWFhfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUJID0gIkNhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbgkgPSAxLAorCQkJLmNoYW5uZWxzX21heAkgPSAyLAorCQkJLnJhdGVzCQkgPSBBSUMzMVhYX1JBVEVTLAorCQkJLmZvcm1hdHMJID0gQUlDMzFYWF9GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJmFpYzMxeHhfZGFpX29wcywKKwkJLnN5bW1ldHJpY19yYXRlcyA9IDEsCisJfQorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX09GKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGx2MzIwYWljMzF4eF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzEweCIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMxMXgiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMTAwIiB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksdGx2MzIwYWljMzExMCIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMxMjAiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx0bHYzMjBhaWMzMTExIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRsdjMyMGFpYzMxeHhfb2ZfbWF0Y2gpOworCitzdGF0aWMgdm9pZCBhaWMzMXh4X3BkYXRhX2Zyb21fb2Yoc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWljMzF4eC0+ZGV2LT5vZl9ub2RlOworCXVuc2lnbmVkIGludCB2YWx1ZSA9IE1JQ0JJQVNfMl8wVjsKKwlpbnQgcmV0OworCisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhaTMxeHgtbWljYmlhcy12ZyIsICZ2YWx1ZSk7CisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgTUlDQklBU18yXzBWOgorCWNhc2UgTUlDQklBU18yXzVWOgorCWNhc2UgTUlDQklBU19BVkREVjoKKwkJYWljMzF4eC0+cGRhdGEubWljYmlhc192ZyA9IHZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwKKwkJCSJCYWQgYWkzMXh4LW1pY2JpYXMtdmcgdmFsdWUgJWQgRFRcbiIsCisJCQl2YWx1ZSk7CisJCWFpYzMxeHgtPnBkYXRhLm1pY2JpYXNfdmcgPSBNSUNCSUFTXzJfMFY7CisJfQorCisJcmV0ID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJncGlvLXJlc2V0IiwgMCk7CisJaWYgKHJldCA+IDApCisJCWFpYzMxeHgtPnBkYXRhLmdwaW9fcmVzZXQgPSByZXQ7Cit9CisjZWxzZSAvKiBDT05GSUdfT0YgKi8KK3N0YXRpYyB2b2lkIGFpYzMxeHhfcGRhdGFfZnJvbV9vZihzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4KQoreworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgdm9pZCBhaWMzMXh4X2RldmljZV9pbml0KHN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHgpCit7CisJaW50IHJldCwgaTsKKworCWRldl9zZXRfZHJ2ZGF0YShhaWMzMXh4LT5kZXYsIGFpYzMxeHgpOworCisJaWYgKGRldl9nZXRfcGxhdGRhdGEoYWljMzF4eC0+ZGV2KSkKKwkJbWVtY3B5KCZhaWMzMXh4LT5wZGF0YSwgZGV2X2dldF9wbGF0ZGF0YShhaWMzMXh4LT5kZXYpLAorCQkgICAgICAgc2l6ZW9mKGFpYzMxeHgtPnBkYXRhKSk7CisJZWxzZSBpZiAoYWljMzF4eC0+ZGV2LT5vZl9ub2RlKQorCQlhaWMzMXh4X3BkYXRhX2Zyb21fb2YoYWljMzF4eCk7CisKKwlpZiAoYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCkgeworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoYWljMzF4eC0+ZGV2LAorCQkJCQkgICAgYWljMzF4eC0+cGRhdGEuZ3Bpb19yZXNldCwKKwkJCQkJICAgIEdQSU9GX09VVF9JTklUX0hJR0gsCisJCQkJCSAgICAiYWljMzF4eC1yZXNldC1waW4iKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoYWljMzF4eC0+ZGV2LCAibm90IGFibGUgdG8gYWNxdWlyZSBncGlvXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKTsgaSsrKQorCQlhaWMzMXh4LT5zdXBwbGllc1tpXS5zdXBwbHkgPSBhaWMzMXh4X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGFpYzMxeHgtPmRldiwKKwkJCQkgICAgICBBUlJBWV9TSVpFKGFpYzMxeHgtPnN1cHBsaWVzKSwKKwkJCQkgICAgICBhaWMzMXh4LT5zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGFpYzMxeHgtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4OworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcF9jb25maWc7CisKKwlkZXZfZGJnKCZpMmMtPmRldiwgIiMjICVzOiAlcyBjb2RlY190eXBlID0gJWRcbiIsIF9fZnVuY19fLAorCQlpZC0+bmFtZSwgKGludCkgaWQtPmRyaXZlcl9kYXRhKTsKKworCXJlZ21hcF9jb25maWcgPSAmYWljMzF4eF9pMmNfcmVnbWFwOworCisJYWljMzF4eCA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZigqYWljMzF4eCksIEdGUF9LRVJORUwpOworCWlmIChhaWMzMXh4ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWljMzF4eC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCByZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGFpYzMxeHgtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihhaWMzMXh4LT5yZWdtYXApOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYWljMzF4eC0+ZGV2ID0gJmkyYy0+ZGV2OworCisJYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKKworCWFpYzMxeHhfZGV2aWNlX2luaXQoYWljMzF4eCk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZHJpdmVyX2FpYzMxeHgsCisJCQkJICAgICBhaWMzMXh4X2RhaV9kcml2ZXIsCisJCQkJICAgICBBUlJBWV9TSVpFKGFpYzMxeHhfZGFpX2RyaXZlcikpOworfQorCitzdGF0aWMgaW50IGFpYzMxeHhfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWljMzF4eF9pMmNfaWRbXSA9IHsKKwl7ICJ0bHYzMjBhaWMzMTB4IiwgQUlDMzEwMCB9LAorCXsgInRsdjMyMGFpYzMxMXgiLCBBSUMzMTEwIH0sCisJeyAidGx2MzIwYWljMzEwMCIsIEFJQzMxMDAgfSwKKwl7ICJ0bHYzMjBhaWMzMTEwIiwgQUlDMzExMCB9LAorCXsgInRsdjMyMGFpYzMxMjAiLCBBSUMzMTIwIH0sCisJeyAidGx2MzIwYWljMzExMSIsIEFJQzMxMTEgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWljMzF4eF9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWljMzF4eF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInRsdjMyMGFpYzMxeHgtY29kZWMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRsdjMyMGFpYzMxeHhfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlCQk9IGFpYzMxeHhfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gYWljMzF4eF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGFpYzMxeHhfaTJjX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoYWljMzF4eF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFRMVjMyMEFJQzMxMTEgY29kZWMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKeXJpIFNhcmhhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaCBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZWQ1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIEFMU0EgU29DIFRMVjMyMEFJQzMxWFggY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworI2lmbmRlZiBfVExWMzIwQUlDMzFYWF9ICisjZGVmaW5lIF9UTFYzMjBBSUMzMVhYX0gKKworI2RlZmluZSBBSUMzMVhYX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisKKyNkZWZpbmUgQUlDMzFYWF9GT1JNQVRTCShTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSBcCisJCQkgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworCisjZGVmaW5lIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUCTB4MQorI2RlZmluZSBBSUMzMVhYX01JTklEU1BfQklUCQkweDIKKworZW51bSBhaWMzMXh4X3R5cGUgeworCUFJQzMxMDAJPSAwLAorCUFJQzMxMTAgPSBBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVCwKKwlBSUMzMTIwID0gQUlDMzFYWF9NSU5JRFNQX0JJVCwKKwlBSUMzMTExID0gKEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUIHwgQUlDMzFYWF9NSU5JRFNQX0JJVCksCit9OworCitzdHJ1Y3QgYWljMzF4eF9wZGF0YSB7CisJZW51bSBhaWMzMXh4X3R5cGUgY29kZWNfdHlwZTsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19yZXNldDsKKwlpbnQgbWljYmlhc192ZzsKK307CisKKy8qIFBhZ2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BBR0VDVEwJCQkJMHgwMAorCisvKiBQYWdlIDAgUmVnaXN0ZXJzICovCisvKiBTb2Z0d2FyZSByZXNldCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1JFU0VUCQkJCTB4MDEKKy8qIE9UIEZMQUcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUlDMzFYWF9PVF9GTEFHCQkJCTB4MDMKKy8qIENsb2NrIGNsb2NrIEdlbiBtdXhpbmcsIE11bHRpcGxleGVycyovCisjZGVmaW5lIEFJQzMxWFhfQ0xLTVVYCQkJCTB4MDQKKy8qIFBMTCBQIGFuZCBSLVZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTFBSCQkJCTB4MDUKKy8qIFBMTCBKLVZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTEoJCQkJMHgwNgorLyogUExMIEQtVkFMIE1TQiByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTERNU0IJCQkJMHgwNworLyogUExMIEQtVkFMIExTQiByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX1BMTERMU0IJCQkJMHgwOAorLyogREFDIE5EQUNfVkFMIHJlZ2lzdGVyKi8KKyNkZWZpbmUgQUlDMzFYWF9OREFDCQkJCTB4MEIKKy8qIERBQyBNREFDX1ZBTCByZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX01EQUMJCQkJMHgwQworLyogREFDIE9TUiBzZXR0aW5nIHJlZ2lzdGVyIDEsIE1TQiB2YWx1ZSAqLworI2RlZmluZSBBSUMzMVhYX0RPU1JNU0IJCQkJMHgwRAorLyogREFDIE9TUiBzZXR0aW5nIHJlZ2lzdGVyIDIsIExTQiB2YWx1ZSAqLworI2RlZmluZSBBSUMzMVhYX0RPU1JMU0IJCQkJMHgwRQorI2RlZmluZSBBSUMzMVhYX01JTklfRFNQX0lOUE9MCQkJMHgxMAorLyogQ2xvY2sgc2V0dGluZyByZWdpc3RlciA4LCBQTEwgKi8KKyNkZWZpbmUgQUlDMzFYWF9OQURDCQkJCTB4MTIKKy8qIENsb2NrIHNldHRpbmcgcmVnaXN0ZXIgOSwgUExMICovCisjZGVmaW5lIEFJQzMxWFhfTUFEQwkJCQkweDEzCisvKiBBREMgT3ZlcnNhbXBsaW5nIChBT1NSKSBSZWdpc3RlciAqLworI2RlZmluZSBBSUMzMVhYX0FPU1IJCQkJMHgxNAorLyogQ2xvY2sgc2V0dGluZyByZWdpc3RlciA5LCBNdWx0aXBsZXhlcnMgKi8KKyNkZWZpbmUgQUlDMzFYWF9DTEtPVVRNVVgJCQkweDE5CisvKiBDbG9jayBzZXR0aW5nIHJlZ2lzdGVyIDEwLCBDTE9DS09VVCBNIGRpdmlkZXIgdmFsdWUgKi8KKyNkZWZpbmUgQUlDMzFYWF9DTEtPVVRNVkFMCQkJMHgxQQorLyogQXVkaW8gSW50ZXJmYWNlIFNldHRpbmcgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBBSUMzMVhYX0lGQUNFMQkJCQkweDFCCisvKiBBdWRpbyBEYXRhIFNsb3QgT2Zmc2V0IFByb2dyYW1taW5nICovCisjZGVmaW5lIEFJQzMxWFhfREFUQV9PRkZTRVQJCQkweDFDCisvKiBBdWRpbyBJbnRlcmZhY2UgU2V0dGluZyBSZWdpc3RlciAyICovCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UyCQkJCTB4MUQKKy8qIENsb2NrIHNldHRpbmcgcmVnaXN0ZXIgMTEsIEJDTEsgTiBEaXZpZGVyICovCisjZGVmaW5lIEFJQzMxWFhfQkNMS04JCQkJMHgxRQorLyogQXVkaW8gSW50ZXJmYWNlIFNldHRpbmcgUmVnaXN0ZXIgMywgU2Vjb25kYXJ5IEF1ZGlvIEludGVyZmFjZSAqLworI2RlZmluZSBBSUMzMVhYX0lGQUNFU0VDMQkJCTB4MUYKKy8qIEF1ZGlvIEludGVyZmFjZSBTZXR0aW5nIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgQUlDMzFYWF9JRkFDRVNFQzIJCQkweDIwCisvKiBBdWRpbyBJbnRlcmZhY2UgU2V0dGluZyBSZWdpc3RlciA1ICovCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0VTRUMzCQkJMHgyMQorLyogSTJDIEJ1cyBDb25kaXRpb24gKi8KKyNkZWZpbmUgQUlDMzFYWF9JMkMJCQkJMHgyMgorLyogQURDIEZMQUcgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENGTEFHCQkJCTB4MjQKKy8qIERBQyBGbGFnIFJlZ2lzdGVycyAqLworI2RlZmluZSBBSUMzMVhYX0RBQ0ZMQUcxCQkJMHgyNQorI2RlZmluZSBBSUMzMVhYX0RBQ0ZMQUcyCQkJMHgyNgorLyogU3RpY2t5IEludGVycnVwdCBmbGFnIChvdmVyZmxvdykgKi8KKyNkZWZpbmUgQUlDMzFYWF9PRkZMQUcJCQkJMHgyNworLyogU3RpY3kgREFDIEludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBBSUMzMVhYX0lOVFJEQUNGTEFHCQkJMHgyQworLyogU3RpY3kgQURDIEludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBBSUMzMVhYX0lOVFJBRENGTEFHCQkJMHgyRAorLyogREFDIEludGVycnVwdCBmbGFncyAyICovCisjZGVmaW5lIEFJQzMxWFhfSU5UUkRBQ0ZMQUcyCQkJMHgyRQorLyogQURDIEludGVycnVwdCBmbGFncyAyICovCisjZGVmaW5lIEFJQzMxWFhfSU5UUkFEQ0ZMQUcyCQkJMHgyRgorLyogSU5UMSBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0lOVDFDVFJMCQkJMHgzMAorLyogSU5UMiBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0lOVDJDVFJMCQkJMHgzMQorLyogR1BJTzEgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0dQSU8xCQkJCTB4MzMKKworI2RlZmluZSBBSUMzMVhYX0RBQ1BSQgkJCQkweDNDCisvKiBBREMgSW5zdHJ1Y3Rpb24gU2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIEFJQzMxWFhfQURDUFJCCQkJCTB4M0QKKy8qIERBQyBjaGFubmVsIHNldHVwIHJlZ2lzdGVyICovCisjZGVmaW5lIEFJQzMxWFhfREFDU0VUVVAJCQkweDNGCisvKiBEQUMgTXV0ZSBhbmQgdm9sdW1lIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQUNNVVRFCQkJCTB4NDAKKy8qIExlZnQgREFDIGNoYW5uZWwgZGlnaXRhbCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0xEQUNWT0wJCQkJMHg0MQorLyogUmlnaHQgREFDIGNoYW5uZWwgZGlnaXRhbCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX1JEQUNWT0wJCQkJMHg0MgorLyogSGVhZHNldCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgQUlDMzFYWF9IU0RFVEVDVAkJCTB4NDMKKy8qIEFEQyBEaWdpdGFsIE1pYyAqLworI2RlZmluZSBBSUMzMVhYX0FEQ1NFVFVQCQkJMHg1MQorLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgRmluZSBBZGp1c3QgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENGR0EJCQkJMHg1MgorLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgQ29hcnNlIEFkanVzdCAqLworI2RlZmluZSBBSUMzMVhYX0FEQ1ZPTAkJCQkweDUzCisKKworLyogUGFnZSAxIFJlZ2lzdGVycyAqLworLyogSGVhZHBob25lIGRyaXZlcnMgKi8KKyNkZWZpbmUgQUlDMzFYWF9IUERSSVZFUgkJCTB4OUYKKy8qIENsYXNzLUQgU3BlYWtlYXIgQW1wbGlmaWVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BLQU1QCQkJCTB4QTAKKy8qIEhQIE91dHB1dCBEcml2ZXJzIFBPUCBSZW1vdmFsIFNldHRpbmdzICovCisjZGVmaW5lIEFJQzMxWFhfSFBQT1AJCQkJMHhBMQorLyogT3V0cHV0IERyaXZlciBQR0EgUmFtcC1Eb3duIFBlcmlvZCBDb250cm9sICovCisjZGVmaW5lIEFJQzMxWFhfU1BQR0FSQU1QCQkJMHhBMgorLyogREFDX0wgYW5kIERBQ19SIE91dHB1dCBNaXhlciBSb3V0aW5nICovCisjZGVmaW5lIEFJQzMxWFhfREFDTUlYRVJST1VURQkJCTB4QTMKKy8qIExlZnQgQW5hbG9nIFZvbCB0byBIUEwgKi8KKyNkZWZpbmUgQUlDMzFYWF9MQU5BTE9HSFBMCQkJMHhBNAorLyogUmlnaHQgQW5hbG9nIFZvbCB0byBIUFIgKi8KKyNkZWZpbmUgQUlDMzFYWF9SQU5BTE9HSFBSCQkJMHhBNQorLyogTGVmdCBBbmFsb2cgVm9sIHRvIFNQTCAqLworI2RlZmluZSBBSUMzMVhYX0xBTkFMT0dTUEwJCQkweEE2CisvKiBSaWdodCBBbmFsb2cgVm9sIHRvIFNQUiAqLworI2RlZmluZSBBSUMzMVhYX1JBTkFMT0dTUFIJCQkweEE3CisvKiBIUEwgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfSFBMR0FJTgkJCQkweEE4CisvKiBIUFIgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfSFBSR0FJTgkJCQkweEE5CisvKiBTUEwgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BMR0FJTgkJCQkweEFBCisvKiBTUFIgRHJpdmVyICovCisjZGVmaW5lIEFJQzMxWFhfU1BSR0FJTgkJCQkweEFCCisvKiBIUCBEcml2ZXIgQ29udHJvbCAqLworI2RlZmluZSBBSUMzMVhYX0hQQ09OVFJPTAkJCTB4QUMKKy8qIE1JQyBCaWFzIENvbnRyb2wgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNCSUFTCQkJCTB4QUUKKy8qIE1JQyBQR0EqLworI2RlZmluZSBBSUMzMVhYX01JQ1BHQQkJCQkweEFGCisvKiBEZWx0YS1TaWdtYSBNb25vIEFEQyBDaGFubmVsIEZpbmUtR2FpbiBJbnB1dCBTZWxlY3Rpb24gZm9yIFAtVGVybWluYWwgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNQR0FQSQkJCTB4QjAKKy8qIEFEQyBJbnB1dCBTZWxlY3Rpb24gZm9yIE0tVGVybWluYWwgKi8KKyNkZWZpbmUgQUlDMzFYWF9NSUNQR0FNSQkJCTB4QjEKKy8qIElucHV0IENNIFNldHRpbmdzICovCisjZGVmaW5lIEFJQzMxWFhfTUlDUEdBQ00JCQkweEIyCisKKy8qIEJpdHMsIG1hc2tzIGFuZCBzaGlmdHMgKi8KKworLyogQUlDMzFYWF9DTEtNVVggKi8KKyNkZWZpbmUgQUlDMzFYWF9QTExfQ0xLSU5fTUFTSwkJCTB4MGMKKyNkZWZpbmUgQUlDMzFYWF9QTExfQ0xLSU5fU0hJRlQJCQkyCisjZGVmaW5lIEFJQzMxWFhfUExMX0NMS0lOX01DTEsJCQkwCisjZGVmaW5lIEFJQzMxWFhfQ09ERUNfQ0xLSU5fTUFTSwkJMHgwMworI2RlZmluZSBBSUMzMVhYX0NPREVDX0NMS0lOX1NISUZUCQkwCisjZGVmaW5lIEFJQzMxWFhfQ09ERUNfQ0xLSU5fUExMCQkJMworI2RlZmluZSBBSUMzMVhYX0NPREVDX0NMS0lOX0JDTEsJCTEKKworLyogQUlDMzFYWF9QTExQUiwgQUlDMzFYWF9OREFDLCBBSUMzMVhYX01EQUMsIEFJQzMxWFhfTkFEQywgQUlDMzFYWF9NQURDLAorICAgQUlDMzFYWF9CQ0xLTiAqLworI2RlZmluZSBBSUMzMVhYX1BMTF9NQVNLCQkweDdmCisjZGVmaW5lIEFJQzMxWFhfUE1fTUFTSwkJCTB4ODAKKworLyogQUlDMzFYWF9JRkFDRTEgKi8KKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8xNkJJVFMJCTB4MDAKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8yMEJJVFMJCTB4MDEKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8yNEJJVFMJCTB4MDIKKyNkZWZpbmUgQUlDMzFYWF9XT1JEX0xFTl8zMkJJVFMJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9NQVNLCTB4MzAKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQUxFTl9TSElGVAkoNCkKKyNkZWZpbmUgQUlDMzFYWF9JRkFDRTFfREFUQVRZUEVfTUFTSwkweEMwCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UxX0RBVEFUWVBFX1NISUZUCSg2KQorI2RlZmluZSBBSUMzMVhYX0kyU19NT0RFCQkweDAwCisjZGVmaW5lIEFJQzMxWFhfRFNQX01PREUJCTB4MDEKKyNkZWZpbmUgQUlDMzFYWF9SSUdIVF9KVVNUSUZJRURfTU9ERQkweDAyCisjZGVmaW5lIEFJQzMxWFhfTEVGVF9KVVNUSUZJRURfTU9ERQkweDAzCisjZGVmaW5lIEFJQzMxWFhfSUZBQ0UxX01BU1RFUl9NQVNLCTB4MEMKKyNkZWZpbmUgQUlDMzFYWF9CQ0xLX01BU1RFUgkJMHgwOAorI2RlZmluZSBBSUMzMVhYX1dDTEtfTUFTVEVSCQkweDA0CisKKy8qIEFJQzMxWFhfREFUQV9PRkZTRVQgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQVRBX09GRlNFVF9NQVNLCTB4RkYKKworLyogQUlDMzFYWF9JRkFDRTIgKi8KKyNkZWZpbmUgQUlDMzFYWF9CQ0xLSU5WX01BU0sJCTB4MDgKKyNkZWZpbmUgQUlDMzFYWF9CRElWQ0xLX01BU0sJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9EQUMyQkNMSwkJMHgwMAorI2RlZmluZSBBSUMzMVhYX0RBQ01PRDJCQ0xLCQkweDAxCisjZGVmaW5lIEFJQzMxWFhfQURDMkJDTEsJCTB4MDIKKyNkZWZpbmUgQUlDMzFYWF9BRENNT0QyQkNMSwkJMHgwMworCisvKiBBSUMzMVhYX0FEQ0ZMQUcgKi8KKyNkZWZpbmUgQUlDMzFYWF9BRENQV1JTVEFUVVNfTUFTSwkJMHg0MAorCisvKiBBSUMzMVhYX0RBQ0ZMQUcxICovCisjZGVmaW5lIEFJQzMxWFhfTERBQ1BXUlNUQVRVU19NQVNLCQkweDgwCisjZGVmaW5lIEFJQzMxWFhfUkRBQ1BXUlNUQVRVU19NQVNLCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfSFBMRFJWUFdSU1RBVFVTX01BU0sJCTB4MjAKKyNkZWZpbmUgQUlDMzFYWF9IUFJEUlZQV1JTVEFUVVNfTUFTSwkJMHgwMgorI2RlZmluZSBBSUMzMVhYX1NQTERSVlBXUlNUQVRVU19NQVNLCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfU1BSRFJWUFdSU1RBVFVTX01BU0sJCTB4MDEKKworLyogQUlDMzFYWF9JTlRSREFDRkxBRyAqLworI2RlZmluZSBBSUMzMVhYX0hQU0NERVRFQ1RfTUFTSwkJCTB4ODAKKyNkZWZpbmUgQUlDMzFYWF9CVVRUT05QUkVTU19NQVNLCQkweDIwCisjZGVmaW5lIEFJQzMxWFhfSFNQTFVHX01BU0sJCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfTERSQ1RIUkVTX01BU0sJCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfUkRSQ1RIUkVTX01BU0sJCQkweDA0CisjZGVmaW5lIEFJQzMxWFhfREFDU0lOVF9NQVNLCQkJMHgwMgorI2RlZmluZSBBSUMzMVhYX0RBQ0FJTlRfTUFTSwkJCTB4MDEKKworLyogQUlDMzFYWF9JTlQxQ1RSTCAqLworI2RlZmluZSBBSUMzMVhYX0hTUExVR0RFVF9NQVNLCQkJMHg4MAorI2RlZmluZSBBSUMzMVhYX0JVVFRPTlBSRVNTREVUX01BU0sJCTB4NDAKKyNkZWZpbmUgQUlDMzFYWF9EUkNUSFJFU19NQVNLCQkJMHgyMAorI2RlZmluZSBBSUMzMVhYX0FHQ05PSVNFX01BU0sJCQkweDEwCisjZGVmaW5lIEFJQzMxWFhfT0NfTUFTSwkJCQkweDA4CisjZGVmaW5lIEFJQzMxWFhfRU5HSU5FX01BU0sJCQkweDA0CisKKy8qIEFJQzMxWFhfREFDU0VUVVAgKi8KKyNkZWZpbmUgQUlDMzFYWF9TT0ZUU1RFUF9NQVNLCQkJMHgwMworCisvKiBBSUMzMVhYX0RBQ01VVEUgKi8KKyNkZWZpbmUgQUlDMzFYWF9EQUNNVVRFX01BU0sJCQkweDBDCisKKy8qIEFJQzMxWFhfTUlDQklBUyAqLworI2RlZmluZSBBSUMzMVhYX01JQ0JJQVNfTUFTSwkJCTB4MDMKKyNkZWZpbmUgQUlDMzFYWF9NSUNCSUFTX1NISUZUCQkJMAorCisjZW5kaWYJLyogX1RMVjMyMEFJQzMxWFhfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwppbmRleCA2ODgxNTFiLi4xZDliMTE3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYwpAQCAtMjksOSArMjksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8c291bmQvdGx2MzIwYWljMzJ4NC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTY2LDIwICs2OSwzMiBAQAogCXUzMiBtaWNwZ2Ffcm91dGluZzsKIAlib29sIHN3YXBkYWNzOwogCWludCByc3RuX2dwaW87CisJc3RydWN0IGNsayAqbWNsazsKKworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseV9sZG87CisJc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5X2lvdjsKKwlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHlfZHY7CisJc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5X2F2OwogfTsKIAotLyogMGRCIG1pbiwgMWRCIHN0ZXBzICovCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUodGx2X3N0ZXBfMSwgMCwgMTAwLCAwKTsKIC8qIDBkQiBtaW4sIDAuNWRCIHN0ZXBzICovCiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUodGx2X3N0ZXBfMF81LCAwLCA1MCwgMCk7CisvKiAtNjMuNWRCIG1pbiwgMC41ZEIgc3RlcHMgKi8KK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0bHZfcGNtLCAtNjM1MCwgNTAsIDApOworLyogLTZkQiBtaW4sIDFkQiBzdGVwcyAqLworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKHRsdl9kcml2ZXJfZ2FpbiwgLTYwMCwgMTAwLCAwKTsKKy8qIC0xMmRCIG1pbiwgMC41ZEIgc3RlcHMgKi8KK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0bHZfYWRjX3ZvbCwgLTEyMDAsIDUwLCAwKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMyeDRfc25kX2NvbnRyb2xzW10gPSB7Ci0JU09DX0RPVUJMRV9SX1RMVigiUENNIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMyWDRfTERBQ1ZPTCwKLQkJCUFJQzMyWDRfUkRBQ1ZPTCwgMCwgMHgzMCwgMCwgdGx2X3N0ZXBfMF81KSwKLQlTT0NfRE9VQkxFX1JfVExWKCJIUCBEcml2ZXIgR2FpbiBWb2x1bWUiLCBBSUMzMlg0X0hQTEdBSU4sCi0JCQlBSUMzMlg0X0hQUkdBSU4sIDAsIDB4MUQsIDAsIHRsdl9zdGVwXzEpLAotCVNPQ19ET1VCTEVfUl9UTFYoIkxPIERyaXZlciBHYWluIFZvbHVtZSIsIEFJQzMyWDRfTE9MR0FJTiwKLQkJCUFJQzMyWDRfTE9SR0FJTiwgMCwgMHgxRCwgMCwgdGx2X3N0ZXBfMSksCisJU09DX0RPVUJMRV9SX1NfVExWKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgQUlDMzJYNF9MREFDVk9MLAorCQkJQUlDMzJYNF9SREFDVk9MLCAwLCAtMHg3ZiwgMHgzMCwgNywgMCwgdGx2X3BjbSksCisJU09DX0RPVUJMRV9SX1NfVExWKCJIUCBEcml2ZXIgR2FpbiBWb2x1bWUiLCBBSUMzMlg0X0hQTEdBSU4sCisJCQlBSUMzMlg0X0hQUkdBSU4sIDAsIC0weDYsIDB4MWQsIDUsIDAsCisJCQl0bHZfZHJpdmVyX2dhaW4pLAorCVNPQ19ET1VCTEVfUl9TX1RMVigiTE8gRHJpdmVyIEdhaW4gVm9sdW1lIiwgQUlDMzJYNF9MT0xHQUlOLAorCQkJQUlDMzJYNF9MT1JHQUlOLCAwLCAtMHg2LCAweDFkLCA1LCAwLAorCQkJdGx2X2RyaXZlcl9nYWluKSwKIAlTT0NfRE9VQkxFX1IoIkhQIERBQyBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMlg0X0hQTEdBSU4sCiAJCQlBSUMzMlg0X0hQUkdBSU4sIDYsIDB4MDEsIDEpLAogCVNPQ19ET1VCTEVfUigiTE8gREFDIFBsYXliYWNrIFN3aXRjaCIsIEFJQzMyWDRfTE9MR0FJTiwKQEAgLTkwLDggKzEwNSw4IEBACiAJU09DX1NJTkdMRSgiQURDRkdBIExlZnQgTXV0ZSBTd2l0Y2giLCBBSUMzMlg0X0FEQ0ZHQSwgNywgMSwgMCksCiAJU09DX1NJTkdMRSgiQURDRkdBIFJpZ2h0IE11dGUgU3dpdGNoIiwgQUlDMzJYNF9BRENGR0EsIDMsIDEsIDApLAogCi0JU09DX0RPVUJMRV9SX1RMVigiQURDIExldmVsIFZvbHVtZSIsIEFJQzMyWDRfTEFEQ1ZPTCwKLQkJCUFJQzMyWDRfUkFEQ1ZPTCwgMCwgMHgyOCwgMCwgdGx2X3N0ZXBfMF81KSwKKwlTT0NfRE9VQkxFX1JfU19UTFYoIkFEQyBMZXZlbCBWb2x1bWUiLCBBSUMzMlg0X0xBRENWT0wsCisJCQlBSUMzMlg0X1JBRENWT0wsIDAsIC0weDE4LCAweDI4LCA2LCAwLCB0bHZfYWRjX3ZvbCksCiAJU09DX0RPVUJMRV9SX1RMVigiUEdBIExldmVsIFZvbHVtZSIsIEFJQzMyWDRfTE1JQ1BHQVZPTCwKIAkJCUFJQzMyWDRfUk1JQ1BHQVZPTCwgMCwgMHg1ZiwgMCwgdGx2X3N0ZXBfMF81KSwKIApAQCAtNDgwLDggKzQ5NSwxOCBAQAogc3RhdGljIGludCBhaWMzMng0X3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogeworCXN0cnVjdCBhaWMzMng0X3ByaXYgKmFpYzMyeDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQkvKiBTd2l0Y2ggb24gbWFzdGVyIGNsb2NrICovCisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhaWMzMng0LT5tY2xrKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBtYXN0ZXIgY2xvY2tcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCiAJCS8qIFN3aXRjaCBvbiBQTEwgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKIAkJCQkgICAgQUlDMzJYNF9QTExFTiwgQUlDMzJYNF9QTExFTik7CkBAIC01MDksMjkgKzUzNCwzMiBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCS8qIFN3aXRjaCBvZmYgUExMICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfUExMUFIsCi0JCQkJICAgIEFJQzMyWDRfUExMRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTkRBQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkRBQywKLQkJCQkgICAgQUlDMzJYNF9OREFDRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTURBQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTURBQywKLQkJCQkgICAgQUlDMzJYNF9NREFDRU4sIDApOwotCi0JCS8qIFN3aXRjaCBvZmYgTkFEQyBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkFEQywKLQkJCQkgICAgQUlDMzJYNF9OQURDRU4sIDApOworCQkvKiBTd2l0Y2ggb2ZmIEJDTEtfTiBEaXZpZGVyICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCisJCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKIAogCQkvKiBTd2l0Y2ggb2ZmIE1BREMgRGl2aWRlciAqLwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X01BREMsCiAJCQkJICAgIEFJQzMyWDRfTUFEQ0VOLCAwKTsKIAotCQkvKiBTd2l0Y2ggb2ZmIEJDTEtfTiBEaXZpZGVyICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCi0JCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKKwkJLyogU3dpdGNoIG9mZiBOQURDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9OQURDLAorCQkJCSAgICBBSUMzMlg0X05BRENFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBNREFDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9NREFDLAorCQkJCSAgICBBSUMzMlg0X01EQUNFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBOREFDIERpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9OREFDLAorCQkJCSAgICBBSUMzMlg0X05EQUNFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBQTEwgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKKwkJCQkgICAgQUlDMzJYNF9QTExFTiwgMCk7CisKKwkJLyogU3dpdGNoIG9mZiBtYXN0ZXIgY2xvY2sgKi8KKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFpYzMyeDQtPm1jbGspOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCWJyZWFrOwpAQCAtNTg2LDkgKzYxNCw3IEBACiAJc3RydWN0IGFpYzMyeDRfcHJpdiAqYWljMzJ4NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXUzMiB0bXBfcmVnOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQotCWlmIChhaWMzMng0LT5yc3RuX2dwaW8gPj0gMCkgeworCWlmIChncGlvX2lzX3ZhbGlkKGFpYzMyeDQtPnJzdG5fZ3BpbykpIHsKIAkJbmRlbGF5KDEwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoYWljMzJ4NC0+cnN0bl9ncGlvLCAxKTsKIAl9CkBAIC02NjMsMTEgKzY4OSwxMjIgQEAKIAkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhaWMzMng0X2RhcG1fcm91dGVzKSwKIH07CiAKK3N0YXRpYyBpbnQgYWljMzJ4NF9wYXJzZV9kdChzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0LAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWFpYzMyeDQtPnN3YXBkYWNzID0gZmFsc2U7CisJYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgPSAwOworCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAicmVzZXQtZ3Bpb3MiLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaWMzMng0X2Rpc2FibGVfcmVndWxhdG9ycyhzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0KQoreworCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9pb3YpOworCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2R2KTsKKworCWlmICghSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9hdikpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9hdik7Cit9CisKK3N0YXRpYyBpbnQgYWljMzJ4NF9zZXR1cF9yZWd1bGF0b3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGFpYzMyeDRfcHJpdiAqYWljMzJ4NCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWFpYzMyeDQtPnN1cHBseV9sZG8gPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoZGV2LCAibGRvaW4iKTsKKwlhaWMzMng0LT5zdXBwbHlfaW92ID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgImlvdiIpOworCWFpYzMyeDQtPnN1cHBseV9kdiA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJkdiIpOworCWFpYzMyeDQtPnN1cHBseV9hdiA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJhdiIpOworCisJLyogQ2hlY2sgaWYgdGhlIHJlZ3VsYXRvciByZXF1aXJlbWVudHMgYXJlIGZ1bGZpbGxlZCAqLworCisJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfaW92KSkgeworCQlkZXZfZXJyKGRldiwgIk1pc3Npbmcgc3VwcGx5ICdpb3YnXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2lvdik7CisJfQorCisJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSkgeworCQlpZiAoUFRSX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwkJaWYgKElTX0VSUihhaWMzMng0LT5zdXBwbHlfZHYpKSB7CisJCQlkZXZfZXJyKGRldiwgIk1pc3Npbmcgc3VwcGx5ICdkdicgb3IgJ2xkb2luJ1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihhaWMzMng0LT5zdXBwbHlfZHYpOworCQl9CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSkgeworCQkJZGV2X2VycihkZXYsICJNaXNzaW5nIHN1cHBseSAnYXYnIG9yICdsZG9pbidcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSAmJgorCQkJCVBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCWlmIChJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSAmJgorCQkJCVBUUl9FUlIoYWljMzJ4NC0+c3VwcGx5X2F2KSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhaWMzMng0LT5zdXBwbHlfaW92KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3IgaW92XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIUlTX0VSUihhaWMzMng0LT5zdXBwbHlfbGRvKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yIGxkb1xuIik7CisJCQlnb3RvIGVycm9yX2xkbzsKKwkJfQorCX0KKworCWlmICghSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9kdikpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhaWMzMng0LT5zdXBwbHlfZHYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yIGR2XG4iKTsKKwkJCWdvdG8gZXJyb3JfZHY7CisJCX0KKwl9CisKKwlpZiAoIUlTX0VSUihhaWMzMng0LT5zdXBwbHlfYXYpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWljMzJ4NC0+c3VwcGx5X2F2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHJlZ3VsYXRvciBhdlxuIik7CisJCQlnb3RvIGVycm9yX2F2OworCQl9CisJfQorCisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykgJiYgSVNfRVJSKGFpYzMyeDQtPnN1cHBseV9hdikpCisJCWFpYzMyeDQtPnBvd2VyX2NmZyB8PSBBSUMzMlg0X1BXUl9BSUMzMlg0X0xET19FTkFCTEU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfYXY6CisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2R2KSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2R2KTsKKworZXJyb3JfZHY6CisJaWYgKCFJU19FUlIoYWljMzJ4NC0+c3VwcGx5X2xkbykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFpYzMyeDQtPnN1cHBseV9sZG8pOworCitlcnJvcl9sZG86CisJcmVndWxhdG9yX2Rpc2FibGUoYWljMzJ4NC0+c3VwcGx5X2lvdik7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhaWMzMng0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGFpYzMyeDRfcGRhdGEgKnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBpMmMtPmRldi5vZl9ub2RlOwogCWludCByZXQ7CiAKIAlhaWMzMng0ID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBhaWMzMng0X3ByaXYpLApAQCAtNjg2LDYgKzgyMywxMiBAQAogCQlhaWMzMng0LT5zd2FwZGFjcyA9IHBkYXRhLT5zd2FwZGFjczsKIAkJYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgPSBwZGF0YS0+bWljcGdhX3JvdXRpbmc7CiAJCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IHBkYXRhLT5yc3RuX2dwaW87CisJfSBlbHNlIGlmIChucCkgeworCQlyZXQgPSBhaWMzMng0X3BhcnNlX2R0KGFpYzMyeDQsIG5wKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgRFQgbm9kZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfSBlbHNlIHsKIAkJYWljMzJ4NC0+cG93ZXJfY2ZnID0gMDsKIAkJYWljMzJ4NC0+c3dhcGRhY3MgPSBmYWxzZTsKQEAgLTY5MywyMCArODM2LDQ0IEBACiAJCWFpYzMyeDQtPnJzdG5fZ3BpbyA9IC0xOwogCX0KIAotCWlmIChhaWMzMng0LT5yc3RuX2dwaW8gPj0gMCkgeworCWFpYzMyeDQtPm1jbGsgPSBkZXZtX2Nsa19nZXQoJmkyYy0+ZGV2LCAibWNsayIpOworCWlmIChJU19FUlIoYWljMzJ4NC0+bWNsaykpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgZ2V0dGluZyB0aGUgbWNsay4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgdXNhZ2Ugb2YgdGhpcyBjb2RlYyB3aXRob3V0IG1jbGtcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhaWMzMng0LT5tY2xrKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChhaWMzMng0LT5yc3RuX2dwaW8pKSB7CiAJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmaTJjLT5kZXYsIGFpYzMyeDQtPnJzdG5fZ3BpbywKIAkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJ0bHYzMjBhaWMzMng0IHJzdG4iKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJcmV0dXJuIHJldDsKIAl9CiAKKwlyZXQgPSBhaWMzMng0X3NldHVwX3JlZ3VsYXRvcnMoJmkyYy0+ZGV2LCBhaWMzMng0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHNldHVwIHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZfYWljMzJ4NCwgJmFpYzMyeDRfZGFpLCAxKTsKLQlyZXR1cm4gcmV0OworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWNcbiIpOworCQlhaWMzMng0X2Rpc2FibGVfcmVndWxhdG9ycyhhaWMzMng0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBhaWMzMng0KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFpYzMyeDRfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBhaWMzMng0X3ByaXYgKmFpYzMyeDQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWFpYzMyeDRfZGlzYWJsZV9yZWd1bGF0b3JzKGFpYzMyeDQpOworCiAJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC03MTcsMTAgKzg4NCwxNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhaWMzMng0X2kyY19pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFpYzMyeDRfb2ZfaWRbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHRsdjMyMGFpYzMyeDQiLCB9LAorCXsgLyogc2VuaXRlbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWljMzJ4NF9vZl9pZCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhaWMzMng0X2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAidGx2MzIwYWljMzJ4NCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhaWMzMng0X29mX2lkLAogCX0sCiAJLnByb2JlID0gICAgYWljMzJ4NF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgYWljMzJ4NF9pMmNfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCmluZGV4IDQ3MGZiZmIuLmIxODM1MTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKQEAgLTEzNDQsMTIgKzEzNDQsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZhaWMzeC0+bGlzdCk7CiAJYWljM3gtPmNvZGVjID0gY29kZWM7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljM3gtPnN1cHBsaWVzKTsgaSsrKSB7CiAJCWFpYzN4LT5kaXNhYmxlX25iW2ldLm5iLm5vdGlmaWVyX2NhbGwgPSBhaWMzeF9yZWd1bGF0b3JfZXZlbnQ7CiAJCWFpYzN4LT5kaXNhYmxlX25iW2ldLmFpYzN4ID0gYWljM3g7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKaW5kZXggNGYzNTgzOS4uNmJmYzhhMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwpAQCAtMTIyLDcgKzEyMiw2IEBACiAJdW5zaWduZWQgaW50IHV0aHI7CiAKIAllbnVtIGRhYzMzX3N0YXRlIHN0YXRlOwotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwogCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKQEAgLTQ2MSw3ICs0NjAsNyBAQAogCWlmIChkYWMzMy0+Zmlmb19tb2RlID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAkvKiBEbyBub3QgYWxsb3cgY2hhbmdlcyB3aGlsZSBzdHJlYW0gaXMgcnVubmluZyovCi0JaWYgKGNvZGVjLT5hY3RpdmUpCisJaWYgKHNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA8IDAgfHwKQEAgLTQ3OCw5ICs0NzcsNyBAQAogCSJCeXBhc3MiLCAiTW9kZSAxIiwgIk1vZGUgNyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjMzNfZmlmb19tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShkYWMzM19maWZvX21vZGVfdGV4dHMpLAotCQkJICAgIGRhYzMzX2ZpZm9fbW9kZV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGRhYzMzX2ZpZm9fbW9kZV9lbnVtLCBkYWMzM19maWZvX21vZGVfdGV4dHMpOwogCiAvKiBML1IgTGluZSBPdXRwdXQgR2FpbiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmxyX2xpbmVvdXRfZ2Fpbl90ZXh0c1tdID0gewpAQCAtNDg4LDE1ICs0ODUsMTMgQEAKIAkiTGluZSAwZEIgREFDIDEyZEIiLCAiTGluZSA2ZEIgREFDIDE4ZEIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsX2xpbmVvdXRfZ2Fpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREFDMzNfTERBQ19QV1JfQ1RSTCwgMCwKLQkJCUFSUkFZX1NJWkUobHJfbGluZW91dF9nYWluX3RleHRzKSwKLQkJCWxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobF9saW5lb3V0X2dhaW5fZW51bSwKKwkJCSAgICBEQUMzM19MREFDX1BXUl9DVFJMLCAwLAorCQkJICAgIGxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcl9saW5lb3V0X2dhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKERBQzMzX1JEQUNfUFdSX0NUUkwsIDAsCi0JCQlBUlJBWV9TSVpFKGxyX2xpbmVvdXRfZ2Fpbl90ZXh0cyksCi0JCQlscl9saW5lb3V0X2dhaW5fdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJfbGluZW91dF9nYWluX2VudW0sCisJCQkgICAgREFDMzNfUkRBQ19QV1JfQ1RSTCwgMCwKKwkJCSAgICBscl9saW5lb3V0X2dhaW5fdGV4dHMpOwogCiAvKgogICogREFDTC9SIGRpZ2l0YWwgdm9sdW1lIGNvbnRyb2w6CkBAIC01MzQsMTggKzUyOSwxNiBAQAogLyogTE9QIEwvUiBpbnZlcnQgc2VsZWN0aW9uICovCiBzdGF0aWMgY29uc3QgY2hhciAqZGFjMzNfbHJfbG9tX3RleHRzW10gPSB7IkRBQyIsICJMT1AifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWMzM19sZWZ0X2xvbV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoREFDMzNfT1VUX0FNUF9DVFJMLCAzLAotCQkJQVJSQVlfU0laRShkYWMzM19scl9sb21fdGV4dHMpLAotCQkJZGFjMzNfbHJfbG9tX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWMzM19sZWZ0X2xvbV9lbnVtLAorCQkJICAgIERBQzMzX09VVF9BTVBfQ1RSTCwgMywKKwkJCSAgICBkYWMzM19scl9sb21fdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzNfZGFwbV9sZWZ0X2xvbV9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgZGFjMzNfbGVmdF9sb21fZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjMzNfcmlnaHRfbG9tX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShEQUMzM19PVVRfQU1QX0NUUkwsIDIsCi0JCQlBUlJBWV9TSVpFKGRhYzMzX2xyX2xvbV90ZXh0cyksCi0JCQlkYWMzM19scl9sb21fdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhYzMzX3JpZ2h0X2xvbV9lbnVtLAorCQkJICAgIERBQzMzX09VVF9BTVBfQ1RSTCwgMiwKKwkJCSAgICBkYWMzM19scl9sb21fdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzNfZGFwbV9yaWdodF9sb21fY29udHJvbCA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGRhYzMzX3JpZ2h0X2xvbV9lbnVtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKaW5kZXggMDA2NjVhZC4uOTc1ZTBmNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKQEAgLTQxNSwxMCArNDE1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2hhbmRzZnJlZWxfdGV4dHNbXSA9CiAJCXsiVm9pY2UiLCAiQXVkaW9MMSIsICJBdWRpb0wyIiwgIkF1ZGlvUjIifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2hhbmRzZnJlZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0hGTF9DVEwsIDAsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfaGFuZHNmcmVlbF90ZXh0cyksCi0JCQl0d2w0MDMwX2hhbmRzZnJlZWxfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfaGFuZHNmcmVlbF9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX0hGTF9DVEwsIDAsCisJCQkgICAgdHdsNDAzMF9oYW5kc2ZyZWVsX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9oYW5kc2ZyZWVsX2NvbnRyb2wgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX2hhbmRzZnJlZWxfZW51bSk7CkBAIC00MzEsMTAgKzQzMCw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9oYW5kc2ZyZWVyX3RleHRzW10gPQogCQl7IlZvaWNlIiwgIkF1ZGlvUjEiLCAiQXVkaW9SMiIsICJBdWRpb0wyIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9oYW5kc2ZyZWVyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19IRlJfQ1RMLCAwLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX2hhbmRzZnJlZXJfdGV4dHMpLAotCQkJdHdsNDAzMF9oYW5kc2ZyZWVyX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX2hhbmRzZnJlZXJfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19IRlJfQ1RMLCAwLAorCQkJICAgIHR3bDQwMzBfaGFuZHNmcmVlcl90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1faGFuZHNmcmVlcl9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9oYW5kc2ZyZWVyX2VudW0pOwpAQCAtNDQ4LDEwICs0NDYsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFfdGV4dHNbXSA9CiAJCXsiQXVkaW9MMSIsICJBdWRpb1IxIiwgIkF1ZGlvTDIiLCAiQXVkaW9SMiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfdmlicmFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF92aWJyYV90ZXh0cyksCi0JCQl0d2w0MDMwX3ZpYnJhX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX3ZpYnJhX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfVklCUkFfQ1RMLCAyLAorCQkJICAgIHR3bDQwMzBfdmlicmFfdGV4dHMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX3ZpYnJhX2NvbnRyb2wgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX3ZpYnJhX2VudW0pOwpAQCAtNDYwLDEwICs0NTcsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFwYXRoX3RleHRzW10gPQogCQl7IkxvY2FsIHZpYnJhdG9yIiwgIkF1ZGlvIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF92aWJyYXBhdGhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgNCwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF92aWJyYXBhdGhfdGV4dHMpLAotCQkJdHdsNDAzMF92aWJyYXBhdGhfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfdmlicmFwYXRoX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfVklCUkFfQ1RMLCA0LAorCQkJICAgIHR3bDQwMzBfdmlicmFwYXRoX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV92aWJyYXBhdGhfY29udHJvbCA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfdmlicmFwYXRoX2VudW0pOwpAQCAtNDkwLDEwICs0ODYsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfbWljcGF0aHR4MV90ZXh0c1tdID0KIAkJeyJBbmFsb2ciLCAiRGlnaW1pYzAifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX21pY3BhdGh0eDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMCwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9taWNwYXRodHgxX3RleHRzKSwKLQkJCXR3bDQwMzBfbWljcGF0aHR4MV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9taWNwYXRodHgxX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAwLAorCQkJICAgIHR3bDQwMzBfbWljcGF0aHR4MV90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fbWljcGF0aHR4MV9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9taWNwYXRodHgxX2VudW0pOwpAQCAtNTAyLDEwICs0OTcsOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0c1tdID0KIAkJeyJBbmFsb2ciLCAiRGlnaW1pYzEifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX21pY3BhdGh0eDJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9taWNwYXRodHgyX3RleHRzKSwKLQkJCXR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9taWNwYXRodHgyX2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAyLAorCQkJICAgIHR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fbWljcGF0aHR4Ml9jb250cm9sID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9taWNwYXRodHgyX2VudW0pOwpAQCAtOTU1LDE5ICs5NDksMTUgQEAKIAkiT3B0aW9uIDIgKHZvaWNlL2F1ZGlvKSIsICJPcHRpb24gMSAoYXVkaW8pIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX29wX21vZGVzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19DT0RFQ19NT0RFLCAwLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX29wX21vZGVzX3RleHRzKSwKLQkJCXR3bDQwMzBfb3BfbW9kZXNfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfb3BfbW9kZXNfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19DT0RFQ19NT0RFLCAwLAorCQkJICAgIHR3bDQwMzBfb3BfbW9kZXNfdGV4dHMpOwogCiBzdGF0aWMgaW50IHNuZF9zb2NfcHV0X3R3bDQwMzBfb3Btb2RlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgdHdsNDAzMF9wcml2ICp0d2w0MDMwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIHNob3J0IHZhbDsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrOwogCiAJaWYgKHR3bDQwMzAtPmNvbmZpZ3VyZWQpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LApAQCAtOTc1LDE5ICs5NjUsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IGUtPnNoaWZ0X2w7Ci0JbWFzayA9IGUtPm1hc2sgPDwgZS0+c2hpZnRfbDsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7Ci0JCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gZS0+bWF4IC0gMSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgfD0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA8PCBlLT5zaGlmdF9yOwotCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKLQl9Ci0KLQlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCXJldHVybiBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOwogfQogCiAvKgpAQCAtMTA0NCwxMCArMTAyMiw5IEBACiAJIlZvaWNlIGhpZ2ggcHJpb3JpdHkiLCAiSGlGaSBoaWdoIHByaW9yaXR5IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCAyLAotCQkJQVJSQVlfU0laRSh0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV90ZXh0cyksCi0JCQl0d2w0MDMwX2F2YWRjX2Nsa19wcmlvcml0eV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9hdmFkY19jbGtfcHJpb3JpdHlfZW51bSwKKwkJCSAgICBUV0w0MDMwX1JFR19BVkFEQ19DVEwsIDIsCisJCQkgICAgdHdsNDAzMF9hdmFkY19jbGtfcHJpb3JpdHlfdGV4dHMpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHNbXSA9IHsKIAkiMjcvMjAvMTQgbXMiLCAiNTUvNDAvMjcgbXMiLCAiMTA5LzgxLzU1IG1zIiwgIjIxOC8xNjEvMTA5IG1zIiwKQEAgLTEwNTUsNDAgKzEwMzIsMzYgQEAKIAkiMzQ5NS8yNTgxLzE3NDggbXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfcmFtcGRlbGF5X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19IU19QT1BOX1NFVCwgMiwKLQkJCUFSUkFZX1NJWkUodHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpLAotCQkJdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR3bDQwMzBfcmFtcGRlbGF5X2VudW0sCisJCQkgICAgVFdMNDAzMF9SRUdfSFNfUE9QTl9TRVQsIDIsCisJCQkgICAgdHdsNDAzMF9yYW1wZGVsYXlfdGV4dHMpOwogCiAvKiBWaWJyYSBILWJyaWRnZSBkaXJlY3Rpb24gbW9kZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzW10gPSB7CiAJIlZpYnJhIEgtYnJpZGdlIGRpcmVjdGlvbiIsICJBdWRpbyBkYXRhIE1TQiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfdmlicmFkaXJtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19WSUJSQV9DVEwsIDUsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzKSwKLQkJCXR3bDQwMzBfdmlicmFkaXJtb2RlX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh0d2w0MDMwX3ZpYnJhZGlybW9kZV9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgNSwKKwkJCSAgICB0d2w0MDMwX3ZpYnJhZGlybW9kZV90ZXh0cyk7CiAKIC8qIFZpYnJhIEgtYnJpZGdlIGRpcmVjdGlvbiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfdmlicmFkaXJfdGV4dHNbXSA9IHsKIAkiUG9zaXRpdmUgcG9sYXJpdHkiLCAiTmVnYXRpdmUgcG9sYXJpdHkiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX3ZpYnJhZGlyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19WSUJSQV9DVEwsIDEsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfdmlicmFkaXJfdGV4dHMpLAotCQkJdHdsNDAzMF92aWJyYWRpcl90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF92aWJyYWRpcl9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX1ZJQlJBX0NUTCwgMSwKKwkJCSAgICB0d2w0MDMwX3ZpYnJhZGlyX3RleHRzKTsKIAogLyogRGlnaW1pYyBMZWZ0IGFuZCByaWdodCBzd2FwcGluZyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfZGlnaW1pY3N3YXBfdGV4dHNbXSA9IHsKIAkiTm90IHN3YXBwZWQiLCAiU3dhcHBlZCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfZGlnaW1pY3N3YXBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX01JU0NfU0VUXzEsIDAsCi0JCQlBUlJBWV9TSVpFKHR3bDQwMzBfZGlnaW1pY3N3YXBfdGV4dHMpLAotCQkJdHdsNDAzMF9kaWdpbWljc3dhcF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHdsNDAzMF9kaWdpbWljc3dhcF9lbnVtLAorCQkJICAgIFRXTDQwMzBfUkVHX01JU0NfU0VUXzEsIDAsCisJCQkgICAgdHdsNDAzMF9kaWdpbWljc3dhcF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX3NuZF9jb250cm9sc1tdID0gewogCS8qIENvZGVjIG9wZXJhdGlvbiBtb2RlIGNvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKaW5kZXggMGFmZThiZS4uYmQzYTIwNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKQEAgLTgxLDcgKzgxLDcgQEAKIH07CiAKIC8qIHNldCBvZiByYXRlcyBmb3IgZWFjaCBwbGw6IGxvdy1wb3dlciBhbmQgaGlnaC1wZXJmb3JtYW5jZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBscF9yYXRlc1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBscF9yYXRlc1tdID0gewogCTgwMDAsCiAJMTEyNTAsCiAJMTYwMDAsCkBAIC05Myw3ICs5Myw3IEBACiAJOTYwMDAsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGhwX3JhdGVzW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhwX3JhdGVzW10gPSB7CiAJODAwMCwKIAkxNjAwMCwKIAkzMjAwMCwKQEAgLTEwMSw3ICsxMDEsNyBAQAogCTk2MDAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBzeXNjbGtfY29uc3RyYWludHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc3lzY2xrX2NvbnN0cmFpbnRzW10gPSB7CiAJeyAuY291bnQgPSBBUlJBWV9TSVpFKGxwX3JhdGVzKSwgLmxpc3QgPSBscF9yYXRlcywgfSwKIAl7IC5jb3VudCA9IEFSUkFZX1NJWkUoaHBfcmF0ZXMpLCAubGlzdCA9IGhwX3JhdGVzLCB9LAogfTsKQEAgLTM5Miw4ICszOTIsMTAgQEAKIAl7IkhlYWRzZXQgTWljIiwgIlN1YiBNaWMiLCAiQXV4L0ZNIFJpZ2h0IiwgIk9mZiJ9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShUV0w2MDQwX1JFR19NSUNMQ1RMLCAzLCA0LCB0d2w2MDQwX2FtaWNsX3RleHRzKSwKLQlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfTUlDUkNUTCwgMywgNCwgdHdsNjA0MF9hbWljcl90ZXh0cyksCisJU09DX0VOVU1fU0lOR0xFKFRXTDYwNDBfUkVHX01JQ0xDVEwsIDMsCisJCQlBUlJBWV9TSVpFKHR3bDYwNDBfYW1pY2xfdGV4dHMpLCB0d2w2MDQwX2FtaWNsX3RleHRzKSwKKwlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfTUlDUkNUTCwgMywKKwkJCUFSUkFZX1NJWkUodHdsNjA0MF9hbWljcl90ZXh0cyksIHR3bDYwNDBfYW1pY3JfdGV4dHMpLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDYwNDBfaHNfdGV4dHNbXSA9IHsKQEAgLTQ3Niw5ICs0NzgsOCBAQAogCSJMb3ctUG93ZXIiLCAiSGlnaC1QZXJmb3JtYW5jZSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfcG93ZXJfbW9kZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUodHdsNjA0MF9wb3dlcl9tb2RlX3RleHRzKSwKLQkJCXR3bDYwNDBfcG93ZXJfbW9kZV90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHR3bDYwNDBfcG93ZXJfbW9kZV9lbnVtLAorCQkJCXR3bDYwNDBfcG93ZXJfbW9kZV90ZXh0cyk7CiAKIHN0YXRpYyBpbnQgdHdsNjA0MF9oZWFkc2V0X3Bvd2VyX2dldF9lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwppbmRleCBjOTRkNGMxLi5lZGYyN2FjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwpAQCAtMjAzLDggKzIwMyw3IEBACiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgdWRhMTM0eF9wcml2ICp1ZGExMzR4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdTggaHdfcGFyYW1zOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCmluZGV4IDcyNmRmNmQuLmU2MmU3MDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkvKiB0aGUgaW50ZXJwb2xhdG9yICYgZGVjaW1hdG9yIHJlZ3MgbXVzdCBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUKIAkgKiBjb2RlYyBEQUkgaXMgYWN0aXZlLgogCSAqLwotCWlmICghY29kZWMtPmFjdGl2ZSAmJiAocmVnID49IFVEQTEzODBfTVZPTCkpCisJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykgJiYgKHJlZyA+PSBVREExMzgwX01WT0wpKQogCQlyZXR1cm4gMDsKIAlwcl9kZWJ1ZygidWRhMTM4MDogaHcgd3JpdGUgJXggdmFsICV4XG4iLCByZWcsIHZhbHVlKTsKIAlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDMpID09IDMpIHsKQEAgLTIzNywyNSArMjM3LDI3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfZGVlbXBfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX0RFRU1QLCA4LCA1LCB1ZGExMzgwX2RlZW1wKSwKLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9ERUVNUCwgMCwgNSwgdWRhMTM4MF9kZWVtcCksCisJU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfREVFTVAsIDgsIEFSUkFZX1NJWkUodWRhMTM4MF9kZWVtcCksCisJCQl1ZGExMzgwX2RlZW1wKSwKKwlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9ERUVNUCwgMCwgQVJSQVlfU0laRSh1ZGExMzgwX2RlZW1wKSwKKwkJCXVkYTEzODBfZGVlbXApLAogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9pbnB1dF9zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfQURDLCAyLCA0LCB1ZGExMzgwX2lucHV0X3NlbCk7CQkvKiBTRUxfTUlDLCBTRUxfTE5BICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfb3V0cHV0X3NlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9QTSwgNywgMiwgdWRhMTM4MF9vdXRwdXRfc2VsKTsJCS8qIFIwMl9FTl9BVkMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9zcGZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfTU9ERSwgMTQsIDQsIHVkYTEzODBfc3BmX21vZGUpOwkJLyogTSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX2NhcHR1cmVfc2VsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX0lGQUNFLCA2LCAyLCB1ZGExMzgwX2NhcHR1cmVfc2VsKTsJLyogU0VMX1NPVVJDRSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX3NlbF9uc19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9NSVhFUiwgMTQsIDIsIHVkYTEzODBfc2VsX25zKTsJCS8qIFNFTF9OUyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB1ZGExMzgwX21peF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVURBMTM4MF9NSVhFUiwgMTIsIDQsIHVkYTEzODBfbWl4X2NvbnRyb2wpOwkvKiBNSVgsIE1JWF9QT1MgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdWRhMTM4MF9zZGV0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShVREExMzgwX01JWEVSLCA0LCA0LCB1ZGExMzgwX3NkZXRfc2V0dGluZyk7CS8qIFNEX1ZBTFVFICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHVkYTEzODBfb3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFVEQTEzODBfTUlYRVIsIDAsIDMsIHVkYTEzODBfb3Nfc2V0dGluZyk7CS8qIE9TICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9pbnB1dF9zZWxfZW51bSwKKwkJCSAgICBVREExMzgwX0FEQywgMiwgdWRhMTM4MF9pbnB1dF9zZWwpOwkJLyogU0VMX01JQywgU0VMX0xOQSAqLworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHVkYTEzODBfb3V0cHV0X3NlbF9lbnVtLAorCQkJICAgIFVEQTEzODBfUE0sIDcsIHVkYTEzODBfb3V0cHV0X3NlbCk7CQkvKiBSMDJfRU5fQVZDICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9zcGZfZW51bSwKKwkJCSAgICBVREExMzgwX01PREUsIDE0LCB1ZGExMzgwX3NwZl9tb2RlKTsJCS8qIE0gKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX2NhcHR1cmVfc2VsX2VudW0sCisJCQkgICAgVURBMTM4MF9JRkFDRSwgNiwgdWRhMTM4MF9jYXB0dXJlX3NlbCk7CS8qIFNFTF9TT1VSQ0UgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX3NlbF9uc19lbnVtLAorCQkJICAgIFVEQTEzODBfTUlYRVIsIDE0LCB1ZGExMzgwX3NlbF9ucyk7CQkvKiBTRUxfTlMgKi8KK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh1ZGExMzgwX21peF9lbnVtLAorCQkJICAgIFVEQTEzODBfTUlYRVIsIDEyLCB1ZGExMzgwX21peF9jb250cm9sKTsJLyogTUlYLCBNSVhfUE9TICovCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodWRhMTM4MF9zZGV0X2VudW0sCisJCQkgICAgVURBMTM4MF9NSVhFUiwgNCwgdWRhMTM4MF9zZGV0X3NldHRpbmcpOwkvKiBTRF9WQUxVRSAqLworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHVkYTEzODBfb3NfZW51bSwKKwkJCSAgICBVREExMzgwX01JWEVSLCAwLCB1ZGExMzgwX29zX3NldHRpbmcpOwkvKiBPUyAqLwogCiAvKgogICogZnJvbSAtNDggZEIgaW4gMS41IGRCIHN0ZXBzIChtdXRlIGluc3RlYWQgb2YgLTQ5LjUgZEIpCkBAIC01NjQsOCArNTY2LDcgQEAKIHN0YXRpYyB2b2lkIHVkYTEzODBfcGNtX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwogCXUxNiBjbGsgPSB1ZGExMzgwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBVREExMzgwX0NMSyk7CiAKIAkvKiBzaHV0IGRvd24gV1NQTEwgcG93ZXIgaWYgcnVubmluZyBmcm9tIHRoaXMgY2xvY2sgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCmluZGV4IGI3YWIyZWYuLjZiZTVmODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCXJldHVybiAwOwogCiAJLyogRG8gbm90IGFsbG93IGNoYW5nZXMgd2hpbGUgc3RyZWFtIGlzIHJ1bm5pbmcgKi8KLQlpZiAoY29kZWMtPmFjdGl2ZSkKKwlpZiAoc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDwgMCB8fApAQCAtMjA5LDggKzIwOSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd2wxMjczX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh3bDEyNzNfYXVkaW9fcm91dGUpLCB3bDEyNzNfYXVkaW9fcm91dGUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh3bDEyNzNfZW51bSwgd2wxMjczX2F1ZGlvX3JvdXRlKTsKIAogc3RhdGljIGludCBzbmRfd2wxMjczX2ZtX2F1ZGlvX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTI0Nyw5ICsyNDYsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdsMTI3M19hdWRpb19zdHJpbmdzW10gPSB7ICJEaWdpdGFsIiwgIkFuYWxvZyIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bDEyNzNfYXVkaW9fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHdsMTI3M19hdWRpb19zdHJpbmdzKSwKLQkJCSAgICB3bDEyNzNfYXVkaW9fc3RyaW5ncyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHdsMTI3M19hdWRpb19lbnVtLCB3bDEyNzNfYXVkaW9fc3RyaW5ncyk7CiAKIHN0YXRpYyBpbnQgc25kX3dsMTI3M19mbV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCmluZGV4IDhhZTUwMjcuLjgzYTJjODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYwpAQCAtNzg2LDggKzc4Niw2IEBACiB7CiAJc3RydWN0IHdtMjAwMF9wcml2ICp3bTIwMDAgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CiAKLQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDgsIFNORF9TT0NfUkVHTUFQKTsKLQogCS8qIFRoaXMgd2lsbCB0cmlnZ2VyIGEgdHJhbnNpdGlvbiB0byBzdGFuZGJ5IG1vZGUgYnkgZGVmYXVsdCAqLwogCXdtMjAwMF9hbmNfc2V0X21vZGUod20yMDAwKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMKaW5kZXggNTdiYTMxNS4uMmU3MjFlMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jCkBAIC0xMTEzLDExICsxMTEzLDEwIEBACiAJIk5vbmUiLCAiSU4xIiwgIklOMiIsICJJTjMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTIyMDBfcnhhbmNfaW5wdXRfc2VsID0KLQlTT0NfRU5VTV9TSU5HTEUoV00yMjAwX1JYQU5DX1NSQywKLQkJCVdNMjIwMF9JTl9SWEFOQ19TRUxfU0hJRlQsCi0JCQlBUlJBWV9TSVpFKHdtMjIwMF9yeGFuY19pbnB1dF9zZWxfdGV4dHMpLAotCQkJd20yMjAwX3J4YW5jX2lucHV0X3NlbF90ZXh0cyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod20yMjAwX3J4YW5jX2lucHV0X3NlbCwKKwkJCSAgICBXTTIyMDBfUlhBTkNfU1JDLAorCQkJICAgIFdNMjIwMF9JTl9SWEFOQ19TRUxfU0hJRlQsCisJCQkgICAgd20yMjAwX3J4YW5jX2lucHV0X3NlbF90ZXh0cyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTIyMDBfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFKCJJTjEgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTIyMDBfSU4xTF9DT05UUk9MLApAQCAtMTI4OCwxMSArMTI4NywxMCBAQAogCSJPVVQxTCIsICJPVVQxUiIsICJPVVQyTCIsICJPVVQyUiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtMjIwMF9hZWNfbG9vcGJhY2sgPQotCVNPQ19FTlVNX1NJTkdMRShXTTIyMDBfREFDX0FFQ19DT05UUk9MXzEsCi0JCQlXTTIyMDBfQUVDX0xPT1BCQUNLX1NSQ19TSElGVCwKLQkJCUFSUkFZX1NJWkUod20yMjAwX2FlY19sb29wYmFja190ZXh0cyksCi0JCQl3bTIyMDBfYWVjX2xvb3BiYWNrX3RleHRzKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTIyMDBfYWVjX2xvb3BiYWNrLAorCQkJICAgIFdNMjIwMF9EQUNfQUVDX0NPTlRST0xfMSwKKwkJCSAgICBXTTIyMDBfQUVDX0xPT1BCQUNLX1NSQ19TSElGVCwKKwkJCSAgICB3bTIyMDBfYWVjX2xvb3BiYWNrX3RleHRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtMjIwMF9hZWNfbG9vcGJhY2tfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBRUMgTG9vcGJhY2siLCB3bTIyMDBfYWVjX2xvb3BiYWNrKTsKQEAgLTE1NTYsMTUgKzE1NTQsOCBAQAogCWludCByZXQ7CiAKIAl3bTIyMDAtPmNvZGVjID0gY29kZWM7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtMjIwMC0+cmVnbWFwOwogCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHdtX2Fkc3AxX2Z3X2NvbnRyb2xzLCAyKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwppbmRleCA0ZTNlMzFhLi5lY2E5ODNmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKQEAgLTUwNiwyMSArNTA2LDIxIEBACiAJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYxX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjFfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjJfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYzX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYzXzEsIFdNNTEwMF9MSFBGM19NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjNfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEYzXzEsIFdNNTEwMF9MSFBGM19NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGY0X21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULCAyLAotCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTUxMDBfbGhwZjRfbW9kZSwKKwkJCSAgICBXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULAorCQkJICAgIHdtNTEwMF9saHBmX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTUxMDBfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFKCJJTjEgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfSU4xTF9DT05UUk9MLApAQCAtMjEwMCw2ICsyMTAwLDcgQEAKIGludCB3bTUxMDBfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaykKIHsKIAlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCWlmIChqYWNrKSB7CiAJCXdtNTEwMC0+amFjayA9IGphY2s7CkBAIC0yMTE3LDkgKzIxMTgsMTQgQEAKIAkJCQkgICAgV001MTAwX0FDQ0RFVF9SQVRFX01BU0spOwogCiAJCS8qIFdlIG5lZWQgdGhlIGNoYXJnZSBwdW1wIHRvIHBvd2VyIE1JQ0JJQVMgKi8KLQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiQ1AyIik7Ci0JCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOwotCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQ1AyIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTWVNDTEsiKTsKKworCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJCS8qIFdlIHN0YXJ0IG9mZiBqdXN0IGVuYWJsaW5nIG1pY3JvcGhvbmUgZGV0ZWN0aW9uIC0gZXZlbiBhCiAJCSAqIHBsYWluIGhlYWRwaG9uZSB3aWxsIHRyaWdnZXIgZGV0ZWN0aW9uLgpAQCAtMjMzNywxMyArMjM0Myw2IEBACiAJaW50IHJldCwgaTsKIAogCXdtNTEwMC0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd201MTAwLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDBfZGlnX3Z1KTsgaSsrKQogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3bTUxMDBfZGlnX3Z1W2ldLCBXTTUxMDBfT1VUX1ZVLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMKaW5kZXggY2U5YzhlMS4uZGNmMWQxMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jCkBAIC01ODIsNyArNTgyLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC02MjIsMTMgKzYyMiwxNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtNTEwMl9ocG91dF9vc3JbXSA9IHsKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMUwsCi0JCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMkwsCi0JCQkgICAgICBBUklaT05BX09VVDJfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDJfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfM0wsCi0JCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9vc3JfdGV4dCksCiAJCQkgICAgICB3bTUxMDJfb3NyX3RleHQsIHdtNTEwMl9vc3JfdmFsKSwKIH07CiAKQEAgLTY4NSwxNSArNjg4LDggQEAKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRMyIsIEFSSVpPTkFfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRNCIsIEFSSVpPTkFfRVE0TUlYX0lOUFVUXzFfU09VUkNFKSwKIAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTEgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTFfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVExX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzEsIDIxLAotCQkgICBBUklaT05BX0VRMl9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTNfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTQgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTRfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVE0X0VOQV9NQVNLKSwKLQorU05EX1NPQ19CWVRFUygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMSBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVExXzIsIEFSSVpPTkFfRVExX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMSBCMSBWb2x1bWUiLCBBUklaT05BX0VRMV8xLCBBUklaT05BX0VRMV9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjJfR0FJTl9TSElGVCwKQEAgLTcwNSw2ICs3MDEsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMSBCNSBWb2x1bWUiLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMiBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEyXzIsIEFSSVpPTkFfRVEyX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMiBCMSBWb2x1bWUiLCBBUklaT05BX0VRMl8xLCBBUklaT05BX0VRMl9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjJfR0FJTl9TSElGVCwKQEAgLTcxNiw2ICs3MTQsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMiBCNSBWb2x1bWUiLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEzIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEzXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMyBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEzXzIsIEFSSVpPTkFfRVEzX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMyBCMSBWb2x1bWUiLCBBUklaT05BX0VRM18xLCBBUklaT05BX0VRM19CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjJfR0FJTl9TSElGVCwKQEAgLTcyNyw2ICs3MjcsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMyBCNSBWb2x1bWUiLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRNCBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVE0XzIsIEFSSVpPTkFfRVE0X0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRNCBCMSBWb2x1bWUiLCBBUklaT05BX0VRNF8xLCBBUklaT05BX0VRNF9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjJfR0FJTl9TSElGVCwKQEAgLTE3NTgsOSArMTc2MCw3IEBACiAJc3RydWN0IHdtNTEwMl9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMKaW5kZXggMmMzYzk2Mi4uZGY1YTM4ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC0yNDcsMTUgKzI0Nyw4IEBACiBBUklaT05BX01JWEVSX0NPTlRST0xTKCJFUTMiLCBBUklaT05BX0VRM01JWF9JTlBVVF8xX1NPVVJDRSksCiBBUklaT05BX01JWEVSX0NPTlRST0xTKCJFUTQiLCBBUklaT05BX0VRNE1JWF9JTlBVVF8xX1NPVVJDRSksCiAKLVNORF9TT0NfQllURVNfTUFTSygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzEsIDIxLAotCQkgICBBUklaT05BX0VRMV9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMiBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMl8xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTJfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTMgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTNfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVEzX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzEsIDIxLAotCQkgICBBUklaT05BX0VRNF9FTkFfTUFTSyksCi0KK1NORF9TT0NfQllURVMoIkVRMSBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMV8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTEgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVExIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVExXzEsIEFSSVpPTkFfRVExX0IyX0dBSU5fU0hJRlQsCkBAIC0yNjcsNiArMjYwLDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMiwgQVJJWk9OQV9FUTFfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRMiBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRMl8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTIgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVEyIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVEyXzEsIEFSSVpPTkFfRVEyX0IyX0dBSU5fU0hJRlQsCkBAIC0yNzgsNiArMjczLDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMiwgQVJJWk9OQV9FUTJfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18zLCAxOSksCitTT0NfU0lOR0xFKCJFUTMgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVEzIEIyIFZvbHVtZSIsIEFSSVpPTkFfRVEzXzEsIEFSSVpPTkFfRVEzX0IyX0dBSU5fU0hJRlQsCkBAIC0yODksNiArMjg2LDggQEAKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjUgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMiwgQVJJWk9OQV9FUTNfQjVfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiAKK1NORF9TT0NfQllURVMoIkVRNCBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRNF8zLCAxOSksCitTT0NfU0lOR0xFKCJFUTQgTW9kZSBTd2l0Y2giLCBBUklaT05BX0VRNF8yLCBBUklaT05BX0VRNF9CMV9NT0RFLCAxLCAwKSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjEgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjFfR0FJTl9TSElGVCwKIAkgICAgICAgMjQsIDAsIGVxX3RsdiksCiBTT0NfU0lOR0xFX1RMVigiRVE0IEIyIFZvbHVtZSIsIEFSSVpPTkFfRVE0XzEsIEFSSVpPTkFfRVE0X0IyX0dBSU5fU0hJRlQsCkBAIC0xNTg4LDEwICsxNTg3LDkgQEAKIAlzdHJ1Y3Qgd201MTEwX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHByaXYtPmNvcmUuYXJpem9uYS0+cmVnbWFwOwogCXByaXYtPmNvcmUuYXJpem9uYS0+ZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKaW5kZXggYTE4M2RjZi4uNzU3MjU2YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC0xNTA1LDkgKzE1MDUsNyBAQAogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTgzNTAtPnJlZ21hcDsKLQotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCB3bTgzNTAtPnJlZ21hcCk7CiAKIAkvKiBQdXQgdGhlIGNvZGVjIGludG8gcmVzZXQgaWYgaXQgd2Fzbid0IGFscmVhZHkgKi8KIAl3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUsIFdNODM1MF9DT0RFQ19FTkEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKaW5kZXggNmQ2ODRkOS4uMTQ2NTY0ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jCkBAIC0xMzE2LDEwICsxMzE2LDkgQEAKIAogCXNuZF9zb2NfY29kZWNfc2V0X2RydmRhdGEoY29kZWMsIHByaXYpOwogCXByaXYtPndtODQwMCA9IHdtODQwMDsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204NDAwLT5yZWdtYXA7CiAJcHJpdi0+Y29kZWMgPSBjb2RlYzsKIAotCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCB3bTg0MDAtPnJlZ21hcCk7CiAKIAlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCh3bTg0MDAtPmRldiwKIAkJCQkgQVJSQVlfU0laRShwb3dlciksICZwb3dlclswXSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwppbmRleCA3ZGY3ZDQ1Li4xYzFlMzI4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKQEAgLTU4OSwyMCArNTg5LDEyIEBACiAKIHN0YXRpYyBpbnQgd204NTEwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIndtODUxMDogZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODUxMF9yZXNldChjb2RlYyk7CiAKIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAl3bTg1MTBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHBvd2VyIGRvd24gY2hpcCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKaW5kZXggNzRkMTA2ZC4uNjAxZWU4MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCkBAIC03NSw4ICs3NSw4IEBACiAJIjIwNDgiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg1MjNfemNfY291bnQgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg1MjNfWkVST19ERVRFQ1QsIDAsIDIsIHdtODUyM196ZF9jb3VudF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg1MjNfemNfY291bnQsIFdNODUyM19aRVJPX0RFVEVDVCwgMCwKKwkJCSAgICB3bTg1MjNfemRfY291bnRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg1MjNfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFdNODUyM19EQUNfR0FJTkwsIFdNODUyM19EQUNfR0FJTlIsCkBAIC0zOTIsMTggKzM5MiwxMSBAQAogc3RhdGljIGludCB3bTg1MjNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg1MjNfcHJpdiAqd204NTIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAogCXdtODUyMy0+cmF0ZV9jb25zdHJhaW50Lmxpc3QgPSAmd204NTIzLT5yYXRlX2NvbnN0cmFpbnRfbGlzdFswXTsKIAl3bTg1MjMtPnJhdGVfY29uc3RyYWludC5jb3VudCA9CiAJCUFSUkFZX1NJWkUod204NTIzLT5yYXRlX2NvbnN0cmFpbnRfbGlzdCk7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIENoYW5nZSBzb21lIGRlZmF1bHQgc2V0dGluZ3MgLSBsYXRjaCBWVSBhbmQgZW5hYmxlIFpDICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTIzX0RBQ19HQUlOUiwKIAkJCSAgICBXTTg1MjNfREFDUl9WVSwgV004NTIzX0RBQ1JfVlUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKaW5kZXggMzE4OTg5YS4uYWY3ZWQ4YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCkBAIC01MDQsOCArNTA0LDcgQEAKIAkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1MTYgcGFpZmEgPSAwOwogCXUxNiBwYWlmYiA9IDA7CkBAIC04NjksMTIgKzg2OCw2IEBACiAJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODU4MC0+c3VwcGxpZXMpLAogCQkJCSAgICB3bTg1ODAtPnN1cHBsaWVzKTsKIAlpZiAocmV0ICE9IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCmluZGV4IGQ5OWY5NDguLmIwZmJjYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAogCS8qIGRlYWN0aXZhdGUgKi8KLQlpZiAoIWNvZGVjLT5hY3RpdmUpIHsKKwlpZiAoIXNuZF9zb2NfY29kZWNfaXNfYWN0aXZlKGNvZGVjKSkgewogCQl1ZGVsYXkoNTApOwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MTFfQUNUSVZFLCAweDApOwogCX0KQEAgLTM2NywxMiArMzY3LDYgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gd204NzExX3Jlc2V0KGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKaW5kZXggY2Q4OTAzMy4uYmFjN2ZjMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCkBAIC0yMjgsMTkgKzIyOCwxMCBAQAogCiBzdGF0aWMgaW50IHdtODcyOF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3Mjg6IGZhaWxlZCB0byBjb25maWd1cmUgY2FjaGUgSS9POiAlZFxuIiwKLQkJICAgICAgIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogcG93ZXIgb24gZGV2aWNlICovCiAJd204NzI4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODcyOF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKaW5kZXggMDI5NzIwMy4uZDc0ZjQzOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCkBAIC04Myw4ICs4Myw4IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg3MzFfaW5wdXRfc2VsZWN0W10gPSB7IkxpbmUgSW4iLCAiTWljIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzMxX2luc2VsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzFfQVBBTkEsIDIsIDIsIHdtODczMV9pbnB1dF9zZWxlY3QpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODczMV9pbnNlbF9lbnVtLAorCQkJICAgIFdNODczMV9BUEFOQSwgMiwgd204NzMxX2lucHV0X3NlbGVjdCk7CiAKIHN0YXRpYyBpbnQgd204NzMxX2RlZW1waFtdID0geyAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH07CiAKQEAgLTU4MywxMyArNTgzLDYgQEAKIAlzdHJ1Y3Qgd204NzMxX3ByaXYgKndtODczMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQgPSAwLCBpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODczMS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMS0+c3VwcGxpZXMpOyBpKyspCiAJCXdtODczMS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204NzMxX3N1cHBseV9uYW1lc1tpXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKaW5kZXggMmYxNjdhOC4uYjI3ZjI2Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYwpAQCAtOTksMjkgKzk5LDI5IEBACiAJIjEwMCUiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtaWNiaWFzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfTUlDX1BSRUFNUF9DT05UUk9MLCAwLCA0LCBtaWNiaWFzX2VudW1fdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWljYmlhc19lbnVtLAorCQkJICAgIFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDAsIG1pY2JpYXNfZW51bV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmxvd19jdXRvZmZfdGV4dFtdID0gewogCSJMb3ciLCAiSGlnaCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbG93XzNkID0KLQlTT0NfRU5VTV9TSU5HTEUoV004NzM3XzNEX0VOSEFOQ0UsIDYsIDIsIGxvd19jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobG93XzNkLAorCQkJICAgIFdNODczN18zRF9FTkhBTkNFLCA2LCBsb3dfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqaGlnaF9jdXRvZmZfdGV4dFtdID0gewogCSJIaWdoIiwgIkxvdyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaGlnaF8zZCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN18zRF9FTkhBTkNFLCA1LCAyLCBoaWdoX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChoaWdoXzNkLAorCQkJICAgIFdNODczN18zRF9FTkhBTkNFLCA1LCBoaWdoX2N1dG9mZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19mbl90ZXh0W10gPSB7CiAJIkRpc2FibGVkIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGNfZm4gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMSwgNywgNCwgYWxjX2ZuX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19mbiwKKwkJCSAgICBXTTg3MzdfQUxDMSwgNywgYWxjX2ZuX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX2hvbGRfdGV4dFtdID0gewogCSIwIiwgIjIuNjdtcyIsICI1LjMzbXMiLCAiMTAuNjZtcyIsICIyMS4zMm1zIiwgIjQyLjY0bXMiLCAiODUuMjhtcyIsCkBAIC0xMjksMjQgKzEyOSwyNCBAQAogCSIxMC45MTZzIiwgIjIxLjgzMnMiLCAiNDMuNjkxcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjX2hvbGQgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMiwgMCwgMTYsIGFsY19ob2xkX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19ob2xkLAorCQkJICAgIFdNODczN19BTEMyLCAwLCBhbGNfaG9sZF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19hdGtfdGV4dFtdID0gewogCSI4LjRtcyIsICIxNi44bXMiLCAiMzMuNm1zIiwgIjY3LjJtcyIsICIxMzQuNG1zIiwgIjI2OC44bXMiLCAiNTM3LjZtcyIsCiAJIjEuMDc1cyIsICIyLjE1cyIsICI0LjNzIiwgIjguNnMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19hdGsgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMywgMCwgMTEsIGFsY19hdGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2F0aywKKwkJCSAgICBXTTg3MzdfQUxDMywgMCwgYWxjX2F0a190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19kY3lfdGV4dFtdID0gewogCSIzMy42bXMiLCAiNjcuMm1zIiwgIjEzNC40bXMiLCAiMjY4LjhtcyIsICI1MzcuNm1zIiwgIjEuMDc1cyIsICIyLjE1cyIsCiAJIjQuM3MiLCAiOC42cyIsICIxNy4ycyIsICIzNC40MXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19kY3kgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQUxDMywgNCwgMTEsIGFsY19kY3lfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2RjeSwKKwkJCSAgICBXTTg3MzdfQUxDMywgNCwgYWxjX2RjeV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODczN19zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIk1pYyBCb29zdCBWb2x1bWUiLCBXTTg3MzdfQVVESU9fUEFUSF9MLCBXTTg3MzdfQVVESU9fUEFUSF9SLApAQCAtMTkxLDggKzE5MSw4IEBACiAJIkxJTlBVVDEiLCAiTElOUFVUMiIsICJMSU5QVVQzIiwgIkxJTlBVVDEgREMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5zZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19BVURJT19QQVRIX0wsIDcsIDQsIGxpbnNlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5zZWxfZW51bSwKKwkJCSAgICBXTTg3MzdfQVVESU9fUEFUSF9MLCA3LCBsaW5zZWxfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5zZWxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMSU5TRUwiLCBsaW5zZWxfZW51bSk7CkBAIC0yMDIsOCArMjAyLDggQEAKIAkiUklOUFVUMSIsICJSSU5QVVQyIiwgIlJJTlBVVDMiLCAiUklOUFVUMSBEQyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnNlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004NzM3X0FVRElPX1BBVEhfUiwgNywgNCwgcmluc2VsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnNlbF9lbnVtLAorCQkJICAgIFdNODczN19BVURJT19QQVRIX1IsIDcsIHJpbnNlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbnNlbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJJTlNFTCIsIHJpbnNlbF9lbnVtKTsKQEAgLTIxMiwxNSArMjEyLDE1IEBACiAJIkRpcmVjdCIsICJQcmVhbXAiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxieXBhc3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDIsIDIsIGJ5cGFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsYnlwYXNzX2VudW0sCisJCQkgICAgV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMiwgYnlwYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGJ5cGFzc19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQnlwYXNzIiwgbGJ5cGFzc19lbnVtKTsKIAogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJieXBhc3NfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczN19NSUNfUFJFQU1QX0NPTlRST0wsIDMsIDIsIGJ5cGFzc190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyYnlwYXNzX2VudW0sCisJCQkgICAgV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMywgYnlwYXNzX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmJ5cGFzc19tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQnlwYXNzIiwgcmJ5cGFzc19lbnVtKTsKQEAgLTU3MCwxMiArNTcwLDYgQEAKIAlzdHJ1Y3Qgd204NzM3X3ByaXYgKndtODczNyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204NzM3LT5zdXBwbGllcyksCiAJCQkJICAgIHdtODczNy0+c3VwcGxpZXMpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtNjQ0LDcgKzYzOCw3IEBACiAJLnZvbGF0aWxlX3JlZyA9IHdtODczN192b2xhdGlsZSwKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQogc3RhdGljIGludCB3bTg3MzdfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewpAQCAtNzU4LDcgKzc1Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB3bTg3MzdfbW9kaW5pdCh2b2lkKQogewogCWludCByZXQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NzM3X2kyY19kcml2ZXIpOwogCWlmIChyZXQgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBXTTg3MzcgSTJDIGRyaXZlcjogJWRcbiIsCkBAIC03ODEsNyArNzc1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NzM3X3NwaV9kcml2ZXIpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlpMmNfZGVsX2RyaXZlcigmd204NzM3X2kyY19kcml2ZXIpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwppbmRleCAyODk1YzhkLi5iMzM1NDJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbV004NzQxX05VTV9TVVBQTElFU107CiAJdW5zaWduZWQgaW50IHN5c2NsazsKLQlzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKnN5c2Nsa19jb25zdHJhaW50czsKKwljb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKnN5c2Nsa19jb25zdHJhaW50czsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgd204NzQxX3JlZ19kZWZhdWx0c1tdID0gewpAQCAtMTIyLDc0ICsxMjIsNzQgQEAKIAl7IDYsIDc2OCB9LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18xMTI4OVtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xMTI4OVtdID0gewogCTQ0MTAwLCA4ODIzNSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTEyODkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzExMjg5ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTEyODkpLAogCS5saXN0CT0gcmF0ZXNfMTEyODksCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzEyMjg4W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzEyMjg4W10gPSB7CiAJMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIyODggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyMjg4ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIyODgpLAogCS5saXN0CT0gcmF0ZXNfMTIyODgsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzE2Mzg0W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzE2Mzg0W10gPSB7CiAJMzIwMDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzE2Mzg0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xNjM4NCA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzE2Mzg0KSwKIAkubGlzdAk9IHJhdGVzXzE2Mzg0LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18xNjkzNFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xNjkzNFtdID0gewogCTQ0MTAwLCA4ODIzNSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTY5MzQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzE2OTM0ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTY5MzQpLAogCS5saXN0CT0gcmF0ZXNfMTY5MzQsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzE4NDMyW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzE4NDMyW10gPSB7CiAJNDgwMDAsIDk2MDAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xODQzMiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTg0MzIgPSB7CiAJLmNvdW50CT0gQVJSQVlfU0laRShyYXRlc18xODQzMiksCiAJLmxpc3QJPSByYXRlc18xODQzMiwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfMjI1NzlbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMjI1NzlbXSA9IHsKIAk0NDEwMCwgODgyMzUsIDE3NjQwMDAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMjI1NzkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzIyNTc5ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMjI1NzkpLAogCS5saXN0CT0gcmF0ZXNfMjI1NzksCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzI0NTc2W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzI0NTc2W10gPSB7CiAJMzIwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzI0NTc2ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18yNDU3NiA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzI0NTc2KSwKIAkubGlzdAk9IHJhdGVzXzI0NTc2LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc18zNjg2NFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18zNjg2NFtdID0gewogCTQ4MDAwLCA5NjAwMCwgMTkyMDAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMzY4NjQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzM2ODY0ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMzY4NjQpLAogCS5saXN0CT0gcmF0ZXNfMzY4NjQsCiB9OwpAQCAtNDI5LDEyICs0MjksNiBAQAogCQlnb3RvIGVycl9nZXQ7CiAJfQogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9lbmFibGU7Ci0JfQotCiAJcmV0ID0gd204NzQxX3Jlc2V0KGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXRcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKaW5kZXggNzg2MTZhNi4uMzM5OTBiNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCkBAIC03MDIsMTIgKzcwMiw2IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTA6IGZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg3NTBfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAid204NzUwOiBmYWlsZWQgdG8gcmVzZXQ6ICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKaW5kZXggYmU4NWRhOS4uY2JiOGQ1NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAlpZiAod204NzUzLT5kYWlfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY29kZWMtPmFjdGl2ZSkKKwlpZiAoc25kX3NvY19jb2RlY19pc19hY3RpdmUoY29kZWMpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaW9jdGwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1M19JT0NUTCk7CkBAIC0xMzE0LDcgKzEzMTQsNyBAQAogCS8qIHRoZSBkaWdpdGFsIG11dGUgY292ZXJzIHRoZSBIaUZpIGFuZCBWb2ljZSBEQUMncyBvbiB0aGUgV004NzUzLgogCSAqIG1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGV5IGFyZSBub3QgYm90aCBhY3RpdmUgd2hlbiB3ZSBtdXRlICovCiAJaWYgKG11dGUgJiYgd204NzUzLT5kYWlfZnVuYyA9PSAxKSB7Ci0JCWlmICghY29kZWMtPmFjdGl2ZSkKKwkJaWYgKCFzbmRfc29jX2NvZGVjX2lzX2FjdGl2ZShjb2RlYykpCiAJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTNfREFDLCBtdXRlX3JlZyB8IDB4OCk7CiAJfSBlbHNlIHsKIAkJaWYgKG11dGUpCkBAIC0xNDQwLDcgKzE0NDAsNiBAQAogc3RhdGljIGludCB3bTg3NTNfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKLQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NzEsMTMgKzE0NzAsNiBAQAogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywgd204NzUzX3dvcmspOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODc1My0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODc1M19yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCmluZGV4IDViY2UyMTAuLmM2MWFlYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYwpAQCAtNTgwLDEyICs1ODAsNiBAQAogCXdtODc3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXdtODc3MC0+Y29kZWMgPSBjb2RlYzsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODc3MC0+c3VwcGxpZXMpLAogCQkJCSAgICB3bTg3NzAtPnN1cHBsaWVzKTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwppbmRleCBlZjgyNDY3Li43MDk1MmNlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKQEAgLTQzMCwxMiArNDMwLDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODc3Nl9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCmluZGV4IDliYzgyMDYuLmVlNzZmMGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYwpAQCAtOTIsNyArOTIsNyBAQAogV004ODA0X1JFR1VMQVRPUl9FVkVOVCgxKQogCiBzdGF0aWMgY29uc3QgY2hhciAqdHhzcmNfdGV4dFtdID0geyAiUy9QRElGIFJYIiwgIkFJRiIgfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodHhzcmMsIHR4c3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0eHNyYywgdHhzcmNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg4MDRfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0VOVU1fRVhUKCJJbnB1dCBTb3VyY2UiLCB0eHNyYywgdHhzcmNfZ2V0LCB0eHNyY19wdXQpLApAQCAtNTQ2LDE0ICs1NDYsNiBAQAogCiAJd204ODA0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204ODA0LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgaS9vOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKTsgaSsrKQogCQl3bTg4MDQtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODgwNF9zdXBwbHlfbmFtZXNbaV07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCmluZGV4IDQzYzIyMDEuLmQwOWZkY2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpAQCAtMTE3OCwxMyArMTE3OCw3IEBACiAKIHN0YXRpYyBpbnQgd204OTAwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0ID0gMCwgcmVnOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaW50IHJlZzsKIAogCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19JRCk7CiAJaWYgKHJlZyAhPSAweDg5MDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCmluZGV4IGVlYmNiMWQuLmIwMDg0YTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYwpAQCAtNDg5LDI4ICs0ODksMjggQEAKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FEQ19ESUdJVEFMXzAsIDUsIDQsIGhwZl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwZl9tb2RlLAorCQkJICAgIFdNODkwM19BRENfRElHSVRBTF8wLCA1LCBocGZfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm9zcl90ZXh0W10gPSB7CiAJIkxvdyBwb3dlciIsICJIaWdoIHBlcmZvcm1hbmNlIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfb3NyID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FOQUxPR1VFX0FEQ18wLCAwLCAyLCBvc3JfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRjX29zciwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfQURDXzAsIDAsIG9zcl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfb3NyID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDAsIDIsIG9zcl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfb3NyLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8xLCAwLCBvc3JfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfc2xvcGVfdGV4dFtdID0gewogCSIxIiwgIjEvMiIsICIxLzQiLCAiMS84IiwgIjEvMTYiLCAiMCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX3Nsb3BlX3IwID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18yLCAzLCA2LCBkcmNfc2xvcGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3Nsb3BlX3IwLAorCQkJICAgIFdNODkwM19EUkNfMiwgMywgZHJjX3Nsb3BlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbG9wZV9yMSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMiwgMCwgNiwgZHJjX3Nsb3BlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19zbG9wZV9yMSwKKwkJCSAgICBXTTg5MDNfRFJDXzIsIDAsIGRyY19zbG9wZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19hdHRhY2tfdGV4dFtdID0gewogCSJpbnN0YW50YW5lb3VzIiwKQEAgLTUxOCwxMjUgKzUxOCwxMjUgQEAKIAkiNDYuNG1zIiwgIjkyLjhtcyIsICIxODUuNm1zIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfYXR0YWNrID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18xLCAxMiwgMTEsIGRyY19hdHRhY2tfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2F0dGFjaywKKwkJCSAgICBXTTg5MDNfRFJDXzEsIDEyLCBkcmNfYXR0YWNrX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2RlY2F5X3RleHRbXSA9IHsKIAkiMTg2bXMiLCAiMzcybXMiLCAiNzQzbXMiLCAiMS40OXMiLCAiMi45N3MiLCAiNS45NHMiLCAiMTEuODlzIiwKIAkiMjMuODdzIiwgIjQ3LjU2cyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2RlY2F5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18xLCA4LCA5LCBkcmNfZGVjYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2RlY2F5LAorCQkJICAgIFdNODkwM19EUkNfMSwgOCwgZHJjX2RlY2F5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2ZmX2RlbGF5X3RleHRbXSA9IHsKIAkiNSBzYW1wbGVzIiwgIjkgc2FtcGxlcyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2ZmX2RlbGF5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18wLCA1LCAyLCBkcmNfZmZfZGVsYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2ZmX2RlbGF5LAorCQkJICAgIFdNODkwM19EUkNfMCwgNSwgZHJjX2ZmX2RlbGF5X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3FyX2RlY2F5X3RleHRbXSA9IHsKIAkiMC43MjVtcyIsICIxLjQ1bXMiLCAiNS44bXMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19xcl9kZWNheSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMSwgNCwgMywgZHJjX3FyX2RlY2F5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9kZWNheSwKKwkJCSAgICBXTTg5MDNfRFJDXzEsIDQsIGRyY19xcl9kZWNheV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbW9vdGhpbmdfdGV4dFtdID0gewogCSJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbW9vdGhpbmcgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfRFJDXzAsIDExLCAzLCBkcmNfc21vb3RoaW5nX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19zbW9vdGhpbmcsCisJCQkgICAgV004OTAzX0RSQ18wLCAxMSwgZHJjX3Ntb290aGluZ190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNvZnRfbXV0ZV90ZXh0W10gPSB7CiAJIkZhc3QgKGZzLzIpIiwgIlNsb3cgKGZzLzMyKSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc29mdF9tdXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDEwLCAyLCBzb2Z0X211dGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc29mdF9tdXRlLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8xLCAxMCwgc29mdF9tdXRlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbXV0ZV9tb2RlX3RleHRbXSA9IHsKIAkiSGFyZCIsICJTb2Z0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtdXRlX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfREFDX0RJR0lUQUxfMSwgOSwgMiwgbXV0ZV9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG11dGVfbW9kZSwKKwkJCSAgICBXTTg5MDNfREFDX0RJR0lUQUxfMSwgOSwgbXV0ZV9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqY29tcGFuZGluZ190ZXh0W10gPSB7CiAJInVsYXciLCAiYWxhdyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2NvbXBhbmRpbmcgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDAsIDIsIGNvbXBhbmRpbmdfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2NvbXBhbmRpbmcsCisJCQkgICAgV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCAwLCBjb21wYW5kaW5nX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19jb21wYW5kaW5nID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCAyLCAyLCBjb21wYW5kaW5nX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19jb21wYW5kaW5nLAorCQkJICAgIFdNODkwM19BVURJT19JTlRFUkZBQ0VfMCwgMiwgY29tcGFuZGluZ190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmlucHV0X21vZGVfdGV4dFtdID0gewogCSJTaW5nbGUtRW5kZWQiLCAiRGlmZmVyZW50aWFsIExpbmUiLCAiRGlmZmVyZW50aWFsIE1pYyIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlucHV0X21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGlucHV0X21vZGVfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCAwLCBpbnB1dF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnB1dF9tb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgMCwgMywgaW5wdXRfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5wdXRfbW9kZV9lbnVtLAorCQkJICAgIFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAwLCBpbnB1dF9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbGlucHV0X211eF90ZXh0W10gPSB7CiAJIklOMUwiLCAiSU4yTCIsICJJTjNMIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5wdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDIsIDMsIGxpbnB1dF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGlucHV0X2VudW0sCisJCQkgICAgV004OTAzX0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMiwgbGlucHV0X211eF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5wdXRfaW52X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCA0LCAzLCBsaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxpbnB1dF9pbnZfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLCA0LCBsaW5wdXRfbXV4X3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmlucHV0X211eF90ZXh0W10gPSB7CiAJIklOMVIiLCAiSU4yUiIsICJJTjNSIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByaW5wdXRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAyLCAzLCByaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnB1dF9lbnVtLAorCQkJICAgIFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAyLCByaW5wdXRfbXV4X3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbnB1dF9pbnZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCA0LCAzLCByaW5wdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJpbnB1dF9pbnZfZW51bSwKKwkJCSAgICBXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgNCwgcmlucHV0X211eF90ZXh0KTsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqc2lkZXRvbmVfdGV4dFtdID0gewogCSJOb25lIiwgIkxlZnQiLCAiUmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxzaWRldG9uZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzAsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxzaWRldG9uZV9lbnVtLAorCQkJICAgIFdNODkwM19EQUNfRElHSVRBTF8wLCAyLCBzaWRldG9uZV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwM19EQUNfRElHSVRBTF8wLCAwLCAzLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5MDNfREFDX0RJR0lUQUxfMCwgMCwgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGNpbnB1dF90ZXh0W10gPSB7CiAJIkFEQyIsICJETUlDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNpbnB1dF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0NMT0NLX1JBVEVfVEVTVF80LCA5LCAyLCBhZGNpbnB1dF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNpbnB1dF9lbnVtLAorCQkJICAgIFdNODkwM19DTE9DS19SQVRFX1RFU1RfNCwgOSwgYWRjaW5wdXRfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphaWZfdGV4dFtdID0gewogCSJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsY2FwdHVyZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA3LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGNhcHR1cmVfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDcsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByY2FwdHVyZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA2LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmNhcHR1cmVfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDYsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBscGxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA1LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobHBsYXlfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDUsIGFpZl90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBycGxheV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCA0LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnBsYXlfZW51bSwKKwkJCSAgICBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDQsIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwM19zbmRfY29udHJvbHNbXSA9IHsKIApAQCAtMTg5NywyMSArMTg5NywxMyBAQAogc3RhdGljIGludCB3bTg5MDNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5MDNfcHJpdiAqd204OTAzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKIAogCXdtODkwMy0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTAzLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qIHBvd2VyIG9uIGRldmljZSAqLwogCXdtODkwM19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogcG93ZXIgZG93biBjaGlwICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwppbmRleCA1M2JiZmFjLi40OWMzNWMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKQEAgLTU1MiwxOCArNTUyLDIwIEBACiAJIlNpbmdsZS1FbmRlZCIsICJEaWZmZXJlbnRpYWwgTGluZSIsICJEaWZmZXJlbnRpYWwgTWljIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5fbW9kZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobGluX21vZGUsCisJCQkgICAgV004OTA0X0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMCwKKwkJCSAgICBpbnB1dF9tb2RlX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmluX21vZGUsCisJCQkgICAgV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDAsCisJCQkgICAgaW5wdXRfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmhwZl9tb2RlX3RleHRbXSA9IHsKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FEQ19ESUdJVEFMXzAsIDUsIDQsIGhwZl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwZl9tb2RlLCBXTTg5MDRfQURDX0RJR0lUQUxfMCwgNSwKKwkJCSAgICBocGZfbW9kZV90ZXh0KTsKIAogc3RhdGljIGludCB3bTg5MDRfYWRjX29zcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTYxMSw4ICs2MTMsNyBAQAogCSJBREMiLCAiREFDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcGF0aCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9EUkNfMCwgMTQsIDIsIGRyY19wYXRoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19wYXRoLCBXTTg5MDRfRFJDXzAsIDE0LCBkcmNfcGF0aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwNF9kYWNfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfU0lOR0xFX1RMVigiRGlnaXRhbCBQbGF5YmFjayBCb29zdCBWb2x1bWUiLCAKQEAgLTg1OCwxNCArODU5LDE0IEBACiAJIklOMUwiLCAiSU4yTCIsICJJTjNMIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDIsIDMsIGxpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5fZW51bSwgV004OTA0X0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgMiwKKwkJCSAgICBsaW5fdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5fbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IENhcHR1cmUgTXV4IiwgbGluX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxpbl9pbnZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDQsIDMsIGxpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5faW52X2VudW0sIFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDQsCisJCQkgICAgbGluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGluX2ludl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgQ2FwdHVyZSBJbnZldGluZyBNdXgiLCBsaW5faW52X2VudW0pOwpAQCAtODc0LDE0ICs4NzUsMTQgQEAKIAkiSU4xUiIsICJJTjJSIiwgIklOM1IiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDIsIDMsIHJpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5fZW51bSwgV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDIsCisJCQkgICAgcmluX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmluX211eCA9CiAJU09DX0RBUE1fRU5VTSgiUmlnaHQgQ2FwdHVyZSBNdXgiLCByaW5fZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmluX2ludl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX1JJR0hUX0lOUFVUXzEsIDQsIDMsIHJpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChyaW5faW52X2VudW0sIFdNODkwNF9BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCA0LAorCQkJICAgIHJpbl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbl9pbnZfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBDYXB0dXJlIEludmV0aW5nIE11eCIsIHJpbl9pbnZfZW51bSk7CkBAIC04OTAsMjYgKzg5MSwyNiBAQAogCSJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZvdXRsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDcsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZvdXRsX2VudW0sIFdNODkwNF9BVURJT19JTlRFUkZBQ0VfMCwgNywKKwkJCSAgICBhaWZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWZvdXRsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQUlGT1VUTCBNdXgiLCBhaWZvdXRsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZm91dHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BVURJT19JTlRFUkZBQ0VfMCwgNiwgMiwgYWlmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFpZm91dHJfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA2LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZm91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZPVVRSIE11eCIsIGFpZm91dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5sX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDUsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbmxfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA1LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZmlubF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRklOTCBNdXgiLCBhaWZpbmxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5yX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDRfQVVESU9fSU5URVJGQUNFXzAsIDQsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbnJfZW51bSwgV004OTA0X0FVRElPX0lOVEVSRkFDRV8wLCA0LAorCQkJICAgIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZmlucl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRklOUiBNdXgiLCBhaWZpbnJfZW51bSk7CkBAIC05OTEsMjYgKzk5MiwyNiBAQAogCSJEQUMiLCAiQnlwYXNzIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMywgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChocGxfZW51bSwgV004OTA0X0FOQUxPR1VFX09VVDEyX1pDLCAzLAorCQkJICAgIG91dF9tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUEwgTXV4IiwgaHBsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0FOQUxPR1VFX09VVDEyX1pDLCAyLCAyLCBvdXRfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGhwcl9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDIsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwcl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkhQUiBNdXgiLCBocHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGluZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMSwgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5lbF9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDEsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTElORUwgTXV4IiwgbGluZWxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGluZXJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9BTkFMT0dVRV9PVVQxMl9aQywgMCwgMiwgb3V0X211eF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChsaW5lcl9lbnVtLCBXTTg5MDRfQU5BTE9HVUVfT1VUMTJfWkMsIDAsCisJCQkgICAgb3V0X211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTElORVIgTXV4IiwgbGluZXJfZW51bSk7CkBAIC0xMDE5LDE0ICsxMDIwLDE0IEBACiAJIk5vbmUiLCAiTGVmdCIsICJSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjbF9zaWRldG9uZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTA0X0RBQ19ESUdJVEFMXzAsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY2xfc2lkZXRvbmVfZW51bSwgV004OTA0X0RBQ19ESUdJVEFMXzAsIDIsCisJCQkgICAgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWNsX3NpZGV0b25lX211eCA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTaWRldG9uZSBNdXgiLCBkYWNsX3NpZGV0b25lX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODkwNF9EQUNfRElHSVRBTF8wLCAwLCAzLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNyX3NpZGV0b25lX2VudW0sIFdNODkwNF9EQUNfRElHSVRBTF8wLCAwLAorCQkJICAgIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjcl9zaWRldG9uZV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIE11eCIsIGRhY3Jfc2lkZXRvbmVfZW51bSk7CkBAIC0xOTgxLDcgKzE5ODIsNyBAQAogCWRldl9kYmcoY29kZWMtPmRldiwgIkFsbG9jYXRlZCAlZCB1bmlxdWUgUmVUdW5lIE1vYmlsZSBuYW1lc1xuIiwKIAkJd204OTA0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0cyk7CiAKLQl3bTg5MDQtPnJldHVuZV9tb2JpbGVfZW51bS5tYXggPSB3bTg5MDQtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzOworCXdtODkwNC0+cmV0dW5lX21vYmlsZV9lbnVtLml0ZW1zID0gd204OTA0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0czsKIAl3bTg5MDQtPnJldHVuZV9tb2JpbGVfZW51bS50ZXh0cyA9IHdtODkwNC0+cmV0dW5lX21vYmlsZV90ZXh0czsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCAmY29udHJvbCwgMSk7CkBAIC0yMDIyLDcgKzIwMjMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9kcmNfY2ZnczsgaSsrKQogCQkJd204OTA0LT5kcmNfdGV4dHNbaV0gPSBwZGF0YS0+ZHJjX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5MDQtPmRyY19lbnVtLm1heCA9IHBkYXRhLT5udW1fZHJjX2NmZ3M7CisJCXdtODkwNC0+ZHJjX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX2RyY19jZmdzOwogCQl3bTg5MDQtPmRyY19lbnVtLnRleHRzID0gd204OTA0LT5kcmNfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsICZjb250cm9sLCAxKTsKQEAgLTIwNDcsOSArMjA0OCw2IEBACiBzdGF0aWMgaW50IHdtODkwNF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODkwNF9wcml2ICp3bTg5MDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODkwNC0+cmVnbWFwOwogCiAJc3dpdGNoICh3bTg5MDQtPmRldnR5cGUpIHsKIAljYXNlIFdNODkwNDoKQEAgLTIwNjMsMTIgKzIwNjEsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODkwNF9oYW5kbGVfcGRhdGEoY29kZWMpOwogCiAJd204OTA0X2FkZF93aWRnZXRzKGNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCmluZGV4IGI0MDRjMjYuLmZjNmVlYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYwpAQCAtMTU0LDIyICsxNTQsMjIgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5NDBfY29tcGFuZGluZ1tdID0geyAiT2ZmIiwgIk5DIiwgInUtbGF3IiwgIkEtbGF3IiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5NDBfYWRjX2NvbXBhbmRpbmdfZW51bQotPSBTT0NfRU5VTV9TSU5HTEUoV004OTQwX0NPTVBBTkRJTkdDVEwsIDEsIDQsIHdtODk0MF9jb21wYW5kaW5nKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTQwX2RhY19jb21wYW5kaW5nX2VudW0KLT0gU09DX0VOVU1fU0lOR0xFKFdNODk0MF9DT01QQU5ESU5HQ1RMLCAzLCA0LCB3bTg5NDBfY29tcGFuZGluZyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2FkY19jb21wYW5kaW5nX2VudW0sCisJCQkgICAgV004OTQwX0NPTVBBTkRJTkdDVEwsIDEsIHdtODk0MF9jb21wYW5kaW5nKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5NDBfZGFjX2NvbXBhbmRpbmdfZW51bSwKKwkJCSAgICBXTTg5NDBfQ09NUEFORElOR0NUTCwgMywgd204OTQwX2NvbXBhbmRpbmcpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTQwX2FsY19tb2RlX3RleHRbXSA9IHsiQUxDIiwgIkxpbWl0ZXIifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTQwX2FsY19tb2RlX2VudW0KLT0gU09DX0VOVU1fU0lOR0xFKFdNODk0MF9BTEMzLCA4LCAyLCB3bTg5NDBfYWxjX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2FsY19tb2RlX2VudW0sCisJCQkgICAgV004OTQwX0FMQzMsIDgsIHdtODk0MF9hbGNfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKndtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0W10gPSB7IjAuOSIsICIwLjY1In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk0MF9taWNfYmlhc19sZXZlbF9lbnVtCi09IFNPQ19FTlVNX1NJTkdMRShXTTg5NDBfSU5QVVRDVEwsIDgsIDIsIHdtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5NDBfbWljX2JpYXNfbGV2ZWxfZW51bSwKKwkJCSAgICBXTTg5NDBfSU5QVVRDVEwsIDgsIHdtODk0MF9taWNfYmlhc19sZXZlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKndtODk0MF9maWx0ZXJfbW9kZV90ZXh0W10gPSB7IkF1ZGlvIiwgIkFwcGxpY2F0aW9uIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk0MF9maWx0ZXJfbW9kZV9lbnVtCi09IFNPQ19FTlVNX1NJTkdMRShXTTg5NDBfQURDLCA3LCAyLCB3bTg5NDBfZmlsdGVyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTQwX2ZpbHRlcl9tb2RlX2VudW0sCisJCQkgICAgV004OTQwX0FEQywgNywgd204OTQwX2ZpbHRlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUod204OTQwX3Nwa192b2xfdGx2LCAtNTcwMCwgMTAwLCAxKTsKIHN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRSh3bTg5NDBfYXR0X3RsdiwgLTEwMDAsIDEwMDAsIDApOwpAQCAtNzEyLDEyICs3MTIsNiBAQAogCWludCByZXQ7CiAJdTE2IHJlZzsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg5NDBfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBpc3N1ZSByZXNldFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYwppbmRleCA4MmM4YmE5Li5mZWNkNGU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKQEAgLTQxNiwyMiArNDE2LDIxIEBACiAJIkxpbmVhciIsICJBZGFwdGl2ZSIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfbW9kZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk1NV9CQVNTX0NPTlRST0wsIDcsIDIsIGJhc3NfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChiYXNzX21vZGUsIFdNODk1NV9CQVNTX0NPTlRST0wsIDcsIGJhc3NfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfY3V0b2ZmX3RleHRbXSA9IHsKIAkiTG93IiwgIkhpZ2giCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfY3V0b2ZmID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTU1X0JBU1NfQ09OVFJPTCwgNiwgMiwgYmFzc19jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYmFzc19jdXRvZmYsIFdNODk1NV9CQVNTX0NPTlRST0wsIDYsCisJCQkgICAgYmFzc19jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0cmVibGVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiSGlnaCIsICJMb3ciCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRyZWJsZV9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NTVfVFJFQkxFX0NPTlRST0wsIDYsIDIsIHRyZWJsZV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHJlYmxlX2N1dG9mZiwgV004OTU1X1RSRUJMRV9DT05UUk9MLCAyLAorCQkJICAgIHRyZWJsZV9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYXR0ZW5fdGx2LCAtNjAwLCA2MDAsIDApOwpAQCAtODk2LDE0ICs4OTUsNiBAQAogCXN0cnVjdCB3bTg5NTVfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2KTsKIAlpbnQgcmV0LCBpOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk1NS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk1NS0+c3VwcGxpZXMpOyBpKyspCiAJCXdtODk1NS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204OTU1X3N1cHBseV9uYW1lc1tpXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jCmluZGV4IGQ0MjQ4ZTAuLjdhYzJlNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU4LWRzcDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1OC1kc3AyLmMKQEAgLTk0NCw3ICs5NDQsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9tYmNfY2ZnczsgaSsrKQogCQkJd204OTk0LT5tYmNfdGV4dHNbaV0gPSBwZGF0YS0+bWJjX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5OTQtPm1iY19lbnVtLm1heCA9IHBkYXRhLT5udW1fbWJjX2NmZ3M7CisJCXdtODk5NC0+bWJjX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX21iY19jZmdzOwogCQl3bTg5OTQtPm1iY19lbnVtLnRleHRzID0gd204OTk0LT5tYmNfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMod204OTk0LT5odWJzLmNvZGVjLApAQCAtOTczLDcgKzk3Myw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3Zzc19jZmdzOyBpKyspCiAJCQl3bTg5OTQtPnZzc190ZXh0c1tpXSA9IHBkYXRhLT52c3NfY2Znc1tpXS5uYW1lOwogCi0JCXdtODk5NC0+dnNzX2VudW0ubWF4ID0gcGRhdGEtPm51bV92c3NfY2ZnczsKKwkJd204OTk0LT52c3NfZW51bS5pdGVtcyA9IHBkYXRhLT5udW1fdnNzX2NmZ3M7CiAJCXdtODk5NC0+dnNzX2VudW0udGV4dHMgPSB3bTg5OTQtPnZzc190ZXh0czsKIAogCQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyh3bTg5OTQtPmh1YnMuY29kZWMsCkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV92c3NfaHBmX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+dnNzX2hwZl90ZXh0c1tpXSA9IHBkYXRhLT52c3NfaHBmX2NmZ3NbaV0ubmFtZTsKIAotCQl3bTg5OTQtPnZzc19ocGZfZW51bS5tYXggPSBwZGF0YS0+bnVtX3Zzc19ocGZfY2ZnczsKKwkJd204OTk0LT52c3NfaHBmX2VudW0uaXRlbXMgPSBwZGF0YS0+bnVtX3Zzc19ocGZfY2ZnczsKIAkJd204OTk0LT52c3NfaHBmX2VudW0udGV4dHMgPSB3bTg5OTQtPnZzc19ocGZfdGV4dHM7CiAKIAkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMod204OTk0LT5odWJzLmNvZGVjLApAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZW5oX2VxX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+ZW5oX2VxX3RleHRzW2ldID0gcGRhdGEtPmVuaF9lcV9jZmdzW2ldLm5hbWU7CiAKLQkJd204OTk0LT5lbmhfZXFfZW51bS5tYXggPSBwZGF0YS0+bnVtX2VuaF9lcV9jZmdzOworCQl3bTg5OTQtPmVuaF9lcV9lbnVtLml0ZW1zID0gcGRhdGEtPm51bV9lbmhfZXFfY2ZnczsKIAkJd204OTk0LT5lbmhfZXFfZW51bS50ZXh0cyA9IHdtODk5NC0+ZW5oX2VxX3RleHRzOwogCiAJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKHdtODk5NC0+aHVicy5jb2RlYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCmluZGV4IGYxNTYwMTAuLmQwNGU5Y2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwpAQCAtOTc2LDEyICs5NzYsNiBAQAogCQkJd204OTYwLT5zZXRfYmlhc19sZXZlbCA9IHdtODk2MF9zZXRfYmlhc19sZXZlbF9jYXBsZXNzOwogCX0KIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODk2MF9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCmluZGV4IDkwMDMyOGUuLjljODhmMDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYwpAQCAtMzE3LDE1ICszMTcsMTUgQEAKIAkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfaHBmID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYxX0FEQ19EQUNfQ09OVFJPTF8yLCA3LCA0LCBhZGNfaHBmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19ocGYsCisJCQkgICAgV004OTYxX0FEQ19EQUNfQ09OVFJPTF8yLCA3LCBhZGNfaHBmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGFjX2RlZW1waF90ZXh0W10gPSB7CiAJIk5vbmUiLCAiMzJrSHoiLCAiNDQuMWtIeiIsICI0OGtIeiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19kZWVtcGggPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjFfQURDX0RBQ19DT05UUk9MXzEsIDEsIDQsIGRhY19kZWVtcGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2RlZW1waCwKKwkJCSAgICBXTTg5NjFfQURDX0RBQ19DT05UUk9MXzEsIDEsIGRhY19kZWVtcGhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfdGx2LCAtMTIxMDAsIDEwMCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfc2VjX3RsdiwgLTcwMCwgMTAwLCAwKTsKQEAgLTM4NSwxMSArMzg1LDExIEBACiAJIk5vbmUiLCAiTGVmdCIsICJSaWdodCIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjbF9zaWRldG9uZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2MV9EU1BfU0lERVRPTkVfMCwgMiwgMywgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjbF9zaWRldG9uZSwKKwkJCSAgICBXTTg5NjFfRFNQX1NJREVUT05FXzAsIDIsIHNpZGV0b25lX3RleHQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc2lkZXRvbmUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjFfRFNQX1NJREVUT05FXzEsIDIsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY3Jfc2lkZXRvbmUsCisJCQkgICAgV004OTYxX0RTUF9TSURFVE9ORV8xLCAyLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJEQUNMIFNpZGV0b25lIiwgZGFjbF9zaWRldG9uZSk7CkBAIC04MzYsMTUgKzgzNiw4IEBACiBzdGF0aWMgaW50IHdtODk2MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCByZXQgPSAwOwogCXUxNiByZWc7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIEVuYWJsZSBjbGFzcyBXICovCiAJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjFfQ0hBUkdFX1BVTVBfQik7CiAJcmVnIHw9IFdNODk2MV9DUF9EWU5fUFdSX01BU0s7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwppbmRleCA5N2RiM2I0Li41NTIyZDI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKQEAgLTE0NzksNyArMTQ3OSw5IEBACiAKIHN0YXRpYyBpbnQgd204OTYyX2RzcDJfd3JpdGVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlyZXR1cm4gcmVnY2FjaGVfc3luY19yZWdpb24oY29kZWMtPmNvbnRyb2xfZGF0YSwKKwlzdHJ1Y3Qgd204OTYyX3ByaXYgKndtODk2MiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmV0dXJuIHJlZ2NhY2hlX3N5bmNfcmVnaW9uKHdtODk2Mi0+cmVnbWFwLAogCQkJCSAgICBXTTg5NjJfSERCQVNTX0FJXzEsIFdNODk2Ml9NQVhfUkVHSVNURVIpOwogfQogCkBAIC0xNjU4LDE2ICsxNjYwLDE2IEBACiAJIkhpLWZpIiwgIkFwcGxpY2F0aW9uIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjYXBfaHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfQURDX0RBQ19DT05UUk9MXzIsIDEwLCAyLCBjYXBfaHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2FwX2hwZl9tb2RlLAorCQkJICAgIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMiwgMTAsIGNhcF9ocGZfbW9kZV90ZXh0KTsKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqY2FwX2xocGZfbW9kZV90ZXh0W10gPSB7CiAJIkxQRiIsICJIUEYiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNhcF9saHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfTEhQRjEsIDEsIDIsIGNhcF9saHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2FwX2xocGZfbW9kZSwKKwkJCSAgICBXTTg5NjJfTEhQRjEsIDEsIGNhcF9saHBmX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5NjJfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfRE9VQkxFKCJJbnB1dCBNaXhlciBTd2l0Y2giLCBXTTg5NjJfSU5QVVRfTUlYRVJfQ09OVFJPTF8xLCAzLCAyLCAxLCAxKSwKQEAgLTIwMTQsNDAgKzIwMTYsNDAgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0X3RleHRbXSA9IHsgIk5vbmUiLCAiTGVmdCIsICJSaWdodCIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9EQUNfRFNQX01JWElOR18xLCAyLCAzLCBzdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdHJfZW51bSwKKwkJCSAgICBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMSwgMiwgc3RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBTaWRldG9uZSIsIHN0cl9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9EQUNfRFNQX01JWElOR18yLCAyLCAzLCBzdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGxfZW51bSwKKwkJCSAgICBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMiwgMiwgc3RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJMZWZ0IFNpZGV0b25lIiwgc3RsX2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqb3V0bXV4X3RleHRbXSA9IHsgIkRBQyIsICJNaXhlciIgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtvdXRyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5NjJfU1BFQUtFUl9NSVhFUl8yLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3Brb3V0cl9lbnVtLAorCQkJICAgIFdNODk2Ml9TUEVBS0VSX01JWEVSXzIsIDcsIG91dG11eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa291dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTUEtPVVRSIE11eCIsIHNwa291dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3Brb3V0bF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX1NQRUFLRVJfTUlYRVJfMSwgNywgMiwgb3V0bXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwa291dGxfZW51bSwKKwkJCSAgICBXTTg5NjJfU1BFQUtFUl9NSVhFUl8xLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGtvdXRsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLT1VUTCBNdXgiLCBzcGtvdXRsX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwb3V0cl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0hFQURQSE9ORV9NSVhFUl8yLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBvdXRyX2VudW0sCisJCQkgICAgV004OTYyX0hFQURQSE9ORV9NSVhFUl8yLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocG91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUE9VVFIgTXV4IiwgaHBvdXRyX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwb3V0bF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0hFQURQSE9ORV9NSVhFUl8xLCA3LCAyLCBvdXRtdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBvdXRsX2VudW0sCisJCQkgICAgV004OTYyX0hFQURQSE9ORV9NSVhFUl8xLCA3LCBvdXRtdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocG91dGxfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJIUE9VVEwgTXV4IiwgaHBvdXRsX2VudW0pOwpAQCAtMjg4NCw5ICsyODg2LDEzIEBACiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0ZMTF9DT05UUk9MXzcsIGZsbF9kaXYubGFtYmRhKTsKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfRkxMX0NPTlRST0xfOCwgZmxsX2Rpdi5uKTsKIAotCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZ3bTg5NjItPmZsbF9sb2NrKTsKKwlyZWluaXRfY29tcGxldGlvbigmd204OTYyLT5mbGxfbG9jayk7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGNvZGVjLT5kZXYpOworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY29kZWMtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlc3VtZSBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9GTExfQ09OVFJPTF8xLAogCQkJICAgIFdNODk2Ml9GTExfRlJBQyB8IFdNODk2Ml9GTExfUkVGQ0xLX1NSQ19NQVNLIHwKQEAgLTI4OTQsOCArMjkwMCw2IEBACiAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJGTEwgY29uZmlndXJlZCBmb3IgJWRIei0+JWRIelxuIiwgRnJlZiwgRm91dCk7CiAKLQlyZXQgPSAwOwotCiAJLyogVGhpcyBzaG91bGQgYmUgYSBtYXNzaXZlIG92ZXJlc3RpbWF0ZSBidXQgZ28gZXZlbgogCSAqIGhpZ2hlciBpZiB3ZSdsbCBlcnJvciBvdXQKIAkgKi8KQEAgLTI5MDksMTQgKzI5MTMsMTcgQEAKIAogCWlmICh0aW1lb3V0ID09IDAgJiYgd204OTYyLT5pcnEpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRkxMIGxvY2sgdGltZWQgb3V0Iik7Ci0JCXJldCA9IC1FVElNRURPVVQ7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9GTExfQ09OVFJPTF8xLAorCQkJCSAgICBXTTg5NjJfRkxMX0VOQSwgMCk7CisJCXBtX3J1bnRpbWVfcHV0KGNvZGVjLT5kZXYpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKIAl3bTg5NjItPmZsbF9mcmVmID0gRnJlZjsKIAl3bTg5NjItPmZsbF9mb3V0ID0gRm91dDsKIAl3bTg5NjItPmZsbF9zcmMgPSBzb3VyY2U7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODk2Ml9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKQEAgLTMwMDMsOSArMzAxMCwxNiBAQAogCXVuc2lnbmVkIGludCBhY3RpdmU7CiAJaW50IHJlZywgcmV0OwogCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc3VtZTogJWRcbiIsIHJldCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKIAlyZXQgPSByZWdtYXBfcmVhZCh3bTg5NjItPnJlZ21hcCwgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMl9NQVNLLAogCQkJICAmbWFzayk7CiAJaWYgKHJldCAhPSAwKSB7CisJCXBtX3J1bnRpbWVfcHV0KGRldik7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgaW50ZXJydXB0IG1hc2s6ICVkXG4iLAogCQkJcmV0KTsKIAkJcmV0dXJuIElSUV9OT05FOwpAQCAtMzAxMywxNCArMzAyNywxNyBAQAogCiAJcmV0ID0gcmVnbWFwX3JlYWQod204OTYyLT5yZWdtYXAsIFdNODk2Ml9JTlRFUlJVUFRfU1RBVFVTXzIsICZhY3RpdmUpOwogCWlmIChyZXQgIT0gMCkgeworCQlwbV9ydW50aW1lX3B1dChkZXYpOwogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIGludGVycnVwdDogJWRcbiIsIHJldCk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKIAlhY3RpdmUgJj0gfm1hc2s7CiAKLQlpZiAoIWFjdGl2ZSkKKwlpZiAoIWFjdGl2ZSkgeworCQlwbV9ydW50aW1lX3B1dChkZXYpOwogCQlyZXR1cm4gSVJRX05PTkU7CisJfQogCiAJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdHMgKi8KIAlyZXQgPSByZWdtYXBfd3JpdGUod204OTYyLT5yZWdtYXAsIFdNODk2Ml9JTlRFUlJVUFRfU1RBVFVTXzIsIGFjdGl2ZSk7CkBAIC0zMDcwLDYgKzMwODcsOCBAQAogCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7CiAJfQogCisJcG1fcnVudGltZV9wdXQoZGV2KTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMzA4OSw2ICszMTA4LDcgQEAKIGludCB3bTg5NjJfbWljX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spCiB7CiAJc3RydWN0IHdtODk2Ml9wcml2ICp3bTg5NjIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGlycV9tYXNrLCBlbmFibGU7CiAKIAl3bTg5NjItPmphY2sgPSBqYWNrOwpAQCAtMzEwOSwxNCArMzEyOSwxOCBAQAogCXNuZF9zb2NfamFja19yZXBvcnQod204OTYyLT5qYWNrLCAwLAogCQkJICAgIFNORF9KQUNLX01JQ1JPUEhPTkUgfCBTTkRfSkFDS19CVE5fMCk7CiAKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChqYWNrKSB7Ci0JCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOwotCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJNSUNCSUFTIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJTWVNDTEsiKTsKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1JQ0JJQVMiKTsKIAl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiU1lTQ0xLIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJNSUNCSUFTIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU1lTQ0xLIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTUlDQklBUyIpOwogCX0KIAorCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODk2Ml9taWNfZGV0ZWN0KTsKQEAgLTM0MDAsMTMgKzM0MjQsNiBAQAogCWJvb2wgZG1pY2NsaywgZG1pY2RhdDsKIAogCXdtODk2Mi0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTYyLT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAl3bTg5NjItPmRpc2FibGVfbmJbMF0ubm90aWZpZXJfY2FsbCA9IHdtODk2Ml9yZWd1bGF0b3JfZXZlbnRfMDsKIAl3bTg5NjItPmRpc2FibGVfbmJbMV0ubm90aWZpZXJfY2FsbCA9IHdtODk2Ml9yZWd1bGF0b3JfZXZlbnRfMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCmluZGV4IDY3YWJhNzguLjA5YjdiNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwpAQCAtNjQ4LDEyICs2NDgsNiBAQAogCWludCByZXQgPSAwOwogCXUxNiByZWc7CiAKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAid204OTcxOiBmYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywgd204OTcxX3dvcmspOwogCXdtODk3MV93b3JrcSA9IGNyZWF0ZV93b3JrcXVldWUoIndtODk3MSIpOwogCWlmICh3bTg5NzFfd29ya3EgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCmluZGV4IDE1ZjQ1YzcuLjA2MjdjNTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwpAQCAtODQsOCArODQsOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTc0X2F1eG1vZGVfdGV4dFtdID0geyAiQnVmZmVyIiwgIk1peGVyIiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk3NF9hdXhtb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTc0X0lOUFVULCAgMywgMiwgd204OTc0X2F1eG1vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTc0X2F1eG1vZGUsCisJCQkgICAgV004OTc0X0lOUFVULCAgMywgd204OTc0X2F1eG1vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKQEAgLTU5MywxMiArNTkzLDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHdtODk3NF9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCmluZGV4IGQ4ZmM1MzEuLjI4ZWY0NmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwpAQCAtMTE3LDIxICsxMTcsMjEgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5NzhfYWxjM1tdID0geyJBTEMiLCAiTGltaXRlciJ9Owogc3RhdGljIGNvbnN0IGNoYXIgKndtODk3OF9hbGMxW10gPSB7Ik9mZiIsICJSaWdodCIsICJMZWZ0IiwgIkJvdGgifTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19jb21wYW5kLCBXTTg5NzhfQ09NUEFORElOR19DT05UUk9MLCAxLAotCQkJCSAgd204OTc4X2NvbXBhbmRpbmcpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19jb21wYW5kLCBXTTg5NzhfQ09NUEFORElOR19DT05UUk9MLCAzLAotCQkJCSAgd204OTc4X2NvbXBhbmRpbmcpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxbW9kZSwgV004OTc4X0VRMSwgOCwgd204OTc4X2VxbW9kZSk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExLCBXTTg5NzhfRVExLCA1LCB3bTg5NzhfZXExKTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJidywgV004OTc4X0VRMiwgOCwgd204OTc4X2J3KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTIsIFdNODk3OF9FUTIsIDUsIHdtODk3OF9lcTIpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM2J3LCBXTTg5NzhfRVEzLCA4LCB3bTg5NzhfYncpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMywgV004OTc4X0VRMywgNSwgd204OTc4X2VxMyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0YncsIFdNODk3OF9FUTQsIDgsIHdtODk3OF9idyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0LCBXTTg5NzhfRVE0LCA1LCB3bTg5NzhfZXE0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTUsIFdNODk3OF9FUTUsIDUsIHdtODk3OF9lcTUpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzMsIFdNODk3OF9BTENfQ09OVFJPTF8zLCA4LCB3bTg5NzhfYWxjMyk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjMSwgV004OTc4X0FMQ19DT05UUk9MXzEsIDcsIHdtODk3OF9hbGMxKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNfY29tcGFuZCwgV004OTc4X0NPTVBBTkRJTkdfQ09OVFJPTCwgMSwKKwkJCSAgICB3bTg5NzhfY29tcGFuZGluZyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGFjX2NvbXBhbmQsIFdNODk3OF9DT01QQU5ESU5HX0NPTlRST0wsIDMsCisJCQkgICAgd204OTc4X2NvbXBhbmRpbmcpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxbW9kZSwgV004OTc4X0VRMSwgOCwgd204OTc4X2VxbW9kZSk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExLCBXTTg5NzhfRVExLCA1LCB3bTg5NzhfZXExKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJidywgV004OTc4X0VRMiwgOCwgd204OTc4X2J3KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTIsIFdNODk3OF9FUTIsIDUsIHdtODk3OF9lcTIpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM2J3LCBXTTg5NzhfRVEzLCA4LCB3bTg5NzhfYncpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMywgV004OTc4X0VRMywgNSwgd204OTc4X2VxMyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0YncsIFdNODk3OF9FUTQsIDgsIHdtODk3OF9idyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0LCBXTTg5NzhfRVE0LCA1LCB3bTg5NzhfZXE0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTUsIFdNODk3OF9FUTUsIDUsIHdtODk3OF9lcTUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsYzMsIFdNODk3OF9BTENfQ09OVFJPTF8zLCA4LCB3bTg5NzhfYWxjMyk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjMSwgV004OTc4X0FMQ19DT05UUk9MXzEsIDcsIHdtODk3OF9hbGMxKTsKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfdGx2LCAtMTI3NTAsIDUwLCAxKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV90bHYsIC0xMjAwLCAxMDAsIDApOwpAQCAtOTc1LDE5ICs5NzUsMTMgQEAKIHN0YXRpYyBpbnQgd204OTc4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTc4X3ByaXYgKndtODk3OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwLCBpOworCWludCBpOwogCiAJLyoKIAkgKiBTZXQgZGVmYXVsdCBzeXN0ZW0gY2xvY2sgdG8gUExMLCBpdCBpcyBtb3JlIHByZWNpc2UsIHRoaXMgaXMgYWxzbyB0aGUKIAkgKiBkZWZhdWx0IGhhcmR3YXJlIHNldHRpbmcKIAkgKi8KIAl3bTg5NzgtPnN5c2NsayA9IFdNODk3OF9QTEw7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk3OC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCS8qCiAJICogU2V0IHRoZSB1cGRhdGUgYml0IGluIGFsbCByZWdpc3RlcnMsIHRoYXQgaGF2ZSBvbmUuIFRoaXMgd2F5IGFsbApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKaW5kZXggYWE0MWJhMC4uMmI5YmZhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCkBAIC0yMDUsNDkgKzIwNSw0NCBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHBnYV9ib29zdF90bHYsIDAsIDIwMDAsIDApOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX3NlbF90ZXh0W10gPSB7ICJPZmYiLCAiUmlnaHQiLCAiTGVmdCIsICJTdGVyZW8iIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX3NlbCwgV004OTgzX0FMQ19DT05UUk9MXzEsIDcsCi0JCQkJICBhbGNfc2VsX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19zZWwsIFdNODk4M19BTENfQ09OVFJPTF8xLCA3LCBhbGNfc2VsX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX21vZGVfdGV4dFtdID0geyAiQUxDIiwgIkxpbWl0ZXIiIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX21vZGUsIFdNODk4M19BTENfQ09OVFJPTF8zLCA4LAotCQkJCSAgYWxjX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX21vZGUsIFdNODk4M19BTENfQ09OVFJPTF8zLCA4LCBhbGNfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZpbHRlcl9tb2RlX3RleHRbXSA9IHsgIkF1ZGlvIiwgIkFwcGxpY2F0aW9uIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGZpbHRlcl9tb2RlLCBXTTg5ODNfQURDX0NPTlRST0wsIDcsCi0JCQkJICBmaWx0ZXJfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChmaWx0ZXJfbW9kZSwgV004OTgzX0FEQ19DT05UUk9MLCA3LAorCQkJICAgIGZpbHRlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZXFfYndfdGV4dFtdID0geyAiTmFycm93IiwgIldpZGUiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqZXFtb2RlX3RleHRbXSA9IHsgIkNhcHR1cmUiLCAiUGxheWJhY2siIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGVxbW9kZSwgZXFtb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChlcW1vZGUsIGVxbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVxMV9jdXRvZmZfdGV4dFtdID0gewogCSI4MEh6IiwgIjEwNUh6IiwgIjEzNUh6IiwgIjE3NUh6IgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTFfY3V0b2ZmLCBXTTg5ODNfRVExX0xPV19TSEVMRiwgNSwKLQkJCQkgIGVxMV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExX2N1dG9mZiwgV004OTgzX0VRMV9MT1dfU0hFTEYsIDUsCisJCQkgICAgZXExX2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTJfY3V0b2ZmX3RleHRbXSA9IHsKIAkiMjMwSHoiLCAiMzAwSHoiLCAiMzg1SHoiLCAiNTAwSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMl9idywgV004OTgzX0VRMl9QRUFLXzEsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMl9jdXRvZmYsIFdNODk4M19FUTJfUEVBS18xLCA1LAotCQkJCSAgZXEyX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfYncsIFdNODk4M19FUTJfUEVBS18xLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfY3V0b2ZmLCBXTTg5ODNfRVEyX1BFQUtfMSwgNSwgZXEyX2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTNfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNjUwSHoiLCAiODUwSHoiLCAiMS4xa0h6IiwgIjEuNGtIeiIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEzX2J3LCBXTTg5ODNfRVEzX1BFQUtfMiwgOCwgZXFfYndfdGV4dCk7Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEzX2N1dG9mZiwgV004OTgzX0VRM19QRUFLXzIsIDUsCi0JCQkJICBlcTNfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19idywgV004OTgzX0VRM19QRUFLXzIsIDgsIGVxX2J3X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19jdXRvZmYsIFdNODk4M19FUTNfUEVBS18yLCA1LCBlcTNfY3V0b2ZmX3RleHQpOwogc3RhdGljIGNvbnN0IGNoYXIgKmVxNF9jdXRvZmZfdGV4dFtdID0gewogCSIxLjhrSHoiLCAiMi40a0h6IiwgIjMuMmtIeiIsICI0LjFrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9idywgV004OTgzX0VRNF9QRUFLXzMsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9jdXRvZmYsIFdNODk4M19FUTRfUEVBS18zLCA1LAotCQkJCSAgZXE0X2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfYncsIFdNODk4M19FUTRfUEVBS18zLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfY3V0b2ZmLCBXTTg5ODNfRVE0X1BFQUtfMywgNSwgZXE0X2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNS4za0h6IiwgIjYuOWtIeiIsICI5a0h6IiwgIjExLjdrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNV9jdXRvZmYsIFdNODk4M19FUTVfSElHSF9TSEVMRiwgNSwKLQkJCQkgIGVxNV9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE1X2N1dG9mZiwgV004OTgzX0VRNV9ISUdIX1NIRUxGLCA1LAorCQkJICAgIGVxNV9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZXB0aF8zZF90ZXh0W10gPSB7CiAJIk9mZiIsCkBAIC0yNjcsOCArMjYyLDggQEAKIAkiOTMuMyUiLAogCSIxMDAlIgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChkZXB0aF8zZCwgV004OTgzXzNEX0NPTlRST0wsIDAsCi0JCQkJICBkZXB0aF8zZF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkZXB0aF8zZCwgV004OTgzXzNEX0NPTlRST0wsIDAsCisJCQkgICAgZGVwdGhfM2RfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODNfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRSgiRGlnaXRhbCBMb29wYmFjayBTd2l0Y2giLCBXTTg5ODNfQ09NUEFORElOR19DT05UUk9MLApAQCAtMTAwMCwxMiArOTk1LDYgQEAKIAlpbnQgcmV0OwogCWludCBpOwogCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTgzX1NPRlRXQVJFX1JFU0VULCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOwpAQCAtMTEyOSw3ICsxMTE4LDcgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCiBzdGF0aWMgaW50IHdtODk4M19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xMTgyLDcgKzExNzEsNyBAQAogewogCWludCByZXQgPSAwOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204OTgzX2kyY19kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgd204OTgzIEkyQyBkcml2ZXI6ICVkXG4iLApAQCAtMTIwMiw3ICsxMTkxLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHdtODk4M19leGl0KHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKIAlpMmNfZGVsX2RyaXZlcigmd204OTgzX2kyY19kcml2ZXIpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jCmluZGV4IDI3MWI1MTcuLjU0NzNkYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYwpAQCAtMjI2LDUyICsyMjYsNDggQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwZ2FfYm9vc3RfdGx2LCAwLCAyMDAwLCAwKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19zZWxfdGV4dFtdID0geyAiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19zZWwsIFdNODk4NV9BTENfQ09OVFJPTF8xLCA3LAotCQkJCSAgYWxjX3NlbF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhbGNfc2VsLCBXTTg5ODVfQUxDX0NPTlRST0xfMSwgNywgYWxjX3NlbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFsY19tb2RlX3RleHRbXSA9IHsgIkFMQyIsICJMaW1pdGVyIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19tb2RlLCBXTTg5ODVfQUxDX0NPTlRST0xfMywgOCwKLQkJCQkgIGFsY19tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFsY19tb2RlLCBXTTg5ODVfQUxDX0NPTlRST0xfMywgOCwgYWxjX21vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpmaWx0ZXJfbW9kZV90ZXh0W10gPSB7ICJBdWRpbyIsICJBcHBsaWNhdGlvbiIgfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChmaWx0ZXJfbW9kZSwgV004OTg1X0FEQ19DT05UUk9MLCA3LAotCQkJCSAgZmlsdGVyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZmlsdGVyX21vZGUsIFdNODk4NV9BRENfQ09OVFJPTCwgNywKKwkJCSAgICBmaWx0ZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVxX2J3X3RleHRbXSA9IHsgIk5hcnJvdyIsICJXaWRlIiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmVxbW9kZV90ZXh0W10gPSB7ICJDYXB0dXJlIiwgIlBsYXliYWNrIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChlcW1vZGUsIGVxbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXFtb2RlLCBlcW1vZGVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICplcTFfY3V0b2ZmX3RleHRbXSA9IHsKIAkiODBIeiIsICIxMDVIeiIsICIxMzVIeiIsICIxNzVIeiIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExX2N1dG9mZiwgV004OTg1X0VRMV9MT1dfU0hFTEYsIDUsCi0JCQkJICBlcTFfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxMV9jdXRvZmYsIFdNODk4NV9FUTFfTE9XX1NIRUxGLCA1LAorCQkJICAgIGVxMV9jdXRvZmZfdGV4dCk7CiBzdGF0aWMgY29uc3QgY2hhciAqZXEyX2N1dG9mZl90ZXh0W10gPSB7CiAJIjIzMEh6IiwgIjMwMEh6IiwgIjM4NUh6IiwgIjUwMEh6IgogfTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfYncsIFdNODk4NV9FUTJfUEVBS18xLCA4LCBlcV9id190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTJfY3V0b2ZmLCBXTTg5ODVfRVEyX1BFQUtfMSwgNSwKLQkJCQkgIGVxMl9jdXRvZmZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2J3LCBXTTg5ODVfRVEyX1BFQUtfMSwgOCwgZXFfYndfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2N1dG9mZiwgV004OTg1X0VRMl9QRUFLXzEsIDUsIGVxMl9jdXRvZmZfdGV4dCk7CiBzdGF0aWMgY29uc3QgY2hhciAqZXEzX2N1dG9mZl90ZXh0W10gPSB7CiAJIjY1MEh6IiwgIjg1MEh6IiwgIjEuMWtIeiIsICIxLjRrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19idywgV004OTg1X0VRM19QRUFLXzIsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxM19jdXRvZmYsIFdNODk4NV9FUTNfUEVBS18yLCA1LAotCQkJCSAgZXEzX2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfYncsIFdNODk4NV9FUTNfUEVBS18yLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfY3V0b2ZmLCBXTTg5ODVfRVEzX1BFQUtfMiwgNSwKKwkJCSAgICBlcTNfY3V0b2ZmX3RleHQpOwogc3RhdGljIGNvbnN0IGNoYXIgKmVxNF9jdXRvZmZfdGV4dFtdID0gewogCSIxLjhrSHoiLCAiMi40a0h6IiwgIjMuMmtIeiIsICI0LjFrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9idywgV004OTg1X0VRNF9QRUFLXzMsIDgsIGVxX2J3X3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNF9jdXRvZmYsIFdNODk4NV9FUTRfUEVBS18zLCA1LAotCQkJCSAgZXE0X2N1dG9mZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfYncsIFdNODk4NV9FUTRfUEVBS18zLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTRfY3V0b2ZmLCBXTTg5ODVfRVE0X1BFQUtfMywgNSwgZXE0X2N1dG9mZl90ZXh0KTsKIHN0YXRpYyBjb25zdCBjaGFyICplcTVfY3V0b2ZmX3RleHRbXSA9IHsKIAkiNS4za0h6IiwgIjYuOWtIeiIsICI5a0h6IiwgIjExLjdrSHoiCiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGVxNV9jdXRvZmYsIFdNODk4NV9FUTVfSElHSF9TSEVMRiwgNSwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTVfY3V0b2ZmLCBXTTg5ODVfRVE1X0hJR0hfU0hFTEYsIDUsCiAJCQkJICBlcTVfY3V0b2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3BlYWtlcl9tb2RlX3RleHRbXSA9IHsgIkNsYXNzIEEvQiIsICJDbGFzcyBEIiB9Owotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwZWFrZXJfbW9kZSwgMHgxNywgOCwgc3BlYWtlcl9tb2RlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwZWFrZXJfbW9kZSwgMHgxNywgOCwgc3BlYWtlcl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGVwdGhfM2RfdGV4dFtdID0gewogCSJPZmYiLApAQCAtMjkxLDggKzI4Nyw3IEBACiAJIjkzLjMlIiwKIAkiMTAwJSIKIH07Ci1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGVwdGhfM2QsIFdNODk4NV8zRF9DT05UUk9MLCAwLAotCQkJCSAgZGVwdGhfM2RfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZGVwdGhfM2QsIFdNODk4NV8zRF9DT05UUk9MLCAwLCBkZXB0aF8zZF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk4NV9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfU0lOR0xFKCJEaWdpdGFsIExvb3BiYWNrIFN3aXRjaCIsIFdNODk4NV9DT01QQU5ESU5HX0NPTlRST0wsCkBAIC0xMDAwLDEzICs5OTUsNiBAQAogCWludCByZXQ7CiAKIAl3bTg5ODUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTg1LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgaS9vOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5ODUtPnN1cHBsaWVzKTsgaSsrKQogCQl3bTg5ODUtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODk4NV9zdXBwbHlfbmFtZXNbaV07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODguYwppbmRleCBhNTVlMWMyLi4zYTFhZTRmNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIHN0cnVjdCB3bTg5ODhfcHJpdiB7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXVuc2lnbmVkIGludCBzeXNjbGs7Ci0Jc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CisJY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CiB9OwogCiAjZGVmaW5lIHdtODk4OF9yZXNldChjKQlzbmRfc29jX3dyaXRlKGMsIFdNODk4OF9SRVNFVCwgMCkKQEAgLTEyNiw0NiArMTI2LDQ2IEBACiAgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfYm9vc3RfdHh0W10gPSB7IkxpbmVhciBDb250cm9sIiwgIkFkYXB0aXZlIEJvb3N0In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGJhc3NfYm9vc3QgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQkFTUywgNywgMiwgYmFzc19ib29zdF90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJhc3NfYm9vc3QsCisJCQkgICAgV004OTg4X0JBU1MsIDcsIGJhc3NfYm9vc3RfdHh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmJhc3NfZmlsdGVyX3R4dFtdID0geyAiMTMwSHogQCA0OGtIeiIsICIyMDBIeiBAIDQ4a0h6IiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBiYXNzX2ZpbHRlciA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9CQVNTLCA2LCAyLCBiYXNzX2ZpbHRlcl90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGJhc3NfZmlsdGVyLAorCQkJICAgIFdNODk4OF9CQVNTLCA2LCBiYXNzX2ZpbHRlcl90eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdHJlYmxlX3R4dFtdID0geyI4a0h6IiwgIjRrSHoifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHJlYmxlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTg4X1RSRUJMRSwgNiwgMiwgdHJlYmxlX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wodHJlYmxlLAorCQkJICAgIFdNODk4OF9UUkVCTEUsIDYsIHRyZWJsZV90eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcmVvXzNkX2xjX3R4dFtdID0geyIyMDBIeiIsICI1MDBIeiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGVyZW9fM2RfbGMgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfM0QsIDUsIDIsIHN0ZXJlb18zZF9sY190eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0ZXJlb18zZF9sYywKKwkJCSAgICBXTTg5ODhfM0QsIDUsIHN0ZXJlb18zZF9sY190eHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcmVvXzNkX3VjX3R4dFtdID0geyIyLjJrSHoiLCAiMS41a0h6In07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0ZXJlb18zZF91YyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF8zRCwgNiwgMiwgc3RlcmVvXzNkX3VjX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RlcmVvXzNkX3VjLAorCQkJICAgIFdNODk4OF8zRCwgNiwgc3RlcmVvXzNkX3VjX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzdGVyZW9fM2RfZnVuY190eHRbXSA9IHsiQ2FwdHVyZSIsICJQbGF5YmFjayJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGVyZW9fM2RfZnVuYyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF8zRCwgNywgMiwgc3RlcmVvXzNkX2Z1bmNfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzdGVyZW9fM2RfZnVuYywKKwkJCSAgICBXTTg5ODhfM0QsIDcsIHN0ZXJlb18zZF9mdW5jX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphbGNfZnVuY190eHRbXSA9IHsiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsY19mdW5jID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTg4X0FMQzEsIDcsIDQsIGFsY19mdW5jX3R4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX2Z1bmMsCisJCQkgICAgV004OTg4X0FMQzEsIDcsIGFsY19mdW5jX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpuZ190eXBlX3R4dFtdID0geyJDb25zdGFudCBQR0EgR2FpbiIsCiAJCQkJICAgICJNdXRlIEFEQyBPdXRwdXQifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmdfdHlwZSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9OR0FURSwgMSwgMiwgbmdfdHlwZV90eHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5nX3R5cGUsCisJCQkgICAgV004OTg4X05HQVRFLCAxLCBuZ190eXBlX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdHh0W10gPSB7Ik5vbmUiLCAiMzJLaHoiLCAiNDQuMUtoeiIsICI0OEtoeiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWVtcGggPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQURDREFDLCAxLCA0LCBkZWVtcGhfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkZWVtcGgsCisJCQkgICAgV004OTg4X0FEQ0RBQywgMSwgZGVlbXBoX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICphZGNwb2xfdHh0W10gPSB7Ik5vcm1hbCIsICJMIEludmVydCIsICJSIEludmVydCIsCiAJCQkJICAgIkwgKyBSIEludmVydCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNwb2wgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5ODhfQURDREFDLCA1LCA0LCBhZGNwb2xfdHh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNwb2wsCisJCQkgICAgV004OTg4X0FEQ0RBQywgNSwgYWRjcG9sX3R4dCk7CiAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwZ2FfdGx2LCAtMTcyNSwgNzUsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY190bHYsIC05NzUwLCA1MCwgMSk7CkBAIC0zMTcsMTYgKzMxNywxNiBAQAogCiAvKiBEaWZmZXJlbnRpYWwgTXV4ICovCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTg4X2RpZmZfc2VsW10gPSB7IkxpbmUgMSIsICJMaW5lIDIifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGlmZm11eCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9BRENJTiwgOCwgMiwgd204OTg4X2RpZmZfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkaWZmbXV4LAorCQkJICAgIFdNODk4OF9BRENJTiwgOCwgd204OTg4X2RpZmZfc2VsKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODhfZGlmZm11eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBkaWZmbXV4KTsKIAogLyogTW9ubyBBREMgTXV4ICovCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTg4X21vbm9fbXV4W10gPSB7IlN0ZXJlbyIsICJNb25vIChMZWZ0KSIsCiAJIk1vbm8gKFJpZ2h0KSIsICJEaWdpdGFsIE1vbm8ifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbW9ub211eCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk4OF9BRENJTiwgNiwgNCwgd204OTg4X21vbm9fbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtb25vbXV4LAorCQkJICAgIFdNODk4OF9BRENJTiwgNiwgd204OTg4X21vbm9fbXV4KTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5ODhfbW9ub211eF9jb250cm9scyA9CiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCBtb25vbXV4KTsKIApAQCAtNTIxLDMwICs1MjEsMzAgQEAKIAogLyogVGhlIHNldCBvZiByYXRlcyB3ZSBjYW4gZ2VuZXJhdGUgZnJvbSB0aGUgYWJvdmUgZm9yIGVhY2ggU1lTQ0xLICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfMTIyODhbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMTIyODhbXSA9IHsKIAk4MDAwLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCAyNDAwMCwgMzIwMDAsIDQ4MDAwLCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIyODggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyMjg4ID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIyODgpLAogCS5saXN0CT0gcmF0ZXNfMTIyODgsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzExMjg5NltdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18xMTI4OTZbXSA9IHsKIAk4MDAwLCAxMTAyNSwgMjIwNTAsIDQ0MTAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xMTI4OTYgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzExMjg5NiA9IHsKIAkuY291bnQJPSBBUlJBWV9TSVpFKHJhdGVzXzExMjg5NiksCiAJLmxpc3QJPSByYXRlc18xMTI4OTYsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzEyW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzEyW10gPSB7CiAJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAsIDMyMDAwLCA0MTEwMCwgNDgwMDAsCiAJNDgwMDAsIDg4MjM1LCA5NjAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzEyID0gewogCS5jb3VudAk9IEFSUkFZX1NJWkUocmF0ZXNfMTIpLAogCS5saXN0CT0gcmF0ZXNfMTIsCiB9OwpAQCAtODEwLDE2ICs4MTAsOCBAQAogCiBzdGF0aWMgaW50IHdtODk4OF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IHdtODk4OF9wcml2ICp3bTg5ODggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0ID0gMDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTg5ODgtPnJlZ21hcDsKLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSB3bTg5ODhfcmVzZXQoY29kZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBpc3N1ZSByZXNldFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwppbmRleCAwY2NkNGQ4Li5jNDEzYzE5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKQEAgLTE1NywyNiArMTU3LDIzIEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkwX2RpZ2l0YWxfc2lkZXRvbmVbXSA9CiAJeyJOb25lIiwgIkxlZnQgQURDIiwgIlJpZ2h0IEFEQyIsICJSZXNlcnZlZCJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MF9sZWZ0X2RpZ2l0YWxfc2lkZXRvbmVfZW51bSA9Ci1TT0NfRU5VTV9TSU5HTEUoV004OTkwX0RJR0lUQUxfU0lERV9UT05FLAotCVdNODk5MF9BRENfVE9fREFDTF9TSElGVCwKLQlXTTg5OTBfQURDX1RPX0RBQ0xfTUFTSywKLQl3bTg5OTBfZGlnaXRhbF9zaWRldG9uZSk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod204OTkwX2xlZnRfZGlnaXRhbF9zaWRldG9uZV9lbnVtLAorCQkJICAgIFdNODk5MF9ESUdJVEFMX1NJREVfVE9ORSwKKwkJCSAgICBXTTg5OTBfQURDX1RPX0RBQ0xfU0hJRlQsCisJCQkgICAgd204OTkwX2RpZ2l0YWxfc2lkZXRvbmUpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MF9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0gPQotU09DX0VOVU1fU0lOR0xFKFdNODk5MF9ESUdJVEFMX1NJREVfVE9ORSwKLQlXTTg5OTBfQURDX1RPX0RBQ1JfU0hJRlQsCi0JV004OTkwX0FEQ19UT19EQUNSX01BU0ssCi0Jd204OTkwX2RpZ2l0YWxfc2lkZXRvbmUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODk5MF9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkwX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MF9BRENfVE9fREFDUl9TSElGVCwKKwkJCSAgICB3bTg5OTBfZGlnaXRhbF9zaWRldG9uZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWRjbW9kZVtdID0KIAl7IkhpLWZpIG1vZGUiLCAiVm9pY2UgbW9kZSAxIiwgIlZvaWNlIG1vZGUgMiIsICJWb2ljZSBtb2RlIDMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfcmlnaHRfYWRjbW9kZV9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfQURDX0NUUkwsCi0JV004OTkwX0FEQ19IUEZfQ1VUX1NISUZULAotCVdNODk5MF9BRENfSFBGX0NVVF9NQVNLLAotCXdtODk5MF9hZGNtb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfcmlnaHRfYWRjbW9kZV9lbnVtLAorCQkJICAgIFdNODk5MF9BRENfQ1RSTCwKKwkJCSAgICBXTTg5OTBfQURDX0hQRl9DVVRfU0hJRlQsCisJCQkgICAgd204OTkwX2FkY21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTkwX3NuZF9jb250cm9sc1tdID0gewogLyogSU5NSVhMICovCkBAIC00NzUsOSArNDcyLDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWlubG11eFtdID0KIAl7IklOTUlYTCBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOTCBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfYWlubG11eF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfSU5QVVRfTUlYRVIxLCBXTTg5OTBfQUlOTE1PREVfU0hJRlQsCi0JQVJSQVlfU0laRSh3bTg5OTBfYWlubG11eCksIHdtODk5MF9haW5sbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfYWlubG11eF9lbnVtLAorCQkJICAgIFdNODk5MF9JTlBVVF9NSVhFUjEsIFdNODk5MF9BSU5MTU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTBfYWlubG11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTBfZGFwbV9haW5sbXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTkwX2FpbmxtdXhfZW51bSk7CkBAIC00ODgsOSArNDg1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTBfYWlucm11eFtdID0KIAl7IklOTUlYUiBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOUiBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTBfYWlucm11eF9lbnVtID0KLVNPQ19FTlVNX1NJTkdMRShXTTg5OTBfSU5QVVRfTUlYRVIxLCBXTTg5OTBfQUlOUk1PREVfU0hJRlQsCi0JQVJSQVlfU0laRSh3bTg5OTBfYWlucm11eCksIHdtODk5MF9haW5ybXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTBfYWlucm11eF9lbnVtLAorCQkJICAgIFdNODk5MF9JTlBVVF9NSVhFUjEsIFdNODk5MF9BSU5STU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTBfYWlucm11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTBfZGFwbV9haW5ybXV4X2NvbnRyb2xzID0KIFNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTkwX2FpbnJtdXhfZW51bSk7CkBAIC0xMjkyLDE0ICsxMjg5LDYgQEAKICAqLwogc3RhdGljIGludCB3bTg5OTBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIndtODk5MDogZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXdtODk5MF9yZXNldChjb2RlYyk7CiAKIAkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCmluZGV4IGRiYTAzMDYuLjg0NGNjNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwpAQCAtMTcxLDI2ICsxNzEsMjMgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTFfZGlnaXRhbF9zaWRldG9uZVtdID0KIHsiTm9uZSIsICJMZWZ0IEFEQyIsICJSaWdodCBBREMiLCAiUmVzZXJ2ZWQifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfbGVmdF9kaWdpdGFsX3NpZGV0b25lX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTFfRElHSVRBTF9TSURFX1RPTkUsCi0JCQlXTTg5OTFfQURDX1RPX0RBQ0xfU0hJRlQsCi0JCQlXTTg5OTFfQURDX1RPX0RBQ0xfTUFTSywKLQkJCXdtODk5MV9kaWdpdGFsX3NpZGV0b25lKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfbGVmdF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkxX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MV9BRENfVE9fREFDTF9TSElGVCwKKwkJCSAgICB3bTg5OTFfZGlnaXRhbF9zaWRldG9uZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTkxX3JpZ2h0X2RpZ2l0YWxfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5MV9ESUdJVEFMX1NJREVfVE9ORSwKLQkJCVdNODk5MV9BRENfVE9fREFDUl9TSElGVCwKLQkJCVdNODk5MV9BRENfVE9fREFDUl9NQVNLLAotCQkJd204OTkxX2RpZ2l0YWxfc2lkZXRvbmUpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHdtODk5MV9yaWdodF9kaWdpdGFsX3NpZGV0b25lX2VudW0sCisJCQkgICAgV004OTkxX0RJR0lUQUxfU0lERV9UT05FLAorCQkJICAgIFdNODk5MV9BRENfVE9fREFDUl9TSElGVCwKKwkJCSAgICB3bTg5OTFfZGlnaXRhbF9zaWRldG9uZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTFfYWRjbW9kZVtdID0KIHsiSGktZmkgbW9kZSIsICJWb2ljZSBtb2RlIDEiLCAiVm9pY2UgbW9kZSAyIiwgIlZvaWNlIG1vZGUgMyJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5MV9yaWdodF9hZGNtb2RlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTFfQURDX0NUUkwsCi0JCQlXTTg5OTFfQURDX0hQRl9DVVRfU0hJRlQsCi0JCQlXTTg5OTFfQURDX0hQRl9DVVRfTUFTSywKLQkJCXdtODk5MV9hZGNtb2RlKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfcmlnaHRfYWRjbW9kZV9lbnVtLAorCQkJICAgIFdNODk5MV9BRENfQ1RSTCwKKwkJCSAgICBXTTg5OTFfQURDX0hQRl9DVVRfU0hJRlQsCisJCQkgICAgd204OTkxX2FkY21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTkxX3NuZF9jb250cm9sc1tdID0gewogCS8qIElOTUlYTCAqLwpAQCAtNDg2LDkgKzQ4Myw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkxX2FpbmxtdXhbXSA9CiB7IklOTUlYTCBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOTCBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfYWlubG11eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkxX0lOUFVUX01JWEVSMSwgV004OTkxX0FJTkxNT0RFX1NISUZULAotCQkJQVJSQVlfU0laRSh3bTg5OTFfYWlubG11eCksIHdtODk5MV9haW5sbXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfYWlubG11eF9lbnVtLAorCQkJICAgIFdNODk5MV9JTlBVVF9NSVhFUjEsIFdNODk5MV9BSU5MTU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTFfYWlubG11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTFfZGFwbV9haW5sbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODk5MV9haW5sbXV4X2VudW0pOwpAQCAtNDk5LDkgKzQ5Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqd204OTkxX2FpbnJtdXhbXSA9CiB7IklOTUlYUiBNaXgiLCAiUlhWT0lDRSBNaXgiLCAiRElGRklOUiBNaXgifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTFfYWlucm11eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkxX0lOUFVUX01JWEVSMSwgV004OTkxX0FJTlJNT0RFX1NISUZULAotCQkJQVJSQVlfU0laRSh3bTg5OTFfYWlucm11eCksIHdtODk5MV9haW5ybXV4KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTg5OTFfYWlucm11eF9lbnVtLAorCQkJICAgIFdNODk5MV9JTlBVVF9NSVhFUjEsIFdNODk5MV9BSU5STU9ERV9TSElGVCwKKwkJCSAgICB3bTg5OTFfYWlucm11eCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTFfZGFwbV9haW5ybXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODk5MV9haW5ybXV4X2VudW0pOwpAQCAtMTI1MSwxNyArMTI0OCw2IEBACiAKIHN0YXRpYyBpbnQgd204OTkxX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgd204OTkxX3ByaXYgKndtODk5MTsKLQlpbnQgcmV0OwotCi0Jd204OTkxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJd204OTkxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCmluZGV4IDJlZTIzYTMuLmY4MjVkYzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwpAQCAtNjQ2LDggKzY0Niw4IEBACiAJIjQ4a0h6IiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EQUNfQ1RSTCwgNCwgNCwgZGFjX2RlZW1waF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkYWNfZGVlbXBoLAorCQkJICAgIFdNODk5M19EQUNfQ1RSTCwgNCwgZGFjX2RlZW1waF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFkY19ocGZfdGV4dFtdID0gewogCSJIaS1GaSIsCkBAIC02NTYsMTYgKzY1NiwxNiBAQAogCSJWb2ljZSAzIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX2hwZiA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BRENfQ1RSTCwgNSwgNCwgYWRjX2hwZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGNfaHBmLAorCQkJICAgIFdNODk5M19BRENfQ1RSTCwgNSwgYWRjX2hwZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19wYXRoX3RleHRbXSA9IHsKIAkiQURDIiwKIAkiREFDIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcGF0aCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF8xLCAxNCwgMiwgZHJjX3BhdGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3BhdGgsCisJCQkgICAgV004OTkzX0RSQ19DT05UUk9MXzEsIDE0LCBkcmNfcGF0aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19yMF90ZXh0W10gPSB7CiAJIjEiLApAQCAtNjc2LDggKzY3Niw4IEBACiAJIjAiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcjAgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMywgOCwgNiwgZHJjX3IwX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19yMCwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMywgOCwgZHJjX3IwX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3IxX3RleHRbXSA9IHsKIAkiMSIsCkBAIC02ODcsOCArNjg3LDggQEAKIAkiMCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19yMSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF80LCAxMywgNSwgZHJjX3IxX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19yMSwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfNCwgMTMsIGRyY19yMV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19hdHRhY2tfdGV4dFtdID0gewogCSJSZXNlcnZlZCIsCkBAIC03MDUsOCArNzA1LDggQEAKIAkiMTg1LjZtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19hdHRhY2sgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMiwgMTIsIDEyLCBkcmNfYXR0YWNrX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19hdHRhY2ssCisJCQkgICAgV004OTkzX0RSQ19DT05UUk9MXzIsIDEyLCBkcmNfYXR0YWNrX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX2RlY2F5X3RleHRbXSA9IHsKIAkiMTg2bXMiLApAQCAtNzIwLDE2ICs3MjAsMTYgQEAKIAkiNDcuNTZtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19kZWNheSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19EUkNfQ09OVFJPTF8yLCA4LCA5LCBkcmNfZGVjYXlfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2RlY2F5LAorCQkJICAgIFdNODk5M19EUkNfQ09OVFJPTF8yLCA4LCBkcmNfZGVjYXlfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfZmZfdGV4dFtdID0gewogCSI1IHNhbXBsZXMiLAogCSI5IHNhbXBsZXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRFJDX0NPTlRST0xfMywgNywgMiwgZHJjX2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19mZiwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMywgNywgZHJjX2ZmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJjX3FyX3JhdGVfdGV4dFtdID0gewogCSIwLjcyNW1zIiwKQEAgLTczNyw4ICs3MzcsOCBAQAogCSI1LjhtcyIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19xcl9yYXRlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX0RSQ19DT05UUk9MXzMsIDAsIDMsIGRyY19xcl9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9yYXRlLAorCQkJICAgIFdNODk5M19EUkNfQ09OVFJPTF8zLCAwLCBkcmNfcXJfcmF0ZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbW9vdGhfdGV4dFtdID0gewogCSJMb3ciLApAQCAtNzQ2LDggKzc0Niw4IEBACiAJIkhpZ2giLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfc21vb3RoID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX0RSQ19DT05UUk9MXzEsIDQsIDMsIGRyY19zbW9vdGhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX3Ntb290aCwKKwkJCSAgICBXTTg5OTNfRFJDX0NPTlRST0xfMSwgNCwgZHJjX3Ntb290aF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk5M19zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfVExWKCJEaWdpdGFsIFNpZGV0b25lIFZvbHVtZSIsIFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwKQEAgLTg0MSwyNiArODQxLDI2IEBACiAJIkxlZnQiLCAiUmlnaHQiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZm91dGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BVURJT19JTlRFUkZBQ0VfMSwgMTUsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZvdXRsX2VudW0sCisJCQkgICAgV004OTkzX0FVRElPX0lOVEVSRkFDRV8xLCAxNSwgYWlmX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmb3V0bF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkFJRk9VVEwgTXV4IiwgYWlmb3V0bF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZvdXRyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfQVVESU9fSU5URVJGQUNFXzEsIDE0LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmb3V0cl9lbnVtLAorCQkJICAgIFdNODk5M19BVURJT19JTlRFUkZBQ0VfMSwgMTQsIGFpZl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZm91dHJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZPVVRSIE11eCIsIGFpZm91dHJfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmaW5sX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfQVVESU9fSU5URVJGQUNFXzIsIDE1LCAyLCBhaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmaW5sX2VudW0sCisJCQkgICAgV004OTkzX0FVRElPX0lOVEVSRkFDRV8yLCAxNSwgYWlmX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmaW5sX211eCA9CiAJU09DX0RBUE1fRU5VTSgiQUlGSU5MIE11eCIsIGFpZmlubF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWZpbnJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19BVURJT19JTlRFUkZBQ0VfMiwgMTQsIDIsIGFpZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChhaWZpbnJfZW51bSwKKwkJCSAgICBXTTg5OTNfQVVESU9fSU5URVJGQUNFXzIsIDE0LCBhaWZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWZpbnJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUZJTlIgTXV4IiwgYWlmaW5yX2VudW0pOwpAQCAtODY5LDE0ICs4NjksMTQgQEAKIAkiTm9uZSIsICJMZWZ0IiwgIlJpZ2h0IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwgMiwgMywgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc2lkZXRvbmVsX2VudW0sCisJCQkgICAgV004OTkzX0RJR0lUQUxfU0lERV9UT05FLCAyLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lbF9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgU2lkZXRvbmUiLCBzaWRldG9uZWxfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2lkZXRvbmVyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfRElHSVRBTF9TSURFX1RPTkUsIDAsIDMsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNpZGV0b25lcl9lbnVtLAorCQkJICAgIFdNODk5M19ESUdJVEFMX1NJREVfVE9ORSwgMCwgc2lkZXRvbmVfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzaWRldG9uZXJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJSaWdodCBTaWRldG9uZSIsIHNpZGV0b25lcl9lbnVtKTsKQEAgLTE0OTMsMTMgKzE0OTMsNiBAQAogCXdtODk5My0+aHVic19kYXRhLmRjc19jb2Rlc19yID0gLTI7CiAJd204OTkzLT5odWJzX2RhdGEuc2VyaWVzX3N0YXJ0dXAgPSAxOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk5My0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogTGF0Y2ggdm9sdW1lIHVwZGF0ZSBiaXRzIGFuZCBkZWZhdWx0IFpDIG9uICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX1JJR0hUX0RBQ19ESUdJVEFMX1ZPTFVNRSwKIAkJCSAgICBXTTg5OTNfREFDX1ZVLCBXTTg5OTNfREFDX1ZVKTsKQEAgLTE1NTksOCArMTU1Miw2IEBACiAKIHN0YXRpYyBpbnQgd204OTkzX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IHdtODk5M19wcml2ICp3bTg5OTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQogCXdtODk5M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwppbmRleCBhZGI3MjA2Li42MzAzNTM3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKQEAgLTEzNDQsOCArMTM0NCw3IEBACiAJIkRNSUMiLAogfTsKIAotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkY19lbnVtLAotCQkJICAgIDAsIDAsIGFkY19tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX1ZJUlRfREVDTChhZGNfZW51bSwgYWRjX211eF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNX1ZJUlQoIkFEQ0wgTXV4IiwgYWRjX2VudW0pOwpAQCAtMjU1NCw0MyArMjU1Myw1MiBAQAogaW50IHdtODk5NF92bWlkX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBlbnVtIHdtODk5NF92bWlkX21vZGUgbW9kZSkKIHsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgV004OTk0X1ZNSURfTk9STUFMOgorCQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCQlpZiAod204OTk0LT5odWJzLmxpbmVvdXQxX3NlKSB7Ci0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICJMSU5FT1VUMU4gRHJpdmVyIik7Ci0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICJMSU5FT1VUMVAgRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICJMSU5FT1VUMU4gRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICJMSU5FT1VUMVAgRHJpdmVyIik7CiAJCX0KIAkJaWYgKHdtODk5NC0+aHVicy5saW5lb3V0Ml9zZSkgewotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAiTElORU9VVDJOIERyaXZlciIpOwotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAiTElORU9VVDJQIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAiTElORU9VVDJOIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAiTElORU9VVDJQIERyaXZlciIpOwogCQl9CiAKIAkJLyogRG8gdGhlIHN5bmMgd2l0aCB0aGUgb2xkIG1vZGUgdG8gYWxsb3cgaXQgdG8gY2xlYW4gdXAgKi8KLQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwkJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CiAJCXdtODk5NC0+dm1pZF9tb2RlID0gbW9kZTsKKworCQlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCQlicmVhazsKIAogCWNhc2UgV004OTk0X1ZNSURfRk9SQ0U6CisJCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJCWlmICh3bTg5OTQtPmh1YnMubGluZW91dDFfc2UpIHsKLQkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICAgICJMSU5FT1VUMU4gRHJpdmVyIik7Ci0JCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sCi0JCQkJCQkgICAgICAiTElORU9VVDFQIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICAgICAgIkxJTkVPVVQxTiBEcml2ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sCisJCQkJCQkJICAgICAgICJMSU5FT1VUMVAgRHJpdmVyIik7CiAJCX0KIAkJaWYgKHdtODk5NC0+aHVicy5saW5lb3V0Ml9zZSkgewotCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLAotCQkJCQkJICAgICAgIkxJTkVPVVQyTiBEcml2ZXIiKTsKLQkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICAgICJMSU5FT1VUMlAgRHJpdmVyIik7CisJCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLAorCQkJCQkJCSAgICAgICAiTElORU9VVDJOIERyaXZlciIpOworCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwKKwkJCQkJCQkgICAgICAgIkxJTkVPVVQyUCBEcml2ZXIiKTsKIAkJfQogCiAJCXdtODk5NC0+dm1pZF9tb2RlID0gbW9kZTsKLQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwkJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwkJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzI0Miw3ICszMjUwLDcgQEAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJBbGxvY2F0ZWQgJWQgdW5pcXVlIFJlVHVuZSBNb2JpbGUgbmFtZXNcbiIsCiAJCXdtODk5NC0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHMpOwogCi0Jd204OTk0LT5yZXR1bmVfbW9iaWxlX2VudW0ubWF4ID0gd204OTk0LT5udW1fcmV0dW5lX21vYmlsZV90ZXh0czsKKwl3bTg5OTQtPnJldHVuZV9tb2JpbGVfZW51bS5pdGVtcyA9IHdtODk5NC0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHM7CiAJd204OTk0LT5yZXR1bmVfbW9iaWxlX2VudW0udGV4dHMgPSB3bTg5OTQtPnJldHVuZV9tb2JpbGVfdGV4dHM7CiAKIAlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyh3bTg5OTQtPmh1YnMuY29kZWMsIGNvbnRyb2xzLApAQCAtMzI5OCw3ICszMzA2LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZHJjX2NmZ3M7IGkrKykKIAkJCXdtODk5NC0+ZHJjX3RleHRzW2ldID0gcGRhdGEtPmRyY19jZmdzW2ldLm5hbWU7CiAKLQkJd204OTk0LT5kcmNfZW51bS5tYXggPSBwZGF0YS0+bnVtX2RyY19jZmdzOworCQl3bTg5OTQtPmRyY19lbnVtLml0ZW1zID0gcGRhdGEtPm51bV9kcmNfY2ZnczsKIAkJd204OTk0LT5kcmNfZW51bS50ZXh0cyA9IHdtODk5NC0+ZHJjX3RleHRzOwogCiAJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKHdtODk5NC0+aHVicy5jb2RlYywgY29udHJvbHMsCkBAIC0zOTkwLDkgKzM5OTgsOCBAQAogCWludCByZXQsIGk7CiAKIAl3bTg5OTQtPmh1YnMuY29kZWMgPSBjb2RlYzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gY29udHJvbC0+cmVnbWFwOwogCi0Jc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19SRUdNQVApOworCXNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCBjb250cm9sLT5yZWdtYXApOwogCiAJbXV0ZXhfaW5pdCgmd204OTk0LT5hY2NkZXRfbG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJndtODk5NC0+amFja2RldF9ib290c3RyYXAsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYwppbmRleCA0MzAwY2FmLi5kMzE1MmNmNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCkBAIC00MjMsMjQgKzQyMywyNCBAQAogCSJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLWVuZGVkIElOMUxOIiwgIlNpbmdsZS1lbmRlZCBJTjFMUCIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChpbjFsX2VudW0sIFdNODk5NV9MRUZUX0xJTkVfSU5QVVRfQ09OVFJPTCwKLQkJCQkgIDIsIGluMWxfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xbF9lbnVtLCBXTTg5OTVfTEVGVF9MSU5FX0lOUFVUX0NPTlRST0wsCisJCQkgICAgMiwgaW4xbF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmluMXJfdGV4dFtdID0gewogCSJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLWVuZGVkIElOMVJOIiwgIlNpbmdsZS1lbmRlZCBJTjFSUCIKIH07CiAKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChpbjFyX2VudW0sIFdNODk5NV9MRUZUX0xJTkVfSU5QVVRfQ09OVFJPTCwKLQkJCQkgIDAsIGluMXJfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xcl9lbnVtLCBXTTg5OTVfTEVGVF9MSU5FX0lOUFVUX0NPTlRST0wsCisJCQkgICAgMCwgaW4xcl90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRtaWNfc3JjX3RleHRbXSA9IHsKIAkiRE1JQ0RBVDEiLCAiRE1JQ0RBVDIiLCAiRE1JQ0RBVDMiCiB9OwogCi1zdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZG1pY19zcmMxX2VudW0sIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzUsCi0JCQkJICA4LCBkbWljX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChkbWljX3NyYzJfZW51bSwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNSwKLQkJCQkgIDYsIGRtaWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRtaWNfc3JjMV9lbnVtLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF81LAorCQkJICAgIDgsIGRtaWNfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRtaWNfc3JjMl9lbnVtLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF81LAorCQkJICAgIDYsIGRtaWNfc3JjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTk1X3NuZF9jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzEgVm9sdW1lIiwgV004OTk1X0RBQzFfTEVGVF9WT0xVTUUsCkBAIC01NjEsMTAgKzU2MSw4IEBACiAJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKIAogCWNvZGVjID0gdy0+Y29kZWM7Ci0Jd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKQEAgLTc4MywxNCArNzgxLDEyIEBACiAJIkFEQy9ETUlDMSIsICJETUlDMiIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNpZGV0b25lMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk1X1NJREVUT05FLCAwLCAyLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZTFfZW51bSwgV004OTk1X1NJREVUT05FLCAwLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lMV9tdXggPQogCVNPQ19EQVBNX0VOVU0oIkxlZnQgU2lkZXRvbmUgTXV4Iiwgc2lkZXRvbmUxX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNpZGV0b25lMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk1X1NJREVUT05FLCAxLCAyLCBzaWRldG9uZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZTJfZW51bSwgV004OTk1X1NJREVUT05FLCAxLCBzaWRldG9uZV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNpZGV0b25lMl9tdXggPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIE11eCIsIHNpZGV0b25lMl9lbnVtKTsKQEAgLTg4Niw4ICs4ODIsNyBAQAogCSJETUlDIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRSgwLCAwLCAyLCBhZGNfbXV4X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9WSVJUX0RFQ0woYWRjX2VudW0sIGFkY19tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNsX211eCA9CiAJU09DX0RBUE1fRU5VTV9WSVJUKCJBRENMIE11eCIsIGFkY19lbnVtKTsKQEAgLTg5OSwxNCArODk0LDE0IEBACiAJIkRBQzFMIiwgIkRBQzFSIiwgIkRBQzJMIiwgIkRBQzJSIgogfTsKIAotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazFsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8xLAotCQkJCSAgMCwgc3BrX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsxcl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzEsCi0JCQkJICAwLCBzcGtfc3JjX3RleHQpOwotc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazJsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8yLAotCQkJCSAgMCwgc3BrX3NyY190ZXh0KTsKLXN0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsycl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzIsCi0JCQkJICAwLCBzcGtfc3JjX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazFsX3NyY19lbnVtLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8xLAorCQkJICAgIDAsIHNwa19zcmNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMXJfc3JjX2VudW0sIFdNODk5NV9SSUdIVF9QRE1fU1BFQUtFUl8xLAorCQkJICAgIDAsIHNwa19zcmNfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMmxfc3JjX2VudW0sIFdNODk5NV9MRUZUX1BETV9TUEVBS0VSXzIsCisJCQkgICAgMCwgc3BrX3NyY190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGsycl9zcmNfZW51bSwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzIsCisJCQkgICAgMCwgc3BrX3NyY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwazFsX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLMUwgU1JDIiwgc3BrMWxfc3JjX2VudW0pOwpAQCAtMjA0NywxMyArMjA0Miw2IEBACiAJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJd204OTk1LT5jb2RlYyA9IGNvZGVjOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk5NS0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAxNiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGkvbzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk1LT5zdXBwbGllcyk7IGkrKykKIAkJd204OTk1LT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg5OTVfc3VwcGx5X25hbWVzW2ldOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwppbmRleCAxYTc2NTViLi5jNmNiYjNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKQEAgLTMxMSwyOCArMzExLDI4IEBACiAJIjIuOWtIeiIsICIxLjVrSHoiLCAiNzM1SHoiLCAiNDAzSHoiLCAiMTk2SHoiLCAiOThIeiIsICI0OUh6IgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZV9ocGYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfU0lERVRPTkUsIDcsIDcsIHNpZGV0b25lX2hwZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzaWRldG9uZV9ocGYsCisJCQkgICAgV004OTk2X1NJREVUT05FLCA3LCBzaWRldG9uZV9ocGZfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpocGZfbW9kZV90ZXh0W10gPSB7CiAJIkhpRmkiLCAiQ3VzdG9tIiwgIlZvaWNlIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AxdHhfaHBmX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMV9UWF9GSUxURVJTLCAzLCAzLCBocGZfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AxdHhfaHBmX21vZGUsCisJCQkgICAgV004OTk2X0RTUDFfVFhfRklMVEVSUywgMywgaHBmX21vZGVfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMnR4X2hwZl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X0RTUDJfVFhfRklMVEVSUywgMywgMywgaHBmX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHNwMnR4X2hwZl9tb2RlLAorCQkJICAgIFdNODk5Nl9EU1AyX1RYX0ZJTFRFUlMsIDMsIGhwZl9tb2RlX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqaHBmX2N1dG9mZl90ZXh0W10gPSB7CiAJIjUwSHoiLCAiNzVIeiIsICIxMDBIeiIsICIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMXR4X2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMV9UWF9GSUxURVJTLCAwLCA3LCBocGZfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzcDF0eF9ocGZfY3V0b2ZmLAorCQkJICAgIFdNODk5Nl9EU1AxX1RYX0ZJTFRFUlMsIDAsIGhwZl9jdXRvZmZfdGV4dCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNwMnR4X2hwZl9jdXRvZmYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfRFNQMl9UWF9GSUxURVJTLCAwLCA3LCBocGZfY3V0b2ZmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzcDJ0eF9ocGZfY3V0b2ZmLAorCQkJICAgIFdNODk5Nl9EU1AyX1RYX0ZJTFRFUlMsIDAsIGhwZl9jdXRvZmZfdGV4dCk7CiAKIHN0YXRpYyB2b2lkIHdtODk5Nl9zZXRfcmV0dW5lX21vYmlsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBibG9jaykKIHsKQEAgLTc4MCwxNCArNzgwLDE0IEBACiAJIklOMSIsICJJTjIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsZWZ0X3NpZGV0b25lX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfU0lERVRPTkUsIDAsIDIsIHNpZGV0b25lX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGxlZnRfc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5OTZfU0lERVRPTkUsIDAsIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9zaWRldG9uZSA9CiAJU09DX0RBUE1fRU5VTSgiTGVmdCBTaWRldG9uZSIsIGxlZnRfc2lkZXRvbmVfZW51bSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmlnaHRfc2lkZXRvbmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9TSURFVE9ORSwgMSwgMiwgc2lkZXRvbmVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocmlnaHRfc2lkZXRvbmVfZW51bSwKKwkJCSAgICBXTTg5OTZfU0lERVRPTkUsIDEsIHNpZGV0b25lX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfc2lkZXRvbmUgPQogCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IFNpZGV0b25lIiwgcmlnaHRfc2lkZXRvbmVfZW51bSk7CkBAIC03OTYsMTQgKzc5NiwxNCBAQAogCSJEQUMxTCIsICJEQUMxUiIsICJEQUMyTCIsICJEQUMyUiIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BrbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X0xFRlRfUERNX1NQRUFLRVIsIDAsIDQsIHNwa190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGtsX2VudW0sCisJCQkgICAgV004OTk2X0xFRlRfUERNX1NQRUFLRVIsIDAsIHNwa190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa2xfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJTUEtMIiwgc3BrbF9lbnVtKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGtyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfUklHSFRfUERNX1NQRUFLRVIsIDAsIDQsIHNwa190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGtyX2VudW0sCisJCQkgICAgV004OTk2X1JJR0hUX1BETV9TUEVBS0VSLCAwLCBzcGtfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGtyX211eCA9CiAJU09DX0RBUE1fRU5VTSgiU1BLUiIsIHNwa3JfZW51bSk7CkBAIC04MTIsOCArODEyLDggQEAKIAkiQUlGMSIsICJBSUYyIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AxcnhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzgsIDAsIDIsIGRzcDFyeF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AxcnhfZW51bSwKKwkJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCAwLCBkc3AxcnhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkc3AxcnggPQogCVNPQ19EQVBNX0VOVU0oIkRTUDFSWCIsIGRzcDFyeF9lbnVtKTsKQEAgLTgyMiw4ICs4MjIsOCBAQAogCSAiQUlGMiIsICJBSUYxIgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkc3AycnhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzgsIDQsIDIsIGRzcDJyeF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkc3AycnhfZW51bSwKKwkJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCA0LCBkc3AycnhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkc3AycnggPQogCVNPQ19EQVBNX0VOVU0oIkRTUDJSWCIsIGRzcDJyeF9lbnVtKTsKQEAgLTgzMiw4ICs4MzIsOCBAQAogCSJEU1AyIiwgIkRTUDEiLCAiQUlGMSIKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMnR4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF84LCA2LCAzLCBhaWYydHhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWlmMnR4X2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfOCwgNiwgYWlmMnR4X3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMnR4ID0KIAlTT0NfREFQTV9FTlVNKCJBSUYyVFgiLCBhaWYydHhfZW51bSk7CkBAIC04NDIsMTQgKzg0MiwxNCBAQAogCSJBREMiLCAiRE1JQzEiLCAiRE1JQzIiCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGluMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgMCwgMywgaW5tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4xX2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgMCwgaW5tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbjFfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJJTjEgTXV4IiwgaW4xX2VudW0pOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGluMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgNCwgMywgaW5tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaW4yX2VudW0sCisJCQkgICAgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNywgNCwgaW5tdXhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbjJfbXV4ID0KIAlTT0NfREFQTV9FTlVNKCJJTjIgTXV4IiwgaW4yX2VudW0pOwpAQCAtMTYwOCw4ICsxNjA4LDggQEAKIAkJCQltc2xlZXAoNSk7CiAJCQl9CiAKLQkJCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgZmFsc2UpOwotCQkJcmVnY2FjaGVfc3luYyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwkJCXJlZ2NhY2hlX2NhY2hlX29ubHkod204OTk2LT5yZWdtYXAsIGZhbHNlKTsKKwkJCXJlZ2NhY2hlX3N5bmMod204OTk2LT5yZWdtYXApOwogCQl9CiAKIAkJLyogQnlwYXNzIHRoZSBNSUNCSUFTZXMgZm9yIGxvd2VzdCBwb3dlciAqLwpAQCAtMTYyMCwxMCArMTYyMCwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJcmVnY2FjaGVfY2FjaGVfb25seShjb2RlYy0+Y29udHJvbF9kYXRhLCB0cnVlKTsKKwkJcmVnY2FjaGVfY2FjaGVfb25seSh3bTg5OTYtPnJlZ21hcCwgdHJ1ZSk7CiAJCWlmICh3bTg5OTYtPnBkYXRhLmxkb19lbmEgPj0gMCkgewogCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod204OTk2LT5wZGF0YS5sZG9fZW5hLCAwKTsKLQkJCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbnRyb2xfZGF0YSwgdHJ1ZSk7CisJCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHdtODk5Ni0+cmVnbWFwLCB0cnVlKTsKIAkJfQogCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTk2LT5zdXBwbGllcyksCiAJCQkJICAgICAgIHdtODk5Ni0+c3VwcGxpZXMpOwpAQCAtMjI1MSw2ICsyMjUxLDcgQEAKIAkJICB3bTg5OTZfcG9sYXJpdHlfZm4gcG9sYXJpdHlfY2IpCiB7CiAJc3RydWN0IHdtODk5Nl9wcml2ICp3bTg5OTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAl3bTg5OTYtPmphY2sgPSBqYWNrOwogCXdtODk5Ni0+ZGV0ZWN0aW5nID0gdHJ1ZTsKQEAgLTIyNjcsOCArMjI2OCwxMiBAQAogCQkJICAgIFdNODk5Nl9NSUNCMl9ESVNDSCwgMCk7CiAKIAkvKiBMRE8yIHBvd2VycyB0aGUgbWljcm9waG9uZXMsIFNZU0NMSyBjbG9ja3MgZGV0ZWN0aW9uICovCi0Jc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTERPMiIpOwotCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNZU0NMSyIpOworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCisJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxETzIiKTsKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU1lTQ0xLIik7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJLyogV2Ugc3RhcnQgb2ZmIGp1c3QgZW5hYmxpbmcgbWljcm9waG9uZSBkZXRlY3Rpb24gLSBldmVuIGEKIAkgKiBwbGFpbiBoZWFkcGhvbmUgd2lsbCB0cmlnZ2VyIGRldGVjdGlvbi4KQEAgLTI1OTUsNyArMjYwMCw3IEBACiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQWxsb2NhdGVkICVkIHVuaXF1ZSBSZVR1bmUgTW9iaWxlIG5hbWVzXG4iLAogCQl3bTg5OTYtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzKTsKIAotCXdtODk5Ni0+cmV0dW5lX21vYmlsZV9lbnVtLm1heCA9IHdtODk5Ni0+bnVtX3JldHVuZV9tb2JpbGVfdGV4dHM7CisJd204OTk2LT5yZXR1bmVfbW9iaWxlX2VudW0uaXRlbXMgPSB3bTg5OTYtPm51bV9yZXR1bmVfbW9iaWxlX3RleHRzOwogCXdtODk5Ni0+cmV0dW5lX21vYmlsZV9lbnVtLnRleHRzID0gd204OTk2LT5yZXR1bmVfbW9iaWxlX3RleHRzOwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGNvbnRyb2xzLCBBUlJBWV9TSVpFKGNvbnRyb2xzKSk7CkBAIC0yNjI4LDE0ICsyNjMzLDYgQEAKIAlpbml0X2NvbXBsZXRpb24oJndtODk5Ni0+ZGNzX2RvbmUpOwogCWluaXRfY29tcGxldGlvbigmd204OTk2LT5mbGxfbG9jayk7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTk2LT5yZWdtYXA7Ci0KLQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCiAJaWYgKHdtODk5Ni0+cGRhdGEubnVtX3JldHVuZV9tb2JpbGVfY2ZncykKIAkJd204OTk2X3JldHVuZV9tb2JpbGVfcGRhdGEoY29kZWMpOwogCWVsc2UKQEAgLTI2NzQsMTMgKzI2NzEsMTEgQEAKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUTogJWRcbiIsCiAJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgd204OTk2X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTcuYwppbmRleCA1NTUxMTVlLi4wMDQxODZiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk3LmMKQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYXJpem9uYS0+cmVnbWFwOwogCWNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCAqcGF0Y2ggPSBOVUxMOwogCWludCBpLCBwYXRjaF9zaXplOwogCkBAIC0xMjMsMTAgKzEyMywxMiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk5N19ocG91dF9vc3JbXSA9IHsKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfMUwsCi0JCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDFfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtODk5N19vc3JfdGV4dCksCiAJCQkgICAgICB3bTg5OTdfb3NyX3RleHQsIHdtODk5N19vc3JfdmFsKSwKIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfM0wsCi0JCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsIDMsCisJCQkgICAgICBBUklaT05BX09VVDNfT1NSX1NISUZULCAweDcsCisJCQkgICAgICBBUlJBWV9TSVpFKHdtODk5N19vc3JfdGV4dCksCiAJCQkgICAgICB3bTg5OTdfb3NyX3RleHQsIHdtODk5N19vc3JfdmFsKSwKIH07CiAKQEAgLTE3MCwxNSArMTcyLDggQEAKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRMyIsIEFSSVpPTkFfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKIEFSSVpPTkFfTUlYRVJfQ09OVFJPTFMoIkVRNCIsIEFSSVpPTkFfRVE0TUlYX0lOUFVUXzFfU09VUkNFKSwKIAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTEgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTFfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVExX0VOQV9NQVNLKSwKLVNORF9TT0NfQllURVNfTUFTSygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzEsIDIxLAotCQkgICBBUklaT05BX0VRMl9FTkFfTUFTSyksCi1TTkRfU09DX0JZVEVTX01BU0soIkVRMyBDb2VmZmljaWVudHMiLCBBUklaT05BX0VRM18xLCAyMSwKLQkJICAgQVJJWk9OQV9FUTNfRU5BX01BU0spLAotU05EX1NPQ19CWVRFU19NQVNLKCJFUTQgQ29lZmZpY2llbnRzIiwgQVJJWk9OQV9FUTRfMSwgMjEsCi0JCSAgIEFSSVpPTkFfRVE0X0VOQV9NQVNLKSwKLQorU05EX1NPQ19CWVRFUygiRVExIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVExXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMSBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVExXzIsIEFSSVpPTkFfRVExX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMSBCMSBWb2x1bWUiLCBBUklaT05BX0VRMV8xLCBBUklaT05BX0VRMV9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTEgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTFfMSwgQVJJWk9OQV9FUTFfQjJfR0FJTl9TSElGVCwKQEAgLTE5MCw2ICsxODUsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMSBCNSBWb2x1bWUiLCBBUklaT05BX0VRMV8yLCBBUklaT05BX0VRMV9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEyIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEyXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMiBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEyXzIsIEFSSVpPTkFfRVEyX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMiBCMSBWb2x1bWUiLCBBUklaT05BX0VRMl8xLCBBUklaT05BX0VRMl9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTIgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTJfMSwgQVJJWk9OQV9FUTJfQjJfR0FJTl9TSElGVCwKQEAgLTIwMSw2ICsxOTgsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMiBCNSBWb2x1bWUiLCBBUklaT05BX0VRMl8yLCBBUklaT05BX0VRMl9CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVEzIENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVEzXzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRMyBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVEzXzIsIEFSSVpPTkFfRVEzX0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRMyBCMSBWb2x1bWUiLCBBUklaT05BX0VRM18xLCBBUklaT05BX0VRM19CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTMgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTNfMSwgQVJJWk9OQV9FUTNfQjJfR0FJTl9TSElGVCwKQEAgLTIxMiw2ICsyMTEsOCBAQAogU09DX1NJTkdMRV9UTFYoIkVRMyBCNSBWb2x1bWUiLCBBUklaT05BX0VRM18yLCBBUklaT05BX0VRM19CNV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIAorU05EX1NPQ19CWVRFUygiRVE0IENvZWZmaWNpZW50cyIsIEFSSVpPTkFfRVE0XzMsIDE5KSwKK1NPQ19TSU5HTEUoIkVRNCBNb2RlIFN3aXRjaCIsIEFSSVpPTkFfRVE0XzIsIEFSSVpPTkFfRVE0X0IxX01PREUsIDEsIDApLAogU09DX1NJTkdMRV9UTFYoIkVRNCBCMSBWb2x1bWUiLCBBUklaT05BX0VRNF8xLCBBUklaT05BX0VRNF9CMV9HQUlOX1NISUZULAogCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKIFNPQ19TSU5HTEVfVExWKCJFUTQgQjIgVm9sdW1lIiwgQVJJWk9OQV9FUTRfMSwgQVJJWk9OQV9FUTRfQjJfR0FJTl9TSElGVCwKQEAgLTEwNTIsOSArMTA1Myw3IEBACiAJc3RydWN0IHdtODk5N19wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKLQotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCAzMiwgMTYsIFNORF9TT0NfUkVHTUFQKTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKaW5kZXggMDk4MmMxZC4uZDE4ZWZmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCkBAIC0yNjgsOCArMjY4LDcgQEAKIAkiMCIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19oaWdoID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18zLCAzLCA2LCBkcmNfaGlnaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfaGlnaCwgV005MDgxX0RSQ18zLCAzLCBkcmNfaGlnaF90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19sb3dfdGV4dFtdID0gewogCSIxIiwKQEAgLTI3OSw4ICsyNzgsNyBAQAogCSIwIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2xvdyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EUkNfMywgMCwgNSwgZHJjX2xvd190ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfbG93LCBXTTkwODFfRFJDXzMsIDAsIGRyY19sb3dfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfYXRrX3RleHRbXSA9IHsKIAkiMTgxdXMiLApAQCAtMjk3LDggKzI5NSw3IEBACiAJIjE4NS42bXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfYXRrID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18yLCAxMiwgMTIsIGRyY19hdGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHJjX2F0aywgV005MDgxX0RSQ18yLCAxMiwgZHJjX2F0a190ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19kY3lfdGV4dFtdID0gewogCSIxODZtcyIsCkBAIC0zMTIsOCArMzA5LDcgQEAKIAkiNDcuNTZzIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2RjeSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EUkNfMiwgOCwgOSwgZHJjX2RjeV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChkcmNfZGN5LCBXTTkwODFfRFJDXzIsIDgsIGRyY19kY3lfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmNfcXJfZGN5X3RleHRbXSA9IHsKIAkiMC43MjVtcyIsCkBAIC0zMjEsOCArMzE3LDcgQEAKIAkiNS44bXMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcXJfZGN5ID0KLQlTT0NfRU5VTV9TSU5HTEUoV005MDgxX0RSQ18yLCA0LCAzLCBkcmNfcXJfZGN5X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRyY19xcl9kY3ksIFdNOTA4MV9EUkNfMiwgNCwgZHJjX3FyX2RjeV90ZXh0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRhY19kZWVtcGhfdGV4dFtdID0gewogCSJOb25lIiwKQEAgLTMzMSwxNiArMzI2LDE2IEBACiAJIjQ4a0h6IiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waCA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNOTA4MV9EQUNfRElHSVRBTF8yLCAxLCA0LCBkYWNfZGVlbXBoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRhY19kZWVtcGgsIFdNOTA4MV9EQUNfRElHSVRBTF8yLCAxLAorCQkJICAgIGRhY19kZWVtcGhfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzcGVha2VyX21vZGVfdGV4dFtdID0gewogCSJDbGFzcyBEIiwKIAkiQ2xhc3MgQUIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGVha2VyX21vZGUgPQotCVNPQ19FTlVNX1NJTkdMRShXTTkwODFfQU5BTE9HVUVfU1BFQUtFUl8yLCA2LCAyLCBzcGVha2VyX21vZGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9tb2RlLCBXTTkwODFfQU5BTE9HVUVfU1BFQUtFUl8yLCA2LAorCQkJICAgIHNwZWFrZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIGludCBzcGVha2VyX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtMTI2NSwxNSArMTI2MCw2IEBACiBzdGF0aWMgaW50IHdtOTA4MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtOTA4MV9wcml2ICp3bTkwODEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtOTA4MS0+cmVnbWFwOwotCi0JcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX1JFR01BUCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAkvKiBFbmFibGUgemVybyBjcm9zcyBieSBkZWZhdWx0ICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV005MDgxX0FOQUxPR1VFX0xJTkVPVVQsCkBAIC0xMjg4LDcgKzEyNzQsNyBAQAogCQkJCSAgICAgQVJSQVlfU0laRSh3bTkwODFfZXFfY29udHJvbHMpKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtOTA4MV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKaW5kZXggYTA3ZmUxNi4uODc5MzQxNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCkBAIC01MjIsMTYgKzUyMiw2IEBACiAKIHN0YXRpYyBpbnQgd205MDkwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3Qgd205MDkwX3ByaXYgKndtOTA5MCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKLQlpbnQgcmV0OwotCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtOTA5MC0+cmVnbWFwOwotCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19SRUdNQVApOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogQ29uZmlndXJlIHNvbWUgZGVmYXVsdHM7IHRoZXkgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIHdlCiAJICogYnJpbmcgdGhlIGJpYXMgdXAuCiAJICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYwppbmRleCA3MGNlNjc5My4uYzBiN2Y0NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jCkBAIC02NywxMiArNjcsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTk3MDVfcmVjX3NlbFtdID0geyJNaWMiLCAiQ0QiLCAiTkMiLCAiTkMiLAogCSJMaW5lIiwgIlN0ZXJlbyBNaXgiLCAiTW9ubyBNaXgiLCAiUGhvbmUifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTk3MDVfZW51bV9taWMgPQotCVNPQ19FTlVNX1NJTkdMRShBQzk3X0dFTkVSQUxfUFVSUE9TRSwgOCwgMiwgd205NzA1X21pYyk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtOTcwNV9lbnVtX3JlY19sID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19SRUNfU0VMLCA4LCA4LCB3bTk3MDVfcmVjX3NlbCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtOTcwNV9lbnVtX3JlY19yID0KLQlTT0NfRU5VTV9TSU5HTEUoQUM5N19SRUNfU0VMLCAwLCA4LCB3bTk3MDVfcmVjX3NlbCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wod205NzA1X2VudW1fbWljLAorCQkJICAgIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA4LCB3bTk3MDVfbWljKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTk3MDVfZW51bV9yZWNfbCwKKwkJCSAgICBBQzk3X1JFQ19TRUwsIDgsIHdtOTcwNV9yZWNfc2VsKTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTCh3bTk3MDVfZW51bV9yZWNfciwKKwkJCSAgICBBQzk3X1JFQ19TRUwsIDAsIHdtOTcwNV9yZWNfc2VsKTsKIAogLyogSGVhZHBob25lIE1peGVyICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd205NzA1X2hwX21peGVyX2NvbnRyb2xzW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCmluZGV4IDQ0NDYyNmYuLmJiNWY3YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCkBAIC02ODQsMjQgKzY4NCwzOCBAQAogCQl9CiAKIAkJaWYgKHJlZykgewotCQkJYnVmID0gd21fYWRzcF9idWZfYWxsb2MocmVnaW9uLT5kYXRhLAotCQkJCQkJbGUzMl90b19jcHUocmVnaW9uLT5sZW4pLAotCQkJCQkJJmJ1Zl9saXN0KTsKLQkJCWlmICghYnVmKSB7Ci0JCQkJYWRzcF9lcnIoZHNwLCAiT3V0IG9mIG1lbW9yeVxuIik7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIG91dF9mdzsKLQkJCX0KKwkJCXNpemVfdCB0b193cml0ZSA9IFBBR0VfU0laRTsKKwkJCXNpemVfdCByZW1haW4gPSBsZTMyX3RvX2NwdShyZWdpb24tPmxlbik7CisJCQljb25zdCB1OCAqZGF0YSA9IHJlZ2lvbi0+ZGF0YTsKIAotCQkJcmV0ID0gcmVnbWFwX3Jhd193cml0ZV9hc3luYyhyZWdtYXAsIHJlZywgYnVmLT5idWYsCi0JCQkJCQkgICAgIGxlMzJfdG9fY3B1KHJlZ2lvbi0+bGVuKSk7Ci0JCQlpZiAocmV0ICE9IDApIHsKLQkJCQlhZHNwX2Vycihkc3AsCi0JCQkJCSIlcy4lZDogRmFpbGVkIHRvIHdyaXRlICVkIGJ5dGVzIGF0ICVkIGluICVzOiAlZFxuIiwKLQkJCQkJZmlsZSwgcmVnaW9ucywKLQkJCQkJbGUzMl90b19jcHUocmVnaW9uLT5sZW4pLCBvZmZzZXQsCi0JCQkJCXJlZ2lvbl9uYW1lLCByZXQpOwotCQkJCWdvdG8gb3V0X2Z3OworCQkJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJCQlpZiAocmVtYWluIDwgUEFHRV9TSVpFKQorCQkJCQl0b193cml0ZSA9IHJlbWFpbjsKKworCQkJCWJ1ZiA9IHdtX2Fkc3BfYnVmX2FsbG9jKGRhdGEsCisJCQkJCQkJdG9fd3JpdGUsCisJCQkJCQkJJmJ1Zl9saXN0KTsKKwkJCQlpZiAoIWJ1ZikgeworCQkJCQlhZHNwX2Vycihkc3AsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJZ290byBvdXRfZnc7CisJCQkJfQorCisJCQkJcmV0ID0gcmVnbWFwX3Jhd193cml0ZV9hc3luYyhyZWdtYXAsIHJlZywKKwkJCQkJCQkgICAgIGJ1Zi0+YnVmLAorCQkJCQkJCSAgICAgdG9fd3JpdGUpOworCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQlhZHNwX2Vycihkc3AsCisJCQkJCQkiJXMuJWQ6IEZhaWxlZCB0byB3cml0ZSAlemQgYnl0ZXMgYXQgJWQgaW4gJXM6ICVkXG4iLAorCQkJCQkJZmlsZSwgcmVnaW9ucywKKwkJCQkJCXRvX3dyaXRlLCBvZmZzZXQsCisJCQkJCQlyZWdpb25fbmFtZSwgcmV0KTsKKwkJCQkJZ290byBvdXRfZnc7CisJCQkJfQorCisJCQkJZGF0YSArPSB0b193cml0ZTsKKwkJCQlyZWcgKz0gdG9fd3JpdGUgLyAyOworCQkJCXJlbWFpbiAtPSB0b193cml0ZTsKIAkJCX0KIAkJfQogCkBAIC0xNjc5LDYgKzE2OTMsOCBAQAogCQkJbGlzdF9kZWwoJmFsZ19yZWdpb24tPmxpc3QpOwogCQkJa2ZyZWUoYWxnX3JlZ2lvbik7CiAJCX0KKworCQlhZHNwX2RiZyhkc3AsICJTaHV0ZG93biBjb21wbGV0ZVxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKaW5kZXggYjM3MTA2Ni4uYjYyMDk2NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKQEAgLTUwLDE2ICs1MCwxNiBAQAogCSJWTUlEIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BlYWtlcl9yZWYgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTNfU1BFQUtFUl9NSVhFUiwgOCwgMiwgc3BlYWtlcl9yZWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BlYWtlcl9yZWYsCisJCQkgICAgV004OTkzX1NQRUFLRVJfTUlYRVIsIDgsIHNwZWFrZXJfcmVmX3RleHQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3BlYWtlcl9tb2RlX3RleHRbXSA9IHsKIAkiQ2xhc3MgRCIsCiAJIkNsYXNzIEFCIiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BlYWtlcl9tb2RlID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTkzX1NQS01JWFJfQVRURU5VQVRJT04sIDgsIDIsIHNwZWFrZXJfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGVha2VyX21vZGUsCisJCQkgICAgV004OTkzX1NQS01JWFJfQVRURU5VQVRJT04sIDgsIHNwZWFrZXJfbW9kZV90ZXh0KTsKIAogc3RhdGljIHZvaWQgd2FpdF9mb3JfZGNfc2Vydm8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgb3ApCiB7CkBAIC03MzUsMTUgKzczNSwxNSBAQAogCSJEQUMiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocGxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19PVVRQVVRfTUlYRVIxLCA4LCAyLCBocF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHBsX2VudW0sCisJCQkgICAgV004OTkzX09VVFBVVF9NSVhFUjEsIDgsIGhwX211eF90ZXh0KTsKIAogY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21faHVic19ocGxfbXV4ID0KIAlXTV9IVUJTX0VOVU1fVygiTGVmdCBIZWFkcGhvbmUgTXV4IiwgaHBsX2VudW0pOwogRVhQT1JUX1NZTUJPTF9HUEwod21faHVic19ocGxfbXV4KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocHJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5M19PVVRQVVRfTUlYRVIyLCA4LCAyLCBocF9tdXhfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woaHByX2VudW0sCisJCQkgICAgV004OTkzX09VVFBVVF9NSVhFUjIsIDgsIGhwX211eF90ZXh0KTsKIAogY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21faHVic19ocHJfbXV4ID0KIAlXTV9IVUJTX0VOVU1fVygiUmlnaHQgSGVhZHBob25lIE11eCIsIGhwcl9lbnVtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCmluZGV4IDVlM2JjM2MuLmNhYjk4YTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZWRtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzAsOSArMzEsMzQgQEAKICNpbmNsdWRlICJkYXZpbmNpLWkycy5oIgogCiBzdHJ1Y3Qgc25kX3NvY19jYXJkX2RydmRhdGFfZGF2aW5jaSB7CisJc3RydWN0IGNsayAqbWNsazsKIAl1bnNpZ25lZCBzeXNjbGs7CiB9OwogCitzdGF0aWMgaW50IGV2bV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpzb2NfY2FyZCA9IHJ0ZC0+Y29kZWMtPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPQorCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoc29jX2NhcmQpOworCisJaWYgKGRydmRhdGEtPm1jbGspCisJCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUoZHJ2ZGF0YS0+bWNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXZtX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpzb2NfY2FyZCA9IHJ0ZC0+Y29kZWMtPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPQorCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoc29jX2NhcmQpOworCisJaWYgKGRydmRhdGEtPm1jbGspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnZkYXRhLT5tY2xrKTsKK30KKwogc3RhdGljIGludCBldm1faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewpAQCAtNTksNiArODUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGV2bV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBldm1fc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBldm1fc2h1dGRvd24sCiAJLmh3X3BhcmFtcyA9IGV2bV9od19wYXJhbXMsCiB9OwogCkBAIC05NSwzNSArMTIzLDI5IEBACiAvKiBMb2dpYyBmb3IgYSBhaWMzeCBhcyBjb25uZWN0ZWQgb24gYSBkYXZpbmNpLWV2bSAqLwogc3RhdGljIGludCBldm1fYWljM3hfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGNvZGVjLT5jYXJkLT5kZXYtPm9mX25vZGU7CiAJaW50IHJldDsKIAogCS8qIEFkZCBkYXZpbmNpLWV2bSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhaWMzeF9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY2FyZC0+ZGFwbSwgYWljM3hfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShhaWMzeF9kYXBtX3dpZGdldHMpKTsKIAogCWlmIChucCkgewotCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoY29kZWMtPmNhcmQsCi0JCQkJCQkJInRpLGF1ZGlvLXJvdXRpbmciKTsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKGNhcmQsICJ0aSxhdWRpby1yb3V0aW5nIik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZSB7CiAJCS8qIFNldCB1cCBkYXZpbmNpLWV2bSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLCBhdWRpb19tYXAsCisJCQkJCUFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAJfQogCiAJLyogbm90IGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTU9OT19MT1VUIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUExDT00iKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhQUkNPTSIpOwotCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIE91dCIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEluIik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJNT05PX0xPVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIkhQTENPTSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oJmNvZGVjLT5kYXBtLCAiSFBSQ09NIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0OCw2ICszNzAsNyBAQAogCQlvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKGRhdmluY2lfZXZtX2R0X2lkcyksICZwZGV2LT5kZXYpOwogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWkgPSAoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKikgbWF0Y2gtPmRhdGE7CiAJc3RydWN0IHNuZF9zb2NfY2FyZF9kcnZkYXRhX2RhdmluY2kgKmRydmRhdGEgPSBOVUxMOworCXN0cnVjdCBjbGsgKm1jbGs7CiAJaW50IHJldCA9IDA7CiAKIAlldm1fc29jX2NhcmQuZGFpX2xpbmsgPSBkYWk7CkBAIC0zNjcsMTMgKzM5MCwzOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwltY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtY2xrIik7CisJaWYgKFBUUl9FUlIobWNsaykgPT0gLUVQUk9CRV9ERUZFUikgeworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9IGVsc2UgaWYgKElTX0VSUihtY2xrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtY2xrIG5vdCBmb3VuZC5cbiIpOworCQltY2xrID0gTlVMTDsKKwl9CisKIAlkcnZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZHJ2ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkcnZkYXRhLT5tY2xrID0gbWNsazsKKwogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY29kZWMtY2xvY2stcmF0ZSIsICZkcnZkYXRhLT5zeXNjbGspOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZXQgPCAwKSB7CisJCWlmICghZHJ2ZGF0YS0+bWNsaykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJObyBjbG9jayBvciBjbG9jayByYXRlIGRlZmluZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRydmRhdGEtPnN5c2NsayA9IGNsa19nZXRfcmF0ZShkcnZkYXRhLT5tY2xrKTsKKwl9IGVsc2UgaWYgKGRydmRhdGEtPm1jbGspIHsKKwkJdW5zaWduZWQgaW50IHJlcXVlc3RkX3JhdGUgPSBkcnZkYXRhLT5zeXNjbGs7CisJCWNsa19zZXRfcmF0ZShkcnZkYXRhLT5tY2xrLCBkcnZkYXRhLT5zeXNjbGspOworCQlkcnZkYXRhLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoZHJ2ZGF0YS0+bWNsayk7CisJCWlmIChkcnZkYXRhLT5zeXNjbGsgIT0gcmVxdWVzdGRfcmF0ZSkKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJDb3VsZCBub3QgZ2V0IHJlcXVlc3RlZCByYXRlICV1IHVzaW5nICV1LlxuIiwKKwkJCQkgcmVxdWVzdGRfcmF0ZSwgZHJ2ZGF0YS0+c3lzY2xrKTsKKwl9CiAKIAlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJmV2bV9zb2NfY2FyZCwgZHJ2ZGF0YSk7CiAJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJmV2bV9zb2NfY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKaW5kZXggNjcwYWZhMi4uYTAxYWU5NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYwpAQCAtMzcsNiArMzcsMTYgQEAKICNpbmNsdWRlICJkYXZpbmNpLXBjbS5oIgogI2luY2x1ZGUgImRhdmluY2ktbWNhc3AuaCIKIAorc3RydWN0IGRhdmluY2lfbWNhc3BfY29udGV4dCB7CisJdTMyCXR4Zm10Y3RsOworCXUzMglyeGZtdGN0bDsKKwl1MzIJdHhmbXQ7CisJdTMyCXJ4Zm10OworCXUzMglhY2xreGN0bDsKKwl1MzIJYWNsa3JjdGw7CisJdTMyCXBkaXI7Cit9OworCiBzdHJ1Y3QgZGF2aW5jaV9tY2FzcCB7CiAJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgZG1hX3BhcmFtc1syXTsKIAlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgZG1hX2RhdGFbMl07CkBAIC01Myw2ICs2Myw5IEBACiAJdTE2CWJjbGtfbHJjbGtfcmF0aW87CiAJaW50CXN0cmVhbXM7CiAKKwlpbnQJc3lzY2xrX2ZyZXE7CisJYm9vbAliY2xrX21hc3RlcjsKKwogCS8qIE1jQVNQIEZJRk8gcmVsYXRlZCAqLwogCXU4CXR4bnVtZXZ0OwogCXU4CXJ4bnVtZXZ0OwpAQCAtNjAsMTUgKzczLDcgQEAKIAlib29sCWRhdF9wb3J0OwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCi0Jc3RydWN0IHsKLQkJdTMyCXR4Zm10Y3RsOwotCQl1MzIJcnhmbXRjdGw7Ci0JCXUzMgl0eGZtdDsKLQkJdTMyCXJ4Zm10OwotCQl1MzIJYWNsa3hjdGw7Ci0JCXUzMglhY2xrcmN0bDsKLQkJdTMyCXBkaXI7Ci0JfSBjb250ZXh0OworCXN0cnVjdCBkYXZpbmNpX21jYXNwX2NvbnRleHQgY29udGV4dDsKICNlbmRpZgogfTsKIApAQCAtMjk0LDYgKzI5OSw3IEBACiAKIAkJbWNhc3Bfc2V0X2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFDTEtYIHwgQUNMS1IpOwogCQltY2FzcF9zZXRfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9QRElSX1JFRywgQUZTWCB8IEFGU1IpOworCQltY2FzcC0+YmNsa19tYXN0ZXIgPSAxOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CiAJCS8qIGNvZGVjIGlzIGNsb2NrIG1hc3RlciBhbmQgZnJhbWUgc2xhdmUgKi8KQEAgLTMwNSw2ICszMTEsNyBAQAogCiAJCW1jYXNwX2Nscl9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBBQ0xLWCB8IEFDTEtSKTsKIAkJbWNhc3Bfc2V0X2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFGU1ggfCBBRlNSKTsKKwkJbWNhc3AtPmJjbGtfbWFzdGVyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgogCQkvKiBjb2RlYyBpcyBjbG9jayBhbmQgZnJhbWUgbWFzdGVyICovCkBAIC0zMTYsNiArMzIzLDcgQEAKIAogCQltY2FzcF9jbHJfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9QRElSX1JFRywKIAkJCSAgICAgICBBQ0xLWCB8IEFIQ0xLWCB8IEFGU1ggfCBBQ0xLUiB8IEFIQ0xLUiB8IEFGU1IpOworCQltY2FzcC0+YmNsa19tYXN0ZXIgPSAwOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00MTAsNiArNDE4LDggQEAKIAkJbWNhc3BfY2xyX2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFIQ0xLWCk7CiAJfQogCisJbWNhc3AtPnN5c2Nsa19mcmVxID0gZnJlcTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MDMsMjAgKzYxMywyMyBAQAogCXU4IGZpZm9fbGV2ZWw7CiAJdTggc2xvdHMgPSBtY2FzcC0+dGRtX3Nsb3RzOwogCXU4IGFjdGl2ZV9zZXJpYWxpemVyczsKLQlpbnQgY2hhbm5lbHM7CisJaW50IGNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpwY21fY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7Ci0JY2hhbm5lbHMgPSBwY21fY2hhbm5lbHMtPm1pbjsKIAotCWFjdGl2ZV9zZXJpYWxpemVycyA9IChjaGFubmVscyArIHNsb3RzIC0gMSkgLyBzbG90czsKKwkvKiBJZiBtY2FzcCBpcyBCQ0xLIG1hc3RlciB3ZSBuZWVkIHRvIHNldCBCQ0xLIGRpdmlkZXIgKi8KKwlpZiAobWNhc3AtPmJjbGtfbWFzdGVyKSB7CisJCXVuc2lnbmVkIGludCBiY2xrX2ZyZXEgPSBzbmRfc29jX3BhcmFtc190b19iY2xrKHBhcmFtcyk7CisJCWlmIChtY2FzcC0+c3lzY2xrX2ZyZXEgJSBiY2xrX2ZyZXEgIT0gMCkgeworCQkJZGV2X2VycihtY2FzcC0+ZGV2LCAiQ2FuJ3QgcHJvZHVjZSByZXF1cmVkIEJDTEtcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGF2aW5jaV9tY2FzcF9zZXRfY2xrZGl2KAorCQkJY3B1X2RhaSwgMSwgbWNhc3AtPnN5c2Nsa19mcmVxIC8gYmNsa19mcmVxKTsKKwl9CiAKLQlpZiAobWNhc3BfY29tbW9uX2h3X3BhcmFtKG1jYXNwLCBzdWJzdHJlYW0tPnN0cmVhbSwgY2hhbm5lbHMpID09IC1FSU5WQUwpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlmaWZvX2xldmVsID0gbWNhc3AtPnR4bnVtZXZ0ICogYWN0aXZlX3NlcmlhbGl6ZXJzOwotCWVsc2UKLQkJZmlmb19sZXZlbCA9IG1jYXNwLT5yeG51bWV2dCAqIGFjdGl2ZV9zZXJpYWxpemVyczsKKwlyZXQgPSBtY2FzcF9jb21tb25faHdfcGFyYW0obWNhc3AsIHN1YnN0cmVhbS0+c3RyZWFtLCBjaGFubmVscyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChtY2FzcC0+b3BfbW9kZSA9PSBEQVZJTkNJX01DQVNQX0RJVF9NT0RFKQogCQlyZXQgPSBtY2FzcF9kaXRfaHdfcGFyYW0obWNhc3ApOwpAQCAtNjU4LDYgKzY3MSwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBDYWxjdWxhdGUgRklGTyBsZXZlbCAqLworCWFjdGl2ZV9zZXJpYWxpemVycyA9IChjaGFubmVscyArIHNsb3RzIC0gMSkgLyBzbG90czsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZmlmb19sZXZlbCA9IG1jYXNwLT50eG51bWV2dCAqIGFjdGl2ZV9zZXJpYWxpemVyczsKKwllbHNlCisJCWZpZm9fbGV2ZWwgPSBtY2FzcC0+cnhudW1ldnQgKiBhY3RpdmVfc2VyaWFsaXplcnM7CisKIAlpZiAobWNhc3AtPnZlcnNpb24gPT0gTUNBU1BfVkVSU0lPTl8yICYmICFmaWZvX2xldmVsKQogCQlkbWFfcGFyYW1zLT5hY250ID0gNDsKIAllbHNlCkBAIC03MTksNiArNzM5LDQzIEBACiAJLnNldF9zeXNjbGsJPSBkYXZpbmNpX21jYXNwX3NldF9zeXNjbGssCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGRhdmluY2lfbWNhc3Bfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXN0cnVjdCBkYXZpbmNpX21jYXNwX2NvbnRleHQgKmNvbnRleHQgPSAmbWNhc3AtPmNvbnRleHQ7CisKKwljb250ZXh0LT50eGZtdGN0bCA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfVFhGTUNUTF9SRUcpOworCWNvbnRleHQtPnJ4Zm10Y3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNQ1RMX1JFRyk7CisJY29udGV4dC0+dHhmbXQgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1UX1JFRyk7CisJY29udGV4dC0+cnhmbXQgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1UX1JFRyk7CisJY29udGV4dC0+YWNsa3hjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtYQ1RMX1JFRyk7CisJY29udGV4dC0+YWNsa3JjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtSQ1RMX1JFRyk7CisJY29udGV4dC0+cGRpciA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGRhdmluY2lfbWNhc3AgKm1jYXNwID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9jb250ZXh0ICpjb250ZXh0ID0gJm1jYXNwLT5jb250ZXh0OworCisJbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNQ1RMX1JFRywgY29udGV4dC0+dHhmbXRjdGwpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTUNUTF9SRUcsIGNvbnRleHQtPnJ4Zm10Y3RsKTsKKwltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1UX1JFRywgY29udGV4dC0+dHhmbXQpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTVRfUkVHLCBjb250ZXh0LT5yeGZtdCk7CisJbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLWENUTF9SRUcsIGNvbnRleHQtPmFjbGt4Y3RsKTsKKwltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtSQ1RMX1JFRywgY29udGV4dC0+YWNsa3JjdGwpOworCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIGNvbnRleHQtPnBkaXIpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBkYXZpbmNpX21jYXNwX3N1c3BlbmQgTlVMTAorI2RlZmluZSBkYXZpbmNpX21jYXNwX3Jlc3VtZSBOVUxMCisjZW5kaWYKKwogI2RlZmluZSBEQVZJTkNJX01DQVNQX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCiAKICNkZWZpbmUgREFWSU5DSV9NQ0FTUF9QQ01fRk1UUyAoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFwKQEAgLTczNSw2ICs3OTIsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGF2aW5jaV9tY2FzcF9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJkYXZpbmNpLW1jYXNwLjAiLAorCQkuc3VzcGVuZAk9IGRhdmluY2lfbWNhc3Bfc3VzcGVuZCwKKwkJLnJlc3VtZQkJPSBkYXZpbmNpX21jYXNwX3Jlc3VtZSwKIAkJLnBsYXliYWNrCT0gewogCQkJLmNoYW5uZWxzX21pbgk9IDIsCiAJCQkuY2hhbm5lbHNfbWF4CT0gMzIgKiAxNiwKQEAgLTc2OCwyOCArODI3LDI4IEBACiB9OwogCiAvKiBTb21lIEhXIHNwZWNpZmljIHZhbHVlcyBhbmQgZGVmYXVsdHMuIFRoZSByZXN0IGlzIGZpbGxlZCBpbiBmcm9tIERULiAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBkbTY0NnhfbWNhc3BfcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgZG02NDZ4X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMHg0MDAsCiAJLnJ4X2RtYV9vZmZzZXQgPSAweDQwMCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLAogCS52ZXJzaW9uID0gTUNBU1BfVkVSU0lPTl8xLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBkYTgzMF9tY2FzcF9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSBkYTgzMF9tY2FzcF9wZGF0YSA9IHsKIAkudHhfZG1hX29mZnNldCA9IDB4MjAwMCwKIAkucnhfZG1hX29mZnNldCA9IDB4MjAwMCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLAogCS52ZXJzaW9uID0gTUNBU1BfVkVSU0lPTl8yLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSBhbTMzeHhfbWNhc3BfcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgYW0zM3h4X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMCwKIAkucnhfZG1hX29mZnNldCA9IDAsCiAJLmFzcF9jaGFuX3EgPSBFVkVOVFFfMCwKIAkudmVyc2lvbiA9IE1DQVNQX1ZFUlNJT05fMywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BsYXRmb3JtX2RhdGEgZHJhN19tY2FzcF9wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSBkcmE3X21jYXNwX3BkYXRhID0gewogCS50eF9kbWFfb2Zmc2V0ID0gMHgyMDAsCiAJLnJ4X2RtYV9vZmZzZXQgPSAweDI4NCwKIAkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLApAQCAtODU3LDExICs5MTYsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpkYXZpbmNpX21jYXNwX3NldF9wZGF0YV9mcm9tX29mKAorc3RhdGljIHN0cnVjdCBkYXZpbmNpX21jYXNwX3BkYXRhICpkYXZpbmNpX21jYXNwX3NldF9wZGF0YV9mcm9tX29mKAogCQkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CisJc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgKnBkYXRhID0gTlVMTDsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCA9CiAJCQlvZl9tYXRjaF9kZXZpY2UobWNhc3BfZHRfaWRzLCAmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGRtYV9zcGVjOwpAQCAtODc0LDcgKzkzMyw3IEBACiAJCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJCXJldHVybiBwZGF0YTsKIAl9IGVsc2UgaWYgKG1hdGNoKSB7Ci0JCXBkYXRhID0gKHN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqKSBtYXRjaC0+ZGF0YTsKKwkJcGRhdGEgPSAoc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEqKSBtYXRjaC0+ZGF0YTsKIAl9IGVsc2UgewogCQkvKiBjb250cm9sIHNob3VsZG4ndCByZWFjaCBoZXJlLiBzb21ldGhpbmcgaXMgd3JvbmcgKi8KIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTk2Niw5ICsxMDI1LDEwIEBACiAKIHN0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpkbWFfZGF0YTsKKwlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqZG1hX3BhcmFtczsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgKmRtYV9kYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtLCAqaW9hcmVhLCAqcmVzLCAqZGF0OwotCXN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgKnBkYXRhOwogCXN0cnVjdCBkYXZpbmNpX21jYXNwICptY2FzcDsKIAlpbnQgcmV0OwogCkBAIC0xMDM1LDQxICsxMDk1LDQ5IEBACiAJaWYgKGRhdCkKIAkJbWNhc3AtPmRhdF9wb3J0ID0gdHJ1ZTsKIAotCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOwotCWRtYV9kYXRhLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7Ci0JZG1hX2RhdGEtPnJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQlkbWFfZGF0YS0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKLQlkbWFfZGF0YS0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9wbGF5YmFjazsKKwlkbWFfcGFyYW1zID0gJm1jYXNwLT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKKwlkbWFfcGFyYW1zLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7CisJZG1hX3BhcmFtcy0+cmFtX2NoYW5fcSA9IHBkYXRhLT5yYW1fY2hhbl9xOworCWRtYV9wYXJhbXMtPnNyYW1fcG9vbCA9IHBkYXRhLT5zcmFtX3Bvb2w7CisJZG1hX3BhcmFtcy0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9wbGF5YmFjazsKIAlpZiAoZGF0KQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBkYXQtPnN0YXJ0OworCQlkbWFfcGFyYW1zLT5kbWFfYWRkciA9IGRhdC0+c3RhcnQ7CiAJZWxzZQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnR4X2RtYV9vZmZzZXQ7CisJCWRtYV9wYXJhbXMtPmRtYV9hZGRyID0gbWVtLT5zdGFydCArIHBkYXRhLT50eF9kbWFfb2Zmc2V0OwogCiAJLyogVW5jb25kaXRpb25hbCBkbWFlbmdpbmUgc3R1ZmYgKi8KLQltY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uYWRkciA9IGRtYV9kYXRhLT5kbWFfYWRkcjsKKwlkbWFfZGF0YS0+YWRkciA9IGRtYV9wYXJhbXMtPmRtYV9hZGRyOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKIAlpZiAocmVzKQotCQlkbWFfZGF0YS0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisJCWRtYV9wYXJhbXMtPmNoYW5uZWwgPSByZXMtPnN0YXJ0OwogCWVsc2UKLQkJZG1hX2RhdGEtPmNoYW5uZWwgPSBwZGF0YS0+dHhfZG1hX2NoYW5uZWw7CisJCWRtYV9wYXJhbXMtPmNoYW5uZWwgPSBwZGF0YS0+dHhfZG1hX2NoYW5uZWw7CiAKLQlkbWFfZGF0YSA9ICZtY2FzcC0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOwotCWRtYV9kYXRhLT5hc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7Ci0JZG1hX2RhdGEtPnJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQlkbWFfZGF0YS0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKLQlkbWFfZGF0YS0+c3JhbV9zaXplID0gcGRhdGEtPnNyYW1fc2l6ZV9jYXB0dXJlOwotCWlmIChkYXQpCi0JCWRtYV9kYXRhLT5kbWFfYWRkciA9IGRhdC0+c3RhcnQ7CisJLyogZG1hZW5naW5lIGZpbHRlciBkYXRhIGZvciBEVCBhbmQgbm9uLURUIGJvb3QgKi8KKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICJ0eCI7CiAJZWxzZQotCQlkbWFfZGF0YS0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnJ4X2RtYV9vZmZzZXQ7CisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICZkbWFfcGFyYW1zLT5jaGFubmVsOworCisJZG1hX3BhcmFtcyA9ICZtY2FzcC0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCWRtYV9kYXRhID0gJm1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCWRtYV9wYXJhbXMtPmFzcF9jaGFuX3EgPSBwZGF0YS0+YXNwX2NoYW5fcTsKKwlkbWFfcGFyYW1zLT5yYW1fY2hhbl9xID0gcGRhdGEtPnJhbV9jaGFuX3E7CisJZG1hX3BhcmFtcy0+c3JhbV9wb29sID0gcGRhdGEtPnNyYW1fcG9vbDsKKwlkbWFfcGFyYW1zLT5zcmFtX3NpemUgPSBwZGF0YS0+c3JhbV9zaXplX2NhcHR1cmU7CisJaWYgKGRhdCkKKwkJZG1hX3BhcmFtcy0+ZG1hX2FkZHIgPSBkYXQtPnN0YXJ0OworCWVsc2UKKwkJZG1hX3BhcmFtcy0+ZG1hX2FkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnJ4X2RtYV9vZmZzZXQ7CiAKIAkvKiBVbmNvbmRpdGlvbmFsIGRtYWVuZ2luZSBzdHVmZiAqLwotCW1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmFkZHIgPSBkbWFfZGF0YS0+ZG1hX2FkZHI7CisJZG1hX2RhdGEtPmFkZHIgPSBkbWFfcGFyYW1zLT5kbWFfYWRkcjsKIAogCWlmIChtY2FzcC0+dmVyc2lvbiA8IE1DQVNQX1ZFUlNJT05fMykgewogCQltY2FzcC0+Zmlmb19iYXNlID0gREFWSU5DSV9NQ0FTUF9WMl9BRklGT19CQVNFOwotCQkvKiBkbWFfZGF0YS0+ZG1hX2FkZHIgaXMgcG9pbnRpbmcgdG8gdGhlIGRhdGEgcG9ydCBhZGRyZXNzICovCisJCS8qIGRtYV9wYXJhbXMtPmRtYV9hZGRyIGlzIHBvaW50aW5nIHRvIHRoZSBkYXRhIHBvcnQgYWRkcmVzcyAqLwogCQltY2FzcC0+ZGF0X3BvcnQgPSB0cnVlOwogCX0gZWxzZSB7CiAJCW1jYXNwLT5maWZvX2Jhc2UgPSBEQVZJTkNJX01DQVNQX1YzX0FGSUZPX0JBU0U7CkBAIC0xMDc3LDEzICsxMTQ1LDE1IEBACiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOwogCWlmIChyZXMpCi0JCWRtYV9kYXRhLT5jaGFubmVsID0gcmVzLT5zdGFydDsKKwkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CiAJZWxzZQotCQlkbWFfZGF0YS0+Y2hhbm5lbCA9IHBkYXRhLT5yeF9kbWFfY2hhbm5lbDsKKwkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHBkYXRhLT5yeF9kbWFfY2hhbm5lbDsKIAotCS8qIFVuY29uZGl0aW9uYWwgZG1hZW5naW5lIHN0dWZmICovCi0JbWNhc3AtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmZpbHRlcl9kYXRhID0gInR4IjsKLQltY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5maWx0ZXJfZGF0YSA9ICJyeCI7CisJLyogZG1hZW5naW5lIGZpbHRlciBkYXRhIGZvciBEVCBhbmQgbm9uLURUIGJvb3QgKi8KKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9ICJyeCI7CisJZWxzZQorCQlkbWFfZGF0YS0+ZmlsdGVyX2RhdGEgPSAmZG1hX3BhcmFtcy0+Y2hhbm5lbDsKIAogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtY2FzcCk7CiAKQEAgLTExMjcsNDkgKzExOTcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkYXZpbmNpX21jYXNwICptY2FzcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JbWNhc3AtPmNvbnRleHQudHhmbXRjdGwgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1DVExfUkVHKTsKLQltY2FzcC0+Y29udGV4dC5yeGZtdGN0bCA9IG1jYXNwX2dldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfUlhGTUNUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnR4Zm10ID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNVF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnJ4Zm10ID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNVF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LmFjbGt4Y3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLWENUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LmFjbGtyY3RsID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLUkNUTF9SRUcpOwotCW1jYXNwLT5jb250ZXh0LnBkaXIgPSBtY2FzcF9nZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRhdmluY2lfbWNhc3BfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfVFhGTUNUTF9SRUcsIG1jYXNwLT5jb250ZXh0LnR4Zm10Y3RsKTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1DVExfUkVHLCBtY2FzcC0+Y29udGV4dC5yeGZtdGN0bCk7Ci0JbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9UWEZNVF9SRUcsIG1jYXNwLT5jb250ZXh0LnR4Zm10KTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1JYRk1UX1JFRywgbWNhc3AtPmNvbnRleHQucnhmbXQpOwotCW1jYXNwX3NldF9yZWcobWNhc3AsIERBVklOQ0lfTUNBU1BfQUNMS1hDVExfUkVHLCBtY2FzcC0+Y29udGV4dC5hY2xreGN0bCk7Ci0JbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLUkNUTF9SRUcsIG1jYXNwLT5jb250ZXh0LmFjbGtyY3RsKTsKLQltY2FzcF9zZXRfcmVnKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBtY2FzcC0+Y29udGV4dC5wZGlyKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLVNJTVBMRV9ERVZfUE1fT1BTKGRhdmluY2lfbWNhc3BfcG1fb3BzLAotCQkgIGRhdmluY2lfbWNhc3Bfc3VzcGVuZCwKLQkJICBkYXZpbmNpX21jYXNwX3Jlc3VtZSk7Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhdmluY2lfbWNhc3BfZHJpdmVyID0gewogCS5wcm9iZQkJPSBkYXZpbmNpX21jYXNwX3Byb2JlLAogCS5yZW1vdmUJCT0gZGF2aW5jaV9tY2FzcF9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImRhdmluY2ktbWNhc3AiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLnBtCT0gJmRhdmluY2lfbWNhc3BfcG1fb3BzLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtY2FzcF9kdF9pZHMsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5jIGIvc291bmQvc29jL2RhdmluY2kvZWRtYS1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzhhZmIxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2RhdmluY2kvZWRtYS1wY20uYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogZWRtYS1wY20uYyAtIGVETUEgUENNIGRyaXZlciB1c2luZyBkbWFlbmdpbmUgZm9yIEFNM3h4eCwgQU00eHh4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQXV0aG9yOiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgorICoKKyAqIEJhc2VkIG9uOiBzb3VuZC9zb2MvdGVncmEvdGVncmFfcGNtLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VkbWEuaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGVkbWFfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fQkFUQ0ggfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAxMjggKiAxMDI0LAorCS5wZXJpb2RfYnl0ZXNfbWluCT0gMzIsCisJLnBlcmlvZF9ieXRlc19tYXgJPSA2NCAqIDEwMjQsCisJLnBlcmlvZHNfbWluCQk9IDIsCisJLnBlcmlvZHNfbWF4CQk9IDE5LCAvKiBMaW1pdCBieSBlZG1hIGRtYWVuZ2luZSBkcml2ZXIgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9wY21fY29uZmlnIGVkbWFfZG1hZW5naW5lX3BjbV9jb25maWcgPSB7CisJLnBjbV9oYXJkd2FyZSA9ICZlZG1hX3BjbV9oYXJkd2FyZSwKKwkucHJlcGFyZV9zbGF2ZV9jb25maWcgPSBzbmRfZG1hZW5naW5lX3BjbV9wcmVwYXJlX3NsYXZlX2NvbmZpZywKKwkuY29tcGF0X2ZpbHRlcl9mbiA9IGVkbWFfZmlsdGVyX2ZuLAorCS5wcmVhbGxvY19idWZmZXJfc2l6ZSA9IDEyOCAqIDEwMjQsCit9OworCitpbnQgZWRtYV9wY21fcGxhdGZvcm1fcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZtX3NuZF9kbWFlbmdpbmVfcGNtX3JlZ2lzdGVyKGRldiwgJmVkbWFfZG1hZW5naW5lX3BjbV9jb25maWcsCisJCQkJCVNORF9ETUFFTkdJTkVfUENNX0ZMQUdfQ09NUEFUKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVkbWFfcGNtX3BsYXRmb3JtX3JlZ2lzdGVyKTsKKworTU9EVUxFX0FVVEhPUigiUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiZURNQSBQQ00gQVNvQyBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2VkbWEtcGNtLmggYi9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9lZG1hLXBjbS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBlZG1hLXBjbS5oIC0gZURNQSBQQ00gZHJpdmVyIHVzaW5nIGRtYWVuZ2luZSBmb3IgQU0zeHh4LCBBTTR4eHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBdXRob3I6IFBldGVyIFVqZmFsdXNpIDxwZXRlci51amZhbHVzaUB0aS5jb20+CisgKgorICogQmFzZWQgb246IHNvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fRURNQV9QQ01fSF9fCisjZGVmaW5lIF9fRURNQV9QQ01fSF9fCisKK2ludCBlZG1hX3BjbV9wbGF0Zm9ybV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYgLyogX19FRE1BX1BDTV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvS2NvbmZpZyBiL3NvdW5kL3NvYy9mc2wvS2NvbmZpZwppbmRleCAwN2Y4ZjE0Li4zMzhhOTE2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL0tjb25maWcKKysrIGIvc291bmQvc29jL2ZzbC9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFNORF9TT0NfRlNMX1NBSQogCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9NTUlPCiAJc2VsZWN0IFNORF9TT0NfR0VORVJJQ19ETUFFTkdJTkVfUENNCiAKIGNvbmZpZyBTTkRfU09DX0ZTTF9TU0kKQEAgLTcsOSArOCwxMiBAQAogCiBjb25maWcgU05EX1NPQ19GU0xfU1BESUYKIAl0cmlzdGF0ZQorCXNlbGVjdCBSRUdNQVBfTU1JTwogCiBjb25maWcgU05EX1NPQ19GU0xfRVNBSQogCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9NTUlPCisJc2VsZWN0IFNORF9TT0NfRlNMX1VUSUxTCiAKIGNvbmZpZyBTTkRfU09DX0ZTTF9VVElMUwogCXRyaXN0YXRlCkBAIC0xMTcsNiArMTIxLDcgQEAKIAogY29uZmlnIFNORF9TT0NfSU1YX1NTSQogCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfRlNMX1VUSUxTCiAKIGNvbmZpZyBTTkRfU09DX0lNWF9QQ01fRklRCiAJdHJpc3RhdGUKQEAgLTE2OCwxMiArMTczLDE0IEBACiAJZGVwZW5kcyBvbiBNQUNIX0VVS1JFQV9NQklNWDI3X0JBU0VCT0FSRCBcCiAJCXx8IE1BQ0hfRVVLUkVBX01CSU1YU0QyNV9CQVNFQk9BUkQgXAogCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNEMzVfQkFTRUJPQVJEIFwKLQkJfHwgTUFDSF9FVUtSRUFfTUJJTVhTRDUxX0JBU0VCT0FSRAorCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNENTFfQkFTRUJPQVJEIFwKKwkJfHwgKE9GICYmIEFSTSkKIAlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCi0Jc2VsZWN0IFNORF9TT0NfSU1YX1BDTV9GSVEKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAlzZWxlY3QgU05EX1NPQ19JTVhfQVVETVVYCiAJc2VsZWN0IFNORF9TT0NfSU1YX1NTSQorCXNlbGVjdCBTTkRfU09DX0ZTTF9TU0kKKwlzZWxlY3QgU05EX1NPQ19JTVhfUENNX0RNQQogCWhlbHAKIAkgIEVuYWJsZSBJMlMgYmFzZWQgYWNjZXNzIHRvIHRoZSBUTFYzMjBBSUMyM0IgY29kZWMgYXR0YWNoZWQKIAkgIHRvIHRoZSBTU0kgaW50ZXJmYWNlCkBAIC0yMDQsNyArMjExLDYgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIGkuTVggYm9hcmRzIHdpdGggUy9QRElGIgogCXNlbGVjdCBTTkRfU09DX0lNWF9QQ01fRE1BCiAJc2VsZWN0IFNORF9TT0NfRlNMX1NQRElGCi0Jc2VsZWN0IFJFR01BUF9NTUlPCiAJaGVscAogCSAgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIGkuTVggYm9hcmRzIHdpdGggUy9QRElGCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGFuIGkuTVggYm9hcmQgd2l0aApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9ldWtyZWEtdGx2MzIwLmMgYi9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYwppbmRleCA1OTgzNzQwLi5lYjA5M2Q1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYworKysgYi9zb3VuZC9zb2MvZnNsL2V1a3JlYS10bHYzMjAuYwpAQCAtMTUsOCArMTUsMTEgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMjYsNiArMjksNyBAQAogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3RsdjMyMGFpYzIzLmgiCiAjaW5jbHVkZSAiaW14LXNzaS5oIgorI2luY2x1ZGUgImZzbF9zc2kuaCIKICNpbmNsdWRlICJpbXgtYXVkbXV4LmgiCiAKICNkZWZpbmUgQ09ERUNfQ0xPQ0sgMTIwMDAwMDAKQEAgLTQxLDcgKzQ1LDggQEAKIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CiAJCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CiAJCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0KSB7CisJLyogZnNsX3NzaSBsYWNrcyB0aGUgc2V0X2ZtdCBvcHMuICovCisJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CiAJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LAogCQkJIkZhaWxlZCB0byBzZXQgdGhlIGNwdSBkYWkgZm9ybWF0LlxuIik7CiAJCXJldHVybiByZXQ7CkBAIC02MywxMSArNjgsMTMgQEAKIAkJCSJGYWlsZWQgdG8gc2V0IHRoZSBjb2RlYyBzeXNjbGsuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CisKIAlzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMHhmZmZmZmZjLCAweGZmZmZmZmMsIDIsIDApOwogCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBJTVhfU1NQX1NZU19DTEssIDAsCiAJCQkJU05EX1NPQ19DTE9DS19JTik7Ci0JaWYgKHJldCkgeworCS8qIGZzbF9zc2kgbGFja3MgdGhlIHNldF9zeXNjbGsgb3BzICovCisJaWYgKHJldCAmJiByZXQgIT0gLUVJTlZBTCkgewogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwKIAkJCSJDYW4ndCBzZXQgdGhlIElNWF9TU1BfU1lTX0NMSyBDUFUgc3lzdGVtIGNsb2NrLlxuIik7CiAJCXJldHVybiByZXQ7CkBAIC04NCwxNCArOTEsMTAgQEAKIAkubmFtZQkJPSAidGx2MzIwYWljMjMiLAogCS5zdHJlYW1fbmFtZQk9ICJUTFYzMjBBSUMyMyIsCiAJLmNvZGVjX2RhaV9uYW1lCT0gInRsdjMyMGFpYzIzLWhpZmkiLAotCS5wbGF0Zm9ybV9uYW1lCT0gImlteC1zc2kuMCIsCi0JLmNvZGVjX25hbWUJPSAidGx2MzIwYWljMjMtY29kZWMuMC0wMDFhIiwKLQkuY3B1X2RhaV9uYW1lCT0gImlteC1zc2kuMCIsCiAJLm9wcwkJPSAmZXVrcmVhX3RsdjMyMF9zbmRfb3BzLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgZXVrcmVhX3RsdjMyMCA9IHsKLQkubmFtZQkJPSAiY3B1aW14LWF1ZGlvIiwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rCT0gJmV1a3JlYV90bHYzMjBfZGFpLAogCS5udW1fbGlua3MJPSAxLApAQCAtMTAxLDggKzEwNCw2NSBAQAogewogCWludCByZXQ7CiAJaW50IGludF9wb3J0ID0gMCwgZXh0X3BvcnQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3NpX25wLCAqY29kZWNfbnA7CiAKLQlpZiAobWFjaGluZV9pc19ldWtyZWFfY3B1aW14MjcoKSkgeworCWV1a3JlYV90bHYzMjAuZGV2ID0gJnBkZXYtPmRldjsKKwlpZiAobnApIHsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoJmV1a3JlYV90bHYzMjAsCisJCQkJCQkgImV1a3JlYSxtb2RlbCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImV1a3JlYSxtb2RlbCBub2RlIG1pc3Npbmcgb3IgaW52YWxpZC5cbiIpOworCQkJZ290byBlcnI7CisJCX0KKworCQlzc2lfbnAgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgICJzc2ktY29udHJvbGxlciIsIDApOworCQlpZiAoIXNzaV9ucCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJzc2ktY29udHJvbGxlciBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWNvZGVjX25wID0gb2ZfcGFyc2VfcGhhbmRsZShzc2lfbnAsICJjb2RlYy1oYW5kbGUiLCAwKTsKKwkJaWYgKGNvZGVjX25wKQorCQkJZXVrcmVhX3RsdjMyMF9kYWkuY29kZWNfb2Zfbm9kZSA9IGNvZGVjX25wOworCQllbHNlCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb2RlYy1oYW5kbGUgbm9kZSBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCxtdXgtaW50LXBvcnQiLCAmaW50X3BvcnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImZzbCxtdXgtaW50LXBvcnQgbm9kZSBtaXNzaW5nIG9yIGludmFsaWQuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsbXV4LWV4dC1wb3J0IiwgJmV4dF9wb3J0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJmc2wsbXV4LWV4dC1wb3J0IG5vZGUgbWlzc2luZyBvciBpbnZhbGlkLlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyoKKwkJICogVGhlIHBvcnQgbnVtYmVyaW5nIGluIHRoZSBoYXJkd2FyZSBtYW51YWwgc3RhcnRzIGF0IDEsIHdoaWxlCisJCSAqIHRoZSBhdWRtdXggQVBJIGV4cGVjdHMgaXQgc3RhcnRzIGF0IDAuCisJCSAqLworCQlpbnRfcG9ydC0tOworCQlleHRfcG9ydC0tOworCisJCWV1a3JlYV90bHYzMjBfZGFpLmNwdV9vZl9ub2RlID0gc3NpX25wOworCQlldWtyZWFfdGx2MzIwX2RhaS5wbGF0Zm9ybV9vZl9ub2RlID0gc3NpX25wOworCX0gZWxzZSB7CisJCWV1a3JlYV90bHYzMjBfZGFpLmNwdV9kYWlfbmFtZSA9ICJpbXgtc3NpLjAiOworCQlldWtyZWFfdGx2MzIwX2RhaS5wbGF0Zm9ybV9uYW1lID0gImlteC1zc2kuMCI7CisJCWV1a3JlYV90bHYzMjBfZGFpLmNvZGVjX25hbWUgPSAidGx2MzIwYWljMjMtY29kZWMuMC0wMDFhIjsKKwkJZXVrcmVhX3RsdjMyMC5uYW1lID0gImNwdWlteC1hdWRpbyI7CisJfQorCisJaWYgKG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI3KCkgfHwKKwkgICAgb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpbXgyMS1hdWRtdXgiKSkgewogCQlpbXhfYXVkbXV4X3YxX2NvbmZpZ3VyZV9wb3J0KE1YMjdfQVVETVVYX0hQQ1IxX1NTSTAsCiAJCQlJTVhfQVVETVVYX1YxX1BDUl9TWU4gfAogCQkJSU1YX0FVRE1VWF9WMV9QQ1JfVEZTRElSIHwKQEAgLTExOSw4ICsxNzksMTIgQEAKIAkJKTsKIAl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI1c2QoKSB8fAogCQkgICBtYWNoaW5lX2lzX2V1a3JlYV9jcHVpbXgzNXNkKCkgfHwKLQkJICAgbWFjaGluZV9pc19ldWtyZWFfY3B1aW14NTFzZCgpKSB7Ci0JCWV4dF9wb3J0ID0gbWFjaGluZV9pc19ldWtyZWFfY3B1aW14MjVzZCgpID8gNCA6IDM7CisJCSAgIG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDUxc2QoKSB8fAorCQkgICBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGlteDMxLWF1ZG11eCIpKSB7CisJCWlmICghbnApCisJCQlleHRfcG9ydCA9IG1hY2hpbmVfaXNfZXVrcmVhX2NwdWlteDI1c2QoKSA/CisJCQkJNCA6IDM7CisKIAkJaW14X2F1ZG11eF92Ml9jb25maWd1cmVfcG9ydChpbnRfcG9ydCwKIAkJCUlNWF9BVURNVVhfVjJfUFRDUl9TWU4gfAogCQkJSU1YX0FVRE1VWF9WMl9QVENSX1RGU0RJUiB8CkBAIC0xMzQsMTQgKzE5OCwyNyBAQAogCQkJSU1YX0FVRE1VWF9WMl9QRENSX1JYRFNFTChpbnRfcG9ydCkKIAkJKTsKIAl9IGVsc2UgewotCQkvKiByZXR1cm4gaGFwcHkuIFdlIG1pZ2h0IHJ1biBvbiBhIHRvdGFsbHkgZGlmZmVyZW50IG1hY2hpbmUgKi8KLQkJcmV0dXJuIDA7CisJCWlmIChucCkgeworCQkJLyogVGhlIGV1a3JlYSxhc29jLXRsdjMyMCBkcml2ZXIgd2FzIGV4cGxpY2l0ZWx5CisJCQkgKiByZXF1ZXN0ZWQgKHRocm91Z2ggdGhlIGRldmljZSB0cmVlKS4KKwkJCSAqLworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJNaXNzaW5nIG9yIGludmFsaWQgYXVkbXV4IERUIG5vZGUuXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9IGVsc2UgeworCQkJLyogUmV0dXJuIGhhcHB5LgorCQkJICogV2UgbWlnaHQgcnVuIG9uIGEgdG90YWxseSBkaWZmZXJlbnQgbWFjaGluZS4KKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAKLQlldWtyZWFfdGx2MzIwLmRldiA9ICZwZGV2LT5kZXY7CiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZldWtyZWFfdGx2MzIwKTsKK2VycjoKIAlpZiAocmV0KQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICglZClcbiIsIHJldCk7CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChzc2lfbnApOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MywxMCArMjMwLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF90bHYzMjBfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJldWtyZWEsYXNvYy10bHYzMjAifSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfdGx2MzIwX2R0X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV1a3JlYV90bHYzMjBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImV1a3JlYV90bHYzMjAiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X3RsdjMyMF9kdF9pZHMsCiAJfSwKIAkucHJvYmUgPSBldWtyZWFfdGx2MzIwX3Byb2JlLAogCS5yZW1vdmUgPSBldWtyZWFfdGx2MzIwX3JlbW92ZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYwppbmRleCBjODQwMjZjLi5jOGU1ZGIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9lc2FpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfZXNhaS5jCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlICJmc2xfZXNhaS5oIgogI2luY2x1ZGUgImlteC1wY20uaCIKKyNpbmNsdWRlICJmc2xfdXRpbHMuaCIKIAogI2RlZmluZSBGU0xfRVNBSV9SQVRFUwkJU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKICNkZWZpbmUgRlNMX0VTQUlfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFwKQEAgLTQzMSwxNyArNDMyLDI2IEBACiBzdGF0aWMgaW50IGZzbF9lc2FpX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CisJaW50IHJldDsKIAlzdHJ1Y3QgZnNsX2VzYWkgKmVzYWlfcHJpdiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CiAKIAkvKgogCSAqIFNvbWUgcGxhdGZvcm1zIG1pZ2h0IHVzZSB0aGUgc2FtZSBiaXQgdG8gZ2F0ZSBhbGwgdGhyZWUgb3IgdHdvIG9mCiAJICogY2xvY2tzLCBzbyBrZWVwIGFsbCBjbG9ja3Mgb3Blbi9jbG9zZSBhdCB0aGUgc2FtZSB0aW1lIGZvciBzYWZldHkKIAkgKi8KLQljbGtfcHJlcGFyZV9lbmFibGUoZXNhaV9wcml2LT5jb3JlY2xrKTsKLQlpZiAoIUlTX0VSUihlc2FpX3ByaXYtPmV4dGFsY2xrKSkKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGVzYWlfcHJpdi0+ZXh0YWxjbGspOwotCWlmICghSVNfRVJSKGVzYWlfcHJpdi0+ZnN5c2NsaykpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShlc2FpX3ByaXYtPmZzeXNjbGspOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShlc2FpX3ByaXYtPmNvcmVjbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5leHRhbGNsaykpIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGVzYWlfcHJpdi0+ZXh0YWxjbGspOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZXh0YWxjazsKKwl9CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5mc3lzY2xrKSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZXNhaV9wcml2LT5mc3lzY2xrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2ZzeXNjbGs7CisJfQogCiAJaWYgKCFkYWktPmFjdGl2ZSkgewogCQkvKiBSZXNldCBQb3J0IEMgKi8KQEAgLTQ2Myw2ICs0NzMsMTQgQEAKIAl9CiAKIAlyZXR1cm4gMDsKKworZXJyX2ZzeXNjbGs6CisJaWYgKCFJU19FUlIoZXNhaV9wcml2LT5leHRhbGNsaykpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShlc2FpX3ByaXYtPmV4dGFsY2xrKTsKK2Vycl9leHRhbGNrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShlc2FpX3ByaXYtPmNvcmVjbGspOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmc2xfZXNhaV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCkBAIC01NjQsNiArNTgyLDcgQEAKIAkuaHdfcGFyYW1zID0gZnNsX2VzYWlfaHdfcGFyYW1zLAogCS5zZXRfc3lzY2xrID0gZnNsX2VzYWlfc2V0X2RhaV9zeXNjbGssCiAJLnNldF9mbXQgPSBmc2xfZXNhaV9zZXRfZGFpX2ZtdCwKKwkueGxhdGVfdGRtX3Nsb3RfbWFzayA9IGZzbF9hc29jX3hsYXRlX3RkbV9zbG90X21hc2ssCiAJLnNldF90ZG1fc2xvdCA9IGZzbF9lc2FpX3NldF9kYWlfdGRtX3Nsb3QsCiB9OwogCkBAIC02NjEsNyArNjgwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBmc2xfZXNhaV9yZWdtYXBfY29uZmlnID0geworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGZzbF9lc2FpX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gMzIsCiAJLnJlZ19zdHJpZGUgPSA0LAogCS52YWxfYml0cyA9IDMyLApAQCAtNjg3LDYgKzcwNiw5IEBACiAJZXNhaV9wcml2LT5wZGV2ID0gcGRldjsKIAlzdHJjcHkoZXNhaV9wcml2LT5uYW1lLCBucC0+bmFtZSk7CiAKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbiIpKQorCQlmc2xfZXNhaV9yZWdtYXBfY29uZmlnLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9CSUc7CisKIAkvKiBHZXQgdGhlIGFkZHJlc3NlcyBhbmQgSVJRICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCmluZGV4IGNkZDNmYTguLmM0YTQyMzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgpAQCAtMjIsMzQgKzIzLDYgQEAKIAogI2luY2x1ZGUgImZzbF9zYWkuaCIKIAotc3RhdGljIGlubGluZSB1MzIgc2FpX3JlYWRsKHN0cnVjdCBmc2xfc2FpICpzYWksCi0JCWNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gX19yYXdfcmVhZGwoYWRkcik7Ci0KLQlpZiAobGlrZWx5KHNhaS0+YmlnX2VuZGlhbl9yZWdzKSkKLQkJdmFsID0gYmUzMl90b19jcHUodmFsKTsKLQllbHNlCi0JCXZhbCA9IGxlMzJfdG9fY3B1KHZhbCk7Ci0Jcm1iKCk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2FpX3dyaXRlbChzdHJ1Y3QgZnNsX3NhaSAqc2FpLAotCQl1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0Jd21iKCk7Ci0JaWYgKGxpa2VseShzYWktPmJpZ19lbmRpYW5fcmVncykpCi0JCXZhbCA9IGNwdV90b19iZTMyKHZhbCk7Ci0JZWxzZQotCQl2YWwgPSBjcHVfdG9fbGUzMih2YWwpOwotCi0JX19yYXdfd3JpdGVsKHZhbCwgYWRkcik7Ci19Ci0KIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX3N5c2Nsa190cihzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCiAJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZnNsX2RpcikKIHsKQEAgLTYxLDcgKzM0LDggQEAKIAllbHNlCiAJCXJlZ19jcjIgPSBGU0xfU0FJX1JDUjI7CiAKLQl2YWxfY3IyID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyMik7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjIsICZ2YWxfY3IyKTsKKwogCXZhbF9jcjIgJj0gfkZTTF9TQUlfQ1IyX01TRUxfTUFTSzsKIAogCXN3aXRjaCAoY2xrX2lkKSB7CkBAIC04MSw3ICs1NSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IyLCBzYWktPmJhc2UgKyByZWdfY3IyKTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjIsIHZhbF9jcjIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OSwzMiArNjMsMjIgQEAKIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCiAJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQogewotCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAlpbnQgcmV0OwogCiAJaWYgKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzYWktPmNsayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGZzbF9zYWlfc2V0X2RhaV9zeXNjbGtfdHIoY3B1X2RhaSwgY2xrX2lkLCBmcmVxLAogCQkJCQlGU0xfRk1UX1RSQU5TTUlUVEVSKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAiQ2Fubm90IHNldCB0eCBzeXNjbGs6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9jbGs7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gZnNsX3NhaV9zZXRfZGFpX3N5c2Nsa190cihjcHVfZGFpLCBjbGtfaWQsIGZyZXEsCiAJCQkJCUZTTF9GTVRfUkVDRUlWRVIpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0KQogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgIkNhbm5vdCBzZXQgcnggc3lzY2xrOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOwotCX0KLQotZXJyX2NsazoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2FpLT5jbGspOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzMyw0MyArOTcsODQgQEAKIAkJcmVnX2NyNCA9IEZTTF9TQUlfUkNSNDsKIAl9CiAKLQl2YWxfY3IyID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyMik7Ci0JdmFsX2NyNCA9IHNhaV9yZWFkbChzYWksIHNhaS0+YmFzZSArIHJlZ19jcjQpOworCXJlZ21hcF9yZWFkKHNhaS0+cmVnbWFwLCByZWdfY3IyLCAmdmFsX2NyMik7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjQsICZ2YWxfY3I0KTsKIAogCWlmIChzYWktPmJpZ19lbmRpYW5fZGF0YSkKIAkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfTUY7CiAJZWxzZQogCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X01GOwogCisJLyogREFJIG1vZGUgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6Ci0JCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNFOworCQkvKgorCQkgKiBGcmFtZSBsb3csIDFjbGsgYmVmb3JlIGRhdGEsIG9uZSB3b3JkIGxlbmd0aCBmb3IgZnJhbWUgc3luYywKKwkJICogZnJhbWUgc3luYyBzdGFydHMgb25lIHNlcmlhbCBjbG9jayBjeWNsZSBlYXJsaWVyLAorCQkgKiB0aGF0IGlzLCB0b2dldGhlciB3aXRoIHRoZSBsYXN0IGJpdCBvZiB0aGUgcHJldmlvdXMKKwkJICogZGF0YSB3b3JkLgorCQkgKi8KKwkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNQOworCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZTRSB8IEZTTF9TQUlfQ1I0X0ZTUDsKIAkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCS8qCisJCSAqIEZyYW1lIGhpZ2gsIG9uZSB3b3JkIGxlbmd0aCBmb3IgZnJhbWUgc3luYywKKwkJICogZnJhbWUgc3luYyBhc3NlcnRzIHdpdGggdGhlIGZpcnN0IGJpdCBvZiB0aGUgZnJhbWUuCisJCSAqLworCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCXZhbF9jcjQgJj0gfihGU0xfU0FJX0NSNF9GU0UgfCBGU0xfU0FJX0NSNF9GU1ApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQkvKgorCQkgKiBGcmFtZSBoaWdoLCAxY2xrIGJlZm9yZSBkYXRhLCBvbmUgYml0IGZvciBmcmFtZSBzeW5jLAorCQkgKiBmcmFtZSBzeW5jIHN0YXJ0cyBvbmUgc2VyaWFsIGNsb2NrIGN5Y2xlIGVhcmxpZXIsCisJCSAqIHRoYXQgaXMsIHRvZ2V0aGVyIHdpdGggdGhlIGxhc3QgYml0IG9mIHRoZSBwcmV2aW91cworCQkgKiBkYXRhIHdvcmQuCisJCSAqLworCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZTUDsKKwkJdmFsX2NyNCB8PSBGU0xfU0FJX0NSNF9GU0U7CisJCXNhaS0+aXNfZHNwX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQkvKgorCQkgKiBGcmFtZSBoaWdoLCBvbmUgYml0IGZvciBmcmFtZSBzeW5jLAorCQkgKiBmcmFtZSBzeW5jIGFzc2VydHMgd2l0aCB0aGUgZmlyc3QgYml0IG9mIHRoZSBmcmFtZS4KKwkJICovCisJCXZhbF9jcjIgJj0gfkZTTF9TQUlfQ1IyX0JDUDsKKwkJdmFsX2NyNCAmPSB+KEZTTF9TQUlfQ1I0X0ZTRSB8IEZTTF9TQUlfQ1I0X0ZTUCk7CisJCXNhaS0+aXNfZHNwX21vZGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCS8qIFRvIGJlIGRvbmUgKi8KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBEQUkgY2xvY2sgaW52ZXJzaW9uICovCiAJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6Ci0JCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNQOwotCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ1A7CisJCS8qIEludmVydCBib3RoIGNsb2NrcyAqLworCQl2YWxfY3IyIF49IEZTTF9TQUlfQ1IyX0JDUDsKKwkJdmFsX2NyNCBePSBGU0xfU0FJX0NSNF9GU1A7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6Ci0JCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZTUDsKLQkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNQOworCQkvKiBJbnZlcnQgYml0IGNsb2NrICovCisJCXZhbF9jcjIgXj0gRlNMX1NBSV9DUjJfQkNQOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgotCQl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZTUDsKLQkJdmFsX2NyMiB8PSBGU0xfU0FJX0NSMl9CQ1A7CisJCS8qIEludmVydCBmcmFtZSBjbG9jayAqLworCQl2YWxfY3I0IF49IEZTTF9TQUlfQ1I0X0ZTUDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKLQkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNQOwotCQl2YWxfY3IyIHw9IEZTTF9TQUlfQ1IyX0JDUDsKKwkJLyogTm90aGluZyB0byBkbyBmb3IgYm90aCBub3JtYWwgY2FzZXMgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogREFJIGNsb2NrIG1hc3RlciBtYXNrcyAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CiAJCXZhbF9jcjIgfD0gRlNMX1NBSV9DUjJfQkNEX01TVFI7CkBAIC0xNzksMzkgKzE4NCwzNyBAQAogCQl2YWxfY3IyICY9IH5GU0xfU0FJX0NSMl9CQ0RfTVNUUjsKIAkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNEX01TVFI7CiAJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJdmFsX2NyMiB8PSBGU0xfU0FJX0NSMl9CQ0RfTVNUUjsKKwkJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfRlNEX01TVFI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUzoKKwkJdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfQkNEX01TVFI7CisJCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfRlNEX01TVFI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IyLCBzYWktPmJhc2UgKyByZWdfY3IyKTsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyNCwgc2FpLT5iYXNlICsgcmVnX2NyNCk7CisJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCByZWdfY3IyLCB2YWxfY3IyKTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjQsIHZhbF9jcjQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZnNsX3NhaV9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksIHVuc2lnbmVkIGludCBmbXQpCiB7Ci0Jc3RydWN0IGZzbF9zYWkgKnNhaSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwogCWludCByZXQ7CiAKLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2FpLT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSBmc2xfc2FpX3NldF9kYWlfZm10X3RyKGNwdV9kYWksIGZtdCwgRlNMX0ZNVF9UUkFOU01JVFRFUik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgIkNhbm5vdCBzZXQgdHggZm9ybWF0OiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGZzbF9zYWlfc2V0X2RhaV9mbXRfdHIoY3B1X2RhaSwgZm10LCBGU0xfRk1UX1JFQ0VJVkVSKTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCkKIAkJZGV2X2VycihjcHVfZGFpLT5kZXYsICJDYW5ub3Qgc2V0IHJ4IGZvcm1hdDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2NsazsKLQl9Ci0KLWVycl9jbGs6Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhaS0+Y2xrKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMzUsMTYgKzIzOCwxOSBAQAogCQlyZWdfbXIgPSBGU0xfU0FJX1JNUjsKIAl9CiAKLQl2YWxfY3I0ID0gc2FpX3JlYWRsKHNhaSwgc2FpLT5iYXNlICsgcmVnX2NyNCk7CisJcmVnbWFwX3JlYWQoc2FpLT5yZWdtYXAsIHJlZ19jcjQsICZ2YWxfY3I0KTsKKwlyZWdtYXBfcmVhZChzYWktPnJlZ21hcCwgcmVnX2NyNCwgJnZhbF9jcjUpOworCiAJdmFsX2NyNCAmPSB+RlNMX1NBSV9DUjRfU1lXRF9NQVNLOwogCXZhbF9jcjQgJj0gfkZTTF9TQUlfQ1I0X0ZSU1pfTUFTSzsKIAotCXZhbF9jcjUgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyByZWdfY3I1KTsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9XTldfTUFTSzsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9XMFdfTUFTSzsKIAl2YWxfY3I1ICY9IH5GU0xfU0FJX0NSNV9GQlRfTUFTSzsKIAotCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfU1lXRCh3b3JkX3dpZHRoKTsKKwlpZiAoIXNhaS0+aXNfZHNwX21vZGUpCisJCXZhbF9jcjQgfD0gRlNMX1NBSV9DUjRfU1lXRCh3b3JkX3dpZHRoKTsKKwogCXZhbF9jcjUgfD0gRlNMX1NBSV9DUjVfV05XKHdvcmRfd2lkdGgpOwogCXZhbF9jcjUgfD0gRlNMX1NBSV9DUjVfVzBXKHdvcmRfd2lkdGgpOwogCkBAIC0yNTcsOSArMjYzLDkgQEAKIAl2YWxfY3I0IHw9IEZTTF9TQUlfQ1I0X0ZSU1ooY2hhbm5lbHMpOwogCXZhbF9tciA9IH4wVUwgLSAoKDEgPDwgY2hhbm5lbHMpIC0gMSk7CiAKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyNCwgc2FpLT5iYXNlICsgcmVnX2NyNCk7Ci0Jc2FpX3dyaXRlbChzYWksIHZhbF9jcjUsIHNhaS0+YmFzZSArIHJlZ19jcjUpOwotCXNhaV93cml0ZWwoc2FpLCB2YWxfbXIsIHNhaS0+YmFzZSArIHJlZ19tcik7CisJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCByZWdfY3I0LCB2YWxfY3I0KTsKKwlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIHJlZ19jcjUsIHZhbF9jcjUpOworCXJlZ21hcF93cml0ZShzYWktPnJlZ21hcCwgcmVnX21yLCB2YWxfbXIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjgsNDQgKzI3NCw0MiBAQAogCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCiB7CiAJc3RydWN0IGZzbF9zYWkgKnNhaSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwotCXUzMiB0Y3NyLCByY3NyLCB2YWxfY3IyLCB2YWxfY3IzLCByZWdfY3IzOworCXUzMiB0Y3NyLCByY3NyOwogCi0JdmFsX2NyMiA9IHNhaV9yZWFkbChzYWksIHNhaS0+YmFzZSArIEZTTF9TQUlfVENSMik7Ci0JdmFsX2NyMiAmPSB+RlNMX1NBSV9DUjJfU1lOQzsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMiwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1IyKTsKKwkvKgorCSAqIFRoZSB0cmFuc21pdHRlciBiaXQgY2xvY2sgYW5kIGZyYW1lIHN5bmMgYXJlIHRvIGJlCisJICogdXNlZCBieSBib3RoIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuCisJICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDUjIsIEZTTF9TQUlfQ1IyX1NZTkMsCisJCQkgICB+RlNMX1NBSV9DUjJfU1lOQyk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDUjIsIEZTTF9TQUlfQ1IyX1NZTkMsCisJCQkgICBGU0xfU0FJX0NSMl9TWU5DKTsKIAotCXZhbF9jcjIgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDUjIpOwotCXZhbF9jcjIgfD0gRlNMX1NBSV9DUjJfU1lOQzsKLQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMiwgc2FpLT5iYXNlICsgRlNMX1NBSV9SQ1IyKTsKLQotCXRjc3IgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1RDU1IpOwotCXJjc3IgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOworCXJlZ21hcF9yZWFkKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsICZ0Y3NyKTsKKwlyZWdtYXBfcmVhZChzYWktPnJlZ21hcCwgRlNMX1NBSV9SQ1NSLCAmcmNzcik7CiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQl0Y3NyIHw9IEZTTF9TQUlfQ1NSX0ZSREU7CiAJCXJjc3IgJj0gfkZTTF9TQUlfQ1NSX0ZSREU7Ci0JCXJlZ19jcjMgPSBGU0xfU0FJX1RDUjM7CiAJfSBlbHNlIHsKIAkJcmNzciB8PSBGU0xfU0FJX0NTUl9GUkRFOwogCQl0Y3NyICY9IH5GU0xfU0FJX0NTUl9GUkRFOwotCQlyZWdfY3IzID0gRlNMX1NBSV9SQ1IzOwogCX0KIAotCXZhbF9jcjMgPSBzYWlfcmVhZGwoc2FpLCBzYWktPmJhc2UgKyByZWdfY3IzKTsKLQorCS8qCisJICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgaXMgdGhlIGxhc3QgZW5hYmxlZAorCSAqIGFuZCB0aGUgZmlyc3QgZGlzYWJsZWQuCisJICovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJdGNzciB8PSBGU0xfU0FJX0NTUl9URVJFOwogCQlyY3NyIHw9IEZTTF9TQUlfQ1NSX1RFUkU7Ci0JCXZhbF9jcjMgfD0gRlNMX1NBSV9DUjNfVFJDRTsKIAotCQlzYWlfd3JpdGVsKHNhaSwgdmFsX2NyMywgc2FpLT5iYXNlICsgcmVnX2NyMyk7Ci0JCXNhaV93cml0ZWwoc2FpLCByY3NyLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOwotCQlzYWlfd3JpdGVsKHNhaSwgdGNzciwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1NSKTsKKwkJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDU1IsIHJjc3IpOworCQlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIEZTTF9TQUlfVENTUiwgdGNzcik7CiAJCWJyZWFrOwotCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CkBAIC0zMTQsMTEgKzMxOCw4IEBACiAJCQlyY3NyICY9IH5GU0xfU0FJX0NTUl9URVJFOwogCQl9CiAKLQkJdmFsX2NyMyAmPSB+RlNMX1NBSV9DUjNfVFJDRTsKLQotCQlzYWlfd3JpdGVsKHNhaSwgdGNzciwgc2FpLT5iYXNlICsgRlNMX1NBSV9UQ1NSKTsKLQkJc2FpX3dyaXRlbChzYWksIHJjc3IsIHNhaS0+YmFzZSArIEZTTF9TQUlfUkNTUik7Ci0JCXNhaV93cml0ZWwoc2FpLCB2YWxfY3IzLCBzYWktPmJhc2UgKyByZWdfY3IzKTsKKwkJcmVnbWFwX3dyaXRlKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsIHRjc3IpOworCQlyZWdtYXBfd3JpdGUoc2FpLT5yZWdtYXAsIEZTTF9TQUlfUkNTUiwgcmNzcik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzMxLDE2ICszMzIsMzIgQEAKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKwl1MzIgcmVnOwogCi0JcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShzYWktPmNsayk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJlZyA9IEZTTF9TQUlfVENSMzsKKwllbHNlCisJCXJlZyA9IEZTTF9TQUlfUkNSMzsKKworCXJlZ21hcF91cGRhdGVfYml0cyhzYWktPnJlZ21hcCwgcmVnLCBGU0xfU0FJX0NSM19UUkNFLAorCQkJICAgRlNMX1NBSV9DUjNfVFJDRSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZnNsX3NhaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc2FpICpzYWkgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKwl1MzIgcmVnOwogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNhaS0+Y2xrKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmVnID0gRlNMX1NBSV9UQ1IzOworCWVsc2UKKwkJcmVnID0gRlNMX1NBSV9SQ1IzOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCByZWcsIEZTTF9TQUlfQ1IzX1RSQ0UsCisJCQkgICB+RlNMX1NBSV9DUjNfVFJDRSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGZzbF9zYWlfcGNtX2RhaV9vcHMgPSB7CkBAIC0zNTUsMTggKzM3MiwxMyBAQAogc3RhdGljIGludCBmc2xfc2FpX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCiB7CiAJc3RydWN0IGZzbF9zYWkgKnNhaSA9IGRldl9nZXRfZHJ2ZGF0YShjcHVfZGFpLT5kZXYpOwotCWludCByZXQ7CiAKLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc2FpLT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlzYWlfd3JpdGVsKHNhaSwgMHgwLCBzYWktPmJhc2UgKyBGU0xfU0FJX1JDU1IpOwotCXNhaV93cml0ZWwoc2FpLCAweDAsIHNhaS0+YmFzZSArIEZTTF9TQUlfVENTUik7Ci0Jc2FpX3dyaXRlbChzYWksIEZTTF9TQUlfTUFYQlVSU1RfVFggKiAyLCBzYWktPmJhc2UgKyBGU0xfU0FJX1RDUjEpOwotCXNhaV93cml0ZWwoc2FpLCBGU0xfU0FJX01BWEJVUlNUX1JYIC0gMSwgc2FpLT5iYXNlICsgRlNMX1NBSV9SQ1IxKTsKLQotCWNsa19kaXNhYmxlX3VucHJlcGFyZShzYWktPmNsayk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDU1IsIDB4ZmZmZmZmZmYsIDB4MCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1JDU1IsIDB4ZmZmZmZmZmYsIDB4MCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHNhaS0+cmVnbWFwLCBGU0xfU0FJX1RDUjEsIEZTTF9TQUlfQ1IxX1JGV19NQVNLLAorCQkJICAgRlNMX1NBSV9NQVhCVVJTVF9UWCAqIDIpOworCXJlZ21hcF91cGRhdGVfYml0cyhzYWktPnJlZ21hcCwgRlNMX1NBSV9SQ1IxLCBGU0xfU0FJX0NSMV9SRldfTUFTSywKKwkJCSAgIEZTTF9TQUlfTUFYQlVSU1RfUlggLSAxKTsKIAogCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoY3B1X2RhaSwgJnNhaS0+ZG1hX3BhcmFtc190eCwKIAkJCQkmc2FpLT5kbWFfcGFyYW1zX3J4KTsKQEAgLTM5NywyNiArNDA5LDEwOSBAQAogCS5uYW1lICAgICAgICAgICA9ICJmc2wtc2FpIiwKIH07CiAKK3N0YXRpYyBib29sIGZzbF9zYWlfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgRlNMX1NBSV9UQ1NSOgorCWNhc2UgRlNMX1NBSV9UQ1IxOgorCWNhc2UgRlNMX1NBSV9UQ1IyOgorCWNhc2UgRlNMX1NBSV9UQ1IzOgorCWNhc2UgRlNMX1NBSV9UQ1I0OgorCWNhc2UgRlNMX1NBSV9UQ1I1OgorCWNhc2UgRlNMX1NBSV9URlI6CisJY2FzZSBGU0xfU0FJX1RNUjoKKwljYXNlIEZTTF9TQUlfUkNTUjoKKwljYXNlIEZTTF9TQUlfUkNSMToKKwljYXNlIEZTTF9TQUlfUkNSMjoKKwljYXNlIEZTTF9TQUlfUkNSMzoKKwljYXNlIEZTTF9TQUlfUkNSNDoKKwljYXNlIEZTTF9TQUlfUkNSNToKKwljYXNlIEZTTF9TQUlfUkRSOgorCWNhc2UgRlNMX1NBSV9SRlI6CisJY2FzZSBGU0xfU0FJX1JNUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgZnNsX3NhaV92b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBGU0xfU0FJX1RGUjoKKwljYXNlIEZTTF9TQUlfUkZSOgorCWNhc2UgRlNMX1NBSV9URFI6CisJY2FzZSBGU0xfU0FJX1JEUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQorCitzdGF0aWMgYm9vbCBmc2xfc2FpX3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBGU0xfU0FJX1RDU1I6CisJY2FzZSBGU0xfU0FJX1RDUjE6CisJY2FzZSBGU0xfU0FJX1RDUjI6CisJY2FzZSBGU0xfU0FJX1RDUjM6CisJY2FzZSBGU0xfU0FJX1RDUjQ6CisJY2FzZSBGU0xfU0FJX1RDUjU6CisJY2FzZSBGU0xfU0FJX1REUjoKKwljYXNlIEZTTF9TQUlfVE1SOgorCWNhc2UgRlNMX1NBSV9SQ1NSOgorCWNhc2UgRlNMX1NBSV9SQ1IxOgorCWNhc2UgRlNMX1NBSV9SQ1IyOgorCWNhc2UgRlNMX1NBSV9SQ1IzOgorCWNhc2UgRlNMX1NBSV9SQ1I0OgorCWNhc2UgRlNMX1NBSV9SQ1I1OgorCWNhc2UgRlNMX1NBSV9STVI6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBmc2xfc2FpX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS52YWxfYml0cyA9IDMyLAorCisJLm1heF9yZWdpc3RlciA9IEZTTF9TQUlfUk1SLAorCS5yZWFkYWJsZV9yZWcgPSBmc2xfc2FpX3JlYWRhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gZnNsX3NhaV92b2xhdGlsZV9yZWcsCisJLndyaXRlYWJsZV9yZWcgPSBmc2xfc2FpX3dyaXRlYWJsZV9yZWcsCit9OworCiBzdGF0aWMgaW50IGZzbF9zYWlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGZzbF9zYWkgKnNhaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IHJldDsKIAogCXNhaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnNhaSksIEdGUF9LRVJORUwpOwogCWlmICghc2FpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0Jc2FpLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihzYWktPmJhc2UpKQotCQlyZXR1cm4gUFRSX0VSUihzYWktPmJhc2UpOworCXNhaS0+YmlnX2VuZGlhbl9yZWdzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1yZWdzIik7CisJaWYgKHNhaS0+YmlnX2VuZGlhbl9yZWdzKQorCQlmc2xfc2FpX3JlZ21hcF9jb25maWcudmFsX2Zvcm1hdF9lbmRpYW4gPSBSRUdNQVBfRU5ESUFOX0JJRzsKIAotCXNhaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJzYWkiKTsKLQlpZiAoSVNfRVJSKHNhaS0+Y2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IFNBSSdzIGNsb2NrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoc2FpLT5jbGspOworCXNhaS0+YmlnX2VuZGlhbl9kYXRhID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1kYXRhIik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKKworCXNhaS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsaygmcGRldi0+ZGV2LAorCQkJInNhaSIsIGJhc2UsICZmc2xfc2FpX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIoc2FpLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ21hcCBpbml0IGZhaWxlZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHNhaS0+cmVnbWFwKTsKIAl9CiAKIAlzYWktPmRtYV9wYXJhbXNfcnguYWRkciA9IHJlcy0+c3RhcnQgKyBGU0xfU0FJX1JEUjsKQEAgLTQyNCw5ICs1MTksNiBAQAogCXNhaS0+ZG1hX3BhcmFtc19yeC5tYXhidXJzdCA9IEZTTF9TQUlfTUFYQlVSU1RfUlg7CiAJc2FpLT5kbWFfcGFyYW1zX3R4Lm1heGJ1cnN0ID0gRlNMX1NBSV9NQVhCVVJTVF9UWDsKIAotCXNhaS0+YmlnX2VuZGlhbl9yZWdzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYmlnLWVuZGlhbi1yZWdzIik7Ci0Jc2FpLT5iaWdfZW5kaWFuX2RhdGEgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuLWRhdGEiKTsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNhaSk7CiAKIAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZmc2xfY29tcG9uZW50LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmggYi9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuaAppbmRleCA0MWJiNjJlNi4uZTQzMjI2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmgKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc2FpLmgKQEAgLTE1LDMxICsxNSwzNiBAQAogCQkJIFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAogCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQogCisvKiBTQUkgUmVnaXN0ZXIgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lIEZTTF9TQUlfVENTUgkweDAwIC8qIFNBSSBUcmFuc21pdCBDb250cm9sICovCisjZGVmaW5lIEZTTF9TQUlfVENSMQkweDA0IC8qIFNBSSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgKi8KKyNkZWZpbmUgRlNMX1NBSV9UQ1IyCTB4MDggLyogU0FJIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiAqLworI2RlZmluZSBGU0xfU0FJX1RDUjMJMHgwYyAvKiBTQUkgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAzICovCisjZGVmaW5lIEZTTF9TQUlfVENSNAkweDEwIC8qIFNBSSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDQgKi8KKyNkZWZpbmUgRlNMX1NBSV9UQ1I1CTB4MTQgLyogU0FJIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gNSAqLworI2RlZmluZSBGU0xfU0FJX1REUgkweDIwIC8qIFNBSSBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIEZTTF9TQUlfVEZSCTB4NDAgLyogU0FJIFRyYW5zbWl0IEZJRk8gKi8KKyNkZWZpbmUgRlNMX1NBSV9UTVIJMHg2MCAvKiBTQUkgVHJhbnNtaXQgTWFzayAqLworI2RlZmluZSBGU0xfU0FJX1JDU1IJMHg4MCAvKiBTQUkgUmVjZWl2ZSBDb250cm9sICovCisjZGVmaW5lIEZTTF9TQUlfUkNSMQkweDg0IC8qIFNBSSBSZWNlaXZlIENvbmZpZ3VyYXRpb24gMSAqLworI2RlZmluZSBGU0xfU0FJX1JDUjIJMHg4OCAvKiBTQUkgUmVjZWl2ZSBDb25maWd1cmF0aW9uIDIgKi8KKyNkZWZpbmUgRlNMX1NBSV9SQ1IzCTB4OGMgLyogU0FJIFJlY2VpdmUgQ29uZmlndXJhdGlvbiAzICovCisjZGVmaW5lIEZTTF9TQUlfUkNSNAkweDkwIC8qIFNBSSBSZWNlaXZlIENvbmZpZ3VyYXRpb24gNCAqLworI2RlZmluZSBGU0xfU0FJX1JDUjUJMHg5NCAvKiBTQUkgUmVjZWl2ZSBDb25maWd1cmF0aW9uIDUgKi8KKyNkZWZpbmUgRlNMX1NBSV9SRFIJMHhhMCAvKiBTQUkgUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIEZTTF9TQUlfUkZSCTB4YzAgLyogU0FJIFJlY2VpdmUgRklGTyAqLworI2RlZmluZSBGU0xfU0FJX1JNUgkweGUwIC8qIFNBSSBSZWNlaXZlIE1hc2sgKi8KKwogLyogU0FJIFRyYW5zbWl0L1JlY2lldmUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBGU0xfU0FJX1RDU1IJCTB4MDAKLSNkZWZpbmUgRlNMX1NBSV9SQ1NSCQkweDgwCiAjZGVmaW5lIEZTTF9TQUlfQ1NSX1RFUkUJQklUKDMxKQogI2RlZmluZSBGU0xfU0FJX0NTUl9GV0YJCUJJVCgxNykKICNkZWZpbmUgRlNMX1NBSV9DU1JfRlJJRQlCSVQoOCkKICNkZWZpbmUgRlNMX1NBSV9DU1JfRlJERQlCSVQoMCkKIAotLyogU0FJIFRyYW5zbWl0IERhdGEvRklGTy9NQVNLIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVERSCQkweDIwCi0jZGVmaW5lIEZTTF9TQUlfVEZSCQkweDQwCi0jZGVmaW5lIEZTTF9TQUlfVE1SCQkweDYwCi0KLS8qIFNBSSBSZWNpZXZlIERhdGEvRklGTy9NQVNLIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfUkRSCQkweGEwCi0jZGVmaW5lIEZTTF9TQUlfUkZSCQkweGMwCi0jZGVmaW5lIEZTTF9TQUlfUk1SCQkweGUwCi0KIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1IxCQkweDA0Ci0jZGVmaW5lIEZTTF9TQUlfUkNSMQkJMHg4NAorI2RlZmluZSBGU0xfU0FJX0NSMV9SRldfTUFTSwkweDFmCiAKIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1IyCQkweDA4Ci0jZGVmaW5lIEZTTF9TQUlfUkNSMgkJMHg4OAogI2RlZmluZSBGU0xfU0FJX0NSMl9TWU5DCUJJVCgzMCkKICNkZWZpbmUgRlNMX1NBSV9DUjJfTVNFTF9NQVNLCSgweGZmIDw8IDI2KQogI2RlZmluZSBGU0xfU0FJX0NSMl9NU0VMX0JVUwkwCkBAIC01MCwxNSArNTUsMTEgQEAKICNkZWZpbmUgRlNMX1NBSV9DUjJfQkNEX01TVFIJQklUKDI0KQogCiAvKiBTQUkgVHJhbnNtaXQgYW5kIFJlY2lldmUgQ29uZmlndXJhdGlvbiAzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVENSMwkJMHgwYwotI2RlZmluZSBGU0xfU0FJX1JDUjMJCTB4OGMKICNkZWZpbmUgRlNMX1NBSV9DUjNfVFJDRQlCSVQoMTYpCiAjZGVmaW5lIEZTTF9TQUlfQ1IzX1dERkwoeCkJKHgpCiAjZGVmaW5lIEZTTF9TQUlfQ1IzX1dERkxfTUFTSwkweDFmCiAKIC8qIFNBSSBUcmFuc21pdCBhbmQgUmVjaWV2ZSBDb25maWd1cmF0aW9uIDQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRlNMX1NBSV9UQ1I0CQkweDEwCi0jZGVmaW5lIEZTTF9TQUlfUkNSNAkJMHg5MAogI2RlZmluZSBGU0xfU0FJX0NSNF9GUlNaKHgpCSgoKHgpIC0gMSkgPDwgMTYpCiAjZGVmaW5lIEZTTF9TQUlfQ1I0X0ZSU1pfTUFTSwkoMHgxZiA8PCAxNikKICNkZWZpbmUgRlNMX1NBSV9DUjRfU1lXRCh4KQkoKCh4KSAtIDEpIDw8IDgpCkBAIC02OSw4ICs3MCw2IEBACiAjZGVmaW5lIEZTTF9TQUlfQ1I0X0ZTRF9NU1RSCUJJVCgwKQogCiAvKiBTQUkgVHJhbnNtaXQgYW5kIFJlY2lldmUgQ29uZmlndXJhdGlvbiA1IFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTTF9TQUlfVENSNQkJMHgxNAotI2RlZmluZSBGU0xfU0FJX1JDUjUJCTB4OTQKICNkZWZpbmUgRlNMX1NBSV9DUjVfV05XKHgpCSgoKHgpIC0gMSkgPDwgMjQpCiAjZGVmaW5lIEZTTF9TQUlfQ1I1X1dOV19NQVNLCSgweDFmIDw8IDI0KQogI2RlZmluZSBGU0xfU0FJX0NSNV9XMFcoeCkJKCgoeCkgLSAxKSA8PCAxNikKQEAgLTEwMCwxMiArOTksMTEgQEAKICNkZWZpbmUgRlNMX1NBSV9NQVhCVVJTVF9SWCA2CiAKIHN0cnVjdCBmc2xfc2FpIHsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0KLQl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCiAJYm9vbCBiaWdfZW5kaWFuX3JlZ3M7CiAJYm9vbCBiaWdfZW5kaWFuX2RhdGE7CisJYm9vbCBpc19kc3BfbW9kZTsKIAogCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfcGFyYW1zX3J4OwogCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfcGFyYW1zX3R4OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NwZGlmLmMKaW5kZXggNGQwNzVmMS4uNjQ1MmNhOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zcGRpZi5jCkBAIC05MTEsOCArOTExLDggQEAKIHsKIAlzdHJ1Y3QgZnNsX3NwZGlmX3ByaXYgKnNwZGlmX3ByaXZhdGUgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JZGFpLT5wbGF5YmFja19kbWFfZGF0YSA9ICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3R4OwotCWRhaS0+Y2FwdHVyZV9kbWFfZGF0YSA9ICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3J4OworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmc3BkaWZfcHJpdmF0ZS0+ZG1hX3BhcmFtc190eCwKKwkJCQkgICZzcGRpZl9wcml2YXRlLT5kbWFfcGFyYW1zX3J4KTsKIAogCXNuZF9zb2NfYWRkX2RhaV9jb250cm9scyhkYWksIGZzbF9zcGRpZl9jdHJscywgQVJSQVlfU0laRShmc2xfc3BkaWZfY3RybHMpKTsKIApAQCAtOTg1LDcgKzk4NSw3IEBACiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgZnNsX3NwZGlmX3JlZ21hcF9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgZnNsX3NwZGlmX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gMzIsCiAJLnJlZ19zdHJpZGUgPSA0LAogCS52YWxfYml0cyA9IDMyLApAQCAtMTEwNSw2ICsxMTA1LDkgQEAKIAltZW1jcHkoJnNwZGlmX3ByaXYtPmNwdV9kYWlfZHJ2LCAmZnNsX3NwZGlmX2RhaSwgc2l6ZW9mKGZzbF9zcGRpZl9kYWkpKTsKIAlzcGRpZl9wcml2LT5jcHVfZGFpX2Rydi5uYW1lID0gc3BkaWZfcHJpdi0+bmFtZTsKIAorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuIikpCisJCWZzbF9zcGRpZl9yZWdtYXBfY29uZmlnLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9CSUc7CisKIAkvKiBHZXQgdGhlIGFkZHJlc3NlcyBhbmQgSVJRICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5jIGIvc291bmQvc29jL2ZzbC9mc2xfdXRpbHMuYwppbmRleCBiOWU0MmI1Li4yYWM3NzU1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmMKQEAgLTg2LDYgKzg2LDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGZzbF9hc29jX2dldF9kbWFfY2hhbm5lbCk7CiAKKy8qKgorICogZnNsX2Fzb2NfeGxhdGVfdGRtX3Nsb3RfbWFzayAtIGdlbmVyYXRlIFRETSBzbG90IFRYL1JYIG1hc2suCisgKgorICogQHNsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgaW4gdXNlLgorICogQHR4X21hc2s6IGJpdG1hc2sgcmVwcmVzZW50aW5nIGFjdGl2ZSBUWCBzbG90cy4KKyAqIEByeF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgUlggc2xvdHMuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBURE0gc2xvdCBUWC9SWCBtYXNrLiBBbmQgdGhlIFRYL1JYCisgKiBtYXNrIHdpbGwgdXNlIGEgMCBiaXQgZm9yIGFuIGFjdGl2ZSBzbG90IGFzIGRlZmF1bHQsIGFuZCB0aGUgZGVmYXVsdAorICogYWN0aXZlIGJpdHMgYXJlIGF0IHRoZSBMU0Igb2YgdGhlIG1hc2sgdmFsdWUuCisgKi8KK2ludCBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrKHVuc2lnbmVkIGludCBzbG90cywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJ4X21hc2spCit7CisJaWYgKCFzbG90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHhfbWFzaykKKwkJKnR4X21hc2sgPSB+KCgxIDw8IHNsb3RzKSAtIDEpOworCWlmIChyeF9tYXNrKQorCQkqcnhfbWFzayA9IH4oKDEgPDwgc2xvdHMpIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9hc29jX3hsYXRlX3RkbV9zbG90X21hc2spOworCiBNT0RVTEVfQVVUSE9SKCJUaW11ciBUYWJpIDx0aW11ckBmcmVlc2NhbGUuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgQVNvQyB1dGlsaXR5IGNvZGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmggYi9zb3VuZC9zb2MvZnNsL2ZzbF91dGlscy5oCmluZGV4IGIyOTUxMTIuLmRmNTM1ZGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3V0aWxzLmgKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfdXRpbHMuaApAQCAtMjIsNSArMjIsNyBAQAogCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmRtYV9jaGFubmVsX2lkLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmRtYV9pZCk7Ci0KK2ludCBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrKHVuc2lnbmVkIGludCBzbG90cywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJ4X21hc2spOwogI2VuZGlmIC8qIF9GU0xfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9pbXgtcGNtLWZpcS5jIGIvc291bmQvc29jL2ZzbC9pbXgtcGNtLWZpcS5jCmluZGV4IDY1NTMyMDIuLjdhYmY2YTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvaW14LXBjbS1maXEuYworKysgYi9zb3VuZC9zb2MvZnNsL2lteC1wY20tZmlxLmMKQEAgLTI3MCwxOCArMjcwLDE3IEBACiAJCXJldCA9IGlteF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CiAJCXJldCA9IGlteF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gcmV0OwogCX0KIAotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3NpX2lycSA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2lteC1zc2kuYyBiL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCmluZGV4IGRmNTUyZmEuLmFiMmZkZDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvaW14LXNzaS5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9hc29jLWlteC1zc2kuaD4KIAogI2luY2x1ZGUgImlteC1zc2kuaCIKKyNpbmNsdWRlICJmc2xfdXRpbHMuaCIKIAogI2RlZmluZSBTU0lfU0FDTlRfREVGQVVMVCAoU1NJX1NBQ05UX0FDOTdFTiB8IFNTSV9TQUNOVF9GVikKIApAQCAtMzM5LDYgKzM0MCw3IEBACiAJLnNldF9mbXQJPSBpbXhfc3NpX3NldF9kYWlfZm10LAogCS5zZXRfY2xrZGl2CT0gaW14X3NzaV9zZXRfZGFpX2Nsa2RpdiwKIAkuc2V0X3N5c2Nsawk9IGlteF9zc2lfc2V0X2RhaV9zeXNjbGssCisJLnhsYXRlX3RkbV9zbG90X21hc2sgPSBmc2xfYXNvY194bGF0ZV90ZG1fc2xvdF9tYXNrLAogCS5zZXRfdGRtX3Nsb3QJPSBpbXhfc3NpX3NldF9kYWlfdGRtX3Nsb3QsCiAJLnRyaWdnZXIJPSBpbXhfc3NpX3RyaWdnZXIsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC93bTExMzMtZXYxLmMgYi9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYwppbmRleCBmY2U2MzI1Li44MDQ3NDlhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYworKysgYi9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYwpAQCAtMjE0LDEyICsyMTQsNiBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTExMzNfZXYxX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtMTEzM19ldjFfd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd20xMTMzX2V2MV9tYXAsCi0JCQkJQVJSQVlfU0laRSh3bTExMzNfZXYxX21hcCkpOwotCiAJLyogSGVhZHBob25lIGphY2sgZGV0ZWN0aW9uICovCiAJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSIsIFNORF9KQUNLX0hFQURQSE9ORSwgJmhwX2phY2spOwogCXNuZF9zb2NfamFja19hZGRfcGlucygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpLApAQCAtMjU3LDYgKzI1MSwxMSBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kYWlfbGluayA9ICZ3bTExMzNfZXYxX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5kYXBtX3dpZGdldHMgPSB3bTExMzNfZXYxX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtMTEzM19ldjFfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gd20xMTMzX2V2MV9tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20xMTMzX2V2MV9tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKndtMTEzM19ldjFfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCmluZGV4IDJhMWIxYjUuLjIxZjFjY2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKKysrIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYwpAQCAtOSw0OCArOSw3NyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPHNvdW5kL3NpbXBsZV9jYXJkLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCitzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSB7CisJc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfY2FyZDsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyB7CisJCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgY3B1X2RhaTsKKwkJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSBjb2RlY19kYWk7CisJfSAqZGFpX3Byb3BzOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRhaV9saW5rW107CS8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworfTsKIAogc3RhdGljIGludCBfX2Fzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJICAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNldCwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRhaWZtdCkKKwkJCQkgICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqc2V0KQogewotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKLQlkYWlmbXQgfD0gc2V0LT5mbXQ7Ci0KLQlpZiAoZGFpZm10KQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwgZGFpZm10KTsKLQotCWlmIChyZXQgPT0gLUVOT1RTVVBQKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICJBU29DOiBzZXRfZm10IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXQgPSAwOworCWlmIChzZXQtPmZtdCkgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwgc2V0LT5mbXQpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X2ZtdCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQogCX0KIAotCWlmICghcmV0ICYmIHNldC0+c3lzY2xrKQorCWlmIChzZXQtPnN5c2NsaykgewogCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgc2V0LT5zeXNjbGssIDApOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X3N5c2NsayBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KIAorCWlmIChzZXQtPnNsb3RzKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChkYWksIDAsIDAsCisJCQkJCQlzZXQtPnNsb3RzLAorCQkJCQkJc2V0LT5zbG90X3dpZHRoKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2ltcGxlLWNhcmQ6IHNldF90ZG1fc2xvdCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJldCA9IDA7CisKK2VycjoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9pbmZvICppbmZvID0KKwlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiA9CiAJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlYyA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1ID0gcnRkLT5jcHVfZGFpOwotCXVuc2lnbmVkIGludCBkYWlmbXQgPSBpbmZvLT5kYWlmbXQ7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzOworCWludCBudW0sIHJldDsKIAotCXJldCA9IF9fYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChjb2RlYywgJmluZm8tPmNvZGVjX2RhaSwgZGFpZm10KTsKKwludW0gPSBydGQgLSBydGQtPmNhcmQtPnJ0ZDsKKwlkYWlfcHJvcHMgPSAmcHJpdi0+ZGFpX3Byb3BzW251bV07CisJcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNvZGVjLCAmZGFpX3Byb3BzLT5jb2RlY19kYWkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNwdSwgJmluZm8tPmNwdV9kYWksIGRhaWZtdCk7CisJcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNwdSwgJmRhaV9wcm9wcy0+Y3B1X2RhaSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTU5LDkgKzg4LDEyIEBACiAKIHN0YXRpYyBpbnQKIGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGFpZm10LAogCQkJICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpLAotCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICoqbm9kZSkKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqKnBfbm9kZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKipuYW1lKQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldDsKIApAQCAtNjksMTQgKzEwMSwyMCBAQAogCSAqIGdldCBub2RlIHZpYSAic291bmQtZGFpID0gPCZwaGFuZGxlIHBvcnQ+IgogCSAqIGl0IHdpbGwgYmUgdXNlZCBhcyB4eHhfb2Zfbm9kZSBvbiBzb2NfYmluZF9kYWlfbGluaygpCiAJICovCi0JKm5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAic291bmQtZGFpIiwgMCk7Ci0JaWYgKCEqbm9kZSkKKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInNvdW5kLWRhaSIsIDApOworCWlmICghbm9kZSkKIAkJcmV0dXJuIC1FTk9ERVY7CisJKnBfbm9kZSA9IG5vZGU7CiAKIAkvKiBnZXQgZGFpLT5uYW1lICovCi0JcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobnAsICZkYWktPm5hbWUpOworCXJldCA9IHNuZF9zb2Nfb2ZfZ2V0X2RhaV9uYW1lKG5wLCBuYW1lKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBwYXJzZV9lcnJvcjsKKwkJcmV0dXJuIHJldDsKKworCS8qIHBhcnNlIFRETSBzbG90ICovCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdChucCwgJmRhaS0+c2xvdHMsICZkYWktPnNsb3Rfd2lkdGgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKgogCSAqIGJpdGNsb2NrLWludmVyc2lvbiwgZnJhbWUtaW52ZXJzaW9uCkBAIC04NCw2ICsxMjIsNyBAQAogCSAqIGFuZCBzcGVjaWZpYyAiZm9ybWF0IiBpZiBpdCBoYXMKIAkgKi8KIAlkYWktPmZtdCA9IHNuZF9zb2Nfb2ZfcGFyc2VfZGFpZm10KG5wLCBOVUxMKTsKKwlkYWktPmZtdCB8PSBkYWlmbXQ7CiAKIAkvKgogCSAqIGRhaS0+c3lzY2xrIGNvbWUgZnJvbQpAQCAtOTUsNyArMTM0LDcgQEAKIAkJY2xrID0gb2ZfY2xrX2dldChucCwgMCk7CiAJCWlmIChJU19FUlIoY2xrKSkgewogCQkJcmV0ID0gUFRSX0VSUihjbGspOwotCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAogCQlkYWktPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOwpAQCAtMTA0LDE2NCArMTQzLDI3OCBAQAogCQkJCSAgICAgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiLAogCQkJCSAgICAgJmRhaS0+c3lzY2xrKTsKIAl9IGVsc2UgewotCQljbGsgPSBvZl9jbGtfZ2V0KCpub2RlLCAwKTsKKwkJY2xrID0gb2ZfY2xrX2dldChub2RlLCAwKTsKIAkJaWYgKCFJU19FUlIoY2xrKSkKIAkJCWRhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CiAJfQogCi0JcmV0ID0gMDsKLQotcGFyc2VfZXJyb3I6Ci0Jb2Zfbm9kZV9wdXQoKm5vZGUpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipvZl9jcHUsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipvZl9jb2RlYywKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKm9mX3BsYXRmb3JtKQorc3RhdGljIGludCBzaW1wbGVfY2FyZF9jcHVfY29kZWNfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCWludCBkYWlmbXQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAorCQkJCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQljaGFyICpuYW1lOwogCWludCByZXQ7CiAKLQkvKiBnZXQgQ1BVL0NPREVDIGNvbW1vbiBmb3JtYXQgdmlhIHNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCAqLwotCWluZm8tPmRhaWZtdCA9IHNuZF9zb2Nfb2ZfcGFyc2VfZGFpZm10KG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCwiKSAmCi0JCShTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSyB8IFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKTsKLQotCS8qIERBUE0gcm91dGVzICovCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQscm91dGluZyIpKSB7Ci0JCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZygmaW5mby0+c25kX2NhcmQsCi0JCQkJCSJzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nIik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIENQVSBzdWItbm9kZSAqLwogCXJldCA9IC1FSU5WQUw7CiAJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQsY3B1Iik7Ci0JaWYgKG5wKQotCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3N1Yl9wYXJzZV9vZihucCwKLQkJCQkJCSAgJmluZm8tPmNwdV9kYWksCi0JCQkJCQkgIG9mX2NwdSk7CisJaWYgKG5wKSB7CisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKG5wLCBkYWlmbXQsCisJCQkJCQkmZGFpX3Byb3BzLT5jcHVfZGFpLAorCQkJCQkJJmRhaV9saW5rLT5jcHVfb2Zfbm9kZSwKKwkJCQkJCSZkYWlfbGluay0+Y3B1X2RhaV9uYW1lKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIENPREVDIHN1Yi1ub2RlICovCiAJcmV0ID0gLUVJTlZBTDsKIAlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCxjb2RlYyIpOwotCWlmIChucCkKLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YobnAsCi0JCQkJCQkgICZpbmZvLT5jb2RlY19kYWksCi0JCQkJCQkgIG9mX2NvZGVjKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAobnApIHsKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YobnAsIGRhaWZtdCwKKwkJCQkJCSZkYWlfcHJvcHMtPmNvZGVjX2RhaSwKKwkJCQkJCSZkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSwKKwkJCQkJCSZkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCXJldHVybiByZXQ7Cit9CiAKLQlpZiAoIWluZm8tPmNwdV9kYWkubmFtZSB8fCAhaW5mby0+Y29kZWNfZGFpLm5hbWUpCi0JCXJldHVybiAtRUlOVkFMOworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2LAorCQkJCSAgICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgaW50IG11bHRpKQoreworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHByaXYtPnNuZF9jYXJkLmRhaV9saW5rOworCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPSBwcml2LT5kYWlfcHJvcHM7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBkYWlmbXQ7CisJaW50IHJldDsKKworCS8qIHBhcnNpbmcgdGhlIGNhcmQgbmFtZSBmcm9tIERUICovCisJc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoJnByaXYtPnNuZF9jYXJkLCAic2ltcGxlLWF1ZGlvLWNhcmQsbmFtZSIpOworCisJLyogZ2V0IENQVS9DT0RFQyBjb21tb24gZm9ybWF0IHZpYSBzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQgKi8KKwlkYWlmbXQgPSBzbmRfc29jX29mX3BhcnNlX2RhaWZtdChub2RlLCAic2ltcGxlLWF1ZGlvLWNhcmQsIikgJgorCQkoU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0sgfCBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSyk7CisKKwkvKiBvZmYtY29kZWMgd2lkZ2V0cyAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwgInNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMiKSkgeworCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKCZwcml2LT5zbmRfY2FyZCwKKwkJCQkJInNpbXBsZS1hdWRpby1jYXJkLHdpZGdldHMiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogREFQTSByb3V0ZXMgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nIikpIHsKKwkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKCZwcml2LT5zbmRfY2FyZCwKKwkJCQkJInNpbXBsZS1hdWRpby1jYXJkLHJvdXRpbmciKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogbG9vcCBvbiB0aGUgREFJIGxpbmtzICovCisJbnAgPSBOVUxMOworCWZvciAoOzspIHsKKwkJaWYgKG11bHRpKSB7CisJCQlucCA9IG9mX2dldF9uZXh0X2NoaWxkKG5vZGUsIG5wKTsKKwkJCWlmICghbnApCisJCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBzaW1wbGVfY2FyZF9jcHVfY29kZWNfb2YobXVsdGkgPyBucCA6IG5vZGUsCisJCQkJCWRhaWZtdCwgZGFpX2xpbmssIGRhaV9wcm9wcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisKKwkJLyoKKwkJICogb3ZlcndyaXRlIGNwdV9kYWktPmZtdCBhcyBpdHMgREFJRk1UX01BU1RFUiBiaXQgaXMgYmFzZWQgb24gQ09ERUMKKwkJICogd2hpbGUgdGhlIG90aGVyIGJpdHMgc2hvdWxkIGJlIGlkZW50aWNhbCB1bmxlc3MgYnVnZ3kgU1cvSFcgZGVzaWduLgorCQkgKi8KKwkJZGFpX3Byb3BzLT5jcHVfZGFpLmZtdCA9IGRhaV9wcm9wcy0+Y29kZWNfZGFpLmZtdDsKKworCQlpZiAoIWRhaV9saW5rLT5jcHVfZGFpX25hbWUgfHwgIWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogc2ltcGxlLWNhcmQgYXNzdW1lcyBwbGF0Zm9ybSA9PSBjcHUgKi8KKwkJZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbGluay0+Y3B1X29mX25vZGU7CisKKwkJbmFtZSA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJICAgIHN0cmxlbihkYWlfbGluay0+Y3B1X2RhaV9uYW1lKSAgICsKKwkJCQkgICAgc3RybGVuKGRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgKyAyLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJc3ByaW50ZihuYW1lLCAiJXMtJXMiLCBkYWlfbGluay0+Y3B1X2RhaV9uYW1lLAorCQkJCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOworCQlkYWlfbGluay0+bmFtZSA9IGRhaV9saW5rLT5zdHJlYW1fbmFtZSA9IG5hbWU7CisKKwkJaWYgKCFtdWx0aSkKKwkJCWJyZWFrOworCisJCWRhaV9saW5rKys7CisJCWRhaV9wcm9wcysrOworCX0KIAogCS8qIGNhcmQgbmFtZSBpcyBjcmVhdGVkIGZyb20gQ1BVL0NPREVDIGRhaSBuYW1lICovCi0JbmFtZSA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkgICAgc3RybGVuKGluZm8tPmNwdV9kYWkubmFtZSkgICArCi0JCQkgICAgc3RybGVuKGluZm8tPmNvZGVjX2RhaS5uYW1lKSArIDIsCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0Jc3ByaW50ZihuYW1lLCAiJXMtJXMiLCBpbmZvLT5jcHVfZGFpLm5hbWUsIGluZm8tPmNvZGVjX2RhaS5uYW1lKTsKLQlpbmZvLT5uYW1lID0gaW5mby0+Y2FyZCA9IG5hbWU7CisJZGFpX2xpbmsgPSBwcml2LT5zbmRfY2FyZC5kYWlfbGluazsKKwlpZiAoIXByaXYtPnNuZF9jYXJkLm5hbWUpCisJCXByaXYtPnNuZF9jYXJkLm5hbWUgPSBkYWlfbGluay0+bmFtZTsKIAotCS8qIHNpbXBsZS1jYXJkIGFzc3VtZXMgcGxhdGZvcm0gPT0gY3B1ICovCi0JKm9mX3BsYXRmb3JtID0gKm9mX2NwdTsKLQotCWRldl9kYmcoZGV2LCAiY2FyZC1uYW1lIDogJXNcbiIsIGluZm8tPmNhcmQpOwotCWRldl9kYmcoZGV2LCAicGxhdGZvcm0gOiAlMDR4XG4iLCBpbmZvLT5kYWlmbXQpOworCWRldl9kYmcoZGV2LCAiY2FyZC1uYW1lIDogJXNcbiIsIHByaXYtPnNuZF9jYXJkLm5hbWUpOworCWRldl9kYmcoZGV2LCAicGxhdGZvcm0gOiAlMDR4XG4iLCBkYWlmbXQpOworCWRhaV9wcm9wcyA9IHByaXYtPmRhaV9wcm9wczsKIAlkZXZfZGJnKGRldiwgImNwdSA6ICVzIC8gJTA0eCAvICVkXG4iLAotCQlpbmZvLT5jcHVfZGFpLm5hbWUsCi0JCWluZm8tPmNwdV9kYWkuZm10LAotCQlpbmZvLT5jcHVfZGFpLnN5c2Nsayk7CisJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUsCisJCWRhaV9wcm9wcy0+Y3B1X2RhaS5mbXQsCisJCWRhaV9wcm9wcy0+Y3B1X2RhaS5zeXNjbGspOwogCWRldl9kYmcoZGV2LCAiY29kZWMgOiAlcyAvICUwNHggLyAlZFxuIiwKLQkJaW5mby0+Y29kZWNfZGFpLm5hbWUsCi0JCWluZm8tPmNvZGVjX2RhaS5mbXQsCi0JCWluZm8tPmNvZGVjX2RhaS5zeXNjbGspOworCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUsCisJCWRhaV9wcm9wcy0+Y29kZWNfZGFpLmZtdCwKKwkJZGFpX3Byb3BzLT5jb2RlY19kYWkuc3lzY2xrKTsKIAogCXJldHVybiAwOworCitlcnI6CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CisKKy8qIHVwZGF0ZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkZXZpY2VzIG5vZGVzIGF0IGVuZCBvZiBwcm9iZSAqLworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3VucmVmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBudW1fbGlua3M7CisKKwlmb3IgKG51bV9saW5rcyA9IDAsIGRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7CisJICAgICBudW1fbGlua3MgPCBjYXJkLT5udW1fbGlua3M7CisJICAgICBudW1fbGlua3MrKywgZGFpX2xpbmsrKykgeworCQlucCA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKikgZGFpX2xpbmstPmNwdV9vZl9ub2RlOworCQlpZiAobnApCisJCQlvZl9ub2RlX3B1dChucCk7CisJCW5wID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKSBkYWlfbGluay0+Y29kZWNfb2Zfbm9kZTsKKwkJaWYgKG5wKQorCQkJb2Zfbm9kZV9wdXQobnApOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfaW5mbyAqY2luZm87CisJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2NwdSwgKm9mX2NvZGVjLCAqb2ZfcGxhdGZvcm07CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgcmV0OworCWludCBudW1fbGlua3MsIG11bHRpLCByZXQ7CiAKLQljaW5mbwkJPSBOVUxMOwotCW9mX2NwdQkJPSBOVUxMOwotCW9mX2NvZGVjCT0gTlVMTDsKLQlvZl9wbGF0Zm9ybQk9IE5VTEw7CisJLyogZ2V0IHRoZSBudW1iZXIgb2YgREFJIGxpbmtzICovCisJaWYgKG5wICYmIG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAic2ltcGxlLWF1ZGlvLWNhcmQsZGFpLWxpbmsiKSkgeworCQludW1fbGlua3MgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCQltdWx0aSA9IDE7CisJfSBlbHNlIHsKKwkJbnVtX2xpbmtzID0gMTsKKwkJbXVsdGkgPSAwOworCX0KIAotCWNpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghY2luZm8pCisJLyogYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBhbmQgdGhlIERBSSBsaW5rIGFycmF5ICovCisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsCisJCQlzaXplb2YoKnByaXYpICsgc2l6ZW9mKCpkYWlfbGluaykgKiBudW1fbGlua3MsCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBpbml0IHNuZF9zb2NfY2FyZAorCSAqLworCXByaXYtPnNuZF9jYXJkLm93bmVyID0gVEhJU19NT0RVTEU7CisJcHJpdi0+c25kX2NhcmQuZGV2ID0gZGV2OworCWRhaV9saW5rID0gcHJpdi0+ZGFpX2xpbms7CisJcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsgPSBkYWlfbGluazsKKwlwcml2LT5zbmRfY2FyZC5udW1fbGlua3MgPSBudW1fbGlua3M7CisKKwkvKiBnZXQgcm9vbSBmb3IgdGhlIG90aGVyIHByb3BlcnRpZXMgKi8KKwlwcml2LT5kYWlfcHJvcHMgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJc2l6ZW9mKCpwcml2LT5kYWlfcHJvcHMpICogbnVtX2xpbmtzLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5kYWlfcHJvcHMpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKG5wICYmIG9mX2RldmljZV9pc19hdmFpbGFibGUobnApKSB7Ci0JCWNpbmZvLT5zbmRfY2FyZC5kZXYgPSBkZXY7CiAKLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9vZihucCwgY2luZm8sIGRldiwKLQkJCQkJCSZvZl9jcHUsCi0JCQkJCQkmb2ZfY29kZWMsCi0JCQkJCQkmb2ZfcGxhdGZvcm0pOworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKG5wLCBwcml2LCBkZXYsIG11bHRpKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKIAkJCQlkZXZfZXJyKGRldiwgInBhcnNlIGVycm9yICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZXJyOwogCQl9CisKKwkJLyoKKwkJICogc29jX2JpbmRfZGFpX2xpbmsoKSB3aWxsIGNoZWNrIGNwdSBuYW1lCisJCSAqIGFmdGVyIG9mX25vZGUgbWF0Y2hpbmcgaWYgZGFpX2xpbmsgaGFzIGNwdV9kYWlfbmFtZS4KKwkJICogYnV0LCBpdCB3aWxsIG5ldmVyIG1hdGNoIGlmIG5hbWUgd2FzIGNyZWF0ZWQgYnkgZm10X3NpbmdsZV9uYW1lKCkKKwkJICogcmVtb3ZlIGNwdV9kYWlfbmFtZSB0byBlc2NhcGUgbmFtZSBtYXRjaGluZy4KKwkJICogc2VlCisJCSAqCWZtdF9zaW5nbGVfbmFtZSgpCisJCSAqCWZtdF9tdWx0aXBsZV9uYW1lKCkKKwkJICovCisJCWlmIChudW1fbGlua3MgPT0gMSkKKwkJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUgPSBOVUxMOworCiAJfSBlbHNlIHsKLQkJaWYgKCFkZXYtPnBsYXRmb3JtX2RhdGEpIHsKKwkJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfaW5mbyAqY2luZm87CisKKwkJY2luZm8gPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJCWlmICghY2luZm8pIHsKIAkJCWRldl9lcnIoZGV2LCAibm8gaW5mbyBmb3IgYXNvYy1zaW1wbGUtY2FyZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCW1lbWNweShjaW5mbywgZGV2LT5wbGF0Zm9ybV9kYXRhLCBzaXplb2YoKmNpbmZvKSk7Ci0JCWNpbmZvLT5zbmRfY2FyZC5kZXYgPSBkZXY7Ci0JfQorCQlpZiAoIWNpbmZvLT5uYW1lCXx8CisJCSAgICAhY2luZm8tPmNvZGVjX2RhaS5uYW1lCXx8CisJCSAgICAhY2luZm8tPmNvZGVjCXx8CisJCSAgICAhY2luZm8tPnBsYXRmb3JtCXx8CisJCSAgICAhY2luZm8tPmNwdV9kYWkubmFtZSkgeworCQkJZGV2X2VycihkZXYsICJpbnN1ZmZpY2llbnQgYXNvY19zaW1wbGVfY2FyZF9pbmZvIHNldHRpbmdzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKLQlpZiAoIWNpbmZvLT5uYW1lCXx8Ci0JICAgICFjaW5mby0+Y2FyZAl8fAotCSAgICAhY2luZm8tPmNvZGVjX2RhaS5uYW1lCXx8Ci0JICAgICEoY2luZm8tPmNvZGVjCQl8fCBvZl9jb2RlYykJfHwKLQkgICAgIShjaW5mby0+cGxhdGZvcm0JCXx8IG9mX3BsYXRmb3JtKQl8fAotCSAgICAhKGNpbmZvLT5jcHVfZGFpLm5hbWUJfHwgb2ZfY3B1KSkgewotCQlkZXZfZXJyKGRldiwgImluc3VmZmljaWVudCBhc29jX3NpbXBsZV9jYXJkX2luZm8gc2V0dGluZ3NcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcHJpdi0+c25kX2NhcmQubmFtZQk9IChjaW5mby0+Y2FyZCkgPyBjaW5mby0+Y2FyZCA6IGNpbmZvLT5uYW1lOworCQlkYWlfbGluay0+bmFtZQkJPSBjaW5mby0+bmFtZTsKKwkJZGFpX2xpbmstPnN0cmVhbV9uYW1lCT0gY2luZm8tPm5hbWU7CisJCWRhaV9saW5rLT5wbGF0Zm9ybV9uYW1lCT0gY2luZm8tPnBsYXRmb3JtOworCQlkYWlfbGluay0+Y29kZWNfbmFtZQk9IGNpbmZvLT5jb2RlYzsKKwkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZQk9IGNpbmZvLT5jcHVfZGFpLm5hbWU7CisJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSA9IGNpbmZvLT5jb2RlY19kYWkubmFtZTsKKwkJbWVtY3B5KCZwcml2LT5kYWlfcHJvcHMtPmNwdV9kYWksICZjaW5mby0+Y3B1X2RhaSwKKwkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y3B1X2RhaSkpOworCQltZW1jcHkoJnByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpLCAmY2luZm8tPmNvZGVjX2RhaSwKKwkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpKSk7CisKKwkJcHJpdi0+ZGFpX3Byb3BzLT5jcHVfZGFpLmZtdAl8PSBjaW5mby0+ZGFpZm10OworCQlwcml2LT5kYWlfcHJvcHMtPmNvZGVjX2RhaS5mbXQJfD0gY2luZm8tPmRhaWZtdDsKIAl9CiAKIAkvKgogCSAqIGluaXQgc25kX3NvY19kYWlfbGluawogCSAqLwotCWNpbmZvLT5zbmRfbGluay5uYW1lCQk9IGNpbmZvLT5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5zdHJlYW1fbmFtZQk9IGNpbmZvLT5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5jcHVfZGFpX25hbWUJPSBjaW5mby0+Y3B1X2RhaS5uYW1lOwotCWNpbmZvLT5zbmRfbGluay5wbGF0Zm9ybV9uYW1lCT0gY2luZm8tPnBsYXRmb3JtOwotCWNpbmZvLT5zbmRfbGluay5jb2RlY19uYW1lCT0gY2luZm8tPmNvZGVjOwotCWNpbmZvLT5zbmRfbGluay5jb2RlY19kYWlfbmFtZQk9IGNpbmZvLT5jb2RlY19kYWkubmFtZTsKLQljaW5mby0+c25kX2xpbmsuY3B1X29mX25vZGUJPSBvZl9jcHU7Ci0JY2luZm8tPnNuZF9saW5rLmNvZGVjX29mX25vZGUJPSBvZl9jb2RlYzsKLQljaW5mby0+c25kX2xpbmsucGxhdGZvcm1fb2Zfbm9kZSA9IG9mX3BsYXRmb3JtOwotCWNpbmZvLT5zbmRfbGluay5pbml0CQk9IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQ7CisJZGFpX2xpbmstPmluaXQgPSBhc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0OwogCi0JLyoKLQkgKiBpbml0IHNuZF9zb2NfY2FyZAotCSAqLwotCWNpbmZvLT5zbmRfY2FyZC5uYW1lCQk9IGNpbmZvLT5jYXJkOwotCWNpbmZvLT5zbmRfY2FyZC5vd25lcgkJPSBUSElTX01PRFVMRTsKLQljaW5mby0+c25kX2NhcmQuZGFpX2xpbmsJPSAmY2luZm8tPnNuZF9saW5rOwotCWNpbmZvLT5zbmRfY2FyZC5udW1fbGlua3MJPSAxOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmcHJpdi0+c25kX2NhcmQsIHByaXYpOwogCi0Jc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZjaW5mby0+c25kX2NhcmQsIGNpbmZvKTsKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmcHJpdi0+c25kX2NhcmQpOwogCi0JcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZjaW5mby0+c25kX2NhcmQpOworZXJyOgorCWFzb2Nfc2ltcGxlX2NhcmRfdW5yZWYocGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXNvY19zaW1wbGVfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9LY29uZmlnIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKaW5kZXggNjFjMTBiZi4uM2M4MWIzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL0tjb25maWcKKysrIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKQEAgLTIsMTIgKzIsNTAgQEAKIAl0cmlzdGF0ZSAiU09DIE1hY2hpbmUgQXVkaW8gZHJpdmVyIGZvciBJbnRlbCBNZWRmaWVsZCBNSUQgcGxhdGZvcm0iCiAJZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDCiAJc2VsZWN0IFNORF9TT0NfU045NTAzMQotCXNlbGVjdCBTTkRfU1NUX1BMQVRGT1JNCisJc2VsZWN0IFNORF9TU1RfTUZMRF9QTEFURk9STQogCWhlbHAKICAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgQVNvQyBtYWNoaW5lIGRyaXZlciBmb3IgSW50ZWwoUikgTUlEIE1lZGZpZWxkIHBsYXRmb3JtCiAgICAgICAgICAgdXNlZCBhcyBhbHNhIGRldmljZSBpbiBhdWRpbyBzdWJzdGVtIGluIEludGVsKFIpIE1JRCBkZXZpY2VzCiAgICAgICAgICAgU2F5IFkgaWYgeW91IGhhdmUgc3VjaCBhIGRldmljZQogICAgICAgICAgIElmIHVuc3VyZSBzZWxlY3QgIk4iLgogCi1jb25maWcgU05EX1NTVF9QTEFURk9STQorY29uZmlnIFNORF9TU1RfTUZMRF9QTEFURk9STQogCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX0lOVEVMX1NTVAorCXRyaXN0YXRlICJBU29DIHN1cHBvcnQgZm9yIEludGVsKFIpIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kiCisJc2VsZWN0IFNORF9TT0NfSU5URUxfU1NUX0FDUEkgaWYgQUNQSQorCWRlcGVuZHMgb24gKFg4NiB8fCBDT01QSUxFX1RFU1QpCisJaGVscAorICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBJbnRlbChSKSBTbWFydCBTb3VuZCBUZWNobm9sb2d5IChTU1QpLgorICAgICAgICAgIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSBkZXZpY2UKKyAgICAgICAgICBJZiB1bnN1cmUgc2VsZWN0ICJOIi4KKworY29uZmlnIFNORF9TT0NfSU5URUxfU1NUX0FDUEkKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19JTlRFTF9IQVNXRUxMCisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfSU5URUxfQkFZVFJBSUwKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19JTlRFTF9IQVNXRUxMX01BQ0gKKwl0cmlzdGF0ZSAiQVNvQyBBdWRpbyBEU1Agc3VwcG9ydCBmb3IgSW50ZWwgSGFzd2VsbCBMeW54cG9pbnQiCisJZGVwZW5kcyBvbiBTTkRfU09DX0lOVEVMX1NTVCAmJiBYODZfSU5URUxfTFBTUyAmJiBJMkMKKwlzZWxlY3QgU05EX1NPQ19JTlRFTF9IQVNXRUxMCisJc2VsZWN0IFNORF9TT0NfUlQ1NjQwCisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBMeW54cG9pbnQgQXVkaW8gRFNQIG9uIEludGVsKFIpIEhhc3dlbGwKKwkgIFVsdHJhYm9vayBwbGF0Zm9ybXMuCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBzdWNoIGEgZGV2aWNlCisJICBJZiB1bnN1cmUgc2VsZWN0ICJOIi4KKworY29uZmlnIFNORF9TT0NfSU5URUxfQllUX1JUNTY0MF9NQUNICisJdHJpc3RhdGUgIkFTb0MgQXVkaW8gZHJpdmVyIGZvciBJbnRlbCBCYXl0cmFpbCB3aXRoIFJUNTY0MCBjb2RlYyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfSU5URUxfU1NUICYmIFg4Nl9JTlRFTF9MUFNTICYmIEkyQworCXNlbGVjdCBTTkRfU09DX0lOVEVMX0JBWVRSQUlMCisJc2VsZWN0IFNORF9TT0NfUlQ1NjQwCisJaGVscAorCSAgVGhpcyBhZGRzIGF1ZGlvIGRyaXZlciBmb3IgSW50ZWwgQmF5dHJhaWwgcGxhdGZvcm0gYmFzZWQgYm9hcmRzCisJICB3aXRoIHRoZSBSVDU2NDAgYXVkaW8gY29kZWMuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUgYi9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUKaW5kZXggNjM5ODgzMy4uZWRlYjc5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUKQEAgLTEsNSArMSwyOCBAQAotc25kLXNvYy1zc3QtcGxhdGZvcm0tb2JqcyA6PSBzc3RfcGxhdGZvcm0ubworIyBDb3JlIHN1cHBvcnQKK3NuZC1zb2Mtc3N0LWRzcC1vYmpzIDo9IHNzdC1kc3AubyBzc3QtZmlybXdhcmUubworc25kLXNvYy1zc3QtYWNwaS1vYmpzIDo9IHNzdC1hY3BpLm8KKworc25kLXNvYy1zc3QtbWZsZC1wbGF0Zm9ybS1vYmpzIDo9IHNzdC1tZmxkLXBsYXRmb3JtLm8KIHNuZC1zb2MtbWZsZC1tYWNoaW5lLW9ianMgOj0gbWZsZF9tYWNoaW5lLm8KIAotb2JqLSQoQ09ORklHX1NORF9TU1RfUExBVEZPUk0pICs9IHNuZC1zb2Mtc3N0LXBsYXRmb3JtLm8KK29iai0kKENPTkZJR19TTkRfU1NUX01GTERfUExBVEZPUk0pICs9IHNuZC1zb2Mtc3N0LW1mbGQtcGxhdGZvcm0ubwogb2JqLSQoQ09ORklHX1NORF9NRkxEX01BQ0hJTkUpICs9IHNuZC1zb2MtbWZsZC1tYWNoaW5lLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfU1NUKSArPSBzbmQtc29jLXNzdC1kc3Aubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfU1NUX0FDUEkpICs9IHNuZC1zb2Mtc3N0LWFjcGkubworCisjIFBsYXRmb3JtIFN1cHBvcnQKK3NuZC1zb2Mtc3N0LWhhc3dlbGwtcGNtLW9ianMgOj0gXAorCXNzdC1oYXN3ZWxsLWlwYy5vIHNzdC1oYXN3ZWxsLXBjbS5vIHNzdC1oYXN3ZWxsLWRzcC5vCitzbmQtc29jLXNzdC1iYXl0cmFpbC1wY20tb2JqcyA6PSBcCisJc3N0LWJheXRyYWlsLWlwYy5vIHNzdC1iYXl0cmFpbC1wY20ubyBzc3QtYmF5dHJhaWwtZHNwLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfSEFTV0VMTCkgKz0gc25kLXNvYy1zc3QtaGFzd2VsbC1wY20ubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQkFZVFJBSUwpICs9IHNuZC1zb2Mtc3N0LWJheXRyYWlsLXBjbS5vCisKKyMgTWFjaGluZSBzdXBwb3J0CitzbmQtc29jLXNzdC1oYXN3ZWxsLW9ianMgOj0gaGFzd2VsbC5vCitzbmQtc29jLXNzdC1ieXQtcnQ1NjQwLW1hY2gtb2JqcyA6PSBieXQtcnQ1NjQwLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfSEFTV0VMTF9NQUNIKSArPSBzbmQtc29jLXNzdC1oYXN3ZWxsLm8KK29iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JZVF9SVDU2NDBfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnl0LXJ0NTY0MC1tYWNoLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ieXQtcnQ1NjQwLmMgYi9zb3VuZC9zb2MvaW50ZWwvYnl0LXJ0NTY0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjk3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYnl0LXJ0NTY0MC5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogSW50ZWwgQmF5dHJhaWwgU1NUIFJUNTY0MCBtYWNoaW5lIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0MC5oIgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X3J0NTY0MF93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkludGVybmFsIE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfYXVkaW9fbWFwW10gPSB7CisJeyJJTjJQIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisJeyJJTjJOIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisJeyJETUlDMSIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9MIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPUiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MTiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9SUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9STiJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJ5dF9ydDU2NDBfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkludGVybmFsIE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlNwZWFrZXIiKSwKK307CisKK3N0YXRpYyBpbnQgYnl0X3J0NTY0MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX1BMTDEsCisJCQkJICAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2LAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgImNhbid0IHNldCBjb2RlYyBjbG9jayAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIFJUNTY0MF9QTEwxX1NfQkNMSzEsCisJCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNjQsCisJCQkJICBwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHBsbDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ5dF9ydDU2NDBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnVudGltZS0+Y2FyZDsKKworCWNhcmQtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNhcmQsIGJ5dF9ydDU2NDBfY29udHJvbHMsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9jb250cm9scykpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gYWRkIGNhcmQgY29udHJvbHNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBPTCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBPUiIpOworCisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUE9MUCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BPTE4iKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQT1JQIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUE9STiIpOworCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkludGVybmFsIE1pYyIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBieXRfcnQ1NjQwX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYnl0X3J0NTY0MF9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYnl0X3J0NTY0MF9kYWlzW10gPSB7CisJeworCQkubmFtZSA9ICJCYXl0cmFpbCBBdWRpbyIsCisJCS5zdHJlYW1fbmFtZSA9ICJBdWRpbyIsCisJCS5jcHVfZGFpX25hbWUgPSAiRnJvbnQtY3B1LWRhaSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NDAtYWlmMSIsCisJCS5jb2RlY19uYW1lID0gImkyYy0xMEVDNTY0MDowMCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImJheXRyYWlsLXBjbS1hdWRpbyIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwkJLmluaXQgPSBieXRfcnQ1NjQwX2luaXQsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmYnl0X3J0NTY0MF9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gIkJheXRyYWlsIFZvaWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNaWMxLWNwdS1kYWkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAorCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDA6MDAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJCS5pbml0ID0gTlVMTCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZieXRfcnQ1NjQwX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYnl0X3J0NTY0MF9jYXJkID0geworCS5uYW1lID0gImJ5dC1ydDU2NDAiLAorCS5kYWlfbGluayA9IGJ5dF9ydDU2NDBfZGFpcywKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBieXRfcnQ1NjQwX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYnl0X3J0NTY0MF9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9hdWRpb19tYXApLAorfTsKKworc3RhdGljIGludCBieXRfcnQ1NjQwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZieXRfcnQ1NjQwX2NhcmQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBieXRfcnQ1NjQwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJ5dF9ydDU2NDBfYXVkaW8gPSB7CisJLnByb2JlID0gYnl0X3J0NTY0MF9wcm9iZSwKKwkucmVtb3ZlID0gYnl0X3J0NTY0MF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYnl0LXJ0NTY0MCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihieXRfcnQ1NjQwX2F1ZGlvKQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgSW50ZWwoUikgQmF5dHJhaWwgTWFjaGluZSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk9tYWlyIE1kIEFiZHVsbGFoLCBKYXJra28gTmlrdWxhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJ5dC1ydDU2NDAiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsLmMgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogSW50ZWwgSGFzd2VsbCBMeW54cG9pbnQgU1NUIEF1ZGlvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0MC5oIgorCisvKiBIYXN3ZWxsIFVMVCBwbGF0Zm9ybXMgaGF2ZSBhIEhlYWRwaG9uZSBhbmQgTWljIGphY2sgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBoYXN3ZWxsX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZXMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWMiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGhhc3dlbGxfcnQ1NjQwX21hcFtdID0geworCisJeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQT1IifSwKKwl7IkhlYWRwaG9uZXMiLCBOVUxMLCAiSFBPTCJ9LAorCXsiSU4yUCIsIE5VTEwsICJNaWMifSwKKworCS8qIENPREVDIEJFIGNvbm5lY3Rpb25zICovCisJeyJTU1AwIENPREVDIElOIiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJTU1AwIENPREVDIE9VVCJ9LAorfTsKKworc3RhdGljIGludCBoYXN3ZWxsX3NzcDBfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJLyogVGhlIEFEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8gKi8KKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7CisKKwkvKiBzZXQgU1NQMCB0byAxNiBiaXQgKi8KKwlzbmRfbWFza19zZXQoJnBhcmFtcy0+bWFza3NbU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCAtCisJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSwKKwkJCQkgICAgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhc3dlbGxfcnQ1NjQwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfTUNMSywgMTIyODgwMDAsCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBzeXNjbGsgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IGNvcnJlY3QgY29kZWMgZmlsdGVyIGZvciBEQUkgZm9ybWF0IGFuZCBjbG9jayBjb25maWcgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKHJ0ZC0+Y29kZWMsIDB4ODMsIDB4ZmZmZiwgMHg4MDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgaGFzd2VsbF9ydDU2NDBfb3BzID0geworCS5od19wYXJhbXMgPSBoYXN3ZWxsX3J0NTY0MF9od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IGhhc3dlbGxfcnRkX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocnRkLT5wbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaGFzd2VsbCA9IHBkYXRhLT5kc3A7CisJaW50IHJldDsKKworCS8qIFNldCBBRFNQIFNTUCBwb3J0IHNldHRpbmdzICovCisJcmV0ID0gc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhoYXN3ZWxsLCBTU1RfSFNXX0RFVklDRV9TU1BfMCwKKwkJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiwKKwkJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSLCA5KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBkZXZpY2UgY29uZmlnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBhbHdheXMgY29ubmVjdGVkICovCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZXMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGhhc3dlbGxfcnQ1NjQwX2RhaXNbXSA9IHsKKwkvKiBGcm9udCBFbmQgREFJIGxpbmtzICovCisJeworCQkubmFtZSA9ICJTeXN0ZW0iLAorCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTeXN0ZW0gUGluIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAorCQkuZHluYW1pYyA9IDEsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuaW5pdCA9IGhhc3dlbGxfcnRkX2luaXQsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk9mZmxvYWQwIiwKKwkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQwIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJPZmZsb2FkMCBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk9mZmxvYWQxIiwKKwkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJPZmZsb2FkMSBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIkxvb3BiYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxvb3BiYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMb29wYmFjayBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMCwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQ2FwdHVyZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJDYXB0dXJlIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCX0sCisKKwkvKiBCYWNrIEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS8qIFNTUDAgLSBDb2RlYyAqLworCQkubmFtZSA9ICJDb2RlYyIsCisJCS5iZV9pZCA9IDAsCisJCS5jcHVfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5jb2RlY19uYW1lID0gImkyYy1JTlQzM0NBOjAwIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY0MC1haWYxIiwKKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGhhc3dlbGxfc3NwMF9maXh1cCwKKwkJLm9wcyA9ICZoYXN3ZWxsX3J0NTY0MF9vcHMsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJfSwKK307CisKKy8qIGF1ZGlvIG1hY2hpbmUgZHJpdmVyIGZvciBIYXN3ZWxsIEx5bnhwb2ludCBEU1AgKyBSVDU2NDAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGhhc3dlbGxfcnQ1NjQwID0geworCS5uYW1lID0gImhhc3dlbGwtcnQ1NjQwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSBoYXN3ZWxsX3J0NTY0MF9kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBoYXN3ZWxsX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaGFzd2VsbF9ydDU2NDBfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX21hcCksCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCit9OworCitzdGF0aWMgaW50IGhhc3dlbGxfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwloYXN3ZWxsX3J0NTY0MC5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmaGFzd2VsbF9ydDU2NDApOworfQorCitzdGF0aWMgaW50IGhhc3dlbGxfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoJmhhc3dlbGxfcnQ1NjQwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGFzd2VsbF9hdWRpbyA9IHsKKwkucHJvYmUgPSBoYXN3ZWxsX2F1ZGlvX3Byb2JlLAorCS5yZW1vdmUgPSBoYXN3ZWxsX2F1ZGlvX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJoYXN3ZWxsLWF1ZGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaGFzd2VsbF9hdWRpbykKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBYaW5nY2hhbyBXYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBBdWRpbyBmb3IgSGFzd2VsbCBMeW54cG9pbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGFzd2VsbC1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jIGIvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jCmluZGV4IGQzZDRjMzIuLjAzMWQ3ODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9tZmxkX21hY2hpbmUuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvbWZsZF9tYWNoaW5lLmMKQEAgLTUzLDYgKzUzLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludAloc19zd2l0Y2g7CiBzdGF0aWMgdW5zaWduZWQgaW50CWxvX2RhYzsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqbWZsZF9jb2RlYzsKIAogc3RydWN0IG1mbGRfbWNfcHJpdmF0ZSB7CiAJdm9pZCBfX2lvbWVtICppbnRfYmFzZTsKQEAgLTEwMCw0MCArMTAxLDQ3IEBACiBzdGF0aWMgaW50IGhlYWRzZXRfc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNhcmQtPmRhcG07CiAKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0gaHNfc3dpdGNoKQogCQlyZXR1cm4gMDsKIAorCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CiAJCXByX2RlYnVnKCJoc19zZXQgSFMgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkVQT1VUIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKIAl9IGVsc2UgewogCQlwcl9kZWJ1ZygiaHNfc2V0IEVQIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiSGVhZHBob25lcyIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZXMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7CiAJfQotCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisKIAloc19zd2l0Y2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsb19lbmFibGVfb3V0X3BpbnMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgbG9fZW5hYmxlX291dF9waW5zKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJJSEZPVVRMIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiSUhGT1VUUiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkVPVVRMIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTElORU9VVFIiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJWSUIxT1VUIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMk9VVCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJJSEZPVVRMIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVEwiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMU9VVCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIyT1VUIik7CiAJaWYgKGhzX3N3aXRjaCkgewotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lcyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7CiAJfSBlbHNlIHsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiRVBPVVQiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFUE9VVCIpOwogCX0KIH0KIApAQCAtMTQ3LDQ1ICsxNTUsNTMgQEAKIHN0YXRpYyBpbnQgbG9fc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNhcmQtPmRhcG07CiAKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0gbG9fZGFjKQogCQlyZXR1cm4gMDsKIAorCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJLyogd2UgZG9udCB3YW50IHRvIHdvcmsgd2l0aCBsYXN0IHN0YXRlIG9mIGxpbmVvdXQgc28ganVzdCBlbmFibGUgYWxsCiAJICogcGlucyBhbmQgdGhlbiBkaXNhYmxlIHBpbnMgbm90IHJlcXVpcmVkCiAJICovCi0JbG9fZW5hYmxlX291dF9waW5zKGNvZGVjKTsKKwlsb19lbmFibGVfb3V0X3BpbnMoZGFwbSk7CisKIAlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CiAJY2FzZSAwOgogCQlwcl9kZWJ1Zygic2V0IHZpYnJhIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMU9VVCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVklCMk9VVCIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAwKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIxT1VUIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMk9VVCIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1mbGRfY29kZWMsIFNOOTUwMzFfTE9DVEwsIDB4NjYsIDApOwogCQlicmVhazsKIAogCWNhc2UgMToKIAkJcHJfZGVidWcoInNldCBocyAgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJFUE9VVCIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDIyKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDIyKTsKIAkJYnJlYWs7CiAKIAljYXNlIDI6CiAJCXByX2RlYnVnKCJzZXQgc3BrciBwYXRoXG4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIklIRk9VVEwiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIklIRk9VVFIiKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMHg0NCk7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSUhGT1VUTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVFIiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDQ0KTsKIAkJYnJlYWs7CiAKIAljYXNlIDM6CiAJCXByX2RlYnVnKCJzZXQgbnVsbCBwYXRoXG4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkVPVVRMIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJMSU5FT1VUUiIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDY2KTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FT1VUTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxJTkVPVVRSIik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWZsZF9jb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMHg2Nik7CiAJCWJyZWFrOwogCX0KLQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOworCiAJbG9fZGFjID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjEsMjYgKzIzNywxMSBAQAogCiBzdGF0aWMgaW50IG1mbGRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydW50aW1lLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJnJ1bnRpbWUtPmNhcmQtPmRhcG07CiAJaW50IHJldF92YWw7CiAKLQkvKiBBZGQgamFjayBzZW5zZSB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtZmxkX3dpZGdldHMsIEFSUkFZX1NJWkUobWZsZF93aWRnZXRzKSk7CisJbWZsZF9jb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOwogCi0JLyogU2V0IHVwIHRoZSBtYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBtZmxkX21hcCwgQVJSQVlfU0laRShtZmxkX21hcCkpOwotCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmVzIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyIpOwotCi0JcmV0X3ZhbCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtZmxkX3NuZF9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKG1mbGRfc25kX2NvbnRyb2xzKSk7Ci0JaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzb2NfYWRkX2NvbnRyb2xzIGZhaWxlZCAlZCIsIHJldF92YWwpOwotCQlyZXR1cm4gcmV0X3ZhbDsKLQl9CiAJLyogZGVmYXVsdCBpcyBlYXJwaWVjZSBwaW4sIHVzZXJzcGFjZSBzZXRzIGl0IGV4cGxjaXRseSAqLwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lcyIpOwogCS8qIGRlZmF1bHQgaXMgbGluZW91dCBOQywgdXNlcnNwYWNlIHNldHMgaXQgZXhwbGNpdGx5ICovCkBAIC0yNTMsNyArMjU0LDcgQEAKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVJTlIiKTsKIAogCS8qIEhlYWRzZXQgYW5kIGJ1dHRvbiBqYWNrIGRldGVjdGlvbiAqLwotCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSW50ZWwoUikgTUlEIEF1ZGlvIEphY2siLAorCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KG1mbGRfY29kZWMsICJJbnRlbChSKSBNSUQgQXVkaW8gSmFjayIsCiAJCQlTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAgfAogCQkJU05EX0pBQ0tfQlROXzEsICZtZmxkX2phY2spOwogCWlmIChyZXRfdmFsKSB7CkBAIC0zMzUsNiArMzM2LDEzIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gbWZsZF9tc2ljX2RhaWxpbmssCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUobWZsZF9tc2ljX2RhaWxpbmspLAorCisJLmNvbnRyb2xzID0gbWZsZF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWZsZF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBtZmxkX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1mbGRfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gbWZsZF9tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWZsZF9tYXApLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IHNuZF9tZmxkX2phY2tfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYWNwaS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwNmVlYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtYWNwaS5jCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogSW50ZWwgU1NUIGxvYWRlciBvbiBBQ1BJIHN5c3RlbXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCisjZGVmaW5lIFNTVF9MUFRfRFNQX0RNQV9BRERSX09GRlNFVAkweDBGMDAwMAorI2RlZmluZSBTU1RfV1BUX0RTUF9ETUFfQUREUl9PRkZTRVQJMHgwRkUwMDAKKyNkZWZpbmUgU1NUX0xQVF9EU1BfRE1BX1NJWkUJCSgxMDI0IC0gMSkKKworLyogRGVzY3JpcHRvciBmb3IgU1NUIEFTb0MgbWFjaGluZSBkcml2ZXIgKi8KK3N0cnVjdCBzc3RfYWNwaV9tYWNoIHsKKwkvKiBBQ1BJIElEIGZvciB0aGUgbWF0Y2hpbmcgbWFjaGluZSBkcml2ZXIuIEF1ZGlvIGNvZGVjIGZvciBpbnN0YW5jZSAqLworCWNvbnN0IHU4IGlkW0FDUElfSURfTEVOXTsKKwkvKiBtYWNoaW5lIGRyaXZlciBuYW1lICovCisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJLyogZmlybXdhcmUgZmlsZSBuYW1lICovCisJY29uc3QgY2hhciAqZndfZmlsZW5hbWU7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHVwIFNTVCBwbGF0Zm9ybSBkYXRhICovCitzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyB7CisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2hpbmVzOworCS8qIFBsYXRmb3JtIHJlc291cmNlIGluZGV4ZXMuIE11c3Qgc2V0IHRvIC0xIGlmIG5vdCB1c2VkICovCisJaW50IHJlc2luZGV4X2xwZV9iYXNlOworCWludCByZXNpbmRleF9wY2ljZmdfYmFzZTsKKwlpbnQgcmVzaW5kZXhfZndfYmFzZTsKKwlpbnQgaXJxaW5kZXhfaG9zdF9pcGM7CisJaW50IHJlc2luZGV4X2RtYV9iYXNlOworCS8qIFVuaXF1ZSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIFNTVCBjb3JlIG9uIHBsYXRmb3JtICovCisJaW50IHNzdF9pZDsKKwkvKiBETUEgb25seSB2YWxpZCB3aGVuIHJlc2luZGV4X2RtYV9iYXNlICE9IC0xKi8KKwlpbnQgZG1hX2VuZ2luZTsKKwlpbnQgZG1hX3NpemU7Cit9OworCitzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9tYWNoOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZfcGNtOworCXN0cnVjdCBzc3RfcGRhdGEgc3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjOworCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoOworfTsKKworc3RhdGljIHZvaWQgc3N0X2FjcGlfZndfY2IoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGV4dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9ICZzc3RfYWNwaS0+c3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjID0gc3N0X2FjcGktPmRlc2M7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2ggPSBzc3RfYWNwaS0+bWFjaDsKKworCXNzdF9wZGF0YS0+ZncgPSBmdzsKKwlpZiAoIWZ3KSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGxvYWQgZmlybXdhcmUgJXNcbiIsIG1hY2gtPmZ3X2ZpbGVuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlZ2lzdGVyIFBDTSBhbmQgREFJIGRyaXZlciAqLworCXNzdF9hY3BpLT5wZGV2X3BjbSA9CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKGRldiwgZGVzYy0+ZHJ2X25hbWUsIC0xLAorCQkJCQkgICAgICBzc3RfcGRhdGEsIHNpemVvZigqc3N0X3BkYXRhKSk7CisJaWYgKElTX0VSUihzc3RfYWNwaS0+cGRldl9wY20pKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIGRldmljZSAlcy4gRXJyb3IgJWRcbiIsCisJCQlkZXNjLT5kcnZfbmFtZSwgKGludClQVFJfRVJSKHNzdF9hY3BpLT5wZGV2X3BjbSkpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNzdF9hY3BpX21hY2hfbWF0Y2goYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbGV2ZWwsCisJCQkJICAgICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXQpCit7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggKnNzdF9hY3BpX2ZpbmRfbWFjaGluZSgKKwlzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCAqbWFjaGluZXMpCit7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJZm9yIChtYWNoID0gbWFjaGluZXM7IG1hY2gtPmlkWzBdOyBtYWNoKyspCisJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfZGV2aWNlcyhtYWNoLT5pZCwKKwkJCQkJCSAgc3N0X2FjcGlfbWFjaF9tYXRjaCwKKwkJCQkJCSAgJmZvdW5kLCBOVUxMKSkgJiYgZm91bmQpCisJCQlyZXR1cm4gbWFjaDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNzdF9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGE7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJc3RydWN0IHNzdF9hY3BpX2Rlc2MgKmRlc2M7CisJc3RydWN0IHJlc291cmNlICptbWlvOworCWludCByZXQgPSAwOworCisJc3N0X2FjcGkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNzdF9hY3BpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNzdF9hY3BpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWQgPSBhY3BpX21hdGNoX2RldmljZShkZXYtPmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwgZGV2KTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRlc2MgPSAoc3RydWN0IHNzdF9hY3BpX2Rlc2MgKilpZC0+ZHJpdmVyX2RhdGE7CisJbWFjaCA9IHNzdF9hY3BpX2ZpbmRfbWFjaGluZShkZXNjLT5tYWNoaW5lcyk7CisJaWYgKG1hY2ggPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIk5vIG1hdGNoaW5nIEFTb0MgbWFjaGluZSBkcml2ZXIgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzc3RfcGRhdGEgPSAmc3N0X2FjcGktPnNzdF9wZGF0YTsKKwlzc3RfcGRhdGEtPmlkID0gZGVzYy0+c3N0X2lkOworCXNzdF9hY3BpLT5kZXNjID0gZGVzYzsKKwlzc3RfYWNwaS0+bWFjaCA9IG1hY2g7CisKKwlpZiAoZGVzYy0+cmVzaW5kZXhfZG1hX2Jhc2UgPj0gMCkgeworCQlzc3RfcGRhdGEtPmRtYV9lbmdpbmUgPSBkZXNjLT5kbWFfZW5naW5lOworCQlzc3RfcGRhdGEtPmRtYV9iYXNlID0gZGVzYy0+cmVzaW5kZXhfZG1hX2Jhc2U7CisJCXNzdF9wZGF0YS0+ZG1hX3NpemUgPSBkZXNjLT5kbWFfc2l6ZTsKKwl9CisKKwlpZiAoZGVzYy0+aXJxaW5kZXhfaG9zdF9pcGMgPj0gMCkKKwkJc3N0X3BkYXRhLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGRlc2MtPmlycWluZGV4X2hvc3RfaXBjKTsKKworCWlmIChkZXNjLT5yZXNpbmRleF9scGVfYmFzZSA+PSAwKSB7CisJCW1taW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCSAgICAgZGVzYy0+cmVzaW5kZXhfbHBlX2Jhc2UpOworCQlpZiAobW1pbykgeworCQkJc3N0X3BkYXRhLT5scGVfYmFzZSA9IG1taW8tPnN0YXJ0OworCQkJc3N0X3BkYXRhLT5scGVfc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7CisJCX0KKwl9CisKKwlpZiAoZGVzYy0+cmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPj0gMCkgeworCQltbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkgICAgIGRlc2MtPnJlc2luZGV4X3BjaWNmZ19iYXNlKTsKKwkJaWYgKG1taW8pIHsKKwkJCXNzdF9wZGF0YS0+cGNpY2ZnX2Jhc2UgPSBtbWlvLT5zdGFydDsKKwkJCXNzdF9wZGF0YS0+cGNpY2ZnX3NpemUgPSByZXNvdXJjZV9zaXplKG1taW8pOworCQl9CisJfQorCisJaWYgKGRlc2MtPnJlc2luZGV4X2Z3X2Jhc2UgPj0gMCkgeworCQltbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkgICAgIGRlc2MtPnJlc2luZGV4X2Z3X2Jhc2UpOworCQlpZiAobW1pbykgeworCQkJc3N0X3BkYXRhLT5md19iYXNlID0gbW1pby0+c3RhcnQ7CisJCQlzc3RfcGRhdGEtPmZ3X3NpemUgPSByZXNvdXJjZV9zaXplKG1taW8pOworCQl9CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3N0X2FjcGkpOworCisJLyogcmVnaXN0ZXIgbWFjaGluZSBkcml2ZXIgKi8KKwlzc3RfYWNwaS0+cGRldl9tYWNoID0KKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoZGV2LCBtYWNoLT5kcnZfbmFtZSwgLTEsCisJCQkJCSAgICAgIHNzdF9wZGF0YSwgc2l6ZW9mKCpzc3RfcGRhdGEpKTsKKwlpZiAoSVNfRVJSKHNzdF9hY3BpLT5wZGV2X21hY2gpKQorCQlyZXR1cm4gUFRSX0VSUihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKworCS8qIGNvbnRpbnVlIFNTVCBwcm9iaW5nIGFmdGVyIGZpcm13YXJlIGlzIGxvYWRlZCAqLworCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCB0cnVlLCBtYWNoLT5md19maWxlbmFtZSwKKwkJCQkgICAgICBkZXYsIEdGUF9LRVJORUwsIHBkZXYsIHNzdF9hY3BpX2Z3X2NiKTsKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2FjcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9hY3BpX3ByaXYgKnNzdF9hY3BpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gJnNzdF9hY3BpLT5zc3RfcGRhdGE7CisKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzc3RfYWNwaS0+cGRldl9tYWNoKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHNzdF9hY3BpLT5wZGV2X3BjbSkpCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzdF9hY3BpLT5wZGV2X3BjbSk7CisJcmVsZWFzZV9maXJtd2FyZShzc3RfcGRhdGEtPmZ3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggaGFzd2VsbF9tYWNoaW5lc1tdID0geworCXsgIklOVDMzQ0EiLCAiaGFzd2VsbC1hdWRpbyIsICJpbnRlbC9JbnRjU1NUMS5iaW4iIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgPSB7CisJLmRydl9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkubWFjaGluZXMgPSBoYXN3ZWxsX21hY2hpbmVzLAorCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCisJLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKKwkucmVzaW5kZXhfZndfYmFzZSA9IC0xLAorCS5pcnFpbmRleF9ob3N0X2lwYyA9IDAsCisJLnNzdF9pZCA9IFNTVF9ERVZfSURfTFlOWF9QT0lOVCwKKwkuZG1hX2VuZ2luZSA9IFNTVF9ETUFfVFlQRV9EVywKKwkucmVzaW5kZXhfZG1hX2Jhc2UgPSBTU1RfTFBUX0RTUF9ETUFfQUREUl9PRkZTRVQsCisJLmRtYV9zaXplID0gU1NUX0xQVF9EU1BfRE1BX1NJWkUsCit9OworCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggYnJvYWR3ZWxsX21hY2hpbmVzW10gPSB7CisJeyAiSU5UMzQzQSIsICJicm9hZHdlbGwtYXVkaW8iLCAiaW50ZWwvSW50Y1NTVDIuYmluIiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX2Rlc2Mgc3N0X2FjcGlfYnJvYWR3ZWxsX2Rlc2MgPSB7CisJLmRydl9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkubWFjaGluZXMgPSBicm9hZHdlbGxfbWFjaGluZXMsCisJLnJlc2luZGV4X2xwZV9iYXNlID0gMCwKKwkucmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPSAxLAorCS5yZXNpbmRleF9md19iYXNlID0gLTEsCisJLmlycWluZGV4X2hvc3RfaXBjID0gMCwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9XSUxEQ0FUX1BPSU5ULAorCS5kbWFfZW5naW5lID0gU1NUX0RNQV9UWVBFX0RXLAorCS5yZXNpbmRleF9kbWFfYmFzZSA9IFNTVF9XUFRfRFNQX0RNQV9BRERSX09GRlNFVCwKKwkuZG1hX3NpemUgPSBTU1RfTFBUX0RTUF9ETUFfU0laRSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBiYXl0cmFpbF9tYWNoaW5lc1tdID0geworCXsgIjEwRUM1NjQwIiwgImJ5dC1ydDU2NDAiLCAiaW50ZWwvZndfc3N0XzBmMjguYmluLWkyc19tYXN0ZXIiIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9iYXl0cmFpbF9kZXNjID0geworCS5kcnZfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCS5tYWNoaW5lcyA9IGJheXRyYWlsX21hY2hpbmVzLAorCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCisJLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKKwkucmVzaW5kZXhfZndfYmFzZSA9IDIsCisJLmlycWluZGV4X2hvc3RfaXBjID0gNSwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9CWVQsCisJLnJlc2luZGV4X2RtYV9iYXNlID0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNzdF9hY3BpX21hdGNoW10gPSB7CisJeyAiSU5UMzNDOCIsICh1bnNpZ25lZCBsb25nKSZzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgfSwKKwl7ICJJTlQzNDM4IiwgKHVuc2lnbmVkIGxvbmcpJnNzdF9hY3BpX2Jyb2Fkd2VsbF9kZXNjIH0sCisJeyAiODA4NjBGMjgiLCAodW5zaWduZWQgbG9uZykmc3N0X2FjcGlfYmF5dHJhaWxfZGVzYyB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc3N0X2FjcGlfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzc3RfYWNwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gc3N0X2FjcGlfcHJvYmUsCisJLnJlbW92ZSA9IHNzdF9hY3BpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzc3QtYWNwaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHNzdF9hY3BpX21hdGNoKSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X2FjcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFya2tvIE5pa3VsYSA8amFya2tvLm5pa3VsYUBsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBsb2FkZXIgb24gQUNQSSBzeXN0ZW1zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWRzcC5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBiZjdmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1kc3AuYwpAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBEU1AgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJzc3QtZHNwLmgiCisjaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorCisjZGVmaW5lIFNTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkUJNAorI2RlZmluZSBTU1RfQllUX0ZXX1NJR04JCQkiJFNTVCIKKworI2RlZmluZSBTU1RfQllUX0lSQU1fT0ZGU0VUCTB4QzAwMDAKKyNkZWZpbmUgU1NUX0JZVF9EUkFNX09GRlNFVAkweDEwMDAwMAorI2RlZmluZSBTU1RfQllUX1NISU1fT0ZGU0VUCTB4MTQwMDAwCisKK2VudW0gc3N0X3JhbV90eXBlIHsKKwlTU1RfQllUX0lSQU0JPSAxLAorCVNTVF9CWVRfRFJBTQk9IDIsCisJU1NUX0JZVF9DQUNIRQk9IDMsCit9OworCitzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8geworCWVudW0gc3N0X3JhbV90eXBlCXR5cGU7CS8qIElSQU0vRFJBTSAqLworCXUzMgkJCXNpemU7CS8qIEJ5dGVzICovCisJdTMyCQkJcmFtX29mZnNldDsgLyogT2Zmc2V0IGluIEkvRFJBTSAqLworCXUzMgkJCXJzdmQ7CS8qIFJlc2VydmVkIGZpZWxkICovCit9OworCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfQllUX0ZXX1NJR05BVFVSRV9TSVpFXTsKKwl1MzIgZmlsZV9zaXplOyAvKiBzaXplIG9mIGZ3IG1pbnVzIHRoaXMgaGVhZGVyICovCisJdTMyIG1vZHVsZXM7IC8qICAjIG9mIG1vZHVsZXMgKi8KKwl1MzIgZmlsZV9mb3JtYXQ7IC8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLworCXUzMiByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkVdOworCXUzMiBtb2Rfc2l6ZTsgLyogc2l6ZSBvZiBtb2R1bGUgKi8KKwl1MzIgYmxvY2tzOyAvKiAjIG9mIGJsb2NrcyAqLworCXUzMiB0eXBlOyAvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KKwl1MzIgZW50cnlfcG9pbnQ7Cit9OworCitzdGF0aWMgaW50IHNzdF9ieXRfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAorCQkJCXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgKm1vZHVsZSkKK3sKKwlzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gKmJsb2NrOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2Q7CisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSBibG9ja19kYXRhOworCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlIHRlbXBsYXRlOworCWludCBjb3VudDsKKworCW1lbXNldCgmdGVtcGxhdGUsIDAsIHNpemVvZih0ZW1wbGF0ZSkpOworCXRlbXBsYXRlLmlkID0gbW9kdWxlLT50eXBlOworCXRlbXBsYXRlLmVudHJ5ID0gbW9kdWxlLT5lbnRyeV9wb2ludDsKKwl0ZW1wbGF0ZS5wLnR5cGUgPSBTU1RfTUVNX0RSQU07CisJdGVtcGxhdGUucC5kYXRhX3R5cGUgPSBTU1RfREFUQV9QOworCXRlbXBsYXRlLnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwl0ZW1wbGF0ZS5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisKKwltb2QgPSBzc3RfbW9kdWxlX25ldyhmdywgJnRlbXBsYXRlLCBOVUxMKTsKKwlpZiAobW9kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7CisKKwkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKKwkJCWRldl9lcnIoZHNwLT5kZXYsICJibG9jayAlZCBzaXplIGludmFsaWRcbiIsIGNvdW50KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3dpdGNoIChibG9jay0+dHlwZSkgeworCQljYXNlIFNTVF9CWVRfSVJBTToKKwkJCWJsb2NrX2RhdGEub2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQgKworCQkJCQkgICAgZHNwLT5hZGRyLmlyYW1fb2Zmc2V0OworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9JUkFNOworCQkJYnJlYWs7CisJCWNhc2UgU1NUX0JZVF9EUkFNOgorCQkJYmxvY2tfZGF0YS5vZmZzZXQgPSBibG9jay0+cmFtX29mZnNldCArCisJCQkJCSAgICBkc3AtPmFkZHIuZHJhbV9vZmZzZXQ7CisJCQlibG9ja19kYXRhLnR5cGUgPSBTU1RfTUVNX0RSQU07CisJCQlicmVhazsKKwkJY2FzZSBTU1RfQllUX0NBQ0hFOgorCQkJYmxvY2tfZGF0YS5vZmZzZXQgPSBibG9jay0+cmFtX29mZnNldCArCisJCQkJCSAgICAoZHNwLT5hZGRyLmZ3X2V4dCAtIGRzcC0+YWRkci5scGUpOworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9DQUNIRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihkc3AtPmRldiwgIndyb25nIHJhbSB0eXBlIDB4JXggaW4gYmxvY2sweCV4XG4iLAorCQkJCWJsb2NrLT50eXBlLCBjb3VudCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJsb2NrX2RhdGEuc2l6ZSA9IGJsb2NrLT5zaXplOworCQlibG9ja19kYXRhLmRhdGFfdHlwZSA9IFNTVF9EQVRBX007CisJCWJsb2NrX2RhdGEuZGF0YSA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKTsKKworCQlzc3RfbW9kdWxlX2luc2VydF9maXhlZF9ibG9jayhtb2QsICZibG9ja19kYXRhKTsKKworCQlibG9jayA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKSArIGJsb2NrLT5zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BhcnNlX2Z3X2ltYWdlKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3QgZndfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IHNzdF9ieXRfZndfbW9kdWxlX2hlYWRlciAqbW9kdWxlOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKKwlpbnQgcmV0LCBjb3VudDsKKworCS8qIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYXRhIHBvaW50ZXIgKi8KKwloZWFkZXIgPSAoc3RydWN0IGZ3X2hlYWRlciAqKXNzdF9mdy0+ZG1hX2J1ZjsKKworCS8qIHZlcmlmeSBGVyAqLworCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0JZVF9GV19TSUdOLCA0KSAhPSAwKSB8fAorCSAgICAoc3N0X2Z3LT5zaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgeworCQkvKiBJbnZhbGlkIEZXIHNpZ25hdHVyZSAqLworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiSW52YWxpZCBGVyBzaWduL2ZpbGVzaXplIG1pc21hdGNoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkc3AtPmRldiwKKwkJImhlYWRlciBzaWduPSU0cyBzaXplPTB4JXggbW9kdWxlcz0weCV4IGZtdD0weCV4IHNpemU9JXp1XG4iLAorCQloZWFkZXItPnNpZ25hdHVyZSwgaGVhZGVyLT5maWxlX3NpemUsIGhlYWRlci0+bW9kdWxlcywKKwkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKKworCW1vZHVsZSA9ICh2b2lkICopc3N0X2Z3LT5kbWFfYnVmICsgc2l6ZW9mKCpoZWFkZXIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGhlYWRlci0+bW9kdWxlczsgY291bnQrKykgeworCQkvKiBtb2R1bGUgKi8KKwkJcmV0ID0gc3N0X2J5dF9wYXJzZV9tb2R1bGUoZHNwLCBzc3RfZncsIG1vZHVsZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiaW52YWxpZCBtb2R1bGUgJWRcbiIsIGNvdW50KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbW9kdWxlID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSkgKyBtb2R1bGUtPm1vZF9zaXplOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2R1bXBfc2hpbShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCWludCBpOworCXU2NCByZWc7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDB4RjA7IGkgKz0gOCkgeworCQlyZWcgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgaSk7CisJCWlmIChyZWcpCisJCQlkZXZfZGJnKHNzdC0+ZGV2LCAic2hpbSAweCUyLjJ4IHZhbHVlIDB4JTE2LjE2bGx4XG4iLAorCQkJCWksIHJlZyk7CisJfQorCisJZm9yIChpID0gMHgwMDsgaSA8PSAweGZmOyBpICs9IDQpIHsKKwkJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBpKTsKKwkJaWYgKHJlZykKKwkJCWRldl9kYmcoc3N0LT5kZXYsICJwY2kgMHglMi4yeCB2YWx1ZSAweCU4Ljh4XG4iLAorCQkJCWksICh1MzIpcmVnKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzc3RfYnl0X2lycShpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwl1NjQgaXNyeDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmc3N0LT5zcGlubG9jayk7CisKKwlpc3J4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JU1JYKTsKKwlpZiAoaXNyeCAmIFNTVF9JU1JYX0RPTkUpIHsKKwkJLyogQURTUCBoYXMgcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIHJlcXVlc3QgZnJvbSBJQSAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYLAorCQkJCQkJICAgIFNTVF9CWVRfSVBDWF9ET05FLCAwKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKwlpZiAoaXNyeCAmIFNTVF9CWVRfSVNSWF9SRVFVRVNUKSB7CisJCS8qIG1hc2sgbWVzc2FnZSByZXF1ZXN0IGZyb20gQURTUCBhbmQgZG8gcHJvY2Vzc2luZyBsYXRlciAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJCQkJICAgIFNTVF9CWVRfSU1SWF9SRVFVRVNULAorCQkJCQkJICAgIFNTVF9CWVRfSU1SWF9SRVFVRVNUKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKworCXNwaW5fdW5sb2NrKCZzc3QtPnNwaW5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCWludCB0cmllcyA9IDEwOworCisJLyogcmVsZWFzZSBzdGFsbCBhbmQgd2FpdCB0byB1bnN0YWxsICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3N0LCBTU1RfQ1NSLCBTU1RfQllUX0NTUl9TVEFMTCwgMHgwKTsKKwl3aGlsZSAodHJpZXMtLSkgeworCQlpZiAoIShzc3RfZHNwX3NoaW1fcmVhZDY0KHNzdCwgU1NUX0NTUikgJgorCQkgICAgICBTU1RfQllUX0NTUl9QV0FJVE1PREUpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMDApOworCX0KKwlpZiAodHJpZXMgPCAwKSB7CisJCWRldl9lcnIoc3N0LT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgRFNQXG4iKTsKKwkJc3N0X2J5dF9kdW1wX3NoaW0oc3N0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfcmVzZXQoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwkvKiBwdXQgRFNQIGludG8gcmVzZXQsIHNldCByZXNldCB2ZWN0b3IgYW5kIHN0YWxsICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQllUX0NTUl9SU1QgfCBTU1RfQllUX0NTUl9WRUNUT1JfU0VMIHwgU1NUX0JZVF9DU1JfU1RBTEwsCisJCVNTVF9CWVRfQ1NSX1JTVCB8IFNTVF9CWVRfQ1NSX1ZFQ1RPUl9TRUwgfCBTU1RfQllUX0NTUl9TVEFMTCk7CisKKwl1ZGVsYXkoMTApOworCisJLyogdGFrZSBEU1Agb3V0IG9mIHJlc2V0IGFuZCBrZWVwIHN0YWxsZWQgZm9yIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9DU1IsIFNTVF9CWVRfQ1NSX1JTVCwgMCk7Cit9CisKK3N0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24geworCXUzMiBzdGFydDsKKwl1MzIgZW5kOworCWludCBibG9ja3M7CisJZW51bSBzc3RfbWVtX3R5cGUgdHlwZTsKK307CisKKy8qIEJZVCB0ZXN0IHN0dWZmICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiBieXRfcmVnaW9uW10gPSB7CisJezB4QzAwMDAsIDB4MTAwMDAwLCA4LCBTU1RfTUVNX0lSQU19LCAvKiBJLVNSQU0gLSA4ICogMzJrQiAqLworCXsweDEwMDAwMCwgMHgxNDAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTAgLSA4ICogMzJrQiAqLworfTsKKworc3RhdGljIGludCBzc3RfYnl0X3Jlc291cmNlX21hcChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwlzc3QtPmFkZHIubHBlX2Jhc2UgPSBwZGF0YS0+bHBlX2Jhc2U7CisJc3N0LT5hZGRyLmxwZSA9IGlvcmVtYXAocGRhdGEtPmxwZV9iYXNlLCBwZGF0YS0+bHBlX3NpemUpOworCWlmICghc3N0LT5hZGRyLmxwZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBBRFNQIFBDSSBNTUlPIGNvbmZpZyBzcGFjZSAqLworCXNzdC0+YWRkci5wY2lfY2ZnID0gaW9yZW1hcChwZGF0YS0+cGNpY2ZnX2Jhc2UsIHBkYXRhLT5wY2ljZmdfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIucGNpX2NmZykgeworCQlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTU1QgRXh0ZW5kZWQgRlcgYWxsb2NhdGlvbiAqLworCXNzdC0+YWRkci5md19leHQgPSBpb3JlbWFwKHBkYXRhLT5md19iYXNlLCBwZGF0YS0+Zndfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIuZndfZXh0KSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLnBjaV9jZmcpOworCQlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTU1QgU2hpbSAqLworCXNzdC0+YWRkci5zaGltID0gc3N0LT5hZGRyLmxwZSArIHNzdC0+YWRkci5zaGltX29mZnNldDsKKworCXNzdF9kc3BfbWFpbGJveF9pbml0KHNzdCwgU1NUX0JZVF9NQUlMQk9YX09GRlNFVCArIDB4MjA0LAorCQkJICAgICBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFLAorCQkJICAgICBTU1RfQllUX01BSUxCT1hfT0ZGU0VULAorCQkJICAgICBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFKTsKKworCXNzdC0+aXJxID0gcGRhdGEtPmlycTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uICpyZWdpb247CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXQgPSAtRU5PREVWLCBpLCBqLCByZWdpb25fY291bnQ7CisJdTMyIG9mZnNldCwgc2l6ZTsKKworCWRldiA9IHNzdC0+ZGV2OworCisJc3dpdGNoIChzc3QtPmlkKSB7CisJY2FzZSBTU1RfREVWX0lEX0JZVDoKKwkJcmVnaW9uID0gYnl0X3JlZ2lvbjsKKwkJcmVnaW9uX2NvdW50ID0gQVJSQVlfU0laRShieXRfcmVnaW9uKTsKKwkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX0JZVF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLmRyYW1fb2Zmc2V0ID0gU1NUX0JZVF9EUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX0JZVF9TSElNX09GRlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9ieXRfcmVzb3VyY2VfbWFwKHNzdCwgcGRhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogc2F2ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBleHRlbmRlZCBmaXJtd2FyZSBibG9jayBpbiB0aGUgZmlyc3QKKwkgKiA0IGJ5dGVzIG9mIHRoZSBtYWlsYm94CisJICovCisJbWVtY3B5X3RvaW8oc3N0LT5hZGRyLmxwZSArIFNTVF9CWVRfTUFJTEJPWF9PRkZTRVQsCisJICAgICAgICZwZGF0YS0+ZndfYmFzZSwgc2l6ZW9mKHUzMikpOworCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBlbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHNzdCwgU1NUX0lNUlgsIDB4MywgMHgwKTsKKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9JTVJELCAweDMsIDB4MCk7CisKKwkvKiByZWdpc3RlciBEU1AgbWVtb3J5IGJsb2NrcyAtIGlkZWFsbHkgd2Ugc2hvdWxkIGdldCB0aGlzIGZyb20gQUNQSSAqLworCWZvciAoaSA9IDA7IGkgPCByZWdpb25fY291bnQ7IGkrKykgeworCQlvZmZzZXQgPSByZWdpb25baV0uc3RhcnQ7CisJCXNpemUgPSAocmVnaW9uW2ldLmVuZCAtIHJlZ2lvbltpXS5zdGFydCkgLyByZWdpb25baV0uYmxvY2tzOworCisJCS8qIHJlZ2lzdGVyIGluZGl2aWR1YWwgbWVtb3J5IGJsb2NrcyAqLworCQlmb3IgKGogPSAwOyBqIDwgcmVnaW9uW2ldLmJsb2NrczsgaisrKSB7CisJCQlzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHNzdCwgb2Zmc2V0LCBzaXplLAorCQkJCQkgICAgICAgcmVnaW9uW2ldLnR5cGUsIE5VTEwsIGosIHNzdCk7CisJCQlvZmZzZXQgKz0gc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3RfbWVtX2Jsb2NrX3VucmVnaXN0ZXJfYWxsKHNzdCk7CisJaW91bm1hcChzc3QtPmFkZHIubHBlKTsKKwlpb3VubWFwKHNzdC0+YWRkci5wY2lfY2ZnKTsKKwlpb3VubWFwKHNzdC0+YWRkci5md19leHQpOworfQorCitzdHJ1Y3Qgc3N0X29wcyBzc3RfYnl0X29wcyA9IHsKKwkucmVzZXQgPSBzc3RfYnl0X3Jlc2V0LAorCS5ib290ID0gc3N0X2J5dF9ib290LAorCS53cml0ZSA9IHNzdF9zaGltMzJfd3JpdGUsCisJLnJlYWQgPSBzc3Rfc2hpbTMyX3JlYWQsCisJLndyaXRlNjQgPSBzc3Rfc2hpbTMyX3dyaXRlNjQsCisJLnJlYWQ2NCA9IHNzdF9zaGltMzJfcmVhZDY0LAorCS5yYW1fcmVhZCA9IHNzdF9tZW1jcHlfZnJvbWlvXzMyLAorCS5yYW1fd3JpdGUgPSBzc3RfbWVtY3B5X3RvaW9fMzIsCisJLmlycV9oYW5kbGVyID0gc3N0X2J5dF9pcnEsCisJLmluaXQgPSBzc3RfYnl0X2luaXQsCisJLmZyZWUgPSBzc3RfYnl0X2ZyZWUsCisJLnBhcnNlX2Z3ID0gc3N0X2J5dF9wYXJzZV9md19pbWFnZSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1pcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGVhZWVlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1pcGMuYwpAQCAtMCwwICsxLDg2NyBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBJUEMgU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAqLworI2RlZmluZSBJUENfVElNRU9VVF9NU0VDUwkzMDAKKyNkZWZpbmUgSVBDX0JPT1RfTVNFQ1MJCTIwMAorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorCisvKiBJUEMgaGVhZGVyIGJpdHMgKi8KKyNkZWZpbmUgSVBDX0hFQURFUl9NU0dfSURfTUFTSwkweGZmCisjZGVmaW5lIElQQ19IRUFERVJfTVNHX0lEKHgpCSgoeCkgJiBJUENfSEVBREVSX01TR19JRF9NQVNLKQorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRF9TSElGVAk4CisjZGVmaW5lIElQQ19IRUFERVJfU1RSX0lEX01BU0sJMHgxZgorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRCh4KQkoKCh4KSAmIDB4MWYpIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKQorI2RlZmluZSBJUENfSEVBREVSX0xBUkdFX1NISUZUCTEzCisjZGVmaW5lIElQQ19IRUFERVJfTEFSR0UoeCkJKCgoeCkgJiAweDEpIDw8IElQQ19IRUFERVJfTEFSR0VfU0hJRlQpCisjZGVmaW5lIElQQ19IRUFERVJfREFUQV9TSElGVAkxNgorI2RlZmluZSBJUENfSEVBREVSX0RBVEFfTUFTSwkweDNmZmYKKyNkZWZpbmUgSVBDX0hFQURFUl9EQVRBKHgpCSgoKHgpICYgMHgzZmZmKSA8PCBJUENfSEVBREVSX0RBVEFfU0hJRlQpCisKKy8qIG1hc2sgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIG5vdGlmaWNhdGlvbiBhbmQgcmVwbHkgbWVzc2FnZSAqLworI2RlZmluZSBJUENfTk9USUZJQ0FUSU9OCSgweDEgPDwgNykKKworLyogSTJMIFN0cmVhbSBjb25maWcvY29udHJvbCBtc2dzICovCisjZGVmaW5lIElQQ19JQV9BTExPQ19TVFJFQU0JMHgyMAorI2RlZmluZSBJUENfSUFfRlJFRV9TVFJFQU0JMHgyMQorI2RlZmluZSBJUENfSUFfUEFVU0VfU1RSRUFNCTB4MjQKKyNkZWZpbmUgSVBDX0lBX1JFU1VNRV9TVFJFQU0JMHgyNQorI2RlZmluZSBJUENfSUFfRFJPUF9TVFJFQU0JMHgyNgorI2RlZmluZSBJUENfSUFfU1RBUlRfU1RSRUFNCTB4MzAKKworLyogbm90aWZpY2F0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lIElQQ19JQV9GV19JTklUX0NNUExUCTB4ODEKKyNkZWZpbmUgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRAkweDk3CisKKy8qIElQQyBtZXNzYWdlcyBiZXR3ZWVuIGhvc3QgYW5kIEFEU1AgKi8KK3N0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyB7CisJdTMyIGFkZHI7CisJdTMyIHNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSB7CisJdTggY29kZWNfdHlwZTsKKwl1OCBzdHJfdHlwZTsKKwl1OCBvcGVyYXRpb247CisJdTggcHJvdGVjdGVkX3N0cjsKKwl1OCB0aW1lX3Nsb3RzOworCXU4IHJlc2VydmVkOworCXUxNiByZXN1bHQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHsKKwl1OCBudW1fY2hhbjsKKwl1OCBwY21fd2Rfc3o7CisJdTggdXNlX29mZmxvYWRfcGF0aDsKKwl1OCByZXNlcnZlZDsKKwl1MzIgc2ZyZXE7CisJdTggY2hhbm5lbF9tYXBbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9mcmFtZXNfaW5mbyB7CisJdTE2IG51bV9lbnRyaWVzOworCXUxNiByc3J2ZDsKKwl1MzIgZnJhZ19zaXplOworCXN0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyByaW5nX2J1Zl9pbmZvWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHBjbV9wYXJhbXM7CisJc3RydWN0IHNzdF9ieXRfZnJhbWVzX2luZm8gZnJhbWVfaW5mbzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzc3RfYnl0X2FsbG9jX3Jlc3BvbnNlIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwl1OCByZXNlcnZlZFs4OF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdGFydF9zdHJlYW1fcGFyYW1zIHsKKwl1MzIgYnl0ZV9vZmZzZXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgeworCXU2NCByaW5nX2J1ZmZlcl9jb3VudGVyOworCXU2NCBoYXJkd2FyZV9jb3VudGVyOworCXU2NCBmcmFtZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfY29waWVkOworCXUzMiBzYW1wbGluZ19mcmVxdWVuY3k7CisJdTMyIGNoYW5uZWxfcGVha1s4XTsKK30gX19wYWNrZWQ7CisKKy8qIGRyaXZlciBpbnRlcm5hbCBJUEMgbWVzc2FnZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpcGNfbWVzc2FnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU2NCBoZWFkZXI7CisKKwkvKiBkaXJlY3Rpb24gd3J0IGhvc3QgQ1BVICovCisJY2hhciB0eF9kYXRhW1NTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkVdOworCXNpemVfdCB0eF9zaXplOworCWNoYXIgcnhfZGF0YVtTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFXTsKKwlzaXplX3Qgcnhfc2l6ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCWJvb2wgY29tcGxldGU7CisJYm9vbCB3YWl0OworCWludCBlcnJubzsKK307CisKK3N0cnVjdCBzc3RfYnl0X3N0cmVhbTsKK3N0cnVjdCBzc3RfYnl0OworCisvKiBzdHJlYW0gaW5mb21hdGlvbiAqLworc3RydWN0IHNzdF9ieXRfc3RyZWFtIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisKKwkvKiBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHJlcXVlc3Q7CisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgcmVwbHk7CisKKwkvKiBydW50aW1lIGluZm8gKi8KKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0OworCWludCBzdHJfaWQ7CisJYm9vbCBjb21taXRlZDsKKwlib29sIHJ1bm5pbmc7CisKKwkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKKwl2b2lkICpwZGF0YTsKK307CisKKy8qIFNTVCBCYXl0cmFpbCBJUEMgZGF0YSAqLworc3RydWN0IHNzdF9ieXQgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCisJLyogc3RyZWFtICovCisJc3RydWN0IGxpc3RfaGVhZCBzdHJlYW1fbGlzdDsKKworCS8qIGJvb3QgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7CisJYm9vbCBib290X2NvbXBsZXRlOworCisJLyogSVBDIG1lc3NhZ2luZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBlbXB0eV9saXN0OworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfdHhxOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHhfdGhyZWFkOworCXN0cnVjdCBrdGhyZWFkX3dvcmtlciBrd29ya2VyOworCXN0cnVjdCBrdGhyZWFkX3dvcmsga3dvcms7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7Cit9OworCitzdGF0aWMgaW5saW5lIHU2NCBzc3RfYnl0X2hlYWRlcihpbnQgbXNnX2lkLCBpbnQgZGF0YSwgYm9vbCBsYXJnZSwgaW50IHN0cl9pZCkKK3sKKwl1NjQgaGVhZGVyOworCisJaGVhZGVyID0gSVBDX0hFQURFUl9NU0dfSUQobXNnX2lkKSB8CisJCSBJUENfSEVBREVSX1NUUl9JRChzdHJfaWQpIHwKKwkJIElQQ19IRUFERVJfTEFSR0UobGFyZ2UpIHwKKwkJIElQQ19IRUFERVJfREFUQShkYXRhKSB8CisJCSBTU1RfQllUX0lQQ1hfQlVTWTsKKworCXJldHVybiBoZWFkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX21zZ19pZCh1NjQgaGVhZGVyKQoreworCXJldHVybiBoZWFkZXIgJiBJUENfSEVBREVSX01TR19JRF9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHU4IHNzdF9ieXRfaGVhZGVyX3N0cl9pZCh1NjQgaGVhZGVyKQoreworCXJldHVybiAoaGVhZGVyID4+IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKSAmIElQQ19IRUFERVJfU1RSX0lEX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX2RhdGEodTY0IGhlYWRlcikKK3sKKwlyZXR1cm4gKGhlYWRlciA+PiBJUENfSEVBREVSX0RBVEFfU0hJRlQpICYgSVBDX0hFQURFUl9EQVRBX01BU0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfZ2V0X3N0cmVhbShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJCQkJIGludCBzdHJlYW1faWQpCit7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cmVhbSwgJmJ5dC0+c3RyZWFtX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHN0cmVhbS0+c3RyX2lkID09IHN0cmVhbV9pZCkKKwkJCXJldHVybiBzdHJlYW07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9ieXRfaXBjX3NoaW1fZGJnKHN0cnVjdCBzc3RfYnl0ICpieXQsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJ5dC0+ZHNwOworCXU2NCBpc3IsIGlwY2QsIGltcngsIGlwY3g7CisKKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKKwlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lTUlgpOworCWlwY2QgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCWltcnggPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOworCisJZGV2X2VycihieXQtPmRldiwKKwkJImlwYzogLS0lcy0tIGlwY3ggMHglbGx4IGlzciAweCVsbHggaXBjZCAweCVsbHggaW1yeCAweCVsbHhcbiIsCisJCXRleHQsIGlwY3gsIGlzciwgaXBjZCwgaW1yeCk7Cit9CisKKy8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICpzc3RfYnl0X21zZ19nZXRfZW1wdHkoc3RydWN0IHNzdF9ieXQgKmJ5dCkKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZyA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmJ5dC0+ZW1wdHlfbGlzdCkpIHsKKwkJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmYnl0LT5lbXB0eV9saXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOworCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2lwY190eF9tc2dzKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3N0X2J5dCwga3dvcmspOworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCXU2NCBpcGN4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmJ5dC0+dHhfbGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB0aGUgRFNQIGlzIGJ1c3kgd2Ugd2lsbCBUWCBtZXNzYWdlcyBhZnRlciBJUlEgKi8KKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gpOworCWlmIChpcGN4ICYgU1NUX0JZVF9JUENYX0JVU1kpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZieXQtPnR4X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwgbGlzdCk7CisKKwlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmJ5dC0+cnhfbGlzdCk7CisKKwkvKiBzZW5kIHRoZSBtZXNzYWdlICovCisJaWYgKG1zZy0+aGVhZGVyICYgSVBDX0hFQURFUl9MQVJHRSh0cnVlKSkKKwkJc3N0X2RzcF9vdXRib3hfd3JpdGUoYnl0LT5kc3AsIG1zZy0+dHhfZGF0YSwgbXNnLT50eF9zaXplKTsKKwlzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gsIG1zZy0+aGVhZGVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X2J5dF90eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCQkJCSBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwltc2ctPmNvbXBsZXRlID0gdHJ1ZTsKKworCWlmICghbXNnLT53YWl0KQorCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOworCWVsc2UKKwkJd2FrZV91cCgmbXNnLT53YWl0cSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF90eF93YWl0X2RvbmUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2csCisJCQkJdm9pZCAqcnhfZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiB3YWl0IGZvciBEU1AgY29tcGxldGlvbiAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2ctPndhaXRxLCBtc2ctPmNvbXBsZXRlLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKElQQ19USU1FT1VUX01TRUNTKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCQlzc3RfYnl0X2lwY19zaGltX2RiZyhieXQsICJtZXNzYWdlIHRpbWVvdXQiKTsKKworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisKKwkJLyogY29weSB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERTUCAqLworCQlpZiAobXNnLT5yeF9zaXplKQorCQkJbWVtY3B5KHJ4X2RhdGEsIG1zZy0+cnhfZGF0YSwgbXNnLT5yeF9zaXplKTsKKwkJcmV0ID0gbXNnLT5lcnJubzsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9pcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCSAgdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzLAorCQkJCSAgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJbXNnID0gc3N0X2J5dF9tc2dfZ2V0X2VtcHR5KGJ5dCk7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1zZy0+aGVhZGVyID0gaGVhZGVyOworCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOworCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOworCW1zZy0+d2FpdCA9IHdhaXQ7CisJbXNnLT5lcnJubyA9IDA7CisJbXNnLT5jb21wbGV0ZSA9IGZhbHNlOworCisJaWYgKHR4X2J5dGVzKSB7CisJCS8qIG1zZyBjb250ZW50ID0gbG93ZXIgMzItYml0IG9mIHRoZSBoZWFkZXIgKyBkYXRhICovCisJCSoodTMyICopbXNnLT50eF9kYXRhID0gKHUzMikoaGVhZGVyICYgKHUzMiktMSk7CisJCW1lbWNweShtc2ctPnR4X2RhdGEgKyBzaXplb2YodTMyKSwgdHhfZGF0YSwgdHhfYnl0ZXMpOworCQltc2ctPnR4X3NpemUgKz0gc2l6ZW9mKHUzMik7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmYnl0LT50eF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZieXQtPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHNzdF9ieXRfdHhfd2FpdF9kb25lKGJ5dCwgbXNnLCByeF9kYXRhKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzc3RfYnl0X2lwY190eF9tc2dfd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCQkgIHZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywKKwkJCQkJICB2b2lkICpyeF9kYXRhLCBzaXplX3QgcnhfYnl0ZXMpCit7CisJcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21lc3NhZ2UoYnl0LCBoZWFkZXIsIHR4X2RhdGEsIHR4X2J5dGVzLAorCQkJCSAgICAgIHJ4X2RhdGEsIHJ4X2J5dGVzLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3N0X2J5dF9pcGNfdHhfbXNnX25vd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAorCQkJCQkJdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQoreworCXJldHVybiBzc3RfYnl0X2lwY190eF9tZXNzYWdlKGJ5dCwgaGVhZGVyLCB0eF9kYXRhLCB0eF9ieXRlcywKKwkJCQkgICAgICBOVUxMLCAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqc3N0X2J5dF9yZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJCQkJICB1NjQgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnID0gTlVMTCwgKl9tc2c7CisJdTY0IG1hc2s7CisKKwkvKiBtYXRjaCByZXBseSB0byBtZXNzYWdlIHNlbnQgYmFzZWQgb24gbXNnIGFuZCBzdHJlYW0gSURzICovCisJbWFzayA9IElQQ19IRUFERVJfTVNHX0lEX01BU0sgfAorCSAgICAgICBJUENfSEVBREVSX1NUUl9JRF9NQVNLIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUOworCWhlYWRlciAmPSBtYXNrOworCisJaWYgKGxpc3RfZW1wdHkoJmJ5dC0+cnhfbGlzdCkpIHsKKwkJZGV2X2VycihieXQtPmRldiwKKwkJCSJpcGM6IHJ4IGxpc3QgaXMgZW1wdHkgYnV0IHJlY2VpdmVkIDB4JWxseFxuIiwgaGVhZGVyKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShfbXNnLCAmYnl0LT5yeF9saXN0LCBsaXN0KSB7CisJCWlmICgoX21zZy0+aGVhZGVyICYgbWFzaykgPT0gaGVhZGVyKSB7CisJCQltc2cgPSBfbXNnOworCQkJYnJlYWs7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X3N0cmVhbV91cGRhdGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisJdTY0IGhlYWRlciA9IG1zZy0+aGVhZGVyOworCXU4IHN0cmVhbV9pZCA9IHNzdF9ieXRfaGVhZGVyX3N0cl9pZChoZWFkZXIpOworCXU4IHN0cmVhbV9tc2cgPSBzc3RfYnl0X2hlYWRlcl9tc2dfaWQoaGVhZGVyKTsKKworCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKKwljYXNlIElQQ19JQV9EUk9QX1NUUkVBTToKKwljYXNlIElQQ19JQV9QQVVTRV9TVFJFQU06CisJY2FzZSBJUENfSUFfRlJFRV9TVFJFQU06CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIElQQ19JQV9TVEFSVF9TVFJFQU06CisJY2FzZSBJUENfSUFfUkVTVU1FX1NUUkVBTToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcHJvY2Vzc19yZXBseShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJbXNnID0gc3N0X2J5dF9yZXBseV9maW5kX21zZyhieXQsIGhlYWRlcik7CisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmIChoZWFkZXIgJiBJUENfSEVBREVSX0xBUkdFKHRydWUpKSB7CisJCW1zZy0+cnhfc2l6ZSA9IHNzdF9ieXRfaGVhZGVyX2RhdGEoaGVhZGVyKTsKKwkJc3N0X2RzcF9pbmJveF9yZWFkKGJ5dC0+ZHNwLCBtc2ctPnJ4X2RhdGEsIG1zZy0+cnhfc2l6ZSk7CisJfQorCisJLyogdXBkYXRlIGFueSBzdHJlYW0gc3RhdGVzICovCisJc3N0X2J5dF9zdHJlYW1fdXBkYXRlKGJ5dCwgbXNnKTsKKworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCS8qIHdha2UgdXAgKi8KKwlzc3RfYnl0X3R4X21zZ19yZXBseV9jb21wbGV0ZShieXQsIG1zZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc3N0X2J5dF9md19yZWFkeShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCWRldl9kYmcoYnl0LT5kZXYsICJpcGM6IERTUCBpcyByZWFkeSAweCVsbFhcbiIsIGhlYWRlcik7CisKKwlieXQtPmJvb3RfY29tcGxldGUgPSB0cnVlOworCXdha2VfdXAoJmJ5dC0+Ym9vdF93YWl0KTsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbTsKKwl1NjQgaGVhZGVyOworCXU4IG1zZ19pZCwgc3RyZWFtX2lkOworCWludCBoYW5kbGVkID0gMTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJbXNnX2lkID0gc3N0X2J5dF9oZWFkZXJfbXNnX2lkKGhlYWRlcik7CisKKwlzd2l0Y2ggKG1zZ19pZCkgeworCWNhc2UgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRDoKKwkJc3RyZWFtX2lkID0gc3N0X2J5dF9oZWFkZXJfc3RyX2lkKGhlYWRlcik7CisJCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJCWlmIChzdHJlYW0gJiYgc3RyZWFtLT5ydW5uaW5nICYmIHN0cmVhbS0+bm90aWZ5X3Bvc2l0aW9uKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQkJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24oc3RyZWFtLCBzdHJlYW0tPnBkYXRhKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBDX0lBX0ZXX0lOSVRfQ01QTFQ6CisJCXNzdF9ieXRfZndfcmVhZHkoYnl0LCBoZWFkZXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNzdF9ieXRfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gc3N0X2RzcF9nZXRfdGhyZWFkX2NvbnRleHQoc3N0KTsKKwl1NjQgaGVhZGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJaGVhZGVyID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENEKTsKKwlpZiAoaGVhZGVyICYgU1NUX0JZVF9JUENEX0JVU1kpIHsKKwkJaWYgKGhlYWRlciAmIElQQ19OT1RJRklDQVRJT04pIHsKKwkJCS8qIG1lc3NhZ2UgZnJvbSBBRFNQICovCisJCQlzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKGJ5dCwgJmZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlcGx5IGZyb20gQURTUCAqLworCQkJc3N0X2J5dF9wcm9jZXNzX3JlcGx5KGJ5dCwgaGVhZGVyKTsKKwkJfQorCQkvKgorCQkgKiBjbGVhciBJUENEIEJVU1kgYml0IGFuZCBzZXQgRE9ORSBiaXQuIFRlbGwgRFNQIHdlIGhhdmUKKwkJICogcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIGFuZCBjYW4gYWNjZXB0IG5ldy4gQ2xlYXIgZGF0YSBwYXJ0CisJCSAqIG9mIHRoZSBoZWFkZXIKKwkJICovCisJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QsCisJCQlTU1RfQllUX0lQQ0RfRE9ORSB8IFNTVF9CWVRfSVBDRF9CVVNZIHwKKwkJCUlQQ19IRUFERVJfREFUQShJUENfSEVBREVSX0RBVEFfTUFTSyksCisJCQlTU1RfQllUX0lQQ0RfRE9ORSk7CisJCS8qIHVubWFzayBtZXNzYWdlIHJlcXVlc3QgaW50ZXJydXB0cyAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJU1NUX0JZVF9JTVJYX1JFUVVFU1QsIDApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIGNvbnRpbnVlIHRvIHNlbmQgYW55IHJlbWFpbmluZyBtZXNzYWdlcy4uLiAqLworCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIHN0cmVhbSBBUEkgKi8KK3N0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3N0X2J5dF9zdHJlYW1fbmV3KHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCBpZCwKKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKQoreworCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2FkZCgmc3RyZWFtLT5ub2RlLCAmYnl0LT5zdHJlYW1fbGlzdCk7CisJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24gPSBub3RpZnlfcG9zaXRpb247CisJc3RyZWFtLT5wZGF0YSA9IGRhdGE7CisJc3RyZWFtLT5ieXQgPSBieXQ7CisJc3RyZWFtLT5zdHJfaWQgPSBpZDsKKworCXJldHVybiBzdHJlYW07Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICBpbnQgYml0cykKK3sKKwlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5wY21fd2Rfc3ogPSBiaXRzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIHU4IGNoYW5uZWxzKQoreworCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuID0gY2hhbm5lbHM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSA9IHJhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qIHN0cmVhbSBzb25maWd1cmF0aW9uICovCitpbnQgc3N0X2J5dF9zdHJlYW1fdHlwZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCWludCBjb2RlY190eXBlLCBpbnQgc3RyZWFtX3R5cGUsIGludCBvcGVyYXRpb24pCit7CisJc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLmNvZGVjX3R5cGUgPSBjb2RlY190eXBlOworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5zdHJfdHlwZSA9IHN0cmVhbV90eXBlOworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLnRpbWVfc2xvdHMgPSAweGM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgdWludDMyX3QgYnVmZmVyX2FkZHIsIHVpbnQzMl90IGJ1ZmZlcl9zaXplKQoreworCXN0cmVhbS0+cmVxdWVzdC5mcmFtZV9pbmZvLm51bV9lbnRyaWVzID0gMTsKKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgPSBidWZmZXJfYWRkcjsKKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLnNpemUgPSBidWZmZXJfc2l6ZTsKKwkvKiBjYWxjdWxhdGUgYnl0ZXMgcGVyIDQgbXMgZnJhZ21lbnQgKi8KKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5mcmFnX3NpemUgPQorCQlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSAqCisJCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuICoKKwkJc3RyZWFtLT5yZXF1ZXN0LnBjbV9wYXJhbXMucGNtX3dkX3N6IC8gOCAqCisJCTQgLyAxMDAwOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCXN0cnVjdCBzc3RfYnl0X2FsbG9jX3BhcmFtcyAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7CisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgKnJlcGx5ID0gJnN0cmVhbS0+cmVwbHk7CisJdTY0IGhlYWRlcjsKKwlpbnQgcmV0OworCisJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0FMTE9DX1NUUkVBTSwKKwkJCQlzaXplb2YoKnN0cl9yZXEpICsgc2l6ZW9mKHUzMiksCisJCQkJdHJ1ZSwgc3RyZWFtLT5zdHJfaWQpOworCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBzdHJfcmVxLCBzaXplb2YoKnN0cl9yZXEpLAorCQkJCSAgICAgIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3Igc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9mcmVlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCXU2NCBoZWFkZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCWdvdG8gb3V0OworCisJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0ZSRUVfU1RSRUFNLCAwLCBmYWxzZSwgc3RyZWFtLT5zdHJfaWQpOworCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBmcmVlIHN0cmVhbSAlZCBmYWlsZWRcbiIsCisJCQlzdHJlYW0tPnN0cl9pZCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSBmYWxzZTsKK291dDoKKwlsaXN0X2RlbCgmc3RyZWFtLT5ub2RlKTsKKwlrZnJlZShzdHJlYW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCB0eXBlLAorCQkJCSAgICAgaW50IHN0cmVhbV9pZCwgaW50IHdhaXQpCit7CisJc3RydWN0IHNzdF9ieXRfc3RhcnRfc3RyZWFtX3BhcmFtcyBzdGFydF9zdHJlYW07CisJdTY0IGhlYWRlcjsKKwl2b2lkICp0eF9tc2cgPSBOVUxMOworCXNpemVfdCBzaXplID0gMDsKKworCWlmICh0eXBlICE9IElQQ19JQV9TVEFSVF9TVFJFQU0pIHsKKwkJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIodHlwZSwgMCwgZmFsc2UsIHN0cmVhbV9pZCk7CisJfSBlbHNlIHsKKwkJc3RhcnRfc3RyZWFtLmJ5dGVfb2Zmc2V0ID0gMDsKKwkJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX1NUQVJUX1NUUkVBTSwKKwkJCQkJc2l6ZW9mKHN0YXJ0X3N0cmVhbSkgKyBzaXplb2YodTMyKSwKKwkJCQkJdHJ1ZSwgc3RyZWFtX2lkKTsKKwkJdHhfbXNnID0gJnN0YXJ0X3N0cmVhbTsKKwkJc2l6ZSA9IHNpemVvZihzdGFydF9zdHJlYW0pOworCX0KKworCWlmICh3YWl0KQorCQlyZXR1cm4gc3N0X2J5dF9pcGNfdHhfbXNnX3dhaXQoYnl0LCBoZWFkZXIsCisJCQkJCSAgICAgICB0eF9tc2csIHNpemUsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21zZ19ub3dhaXQoYnl0LCBoZWFkZXIsIHR4X21zZywgc2l6ZSk7Cit9CisKKy8qIHN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9ieXRfc3RyZWFtX3N0YXJ0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX1NUQVJUX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gc3RhcnQgc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3N0b3Aoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pCit7CisJaW50IHJldDsKKworCS8qIGRvbid0IHN0b3Agc3RyZWFtcyB0aGF0IGFyZSBub3QgY29tbWl0ZWQgKi8KKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fb3BlcmF0aW9ucyhieXQsIElQQ19JQV9EUk9QX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gc3RvcCBzdHJlYW0gJWRcbiIsCisJCQlzdHJlYW0tPnN0cl9pZCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX1BBVVNFX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fb3BlcmF0aW9ucyhieXQsIElQQ19JQV9SRVNVTUVfU1RSRUFNLAorCQkJCQlzdHJlYW0tPnN0cl9pZCwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoYnl0LT5kZXYsICJpcGM6IGVycm9yIGZhaWxlZCB0byByZXN1bWUgc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9ieXRfZ2V0X2RzcF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJICAgICBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKKwlzdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgZndfdHN0YW1wOworCXU4IHN0cl9pZCA9IHN0cmVhbS0+c3RyX2lkOworCXUzMiB0c3RhbXBfb2Zmc2V0OworCisJdHN0YW1wX29mZnNldCA9IFNTVF9CWVRfVElNRVNUQU1QX09GRlNFVCArIHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApOworCW1lbWNweV9mcm9taW8oJmZ3X3RzdGFtcCwKKwkJICAgICAgc3N0LT5hZGRyLmxwZSArIHRzdGFtcF9vZmZzZXQsIHNpemVvZihmd190c3RhbXApKTsKKworCXJldHVybiBkb19kaXYoZndfdHN0YW1wLnJpbmdfYnVmZmVyX2NvdW50ZXIsIGJ1ZmZlcl9zaXplKTsKK30KKworc3RhdGljIGludCBtc2dfZW1wdHlfbGlzdF9pbml0KHN0cnVjdCBzc3RfYnl0ICpieXQpCit7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisJaW50IGk7CisKKwlieXQtPm1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpICogSVBDX0VNUFRZX0xJU1RfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ5dC0+bXNnID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IElQQ19FTVBUWV9MSVNUX1NJWkU7IGkrKykgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZieXQtPm1zZ1tpXS53YWl0cSk7CisJCWxpc3RfYWRkKCZieXQtPm1zZ1tpXS5saXN0LCAmYnl0LT5lbXB0eV9saXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNzdF9kc3AgKnNzdF9ieXRfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0KQoreworCXJldHVybiBieXQtPmRzcDsKK30KKworc3RhdGljIHN0cnVjdCBzc3RfZHNwX2RldmljZSBieXRfZGV2ID0geworCS50aHJlYWQgPSBzc3RfYnl0X2lycV90aHJlYWQsCisJLm9wcyA9ICZzc3RfYnl0X29wcywKK307CisKK2ludCBzc3RfYnl0X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dDsKKwlzdHJ1Y3Qgc3N0X2Z3ICpieXRfc3N0X2Z3OworCWludCBlcnI7CisKKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2luZyBCeXQgRFNQIElQQ1xuIik7CisKKwlieXQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmJ5dCksIEdGUF9LRVJORUwpOworCWlmIChieXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlieXQtPmRldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmYnl0LT5zdHJlYW1fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+dHhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+cnhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ5dC0+ZW1wdHlfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYnl0LT5ib290X3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ5dC0+d2FpdF90eHEpOworCisJZXJyID0gbXNnX2VtcHR5X2xpc3RfaW5pdChieXQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHN0YXJ0IHRoZSBJUEMgbWVzc2FnZSB0aHJlYWQgKi8KKwlpbml0X2t0aHJlYWRfd29ya2VyKCZieXQtPmt3b3JrZXIpOworCWJ5dC0+dHhfdGhyZWFkID0ga3RocmVhZF9ydW4oa3RocmVhZF93b3JrZXJfZm4sCisJCQkJICAgICAmYnl0LT5rd29ya2VyLAorCQkJCSAgICAgZGV2X25hbWUoYnl0LT5kZXYpKTsKKwlpZiAoSVNfRVJSKGJ5dC0+dHhfdGhyZWFkKSkgeworCQllcnIgPSBQVFJfRVJSKGJ5dC0+dHhfdGhyZWFkKTsKKwkJZGV2X2VycihieXQtPmRldiwgImVycm9yIGZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBUWCB0YXNrXG4iKTsKKwkJZ290byBlcnJfZnJlZV9tc2c7CisJfQorCWluaXRfa3RocmVhZF93b3JrKCZieXQtPmt3b3JrLCBzc3RfYnl0X2lwY190eF9tc2dzKTsKKworCWJ5dF9kZXYudGhyZWFkX2NvbnRleHQgPSBieXQ7CisKKwkvKiBpbml0IFNTVCBzaGltICovCisJYnl0LT5kc3AgPSBzc3RfZHNwX25ldyhkZXYsICZieXRfZGV2LCBwZGF0YSk7CisJaWYgKGJ5dC0+ZHNwID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZV9tc2c7CisJfQorCisJLyoga2VlcCB0aGUgRFNQIGluIHJlc2V0IHN0YXRlIGZvciBiYXNlIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKKworCWJ5dF9zc3RfZncgPSBzc3RfZndfbmV3KGJ5dC0+ZHNwLCBwZGF0YS0+ZncsIGJ5dCk7CisJaWYgKGJ5dF9zc3RfZncgID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlnb3RvIGZ3X2VycjsKKwl9CisKKwkvKiB3YWl0IGZvciBEU1AgYm9vdCBjb21wbGV0aW9uICovCisJc3N0X2RzcF9ib290KGJ5dC0+ZHNwKTsKKwllcnIgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYnl0LT5ib290X3dhaXQsIGJ5dC0+Ym9vdF9jb21wbGV0ZSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChlcnIgPT0gMCkgeworCQllcnIgPSAtRUlPOworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBEU1AgYm9vdCB0aW1lb3V0XG4iKTsKKwkJZ290byBib290X2VycjsKKwl9CisKKwlwZGF0YS0+ZHNwID0gYnl0OworCisJcmV0dXJuIDA7CisKK2Jvb3RfZXJyOgorCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCXNzdF9md19mcmVlKGJ5dF9zc3RfZncpOworZndfZXJyOgorCXNzdF9kc3BfZnJlZShieXQtPmRzcCk7CitlcnJfZnJlZV9tc2c6CisJa2ZyZWUoYnl0LT5tc2cpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9ieXRfZHNwX2luaXQpOworCit2b2lkIHNzdF9ieXRfZHNwX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmRzcDsKKworCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCXNzdF9md19mcmVlX2FsbChieXQtPmRzcCk7CisJc3N0X2RzcF9mcmVlKGJ5dC0+ZHNwKTsKKwlrZnJlZShieXQtPm1zZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYnl0X2RzcF9mcmVlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYmF5dHJhaWwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzJiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBJbnRlbCBCYXl0cmFpbCBTU1QgSVBDIFN1cHBvcnQKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19TU1RfQllUX0lQQ19ICisjZGVmaW5lIF9fU1NUX0JZVF9JUENfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHNzdF9ieXQ7CitzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW07CitzdHJ1Y3Qgc3N0X3BkYXRhOworZXh0ZXJuIHN0cnVjdCBzc3Rfb3BzIHNzdF9ieXRfb3BzOworCisKKyNkZWZpbmUgU1NUX0JZVF9NQUlMQk9YX09GRlNFVAkJMHgxNDQwMDAKKyNkZWZpbmUgU1NUX0JZVF9USU1FU1RBTVBfT0ZGU0VUCShTU1RfQllUX01BSUxCT1hfT0ZGU0VUICsgMHg4MDApCisKKy8qKgorICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKKyAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KKyAqLworI2RlZmluZSBTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTIwMAorCisvKiBzdHJlYW0gQVBJICovCitzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfc3RyZWFtX25ldyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBpbnQgaWQsCisJdWludDMyX3QgKCpnZXRfd3JpdGVfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLAorCQkJCSAgICAgICB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKTsKKworLyogc3RyZWFtIGNvbmZpZ3VyYXRpb24gKi8KK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICBpbnQgYml0cyk7CitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIHU4IGNoYW5uZWxzKTsKK2ludCBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fdHlwZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCWludCBjb2RlY190eXBlLCBpbnQgc3RyZWFtX3R5cGUsIGludCBvcGVyYXRpb24pOworaW50IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgdWludDMyX3QgYnVmZmVyX2FkZHIsIHVpbnQzMl90IGJ1ZmZlcl9zaXplKTsKK2ludCBzc3RfYnl0X3N0cmVhbV9jb21taXQoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworaW50IHNzdF9ieXRfc3RyZWFtX2ZyZWUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworCisvKiBzdHJlYW0gQUxTQSB0cmlnZ2VyIG9wZXJhdGlvbnMgKi8KK2ludCBzc3RfYnl0X3N0cmVhbV9zdGFydChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fc3RvcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2J5dF9zdHJlYW1fcGF1c2Uoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pOworaW50IHNzdF9ieXRfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSk7CisKK2ludCBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCSAgICAgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIGludCBidWZmZXJfc2l6ZSk7CisKKy8qIGluaXQgKi8KK2ludCBzc3RfYnl0X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfYnl0X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOworc3RydWN0IHNzdF9kc3AgKnNzdF9ieXRfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDEwMWYzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1wY20uYwpAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBQQ00gU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKworI2RlZmluZSBCWVRfUENNX0NPVU5UCQkyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzc3RfYnl0X3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1JFU1VNRSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSwKKwkucGVyaW9kX2J5dGVzX21pbgk9IDM4NCwKKwkucGVyaW9kX2J5dGVzX21heAk9IDQ4MDAwLAorCS5wZXJpb2RzX21pbgkJPSAyLAorCS5wZXJpb2RzX21heAkJPSAyNTAsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSA5NjAwMCwKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgZWFjaCBQQ00gRFNQIHN0cmVhbSAqLworc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgeworCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBtdXRleCBtdXRleDsKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlciAqLworc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhIHsKKwkvKiBydW50aW1lIERTUCAqLworCXN0cnVjdCBzc3RfYnl0ICpieXQ7CisKKwkvKiBEQUkgZGF0YSAqLworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhIHBjbVtCWVRfUENNX0NPVU5UXTsKK307CisKKy8qIHRoaXMgbWF5IGdldCBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBieSBvc3MgZW11bGF0aW9uICovCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisJdTMyIHJhdGUsIGJpdHM7CisJdTggY2hhbm5lbHM7CisJaW50IHJldCwgcGxheWJhY2sgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBod19wYXJhbXMsIHBjbV9kYXRhICVwXG4iLCBwY21fZGF0YSk7CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV90eXBlKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCQkgIDEsIDEsICFwbGF5YmFjayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImZhaWxlZCB0byBzZXQgc3RyZWFtIGZvcm1hdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShieXQsIHBjbV9kYXRhLT5zdHJlYW0sIHJhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjb3VsZCBub3Qgc2V0IHJhdGUgJWRcbiIsIHJhdGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWJpdHMgPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX3NldF9iaXRzKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgYml0cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNvdWxkIG5vdCBzZXQgZm9ybWF0cyAlZFxuIiwKKwkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYW5uZWxzID0gKHU4KShwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSAmIDB4Rik7CisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgY2hhbm5lbHMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjb3VsZCBub3Qgc2V0IGNoYW5uZWxzICVkXG4iLAorCQkJcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKKworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihieXQsIHBjbV9kYXRhLT5zdHJlYW0sCisJCQkJICAgIHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hZGRyLAorCQkJCSAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJQQ006IGZhaWxlZCB0byBzZXQgRE1BIGJ1ZmZlciAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9jb21taXQoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBmYWlsZWQgc3RyZWFtIGNvbW1pdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IGh3X2ZyZWVcbiIpOworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiB0cmlnZ2VyICVkXG4iLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlzc3RfYnl0X3N0cmVhbV9zdGFydChieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXNzdF9ieXRfc3RyZWFtX3Jlc3VtZShieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNzdF9ieXRfc3RyZWFtX3N0b3AoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc3N0X2J5dF9zdHJlYW1fcGF1c2UoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYnl0X25vdGlmeV9wb2ludGVyKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IGRhdGE7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY21fZGF0YS0+c3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXUzMiBwb3M7CisKKwlwb3MgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwKKwkJCSAgICAgIChydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciAlCisJCQkgICAgICAgcnVudGltZS0+YnVmZmVyX3NpemUpKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IEFwcCBwb2ludGVyICVkIGJ5dGVzXG4iLCBwb3MpOworCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfYnl0X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0OworCWludCBwb3M7CisKKwlwb3MgPSBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oYnl0LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJCSAgICAgICBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSk7CisJb2Zmc2V0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHBvcyk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBETUEgcG9pbnRlciAlenUgYnl0ZXNcbiIsCisJCWZyYW1lc190b19ieXRlcyhydW50aW1lLCAodTMyKW9mZnNldCkpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEocnRkKTsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmJ5dDsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IG9wZW5cbiIpOworCisJcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtydGQtPmNwdV9kYWktPmlkXTsKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCisJc25kX3NvY19wY21fc2V0X2RydmRhdGEocnRkLCBwY21fZGF0YSk7CisJcGNtX2RhdGEtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmc3N0X2J5dF9wY21faGFyZHdhcmUpOworCisJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9ieXRfc3RyZWFtX25ldyhieXQsIHJ0ZC0+Y3B1X2RhaS0+aWQgKyAxLAorCQkJCQkgICAgICBieXRfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKKwlpZiAocGNtX2RhdGEtPnN0cmVhbSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShydGQpOworCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+Ynl0OworCWludCByZXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBjbG9zZVxuIik7CisKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2ZyZWUoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiRnJlZSBzdHJlYW0gZmFpbFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlwY21fZGF0YS0+c3RyZWFtID0gTlVMTDsKKworb3V0OgorCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogbW1hcFxuIik7CisJcmV0dXJuIHNuZF9wY21fbGliX2RlZmF1bHRfbW1hcChzdWJzdHJlYW0sIHZtYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X2J5dF9wY21fb3BzID0geworCS5vcGVuCQk9IHNzdF9ieXRfcGNtX29wZW4sCisJLmNsb3NlCQk9IHNzdF9ieXRfcGNtX2Nsb3NlLAorCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zCT0gc3N0X2J5dF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gc3N0X2J5dF9wY21faHdfZnJlZSwKKwkudHJpZ2dlcgk9IHNzdF9ieXRfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBzc3RfYnl0X3BjbV9wb2ludGVyLAorCS5tbWFwCQk9IHNzdF9ieXRfcGNtX21tYXAsCit9OworCitzdGF0aWMgdm9pZCBzc3RfYnl0X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCXNpemVfdCBzaXplOworCWludCByZXQgPSAwOworCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChydGQtPmNhcmQtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtIHx8CisJICAgIHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgeworCQlzaXplID0gc3N0X2J5dF9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKwkJcmV0ID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQkJCQkJICAgIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJCQkgICAgcnRkLT5jYXJkLT5kZXYsCisJCQkJCQkJICAgIHNpemUsIHNpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGJ5dF9kYWlzW10gPSB7CisJeworCQkubmFtZSAgPSAiRnJvbnQtY3B1LWRhaSIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTeXN0ZW0gUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiTWljMS1jcHUtZGFpIiwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQW5hbG9nIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IHNzdF9wZGF0YSAqcGxhdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnByaXZfZGF0YTsKKwlpbnQgaTsKKworCWlmICghcGxhdF9kYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhwbGF0Zm9ybS0+ZGV2LCBzaXplb2YoKnByaXZfZGF0YSksCisJCQkJIEdGUF9LRVJORUwpOworCXByaXZfZGF0YS0+Ynl0ID0gcGxhdF9kYXRhLT5kc3A7CisJc25kX3NvY19wbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwbGF0Zm9ybSwgcHJpdl9kYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ5dF9kYWlzKTsgaSsrKQorCQltdXRleF9pbml0KCZwcml2X2RhdGEtPnBjbVtpXS5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGJ5dF9zb2NfcGxhdGZvcm0gPSB7CisJLnByb2JlCQk9IHNzdF9ieXRfcGNtX3Byb2JlLAorCS5yZW1vdmUJCT0gc3N0X2J5dF9wY21fcmVtb3ZlLAorCS5vcHMJCT0gJnNzdF9ieXRfcGNtX29wcywKKwkucGNtX25ldwk9IHNzdF9ieXRfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBzc3RfYnl0X3BjbV9mcmVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgYnl0X2RhaV9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gImJ5dC1kYWkiLAorfTsKKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfYnl0X2RzcF9pbml0KCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmYnl0X3NvY19wbGF0Zm9ybSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BsYXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmYnl0X2RhaV9jb21wb25lbnQsCisJCQkJCSBieXRfZGFpcywgQVJSQVlfU0laRShieXRfZGFpcykpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9jb21wOworCisJcmV0dXJuIDA7CisKK2Vycl9jb21wOgorCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKK2Vycl9wbGF0OgorCXNzdF9ieXRfZHNwX2ZyZWUoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CisJc3N0X2J5dF9kc3BfZnJlZSgmcGRldi0+ZGV2LCBzc3RfcGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9ieXRfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCisJLnByb2JlID0gc3N0X2J5dF9wY21fZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBzc3RfYnl0X3BjbV9kZXZfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X2J5dF9wY21fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFya2tvIE5pa3VsYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXl0cmFpbCBQQ00iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmF5dHJhaWwtcGNtLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZTgxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC1wcml2LmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBJbnRlbCBTbWFydCBTb3VuZCBUZWNobm9sb2d5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19TT1VORF9TT0NfU1NUX0RTUF9QUklWX0gKKyNkZWZpbmUgX19TT1VORF9TT0NfU1NUX0RTUF9QUklWX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworc3RydWN0IHNzdF9tZW1fYmxvY2s7CitzdHJ1Y3Qgc3N0X21vZHVsZTsKK3N0cnVjdCBzc3RfZnc7CisKKy8qCisgKiBEU1AgT3BlcmF0aW9ucyBleHBvcnRlZCBieSBwbGF0Zm9ybSBBdWRpbyBEU1AgZHJpdmVyLgorICovCitzdHJ1Y3Qgc3N0X29wcyB7CisJLyogRFNQIGNvcmUgYm9vdCAvIHJlc2V0ICovCisJdm9pZCAoKmJvb3QpKHN0cnVjdCBzc3RfZHNwICopOworCXZvaWQgKCpyZXNldCkoc3RydWN0IHNzdF9kc3AgKik7CisKKwkvKiBTaGltIElPICovCisJdm9pZCAoKndyaXRlKSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7CisJdTMyICgqcmVhZCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKKwl2b2lkICgqd3JpdGU2NCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOworCXU2NCAoKnJlYWQ2NCkodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKKworCS8qIERTUCBJL0RSQU0gSU8gKi8KKwl2b2lkICgqcmFtX3JlYWQpKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgICpkZXN0LCB2b2lkIF9faW9tZW0gKnNyYywKKwkJc2l6ZV90IGJ5dGVzKTsKKwl2b2lkICgqcmFtX3dyaXRlKShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywKKwkJc2l6ZV90IGJ5dGVzKTsKKworCXZvaWQgKCpkdW1wKShzdHJ1Y3Qgc3N0X2RzcCAqKTsKKworCS8qIElSUSBoYW5kbGVycyAqLworCWlycXJldHVybl90ICgqaXJxX2hhbmRsZXIpKGludCBpcnEsIHZvaWQgKmNvbnRleHQpOworCisJLyogU1NUIGluaXQgYW5kIGZyZWUgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSk7CisJdm9pZCAoKmZyZWUpKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisJLyogRlcgbW9kdWxlIHBhcnNlci9sb2FkZXIgKi8KKwlpbnQgKCpwYXJzZV9mdykoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KTsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgbWVtb3J5IG9mZnNldHMgYW5kIGFkZHJlc3Nlcy4KKyAqLworc3RydWN0IHNzdF9hZGRyIHsKKwl1MzIgbHBlX2Jhc2U7CisJdTMyIHNoaW1fb2Zmc2V0OworCXUzMiBpcmFtX29mZnNldDsKKwl1MzIgZHJhbV9vZmZzZXQ7CisJdm9pZCBfX2lvbWVtICpscGU7CisJdm9pZCBfX2lvbWVtICpzaGltOworCXZvaWQgX19pb21lbSAqcGNpX2NmZzsKKwl2b2lkIF9faW9tZW0gKmZ3X2V4dDsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgTWFpbGJveCBjb25maWd1cmF0aW9uLgorICovCitzdHJ1Y3Qgc3N0X21haWxib3ggeworCXZvaWQgX19pb21lbSAqaW5fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm91dF9iYXNlOworCXNpemVfdCBpbl9zaXplOworCXNpemVfdCBvdXRfc2l6ZTsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgRmlybXdhcmUgZGF0YSB0eXBlcy4KKyAqLworZW51bSBzc3RfZGF0YV90eXBlIHsKKwlTU1RfREFUQV9NCT0gMCwgLyogbW9kdWxlIGJsb2NrIGRhdGEgKi8KKwlTU1RfREFUQV9QCT0gMSwgLyogcGVyaXN0YW50IGRhdGEgKHRleHQsIGRhdGEpICovCisJU1NUX0RBVEFfUwk9IDIsIC8qIHNjcmF0Y2ggZGF0YSAodXN1YWxseSBidWZmZXJzKSAqLworfTsKKworLyoKKyAqIEF1ZGlvIERTUCBtZW1vcnkgYmxvY2sgdHlwZXMuCisgKi8KK2VudW0gc3N0X21lbV90eXBlIHsKKwlTU1RfTUVNX0lSQU0gPSAwLAorCVNTVF9NRU1fRFJBTSA9IDEsCisJU1NUX01FTV9BTlkgID0gMiwKKwlTU1RfTUVNX0NBQ0hFPSAzLAorfTsKKworLyoKKyAqIEF1ZGlvIERTUCBHZW5lcmljIEZpcm13YXJlIEZpbGUuCisgKgorICogU1NUIEZpcm13YXJlIGZpbGVzIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gVGhpcyBnZW5lcmljIHN0cnVjdHVyZSBpcworICogdXNlZCB0byBtYW5hZ2UgZWFjaCBmaXJtd2FyZSBmaWxlIGFuZCBpdCdzIG1vZHVsZXMgcmVnYXJkbGVzcyBvZiBTU1QgZmlybXdhcmUKKyAqIHR5cGUuIEEgU1NUIGRyaXZlciBtYXkgbG9hZCBtdWx0aXBsZSBGVyBmaWxlcy4KKyAqLworc3RydWN0IHNzdF9mdyB7CisJc3RydWN0IHNzdF9kc3AgKmRzcDsKKworCS8qIGJhc2UgYWRkcmVzc2VzIG9mIEZXIGZpbGUgZGF0YSAqLworCWRtYV9hZGRyX3QgZG1hYmxlX2Z3X3BhZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGZ3IGRhdGEgKi8KKwl2b2lkICpkbWFfYnVmOwkJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBmdyBkYXRhICovCisJdTMyIHNpemU7CQkJLyogc2l6ZSBvZiBmdyBkYXRhICovCisKKwkvKiBsaXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIERTUCBsaXN0IG9mIEZXICovCisJc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsJLyogRlcgbGlzdCBvZiBtb2R1bGVzICovCisKKwl2b2lkICpwcml2YXRlOwkJCS8qIGNvcmUgZG9lc24ndCB0b3VjaCB0aGlzICovCit9OworCisvKgorICogQXVkaW8gRFNQIEdlbmVyaWMgTW9kdWxlIGRhdGEuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGRzZWNyaWJlIGFueSBzZWN0aW9ucyBvZiBwZXJzaXN0ZW50ICh0ZXh0IGFuZCBkYXRhKSBhbmQKKyAqIHNjcmF0Y2ggKGJ1ZmZlcnMpIG9mIG1vZHVsZSBkYXRhIGluIEFEU1AgbWVtb3J5IHNwYWNlLgorICovCitzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhIHsKKworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7CQkvKiBkZXN0aW5hdGlvbiBtZW1vcnkgdHlwZSAqLworCWVudW0gc3N0X2RhdGFfdHlwZSBkYXRhX3R5cGU7CS8qIHR5cGUgb2YgbW9kdWxlIGRhdGEgKi8KKworCXUzMiBzaXplOwkJLyogc2l6ZSBpbiBieXRlcyAqLworCXUzMiBvZmZzZXQ7CQkvKiBvZmZzZXQgaW4gRlcgZmlsZSAqLworCXUzMiBkYXRhX29mZnNldDsJLyogb2Zmc2V0IGluIEFEU1AgbWVtb3J5IHNwYWNlICovCisJdm9pZCAqZGF0YTsJCS8qIG1vZHVsZSBkYXRhICovCit9OworCisvKgorICogQXVkaW8gRFNQIEdlbmVyaWMgTW9kdWxlIFRlbXBsYXRlLgorICoKKyAqIFVzZWQgdG8gZGVmaW5lIGFuZCByZWdpc3RlciBhIG5ldyBGVyBtb2R1bGUuIFRoaXMgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbQorICogRlcgbW9kdWxlIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgeworCXUzMiBpZDsKKwl1MzIgZW50cnk7CQkJLyogZW50cnkgcG9pbnQgKi8KKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhIHM7CS8qIHNjcmF0Y2ggZGF0YSAqLworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgcDsJLyogcGVyaXN0YW50IGRhdGEgKi8KK307CisKKy8qCisgKiBBdWRpbyBEU1AgR2VuZXJpYyBNb2R1bGUuCisgKgorICogRWFjaCBGaXJtd2FyZSBmaWxlIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gQSBtb2R1bGUgY2FuIHNwYW4gbXVsdGlwbGUKKyAqIEFEU1AgbWVtb3J5IGJsb2Nrcy4gVGhlIHNpbXBsZXN0IEZXIHdpbGwgYmUgYSBmaWxlIHdpdGggMSBtb2R1bGUuCisgKi8KK3N0cnVjdCBzc3RfbW9kdWxlIHsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCXN0cnVjdCBzc3RfZncgKnNzdF9mdzsJCS8qIHBhcmVudCBGVyB3ZSBiZWxvbmcgdG9vICovCisKKwkvKiBtb2R1bGUgY29uZmlndXJhdGlvbiAqLworCXUzMiBpZDsKKwl1MzIgZW50cnk7CQkJLyogbW9kdWxlIGVudHJ5IHBvaW50ICovCisJdTMyIG9mZnNldDsJCQkvKiBtb2R1bGUgb2Zmc2V0IGluIGZpcm13YXJlIGZpbGUgKi8KKwl1MzIgc2l6ZTsJCQkvKiBtb2R1bGUgc2l6ZSAqLworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgczsJLyogc2NyYXRjaCBkYXRhICovCisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSBwOwkvKiBwZXJpc3RhbnQgZGF0YSAqLworCisJLyogcnVudGltZSAqLworCXUzMiB1c2FnZV9jb3VudDsJCS8qIGNhbiBiZSB1bmxvYWRlZCBpZiBjb3VudCA9PSAwICovCisJdm9pZCAqcHJpdmF0ZTsJCQkvKiBjb3JlIGRvZXNuJ3QgdG91Y2ggdGhpcyAqLworCisJLyogbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJsb2NrX2xpc3Q7CS8qIE1vZHVsZSBsaXN0IG9mIGJsb2NrcyBpbiB1c2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBEU1AgbGlzdCBvZiBtb2R1bGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2Z3OwkvKiBGVyBsaXN0IG9mIG1vZHVsZXMgKi8KK307CisKKy8qCisgKiBTU1QgTWVtb3J5IEJsb2NrIG9wZXJhdGlvbnMuCisgKi8KK3N0cnVjdCBzc3RfYmxvY2tfb3BzIHsKKwlpbnQgKCplbmFibGUpKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jayk7CisJaW50ICgqZGlzYWJsZSkoc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrKTsKK307CisKKy8qCisgKiBTU1QgR2VuZXJpYyBNZW1vcnkgQmxvY2suCisgKgorICogU1NUIEFEUCAgbWVtb3J5IGhhcyBtdWx0aXBsZSBJUkFNIGFuZCBEUkFNIGJsb2Nrcy4gU29tZSBBRFNQIGJsb2NrcyBjYW4gYmUKKyAqIHBvd2VyIGdhdGVkLgorICovCitzdHJ1Y3Qgc3N0X21lbV9ibG9jayB7CisJc3RydWN0IHNzdF9kc3AgKmRzcDsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOwkvKiBtb2R1bGUgdGhhdCB1c2VzIHRoaXMgYmxvY2sgKi8KKworCS8qIGJsb2NrIGNvbmZpZyAqLworCXUzMiBvZmZzZXQ7CQkJLyogb2Zmc2V0IGZyb20gYmFzZSAqLworCXUzMiBzaXplOwkJCS8qIGJsb2NrIHNpemUgKi8KKwl1MzIgaW5kZXg7CQkJLyogYmxvY2sgaW5kZXggMC4uTiAqLworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7CQkvKiBibG9jayBtZW1vcnkgdHlwZSBJUkFNL0RSQU0gKi8KKwlzdHJ1Y3Qgc3N0X2Jsb2NrX29wcyAqb3BzOwkvKiBibG9jayBvcGVyYXRpb25zLCBpZiBhbnkgKi8KKworCS8qIGJsb2NrIHN0YXR1cyAqLworCWVudW0gc3N0X2RhdGFfdHlwZSBkYXRhX3R5cGU7CS8qIGRhdGEgdHlwZSBoZWxkIGluIHRoaXMgYmxvY2sgKi8KKwl1MzIgYnl0ZXNfdXNlZDsJCQkvKiBieXRlcyBpbiB1c2UgYnkgbW9kdWxlcyAqLworCXZvaWQgKnByaXZhdGU7CQkJLyogZ2VuZXJpYyBjb3JlIGRvZXMgbm90IHRvdWNoIHRoaXMgKi8KKwlpbnQgdXNlcnM7CQkJLyogbnVtYmVyIG9mIG1vZHVsZXMgdXNpbmcgdGhpcyBibG9jayAqLworCisJLyogYmxvY2sgbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZV9saXN0OwkvKiBNb2R1bGUgbGlzdCBvZiBibG9ja3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBNYXAgbGlzdCBvZiBmcmVlL3VzZWQgYmxvY2tzICovCit9OworCisvKgorICogR2VuZXJpYyBTU1QgU2hpbSBJbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBzc3RfZHNwIHsKKworCS8qIHJ1bnRpbWUgKi8KKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXY7CisJc3BpbmxvY2tfdCBzcGlubG9jazsJLyogSVBDIGxvY2tpbmcgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIERTUCBGVyBsb2NrICovCisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgKnRocmVhZF9jb250ZXh0OworCWludCBpcnE7CisJdTMyIGlkOworCisJLyogbGlzdCBvZiBmcmVlIGFuZCB1c2VkIEFEU1AgbWVtb3J5IGJsb2NrcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdXNlZF9ibG9ja19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ibG9ja19saXN0OworCisJLyogb3BlcmF0aW9ucyAqLworCXN0cnVjdCBzc3Rfb3BzICpvcHM7CisKKwkvKiBkZWJ1ZyBGUyAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcm9vdDsKKworCS8qIGJhc2UgYWRkcmVzc2VzICovCisJc3RydWN0IHNzdF9hZGRyIGFkZHI7CisKKwkvKiBtYWlsYm94ICovCisJc3RydWN0IHNzdF9tYWlsYm94IG1haWxib3g7CisKKwkvKiBTU1QgRlcgZmlsZXMgbG9hZGVkIGFuZCB0aGVpciBtb2R1bGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZ3X2xpc3Q7CisKKwkvKiBwbGF0Zm9ybSBkYXRhICovCisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGE7CisKKwkvKiBETUEgRlcgbG9hZGluZyAqLworCXN0cnVjdCBzc3RfZG1hICpkbWE7CisJYm9vbCBmd191c2VfZG1hOworfTsKKworLyogU2l6ZSBvcHRpbWlzZWQgRFJBTS9JUkFNIG1lbWNweSAqLworc3RhdGljIGlubGluZSB2b2lkIHNzdF9kc3Bfd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAqc3JjLAorCXUzMiBkZXN0X29mZnNldCwgc2l6ZV90IGJ5dGVzKQoreworCXNzdC0+b3BzLT5yYW1fd3JpdGUoc3N0LCBzc3QtPmFkZHIubHBlICsgZGVzdF9vZmZzZXQsIHNyYywgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X2RzcF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKmRlc3QsCisJdTMyIHNyY19vZmZzZXQsIHNpemVfdCBieXRlcykKK3sKKwlzc3QtPm9wcy0+cmFtX3JlYWQoc3N0LCBkZXN0LCBzc3QtPmFkZHIubHBlICsgc3JjX29mZnNldCwgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJcmV0dXJuIHNzdC0+dGhyZWFkX2NvbnRleHQ7Cit9CisKKy8qIENyZWF0ZS9GcmVlIEZXIGZpbGVzIC0gY2FuIGNvbnRhaW4gbXVsdGlwbGUgbW9kdWxlcyAqLworc3RydWN0IHNzdF9mdyAqc3N0X2Z3X25ldyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpOwordm9pZCBzc3RfZndfZnJlZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOwordm9pZCBzc3RfZndfZnJlZV9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCk7CisKKy8qIENyZWF0ZS9GcmVlIGZpcm13YXJlIG1vZHVsZXMgKi8KK3N0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlX25ldyhzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncsCisJc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgKnRlbXBsYXRlLCB2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlKTsKK2ludCBzc3RfbW9kdWxlX2luc2VydChzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZSk7CitpbnQgc3N0X21vZHVsZV9yZW1vdmUoc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGUpOworaW50IHNzdF9tb2R1bGVfaW5zZXJ0X2ZpeGVkX2Jsb2NrKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IHNzdF9tb2R1bGVfZGF0YSAqZGF0YSk7CitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9nZXRfZnJvbV9pZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaWQpOworCisvKiBhbGxvY2F0ZS9mcmVlIHBlc2lzdGVudC9zY3JhdGNoIG1lbW9yeSByZWdpb25zIG1hbmFnZWQgYnkgZHJ2ICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21lbV9ibG9ja19hbGxvY19zY3JhdGNoKHN0cnVjdCBzc3RfZHNwICpkc3ApOwordm9pZCBzc3RfbWVtX2Jsb2NrX2ZyZWVfc2NyYXRjaChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCXN0cnVjdCBzc3RfbW9kdWxlICpzY3JhdGNoKTsKK2ludCBzc3RfYmxvY2tfbW9kdWxlX3JlbW92ZShzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlKTsKKworLyogUmVnaXN0ZXIgdGhlIERTUHMgbWVtb3J5IGJsb2NrcyAtIHdvdWxkIGJlIG5pY2UgdG8gcmVhZCBmcm9tIEFDUEkgKi8KK3N0cnVjdCBzc3RfbWVtX2Jsb2NrICpzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBvZmZzZXQsCisJdTMyIHNpemUsIGVudW0gc3N0X21lbV90eXBlIHR5cGUsIHN0cnVjdCBzc3RfYmxvY2tfb3BzICpvcHMsIHUzMiBpbmRleCwKKwl2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21lbV9ibG9ja191bnJlZ2lzdGVyX2FsbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5jIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzEyOWZkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIEludGVsIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kgKFNTVCkgRFNQIENvcmUgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ludGVsLXNzdC5oPgorCisvKiBJbnRlcm5hbCBnZW5lcmljIGxvdy1sZXZlbCBTU1QgSU8gZnVuY3Rpb25zIC0gY2FuIGJlIG92ZXJpZGRlbiAqLwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgYWRkciArIG9mZnNldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3Rfc2hpbTMyX3dyaXRlKTsKKwordTMyIHNzdF9zaGltMzJfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIgKyBvZmZzZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X3NoaW0zMl9yZWFkKTsKKwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlNjQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9zaGltMzJfd3JpdGU2NCk7CisKK3U2NCBzc3Rfc2hpbTMyX3JlYWQ2NCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpCit7CisJdTY0IHZhbDsKKworCW1lbWNweV9mcm9taW8oJnZhbCwgYWRkciArIG9mZnNldCwgc2l6ZW9mKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3Rfc2hpbTMyX3JlYWQ2NCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3N0X21lbWNweV90b2lvXzMyKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpkZXN0LAorCXUzMiAqc3JjLCBzaXplX3QgYnl0ZXMpCit7CisJaW50IGksIHdvcmRzID0gYnl0ZXMgPj4gMjsKKworCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKQorCQl3cml0ZWwoc3JjW2ldLCBkZXN0ICsgaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3N0X21lbWNweV9mcm9taW9fMzIodTMyICpkZXN0LAorCWNvbnN0IHZvbGF0aWxlIF9faW9tZW0gdTMyICpzcmMsIHNpemVfdCBieXRlcykKK3sKKwlpbnQgaSwgd29yZHMgPSBieXRlcyA+PiAyOworCisJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCisJCWRlc3RbaV0gPSByZWFkbChzcmMgKyBpKTsKK30KKwordm9pZCBzc3RfbWVtY3B5X3RvaW9fMzIoc3RydWN0IHNzdF9kc3AgKnNzdCwKKwl2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGJ5dGVzKQoreworCV9zc3RfbWVtY3B5X3RvaW9fMzIoZGVzdCwgc3JjLCBieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtY3B5X3RvaW9fMzIpOworCit2b2lkIHNzdF9tZW1jcHlfZnJvbWlvXzMyKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKmRlc3QsCisJdm9pZCBfX2lvbWVtICpzcmMsIHNpemVfdCBieXRlcykKK3sKKwlfc3N0X21lbWNweV9mcm9taW9fMzIoZGVzdCwgc3JjLCBieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtY3B5X2Zyb21pb18zMik7CisKKy8qIFB1YmxpYyBBUEkgKi8KK3ZvaWQgc3N0X2RzcF9zaGltX3dyaXRlKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwlzc3QtPm9wcy0+d3JpdGUoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZSk7CisKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJdmFsID0gc3N0LT5vcHMtPnJlYWQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkKTsKKwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJc3N0LT5vcHMtPndyaXRlNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZTY0KTsKKwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCXZhbCA9IHNzdC0+b3BzLT5yZWFkNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkNjQpOworCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJc3N0LT5vcHMtPndyaXRlKHNzdC0+YWRkci5zaGltLCBvZmZzZXQsIHZhbHVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZCk7CisKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBzc3QtPm9wcy0+cmVhZChzc3QtPmFkZHIuc2hpbSwgb2Zmc2V0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKTsKKwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpCit7CisJc3N0LT5vcHMtPndyaXRlNjQoc3N0LT5hZGRyLnNoaW0sIG9mZnNldCwgdmFsdWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQpOworCit1NjQgc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBzc3QtPm9wcy0+cmVhZDY0KHNzdC0+YWRkci5zaGltLCBvZmZzZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZCk7CisKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1MzIgbWFzaywgdTMyIHZhbHVlKQoreworCWJvb2wgY2hhbmdlOworCXVuc2lnbmVkIGludCBvbGQsIG5ldzsKKwl1MzIgcmV0OworCisJcmV0ID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBvZmZzZXQpOworCisJb2xkID0gcmV0OworCW5ldyA9IChvbGQgJiAofm1hc2spKSB8ICh2YWx1ZSAmIG1hc2spOworCisJY2hhbmdlID0gKG9sZCAhPSBuZXcpOworCWlmIChjaGFuZ2UpCisJCXNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzc3QsIG9mZnNldCwgbmV3KTsKKworCXJldHVybiBjaGFuZ2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQpOworCitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1NjQgbWFzaywgdTY0IHZhbHVlKQoreworCWJvb2wgY2hhbmdlOworCXU2NCBvbGQsIG5ldzsKKworCW9sZCA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQpOworCisJbmV3ID0gKG9sZCAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayk7CisKKwljaGFuZ2UgPSAob2xkICE9IG5ldyk7CisJaWYgKGNoYW5nZSkKKwkJc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG5ldyk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQpOworCitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsCisJCQkJdTMyIG1hc2ssIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgY2hhbmdlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwljaGFuZ2UgPSBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG1hc2ssIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyk7CisKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXU2NCBtYXNrLCB1NjQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGNoYW5nZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJY2hhbmdlID0gc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBvZmZzZXQsIG1hc2ssIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KTsKKwordm9pZCBzc3RfZHNwX2R1bXAoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3QtPm9wcy0+ZHVtcChzc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9kdW1wKTsKKwordm9pZCBzc3RfZHNwX3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJc3N0LT5vcHMtPnJlc2V0KHNzdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX3Jlc2V0KTsKKworaW50IHNzdF9kc3BfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCXNzdC0+b3BzLT5ib290KHNzdCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX2Jvb3QpOworCit2b2lkIHNzdF9kc3BfaXBjX21zZ190eChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgbXNnKQoreworCXNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChkc3AsIFNTVF9JUENYLCBtc2cgfCBTU1RfSVBDWF9CVVNZKTsKKwl0cmFjZV9zc3RfaXBjX21zZ190eChtc2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pcGNfbXNnX3R4KTsKKwordTMyIHNzdF9kc3BfaXBjX21zZ19yeChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKQoreworCXUzMiBtc2c7CisKKwltc2cgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChkc3AsIFNTVF9JUENYKTsKKwl0cmFjZV9zc3RfaXBjX21zZ19yeChtc2cpOworCisJcmV0dXJuIG1zZzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfaXBjX21zZ19yeCk7CisKK2ludCBzc3RfZHNwX21haWxib3hfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgaW5ib3hfb2Zmc2V0LCBzaXplX3QgaW5ib3hfc2l6ZSwKKwl1MzIgb3V0Ym94X29mZnNldCwgc2l6ZV90IG91dGJveF9zaXplKQoreworCXNzdC0+bWFpbGJveC5pbl9iYXNlID0gc3N0LT5hZGRyLmxwZSArIGluYm94X29mZnNldDsKKwlzc3QtPm1haWxib3gub3V0X2Jhc2UgPSBzc3QtPmFkZHIubHBlICsgb3V0Ym94X29mZnNldDsKKwlzc3QtPm1haWxib3guaW5fc2l6ZSA9IGluYm94X3NpemU7CisJc3N0LT5tYWlsYm94Lm91dF9zaXplID0gb3V0Ym94X3NpemU7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX21haWxib3hfaW5pdCk7CisKK3ZvaWQgc3N0X2RzcF9vdXRib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKQoreworCXUzMiBpOworCisJdHJhY2Vfc3N0X2lwY19vdXRib3hfd3JpdGUoYnl0ZXMpOworCisJbWVtY3B5X3RvaW8oc3N0LT5tYWlsYm94Lm91dF9iYXNlLCBtZXNzYWdlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19vdXRib3hfd2RhdGEoaSwgKih1MzIgKikobWVzc2FnZSArIGkpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3Bfb3V0Ym94X3dyaXRlKTsKKwordm9pZCBzc3RfZHNwX291dGJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcykKK3sKKwl1MzIgaTsKKworCXRyYWNlX3NzdF9pcGNfb3V0Ym94X3JlYWQoYnl0ZXMpOworCisJbWVtY3B5X2Zyb21pbyhtZXNzYWdlLCBzc3QtPm1haWxib3gub3V0X2Jhc2UsIGJ5dGVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSArPSA0KQorCQl0cmFjZV9zc3RfaXBjX291dGJveF9yZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9vdXRib3hfcmVhZCk7CisKK3ZvaWQgc3N0X2RzcF9pbmJveF93cml0ZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB2b2lkICptZXNzYWdlLCBzaXplX3QgYnl0ZXMpCit7CisJdTMyIGk7CisKKwl0cmFjZV9zc3RfaXBjX2luYm94X3dyaXRlKGJ5dGVzKTsKKworCW1lbWNweV90b2lvKHNzdC0+bWFpbGJveC5pbl9iYXNlLCBtZXNzYWdlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19pbmJveF93ZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pbmJveF93cml0ZSk7CisKK3ZvaWQgc3N0X2RzcF9pbmJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcykKK3sKKwl1MzIgaTsKKworCXRyYWNlX3NzdF9pcGNfaW5ib3hfcmVhZChieXRlcyk7CisKKwltZW1jcHlfZnJvbWlvKG1lc3NhZ2UsIHNzdC0+bWFpbGJveC5pbl9iYXNlLCBieXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJdHJhY2Vfc3N0X2lwY19pbmJveF9yZGF0YShpLCAqKHUzMiAqKShtZXNzYWdlICsgaSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9pbmJveF9yZWFkKTsKKworc3RydWN0IHNzdF9kc3AgKnNzdF9kc3BfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3Q7CisJaW50IGVycjsKKworCWRldl9kYmcoZGV2LCAiaW5pdGlhbGlzaW5nIGF1ZGlvIERTUCBpZCAweCV4XG4iLCBwZGF0YS0+aWQpOworCisJc3N0ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3N0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJnNzdC0+c3BpbmxvY2spOworCW11dGV4X2luaXQoJnNzdC0+bXV0ZXgpOworCXNzdC0+ZGV2ID0gZGV2OworCXNzdC0+dGhyZWFkX2NvbnRleHQgPSBzc3RfZGV2LT50aHJlYWRfY29udGV4dDsKKwlzc3QtPnNzdF9kZXYgPSBzc3RfZGV2OworCXNzdC0+aWQgPSBwZGF0YS0+aWQ7CisJc3N0LT5pcnEgPSBwZGF0YS0+aXJxOworCXNzdC0+b3BzID0gc3N0X2Rldi0+b3BzOworCXNzdC0+cGRhdGEgPSBwZGF0YTsKKwlJTklUX0xJU1RfSEVBRCgmc3N0LT51c2VkX2Jsb2NrX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzc3QtPmZyZWVfYmxvY2tfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNzdC0+bW9kdWxlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzc3QtPmZ3X2xpc3QpOworCisJLyogSW5pdGlhbGlzZSBTU1QgQXVkaW8gRFNQICovCisJaWYgKHNzdC0+b3BzLT5pbml0KSB7CisJCWVyciA9IHNzdC0+b3BzLT5pbml0KHNzdCwgcGRhdGEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIFJlZ2lzdGVyIHRoZSBJU1IgKi8KKwllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShzc3QtPmlycSwgc3N0LT5vcHMtPmlycV9oYW5kbGVyLAorCQlzc3RfZGV2LT50aHJlYWQsIElSUUZfU0hBUkVELCAiQXVkaW9EU1AiLCBzc3QpOworCWlmIChlcnIpCisJCWdvdG8gaXJxX2VycjsKKworCXJldHVybiBzc3Q7CisKK2lycV9lcnI6CisJaWYgKHNzdC0+b3BzLT5mcmVlKQorCQlzc3QtPm9wcy0+ZnJlZShzc3QpOworCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX25ldyk7CisKK3ZvaWQgc3N0X2RzcF9mcmVlKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJZnJlZV9pcnEoc3N0LT5pcnEsIHNzdCk7CisJaWYgKHNzdC0+b3BzLT5mcmVlKQorCQlzc3QtPm9wcy0+ZnJlZShzc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9mcmVlKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5oIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA1MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AuaApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIEludGVsIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kgKFNTVCkgQ29yZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fU09VTkRfU09DX1NTVF9EU1BfSAorI2RlZmluZSBfX1NPVU5EX1NPQ19TU1RfRFNQX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qIFNTVCBEZXZpY2UgSURzICAqLworI2RlZmluZSBTU1RfREVWX0lEX0xZTlhfUE9JTlQJCTB4MzNDOAorI2RlZmluZSBTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQJMHgzNDM4CisjZGVmaW5lIFNTVF9ERVZfSURfQllUCQkJMHgwRjI4CisKKy8qIFN1cHBvcnRlZCBTU1QgRE1BIERldmljZXMgKi8KKyNkZWZpbmUgU1NUX0RNQV9UWVBFX0RXCQkxCisjZGVmaW5lIFNTVF9ETUFfVFlQRV9NSUQJMgorCisvKiBTU1QgU2hpbSByZWdpc3RlciBtYXAKKyAqIFRoZSByZWdpc3RlciBuYW1pbmcgY2FuIGRpZmZlciBiZXR3ZWVuIHByb2R1Y3RzLiBTb21lIHByb2R1Y3RzIGFsc28KKyAqIGNvbnRhaW4gZXh0cmEgZnVuY3Rpb25hbGl0eS4KKyAqLworI2RlZmluZSBTU1RfQ1NSCQkJMHgwMAorI2RlZmluZSBTU1RfUElTUgkJMHgwOAorI2RlZmluZSBTU1RfUElNUgkJMHgxMAorI2RlZmluZSBTU1RfSVNSWAkJMHgxOAorI2RlZmluZSBTU1RfSVNSRAkJMHgyMAorI2RlZmluZSBTU1RfSU1SWAkJMHgyOAorI2RlZmluZSBTU1RfSU1SRAkJMHgzMAorI2RlZmluZSBTU1RfSVBDWAkJMHgzOCAvKiBJUEMgSUEgLT4gU1NUICovCisjZGVmaW5lIFNTVF9JUENECQkweDQwIC8qIElQQyBTU1QgLT4gSUEgKi8KKyNkZWZpbmUgU1NUX0lTUlNDCQkweDQ4CisjZGVmaW5lIFNTVF9JU1JMUEVTQwkJMHg1MAorI2RlZmluZSBTU1RfSU1SU0MJCTB4NTgKKyNkZWZpbmUgU1NUX0lNUkxQRVNDCQkweDYwCisjZGVmaW5lIFNTVF9JUENTQwkJMHg2OAorI2RlZmluZSBTU1RfSVBDTFBFU0MJCTB4NzAKKyNkZWZpbmUgU1NUX0NMS0NUTAkJMHg3OAorI2RlZmluZSBTU1RfQ1NSMgkJMHg4MAorI2RlZmluZSBTU1RfTFRSQwkJMHhFMAorI2RlZmluZSBTU1RfSERNQwkJMHhFOAorI2RlZmluZSBTU1RfREJHTwkJMHhGMAorCisjZGVmaW5lIFNTVF9TSElNX1NJWkUJCTB4MTAwCisjZGVmaW5lIFNTVF9QV01DVFJMICAgICAgICAgICAgIDB4MTAwMAorCisvKiBTU1QgU2hpbSBSZWdpc3RlciBiaXRzCisgKiBUaGUgcmVnaXN0ZXIgYml0IG5hbWluZyBjYW4gZGlmZmVyIGJldHdlZW4gcHJvZHVjdHMuIFNvbWUgcHJvZHVjdHMgYWxzbworICogY29udGFpbiBleHRyYSBmdW5jdGlvbmFsaXR5LgorICovCisKKy8qIENTUiAvIENTICovCisjZGVmaW5lIFNTVF9DU1JfUlNUCQkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1JfU0JDUzAJCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0NTUl9TQkNTMQkJKDB4MSA8PCAzKQorI2RlZmluZSBTU1RfQ1NSX0RDUyh4KQkJKHggPDwgNCkKKyNkZWZpbmUgU1NUX0NTUl9EQ1NfTUFTSwkoMHg3IDw8IDQpCisjZGVmaW5lIFNTVF9DU1JfU1RBTEwJCSgweDEgPDwgMTApCisjZGVmaW5lIFNTVF9DU1JfUzBJT0NTCQkoMHgxIDw8IDIxKQorI2RlZmluZSBTU1RfQ1NSX1MxSU9DUwkJKDB4MSA8PCAyMykKKyNkZWZpbmUgU1NUX0NTUl9MUENTCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQllUX0NTUl9SU1QJCSgweDEgPDwgMCkKKyNkZWZpbmUgU1NUX0JZVF9DU1JfVkVDVE9SX1NFTAkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9CWVRfQ1NSX1NUQUxMCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0JZVF9DU1JfUFdBSVRNT0RFCSgweDEgPDwgMykKKworLyogIElTUlggLyBJU0MgKi8KKyNkZWZpbmUgU1NUX0lTUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSVNSWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogIElTUkQgLyBJU0QgKi8KKyNkZWZpbmUgU1NUX0lTUkRfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSRF9ET05FCQkoMHgxIDw8IDApCisKKy8qIElNUlggLyBJTUMgKi8KKyNkZWZpbmUgU1NUX0lNUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSU1SWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSU1SWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogIElQQ1ggLyBJUENDICovCisjZGVmaW5lCVNTVF9JUENYX0RPTkUJCSgweDEgPDwgMzApCisjZGVmaW5lCVNTVF9JUENYX0JVU1kJCSgweDEgPDwgMzEpCisjZGVmaW5lIFNTVF9CWVRfSVBDWF9ET05FCSgodTY0KTB4MSA8PCA2MikKKyNkZWZpbmUgU1NUX0JZVF9JUENYX0JVU1kJKCh1NjQpMHgxIDw8IDYzKQorCisvKiAgSVBDRCAqLworI2RlZmluZQlTU1RfSVBDRF9ET05FCQkoMHgxIDw8IDMwKQorI2RlZmluZQlTU1RfSVBDRF9CVVNZCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQllUX0lQQ0RfRE9ORQkoKHU2NCkweDEgPDwgNjIpCisjZGVmaW5lIFNTVF9CWVRfSVBDRF9CVVNZCSgodTY0KTB4MSA8PCA2MykKKworLyogQ0xLQ1RMICovCisjZGVmaW5lIFNTVF9DTEtDVExfU01PUyh4KQkoeCA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9NQVNLCQkoMyA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9EQ1BMQ0cJKDEgPDwgMTgpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTEJKDEgPDwgMTcpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTAJKDEgPDwgMTYpCisKKy8qIENTUjIgLyBDUzIgKi8KKyNkZWZpbmUgU1NUX0NTUjJfU0RGRF9TU1AwCSgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1IyX1NERkRfU1NQMQkoMSA8PCAyKQorCisvKiBMVFJDICovCisjZGVmaW5lIFNTVF9MVFJDX1ZBTCh4KQkJKHggPDwgMCkKKworLyogSERNQyAqLworI2RlZmluZSBTU1RfSERNQ19IRERBMCh4KQkoeCA8PCAwKQorI2RlZmluZSBTU1RfSERNQ19IRERBMSh4KQkoeCA8PCA3KQorCisKKy8qIFNTVCBWZW5kb3IgRGVmaW5lZCBSZWdpc3RlcnMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgU1NUX1ZEUlRDVEwwCQkweGEwCisjZGVmaW5lIFNTVF9WRFJUQ1RMMQkJMHhhNAorI2RlZmluZSBTU1RfVkRSVENUTDIJCTB4YTgKKyNkZWZpbmUgU1NUX1ZEUlRDVEwzCQkweGFDCisKKy8qIFZEUlRDVEwwICovCisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUCTE2CisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX01BU0sJKDB4ZmZmZiA8PCBTU1RfVkRSVENMMF9EU1JBTVBHRV9TSElGVCkKKyNkZWZpbmUgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfU0hJRlQJNgorI2RlZmluZSBTU1RfVkRSVENMMF9JU1JBTVBHRV9NQVNLCSgweDNmZiA8PCBTU1RfVkRSVENMMF9JU1JBTVBHRV9TSElGVCkKKworc3RydWN0IHNzdF9kc3A7CisKKy8qCisgKiBTU1QgRGV2aWNlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHBvcHVsYXRlZCBieSB0aGUgU1NUIGNvcmUgZHJpdmVyLgorICovCitzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgeworCS8qIE1hbmRhdG9yeSBmaWVsZHMgKi8KKwlzdHJ1Y3Qgc3N0X29wcyAqb3BzOworCWlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpjb250ZXh0KTsKKwl2b2lkICp0aHJlYWRfY29udGV4dDsKK307CisKKy8qCisgKiBTU1QgUGxhdGZvcm0gRGF0YS4KKyAqLworc3RydWN0IHNzdF9wZGF0YSB7CisJLyogQUNQSSBkYXRhICovCisJdTMyIGxwZV9iYXNlOworCXUzMiBscGVfc2l6ZTsKKwl1MzIgcGNpY2ZnX2Jhc2U7CisJdTMyIHBjaWNmZ19zaXplOworCXUzMiBmd19iYXNlOworCXUzMiBmd19zaXplOworCWludCBpcnE7CisKKwkvKiBGaXJtd2FyZSAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisKKwkvKiBETUEgKi8KKwl1MzIgZG1hX2Jhc2U7CisJdTMyIGRtYV9zaXplOworCWludCBkbWFfZW5naW5lOworCisJLyogRFNQICovCisJdTMyIGlkOworCXZvaWQgKmRzcDsKK307CisKKy8qIEluaXRpYWxpemF0aW9uICovCitzdHJ1Y3Qgc3N0X2RzcCAqc3N0X2RzcF9uZXcoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBzc3RfZHNwX2RldmljZSAqc3N0X2Rldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfZHNwX2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCk7CisKKy8qIFNISU0gUmVhZCAvIFdyaXRlICovCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9kc3Bfc2hpbV9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyhzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXUzMiBtYXNrLCB1MzIgdmFsdWUpOwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7CitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1NjQgbWFzaywgdTY0IHZhbHVlKTsKKworLyogU0hJTSBSZWFkIC8gV3JpdGUgVW5sb2NrZWQgZm9yIGNhbGxlcnMgYWxyZWFkeSBob2xkaW5nIHNzdCBsb2NrICovCit2b2lkIHNzdF9kc3Bfc2hpbV93cml0ZV91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAorCQkJCXUzMiBtYXNrLCB1MzIgdmFsdWUpOwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7CitpbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQkJdTY0IG1hc2ssIHU2NCB2YWx1ZSk7CisKKy8qIEludGVybmFsIGdlbmVyaWMgbG93LWxldmVsIFNTVCBJTyBmdW5jdGlvbnMgLSBjYW4gYmUgb3ZlcmlkZGVuICovCit2b2lkIHNzdF9zaGltMzJfd3JpdGUodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOwordTMyIHNzdF9zaGltMzJfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlNjQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1NjQgdmFsdWUpOwordTY0IHNzdF9zaGltMzJfcmVhZDY0KHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCk7Cit2b2lkIHNzdF9tZW1jcHlfdG9pb18zMihzdHJ1Y3Qgc3N0X2RzcCAqc3N0LAorCQkJdm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9tZW1jcHlfZnJvbWlvXzMyKHN0cnVjdCBzc3RfZHNwICpzc3QsCisJCQkgIHZvaWQgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjLCBzaXplX3QgYnl0ZXMpOworCisvKiBEU1AgcmVzZXQgJiBib290ICovCit2b2lkIHNzdF9kc3BfcmVzZXQoc3RydWN0IHNzdF9kc3AgKnNzdCk7CitpbnQgc3N0X2RzcF9ib290KHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisvKiBNc2cgSU8gKi8KK3ZvaWQgc3N0X2RzcF9pcGNfbXNnX3R4KHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBtc2cpOwordTMyIHNzdF9kc3BfaXBjX21zZ19yeChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworLyogTWFpbGJveCBtYW5hZ2VtZW50ICovCitpbnQgc3N0X2RzcF9tYWlsYm94X2luaXQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIGluYm94X29mZnNldCwKKwlzaXplX3QgaW5ib3hfc2l6ZSwgdTMyIG91dGJveF9vZmZzZXQsIHNpemVfdCBvdXRib3hfc2l6ZSk7Cit2b2lkIHNzdF9kc3BfaW5ib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9pbmJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9kc3Bfb3V0Ym94X3dyaXRlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Cit2b2lkIHNzdF9kc3Bfb3V0Ym94X3JlYWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9tYWlsYm94X2R1bXAoc3RydWN0IHNzdF9kc3AgKmRzcCwgc2l6ZV90IGJ5dGVzKTsKKworLyogRGVidWcgKi8KK3ZvaWQgc3N0X2RzcF9kdW1wKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzY4NzEwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1maXJtd2FyZS5jCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICogSW50ZWwgU1NUIEZpcm13YXJlIExvYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorCitzdGF0aWMgdm9pZCBzc3RfbWVtY3B5MzIodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHUzMiBieXRlcykKK3sKKwl1MzIgaTsKKworCS8qIGNvcHkgb25lIDMyIGJpdCB3b3JkIGF0IGEgdGltZSBhcyA2NCBiaXQgYWNjZXNzIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkgKz0gNCkKKwkJbWVtY3B5X3RvaW8oZGVzdCArIGksIHNyYyArIGksIDQpOworfQorCisvKiBjcmVhdGUgbmV3IGdlbmVyaWMgZmlybXdhcmUgb2JqZWN0ICovCitzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZndfbmV3KHN0cnVjdCBzc3RfZHNwICpkc3AsIAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3OworCWludCBlcnI7CisKKwlpZiAoIWRzcC0+b3BzLT5wYXJzZV9mdykKKwkJcmV0dXJuIE5VTEw7CisKKwlzc3RfZncgPSBremFsbG9jKHNpemVvZigqc3N0X2Z3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNzdF9mdyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNzdF9mdy0+ZHNwID0gZHNwOworCXNzdF9mdy0+cHJpdmF0ZSA9IHByaXZhdGU7CisJc3N0X2Z3LT5zaXplID0gZnctPnNpemU7CisKKwllcnIgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KGRzcC0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShzc3RfZncpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIHRvIHN0b3JlIEZXIGRhdGEgKi8KKwlzc3RfZnctPmRtYV9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwKKwkJCQkmc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIsIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNzdF9mdy0+ZG1hX2J1ZikgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IERNQSBhbGxvYyBmYWlsZWRcbiIpOworCQlrZnJlZShzc3RfZncpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjb3B5IEZXIGRhdGEgdG8gRE1BLWFibGUgbWVtb3J5ICovCisJbWVtY3B5KCh2b2lkICopc3N0X2Z3LT5kbWFfYnVmLCAodm9pZCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwkvKiBjYWxsIGNvcmUgc3BlY2lmaWMgRlcgcGFzZXIgdG8gbG9hZCBGVyBkYXRhIGludG8gRFNQICovCisJZXJyID0gZHNwLT5vcHMtPnBhcnNlX2Z3KHNzdF9mdyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBwYXJzZSBmdyBmYWlsZWQgJWRcbiIsIGVycik7CisJCWdvdG8gcGFyc2VfZXJyOworCX0KKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfZnctPmxpc3QsICZkc3AtPmZ3X2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisKKwlyZXR1cm4gc3N0X2Z3OworCitwYXJzZV9lcnI6CisJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwKKwkJCQlzc3RfZnctPmRtYV9idWYsCisJCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCWtmcmVlKHNzdF9mdyk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfbmV3KTsKKworLyogZnJlZSBzaW5nbGUgZmlybXdhcmUgb2JqZWN0ICovCit2b2lkIHNzdF9md19mcmVlKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlsaXN0X2RlbCgmc3N0X2Z3LT5saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCWtmcmVlKHNzdF9mdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfZnJlZSk7CisKKy8qIGZyZWUgYWxsIGZpcm13YXJlIG9iamVjdHMgKi8KK3ZvaWQgc3N0X2Z3X2ZyZWVfYWxsKHN0cnVjdCBzc3RfZHNwICpkc3ApCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3LCAqdDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzc3RfZncsIHQsICZkc3AtPmZ3X2xpc3QsIGxpc3QpIHsKKworCQlsaXN0X2RlbCgmc3N0X2Z3LT5saXN0KTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCQlrZnJlZShzc3RfZncpOworCX0KKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2Z3X2ZyZWVfYWxsKTsKKworLyogY3JlYXRlIGEgbmV3IFNTVCBnZW5lcmljIG1vZHVsZSBmcm9tIEZXIHRlbXBsYXRlICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9uZXcoc3RydWN0IHNzdF9mdyAqc3N0X2Z3LAorCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlICp0ZW1wbGF0ZSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGU7CisKKwlzc3RfbW9kdWxlID0ga3phbGxvYyhzaXplb2YoKnNzdF9tb2R1bGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3N0X21vZHVsZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNzdF9tb2R1bGUtPmlkID0gdGVtcGxhdGUtPmlkOworCXNzdF9tb2R1bGUtPmRzcCA9IGRzcDsKKwlzc3RfbW9kdWxlLT5zc3RfZncgPSBzc3RfZnc7CisKKwltZW1jcHkoJnNzdF9tb2R1bGUtPnMsICZ0ZW1wbGF0ZS0+cywgc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlX2RhdGEpKTsKKwltZW1jcHkoJnNzdF9tb2R1bGUtPnAsICZ0ZW1wbGF0ZS0+cCwgc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlX2RhdGEpKTsKKworCUlOSVRfTElTVF9IRUFEKCZzc3RfbW9kdWxlLT5ibG9ja19saXN0KTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfbW9kdWxlLT5saXN0LCAmZHNwLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCXJldHVybiBzc3RfbW9kdWxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9uZXcpOworCisvKiBmcmVlIGZpcm13YXJlIG1vZHVsZSBhbmQgcmVtb3ZlIGZyb20gYXZhaWxhYmxlIGxpc3QgKi8KK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfbW9kdWxlLT5kc3A7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlsaXN0X2RlbCgmc3N0X21vZHVsZS0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCWtmcmVlKHNzdF9tb2R1bGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9mcmVlKTsKKworc3RhdGljIHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpmaW5kX2Jsb2NrKHN0cnVjdCBzc3RfZHNwICpkc3AsIGludCB0eXBlLAorCXUzMiBvZmZzZXQpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisJCWlmIChibG9jay0+dHlwZSA9PSB0eXBlICYmIGJsb2NrLT5vZmZzZXQgPT0gb2Zmc2V0KQorCQkJcmV0dXJuIGJsb2NrOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMoc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhICpkYXRhLCB1MzIgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcCA9IExJU1RfSEVBRF9JTklUKHRtcCk7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jazsKKworCXdoaWxlIChzaXplID4gMCkgeworCQlibG9jayA9IGZpbmRfYmxvY2soZHNwLCBkYXRhLT50eXBlLCBvZmZzZXQpOworCQlpZiAoIWJsb2NrKSB7CisJCQlsaXN0X3NwbGljZSgmdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlsaXN0X21vdmVfdGFpbCgmYmxvY2stPmxpc3QsICZ0bXApOworCQlvZmZzZXQgKz0gYmxvY2stPnNpemU7CisJCXNpemUgLT0gYmxvY2stPnNpemU7CisJfQorCisJbGlzdF9zcGxpY2UoJnRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgZnJlZSBEU1AgYmxvY2tzIGZvciBtb2R1bGUgZGF0YSAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLworc3RhdGljIGludCBibG9ja19hbGxvYyhzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkYXRhLT5zaXplID09IDApCisJCXJldHVybiAwOworCisJLyogZmluZCBmaXJzdCBmcmVlIHdob2xlIGJsb2NrcyB0aGF0IGNhbiBob2xkIG1vZHVsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKworCQkvKiBpZ25vcmUgYmxvY2tzIHdpdGggd3JvbmcgdHlwZSAqLworCQlpZiAoYmxvY2stPnR5cGUgIT0gZGF0YS0+dHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkYXRhLT5zaXplID4gYmxvY2stPnNpemUpCisJCQljb250aW51ZTsKKworCQlkYXRhLT5vZmZzZXQgPSBibG9jay0+b2Zmc2V0OworCQlibG9jay0+ZGF0YV90eXBlID0gZGF0YS0+ZGF0YV90eXBlOworCQlibG9jay0+Ynl0ZXNfdXNlZCA9IGRhdGEtPnNpemUgJSBibG9jay0+c2l6ZTsKKwkJbGlzdF9hZGQoJmJsb2NrLT5tb2R1bGVfbGlzdCwgJm1vZHVsZS0+YmxvY2tfbGlzdCk7CisJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7CisJCWRldl9kYmcoZHNwLT5kZXYsICIgKm1vZHVsZSAlZCBhZGRlZCBibG9jayAlZDolZFxuIiwKKwkJCW1vZHVsZS0+aWQsIGJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aGVuIGZpbmQgZnJlZSBtdWx0aXBsZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBtb2R1bGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisKKwkJLyogaWdub3JlIGJsb2NrcyB3aXRoIHdyb25nIHR5cGUgKi8KKwkJaWYgKGJsb2NrLT50eXBlICE9IGRhdGEtPnR5cGUpCisJCQljb250aW51ZTsKKworCQkvKiBkbyB3ZSBzcGFuID4gMSBibG9ja3MgKi8KKwkJaWYgKGRhdGEtPnNpemUgPiBibG9jay0+c2l6ZSkgeworCQkJcmV0ID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhtb2R1bGUsIGRhdGEsCisJCQkJYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplLAorCQkJCWRhdGEtPnNpemUgLSBibG9jay0+c2l6ZSk7CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIG5vdCBlbm91Z2ggZnJlZSBibG9jayBzcGFjZSAqLworCXJldHVybiAtRU5PTUVNOworfQorCisvKiByZW1vdmUgbW9kdWxlIGZyb20gbWVtb3J5IC0gY2FsbGVycyBob2xkIGxvY2tzICovCitzdGF0aWMgdm9pZCBibG9ja19tb2R1bGVfcmVtb3ZlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKKwlpbnQgZXJyOworCisJLyogZGlzYWJsZSBlYWNoIGJsb2NrICAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkgeworCQkJZXJyID0gYmxvY2stPm9wcy0+ZGlzYWJsZShibG9jayk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlkZXZfZXJyKGRzcC0+ZGV2LAorCQkJCQkiZXJyb3I6IGNhbnQgZGlzYWJsZSBibG9jayAlZDolZFxuIiwKKwkJCQkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCk7CisJCX0KKwl9CisKKwkvKiBtYXJrIGVhY2ggYmxvY2sgYXMgZnJlZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmbW9kdWxlLT5ibG9ja19saXN0LCBtb2R1bGVfbGlzdCkgeworCQlsaXN0X2RlbCgmYmxvY2stPm1vZHVsZV9saXN0KTsKKwkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKKwl9Cit9CisKKy8qIHByZXBhcmUgdGhlIG1lbW9yeSBibG9jayB0byByZWNlaXZlIGRhdGEgZnJvbSBob3N0IC0gY2FsbGVycyBob2xkIGxvY2tzICovCitzdGF0aWMgaW50IGJsb2NrX21vZHVsZV9wcmVwYXJlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCWludCByZXQgPSAwOworCisJLyogZW5hYmxlIGVhY2ggYmxvY2sgc28gdGhhdCdzIGl0J2UgcmVhZHkgZm9yIG1vZHVsZSBQL1MgZGF0YSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZW5hYmxlKSB7CisJCQlyZXQgPSBibG9jay0+b3BzLT5lbmFibGUoYmxvY2spOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKG1vZHVsZS0+ZHNwLT5kZXYsCisJCQkJCSJlcnJvcjogY2FudCBkaXNhYmxlIGJsb2NrICVkOiVkXG4iLAorCQkJCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4KTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworCitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJm1vZHVsZS0+YmxvY2tfbGlzdCwgbW9kdWxlX2xpc3QpIHsKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkKKwkJCWJsb2NrLT5vcHMtPmRpc2FibGUoYmxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBhbGxvY2F0ZSBtZW1vcnkgYmxvY2tzIGZvciBzdGF0aWMgbW9kdWxlIGFkZHJlc3NlcyAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLworc3RhdGljIGludCBibG9ja19hbGxvY19maXhlZChzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKwl1MzIgZW5kID0gZGF0YS0+b2Zmc2V0ICsgZGF0YS0+c2l6ZSwgYmxvY2tfZW5kOworCWludCBlcnI7CisKKwkvKiBvbmx5IElSQU0vRFJBTSBibG9ja3MgYXJlIG1hbmFnZWQgKi8KKwlpZiAoZGF0YS0+dHlwZSAhPSBTU1RfTUVNX0lSQU0gJiYgZGF0YS0+dHlwZSAhPSBTU1RfTUVNX0RSQU0pCisJCXJldHVybiAwOworCisJLyogYXJlIGJsb2NrcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoaXMgbW9kdWxlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZtb2R1bGUtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJLyogZm9yY2UgY29tcGFjdGluZyBtZW0gYmxvY2tzIG9mIHRoZSBzYW1lIGRhdGFfdHlwZSAqLworCQlpZiAoYmxvY2stPmRhdGFfdHlwZSAhPSBkYXRhLT5kYXRhX3R5cGUpCisJCQljb250aW51ZTsKKworCQlibG9ja19lbmQgPSBibG9jay0+b2Zmc2V0ICsgYmxvY2stPnNpemU7CisKKwkJLyogZmluZCBibG9jayB0aGF0IGhvbGRzIHNlY3Rpb24gKi8KKwkJaWYgKGRhdGEtPm9mZnNldCA+PSBibG9jay0+b2Zmc2V0ICYmIGVuZCA8IGJsb2NrX2VuZCkKKwkJCXJldHVybiAwOworCisJCS8qIGRvZXMgYmxvY2sgc3BhbiBtb3JlIHRoYW4gMSBzZWN0aW9uICovCisJCWlmIChkYXRhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBkYXRhLT5vZmZzZXQgPCBibG9ja19lbmQpIHsKKworCQkJZXJyID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhtb2R1bGUsIGRhdGEsCisJCQkJYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplLAorCQkJCWRhdGEtPnNpemUgLSBibG9jay0+c2l6ZSArIGRhdGEtPm9mZnNldCAtIGJsb2NrLT5vZmZzZXQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCS8qIG1vZHVsZSBhbHJlYWR5IG93bnMgYmxvY2tzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIGZpbmQgZmlyc3QgZnJlZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBzZWN0aW9uIGluIGZyZWUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKwkJYmxvY2tfZW5kID0gYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplOworCisJCS8qIGZpbmQgYmxvY2sgdGhhdCBob2xkcyBzZWN0aW9uICovCisJCWlmIChkYXRhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBlbmQgPCBibG9ja19lbmQpIHsKKworCQkJLyogYWRkIGJsb2NrICovCisJCQlibG9jay0+ZGF0YV90eXBlID0gZGF0YS0+ZGF0YV90eXBlOworCQkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwkJCWxpc3RfYWRkKCZibG9jay0+bW9kdWxlX2xpc3QsICZtb2R1bGUtPmJsb2NrX2xpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBkb2VzIGJsb2NrIHNwYW4gbW9yZSB0aGFuIDEgc2VjdGlvbiAqLworCQlpZiAoZGF0YS0+b2Zmc2V0ID49IGJsb2NrLT5vZmZzZXQgJiYgZGF0YS0+b2Zmc2V0IDwgYmxvY2tfZW5kKSB7CisKKwkJCWVyciA9IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMobW9kdWxlLCBkYXRhLAorCQkJCWJsb2NrLT5vZmZzZXQgKyBibG9jay0+c2l6ZSwKKwkJCQlkYXRhLT5zaXplIC0gYmxvY2stPnNpemUpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCS8qIGFkZCBibG9jayAqLworCQkJYmxvY2stPmRhdGFfdHlwZSA9IGRhdGEtPmRhdGFfdHlwZTsKKwkJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7CisJCQlsaXN0X2FkZCgmYmxvY2stPm1vZHVsZV9saXN0LCAmbW9kdWxlLT5ibG9ja19saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogTG9hZCBmaXhlZCBtb2R1bGUgZGF0YSBpbnRvIERTUCBtZW1vcnkgYmxvY2tzICovCitpbnQgc3N0X21vZHVsZV9pbnNlcnRfZml4ZWRfYmxvY2soc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwkvKiBhbGxvYyBibG9ja3MgdGhhdCBpbmNsdWRlcyB0aGlzIHNlY3Rpb24gKi8KKwlyZXQgPSBibG9ja19hbGxvY19maXhlZChtb2R1bGUsIGRhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkiZXJyb3I6IG5vIGZyZWUgYmxvY2tzIGZvciBzZWN0aW9uIGF0IG9mZnNldCAweCV4IHNpemUgMHgleFxuIiwKKwkJCWRhdGEtPm9mZnNldCwgZGF0YS0+c2l6ZSk7CisJCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHByZXBhcmUgRFNQIGJsb2NrcyBmb3IgbW9kdWxlIGNvcHkgKi8KKwlyZXQgPSBibG9ja19tb2R1bGVfcHJlcGFyZShtb2R1bGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogZncgbW9kdWxlIHByZXBhcmUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogY29weSBwYXJ0aWFsIG1vZHVsZSBkYXRhIHRvIGJsb2NrcyAqLworCXNzdF9tZW1jcHkzMihkc3AtPmFkZHIubHBlICsgZGF0YS0+b2Zmc2V0LCBkYXRhLT5kYXRhLCBkYXRhLT5zaXplKTsKKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKKworZXJyOgorCWJsb2NrX21vZHVsZV9yZW1vdmUobW9kdWxlKTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX2luc2VydF9maXhlZF9ibG9jayk7CisKKy8qIFVubG9hZCBlbnRpcmUgbW9kdWxlIGZyb20gRFNQIG1lbW9yeSAqLworaW50IHNzdF9ibG9ja19tb2R1bGVfcmVtb3ZlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisJYmxvY2tfbW9kdWxlX3JlbW92ZShtb2R1bGUpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYmxvY2tfbW9kdWxlX3JlbW92ZSk7CisKKy8qIHJlZ2lzdGVyIGEgRFNQIG1lbW9yeSBibG9jayBmb3IgdXNlIHdpdGggRlcgYmFzZWQgbW9kdWxlcyAqLworc3RydWN0IHNzdF9tZW1fYmxvY2sgKnNzdF9tZW1fYmxvY2tfcmVnaXN0ZXIoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIG9mZnNldCwKKwl1MzIgc2l6ZSwgZW51bSBzc3RfbWVtX3R5cGUgdHlwZSwgc3RydWN0IHNzdF9ibG9ja19vcHMgKm9wcywgdTMyIGluZGV4LAorCXZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCisJYmxvY2sgPSBremFsbG9jKHNpemVvZigqYmxvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAoYmxvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9jay0+b2Zmc2V0ID0gb2Zmc2V0OworCWJsb2NrLT5zaXplID0gc2l6ZTsKKwlibG9jay0+aW5kZXggPSBpbmRleDsKKwlibG9jay0+dHlwZSA9IHR5cGU7CisJYmxvY2stPmRzcCA9IGRzcDsKKwlibG9jay0+cHJpdmF0ZSA9IHByaXZhdGU7CisJYmxvY2stPm9wcyA9IG9wczsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCisJcmV0dXJuIGJsb2NrOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21lbV9ibG9ja19yZWdpc3Rlcik7CisKKy8qIHVucmVnaXN0ZXIgYWxsIERTUCBtZW1vcnkgYmxvY2tzICovCit2b2lkIHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2ssICp0bXA7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKworCS8qIHVucmVnaXN0ZXIgdXNlZCBibG9ja3MgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZibG9jay0+bGlzdCk7CisJCWtmcmVlKGJsb2NrKTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGZyZWUgYmxvY2tzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmYmxvY2stPmxpc3QpOworCQlrZnJlZShibG9jayk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwpOworCisvKiBhbGxvY2F0ZSBzY3JhdGNoIGJ1ZmZlciBibG9ja3MgKi8KK3N0cnVjdCBzc3RfbW9kdWxlICpzc3RfbWVtX2Jsb2NrX2FsbG9jX3NjcmF0Y2goc3RydWN0IHNzdF9kc3AgKmRzcCkKK3sKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZSwgKnNjcmF0Y2g7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCXUzMiBibG9ja19zaXplOworCWludCByZXQgPSAwOworCisJc2NyYXRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzc3RfbW9kdWxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNjcmF0Y2ggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKworCS8qIGNhbGN1bGF0ZSByZXF1aXJlZCBzY3JhdGNoIHNpemUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNzdF9tb2R1bGUsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChzY3JhdGNoLT5zLnNpemUgPiBzc3RfbW9kdWxlLT5zLnNpemUpCisJCQlzY3JhdGNoLT5zLnNpemUgPSBzY3JhdGNoLT5zLnNpemU7CisJCWVsc2UKKwkJCXNjcmF0Y2gtPnMuc2l6ZSA9IHNzdF9tb2R1bGUtPnMuc2l6ZTsKKwl9CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAic2NyYXRjaCBidWZmZXIgcmVxdWlyZWQgaXMgJWQgYnl0ZXNcbiIsCisJCXNjcmF0Y2gtPnMuc2l6ZSk7CisKKwkvKiBpbml0IHNjcmF0Y2ggbW9kdWxlICovCisJc2NyYXRjaC0+ZHNwID0gZHNwOworCXNjcmF0Y2gtPnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwlzY3JhdGNoLT5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisJSU5JVF9MSVNUX0hFQUQoJnNjcmF0Y2gtPmJsb2NrX2xpc3QpOworCisJLyogY2hlY2sgZnJlZSBibG9ja3MgYmVmb3JlIGxvb2tpbmcgYXQgdXNlZCBibG9ja3MgZm9yIHNwYWNlICovCisJaWYgKCFsaXN0X2VtcHR5KCZkc3AtPmZyZWVfYmxvY2tfbGlzdCkpCisJCWJsb2NrID0gbGlzdF9maXJzdF9lbnRyeSgmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsCisJCQlzdHJ1Y3Qgc3N0X21lbV9ibG9jaywgbGlzdCk7CisJZWxzZQorCQlibG9jayA9IGxpc3RfZmlyc3RfZW50cnkoJmRzcC0+dXNlZF9ibG9ja19saXN0LAorCQkJc3RydWN0IHNzdF9tZW1fYmxvY2ssIGxpc3QpOworCWJsb2NrX3NpemUgPSBibG9jay0+c2l6ZTsKKworCS8qIGFsbG9jYXRlIGJsb2NrcyBmb3IgbW9kdWxlIHNjcmF0Y2ggYnVmZmVycyAqLworCWRldl9kYmcoZHNwLT5kZXYsICJhbGxvY2F0aW5nIHNjcmF0Y2ggYmxvY2tzXG4iKTsKKwlyZXQgPSBibG9ja19hbGxvYyhzY3JhdGNoLCAmc2NyYXRjaC0+cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBjYW4ndCBhbGxvYyBzY3JhdGNoIGJsb2Nrc1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGFzc2lnbiB0aGUgc2FtZSBvZmZzZXQgb2Ygc2NyYXRjaCB0byBlYWNoIG1vZHVsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3N0X21vZHVsZSwgJmRzcC0+bW9kdWxlX2xpc3QsIGxpc3QpCisJCXNzdF9tb2R1bGUtPnMub2Zmc2V0ID0gc2NyYXRjaC0+cy5vZmZzZXQ7CisKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiBzY3JhdGNoOworCitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZzY3JhdGNoLT5ibG9ja19saXN0LCBtb2R1bGVfbGlzdCkKKwkJbGlzdF9kZWwoJmJsb2NrLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tZW1fYmxvY2tfYWxsb2Nfc2NyYXRjaCk7CisKKy8qIGZyZWUgYWxsIHNjcmF0Y2ggYmxvY2tzICovCit2b2lkIHNzdF9tZW1fYmxvY2tfZnJlZV9zY3JhdGNoKHN0cnVjdCBzc3RfZHNwICpkc3AsCisJc3RydWN0IHNzdF9tb2R1bGUgKnNjcmF0Y2gpCit7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJnNjcmF0Y2gtPmJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KQorCQlsaXN0X2RlbCgmYmxvY2stPm1vZHVsZV9saXN0KTsKKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtX2Jsb2NrX2ZyZWVfc2NyYXRjaCk7CisKKy8qIGdldCBhIG1vZHVsZSBmcm9tIGl0J3MgdW5pcXVlIElEICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9nZXRfZnJvbV9pZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaWQpCit7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChtb2R1bGUtPmlkID09IGlkKSB7CisJCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX2dldF9mcm9tX2lkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1kc3AuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWViZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLWRzcC5jCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogSW50ZWwgSGFzd2VsbCBTU1QgRFNQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KKworI2RlZmluZSBTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFCTQKKyNkZWZpbmUgU1NUX0hTV19GV19TSUdOCQkJIiRTU1QiCisjZGVmaW5lIFNTVF9IU1dfRldfTElCX1NJR04JCSIkTElCIgorCisjZGVmaW5lIFNTVF9XUFRfU0hJTV9PRkZTRVQJMHhGQjAwMAorI2RlZmluZSBTU1RfTFBfU0hJTV9PRkZTRVQJMHhFNzAwMAorI2RlZmluZSBTU1RfV1BUX0lSQU1fT0ZGU0VUCTB4QTAwMDAKKyNkZWZpbmUgU1NUX0xQX0lSQU1fT0ZGU0VUCTB4ODAwMDAKKworI2RlZmluZSBTU1RfU0hJTV9QTV9SRUcJCTB4ODQKKworI2RlZmluZSBTU1RfSFNXX0lSQU0JMQorI2RlZmluZSBTU1RfSFNXX0RSQU0JMgorI2RlZmluZSBTU1RfSFNXX1JFR1MJMworCitzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8geworCV9fbGUzMiB0eXBlOwkJLyogSVJBTS9EUkFNICovCisJX19sZTMyIHNpemU7CQkvKiBCeXRlcyAqLworCV9fbGUzMiByYW1fb2Zmc2V0OwkvKiBPZmZzZXQgaW4gSS9EUkFNICovCisJX19sZTMyIHJzdmQ7CQkvKiBSZXNlcnZlZCBmaWVsZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGZ3X21vZHVsZV9pbmZvIHsKKwlfX2xlMzIgcGVyc2lzdGVudF9zaXplOworCV9fbGUzMiBzY3JhdGNoX3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFXTsgLyogRlcgc2lnbmF0dXJlICovCisJX19sZTMyIGZpbGVfc2l6ZTsJCS8qIHNpemUgb2YgZncgbWludXMgdGhpcyBoZWFkZXIgKi8KKwlfX2xlMzIgbW9kdWxlczsJCS8qICAjIG9mIG1vZHVsZXMgKi8KKwlfX2xlMzIgZmlsZV9mb3JtYXQ7CS8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLworCV9fbGUzMiByZXNlcnZlZFs0XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmd19tb2R1bGVfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfSFNXX0ZXX1NJR05BVFVSRV9TSVpFXTsgLyogbW9kdWxlIHNpZ25hdHVyZSAqLworCV9fbGUzMiBtb2Rfc2l6ZTsJLyogc2l6ZSBvZiBtb2R1bGUgKi8KKwlfX2xlMzIgYmxvY2tzOwkvKiAjIG9mIGJsb2NrcyAqLworCV9fbGUxNiBwYWRkaW5nOworCV9fbGUxNiB0eXBlOwkvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KKwlfX2xlMzIgZW50cnlfcG9pbnQ7CisJc3RydWN0IGZ3X21vZHVsZV9pbmZvIGluZm87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBoc3dfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KTsKKworc3RhdGljIGludCBoc3dfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAorCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGUpCit7CisJc3RydWN0IGRtYV9ibG9ja19pbmZvICpibG9jazsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kOworCXN0cnVjdCBzc3RfbW9kdWxlX2RhdGEgYmxvY2tfZGF0YTsKKwlzdHJ1Y3Qgc3N0X21vZHVsZV90ZW1wbGF0ZSB0ZW1wbGF0ZTsKKwlpbnQgY291bnQ7CisJdm9pZCBfX2lvbWVtICpyYW07CisKKwkvKiBUT0RPOiBhbGxvd2VkIG1vZHVsZSB0eXBlcyBuZWVkIHRvIGJlIGNvbmZpZ3VyYWJsZSAqLworCWlmIChtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVworCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNX1NZU1RFTQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fUkVGRVJFTkNFCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fQ0FQVFVSRQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfTFBBTCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAibmV3IG1vZHVsZSBzaWduIDB4JXMgc2l6ZSAweCV4IGJsb2NrcyAweCV4IHR5cGUgMHgleFxuIiwKKwkJbW9kdWxlLT5zaWduYXR1cmUsIG1vZHVsZS0+bW9kX3NpemUsCisJCW1vZHVsZS0+YmxvY2tzLCBtb2R1bGUtPnR5cGUpOworCWRldl9kYmcoZHNwLT5kZXYsICIgZW50cnlwb2ludCAweCV4XG4iLCBtb2R1bGUtPmVudHJ5X3BvaW50KTsKKwlkZXZfZGJnKGRzcC0+ZGV2LCAiIHBlcnNpc3RlbnQgMHgleCBzY3JhdGNoIDB4JXhcbiIsCisJCW1vZHVsZS0+aW5mby5wZXJzaXN0ZW50X3NpemUsIG1vZHVsZS0+aW5mby5zY3JhdGNoX3NpemUpOworCisJbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7CisJdGVtcGxhdGUuaWQgPSBtb2R1bGUtPnR5cGU7CisJdGVtcGxhdGUuZW50cnkgPSBtb2R1bGUtPmVudHJ5X3BvaW50OworCXRlbXBsYXRlLnAuc2l6ZSA9IG1vZHVsZS0+aW5mby5wZXJzaXN0ZW50X3NpemU7CisJdGVtcGxhdGUucC50eXBlID0gU1NUX01FTV9EUkFNOworCXRlbXBsYXRlLnAuZGF0YV90eXBlID0gU1NUX0RBVEFfUDsKKwl0ZW1wbGF0ZS5zLnNpemUgPSBtb2R1bGUtPmluZm8uc2NyYXRjaF9zaXplOworCXRlbXBsYXRlLnMudHlwZSA9IFNTVF9NRU1fRFJBTTsKKwl0ZW1wbGF0ZS5zLmRhdGFfdHlwZSA9IFNTVF9EQVRBX1M7CisKKwltb2QgPSBzc3RfbW9kdWxlX25ldyhmdywgJnRlbXBsYXRlLCBOVUxMKTsKKwlpZiAobW9kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7CisKKwkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKKwkJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkJImVycm9yOiBibG9jayAlZCBzaXplIGludmFsaWRcbiIsIGNvdW50KTsKKwkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7CisJCWNhc2UgU1NUX0hTV19JUkFNOgorCQkJcmFtID0gZHNwLT5hZGRyLmxwZTsKKwkJCWJsb2NrX2RhdGEub2Zmc2V0ID0KKwkJCQlibG9jay0+cmFtX29mZnNldCArIGRzcC0+YWRkci5pcmFtX29mZnNldDsKKwkJCWJsb2NrX2RhdGEudHlwZSA9IFNTVF9NRU1fSVJBTTsKKwkJCWJyZWFrOworCQljYXNlIFNTVF9IU1dfRFJBTToKKwkJCXJhbSA9IGRzcC0+YWRkci5scGU7CisJCQlibG9ja19kYXRhLm9mZnNldCA9IGJsb2NrLT5yYW1fb2Zmc2V0OworCQkJYmxvY2tfZGF0YS50eXBlID0gU1NUX01FTV9EUkFNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGJhZCB0eXBlIDB4JXggZm9yIGJsb2NrIDB4JXhcbiIsCisJCQkJYmxvY2stPnR5cGUsIGNvdW50KTsKKwkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlibG9ja19kYXRhLnNpemUgPSBibG9jay0+c2l6ZTsKKwkJYmxvY2tfZGF0YS5kYXRhX3R5cGUgPSBTU1RfREFUQV9NOworCQlibG9ja19kYXRhLmRhdGEgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jayk7CisJCWJsb2NrX2RhdGEuZGF0YV9vZmZzZXQgPSBibG9ja19kYXRhLmRhdGEgLSBmdy0+ZG1hX2J1ZjsKKworCQlkZXZfZGJnKGRzcC0+ZGV2LCAiY29weSBmaXJtd2FyZSBibG9jayAlZCB0eXBlIDB4JXggIgorCQkJInNpemUgMHgleCA9PT4gcmFtICVwIG9mZnNldCAweCV4XG4iLAorCQkJY291bnQsIGJsb2NrLT50eXBlLCBibG9jay0+c2l6ZSwgcmFtLAorCQkJYmxvY2stPnJhbV9vZmZzZXQpOworCisJCXNzdF9tb2R1bGVfaW5zZXJ0X2ZpeGVkX2Jsb2NrKG1vZCwgJmJsb2NrX2RhdGEpOworCisJCWJsb2NrID0gKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spICsgYmxvY2stPnNpemU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd19wYXJzZV9md19pbWFnZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpCit7CisJc3RydWN0IGZ3X2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBzc3RfbW9kdWxlICpzY3JhdGNoOworCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGU7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IHNzdF9mdy0+ZHNwOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBzc3RfZnctPnByaXZhdGU7CisJaW50IHJldCwgY291bnQ7CisKKwkvKiBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YSBwb2ludGVyICovCisJaGVhZGVyID0gKHN0cnVjdCBmd19oZWFkZXIgKilzc3RfZnctPmRtYV9idWY7CisKKwkvKiB2ZXJpZnkgRlcgKi8KKwlpZiAoKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsIFNTVF9IU1dfRldfU0lHTiwgNCkgIT0gMCkgfHwKKwkJKHNzdF9mdy0+c2l6ZSAhPSBoZWFkZXItPmZpbGVfc2l6ZSArIHNpemVvZigqaGVhZGVyKSkpIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBpbnZhbGlkIGZ3IHNpZ24vZmlsZXNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAiaGVhZGVyIHNpemU9MHgleCBtb2R1bGVzPTB4JXggZm10PTB4JXggc2l6ZT0lenVcbiIsCisJCWhlYWRlci0+ZmlsZV9zaXplLCBoZWFkZXItPm1vZHVsZXMsCisJCWhlYWRlci0+ZmlsZV9mb3JtYXQsIHNpemVvZigqaGVhZGVyKSk7CisKKwkvKiBwYXJzZSBlYWNoIG1vZHVsZSAqLworCW1vZHVsZSA9ICh2b2lkICopc3N0X2Z3LT5kbWFfYnVmICsgc2l6ZW9mKCpoZWFkZXIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGhlYWRlci0+bW9kdWxlczsgY291bnQrKykgeworCisJCS8qIG1vZHVsZSAqLworCQlyZXQgPSBoc3dfcGFyc2VfbW9kdWxlKGRzcCwgc3N0X2Z3LCBtb2R1bGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBpbnZhbGlkIG1vZHVsZSAlZFxuIiwgY291bnQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQltb2R1bGUgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKSArIG1vZHVsZS0+bW9kX3NpemU7CisJfQorCisJLyogYWxsb2NhdGUgcGVyc2lzdGVudC9zY3JhdGNoIG1lbSByZWdpb25zICovCisJc2NyYXRjaCA9IHNzdF9tZW1fYmxvY2tfYWxsb2Nfc2NyYXRjaChkc3ApOworCWlmIChzY3JhdGNoID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoaHN3LCBzY3JhdGNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycShpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwl1MzIgaXNyOworCWludCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmc3N0LT5zcGlubG9jayk7CisKKwkvKiBJbnRlcnJ1cHQgYXJyaXZlZCwgY2hlY2sgc3JjICovCisJaXNyID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVNSWCk7CisJaWYgKGlzciAmIFNTVF9JU1JYX0RPTkUpIHsKKwkJdHJhY2Vfc3N0X2lycV9kb25lKGlzciwKKwkJCXNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpKTsKKworCQkvKiBNYXNrIERvbmUgaW50ZXJydXB0IGJlZm9yZSByZXR1cm4gKi8KKwkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQlTU1RfSU1SWF9ET05FLCBTU1RfSU1SWF9ET05FKTsKKwkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKworCWlmIChpc3IgJiBTU1RfSVNSWF9CVVNZKSB7CisJCXRyYWNlX3NzdF9pcnFfYnVzeShpc3IsCisJCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JTVJYKSk7CisKKwkJLyogTWFzayBCdXN5IGludGVycnVwdCBiZWZvcmUgcmV0dXJuICovCisJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJU1NUX0lNUlhfQlVTWSwgU1NUX0lNUlhfQlVTWSk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisKKwlzcGluX3VubG9jaygmc3N0LT5zcGlubG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaHN3X2Jvb3Qoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwkvKiBzZWxlY3QgU1NQMSAxOS4yTUh6IGJhc2UgY2xvY2ssIFNTUCBjbG9jayAwLCB0dXJuIG9mZiBMb3cgUG93ZXIgQ2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1MxSU9DUyB8IFNTVF9DU1JfU0JDUzEgfCBTU1RfQ1NSX0xQQ1MsIDB4MCk7CisKKwkvKiBzdGFsbCBEU1AgY29yZSwgc2V0IGNsayB0byAxOTIvOTZNaHogKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LAorCQlTU1RfQ1NSLCBTU1RfQ1NSX1NUQUxMIHwgU1NUX0NTUl9EQ1NfTUFTSywKKwkJU1NUX0NTUl9TVEFMTCB8IFNTVF9DU1JfRENTKDQpKTsKKworCS8qIFNldCAyNE1IeiBNQ0xLLCBwcmV2ZW50IGxvY2FsIGNsb2NrIGdhdGluZywgZW5hYmxlIFNTUDAgY2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ0xLQ1RMLAorCQlTU1RfQ0xLQ1RMX01BU0sgfCBTU1RfQ0xLQ1RMX0RDUExDRyB8IFNTVF9DTEtDVExfU0NPRTAsCisJCVNTVF9DTEtDVExfTUFTSyB8IFNTVF9DTEtDVExfRENQTENHIHwgU1NUX0NMS0NUTF9TQ09FMCk7CisKKwkvKiBkaXNhYmxlIERNQSBmaW5pc2ggZnVuY3Rpb24gZm9yIFNTUDAgJiBTU1AxICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUjIsIFNTVF9DU1IyX1NERkRfU1NQMSwKKwkJU1NUX0NTUjJfU0RGRF9TU1AxKTsKKworCS8qIGVuYWJsZSBETUEgZW5naW5lIDAsMSBhbGwgY2hhbm5lbHMgdG8gYWNjZXNzIGhvc3QgbWVtb3J5ICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0hETUMsCisJCVNTVF9IRE1DX0hEREExKDB4ZmYpICB8IFNTVF9IRE1DX0hEREEwKDB4ZmYpLAorCQlTU1RfSERNQ19IRERBMSgweGZmKSB8IFNTVF9IRE1DX0hEREEwKDB4ZmYpKTsKKworCS8qIGRpc2FibGUgYWxsIGNsb2NrIGdhdGluZyAqLworCXdyaXRlbCgweDAsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCS8qIHNldCBEU1AgdG8gUlVOICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUiwgU1NUX0NTUl9TVEFMTCwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgaHN3X3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJLyogcHV0IERTUCBpbnRvIHJlc2V0IGFuZCBzdGFsbCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DU1IsCisJCVNTVF9DU1JfUlNUIHwgU1NUX0NTUl9TVEFMTCwgU1NUX0NTUl9SU1QgfCBTU1RfQ1NSX1NUQUxMKTsKKworCS8qIGtlZXAgaW4gcmVzZXQgZm9yIDEwbXMgKi8KKwltZGVsYXkoMTApOworCisJLyogdGFrZSBEU1Agb3V0IG9mIHJlc2V0IGFuZCBrZWVwIHN0YWxsZWQgZm9yIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1JTVCB8IFNTVF9DU1JfU1RBTEwsIFNTVF9DU1JfU1RBTEwpOworfQorCitzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIHsKKwl1MzIgc3RhcnQ7CisJdTMyIGVuZDsKKwlpbnQgYmxvY2tzOworCWVudW0gc3N0X21lbV90eXBlIHR5cGU7Cit9OworCisvKiBseW54IHBvaW50IEFEU1AgbWVtIHJlZ2lvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIGxwX3JlZ2lvbltdID0geworCXsweDAwMDAwLCAweDQwMDAwLCA4LCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0wIC0gOCAqIDMya0IgKi8KKwl7MHg0MDAwMCwgMHg4MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMSAtIDggKiAzMmtCICovCisJezB4ODAwMDAsIDB4RTAwMDAsIDEyLCBTU1RfTUVNX0lSQU19LCAvKiBJLVNSQU0gLSAxMiAqIDMya0IgKi8KK307CisKKy8qIHdpbGQgY2F0IHBvaW50IEFEU1AgbWVtIHJlZ2lvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIHdwdF9yZWdpb25bXSA9IHsKKwl7MHgwMDAwMCwgMHg0MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMCAtIDggKiAzMmtCICovCisJezB4NDAwMDAsIDB4ODAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTEgLSA4ICogMzJrQiAqLworCXsweDgwMDAwLCAweEEwMDAwLCA0LCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0yIC0gNCAqIDMya0IgKi8KKwl7MHhBMDAwMCwgMHhGMDAwMCwgMTAsIFNTVF9NRU1fSVJBTX0sIC8qIEktU1JBTSAtIDEwICogMzJrQiAqLworfTsKKworc3RhdGljIGludCBoc3dfYWNwaV9yZXNvdXJjZV9tYXAoc3RydWN0IHNzdF9kc3AgKnNzdCwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJLyogQURTUCBEUkFNICYgSVJBTSAqLworCXNzdC0+YWRkci5scGVfYmFzZSA9IHBkYXRhLT5scGVfYmFzZTsKKwlzc3QtPmFkZHIubHBlID0gaW9yZW1hcChwZGF0YS0+bHBlX2Jhc2UsIHBkYXRhLT5scGVfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIubHBlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEFEU1AgUENJIE1NSU8gY29uZmlnIHNwYWNlICovCisJc3N0LT5hZGRyLnBjaV9jZmcgPSBpb3JlbWFwKHBkYXRhLT5wY2ljZmdfYmFzZSwgcGRhdGEtPnBjaWNmZ19zaXplKTsKKwlpZiAoIXNzdC0+YWRkci5wY2lfY2ZnKSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNTVCBTaGltICovCisJc3N0LT5hZGRyLnNoaW0gPSBzc3QtPmFkZHIubHBlICsgc3N0LT5hZGRyLnNoaW1fb2Zmc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGhzd19ibG9ja19nZXRfYml0KHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwl1MzIgYml0ID0gMCwgc2hpZnQgPSAwOworCisJc3dpdGNoIChibG9jay0+dHlwZSkgeworCWNhc2UgU1NUX01FTV9EUkFNOgorCQlzaGlmdCA9IDE2OworCQlicmVhazsKKwljYXNlIFNTVF9NRU1fSVJBTToKKwkJc2hpZnQgPSA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwliaXQgPSAxIDw8IChibG9jay0+aW5kZXggKyBzaGlmdCk7CisKKwlyZXR1cm4gYml0OworfQorCisvKiBlbmFibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCBoc3dfYmxvY2tfZW5hYmxlKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYmxvY2stPmRzcDsKKwl1MzIgYml0LCB2YWw7CisKKwlpZiAoYmxvY2stPnVzZXJzKysgPiAwKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcoYmxvY2stPmRzcC0+ZGV2LCAiIGVuYWJsZWQgYmxvY2sgJWQ6JWQgYXQgb2Zmc2V0IDB4JXhcbiIsCisJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgsIGJsb2NrLT5vZmZzZXQpOworCisJdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCWJpdCA9IGhzd19ibG9ja19nZXRfYml0KGJsb2NrKTsKKwl3cml0ZWwodmFsICYgfmJpdCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCisJLyogd2FpdCAxOCBEU1AgY2xvY2sgdGlja3MgKi8KKwl1ZGVsYXkoMTApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRpc2FibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCBoc3dfYmxvY2tfZGlzYWJsZShzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2spCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJsb2NrLT5kc3A7CisJdTMyIGJpdCwgdmFsOworCisJaWYgKC0tYmxvY2stPnVzZXJzID4gMCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGJsb2NrLT5kc3AtPmRldiwgIiBkaXNhYmxlZCBibG9jayAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKKwkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCwgYmxvY2stPm9mZnNldCk7CisKKwl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7CisJYml0ID0gaHN3X2Jsb2NrX2dldF9iaXQoYmxvY2spOworCXdyaXRlbCh2YWwgfCBiaXQsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9ibG9ja19vcHMgc3N0X2hzd19vcHMgPSB7CisJLmVuYWJsZSA9IGhzd19ibG9ja19lbmFibGUsCisJLmRpc2FibGUgPSBoc3dfYmxvY2tfZGlzYWJsZSwKK307CisKK3N0YXRpYyBpbnQgaHN3X2VuYWJsZV9zaGltKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJaW50IHRyaWVzID0gMTA7CisJdTMyIHJlZzsKKworCS8qIGVuYWJsZSBzaGltICovCisJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfU0hJTV9QTV9SRUcpOworCXdyaXRlbChyZWcgJiB+MHgzLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9TSElNX1BNX1JFRyk7CisKKwkvKiBjaGVjayB0aGF0IEFEU1Agc2hpbSBpcyBlbmFibGVkICovCisJd2hpbGUgKHRyaWVzLS0pIHsKKwkJcmVnID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSKTsKKwkJaWYgKHJlZyAhPSAweGZmZmZmZmZmKQorCQkJcmV0dXJuIDA7CisKKwkJbXNsZWVwKDEpOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGhzd19pbml0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCWNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHJldCA9IC1FTk9ERVYsIGksIGosIHJlZ2lvbl9jb3VudDsKKwl1MzIgb2Zmc2V0LCBzaXplOworCisJZGV2ID0gc3N0LT5kZXY7CisKKwlzd2l0Y2ggKHNzdC0+aWQpIHsKKwljYXNlIFNTVF9ERVZfSURfTFlOWF9QT0lOVDoKKwkJcmVnaW9uID0gbHBfcmVnaW9uOworCQlyZWdpb25fY291bnQgPSBBUlJBWV9TSVpFKGxwX3JlZ2lvbik7CisJCXNzdC0+YWRkci5pcmFtX29mZnNldCA9IFNTVF9MUF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX0xQX1NISU1fT0ZGU0VUOworCQlicmVhazsKKwljYXNlIFNTVF9ERVZfSURfV0lMRENBVF9QT0lOVDoKKwkJcmVnaW9uID0gd3B0X3JlZ2lvbjsKKwkJcmVnaW9uX2NvdW50ID0gQVJSQVlfU0laRSh3cHRfcmVnaW9uKTsKKwkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX1dQVF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX1dQVF9TSElNX09GRlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBtZW0gcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBoc3dfYWNwaV9yZXNvdXJjZV9tYXAoc3N0LCBwZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGVuYWJsZSB0aGUgRFNQIFNISU0gKi8KKwlyZXQgPSBoc3dfZW5hYmxlX3NoaW0oc3N0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IERTUCBEMCBhbmQgcmVzZXQgU0hJTVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBFbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLCAweDMsIDB4MCk7CisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUkQsCisJCSgweDMgfCAweDEgPDwgMTYgfCAweDMgPDwgMjEpLCAweDApOworCisJLyogcmVnaXN0ZXIgRFNQIG1lbW9yeSBibG9ja3MgLSBpZGVhbGx5IHdlIHNob3VsZCBnZXQgdGhpcyBmcm9tIEFDUEkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVnaW9uX2NvdW50OyBpKyspIHsKKwkJb2Zmc2V0ID0gcmVnaW9uW2ldLnN0YXJ0OworCQlzaXplID0gKHJlZ2lvbltpXS5lbmQgLSByZWdpb25baV0uc3RhcnQpIC8gcmVnaW9uW2ldLmJsb2NrczsKKworCQkvKiByZWdpc3RlciBpbmRpdmlkdWFsIG1lbW9yeSBibG9ja3MgKi8KKwkJZm9yIChqID0gMDsgaiA8IHJlZ2lvbltpXS5ibG9ja3M7IGorKykgeworCQkJc3N0X21lbV9ibG9ja19yZWdpc3Rlcihzc3QsIG9mZnNldCwgc2l6ZSwKKwkJCQlyZWdpb25baV0udHlwZSwgJnNzdF9oc3dfb3BzLCBqLCBzc3QpOworCQkJb2Zmc2V0ICs9IHNpemU7CisJCX0KKwl9CisKKwkvKiBzZXQgZGVmYXVsdCBwb3dlciBnYXRpbmcgbWFzayAqLworCXdyaXRlbCgweDAsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoc3dfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCXNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3N0KTsKKwlpb3VubWFwKHNzdC0+YWRkci5scGUpOworCWlvdW5tYXAoc3N0LT5hZGRyLnBjaV9jZmcpOworfQorCitzdHJ1Y3Qgc3N0X29wcyBoYXN3ZWxsX29wcyA9IHsKKwkucmVzZXQgPSBoc3dfcmVzZXQsCisJLmJvb3QgPSBoc3dfYm9vdCwKKwkud3JpdGUgPSBzc3Rfc2hpbTMyX3dyaXRlLAorCS5yZWFkID0gc3N0X3NoaW0zMl9yZWFkLAorCS53cml0ZTY0ID0gc3N0X3NoaW0zMl93cml0ZTY0LAorCS5yZWFkNjQgPSBzc3Rfc2hpbTMyX3JlYWQ2NCwKKwkucmFtX3JlYWQgPSBzc3RfbWVtY3B5X2Zyb21pb18zMiwKKwkucmFtX3dyaXRlID0gc3N0X21lbWNweV90b2lvXzMyLAorCS5pcnFfaGFuZGxlciA9IGhzd19pcnEsCisJLmluaXQgPSBoc3dfaW5pdCwKKwkuZnJlZSA9IGhzd19mcmVlLAorCS5wYXJzZV9mdyA9IGhzd19wYXJzZV9md19pbWFnZSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2YmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1pcGMuYwpAQCAtMCwwICsxLDE3ODUgQEAKKy8qCisgKiAgSW50ZWwgU1NUIEhhc3dlbGwvQnJvYWR3ZWxsIElQQyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworI2luY2x1ZGUgInNzdC1oYXN3ZWxsLWlwYy5oIgorI2luY2x1ZGUgInNzdC1kc3AuaCIKKyNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKKworLyogR2xvYmFsIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19HTEJfVFlQRV9TSElGVAkyNAorI2RlZmluZSBJUENfR0xCX1RZUEVfTUFTSwkoMHgxZiA8PCBJUENfR0xCX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19HTEJfVFlQRSh4KQkJKHggPDwgSVBDX0dMQl9UWVBFX1NISUZUKQorCisvKiBHbG9iYWwgTWVzc2FnZSAtIFJlcGx5ICovCisjZGVmaW5lIElQQ19HTEJfUkVQTFlfU0hJRlQJMAorI2RlZmluZSBJUENfR0xCX1JFUExZX01BU0sJKDB4MWYgPDwgSVBDX0dMQl9SRVBMWV9TSElGVCkKKyNkZWZpbmUgSVBDX0dMQl9SRVBMWV9UWVBFKHgpCSh4IDw8IElQQ19HTEJfUkVQTFlfVFlQRV9TSElGVCkKKworLyogU3RyZWFtIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19TVFJfVFlQRV9TSElGVAkyMAorI2RlZmluZSBJUENfU1RSX1RZUEVfTUFTSwkoMHhmIDw8IElQQ19TVFJfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUUl9UWVBFKHgpCQkoeCA8PCBJUENfU1RSX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSURfU0hJRlQJMTYKKyNkZWZpbmUgSVBDX1NUUl9JRF9NQVNLCQkoMHhmIDw8IElQQ19TVFJfSURfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSUQoeCkJCSh4IDw8IElQQ19TVFJfSURfU0hJRlQpCisKKy8qIFN0cmVhbSBNZXNzYWdlIC0gUmVwbHkgKi8KKyNkZWZpbmUgSVBDX1NUUl9SRVBMWV9TSElGVAkwCisjZGVmaW5lIElQQ19TVFJfUkVQTFlfTUFTSwkoMHgxZiA8PCBJUENfU1RSX1JFUExZX1NISUZUKQorCisvKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSAtIEdlbmVyaWMgKi8KKyNkZWZpbmUgSVBDX1NUR19UWVBFX1NISUZUCTEyCisjZGVmaW5lIElQQ19TVEdfVFlQRV9NQVNLCSgweGYgPDwgSVBDX1NUR19UWVBFX1NISUZUKQorI2RlZmluZSBJUENfU1RHX1RZUEUoeCkJCSh4IDw8IElQQ19TVEdfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRF9TSElGVAkxMAorI2RlZmluZSBJUENfU1RHX0lEX01BU0sJCSgweDMgPDwgSVBDX1NUR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRCh4KQkJKHggPDwgSVBDX1NUR19JRF9TSElGVCkKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgLSBSZXBseSAqLworI2RlZmluZSBJUENfU1RHX1JFUExZX1NISUZUCTAKKyNkZWZpbmUgSVBDX1NUR19SRVBMWV9NQVNLCSgweDFmIDw8IElQQ19TVEdfUkVQTFlfU0hJRlQpCisKKy8qIERlYnVnIExvZyBNZXNzYWdlIC0gR2VuZXJpYyAqLworI2RlZmluZSBJUENfTE9HX09QX1NISUZUCTIwCisjZGVmaW5lIElQQ19MT0dfT1BfTUFTSwkJKDB4ZiA8PCBJUENfTE9HX09QX1NISUZUKQorI2RlZmluZSBJUENfTE9HX09QX1RZUEUoeCkJKHggPDwgSVBDX0xPR19PUF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRF9TSElGVAkxNgorI2RlZmluZSBJUENfTE9HX0lEX01BU0sJCSgweGYgPDwgSVBDX0xPR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRCh4KQkJKHggPDwgSVBDX0xPR19JRF9TSElGVCkKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAobXNlY3MpICovCisjZGVmaW5lIElQQ19USU1FT1VUX01TRUNTCTMwMAorI2RlZmluZSBJUENfQk9PVF9NU0VDUwkJMjAwCisjZGVmaW5lIElQQ19NU0dfV0FJVAkJMAorI2RlZmluZSBJUENfTVNHX05PV0FJVAkJMQorCisvKiBGaXJtd2FyZSBSZWFkeSBNZXNzYWdlICovCisjZGVmaW5lIElQQ19GV19SRUFEWQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgSVBDX1NUQVRVU19NQVNLCQkoMHgzIDw8IDMwKQorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorI2RlZmluZSBJUENfTUFYX1NUUkVBTVMJCTQKKworLyogTWFpbGJveCAqLworI2RlZmluZSBJUENfTUFYX01BSUxCT1hfQllURVMJMjU2CisKKy8qIEdsb2JhbCBNZXNzYWdlIC0gVHlwZXMgYW5kIFJlcGxpZXMgKi8KK2VudW0gaXBjX2dsYl90eXBlIHsKKwlJUENfR0xCX0dFVF9GV19WRVJTSU9OID0gMCwJCS8qIFJldHJpZXZlcyBmaXJtd2FyZSB2ZXJzaW9uICovCisJSVBDX0dMQl9QRVJGT1JNQU5DRV9NT05JVE9SID0gMSwJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBhY3Rpb25zICovCisJSVBDX0dMQl9BTExPQ0FURV9TVFJFQU0gPSAzLAkJLyogUmVxdWVzdCB0byBhbGxvY2F0ZSBuZXcgc3RyZWFtICovCisJSVBDX0dMQl9GUkVFX1NUUkVBTSA9IDQsCQkvKiBSZXF1ZXN0IHRvIGZyZWUgc3RyZWFtICovCisJSVBDX0dMQl9HRVRfRldfQ0FQQUJJTElUSUVTID0gNSwJLyogUmV0cmlldmVzIGZpcm13YXJlIGNhcGFiaWxpdGllcyAqLworCUlQQ19HTEJfU1RSRUFNX01FU1NBR0UgPSA2LAkJLyogTWVzc2FnZSBkaXJlY3RlZCB0byBzdHJlYW0gb3IgaXRzIHN0YWdlcyAqLworCS8qIFJlcXVlc3QgdG8gc3RvcmUgZmlybXdhcmUgY29udGV4dCBkdXJpbmcgRDAtPkQzIHRyYW5zaXRpb24gKi8KKwlJUENfR0xCX1JFUVVFU1RfRFVNUCA9IDcsCisJLyogUmVxdWVzdCB0byByZXN0b3JlIGZpcm13YXJlIGNvbnRleHQgZHVyaW5nIEQzLT5EMCB0cmFuc2l0aW9uICovCisJSVBDX0dMQl9SRVNUT1JFX0NPTlRFWFQgPSA4LAorCUlQQ19HTEJfR0VUX0RFVklDRV9GT1JNQVRTID0gOSwJCS8qIFNldCBkZXZpY2UgZm9ybWF0ICovCisJSVBDX0dMQl9TRVRfREVWSUNFX0ZPUk1BVFMgPSAxMCwJLyogR2V0IGRldmljZSBmb3JtYXQgKi8KKwlJUENfR0xCX1NIT1JUX1JFUExZID0gMTEsCisJSVBDX0dMQl9FTlRFUl9EWF9TVEFURSA9IDEyLAorCUlQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPID0gMTMsCS8qIFJlcXVlc3QgbWl4ZXIgc3RyZWFtIHBhcmFtcyAqLworCUlQQ19HTEJfREVCVUdfTE9HX01FU1NBR0UgPSAxNCwJCS8qIE1lc3NhZ2UgdG8gb3IgZnJvbSB0aGUgZGVidWcgbG9nZ2VyLiAqLworCUlQQ19HTEJfUkVRVUVTVF9UUkFOU0ZFUiA9IDE2LCAJCS8qIDwgUmVxdWVzdCBUcmFuc2ZlciBmb3IgaG9zdCAqLworCUlQQ19HTEJfTUFYX0lQQ19NRVNTQUdFX1RZUEUgPSAxNywJLyogTWF4aW11bSBtZXNzYWdlIG51bWJlciAqLworfTsKKworZW51bSBpcGNfZ2xiX3JlcGx5IHsKKwlJUENfR0xCX1JFUExZX1NVQ0NFU1MgPSAwLAkJLyogVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gKi8KKwlJUENfR0xCX1JFUExZX0VSUk9SX0lOVkFMSURfUEFSQU0gPSAxLAkvKiBJbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkLiAqLworCUlQQ19HTEJfUkVQTFlfVU5LTk9XTl9NRVNTQUdFX1RZUEUgPSAyLAkvKiBVa25vd24gbWVzc2FnZSB0eXBlIHdhcyByZXNjZWl2ZWQuICovCisJSVBDX0dMQl9SRVBMWV9PVVRfT0ZfUkVTT1VSQ0VTID0gMywJLyogTm8gcmVzb3VyY2VzIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuICovCisJSVBDX0dMQl9SRVBMWV9CVVNZID0gNCwJCQkvKiBUaGUgc3lzdGVtIG9yIHJlc291cmNlIGlzIGJ1c3kuICovCisJSVBDX0dMQl9SRVBMWV9QRU5ESU5HID0gNSwJCS8qIFRoZSBhY3Rpb24gd2FzIHNjaGVkdWxlZCBmb3IgcHJvY2Vzc2luZy4gICovCisJSVBDX0dMQl9SRVBMWV9GQUlMVVJFID0gNiwJCS8qIENyaXRpY2FsIGVycm9yIGhhcHBlbmVkLiAqLworCUlQQ19HTEJfUkVQTFlfSU5WQUxJRF9SRVFVRVNUID0gNywJLyogUmVxdWVzdCBjYW4gbm90IGJlIGNvbXBsZXRlZC4gKi8KKwlJUENfR0xCX1JFUExZX1NUQUdFX1VOSU5JVElBTElaRUQgPSA4LAkvKiBQcm9jZXNzaW5nIHN0YWdlIHdhcyB1bmluaXRpYWxpemVkLiAqLworCUlQQ19HTEJfUkVQTFlfTk9UX0ZPVU5EID0gOSwJCS8qIFJlcXVpcmVkIHJlc291cmNlIGNhbiBub3QgYmUgZm91bmQuICovCisJSVBDX0dMQl9SRVBMWV9TT1VSQ0VfTk9UX1NUQVJURUQgPSAxMCwJLyogU291cmNlIHdhcyBub3Qgc3RhcnRlZC4gKi8KK307CisKKy8qIFN0cmVhbSBNZXNzYWdlIC0gVHlwZXMgKi8KK2VudW0gaXBjX3N0cl9vcGVyYXRpb24geworCUlQQ19TVFJfUkVTRVQgPSAwLAorCUlQQ19TVFJfUEFVU0UgPSAxLAorCUlQQ19TVFJfUkVTVU1FID0gMiwKKwlJUENfU1RSX1NUQUdFX01FU1NBR0UgPSAzLAorCUlQQ19TVFJfTk9USUZJQ0FUSU9OID0gNCwKKwlJUENfU1RSX01BWF9NRVNTQUdFCit9OworCisvKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSBUeXBlcyAqLworZW51bSBpcGNfc3RnX29wZXJhdGlvbiB7CisJSVBDX1NUR19HRVRfVk9MVU1FID0gMCwKKwlJUENfU1RHX1NFVF9WT0xVTUUsCisJSVBDX1NUR19TRVRfV1JJVEVfUE9TSVRJT04sCisJSVBDX1NUR19TRVRfRlhfRU5BQkxFLAorCUlQQ19TVEdfU0VUX0ZYX0RJU0FCTEUsCisJSVBDX1NUR19TRVRfRlhfR0VUX1BBUkFNLAorCUlQQ19TVEdfU0VUX0ZYX1NFVF9QQVJBTSwKKwlJUENfU1RHX1NFVF9GWF9HRVRfSU5GTywKKwlJUENfU1RHX01VVEVfTE9PUEJBQ0ssCisJSVBDX1NUR19NQVhfTUVTU0FHRQorfTsKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgVHlwZXMgRm9yIE5vdGlmaWNhdGlvbiovCitlbnVtIGlwY19zdGdfb3BlcmF0aW9uX25vdGlmeSB7CisJSVBDX1BPU0lUSU9OX0NIQU5HRUQgPSAwLAorCUlQQ19TVEdfR0xJVENILAorCUlQQ19TVEdfTUFYX05PVElGWQorfTsKKworZW51bSBpcGNfZ2xpdGNoX3R5cGUgeworCUlQQ19HTElUQ0hfVU5ERVJSVU4gPSAxLAorCUlQQ19HTElUQ0hfREVDT0RFUl9FUlJPUiwKKwlJUENfR0xJVENIX0RPVUJMRURfV1JJVEVfUE9TLAorCUlQQ19HTElUQ0hfTUFYCit9OworCisvKiBEZWJ1ZyBDb250cm9sICovCitlbnVtIGlwY19kZWJ1Z19vcGVyYXRpb24geworCUlQQ19ERUJVR19FTkFCTEVfTE9HID0gMCwKKwlJUENfREVCVUdfRElTQUJMRV9MT0cgPSAxLAorCUlQQ19ERUJVR19SRVFVRVNUX0xPR19EVU1QID0gMiwKKwlJUENfREVCVUdfTk9USUZZX0xPR19EVU1QID0gMywKKwlJUENfREVCVUdfTUFYX0RFQlVHX0xPRworfTsKKworLyogRmlybXdhcmUgUmVhZHkgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19md19yZWFkeSB7CisJdTMyIGluYm94X29mZnNldDsKKwl1MzIgb3V0Ym94X29mZnNldDsKKwl1MzIgaW5ib3hfc2l6ZTsKKwl1MzIgb3V0Ym94X3NpemU7CisJdTMyIGZ3X2luZm9fc2l6ZTsKKwl1OCBmd19pbmZvWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwY19tZXNzYWdlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyIGhlYWRlcjsKKworCS8qIGRpcmVjdGlvbiB3cnQgaG9zdCBDUFUgKi8KKwljaGFyIHR4X2RhdGFbSVBDX01BWF9NQUlMQk9YX0JZVEVTXTsKKwlzaXplX3QgdHhfc2l6ZTsKKwljaGFyIHJ4X2RhdGFbSVBDX01BWF9NQUlMQk9YX0JZVEVTXTsKKwlzaXplX3Qgcnhfc2l6ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCWJvb2wgcGVuZGluZzsKKwlib29sIGNvbXBsZXRlOworCWJvb2wgd2FpdDsKKwlpbnQgZXJybm87Cit9OworCitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW07CitzdHJ1Y3Qgc3N0X2hzdzsKKworLyogU3RyZWFtIGluZm9tYXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X3N0cmVhbSB7CisJLyogY29uZmlndXJhdGlvbiAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fYWxsb2NfcmVxIHJlcXVlc3Q7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSByZXBseTsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxIGZyZWVfcmVxOworCisJLyogTWl4ZXIgaW5mbyAqLworCXUzMiBtdXRlX3ZvbHVtZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgbXV0ZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKworCS8qIHJ1bnRpbWUgaW5mbyAqLworCXN0cnVjdCBzc3RfaHN3ICpoc3c7CisJaW50IGhvc3RfaWQ7CisJYm9vbCBjb21taXRlZDsKKwlib29sIHJ1bm5pbmc7CisKKwkvKiBOb3RpZmljYXRpb24gd29yayAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKKwl1MzIgaGVhZGVyOworCisJLyogUG9zaXRpb24gaW5mbyBmcm9tIERTUCAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fc2V0X3Bvc2l0aW9uIHdwb3M7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nZXRfcG9zaXRpb24gcnBvczsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dsaXRjaF9wb3NpdGlvbiBnbGl0Y2g7CisKKwkvKiBWb2x1bWUgaW5mbyAqLworCXN0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxIHZvbF9yZXE7CisKKwkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKKwl2b2lkICpwZGF0YTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKKy8qIEZXIGxvZyByaW5nIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtIHsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhOworCXVuc2lnbmVkIGNoYXIgKnJpbmdfZGVzY3I7CisJaW50IHBhZ2VzOworCWludCBzaXplOworCisJLyogTm90aWZpY2F0aW9uIHdvcmsgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZGVyc193YWl0X3E7CisJc3RydWN0IG11dGV4IHJ3X211dGV4OworCisJdTMyIGxhc3RfcG9zOworCXUzMiBjdXJyX3BvczsKKwl1MzIgcmVhZGVyX3BvczsKKworCS8qIGZ3IGxvZyBjb25maWcgKi8KKwl1MzIgY29uZmlnW1NTVF9IU1dfRldfTE9HX0NPTkZJR19EV09SRFNdOworCisJc3RydWN0IHNzdF9oc3cgKmhzdzsKK307CisKKy8qIFNTVCBIYXN3ZWxsIElQQyBkYXRhICovCitzdHJ1Y3Qgc3N0X2hzdyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9wY207CisKKwkvKiBGVyBjb25maWcgKi8KKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgZndfcmVhZHk7CisJc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb24gdmVyc2lvbjsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaDsKKwlib29sIGZ3X2RvbmU7CisKKwkvKiBzdHJlYW0gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0cmVhbV9saXN0OworCisJLyogZ2xvYmFsIG1peGVyICovCisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IG1peGVyX2luZm87CisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZV90eXBlOworCXUzMiBjdXJ2ZV9kdXJhdGlvbjsKKwl1MzIgbXV0ZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgbXV0ZV92b2x1bWVbU1NUX0hTV19OT19DSEFOTkVMU107CisKKwkvKiBEWCAqLworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSBkeDsKKworCS8qIGJvb3QgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7CisJYm9vbCBib290X2NvbXBsZXRlOworCWJvb2wgc2h1dGRvd247CisKKwkvKiBJUEMgbWVzc2FnaW5nICovCisJc3RydWN0IGxpc3RfaGVhZCB0eF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgcnhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVtcHR5X2xpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF90eHE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0eF90aHJlYWQ7CisJc3RydWN0IGt0aHJlYWRfd29ya2VyIGt3b3JrZXI7CisJc3RydWN0IGt0aHJlYWRfd29yayBrd29yazsKKwlib29sIHBlbmRpbmc7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisKKwkvKiBGVyBsb2cgc3RyZWFtICovCisJc3RydWN0IHNzdF9oc3dfbG9nX3N0cmVhbSBsb2dfc3RyZWFtOworfTsKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX0dMQl9UWVBFX01BU0spID4+IElQQ19HTEJfVFlQRV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfcmVwbHkodTMyIG1zZykKK3sKKwlyZXR1cm4gKG1zZyAmIElQQ19HTEJfUkVQTFlfTUFTSykgPj4gSVBDX0dMQl9SRVBMWV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9zdHJlYW1fdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUUl9UWVBFX01BU0spID4+ICBJUENfU1RSX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfc3RhZ2VfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUR19UWVBFX01BU0spID4+ICBJUENfU1RHX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19zZXRfc3RhZ2VfdHlwZSh1MzIgbXNnLCB1MzIgdHlwZSkKK3sKKwlyZXR1cm4gKG1zZyAmIH5JUENfU1RHX1RZUEVfTUFTSykgKworCQkodHlwZSA8PCBJUENfU1RHX1RZUEVfU0hJRlQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZ2V0X3N0cmVhbV9pZCh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUUl9JRF9NQVNLKSA+PiAgSVBDX1NUUl9JRF9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9ub3RpZnlfcmVhc29uKHUzMiBtc2cpCit7CisJcmV0dXJuIChtc2cgJiBJUENfU1RHX1RZUEVfTUFTSykgPj4gSVBDX1NUR19UWVBFX1NISUZUOworfQorCit1MzIgY3JlYXRlX2NoYW5uZWxfbWFwKGVudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyBjb25maWcpCit7CisJc3dpdGNoIChjb25maWcpIHsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfTU9OTzoKKwkJcmV0dXJuICgweEZGRkZGRkYwIHwgU1NUX0hTV19DSEFOTkVMX0NFTlRFUik7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHX1NURVJFTzoKKwkJcmV0dXJuICgweEZGRkZGRjAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA0KSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzJfUE9JTlRfMToKKwkJcmV0dXJuICgweEZGRkZGMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA0KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xGRSA8PCA4ICkpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR18zX1BPSU5UXzA6CisJCXJldHVybiAoMHhGRkZGRjAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR18zX1BPSU5UXzE6CisJCXJldHVybiAoMHhGRkZGMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRkUgPDwgMTIpKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfUVVBVFJPOgorCQlyZXR1cm4gKDB4RkZGRjAwMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEVGVF9TVVJST1VORCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EIDw8IDEyKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzRfUE9JTlRfMDoKKwkJcmV0dXJuICgweEZGRkYwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0NFTlRFUl9TVVJST1VORCA8PCAxMikpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR181X1BPSU5UXzA6CisJCXJldHVybiAoMHhGRkYwMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgOCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUX1NVUlJPVU5EIDw8IDEyKQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EIDw8IDE2KSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzVfUE9JTlRfMToKKwkJcmV0dXJuICgweEZGMDAwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0NFTlRFUgorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlQgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgPDwgMTIpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFRfU1VSUk9VTkQgPDwgMTYpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEZFIDw8IDIwKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHX0RVQUxfTU9OTzoKKwkJcmV0dXJuICgweEZGRkZGRjAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUIDw8IDQpKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKmdldF9zdHJlYW1fYnlfaWQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlpbnQgc3RyZWFtX2lkKQoreworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHJlYW0sICZoc3ctPnN0cmVhbV9saXN0LCBub2RlKSB7CisJCWlmIChzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA9PSBzdHJlYW1faWQpCisJCQlyZXR1cm4gc3RyZWFtOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcGNfc2hpbV9kYmcoc3RydWN0IHNzdF9oc3cgKmhzdywgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7CisJdTMyIGlzciwgaXBjZCwgaW1yeCwgaXBjeDsKKworCWlwY3ggPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKKwlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JU1JYKTsKKwlpcGNkID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJaW1yeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOworCisJZGV2X2Vycihoc3ctPmRldiwgImlwYzogLS0lcy0tIGlwY3ggMHglOC44eCBpc3IgMHglOC44eCBpcGNkIDB4JTguOHggaW1yeCAweCU4Ljh4XG4iLAorCQl0ZXh0LCBpcGN4LCBpc3IsIGlwY2QsIGltcngpOworfQorCisvKiBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnX2dldF9lbXB0eShzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnID0gTlVMTDsKKworCWlmICghbGlzdF9lbXB0eSgmaHN3LT5lbXB0eV9saXN0KSkgeworCQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoc3ctPmVtcHR5X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwKKwkJCWxpc3QpOworCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBpcGNfdHhfbXNncyhzdHJ1Y3Qga3RocmVhZF93b3JrICp3b3JrKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNzdF9oc3csIGt3b3JrKTsKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpcGN4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGxpc3RfZW1wdHkoJmhzdy0+dHhfbGlzdCkgfHwgaHN3LT5wZW5kaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgdGhlIERTUCBpcyBidXN5IHdlIHdpbGwgVFggbWVzc2FnZXMgYWZ0ZXIgSVJRICovCisJaXBjeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKGhzdy0+ZHNwLCBTU1RfSVBDWCk7CisJaWYgKGlwY3ggJiBTU1RfSVBDWF9CVVNZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmaHN3LT50eF9saXN0LCBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOworCisJbGlzdF9tb3ZlKCZtc2ctPmxpc3QsICZoc3ctPnJ4X2xpc3QpOworCisJLyogc2VuZCB0aGUgbWVzc2FnZSAqLworCXNzdF9kc3Bfb3V0Ym94X3dyaXRlKGhzdy0+ZHNwLCBtc2ctPnR4X2RhdGEsIG1zZy0+dHhfc2l6ZSk7CisJc3N0X2RzcF9pcGNfbXNnX3R4KGhzdy0+ZHNwLCBtc2ctPmhlYWRlciB8IFNTVF9JUENYX0JVU1kpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgdm9pZCB0eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJbXNnLT5jb21wbGV0ZSA9IHRydWU7CisJdHJhY2VfaXBjX3JlcGx5KCJjb21wbGV0ZWQiLCBtc2ctPmhlYWRlcik7CisKKwlpZiAoIW1zZy0+d2FpdCkKKwkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaHN3LT5lbXB0eV9saXN0KTsKKwllbHNlCisJCXdha2VfdXAoJm1zZy0+d2FpdHEpOworfQorCitzdGF0aWMgaW50IHR4X3dhaXRfZG9uZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZywKKwl2b2lkICpyeF9kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIHdhaXQgZm9yIERTUCBjb21wbGV0aW9uIChpbiBhbGwgY2FzZXMgYXRtIGluYyBwZW5kaW5nKSAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2ctPndhaXRxLCBtc2ctPmNvbXBsZXRlLAorCQltc2Vjc190b19qaWZmaWVzKElQQ19USU1FT1VUX01TRUNTKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlwY19zaGltX2RiZyhoc3csICJtZXNzYWdlIHRpbWVvdXQiKTsKKworCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yIG1lc3NhZ2UgdGltZW91dCBmb3IiLCBtc2ctPmhlYWRlcik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKworCQkvKiBjb3B5IHRoZSBkYXRhIHJldHVybmVkIGZyb20gRFNQICovCisJCWlmIChtc2ctPnJ4X3NpemUpCisJCQltZW1jcHkocnhfZGF0YSwgbXNnLT5yeF9kYXRhLCBtc2ctPnJ4X3NpemUpOworCQlyZXQgPSBtc2ctPmVycm5vOworCX0KKworCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLCB2b2lkICp0eF9kYXRhLAorCXNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJbXNnID0gbXNnX2dldF9lbXB0eShoc3cpOworCWlmIChtc2cgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAodHhfYnl0ZXMpCisJCW1lbWNweShtc2ctPnR4X2RhdGEsIHR4X2RhdGEsIHR4X2J5dGVzKTsKKworCW1zZy0+aGVhZGVyID0gaGVhZGVyOworCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOworCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOworCW1zZy0+d2FpdCA9IHdhaXQ7CisJbXNnLT5lcnJubyA9IDA7CisJbXNnLT5wZW5kaW5nID0gZmFsc2U7CisJbXNnLT5jb21wbGV0ZSA9IGZhbHNlOworCisJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaHN3LT50eF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlX2t0aHJlYWRfd29yaygmaHN3LT5rd29ya2VyLCAmaHN3LT5rd29yayk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHR4X3dhaXRfZG9uZShoc3csIG1zZywgcnhfZGF0YSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfd2FpdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzKQoreworCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIHJ4X2RhdGEsCisJCXJ4X2J5dGVzLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfbm93YWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBoZWFkZXIsCisJdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQoreworCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIE5VTEwsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBoc3dfZndfcmVhZHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgZndfcmVhZHk7CisJdTMyIG9mZnNldDsKKworCW9mZnNldCA9IChoZWFkZXIgJiAweDFGRkZGRkZGKSA8PCAzOworCisJZGV2X2RiZyhoc3ctPmRldiwgImlwYzogRFNQIGlzIHJlYWR5IDB4JTguOHggb2Zmc2V0ICVkXG4iLAorCQloZWFkZXIsIG9mZnNldCk7CisKKwkvKiBjb3B5IGRhdGEgZnJvbSB0aGUgRFNQIEZXIHJlYWR5IG9mZnNldCAqLworCXNzdF9kc3BfcmVhZChoc3ctPmRzcCwgJmZ3X3JlYWR5LCBvZmZzZXQsIHNpemVvZihmd19yZWFkeSkpOworCisJc3N0X2RzcF9tYWlsYm94X2luaXQoaHN3LT5kc3AsIGZ3X3JlYWR5LmluYm94X29mZnNldCwKKwkJZndfcmVhZHkuaW5ib3hfc2l6ZSwgZndfcmVhZHkub3V0Ym94X29mZnNldCwKKwkJZndfcmVhZHkub3V0Ym94X3NpemUpOworCisJaHN3LT5ib290X2NvbXBsZXRlID0gdHJ1ZTsKKwl3YWtlX3VwKCZoc3ctPmJvb3Rfd2FpdCk7CisKKwlkZXZfZGJnKGhzdy0+ZGV2LCAiIG1haWxib3ggdXBzdHJlYW0gMHgleCAtIHNpemUgMHgleFxuIiwKKwkJZndfcmVhZHkuaW5ib3hfb2Zmc2V0LCBmd19yZWFkeS5pbmJveF9zaXplKTsKKwlkZXZfZGJnKGhzdy0+ZGV2LCAiIG1haWxib3ggZG93bnN0cmVhbSAweCV4IC0gc2l6ZSAweCV4XG4iLAorCQlmd19yZWFkeS5vdXRib3hfb2Zmc2V0LCBmd19yZWFkeS5vdXRib3hfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19ub3RpZmljYXRpb25fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0gPSBjb250YWluZXJfb2Yod29yaywKKwkJCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSwgbm90aWZ5X3dvcmspOworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2xpdGNoX3Bvc2l0aW9uICpnbGl0Y2ggPSAmc3RyZWFtLT5nbGl0Y2g7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nZXRfcG9zaXRpb24gKnBvcyA9ICZzdHJlYW0tPnJwb3M7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHN0cmVhbS0+aHN3OworCXUzMiByZWFzb247CisKKwlyZWFzb24gPSBtc2dfZ2V0X25vdGlmeV9yZWFzb24oc3RyZWFtLT5oZWFkZXIpOworCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIElQQ19TVEdfR0xJVENIOgorCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJEU1Agc3RyZWFtIHVuZGVyL292ZXJydW4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlzc3RfZHNwX2luYm94X3JlYWQoaHN3LT5kc3AsIGdsaXRjaCwgc2l6ZW9mKCpnbGl0Y2gpKTsKKworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZ2xpdGNoICVkIHBvcyAweCV4IHdyaXRlIHBvcyAweCV4XG4iLAorCQkJZ2xpdGNoLT5nbGl0Y2hfdHlwZSwgZ2xpdGNoLT5wcmVzZW50X3BvcywKKwkJCWdsaXRjaC0+d3JpdGVfcG9zKTsKKwkJYnJlYWs7CisKKwljYXNlIElQQ19QT1NJVElPTl9DSEFOR0VEOgorCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJEU1Agc3RyZWFtIHBvc2l0aW9uIGNoYW5nZWQgZm9yIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJc3N0X2RzcF9pbmJveF9yZWFkKGhzdy0+ZHNwLCBwb3MsIHNpemVvZihwb3MpKTsKKworCQlpZiAoc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24pCisJCQlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbihzdHJlYW0sIHN0cmVhbS0+cGRhdGEpOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogdW5rbm93biBub3RpZmljYXRpb24gMHgleFxuIiwKKwkJCXN0cmVhbS0+aGVhZGVyKTsKKwkJYnJlYWs7CisJfQorCisJLyogdGVsbCBEU1AgdGhhdCBub3RpZmljYXRpb24gaGFzIGJlZW4gaGFuZGxlZCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lQQ0QsCisJCVNTVF9JUENEX0JVU1kgfCBTU1RfSVBDRF9ET05FLCBTU1RfSVBDRF9ET05FKTsKKworCS8qIHVubWFzayBidXN5IGludGVycnVwdCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lNUlgsIFNTVF9JTVJYX0JVU1ksIDApOworfQorCitzdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICpyZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJLyogY2xlYXIgcmVwbHkgYml0cyAmIHN0YXR1cyBiaXRzICovCisJaGVhZGVyICY9IH4oSVBDX1NUQVRVU19NQVNLIHwgSVBDX0dMQl9SRVBMWV9NQVNLKTsKKworCWlmIChsaXN0X2VtcHR5KCZoc3ctPnJ4X2xpc3QpKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogcnggbGlzdCBlbXB0eSBidXQgcmVjZWl2ZWQgMHgleFxuIiwKKwkJCWhlYWRlcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkobXNnLCAmaHN3LT5yeF9saXN0LCBsaXN0KSB7CisJCWlmIChtc2ctPmhlYWRlciA9PSBoZWFkZXIpCisJCQlyZXR1cm4gbXNnOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoc3dfc3RyZWFtX3VwZGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKKwl1MzIgaGVhZGVyID0gbXNnLT5oZWFkZXIgJiB+KElQQ19TVEFUVVNfTUFTSyB8IElQQ19HTEJfUkVQTFlfTUFTSyk7CisJdTMyIHN0cmVhbV9pZCA9IG1zZ19nZXRfc3RyZWFtX2lkKGhlYWRlcik7CisJdTMyIHN0cmVhbV9tc2cgPSBtc2dfZ2V0X3N0cmVhbV90eXBlKGhlYWRlcik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2J5X2lkKGhzdywgc3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc3RyZWFtX21zZykgeworCWNhc2UgSVBDX1NUUl9TVEFHRV9NRVNTQUdFOgorCWNhc2UgSVBDX1NUUl9OT1RJRklDQVRJT046CisJY2FzZSBJUENfU1RSX1JFU0VUOgorCQlicmVhazsKKwljYXNlIElQQ19TVFJfUEFVU0U6CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJzdHJlYW0gcGF1c2VkIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfU1RSX1JFU1VNRToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJdHJhY2VfaXBjX25vdGlmaWNhdGlvbigic3RyZWFtIHJ1bm5pbmciLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHN3X3Byb2Nlc3NfcmVwbHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1MzIgcmVwbHkgPSBtc2dfZ2V0X2dsb2JhbF9yZXBseShoZWFkZXIpOworCisJdHJhY2VfaXBjX3JlcGx5KCJwcm9jZXNzaW5nIC0tPiIsIGhlYWRlcik7CisKKwltc2cgPSByZXBseV9maW5kX21zZyhoc3csIGhlYWRlcik7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IGNhbid0IGZpbmQgbWVzc2FnZSBoZWFkZXIiLCBoZWFkZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBmaXJzdCBwcm9jZXNzIHRoZSBoZWFkZXIgKi8KKwlzd2l0Y2ggKHJlcGx5KSB7CisJY2FzZSBJUENfR0xCX1JFUExZX1BFTkRJTkc6CisJCXRyYWNlX2lwY19wZW5kaW5nX3JlcGx5KCJyZWNlaXZlZCIsIGhlYWRlcik7CisJCW1zZy0+cGVuZGluZyA9IHRydWU7CisJCWhzdy0+cGVuZGluZyA9IHRydWU7CisJCXJldHVybiAxOworCWNhc2UgSVBDX0dMQl9SRVBMWV9TVUNDRVNTOgorCQlpZiAobXNnLT5wZW5kaW5nKSB7CisJCQl0cmFjZV9pcGNfcGVuZGluZ19yZXBseSgiY29tcGxldGVkIiwgaGVhZGVyKTsKKwkJCXNzdF9kc3BfaW5ib3hfcmVhZChoc3ctPmRzcCwgbXNnLT5yeF9kYXRhLAorCQkJCW1zZy0+cnhfc2l6ZSk7CisJCQloc3ctPnBlbmRpbmcgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCS8qIGNvcHkgZGF0YSBmcm9tIHRoZSBEU1AgKi8KKwkJCXNzdF9kc3Bfb3V0Ym94X3JlYWQoaHN3LT5kc3AsIG1zZy0+cnhfZGF0YSwKKwkJCQltc2ctPnJ4X3NpemUpOworCQl9CisJCWJyZWFrOworCS8qIHRoZXNlIHdpbGwgYmUgcmFyZSAtIGJ1dCB1c2VmdWwgZm9yIGRlYnVnICovCisJY2FzZSBJUENfR0xCX1JFUExZX1VOS05PV05fTUVTU0FHRV9UWVBFOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiB1bmtub3duIG1lc3NhZ2UgdHlwZSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUJBRE1TRzsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX09VVF9PRl9SRVNPVVJDRVM6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IG91dCBvZiByZXNvdXJjZXMiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVOT01FTTsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX0JVU1k6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHJlcGx5IGJ1c3kiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVCVVNZOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfRkFJTFVSRToKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogcmVwbHkgZmFpbHVyZSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfU1RBR0VfVU5JTklUSUFMSVpFRDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogc3RhZ2UgdW5pbml0aWFsaXplZCIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfTk9UX0ZPVU5EOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiByZXBseSBub3QgZm91bmQiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX1NPVVJDRV9OT1RfU1RBUlRFRDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogc291cmNlIG5vdCBzdGFydGVkIiwgaGVhZGVyKTsKKwkJbXNnLT5lcnJubyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgSVBDX0dMQl9SRVBMWV9JTlZBTElEX1JFUVVFU1Q6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IGludmFsaWQgcmVxdWVzdCIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfRVJST1JfSU5WQUxJRF9QQVJBTToKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogaW52YWxpZCBwYXJhbWV0ZXIiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogdW5rbm93biByZXBseSIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwkvKiB1cGRhdGUgYW55IHN0cmVhbSBzdGF0ZXMgKi8KKwloc3dfc3RyZWFtX3VwZGF0ZShoc3csIG1zZyk7CisKKwkvKiB3YWtlIHVwIGFuZCByZXR1cm4gdGhlIGVycm9yIGlmIHdlIGhhdmUgd2FpdGVycyBvbiB0aGlzIG1lc3NhZ2UgPyAqLworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCXR4X21zZ19yZXBseV9jb21wbGV0ZShoc3csIG1zZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoc3dfc3RyZWFtX21lc3NhZ2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwl1MzIgc3RyZWFtX21zZywgc3RyZWFtX2lkLCBzdGFnZV90eXBlOworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCWludCBoYW5kbGVkID0gMDsKKworCXN0cmVhbV9tc2cgPSBtc2dfZ2V0X3N0cmVhbV90eXBlKGhlYWRlcik7CisJc3RyZWFtX2lkID0gbXNnX2dldF9zdHJlYW1faWQoaGVhZGVyKTsKKwlzdGFnZV90eXBlID0gbXNnX2dldF9zdGFnZV90eXBlKGhlYWRlcik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2J5X2lkKGhzdywgc3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybiBoYW5kbGVkOworCisJc3RyZWFtLT5oZWFkZXIgPSBoZWFkZXI7CisKKwlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKKwljYXNlIElQQ19TVFJfU1RBR0VfTUVTU0FHRToKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdGFnZSBtc2cgbm90IGltcGxlbWVudGVkIDB4JTguOHhcbiIsCisJCQloZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19TVFJfTk9USUZJQ0FUSU9OOgorCQlzY2hlZHVsZV93b3JrKCZzdHJlYW0tPm5vdGlmeV93b3JrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogaGFuZGxlIHBlbmRpbmcgbWVzc2FnZSBjb21wbGV0ZSByZXF1ZXN0ICovCisJCWhhbmRsZWQgPSBoc3dfcHJvY2Vzc19yZXBseShoc3csIGhlYWRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaW50IGhzd19sb2dfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXUzMiBvcGVyYXRpb24gPSAoaGVhZGVyICYgSVBDX0xPR19PUF9NQVNLKSA+PiAgSVBDX0xPR19PUF9TSElGVDsKKwlzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtICpzdHJlYW0gPSAmaHN3LT5sb2dfc3RyZWFtOworCWludCByZXQgPSAxOworCisJaWYgKG9wZXJhdGlvbiAhPSBJUENfREVCVUdfUkVRVUVTVF9MT0dfRFVNUCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LAorCQkJImVycm9yOiBsb2cgbXNnIG5vdCBpbXBsZW1lbnRlZCAweCU4Ljh4XG4iLCBoZWFkZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltdXRleF9sb2NrKCZzdHJlYW0tPnJ3X211dGV4KTsKKwlzdHJlYW0tPmxhc3RfcG9zID0gc3RyZWFtLT5jdXJyX3BvczsKKwlzc3RfZHNwX2luYm94X3JlYWQoCisJCWhzdy0+ZHNwLCAmc3RyZWFtLT5jdXJyX3Bvcywgc2l6ZW9mKHN0cmVhbS0+Y3Vycl9wb3MpKTsKKwltdXRleF91bmxvY2soJnN0cmVhbS0+cndfbXV0ZXgpOworCisJc2NoZWR1bGVfd29yaygmc3RyZWFtLT5ub3RpZnlfd29yayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhzd19wcm9jZXNzX25vdGlmaWNhdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBoc3ctPmRzcDsKKwl1MzIgdHlwZSwgaGVhZGVyOworCWludCBoYW5kbGVkID0gMTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCXR5cGUgPSBtc2dfZ2V0X2dsb2JhbF90eXBlKGhlYWRlcik7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgicHJvY2Vzc2luZyAtLT4iLCBoZWFkZXIpOworCisJLyogRlcgUmVhZHkgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKwlpZiAoIWhzdy0+Ym9vdF9jb21wbGV0ZSAmJiBoZWFkZXIgJiBJUENfRldfUkVBRFkpIHsKKwkJaHN3X2Z3X3JlYWR5KGhzdywgaGVhZGVyKTsKKwkJcmV0dXJuIGhhbmRsZWQ7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUENfR0xCX0dFVF9GV19WRVJTSU9OOgorCWNhc2UgSVBDX0dMQl9BTExPQ0FURV9TVFJFQU06CisJY2FzZSBJUENfR0xCX0ZSRUVfU1RSRUFNOgorCWNhc2UgSVBDX0dMQl9HRVRfRldfQ0FQQUJJTElUSUVTOgorCWNhc2UgSVBDX0dMQl9SRVFVRVNUX0RVTVA6CisJY2FzZSBJUENfR0xCX0dFVF9ERVZJQ0VfRk9STUFUUzoKKwljYXNlIElQQ19HTEJfU0VUX0RFVklDRV9GT1JNQVRTOgorCWNhc2UgSVBDX0dMQl9FTlRFUl9EWF9TVEFURToKKwljYXNlIElQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPOgorCWNhc2UgSVBDX0dMQl9NQVhfSVBDX01FU1NBR0VfVFlQRToKKwljYXNlIElQQ19HTEJfUkVTVE9SRV9DT05URVhUOgorCWNhc2UgSVBDX0dMQl9TSE9SVF9SRVBMWToKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBtZXNzYWdlIHR5cGUgJWQgaGVhZGVyIDB4JXhcbiIsCisJCQl0eXBlLCBoZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfU1RSRUFNX01FU1NBR0U6CisJCWhhbmRsZWQgPSBoc3dfc3RyZWFtX21lc3NhZ2UoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfREVCVUdfTE9HX01FU1NBR0U6CisJCWhhbmRsZWQgPSBoc3dfbG9nX21lc3NhZ2UoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHVuZXhwZWN0ZWQgdHlwZSAlZCBoZHIgMHglOC44eFxuIiwKKwkJCXR5cGUsIGhlYWRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopIGNvbnRleHQ7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHNzdCk7CisJdTMyIGlwY3gsIGlwY2Q7CisJaW50IGhhbmRsZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpcGN4ID0gc3N0X2RzcF9pcGNfbXNnX3J4KGhzdy0+ZHNwKTsKKwlpcGNkID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisKKwkvKiByZXBseSBtZXNzYWdlIGZyb20gRFNQICovCisJaWYgKGlwY3ggJiBTU1RfSVBDWF9ET05FKSB7CisKKwkJLyogSGFuZGxlIEltbWVkaWF0ZSByZXBseSBmcm9tIERTUCBDb3JlICovCisJCWhhbmRsZWQgPSBoc3dfcHJvY2Vzc19yZXBseShoc3csIGlwY3gpOworCisJCWlmIChoYW5kbGVkID4gMCkgeworCQkJLyogY2xlYXIgRE9ORSBiaXQgLSB0ZWxsIERTUCB3ZSBoYXZlIGNvbXBsZXRlZCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lQQ1gsCisJCQkJU1NUX0lQQ1hfRE9ORSwgMCk7CisKKwkJCS8qIHVubWFzayBEb25lIGludGVycnVwdCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQkJU1NUX0lNUlhfRE9ORSwgMCk7CisJCX0KKwl9CisKKwkvKiBuZXcgbWVzc2FnZSBmcm9tIERTUCAqLworCWlmIChpcGNkICYgU1NUX0lQQ0RfQlVTWSkgeworCisJCS8qIEhhbmRsZSBOb3RpZmljYXRpb24gYW5kIERlbGF5ZWQgcmVwbHkgZnJvbSBEU1AgQ29yZSAqLworCQloYW5kbGVkID0gaHN3X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKGhzdyk7CisKKwkJLyogY2xlYXIgQlVTWSBiaXQgYW5kIHNldCBET05FIGJpdCAtIGFjY2VwdCBuZXcgbWVzc2FnZXMgKi8KKwkJaWYgKGhhbmRsZWQgPiAwKSB7CisJCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCwKKwkJCQlTU1RfSVBDRF9CVVNZIHwgU1NUX0lQQ0RfRE9ORSwgU1NUX0lQQ0RfRE9ORSk7CisKKwkJCS8qIHVubWFzayBidXN5IGludGVycnVwdCAqLworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCisJCQkJU1NUX0lNUlhfQlVTWSwgMCk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBjb250aW51ZSB0byBzZW5kIGFueSByZW1haW5pbmcgbWVzc2FnZXMuLi4gKi8KKwlxdWV1ZV9rdGhyZWFkX3dvcmsoJmhzdy0+a3dvcmtlciwgJmhzdy0+a3dvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgc3N0X2hzd19md19nZXRfdmVyc2lvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uICp2ZXJzaW9uKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgSVBDX0dMQl9UWVBFKElQQ19HTEJfR0VUX0ZXX1ZFUlNJT04pLAorCQlOVUxMLCAwLCB2ZXJzaW9uLCBzaXplb2YoKnZlcnNpb24pKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgdmVyc2lvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTWl4ZXIgQ29udHJvbHMgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoaHN3LCBzdHJlYW0sIHN0YWdlX2lkLCBjaGFubmVsLAorCQkmc3RyZWFtLT5tdXRlX3ZvbHVtZVtjaGFubmVsXSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgc3RyZWFtLCBzdGFnZV9pZCwgY2hhbm5lbCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBjYW4ndCB1bm11dGUgc3RyZWFtICVkIGNoYW5uZWwgJWRcbiIsCisJCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgY2hhbm5lbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3RyZWFtLT5tdXRlW2NoYW5uZWxdID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3VubXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKQorCit7CisJaW50IHJldDsKKworCXN0cmVhbS0+bXV0ZVtjaGFubmVsXSA9IDA7CisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHN0cmVhbSwgc3RhZ2VfaWQsIGNoYW5uZWwsCisJCXN0cmVhbS0+bXV0ZV92b2x1bWVbY2hhbm5lbF0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogY2FuJ3QgdW5tdXRlIHN0cmVhbSAlZCBjaGFubmVsICVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIGNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLCB1MzIgKnZvbHVtZSkKK3sKKwlpZiAoY2hhbm5lbCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCB2b2x1bWUsCisJCXN0cmVhbS0+cmVwbHkudm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF0sIHNpemVvZih2b2x1bWUpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZV9jdXJ2ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1NjQgY3VydmVfZHVyYXRpb24sCisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSkKK3sKKwkvKiBjdXJ2ZSBkdXJhdGlvbiBpbiBzdGVwcyBvZiAxMDBucyAqLworCXN0cmVhbS0+dm9sX3JlcS5jdXJ2ZV9kdXJhdGlvbiA9IGN1cnZlX2R1cmF0aW9uOworCXN0cmVhbS0+dm9sX3JlcS5jdXJ2ZV90eXBlID0gY3VydmU7CisKKwlyZXR1cm4gMDsKK30KKworLyogc3RyZWFtIHZvbHVtZSAqLworaW50IHNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyIHZvbHVtZSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSAqcmVxOworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJzZXQgc3RyZWFtIHZvbHVtZSIsIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCWlmIChjaGFubmVsID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RyZWFtLT5tdXRlW2NoYW5uZWxdKSB7CisJCXN0cmVhbS0+bXV0ZV92b2x1bWVbY2hhbm5lbF0gPSB2b2x1bWU7CisJCXJldHVybiAwOworCX0KKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX1NUUkVBTV9NRVNTQUdFKSB8CisJCUlQQ19TVFJfVFlQRShJUENfU1RSX1NUQUdFX01FU1NBR0UpOworCWhlYWRlciB8PSAoc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisJaGVhZGVyIHw9IChJUENfU1RHX1NFVF9WT0xVTUUgPDwgSVBDX1NUR19UWVBFX1NISUZUKTsKKwloZWFkZXIgfD0gKHN0YWdlX2lkIDw8IElQQ19TVEdfSURfU0hJRlQpOworCisJcmVxID0gJnN0cmVhbS0+dm9sX3JlcTsKKwlyZXEtPmNoYW5uZWwgPSBjaGFubmVsOworCXJlcS0+dGFyZ2V0X3ZvbHVtZSA9IHZvbHVtZTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIHJlcSwgc2l6ZW9mKCpyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBzdHJlYW0gdm9sdW1lIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX211dGUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKGhzdywgc3RhZ2VfaWQsIGNoYW5uZWwsCisJCSZoc3ctPm11dGVfdm9sdW1lW2NoYW5uZWxdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNzdF9oc3dfbWl4ZXJfc2V0X3ZvbHVtZShoc3csIHN0YWdlX2lkLCBjaGFubmVsLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byB1bm11dGUgbWl4ZXIgY2hhbm5lbCAlZFxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhzdy0+bXV0ZVtjaGFubmVsXSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX3VubXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCBzdGFnZV9pZCwgY2hhbm5lbCwKKwkJaHN3LT5taXhlcl9pbmZvLnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzW2NoYW5uZWxdKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byB1bm11dGUgbWl4ZXIgY2hhbm5lbCAlZFxuIiwKKwkJCWNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhzdy0+bXV0ZVtjaGFubmVsXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X21peGVyX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwKKwl1MzIgKnZvbHVtZSkKK3sKKwlpZiAoY2hhbm5lbCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCB2b2x1bWUsCisJCWhzdy0+bWl4ZXJfaW5mby52b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1tjaGFubmVsXSwKKwkJc2l6ZW9mKCp2b2x1bWUpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lX2N1cnZlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJIHU2NCBjdXJ2ZV9kdXJhdGlvbiwgZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSkKK3sKKwkvKiBjdXJ2ZSBkdXJhdGlvbiBpbiBzdGVwcyBvZiAxMDBucyAqLworCWhzdy0+Y3VydmVfZHVyYXRpb24gPSBjdXJ2ZV9kdXJhdGlvbjsKKwloc3ctPmN1cnZlX3R5cGUgPSBjdXJ2ZTsKKworCXJldHVybiAwOworfQorCisvKiBnbG9iYWwgbWl4ZXIgdm9sdW1lICovCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyIHZvbHVtZSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSByZXE7CisJdTMyIGhlYWRlcjsKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInNldCBtaXhlciB2b2x1bWUiLCB2b2x1bWUpOworCisJLyogc2V0IGJvdGggYXQgc2FtZSB0aW1lID8gKi8KKwlpZiAoY2hhbm5lbCA9PSAyKSB7CisJCWlmIChoc3ctPm11dGVbMF0gJiYgaHN3LT5tdXRlWzFdKSB7CisJCQloc3ctPm11dGVfdm9sdW1lWzBdID0gaHN3LT5tdXRlX3ZvbHVtZVsxXSA9IHZvbHVtZTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGhzdy0+bXV0ZVswXSkKKwkJCXJlcS5jaGFubmVsID0gMTsKKwkJZWxzZSBpZiAoaHN3LT5tdXRlWzFdKQorCQkJcmVxLmNoYW5uZWwgPSAwOworCQllbHNlCisJCQlyZXEuY2hhbm5lbCA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJLyogc2V0IG9ubHkgMSBjaGFubmVsICovCisJCWlmIChoc3ctPm11dGVbY2hhbm5lbF0pIHsKKwkJCWhzdy0+bXV0ZV92b2x1bWVbY2hhbm5lbF0gPSB2b2x1bWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXEuY2hhbm5lbCA9IGNoYW5uZWw7CisJfQorCisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfU1RSRUFNX01FU1NBR0UpIHwKKwkJSVBDX1NUUl9UWVBFKElQQ19TVFJfU1RBR0VfTUVTU0FHRSk7CisJaGVhZGVyIHw9IChoc3ctPm1peGVyX2luZm8ubWl4ZXJfaHdfaWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisJaGVhZGVyIHw9IChJUENfU1RHX1NFVF9WT0xVTUUgPDwgSVBDX1NUR19UWVBFX1NISUZUKTsKKwloZWFkZXIgfD0gKHN0YWdlX2lkIDw8IElQQ19TVEdfSURfU0hJRlQpOworCisJcmVxLmN1cnZlX2R1cmF0aW9uID0gaHN3LT5jdXJ2ZV9kdXJhdGlvbjsKKwlyZXEuY3VydmVfdHlwZSA9IGhzdy0+Y3VydmVfdHlwZTsKKwlyZXEudGFyZ2V0X3ZvbHVtZSA9IHZvbHVtZTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBtaXhlciB2b2x1bWUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RyZWFtIEFQSSAqLworc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzc3RfaHN3X3N0cmVhbV9uZXcoc3RydWN0IHNzdF9oc3cgKmhzdywgaW50IGlkLAorCXUzMiAoKm5vdGlmeV9wb3NpdGlvbikoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpLAorCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW07CisKKwlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfYWRkKCZzdHJlYW0tPm5vZGUsICZoc3ctPnN0cmVhbV9saXN0KTsKKwlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbiA9IG5vdGlmeV9wb3NpdGlvbjsKKwlzdHJlYW0tPnBkYXRhID0gZGF0YTsKKwlzdHJlYW0tPmhzdyA9IGhzdzsKKwlzdHJlYW0tPmhvc3RfaWQgPSBpZDsKKworCS8qIHdvcmsgdG8gcHJvY2VzcyBub3RpZmljYXRpb24gbWVzc2FnZXMgKi8KKwlJTklUX1dPUksoJnN0cmVhbS0+bm90aWZ5X3dvcmssIGhzd19ub3RpZmljYXRpb25fd29yayk7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZnJlZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwl1MzIgaGVhZGVyOworCWludCByZXQgPSAwOworCisJLyogZG9udCBmcmVlIERTUCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLworCWlmICghc3RyZWFtLT5jb21taXRlZCkKKwkJZ290byBvdXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGZyZWUiLCBzdHJlYW0tPmhvc3RfaWQpOworCisJc3RyZWFtLT5mcmVlX3JlcS5zdHJlYW1faWQgPSBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZDsKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9GUkVFX1NUUkVBTSk7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCAmc3RyZWFtLT5mcmVlX3JlcSwKKwkJc2l6ZW9mKHN0cmVhbS0+ZnJlZV9yZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZyZWUgc3RyZWFtICVkIGZhaWxlZFxuIiwKKwkJCXN0cmVhbS0+ZnJlZV9yZXEuc3RyZWFtX2lkKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJdHJhY2VfaHN3X3N0cmVhbV9mcmVlX3JlcShzdHJlYW0sICZzdHJlYW0tPmZyZWVfcmVxKTsKKworb3V0OgorCWxpc3RfZGVsKCZzdHJlYW0tPm5vZGUpOworCWtmcmVlKHN0cmVhbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgZW51bSBzc3RfaHN3X2JpdGRlcHRoIGJpdHMpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgYml0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuYml0ZGVwdGggPSBiaXRzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGludCBjaGFubmVscykKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBjaGFubmVsc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN0ZXJlbyBpcyBvbmx5IHN1cHBvcnRlZCBhdG0gKi8KKwlpZiAoY2hhbm5lbHMgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNoX251bSA9IGNoYW5uZWxzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgaW50IHJhdGUpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgcmF0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuZnJlcXVlbmN5ID0gcmF0ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBtYXAsCisJZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZykKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0Lm1hcCA9IG1hcDsKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNvbmZpZyA9IGNvbmZpZzsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zdHlsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBlbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHN0eWxlKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHN0eWxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LmZvcm1hdC5zdHlsZSA9IHN0eWxlOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBiaXRzKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHZhbGlkIGJpdHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LnZhbGlkX2JpdCA9IGJpdHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN0cmVhbSBDb25maWd1cmF0aW9uICovCitpbnQgc3N0X2hzd19zdHJlYW1fZm9ybWF0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkLAorCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZSwKKwllbnVtIHNzdF9oc3dfc3RyZWFtX2Zvcm1hdCBmb3JtYXRfaWQpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LnBhdGhfaWQgPSBwYXRoX2lkOworCXN0cmVhbS0+cmVxdWVzdC5zdHJlYW1fdHlwZSA9IHN0cmVhbV90eXBlOworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwl0cmFjZV9oc3dfc3RyZWFtX2FsbG9jX3JlcXVlc3Qoc3RyZWFtLCAmc3RyZWFtLT5yZXF1ZXN0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiByaW5nX3B0X2FkZHJlc3MsIHUzMiBudW1fcGFnZXMsCisJdTMyIHJpbmdfc2l6ZSwgdTMyIHJpbmdfb2Zmc2V0LCB1MzIgcmluZ19maXJzdF9wZm4pCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19wdF9hZGRyZXNzID0gcmluZ19wdF9hZGRyZXNzOworCXN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19vZmZzZXQgPSByaW5nX29mZnNldDsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19maXJzdF9wZm4gPSByaW5nX2ZpcnN0X3BmbjsKKworCXRyYWNlX2hzd19zdHJlYW1fYnVmZmVyKHN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBlbnVtIHNzdF9oc3dfbW9kdWxlX2lkIG1vZHVsZV9pZCwKKwl1MzIgZW50cnlfcG9pbnQpCit7CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCAqbWFwID0gJnN0cmVhbS0+cmVxdWVzdC5tYXA7CisKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtb2R1bGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBvbmx5IHN1cHBvcnQgaW5pdGlhbCBtb2R1bGUgYXRtICovCisJbWFwLT5tb2R1bGVfZW50cmllc19jb3VudCA9IDE7CisJbWFwLT5tb2R1bGVfZW50cmllc1swXS5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJbWFwLT5tb2R1bGVfZW50cmllc1swXS5lbnRyeV9wb2ludCA9IGVudHJ5X3BvaW50OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHBtZW1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QucGVyc2lzdGVudF9tZW0ub2Zmc2V0ID0gb2Zmc2V0OworCXN0cmVhbS0+cmVxdWVzdC5wZXJzaXN0ZW50X21lbS5zaXplID0gc2l6ZTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3NtZW1vcnlfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSkKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBzbWVtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LnNjcmF0Y2hfbWVtLm9mZnNldCA9IG9mZnNldDsKKwlzdHJlYW0tPnJlcXVlc3Quc2NyYXRjaF9tZW0uc2l6ZSA9IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX2NvbW1pdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSAqcmVwbHkgPSAmc3RyZWFtLT5yZXBseTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGFsbG9jIiwgc3RyZWFtLT5ob3N0X2lkKTsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0FMTE9DQVRFX1NUUkVBTSk7CisKKwlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCBzdHJfcmVxLCBzaXplb2YoKnN0cl9yZXEpLAorCQlyZXBseSwgc2l6ZW9mKCpyZXBseSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSAxOworCXRyYWNlX2hzd19zdHJlYW1fYWxsb2NfcmVwbHkoc3RyZWFtKTsKKworCXJldHVybiAwOworfQorCisvKiBTdHJlYW0gSW5mb3JtYXRpb24gLSB0aGVzZSBjYWxscyBjb3VsZCBiZSBpbmxpbmUgYnV0IHdlIHdhbnQgdGhlIElQQworIEFCSSB0byBiZSBvcGFxdWUgdG8gY2xpZW50IFBDTSBkcml2ZXJzIHRvIGNvcGUgd2l0aCBhbnkgZnV0dXJlIEFCSSBjaGFuZ2VzICovCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X2h3X2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X21peGVyX2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIHN0cmVhbS0+cmVwbHkubWl4ZXJfaHdfaWQ7Cit9CisKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcmVhZF9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5yZXBseS5yZWFkX3Bvc2l0aW9uX3JlZ2lzdGVyX2FkZHJlc3M7Cit9CisKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcG9pbnRlcl9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5yZXBseS5wcmVzZW50YXRpb25fcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKK30KKwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF9wZWFrX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+PSAyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzdHJlYW0tPnJlcGx5LnBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tjaGFubmVsXTsKK30KKwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF92b2xfcmVnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBjaGFubmVsKQoreworCWlmIChjaGFubmVsID49IDIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHN0cmVhbS0+cmVwbHkudm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF07Cit9CisKK2ludCBzc3RfaHN3X21peGVyX2dldF9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5ICpyZXBseTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwlyZXBseSA9ICZoc3ctPm1peGVyX2luZm87CisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPKTsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJnZXQgZ2xvYmFsIG1peGVyIGluZm8iLCAwKTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgc3RyZWFtIGluZm8gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cmFjZV9oc3dfbWl4ZXJfaW5mb19yZXBseShyZXBseSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBzdHJlYW0gY29tbWFuZCAqLworc3RhdGljIGludCBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfaHN3ICpoc3csIGludCB0eXBlLAorCWludCBzdHJlYW1faWQsIGludCB3YWl0KQoreworCXUzMiBoZWFkZXI7CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkgfCBJUENfU1RSX1RZUEUodHlwZSk7CisJaGVhZGVyIHw9IChzdHJlYW1faWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIGlwY190eF9tZXNzYWdlX25vd2FpdChoc3csIGhlYWRlciwgTlVMTCwgMCk7Cit9CisKKy8qIFN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9oc3dfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWludCB3YWl0KQoreworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIHBhdXNlIiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fb3BlcmF0aW9ucyhoc3csIElQQ19TVFJfUEFVU0UsCisJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCkKK3sKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInN0cmVhbSByZXN1bWUiLCBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKGhzdywgSVBDX1NUUl9SRVNVTUUsCisJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcmVzdW1lIHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfaHN3X3N0cmVhbV9yZXNldChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgcmV0LCB0cmllcyA9IDEwOworCisJLyogZG9udCByZXNldCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLworCWlmICghc3RyZWFtLT5jb21taXRlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiB3YWl0IGZvciBwYXVzZSB0byBjb21wbGV0ZSBiZWZvcmUgd2UgcmVzZXQgdGhlIHN0cmVhbSAqLworCXdoaWxlIChzdHJlYW0tPnJ1bm5pbmcgJiYgdHJpZXMtLSkKKwkJbXNsZWVwKDEpOworCWlmICghdHJpZXMpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiByZXNldCBzdHJlYW0gJWQgc3RpbGwgcnVubmluZ1xuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdHJhY2VfaXBjX3JlcXVlc3QoInN0cmVhbSByZXNldCIsIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX29wZXJhdGlvbnMoaHN3LCBJUENfU1RSX1JFU0VULAorCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHJlc2V0IHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBTdHJlYW0gcG9pbnRlciBwb3NpdGlvbnMgKi8KK2ludCBzc3RfaHN3X2dldF9kc3BfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5ycG9zLnBvc2l0aW9uOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3dyaXRlX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIHBvc2l0aW9uKQoreworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXRyYWNlX3N0cmVhbV93cml0ZV9wb3NpdGlvbihzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgcG9zaXRpb24pOworCisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfU1RSRUFNX01FU1NBR0UpIHwKKwkJSVBDX1NUUl9UWVBFKElQQ19TVFJfU1RBR0VfTUVTU0FHRSk7CisJaGVhZGVyIHw9IChzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA8PCBJUENfU1RSX0lEX1NISUZUKTsKKwloZWFkZXIgfD0gKElQQ19TVEdfU0VUX1dSSVRFX1BPU0lUSU9OIDw8IElQQ19TVEdfVFlQRV9TSElGVCk7CisJaGVhZGVyIHw9IChzdGFnZV9pZCA8PCBJUENfU1RHX0lEX1NISUZUKTsKKwlzdHJlYW0tPndwb3MucG9zaXRpb24gPSBwb3NpdGlvbjsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX25vd2FpdChoc3csIGhlYWRlciwgJnN0cmVhbS0+d3BvcywKKwkJc2l6ZW9mKHN0cmVhbS0+d3BvcykpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSAlZCBzZXQgcG9zaXRpb24gJWQgZmFpbGVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIHBvc2l0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIHBoeXNpY2FsIEJFIGNvbmZpZyAqLworaW50IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwllbnVtIHNzdF9oc3dfZGV2aWNlX2lkIGRldiwgZW51bSBzc3RfaHN3X2RldmljZV9tY2xrIG1jbGssCisJZW51bSBzc3RfaHN3X2RldmljZV9tb2RlIG1vZGUsIHUzMiBjbG9ja19kaXZpZGVyKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19kZXZpY2VfY29uZmlnX3JlcSBjb25maWc7CisJdTMyIGhlYWRlcjsKKwlpbnQgcmV0OworCisJdHJhY2VfaXBjX3JlcXVlc3QoInNldCBkZXZpY2UgY29uZmlnIiwgZGV2KTsKKworCWNvbmZpZy5zc3BfaW50ZXJmYWNlID0gZGV2OworCWNvbmZpZy5jbG9ja19mcmVxdWVuY3kgPSBtY2xrOworCWNvbmZpZy5tb2RlID0gbW9kZTsKKwljb25maWcuY2xvY2tfZGl2aWRlciA9IGNsb2NrX2RpdmlkZXI7CisKKwl0cmFjZV9oc3dfZGV2aWNlX2NvbmZpZ19yZXEoJmNvbmZpZyk7CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TRVRfREVWSUNFX0ZPUk1BVFMpOworCisJcmV0ID0gaXBjX3R4X21lc3NhZ2Vfd2FpdChoc3csIGhlYWRlciwgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZyksCisJCU5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBkZXZpY2UgZm9ybWF0cyBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcpOworCisvKiBEWCBDb25maWcgKi8KK2ludCBzc3RfaHN3X2R4X3NldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCWVudW0gc3N0X2hzd19keF9zdGF0ZSBzdGF0ZSwgc3RydWN0IHNzdF9oc3dfaXBjX2R4X3JlcGx5ICpkeCkKK3sKKwl1MzIgaGVhZGVyLCBzdGF0ZV87CisJaW50IHJldDsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0VOVEVSX0RYX1NUQVRFKTsKKwlzdGF0ZV8gPSBzdGF0ZTsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJQTSBlbnRlciBEeCBzdGF0ZSIsIHN0YXRlKTsKKworCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsICZzdGF0ZV8sIHNpemVvZihzdGF0ZV8pLAorCQlkeCwgc2l6ZW9mKGR4KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImlwYzogZXJyb3Igc2V0IGR4IHN0YXRlICVkIGZhaWxlZFxuIiwgc3RhdGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoaHN3LT5kZXYsICJpcGM6IGdvdCAlZCBlbnRyeSBudW1iZXJzIGZvciBzdGF0ZSAlZFxuIiwKKwkJZHgtPmVudHJpZXNfbm8sIHN0YXRlKTsKKworCW1lbWNweSgmaHN3LT5keCwgZHgsIHNpemVvZigqZHgpKTsKKwlyZXR1cm4gMDsKK30KKworLyogVXNlZCB0byBzYXZlIHN0YXRlIGludG8gaHN3LT5keF9yZXBseSAqLworaW50IHNzdF9oc3dfZHhfZ2V0X3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBpdGVtLAorCXUzMiAqb2Zmc2V0LCB1MzIgKnNpemUsIHUzMiAqc291cmNlKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSAqZHhfbWVtOworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSAqZHhfcmVwbHk7CisJaW50IGVudHJ5X25vOworCisJZHhfcmVwbHkgPSAmaHN3LT5keDsKKwllbnRyeV9ubyA9IGR4X3JlcGx5LT5lbnRyaWVzX25vOworCisJdHJhY2VfaXBjX3JlcXVlc3QoIlBNIGdldCBEeCBzdGF0ZSIsIGVudHJ5X25vKTsKKworCWlmIChpdGVtID49IGVudHJ5X25vKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWR4X21lbSA9ICZkeF9yZXBseS0+bWVtX2luZm9baXRlbV07CisJKm9mZnNldCA9IGR4X21lbS0+b2Zmc2V0OworCSpzaXplID0gZHhfbWVtLT5zaXplOworCSpzb3VyY2UgPSBkeF9tZW0tPnNvdXJjZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zZ19lbXB0eV9saXN0X2luaXQoc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlpbnQgaTsKKworCWhzdy0+bXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwY19tZXNzYWdlKSAqCisJCUlQQ19FTVBUWV9MSVNUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChoc3ctPm1zZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBJUENfRU1QVFlfTElTVF9TSVpFOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaHN3LT5tc2dbaV0ud2FpdHEpOworCQlsaXN0X2FkZCgmaHN3LT5tc2dbaV0ubGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaCkKK3sKKwloc3ctPnNjcmF0Y2ggPSBzY3JhdGNoOworfQorCitzdHJ1Y3Qgc3N0X2RzcCAqc3N0X2hzd19nZXRfZHNwKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJcmV0dXJuIGhzdy0+ZHNwOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9kc3BfZGV2aWNlIGhzd19kZXYgPSB7CisJLnRocmVhZCA9IGhzd19pcnFfdGhyZWFkLAorCS5vcHMgPSAmaGFzd2VsbF9vcHMsCit9OworCitpbnQgc3N0X2hzd19kc3BfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uIHZlcnNpb247CisJc3RydWN0IHNzdF9oc3cgKmhzdzsKKwlzdHJ1Y3Qgc3N0X2Z3ICpoc3dfc3N0X2Z3OworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgImluaXRpYWxpc2luZyBBdWRpbyBEU1AgSVBDXG4iKTsKKworCWhzdyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHN3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhzdyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhzdy0+ZGV2ID0gZGV2OworCUlOSVRfTElTVF9IRUFEKCZoc3ctPnN0cmVhbV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT50eF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT5yeF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHN3LT5lbXB0eV9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoc3ctPmJvb3Rfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaHN3LT53YWl0X3R4cSk7CisKKwlyZXQgPSBtc2dfZW1wdHlfbGlzdF9pbml0KGhzdyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gbGlzdF9lcnI7CisKKwkvKiBzdGFydCB0aGUgSVBDIG1lc3NhZ2UgdGhyZWFkICovCisJaW5pdF9rdGhyZWFkX3dvcmtlcigmaHN3LT5rd29ya2VyKTsKKwloc3ctPnR4X3RocmVhZCA9IGt0aHJlYWRfcnVuKGt0aHJlYWRfd29ya2VyX2ZuLAorCQkJCQkgICAmaHN3LT5rd29ya2VyLAorCQkJCQkgICBkZXZfbmFtZShoc3ctPmRldikpOworCWlmIChJU19FUlIoaHN3LT50eF90aHJlYWQpKSB7CisJCXJldCA9IFBUUl9FUlIoaHN3LT50eF90aHJlYWQpOworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBUWCB0YXNrXG4iKTsKKwkJZ290byBsaXN0X2VycjsKKwl9CisJaW5pdF9rdGhyZWFkX3dvcmsoJmhzdy0+a3dvcmssIGlwY190eF9tc2dzKTsKKworCWhzd19kZXYudGhyZWFkX2NvbnRleHQgPSBoc3c7CisKKwkvKiBpbml0IFNTVCBzaGltICovCisJaHN3LT5kc3AgPSBzc3RfZHNwX25ldyhkZXYsICZoc3dfZGV2LCBwZGF0YSk7CisJaWYgKGhzdy0+ZHNwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsaXN0X2VycjsKKwl9CisKKwkvKiBrZWVwIHRoZSBEU1AgaW4gcmVzZXQgc3RhdGUgZm9yIGJhc2UgRlcgbG9hZGluZyAqLworCXNzdF9kc3BfcmVzZXQoaHN3LT5kc3ApOworCisJaHN3X3NzdF9mdyA9IHNzdF9md19uZXcoaHN3LT5kc3AsIHBkYXRhLT5mdywgaHN3KTsKKworCWlmIChoc3dfc3N0X2Z3ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlnb3RvIGZ3X2VycjsKKwl9CisKKwkvKiB3YWl0IGZvciBEU1AgYm9vdCBjb21wbGV0aW9uICovCisJc3N0X2RzcF9ib290KGhzdy0+ZHNwKTsKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaHN3LT5ib290X3dhaXQsIGhzdy0+Ym9vdF9jb21wbGV0ZSwKKwkJbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSAtRUlPOworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IEFEU1AgYm9vdCB0aW1lb3V0XG4iKTsKKwkJZ290byBib290X2VycjsKKwl9CisKKwkvKiBnZXQgdGhlIEZXIHZlcnNpb24gKi8KKwlzc3RfaHN3X2Z3X2dldF92ZXJzaW9uKGhzdywgJnZlcnNpb24pOworCWRldl9pbmZvKGhzdy0+ZGV2LCAiRlcgbG9hZGVkOiB0eXBlICVkIC0gdmVyc2lvbjogJWQuJWQgYnVpbGQgJWRcbiIsCisJCXZlcnNpb24udHlwZSwgdmVyc2lvbi5tYWpvciwgdmVyc2lvbi5taW5vciwgdmVyc2lvbi5idWlsZCk7CisKKwkvKiBnZXQgdGhlIGdsb2JhbG1peGVyICovCisJcmV0ID0gc3N0X2hzd19taXhlcl9nZXRfaW5mbyhoc3cpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBzdHJlYW0gaW5mb1xuIik7CisJCWdvdG8gYm9vdF9lcnI7CisJfQorCisJcGRhdGEtPmRzcCA9IGhzdzsKKwlyZXR1cm4gMDsKKworYm9vdF9lcnI6CisJc3N0X2RzcF9yZXNldChoc3ctPmRzcCk7CisJc3N0X2Z3X2ZyZWUoaHN3X3NzdF9mdyk7Citmd19lcnI6CisJc3N0X2RzcF9mcmVlKGhzdy0+ZHNwKTsKKwlrZnJlZShoc3ctPm1zZyk7CitsaXN0X2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfaW5pdCk7CisKK3ZvaWQgc3N0X2hzd19kc3BfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+ZHNwOworCisJc3N0X2RzcF9yZXNldChoc3ctPmRzcCk7CisJc3N0X2Z3X2ZyZWVfYWxsKGhzdy0+ZHNwKTsKKwlzc3RfZHNwX2ZyZWUoaHN3LT5kc3ApOworCWtmcmVlKGhzdy0+c2NyYXRjaCk7CisJa2ZyZWUoaHN3LT5tc2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfZnJlZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxNzkyOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1pcGMuaApAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIEludGVsIFNTVCBIYXN3ZWxsL0Jyb2Fkd2VsbCBJUEMgU3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fU1NUX0hBU1dFTExfSVBDX0gKKyNkZWZpbmUgX19TU1RfSEFTV0VMTF9JUENfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBTU1RfSFNXX05PX0NIQU5ORUxTCQkyCisjZGVmaW5lIFNTVF9IU1dfTUFYX0RYX1JFR0lPTlMJCTE0CisKKyNkZWZpbmUgU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEUwkxMgorI2RlZmluZSBTU1RfSFNXX0dMT0JBTF9MT0cJCTE1CisKKy8qKgorICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKKyAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KKyAqLworI2RlZmluZSBTU1RfSFNXX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTQwMAorI2RlZmluZSBTU1RfSFNXX01BWF9JTkZPX1NJWkUJCTY0CisjZGVmaW5lIFNTVF9IU1dfQlVJTERfSEFTSF9MRU5HVEgJNDAKKworc3RydWN0IHNzdF9oc3c7CitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW07CitzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtOworc3RydWN0IHNzdF9wZGF0YTsKK3N0cnVjdCBzc3RfbW9kdWxlOworZXh0ZXJuIHN0cnVjdCBzc3Rfb3BzIGhhc3dlbGxfb3BzOworCisvKiBTdHJlYW0gQWxsb2NhdGUgUGF0aCBJRCAqLworZW51bSBzc3RfaHN3X3N0cmVhbV9wYXRoX2lkIHsKKwlTU1RfSFNXX1NUUkVBTV9QQVRIX1NTUDBfT1VUID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9QQVRIX1NTUDBfSU4gPSAxLAorCVNTVF9IU1dfU1RSRUFNX1BBVEhfTUFYX1BBVEhfSUQgPSAyLAorfTsKKworLyogU3RyZWFtIEFsbG9jYXRlIFN0cmVhbSBUeXBlICovCitlbnVtIHNzdF9oc3dfc3RyZWFtX3R5cGUgeworCVNTVF9IU1dfU1RSRUFNX1RZUEVfUkVOREVSID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX1NZU1RFTSA9IDEsCisJU1NUX0hTV19TVFJFQU1fVFlQRV9DQVBUVVJFID0gMiwKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX0xPT1BCQUNLID0gMywKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX01BWF9TVFJFQU1fVFlQRSA9IDQsCit9OworCisvKiBTdHJlYW0gQWxsb2NhdGUgU3RyZWFtIEZvcm1hdCAqLworZW51bSBzc3RfaHN3X3N0cmVhbV9mb3JtYXQgeworCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9QQ01fRk9STUFUID0gMCwKKwlTU1RfSFNXX1NUUkVBTV9GT1JNQVRfTVAzX0ZPUk1BVCA9IDEsCisJU1NUX0hTV19TVFJFQU1fRk9STUFUX0FBQ19GT1JNQVQgPSAyLAorCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9NQVhfRk9STUFUX0lEID0gMywKK307CisKKy8qIERldmljZSBJRCAqLworZW51bSBzc3RfaHN3X2RldmljZV9pZCB7CisJU1NUX0hTV19ERVZJQ0VfU1NQXzAgICA9IDAsCisJU1NUX0hTV19ERVZJQ0VfU1NQXzEgICA9IDEsCit9OworCisvKiBEZXZpY2UgTWFzdGVyIENsb2NrIEZyZXF1ZW5jeSAqLworZW51bSBzc3RfaHN3X2RldmljZV9tY2xrIHsKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX09GRiAgICAgICAgID0gMCwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfNl9NSFogID0gMSwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMTJfTUhaID0gMiwKKwlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMjRfTUhaID0gMywKK307CisKKy8qIERldmljZSBDbG9jayBNYXN0ZXIgKi8KK2VudW0gc3N0X2hzd19kZXZpY2VfbW9kZSB7CisJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfU0xBVkUgICA9IDAsCisJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSICA9IDEsCit9OworCisvKiBEWCBQb3dlciBTdGF0ZSAqLworZW51bSBzc3RfaHN3X2R4X3N0YXRlIHsKKwlTU1RfSFNXX0RYX1NUQVRFX0QwICAgICA9IDAsCisJU1NUX0hTV19EWF9TVEFURV9EMSAgICAgPSAxLAorCVNTVF9IU1dfRFhfU1RBVEVfRDMgICAgID0gMywKKwlTU1RfSFNXX0RYX1NUQVRFX01BWAk9IDMsCit9OworCisvKiBBdWRpbyBzdHJlYW0gc3RhZ2UgSURzICovCitlbnVtIHNzdF9oc3dfZnhfc3RhZ2VfaWQgeworCVNTVF9IU1dfU1RBR0VfSURfV0FWRVMgPSAwLAorCVNTVF9IU1dfU1RBR0VfSURfRFRTICAgPSAxLAorCVNTVF9IU1dfU1RBR0VfSURfRE9MQlkgPSAyLAorCVNTVF9IU1dfU1RBR0VfSURfQk9PU1QgPSAzLAorCVNTVF9IU1dfU1RBR0VfSURfTUFYX0ZYX0lECit9OworCisvKiBEWCBTdGF0ZSBUeXBlICovCitlbnVtIHNzdF9oc3dfZHhfdHlwZSB7CisJU1NUX0hTV19EWF9UWVBFX0ZXX0lNQUdFID0gMCwKKwlTU1RfSFNXX0RYX1RZUEVfTUVNT1JZX0RVTVAgPSAxCit9OworCisvKiBWb2x1bWUgQ3VydmUgVHlwZSovCitlbnVtIHNzdF9oc3dfdm9sdW1lX2N1cnZlIHsKKwlTU1RfSFNXX1ZPTFVNRV9DVVJWRV9OT05FID0gMCwKKwlTU1RfSFNXX1ZPTFVNRV9DVVJWRV9GQURFID0gMQorfTsKKworLyogU2FtcGxlIG9yZGVyaW5nICovCitlbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHsKKwlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCA9IDAsCisJU1NUX0hTV19JTlRFUkxFQVZJTkdfUEVSX1NBTVBMRSAgPSAxLAorfTsKKworLyogQ2hhbm5lbCBpbmRpY2VzICovCitlbnVtIHNzdF9oc3dfY2hhbm5lbF9pbmRleCB7CisJU1NUX0hTV19DSEFOTkVMX0xFRlQgICAgICAgICAgICA9IDAsCisJU1NUX0hTV19DSEFOTkVMX0NFTlRFUiAgICAgICAgICA9IDEsCisJU1NUX0hTV19DSEFOTkVMX1JJR0hUICAgICAgICAgICA9IDIsCisJU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgICA9IDMsCisJU1NUX0hTV19DSEFOTkVMX0NFTlRFUl9TVVJST1VORCA9IDMsCisJU1NUX0hTV19DSEFOTkVMX1JJR0hUX1NVUlJPVU5EICA9IDQsCisJU1NUX0hTV19DSEFOTkVMX0xGRSAgICAgICAgICAgICA9IDcsCisJU1NUX0hTV19DSEFOTkVMX0lOVkFMSUQgICAgICAgICA9IDB4RiwKK307CisKKy8qIExpc3Qgb2Ygc3VwcG9ydGVkIGNoYW5uZWwgbWFwcy4gKi8KK2VudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyB7CisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19NT05PICAgICAgPSAwLCAvKiBtb25vIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8gICAgPSAxLCAvKiBMICYgUi4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzJfUE9JTlRfMSA9IDIsIC8qIEwsIFIgJiBMRkU7IFBDTSBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfM19QT0lOVF8wID0gMywgLyogTCwgQyAmIFI7IE1QMyAmIEFBQyBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfM19QT0lOVF8xID0gNCwgLyogTCwgQywgUiAmIExGRTsgUENNIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19RVUFUUk8gICAgPSA1LCAvKiBMLCBSLCBMcyAmIFJzOyBQQ00gb25seS4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzRfUE9JTlRfMCA9IDYsIC8qIEwsIEMsIFIgJiBDczsgTVAzICYgQUFDIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR181X1BPSU5UXzAgPSA3LCAvKiBMLCBDLCBSLCBMcyAmIFJzLiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNV9QT0lOVF8xID0gOCwgLyogTCwgQywgUiwgTHMsIFJzICYgTEZFLiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfRFVBTF9NT05PID0gOSwgLyogT25lIGNoYW5uZWwgcmVwbGljYXRlZCBpbiB0d28uICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR19JTlZBTElELAorfTsKKworLyogTGlzdCBvZiBzdXBwb3J0ZWQgYml0IGRlcHRocy4gKi8KK2VudW0gc3N0X2hzd19iaXRkZXB0aCB7CisJU1NUX0hTV19ERVBUSF84QklUICA9IDgsCisJU1NUX0hTV19ERVBUSF8xNkJJVCA9IDE2LAorCVNTVF9IU1dfREVQVEhfMjRCSVQgPSAyNCwgLyogRGVmYXVsdC4gKi8KKwlTU1RfSFNXX0RFUFRIXzMyQklUID0gMzIsCisJU1NUX0hTV19ERVBUSF9JTlZBTElEID0gMzMsCit9OworCitlbnVtIHNzdF9oc3dfbW9kdWxlX2lkIHsKKwlTU1RfSFNXX01PRFVMRV9CQVNFX0ZXID0gMHgwLAorCVNTVF9IU1dfTU9EVUxFX01QMyAgICAgPSAweDEsCisJU1NUX0hTV19NT0RVTEVfQUFDXzVfMSA9IDB4MiwKKwlTU1RfSFNXX01PRFVMRV9BQUNfMl8wID0gMHgzLAorCVNTVF9IU1dfTU9EVUxFX1NSQyAgICAgPSAweDQsCisJU1NUX0hTV19NT0RVTEVfV0FWRVMgICA9IDB4NSwKKwlTU1RfSFNXX01PRFVMRV9ET0xCWSAgID0gMHg2LAorCVNTVF9IU1dfTU9EVUxFX0JPT1NUICAgPSAweDcsCisJU1NUX0hTV19NT0RVTEVfTFBBTCAgICA9IDB4OCwKKwlTU1RfSFNXX01PRFVMRV9EVFMgICAgID0gMHg5LAorCVNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFID0gMHhBLAorCVNTVF9IU1dfTU9EVUxFX1BDTV9TWVNURU0gPSAweEIsCisJU1NUX0hTV19NT0RVTEVfUENNX1JFRkVSRU5DRSA9IDB4QywKKwlTU1RfSFNXX01PRFVMRV9QQ00gPSAweEQsCisJU1NUX0hTV19NT0RVTEVfQkxVRVRPT1RIX1JFTkRFUl9NT0RVTEUgPSAweEUsCisJU1NUX0hTV19NT0RVTEVfQkxVRVRPT1RIX0NBUFRVUkVfTU9EVUxFID0gMHhGLAorCVNTVF9IU1dfTUFYX01PRFVMRV9JRCwKK307CisKK2VudW0gc3N0X2hzd19wZXJmb3JtYW5jZV9hY3Rpb24geworCVNTVF9IU1dfUEVSRl9TVEFSVCA9IDAsCisJU1NUX0hTV19QRVJGX1NUT1AgPSAxLAorfTsKKworLyogU1NUIGZpcm13YXJlIG1vZHVsZSBpbmZvICovCitzdHJ1Y3Qgc3N0X2hzd19tb2R1bGVfaW5mbyB7CisJdTggbmFtZVtTU1RfSFNXX01BWF9JTkZPX1NJWkVdOworCXU4IHZlcnNpb25bU1NUX0hTV19NQVhfSU5GT19TSVpFXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIE1vZHVsZSBlbnRyeSBwb2ludCAqLworc3RydWN0IHNzdF9oc3dfbW9kdWxlX2VudHJ5IHsKKwllbnVtIHNzdF9oc3dfbW9kdWxlX2lkIG1vZHVsZV9pZDsKKwl1MzIgZW50cnlfcG9pbnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBNb2R1bGUgbWFwIC0gYWxpZ25lbWVudCBtYXRjaGVzIERTUCAqLworc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCB7CisJdTggbW9kdWxlX2VudHJpZXNfY291bnQ7CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX2VudHJ5IG1vZHVsZV9lbnRyaWVzWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8geworCXUzMiBvZmZzZXQ7CisJdTMyIHNpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3N0X2hzd19meF9lbmFibGUgeworCXN0cnVjdCBzc3RfaHN3X21vZHVsZV9tYXAgbW9kdWxlX21hcDsKKwlzdHJ1Y3Qgc3N0X2hzd19tZW1vcnlfaW5mbyBwZXJzaXN0ZW50X21lbTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X2dldF9meF9wYXJhbSB7CisJdTMyIHBhcmFtZXRlcl9pZDsKKwl1MzIgcGFyYW1fc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X3BlcmZfYWN0aW9uIHsKKwl1MzIgYWN0aW9uOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfcGVyZl9kYXRhIHsKKwl1NjQgdGltZXN0YW1wOworCXU2NCBjeWNsZXM7CisJdTY0IGRhdGF0aW1lOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRlcgdmVyc2lvbiAqLworc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb24geworCXU4IGJ1aWxkOworCXU4IG1pbm9yOworCXU4IG1ham9yOworCXU4IHR5cGU7CisJdTggZndfYnVpbGRfaGFzaFtTU1RfSFNXX0JVSUxEX0hBU0hfTEVOR1RIXTsKKwl1MzIgZndfbG9nX3Byb3ZpZGVyc19oYXNoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIHJpbmcgaW5mbyAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9yaW5nIHsKKwl1MzIgcmluZ19wdF9hZGRyZXNzOworCXUzMiBudW1fcGFnZXM7CisJdTMyIHJpbmdfc2l6ZTsKKwl1MzIgcmluZ19vZmZzZXQ7CisJdTMyIHJpbmdfZmlyc3RfcGZuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRGVidWcgRHVtcCBMb2cgRW5hYmxlIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19kZWJ1Z19sb2dfZW5hYmxlX3JlcSB7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9yaW5nIHJpbmdpbmZvOworCXUzMiBjb25maWdbU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZWJ1ZyBEdW1wIExvZyBSZXBseSAqLworc3RydWN0IHNzdF9oc3dfaXBjX2RlYnVnX2xvZ19yZXBseSB7CisJdTMyIGxvZ19idWZmZXJfYmVnaW5pbmc7CisJdTMyIGxvZ19idWZmZXJfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBnbGl0Y2ggcG9zaXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2xpdGNoX3Bvc2l0aW9uIHsKKwl1MzIgZ2xpdGNoX3R5cGU7CisJdTMyIHByZXNlbnRfcG9zOworCXUzMiB3cml0ZV9wb3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gZ2V0IHBvc2l0aW9uICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dldF9wb3NpdGlvbiB7CisJdTMyIHBvc2l0aW9uOworCXUzMiBmd19jeWNsZV9jb3VudDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBzZXQgcG9zaXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fc2V0X3Bvc2l0aW9uIHsKKwl1MzIgcG9zaXRpb247CisJdTMyIGVuZF9vZl9idWZmZXI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gRnJlZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2ZyZWVfcmVxIHsKKwl1OCBzdHJlYW1faWQ7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTZXQgVm9sdW1lIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxIHsKKwl1MzIgY2hhbm5lbDsKKwl1MzIgdGFyZ2V0X3ZvbHVtZTsKKwl1NjQgY3VydmVfZHVyYXRpb247CisJdTMyIGN1cnZlX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZXZpY2UgQ29uZmlndXJhdGlvbiBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZGV2aWNlX2NvbmZpZ19yZXEgeworCXUzMiBzc3BfaW50ZXJmYWNlOworCXUzMiBjbG9ja19mcmVxdWVuY3k7CisJdTMyIG1vZGU7CisJdTE2IGNsb2NrX2RpdmlkZXI7CisJdTE2IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQXVkaW8gRGF0YSBmb3JtYXRzICovCitzdHJ1Y3Qgc3N0X2hzd19hdWRpb19kYXRhX2Zvcm1hdF9pcGMgeworCXUzMiBmcmVxdWVuY3k7CisJdTMyIGJpdGRlcHRoOworCXUzMiBtYXA7CisJdTMyIGNvbmZpZzsKKwl1MzIgc3R5bGU7CisJdTggY2hfbnVtOworCXU4IHZhbGlkX2JpdDsKKwl1OCByZXNlcnZlZFsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBBbGxvY2F0ZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSB7CisJdTggcGF0aF9pZDsKKwl1OCBzdHJlYW1fdHlwZTsKKwl1OCBmb3JtYXRfaWQ7CisJdTggcmVzZXJ2ZWQ7CisJc3RydWN0IHNzdF9oc3dfYXVkaW9fZGF0YV9mb3JtYXRfaXBjIGZvcm1hdDsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3JpbmcgcmluZ2luZm87CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCBtYXA7CisJc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gcGVyc2lzdGVudF9tZW07CisJc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gc2NyYXRjaF9tZW07CisJdTMyIG51bWJlcl9vZl9ub3RpZmljYXRpb25zOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIEFsbG9jYXRlIFJlcGx5ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcGx5IHsKKwl1MzIgc3RyZWFtX2h3X2lkOworCXUzMiBtaXhlcl9od19pZDsgLy8gcmV0dXJucyByYXRlID8/Pz8KKwl1MzIgcmVhZF9wb3NpdGlvbl9yZWdpc3Rlcl9hZGRyZXNzOworCXUzMiBwcmVzZW50YXRpb25fcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKKwl1MzIgcGVha19tZXRlcl9yZWdpc3Rlcl9hZGRyZXNzW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOworCXUzMiB2b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIEdldCBNaXhlciBTdHJlYW0gSW5mbyAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IHsKKwl1MzIgbWl4ZXJfaHdfaWQ7CisJdTMyIHBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgdm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbU1NUX0hTV19OT19DSEFOTkVMU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEWCBTdGF0ZSBSZXF1ZXN0ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVxIHsKKwl1OCBzdGF0ZTsKKwl1OCByZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERYIFN0YXRlIFJlcGx5IE1lbW9yeSBJbmZvIEl0ZW0gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSB7CisJdTMyIG9mZnNldDsKKwl1MzIgc2l6ZTsKKwl1MzIgc291cmNlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRFggU3RhdGUgUmVwbHkgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSB7CisJdTMyIGVudHJpZXNfbm87CisJc3RydWN0IHNzdF9oc3dfaXBjX2R4X21lbW9yeV9pdGVtIG1lbV9pbmZvW1NTVF9IU1dfTUFYX0RYX1JFR0lPTlNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb247CisKKy8qIFNTVCBJbml0ICYgRnJlZSAqLworc3RydWN0IHNzdF9oc3cgKnNzdF9oc3dfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgdTggKmZ3LCBzaXplX3QgZndfbGVuZ3RoLAorCXUzMiBmd19vZmZzZXQpOwordm9pZCBzc3RfaHN3X2ZyZWUoc3RydWN0IHNzdF9oc3cgKmhzdyk7CitpbnQgc3N0X2hzd19md19nZXRfdmVyc2lvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uICp2ZXJzaW9uKTsKK3UzMiBjcmVhdGVfY2hhbm5lbF9tYXAoZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZyk7CisKKy8qIFN0cmVhbSBNaXhlciBDb250cm9scyAtICovCitpbnQgc3N0X2hzd19zdHJlYW1fbXV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsKTsKK2ludCBzc3RfaHN3X3N0cmVhbV91bm11dGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCk7CisKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsIHUzMiB2b2x1bWUpOworaW50IHNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyICp2b2x1bWUpOworCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZV9jdXJ2ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1NjQgY3VydmVfZHVyYXRpb24sCisJZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZSk7CisKKy8qIEdsb2JhbCBNaXhlciBDb250cm9scyAtICovCitpbnQgc3N0X2hzd19taXhlcl9tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpOworaW50IHNzdF9oc3dfbWl4ZXJfdW5tdXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwpOworCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyIHZvbHVtZSk7CitpbnQgc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyICp2b2x1bWUpOworCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lX2N1cnZlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJdTY0IGN1cnZlX2R1cmF0aW9uLCBlbnVtIHNzdF9oc3dfdm9sdW1lX2N1cnZlIGN1cnZlKTsKKworLyogU3RyZWFtIEFQSSAqLworc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzc3RfaHN3X3N0cmVhbV9uZXcoc3RydWN0IHNzdF9oc3cgKmhzdywgaW50IGlkLAorCXUzMiAoKmdldF93cml0ZV9wb3NpdGlvbikoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpLAorCXZvaWQgKmRhdGEpOworCitpbnQgc3N0X2hzd19zdHJlYW1fZnJlZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7CisKKy8qIFN0cmVhbSBDb25maWd1cmF0aW9uICovCitpbnQgc3N0X2hzd19zdHJlYW1fZm9ybWF0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkLAorCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZSwKKwllbnVtIHNzdF9oc3dfc3RyZWFtX2Zvcm1hdCBmb3JtYXRfaWQpOworCitpbnQgc3N0X2hzd19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiByaW5nX3B0X2FkZHJlc3MsIHUzMiBudW1fcGFnZXMsCisJdTMyIHJpbmdfc2l6ZSwgdTMyIHJpbmdfb2Zmc2V0LCB1MzIgcmluZ19maXJzdF9wZm4pOworCitpbnQgc3N0X2hzd19zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwl1MzIgYml0cyk7CitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJaW50IHJhdGUpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9iaXRzKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19iaXRkZXB0aCBiaXRzKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfY2hhbm5lbHMoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgaW50IGNoYW5uZWxzKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfbWFwX2NvbmZpZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgbWFwLAorCWVudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyBjb25maWcpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zdHlsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwllbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHN0eWxlKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgZW51bSBzc3RfaHN3X21vZHVsZV9pZCBtb2R1bGVfaWQsCisJdTMyIGVudHJ5X3BvaW50KTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfc21lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9nZXRfaHdfaWQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7CitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X21peGVyX2lkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOwordTMyIHNzdF9oc3dfc3RyZWFtX2dldF9yZWFkX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfcG9pbnRlcl9yZWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7Cit1MzIgc3N0X2hzd19zdHJlYW1fZ2V0X3BlYWtfcmVnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBjaGFubmVsKTsKK3UzMiBzc3RfaHN3X3N0cmVhbV9nZXRfdm9sX3JlZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgY2hhbm5lbCk7CitpbnQgc3N0X2hzd19taXhlcl9nZXRfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKKworLyogU3RyZWFtIEFMU0EgdHJpZ2dlciBvcGVyYXRpb25zICovCitpbnQgc3N0X2hzd19zdHJlYW1fcGF1c2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJaW50IHdhaXQpOworaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCk7CitpbnQgc3N0X2hzd19zdHJlYW1fcmVzZXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOworCisvKiBTdHJlYW0gcG9pbnRlciBwb3NpdGlvbnMgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9nZXRfcmVhZF9wb3Moc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyICpwb3NpdGlvbik7CitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3dyaXRlX3BvcyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgKnBvc2l0aW9uKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfd3JpdGVfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgcG9zaXRpb24pOworaW50IHNzdF9oc3dfZ2V0X2RzcF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKKworLyogSFcgcG9ydCBjb25maWcgKi8KK2ludCBzc3RfaHN3X2RldmljZV9zZXRfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJZW51bSBzc3RfaHN3X2RldmljZV9pZCBkZXYsIGVudW0gc3N0X2hzd19kZXZpY2VfbWNsayBtY2xrLAorCWVudW0gc3N0X2hzd19kZXZpY2VfbW9kZSBtb2RlLCB1MzIgY2xvY2tfZGl2aWRlcik7CisKKy8qIERYIENvbmZpZyAqLworaW50IHNzdF9oc3dfZHhfc2V0X3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJZW51bSBzc3RfaHN3X2R4X3N0YXRlIHN0YXRlLCBzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVwbHkgKmR4KTsKK2ludCBzc3RfaHN3X2R4X2dldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaXRlbSwKKwl1MzIgKm9mZnNldCwgdTMyICpzaXplLCB1MzIgKnNvdXJjZSk7CisKKy8qIGluaXQgKi8KK2ludCBzc3RfaHN3X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwordm9pZCBzc3RfaHN3X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOworc3RydWN0IHNzdF9kc3AgKnNzdF9oc3dfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKK3ZvaWQgc3N0X2hzd19zZXRfc2NyYXRjaF9tb2R1bGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqc2NyYXRjaCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzJkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtcGNtLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiBJbnRlbCBTU1QgSGFzd2VsbC9Ccm9hZHdlbGwgUENNIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorCisjaW5jbHVkZSAic3N0LWhhc3dlbGwtaXBjLmgiCisjaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCisjZGVmaW5lIEhTV19QQ01fQ09VTlQJCTYKKyNkZWZpbmUgSFNXX1ZPTFVNRV9NQVgJCTB4N0ZGRkZGRkYJLyogMGRCICovCisKKy8qIHNpbXBsZSB2b2x1bWUgdGFibGUgKi8KK3N0YXRpYyBjb25zdCB1MzIgdm9sdW1lX21hcFtdID0geworCUhTV19WT0xVTUVfTUFYID4+IDMwLAorCUhTV19WT0xVTUVfTUFYID4+IDI5LAorCUhTV19WT0xVTUVfTUFYID4+IDI4LAorCUhTV19WT0xVTUVfTUFYID4+IDI3LAorCUhTV19WT0xVTUVfTUFYID4+IDI2LAorCUhTV19WT0xVTUVfTUFYID4+IDI1LAorCUhTV19WT0xVTUVfTUFYID4+IDI0LAorCUhTV19WT0xVTUVfTUFYID4+IDIzLAorCUhTV19WT0xVTUVfTUFYID4+IDIyLAorCUhTV19WT0xVTUVfTUFYID4+IDIxLAorCUhTV19WT0xVTUVfTUFYID4+IDIwLAorCUhTV19WT0xVTUVfTUFYID4+IDE5LAorCUhTV19WT0xVTUVfTUFYID4+IDE4LAorCUhTV19WT0xVTUVfTUFYID4+IDE3LAorCUhTV19WT0xVTUVfTUFYID4+IDE2LAorCUhTV19WT0xVTUVfTUFYID4+IDE1LAorCUhTV19WT0xVTUVfTUFYID4+IDE0LAorCUhTV19WT0xVTUVfTUFYID4+IDEzLAorCUhTV19WT0xVTUVfTUFYID4+IDEyLAorCUhTV19WT0xVTUVfTUFYID4+IDExLAorCUhTV19WT0xVTUVfTUFYID4+IDEwLAorCUhTV19WT0xVTUVfTUFYID4+IDksCisJSFNXX1ZPTFVNRV9NQVggPj4gOCwKKwlIU1dfVk9MVU1FX01BWCA+PiA3LAorCUhTV19WT0xVTUVfTUFYID4+IDYsCisJSFNXX1ZPTFVNRV9NQVggPj4gNSwKKwlIU1dfVk9MVU1FX01BWCA+PiA0LAorCUhTV19WT0xVTUVfTUFYID4+IDMsCisJSFNXX1ZPTFVNRV9NQVggPj4gMiwKKwlIU1dfVk9MVU1FX01BWCA+PiAxLAorCUhTV19WT0xVTUVfTUFYID4+IDAsCit9OworCisjZGVmaW5lIEhTV19QQ01fUEVSSU9EU19NQVgJNjQKKyNkZWZpbmUgSFNXX1BDTV9QRVJJT0RTX01JTgkyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBoc3dfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSB8CisJCQkJICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkucGVyaW9kX2J5dGVzX21pbgk9IFBBR0VfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heAk9IChIU1dfUENNX1BFUklPRFNfTUFYIC8gSFNXX1BDTV9QRVJJT0RTX01JTikgKiBQQUdFX1NJWkUsCisJLnBlcmlvZHNfbWluCQk9IEhTV19QQ01fUEVSSU9EU19NSU4sCisJLnBlcmlvZHNfbWF4CQk9IEhTV19QQ01fUEVSSU9EU19NQVgsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSBIU1dfUENNX1BFUklPRFNfTUFYICogUEFHRV9TSVpFLAorfTsKKworLyogcHJpdmF0ZSBkYXRhIGZvciBlYWNoIFBDTSBEU1Agc3RyZWFtICovCitzdHJ1Y3QgaHN3X3BjbV9kYXRhIHsKKwlpbnQgZGFpX2lkOworCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOworCXUzMiB2b2x1bWVbMl07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW07CisJdW5zaWduZWQgaW50IHdwb3M7CisJc3RydWN0IG11dGV4IG11dGV4OworfTsKKworLyogcHJpdmF0ZSBkYXRhIGZvciB0aGUgZHJpdmVyICovCitzdHJ1Y3QgaHN3X3ByaXZfZGF0YSB7CisJLyogcnVudGltZSBEU1AgKi8KKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3OworCisJLyogcGFnZSB0YWJsZXMgKi8KKwl1bnNpZ25lZCBjaGFyICpwY21fcGdbSFNXX1BDTV9DT1VOVF1bMl07CisKKwkvKiBEQUkgZGF0YSAqLworCXN0cnVjdCBoc3dfcGNtX2RhdGEgcGNtW0hTV19QQ01fQ09VTlRdOworfTsKKworc3RhdGljIGlubGluZSB1MzIgaHN3X21peGVyX3RvX2lwYyh1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJaWYgKHZhbHVlID49IEFSUkFZX1NJWkUodm9sdW1lX21hcCkpCisJCXJldHVybiB2b2x1bWVfbWFwWzBdOworCWVsc2UKKwkJcmV0dXJuIHZvbHVtZV9tYXBbdmFsdWVdOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBoc3dfaXBjX3RvX21peGVyKHUzMiB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZvbHVtZV9tYXApOyBpKyspIHsKKwkJaWYgKHZvbHVtZV9tYXBbaV0gPj0gdmFsdWUpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gaSAtIDE7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3N0cmVhbV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhID0gJnBkYXRhLT5wY21bbWMtPnJlZ107CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJdTMyIHZvbHVtZTsKKworCW11dGV4X2xvY2soJnBjbV9kYXRhLT5tdXRleCk7CisKKwlpZiAoIXBjbV9kYXRhLT5zdHJlYW0pIHsKKwkJcGNtX2RhdGEtPnZvbHVtZVswXSA9CisJCQloc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJcGNtX2RhdGEtPnZvbHVtZVsxXSA9CisJCQloc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKwkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKKwkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAyLCB2b2x1bWUpOworCX0gZWxzZSB7CisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMCwgdm9sdW1lKTsKKwkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAxLCB2b2x1bWUpOworCX0KKworCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfc3RyZWFtX3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVttYy0+cmVnXTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1MzIgdm9sdW1lOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKworCWlmICghcGNtX2RhdGEtPnN0cmVhbSkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMF0pOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMV0pOworCQltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAwLCAmdm9sdW1lKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhzd19pcGNfdG9fbWl4ZXIodm9sdW1lKTsKKwlzc3RfaHN3X3N0cmVhbV9nZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMSwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3ZvbHVtZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCXUzMiB2b2x1bWU7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKKworCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKGhzdywgMCwgMiwgdm9sdW1lKTsKKworCX0gZWxzZSB7CisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAwLCB2b2x1bWUpOworCisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAxLCB2b2x1bWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd192b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPSBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lID0gMDsKKworCXNzdF9oc3dfbWl4ZXJfZ2V0X3ZvbHVtZShoc3csIDAsIDAsICZ2b2x1bWUpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHN3X2lwY190b19taXhlcih2b2x1bWUpOworCisJc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKGhzdywgMCwgMSwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVExWIHVzZWQgYnkgYm90aCBnbG9iYWwgYW5kIHN0cmVhbSB2b2x1bWVzICovCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHN3X3ZvbF90bHYsIC05MDAwLCAzMDAsIDEpOworCisvKiBTeXN0ZW0gUGluIGhhcyBubyB2b2x1bWUgY29udHJvbCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhzd192b2x1bWVfY29udHJvbHNbXSA9IHsKKwkvKiBHbG9iYWwgRFNQIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIDAsIDgsCisJCUFSUkFZX1NJWkUodm9sdW1lX21hcCkgLTEsIDAsCisJCWhzd192b2x1bWVfZ2V0LCBoc3dfdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE9mZmxvYWQgMCB2b2x1bWUgKi8KKwlTT0NfRE9VQkxFX0VYVF9UTFYoIk1lZGlhMCBQbGF5YmFjayBWb2x1bWUiLCAxLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE9mZmxvYWQgMSB2b2x1bWUgKi8KKwlTT0NfRE9VQkxFX0VYVF9UTFYoIk1lZGlhMSBQbGF5YmFjayBWb2x1bWUiLCAyLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIExvb3BiYWNrIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTG9vcGJhY2sgQ2FwdHVyZSBWb2x1bWUiLCAzLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApLCAwLAorCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE1pYyBDYXB0dXJlIHZvbHVtZSAqLworCVNPQ19ET1VCTEVfRVhUX1RMVigiTWljIENhcHR1cmUgVm9sdW1lIiwgNCwgMCwgOCwKKwkJQVJSQVlfU0laRSh2b2x1bWVfbWFwKSwgMCwKKwkJaHN3X3N0cmVhbV92b2x1bWVfZ2V0LCBoc3dfc3RyZWFtX3ZvbHVtZV9wdXQsIGhzd192b2xfdGx2KSwKK307CisKKy8qIENyZWF0ZSBETUEgYnVmZmVyIHBhZ2UgdGFibGUgZm9yIERTUCAqLworc3RhdGljIGludCBjcmVhdGVfYWRzcF9wYWdlX3RhYmxlKHN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSwKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhLCBzaXplX3Qgc2l6ZSwgaW50IHBjbSwgaW50IHN0cmVhbSkKK3sKKwlpbnQgaSwgcGFnZXM7CisKKwlpZiAoc2l6ZSAlIFBBR0VfU0laRSkKKwkJcGFnZXMgPSAoc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWVsc2UKKwkJcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFOworCisJZGV2X2RiZyhydGQtPmRldiwgImdlbmVyYXRpbmcgcGFnZSB0YWJsZSBmb3IgJXAgc2l6ZSAweCV6dSBwYWdlcyAlZFxuIiwKKwkJZG1hX2FyZWEsIHNpemUsIHBhZ2VzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCXUzMiBpZHggPSAoKChpIDw8IDIpICsgaSkpID4+IDE7CisJCXUzMiBwZm4gPSAodmlydF90b19waHlzKGRtYV9hcmVhICsgaSAqIFBBR0VfU0laRSkpID4+IFBBR0VfU0hJRlQ7CisJCXUzMiAqcGdfdGFibGU7CisKKwkJZGV2X2RiZyhydGQtPmRldiwgInBmbiBpICVpIGlkeCAlZCBwZm4gJXhcbiIsIGksIGlkeCwgcGZuKTsKKworCQlwZ190YWJsZSA9ICh1MzIqKShwZGF0YS0+cGNtX3BnW3BjbV1bc3RyZWFtXSArIGlkeCk7CisKKwkJaWYgKGkgJiAxKQorCQkJKnBnX3RhYmxlIHw9IChwZm4gPDwgNCk7CisJCWVsc2UKKwkJCSpwZ190YWJsZSB8PSBwZm47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgbWF5IGdldCBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBieSBvc3MgZW11bGF0aW9uICovCitzdGF0aWMgaW50IGhzd19wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZV9kYXRhOworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJZW51bSBzc3RfaHN3X3N0cmVhbV90eXBlIHN0cmVhbV90eXBlOworCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkOworCXUzMiByYXRlLCBiaXRzLCBtYXAsIHBhZ2VzLCBtb2R1bGVfaWQ7CisJdTggY2hhbm5lbHM7CisJaW50IHJldDsKKworCS8qIHN0cmVhbSBkaXJlY3Rpb24gKi8KKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7CisJZWxzZQorCQlwYXRoX2lkID0gU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX0lOOworCisJLyogRFNQIHN0cmVhbSB0eXBlIGRlcGVuZHMgb24gREFJIElEICovCisJc3dpdGNoIChydGQtPmNwdV9kYWktPmlkKSB7CisJY2FzZSAwOgorCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfU1lTVEVNOworCQltb2R1bGVfaWQgPSBTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNOworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfUkVOREVSOworCQltb2R1bGVfaWQgPSBTU1RfSFNXX01PRFVMRV9QQ007CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogcGF0aCBJRCBuZWVkcyB0byBiZSBPVVQgZm9yIGxvb3BiYWNrICovCisJCXN0cmVhbV90eXBlID0gU1NUX0hTV19TVFJFQU1fVFlQRV9MT09QQkFDSzsKKwkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7CisJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9SRUZFUkVOQ0U7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3RyZWFtX3R5cGUgPSBTU1RfSFNXX1NUUkVBTV9UWVBFX0NBUFRVUkU7CisJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgREFJIElEICVkXG4iLAorCQkJcnRkLT5jcHVfZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9mb3JtYXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlwYXRoX2lkLCBzdHJlYW1fdHlwZSwgU1NUX0hTV19TVFJFQU1fRk9STUFUX1BDTV9GT1JNQVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHNldCBmb3JtYXQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCByYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgcmF0ZSAlZFxuIiwgcmF0ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQliaXRzID0gU1NUX0hTV19ERVBUSF8xNkJJVDsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMTYpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRzID0gU1NUX0hTV19ERVBUSF8yNEJJVDsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgZm9ybWF0ICVkXG4iLAorCQkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCBiaXRzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgYml0cyAlZFxuIiwgYml0cyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2Ugb25seSBzdXBwb3J0IHN0ZXJlbyBhdG0gKi8KKwljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWlmIChjaGFubmVscyAhPSAyKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogaW52YWxpZCBjaGFubmVscyAlZFxuIiwgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXAgPSBjcmVhdGVfY2hhbm5lbF9tYXAoU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8pOworCXNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCW1hcCwgU1NUX0hTV19DSEFOTkVMX0NPTkZJR19TVEVSRU8pOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgY2hhbm5lbHMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogY291bGQgbm90IHNldCBjaGFubmVscyAlZFxuIiwKKwkJCWNoYW5uZWxzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogY291bGQgbm90IGFsbG9jYXRlICVkIGJ5dGVzIGZvciBQQ00gJWRcbiIsCisJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyksIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY3JlYXRlX2Fkc3BfcGFnZV90YWJsZShwZGF0YSwgcnRkLCBydW50aW1lLT5kbWFfYXJlYSwKKwkJcnVudGltZS0+ZG1hX2J5dGVzLCBydGQtPmNwdV9kYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzc3RfaHN3X3N0cmVhbV9zZXRfc3R5bGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCk7CisKKwlpZiAocnVudGltZS0+ZG1hX2J5dGVzICUgUEFHRV9TSVpFKQorCQlwYWdlcyA9IChydW50aW1lLT5kbWFfYnl0ZXMgLyBQQUdFX1NJWkUpICsgMTsKKwllbHNlCisJCXBhZ2VzID0gcnVudGltZS0+ZG1hX2J5dGVzIC8gUEFHRV9TSVpFOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fYnVmZmVyKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJdmlydF90b19waHlzKHBkYXRhLT5wY21fcGdbcnRkLT5jcHVfZGFpLT5pZF1bc3Vic3RyZWFtLT5zdHJlYW1dKSwKKwkJcGFnZXMsIHJ1bnRpbWUtPmRtYV9ieXRlcywgMCwKKwkJKHUzMikodmlydF90b19waHlzKHJ1bnRpbWUtPmRtYV9hcmVhKSA+PiBQQUdFX1NISUZUKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IERNQSBidWZmZXIgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZHNwID0gc3N0X2hzd19nZXRfZHNwKGhzdyk7CisKKwltb2R1bGVfZGF0YSA9IHNzdF9tb2R1bGVfZ2V0X2Zyb21faWQoZHNwLCBtb2R1bGVfaWQpOworCWlmIChtb2R1bGVfZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBtb2R1bGUgY29uZmlnXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogd2UgdXNlIGhhcmRjb2RlZCBtZW1vcnkgb2Zmc2V0cyBhdG0sIHdpbGwgYmUgdXBkYXRlZCBmb3IgbmV3IEZXICovCisJaWYgKHN0cmVhbV90eXBlID09IFNTVF9IU1dfU1RSRUFNX1RZUEVfQ0FQVFVSRSkgeworCQlzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJU1NUX0hTV19NT0RVTEVfUENNX0NBUFRVUkUsIG1vZHVsZV9kYXRhLT5lbnRyeSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF9wbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJMHg0NDk0MDAsIDB4NDAwMCk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF9zbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJMHg0MDAwMDAsIDApOworCX0gZWxzZSB7IC8qIHN0cmVhbV90eXBlID09IFNTVF9IU1dfU1RSRUFNX1RZUEVfU1lTVEVNICovCisJCXNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhoc3csIHBjbV9kYXRhLT5zdHJlYW0sCisJCQlTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNLCBtb2R1bGVfZGF0YS0+ZW50cnkpOworCisJCXNzdF9oc3dfc3RyZWFtX3NldF9wbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJbW9kdWxlX2RhdGEtPm9mZnNldCwgbW9kdWxlX2RhdGEtPnNpemUpOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCTB4NDRkNDAwLCAweDM4MDApOworCisJCXNzdF9oc3dfc3RyZWFtX3NldF9zbWVtb3J5X2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJbW9kdWxlX2RhdGEtPm9mZnNldCwgbW9kdWxlX2RhdGEtPnNpemUpOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfc21lbW9yeV9pbmZvKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCTB4NDAwMDAwLCAwKTsKKwl9CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9jb21taXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjb21taXQgc3RyZWFtICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX3BhdXNlKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHBhdXNlICVkXG4iLCByZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShydGQpOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc3N0X2hzd19zdHJlYW1fcmVzdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlzc3RfaHN3X3N0cmVhbV9wYXVzZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBoc3dfbm90aWZ5X3BvaW50ZXIoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGEgPSBkYXRhOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtX2RhdGEtPnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwl1MzIgcG9zOworCisJcG9zID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsCisJCShydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciAlIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBBcHAgcG9pbnRlciAlZCBieXRlc1xuIiwgcG9zKTsKKworCS8qIGxldCBhbHNhIGtub3cgd2UgaGF2ZSBwbGF5IGEgcGVyaW9kICovCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBoc3dfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHJ0ZCk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0OworCisJb2Zmc2V0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsCisJCXNzdF9oc3dfZ2V0X2RzcF9wb3NpdGlvbihoc3csIHBjbV9kYXRhLT5zdHJlYW0pKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IERNQSBwb2ludGVyICV6dSBieXRlc1xuIiwKKwkJZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsICh1MzIpb2Zmc2V0KSk7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisKKwlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW3J0ZC0+Y3B1X2RhaS0+aWRdOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKworCXNuZF9zb2NfcGNtX3NldF9kcnZkYXRhKHJ0ZCwgcGNtX2RhdGEpOworCXBjbV9kYXRhLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJmhzd19wY21faGFyZHdhcmUpOworCisJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9oc3dfc3RyZWFtX25ldyhoc3csIHJ0ZC0+Y3B1X2RhaS0+aWQsCisJCWhzd19ub3RpZnlfcG9pbnRlciwgcGNtX2RhdGEpOworCWlmIChwY21fZGF0YS0+c3RyZWFtID09IE5VTEwpIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IHByZXZpb3VzIHNhdmVkIHZvbHVtZSAqLworCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLAorCQkJMCwgcGNtX2RhdGEtPnZvbHVtZVswXSk7CisJc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDAsCisJCQkxLCBwY21fZGF0YS0+dm9sdW1lWzFdKTsKKworCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEocnRkKTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9yZXNldChoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogcmVzZXQgc3RyZWFtIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fZnJlZShoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogZnJlZSBzdHJlYW0gZmFpbGVkICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJcGNtX2RhdGEtPnN0cmVhbSA9IE5VTEw7CisKK291dDoKKwltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBoc3dfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBoc3dfcGNtX29wZW4sCisJLmNsb3NlCQk9IGhzd19wY21fY2xvc2UsCisJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMJPSBoc3dfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IGhzd19wY21faHdfZnJlZSwKKwkudHJpZ2dlcgk9IGhzd19wY21fdHJpZ2dlciwKKwkucG9pbnRlcgk9IGhzd19wY21fcG9pbnRlciwKKwkubW1hcAkJPSBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAsCit9OworCitzdGF0aWMgdm9pZCBoc3dfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBoc3dfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGRtYV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQocnRkLT5jYXJkLT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAorCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CisJCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJU05EUlZfRE1BX1RZUEVfREVWLAorCQkJcnRkLT5jYXJkLT5kZXYsCisJCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgsCisJCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSFNXX0ZPUk1BVFMgXAorCShTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8XAorCSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgaHN3X2RhaXNbXSA9IHsKKwl7CisJCS5uYW1lICA9ICJTeXN0ZW0gUGluIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCX0sCisJeworCQkvKiBQQ00gKi8KKwkJLm5hbWUgID0gIk9mZmxvYWQwIFBpbiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMCBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkvKiBQQ00gKi8KKwkJLm5hbWUgID0gIk9mZmxvYWQxIFBpbiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiTG9vcGJhY2sgUGluIiwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTG9vcGJhY2sgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiQ2FwdHVyZSBQaW4iLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBbmFsb2cgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd2lkZ2V0c1tdID0geworCisJLyogQmFja2VuZCBEQUlzICAqLworCVNORF9TT0NfREFQTV9BSUZfSU4oIlNTUDAgQ09ERUMgSU4iLCBOVUxMLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTU1AwIENPREVDIE9VVCIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU1NQMSBCVCBJTiIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNTUDEgQlQgT1VUIiwgTlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIEdsb2JhbCBQbGF5YmFjayBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUGxheWJhY2sgVk1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGdyYXBoW10gPSB7CisKKwkvKiBQbGF5YmFjayBNaXhlciAqLworCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIlN5c3RlbSBQbGF5YmFjayJ9LAorCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIk9mZmxvYWQwIFBsYXliYWNrIn0sCisJeyJQbGF5YmFjayBWTWl4ZXIiLCBOVUxMLCAiT2ZmbG9hZDEgUGxheWJhY2sifSwKKworCXsiU1NQMCBDT0RFQyBPVVQiLCBOVUxMLCAiUGxheWJhY2sgVk1peGVyIn0sCisKKwl7IkFuYWxvZyBDYXB0dXJlIiwgTlVMTCwgIlNTUDAgQ09ERUMgSU4ifSwKK307CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHBsYXRmb3JtLT5kZXYpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwcml2X2RhdGE7CisJaW50IGk7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhwbGF0Zm9ybS0+ZGV2LCBzaXplb2YoKnByaXZfZGF0YSksIEdGUF9LRVJORUwpOworCXByaXZfZGF0YS0+aHN3ID0gcGRhdGEtPmRzcDsKKwlzbmRfc29jX3BsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRmb3JtLCBwcml2X2RhdGEpOworCisJLyogYWxsb2NhdGUgRFNQIGJ1ZmZlciBwYWdlIHRhYmxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhzd19kYWlzKTsgaSsrKSB7CisKKwkJbXV0ZXhfaW5pdCgmcHJpdl9kYXRhLT5wY21baV0ubXV0ZXgpOworCisJCS8qIHBsYXliYWNrICovCisJCWlmIChoc3dfZGFpc1tpXS5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKKwkJCXByaXZfZGF0YS0+cGNtX3BnW2ldWzBdID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9ETUEpOworCQkJaWYgKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBjYXB0dXJlICovCisJCWlmIChoc3dfZGFpc1tpXS5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCQkJcHJpdl9kYXRhLT5wY21fcGdbaV1bMV0gPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0RNQSk7CisJCQlpZiAocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0gPT0gTlVMTCkKKwkJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnI6CisJZm9yICg7aSA+PSAwOyBpLS0pIHsKKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJCWtmcmVlKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdKTsKKwkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQkJa2ZyZWUocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0pOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnByaXZfZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHN3X2RhaXMpOyBpKyspIHsKKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJCWtmcmVlKHByaXZfZGF0YS0+cGNtX3BnW2ldWzBdKTsKKwkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQkJa2ZyZWUocHJpdl9kYXRhLT5wY21fcGdbaV1bMV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGhzd19zb2NfcGxhdGZvcm0gPSB7CisJLnByb2JlCQk9IGhzd19wY21fcHJvYmUsCisJLnJlbW92ZQkJPSBoc3dfcGNtX3JlbW92ZSwKKwkub3BzCQk9ICZoc3dfcGNtX29wcywKKwkucGNtX25ldwk9IGhzd19wY21fbmV3LAorCS5wY21fZnJlZQk9IGhzd19wY21fZnJlZSwKKwkuY29udHJvbHMJPSBoc3dfdm9sdW1lX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKGhzd192b2x1bWVfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMJPSB3aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJPSBncmFwaCwKKwkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShncmFwaCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBoc3dfZGFpX2NvbXBvbmVudCA9IHsKKwkubmFtZQkJPSAiaGFzd2VsbC1kYWkiLAorfTsKKworc3RhdGljIGludCBoc3dfcGNtX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9oc3dfZHNwX2luaXQoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZoc3dfc29jX3BsYXRmb3JtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGxhdDsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZoc3dfZGFpX2NvbXBvbmVudCwKKwkJaHN3X2RhaXMsIEFSUkFZX1NJWkUoaHN3X2RhaXMpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfY29tcDsKKworCXJldHVybiAwOworCitlcnJfY29tcDoKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CitlcnJfcGxhdDoKKwlzc3RfaHN3X2RzcF9mcmVlKCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOworCXNzdF9oc3dfZHNwX2ZyZWUoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoc3dfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisKKwkucHJvYmUgPSBoc3dfcGNtX2Rldl9wcm9iZSwKKwkucmVtb3ZlID0gaHN3X3BjbV9kZXZfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaHN3X3BjbV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBYaW5nY2hhbyBXYW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhc3dlbGwvTHlueHBvaW50ICsgQnJvYWR3ZWxsL1dpbGRjYXRwb2ludCBQQ00iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGFzd2VsbC1wY20tYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1kc3AuaCBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjYzZWRjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLWRzcC5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9fU1NUX01GTERfRFNQX0hfXworI2RlZmluZSBfX1NTVF9NRkxEX0RTUF9IX18KKy8qCisgKiAgc3N0X21mbGRfZHNwLmggLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTEyIEludGVsIENvcnBvcmF0aW9uCisgKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBsaW51eC5pbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworZW51bSBzc3RfY29kZWNfdHlwZXMgeworCS8qICBBVURJTy9NVVNJQwlDT0RFQyBUeXBlIERlZmluaXRpb25zICovCisJU1NUX0NPREVDX1RZUEVfVU5LTk9XTiA9IDAsCisJU1NUX0NPREVDX1RZUEVfUENNLAkvKiBQYXNzIHRocm91Z2ggQXVkaW8gY29kZWMgKi8KKwlTU1RfQ09ERUNfVFlQRV9NUDMsCisJU1NUX0NPREVDX1RZUEVfTVAyNCwKKwlTU1RfQ09ERUNfVFlQRV9BQUMsCisJU1NUX0NPREVDX1RZUEVfQUFDUCwKKwlTU1RfQ09ERUNfVFlQRV9lQUFDUCwKK307CisKK2VudW0gc3RyZWFtX3R5cGUgeworCVNTVF9TVFJFQU1fVFlQRV9OT05FID0gMCwKKwlTU1RfU1RSRUFNX1RZUEVfTVVTSUMgPSAxLAorfTsKKworc3RydWN0IHNuZF9wY21fcGFyYW1zIHsKKwl1MTYgY29kZWM7CS8qIGNvZGVjIHR5cGUgKi8KKwl1OCBudW1fY2hhbjsJLyogMT1Nb25vLCAyPVN0ZXJlbyAqLworCXU4IHBjbV93ZF9zejsJLyogMTYvMjQgLSBiaXQqLworCXUzMiByZXNlcnZlZDsJLyogQml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQgKi8KKwl1MzIgc2ZyZXE7CS8qIFNhbXBsaW5nIHJhdGUgaW4gSHogKi8KKwl1OCB1c2Vfb2ZmbG9hZF9wYXRoOworCXU4IHJlc2VydmVkMjsKKwl1MTYgcmVzZXJ2ZWQzOworCXU4IGNoYW5uZWxfbWFwWzhdOworfSBfX3BhY2tlZDsKKworLyogTVAzIE11c2ljIFBhcmFtZXRlcnMgTWVzc2FnZSAqLworc3RydWN0IHNuZF9tcDNfcGFyYW1zIHsKKwl1MTYgY29kZWM7CisJdTggIG51bV9jaGFuOwkvKiAxPU1vbm8sIDI9U3RlcmVvCSovCisJdTggIHBjbV93ZF9zejsgLyogMTYvMjQgLSBiaXQqLworCXU4ICBjcmNfY2hlY2s7IC8qIGNyY19jaGVjayAtIGRpc2FibGUgKDApIG9yIGVuYWJsZSAoMSkgKi8KKwl1OCAgcmVzZXJ2ZWQxOyAvKiB1bnVzZWQqLworCXUxNiByZXNlcnZlZDI7CS8qIFVudXNlZCAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBQUNfQklUX1NUUkVBTV9BRFRTCQkwCisjZGVmaW5lIEFBQ19CSVRfU1RSRUFNX0FESUYJCTEKKyNkZWZpbmUgQUFDX0JJVF9TVFJFQU1fUkFXCQkyCisKKy8qIEFBQyBNdXNpYyBQYXJhbWV0ZXJzIE1lc3NhZ2UgKi8KK3N0cnVjdCBzbmRfYWFjX3BhcmFtcyB7CisJdTE2IGNvZGVjOworCXU4IG51bV9jaGFuOyAvKiAxPU1vbm8sIDI9U3RlcmVvKi8KKwl1OCBwY21fd2Rfc3o7IC8qIDE2LzI0IC0gYml0Ki8KKwl1OCBiZG93bnNhbXBsZTsgLypTQlIgZG93bnNhbXBsaW5nIDAgLSBkaXNhYmxlIDEgLWVuYWJsZWQgQUFDKyBvbmx5ICovCisJdTggYnNfZm9ybWF0OyAvKiBpbnB1dCBiaXQgc3RyZWFtIGZvcm1hdCBhZHRzPTAsIGFkaWY9MSwgcmF3PTIgKi8KKwl1MTYgIHJlc2VyMjsKKwl1MzIgZXh0ZXJuYWxzcjsgLypzYW1wbGluZyByYXRlIG9mIGJhc2ljIEFBQyByYXcgYml0IHN0cmVhbSovCisJdTggc2JyX3NpZ25hbGxpbmc7LypkaXNhYmxlL2VuYWJsZS9zZXQgYXV0b21vZGUgdGhlIFNCUiB0b29sLkFBQysqLworCXU4IHJlc2VyMTsKKwl1MTYgIHJlc2VyMzsKK30gX19wYWNrZWQ7CisKKy8qIFdNQSBNdXNpYyBQYXJhbWV0ZXJzIE1lc3NhZ2UgKi8KK3N0cnVjdCBzbmRfd21hX3BhcmFtcyB7CisJdTE2IGNvZGVjOworCXU4ICBudW1fY2hhbjsJLyogMT1Nb25vLCAyPVN0ZXJlbyAqLworCXU4ICBwY21fd2Rfc3o7CS8qIDE2LzI0IC0gYml0Ki8KKwl1MzIgYnJhdGU7CS8qIFVzZSB0aGUgaGFyZCBjb2RlZCB2YWx1ZS4gKi8KKwl1MzIgc2ZyZXE7CS8qIFNhbXBsaW5nIGZyZXEgZWcuIDgwMDAsIDQ0MTAwMCwgNDgwMDAgKi8KKwl1MzIgY2hhbm5lbF9tYXNrOyAgLyogQ2hhbm5lbCBNYXNrICovCisJdTE2IGZvcm1hdF90YWc7CS8qIEZvcm1hdCBUYWcgKi8KKwl1MTYgYmxvY2tfYWxpZ247CS8qIHBhY2tldCBzaXplICovCisJdTE2IHdtYV9lbmNvZGVfb3B0Oy8qIEVuY29kZXIgb3B0aW9uICovCisJdTggb3BfYWxpZ247CS8qIG9wIGFsaWduIDAtIDE2IGJpdCwgMS0gTVNCLCAyIExTQiAqLworCXU4IHJlc2VydmVkOwkvKiByZXNlcnZlZCAqLworfSBfX3BhY2tlZDsKKworLyogQ29kZWMgcGFyYW1zIHN0cnV0dXJlICovCit1bmlvbiAgc25kX3NzdF9jb2RlY19wYXJhbXMgeworCXN0cnVjdCBzbmRfcGNtX3BhcmFtcyBwY21fcGFyYW1zOworCXN0cnVjdCBzbmRfbXAzX3BhcmFtcyBtcDNfcGFyYW1zOworCXN0cnVjdCBzbmRfYWFjX3BhcmFtcyBhYWNfcGFyYW1zOworCXN0cnVjdCBzbmRfd21hX3BhcmFtcyB3bWFfcGFyYW1zOworfSBfX3BhY2tlZDsKKworLyogQWRkcmVzcyBhbmQgc2l6ZSBpbmZvIG9mIGEgZnJhbWUgYnVmZmVyICovCitzdHJ1Y3Qgc3N0X2FkZHJlc3NfaW5mbyB7CisJdTMyIGFkZHI7IC8qIEFkZHJlc3MgYXQgSUEgKi8KKwl1MzIgc2l6ZTsgLyogU2l6ZSBvZiB0aGUgYnVmZmVyICovCit9OworCitzdHJ1Y3Qgc25kX3NzdF9hbGxvY19wYXJhbXNfZXh0IHsKKwlzdHJ1Y3Qgc3N0X2FkZHJlc3NfaW5mbyAgcmluZ19idWZfaW5mb1s4XTsKKwl1OCBzZ19jb3VudDsKKwl1OCByZXNlcnZlZDsKKwl1MTYgcmVzZXJ2ZWQyOworCXUzMiBmcmFnX3NpemU7CS8qTnVtYmVyIG9mIHNhbXBsZXMgYWZ0ZXIgd2hpY2ggcGVyaW9kIGVsYXBzZWQKKwkJCQkgIG1lc3NhZ2UgaXMgc2VudCB2YWxpZCBvbmx5IGlmIHBhdGggID0gMCovCit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc25kX3NzdF9zdHJlYW1fcGFyYW1zIHsKKwl1bmlvbiBzbmRfc3N0X2NvZGVjX3BhcmFtcyB1YzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzbmRfc3N0X3BhcmFtcyB7CisJdTMyIHN0cmVhbV9pZDsKKwl1OCBjb2RlYzsKKwl1OCBvcHM7CisJdTggc3RyZWFtX3R5cGU7CisJdTggZGV2aWNlX3R5cGU7CisJc3RydWN0IHNuZF9zc3Rfc3RyZWFtX3BhcmFtcyBzcGFyYW1zOworCXN0cnVjdCBzbmRfc3N0X2FsbG9jX3BhcmFtc19leHQgYXBhcmFtczsKK307CisKKyNlbmRpZiAvKiBfX1NTVF9NRkxEX0RTUF9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1wbGF0Zm9ybS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwMzA2YwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtbWZsZC1wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsNzI1IEBACisvKgorICogIHNzdF9tZmxkX3BsYXRmb3JtLmMgLSBJbnRlbCBNSUQgUGxhdGZvcm0gZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEludGVsIENvcnAKKyAqICBBdXRob3I6IFZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgorICogIEF1dGhvcjogSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqCisgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+CisjaW5jbHVkZSAic3N0LW1mbGQtcGxhdGZvcm0uaCIKKworc3RhdGljIHN0cnVjdCBzc3RfZGV2aWNlICpzc3Q7CitzdGF0aWMgREVGSU5FX01VVEVYKHNzdF9sb2NrKTsKKworaW50IHNzdF9yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKmRldikKK3sKKwlpZiAoV0FSTl9PTighZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRldi0+ZHJpdmVyLT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKKwlpZiAoc3N0KSB7CisJCXByX2Vycigid2UgYWxyZWFkeSBoYXZlIGEgZGV2aWNlICVzXG4iLCBzc3QtPm5hbWUpOworCQltb2R1bGVfcHV0KGRldi0+ZGV2LT5kcml2ZXItPm93bmVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKwlwcl9kZWJ1ZygicmVnaXN0ZXJpbmcgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCXNzdCA9IGRldjsKKwltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9yZWdpc3Rlcl9kc3ApOworCitpbnQgc3N0X3VucmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpkZXYpCit7CisJaWYgKFdBUk5fT04oIWRldikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZXYgIT0gc3N0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKKworCWlmICghc3N0KSB7CisJCW11dGV4X3VubG9jaygmc3N0X2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltb2R1bGVfcHV0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKKwlwcl9kZWJ1ZygidW5yZWcgJXNcbiIsIHNzdC0+bmFtZSk7CisJc3N0ID0gTlVMTDsKKwltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF91bnJlZ2lzdGVyX2RzcCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzc3RfcGxhdGZvcm1fcGNtX2h3ID0geworCS5pbmZvID0JKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCVNORFJWX1BDTV9JTkZPX0RPVUJMRSB8CisJCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQlTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJU05EUlZfUENNX0lORk9fTU1BUHwKKwkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmJ1ZmZlcl9ieXRlc19tYXggPSBTU1RfTUFYX0JVRkZFUiwKKwkucGVyaW9kX2J5dGVzX21pbiA9IFNTVF9NSU5fUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gU1NUX01BWF9QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWluID0gU1NUX01JTl9QRVJJT0RTLAorCS5wZXJpb2RzX21heCA9IFNTVF9NQVhfUEVSSU9EUywKKwkuZmlmb19zaXplID0gU1NUX0ZJRk9fU0laRSwKK307CisKKy8qIE1GTEQgLSBNU0lDICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzc3RfcGxhdGZvcm1fZGFpW10gPSB7Cit7CisJLm5hbWUgPSAiSGVhZHNldC1jcHUtZGFpIiwKKwkuaWQgPSAwLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCisJCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwl9LAorCS5jYXB0dXJlID0geworCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDUsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCX0sCit9LAoreworCS5uYW1lID0gIlNwZWFrZXItY3B1LWRhaSIsCisJLmlkID0gMSwKKwkucGxheWJhY2sgPSB7CisJCS5jaGFubmVsc19taW4gPSBTU1RfTU9OTywKKwkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCX0sCit9LAoreworCS5uYW1lID0gIlZpYnJhMS1jcHUtZGFpIiwKKwkuaWQgPSAyLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAorCQkuY2hhbm5lbHNfbWF4ID0gU1NUX01PTk8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCX0sCit9LAoreworCS5uYW1lID0gIlZpYnJhMi1jcHUtZGFpIiwKKwkuaWQgPSAzLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAorCQkuY2hhbm5lbHNfbWF4ID0gU1NUX1NURVJFTywKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJfSwKK30sCit7CisJLm5hbWUgPSAiQ29tcHJlc3MtY3B1LWRhaSIsCisJLmNvbXByZXNzX2RhaSA9IDEsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKKwkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwfFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCit9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgc3N0X2NvbXBvbmVudCA9IHsKKwkubmFtZQkJPSAic3N0IiwKK307CisKKy8qIGhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtLAorCQkJCQlpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IHN0YXRlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3N0X2dldF9zdHJlYW1fc3RhdHVzKHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW0tPnN0YXR1c19sb2NrLCBmbGFncyk7CisJc3RhdGUgPSBzdHJlYW0tPnN0cmVhbV9zdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0ZTsKK30KKworc3RhdGljIHZvaWQgc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc3N0X3BjbV9wYXJhbXMgKnBhcmFtKQoreworCisJcGFyYW0tPmNvZGVjID0gU1NUX0NPREVDX1RZUEVfUENNOworCXBhcmFtLT5udW1fY2hhbiA9ICh1OCkgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKKwlwYXJhbS0+cGNtX3dkX3N6ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5zYW1wbGVfYml0czsKKwlwYXJhbS0+cmVzZXJ2ZWQgPSAwOworCXBhcmFtLT5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKKwlwYXJhbS0+cmluZ19idWZmZXJfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXBhcmFtLT5wZXJpb2RfY291bnQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplOworCXBhcmFtLT5yaW5nX2J1ZmZlcl9hZGRyID0gdmlydF90b19waHlzKHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhKTsKKwlwcl9kZWJ1ZygicGVyaW9kX2NudCA9ICVkXG4iLCBwYXJhbS0+cGVyaW9kX2NvdW50KTsKKwlwcl9kZWJ1Zygic2ZyZXE9ICVkLCB3ZF9zeiA9ICVkXG4iLCBwYXJhbS0+c2ZyZXEsIHBhcmFtLT5wY21fd2Rfc3opOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9hbGxvY19zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KKwkJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfcGNtX3BhcmFtcyBwYXJhbSA9IHswfTsKKwlzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgc3RyX3BhcmFtcyA9IHswfTsKKwlpbnQgcmV0X3ZhbDsKKworCS8qIHNldCBjb2RlYyBwYXJhbXMgYW5kIGluZm9ybSBTU1QgZHJpdmVyIHRoZSBzYW1lICovCisJc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdWJzdHJlYW0sICZwYXJhbSk7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOworCXN0cl9wYXJhbXMuc3BhcmFtcyA9IHBhcmFtOworCXN0cl9wYXJhbXMuY29kZWMgPSAgcGFyYW0uY29kZWM7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOworCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gc3Vic3RyZWFtLT5wY20tPmRldmljZSArIDE7CisJCXByX2RlYnVnKCJQbGF5YmNrIHN0cmVhbSxEZXZpY2UgJWRcbiIsCisJCQkJCXN1YnN0cmVhbS0+cGNtLT5kZXZpY2UpOworCX0gZWxzZSB7CisJCXN0cl9wYXJhbXMub3BzID0gU1RSRUFNX09QU19DQVBUVVJFOworCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRTsKKwkJcHJfZGVidWcoIkNhcHR1cmUgc3RyZWFtLERldmljZSAlZFxuIiwKKwkJCQkJc3Vic3RyZWFtLT5wY20tPmRldmljZSk7CisJfQorCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+b3Blbigmc3RyX3BhcmFtcyk7CisJcHJfZGVidWcoIlNTVF9TTkRfUExBWS9DQVBUVVJFIHJldF92YWwgPSAleFxuIiwgcmV0X3ZhbCk7CisJaWYgKHJldF92YWwgPCAwKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkID0gcmV0X3ZhbDsKKwlwcl9kZWJ1Zygic3RyIGlkIDogICVkXG4iLCBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9wZXJpb2RfZWxhcHNlZCh2b2lkICptYWRfc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gbWFkX3N1YnN0cmVhbTsKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CisJaW50IHN0YXR1czsKKworCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJ1bnRpbWUpCisJCXJldHVybjsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIXN0cmVhbSkKKwkJcmV0dXJuOworCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOworCWlmIChzdGF0dXMgIT0gU1NUX1BMQVRGT1JNX1JVTk5JTkcpCisJCXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2luaXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSA9CisJCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0X3ZhbDsKKworCXByX2RlYnVnKCJzZXR0aW5nIGJ1ZmZlciBwdHIgcGFyYW1cbiIpOworCXNzdF9zZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0sIFNTVF9QTEFURk9STV9JTklUKTsKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLnBlcmlvZF9lbGFwc2VkID0gc3N0X3BlcmlvZF9lbGFwc2VkOworCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOworCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7CisJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKKwkJCVNTVF9TTkRfU1RSRUFNX0lOSVQsICZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKKwlpZiAocmV0X3ZhbCkKKwkJcHJfZXJyKCJjb250cm9sX3NldCByZXQgZXJyb3IgJWRcbiIsIHJldF92YWwpOworCXJldHVybiByZXRfdmFsOworCit9CisvKiBlbmQgLS0gaGVscGVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCWludCByZXRfdmFsOworCisJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9vcGVuIGNhbGxlZFxuIik7CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnNzdF9wbGF0Zm9ybV9wY21faHcpOworCXJldF92YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXRfdmFsIDwgMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW0pCisJCXJldHVybiAtRU5PTUVNOworCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKKworCS8qIGdldCB0aGUgc3N0IG9wcyAqLworCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKKwlpZiAoIXNzdCkgeworCQlwcl9lcnIoIm5vIGRldmljZSBhdmFpbGFibGUgdG8gcnVuXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisJCWtmcmVlKHN0cmVhbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKSkgeworCQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwkJa2ZyZWUoc3RyZWFtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXN0cmVhbS0+b3BzID0gc3N0LT5vcHM7CisJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCA9IDA7CisJc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgU1NUX1BMQVRGT1JNX0lOSVQpOworCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIFNTVCBBUEkgc2V0ICovCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKKwlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKKworCXByX2RlYnVnKCJzc3RfcGxhdGZvcm1fY2xvc2UgY2FsbGVkXG4iKTsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKKwlpZiAoc3RyX2lkKQorCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmNsb3NlKHN0cl9pZCk7CisJbW9kdWxlX3B1dChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcik7CisJa2ZyZWUoc3RyZWFtKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCWludCByZXRfdmFsID0gMCwgc3RyX2lkOworCisJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSBjYWxsZWRcbiIpOworCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOworCWlmIChzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCkgeworCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKAorCQkJCVNTVF9TTkRfRFJPUCwgJnN0cl9pZCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN1YnN0cmVhbSk7CisJaWYgKHJldF92YWwgPCAwKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlzbnByaW50ZihzdWJzdHJlYW0tPnBjbS0+aWQsIHNpemVvZihzdWJzdHJlYW0tPnBjbS0+aWQpLAorCQkJIiVkIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCisJcmV0X3ZhbCA9IHNzdF9wbGF0Zm9ybV9pbml0X3N0cmVhbShzdWJzdHJlYW0pOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUjsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCWludCBjbWQpCit7CisJaW50IHJldF92YWwgPSAwLCBzdHJfaWQ7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCWludCBzdHJfY21kLCBzdGF0dXM7CisKKwlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3BjbV90cmlnZ2VyIGNhbGxlZFxuIik7CisJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlwcl9kZWJ1Zygic3N0OiBUcmlnZ2VyIFN0YXJ0XG4iKTsKKwkJc3RyX2NtZCA9IFNTVF9TTkRfU1RBUlQ7CisJCXN0YXR1cyA9IFNTVF9QTEFURk9STV9SVU5OSU5HOworCQlzdHJlYW0tPnN0cmVhbV9pbmZvLm1hZF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJcHJfZGVidWcoInNzdDogaW4gc3RvcFxuIik7CisJCXN0cl9jbWQgPSBTU1RfU05EX0RST1A7CisJCXN0YXR1cyA9IFNTVF9QTEFURk9STV9EUk9QUEVEOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXByX2RlYnVnKCJzc3Q6IGluIHBhdXNlXG4iKTsKKwkJc3RyX2NtZCA9IFNTVF9TTkRfUEFVU0U7CisJCXN0YXR1cyA9IFNTVF9QTEFURk9STV9QQVVTRUQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJcHJfZGVidWcoInNzdDogaW4gcGF1c2UgcmVsZWFzZVxuIik7CisJCXN0cl9jbWQgPSBTU1RfU05EX1JFU1VNRTsKKwkJc3RhdHVzID0gU1NUX1BMQVRGT1JNX1JVTk5JTkc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKHN0cl9jbWQsICZzdHJfaWQpOworCWlmICghcmV0X3ZhbCkKKwkJc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgc3RhdHVzKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfcGxhdGZvcm1fcGNtX3BvaW50ZXIKKwkJCShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CisJaW50IHJldF92YWwsIHN0YXR1czsKKwlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJfaW5mbzsKKworCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOworCWlmIChzdGF0dXMgPT0gU1NUX1BMQVRGT1JNX0lOSVQpCisJCXJldHVybiAwOworCXN0cl9pbmZvID0gJnN0cmVhbS0+c3RyZWFtX2luZm87CisJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKKwkJCQlTU1RfU05EX0JVRkZFUl9QT0lOVEVSLCBzdHJfaW5mbyk7CisJaWYgKHJldF92YWwpIHsKKwkJcHJfZXJyKCJzc3Q6IGVycm9yIGNvZGUgPSAlZFxuIiwgcmV0X3ZhbCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKwlyZXR1cm4gc3RyZWFtLT5zdHJlYW1faW5mby5idWZmZXJfcHRyOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCW1lbXNldChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhLCAwLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X3BsYXRmb3JtX29wcyA9IHsKKwkub3BlbiA9IHNzdF9wbGF0Zm9ybV9vcGVuLAorCS5jbG9zZSA9IHNzdF9wbGF0Zm9ybV9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkucHJlcGFyZSA9IHNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9IHNzdF9wbGF0Zm9ybV9wY21fcG9pbnRlciwKKwkuaHdfcGFyYW1zID0gc3N0X3BsYXRmb3JtX3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPSBzc3RfcGxhdGZvcm1fcGNtX2h3X2ZyZWUsCit9OworCitzdGF0aWMgdm9pZCBzc3RfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlwcl9kZWJ1Zygic3N0X3BjbV9mcmVlIGNhbGxlZFxuIik7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CisJaW50IHJldHZhbCA9IDA7CisKKwlwcl9kZWJ1Zygic3N0X3BjbV9uZXcgY2FsbGVkXG4iKTsKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAorCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CisJCXJldHZhbCA9ICBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKKwkJCVNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCisJCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKKwkJCVNTVF9NSU5fQlVGRkVSLCBTU1RfTUFYX0JVRkZFUik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXByX2VycigiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uZiBmYWlsXG4iKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogY29tcHJlc3Mgc3RyZWFtIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHNzdF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IChzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqKWFyZzsKKworCXByX2RlYnVnKCJmcmFnbWVudCBlbGFwc2VkIGJ5IGRyaXZlclxuIik7CisJaWYgKGNzdHJlYW0pCisJCXNuZF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKGNzdHJlYW0pOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQoreworCisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghc3RyZWFtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKKworCS8qIGdldCB0aGUgc3N0IG9wcyAqLworCWlmICghc3N0IHx8ICF0cnlfbW9kdWxlX2dldChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcikpIHsKKwkJcHJfZXJyKCJubyBkZXZpY2UgYXZhaWxhYmxlIHRvIHJ1blxuIik7CisJCXJldF92YWwgPSAtRU5PREVWOworCQlnb3RvIG91dF9vcHM7CisJfQorCXN0cmVhbS0+Y29tcHJfb3BzID0gc3N0LT5jb21wcl9vcHM7CisKKwlzdHJlYW0tPmlkID0gMDsKKwlzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtLCBTU1RfUExBVEZPUk1fSU5JVCk7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOworCXJldHVybiAwOworb3V0X29wczoKKwlrZnJlZShzdHJlYW0pOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKKwlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKKworCXN0cmVhbSA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwkvKm5lZWQgdG8gY2hlY2sqLworCXN0cl9pZCA9IHN0cmVhbS0+aWQ7CisJaWYgKHN0cl9pZCkKKwkJcmV0X3ZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5jbG9zZShzdHJfaWQpOworCW1vZHVsZV9wdXQoc3N0LT5kZXYtPmRyaXZlci0+b3duZXIpOworCWtmcmVlKHN0cmVhbSk7CisJcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIHJldF92YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9zZXRfcGFyYW1zKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyBzdHJfcGFyYW1zOworCXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgY2I7CisKKwlzdHJlYW0gPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJLyogY29uc3RydWN0IGZ3IHN0cnVjdHVyZSBmb3IgdGhpcyovCisJbWVtc2V0KCZzdHJfcGFyYW1zLCAwLCBzaXplb2Yoc3RyX3BhcmFtcykpOworCisJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOworCXN0cl9wYXJhbXMuc3RyZWFtX3R5cGUgPSBTU1RfU1RSRUFNX1RZUEVfTVVTSUM7CisJc3RyX3BhcmFtcy5kZXZpY2VfdHlwZSA9IFNORF9TU1RfREVWSUNFX0NPTVBSRVNTOworCisJc3dpdGNoIChwYXJhbXMtPmNvZGVjLmlkKSB7CisJY2FzZSBTTkRfQVVESU9DT0RFQ19NUDM6IHsKKwkJc3RyX3BhcmFtcy5jb2RlYyA9IFNTVF9DT0RFQ19UWVBFX01QMzsKKwkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9NUDM7CisJCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5tcDNfcGFyYW1zLm51bV9jaGFuID0gcGFyYW1zLT5jb2RlYy5jaF9pbjsKKwkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMucGNtX3dkX3N6ID0gMTY7CisJCWJyZWFrOworCX0KKworCWNhc2UgU05EX0FVRElPQ09ERUNfQUFDOiB7CisJCXN0cl9wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9BQUM7CisJCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLmNvZGVjID0gU1NUX0NPREVDX1RZUEVfQUFDOworCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5udW1fY2hhbiA9IHBhcmFtcy0+Y29kZWMuY2hfaW47CisJCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLnBjbV93ZF9zeiA9IDE2OworCQlpZiAocGFyYW1zLT5jb2RlYy5mb3JtYXQgPT0gU05EX0FVRElPU1RSRUFNRk9STUFUX01QNEFEVFMpCisJCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQorCQkJCQkJCUFBQ19CSVRfU1RSRUFNX0FEVFM7CisJCWVsc2UgaWYgKHBhcmFtcy0+Y29kZWMuZm9ybWF0ID09IFNORF9BVURJT1NUUkVBTUZPUk1BVF9SQVcpCisJCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQorCQkJCQkJCUFBQ19CSVRfU1RSRUFNX1JBVzsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIlVuZGVmaW5lZCBmb3JtYXQlZFxuIiwgcGFyYW1zLT5jb2RlYy5mb3JtYXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLmFhY19wYXJhbXMuZXh0ZXJuYWxzciA9CisJCQkJCQlwYXJhbXMtPmNvZGVjLnNhbXBsZV9yYXRlOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoImNvZGVjIG5vdCBzdXBwb3J0ZWQsIGlkID0lZFxuIiwgcGFyYW1zLT5jb2RlYy5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cl9wYXJhbXMuYXBhcmFtcy5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgID0KKwkJCQkJdmlydF90b19waHlzKGNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcik7CisJc3RyX3BhcmFtcy5hcGFyYW1zLnJpbmdfYnVmX2luZm9bMF0uc2l6ZSA9CisJCQkJCWNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCXN0cl9wYXJhbXMuYXBhcmFtcy5zZ19jb3VudCA9IDE7CisJc3RyX3BhcmFtcy5hcGFyYW1zLmZyYWdfc2l6ZSA9IGNzdHJlYW0tPnJ1bnRpbWUtPmZyYWdtZW50X3NpemU7CisKKwljYi5wYXJhbSA9IGNzdHJlYW07CisJY2IuY29tcHJfY2IgPSBzc3RfY29tcHJfZnJhZ21lbnRfZWxhcHNlZDsKKworCXJldHZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5vcGVuKCZzdHJfcGFyYW1zLCAmY2IpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByX2Vycigic3RyZWFtIGFsbG9jYXRpb24gZmFpbGVkICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXN0cmVhbS0+aWQgPSByZXR2YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3RyaWdnZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KKwkJY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHN0cmVhbS0+Y29tcHJfb3BzLT5jb250cm9sKGNtZCwgc3RyZWFtLT5pZCk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfY29tcHJfdHN0YW1wICp0c3RhbXApCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0tPmNvbXByX29wcy0+dHN0YW1wKHN0cmVhbS0+aWQsIHRzdGFtcCk7CisJdHN0YW1wLT5ieXRlX29mZnNldCA9IHRzdGFtcC0+Y29waWVkX3RvdGFsICUKKwkJCQkgKHUzMiljc3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZTsKKwlwcl9kZWJ1ZygiY2FsYyBieXRlcyBvZmZzZXQvY29waWVkIGJ5dGVzIGFzICVkXG4iLCB0c3RhbXAtPmJ5dGVfb2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfYWNrKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCQlzaXplX3QgYnl0ZXMpCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0tPmNvbXByX29wcy0+YWNrKHN0cmVhbS0+aWQsICh1bnNpZ25lZCBsb25nKWJ5dGVzKTsKKwlzdHJlYW0tPmJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfZ2V0X2NhcHMoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2FwcykKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQorCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jYXBzKGNhcHMpOworfQorCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQorCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jb2RlY19jYXBzKGNvZGVjKTsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X21ldGFkYXRhKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX21ldGFkYXRhICptZXRhZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gID0KKwkJIGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBzdHJlYW0tPmNvbXByX29wcy0+c2V0X21ldGFkYXRhKHN0cmVhbS0+aWQsIG1ldGFkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfY29tcHJfb3BzIHNzdF9wbGF0Zm9ybV9jb21wcl9vcHMgPSB7CisKKwkub3BlbiA9IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuLAorCS5mcmVlID0gc3N0X3BsYXRmb3JtX2NvbXByX2ZyZWUsCisJLnNldF9wYXJhbXMgPSBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X3BhcmFtcywKKwkuc2V0X21ldGFkYXRhID0gc3N0X3BsYXRmb3JtX2NvbXByX3NldF9tZXRhZGF0YSwKKwkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9jb21wcl90cmlnZ2VyLAorCS5wb2ludGVyID0gc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIsCisJLmFjayA9IHNzdF9wbGF0Zm9ybV9jb21wcl9hY2ssCisJLmdldF9jYXBzID0gc3N0X3BsYXRmb3JtX2NvbXByX2dldF9jYXBzLAorCS5nZXRfY29kZWNfY2FwcyA9IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgc3N0X3NvY19wbGF0Zm9ybV9kcnYgPSB7CisJLm9wcwkJPSAmc3N0X3BsYXRmb3JtX29wcywKKwkuY29tcHJfb3BzCT0gJnNzdF9wbGF0Zm9ybV9jb21wcl9vcHMsCisJLnBjbV9uZXcJPSBzc3RfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBzc3RfcGNtX2ZyZWUsCit9OworCitzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisKKwlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3Byb2JlIGNhbGxlZFxuIik7CisJc3N0ID0gTlVMTDsKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZzc3Rfc29jX3BsYXRmb3JtX2Rydik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInJlZ2lzdGVyaW5nIHNvYyBwbGF0Zm9ybSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZzc3RfY29tcG9uZW50LAorCQkJCXNzdF9wbGF0Zm9ybV9kYWksIEFSUkFZX1NJWkUoc3N0X3BsYXRmb3JtX2RhaSkpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJyZWdpc3RlcmluZyBjcHUgZGFpcyBmYWlsZWRcbiIpOworCQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9yZW1vdmUgc3VjY2Vzc1xuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzc3RfcGxhdGZvcm1fcHJvYmUsCisJLnJlbW92ZQkJPSBzc3RfcGxhdGZvcm1fcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEludGVsKFIpIE1JRCBQbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzc3QtbWZsZC1wbGF0Zm9ybSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzRlMmRkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiAgc3N0X21mbGRfcGxhdGZvcm0uaCAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIgaGVhZGVyIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEludGVsIENvcnAKKyAqICBBdXRob3I6IFZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgorICogIEF1dGhvcjogSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqCisgKi8KKworI2lmbmRlZiBfX1NTVF9QTEFURk9STURSVl9IX18KKyNkZWZpbmUgX19TU1RfUExBVEZPUk1EUlZfSF9fCisKKyNpbmNsdWRlICJzc3QtbWZsZC1kc3AuaCIKKworI2RlZmluZSBTU1RfTU9OTwkJMQorI2RlZmluZSBTU1RfU1RFUkVPCQkyCisjZGVmaW5lIFNTVF9NQVhfQ0FQCQk1CisKKyNkZWZpbmUgU1NUX01BWF9CVUZGRVIJCSg4MDAqMTAyNCkKKyNkZWZpbmUgU1NUX01JTl9CVUZGRVIJCSg4MDAqMTAyNCkKKyNkZWZpbmUgU1NUX01JTl9QRVJJT0RfQllURVMJMzIKKyNkZWZpbmUgU1NUX01BWF9QRVJJT0RfQllURVMJU1NUX01BWF9CVUZGRVIKKyNkZWZpbmUgU1NUX01JTl9QRVJJT0RTCQkyCisjZGVmaW5lIFNTVF9NQVhfUEVSSU9EUwkJKDEwMjQqMikKKyNkZWZpbmUgU1NUX0ZJRk9fU0laRQkJMAorCitzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvIHsKKwlpbnQgc3RyX2lkOworCXZvaWQgKm1hZF9zdWJzdHJlYW07CisJdm9pZCAoKnBlcmlvZF9lbGFwc2VkKSAodm9pZCAqbWFkX3N1YnN0cmVhbSk7CisJdW5zaWduZWQgbG9uZyBsb25nIGJ1ZmZlcl9wdHI7CisJaW50IHNmcmVxOworfTsKKworZW51bSBzc3RfZHJ2X3N0YXR1cyB7CisJU1NUX1BMQVRGT1JNX0lOSVQgPSAxLAorCVNTVF9QTEFURk9STV9TVEFSVEVELAorCVNTVF9QTEFURk9STV9SVU5OSU5HLAorCVNTVF9QTEFURk9STV9QQVVTRUQsCisJU1NUX1BMQVRGT1JNX0RST1BQRUQsCit9OworCitlbnVtIHNzdF9jb250cm9scyB7CisJU1NUX1NORF9BTExPQyA9CQkJMHgwMCwKKwlTU1RfU05EX1BBVVNFID0JCQkweDAxLAorCVNTVF9TTkRfUkVTVU1FID0JCTB4MDIsCisJU1NUX1NORF9EUk9QID0JCQkweDAzLAorCVNTVF9TTkRfRlJFRSA9CQkJMHgwNCwKKwlTU1RfU05EX0JVRkZFUl9QT0lOVEVSID0JMHgwNSwKKwlTU1RfU05EX1NUUkVBTV9JTklUID0JCTB4MDYsCisJU1NUX1NORF9TVEFSVAkgPQkJMHgwNywKKwlTU1RfTUFYX0NPTlRST0xTID0JCTB4MDcsCit9OworCitlbnVtIHNzdF9zdHJlYW1fb3BzIHsKKwlTVFJFQU1fT1BTX1BMQVlCQUNLID0gMCwKKwlTVFJFQU1fT1BTX0NBUFRVUkUsCit9OworCitlbnVtIHNzdF9hdWRpb19kZXZpY2VfdHlwZSB7CisJU05EX1NTVF9ERVZJQ0VfSEVBRFNFVCA9IDEsCisJU05EX1NTVF9ERVZJQ0VfSUhGLAorCVNORF9TU1RfREVWSUNFX1ZJQlJBLAorCVNORF9TU1RfREVWSUNFX0hBUFRJQywKKwlTTkRfU1NUX0RFVklDRV9DQVBUVVJFLAorCVNORF9TU1RfREVWSUNFX0NPTVBSRVNTLAorfTsKKworLyogUENNIFBhcmFtZXRlcnMgKi8KK3N0cnVjdCBzc3RfcGNtX3BhcmFtcyB7CisJdTE2IGNvZGVjOwkvKiBjb2RlYyB0eXBlICovCisJdTggbnVtX2NoYW47CS8qIDE9TW9ubywgMj1TdGVyZW8gKi8KKwl1OCBwY21fd2Rfc3o7CS8qIDE2LzI0IC0gYml0Ki8KKwl1MzIgcmVzZXJ2ZWQ7CS8qIEJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kICovCisJdTMyIHNmcmVxOwkvKiBTYW1wbGluZyByYXRlIGluIEh6ICovCisJdTMyIHJpbmdfYnVmZmVyX3NpemU7CisJdTMyIHBlcmlvZF9jb3VudDsJLyogcGVyaW9kIGVsYXBzZWQgaW4gc2FtcGxlcyovCisJdTMyIHJpbmdfYnVmZmVyX2FkZHI7Cit9OworCitzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgeworCXUzMiByZXN1bHQ7CisJdTMyIHN0cmVhbV9pZDsKKwl1OCBjb2RlYzsKKwl1OCBvcHM7CisJdTggc3RyZWFtX3R5cGU7CisJdTggZGV2aWNlX3R5cGU7CisJc3RydWN0IHNzdF9wY21fcGFyYW1zIHNwYXJhbXM7Cit9OworCitzdHJ1Y3Qgc3N0X2NvbXByZXNzX2NiIHsKKwl2b2lkICpwYXJhbTsKKwl2b2lkICgqY29tcHJfY2IpKHZvaWQgKnBhcmFtKTsKK307CisKK3N0cnVjdCBjb21wcmVzc19zc3Rfb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKm9wZW4pIChzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbXMsCisJCQlzdHJ1Y3Qgc3N0X2NvbXByZXNzX2NiICpjYik7CisJaW50ICgqY29udHJvbCkgKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBzdHJfaWQpOworCWludCAoKnRzdGFtcCkgKHVuc2lnbmVkIGludCBzdHJfaWQsIHN0cnVjdCBzbmRfY29tcHJfdHN0YW1wICp0c3RhbXApOworCWludCAoKmFjaykgKHVuc2lnbmVkIGludCBzdHJfaWQsIHVuc2lnbmVkIGxvbmcgYnl0ZXMpOworCWludCAoKmNsb3NlKSAodW5zaWduZWQgaW50IHN0cl9pZCk7CisJaW50ICgqZ2V0X2NhcHMpIChzdHJ1Y3Qgc25kX2NvbXByX2NhcHMgKmNhcHMpOworCWludCAoKmdldF9jb2RlY19jYXBzKSAoc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYyk7CisJaW50ICgqc2V0X21ldGFkYXRhKSAodW5zaWduZWQgaW50IHN0cl9pZCwKKwkJCXN0cnVjdCBzbmRfY29tcHJfbWV0YWRhdGEgKm1kYXRhKTsKKworfTsKKworc3RydWN0IHNzdF9vcHMgeworCWludCAoKm9wZW4pIChzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgKnN0cl9wYXJhbSk7CisJaW50ICgqZGV2aWNlX2NvbnRyb2wpIChpbnQgY21kLCB2b2lkICphcmcpOworCWludCAoKmNsb3NlKSAodW5zaWduZWQgaW50IHN0cl9pZCk7Cit9OworCitzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtIHsKKwlpbnQgICAgIHN0cmVhbV9zdGF0dXM7CisJdW5zaWduZWQgaW50IGlkOworCXNpemVfdCBieXRlc193cml0dGVuOworCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gc3RyZWFtX2luZm87CisJc3RydWN0IHNzdF9vcHMgKm9wczsKKwlzdHJ1Y3QgY29tcHJlc3Nfc3N0X29wcyAqY29tcHJfb3BzOworCXNwaW5sb2NrX3QJc3RhdHVzX2xvY2s7Cit9OworCitzdHJ1Y3Qgc3N0X2RldmljZSB7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHNzdF9vcHMgKm9wczsKKwlzdHJ1Y3QgY29tcHJlc3Nfc3N0X29wcyAqY29tcHJfb3BzOworfTsKKworaW50IHNzdF9yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKnNzdCk7CitpbnQgc3N0X3VucmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpzc3QpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0X2RzcC5oIGIvc291bmQvc29jL2ludGVsL3NzdF9kc3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjZTFkZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0X2RzcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSNpZm5kZWYgX19TU1RfRFNQX0hfXwotI2RlZmluZSBfX1NTVF9EU1BfSF9fCi0vKgotICogIHNzdF9kc3AuaCAtIEludGVsIFNTVCBEcml2ZXIgZm9yIGF1ZGlvIGVuZ2luZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMTIgSW50ZWwgQ29ycG9yYXRpb24KLSAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGxpbnV4LmludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotCi1lbnVtIHNzdF9jb2RlY190eXBlcyB7Ci0JLyogIEFVRElPL01VU0lDCUNPREVDIFR5cGUgRGVmaW5pdGlvbnMgKi8KLQlTU1RfQ09ERUNfVFlQRV9VTktOT1dOID0gMCwKLQlTU1RfQ09ERUNfVFlQRV9QQ00sCS8qIFBhc3MgdGhyb3VnaCBBdWRpbyBjb2RlYyAqLwotCVNTVF9DT0RFQ19UWVBFX01QMywKLQlTU1RfQ09ERUNfVFlQRV9NUDI0LAotCVNTVF9DT0RFQ19UWVBFX0FBQywKLQlTU1RfQ09ERUNfVFlQRV9BQUNQLAotCVNTVF9DT0RFQ19UWVBFX2VBQUNQLAotfTsKLQotZW51bSBzdHJlYW1fdHlwZSB7Ci0JU1NUX1NUUkVBTV9UWVBFX05PTkUgPSAwLAotCVNTVF9TVFJFQU1fVFlQRV9NVVNJQyA9IDEsCi19OwotCi1zdHJ1Y3Qgc25kX3BjbV9wYXJhbXMgewotCXUxNiBjb2RlYzsJLyogY29kZWMgdHlwZSAqLwotCXU4IG51bV9jaGFuOwkvKiAxPU1vbm8sIDI9U3RlcmVvICovCi0JdTggcGNtX3dkX3N6OwkvKiAxNi8yNCAtIGJpdCovCi0JdTMyIHJlc2VydmVkOwkvKiBCaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZCAqLwotCXUzMiBzZnJlcTsJLyogU2FtcGxpbmcgcmF0ZSBpbiBIeiAqLwotCXU4IHVzZV9vZmZsb2FkX3BhdGg7Ci0JdTggcmVzZXJ2ZWQyOwotCXUxNiByZXNlcnZlZDM7Ci0JdTggY2hhbm5lbF9tYXBbOF07Ci19IF9fcGFja2VkOwotCi0vKiBNUDMgTXVzaWMgUGFyYW1ldGVycyBNZXNzYWdlICovCi1zdHJ1Y3Qgc25kX21wM19wYXJhbXMgewotCXUxNiBjb2RlYzsKLQl1OCAgbnVtX2NoYW47CS8qIDE9TW9ubywgMj1TdGVyZW8JKi8KLQl1OCAgcGNtX3dkX3N6OyAvKiAxNi8yNCAtIGJpdCovCi0JdTggIGNyY19jaGVjazsgLyogY3JjX2NoZWNrIC0gZGlzYWJsZSAoMCkgb3IgZW5hYmxlICgxKSAqLwotCXU4ICByZXNlcnZlZDE7IC8qIHVudXNlZCovCi0JdTE2IHJlc2VydmVkMjsJLyogVW51c2VkICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFBQ19CSVRfU1RSRUFNX0FEVFMJCTAKLSNkZWZpbmUgQUFDX0JJVF9TVFJFQU1fQURJRgkJMQotI2RlZmluZSBBQUNfQklUX1NUUkVBTV9SQVcJCTIKLQotLyogQUFDIE11c2ljIFBhcmFtZXRlcnMgTWVzc2FnZSAqLwotc3RydWN0IHNuZF9hYWNfcGFyYW1zIHsKLQl1MTYgY29kZWM7Ci0JdTggbnVtX2NoYW47IC8qIDE9TW9ubywgMj1TdGVyZW8qLwotCXU4IHBjbV93ZF9zejsgLyogMTYvMjQgLSBiaXQqLwotCXU4IGJkb3duc2FtcGxlOyAvKlNCUiBkb3duc2FtcGxpbmcgMCAtIGRpc2FibGUgMSAtZW5hYmxlZCBBQUMrIG9ubHkgKi8KLQl1OCBic19mb3JtYXQ7IC8qIGlucHV0IGJpdCBzdHJlYW0gZm9ybWF0IGFkdHM9MCwgYWRpZj0xLCByYXc9MiAqLwotCXUxNiAgcmVzZXIyOwotCXUzMiBleHRlcm5hbHNyOyAvKnNhbXBsaW5nIHJhdGUgb2YgYmFzaWMgQUFDIHJhdyBiaXQgc3RyZWFtKi8KLQl1OCBzYnJfc2lnbmFsbGluZzsvKmRpc2FibGUvZW5hYmxlL3NldCBhdXRvbW9kZSB0aGUgU0JSIHRvb2wuQUFDKyovCi0JdTggcmVzZXIxOwotCXUxNiAgcmVzZXIzOwotfSBfX3BhY2tlZDsKLQotLyogV01BIE11c2ljIFBhcmFtZXRlcnMgTWVzc2FnZSAqLwotc3RydWN0IHNuZF93bWFfcGFyYW1zIHsKLQl1MTYgY29kZWM7Ci0JdTggIG51bV9jaGFuOwkvKiAxPU1vbm8sIDI9U3RlcmVvICovCi0JdTggIHBjbV93ZF9zejsJLyogMTYvMjQgLSBiaXQqLwotCXUzMiBicmF0ZTsJLyogVXNlIHRoZSBoYXJkIGNvZGVkIHZhbHVlLiAqLwotCXUzMiBzZnJlcTsJLyogU2FtcGxpbmcgZnJlcSBlZy4gODAwMCwgNDQxMDAwLCA0ODAwMCAqLwotCXUzMiBjaGFubmVsX21hc2s7ICAvKiBDaGFubmVsIE1hc2sgKi8KLQl1MTYgZm9ybWF0X3RhZzsJLyogRm9ybWF0IFRhZyAqLwotCXUxNiBibG9ja19hbGlnbjsJLyogcGFja2V0IHNpemUgKi8KLQl1MTYgd21hX2VuY29kZV9vcHQ7LyogRW5jb2RlciBvcHRpb24gKi8KLQl1OCBvcF9hbGlnbjsJLyogb3AgYWxpZ24gMC0gMTYgYml0LCAxLSBNU0IsIDIgTFNCICovCi0JdTggcmVzZXJ2ZWQ7CS8qIHJlc2VydmVkICovCi19IF9fcGFja2VkOwotCi0vKiBDb2RlYyBwYXJhbXMgc3RydXR1cmUgKi8KLXVuaW9uICBzbmRfc3N0X2NvZGVjX3BhcmFtcyB7Ci0Jc3RydWN0IHNuZF9wY21fcGFyYW1zIHBjbV9wYXJhbXM7Ci0Jc3RydWN0IHNuZF9tcDNfcGFyYW1zIG1wM19wYXJhbXM7Ci0Jc3RydWN0IHNuZF9hYWNfcGFyYW1zIGFhY19wYXJhbXM7Ci0Jc3RydWN0IHNuZF93bWFfcGFyYW1zIHdtYV9wYXJhbXM7Ci19IF9fcGFja2VkOwotCi0vKiBBZGRyZXNzIGFuZCBzaXplIGluZm8gb2YgYSBmcmFtZSBidWZmZXIgKi8KLXN0cnVjdCBzc3RfYWRkcmVzc19pbmZvIHsKLQl1MzIgYWRkcjsgLyogQWRkcmVzcyBhdCBJQSAqLwotCXUzMiBzaXplOyAvKiBTaXplIG9mIHRoZSBidWZmZXIgKi8KLX07Ci0KLXN0cnVjdCBzbmRfc3N0X2FsbG9jX3BhcmFtc19leHQgewotCXN0cnVjdCBzc3RfYWRkcmVzc19pbmZvICByaW5nX2J1Zl9pbmZvWzhdOwotCXU4IHNnX2NvdW50OwotCXU4IHJlc2VydmVkOwotCXUxNiByZXNlcnZlZDI7Ci0JdTMyIGZyYWdfc2l6ZTsJLypOdW1iZXIgb2Ygc2FtcGxlcyBhZnRlciB3aGljaCBwZXJpb2QgZWxhcHNlZAotCQkJCSAgbWVzc2FnZSBpcyBzZW50IHZhbGlkIG9ubHkgaWYgcGF0aCAgPSAwKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzbmRfc3N0X3N0cmVhbV9wYXJhbXMgewotCXVuaW9uIHNuZF9zc3RfY29kZWNfcGFyYW1zIHVjOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNuZF9zc3RfcGFyYW1zIHsKLQl1MzIgc3RyZWFtX2lkOwotCXU4IGNvZGVjOwotCXU4IG9wczsKLQl1OCBzdHJlYW1fdHlwZTsKLQl1OCBkZXZpY2VfdHlwZTsKLQlzdHJ1Y3Qgc25kX3NzdF9zdHJlYW1fcGFyYW1zIHNwYXJhbXM7Ci0Jc3RydWN0IHNuZF9zc3RfYWxsb2NfcGFyYW1zX2V4dCBhcGFyYW1zOwotfTsKLQotI2VuZGlmIC8qIF9fU1NUX0RTUF9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3RfcGxhdGZvcm0uYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3RfcGxhdGZvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2NWE4MS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLyoKLSAqICBzc3RfcGxhdGZvcm0uYyAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgSW50ZWwgQ29ycAotICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Ci0gKiAgQXV0aG9yOiBIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+Ci0gKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICoKLSAqLwotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19kcml2ZXIuaD4KLSNpbmNsdWRlICJzc3RfcGxhdGZvcm0uaCIKLQotc3RhdGljIHN0cnVjdCBzc3RfZGV2aWNlICpzc3Q7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHNzdF9sb2NrKTsKLQotaW50IHNzdF9yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKmRldikKLXsKLQlpZiAoV0FSTl9PTighZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRldi0+ZHJpdmVyLT5vd25lcikpCi0JCXJldHVybiAtRU5PREVWOwotCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKLQlpZiAoc3N0KSB7Ci0JCXByX2Vycigid2UgYWxyZWFkeSBoYXZlIGEgZGV2aWNlICVzXG4iLCBzc3QtPm5hbWUpOwotCQltb2R1bGVfcHV0KGRldi0+ZGV2LT5kcml2ZXItPm93bmVyKTsKLQkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQlwcl9kZWJ1ZygicmVnaXN0ZXJpbmcgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOwotCXNzdCA9IGRldjsKLQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9yZWdpc3Rlcl9kc3ApOwotCi1pbnQgc3N0X3VucmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpkZXYpCi17Ci0JaWYgKFdBUk5fT04oIWRldikpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChkZXYgIT0gc3N0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKLQotCWlmICghc3N0KSB7Ci0JCW11dGV4X3VubG9jaygmc3N0X2xvY2spOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQltb2R1bGVfcHV0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKLQlwcl9kZWJ1ZygidW5yZWcgJXNcbiIsIHNzdC0+bmFtZSk7Ci0Jc3N0ID0gTlVMTDsKLQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF91bnJlZ2lzdGVyX2RzcCk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzc3RfcGxhdGZvcm1fcGNtX2h3ID0gewotCS5pbmZvID0JKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCVNORFJWX1BDTV9JTkZPX0RPVUJMRSB8Ci0JCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCQlTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAotCQkJU05EUlZfUENNX0lORk9fTU1BUHwKLQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCi0JLmJ1ZmZlcl9ieXRlc19tYXggPSBTU1RfTUFYX0JVRkZFUiwKLQkucGVyaW9kX2J5dGVzX21pbiA9IFNTVF9NSU5fUEVSSU9EX0JZVEVTLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gU1NUX01BWF9QRVJJT0RfQllURVMsCi0JLnBlcmlvZHNfbWluID0gU1NUX01JTl9QRVJJT0RTLAotCS5wZXJpb2RzX21heCA9IFNTVF9NQVhfUEVSSU9EUywKLQkuZmlmb19zaXplID0gU1NUX0ZJRk9fU0laRSwKLX07Ci0KLS8qIE1GTEQgLSBNU0lDICovCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzc3RfcGxhdGZvcm1fZGFpW10gPSB7Ci17Ci0JLm5hbWUgPSAiSGVhZHNldC1jcHUtZGFpIiwKLQkuaWQgPSAwLAotCS5wbGF5YmFjayA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCi0JCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKLQl9LAotCS5jYXB0dXJlID0gewotCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDUsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi19LAotewotCS5uYW1lID0gIlNwZWFrZXItY3B1LWRhaSIsCi0JLmlkID0gMSwKLQkucGxheWJhY2sgPSB7Ci0JCS5jaGFubmVsc19taW4gPSBTU1RfTU9OTywKLQkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi19LAotewotCS5uYW1lID0gIlZpYnJhMS1jcHUtZGFpIiwKLQkuaWQgPSAyLAotCS5wbGF5YmFjayA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAotCQkuY2hhbm5lbHNfbWF4ID0gU1NUX01PTk8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi19LAotewotCS5uYW1lID0gIlZpYnJhMi1jcHUtZGFpIiwKLQkuaWQgPSAzLAotCS5wbGF5YmFjayA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9NT05PLAotCQkuY2hhbm5lbHNfbWF4ID0gU1NUX1NURVJFTywKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JfSwKLX0sCi17Ci0JLm5hbWUgPSAiQ29tcHJlc3MtY3B1LWRhaSIsCi0JLmNvbXByZXNzX2RhaSA9IDEsCi0JLnBsYXliYWNrID0gewotCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKLQkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwfFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCX0sCi19LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgc3N0X2NvbXBvbmVudCA9IHsKLQkubmFtZQkJPSAic3N0IiwKLX07Ci0KLS8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtLAotCQkJCQlpbnQgc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOwotCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IHN0YXRlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc3N0X2dldF9zdHJlYW1fc3RhdHVzKHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSkKLXsKLQlpbnQgc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW0tPnN0YXR1c19sb2NrLCBmbGFncyk7Ci0Jc3RhdGUgPSBzdHJlYW0tPnN0cmVhbV9zdGF0dXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOwotCXJldHVybiBzdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQgc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc3N0X3BjbV9wYXJhbXMgKnBhcmFtKQotewotCi0JcGFyYW0tPmNvZGVjID0gU1NUX0NPREVDX1RZUEVfUENNOwotCXBhcmFtLT5udW1fY2hhbiA9ICh1OCkgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKLQlwYXJhbS0+cGNtX3dkX3N6ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5zYW1wbGVfYml0czsKLQlwYXJhbS0+cmVzZXJ2ZWQgPSAwOwotCXBhcmFtLT5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKLQlwYXJhbS0+cmluZ19idWZmZXJfc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwotCXBhcmFtLT5wZXJpb2RfY291bnQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplOwotCXBhcmFtLT5yaW5nX2J1ZmZlcl9hZGRyID0gdmlydF90b19waHlzKHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhKTsKLQlwcl9kZWJ1ZygicGVyaW9kX2NudCA9ICVkXG4iLCBwYXJhbS0+cGVyaW9kX2NvdW50KTsKLQlwcl9kZWJ1Zygic2ZyZXE9ICVkLCB3ZF9zeiA9ICVkXG4iLCBwYXJhbS0+c2ZyZXEsIHBhcmFtLT5wY21fd2Rfc3opOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9hbGxvY19zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KLQkJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzc3RfcGNtX3BhcmFtcyBwYXJhbSA9IHswfTsKLQlzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgc3RyX3BhcmFtcyA9IHswfTsKLQlpbnQgcmV0X3ZhbDsKLQotCS8qIHNldCBjb2RlYyBwYXJhbXMgYW5kIGluZm9ybSBTU1QgZHJpdmVyIHRoZSBzYW1lICovCi0Jc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdWJzdHJlYW0sICZwYXJhbSk7Ci0Jc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOwotCXN0cl9wYXJhbXMuc3BhcmFtcyA9IHBhcmFtOwotCXN0cl9wYXJhbXMuY29kZWMgPSAgcGFyYW0uY29kZWM7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOwotCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gc3Vic3RyZWFtLT5wY20tPmRldmljZSArIDE7Ci0JCXByX2RlYnVnKCJQbGF5YmNrIHN0cmVhbSxEZXZpY2UgJWRcbiIsCi0JCQkJCXN1YnN0cmVhbS0+cGNtLT5kZXZpY2UpOwotCX0gZWxzZSB7Ci0JCXN0cl9wYXJhbXMub3BzID0gU1RSRUFNX09QU19DQVBUVVJFOwotCQlzdHJfcGFyYW1zLmRldmljZV90eXBlID0gU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRTsKLQkJcHJfZGVidWcoIkNhcHR1cmUgc3RyZWFtLERldmljZSAlZFxuIiwKLQkJCQkJc3Vic3RyZWFtLT5wY20tPmRldmljZSk7Ci0JfQotCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+b3Blbigmc3RyX3BhcmFtcyk7Ci0JcHJfZGVidWcoIlNTVF9TTkRfUExBWS9DQVBUVVJFIHJldF92YWwgPSAleFxuIiwgcmV0X3ZhbCk7Ci0JaWYgKHJldF92YWwgPCAwKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQotCXN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkID0gcmV0X3ZhbDsKLQlwcl9kZWJ1Zygic3RyIGlkIDogICVkXG4iLCBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzdF9wZXJpb2RfZWxhcHNlZCh2b2lkICptYWRfc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gbWFkX3N1YnN0cmVhbTsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07Ci0JaW50IHN0YXR1czsKLQotCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJ1bnRpbWUpCi0JCXJldHVybjsKLQlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXN0cmVhbSkKLQkJcmV0dXJuOwotCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOwotCWlmIChzdGF0dXMgIT0gU1NUX1BMQVRGT1JNX1JVTk5JTkcpCi0JCXJldHVybjsKLQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2luaXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSA9Ci0JCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0X3ZhbDsKLQotCXByX2RlYnVnKCJzZXR0aW5nIGJ1ZmZlciBwdHIgcGFyYW1cbiIpOwotCXNzdF9zZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0sIFNTVF9QTEFURk9STV9JTklUKTsKLQlzdHJlYW0tPnN0cmVhbV9pbmZvLnBlcmlvZF9lbGFwc2VkID0gc3N0X3BlcmlvZF9lbGFwc2VkOwotCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOwotCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7Ci0JcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKLQkJCVNTVF9TTkRfU1RSRUFNX0lOSVQsICZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKLQlpZiAocmV0X3ZhbCkKLQkJcHJfZXJyKCJjb250cm9sX3NldCByZXQgZXJyb3IgJWRcbiIsIHJldF92YWwpOwotCXJldHVybiByZXRfdmFsOwotCi19Ci0vKiBlbmQgLS0gaGVscGVyIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCWludCByZXRfdmFsOwotCi0JcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9vcGVuIGNhbGxlZFxuIik7Ci0KLQlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnNzdF9wbGF0Zm9ybV9wY21faHcpOwotCXJldF92YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAotCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwotCWlmIChyZXRfdmFsIDwgMCkKLQkJcmV0dXJuIHJldF92YWw7Ci0KLQlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdHJlYW0pCi0JCXJldHVybiAtRU5PTUVNOwotCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKLQotCS8qIGdldCB0aGUgc3N0IG9wcyAqLwotCW11dGV4X2xvY2soJnNzdF9sb2NrKTsKLQlpZiAoIXNzdCkgewotCQlwcl9lcnIoIm5vIGRldmljZSBhdmFpbGFibGUgdG8gcnVuXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0JCWtmcmVlKHN0cmVhbSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKSkgewotCQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQkJa2ZyZWUoc3RyZWFtKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXN0cmVhbS0+b3BzID0gc3N0LT5vcHM7Ci0JbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0KLQlzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCA9IDA7Ci0Jc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgU1NUX1BMQVRGT1JNX0lOSVQpOwotCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIFNTVCBBUEkgc2V0ICovCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKLQotCXByX2RlYnVnKCJzc3RfcGxhdGZvcm1fY2xvc2UgY2FsbGVkXG4iKTsKLQlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKLQlpZiAoc3RyX2lkKQotCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmNsb3NlKHN0cl9pZCk7Ci0JbW9kdWxlX3B1dChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcik7Ci0Ja2ZyZWUoc3RyZWFtKTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCWludCByZXRfdmFsID0gMCwgc3RyX2lkOwotCi0JcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSBjYWxsZWRcbiIpOwotCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOwotCWlmIChzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCkgewotCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKAotCQkJCVNTVF9TTkRfRFJPUCwgJnN0cl9pZCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQotCXJldF92YWwgPSBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN1YnN0cmVhbSk7Ci0JaWYgKHJldF92YWwgPCAwKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQlzbnByaW50ZihzdWJzdHJlYW0tPnBjbS0+aWQsIHNpemVvZihzdWJzdHJlYW0tPnBjbS0+aWQpLAotCQkJIiVkIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwotCi0JcmV0X3ZhbCA9IHNzdF9wbGF0Zm9ybV9pbml0X3N0cmVhbShzdWJzdHJlYW0pOwotCWlmIChyZXRfdmFsKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUjsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJCWludCBjbWQpCi17Ci0JaW50IHJldF92YWwgPSAwLCBzdHJfaWQ7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCWludCBzdHJfY21kLCBzdGF0dXM7Ci0KLQlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3BjbV90cmlnZ2VyIGNhbGxlZFxuIik7Ci0Jc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlwcl9kZWJ1Zygic3N0OiBUcmlnZ2VyIFN0YXJ0XG4iKTsKLQkJc3RyX2NtZCA9IFNTVF9TTkRfU1RBUlQ7Ci0JCXN0YXR1cyA9IFNTVF9QTEFURk9STV9SVU5OSU5HOwotCQlzdHJlYW0tPnN0cmVhbV9pbmZvLm1hZF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcHJfZGVidWcoInNzdDogaW4gc3RvcFxuIik7Ci0JCXN0cl9jbWQgPSBTU1RfU05EX0RST1A7Ci0JCXN0YXR1cyA9IFNTVF9QTEFURk9STV9EUk9QUEVEOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCXByX2RlYnVnKCJzc3Q6IGluIHBhdXNlXG4iKTsKLQkJc3RyX2NtZCA9IFNTVF9TTkRfUEFVU0U7Ci0JCXN0YXR1cyA9IFNTVF9QTEFURk9STV9QQVVTRUQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQkJcHJfZGVidWcoInNzdDogaW4gcGF1c2UgcmVsZWFzZVxuIik7Ci0JCXN0cl9jbWQgPSBTU1RfU05EX1JFU1VNRTsKLQkJc3RhdHVzID0gU1NUX1BMQVRGT1JNX1JVTk5JTkc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPmRldmljZV9jb250cm9sKHN0cl9jbWQsICZzdHJfaWQpOwotCWlmICghcmV0X3ZhbCkKLQkJc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgc3RhdHVzKTsKLQotCXJldHVybiByZXRfdmFsOwotfQotCi0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfcGxhdGZvcm1fcGNtX3BvaW50ZXIKLQkJCShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07Ci0JaW50IHJldF92YWwsIHN0YXR1czsKLQlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJfaW5mbzsKLQotCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOwotCWlmIChzdGF0dXMgPT0gU1NUX1BMQVRGT1JNX0lOSVQpCi0JCXJldHVybiAwOwotCXN0cl9pbmZvID0gJnN0cmVhbS0+c3RyZWFtX2luZm87Ci0JcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5kZXZpY2VfY29udHJvbCgKLQkJCQlTU1RfU05EX0JVRkZFUl9QT0lOVEVSLCBzdHJfaW5mbyk7Ci0JaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IGVycm9yIGNvZGUgPSAlZFxuIiwgcmV0X3ZhbCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQlyZXR1cm4gc3RyZWFtLT5zdHJlYW1faW5mby5idWZmZXJfcHRyOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOwotCW1lbXNldChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhLCAwLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X3BsYXRmb3JtX29wcyA9IHsKLQkub3BlbiA9IHNzdF9wbGF0Zm9ybV9vcGVuLAotCS5jbG9zZSA9IHNzdF9wbGF0Zm9ybV9jbG9zZSwKLQkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKLQkucHJlcGFyZSA9IHNzdF9wbGF0Zm9ybV9wY21fcHJlcGFyZSwKLQkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IHNzdF9wbGF0Zm9ybV9wY21fcG9pbnRlciwKLQkuaHdfcGFyYW1zID0gc3N0X3BsYXRmb3JtX3BjbV9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBzc3RfcGxhdGZvcm1fcGNtX2h3X2ZyZWUsCi19OwotCi1zdGF0aWMgdm9pZCBzc3RfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKLXsKLQlwcl9kZWJ1Zygic3N0X3BjbV9mcmVlIGNhbGxlZFxuIik7Ci0Jc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlwcl9kZWJ1Zygic3N0X3BjbV9uZXcgY2FsbGVkXG4iKTsKLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAotCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7Ci0JCXJldHZhbCA9ICBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKLQkJCVNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCi0JCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKLQkJCVNTVF9NSU5fQlVGRkVSLCBTU1RfTUFYX0JVRkZFUik7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCXByX2VycigiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uZiBmYWlsXG4iKTsKLQkJCXJldHVybiByZXR2YWw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogY29tcHJlc3Mgc3RyZWFtIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyB2b2lkIHNzdF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IChzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqKWFyZzsKLQotCXByX2RlYnVnKCJmcmFnbWVudCBlbGFwc2VkIGJ5IGRyaXZlclxuIik7Ci0JaWYgKGNzdHJlYW0pCi0JCXNuZF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKGNzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCi0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCi0Jc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOwotCWlmICghc3RyZWFtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pbml0KCZzdHJlYW0tPnN0YXR1c19sb2NrKTsKLQotCS8qIGdldCB0aGUgc3N0IG9wcyAqLwotCWlmICghc3N0IHx8ICF0cnlfbW9kdWxlX2dldChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcikpIHsKLQkJcHJfZXJyKCJubyBkZXZpY2UgYXZhaWxhYmxlIHRvIHJ1blxuIik7Ci0JCXJldF92YWwgPSAtRU5PREVWOwotCQlnb3RvIG91dF9vcHM7Ci0JfQotCXN0cmVhbS0+Y29tcHJfb3BzID0gc3N0LT5jb21wcl9vcHM7Ci0KLQlzdHJlYW0tPmlkID0gMDsKLQlzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtLCBTU1RfUExBVEZPUk1fSU5JVCk7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOwotCXJldHVybiAwOwotb3V0X29wczoKLQlrZnJlZShzdHJlYW0pOwotCXJldHVybiByZXRfdmFsOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKLQotCXN0cmVhbSA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQkvKm5lZWQgdG8gY2hlY2sqLwotCXN0cl9pZCA9IHN0cmVhbS0+aWQ7Ci0JaWYgKHN0cl9pZCkKLQkJcmV0X3ZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5jbG9zZShzdHJfaWQpOwotCW1vZHVsZV9wdXQoc3N0LT5kZXYtPmRyaXZlci0+b3duZXIpOwotCWtmcmVlKHN0cmVhbSk7Ci0JcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIHJldF92YWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9zZXRfcGFyYW1zKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyBzdHJfcGFyYW1zOwotCXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgY2I7Ci0KLQlzdHJlYW0gPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JLyogY29uc3RydWN0IGZ3IHN0cnVjdHVyZSBmb3IgdGhpcyovCi0JbWVtc2V0KCZzdHJfcGFyYW1zLCAwLCBzaXplb2Yoc3RyX3BhcmFtcykpOwotCi0Jc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOwotCXN0cl9wYXJhbXMuc3RyZWFtX3R5cGUgPSBTU1RfU1RSRUFNX1RZUEVfTVVTSUM7Ci0Jc3RyX3BhcmFtcy5kZXZpY2VfdHlwZSA9IFNORF9TU1RfREVWSUNFX0NPTVBSRVNTOwotCi0Jc3dpdGNoIChwYXJhbXMtPmNvZGVjLmlkKSB7Ci0JY2FzZSBTTkRfQVVESU9DT0RFQ19NUDM6IHsKLQkJc3RyX3BhcmFtcy5jb2RlYyA9IFNTVF9DT0RFQ19UWVBFX01QMzsKLQkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9NUDM7Ci0JCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5tcDNfcGFyYW1zLm51bV9jaGFuID0gcGFyYW1zLT5jb2RlYy5jaF9pbjsKLQkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLm1wM19wYXJhbXMucGNtX3dkX3N6ID0gMTY7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgU05EX0FVRElPQ09ERUNfQUFDOiB7Ci0JCXN0cl9wYXJhbXMuY29kZWMgPSBTU1RfQ09ERUNfVFlQRV9BQUM7Ci0JCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLmNvZGVjID0gU1NUX0NPREVDX1RZUEVfQUFDOwotCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5udW1fY2hhbiA9IHBhcmFtcy0+Y29kZWMuY2hfaW47Ci0JCXN0cl9wYXJhbXMuc3BhcmFtcy51Yy5hYWNfcGFyYW1zLnBjbV93ZF9zeiA9IDE2OwotCQlpZiAocGFyYW1zLT5jb2RlYy5mb3JtYXQgPT0gU05EX0FVRElPU1RSRUFNRk9STUFUX01QNEFEVFMpCi0JCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQotCQkJCQkJCUFBQ19CSVRfU1RSRUFNX0FEVFM7Ci0JCWVsc2UgaWYgKHBhcmFtcy0+Y29kZWMuZm9ybWF0ID09IFNORF9BVURJT1NUUkVBTUZPUk1BVF9SQVcpCi0JCQlzdHJfcGFyYW1zLnNwYXJhbXMudWMuYWFjX3BhcmFtcy5ic19mb3JtYXQgPQotCQkJCQkJCUFBQ19CSVRfU1RSRUFNX1JBVzsKLQkJZWxzZSB7Ci0JCQlwcl9lcnIoIlVuZGVmaW5lZCBmb3JtYXQlZFxuIiwgcGFyYW1zLT5jb2RlYy5mb3JtYXQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc3RyX3BhcmFtcy5zcGFyYW1zLnVjLmFhY19wYXJhbXMuZXh0ZXJuYWxzciA9Ci0JCQkJCQlwYXJhbXMtPmNvZGVjLnNhbXBsZV9yYXRlOwotCQlicmVhazsKLQl9Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoImNvZGVjIG5vdCBzdXBwb3J0ZWQsIGlkID0lZFxuIiwgcGFyYW1zLT5jb2RlYy5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cl9wYXJhbXMuYXBhcmFtcy5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgID0KLQkJCQkJdmlydF90b19waHlzKGNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcik7Ci0Jc3RyX3BhcmFtcy5hcGFyYW1zLnJpbmdfYnVmX2luZm9bMF0uc2l6ZSA9Ci0JCQkJCWNzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCXN0cl9wYXJhbXMuYXBhcmFtcy5zZ19jb3VudCA9IDE7Ci0Jc3RyX3BhcmFtcy5hcGFyYW1zLmZyYWdfc2l6ZSA9IGNzdHJlYW0tPnJ1bnRpbWUtPmZyYWdtZW50X3NpemU7Ci0KLQljYi5wYXJhbSA9IGNzdHJlYW07Ci0JY2IuY29tcHJfY2IgPSBzc3RfY29tcHJfZnJhZ21lbnRfZWxhcHNlZDsKLQotCXJldHZhbCA9IHN0cmVhbS0+Y29tcHJfb3BzLT5vcGVuKCZzdHJfcGFyYW1zLCAmY2IpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXByX2Vycigic3RyZWFtIGFsbG9jYXRpb24gZmFpbGVkICVkXG4iLCByZXR2YWwpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXN0cmVhbS0+aWQgPSByZXR2YWw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3RyaWdnZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sIGludCBjbWQpCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KLQkJY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHN0cmVhbS0+Y29tcHJfb3BzLT5jb250cm9sKGNtZCwgc3RyZWFtLT5pZCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQkJCXN0cnVjdCBzbmRfY29tcHJfdHN0YW1wICp0c3RhbXApCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCi0Jc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJlYW0tPmNvbXByX29wcy0+dHN0YW1wKHN0cmVhbS0+aWQsIHRzdGFtcCk7Ci0JdHN0YW1wLT5ieXRlX29mZnNldCA9IHRzdGFtcC0+Y29waWVkX3RvdGFsICUKLQkJCQkgKHUzMiljc3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZTsKLQlwcl9kZWJ1ZygiY2FsYyBieXRlcyBvZmZzZXQvY29waWVkIGJ5dGVzIGFzICVkXG4iLCB0c3RhbXAtPmJ5dGVfb2Zmc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfYWNrKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQlzaXplX3QgYnl0ZXMpCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCi0Jc3RyZWFtICA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJlYW0tPmNvbXByX29wcy0+YWNrKHN0cmVhbS0+aWQsICh1bnNpZ25lZCBsb25nKWJ5dGVzKTsKLQlzdHJlYW0tPmJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfZ2V0X2NhcHMoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQkJCXN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2FwcykKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQotCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jYXBzKGNhcHMpOwotfQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQkJc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQotCQljc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gc3RyZWFtLT5jb21wcl9vcHMtPmdldF9jb2RlY19jYXBzKGNvZGVjKTsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X21ldGFkYXRhKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX21ldGFkYXRhICptZXRhZGF0YSkKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gID0KLQkJIGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCXJldHVybiBzdHJlYW0tPmNvbXByX29wcy0+c2V0X21ldGFkYXRhKHN0cmVhbS0+aWQsIG1ldGFkYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfY29tcHJfb3BzIHNzdF9wbGF0Zm9ybV9jb21wcl9vcHMgPSB7Ci0KLQkub3BlbiA9IHNzdF9wbGF0Zm9ybV9jb21wcl9vcGVuLAotCS5mcmVlID0gc3N0X3BsYXRmb3JtX2NvbXByX2ZyZWUsCi0JLnNldF9wYXJhbXMgPSBzc3RfcGxhdGZvcm1fY29tcHJfc2V0X3BhcmFtcywKLQkuc2V0X21ldGFkYXRhID0gc3N0X3BsYXRmb3JtX2NvbXByX3NldF9tZXRhZGF0YSwKLQkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9jb21wcl90cmlnZ2VyLAotCS5wb2ludGVyID0gc3N0X3BsYXRmb3JtX2NvbXByX3BvaW50ZXIsCi0JLmFjayA9IHNzdF9wbGF0Zm9ybV9jb21wcl9hY2ssCi0JLmdldF9jYXBzID0gc3N0X3BsYXRmb3JtX2NvbXByX2dldF9jYXBzLAotCS5nZXRfY29kZWNfY2FwcyA9IHNzdF9wbGF0Zm9ybV9jb21wcl9nZXRfY29kZWNfY2FwcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgc3N0X3NvY19wbGF0Zm9ybV9kcnYgPSB7Ci0JLm9wcwkJPSAmc3N0X3BsYXRmb3JtX29wcywKLQkuY29tcHJfb3BzCT0gJnNzdF9wbGF0Zm9ybV9jb21wcl9vcHMsCi0JLnBjbV9uZXcJPSBzc3RfcGNtX25ldywKLQkucGNtX2ZyZWUJPSBzc3RfcGNtX2ZyZWUsCi19OwotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXQ7Ci0KLQlwcl9kZWJ1Zygic3N0X3BsYXRmb3JtX3Byb2JlIGNhbGxlZFxuIik7Ci0Jc3N0ID0gTlVMTDsKLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZzc3Rfc29jX3BsYXRmb3JtX2Rydik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoInJlZ2lzdGVyaW5nIHNvYyBwbGF0Zm9ybSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZzc3RfY29tcG9uZW50LAotCQkJCXNzdF9wbGF0Zm9ybV9kYWksIEFSUkFZX1NJWkUoc3N0X3BsYXRmb3JtX2RhaSkpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJyZWdpc3RlcmluZyBjcHUgZGFpcyBmYWlsZWRcbiIpOwotCQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0Jc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9yZW1vdmUgc3VjY2Vzc1xuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9wbGF0Zm9ybV9kcml2ZXIgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCQk9ICJzc3QtcGxhdGZvcm0iLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gc3N0X3BsYXRmb3JtX3Byb2JlLAotCS5yZW1vdmUJCT0gc3N0X3BsYXRmb3JtX3JlbW92ZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3N0X3BsYXRmb3JtX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBNSUQgUGxhdGZvcm0gZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4iKTsKLU1PRFVMRV9BVVRIT1IoIkhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06c3N0LXBsYXRmb3JtIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0X3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTY0ZmIuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdF9wbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiAgc3N0X3BsYXRmb3JtLmggLSBJbnRlbCBNSUQgUGxhdGZvcm0gZHJpdmVyIGhlYWRlciBmaWxlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMCBJbnRlbCBDb3JwCi0gKiAgQXV0aG9yOiBWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqICBBdXRob3I6IEhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKgotICovCi0KLSNpZm5kZWYgX19TU1RfUExBVEZPUk1EUlZfSF9fCi0jZGVmaW5lIF9fU1NUX1BMQVRGT1JNRFJWX0hfXwotCi0jaW5jbHVkZSAic3N0X2RzcC5oIgotCi0jZGVmaW5lIFNTVF9NT05PCQkxCi0jZGVmaW5lIFNTVF9TVEVSRU8JCTIKLSNkZWZpbmUgU1NUX01BWF9DQVAJCTUKLQotI2RlZmluZSBTU1RfTUFYX0JVRkZFUgkJKDgwMCoxMDI0KQotI2RlZmluZSBTU1RfTUlOX0JVRkZFUgkJKDgwMCoxMDI0KQotI2RlZmluZSBTU1RfTUlOX1BFUklPRF9CWVRFUwkzMgotI2RlZmluZSBTU1RfTUFYX1BFUklPRF9CWVRFUwlTU1RfTUFYX0JVRkZFUgotI2RlZmluZSBTU1RfTUlOX1BFUklPRFMJCTIKLSNkZWZpbmUgU1NUX01BWF9QRVJJT0RTCQkoMTAyNCoyKQotI2RlZmluZSBTU1RfRklGT19TSVpFCQkwCi0KLXN0cnVjdCBwY21fc3RyZWFtX2luZm8gewotCWludCBzdHJfaWQ7Ci0Jdm9pZCAqbWFkX3N1YnN0cmVhbTsKLQl2b2lkICgqcGVyaW9kX2VsYXBzZWQpICh2b2lkICptYWRfc3Vic3RyZWFtKTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYnVmZmVyX3B0cjsKLQlpbnQgc2ZyZXE7Ci19OwotCi1lbnVtIHNzdF9kcnZfc3RhdHVzIHsKLQlTU1RfUExBVEZPUk1fSU5JVCA9IDEsCi0JU1NUX1BMQVRGT1JNX1NUQVJURUQsCi0JU1NUX1BMQVRGT1JNX1JVTk5JTkcsCi0JU1NUX1BMQVRGT1JNX1BBVVNFRCwKLQlTU1RfUExBVEZPUk1fRFJPUFBFRCwKLX07Ci0KLWVudW0gc3N0X2NvbnRyb2xzIHsKLQlTU1RfU05EX0FMTE9DID0JCQkweDAwLAotCVNTVF9TTkRfUEFVU0UgPQkJCTB4MDEsCi0JU1NUX1NORF9SRVNVTUUgPQkJMHgwMiwKLQlTU1RfU05EX0RST1AgPQkJCTB4MDMsCi0JU1NUX1NORF9GUkVFID0JCQkweDA0LAotCVNTVF9TTkRfQlVGRkVSX1BPSU5URVIgPQkweDA1LAotCVNTVF9TTkRfU1RSRUFNX0lOSVQgPQkJMHgwNiwKLQlTU1RfU05EX1NUQVJUCSA9CQkweDA3LAotCVNTVF9NQVhfQ09OVFJPTFMgPQkJMHgwNywKLX07Ci0KLWVudW0gc3N0X3N0cmVhbV9vcHMgewotCVNUUkVBTV9PUFNfUExBWUJBQ0sgPSAwLAotCVNUUkVBTV9PUFNfQ0FQVFVSRSwKLX07Ci0KLWVudW0gc3N0X2F1ZGlvX2RldmljZV90eXBlIHsKLQlTTkRfU1NUX0RFVklDRV9IRUFEU0VUID0gMSwKLQlTTkRfU1NUX0RFVklDRV9JSEYsCi0JU05EX1NTVF9ERVZJQ0VfVklCUkEsCi0JU05EX1NTVF9ERVZJQ0VfSEFQVElDLAotCVNORF9TU1RfREVWSUNFX0NBUFRVUkUsCi0JU05EX1NTVF9ERVZJQ0VfQ09NUFJFU1MsCi19OwotCi0vKiBQQ00gUGFyYW1ldGVycyAqLwotc3RydWN0IHNzdF9wY21fcGFyYW1zIHsKLQl1MTYgY29kZWM7CS8qIGNvZGVjIHR5cGUgKi8KLQl1OCBudW1fY2hhbjsJLyogMT1Nb25vLCAyPVN0ZXJlbyAqLwotCXU4IHBjbV93ZF9zejsJLyogMTYvMjQgLSBiaXQqLwotCXUzMiByZXNlcnZlZDsJLyogQml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQgKi8KLQl1MzIgc2ZyZXE7CS8qIFNhbXBsaW5nIHJhdGUgaW4gSHogKi8KLQl1MzIgcmluZ19idWZmZXJfc2l6ZTsKLQl1MzIgcGVyaW9kX2NvdW50OwkvKiBwZXJpb2QgZWxhcHNlZCBpbiBzYW1wbGVzKi8KLQl1MzIgcmluZ19idWZmZXJfYWRkcjsKLX07Ci0KLXN0cnVjdCBzc3Rfc3RyZWFtX3BhcmFtcyB7Ci0JdTMyIHJlc3VsdDsKLQl1MzIgc3RyZWFtX2lkOwotCXU4IGNvZGVjOwotCXU4IG9wczsKLQl1OCBzdHJlYW1fdHlwZTsKLQl1OCBkZXZpY2VfdHlwZTsKLQlzdHJ1Y3Qgc3N0X3BjbV9wYXJhbXMgc3BhcmFtczsKLX07Ci0KLXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgewotCXZvaWQgKnBhcmFtOwotCXZvaWQgKCpjb21wcl9jYikodm9pZCAqcGFyYW0pOwotfTsKLQotc3RydWN0IGNvbXByZXNzX3NzdF9vcHMgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50ICgqb3BlbikgKHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtcywKLQkJCXN0cnVjdCBzc3RfY29tcHJlc3NfY2IgKmNiKTsKLQlpbnQgKCpjb250cm9sKSAodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgaW50IHN0cl9pZCk7Ci0JaW50ICgqdHN0YW1wKSAodW5zaWduZWQgaW50IHN0cl9pZCwgc3RydWN0IHNuZF9jb21wcl90c3RhbXAgKnRzdGFtcCk7Ci0JaW50ICgqYWNrKSAodW5zaWduZWQgaW50IHN0cl9pZCwgdW5zaWduZWQgbG9uZyBieXRlcyk7Ci0JaW50ICgqY2xvc2UpICh1bnNpZ25lZCBpbnQgc3RyX2lkKTsKLQlpbnQgKCpnZXRfY2FwcykgKHN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2Fwcyk7Ci0JaW50ICgqZ2V0X2NvZGVjX2NhcHMpIChzdHJ1Y3Qgc25kX2NvbXByX2NvZGVjX2NhcHMgKmNvZGVjKTsKLQlpbnQgKCpzZXRfbWV0YWRhdGEpICh1bnNpZ25lZCBpbnQgc3RyX2lkLAotCQkJc3RydWN0IHNuZF9jb21wcl9tZXRhZGF0YSAqbWRhdGEpOwotCi19OwotCi1zdHJ1Y3Qgc3N0X29wcyB7Ci0JaW50ICgqb3BlbikgKHN0cnVjdCBzc3Rfc3RyZWFtX3BhcmFtcyAqc3RyX3BhcmFtKTsKLQlpbnQgKCpkZXZpY2VfY29udHJvbCkgKGludCBjbWQsIHZvaWQgKmFyZyk7Ci0JaW50ICgqY2xvc2UpICh1bnNpZ25lZCBpbnQgc3RyX2lkKTsKLX07Ci0KLXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gewotCWludCAgICAgc3RyZWFtX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0Jc2l6ZV90IGJ5dGVzX3dyaXR0ZW47Ci0Jc3RydWN0IHBjbV9zdHJlYW1faW5mbyBzdHJlYW1faW5mbzsKLQlzdHJ1Y3Qgc3N0X29wcyAqb3BzOwotCXN0cnVjdCBjb21wcmVzc19zc3Rfb3BzICpjb21wcl9vcHM7Ci0Jc3BpbmxvY2tfdAlzdGF0dXNfbG9jazsKLX07Ci0KLXN0cnVjdCBzc3RfZGV2aWNlIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc3N0X29wcyAqb3BzOwotCXN0cnVjdCBjb21wcmVzc19zc3Rfb3BzICpjb21wcl9vcHM7Ci19OwotCi1pbnQgc3N0X3JlZ2lzdGVyX2RzcChzdHJ1Y3Qgc3N0X2RldmljZSAqc3N0KTsKLWludCBzc3RfdW5yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKnNzdCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnIGIvc291bmQvc29jL2tpcmt3b29kL0tjb25maWcKaW5kZXggNzhlZDRhNC4uNDlmODQzNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL0tjb25maWcKKysrIGIvc291bmQvc29jL2tpcmt3b29kL0tjb25maWcKQEAgLTEsMTEgKzEsMjAgQEAKIGNvbmZpZyBTTkRfS0lSS1dPT0RfU09DCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgdGhlIE1hcnZlbGwgS2lya3dvb2QgYW5kIERvdmUgY2hpcHMiCi0JZGVwZW5kcyBvbiBBUkNIX0tJUktXT09EIHx8IEFSQ0hfRE9WRSB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEFSQ0hfS0lSS1dPT0QgfHwgQVJDSF9ET1ZFIHx8IEFSQ0hfTVZFQlUgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgY29kZWNzIGF0dGFjaGVkIHRvCiAJICB0aGUgS2lya3dvb2QgSTJTIGludGVyZmFjZS4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHNlbGVjdCB0aGUKIAkgIGF1ZGlvIGludGVyZmFjZXMgdG8gc3VwcG9ydCBiZWxvdy4KIAorY29uZmlnIFNORF9LSVJLV09PRF9TT0NfQVJNQURBMzcwX0RCCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBBcm1hZGEgMzcwIERCIgorCWRlcGVuZHMgb24gU05EX0tJUktXT09EX1NPQyAmJiAoQVJDSF9NVkVCVSB8fCBDT01QSUxFX1RFU1QpICYmIEkyQworCXNlbGVjdCBTTkRfU09DX0NTNDJMNTEKKwlzZWxlY3QgU05EX1NPQ19TUERJRgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24KKwkgIHRoZSBBcm1hZGEgMzcwIERldmVsb3BtZW50IEJvYXJkLgorCiBjb25maWcgU05EX0tJUktXT09EX1NPQ19PUEVOUkQKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIEtpcmt3b29kIE9wZW5yZCBDbGllbnQiCiAJZGVwZW5kcyBvbiBTTkRfS0lSS1dPT0RfU09DICYmIChNQUNIX09QRU5SRF9DTElFTlQgfHwgTUFDSF9PUEVOUkRfVUxUSU1BVEUgfHwgQ09NUElMRV9URVNUKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL01ha2VmaWxlIGIvc291bmQvc29jL2tpcmt3b29kL01ha2VmaWxlCmluZGV4IDllNzgxMzguLjdjMWQ4ZmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2Mva2lya3dvb2QvTWFrZWZpbGUKQEAgLTQsNiArNCw4IEBACiAKIHNuZC1zb2Mtb3BlbnJkLW9ianMgOj0ga2lya3dvb2Qtb3BlbnJkLm8KIHNuZC1zb2MtdDUzMjUtb2JqcyA6PSBraXJrd29vZC10NTMyNS5vCitzbmQtc29jLWFybWFkYS0zNzAtZGItb2JqcyA6PSBhcm1hZGEtMzcwLWRiLm8KIAorb2JqLSQoQ09ORklHX1NORF9LSVJLV09PRF9TT0NfQVJNQURBMzcwX0RCKSArPSBzbmQtc29jLWFybWFkYS0zNzAtZGIubwogb2JqLSQoQ09ORklHX1NORF9LSVJLV09PRF9TT0NfT1BFTlJEKSArPSBzbmQtc29jLW9wZW5yZC5vCiBvYmotJChDT05GSUdfU05EX0tJUktXT09EX1NPQ19UNTMyNSkgKz0gc25kLXNvYy10NTMyNS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2QvYXJtYWRhLTM3MC1kYi5jIGIvc291bmQvc29jL2tpcmt3b29kL2FybWFkYS0zNzAtZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQzMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2tpcmt3b29kL2FybWFkYS0zNzAtZGIuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNYXJ2ZWxsCisgKgorICogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2Fzb2Mta2lya3dvb2QuaD4KKyNpbmNsdWRlICIuLi9jb2RlY3MvY3M0Mmw1MS5oIgorCitzdGF0aWMgaW50IGEzNzBkYl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJdW5zaWduZWQgaW50IGZyZXE7CisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwlkZWZhdWx0OgorCWNhc2UgNDQxMDA6CisJCWZyZXEgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJZnJlcSA9IDEyMjg4MDAwOworCQlicmVhazsKKwljYXNlIDk2MDAwOgorCQlmcmVxID0gMjQ1NzYwMDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgZnJlcSwgU05EX1NPQ19DTE9DS19JTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYTM3MGRiX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYTM3MGRiX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhMzcwZGJfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJPdXQgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJJbiBKYWNrIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhMzcwZGJfcm91dGVbXSA9IHsKKwl7ICJPdXQgSmFjayIsCU5VTEwsCSJIUEwiIH0sCisJeyAiT3V0IEphY2siLAlOVUxMLAkiSFBSIiB9LAorCXsgIkFJTjFMIiwJTlVMTCwJIkluIEphY2siIH0sCisJeyAiQUlOMUwiLAlOVUxMLAkiSW4gSmFjayIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBhMzcwZGJfZGFpW10gPSB7Cit7CisJLm5hbWUgPSAiQ1M0Mkw1MSIsCisJLnN0cmVhbV9uYW1lID0gImFuYWxvZyIsCisJLmNwdV9kYWlfbmFtZSA9ICJpMnMiLAorCS5jb2RlY19kYWlfbmFtZSA9ICJjczQybDUxLWhpZmkiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwkub3BzID0gJmEzNzBkYl9vcHMsCit9LAoreworCS5uYW1lID0gIlMvUERJRiBvdXQiLAorCS5zdHJlYW1fbmFtZSA9ICJzcGRpZi1vdXQiLAorCS5jcHVfZGFpX25hbWUgPSAic3BkaWYiLAorCS5jb2RlY19kYWlfbmFtZSA9ICJkaXQtaGlmaSIsCisJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorfSwKK3sKKwkubmFtZSA9ICJTL1BESUYgaW4iLAorCS5zdHJlYW1fbmFtZSA9ICJzcGRpZi1pbiIsCisJLmNwdV9kYWlfbmFtZSA9ICJzcGRpZiIsCisJLmNvZGVjX2RhaV9uYW1lID0gImRpci1oaWZpIiwKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCit9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYTM3MGRiID0geworCS5uYW1lID0gImEzNzBkYiIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmRhaV9saW5rID0gYTM3MGRiX2RhaSwKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShhMzcwZGJfZGFpKSwKKwkuZGFwbV93aWRnZXRzID0gYTM3MGRiX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYTM3MGRiX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYTM3MGRiX3JvdXRlLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGEzNzBkYl9yb3V0ZSksCit9OworCitzdGF0aWMgaW50IGEzNzBkYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmYTM3MGRiOworCisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWEzNzBkYl9kYWlbMF0uY3B1X29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAibWFydmVsbCxhdWRpby1jb250cm9sbGVyIiwgMCk7CisJYTM3MGRiX2RhaVswXS5wbGF0Zm9ybV9vZl9ub2RlID0gYTM3MGRiX2RhaVswXS5jcHVfb2Zfbm9kZTsKKworCWEzNzBkYl9kYWlbMF0uY29kZWNfb2Zfbm9kZSA9CisJCW9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICJtYXJ2ZWxsLGF1ZGlvLWNvZGVjIiwgMCk7CisKKwlhMzcwZGJfZGFpWzFdLmNwdV9vZl9ub2RlID0gYTM3MGRiX2RhaVswXS5jcHVfb2Zfbm9kZTsKKwlhMzcwZGJfZGFpWzFdLnBsYXRmb3JtX29mX25vZGUgPSBhMzcwZGJfZGFpWzBdLmNwdV9vZl9ub2RlOworCisJYTM3MGRiX2RhaVsxXS5jb2RlY19vZl9ub2RlID0KKwkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgIm1hcnZlbGwsYXVkaW8tY29kZWMiLCAxKTsKKworCWEzNzBkYl9kYWlbMl0uY3B1X29mX25vZGUgPSBhMzcwZGJfZGFpWzBdLmNwdV9vZl9ub2RlOworCWEzNzBkYl9kYWlbMl0ucGxhdGZvcm1fb2Zfbm9kZSA9IGEzNzBkYl9kYWlbMF0uY3B1X29mX25vZGU7CisKKwlhMzcwZGJfZGFpWzJdLmNvZGVjX29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAibWFydmVsbCxhdWRpby1jb2RlYyIsIDIpOworCisJcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQtPmRldiwgY2FyZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGEzNzBkYl9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYTM3MGRiLWF1ZGlvIiB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGEzNzBkYl9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImEzNzBkYi1hdWRpbyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYTM3MGRiX2R0X2lkcyksCisJfSwKKwkucHJvYmUJCT0gYTM3MGRiX3Byb2JlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhMzcwZGJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIGEzNzBkYiBhdWRpbyBjbGllbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YTM3MGRiLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMKaW5kZXggMzkyMGE1ZS4uOWY4NDIyMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1pMnMuYwpAQCAtNjMzLDYgKzYzMyw3IEBACiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtdmVidV9hdWRpb19vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxraXJrd29vZC1hdWRpbyIgfSwKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsZG92ZS1hdWRpbyIgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhMzcwLWF1ZGlvIiB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG12ZWJ1X2F1ZGlvX29mX21hdGNoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcgYi9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCmluZGV4IDIyYWQ5YzUuLmUwMDY1OTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKKysrIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwpAQCAtNTgsNyArNTgsNyBAQAogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3Igb21hcCBvc2s1OTEyIgogCWRlcGVuZHMgb24gU05EX09NQVBfU09DICYmIE1BQ0hfT01BUF9PU0sgJiYgSTJDCiAJc2VsZWN0IFNORF9PTUFQX1NPQ19NQ0JTUAotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBvc2s1OTEyLgogCkBAIC02Niw3ICs2Niw3IEBACiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBPTUFQMzUxNyAvIEFNMzUxNyBFVk0iCiAJZGVwZW5kcyBvbiBTTkRfT01BUF9TT0MgJiYgTUFDSF9PTUFQMzUxN0VWTSAmJiBJMkMKIAlzZWxlY3QgU05EX09NQVBfU09DX01DQlNQCi0Jc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBPTUFQMzUxNyAvIEFNMzUxNwogCSAgRVZNLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMgYi9zb3VuZC9zb2Mvb21hcC9hbXMtZGVsdGEuYwppbmRleCA2Mjk0NDY0Li41NmE1MjE5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9hbXMtZGVsdGEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9hbXMtZGVsdGEuYwpAQCAtMTAzLDYwICsxMDMsNjIgQEAKIAlpZiAoIWNvZGVjLT5od193cml0ZSkKIAkJcmV0dXJuIC1FVU5BVENIOwogCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj0gY29udHJvbC0+bWF4KQorCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IGNvbnRyb2wtPml0ZW1zKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAKIAkvKiBUcmFuc2xhdGUgc2VsZWN0aW9uIHRvIGJpdG1hcCAqLwogCXBpbnMgPSBhbXNfZGVsdGFfYXVkaW9fbW9kZV9waW5zW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF1dOwogCiAJLyogU2V0dXAgcGlucyBhZnRlciBjb3JyZXNwb25kaW5nIGJpdHMgaWYgY2hhbmdlZCAqLwogCXBpbiA9ICEhKHBpbnMgJiAoMSA8PCBBTVNfREVMVEFfTU9VVEhQSUVDRSkpOworCiAJaWYgKHBpbiAhPSBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIk1vdXRocGllY2UiKSkgewogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNb3V0aHBpZWNlIik7CisJCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTW91dGhwaWVjZSIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1vdXRocGllY2UiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTW91dGhwaWVjZSIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX0VBUlBJRUNFKSk7CiAJaWYgKHBpbiAhPSBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIkVhcnBpZWNlIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRWFycGllY2UiKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFYXJwaWVjZSIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkVhcnBpZWNlIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVhcnBpZWNlIik7CiAJfQogCXBpbiA9ICEhKHBpbnMgJiAoMSA8PCBBTVNfREVMVEFfTUlDUk9QSE9ORSkpOwogCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJNaWNyb3Bob25lIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljcm9waG9uZSIpOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pY3JvcGhvbmUiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWNyb3Bob25lIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pY3JvcGhvbmUiKTsKIAl9CiAJcGluID0gISEocGlucyAmICgxIDw8IEFNU19ERUxUQV9TUEVBS0VSKSk7CiAJaWYgKHBpbiAhPSBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIlNwZWFrZXIiKSkgewogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU3BlYWtlciIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU3BlYWtlciIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX0FHQykpOwogCWlmIChwaW4gIT0gYW1zX2RlbHRhX2F1ZGlvX2FnYykgewogCQlhbXNfZGVsdGFfYXVkaW9fYWdjID0gcGluOwogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBR0NJTiIpOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkFHQ0lOIik7CiAJCWVsc2UKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQUdDSU4iKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQUdDSU4iKTsKIAl9Ci0JaWYgKGNoYW5nZWQpCi0JCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCWlmIChjaGFuZ2VkKQorCQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiAKIAlyZXR1cm4gY2hhbmdlZDsKIH0KQEAgLTE5NCwxMyArMTk2LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYW1zX2RlbHRhX2F1ZGlvX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoYW1zX2RlbHRhX2F1ZGlvX21vZGUpLAotCQkJCQkJYW1zX2RlbHRhX2F1ZGlvX21vZGUpLAotfTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woYW1zX2RlbHRhX2F1ZGlvX2VudW0sCisJCQkJICAgICAgYW1zX2RlbHRhX2F1ZGlvX21vZGUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW1zX2RlbHRhX2F1ZGlvX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJBdWRpbyBNb2RlIiwgYW1zX2RlbHRhX2F1ZGlvX2VudW1bMF0sCisJU09DX0VOVU1fRVhUKCJBdWRpbyBNb2RlIiwgYW1zX2RlbHRhX2F1ZGlvX2VudW0sCiAJCQlhbXNfZGVsdGFfZ2V0X2F1ZGlvX21vZGUsIGFtc19kZWx0YV9zZXRfYXVkaW9fbW9kZSksCiB9OwogCkBAIC0zMTUsMTIgKzMxNSwxNyBAQAogCXYyNTNfb3BzLmNsb3NlKHR0eSk7CiAKIAkvKiBSZXZlcnQgYmFjayB0byBkZWZhdWx0IGF1ZGlvIGlucHV0L291dHB1dCBjb25zdGVsbGF0aW9uICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNb3V0aHBpZWNlIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVhcnBpZWNlIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pY3JvcGhvbmUiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFHQ0lOIik7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1vdXRocGllY2UiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRWFycGllY2UiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljcm9waG9uZSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiQUdDSU4iKTsKKworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogLyogTGluZSBkaXNjaXBsaW5lIC5oYW5ndXAoKSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbjgxMC5jIGIvc291bmQvc29jL29tYXAvbjgxMC5jCmluZGV4IGQxNjNlMTguLmZkNGQ5YzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL244MTAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9uODEwLmMKQEAgLTY4LDI2ICs2OCwzMCBAQAogCQlicmVhazsKIAl9CiAKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChuODEwX3Nwa19mdW5jKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCiAJaWYgKGhwKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlpZiAobGluZTFsKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTElORTFMIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FMUwiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTElORTFMIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORTFMIik7CiAKIAlpZiAobjgxMF9kbWljX2Z1bmMpCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJETWljIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJETWljIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkRNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJETWljIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgbjgxMF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jIGIvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jCmluZGV4IGViYjEzOTAuLjAyNGRhZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMKQEAgLTIwMyw4ICsyMDMsNyBAQAogCiBzdGF0aWMgaW50IG9tYXBfYWJlX2RtaWNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZydGQtPmNhcmQtPmRhcG07CiAKIAlyZXR1cm4gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgZG1pY19hdWRpb19tYXAsCiAJCQkJQVJSQVlfU0laRShkbWljX2F1ZGlvX21hcCkpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvcng1MS5jIGIvc291bmQvc29jL29tYXAvcng1MS5jCmluZGV4IDYxMTE3OWMuLjdmYjNkNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL3J4NTEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9yeDUxLmMKQEAgLTc0LDI2ICs3NCwzMCBAQAogCQlicmVhazsKIAl9CiAKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChyeDUxX3Nwa19mdW5jKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWlmIChyeDUxX2RtaWNfZnVuYykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkRNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkRNaWMiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkRNaWMiKTsKIAlpZiAoaHApCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCWlmIChocykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhTIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSFMgTWljIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhTIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhTIE1pYyIpOwogCiAJZ3Bpb19zZXRfdmFsdWUoUlg1MV9UVk9VVF9TRUxfR1BJTywgdHZvdXQpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IHJ4NTFfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvY29yZ2kuYyBiL3NvdW5kL3NvYy9weGEvY29yZ2kuYwppbmRleCAxODUzZDQxLi41YTg4MTM2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKKysrIGIvc291bmQvc29jL3B4YS9jb3JnaS5jCkBAIC00Nyw2NCArNDcsNjMgQEAKIAogc3RhdGljIHZvaWQgY29yZ2lfZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQogeworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCiAJLyogc2V0IHVwIGphY2sgY29ubmVjdGlvbiAqLwogCXN3aXRjaCAoY29yZ2lfamFja19mdW5jKSB7CiAJY2FzZSBDT1JHSV9IUDoKIAkJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfTCwgMSk7CiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9SLCAxKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBDT1JHSV9NSUM6CiAJCS8qIHJlc2V0ID0gbXV0ZSBoZWFkcGhvbmUgKi8KIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMCk7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgQ09SR0lfTElORToKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMCk7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgQ09SR0lfSEVBRFNFVDoKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMSk7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAl9CiAKIAlpZiAoY29yZ2lfc3BrX2Z1bmMgPT0gQ09SR0lfU1BLX09OKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRXh0IFNwayIpOwogCiAJLyogc2lnbmFsIGEgREFQTSBldmVudCAqLwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogc3RhdGljIGludCBjb3JnaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKIAogCS8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBhdCBzdHJlYW0gc3RhcnR1cCAqLwotCWNvcmdpX2V4dF9jb250cm9sKCZjb2RlYy0+ZGFwbSk7Ci0KLQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJY29yZ2lfZXh0X2NvbnRyb2woJnJ0ZC0+Y2FyZC0+ZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYyBiL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYwppbmRleCA0NGI1YzA5Li5jMjlmZWRhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMKKysrIGIvc291bmQvc29jL3B4YS9lNzQwX3dtOTcwNS5jCkBAIC0xMDMsMTEgKzEwMyw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUENCRUVQIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTUlDMiIpOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBlNzQwX2RhcG1fd2lkZ2V0cywKLQkJCQkJQVJSQVlfU0laRShlNzQwX2RhcG1fd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNiw2ICsxMzEsMTEgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSBlNzQwX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRShlNzQwX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0gZTc0MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGU3NDBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ3BpbyBlNzQwX2F1ZGlvX2dwaW9zW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKaW5kZXggYzM0ZTQ0Ny4uZWUzNmFiYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9lNzUwX3dtOTcwNS5jCisrKyBiL3NvdW5kL3NvYy9weGEvZTc1MF93bTk3MDUuYwpAQCAtODUsMTEgKzg1LDYgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQQ0JFRVAiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMyIik7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGU3NTBfZGFwbV93aWRnZXRzLAotCQkJCQlBUlJBWV9TSVpFKGU3NTBfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE5LDYgKzExNCwxMSBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5kYWlfbGluayA9IGU3NTBfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGU3NTBfZGFpKSwKKworCS5kYXBtX3dpZGdldHMgPSBlNzUwX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZTc1MF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBncGlvIGU3NTBfYXVkaW9fZ3Bpb3NbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYyBiL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYwppbmRleCAzMTM3ZjgwLi4yNGMyMDc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U4MDBfd205NzEyLmMKKysrIGIvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jCkBAIC03MSwxOSArNzEsNiBAQAogCXsiTUlDMiIsIE5VTEwsICJNaWMgKEludGVybmFsMikifSwKIH07CiAKLXN0YXRpYyBpbnQgZTgwMF9hYzk3X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgZTgwMF9kYXBtX3dpZGdldHMsCi0JCQkJCUFSUkFZX1NJWkUoZTgwMF9kYXBtX3dpZGdldHMpKTsKLQotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgZTgwMF9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lID0gIkFDOTciLApAQCAtOTIsNyArNzksNiBAQAogCQkuY29kZWNfZGFpX25hbWUgPSAid205NzEyLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJweGEtcGNtLWF1ZGlvIiwKIAkJLmNvZGVjX25hbWUgPSAid205NzEyLWNvZGVjIiwKLQkJLmluaXQgPSBlODAwX2FjOTdfaW5pdCwKIAl9LAogCXsKIAkJLm5hbWUgPSAiQUM5NyBBdXgiLApAQCAtMTA5LDYgKzk1LDExIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gZTgwMF9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoZTgwMF9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IGU4MDBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShlODAwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGdwaW8gZTgwMF9hdWRpb19ncGlvc1tdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jIGIvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jCmluZGV4IGFhY2UxOWUuLjI1OWUwNDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYworKysgYi9zb3VuZC9zb2MvcHhhL21hZ2ljaWFuLmMKQEAgLTQxLDQ0ICs0MSw0MiBAQAogc3RhdGljIGludCBtYWdpY2lhbl9zcGtfc3dpdGNoID0gMTsKIHN0YXRpYyBpbnQgbWFnaWNpYW5faW5fc2VsID0gTUFHSUNJQU5fTUlDOwogCi1zdGF0aWMgdm9pZCBtYWdpY2lhbl9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCBtYWdpY2lhbl9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAKIAlpZiAobWFnaWNpYW5fc3BrX3N3aXRjaCkKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAlpZiAobWFnaWNpYW5faHBfc3dpdGNoKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAogCXN3aXRjaCAobWFnaWNpYW5faW5fc2VsKSB7CiAJY2FzZSBNQUdJQ0lBTl9NSUM6Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkNhbGwgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkNhbGwgTWljIik7CiAJCWJyZWFrOwogCWNhc2UgTUFHSUNJQU5fTUlDX0VYVDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJDYWxsIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKIAkJYnJlYWs7CiAJfQogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IG1hZ2ljaWFuX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOwogCiAJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCi0JbWFnaWNpYW5fZXh0X2NvbnRyb2woY29kZWMpOwotCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCW1hZ2ljaWFuX2V4dF9jb250cm9sKCZydGQtPmNhcmQtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNzcsMTMgKzI3NSwxMyBAQAogc3RhdGljIGludCBtYWdpY2lhbl9zZXRfaHAoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCiAJaWYgKG1hZ2ljaWFuX2hwX3N3aXRjaCA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJcmV0dXJuIDA7CiAKIAltYWdpY2lhbl9ocF9zd2l0Y2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQltYWdpY2lhbl9leHRfY29udHJvbChjb2RlYyk7CisJbWFnaWNpYW5fZXh0X2NvbnRyb2woJmNhcmQtPmRhcG0pOwogCXJldHVybiAxOwogfQogCkBAIC0yOTcsMTMgKzI5NSwxMyBAQAogc3RhdGljIGludCBtYWdpY2lhbl9zZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCiAJaWYgKG1hZ2ljaWFuX3Nwa19zd2l0Y2ggPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXJldHVybiAwOwogCiAJbWFnaWNpYW5fc3BrX3N3aXRjaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCW1hZ2ljaWFuX2V4dF9jb250cm9sKGNvZGVjKTsKKwltYWdpY2lhbl9leHRfY29udHJvbCgmY2FyZC0+ZGFwbSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQwMCw3ICszOTgsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAkvKiBOQyBjb2RlYyBwaW5zICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiVk9VVExIUCIpOwpAQCAtNDEwLDE5ICs0MDcsNiBAQAogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlZJTkwiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJWSU5SIik7CiAKLQkvKiBBZGQgbWFnaWNpYW4gc3BlY2lmaWMgY29udHJvbHMgKi8KLQllcnIgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgdWRhMTM4MF9tYWdpY2lhbl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHVkYTEzODBfbWFnaWNpYW5fY29udHJvbHMpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIEFkZCBtYWdpY2lhbiBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBtYWdpY2lhbiBzcGVjaWZpYyBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU2LDYgKzQ0MCwxMiBAQAogCS5kYWlfbGluayA9IG1hZ2ljaWFuX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRShtYWdpY2lhbl9kYWkpLAogCisJLmNvbnRyb2xzID0gdWRhMTM4MF9tYWdpY2lhbl9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh1ZGExMzgwX21hZ2ljaWFuX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gdWRhMTM4MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptYWdpY2lhbl9zbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jIGIvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jCmluZGV4IDE2MGM1MjQuLjU5NWVlZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYworKysgYi9zb3VuZC9zb2MvcHhhL21pb2E3MDFfd205NzEzLmMKQEAgLTEyNywxNiArMTI3LDggQEAKIHN0YXRpYyBpbnQgbWlvYTcwMV93bTk3MTNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCXVuc2lnbmVkIHNob3J0IHJlZzsKIAotCS8qIEFkZCBtaW9hNzAxIHNwZWNpZmljIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1pb2E3MDFfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShtaW9hNzAxX2RhcG1fd2lkZ2V0cykpOwotCi0JLyogU2V0IHVwIG1pb2E3MDEgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXBuZWN0cyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQogCS8qIFByZXBhcmUgR1BJTzggZm9yIHJlYXIgc3BlYWtlciBhbXBsaWZpZXIgKi8KIAlyZWcgPSBjb2RlYy0+ZHJpdmVyLT5yZWFkKGNvZGVjLCBBQzk3X0dQSU9fQ0ZHKTsKIAljb2RlYy0+ZHJpdmVyLT53cml0ZShjb2RlYywgQUM5N19HUElPX0NGRywgcmVnIHwgMHgwMTAwKTsKQEAgLTE0NSwxMiArMTM3LDYgQEAKIAlyZWcgPSBjb2RlYy0+ZHJpdmVyLT5yZWFkKGNvZGVjLCBBQzk3XzNEX0NPTlRST0wpOwogCWNvZGVjLT5kcml2ZXItPndyaXRlKGNvZGVjLCBBQzk3XzNEX0NPTlRST0wsIHJlZyB8IDB4YzAwMCk7CiAKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRnJvbnQgU3BlYWtlciIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJSZWFyIFNwZWFrZXIiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRnJvbnQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIE91dCIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4Myw2ICsxNjksMTEgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSBtaW9hNzAxX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRShtaW9hNzAxX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0gbWlvYTcwMV9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1pb2E3MDFfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgbWlvYTcwMV93bTk3MTNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCmluZGV4IGM5M2UxMzguLmM2YmRjNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMKKysrIGIvc291bmQvc29jL3B4YS9wb29kbGUuYwpAQCAtNzQsMTQgKzc0LDkgQEAKIHN0YXRpYyBpbnQgcG9vZGxlX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOwogCiAJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCi0JcG9vZGxlX2V4dF9jb250cm9sKCZjb2RlYy0+ZGFwbSk7Ci0KLQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJcG9vZGxlX2V4dF9jb250cm9sKCZydGQtPmNhcmQtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3NwaXR6LmMgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKaW5kZXggZmMwNTJkOC4uMTM3M2IwMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9zcGl0ei5jCisrKyBiL3NvdW5kL3NvYy9weGEvc3BpdHouYwpAQCAtNDYsNzQgKzQ2LDc0IEBACiAKIHN0YXRpYyB2b2lkIHNwaXR6X2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKKwlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKKwogCWlmIChzcGl0el9zcGtfZnVuYyA9PSBTUElUWl9TUEtfT04pCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFeHQgU3BrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJFeHQgU3BrIik7CiAKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJc3dpdGNoIChzcGl0el9qYWNrX2Z1bmMpIHsKIAljYXNlIFNQSVRaX0hQOgogCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBocCBqYWNrLCBkaXNhYmxlIG1pYyBiaWFzICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAxKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDEpOwogCQlicmVhazsKIAljYXNlIFNQSVRaX01JQzoKIAkJLyogZW5hYmxlIG1pYyBqYWNrIGFuZCBiaWFzLCBtdXRlIGhwICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDApOwogCQlicmVhazsKIAljYXNlIFNQSVRaX0xJTkU6CiAJCS8qIGVuYWJsZSBsaW5lIGphY2ssIGRpc2FibGUgbWljIGJpYXMgYW5kIG11dGUgaHAgKi8KLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfUiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgU1BJVFpfSEVBRFNFVDoKIAkJLyogZW5hYmxlIGFuZCB1bm11dGUgaGVhZHNldCBqYWNrIGVuYWJsZSBtaWMgYmlhcywgbXV0ZSBMIGhwICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMCk7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBTUElUWl9IUF9PRkY6CiAKIAkJLyogamFjayByZW1vdmVkLCBldmVyeXRoaW5nIG9mZiAqLwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTGluZSBKYWNrIik7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDApOwogCQlicmVhazsKIAl9Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgc3BpdHpfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQotCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CiAKIAkvKiBjaGVjayB0aGUgamFjayBzdGF0dXMgYXQgc3RyZWFtIHN0YXJ0dXAgKi8KLQlzcGl0el9leHRfY29udHJvbCgmY29kZWMtPmRhcG0pOwotCi0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXNwaXR6X2V4dF9jb250cm9sKCZydGQtPmNhcmQtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3Rvc2EuYyBiL3NvdW5kL3NvYy9weGEvdG9zYS5jCmluZGV4IDFkOWMyZWQuLjRhOTU2ZDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvdG9zYS5jCisrKyBiL3NvdW5kL3NvYy9weGEvdG9zYS5jCkBAIC00NCw0OCArNDQsNDYgQEAKIHN0YXRpYyBpbnQgdG9zYV9qYWNrX2Z1bmM7CiBzdGF0aWMgaW50IHRvc2Ffc3BrX2Z1bmM7CiAKLXN0YXRpYyB2b2lkIHRvc2FfZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgdG9zYV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJc3dpdGNoICh0b3NhX2phY2tfZnVuYykgewogCWNhc2UgVE9TQV9IUDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgKEludGVybmFsKSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgKEludGVybmFsKSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBUT1NBX01JQ19JTlQ6Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgKEludGVybmFsKSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJNaWMgKEludGVybmFsKSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgVE9TQV9IRUFEU0VUOgotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyAoSW50ZXJuYWwpIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIk1pYyAoSW50ZXJuYWwpIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAl9CiAKIAlpZiAodG9zYV9zcGtfZnVuYyA9PSBUT1NBX1NQS19PTikKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlNwZWFrZXIiKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOworCisJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIH0KIAogc3RhdGljIGludCB0b3NhX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOwogCiAJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCi0JdG9zYV9leHRfY29udHJvbChjb2RlYyk7Ci0KLQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJdG9zYV9leHRfY29udHJvbCgmcnRkLT5jYXJkLT5kYXBtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA0LDEzICsxMDIsMTMgQEAKIHN0YXRpYyBpbnQgdG9zYV9zZXRfamFjayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlpZiAodG9zYV9qYWNrX2Z1bmMgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXJldHVybiAwOwogCiAJdG9zYV9qYWNrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl0b3NhX2V4dF9jb250cm9sKGNvZGVjKTsKKwl0b3NhX2V4dF9jb250cm9sKCZjYXJkLT5kYXBtKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTI0LDEzICsxMjIsMTMgQEAKIHN0YXRpYyBpbnQgdG9zYV9zZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9ICBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAogCWlmICh0b3NhX3Nwa19mdW5jID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAogCXRvc2Ffc3BrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl0b3NhX2V4dF9jb250cm9sKGNvZGVjKTsKKwl0b3NhX2V4dF9jb250cm9sKCZjYXJkLT5kYXBtKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTkxLDI0ICsxODksMTAgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgZXJyOwogCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiT1VUMyIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1PTk9PVVQiKTsKIAotCS8qIGFkZCB0b3NhIHNwZWNpZmljIGNvbnRyb2xzICovCi0JZXJyID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHRvc2FfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0b3NhX2NvbnRyb2xzKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBhZGQgdG9zYSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0b3NhX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodG9zYV9kYXBtX3dpZGdldHMpKTsKLQotCS8qIHNldCB1cCB0b3NhIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzOSw2ICsyMjMsMTMgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSB0b3NhX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh0b3NhX2RhaSksCisKKwkuY29udHJvbHMgPSB0b3NhX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHRvc2FfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSB0b3NhX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodG9zYV9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIGludCB0b3NhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMgYi9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMKaW5kZXggZGI4YWFkZi4uMjNiZjk5MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS96eWxvbml0ZS5jCisrKyBiL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYwpAQCAtNzEsMjIgKzcxLDEwIEBACiAKIHN0YXRpYyBpbnQgenlsb25pdGVfd205NzEzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQogCWlmIChjbGtfcG91dCkKIAkJc25kX3NvY19kYWlfc2V0X3BsbChydGQtPmNvZGVjX2RhaSwgMCwgMCwKIAkJCQkgICAgY2xrX2dldF9yYXRlKHBvdXQpLCAwKTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgenlsb25pdGVfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh6eWxvbml0ZV9kYXBtX3dpZGdldHMpKTsKLQotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCS8qIFN0YXRpYyBzZXR1cCBmb3Igbm93ICovCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEVhcnBpZWNlIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU2LDYgKzI0NCwxMSBAQAogCS5yZXN1bWVfcHJlID0gJnp5bG9uaXRlX3Jlc3VtZV9wcmUsCiAJLmRhaV9saW5rID0genlsb25pdGVfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHp5bG9uaXRlX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0genlsb25pdGVfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh6eWxvbml0ZV9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnp5bG9uaXRlX3NuZF9hYzk3X2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zNjAwMC9zNjEwNS1pcGNhbS5jIGIvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKaW5kZXggOTQ1ZThhYi4uMGIyMWQxZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKKysrIGIvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKQEAgLTEwNCw4ICsxMDQsOCBAQAogc3RhdGljIGludCBvdXRwdXRfdHlwZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY2FyZC0+ZGFwbTsKIAl1bnNpZ25lZCBpbnQgdmFsID0gKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gIT0gMCk7CiAJY2hhciAqZGlmZmVyZW50aWFsID0gIkF1ZGlvIE91dCBEaWZmZXJlbnRpYWwiOwogCWNoYXIgKnN0ZXJlbyA9ICJBdWRpbyBPdXQgU3RlcmVvIjsKQEAgLTEzNywxMyArMTM3LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCS8qIEFkZCBzNjEwNSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhaWMzeF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKGFpYzN4X2RhcG1fd2lkZ2V0cykpOwotCi0JLyogU2V0IHVwIHM2MTA1IHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CiAKIAkvKiBub3QgcHJlc2VudCAqLwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1PTk9fTE9VVCIpOwpAQCAtMTU3LDE3ICsxNTEsMTAgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSTE9VVCIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkhQUkNPTSIpOwogCi0JLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBdWRpbyBJbiIpOwotCiAJLyogbXVzdCBjb3JyZXNwb25kIHRvIGF1ZGlvX291dF9tdXgucHJpdmF0ZV92YWx1ZSBpbml0aWFsaXplciAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQXVkaW8gT3V0IERpZmZlcmVudGlhbCIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBdWRpbyBPdXQgU3RlcmVvIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiQXVkaW8gT3V0IERpZmZlcmVudGlhbCIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZC0+c25kX2NhcmQsIHNuZF9jdGxfbmV3MSgmYXVkaW9fb3V0X211eCwgY29kZWMpKTsKKwlzbmRfY3RsX2FkZChjYXJkLT5zbmRfY2FyZCwgc25kX2N0bF9uZXcxKCZhdWRpb19vdXRfbXV4LCBjYXJkKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MCw2ICsxNzcsMTEgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZGFpX2xpbmsgPSAmczYxMDVfZGFpLAogCS5udW1fbGlua3MgPSAxLAorCisJLmRhcG1fd2lkZ2V0cyA9IGFpYzN4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWljM3hfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczYwMDBfc25kX3BsYXRmb3JtX2RhdGEgczYxMDVfc25kX2RhdGEgX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCmluZGV4IDM1MDc1NzQuLmYyZTI4OTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKKysrIGIvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZwpAQCAtMTE3LDcgKzExNyw3IEBACiAJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgVExWMzIwQUlDMjMgb24gU2ltdGVjIGJvYXJkcyIKIAlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX1MzQzI0WFgKIAlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCi0Jc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyM19JMkMKIAlzZWxlY3QgU05EX1NPQ19TQU1TVU5HX1NJTVRFQwogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1NJTVRFQ19IRVJNRVMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYwppbmRleCBmYmNlZDU4Li44OGIwOWUwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCkBAIC02NiwxMCArNjYsNiBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKLQlydW50aW1lLT5ody5yYXRlX21pbiA9IGh3X3JhdGVzLmxpc3RbMF07Ci0JcnVudGltZS0+aHcucmF0ZV9tYXggPSBod19yYXRlcy5saXN0W2h3X3JhdGVzLmNvdW50IC0gMV07Ci0JcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9UOwotCiAJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCiAJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCQkmaHdfcmF0ZXMpOwpAQCAtOTQsNyArOTAsNyBAQAogCQkJZGl2Kys7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnJ0ZC0+ZGV2LCAiJXM6IHJhdGUgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJZGV2X2VycihydGQtPmRldiwgIiVzOiByYXRlICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQlfX2Z1bmNfXywgcmF0ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE4MSw3ICsxNzcsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKaW5kZXggOThhMDRjMS4uYjA4MDAzMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX3dtODc1My5jCkBAIC0xOTIsNDQgKzE5Miw2IEBACiAJLmh3X2ZyZWUgPSBuZW8xOTczX3ZvaWNlX2h3X2ZyZWUsCiB9OwogCi0vKiBTaGFyZWQgcm91dGVzIGFuZCBjb250cm9scyAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX0xJTkUoIkdTTSBMaW5lIE91dCIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9MSU5FKCJHU00gTGluZSBJbiIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiSGFuZHNldCBNaWMiLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIG5lbzE5NzNfd204NzUzX3JvdXRlc1tdID0gewotCS8qIENvbm5lY3Rpb25zIHRvIHRoZSBHU00gTW9kdWxlICovCi0JeyJHU00gTGluZSBPdXQiLCBOVUxMLCAiTU9OTzEifSwKLQl7IkdTTSBMaW5lIE91dCIsIE5VTEwsICJNT05PMiJ9LAotCXsiUlhQIiwgTlVMTCwgIkdTTSBMaW5lIEluIn0sCi0JeyJSWE4iLCBOVUxMLCAiR1NNIExpbmUgSW4ifSwKLQotCS8qIENvbm5lY3Rpb25zIHRvIEhlYWRzZXQgKi8KLQl7Ik1JQzEiLCBOVUxMLCAiTWljIEJpYXMifSwKLQl7Ik1pYyBCaWFzIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCi0KLQkvKiBDYWxsIE1pYyAqLwotCXsiTUlDMiIsIE5VTEwsICJNaWMgQmlhcyJ9LAotCXsiTUlDMk4iLCBOVUxMLCAiTWljIEJpYXMifSwKLQl7Ik1pYyBCaWFzIiwgTlVMTCwgIkhhbmRzZXQgTWljIn0sCi0KLQkvKiBDb25uZWN0IHRoZSBBTEMgcGlucyAqLwotCXsiQUNJTiIsIE5VTEwsICJBQ09QIn0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmVvMTk3M193bTg3NTNfY29udHJvbHNbXSA9IHsKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJHU00gTGluZSBPdXQiKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJHU00gTGluZSBJbiIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCi0JU09DX0RBUE1fUElOX1NXSVRDSCgiSGFuZHNldCBNaWMiKSwKLX07Ci0KLS8qIEdUQTAyIHNwZWNpZmljIHJvdXRlcyBhbmQgY29udHJvbHMgKi8KLQogc3RhdGljIGludCBndGEwMl9zcGVha2VyX2VuYWJsZWQ7CiAKIHN0YXRpYyBpbnQgbG00ODUzX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC0yNTcsNyArMjE5LDM0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIG5lbzE5NzNfZ3RhMDJfcm91dGVzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0xJTkUoIkdTTSBMaW5lIE91dCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJHU00gTGluZSBJbiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGFuZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJIYW5kc2V0IFNwayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlN0ZXJlbyBPdXQiLCBsbTQ4NTNfZXZlbnQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgbmVvMTk3M193bTg3NTNfcm91dGVzW10gPSB7CisJLyogQ29ubmVjdGlvbnMgdG8gdGhlIEdTTSBNb2R1bGUgKi8KKwl7IkdTTSBMaW5lIE91dCIsIE5VTEwsICJNT05PMSJ9LAorCXsiR1NNIExpbmUgT3V0IiwgTlVMTCwgIk1PTk8yIn0sCisJeyJSWFAiLCBOVUxMLCAiR1NNIExpbmUgSW4ifSwKKwl7IlJYTiIsIE5VTEwsICJHU00gTGluZSBJbiJ9LAorCisJLyogQ29ubmVjdGlvbnMgdG8gSGVhZHNldCAqLworCXsiTUlDMSIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKworCS8qIENhbGwgTWljICovCisJeyJNSUMyIiwgTlVMTCwgIk1pYyBCaWFzIn0sCisJeyJNSUMyTiIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiSGFuZHNldCBNaWMifSwKKworCS8qIENvbm5lY3QgdGhlIEFMQyBwaW5zICovCisJeyJBQ0lOIiwgTlVMTCwgIkFDT1AifSwKKwogCS8qIENvbm5lY3Rpb25zIHRvIHRoZSBhbXAgKi8KIAl7IlN0ZXJlbyBPdXQiLCBOVUxMLCAiTE9VVDEifSwKIAl7IlN0ZXJlbyBPdXQiLCBOVUxMLCAiUk9VVDEifSwKQEAgLTI2Nyw3ICsyNTYsMTEgQEAKIAl7IkhhbmRzZXQgU3BrIiwgTlVMTCwgIlJPVVQyIn0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmVvMTk3M19ndGEwMl93bTg3NTNfY29udHJvbHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuZW8xOTczX3dtODc1M19jb250cm9sc1tdID0geworCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkdTTSBMaW5lIE91dCIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkdTTSBMaW5lIEluIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHNldCBNaWMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIYW5kc2V0IE1pYyIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhhbmRzZXQgU3BrIiksCiAJU09DX0RBUE1fUElOX1NXSVRDSCgiU3RlcmVvIE91dCIpLAogCkBAIC0yNzYsODYgKzI2OSwzMiBAQAogCQlsbTQ4NTNfc2V0X3NwayksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbmVvMTk3M19ndGEwMl93bTg3NTNfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX1NQSygiSGFuZHNldCBTcGsiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJTdGVyZW8gT3V0IiwgbG00ODUzX2V2ZW50KSwKLX07Ci0KLXN0YXRpYyBpbnQgbmVvMTk3M19ndGEwMl93bTg3NTNfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG5lbzE5NzNfZ3RhMDJfd204NzUzX2RhcG1fd2lkZ2V0cywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M19ndGEwMl93bTg3NTNfZGFwbV93aWRnZXRzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIG5lbzE5NzNfZ3RhMDJfcm91dGVzLAotCQkJQVJSQVlfU0laRShuZW8xOTczX2d0YTAyX3JvdXRlcykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNvZGVjLT5jYXJkLCBuZW8xOTczX2d0YTAyX3dtODc1M19jb250cm9scywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M19ndGEwMl93bTg3NTNfY29udHJvbHMpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJTdGVyZW8gT3V0Iik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIYW5kc2V0IFNwayIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU3RlcmVvIE91dCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBTcGsiKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG5lbzE5NzNfd204NzUzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CiAKIAkvKiBzZXQgdXAgTkMgY29kZWMgcGlucyAqLwotCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVQ0Iik7Ci0Jc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTEiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FMiIpOwotCi0JLyogQWRkIG5lbzE5NzMgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgbmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzLAotCQkJQVJSQVlfU0laRShuZW8xOTczX3dtODc1M19kYXBtX3dpZGdldHMpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogYWRkIG5lbzE5NzMgc3BlY2lmaWMgY29udHJvbHMgKi8KLQlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKHJ0ZC0+Y2FyZCwgbmVvMTk3M193bTg3NTNfY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKG5lbzE5NzNfd204NzUzX2NvbnRyb2xzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHNldCB1cCBuZW8xOTczIHNwZWNpZmljIGF1ZGlvIHJvdXRlcyAqLwotCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIG5lbzE5NzNfd204NzUzX3JvdXRlcywKLQkJCUFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfcm91dGVzKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIk9VVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIk9VVDQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIkxJTkUxIik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJMSU5FMiIpOwogCiAJLyogc2V0IGVuZHBvaW50cyB0byBkZWZhdWx0IG9mZiBtb2RlICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJHU00gTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGFuZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNhcmQtPmRhcG0sICJHU00gTGluZSBPdXQiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNhcmQtPmRhcG0sICJHU00gTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY2FyZC0+ZGFwbSwgIkhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiSGFuZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNhcmQtPmRhcG0sICJTdGVyZW8gT3V0Iik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjYXJkLT5kYXBtLCAiSGFuZHNldCBTcGsiKTsKIAogCS8qIGFsbG93IGF1ZGlvIHBhdGhzIGZyb20gdGhlIEdTTSBtb2RlbSB0byBydW4gZHVyaW5nIHN1c3BlbmQgKi8KLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkdTTSBMaW5lIE91dCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiR1NNIExpbmUgSW4iKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIYW5kc2V0IE1pYyIpOwotCi0JaWYgKG1hY2hpbmVfaXNfbmVvMTk3M19ndGEwMigpKSB7Ci0JCXJldCA9IG5lbzE5NzNfZ3RhMDJfd204NzUzX2luaXQoY29kZWMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiR1NNIExpbmUgSW4iKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJIZWFkc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkhhbmRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiU3RlcmVvIE91dCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkhhbmRzZXQgU3BrIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQwOSw2ICszNDgsMTMgQEAKIAkubnVtX2F1eF9kZXZzID0gQVJSQVlfU0laRShuZW8xOTczX2F1eF9kZXZzKSwKIAkuY29kZWNfY29uZiA9IG5lbzE5NzNfY29kZWNfY29uZiwKIAkubnVtX2NvbmZpZ3MgPSBBUlJBWV9TSVpFKG5lbzE5NzNfY29kZWNfY29uZiksCisKKwkuY29udHJvbHMgPSBuZW8xOTczX3dtODc1M19jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShuZW8xOTczX3dtODc1M19jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IG5lbzE5NzNfd204NzUzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBuZW8xOTczX3dtODc1M19yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobmVvMTk3M193bTg3NTNfcm91dGVzKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuZW8xOTczX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYwppbmRleCAwNmViZGMwLi4yOTgyZDllIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3J4MTk1MF91ZGExMzgwLmMKQEAgLTEzMSwxMCArMTMxLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JcnVudGltZS0+aHcucmF0ZV9taW4gPSBod19yYXRlcy5saXN0WzBdOwotCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gaHdfcmF0ZXMubGlzdFtod19yYXRlcy5jb3VudCAtIDFdOwotCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVDsKLQogCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAogCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkJJmh3X3JhdGVzKTsKQEAgLTIyNiw3ICsyMjIsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKaW5kZXggZDM4YWU5OC4uNjgyZWI0ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc21ka19hdWRpb19kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInNtZGstYXVkaW8td204ODk0IiwKKwkJLm5hbWUJPSAic21kay1hdWRpby13bTg5OTQiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHNhbXN1bmdfd204OTk0X29mX21hdGNoKSwKIAkJLnBtCT0gJnNuZF9zb2NfcG1fb3BzLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy90b2Jlcm1vcnkuYwppbmRleCBmMjFmZjYwLi4xODA3Yjc1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy90b2Jlcm1vcnkuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy90b2Jlcm1vcnkuYwpAQCAtNDQsNiArNDQsOCBAQAogCQkJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IFNZU0NMSzogJWRcbiIsIHJldCk7CisJCQkJc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIFdNODk2Ml9GTEwsCisJCQkJCQkgICAgMCwgMCwgMCk7CiAJCQkJcmV0dXJuIHJldDsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS5jIGIvc291bmQvc29jL3NoL2ZzaS5jCmluZGV4IDE5NjdmNDQuLjcxMGEwNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLmMKQEAgLTE3MTEsOSArMTcxMSw5IEBACiAJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgotCQlmc2ktPmNsa19tYXN0ZXIgPSAxOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWZzaS0+Y2xrX21hc3RlciA9IDE7IC8qIGNvZGVjIGlzIHNsYXZlLCBjcHUgaXMgbWFzdGVyICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL21pZ29yLmMgYi9zb3VuZC9zb2Mvc2gvbWlnb3IuYwppbmRleCA1MDE0YTg4Li5jNThjMjUyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvbWlnb3IuYworKysgYi9zb3VuZC9zb2Mvc2gvbWlnb3IuYwpAQCAtMTM2LDE5ICsxMzYsNiBAQAogCXsgIk1pYyBCaWFzIiwgTlVMTCwgIkV4dGVybmFsIE1pY3JvcGhvbmUiIH0sCiB9OwogCi1zdGF0aWMgaW50IG1pZ29yX2RhaV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1pZ29yX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUobWlnb3JfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogbWlnb3IgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbWlnb3JfZGFpID0gewogCS5uYW1lID0gIndtODk3OCIsCkBAIC0xNTgsNyArMTQ1LDYgQEAKIAkucGxhdGZvcm1fbmFtZSA9ICJzaXUtcGNtLWF1ZGlvIiwKIAkuY29kZWNfbmFtZSA9ICJ3bTg5NzguMC0wMDFhIiwKIAkub3BzID0gJm1pZ29yX2RhaV9vcHMsCi0JLmluaXQgPSBtaWdvcl9kYWlfaW5pdCwKIH07CiAKIC8qIG1pZ29yIGF1ZGlvIG1hY2hpbmUgZHJpdmVyICovCkBAIC0xNjcsNiArMTUzLDExIEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmRhaV9saW5rID0gJm1pZ29yX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5kYXBtX3dpZGdldHMgPSBtaWdvcl9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1pZ29yX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWlnb3Jfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlIGIvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKaW5kZXggMGZmNDkyZC4uN2QwMDUxYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKQEAgLTEsMiArMSwyIEBACi1zbmQtc29jLXJjYXItb2Jqcwk6PSBjb3JlLm8gZ2VuLm8gc2N1Lm8gYWRnLm8gc3NpLm8KK3NuZC1zb2MtcmNhci1vYmpzCTo9IGNvcmUubyBnZW4ubyBzcmMubyBhZGcubyBzc2kubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUkNBUikJKz0gc25kLXNvYy1yY2FyLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL2FkZy5jCmluZGV4IGE1MzIzNWMuLjY5YzQ0MjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL2FkZy5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL2FkZy5jCkBAIC0yNSwxNSArMjUsMTY1IEBACiB9OwogCiAjZGVmaW5lIGZvcl9lYWNoX3JzbmRfY2xrKHBvcywgYWRnLCBpKQkJXAotCWZvciAoaSA9IDAsIChwb3MpID0gYWRnLT5jbGtbaV07CVwKLQkgICAgIGkgPCBDTEtNQVg7CQkJXAotCSAgICAgaSsrLCAocG9zKSA9IGFkZy0+Y2xrW2ldKQorCWZvciAoaSA9IDA7CQkJCVwKKwkgICAgIChpIDwgQ0xLTUFYKSAmJgkJCVwKKwkgICAgICgocG9zKSA9IGFkZy0+Y2xrW2ldKTsJCVwKKwkgICAgIGkrKykKICNkZWZpbmUgcnNuZF9wcml2X3RvX2FkZyhwcml2KSAoKHN0cnVjdCByc25kX2FkZyAqKShwcml2KS0+YWRnKQogCi1zdGF0aWMgaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkJCSBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCQkJIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKLQkJCQkJIHVuc2lnbmVkIGludCBkc3RfcmF0ZSkKKworc3RhdGljIHUzMiByc25kX2FkZ19zc2lfd3NfdGltaW5nX2dlbjIoc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSByc25kX2lvX3RvX21vZF9zc2koaW8pOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKKwlpbnQgd3MgPSBpZDsKKworCWlmIChyc25kX3NzaV9pc19waW5fc2hhcmluZyhyc25kX3NzaV9tb2RfZ2V0KHByaXYsIGlkKSkpIHsKKwkJc3dpdGNoIChpZCkgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCXdzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl3cyA9IDM7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJd3MgPSA3OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gKDB4NiArIHdzKSA8PCA4OworfQorCitzdGF0aWMgaW50IHJzbmRfYWRnX3NldF9zcmNfdGltc2VsX2dlbjIoc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCQlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJCXUzMiB0aW1zZWwpCit7CisJaW50IGlzX3BsYXkgPSByc25kX2RhaV9pc19wbGF5KHJkYWksIGlvKTsKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCWludCBzaGlmdCA9IChpZCAlIDIpID8gMTYgOiAwOworCXUzMiBtYXNrLCB3czsKKwl1MzIgaW4sIG91dDsKKworCXdzID0gcnNuZF9hZGdfc3NpX3dzX3RpbWluZ19nZW4yKGlvKTsKKworCWluICA9IChpc19wbGF5KSA/IHRpbXNlbCA6IHdzOworCW91dCA9IChpc19wbGF5KSA/IHdzICAgICA6IHRpbXNlbDsKKworCWluICAgPSBpbgk8PCBzaGlmdDsKKwlvdXQgID0gb3V0CTw8IHNoaWZ0OworCW1hc2sgPSAweGZmZmYJPDwgc2hpZnQ7CisKKwlzd2l0Y2ggKGlkIC8gMikgeworCWNhc2UgMDoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ0lOX1RJTVNFTDAsICBtYXNrLCBpbik7CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNPVVRfVElNU0VMMCwgbWFzaywgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDSU5fVElNU0VMMSwgIG1hc2ssIGluKTsKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ09VVF9USU1TRUwxLCBtYXNrLCBvdXQpOworCQlicmVhazsKKwljYXNlIDI6CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNJTl9USU1TRUwyLCAgbWFzaywgaW4pOworCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDT1VUX1RJTVNFTDIsIG1hc2ssIG91dCk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ0lOX1RJTVNFTDMsICBtYXNrLCBpbik7CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNPVVRfVElNU0VMMywgbWFzaywgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDSU5fVElNU0VMNCwgIG1hc2ssIGluKTsKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ09VVF9USU1TRUw0LCBtYXNrLCBvdXQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJICB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCisJCQkJICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKwlzdHJ1Y3QgcnNuZF9hZGcgKmFkZyA9IHJzbmRfcHJpdl90b19hZGcocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlpbnQgaWR4LCBzZWwsIGRpdiwgc3RlcCwgcmV0OworCXUzMiB2YWwsIGVuOworCXVuc2lnbmVkIGludCBtaW4sIGRpZmY7CisJdW5zaWduZWQgaW50IHNlbF9yYXRlIFtdID0geworCQljbGtfZ2V0X3JhdGUoYWRnLT5jbGtbQ0xLQV0pLAkvKiAwMDAwOiBDTEtBICovCisJCWNsa19nZXRfcmF0ZShhZGctPmNsa1tDTEtCXSksCS8qIDAwMDE6IENMS0IgKi8KKwkJY2xrX2dldF9yYXRlKGFkZy0+Y2xrW0NMS0NdKSwJLyogMDAxMDogQ0xLQyAqLworCQlhZGctPnJiZ2FfcmF0ZV9mb3JfNDQxa2h6X2Rpdl82LC8qIDAwMTE6IFJCR0EgKi8KKwkJYWRnLT5yYmdiX3JhdGVfZm9yXzQ4a2h6X2Rpdl82LAkvKiAwMTAwOiBSQkdCICovCisJfTsKKworCW1pbiA9IH4wOworCXZhbCA9IDA7CisJZW4gPSAwOworCWZvciAoc2VsID0gMDsgc2VsIDwgQVJSQVlfU0laRShzZWxfcmF0ZSk7IHNlbCsrKSB7CisJCWlkeCA9IDA7CisJCXN0ZXAgPSAyOworCisJCWlmICghc2VsX3JhdGVbc2VsXSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoZGl2ID0gMjsgZGl2IDw9IDk4MzA0OyBkaXYgKz0gc3RlcCkgeworCQkJZGlmZiA9IGFicyhzcmNfcmF0ZSAtIHNlbF9yYXRlW3NlbF0gLyBkaXYpOworCQkJaWYgKG1pbiA+IGRpZmYpIHsKKwkJCQl2YWwgPSAoc2VsIDw8IDgpIHwgaWR4OworCQkJCW1pbiA9IGRpZmY7CisJCQkJZW4gPSAxIDw8IChzZWwgKyAxKTsgLyogZml4bWUgKi8KKwkJCX0KKworCQkJLyoKKwkJCSAqIHN0ZXAgb2YgMF8wMDAwIC8gMF8wMDAxIC8gMF8xMTAxCisJCQkgKiBhcmUgb3V0IG9mIG9yZGVyCisJCQkgKi8KKwkJCWlmICgoaWR4ID4gMikgJiYgKGlkeCAlIDIpKQorCQkJCXN0ZXAgKj0gMjsKKwkJCWlmIChpZHggPT0gMHgxYykgeworCQkJCWRpdiArPSBzdGVwOworCQkJCXN0ZXAgKj0gMjsKKwkJCX0KKwkJCWlkeCsrOworCQl9CisJfQorCisJaWYgKG1pbiA9PSB+MCkgeworCQlkZXZfZXJyKGRldiwgIm5vIElucHV0IGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gcnNuZF9hZGdfc2V0X3NyY190aW1zZWxfZ2VuMihyZGFpLCBtb2QsIGlvLCB2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidGltc2VsIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyc25kX21vZF9ic2V0KG1vZCwgRElWX0VOLCBlbiwgZW4pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByc25kX2FkZ19zZXRfY29udmVydF90aW1pbmdfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXUzMiB2YWwgPSByc25kX2FkZ19zc2lfd3NfdGltaW5nX2dlbjIoaW8pOworCisJcmV0dXJuIHJzbmRfYWRnX3NldF9zcmNfdGltc2VsX2dlbjIocmRhaSwgbW9kLCBpbywgdmFsKTsKK30KKworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSkKIHsKIAlzdHJ1Y3QgcnNuZF9hZGcgKmFkZyA9IHJzbmRfcHJpdl90b19hZGcocHJpdik7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKQEAgLTkxLDE4ICsyNDEsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc3JjX3JhdGUsCi0JCQkgICAgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSkKLXsKLQlpZiAocnNuZF9pc19nZW4xKHByaXYpKQotCQlyZXR1cm4gcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrX2dlbjEocHJpdiwgbW9kLAotCQkJCQkJICAgICBzcmNfcmF0ZSwgZHN0X3JhdGUpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KIHN0YXRpYyB2b2lkIHJzbmRfYWRnX3NldF9zc2lfY2xrKHN0cnVjdCByc25kX21vZCAqbW9kLCB1MzIgdmFsKQogewogCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7CkBAIC0yNTQsMTMgKzM5MiwxNCBAQAogfQogCiBpbnQgcnNuZF9hZGdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHJzbmRfYWRnICphZGc7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsayAqY2xrLCAqY2xrX29yaWc7CiAJaW50IGk7CisJYm9vbCB1c2Vfb2xkX3N0eWxlID0gZmFsc2U7CiAKIAlhZGcgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFkZyksIEdGUF9LRVJORUwpOwogCWlmICghYWRnKSB7CkBAIC0yNjgsMTAgKzQwNywzOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlhZGctPmNsa1tDTEtBXSA9IGNsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19hIik7Ci0JYWRnLT5jbGtbQ0xLQl0gPSBjbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfYiIpOwotCWFkZy0+Y2xrW0NMS0NdID0gY2xrX2dldChOVUxMLCAiYXVkaW9fY2xrX2MiKTsKLQlhZGctPmNsa1tDTEtJXSA9IGNsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19pbnRlcm5hbCIpOworCWNsa19vcmlnCT0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJYWRnLT5jbGtbQ0xLQV0JPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX2EiKTsKKwlhZGctPmNsa1tDTEtCXQk9IGRldm1fY2xrX2dldChkZXYsICJjbGtfYiIpOworCWFkZy0+Y2xrW0NMS0NdCT0gZGV2bV9jbGtfZ2V0KGRldiwgImNsa19jIik7CisJYWRnLT5jbGtbQ0xLSV0JPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX2kiKTsKKworCS8qCisJICogSXQgcmVxdWVzdCBkZXZpY2UgZGVwZW5kZW50IGF1ZGlvIGNsb2NrLgorCSAqIEJ1dCBhYm92ZSBhbGwgY2xrcyB3aWxsIGluZGljYXRlIHJzbmQgbW9kdWxlIGNsb2NrCisJICogaWYgcGxhdGZvcm0gZG9lc24ndCBpdAorCSAqLworCWZvcl9lYWNoX3JzbmRfY2xrKGNsaywgYWRnLCBpKSB7CisJCWlmIChjbGtfb3JpZyA9PSBjbGspIHsKKwkJCWRldl93YXJuKGRldiwKKwkJCQkgImRvZXNuJ3QgaGF2ZSBkZXZpY2UgZGVwZW5kZW50IGNsb2NrLCB1c2UgaW5kZXBlbmRlbnQgY2xvY2tcbiIpOworCQkJdXNlX29sZF9zdHlsZSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogbm90ZToKKwkgKiB0aGVzZSBleGlzdCBpbiBvcmRlciB0byBrZWVwIGNvbXBhdGlibGUgd2l0aAorCSAqIHBsYXRmb3JtIHdoaWNoIGhhcyBkZXZpY2UgaW5kZXBlbmRlbnQgYXVkaW8gY2xvY2ssCisJICogYnV0IHdpbGwgYmUgcmVtb3ZlZCBzb29uCisJICovCisJaWYgKHVzZV9vbGRfc3R5bGUpIHsKKwkJYWRnLT5jbGtbQ0xLQV0gPSBkZXZtX2Nsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19hIik7CisJCWFkZy0+Y2xrW0NMS0JdID0gZGV2bV9jbGtfZ2V0KE5VTEwsICJhdWRpb19jbGtfYiIpOworCQlhZGctPmNsa1tDTEtDXSA9IGRldm1fY2xrX2dldChOVUxMLCAiYXVkaW9fY2xrX2MiKTsKKwkJYWRnLT5jbGtbQ0xLSV0gPSBkZXZtX2Nsa19nZXQoTlVMTCwgImF1ZGlvX2Nsa19pbnRlcm5hbCIpOworCX0KKwogCWZvcl9lYWNoX3JzbmRfY2xrKGNsaywgYWRnLCBpKSB7CiAJCWlmIChJU19FUlIoY2xrKSkgewogCQkJZGV2X2VycihkZXYsICJBdWRpbyBjbG9jayBmYWlsZWRcbiIpOwpAQCAtMjg3LDE0ICs0NTUsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQgcnNuZF9hZGdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgcnNuZF9hZGcgKmFkZyA9IHByaXYtPmFkZzsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JaW50IGk7Ci0KLQlmb3JfZWFjaF9yc25kX2NsayhjbGssIGFkZywgaSkKLQkJY2xrX3B1dChjbGspOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvY29yZS5jIGIvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCmluZGV4IDc0M2RlNWUuLjIxNWI2NjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMKQEAgLTczLDEzICs3MywxMyBAQAogICogICB8ICArLSBzc2lbMl0KICAqICAgfCAgLi4uCiAgKiAgIHwKLSAqICAgfCAqKiB0aGVzZSBjb250cm9sIHNjdQorICogICB8ICoqIHRoZXNlIGNvbnRyb2wgc3JjCiAgKiAgIHwKLSAqICAgKy0gc2N1CisgKiAgICstIHNyYwogICogICAgICB8Ci0gKiAgICAgICstIHNjdVswXQotICogICAgICArLSBzY3VbMV0KLSAqICAgICAgKy0gc2N1WzJdCisgKiAgICAgICstIHNyY1swXQorICogICAgICArLSBzcmNbMV0KKyAqICAgICAgKy0gc3JjWzJdCiAgKiAgICAgIC4uLgogICoKICAqCkBAIC0xMDAsNiArMTAwLDIxIEBACiAjZGVmaW5lIFJTTkRfUkFURVMgU05EUlZfUENNX1JBVEVfODAwMF85NjAwMAogI2RlZmluZSBSU05EX0ZNVFMgKFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUpCiAKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9vZl9kYXRhIHJzbmRfb2ZfZGF0YV9nZW4xID0geworCS5mbGFncyA9IFJTTkRfR0VOMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9vZl9kYXRhIHJzbmRfb2ZfZGF0YV9nZW4yID0geworCS5mbGFncyA9IFJTTkRfR0VOMiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJzbmRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscmNhcl9zb3VuZC1nZW4xIiwgLmRhdGEgPSAmcnNuZF9vZl9kYXRhX2dlbjEgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscmNhcl9zb3VuZC1nZW4yIiwgLmRhdGEgPSAmcnNuZF9vZl9kYXRhX2dlbjIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByc25kX29mX21hdGNoKTsKKwogLyoKICAqCXJzbmRfcGxhdGZvcm0gZnVuY3Rpb25zCiAgKi8KQEAgLTEwNyw2ICsxMjIsMTEgQEAKIAkoIShwcml2LT5pbmZvLT5mdW5jKSA/IDAgOgkJXAogCSBwcml2LT5pbmZvLT5mdW5jKHBhcmFtKSkKIAorI2RlZmluZSByc25kX2lzX2VuYWJsZV9wYXRoKGlvLCBuYW1lKSBcCisJKChpbyktPmluZm8gPyAoaW8pLT5pbmZvLT5uYW1lIDogTlVMTCkKKyNkZWZpbmUgcnNuZF9pbmZvX2lkKHByaXYsIGlvLCBuYW1lKSBcCisJKChpbyktPmluZm8tPm5hbWUgLSBwcml2LT5pbmZvLT5uYW1lIyNfaW5mbykKKwogLyoKICAqCXJzbmRfbW9kIGZ1bmN0aW9ucwogICovCkBAIC0xMjEsMTcgKzE0MSwxOSBAQAogdm9pZCByc25kX21vZF9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCiAJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkgICBzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHMsCisJCSAgIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlLAogCQkgICBpbnQgaWQpCiB7CiAJbW9kLT5wcml2CT0gcHJpdjsKIAltb2QtPmlkCQk9IGlkOwogCW1vZC0+b3BzCT0gb3BzOwotCUlOSVRfTElTVF9IRUFEKCZtb2QtPmxpc3QpOworCW1vZC0+dHlwZQk9IHR5cGU7CiB9CiAKIC8qCiAgKglyc25kX2RtYSBmdW5jdGlvbnMKICAqLworc3RhdGljIHZvaWQgX19yc25kX2RtYV9zdGFydChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CiBzdGF0aWMgdm9pZCByc25kX2RtYV9jb250aW51ZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKIHsKIAkvKiBwdXNoIG5leHQgQSBvciBCIHBsYW5lICovCkBAIC0xNDIsOCArMTY0LDkgQEAKIHZvaWQgcnNuZF9kbWFfc3RhcnQoc3RydWN0IHJzbmRfZG1hICpkbWEpCiB7CiAJLyogcHVzaCBib3RoIEEgYW5kIEIgcGxhbmUqLworCWRtYS0+b2Zmc2V0ID0gMDsKIAlkbWEtPnN1Ym1pdF9sb29wID0gMjsKLQlzY2hlZHVsZV93b3JrKCZkbWEtPndvcmspOworCV9fcnNuZF9kbWFfc3RhcnQoZG1hKTsKIH0KIAogdm9pZCByc25kX2RtYV9zdG9wKHN0cnVjdCByc25kX2RtYSAqZG1hKQpAQCAtMTU2LDEyICsxNzksMjYgQEAKIHN0YXRpYyB2b2lkIHJzbmRfZG1hX2NvbXBsZXRlKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHJzbmRfZG1hICpkbWEgPSAoc3RydWN0IHJzbmRfZG1hICopZGF0YTsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gZG1hLT5wcml2OworCXN0cnVjdCByc25kX21vZCAqbW9kID0gcnNuZF9kbWFfdG9fbW9kKGRtYSk7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYocnNuZF9kbWFfdG9fbW9kKGRtYSkpOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcnNuZF9sb2NrKHByaXYsIGZsYWdzKTsKIAotCWRtYS0+Y29tcGxldGUoZG1hKTsKKwkvKgorCSAqIFJlbmVzYXMgc291bmQgR2VuMSBuZWVkcyAxIERNQUMsCisJICogR2VuMiBuZWVkcyAyIERNQUMuCisJICogSW4gR2VuMiBjYXNlLCBpdCBhcmUgQXVkaW8tRE1BQywgYW5kIEF1ZGlvLURNQUMtcGVyaS1wZXJpLgorCSAqIEJ1dCwgQXVkaW8tRE1BQy1wZXJpLXBlcmkgZG9lc24ndCBoYXZlIGludGVycnVwdCwKKwkgKiBhbmQgdGhpcyBkcml2ZXIgaXMgYXNzdW1pbmcgdGhhdCBoZXJlLgorCSAqCisJICogSWYgQXVkaW8tRE1BQy1wZXJpLXBlcmkgaGFzIGludGVycnB0LAorCSAqIHJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKCkgd2lsbCBiZSBjYWxsZWQgdHdpY2UsCisJICogYW50IGl0IHdpbGwgYnJlYWtzIGlvLT5ieXRlX3BvcworCSAqLworCisJcnNuZF9kYWlfcG9pbnRlcl91cGRhdGUoaW8sIGlvLT5ieXRlX3Blcl9wZXJpb2QpOwogCiAJaWYgKGRtYS0+c3VibWl0X2xvb3ApCiAJCXJzbmRfZG1hX2NvbnRpbnVlKGRtYSk7CkBAIC0xNjksMjAgKzIwNiwyMyBAQAogCXJzbmRfdW5sb2NrKHByaXYsIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgcnNuZF9kbWFfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBfX3JzbmRfZG1hX3N0YXJ0KHN0cnVjdCByc25kX2RtYSAqZG1hKQogewotCXN0cnVjdCByc25kX2RtYSAqZG1hID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByc25kX2RtYSwgd29yayk7Ci0Jc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IGRtYS0+cHJpdjsKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwogCWRtYV9hZGRyX3QgYnVmOwotCXNpemVfdCBsZW47CisJc2l6ZV90IGxlbiA9IGlvLT5ieXRlX3Blcl9wZXJpb2Q7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5zdWJtaXRfbG9vcDsgaSsrKSB7CiAKLQkJaWYgKGRtYS0+aW5xdWlyeShkbWEsICZidWYsICZsZW4pIDwgMCkKLQkJCXJldHVybjsKKwkJYnVmID0gcnVudGltZS0+ZG1hX2FkZHIgKworCQkJcnNuZF9kYWlfcG9pbnRlcl9vZmZzZXQoaW8sIGRtYS0+b2Zmc2V0ICsgbGVuKTsKKwkJZG1hLT5vZmZzZXQgPSBsZW47CiAKIAkJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZSgKIAkJCWRtYS0+Y2hhbiwgYnVmLCBsZW4sIGRtYS0+ZGlyLApAQCAtMjA0LDE2ICsyNDQsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHJzbmRfZG1hX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByc25kX2RtYSAqZG1hID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByc25kX2RtYSwgd29yayk7CisKKwlfX3JzbmRfZG1hX3N0YXJ0KGRtYSk7Cit9CisKIGludCByc25kX2RtYV9hdmFpbGFibGUoc3RydWN0IHJzbmRfZG1hICpkbWEpCiB7CiAJcmV0dXJuICEhZG1hLT5jaGFuOwogfQogCiBpbnQgcnNuZF9kbWFfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwKLQkJICBpbnQgaXNfcGxheSwgaW50IGlkLAotCQkgIGludCAoKmlucXVpcnkpKHN0cnVjdCByc25kX2RtYSAqZG1hLAotCQkJCSAgZG1hX2FkZHJfdCAqYnVmLCBpbnQgKmxlbiksCi0JCSAgaW50ICgqY29tcGxldGUpKHN0cnVjdCByc25kX2RtYSAqZG1hKSkKKwkJICBpbnQgaXNfcGxheSwgaW50IGlkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY2ZnOwpAQCAtMjQ2LDkgKzI5MCw2IEBACiAJCWdvdG8gcnNuZF9kbWFfaW5pdF9lcnI7CiAKIAlkbWEtPmRpciA9IGlzX3BsYXkgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFOwotCWRtYS0+cHJpdiA9IHByaXY7Ci0JZG1hLT5pbnF1aXJ5ID0gaW5xdWlyeTsKLQlkbWEtPmNvbXBsZXRlID0gY29tcGxldGU7CiAJSU5JVF9XT1JLKCZkbWEtPndvcmssIHJzbmRfZG1hX2RvX3dvcmspOwogCiAJcmV0dXJuIDA7CkBAIC0yNzEsMjYgKzMxMiw0MiBAQAogLyoKICAqCXJzbmRfZGFpIGZ1bmN0aW9ucwogICovCi0jZGVmaW5lIHJzbmRfZGFpX2NhbGwocmRhaSwgaW8sIGZuKQkJCVwKLSh7CQkJCQkJCVwKLQlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwgKm47CQkJXAotCWludCByZXQgPSAwOwkJCQkJXAotCWZvcl9lYWNoX3JzbmRfbW9kKG1vZCwgbiwgaW8pIHsJCQlcCi0JCXJldCA9IHJzbmRfbW9kX2NhbGwobW9kLCBmbiwgcmRhaSwgaW8pOwlcCi0JCWlmIChyZXQgPCAwKQkJCQlcCi0JCQlicmVhazsJCQkJXAotCX0JCQkJCQlcCi0JcmV0OwkJCQkJCVwKKyNkZWZpbmUgX19yc25kX21vZF9jYWxsKG1vZCwgZnVuYywgcmRhaSwgaW8pCQkJXAorKHsJCQkJCQkJCVwKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwkJXAorCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CQlcCisJZGV2X2RiZyhkZXYsICIlcyBbJWRdICVzXG4iLAkJCQlcCisJCXJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSwgI2Z1bmMpOwlcCisJKG1vZCktPm9wcy0+ZnVuYyhtb2QsIHJkYWksIGlvKTsJCQlcCiB9KQogCi1pbnQgcnNuZF9kYWlfY29ubmVjdChzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCSAgICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCSAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCisjZGVmaW5lIHJzbmRfbW9kX2NhbGwobW9kLCBmdW5jLCByZGFpLCBpbykJXAorCSghKG1vZCkgPyAtRU5PREVWIDoJCQlcCisJICEoKG1vZCktPm9wcy0+ZnVuYykgPyAwIDoJCVwKKwkgX19yc25kX21vZF9jYWxsKG1vZCwgZnVuYywgKHJkYWkpLCAoaW8pKSkKKworI2RlZmluZSByc25kX2RhaV9jYWxsKHJkYWksIGlvLCBmbikJCQkJXAorKHsJCQkJCQkJCVwKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZDsJCQkJCVwKKwlpbnQgcmV0ID0gMCwgaTsJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IFJTTkRfTU9EX01BWDsgaSsrKSB7CQkJXAorCQltb2QgPSAoaW8pLT5tb2RbaV07CQkJCVwKKwkJaWYgKCFtb2QpCQkJCQlcCisJCQljb250aW51ZTsJCQkJXAorCQlyZXQgPSByc25kX21vZF9jYWxsKG1vZCwgZm4sIChyZGFpKSwgKGlvKSk7CVwKKwkJaWYgKHJldCA8IDApCQkJCQlcCisJCQlicmVhazsJCQkJCVwKKwl9CQkJCQkJCVwKKwlyZXQ7CQkJCQkJCVwKK30pCisKK3N0YXRpYyBpbnQgcnNuZF9kYWlfY29ubmVjdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKIAlpZiAoIW1vZCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoIWxpc3RfZW1wdHkoJm1vZC0+bGlzdCkpIHsKKwlpZiAoaW8tPm1vZFttb2QtPnR5cGVdKSB7CiAJCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CiAJCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAKQEAgLTMwMCwxNCArMzU3LDggQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JbGlzdF9hZGRfdGFpbCgmbW9kLT5saXN0LCAmaW8tPmhlYWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCByc25kX2RhaV9kaXNjb25uZWN0KHN0cnVjdCByc25kX21vZCAqbW9kKQotewotCWxpc3RfZGVsX2luaXQoJm1vZC0+bGlzdCk7CisJaW8tPm1vZFttb2QtPnR5cGVdID0gbW9kOworCW1vZC0+aW8gPSBpbzsKIAogCXJldHVybiAwOwogfQpAQCAtMzE2LDcgKzM2Nyw3IEBACiB7CiAJaW50IGlkID0gcmRhaSAtIHByaXYtPnJkYWk7CiAKLQlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfZGFpX25yKHByaXYpKSkKKwlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfcmRhaV9ucihwcml2KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIGlkOwpAQCAtMzI0LDcgKzM3NSw3IEBACiAKIHN0cnVjdCByc25kX2RhaSAqcnNuZF9kYWlfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCkKIHsKLQlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfZGFpX25yKHByaXYpKSkKKwlpZiAoKGlkIDwgMCkgfHwgKGlkID49IHJzbmRfcmRhaV9ucihwcml2KSkpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHByaXYtPnJkYWkgKyBpZDsKQEAgLTM4MiwxMCArNDMzLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZpby0+aGVhZCkpCi0JCXJldHVybiAtRUlPOwotCi0JSU5JVF9MSVNUX0hFQUQoJmlvLT5oZWFkKTsKIAlpby0+c3Vic3RyZWFtCQk9IHN1YnN0cmVhbTsKIAlpby0+Ynl0ZV9wb3MJCT0gMDsKIAlpby0+cGVyaW9kX3BvcwkJPSAwOwpAQCAtNDQwLDEwICs0ODcsNiBAQAogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGFpX3RyaWdnZXJfZW5kOwogCi0JCXJldCA9IHJzbmRfZ2VuX3BhdGhfaW5pdChwcml2LCByZGFpLCBpbyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBkYWlfdHJpZ2dlcl9lbmQ7Ci0KIAkJcmV0ID0gcnNuZF9kYWlfY2FsbChyZGFpLCBpbywgaW5pdCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBkYWlfdHJpZ2dlcl9lbmQ7CkBAIC00NjEsMTAgKzUwNCw2IEBACiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBkYWlfdHJpZ2dlcl9lbmQ7CiAKLQkJcmV0ID0gcnNuZF9nZW5fcGF0aF9leGl0KHByaXYsIHJkYWksIGlvKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGRhaV90cmlnZ2VyX2VuZDsKLQogCQlyZXQgPSByc25kX3BsYXRmb3JtX2NhbGwocHJpdiwgZGFpLCBzdG9wLCBzc2lfaWQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGFpX3RyaWdnZXJfZW5kOwpAQCAtNDg2LDEwICs1MjUsMTAgQEAKIAkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06Ci0JCXJkYWktPmNsa19tYXN0ZXIgPSAxOworCQlyZGFpLT5jbGtfbWFzdGVyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgotCQlyZGFpLT5jbGtfbWFzdGVyID0gMDsKKwkJcmRhaS0+Y2xrX21hc3RlciA9IDE7IC8qIGNvZGVjIGlzIHNsYXZlLCBjcHUgaXMgbWFzdGVyICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTQwLDI0ICs1NzksMTc0IEBACiAJLnNldF9mbXQJPSByc25kX3NvY19kYWlfc2V0X2ZtdCwKIH07CiAKK3N0YXRpYyBpbnQgcnNuZF9wYXRoX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKKwkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZDsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm8gPSByZGFpLT5pbmZvOworCWludCByZXQ7CisJaW50IHNzaV9pZCA9IC0xOworCWludCBzcmNfaWQgPSAtMTsKKworCS8qCisJICogR2VuMSBpcyBjcmVhdGVkIGJ5IFNSVS9TU0ksIGFuZCB0aGlzIFNSVSBpcyBiYXNlIG1vZHVsZSBvZgorCSAqIEdlbjIncyBTQ1UvU1NJVS9TU0kuIChHZW4yIFNDVS9TU0lVIGNhbWUgZnJvbSBTUlUpCisJICoKKwkgKiBFYXN5IGltYWdlIGlzLi4KKwkgKglHZW4xIFNSVSA9IEdlbjIgU0NVICsgU1NJVSArIGV0YworCSAqCisJICogR2VuMiBTQ1UgcGF0aCBpcyB2ZXJ5IGZsZXhpYmxlLCBidXQsIEdlbjEgU1JVIChTQ1UgcGFydHMpIGlzCisJICogdXNpbmcgZml4ZWQgcGF0aC4KKwkgKi8KKwlpZiAoZGFpX2luZm8pIHsKKwkJaWYgKHJzbmRfaXNfZW5hYmxlX3BhdGgoaW8sIHNzaSkpCisJCQlzc2lfaWQgPSByc25kX2luZm9faWQocHJpdiwgaW8sIHNzaSk7CisJCWlmIChyc25kX2lzX2VuYWJsZV9wYXRoKGlvLCBzcmMpKQorCQkJc3JjX2lkID0gcnNuZF9pbmZvX2lkKHByaXYsIGlvLCBzcmMpOworCX0gZWxzZSB7CisJCS8qIGdldCBTU0kncyBJRCAqLworCQltb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwKKwkJCQkJICAgICAgIHJzbmRfZGFpX2lkKHByaXYsIHJkYWkpLAorCQkJCQkgICAgICAgcnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbykpOworCQlpZiAoIW1vZCkKKwkJCXJldHVybiAwOworCQlzc2lfaWQgPSBzcmNfaWQgPSByc25kX21vZF9pZChtb2QpOworCX0KKworCXJldCA9IDA7CisKKwkvKiBTUkMgKi8KKwlpZiAoc3JjX2lkID49IDApIHsKKwkJbW9kID0gcnNuZF9zcmNfbW9kX2dldChwcml2LCBzcmNfaWQpOworCQlyZXQgPSByc25kX2RhaV9jb25uZWN0KG1vZCwgaW8pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogU1NJICovCisJaWYgKHNzaV9pZCA+PSAwKSB7CisJCW1vZCA9IHJzbmRfc3NpX21vZF9nZXQocHJpdiwgc3NpX2lkKTsKKwkJcmV0ID0gcnNuZF9kYWlfY29ubmVjdChtb2QsIGlvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJzbmRfb2ZfcGFyc2VfZGFpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAorCQkJICAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhaV9ub2RlLAkqZGFpX25wOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3NpX25vZGUsCSpzc2lfbnA7CisJc3RydWN0IGRldmljZV9ub2RlICpzcmNfbm9kZSwJKnNyY19ucDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBsYXliYWNrLCAqY2FwdHVyZTsKKwlzdHJ1Y3QgcnNuZF9kYWlfcGxhdGZvcm1faW5mbyAqZGFpX2luZm87CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCBuciwgaTsKKwlpbnQgZGFpX2ksIHNzaV9pLCBzcmNfaTsKKworCWlmICghb2ZfZGF0YSkKKwkJcmV0dXJuOworCisJZGFpX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLGRhaSIpOworCWlmICghZGFpX25vZGUpCisJCXJldHVybjsKKworCW5yID0gb2ZfZ2V0X2NoaWxkX2NvdW50KGRhaV9ub2RlKTsKKwlpZiAoIW5yKQorCQlyZXR1cm47CisKKwlkYWlfaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCByc25kX2RhaV9wbGF0Zm9ybV9pbmZvKSAqIG5yLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghZGFpX2luZm8pIHsKKwkJZGV2X2VycihkZXYsICJkYWkgaW5mbyBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluZm8tPmRhaV9pbmZvX25yCT0gbnI7CisJaW5mby0+ZGFpX2luZm8JCT0gZGFpX2luZm87CisKKwlzc2lfbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgInJjYXJfc291bmQsc3NpIik7CisJc3JjX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNyYyIpOworCisjZGVmaW5lIG1vZF9wYXJzZShuYW1lKQkJCQkJCQlcCitpZiAobmFtZSMjX25vZGUpIHsJCQkJCQkJXAorCXN0cnVjdCByc25kXyMjbmFtZSMjX3BsYXRmb3JtX2luZm8gKm5hbWUjI19pbmZvOwkJXAorCQkJCQkJCQkJXAorCW5hbWUjI19pID0gMDsJCQkJCQkJXAorCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobmFtZSMjX25vZGUsIG5hbWUjI19ucCkgewkJXAorCQluYW1lIyNfaW5mbyA9IGluZm8tPm5hbWUjI19pbmZvICsgbmFtZSMjX2k7CQlcCisJCQkJCQkJCQlcCisJCWlmIChuYW1lIyNfbnAgPT0gcGxheWJhY2spCQkJCVwKKwkJCWRhaV9pbmZvLT5wbGF5YmFjay5uYW1lID0gbmFtZSMjX2luZm87CQlcCisJCWlmIChuYW1lIyNfbnAgPT0gY2FwdHVyZSkJCQkJXAorCQkJZGFpX2luZm8tPmNhcHR1cmUubmFtZSA9IG5hbWUjI19pbmZvOwkJXAorCQkJCQkJCQkJXAorCQluYW1lIyNfaSsrOwkJCQkJCVwKKwl9CQkJCQkJCQlcCit9CisKKwkvKgorCSAqIHBhcnNlIGFsbCBkYWkKKwkgKi8KKwlkYWlfaSA9IDA7CisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShkYWlfbm9kZSwgZGFpX25wKSB7CisJCWRhaV9pbmZvID0gaW5mby0+ZGFpX2luZm8gKyBkYWlfaTsKKworCQlmb3IgKGkgPSAwOzsgaSsrKSB7CisKKwkJCXBsYXliYWNrID0gb2ZfcGFyc2VfcGhhbmRsZShkYWlfbnAsICJwbGF5YmFjayIsIGkpOworCQkJY2FwdHVyZSAgPSBvZl9wYXJzZV9waGFuZGxlKGRhaV9ucCwgImNhcHR1cmUiLCBpKTsKKworCQkJaWYgKCFwbGF5YmFjayAmJiAhY2FwdHVyZSkKKwkJCQlicmVhazsKKworCQkJbW9kX3BhcnNlKHNzaSk7CisJCQltb2RfcGFyc2Uoc3JjKTsKKworCQkJaWYgKHBsYXliYWNrKQorCQkJCW9mX25vZGVfcHV0KHBsYXliYWNrKTsKKwkJCWlmIChjYXB0dXJlKQorCQkJCW9mX25vZGVfcHV0KGNhcHR1cmUpOworCQl9CisKKwkJZGFpX2krKzsKKwl9Cit9CisKIHN0YXRpYyBpbnQgcnNuZF9kYWlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCQkgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCQkgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZHJ2OworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CiAJc3RydWN0IHJzbmRfZGFpICpyZGFpOwogCXN0cnVjdCByc25kX21vZCAqcG1vZCwgKmNtb2Q7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlpbnQgZGFpX25yOwogCWludCBpOwogCi0JLyogZ2V0IG1heCBkYWkgbnIgKi8KLQlmb3IgKGRhaV9uciA9IDA7IGRhaV9uciA8IDMyOyBkYWlfbnIrKykgewotCQlwbW9kID0gcnNuZF9zc2lfbW9kX2dldF9mcm1fZGFpKHByaXYsIGRhaV9uciwgMSk7Ci0JCWNtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgZGFpX25yLCAwKTsKKwlyc25kX29mX3BhcnNlX2RhaShwZGV2LCBvZl9kYXRhLCBwcml2KTsKIAotCQlpZiAoIXBtb2QgJiYgIWNtb2QpCi0JCQlicmVhazsKKwkvKgorCSAqIGRhaV9uciBzaG91bGQgYmUgc2V0IHZpYSBkYWlfaW5mb19uciwKKwkgKiBidXQgYWxsb3cgaXQgdG8ga2VlcGluZyBjb21wYXRpYmxlCisJICovCisJZGFpX25yID0gaW5mby0+ZGFpX2luZm9fbnI7CisJaWYgKCFkYWlfbnIpIHsKKwkJLyogZ2V0IG1heCBkYWkgbnIgKi8KKwkJZm9yIChkYWlfbnIgPSAwOyBkYWlfbnIgPCAzMjsgZGFpX25yKyspIHsKKwkJCXBtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgZGFpX25yLCAxKTsKKwkJCWNtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgZGFpX25yLCAwKTsKKworCQkJaWYgKCFwbW9kICYmICFjbW9kKQorCQkJCWJyZWFrOworCQl9CiAJfQogCiAJaWYgKCFkYWlfbnIpIHsKQEAgLTU3Miw3ICs3NjEsMTMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJcHJpdi0+cmRhaV9ucgk9IGRhaV9ucjsKKwlwcml2LT5kYWlkcnYJPSBkcnY7CisJcHJpdi0+cmRhaQk9IHJkYWk7CisKIAlmb3IgKGkgPSAwOyBpIDwgZGFpX25yOyBpKyspIHsKKwkJaWYgKGluZm8tPmRhaV9pbmZvKQorCQkJcmRhaVtpXS5pbmZvID0gJmluZm8tPmRhaV9pbmZvW2ldOwogCiAJCXBtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgaSwgMSk7CiAJCWNtb2QgPSByc25kX3NzaV9tb2RfZ2V0X2ZybV9kYWkocHJpdiwgaSwgMCk7CkBAIC01ODAsOSArNzc1LDYgQEAKIAkJLyoKIAkJICoJaW5pdCByc25kX2RhaQogCQkgKi8KLQkJSU5JVF9MSVNUX0hFQUQoJnJkYWlbaV0ucGxheWJhY2suaGVhZCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZyZGFpW2ldLmNhcHR1cmUuaGVhZCk7Ci0KIAkJc25wcmludGYocmRhaVtpXS5uYW1lLCBSU05EX0RBSV9OQU1FX1NJWkUsICJyc25kLWRhaS4lZCIsIGkpOwogCiAJCS8qCkBAIC01OTUsMTIgKzc4NywyMCBAQAogCQkJZHJ2W2ldLnBsYXliYWNrLmZvcm1hdHMJCT0gUlNORF9GTVRTOwogCQkJZHJ2W2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbgk9IDI7CiAJCQlkcnZbaV0ucGxheWJhY2suY2hhbm5lbHNfbWF4CT0gMjsKKworCQkJaWYgKGluZm8tPmRhaV9pbmZvKQorCQkJCXJkYWlbaV0ucGxheWJhY2suaW5mbyA9ICZpbmZvLT5kYWlfaW5mb1tpXS5wbGF5YmFjazsKKwkJCXJzbmRfcGF0aF9pbml0KHByaXYsICZyZGFpW2ldLCAmcmRhaVtpXS5wbGF5YmFjayk7CiAJCX0KIAkJaWYgKGNtb2QpIHsKIAkJCWRydltpXS5jYXB0dXJlLnJhdGVzCQk9IFJTTkRfUkFURVM7CiAJCQlkcnZbaV0uY2FwdHVyZS5mb3JtYXRzCQk9IFJTTkRfRk1UUzsKIAkJCWRydltpXS5jYXB0dXJlLmNoYW5uZWxzX21pbgk9IDI7CiAJCQlkcnZbaV0uY2FwdHVyZS5jaGFubmVsc19tYXgJPSAyOworCisJCQlpZiAoaW5mby0+ZGFpX2luZm8pCisJCQkJcmRhaVtpXS5jYXB0dXJlLmluZm8gPSAmaW5mby0+ZGFpX2luZm9baV0uY2FwdHVyZTsKKwkJCXJzbmRfcGF0aF9pbml0KHByaXYsICZyZGFpW2ldLCAmcmRhaVtpXS5jYXB0dXJlKTsKIAkJfQogCiAJCWRldl9kYmcoZGV2LCAiJXMgKCVzLyVzKVxuIiwgcmRhaVtpXS5uYW1lLApAQCAtNjA4LDE4ICs4MDgsOSBAQAogCQkJY21vZCA/ICJjYXB0dXJlIiA6ICIgIC0tICAgIik7CiAJfQogCi0JcHJpdi0+ZGFpX25yCT0gZGFpX25yOwotCXByaXYtPmRhaWRydgk9IGRydjsKLQlwcml2LT5yZGFpCT0gcmRhaTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByc25kX2RhaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLX0KLQogLyoKICAqCQlwY20gb3BzCiAgKi8KQEAgLTcxMyw5ICs5MDQsMzAgQEAKIAlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcnNuZF9kYWkgKnJkYWk7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UocnNuZF9vZl9tYXRjaCwgZGV2KTsKKwljb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhOworCWludCAoKnByb2JlX2Z1bmNbXSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAorCQkJICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpID0geworCQlyc25kX2dlbl9wcm9iZSwKKwkJcnNuZF9zc2lfcHJvYmUsCisJCXJzbmRfc3JjX3Byb2JlLAorCQlyc25kX2FkZ19wcm9iZSwKKwkJcnNuZF9kYWlfcHJvYmUsCisJfTsKKwlpbnQgcmV0LCBpOwogCi0JaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWluZm8gPSBOVUxMOworCW9mX2RhdGEgPSBOVUxMOworCWlmIChvZl9pZCkgeworCQlpbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcmNhcl9zbmRfaW5mbyksIEdGUF9LRVJORUwpOworCQlvZl9kYXRhID0gb2ZfaWQtPmRhdGE7CisJfSBlbHNlIHsKKwkJaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCX0KKwogCWlmICghaW5mbykgewogCQlkZXZfZXJyKGRldiwgImRyaXZlciBuZWVkcyBSLUNhciBzb3VuZCBpbmZvcm1hdGlvblxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtNzM3LDI1ICs5NDksMjEgQEAKIAkvKgogCSAqCWluaXQgZWFjaCBtb2R1bGUKIAkgKi8KLQlyZXQgPSByc25kX2dlbl9wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9iZV9mdW5jKTsgaSsrKSB7CisJCXJldCA9IHByb2JlX2Z1bmNbaV0ocGRldiwgb2ZfZGF0YSwgcHJpdik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAotCXJldCA9IHJzbmRfc2N1X3Byb2JlKHBkZXYsIGluZm8sIHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWZvcl9lYWNoX3JzbmRfZGFpKHJkYWksIHByaXYsIGkpIHsKKwkJcmV0ID0gcnNuZF9kYWlfY2FsbChyZGFpLCAmcmRhaS0+cGxheWJhY2ssIHByb2JlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQlyZXQgPSByc25kX2FkZ19wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJzbmRfc3NpX3Byb2JlKHBkZXYsIGluZm8sIHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gcnNuZF9kYWlfcHJvYmUocGRldiwgaW5mbywgcHJpdik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCXJldCA9IHJzbmRfZGFpX2NhbGwocmRhaSwgJnJkYWktPmNhcHR1cmUsIHByb2JlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJLyoKIAkgKglhc29jIHJlZ2lzdGVyCkBAIC03NjcsNyArOTc1LDcgQEAKIAl9CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudChkZXYsICZyc25kX3NvY19jb21wb25lbnQsCi0JCQkJCSBwcml2LT5kYWlkcnYsIHJzbmRfZGFpX25yKHByaXYpKTsKKwkJCQkJIHByaXYtPmRhaWRydiwgcnNuZF9yZGFpX25yKHByaXYpKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzbmQgZGFpIHJlZ2lzdGVyXG4iKTsKIAkJZ290byBleGl0X3NuZF9zb2M7CkBAIC03ODksMTcgKzk5NywyMCBAQAogc3RhdGljIGludCByc25kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHJzbmRfZGFpICpyZGFpOworCWludCByZXQsIGk7CiAKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKLQkvKgotCSAqCXJlbW92ZSBlYWNoIG1vZHVsZQotCSAqLwotCXJzbmRfc3NpX3JlbW92ZShwZGV2LCBwcml2KTsKLQlyc25kX2FkZ19yZW1vdmUocGRldiwgcHJpdik7Ci0JcnNuZF9zY3VfcmVtb3ZlKHBkZXYsIHByaXYpOwotCXJzbmRfZGFpX3JlbW92ZShwZGV2LCBwcml2KTsKLQlyc25kX2dlbl9yZW1vdmUocGRldiwgcHJpdik7CisJZm9yX2VhY2hfcnNuZF9kYWkocmRhaSwgcHJpdiwgaSkgeworCQlyZXQgPSByc25kX2RhaV9jYWxsKHJkYWksICZyZGFpLT5wbGF5YmFjaywgcmVtb3ZlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gcnNuZF9kYWlfY2FsbChyZGFpLCAmcmRhaS0+Y2FwdHVyZSwgcmVtb3ZlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04MDcsNiArMTAxOCw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByc25kX2RyaXZlciA9IHsKIAkuZHJpdmVyCT0gewogCQkubmFtZQk9ICJyY2FyX3NvdW5kIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcnNuZF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZQkJPSByc25kX3Byb2JlLAogCS5yZW1vdmUJCT0gcnNuZF9yZW1vdmUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYyBiL3NvdW5kL3NvYy9zaC9yY2FyL2dlbi5jCmluZGV4IGFkZDA4OGIuLjUwYTFlZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL2dlbi5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL2dlbi5jCkBAIC0xNTUsNjIgKzE1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCByc25kX2dlbl9wYXRoX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX21vZCAqbW9kOwotCWludCByZXQ7Ci0JaW50IGlkOwotCi0JLyoKLQkgKiBHZW4xIGlzIGNyZWF0ZWQgYnkgU1JVL1NTSSwgYW5kIHRoaXMgU1JVIGlzIGJhc2UgbW9kdWxlIG9mCi0JICogR2VuMidzIFNDVS9TU0lVL1NTSS4gKEdlbjIgU0NVL1NTSVUgY2FtZSBmcm9tIFNSVSkKLQkgKgotCSAqIEVhc3kgaW1hZ2UgaXMuLgotCSAqCUdlbjEgU1JVID0gR2VuMiBTQ1UgKyBTU0lVICsgZXRjCi0JICoKLQkgKiBHZW4yIFNDVSBwYXRoIGlzIHZlcnkgZmxleGlibGUsIGJ1dCwgR2VuMSBTUlUgKFNDVSBwYXJ0cykgaXMKLQkgKiB1c2luZyBmaXhlZCBwYXRoLgotCSAqCi0JICogVGhlbiwgU1NJIGlkID0gU0NVIGlkIGhlcmUKLQkgKi8KLQotCS8qIGdldCBTU0kncyBJRCAqLwotCW1vZCA9IHJzbmRfc3NpX21vZF9nZXRfZnJtX2RhaShwcml2LAotCQkJCSAgICAgICByc25kX2RhaV9pZChwcml2LCByZGFpKSwKLQkJCQkgICAgICAgcnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbykpOwotCWlkID0gcnNuZF9tb2RfaWQobW9kKTsKLQotCS8qIFNTSSAqLwotCW1vZCA9IHJzbmRfc3NpX21vZF9nZXQocHJpdiwgaWQpOwotCXJldCA9IHJzbmRfZGFpX2Nvbm5lY3QocmRhaSwgbW9kLCBpbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTQ1UgKi8KLQltb2QgPSByc25kX3NjdV9tb2RfZ2V0KHByaXYsIGlkKTsKLQlyZXQgPSByc25kX2RhaV9jb25uZWN0KHJkYWksIG1vZCwgaW8pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJzbmRfZ2VuX3BhdGhfZXhpdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkgICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkgICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCi17Ci0Jc3RydWN0IHJzbmRfbW9kICptb2QsICpuOwotCWludCByZXQgPSAwOwotCi0JLyoKLQkgKiByZW1vdmUgYWxsIG1vZCBmcm9tIHJkYWkKLQkgKi8KLQlmb3JfZWFjaF9yc25kX21vZChtb2QsIG4sIGlvKQotCQlyZXQgfD0gcnNuZF9kYWlfZGlzY29ubmVjdChtb2QpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAqCQlHZW4yCiAgKi8KQEAgLTIyOSwxNCArMTczLDQwIEBACiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIFNTSVUsCVNTSV9NT0RFMCwJMHg4MDApLAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBTU0lVLAlTU0lfTU9ERTEsCTB4ODA0KSwKIAkJLyogRklYTUU6IGl0IG5lZWRzIFNTSV9NT0RFMi8zIGluIHRoZSBmdXR1cmUgKi8KKwkJUlNORF9HRU4yX01fUkVHKGdlbiwgU1NJVSwJU1NJX0JVU0lGX01PREUsCTB4MCwJMHg4MCksCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSVUsCVNTSV9CVVNJRl9BRElOUiwweDQsCTB4ODApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTU0lVLAlTU0lfQ1RSTCwJMHgxMCwJMHg4MCksCiAJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSVUsCUlOVF9FTkFCTEUsCTB4MTgsCTB4ODApLAogCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNDVSwJU1JDX0JVU0lGX01PREUsCTB4MCwJMHgyMCksCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNDVSwJU1JDX1JPVVRFX01PREUwLDB4YywJMHgyMCksCisJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNDVSwJU1JDX0NUUkwsCTB4MTAsCTB4MjApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19TV1JTUiwJMHgyMDAsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19TUkNJUiwJMHgyMDQsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19BRElOUiwJMHgyMTQsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19JRlNDUiwJMHgyMWMsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19JRlNWUiwJMHgyMjAsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19TUkNDUiwJMHgyMjQsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19CU0RTUiwJMHgyMmMsCTB4NDApLAorCQlSU05EX0dFTjJfTV9SRUcoZ2VuLCBTQ1UsCVNSQ19CU0lTUiwJMHgyMzgsCTB4NDApLAorCiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJQlJSQSwJCTB4MDApLAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCUJSUkIsCQkweDA0KSwKIAkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTU0lDS1IsCQkweDA4KSwKIAkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlBVURJT19DTEtfU0VMMCwJMHgwYyksCiAJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJQVVESU9fQ0xLX1NFTDEsCTB4MTApLAogCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCUFVRElPX0NMS19TRUwyLAkweDE0KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlESVZfRU4sCQkweDMwKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwwLAkweDM0KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwxLAkweDM4KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwyLAkweDNjKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUwzLAkweDQwKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNJTl9USU1TRUw0LAkweDQ0KSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNPVVRfVElNU0VMMCwJMHg0OCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDT1VUX1RJTVNFTDEsCTB4NGMpLAorCQlSU05EX0dFTjJfU19SRUcoZ2VuLCBBREcsCVNSQ09VVF9USU1TRUwyLAkweDUwKSwKKwkJUlNORF9HRU4yX1NfUkVHKGdlbiwgQURHLAlTUkNPVVRfVElNU0VMMywJMHg1NCksCisJCVJTTkRfR0VOMl9TX1JFRyhnZW4sIEFERywJU1JDT1VUX1RJTVNFTDQsCTB4NTgpLAogCiAJCVJTTkRfR0VOMl9NX1JFRyhnZW4sIFNTSSwJU1NJQ1IsCQkweDAwLAkweDQwKSwKIAkJUlNORF9HRU4yX01fUkVHKGdlbiwgU1NJLAlTU0lTUiwJCTB4MDQsCTB4NDApLApAQCAtMjQ5LDcgKzIxOSw2IEBACiB9CiAKIHN0YXRpYyBpbnQgcnNuZF9nZW4yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKIAkJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKQEAgLTI4Myw3ICsyNTIsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJZGV2X2RiZyhkZXYsICJHZW4yIGRldmljZSBwcm9iZWRcbiIpOwotCWRldl9kYmcoZGV2LCAiU1JVICA6ICUwOHggPT4gJXBcbiIsIHNjdV9yZXMtPnN0YXJ0LAorCWRldl9kYmcoZGV2LCAiU0NVICA6ICUwOHggPT4gJXBcbiIsIHNjdV9yZXMtPnN0YXJ0LAogCQlnZW4tPmJhc2VbUlNORF9HRU4yX1NDVV0pOwogCWRldl9kYmcoZGV2LCAiQURHICA6ICUwOHggPT4gJXBcbiIsIGFkZ19yZXMtPnN0YXJ0LAogCQlnZW4tPmJhc2VbUlNORF9HRU4yX0FER10pOwpAQCAtMzE3LDcgKzI4Niw3IEBACiAJCVJTTkRfR0VOMV9TX1JFRyhnZW4sIFNSVSwJU1JDX1JPVVRFX0NUUkwsCTB4YzApLAogCQlSU05EX0dFTjFfU19SRUcoZ2VuLCBTUlUsCVNTSV9NT0RFMCwJMHhEMCksCiAJCVJTTkRfR0VOMV9TX1JFRyhnZW4sIFNSVSwJU1NJX01PREUxLAkweEQ0KSwKLQkJUlNORF9HRU4xX01fUkVHKGdlbiwgU1JVLAlCVVNJRl9NT0RFLAkweDIwLAkweDQpLAorCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19CVVNJRl9NT0RFLAkweDIwLAkweDQpLAogCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19ST1VURV9NT0RFMCwweDUwLAkweDgpLAogCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19TV1JTUiwJMHgyMDAsCTB4NDApLAogCQlSU05EX0dFTjFfTV9SRUcoZ2VuLCBTUlUsCVNSQ19TUkNJUiwJMHgyMDQsCTB4NDApLApAQCAtMzQ3LDcgKzMxNiw2IEBACiB9CiAKIHN0YXRpYyBpbnQgcnNuZF9nZW4xX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICBzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbywKIAkJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKQEAgLTM5MSwxNCArMzU5LDI4IEBACiAvKgogICoJCUdlbgogICovCitzdGF0aWMgdm9pZCByc25kX29mX3BhcnNlX2dlbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCit7CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSBwcml2LT5pbmZvOworCisJaWYgKCFvZl9kYXRhKQorCQlyZXR1cm47CisKKwlpbmZvLT5mbGFncyA9IG9mX2RhdGEtPmZsYWdzOworfQorCiBpbnQgcnNuZF9nZW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgcnNuZF9nZW4gKmdlbjsKIAlpbnQgcmV0OwogCisJcnNuZF9vZl9wYXJzZV9nZW4ocGRldiwgb2ZfZGF0YSwgcHJpdik7CisKIAlnZW4gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmdlbiksIEdGUF9LRVJORUwpOwogCWlmICghZ2VuKSB7CiAJCWRldl9lcnIoZGV2LCAiR0VOIGFsbG9jYXRlIGZhaWxlZFxuIik7CkBAIC00MDksMTcgKzM5MSwxMiBAQAogCiAJcmV0ID0gLUVOT0RFVjsKIAlpZiAocnNuZF9pc19nZW4xKHByaXYpKQotCQlyZXQgPSByc25kX2dlbjFfcHJvYmUocGRldiwgaW5mbywgcHJpdik7CisJCXJldCA9IHJzbmRfZ2VuMV9wcm9iZShwZGV2LCBwcml2KTsKIAllbHNlIGlmIChyc25kX2lzX2dlbjIocHJpdikpCi0JCXJldCA9IHJzbmRfZ2VuMl9wcm9iZShwZGV2LCBpbmZvLCBwcml2KTsKKwkJcmV0ID0gcnNuZF9nZW4yX3Byb2JlKHBkZXYsIHByaXYpOwogCiAJaWYgKHJldCA8IDApCiAJCWRldl9lcnIoZGV2LCAidW5rbm93biBnZW5lcmF0aW9uIFItQ2FyIHNvdW5kIGRldmljZVxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQotCi12b2lkIHJzbmRfZ2VuX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCi17Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9yc25kLmggYi9zb3VuZC9zb2Mvc2gvcmNhci9yc25kLmgKaW5kZXggNGNhNjZjZC4uNjE5ZDE5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvcnNuZC5oCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL3JzbmQuaApAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPHNvdW5kL3JjYXJfc25kLmg+CkBAIC0zMiwxNSArMzQsOSBAQAogICovCiBlbnVtIHJzbmRfcmVnIHsKIAkvKiBTUlUvU0NVL1NTSVUgKi8KLQlSU05EX1JFR19TUkNfUk9VVEVfU0VMLAkJLyogZm9yIEdlbjEgKi8KLQlSU05EX1JFR19TUkNfVE1HX1NFTDAsCQkvKiBmb3IgR2VuMSAqLwotCVJTTkRfUkVHX1NSQ19UTUdfU0VMMSwJCS8qIGZvciBHZW4xICovCi0JUlNORF9SRUdfU1JDX1RNR19TRUwyLAkJLyogZm9yIEdlbjEgKi8KLQlSU05EX1JFR19TUkNfUk9VVEVfQ1RSTCwJLyogZm9yIEdlbjEgKi8KIAlSU05EX1JFR19TU0lfTU9ERTAsCiAJUlNORF9SRUdfU1NJX01PREUxLAotCVJTTkRfUkVHX0JVU0lGX01PREUsCi0JUlNORF9SRUdfSU5UX0VOQUJMRSwJCS8qIGZvciBHZW4yICovCisJUlNORF9SRUdfU1JDX0JVU0lGX01PREUsCiAJUlNORF9SRUdfU1JDX1JPVVRFX01PREUwLAogCVJTTkRfUkVHX1NSQ19TV1JTUiwKIAlSU05EX1JFR19TUkNfU1JDSVIsCkBAIC00OCw3ICs0NCw2IEBACiAJUlNORF9SRUdfU1JDX0lGU0NSLAogCVJTTkRfUkVHX1NSQ19JRlNWUiwKIAlSU05EX1JFR19TUkNfU1JDQ1IsCi0JUlNORF9SRUdfU1JDX01ORlNSLAogCiAJLyogQURHICovCiAJUlNORF9SRUdfQlJSQSwKQEAgLTU2LDEwICs1MSw2IEBACiAJUlNORF9SRUdfU1NJQ0tSLAogCVJTTkRfUkVHX0FVRElPX0NMS19TRUwwLAogCVJTTkRfUkVHX0FVRElPX0NMS19TRUwxLAotCVJTTkRfUkVHX0FVRElPX0NMS19TRUwyLAotCVJTTkRfUkVHX0FVRElPX0NMS19TRUwzLAkvKiBmb3IgR2VuMSAqLwotCVJTTkRfUkVHX0FVRElPX0NMS19TRUw0LAkvKiBmb3IgR2VuMSAqLwotCVJTTkRfUkVHX0FVRElPX0NMS19TRUw1LAkvKiBmb3IgR2VuMSAqLwogCiAJLyogU1NJICovCiAJUlNORF9SRUdfU1NJQ1IsCkBAIC02OCw5ICs1OSw2MyBAQAogCVJTTkRfUkVHX1NTSVJEUiwKIAlSU05EX1JFR19TU0lXU1IsCiAKKwkvKiBTSEFSRSBzZWUgYmVsb3cgKi8KKwlSU05EX1JFR19TSEFSRTAxLAorCVJTTkRfUkVHX1NIQVJFMDIsCisJUlNORF9SRUdfU0hBUkUwMywKKwlSU05EX1JFR19TSEFSRTA0LAorCVJTTkRfUkVHX1NIQVJFMDUsCisJUlNORF9SRUdfU0hBUkUwNiwKKwlSU05EX1JFR19TSEFSRTA3LAorCVJTTkRfUkVHX1NIQVJFMDgsCisJUlNORF9SRUdfU0hBUkUwOSwKKwlSU05EX1JFR19TSEFSRTEwLAorCVJTTkRfUkVHX1NIQVJFMTEsCisJUlNORF9SRUdfU0hBUkUxMiwKKwlSU05EX1JFR19TSEFSRTEzLAorCVJTTkRfUkVHX1NIQVJFMTQsCisJUlNORF9SRUdfU0hBUkUxNSwKKwlSU05EX1JFR19TSEFSRTE2LAorCVJTTkRfUkVHX1NIQVJFMTcsCisJUlNORF9SRUdfU0hBUkUxOCwKKwlSU05EX1JFR19TSEFSRTE5LAorCiAJUlNORF9SRUdfTUFYLAogfTsKIAorLyogR2VuMSBvbmx5ICovCisjZGVmaW5lIFJTTkRfUkVHX1NSQ19ST1VURV9TRUwJCVJTTkRfUkVHX1NIQVJFMDEKKyNkZWZpbmUgUlNORF9SRUdfU1JDX1RNR19TRUwwCQlSU05EX1JFR19TSEFSRTAyCisjZGVmaW5lIFJTTkRfUkVHX1NSQ19UTUdfU0VMMQkJUlNORF9SRUdfU0hBUkUwMworI2RlZmluZSBSU05EX1JFR19TUkNfVE1HX1NFTDIJCVJTTkRfUkVHX1NIQVJFMDQKKyNkZWZpbmUgUlNORF9SRUdfU1JDX1JPVVRFX0NUUkwJCVJTTkRfUkVHX1NIQVJFMDUKKyNkZWZpbmUgUlNORF9SRUdfU1JDX01ORlNSCQlSU05EX1JFR19TSEFSRTA2CisjZGVmaW5lIFJTTkRfUkVHX0FVRElPX0NMS19TRUwzCQlSU05EX1JFR19TSEFSRTA3CisjZGVmaW5lIFJTTkRfUkVHX0FVRElPX0NMS19TRUw0CQlSU05EX1JFR19TSEFSRTA4CisjZGVmaW5lIFJTTkRfUkVHX0FVRElPX0NMS19TRUw1CQlSU05EX1JFR19TSEFSRTA5CisKKy8qIEdlbjIgb25seSAqLworI2RlZmluZSBSU05EX1JFR19TUkNfQ1RSTAkJUlNORF9SRUdfU0hBUkUwMQorI2RlZmluZSBSU05EX1JFR19TU0lfQ1RSTAkJUlNORF9SRUdfU0hBUkUwMgorI2RlZmluZSBSU05EX1JFR19TU0lfQlVTSUZfTU9ERQkJUlNORF9SRUdfU0hBUkUwMworI2RlZmluZSBSU05EX1JFR19TU0lfQlVTSUZfQURJTlIJUlNORF9SRUdfU0hBUkUwNAorI2RlZmluZSBSU05EX1JFR19JTlRfRU5BQkxFCQlSU05EX1JFR19TSEFSRTA1CisjZGVmaW5lIFJTTkRfUkVHX1NSQ19CU0RTUgkJUlNORF9SRUdfU0hBUkUwNgorI2RlZmluZSBSU05EX1JFR19TUkNfQlNJU1IJCVJTTkRfUkVHX1NIQVJFMDcKKyNkZWZpbmUgUlNORF9SRUdfRElWX0VOCQkJUlNORF9SRUdfU0hBUkUwOAorI2RlZmluZSBSU05EX1JFR19TUkNJTl9USU1TRUwwCQlSU05EX1JFR19TSEFSRTA5CisjZGVmaW5lIFJTTkRfUkVHX1NSQ0lOX1RJTVNFTDEJCVJTTkRfUkVHX1NIQVJFMTAKKyNkZWZpbmUgUlNORF9SRUdfU1JDSU5fVElNU0VMMgkJUlNORF9SRUdfU0hBUkUxMQorI2RlZmluZSBSU05EX1JFR19TUkNJTl9USU1TRUwzCQlSU05EX1JFR19TSEFSRTEyCisjZGVmaW5lIFJTTkRfUkVHX1NSQ0lOX1RJTVNFTDQJCVJTTkRfUkVHX1NIQVJFMTMKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDAJCVJTTkRfUkVHX1NIQVJFMTQKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDEJCVJTTkRfUkVHX1NIQVJFMTUKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDIJCVJTTkRfUkVHX1NIQVJFMTYKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDMJCVJTTkRfUkVHX1NIQVJFMTcKKyNkZWZpbmUgUlNORF9SRUdfU1JDT1VUX1RJTVNFTDQJCVJTTkRfUkVHX1NIQVJFMTgKKyNkZWZpbmUgUlNORF9SRUdfQVVESU9fQ0xLX1NFTDIJCVJTTkRfUkVHX1NIQVJFMTkKKworc3RydWN0IHJzbmRfb2ZfZGF0YTsKIHN0cnVjdCByc25kX3ByaXY7CiBzdHJ1Y3QgcnNuZF9tb2Q7CiBzdHJ1Y3QgcnNuZF9kYWk7CkBAIC05NiwyNCArMTQxLDIwIEBACiAgKglSLUNhciBETUEKICAqLwogc3RydWN0IHJzbmRfZG1hIHsKLQlzdHJ1Y3QgcnNuZF9wcml2CSpwcml2OwogCXN0cnVjdCBzaF9kbWFlX3NsYXZlCXNsYXZlOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCXN0cnVjdCBkbWFfY2hhbgkJKmNoYW47CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOwotCWludCAoKmlucXVpcnkpKHN0cnVjdCByc25kX2RtYSAqZG1hLCBkbWFfYWRkcl90ICpidWYsIGludCAqbGVuKTsKLQlpbnQgKCpjb21wbGV0ZSkoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogCiAJaW50IHN1Ym1pdF9sb29wOworCWludCBvZmZzZXQ7IC8qIGl0IGNhcmVzIEEvQiBwbGFuZSAqLwogfTsKIAogdm9pZCByc25kX2RtYV9zdGFydChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CiB2b2lkIHJzbmRfZG1hX3N0b3Aoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogaW50IHJzbmRfZG1hX2F2YWlsYWJsZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CiBpbnQgcnNuZF9kbWFfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwKLQlpbnQgaXNfcGxheSwgaW50IGlkLAotCWludCAoKmlucXVpcnkpKHN0cnVjdCByc25kX2RtYSAqZG1hLCBkbWFfYWRkcl90ICpidWYsIGludCAqbGVuKSwKLQlpbnQgKCpjb21wbGV0ZSkoc3RydWN0IHJzbmRfZG1hICpkbWEpKTsKKwlpbnQgaXNfcGxheSwgaW50IGlkKTsKIHZvaWQgIHJzbmRfZG1hX3F1aXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKIAkJICAgIHN0cnVjdCByc25kX2RtYSAqZG1hKTsKIApAQCAtMTIxLDkgKzE2MiwyMCBAQAogLyoKICAqCVItQ2FyIHNvdW5kIG1vZAogICovCitlbnVtIHJzbmRfbW9kX3R5cGUgeworCVJTTkRfTU9EX1NSQyA9IDAsCisJUlNORF9NT0RfU1NJLAorCVJTTkRfTU9EX01BWCwKK307CiAKIHN0cnVjdCByc25kX21vZF9vcHMgewogCWNoYXIgKm5hbWU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CiAJaW50ICgqaW5pdCkoc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCSAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCiAJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CkBAIC0xMzgsMjggKzE5MCwyNiBAQAogCQkgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwogfTsKIAorc3RydWN0IHJzbmRfZGFpX3N0cmVhbTsKIHN0cnVjdCByc25kX21vZCB7CiAJaW50IGlkOworCWVudW0gcnNuZF9tb2RfdHlwZSB0eXBlOwogCXN0cnVjdCByc25kX3ByaXYgKnByaXY7CiAJc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogY29ubmVjdCB0byByc25kX2RhaSBwbGF5YmFjay9jYXB0dXJlICovCiAJc3RydWN0IHJzbmRfZG1hIGRtYTsKKwlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbzsKIH07CiAKICNkZWZpbmUgcnNuZF9tb2RfdG9fcHJpdihtb2QpICgobW9kKS0+cHJpdikKICNkZWZpbmUgcnNuZF9tb2RfdG9fZG1hKG1vZCkgKCYobW9kKS0+ZG1hKQogI2RlZmluZSByc25kX2RtYV90b19tb2QoX2RtYSkgY29udGFpbmVyX29mKChfZG1hKSwgc3RydWN0IHJzbmRfbW9kLCBkbWEpCisjZGVmaW5lIHJzbmRfbW9kX3RvX2lvKG1vZCkgKChtb2QpLT5pbykKICNkZWZpbmUgcnNuZF9tb2RfaWQobW9kKSAoKG1vZCktPmlkKQotI2RlZmluZSBmb3JfZWFjaF9yc25kX21vZChwb3MsIG4sIGlvKQlcCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgJihpbyktPmhlYWQsIGxpc3QpCi0jZGVmaW5lIHJzbmRfbW9kX2NhbGwobW9kLCBmdW5jLCByZGFpLCBpbykJXAotCSghKG1vZCkgPyAtRU5PREVWIDoJCQlcCi0JICEoKG1vZCktPm9wcy0+ZnVuYykgPyAwIDoJCVwKLQkgKG1vZCktPm9wcy0+ZnVuYyhtb2QsIHJkYWksIGlvKSkKIAogdm9pZCByc25kX21vZF9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCiAJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkgICBzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHMsCisJCSAgIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlLAogCQkgICBpbnQgaWQpOwogY2hhciAqcnNuZF9tb2RfbmFtZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CiAKQEAgLTE2OCwxMyArMjE4LDE2IEBACiAgKi8KICNkZWZpbmUgUlNORF9EQUlfTkFNRV9TSVpFCTE2CiBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7IC8qIGhlYWQgb2YgcnNuZF9tb2QgbGlzdCAqLwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCByc25kX21vZCAqbW9kW1JTTkRfTU9EX01BWF07CisJc3RydWN0IHJzbmRfZGFpX3BhdGhfaW5mbyAqaW5mbzsgLyogcmNhcl9zbmQuaCAqLwogCWludCBieXRlX3BvczsKIAlpbnQgcGVyaW9kX3BvczsKIAlpbnQgYnl0ZV9wZXJfcGVyaW9kOwogCWludCBuZXh0X3BlcmlvZF9ieXRlOwogfTsKKyNkZWZpbmUgcnNuZF9pb190b19tb2Rfc3NpKGlvKQkoKGlvKS0+bW9kW1JTTkRfTU9EX1NTSV0pCisjZGVmaW5lIHJzbmRfaW9fdG9fbW9kX3NyYyhpbykJKChpbyktPm1vZFtSU05EX01PRF9TUkNdKQogCiBzdHJ1Y3QgcnNuZF9kYWkgewogCWNoYXIgbmFtZVtSU05EX0RBSV9OQU1FX1NJWkVdOwpAQCAtMTg5LDE2ICsyNDIsMTQgQEAKIAl1bnNpZ25lZCBpbnQgZGF0YV9hbGlnbm1lbnQ6MTsKIH07CiAKLSNkZWZpbmUgcnNuZF9kYWlfbnIocHJpdikgKChwcml2KS0+ZGFpX25yKQorI2RlZmluZSByc25kX3JkYWlfbnIocHJpdikgKChwcml2KS0+cmRhaV9ucikKICNkZWZpbmUgZm9yX2VhY2hfcnNuZF9kYWkocmRhaSwgcHJpdiwgaSkJCVwKLQlmb3IgKGkgPSAwLCAocmRhaSkgPSByc25kX2RhaV9nZXQocHJpdiwgaSk7CVwKLQkgICAgIGkgPCByc25kX2RhaV9ucihwcml2KTsJCQlcCi0JICAgICBpKyssIChyZGFpKSA9IHJzbmRfZGFpX2dldChwcml2LCBpKSkKKwlmb3IgKGkgPSAwOwkJCQkJXAorCSAgICAgKGkgPCByc25kX3JkYWlfbnIocHJpdikpICYmCQlcCisJICAgICAoKHJkYWkpID0gcnNuZF9kYWlfZ2V0KHByaXYsIGkpKTsJCVwKKwkgICAgIGkrKykKIAogc3RydWN0IHJzbmRfZGFpICpyc25kX2RhaV9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKLWludCByc25kX2RhaV9kaXNjb25uZWN0KHN0cnVjdCByc25kX21vZCAqbW9kKTsKLWludCByc25kX2RhaV9jb25uZWN0KHN0cnVjdCByc25kX2RhaSAqcmRhaSwgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCSAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pOwogaW50IHJzbmRfZGFpX2lzX3BsYXkoc3RydWN0IHJzbmRfZGFpICpyZGFpLCBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CiBpbnQgcnNuZF9kYWlfaWQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgc3RydWN0IHJzbmRfZGFpICpyZGFpKTsKICNkZWZpbmUgcnNuZF9kYWlfZ2V0X3BsYXRmb3JtX2luZm8ocmRhaSkgKChyZGFpKS0+aW5mbykKQEAgLTIwNiwyMSArMjU3LDE0IEBACiAKIHZvaWQgcnNuZF9kYWlfcG9pbnRlcl91cGRhdGUoc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sIGludCBjbnQpOwogaW50IHJzbmRfZGFpX3BvaW50ZXJfb2Zmc2V0KHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvLCBpbnQgYWRkaXRpb25hbCk7CisjZGVmaW5lIHJzbmRfZGFpX2lzX2Nsa19tYXN0ZXIocmRhaSkgKChyZGFpKS0+Y2xrX21hc3RlcikKIAogLyoKICAqCVItQ2FyIEdlbjEvR2VuMgogICovCiBpbnQgcnNuZF9nZW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOwotdm9pZCByc25kX2dlbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLWludCByc25kX2dlbl9wYXRoX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKLWludCByc25kX2dlbl9wYXRoX2V4aXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKIHZvaWQgX19pb21lbSAqcnNuZF9nZW5fcmVnX2dldChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJICAgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkJICAgICAgIGVudW0gcnNuZF9yZWcgcmVnKTsKQEAgLTIzMywxOCArMjc3LDI4IEBACiBpbnQgcnNuZF9hZGdfc3NpX2Nsa19zdG9wKHN0cnVjdCByc25kX21vZCAqbW9kKTsKIGludCByc25kX2FkZ19zc2lfY2xrX3RyeV9zdGFydChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwgdW5zaWduZWQgaW50IHJhdGUpOwogaW50IHJzbmRfYWRnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLXZvaWQgcnNuZF9hZGdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOwotaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2NsayhzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCSAgICAgdW5zaWduZWQgaW50IHNyY19yYXRlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZHN0X3JhdGUpOworaW50IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkgIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSk7CitpbnQgcnNuZF9hZGdfc2V0X2NvbnZlcnRfY2xrX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbywKKwkJCQkgIHVuc2lnbmVkIGludCBzcmNfcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCBkc3RfcmF0ZSk7CitpbnQgcnNuZF9hZGdfc2V0X2NvbnZlcnRfdGltaW5nX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyk7CiAKIC8qCiAgKglSLUNhciBzb3VuZCBwcml2CiAgKi8KK3N0cnVjdCByc25kX29mX2RhdGEgeworCXUzMiBmbGFnczsKK307CisKIHN0cnVjdCByc25kX3ByaXYgewogCiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtMjU3LDEwICszMTEsMTAgQEAKIAl2b2lkICpnZW47CiAKIAkvKgotCSAqIGJlbG93IHZhbHVlIHdpbGwgYmUgZmlsbGVkIG9uIHJzbmRfc2N1X3Byb2JlKCkKKwkgKiBiZWxvdyB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBvbiByc25kX3NyY19wcm9iZSgpCiAJICovCi0Jdm9pZCAqc2N1OwotCWludCBzY3VfbnI7CisJdm9pZCAqc3JjOworCWludCBzcmNfbnI7CiAKIAkvKgogCSAqIGJlbG93IHZhbHVlIHdpbGwgYmUgZmlsbGVkIG9uIHJzbmRfYWRnX3Byb2JlKCkKQEAgLTI3MCw0NiArMzI0LDY0IEBACiAJLyoKIAkgKiBiZWxvdyB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBvbiByc25kX3NzaV9wcm9iZSgpCiAJICovCi0Jdm9pZCAqc3NpdTsKKwl2b2lkICpzc2k7CisJaW50IHNzaV9ucjsKIAogCS8qCiAJICogYmVsb3cgdmFsdWUgd2lsbCBiZSBmaWxsZWQgb24gcnNuZF9kYWlfcHJvYmUoKQogCSAqLwogCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaWRydjsKIAlzdHJ1Y3QgcnNuZF9kYWkgKnJkYWk7Ci0JaW50IGRhaV9ucjsKKwlpbnQgcmRhaV9ucjsKIH07CiAKICNkZWZpbmUgcnNuZF9wcml2X3RvX2Rldihwcml2KQkoKHByaXYpLT5kZXYpCisjZGVmaW5lIHJzbmRfcHJpdl90b19pbmZvKHByaXYpCSgocHJpdiktPmluZm8pCiAjZGVmaW5lIHJzbmRfbG9jayhwcml2LCBmbGFncykgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKQogI2RlZmluZSByc25kX3VubG9jayhwcml2LCBmbGFncykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpCiAKLS8qCi0gKglSLUNhciBTQ1UKLSAqLwotaW50IHJzbmRfc2N1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLXZvaWQgcnNuZF9zY3VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7Ci1zdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc2N1X21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKLWJvb2wgcnNuZF9zY3VfaHBiaWZfaXNfZW5hYmxlKHN0cnVjdCByc25kX21vZCAqbW9kKTsKLXVuc2lnbmVkIGludCByc25kX3NjdV9nZXRfc3NpX3JhdGUoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgcnNuZF9tb2QgKnNzaV9tb2QsCi0JCQkJICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSk7CisjZGVmaW5lIHJzbmRfaW5mb19pc19wbGF5YmFjayhwcml2LCB0eXBlKQkJCQlcCisoewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOwkJXAorCWludCBpLCBpc19wbGF5ID0gMDsJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IGluZm8tPmRhaV9pbmZvX25yOyBpKyspIHsJCQlcCisJCWlmIChpbmZvLT5kYWlfaW5mb1tpXS5wbGF5YmFjay50eXBlID09ICh0eXBlKS0+aW5mbykgewlcCisJCQlpc19wbGF5ID0gMTsJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWlzX3BsYXk7CQkJCQkJCVwKK30pCiAKLSNkZWZpbmUgcnNuZF9zY3VfbnIocHJpdikgKChwcml2KS0+c2N1X25yKQorLyoKKyAqCVItQ2FyIFNSQworICovCitpbnQgcnNuZF9zcmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7CitzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3JjX21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKK3Vuc2lnbmVkIGludCByc25kX3NyY19nZXRfc3NpX3JhdGUoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbywKKwkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKTsKK2ludCByc25kX3NyY19zc2lfbW9kZV9pbml0KHN0cnVjdCByc25kX21vZCAqc3NpX21vZCwKKwkJCSAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKK2ludCByc25kX3NyY19lbmFibGVfc3NpX2lycShzdHJ1Y3QgcnNuZF9tb2QgKnNzaV9tb2QsCisJCQkgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKTsKKworI2RlZmluZSByc25kX3NyY19ucihwcml2KSAoKHByaXYpLT5zcmNfbnIpCiAKIC8qCiAgKglSLUNhciBTU0kKICAqLwogaW50IHJzbmRfc3NpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKLXZvaWQgcnNuZF9zc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpOwogc3RydWN0IHJzbmRfbW9kICpyc25kX3NzaV9tb2RfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCk7CiBzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3NpX21vZF9nZXRfZnJtX2RhaShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJCQkgIGludCBkYWlfaWQsIGludCBpc19wbGF5KTsKK2ludCByc25kX3NzaV9pc19waW5fc2hhcmluZyhzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CitpbnQgcnNuZF9zc2lfaXNfcGxheShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc2N1LmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zY3UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiMDhiYi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9zY3UuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogUmVuZXNhcyBSLUNhciBTQ1Ugc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgotICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlICJyc25kLmgiCi0KLXN0cnVjdCByc25kX3NjdSB7Ci0Jc3RydWN0IHJzbmRfc2N1X3BsYXRmb3JtX2luZm8gKmluZm87IC8qIHJjYXJfc25kLmggKi8KLQlzdHJ1Y3QgcnNuZF9tb2QgbW9kOwotCXN0cnVjdCBjbGsgKmNsazsKLX07Ci0KLSNkZWZpbmUgcnNuZF9zY3VfbW9kZV9mbGFncyhwKSAoKHApLT5pbmZvLT5mbGFncykKLSNkZWZpbmUgcnNuZF9zY3VfY29udmVydF9yYXRlKHApICgocCktPmluZm8tPmNvbnZlcnRfcmF0ZSkKLQotI2RlZmluZSBSU05EX1NDVV9OQU1FX1NJWkUgMTYKLQotLyoKLSAqIEFESU5SCi0gKi8KLSNkZWZpbmUgT1RCTF8yNAkJKDAgPDwgMTYpCi0jZGVmaW5lIE9UQkxfMjIJCSgyIDw8IDE2KQotI2RlZmluZSBPVEJMXzIwCQkoNCA8PCAxNikKLSNkZWZpbmUgT1RCTF8xOAkJKDYgPDwgMTYpCi0jZGVmaW5lIE9UQkxfMTYJCSg4IDw8IDE2KQotCi0vKgotICoJCWltYWdlIG9mIFNSQyAoU2FtcGxpbmcgUmF0ZSBDb252ZXJ0ZXIpCi0gKgotICogOTZrSHogICA8LT4gKy0tLS0tKwk0OGtIegkrLS0tLS0rCSA0OGtIegkrLS0tLS0tLSsKLSAqIDQ4a0h6ICAgPC0+IHwgU1JDIHwgPC0tLS0tLT4JfCBTU0kgfAk8LS0tLS0+CXwgY29kZWMgfAotICogNDQuMWtIeiA8LT4gKy0tLS0tKwkJKy0tLS0tKwkJKy0tLS0tLS0rCi0gKiAuLi4KLSAqCi0gKi8KLQotI2RlZmluZSByc25kX21vZF90b19zY3UoX21vZCkJXAotCWNvbnRhaW5lcl9vZigoX21vZCksIHN0cnVjdCByc25kX3NjdSwgbW9kKQotCi0jZGVmaW5lIGZvcl9lYWNoX3JzbmRfc2N1KHBvcywgcHJpdiwgaSkJCQkJCVwKLQlmb3IgKChpKSA9IDA7CQkJCQkJCVwKLQkgICAgICgoaSkgPCByc25kX3NjdV9ucihwcml2KSkgJiYJCQkJXAotCQkgICAgICgocG9zKSA9IChzdHJ1Y3QgcnNuZF9zY3UgKikocHJpdiktPnNjdSArIGkpOwlcCi0JICAgICBpKyspCi0KLS8qIEdlbjEgb25seSAqLwotc3RhdGljIGludCByc25kX3NyY19zZXRfcm91dGVfaWZfZ2VuMShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3Qgc2N1X3JvdXRlX2NvbmZpZyB7Ci0JCXUzMiBtYXNrOwotCQlpbnQgc2hpZnQ7Ci0JfSByb3V0ZXNbXSA9IHsKLQkJeyAweEYsICAwLCB9LCAvKiAwICovCi0JCXsgMHhGLCAgNCwgfSwgLyogMSAqLwotCQl7IDB4RiwgIDgsIH0sIC8qIDIgKi8KLQkJeyAweDcsIDEyLCB9LCAvKiAzICovCi0JCXsgMHg3LCAxNiwgfSwgLyogNCAqLwotCQl7IDB4NywgMjAsIH0sIC8qIDUgKi8KLQkJeyAweDcsIDI0LCB9LCAvKiA2ICovCi0JCXsgMHgzLCAyOCwgfSwgLyogNyAqLwotCQl7IDB4MywgMzAsIH0sIC8qIDggKi8KLQl9OwotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0JdTMyIG1hc2s7Ci0JdTMyIHZhbDsKLQlpbnQgc2hpZnQ7Ci0JaW50IGlkOwotCi0JLyoKLQkgKiBHZW4xIG9ubHkKLQkgKi8KLQlpZiAoIXJzbmRfaXNfZ2VuMShwcml2KSkKLQkJcmV0dXJuIDA7Ci0KLQlpZCA9IHJzbmRfbW9kX2lkKG1vZCk7Ci0JaWYgKGlkIDwgMCB8fCBpZCA+PSBBUlJBWV9TSVpFKHJvdXRlcykpCi0JCXJldHVybiAtRUlPOwotCi0JLyoKLQkgKiBTUkNfUk9VVEVfU0VMRUNUCi0JICovCi0JdmFsID0gcnNuZF9kYWlfaXNfcGxheShyZGFpLCBpbykgPyAweDEgOiAweDI7Ci0JdmFsID0gdmFsCQk8PCByb3V0ZXNbaWRdLnNoaWZ0OwotCW1hc2sgPSByb3V0ZXNbaWRdLm1hc2sJPDwgcm91dGVzW2lkXS5zaGlmdDsKLQotCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfUk9VVEVfU0VMLCBtYXNrLCB2YWwpOwotCi0JLyoKLQkgKiBTUkNfVElNSU5HX1NFTEVDVAotCSAqLwotCXNoaWZ0CT0gKGlkICUgNCkgKiA4OwotCW1hc2sJPSAweDFGIDw8IHNoaWZ0OwotCi0JLyoKLQkgKiBBREcgaXMgdXNlZCBhcyBzb3VyY2UgY2xvY2sgaWYgU1JDIHdhcyB1c2VkLAotCSAqIHRoZW4sIFNTSSBXUyBpcyB1c2VkIGFzIGRlc3RpbmF0aW9uIGNsb2NrLgotCSAqIFNTSSBXUyBpcyB1c2VkIGFzIHNvdXJjZSBjbG9jayBpZiBTUkMgaXMgbm90IHVzZWQKLQkgKiAod2hlbiBwbGF5YmFjaywgc291cmNlL2Rlc3RpbmF0aW9uIGJlY29tZSByZXZlcnNlIHdoZW4gY2FwdHVyZSkKLQkgKi8KLQlpZiAocnNuZF9zY3VfY29udmVydF9yYXRlKHNjdSkpCS8qIHVzZSBBREcgKi8KLQkJdmFsID0gMDsKLQllbHNlIGlmICg4ID09IGlkKQkJLyogdXNlIFNTSSBXUywgYnV0IFNSVTggaXMgc3BlY2lhbCAqLwotCQl2YWwgPSBpZCA8PCBzaGlmdDsKLQllbHNlCQkJCS8qIHVzZSBTU0kgV1MgKi8KLQkJdmFsID0gKGlkICsgMSkgPDwgc2hpZnQ7Ci0KLQlzd2l0Y2ggKGlkIC8gNCkgewotCWNhc2UgMDoKLQkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19UTUdfU0VMMCwgbWFzaywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1RNR19TRUwxLCBtYXNrLCB2YWwpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfVE1HX1NFTDIsIG1hc2ssIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBpbnQgcnNuZF9zY3VfZ2V0X3NzaV9yYXRlKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAotCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCi17Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3U7Ci0JdW5zaWduZWQgaW50IHJhdGU7Ci0KLQkvKiB0aGlzIGZ1bmN0aW9uIGlzIGFzc3VtaW5nIFNTSSBpZCA9IFNDVSBpZCBoZXJlICovCi0Jc2N1ID0gcnNuZF9tb2RfdG9fc2N1KHJzbmRfc2N1X21vZF9nZXQocHJpdiwgcnNuZF9tb2RfaWQoc3NpX21vZCkpKTsKLQotCS8qCi0JICogcmV0dXJuIGNvbnZlcnQgcmF0ZSBpZiBTUkMgaXMgdXNlZCwKLQkgKiBvdGhlcndpc2UsIHJldHVybiBydW50aW1lLT5yYXRlIGFzIHVzdWFsCi0JICovCi0JcmF0ZSA9IHJzbmRfc2N1X2NvbnZlcnRfcmF0ZShzY3UpOwotCWlmICghcmF0ZSkKLQkJcmF0ZSA9IHJ1bnRpbWUtPnJhdGU7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIGludCByc25kX3NjdV9jb252ZXJ0X3JhdGVfY3RybChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKLQlzdHJ1Y3QgcnNuZF9zY3UgKnNjdSA9IHJzbmRfbW9kX3RvX3NjdShtb2QpOwotCXUzMiBjb252ZXJ0X3JhdGUgPSByc25kX3NjdV9jb252ZXJ0X3JhdGUoc2N1KTsKLQl1MzIgYWRpbnIgPSBydW50aW1lLT5jaGFubmVsczsKLQotCS8qIHNldC9jbGVhciBzb2Z0IHJlc2V0ICovCi0JcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1dSU1IsIDApOwotCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NXUlNSLCAxKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIG9wZXJhdGlvbiBvZiB0aGUgU1JDIGludGVybmFsIGNpcmN1aXRzICovCi0JcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1JDSVIsIDEpOwotCi0JLyogU2V0IGNoYW5uZWwgbnVtYmVyIGFuZCBvdXRwdXQgYml0IGxlbmd0aCAqLwotCXN3aXRjaCAocnVudGltZS0+c2FtcGxlX2JpdHMpIHsKLQljYXNlIDE2OgotCQlhZGluciB8PSBPVEJMXzE2OwotCQlicmVhazsKLQljYXNlIDMyOgotCQlhZGluciB8PSBPVEJMXzI0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQURJTlIsIGFkaW5yKTsKLQotCWlmIChjb252ZXJ0X3JhdGUpIHsKLQkJdTMyIGZzcmF0ZSA9IDB4MDQwMDAwMCAvIGNvbnZlcnRfcmF0ZSAqIHJ1bnRpbWUtPnJhdGU7Ci0JCWludCByZXQ7Ci0KLQkJLyogRW5hYmxlIHRoZSBpbml0aWFsIHZhbHVlIG9mIElGUyAqLwotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19JRlNDUiwgMSk7Ci0KLQkJLyogU2V0IGluaXRpYWwgdmFsdWUgb2YgSUZTICovCi0JCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0lGU1ZSLCBmc3JhdGUpOwotCi0JCS8qIFNlbGVjdCBTUkMgbW9kZSAoZml4ZWQgdmFsdWUpICovCi0JCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0NSLCAweDAwMDEwMTEwKTsKLQotCQkvKiBTZXQgdGhlIHJlc3RyaWN0aW9uIHZhbHVlIG9mIHRoZSBGUyByYXRpbyAoOTglKSAqLwotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19NTkZTUiwgZnNyYXRlIC8gMTAwICogOTgpOwotCi0JCWlmIChyc25kX2lzX2dlbjEocHJpdikpIHsKLQkJCS8qIG5vIFNSQ19CRlNTUiBzZXR0aW5ncywgc2luY2UgU1JDX1NSQ0NSOjpCVUZNRCBpcyAwICovCi0JCX0KLQotCQkvKiBzZXQgY29udmVydCBjbG9jayAqLwotCQlyZXQgPSByc25kX2FkZ19zZXRfY29udmVydF9jbGsocHJpdiwgbW9kLAotCQkJCQkgICAgICAgcnVudGltZS0+cmF0ZSwKLQkJCQkJICAgICAgIGNvbnZlcnRfcmF0ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBDYW5jZWwgdGhlIGluaXRpYWxpemF0aW9uIGFuZCBvcGVyYXRlIHRoZSBTUkMgZnVuY3Rpb24gKi8KLQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNJUiwgMCk7Ci0KLQkvKiB1c2UgRE1BIHRyYW5zZmVyICovCi0JcnNuZF9tb2Rfd3JpdGUobW9kLCBCVVNJRl9NT0RFLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJzbmRfc2N1X3RyYW5zZmVyX3N0YXJ0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkJICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJCSAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0JaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKLQl1MzIgdmFsOwotCi0JaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkgewotCQl2YWwgPSAoMSA8PCBpZCk7Ci0JCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfUk9VVEVfQ1RSTCwgdmFsLCB2YWwpOwotCX0KLQotCWlmIChyc25kX3NjdV9jb252ZXJ0X3JhdGUoc2N1KSkKLQkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfUk9VVEVfTU9ERTAsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNuZF9zY3VfdHJhbnNmZXJfc3RvcChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9zY3UgKnNjdSA9IHJzbmRfbW9kX3RvX3NjdShtb2QpOwotCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7Ci0JdTMyIG1hc2s7Ci0KLQlpZiAocnNuZF9pc19nZW4xKHByaXYpKSB7Ci0JCW1hc2sgPSAoMSA8PCBpZCk7Ci0JCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfUk9VVEVfQ1RSTCwgbWFzaywgMCk7Ci0JfQotCi0JaWYgKHJzbmRfc2N1X2NvbnZlcnRfcmF0ZShzY3UpKQotCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19ST1VURV9NT0RFMCwgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotYm9vbCByc25kX3NjdV9ocGJpZl9pc19lbmFibGUoc3RydWN0IHJzbmRfbW9kICptb2QpCi17Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3UgPSByc25kX21vZF90b19zY3UobW9kKTsKLQl1MzIgZmxhZ3MgPSByc25kX3NjdV9tb2RlX2ZsYWdzKHNjdSk7Ci0KLQlyZXR1cm4gISEoZmxhZ3MgJiBSU05EX1NDVV9VU0VfSFBCSUYpOwotfQotCi1zdGF0aWMgaW50IHJzbmRfc2N1X3N0YXJ0KHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCi0JCQkgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3UgPSByc25kX21vZF90b19zY3UobW9kKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwotCWludCByZXQ7Ci0KLQkvKgotCSAqIFNDVSB3aWxsIGJlIHVzZWQgaWYgaXQgaGFzIFJTTkRfU0NVX1VTRV9IUEJJRiBmbGFncwotCSAqLwotCWlmICghcnNuZF9zY3VfaHBiaWZfaXNfZW5hYmxlKG1vZCkpIHsKLQkJLyogaXQgdXNlIFBJTyB0cmFuc3RlciAqLwotCQlkZXZfZGJnKGRldiwgIiVzJWQgaXMgbm90IHVzZWRcbiIsCi0JCQlyc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCi0JCXJldHVybiAwOwotCX0KLQotCWNsa19lbmFibGUoc2N1LT5jbGspOwotCi0JLyogaXQgdXNlIERNQSB0cmFuc3RlciAqLwotCi0JcmV0ID0gcnNuZF9zcmNfc2V0X3JvdXRlX2lmX2dlbjEocHJpdiwgbW9kLCByZGFpLCBpbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSByc25kX3NjdV9jb252ZXJ0X3JhdGVfY3RybChwcml2LCBtb2QsIHJkYWksIGlvKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJzbmRfc2N1X3RyYW5zZmVyX3N0YXJ0KHByaXYsIG1vZCwgcmRhaSwgaW8pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2X2RiZyhkZXYsICIlcyVkIHN0YXJ0XG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNuZF9zY3Vfc3RvcChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCSAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAotCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKLXsKLQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCByc25kX3NjdSAqc2N1ID0gcnNuZF9tb2RfdG9fc2N1KG1vZCk7Ci0KLQlpZiAoIXJzbmRfc2N1X2hwYmlmX2lzX2VuYWJsZShtb2QpKQotCQlyZXR1cm4gMDsKLQotCXJzbmRfc2N1X3RyYW5zZmVyX3N0b3AocHJpdiwgbW9kLCByZGFpLCBpbyk7Ci0KLQljbGtfZGlzYWJsZShzY3UtPmNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zY3Vfb3BzID0gewotCS5uYW1lCT0gInNjdSIsCi0JLnN0YXJ0CT0gcnNuZF9zY3Vfc3RhcnQsCi0JLnN0b3AJPSByc25kX3NjdV9zdG9wLAotfTsKLQotc3RydWN0IHJzbmRfbW9kICpyc25kX3NjdV9tb2RfZ2V0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCBpZCkKLXsKLQlpZiAoV0FSTl9PTihpZCA8IDAgfHwgaWQgPj0gcnNuZF9zY3VfbnIocHJpdikpKQotCQlpZCA9IDA7Ci0KLQlyZXR1cm4gJigoc3RydWN0IHJzbmRfc2N1ICopKHByaXYtPnNjdSkgKyBpZCktPm1vZDsKLX0KLQotaW50IHJzbmRfc2N1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCSAgIHN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHJzbmRfc2N1ICpzY3U7Ci0Jc3RydWN0IGNsayAqY2xrOwotCWNoYXIgbmFtZVtSU05EX1NDVV9OQU1FX1NJWkVdOwotCWludCBpLCBucjsKLQotCS8qCi0JICogaW5pdCBTQ1UKLQkgKi8KLQlucgk9IGluZm8tPnNjdV9pbmZvX25yOwotCXNjdQk9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc2N1KSAqIG5yLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNjdSkgewotCQlkZXZfZXJyKGRldiwgIlNDVSBhbGxvY2F0ZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwcml2LT5zY3VfbnIJPSBucjsKLQlwcml2LT5zY3UJPSBzY3U7Ci0KLQlmb3JfZWFjaF9yc25kX3NjdShzY3UsIHByaXYsIGkpIHsKLQkJc25wcmludGYobmFtZSwgUlNORF9TQ1VfTkFNRV9TSVpFLCAic2N1LiVkIiwgaSk7Ci0KLQkJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgbmFtZSk7Ci0JCWlmIChJU19FUlIoY2xrKSkKLQkJCXJldHVybiBQVFJfRVJSKGNsayk7Ci0KLQkJcnNuZF9tb2RfaW5pdChwcml2LCAmc2N1LT5tb2QsCi0JCQkgICAgICAmcnNuZF9zY3Vfb3BzLCBpKTsKLQkJc2N1LT5pbmZvID0gJmluZm8tPnNjdV9pbmZvW2ldOwotCQlzY3UtPmNsayA9IGNsazsKLQotCQlkZXZfZGJnKGRldiwgIlNDVSVkIHByb2JlZFxuIiwgaSk7Ci0JfQotCWRldl9kYmcoZGV2LCAic2N1IHByb2JlZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByc25kX3NjdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQotewotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc3JjLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMyYjdkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NoL3JjYXIvc3JjLmMKQEAgLTAsMCArMSw3MjcgQEAKKy8qCisgKiBSZW5lc2FzIFItQ2FyIFNSQyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgInJzbmQuaCIKKworc3RydWN0IHJzbmRfc3JjIHsKKwlzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyAqaW5mbzsgLyogcmNhcl9zbmQuaCAqLworCXN0cnVjdCByc25kX21vZCBtb2Q7CisJc3RydWN0IGNsayAqY2xrOworfTsKKworI2RlZmluZSBSU05EX1NSQ19OQU1FX1NJWkUgMTYKKworLyoKKyAqIEFESU5SCisgKi8KKyNkZWZpbmUgT1RCTF8yNAkJKDAgPDwgMTYpCisjZGVmaW5lIE9UQkxfMjIJCSgyIDw8IDE2KQorI2RlZmluZSBPVEJMXzIwCQkoNCA8PCAxNikKKyNkZWZpbmUgT1RCTF8xOAkJKDYgPDwgMTYpCisjZGVmaW5lIE9UQkxfMTYJCSg4IDw8IDE2KQorCisjZGVmaW5lIHJzbmRfc3JjX21vZGVfZmxhZ3MocCkgKChwKS0+aW5mby0+ZmxhZ3MpCisjZGVmaW5lIHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShwKSAoKHApLT5pbmZvLT5jb252ZXJ0X3JhdGUpCisjZGVmaW5lIHJzbmRfbW9kX3RvX3NyYyhfbW9kKQkJCQlcCisJY29udGFpbmVyX29mKChfbW9kKSwgc3RydWN0IHJzbmRfc3JjLCBtb2QpCisjZGVmaW5lIHJzbmRfc3JjX2hwYmlmX2lzX2VuYWJsZShzcmMpCVwKKwkocnNuZF9zcmNfbW9kZV9mbGFncyhzcmMpICYgUlNORF9TQ1VfVVNFX0hQQklGKQorI2RlZmluZSByc25kX3NyY19kbWFfYXZhaWxhYmxlKHNyYykgXAorCXJzbmRfZG1hX2F2YWlsYWJsZShyc25kX21vZF90b19kbWEoJihzcmMpLT5tb2QpKQorCisjZGVmaW5lIGZvcl9lYWNoX3JzbmRfc3JjKHBvcywgcHJpdiwgaSkJCQkJXAorCWZvciAoKGkpID0gMDsJCQkJCQlcCisJICAgICAoKGkpIDwgcnNuZF9zcmNfbnIocHJpdikpICYmCQkJXAorCSAgICAgKChwb3MpID0gKHN0cnVjdCByc25kX3NyYyAqKShwcml2KS0+c3JjICsgaSk7CVwKKwkgICAgIGkrKykKKworCisvKgorICoJCWltYWdlIG9mIFNSQyAoU2FtcGxpbmcgUmF0ZSBDb252ZXJ0ZXIpCisgKgorICogOTZrSHogICA8LT4gKy0tLS0tKwk0OGtIegkrLS0tLS0rCSA0OGtIegkrLS0tLS0tLSsKKyAqIDQ4a0h6ICAgPC0+IHwgU1JDIHwgPC0tLS0tLT4JfCBTU0kgfAk8LS0tLS0+CXwgY29kZWMgfAorICogNDQuMWtIeiA8LT4gKy0tLS0tKwkJKy0tLS0tKwkJKy0tLS0tLS0rCisgKiAuLi4KKyAqCisgKi8KKworLyoKKyAqIHNyYy5jIGlzIGNhcmluZy4uLgorICoKKyAqIEdlbjEKKyAqCisgKiBbbWVtXSAtPiBbU1JVXSAtPiBbU1NJXQorICogICAgICAgIHwtLS0tLS0tLXwKKyAqCisgKiBHZW4yCisgKgorICogW21lbV0gLT4gW1NSQ10gLT4gW1NTSVVdIC0+IFtTU0ldCisgKiAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfAorICovCisKKy8qCisgKglIb3cgdG8gdXNlIFNSQyBieXBhc3MgbW9kZSBmb3IgZGVidWdnaW5nCisgKgorICogU1JDIGhhcyBieXBhc3MgbW9kZSwgYW5kIGl0IGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgorICogSW4gR2VuMiBjYXNlLAorICogU1JDbV9NT0RFIGNvbnRyb2xzIHdoZXRoZXIgU1JDIGlzIHVzZWQgb3Igbm90CisgKiBTU0lfTU9ERTAgY29udHJvbHMgd2hldGhlciBTU0lVIHdoaWNoIHJlY2VpdmVzIFNSQyBkYXRhCisgKiBpcyB1c2VkIG9yIG5vdC4KKyAqIEJvdGggU1JDbV9NT0RFL1NTSV9NT0RFMCBzZXR0aW5ncyBhcmUgbmVlZGVkIGlmIHlvdSB1c2UgU1JDLAorICogYnV0IFNSQyBieXBhc3MgbW9kZSBuZWVkcyBTU0lfTU9ERTAgb25seS4KKyAqCisgKiBUaGlzIGRyaXZlciByZXF1ZXN0CisgKiBzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyB7CisgKgl1MzIgZmxhZ3M7CisgKgl1MzIgY29udmVydF9yYXRlOworICogfQorICoKKyAqIHJzbmRfc3JjX2hwYmlmX2lzX2VuYWJsZSgpIHdpbGwgYmUgdHJ1ZQorICogaWYgZmxhZ3MgaGFkIFJTTkRfU1JDX1VTRV9IUEJJRiwKKyAqIGFuZCBpdCBjb250cm9scyB3aGV0aGVyIFNTSVUgaXMgdXNlZCBvciBub3QuCisgKgorICogcnNuZF9zcmNfY29udmVydF9yYXRlKCkgaW5kaWNhdGVzCisgKiBhYm92ZSBjb252ZXJ0X3JhdGUsIGFuZCBpdCBjb250cm9scworICogd2hldGhlciBTUkMgaXMgdXNlZCBvciBub3QuCisgKgorICogZXgpIGRvZXNuJ3QgdXNlIFNSQworICogc3RydWN0IHJzbmRfc3JjX3BsYXRmb3JtX2luZm8gaW5mbyA9IHsKKyAqCS5mbGFncyA9IDAsCisgKgkuY29udmVydF9yYXRlID0gMCwKKyAqIH07CisgKgorICogZXgpIHVzZXMgU1JDCisgKiBzdHJ1Y3QgcnNuZF9zcmNfcGxhdGZvcm1faW5mbyBpbmZvID0geworICoJLmZsYWdzID0gUlNORF9TUkNfVVNFX0hQQklGLAorICoJLmNvbnZlcnRfcmF0ZSA9IDQ4MDAwLAorICogfTsKKyAqCisgKiBleCkgdXNlcyBTUkMgYnlwYXNzIG1vZGUKKyAqIHN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvIGluZm8gPSB7CisgKgkuZmxhZ3MgPSBSU05EX1NSQ19VU0VfSFBCSUYsCisgKgkuY29udmVydF9yYXRlID0gMCwKKyAqIH07CisgKgorICovCisKKy8qCisgKgkJR2VuMS9HZW4yIGNvbW1vbiBmdW5jdGlvbnMKKyAqLworaW50IHJzbmRfc3JjX3NzaV9tb2RlX2luaXQoc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAorCQkJICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYoc3NpX21vZCk7CisJc3RydWN0IHJzbmRfbW9kICpzcmNfbW9kID0gcnNuZF9pb190b19tb2Rfc3JjKGlvKTsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCWludCBzc2lfaWQgPSByc25kX21vZF9pZChzc2lfbW9kKTsKKwlpbnQgaGFzX3NyYyA9IDA7CisKKwkvKgorCSAqIFNTSV9NT0RFMAorCSAqLworCWlmIChpbmZvLT5kYWlfaW5mbykgeworCQloYXNfc3JjID0gISFzcmNfbW9kOworCX0gZWxzZSB7CisJCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKHNyY19tb2QpOworCQloYXNfc3JjID0gcnNuZF9zcmNfaHBiaWZfaXNfZW5hYmxlKHNyYyk7CisJfQorCisJcnNuZF9tb2RfYnNldChzc2lfbW9kLCBTU0lfTU9ERTAsICgxIDw8IHNzaV9pZCksCisJCSAgICAgIGhhc19zcmMgPyAwIDogKDEgPDwgc3NpX2lkKSk7CisKKwkvKgorCSAqIFNTSV9NT0RFMQorCSAqLworCWlmIChyc25kX3NzaV9pc19waW5fc2hhcmluZyhzc2lfbW9kKSkgeworCQlpbnQgc2hpZnQgPSAtMTsKKwkJc3dpdGNoIChzc2lfaWQpIHsKKwkJY2FzZSAxOgorCQkJc2hpZnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXNoaWZ0ID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlzaGlmdCA9IDE2OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2hpZnQgPj0gMCkKKwkJCXJzbmRfbW9kX2JzZXQoc3NpX21vZCwgU1NJX01PREUxLAorCQkJCSAgICAgIDB4MyA8PCBzaGlmdCwKKwkJCQkgICAgICByc25kX2RhaV9pc19jbGtfbWFzdGVyKHJkYWkpID8KKwkJCQkgICAgICAweDIgPDwgc2hpZnQgOiAweDEgPDwgc2hpZnQpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnNuZF9zcmNfZW5hYmxlX3NzaV9pcnEoc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAorCQkJICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihzc2lfbW9kKTsKKworCS8qIGVuYWJsZSBQSU8gaW50ZXJydXB0IGlmIEdlbjIgKi8KKwlpZiAocnNuZF9pc19nZW4yKHByaXYpKQorCQlyc25kX21vZF93cml0ZShzc2lfbW9kLCBJTlRfRU5BQkxFLCAweDBmMDAwMDAwKTsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgcnNuZF9zcmNfZ2V0X3NzaV9yYXRlKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCQkJICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8sCisJCQkJICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlzdHJ1Y3QgcnNuZF9tb2QgKnNyY19tb2QgPSByc25kX2lvX3RvX21vZF9zcmMoaW8pOworCXN0cnVjdCByc25kX3NyYyAqc3JjOworCXVuc2lnbmVkIGludCByYXRlID0gMDsKKworCWlmIChzcmNfbW9kKSB7CisJCXNyYyA9IHJzbmRfbW9kX3RvX3NyYyhzcmNfbW9kKTsKKworCQkvKgorCQkgKiByZXR1cm4gY29udmVydCByYXRlIGlmIFNSQyBpcyB1c2VkLAorCQkgKiBvdGhlcndpc2UsIHJldHVybiBydW50aW1lLT5yYXRlIGFzIHVzdWFsCisJCSAqLworCQlyYXRlID0gcnNuZF9zcmNfY29udmVydF9yYXRlKHNyYyk7CisJfQorCisJaWYgKCFyYXRlKQorCQlyYXRlID0gcnVudGltZS0+cmF0ZTsKKworCXJldHVybiByYXRlOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGUoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCXUzMiBjb252ZXJ0X3JhdGUgPSByc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKTsKKwl1MzIgYWRpbnIgPSBydW50aW1lLT5jaGFubmVsczsKKwl1MzIgZnNyYXRlID0gMDsKKworCWlmIChjb252ZXJ0X3JhdGUpCisJCWZzcmF0ZSA9IDB4MDQwMDAwMCAvIGNvbnZlcnRfcmF0ZSAqIHJ1bnRpbWUtPnJhdGU7CisKKwkvKiBzZXQvY2xlYXIgc29mdCByZXNldCAqLworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NXUlNSLCAwKTsKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TV1JTUiwgMSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIG9wZXJhdGlvbiBvZiB0aGUgU1JDIGludGVybmFsIGNpcmN1aXRzCisJICogc2VlIHJzbmRfc3JjX3N0YXJ0KCkKKwkgKi8KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNJUiwgMSk7CisKKwkvKiBTZXQgY2hhbm5lbCBudW1iZXIgYW5kIG91dHB1dCBiaXQgbGVuZ3RoICovCisJc3dpdGNoIChydW50aW1lLT5zYW1wbGVfYml0cykgeworCWNhc2UgMTY6CisJCWFkaW5yIHw9IE9UQkxfMTY7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWFkaW5yIHw9IE9UQkxfMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlPOworCX0KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19BRElOUiwgYWRpbnIpOworCisJLyogRW5hYmxlIHRoZSBpbml0aWFsIHZhbHVlIG9mIElGUyAqLworCWlmIChmc3JhdGUpIHsKKwkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfSUZTQ1IsIDEpOworCisJCS8qIFNldCBpbml0aWFsIHZhbHVlIG9mIElGUyAqLworCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19JRlNWUiwgZnNyYXRlKTsKKwl9CisKKwkvKiB1c2UgRE1BIHRyYW5zZmVyICovCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQlVTSUZfTU9ERSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19pbml0KHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCisJY2xrX2VuYWJsZShzcmMtPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19xdWl0KHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCisJY2xrX2Rpc2FibGUoc3JjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RhcnQoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCS8qCisJICogQ2FuY2VsIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgb3BlcmF0ZSB0aGUgU1JDIGZ1bmN0aW9uCisJICogc2VlIHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGUoKQorCSAqLworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0lSLCAwKTsKKworCWlmIChyc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKSkKKwkJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfUk9VVEVfTU9ERTAsIDEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByc25kX3NyY19zdG9wKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCisJaWYgKHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShzcmMpKQorCQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19ST1VURV9NT0RFMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zcmNfbm9uX29wcyA9IHsKKwkubmFtZQk9ICJzcmMgKG5vbikiLAorfTsKKworLyoKKyAqCQlHZW4xIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9yb3V0ZV9nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCSAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3Qgc3JjX3JvdXRlX2NvbmZpZyB7CisJCXUzMiBtYXNrOworCQlpbnQgc2hpZnQ7CisJfSByb3V0ZXNbXSA9IHsKKwkJeyAweEYsICAwLCB9LCAvKiAwICovCisJCXsgMHhGLCAgNCwgfSwgLyogMSAqLworCQl7IDB4RiwgIDgsIH0sIC8qIDIgKi8KKwkJeyAweDcsIDEyLCB9LCAvKiAzICovCisJCXsgMHg3LCAxNiwgfSwgLyogNCAqLworCQl7IDB4NywgMjAsIH0sIC8qIDUgKi8KKwkJeyAweDcsIDI0LCB9LCAvKiA2ICovCisJCXsgMHgzLCAyOCwgfSwgLyogNyAqLworCQl7IDB4MywgMzAsIH0sIC8qIDggKi8KKwl9OworCXUzMiBtYXNrOworCXUzMiB2YWw7CisJaW50IGlkOworCisJaWQgPSByc25kX21vZF9pZChtb2QpOworCWlmIChpZCA8IDAgfHwgaWQgPj0gQVJSQVlfU0laRShyb3V0ZXMpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qCisJICogU1JDX1JPVVRFX1NFTEVDVAorCSAqLworCXZhbCA9IHJzbmRfZGFpX2lzX3BsYXkocmRhaSwgaW8pID8gMHgxIDogMHgyOworCXZhbCA9IHZhbAkJPDwgcm91dGVzW2lkXS5zaGlmdDsKKwltYXNrID0gcm91dGVzW2lkXS5tYXNrCTw8IHJvdXRlc1tpZF0uc2hpZnQ7CisKKwlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1JPVVRFX1NFTCwgbWFzaywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9jb252ZXJ0X3RpbWluZ19nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCQkgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCQkgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXUzMiBjb252ZXJ0X3JhdGUgPSByc25kX3NyY19jb252ZXJ0X3JhdGUoc3JjKTsKKwl1MzIgbWFzazsKKwl1MzIgdmFsOworCWludCBzaGlmdDsKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCWludCByZXQ7CisKKwkvKgorCSAqIFNSQ19USU1JTkdfU0VMRUNUCisJICovCisJc2hpZnQJPSAoaWQgJSA0KSAqIDg7CisJbWFzawk9IDB4MUYgPDwgc2hpZnQ7CisKKwkvKgorCSAqIEFERyBpcyB1c2VkIGFzIHNvdXJjZSBjbG9jayBpZiBTUkMgd2FzIHVzZWQsCisJICogdGhlbiwgU1NJIFdTIGlzIHVzZWQgYXMgZGVzdGluYXRpb24gY2xvY2suCisJICogU1NJIFdTIGlzIHVzZWQgYXMgc291cmNlIGNsb2NrIGlmIFNSQyBpcyBub3QgdXNlZAorCSAqICh3aGVuIHBsYXliYWNrLCBzb3VyY2UvZGVzdGluYXRpb24gYmVjb21lIHJldmVyc2Ugd2hlbiBjYXB0dXJlKQorCSAqLworCXJldCA9IDA7CisJaWYgKGNvbnZlcnRfcmF0ZSkgeworCQkvKiB1c2UgQURHICovCisJCXZhbCA9IDA7CisJCXJldCA9IHJzbmRfYWRnX3NldF9jb252ZXJ0X2Nsa19nZW4xKHByaXYsIG1vZCwKKwkJCQkJCSAgICBydW50aW1lLT5yYXRlLAorCQkJCQkJICAgIGNvbnZlcnRfcmF0ZSk7CisJfSBlbHNlIGlmICg4ID09IGlkKSB7CisJCS8qIHVzZSBTU0kgV1MsIGJ1dCBTUlU4IGlzIHNwZWNpYWwgKi8KKwkJdmFsID0gaWQgPDwgc2hpZnQ7CisJfSBlbHNlIHsKKwkJLyogdXNlIFNTSSBXUyAqLworCQl2YWwgPSAoaWQgKyAxKSA8PCBzaGlmdDsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoaWQgLyA0KSB7CisJY2FzZSAwOgorCQlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1RNR19TRUwwLCBtYXNrLCB2YWwpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJzbmRfbW9kX2JzZXQobW9kLCBTUkNfVE1HX1NFTDEsIG1hc2ssIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19UTUdfU0VMMiwgbWFzaywgdmFsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc2V0X2NvbnZlcnRfcmF0ZV9nZW4xKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCQkgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkJICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcnNuZF9zcmNfc2V0X2NvbnZlcnRfcmF0ZShtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNlbGVjdCBTUkMgbW9kZSAoZml4ZWQgdmFsdWUpICovCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1JDQ1IsIDB4MDAwMTAxMTApOworCisJLyogU2V0IHRoZSByZXN0cmljdGlvbiB2YWx1ZSBvZiB0aGUgRlMgcmF0aW8gKDk4JSkgKi8KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19NTkZTUiwKKwkJICAgICAgIHJzbmRfbW9kX3JlYWQobW9kLCBTUkNfSUZTVlIpIC8gMTAwICogOTgpOworCisJLyogbm8gU1JDX0JGU1NSIHNldHRpbmdzLCBzaW5jZSBTUkNfU1JDQ1I6OkJVRk1EIGlzIDAgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX2luaXRfZ2VuMShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCWludCByZXQ7CisKKwlyZXQgPSByc25kX3NyY19pbml0KG1vZCwgcmRhaSwgaW8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcnNuZF9zcmNfc2V0X3JvdXRlX2dlbjEobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByc25kX3NyY19zZXRfY29udmVydF9yYXRlX2dlbjEobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByc25kX3NyY19zZXRfY29udmVydF90aW1pbmdfZ2VuMShtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzbmRfc3JjX3N0YXJ0X2dlbjEoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCWludCBpZCA9IHJzbmRfbW9kX2lkKG1vZCk7CisKKwlyc25kX21vZF9ic2V0KG1vZCwgU1JDX1JPVVRFX0NUUkwsICgxIDw8IGlkKSwgKDEgPDwgaWQpKTsKKworCXJldHVybiByc25kX3NyY19zdGFydChtb2QsIHJkYWksIGlvKTsKK30KKworc3RhdGljIGludCByc25kX3NyY19zdG9wX2dlbjEoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCisJcnNuZF9tb2RfYnNldChtb2QsIFNSQ19ST1VURV9DVFJMLCAoMSA8PCBpZCksIDApOworCisJcmV0dXJuIHJzbmRfc3JjX3N0b3AobW9kLCByZGFpLCBpbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc3JjX2dlbjFfb3BzID0geworCS5uYW1lCT0gInNydSAoZ2VuMSkiLAorCS5pbml0CT0gcnNuZF9zcmNfaW5pdF9nZW4xLAorCS5xdWl0CT0gcnNuZF9zcmNfcXVpdCwKKwkuc3RhcnQJPSByc25kX3NyY19zdGFydF9nZW4xLAorCS5zdG9wCT0gcnNuZF9zcmNfc3RvcF9nZW4xLAorfTsKKworLyoKKyAqCQlHZW4yIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGVfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkJCSAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJaW50IHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGUobW9kLCByZGFpLCBpbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyc25kX21vZF93cml0ZShtb2QsIFNTSV9CVVNJRl9BRElOUiwgcnNuZF9tb2RfcmVhZChtb2QsIFNSQ19BRElOUikpOworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJX0JVU0lGX01PREUsICByc25kX21vZF9yZWFkKG1vZCwgU1JDX0JVU0lGX01PREUpKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1NSQ0NSLCAweDAwMDExMTEwKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0JTRFNSLCAweDAxODAwMDAwKTsKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19CU0lTUiwgMHgwMDEwMDA2MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19zZXRfY29udmVydF90aW1pbmdfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCQkJICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCQkJICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CisJdTMyIGNvbnZlcnRfcmF0ZSA9IHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShzcmMpOworCWludCByZXQ7CisKKwlpZiAoY29udmVydF9yYXRlKQorCQlyZXQgPSByc25kX2FkZ19zZXRfY29udmVydF9jbGtfZ2VuMihtb2QsIHJkYWksIGlvLAorCQkJCQkJICAgIHJ1bnRpbWUtPnJhdGUsCisJCQkJCQkgICAgY29udmVydF9yYXRlKTsKKwllbHNlCisJCXJldCA9IHJzbmRfYWRnX3NldF9jb252ZXJ0X3RpbWluZ19nZW4yKG1vZCwgcmRhaSwgaW8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByc25kX3NyY19wcm9iZV9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKnNzaSA9IHJzbmRfc3NpX21vZF9nZXQocHJpdiwgcnNuZF9tb2RfaWQobW9kKSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlpbnQgcmV0OworCWludCBpc19wbGF5OworCisJaWYgKGluZm8tPmRhaV9pbmZvKQorCQlpc19wbGF5ID0gcnNuZF9pbmZvX2lzX3BsYXliYWNrKHByaXYsIHNyYyk7CisJZWxzZQorCQlpc19wbGF5ID0gcnNuZF9zc2lfaXNfcGxheShzc2kpOworCisJcmV0ID0gcnNuZF9kbWFfaW5pdChwcml2LAorCQkJICAgIHJzbmRfbW9kX3RvX2RtYShtb2QpLAorCQkJICAgIGlzX3BsYXksCisJCQkgICAgc3JjLT5pbmZvLT5kbWFfaWQpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGRldiwgIlNSQyBETUEgZmFpbGVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfcmVtb3ZlX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkJc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXJzbmRfZG1hX3F1aXQocnNuZF9tb2RfdG9fcHJpdihtb2QpLCByc25kX21vZF90b19kbWEobW9kKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByc25kX3NyY19pbml0X2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcnNuZF9zcmNfaW5pdChtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9jb252ZXJ0X3JhdGVfZ2VuMihtb2QsIHJkYWksIGlvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJzbmRfc3JjX3NldF9jb252ZXJ0X3RpbWluZ19nZW4yKG1vZCwgcmRhaSwgaW8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RhcnRfZ2VuMihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCXJzbmRfZG1hX3N0YXJ0KHJzbmRfbW9kX3RvX2RtYSgmc3JjLT5tb2QpKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJX0NUUkwsIDB4MSk7CisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfQ1RSTCwgMHgxMSk7CisKKwlyZXR1cm4gcnNuZF9zcmNfc3RhcnQobW9kLCByZGFpLCBpbyk7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfc3RvcF9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpICpyZGFpLAorCQkJICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCit7CisJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKKworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJX0NUUkwsIDApOworCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX0NUUkwsIDApOworCisJcnNuZF9kbWFfc3RvcChyc25kX21vZF90b19kbWEoJnNyYy0+bW9kKSk7CisKKwlyZXR1cm4gcnNuZF9zcmNfc3RvcChtb2QsIHJkYWksIGlvKTsKK30KKworc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zcmNfZ2VuMl9vcHMgPSB7CisJLm5hbWUJPSAic3JjIChnZW4yKSIsCisJLnByb2JlCT0gcnNuZF9zcmNfcHJvYmVfZ2VuMiwKKwkucmVtb3ZlCT0gcnNuZF9zcmNfcmVtb3ZlX2dlbjIsCisJLmluaXQJPSByc25kX3NyY19pbml0X2dlbjIsCisJLnF1aXQJPSByc25kX3NyY19xdWl0LAorCS5zdGFydAk9IHJzbmRfc3JjX3N0YXJ0X2dlbjIsCisJLnN0b3AJPSByc25kX3NyY19zdG9wX2dlbjIsCit9OworCitzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3JjX21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKQoreworCWlmIChXQVJOX09OKGlkIDwgMCB8fCBpZCA+PSByc25kX3NyY19ucihwcml2KSkpCisJCWlkID0gMDsKKworCXJldHVybiAmKChzdHJ1Y3QgcnNuZF9zcmMgKikocHJpdi0+c3JjKSArIGlkKS0+bW9kOworfQorCitzdGF0aWMgdm9pZCByc25kX29mX3BhcnNlX3NyYyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzcmNfbm9kZTsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCXN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvICpzcmNfaW5mbzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCBucjsKKworCWlmICghb2ZfZGF0YSkKKwkJcmV0dXJuOworCisJc3JjX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNyYyIpOworCWlmICghc3JjX25vZGUpCisJCXJldHVybjsKKworCW5yID0gb2ZfZ2V0X2NoaWxkX2NvdW50KHNyY19ub2RlKTsKKwlpZiAoIW5yKQorCQlyZXR1cm47CisKKwlzcmNfaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvKSAqIG5yLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghc3JjX2luZm8pIHsKKwkJZGV2X2VycihkZXYsICJzcmMgaW5mbyBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluZm8tPnNyY19pbmZvCQk9IHNyY19pbmZvOworCWluZm8tPnNyY19pbmZvX25yCT0gbnI7Cit9CisKK2ludCByc25kX3NyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAorCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQoreworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYzsKKwlzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHM7CisJc3RydWN0IGNsayAqY2xrOworCWNoYXIgbmFtZVtSU05EX1NSQ19OQU1FX1NJWkVdOworCWludCBpLCBucjsKKworCXJzbmRfb2ZfcGFyc2Vfc3JjKHBkZXYsIG9mX2RhdGEsIHByaXYpOworCisJLyoKKwkgKiBpbml0IFNSQworCSAqLworCW5yCT0gaW5mby0+c3JjX2luZm9fbnI7CisJaWYgKCFucikKKwkJcmV0dXJuIDA7CisKKwlzcmMJPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNyYykgKiBuciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcmMpIHsKKwkJZGV2X2VycihkZXYsICJTUkMgYWxsb2NhdGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJpdi0+c3JjX25yCT0gbnI7CisJcHJpdi0+c3JjCT0gc3JjOworCisJZm9yX2VhY2hfcnNuZF9zcmMoc3JjLCBwcml2LCBpKSB7CisJCXNucHJpbnRmKG5hbWUsIFJTTkRfU1JDX05BTUVfU0laRSwgInNyYy4lZCIsIGkpOworCisJCWNsayA9IGRldm1fY2xrX2dldChkZXYsIG5hbWUpOworCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJCXNucHJpbnRmKG5hbWUsIFJTTkRfU1JDX05BTUVfU0laRSwgInNjdS4lZCIsIGkpOworCQkJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgbmFtZSk7CisJCX0KKworCQlpZiAoSVNfRVJSKGNsaykpCisJCQlyZXR1cm4gUFRSX0VSUihjbGspOworCisJCXNyYy0+aW5mbyA9ICZpbmZvLT5zcmNfaW5mb1tpXTsKKwkJc3JjLT5jbGsgPSBjbGs7CisKKwkJb3BzID0gJnJzbmRfc3JjX25vbl9vcHM7CisJCWlmIChyc25kX3NyY19ocGJpZl9pc19lbmFibGUoc3JjKSkgeworCQkJaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkKKwkJCQlvcHMgPSAmcnNuZF9zcmNfZ2VuMV9vcHM7CisJCQlpZiAocnNuZF9pc19nZW4yKHByaXYpKQorCQkJCW9wcyA9ICZyc25kX3NyY19nZW4yX29wczsKKwkJfQorCisJCXJzbmRfbW9kX2luaXQocHJpdiwgJnNyYy0+bW9kLCBvcHMsIFJTTkRfTU9EX1NSQywgaSk7CisKKwkJZGV2X2RiZyhkZXYsICJTUkMlZCBwcm9iZWRcbiIsIGkpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc3NpLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYwppbmRleCA0YjhjZjdjLi40YjdlMjA2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYwpAQCAtNjQsMTA4ICs2NCwyOSBAQAogCXN0cnVjdCByc25kX21vZCBtb2Q7CiAKIAlzdHJ1Y3QgcnNuZF9kYWkgKnJkYWk7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW87CiAJdTMyIGNyX293bjsKIAl1MzIgY3JfY2xrOwogCXUzMiBjcl9ldGM7CiAJaW50IGVycjsKLQlpbnQgZG1hX29mZnNldDsKIAl1bnNpZ25lZCBpbnQgdXNyY250OwogCXVuc2lnbmVkIGludCByYXRlOwogfTsKIAotc3RydWN0IHJzbmRfc3NpdSB7Ci0JdTMyIHNzaV9tb2RlMDsKLQl1MzIgc3NpX21vZGUxOwotCi0JaW50IHNzaV9ucjsKLQlzdHJ1Y3QgcnNuZF9zc2kgKnNzaTsKLX07Ci0KICNkZWZpbmUgZm9yX2VhY2hfcnNuZF9zc2kocG9zLCBwcml2LCBpKQkJCQkJXAogCWZvciAoaSA9IDA7CQkJCQkJCVwKIAkgICAgIChpIDwgcnNuZF9zc2lfbnIocHJpdikpICYmCQkJCQlcCi0JCSgocG9zKSA9ICgoc3RydWN0IHJzbmRfc3NpdSAqKSgocHJpdiktPnNzaXUpKS0+c3NpICsgaSk7IFwKKwkJKChwb3MpID0gKChzdHJ1Y3QgcnNuZF9zc2kgKikocHJpdiktPnNzaSArIGkpKTsJCVwKIAkgICAgIGkrKykKIAotI2RlZmluZSByc25kX3NzaV9ucihwcml2KSAoKChzdHJ1Y3QgcnNuZF9zc2l1ICopKChwcml2KS0+c3NpdSkpLT5zc2lfbnIpCisjZGVmaW5lIHJzbmRfc3NpX25yKHByaXYpICgocHJpdiktPnNzaV9ucikKICNkZWZpbmUgcnNuZF9tb2RfdG9fc3NpKF9tb2QpIGNvbnRhaW5lcl9vZigoX21vZCksIHN0cnVjdCByc25kX3NzaSwgbW9kKQogI2RlZmluZSByc25kX2RtYV90b19zc2koZG1hKSAgcnNuZF9tb2RfdG9fc3NpKHJzbmRfZG1hX3RvX21vZChkbWEpKQogI2RlZmluZSByc25kX3NzaV9waW9fYXZhaWxhYmxlKHNzaSkgKChzc2kpLT5pbmZvLT5waW9faXJxID4gMCkKICNkZWZpbmUgcnNuZF9zc2lfZG1hX2F2YWlsYWJsZShzc2kpIFwKIAlyc25kX2RtYV9hdmFpbGFibGUocnNuZF9tb2RfdG9fZG1hKCYoc3NpKS0+bW9kKSkKICNkZWZpbmUgcnNuZF9zc2lfY2xrX2Zyb21fcGFyZW50KHNzaSkgKChzc2kpLT5wYXJlbnQpCi0jZGVmaW5lIHJzbmRfcmRhaV9pc19jbGtfbWFzdGVyKHJkYWkpICgocmRhaSktPmNsa19tYXN0ZXIpCiAjZGVmaW5lIHJzbmRfc3NpX21vZGVfZmxhZ3MocCkgKChwKS0+aW5mby0+ZmxhZ3MpCiAjZGVmaW5lIHJzbmRfc3NpX2RhaV9pZChzc2kpICgoc3NpKS0+aW5mby0+ZGFpX2lkKQotI2RlZmluZSByc25kX3NzaV90b19zc2l1KHNzaSlcCi0JKCgoc3RydWN0IHJzbmRfc3NpdSAqKSgoc3NpKSAtIHJzbmRfbW9kX2lkKCYoc3NpKS0+bW9kKSkpIC0gMSkKLQotc3RhdGljIHZvaWQgcnNuZF9zc2lfbW9kZV9zZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJCSAgICAgIHN0cnVjdCByc25kX3NzaSAqc3NpKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHJzbmRfbW9kICpzY3U7Ci0Jc3RydWN0IHJzbmRfc3NpdSAqc3NpdSA9IHJzbmRfc3NpX3RvX3NzaXUoc3NpKTsKLQlpbnQgaWQgPSByc25kX21vZF9pZCgmc3NpLT5tb2QpOwotCXUzMiBmbGFnczsKLQl1MzIgdmFsOwotCi0Jc2N1ICAgPSByc25kX3NjdV9tb2RfZ2V0KHByaXYsIHJzbmRfbW9kX2lkKCZzc2ktPm1vZCkpOwotCi0JLyoKLQkgKiBTU0lfTU9ERTAKLQkgKi8KLQotCS8qIHNlZSBhbHNvIEJVU0lGX01PREUgKi8KLQlpZiAocnNuZF9zY3VfaHBiaWZfaXNfZW5hYmxlKHNjdSkpIHsKLQkJc3NpdS0+c3NpX21vZGUwICY9IH4oMSA8PCBpZCk7Ci0JCWRldl9kYmcoZGV2LCAiU1NJJWQgdXNlcyBERVBFTkRFTlQgbW9kZVxuIiwgaWQpOwotCX0gZWxzZSB7Ci0JCXNzaXUtPnNzaV9tb2RlMCB8PSAoMSA8PCBpZCk7Ci0JCWRldl9kYmcoZGV2LCAiU1NJJWQgdXNlcyBJTkRFUEVOREVOVCBtb2RlXG4iLCBpZCk7Ci0JfQotCi0JLyoKLQkgKiBTU0lfTU9ERTEKLQkgKi8KLSNkZWZpbmUgc3NpX3BhcmVudF9zZXQocCwgc3luYywgYWRnLCBleHQpCQlcCi0JZG8gewkJCQkJCVwKLQkJc3NpLT5wYXJlbnQgPSBzc2l1LT5zc2kgKyBwOwkJXAotCQlpZiAocnNuZF9yZGFpX2lzX2Nsa19tYXN0ZXIocmRhaSkpCVwKLQkJCXZhbCA9IGFkZzsJCQlcCi0JCWVsc2UJCQkJCVwKLQkJCXZhbCA9IGV4dDsJCQlcCi0JCWlmIChmbGFncyAmIFJTTkRfU1NJX1NZTkMpCQlcCi0JCQl2YWwgfD0gc3luYzsJCQlcCi0JfSB3aGlsZSAoMCkKLQotCWZsYWdzID0gcnNuZF9zc2lfbW9kZV9mbGFncyhzc2kpOwotCWlmIChmbGFncyAmIFJTTkRfU1NJX0NMS19QSU5fU0hBUkUpIHsKLQotCQl2YWwgPSAwOwotCQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgMToKLQkJCXNzaV9wYXJlbnRfc2V0KDAsICgxIDw8IDQpLCAoMHgyIDw8IDApLCAoMHgxIDw8IDApKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlzc2lfcGFyZW50X3NldCgwLCAoMSA8PCA0KSwgKDB4MiA8PCAyKSwgKDB4MSA8PCAyKSk7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJc3NpX3BhcmVudF9zZXQoMywgKDEgPDwgMjApLCAoMHgyIDw8IDE2KSwgKDB4MSA8PCAxNikpOwotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJCXNzaV9wYXJlbnRfc2V0KDcsIDAsIDAsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzc2l1LT5zc2lfbW9kZTEgfD0gdmFsOwotCX0KLQotCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgU1NJX01PREUwLCBzc2l1LT5zc2lfbW9kZTApOwotCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgU1NJX01PREUxLCBzc2l1LT5zc2lfbW9kZTEpOwotfQogCiBzdGF0aWMgdm9pZCByc25kX3NzaV9zdGF0dXNfY2hlY2soc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCQkJICB1MzIgYml0KQpAQCAtMjAwLDcgKzEyMSw3IEBACiAJCTEsIDIsIDQsIDgsIDE2LCA2LCAxMiwKIAl9OwogCXVuc2lnbmVkIGludCBtYWluX3JhdGU7Ci0JdW5zaWduZWQgaW50IHJhdGUgPSByc25kX3NjdV9nZXRfc3NpX3JhdGUocHJpdiwgJnNzaS0+bW9kLCBydW50aW1lKTsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IHJzbmRfc3JjX2dldF9zc2lfcmF0ZShwcml2LCBpbywgcnVudGltZSk7CiAKIAkvKgogCSAqIEZpbmQgYmVzdCBjbG9jaywgYW5kIHRyeSB0byBzdGFydCBBREcKQEAgLTI1Miw3ICsxNzMsNyBAQAogCWlmICgwID09IHNzaS0+dXNyY250KSB7CiAJCWNsa19lbmFibGUoc3NpLT5jbGspOwogCi0JCWlmIChyc25kX3JkYWlfaXNfY2xrX21hc3RlcihyZGFpKSkgeworCQlpZiAocnNuZF9kYWlfaXNfY2xrX21hc3RlcihyZGFpKSkgewogCQkJaWYgKHJzbmRfc3NpX2Nsa19mcm9tX3BhcmVudChzc2kpKQogCQkJCXJzbmRfc3NpX2h3X3N0YXJ0KHNzaS0+cGFyZW50LCByZGFpLCBpbyk7CiAJCQllbHNlCkBAIC0zMDIsNyArMjIzLDcgQEAKIAkJcnNuZF9tb2Rfd3JpdGUoJnNzaS0+bW9kLCBTU0lDUiwgY3IpOwkvKiBkaXNhYmxlZCBhbGwgKi8KIAkJcnNuZF9zc2lfc3RhdHVzX2NoZWNrKCZzc2ktPm1vZCwgSUlSUSk7CiAKLQkJaWYgKHJzbmRfcmRhaV9pc19jbGtfbWFzdGVyKHJkYWkpKSB7CisJCWlmIChyc25kX2RhaV9pc19jbGtfbWFzdGVyKHJkYWkpKSB7CiAJCQlpZiAocnNuZF9zc2lfY2xrX2Zyb21fcGFyZW50KHNzaSkpCiAJCQkJcnNuZF9zc2lfaHdfc3RvcChzc2ktPnBhcmVudCwgcmRhaSk7CiAJCQllbHNlCkBAIC0zMjMsOCArMjQ0LDYgQEAKIAkJCSBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKIAlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOwotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gcnNuZF9pb190b19ydW50aW1lKGlvKTsKIAl1MzIgY3I7CiAKQEAgLTM2NSwxMyArMjg0LDEwIEBACiAJICogc2V0IHNzaSBwYXJhbWV0ZXIKIAkgKi8KIAlzc2ktPnJkYWkJPSByZGFpOwotCXNzaS0+aW8JCT0gaW87CiAJc3NpLT5jcl9vd24JPSBjcjsKIAlzc2ktPmVycgk9IC0xOyAvKiBpZ25vcmUgMXN0IGVycm9yICovCiAKLQlyc25kX3NzaV9tb2RlX3NldChwcml2LCByZGFpLCBzc2kpOwotCi0JZGV2X2RiZyhkZXYsICIlcy4lZCBpbml0XG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOworCXJzbmRfc3JjX3NzaV9tb2RlX2luaXQobW9kLCByZGFpLCBpbyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM4NCwxMyArMzAwLDEwIEBACiAJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwogCi0JZGV2X2RiZyhkZXYsICIlcy4lZCBxdWl0XG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCiAJaWYgKHNzaS0+ZXJyID4gMCkKIAkJZGV2X3dhcm4oZGV2LCAic3NpIHVuZGVyL292ZXIgZmxvdyBlcnIgPSAlZFxuIiwgc3NpLT5lcnIpOwogCiAJc3NpLT5yZGFpCT0gTlVMTDsKLQlzc2ktPmlvCQk9IE5VTEw7CiAJc3NpLT5jcl9vd24JPSAwOwogCXNzaS0+ZXJyCT0gMDsKIApAQCAtNDE0LDggKzMyNyw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgcnNuZF9zc2lfcGlvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCByc25kX3NzaSAqc3NpID0gZGF0YTsKLQlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHNzaS0+aW87Ci0JdTMyIHN0YXR1cyA9IHJzbmRfbW9kX3JlYWQoJnNzaS0+bW9kLCBTU0lTUik7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSAmc3NpLT5tb2Q7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCXUzMiBzdGF0dXMgPSByc25kX21vZF9yZWFkKG1vZCwgU1NJU1IpOwogCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwogCiAJaWYgKGlvICYmIChzdGF0dXMgJiBESVJRKSkgewpAQCAtNDMyLDkgKzM0Niw5IEBACiAJCSAqIHNlZSByc25kX3NzaV9pbml0KCkKIAkJICovCiAJCWlmIChyc25kX2RhaV9pc19wbGF5KHJkYWksIGlvKSkKLQkJCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgU1NJVERSLCAqYnVmKTsKKwkJCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1NJVERSLCAqYnVmKTsKIAkJZWxzZQotCQkJKmJ1ZiA9IHJzbmRfbW9kX3JlYWQoJnNzaS0+bW9kLCBTU0lSRFIpOworCQkJKmJ1ZiA9IHJzbmRfbW9kX3JlYWQobW9kLCBTU0lSRFIpOwogCiAJCXJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKGlvLCBzaXplb2YoKmJ1ZikpOwogCkBAIC00NDQsMjUgKzM1OCwzOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcnNuZF9zc2lfcGlvX3N0YXJ0KHN0cnVjdCByc25kX21vZCAqbW9kLAorc3RhdGljIGludCByc25kX3NzaV9waW9fcHJvYmUoc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCiAJCQkgICAgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbykKIHsKIAlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwotCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9tb2RfdG9fc3NpKG1vZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOworCWludCBpcnEgPSBzc2ktPmluZm8tPnBpb19pcnE7CisJaW50IHJldDsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsCisJCQkgICAgICAgcnNuZF9zc2lfcGlvX2ludGVycnVwdCwKKwkJCSAgICAgICBJUlFGX1NIQVJFRCwKKwkJCSAgICAgICBkZXZfbmFtZShkZXYpLCBzc2kpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAiU1NJIHJlcXVlc3QgaW50ZXJydXB0IGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzbmRfc3NpX3Bpb19zdGFydChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaSAqcmRhaSwKKwkJCSAgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQoreworCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9tb2RfdG9fc3NpKG1vZCk7CiAKIAkvKiBlbmFibGUgUElPIElSUSAqLwogCXNzaS0+Y3JfZXRjID0gVUlFTiB8IE9JRU4gfCBESUVOOwogCi0JLyogZW5hYmxlIFBJTyBpbnRlcnJ1cHQgaWYgZ2VuMiAqLwotCWlmIChyc25kX2lzX2dlbjIocHJpdikpCi0JCXJzbmRfbW9kX3dyaXRlKCZzc2ktPm1vZCwgSU5UX0VOQUJMRSwgMHgwZjAwMDAwMCk7CisJcnNuZF9zcmNfZW5hYmxlX3NzaV9pcnEobW9kLCByZGFpLCBpbyk7CiAKIAlyc25kX3NzaV9od19zdGFydChzc2ksIHJkYWksIGlvKTsKIAotCWRldl9kYmcoZGV2LCAiJXMuJWQgc3RhcnRcbiIsIHJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDcwLDEyICszOTgsOCBAQAogCQkJICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCiAJCQkgICAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQogewotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOwogCi0JZGV2X2RiZyhkZXYsICIlcy4lZCBzdG9wXG4iLCByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCiAJc3NpLT5jcl9ldGMgPSAwOwogCiAJcnNuZF9zc2lfaHdfc3RvcChzc2ksIHJkYWkpOwpAQCAtNDg1LDM1ICs0MDksNDYgQEAKIAogc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zc2lfcGlvX29wcyA9IHsKIAkubmFtZQk9ICJzc2kgKHBpbykiLAorCS5wcm9iZQk9IHJzbmRfc3NpX3Bpb19wcm9iZSwKIAkuaW5pdAk9IHJzbmRfc3NpX2luaXQsCiAJLnF1aXQJPSByc25kX3NzaV9xdWl0LAogCS5zdGFydAk9IHJzbmRfc3NpX3Bpb19zdGFydCwKIAkuc3RvcAk9IHJzbmRfc3NpX3Bpb19zdG9wLAogfTsKIAotc3RhdGljIGludCByc25kX3NzaV9kbWFfaW5xdWlyeShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgZG1hX2FkZHJfdCAqYnVmLCBpbnQgKmxlbikKK3N0YXRpYyBpbnQgcnNuZF9zc2lfZG1hX3Byb2JlKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQogewotCXN0cnVjdCByc25kX3NzaSAqc3NpID0gcnNuZF9kbWFfdG9fc3NpKGRtYSk7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSBzc2ktPmlvOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX21vZF90b19zc2kobW9kKTsKKwlzdHJ1Y3QgcmNhcl9zbmRfaW5mbyAqaW5mbyA9IHJzbmRfcHJpdl90b19pbmZvKHByaXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CisJaW50IGRtYV9pZCA9IHNzaS0+aW5mby0+ZG1hX2lkOworCWludCBpc19wbGF5OworCWludCByZXQ7CiAKLQkqbGVuID0gaW8tPmJ5dGVfcGVyX3BlcmlvZDsKLQkqYnVmID0gcnVudGltZS0+ZG1hX2FkZHIgKwotCQlyc25kX2RhaV9wb2ludGVyX29mZnNldChpbywgc3NpLT5kbWFfb2Zmc2V0ICsgKmxlbik7Ci0Jc3NpLT5kbWFfb2Zmc2V0ID0gKmxlbjsgLyogaXQgY2FyZXMgQS9CIHBsYW5lICovCisJaWYgKGluZm8tPmRhaV9pbmZvKQorCQlpc19wbGF5ID0gcnNuZF9pbmZvX2lzX3BsYXliYWNrKHByaXYsIHNzaSk7CisJZWxzZQorCQlpc19wbGF5ID0gcnNuZF9zc2lfaXNfcGxheSgmc3NpLT5tb2QpOwogCi0JcmV0dXJuIDA7CisJcmV0ID0gcnNuZF9kbWFfaW5pdCgKKwkJcHJpdiwgcnNuZF9tb2RfdG9fZG1hKG1vZCksCisJCWlzX3BsYXksCisJCWRtYV9pZCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJTU0kgRE1BIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJzbmRfc3NpX2RtYV9jb21wbGV0ZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKK3N0YXRpYyBpbnQgcnNuZF9zc2lfZG1hX3JlbW92ZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnNuZF9kYWkgKnJkYWksCisJCQkgICAgICAgc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8pCiB7Ci0Jc3RydWN0IHJzbmRfc3NpICpzc2kgPSByc25kX2RtYV90b19zc2koZG1hKTsKLQlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHNzaS0+aW87Ci0JdTMyIHN0YXR1cyA9IHJzbmRfbW9kX3JlYWQoJnNzaS0+bW9kLCBTU0lTUik7Ci0KLQlyc25kX3NzaV9yZWNvcmRfZXJyb3Ioc3NpLCBzdGF0dXMpOwotCi0JcnNuZF9kYWlfcG9pbnRlcl91cGRhdGUoc3NpLT5pbywgaW8tPmJ5dGVfcGVyX3BlcmlvZCk7CisJcnNuZF9kbWFfcXVpdChyc25kX21vZF90b19wcml2KG1vZCksIHJzbmRfbW9kX3RvX2RtYShtb2QpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTI3LDE0ICs0NjIsMTMgQEAKIAogCS8qIGVuYWJsZSBETUEgdHJhbnNmZXIgKi8KIAlzc2ktPmNyX2V0YyA9IERNRU47Ci0Jc3NpLT5kbWFfb2Zmc2V0ID0gMDsKIAogCXJzbmRfZG1hX3N0YXJ0KGRtYSk7CiAKIAlyc25kX3NzaV9od19zdGFydChzc2ksIHNzaS0+cmRhaSwgaW8pOwogCiAJLyogZW5hYmxlIFdTIGNvbnRpbnVlICovCi0JaWYgKHJzbmRfcmRhaV9pc19jbGtfbWFzdGVyKHJkYWkpKQorCWlmIChyc25kX2RhaV9pc19jbGtfbWFzdGVyKHJkYWkpKQogCQlyc25kX21vZF93cml0ZSgmc3NpLT5tb2QsIFNTSVdTUiwgQ09OVCk7CiAKIAlyZXR1cm4gMDsKQEAgLTU0OSw2ICs0ODMsOCBAQAogCiAJc3NpLT5jcl9ldGMgPSAwOwogCisJcnNuZF9zc2lfcmVjb3JkX2Vycm9yKHNzaSwgcnNuZF9tb2RfcmVhZChtb2QsIFNTSVNSKSk7CisKIAlyc25kX3NzaV9od19zdG9wKHNzaSwgcmRhaSk7CiAKIAlyc25kX2RtYV9zdG9wKGRtYSk7CkBAIC01NTgsNiArNDk0LDggQEAKIAogc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9zc2lfZG1hX29wcyA9IHsKIAkubmFtZQk9ICJzc2kgKGRtYSkiLAorCS5wcm9iZQk9IHJzbmRfc3NpX2RtYV9wcm9iZSwKKwkucmVtb3ZlCT0gcnNuZF9zc2lfZG1hX3JlbW92ZSwKIAkuaW5pdAk9IHJzbmRfc3NpX2luaXQsCiAJLnF1aXQJPSByc25kX3NzaV9xdWl0LAogCS5zdGFydAk9IHJzbmRfc3NpX2RtYV9zdGFydCwKQEAgLTU2NywyNCArNTA1LDggQEAKIC8qCiAgKgkJTm9uIFNTSQogICovCi1zdGF0aWMgaW50IHJzbmRfc3NpX25vbihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKLQkJCXN0cnVjdCByc25kX2RhaSAqcmRhaSwKLQkJCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvKQotewotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKLQotCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHJzbmRfbW9kX29wcyByc25kX3NzaV9ub25fb3BzID0gewogCS5uYW1lCT0gInNzaSAobm9uKSIsCi0JLmluaXQJPSByc25kX3NzaV9ub24sCi0JLnF1aXQJPSByc25kX3NzaV9ub24sCi0JLnN0YXJ0CT0gcnNuZF9zc2lfbm9uLAotCS5zdG9wCT0gcnNuZF9zc2lfbm9uLAogfTsKIAogLyoKQEAgLTU5MywxNiArNTE1LDMwIEBACiBzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3NpX21vZF9nZXRfZnJtX2RhaShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJCQkgIGludCBkYWlfaWQsIGludCBpc19wbGF5KQogeworCXN0cnVjdCByc25kX2RhaV9wbGF0Zm9ybV9pbmZvICpkYWlfaW5mbyA9IE5VTEw7CisJc3RydWN0IHJzbmRfZGFpX3BhdGhfaW5mbyAqcGF0aF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbyAqdGFyZ2V0X2luZm8gPSBOVUxMOwogCXN0cnVjdCByc25kX3NzaSAqc3NpOwogCWludCBpLCBoYXNfcGxheTsKIAorCWlmIChwcml2LT5yZGFpKQorCQlkYWlfaW5mbyA9IHByaXYtPnJkYWlbZGFpX2lkXS5pbmZvOworCWlmIChkYWlfaW5mbykKKwkJcGF0aF9pbmZvID0gKGlzX3BsYXkpID8gJmRhaV9pbmZvLT5wbGF5YmFjayA6ICZkYWlfaW5mby0+Y2FwdHVyZTsKKwlpZiAocGF0aF9pbmZvKQorCQl0YXJnZXRfaW5mbyA9IHBhdGhfaW5mby0+c3NpOworCiAJaXNfcGxheSA9ICEhaXNfcGxheTsKIAogCWZvcl9lYWNoX3JzbmRfc3NpKHNzaSwgcHJpdiwgaSkgeworCQlpZiAodGFyZ2V0X2luZm8gPT0gc3NpLT5pbmZvKQorCQkJcmV0dXJuICZzc2ktPm1vZDsKKworCQkvKiBmb3IgY29tcGF0aWJsZSAqLwogCQlpZiAocnNuZF9zc2lfZGFpX2lkKHNzaSkgIT0gZGFpX2lkKQogCQkJY29udGludWU7CiAKLQkJaGFzX3BsYXkgPSAhIShyc25kX3NzaV9tb2RlX2ZsYWdzKHNzaSkgJiBSU05EX1NTSV9QTEFZKTsKKwkJaGFzX3BsYXkgPSByc25kX3NzaV9pc19wbGF5KCZzc2ktPm1vZCk7CiAKIAkJaWYgKGlzX3BsYXkgPT0gaGFzX3BsYXkpCiAJCQlyZXR1cm4gJnNzaS0+bW9kOwpAQCAtNjE2LDM2ICs1NTIsMTIyIEBACiAJaWYgKFdBUk5fT04oaWQgPCAwIHx8IGlkID49IHJzbmRfc3NpX25yKHByaXYpKSkKIAkJaWQgPSAwOwogCi0JcmV0dXJuICYoKChzdHJ1Y3QgcnNuZF9zc2l1ICopKHByaXYtPnNzaXUpKS0+c3NpICsgaWQpLT5tb2Q7CisJcmV0dXJuICYoKHN0cnVjdCByc25kX3NzaSAqKShwcml2LT5zc2kpICsgaWQpLT5tb2Q7Cit9CisKK2ludCByc25kX3NzaV9pc19waW5fc2hhcmluZyhzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3sKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOworCisJcmV0dXJuICEhKHJzbmRfc3NpX21vZGVfZmxhZ3Moc3NpKSAmIFJTTkRfU1NJX0NMS19QSU5fU0hBUkUpOworfQorCitpbnQgcnNuZF9zc2lfaXNfcGxheShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3sKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOworCisJcmV0dXJuICEhKHJzbmRfc3NpX21vZGVfZmxhZ3Moc3NpKSAmIFJTTkRfU1NJX1BMQVkpOworfQorCitzdGF0aWMgdm9pZCByc25kX3NzaV9wYXJlbnRfY2xrX3NldHVwKHN0cnVjdCByc25kX3ByaXYgKnByaXYsIHN0cnVjdCByc25kX3NzaSAqc3NpKQoreworCWlmICghcnNuZF9zc2lfaXNfcGluX3NoYXJpbmcoJnNzaS0+bW9kKSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChyc25kX21vZF9pZCgmc3NpLT5tb2QpKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJc3NpLT5wYXJlbnQgPSByc25kX21vZF90b19zc2kocnNuZF9zc2lfbW9kX2dldChwcml2LCAwKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3NpLT5wYXJlbnQgPSByc25kX21vZF90b19zc2kocnNuZF9zc2lfbW9kX2dldChwcml2LCAzKSk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc3NpLT5wYXJlbnQgPSByc25kX21vZF90b19zc2kocnNuZF9zc2lfbW9kX2dldChwcml2LCA3KSk7CisJCWJyZWFrOworCX0KK30KKworCitzdGF0aWMgdm9pZCByc25kX29mX3BhcnNlX3NzaShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHJzbmRfc3NpX3BsYXRmb3JtX2luZm8gKnNzaV9pbmZvOworCXN0cnVjdCByY2FyX3NuZF9pbmZvICppbmZvID0gcnNuZF9wcml2X3RvX2luZm8ocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgbnIsIGk7CisKKwlpZiAoIW9mX2RhdGEpCisJCXJldHVybjsKKworCW5vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNzaSIpOworCWlmICghbm9kZSkKKwkJcmV0dXJuOworCisJbnIgPSBvZl9nZXRfY2hpbGRfY291bnQobm9kZSk7CisJaWYgKCFucikKKwkJcmV0dXJuOworCisJc3NpX2luZm8gPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbykgKiBuciwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNzaV9pbmZvKSB7CisJCWRldl9lcnIoZGV2LCAic3NpIGluZm8gYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbmZvLT5zc2lfaW5mbwkJPSBzc2lfaW5mbzsKKwlpbmZvLT5zc2lfaW5mb19ucgk9IG5yOworCisJaSA9IC0xOworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobm9kZSwgbnApIHsKKwkJaSsrOworCisJCXNzaV9pbmZvID0gaW5mby0+c3NpX2luZm8gKyBpOworCisJCS8qCisJCSAqIHBpbiBzZXR0aW5ncworCQkgKi8KKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInNoYXJlZC1waW4iLCBOVUxMKSkKKwkJCXNzaV9pbmZvLT5mbGFncyB8PSBSU05EX1NTSV9DTEtfUElOX1NIQVJFOworCisJCS8qCisJCSAqIGlycQorCQkgKi8KKwkJc3NpX2luZm8tPnBpb19pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJfQogfQogCiBpbnQgcnNuZF9zc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8sCisJCSAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CisJc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsKIAlzdHJ1Y3QgcnNuZF9zc2lfcGxhdGZvcm1faW5mbyAqcGluZm87CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgcnNuZF9tb2Rfb3BzICpvcHM7CiAJc3RydWN0IGNsayAqY2xrOwotCXN0cnVjdCByc25kX3NzaXUgKnNzaXU7CiAJc3RydWN0IHJzbmRfc3NpICpzc2k7CiAJY2hhciBuYW1lW1JTTkRfU1NJX05BTUVfU0laRV07Ci0JaW50IGksIG5yLCByZXQ7CisJaW50IGksIG5yOworCisJcnNuZF9vZl9wYXJzZV9zc2kocGRldiwgb2ZfZGF0YSwgcHJpdik7CiAKIAkvKgogCSAqCWluaXQgU1NJCiAJICovCiAJbnIJPSBpbmZvLT5zc2lfaW5mb19ucjsKLQlzc2l1CT0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc2l1KSArIChzaXplb2YoKnNzaSkgKiBuciksCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzc2l1KSB7CisJc3NpCT0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc2kpICogbnIsIEdGUF9LRVJORUwpOworCWlmICghc3NpKSB7CiAJCWRldl9lcnIoZGV2LCAiU1NJIGFsbG9jYXRlIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXByaXYtPnNzaXUJPSBzc2l1OwotCXNzaXUtPnNzaQk9IChzdHJ1Y3QgcnNuZF9zc2kgKikoc3NpdSArIDEpOwotCXNzaXUtPnNzaV9ucgk9IG5yOworCXByaXYtPnNzaQk9IHNzaTsKKwlwcml2LT5zc2lfbnIJPSBucjsKIAogCWZvcl9lYWNoX3JzbmRfc3NpKHNzaSwgcHJpdiwgaSkgewogCQlwaW5mbyA9ICZpbmZvLT5zc2lfaW5mb1tpXTsKQEAgLTY2MCw2MSArNjgyLDE1IEBACiAJCXNzaS0+Y2xrCT0gY2xrOwogCiAJCW9wcyA9ICZyc25kX3NzaV9ub25fb3BzOworCQlpZiAocGluZm8tPmRtYV9pZCA+IDApCisJCQlvcHMgPSAmcnNuZF9zc2lfZG1hX29wczsKKwkJZWxzZSBpZiAocnNuZF9zc2lfcGlvX2F2YWlsYWJsZShzc2kpKQorCQkJb3BzID0gJnJzbmRfc3NpX3Bpb19vcHM7CiAKLQkJLyoKLQkJICogU1NJIERNQSBjYXNlCi0JCSAqLwotCQlpZiAocGluZm8tPmRtYV9pZCA+IDApIHsKLQkJCXJldCA9IHJzbmRfZG1hX2luaXQoCi0JCQkJcHJpdiwgcnNuZF9tb2RfdG9fZG1hKCZzc2ktPm1vZCksCi0JCQkJKHJzbmRfc3NpX21vZGVfZmxhZ3Moc3NpKSAmIFJTTkRfU1NJX1BMQVkpLAotCQkJCXBpbmZvLT5kbWFfaWQsCi0JCQkJcnNuZF9zc2lfZG1hX2lucXVpcnksCi0JCQkJcnNuZF9zc2lfZG1hX2NvbXBsZXRlKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWRldl9pbmZvKGRldiwgIlNTSSBETUEgZmFpbGVkLiB0cnkgUElPIHRyYW5zdGVyXG4iKTsKLQkJCWVsc2UKLQkJCQlvcHMJPSAmcnNuZF9zc2lfZG1hX29wczsKKwkJcnNuZF9tb2RfaW5pdChwcml2LCAmc3NpLT5tb2QsIG9wcywgUlNORF9NT0RfU1NJLCBpKTsKIAotCQkJZGV2X2RiZyhkZXYsICJTU0klZCB1c2UgRE1BIHRyYW5zZmVyXG4iLCBpKTsKLQkJfQotCi0JCS8qCi0JCSAqIFNTSSBQSU8gY2FzZQotCQkgKi8KLQkJaWYgKCFyc25kX3NzaV9kbWFfYXZhaWxhYmxlKHNzaSkgJiYKLQkJICAgICByc25kX3NzaV9waW9fYXZhaWxhYmxlKHNzaSkpIHsKLQkJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBwaW5mby0+cGlvX2lycSwKLQkJCQkJICAgICAgICZyc25kX3NzaV9waW9faW50ZXJydXB0LAotCQkJCQkgICAgICAgSVJRRl9TSEFSRUQsCi0JCQkJCSAgICAgICBkZXZfbmFtZShkZXYpLCBzc2kpOwotCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoZGV2LCAiU1NJIHJlcXVlc3QgaW50ZXJydXB0IGZhaWxlZFxuIik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQotCQkJb3BzCT0gJnJzbmRfc3NpX3Bpb19vcHM7Ci0KLQkJCWRldl9kYmcoZGV2LCAiU1NJJWQgdXNlIFBJTyB0cmFuc2ZlclxuIiwgaSk7Ci0JCX0KLQotCQlyc25kX21vZF9pbml0KHByaXYsICZzc2ktPm1vZCwgb3BzLCBpKTsKKwkJcnNuZF9zc2lfcGFyZW50X2Nsa19zZXR1cChwcml2LCBzc2kpOwogCX0KIAotCWRldl9kYmcoZGV2LCAic3NpIHByb2JlZFxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KLQotdm9pZCByc25kX3NzaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgcnNuZF9zc2kgKnNzaTsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3JzbmRfc3NpKHNzaSwgcHJpdiwgaSkgewotCQlpZiAocnNuZF9zc2lfZG1hX2F2YWlsYWJsZShzc2kpKQotCQkJcnNuZF9kbWFfcXVpdChwcml2LCByc25kX21vZF90b19kbWEoJnNzaS0+bW9kKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2lyZi9LY29uZmlnIGIvc291bmQvc29jL3NpcmYvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWU4OTQyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvS2NvbmZpZwpAQCAtMCwwICsxLDE0IEBACitjb25maWcgU05EX1NPQ19TSVJGCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgdGhlIFNpUkYgU29DIGNoaXBzIgorCWRlcGVuZHMgb24gQVJDSF9TSVJGIHx8IENPTVBJTEVfVEVTVAorCXNlbGVjdCBTTkRfU09DX0dFTkVSSUNfRE1BRU5HSU5FX1BDTQorCitjb25maWcgU05EX1NPQ19TSVJGX0FVRElPCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBTaVJGIGludGVybmFsIGF1ZGlvIGNvZGVjIgorCWRlcGVuZHMgb24gU05EX1NPQ19TSVJGCisJc2VsZWN0IFNORF9TT0NfU0lSRl9BVURJT19DT0RFQworCXNlbGVjdCBTTkRfU09DX1NJUkZfQVVESU9fUE9SVAorCitjb25maWcgU05EX1NPQ19TSVJGX0FVRElPX1BPUlQKKwlzZWxlY3QgUkVHTUFQX01NSU8KKwl0cmlzdGF0ZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NpcmYvTWFrZWZpbGUgYi9zb3VuZC9zb2Mvc2lyZi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNiOTMyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitzbmQtc29jLXNpcmYtYXVkaW8tb2JqcyA6PSBzaXJmLWF1ZGlvLm8KK3NuZC1zb2Mtc2lyZi1hdWRpby1wb3J0LW9ianMgOj0gc2lyZi1hdWRpby1wb3J0Lm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfU0lSRl9BVURJTykgKz0gc25kLXNvYy1zaXJmLWF1ZGlvLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NJUkZfQVVESU9fUE9SVCkgKz0gc25kLXNvYy1zaXJmLWF1ZGlvLXBvcnQubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1wb3J0LmMgYi9zb3VuZC9zb2Mvc2lyZi9zaXJmLWF1ZGlvLXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRhNTNmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1wb3J0LmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBTaVJGIEF1ZGlvIHBvcnQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9kbWFlbmdpbmVfcGNtLmg+CisKKyNpbmNsdWRlICJzaXJmLWF1ZGlvLXBvcnQuaCIKKworc3RydWN0IHNpcmZfYXVkaW9fcG9ydCB7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBwbGF5YmFja19kbWFfZGF0YTsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgY2FwdHVyZV9kbWFfZGF0YTsKK307CisKK3N0YXRpYyB2b2lkIHNpcmZfYXVkaW9fcG9ydF90eF9lbmFibGUoc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydCkKK3sKKwlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1RYRklGT19PUCwKKwkJQVVESU9fRklGT19SRVNFVCwgQVVESU9fRklGT19SRVNFVCk7CisJcmVnbWFwX3dyaXRlKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19UWEZJRk9fSU5UX01TSywgMCk7CisJcmVnbWFwX3dyaXRlKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19UWEZJRk9fT1AsIDApOworCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfVFhGSUZPX09QLAorCQlBVURJT19GSUZPX1NUQVJULCBBVURJT19GSUZPX1NUQVJUKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX0NPREVDX1RYX0NUUkwsCisJCUlDX1RYX0VOQUJMRSwgSUNfVFhfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgc2lyZl9hdWRpb19wb3J0X3R4X2Rpc2FibGUoc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydCkKK3sKKwlyZWdtYXBfd3JpdGUocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1RYRklGT19PUCwgMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19UWF9DVFJMLAorCQlJQ19UWF9FTkFCTEUsIH5JQ19UWF9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBzaXJmX2F1ZGlvX3BvcnRfcnhfZW5hYmxlKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQsCisJaW50IGNoYW5uZWxzKQoreworCXJlZ21hcF91cGRhdGVfYml0cyhwb3J0LT5yZWdtYXAsIEFVRElPX1BPUlRfSUNfUlhGSUZPX09QLAorCQlBVURJT19GSUZPX1JFU0VULCBBVURJT19GSUZPX1JFU0VUKTsKKwlyZWdtYXBfd3JpdGUocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1JYRklGT19JTlRfTVNLLCAwKTsKKwlyZWdtYXBfd3JpdGUocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX1JYRklGT19PUCwgMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19SWEZJRk9fT1AsCisJCUFVRElPX0ZJRk9fU1RBUlQsIEFVRElPX0ZJRk9fU1RBUlQpOworCWlmIChjaGFubmVscyA9PSAxKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMocG9ydC0+cmVnbWFwLCBBVURJT19QT1JUX0lDX0NPREVDX1JYX0NUUkwsCisJCQlJQ19SWF9FTkFCTEVfTU9OTywgSUNfUlhfRU5BQkxFX01PTk8pOworCWVsc2UKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19SWF9DVFJMLAorCQkJSUNfUlhfRU5BQkxFX1NURVJFTywgSUNfUlhfRU5BQkxFX1NURVJFTyk7Cit9CisKK3N0YXRpYyB2b2lkIHNpcmZfYXVkaW9fcG9ydF9yeF9kaXNhYmxlKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQgKnBvcnQpCit7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBvcnQtPnJlZ21hcCwgQVVESU9fUE9SVF9JQ19DT0RFQ19SWF9DVFJMLAorCQkJSUNfUlhfRU5BQkxFX1NURVJFTywgfklDX1JYX0VOQUJMRV9TVEVSRU8pOworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fcG9ydF9kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfaW5pdF9kbWFfZGF0YShkYWksICZwb3J0LT5wbGF5YmFja19kbWFfZGF0YSwKKwkJCSZwb3J0LT5jYXB0dXJlX2RtYV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXJmX2F1ZGlvX3BvcnRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCwKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19wb3J0ICpwb3J0ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlpbnQgcGxheWJhY2sgPSBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJaWYgKHBsYXliYWNrKQorCQkJc2lyZl9hdWRpb19wb3J0X3R4X2Rpc2FibGUocG9ydCk7CisJCWVsc2UKKwkJCXNpcmZfYXVkaW9fcG9ydF9yeF9kaXNhYmxlKHBvcnQpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJaWYgKHBsYXliYWNrKQorCQkJc2lyZl9hdWRpb19wb3J0X3R4X2VuYWJsZShwb3J0KTsKKwkJZWxzZQorCQkJc2lyZl9hdWRpb19wb3J0X3J4X2VuYWJsZShwb3J0LAorCQkJCXN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc2lyZl9hdWRpb19wb3J0X2RhaV9vcHMgPSB7CisJLnRyaWdnZXIgPSBzaXJmX2F1ZGlvX3BvcnRfdHJpZ2dlciwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNpcmZfYXVkaW9fcG9ydF9kYWkgPSB7CisJLnByb2JlID0gc2lyZl9hdWRpb19wb3J0X2RhaV9wcm9iZSwKKwkubmFtZSA9ICJzaXJmLWF1ZGlvLXBvcnQiLAorCS5pZCA9IDAsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKKwkub3BzID0gJnNpcmZfYXVkaW9fcG9ydF9kYWlfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgc2lyZl9hdWRpb19wb3J0X2NvbXBvbmVudCA9IHsKKwkubmFtZSAgICAgICA9ICJzaXJmLWF1ZGlvLXBvcnQiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNpcmZfYXVkaW9fcG9ydF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkudmFsX2JpdHMgPSAzMiwKKwkubWF4X3JlZ2lzdGVyID0gQVVESU9fUE9SVF9JQ19SWEZJRk9fSU5UX01TSywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fcG9ydF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHNpcmZfYXVkaW9fcG9ydCAqcG9ydDsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHJlc291cmNlICptZW1fcmVzOworCisJcG9ydCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBzaXJmX2F1ZGlvX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW1fcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1lbSByZXNvdXJjZT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwliYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIG1lbV9yZXMtPnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZShtZW1fcmVzKSk7CisJaWYgKGJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3J0LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oJnBkZXYtPmRldiwgYmFzZSwKKwkJCQkJICAgICZzaXJmX2F1ZGlvX3BvcnRfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihwb3J0LT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihwb3J0LT5yZWdtYXApOworCisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJnNpcmZfYXVkaW9fcG9ydF9jb21wb25lbnQsICZzaXJmX2F1ZGlvX3BvcnRfZGFpLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcG9ydCk7CisJcmV0dXJuIGRldm1fc25kX2RtYWVuZ2luZV9wY21fcmVnaXN0ZXIoJnBkZXYtPmRldiwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNpcmZfYXVkaW9fcG9ydF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic2lyZixhdWRpby1wb3J0IiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNpcmZfYXVkaW9fcG9ydF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNpcmZfYXVkaW9fcG9ydF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZi1hdWRpby1wb3J0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNpcmZfYXVkaW9fcG9ydF9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNpcmZfYXVkaW9fcG9ydF9wcm9iZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2lyZl9hdWRpb19wb3J0X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2lSRiBBdWRpbyBQb3J0IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUm9uZ0p1biBZaW5nIDxSb25nanVuLllpbmdAY3NyLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5oIGIvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby1wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyZGM1NAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8tcG9ydC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBTaVJGIEF1ZGlvIHBvcnQgY29udHJvbGxlcnMgZGVmaW5lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX1NJUkZfQVVESU9fUE9SVF9ICisjZGVmaW5lIF9TSVJGX0FVRElPX1BPUlRfSAorCisjZGVmaW5lIEFVRElPX1BPUlRfVFhfRklGT19MRVZFTF9DSEVDS19NQVNLICAgICAweDNGCisjZGVmaW5lIEFVRElPX1BPUlRfVFhfRklGT19TQ19PRkZTRVQgICAgMAorI2RlZmluZSBBVURJT19QT1JUX1RYX0ZJRk9fTENfT0ZGU0VUICAgIDEwCisjZGVmaW5lIEFVRElPX1BPUlRfVFhfRklGT19IQ19PRkZTRVQgICAgMjAKKworI2RlZmluZSBUWF9GSUZPX1NDKHgpICAgICAgICAgICAoKCh4KSAmIEFVRElPX1BPUlRfVFhfRklGT19MRVZFTF9DSEVDS19NQVNLKSBcCisJCQkJPDwgQVVESU9fUE9SVF9UWF9GSUZPX1NDX09GRlNFVCkKKyNkZWZpbmUgVFhfRklGT19MQyh4KSAgICAgICAgICAgKCgoeCkgJiBBVURJT19QT1JUX1RYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAorCQkJCTw8IEFVRElPX1BPUlRfVFhfRklGT19MQ19PRkZTRVQpCisjZGVmaW5lIFRYX0ZJRk9fSEMoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUE9SVF9UWF9GSUZPX0xFVkVMX0NIRUNLX01BU0spIFwKKwkJCQk8PCBBVURJT19QT1JUX1RYX0ZJRk9fSENfT0ZGU0VUKQorCisjZGVmaW5lIEFVRElPX1BPUlRfUlhfRklGT19MRVZFTF9DSEVDS19NQVNLICAgICAweDBGCisjZGVmaW5lIEFVRElPX1BPUlRfUlhfRklGT19TQ19PRkZTRVQgICAgMAorI2RlZmluZSBBVURJT19QT1JUX1JYX0ZJRk9fTENfT0ZGU0VUICAgIDEwCisjZGVmaW5lIEFVRElPX1BPUlRfUlhfRklGT19IQ19PRkZTRVQgICAgMjAKKworI2RlZmluZSBSWF9GSUZPX1NDKHgpICAgICAgICAgICAoKCh4KSAmIEFVRElPX1BPUlRfUlhfRklGT19MRVZFTF9DSEVDS19NQVNLKSBcCisJCQkJPDwgQVVESU9fUE9SVF9SWF9GSUZPX1NDX09GRlNFVCkKKyNkZWZpbmUgUlhfRklGT19MQyh4KSAgICAgICAgICAgKCgoeCkgJiBBVURJT19QT1JUX1JYX0ZJRk9fTEVWRUxfQ0hFQ0tfTUFTSykgXAorCQkJCTw8IEFVRElPX1BPUlRfUlhfRklGT19MQ19PRkZTRVQpCisjZGVmaW5lIFJYX0ZJRk9fSEMoeCkgICAgICAgICAgICgoKHgpICYgQVVESU9fUE9SVF9SWF9GSUZPX0xFVkVMX0NIRUNLX01BU0spIFwKKwkJCQk8PCBBVURJT19QT1JUX1JYX0ZJRk9fSENfT0ZGU0VUKQorI2RlZmluZSBBVURJT19QT1JUX0lDX0NPREVDX1RYX0NUUkwJCSgweDAwRjQpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfQ09ERUNfUlhfQ1RSTAkJKDB4MDBGOCkKKworI2RlZmluZSBBVURJT19QT1JUX0lDX1RYRklGT19PUAkJCSgweDAwRkMpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfVFhGSUZPX0xFVl9DSEsJCSgweDAxMDApCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfVFhGSUZPX1NUUwkJKDB4MDEwNCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19UWEZJRk9fSU5UCQkoMHgwMTA4KQorI2RlZmluZSBBVURJT19QT1JUX0lDX1RYRklGT19JTlRfTVNLCQkoMHgwMTBDKQorCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfUlhGSUZPX09QCQkJKDB4MDExMCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19SWEZJRk9fTEVWX0NISwkJKDB4MDExNCkKKyNkZWZpbmUgQVVESU9fUE9SVF9JQ19SWEZJRk9fU1RTCQkoMHgwMTE4KQorI2RlZmluZSBBVURJT19QT1JUX0lDX1JYRklGT19JTlQJCSgweDAxMUMpCisjZGVmaW5lIEFVRElPX1BPUlRfSUNfUlhGSUZPX0lOVF9NU0sJCSgweDAxMjApCisKKyNkZWZpbmUgQVVESU9fRklGT19TVEFSVAkJKDEgPDwgMCkKKyNkZWZpbmUgQVVESU9fRklGT19SRVNFVAkJKDEgPDwgMSkKKworI2RlZmluZSBBVURJT19GSUZPX0ZVTEwJCQkoMSA8PCAwKQorI2RlZmluZSBBVURJT19GSUZPX0VNUFRZCQkoMSA8PCAxKQorI2RlZmluZSBBVURJT19GSUZPX09GTE9XCQkoMSA8PCAyKQorI2RlZmluZSBBVURJT19GSUZPX1VGTE9XCQkoMSA8PCAzKQorCisjZGVmaW5lIElDX1RYX0VOQUJMRQkJKDB4MDMpCisjZGVmaW5lIElDX1JYX0VOQUJMRV9NT05PCSgweDAxKQorI2RlZmluZSBJQ19SWF9FTkFCTEVfU1RFUkVPCSgweDAzKQorCisjZW5kaWYgLypfX1NJUkZfQVVESU9fUE9SVF9IKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8uYyBiL3NvdW5kL3NvYy9zaXJmL3NpcmYtYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VmNTEwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NpcmYvc2lyZi1hdWRpby5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogU2lSRiBhdWRpbyBjYXJkIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworc3RydWN0IHNpcmZfYXVkaW9fY2FyZCB7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZ3Bpb19ocF9wYTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBncGlvX3Nwa19wYTsKK307CisKK3N0YXRpYyBpbnQgc2lyZl9hdWRpb19ocF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdHJsLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jYXJkICpzaXJmX2F1ZGlvX2NhcmQgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IG9uID0gIVNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpOworCWlmIChncGlvX2lzX3ZhbGlkKHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSkpCisJCWdwaW9fc2V0X3ZhbHVlKHNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSwgb24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpcmZfYXVkaW9fc3BrX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0cmwsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSB3LT5kYXBtOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBkYXBtLT5jYXJkOworCXN0cnVjdCBzaXJmX2F1ZGlvX2NhcmQgKnNpcmZfYXVkaW9fY2FyZCA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgb24gPSAhU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCk7CisKKwlpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhKSkKKwkJZ3Bpb19zZXRfdmFsdWUoc2lyZl9hdWRpb19jYXJkLT5ncGlvX3Nwa19wYSwgb24pOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2lyZl9hdWRpb19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhwIiwgc2lyZl9hdWRpb19ocF9ldmVudCksCisJU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIHNpcmZfYXVkaW9fc3BrX2V2ZW50KSwKKwlTTkRfU09DX0RBUE1fTUlDKCJFeHQgTWljIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0geworCXsiSHAiLCBOVUxMLCAiSFBPVVRMIn0sCisJeyJIcCIsIE5VTEwsICJIUE9VVFIifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiU1BLT1VUIn0sCisJeyJNSUNJTjEiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1pYyBCaWFzIiwgTlVMTCwgIkV4dCBNaWMifSwKK307CisKKy8qIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNpcmZfYXVkaW9fZGFpX2xpbmtbXSA9IHsKKwl7CisJCS5uYW1lID0gIlNpUkYgYXVkaW8gY2FyZCIsCisJCS5zdHJlYW1fbmFtZSA9ICJTaVJGIGF1ZGlvIEhpRmkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic2lyZi1hdWRpby1jb2RlYyIsCisJfSwKK307CisKKy8qIEF1ZGlvIG1hY2hpbmUgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX3NpcmZfYXVkaW9fY2FyZCA9IHsKKwkubmFtZSA9ICJTaVJGIGF1ZGlvIGNhcmQiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kYWlfbGluayA9IHNpcmZfYXVkaW9fZGFpX2xpbmssCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoc2lyZl9hdWRpb19kYWlfbGluayksCisJLmRhcG1fd2lkZ2V0cyA9IHNpcmZfYXVkaW9fZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzaXJmX2F1ZGlvX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorfTsKKworc3RhdGljIGludCBzaXJmX2F1ZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZzbmRfc29jX3NpcmZfYXVkaW9fY2FyZDsKKwlzdHJ1Y3Qgc2lyZl9hdWRpb19jYXJkICpzaXJmX2F1ZGlvX2NhcmQ7CisJaW50IHJldDsKKworCXNpcmZfYXVkaW9fY2FyZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHNpcmZfYXVkaW9fY2FyZCksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoc2lyZl9hdWRpb19jYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc2lyZl9hdWRpb19kYWlfbGlua1swXS5jcHVfb2Zfbm9kZSA9CisJCW9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJzaXJmLGF1ZGlvLXBsYXRmb3JtIiwgMCk7CisJc2lyZl9hdWRpb19kYWlfbGlua1swXS5wbGF0Zm9ybV9vZl9ub2RlID0KKwkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgInNpcmYsYXVkaW8tcGxhdGZvcm0iLCAwKTsKKwlzaXJmX2F1ZGlvX2RhaV9saW5rWzBdLmNvZGVjX29mX25vZGUgPQorCQlvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAic2lyZixhdWRpby1jb2RlYyIsIDApOworCXNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19zcGtfcGEgPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJzcGstcGEtZ3Bpb3MiLCAwKTsKKwlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEgPSAgb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkiaHAtcGEtZ3Bpb3MiLCAwKTsKKwlpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhKSkgeworCQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBkZXYtPmRldiwKKwkJCQlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhLAorCQkJCUdQSU9GX09VVF9JTklUX0xPVywgIlNQQV9QQV9TRCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZXF1ZXN0IEdQSU9fJWQgZm9yIHJlc2V0OiAlZFxuIiwKKwkJCQlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9fc3BrX3BhLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlpZiAoZ3Bpb19pc192YWxpZChzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEpKSB7CisJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmcGRldi0+ZGV2LAorCQkJCXNpcmZfYXVkaW9fY2FyZC0+Z3Bpb19ocF9wYSwKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJIUF9QQV9TRCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZXF1ZXN0IEdQSU9fJWQgZm9yIHJlc2V0OiAlZFxuIiwKKwkJCQlzaXJmX2F1ZGlvX2NhcmQtPmdwaW9faHBfcGEsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgc2lyZl9hdWRpb19jYXJkKTsKKworCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsIGNhcmQpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgpIGZhaWxlZDolZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNpcmZfYXVkaW9fb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAic2lyZixzaXJmLWF1ZGlvLWNhcmQiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzaXJmX2F1ZGlvX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2lyZl9hdWRpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZi1hdWRpby1jYXJkIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gc2lyZl9hdWRpb19vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNpcmZfYXVkaW9fcHJvYmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaXJmX2F1ZGlvX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlJvbmdKdW4gWWluZyA8Um9uZ0p1bi5ZaW5nQGNzci5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFNJUkYgYXVkaW8gY2FyZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY2FjaGUuYyBiL3NvdW5kL3NvYy9zb2MtY2FjaGUuYwppbmRleCAzNzVkYzZkLi5iZmVkM2U0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKKysrIGIvc291bmQvc29jL3NvYy1jYWNoZS5jCkBAIC05Niw4ICs5Niw3IEBACiB7CiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQVNvQzogRGVzdHJveWluZyBjYWNoZSBmb3IgJXMgY29kZWNcbiIsCiAJCQljb2RlYy0+bmFtZSk7Ci0JaWYgKCFjb2RlYy0+cmVnX2NhY2hlKQotCQlyZXR1cm4gMDsKKwogCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwogCWNvZGVjLT5yZWdfY2FjaGUgPSBOVUxMOwogCXJldHVybiAwOwpAQCAtMTE3LDggKzExNiw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKLQkqdmFsdWUgPSBzbmRfc29jX2dldF9jYWNoZV92YWwoY29kZWMtPnJlZ19jYWNoZSwgcmVnLAotCQkJCSAgICAgICBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKTsKKwlpZiAoIVpFUk9fT1JfTlVMTF9QVFIoY29kZWMtPnJlZ19jYWNoZSkpCisJCSp2YWx1ZSA9IHNuZF9zb2NfZ2V0X2NhY2hlX3ZhbChjb2RlYy0+cmVnX2NhY2hlLCByZWcsCisJCQkJCSAgICAgICBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKTsKIAltdXRleF91bmxvY2soJmNvZGVjLT5jYWNoZV9yd19tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTEzNiw4ICsxMzYsOSBAQAogCQkJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQogewogCW11dGV4X2xvY2soJmNvZGVjLT5jYWNoZV9yd19tdXRleCk7Ci0Jc25kX3NvY19zZXRfY2FjaGVfdmFsKGNvZGVjLT5yZWdfY2FjaGUsIHJlZywgdmFsdWUsCi0JCQkgICAgICBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKTsKKwlpZiAoIVpFUk9fT1JfTlVMTF9QVFIoY29kZWMtPnJlZ19jYWNoZSkpCisJCXNuZF9zb2Nfc2V0X2NhY2hlX3ZhbChjb2RlYy0+cmVnX2NhY2hlLCByZWcsIHZhbHVlLAorCQkJCSAgICAgIGNvZGVjLT5kcml2ZXItPnJlZ193b3JkX3NpemUpOwogCW11dGV4X3VubG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb21wcmVzcy5jIGIvc291bmQvc29jL3NvYy1jb21wcmVzcy5jCmluZGV4IDVlOTY5MGMuLjkxMDgzZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29tcHJlc3MuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvbXByZXNzLmMKQEAgLTMwLDggKzMwLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CiAJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrX25lc3RlZCgmcnRkLT5wY21fbXV0ZXgsIHJ0ZC0+cGNtX3N1YmNsYXNzKTsKQEAgLTUyLDE3ICs1MCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUrKzsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUrKzsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlKys7Ci0JfQotCi0JY3B1X2RhaS0+YWN0aXZlKys7Ci0JY29kZWNfZGFpLT5hY3RpdmUrKzsKLQlydGQtPmNvZGVjLT5hY3RpdmUrKzsKKwlzbmRfc29jX3J1bnRpbWVfYWN0aXZhdGUocnRkLCBjc3RyZWFtLT5kaXJlY3Rpb24pOwogCiAJbXV0ZXhfdW5sb2NrKCZydGQtPnBjbV9tdXRleCk7CiAKQEAgLTgxLDggKzY5LDYgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqZmUgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpmZV9zdWJzdHJlYW0gPSBmZS0+cGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBmZS0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gZmUtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBmZS0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RwY20gKmRwY207CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqbGlzdDsKIAlpbnQgc3RyZWFtOwpAQCAtMTQwLDE3ICsxMjYsNyBAQAogCWZlLT5kcGNtW3N0cmVhbV0uc3RhdGUgPSBTTkRfU09DX0RQQ01fU1RBVEVfT1BFTjsKIAlmZS0+ZHBjbVtzdHJlYW1dLnJ1bnRpbWVfdXBkYXRlID0gU05EX1NPQ19EUENNX1VQREFURV9OTzsKIAotCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7Ci0JCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZSsrOwotCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZSsrOwotCX0gZWxzZSB7Ci0JCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlKys7Ci0JCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKLQl9Ci0KLQljcHVfZGFpLT5hY3RpdmUrKzsKLQljb2RlY19kYWktPmFjdGl2ZSsrOwotCWZlLT5jb2RlYy0+YWN0aXZlKys7CisJc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKGZlLCBzdHJlYW0pOwogCiAJbXV0ZXhfdW5sb2NrKCZmZS0+Y2FyZC0+bXV0ZXgpOwogCkBAIC0yMDIsMjQgKzE3OCwxOSBAQAogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlpbnQgc3RyZWFtOwogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJnJ0ZC0+cGNtX211dGV4LCBydGQtPnBjbV9zdWJjbGFzcyk7CiAKLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlLS07Ci0JfQorCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKQorCQlzdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOworCWVsc2UKKwkJc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOworCisJc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUocnRkLCBzdHJlYW0pOwogCiAJc25kX3NvY19kYWlfZGlnaXRhbF9tdXRlKGNvZGVjX2RhaSwgMSwgY3N0cmVhbS0+ZGlyZWN0aW9uKTsKIAotCWNwdV9kYWktPmFjdGl2ZS0tOwotCWNvZGVjX2RhaS0+YWN0aXZlLS07Ci0JY29kZWMtPmFjdGl2ZS0tOwotCiAJaWYgKCFjcHVfZGFpLT5hY3RpdmUpCiAJCWNwdV9kYWktPnJhdGUgPSAwOwogCkBAIC0yMzUsOCArMjA2LDcgQEAKIAljcHVfZGFpLT5ydW50aW1lID0gTlVMTDsKIAogCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7Ci0JCWlmICghcnRkLT5wbWRvd25fdGltZSB8fCBjb2RlYy0+aWdub3JlX3BtZG93bl90aW1lIHx8Ci0JCSAgICBydGQtPmRhaV9saW5rLT5pZ25vcmVfcG1kb3duX3RpbWUpIHsKKwkJaWYgKHNuZF9zb2NfcnVudGltZV9pZ25vcmVfcG1kb3duX3RpbWUocnRkKSkgewogCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChydGQsCiAJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCiAJCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RPUCk7CkBAIC0yNjEsMjYgKzIzMSwxNyBAQAogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpmZSA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBmZS0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gZmUtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBmZS0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RwY20gKmRwY207CiAJaW50IHN0cmVhbSwgcmV0OwogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJmZlLT5jYXJkLT5tdXRleCwgU05EX1NPQ19DQVJEX0NMQVNTX1JVTlRJTUUpOwogCi0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spIHsKKwlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKIAkJc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlLS07Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRTsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCX0KIAotCWNwdV9kYWktPmFjdGl2ZS0tOwotCWNvZGVjX2RhaS0+YWN0aXZlLS07Ci0JZmUtPmNvZGVjLT5hY3RpdmUtLTsKKwlzbmRfc29jX3J1bnRpbWVfZGVhY3RpdmF0ZShmZSwgc3RyZWFtKTsKIAogCWZlLT5kcGNtW3N0cmVhbV0ucnVudGltZV91cGRhdGUgPSBTTkRfU09DX0RQQ01fVVBEQVRFX0ZFOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IGZlMWRmNTAuLjA1MWMwMDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC01Niw3ICs1Niw2IEBACiAjZW5kaWYKIAogc3RhdGljIERFRklORV9NVVRFWChjbGllbnRfbXV0ZXgpOwotc3RhdGljIExJU1RfSEVBRChkYWlfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKHBsYXRmb3JtX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChjb2RlY19saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoY29tcG9uZW50X2xpc3QpOwpAQCAtMzcwLDE4ICszNjksMjIgQEAKIHsKIAljaGFyICpidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJc3NpemVfdCBsZW4sIHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CiAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhaSwgJmRhaV9saXN0LCBsaXN0KSB7Ci0JCWxlbiA9IHNucHJpbnRmKGJ1ZiArIHJldCwgUEFHRV9TSVpFIC0gcmV0LCAiJXNcbiIsIGRhaS0+bmFtZSk7Ci0JCWlmIChsZW4gPj0gMCkKLQkJCXJldCArPSBsZW47Ci0JCWlmIChyZXQgPiBQQUdFX1NJWkUpIHsKLQkJCXJldCA9IFBBR0VfU0laRTsKLQkJCWJyZWFrOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmY29tcG9uZW50X2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZjb21wb25lbnQtPmRhaV9saXN0LCBsaXN0KSB7CisJCQlsZW4gPSBzbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIiVzXG4iLAorCQkJCWRhaS0+bmFtZSk7CisJCQlpZiAobGVuID49IDApCisJCQkJcmV0ICs9IGxlbjsKKwkJCWlmIChyZXQgPiBQQUdFX1NJWkUpIHsKKwkJCQlyZXQgPSBQQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTg1NSw2ICs4NTgsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9ICZjYXJkLT5kYWlfbGlua1tudW1dOwogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSAmY2FyZC0+cnRkW251bV07CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwogCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgKmNwdV9kYWk7CkBAIC04NjMsMTggKzg2NywyMCBAQAogCWRldl9kYmcoY2FyZC0+ZGV2LCAiQVNvQzogYmluZGluZyAlcyBhdCBpZHggJWRcbiIsIGRhaV9saW5rLT5uYW1lLCBudW0pOwogCiAJLyogRmluZCBDUFUgREFJIGZyb20gcmVnaXN0ZXJlZCBEQUlzKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwdV9kYWksICZkYWlfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmY29tcG9uZW50X2xpc3QsIGxpc3QpIHsKIAkJaWYgKGRhaV9saW5rLT5jcHVfb2Zfbm9kZSAmJgotCQkgICAgKGNwdV9kYWktPmRldi0+b2Zfbm9kZSAhPSBkYWlfbGluay0+Y3B1X29mX25vZGUpKQorCQkJY29tcG9uZW50LT5kZXYtPm9mX25vZGUgIT0gZGFpX2xpbmstPmNwdV9vZl9ub2RlKQogCQkJY29udGludWU7CiAJCWlmIChkYWlfbGluay0+Y3B1X25hbWUgJiYKLQkJICAgIHN0cmNtcChkZXZfbmFtZShjcHVfZGFpLT5kZXYpLCBkYWlfbGluay0+Y3B1X25hbWUpKQorCQkJc3RyY21wKGRldl9uYW1lKGNvbXBvbmVudC0+ZGV2KSwgZGFpX2xpbmstPmNwdV9uYW1lKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoZGFpX2xpbmstPmNwdV9kYWlfbmFtZSAmJgotCQkgICAgc3RyY21wKGNwdV9kYWktPm5hbWUsIGRhaV9saW5rLT5jcHVfZGFpX25hbWUpKQotCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3B1X2RhaSwgJmNvbXBvbmVudC0+ZGFpX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChkYWlfbGluay0+Y3B1X2RhaV9uYW1lICYmCisJCQkJc3RyY21wKGNwdV9kYWktPm5hbWUsIGRhaV9saW5rLT5jcHVfZGFpX25hbWUpKQorCQkJCWNvbnRpbnVlOwogCi0JCXJ0ZC0+Y3B1X2RhaSA9IGNwdV9kYWk7CisJCQlydGQtPmNwdV9kYWkgPSBjcHVfZGFpOworCQl9CiAJfQogCiAJaWYgKCFydGQtPmNwdV9kYWkpIHsKQEAgLTg5OSwxMiArOTA1LDEwIEBACiAJCSAqIENPREVDIGZvdW5kLCBzbyBmaW5kIENPREVDIERBSSBmcm9tIHJlZ2lzdGVyZWQgREFJcyBmcm9tCiAJCSAqIHRoaXMgQ09ERUMKIAkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWNfZGFpLCAmZGFpX2xpc3QsIGxpc3QpIHsKLQkJCWlmIChjb2RlYy0+ZGV2ID09IGNvZGVjX2RhaS0+ZGV2ICYmCi0JCQkJIXN0cmNtcChjb2RlY19kYWktPm5hbWUsCi0JCQkJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkpIHsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjX2RhaSwgJmNvZGVjLT5jb21wb25lbnQuZGFpX2xpc3QsIGxpc3QpIHsKKwkJCWlmICghc3RyY21wKGNvZGVjX2RhaS0+bmFtZSwgZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKSkgewogCQkJCXJ0ZC0+Y29kZWNfZGFpID0gY29kZWNfZGFpOworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKQEAgLTExMjgsMTUgKzExMzIsMjEgQEAKIAkJCQkJICBkcml2ZXItPm51bV9kYXBtX3dpZGdldHMpOwogCiAJLyogQ3JlYXRlIERBUE0gd2lkZ2V0cyBmb3IgZWFjaCBEQUkgc3RyZWFtICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZkYWlfbGlzdCwgbGlzdCkgewotCQlpZiAoZGFpLT5kZXYgIT0gY29kZWMtPmRldikKLQkJCWNvbnRpbnVlOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZjb2RlYy0+Y29tcG9uZW50LmRhaV9saXN0LCBsaXN0KQogCQlzbmRfc29jX2RhcG1fbmV3X2RhaV93aWRnZXRzKCZjb2RlYy0+ZGFwbSwgZGFpKTsKLQl9CiAKIAljb2RlYy0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gZHJpdmVyLT5pZGxlX2JpYXNfb2ZmOwogCisJaWYgKCFjb2RlYy0+d3JpdGUgJiYgZGV2X2dldF9yZWdtYXAoY29kZWMtPmRldiwgTlVMTCkpIHsKKwkJLyogU2V0IHRoZSBkZWZhdWx0IEkvTyB1cCB0cnkgcmVnbWFwICovCisJCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOworCQkJZ290byBlcnJfcHJvYmU7CisJCX0KKwl9CisKIAlpZiAoZHJpdmVyLT5wcm9iZSkgewogCQlyZXQgPSBkcml2ZXItPnByb2JlKGNvZGVjKTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTExNTAsMTAgKzExNjAsNiBAQAogCQkJY29kZWMtPm5hbWUpOwogCX0KIAotCS8qIElmIHRoZSBkcml2ZXIgZGlkbid0IHNldCBJL08gdXAgdHJ5IHJlZ21hcCAqLwotCWlmICghY29kZWMtPndyaXRlICYmIGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYsIE5VTEwpKQotCQlzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMCwgMCwgU05EX1NPQ19SRUdNQVApOwotCiAJaWYgKGRyaXZlci0+Y29udHJvbHMpCiAJCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBkcml2ZXItPmNvbnRyb2xzLAogCQkJCSAgICAgZHJpdmVyLT5udW1fY29udHJvbHMpOwpAQCAtMTE4MCw2ICsxMTg2LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgKmRyaXZlciA9IHBsYXRmb3JtLT5kcml2ZXI7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQ7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CiAKIAlwbGF0Zm9ybS0+Y2FyZCA9IGNhcmQ7CkBAIC0xMTk1LDExICsxMjAyLDExIEBACiAJCQlkcml2ZXItPmRhcG1fd2lkZ2V0cywgZHJpdmVyLT5udW1fZGFwbV93aWRnZXRzKTsKIAogCS8qIENyZWF0ZSBEQVBNIHdpZGdldHMgZm9yIGVhY2ggREFJIHN0cmVhbSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmZGFpX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGRhaS0+ZGV2ICE9IHBsYXRmb3JtLT5kZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21wb25lbnQsICZjb21wb25lbnRfbGlzdCwgbGlzdCkgeworCQlpZiAoY29tcG9uZW50LT5kZXYgIT0gcGxhdGZvcm0tPmRldikKIAkJCWNvbnRpbnVlOwotCi0JCXNuZF9zb2NfZGFwbV9uZXdfZGFpX3dpZGdldHMoJnBsYXRmb3JtLT5kYXBtLCBkYWkpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhaSwgJmNvbXBvbmVudC0+ZGFpX2xpc3QsIGxpc3QpCisJCQlzbmRfc29jX2RhcG1fbmV3X2RhaV93aWRnZXRzKCZwbGF0Zm9ybS0+ZGFwbSwgZGFpKTsKIAl9CiAKIAlwbGF0Zm9ybS0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKQEAgLTEyNDYsNyArMTI1Myw3IEBACiAJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NvY19hdXhfZGV2ICphdXhfZGV2ID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCWNvbnN0IGNoYXIgKnRlbXAsICpuYW1lOworCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWRhaWxlc3MpIHsKQEAgLTEyNjAsMTAgKzEyNjcsNiBAQAogCX0KIAlydGQtPmNhcmQgPSBjYXJkOwogCi0JLyogbWFjaGluZSBjb250cm9scywgcm91dGVzIGFuZCB3aWRnZXRzIGFyZSBub3QgcHJlZml4ZWQgKi8KLQl0ZW1wID0gY29kZWMtPm5hbWVfcHJlZml4OwotCWNvZGVjLT5uYW1lX3ByZWZpeCA9IE5VTEw7Ci0KIAkvKiBkbyBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCiAJaWYgKCFkYWlsZXNzICYmIGRhaV9saW5rLT5pbml0KQogCQlyZXQgPSBkYWlfbGluay0+aW5pdChydGQpOwpAQCAtMTI3Myw3ICsxMjc2LDYgQEAKIAkJZGV2X2VycihjYXJkLT5kZXYsICJBU29DOiBmYWlsZWQgdG8gaW5pdCAlczogJWRcbiIsIG5hbWUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCWNvZGVjLT5uYW1lX3ByZWZpeCA9IHRlbXA7CiAKIAkvKiByZWdpc3RlciB0aGUgcnRkIGRldmljZSAqLwogCXJ0ZC0+Y29kZWMgPSBjb2RlYzsKQEAgLTE2NTQsNyArMTY1Niw3IEBACiAJfQogCiAJLyogY2FyZCBiaW5kIGNvbXBsZXRlIHNvIHJlZ2lzdGVyIGEgc291bmQgY2FyZCAqLwotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKKwlyZXQgPSBzbmRfY2FyZF9uZXcoY2FyZC0+ZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSwKIAkJCWNhcmQtPm93bmVyLCAwLCAmY2FyZC0+c25kX2NhcmQpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY2FyZC0+ZGV2LApAQCAtMTY2Miw3ICsxNjY0LDYgQEAKIAkJCWNhcmQtPm5hbWUsIHJldCk7CiAJCWdvdG8gYmFzZV9lcnJvcjsKIAl9Ci0JY2FyZC0+c25kX2NhcmQtPmRldiA9IGNhcmQtPmRldjsKIAogCWNhcmQtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJY2FyZC0+ZGFwbS5kZXYgPSBjYXJkLT5kZXY7CkBAIC0yNTcxLDEwICsyNTcyLDEwIEBACiAKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSBlLT5zaGlmdF9sID09IGUtPnNoaWZ0X3IgPyAxIDogMjsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGUtPm1heDsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGUtPml0ZW1zOwogCi0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiBlLT5tYXggLSAxKQotCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gZS0+bWF4IC0gMTsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSBlLT5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IGUtPml0ZW1zIC0gMTsKIAlzdHJsY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCiAJCWUtPnRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dLAogCQlzaXplb2YodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSkpOwpAQCAtMjU5NiwxNCArMjU5NywxOCBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgdmFsLCBpdGVtOworCXVuc2lnbmVkIGludCByZWdfdmFsOwogCi0JdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0KLQkJPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKLQlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0KLQkJCSh2YWwgPj4gZS0+c2hpZnRfcikgJiBlLT5tYXNrOworCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7CisJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCWl0ZW0gPSBzbmRfc29jX2VudW1fdmFsX3RvX2l0ZW0oZSwgdmFsKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaXRlbTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwkJaXRlbSA9IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShlLCB2YWwpOworCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gaXRlbTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MjMsMTcgKzI2MjgsMTggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCAqaXRlbSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW07CiAJdW5zaWduZWQgaW50IHZhbDsKIAl1bnNpZ25lZCBpbnQgbWFzazsKIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKKwlpZiAoaXRlbVswXSA+PSBlLT5pdGVtcykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCBlLT5zaGlmdF9sOworCXZhbCA9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzBdKSA8PCBlLT5zaGlmdF9sOwogCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7CiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCWlmIChpdGVtWzFdID49IGUtPml0ZW1zKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCXZhbCB8PSBzbmRfc29jX2VudW1faXRlbV90b192YWwoZSwgaXRlbVsxXSkgPDwgZS0+c2hpZnRfcjsKIAkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CiAJfQogCkBAIC0yNjQyLDc4ICsyNjQ4LDQ2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSk7CiAKIC8qKgotICogc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUgLSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldCBjYWxsYmFjawotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogc25kX3NvY19yZWFkX3NpZ25lZCAtIFJlYWQgYSBjb2RlYyByZWdpc3RlciBhbmQgaW50ZXJwcmV0ZSBhcyBzaWduZWQgdmFsdWUKKyAqIEBjb2RlYzogY29kZWMKKyAqIEByZWc6IFJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBtYXNrOiBNYXNrIHRvIHVzZSBhZnRlciBzaGlmdGluZyB0aGUgcmVnaXN0ZXIgdmFsdWUKKyAqIEBzaGlmdDogUmlnaHQgc2hpZnQgb2YgcmVnaXN0ZXIgdmFsdWUKKyAqIEBzaWduX2JpdDogQml0IHRoYXQgZGVzY3JpYmVzIGlmIGEgbnVtYmVyIGlzIG5lZ2F0aXZlIG9yIG5vdC4KICAqCi0gKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIHNlbWkgZW51bWVyYXRlZCBtaXhlci4KKyAqIFRoaXMgZnVuY3Rpb25zIHJlYWRzIGEgY29kZWMgcmVnaXN0ZXIuIFRoZSByZWdpc3RlciB2YWx1ZSBpcyBzaGlmdGVkIHJpZ2h0CisgKiBieSAnc2hpZnQnIGJpdHMgYW5kIG1hc2tlZCB3aXRoIHRoZSBnaXZlbiAnbWFzaycuIEFmdGVyd2FyZHMgaXQgdHJhbnNsYXRlcworICogdGhlIGdpdmVuIHJlZ2lzdGVydmFsdWUgaW50byBhIHNpZ25lZCBpbnRlZ2VyIGlmIHNpZ25fYml0IGlzIG5vbi16ZXJvLgogICoKLSAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCi0gKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKiBSZXR1cm5zIHRoZSByZWdpc3RlciB2YWx1ZSBhcyBzaWduZWQgaW50LgogICovCi1pbnQgc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9zb2NfcmVhZF9zaWduZWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHNoaWZ0LCB1bnNpZ25lZCBpbnQgc2lnbl9iaXQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcmVnX3ZhbCwgdmFsLCBtdXg7Ci0KLQlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOwotCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKLQlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKLQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKLQkJCWJyZWFrOwotCX0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbXV4OwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfcikgJiBlLT5tYXNrOwotCQlmb3IgKG11eCA9IDA7IG11eCA8IGUtPm1heDsgbXV4KyspIHsKLQkJCWlmICh2YWwgPT0gZS0+dmFsdWVzW211eF0pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IG11eDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKTsKLQotLyoqCi0gKiBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSAtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgcHV0IGNhbGxiYWNrCi0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBzZW1pIGVudW1lcmF0ZWQgbWl4ZXIuCi0gKgotICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKLSAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KLSAqLwotaW50IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgdmFsOwotCXVuc2lnbmVkIGludCBtYXNrOwogCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl2YWwgPSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV0gPDwgZS0+c2hpZnRfbDsKLQltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCB8PSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXV0gPDwgZS0+c2hpZnRfcjsKLQkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7Ci0JfQorCXZhbCA9IChzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKIAotCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzX2xvY2tlZChjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCWlmICghc2lnbl9iaXQpCisJCXJldHVybiB2YWw7CisKKwkvKiBub24tbmVnYXRpdmUgbnVtYmVyICovCisJaWYgKCEodmFsICYgQklUKHNpZ25fYml0KSkpCisJCXJldHVybiB2YWw7CisKKwlyZXQgPSB2YWw7CisKKwkvKgorCSAqIFRoZSByZWdpc3RlciBtb3N0IHByb2JhYmx5IGRvZXMgbm90IGNvbnRhaW4gYSBmdWxsLXNpemVkIGludC4KKwkgKiBJbnN0ZWFkIHdlIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBiaXRzIGluIGEgc2lnbmVkCisJICogcmVwcmVzZW50YXRpb24gd2hpY2ggaGFzIHRvIGJlIHRyYW5zbGF0ZWQgaW50byBhIGZ1bGwtc2l6ZWQgaW50LgorCSAqIFRoaXMgaXMgZG9uZSBieSBmaWxsaW5nIHVwIGFsbCBiaXRzIGFib3ZlIHRoZSBzaWduLWJpdC4KKwkgKi8KKwlyZXQgfD0gfigoaW50KShCSVQoc2lnbl9iaXQpIC0gMSkpOworCisJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKTsKIAogLyoqCiAgKiBzbmRfc29jX2luZm9fdm9sc3cgLSBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjawpAQCAtMjc0Myw3ICsyNzE3LDcgQEAKIAogCXVpbmZvLT5jb3VudCA9IHNuZF9zb2Nfdm9sc3dfaXNfc3RlcmVvKG1jKSA/IDIgOiAxOwogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gcGxhdGZvcm1fbWF4OworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IHBsYXRmb3JtX21heCAtIG1jLT5taW47CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2luZm9fdm9sc3cpOwpAQCAtMjc2OSwxMSArMjc0MywxNiBAQAogCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKIAl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKIAlpbnQgbWF4ID0gbWMtPm1heDsKKwlpbnQgbWluID0gbWMtPm1pbjsKKwlpbnQgc2lnbl9iaXQgPSBtYy0+c2lnbl9iaXQ7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOwogCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwogCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHNoaWZ0KSAmIG1hc2s7CisJaWYgKHNpZ25fYml0KQorCQltYXNrID0gQklUKHNpZ25fYml0ICsgMSkgLSAxOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzbmRfc29jX3JlYWRfc2lnbmVkKGNvZGVjLCByZWcsIG1hc2ssCisJCQlzaGlmdCwgc2lnbl9iaXQpIC0gbWluOwogCWlmIChpbnZlcnQpCiAJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KIAkJCW1heCAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwpAQCAtMjc4MSwxMCArMjc2MCwxMiBAQAogCWlmIChzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhtYykpIHsKIAkJaWYgKHJlZyA9PSByZWcyKQogCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQotCQkJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gcnNoaWZ0KSAmIG1hc2s7CisJCQkJc25kX3NvY19yZWFkX3NpZ25lZChjb2RlYywgcmVnLCBtYXNrLCByc2hpZnQsCisJCQkJCQlzaWduX2JpdCkgLSBtaW47CiAJCWVsc2UKIAkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KLQkJCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcyKSA+PiBzaGlmdCkgJiBtYXNrOworCQkJCXNuZF9zb2NfcmVhZF9zaWduZWQoY29kZWMsIHJlZzIsIG1hc2ssIHNoaWZ0LAorCQkJCQkJc2lnbl9iaXQpIC0gbWluOwogCQlpZiAoaW52ZXJ0KQogCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQogCQkJCW1heCAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwpAQCAtMjgxNSwyMCArMjc5NiwyNSBAQAogCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKIAl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKIAlpbnQgbWF4ID0gbWMtPm1heDsKKwlpbnQgbWluID0gbWMtPm1pbjsKKwl1bnNpZ25lZCBpbnQgc2lnbl9iaXQgPSBtYy0+c2lnbl9iaXQ7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOwogCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwogCWludCBlcnI7Ci0JYm9vbCB0eXBlXzJyID0gMDsKKwlib29sIHR5cGVfMnIgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQgdmFsMiA9IDA7CiAJdW5zaWduZWQgaW50IHZhbCwgdmFsX21hc2s7CiAKLQl2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrKTsKKwlpZiAoc2lnbl9iaXQpCisJCW1hc2sgPSBCSVQoc2lnbl9iaXQgKyAxKSAtIDE7CisKKwl2YWwgPSAoKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgbWluKSAmIG1hc2spOwogCWlmIChpbnZlcnQpCiAJCXZhbCA9IG1heCAtIHZhbDsKIAl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7CiAJdmFsID0gdmFsIDw8IHNoaWZ0OwogCWlmIChzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhtYykpIHsKLQkJdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOworCQl2YWwyID0gKCh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSArIG1pbikgJiBtYXNrKTsKIAkJaWYgKGludmVydCkKIAkJCXZhbDIgPSBtYXggLSB2YWwyOwogCQlpZiAocmVnID09IHJlZzIpIHsKQEAgLTI4MzYsNyArMjgyMiw3IEBACiAJCQl2YWwgfD0gdmFsMiA8PCByc2hpZnQ7CiAJCX0gZWxzZSB7CiAJCQl2YWwyID0gdmFsMiA8PCBzaGlmdDsKLQkJCXR5cGVfMnIgPSAxOworCQkJdHlwZV8yciA9IHRydWU7CiAJCX0KIAl9CiAJZXJyID0gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7CkBAIC0zMjM0LDcgKzMyMjAsNyBAQAogCXN0cnVjdCBzb2NfYnl0ZXMgKnBhcmFtcyA9ICh2b2lkICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWludCByZXQsIGxlbjsKLQl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7CiAJdm9pZCAqZGF0YTsKIAogCWlmICghY29kZWMtPnVzaW5nX3JlZ21hcCkKQEAgLTMyNjQsMTIgKzMyNTAsMzYgQEAKIAkJCSgodTggKilkYXRhKVswXSB8PSB2YWw7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJKCh1MTYgKilkYXRhKVswXSAmPSBjcHVfdG9fYmUxNih+cGFyYW1zLT5tYXNrKTsKLQkJCSgodTE2ICopZGF0YSlbMF0gfD0gY3B1X3RvX2JlMTYodmFsKTsKKwkJCW1hc2sgPSB+cGFyYW1zLT5tYXNrOworCQkJcmV0ID0gcmVnbWFwX3BhcnNlX3ZhbChjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkJCSZtYXNrLCAmbWFzayk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZ290byBvdXQ7CisKKwkJCSgodTE2ICopZGF0YSlbMF0gJj0gbWFzazsKKworCQkJcmV0ID0gcmVnbWFwX3BhcnNlX3ZhbChjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkJCSZ2YWwsICZ2YWwpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gb3V0OworCisJCQkoKHUxNiAqKWRhdGEpWzBdIHw9IHZhbDsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQkoKHUzMiAqKWRhdGEpWzBdICY9IGNwdV90b19iZTMyKH5wYXJhbXMtPm1hc2spOwotCQkJKCh1MzIgKilkYXRhKVswXSB8PSBjcHVfdG9fYmUzMih2YWwpOworCQkJbWFzayA9IH5wYXJhbXMtPm1hc2s7CisJCQlyZXQgPSByZWdtYXBfcGFyc2VfdmFsKGNvZGVjLT5jb250cm9sX2RhdGEsCisJCQkJCQkJJm1hc2ssICZtYXNrKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlnb3RvIG91dDsKKworCQkJKCh1MzIgKilkYXRhKVswXSAmPSBtYXNrOworCisJCQlyZXQgPSByZWdtYXBfcGFyc2VfdmFsKGNvZGVjLT5jb250cm9sX2RhdGEsCisJCQkJCQkJJnZhbCwgJnZhbCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZ290byBvdXQ7CisKKwkJCSgodTMyICopZGF0YSlbMF0gfD0gdmFsOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMzYwOSw2ICszNjE5LDMwIEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhaV9zZXRfZm10KTsKIAogLyoqCisgKiBzbmRfc29jX3hsYXRlX3RkbV9zbG90IC0gZ2VuZXJhdGUgdHgvcnggc2xvdCBtYXNrLgorICogQHNsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgaW4gdXNlLgorICogQHR4X21hc2s6IGJpdG1hc2sgcmVwcmVzZW50aW5nIGFjdGl2ZSBUWCBzbG90cy4KKyAqIEByeF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgUlggc2xvdHMuCisgKgorICogR2VuZXJhdGVzIHRoZSBURE0gdHggYW5kIHJ4IHNsb3QgZGVmYXVsdCBtYXNrcyBmb3IgREFJLgorICovCitzdGF0aWMgaW50IHNuZF9zb2NfeGxhdGVfdGRtX3Nsb3RfbWFzayh1bnNpZ25lZCBpbnQgc2xvdHMsCisJCQkJCSAgdW5zaWduZWQgaW50ICp0eF9tYXNrLAorCQkJCQkgIHVuc2lnbmVkIGludCAqcnhfbWFzaykKK3sKKwlpZiAoKnR4X21hc2sgfHwgKnJ4X21hc2spCisJCXJldHVybiAwOworCisJaWYgKCFzbG90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqdHhfbWFzayA9ICgxIDw8IHNsb3RzKSAtIDE7CisJKnJ4X21hc2sgPSAoMSA8PCBzbG90cykgLSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogc25kX3NvY19kYWlfc2V0X3RkbV9zbG90IC0gY29uZmlndXJlIERBSSBURE0uCiAgKiBAZGFpOiBEQUkKICAqIEB0eF9tYXNrOiBiaXRtYXNrIHJlcHJlc2VudGluZyBhY3RpdmUgVFggc2xvdHMuCkBAIC0zNjIyLDExICszNjU2LDE3IEBACiBpbnQgc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAogCXVuc2lnbmVkIGludCB0eF9tYXNrLCB1bnNpZ25lZCBpbnQgcnhfbWFzaywgaW50IHNsb3RzLCBpbnQgc2xvdF93aWR0aCkKIHsKKwlpZiAoZGFpLT5kcml2ZXIgJiYgZGFpLT5kcml2ZXItPm9wcy0+eGxhdGVfdGRtX3Nsb3RfbWFzaykKKwkJZGFpLT5kcml2ZXItPm9wcy0+eGxhdGVfdGRtX3Nsb3RfbWFzayhzbG90cywKKwkJCQkJCSZ0eF9tYXNrLCAmcnhfbWFzayk7CisJZWxzZQorCQlzbmRfc29jX3hsYXRlX3RkbV9zbG90X21hc2soc2xvdHMsICZ0eF9tYXNrLCAmcnhfbWFzayk7CisKIAlpZiAoZGFpLT5kcml2ZXIgJiYgZGFpLT5kcml2ZXItPm9wcy0+c2V0X3RkbV9zbG90KQogCQlyZXR1cm4gZGFpLT5kcml2ZXItPm9wcy0+c2V0X3RkbV9zbG90KGRhaSwgdHhfbWFzaywgcnhfbWFzaywKIAkJCQlzbG90cywgc2xvdF93aWR0aCk7CiAJZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdCk7CiAKQEAgLTM4ODIsOTUgKzM5MjIsNDIgQEAKIH0KIAogLyoqCi0gKiBzbmRfc29jX3JlZ2lzdGVyX2RhaSAtIFJlZ2lzdGVyIGEgREFJIHdpdGggdGhlIEFTb0MgY29yZQorICogc25kX3NvY191bnJlZ2lzdGVyX2RhaSAtIFVucmVnaXN0ZXIgREFJcyBmcm9tIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAZGFpOiBEQUkgdG8gcmVnaXN0ZXIKKyAqIEBjb21wb25lbnQ6IFRoZSBjb21wb25lbnQgZm9yIHdoaWNoIHRoZSBEQUlzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKICAqLwotc3RhdGljIGludCBzbmRfc29jX3JlZ2lzdGVyX2RhaShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYpCitzdGF0aWMgdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyhzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWksICpfZGFpOwogCi0JZGV2X2RiZyhkZXYsICJBU29DOiBkYWkgcmVnaXN0ZXIgJXNcbiIsIGRldl9uYW1lKGRldikpOwotCi0JZGFpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFpKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRhaSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGNyZWF0ZSBEQUkgY29tcG9uZW50IG5hbWUgKi8KLQlkYWktPm5hbWUgPSBmbXRfc2luZ2xlX25hbWUoZGV2LCAmZGFpLT5pZCk7Ci0JaWYgKGRhaS0+bmFtZSA9PSBOVUxMKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRhaSwgX2RhaSwgJmNvbXBvbmVudC0+ZGFpX2xpc3QsIGxpc3QpIHsKKwkJZGV2X2RiZyhjb21wb25lbnQtPmRldiwgIkFTb0M6IFVucmVnaXN0ZXJlZCBEQUkgJyVzJ1xuIiwKKwkJCWRhaS0+bmFtZSk7CisJCWxpc3RfZGVsKCZkYWktPmxpc3QpOworCQlrZnJlZShkYWktPm5hbWUpOwogCQlrZnJlZShkYWkpOwotCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KLQlkYWktPmRldiA9IGRldjsKLQlkYWktPmRyaXZlciA9IGRhaV9kcnY7Ci0JZGFpLT5kYXBtLmRldiA9IGRldjsKLQlpZiAoIWRhaS0+ZHJpdmVyLT5vcHMpCi0JCWRhaS0+ZHJpdmVyLT5vcHMgPSAmbnVsbF9kYWlfb3BzOwotCi0JbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjb2RlY19saXN0LCBsaXN0KSB7Ci0JCWlmIChjb2RlYy0+ZGV2ID09IGRldikgewotCQkJZGV2X2RiZyhkZXYsICJBU29DOiBNYXBwZWQgREFJICVzIHRvIENPREVDICVzXG4iLAotCQkJCWRhaS0+bmFtZSwgY29kZWMtPm5hbWUpOwotCQkJZGFpLT5jb2RlYyA9IGNvZGVjOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWRhaS0+Y29kZWMpCi0JCWRhaS0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKLQotCWxpc3RfYWRkKCZkYWktPmxpc3QsICZkYWlfbGlzdCk7Ci0KLQltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7Ci0KLQlkZXZfZGJnKGRldiwgIkFTb0M6IFJlZ2lzdGVyZWQgREFJICclcydcbiIsIGRhaS0+bmFtZSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBzbmRfc29jX3VucmVnaXN0ZXJfZGFpIC0gVW5yZWdpc3RlciBhIERBSSBmcm9tIHRoZSBBU29DIGNvcmUKKyAqIHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyAtIFJlZ2lzdGVyIGEgREFJIHdpdGggdGhlIEFTb0MgY29yZQogICoKLSAqIEBkYWk6IERBSSB0byB1bnJlZ2lzdGVyCi0gKi8KLXN0YXRpYyB2b2lkIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZkYWlfbGlzdCwgbGlzdCkgewotCQlpZiAoZGV2ID09IGRhaS0+ZGV2KQotCQkJZ290byBmb3VuZDsKLQl9Ci0JcmV0dXJuOwotCi1mb3VuZDoKLQltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwotCWxpc3RfZGVsKCZkYWktPmxpc3QpOwotCW11dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKLQotCWRldl9kYmcoZGV2LCAiQVNvQzogVW5yZWdpc3RlcmVkIERBSSAnJXMnXG4iLCBkYWktPm5hbWUpOwotCWtmcmVlKGRhaS0+bmFtZSk7Ci0Ja2ZyZWUoZGFpKTsKLX0KLQotLyoqCi0gKiBzbmRfc29jX3JlZ2lzdGVyX2RhaXMgLSBSZWdpc3RlciBtdWx0aXBsZSBEQUlzIHdpdGggdGhlIEFTb0MgY29yZQotICoKLSAqIEBkYWk6IEFycmF5IG9mIERBSXMgdG8gcmVnaXN0ZXIKKyAqIEBjb21wb25lbnQ6IFRoZSBjb21wb25lbnQgdGhlIERBSXMgYXJlIHJlZ2lzdGVyZWQgZm9yCisgKiBAY29kZWM6IFRoZSBDT0RFQyB0aGF0IHRoZSBEQUlzIGFyZSByZWdpc3RlcmVkIGZvciwgTlVMTCBpZiB0aGUgY29tcG9uZW50IGlzCisgKiAgICAgICAgIG5vdCBhIENPREVDLgorICogQGRhaV9kcnY6IERBSSBkcml2ZXIgdG8gdXNlIGZvciB0aGUgREFJcwogICogQGNvdW50OiBOdW1iZXIgb2YgREFJcworICogQGxlZ2FjeV9kYWlfbmFtaW5nOiBVc2UgdGhlIGxlZ2FjeSBuYW1pbmcgc2NoZW1lIGFuZCBsZXQgdGhlIERBSSBpbmhlcml0IHRoZQorICogICAgICAgICAgICAgICAgICAgICBwYXJlbnQncyBuYW1lLgogICovCi1zdGF0aWMgaW50IHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgc25kX3NvY19yZWdpc3Rlcl9kYWlzKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50LAorCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydiwKKwlzaXplX3QgY291bnQsIGJvb2wgbGVnYWN5X2RhaV9uYW1pbmcpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbXBvbmVudC0+ZGV2OwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwotCWludCBpLCByZXQgPSAwOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CiAKIAlkZXZfZGJnKGRldiwgIkFTb0M6IGRhaSByZWdpc3RlciAlcyAjJVp1XG4iLCBkZXZfbmFtZShkZXYpLCBjb3VudCk7CiAKQEAgLTM5ODIsNzAgKzM5NjksNTQgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAKLQkJLyogY3JlYXRlIERBSSBjb21wb25lbnQgbmFtZSAqLwotCQlkYWktPm5hbWUgPSBmbXRfbXVsdGlwbGVfbmFtZShkZXYsICZkYWlfZHJ2W2ldKTsKKwkJLyoKKwkJICogQmFjayBpbiB0aGUgb2xkIGRheXMgd2hlbiB3ZSBzdGlsbCBoYWQgY29tcG9uZW50LWxlc3MgREFJcywKKwkJICogaW5zdGVhZCBvZiBoYXZpbmcgYSBzdGF0aWMgbmFtZSwgY29tcG9uZW50LWxlc3MgREFJcyB3b3VsZAorCQkgKiBpbmhlcml0IHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgZGV2aWNlIHNvIGl0IGlzIHBvc3NpYmxlIHRvCisJCSAqIHJlZ2lzdGVyIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgREFJLiBXZSBzdGlsbCBuZWVkIHRvIGtlZXAKKwkJICogdGhlIHNhbWUgbmFtaW5nIHN0eWxlIGV2ZW4gdGhvdWdoIHRob3NlIERBSXMgYXJlIG5vdAorCQkgKiBjb21wb25lbnQtbGVzcyBhbnltb3JlLgorCQkgKi8KKwkJaWYgKGNvdW50ID09IDEgJiYgbGVnYWN5X2RhaV9uYW1pbmcpIHsKKwkJCWRhaS0+bmFtZSA9IGZtdF9zaW5nbGVfbmFtZShkZXYsICZkYWktPmlkKTsKKwkJfSBlbHNlIHsKKwkJCWRhaS0+bmFtZSA9IGZtdF9tdWx0aXBsZV9uYW1lKGRldiwgJmRhaV9kcnZbaV0pOworCQkJaWYgKGRhaV9kcnZbaV0uaWQpCisJCQkJZGFpLT5pZCA9IGRhaV9kcnZbaV0uaWQ7CisJCQllbHNlCisJCQkJZGFpLT5pZCA9IGk7CisJCX0KIAkJaWYgKGRhaS0+bmFtZSA9PSBOVUxMKSB7CiAJCQlrZnJlZShkYWkpOwotCQkJcmV0ID0gLUVJTlZBTDsKKwkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycjsKIAkJfQogCisJCWRhaS0+Y29tcG9uZW50ID0gY29tcG9uZW50OworCQlkYWktPmNvZGVjID0gY29kZWM7CiAJCWRhaS0+ZGV2ID0gZGV2OwogCQlkYWktPmRyaXZlciA9ICZkYWlfZHJ2W2ldOwotCQlpZiAoZGFpLT5kcml2ZXItPmlkKQotCQkJZGFpLT5pZCA9IGRhaS0+ZHJpdmVyLT5pZDsKLQkJZWxzZQotCQkJZGFpLT5pZCA9IGk7CiAJCWRhaS0+ZGFwbS5kZXYgPSBkZXY7CiAJCWlmICghZGFpLT5kcml2ZXItPm9wcykKIAkJCWRhaS0+ZHJpdmVyLT5vcHMgPSAmbnVsbF9kYWlfb3BzOwogCi0JCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJCWlmIChjb2RlYy0+ZGV2ID09IGRldikgewotCQkJCWRldl9kYmcoZGV2LAotCQkJCQkiQVNvQzogTWFwcGVkIERBSSAlcyB0byBDT0RFQyAlc1xuIiwKLQkJCQkJZGFpLT5uYW1lLCBjb2RlYy0+bmFtZSk7Ci0JCQkJZGFpLT5jb2RlYyA9IGNvZGVjOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KIAkJaWYgKCFkYWktPmNvZGVjKQogCQkJZGFpLT5kYXBtLmlkbGVfYmlhc19vZmYgPSAxOwogCi0JCWxpc3RfYWRkKCZkYWktPmxpc3QsICZkYWlfbGlzdCk7CisJCWxpc3RfYWRkKCZkYWktPmxpc3QsICZjb21wb25lbnQtPmRhaV9saXN0KTsKIAotCQltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7Ci0KLQkJZGV2X2RiZyhkYWktPmRldiwgIkFTb0M6IFJlZ2lzdGVyZWQgREFJICclcydcbiIsIGRhaS0+bmFtZSk7CisJCWRldl9kYmcoZGV2LCAiQVNvQzogUmVnaXN0ZXJlZCBEQUkgJyVzJ1xuIiwgZGFpLT5uYW1lKTsKIAl9CiAKIAlyZXR1cm4gMDsKIAogZXJyOgotCWZvciAoaS0tOyBpID49IDA7IGktLSkKLQkJc25kX3NvY191bnJlZ2lzdGVyX2RhaShkZXYpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKGNvbXBvbmVudCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzIC0gVW5yZWdpc3RlciBtdWx0aXBsZSBEQUlzIGZyb20gdGhlIEFTb0MgY29yZQotICoKLSAqIEBkYWk6IEFycmF5IG9mIERBSXMgdG8gdW5yZWdpc3RlcgotICogQGNvdW50OiBOdW1iZXIgb2YgREFJcwotICovCi1zdGF0aWMgdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfZGFpcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKGRldik7Ci19Ci0KLS8qKgogICogc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQgLSBSZWdpc3RlciBhIGNvbXBvbmVudCB3aXRoIHRoZSBBU29DIGNvcmUKICAqCiAgKi8KQEAgLTQwNTMsNiArNDAyNCw3IEBACiBfX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjbXBudCwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciAqY21wbnRfZHJ2LAorCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYsCiAJCQkgICAgIGludCBudW1fZGFpLCBib29sIGFsbG93X3NpbmdsZV9kYWkpCiB7CkBAIC00MDc1LDIwICs0MDQ3LDEwIEBACiAJY21wbnQtPmRyaXZlcgk9IGNtcG50X2RydjsKIAljbXBudC0+ZGFpX2Rydgk9IGRhaV9kcnY7CiAJY21wbnQtPm51bV9kYWkJPSBudW1fZGFpOworCUlOSVRfTElTVF9IRUFEKCZjbXBudC0+ZGFpX2xpc3QpOwogCi0JLyoKLQkgKiBzbmRfc29jX3JlZ2lzdGVyX2RhaSgpICB1c2VzIGZtdF9zaW5nbGVfbmFtZSgpLCBhbmQKLQkgKiBzbmRfc29jX3JlZ2lzdGVyX2RhaXMoKSB1c2VzIGZtdF9tdWx0aXBsZV9uYW1lKCkKLQkgKiBmb3IgZGFpLT5uYW1lIHdoaWNoIGlzIHVzZWQgZm9yIG5hbWUgYmFzZWQgbWF0Y2hpbmcKLQkgKgotCSAqIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIGNwdS9jb2RlYy4KLQkgKiBhbGxvd19zaW5nbGVfZGFpIGZsYWcgY2FuIGlnbm9yZSAiY29kZWMiIGRyaXZlciByZXdvcmtpbmcKLQkgKiBzaW5jZSBpdCBoYWQgYmVlbiB1c2VkIHNuZF9zb2NfcmVnaXN0ZXJfZGFpcygpLAotCSAqLwotCWlmICgoMSA9PSBudW1fZGFpKSAmJiBhbGxvd19zaW5nbGVfZGFpKQotCQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaShkZXYsIGRhaV9kcnYpOwotCWVsc2UKLQkJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWlzKGRldiwgZGFpX2RydiwgbnVtX2RhaSk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWlzKGNtcG50LCBjb2RlYywgZGFpX2RydiwgbnVtX2RhaSwKKwkJYWxsb3dfc2luZ2xlX2RhaSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYsICJBU29DOiBGYWlsZWQgdG8gcmVnc3RlciBEQUlzOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJvcl9jb21wb25lbnRfbmFtZTsKQEAgLTQxMjEsNyArNDA4Myw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXJldHVybiBfX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KGRldiwgY21wbnQsIGNtcG50X2RydiwKKwljbXBudC0+aWdub3JlX3BtZG93bl90aW1lID0gdHJ1ZTsKKworCXJldHVybiBfX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KGRldiwgY21wbnQsIGNtcG50X2RydiwgTlVMTCwKIAkJCQkJICAgIGRhaV9kcnYsIG51bV9kYWksIHRydWUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQpOwpAQCAtNDE0MSw3ICs0MTA1LDcgQEAKIAlyZXR1cm47CiAKIGZvdW5kOgotCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKGRldiwgY21wbnQtPm51bV9kYWkpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKGNtcG50KTsKIAogCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CiAJbGlzdF9kZWwoJmNtcG50LT5saXN0KTsKQEAgLTQzMTksNyArNDI4Myw3IEBACiAJY29kZWMtPnZvbGF0aWxlX3JlZ2lzdGVyID0gY29kZWNfZHJ2LT52b2xhdGlsZV9yZWdpc3RlcjsKIAljb2RlYy0+cmVhZGFibGVfcmVnaXN0ZXIgPSBjb2RlY19kcnYtPnJlYWRhYmxlX3JlZ2lzdGVyOwogCWNvZGVjLT53cml0YWJsZV9yZWdpc3RlciA9IGNvZGVjX2Rydi0+d3JpdGFibGVfcmVnaXN0ZXI7Ci0JY29kZWMtPmlnbm9yZV9wbWRvd25fdGltZSA9IGNvZGVjX2Rydi0+aWdub3JlX3BtZG93bl90aW1lOworCWNvZGVjLT5jb21wb25lbnQuaWdub3JlX3BtZG93bl90aW1lID0gY29kZWNfZHJ2LT5pZ25vcmVfcG1kb3duX3RpbWU7CiAJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJY29kZWMtPmRhcG0uZGV2ID0gZGV2OwogCWNvZGVjLT5kYXBtLmNvZGVjID0gY29kZWM7CkBAIC00MzQyLDcgKzQzMDYsNyBAQAogCS8qIHJlZ2lzdGVyIGNvbXBvbmVudCAqLwogCXJldCA9IF9fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoZGV2LCAmY29kZWMtPmNvbXBvbmVudCwKIAkJCQkJICAgJmNvZGVjX2Rydi0+Y29tcG9uZW50X2RyaXZlciwKLQkJCQkJICAgZGFpX2RydiwgbnVtX2RhaSwgZmFsc2UpOworCQkJCQkgICBjb2RlYywgZGFpX2RydiwgbnVtX2RhaSwgZmFsc2UpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkFTb0M6IEZhaWxlZCB0byByZWdzdGVyIGNvbXBvbmVudDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZmFpbF9jb2RlY19uYW1lOwpAQCAtNDQxNyw2ICs0MzgxLDEyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgc2ltcGxlX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWNyb3Bob25lIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK2ludCBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCisJCQkJCSAgY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGNhcmQtPmRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0czsKKwljb25zdCBjaGFyICp0ZW1wbGF0ZSwgKnduYW1lOworCWludCBpLCBqLCBudW1fd2lkZ2V0cywgcmV0OworCisJbnVtX3dpZGdldHMgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG5wLCBwcm9wbmFtZSk7CisJaWYgKG51bV93aWRnZXRzIDwgMCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSJBU29DOiBQcm9wZXJ0eSAnJXMnIGRvZXMgbm90IGV4aXN0XG4iLAlwcm9wbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobnVtX3dpZGdldHMgJiAxKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkFTb0M6IFByb3BlcnR5ICclcycgbGVuZ3RoIGlzIG5vdCBldmVuXG4iLCBwcm9wbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW51bV93aWRnZXRzIC89IDI7CisJaWYgKCFudW1fd2lkZ2V0cykgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFTb0M6IFByb3BlcnR5ICclcydzIGxlbmd0aCBpcyB6ZXJvXG4iLAorCQkJcHJvcG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3aWRnZXRzID0gZGV2bV9rY2FsbG9jKGNhcmQtPmRldiwgbnVtX3dpZGdldHMsIHNpemVvZigqd2lkZ2V0cyksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCF3aWRnZXRzKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkFTb0M6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpZGdldHNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3dpZGdldHM7IGkrKykgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgcHJvcG5hbWUsCisJCQkyICogaSwgJnRlbXBsYXRlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIkFTb0M6IFByb3BlcnR5ICclcycgaW5kZXggJWQgcmVhZCBlcnJvcjolZFxuIiwKKwkJCQlwcm9wbmFtZSwgMiAqIGksIHJldCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHNpbXBsZV93aWRnZXRzKTsgaisrKSB7CisJCQlpZiAoIXN0cm5jbXAodGVtcGxhdGUsIHNpbXBsZV93aWRnZXRzW2pdLm5hbWUsCisJCQkJICAgICBzdHJsZW4oc2ltcGxlX3dpZGdldHNbal0ubmFtZSkpKSB7CisJCQkJd2lkZ2V0c1tpXSA9IHNpbXBsZV93aWRnZXRzW2pdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGogPj0gQVJSQVlfU0laRShzaW1wbGVfd2lkZ2V0cykpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSJBU29DOiBEQVBNIHdpZGdldCAnJXMnIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJdGVtcGxhdGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgcHJvcG5hbWUsCisJCQkJCQkgICAgKDIgKiBpKSArIDEsCisJCQkJCQkgICAgJnduYW1lKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIkFTb0M6IFByb3BlcnR5ICclcycgaW5kZXggJWQgcmVhZCBlcnJvcjolZFxuIiwKKwkJCQlwcm9wbmFtZSwgKDIgKiBpKSArIDEsIHJldCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXdpZGdldHNbaV0ubmFtZSA9IHduYW1lOworCX0KKworCWNhcmQtPmRhcG1fd2lkZ2V0cyA9IHdpZGdldHM7CisJY2FyZC0+bnVtX2RhcG1fd2lkZ2V0cyA9IG51bV93aWRnZXRzOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKTsKKworaW50IHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3Qoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqc2xvdHMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnNsb3Rfd2lkdGgpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImRhaS10ZG0tc2xvdC1udW0iKSkgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImRhaS10ZG0tc2xvdC1udW0iLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHNsb3RzKQorCQkJKnNsb3RzID0gdmFsOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkYWktdGRtLXNsb3Qtd2lkdGgiKSkgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImRhaS10ZG0tc2xvdC13aWR0aCIsICZ2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoc2xvdF93aWR0aCkKKwkJCSpzbG90X3dpZHRoID0gdmFsOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdCk7CisKIGludCBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCQkgICBjb25zdCBjaGFyICpwcm9wbmFtZSkKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jIGIvc291bmQvc29jL3NvYy1kYXBtLmMKaW5kZXggYjlkYzZhYy4uYzhhNzgwZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1kYXBtLmMKKysrIGIvc291bmQvc29jL3NvYy1kYXBtLmMKQEAgLTcwLDggKzcwLDYgQEAKIAlbc25kX3NvY19kYXBtX2FpZl9vdXRdID0gNCwKIAlbc25kX3NvY19kYXBtX21pY10gPSA1LAogCVtzbmRfc29jX2RhcG1fbXV4XSA9IDYsCi0JW3NuZF9zb2NfZGFwbV92aXJ0X211eF0gPSA2LAotCVtzbmRfc29jX2RhcG1fdmFsdWVfbXV4XSA9IDYsCiAJW3NuZF9zb2NfZGFwbV9kYWNdID0gNywKIAlbc25kX3NvY19kYXBtX3N3aXRjaF0gPSA4LAogCVtzbmRfc29jX2RhcG1fbWl4ZXJdID0gOCwKQEAgLTEwMiw4ICsxMDAsNiBAQAogCVtzbmRfc29jX2RhcG1fbWljXSA9IDcsCiAJW3NuZF9zb2NfZGFwbV9taWNiaWFzXSA9IDgsCiAJW3NuZF9zb2NfZGFwbV9tdXhdID0gOSwKLQlbc25kX3NvY19kYXBtX3ZpcnRfbXV4XSA9IDksCi0JW3NuZF9zb2NfZGFwbV92YWx1ZV9tdXhdID0gOSwKIAlbc25kX3NvY19kYXBtX2FpZl9pbl0gPSAxMCwKIAlbc25kX3NvY19kYXBtX2FpZl9vdXRdID0gMTAsCiAJW3NuZF9zb2NfZGFwbV9kYWlfaW5dID0gMTAsCkBAIC0xMTUsNiArMTExLDEyIEBACiAJW3NuZF9zb2NfZGFwbV9wb3N0XSA9IDE0LAogfTsKIAorc3RhdGljIHZvaWQgZGFwbV9hc3NlcnRfbG9ja2VkKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKK3sKKwlpZiAoZGFwbS0+Y2FyZCAmJiBkYXBtLT5jYXJkLT5pbnN0YW50aWF0ZWQpCisJCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmRhcG0tPmNhcmQtPmRhcG1fbXV0ZXgpOworfQorCiBzdGF0aWMgdm9pZCBwb3Bfd2FpdCh1MzIgcG9wX3RpbWUpCiB7CiAJaWYgKHBvcF90aW1lKQpAQCAtMTQ2LDE1ICsxNDgsMTYgQEAKIAlyZXR1cm4gIWxpc3RfZW1wdHkoJnctPmRpcnR5KTsKIH0KIAotdm9pZCBkYXBtX21hcmtfZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3N0YXRpYyB2b2lkIGRhcG1fbWFya19kaXJ0eShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgY29uc3QgY2hhciAqcmVhc29uKQogeworCWRhcG1fYXNzZXJ0X2xvY2tlZCh3LT5kYXBtKTsKKwogCWlmICghZGFwbV9kaXJ0eV93aWRnZXQodykpIHsKIAkJZGV2X3ZkYmcody0+ZGFwbS0+ZGV2LCAiTWFya2luZyAlcyBkaXJ0eSBkdWUgdG8gJXNcbiIsCiAJCQkgdy0+bmFtZSwgcmVhc29uKTsKIAkJbGlzdF9hZGRfdGFpbCgmdy0+ZGlydHksICZ3LT5kYXBtLT5jYXJkLT5kYXBtX2RpcnR5KTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChkYXBtX21hcmtfZGlydHkpOwogCiB2b2lkIGRhcG1fbWFya19pb19kaXJ0eShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CkBAIC0zNjEsNiArMzY0LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhcmQtPmRhcG1fbXV0ZXgpOworCiAJbWVtc2V0KCZjYXJkLT5kYXBtX3N0YXRzLCAwLCBzaXplb2YoY2FyZC0+ZGFwbV9zdGF0cykpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY2FyZC0+d2lkZ2V0cywgbGlzdCkgewpAQCAtMzg2LDcgKzM5MSw4IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IHNvY193aWRnZXRfd3JpdGUoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCByZWcsIGludCB2YWwpCitzdGF0aWMgaW50IHNvY193aWRnZXRfd3JpdGUoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCByZWcsCisJdW5zaWduZWQgaW50IHZhbCkKIHsKIAlpZiAody0+Y29kZWMpCiAJCXJldHVybiBzbmRfc29jX3dyaXRlKHctPmNvZGVjLCByZWcsIHZhbCk7CkBAIC00OTgsMTE1ICs1MDQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIHNldCB1cCBpbml0aWFsIGNvZGVjIHBhdGhzICovCi1zdGF0aWMgdm9pZCBkYXBtX3NldF9wYXRoX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnAsIGludCBpKQotewotCXN3aXRjaCAody0+aWQpIHsKLQljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6Ci0JY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6Ci0JY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOiB7Ci0JCWludCB2YWw7Ci0JCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPSAoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopCi0JCQl3LT5rY29udHJvbF9uZXdzW2ldLnByaXZhdGVfdmFsdWU7Ci0JCWludCByZWcgPSBtYy0+cmVnOwotCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7Ci0JCWludCBtYXggPSBtYy0+bWF4OwotCQl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwotCi0JCWlmIChyZWcgIT0gU05EX1NPQ19OT1BNKSB7Ci0JCQlzb2Nfd2lkZ2V0X3JlYWQodywgcmVnLCAmdmFsKTsKLQkJCXZhbCA9ICh2YWwgPj4gc2hpZnQpICYgbWFzazsKLQkJCWlmIChpbnZlcnQpCi0JCQkJdmFsID0gbWF4IC0gdmFsOwotCQkJcC0+Y29ubmVjdCA9ICEhdmFsOwotCQl9IGVsc2UgewotCQkJcC0+Y29ubmVjdCA9IDA7Ci0JCX0KLQotCX0KLQlicmVhazsKLQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6IHsKLQkJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKQotCQkJdy0+a2NvbnRyb2xfbmV3c1tpXS5wcml2YXRlX3ZhbHVlOwotCQlpbnQgdmFsLCBpdGVtOwotCi0JCXNvY193aWRnZXRfcmVhZCh3LCBlLT5yZWcsICZ2YWwpOwotCQlpdGVtID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7Ci0KLQkJaWYgKGl0ZW0gPCBlLT5tYXggJiYgIXN0cmNtcChwLT5uYW1lLCBlLT50ZXh0c1tpdGVtXSkpCi0JCQlwLT5jb25uZWN0ID0gMTsKLQkJZWxzZQotCQkJcC0+Y29ubmVjdCA9IDA7Ci0JfQotCWJyZWFrOwotCWNhc2Ugc25kX3NvY19kYXBtX3ZpcnRfbXV4OiB7Ci0JCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKikKLQkJCXctPmtjb250cm9sX25ld3NbaV0ucHJpdmF0ZV92YWx1ZTsKLQotCQlwLT5jb25uZWN0ID0gMDsKLQkJLyogc2luY2UgYSB2aXJ0dWFsIG11eCBoYXMgbm8gYmFja2luZyByZWdpc3RlcnMgdG8KLQkJICogZGVjaWRlIHdoaWNoIHBhdGggdG8gY29ubmVjdCwgaXQgd2lsbCB0cnkgdG8gbWF0Y2gKLQkJICogd2l0aCB0aGUgZmlyc3QgZW51bWVyYXRpb24uICBUaGlzIGlzIHRvIGVuc3VyZQotCQkgKiB0aGF0IHRoZSBkZWZhdWx0IG11eCBjaG9pY2UgKHRoZSBmaXJzdCkgd2lsbCBiZQotCQkgKiBjb3JyZWN0bHkgcG93ZXJlZCB1cCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0JCSAqLwotCQlpZiAoIXN0cmNtcChwLT5uYW1lLCBlLT50ZXh0c1swXSkpCi0JCQlwLT5jb25uZWN0ID0gMTsKLQl9Ci0JYnJlYWs7Ci0JY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OiB7Ci0JCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKikKLQkJCXctPmtjb250cm9sX25ld3NbaV0ucHJpdmF0ZV92YWx1ZTsKLQkJaW50IHZhbCwgaXRlbTsKLQotCQlzb2Nfd2lkZ2V0X3JlYWQodywgZS0+cmVnLCAmdmFsKTsKLQkJdmFsID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7Ci0JCWZvciAoaXRlbSA9IDA7IGl0ZW0gPCBlLT5tYXg7IGl0ZW0rKykgewotCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbaXRlbV0pCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaXRlbSA8IGUtPm1heCAmJiAhc3RyY21wKHAtPm5hbWUsIGUtPnRleHRzW2l0ZW1dKSkKLQkJCXAtPmNvbm5lY3QgPSAxOwotCQllbHNlCi0JCQlwLT5jb25uZWN0ID0gMDsKLQl9Ci0JYnJlYWs7Ci0JLyogZG9lcyBub3QgYWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCi0JY2FzZSBzbmRfc29jX2RhcG1fcGdhOgotCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6Ci0JY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgotCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKLQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKLQljYXNlIHNuZF9zb2NfZGFwbV9zaWdnZW46Ci0JY2FzZSBzbmRfc29jX2RhcG1fZGFjOgotCWNhc2Ugc25kX3NvY19kYXBtX21pY2JpYXM6Ci0JY2FzZSBzbmRfc29jX2RhcG1fdm1pZDoKLQljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6Ci0JY2FzZSBzbmRfc29jX2RhcG1fcmVndWxhdG9yX3N1cHBseToKLQljYXNlIHNuZF9zb2NfZGFwbV9jbG9ja19zdXBwbHk6Ci0JY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgotCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6Ci0JY2FzZSBzbmRfc29jX2RhcG1fZGFpX2luOgotCWNhc2Ugc25kX3NvY19kYXBtX2RhaV9vdXQ6Ci0JY2FzZSBzbmRfc29jX2RhcG1faHA6Ci0JY2FzZSBzbmRfc29jX2RhcG1fbWljOgotCWNhc2Ugc25kX3NvY19kYXBtX3NwazoKLQljYXNlIHNuZF9zb2NfZGFwbV9saW5lOgotCWNhc2Ugc25kX3NvY19kYXBtX2RhaV9saW5rOgotCWNhc2Ugc25kX3NvY19kYXBtX2tjb250cm9sOgotCQlwLT5jb25uZWN0ID0gMTsKLQlicmVhazsKLQkvKiBkb2VzIGFmZmVjdCByb3V0aW5nIC0gZHluYW1pY2FsbHkgY29ubmVjdGVkICovCi0JY2FzZSBzbmRfc29jX2RhcG1fcHJlOgotCWNhc2Ugc25kX3NvY19kYXBtX3Bvc3Q6Ci0JCXAtPmNvbm5lY3QgPSAwOwotCWJyZWFrOwotCX0KLX0KLQogLyogY29ubmVjdCBtdXggd2lkZ2V0IHRvIGl0cyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KIHN0YXRpYyBpbnQgZGFwbV9jb25uZWN0X211eChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCkBAIC02MTQsMTUgKzUxMSwzMyBAQAogCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbCkKIHsKIAlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHZhbCwgaXRlbTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBlLT5tYXg7IGkrKykgeworCWlmIChlLT5yZWcgIT0gU05EX1NPQ19OT1BNKSB7CisJCXNvY193aWRnZXRfcmVhZChkZXN0LCBlLT5yZWcsICZ2YWwpOworCQl2YWwgPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgZS0+bWFzazsKKwkJaXRlbSA9IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShlLCB2YWwpOworCX0gZWxzZSB7CisJCS8qIHNpbmNlIGEgdmlydHVhbCBtdXggaGFzIG5vIGJhY2tpbmcgcmVnaXN0ZXJzIHRvCisJCSAqIGRlY2lkZSB3aGljaCBwYXRoIHRvIGNvbm5lY3QsIGl0IHdpbGwgdHJ5IHRvIG1hdGNoCisJCSAqIHdpdGggdGhlIGZpcnN0IGVudW1lcmF0aW9uLiAgVGhpcyBpcyB0byBlbnN1cmUKKwkJICogdGhhdCB0aGUgZGVmYXVsdCBtdXggY2hvaWNlICh0aGUgZmlyc3QpIHdpbGwgYmUKKwkJICogY29ycmVjdGx5IHBvd2VyZWQgdXAgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorCQkgKi8KKwkJaXRlbSA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGUtPml0ZW1zOyBpKyspIHsKIAkJaWYgKCEoc3RyY21wKGNvbnRyb2xfbmFtZSwgZS0+dGV4dHNbaV0pKSkgewogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZkYXBtLT5jYXJkLT5wYXRocyk7CiAJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CiAJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKIAkJCXBhdGgtPm5hbWUgPSAoY2hhciopZS0+dGV4dHNbaV07Ci0JCQlkYXBtX3NldF9wYXRoX3N0YXR1cyhkZXN0LCBwYXRoLCAwKTsKKwkJCWlmIChpID09IGl0ZW0pCisJCQkJcGF0aC0+Y29ubmVjdCA9IDE7CisJCQllbHNlCisJCQkJcGF0aC0+Y29ubmVjdCA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTYzMCw2ICs1NDUsMzAgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAorLyogc2V0IHVwIGluaXRpYWwgY29kZWMgcGF0aHMgKi8KK3N0YXRpYyB2b2lkIGRhcG1fc2V0X21peGVyX3BhdGhfc3RhdHVzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcCwgaW50IGkpCit7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9IChzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKikKKwkJdy0+a2NvbnRyb2xfbmV3c1tpXS5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwl1bnNpZ25lZCBpbnQgbWF4ID0gbWMtPm1heDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CisJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChyZWcgIT0gU05EX1NPQ19OT1BNKSB7CisJCXNvY193aWRnZXRfcmVhZCh3LCByZWcsICZ2YWwpOworCQl2YWwgPSAodmFsID4+IHNoaWZ0KSAmIG1hc2s7CisJCWlmIChpbnZlcnQpCisJCQl2YWwgPSBtYXggLSB2YWw7CisJCXAtPmNvbm5lY3QgPSAhIXZhbDsKKwl9IGVsc2UgeworCQlwLT5jb25uZWN0ID0gMDsKKwl9Cit9CisKIC8qIGNvbm5lY3QgbWl4ZXIgd2lkZ2V0IHRvIGl0cyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KIHN0YXRpYyBpbnQgZGFwbV9jb25uZWN0X21peGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc3JjLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGVzdCwKQEAgLTY0NCw3ICs1ODMsNyBAQAogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJmRlc3QtPnNvdXJjZXMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmc3JjLT5zaW5rcyk7CiAJCQlwYXRoLT5uYW1lID0gZGVzdC0+a2NvbnRyb2xfbmV3c1tpXS5uYW1lOwotCQkJZGFwbV9zZXRfcGF0aF9zdGF0dXMoZGVzdCwgcGF0aCwgaSk7CisJCQlkYXBtX3NldF9taXhlcl9wYXRoX3N0YXR1cyhkZXN0LCBwYXRoLCBpKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNzIzLDggKzY2Miw2IEBACiAJCQkJa2NuYW1lX2luX2xvbmdfbmFtZSA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6Ci0JCQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQkJCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJCQl3bmFtZV9pbl9sb25nX25hbWUgPSB0cnVlOwogCQkJCWtjbmFtZV9pbl9sb25nX25hbWUgPSBmYWxzZTsKIAkJCQlicmVhazsKQEAgLTE4MjMsNiArMTc2MCw4IEBACiAJQVNZTkNfRE9NQUlOX0VYQ0xVU0lWRShhc3luY19kb21haW4pOwogCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGJpYXM7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYXJkLT5kYXBtX211dGV4KTsKKwogCXRyYWNlX3NuZF9zb2NfZGFwbV9zdGFydChjYXJkKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgewpAQCAtMTg5NywxMCArMTgzNiwxNCBAQAogCiAJdHJhY2Vfc25kX3NvY19kYXBtX3dhbGtfZG9uZShjYXJkKTsKIAotCS8qIFJ1biBhbGwgdGhlIGJpYXMgY2hhbmdlcyBpbiBwYXJhbGxlbCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkKLQkJYXN5bmNfc2NoZWR1bGVfZG9tYWluKGRhcG1fcHJlX3NlcXVlbmNlX2FzeW5jLCBkLAotCQkJCQkmYXN5bmNfZG9tYWluKTsKKwkvKiBSdW4gY2FyZCBiaWFzIGNoYW5nZXMgYXQgZmlyc3QgKi8KKwlkYXBtX3ByZV9zZXF1ZW5jZV9hc3luYygmY2FyZC0+ZGFwbSwgMCk7CisJLyogUnVuIG90aGVyIGJpYXMgY2hhbmdlcyBpbiBwYXJhbGxlbCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgeworCQlpZiAoZCAhPSAmY2FyZC0+ZGFwbSkKKwkJCWFzeW5jX3NjaGVkdWxlX2RvbWFpbihkYXBtX3ByZV9zZXF1ZW5jZV9hc3luYywgZCwKKwkJCQkJCSZhc3luY19kb21haW4pOworCX0KIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsX2RvbWFpbigmYXN5bmNfZG9tYWluKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmRvd25fbGlzdCwgcG93ZXJfbGlzdCkgewpAQCAtMTkyMCwxMCArMTg2MywxNCBAQAogCWRhcG1fc2VxX3J1bihjYXJkLCAmdXBfbGlzdCwgZXZlbnQsIHRydWUpOwogCiAJLyogUnVuIGFsbCB0aGUgYmlhcyBjaGFuZ2VzIGluIHBhcmFsbGVsICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KQotCQlhc3luY19zY2hlZHVsZV9kb21haW4oZGFwbV9wb3N0X3NlcXVlbmNlX2FzeW5jLCBkLAotCQkJCQkmYXN5bmNfZG9tYWluKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGQgIT0gJmNhcmQtPmRhcG0pCisJCQlhc3luY19zY2hlZHVsZV9kb21haW4oZGFwbV9wb3N0X3NlcXVlbmNlX2FzeW5jLCBkLAorCQkJCQkJJmFzeW5jX2RvbWFpbik7CisJfQogCWFzeW5jX3N5bmNocm9uaXplX2Z1bGxfZG9tYWluKCZhc3luY19kb21haW4pOworCS8qIFJ1biBjYXJkIGJpYXMgY2hhbmdlcyBhdCBsYXN0ICovCisJZGFwbV9wb3N0X3NlcXVlbmNlX2FzeW5jKCZjYXJkLT5kYXBtLCAwKTsKIAogCS8qIGRvIHdlIG5lZWQgdG8gbm90aWZ5IGFueSBjbGllbnRzIHRoYXQgREFQTSBldmVudCBpcyBjb21wbGV0ZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgewpAQCAtMjExMCw2ICsyMDU3LDggQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CiAJaW50IGZvdW5kID0gMDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhcmQtPmRhcG1fbXV0ZXgpOworCiAJLyogZmluZCBkYXBtIHdpZGdldCBwYXRoIGFzc29jIHdpdGgga2NvbnRyb2wgKi8KIAlkYXBtX2tjb250cm9sX2Zvcl9lYWNoX3BhdGgocGF0aCwga2NvbnRyb2wpIHsKIAkJaWYgKCFwYXRoLT5uYW1lIHx8ICFlLT50ZXh0c1ttdXhdKQpAQCAtMjE2MCw2ICsyMTA5LDggQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CiAJaW50IGZvdW5kID0gMDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhcmQtPmRhcG1fbXV0ZXgpOworCiAJLyogZmluZCBkYXBtIHdpZGdldCBwYXRoIGFzc29jIHdpdGgga2NvbnRyb2wgKi8KIAlkYXBtX2tjb250cm9sX2Zvcl9lYWNoX3BhdGgocGF0aCwga2NvbnRyb2wpIHsKIAkJZm91bmQgPSAxOwpAQCAtMjMyNSw2ICsyMjc2LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdyA9IGRhcG1fZmluZF93aWRnZXQoZGFwbSwgcGluLCB0cnVlKTsKIAorCWRhcG1fYXNzZXJ0X2xvY2tlZChkYXBtKTsKKwogCWlmICghdykgewogCQlkZXZfZXJyKGRhcG0tPmRldiwgIkFTb0M6IERBUE0gdW5rbm93biBwaW4gJXNcbiIsIHBpbik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjM0MSw2ICsyMjk0LDMwIEBACiB9CiAKIC8qKgorICogc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQgLSBzY2FuIGFuZCBwb3dlciBkYXBtIHBhdGhzCisgKiBAZGFwbTogREFQTSBjb250ZXh0CisgKgorICogV2Fsa3MgYWxsIGRhcG0gYXVkaW8gcGF0aHMgYW5kIHBvd2VycyB3aWRnZXRzIGFjY29yZGluZyB0byB0aGVpcgorICogc3RyZWFtIG9yIHBhdGggdXNhZ2UuCisgKgorICogUmVxdWlyZXMgZXh0ZXJuYWwgbG9ja2luZy4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCit7CisJLyoKKwkgKiBTdXBwcmVzcyBlYXJseSByZXBvcnRzIChlZywgamFja3Mgc3luY2luZyB0aGVpciBzdGF0ZSkgdG8gYXZvaWQKKwkgKiBzaWxseSBEQVBNIHJ1bnMgZHVyaW5nIGNhcmQgc3RhcnR1cC4KKwkgKi8KKwlpZiAoIWRhcG0tPmNhcmQgfHwgIWRhcG0tPmNhcmQtPmluc3RhbnRpYXRlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZGFwbV9wb3dlcl93aWRnZXRzKGRhcG0tPmNhcmQsIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKTsKKworLyoqCiAgKiBzbmRfc29jX2RhcG1fc3luYyAtIHNjYW4gYW5kIHBvd2VyIGRhcG0gcGF0aHMKICAqIEBkYXBtOiBEQVBNIGNvbnRleHQKICAqCkBAIC0yMzUzLDE1ICsyMzMwLDggQEAKIHsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBTdXBwcmVzcyBlYXJseSByZXBvcnRzIChlZywgamFja3Mgc3luY2luZyB0aGVpciBzdGF0ZSkgdG8gYXZvaWQKLQkgKiBzaWxseSBEQVBNIHJ1bnMgZHVyaW5nIGNhcmQgc3RhcnR1cC4KLQkgKi8KLQlpZiAoIWRhcG0tPmNhcmQgfHwgIWRhcG0tPmNhcmQtPmluc3RhbnRpYXRlZCkKLQkJcmV0dXJuIDA7Ci0KIAltdXRleF9sb2NrX25lc3RlZCgmZGFwbS0+Y2FyZC0+ZGFwbV9tdXRleCwgU05EX1NPQ19EQVBNX0NMQVNTX1JVTlRJTUUpOwotCXJldCA9IGRhcG1fcG93ZXJfd2lkZ2V0cyhkYXBtLT5jYXJkLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CisJcmV0ID0gc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXBtLT5jYXJkLT5kYXBtX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQ0NCw4ICsyNDE0LDYgQEAKIAkJcGF0aC0+Y29ubmVjdCA9IDE7CiAJCXJldHVybiAwOwogCWNhc2Ugc25kX3NvY19kYXBtX211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CiAJCXJldCA9IGRhcG1fY29ubmVjdF9tdXgoZGFwbSwgd3NvdXJjZSwgd3NpbmssIHBhdGgsIGNvbnRyb2wsCiAJCQkmd3NpbmstPmtjb250cm9sX25ld3NbMF0pOwogCQlpZiAocmV0ICE9IDApCkBAIC0yNzcyLDggKzI3NDAsNiBAQAogCQkJZGFwbV9uZXdfbWl4ZXIodyk7CiAJCQlicmVhazsKIAkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgotCQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQkJY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgogCQkJZGFwbV9uZXdfbXV4KHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKQEAgLTI5MzUsMTMgKzI5MDEsMjAgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCByZWdfdmFsLCB2YWw7CiAKLQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOwotCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPQotCQkJKHZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7CisJaWYgKGUtPnJlZyAhPSBTTkRfU09DX05PUE0pCisJCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7CisJZWxzZQorCQlyZWdfdmFsID0gZGFwbV9rY29udHJvbF9nZXRfdmFsdWUoa2NvbnRyb2wpOworCisJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbmRfc29jX2VudW1fdmFsX3RvX2l0ZW0oZSwgdmFsKTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X3IpICYgZS0+bWFzazsKKwkJdmFsID0gc25kX3NvY19lbnVtX3ZhbF90b19pdGVtKGUsIHZhbCk7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPSB2YWw7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTYyLDM0ICsyOTM1LDQxIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7CiAJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCB2YWwsIG11eCwgY2hhbmdlOworCXVuc2lnbmVkIGludCAqaXRlbSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW07CisJdW5zaWduZWQgaW50IHZhbCwgY2hhbmdlOwogCXVuc2lnbmVkIGludCBtYXNrOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlIHVwZGF0ZTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKKwlpZiAoaXRlbVswXSA+PSBlLT5pdGVtcykKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbXV4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQl2YWwgPSBtdXggPDwgZS0+c2hpZnRfbDsKKworCXZhbCA9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzBdKSA8PCBlLT5zaGlmdF9sOwogCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7CiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCWlmIChpdGVtWzFdID4gZS0+aXRlbXMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJdmFsIHw9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPDwgZS0+c2hpZnRfcjsKKwkJdmFsIHw9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzFdKSA8PCBlLT5zaGlmdF9sOwogCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKIAl9CiAKIAltdXRleF9sb2NrX25lc3RlZCgmY2FyZC0+ZGFwbV9tdXRleCwgU05EX1NPQ19EQVBNX0NMQVNTX1JVTlRJTUUpOwogCi0JY2hhbmdlID0gc25kX3NvY190ZXN0X2JpdHMoY29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKLQlpZiAoY2hhbmdlKSB7Ci0JCXVwZGF0ZS5rY29udHJvbCA9IGtjb250cm9sOwotCQl1cGRhdGUucmVnID0gZS0+cmVnOwotCQl1cGRhdGUubWFzayA9IG1hc2s7Ci0JCXVwZGF0ZS52YWwgPSB2YWw7Ci0JCWNhcmQtPnVwZGF0ZSA9ICZ1cGRhdGU7CisJaWYgKGUtPnJlZyAhPSBTTkRfU09DX05PUE0pCisJCWNoYW5nZSA9IHNuZF9zb2NfdGVzdF9iaXRzKGNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7CisJZWxzZQorCQljaGFuZ2UgPSBkYXBtX2tjb250cm9sX3NldF92YWx1ZShrY29udHJvbCwgdmFsKTsKIAotCQlyZXQgPSBzb2NfZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKGNhcmQsIGtjb250cm9sLCBtdXgsIGUpOworCWlmIChjaGFuZ2UpIHsKKwkJaWYgKGUtPnJlZyAhPSBTTkRfU09DX05PUE0pIHsKKwkJCXVwZGF0ZS5rY29udHJvbCA9IGtjb250cm9sOworCQkJdXBkYXRlLnJlZyA9IGUtPnJlZzsKKwkJCXVwZGF0ZS5tYXNrID0gbWFzazsKKwkJCXVwZGF0ZS52YWwgPSB2YWw7CisJCQljYXJkLT51cGRhdGUgPSAmdXBkYXRlOworCQl9CisKKwkJcmV0ID0gc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcihjYXJkLCBrY29udHJvbCwgaXRlbVswXSwgZSk7CiAKIAkJY2FyZC0+dXBkYXRlID0gTlVMTDsKIAl9CkBAIC0zMDA0LDE1OCArMjk4NCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKTsKIAogLyoqCi0gKiBzbmRfc29jX2RhcG1fZ2V0X2VudW1fdmlydCAtIEdldCB2aXJ0dWFsIERBUE0gbXV4Ci0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19kYXBtX2dldF9lbnVtX3ZpcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGRhcG1fa2NvbnRyb2xfZ2V0X3ZhbHVlKGtjb250cm9sKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfZW51bV92aXJ0KTsKLQotLyoqCi0gKiBzbmRfc29jX2RhcG1fcHV0X2VudW1fdmlydCAtIFNldCB2aXJ0dWFsIERBUE0gbXV4Ci0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX3ZpcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7Ci0JdW5zaWduZWQgaW50IHZhbHVlOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9Ci0JCShzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgY2hhbmdlOwotCWludCByZXQgPSAwOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj0gZS0+bWF4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2tfbmVzdGVkKCZjYXJkLT5kYXBtX211dGV4LCBTTkRfU09DX0RBUE1fQ0xBU1NfUlVOVElNRSk7Ci0KLQl2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JY2hhbmdlID0gZGFwbV9rY29udHJvbF9zZXRfdmFsdWUoa2NvbnRyb2wsIHZhbHVlKTsKLQlpZiAoY2hhbmdlKQotCQlyZXQgPSBzb2NfZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKGNhcmQsIGtjb250cm9sLCB2YWx1ZSwgZSk7Ci0KLQltdXRleF91bmxvY2soJmNhcmQtPmRhcG1fbXV0ZXgpOwotCi0JaWYgKHJldCA+IDApCi0JCXNvY19kcGNtX3J1bnRpbWVfdXBkYXRlKGNhcmQpOwotCi0JcmV0dXJuIGNoYW5nZTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9wdXRfZW51bV92aXJ0KTsKLQotLyoqCi0gKiBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlIC0gZGFwbSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldAotICoJCQkJCWNhbGxiYWNrCi0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBjb250cm9sLgotICoKLSAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCi0gKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCi0gKi8KLWludCBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV9rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCByZWdfdmFsLCB2YWwsIG11eDsKLQotCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7Ci0JdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOwotCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgewotCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQotCQkJYnJlYWs7Ci0JfQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBtdXg7Ci0JaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7Ci0JCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgewotCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKLQkJCQlicmVhazsKLQkJfQotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gbXV4OwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZSk7Ci0KLS8qKgotICogc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSAtIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBzZXQKLSAqCQkJCQljYWxsYmFjawotICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgotICoKLSAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KLSAqCi0gKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQotICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y2FyZDsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbCwgbXV4LCBjaGFuZ2U7Ci0JdW5zaWduZWQgaW50IG1hc2s7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgdXBkYXRlOwotCWludCByZXQgPSAwOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCXZhbCA9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdXSA8PCBlLT5zaGlmdF9sOwotCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7Ci0JaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJdmFsIHw9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdXSA8PCBlLT5zaGlmdF9yOwotCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKLQl9Ci0KLQltdXRleF9sb2NrX25lc3RlZCgmY2FyZC0+ZGFwbV9tdXRleCwgU05EX1NPQ19EQVBNX0NMQVNTX1JVTlRJTUUpOwotCi0JY2hhbmdlID0gc25kX3NvY190ZXN0X2JpdHMoY29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKLQlpZiAoY2hhbmdlKSB7Ci0JCXVwZGF0ZS5rY29udHJvbCA9IGtjb250cm9sOwotCQl1cGRhdGUucmVnID0gZS0+cmVnOwotCQl1cGRhdGUubWFzayA9IG1hc2s7Ci0JCXVwZGF0ZS52YWwgPSB2YWw7Ci0JCWNhcmQtPnVwZGF0ZSA9ICZ1cGRhdGU7Ci0KLQkJcmV0ID0gc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcihjYXJkLCBrY29udHJvbCwgbXV4LCBlKTsKLQotCQljYXJkLT51cGRhdGUgPSBOVUxMOwotCX0KLQotCW11dGV4X3VubG9jaygmY2FyZC0+ZGFwbV9tdXRleCk7Ci0KLQlpZiAocmV0ID4gMCkKLQkJc29jX2RwY21fcnVudGltZV91cGRhdGUoY2FyZCk7Ci0KLQlyZXR1cm4gY2hhbmdlOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSk7Ci0KLS8qKgogICogc25kX3NvY19kYXBtX2luZm9fcGluX3N3aXRjaCAtIEluZm8gZm9yIGEgcGluIHN3aXRjaAogICoKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbApAQCAtMzI4Myw4ICszMTExLDYgQEAKIAkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7CiAJCWJyZWFrOwogCWNhc2Ugc25kX3NvY19kYXBtX211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKLQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CiAJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwogCQlicmVhazsKIAljYXNlIHNuZF9zb2NfZGFwbV9kYWlfb3V0OgpAQCAtNDA5OCw3ICszOTI0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9mcmVlKTsKIAotc3RhdGljIHZvaWQgc29jX2RhcG1fc2h1dGRvd25fY29kZWMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQorc3RhdGljIHZvaWQgc29jX2RhcG1fc2h1dGRvd25fZGFwbShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CkBAIC00MTM4LDE0ICszOTY0LDIxIEBACiAgKi8KIHZvaWQgc25kX3NvY19kYXBtX3NodXRkb3duKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjYXJkLT5jb2RlY19kZXZfbGlzdCwgY2FyZF9saXN0KSB7Ci0JCXNvY19kYXBtX3NodXRkb3duX2NvZGVjKCZjb2RlYy0+ZGFwbSk7Ci0JCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZKQotCQkJc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKCZjb2RlYy0+ZGFwbSwKLQkJCQkJCSAgICBTTkRfU09DX0JJQVNfT0ZGKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhcG0sICZjYXJkLT5kYXBtX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGRhcG0gIT0gJmNhcmQtPmRhcG0pIHsKKwkJCXNvY19kYXBtX3NodXRkb3duX2RhcG0oZGFwbSk7CisJCQlpZiAoZGFwbS0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCQlzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoZGFwbSwKKwkJCQkJCQkgICAgU05EX1NPQ19CSUFTX09GRik7CisJCX0KIAl9CisKKwlzb2NfZGFwbV9zaHV0ZG93bl9kYXBtKCZjYXJkLT5kYXBtKTsKKwlpZiAoY2FyZC0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZKQorCQlzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoJmNhcmQtPmRhcG0sCisJCQkJCSAgICBTTkRfU09DX0JJQVNfT0ZGKTsKIH0KIAogLyogTW9kdWxlIGluZm9ybWF0aW9uICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWlvLmMgYi9zb3VuZC9zb2Mvc29jLWlvLmMKaW5kZXggYWE4ODZjYy4uMjYwZWZjOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1pby5jCisrKyBiL3NvdW5kL3NvYy9zb2MtaW8uYwpAQCAtMjMsMjEgKzIzLDYgQEAKIHN0YXRpYyBpbnQgaHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewotCWludCByZXQ7Ci0KLQlpZiAoIXNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykgJiYKLQkgICAgcmVnIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgJiYKLQkgICAgIWNvZGVjLT5jYWNoZV9ieXBhc3MpIHsKLQkJcmV0ID0gc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgcmVnLCB2YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjb2RlYy0+Y2FjaGVfb25seSkgewotCQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQogCXJldHVybiByZWdtYXBfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnLCB2YWx1ZSk7CiB9CiAKQEAgLTQ2LDMyICszMSwxOCBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCWlmIChyZWcgPj0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgfHwKLQkgICAgc25kX3NvY19jb2RlY192b2xhdGlsZV9yZWdpc3Rlcihjb2RlYywgcmVnKSB8fAotCSAgICBjb2RlYy0+Y2FjaGVfYnlwYXNzKSB7Ci0JCWlmIChjb2RlYy0+Y2FjaGVfb25seSkKLQkJCXJldHVybiAtMTsKLQotCQlyZXQgPSByZWdtYXBfcmVhZChjb2RlYy0+Y29udHJvbF9kYXRhLCByZWcsICZ2YWwpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXR1cm4gdmFsOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19jYWNoZV9yZWFkKGNvZGVjLCByZWcsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IHJlZ21hcF9yZWFkKGNvZGVjLT5jb250cm9sX2RhdGEsIHJlZywgJnZhbCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gdmFsOworCWVsc2UKIAkJcmV0dXJuIC0xOwotCXJldHVybiB2YWw7CiB9CiAKIC8qKgogICogc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW86IFNldCB1cCBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLgogICoKICAqIEBjb2RlYzogQ09ERUMgdG8gY29uZmlndXJlLgotICogQGFkZHJfYml0czogTnVtYmVyIG9mIGJpdHMgb2YgcmVnaXN0ZXIgYWRkcmVzcyBkYXRhLgotICogQGRhdGFfYml0czogTnVtYmVyIG9mIGJpdHMgb2YgZGF0YSBwZXIgcmVnaXN0ZXIuCi0gKiBAY29udHJvbDogQ29udHJvbCBidXMgdXNlZC4KKyAqIEBtYXA6IFJlZ2lzdGVyIG1hcCB0byB3cml0ZSB0bwogICoKICAqIFJlZ2lzdGVyIGZvcm1hdHMgYXJlIGZyZXF1ZW50bHkgc2hhcmVkIGJldHdlZW4gbWFueSBJMkMgYW5kIFNQSQogICogZGV2aWNlcy4gIEluIG9yZGVyIHRvIHByb21vdGUgY29kZSByZXVzZSB0aGUgQVNvQyBjb3JlIHByb3ZpZGVzCkBAIC04NSw2MCArNTYsMzYgQEAKICAqIHZvbGF0aWxlIHJlZ2lzdGVycy4KICAqLwogaW50IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgICAgICBpbnQgYWRkcl9iaXRzLCBpbnQgZGF0YV9iaXRzLAotCQkJICAgICAgIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbCkKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7Ci0Jc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnOwogCWludCByZXQ7CiAKLQltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCS8qIERldmljZSBoYXMgbWFkZSBpdHMgb3duIHJlZ21hcCBhcnJhbmdlbWVudHMgKi8KKwlpZiAoIXJlZ21hcCkKKwkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYsIE5VTEwpOworCWVsc2UKKwkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IHJlZ21hcDsKKworCWlmIChJU19FUlIoY29kZWMtPmNvbnRyb2xfZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGNvZGVjLT5jb250cm9sX2RhdGEpOworCiAJY29kZWMtPndyaXRlID0gaHdfd3JpdGU7CiAJY29kZWMtPnJlYWQgPSBod19yZWFkOwogCi0JY29uZmlnLnJlZ19iaXRzID0gYWRkcl9iaXRzOwotCWNvbmZpZy52YWxfYml0cyA9IGRhdGFfYml0czsKKwlyZXQgPSByZWdtYXBfZ2V0X3ZhbF9ieXRlcyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwkvKiBFcnJvcnMgYXJlIGxlZ2l0aW1hdGUgZm9yIG5vbi1pbnRlZ2VyIGJ5dGUKKwkgKiBtdWx0aXBsZXMgKi8KKwlpZiAocmV0ID4gMCkKKwkJY29kZWMtPnZhbF9ieXRlcyA9IHJldDsKIAotCXN3aXRjaCAoY29udHJvbCkgewotI2lmIElTX0VOQUJMRUQoQ09ORklHX1JFR01BUF9JMkMpCi0JY2FzZSBTTkRfU09DX0kyQzoKLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IHJlZ21hcF9pbml0X2kyYyh0b19pMmNfY2xpZW50KGNvZGVjLT5kZXYpLAotCQkJCQkJICAgICAgJmNvbmZpZyk7Ci0JCWJyZWFrOwotI2VuZGlmCisJY29kZWMtPnVzaW5nX3JlZ21hcCA9IHRydWU7CiAKLSNpZiBJU19FTkFCTEVEKENPTkZJR19SRUdNQVBfU1BJKQotCWNhc2UgU05EX1NPQ19TUEk6Ci0JCWNvZGVjLT5jb250cm9sX2RhdGEgPSByZWdtYXBfaW5pdF9zcGkodG9fc3BpX2RldmljZShjb2RlYy0+ZGV2KSwKLQkJCQkJCSAgICAgICZjb25maWcpOwotCQlicmVhazsKLSNlbmRpZgotCi0JY2FzZSBTTkRfU09DX1JFR01BUDoKLQkJLyogRGV2aWNlIGhhcyBtYWRlIGl0cyBvd24gcmVnbWFwIGFycmFuZ2VtZW50cyAqLwotCQljb2RlYy0+dXNpbmdfcmVnbWFwID0gdHJ1ZTsKLQkJaWYgKCFjb2RlYy0+Y29udHJvbF9kYXRhKQotCQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfcmVnbWFwKGNvZGVjLT5kZXYsIE5VTEwpOwotCi0JCWlmIChjb2RlYy0+Y29udHJvbF9kYXRhKSB7Ci0JCQlyZXQgPSByZWdtYXBfZ2V0X3ZhbF9ieXRlcyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKLQkJCS8qIEVycm9ycyBhcmUgbGVnaXRpbWF0ZSBmb3Igbm9uLWludGVnZXIgYnl0ZQotCQkJICogbXVsdGlwbGVzICovCi0JCQlpZiAocmV0ID4gMCkKLQkJCQljb2RlYy0+dmFsX2J5dGVzID0gcmV0OwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKTsKICNlbHNlCiBpbnQgc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBhZGRyX2JpdHMsIGludCBkYXRhX2JpdHMsCi0JCQkgICAgICAgZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sKQorCQkJICAgICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKIAlyZXR1cm4gLUVOT1RTVVBQOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1qYWNrLmMgYi9zb3VuZC9zb2Mvc29jLWphY2suYwppbmRleCAyM2Q0M2RhLi5iOTAzZjgyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWphY2suYworKysgYi9zb3VuZC9zb2Mvc29jLWphY2suYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCXJlcG9ydCA9IDA7CiAKIAlpZiAoZ3Bpby0+amFja19zdGF0dXNfY2hlY2spCi0JCXJlcG9ydCA9IGdwaW8tPmphY2tfc3RhdHVzX2NoZWNrKCk7CisJCXJlcG9ydCA9IGdwaW8tPmphY2tfc3RhdHVzX2NoZWNrKGdwaW8tPmRhdGEpOwogCiAJc25kX3NvY19qYWNrX3JlcG9ydChqYWNrLCByZXBvcnQsIGdwaW8tPnJlcG9ydCk7CiB9CkBAIC0zNDIsNyArMzQyLDggQEAKIAkJZ3Bpb19leHBvcnQoZ3Bpb3NbaV0uZ3BpbywgZmFsc2UpOwogCiAJCS8qIFVwZGF0ZSBpbml0aWFsIGphY2sgc3RhdHVzICovCi0JCXNuZF9zb2NfamFja19ncGlvX2RldGVjdCgmZ3Bpb3NbaV0pOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmdwaW9zW2ldLndvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhncGlvc1tpXS5kZWJvdW5jZV90aW1lKSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLXBjbS5jIGIvc291bmQvc29jL3NvYy1wY20uYwppbmRleCAyODUyMmJkLi4yY2VkZjA5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKQEAgLTM1LDYgKzM1LDg2IEBACiAjZGVmaW5lIERQQ01fTUFYX0JFX1VTRVJTCTgKIAogLyoqCisgKiBzbmRfc29jX3J1bnRpbWVfYWN0aXZhdGUoKSAtIEluY3JlbWVudCBhY3RpdmUgY291bnQgZm9yIFBDTSBydW50aW1lIGNvbXBvbmVudHMKKyAqIEBydGQ6IEFTb0MgUENNIHJ1bnRpbWUgdGhhdCBpcyBhY3RpdmF0ZWQKKyAqIEBzdHJlYW06IERpcmVjdGlvbiBvZiB0aGUgUENNIHN0cmVhbQorICoKKyAqIEluY3JlbWVudHMgdGhlIGFjdGl2ZSBjb3VudCBmb3IgYWxsIHRoZSBEQUlzIGFuZCBjb21wb25lbnRzIGF0dGFjaGVkIHRvIGEgUENNCisgKiBydW50aW1lLiBTaG91bGQgdHlwaWNhbGx5IGJlIGNhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIG9wZW5lZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBydGQtPnBjbV9tdXRleCBiZWluZyBoZWxkCisgKi8KK3ZvaWQgc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsIGludCBzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZydGQtPnBjbV9tdXRleCk7CisKKwlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlKys7CisJCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlKys7CisJfSBlbHNlIHsKKwkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKKwkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOworCX0KKworCWNwdV9kYWktPmFjdGl2ZSsrOworCWNvZGVjX2RhaS0+YWN0aXZlKys7CisJY3B1X2RhaS0+Y29tcG9uZW50LT5hY3RpdmUrKzsKKwljb2RlY19kYWktPmNvbXBvbmVudC0+YWN0aXZlKys7Cit9CisKKy8qKgorICogc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUoKSAtIERlY3JlbWVudCBhY3RpdmUgY291bnQgZm9yIFBDTSBydW50aW1lIGNvbXBvbmVudHMKKyAqIEBydGQ6IEFTb0MgUENNIHJ1bnRpbWUgdGhhdCBpcyBkZWFjdGl2YXRlZAorICogQHN0cmVhbTogRGlyZWN0aW9uIG9mIHRoZSBQQ00gc3RyZWFtCisgKgorICogRGVjcmVtZW50cyB0aGUgYWN0aXZlIGNvdW50IGZvciBhbGwgdGhlIERBSXMgYW5kIGNvbXBvbmVudHMgYXR0YWNoZWQgdG8gYSBQQ00KKyAqIHJ1bnRpbWUuIFNob3VsZCB0eXBpY2FsbHkgYmUgY2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgY2xvc2VkLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJ0ZC0+cGNtX211dGV4IGJlaW5nIGhlbGQKKyAqLwordm9pZCBzbmRfc29jX3J1bnRpbWVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcnRkLT5wY21fbXV0ZXgpOworCisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZS0tOworCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZS0tOworCX0gZWxzZSB7CisJCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlLS07CisJCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKKwl9CisKKwljcHVfZGFpLT5hY3RpdmUtLTsKKwljb2RlY19kYWktPmFjdGl2ZS0tOworCWNwdV9kYWktPmNvbXBvbmVudC0+YWN0aXZlLS07CisJY29kZWNfZGFpLT5jb21wb25lbnQtPmFjdGl2ZS0tOworfQorCisvKioKKyAqIHNuZF9zb2NfcnVudGltZV9pZ25vcmVfcG1kb3duX3RpbWUoKSAtIENoZWNrIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBwb3dlciBkb3duIGRlbGF5CisgKiBAcnRkOiBUaGUgQVNvQyBQQ00gcnVudGltZSB0aGF0IHNob3VsZCBiZSBjaGVja2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIHBvd2VyIGRvd24gZGVsYXkgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGEKKyAqIHNwZWNpZmljIFBDTSBydW50aW1lLiBSZXR1cm5zIHRydWUgaWYgdGhlIGRlbGF5IGlzIDAsIGlmIGl0IHRoZSBEQUkgbGluayBoYXMKKyAqIGJlZW4gY29uZmlndXJlZCB0byBpZ25vcmUgdGhlIGRlbGF5LCBvciBpZiBub25lIG9mIHRoZSBjb21wb25lbnRzIGJlbmVmaXRzCisgKiBmcm9tIGhhdmluZyB0aGUgZGVsYXkuCisgKi8KK2Jvb2wgc25kX3NvY19ydW50aW1lX2lnbm9yZV9wbWRvd25fdGltZShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCWlmICghcnRkLT5wbWRvd25fdGltZSB8fCBydGQtPmRhaV9saW5rLT5pZ25vcmVfcG1kb3duX3RpbWUpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIHJ0ZC0+Y3B1X2RhaS0+Y29tcG9uZW50LT5pZ25vcmVfcG1kb3duX3RpbWUgJiYKKwkJCXJ0ZC0+Y29kZWNfZGFpLT5jb21wb25lbnQtPmlnbm9yZV9wbWRvd25fdGltZTsKK30KKworLyoqCiAgKiBzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zIC0gc2V0IHRoZSBydW50aW1lIGhhcmR3YXJlIHBhcmFtZXRlcnMKICAqIEBzdWJzdHJlYW06IHRoZSBwY20gc3Vic3RyZWFtCiAgKiBAaHc6IHRoZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCkBAIC0zNzgsMTYgKzQ1OCw5IEBACiAJCSBydW50aW1lLT5ody5yYXRlX21heCk7CiAKIGR5bmFtaWM6Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JfSBlbHNlIHsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOwotCX0KLQljcHVfZGFpLT5hY3RpdmUrKzsKLQljb2RlY19kYWktPmFjdGl2ZSsrOwotCXJ0ZC0+Y29kZWMtPmFjdGl2ZSsrOworCisJc25kX3NvY19ydW50aW1lX2FjdGl2YXRlKHJ0ZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCiAJbXV0ZXhfdW5sb2NrKCZydGQtPnBjbV9tdXRleCk7CiAJcmV0dXJuIDA7CiAKQEAgLTQ1OSwyMSArNTMyLDEwIEBACiAJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCiAJbXV0ZXhfbG9ja19uZXN0ZWQoJnJ0ZC0+cGNtX211dGV4LCBydGQtPnBjbV9zdWJjbGFzcyk7CiAKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlLS07Ci0JfQotCi0JY3B1X2RhaS0+YWN0aXZlLS07Ci0JY29kZWNfZGFpLT5hY3RpdmUtLTsKLQljb2RlYy0+YWN0aXZlLS07CisJc25kX3NvY19ydW50aW1lX2RlYWN0aXZhdGUocnRkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CiAKIAkvKiBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBEQUlzIHJhdGUgd2hlbiBpbmFjdGl2ZSAqLwogCWlmICghY3B1X2RhaS0+YWN0aXZlKQpAQCAtNDk2LDggKzU1OCw3IEBACiAJY3B1X2RhaS0+cnVudGltZSA9IE5VTEw7CiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlpZiAoIXJ0ZC0+cG1kb3duX3RpbWUgfHwgY29kZWMtPmlnbm9yZV9wbWRvd25fdGltZSB8fAotCQkgICAgcnRkLT5kYWlfbGluay0+aWdub3JlX3BtZG93bl90aW1lKSB7CisJCWlmIChzbmRfc29jX3J1bnRpbWVfaWdub3JlX3BtZG93bl90aW1lKHJ0ZCkpIHsKIAkJCS8qIHBvd2VyZWQgZG93biBwbGF5YmFjayBzdHJlYW0gbm93ICovCiAJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKIAkJCQkJCSAgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKQEAgLTE5ODksNyArMjA1MCw2IEBACiAKIAkJcGF0aHMgPSBkcGNtX3BhdGhfZ2V0KGZlLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmbGlzdCk7CiAJCWlmIChwYXRocyA8IDApIHsKLQkJCWRwY21fcGF0aF9wdXQoJmxpc3QpOwogCQkJZGV2X3dhcm4oZmUtPmRldiwgIkFTb0M6ICVzIG5vIHZhbGlkICVzIHBhdGhcbiIsCiAJCQkJCWZlLT5kYWlfbGluay0+bmFtZSwgICJwbGF5YmFjayIpOwogCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5tdXRleCk7CkBAIC0yMDE5LDcgKzIwNzksNiBAQAogCiAJCXBhdGhzID0gZHBjbV9wYXRoX2dldChmZSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmbGlzdCk7CiAJCWlmIChwYXRocyA8IDApIHsKLQkJCWRwY21fcGF0aF9wdXQoJmxpc3QpOwogCQkJZGV2X3dhcm4oZmUtPmRldiwgIkFTb0M6ICVzIG5vIHZhbGlkICVzIHBhdGhcbiIsCiAJCQkJCWZlLT5kYWlfbGluay0+bmFtZSwgICJjYXB0dXJlIik7CiAJCQltdXRleF91bmxvY2soJmNhcmQtPm11dGV4KTsKQEAgLTIwODQsNyArMjE0Myw2IEBACiAJZmUtPmRwY21bc3RyZWFtXS5ydW50aW1lID0gZmVfc3Vic3RyZWFtLT5ydW50aW1lOwogCiAJaWYgKGRwY21fcGF0aF9nZXQoZmUsIHN0cmVhbSwgJmxpc3QpIDw9IDApIHsKLQkJZHBjbV9wYXRoX3B1dCgmbGlzdCk7CiAJCWRldl9kYmcoZmUtPmRldiwgIkFTb0M6ICVzIG5vIHZhbGlkICVzIHJvdXRlXG4iLAogCQkJZmUtPmRhaV9saW5rLT5uYW1lLCBzdHJlYW0gPyAiY2FwdHVyZSIgOiAicGxheWJhY2siKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc3BlYXIvc3BkaWZfb3V0LmMgYi9zb3VuZC9zb2Mvc3BlYXIvc3BkaWZfb3V0LmMKaW5kZXggZmU5OWY0Ni4uMTljY2EwNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NwZWFyL3NwZGlmX291dC5jCisrKyBiL3NvdW5kL3NvYy9zcGVhci9zcGRpZl9vdXQuYwpAQCAtMjEzLDEwICsyMTMsNyBAQAogc3RhdGljIGludCBzcGRpZl9tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gY2FyZC0+cnRkOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHNwZGlmX291dF9kZXYgKmhvc3QgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaG9zdC0+c2F2ZWRfcGFyYW1zLm11dGU7CkBAIC0yMjYsMTAgKzIyMyw3IEBACiBzdGF0aWMgaW50IHNwZGlmX211dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jYXJkOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBjYXJkLT5ydGQ7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3Qgc3BkaWZfb3V0X2RldiAqaG9zdCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwogCiAJaWYgKGhvc3QtPnNhdmVkX3BhcmFtcy5tdXRlID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL0tjb25maWcgYi9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZwppbmRleCA5ZjljMTg1Li4zMTE5OGNmNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL0tjb25maWcKKysrIGIvc291bmQvc29jL3RlZ3JhL0tjb25maWcKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgVHJpbVNsaWNlIGJvYXJkIgogCWRlcGVuZHMgb24gU05EX1NPQ19URUdSQSAmJiBJMkMKIAlzZWxlY3QgU05EX1NPQ19URUdSQTIwX0kyUyBpZiBBUkNIX1RFR1JBXzJ4X1NPQwotCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjNfSTJDCiAJaGVscAogCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gdGhlCiAJICBUcmltU2xpY2UgcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmMKaW5kZXggY2Y1ZTFjZi4uM2IwZmExMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2FjOTcuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4KIAotI2luY2x1ZGUgInRlZ3JhX2Fzb2NfdXRpbHMuaCIKICNpbmNsdWRlICJ0ZWdyYTIwX2FjOTcuaCIKIAogI2RlZmluZSBEUlZfTkFNRSAidGVncmEyMC1hYzk3IgpAQCAtMzA2LDcgKzMwNSw3IEBACiAJLnJlYWRhYmxlX3JlZyA9IHRlZ3JhMjBfYWM5N193cl9yZF9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IHRlZ3JhMjBfYWM5N192b2xhdGlsZV9yZWcsCiAJLnByZWNpb3VzX3JlZyA9IHRlZ3JhMjBfYWM5N19wcmVjaW91c19yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIGludCB0ZWdyYTIwX2FjOTdfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM3NiwxOCArMzc1LDEwIEBACiAJYWM5Ny0+cGxheWJhY2tfZG1hX2RhdGEuYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOwogCWFjOTctPnBsYXliYWNrX2RtYV9kYXRhLm1heGJ1cnN0ID0gNDsKIAotCXJldCA9IHRlZ3JhX2Fzb2NfdXRpbHNfaW5pdCgmYWM5Ny0+dXRpbF9kYXRhLCAmcGRldi0+ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9jbGtfcHV0OwotCi0JcmV0ID0gdGVncmFfYXNvY191dGlsc19zZXRfYWM5N19yYXRlKCZhYzk3LT51dGlsX2RhdGEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2Fzb2NfdXRpbHNfZmluaTsKLQogCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhYzk3LT5jbGtfYWM5Nyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjbGtfZW5hYmxlIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2Fzb2NfdXRpbHNfZmluaTsKKwkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gc25kX3NvY19zZXRfYWM5N19vcHMoJnRlZ3JhMjBfYWM5N19vcHMpOwpAQCAtNDE5LDggKzQxMCw2IEBACiAJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKIGVycl9jbGtfZGlzYWJsZV91bnByZXBhcmU6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFjOTctPmNsa19hYzk3KTsKLWVycl9hc29jX3V0aWxzX2Zpbmk6Ci0JdGVncmFfYXNvY191dGlsc19maW5pKCZhYzk3LT51dGlsX2RhdGEpOwogZXJyX2Nsa19wdXQ6CiBlcnI6CiAJc25kX3NvY19zZXRfYWM5N19vcHMoTlVMTCk7CkBAIC00MzQsOCArNDIzLDYgQEAKIAl0ZWdyYV9wY21fcGxhdGZvcm1fdW5yZWdpc3RlcigmcGRldi0+ZGV2KTsKIAlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOwogCi0JdGVncmFfYXNvY191dGlsc19maW5pKCZhYzk3LT51dGlsX2RhdGEpOwotCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFjOTctPmNsa19hYzk3KTsKIAogCXNuZF9zb2Nfc2V0X2FjOTdfb3BzKE5VTEwpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5oIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfYWM5Ny5oCmluZGV4IDRhY2IzYWEuLjBhMzlkODIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2FjOTcuaAorKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9hYzk3LmgKQEAgLTkwLDYgKzkwLDUgQEAKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJaW50IHJlc2V0X2dwaW87CiAJaW50IHN5bmNfZ3BpbzsKLQlzdHJ1Y3QgdGVncmFfYXNvY191dGlsc19kYXRhIHV0aWxfZGF0YTsKIH07CiAjZW5kaWYgLyogX19URUdSQTIwX0FDOTdfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9kYXMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2Rhcy5jCmluZGV4IGU3MjM5MjkuLmE2MzRmMTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2Rhcy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2Rhcy5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkubWF4X3JlZ2lzdGVyID0gTEFTVF9SRUcoREFDX0lOUFVUX0RBVEFfQ0xLX1NFTCksCiAJLndyaXRlYWJsZV9yZWcgPSB0ZWdyYTIwX2Rhc193cl9yZF9yZWcsCiAJLnJlYWRhYmxlX3JlZyA9IHRlZ3JhMjBfZGFzX3dyX3JkX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgaW50IHRlZ3JhMjBfZGFzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9pMnMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2kycy5jCmluZGV4IDQyYzFmNmIuLjc5YTk5MzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2kycy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX2kycy5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkucmVhZGFibGVfcmVnID0gdGVncmEyMF9pMnNfd3JfcmRfcmVnLAogCS52b2xhdGlsZV9yZWcgPSB0ZWdyYTIwX2kyc192b2xhdGlsZV9yZWcsCiAJLnByZWNpb3VzX3JlZyA9IHRlZ3JhMjBfaTJzX3ByZWNpb3VzX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgaW50IHRlZ3JhMjBfaTJzX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9zcGRpZi5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMjBfc3BkaWYuYwppbmRleCA4YzdjMTAyLi5hMGNlOTI0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmEyMF9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTIwX3NwZGlmLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTIwX3NwZGlmX3dyX3JkX3JlZywKIAkudm9sYXRpbGVfcmVnID0gdGVncmEyMF9zcGRpZl92b2xhdGlsZV9yZWcsCiAJLnByZWNpb3VzX3JlZyA9IHRlZ3JhMjBfc3BkaWZfcHJlY2lvdXNfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyBpbnQgdGVncmEyMF9zcGRpZl9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfYWh1Yi5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfYWh1Yi5jCmluZGV4IGQ2ZjRjOTkuLjBkYjY4ZjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2FodWIuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmEzMF9haHViLmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTMwX2FodWJfYXBiaWZfd3JfcmRfcmVnLAogCS52b2xhdGlsZV9yZWcgPSB0ZWdyYTMwX2FodWJfYXBiaWZfdm9sYXRpbGVfcmVnLAogCS5wcmVjaW91c19yZWcgPSB0ZWdyYTMwX2FodWJfYXBiaWZfcHJlY2lvdXNfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyBib29sIHRlZ3JhMzBfYWh1Yl9haHViX3dyX3JkX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCkBAIC00OTAsNyArNDkwLDcgQEAKIAkubWF4X3JlZ2lzdGVyID0gTEFTVF9SRUcoQVVESU9fUlgpLAogCS53cml0ZWFibGVfcmVnID0gdGVncmEzMF9haHViX2FodWJfd3JfcmRfcmVnLAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTMwX2FodWJfYWh1Yl93cl9yZF9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIHN0cnVjdCB0ZWdyYTMwX2FodWJfc29jX2RhdGEgc29jX2RhdGFfdGVncmEzMCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYTMwX2kycy5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfaTJzLmMKaW5kZXggNDlhZDkzNi4uZjE0NmM0MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfaTJzLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhMzBfaTJzLmMKQEAgLTM1Nyw3ICszNTcsNyBAQAogCS53cml0ZWFibGVfcmVnID0gdGVncmEzMF9pMnNfd3JfcmRfcmVnLAogCS5yZWFkYWJsZV9yZWcgPSB0ZWdyYTMwX2kyc193cl9yZF9yZWcsCiAJLnZvbGF0aWxlX3JlZyA9IHRlZ3JhMzBfaTJzX3ZvbGF0aWxlX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhMzBfaTJzX3NvY19kYXRhIHRlZ3JhMzBfaTJzX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTk3MTIuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTk3MTIuYwppbmRleCA0NWI1Nzg5Li4yNWE3ZjgyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfd205NzEyLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtOTcxMi5jCkBAIC0yOSwxMCArMjksMTMgQEAKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKKyNpbmNsdWRlICJ0ZWdyYV9hc29jX3V0aWxzLmgiCisKICNkZWZpbmUgRFJWX05BTUUgInRlZ3JhLXNuZC13bTk3MTIiCiAKIHN0cnVjdCB0ZWdyYV93bTk3MTIgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvZGVjOworCXN0cnVjdCB0ZWdyYV9hc29jX3V0aWxzX2RhdGEgdXRpbF9kYXRhOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHRlZ3JhX3dtOTcxMl9kYXBtX3dpZGdldHNbXSA9IHsKQEAgLTExOCwxNSArMTIxLDI1IEBACiAKIAl0ZWdyYV93bTk3MTJfZGFpLnBsYXRmb3JtX29mX25vZGUgPSB0ZWdyYV93bTk3MTJfZGFpLmNwdV9vZl9ub2RlOwogCisJcmV0ID0gdGVncmFfYXNvY191dGlsc19pbml0KCZtYWNoaW5lLT51dGlsX2RhdGEsICZwZGV2LT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gY29kZWNfdW5yZWdpc3RlcjsKKworCXJldCA9IHRlZ3JhX2Fzb2NfdXRpbHNfc2V0X2FjOTdfcmF0ZSgmbWFjaGluZS0+dXRpbF9kYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGFzb2NfdXRpbHNfZmluaTsKKwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgKCVkKVxuIiwKIAkJCXJldCk7Ci0JCWdvdG8gY29kZWNfdW5yZWdpc3RlcjsKKwkJZ290byBhc29jX3V0aWxzX2Zpbmk7CiAJfQogCiAJcmV0dXJuIDA7CiAKK2Fzb2NfdXRpbHNfZmluaToKKwl0ZWdyYV9hc29jX3V0aWxzX2ZpbmkoJm1hY2hpbmUtPnV0aWxfZGF0YSk7CiBjb2RlY191bnJlZ2lzdGVyOgogCXBsYXRmb3JtX2RldmljZV9kZWwobWFjaGluZS0+Y29kZWMpOwogY29kZWNfcHV0OgpAQCAtMTQxLDYgKzE1NCw4IEBACiAKIAlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKIAorCXRlZ3JhX2Fzb2NfdXRpbHNfZmluaSgmbWFjaGluZS0+dXRpbF9kYXRhKTsKKwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1hY2hpbmUtPmNvZGVjKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvYW1kNzkzMC5jIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCmluZGV4IDE3NGQyMWYuLjRhODVlMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYworKysgYi9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKQEAgLTEwMTksOCArMTAxOSw4IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZfbnVtXSwgaWRbZGV2X251bV0sIFRISVNfTU9EVUxFLCAwLAotCQkJICAgICAgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmb3AtPmRldiwgaW5kZXhbZGV2X251bV0sIGlkW2Rldl9udW1dLAorCQkJICAgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvY3M0MjMxLmMgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwppbmRleCBkYmIxYjYyNS4uNGU5MWJjYSAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvY3M0MjMxLmMKKysrIGIvc291bmQvc3BhcmMvY3M0MjMxLmMKQEAgLTE1NjUsNyArMTU2NSw4IEBACiAKIHN0YXRpYyBpbnQgZGV2OwogCi1zdGF0aWMgaW50IGNzNDIzMV9hdHRhY2hfYmVnaW4oc3RydWN0IHNuZF9jYXJkICoqcmNhcmQpCitzdGF0aWMgaW50IGNzNDIzMV9hdHRhY2hfYmVnaW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCisJCQkgICAgICAgc3RydWN0IHNuZF9jYXJkICoqcmNhcmQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwOwpAQCAtMTU4MSw4ICsxNTgyLDggQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY3M0MjMxKSwgJmNhcmQpOworCWVyciA9IHNuZF9jYXJkX25ldygmb3AtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9jczQyMzEpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTE4NjksNyArMTg3MCw3IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSBjczQyMzFfYXR0YWNoX2JlZ2luKCZjYXJkKTsKKwllcnIgPSBjczQyMzFfYXR0YWNoX2JlZ2luKG9wLCAmY2FyZCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjA2MCw3ICsyMDYxLDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCWVyciA9IGNzNDIzMV9hdHRhY2hfYmVnaW4oJmNhcmQpOworCWVyciA9IGNzNDIzMV9hdHRhY2hfYmVnaW4ob3AsICZjYXJkKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9kYnJpLmMgYi9zb3VuZC9zcGFyYy9kYnJpLmMKaW5kZXggZWVlN2FmYy4uYmUxYjFhYSAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvZGJyaS5jCisrKyBiL3NvdW5kL3NwYXJjL2RicmkuYwpAQCAtMjYxNSw4ICsyNjE1LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfZGJyaSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJm9wLT5kZXYsIGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfZGJyaSksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc3BpL2F0NzNjMjEzLmMgYi9zb3VuZC9zcGkvYXQ3M2MyMTMuYwppbmRleCAyNWMzOGFmLi4zOTUyMjM2IDEwMDY0NAotLS0gYS9zb3VuZC9zcGkvYXQ3M2MyMTMuYworKysgYi9zb3VuZC9zcGkvYXQ3M2MyMTMuYwpAQCAtOTI3LDggKzkyNyw2IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXRfc25kX2RldjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnNwaS0+ZGV2KTsKLQogCWdvdG8gb3V0OwogCiBvdXRfc25kX2RldjoKQEAgLTk2Niw4ICs5NjQsOCBAQAogCiAJLyogQWxsb2NhdGUgImNhcmQiIHVzaW5nIHNvbWUgdW51c2VkIGlkZW50aWZpZXJzLiAqLwogCXNucHJpbnRmKGlkLCBzaXplb2YgaWQsICJhdDczYzIxM18lZCIsIGJvYXJkLT5zc2NfaWQpOwotCXJldHZhbCA9IHNuZF9jYXJkX2NyZWF0ZSgtMSwgaWQsIFRISVNfTU9EVUxFLAotCQkJCSBzaXplb2Yoc3RydWN0IHNuZF9hdDczYzIxMyksICZjYXJkKTsKKwlyZXR2YWwgPSBzbmRfY2FyZF9uZXcoJnNwaS0+ZGV2LCAtMSwgaWQsIFRISVNfTU9EVUxFLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfYXQ3M2MyMTMpLCAmY2FyZCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvY2hpcC5jIGIvc291bmQvdXNiLzZmaXJlL2NoaXAuYwppbmRleCA2NmVkYzRhLi5kY2RkZmMzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvY2hpcC5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9jaGlwLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCX0KIAlpZiAocmVnaWR4IDwgMCkgewogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInRvbyBtYW55IGNhcmRzIHJlZ2lzdGVyZWQuXG4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAidG9vIG1hbnkgY2FyZHMgcmVnaXN0ZXJlZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJZGV2aWNlc1tyZWdpZHhdID0gZGV2aWNlOwpAQCAtMTIxLDIwICsxMjEsMTkgQEAKIAogCS8qIGlmIHdlIGFyZSBoZXJlLCBjYXJkIGNhbiBiZSByZWdpc3RlcmVkIGluIGFsc2EuICovCiAJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGRldmljZSwgMCwgMCkgIT0gMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2FuJ3Qgc2V0IGZpcnN0IGludGVyZmFjZS5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjYW4ndCBzZXQgZmlyc3QgaW50ZXJmYWNlLlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbcmVnaWR4XSwgaWRbcmVnaWR4XSwgVEhJU19NT0RVTEUsCi0JCQlzaXplb2Yoc3RydWN0IHNmaXJlX2NoaXApLCAmY2FyZCk7CisJcmV0ID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsIGluZGV4W3JlZ2lkeF0sIGlkW3JlZ2lkeF0sCisJCQkgICBUSElTX01PRFVMRSwgc2l6ZW9mKHN0cnVjdCBzZmlyZV9jaGlwKSwgJmNhcmQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgY3JlYXRlIGFsc2EgY2FyZC5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjYW5ub3QgY3JlYXRlIGFsc2EgY2FyZC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiNkZpcmVVU0IiKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiVGVycmFUZWMgRE1YNkZpcmVVU0IiKTsKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgJWQ6JWQiLCBjYXJkLT5zaG9ydG5hbWUsCiAJCQlkZXZpY2UtPmJ1cy0+YnVzbnVtLCBkZXZpY2UtPmRldm51bSk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmaW50Zi0+ZGV2KTsKIAogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJY2hpcHNbcmVnaWR4XSA9IGNoaXA7CkBAIC0xNjksNyArMTY4LDcgQEAKIAogCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgcmVnaXN0ZXIgY2FyZC4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIGNhcmQuIik7CiAJCXVzYjZmaXJlX2NoaXBfZGVzdHJveShjaGlwKTsKIAkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvY29tbS5jIGIvc291bmQvdXNiLzZmaXJlL2NvbW0uYwppbmRleCAyMzQ1MmVlLi4xNjEyMTVkIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvY29tbS5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9jb21tLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAkJdXJiLT5zdGF0dXMgPSAwOwogCQl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCQlpZiAodXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSA8IDApCi0JCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LAogCQkJCQkiY29tbSBkYXRhIHJlY2VpdmVyIGFib3J0ZWQuXG4iKTsKIAl9CiB9CkBAIC0xNzksNyArMTc5LDcgQEAKIAlpZiAocmV0IDwgMCkgewogCQlrZnJlZShydC0+cmVjZWl2ZXJfYnVmZmVyKTsKIAkJa2ZyZWUocnQpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IGNyZWF0ZSBjb21tIGRhdGEgcmVjZWl2ZXIuIik7CisJCWRldl9lcnIoJmNoaXAtPmRldi0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBjb21tIGRhdGEgcmVjZWl2ZXIuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCWNoaXAtPmNvbW0gPSBydDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9jb250cm9sLmMgYi9zb3VuZC91c2IvNmZpcmUvY29udHJvbC5jCmluZGV4IGY2NDM0YzIuLjE4NGUzOTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi82ZmlyZS9jb250cm9sLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL2NvbnRyb2wuYwpAQCAtMTk0LDcgKzE5NCw4IEBACiAJaW50IGNoYW5nZWQgPSAwOwogCiAJaWYgKGNoID4gNCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyMiw3ICsyMjMsOCBAQAogCXVuc2lnbmVkIGludCBjaCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCiAJaWYgKGNoID4gNCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjaGFubmVsIGluIHZvbHVtZSBjb250cm9sLiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI0MCw3ICsyNDIsOCBAQAogCXU4IHZhbHVlID0gMDsKIAogCWlmIChjaCA+IDQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNjUsNyArMjY4LDggQEAKIAl1OCB2YWx1ZSA9IHJ0LT5vdXRwdXRfbXV0ZSA+PiBjaDsKIAogCWlmIChjaCA+IDQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpbiB2b2x1bWUgY29udHJvbC4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01OTQsMTQgKzU5OCwxNCBAQAogCXJldCA9IHVzYjZmaXJlX2NvbnRyb2xfYWRkX3ZpcnR1YWwocnQsIGNoaXAtPmNhcmQsCiAJCSJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgdm9sX2VsZW1lbnRzKTsKIAlpZiAocmV0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgYWRkIGNvbnRyb2wuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsICJjYW5ub3QgYWRkIGNvbnRyb2wuXG4iKTsKIAkJa2ZyZWUocnQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXQgPSB1c2I2ZmlyZV9jb250cm9sX2FkZF92aXJ0dWFsKHJ0LCBjaGlwLT5jYXJkLAogCQkiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIG11dGVfZWxlbWVudHMpOwogCWlmIChyZXQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImNhbm5vdCBhZGQgY29udHJvbC5cbiIpOworCQlkZXZfZXJyKCZjaGlwLT5kZXYtPmRldiwgImNhbm5vdCBhZGQgY29udHJvbC5cbiIpOwogCQlrZnJlZShydCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNjExLDcgKzYxNSw3IEBACiAJCXJldCA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmZWxlbWVudHNbaV0sIHJ0KSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlrZnJlZShydCk7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2Fubm90IGFkZCBjb250cm9sLlxuIik7CisJCQlkZXZfZXJyKCZjaGlwLT5kZXYtPmRldiwgImNhbm5vdCBhZGQgY29udHJvbC5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlpKys7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYyBiL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCmluZGV4IDc4MGJmM2YuLjNiMDJlNTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCkBAIC0yMTksMTYgKzIxOSwxNiBAQAogCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd25hbWUsICZkZXZpY2UtPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUocmVjKTsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIHJlcXVlc3RpbmcgZXp1c2IgIgotCQkJCSJmaXJtd2FyZSAlcy5cbiIsIGZ3bmFtZSk7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJlcnJvciByZXF1ZXN0aW5nIGV6dXNiIGZpcm13YXJlICVzLlxuIiwgZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0ID0gdXNiNmZpcmVfZndfaWhleF9pbml0KGZ3LCByZWMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHJlYyk7CiAJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJyb3IgdmFsaWRhdGluZyBlenVzYiAiCi0JCQkJImZpcm13YXJlICVzLlxuIiwgZnduYW1lKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJImVycm9yIHZhbGlkYXRpbmcgZXp1c2IgZmlybXdhcmUgJXMuXG4iLCBmd25hbWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiB1cGxvYWQgZmlybXdhcmUgaW1hZ2UgKi8KQEAgLTIzNyw4ICsyMzcsOSBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHJlYyk7CiAJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIHVwbG9hZCBlenVzYiAiCi0JCQkJImZpcm13YXJlICVzOiBiZWdpbiBtZXNzYWdlLlxuIiwgZnduYW1lKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgZmlybXdhcmUgJXM6IGJlZ2luIG1lc3NhZ2UuXG4iLAorCQkJZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI0OCw4ICsyNDksOSBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJa2ZyZWUocmVjKTsKIAkJCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgIgotCQkJCQkiZmlybXdhcmUgJXM6IGRhdGEgdXJiLlxuIiwgZnduYW1lKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkidW5hYmxlIHRvIHVwbG9hZCBlenVzYiBmaXJtd2FyZSAlczogZGF0YSB1cmIuXG4iLAorCQkJCWZ3bmFtZSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtMjYwLDggKzI2Miw5IEBACiAJCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3dyaXRlKGRldmljZSwgMHhhMCwgcG9zdGFkZHIsCiAJCQkJcG9zdGRhdGEsIHBvc3RsZW4pOwogCQlpZiAocmV0IDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgIgotCQkJCQkiZmlybXdhcmUgJXM6IHBvc3QgdXJiLlxuIiwgZnduYW1lKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkidW5hYmxlIHRvIHVwbG9hZCBlenVzYiBmaXJtd2FyZSAlczogcG9zdCB1cmIuXG4iLAorCQkJCWZ3bmFtZSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtMjY5LDggKzI3Miw5IEBACiAJZGF0YSA9IDB4MDA7IC8qIHJlc3VtZSBlenVzYiBjcHUgKi8KIAlyZXQgPSB1c2I2ZmlyZV9md19lenVzYl93cml0ZShkZXZpY2UsIDB4YTAsIDB4ZTYwMCwgJmRhdGEsIDEpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiICIKLQkJCQkiZmlybXdhcmUgJXM6IGVuZCBtZXNzYWdlLlxuIiwgZnduYW1lKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJInVuYWJsZSB0byB1cGxvYWQgZXp1c2IgZmlybXdhcmUgJXM6IGVuZCBtZXNzYWdlLlxuIiwKKwkJCWZ3bmFtZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiAwOwpAQCAtMjkyLDcgKzI5Niw3IEBACiAKIAlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZnduYW1lLCAmZGV2aWNlLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gZ2V0IGZwZ2EgZmlybXdhcmUgJXMuXG4iLAorCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJ1bmFibGUgdG8gZ2V0IGZwZ2EgZmlybXdhcmUgJXMuXG4iLAogCQkJCWZ3bmFtZSk7CiAJCWtmcmVlKGJ1ZmZlcik7CiAJCXJldHVybiAtRUlPOwpAQCAtMzA1LDggKzMwOSw4IEBACiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUoYnVmZmVyKTsKIAkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGZwZ2EgZmlybXdhcmU6ICIKLQkJCQkiYmVnaW4gdXJiLlxuIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmFibGUgdG8gdXBsb2FkIGZwZ2EgZmlybXdhcmU6IGJlZ2luIHVyYi5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzE4LDggKzMyMiw4IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJCWtmcmVlKGJ1ZmZlcik7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5hYmxlIHRvIHVwbG9hZCBmcGdhICIKLQkJCQkJImZpcm13YXJlOiBmdyB1cmIuXG4iKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkidW5hYmxlIHRvIHVwbG9hZCBmcGdhIGZpcm13YXJlOiBmdyB1cmIuXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC0zMjgsOCArMzMyLDggQEAKIAogCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3dyaXRlKGRldmljZSwgOSwgMCwgTlVMTCwgMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggInVuYWJsZSB0byB1cGxvYWQgZnBnYSBmaXJtd2FyZTogIgotCQkJCSJlbmQgdXJiLlxuIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmFibGUgdG8gdXBsb2FkIGZwZ2EgZmlybXdhcmU6IGVuZCB1cmIuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zMzgsNyArMzQyLDcgQEAKIC8qIGNoZWNrLCBpZiB0aGUgZmlybXdhcmUgdmVyc2lvbiB0aGUgZGV2aWNlcyBoYXMgY3VycmVudGx5IGxvYWRlZAogICogaXMga25vd24gYnkgdGhpcyBkcml2ZXIuICd2ZXJzaW9uJyBuZWVkcyB0byBoYXZlIDQgYnl0ZXMgdmVyc2lvbgogICogaW5mbyBkYXRhLiAqLwotc3RhdGljIGludCB1c2I2ZmlyZV9md19jaGVjayh1OCAqdmVyc2lvbikKK3N0YXRpYyBpbnQgdXNiNmZpcmVfZndfY2hlY2soc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHU4ICp2ZXJzaW9uKQogewogCWludCBpOwogCkBAIC0zNDYsNyArMzUwLDcgQEAKIAkJaWYgKCFtZW1jbXAodmVyc2lvbiwga25vd25fZndfdmVyc2lvbnMgKyBpLCAyKSkKIAkJCXJldHVybiAwOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImludmFsaWQgZmltd2FyZSB2ZXJzaW9uIGluIGRldmljZTogJTRwaC4gIgorCWRldl9lcnIoJmludGYtPmRldiwgImludmFsaWQgZmltd2FyZSB2ZXJzaW9uIGluIGRldmljZTogJTRwaC4gIgogCQkJInBsZWFzZSByZWNvbm5lY3QgdG8gcG93ZXIuIGlmIHRoaXMgZmFpbHVyZSAiCiAJCQkic3RpbGwgaGFwcGVucywgY2hlY2sgeW91ciBmaXJtd2FyZSBpbnN0YWxsYXRpb24uIiwKIAkJCXZlcnNpb24pOwpAQCAtMzY0LDE2ICszNjgsMTYgQEAKIAogCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3JlYWQoZGV2aWNlLCAxLCAwLCBidWZmZXIsIDgpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gcmVjZWl2ZSBkZXZpY2UgIgotCQkJCSJmaXJtd2FyZSBzdGF0ZS5cbiIpOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkidW5hYmxlIHRvIHJlY2VpdmUgZGV2aWNlIGZpcm13YXJlIHN0YXRlLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCWlmIChidWZmZXJbMF0gIT0gMHhlYiB8fCBidWZmZXJbMV0gIT0gMHhhYSB8fCBidWZmZXJbMl0gIT0gMHg1NSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAidW5rbm93biBkZXZpY2UgZmlybXdhcmUgc3RhdGUgIgotCQkJCSJyZWNlaXZlZCBmcm9tIGRldmljZTogIik7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJ1bmtub3duIGRldmljZSBmaXJtd2FyZSBzdGF0ZSByZWNlaXZlZCBmcm9tIGRldmljZToiKTsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCXNuZF9wcmludGsoIiUwMnggIiwgYnVmZmVyW2ldKTsKLQkJc25kX3ByaW50aygiXG4iKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIiUwMnggIiwgYnVmZmVyW2ldKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCS8qIGRvIHdlIG5lZWQgZnBnYSBsb2FkZXIgZXp1c2IgZmlybXdhcmU/ICovCkBAIC0zODYsNyArMzkwLDcgQEAKIAl9CiAJLyogZG8gd2UgbmVlZCBmcGdhIGZpcm13YXJlIGFuZCBhcHBsaWNhdGlvbiBlenVzYiBmaXJtd2FyZT8gKi8KIAllbHNlIGlmIChidWZmZXJbM10gPT0gMHgwMikgewotCQlyZXQgPSB1c2I2ZmlyZV9md19jaGVjayhidWZmZXIgKyA0KTsKKwkJcmV0ID0gdXNiNmZpcmVfZndfY2hlY2soaW50ZiwgYnVmZmVyICsgNCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJcmV0ID0gdXNiNmZpcmVfZndfZnBnYV91cGxvYWQoaW50ZiwgIjZmaXJlL2RteDZmaXJlY2YuYmluIik7CkBAIC00MDIsMTQgKzQwNiwxNCBAQAogCX0KIAkvKiBhbGwgZncgbG9hZGVkPyAqLwogCWVsc2UgaWYgKGJ1ZmZlclszXSA9PSAweDAzKQotCQlyZXR1cm4gdXNiNmZpcmVfZndfY2hlY2soYnVmZmVyICsgNCk7CisJCXJldHVybiB1c2I2ZmlyZV9md19jaGVjayhpbnRmLCBidWZmZXIgKyA0KTsKIAkvKiB1bmtub3duIGRhdGE/ICovCiAJZWxzZSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmtub3duIGRldmljZSBmaXJtd2FyZSBzdGF0ZSAiCi0JCQkJInJlY2VpdmVkIGZyb20gZGV2aWNlOiAiKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJInVua25vd24gZGV2aWNlIGZpcm13YXJlIHN0YXRlIHJlY2VpdmVkIGZyb20gZGV2aWNlOiAiKTsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCXNuZF9wcmludGsoIiUwMnggIiwgYnVmZmVyW2ldKTsKLQkJc25kX3ByaW50aygiXG4iKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIiUwMnggIiwgYnVmZmVyW2ldKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiLzZmaXJlL21pZGkuYyBiL3NvdW5kL3VzYi82ZmlyZS9taWRpLmMKaW5kZXggZjNkZDcyNi4uM2Q0MTA5NiAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL21pZGkuYworKysgYi9zb3VuZC91c2IvNmZpcmUvbWlkaS5jCkBAIC00MSw4ICs0MSw5IEBACiAKIAkJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAibWlkaSBvdXQgdXJiICIKLQkJCQkJCSJzdWJtaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCQkibWlkaSBvdXQgdXJiIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAorCQkJCQlyZXQpOwogCQl9IGVsc2UgLyogbm8gbW9yZSBkYXRhIHRvIHRyYW5zbWl0ICovCiAJCQlydC0+b3V0ID0gTlVMTDsKIAl9CkBAIC05NCw4ICs5NSw5IEBACiAKIAkJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAibWlkaSBvdXQgdXJiICIKLQkJCQkJCSJzdWJtaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCQkibWlkaSBvdXQgdXJiIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAorCQkJCQlyZXQpOwogCQkJZWxzZQogCQkJCXJ0LT5vdXQgPSBhbHNhX3N1YjsKIAkJfQpAQCAtMTgxLDcgKzE4Myw3IEBACiAJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUocnQtPm91dF9idWZmZXIpOwogCQlrZnJlZShydCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gY3JlYXRlIG1pZGkuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIG1pZGkuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcnQtPmluc3RhbmNlLT5wcml2YXRlX2RhdGEgPSBydDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9wY20uYyBiL3NvdW5kL3VzYi82ZmlyZS9wY20uYwppbmRleCBiNWViOTdmLi5iYTQwNDg5IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvcGNtLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL3BjbS5jCkBAIC03OSwzMiArNzksMzUgQEAKIAljdHJsX3J0LT51c2Jfc3RyZWFtaW5nID0gZmFsc2U7CiAJcmV0ID0gY3RybF9ydC0+dXBkYXRlX3N0cmVhbWluZyhjdHJsX3J0KTsKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJyb3Igc3RvcHBpbmcgc3RyZWFtaW5nIHdoaWxlICIKLQkJCQkic2V0dGluZyBzYW1wbGVyYXRlICVkLlxuIiwgcmF0ZXNbcnQtPnJhdGVdKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIHN0b3BwaW5nIHN0cmVhbWluZyB3aGlsZSBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAorCQkJcmF0ZXNbcnQtPnJhdGVdKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBjdHJsX3J0LT5zZXRfcmF0ZShjdHJsX3J0LCBydC0+cmF0ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCi0JCQkJcmF0ZXNbcnQtPnJhdGVdKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCisJCQlyYXRlc1tydC0+cmF0ZV0pOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGN0cmxfcnQtPnNldF9jaGFubmVscyhjdHJsX3J0LCBPVVRfTl9DSEFOTkVMUywgSU5fTl9DSEFOTkVMUywKIAkJCWZhbHNlLCBmYWxzZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggImVycm9yIGluaXRpYWxpemluZyBjaGFubmVscyAiCi0JCQkJIndoaWxlIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCi0JCQkJcmF0ZXNbcnQtPnJhdGVdKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImVycm9yIGluaXRpYWxpemluZyBjaGFubmVscyB3aGlsZSBzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLAorCQkJcmF0ZXNbcnQtPnJhdGVdKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAljdHJsX3J0LT51c2Jfc3RyZWFtaW5nID0gdHJ1ZTsKIAlyZXQgPSBjdHJsX3J0LT51cGRhdGVfc3RyZWFtaW5nKGN0cmxfcnQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJlcnJvciBzdGFydGluZyBzdHJlYW1pbmcgd2hpbGUgIgotCQkJCSJzZXR0aW5nIHNhbXBsZXJhdGUgJWQuXG4iLCByYXRlc1tydC0+cmF0ZV0pOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkiZXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIHdoaWxlIHNldHRpbmcgc2FtcGxlcmF0ZSAlZC5cbiIsCisJCQlyYXRlc1tydC0+cmF0ZV0pOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTI0LDcgKzEyNyw3IEBACiAJCXJldHVybiAmcnQtPnBsYXliYWNrOwogCWVsc2UgaWYgKGFsc2Ffc3ViLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQogCQlyZXR1cm4gJnJ0LT5jYXB0dXJlOwotCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJlcnJvciBnZXR0aW5nIHBjbSBzdWJzdHJlYW0gc2xvdC5cbiIpOworCWRldl9lcnIoJnJ0LT5jaGlwLT5kZXYtPmRldiwgImVycm9yIGdldHRpbmcgcGNtIHN1YnN0cmVhbSBzbG90LlxuIik7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI1Nyw3ICsyNjAsNyBAQAogCWVsc2UgaWYgKGFsc2FfcnQtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSkKIAkJZGVzdCA9ICh1MzIgKikgKHVyYi0+YnVmZmVyKTsKIAllbHNlIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVua25vd24gc2FtcGxlIGZvcm1hdC4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LCAiVW5rbm93biBzYW1wbGUgZm9ybWF0LiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMDcsOCArMzEwLDggQEAKIAkJfQogCiAJaWYgKHJ0LT5zdHJlYW1fc3RhdGUgPT0gU1RSRUFNX0RJU0FCTEVEKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJpbnRlcm5hbCBlcnJvcjogIgotCQkJCSJzdHJlYW0gZGlzYWJsZWQgaW4gaW4tdXJiIGhhbmRsZXIuXG4iKTsKKwkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJImludGVybmFsIGVycm9yOiBzdHJlYW0gZGlzYWJsZWQgaW4gaW4tdXJiIGhhbmRsZXIuXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDEwLDcgKzQxMyw3IEBACiAKIAlpZiAoIXN1YikgewogCQltdXRleF91bmxvY2soJnJ0LT5zdHJlYW1fbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiaW52YWxpZCBzdHJlYW0gdHlwZS5cbiIpOworCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsICJpbnZhbGlkIHN0cmVhbSB0eXBlLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDgxLDggKzQ4NCw5IEBACiAJCQkJYnJlYWs7CiAJCWlmIChydC0+cmF0ZSA9PSBBUlJBWV9TSVpFKHJhdGVzKSkgewogCQkJbXV0ZXhfdW5sb2NrKCZydC0+c3RyZWFtX211dGV4KTsKLQkJCXNuZF9wcmludGsoImludmFsaWQgcmF0ZSAlZCBpbiBwcmVwYXJlLlxuIiwKLQkJCQkJYWxzYV9ydC0+cmF0ZSk7CisJCQlkZXZfZXJyKCZydC0+Y2hpcC0+ZGV2LT5kZXYsCisJCQkJImludmFsaWQgcmF0ZSAlZCBpbiBwcmVwYXJlLlxuIiwKKwkJCQlhbHNhX3J0LT5yYXRlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTQ5NCw4ICs0OTgsOCBAQAogCQlyZXQgPSB1c2I2ZmlyZV9wY21fc3RyZWFtX3N0YXJ0KHJ0KTsKIAkJaWYgKHJldCkgewogCQkJbXV0ZXhfdW5sb2NrKCZydC0+c3RyZWFtX211dGV4KTsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCQkJCSJjb3VsZCBub3Qgc3RhcnQgcGNtIHN0cmVhbS5cbiIpOworCQkJZGV2X2VycigmcnQtPmNoaXAtPmRldi0+ZGV2LAorCQkJCSJjb3VsZCBub3Qgc3RhcnQgcGNtIHN0cmVhbS5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KQEAgLTY1MCw3ICs2NTQsNyBAQAogCWlmIChyZXQgPCAwKSB7CiAJCXVzYjZmaXJlX3BjbV9idWZmZXJzX2Rlc3Ryb3kocnQpOwogCQlrZnJlZShydCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJjYW5ub3QgY3JlYXRlIHBjbSBpbnN0YW5jZS5cbiIpOworCQlkZXZfZXJyKCZjaGlwLT5kZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgcGNtIGluc3RhbmNlLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02NjIsOCArNjY2LDggQEAKIAlpZiAocmV0KSB7CiAJCXVzYjZmaXJlX3BjbV9idWZmZXJzX2Rlc3Ryb3kocnQpOwogCQlrZnJlZShydCk7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCQkJImVycm9yIHByZWFsbG9jYXRpbmcgcGNtIGJ1ZmZlcnMuXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LT5kZXYsCisJCQkiZXJyb3IgcHJlYWxsb2NhdGluZyBwY20gYnVmZmVycy5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlydC0+aW5zdGFuY2UgPSBwY207CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMgYi9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMKaW5kZXggYmM1NWY3MC4uYjg3MWJhNCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhaWFxL2RldmljZS5jCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYwpAQCAtNDE4LDggKzQxOCw5IEBACiAJaWYgKGRldm51bSA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnVtXSwgaWRbZGV2bnVtXSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYpLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsCisJCQkgICBpbmRleFtkZXZudW1dLCBpZFtkZXZudW1dLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNDI5LDcgKzQzMCw2IEBACiAJY2Rldi0+Y2hpcC51c2JfaWQgPSBVU0JfSUQobGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCQkJICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCXNwaW5fbG9ja19pbml0KCZjZGV2LT5zcGlubG9jayk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmaW50Zi0+ZGV2KTsKIAogCSpjYXJkcCA9IGNhcmQ7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FyZC5jIGIvc291bmQvdXNiL2NhcmQuYwppbmRleCBkOTc5MDUwLi44OTNkNWExIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FyZC5jCisrKyBiL3NvdW5kL3VzYi9jYXJkLmMKQEAgLTEzOSw4ICsxMzksOCBAQAogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSA9IHVzYl9pZm51bV90b19pZihkZXYsIGludGVyZmFjZSk7CiAKIAlpZiAoIWlmYWNlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogZG9lcyBub3QgZXhpc3RcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgY3RybGlmLCBpbnRlcmZhY2UpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiV1OiVkIDogZG9lcyBub3QgZXhpc3RcbiIsCisJCQljdHJsaWYsIGludGVyZmFjZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTY1LDggKzE2NSw4IEBACiAJfQogCiAJaWYgKHVzYl9pbnRlcmZhY2VfY2xhaW1lZChpZmFjZSkpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICIlZDolZDolZDogc2tpcHBpbmcsIGFscmVhZHkgY2xhaW1lZFxuIiwKLQkJCQkJCWRldi0+ZGV2bnVtLCBjdHJsaWYsIGludGVyZmFjZSk7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiJWQ6JWQ6IHNraXBwaW5nLCBhbHJlYWR5IGNsYWltZWRcbiIsCisJCQljdHJsaWYsIGludGVyZmFjZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTc2LDggKzE3Niw5IEBACiAJCWludCBlcnIgPSBzbmRfdXNibWlkaV9jcmVhdGUoY2hpcC0+Y2FyZCwgaWZhY2UsCiAJCQkJCSAgICAgJmNoaXAtPm1pZGlfbGlzdCwgTlVMTCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZDogY2Fubm90IGNyZWF0ZSBzZXF1ZW5jZXIgZGV2aWNlXG4iLAotCQkJCQkJZGV2LT5kZXZudW0sIGN0cmxpZiwgaW50ZXJmYWNlKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCSIldTolZDogY2Fubm90IGNyZWF0ZSBzZXF1ZW5jZXIgZGV2aWNlXG4iLAorCQkJCWN0cmxpZiwgaW50ZXJmYWNlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKCZ1c2JfYXVkaW9fZHJpdmVyLCBpZmFjZSwgKHZvaWQgKiktMUwpOwpAQCAtMTg4LDE0ICsxODksMTUgQEAKIAlpZiAoKGFsdHNkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX0FVRElPICYmCiAJICAgICBhbHRzZC0+YkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19WRU5ET1JfU1BFQykgfHwKIAkgICAgYWx0c2QtPmJJbnRlcmZhY2VTdWJDbGFzcyAhPSBVU0JfU1VCQ0xBU1NfQVVESU9TVFJFQU1JTkcpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIiVkOiV1OiVkOiBza2lwcGluZyBub24tc3VwcG9ydGVkIGludGVyZmFjZSAlZFxuIiwKLQkJCQkJZGV2LT5kZXZudW0sIGN0cmxpZiwgaW50ZXJmYWNlLCBhbHRzZC0+YkludGVyZmFjZUNsYXNzKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsCisJCQkiJXU6JWQ6IHNraXBwaW5nIG5vbi1zdXBwb3J0ZWQgaW50ZXJmYWNlICVkXG4iLAorCQkJY3RybGlmLCBpbnRlcmZhY2UsIGFsdHNkLT5iSW50ZXJmYWNlQ2xhc3MpOwogCQkvKiBza2lwIG5vbi1zdXBwb3J0ZWQgY2xhc3NlcyAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoc25kX3VzYl9nZXRfc3BlZWQoZGV2KSA9PSBVU0JfU1BFRURfTE9XKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImxvdyBzcGVlZCBhdWRpbyBzdHJlYW1pbmcgbm90IHN1cHBvcnRlZFxuIik7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAibG93IHNwZWVkIGF1ZGlvIHN0cmVhbWluZyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjgsMjYgKzIzMCwyNyBAQAogCXByb3RvY29sID0gYWx0c2QtPmJJbnRlcmZhY2VQcm90b2NvbDsKIAogCWlmICghY29udHJvbF9oZWFkZXIpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGZpbmQgVUFDX0hFQURFUlxuIik7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiY2Fubm90IGZpbmQgVUFDX0hFQURFUlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN3aXRjaCAocHJvdG9jb2wpIHsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkZChLRVJOX1dBUk5JTkcgInVua25vd24gaW50ZXJmYWNlIHByb3RvY29sICUjMDJ4LCBhc3N1bWluZyB2MVxuIiwKLQkJCSAgICBwcm90b2NvbCk7CisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSAidW5rbm93biBpbnRlcmZhY2UgcHJvdG9jb2wgJSMwMngsIGFzc3VtaW5nIHYxXG4iLAorCQkJIHByb3RvY29sKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAKIAljYXNlIFVBQ19WRVJTSU9OXzE6IHsKIAkJc3RydWN0IHVhYzFfYWNfaGVhZGVyX2Rlc2NyaXB0b3IgKmgxID0gY29udHJvbF9oZWFkZXI7CiAKIAkJaWYgKCFoMS0+YkluQ29sbGVjdGlvbikgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8gInNraXBwaW5nIGVtcHR5IGF1ZGlvIGludGVyZmFjZSAodjEpXG4iKTsKKwkJCWRldl9pbmZvKCZkZXYtPmRldiwgInNraXBwaW5nIGVtcHR5IGF1ZGlvIGludGVyZmFjZSAodjEpXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAkJaWYgKGgxLT5iTGVuZ3RoIDwgc2l6ZW9mKCpoMSkgKyBoMS0+YkluQ29sbGVjdGlvbikgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBVQUNfSEVBREVSICh2MSlcbiIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJpbnZhbGlkIFVBQ19IRUFERVIgKHYxKVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0yNzcsNyArMjgwLDcgQEAKIAkJfQogCiAJCWlmICghYXNzb2MpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkF1ZGlvIGNsYXNzIHYyIGludGVyZmFjZXMgbmVlZCBhbiBpbnRlcmZhY2UgYXNzb2NpYXRpb25cbiIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJBdWRpbyBjbGFzcyB2MiBpbnRlcmZhY2VzIG5lZWQgYW4gaW50ZXJmYWNlIGFzc29jaWF0aW9uXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTMyOCw3ICszMzEsOCBAQAogLyoKICAqIGNyZWF0ZSBhIGNoaXAgaW5zdGFuY2UgYW5kIHNldCBpdHMgbmFtZXMuCiAgKi8KLXN0YXRpYyBpbnQgc25kX3VzYl9hdWRpb19jcmVhdGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlkeCwKK3N0YXRpYyBpbnQgc25kX3VzYl9hdWRpb19jcmVhdGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlkeCwKIAkJCQljb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlyayAqcXVpcmssCiAJCQkJc3RydWN0IHNuZF91c2JfYXVkaW8gKipyY2hpcCkKIHsKQEAgLTM1MCwxMyArMzU0LDE0IEBACiAJY2FzZSBVU0JfU1BFRURfU1VQRVI6CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVua25vd24gZGV2aWNlIHNwZWVkICVkXG4iLCBzbmRfdXNiX2dldF9zcGVlZChkZXYpKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJ1bmtub3duIGRldmljZSBzcGVlZCAlZFxuIiwgc25kX3VzYl9nZXRfc3BlZWQoZGV2KSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJZXJyID0gc25kX2NhcmRfbmV3KCZpbnRmLT5kZXYsIGluZGV4W2lkeF0sIGlkW2lkeF0sIFRISVNfTU9EVUxFLAorCQkJICAgMCwgJmNhcmQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgY2FyZCBpbnN0YW5jZSAlZFxuIiwgaWR4KTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJjYW5ub3QgY3JlYXRlIGNhcmQgaW5zdGFuY2UgJWRcbiIsIGlkeCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC00OTcsNyArNTAyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewogCQlpZiAodXNiX2NoaXBbaV0gJiYgdXNiX2NoaXBbaV0tPmRldiA9PSBkZXYpIHsKIAkJCWlmICh1c2JfY2hpcFtpXS0+c2h1dGRvd24pIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJVU0IgZGV2aWNlIGlzIGluIHRoZSBzaHV0ZG93biBzdGF0ZSwgY2Fubm90IGNyZWF0ZSBhIGNhcmQgaW5zdGFuY2VcbiIpOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiVVNCIGRldmljZSBpcyBpbiB0aGUgc2h1dGRvd24gc3RhdGUsIGNhbm5vdCBjcmVhdGUgYSBjYXJkIGluc3RhbmNlXG4iKTsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CiAJCQljaGlwID0gdXNiX2NoaXBbaV07CkBAIC01MTMsMTUgKzUxOCwxNSBAQAogCQkJaWYgKGVuYWJsZVtpXSAmJiAhIHVzYl9jaGlwW2ldICYmCiAJCQkgICAgKHZpZFtpXSA9PSAtMSB8fCB2aWRbaV0gPT0gVVNCX0lEX1ZFTkRPUihpZCkpICYmCiAJCQkgICAgKHBpZFtpXSA9PSAtMSB8fCBwaWRbaV0gPT0gVVNCX0lEX1BST0RVQ1QoaWQpKSkgewotCQkJCWlmIChzbmRfdXNiX2F1ZGlvX2NyZWF0ZShkZXYsIGksIHF1aXJrLCAmY2hpcCkgPCAwKSB7CisJCQkJaWYgKHNuZF91c2JfYXVkaW9fY3JlYXRlKGludGYsIGRldiwgaSwgcXVpcmssCisJCQkJCQkJICZjaGlwKSA8IDApIHsKIAkJCQkJZ290byBfX2Vycm9yOwogCQkJCX0KLQkJCQlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsICZpbnRmLT5kZXYpOwogCQkJCWNoaXAtPnBtX2ludGYgPSBpbnRmOwogCQkJCWJyZWFrOwogCQkJfQogCQlpZiAoIWNoaXApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibm8gYXZhaWxhYmxlIHVzYiBhdWRpbyBkZXZpY2VcbiIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsICJubyBhdmFpbGFibGUgdXNiIGF1ZGlvIGRldmljZVxuIik7CiAJCQlnb3RvIF9fZXJyb3I7CiAJCX0KIAl9CkBAIC02OTEsMTIgKzY5NiwxMiBAQAogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobWl4ZXIsICZjaGlwLT5taXhlcl9saXN0LCBsaXN0KQotCQlzbmRfdXNiX21peGVyX2luYWN0aXZhdGUobWl4ZXIpOworCQlzbmRfdXNiX21peGVyX3N1c3BlbmQobWl4ZXIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyBpbnQgX191c2JfYXVkaW9fcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBib29sIHJlc2V0X3Jlc3VtZSkKIHsKIAlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyOwpAQCAtNzExLDcgKzcxNiw3IEBACiAJICogd2UganVzdCBub3RpZnkgYW5kIHJlc3RhcnQgdGhlIG1peGVycwogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkobWl4ZXIsICZjaGlwLT5taXhlcl9saXN0LCBsaXN0KSB7Ci0JCWVyciA9IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUobWl4ZXIpOworCQllcnIgPSBzbmRfdXNiX21peGVyX3Jlc3VtZShtaXhlciwgcmVzZXRfcmVzdW1lKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycl9vdXQ7CiAJfQpAQCAtNzIzLDkgKzcyOCwyMCBAQAogZXJyX291dDoKIAlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIF9fdXNiX2F1ZGlvX3Jlc3VtZShpbnRmLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlyZXR1cm4gX191c2JfYXVkaW9fcmVzdW1lKGludGYsIHRydWUpOworfQogI2Vsc2UKICNkZWZpbmUgdXNiX2F1ZGlvX3N1c3BlbmQJTlVMTAogI2RlZmluZSB1c2JfYXVkaW9fcmVzdW1lCU5VTEwKKyNkZWZpbmUgdXNiX2F1ZGlvX3Jlc2V0X3Jlc3VtZQlOVUxMCiAjZW5kaWYJCS8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX2F1ZGlvX2lkcyBbXSA9IHsKQEAgLTc0Nyw2ICs3NjMsNyBAQAogCS5kaXNjb25uZWN0ID0JdXNiX2F1ZGlvX2Rpc2Nvbm5lY3QsCiAJLnN1c3BlbmQgPQl1c2JfYXVkaW9fc3VzcGVuZCwKIAkucmVzdW1lID0JdXNiX2F1ZGlvX3Jlc3VtZSwKKwkucmVzZXRfcmVzdW1lID0JdXNiX2F1ZGlvX3Jlc2V0X3Jlc3VtZSwKIAkuaWRfdGFibGUgPQl1c2JfYXVkaW9faWRzLAogCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2Nsb2NrLmMgYi9zb3VuZC91c2IvY2xvY2suYwppbmRleCA4NmY4MGM2Li4wM2ZlZDY2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2xvY2suYworKysgYi9zb3VuZC91c2IvY2xvY2suYwpAQCAtMTE1LDkgKzExNSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlpZiAocmV0ICE9IHNpemVvZihwaW4pKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCSJ1c2ItYXVkaW86JWQ6IHNldHRpbmcgc2VsZWN0b3IgKGlkICVkKSB1bmV4cGVjdGVkIGxlbmd0aCAlZFxuIiwKLQkJCWNoaXAtPmRldi0+ZGV2bnVtLCBzZWxlY3Rvcl9pZCwgcmV0KTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJInNldHRpbmcgc2VsZWN0b3IgKGlkICVkKSB1bmV4cGVjdGVkIGxlbmd0aCAlZFxuIiwKKwkJCXNlbGVjdG9yX2lkLCByZXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEyNiw5ICsxMjYsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHJldCAhPSBwaW4pIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJInVzYi1hdWRpbzolZDogc2V0dGluZyBzZWxlY3RvciAoaWQgJWQpIHRvICV4IGZhaWxlZCAoY3VycmVudDogJWQpXG4iLAotCQkJY2hpcC0+ZGV2LT5kZXZudW0sIHNlbGVjdG9yX2lkLCBwaW4sIHJldCk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSJzZXR0aW5nIHNlbGVjdG9yIChpZCAlZCkgdG8gJXggZmFpbGVkIChjdXJyZW50OiAlZClcbiIsCisJCQlzZWxlY3Rvcl9pZCwgcGluLCByZXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE1OCw3ICsxNTgsOCBAQAogCQkJICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAKIAlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogY2Fubm90IGdldCBjbG9jayB2YWxpZGl0eSBmb3IgaWQgJWRcbiIsCisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSAiJXMoKTogY2Fubm90IGdldCBjbG9jayB2YWxpZGl0eSBmb3IgaWQgJWRcbiIsCiAJCQkgICBfX2Z1bmNfXywgc291cmNlX2lkKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTc3LDkgKzE3OCw5IEBACiAJZW50aXR5X2lkICY9IDB4ZmY7CiAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChlbnRpdHlfaWQsIHZpc2l0ZWQpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiJXMoKTogcmVjdXJzaXZlIGNsb2NrIHRvcG9sb2d5IGRldGVjdGVkLCBpZCAlZC5cbiIsCi0JCQlfX2Z1bmNfXywgZW50aXR5X2lkKTsKKwkJdXNiX2F1ZGlvX3dhcm4oY2hpcCwKKwkJCSAiJXMoKTogcmVjdXJzaXZlIGNsb2NrIHRvcG9sb2d5IGRldGVjdGVkLCBpZCAlZC5cbiIsCisJCQkgX19mdW5jX18sIGVudGl0eV9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTg4LDggKzE4OSw5IEBACiAJaWYgKHNvdXJjZSkgewogCQllbnRpdHlfaWQgPSBzb3VyY2UtPmJDbG9ja0lEOwogCQlpZiAodmFsaWRhdGUgJiYgIXVhY19jbG9ja19zb3VyY2VfaXNfdmFsaWQoY2hpcCwgZW50aXR5X2lkKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiLWF1ZGlvOiVkOiBjbG9jayBzb3VyY2UgJWQgaXMgbm90IHZhbGlkLCBjYW5ub3QgdXNlXG4iLAotCQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBlbnRpdHlfaWQpOworCQkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJCSJjbG9jayBzb3VyY2UgJWQgaXMgbm90IHZhbGlkLCBjYW5ub3QgdXNlXG4iLAorCQkJCWVudGl0eV9pZCk7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJCXJldHVybiBlbnRpdHlfaWQ7CkBAIC0yMDgsNyArMjEwLDcgQEAKIAkJLyogU2VsZWN0b3IgdmFsdWVzIGFyZSBvbmUtYmFzZWQgKi8KIAogCQlpZiAocmV0ID4gc2VsZWN0b3ItPmJOckluUGlucyB8fCByZXQgPCAxKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQl1c2JfYXVkaW9fZXJyKGNoaXAsCiAJCQkJIiVzKCk6IHNlbGVjdG9yIHJlcG9ydGVkIGlsbGVnYWwgdmFsdWUsIGlkICVkLCByZXQgJWRcbiIsCiAJCQkJX19mdW5jX18sIHNlbGVjdG9yLT5iQ2xvY2tJRCwgcmV0KTsKIApAQCAtMjM3LDkgKzIzOSw5IEBACiAJCQlpZiAoZXJyIDwgMCkKIAkJCQljb250aW51ZTsKIAotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkidXNiLWF1ZGlvOiVkOiBmb3VuZCBhbmQgc2VsZWN0ZWQgdmFsaWQgY2xvY2sgc291cmNlICVkXG4iLAotCQkJCWNoaXAtPmRldi0+ZGV2bnVtLCByZXQpOworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKKwkJCQkgImZvdW5kIGFuZCBzZWxlY3RlZCB2YWxpZCBjbG9jayBzb3VyY2UgJWRcbiIsCisJCQkJIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKQEAgLTI5Niw4ICsyOTgsOCBAQAogCQkJCSAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UIHwgVVNCX0RJUl9PVVQsCiAJCQkJICAgVUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEUgPDwgOCwgZXAsCiAJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGZyZXEgJWQgdG8gZXAgJSN4XG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUsIGVwKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICIlZDolZDogY2Fubm90IHNldCBmcmVxICVkIHRvIGVwICUjeFxuIiwKKwkJCWlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUsIGVwKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTMwNSwxNCArMzA3LDE0IEBACiAJCQkJICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfRU5EUE9JTlQgfCBVU0JfRElSX0lOLAogCQkJCSAgIFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFIDw8IDgsIGVwLAogCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiJWQ6JWQ6JWQ6IGNhbm5vdCBnZXQgZnJlcSBhdCBlcCAlI3hcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgaWZhY2UsIGZtdC0+YWx0c2V0dGluZywgZXApOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVkOiVkOiBjYW5ub3QgZ2V0IGZyZXEgYXQgZXAgJSN4XG4iLAorCQkJaWZhY2UsIGZtdC0+YWx0c2V0dGluZywgZXApOwogCQlyZXR1cm4gMDsgLyogc29tZSBkZXZpY2VzIGRvbid0IHN1cHBvcnQgcmVhZGluZyAqLwogCX0KIAogCWNyYXRlID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOwogCWlmIChjcmF0ZSAhPSByYXRlKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9XQVJOSU5HICJjdXJyZW50IHJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJ1bnRpbWUgcmF0ZSAlZFxuIiwgY3JhdGUsIHJhdGUpOworCQlkZXZfd2FybigmZGV2LT5kZXYsICJjdXJyZW50IHJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJ1bnRpbWUgcmF0ZSAlZFxuIiwgY3JhdGUsIHJhdGUpOwogCQkvLyBydW50aW1lLT5yYXRlID0gY3JhdGU7CiAJfQogCkBAIC0zMzIsOCArMzM0LDggQEAKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGNsb2NrIDw8IDgpLAogCQkJICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiVkOiVkOiBjYW5ub3QgZ2V0IGZyZXEgKHYyKTogZXJyICVkXG4iLAotCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBhbHRzZXR0aW5nLCBlcnIpOworCQlkZXZfd2FybigmZGV2LT5kZXYsICIlZDolZDogY2Fubm90IGdldCBmcmVxICh2Mik6IGVyciAlZFxuIiwKKwkJCSBpZmFjZSwgYWx0c2V0dGluZywgZXJyKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNjksOCArMzcxLDkgQEAKIAkJCQkgICAgICBzbmRfdXNiX2N0cmxfaW50ZihjaGlwKSB8IChjbG9jayA8PCA4KSwKIAkJCQkgICAgICAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGZyZXEgJWQgKHYyKTogZXJyICVkXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcnIpOworCQkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJCSIlZDolZDogY2Fubm90IHNldCBmcmVxICVkICh2Mik6IGVyciAlZFxuIiwKKwkJCQlpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCkBAIC0zODEsMTQgKzM4NCwxNCBAQAogCiAJaWYgKGN1cl9yYXRlICE9IHJhdGUpIHsKIAkJaWYgKCF3cml0ZWFibGUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgIiVkOiVkOiVkOiBmcmVxIG1pc21hdGNoIChSTyBjbG9jayk6IHJlcSAlZCwgY2xvY2sgcnVucyBAJWRcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUsIGN1cl9yYXRlKTsKKwkJCXVzYl9hdWRpb193YXJuKGNoaXAsCisJCQkJICIlZDolZDogZnJlcSBtaXNtYXRjaCAoUk8gY2xvY2spOiByZXEgJWQsIGNsb2NrIHJ1bnMgQCVkXG4iLAorCQkJCSBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBjdXJfcmF0ZSk7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9Ci0JCXNuZF9wcmludGQoS0VSTl9XQVJOSU5HCi0JCQkgICAiY3VycmVudCByYXRlICVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBydW50aW1lIHJhdGUgJWRcbiIsCi0JCQkgICBjdXJfcmF0ZSwgcmF0ZSk7CisJCXVzYl9hdWRpb19kYmcoY2hpcCwKKwkJCSJjdXJyZW50IHJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJ1bnRpbWUgcmF0ZSAlZFxuIiwKKwkJCWN1cl9yYXRlLCByYXRlKTsKIAl9CiAKIAkvKiBTb21lIGRldmljZXMgZG9lc24ndCByZXNwb25kIHRvIHNhbXBsZSByYXRlIGNoYW5nZXMgd2hpbGUgdGhlCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvZW5kcG9pbnQuYyBiL3NvdW5kL3VzYi9lbmRwb2ludC5jCmluZGV4IDgzYWFiZWEyLi5lNzBhODdlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvZW5kcG9pbnQuYworKysgYi9zb3VuZC91c2IvZW5kcG9pbnQuYwpAQCAtMzMzLDggKzMzMyw5IEBACiAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIoY3R4LT51cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBzdWJtaXQgdXJiICMlZDogJWQgKHVyYiAlcClcbiIsCi0JCQkJICAgY3R4LT5pbmRleCwgZXJyLCBjdHgtPnVyYik7CisJCQl1c2JfYXVkaW9fZXJyKGVwLT5jaGlwLAorCQkJCSJVbmFibGUgdG8gc3VibWl0IHVyYiAjJWQ6ICVkICh1cmIgJXApXG4iLAorCQkJCWN0eC0+aW5kZXgsIGVyciwgY3R4LT51cmIpOwogCQllbHNlCiAJCQlzZXRfYml0KGN0eC0+aW5kZXgsICZlcC0+YWN0aXZlX21hc2spOwogCX0KQEAgLTM4Nyw3ICszODgsNyBAQAogCWlmIChlcnIgPT0gMCkKIAkJcmV0dXJuOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHN1Ym1pdCB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKKwl1c2JfYXVkaW9fZXJyKGVwLT5jaGlwLCAiY2Fubm90IHN1Ym1pdCB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKIAkvL3NuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKIAogZXhpdF9jbGVhcjoKQEAgLTQyNiwxMyArNDI3LDE0IEBACiAJCWlmIChlcC0+ZXBfbnVtID09IGVwX251bSAmJgogCQkgICAgZXAtPmlmYWNlID09IGFsdHMtPmRlc2MuYkludGVyZmFjZU51bWJlciAmJgogCQkgICAgZXAtPmFsdHNldHRpbmcgPT0gYWx0cy0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZykgewotCQkJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiUmUtdXNpbmcgRVAgJXggaW4gaWZhY2UgJWQsJWQgQCVwXG4iLAorCQkJdXNiX2F1ZGlvX2RiZyhlcC0+Y2hpcCwKKwkJCQkgICAgICAiUmUtdXNpbmcgRVAgJXggaW4gaWZhY2UgJWQsJWQgQCVwXG4iLAogCQkJCQllcF9udW0sIGVwLT5pZmFjZSwgZXAtPmFsdHNldHRpbmcsIGVwKTsKIAkJCWdvdG8gX19leGl0X3VubG9jazsKIAkJfQogCX0KIAotCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIkNyZWF0aW5nIG5ldyAlcyAlcyBlbmRwb2ludCAjJXhcbiIsCisJdXNiX2F1ZGlvX2RiZyhjaGlwLCAiQ3JlYXRpbmcgbmV3ICVzICVzIGVuZHBvaW50ICMleFxuIiwKIAkJICAgIGlzX3BsYXliYWNrID8gInBsYXliYWNrIiA6ICJjYXB0dXJlIiwKIAkJICAgIHR5cGUgPT0gU05EX1VTQl9FTkRQT0lOVF9UWVBFX0RBVEEgPyAiZGF0YSIgOiAic3luYyIsCiAJCSAgICBlcF9udW0pOwpAQCAtNDk2LDggKzQ5OCw5IEBACiAJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kX3RpbWUpKTsKIAogCWlmIChhbGl2ZSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZW91dDogc3RpbGwgJWQgYWN0aXZlIHVyYnMgb24gRVAgIyV4XG4iLAotCQkJCQlhbGl2ZSwgZXAtPmVwX251bSk7CisJCXVzYl9hdWRpb19lcnIoZXAtPmNoaXAsCisJCQkidGltZW91dDogc3RpbGwgJWQgYWN0aXZlIHVyYnMgb24gRVAgIyV4XG4iLAorCQkJYWxpdmUsIGVwLT5lcF9udW0pOwogCWNsZWFyX2JpdChFUF9GTEFHX1NUT1BQSU5HLCAmZXAtPmZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtNzk0LDggKzc5Nyw5IEBACiAJaW50IGVycjsKIAogCWlmIChlcC0+dXNlX2NvdW50ICE9IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjaGFuZ2UgZm9ybWF0IG9uIGVwICMleDogYWxyZWFkeSBpbiB1c2VcbiIsCi0JCQkgICBlcC0+ZXBfbnVtKTsKKwkJdXNiX2F1ZGlvX3dhcm4oZXAtPmNoaXAsCisJCQkgIlVuYWJsZSB0byBjaGFuZ2UgZm9ybWF0IG9uIGVwICMleDogYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkgZXAtPmVwX251bSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC04MzAsOCArODM0LDkgQEAKIAkJZXJyID0gLUVJTlZBTDsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJTZXR0aW5nIHBhcmFtcyBmb3IgZXAgIyV4ICh0eXBlICVkLCAlZCB1cmJzKSwgcmV0PSVkXG4iLAotCQkgICBlcC0+ZXBfbnVtLCBlcC0+dHlwZSwgZXAtPm51cmJzLCBlcnIpOworCXVzYl9hdWRpb19kYmcoZXAtPmNoaXAsCisJCSJTZXR0aW5nIHBhcmFtcyBmb3IgZXAgIyV4ICh0eXBlICVkLCAlZCB1cmJzKSwgcmV0PSVkXG4iLAorCQllcC0+ZXBfbnVtLCBlcC0+dHlwZSwgZXAtPm51cmJzLCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTkwNiw4ICs5MTEsOSBAQAogCiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHVyYiAlZCwgZXJyb3IgJWQ6ICVzXG4iLAotCQkJCSAgIGksIGVyciwgdXNiX2Vycm9yX3N0cmluZyhlcnIpKTsKKwkJCXVzYl9hdWRpb19lcnIoZXAtPmNoaXAsCisJCQkJImNhbm5vdCBzdWJtaXQgdXJiICVkLCBlcnJvciAlZDogJXNcbiIsCisJCQkJaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOwogCQkJZ290byBfX2Vycm9yOwogCQl9CiAJCXNldF9iaXQoaSwgJmVwLT5hY3RpdmVfbWFzayk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvZm9ybWF0LmMgYi9zb3VuZC91c2IvZm9ybWF0LmMKaW5kZXggZDI0NGZkMy4uOGJjYzg3YyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2Zvcm1hdC5jCisrKyBiL3NvdW5kL3VzYi9mb3JtYXQuYwpAQCAtNzQsOCArNzQsOCBAQAogCWlmICgocGNtX2Zvcm1hdHMgPT0gMCkgJiYKIAkgICAgKGZvcm1hdCA9PSAwIHx8IGZvcm1hdCA9PSAoMSA8PCBVQUNfRk9STUFUX1RZUEVfSV9VTkRFRklORUQpKSkgewogCQkvKiBzb21lIGRldmljZXMgZG9uJ3QgZGVmaW5lIHRoaXMgY29ycmVjdGx5Li4uICovCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQgOiBmb3JtYXQgdHlwZSAwIGlzIGRldGVjdGVkLCBwcm9jZXNzZWQgYXMgUENNXG4iLAotCQkJICAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nKTsKKwkJdXNiX2F1ZGlvX2luZm8oY2hpcCwgIiV1OiVkIDogZm9ybWF0IHR5cGUgMCBpcyBkZXRlY3RlZCwgcHJvY2Vzc2VkIGFzIFBDTVxuIiwKKwkJCWZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcpOwogCQlmb3JtYXQgPSAxIDw8IFVBQ19GT1JNQVRfVFlQRV9JX1BDTTsKIAl9CiAJaWYgKGZvcm1hdCAmICgxIDw8IFVBQ19GT1JNQVRfVFlQRV9JX1BDTSkpIHsKQEAgLTgzLDkgKzgzLDkgQEAKIAkJICAgIHNhbXBsZV93aWR0aCA9PSAyNCAmJiBzYW1wbGVfYnl0ZXMgPT0gMikKIAkJCXNhbXBsZV9ieXRlcyA9IDM7CiAJCWVsc2UgaWYgKHNhbXBsZV93aWR0aCA+IHNhbXBsZV9ieXRlcyAqIDgpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICIlZDoldTolZCA6IHNhbXBsZSBiaXR3aWR0aCAlZCBpbiBvdmVyIHNhbXBsZSBieXRlcyAlZFxuIiwKLQkJCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywKLQkJCQkgICBzYW1wbGVfd2lkdGgsIHNhbXBsZV9ieXRlcyk7CisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLCAiJXU6JWQgOiBzYW1wbGUgYml0d2lkdGggJWQgaW4gb3ZlciBzYW1wbGUgYnl0ZXMgJWRcbiIsCisJCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCisJCQkJIHNhbXBsZV93aWR0aCwgc2FtcGxlX2J5dGVzKTsKIAkJfQogCQkvKiBjaGVjayB0aGUgZm9ybWF0IGJ5dGUgc2l6ZSAqLwogCQlzd2l0Y2ggKHNhbXBsZV9ieXRlcykgewpAQCAtMTA4LDkgKzEwOCwxMCBAQAogCQkJcGNtX2Zvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9TMzJfTEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPICIlZDoldTolZCA6IHVuc3VwcG9ydGVkIHNhbXBsZSBiaXR3aWR0aCAlZCBpbiAlZCBieXRlc1xuIiwKLQkJCQkgICBjaGlwLT5kZXYtPmRldm51bSwgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywKLQkJCQkgICBzYW1wbGVfd2lkdGgsIHNhbXBsZV9ieXRlcyk7CisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJCSAiJXU6JWQgOiB1bnN1cHBvcnRlZCBzYW1wbGUgYml0d2lkdGggJWQgaW4gJWQgYnl0ZXNcbiIsCisJCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCisJCQkJIHNhbXBsZV93aWR0aCwgc2FtcGxlX2J5dGVzKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTMyLDggKzEzMyw5IEBACiAJCXBjbV9mb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfTVVfTEFXOwogCX0KIAlpZiAoZm9ybWF0ICYgfjB4M2YpIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gIiVkOiV1OiVkIDogdW5zdXBwb3J0ZWQgZm9ybWF0IGJpdHMgJSN4XG4iLAotCQkJICAgY2hpcC0+ZGV2LT5kZXZudW0sIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsIGZvcm1hdCk7CisJCXVzYl9hdWRpb19pbmZvKGNoaXAsCisJCQkgIiV1OiVkIDogdW5zdXBwb3J0ZWQgZm9ybWF0IGJpdHMgJSN4XG4iLAorCQkJIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsIGZvcm1hdCk7CiAJfQogCiAJcGNtX2Zvcm1hdHMgfD0gc25kX3VzYl9pbnRlcmZhY2VfZHNkX2Zvcm1hdF9xdWlya3MoY2hpcCwgZnAsIHNhbXBsZV9ieXRlcyk7CkBAIC0xNTgsOCArMTYwLDkgQEAKIAlpbnQgbnJfcmF0ZXMgPSBmbXRbb2Zmc2V0XTsKIAogCWlmIChmbXRbMF0gPCBvZmZzZXQgKyAxICsgMyAqIChucl9yYXRlcyA/IG5yX3JhdGVzIDogMikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAotCQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLAorCQkJIiV1OiVkIDogaW52YWxpZCBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKKwkJCWZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MSw3ICsxNzQsNyBAQAogCiAJCWZwLT5yYXRlX3RhYmxlID0ga21hbGxvYyhzaXplb2YoaW50KSAqIG5yX3JhdGVzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGZwLT5yYXRlX3RhYmxlID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQkJdXNiX2F1ZGlvX2VycihjaGlwLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0yMjIsNyArMjI1LDggQEAKICAqIGdldCB0byBrbm93IGhvdyBtYW55IHNhbXBsZSByYXRlcyB3ZSBoYXZlIHRvIGV4cGVjdC4KICAqIFRoZW4gZnAtPnJhdGVfdGFibGUgY2FuIGJlIGFsbG9jYXRlZCBhbmQgZmlsbGVkLgogICovCi1zdGF0aWMgaW50IHBhcnNlX3VhYzJfc2FtcGxlX3JhdGVfcmFuZ2Uoc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCwgaW50IG5yX3RyaXBsZXRzLAorc3RhdGljIGludCBwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJCQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwLCBpbnQgbnJfdHJpcGxldHMsCiAJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CiAJaW50IGksIG5yX3JhdGVzID0gMDsKQEAgLTI2MSw3ICsyNjUsNyBAQAogCiAJCQlucl9yYXRlcysrOwogCQkJaWYgKG5yX3JhdGVzID49IE1BWF9OUl9SQVRFUykgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgdWFjMiByYXRlc1xuIik7CisJCQkJdXNiX2F1ZGlvX2VycihjaGlwLCAiaW52YWxpZCB1YWMyIHJhdGVzXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtMjg3LDcgKzI5MSw4IEBACiAJaW50IGNsb2NrID0gc25kX3VzYl9jbG9ja19maW5kX3NvdXJjZShjaGlwLCBmcC0+Y2xvY2ssIGZhbHNlKTsKIAogCWlmIChjbG9jayA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXMoKTogdW5hYmxlIHRvIGZpbmQgY2xvY2sgc291cmNlIChjbG9jayAlZClcbiIsCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIiVzKCk6IHVuYWJsZSB0byBmaW5kIGNsb2NrIHNvdXJjZSAoY2xvY2sgJWQpXG4iLAogCQkJCV9fZnVuY19fLCBjbG9jayk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMwMCw3ICszMDUsOCBAQAogCQkJICAgICAgdG1wLCBzaXplb2YodG1wKSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgbnVtYmVyIG9mIHNhbXBsZSByYXRlcyAoY2xvY2sgJWQpXG4iLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgbnVtYmVyIG9mIHNhbXBsZSByYXRlcyAoY2xvY2sgJWQpXG4iLAogCQkJCV9fZnVuY19fLCBjbG9jayk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMyMSw3ICszMjcsOCBAQAogCQkJICAgICAgZGF0YSwgZGF0YV9zaXplKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzKCk6IHVuYWJsZSB0byByZXRyaWV2ZSBzYW1wbGUgcmF0ZSByYW5nZSAoY2xvY2sgJWQpXG4iLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgc2FtcGxlIHJhdGUgcmFuZ2UgKGNsb2NrICVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgY2xvY2spOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9mcmVlOwpAQCAtMzMyLDcgKzMzOSw3IEBACiAJICogd2lsbCBoYXZlIHRvIGRlYWwgd2l0aC4gKi8KIAlrZnJlZShmcC0+cmF0ZV90YWJsZSk7CiAJZnAtPnJhdGVfdGFibGUgPSBOVUxMOwotCWZwLT5ucl9yYXRlcyA9IHBhcnNlX3VhYzJfc2FtcGxlX3JhdGVfcmFuZ2UoZnAsIG5yX3RyaXBsZXRzLCBkYXRhKTsKKwlmcC0+bnJfcmF0ZXMgPSBwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKGNoaXAsIGZwLCBucl90cmlwbGV0cywgZGF0YSk7CiAKIAlpZiAoZnAtPm5yX3JhdGVzID09IDApIHsKIAkJLyogU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyAqLwpAQCAtMzQ4LDcgKzM1NSw3IEBACiAKIAkvKiBDYWxsIHRoZSB0cmlwbGV0IHBhcnNlciBhZ2FpbiwgYnV0IHRoaXMgdGltZSwgZnAtPnJhdGVfdGFibGUgaXMKIAkgKiBhbGxvY2F0ZWQsIHNvIHRoZSByYXRlcyB3aWxsIGJlIHN0b3JlZCAqLwotCXBhcnNlX3VhYzJfc2FtcGxlX3JhdGVfcmFuZ2UoZnAsIG5yX3RyaXBsZXRzLCBkYXRhKTsKKwlwYXJzZV91YWMyX3NhbXBsZV9yYXRlX3JhbmdlKGNoaXAsIGZwLCBucl90cmlwbGV0cywgZGF0YSk7CiAKIGVycl9mcmVlOgogCWtmcmVlKGRhdGEpOwpAQCAtNDA4LDggKzQxNSw5IEBACiAJfQogCiAJaWYgKGZwLT5jaGFubmVscyA8IDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIGNoYW5uZWxzICVkXG4iLAotCQkJICAgY2hpcC0+ZGV2LT5kZXZudW0sIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsIGZwLT5jaGFubmVscyk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSIldTolZCA6IGludmFsaWQgY2hhbm5lbHMgJWRcbiIsCisJCQlmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLCBmcC0+Y2hhbm5lbHMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQzNSw4ICs0NDMsOSBAQAogCQlmcC0+Zm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfTVBFRzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZChLRVJOX0lORk8gIiVkOiV1OiVkIDogdW5rbm93biBmb3JtYXQgdGFnICUjeCBpcyBkZXRlY3RlZC4gIHByb2Nlc3NlZCBhcyBNUEVHLlxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLCBmb3JtYXQpOworCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJICIldTolZCA6IHVua25vd24gZm9ybWF0IHRhZyAlI3ggaXMgZGV0ZWN0ZWQuICBwcm9jZXNzZWQgYXMgTVBFRy5cbiIsCisJCQkgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywgZm9ybWF0KTsKIAkJZnAtPmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX01QRUc7CiAJCWJyZWFrOwogCX0KQEAgLTQ0OSw3ICs0NTgsNyBAQAogCQlzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lpX2Rpc2NyZXRlX2Rlc2NyaXB0b3IgKmZtdCA9IF9mbXQ7CiAJCWJyYXRlID0gbGUxNl90b19jcHUoZm10LT53TWF4Qml0UmF0ZSk7CiAJCWZyYW1lc2l6ZSA9IGxlMTZfdG9fY3B1KGZtdC0+d1NhbXBsZXNQZXJGcmFtZSk7Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJmb3VuZCBmb3JtYXQgSUkgd2l0aCBtYXguYml0cmF0ZSA9ICVkLCBmcmFtZSBzaXplPSVkXG4iLCBicmF0ZSwgZnJhbWVzaXplKTsKKwkJdXNiX2F1ZGlvX2luZm8oY2hpcCwgImZvdW5kIGZvcm1hdCBJSSB3aXRoIG1heC5iaXRyYXRlID0gJWQsIGZyYW1lIHNpemU9JWRcbiIsIGJyYXRlLCBmcmFtZXNpemUpOwogCQlmcC0+ZnJhbWVfc2l6ZSA9IGZyYW1lc2l6ZTsKIAkJcmV0ID0gcGFyc2VfYXVkaW9fZm9ybWF0X3JhdGVzX3YxKGNoaXAsIGZwLCBfZm10LCA4KTsgLyogZm10WzguLl0gc2FtcGxlIHJhdGVzICovCiAJCWJyZWFrOwpAQCAtNDU4LDcgKzQ2Nyw3IEBACiAJCXN0cnVjdCB1YWNfZm9ybWF0X3R5cGVfaWlfZXh0X2Rlc2NyaXB0b3IgKmZtdCA9IF9mbXQ7CiAJCWJyYXRlID0gbGUxNl90b19jcHUoZm10LT53TWF4Qml0UmF0ZSk7CiAJCWZyYW1lc2l6ZSA9IGxlMTZfdG9fY3B1KGZtdC0+d1NhbXBsZXNQZXJGcmFtZSk7Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJmb3VuZCBmb3JtYXQgSUkgd2l0aCBtYXguYml0cmF0ZSA9ICVkLCBmcmFtZSBzaXplPSVkXG4iLCBicmF0ZSwgZnJhbWVzaXplKTsKKwkJdXNiX2F1ZGlvX2luZm8oY2hpcCwgImZvdW5kIGZvcm1hdCBJSSB3aXRoIG1heC5iaXRyYXRlID0gJWQsIGZyYW1lIHNpemU9JWRcbiIsIGJyYXRlLCBmcmFtZXNpemUpOwogCQlmcC0+ZnJhbWVfc2l6ZSA9IGZyYW1lc2l6ZTsKIAkJcmV0ID0gcGFyc2VfYXVkaW9fZm9ybWF0X3JhdGVzX3YyKGNoaXAsIGZwKTsKIAkJYnJlYWs7CkBAIC00ODQsOSArNDkzLDEwIEBACiAJCWVyciA9IHBhcnNlX2F1ZGlvX2Zvcm1hdF9paShjaGlwLCBmcCwgZm9ybWF0LCBmbXQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQgOiBmb3JtYXQgdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkIHlldFxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBmcC0+aWZhY2UsIGZwLT5hbHRzZXR0aW5nLAotCQkJICAgZm10LT5iRm9ybWF0VHlwZSk7CisJCXVzYl9hdWRpb19pbmZvKGNoaXAsCisJCQkgIiV1OiVkIDogZm9ybWF0IHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIsCisJCQkgZnAtPmlmYWNlLCBmcC0+YWx0c2V0dGluZywKKwkJCSBmbXQtPmJGb3JtYXRUeXBlKTsKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiAJZnAtPmZtdF90eXBlID0gZm10LT5iRm9ybWF0VHlwZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9oaWZhY2UvY2hpcC5jIGIvc291bmQvdXNiL2hpZmFjZS9jaGlwLmMKaW5kZXggYjBkY2IzOS4uMjY3MGQ2NDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9oaWZhY2UvY2hpcC5jCisrKyBiL3NvdW5kL3VzYi9oaWZhY2UvY2hpcC5jCkBAIC02NCw3ICs2NCw4IEBACiAJdTggZXh0cmFfZnJlcTsKIH07CiAKLXN0YXRpYyBpbnQgaGlmYWNlX2NoaXBfY3JlYXRlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsCitzdGF0aWMgaW50IGhpZmFjZV9jaGlwX2NyZWF0ZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIGludCBpZHgsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgaGlmYWNlX3ZlbmRvcl9xdWlyayAqcXVpcmssCiAJCQkgICAgICBzdHJ1Y3QgaGlmYWNlX2NoaXAgKipyY2hpcCkKIHsKQEAgLTc2LDcgKzc3LDggQEAKIAkqcmNoaXAgPSBOVUxMOwogCiAJLyogaWYgd2UgYXJlIGhlcmUsIGNhcmQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYWxzYS4gKi8KLQlyZXQgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbaWR4XSwgaWRbaWR4XSwgVEhJU19NT0RVTEUsIHNpemVvZigqY2hpcCksICZjYXJkKTsKKwlyZXQgPSBzbmRfY2FyZF9uZXcoJmludGYtPmRldiwgaW5kZXhbaWR4XSwgaWRbaWR4XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2YoKmNoaXApLCAmY2FyZCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmZGV2aWNlLT5kZXYsICJjYW5ub3QgY3JlYXRlIGFsc2EgY2FyZC5cbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTMyLDEyICsxMzQsMTAgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gaGlmYWNlX2NoaXBfY3JlYXRlKGRldmljZSwgaSwgcXVpcmssICZjaGlwKTsKKwlyZXQgPSBoaWZhY2VfY2hpcF9jcmVhdGUoaW50ZiwgZGV2aWNlLCBpLCBxdWlyaywgJmNoaXApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2hpcC0+Y2FyZCwgJmludGYtPmRldik7Ci0KIAlyZXQgPSBoaWZhY2VfcGNtX2luaXQoY2hpcCwgcXVpcmsgPyBxdWlyay0+ZXh0cmFfZnJlcSA6IDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9jaGlwX2Rlc3Ryb3k7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWlkaS5jIGIvc291bmQvdXNiL21pZGkuYwppbmRleCBiOTAxZjQ2Li45ZGE3NGQyIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWlkaS5jCisrKyBiL3NvdW5kL3VzYi9taWRpLmMKQEAgLTE5MSwxNiArMTkxLDE2IEBACiB7CiAJaW50IGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgZmxhZ3MpOwogCWlmIChlcnIgPCAwICYmIGVyciAhPSAtRU5PREVWKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2Jfc3VibWl0X3VyYjogJWRcbiIsIGVycik7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYjogJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIAogLyoKICAqIEVycm9yIGhhbmRsaW5nIGZvciBVUkIgY29tcGxldGlvbiBmdW5jdGlvbnMuCiAgKi8KLXN0YXRpYyBpbnQgc25kX3VzYm1pZGlfdXJiX2Vycm9yKGludCBzdGF0dXMpCitzdGF0aWMgaW50IHNuZF91c2JtaWRpX3VyYl9lcnJvcihjb25zdCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3dpdGNoIChzdGF0dXMpIHsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJLyogbWFudWFsbHkgdW5saW5rZWQsIG9yIGRldmljZSBnb25lICovCiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVDT05OUkVTRVQ6CkBAIC0yMTMsNyArMjEzLDcgQEAKIAljYXNlIC1FSUxTRVE6CiAJCXJldHVybiAtRUlPOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVyYiBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJ1cmIgc3RhdHVzICVkXG4iLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybiAwOyAvKiBjb250aW51ZSAqLwogCX0KIH0KQEAgLTIyNyw3ICsyMjcsNyBAQAogCXN0cnVjdCB1c2JtaWRpX2luX3BvcnQqIHBvcnQgPSAmZXAtPnBvcnRzW3BvcnRpZHhdOwogCiAJaWYgKCFwb3J0LT5zdWJzdHJlYW0pIHsKLQkJc25kX3ByaW50ZCgidW5leHBlY3RlZCBwb3J0ICVkIVxuIiwgcG9ydGlkeCk7CisJCWRldl9kYmcoJmVwLT51bWlkaS0+ZGV2LT5kZXYsICJ1bmV4cGVjdGVkIHBvcnQgJWQhXG4iLCBwb3J0aWR4KTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoIXRlc3RfYml0KHBvcnQtPnN1YnN0cmVhbS0+bnVtYmVyLCAmZXAtPnVtaWRpLT5pbnB1dF90cmlnZ2VyZWQpKQpAQCAtMjU5LDcgKzI1OSw3IEBACiAJCWVwLT51bWlkaS0+dXNiX3Byb3RvY29sX29wcy0+aW5wdXQoZXAsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAogCQkJCQkJICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAl9IGVsc2UgewotCQlpbnQgZXJyID0gc25kX3VzYm1pZGlfdXJiX2Vycm9yKHVyYi0+c3RhdHVzKTsKKwkJaW50IGVyciA9IHNuZF91c2JtaWRpX3VyYl9lcnJvcih1cmIpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaWYgKGVyciAhPSAtRU5PREVWKSB7CiAJCQkJZXAtPmVycm9yX3Jlc3VibWl0ID0gMTsKQEAgLTI4OSw3ICsyODksNyBAQAogCX0KIAlzcGluX3VubG9jaygmZXAtPmJ1ZmZlcl9sb2NrKTsKIAlpZiAodXJiLT5zdGF0dXMgPCAwKSB7Ci0JCWludCBlcnIgPSBzbmRfdXNibWlkaV91cmJfZXJyb3IodXJiLT5zdGF0dXMpOworCQlpbnQgZXJyID0gc25kX3VzYm1pZGlfdXJiX2Vycm9yKHVyYik7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlpZiAoZXJyICE9IC1FTk9ERVYpCiAJCQkJbW9kX3RpbWVyKCZlcC0+dW1pZGktPmVycm9yX3RpbWVyLApAQCAtMTY2OCw3ICsxNjY4LDcgQEAKIAogCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHNuZF91c2JtaWRpX2ZpbmRfc3Vic3RyZWFtKHVtaWRpLCBzdHJlYW0sIG51bWJlcik7CiAJaWYgKCFzdWJzdHJlYW0pIHsKLQkJc25kX3ByaW50ZChLRVJOX0VSUiAic3Vic3RyZWFtICVkOiVkIG5vdCBmb3VuZFxuIiwgc3RyZWFtLCBudW1iZXIpOworCQlkZXZfZXJyKCZ1bWlkaS0+ZGV2LT5kZXYsICJzdWJzdHJlYW0gJWQ6JWQgbm90IGZvdW5kXG4iLCBzdHJlYW0sIG51bWJlcik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3MTcsNyArMTcxNyw3IEBACiAJCQl9CiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJjcmVhdGVkICVkIG91dHB1dCBhbmQgJWQgaW5wdXQgcG9ydHNcbiIsCisJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAiY3JlYXRlZCAlZCBvdXRwdXQgYW5kICVkIGlucHV0IHBvcnRzXG4iLAogCQkgICAgb3V0X3BvcnRzLCBpbl9wb3J0cyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzQ3LDEwICsxNzQ3LDExIEBACiAJICAgIG1zX2hlYWRlci0+Ykxlbmd0aCA+PSA3ICYmCiAJICAgIG1zX2hlYWRlci0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9DU19JTlRFUkZBQ0UgJiYKIAkgICAgbXNfaGVhZGVyLT5iRGVzY3JpcHRvclN1YnR5cGUgPT0gVUFDX0hFQURFUikKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJNSURJU3RyZWFtaW5nIHZlcnNpb24gJTAyeC4lMDJ4XG4iLAorCQlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJNSURJU3RyZWFtaW5nIHZlcnNpb24gJTAyeC4lMDJ4XG4iLAogCQkJICAgIG1zX2hlYWRlci0+YmNkTVNDWzFdLCBtc19oZWFkZXItPmJjZE1TQ1swXSk7CiAJZWxzZQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiTUlESVN0cmVhbWluZyBpbnRlcmZhY2UgZGVzY3JpcHRvciBub3QgZm91bmRcbiIpOworCQlkZXZfd2FybigmdW1pZGktPmRldi0+ZGV2LAorCQkJICJNSURJU3RyZWFtaW5nIGludGVyZmFjZSBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIik7CiAKIAllcGlkeCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IGludGZkLT5iTnVtRW5kcG9pbnRzOyArK2kpIHsKQEAgLTE3NjcsNyArMTc2OCw4IEBACiAJCWlmICh1c2JfZW5kcG9pbnRfZGlyX291dChlcCkpIHsKIAkJCWlmIChlbmRwb2ludHNbZXBpZHhdLm91dF9lcCkgewogCQkJCWlmICgrK2VwaWR4ID49IE1JRElfTUFYX0VORFBPSU5UUykgewotCQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIG1hbnkgZW5kcG9pbnRzXG4iKTsKKwkJCQkJZGV2X3dhcm4oJnVtaWRpLT5kZXYtPmRldiwKKwkJCQkJCSAidG9vIG1hbnkgZW5kcG9pbnRzXG4iKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMTc4MiwxMiArMTc4NCwxMyBAQAogCQkJCSAqLwogCQkJCWVuZHBvaW50c1tlcGlkeF0ub3V0X2ludGVydmFsID0gMTsKIAkJCWVuZHBvaW50c1tlcGlkeF0ub3V0X2NhYmxlcyA9ICgxIDw8IG1zX2VwLT5iTnVtRW1iTUlESUphY2spIC0gMTsKLQkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiRVAgJTAyWDogJWQgamFjayhzKVxuIiwKKwkJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgIkVQICUwMlg6ICVkIGphY2socylcbiIsCiAJCQkJICAgIGVwLT5iRW5kcG9pbnRBZGRyZXNzLCBtc19lcC0+Yk51bUVtYk1JRElKYWNrKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChlbmRwb2ludHNbZXBpZHhdLmluX2VwKSB7CiAJCQkJaWYgKCsrZXBpZHggPj0gTUlESV9NQVhfRU5EUE9JTlRTKSB7Ci0JCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ0b28gbWFueSBlbmRwb2ludHNcbiIpOworCQkJCQlkZXZfd2FybigmdW1pZGktPmRldi0+ZGV2LAorCQkJCQkJICJ0b28gbWFueSBlbmRwb2ludHNcbiIpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0xNzk3LDcgKzE4MDAsNyBAQAogCQkJZWxzZSBpZiAoc25kX3VzYl9nZXRfc3BlZWQodW1pZGktPmRldikgPT0gVVNCX1NQRUVEX0xPVykKIAkJCQllbmRwb2ludHNbZXBpZHhdLmluX2ludGVydmFsID0gMTsKIAkJCWVuZHBvaW50c1tlcGlkeF0uaW5fY2FibGVzID0gKDEgPDwgbXNfZXAtPmJOdW1FbWJNSURJSmFjaykgLSAxOwotCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJFUCAlMDJYOiAlZCBqYWNrKHMpXG4iLAorCQkJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAiRVAgJTAyWDogJWQgamFjayhzKVxuIiwKIAkJCQkgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MsIG1zX2VwLT5iTnVtRW1iTUlESUphY2spOwogCQl9CiAJfQpAQCAtMTg2NSw3ICsxODY4LDcgQEAKIAkgICAgKGdldF9lbmRwb2ludChob3N0aWYsIDEpLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQogCQlyZXR1cm47CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInN3aXRjaGluZyB0byBhbHRzZXR0aW5nICVkIHdpdGggaW50IGVwXG4iLAorCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgInN3aXRjaGluZyB0byBhbHRzZXR0aW5nICVkIHdpdGggaW50IGVwXG4iLAogCQkgICAgaW50ZmQtPmJBbHRlcm5hdGVTZXR0aW5nKTsKIAl1c2Jfc2V0X2ludGVyZmFjZSh1bWlkaS0+ZGV2LCBpbnRmZC0+YkludGVyZmFjZU51bWJlciwKIAkJCSAgaW50ZmQtPmJBbHRlcm5hdGVTZXR0aW5nKTsKQEAgLTIwNDcsMjUgKzIwNTAsMjUgQEAKIAkgKiBpbnB1dCBidWxrIGVuZHBvaW50cyAoYXQgaW5kaWNlcyAxIGFuZCAzKSB3aGljaCBhcmVuJ3QgdXNlZC4KIAkgKi8KIAlpZiAoaW50ZmQtPmJOdW1FbmRwb2ludHMgPCAoZW5kcG9pbnQtPm91dF9jYWJsZXMgPiAweDAwMDEgPyA1IDogMykpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIm5vdCBlbm91Z2ggZW5kcG9pbnRzXG4iKTsKKwkJZGV2X2RiZygmdW1pZGktPmRldi0+ZGV2LCAibm90IGVub3VnaCBlbmRwb2ludHNcbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKIAllcGQgPSBnZXRfZW5kcG9pbnQoaG9zdGlmLCAwKTsKIAlpZiAoIXVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImVuZHBvaW50WzBdIGlzbid0IGludGVycnVwdFxuIik7CisJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgImVuZHBvaW50WzBdIGlzbid0IGludGVycnVwdFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIDIpOwogCWlmICghdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpKSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fRVJSICJlbmRwb2ludFsyXSBpc24ndCBidWxrIG91dHB1dFxuIik7CisJCWRldl9kYmcoJnVtaWRpLT5kZXYtPmRldiwgImVuZHBvaW50WzJdIGlzbid0IGJ1bGsgb3V0cHV0XG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAJaWYgKGVuZHBvaW50LT5vdXRfY2FibGVzID4gMHgwMDAxKSB7CiAJCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIDQpOwogCQlpZiAoIXVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkgfHwKIAkJICAgICF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fRVJSICJlbmRwb2ludFs0XSBpc24ndCBidWxrIG91dHB1dFxuIik7CisJCQlkZXZfZGJnKCZ1bWlkaS0+ZGV2LT5kZXYsICJlbmRwb2ludFs0XSBpc24ndCBidWxrIG91dHB1dFxuIik7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJfQpAQCAtMjI4OSw3ICsyMjkyLDcgQEAKIAkJZXJyID0gc25kX3VzYm1pZGlfZGV0ZWN0X3Blcl9wb3J0X2VuZHBvaW50cyh1bWlkaSwgZW5kcG9pbnRzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCBxdWlyayB0eXBlICVkXG4iLCBxdWlyay0+dHlwZSk7CisJCWRldl9lcnIoJnVtaWRpLT5kZXYtPmRldiwgImludmFsaWQgcXVpcmsgdHlwZSAlZFxuIiwgcXVpcmstPnR5cGUpOwogCQllcnIgPSAtRU5YSU87CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMgYi9zb3VuZC91c2IvbWlzYy91YTEwMS5jCmluZGV4IDUwOTMxNTkuLmExYmFiMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMKKysrIGIvc291bmQvdXNiL21pc2MvdWExMDEuYwpAQCAtMTI0Myw4ICsxMjQzLDkgQEAKIAkJbXV0ZXhfdW5sb2NrKCZkZXZpY2VzX211dGV4KTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtjYXJkX2luZGV4XSwgaWRbY2FyZF9pbmRleF0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKCp1YSksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmludGVyZmFjZS0+ZGV2LAorCQkJICAgaW5kZXhbY2FyZF9pbmRleF0sIGlkW2NhcmRfaW5kZXhdLCBUSElTX01PRFVMRSwKKwkJCSAgIHNpemVvZigqdWEpLCAmY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXZpY2VzX211dGV4KTsKIAkJcmV0dXJuIGVycjsKQEAgLTEyODMsOCArMTI4NCw2IEBACiAJCX0KIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZpbnRlcmZhY2UtPmRldik7Ci0KIAllcnIgPSBkZXRlY3RfdXNiX2Zvcm1hdCh1YSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gcHJvYmVfZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuYyBiL3NvdW5kL3VzYi9taXhlci5jCmluZGV4IDFiZWQ3ODAuLmQ0MGEyODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5jCisrKyBiL3NvdW5kL3VzYi9taXhlci5jCkBAIC0zMDUsOCArMzA1LDkgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQotCXNuZF9wcmludGRkKEtFUk5fRVJSICJjYW5ub3QgZ2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkXG4iLAotCQkgICAgcmVxdWVzdCwgdmFsaWR4LCBpZHgsIGN2YWwtPnZhbF90eXBlKTsKKwl1c2JfYXVkaW9fZGJnKGNoaXAsCisJCSJjYW5ub3QgZ2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkXG4iLAorCQlyZXF1ZXN0LCB2YWxpZHgsIGlkeCwgY3ZhbC0+dmFsX3R5cGUpOwogCWVyciA9IC1FSU5WQUw7CiAKICBvdXQ6CkBAIC0zNTEsOCArMzUyLDkgQEAKIAogCWlmIChyZXQgPCAwKSB7CiBlcnJvcjoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdldCBjdGwgdmFsdWU6IHJlcSA9ICUjeCwgd1ZhbHVlID0gJSN4LCB3SW5kZXggPSAlI3gsIHR5cGUgPSAlZFxuIiwKLQkJCSAgIHJlcXVlc3QsIHZhbGlkeCwgaWR4LCBjdmFsLT52YWxfdHlwZSk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwKKwkJCSJjYW5ub3QgZ2V0IGN0bCB2YWx1ZTogcmVxID0gJSN4LCB3VmFsdWUgPSAlI3gsIHdJbmRleCA9ICUjeCwgdHlwZSA9ICVkXG4iLAorCQkJcmVxdWVzdCwgdmFsaWR4LCBpZHgsIGN2YWwtPnZhbF90eXBlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQxMyw3ICs0MTUsOCBAQAogCWVyciA9IGdldF9jdXJfbWl4X3JhdyhjdmFsLCBjaGFubmVsLCB2YWx1ZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJaWYgKCFjdmFsLT5taXhlci0+aWdub3JlX2N0bF9lcnJvcikKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImNhbm5vdCBnZXQgY3VycmVudCB2YWx1ZSBmb3IgY29udHJvbCAlZCBjaCAlZDogZXJyID0gJWRcbiIsCisJCQl1c2JfYXVkaW9fZGJnKGN2YWwtPm1peGVyLT5jaGlwLAorCQkJCSJjYW5ub3QgZ2V0IGN1cnJlbnQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgY2ggJWQ6IGVyciA9ICVkXG4iLAogCQkJCSAgIGN2YWwtPmNvbnRyb2wsIGNoYW5uZWwsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNDQ0LDcgKzQ0Nyw3IEBACiAKIAkJLyogRklYTUUgKi8KIAkJaWYgKHJlcXVlc3QgIT0gVUFDX1NFVF9DVVIpIHsKLQkJCXNuZF9wcmludGRkKEtFUk5fV0FSTklORyAiUkFOR0Ugc2V0dGluZyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisJCQl1c2JfYXVkaW9fZGJnKGNoaXAsICJSQU5HRSBzZXR0aW5nIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTQ3MCw3ICs0NzMsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0Jc25kX3ByaW50ZGQoS0VSTl9FUlIgImNhbm5vdCBzZXQgY3RsIHZhbHVlOiByZXEgPSAlI3gsIHdWYWx1ZSA9ICUjeCwgd0luZGV4ID0gJSN4LCB0eXBlID0gJWQsIGRhdGEgPSAlI3gvJSN4XG4iLAorCXVzYl9hdWRpb19kYmcoY2hpcCwgImNhbm5vdCBzZXQgY3RsIHZhbHVlOiByZXEgPSAlI3gsIHdWYWx1ZSA9ICUjeCwgd0luZGV4ID0gJSN4LCB0eXBlID0gJWQsIGRhdGEgPSAlI3gvJSN4XG4iLAogCQkgICAgcmVxdWVzdCwgdmFsaWR4LCBpZHgsIGN2YWwtPnZhbF90eXBlLCBidWZbMF0sIGJ1ZlsxXSk7CiAJZXJyID0gLUVJTlZBTDsKIApAQCAtNDk0LDcgKzQ5Nyw4IEBACiAJCWN2YWwtPmNoX3JlYWRvbmx5ICYgKDEgPDwgKGNoYW5uZWwgLSAxKSk7CiAKIAlpZiAocmVhZF9vbmx5KSB7Ci0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJXMoKTogY2hhbm5lbCAlZCBvZiBjb250cm9sICVkIGlzIHJlYWRfb25seVxuIiwKKwkJdXNiX2F1ZGlvX2RiZyhjdmFsLT5taXhlci0+Y2hpcCwKKwkJCSAgICAgICIlcygpOiBjaGFubmVsICVkIG9mIGNvbnRyb2wgJWQgaXMgcmVhZF9vbmx5XG4iLAogCQkJICAgIF9fZnVuY19fLCBjaGFubmVsLCBjdmFsLT5jb250cm9sKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTYwLDcgKzU2NCw3IEBACiAJd2hpbGUgKHNuZF9jdGxfZmluZF9pZChtaXhlci0+Y2hpcC0+Y2FyZCwgJmtjdGwtPmlkKSkKIAkJa2N0bC0+aWQuaW5kZXgrKzsKIAlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKG1peGVyLT5jaGlwLT5jYXJkLCBrY3RsKSkgPCAwKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9FUlIgImNhbm5vdCBhZGQgY29udHJvbCAoZXJyID0gJWQpXG4iLCBlcnIpOworCQl1c2JfYXVkaW9fZGJnKG1peGVyLT5jaGlwLCAiY2Fubm90IGFkZCBjb250cm9sIChlcnIgPSAlZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCWN2YWwtPmVsZW1faWQgPSAma2N0bC0+aWQ7CkBAIC04MDcsNyArODExLDggQEAKIHN0YXRpYyB2b2lkIHZvbHVtZV9jb250cm9sX3F1aXJrcyhzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqY3ZhbCwKIAkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwpCiB7Ci0Jc3dpdGNoIChjdmFsLT5taXhlci0+Y2hpcC0+dXNiX2lkKSB7CisJc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAgPSBjdmFsLT5taXhlci0+Y2hpcDsKKwlzd2l0Y2ggKGNoaXAtPnVzYl9pZCkgewogCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDMwKTogLyogTS1BdWRpbyBGYXN0IFRyYWNrIEM0MDAgKi8KIAljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjAzMSk6IC8qIE0tQXVkaW8gRmFzdCBUcmFjayBDNjAwICovCiAJCWlmIChzdHJjbXAoa2N0bC0+aWQubmFtZSwgIkVmZmVjdCBEdXJhdGlvbiIpID09IDApIHsKQEAgLTgzOSw4ICs4NDQsOCBAQAogCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDgxKTogLyogTS1BdWRpbyBGYXN0IFRyYWNrIFVsdHJhIDhSICovCiAJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwODApOiAvKiBNLUF1ZGlvIEZhc3QgVHJhY2sgVWx0cmEgKi8KIAkJaWYgKHN0cmNtcChrY3RsLT5pZC5uYW1lLCAiRWZmZWN0IER1cmF0aW9uIikgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkidXNiLWF1ZGlvOiBzZXQgcXVpcmsgZm9yIEZUVSBFZmZlY3QgRHVyYXRpb25cbiIpOworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKKwkJCQkgICAgICAgInNldCBxdWlyayBmb3IgRlRVIEVmZmVjdCBEdXJhdGlvblxuIik7CiAJCQljdmFsLT5taW4gPSAweDAwMDA7CiAJCQljdmFsLT5tYXggPSAweDdmMDA7CiAJCQljdmFsLT5yZXMgPSAweDAxMDA7CkBAIC04NDgsOCArODUzLDggQEAKIAkJfQogCQlpZiAoc3RyY21wKGtjdGwtPmlkLm5hbWUsICJFZmZlY3QgVm9sdW1lIikgPT0gMCB8fAogCQkgICAgc3RyY21wKGtjdGwtPmlkLm5hbWUsICJFZmZlY3QgRmVlZGJhY2sgVm9sdW1lIikgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkidXNiLWF1ZGlvOiBzZXQgcXVpcmtzIGZvciBGVFUgRWZmZWN0IEZlZWRiYWNrL1ZvbHVtZVxuIik7CisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLAorCQkJCSAgICAgICAic2V0IHF1aXJrcyBmb3IgRlRVIEVmZmVjdCBGZWVkYmFjay9Wb2x1bWVcbiIpOwogCQkJY3ZhbC0+bWluID0gMHgwMDsKIAkJCWN2YWwtPm1heCA9IDB4N2Y7CiAJCQlicmVhazsKQEAgLTg2Nyw3ICs4NzIsNyBAQAogCSAqLwogCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiUENNIFBsYXliYWNrIFZvbHVtZSIpICYmCiAJCSAgICBjdmFsLT5taW4gPT0gLTE1NjE2KSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKIAkJCQkgInNldCB2b2x1bWUgcXVpcmsgZm9yIFVEQTEzMjEvTjEwMSBjaGlwXG4iKTsKIAkJCWN2YWwtPm1heCA9IC0yNTY7CiAJCX0KQEAgLTg3NSw3ICs4ODAsNyBAQAogCiAJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA5YTQpOgogCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiTWljIENhcHR1cmUgVm9sdW1lIikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPCisJCQl1c2JfYXVkaW9faW5mbyhjaGlwLAogCQkJCSJzZXQgdm9sdW1lIHF1aXJrIGZvciBRdWlja0NhbSBFMzUwMFxuIik7CiAJCQljdmFsLT5taW4gPSA2MDgwOwogCQkJY3ZhbC0+bWF4ID0gODc2ODsKQEAgLTg5Niw3ICs5MDEsNyBAQAogCSAqIFByb2JvbHkgdGhlcmUgaXMgc29tZSBsb2dpdGVjaCBtYWdpYyBiZWhpbmQgdGhpcyBudW1iZXIgLS1maXNob3IKIAkgKi8KIAkJaWYgKCFzdHJjbXAoa2N0bC0+aWQubmFtZSwgIk1pYyBDYXB0dXJlIFZvbHVtZSIpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fSU5GTworCQkJdXNiX2F1ZGlvX2luZm8oY2hpcCwKIAkJCQkic2V0IHJlc29sdXRpb24gcXVpcms6IGN2YWwtPnJlcyA9IDM4NFxuIik7CiAJCQljdmFsLT5yZXMgPSAzODQ7CiAJCX0KQEAgLTkzMiw3ICs5MzcsOCBAQAogCQl9CiAJCWlmIChnZXRfY3RsX3ZhbHVlKGN2YWwsIFVBQ19HRVRfTUFYLCAoY3ZhbC0+Y29udHJvbCA8PCA4KSB8IG1pbmNobiwgJmN2YWwtPm1heCkgPCAwIHx8CiAJCSAgICBnZXRfY3RsX3ZhbHVlKGN2YWwsIFVBQ19HRVRfTUlOLCAoY3ZhbC0+Y29udHJvbCA8PCA4KSB8IG1pbmNobiwgJmN2YWwtPm1pbikgPCAwKSB7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fRVJSICIlZDolZDogY2Fubm90IGdldCBtaW4vbWF4IHZhbHVlcyBmb3IgY29udHJvbCAlZCAoaWQgJWQpXG4iLAorCQkJdXNiX2F1ZGlvX2VycihjdmFsLT5taXhlci0+Y2hpcCwKKwkJCQkgICAgICAiJWQ6JWQ6IGNhbm5vdCBnZXQgbWluL21heCB2YWx1ZXMgZm9yIGNvbnRyb2wgJWQgKGlkICVkKVxuIiwKIAkJCQkgICBjdmFsLT5pZCwgc25kX3VzYl9jdHJsX2ludGYoY3ZhbC0+bWl4ZXItPmNoaXApLCBjdmFsLT5jb250cm9sLCBjdmFsLT5pZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTE5Niw3ICsxMjAyLDcgQEAKIAogCWN2YWwgPSBremFsbG9jKHNpemVvZigqY3ZhbCksIEdGUF9LRVJORUwpOwogCWlmICghIGN2YWwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJcmV0dXJuOwogCX0KIAljdmFsLT5taXhlciA9IHN0YXRlLT5taXhlcjsKQEAgLTEyMjUsNyArMTIzMSw3IEBACiAJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnVzYl9mZWF0dXJlX3VuaXRfY3RsLCBjdmFsKTsKIAogCWlmICghIGtjdGwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJa2ZyZWUoY3ZhbCk7CiAJCXJldHVybjsKIAl9CkBAIC0xMjk5LDE2ICsxMzA1LDE2IEBACiAJICogZGV2aWNlcy4gSXQgd2lsbCBkZWZpbml0aXZlbHkgY2F0Y2ggYWxsIGJ1Z2d5IExvZ2l0ZWNoIGRldmljZXMuCiAJICovCiAJaWYgKHJhbmdlID4gMzg0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ1c2JfYXVkaW86IFdhcm5pbmchIFVubGlrZWx5IGJpZyAiCisJCXVzYl9hdWRpb193YXJuKHN0YXRlLT5jaGlwLCAiV2FybmluZyEgVW5saWtlbHkgYmlnICIKIAkJCSAgICJ2b2x1bWUgcmFuZ2UgKD0ldSksIGN2YWwtPnJlcyBpcyBwcm9iYWJseSB3cm9uZy4iLAogCQkJICAgcmFuZ2UpOwotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidXNiX2F1ZGlvOiBbJWRdIEZVIFslc10gY2ggPSAlZCwgIgorCQl1c2JfYXVkaW9fd2FybihzdGF0ZS0+Y2hpcCwgIlslZF0gRlUgWyVzXSBjaCA9ICVkLCAiCiAJCQkgICAidmFsID0gJWQvJWQvJWQiLCBjdmFsLT5pZCwKIAkJCSAgIGtjdGwtPmlkLm5hbWUsIGN2YWwtPmNoYW5uZWxzLAogCQkJICAgY3ZhbC0+bWluLCBjdmFsLT5tYXgsIGN2YWwtPnJlcyk7CiAJfQogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJbJWRdIEZVIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWQvJWRcbiIsCisJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwgIlslZF0gRlUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZC8lZFxuIiwKIAkJICAgIGN2YWwtPmlkLCBrY3RsLT5pZC5uYW1lLCBjdmFsLT5jaGFubmVscywgY3ZhbC0+bWluLCBjdmFsLT5tYXgsIGN2YWwtPnJlcyk7CiAJc25kX3VzYl9taXhlcl9hZGRfY29udHJvbChzdGF0ZS0+bWl4ZXIsIGtjdGwpOwogfQpAQCAtMTMzMiwxNiArMTMzOCwxNyBAQAogCWlmIChzdGF0ZS0+bWl4ZXItPnByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpIHsKIAkJY3NpemUgPSBoZHItPmJDb250cm9sU2l6ZTsKIAkJaWYgKCFjc2l6ZSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICV1OiAiCi0JCQkJICAgICJpbnZhbGlkIGJDb250cm9sU2l6ZSA9PSAwXG4iLCB1bml0aWQpOworCQkJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwKKwkJCQkgICAgICAidW5pdCAldTogaW52YWxpZCBiQ29udHJvbFNpemUgPT0gMFxuIiwKKwkJCQkgICAgICB1bml0aWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJY2hhbm5lbHMgPSAoaGRyLT5iTGVuZ3RoIC0gNykgLyBjc2l6ZSAtIDE7CiAJCWJtYUNvbnRyb2xzID0gaGRyLT5ibWFDb250cm9sczsKIAkJaWYgKGhkci0+Ykxlbmd0aCA8IDcgKyBjc2l6ZSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiYXVkaW86IHVuaXQgJXU6ICIKLQkJCQkgICAiaW52YWxpZCBVQUNfRkVBVFVSRV9VTklUIGRlc2NyaXB0b3JcbiIsCi0JCQkJICAgdW5pdGlkKTsKKwkJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsCisJCQkJICAgICAgInVuaXQgJXU6IGludmFsaWQgVUFDX0ZFQVRVUkVfVU5JVCBkZXNjcmlwdG9yXG4iLAorCQkJCSAgICAgIHVuaXRpZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMzUwLDkgKzEzNTcsOSBAQAogCQljaGFubmVscyA9IChoZHItPmJMZW5ndGggLSA2KSAvIDQgLSAxOwogCQlibWFDb250cm9scyA9IGZ0ci0+Ym1hQ29udHJvbHM7CiAJCWlmIChoZHItPmJMZW5ndGggPCA2ICsgY3NpemUpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICV1OiAiCi0JCQkJICAgImludmFsaWQgVUFDX0ZFQVRVUkVfVU5JVCBkZXNjcmlwdG9yXG4iLAotCQkJCSAgIHVuaXRpZCk7CisJCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLAorCQkJCSAgICAgICJ1bml0ICV1OiBpbnZhbGlkIFVBQ19GRUFUVVJFX1VOSVQgZGVzY3JpcHRvclxuIiwKKwkJCQkgICAgICB1bml0aWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0xMzcwLDE0ICsxMzc3LDE0IEBACiAJLyogbWFzdGVyIGNvbmZpZ3VyYXRpb24gcXVpcmtzICovCiAJc3dpdGNoIChzdGF0ZS0+Y2hpcC0+dXNiX2lkKSB7CiAJY2FzZSBVU0JfSUQoMHgwOGJiLCAweDI3MDIpOgotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgInVzYm1peGVyOiBtYXN0ZXIgdm9sdW1lIHF1aXJrIGZvciBQQ00yNzAyIGNoaXBcbiIpOworCQl1c2JfYXVkaW9faW5mbyhzdGF0ZS0+Y2hpcCwKKwkJCSAgICAgICAidXNibWl4ZXI6IG1hc3RlciB2b2x1bWUgcXVpcmsgZm9yIFBDTTI3MDIgY2hpcFxuIik7CiAJCS8qIGRpc2FibGUgbm9uLWZ1bmN0aW9uYWwgdm9sdW1lIGNvbnRyb2wgKi8KIAkJbWFzdGVyX2JpdHMgJj0gflVBQ19DT05UUk9MX0JJVChVQUNfRlVfVk9MVU1FKTsKIAkJYnJlYWs7CiAJY2FzZSBVU0JfSUQoMHgxMTMwLCAweGYyMTEpOgotCQlzbmRfcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgInVzYm1peGVyOiB2b2x1bWUgY29udHJvbCBxdWlyayBmb3IgVGVueCBUUDY5MTEgQXVkaW8gSGVhZHNldFxuIik7CisJCXVzYl9hdWRpb19pbmZvKHN0YXRlLT5jaGlwLAorCQkJICAgICAgICJ1c2JtaXhlcjogdm9sdW1lIGNvbnRyb2wgcXVpcmsgZm9yIFRlbnggVFA2OTExIEF1ZGlvIEhlYWRzZXRcbiIpOwogCQkvKiBkaXNhYmxlIG5vbi1mdW5jdGlvbmFsIHZvbHVtZSBjb250cm9sICovCiAJCWNoYW5uZWxzID0gMDsKIAkJYnJlYWs7CkBAIC0xNDc5LDcgKzE0ODYsNyBAQAogCiAJa2N0bCA9IHNuZF9jdGxfbmV3MSgmdXNiX2ZlYXR1cmVfdW5pdF9jdGwsIGN2YWwpOwogCWlmICghIGtjdGwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKIAkJa2ZyZWUoY3ZhbCk7CiAJCXJldHVybjsKIAl9CkBAIC0xNDkyLDcgKzE0OTksNyBAQAogCQlsZW4gPSBzcHJpbnRmKGtjdGwtPmlkLm5hbWUsICJNaXhlciBTb3VyY2UgJWQiLCBpbl9jaCArIDEpOwogCWFwcGVuZF9jdGxfbmFtZShrY3RsLCAiIFZvbHVtZSIpOwogCi0Jc25kX3ByaW50ZGQoS0VSTl9JTkZPICJbJWRdIE1VIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWRcbiIsCisJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwgIlslZF0gTVUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZFxuIiwKIAkJICAgIGN2YWwtPmlkLCBrY3RsLT5pZC5uYW1lLCBjdmFsLT5jaGFubmVscywgY3ZhbC0+bWluLCBjdmFsLT5tYXgpOwogCXNuZF91c2JfbWl4ZXJfYWRkX2NvbnRyb2woc3RhdGUtPm1peGVyLCBrY3RsKTsKIH0KQEAgLTE1MDksMTIgKzE1MTYsMTIgQEAKIAlpbnQgcGluLCBpY2gsIGVycjsKIAogCWlmIChkZXNjLT5iTGVuZ3RoIDwgMTEgfHwgISAoaW5wdXRfcGlucyA9IGRlc2MtPmJOckluUGlucykgfHwgISAobnVtX291dHMgPSB1YWNfbWl4ZXJfdW5pdF9iTnJDaGFubmVscyhkZXNjKSkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBNSVhFUiBVTklUIGRlc2NyaXB0b3IgJWRcbiIsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJpbnZhbGlkIE1JWEVSIFVOSVQgZGVzY3JpcHRvciAlZFxuIiwgdW5pdGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIG5vIGJtQ29udHJvbHMgZmllbGQgKGUuZy4gTWF5YTQ0KSAtPiBpZ25vcmUgKi8KIAlpZiAoZGVzYy0+Ykxlbmd0aCA8PSAxMCArIGlucHV0X3BpbnMpIHsKLQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJNVSAlZCBoYXMgbm8gYm1Db250cm9scyBmaWVsZFxuIiwgdW5pdGlkKTsKKwkJdXNiX2F1ZGlvX2RiZyhzdGF0ZS0+Y2hpcCwgIk1VICVkIGhhcyBubyBibUNvbnRyb2xzIGZpZWxkXG4iLCB1bml0aWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE3MTMsNyArMTcyMCw3IEBACiAKIAlpZiAoZGVzYy0+Ykxlbmd0aCA8IDEzIHx8IGRlc2MtPmJMZW5ndGggPCAxMyArIG51bV9pbnMgfHwKIAkgICAgZGVzYy0+Ykxlbmd0aCA8IG51bV9pbnMgKyB1YWNfcHJvY2Vzc2luZ191bml0X2JDb250cm9sU2l6ZShkZXNjLCBzdGF0ZS0+bWl4ZXItPnByb3RvY29sKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkICVzIGRlc2NyaXB0b3IgKGlkICVkKVxuIiwgbmFtZSwgdW5pdGlkKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImludmFsaWQgJXMgZGVzY3JpcHRvciAoaWQgJWQpXG4iLCBuYW1lLCB1bml0aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MzksNyArMTc0Niw3IEBACiAJCQljb250aW51ZTsKIAkJY3ZhbCA9IGt6YWxsb2Moc2l6ZW9mKCpjdmFsKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghIGN2YWwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJY3ZhbC0+bWl4ZXIgPSBzdGF0ZS0+bWl4ZXI7CkBAIC0xNzcxLDcgKzE3NzgsNyBAQAogCiAJCWtjdGwgPSBzbmRfY3RsX25ldzEoJm1peGVyX3Byb2N1bml0X2N0bCwgY3ZhbCk7CiAJCWlmICghIGtjdGwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOwogCQkJa2ZyZWUoY3ZhbCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTc5Myw3ICsxODAwLDggQEAKIAkJYXBwZW5kX2N0bF9uYW1lKGtjdGwsICIgIik7CiAJCWFwcGVuZF9jdGxfbmFtZShrY3RsLCB2YWxpbmZvLT5zdWZmaXgpOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiWyVkXSBQVSBbJXNdIGNoID0gJWQsIHZhbCA9ICVkLyVkXG4iLAorCQl1c2JfYXVkaW9fZGJnKHN0YXRlLT5jaGlwLAorCQkJIlslZF0gUFUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZFxuIiwKIAkJCSAgICBjdmFsLT5pZCwga2N0bC0+aWQubmFtZSwgY3ZhbC0+Y2hhbm5lbHMsIGN2YWwtPm1pbiwgY3ZhbC0+bWF4KTsKIAkJaWYgKChlcnIgPSBzbmRfdXNiX21peGVyX2FkZF9jb250cm9sKHN0YXRlLT5taXhlciwga2N0bCkpIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC0xOTE4LDcgKzE5MjYsOCBAQAogCWNoYXIgKipuYW1lbGlzdDsKIAogCWlmICghZGVzYy0+Yk5ySW5QaW5zIHx8IGRlc2MtPmJMZW5ndGggPCA1ICsgZGVzYy0+Yk5ySW5QaW5zKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgU0VMRUNUT1IgVU5JVCBkZXNjcmlwdG9yICVkXG4iLCB1bml0aWQpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLAorCQkJImludmFsaWQgU0VMRUNUT1IgVU5JVCBkZXNjcmlwdG9yICVkXG4iLCB1bml0aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE5MzYsNyArMTk0NSw3IEBACiAKIAljdmFsID0ga3phbGxvYyhzaXplb2YoKmN2YWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBjdmFsKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvYyBrY29udHJvbFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAljdmFsLT5taXhlciA9IHN0YXRlLT5taXhlcjsKQEAgLTE5NTUsNyArMTk2NCw3IEBACiAKIAluYW1lbGlzdCA9IGttYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBkZXNjLT5iTnJJblBpbnMsIEdGUF9LRVJORUwpOwogCWlmICghIG5hbWVsaXN0KSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCWtmcmVlKGN2YWwpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xOTY1LDcgKzE5NzQsNyBAQAogCQlsZW4gPSAwOwogCQluYW1lbGlzdFtpXSA9IGttYWxsb2MoTUFYX0lURU1fTkFNRV9MRU4sIEdGUF9LRVJORUwpOwogCQlpZiAoISBuYW1lbGlzdFtpXSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvY1xuIik7CisJCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLCAiY2Fubm90IG1hbGxvY1xuIik7CiAJCQl3aGlsZSAoaS0tKQogCQkJCWtmcmVlKG5hbWVsaXN0W2ldKTsKIAkJCWtmcmVlKG5hbWVsaXN0KTsKQEAgLTE5ODIsNyArMTk5MSw3IEBACiAKIAlrY3RsID0gc25kX2N0bF9uZXcxKCZtaXhlcl9zZWxlY3R1bml0X2N0bCwgY3ZhbCk7CiAJaWYgKCEga2N0bCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jIGtjb250cm9sXG4iKTsKKwkJdXNiX2F1ZGlvX2VycihzdGF0ZS0+Y2hpcCwgImNhbm5vdCBtYWxsb2Mga2NvbnRyb2xcbiIpOwogCQlrZnJlZShuYW1lbGlzdCk7CiAJCWtmcmVlKGN2YWwpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIwMTAsNyArMjAxOSw3IEBACiAJCQlhcHBlbmRfY3RsX25hbWUoa2N0bCwgIiBQbGF5YmFjayBTb3VyY2UiKTsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIlslZF0gU1UgWyVzXSBpdGVtcyA9ICVkXG4iLAorCXVzYl9hdWRpb19kYmcoc3RhdGUtPmNoaXAsICJbJWRdIFNVIFslc10gaXRlbXMgPSAlZFxuIiwKIAkJICAgIGN2YWwtPmlkLCBrY3RsLT5pZC5uYW1lLCBkZXNjLT5iTnJJblBpbnMpOwogCWlmICgoZXJyID0gc25kX3VzYl9taXhlcl9hZGRfY29udHJvbChzdGF0ZS0+bWl4ZXIsIGtjdGwpKSA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0yMDMyLDcgKzIwNDEsNyBAQAogCiAJcDEgPSBmaW5kX2F1ZGlvX2NvbnRyb2xfdW5pdChzdGF0ZSwgdW5pdGlkKTsKIAlpZiAoIXAxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYmF1ZGlvOiB1bml0ICVkIG5vdCBmb3VuZCFcbiIsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19lcnIoc3RhdGUtPmNoaXAsICJ1bml0ICVkIG5vdCBmb3VuZCFcbiIsIHVuaXRpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjA2Miw3ICsyMDcxLDggQEAKIAljYXNlIFVBQzJfRVhURU5TSU9OX1VOSVRfVjI6CiAJCXJldHVybiBwYXJzZV9hdWRpb19leHRlbnNpb25fdW5pdChzdGF0ZSwgdW5pdGlkLCBwMSk7CiAJZGVmYXVsdDoKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiYXVkaW86IHVuaXQgJXU6IHVuZXhwZWN0ZWQgdHlwZSAweCUwMnhcbiIsIHVuaXRpZCwgcDFbMl0pOworCQl1c2JfYXVkaW9fZXJyKHN0YXRlLT5jaGlwLAorCQkJInVuaXQgJXU6IHVuZXhwZWN0ZWQgdHlwZSAweCUwMnhcbiIsIHVuaXRpZCwgcDFbMl0pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiB9CkBAIC0yMjEwLDggKzIyMjAsOSBAQAogCV9fdTggY2hhbm5lbCA9IHZhbHVlICYgMHhmZjsKIAogCWlmIChjaGFubmVsID49IE1BWF9DSEFOTkVMUykgewotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgIiVzKCk6IGJvZ3VzIGNoYW5uZWwgbnVtYmVyICVkXG4iLAotCQkJCV9fZnVuY19fLCBjaGFubmVsKTsKKwkJdXNiX2F1ZGlvX2RiZyhtaXhlci0+Y2hpcCwKKwkJCSIlcygpOiBib2d1cyBjaGFubmVsIG51bWJlciAlZFxuIiwKKwkJCV9fZnVuY19fLCBjaGFubmVsKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjI0MCw4ICsyMjUxLDkgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgInVua25vd24gYXR0cmlidXRlICVkIGluIGludGVycnVwdFxuIiwKLQkJCQkJCWF0dHJpYnV0ZSk7CisJCQl1c2JfYXVkaW9fZGJnKG1peGVyLT5jaGlwLAorCQkJCSJ1bmtub3duIGF0dHJpYnV0ZSAlZCBpbiBpbnRlcnJ1cHRcbiIsCisJCQkJYXR0cmlidXRlKTsKIAkJCWJyZWFrOwogCQl9IC8qIHN3aXRjaCAqLwogCX0KQEAgLTIyNjIsNyArMjI3NCw3IEBACiAJCWZvciAoc3RhdHVzID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJCSAgICAgbGVuID49IHNpemVvZigqc3RhdHVzKTsKIAkJICAgICBsZW4gLT0gc2l6ZW9mKCpzdGF0dXMpLCBzdGF0dXMrKykgewotCQkJc25kX3ByaW50ZChLRVJOX0RFQlVHICJzdGF0dXMgaW50ZXJydXB0OiAlMDJ4ICUwMnhcbiIsCisJCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAic3RhdHVzIGludGVycnVwdDogJTAyeCAlMDJ4XG4iLAogCQkJCQkJc3RhdHVzLT5iU3RhdHVzVHlwZSwKIAkJCQkJCXN0YXR1cy0+Yk9yaWdpbmF0b3IpOwogCkBAIC0yMzAwLDI2ICsyMzEyLDYgQEAKIAl9CiB9CiAKLS8qIHN0b3AgYW55IGJ1cyBhY3Rpdml0eSBvZiBhIG1peGVyICovCi12b2lkIHNuZF91c2JfbWl4ZXJfaW5hY3RpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCi17Ci0JdXNiX2tpbGxfdXJiKG1peGVyLT51cmIpOwotCXVzYl9raWxsX3VyYihtaXhlci0+cmNfdXJiKTsKLX0KLQotaW50IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQotewotCWludCBlcnI7Ci0KLQlpZiAobWl4ZXItPnVyYikgewotCQllcnIgPSB1c2Jfc3VibWl0X3VyYihtaXhlci0+dXJiLCBHRlBfTk9JTyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogY3JlYXRlIHRoZSBoYW5kbGVyIGZvciB0aGUgb3B0aW9uYWwgc3RhdHVzIGludGVycnVwdCBlbmRwb2ludCAqLwogc3RhdGljIGludCBzbmRfdXNiX21peGVyX3N0YXR1c19jcmVhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQogewpAQCAtMjM5NCw3ICsyMzg2LDcgQEAKIAogCXNuZF91c2JfbWl4ZXJfYXBwbHlfY3JlYXRlX3F1aXJrKG1peGVyKTsKIAotCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNoaXAtPmNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgbWl4ZXIsICZkZXZfb3BzKTsKKwllcnIgPSBzbmRfZGV2aWNlX25ldyhjaGlwLT5jYXJkLCBTTkRSVl9ERVZfQ09ERUMsIG1peGVyLCAmZGV2X29wcyk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gX2Vycm9yOwogCkBAIC0yNDE4LDMgKzI0MTAsODIgQEAKIAl1c2Jfa2lsbF91cmIobWl4ZXItPnVyYik7CiAJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIpOwogfQorCisjaWZkZWYgQ09ORklHX1BNCisvKiBzdG9wIGFueSBidXMgYWN0aXZpdHkgb2YgYSBtaXhlciAqLworc3RhdGljIHZvaWQgc25kX3VzYl9taXhlcl9pbmFjdGl2YXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwl1c2Jfa2lsbF91cmIobWl4ZXItPnVyYik7CisJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIpOworfQorCitzdGF0aWMgaW50IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCWludCBlcnI7CisKKwlpZiAobWl4ZXItPnVyYikgeworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihtaXhlci0+dXJiLCBHRlBfTk9JTyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF91c2JfbWl4ZXJfc3VzcGVuZChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc25kX3VzYl9taXhlcl9pbmFjdGl2YXRlKG1peGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXN0b3JlX21peGVyX3ZhbHVlKHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsKQoreworCWludCBjLCBlcnIsIGlkeDsKKworCWlmIChjdmFsLT5jbWFzaykgeworCQlpZHggPSAwOworCQlmb3IgKGMgPSAwOyBjIDwgTUFYX0NIQU5ORUxTOyBjKyspIHsKKwkJCWlmICghKGN2YWwtPmNtYXNrICYgKDEgPDwgYykpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGN2YWwtPmNhY2hlZCAmICgxIDw8IGMpKSB7CisJCQkJZXJyID0gc2V0X2N1cl9taXhfdmFsdWUoY3ZhbCwgYyArIDEsIGlkeCwKKwkJCQkJCQljdmFsLT5jYWNoZV92YWxbaWR4XSk7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlpZHgrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIG1hc3RlciAqLworCQlpZiAoY3ZhbC0+Y2FjaGVkKSB7CisJCQllcnIgPSBzZXRfY3VyX21peF92YWx1ZShjdmFsLCAwLCAwLCAqY3ZhbC0+Y2FjaGVfdmFsKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF91c2JfbWl4ZXJfcmVzdW1lKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwgYm9vbCByZXNldF9yZXN1bWUpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmN2YWw7CisJaW50IGlkLCBlcnI7CisKKwkvKiBGSVhNRTogYW55IG1peGVyIHF1aXJrcz8gKi8KKworCWlmIChyZXNldF9yZXN1bWUpIHsKKwkJLyogcmVzdG9yZSBjYWNoZWQgbWl4ZXIgdmFsdWVzICovCisJCWZvciAoaWQgPSAwOyBpZCA8IE1BWF9JRF9FTEVNUzsgaWQrKykgeworCQkJZm9yIChjdmFsID0gbWl4ZXItPmlkX2VsZW1zW2lkXTsgY3ZhbDsKKwkJCSAgICAgY3ZhbCA9IGN2YWwtPm5leHRfaWRfZWxlbSkgeworCQkJCWVyciA9IHJlc3RvcmVfbWl4ZXJfdmFsdWUoY3ZhbCk7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc25kX3VzYl9taXhlcl9hY3RpdmF0ZShtaXhlcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlci5oIGIvc291bmQvdXNiL21peGVyLmgKaW5kZXggYWFiODBkZi4uNzNiMWY2NCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyLmgKKysrIGIvc291bmQvdXNiL21peGVyLmgKQEAgLTYzLDggKzYzLDYgQEAKIAogaW50IHNuZF91c2JfbWl4ZXJfc2V0X2N0bF92YWx1ZShzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqY3ZhbCwKIAkJCQlpbnQgcmVxdWVzdCwgaW50IHZhbGlkeCwgaW50IHZhbHVlX3NldCk7Ci12b2lkIHNuZF91c2JfbWl4ZXJfaW5hY3RpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpOwotaW50IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKTsKIAogaW50IHNuZF91c2JfbWl4ZXJfYWRkX2NvbnRyb2woc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAogCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCk7CkBAIC03Miw0ICs3MCw5IEBACiBpbnQgc25kX3VzYl9taXhlcl92b2xfdGx2KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgb3BfZmxhZywKIAkJCSAgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBfX3VzZXIgKl90bHYpOwogCisjaWZkZWYgQ09ORklHX1BNCitpbnQgc25kX3VzYl9taXhlcl9zdXNwZW5kKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcik7CitpbnQgc25kX3VzYl9taXhlcl9yZXN1bWUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLCBib29sIHJlc2V0X3Jlc3VtZSk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fVVNCTUlYRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jIGIvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCmluZGV4IGY0YjEyYzIuLmYxMTlhNDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYworKysgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKQEAgLTYwMCw4ICs2MDAsOCBAQAogCXVwX3JlYWQoJm1peGVyLT5jaGlwLT5zaHV0ZG93bl9yd3NlbSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAidW5hYmxlIHRvIGlzc3VlIHZlbmRvciByZWFkIHJlcXVlc3QgKHJldCA9ICVkKSIsIHJldCk7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJInVuYWJsZSB0byBpc3N1ZSB2ZW5kb3IgcmVhZCByZXF1ZXN0IChyZXQgPSAlZCkiLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNjMxLDggKzYzMSw4IEBACiAJdXBfcmVhZCgmbWl4ZXItPmNoaXAtPnNodXRkb3duX3J3c2VtKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIKLQkJCSAgICJ1bmFibGUgdG8gaXNzdWUgdmVuZG9yIHdyaXRlIHJlcXVlc3QgKHJldCA9ICVkKSIsIHJldCk7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJInVuYWJsZSB0byBpc3N1ZSB2ZW5kb3Igd3JpdGUgcmVxdWVzdCAocmV0ID0gJWQpIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE2OTksNyArMTY5OSw3IEBACiAJCQlzbmRfdXNiX21peGVyX25vdGlmeV9pZChtaXhlciwgbWl4ZXItPnJjX2NmZy0+bXV0ZV9taXhlcl9pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGQoS0VSTl9ERUJVRyAibWVtb3J5IGNoYW5nZSBpbiB1bmtub3duIHVuaXQgJWRcbiIsIHVuaXRpZCk7CisJCXVzYl9hdWRpb19kYmcobWl4ZXItPmNoaXAsICJtZW1vcnkgY2hhbmdlIGluIHVua25vd24gdW5pdCAlZFxuIiwgdW5pdGlkKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3BjbS5jIGIvc291bmQvdXNiL3BjbS5jCmluZGV4IGNhMzI1NmQuLjQ5ZGU1YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9wY20uYworKysgYi9zb3VuZC91c2IvcGNtLmMKQEAgLTE2Niw4ICsxNjYsOCBAQAogCQkJCSAgIFVTQl9UWVBFX0NMQVNTfFVTQl9SRUNJUF9FTkRQT0lOVHxVU0JfRElSX09VVCwKIAkJCQkgICBVQUNfRVBfQ1NfQVRUUl9QSVRDSF9DT05UUk9MIDw8IDgsIGVwLAogCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBlbmFibGUgUElUQ0hcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgaWZhY2UsIGVwKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiJWQ6JWQ6IGNhbm5vdCBzZXQgZW5hYmxlIFBJVENIXG4iLAorCQkJICAgICAgaWZhY2UsIGVwKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE4Nyw4ICsxODcsOCBAQAogCQkJCSAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UIHwgVVNCX0RJUl9PVVQsCiAJCQkJICAgVUFDMl9FUF9DU19QSVRDSCA8PCA4LCAwLAogCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBlbmFibGUgUElUQ0ggKHYyKVxuIiwKLQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiJWQ6JWQ6IGNhbm5vdCBzZXQgZW5hYmxlIFBJVENIICh2MilcbiIsCisJCQkgICAgICBpZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTIyNiw3ICsyMjYsNyBAQAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChTVUJTVFJFQU1fRkxBR19EQVRBX0VQX1NUQVJURUQsICZzdWJzLT5mbGFncykpIHsKIAkJc3RydWN0IHNuZF91c2JfZW5kcG9pbnQgKmVwID0gc3Vicy0+ZGF0YV9lbmRwb2ludDsKIAotCQlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJTdGFydGluZyBkYXRhIEVQIEAlcFxuIiwgZXApOworCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwgIlN0YXJ0aW5nIGRhdGEgRVAgQCVwXG4iLCBlcCk7CiAKIAkJZXAtPmRhdGFfc3VicyA9IHN1YnM7CiAJCWVyciA9IHNuZF91c2JfZW5kcG9pbnRfc3RhcnQoZXAsIGNhbl9zbGVlcCk7CkBAIC0yNDcsMTYgKzI0NywxNSBAQAogCQkJCQkJc3Vicy0+c3luY19lbmRwb2ludC0+YWx0c2V0dGluZyk7CiAJCQlpZiAoZXJyIDwgMCkgewogCQkJCWNsZWFyX2JpdChTVUJTVFJFQU1fRkxBR19TWU5DX0VQX1NUQVJURUQsICZzdWJzLT5mbGFncyk7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUgotCQkJCQkgICAiJWQ6JWQ6JWQ6IGNhbm5vdCBzZXQgaW50ZXJmYWNlICglZClcbiIsCi0JCQkJCSAgIHN1YnMtPmRldi0+ZGV2bnVtLAorCQkJCWRldl9lcnIoJnN1YnMtPmRldi0+ZGV2LAorCQkJCQkgICAiJWQ6JWQ6IGNhbm5vdCBzZXQgaW50ZXJmYWNlICglZClcbiIsCiAJCQkJCSAgIHN1YnMtPnN5bmNfZW5kcG9pbnQtPmlmYWNlLAogCQkJCQkgICBzdWJzLT5zeW5jX2VuZHBvaW50LT5hbHRzZXR0aW5nLCBlcnIpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQl9CiAKLQkJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiU3RhcnRpbmcgc3luYyBFUCBAJXBcbiIsIGVwKTsKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsICJTdGFydGluZyBzeW5jIEVQIEAlcFxuIiwgZXApOwogCiAJCWVwLT5zeW5jX3NsYXZlID0gc3Vicy0+ZGF0YV9lbmRwb2ludDsKIAkJZXJyID0gc25kX3VzYl9lbmRwb2ludF9zdGFydChlcCwgY2FuX3NsZWVwKTsKQEAgLTQxMCw4ICs0MDksOSBAQAogCWlmICgoZ2V0X2VuZHBvaW50KGFsdHMsIDEpLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQyB8fAogCSAgICAoZ2V0X2VuZHBvaW50KGFsdHMsIDEpLT5iTGVuZ3RoID49IFVTQl9EVF9FTkRQT0lOVF9BVURJT19TSVpFICYmCiAJICAgICBnZXRfZW5kcG9pbnQoYWx0cywgMSktPmJTeW5jaEFkZHJlc3MgIT0gMCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQgOiBpbnZhbGlkIHN5bmMgcGlwZS4gYm1BdHRyaWJ1dGVzICUwMngsIGJMZW5ndGggJWQsIGJTeW5jaEFkZHJlc3MgJTAyeFxuIiwKLQkJCSAgIGRldi0+ZGV2bnVtLCBmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIiVkOiVkIDogaW52YWxpZCBzeW5jIHBpcGUuIGJtQXR0cmlidXRlcyAlMDJ4LCBiTGVuZ3RoICVkLCBiU3luY2hBZGRyZXNzICUwMnhcbiIsCisJCQkgICBmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsCiAJCQkgICBnZXRfZW5kcG9pbnQoYWx0cywgMSktPmJtQXR0cmlidXRlcywKIAkJCSAgIGdldF9lbmRwb2ludChhbHRzLCAxKS0+Ykxlbmd0aCwKIAkJCSAgIGdldF9lbmRwb2ludChhbHRzLCAxKS0+YlN5bmNoQWRkcmVzcyk7CkBAIC00MjEsOCArNDIxLDkgQEAKIAlpZiAoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iTGVuZ3RoID49IFVTQl9EVF9FTkRQT0lOVF9BVURJT19TSVpFICYmCiAJICAgICgoaXNfcGxheWJhY2sgJiYgZXAgIT0gKHVuc2lnbmVkIGludCkoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iU3luY2hBZGRyZXNzIHwgVVNCX0RJUl9JTikpIHx8CiAJICAgICAoIWlzX3BsYXliYWNrICYmIGVwICE9ICh1bnNpZ25lZCBpbnQpKGdldF9lbmRwb2ludChhbHRzLCAwKS0+YlN5bmNoQWRkcmVzcyAmIH5VU0JfRElSX0lOKSkpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkIDogaW52YWxpZCBzeW5jIHBpcGUuIGlzX3BsYXliYWNrICVkLCBlcCAlMDJ4LCBiU3luY2hBZGRyZXNzICUwMnhcbiIsCi0JCQkgICBkZXYtPmRldm51bSwgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLAorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSIlZDolZCA6IGludmFsaWQgc3luYyBwaXBlLiBpc19wbGF5YmFjayAlZCwgZXAgJTAyeCwgYlN5bmNoQWRkcmVzcyAlMDJ4XG4iLAorCQkJICAgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLAogCQkJICAgaXNfcGxheWJhY2ssIGVwLCBnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJTeW5jaEFkZHJlc3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00NjksOCArNDcwLDkgQEAKIAlpZiAoc3Vicy0+aW50ZXJmYWNlID49IDAgJiYgc3Vicy0+aW50ZXJmYWNlICE9IGZtdC0+aWZhY2UpIHsKIAkJZXJyID0gdXNiX3NldF9pbnRlcmZhY2Uoc3Vicy0+ZGV2LCBzdWJzLT5pbnRlcmZhY2UsIDApOwogCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQ6IHJldHVybiB0byBzZXR0aW5nIDAgZmFpbGVkICglZClcbiIsCi0JCQkJZGV2LT5kZXZudW0sIGZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZywgZXJyKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCSIlZDolZDogcmV0dXJuIHRvIHNldHRpbmcgMCBmYWlsZWQgKCVkKVxuIiwKKwkJCQlmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIGVycik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlzdWJzLT5pbnRlcmZhY2UgPSAtMTsKQEAgLTQ4MiwxMiArNDg0LDEzIEBACiAJICAgIHN1YnMtPmFsdHNldF9pZHggIT0gZm10LT5hbHRzZXRfaWR4KSB7CiAJCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldiwgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiB1c2Jfc2V0X2ludGVyZmFjZSBmYWlsZWQgKCVkKVxuIiwKLQkJCQkgICBkZXYtPmRldm51bSwgZm10LT5pZmFjZSwgZm10LT5hbHRzZXR0aW5nLCBlcnIpOworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJIiVkOiVkOiB1c2Jfc2V0X2ludGVyZmFjZSBmYWlsZWQgKCVkKVxuIiwKKwkJCQlmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIGVycik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInNldHRpbmcgdXNiIGludGVyZmFjZSAlZDolZFxuIiwKLQkJCQlmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgInNldHRpbmcgdXNiIGludGVyZmFjZSAlZDolZFxuIiwKKwkJCWZtdC0+aWZhY2UsIGZtdC0+YWx0c2V0dGluZyk7CiAJCXN1YnMtPmludGVyZmFjZSA9IGZtdC0+aWZhY2U7CiAJCXN1YnMtPmFsdHNldF9pZHggPSBmbXQtPmFsdHNldF9pZHg7CiAKQEAgLTUyMywyMCArNTI2LDIzIEBACiAgKiAtIFJlcXVlc3RlZCBQQ00gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCiAgKiAtIFJlcXVlc3RlZCBzYW1wbGUgcmF0ZSBpcyBub3Qgc3VwcG9ydGVkLgogICovCi1zdGF0aWMgaW50IG1hdGNoX2VuZHBvaW50X2F1ZGlvZm9ybWF0cyhzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwLAotCXN0cnVjdCBhdWRpb2Zvcm1hdCAqbWF0Y2gsIGludCByYXRlLAotCXNuZF9wY21fZm9ybWF0X3QgcGNtX2Zvcm1hdCkKK3N0YXRpYyBpbnQgbWF0Y2hfZW5kcG9pbnRfYXVkaW9mb3JtYXRzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCQkgICAgICAgc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCwKKwkJCQkgICAgICAgc3RydWN0IGF1ZGlvZm9ybWF0ICptYXRjaCwgaW50IHJhdGUsCisJCQkJICAgICAgIHNuZF9wY21fZm9ybWF0X3QgcGNtX2Zvcm1hdCkKIHsKIAlpbnQgaTsKIAlpbnQgc2NvcmUgPSAwOwogCiAJaWYgKGZwLT5jaGFubmVscyA8IDEpIHsKLQkJc25kX3ByaW50ZGQoIiVzOiAoZm10IEAlcCkgbm8gY2hhbm5lbHNcbiIsIF9fZnVuY19fLCBmcCk7CisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJIiVzOiAoZm10IEAlcCkgbm8gY2hhbm5lbHNcbiIsIF9fZnVuY19fLCBmcCk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmICghKGZwLT5mb3JtYXRzICYgcGNtX2Zvcm1hdF90b19iaXRzKHBjbV9mb3JtYXQpKSkgewotCQlzbmRfcHJpbnRkZCgiJXM6IChmbXQgQCVwKSBubyBtYXRjaCBmb3IgZm9ybWF0ICVkXG4iLCBfX2Z1bmNfXywKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsCisJCQkiJXM6IChmbXQgQCVwKSBubyBtYXRjaCBmb3IgZm9ybWF0ICVkXG4iLCBfX2Z1bmNfXywKIAkJCWZwLCBwY21fZm9ybWF0KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTQ4LDcgKzU1NCw4IEBACiAJCX0KIAl9CiAJaWYgKCFzY29yZSkgewotCQlzbmRfcHJpbnRkZCgiJXM6IChmbXQgQCVwKSBubyBtYXRjaCBmb3IgcmF0ZSAlZFxuIiwgX19mdW5jX18sCisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJIiVzOiAoZm10IEAlcCkgbm8gbWF0Y2ggZm9yIHJhdGUgJWRcbiIsIF9fZnVuY19fLAogCQkJZnAsIHJhdGUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC01NTYsNyArNTYzLDggQEAKIAlpZiAoZnAtPmNoYW5uZWxzID09IG1hdGNoLT5jaGFubmVscykKIAkJc2NvcmUrKzsKIAotCXNuZF9wcmludGRkKCIlczogKGZtdCBAJXApIHNjb3JlICVkXG4iLCBfX2Z1bmNfXywgZnAsIHNjb3JlKTsKKwlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwKKwkJIiVzOiAoZm10IEAlcCkgc2NvcmUgJWRcbiIsIF9fZnVuY19fLCBmcCwgc2NvcmUpOwogCiAJcmV0dXJuIHNjb3JlOwogfQpAQCAtNTg3LDcgKzU5NSw4IEBACiAKIAkvKiBUcnkgdG8gZmluZCB0aGUgYmVzdCBtYXRjaGluZyBhdWRpb2Zvcm1hdC4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmc3luY19zdWJzLT5mbXRfbGlzdCwgbGlzdCkgewotCQlpbnQgc2NvcmUgPSBtYXRjaF9lbmRwb2ludF9hdWRpb2Zvcm1hdHMoZnAsIHN1YnMtPmN1cl9hdWRpb2ZtdCwKKwkJaW50IHNjb3JlID0gbWF0Y2hfZW5kcG9pbnRfYXVkaW9mb3JtYXRzKHN1YnMsCisJCQkJCQkJZnAsIHN1YnMtPmN1cl9hdWRpb2ZtdCwKIAkJCXN1YnMtPmN1cl9yYXRlLCBzdWJzLT5wY21fZm9ybWF0KTsKIAogCQlpZiAoc2NvcmUgPiBjdXJfc2NvcmUpIHsKQEAgLTU5Nyw3ICs2MDYsOCBAQAogCX0KIAogCWlmICh1bmxpa2VseShzeW5jX2ZwID09IE5VTEwpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiBubyB2YWxpZCBhdWRpb2Zvcm1hdCBmb3Igc3luYyBlcCAleCBmb3VuZFxuIiwKKwkJZGV2X2Vycigmc3Vicy0+ZGV2LT5kZXYsCisJCQkiJXM6IG5vIHZhbGlkIGF1ZGlvZm9ybWF0IGZvciBzeW5jIGVwICV4IGZvdW5kXG4iLAogCQkJX19mdW5jX18sIHN5bmNfc3Vicy0+ZXBfbnVtKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjA5LDcgKzYxOSw4IEBACiAJaWYgKHN5bmNfZnAtPmNoYW5uZWxzICE9IHN1YnMtPmNoYW5uZWxzKSB7CiAJCXN5bmNfcGVyaW9kX2J5dGVzID0gKHN1YnMtPnBlcmlvZF9ieXRlcyAvIHN1YnMtPmNoYW5uZWxzKSAqCiAJCQlzeW5jX2ZwLT5jaGFubmVsczsKLQkJc25kX3ByaW50ZGQoIiVzOiBhZGp1c3RlZCBzeW5jIGVwIHBlcmlvZCBieXRlcyAoJWQgLT4gJWQpXG4iLAorCQlkZXZfZGJnKCZzdWJzLT5kZXYtPmRldiwKKwkJCSIlczogYWRqdXN0ZWQgc3luYyBlcCBwZXJpb2QgYnl0ZXMgKCVkIC0+ICVkKVxuIiwKIAkJCV9fZnVuY19fLCBzdWJzLT5wZXJpb2RfYnl0ZXMsIHN5bmNfcGVyaW9kX2J5dGVzKTsKIAl9CiAKQEAgLTY4NSw3ICs2OTYsOCBAQAogCiAJZm10ID0gZmluZF9mb3JtYXQoc3Vicyk7CiAJaWYgKCFmbXQpIHsKLQkJc25kX3ByaW50ZChLRVJOX0RFQlVHICJjYW5ub3Qgc2V0IGZvcm1hdDogZm9ybWF0ID0gJSN4LCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsCisJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LAorCQkJImNhbm5vdCBzZXQgZm9ybWF0OiBmb3JtYXQgPSAlI3gsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKIAkJCSAgIHN1YnMtPnBjbV9mb3JtYXQsIHN1YnMtPmN1cl9yYXRlLCBzdWJzLT5jaGFubmVscyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTc0Miw3ICs3NTQsNyBAQAogCWludCByZXQ7CiAKIAlpZiAoISBzdWJzLT5jdXJfYXVkaW9mbXQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiYXVkaW86IG5vIGZvcm1hdCBpcyBzcGVjaWZpZWQhXG4iKTsKKwkJZGV2X2Vycigmc3Vicy0+ZGV2LT5kZXYsICJubyBmb3JtYXQgaXMgc3BlY2lmaWVkIVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCkBAIC0xMjM1LDcgKzEyNDcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKIAkJY3AgPSAodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgKyBzdWJzLT5wa3Rfb2Zmc2V0X2FkajsKIAkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzICYmIHByaW50a19yYXRlbGltaXQoKSkgewotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImZyYW1lICVkIGFjdGl2ZTogJWRcbiIsIGksIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKTsKKwkJCWRldl9kYmcoJnN1YnMtPmRldi0+ZGV2LCAiZnJhbWUgJWQgYWN0aXZlOiAlZFxuIiwKKwkJCQlpLCB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CiAJCQkvLyBjb250aW51ZTsKIAkJfQogCQlieXRlcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKQEAgLTEyNDUsNyArMTI1OCw4IEBACiAJCWlmIChieXRlcyAlIChydW50aW1lLT5zYW1wbGVfYml0cyA+PiAzKSAhPSAwKSB7CiAJCQlpbnQgb2xkYnl0ZXMgPSBieXRlczsKIAkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOwotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKKwkJCWRldl93YXJuKCZzdWJzLT5kZXYtPmRldiwKKwkJCQkgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKIAkJCQkJCQlvbGRieXRlcywgYnl0ZXMpOwogCQl9CiAJCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBwb2ludGVyICovCkBAIC0xNDg4LDcgKzE1MDIsOCBAQAogCSAqIG9uIHR3byByZWFkcyBvZiBhIGNvdW50ZXIgdXBkYXRlZCBldmVyeSBtcy4KIAkgKi8KIAlpZiAoYWJzKGVzdF9kZWxheSAtIHN1YnMtPmxhc3RfZGVsYXkpICogMTAwMCA+IHJ1bnRpbWUtPnJhdGUgKiAyKQotCQlzbmRfcHJpbnRrKEtFUk5fREVCVUcgImRlbGF5OiBlc3RpbWF0ZWQgJWQsIGFjdHVhbCAlZFxuIiwKKwkJZGV2X2RiZygmc3Vicy0+ZGV2LT5kZXYsCisJCQkiZGVsYXk6IGVzdGltYXRlZCAlZCwgYWN0dWFsICVkXG4iLAogCQkJZXN0X2RlbGF5LCBzdWJzLT5sYXN0X2RlbGF5KTsKIAogCWlmICghc3Vicy0+cnVubmluZykgewpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3F1aXJrcy5jIGIvc291bmQvdXNiL3F1aXJrcy5jCmluZGV4IDg5NzMwNzA3Ni4uN2M1N2YyMiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9xdWlya3MuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKIAllcnIgPSBzbmRfdXNiX3BhcnNlX2F1ZGlvX2ludGVyZmFjZShjaGlwLCBhbHRzZC0+YkludGVyZmFjZU51bWJlcik7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHNldHVwIGlmICVkOiBlcnJvciAlZFxuIiwKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiY2Fubm90IHNldHVwIGlmICVkOiBlcnJvciAlZFxuIiwKIAkJCSAgIGFsdHNkLT5iSW50ZXJmYWNlTnVtYmVyLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAJZnAgPSBrbWVtZHVwKHF1aXJrLT5kYXRhLCBzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmcCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWVtZHVwXG4iKTsKKwkJdXNiX2F1ZGlvX2VycihjaGlwLCAiY2Fubm90IG1lbWR1cFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpZiAoZnAtPm5yX3JhdGVzID4gTUFYX05SX1JBVEVTKSB7CkBAIC00NjQsNyArNDY0LDcgQEAKIAkJZnAtPnJhdGVfbWF4ID0gZnAtPnJhdGVfbWluID0gOTYwMDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVua25vd24gc2FtcGxlIHJhdGVcbiIpOworCQl1c2JfYXVkaW9fZXJyKGNoaXAsICJ1bmtub3duIHNhbXBsZSByYXRlXG4iKTsKIAkJa2ZyZWUoZnApOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTUzNiw3ICs1MzYsNyBAQAogCWlmIChxdWlyay0+dHlwZSA8IFFVSVJLX1RZUEVfQ09VTlQpIHsKIAkJcmV0dXJuIHF1aXJrX2Z1bmNzW3F1aXJrLT50eXBlXShjaGlwLCBpZmFjZSwgZHJpdmVyLCBxdWlyayk7CiAJfSBlbHNlIHsKLQkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCBxdWlyayB0eXBlICVkXG4iLCBxdWlyay0+dHlwZSk7CisJCXVzYl9hdWRpb19lcnIoY2hpcCwgImludmFsaWQgcXVpcmsgdHlwZSAlZFxuIiwgcXVpcmstPnR5cGUpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIH0KQEAgLTU1NSwxOCArNTU1LDIxIEBACiAKIAlpZiAobGUxNl90b19jcHUoZ2V0X2NmZ19kZXNjKGNvbmZpZyktPndUb3RhbExlbmd0aCkgPT0gRVhUSUdZX0ZJUk1XQVJFX1NJWkVfT0xEIHx8CiAJICAgIGxlMTZfdG9fY3B1KGdldF9jZmdfZGVzYyhjb25maWcpLT53VG90YWxMZW5ndGgpID09IEVYVElHWV9GSVJNV0FSRV9TSVpFX05FVykgewotCQlzbmRfcHJpbnRkZCgic2VuZGluZyBFeHRpZ3kgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAic2VuZGluZyBFeHRpZ3kgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CiAJCS8qIFNlbmQgbWVzc2FnZSB0byBmb3JjZSBpdCB0byByZWNvbm5lY3Qgd2l0aCBmdWxsIGludGVyZmFjZS4gKi8KIAkJZXJyID0gc25kX3VzYl9jdGxfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwwKSwKIAkJCQkgICAgICAweDEwLCAweDQzLCAweDAwMDEsIDB4MDAwYSwgTlVMTCwgMCk7Ci0JCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3Igc2VuZGluZyBib290IG1lc3NhZ2U6ICVkXG4iLCBlcnIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiZXJyb3Igc2VuZGluZyBib290IG1lc3NhZ2U6ICVkXG4iLCBlcnIpOwogCQllcnIgPSB1c2JfZ2V0X2Rlc2NyaXB0b3IoZGV2LCBVU0JfRFRfREVWSUNFLCAwLAogCQkJCSZkZXYtPmRlc2NyaXB0b3IsIHNpemVvZihkZXYtPmRlc2NyaXB0b3IpKTsKIAkJY29uZmlnID0gZGV2LT5hY3Rjb25maWc7Ci0JCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3IgdXNiX2dldF9kZXNjcmlwdG9yOiAlZFxuIiwgZXJyKTsKKwkJaWYgKGVyciA8IDApCisJCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHVzYl9nZXRfZGVzY3JpcHRvcjogJWRcbiIsIGVycik7CiAJCWVyciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldik7Ci0JCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3IgdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb246ICVkXG4iLCBlcnIpOwotCQlzbmRfcHJpbnRkZCgiZXh0aWd5X2Jvb3Q6IG5ldyBib290IGxlbmd0aCA9ICVkXG4iLAorCQlpZiAoZXJyIDwgMCkKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiZXJyb3IgdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb246ICVkXG4iLCBlcnIpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgImV4dGlneV9ib290OiBuZXcgYm9vdCBsZW5ndGggPSAlZFxuIiwKIAkJCSAgICBsZTE2X3RvX2NwdShnZXRfY2ZnX2Rlc2MoY29uZmlnKS0+d1RvdGFsTGVuZ3RoKSk7CiAJCXJldHVybiAtRU5PREVWOyAvKiBxdWl0IHRoaXMgYW55d2F5ICovCiAJfQpAQCAtNTk0LDcgKzU5Nyw3IEBACiAJaW50IGVycjsKIAogCWlmIChkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlID09IDEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gInVzYi1hdWRpbzogIgorCQlkZXZfaW5mbygmZGV2LT5kZXYsCiAJCQkgICAiRmFzdCBUcmFjayBQcm8gc3dpdGNoaW5nIHRvIGNvbmZpZyAjMlxuIik7CiAJCS8qIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGF2YWlsYWJsZSBieSB0aGUgdXNiIGNvcmUgbW9kdWxlLgogCQkgKiBpZiBpdCBpcyBub3QgYXZpYWxhYmxlIHRoZSBib290IHF1aXJrIGhhcyB0byBiZSBsZWZ0IG91dApAQCAtNjAzLDE0ICs2MDYsMTUgQEAKIAkJICovCiAJCWVyciA9IHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24oZGV2LCAyKTsKIAkJaWYgKGVyciA8IDApCi0JCQlzbmRfcHJpbnRkZCgiZXJyb3IgdXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbjogJWRcbiIsCi0JCQkJICAgIGVycik7CisJCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCQkiZXJyb3IgdXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbjogJWRcbiIsCisJCQkJZXJyKTsKIAkJLyogQWx3YXlzIHJldHVybiBhbiBlcnJvciwgc28gdGhhdCB3ZSBzdG9wIGNyZWF0aW5nIGEgZGV2aWNlCiAJCSAgIHRoYXQgd2lsbCBqdXN0IGJlIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkIHdpdGggYSBuZXcKIAkJICAgY29uZmlndXJhdGlvbiAqLwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9IGVsc2UKLQkJc25kX3ByaW50ayhLRVJOX0lORk8gInVzYi1hdWRpbzogRmFzdCBUcmFjayBQcm8gY29uZmlnIE9LXG4iKTsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiRmFzdCBUcmFjayBQcm8gY29uZmlnIE9LXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzc5LDExICs3ODMsMTEgQEAKIAlmd3NpemUgPSBsZTE2X3RvX2NwdShnZXRfY2ZnX2Rlc2MoY29uZmlnKS0+d1RvdGFsTGVuZ3RoKTsKIAogCWlmIChmd3NpemUgIT0gTUJPWDJfRklSTVdBUkVfU0laRSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2ItYXVkaW86IEludmFsaWQgZmlybXdhcmUgc2l6ZT0lZC5cbiIsIGZ3c2l6ZSk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiSW52YWxpZCBmaXJtd2FyZSBzaXplPSVkLlxuIiwgZndzaXplKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc25kX3ByaW50ZCgidXNiLWF1ZGlvOiBTZW5kaW5nIERpZ2lkZXNpZ24gTWJveCAyIGJvb3Qgc2VxdWVuY2UuLi5cbiIpOworCWRldl9kYmcoJmRldi0+ZGV2LCAiU2VuZGluZyBEaWdpZGVzaWduIE1ib3ggMiBib290IHNlcXVlbmNlLi4uXG4iKTsKIAogCWNvdW50ID0gMDsKIAlib290cmVzcG9uc2VbMF0gPSBNQk9YMl9CT09UX0xPQURJTkc7CkBAIC03OTQsMzIgKzc5OCwzMiBAQAogCQkJMHg4NSwgMHhjMCwgMHgwMDAxLCAweDAwMDAsICZib290cmVzcG9uc2UsIDB4MDAxMik7CiAJCWlmIChib290cmVzcG9uc2VbMF0gPT0gTUJPWDJfQk9PVF9SRUFEWSkKIAkJCWJyZWFrOwotCQlzbmRfcHJpbnRkKCJ1c2ItYXVkaW86IGRldmljZSBub3QgcmVhZHksIHJlc2VuZGluZyBib290IHNlcXVlbmNlLi4uXG4iKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJkZXZpY2Ugbm90IHJlYWR5LCByZXNlbmRpbmcgYm9vdCBzZXF1ZW5jZS4uLlxuIik7CiAJCWNvdW50Kys7CiAJfQogCiAJaWYgKGJvb3RyZXNwb25zZVswXSAhPSBNQk9YMl9CT09UX1JFQURZKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInVzYi1hdWRpbzogVW5rbm93biBib290cmVzcG9uc2U9JWQsIG9yIHRpbWVkIG91dCwgaWdub3JpbmcgZGV2aWNlLlxuIiwgYm9vdHJlc3BvbnNlWzBdKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJVbmtub3duIGJvb3RyZXNwb25zZT0lZCwgb3IgdGltZWQgb3V0LCBpZ25vcmluZyBkZXZpY2UuXG4iLCBib290cmVzcG9uc2VbMF0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzbmRfcHJpbnRkZCgidXNiLWF1ZGlvOiBkZXZpY2UgaW5pdGlhbGlzZWQhXG4iKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgImRldmljZSBpbml0aWFsaXNlZCFcbiIpOwogCiAJZXJyID0gdXNiX2dldF9kZXNjcmlwdG9yKGRldiwgVVNCX0RUX0RFVklDRSwgMCwKIAkJJmRldi0+ZGVzY3JpcHRvciwgc2l6ZW9mKGRldi0+ZGVzY3JpcHRvcikpOwogCWNvbmZpZyA9IGRldi0+YWN0Y29uZmlnOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRkKCJlcnJvciB1c2JfZ2V0X2Rlc2NyaXB0b3I6ICVkXG4iLCBlcnIpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHVzYl9nZXRfZGVzY3JpcHRvcjogJWRcbiIsIGVycik7CiAKIAllcnIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbihkZXYpOwogCWlmIChlcnIgPCAwKQotCQlzbmRfcHJpbnRkKCJlcnJvciB1c2JfcmVzZXRfY29uZmlndXJhdGlvbjogJWRcbiIsIGVycik7Ci0Jc25kX3ByaW50ZGQoIm1ib3gyX2Jvb3Q6IG5ldyBib290IGxlbmd0aCA9ICVkXG4iLAorCQlkZXZfZGJnKCZkZXYtPmRldiwgImVycm9yIHVzYl9yZXNldF9jb25maWd1cmF0aW9uOiAlZFxuIiwgZXJyKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIm1ib3gyX2Jvb3Q6IG5ldyBib290IGxlbmd0aCA9ICVkXG4iLAogCQlsZTE2X3RvX2NwdShnZXRfY2ZnX2Rlc2MoY29uZmlnKS0+d1RvdGFsTGVuZ3RoKSk7CiAKIAltYm94Ml9zZXR1cF80OF8yNF9tYWdpYyhkZXYpOwogCi0Jc25kX3ByaW50ayhLRVJOX0lORk8gInVzYi1hdWRpbzogRGlnaWRlc2lnbiBNYm94IDI6IDI0Yml0IDQ4a0h6Iik7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiRGlnaWRlc2lnbiBNYm94IDI6IDI0Yml0IDQ4a0h6Iik7CiAKIAlyZXR1cm4gMDsgLyogU3VjY2Vzc2Z1bCBib290ICovCiB9CkBAIC04NjUsNyArODY5LDcgQEAKIAkJCQlyZXR1cm4gMTsgLyogc2tpcCB0aGlzIGFsdHNldHRpbmcgKi8KIAkJfQogCX0KLQlzbmRfcHJpbnRkZChLRVJOX0lORk8KKwl1c2JfYXVkaW9fZGJnKGNoaXAsCiAJCSAgICAidXNpbmcgYWx0c2V0dGluZyAlZCBmb3IgaW50ZXJmYWNlICVkIGNvbmZpZyAlZFxuIiwKIAkJICAgIGFsdG5vLCBpZmFjZSwgY2hpcC0+c2V0dXApOwogCXJldHVybiAwOyAvKiBrZWVwIHRoaXMgYWx0c2V0dGluZyAqLwpAQCAtOTMyLDcgKzkzNiw3IEBACiAJCQlyZXR1cm4gMTsKIAl9CiAKLQlzbmRfcHJpbnRkZChLRVJOX0lORk8KKwl1c2JfYXVkaW9fZGJnKGNoaXAsCiAJCSAgICAidXNpbmcgYWx0c2V0dGluZyAlZCBmb3IgaW50ZXJmYWNlICVkIGNvbmZpZyAlZFxuIiwKIAkJICAgIGFsdG5vLCBpZmFjZSwgY2hpcC0+c2V0dXApOwogCXJldHVybiAwOyAvKiBrZWVwIHRoaXMgYWx0c2V0dGluZyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3N0cmVhbS5jIGIvc291bmQvdXNiL3N0cmVhbS5jCmluZGV4IDJmYjcxYmUuLjMxMGEzODIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9zdHJlYW0uYworKysgYi9zb3VuZC91c2Ivc3RyZWFtLmMKQEAgLTQxMSwxMCArNDExLDkgQEAKIAogCWlmICghY3NlcCB8fCBjc2VwLT5iTGVuZ3RoIDwgNyB8fAogCSAgICBjc2VwLT5iRGVzY3JpcHRvclN1YnR5cGUgIT0gVUFDX0VQX0dFTkVSQUwpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiV1OiVkIDogbm8gb3IgaW52YWxpZCIKLQkJCSAgICIgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBpZmFjZV9ubywKLQkJCSAgIGFsdHNkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CisJCXVzYl9hdWRpb193YXJuKGNoaXAsCisJCQkgICAgICAgIiV1OiVkIDogbm8gb3IgaW52YWxpZCBjbGFzcyBzcGVjaWZpYyBlbmRwb2ludCBkZXNjcmlwdG9yXG4iLAorCQkJICAgICAgIGlmYWNlX25vLCBhbHRzZC0+YkFsdGVybmF0ZVNldHRpbmcpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTUzMyw4ICs1MzIsOCBAQAogCQkvKiBnZXQgYXVkaW8gZm9ybWF0cyAqLwogCQlzd2l0Y2ggKHByb3RvY29sKSB7CiAJCWRlZmF1bHQ6Ci0JCQlzbmRfcHJpbnRkZChLRVJOX1dBUk5JTkcgIiVkOiV1OiVkOiB1bmtub3duIGludGVyZmFjZSBwcm90b2NvbCAlIzAyeCwgYXNzdW1pbmcgdjFcbiIsCi0JCQkJICAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIHByb3RvY29sKTsKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiJXU6JWQ6IHVua25vd24gaW50ZXJmYWNlIHByb3RvY29sICUjMDJ4LCBhc3N1bWluZyB2MVxuIiwKKwkJCQlpZmFjZV9ubywgYWx0bm8sIHByb3RvY29sKTsKIAkJCXByb3RvY29sID0gVUFDX1ZFUlNJT05fMTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCkBAIC01NDQsMTQgKzU0MywxNiBAQAogCQkJc3RydWN0IHVhY19pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yICppdGVybTsKIAogCQkJaWYgKCFhcykgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCQkiJXU6JWQgOiBVQUNfQVNfR0VORVJBTCBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJCSIldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtNTc0LDE0ICs1NzUsMTYgQEAKIAkJCQlzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhhbHRzLT5leHRyYSwgYWx0cy0+ZXh0cmFsZW4sIE5VTEwsIFVBQ19BU19HRU5FUkFMKTsKIAogCQkJaWYgKCFhcykgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCQkiJXU6JWQgOiBVQUNfQVNfR0VORVJBTCBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJCSIldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKKwkJCQkJaWZhY2Vfbm8sIGFsdG5vKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtNjA3LDggKzYxMCw5IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogYm9ndXMgYlRlcm1pbmFsTGluayAlZFxuIiwKLQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vLCBhcy0+YlRlcm1pbmFsTGluayk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJXU6JWQgOiBib2d1cyBiVGVybWluYWxMaW5rICVkXG4iLAorCQkJCWlmYWNlX25vLCBhbHRubywgYXMtPmJUZXJtaW5hbExpbmspOwogCQkJY29udGludWU7CiAJCX0KIAkJfQpAQCAtNjE2LDE0ICs2MjAsMTYgQEAKIAkJLyogZ2V0IGZvcm1hdCB0eXBlICovCiAJCWZtdCA9IHNuZF91c2JfZmluZF9jc2ludF9kZXNjKGFsdHMtPmV4dHJhLCBhbHRzLT5leHRyYWxlbiwgTlVMTCwgVUFDX0ZPUk1BVF9UWVBFKTsKIAkJaWYgKCFmbXQpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogbm8gVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJXU6JWQgOiBubyBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKKwkJCQlpZmFjZV9ubywgYWx0bm8pOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCgocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSkgJiYgKGZtdC0+Ykxlbmd0aCA8IDgpKSB8fAogCQkgICAgKChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8yKSAmJiAoZm10LT5iTGVuZ3RoIDwgNikpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCi0JCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkiJXU6JWQgOiBpbnZhbGlkIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAorCQkJCWlmYWNlX25vLCBhbHRubyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC02NDQsNyArNjUwLDcgQEAKIAogCQlmcCA9IGt6YWxsb2Moc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOwogCQlpZiAoISBmcCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IG1hbGxvY1xuIik7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbm5vdCBtYWxsb2NcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtNzA3LDcgKzcxMyw3IEBACiAJCQljaGNvbmZpZyA9IDA7CiAJCWZwLT5jaG1hcCA9IGNvbnZlcnRfY2htYXAoZnAtPmNoYW5uZWxzLCBjaGNvbmZpZywgcHJvdG9jb2wpOwogCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQ6IGFkZCBhdWRpbyBlbmRwb2ludCAlI3hcbiIsIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIGZwLT5lbmRwb2ludCk7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiJXU6JWQ6IGFkZCBhdWRpbyBlbmRwb2ludCAlI3hcbiIsIGlmYWNlX25vLCBhbHRubywgZnAtPmVuZHBvaW50KTsKIAkJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOwogCQlpZiAoZXJyIDwgMCkgewogCQkJa2ZyZWUoZnAtPnJhdGVfdGFibGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmggYi9zb3VuZC91c2IvdXNiYXVkaW8uaAppbmRleCA1ZDJmZTA1Li4yNWM0YzdlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uaAorKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uaApAQCAtNjAsNiArNjAsMTUgQEAKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpjdHJsX2ludGY7CS8qIHRoZSBhdWRpbyBjb250cm9sIGludGVyZmFjZSAqLwogfTsKIAorI2RlZmluZSB1c2JfYXVkaW9fZXJyKGNoaXAsIGZtdCwgYXJncy4uLikgXAorCWRldl9lcnIoJihjaGlwKS0+ZGV2LT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSB1c2JfYXVkaW9fd2FybihjaGlwLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfd2FybigmKGNoaXApLT5kZXYtPmRldiwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIHVzYl9hdWRpb19pbmZvKGNoaXAsIGZtdCwgYXJncy4uLikgXAorCWRldl9pbmZvKCYoY2hpcCktPmRldi0+ZGV2LCBmbXQsICMjYXJncykKKyNkZWZpbmUgdXNiX2F1ZGlvX2RiZyhjaGlwLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfZGJnKCYoY2hpcCktPmRldi0+ZGV2LCBmbXQsICMjYXJncykKKwogLyoKICAqIEluZm9ybWF0aW9uIGFib3V0IGRldmljZXMgd2l0aCBicm9rZW4gZGVzY3JpcHRvcnMKICAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCmluZGV4IDk5OTU1MGIuLmNmNWRjMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKQEAgLTUzNSw3ICs1MzUsOSBAQAogCQlzbmRfdXMxMjJsX2NhcmRfdXNlZFtpbmRleF0gPSAwOwogfQogCi1zdGF0aWMgaW50IHVzeDJ5X2NyZWF0ZV9jYXJkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQorc3RhdGljIGludCB1c3gyeV9jcmVhdGVfY2FyZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLAorCQkJICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgICAgc3RydWN0IHNuZF9jYXJkICoqY2FyZHApCiB7CiAJaW50CQlkZXY7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwpAQCAtNTQ2LDggKzU0OCw4IEBACiAJCQlicmVhazsKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKLQllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IHVzMTIybCksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmludGYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHVzMTIybCksICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlzbmRfdXMxMjJsX2NhcmRfdXNlZFtVUzEyMkwoY2FyZCktPmNhcmRfaW5kZXggPSBkZXZdID0gMTsKQEAgLTU3OCwxMSArNTgwLDEwIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CiAKLQllcnIgPSB1c3gyeV9jcmVhdGVfY2FyZChkZXZpY2UsICZjYXJkKTsKKwllcnIgPSB1c3gyeV9jcmVhdGVfY2FyZChkZXZpY2UsIGludGYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmludGYtPmRldik7CiAJaWYgKCF1czEyMmxfY3JlYXRlX2NhcmQoY2FyZCkpIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnkuYyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCmluZGV4IDVhNTFiMTguLjkxZTBlMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jCkBAIC0zMzIsNyArMzMyLDkgQEAKIAl7IC8qIHRlcm1pbmF0b3IgKi8gfQogfTsKIAotc3RhdGljIGludCB1c1gyWV9jcmVhdGVfY2FyZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3Qgc25kX2NhcmQgKipjYXJkcCkKK3N0YXRpYyBpbnQgdXNYMllfY3JlYXRlX2NhcmQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgIHN0cnVjdCBzbmRfY2FyZCAqKmNhcmRwKQogewogCWludAkJZGV2OwogCXN0cnVjdCBzbmRfY2FyZCAqCWNhcmQ7CkBAIC0zNDMsMTUgKzM0NSwxNSBAQAogCQkJYnJlYWs7CiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZXJyID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB1c1gyWWRldiksICZjYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9uZXcoJmludGYtPmRldiwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICBzaXplb2Yoc3RydWN0IHVzWDJZZGV2KSwgJmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCXNuZF91c1gyWV9jYXJkX3VzZWRbdXNYMlkoY2FyZCktPmNhcmRfaW5kZXggPSBkZXZdID0gMTsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfdXNYMllfY2FyZF9wcml2YXRlX2ZyZWU7CiAJdXNYMlkoY2FyZCktPmRldiA9IGRldmljZTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1c1gyWShjYXJkKS0+cHJlcGFyZV93YWl0X3F1ZXVlKTsKLQltdXRleF9pbml0KCZ1c1gyWShjYXJkKS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfaW5pdCgmdXNYMlkoY2FyZCktPnBjbV9tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJnVzWDJZKGNhcmQpLT5taWRpX2xpc3QpOwogCXN0cmNweShjYXJkLT5kcml2ZXIsICJVU0IgIk5BTUVfQUxMQ0FQUyIiKTsKIAlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlRBU0NBTSAiTkFNRV9BTExDQVBTIiIpOwpAQCAtMzgyLDEwICszODQsOSBAQAogCSAgICAgbGUxNl90b19jcHUoZGV2aWNlLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gVVNCX0lEX1VTNDI4KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSB1c1gyWV9jcmVhdGVfY2FyZChkZXZpY2UsICZjYXJkKTsKKwllcnIgPSB1c1gyWV9jcmVhdGVfY2FyZChkZXZpY2UsIGludGYsICZjYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZpbnRmLT5kZXYpOwogCWlmICgoZXJyID0gdXNYMllfaHdkZXBfbmV3KGNhcmQsIGRldmljZSkpIDwgMCAgfHwKIAkgICAgKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5oIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmgKaW5kZXggZTQzYzBhOC4uNmFlNmIwOCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmgKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmgKQEAgLTM2LDcgKzM2LDcgQEAKIAl1bnNpZ25lZCBpbnQJCXJhdGUsCiAJCQkJZm9ybWF0OwogCWludAkJCWNoaXBfc3RhdHVzOwotCXN0cnVjdCBtdXRleAkJcHJlcGFyZV9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCXBjbV9tdXRleDsKIAlzdHJ1Y3QgdXM0MjhjdGxzX3NoYXJlZG1lbQkqdXM0MjhjdGxzX3NoYXJlZG1lbTsKIAlpbnQJCQl3YWl0X2lzb19mcmFtZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAl1czQyOGN0bHNfd2FpdF9xdWV1ZV9oZWFkOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5YXVkaW8uYyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeWF1ZGlvLmMKaW5kZXggNjIzNGE1MS4uYTYzMzMwZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5YXVkaW8uYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnlhdWRpby5jCkBAIC03NTIsMzYgKzc1Miw0NCBAQAogCXVuc2lnbmVkIGludAkJcmF0ZSA9IHBhcmFtc19yYXRlKGh3X3BhcmFtcyk7CiAJc25kX3BjbV9mb3JtYXRfdAlmb3JtYXQgPSBwYXJhbXNfZm9ybWF0KGh3X3BhcmFtcyk7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gc3Vic3RyZWFtLT5wc3RyLT5wY20tPmNhcmQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgdXNYMllkZXYJKmRldiA9IHVzWDJZKGNhcmQpOworCWludCBpOwogCisJbXV0ZXhfbG9jaygmdXNYMlkoY2FyZCktPnBjbV9tdXRleCk7CiAJc25kX3ByaW50ZGQoInNuZF91c1gyWV9od19wYXJhbXMoJXAsICVwKVxuIiwgc3Vic3RyZWFtLCBod19wYXJhbXMpOwotCS8vIGFsbCBwY20gc3Vic3RyZWFtcyBvZmYgb25lIHVzWDJZIGhhdmUgdG8gb3BlcmF0ZSBhdCB0aGUgc2FtZSByYXRlICYgZm9ybWF0Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmY2FyZC0+ZGV2aWNlcykgewotCQlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwotCQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCQlpbnQgczsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKLQkJaWYgKGRldi0+dHlwZSAhPSBTTkRSVl9ERVZfUENNKQorCS8qIGFsbCBwY20gc3Vic3RyZWFtcyBvZmYgb25lIHVzWDJZIGhhdmUgdG8gb3BlcmF0ZSBhdCB0aGUgc2FtZQorCSAqIHJhdGUgJiBmb3JtYXQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5wY21fZGV2cyAqIDI7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3VzWDJZX3N1YnN0cmVhbSAqc3VicyA9IGRldi0+c3Vic1tpXTsKKwkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICp0ZXN0X3N1YnN0cmVhbTsKKworCQlpZiAoIXN1YnMpCiAJCQljb250aW51ZTsKLQkJcGNtID0gZGV2LT5kZXZpY2VfZGF0YTsKLQkJZm9yIChzID0gMDsgcyA8IDI7ICsrcykgewotCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICp0ZXN0X3N1YnN0cmVhbTsKLQkJCXRlc3Rfc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3NdLnN1YnN0cmVhbTsKLQkJCWlmICh0ZXN0X3N1YnN0cmVhbSAmJiB0ZXN0X3N1YnN0cmVhbSAhPSBzdWJzdHJlYW0gICYmCi0JCQkgICAgdGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUgJiYKLQkJCSAgICAoKHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgJiYKLQkJCSAgICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgIT0gZm9ybWF0KSB8fAotCQkJICAgICAodGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUgJiYKLQkJCSAgICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlICE9IHJhdGUpKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdGVzdF9zdWJzdHJlYW0gPSBzdWJzLT5wY21fc3Vic3RyZWFtOworCQlpZiAoIXRlc3Rfc3Vic3RyZWFtIHx8IHRlc3Rfc3Vic3RyZWFtID09IHN1YnN0cmVhbSB8fAorCQkgICAgIXRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lKQorCQkJY29udGludWU7CisJCWlmICgodGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUtPmZvcm1hdCAmJgorCQkgICAgIHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgIT0gZm9ybWF0KSB8fAorCQkgICAgKHRlc3Rfc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlICYmCisJCSAgICAgdGVzdF9zdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUgIT0gcmF0ZSkpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOwogCQl9CiAJfQotCWlmICgwID4gKGVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSkpKSB7CisKKwllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAorCQkJCSAgICAgICBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInNuZF9wY21fbGliX21hbGxvY19wYWdlcyglcCwgJWkpIHJldHVybmVkICVpXG4iLAogCQkJICAgc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcyksIGVycik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZXJyb3I7CiAJfQotCXJldHVybiAwOworCisgZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtNzkxLDcgKzc5OSw3IEBACiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX3VzWDJZX3N1YnN0cmVhbSAqc3VicyA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQltdXRleF9sb2NrKCZzdWJzLT51c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfbG9jaygmc3Vicy0+dXNYMlktPnBjbV9tdXRleCk7CiAJc25kX3ByaW50ZGQoInNuZF91c1gyWV9od19mcmVlKCVwKVxuIiwgc3Vic3RyZWFtKTsKIAogCWlmIChTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID09IHN1YnN0cmVhbS0+c3RyZWFtKSB7CkBAIC04MTIsNyArODIwLDcgQEAKIAkJCXVzWDJZX3VyYnNfcmVsZWFzZShzdWJzKTsKIAkJfQogCX0KLQltdXRleF91bmxvY2soJnN1YnMtPnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF91bmxvY2soJnN1YnMtPnVzWDJZLT5wY21fbXV0ZXgpOwogCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CiB9CiAvKgpAQCAtODI5LDcgKzgzNyw3IEBACiAJaW50IGVyciA9IDA7CiAJc25kX3ByaW50ZGQoInNuZF91c1gyWV9wY21fcHJlcGFyZSglcClcbiIsIHN1YnN0cmVhbSk7CiAKLQltdXRleF9sb2NrKCZ1c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfbG9jaygmdXNYMlktPnBjbV9tdXRleCk7CiAJdXNYMllfc3Vic19wcmVwYXJlKHN1YnMpOwogLy8gU3RhcnQgaGFyZHdhcmUgc3RyZWFtcwogLy8gU3luY1N0cmVhbSBmaXJzdC4uLi4KQEAgLTg0OSw3ICs4NTcsNyBAQAogCQllcnIgPSB1c1gyWV91cmJzX3N0YXJ0KHN1YnMpOwogCiAgdXBfcHJlcGFyZV9tdXRleDoKLQltdXRleF91bmxvY2soJnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF91bmxvY2soJnVzWDJZLT5wY21fbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMgYi9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jCmluZGV4IDgxNGQwZTguLjkwNzY2YTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzeDJ5aHdkZXBwY20uYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX3VzWDJZX3N1YnN0cmVhbSAqc3VicyA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YSwKIAkJKmNhcF9zdWJzMiA9IHN1YnMtPnVzWDJZLT5zdWJzW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSArIDJdOwotCW11dGV4X2xvY2soJnN1YnMtPnVzWDJZLT5wcmVwYXJlX211dGV4KTsKKwltdXRleF9sb2NrKCZzdWJzLT51c1gyWS0+cGNtX211dGV4KTsKIAlzbmRfcHJpbnRkZCgic25kX3VzWDJZX3VzYnBjbV9od19mcmVlKCVwKVxuIiwgc3Vic3RyZWFtKTsKIAogCWlmIChTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID09IHN1YnN0cmVhbS0+c3RyZWFtKSB7CkBAIC0zODcsNyArMzg3LDcgQEAKIAkJCQl1c1gyWV91c2JwY21fdXJic19yZWxlYXNlKGNhcF9zdWJzMik7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZzdWJzLT51c1gyWS0+cHJlcGFyZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzdWJzLT51c1gyWS0+cGNtX211dGV4KTsKIAlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfQogCkBAIC00OTMsNyArNDkzLDcgQEAKIAkJbWVtc2V0KHVzWDJZLT5od2RlcF9wY21fc2htLCAwLCBzaXplb2Yoc3RydWN0IHNuZF91c1gyWV9od2RlcF9wY21fc2htKSk7CiAJfQogCi0JbXV0ZXhfbG9jaygmdXNYMlktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X2xvY2soJnVzWDJZLT5wY21fbXV0ZXgpOwogCXVzWDJZX3N1YnNfcHJlcGFyZShzdWJzKTsKIC8vIFN0YXJ0IGhhcmR3YXJlIHN0cmVhbXMKIC8vIFN5bmNTdHJlYW0gZmlyc3QuLi4uCkBAIC01MzQsNyArNTM0LDcgQEAKIAkJdXNYMlktPmh3ZGVwX3BjbV9zaG0tPmNhcHR1cmVfaXNvX3N0YXJ0ID0gLTE7CiAKICB1cF9wcmVwYXJlX211dGV4OgotCW11dGV4X3VubG9jaygmdXNYMlktPnByZXBhcmVfbXV0ZXgpOworCW11dGV4X3VubG9jaygmdXNYMlktPnBjbV9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjAwLDU5ICs2MDAsMzAgQEAKIH07CiAKIAotc3RhdGljIGludCB1c1gyWV9wY21zX2xvY2tfY2hlY2soc3RydWN0IHNuZF9jYXJkICpjYXJkKQorc3RhdGljIGludCB1c1gyWV9wY21zX2J1c3lfY2hlY2soc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCWludCBlcnIgPSAwOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKLQkJaWYgKGRldi0+dHlwZSAhPSBTTkRSVl9ERVZfUENNKQotCQkJY29udGludWU7Ci0JCXBjbSA9IGRldi0+ZGV2aWNlX2RhdGE7Ci0JCW11dGV4X2xvY2soJnBjbS0+b3Blbl9tdXRleCk7CisJc3RydWN0IHVzWDJZZGV2CSpkZXYgPSB1c1gyWShjYXJkKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnBjbV9kZXZzICogMjsgaSsrKSB7CisJCXN0cnVjdCBzbmRfdXNYMllfc3Vic3RyZWFtICpzdWJzID0gZGV2LT5zdWJzW2ldOworCQlpZiAoc3VicyAmJiBzdWJzLT5wY21fc3Vic3RyZWFtICYmCisJCSAgICBTVUJTVFJFQU1fQlVTWShzdWJzLT5wY21fc3Vic3RyZWFtKSkKKwkJCXJldHVybiAtRUJVU1k7CiAJfQotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJaW50IHM7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7Ci0JCWlmIChkZXYtPnR5cGUgIT0gU05EUlZfREVWX1BDTSkKLQkJCWNvbnRpbnVlOwotCQlwY20gPSBkZXYtPmRldmljZV9kYXRhOwotCQlmb3IgKHMgPSAwOyBzIDwgMjsgKytzKSB7Ci0JCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQkJCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzXS5zdWJzdHJlYW07Ci0JCQlpZiAoc3Vic3RyZWFtICYmIFNVQlNUUkVBTV9CVVNZKHN1YnN0cmVhbSkpCi0JCQkJZXJyID0gLUVCVVNZOwotCQl9Ci0JfQotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgdXNYMllfcGNtc191bmxvY2soc3RydWN0IHNuZF9jYXJkICpjYXJkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKLQkJaWYgKGRldi0+dHlwZSAhPSBTTkRSVl9ERVZfUENNKQotCQkJY29udGludWU7Ci0JCXBjbSA9IGRldi0+ZGV2aWNlX2RhdGE7Ci0JCW11dGV4X3VubG9jaygmcGNtLT5vcGVuX211dGV4KTsKLQl9Ci19Ci0KLQogc3RhdGljIGludCBzbmRfdXNYMllfaHdkZXBfcGNtX29wZW4oc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCS8vIHdlIG5lZWQgdG8gYmUgdGhlIGZpcnN0IAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGh3LT5jYXJkOwotCWludCBlcnIgPSB1c1gyWV9wY21zX2xvY2tfY2hlY2soY2FyZCk7Ci0JaWYgKDAgPT0gZXJyKQorCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKKwllcnIgPSB1c1gyWV9wY21zX2J1c3lfY2hlY2soY2FyZCk7CisJaWYgKCFlcnIpCiAJCXVzWDJZKGNhcmQpLT5jaGlwX3N0YXR1cyB8PSBVU1gyWV9TVEFUX0NISVBfTU1BUF9QQ01fVVJCUzsKLQl1c1gyWV9wY21zX3VubG9jayhjYXJkKTsKKwltdXRleF91bmxvY2soJnVzWDJZKGNhcmQpLT5wY21fbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTY2MCwxMCArNjMxLDEzIEBACiBzdGF0aWMgaW50IHNuZF91c1gyWV9od2RlcF9wY21fcmVsZWFzZShzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gaHctPmNhcmQ7Ci0JaW50IGVyciA9IHVzWDJZX3BjbXNfbG9ja19jaGVjayhjYXJkKTsKLQlpZiAoMCA9PSBlcnIpCisJaW50IGVycjsKKworCW11dGV4X2xvY2soJnVzWDJZKGNhcmQpLT5wY21fbXV0ZXgpOworCWVyciA9IHVzWDJZX3BjbXNfYnVzeV9jaGVjayhjYXJkKTsKKwlpZiAoIWVycikKIAkJdXNYMlkoaHctPmNhcmQpLT5jaGlwX3N0YXR1cyAmPSB+VVNYMllfU1RBVF9DSElQX01NQVBfUENNX1VSQlM7Ci0JdXNYMllfcGNtc191bmxvY2soY2FyZCk7CisJbXV0ZXhfdW5sb2NrKCZ1c1gyWShjYXJkKS0+cGNtX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZSBiL3Rvb2xzL01ha2VmaWxlCmluZGV4IGZlZWMzYWQuLmJjYWU4MDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlCisrKyBiL3Rvb2xzL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogCUBlY2hvICcgIGNncm91cCAgICAgLSBjZ3JvdXAgdG9vbHMnCiAJQGVjaG8gJyAgY3B1cG93ZXIgICAtIGEgdG9vbCBmb3IgYWxsIHRoaW5ncyB4ODYgQ1BVIHBvd2VyJwogCUBlY2hvICcgIGZpcmV3aXJlICAgLSB0aGUgdXNlcnNwYWNlIHBhcnQgb2Ygbm9zeSwgYW4gSUVFRS0xMzk0IHRyYWZmaWMgc25pZmZlcicKKwlAZWNobyAnICBodiAgICAgICAgIC0gdG9vbHMgdXNlZCB3aGVuIGluIEh5cGVyLVYgY2xpZW50cycKIAlAZWNobyAnICBsZ3Vlc3QgICAgIC0gYSBtaW5pbWFsIDMyLWJpdCB4ODYgaHlwZXJ2aXNvcicKIAlAZWNobyAnICBwZXJmICAgICAgIC0gTGludXggcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgYW5kIGFuYWx5c2lzIHRvb2wnCiAJQGVjaG8gJyAgc2VsZnRlc3RzICAtIHZhcmlvdXMga2VybmVsIHNlbGZ0ZXN0cycKQEAgLTQwLDcgKzQxLDcgQEAKIGNwdXBvd2VyOiBGT1JDRQogCSQoY2FsbCBkZXNjZW5kLHBvd2VyLyRAKQogCi1jZ3JvdXAgZmlyZXdpcmUgZ3Vlc3QgdXNiIHZpcnRpbyB2bSBuZXQ6IEZPUkNFCitjZ3JvdXAgZmlyZXdpcmUgaHYgZ3Vlc3QgdXNiIHZpcnRpbyB2bSBuZXQ6IEZPUkNFCiAJJChjYWxsIGRlc2NlbmQsJEApCiAKIGxpYmFwaWtmczogRk9SQ0UKQEAgLTY0LDcgKzY1LDcgQEAKIGNwdXBvd2VyX2luc3RhbGw6CiAJJChjYWxsIGRlc2NlbmQscG93ZXIvJChAOl9pbnN0YWxsPSksaW5zdGFsbCkKIAotY2dyb3VwX2luc3RhbGwgZmlyZXdpcmVfaW5zdGFsbCBsZ3Vlc3RfaW5zdGFsbCBwZXJmX2luc3RhbGwgdXNiX2luc3RhbGwgdmlydGlvX2luc3RhbGwgdm1faW5zdGFsbCBuZXRfaW5zdGFsbDoKK2Nncm91cF9pbnN0YWxsIGZpcmV3aXJlX2luc3RhbGwgaHZfaW5zdGFsbCBsZ3Vlc3RfaW5zdGFsbCBwZXJmX2luc3RhbGwgdXNiX2luc3RhbGwgdmlydGlvX2luc3RhbGwgdm1faW5zdGFsbCBuZXRfaW5zdGFsbDoKIAkkKGNhbGwgZGVzY2VuZCwkKEA6X2luc3RhbGw9KSxpbnN0YWxsKQogCiBzZWxmdGVzdHNfaW5zdGFsbDoKQEAgLTc2LDcgKzc3LDcgQEAKIHRtb25faW5zdGFsbDoKIAkkKGNhbGwgZGVzY2VuZCx0aGVybWFsLyQoQDpfaW5zdGFsbD0pLGluc3RhbGwpCiAKLWluc3RhbGw6IGFjcGlfaW5zdGFsbCBjZ3JvdXBfaW5zdGFsbCBjcHVwb3dlcl9pbnN0YWxsIGZpcmV3aXJlX2luc3RhbGwgbGd1ZXN0X2luc3RhbGwgXAoraW5zdGFsbDogYWNwaV9pbnN0YWxsIGNncm91cF9pbnN0YWxsIGNwdXBvd2VyX2luc3RhbGwgaHZfaW5zdGFsbCBmaXJld2lyZV9pbnN0YWxsIGxndWVzdF9pbnN0YWxsIFwKIAkJcGVyZl9pbnN0YWxsIHNlbGZ0ZXN0c19pbnN0YWxsIHR1cmJvc3RhdF9pbnN0YWxsIHVzYl9pbnN0YWxsIFwKIAkJdmlydGlvX2luc3RhbGwgdm1faW5zdGFsbCBuZXRfaW5zdGFsbCB4ODZfZW5lcmd5X3BlcmZfcG9saWN5X2luc3RhbGwgXAogCXRtb24KQEAgLTg3LDcgKzg4LDcgQEAKIGNwdXBvd2VyX2NsZWFuOgogCSQoY2FsbCBkZXNjZW5kLHBvd2VyL2NwdXBvd2VyLGNsZWFuKQogCi1jZ3JvdXBfY2xlYW4gZmlyZXdpcmVfY2xlYW4gbGd1ZXN0X2NsZWFuIHVzYl9jbGVhbiB2aXJ0aW9fY2xlYW4gdm1fY2xlYW4gbmV0X2NsZWFuOgorY2dyb3VwX2NsZWFuIGh2X2NsZWFuIGZpcmV3aXJlX2NsZWFuIGxndWVzdF9jbGVhbiB1c2JfY2xlYW4gdmlydGlvX2NsZWFuIHZtX2NsZWFuIG5ldF9jbGVhbjoKIAkkKGNhbGwgZGVzY2VuZCwkKEA6X2NsZWFuPSksY2xlYW4pCiAKIGxpYmFwaWtmc19jbGVhbjoKQEAgLTEwNSw3ICsxMDYsNyBAQAogdG1vbl9jbGVhbjoKIAkkKGNhbGwgZGVzY2VuZCx0aGVybWFsL3Rtb24sY2xlYW4pCiAKLWNsZWFuOiBhY3BpX2NsZWFuIGNncm91cF9jbGVhbiBjcHVwb3dlcl9jbGVhbiBmaXJld2lyZV9jbGVhbiBsZ3Vlc3RfY2xlYW4gXAorY2xlYW46IGFjcGlfY2xlYW4gY2dyb3VwX2NsZWFuIGNwdXBvd2VyX2NsZWFuIGh2X2NsZWFuIGZpcmV3aXJlX2NsZWFuIGxndWVzdF9jbGVhbiBcCiAJCXBlcmZfY2xlYW4gc2VsZnRlc3RzX2NsZWFuIHR1cmJvc3RhdF9jbGVhbiB1c2JfY2xlYW4gdmlydGlvX2NsZWFuIFwKIAkJdm1fY2xlYW4gbmV0X2NsZWFuIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3lfY2xlYW4gdG1vbl9jbGVhbgogCmRpZmYgLS1naXQgYS90b29scy9odi9NYWtlZmlsZSBiL3Rvb2xzL2h2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjJmNzgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9odi9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjIE1ha2VmaWxlIGZvciBIeXBlci1WIHRvb2xzCisKK0NDID0gJChDUk9TU19DT01QSUxFKWdjYworUFRIUkVBRF9MSUJTID0gLWxwdGhyZWFkCitXQVJOSU5HUyA9IC1XYWxsIC1XZXh0cmEKK0NGTEFHUyA9ICQoV0FSTklOR1MpIC1nICQoUFRIUkVBRF9MSUJTKQorCithbGw6IGh2X2t2cF9kYWVtb24gaHZfdnNzX2RhZW1vbgorJTogJS5jCisJJChDQykgJChDRkxBR1MpIC1vICRAICReCisKK2NsZWFuOgorCSQoUk0pIGh2X2t2cF9kYWVtb24gaHZfdnNzX2RhZW1vbgpkaWZmIC0tZ2l0IGEvdG9vbHMvaHYvaHZfZmNvcHlfZGFlbW9uLmMgYi90b29scy9odi9odl9mY29weV9kYWVtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNjNGZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaHYvaHZfZmNvcHlfZGFlbW9uLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBob3N0IHRvIGd1ZXN0IGNvcHkgZnVuY3Rpb25hbGl0eSBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBNaWNyb3NvZnQsIEluYy4KKyAqCisgKiBBdXRob3IgOiBLLiBZLiBTcmluaXZhc2FuIDxreXNAbWljcm9zb2Z0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKi8KKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKK3N0YXRpYyBpbnQgdGFyZ2V0X2ZkOworc3RhdGljIGNoYXIgdGFyZ2V0X2ZuYW1lW1dfTUFYX1BBVEhdOworCitzdGF0aWMgaW50IGh2X3N0YXJ0X2Zjb3B5KHN0cnVjdCBodl9zdGFydF9mY29weSAqc21zZykKK3sKKwlpbnQgZXJyb3IgPSBIVl9FX0ZBSUw7CisJY2hhciAqcSwgKnA7CisKKwkvKgorCSAqIElmIHBvc3NpbGUgYXBwZW5kIGEgcGF0aCBzZXBlcmF0b3IgdG8gdGhlIHBhdGguCisJICovCisJaWYgKHN0cmxlbigoY2hhciAqKXNtc2ctPnBhdGhfbmFtZSkgPCAoV19NQVhfUEFUSCAtIDIpKQorCQlzdHJjYXQoKGNoYXIgKilzbXNnLT5wYXRoX25hbWUsICIvIik7CisKKwlwID0gKGNoYXIgKilzbXNnLT5wYXRoX25hbWU7CisJc25wcmludGYodGFyZ2V0X2ZuYW1lLCBzaXplb2YodGFyZ2V0X2ZuYW1lKSwgIiVzLyVzIiwKKwkJKGNoYXIgKilzbXNnLT5wYXRoX25hbWUsIHNtc2ctPmZpbGVfbmFtZSk7CisKKwlzeXNsb2coTE9HX0lORk8sICJUYXJnZXQgZmlsZSBuYW1lOiAlcyIsIHRhcmdldF9mbmFtZSk7CisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHBhdGggaXMgYWxyZWFkeSBpbiBwbGFjZTsgaWYgbm90LAorCSAqIGNyZWF0ZSBpZiByZXF1aXJlZC4KKwkgKi8KKwl3aGlsZSAoKHEgPSBzdHJjaHIocCwgJy8nKSkgIT0gTlVMTCkgeworCQlpZiAocSA9PSBwKSB7CisJCQlwKys7CisJCQljb250aW51ZTsKKwkJfQorCQkqcSA9ICdcMCc7CisJCWlmIChhY2Nlc3MoKGNoYXIgKilzbXNnLT5wYXRoX25hbWUsIEZfT0spKSB7CisJCQlpZiAoc21zZy0+Y29weV9mbGFncyAmIENSRUFURV9QQVRIKSB7CisJCQkJaWYgKG1rZGlyKChjaGFyICopc21zZy0+cGF0aF9uYW1lLCAwNzU1KSkgeworCQkJCQlzeXNsb2coTE9HX0VSUiwgIkZhaWxlZCB0byBjcmVhdGUgJXMiLAorCQkJCQkJKGNoYXIgKilzbXNnLT5wYXRoX25hbWUpOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzeXNsb2coTE9HX0VSUiwgIkludmFsaWQgcGF0aDogJXMiLAorCQkJCQkoY2hhciAqKXNtc2ctPnBhdGhfbmFtZSk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCXAgPSBxICsgMTsKKwkJKnEgPSAnLyc7CisJfQorCisJaWYgKCFhY2Nlc3ModGFyZ2V0X2ZuYW1lLCBGX09LKSkgeworCQlzeXNsb2coTE9HX0lORk8sICJGaWxlOiAlcyBleGlzdHMiLCB0YXJnZXRfZm5hbWUpOworCQlpZiAoIXNtc2ctPmNvcHlfZmxhZ3MgJiBPVkVSX1dSSVRFKQorCQkJZ290byBkb25lOworCX0KKworCXRhcmdldF9mZCA9IG9wZW4odGFyZ2V0X2ZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19DTE9FWEVDLCAwNzQ0KTsKKwlpZiAodGFyZ2V0X2ZkID09IC0xKSB7CisJCXN5c2xvZyhMT0dfSU5GTywgIk9wZW4gRmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwllcnJvciA9IDA7Citkb25lOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBodl9jb3B5X2RhdGEoc3RydWN0IGh2X2RvX2Zjb3B5ICpjcG1zZykKK3sKKwlzc2l6ZV90IGJ5dGVzX3dyaXR0ZW47CisKKwlieXRlc193cml0dGVuID0gcHdyaXRlKHRhcmdldF9mZCwgY3Btc2ctPmRhdGEsIGNwbXNnLT5zaXplLAorCQkJCWNwbXNnLT5vZmZzZXQpOworCisJaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gY3Btc2ctPnNpemUpCisJCXJldHVybiBIVl9FX0ZBSUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBodl9jb3B5X2ZpbmlzaGVkKHZvaWQpCit7CisJY2xvc2UodGFyZ2V0X2ZkKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgaHZfY29weV9jYW5jZWwodm9pZCkKK3sKKwljbG9zZSh0YXJnZXRfZmQpOworCXVubGluayh0YXJnZXRfZm5hbWUpOworCXJldHVybiAwOworCit9CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IGZkLCBmY29weV9mZCwgbGVuOworCWludCBlcnJvcjsKKwlpbnQgdmVyc2lvbiA9IEZDT1BZX0NVUlJFTlRfVkVSU0lPTjsKKwljaGFyICpidWZmZXJbNDA5NiAqIDJdOworCXN0cnVjdCBodl9mY29weV9oZHIgKmluX21zZzsKKworCWlmIChkYWVtb24oMSwgMCkpIHsKKwkJc3lzbG9nKExPR19FUlIsICJkYWVtb24oKSBmYWlsZWQ7IGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlvcGVubG9nKCJIVl9GQ09QWSIsIDAsIExPR19VU0VSKTsKKwlzeXNsb2coTE9HX0lORk8sICJIVl9GQ09QWSBzdGFydGluZzsgcGlkIGlzOiVkIiwgZ2V0cGlkKCkpOworCisJZmNvcHlfZmQgPSBvcGVuKCIvZGV2L3ZtYnVzL2h2X2Zjb3B5IiwgT19SRFdSKTsKKworCWlmIChmY29weV9mZCA8IDApIHsKKwkJc3lzbG9nKExPR19FUlIsICJvcGVuIC9kZXYvdm1idXMvaHZfZmNvcHkgZmFpbGVkOyBlcnJvcjogJWQgJXMiLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwkvKgorCSAqIFJlZ2lzdGVyIHdpdGggdGhlIGtlcm5lbC4KKwkgKi8KKwlpZiAoKHdyaXRlKGZjb3B5X2ZkLCAmdmVyc2lvbiwgc2l6ZW9mKGludCkpKSAhPSBzaXplb2YoaW50KSkgeworCQlzeXNsb2coTE9HX0VSUiwgIlJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIEluIHRoaXMgbG9vcCB3ZSBwcm9jZXNzIGZjb3B5IG1lc3NhZ2VzIGFmdGVyIHRoZQorCQkgKiBoYW5kc2hha2UgaXMgY29tcGxldGUuCisJCSAqLworCQlsZW4gPSBwcmVhZChmY29weV9mZCwgYnVmZmVyLCAoNDA5NiAqIDIpLCAwKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXN5c2xvZyhMT0dfRVJSLCAicHJlYWQgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJaW5fbXNnID0gKHN0cnVjdCBodl9mY29weV9oZHIgKilidWZmZXI7CisKKwkJc3dpdGNoIChpbl9tc2ctPm9wZXJhdGlvbikgeworCQljYXNlIFNUQVJUX0ZJTEVfQ09QWToKKwkJCWVycm9yID0gaHZfc3RhcnRfZmNvcHkoKHN0cnVjdCBodl9zdGFydF9mY29weSAqKWluX21zZyk7CisJCQlicmVhazsKKwkJY2FzZSBXUklURV9UT19GSUxFOgorCQkJZXJyb3IgPSBodl9jb3B5X2RhdGEoKHN0cnVjdCBodl9kb19mY29weSAqKWluX21zZyk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QTEVURV9GQ09QWToKKwkJCWVycm9yID0gaHZfY29weV9maW5pc2hlZCgpOworCQkJYnJlYWs7CisJCWNhc2UgQ0FOQ0VMX0ZDT1BZOgorCQkJZXJyb3IgPSBodl9jb3B5X2NhbmNlbCgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXN5c2xvZyhMT0dfRVJSLCAiVW5rbm93biBvcGVyYXRpb246ICVkIiwKKwkJCQlpbl9tc2ctPm9wZXJhdGlvbik7CisKKwkJfQorCisJCWlmIChwd3JpdGUoZmNvcHlfZmQsICZlcnJvciwgc2l6ZW9mKGludCksIDApICE9IHNpemVvZihpbnQpKSB7CisJCQlzeXNsb2coTE9HX0VSUiwgInB3cml0ZSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYyBiL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYwppbmRleCA1MjBkZTMzMDQuLjZhMjEzYjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYworKysgYi90b29scy9odi9odl92c3NfZGFlbW9uLmMKQEAgLTg3LDYgKzg3LDggQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3RyY21wKGVudC0+bW50X3R5cGUsICJpc285NjYwIikgPT0gMCkKIAkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKGVudC0+bW50X3R5cGUsICJ2ZmF0IikgPT0gMCkKKwkJCWNvbnRpbnVlOwogCQlpZiAoc3RyY21wKGVudC0+bW50X2RpciwgIi8iKSA9PSAwKSB7CiAJCQlyb290X3NlZW4gPSAxOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL2xpbnV4L2hhc2guaCBiL3Rvb2xzL2luY2x1ZGUvbGludXgvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjZjNjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pbmNsdWRlL2xpbnV4L2hhc2guaApAQCAtMCwwICsxLDUgQEAKKyNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2xpbnV4L2hhc2guaCIKKworI2lmbmRlZiBfVE9PTFNfTElOVVhfSEFTSF9ICisjZGVmaW5lIF9UT09MU19MSU5VWF9IQVNIX0gKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9NYWtlZmlsZSBiL3Rvb2xzL2xpYi9hcGkvTWFrZWZpbGUKaW5kZXggZWQyZjUxZS4uY2UwMGY3ZSAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2FwaS9NYWtlZmlsZQorKysgYi90b29scy9saWIvYXBpL01ha2VmaWxlCkBAIC05LDggKzksMTAgQEAKIExJQl9PQkpTPQogCiBMSUJfSCArPSBmcy9kZWJ1Z2ZzLmgKK0xJQl9IICs9IGZzL2ZzLmgKIAogTElCX09CSlMgKz0gJChPVVRQVVQpZnMvZGVidWdmcy5vCitMSUJfT0JKUyArPSAkKE9VVFBVVClmcy9mcy5vCiAKIExJQkZJTEUgPSBsaWJhcGlrZnMuYQogCmRpZmYgLS1naXQgYS90b29scy9saWIvYXBpL2ZzL2ZzLmMgYi90b29scy9saWIvYXBpL2ZzL2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1ZWI3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuYwpAQCAtMCwwICsxLDEyNCBAQAorLyogVE9ETyBtZXJnZS9mYWN0b3IgaW4gZGVidWdmcy5jIGhlcmUgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCisjaW5jbHVkZSAiZGVidWdmcy5oIgorI2luY2x1ZGUgImZzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzZnNfX2ZzX2tub3duX21vdW50cG9pbnRzW10gPSB7CisJIi9zeXMiLAorCTAsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByb2Nmc19fa25vd25fbW91bnRwb2ludHNbXSA9IHsKKwkiL3Byb2MiLAorCTAsCit9OworCitzdHJ1Y3QgZnMgeworCWNvbnN0IGNoYXIJCSpuYW1lOworCWNvbnN0IGNoYXIgKiBjb25zdAkqbW91bnRzOworCWNoYXIJCQkgcGF0aFtQQVRIX01BWCArIDFdOworCWJvb2wJCQkgZm91bmQ7CisJbG9uZwkJCSBtYWdpYzsKK307CisKK2VudW0geworCUZTX19TWVNGUyAgPSAwLAorCUZTX19QUk9DRlMgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBmcyBmc19fZW50cmllc1tdID0geworCVtGU19fU1lTRlNdID0geworCQkubmFtZQk9ICJzeXNmcyIsCisJCS5tb3VudHMJPSBzeXNmc19fZnNfa25vd25fbW91bnRwb2ludHMsCisJCS5tYWdpYwk9IFNZU0ZTX01BR0lDLAorCX0sCisJW0ZTX19QUk9DRlNdID0geworCQkubmFtZQk9ICJwcm9jIiwKKwkJLm1vdW50cwk9IHByb2Nmc19fa25vd25fbW91bnRwb2ludHMsCisJCS5tYWdpYwk9IFBST0NfU1VQRVJfTUFHSUMsCisJfSwKK307CisKK3N0YXRpYyBib29sIGZzX19yZWFkX21vdW50cyhzdHJ1Y3QgZnMgKmZzKQoreworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwljaGFyIHR5cGVbMTAwXTsKKwlGSUxFICpmcDsKKworCWZwID0gZm9wZW4oIi9wcm9jL21vdW50cyIsICJyIik7CisJaWYgKGZwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKCFmb3VuZCAmJgorCSAgICAgICBmc2NhbmYoZnAsICIlKnMgJSIgU1RSKFBBVEhfTUFYKSAicyAlOTlzICUqcyAlKmQgJSpkXG4iLAorCQkgICAgICBmcy0+cGF0aCwgdHlwZSkgPT0gMikgeworCisJCWlmIChzdHJjbXAodHlwZSwgZnMtPm5hbWUpID09IDApCisJCQlmb3VuZCA9IHRydWU7CisJfQorCisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gZnMtPmZvdW5kID0gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgZnNfX3ZhbGlkX21vdW50KGNvbnN0IGNoYXIgKmZzLCBsb25nIG1hZ2ljKQoreworCXN0cnVjdCBzdGF0ZnMgc3RfZnM7CisKKwlpZiAoc3RhdGZzKGZzLCAmc3RfZnMpIDwgMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJZWxzZSBpZiAoc3RfZnMuZl90eXBlICE9IG1hZ2ljKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBmc19fY2hlY2tfbW91bnRzKHN0cnVjdCBmcyAqZnMpCit7CisJY29uc3QgY2hhciAqIGNvbnN0ICpwdHI7CisKKwlwdHIgPSBmcy0+bW91bnRzOworCXdoaWxlICgqcHRyKSB7CisJCWlmIChmc19fdmFsaWRfbW91bnQoKnB0ciwgZnMtPm1hZ2ljKSA9PSAwKSB7CisJCQlmcy0+Zm91bmQgPSB0cnVlOworCQkJc3RyY3B5KGZzLT5wYXRoLCAqcHRyKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXB0cisrOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZzX19nZXRfbW91bnRwb2ludChzdHJ1Y3QgZnMgKmZzKQoreworCWlmIChmc19fY2hlY2tfbW91bnRzKGZzKSkKKwkJcmV0dXJuIGZzLT5wYXRoOworCisJcmV0dXJuIGZzX19yZWFkX21vdW50cyhmcykgPyBmcy0+cGF0aCA6IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmc19fbW91bnRwb2ludChpbnQgaWR4KQoreworCXN0cnVjdCBmcyAqZnMgPSAmZnNfX2VudHJpZXNbaWR4XTsKKworCWlmIChmcy0+Zm91bmQpCisJCXJldHVybiAoY29uc3QgY2hhciAqKWZzLT5wYXRoOworCisJcmV0dXJuIGZzX19nZXRfbW91bnRwb2ludChmcyk7Cit9CisKKyNkZWZpbmUgRlNfX01PVU5UUE9JTlQobmFtZSwgaWR4KQlcCitjb25zdCBjaGFyICpuYW1lIyNfX21vdW50cG9pbnQodm9pZCkJXAorewkJCQkJXAorCXJldHVybiBmc19fbW91bnRwb2ludChpZHgpOwlcCit9CisKK0ZTX19NT1VOVFBPSU5UKHN5c2ZzLCAgRlNfX1NZU0ZTKTsKK0ZTX19NT1VOVFBPSU5UKHByb2NmcywgRlNfX1BST0NGUyk7CmRpZmYgLS1naXQgYS90b29scy9saWIvYXBpL2ZzL2ZzLmggYi90b29scy9saWIvYXBpL2ZzL2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3MDQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvZnMuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9fQVBJX0ZTX18KKyNkZWZpbmUgX19BUElfRlNfXworCisjaWZuZGVmIFNZU0ZTX01BR0lDCisjZGVmaW5lIFNZU0ZTX01BR0lDICAgICAgICAgICAgMHg2MjY1NjU3MgorI2VuZGlmCisKKyNpZm5kZWYgUFJPQ19TVVBFUl9NQUdJQworI2RlZmluZSBQUk9DX1NVUEVSX01BR0lDICAgICAgIDB4OWZhMAorI2VuZGlmCisKK2NvbnN0IGNoYXIgKnN5c2ZzX19tb3VudHBvaW50KHZvaWQpOworY29uc3QgY2hhciAqcHJvY2ZzX19tb3VudHBvaW50KHZvaWQpOworI2VuZGlmIC8qIF9fQVBJX0ZTX18gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLW1lbS50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1tZW0udHh0CmluZGV4IDg4OGQ1MTEuLjFkNzhhNDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLW1lbS50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtbWVtLnR4dApAQCAtMTgsNiArMTgsMTAgQEAKICJwZXJmIG1lbSAtdCA8VFlQRT4gcmVwb3J0IiBkaXNwbGF5cyB0aGUgcmVzdWx0LiBJdCBpbnZva2VzIHBlcmYgcmVwb3J0IHdpdGggdGhlCiByaWdodCBzZXQgb2Ygb3B0aW9ucyB0byBkaXNwbGF5IGEgbWVtb3J5IGFjY2VzcyBwcm9maWxlLgogCitOb3RlIHRoYXQgb24gSW50ZWwgc3lzdGVtcyB0aGUgbWVtb3J5IGxhdGVuY3kgcmVwb3J0ZWQgaXMgdGhlIHVzZS1sYXRlbmN5LAorbm90IHRoZSBwdXJlIGxvYWQgKG9yIHN0b3JlIGxhdGVuY3kpLiBVc2UgbGF0ZW5jeSBpbmNsdWRlcyBhbnkgcGlwZWxpbmUKK3F1ZXVlaW5nIGRlbGF5cyBpbiBhZGRpdGlvbiB0byB0aGUgbWVtb3J5IHN1YnN5c3RlbSBsYXRlbmN5LgorCiBPUFRJT05TCiAtLS0tLS0tCiA8Y29tbWFuZD4uLi46OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CmluZGV4IGI3MTVjYjcuLjE1MTM5MzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKQEAgLTEzNiw2ICsxMzYsOCBAQAogJ05BTUUnIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGlzIGFyZ3VtZW50IChvcHRpb25hbCkuIFlvdSBjYW4gdXNlIHRoZSBuYW1lIG9mIGxvY2FsIHZhcmlhYmxlLCBsb2NhbCBkYXRhIHN0cnVjdHVyZSBtZW1iZXIgKGUuZy4gdmFyLT5maWVsZCwgdmFyLmZpZWxkMiksIGxvY2FsIGFycmF5IHdpdGggZml4ZWQgaW5kZXggKGUuZy4gYXJyYXlbMV0sIHZhci0+YXJyYXlbMF0sIHZhci0+cG9pbnRlclsyXSksIG9yIGtwcm9iZS10cmFjZXIgYXJndW1lbnQgZm9ybWF0IChlLmcuICRyZXR2YWwsICVheCwgZXRjKS4gTm90ZSB0aGF0IHRoZSBuYW1lIG9mIHRoaXMgYXJndW1lbnQgd2lsbCBiZSBzZXQgYXMgdGhlIGxhc3QgbWVtYmVyIG5hbWUgaWYgeW91IHNwZWNpZnkgYSBsb2NhbCBkYXRhIHN0cnVjdHVyZSBtZW1iZXIgKGUuZy4gZmllbGQyIGZvciAndmFyLT5maWVsZDEuZmllbGQyJy4pCiAnVFlQRScgY2FzdHMgdGhlIHR5cGUgb2YgdGhpcyBhcmd1bWVudCAob3B0aW9uYWwpLiBJZiBvbWl0dGVkLCBwZXJmIHByb2JlIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIGJhc2VkIG9uIGRlYnVnaW5mby4gWW91IGNhbiBzcGVjaWZ5ICdzdHJpbmcnIHR5cGUgb25seSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggaXMgYW4gYXJyYXkgb2Ygb3IgYSBwb2ludGVyIHRvICdjaGFyJyBvciAndW5zaWduZWQgY2hhcicgdHlwZS4KIAorT24geDg2IHN5c3RlbXMgJVJFRyBpcyBhbHdheXMgdGhlIHNob3J0IGZvcm0gb2YgdGhlIHJlZ2lzdGVyOiBmb3IgZXhhbXBsZSAlQVguICVSQVggb3IgJUVBWCBpcyBub3QgdmFsaWQuCisKIExJTkUgU1lOVEFYCiAtLS0tLS0tLS0tLQogTGluZSByYW5nZSBpcyBkZXNjcmliZWQgYnkgZm9sbG93aW5nIHN5bnRheC4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QgYi90b29scy9wZXJmL01BTklGRVNUCmluZGV4IGY0MTU3MmQuLmMwYzg3YzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QKKysrIGIvdG9vbHMvcGVyZi9NQU5JRkVTVApAQCAtNiw2ICs2LDcgQEAKIHRvb2xzL2xpYi9zeW1ib2wva2FsbHN5bXMuaAogdG9vbHMvaW5jbHVkZS9hc20vYnVnLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAordG9vbHMvaW5jbHVkZS9saW51eC9oYXNoLmgKIGluY2x1ZGUvbGludXgvY29uc3QuaAogaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKIGluY2x1ZGUvbGludXgvcmJ0cmVlLmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZiBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgppbmRleCA3MjU3ZTdlLi41MGQ4NzVkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmCkBAIC03LDYgKzcsOCBAQAogCiAjIERlZmluZSBWIHRvIGhhdmUgYSBtb3JlIHZlcmJvc2UgY29tcGlsZS4KICMKKyMgRGVmaW5lIFZGIHRvIGhhdmUgYSBtb3JlIHZlcmJvc2UgZmVhdHVyZSBjaGVjayBvdXRwdXQuCisjCiAjIERlZmluZSBPIHRvIHNhdmUgb3V0cHV0IGZpbGVzIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LgogIwogIyBEZWZpbmUgQVJDSCBhcyBuYW1lIG9mIHRhcmdldCBhcmNoaXRlY3R1cmUgaWYgeW91IHdhbnQgY3Jvc3MtYnVpbGRzLgpAQCAtNTUsNiArNTcsOSBAQAogIyBEZWZpbmUgTk9fTElCQVVESVQgaWYgeW91IGRvIG5vdCB3YW50IGxpYmF1ZGl0IHN1cHBvcnQKICMKICMgRGVmaW5lIE5PX0xJQkJJT05JQyBpZiB5b3UgZG8gbm90IHdhbnQgYmlvbmljIHN1cHBvcnQKKyMKKyMgRGVmaW5lIE5PX0xJQkRXX0RXQVJGX1VOV0lORCBpZiB5b3UgZG8gbm90IHdhbnQgbGliZHcgc3VwcG9ydAorIyBmb3IgZHdhcmYgYmFja3RyYWNlIHBvc3QgdW53aW5kLgogCiBpZmVxICgkKHNyY3RyZWUpLCkKIHNyY3RyZWUgOj0gJChwYXRzdWJzdCAlLywlLCQoZGlyICQoc2hlbGwgcHdkKSkpCkBAIC0yMDgsNyArMjEzLDcgQEAKIExJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKIExJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvbGlzdC5oCiBMSUJfSCArPSAuLi8uLi9pbmNsdWRlL3VhcGkvbGludXgvY29uc3QuaAotTElCX0ggKz0gLi4vLi4vaW5jbHVkZS9saW51eC9oYXNoLmgKK0xJQl9IICs9IC4uL2luY2x1ZGUvbGludXgvaGFzaC5oCiBMSUJfSCArPSAuLi8uLi9pbmNsdWRlL2xpbnV4L3N0cmluZ2lmeS5oCiBMSUJfSCArPSB1dGlsL2luY2x1ZGUvbGludXgvYml0bWFwLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9iaXRvcHMuaApAQCAtMjE4LDkgKzIyMyw3IEBACiBMSUJfSCArPSB1dGlsL2luY2x1ZGUvbGludXgva2VybmVsLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9saXN0LmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9leHBvcnQuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9wb2lzb24uaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmgKIExJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9yYnRyZWUuaAogTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L3JidHJlZV9hdWdtZW50ZWQuaAogTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC0yNDQsNyArMjQ3LDYgQEAKIExJQl9IICs9IHV0aWwvY2FsbGNoYWluLmgKIExJQl9IICs9IHV0aWwvYnVpbGQtaWQuaAogTElCX0ggKz0gdXRpbC9kZWJ1Zy5oCi1MSUJfSCArPSB1dGlsL2ZzLmgKIExJQl9IICs9IHV0aWwvcG11LmgKIExJQl9IICs9IHV0aWwvZXZlbnQuaAogTElCX0ggKz0gdXRpbC9ldnNlbC5oCkBAIC0zMDYsNyArMzA4LDYgQEAKIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvYnVpbGQtaWQubwogTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9jb25maWcubwogTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9jdHlwZS5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2ZzLm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcG11Lm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvZW52aXJvbm1lbnQubwogTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9ldmVudC5vCkBAIC00MDgsNiArNDA5LDExIEBACiBMSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9jb2RlLXJlYWRpbmcubwogTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvc2FtcGxlLXBhcnNpbmcubwogTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvcGFyc2Utbm8tc2FtcGxlLWlkLWFsbC5vCitpZm5kZWYgTk9fRFdBUkZfVU5XSU5ECitpZmVxICgkKEFSQ0gpLHg4NikKK0xJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2R3YXJmLXVud2luZC5vCitlbmRpZgorZW5kaWYKIAogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tYW5ub3RhdGUubwogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tYmVuY2gubwpAQCAtNDIwLDYgKzQyNiw5IEBACiBlbmRpZgogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL21lbS1tZW1jcHkubwogQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL21lbS1tZW1zZXQubworQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL2Z1dGV4LWhhc2gubworQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL2Z1dGV4LXdha2UubworQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL2Z1dGV4LXJlcXVldWUubwogCiBCVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYnVpbHRpbi1kaWZmLm8KIEJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLWV2bGlzdC5vCkBAIC00NzUsOCArNDg0LDEzIEBACiBlbmRpZiAjIE5PX0RXQVJGCiBlbmRpZiAjIE5PX0xJQkVMRgogCitpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECisgIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdW53aW5kLWxpYmR3Lm8KKyAgTElCX0ggKz0gdXRpbC91bndpbmQtbGliZHcuaAorZW5kaWYKKwogaWZuZGVmIE5PX0xJQlVOV0lORAotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3Vud2luZC5vCisgIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdW53aW5kLWxpYnVud2luZC5vCiBlbmRpZgogTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMva2VlcC10cmFja2luZy5vCiAKQEAgLTUzMyw2ICs1NDcsNyBAQAogICBpZmVxICgkKEFSQ0gpLHg4NikKICAgICBMSUJfSCArPSBhcmNoL3g4Ni9pbmNsdWRlL3BlcmZfcmVncy5oCiAgIGVuZGlmCisgIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcGVyZl9yZWdzLm8KIGVuZGlmCiAKIGlmbmRlZiBOT19MSUJOVU1BCkBAIC02NTUsNiArNjcwLDkgQEAKIAkJLURQWVRIT049JyIkKFBZVEhPTl9XT1JEKSInIFwKIAkJJDwKIAorJChPVVRQVVQpdGVzdHMvZHdhcmYtdW53aW5kLm86IHRlc3RzL2R3YXJmLXVud2luZC5jCisJJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICQ8CisKICQoT1VUUFVUKXV0aWwvY29uZmlnLm86IHV0aWwvY29uZmlnLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKIAkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSAtREVUQ19QRVJGQ09ORklHPSciJChFVENfUEVSRkNPTkZJR19TUSkiJyAkPAogCkBAIC03MDcsOSArNzI1LDE1IEBACiAjIHdlIGRlcGVuZCB0aGUgdmFyaW91cyBmaWxlcyBvbnRvIHRoZWlyIGRpcmVjdG9yaWVzLgogRElSRUNUT1JZX0RFUFMgPSAkKExJQl9PQkpTKSAkKEJVSUxUSU5fT0JKUykgJChHVEtfT0JKUykKIERJUkVDVE9SWV9ERVBTICs9ICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFICQoT1VUUFVUKWNvbW1vbi1jbWRzLmgKLSQoRElSRUNUT1JZX0RFUFMpOiB8ICQoc29ydCAkKGRpciAkKERJUkVDVE9SWV9ERVBTKSkpCisjIG5vIG5lZWQgdG8gYWRkIGZsZXggb2JqZWN0cywgYmVjYXVzZSB0aGV5IGRlcGVuZCBvbiBiaXNvbiBvbmVzCitESVJFQ1RPUllfREVQUyArPSAkKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5jCitESVJFQ1RPUllfREVQUyArPSAkKE9VVFBVVCl1dGlsL3BtdS1iaXNvbi5jCisKK09VVFBVVF9ESVJFQ1RPUklFUyA6PSAkKHNvcnQgJChkaXIgJChESVJFQ1RPUllfREVQUykpKQorCiskKERJUkVDVE9SWV9ERVBTKTogfCAkKE9VVFBVVF9ESVJFQ1RPUklFUykKICMgSW4gdGhlIHNlY29uZCBzdGVwLCB3ZSBtYWtlIGEgcnVsZSB0byBhY3R1YWxseSBjcmVhdGUgdGhlc2UgZGlyZWN0b3JpZXMKLSQoc29ydCAkKGRpciAkKERJUkVDVE9SWV9ERVBTKSkpOgorJChPVVRQVVRfRElSRUNUT1JJRVMpOgogCSQoUVVJRVRfTUtESVIpJChNS0RJUikgLXAgJEAgMj4vZGV2L251bGwKIAogJChMSUJfRklMRSk6ICQoTElCX09CSlMpCkBAIC04ODYsNyArOTEwLDcgQEAKIGNsZWFuOiAkKExJQlRSQUNFRVZFTlQpLWNsZWFuICQoTElCQVBJS0ZTKS1jbGVhbiBjb25maWctY2xlYW4KIAkkKGNhbGwgUVVJRVRfQ0xFQU4sIGNvcmUtb2JqcykgICQoUk0pICQoTElCX09CSlMpICQoQlVJTFRJTl9PQkpTKSAkKExJQl9GSUxFKSAkKE9VVFBVVClwZXJmLWFyY2hpdmUgJChPVVRQVVQpcGVyZi5vICQoTEFOR19CSU5ESU5HUykgJChHVEtfT0JKUykKIAkkKGNhbGwgUVVJRVRfQ0xFQU4sIGNvcmUtcHJvZ3MpICQoUk0pICQoQUxMX1BST0dSQU1TKSBwZXJmCi0JJChjYWxsIFFVSUVUX0NMRUFOLCBjb3JlLWdlbikgICAkKFJNKSAgKi5zcGVjICoucHljICoucHlvICovKi5weWMgKi8qLnB5byAkKE9VVFBVVCljb21tb24tY21kcy5oIFRBR1MgdGFncyBjc2NvcGUqICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFICQoT1VUUFVUKVBFUkYtQ0ZMQUdTICQoT1VUUFVUKXV0aWwvKi1iaXNvbiogJChPVVRQVVQpdXRpbC8qLWZsZXgqCisJJChjYWxsIFFVSUVUX0NMRUFOLCBjb3JlLWdlbikgICAkKFJNKSAgKi5zcGVjICoucHljICoucHlvICovKi5weWMgKi8qLnB5byAkKE9VVFBVVCljb21tb24tY21kcy5oIFRBR1MgdGFncyBjc2NvcGUqICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFICQoT1VUUFVUKVBFUkYtQ0ZMQUdTICQoT1VUUFVUKVBFUkYtRkVBVFVSRVMgJChPVVRQVVQpdXRpbC8qLWJpc29uKiAkKE9VVFBVVCl1dGlsLyotZmxleCoKIAkkKFFVSUVUX1NVQkRJUjApRG9jdW1lbnRhdGlvbiAkKFFVSUVUX1NVQkRJUjEpIGNsZWFuCiAJJChweXRob24tY2xlYW4pCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vTWFrZWZpbGUgYi90b29scy9wZXJmL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IGZlOWI2MWUuLjY3ZTliM2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS9NYWtlZmlsZQpAQCAtMyw1ICszLDUgQEAKIExJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2R3YXJmLXJlZ3MubwogZW5kaWYKIGlmbmRlZiBOT19MSUJVTldJTkQKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL3Vud2luZC5vCitMSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGlidW53aW5kLm8KIGVuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvdW53aW5kLWxpYnVud2luZC5jIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3Vud2luZC1saWJ1bndpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjllZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3Vud2luZC1saWJ1bndpbmQuYwpAQCAtMCwwICsxLDQ4IEBACisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpYnVud2luZC5oPgorI2luY2x1ZGUgInBlcmZfcmVncy5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvdW53aW5kLmgiCisKK2ludCBsaWJ1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pCit7CisJc3dpdGNoIChyZWdudW0pIHsKKwljYXNlIFVOV19BUk1fUjA6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjA7CisJY2FzZSBVTldfQVJNX1IxOgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1IxOworCWNhc2UgVU5XX0FSTV9SMjoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SMjsKKwljYXNlIFVOV19BUk1fUjM6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjM7CisJY2FzZSBVTldfQVJNX1I0OgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I0OworCWNhc2UgVU5XX0FSTV9SNToKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SNTsKKwljYXNlIFVOV19BUk1fUjY6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjY7CisJY2FzZSBVTldfQVJNX1I3OgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I3OworCWNhc2UgVU5XX0FSTV9SODoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SODsKKwljYXNlIFVOV19BUk1fUjk6CisJCXJldHVybiBQRVJGX1JFR19BUk1fUjk7CisJY2FzZSBVTldfQVJNX1IxMDoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SMTA7CisJY2FzZSBVTldfQVJNX1IxMToKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9GUDsKKwljYXNlIFVOV19BUk1fUjEyOgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX0lQOworCWNhc2UgVU5XX0FSTV9SMTM6CisJCXJldHVybiBQRVJGX1JFR19BUk1fU1A7CisJY2FzZSBVTldfQVJNX1IxNDoKKwkJcmV0dXJuIFBFUkZfUkVHX0FSTV9MUjsKKwljYXNlIFVOV19BUk1fUjE1OgorCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1BDOworCWRlZmF1bHQ6CisJCXByX2VycigidW53aW5kOiBpbnZhbGlkIHJlZyBpZCAlZFxuIiwgcmVnbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvdW53aW5kLmMgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvdW53aW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhM2RjOTUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL3Vud2luZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaWJ1bndpbmQuaD4KLSNpbmNsdWRlICJwZXJmX3JlZ3MuaCIKLSNpbmNsdWRlICIuLi8uLi91dGlsL3Vud2luZC5oIgotCi1pbnQgdW53aW5kX19hcmNoX3JlZ19pZChpbnQgcmVnbnVtKQotewotCXN3aXRjaCAocmVnbnVtKSB7Ci0JY2FzZSBVTldfQVJNX1IwOgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1IwOwotCWNhc2UgVU5XX0FSTV9SMToKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SMTsKLQljYXNlIFVOV19BUk1fUjI6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjI7Ci0JY2FzZSBVTldfQVJNX1IzOgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1IzOwotCWNhc2UgVU5XX0FSTV9SNDoKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SNDsKLQljYXNlIFVOV19BUk1fUjU6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjU7Ci0JY2FzZSBVTldfQVJNX1I2OgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I2OwotCWNhc2UgVU5XX0FSTV9SNzoKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9SNzsKLQljYXNlIFVOV19BUk1fUjg6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjg7Ci0JY2FzZSBVTldfQVJNX1I5OgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1I5OwotCWNhc2UgVU5XX0FSTV9SMTA6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fUjEwOwotCWNhc2UgVU5XX0FSTV9SMTE6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fRlA7Ci0JY2FzZSBVTldfQVJNX1IxMjoKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9JUDsKLQljYXNlIFVOV19BUk1fUjEzOgotCQlyZXR1cm4gUEVSRl9SRUdfQVJNX1NQOwotCWNhc2UgVU5XX0FSTV9SMTQ6Ci0JCXJldHVybiBQRVJGX1JFR19BUk1fTFI7Ci0JY2FzZSBVTldfQVJNX1IxNToKLQkJcmV0dXJuIFBFUkZfUkVHX0FSTV9QQzsKLQlkZWZhdWx0OgotCQlwcl9lcnIoInVud2luZDogaW52YWxpZCByZWcgaWQgJWRcbiIsIHJlZ251bSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggODgwMWZlMC4uMTY0MTU0MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZQorKysgYi90b29scy9wZXJmL2FyY2gveDg2L01ha2VmaWxlCkBAIC0zLDcgKzMsMTQgQEAKIExJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2R3YXJmLXJlZ3MubwogZW5kaWYKIGlmbmRlZiBOT19MSUJVTldJTkQKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL3Vud2luZC5vCitMSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGlidW53aW5kLm8KK2VuZGlmCitpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECitMSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGliZHcubworZW5kaWYKK2lmbmRlZiBOT19EV0FSRl9VTldJTkQKK0xJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS90ZXN0cy9yZWdzX2xvYWQubworTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3Rlc3RzL2R3YXJmLXVud2luZC5vCiBlbmRpZgogTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvaGVhZGVyLm8KIExJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL3RzYy5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L2luY2x1ZGUvcGVyZl9yZWdzLmggYi90b29scy9wZXJmL2FyY2gveDg2L2luY2x1ZGUvcGVyZl9yZWdzLmgKaW5kZXggZTg0Y2E3Ni4uZmM4MTljYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9pbmNsdWRlL3BlcmZfcmVncy5oCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvaW5jbHVkZS9wZXJmX3JlZ3MuaApAQCAtNSwxNCArNSwyMCBAQAogI2luY2x1ZGUgIi4uLy4uL3V0aWwvdHlwZXMuaCIKICNpbmNsdWRlIDxhc20vcGVyZl9yZWdzLmg+CiAKK3ZvaWQgcGVyZl9yZWdzX2xvYWQodTY0ICpyZWdzKTsKKwogI2lmbmRlZiBIQVZFX0FSQ0hfWDg2XzY0X1NVUFBPUlQKICNkZWZpbmUgUEVSRl9SRUdTX01BU0sgKCgxVUxMIDw8IFBFUkZfUkVHX1g4Nl8zMl9NQVgpIC0gMSkKKyNkZWZpbmUgUEVSRl9SRUdTX01BWCBQRVJGX1JFR19YODZfMzJfTUFYCisjZGVmaW5lIFBFUkZfU0FNUExFX1JFR1NfQUJJIFBFUkZfU0FNUExFX1JFR1NfQUJJXzMyCiAjZWxzZQogI2RlZmluZSBSRUdfTk9TVVBQT1JUICgoMVVMTCA8PCBQRVJGX1JFR19YODZfRFMpIHwgXAogCQkgICAgICAgKDFVTEwgPDwgUEVSRl9SRUdfWDg2X0VTKSB8IFwKIAkJICAgICAgICgxVUxMIDw8IFBFUkZfUkVHX1g4Nl9GUykgfCBcCiAJCSAgICAgICAoMVVMTCA8PCBQRVJGX1JFR19YODZfR1MpKQogI2RlZmluZSBQRVJGX1JFR1NfTUFTSyAoKCgxVUxMIDw8IFBFUkZfUkVHX1g4Nl82NF9NQVgpIC0gMSkgJiB+UkVHX05PU1VQUE9SVCkKKyNkZWZpbmUgUEVSRl9SRUdTX01BWCBQRVJGX1JFR19YODZfNjRfTUFYCisjZGVmaW5lIFBFUkZfU0FNUExFX1JFR1NfQUJJIFBFUkZfU0FNUExFX1JFR1NfQUJJXzY0CiAjZW5kaWYKICNkZWZpbmUgUEVSRl9SRUdfSVAgUEVSRl9SRUdfWDg2X0lQCiAjZGVmaW5lIFBFUkZfUkVHX1NQIFBFUkZfUkVHX1g4Nl9TUApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9kd2FyZi11bndpbmQuYyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdGVzdHMvZHdhcmYtdW53aW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwMmFkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdGVzdHMvZHdhcmYtdW53aW5kLmMKQEAgLTAsMCArMSw1OSBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInBlcmZfcmVncy5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAidGVzdHMvdGVzdHMuaCIKKworI2RlZmluZSBTVEFDS19TSVpFIDgxOTIKKworc3RhdGljIGludCBzYW1wbGVfdXN0YWNrKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgdTY0ICpyZWdzKQoreworCXN0cnVjdCBzdGFja19kdW1wICpzdGFjayA9ICZzYW1wbGUtPnVzZXJfc3RhY2s7CisJc3RydWN0IG1hcCAqbWFwOworCXVuc2lnbmVkIGxvbmcgc3A7CisJdTY0IHN0YWNrX3NpemUsICpidWY7CisKKwlidWYgPSBtYWxsb2MoU1RBQ0tfU0laRSk7CisJaWYgKCFidWYpIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBhbGxvY2F0ZSBzYW1wbGUgdXJlZ3MgZGF0YVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzcCA9ICh1bnNpZ25lZCBsb25nKSByZWdzW1BFUkZfUkVHX1g4Nl9TUF07CisKKwltYXAgPSBtYXBfZ3JvdXBzX19maW5kKCZ0aHJlYWQtPm1nLCBNQVBfX0ZVTkNUSU9OLCAodTY0KSBzcCk7CisJaWYgKCFtYXApIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBnZXQgc3RhY2sgbWFwXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0YWNrX3NpemUgPSBtYXAtPmVuZCAtIHNwOworCXN0YWNrX3NpemUgPSBzdGFja19zaXplID4gU1RBQ0tfU0laRSA/IFNUQUNLX1NJWkUgOiBzdGFja19zaXplOworCisJbWVtY3B5KGJ1ZiwgKHZvaWQgKikgc3AsIHN0YWNrX3NpemUpOworCXN0YWNrLT5kYXRhID0gKGNoYXIgKikgYnVmOworCXN0YWNrLT5zaXplID0gc3RhY2tfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHRlc3RfX2FyY2hfdW53aW5kX3NhbXBsZShzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKQoreworCXN0cnVjdCByZWdzX2R1bXAgKnJlZ3MgPSAmc2FtcGxlLT51c2VyX3JlZ3M7CisJdTY0ICpidWY7CisKKwlidWYgPSBtYWxsb2Moc2l6ZW9mKHU2NCkgKiBQRVJGX1JFR1NfTUFYKTsKKwlpZiAoIWJ1ZikgeworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGFsbG9jYXRlIHNhbXBsZSB1cmVncyBkYXRhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBlcmZfcmVnc19sb2FkKGJ1Zik7CisJcmVncy0+YWJpICA9IFBFUkZfU0FNUExFX1JFR1NfQUJJOworCXJlZ3MtPnJlZ3MgPSBidWY7CisJcmVncy0+bWFzayA9IFBFUkZfUkVHU19NQVNLOworCisJcmV0dXJuIHNhbXBsZV91c3RhY2soc2FtcGxlLCB0aHJlYWQsIGJ1Zik7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3Rlc3RzL3JlZ3NfbG9hZC5TIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9yZWdzX2xvYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTE2N2JmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9yZWdzX2xvYWQuUwpAQCAtMCwwICsxLDkyIEBACisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNkZWZpbmUgQVgJIDAKKyNkZWZpbmUgQlgJIDEgKiA4CisjZGVmaW5lIENYCSAyICogOAorI2RlZmluZSBEWAkgMyAqIDgKKyNkZWZpbmUgU0kJIDQgKiA4CisjZGVmaW5lIERJCSA1ICogOAorI2RlZmluZSBCUAkgNiAqIDgKKyNkZWZpbmUgU1AJIDcgKiA4CisjZGVmaW5lIElQCSA4ICogOAorI2RlZmluZSBGTEFHUwkgOSAqIDgKKyNkZWZpbmUgQ1MJMTAgKiA4CisjZGVmaW5lIFNTCTExICogOAorI2RlZmluZSBEUwkxMiAqIDgKKyNkZWZpbmUgRVMJMTMgKiA4CisjZGVmaW5lIEZTCTE0ICogOAorI2RlZmluZSBHUwkxNSAqIDgKKyNkZWZpbmUgUjgJMTYgKiA4CisjZGVmaW5lIFI5CTE3ICogOAorI2RlZmluZSBSMTAJMTggKiA4CisjZGVmaW5lIFIxMQkxOSAqIDgKKyNkZWZpbmUgUjEyCTIwICogOAorI2RlZmluZSBSMTMJMjEgKiA4CisjZGVmaW5lIFIxNAkyMiAqIDgKKyNkZWZpbmUgUjE1CTIzICogOAorCisudGV4dAorI2lmZGVmIEhBVkVfQVJDSF9YODZfNjRfU1VQUE9SVAorRU5UUlkocGVyZl9yZWdzX2xvYWQpCisJbW92cSAlcmF4LCBBWCglcmRpKQorCW1vdnEgJXJieCwgQlgoJXJkaSkKKwltb3ZxICVyY3gsIENYKCVyZGkpCisJbW92cSAlcmR4LCBEWCglcmRpKQorCW1vdnEgJXJzaSwgU0koJXJkaSkKKwltb3ZxICVyZGksIERJKCVyZGkpCisJbW92cSAlcmJwLCBCUCglcmRpKQorCisJbGVhcSA4KCVyc3ApLCAlcmF4IC8qIGV4Y2x1ZGUgdGhpcyBjYWxsLiAgKi8KKwltb3ZxICVyYXgsIFNQKCVyZGkpCisKKwltb3ZxIDAoJXJzcCksICVyYXgKKwltb3ZxICVyYXgsIElQKCVyZGkpCisKKwltb3ZxICQwLCBGTEFHUyglcmRpKQorCW1vdnEgJDAsIENTKCVyZGkpCisJbW92cSAkMCwgU1MoJXJkaSkKKwltb3ZxICQwLCBEUyglcmRpKQorCW1vdnEgJDAsIEVTKCVyZGkpCisJbW92cSAkMCwgRlMoJXJkaSkKKwltb3ZxICQwLCBHUyglcmRpKQorCisJbW92cSAlcjgsICBSOCglcmRpKQorCW1vdnEgJXI5LCAgUjkoJXJkaSkKKwltb3ZxICVyMTAsIFIxMCglcmRpKQorCW1vdnEgJXIxMSwgUjExKCVyZGkpCisJbW92cSAlcjEyLCBSMTIoJXJkaSkKKwltb3ZxICVyMTMsIFIxMyglcmRpKQorCW1vdnEgJXIxNCwgUjE0KCVyZGkpCisJbW92cSAlcjE1LCBSMTUoJXJkaSkKKwlyZXQKK0VORFBST0MocGVyZl9yZWdzX2xvYWQpCisjZWxzZQorRU5UUlkocGVyZl9yZWdzX2xvYWQpCisJcHVzaCAlZWRpCisJbW92bCA4KCVlc3ApLCAlZWRpCisJbW92bCAlZWF4LCBBWCglZWRpKQorCW1vdmwgJWVieCwgQlgoJWVkaSkKKwltb3ZsICVlY3gsIENYKCVlZGkpCisJbW92bCAlZWR4LCBEWCglZWRpKQorCW1vdmwgJWVzaSwgU0koJWVkaSkKKwlwb3AgJWVheAorCW1vdmwgJWVheCwgREkoJWVkaSkKKwltb3ZsICVlYnAsIEJQKCVlZGkpCisKKwlsZWFsIDQoJWVzcCksICVlYXggLyogZXhjbHVkZSB0aGlzIGNhbGwuICAqLworCW1vdmwgJWVheCwgU1AoJWVkaSkKKworCW1vdmwgMCglZXNwKSwgJWVheAorCW1vdmwgJWVheCwgSVAoJWVkaSkKKworCW1vdmwgJDAsIEZMQUdTKCVlZGkpCisJbW92bCAkMCwgQ1MoJWVkaSkKKwltb3ZsICQwLCBTUyglZWRpKQorCW1vdmwgJDAsIERTKCVlZGkpCisJbW92bCAkMCwgRVMoJWVkaSkKKwltb3ZsICQwLCBGUyglZWRpKQorCW1vdmwgJDAsIEdTKCVlZGkpCisJcmV0CitFTkRQUk9DKHBlcmZfcmVnc19sb2FkKQorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYmR3LmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYmR3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNzIxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC91bndpbmQtbGliZHcuYwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSA8ZWxmdXRpbHMvbGliZHdmbC5oPgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvdW53aW5kLWxpYmR3LmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9wZXJmX3JlZ3MuaCIKKworYm9vbCBsaWJkd19fYXJjaF9zZXRfaW5pdGlhbF9yZWdpc3RlcnMoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7CisJc3RydWN0IHJlZ3NfZHVtcCAqdXNlcl9yZWdzID0gJnVpLT5zYW1wbGUtPnVzZXJfcmVnczsKKwlEd2FyZl9Xb3JkIGR3YXJmX3JlZ3NbMTddOworCXVuc2lnbmVkIG5yZWdzOworCisjZGVmaW5lIFJFRyhyKSAoewkJCQkJCVwKKwlEd2FyZl9Xb3JkIHZhbCA9IDA7CQkJCQlcCisJcGVyZl9yZWdfdmFsdWUoJnZhbCwgdXNlcl9yZWdzLCBQRVJGX1JFR19YODZfIyNyKTsJXAorCXZhbDsJCQkJCQkJXAorfSkKKworCWlmICh1c2VyX3JlZ3MtPmFiaSA9PSBQRVJGX1NBTVBMRV9SRUdTX0FCSV8zMikgeworCQlkd2FyZl9yZWdzWzBdID0gUkVHKEFYKTsKKwkJZHdhcmZfcmVnc1sxXSA9IFJFRyhDWCk7CisJCWR3YXJmX3JlZ3NbMl0gPSBSRUcoRFgpOworCQlkd2FyZl9yZWdzWzNdID0gUkVHKEJYKTsKKwkJZHdhcmZfcmVnc1s0XSA9IFJFRyhTUCk7CisJCWR3YXJmX3JlZ3NbNV0gPSBSRUcoQlApOworCQlkd2FyZl9yZWdzWzZdID0gUkVHKFNJKTsKKwkJZHdhcmZfcmVnc1s3XSA9IFJFRyhESSk7CisJCWR3YXJmX3JlZ3NbOF0gPSBSRUcoSVApOworCQlucmVncyA9IDk7CisJfSBlbHNlIHsKKwkJZHdhcmZfcmVnc1swXSAgPSBSRUcoQVgpOworCQlkd2FyZl9yZWdzWzFdICA9IFJFRyhEWCk7CisJCWR3YXJmX3JlZ3NbMl0gID0gUkVHKENYKTsKKwkJZHdhcmZfcmVnc1szXSAgPSBSRUcoQlgpOworCQlkd2FyZl9yZWdzWzRdICA9IFJFRyhTSSk7CisJCWR3YXJmX3JlZ3NbNV0gID0gUkVHKERJKTsKKwkJZHdhcmZfcmVnc1s2XSAgPSBSRUcoQlApOworCQlkd2FyZl9yZWdzWzddICA9IFJFRyhTUCk7CisJCWR3YXJmX3JlZ3NbOF0gID0gUkVHKFI4KTsKKwkJZHdhcmZfcmVnc1s5XSAgPSBSRUcoUjkpOworCQlkd2FyZl9yZWdzWzEwXSA9IFJFRyhSMTApOworCQlkd2FyZl9yZWdzWzExXSA9IFJFRyhSMTEpOworCQlkd2FyZl9yZWdzWzEyXSA9IFJFRyhSMTIpOworCQlkd2FyZl9yZWdzWzEzXSA9IFJFRyhSMTMpOworCQlkd2FyZl9yZWdzWzE0XSA9IFJFRyhSMTQpOworCQlkd2FyZl9yZWdzWzE1XSA9IFJFRyhSMTUpOworCQlkd2FyZl9yZWdzWzE2XSA9IFJFRyhJUCk7CisJCW5yZWdzID0gMTc7CisJfQorCisJcmV0dXJuIGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycyh0aHJlYWQsIDAsIG5yZWdzLCBkd2FyZl9yZWdzKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC91bndpbmQtbGlidW53aW5kLmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYnVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjFmNjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLWxpYnVud2luZC5jCkBAIC0wLDAgKzEsMTExIEBACisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpYnVud2luZC5oPgorI2luY2x1ZGUgInBlcmZfcmVncy5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvdW53aW5kLmgiCisKKyNpZmRlZiBIQVZFX0FSQ0hfWDg2XzY0X1NVUFBPUlQKK2ludCBsaWJ1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pCit7CisJaW50IGlkOworCisJc3dpdGNoIChyZWdudW0pIHsKKwljYXNlIFVOV19YODZfNjRfUkFYOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9BWDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1JEWDoKKwkJaWQgPSBQRVJGX1JFR19YODZfRFg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SQ1g6CisJCWlkID0gUEVSRl9SRUdfWDg2X0NYOworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUkJYOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9CWDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1JTSToKKwkJaWQgPSBQRVJGX1JFR19YODZfU0k7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SREk6CisJCWlkID0gUEVSRl9SRUdfWDg2X0RJOworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUkJQOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9CUDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1JTUDoKKwkJaWQgPSBQRVJGX1JFR19YODZfU1A7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SODoKKwkJaWQgPSBQRVJGX1JFR19YODZfUjg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SOToKKwkJaWQgPSBQRVJGX1JFR19YODZfUjk7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SMTA6CisJCWlkID0gUEVSRl9SRUdfWDg2X1IxMDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1IxMToKKwkJaWQgPSBQRVJGX1JFR19YODZfUjExOworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUjEyOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTI7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SMTM6CisJCWlkID0gUEVSRl9SRUdfWDg2X1IxMzsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2XzY0X1IxNDoKKwkJaWQgPSBQRVJGX1JFR19YODZfUjE0OworCQlicmVhazsKKwljYXNlIFVOV19YODZfNjRfUjE1OgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTU7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl82NF9SSVA6CisJCWlkID0gUEVSRl9SRUdfWDg2X0lQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVud2luZDogaW52YWxpZCByZWcgaWQgJWRcbiIsIHJlZ251bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBpZDsKK30KKyNlbHNlCitpbnQgbGlidW53aW5kX19hcmNoX3JlZ19pZChpbnQgcmVnbnVtKQoreworCWludCBpZDsKKworCXN3aXRjaCAocmVnbnVtKSB7CisJY2FzZSBVTldfWDg2X0VBWDoKKwkJaWQgPSBQRVJGX1JFR19YODZfQVg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl9FRFg6CisJCWlkID0gUEVSRl9SRUdfWDg2X0RYOworCQlicmVhazsKKwljYXNlIFVOV19YODZfRUNYOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9DWDsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2X0VCWDoKKwkJaWQgPSBQRVJGX1JFR19YODZfQlg7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl9FU0k6CisJCWlkID0gUEVSRl9SRUdfWDg2X1NJOworCQlicmVhazsKKwljYXNlIFVOV19YODZfRURJOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9ESTsKKwkJYnJlYWs7CisJY2FzZSBVTldfWDg2X0VCUDoKKwkJaWQgPSBQRVJGX1JFR19YODZfQlA7CisJCWJyZWFrOworCWNhc2UgVU5XX1g4Nl9FU1A6CisJCWlkID0gUEVSRl9SRUdfWDg2X1NQOworCQlicmVhazsKKwljYXNlIFVOV19YODZfRUlQOgorCQlpZCA9IFBFUkZfUkVHX1g4Nl9JUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJ1bndpbmQ6IGludmFsaWQgcmVnIGlkICVkXG4iLCByZWdudW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaWQ7Cit9CisjZW5kaWYgLyogSEFWRV9BUkNIX1g4Nl82NF9TVVBQT1JUICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvdW53aW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NmE4OGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL3Vud2luZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bGlidW53aW5kLmg+Ci0jaW5jbHVkZSAicGVyZl9yZWdzLmgiCi0jaW5jbHVkZSAiLi4vLi4vdXRpbC91bndpbmQuaCIKLQotI2lmZGVmIEhBVkVfQVJDSF9YODZfNjRfU1VQUE9SVAotaW50IHVud2luZF9fYXJjaF9yZWdfaWQoaW50IHJlZ251bSkKLXsKLQlpbnQgaWQ7Ci0KLQlzd2l0Y2ggKHJlZ251bSkgewotCWNhc2UgVU5XX1g4Nl82NF9SQVg6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0FYOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUkRYOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9EWDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1JDWDoKLQkJaWQgPSBQRVJGX1JFR19YODZfQ1g7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SQlg6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0JYOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUlNJOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9TSTsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1JESToKLQkJaWQgPSBQRVJGX1JFR19YODZfREk7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SQlA6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0JQOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUlNQOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9TUDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1I4OgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SODsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1I5OgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SOTsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1IxMDoKLQkJaWQgPSBQRVJGX1JFR19YODZfUjEwOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUjExOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTE7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SMTI6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X1IxMjsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1IxMzoKLQkJaWQgPSBQRVJGX1JFR19YODZfUjEzOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfNjRfUjE0OgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9SMTQ7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl82NF9SMTU6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X1IxNTsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2XzY0X1JJUDoKLQkJaWQgPSBQRVJGX1JFR19YODZfSVA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigidW53aW5kOiBpbnZhbGlkIHJlZyBpZCAlZFxuIiwgcmVnbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGlkOwotfQotI2Vsc2UKLWludCB1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pCi17Ci0JaW50IGlkOwotCi0Jc3dpdGNoIChyZWdudW0pIHsKLQljYXNlIFVOV19YODZfRUFYOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9BWDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2X0VEWDoKLQkJaWQgPSBQRVJGX1JFR19YODZfRFg7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl9FQ1g6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0NYOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfRUJYOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9CWDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2X0VTSToKLQkJaWQgPSBQRVJGX1JFR19YODZfU0k7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl9FREk6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0RJOwotCQlicmVhazsKLQljYXNlIFVOV19YODZfRUJQOgotCQlpZCA9IFBFUkZfUkVHX1g4Nl9CUDsKLQkJYnJlYWs7Ci0JY2FzZSBVTldfWDg2X0VTUDoKLQkJaWQgPSBQRVJGX1JFR19YODZfU1A7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX1g4Nl9FSVA6Ci0JCWlkID0gUEVSRl9SRUdfWDg2X0lQOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoInVud2luZDogaW52YWxpZCByZWcgaWQgJWRcbiIsIHJlZ251bSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBpZDsKLX0KLSNlbmRpZiAvKiBIQVZFX0FSQ0hfWDg2XzY0X1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvYmVuY2guaCBiL3Rvb2xzL3BlcmYvYmVuY2gvYmVuY2guaAppbmRleCAwZmRjODUyLi5lYmE0NjcwOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9iZW5jaC5oCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvYmVuY2guaApAQCAtMzEsNiArMzEsOSBAQAogZXh0ZXJuIGludCBiZW5jaF9tZW1fbWVtY3B5KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKIAkJCSAgICBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpOwogZXh0ZXJuIGludCBiZW5jaF9tZW1fbWVtc2V0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgYmVuY2hfZnV0ZXhfaGFzaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGJlbmNoX2Z1dGV4X3dha2UoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBiZW5jaF9mdXRleF9yZXF1ZXVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKIAogI2RlZmluZSBCRU5DSF9GT1JNQVRfREVGQVVMVF9TVFIJImRlZmF1bHQiCiAjZGVmaW5lIEJFTkNIX0ZPUk1BVF9ERUZBVUxUCQkwCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LWhhc2guYyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDIwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LWhhc2guYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAgRGF2aWRsb2hyIEJ1ZXNvIDxkYXZpZGxvaHJAaHAuY29tPgorICoKKyAqIGZ1dGV4LWhhc2g6IFN0cmVzcyB0aGUgaGVsbCBvdXQgb2YgdGhlIExpbnV4IGtlcm5lbCBmdXRleCB1YWRkciBoYXNoaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIGtlcm5lbCdzIGZ1dGV4IGhhc2gKKyAqIHRhYmxlL2Z1bmN0aW9uIGltcGxlbWVudGF0aW9uLiBJbiBvcmRlciBmb3IgaXQgdG8gbWFrZSBzZW5zZSwgdXNlIHdpdGggYXMKKyAqIG1hbnkgdGhyZWFkcyBhbmQgZnV0ZXhlcyBhcyBwb3NzaWJsZS4KKyAqLworCisjaW5jbHVkZSAiLi4vcGVyZi5oIgorI2luY2x1ZGUgIi4uL3V0aWwvdXRpbC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvc3RhdC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvcGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgIi4uL3V0aWwvaGVhZGVyLmgiCisjaW5jbHVkZSAiYmVuY2guaCIKKyNpbmNsdWRlICJmdXRleC5oIgorCisjaW5jbHVkZSA8ZXJyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnRocmVhZHMgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBuc2VjcyAgICA9IDEwOworLyogYW1vdW50IG9mIGZ1dGV4ZXMgcGVyIHRocmVhZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZnV0ZXhlcyA9IDEwMjQ7CitzdGF0aWMgYm9vbCBmc2hhcmVkID0gZmFsc2UsIGRvbmUgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2U7CisKK3N0cnVjdCB0aW1ldmFsIHN0YXJ0LCBlbmQsIHJ1bnRpbWU7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IHRocmVhZF9sb2NrOworc3RhdGljIHVuc2lnbmVkIGludCB0aHJlYWRzX3N0YXJ0aW5nOworc3RhdGljIHN0cnVjdCBzdGF0cyB0aHJvdWdocHV0X3N0YXRzOworc3RhdGljIHB0aHJlYWRfY29uZF90IHRocmVhZF9wYXJlbnQsIHRocmVhZF93b3JrZXI7CisKK3N0cnVjdCB3b3JrZXIgeworCWludCB0aWQ7CisJdV9pbnQzMl90ICpmdXRleDsKKwlwdGhyZWFkX3QgdGhyZWFkOworCXVuc2lnbmVkIGxvbmcgb3BzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCU9QVF9VSU5URUdFUigndCcsICJ0aHJlYWRzIiwgJm50aHJlYWRzLCAiU3BlY2lmeSBhbW91bnQgb2YgdGhyZWFkcyIpLAorCU9QVF9VSU5URUdFUigncicsICJydW50aW1lIiwgJm5zZWNzLCAgICAiU3BlY2lmeSBydW50aW1lIChpbiBzZWNvbmRzKSIpLAorCU9QVF9VSU5URUdFUignZicsICJmdXRleGVzIiwgJm5mdXRleGVzLCAiU3BlY2lmeSBhbW91bnQgb2YgZnV0ZXhlcyBwZXIgdGhyZWFkcyIpLAorCU9QVF9CT09MRUFOKCAncycsICJzaWxlbnQiLCAgJnNpbGVudCwgICAiU2lsZW50IG1vZGU6IGRvIG5vdCBkaXNwbGF5IGRhdGEvZGV0YWlscyIpLAorCU9QVF9CT09MRUFOKCAnUycsICJzaGFyZWQiLCAgJmZzaGFyZWQsICAiVXNlIHNoYXJlZCBmdXRleGVzIGluc3RlYWQgb2YgcHJpdmF0ZSBvbmVzIiksCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlbmNoX2Z1dGV4X2hhc2hfdXNhZ2VbXSA9IHsKKwkicGVyZiBiZW5jaCBmdXRleCBoYXNoIDxvcHRpb25zPiIsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgKndvcmtlcmZuKHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB3b3JrZXIgKncgPSAoc3RydWN0IHdvcmtlciAqKSBhcmc7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl0aHJlYWRzX3N0YXJ0aW5nLS07CisJaWYgKCF0aHJlYWRzX3N0YXJ0aW5nKQorCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3dvcmtlciwgJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgbmZ1dGV4ZXM7IGkrKywgdy0+b3BzKyspIHsKKwkJCS8qCisJCQkgKiBXZSB3YW50IHRoZSBmdXRleCBjYWxscyB0byBmYWlsIGluIG9yZGVyIHRvIHN0cmVzcworCQkJICogdGhlIGhhc2hpbmcgb2YgdWFkZHIgYW5kIG5vdCBtZWFzdXJlIG90aGVyIHN0ZXBzLAorCQkJICogc3VjaCBhcyBpbnRlcm5hbCB3YWl0cXVldWUgaGFuZGxpbmcsIHRodXMgZW5sYXJnaW5nCisJCQkgKiB0aGUgY3JpdGljYWwgcmVnaW9uIHByb3RlY3RlZCBieSBoYi0+bG9jay4KKwkJCSAqLworCQkJcmV0ID0gZnV0ZXhfd2FpdCgmdy0+ZnV0ZXhbaV0sIDEyMzQsIE5VTEwsCisJCQkJCSBmc2hhcmVkID8gMCA6IEZVVEVYX1BSSVZBVEVfRkxBRyk7CisJCQlpZiAoIXNpbGVudCAmJgorCQkJICAgICghcmV0IHx8IGVycm5vICE9IEVBR0FJTiB8fCBlcnJubyAhPSBFV09VTERCTE9DSykpCisJCQkJd2FybigiTm9uLWV4cGVjdGVkIGZ1dGV4IHJldHVybiBjYWxsIik7CisJCX0KKwl9ICB3aGlsZSAoIWRvbmUpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRvZ2dsZV9kb25lKGludCBzaWcgX19tYXliZV91bnVzZWQsCisJCQlzaWdpbmZvX3QgKmluZm8gX19tYXliZV91bnVzZWQsCisJCQl2b2lkICp1YyBfX21heWJlX3VudXNlZCkKK3sKKwkvKiBpbmZvcm0gYWxsIHRocmVhZHMgdGhhdCB3ZSdyZSBkb25lIGZvciB0aGUgZGF5ICovCisJZG9uZSA9IHRydWU7CisJZ2V0dGltZW9mZGF5KCZlbmQsIE5VTEwpOworCXRpbWVyc3ViKCZlbmQsICZzdGFydCwgJnJ1bnRpbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdW1tYXJ5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBhdmcgPSBhdmdfc3RhdHMoJnRocm91Z2hwdXRfc3RhdHMpOworCWRvdWJsZSBzdGRkZXYgPSBzdGRkZXZfc3RhdHMoJnRocm91Z2hwdXRfc3RhdHMpOworCisJcHJpbnRmKCIlc0F2ZXJhZ2VkICVsZCBvcGVyYXRpb25zL3NlYyAoKy0gJS4yZiUlKSwgdG90YWwgc2VjcyA9ICVkXG4iLAorCSAgICAgICAhc2lsZW50ID8gIlxuIiA6ICIiLCBhdmcsIHJlbF9zdGRkZXZfc3RhdHMoc3RkZGV2LCBhdmcpLAorCSAgICAgICAoaW50KSBydW50aW1lLnR2X3NlYyk7Cit9CisKK2ludCBiZW5jaF9mdXRleF9oYXNoKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJICAgICBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpCit7CisJaW50IHJldCA9IDA7CisJY3B1X3NldF90IGNwdTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKwl1bnNpZ25lZCBpbnQgaSwgbmNwdXM7CisJcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisJc3RydWN0IHdvcmtlciAqd29ya2VyID0gTlVMTDsKKworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGJlbmNoX2Z1dGV4X2hhc2hfdXNhZ2UsIDApOworCWlmIChhcmdjKSB7CisJCXVzYWdlX3dpdGhfb3B0aW9ucyhiZW5jaF9mdXRleF9oYXNoX3VzYWdlLCBvcHRpb25zKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCW5jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisKKwlzaWdmaWxsc2V0KCZhY3Quc2FfbWFzayk7CisJYWN0LnNhX3NpZ2FjdGlvbiA9IHRvZ2dsZV9kb25lOworCXNpZ2FjdGlvbihTSUdJTlQsICZhY3QsIE5VTEwpOworCisJaWYgKCFudGhyZWFkcykgLyogZGVmYXVsdCB0byB0aGUgbnVtYmVyIG9mIENQVXMgKi8KKwkJbnRocmVhZHMgPSBuY3B1czsKKworCXdvcmtlciA9IGNhbGxvYyhudGhyZWFkcywgc2l6ZW9mKCp3b3JrZXIpKTsKKwlpZiAoIXdvcmtlcikKKwkJZ290byBlcnJtZW07CisKKwlwcmludGYoIlJ1biBzdW1tYXJ5IFtQSUQgJWRdOiAlZCB0aHJlYWRzLCBlYWNoIG9wZXJhdGluZyBvbiAlZCBbJXNdIGZ1dGV4ZXMgZm9yICVkIHNlY3MuXG5cbiIsCisJICAgICAgIGdldHBpZCgpLCBudGhyZWFkcywgbmZ1dGV4ZXMsIGZzaGFyZWQgPyAic2hhcmVkIjoicHJpdmF0ZSIsIG5zZWNzKTsKKworCWluaXRfc3RhdHMoJnRocm91Z2hwdXRfc3RhdHMpOworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmdGhyZWFkX2xvY2ssIE5VTEwpOworCXB0aHJlYWRfY29uZF9pbml0KCZ0aHJlYWRfcGFyZW50LCBOVUxMKTsKKwlwdGhyZWFkX2NvbmRfaW5pdCgmdGhyZWFkX3dvcmtlciwgTlVMTCk7CisKKwl0aHJlYWRzX3N0YXJ0aW5nID0gbnRocmVhZHM7CisJcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKKwlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQl3b3JrZXJbaV0udGlkID0gaTsKKwkJd29ya2VyW2ldLmZ1dGV4ID0gY2FsbG9jKG5mdXRleGVzLCBzaXplb2YoKndvcmtlcltpXS5mdXRleCkpOworCQlpZiAoIXdvcmtlcltpXS5mdXRleCkKKwkJCWdvdG8gZXJybWVtOworCisJCUNQVV9aRVJPKCZjcHUpOworCQlDUFVfU0VUKGkgJSBuY3B1cywgJmNwdSk7CisKKwkJcmV0ID0gcHRocmVhZF9hdHRyX3NldGFmZmluaXR5X25wKCZ0aHJlYWRfYXR0ciwgc2l6ZW9mKGNwdV9zZXRfdCksICZjcHUpOworCQlpZiAocmV0KQorCQkJZXJyKEVYSVRfRkFJTFVSRSwgInB0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucCIpOworCisJCXJldCA9IHB0aHJlYWRfY3JlYXRlKCZ3b3JrZXJbaV0udGhyZWFkLCAmdGhyZWFkX2F0dHIsIHdvcmtlcmZuLAorCQkJCSAgICAgKHZvaWQgKikoc3RydWN0IHdvcmtlciAqKSAmd29ya2VyW2ldKTsKKwkJaWYgKHJldCkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2NyZWF0ZSIpOworCisJfQorCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRfYXR0cik7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl3aGlsZSAodGhyZWFkc19zdGFydGluZykKKwkJcHRocmVhZF9jb25kX3dhaXQoJnRocmVhZF9wYXJlbnQsICZ0aHJlYWRfbG9jayk7CisJcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmdGhyZWFkX3dvcmtlcik7CisJcHRocmVhZF9tdXRleF91bmxvY2soJnRocmVhZF9sb2NrKTsKKworCXNsZWVwKG5zZWNzKTsKKwl0b2dnbGVfZG9uZSgwLCBOVUxMLCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisJCXJldCA9IHB0aHJlYWRfam9pbih3b3JrZXJbaV0udGhyZWFkLCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2pvaW4iKTsKKwl9CisKKwkvKiBjbGVhbnVwICYgcmVwb3J0IHJlc3VsdHMgKi8KKwlwdGhyZWFkX2NvbmRfZGVzdHJveSgmdGhyZWFkX3BhcmVudCk7CisJcHRocmVhZF9jb25kX2Rlc3Ryb3koJnRocmVhZF93b3JrZXIpOworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdGhyZWFkX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB0ID0gd29ya2VyW2ldLm9wcy9ydW50aW1lLnR2X3NlYzsKKwkJdXBkYXRlX3N0YXRzKCZ0aHJvdWdocHV0X3N0YXRzLCB0KTsKKwkJaWYgKCFzaWxlbnQpIHsKKwkJCWlmIChuZnV0ZXhlcyA9PSAxKQorCQkJCXByaW50ZigiW3RocmVhZCAlMmRdIGZ1dGV4OiAlcCBbICVsZCBvcHMvc2VjIF1cbiIsCisJCQkJICAgICAgIHdvcmtlcltpXS50aWQsICZ3b3JrZXJbaV0uZnV0ZXhbMF0sIHQpOworCQkJZWxzZQorCQkJCXByaW50ZigiW3RocmVhZCAlMmRdIGZ1dGV4ZXM6ICVwIC4uLiAlcCBbICVsZCBvcHMvc2VjIF1cbiIsCisJCQkJICAgICAgIHdvcmtlcltpXS50aWQsICZ3b3JrZXJbaV0uZnV0ZXhbMF0sCisJCQkJICAgICAgICZ3b3JrZXJbaV0uZnV0ZXhbbmZ1dGV4ZXMtMV0sIHQpOworCQl9CisKKwkJZnJlZSh3b3JrZXJbaV0uZnV0ZXgpOworCX0KKworCXByaW50X3N1bW1hcnkoKTsKKworCWZyZWUod29ya2VyKTsKKwlyZXR1cm4gcmV0OworZXJybWVtOgorCWVycihFWElUX0ZBSUxVUkUsICJjYWxsb2MiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtcmVxdWV1ZS5jIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC1yZXF1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjU1ODcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXJlcXVldWUuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAgRGF2aWRsb2hyIEJ1ZXNvIDxkYXZpZGxvaHJAaHAuY29tPgorICoKKyAqIGZ1dGV4LXJlcXVldWU6IEJsb2NrIGEgYnVuY2ggb2YgdGhyZWFkcyBvbiBmdXRleDEgYW5kIHJlcXVldWUgdGhlbQorICogICAgICAgICAgICAgICAgb24gZnV0ZXgyLCBOIGF0IGEgdGltZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB0byBtZWFzdXJlIHRoZSBsYXRlbmN5IG9mIG50aHJlYWQKKyAqIHJlcXVldWVzIHdpdGhvdXQgd2FraW5nIHVwIGFueSB0YXNrcyAtLSB0aHVzIG1pbWlja2luZyBhIHJlZ3VsYXIgZnV0ZXhfd2FpdC4KKyAqLworCisjaW5jbHVkZSAiLi4vcGVyZi5oIgorI2luY2x1ZGUgIi4uL3V0aWwvdXRpbC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvc3RhdC5oIgorI2luY2x1ZGUgIi4uL3V0aWwvcGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgIi4uL3V0aWwvaGVhZGVyLmgiCisjaW5jbHVkZSAiYmVuY2guaCIKKyNpbmNsdWRlICJmdXRleC5oIgorCisjaW5jbHVkZSA8ZXJyLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3N0YXRpYyB1X2ludDMyX3QgZnV0ZXgxID0gMCwgZnV0ZXgyID0gMDsKKworLyoKKyAqIEhvdyBtYW55IHRhc2tzIHRvIHJlcXVldWUgYXQgYSB0aW1lLgorICogRGVmYXVsdCB0byAxIGluIG9yZGVyIHRvIG1ha2UgdGhlIGtlcm5lbCB3b3JrIG1vcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnJlcXVldWUgPSAxOworCisvKgorICogVGhlcmUgY2FuIGJlIHNpZ25pZmljYW50IHZhcmlhbmNlIGZyb20gcnVuIHRvIHJ1biwKKyAqIHRoZSBtb3JlIHJlcGVhdHMsIHRoZSBtb3JlIGV4YWN0IHRoZSBvdmVyYWxsIGF2ZyBhbmQKKyAqIHRoZSBiZXR0ZXIgaWRlYSBvZiB0aGUgZnV0ZXggbGF0ZW5jeS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZXBlYXQgPSAxMDsKKworc3RhdGljIHB0aHJlYWRfdCAqd29ya2VyOworc3RhdGljIGJvb2wgZG9uZSA9IDAsIHNpbGVudCA9IDA7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IHRocmVhZF9sb2NrOworc3RhdGljIHB0aHJlYWRfY29uZF90IHRocmVhZF9wYXJlbnQsIHRocmVhZF93b3JrZXI7CitzdGF0aWMgc3RydWN0IHN0YXRzIHJlcXVldWV0aW1lX3N0YXRzLCByZXF1ZXVlZF9zdGF0czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmNwdXMsIHRocmVhZHNfc3RhcnRpbmcsIG50aHJlYWRzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCU9QVF9VSU5URUdFUigndCcsICJ0aHJlYWRzIiwgICZudGhyZWFkcywgIlNwZWNpZnkgYW1vdW50IG9mIHRocmVhZHMiKSwKKwlPUFRfVUlOVEVHRVIoJ3EnLCAibnJlcXVldWUiLCAmbnJlcXVldWUsICJTcGVjaWZ5IGFtb3VudCBvZiB0aHJlYWRzIHRvIHJlcXVldWUgYXQgb25jZSIpLAorCU9QVF9VSU5URUdFUigncicsICJyZXBlYXQiLCAgICZyZXBlYXQsICAgIlNwZWNpZnkgYW1vdW50IG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgcnVuIiksCisJT1BUX0JPT0xFQU4oICdzJywgInNpbGVudCIsICAgJnNpbGVudCwgICAiU2lsZW50IG1vZGU6IGRvIG5vdCBkaXNwbGF5IGRhdGEvZGV0YWlscyIpLAorCU9QVF9FTkQoKQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiZW5jaF9mdXRleF9yZXF1ZXVlX3VzYWdlW10gPSB7CisJInBlcmYgYmVuY2ggZnV0ZXggcmVxdWV1ZSA8b3B0aW9ucz4iLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3N1bW1hcnkodm9pZCkKK3sKKwlkb3VibGUgcmVxdWV1ZXRpbWVfYXZnID0gYXZnX3N0YXRzKCZyZXF1ZXVldGltZV9zdGF0cyk7CisJZG91YmxlIHJlcXVldWV0aW1lX3N0ZGRldiA9IHN0ZGRldl9zdGF0cygmcmVxdWV1ZXRpbWVfc3RhdHMpOworCXVuc2lnbmVkIGludCByZXF1ZXVlZF9hdmcgPSBhdmdfc3RhdHMoJnJlcXVldWVkX3N0YXRzKTsKKworCXByaW50ZigiUmVxdWV1ZWQgJWQgb2YgJWQgdGhyZWFkcyBpbiAlLjRmIG1zICgrLSUuMmYlJSlcbiIsCisJICAgICAgIHJlcXVldWVkX2F2ZywKKwkgICAgICAgbnRocmVhZHMsCisJICAgICAgIHJlcXVldWV0aW1lX2F2Zy8xZTMsCisJICAgICAgIHJlbF9zdGRkZXZfc3RhdHMocmVxdWV1ZXRpbWVfc3RkZGV2LCByZXF1ZXVldGltZV9hdmcpKTsKK30KKworc3RhdGljIHZvaWQgKndvcmtlcmZuKHZvaWQgKmFyZyBfX21heWJlX3VudXNlZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl0aHJlYWRzX3N0YXJ0aW5nLS07CisJaWYgKCF0aHJlYWRzX3N0YXJ0aW5nKQorCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3dvcmtlciwgJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJZnV0ZXhfd2FpdCgmZnV0ZXgxLCAwLCBOVUxMLCBGVVRFWF9QUklWQVRFX0ZMQUcpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBibG9ja190aHJlYWRzKHB0aHJlYWRfdCAqdywKKwkJCSAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHIpCit7CisJY3B1X3NldF90IGNwdTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXRocmVhZHNfc3RhcnRpbmcgPSBudGhyZWFkczsKKworCS8qIGNyZWF0ZSBhbmQgYmxvY2sgYWxsIHRocmVhZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQlDUFVfWkVSTygmY3B1KTsKKwkJQ1BVX1NFVChpICUgbmNwdXMsICZjcHUpOworCisJCWlmIChwdGhyZWFkX2F0dHJfc2V0YWZmaW5pdHlfbnAoJnRocmVhZF9hdHRyLCBzaXplb2YoY3B1X3NldF90KSwgJmNwdSkpCisJCQllcnIoRVhJVF9GQUlMVVJFLCAicHRocmVhZF9hdHRyX3NldGFmZmluaXR5X25wIik7CisKKwkJaWYgKHB0aHJlYWRfY3JlYXRlKCZ3W2ldLCAmdGhyZWFkX2F0dHIsIHdvcmtlcmZuLCBOVUxMKSkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2NyZWF0ZSIpOworCX0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX2RvbmUoaW50IHNpZyBfX21heWJlX3VudXNlZCwKKwkJCXNpZ2luZm9fdCAqaW5mbyBfX21heWJlX3VudXNlZCwKKwkJCXZvaWQgKnVjIF9fbWF5YmVfdW51c2VkKQoreworCWRvbmUgPSB0cnVlOworfQorCitpbnQgYmVuY2hfZnV0ZXhfcmVxdWV1ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQljb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisJcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBiZW5jaF9mdXRleF9yZXF1ZXVlX3VzYWdlLCAwKTsKKwlpZiAoYXJnYykKKwkJZ290byBlcnI7CisKKwluY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworCisJc2lnZmlsbHNldCgmYWN0LnNhX21hc2spOworCWFjdC5zYV9zaWdhY3Rpb24gPSB0b2dnbGVfZG9uZTsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmYWN0LCBOVUxMKTsKKworCWlmICghbnRocmVhZHMpCisJCW50aHJlYWRzID0gbmNwdXM7CisKKwl3b3JrZXIgPSBjYWxsb2MobnRocmVhZHMsIHNpemVvZigqd29ya2VyKSk7CisJaWYgKCF3b3JrZXIpCisJCWVycihFWElUX0ZBSUxVUkUsICJjYWxsb2MiKTsKKworCXByaW50ZigiUnVuIHN1bW1hcnkgW1BJRCAlZF06IFJlcXVldWluZyAlZCB0aHJlYWRzIChmcm9tICVwIHRvICVwKSwgIgorCSAgICAgICAiJWQgYXQgYSB0aW1lLlxuXG4iLAorCSAgICAgICBnZXRwaWQoKSwgbnRocmVhZHMsICZmdXRleDEsICZmdXRleDIsIG5yZXF1ZXVlKTsKKworCWluaXRfc3RhdHMoJnJlcXVldWVkX3N0YXRzKTsKKwlpbml0X3N0YXRzKCZyZXF1ZXVldGltZV9zdGF0cyk7CisJcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJnRocmVhZF9sb2NrLCBOVUxMKTsKKwlwdGhyZWFkX2NvbmRfaW5pdCgmdGhyZWFkX3BhcmVudCwgTlVMTCk7CisJcHRocmVhZF9jb25kX2luaXQoJnRocmVhZF93b3JrZXIsIE5VTEwpOworCisJZm9yIChqID0gMDsgaiA8IHJlcGVhdCAmJiAhZG9uZTsgaisrKSB7CisJCXVuc2lnbmVkIGludCBucmVxdWV1ZWQgPSAwOworCQlzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kLCBydW50aW1lOworCisJCS8qIGNyZWF0ZSwgbGF1bmNoICYgYmxvY2sgYWxsIHRocmVhZHMgKi8KKwkJYmxvY2tfdGhyZWFkcyh3b3JrZXIsIHRocmVhZF9hdHRyKTsKKworCQkvKiBtYWtlIHN1cmUgYWxsIHRocmVhZHMgYXJlIGFscmVhZHkgYmxvY2tlZCAqLworCQlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwkJd2hpbGUgKHRocmVhZHNfc3RhcnRpbmcpCisJCQlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3BhcmVudCwgJnRocmVhZF9sb2NrKTsKKwkJcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmdGhyZWFkX3dvcmtlcik7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfbG9jayk7CisKKwkJdXNsZWVwKDEwMDAwMCk7CisKKwkJLyogT2ssIGFsbCB0aHJlYWRzIGFyZSBwYXRpZW50bHkgYmxvY2tlZCwgc3RhcnQgcmVxdWV1ZWluZyAqLworCQlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKwkJZm9yIChucmVxdWV1ZWQgPSAwOyBucmVxdWV1ZWQgPCBudGhyZWFkczsgbnJlcXVldWVkICs9IG5yZXF1ZXVlKQorCQkJLyoKKwkJCSAqIERvIG5vdCB3YWtldXAgYW55IHRhc2tzIGJsb2NrZWQgb24gZnV0ZXgxLCBhbGxvd2luZworCQkJICogdXMgdG8gcmVhbGx5IG1lYXN1cmUgZnV0ZXhfd2FpdCBmdW5jdGlvbmFsaXR5LgorCQkJICovCisJCQlmdXRleF9jbXBfcmVxdWV1ZSgmZnV0ZXgxLCAwLCAmZnV0ZXgyLCAwLCBucmVxdWV1ZSwKKwkJCQkJICBGVVRFWF9QUklWQVRFX0ZMQUcpOworCQlnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7CisJCXRpbWVyc3ViKCZlbmQsICZzdGFydCwgJnJ1bnRpbWUpOworCisJCXVwZGF0ZV9zdGF0cygmcmVxdWV1ZWRfc3RhdHMsIG5yZXF1ZXVlZCk7CisJCXVwZGF0ZV9zdGF0cygmcmVxdWV1ZXRpbWVfc3RhdHMsIHJ1bnRpbWUudHZfdXNlYyk7CisKKwkJaWYgKCFzaWxlbnQpIHsKKwkJCXByaW50ZigiW1J1biAlZF06IFJlcXVldWVkICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtc1xuIiwKKwkJCSAgICAgICBqICsgMSwgbnJlcXVldWVkLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjLzFlMyk7CisJCX0KKworCQkvKiBldmVyeWJvZHkgc2hvdWxkIGJlIGJsb2NrZWQgb24gZnV0ZXgyLCB3YWtlJ2VtIHVwICovCisJCW5yZXF1ZXVlZCA9IGZ1dGV4X3dha2UoJmZ1dGV4MiwgbnRocmVhZHMsIEZVVEVYX1BSSVZBVEVfRkxBRyk7CisJCWlmIChudGhyZWFkcyAhPSBucmVxdWV1ZWQpCisJCQl3YXJueCgiY291bGRuJ3Qgd2FrZXVwIGFsbCB0YXNrcyAoJWQvJWQpIiwgbnJlcXVldWVkLCBudGhyZWFkcyk7CisKKwkJZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKwkJCXJldCA9IHB0aHJlYWRfam9pbih3b3JrZXJbaV0sIE5VTEwpOworCQkJaWYgKHJldCkKKwkJCQllcnIoRVhJVF9GQUlMVVJFLCAicHRocmVhZF9qb2luIik7CisJCX0KKworCX0KKworCS8qIGNsZWFudXAgJiByZXBvcnQgcmVzdWx0cyAqLworCXB0aHJlYWRfY29uZF9kZXN0cm95KCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfZGVzdHJveSgmdGhyZWFkX3dvcmtlcik7CisJcHRocmVhZF9tdXRleF9kZXN0cm95KCZ0aHJlYWRfbG9jayk7CisJcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRocmVhZF9hdHRyKTsKKworCXByaW50X3N1bW1hcnkoKTsKKworCWZyZWUod29ya2VyKTsKKwlyZXR1cm4gcmV0OworZXJyOgorCXVzYWdlX3dpdGhfb3B0aW9ucyhiZW5jaF9mdXRleF9yZXF1ZXVlX3VzYWdlLCBvcHRpb25zKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTYxNjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAgRGF2aWRsb2hyIEJ1ZXNvIDxkYXZpZGxvaHJAaHAuY29tPgorICoKKyAqIGZ1dGV4LXdha2U6IEJsb2NrIGEgYnVuY2ggb2YgdGhyZWFkcyBvbiBhIGZ1dGV4IGFuZCB3YWtlJ2VtIHVwLCBOIGF0IGEgdGltZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB0byBtZWFzdXJlIHRoZSBsYXRlbmN5IG9mIG50aHJlYWQgd2FrZXVwcworICogaW4gbm9uLWVycm9yIHNpdHVhdGlvbnM6ICBhbGwgd2FpdGVycyBhcmUgcXVldWVkIGFuZCBhbGwgd2FrZSBjYWxscyB3YWtldXAKKyAqIG9uZSBvciBtb3JlIHRhc2tzLCBhbmQgdGh1cyB0aGUgd2FpdHF1ZXVlIGlzIG5ldmVyIGVtcHR5LgorICovCisKKyNpbmNsdWRlICIuLi9wZXJmLmgiCisjaW5jbHVkZSAiLi4vdXRpbC91dGlsLmgiCisjaW5jbHVkZSAiLi4vdXRpbC9zdGF0LmgiCisjaW5jbHVkZSAiLi4vdXRpbC9wYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAiLi4vdXRpbC9oZWFkZXIuaCIKKyNpbmNsdWRlICJiZW5jaC5oIgorI2luY2x1ZGUgImZ1dGV4LmgiCisKKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLyogYWxsIHRocmVhZHMgd2lsbCBibG9jayBvbiB0aGUgc2FtZSBmdXRleCAqLworc3RhdGljIHVfaW50MzJfdCBmdXRleDEgPSAwOworCisvKgorICogSG93IG1hbnkgd2FrZXVwcyB0byBkbyBhdCBhIHRpbWUuCisgKiBEZWZhdWx0IHRvIDEgaW4gb3JkZXIgdG8gbWFrZSB0aGUga2VybmVsIHdvcmsgbW9yZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBud2FrZXMgPSAxOworCisvKgorICogVGhlcmUgY2FuIGJlIHNpZ25pZmljYW50IHZhcmlhbmNlIGZyb20gcnVuIHRvIHJ1biwKKyAqIHRoZSBtb3JlIHJlcGVhdHMsIHRoZSBtb3JlIGV4YWN0IHRoZSBvdmVyYWxsIGF2ZyBhbmQKKyAqIHRoZSBiZXR0ZXIgaWRlYSBvZiB0aGUgZnV0ZXggbGF0ZW5jeS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCByZXBlYXQgPSAxMDsKKworcHRocmVhZF90ICp3b3JrZXI7CitzdGF0aWMgYm9vbCBkb25lID0gMCwgc2lsZW50ID0gMDsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgdGhyZWFkX2xvY2s7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgdGhyZWFkX3BhcmVudCwgdGhyZWFkX3dvcmtlcjsKK3N0YXRpYyBzdHJ1Y3Qgc3RhdHMgd2FrZXRpbWVfc3RhdHMsIHdha2V1cF9zdGF0czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmNwdXMsIHRocmVhZHNfc3RhcnRpbmcsIG50aHJlYWRzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCU9QVF9VSU5URUdFUigndCcsICJ0aHJlYWRzIiwgJm50aHJlYWRzLCAiU3BlY2lmeSBhbW91bnQgb2YgdGhyZWFkcyIpLAorCU9QVF9VSU5URUdFUigndycsICJud2FrZXMiLCAgJm53YWtlcywgICAiU3BlY2lmeSBhbW91bnQgb2YgdGhyZWFkcyB0byB3YWtlIGF0IG9uY2UiKSwKKwlPUFRfVUlOVEVHRVIoJ3InLCAicmVwZWF0IiwgICZyZXBlYXQsICAgIlNwZWNpZnkgYW1vdW50IG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgcnVuIiksCisJT1BUX0JPT0xFQU4oICdzJywgInNpbGVudCIsICAmc2lsZW50LCAgICJTaWxlbnQgbW9kZTogZG8gbm90IGRpc3BsYXkgZGF0YS9kZXRhaWxzIiksCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJlbmNoX2Z1dGV4X3dha2VfdXNhZ2VbXSA9IHsKKwkicGVyZiBiZW5jaCBmdXRleCB3YWtlIDxvcHRpb25zPiIsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgKndvcmtlcmZuKHZvaWQgKmFyZyBfX21heWJlX3VudXNlZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9sb2NrKTsKKwl0aHJlYWRzX3N0YXJ0aW5nLS07CisJaWYgKCF0aHJlYWRzX3N0YXJ0aW5nKQorCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWRfcGFyZW50KTsKKwlwdGhyZWFkX2NvbmRfd2FpdCgmdGhyZWFkX3dvcmtlciwgJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJZnV0ZXhfd2FpdCgmZnV0ZXgxLCAwLCBOVUxMLCBGVVRFWF9QUklWQVRFX0ZMQUcpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdW1tYXJ5KHZvaWQpCit7CisJZG91YmxlIHdha2V0aW1lX2F2ZyA9IGF2Z19zdGF0cygmd2FrZXRpbWVfc3RhdHMpOworCWRvdWJsZSB3YWtldGltZV9zdGRkZXYgPSBzdGRkZXZfc3RhdHMoJndha2V0aW1lX3N0YXRzKTsKKwl1bnNpZ25lZCBpbnQgd2FrZXVwX2F2ZyA9IGF2Z19zdGF0cygmd2FrZXVwX3N0YXRzKTsKKworCXByaW50ZigiV29rZXVwICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtcyAoKy0lLjJmJSUpXG4iLAorCSAgICAgICB3YWtldXBfYXZnLAorCSAgICAgICBudGhyZWFkcywKKwkgICAgICAgd2FrZXRpbWVfYXZnLzFlMywKKwkgICAgICAgcmVsX3N0ZGRldl9zdGF0cyh3YWtldGltZV9zdGRkZXYsIHdha2V0aW1lX2F2ZykpOworfQorCitzdGF0aWMgdm9pZCBibG9ja190aHJlYWRzKHB0aHJlYWRfdCAqdywKKwkJCSAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHIpCit7CisJY3B1X3NldF90IGNwdTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXRocmVhZHNfc3RhcnRpbmcgPSBudGhyZWFkczsKKworCS8qIGNyZWF0ZSBhbmQgYmxvY2sgYWxsIHRocmVhZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQlDUFVfWkVSTygmY3B1KTsKKwkJQ1BVX1NFVChpICUgbmNwdXMsICZjcHUpOworCisJCWlmIChwdGhyZWFkX2F0dHJfc2V0YWZmaW5pdHlfbnAoJnRocmVhZF9hdHRyLCBzaXplb2YoY3B1X3NldF90KSwgJmNwdSkpCisJCQllcnIoRVhJVF9GQUlMVVJFLCAicHRocmVhZF9hdHRyX3NldGFmZmluaXR5X25wIik7CisKKwkJaWYgKHB0aHJlYWRfY3JlYXRlKCZ3W2ldLCAmdGhyZWFkX2F0dHIsIHdvcmtlcmZuLCBOVUxMKSkKKwkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2NyZWF0ZSIpOworCX0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX2RvbmUoaW50IHNpZyBfX21heWJlX3VudXNlZCwKKwkJCXNpZ2luZm9fdCAqaW5mbyBfX21heWJlX3VudXNlZCwKKwkJCXZvaWQgKnVjIF9fbWF5YmVfdW51c2VkKQoreworCWRvbmUgPSB0cnVlOworfQorCitpbnQgYmVuY2hfZnV0ZXhfd2FrZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCSAgICAgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBpLCBqOworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCXB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgYmVuY2hfZnV0ZXhfd2FrZV91c2FnZSwgMCk7CisJaWYgKGFyZ2MpIHsKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKGJlbmNoX2Z1dGV4X3dha2VfdXNhZ2UsIG9wdGlvbnMpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJbmNwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKworCXNpZ2ZpbGxzZXQoJmFjdC5zYV9tYXNrKTsKKwlhY3Quc2Ffc2lnYWN0aW9uID0gdG9nZ2xlX2RvbmU7CisJc2lnYWN0aW9uKFNJR0lOVCwgJmFjdCwgTlVMTCk7CisKKwlpZiAoIW50aHJlYWRzKQorCQludGhyZWFkcyA9IG5jcHVzOworCisJd29ya2VyID0gY2FsbG9jKG50aHJlYWRzLCBzaXplb2YoKndvcmtlcikpOworCWlmICghd29ya2VyKQorCQllcnIoRVhJVF9GQUlMVVJFLCAiY2FsbG9jIik7CisKKwlwcmludGYoIlJ1biBzdW1tYXJ5IFtQSUQgJWRdOiBibG9ja2luZyBvbiAlZCB0aHJlYWRzIChhdCBmdXRleCAlcCksICIKKwkgICAgICAgIndha2luZyB1cCAlZCBhdCBhIHRpbWUuXG5cbiIsCisJICAgICAgIGdldHBpZCgpLCBudGhyZWFkcywgJmZ1dGV4MSwgbndha2VzKTsKKworCWluaXRfc3RhdHMoJndha2V1cF9zdGF0cyk7CisJaW5pdF9zdGF0cygmd2FrZXRpbWVfc3RhdHMpOworCXB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cik7CisJcHRocmVhZF9tdXRleF9pbml0KCZ0aHJlYWRfbG9jaywgTlVMTCk7CisJcHRocmVhZF9jb25kX2luaXQoJnRocmVhZF9wYXJlbnQsIE5VTEwpOworCXB0aHJlYWRfY29uZF9pbml0KCZ0aHJlYWRfd29ya2VyLCBOVUxMKTsKKworCWZvciAoaiA9IDA7IGogPCByZXBlYXQgJiYgIWRvbmU7IGorKykgeworCQl1bnNpZ25lZCBpbnQgbndva2VuID0gMDsKKwkJc3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZCwgcnVudGltZTsKKworCQkvKiBjcmVhdGUsIGxhdW5jaCAmIGJsb2NrIGFsbCB0aHJlYWRzICovCisJCWJsb2NrX3RocmVhZHMod29ya2VyLCB0aHJlYWRfYXR0cik7CisKKwkJLyogbWFrZSBzdXJlIGFsbCB0aHJlYWRzIGFyZSBhbHJlYWR5IGJsb2NrZWQgKi8KKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ0aHJlYWRfbG9jayk7CisJCXdoaWxlICh0aHJlYWRzX3N0YXJ0aW5nKQorCQkJcHRocmVhZF9jb25kX3dhaXQoJnRocmVhZF9wYXJlbnQsICZ0aHJlYWRfbG9jayk7CisJCXB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnRocmVhZF93b3JrZXIpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2xvY2spOworCisJCXVzbGVlcCgxMDAwMDApOworCisJCS8qIE9rLCBhbGwgdGhyZWFkcyBhcmUgcGF0aWVudGx5IGJsb2NrZWQsIHN0YXJ0IHdha2luZyBmb2xrcyB1cCAqLworCQlnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKwkJd2hpbGUgKG53b2tlbiAhPSBudGhyZWFkcykKKwkJCW53b2tlbiArPSBmdXRleF93YWtlKCZmdXRleDEsIG53YWtlcywgRlVURVhfUFJJVkFURV9GTEFHKTsKKwkJZ2V0dGltZW9mZGF5KCZlbmQsIE5VTEwpOworCQl0aW1lcnN1YigmZW5kLCAmc3RhcnQsICZydW50aW1lKTsKKworCQl1cGRhdGVfc3RhdHMoJndha2V1cF9zdGF0cywgbndva2VuKTsKKwkJdXBkYXRlX3N0YXRzKCZ3YWtldGltZV9zdGF0cywgcnVudGltZS50dl91c2VjKTsKKworCQlpZiAoIXNpbGVudCkgeworCQkJcHJpbnRmKCJbUnVuICVkXTogV29rZXVwICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtc1xuIiwKKwkJCSAgICAgICBqICsgMSwgbndva2VuLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjLzFlMyk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQkJcmV0ID0gcHRocmVhZF9qb2luKHdvcmtlcltpXSwgTlVMTCk7CisJCQlpZiAocmV0KQorCQkJCWVycihFWElUX0ZBSUxVUkUsICJwdGhyZWFkX2pvaW4iKTsKKwkJfQorCisJfQorCisJLyogY2xlYW51cCAmIHJlcG9ydCByZXN1bHRzICovCisJcHRocmVhZF9jb25kX2Rlc3Ryb3koJnRocmVhZF9wYXJlbnQpOworCXB0aHJlYWRfY29uZF9kZXN0cm95KCZ0aHJlYWRfd29ya2VyKTsKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnRocmVhZF9sb2NrKTsKKwlwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkX2F0dHIpOworCisJcHJpbnRfc3VtbWFyeSgpOworCisJZnJlZSh3b3JrZXIpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LmggYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmMjg0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXguaApAQCAtMCwwICsxLDcxIEBACisvKgorICogR2xpYmMgaW5kZXBlbmRlbnQgZnV0ZXggbGlicmFyeSBmb3IgdGVzdGluZyBrZXJuZWwgZnVuY3Rpb25hbGl0eS4KKyAqIFNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIERhcnJlbiBIYXJ0IDxkdmhsdGNAdXMuaWJtLmNvbT4KKyAqICAgIGh0dHA6Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQvZHZoYXJ0L2Z1dGV4dGVzdC5naXQvCisgKi8KKworI2lmbmRlZiBfRlVURVhfSAorI2RlZmluZSBfRlVURVhfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorCisvKioKKyAqIGZ1dGV4KCkgLSBTWVNfZnV0ZXggc3lzY2FsbCB3cmFwcGVyCisgKiBAdWFkZHI6CWFkZHJlc3Mgb2YgZmlyc3QgZnV0ZXgKKyAqIEBvcDoJCWZ1dGV4IG9wIGNvZGUKKyAqIEB2YWw6CXR5cGljYWxseSBleHBlY3RlZCB2YWx1ZSBvZiB1YWRkciwgYnV0IHZhcmllcyBieSBvcAorICogQHRpbWVvdXQ6CXR5cGljYWxseSBhbiBhYnNvbHV0ZSBzdHJ1Y3QgdGltZXNwZWMgKGV4Y2VwdCB3aGVyZSBub3RlZAorICoJCW90aGVyd2lzZSkuIE92ZXJsb2FkZWQgYnkgc29tZSBvcHMKKyAqIEB1YWRkcjI6CWFkZHJlc3Mgb2Ygc2Vjb25kIGZ1dGV4IGZvciBzb21lIG9wc1wKKyAqIEB2YWwzOgl2YXJpZXMgYnkgb3AKKyAqIEBvcGZsYWdzOglmbGFncyB0byBiZSBiaXR3aXNlIE9SJ2Qgd2l0aCBvcCwgc3VjaCBhcyBGVVRFWF9QUklWQVRFX0ZMQUcKKyAqCisgKiBmdXRleCgpIGlzIHVzZWQgYnkgYWxsIHRoZSBmb2xsb3dpbmcgZnV0ZXggb3Agd3JhcHBlcnMuIEl0IGNhbiBhbHNvIGJlCisgKiB1c2VkIGZvciBtaXN1c2UgYW5kIGFidXNlIHRlc3RpbmcuIEdlbmVyYWxseSwgdGhlIHNwZWNpZmljIG9wIHdyYXBwZXJzCisgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiBJdCBpcyBhIG1hY3JvIGluc3RlYWQgb2YgYW4gc3RhdGljIGlubGluZSBmdW5jdGlvbiBhcworICogc29tZSBvZiB0aGUgdHlwZXMgb3ZlciBvdmVybG9hZGVkICh0aW1lb3V0IGlzIHVzZWQgZm9yIG5yX3JlcXVldWUgZm9yCisgKiBleGFtcGxlKS4KKyAqCisgKiBUaGVzZSBhcmd1bWVudCBkZXNjcmlwdGlvbnMgYXJlIHRoZSBkZWZhdWx0cyBmb3IgYWxsCisgKiBsaWtlLW5hbWVkIGFyZ3VtZW50cyBpbiB0aGUgZm9sbG93aW5nIHdyYXBwZXJzIGV4Y2VwdCB3aGVyZSBub3RlZCBiZWxvdy4KKyAqLworI2RlZmluZSBmdXRleCh1YWRkciwgb3AsIHZhbCwgdGltZW91dCwgdWFkZHIyLCB2YWwzLCBvcGZsYWdzKSBcCisJc3lzY2FsbChTWVNfZnV0ZXgsIHVhZGRyLCBvcCB8IG9wZmxhZ3MsIHZhbCwgdGltZW91dCwgdWFkZHIyLCB2YWwzKQorCisvKioKKyAqIGZ1dGV4X3dhaXQoKSAtIGJsb2NrIG9uIHVhZGRyIHdpdGggb3B0aW9uYWwgdGltZW91dAorICogQHRpbWVvdXQ6CXJlbGF0aXZlIHRpbWVvdXQKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X3dhaXQodV9pbnQzMl90ICp1YWRkciwgdV9pbnQzMl90IHZhbCwgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0LCBpbnQgb3BmbGFncykKK3sKKwlyZXR1cm4gZnV0ZXgodWFkZHIsIEZVVEVYX1dBSVQsIHZhbCwgdGltZW91dCwgTlVMTCwgMCwgb3BmbGFncyk7Cit9CisKKy8qKgorICogZnV0ZXhfd2FrZSgpIC0gd2FrZSBvbmUgb3IgbW9yZSB0YXNrcyBibG9ja2VkIG9uIHVhZGRyCisgKiBAbnJfd2FrZToJd2FrZSB1cCB0byB0aGlzIG1hbnkgdGFza3MKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X3dha2UodV9pbnQzMl90ICp1YWRkciwgaW50IG5yX3dha2UsIGludCBvcGZsYWdzKQoreworCXJldHVybiBmdXRleCh1YWRkciwgRlVURVhfV0FLRSwgbnJfd2FrZSwgTlVMTCwgTlVMTCwgMCwgb3BmbGFncyk7Cit9CisKKy8qKgorKiBmdXRleF9jbXBfcmVxdWV1ZSgpIC0gcmVxdWV1ZSB0YXNrcyBmcm9tIHVhZGRyIHRvIHVhZGRyMgorKiBAbnJfd2FrZTogICAgICAgIHdha2UgdXAgdG8gdGhpcyBtYW55IHRhc2tzCisqIEBucl9yZXF1ZXVlOiAgICAgICAgcmVxdWV1ZSB1cCB0byB0aGlzIG1hbnkgdGFza3MKKyovCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfY21wX3JlcXVldWUodV9pbnQzMl90ICp1YWRkciwgdV9pbnQzMl90IHZhbCwgdV9pbnQzMl90ICp1YWRkcjIsIGludCBucl93YWtlLAorCQkgaW50IG5yX3JlcXVldWUsIGludCBvcGZsYWdzKQoreworCXJldHVybiBmdXRleCh1YWRkciwgRlVURVhfQ01QX1JFUVVFVUUsIG5yX3dha2UsIG5yX3JlcXVldWUsIHVhZGRyMiwKKwkJIHZhbCwgb3BmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBfRlVURVhfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9udW1hLmMgYi90b29scy9wZXJmL2JlbmNoL251bWEuYwppbmRleCBkNGM4M2M2Li45N2Q4NmQ4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL251bWEuYworKysgYi90b29scy9wZXJmL2JlbmNoL251bWEuYwpAQCAtMTU5Myw2ICsxNTkzLDcgQEAKIAlwLT5kYXRhX3JhbmRfd2FsawkJPSB0cnVlOwogCXAtPm5yX2xvb3BzCQkJPSAtMTsKIAlwLT5pbml0X3JhbmRvbQkJCT0gdHJ1ZTsKKwlwLT5ydW5fYWxsCQkJPSBhcmdjID09IDE7CiB9CiAKIHN0YXRpYyBpbnQgcnVuX2JlbmNoX251bWEoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmFyZ3YpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYmVuY2guYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1iZW5jaC5jCmluZGV4IGU0N2Y5MGMuLjFlNmU3NzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1iZW5jaC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1iZW5jaC5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiAgc2NoZWQgLi4uIHNjaGVkdWxlciBhbmQgSVBDIHBlcmZvcm1hbmNlCiAgKiAgbWVtICAgLi4uIG1lbW9yeSBhY2Nlc3MgcGVyZm9ybWFuY2UKICAqICBudW1hICAuLi4gTlVNQSBzY2hlZHVsaW5nIGFuZCBNTSBwZXJmb3JtYW5jZQorICogIGZ1dGV4IC4uLiBGdXRleCBwZXJmb3JtYW5jZQogICovCiAjaW5jbHVkZSAicGVyZi5oIgogI2luY2x1ZGUgInV0aWwvdXRpbC5oIgpAQCAtNTQsNiArNTUsMTQgQEAKIAl7IE5VTEwsCQlOVUxMLAkJCQkJCU5VTEwJCQl9CiB9OwogCitzdGF0aWMgc3RydWN0IGJlbmNoIGZ1dGV4X2JlbmNobWFya3NbXSA9IHsKKwl7ICJoYXNoIiwJIkJlbmNobWFyayBmb3IgZnV0ZXggaGFzaCB0YWJsZSIsICAgICAgICAgICAgICAgYmVuY2hfZnV0ZXhfaGFzaAl9LAorCXsgIndha2UiLAkiQmVuY2htYXJrIGZvciBmdXRleCB3YWtlIGNhbGxzIiwgICAgICAgICAgICAgICBiZW5jaF9mdXRleF93YWtlCX0sCisJeyAicmVxdWV1ZSIsCSJCZW5jaG1hcmsgZm9yIGZ1dGV4IHJlcXVldWUgY2FsbHMiLCAgICAgICAgICAgIGJlbmNoX2Z1dGV4X3JlcXVldWUJfSwKKwl7ICJhbGwiLAkiVGVzdCBhbGwgZnV0ZXggYmVuY2htYXJrcyIsCQkJTlVMTAkJCX0sCisJeyBOVUxMLAkJTlVMTCwJCQkJCQlOVUxMCQkJfQorfTsKKwogc3RydWN0IGNvbGxlY3Rpb24gewogCWNvbnN0IGNoYXIJKm5hbWU7CiAJY29uc3QgY2hhcgkqc3VtbWFyeTsKQEAgLTYxLDExICs3MCwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjb2xsZWN0aW9uIGNvbGxlY3Rpb25zW10gPSB7Ci0JeyAic2NoZWQiLAkiU2NoZWR1bGVyIGFuZCBJUEMgYmVuY2htYXJrcyIsCQlzY2hlZF9iZW5jaG1hcmtzCX0sCisJeyAic2NoZWQiLAkiU2NoZWR1bGVyIGFuZCBJUEMgYmVuY2htYXJrcyIsCQkJc2NoZWRfYmVuY2htYXJrcwl9LAogCXsgIm1lbSIsCSJNZW1vcnkgYWNjZXNzIGJlbmNobWFya3MiLAkJCW1lbV9iZW5jaG1hcmtzCQl9LAogI2lmZGVmIEhBVkVfTElCTlVNQV9TVVBQT1JUCiAJeyAibnVtYSIsCSJOVU1BIHNjaGVkdWxpbmcgYW5kIE1NIGJlbmNobWFya3MiLAkJbnVtYV9iZW5jaG1hcmtzCQl9LAogI2VuZGlmCisJeyJmdXRleCIsICAgICAgICJGdXRleCBzdHJlc3NpbmcgYmVuY2htYXJrcyIsICAgICAgICAgICAgICAgICAgIGZ1dGV4X2JlbmNobWFya3MgICAgICAgIH0sCiAJeyAiYWxsIiwJIkFsbCBiZW5jaG1hcmtzIiwJCQkJTlVMTAkJCX0sCiAJeyBOVUxMLAkJTlVMTCwJCQkJCQlOVUxMCQkJfQogfTsKQEAgLTc2LDcgKzg2LDcgQEAKIAogLyogSXRlcmF0ZSBvdmVyIGFsbCBiZW5jaG1hcmtzIHdpdGhpbiBhIGNvbGxlY3Rpb246ICovCiAjZGVmaW5lIGZvcl9lYWNoX2JlbmNoKGNvbGwsIGJlbmNoKSBcCi0JZm9yIChiZW5jaCA9IGNvbGwtPmJlbmNobWFya3M7IGJlbmNoLT5uYW1lOyBiZW5jaCsrKQorCWZvciAoYmVuY2ggPSBjb2xsLT5iZW5jaG1hcmtzOyBiZW5jaCAmJiBiZW5jaC0+bmFtZTsgYmVuY2grKykKIAogc3RhdGljIHZvaWQgZHVtcF9iZW5jaG1hcmtzKHN0cnVjdCBjb2xsZWN0aW9uICpjb2xsKQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKaW5kZXggYTc3ZTMxMi4uMjA0ZmZmZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCkBAIC05NTIsOCArOTUyLDggQEAKIAkJCQkgZGZtdC0+aGVhZGVyX3dpZHRoLCBidWYpOwogfQogCi1zdGF0aWMgaW50IGhwcF9faGVhZGVyKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwKLQkJICAgICAgIHN0cnVjdCBwZXJmX2hwcCAqaHBwKQorc3RhdGljIGludCBocHBfX2hlYWRlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkgICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fbWF5YmVfdW51c2VkKQogewogCXN0cnVjdCBkaWZmX2hwcF9mbXQgKmRmbXQgPQogCQljb250YWluZXJfb2YoZm10LCBzdHJ1Y3QgZGlmZl9ocHBfZm10LCBmbXQpOwpAQCAtOTYzLDcgKzk2Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQgaHBwX193aWR0aChzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsCi0JCSAgICAgIHN0cnVjdCBwZXJmX2hwcCAqaHBwIF9fbWF5YmVfdW51c2VkKQorCQkgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCBfX21heWJlX3VudXNlZCwKKwkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fbWF5YmVfdW51c2VkKQogewogCXN0cnVjdCBkaWZmX2hwcF9mbXQgKmRmbXQgPQogCQljb250YWluZXJfb2YoZm10LCBzdHJ1Y3QgZGlmZl9ocHBfZm10LCBmbXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jCmluZGV4IGIzNDY2MDEuLjNhNzM4NzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMKQEAgLTMxMiw3ICszMTIsNiBAQAogCXNhbXBsZV9zdy5wZXJpb2QgPSBzYW1wbGUtPnBlcmlvZDsKIAlzYW1wbGVfc3cudGltZQkgPSBzYW1wbGUtPnRpbWU7CiAJcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUoZXZlbnRfc3csIGV2c2VsLT5hdHRyLnNhbXBsZV90eXBlLAotCQkJCSAgICAgIGV2c2VsLT5hdHRyLnNhbXBsZV9yZWdzX3VzZXIsCiAJCQkJICAgICAgZXZzZWwtPmF0dHIucmVhZF9mb3JtYXQsICZzYW1wbGVfc3csCiAJCQkJICAgICAgZmFsc2UpOwogCWJ1aWxkX2lkX19tYXJrX2Rzb19oaXQodG9vbCwgZXZlbnRfc3csICZzYW1wbGVfc3csIGV2c2VsLCBtYWNoaW5lKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYwppbmRleCBhNzM1MDUxLi4yMWMxNjRiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jCkBAIC0xNjkxLDE3ICsxNjkxLDE1IEBACiAJCU9QVF9FTkQoKQogCX07CiAKLQotCWNvbnN0IGNoYXIgKiBjb25zdCBrdm1fdXNhZ2VbXSA9IHsKLQkJInBlcmYga3ZtIFs8b3B0aW9ucz5dIHt0b3B8cmVjb3JkfHJlcG9ydHxkaWZmfGJ1aWxkaWQtbGlzdHxzdGF0fSIsCi0JCU5VTEwKLQl9OworCWNvbnN0IGNoYXIgKmNvbnN0IGt2bV9zdWJjb21tYW5kc1tdID0geyAidG9wIiwgInJlY29yZCIsICJyZXBvcnQiLCAiZGlmZiIsCisJCQkJCQkiYnVpbGRpZC1saXN0IiwgInN0YXQiLCBOVUxMIH07CisJY29uc3QgY2hhciAqa3ZtX3VzYWdlW10gPSB7IE5VTEwsIE5VTEwgfTsKIAogCXBlcmZfaG9zdCAgPSAwOwogCXBlcmZfZ3Vlc3QgPSAxOwogCi0JYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwga3ZtX29wdGlvbnMsIGt2bV91c2FnZSwKLQkJCVBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOworCWFyZ2MgPSBwYXJzZV9vcHRpb25zX3N1YmNvbW1hbmQoYXJnYywgYXJndiwga3ZtX29wdGlvbnMsIGt2bV9zdWJjb21tYW5kcywga3ZtX3VzYWdlLAorCQkJCQlQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKIAlpZiAoIWFyZ2MpCiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhrdm1fdXNhZ2UsIGt2bV9vcHRpb25zKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwppbmRleCA3ODk0ODg4Li5jZGNkNGViIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwpAQCAtMjY4LDkgKzI2OCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfcGFyYW1zKHZvaWQpCitzdGF0aWMgaW50IGluaXRfcGFyYW1zKHZvaWQpCiB7Ci0JbGluZV9yYW5nZV9faW5pdCgmcGFyYW1zLmxpbmVfcmFuZ2UpOworCXJldHVybiBsaW5lX3JhbmdlX19pbml0KCZwYXJhbXMubGluZV9yYW5nZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFudXBfcGFyYW1zKHZvaWQpCkBAIC01MTUsOSArNTE1LDExIEBACiB7CiAJaW50IHJldDsKIAotCWluaXRfcGFyYW1zKCk7Ci0JcmV0ID0gX19jbWRfcHJvYmUoYXJnYywgYXJndiwgcHJlZml4KTsKLQljbGVhbnVwX3BhcmFtcygpOworCXJldCA9IGluaXRfcGFyYW1zKCk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gX19jbWRfcHJvYmUoYXJnYywgYXJndiwgcHJlZml4KTsKKwkJY2xlYW51cF9wYXJhbXMoKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCmluZGV4IGFmNDc1MzEuLmViNTI0ZjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTY0OSw3ICs2NDksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAogc3RhdGljIGludCBnZXRfc3RhY2tfc2l6ZShjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgKl9zaXplKQogewogCWNoYXIgKmVuZHB0cjsKQEAgLTY3NSw3ICs2NzUsNyBAQAogCSAgICAgICBtYXhfc2l6ZSwgc3RyKTsKIAlyZXR1cm4gLTE7CiB9Ci0jZW5kaWYgLyogSEFWRV9MSUJVTldJTkRfU1VQUE9SVCAqLworI2VuZGlmIC8qIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQgKi8KIAogaW50IHJlY29yZF9wYXJzZV9jYWxsY2hhaW4oY29uc3QgY2hhciAqYXJnLCBzdHJ1Y3QgcmVjb3JkX29wdHMgKm9wdHMpCiB7CkBAIC03MDQsNyArNzA0LDcgQEAKIAkJCQkgICAgICAgIm5lZWRlZCBmb3IgLWcgZnBcbiIpOwogCQkJYnJlYWs7CiAKLSNpZmRlZiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAogCQkvKiBEd2FyZiBzdHlsZSAqLwogCQl9IGVsc2UgaWYgKCFzdHJuY21wKG5hbWUsICJkd2FyZiIsIHNpemVvZigiZHdhcmYiKSkpIHsKIAkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9zdGFja19kdW1wX3NpemUgPSA4MTkyOwpAQCAtNzIwLDcgKzcyMCw3IEBACiAJCQkJcmV0ID0gZ2V0X3N0YWNrX3NpemUodG9rLCAmc2l6ZSk7CiAJCQkJb3B0cy0+c3RhY2tfZHVtcF9zaXplID0gc2l6ZTsKIAkJCX0KLSNlbmRpZiAvKiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUICovCisjZW5kaWYgLyogSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVCAqLwogCQl9IGVsc2UgewogCQkJcHJfZXJyKCJjYWxsY2hhaW46IFVua25vd24gLS1jYWxsLWdyYXBoIG9wdGlvbiAiCiAJCQkgICAgICAgInZhbHVlOiAlc1xuIiwgYXJnKTsKQEAgLTczNSw3ICs3MzUsOSBAQAogCiBzdGF0aWMgdm9pZCBjYWxsY2hhaW5fZGVidWcoc3RydWN0IHJlY29yZF9vcHRzICpvcHRzKQogewotCXByX2RlYnVnKCJjYWxsY2hhaW46IHR5cGUgJWRcbiIsIG9wdHMtPmNhbGxfZ3JhcGgpOworCXN0YXRpYyBjb25zdCBjaGFyICpzdHJbQ0FMTENIQUlOX01BWF0gPSB7ICJOT05FIiwgIkZQIiwgIkRXQVJGIiB9OworCisJcHJfZGVidWcoImNhbGxjaGFpbjogdHlwZSAlc1xuIiwgc3RyW29wdHMtPmNhbGxfZ3JhcGhdKTsKIAogCWlmIChvcHRzLT5jYWxsX2dyYXBoID09IENBTExDSEFJTl9EV0FSRikKIAkJcHJfZGVidWcoImNhbGxjaGFpbjogc3RhY2sgZHVtcCBzaXplICVkXG4iLApAQCAtNzQ5LDYgKzc1MSw4IEBACiAJc3RydWN0IHJlY29yZF9vcHRzICpvcHRzID0gb3B0LT52YWx1ZTsKIAlpbnQgcmV0OwogCisJb3B0cy0+Y2FsbF9ncmFwaF9lbmFibGVkID0gIXVuc2V0OworCiAJLyogLS1uby1jYWxsLWdyYXBoICovCiAJaWYgKHVuc2V0KSB7CiAJCW9wdHMtPmNhbGxfZ3JhcGggPSBDQUxMQ0hBSU5fTk9ORTsKQEAgLTc2OSw2ICs3NzMsOCBAQAogewogCXN0cnVjdCByZWNvcmRfb3B0cyAqb3B0cyA9IG9wdC0+dmFsdWU7CiAKKwlvcHRzLT5jYWxsX2dyYXBoX2VuYWJsZWQgPSAhdW5zZXQ7CisKIAlpZiAob3B0cy0+Y2FsbF9ncmFwaCA9PSBDQUxMQ0hBSU5fTk9ORSkKIAkJb3B0cy0+Y2FsbF9ncmFwaCA9IENBTExDSEFJTl9GUDsKIApAQCAtNzc2LDYgKzc4MiwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBlcmZfcmVjb3JkX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpjYikKK3sKKwlzdHJ1Y3QgcmVjb3JkICpyZWMgPSBjYjsKKworCWlmICghc3RyY21wKHZhciwgInJlY29yZC5jYWxsLWdyYXBoIikpCisJCXJldHVybiByZWNvcmRfcGFyc2VfY2FsbGNoYWluKHZhbHVlLCAmcmVjLT5vcHRzKTsKKworCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZWNvcmRfdXNhZ2VbXSA9IHsKIAkicGVyZiByZWNvcmQgWzxvcHRpb25zPl0gWzxjb21tYW5kPl0iLAogCSJwZXJmIHJlY29yZCBbPG9wdGlvbnM+XSAtLSA8Y29tbWFuZD4gWzxvcHRpb25zPl0iLApAQCAtODA3LDcgKzgyMyw3IEBACiAKICNkZWZpbmUgQ0FMTENIQUlOX0hFTFAgInNldHVwIGFuZCBlbmFibGVzIGNhbGwtZ3JhcGggKHN0YWNrIGNoYWluL2JhY2t0cmFjZSkgcmVjb3JkaW5nOiAiCiAKLSNpZmRlZiBIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAogY29uc3QgY2hhciByZWNvcmRfY2FsbGNoYWluX2hlbHBbXSA9IENBTExDSEFJTl9IRUxQICJmcCBkd2FyZiI7CiAjZWxzZQogY29uc3QgY2hhciByZWNvcmRfY2FsbGNoYWluX2hlbHBbXSA9IENBTExDSEFJTl9IRUxQICJmcCI7CkBAIC05MDcsNiArOTIzLDggQEAKIAlpZiAocmVjLT5ldmxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlwZXJmX2NvbmZpZyhwZXJmX3JlY29yZF9jb25maWcsIHJlYyk7CisKIAlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCByZWNvcmRfb3B0aW9ucywgcmVjb3JkX3VzYWdlLAogCQkJICAgIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOwogCWlmICghYXJnYyAmJiB0YXJnZXRfX25vbmUoJnJlYy0+b3B0cy50YXJnZXQpKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCmluZGV4IDAyZjk4NWYuLmM4ZjIxMTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKQEAgLTc1LDEzICs3NSwxMCBAQAogCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKIH0KIAotc3RhdGljIGludCByZXBvcnRfX2FkZF9tZW1faGlzdF9lbnRyeShzdHJ1Y3QgcGVyZl90b29sICp0b29sLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKLQkJCQkgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCkKK3N0YXRpYyBpbnQgcmVwb3J0X19hZGRfbWVtX2hpc3RfZW50cnkoc3RydWN0IHJlcG9ydCAqcmVwLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCisJCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKIHsKLQlzdHJ1Y3QgcmVwb3J0ICpyZXAgPSBjb250YWluZXJfb2YodG9vbCwgc3RydWN0IHJlcG9ydCwgdG9vbCk7CiAJc3RydWN0IHN5bWJvbCAqcGFyZW50ID0gTlVMTDsKLQl1OCBjcHVtb2RlID0gZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX01BU0s7CiAJc3RydWN0IGhpc3RfZW50cnkgKmhlOwogCXN0cnVjdCBtZW1faW5mbyAqbWksICpteDsKIAl1aW50NjRfdCBjb3N0OwpAQCAtOTAsNyArODcsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQltaSA9IG1hY2hpbmVfX3Jlc29sdmVfbWVtKGFsLT5tYWNoaW5lLCBhbC0+dGhyZWFkLCBzYW1wbGUsIGNwdW1vZGUpOworCW1pID0gc2FtcGxlX19yZXNvbHZlX21lbShzYW1wbGUsIGFsKTsKIAlpZiAoIW1pKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTMxLDEwICsxMjgsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcmVwb3J0X19hZGRfYnJhbmNoX2hpc3RfZW50cnkoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAorc3RhdGljIGludCByZXBvcnRfX2FkZF9icmFuY2hfaGlzdF9lbnRyeShzdHJ1Y3QgcmVwb3J0ICpyZXAsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCiB7Ci0Jc3RydWN0IHJlcG9ydCAqcmVwID0gY29udGFpbmVyX29mKHRvb2wsIHN0cnVjdCByZXBvcnQsIHRvb2wpOwogCXN0cnVjdCBzeW1ib2wgKnBhcmVudCA9IE5VTEw7CiAJdW5zaWduZWQgaTsKIAlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CkBAIC0xNDQsOCArMTQwLDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JYmkgPSBtYWNoaW5lX19yZXNvbHZlX2JzdGFjayhhbC0+bWFjaGluZSwgYWwtPnRocmVhZCwKLQkJCQkgICAgIHNhbXBsZS0+YnJhbmNoX3N0YWNrKTsKKwliaSA9IHNhbXBsZV9fcmVzb2x2ZV9ic3RhY2soc2FtcGxlLCBhbCk7CiAJaWYgKCFiaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE5MCwxMCArMTg1LDkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJlcG9ydF9fYWRkX2hpc3RfZW50cnkoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorc3RhdGljIGludCByZXBvcnRfX2FkZF9oaXN0X2VudHJ5KHN0cnVjdCByZXBvcnQgKnJlcCwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAogCQkJCSAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKLQlzdHJ1Y3QgcmVwb3J0ICpyZXAgPSBjb250YWluZXJfb2YodG9vbCwgc3RydWN0IHJlcG9ydCwgdG9vbCk7CiAJc3RydWN0IHN5bWJvbCAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CiAJaW50IGVyciA9IHNhbXBsZV9fcmVzb2x2ZV9jYWxsY2hhaW4oc2FtcGxlLCAmcGFyZW50LCBldnNlbCwgYWwsIHJlcC0+bWF4X3N0YWNrKTsKQEAgLTIzNywyNSArMjMxLDI1IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoYWwuZmlsdGVyZWQgfHwgKHJlcC0+aGlkZV91bnJlc29sdmVkICYmIGFsLnN5bSA9PSBOVUxMKSkKKwlpZiAocmVwLT5oaWRlX3VucmVzb2x2ZWQgJiYgYWwuc3ltID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJaWYgKHJlcC0+Y3B1X2xpc3QgJiYgIXRlc3RfYml0KHNhbXBsZS0+Y3B1LCByZXAtPmNwdV9iaXRtYXApKQogCQlyZXR1cm4gMDsKIAogCWlmIChzb3J0X19tb2RlID09IFNPUlRfTU9ERV9fQlJBTkNIKSB7Ci0JCXJldCA9IHJlcG9ydF9fYWRkX2JyYW5jaF9oaXN0X2VudHJ5KHRvb2wsICZhbCwgc2FtcGxlLCBldnNlbCk7CisJCXJldCA9IHJlcG9ydF9fYWRkX2JyYW5jaF9oaXN0X2VudHJ5KHJlcCwgJmFsLCBzYW1wbGUsIGV2c2VsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlwcl9kZWJ1ZygicHJvYmxlbSBhZGRpbmcgbGJyIGVudHJ5LCBza2lwcGluZyBldmVudFxuIik7CiAJfSBlbHNlIGlmIChyZXAtPm1lbV9tb2RlID09IDEpIHsKLQkJcmV0ID0gcmVwb3J0X19hZGRfbWVtX2hpc3RfZW50cnkodG9vbCwgJmFsLCBzYW1wbGUsIGV2c2VsLCBldmVudCk7CisJCXJldCA9IHJlcG9ydF9fYWRkX21lbV9oaXN0X2VudHJ5KHJlcCwgJmFsLCBzYW1wbGUsIGV2c2VsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlwcl9kZWJ1ZygicHJvYmxlbSBhZGRpbmcgbWVtIGVudHJ5LCBza2lwcGluZyBldmVudFxuIik7CiAJfSBlbHNlIHsKIAkJaWYgKGFsLm1hcCAhPSBOVUxMKQogCQkJYWwubWFwLT5kc28tPmhpdCA9IDE7CiAKLQkJcmV0ID0gcmVwb3J0X19hZGRfaGlzdF9lbnRyeSh0b29sLCBldnNlbCwgJmFsLCBzYW1wbGUpOworCQlyZXQgPSByZXBvcnRfX2FkZF9oaXN0X2VudHJ5KHJlcCwgZXZzZWwsICZhbCwgc2FtcGxlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlwcl9kZWJ1ZygicHJvYmxlbSBpbmNyZW1lbnRpbmcgc3ltYm9sIHBlcmlvZCwgc2tpcHBpbmcgZXZlbnRcbiIpOwogCX0KQEAgLTkzNCw3ICs5MjgsNyBAQAogCSAqIHNvIGRvbid0IGFsbG9jYXRlIGV4dHJhIHNwYWNlIHRoYXQgd29uJ3QgYmUgdXNlZCBpbiB0aGUgc3RkaW8KIAkgKiBpbXBsZW1lbnRhdGlvbi4KIAkgKi8KLQlpZiAodXNlX2Jyb3dzZXIgPT0gMSAmJiBzb3J0X19oYXNfc3ltKSB7CisJaWYgKHVpX19oYXNfYW5ub3RhdGlvbigpKSB7CiAJCXN5bWJvbF9jb25mLnByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYW5ub3RhdGlvbik7CiAJCW1hY2hpbmVzX19zZXRfc3ltYm9sX2ZpbHRlcigmc2Vzc2lvbi0+bWFjaGluZXMsCiAJCQkJCSAgICBzeW1ib2xfX2Fubm90YXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwppbmRleCA2YTc2YTA3Li45YWMwYTQ5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwpAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIAogCWF2ZyA9IHdvcmtfbGlzdC0+dG90YWxfbGF0IC8gd29ya19saXN0LT5uYl9hdG9tczsKIAotCXByaW50ZigifCUxMS4zZiBtcyB8JTkiIFBSSXU2NCAiIHwgYXZnOiU5LjNmIG1zIHwgbWF4OiU5LjNmIG1zIHwgbWF4IGF0OiAlOS42ZiBzXG4iLAorCXByaW50ZigifCUxMS4zZiBtcyB8JTkiIFBSSXU2NCAiIHwgYXZnOiU5LjNmIG1zIHwgbWF4OiU5LjNmIG1zIHwgbWF4IGF0OiAlMTMuNmYgc1xuIiwKIAkgICAgICAoZG91YmxlKXdvcmtfbGlzdC0+dG90YWxfcnVudGltZSAvIDFlNiwKIAkJIHdvcmtfbGlzdC0+bmJfYXRvbXMsIChkb3VibGUpYXZnIC8gMWU2LAogCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXQgLyAxZTYsCkBAIC0xNTI3LDkgKzE1MjcsOSBAQAogCiAJcGVyZl9zY2hlZF9fc29ydF9sYXQoc2NoZWQpOwogCi0JcHJpbnRmKCJcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCXByaW50ZigiICBUYXNrICAgICAgICAgICAgICAgICAgfCAgIFJ1bnRpbWUgbXMgIHwgU3dpdGNoZXMgfCBBdmVyYWdlIGRlbGF5IG1zIHwgTWF4aW11bSBkZWxheSBtcyB8IE1heGltdW0gZGVsYXkgYXQgICAgIHxcbiIpOwotCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCJcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCIgIFRhc2sgICAgICAgICAgICAgICAgICB8ICAgUnVudGltZSBtcyAgfCBTd2l0Y2hlcyB8IEF2ZXJhZ2UgZGVsYXkgbXMgfCBNYXhpbXVtIGRlbGF5IG1zIHwgTWF4aW11bSBkZWxheSBhdCAgICAgICB8XG4iKTsKKwlwcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAluZXh0ID0gcmJfZmlyc3QoJnNjaGVkLT5zb3J0ZWRfYXRvbV9yb290KTsKIApAQCAtMTU0MSw3ICsxNTQxLDcgQEAKIAkJbmV4dCA9IHJiX25leHQobmV4dCk7CiAJfQogCi0JcHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGYoIiAgVE9UQUw6ICAgICAgICAgICAgICAgIHwlMTEuM2YgbXMgfCU5IiBQUkl1NjQgIiB8XG4iLAogCQkoZG91YmxlKXNjaGVkLT5hbGxfcnVudGltZSAvIDFlNiwgc2NoZWQtPmFsbF9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYwppbmRleCAyNTUyNmQ2Li43NGRiMjU2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCkBAIC00OTQsNyArNDk0LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJdGFsLmZpbHRlcmVkID0gZmFsc2U7CisJCXRhbC5maWx0ZXJlZCA9IDA7CiAJCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKGFsLnRocmVhZCwgbWFjaGluZSwgY3B1bW9kZSwKIAkJCQkJICAgTUFQX19GVU5DVElPTiwgaXAsICZ0YWwpOwogCkBAIC0xMjM4LDcgKzEyMzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBvbGRfcG93ZXJfYXJnc19ucjsgaSsrKQogCQkqcCsrID0gc3RyZHVwKG9sZF9wb3dlcl9hcmdzW2ldKTsKIAotCWZvciAoaiA9IDE7IGogPCAodW5zaWduZWQgaW50KWFyZ2M7IGorKykKKwlmb3IgKGogPSAwOyBqIDwgKHVuc2lnbmVkIGludClhcmdjOyBqKyspCiAJCSpwKysgPSBhcmd2W2pdOwogCiAJcmV0dXJuIGNtZF9yZWNvcmQocmVjX2FyZ2MsIHJlY19hcmd2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwppbmRleCA1Zjk4OWE3Li42NWFhYTViIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCkBAIC05OTMsNiArOTkzLDE2IEBACiAJcmV0dXJuIHJlY29yZF9wYXJzZV9jYWxsY2hhaW5fb3B0KG9wdCwgYXJnLCB1bnNldCk7CiB9CiAKK3N0YXRpYyBpbnQgcGVyZl90b3BfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmNiKQoreworCXN0cnVjdCBwZXJmX3RvcCAqdG9wID0gY2I7CisKKwlpZiAoIXN0cmNtcCh2YXIsICJ0b3AuY2FsbC1ncmFwaCIpKQorCQlyZXR1cm4gcmVjb3JkX3BhcnNlX2NhbGxjaGFpbih2YWx1ZSwgJnRvcC0+cmVjb3JkX29wdHMpOworCisJcmV0dXJuIHBlcmZfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSwgY2IpOworfQorCiBzdGF0aWMgaW50CiBwYXJzZV9wZXJjZW50X2xpbWl0KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqYXJnLAogCQkgICAgaW50IHVuc2V0IF9fbWF5YmVfdW51c2VkKQpAQCAtMTExNyw2ICsxMTI3LDggQEAKIAlpZiAodG9wLmV2bGlzdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXBlcmZfY29uZmlnKHBlcmZfdG9wX2NvbmZpZywgJnRvcCk7CisKIAlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCB0b3BfdXNhZ2UsIDApOwogCWlmIChhcmdjKQogCQl1c2FnZV93aXRoX29wdGlvbnModG9wX3VzYWdlLCBvcHRpb25zKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUKaW5kZXggMDMzMWVhMi4uYzIzNDE4MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUKQEAgLTU5LDYgKzU5LDE4IEBACiAgIENGTEFHUyArPSAtREhBVkVfUEVSRl9SRUdTX1NVUFBPUlQKIGVuZGlmCiAKK2lmbmRlZiBOT19MSUJFTEYKKyAgIyBmb3IgbGlua2luZyB3aXRoIGRlYnVnIGxpYnJhcnksIHJ1biBsaWtlOgorICAjIG1ha2UgREVCVUc9MSBMSUJEV19ESVI9L29wdC9saWJkdy8KKyAgaWZkZWYgTElCRFdfRElSCisgICAgTElCRFdfQ0ZMQUdTICA6PSAtSSQoTElCRFdfRElSKS9pbmNsdWRlCisgICAgTElCRFdfTERGTEFHUyA6PSAtTCQoTElCRFdfRElSKS9saWIKKworICAgIEZFQVRVUkVfQ0hFQ0tfQ0ZMQUdTLWxpYmR3LWR3YXJmLXVud2luZCA6PSAkKExJQkRXX0NGTEFHUykKKyAgICBGRUFUVVJFX0NIRUNLX0xERkxBR1MtbGliZHctZHdhcmYtdW53aW5kIDo9ICQoTElCRFdfTERGTEFHUykgLWxkdworICBlbmRpZgorZW5kaWYKKwogIyBpbmNsdWRlIEFSQ0ggc3BlY2lmaWMgY29uZmlnCiAtaW5jbHVkZSAkKHNyYy1wZXJmKS9hcmNoLyQoQVJDSCkvTWFrZWZpbGUKIApAQCAtMTQ3LDcgKzE1OSwzNSBAQAogCWxpYnVud2luZAkJCVwKIAlvbi1leGl0CQkJCVwKIAlzdGFja3Byb3RlY3Rvci1hbGwJCVwKLQl0aW1lcmZkCisJdGltZXJmZAkJCQlcCisJbGliZHctZHdhcmYtdW53aW5kCisKK0xJQl9GRUFUVVJFX1RFU1RTID0JCQlcCisJZHdhcmYJCQkJXAorCWdsaWJjCQkJCVwKKwlndGsyCQkJCVwKKwlsaWJhdWRpdAkJCVwKKwlsaWJiZmQJCQkJXAorCWxpYmVsZgkJCQlcCisJbGlibnVtYQkJCQlcCisJbGlicGVybAkJCQlcCisJbGlicHl0aG9uCQkJXAorCWxpYnNsYW5nCQkJXAorCWxpYnVud2luZAkJCVwKKwlsaWJkdy1kd2FyZi11bndpbmQKKworVkZfRkVBVFVSRV9URVNUUyA9CQkJXAorCWJhY2t0cmFjZQkJCVwKKwlmb3J0aWZ5LXNvdXJjZQkJCVwKKwlndGsyLWluZm9iYXIJCQlcCisJbGliZWxmLWdldHBoZHJudW0JCVwKKwlsaWJlbGYtbW1hcAkJCVwKKwlsaWJweXRob24tdmVyc2lvbgkJXAorCW9uLWV4aXQJCQkJXAorCXN0YWNrcHJvdGVjdG9yLWFsbAkJXAorCXRpbWVyZmQJCQkJXAorCWxpYnVud2luZC1kZWJ1Zy1mcmFtZQkJXAorCWJpb25pYwogCiAjIFNldCBGRUFUVVJFX0NIRUNLXyhDfExEKUZMQUdTLWFsbCBmb3IgYWxsIENPUkVfRkVBVFVSRV9URVNUUyBmZWF0dXJlcy4KICMgSWYgaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHBlci1mZWF0dXJlIGNoZWNrcy9mbGFncyBmb3IgZmVhdHVyZXMgbm90CkBAIC0xNjEsMTcgKzIwMSw2IEBACiAkKGZvcmVhY2ggZmVhdCwkKENPUkVfRkVBVFVSRV9URVNUUyksJChjYWxsIHNldF90ZXN0X2FsbF9mbGFncywkKGZlYXQpKSkKIAogIwotIyBTbyBoZXJlIHdlIGRldGVjdCB3aGV0aGVyIHRlc3QtYWxsIHdhcyByZWJ1aWx0LCB0byBiZSBhYmxlCi0jIHRvIHNraXAgdGhlIHByaW50LW91dCBvZiB0aGUgbG9uZyBmZWF0dXJlcyBsaXN0IGlmIHRoZSBmaWxlCi0jIGV4aXN0ZWQgYmVmb3JlIGFuZCBhZnRlciBpdCB3YXMgYnVpbHQ6Ci0jCi1pZmVxICgkKHdpbGRjYXJkICQoT1VUUFVUKWNvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWFsbC5iaW4pLCkKLSAgdGVzdC1hbGwtZmFpbGVkIDo9IDEKLWVsc2UKLSAgdGVzdC1hbGwtZmFpbGVkIDo9IDAKLWVuZGlmCi0KLSMKICMgU3BlY2lhbCBmYXN0LXBhdGggZm9yIHRoZSAnYWxsIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUnIGNhc2U6CiAjCiAkKGNhbGwgZmVhdHVyZV9jaGVjayxhbGwsJChNU0cpKQpAQCAtMTgwLDE1ICsyMDksNiBAQAogIyBKdXN0IGluIGNhc2UgdGhlIGJ1aWxkIGZyZXNobHkgZmFpbGVkLCBtYWtlIHN1cmUgd2UgcHJpbnQgdGhlCiAjIGZlYXR1cmUgbWF0cml4OgogIwotaWZlcSAoJChmZWF0dXJlLWFsbCksIDApCi0gIHRlc3QtYWxsLWZhaWxlZCA6PSAxCi1lbmRpZgotCi1pZmVxICgkKHRlc3QtYWxsLWZhaWxlZCksMSkKLSAgJChpbmZvICkKLSAgJChpbmZvIEF1dG8tZGV0ZWN0aW5nIHN5c3RlbSBmZWF0dXJlczopCi1lbmRpZgotCiBpZmVxICgkKGZlYXR1cmUtYWxsKSwgMSkKICAgIwogICAjIHRlc3QtYWxsLmMgcGFzc2VkIC0ganVzdCBzZXQgYWxsIHRoZSBjb3JlIGZlYXR1cmUgZmxhZ3MgdG8gMToKQEAgLTE5OSwyNyArMjE5LDYgQEAKICAgJChmb3JlYWNoIGZlYXQsJChDT1JFX0ZFQVRVUkVfVEVTVFMpLCQoY2FsbCBmZWF0dXJlX2NoZWNrLCQoZmVhdCkpKQogZW5kaWYKIAotIwotIyBQcmludCB0aGUgcmVzdWx0IG9mIHRoZSBmZWF0dXJlIHRlc3Q6Ci0jCi1mZWF0dXJlX3ByaW50ID0gJChldmFsICQoZmVhdHVyZV9wcmludF9jb2RlKSkgJChpbmZvICQoTVNHKSkKLQotZGVmaW5lIGZlYXR1cmVfcHJpbnRfY29kZQotICBpZmVxICgkKGZlYXR1cmUtJCgxKSksIDEpCi0gICAgTVNHID0gJChzaGVsbCBwcmludGYgJy4uLiUzMHM6IFsgXDAzM1szMm1vblwwMzNbbSAgXScgJCgxKSkKLSAgZWxzZQotICAgIE1TRyA9ICQoc2hlbGwgcHJpbnRmICcuLi4lMzBzOiBbIFwwMzNbMzFtT0ZGXDAzM1ttIF0nICQoMSkpCi0gIGVuZGlmCi1lbmRlZgotCi0jCi0jIE9ubHkgcHJpbnQgb3V0IG91ciBmZWF0dXJlcyBpZiB3ZSByZWJ1aWx0IHRoZSB0ZXN0Y2FzZXMgb3IgaWYgYSB0ZXN0IGZhaWxlZDoKLSMKLWlmZXEgKCQodGVzdC1hbGwtZmFpbGVkKSwgMSkKLSAgJChmb3JlYWNoIGZlYXQsJChDT1JFX0ZFQVRVUkVfVEVTVFMpLCQoY2FsbCBmZWF0dXJlX3ByaW50LCQoZmVhdCkpKQotICAkKGluZm8gKQotZW5kaWYKLQogaWZlcSAoJChmZWF0dXJlLXN0YWNrcHJvdGVjdG9yLWFsbCksIDEpCiAgIENGTEFHUyArPSAtZnN0YWNrLXByb3RlY3Rvci1hbGwKIGVuZGlmCkBAIC0yNjQsNiArMjYzLDcgQEAKICAgTk9fRFdBUkYgOj0gMQogICBOT19ERU1BTkdMRSA6PSAxCiAgIE5PX0xJQlVOV0lORCA6PSAxCisgIE5PX0xJQkRXX0RXQVJGX1VOV0lORCA6PSAxCiBlbHNlCiAgIGlmZXEgKCQoZmVhdHVyZS1saWJlbGYpLCAwKQogICAgIGlmZXEgKCQoZmVhdHVyZS1nbGliYyksIDEpCkBAIC0yODIsMTMgKzI4MiwxMiBAQAogICAgICAgbXNnIDo9ICQoZXJyb3IgTm8gZ251L2xpYmMtdmVyc2lvbi5oIGZvdW5kLCBwbGVhc2UgaW5zdGFsbCBnbGliYy1kZXZbZWxdL2dsaWJjLXN0YXRpYyk7CiAgICAgZW5kaWYKICAgZWxzZQotICAgICMgZm9yIGxpbmtpbmcgd2l0aCBkZWJ1ZyBsaWJyYXJ5LCBydW4gbGlrZToKLSAgICAjIG1ha2UgREVCVUc9MSBMSUJEV19ESVI9L29wdC9saWJkdy8KLSAgICBpZmRlZiBMSUJEV19ESVIKLSAgICAgIExJQkRXX0NGTEFHUyAgOj0gLUkkKExJQkRXX0RJUikvaW5jbHVkZQotICAgICAgTElCRFdfTERGTEFHUyA6PSAtTCQoTElCRFdfRElSKS9saWIKKyAgICBpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECisgICAgICBpZm5lcSAoJChmZWF0dXJlLWxpYmR3LWR3YXJmLXVud2luZCksMSkKKyAgICAgICAgTk9fTElCRFdfRFdBUkZfVU5XSU5EIDo9IDEKKyAgICAgICAgbXNnIDo9ICQod2FybmluZyBObyBsaWJkdyBEV0FSRiB1bndpbmQgZm91bmQsIFBsZWFzZSBpbnN0YWxsIGVsZnV0aWxzLWRldmVsL2xpYmR3LWRldiA+PSAwLjE1OCBhbmQvb3Igc2V0IExJQkRXX0RJUik7CisgICAgICBlbmRpZgogICAgIGVuZGlmCi0KICAgICBpZm5lcSAoJChmZWF0dXJlLWR3YXJmKSwgMSkKICAgICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gbGliZHcuaCBmb3VuZCBvciBvbGQgbGliZHcuaCBmb3VuZCBvciBlbGZ1dGlscyBpcyBvbGRlciB0aGFuIDAuMTM4LCBkaXNhYmxlcyBkd2FyZiBzdXBwb3J0LiBQbGVhc2UgaW5zdGFsbCBuZXcgZWxmdXRpbHMtZGV2ZWwvbGliZHctZGV2KTsKICAgICAgIE5PX0RXQVJGIDo9IDEKQEAgLTMyNCwyNSArMzIzLDUxIEBACiAKIGlmbmRlZiBOT19MSUJVTldJTkQKICAgaWZuZXEgKCQoZmVhdHVyZS1saWJ1bndpbmQpLCAxKQotICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gbGlidW53aW5kIGZvdW5kLCBkaXNhYmxpbmcgcG9zdCB1bndpbmQgc3VwcG9ydC4gUGxlYXNlIGluc3RhbGwgbGlidW53aW5kLWRldltlbF0gPj0gMS4xKTsKKyAgICBtc2cgOj0gJCh3YXJuaW5nIE5vIGxpYnVud2luZCBmb3VuZC4gUGxlYXNlIGluc3RhbGwgbGlidW53aW5kLWRldltlbF0gPj0gMS4xIGFuZC9vciBzZXQgTElCVU5XSU5EX0RJUik7CiAgICAgTk9fTElCVU5XSU5EIDo9IDEKKyAgZW5kaWYKK2VuZGlmCisKK2R3YXJmLXBvc3QtdW53aW5kIDo9IDEKK2R3YXJmLXBvc3QtdW53aW5kLXRleHQgOj0gQlVHCisKKyMgc2V0dXAgRFdBUkYgcG9zdCB1bndpbmRlcgoraWZkZWYgTk9fTElCVU5XSU5ECisgIGlmZGVmIE5PX0xJQkRXX0RXQVJGX1VOV0lORAorICAgIG1zZyA6PSAkKHdhcm5pbmcgRGlzYWJsaW5nIHBvc3QgdW53aW5kLCBubyBzdXBwb3J0IGZvdW5kLik7CisgICAgZHdhcmYtcG9zdC11bndpbmQgOj0gMAogICBlbHNlCi0gICAgaWZlcSAoJChBUkNIKSxhcm0pCi0gICAgICAkKGNhbGwgZmVhdHVyZV9jaGVjayxsaWJ1bndpbmQtZGVidWctZnJhbWUpCi0gICAgICBpZm5lcSAoJChmZWF0dXJlLWxpYnVud2luZC1kZWJ1Zy1mcmFtZSksIDEpCi0gICAgICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gZGVidWdfZnJhbWUgc3VwcG9ydCBmb3VuZCBpbiBsaWJ1bndpbmQpOwotICAgICAgICBDRkxBR1MgKz0gLUROT19MSUJVTldJTkRfREVCVUdfRlJBTUUKLSAgICAgIGVuZGlmCi0gICAgZWxzZQotICAgICAgIyBub24tQVJNIGhhcyBubyBkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKCkgZnVuY3Rpb246CisgICAgZHdhcmYtcG9zdC11bndpbmQtdGV4dCA6PSBsaWJkdworICBlbmRpZgorZWxzZQorICBkd2FyZi1wb3N0LXVud2luZC10ZXh0IDo9IGxpYnVud2luZAorICAjIEVuYWJsZSBsaWJ1bndpbmQgc3VwcG9ydCBieSBkZWZhdWx0LgorICBpZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECisgICAgTk9fTElCRFdfRFdBUkZfVU5XSU5EIDo9IDEKKyAgZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoZHdhcmYtcG9zdC11bndpbmQpLDEpCisgIENGTEFHUyArPSAtREhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQKK2Vsc2UKKyAgTk9fRFdBUkZfVU5XSU5EIDo9IDEKK2VuZGlmCisKK2lmbmRlZiBOT19MSUJVTldJTkQKKyAgaWZlcSAoJChBUkNIKSxhcm0pCisgICAgJChjYWxsIGZlYXR1cmVfY2hlY2ssbGlidW53aW5kLWRlYnVnLWZyYW1lKQorICAgIGlmbmVxICgkKGZlYXR1cmUtbGlidW53aW5kLWRlYnVnLWZyYW1lKSwgMSkKKyAgICAgIG1zZyA6PSAkKHdhcm5pbmcgTm8gZGVidWdfZnJhbWUgc3VwcG9ydCBmb3VuZCBpbiBsaWJ1bndpbmQpOwogICAgICAgQ0ZMQUdTICs9IC1ETk9fTElCVU5XSU5EX0RFQlVHX0ZSQU1FCiAgICAgZW5kaWYKLQotICAgIENGTEFHUyArPSAtREhBVkVfTElCVU5XSU5EX1NVUFBPUlQKLSAgICBFWFRMSUJTICs9ICQoTElCVU5XSU5EX0xJQlMpCi0gICAgQ0ZMQUdTICs9ICQoTElCVU5XSU5EX0NGTEFHUykKLSAgICBMREZMQUdTICs9ICQoTElCVU5XSU5EX0xERkxBR1MpCi0gIGVuZGlmICMgaWZuZXEgKCQoZmVhdHVyZS1saWJ1bndpbmQpLCAxKQorICBlbHNlCisgICAgIyBub24tQVJNIGhhcyBubyBkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKCkgZnVuY3Rpb246CisgICAgQ0ZMQUdTICs9IC1ETk9fTElCVU5XSU5EX0RFQlVHX0ZSQU1FCisgIGVuZGlmCisgIENGTEFHUyAgKz0gLURIQVZFX0xJQlVOV0lORF9TVVBQT1JUCisgIEVYVExJQlMgKz0gJChMSUJVTldJTkRfTElCUykKKyAgQ0ZMQUdTICArPSAkKExJQlVOV0lORF9DRkxBR1MpCisgIExERkxBR1MgKz0gJChMSUJVTldJTkRfTERGTEFHUykKIGVuZGlmCiAKIGlmbmRlZiBOT19MSUJBVURJVApAQCAtNjAyLDMgKzYyNyw4NCBAQAogcGx1Z2luZGlyPSQobGliZGlyKS90cmFjZWV2ZW50L3BsdWdpbnMKIHBsdWdpbmRpcl9TUT0gJChzdWJzdCAnLCdcJycsJChwbHVnaW5kaXIpKQogZW5kaWYKKworIworIyBQcmludCB0aGUgcmVzdWx0IG9mIHRoZSBmZWF0dXJlIHRlc3Q6CisjCitmZWF0dXJlX3ByaW50X3N0YXR1cyA9ICQoZXZhbCAkKGZlYXR1cmVfcHJpbnRfc3RhdHVzX2NvZGUpKSAkKGluZm8gJChNU0cpKQorCitkZWZpbmUgZmVhdHVyZV9wcmludF9zdGF0dXNfY29kZQorICBpZmVxICgkKGZlYXR1cmUtJCgxKSksIDEpCisgICAgTVNHID0gJChzaGVsbCBwcmludGYgJy4uLiUzMHM6IFsgXDAzM1szMm1vblwwMzNbbSAgXScgJCgxKSkKKyAgZWxzZQorICAgIE1TRyA9ICQoc2hlbGwgcHJpbnRmICcuLi4lMzBzOiBbIFwwMzNbMzFtT0ZGXDAzM1ttIF0nICQoMSkpCisgIGVuZGlmCitlbmRlZgorCitmZWF0dXJlX3ByaW50X3ZhciA9ICQoZXZhbCAkKGZlYXR1cmVfcHJpbnRfdmFyX2NvZGUpKSAkKGluZm8gJChNU0cpKQorZGVmaW5lIGZlYXR1cmVfcHJpbnRfdmFyX2NvZGUKKyAgICBNU0cgPSAkKHNoZWxsIHByaW50ZiAnLi4uJTMwczogJXMnICQoMSkgJCgkKDEpKSkKK2VuZGVmCisKK2ZlYXR1cmVfcHJpbnRfdGV4dCA9ICQoZXZhbCAkKGZlYXR1cmVfcHJpbnRfdGV4dF9jb2RlKSkgJChpbmZvICQoTVNHKSkKK2RlZmluZSBmZWF0dXJlX3ByaW50X3RleHRfY29kZQorICAgIE1TRyA9ICQoc2hlbGwgcHJpbnRmICcuLi4lMzBzOiAlcycgJCgxKSAkKDIpKQorZW5kZWYKKworUEVSRl9GRUFUVVJFUyA6PSAkKGZvcmVhY2ggZmVhdCwkKExJQl9GRUFUVVJFX1RFU1RTKSxmZWF0dXJlLSQoZmVhdCkoJChmZWF0dXJlLSQoZmVhdCkpKSkKK1BFUkZfRkVBVFVSRVNfRklMRSA6PSAkKHNoZWxsIHRvdWNoICQoT1VUUFVUKVBFUkYtRkVBVFVSRVM7IGNhdCAkKE9VVFBVVClQRVJGLUZFQVRVUkVTKQorCitpZmVxICgkKGR3YXJmLXBvc3QtdW53aW5kKSwxKQorICBQRVJGX0ZFQVRVUkVTICs9IGR3YXJmLXBvc3QtdW53aW5kKCQoZHdhcmYtcG9zdC11bndpbmQtdGV4dCkpCitlbmRpZgorCisjIFRoZSAkKGRpc3BsYXlfbGliKSBjb250cm9scyB0aGUgZGVmYXVsdCBkZXRlY3Rpb24gbWVzc2FnZQorIyBvdXRwdXQuIEl0J3Mgc2V0IGlmOgorIyAtIGRldGVjdGVkIGZlYXR1cmVzIGRpZmZlcmVzIGZyb20gc3RvcmVkIGZlYXR1cmVzIGZyb20KKyMgICBsYXN0IGJ1aWxkIChpbiBQRVJGLUZFQVRVUkVTIGZpbGUpCisjIC0gb25lIG9mIHRoZSAkKExJQl9GRUFUVVJFX1RFU1RTKSBpcyBub3QgZGV0ZWN0ZWQKKyMgLSBWRiBpcyBlbmFibGVkCisKK2lmbmVxICgiJChQRVJGX0ZFQVRVUkVTKSIsIiQoUEVSRl9GRUFUVVJFU19GSUxFKSIpCisgICQoc2hlbGwgZWNobyAiJChQRVJGX0ZFQVRVUkVTKSIgPiAkKE9VVFBVVClQRVJGLUZFQVRVUkVTKQorICBkaXNwbGF5X2xpYiA6PSAxCitlbmRpZgorCitmZWF0dXJlX2NoZWNrID0gJChldmFsICQoZmVhdHVyZV9jaGVja19jb2RlKSkKK2RlZmluZSBmZWF0dXJlX2NoZWNrX2NvZGUKKyAgaWZuZXEgKCQoZmVhdHVyZS0kKDEpKSwgMSkKKyAgICBkaXNwbGF5X2xpYiA6PSAxCisgIGVuZGlmCitlbmRlZgorCiskKGZvcmVhY2ggZmVhdCwkKExJQl9GRUFUVVJFX1RFU1RTKSwkKGNhbGwgZmVhdHVyZV9jaGVjaywkKGZlYXQpKSkKKworaWZlcSAoJChWRiksMSkKKyAgZGlzcGxheV9saWIgOj0gMQorICBkaXNwbGF5X3ZmIDo9IDEKK2VuZGlmCisKK2lmZXEgKCQoZGlzcGxheV9saWIpLDEpCisgICQoaW5mbyApCisgICQoaW5mbyBBdXRvLWRldGVjdGluZyBzeXN0ZW0gZmVhdHVyZXM6KQorICAkKGZvcmVhY2ggZmVhdCwkKExJQl9GRUFUVVJFX1RFU1RTKSwkKGNhbGwgZmVhdHVyZV9wcmludF9zdGF0dXMsJChmZWF0KSwpKQorCisgIGlmZXEgKCQoZHdhcmYtcG9zdC11bndpbmQpLDEpCisgICAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdGV4dCwiRFdBUkYgcG9zdCB1bndpbmQgbGlicmFyeSIsICQoZHdhcmYtcG9zdC11bndpbmQtdGV4dCkpCisgIGVuZGlmCitlbmRpZgorCitpZmVxICgkKGRpc3BsYXlfdmYpLDEpCisgICQoZm9yZWFjaCBmZWF0LCQoVkZfRkVBVFVSRV9URVNUUyksJChjYWxsIGZlYXR1cmVfcHJpbnRfc3RhdHVzLCQoZmVhdCksKSkKKyAgJChpbmZvICkKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLHByZWZpeCkKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLGJpbmRpcikKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLGxpYmRpcikKKyAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLHN5c2NvbmZkaXIpCisgICQoY2FsbCBmZWF0dXJlX3ByaW50X3ZhcixMSUJVTldJTkRfRElSKQorICAkKGNhbGwgZmVhdHVyZV9wcmludF92YXIsTElCRFdfRElSKQorZW5kaWYKKworaWZlcSAoJChkaXNwbGF5X2xpYiksMSkKKyAgJChpbmZvICkKK2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCmluZGV4IDUyM2I3YmMuLjJkYTEwM2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCkBAIC0yNiw3ICsyNiw4IEBACiAJdGVzdC1saWJ1bndpbmQtZGVidWctZnJhbWUuYmluCVwKIAl0ZXN0LW9uLWV4aXQuYmluCQlcCiAJdGVzdC1zdGFja3Byb3RlY3Rvci1hbGwuYmluCVwKLQl0ZXN0LXRpbWVyZmQuYmluCisJdGVzdC10aW1lcmZkLmJpbgkJXAorCXRlc3QtbGliZHctZHdhcmYtdW53aW5kLmJpbgogCiBDQyA6PSAkKENST1NTX0NPTVBJTEUpZ2NjIC1NRAogUEtHX0NPTkZJRyA6PSAkKENST1NTX0NPTVBJTEUpcGtnLWNvbmZpZwpAQCAtMTQxLDYgKzE0Miw5IEBACiB0ZXN0LXRpbWVyZmQuYmluOgogCSQoQlVJTEQpCiAKK3Rlc3QtbGliZHctZHdhcmYtdW53aW5kLmJpbjoKKwkkKEJVSUxEKQorCiAtaW5jbHVkZSAqLmQKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1hbGwuYyBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtYWxsLmMKaW5kZXggOWI4YTU0NC4uZmMzN2ViMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1hbGwuYworKysgYi90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWFsbC5jCkBAIC04OSw2ICs4OSwxMCBAQAogIyBpbmNsdWRlICJ0ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5jIgogI3VuZGVmIG1haW4KIAorI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJkd19kd2FyZl91bndpbmQKKyMgaW5jbHVkZSAidGVzdC1saWJkdy1kd2FyZi11bndpbmQuYyIKKyN1bmRlZiBtYWluCisKIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJbWFpbl90ZXN0X2xpYnB5dGhvbigpOwpAQCAtMTExLDYgKzExNSw3IEBACiAJbWFpbl90ZXN0X2xpYm51bWEoKTsKIAltYWluX3Rlc3RfdGltZXJmZCgpOwogCW1haW5fdGVzdF9zdGFja3Byb3RlY3Rvcl9hbGwoKTsKKwltYWluX3Rlc3RfbGliZHdfZHdhcmZfdW53aW5kKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGliZHctZHdhcmYtdW53aW5kLmMgYi90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmR3LWR3YXJmLXVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzZhM2YKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmR3LWR3YXJmLXVud2luZC5jCkBAIC0wLDAgKzEsMTMgQEAKKworI2luY2x1ZGUgPGVsZnV0aWxzL2xpYmR3ZmwuaD4KKworaW50IG1haW4odm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gaXMgZ3VhcmRlZCB2aWE6IF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMikuCisJICogUGFzc2luZyAnMScgYXMgYXJndW1lbnRzIHZhbHVlLiBUaGlzIGNvZGUgaXMgbmV2ZXIgZXhlY3V0ZWQsCisJICogb25seSBjb21waWxlZC4KKwkgKi8KKwlkd2ZsX3RocmVhZF9nZXRmcmFtZXMoKHZvaWQgKikgMSwgKHZvaWQgKikgMSwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2Rlc2lnbi50eHQgYi90b29scy9wZXJmL2Rlc2lnbi50eHQKaW5kZXggNjNhMGU2Zi4uYTI4ZGNhMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9kZXNpZ24udHh0CisrKyBiL3Rvb2xzL3BlcmYvZGVzaWduLnR4dApAQCAtMTgsNyArMTgsNyBAQAogUGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIGFjY2Vzc2VkIHZpYSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvcnMuCiBUaGVyZSdzIG9uZSBmaWxlIGRlc2NyaXB0b3IgcGVyIHZpcnR1YWwgY291bnRlciB1c2VkLgogCi1UaGUgc3BlY2lhbCBmaWxlIGRlc2NyaXB0b3IgaXMgb3BlbmVkIHZpYSB0aGUgcGVyZl9ldmVudF9vcGVuKCkKK1RoZSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvciBpcyBvcGVuZWQgdmlhIHRoZSBzeXNfcGVyZl9ldmVudF9vcGVuKCkKIHN5c3RlbSBjYWxsOgogCiAgICBpbnQgc3lzX3BlcmZfZXZlbnRfb3BlbihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICpod19ldmVudF91cHRyLApAQCAtODIsNyArODIsNyBAQAogSWYgJ3Jhd190eXBlJyBpcyAwLCB0aGVuIHRoZSAndHlwZScgZmllbGQgc2F5cyB3aGF0IGtpbmQgb2YgY291bnRlcgogdGhpcyBpcywgd2l0aCB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgogCi1lbnVtIHBlcmZfZXZlbnRfdHlwZXMgeworZW51bSBwZXJmX3R5cGVfaWQgewogCVBFUkZfVFlQRV9IQVJEV0FSRQkJPSAwLAogCVBFUkZfVFlQRV9TT0ZUV0FSRQkJPSAxLAogCVBFUkZfVFlQRV9UUkFDRVBPSU5UCQk9IDIsCkBAIC05NSw3ICs5NSw3IEBACiAgKiBHZW5lcmFsaXplZCBwZXJmb3JtYW5jZSBjb3VudGVyIGV2ZW50IHR5cGVzLCB1c2VkIGJ5IHRoZSBod19ldmVudC5ldmVudF9pZAogICogcGFyYW1ldGVyIG9mIHRoZSBzeXNfcGVyZl9ldmVudF9vcGVuKCkgc3lzY2FsbDoKICAqLwotZW51bSBod19ldmVudF9pZHMgeworZW51bSBwZXJmX2h3X2lkIHsKIAkvKgogCSAqIENvbW1vbiBoYXJkd2FyZSBldmVudHMsIGdlbmVyYWxpemVkIGJ5IHRoZSBrZXJuZWw6CiAJICovCkBAIC0xMjksNyArMTI5LDcgQEAKICAqIHBoeXNpY2FsIGFuZCBzdyBldmVudHMgb2YgdGhlIGtlcm5lbCAoYW5kIGFsbG93IHRoZSBwcm9maWxpbmcgb2YgdGhlbSBhcwogICogd2VsbCk6CiAgKi8KLWVudW0gc3dfZXZlbnRfaWRzIHsKK2VudW0gcGVyZl9zd19pZHMgewogCVBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLCQk9IDAsCiAJUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCT0gMSwKIAlQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTCT0gMiwKQEAgLTIzMCw3ICsyMzAsNyBAQAogVGhlICdjb21tJyBiaXQgYWxsb3dzIHRyYWNraW5nIG9mIHByb2Nlc3MgY29tbSBkYXRhIG9uIHByb2Nlc3MgY3JlYXRpb24uCiBUaGlzIHRvbyBpcyByZWNvcmRlZCBpbiB0aGUgcmluZy1idWZmZXIgKHNlZSBiZWxvdykuCiAKLVRoZSAncGlkJyBwYXJhbWV0ZXIgdG8gdGhlIHBlcmZfZXZlbnRfb3BlbigpIHN5c3RlbSBjYWxsIGFsbG93cyB0aGUKK1RoZSAncGlkJyBwYXJhbWV0ZXIgdG8gdGhlIHN5c19wZXJmX2V2ZW50X29wZW4oKSBzeXN0ZW0gY2FsbCBhbGxvd3MgdGhlCiBjb3VudGVyIHRvIGJlIHNwZWNpZmljIHRvIGEgdGFzazoKIAogIHBpZCA9PSAwOiBpZiB0aGUgcGlkIHBhcmFtZXRlciBpcyB6ZXJvLCB0aGUgY291bnRlciBpcyBhdHRhY2hlZCB0byB0aGUKQEAgLTI2MCw3ICsyNjAsNyBAQAogCiBUaGUgJ2dyb3VwX2ZkJyBwYXJhbWV0ZXIgYWxsb3dzIGNvdW50ZXIgImdyb3VwcyIgdG8gYmUgc2V0IHVwLiAgQQogY291bnRlciBncm91cCBoYXMgb25lIGNvdW50ZXIgd2hpY2ggaXMgdGhlIGdyb3VwICJsZWFkZXIiLiAgVGhlIGxlYWRlcgotaXMgY3JlYXRlZCBmaXJzdCwgd2l0aCBncm91cF9mZCA9IC0xIGluIHRoZSBwZXJmX2V2ZW50X29wZW4gY2FsbAoraXMgY3JlYXRlZCBmaXJzdCwgd2l0aCBncm91cF9mZCA9IC0xIGluIHRoZSBzeXNfcGVyZl9ldmVudF9vcGVuIGNhbGwKIHRoYXQgY3JlYXRlcyBpdC4gIFRoZSByZXN0IG9mIHRoZSBncm91cCBtZW1iZXJzIGFyZSBjcmVhdGVkCiBzdWJzZXF1ZW50bHksIHdpdGggZ3JvdXBfZmQgZ2l2aW5nIHRoZSBmZCBvZiB0aGUgZ3JvdXAgbGVhZGVyLgogKEEgc2luZ2xlIGNvdW50ZXIgb24gaXRzIG93biBpcyBjcmVhdGVkIHdpdGggZ3JvdXBfZmQgPSAtMSBhbmQgaXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvcGVyZi1jb21wbGV0aW9uLnNoIGIvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKaW5kZXggNDk2ZTJhYi4uYWUzYTU3NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKKysrIGIvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKQEAgLTEyMyw3ICsxMjMsNyBAQAogCQlfX3BlcmZjb21wX2NvbG9uICIkZXZ0cyIgIiRjdXIiCiAJIyBMaXN0IHN1YmNvbW1hbmRzIGZvciAncGVyZiBrdm0nCiAJZWxpZiBbWyAkcHJldiA9PSAia3ZtIiBdXTsgdGhlbgotCQlzdWJjbWRzPSJ0b3AgcmVjb3JkIHJlcG9ydCBkaWZmIGJ1aWxkaWQtbGlzdCBzdGF0IgorCQlzdWJjbWRzPSQoJGNtZCAkcHJldiAtLWxpc3QtY21kcykKIAkJX19wZXJmY29tcF9jb2xvbiAiJHN1YmNtZHMiICIkY3VyIgogCSMgTGlzdCBsb25nIG9wdGlvbiBuYW1lcwogCWVsaWYgW1sgJGN1ciA9PSAtLSogXV07ICB0aGVuCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCmluZGV4IGU4NGZhMjYuLmUxOGE4YjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi5oCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi5oCkBAIC0xMiw2ICsxMiw5IEBACiAjaWZuZGVmIF9fTlJfcGVyZl9ldmVudF9vcGVuCiAjIGRlZmluZSBfX05SX3BlcmZfZXZlbnRfb3BlbiAzMzYKICNlbmRpZgorI2lmbmRlZiBfX05SX2Z1dGV4CisjIGRlZmluZSBfX05SX2Z1dGV4IDI0MAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoX194ODZfNjRfXykKQEAgLTIzLDYgKzI2LDkgQEAKICNpZm5kZWYgX19OUl9wZXJmX2V2ZW50X29wZW4KICMgZGVmaW5lIF9fTlJfcGVyZl9ldmVudF9vcGVuIDI5OAogI2VuZGlmCisjaWZuZGVmIF9fTlJfZnV0ZXgKKyMgZGVmaW5lIF9fTlJfZnV0ZXggMjAyCisjZW5kaWYKICNlbmRpZgogCiAjaWZkZWYgX19wb3dlcnBjX18KQEAgLTI1MSwxMiArMjU3LDE0IEBACiBlbnVtIHBlcmZfY2FsbF9ncmFwaF9tb2RlIHsKIAlDQUxMQ0hBSU5fTk9ORSwKIAlDQUxMQ0hBSU5fRlAsCi0JQ0FMTENIQUlOX0RXQVJGCisJQ0FMTENIQUlOX0RXQVJGLAorCUNBTExDSEFJTl9NQVgKIH07CiAKIHN0cnVjdCByZWNvcmRfb3B0cyB7CiAJc3RydWN0IHRhcmdldCB0YXJnZXQ7CiAJaW50CSAgICAgY2FsbF9ncmFwaDsKKwlib29sICAgICAgICAgY2FsbF9ncmFwaF9lbmFibGVkOwogCWJvb2wJICAgICBncm91cDsKIAlib29sCSAgICAgaW5oZXJpdF9zdGF0OwogCWJvb2wJICAgICBub19idWZmZXJpbmc7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2J1aWx0aW4tdGVzdC5jIGIvdG9vbHMvcGVyZi90ZXN0cy9idWlsdGluLXRlc3QuYwppbmRleCAxZTY3NDM3Li5iMTFiZjhhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2J1aWx0aW4tdGVzdC5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvYnVpbHRpbi10ZXN0LmMKQEAgLTExNSw2ICsxMTUsMTQgQEAKIAkJLmRlc2MgPSAiVGVzdCBwYXJzaW5nIHdpdGggbm8gc2FtcGxlX2lkX2FsbCBiaXQgc2V0IiwKIAkJLmZ1bmMgPSB0ZXN0X19wYXJzZV9ub19zYW1wbGVfaWRfYWxsLAogCX0sCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorI2lmZGVmIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQKKwl7CisJCS5kZXNjID0gIlRlc3QgZHdhcmYgdW53aW5kIiwKKwkJLmZ1bmMgPSB0ZXN0X19kd2FyZl91bndpbmQsCisJfSwKKyNlbmRpZgorI2VuZGlmCiAJewogCQkuZnVuYyA9IE5VTEwsCiAJfSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvZHdhcmYtdW53aW5kLmMgYi90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTllZTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jCkBAIC0wLDAgKzEsMTQ0IEBACisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJ0ZXN0cy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibWFjaGluZS5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAidW53aW5kLmgiCisjaW5jbHVkZSAicGVyZl9yZWdzLmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKK3N0YXRpYyBpbnQgbW1hcF9oYW5kbGVyKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX19tYXliZV91bnVzZWQsCisJCQl1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fbWF5YmVfdW51c2VkLAorCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJcmV0dXJuIG1hY2hpbmVfX3Byb2Nlc3NfbW1hcF9ldmVudChtYWNoaW5lLCBldmVudCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9saXZlX21hY2hpbmUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJdW5pb24gcGVyZl9ldmVudCBldmVudDsKKwlwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKworCXJldHVybiBwZXJmX2V2ZW50X19zeW50aGVzaXplX21tYXBfZXZlbnRzKE5VTEwsICZldmVudCwgcGlkLCBwaWQsCisJCQkJCQkgIG1tYXBfaGFuZGxlciwgbWFjaGluZSwgdHJ1ZSk7Cit9CisKKyNkZWZpbmUgTUFYX1NUQUNLIDYKKworc3RhdGljIGludCB1bndpbmRfZW50cnkoc3RydWN0IHVud2luZF9lbnRyeSAqZW50cnksIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nICpjbnQgPSAodW5zaWduZWQgbG9uZyAqKSBhcmc7CisJY2hhciAqc3ltYm9sID0gZW50cnktPnN5bSA/IGVudHJ5LT5zeW0tPm5hbWUgOiBOVUxMOworCXN0YXRpYyBjb25zdCBjaGFyICpmdW5jc1tNQVhfU1RBQ0tdID0geworCQkidGVzdF9fYXJjaF91bndpbmRfc2FtcGxlIiwKKwkJInVud2luZF90aHJlYWQiLAorCQkia3JhdmFfMyIsCisJCSJrcmF2YV8yIiwKKwkJImtyYXZhXzEiLAorCQkidGVzdF9fZHdhcmZfdW53aW5kIgorCX07CisKKwlpZiAoKmNudCA+PSBNQVhfU1RBQ0spIHsKKwkJcHJfZGVidWcoImZhaWxlZDogY3Jvc3NlZCB0aGUgbWF4IHN0YWNrIHZhbHVlICVkXG4iLCBNQVhfU1RBQ0spOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFzeW1ib2wpIHsKKwkJcHJfZGVidWcoImZhaWxlZDogZ290IHVucmVzb2x2ZWQgYWRkcmVzcyAweCUiIFBSSXg2NCAiXG4iLAorCQkJIGVudHJ5LT5pcCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9kZWJ1ZygiZ290OiAlcyAweCUiIFBSSXg2NCAiXG4iLCBzeW1ib2wsIGVudHJ5LT5pcCk7CisJcmV0dXJuIHN0cmNtcCgoY29uc3QgY2hhciAqKSBzeW1ib2wsIGZ1bmNzWygqY250KSsrXSk7Cit9CisKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitzdGF0aWMgaW50IHVud2luZF90aHJlYWQoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwlzdHJ1Y3QgcGVyZl9zYW1wbGUgc2FtcGxlOworCXVuc2lnbmVkIGxvbmcgY250ID0gMDsKKwlpbnQgZXJyID0gLTE7CisKKwltZW1zZXQoJnNhbXBsZSwgMCwgc2l6ZW9mKHNhbXBsZSkpOworCisJaWYgKHRlc3RfX2FyY2hfdW53aW5kX3NhbXBsZSgmc2FtcGxlLCB0aHJlYWQpKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gZ2V0IHVud2luZCBzYW1wbGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSB1bndpbmRfX2dldF9lbnRyaWVzKHVud2luZF9lbnRyeSwgJmNudCwgbWFjaGluZSwgdGhyZWFkLAorCQkJCSAgJnNhbXBsZSwgTUFYX1NUQUNLKTsKKwlpZiAoZXJyKQorCQlwcl9kZWJ1ZygidW53aW5kIGZhaWxlZFxuIik7CisJZWxzZSBpZiAoY250ICE9IE1BWF9TVEFDSykgeworCQlwcl9kZWJ1ZygiZ290IHdyb25nIG51bWJlciBvZiBzdGFjayBlbnRyaWVzICVsdSAhPSAlZFxuIiwKKwkJCSBjbnQsIE1BWF9TVEFDSyk7CisJCWVyciA9IC0xOworCX0KKworIG91dDoKKwlmcmVlKHNhbXBsZS51c2VyX3N0YWNrLmRhdGEpOworCWZyZWUoc2FtcGxlLnVzZXJfcmVncy5yZWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQorc3RhdGljIGludCBrcmF2YV8zKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJcmV0dXJuIHVud2luZF90aHJlYWQodGhyZWFkLCBtYWNoaW5lKTsKK30KKworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKK3N0YXRpYyBpbnQga3JhdmFfMihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQoreworCXJldHVybiBrcmF2YV8zKHRocmVhZCwgbWFjaGluZSk7Cit9CisKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitzdGF0aWMgaW50IGtyYXZhXzEoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwlyZXR1cm4ga3JhdmFfMih0aHJlYWQsIG1hY2hpbmUpOworfQorCitpbnQgdGVzdF9fZHdhcmZfdW53aW5kKHZvaWQpCit7CisJc3RydWN0IG1hY2hpbmVzIG1hY2hpbmVzOworCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZDsKKwlpbnQgZXJyID0gLTE7CisKKwltYWNoaW5lc19faW5pdCgmbWFjaGluZXMpOworCisJbWFjaGluZSA9IG1hY2hpbmVzX19maW5kKCZtYWNoaW5lcywgSE9TVF9LRVJORUxfSUQpOworCWlmICghbWFjaGluZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBnZXQgbWFjaGluZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW5pdF9saXZlX21hY2hpbmUobWFjaGluZSkpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgaW5pdCBtYWNoaW5lXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHZlcmJvc2UgPiAxKQorCQltYWNoaW5lX19mcHJpbnRmKG1hY2hpbmUsIHN0ZGVycik7CisKKwl0aHJlYWQgPSBtYWNoaW5lX19maW5kX3RocmVhZChtYWNoaW5lLCBnZXRwaWQoKSwgZ2V0cGlkKCkpOworCWlmICghdGhyZWFkKSB7CisJCXByX2VycigiQ291bGQgbm90IGdldCB0aHJlYWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBrcmF2YV8xKHRocmVhZCwgbWFjaGluZSk7CisKKyBvdXQ6CisJbWFjaGluZV9fZGVsZXRlX3RocmVhZHMobWFjaGluZSk7CisJbWFjaGluZV9fZXhpdChtYWNoaW5lKTsKKwltYWNoaW5lc19fZXhpdCgmbWFjaGluZXMpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2hpc3RzX2xpbmsuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCmluZGV4IDJiNjUxOWUuLjdjY2JjN2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvaGlzdHNfbGluay5jCkBAIC0xMDEsNiArMTAxLDcgQEAKIAkJCS5tbWFwID0gewogCQkJCS5oZWFkZXIgPSB7IC5taXNjID0gUEVSRl9SRUNPUkRfTUlTQ19VU0VSLCB9LAogCQkJCS5waWQgPSBmYWtlX21tYXBfaW5mb1tpXS5waWQsCisJCQkJLnRpZCA9IGZha2VfbW1hcF9pbmZvW2ldLnBpZCwKIAkJCQkuc3RhcnQgPSBmYWtlX21tYXBfaW5mb1tpXS5zdGFydCwKIAkJCQkubGVuID0gMHgxMDAwVUxMLAogCQkJCS5wZ29mZiA9IDBVTEwsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL21ha2UgYi90b29scy9wZXJmL3Rlc3RzL21ha2UKaW5kZXggMDA1NDRiOC4uNWRhZWFlMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9tYWtlCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvbWFrZQpAQCAtMjcsNiArMjcsNyBAQAogbWFrZV9ub19kZW1hbmdsZSAgICA6PSBOT19ERU1BTkdMRT0xCiBtYWtlX25vX2xpYmVsZiAgICAgIDo9IE5PX0xJQkVMRj0xCiBtYWtlX25vX2xpYnVud2luZCAgIDo9IE5PX0xJQlVOV0lORD0xCittYWtlX25vX2xpYmR3X2R3YXJmX3Vud2luZCA6PSBOT19MSUJEV19EV0FSRl9VTldJTkQ9MQogbWFrZV9ub19iYWNrdHJhY2UgICA6PSBOT19CQUNLVFJBQ0U9MQogbWFrZV9ub19saWJudW1hICAgICA6PSBOT19MSUJOVU1BPTEKIG1ha2Vfbm9fbGliYXVkaXQgICAgOj0gTk9fTElCQVVESVQ9MQpAQCAtMzUsOCArMzYsOSBAQAogbWFrZV9jc2NvcGUgICAgICAgICA6PSBjc2NvcGUKIG1ha2VfaGVscCAgICAgICAgICAgOj0gaGVscAogbWFrZV9kb2MgICAgICAgICAgICA6PSBkb2MKLW1ha2VfcGVyZl9vICAgICAgICAgOj0gcGVyZi5vCi1tYWtlX3V0aWxfbWFwX28gICAgIDo9IHV0aWwvbWFwLm8KK21ha2VfcGVyZl9vICAgICAgICAgICA6PSBwZXJmLm8KK21ha2VfdXRpbF9tYXBfbyAgICAgICA6PSB1dGlsL21hcC5vCittYWtlX3V0aWxfcG11X2Jpc29uX28gOj0gdXRpbC9wbXUtYmlzb24ubwogbWFrZV9pbnN0YWxsICAgICAgICA6PSBpbnN0YWxsCiBtYWtlX2luc3RhbGxfYmluICAgIDo9IGluc3RhbGwtYmluCiBtYWtlX2luc3RhbGxfZG9jICAgIDo9IGluc3RhbGwtZG9jCkBAIC00OSw2ICs1MSw3IEBACiBtYWtlX21pbmltYWwgICAgICAgIDo9IE5PX0xJQlBFUkw9MSBOT19MSUJQWVRIT049MSBOT19ORVdUPTEgTk9fR1RLMj0xCiBtYWtlX21pbmltYWwgICAgICAgICs9IE5PX0RFTUFOR0xFPTEgTk9fTElCRUxGPTEgTk9fTElCVU5XSU5EPTEgTk9fQkFDS1RSQUNFPTEKIG1ha2VfbWluaW1hbCAgICAgICAgKz0gTk9fTElCTlVNQT0xIE5PX0xJQkFVRElUPTEgTk9fTElCQklPTklDPTEKK21ha2VfbWluaW1hbCAgICAgICAgKz0gTk9fTElCRFdfRFdBUkZfVU5XSU5EPTEKIAogIyAkKHJ1bikgY29udGFpbnMgYWxsIGF2YWlsYWJsZSB0ZXN0cwogcnVuIDo9IG1ha2VfcHVyZQpAQCAtNjUsNiArNjgsNyBAQAogcnVuICs9IG1ha2Vfbm9fZGVtYW5nbGUKIHJ1biArPSBtYWtlX25vX2xpYmVsZgogcnVuICs9IG1ha2Vfbm9fbGlidW53aW5kCitydW4gKz0gbWFrZV9ub19saWJkd19kd2FyZl91bndpbmQKIHJ1biArPSBtYWtlX25vX2JhY2t0cmFjZQogcnVuICs9IG1ha2Vfbm9fbGlibnVtYQogcnVuICs9IG1ha2Vfbm9fbGliYXVkaXQKQEAgLTczLDYgKzc3LDcgQEAKIHJ1biArPSBtYWtlX2RvYwogcnVuICs9IG1ha2VfcGVyZl9vCiBydW4gKz0gbWFrZV91dGlsX21hcF9vCitydW4gKz0gbWFrZV91dGlsX3BtdV9iaXNvbl9vCiBydW4gKz0gbWFrZV9pbnN0YWxsCiBydW4gKz0gbWFrZV9pbnN0YWxsX2JpbgogIyBGSVhNRSAnaW5zdGFsbC0qJyBjb21tZW50ZWQgb3V0IHRpbGwgdGhleSdyZSBmaXhlZApAQCAtMTEzLDggKzExOCw5IEBACiAKIHRlc3RfbWFrZV9weXRob25fcGVyZl9zbyA6PSB0ZXN0IC1mICQoUEVSRikvcHl0aG9uL3BlcmYuc28KIAotdGVzdF9tYWtlX3BlcmZfbyAgICAgOj0gdGVzdCAtZiAkKFBFUkYpL3BlcmYubwotdGVzdF9tYWtlX3V0aWxfbWFwX28gOj0gdGVzdCAtZiAkKFBFUkYpL3V0aWwvbWFwLm8KK3Rlc3RfbWFrZV9wZXJmX28gICAgICAgICAgIDo9IHRlc3QgLWYgJChQRVJGKS9wZXJmLm8KK3Rlc3RfbWFrZV91dGlsX21hcF9vICAgICAgIDo9IHRlc3QgLWYgJChQRVJGKS91dGlsL21hcC5vCit0ZXN0X21ha2VfdXRpbF9wbXVfYmlzb25fbyA6PSB0ZXN0IC1mICQoUEVSRikvdXRpbC9wbXUtYmlzb24ubwogCiBkZWZpbmUgdGVzdF9kZXN0X2ZpbGVzCiAgIGZvciBmaWxlIGluICQoMSk7IGRvCQkJCVwKQEAgLTE2NywxMyArMTczLDEwIEBACiB0ZXN0X21ha2VfaW5zdGFsbF9wZGYgICAgOj0gJCh0ZXN0X29rKQogdGVzdF9tYWtlX2luc3RhbGxfcGRmX08gIDo9ICQodGVzdF9vaykKIAotIyBLYnVpbGQgdGVzdHMgb25seQotI3Rlc3RfbWFrZV9weXRob25fcGVyZl9zb19PIDo9IHRlc3QgLWYgJCRUTVAvdG9vbHMvcGVyZi9weXRob24vcGVyZi5zbwotI3Rlc3RfbWFrZV9wZXJmX29fTyAgICAgICAgIDo9IHRlc3QgLWYgJCRUTVAvdG9vbHMvcGVyZi9wZXJmLm8KLSN0ZXN0X21ha2VfdXRpbF9tYXBfb19PICAgICA6PSB0ZXN0IC1mICQkVE1QL3Rvb2xzL3BlcmYvdXRpbC9tYXAubwotCi10ZXN0X21ha2VfcGVyZl9vX08gICAgIDo9IHRydWUKLXRlc3RfbWFrZV91dGlsX21hcF9vX08gOj0gdHJ1ZQordGVzdF9tYWtlX3B5dGhvbl9wZXJmX3NvX08gICAgOj0gdGVzdCAtZiAkJFRNUF9PL3B5dGhvbi9wZXJmLnNvCit0ZXN0X21ha2VfcGVyZl9vX08gICAgICAgICAgICA6PSB0ZXN0IC1mICQkVE1QX08vcGVyZi5vCit0ZXN0X21ha2VfdXRpbF9tYXBfb19PICAgICAgICA6PSB0ZXN0IC1mICQkVE1QX08vdXRpbC9tYXAubwordGVzdF9tYWtlX3V0aWxfcG11X2Jpc29uX29fTyA6PSB0ZXN0IC1mICQkVE1QX08vdXRpbC9wbXUtYmlzb24ubwogCiB0ZXN0X2RlZmF1bHQgPSB0ZXN0IC14ICQoUEVSRikvcGVyZgogdGVzdCA9ICQoaWYgJCh0ZXN0XyQxKSwkKHRlc3RfJDEpLCQodGVzdF9kZWZhdWx0KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvcGFyc2UtZXZlbnRzLmMgYi90b29scy9wZXJmL3Rlc3RzL3BhcnNlLWV2ZW50cy5jCmluZGV4IDRkYjBhZTYuLjg2MDVmZjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9wYXJzZS1ldmVudHMuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJwYXJzZS1ldmVudHMuaCIKICNpbmNsdWRlICJldnNlbC5oIgogI2luY2x1ZGUgImV2bGlzdC5oIgotI2luY2x1ZGUgImZzLmgiCisjaW5jbHVkZSA8YXBpL2ZzL2ZzLmg+CiAjaW5jbHVkZSA8YXBpL2ZzL2RlYnVnZnMuaD4KICNpbmNsdWRlICJ0ZXN0cy5oIgogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvc2FtcGxlLXBhcnNpbmcuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvc2FtcGxlLXBhcnNpbmcuYwppbmRleCAxYjY3NzIwLi4wMDE0ZDNjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL3NhbXBsZS1wYXJzaW5nLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9zYW1wbGUtcGFyc2luZy5jCkBAIC0yMiw4ICsyMiw4IEBACiB9IHdoaWxlICgwKQogCiBzdGF0aWMgYm9vbCBzYW1wbGVzX3NhbWUoY29uc3Qgc3RydWN0IHBlcmZfc2FtcGxlICpzMSwKLQkJCSBjb25zdCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnMyLCB1NjQgdHlwZSwgdTY0IHJlZ3NfdXNlciwKLQkJCSB1NjQgcmVhZF9mb3JtYXQpCisJCQkgY29uc3Qgc3RydWN0IHBlcmZfc2FtcGxlICpzMiwKKwkJCSB1NjQgdHlwZSwgdTY0IHJlYWRfZm9ybWF0KQogewogCXNpemVfdCBpOwogCkBAIC05NSw4ICs5NSw5IEBACiAJfQogCiAJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9SRUdTX1VTRVIpIHsKLQkJc2l6ZV90IHN6ID0gaHdlaWdodF9sb25nKHJlZ3NfdXNlcikgKiBzaXplb2YodTY0KTsKKwkJc2l6ZV90IHN6ID0gaHdlaWdodF9sb25nKHMxLT51c2VyX3JlZ3MubWFzaykgKiBzaXplb2YodTY0KTsKIAorCQlDT01QKHVzZXJfcmVncy5tYXNrKTsKIAkJQ09NUCh1c2VyX3JlZ3MuYWJpKTsKIAkJaWYgKHMxLT51c2VyX3JlZ3MuYWJpICYmCiAJCSAgICAoIXMxLT51c2VyX3JlZ3MucmVncyB8fCAhczItPnVzZXJfcmVncy5yZWdzIHx8CkBAIC0xNzQsNiArMTc1LDcgQEAKIAkJLmJyYW5jaF9zdGFjawk9ICZicmFuY2hfc3RhY2suYnJhbmNoX3N0YWNrLAogCQkudXNlcl9yZWdzCT0gewogCQkJLmFiaQk9IFBFUkZfU0FNUExFX1JFR1NfQUJJXzY0LAorCQkJLm1hc2sJPSBzYW1wbGVfcmVnc191c2VyLAogCQkJLnJlZ3MJPSB1c2VyX3JlZ3MsCiAJCX0sCiAJCS51c2VyX3N0YWNrCT0gewpAQCAtMjAxLDggKzIwMyw3IEBACiAJCXNhbXBsZS5yZWFkLm9uZS5pZCAgICA9IDk5OwogCX0KIAotCXN6ID0gcGVyZl9ldmVudF9fc2FtcGxlX2V2ZW50X3NpemUoJnNhbXBsZSwgc2FtcGxlX3R5cGUsCi0JCQkJCSAgIHNhbXBsZV9yZWdzX3VzZXIsIHJlYWRfZm9ybWF0KTsKKwlzeiA9IHBlcmZfZXZlbnRfX3NhbXBsZV9ldmVudF9zaXplKCZzYW1wbGUsIHNhbXBsZV90eXBlLCByZWFkX2Zvcm1hdCk7CiAJYnVmc3ogPSBzeiArIDQwOTY7IC8qIEFkZCBhIGJpdCBmb3Igb3ZlcnJ1biBjaGVja2luZyAqLwogCWV2ZW50ID0gbWFsbG9jKGJ1ZnN6KTsKIAlpZiAoIWV2ZW50KSB7CkBAIC0yMTUsOCArMjE2LDcgQEAKIAlldmVudC0+aGVhZGVyLm1pc2MgPSAwOwogCWV2ZW50LT5oZWFkZXIuc2l6ZSA9IHN6OwogCi0JZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUoZXZlbnQsIHNhbXBsZV90eXBlLAotCQkJCQkgICAgc2FtcGxlX3JlZ3NfdXNlciwgcmVhZF9mb3JtYXQsCisJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUoZXZlbnQsIHNhbXBsZV90eXBlLCByZWFkX2Zvcm1hdCwKIAkJCQkJICAgICZzYW1wbGUsIGZhbHNlKTsKIAlpZiAoZXJyKSB7CiAJCXByX2RlYnVnKCIlcyBmYWlsZWQgZm9yIHNhbXBsZV90eXBlICUjIlBSSXg2NCIsIGVycm9yICVkXG4iLApAQCAtMjQ0LDggKzI0NCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JaWYgKCFzYW1wbGVzX3NhbWUoJnNhbXBsZSwgJnNhbXBsZV9vdXQsIHNhbXBsZV90eXBlLAotCQkJICBzYW1wbGVfcmVnc191c2VyLCByZWFkX2Zvcm1hdCkpIHsKKwlpZiAoIXNhbXBsZXNfc2FtZSgmc2FtcGxlLCAmc2FtcGxlX291dCwgc2FtcGxlX3R5cGUsIHJlYWRfZm9ybWF0KSkgewogCQlwcl9kZWJ1ZygicGFyc2luZyBmYWlsZWQgZm9yIHNhbXBsZV90eXBlICUjIlBSSXg2NCJcbiIsCiAJCQkgc2FtcGxlX3R5cGUpOwogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy90ZXN0cy5oIGIvdG9vbHMvcGVyZi90ZXN0cy90ZXN0cy5oCmluZGV4IGUwYWM3MTMuLmEyNDc5NWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvdGVzdHMuaAorKysgYi90b29scy9wZXJmL3Rlc3RzL3Rlc3RzLmgKQEAgLTQwLDUgKzQwLDE0IEBACiBpbnQgdGVzdF9fc2FtcGxlX3BhcnNpbmcodm9pZCk7CiBpbnQgdGVzdF9fa2VlcF90cmFja2luZyh2b2lkKTsKIGludCB0ZXN0X19wYXJzZV9ub19zYW1wbGVfaWRfYWxsKHZvaWQpOworaW50IHRlc3RfX2R3YXJmX3Vud2luZCh2b2lkKTsKIAorI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykKKyNpZmRlZiBIQVZFX0RXQVJGX1VOV0lORF9TVVBQT1JUCitzdHJ1Y3QgdGhyZWFkOworc3RydWN0IHBlcmZfc2FtcGxlOworaW50IHRlc3RfX2FyY2hfdW53aW5kX3NhbXBsZShzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKKyNlbmRpZgorI2VuZGlmCiAjZW5kaWYgLyogVEVTVFNfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jCmluZGV4IGI3MjBiOTIuLjdlYzg3MWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMKQEAgLTU4Nyw5NSArNTg3LDUyIEBACiAJYm9vbCBjdXJyZW50X2VudHJ5OwogfTsKIAotc3RhdGljIGludCBfX2hwcF9fY29sb3JfY2FsbGNoYWluKHN0cnVjdCBocHBfYXJnICphcmcpCitzdGF0aWMgaW50IF9faHBwX19vdmVyaGVhZF9jYWxsYmFjayhzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgYm9vbCBmcm9udCkKIHsKLQlpZiAoIXN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pCi0JCXJldHVybiAwOwotCi0Jc2xzbWdfcHJpbnRmKCIlYyAiLCBhcmctPmZvbGRlZF9zaWduKTsKLQlyZXR1cm4gMjsKLX0KLQotc3RhdGljIGludCBfX2hwcF9fY29sb3JfZm10KHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsCi0JCQkgICAgdTY0ICgqZ2V0X2ZpZWxkKShzdHJ1Y3QgaGlzdF9lbnRyeSAqKSwKLQkJCSAgICBpbnQgKCpjYWxsY2hhaW5fY2IpKHN0cnVjdCBocHBfYXJnICopKQotewotCWludCByZXQgPSAwOwotCWRvdWJsZSBwZXJjZW50ID0gMC4wOwotCXN0cnVjdCBoaXN0cyAqaGlzdHMgPSBoZS0+aGlzdHM7CiAJc3RydWN0IGhwcF9hcmcgKmFyZyA9IGhwcC0+cHRyOwogCi0JaWYgKGhpc3RzLT5zdGF0cy50b3RhbF9wZXJpb2QpCi0JCXBlcmNlbnQgPSAxMDAuMCAqIGdldF9maWVsZChoZSkgLyBoaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOworCWlmIChhcmctPmN1cnJlbnRfZW50cnkgJiYgYXJnLT5iLT5uYXZrZXlwcmVzc2VkKQorCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9TRUxFQ1RFRCk7CisJZWxzZQorCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9OT1JNQUwpOworCisJaWYgKGZyb250KSB7CisJCWlmICghc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikKKwkJCXJldHVybiAwOworCisJCXNsc21nX3ByaW50ZigiJWMgIiwgYXJnLT5mb2xkZWRfc2lnbik7CisJCXJldHVybiAyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faHBwX19jb2xvcl9jYWxsYmFjayhzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgYm9vbCBmcm9udCBfX21heWJlX3VudXNlZCkKK3sKKwlzdHJ1Y3QgaHBwX2FyZyAqYXJnID0gaHBwLT5wdHI7CisKKwlpZiAoIWFyZy0+Y3VycmVudF9lbnRyeSB8fCAhYXJnLT5iLT5uYXZrZXlwcmVzc2VkKQorCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9OT1JNQUwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faHBwX19zbHNtZ19jb2xvcl9wcmludGYoc3RydWN0IHBlcmZfaHBwICpocHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBocHBfYXJnICphcmcgPSBocHAtPnB0cjsKKwlpbnQgcmV0OworCXZhX2xpc3QgYXJnczsKKwlkb3VibGUgcGVyY2VudDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcGVyY2VudCA9IHZhX2FyZyhhcmdzLCBkb3VibGUpOworCXZhX2VuZChhcmdzKTsKIAogCXVpX2Jyb3dzZXJfX3NldF9wZXJjZW50X2NvbG9yKGFyZy0+YiwgcGVyY2VudCwgYXJnLT5jdXJyZW50X2VudHJ5KTsKIAotCWlmIChjYWxsY2hhaW5fY2IpCi0JCXJldCArPSBjYWxsY2hhaW5fY2IoYXJnKTsKLQotCXJldCArPSBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgIiU2LjJmJSUiLCBwZXJjZW50KTsKKwlyZXQgPSBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgZm10LCBwZXJjZW50KTsKIAlzbHNtZ19wcmludGYoIiVzIiwgaHBwLT5idWYpOwogCi0JaWYgKHN5bWJvbF9jb25mLmV2ZW50X2dyb3VwKSB7Ci0JCWludCBwcmV2X2lkeCwgaWR4X2RlbHRhOwotCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBoaXN0c190b19ldnNlbChoaXN0cyk7Ci0JCXN0cnVjdCBoaXN0X2VudHJ5ICpwYWlyOwotCQlpbnQgbnJfbWVtYmVycyA9IGV2c2VsLT5ucl9tZW1iZXJzOwotCi0JCWlmIChucl9tZW1iZXJzIDw9IDEpCi0JCQlnb3RvIG91dDsKLQotCQlwcmV2X2lkeCA9IHBlcmZfZXZzZWxfX2dyb3VwX2lkeChldnNlbCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWlyLCAmaGUtPnBhaXJzLmhlYWQsIHBhaXJzLm5vZGUpIHsKLQkJCXU2NCBwZXJpb2QgPSBnZXRfZmllbGQocGFpcik7Ci0JCQl1NjQgdG90YWwgPSBwYWlyLT5oaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOwotCi0JCQlpZiAoIXRvdGFsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlldnNlbCA9IGhpc3RzX3RvX2V2c2VsKHBhaXItPmhpc3RzKTsKLQkJCWlkeF9kZWx0YSA9IHBlcmZfZXZzZWxfX2dyb3VwX2lkeChldnNlbCkgLSBwcmV2X2lkeCAtIDE7Ci0KLQkJCXdoaWxlIChpZHhfZGVsdGEtLSkgewotCQkJCS8qCi0JCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgaW4gdGhlIG1pZGRsZSB3aGljaAotCQkJCSAqIGhhdmUgbm8gc2FtcGxlCi0JCQkJICovCi0JCQkJdWlfYnJvd3Nlcl9fc2V0X3BlcmNlbnRfY29sb3IoYXJnLT5iLCAwLjAsCi0JCQkJCQkJYXJnLT5jdXJyZW50X2VudHJ5KTsKLQkJCQlyZXQgKz0gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsCi0JCQkJCQkgIiAlNi4yZiUlIiwgMC4wKTsKLQkJCQlzbHNtZ19wcmludGYoIiVzIiwgaHBwLT5idWYpOwotCQkJfQotCi0JCQlwZXJjZW50ID0gMTAwLjAgKiBwZXJpb2QgLyB0b3RhbDsKLQkJCXVpX2Jyb3dzZXJfX3NldF9wZXJjZW50X2NvbG9yKGFyZy0+YiwgcGVyY2VudCwKLQkJCQkJCSAgICAgIGFyZy0+Y3VycmVudF9lbnRyeSk7Ci0JCQlyZXQgKz0gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsCi0JCQkJCSAiICU2LjJmJSUiLCBwZXJjZW50KTsKLQkJCXNsc21nX3ByaW50ZigiJXMiLCBocHAtPmJ1Zik7Ci0KLQkJCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKLQkJfQotCi0JCWlkeF9kZWx0YSA9IG5yX21lbWJlcnMgLSBwcmV2X2lkeCAtIDE7Ci0KLQkJd2hpbGUgKGlkeF9kZWx0YS0tKSB7Ci0JCQkvKgotCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgYXQgbGFzdCB3aGljaCBoYXZlIG5vIHNhbXBsZQotCQkJICovCi0JCQl1aV9icm93c2VyX19zZXRfcGVyY2VudF9jb2xvcihhcmctPmIsIDAuMCwKLQkJCQkJCSAgICAgIGFyZy0+Y3VycmVudF9lbnRyeSk7Ci0JCQlyZXQgKz0gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsCi0JCQkJCSAiICU2LjJmJSUiLCAwLjApOwotCQkJc2xzbWdfcHJpbnRmKCIlcyIsIGhwcC0+YnVmKTsKLQkJfQotCX0KLW91dDoKLQlpZiAoIWFyZy0+Y3VycmVudF9lbnRyeSB8fCAhYXJnLT5iLT5uYXZrZXlwcmVzc2VkKQotCQl1aV9icm93c2VyX19zZXRfY29sb3IoYXJnLT5iLCBIRV9DT0xPUlNFVF9OT1JNQUwpOwotCisJYWR2YW5jZV9ocHAoaHBwLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY5MCwxNCArNjQ3LDE1IEBACiAJCQkJc3RydWN0IHBlcmZfaHBwICpocHAsCQkJXAogCQkJCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSkJCQlcCiB7CQkJCQkJCQkJXAotCXJldHVybiBfX2hwcF9fY29sb3JfZm10KGhwcCwgaGUsIF9faHBwX2dldF8jI19maWVsZCwgX2NiKTsJXAorCXJldHVybiBfX2hwcF9fZm10KGhwcCwgaGUsIF9faHBwX2dldF8jI19maWVsZCwgX2NiLCAiICU2LjJmJSUiLAlcCisJCQkgIF9faHBwX19zbHNtZ19jb2xvcl9wcmludGYsIHRydWUpOwkJXAogfQogCi1fX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkLCBwZXJpb2QsIF9faHBwX19jb2xvcl9jYWxsY2hhaW4pCi1fX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX3N5cywgcGVyaW9kX3N5cywgTlVMTCkKLV9fSFBQX0NPTE9SX1BFUkNFTlRfRk4ob3ZlcmhlYWRfdXMsIHBlcmlvZF91cywgTlVMTCkKLV9fSFBQX0NPTE9SX1BFUkNFTlRfRk4ob3ZlcmhlYWRfZ3Vlc3Rfc3lzLCBwZXJpb2RfZ3Vlc3Rfc3lzLCBOVUxMKQotX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF9ndWVzdF91cywgcGVyaW9kX2d1ZXN0X3VzLCBOVUxMKQorX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZCwgcGVyaW9kLCBfX2hwcF9fb3ZlcmhlYWRfY2FsbGJhY2spCitfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX3N5cywgcGVyaW9kX3N5cywgX19ocHBfX2NvbG9yX2NhbGxiYWNrKQorX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF91cywgcGVyaW9kX3VzLCBfX2hwcF9fY29sb3JfY2FsbGJhY2spCitfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOKG92ZXJoZWFkX2d1ZXN0X3N5cywgcGVyaW9kX2d1ZXN0X3N5cywgX19ocHBfX2NvbG9yX2NhbGxiYWNrKQorX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZF9ndWVzdF91cywgcGVyaW9kX2d1ZXN0X3VzLCBfX2hwcF9fY29sb3JfY2FsbGJhY2spCiAKICN1bmRlZiBfX0hQUF9DT0xPUl9QRVJDRU5UX0ZOCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMgYi90b29scy9wZXJmL3VpL2d0ay9oaXN0cy5jCmluZGV4IDViOTVjNDQuLmUzOTVlZjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMKKysrIGIvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYwpAQCAtOCwxNiArOCwyNCBAQAogCiAjZGVmaW5lIE1BWF9DT0xVTU5TCQkJMzIKIAotc3RhdGljIGludCBfX3BlcmNlbnRfY29sb3Jfc25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgZG91YmxlIHBlcmNlbnQpCitzdGF0aWMgaW50IF9fcGVyY2VudF9jb2xvcl9zbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJaW50IHJldCA9IDA7CisJdmFfbGlzdCBhcmdzOworCWRvdWJsZSBwZXJjZW50OwogCWNvbnN0IGNoYXIgKm1hcmt1cDsKKwljaGFyICpidWYgPSBocHAtPmJ1ZjsKKwlzaXplX3Qgc2l6ZSA9IGhwcC0+c2l6ZTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcGVyY2VudCA9IHZhX2FyZyhhcmdzLCBkb3VibGUpOworCXZhX2VuZChhcmdzKTsKIAogCW1hcmt1cCA9IHBlcmZfZ3RrX19nZXRfcGVyY2VudF9jb2xvcihwZXJjZW50KTsKIAlpZiAobWFya3VwKQogCQlyZXQgKz0gc2NucHJpbnRmKGJ1Ziwgc2l6ZSwgbWFya3VwKTsKIAotCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBzaXplIC0gcmV0LCAiICU2LjJmJSUiLCBwZXJjZW50KTsKKwlyZXQgKz0gc2NucHJpbnRmKGJ1ZiArIHJldCwgc2l6ZSAtIHJldCwgZm10LCBwZXJjZW50KTsKIAogCWlmIChtYXJrdXApCiAJCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBzaXplIC0gcmV0LCAiPC9zcGFuPiIpOwpAQCAtMjUsNjYgKzMzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KLXN0YXRpYyBpbnQgX19ocHBfX2NvbG9yX2ZtdChzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlLAotCQkJICAgIHU2NCAoKmdldF9maWVsZCkoc3RydWN0IGhpc3RfZW50cnkgKikpCi17Ci0JaW50IHJldDsKLQlkb3VibGUgcGVyY2VudCA9IDAuMDsKLQlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gaGUtPmhpc3RzOwotCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGhpc3RzX3RvX2V2c2VsKGhpc3RzKTsKLQotCWlmIChoaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kKQotCQlwZXJjZW50ID0gMTAwLjAgKiBnZXRfZmllbGQoaGUpIC8gaGlzdHMtPnN0YXRzLnRvdGFsX3BlcmlvZDsKLQotCXJldCA9IF9fcGVyY2VudF9jb2xvcl9zbnByaW50ZihocHAtPmJ1ZiwgaHBwLT5zaXplLCBwZXJjZW50KTsKLQotCWlmIChwZXJmX2V2c2VsX19pc19ncm91cF9ldmVudChldnNlbCkpIHsKLQkJaW50IHByZXZfaWR4LCBpZHhfZGVsdGE7Ci0JCXN0cnVjdCBoaXN0X2VudHJ5ICpwYWlyOwotCQlpbnQgbnJfbWVtYmVycyA9IGV2c2VsLT5ucl9tZW1iZXJzOwotCi0JCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhaXIsICZoZS0+cGFpcnMuaGVhZCwgcGFpcnMubm9kZSkgewotCQkJdTY0IHBlcmlvZCA9IGdldF9maWVsZChwYWlyKTsKLQkJCXU2NCB0b3RhbCA9IHBhaXItPmhpc3RzLT5zdGF0cy50b3RhbF9wZXJpb2Q7Ci0KLQkJCWV2c2VsID0gaGlzdHNfdG9fZXZzZWwocGFpci0+aGlzdHMpOwotCQkJaWR4X2RlbHRhID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKSAtIHByZXZfaWR4IC0gMTsKLQotCQkJd2hpbGUgKGlkeF9kZWx0YS0tKSB7Ci0JCQkJLyoKLQkJCQkgKiB6ZXJvLWZpbGwgZ3JvdXAgbWVtYmVycyBpbiB0aGUgbWlkZGxlIHdoaWNoCi0JCQkJICogaGF2ZSBubyBzYW1wbGUKLQkJCQkgKi8KLQkJCQlyZXQgKz0gX19wZXJjZW50X2NvbG9yX3NucHJpbnRmKGhwcC0+YnVmICsgcmV0LAotCQkJCQkJCQlocHAtPnNpemUgLSByZXQsCi0JCQkJCQkJCTAuMCk7Ci0JCQl9Ci0KLQkJCXBlcmNlbnQgPSAxMDAuMCAqIHBlcmlvZCAvIHRvdGFsOwotCQkJcmV0ICs9IF9fcGVyY2VudF9jb2xvcl9zbnByaW50ZihocHAtPmJ1ZiArIHJldCwKLQkJCQkJCQlocHAtPnNpemUgLSByZXQsCi0JCQkJCQkJcGVyY2VudCk7Ci0KLQkJCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKLQkJfQotCi0JCWlkeF9kZWx0YSA9IG5yX21lbWJlcnMgLSBwcmV2X2lkeCAtIDE7Ci0KLQkJd2hpbGUgKGlkeF9kZWx0YS0tKSB7Ci0JCQkvKgotCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgYXQgbGFzdCB3aGljaCBoYXZlIG5vIHNhbXBsZQotCQkJICovCi0JCQlyZXQgKz0gX19wZXJjZW50X2NvbG9yX3NucHJpbnRmKGhwcC0+YnVmICsgcmV0LAotCQkJCQkJCWhwcC0+c2l6ZSAtIHJldCwKLQkJCQkJCQkwLjApOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KICNkZWZpbmUgX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihfdHlwZSwgX2ZpZWxkKQkJCQkJXAogc3RhdGljIHU2NCBoZV9nZXRfIyNfZmllbGQoc3RydWN0IGhpc3RfZW50cnkgKmhlKQkJCQlcCiB7CQkJCQkJCQkJCVwKQEAgLTk1LDcgKzQzLDggQEAKIAkJCQkgICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsCQkJXAogCQkJCSAgICAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCQkJXAogewkJCQkJCQkJCQlcCi0JcmV0dXJuIF9faHBwX19jb2xvcl9mbXQoaHBwLCBoZSwgaGVfZ2V0XyMjX2ZpZWxkKTsJCQlcCisJcmV0dXJuIF9faHBwX19mbXQoaHBwLCBoZSwgaGVfZ2V0XyMjX2ZpZWxkLCBOVUxMLCAiICU2LjJmJSUiLAkJXAorCQkJICBfX3BlcmNlbnRfY29sb3Jfc25wcmludGYsIHRydWUpOwkJCVwKIH0KIAogX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihvdmVyaGVhZCwgcGVyaW9kKQpAQCAtMjE2LDcgKzE2NSw2IEBACiAJc3RydWN0IHBlcmZfaHBwIGhwcCA9IHsKIAkJLmJ1ZgkJPSBzLAogCQkuc2l6ZQkJPSBzaXplb2YocyksCi0JCS5wdHIJCT0gaGlzdHNfdG9fZXZzZWwoaGlzdHMpLAogCX07CiAKIAlucl9jb2xzID0gMDsKQEAgLTI0Myw3ICsxOTEsNyBAQAogCWNvbF9pZHggPSAwOwogCiAJcGVyZl9ocHBfX2Zvcl9lYWNoX2Zvcm1hdChmbXQpIHsKLQkJZm10LT5oZWFkZXIoZm10LCAmaHBwKTsKKwkJZm10LT5oZWFkZXIoZm10LCAmaHBwLCBoaXN0c190b19ldnNlbChoaXN0cykpOwogCiAJCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFVyh2aWV3KSwKIAkJCQkJCQkgICAgLTEsIGx0cmltKHMpLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9oaXN0LmMgYi90b29scy9wZXJmL3VpL2hpc3QuYwppbmRleCA3OGY0YzkyLi4wZjQwM2I4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL2hpc3QuYwpAQCAtOCwxNiArOCwyNyBAQAogCiAvKiBoaXN0IHBlcmlvZCBwcmludCAoaHBwKSBmdW5jdGlvbnMgKi8KIAotdHlwZWRlZiBpbnQgKCpocHBfc25wcmludF9mbikoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSBocHBfX2NhbGxfcHJpbnRfZm4oaHBwLCBmbiwgZm10LCAuLi4pCQkJXAorKHsJCQkJCQkJCVwKKwlpbnQgX19yZXQgPSBmbihocHAsIGZtdCwgIyNfX1ZBX0FSR1NfXyk7CQlcCisJYWR2YW5jZV9ocHAoaHBwLCBfX3JldCk7CQkJCVwKKwlfX3JldDsJCQkJCQkJXAorfSkKIAotc3RhdGljIGludCBfX2hwcF9fZm10KHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsCi0JCSAgICAgIHU2NCAoKmdldF9maWVsZCkoc3RydWN0IGhpc3RfZW50cnkgKiksCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sCi0JCSAgICAgIGJvb2wgZm10X3BlcmNlbnQpCitpbnQgX19ocHBfX2ZtdChzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlLAorCSAgICAgICBocHBfZmllbGRfZm4gZ2V0X2ZpZWxkLCBocHBfY2FsbGJhY2tfZm4gY2FsbGJhY2ssCisJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sIGJvb2wgZm10X3BlcmNlbnQpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gaGUtPmhpc3RzOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGhpc3RzX3RvX2V2c2VsKGhpc3RzKTsKKwljaGFyICpidWYgPSBocHAtPmJ1ZjsKKwlzaXplX3Qgc2l6ZSA9IGhwcC0+c2l6ZTsKKworCWlmIChjYWxsYmFjaykgeworCQlyZXQgPSBjYWxsYmFjayhocHAsIHRydWUpOworCQlhZHZhbmNlX2hwcChocHAsIHJldCk7CisJfQogCiAJaWYgKGZtdF9wZXJjZW50KSB7CiAJCWRvdWJsZSBwZXJjZW50ID0gMC4wOwpAQCAtMjYsOSArMzcsOSBAQAogCQkJcGVyY2VudCA9IDEwMC4wICogZ2V0X2ZpZWxkKGhlKSAvCiAJCQkJICBoaXN0cy0+c3RhdHMudG90YWxfcGVyaW9kOwogCi0JCXJldCA9IHByaW50X2ZuKGhwcC0+YnVmLCBocHAtPnNpemUsIGZtdCwgcGVyY2VudCk7CisJCXJldCArPSBocHBfX2NhbGxfcHJpbnRfZm4oaHBwLCBwcmludF9mbiwgZm10LCBwZXJjZW50KTsKIAl9IGVsc2UKLQkJcmV0ID0gcHJpbnRfZm4oaHBwLT5idWYsIGhwcC0+c2l6ZSwgZm10LCBnZXRfZmllbGQoaGUpKTsKKwkJcmV0ICs9IGhwcF9fY2FsbF9wcmludF9mbihocHAsIHByaW50X2ZuLCBmbXQsIGdldF9maWVsZChoZSkpOwogCiAJaWYgKHBlcmZfZXZzZWxfX2lzX2dyb3VwX2V2ZW50KGV2c2VsKSkgewogCQlpbnQgcHJldl9pZHgsIGlkeF9kZWx0YTsKQEAgLTUyLDE2ICs2MywyMiBAQAogCQkJCSAqIHplcm8tZmlsbCBncm91cCBtZW1iZXJzIGluIHRoZSBtaWRkbGUgd2hpY2gKIAkJCQkgKiBoYXZlIG5vIHNhbXBsZQogCQkJCSAqLwotCQkJCXJldCArPSBwcmludF9mbihocHAtPmJ1ZiArIHJldCwgaHBwLT5zaXplIC0gcmV0LAotCQkJCQkJZm10LCAwKTsKKwkJCQlpZiAoZm10X3BlcmNlbnQpIHsKKwkJCQkJcmV0ICs9IGhwcF9fY2FsbF9wcmludF9mbihocHAsIHByaW50X2ZuLAorCQkJCQkJCQkgIGZtdCwgMC4wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXQgKz0gaHBwX19jYWxsX3ByaW50X2ZuKGhwcCwgcHJpbnRfZm4sCisJCQkJCQkJCSAgZm10LCAwVUxMKTsKKwkJCQl9CiAJCQl9CiAKLQkJCWlmIChmbXRfcGVyY2VudCkKLQkJCQlyZXQgKz0gcHJpbnRfZm4oaHBwLT5idWYgKyByZXQsIGhwcC0+c2l6ZSAtIHJldCwKLQkJCQkJCWZtdCwgMTAwLjAgKiBwZXJpb2QgLyB0b3RhbCk7Ci0JCQllbHNlCi0JCQkJcmV0ICs9IHByaW50X2ZuKGhwcC0+YnVmICsgcmV0LCBocHAtPnNpemUgLSByZXQsCi0JCQkJCQlmbXQsIHBlcmlvZCk7CisJCQlpZiAoZm10X3BlcmNlbnQpIHsKKwkJCQlyZXQgKz0gaHBwX19jYWxsX3ByaW50X2ZuKGhwcCwgcHJpbnRfZm4sIGZtdCwKKwkJCQkJCQkgIDEwMC4wICogcGVyaW9kIC8gdG90YWwpOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgKz0gaHBwX19jYWxsX3ByaW50X2ZuKGhwcCwgcHJpbnRfZm4sIGZtdCwKKwkJCQkJCQkgIHBlcmlvZCk7CisJCQl9CiAKIAkJCXByZXZfaWR4ID0gcGVyZl9ldnNlbF9fZ3JvdXBfaWR4KGV2c2VsKTsKIAkJfQpAQCAtNzIsNDEgKzg5LDg3IEBACiAJCQkvKgogCQkJICogemVyby1maWxsIGdyb3VwIG1lbWJlcnMgYXQgbGFzdCB3aGljaCBoYXZlIG5vIHNhbXBsZQogCQkJICovCi0JCQlyZXQgKz0gcHJpbnRfZm4oaHBwLT5idWYgKyByZXQsIGhwcC0+c2l6ZSAtIHJldCwKLQkJCQkJZm10LCAwKTsKKwkJCWlmIChmbXRfcGVyY2VudCkgeworCQkJCXJldCArPSBocHBfX2NhbGxfcHJpbnRfZm4oaHBwLCBwcmludF9mbiwKKwkJCQkJCQkgIGZtdCwgMC4wKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ICs9IGhwcF9fY2FsbF9wcmludF9mbihocHAsIHByaW50X2ZuLAorCQkJCQkJCSAgZm10LCAwVUxMKTsKKwkJCX0KIAkJfQogCX0KKworCWlmIChjYWxsYmFjaykgeworCQlpbnQgX19yZXQgPSBjYWxsYmFjayhocHAsIGZhbHNlKTsKKworCQlhZHZhbmNlX2hwcChocHAsIF9fcmV0KTsKKwkJcmV0ICs9IF9fcmV0OworCX0KKworCS8qCisJICogUmVzdG9yZSBvcmlnaW5hbCBidWYgYW5kIHNpemUgYXMgaXQncyB3aGVyZSBjYWxsZXIgZXhwZWN0cworCSAqIHRoZSByZXN1bHQgd2lsbCBiZSBzYXZlZC4KKwkgKi8KKwlocHAtPmJ1ZiA9IGJ1ZjsKKwlocHAtPnNpemUgPSBzaXplOworCiAJcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBfX0hQUF9IRUFERVJfRk4oX3R5cGUsIF9zdHIsIF9taW5fd2lkdGgsIF91bml0X3dpZHRoKSAJCVwKIHN0YXRpYyBpbnQgaHBwX19oZWFkZXJfIyNfdHlwZShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQgX19tYXliZV91bnVzZWQsCVwKLQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCkJCQlcCisJCQkgICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsCQkJXAorCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkJCVwKIHsJCQkJCQkJCQlcCiAJaW50IGxlbiA9IF9taW5fd2lkdGg7CQkJCQkJXAogCQkJCQkJCQkJXAotCWlmIChzeW1ib2xfY29uZi5ldmVudF9ncm91cCkgewkJCQkJXAotCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBocHAtPnB0cjsJCQlcCi0JCQkJCQkJCQlcCisJaWYgKHN5bWJvbF9jb25mLmV2ZW50X2dyb3VwKQkJCQkJXAogCQlsZW4gPSBtYXgobGVuLCBldnNlbC0+bnJfbWVtYmVycyAqIF91bml0X3dpZHRoKTsJXAotCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKIAlyZXR1cm4gc2NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsICIlKnMiLCBsZW4sIF9zdHIpOwlcCiB9CiAKICNkZWZpbmUgX19IUFBfV0lEVEhfRk4oX3R5cGUsIF9taW5fd2lkdGgsIF91bml0X3dpZHRoKSAJCQlcCiBzdGF0aWMgaW50IGhwcF9fd2lkdGhfIyNfdHlwZShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQgX19tYXliZV91bnVzZWQsCVwKLQkJCSAgICAgIHN0cnVjdCBwZXJmX2hwcCAqaHBwIF9fbWF5YmVfdW51c2VkKQlcCisJCQkgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCBfX21heWJlX3VudXNlZCwJXAorCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKQkJCVwKIHsJCQkJCQkJCQlcCiAJaW50IGxlbiA9IF9taW5fd2lkdGg7CQkJCQkJXAogCQkJCQkJCQkJXAotCWlmIChzeW1ib2xfY29uZi5ldmVudF9ncm91cCkgewkJCQkJXAotCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBocHAtPnB0cjsJCQlcCi0JCQkJCQkJCQlcCisJaWYgKHN5bWJvbF9jb25mLmV2ZW50X2dyb3VwKQkJCQkJXAogCQlsZW4gPSBtYXgobGVuLCBldnNlbC0+bnJfbWVtYmVycyAqIF91bml0X3dpZHRoKTsJXAotCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKIAlyZXR1cm4gbGVuOwkJCQkJCQlcCiB9CiAKK3N0YXRpYyBpbnQgaHBwX2NvbG9yX3NjbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXNzaXplX3Qgc3NpemUgPSBocHAtPnNpemU7CisJZG91YmxlIHBlcmNlbnQ7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcGVyY2VudCA9IHZhX2FyZyhhcmdzLCBkb3VibGUpOworCXJldCA9IHZhbHVlX2NvbG9yX3NucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsIGZtdCwgcGVyY2VudCk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChyZXQgPj0gc3NpemUpID8gKHNzaXplIC0gMSkgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHBwX2VudHJ5X3NjbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXNzaXplX3Qgc3NpemUgPSBocHAtPnNpemU7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmV0ID0gdnNucHJpbnRmKGhwcC0+YnVmLCBocHAtPnNpemUsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChyZXQgPj0gc3NpemUpID8gKHNzaXplIC0gMSkgOiByZXQ7Cit9CisKICNkZWZpbmUgX19IUFBfQ09MT1JfUEVSQ0VOVF9GTihfdHlwZSwgX2ZpZWxkKQkJCQkJXAogc3RhdGljIHU2NCBoZV9nZXRfIyNfZmllbGQoc3RydWN0IGhpc3RfZW50cnkgKmhlKQkJCQlcCiB7CQkJCQkJCQkJCVwKQEAgLTExNiw4ICsxNzksOCBAQAogc3RhdGljIGludCBocHBfX2NvbG9yXyMjX3R5cGUoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10IF9fbWF5YmVfdW51c2VkLAkJXAogCQkJICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkgCVwKIHsJCQkJCQkJCQkJXAotCXJldHVybiBfX2hwcF9fZm10KGhwcCwgaGUsIGhlX2dldF8jI19maWVsZCwgIiAlNi4yZiUlIiwJCQlcCi0JCQkgIHBlcmNlbnRfY29sb3Jfc25wcmludGYsIHRydWUpOwkJCVwKKwlyZXR1cm4gX19ocHBfX2ZtdChocHAsIGhlLCBoZV9nZXRfIyNfZmllbGQsIE5VTEwsICIgJTYuMmYlJSIsCQlcCisJCQkgIGhwcF9jb2xvcl9zY25wcmludGYsIHRydWUpOwkJCQlcCiB9CiAKICNkZWZpbmUgX19IUFBfRU5UUllfUEVSQ0VOVF9GTihfdHlwZSwgX2ZpZWxkKQkJCQkJXApAQCAtMTI1LDggKzE4OCw4IEBACiAJCQkgICAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlKSAJXAogewkJCQkJCQkJCQlcCiAJY29uc3QgY2hhciAqZm10ID0gc3ltYm9sX2NvbmYuZmllbGRfc2VwID8gIiAlLjJmIiA6ICIgJTYuMmYlJSI7CQlcCi0JcmV0dXJuIF9faHBwX19mbXQoaHBwLCBoZSwgaGVfZ2V0XyMjX2ZpZWxkLCBmbXQsCQkJXAotCQkJICBzY25wcmludGYsIHRydWUpOwkJCQkJXAorCXJldHVybiBfX2hwcF9fZm10KGhwcCwgaGUsIGhlX2dldF8jI19maWVsZCwgTlVMTCwgZm10LAkJCVwKKwkJCSAgaHBwX2VudHJ5X3NjbnByaW50ZiwgdHJ1ZSk7CQkJCVwKIH0KIAogI2RlZmluZSBfX0hQUF9FTlRSWV9SQVdfRk4oX3R5cGUsIF9maWVsZCkJCQkJCVwKQEAgLTEzOSw3ICsyMDIsOCBAQAogCQkJICAgICAgc3RydWN0IHBlcmZfaHBwICpocHAsIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkgCVwKIHsJCQkJCQkJCQkJXAogCWNvbnN0IGNoYXIgKmZtdCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcCA/ICIgJSJQUkl1NjQgOiAiICUxMSJQUkl1NjQ7CVwKLQlyZXR1cm4gX19ocHBfX2ZtdChocHAsIGhlLCBoZV9nZXRfcmF3XyMjX2ZpZWxkLCBmbXQsIHNjbnByaW50ZiwgZmFsc2UpOwlcCisJcmV0dXJuIF9faHBwX19mbXQoaHBwLCBoZSwgaGVfZ2V0X3Jhd18jI19maWVsZCwgTlVMTCwgZm10LAkJXAorCQkJICBocHBfZW50cnlfc2NucHJpbnRmLCBmYWxzZSk7CQkJCVwKIH0KIAogI2RlZmluZSBIUFBfUEVSQ0VOVF9GTlMoX3R5cGUsIF9zdHIsIF9maWVsZCwgX21pbl93aWR0aCwgX3VuaXRfd2lkdGgpCVwKQEAgLTI2MywxNSArMzI3LDEzIEBACiAJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwogCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKIAlpbnQgaSA9IDAsIHJldCA9IDA7Ci0Jc3RydWN0IHBlcmZfaHBwIGR1bW15X2hwcCA9IHsKLQkJLnB0cgk9IGhpc3RzX3RvX2V2c2VsKGhpc3RzKSwKLQl9OworCXN0cnVjdCBwZXJmX2hwcCBkdW1teV9ocHA7CiAKIAlwZXJmX2hwcF9fZm9yX2VhY2hfZm9ybWF0KGZtdCkgewogCQlpZiAoaSkKIAkJCXJldCArPSAyOwogCi0JCXJldCArPSBmbXQtPndpZHRoKGZtdCwgJmR1bW15X2hwcCk7CisJCXJldCArPSBmbXQtPndpZHRoKGZtdCwgJmR1bW15X2hwcCwgaGlzdHNfdG9fZXZzZWwoaGlzdHMpKTsKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwppbmRleCA4MzFmYmI3Li5kNTk4OTNlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwpAQCAtMzA2LDEyICszMDYsNiBAQAogCXJldHVybiBoaXN0X2VudHJ5X2NhbGxjaGFpbl9fZnByaW50ZihoZSwgdG90YWxfcGVyaW9kLCBsZWZ0X21hcmdpbiwgZnApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWR2YW5jZV9ocHAoc3RydWN0IHBlcmZfaHBwICpocHAsIGludCBpbmMpCi17Ci0JaHBwLT5idWYgICs9IGluYzsKLQlocHAtPnNpemUgLT0gaW5jOwotfQotCiBzdGF0aWMgaW50IGhpc3RfZW50cnlfX3BlcmlvZF9zbnByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKIAkJCQkgICAgICAgc3RydWN0IGhpc3RfZW50cnkgKmhlKQogewpAQCAtMzg1LDcgKzM3OSw2IEBACiAJc3RydWN0IHBlcmZfaHBwIGR1bW15X2hwcCA9IHsKIAkJLmJ1Zgk9IGJmLAogCQkuc2l6ZQk9IHNpemVvZihiZiksCi0JCS5wdHIJPSBoaXN0c190b19ldnNlbChoaXN0cyksCiAJfTsKIAlib29sIGZpcnN0ID0gdHJ1ZTsKIAlzaXplX3QgbGluZXN6OwpAQCAtNDA0LDcgKzM5Nyw3IEBACiAJCWVsc2UKIAkJCWZpcnN0ID0gZmFsc2U7CiAKLQkJZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwKTsKKwkJZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwLCBoaXN0c190b19ldnNlbChoaXN0cykpOwogCQlmcHJpbnRmKGZwLCAiJXMiLCBiZik7CiAJfQogCkBAIC00NDksNyArNDQyLDcgQEAKIAkJZWxzZQogCQkJZmlyc3QgPSBmYWxzZTsKIAotCQl3aWR0aCA9IGZtdC0+d2lkdGgoZm10LCAmZHVtbXlfaHBwKTsKKwkJd2lkdGggPSBmbXQtPndpZHRoKGZtdCwgJmR1bW15X2hwcCwgaGlzdHNfdG9fZXZzZWwoaGlzdHMpKTsKIAkJZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCiAJCQlmcHJpbnRmKGZwLCAiLiIpOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKaW5kZXggM2FhNTU1Zi4uODA5YjRjNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKQEAgLTEyMzYsNiArMTIzNiw3IEBACiAJc3RydWN0IGRzbyAqZHNvID0gbWFwLT5kc287CiAJY2hhciAqZmlsZW5hbWU7CiAJY29uc3QgY2hhciAqZF9maWxlbmFtZTsKKwljb25zdCBjaGFyICpldnNlbF9uYW1lID0gcGVyZl9ldnNlbF9fbmFtZShldnNlbCk7CiAJc3RydWN0IGFubm90YXRpb24gKm5vdGVzID0gc3ltYm9sX19hbm5vdGF0aW9uKHN5bSk7CiAJc3RydWN0IGRpc2FzbV9saW5lICpwb3MsICpxdWV1ZSA9IE5VTEw7CiAJdTY0IHN0YXJ0ID0gbWFwX19yaXBfMm9iamR1bXAobWFwLCBzeW0tPnN0YXJ0KTsKQEAgLTEyNDMsNyArMTI0NCw3IEBACiAJaW50IG1vcmUgPSAwOwogCXU2NCBsZW47CiAJaW50IHdpZHRoID0gODsKLQlpbnQgbmFtZWxlbjsKKwlpbnQgbmFtZWxlbiwgZXZzZWxfbmFtZV9sZW4sIGdyYXBoX2RvdHRlZF9sZW47CiAKIAlmaWxlbmFtZSA9IHN0cmR1cChkc28tPmxvbmdfbmFtZSk7CiAJaWYgKCFmaWxlbmFtZSkKQEAgLTEyNTYsMTQgKzEyNTcsMTcgQEAKIAogCWxlbiA9IHN5bWJvbF9fc2l6ZShzeW0pOwogCW5hbWVsZW4gPSBzdHJsZW4oZF9maWxlbmFtZSk7CisJZXZzZWxfbmFtZV9sZW4gPSBzdHJsZW4oZXZzZWxfbmFtZSk7CiAKIAlpZiAocGVyZl9ldnNlbF9faXNfZ3JvdXBfZXZlbnQoZXZzZWwpKQogCQl3aWR0aCAqPSBldnNlbC0+bnJfbWVtYmVyczsKIAotCXByaW50ZigiICUtKi4qc3wJU291cmNlIGNvZGUgJiBEaXNhc3NlbWJseSBvZiAlc1xuIiwKLQkgICAgICAgd2lkdGgsIHdpZHRoLCAiUGVyY2VudCIsIGRfZmlsZW5hbWUpOwotCXByaW50ZigiLSUtKi4qcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsCi0JICAgICAgIHdpZHRoK25hbWVsZW4sIHdpZHRoK25hbWVsZW4sIGdyYXBoX2RvdHRlZF9saW5lKTsKKwlwcmludGYoIiAlLSouKnN8CVNvdXJjZSBjb2RlICYgRGlzYXNzZW1ibHkgb2YgJXMgZm9yICVzXG4iLAorCSAgICAgICB3aWR0aCwgd2lkdGgsICJQZXJjZW50IiwgZF9maWxlbmFtZSwgZXZzZWxfbmFtZSk7CisKKwlncmFwaF9kb3R0ZWRfbGVuID0gd2lkdGggKyBuYW1lbGVuICsgZXZzZWxfbmFtZV9sZW47CisJcHJpbnRmKCItJS0qLipzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsCisJICAgICAgIGdyYXBoX2RvdHRlZF9sZW4sIGdyYXBoX2RvdHRlZF9sZW4sIGdyYXBoX2RvdHRlZF9saW5lKTsKIAogCWlmICh2ZXJib3NlKQogCQlzeW1ib2xfX2Fubm90YXRlX2hpdHMoc3ltLCBldnNlbCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY3B1bWFwLmMgYi90b29scy9wZXJmL3V0aWwvY3B1bWFwLmMKaW5kZXggYTliNDhjNC4uN2ZlNDk5NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2NwdW1hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jcHVtYXAuYwpAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlICJ1dGlsLmgiCi0jaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlICIuLi9wZXJmLmgiCiAjaW5jbHVkZSAiY3B1bWFwLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHNvLmMgYi90b29scy9wZXJmL3V0aWwvZHNvLmMKaW5kZXggNDA0NWQwOC4uNjQ0NTNkNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Rzby5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kc28uYwpAQCAtNDUsOCArNDUsOCBAQAogCQkJZGVidWdsaW5rLS07CiAJCWlmICgqZGVidWdsaW5rID09ICcvJykKIAkJCWRlYnVnbGluaysrOwotCQlmaWxlbmFtZV9fcmVhZF9kZWJ1Z2xpbmsoZHNvLT5sb25nX25hbWUsIGRlYnVnbGluaywKLQkJCQkJIHNpemUgLSAoZGVidWdsaW5rIC0gZmlsZW5hbWUpKTsKKwkJcmV0ID0gZmlsZW5hbWVfX3JlYWRfZGVidWdsaW5rKGRzby0+bG9uZ19uYW1lLCBkZWJ1Z2xpbmssCisJCQkJCSAgICAgICBzaXplIC0gKGRlYnVnbGluayAtIGZpbGVuYW1lKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBEU09fQklOQVJZX1RZUEVfX0JVSUxEX0lEX0NBQ0hFOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rzby5oIGIvdG9vbHMvcGVyZi91dGlsL2Rzby5oCmluZGV4IGNkN2Q2ZjAuLmFiMDZmMWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kc28uaAorKysgYi90b29scy9wZXJmL3V0aWwvZHNvLmgKQEAgLTEwMiw2ICsxMDIsMTYgQEAKIAljaGFyCQkgbmFtZVswXTsKIH07CiAKKy8qIGRzb19fZm9yX2VhY2hfc3ltYm9sIC0gaXRlcmF0ZSBvdmVyIHRoZSBzeW1ib2xzIG9mIGdpdmVuIHR5cGUKKyAqCisgKiBAZHNvOiB0aGUgJ3N0cnVjdCBkc28gKicgaW4gd2hpY2ggc3ltYm9scyBpdGVyZWF0ZWQKKyAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgorICogQG46IHRoZSAnc3RydWN0IHJiX25vZGUgKicgdG8gdXNlIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEB0eXBlOiB0aGUgJ2VudW0gbWFwX3R5cGUnIHR5cGUgb2Ygc3ltYm9scworICovCisjZGVmaW5lIGRzb19fZm9yX2VhY2hfc3ltYm9sKGRzbywgcG9zLCBuLCB0eXBlKQlcCisJc3ltYm9sc19fZm9yX2VhY2hfZW50cnkoJihkc28pLT5zeW1ib2xzWyh0eXBlKV0sIHBvcywgbikKKwogc3RhdGljIGlubGluZSB2b2lkIGRzb19fc2V0X2xvYWRlZChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKIAlkc28tPmxvYWRlZCB8PSAoMSA8PCB0eXBlKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKaW5kZXggYjBmM2NhOC4uOWQxMmFhNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaGlzdC5oIgogI2luY2x1ZGUgIm1hY2hpbmUuaCIKICNpbmNsdWRlICJzb3J0LmgiCiAjaW5jbHVkZSAic3RyaW5nLmgiCkBAIC05NCwxNCArOTUsMTAgQEAKIAogc3RhdGljIHBpZF90IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbShzdHJ1Y3QgcGVyZl90b29sICp0b29sLAogCQkJCQkgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHBpZF90IHBpZCwKLQkJCQkJIGludCBmdWxsLAogCQkJCQkgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCiAJCQkJCSBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKLQljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKIAlzaXplX3Qgc2l6ZTsKLQlESVIgKnRhc2tzOwotCXN0cnVjdCBkaXJlbnQgZGlyZW50LCAqbmV4dDsKIAlwaWRfdCB0Z2lkOwogCiAJbWVtc2V0KCZldmVudC0+Y29tbSwgMCwgc2l6ZW9mKGV2ZW50LT5jb21tKSk7CkBAIC0xMjQsNTcgKzEyMSwzNyBAQAogCWV2ZW50LT5jb21tLmhlYWRlci5zaXplID0gKHNpemVvZihldmVudC0+Y29tbSkgLQogCQkJCShzaXplb2YoZXZlbnQtPmNvbW0uY29tbSkgLSBzaXplKSArCiAJCQkJbWFjaGluZS0+aWRfaGRyX3NpemUpOwotCWlmICghZnVsbCkgewotCQlldmVudC0+Y29tbS50aWQgPSBwaWQ7CisJZXZlbnQtPmNvbW0udGlkID0gcGlkOwogCi0JCWlmIChwcm9jZXNzKHRvb2wsIGV2ZW50LCAmc3ludGhfc2FtcGxlLCBtYWNoaW5lKSAhPSAwKQotCQkJcmV0dXJuIC0xOworCWlmIChwcm9jZXNzKHRvb2wsIGV2ZW50LCAmc3ludGhfc2FtcGxlLCBtYWNoaW5lKSAhPSAwKQorCQlyZXR1cm4gLTE7CiAKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3QobWFjaGluZSkpCi0JCXJldHVybiAwOwotCi0Jc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy9wcm9jLyVkL3Rhc2siLAotCQkgbWFjaGluZS0+cm9vdF9kaXIsIHBpZCk7Ci0KLQl0YXNrcyA9IG9wZW5kaXIoZmlsZW5hbWUpOwotCWlmICh0YXNrcyA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJjb3VsZG4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXdoaWxlICghcmVhZGRpcl9yKHRhc2tzLCAmZGlyZW50LCAmbmV4dCkgJiYgbmV4dCkgewotCQljaGFyICplbmQ7Ci0JCXBpZCA9IHN0cnRvbChkaXJlbnQuZF9uYW1lLCAmZW5kLCAxMCk7Ci0JCWlmICgqZW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogYWxyZWFkeSBoYXZlIHRnaWQ7IGp1dCB3YW50IHRvIHVwZGF0ZSB0aGUgY29tbSAqLwotCQkodm9pZCkgcGVyZl9ldmVudF9fZ2V0X2NvbW1fdGdpZChwaWQsIGV2ZW50LT5jb21tLmNvbW0sCi0JCQkJCSBzaXplb2YoZXZlbnQtPmNvbW0uY29tbSkpOwotCi0JCXNpemUgPSBzdHJsZW4oZXZlbnQtPmNvbW0uY29tbSkgKyAxOwotCQlzaXplID0gUEVSRl9BTElHTihzaXplLCBzaXplb2YodTY0KSk7Ci0JCW1lbXNldChldmVudC0+Y29tbS5jb21tICsgc2l6ZSwgMCwgbWFjaGluZS0+aWRfaGRyX3NpemUpOwotCQlldmVudC0+Y29tbS5oZWFkZXIuc2l6ZSA9IChzaXplb2YoZXZlbnQtPmNvbW0pIC0KLQkJCQkJICAoc2l6ZW9mKGV2ZW50LT5jb21tLmNvbW0pIC0gc2l6ZSkgKwotCQkJCQkgIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKLQotCQlldmVudC0+Y29tbS50aWQgPSBwaWQ7Ci0KLQkJaWYgKHByb2Nlc3ModG9vbCwgZXZlbnQsICZzeW50aF9zYW1wbGUsIG1hY2hpbmUpICE9IDApIHsKLQkJCXRnaWQgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JY2xvc2VkaXIodGFza3MpOwogb3V0OgogCXJldHVybiB0Z2lkOwogfQogCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZm9yayhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgcGlkX3QgcGlkLAorCQkJCSAgICAgICBwaWRfdCB0Z2lkLCBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKKwkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJbWVtc2V0KCZldmVudC0+Zm9yaywgMCwgc2l6ZW9mKGV2ZW50LT5mb3JrKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKKworCS8qIHRoaXMgaXMgcmVhbGx5IGEgY2xvbmUgZXZlbnQgYnV0IHdlIHVzZSBmb3JrIHRvIHN5bnRoZXNpemUgaXQgKi8KKwlldmVudC0+Zm9yay5wcGlkID0gdGdpZDsKKwlldmVudC0+Zm9yay5wdGlkID0gdGdpZDsKKwlldmVudC0+Zm9yay5waWQgID0gdGdpZDsKKwlldmVudC0+Zm9yay50aWQgID0gcGlkOworCWV2ZW50LT5mb3JrLmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfRk9SSzsKKworCWV2ZW50LT5mb3JrLmhlYWRlci5zaXplID0gKHNpemVvZihldmVudC0+Zm9yaykgKyBtYWNoaW5lLT5pZF9oZHJfc2l6ZSk7CisKKwlpZiAocHJvY2Vzcyh0b29sLCBldmVudCwgJnN5bnRoX3NhbXBsZSwgbWFjaGluZSkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKIGludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX21tYXBfZXZlbnRzKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkJICAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgICBwaWRfdCBwaWQsIHBpZF90IHRnaWQsCkBAIC0zMjQsMTcgKzMwMSw3MSBAQAogCiBzdGF0aWMgaW50IF9fZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkKHVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsCiAJCQkJICAgICAgdW5pb24gcGVyZl9ldmVudCAqbW1hcF9ldmVudCwKKwkJCQkgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpmb3JrX2V2ZW50LAogCQkJCSAgICAgIHBpZF90IHBpZCwgaW50IGZ1bGwsCiAJCQkJCSAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCiAJCQkJICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKIAkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgYm9vbCBtbWFwX2RhdGEpCiB7Ci0JcGlkX3QgdGdpZCA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbSh0b29sLCBjb21tX2V2ZW50LCBwaWQsIGZ1bGwsCisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJRElSICp0YXNrczsKKwlzdHJ1Y3QgZGlyZW50IGRpcmVudCwgKm5leHQ7CisJcGlkX3QgdGdpZDsKKworCS8qIHNwZWNpYWwgY2FzZTogb25seSBzZW5kIG9uZSBjb21tIGV2ZW50IHVzaW5nIHBhc3NlZCBpbiBwaWQgKi8KKwlpZiAoIWZ1bGwpIHsKKwkJdGdpZCA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbSh0b29sLCBjb21tX2V2ZW50LCBwaWQsCisJCQkJCQkgICBwcm9jZXNzLCBtYWNoaW5lKTsKKworCQlpZiAodGdpZCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworCQlyZXR1cm4gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyh0b29sLCBtbWFwX2V2ZW50LCBwaWQsIHRnaWQsCisJCQkJCQkJICBwcm9jZXNzLCBtYWNoaW5lLCBtbWFwX2RhdGEpOworCX0KKworCWlmIChtYWNoaW5lX19pc19kZWZhdWx0X2d1ZXN0KG1hY2hpbmUpKQorCQlyZXR1cm4gMDsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvcHJvYy8lZC90YXNrIiwKKwkJIG1hY2hpbmUtPnJvb3RfZGlyLCBwaWQpOworCisJdGFza3MgPSBvcGVuZGlyKGZpbGVuYW1lKTsKKwlpZiAodGFza3MgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiY291bGRuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoIXJlYWRkaXJfcih0YXNrcywgJmRpcmVudCwgJm5leHQpICYmIG5leHQpIHsKKwkJY2hhciAqZW5kOworCQlpbnQgcmMgPSAwOworCQlwaWRfdCBfcGlkOworCisJCV9waWQgPSBzdHJ0b2woZGlyZW50LmRfbmFtZSwgJmVuZCwgMTApOworCQlpZiAoKmVuZCkKKwkJCWNvbnRpbnVlOworCisJCXRnaWQgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2NvbW0odG9vbCwgY29tbV9ldmVudCwgX3BpZCwKKwkJCQkJCSAgIHByb2Nlc3MsIG1hY2hpbmUpOworCQlpZiAodGdpZCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoX3BpZCA9PSBwaWQpIHsKKwkJCS8qIHByb2Nlc3MgdGhlIHBhcmVudCdzIG1hcHMgdG9vICovCisJCQlyYyA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfbW1hcF9ldmVudHModG9vbCwgbW1hcF9ldmVudCwgcGlkLCB0Z2lkLAorCQkJCQkJcHJvY2VzcywgbWFjaGluZSwgbW1hcF9kYXRhKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9ubHkgZm9yayB0aGUgdGlkJ3MgbWFwLCB0byBzYXZlIHRpbWUgKi8KKwkJCXJjID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9mb3JrKHRvb2wsIGZvcmtfZXZlbnQsIF9waWQsIHRnaWQsCiAJCQkJCQkgcHJvY2VzcywgbWFjaGluZSk7Ci0JaWYgKHRnaWQgPT0gLTEpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyh0b29sLCBtbWFwX2V2ZW50LCBwaWQsIHRnaWQsCi0JCQkJCQkgIHByb2Nlc3MsIG1hY2hpbmUsIG1tYXBfZGF0YSk7CisJCX0KKworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJY2xvc2VkaXIodGFza3MpOworCXJldHVybiAwOwogfQogCiBpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRfbWFwKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCkBAIC0zNDMsNyArMzc0LDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCQkgICAgICBib29sIG1tYXBfZGF0YSkKIHsKLQl1bmlvbiBwZXJmX2V2ZW50ICpjb21tX2V2ZW50LCAqbW1hcF9ldmVudDsKKwl1bmlvbiBwZXJmX2V2ZW50ICpjb21tX2V2ZW50LCAqbW1hcF9ldmVudCwgKmZvcmtfZXZlbnQ7CiAJaW50IGVyciA9IC0xLCB0aHJlYWQsIGo7CiAKIAljb21tX2V2ZW50ID0gbWFsbG9jKHNpemVvZihjb21tX2V2ZW50LT5jb21tKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKQEAgLTM1NCw5ICszODUsMTQgQEAKIAlpZiAobW1hcF9ldmVudCA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlX2NvbW07CiAKKwlmb3JrX2V2ZW50ID0gbWFsbG9jKHNpemVvZihmb3JrX2V2ZW50LT5mb3JrKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKKwlpZiAoZm9ya19ldmVudCA9PSBOVUxMKQorCQlnb3RvIG91dF9mcmVlX21tYXA7CisKIAllcnIgPSAwOwogCWZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgdGhyZWFkcy0+bnI7ICsrdGhyZWFkKSB7CiAJCWlmIChfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LAorCQkJCQkgICAgICAgZm9ya19ldmVudCwKIAkJCQkJICAgICAgIHRocmVhZHMtPm1hcFt0aHJlYWRdLCAwLAogCQkJCQkgICAgICAgcHJvY2VzcywgdG9vbCwgbWFjaGluZSwKIAkJCQkJICAgICAgIG1tYXBfZGF0YSkpIHsKQEAgLTM4Miw2ICs0MTgsNyBAQAogCQkJLyogaWYgbm90LCBnZW5lcmF0ZSBldmVudHMgZm9yIGl0ICovCiAJCQlpZiAobmVlZF9sZWFkZXIgJiYKIAkJCSAgICBfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LAorCQkJCQkJICAgICAgIGZvcmtfZXZlbnQsCiAJCQkJCQkgICAgICAgY29tbV9ldmVudC0+Y29tbS5waWQsIDAsCiAJCQkJCQkgICAgICAgcHJvY2VzcywgdG9vbCwgbWFjaGluZSwKIAkJCQkJCSAgICAgICBtbWFwX2RhdGEpKSB7CkBAIC0zOTAsNiArNDI3LDggQEAKIAkJCX0KIAkJfQogCX0KKwlmcmVlKGZvcmtfZXZlbnQpOworb3V0X2ZyZWVfbW1hcDoKIAlmcmVlKG1tYXBfZXZlbnQpOwogb3V0X2ZyZWVfY29tbToKIAlmcmVlKGNvbW1fZXZlbnQpOwpAQCAtNDA0LDkgKzQ0MywxMiBAQAogCURJUiAqcHJvYzsKIAljaGFyIHByb2NfcGF0aFtQQVRIX01BWF07CiAJc3RydWN0IGRpcmVudCBkaXJlbnQsICpuZXh0OwotCXVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsICptbWFwX2V2ZW50OworCXVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsICptbWFwX2V2ZW50LCAqZm9ya19ldmVudDsKIAlpbnQgZXJyID0gLTE7CiAKKwlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkKKwkJcmV0dXJuIDA7CisKIAljb21tX2V2ZW50ID0gbWFsbG9jKHNpemVvZihjb21tX2V2ZW50LT5jb21tKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKIAlpZiAoY29tbV9ldmVudCA9PSBOVUxMKQogCQlnb3RvIG91dDsKQEAgLTQxNSwxNCArNDU3LDE1IEBACiAJaWYgKG1tYXBfZXZlbnQgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZV9jb21tOwogCi0JaWYgKG1hY2hpbmVfX2lzX2RlZmF1bHRfZ3Vlc3QobWFjaGluZSkpCi0JCXJldHVybiAwOworCWZvcmtfZXZlbnQgPSBtYWxsb2Moc2l6ZW9mKGZvcmtfZXZlbnQtPmZvcmspICsgbWFjaGluZS0+aWRfaGRyX3NpemUpOworCWlmIChmb3JrX2V2ZW50ID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWVfbW1hcDsKIAogCXNucHJpbnRmKHByb2NfcGF0aCwgc2l6ZW9mKHByb2NfcGF0aCksICIlcy9wcm9jIiwgbWFjaGluZS0+cm9vdF9kaXIpOwogCXByb2MgPSBvcGVuZGlyKHByb2NfcGF0aCk7CiAKIAlpZiAocHJvYyA9PSBOVUxMKQotCQlnb3RvIG91dF9mcmVlX21tYXA7CisJCWdvdG8gb3V0X2ZyZWVfZm9yazsKIAogCXdoaWxlICghcmVhZGRpcl9yKHByb2MsICZkaXJlbnQsICZuZXh0KSAmJiBuZXh0KSB7CiAJCWNoYXIgKmVuZDsKQEAgLTQzNCwxMiArNDc3LDE0IEBACiAgCQkgKiBXZSBtYXkgcmFjZSB3aXRoIGV4aXRpbmcgdGhyZWFkLCBzbyBkb24ndCBzdG9wIGp1c3QgYmVjYXVzZQogIAkJICogb25lIHRocmVhZCBjb3VsZG4ndCBiZSBzeW50aGVzaXplZC4KICAJCSAqLwotCQlfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LCBwaWQsIDEsCi0JCQkJCSAgIHByb2Nlc3MsIHRvb2wsIG1hY2hpbmUsIG1tYXBfZGF0YSk7CisJCV9fZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkKGNvbW1fZXZlbnQsIG1tYXBfZXZlbnQsIGZvcmtfZXZlbnQsIHBpZCwKKwkJCQkJICAgMSwgcHJvY2VzcywgdG9vbCwgbWFjaGluZSwgbW1hcF9kYXRhKTsKIAl9CiAKIAllcnIgPSAwOwogCWNsb3NlZGlyKHByb2MpOworb3V0X2ZyZWVfZm9yazoKKwlmcmVlKGZvcmtfZXZlbnQpOwogb3V0X2ZyZWVfbW1hcDoKIAlmcmVlKG1tYXBfZXZlbnQpOwogb3V0X2ZyZWVfY29tbToKQEAgLTY2MSw3ICs3MDYsNyBAQAogCWFsLT50aHJlYWQgPSB0aHJlYWQ7CiAJYWwtPmFkZHIgPSBhZGRyOwogCWFsLT5jcHVtb2RlID0gY3B1bW9kZTsKLQlhbC0+ZmlsdGVyZWQgPSBmYWxzZTsKKwlhbC0+ZmlsdGVyZWQgPSAwOwogCiAJaWYgKG1hY2hpbmUgPT0gTlVMTCkgewogCQlhbC0+bWFwID0gTlVMTDsKQEAgLTY4NywxMSArNzMyLDExIEBACiAJCWlmICgoY3B1bW9kZSA9PSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX1VTRVIgfHwKIAkJCWNwdW1vZGUgPT0gUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUwpICYmCiAJCQkhcGVyZl9ndWVzdCkKLQkJCWFsLT5maWx0ZXJlZCA9IHRydWU7CisJCQlhbC0+ZmlsdGVyZWQgfD0gKDEgPDwgSElTVF9GSUxURVJfX0dVRVNUKTsKIAkJaWYgKChjcHVtb2RlID09IFBFUkZfUkVDT1JEX01JU0NfVVNFUiB8fAogCQkJY3B1bW9kZSA9PSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTCkgJiYKIAkJCSFwZXJmX2hvc3QpCi0JCQlhbC0+ZmlsdGVyZWQgPSB0cnVlOworCQkJYWwtPmZpbHRlcmVkIHw9ICgxIDw8IEhJU1RfRklMVEVSX19IT1NUKTsKIAogCQlyZXR1cm47CiAJfQpAQCAtNzQ4LDkgKzc5Myw2IEBACiAJaWYgKHRocmVhZCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAodGhyZWFkX19pc19maWx0ZXJlZCh0aHJlYWQpKQotCQlnb3RvIG91dF9maWx0ZXJlZDsKLQogCWR1bXBfcHJpbnRmKCIgLi4uIHRocmVhZDogJXM6JWRcbiIsIHRocmVhZF9fY29tbV9zdHIodGhyZWFkKSwgdGhyZWFkLT50aWQpOwogCS8qCiAJICogSGF2ZSB3ZSBhbHJlYWR5IGNyZWF0ZWQgdGhlIGtlcm5lbCBtYXBzIGZvciB0aGlzIG1hY2hpbmU/CkBAIC03NjgsNiArODEwLDEwIEBACiAJZHVtcF9wcmludGYoIiAuLi4uLi4gZHNvOiAlc1xuIiwKIAkJICAgIGFsLT5tYXAgPyBhbC0+bWFwLT5kc28tPmxvbmdfbmFtZSA6CiAJCQlhbC0+bGV2ZWwgPT0gJ0gnID8gIltoeXBlcnZpc29yXSIgOiAiPG5vdCBmb3VuZD4iKTsKKworCWlmICh0aHJlYWRfX2lzX2ZpbHRlcmVkKHRocmVhZCkpCisJCWFsLT5maWx0ZXJlZCB8PSAoMSA8PCBISVNUX0ZJTFRFUl9fVEhSRUFEKTsKKwogCWFsLT5zeW0gPSBOVUxMOwogCWFsLT5jcHUgPSBzYW1wbGUtPmNwdTsKIApAQCAtNzc5LDggKzgyNSw5IEBACiAJCQkJCQkgIGRzby0+c2hvcnRfbmFtZSkgfHwKIAkJCSAgICAgICAoZHNvLT5zaG9ydF9uYW1lICE9IGRzby0+bG9uZ19uYW1lICYmCiAJCQkJc3RybGlzdF9faGFzX2VudHJ5KHN5bWJvbF9jb25mLmRzb19saXN0LAotCQkJCQkJICAgZHNvLT5sb25nX25hbWUpKSkpKQotCQkJZ290byBvdXRfZmlsdGVyZWQ7CisJCQkJCQkgICBkc28tPmxvbmdfbmFtZSkpKSkpIHsKKwkJCWFsLT5maWx0ZXJlZCB8PSAoMSA8PCBISVNUX0ZJTFRFUl9fRFNPKTsKKwkJfQogCiAJCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyLAogCQkJCQkgICBtYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKQEAgLTc4OCwxMiArODM1LDkgQEAKIAogCWlmIChzeW1ib2xfY29uZi5zeW1fbGlzdCAmJgogCQkoIWFsLT5zeW0gfHwgIXN0cmxpc3RfX2hhc19lbnRyeShzeW1ib2xfY29uZi5zeW1fbGlzdCwKLQkJCQkJCWFsLT5zeW0tPm5hbWUpKSkKLQkJZ290byBvdXRfZmlsdGVyZWQ7CisJCQkJCQlhbC0+c3ltLT5uYW1lKSkpIHsKKwkJYWwtPmZpbHRlcmVkIHw9ICgxIDw8IEhJU1RfRklMVEVSX19TWU1CT0wpOworCX0KIAogCXJldHVybiAwOwotCi1vdXRfZmlsdGVyZWQ6Ci0JYWwtPmZpbHRlcmVkID0gdHJ1ZTsKLQlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKaW5kZXggODUxZmEwNi4uMzg0NTdkNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKQEAgLTg1LDYgKzg1LDcgQEAKIAogc3RydWN0IHJlZ3NfZHVtcCB7CiAJdTY0IGFiaTsKKwl1NjQgbWFzazsKIAl1NjQgKnJlZ3M7CiB9OwogCkBAIC0yNTksOSArMjYwLDkgQEAKIGNvbnN0IGNoYXIgKnBlcmZfZXZlbnRfX25hbWUodW5zaWduZWQgaW50IGlkKTsKIAogc2l6ZV90IHBlcmZfZXZlbnRfX3NhbXBsZV9ldmVudF9zaXplKGNvbnN0IHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLCB1NjQgdHlwZSwKLQkJCQkgICAgIHU2NCBzYW1wbGVfcmVnc191c2VyLCB1NjQgcmVhZF9mb3JtYXQpOworCQkJCSAgICAgdTY0IHJlYWRfZm9ybWF0KTsKIGludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX3NhbXBsZSh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgdTY0IHR5cGUsCi0JCQkJICB1NjQgc2FtcGxlX3JlZ3NfdXNlciwgdTY0IHJlYWRfZm9ybWF0LAorCQkJCSAgdTY0IHJlYWRfZm9ybWF0LAogCQkJCSAgY29uc3Qgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJICBib29sIHN3YXBwZWQpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCmluZGV4IDU1NDA3YzUuLjVjMjhkODIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCkBAIC01MDAsNiArNTAwLDM0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQKK3BlcmZfZXZzZWxfX2NvbmZpZ19jYWxsZ3JhcGgoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJICAgICBzdHJ1Y3QgcmVjb3JkX29wdHMgKm9wdHMpCit7CisJYm9vbCBmdW5jdGlvbiA9IHBlcmZfZXZzZWxfX2lzX2Z1bmN0aW9uX2V2ZW50KGV2c2VsKTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2c2VsLT5hdHRyOworCisJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQoZXZzZWwsIENBTExDSEFJTik7CisKKwlpZiAob3B0cy0+Y2FsbF9ncmFwaCA9PSBDQUxMQ0hBSU5fRFdBUkYpIHsKKwkJaWYgKCFmdW5jdGlvbikgeworCQkJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQoZXZzZWwsIFJFR1NfVVNFUik7CisJCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgU1RBQ0tfVVNFUik7CisJCQlhdHRyLT5zYW1wbGVfcmVnc191c2VyID0gUEVSRl9SRUdTX01BU0s7CisJCQlhdHRyLT5zYW1wbGVfc3RhY2tfdXNlciA9IG9wdHMtPnN0YWNrX2R1bXBfc2l6ZTsKKwkJCWF0dHItPmV4Y2x1ZGVfY2FsbGNoYWluX3VzZXIgPSAxOworCQl9IGVsc2UgeworCQkJcHJfaW5mbygiQ2Fubm90IHVzZSBEV0FSRiB1bndpbmQgZm9yIGZ1bmN0aW9uIHRyYWNlIGV2ZW50LCIKKwkJCQkiIGZhbGxpbmcgYmFjayB0byBmcmFtZXBvaW50ZXJzLlxuIik7CisJCX0KKwl9CisKKwlpZiAoZnVuY3Rpb24pIHsKKwkJcHJfaW5mbygiRGlzYWJsaW5nIHVzZXIgc3BhY2UgY2FsbGNoYWlucyBmb3IgZnVuY3Rpb24gdHJhY2UgZXZlbnQuXG4iKTsKKwkJYXR0ci0+ZXhjbHVkZV9jYWxsY2hhaW5fdXNlciA9IDE7CisJfQorfQorCiAvKgogICogVGhlIGVuYWJsZV9vbl9leGVjL2Rpc2FibGVkIHZhbHVlIHN0cmF0ZWd5OgogICoKQEAgLTU5NSwxNyArNjIzLDggQEAKIAkJYXR0ci0+bW1hcF9kYXRhID0gdHJhY2s7CiAJfQogCi0JaWYgKG9wdHMtPmNhbGxfZ3JhcGgpIHsKLQkJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQoZXZzZWwsIENBTExDSEFJTik7Ci0KLQkJaWYgKG9wdHMtPmNhbGxfZ3JhcGggPT0gQ0FMTENIQUlOX0RXQVJGKSB7Ci0JCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgUkVHU19VU0VSKTsKLQkJCXBlcmZfZXZzZWxfX3NldF9zYW1wbGVfYml0KGV2c2VsLCBTVEFDS19VU0VSKTsKLQkJCWF0dHItPnNhbXBsZV9yZWdzX3VzZXIgPSBQRVJGX1JFR1NfTUFTSzsKLQkJCWF0dHItPnNhbXBsZV9zdGFja191c2VyID0gb3B0cy0+c3RhY2tfZHVtcF9zaXplOwotCQkJYXR0ci0+ZXhjbHVkZV9jYWxsY2hhaW5fdXNlciA9IDE7Ci0JCX0KLQl9CisJaWYgKG9wdHMtPmNhbGxfZ3JhcGhfZW5hYmxlZCkKKwkJcGVyZl9ldnNlbF9fY29uZmlnX2NhbGxncmFwaChldnNlbCwgb3B0cyk7CiAKIAlpZiAodGFyZ2V0X19oYXNfY3B1KCZvcHRzLT50YXJnZXQpKQogCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgQ1BVKTsKQEAgLTEwMDQsNyArMTAyMyw3IEBACiAKIAkJCWdyb3VwX2ZkID0gZ2V0X2dyb3VwX2ZkKGV2c2VsLCBjcHUsIHRocmVhZCk7CiByZXRyeV9vcGVuOgotCQkJcHJfZGVidWcyKCJwZXJmX2V2ZW50X29wZW46IHBpZCAlZCAgY3B1ICVkICBncm91cF9mZCAlZCAgZmxhZ3MgJSNseFxuIiwKKwkJCXByX2RlYnVnMigic3lzX3BlcmZfZXZlbnRfb3BlbjogcGlkICVkICBjcHUgJWQgIGdyb3VwX2ZkICVkICBmbGFncyAlI2x4XG4iLAogCQkJCSAgcGlkLCBjcHVzLT5tYXBbY3B1XSwgZ3JvdXBfZmQsIGZsYWdzKTsKIAogCQkJRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA9IHN5c19wZXJmX2V2ZW50X29wZW4oJmV2c2VsLT5hdHRyLApAQCAtMTAxMyw3ICsxMDMyLDcgQEAKIAkJCQkJCQkJICAgICBncm91cF9mZCwgZmxhZ3MpOwogCQkJaWYgKEZEKGV2c2VsLCBjcHUsIHRocmVhZCkgPCAwKSB7CiAJCQkJZXJyID0gLWVycm5vOwotCQkJCXByX2RlYnVnMigicGVyZl9ldmVudF9vcGVuIGZhaWxlZCwgZXJyb3IgJWRcbiIsCisJCQkJcHJfZGVidWcyKCJzeXNfcGVyZl9ldmVudF9vcGVuIGZhaWxlZCwgZXJyb3IgJWRcbiIsCiAJCQkJCSAgZXJyKTsKIAkJCQlnb3RvIHRyeV9mYWxsYmFjazsKIAkJCX0KQEAgLTEyMjAsNyArMTIzOSw3IEBACiAJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOwogCWRhdGEtPmNwdSA9IGRhdGEtPnBpZCA9IGRhdGEtPnRpZCA9IC0xOwogCWRhdGEtPnN0cmVhbV9pZCA9IGRhdGEtPmlkID0gZGF0YS0+dGltZSA9IC0xVUxMOwotCWRhdGEtPnBlcmlvZCA9IDE7CisJZGF0YS0+cGVyaW9kID0gZXZzZWwtPmF0dHIuc2FtcGxlX3BlcmlvZDsKIAlkYXRhLT53ZWlnaHQgPSAwOwogCiAJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSAhPSBQRVJGX1JFQ09SRF9TQU1QTEUpIHsKQEAgLTEzOTYsMTAgKzE0MTUsMTEgQEAKIAkJYXJyYXkrKzsKIAogCQlpZiAoZGF0YS0+dXNlcl9yZWdzLmFiaSkgewotCQkJdTY0IHJlZ3NfdXNlciA9IGV2c2VsLT5hdHRyLnNhbXBsZV9yZWdzX3VzZXI7CisJCQl1NjQgbWFzayA9IGV2c2VsLT5hdHRyLnNhbXBsZV9yZWdzX3VzZXI7CiAKLQkJCXN6ID0gaHdlaWdodF9sb25nKHJlZ3NfdXNlcikgKiBzaXplb2YodTY0KTsKKwkJCXN6ID0gaHdlaWdodF9sb25nKG1hc2spICogc2l6ZW9mKHU2NCk7CiAJCQlPVkVSRkxPV19DSEVDSyhhcnJheSwgc3osIG1heF9zaXplKTsKKwkJCWRhdGEtPnVzZXJfcmVncy5tYXNrID0gbWFzazsKIAkJCWRhdGEtPnVzZXJfcmVncy5yZWdzID0gKHU2NCAqKWFycmF5OwogCQkJYXJyYXkgPSAodm9pZCAqKWFycmF5ICsgc3o7CiAJCX0KQEAgLTE0NTEsNyArMTQ3MSw3IEBACiB9CiAKIHNpemVfdCBwZXJmX2V2ZW50X19zYW1wbGVfZXZlbnRfc2l6ZShjb25zdCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgdTY0IHR5cGUsCi0JCQkJICAgICB1NjQgc2FtcGxlX3JlZ3NfdXNlciwgdTY0IHJlYWRfZm9ybWF0KQorCQkJCSAgICAgdTY0IHJlYWRfZm9ybWF0KQogewogCXNpemVfdCBzeiwgcmVzdWx0ID0gc2l6ZW9mKHN0cnVjdCBzYW1wbGVfZXZlbnQpOwogCkBAIC0xNTE3LDcgKzE1MzcsNyBAQAogCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfUkVHU19VU0VSKSB7CiAJCWlmIChzYW1wbGUtPnVzZXJfcmVncy5hYmkpIHsKIAkJCXJlc3VsdCArPSBzaXplb2YodTY0KTsKLQkJCXN6ID0gaHdlaWdodF9sb25nKHNhbXBsZV9yZWdzX3VzZXIpICogc2l6ZW9mKHU2NCk7CisJCQlzeiA9IGh3ZWlnaHRfbG9uZyhzYW1wbGUtPnVzZXJfcmVncy5tYXNrKSAqIHNpemVvZih1NjQpOwogCQkJcmVzdWx0ICs9IHN6OwogCQl9IGVsc2UgewogCQkJcmVzdWx0ICs9IHNpemVvZih1NjQpOwpAQCAtMTU0Niw3ICsxNTY2LDcgQEAKIH0KIAogaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfc2FtcGxlKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgdHlwZSwKLQkJCQkgIHU2NCBzYW1wbGVfcmVnc191c2VyLCB1NjQgcmVhZF9mb3JtYXQsCisJCQkJICB1NjQgcmVhZF9mb3JtYXQsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCQkgIGJvb2wgc3dhcHBlZCkKIHsKQEAgLTE2ODcsNyArMTcwNyw3IEBACiAJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9SRUdTX1VTRVIpIHsKIAkJaWYgKHNhbXBsZS0+dXNlcl9yZWdzLmFiaSkgewogCQkJKmFycmF5KysgPSBzYW1wbGUtPnVzZXJfcmVncy5hYmk7Ci0JCQlzeiA9IGh3ZWlnaHRfbG9uZyhzYW1wbGVfcmVnc191c2VyKSAqIHNpemVvZih1NjQpOworCQkJc3ogPSBod2VpZ2h0X2xvbmcoc2FtcGxlLT51c2VyX3JlZ3MubWFzaykgKiBzaXplb2YodTY0KTsKIAkJCW1lbWNweShhcnJheSwgc2FtcGxlLT51c2VyX3JlZ3MucmVncywgc3opOwogCQkJYXJyYXkgPSAodm9pZCAqKWFycmF5ICsgc3o7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCmluZGV4IGYxYjMyNTYuLjBjOTkyNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCkBAIC0zMTUsNiArMzE1LDI0IEBACiAJcmV0dXJuIHBlcmZfZXZzZWxfX2lzX2dyb3VwX2xlYWRlcihldnNlbCkgJiYgZXZzZWwtPm5yX21lbWJlcnMgPiAxOwogfQogCisvKioKKyAqIHBlcmZfZXZzZWxfX2lzX2Z1bmN0aW9uX2V2ZW50IC0gUmV0dXJuIHdoZXRoZXIgZ2l2ZW4gZXZzZWwgaXMgYSBmdW5jdGlvbgorICogdHJhY2UgZXZlbnQKKyAqCisgKiBAZXZzZWwgLSBldnNlbCBzZWxlY3RvciB0byBiZSB0ZXN0ZWQKKyAqCisgKiBSZXR1cm4gJXRydWUgaWYgZXZlbnQgaXMgZnVuY3Rpb24gdHJhY2UgZXZlbnQKKyAqLworc3RhdGljIGlubGluZSBib29sIHBlcmZfZXZzZWxfX2lzX2Z1bmN0aW9uX2V2ZW50KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKK3sKKyNkZWZpbmUgRlVOQ1RJT05fRVZFTlQgImZ0cmFjZTpmdW5jdGlvbiIKKworCXJldHVybiBldnNlbC0+bmFtZSAmJgorCSAgICAgICAhc3RybmNtcChGVU5DVElPTl9FVkVOVCwgZXZzZWwtPm5hbWUsIHNpemVvZihGVU5DVElPTl9FVkVOVCkpOworCisjdW5kZWYgRlVOQ1RJT05fRVZFTlQKK30KKwogc3RydWN0IHBlcmZfYXR0cl9kZXRhaWxzIHsKIAlib29sIGZyZXE7CiAJYm9vbCB2ZXJib3NlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ZzLmMgYi90b29scy9wZXJmL3V0aWwvZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViZTFmMi4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL3V0aWwvZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0KLS8qIFRPRE8gbWVyZ2UvZmFjdG9yIGludG8gdG9vbHMvbGliL2xrL2RlYnVnZnMuYyAqLwotCi0jaW5jbHVkZSAidXRpbC5oIgotI2luY2x1ZGUgInV0aWwvZnMuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNmc19fZnNfa25vd25fbW91bnRwb2ludHNbXSA9IHsKLQkiL3N5cyIsCi0JMCwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJvY2ZzX19rbm93bl9tb3VudHBvaW50c1tdID0gewotCSIvcHJvYyIsCi0JMCwKLX07Ci0KLXN0cnVjdCBmcyB7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0JY29uc3QgY2hhciAqIGNvbnN0CSptb3VudHM7Ci0JY2hhcgkJCSBwYXRoW1BBVEhfTUFYICsgMV07Ci0JYm9vbAkJCSBmb3VuZDsKLQlsb25nCQkJIG1hZ2ljOwotfTsKLQotZW51bSB7Ci0JRlNfX1NZU0ZTICA9IDAsCi0JRlNfX1BST0NGUyA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IGZzIGZzX19lbnRyaWVzW10gPSB7Ci0JW0ZTX19TWVNGU10gPSB7Ci0JCS5uYW1lCT0gInN5c2ZzIiwKLQkJLm1vdW50cwk9IHN5c2ZzX19mc19rbm93bl9tb3VudHBvaW50cywKLQkJLm1hZ2ljCT0gU1lTRlNfTUFHSUMsCi0JfSwKLQlbRlNfX1BST0NGU10gPSB7Ci0JCS5uYW1lCT0gInByb2MiLAotCQkubW91bnRzCT0gcHJvY2ZzX19rbm93bl9tb3VudHBvaW50cywKLQkJLm1hZ2ljCT0gUFJPQ19TVVBFUl9NQUdJQywKLQl9LAotfTsKLQotc3RhdGljIGJvb2wgZnNfX3JlYWRfbW91bnRzKHN0cnVjdCBmcyAqZnMpCi17Ci0JYm9vbCBmb3VuZCA9IGZhbHNlOwotCWNoYXIgdHlwZVsxMDBdOwotCUZJTEUgKmZwOwotCi0JZnAgPSBmb3BlbigiL3Byb2MvbW91bnRzIiwgInIiKTsKLQlpZiAoZnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl3aGlsZSAoIWZvdW5kICYmCi0JICAgICAgIGZzY2FuZihmcCwgIiUqcyAlIiBTVFIoUEFUSF9NQVgpICJzICU5OXMgJSpzICUqZCAlKmRcbiIsCi0JCSAgICAgIGZzLT5wYXRoLCB0eXBlKSA9PSAyKSB7Ci0KLQkJaWYgKHN0cmNtcCh0eXBlLCBmcy0+bmFtZSkgPT0gMCkKLQkJCWZvdW5kID0gdHJ1ZTsKLQl9Ci0KLQlmY2xvc2UoZnApOwotCXJldHVybiBmcy0+Zm91bmQgPSBmb3VuZDsKLX0KLQotc3RhdGljIGludCBmc19fdmFsaWRfbW91bnQoY29uc3QgY2hhciAqZnMsIGxvbmcgbWFnaWMpCi17Ci0Jc3RydWN0IHN0YXRmcyBzdF9mczsKLQotCWlmIChzdGF0ZnMoZnMsICZzdF9mcykgPCAwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQllbHNlIGlmIChzdF9mcy5mX3R5cGUgIT0gbWFnaWMpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sIGZzX19jaGVja19tb3VudHMoc3RydWN0IGZzICpmcykKLXsKLQljb25zdCBjaGFyICogY29uc3QgKnB0cjsKLQotCXB0ciA9IGZzLT5tb3VudHM7Ci0Jd2hpbGUgKCpwdHIpIHsKLQkJaWYgKGZzX192YWxpZF9tb3VudCgqcHRyLCBmcy0+bWFnaWMpID09IDApIHsKLQkJCWZzLT5mb3VuZCA9IHRydWU7Ci0JCQlzdHJjcHkoZnMtPnBhdGgsICpwdHIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHRyKys7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZnNfX2dldF9tb3VudHBvaW50KHN0cnVjdCBmcyAqZnMpCi17Ci0JaWYgKGZzX19jaGVja19tb3VudHMoZnMpKQotCQlyZXR1cm4gZnMtPnBhdGg7Ci0KLQlyZXR1cm4gZnNfX3JlYWRfbW91bnRzKGZzKSA/IGZzLT5wYXRoIDogTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZzX19tb3VudHBvaW50KGludCBpZHgpCi17Ci0Jc3RydWN0IGZzICpmcyA9ICZmc19fZW50cmllc1tpZHhdOwotCi0JaWYgKGZzLT5mb3VuZCkKLQkJcmV0dXJuIChjb25zdCBjaGFyICopZnMtPnBhdGg7Ci0KLQlyZXR1cm4gZnNfX2dldF9tb3VudHBvaW50KGZzKTsKLX0KLQotI2RlZmluZSBGU19fTU9VTlRQT0lOVChuYW1lLCBpZHgpCVwKLWNvbnN0IGNoYXIgKm5hbWUjI19fbW91bnRwb2ludCh2b2lkKQlcCi17CQkJCQlcCi0JcmV0dXJuIGZzX19tb3VudHBvaW50KGlkeCk7CVwKLX0KLQotRlNfX01PVU5UUE9JTlQoc3lzZnMsICBGU19fU1lTRlMpOwotRlNfX01PVU5UUE9JTlQocHJvY2ZzLCBGU19fUFJPQ0ZTKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9mcy5oIGIvdG9vbHMvcGVyZi91dGlsL2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDljZTEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19QRVJGX0ZTCi0jZGVmaW5lIF9fUEVSRl9GUwotCi1jb25zdCBjaGFyICpzeXNmc19fbW91bnRwb2ludCh2b2lkKTsKLWNvbnN0IGNoYXIgKnByb2Nmc19fbW91bnRwb2ludCh2b2lkKTsKLQotI2VuZGlmIC8qIF9fUEVSRl9GUyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKaW5kZXggZTRlNjI0OS4uZjM4NTkwZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCkBAIC0xMywxMyArMTMsNiBAQAogc3RhdGljIGJvb2wgaGlzdHNfX2ZpbHRlcl9lbnRyeV9ieV9zeW1ib2woc3RydWN0IGhpc3RzICpoaXN0cywKIAkJCQkJICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpOwogCi1lbnVtIGhpc3RfZmlsdGVyIHsKLQlISVNUX0ZJTFRFUl9fRFNPLAotCUhJU1RfRklMVEVSX19USFJFQUQsCi0JSElTVF9GSUxURVJfX1BBUkVOVCwKLQlISVNUX0ZJTFRFUl9fU1lNQk9MLAotfTsKLQogc3RydWN0IGNhbGxjaGFpbl9wYXJhbQljYWxsY2hhaW5fcGFyYW0gPSB7CiAJLm1vZGUJPSBDSEFJTl9HUkFQSF9SRUwsCiAJLm1pbl9wZXJjZW50ID0gMC41LApAQCAtMjkwLDcgKzI4Myw3IEBACiAJCWlmIChoZS0+YnJhbmNoX2luZm8pIHsKIAkJCS8qCiAJCQkgKiBUaGlzIGJyYW5jaCBpbmZvIGlzIChhIHBhcnQgb2YpIGFsbG9jYXRlZCBmcm9tCi0JCQkgKiBtYWNoaW5lX19yZXNvbHZlX2JzdGFjaygpIGFuZCB3aWxsIGJlIGZyZWVkIGFmdGVyCisJCQkgKiBzYW1wbGVfX3Jlc29sdmVfYnN0YWNrKCkgYW5kIHdpbGwgYmUgZnJlZWQgYWZ0ZXIKIAkJCSAqIGFkZGluZyBuZXcgZW50cmllcy4gIFNvIHdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkuCiAJCQkgKi8KIAkJCWhlLT5icmFuY2hfaW5mbyA9IG1hbGxvYyhzaXplb2YoKmhlLT5icmFuY2hfaW5mbykpOwpAQCAtMzY5LDcgKzM2Miw3IEBACiAJCQloZV9zdGF0X19hZGRfcGVyaW9kKCZoZS0+c3RhdCwgcGVyaW9kLCB3ZWlnaHQpOwogCiAJCQkvKgotCQkJICogVGhpcyBtZW0gaW5mbyB3YXMgYWxsb2NhdGVkIGZyb20gbWFjaGluZV9fcmVzb2x2ZV9tZW0KKwkJCSAqIFRoaXMgbWVtIGluZm8gd2FzIGFsbG9jYXRlZCBmcm9tIHNhbXBsZV9fcmVzb2x2ZV9tZW0KIAkJCSAqIGFuZCB3aWxsIG5vdCBiZSB1c2VkIGFueW1vcmUuCiAJCQkgKi8KIAkJCXpmcmVlKCZlbnRyeS0+bWVtX2luZm8pOwpAQCAtNDI5LDcgKzQyMiw3IEBACiAJCQkud2VpZ2h0ID0gd2VpZ2h0LAogCQl9LAogCQkucGFyZW50ID0gc3ltX3BhcmVudCwKLQkJLmZpbHRlcmVkID0gc3ltYm9sX19wYXJlbnRfZmlsdGVyKHN5bV9wYXJlbnQpLAorCQkuZmlsdGVyZWQgPSBzeW1ib2xfX3BhcmVudF9maWx0ZXIoc3ltX3BhcmVudCkgfCBhbC0+ZmlsdGVyZWQsCiAJCS5oaXN0cwk9IGhpc3RzLAogCQkuYnJhbmNoX2luZm8gPSBiaSwKIAkJLm1lbV9pbmZvID0gbWksCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAppbmRleCBhNTk3NDNmLi4xZjFmNTEzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKQEAgLTE0LDYgKzE0LDE1IEBACiBzdHJ1Y3QgYWRkcl9sb2NhdGlvbjsKIHN0cnVjdCBzeW1ib2w7CiAKK2VudW0gaGlzdF9maWx0ZXIgeworCUhJU1RfRklMVEVSX19EU08sCisJSElTVF9GSUxURVJfX1RIUkVBRCwKKwlISVNUX0ZJTFRFUl9fUEFSRU5ULAorCUhJU1RfRklMVEVSX19TWU1CT0wsCisJSElTVF9GSUxURVJfX0dVRVNULAorCUhJU1RfRklMVEVSX19IT1NULAorfTsKKwogLyoKICAqIFRoZSBrZXJuZWwgY29sbGVjdHMgdGhlIG51bWJlciBvZiBldmVudHMgaXQgY291bGRuJ3Qgc2VuZCBpbiBhIHN0cmV0Y2ggYW5kCiAgKiB3aGVuIHBvc3NpYmxlIHNlbmRzIHRoaXMgbnVtYmVyIGluIGEgUEVSRl9SRUNPUkRfTE9TVCBldmVudC4gVGhlIG51bWJlciBvZgpAQCAtMTMyLDggKzE0MSwxMCBAQAogfTsKIAogc3RydWN0IHBlcmZfaHBwX2ZtdCB7Ci0JaW50ICgqaGVhZGVyKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwKTsKLQlpbnQgKCp3aWR0aCkoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCk7CisJaW50ICgqaGVhZGVyKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpOworCWludCAoKndpZHRoKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CiAJaW50ICgqY29sb3IpKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwgc3RydWN0IHBlcmZfaHBwICpocHAsCiAJCSAgICAgc3RydWN0IGhpc3RfZW50cnkgKmhlKTsKIAlpbnQgKCplbnRyeSkoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKQEAgLTE2Niw2ICsxNzcsMjAgQEAKIHZvaWQgcGVyZl9ocHBfX2NvbHVtbl9yZWdpc3RlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmb3JtYXQpOwogdm9pZCBwZXJmX2hwcF9fY29sdW1uX2VuYWJsZSh1bnNpZ25lZCBjb2wpOwogCit0eXBlZGVmIHU2NCAoKmhwcF9maWVsZF9mbikoc3RydWN0IGhpc3RfZW50cnkgKmhlKTsKK3R5cGVkZWYgaW50ICgqaHBwX2NhbGxiYWNrX2ZuKShzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgYm9vbCBmcm9udCk7Cit0eXBlZGVmIGludCAoKmhwcF9zbnByaW50X2ZuKShzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCitpbnQgX19ocHBfX2ZtdChzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlLAorCSAgICAgICBocHBfZmllbGRfZm4gZ2V0X2ZpZWxkLCBocHBfY2FsbGJhY2tfZm4gY2FsbGJhY2ssCisJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgaHBwX3NucHJpbnRfZm4gcHJpbnRfZm4sIGJvb2wgZm10X3BlcmNlbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgYWR2YW5jZV9ocHAoc3RydWN0IHBlcmZfaHBwICpocHAsIGludCBpbmMpCit7CisJaHBwLT5idWYgICs9IGluYzsKKwlocHAtPnNpemUgLT0gaW5jOworfQorCiBzdGF0aWMgaW5saW5lIHNpemVfdCBwZXJmX2hwcF9fdXNlX2NvbG9yKHZvaWQpCiB7CiAJcmV0dXJuICFzeW1ib2xfY29uZi5maWVsZF9zZXA7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9oYXNoLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWY1NzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvaGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9saW51eC9oYXNoLmgiCi0KLSNpZm5kZWYgUEVSRl9IQVNIX0gKLSNkZWZpbmUgUEVSRl9IQVNIX0gKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgva2VybmVsLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBkOGM5MjdjLi45ODQ0YzMxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtOTQsMTIgKzk0LDYgQEAKIAlyZXR1cm4gKGkgPj0gc3NpemUpID8gKHNzaXplIC0gMSkgOiBpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKQotewotCXJldHVybiBzdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Ci19Ci0KIGludCBlcHJpbnRmKGludCBsZXZlbCwKIAkgICAgY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L2xpc3QuaAppbmRleCAxZDkyOGEwLi5iZmUwYTJhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9saXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvbGlzdC5oCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAKICNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2xpbnV4L2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvbWFnaWMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDYzY2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvbWFnaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNpZm5kZWYgX1BFUkZfTElOVVhfTUFHSUNfSF8KLSNkZWZpbmUgX1BFUkZfTElOVVhfTUFHSUNfSF8KLQotI2lmbmRlZiBERUJVR0ZTX01BR0lDCi0jZGVmaW5lIERFQlVHRlNfTUFHSUMgICAgICAgICAgMHg2NDYyNjcyMAotI2VuZGlmCi0KLSNpZm5kZWYgU1lTRlNfTUFHSUMKLSNkZWZpbmUgU1lTRlNfTUFHSUMgICAgICAgICAgICAweDYyNjU2NTcyCi0jZW5kaWYKLQotI2lmbmRlZiBQUk9DX1NVUEVSX01BR0lDCi0jZGVmaW5lIFBST0NfU1VQRVJfTUFHSUMgICAgICAgMHg5ZmEwCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oIGIvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0MWU0OC4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIFBFUkZfTElOVVhfUFJFRkVUQ0hfSAotI2RlZmluZSBQRVJGX0xJTlVYX1BSRUZFVENIX0gKLQotc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoKHZvaWQgKmEgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpIHsgfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jCmluZGV4IDYyMGExOTguLmE1M2NkMGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYwpAQCAtMzI3LDkgKzMyNywxMCBAQAogCXJldHVybiBfX21hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIHBpZCwgdGlkLCB0cnVlKTsKIH0KIAotc3RydWN0IHRocmVhZCAqbWFjaGluZV9fZmluZF90aHJlYWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHBpZF90IHRpZCkKK3N0cnVjdCB0aHJlYWQgKm1hY2hpbmVfX2ZpbmRfdGhyZWFkKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBwaWRfdCBwaWQsCisJCQkJICAgIHBpZF90IHRpZCkKIHsKLQlyZXR1cm4gX19tYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCAwLCB0aWQsIGZhbHNlKTsKKwlyZXR1cm4gX19tYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCBwaWQsIHRpZCwgZmFsc2UpOwogfQogCiBpbnQgbWFjaGluZV9fcHJvY2Vzc19jb21tX2V2ZW50KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKQEAgLTEwMjYsNyArMTAyNyw3IEBACiAJfQogCiAJdGhyZWFkID0gbWFjaGluZV9fZmluZG5ld190aHJlYWQobWFjaGluZSwgZXZlbnQtPm1tYXAyLnBpZCwKLQkJCQkJZXZlbnQtPm1tYXAyLnBpZCk7CisJCQkJCWV2ZW50LT5tbWFwMi50aWQpOwogCWlmICh0aHJlYWQgPT0gTlVMTCkKIAkJZ290byBvdXRfcHJvYmxlbTsKIApAQCAtMTA3NCw3ICsxMDc1LDcgQEAKIAl9CiAKIAl0aHJlYWQgPSBtYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCBldmVudC0+bW1hcC5waWQsCi0JCQkJCSBldmVudC0+bW1hcC5waWQpOworCQkJCQkgZXZlbnQtPm1tYXAudGlkKTsKIAlpZiAodGhyZWFkID09IE5VTEwpCiAJCWdvdG8gb3V0X3Byb2JsZW07CiAKQEAgLTExMTQsNyArMTExNSw5IEBACiBpbnQgbWFjaGluZV9fcHJvY2Vzc19mb3JrX2V2ZW50KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBtYWNoaW5lX19maW5kX3RocmVhZChtYWNoaW5lLCBldmVudC0+Zm9yay50aWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRfdGhyZWFkKG1hY2hpbmUsCisJCQkJCQkgICAgIGV2ZW50LT5mb3JrLnBpZCwKKwkJCQkJCSAgICAgZXZlbnQtPmZvcmsudGlkKTsKIAlzdHJ1Y3QgdGhyZWFkICpwYXJlbnQgPSBtYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLAogCQkJCQkJCWV2ZW50LT5mb3JrLnBwaWQsCiAJCQkJCQkJZXZlbnQtPmZvcmsucHRpZCk7CkBAIC0xMTQwLDcgKzExNDMsOSBAQAogaW50IG1hY2hpbmVfX3Byb2Nlc3NfZXhpdF9ldmVudChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX19tYXliZV91bnVzZWQpCiB7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gbWFjaGluZV9fZmluZF90aHJlYWQobWFjaGluZSwgZXZlbnQtPmZvcmsudGlkKTsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBtYWNoaW5lX19maW5kX3RocmVhZChtYWNoaW5lLAorCQkJCQkJICAgICBldmVudC0+Zm9yay5waWQsCisJCQkJCQkgICAgIGV2ZW50LT5mb3JrLnRpZCk7CiAKIAlpZiAoZHVtcF90cmFjZSkKIAkJcGVyZl9ldmVudF9fZnByaW50Zl90YXNrKGV2ZW50LCBzdGRvdXQpOwpAQCAtMTE4NCwzOSArMTE4OSwyMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgdTggY3B1bW9kZXNbXSA9IHsKLQlQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCi0JUEVSRl9SRUNPUkRfTUlTQ19LRVJORUwsCi0JUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9VU0VSLAotCVBFUkZfUkVDT1JEX01JU0NfR1VFU1RfS0VSTkVMCi19OwotI2RlZmluZSBOQ1BVTU9ERVMgKHNpemVvZihjcHVtb2Rlcykvc2l6ZW9mKHU4KSkKLQogc3RhdGljIHZvaWQgaXBfX3Jlc29sdmVfYW1zKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCiAJCQkgICAgc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqYW1zLAogCQkJICAgIHU2NCBpcCkKIHsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKLQlzaXplX3QgaTsKLQl1OCBtOwogCiAJbWVtc2V0KCZhbCwgMCwgc2l6ZW9mKGFsKSk7CisJLyoKKwkgKiBXZSBjYW5ub3QgdXNlIHRoZSBoZWFkZXIubWlzYyBoaW50IHRvIGRldGVybWluZSB3aGV0aGVyIGEKKwkgKiBicmFuY2ggc3RhY2sgYWRkcmVzcyBpcyB1c2VyLCBrZXJuZWwsIGd1ZXN0LCBoeXBlcnZpc29yLgorCSAqIEJyYW5jaGVzIG1heSBzdHJhZGRsZSB0aGUga2VybmVsL3VzZXIvaHlwZXJ2aXNvciBib3VuZGFyaWVzLgorCSAqIFRodXMsIHdlIGhhdmUgdG8gdHJ5IGNvbnNlY3V0aXZlbHkgdW50aWwgd2UgZmluZCBhIG1hdGNoCisJICogb3IgZWxzZSwgdGhlIHN5bWJvbCBpcyB1bmtub3duCisJICovCisJdGhyZWFkX19maW5kX2NwdW1vZGVfYWRkcl9sb2NhdGlvbih0aHJlYWQsIG1hY2hpbmUsIE1BUF9fRlVOQ1RJT04sIGlwLCAmYWwpOwogCi0JZm9yIChpID0gMDsgaSA8IE5DUFVNT0RFUzsgaSsrKSB7Ci0JCW0gPSBjcHVtb2Rlc1tpXTsKLQkJLyoKLQkJICogV2UgY2Fubm90IHVzZSB0aGUgaGVhZGVyLm1pc2MgaGludCB0byBkZXRlcm1pbmUgd2hldGhlciBhCi0JCSAqIGJyYW5jaCBzdGFjayBhZGRyZXNzIGlzIHVzZXIsIGtlcm5lbCwgZ3Vlc3QsIGh5cGVydmlzb3IuCi0JCSAqIEJyYW5jaGVzIG1heSBzdHJhZGRsZSB0aGUga2VybmVsL3VzZXIvaHlwZXJ2aXNvciBib3VuZGFyaWVzLgotCQkgKiBUaHVzLCB3ZSBoYXZlIHRvIHRyeSBjb25zZWN1dGl2ZWx5IHVudGlsIHdlIGZpbmQgYSBtYXRjaAotCQkgKiBvciBlbHNlLCB0aGUgc3ltYm9sIGlzIHVua25vd24KLQkJICovCi0JCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHRocmVhZCwgbWFjaGluZSwgbSwgTUFQX19GVU5DVElPTiwKLQkJCQlpcCwgJmFsKTsKLQkJaWYgKGFsLm1hcCkKLQkJCWdvdG8gZm91bmQ7Ci0JfQotZm91bmQ6CiAJYW1zLT5hZGRyID0gaXA7CiAJYW1zLT5hbF9hZGRyID0gYWwuYWRkcjsKIAlhbXMtPnN5bSA9IGFsLnN5bTsKQEAgLTEyMzgsMzcgKzEyMjYsMzUgQEAKIAlhbXMtPm1hcCA9IGFsLm1hcDsKIH0KIAotc3RydWN0IG1lbV9pbmZvICptYWNoaW5lX19yZXNvbHZlX21lbShzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHIsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgICAgdTggY3B1bW9kZSkKK3N0cnVjdCBtZW1faW5mbyAqc2FtcGxlX19yZXNvbHZlX21lbShzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKIHsKIAlzdHJ1Y3QgbWVtX2luZm8gKm1pID0gemFsbG9jKHNpemVvZigqbWkpKTsKIAogCWlmICghbWkpCiAJCXJldHVybiBOVUxMOwogCi0JaXBfX3Jlc29sdmVfYW1zKG1hY2hpbmUsIHRociwgJm1pLT5pYWRkciwgc2FtcGxlLT5pcCk7Ci0JaXBfX3Jlc29sdmVfZGF0YShtYWNoaW5lLCB0aHIsIGNwdW1vZGUsICZtaS0+ZGFkZHIsIHNhbXBsZS0+YWRkcik7CisJaXBfX3Jlc29sdmVfYW1zKGFsLT5tYWNoaW5lLCBhbC0+dGhyZWFkLCAmbWktPmlhZGRyLCBzYW1wbGUtPmlwKTsKKwlpcF9fcmVzb2x2ZV9kYXRhKGFsLT5tYWNoaW5lLCBhbC0+dGhyZWFkLCBhbC0+Y3B1bW9kZSwKKwkJCSAmbWktPmRhZGRyLCBzYW1wbGUtPmFkZHIpOwogCW1pLT5kYXRhX3NyYy52YWwgPSBzYW1wbGUtPmRhdGFfc3JjOwogCiAJcmV0dXJuIG1pOwogfQogCi1zdHJ1Y3QgYnJhbmNoX2luZm8gKm1hY2hpbmVfX3Jlc29sdmVfYnN0YWNrKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAotCQkJCQkgICAgc3RydWN0IHRocmVhZCAqdGhyLAotCQkJCQkgICAgc3RydWN0IGJyYW5jaF9zdGFjayAqYnMpCitzdHJ1Y3QgYnJhbmNoX2luZm8gKnNhbXBsZV9fcmVzb2x2ZV9ic3RhY2soc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKIHsKLQlzdHJ1Y3QgYnJhbmNoX2luZm8gKmJpOwogCXVuc2lnbmVkIGludCBpOworCWNvbnN0IHN0cnVjdCBicmFuY2hfc3RhY2sgKmJzID0gc2FtcGxlLT5icmFuY2hfc3RhY2s7CisJc3RydWN0IGJyYW5jaF9pbmZvICpiaSA9IGNhbGxvYyhicy0+bnIsIHNpemVvZihzdHJ1Y3QgYnJhbmNoX2luZm8pKTsKIAotCWJpID0gY2FsbG9jKGJzLT5uciwgc2l6ZW9mKHN0cnVjdCBicmFuY2hfaW5mbykpOwogCWlmICghYmkpCiAJCXJldHVybiBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IGJzLT5ucjsgaSsrKSB7Ci0JCWlwX19yZXNvbHZlX2FtcyhtYWNoaW5lLCB0aHIsICZiaVtpXS50bywgYnMtPmVudHJpZXNbaV0udG8pOwotCQlpcF9fcmVzb2x2ZV9hbXMobWFjaGluZSwgdGhyLCAmYmlbaV0uZnJvbSwgYnMtPmVudHJpZXNbaV0uZnJvbSk7CisJCWlwX19yZXNvbHZlX2FtcyhhbC0+bWFjaGluZSwgYWwtPnRocmVhZCwgJmJpW2ldLnRvLCBicy0+ZW50cmllc1tpXS50byk7CisJCWlwX19yZXNvbHZlX2FtcyhhbC0+bWFjaGluZSwgYWwtPnRocmVhZCwgJmJpW2ldLmZyb20sIGJzLT5lbnRyaWVzW2ldLmZyb20pOwogCQliaVtpXS5mbGFncyA9IGJzLT5lbnRyaWVzW2ldLmZsYWdzOwogCX0KIAlyZXR1cm4gYmk7CkBAIC0xMzI2LDcgKzEzMTIsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlhbC5maWx0ZXJlZCA9IGZhbHNlOworCQlhbC5maWx0ZXJlZCA9IDA7CiAJCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHRocmVhZCwgbWFjaGluZSwgY3B1bW9kZSwKIAkJCQkJICAgTUFQX19GVU5DVElPTiwgaXAsICZhbCk7CiAJCWlmIChhbC5zeW0gIT0gTlVMTCkgewpAQCAtMTM4NSw4ICsxMzcxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnksICZjYWxsY2hhaW5fY3Vyc29yLCBtYWNoaW5lLAotCQkJCSAgIHRocmVhZCwgZXZzZWwtPmF0dHIuc2FtcGxlX3JlZ3NfdXNlciwKLQkJCQkgICBzYW1wbGUsIG1heF9zdGFjayk7CisJCQkJICAgdGhyZWFkLCBzYW1wbGUsIG1heF9zdGFjayk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmgKaW5kZXggZjc3ZTkxZS4uYzhjNzRhMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaAorKysgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oCkBAIC00MSw3ICs0MSw4IEBACiAJcmV0dXJuIG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXTsKIH0KIAotc3RydWN0IHRocmVhZCAqbWFjaGluZV9fZmluZF90aHJlYWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHBpZF90IHRpZCk7CitzdHJ1Y3QgdGhyZWFkICptYWNoaW5lX19maW5kX3RocmVhZChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgcGlkX3QgcGlkLAorCQkJCSAgICBwaWRfdCB0aWQpOwogCiBpbnQgbWFjaGluZV9fcHJvY2Vzc19jb21tX2V2ZW50KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSk7CkBAIC05MSwxMiArOTIsMTAgQEAKIHZvaWQgbWFjaGluZV9fZGVsZXRlX3RocmVhZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogdm9pZCBtYWNoaW5lX19kZWxldGUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogCi1zdHJ1Y3QgYnJhbmNoX2luZm8gKm1hY2hpbmVfX3Jlc29sdmVfYnN0YWNrKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAotCQkJCQkgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkLAotCQkJCQkgICAgc3RydWN0IGJyYW5jaF9zdGFjayAqYnMpOwotc3RydWN0IG1lbV9pbmZvICptYWNoaW5lX19yZXNvbHZlX21lbShzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHU4IGNwdW1vZGUpOworc3RydWN0IGJyYW5jaF9pbmZvICpzYW1wbGVfX3Jlc29sdmVfYnN0YWNrKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJCQkgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOworc3RydWN0IG1lbV9pbmZvICpzYW1wbGVfX3Jlc29sdmVfbWVtKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJCSAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKTsKIGludCBtYWNoaW5lX19yZXNvbHZlX2NhbGxjaGFpbihzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkgICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21hcC5oIGIvdG9vbHMvcGVyZi91dGlsL21hcC5oCmluZGV4IDI1N2U1MTMuLmYwMGYwNTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaAorKysgYi90b29scy9wZXJmL3V0aWwvbWFwLmgKQEAgLTkwLDYgKzkwLDE2IEBACiAKIHN0cnVjdCBzeW1ib2w7CiAKKy8qIG1hcF9fZm9yX2VhY2hfc3ltYm9sIC0gaXRlcmF0ZSBvdmVyIHRoZSBzeW1ib2xzIGluIHRoZSBnaXZlbiBtYXAKKyAqCisgKiBAbWFwOiB0aGUgJ3N0cnVjdCBtYXAgKicgaW4gd2hpY2ggc3ltYm9scyBpdGVyZWF0ZWQKKyAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgorICogQG46IHRoZSAnc3RydWN0IHJiX25vZGUgKicgdG8gdXNlIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIE5vdGU6IGNhbGxlciBtdXN0IGVuc3VyZSBtYXAtPmRzbyBpcyBub3QgTlVMTCAobWFwIGlzIGxvYWRlZCkuCisgKi8KKyNkZWZpbmUgbWFwX19mb3JfZWFjaF9zeW1ib2wobWFwLCBwb3MsIG4pCVwKKwlkc29fX2Zvcl9lYWNoX3N5bWJvbChtYXAtPmRzbywgcG9zLCBuLCBtYXAtPnR5cGUpCisKIHR5cGVkZWYgaW50ICgqc3ltYm9sX2ZpbHRlcl90KShzdHJ1Y3QgbWFwICptYXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CiAKIHZvaWQgbWFwX19pbml0KHN0cnVjdCBtYXAgKm1hcCwgZW51bSBtYXBfdHlwZSB0eXBlLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMKaW5kZXggZDIyZTNmODAuLmJmNDgwOTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYwpAQCAtNDA3LDcgKzQwNyw5IEBACiAJCWlmIChpbnRlcm5hbF9oZWxwICYmICFzdHJjbXAoYXJnICsgMiwgImhlbHAiKSkKIAkJCXJldHVybiB1c2FnZV93aXRoX29wdGlvbnNfaW50ZXJuYWwodXNhZ2VzdHIsIG9wdGlvbnMsIDApOwogCQlpZiAoIXN0cmNtcChhcmcgKyAyLCAibGlzdC1vcHRzIikpCi0JCQlyZXR1cm4gUEFSU0VfT1BUX0xJU1Q7CisJCQlyZXR1cm4gUEFSU0VfT1BUX0xJU1RfT1BUUzsKKwkJaWYgKCFzdHJjbXAoYXJnICsgMiwgImxpc3QtY21kcyIpKQorCQkJcmV0dXJuIFBBUlNFX09QVF9MSVNUX1NVQkNNRFM7CiAJCXN3aXRjaCAocGFyc2VfbG9uZ19vcHQoY3R4LCBhcmcgKyAyLCBvcHRpb25zKSkgewogCQljYXNlIC0xOgogCQkJcmV0dXJuIHBhcnNlX29wdGlvbnNfdXNhZ2UodXNhZ2VzdHIsIG9wdGlvbnMsIGFyZyArIDIsIDApOwpAQCAtNDMzLDI1ICs0MzUsNDUgQEAKIAlyZXR1cm4gY3R4LT5jcGlkeCArIGN0eC0+YXJnYzsKIH0KIAotaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAotCQkgIGNvbnN0IGNoYXIgKiBjb25zdCB1c2FnZXN0cltdLCBpbnQgZmxhZ3MpCitpbnQgcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucywKKwkJCWNvbnN0IGNoYXIgKmNvbnN0IHN1YmNvbW1hbmRzW10sIGNvbnN0IGNoYXIgKnVzYWdlc3RyW10sIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90IGN0eDsKIAogCXBlcmZfaGVhZGVyX19zZXRfY21kbGluZShhcmdjLCBhcmd2KTsKIAorCS8qIGJ1aWxkIHVzYWdlIHN0cmluZyBpZiBpdCdzIG5vdCBwcm92aWRlZCAqLworCWlmIChzdWJjb21tYW5kcyAmJiAhdXNhZ2VzdHJbMF0pIHsKKwkJc3RydWN0IHN0cmJ1ZiBidWYgPSBTVFJCVUZfSU5JVDsKKworCQlzdHJidWZfYWRkZigmYnVmLCAicGVyZiAlcyBbPG9wdGlvbnM+XSB7IiwgYXJndlswXSk7CisJCWZvciAoaW50IGkgPSAwOyBzdWJjb21tYW5kc1tpXTsgaSsrKSB7CisJCQlpZiAoaSkKKwkJCQlzdHJidWZfYWRkc3RyKCZidWYsICJ8Iik7CisJCQlzdHJidWZfYWRkc3RyKCZidWYsIHN1YmNvbW1hbmRzW2ldKTsKKwkJfQorCQlzdHJidWZfYWRkc3RyKCZidWYsICJ9Iik7CisKKwkJdXNhZ2VzdHJbMF0gPSBzdHJkdXAoYnVmLmJ1Zik7CisJCXN0cmJ1Zl9yZWxlYXNlKCZidWYpOworCX0KKwogCXBhcnNlX29wdGlvbnNfc3RhcnQoJmN0eCwgYXJnYywgYXJndiwgZmxhZ3MpOwogCXN3aXRjaCAocGFyc2Vfb3B0aW9uc19zdGVwKCZjdHgsIG9wdGlvbnMsIHVzYWdlc3RyKSkgewogCWNhc2UgUEFSU0VfT1BUX0hFTFA6CiAJCWV4aXQoMTI5KTsKIAljYXNlIFBBUlNFX09QVF9ET05FOgogCQlicmVhazsKLQljYXNlIFBBUlNFX09QVF9MSVNUOgorCWNhc2UgUEFSU0VfT1BUX0xJU1RfT1BUUzoKIAkJd2hpbGUgKG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORCkgewogCQkJcHJpbnRmKCItLSVzICIsIG9wdGlvbnMtPmxvbmdfbmFtZSk7CiAJCQlvcHRpb25zKys7CiAJCX0KIAkJZXhpdCgxMzApOworCWNhc2UgUEFSU0VfT1BUX0xJU1RfU1VCQ01EUzoKKwkJZm9yIChpbnQgaSA9IDA7IHN1YmNvbW1hbmRzW2ldOyBpKyspCisJCQlwcmludGYoIiVzICIsIHN1YmNvbW1hbmRzW2ldKTsKKwkJZXhpdCgxMzApOwogCWRlZmF1bHQ6IC8qIFBBUlNFX09QVF9VTktOT1dOICovCiAJCWlmIChjdHguYXJndlswXVsxXSA9PSAnLScpIHsKIAkJCWVycm9yKCJ1bmtub3duIG9wdGlvbiBgJXMnIiwgY3R4LmFyZ3ZbMF0gKyAyKTsKQEAgLTQ2NCw2ICs0ODYsMTMgQEAKIAlyZXR1cm4gcGFyc2Vfb3B0aW9uc19lbmQoJmN0eCk7CiB9CiAKK2ludCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucywKKwkJICBjb25zdCBjaGFyICogY29uc3QgdXNhZ2VzdHJbXSwgaW50IGZsYWdzKQoreworCXJldHVybiBwYXJzZV9vcHRpb25zX3N1YmNvbW1hbmQoYXJnYywgYXJndiwgb3B0aW9ucywgTlVMTCwKKwkJCQkJKGNvbnN0IGNoYXIgKiopIHVzYWdlc3RyLCBmbGFncyk7Cit9CisKICNkZWZpbmUgVVNBR0VfT1BUU19XSURUSCAyNAogI2RlZmluZSBVU0FHRV9HQVAgICAgICAgICAyCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmggYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oCmluZGV4IGNiZjAxNDkuLmQ4ZGFjOGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaApAQCAtMTQwLDYgKzE0MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHVzYWdlc3RyW10sIGludCBmbGFncyk7CiAKK2V4dGVybiBpbnQgcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAorCQkJCWNvbnN0IGNoYXIgKmNvbnN0IHN1YmNvbW1hbmRzW10sCisJCQkJY29uc3QgY2hhciAqdXNhZ2VzdHJbXSwgaW50IGZsYWdzKTsKKwogZXh0ZXJuIE5PUkVUVVJOIHZvaWQgdXNhZ2Vfd2l0aF9vcHRpb25zKGNvbnN0IGNoYXIgKiBjb25zdCAqdXNhZ2VzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucyk7CiAKQEAgLTE0OCw3ICsxNTMsOCBAQAogZW51bSB7CiAJUEFSU0VfT1BUX0hFTFAgPSAtMSwKIAlQQVJTRV9PUFRfRE9ORSwKLQlQQVJTRV9PUFRfTElTVCwKKwlQQVJTRV9PUFRfTElTVF9PUFRTLAorCVBBUlNFX09QVF9MSVNUX1NVQkNNRFMsCiAJUEFSU0VfT1BUX1VOS05PV04sCiB9OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGVyZl9yZWdzLmMgYi90b29scy9wZXJmL3V0aWwvcGVyZl9yZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1MzllZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wZXJmX3JlZ3MuYwpAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJwZXJmX3JlZ3MuaCIKKworaW50IHBlcmZfcmVnX3ZhbHVlKHU2NCAqdmFscCwgc3RydWN0IHJlZ3NfZHVtcCAqcmVncywgaW50IGlkKQoreworCWludCBpLCBpZHggPSAwOworCXU2NCBtYXNrID0gcmVncy0+bWFzazsKKworCWlmICghKG1hc2sgJiAoMSA8PCBpZCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBpZDsgaSsrKSB7CisJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQlpZHgrKzsKKwl9CisKKwkqdmFscCA9IHJlZ3MtPnJlZ3NbaWR4XTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wZXJmX3JlZ3MuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wZXJmX3JlZ3MuaAppbmRleCBhM2Q0MmNkLi5kNmU4YjZhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGVyZl9yZWdzLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BlcmZfcmVncy5oCkBAIC0xLDggKzEsMTQgQEAKICNpZm5kZWYgX19QRVJGX1JFR1NfSAogI2RlZmluZSBfX1BFUkZfUkVHU19ICiAKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisKICNpZmRlZiBIQVZFX1BFUkZfUkVHU19TVVBQT1JUCiAjaW5jbHVkZSA8cGVyZl9yZWdzLmg+CisKK2ludCBwZXJmX3JlZ192YWx1ZSh1NjQgKnZhbHAsIHN0cnVjdCByZWdzX2R1bXAgKnJlZ3MsIGludCBpZCk7CisKICNlbHNlCiAjZGVmaW5lIFBFUkZfUkVHU19NQVNLCTAKIApAQCAtMTAsNSArMTYsMTIgQEAKIHsKIAlyZXR1cm4gTlVMTDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgcGVyZl9yZWdfdmFsdWUodTY0ICp2YWxwIF9fbWF5YmVfdW51c2VkLAorCQkJCSBzdHJ1Y3QgcmVnc19kdW1wICpyZWdzIF9fbWF5YmVfdW51c2VkLAorCQkJCSBpbnQgaWQgX19tYXliZV91bnVzZWQpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogSEFWRV9QRVJGX1JFR1NfU1VQUE9SVCAqLwogI2VuZGlmIC8qIF9fUEVSRl9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYwppbmRleCBiNzUyZWNiLi4wMGE3ZGNiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcG11LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BtdS5jCkBAIC0zLDcgKzMsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlIDxsb2NhbGUuaD4KICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAicG11LmgiCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCmluZGV4IGQ4YjA0OGMuLjBkMTU0MmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCkBAIC03MCwzNCArNzAsMzIgQEAKIH0KIAogc3RhdGljIGNoYXIgKnN5bnRoZXNpemVfcGVyZl9wcm9iZV9wb2ludChzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHApOwotc3RhdGljIGludCBjb252ZXJ0X25hbWVfdG9fYWRkcihzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAotCQkJCWNvbnN0IGNoYXIgKmV4ZWMpOwogc3RhdGljIHZvaWQgY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQoc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICp0ZXYpOwotc3RhdGljIHN0cnVjdCBtYWNoaW5lIG1hY2hpbmU7CitzdGF0aWMgc3RydWN0IG1hY2hpbmUgKmhvc3RfbWFjaGluZTsKIAogLyogSW5pdGlhbGl6ZSBzeW1ib2wgbWFwcyBhbmQgcGF0aCBvZiB2bWxpbnV4L21vZHVsZXMgKi8KLXN0YXRpYyBpbnQgaW5pdF92bWxpbnV4KHZvaWQpCitzdGF0aWMgaW50IGluaXRfc3ltYm9sX21hcHMoYm9vbCB1c2VyX29ubHkpCiB7CiAJaW50IHJldDsKIAogCXN5bWJvbF9jb25mLnNvcnRfYnlfbmFtZSA9IHRydWU7Ci0JaWYgKHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSA9PSBOVUxMKQotCQlzeW1ib2xfY29uZi50cnlfdm1saW51eF9wYXRoID0gdHJ1ZTsKLQllbHNlCi0JCXByX2RlYnVnKCJVc2Ugdm1saW51eDogJXNcbiIsIHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSk7CiAJcmV0ID0gc3ltYm9sX19pbml0KCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBpbml0IHN5bWJvbCBtYXAuXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gbWFjaGluZV9faW5pdCgmbWFjaGluZSwgIiIsIEhPU1RfS0VSTkVMX0lEKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJaWYgKGhvc3RfbWFjaGluZSB8fCB1c2VyX29ubHkpCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJcmV0dXJuIDA7CiAKLQlpZiAobWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKCZtYWNoaW5lKSA8IDApIHsKLQkJcHJfZGVidWcoIm1hY2hpbmVfX2NyZWF0ZV9rZXJuZWxfbWFwcygpIGZhaWxlZC5cbiIpOwotCQlnb3RvIG91dDsKKwlpZiAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lKQorCQlwcl9kZWJ1ZygiVXNlIHZtbGludXg6ICVzXG4iLCBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUpOworCisJaG9zdF9tYWNoaW5lID0gbWFjaGluZV9fbmV3X2hvc3QoKTsKKwlpZiAoIWhvc3RfbWFjaGluZSkgeworCQlwcl9kZWJ1ZygibWFjaGluZV9fbmV3X2hvc3QoKSBmYWlsZWQuXG4iKTsKKwkJc3ltYm9sX19leGl0KCk7CisJCXJldCA9IC0xOwogCX0KIG91dDoKIAlpZiAocmV0IDwgMCkKQEAgLTEwNSwyMSArMTAzLDY2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgZXhpdF9zeW1ib2xfbWFwcyh2b2lkKQoreworCWlmIChob3N0X21hY2hpbmUpIHsKKwkJbWFjaGluZV9fZGVsZXRlKGhvc3RfbWFjaGluZSk7CisJCWhvc3RfbWFjaGluZSA9IE5VTEw7CisJfQorCXN5bWJvbF9fZXhpdCgpOworfQorCiBzdGF0aWMgc3RydWN0IHN5bWJvbCAqX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCQkgICAgIHN0cnVjdCBtYXAgKiptYXBwKQogewotCXJldHVybiBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKCZtYWNoaW5lLCBuYW1lLCBtYXBwLAorCXJldHVybiBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKGhvc3RfbWFjaGluZSwgbmFtZSwgbWFwcCwKIAkJCQkJCSAgICAgTlVMTCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKHU2NCBhZGRyLCBzdHJ1Y3QgbWFwICoqbWFwcCkKK3sKKwlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24oaG9zdF9tYWNoaW5lLCBhZGRyLCBtYXBwLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCByZWZfcmVsb2Nfc3ltICprZXJuZWxfZ2V0X3JlZl9yZWxvY19zeW0odm9pZCkKK3sKKwkvKiBrbWFwLT5yZWZfcmVsb2Nfc3ltIHNob3VsZCBiZSBzZXQgaWYgaG9zdF9tYWNoaW5lIGlzIGluaXRpYWxpemVkICovCisJc3RydWN0IGttYXAgKmttYXA7CisKKwlpZiAobWFwX19sb2FkKGhvc3RfbWFjaGluZS0+dm1saW51eF9tYXBzW01BUF9fRlVOQ1RJT05dLCBOVUxMKSA8IDApCisJCXJldHVybiBOVUxMOworCisJa21hcCA9IG1hcF9fa21hcChob3N0X21hY2hpbmUtPnZtbGludXhfbWFwc1tNQVBfX0ZVTkNUSU9OXSk7CisJcmV0dXJuIGttYXAtPnJlZl9yZWxvY19zeW07Cit9CisKK3N0YXRpYyB1NjQga2VybmVsX2dldF9zeW1ib2xfYWRkcmVzc19ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgcmVsb2MpCit7CisJc3RydWN0IHJlZl9yZWxvY19zeW0gKnJlbG9jX3N5bTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IG1hcCAqbWFwOworCisJLyogcmVmX3JlbG9jX3N5bSBpcyBqdXN0IGEgbGFiZWwuIE5lZWQgYSBzcGVjaWFsIGZpeCovCisJcmVsb2Nfc3ltID0ga2VybmVsX2dldF9yZWZfcmVsb2Nfc3ltKCk7CisJaWYgKHJlbG9jX3N5bSAmJiBzdHJjbXAobmFtZSwgcmVsb2Nfc3ltLT5uYW1lKSA9PSAwKQorCQlyZXR1cm4gKHJlbG9jKSA/IHJlbG9jX3N5bS0+YWRkciA6IHJlbG9jX3N5bS0+dW5yZWxvY2F0ZWRfYWRkcjsKKwllbHNlIHsKKwkJc3ltID0gX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKG5hbWUsICZtYXApOworCQlpZiAoc3ltKQorCQkJcmV0dXJuIG1hcC0+dW5tYXBfaXAobWFwLCBzeW0tPnN0YXJ0KSAtCisJCQkJKHJlbG9jKSA/IDAgOiBtYXAtPnJlbG9jOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBtYXAgKmtlcm5lbF9nZXRfbW9kdWxlX21hcChjb25zdCBjaGFyICptb2R1bGUpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5kOwotCXN0cnVjdCBtYXBfZ3JvdXBzICpncnAgPSAmbWFjaGluZS5rbWFwczsKKwlzdHJ1Y3QgbWFwX2dyb3VwcyAqZ3JwID0gJmhvc3RfbWFjaGluZS0+a21hcHM7CiAKIAkvKiBBIGZpbGUgcGF0aCAtLSB0aGlzIGlzIGFuIG9mZmxpbmUgbW9kdWxlICovCiAJaWYgKG1vZHVsZSAmJiBzdHJjaHIobW9kdWxlLCAnLycpKQotCQlyZXR1cm4gbWFjaGluZV9fbmV3X21vZHVsZSgmbWFjaGluZSwgMCwgbW9kdWxlKTsKKwkJcmV0dXJuIG1hY2hpbmVfX25ld19tb2R1bGUoaG9zdF9tYWNoaW5lLCAwLCBtb2R1bGUpOwogCiAJaWYgKCFtb2R1bGUpCiAJCW1vZHVsZSA9ICJrZXJuZWwiOwpAQCAtMTQxLDcgKzE4NCw3IEBACiAJY29uc3QgY2hhciAqdm1saW51eF9uYW1lOwogCiAJaWYgKG1vZHVsZSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzbywgJm1hY2hpbmUua2VybmVsX2Rzb3MsIG5vZGUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkc28sICZob3N0X21hY2hpbmUtPmtlcm5lbF9kc29zLCBub2RlKSB7CiAJCQlpZiAoc3RybmNtcChkc28tPnNob3J0X25hbWUgKyAxLCBtb2R1bGUsCiAJCQkJICAgIGRzby0+c2hvcnRfbmFtZV9sZW4gLSAyKSA9PSAwKQogCQkJCWdvdG8gZm91bmQ7CkBAIC0xNTAsNyArMTkzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JbWFwID0gbWFjaGluZS52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl07CisJbWFwID0gaG9zdF9tYWNoaW5lLT52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl07CiAJZHNvID0gbWFwLT5kc287CiAKIAl2bWxpbnV4X25hbWUgPSBzeW1ib2xfY29uZi52bWxpbnV4X25hbWU7CkBAIC0xNzMsMjAgKzIxNiw2IEBACiAJcmV0dXJuIChkc28pID8gZHNvLT5sb25nX25hbWUgOiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGluaXRfdXNlcl9leGVjKHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlzeW1ib2xfY29uZi50cnlfdm1saW51eF9wYXRoID0gZmFsc2U7Ci0Jc3ltYm9sX2NvbmYuc29ydF9ieV9uYW1lID0gdHJ1ZTsKLQlyZXQgPSBzeW1ib2xfX2luaXQoKTsKLQotCWlmIChyZXQgPCAwKQotCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGluaXQgc3ltYm9sIG1hcC5cbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBjb252ZXJ0X2V4ZWNfdG9fZ3JvdXAoY29uc3QgY2hhciAqZXhlYywgY2hhciAqKnJlc3VsdCkKIHsKIAljaGFyICpwdHIxLCAqcHRyMiwgKmV4ZWNfY29weTsKQEAgLTIxOCwzMiArMjQ3LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBjb252ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQoc3RydWN0IHByb2JlX3RyYWNlX3BvaW50ICp0cCwKLQkJCQkJc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnBwKQorc3RhdGljIHZvaWQgY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2cywgaW50IG50ZXZzKQogewotCXBwLT5mdW5jdGlvbiA9IHN0cmR1cCh0cC0+c3ltYm9sKTsKKwlpbnQgaTsKIAotCWlmIChwcC0+ZnVuY3Rpb24gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcC0+b2Zmc2V0ID0gdHAtPm9mZnNldDsKLQlwcC0+cmV0cHJvYmUgPSB0cC0+cmV0cHJvYmU7Ci0KLQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnRldnM7IGkrKykKKwkJY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQodGV2cyArIGkpOwogfQogCiAjaWZkZWYgSEFWRV9EV0FSRl9TVVBQT1JUCisKIC8qIE9wZW4gbmV3IGRlYnVnaW5mbyBvZiBnaXZlbiBtb2R1bGUgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVidWdpbmZvICpvcGVuX2RlYnVnaW5mbyhjb25zdCBjaGFyICptb2R1bGUpCiB7Ci0JY29uc3QgY2hhciAqcGF0aDsKKwljb25zdCBjaGFyICpwYXRoID0gbW9kdWxlOwogCi0JLyogQSBmaWxlIHBhdGggLS0gdGhpcyBpcyBhbiBvZmZsaW5lIG1vZHVsZSAqLwotCWlmIChtb2R1bGUgJiYgc3RyY2hyKG1vZHVsZSwgJy8nKSkKLQkJcGF0aCA9IG1vZHVsZTsKLQllbHNlIHsKKwlpZiAoIW1vZHVsZSB8fCAhc3RyY2hyKG1vZHVsZSwgJy8nKSkgewogCQlwYXRoID0ga2VybmVsX2dldF9tb2R1bGVfcGF0aChtb2R1bGUpOwotCiAJCWlmICghcGF0aCkgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCBwYXRoIG9mICVzIG1vZHVsZS5cbiIsCiAJCQkgICAgICAgbW9kdWxlID86ICJrZXJuZWwiKTsKQEAgLTI1Myw0NiArMjczLDYgQEAKIAlyZXR1cm4gZGVidWdpbmZvX19uZXcocGF0aCk7CiB9CiAKLS8qCi0gKiBDb252ZXJ0IHRyYWNlIHBvaW50IHRvIHByb2JlIHBvaW50IHdpdGggZGVidWdpbmZvCi0gKiBDdXJyZW50bHkgb25seSBoYW5kbGVzIGtwcm9iZXMuCi0gKi8KLXN0YXRpYyBpbnQga3Byb2JlX2NvbnZlcnRfdG9fcGVyZl9wcm9iZShzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAotCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHApCi17Ci0Jc3RydWN0IHN5bWJvbCAqc3ltOwotCXN0cnVjdCBtYXAgKm1hcDsKLQl1NjQgYWRkcjsKLQlpbnQgcmV0ID0gLUVOT0VOVDsKLQlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKLQotCXN5bSA9IF9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZSh0cC0+c3ltYm9sLCAmbWFwKTsKLQlpZiAoc3ltKSB7Ci0JCWFkZHIgPSBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5zdGFydCArIHRwLT5vZmZzZXQpOwotCQlwcl9kZWJ1ZygidHJ5IHRvIGZpbmQgJXMrJWxkQCUiIFBSSXg2NCAiXG4iLCB0cC0+c3ltYm9sLAotCQkJIHRwLT5vZmZzZXQsIGFkZHIpOwotCi0JCWRpbmZvID0gZGVidWdpbmZvX19uZXdfb25saW5lX2tlcm5lbChhZGRyKTsKLQkJaWYgKGRpbmZvKSB7Ci0JCQlyZXQgPSBkZWJ1Z2luZm9fX2ZpbmRfcHJvYmVfcG9pbnQoZGluZm8sCi0JCQkJCQkgKHVuc2lnbmVkIGxvbmcpYWRkciwgcHApOwotCQkJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIkZhaWxlZCB0byBvcGVuIGRlYnVnaW5mbyBhdCAweCUiIFBSSXg2NCAiXG4iLAotCQkJCSBhZGRyKTsKLQkJCXJldCA9IC1FTk9FTlQ7Ci0JCX0KLQl9Ci0JaWYgKHJldCA8PSAwKSB7Ci0JCXByX2RlYnVnKCJGYWlsZWQgdG8gZmluZCBjb3JyZXNwb25kaW5nIHByb2JlcyBmcm9tICIKLQkJCSAiZGVidWdpbmZvLiBVc2Uga3Byb2JlIGV2ZW50IGluZm9ybWF0aW9uLlxuIik7Ci0JCXJldHVybiBjb252ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQodHAsIHBwKTsKLQl9Ci0JcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZ2V0X3RleHRfc3RhcnRfYWRkcmVzcyhjb25zdCBjaGFyICpleGVjLCB1bnNpZ25lZCBsb25nICphZGRyZXNzKQogewogCUVsZiAqZWxmOwpAQCAtMzIxLDEyICszMDEsNjIgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogQ29udmVydCB0cmFjZSBwb2ludCB0byBwcm9iZSBwb2ludCB3aXRoIGRlYnVnaW5mbworICovCitzdGF0aWMgaW50IGZpbmRfcGVyZl9wcm9iZV9wb2ludF9mcm9tX2R3YXJmKHN0cnVjdCBwcm9iZV90cmFjZV9wb2ludCAqdHAsCisJCQkJCSAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAsCisJCQkJCSAgICBib29sIGlzX2twcm9iZSkKK3sKKwlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzdGV4dCA9IDA7CisJdTY0IGFkZHIgPSB0cC0+YWRkcmVzczsKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKworCS8qIGNvbnZlcnQgdGhlIGFkZHJlc3MgdG8gZHdhcmYgYWRkcmVzcyAqLworCWlmICghaXNfa3Byb2JlKSB7CisJCWlmICghYWRkcikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmV0ID0gZ2V0X3RleHRfc3RhcnRfYWRkcmVzcyh0cC0+bW9kdWxlLCAmc3RleHQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWFkZHIgKz0gc3RleHQ7CisJfSBlbHNlIHsKKwkJYWRkciA9IGtlcm5lbF9nZXRfc3ltYm9sX2FkZHJlc3NfYnlfbmFtZSh0cC0+c3ltYm9sLCBmYWxzZSk7CisJCWlmIChhZGRyID09IDApCisJCQlnb3RvIGVycm9yOworCQlhZGRyICs9IHRwLT5vZmZzZXQ7CisJfQorCisJcHJfZGVidWcoInRyeSB0byBmaW5kIGluZm9ybWF0aW9uIGF0ICUiIFBSSXg2NCAiIGluICVzXG4iLCBhZGRyLAorCQkgdHAtPm1vZHVsZSA/IDogImtlcm5lbCIpOworCisJZGluZm8gPSBvcGVuX2RlYnVnaW5mbyh0cC0+bW9kdWxlKTsKKwlpZiAoZGluZm8pIHsKKwkJcmV0ID0gZGVidWdpbmZvX19maW5kX3Byb2JlX3BvaW50KGRpbmZvLAorCQkJCQkJICh1bnNpZ25lZCBsb25nKWFkZHIsIHBwKTsKKwkJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJGYWlsZWQgdG8gb3BlbiBkZWJ1Z2luZm8gYXQgMHglIiBQUkl4NjQgIlxuIiwgYWRkcik7CisJCXJldCA9IC1FTk9FTlQ7CisJfQorCisJaWYgKHJldCA+IDApIHsKKwkJcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOworCQlyZXR1cm4gMDsKKwl9CitlcnJvcjoKKwlwcl9kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgY29ycmVzcG9uZGluZyBwcm9iZXMgZnJvbSBkZWJ1Z2luZm8uXG4iKTsKKwlyZXR1cm4gcmV0ID8gOiAtRU5PRU5UOworfQorCiBzdGF0aWMgaW50IGFkZF9leGVjX3RvX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldnMsCiAJCQkJCSAgaW50IG50ZXZzLCBjb25zdCBjaGFyICpleGVjKQogewogCWludCBpLCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdGV4dCA9IDA7Ci0JY2hhciBidWZbMzJdOworCXVuc2lnbmVkIGxvbmcgc3RleHQgPSAwOwogCiAJaWYgKCFleGVjKQogCQlyZXR1cm4gMDsKQEAgLTMzNywxNSArMzY3LDkgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBudGV2cyAmJiByZXQgPj0gMDsgaSsrKSB7CiAJCS8qIHBvaW50LmFkZHJlc3MgaXMgdGhlIGFkZHJlcyBvZiBwb2ludC5zeW1ib2wgKyBwb2ludC5vZmZzZXQgKi8KLQkJb2Zmc2V0ID0gdGV2c1tpXS5wb2ludC5hZGRyZXNzIC0gc3RleHQ7Ci0JCXRldnNbaV0ucG9pbnQub2Zmc2V0ID0gMDsKLQkJemZyZWUoJnRldnNbaV0ucG9pbnQuc3ltYm9sKTsKLQkJcmV0ID0gZV9zbnByaW50ZihidWYsIDMyLCAiMHglbHgiLCBvZmZzZXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOworCQl0ZXZzW2ldLnBvaW50LmFkZHJlc3MgLT0gc3RleHQ7CiAJCXRldnNbaV0ucG9pbnQubW9kdWxlID0gc3RyZHVwKGV4ZWMpOwotCQl0ZXZzW2ldLnBvaW50LnN5bWJvbCA9IHN0cmR1cChidWYpOwotCQlpZiAoIXRldnNbaV0ucG9pbnQuc3ltYm9sIHx8ICF0ZXZzW2ldLnBvaW50Lm1vZHVsZSkgeworCQlpZiAoIXRldnNbaV0ucG9pbnQubW9kdWxlKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM4OCwxMiArNDEyLDQwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2cywgaW50IG50ZXZzKQorLyogUG9zdCBwcm9jZXNzaW5nIHRoZSBwcm9iZSBldmVudHMgKi8KK3N0YXRpYyBpbnQgcG9zdF9wcm9jZXNzX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldnMsCisJCQkJCSAgIGludCBudGV2cywgY29uc3QgY2hhciAqbW9kdWxlLAorCQkJCQkgICBib29sIHVwcm9iZSkKIHsKKwlzdHJ1Y3QgcmVmX3JlbG9jX3N5bSAqcmVsb2Nfc3ltOworCWNoYXIgKnRtcDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBudGV2czsgaSsrKQotCQljbGVhcl9wcm9iZV90cmFjZV9ldmVudCh0ZXZzICsgaSk7CisJaWYgKHVwcm9iZSkKKwkJcmV0dXJuIGFkZF9leGVjX3RvX3Byb2JlX3RyYWNlX2V2ZW50cyh0ZXZzLCBudGV2cywgbW9kdWxlKTsKKworCS8qIE5vdGUgdGhhdCBjdXJyZW50bHkgcmVmX3JlbG9jX3N5bSBiYXNlZCBwcm9iZSBpcyBub3QgZm9yIGRyaXZlcnMgKi8KKwlpZiAobW9kdWxlKQorCQlyZXR1cm4gYWRkX21vZHVsZV90b19wcm9iZV90cmFjZV9ldmVudHModGV2cywgbnRldnMsIG1vZHVsZSk7CisKKwlyZWxvY19zeW0gPSBrZXJuZWxfZ2V0X3JlZl9yZWxvY19zeW0oKTsKKwlpZiAoIXJlbG9jX3N5bSkgeworCQlwcl93YXJuaW5nKCJSZWxvY2F0ZWQgYmFzZSBzeW1ib2wgaXMgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudGV2czsgaSsrKSB7CisJCWlmICh0ZXZzW2ldLnBvaW50LmFkZHJlc3MpIHsKKwkJCXRtcCA9IHN0cmR1cChyZWxvY19zeW0tPm5hbWUpOworCQkJaWYgKCF0bXApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlmcmVlKHRldnNbaV0ucG9pbnQuc3ltYm9sKTsKKwkJCXRldnNbaV0ucG9pbnQuc3ltYm9sID0gdG1wOworCQkJdGV2c1tpXS5wb2ludC5vZmZzZXQgPSB0ZXZzW2ldLnBvaW50LmFkZHJlc3MgLQorCQkJCQkgICAgICAgcmVsb2Nfc3ltLT51bnJlbG9jYXRlZF9hZGRyOworCQl9CisJfQorCXJldHVybiAwOwogfQogCiAvKiBUcnkgdG8gZmluZCBwZXJmX3Byb2JlX2V2ZW50IHdpdGggZGVidWdpbmZvICovCkBAIC00MTYsMjEgKzQ2OCwxNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlwcl9kZWJ1ZygiVHJ5IHRvIGZpbmQgcHJvYmUgcG9pbnQgZnJvbSBkZWJ1Z2luZm8uXG4iKTsKIAkvKiBTZWFyY2hpbmcgdHJhY2UgZXZlbnRzIGNvcnJlc3BvbmRpbmcgdG8gYSBwcm9iZSBldmVudCAqLwogCW50ZXZzID0gZGVidWdpbmZvX19maW5kX3RyYWNlX2V2ZW50cyhkaW5mbywgcGV2LCB0ZXZzLCBtYXhfdGV2cyk7CiAKIAlkZWJ1Z2luZm9fX2RlbGV0ZShkaW5mbyk7CiAKIAlpZiAobnRldnMgPiAwKSB7CS8qIFN1Y2NlZWRlZCB0byBmaW5kIHRyYWNlIGV2ZW50cyAqLwotCQlwcl9kZWJ1ZygiZmluZCAlZCBwcm9iZV90cmFjZV9ldmVudHMuXG4iLCBudGV2cyk7Ci0JCWlmICh0YXJnZXQpIHsKLQkJCWlmIChwZXYtPnVwcm9iZXMpCi0JCQkJcmV0ID0gYWRkX2V4ZWNfdG9fcHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLAotCQkJCQkJIG50ZXZzLCB0YXJnZXQpOwotCQkJZWxzZQotCQkJCXJldCA9IGFkZF9tb2R1bGVfdG9fcHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLAotCQkJCQkJIG50ZXZzLCB0YXJnZXQpOwotCQl9CisJCXByX2RlYnVnKCJGb3VuZCAlZCBwcm9iZV90cmFjZV9ldmVudHMuXG4iLCBudGV2cyk7CisJCXJldCA9IHBvc3RfcHJvY2Vzc19wcm9iZV90cmFjZV9ldmVudHMoKnRldnMsIG50ZXZzLAorCQkJCQkJCXRhcmdldCwgcGV2LT51cHJvYmVzKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWNsZWFyX3Byb2JlX3RyYWNlX2V2ZW50cygqdGV2cywgbnRldnMpOwogCQkJemZyZWUodGV2cyk7CkBAIC01NjMsMjAgKzYxMCwxNiBAQAogICogU2hvdyBsaW5lLXJhbmdlIGFsd2F5cyByZXF1aXJlcyBkZWJ1Z2luZm8gdG8gZmluZCBzb3VyY2UgZmlsZSBhbmQKICAqIGxpbmUgbnVtYmVyLgogICovCi1pbnQgc2hvd19saW5lX3JhbmdlKHN0cnVjdCBsaW5lX3JhbmdlICpsciwgY29uc3QgY2hhciAqbW9kdWxlKQorc3RhdGljIGludCBfX3Nob3dfbGluZV9yYW5nZShzdHJ1Y3QgbGluZV9yYW5nZSAqbHIsIGNvbnN0IGNoYXIgKm1vZHVsZSkKIHsKIAlpbnQgbCA9IDE7Ci0Jc3RydWN0IGxpbmVfbm9kZSAqbG47CisJc3RydWN0IGludF9ub2RlICpsbjsKIAlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKIAlGSUxFICpmcDsKIAlpbnQgcmV0OwogCWNoYXIgKnRtcDsKIAogCS8qIFNlYXJjaCBhIGxpbmUgcmFuZ2UgKi8KLQlyZXQgPSBpbml0X3ZtbGludXgoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQogCWRpbmZvID0gb3Blbl9kZWJ1Z2luZm8obW9kdWxlKTsKIAlpZiAoIWRpbmZvKSB7CiAJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBvcGVuIGRlYnVnaW5mbyBmaWxlLlxuIik7CkBAIC02MjMsOCArNjY2LDggQEAKIAkJCWdvdG8gZW5kOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobG4sICZsci0+bGluZV9saXN0LCBsaXN0KSB7Ci0JCWZvciAoOyBsbi0+bGluZSA+IGw7IGwrKykgeworCWludGxpc3RfX2Zvcl9lYWNoKGxuLCBsci0+bGluZV9saXN0KSB7CisJCWZvciAoOyBsbi0+aSA+IGw7IGwrKykgewogCQkJcmV0ID0gc2hvd19vbmVfbGluZShmcCwgbCAtIGxyLT5vZmZzZXQpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBlbmQ7CkBAIC02NDYsNiArNjg5LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHNob3dfbGluZV9yYW5nZShzdHJ1Y3QgbGluZV9yYW5nZSAqbHIsIGNvbnN0IGNoYXIgKm1vZHVsZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW5pdF9zeW1ib2xfbWFwcyhmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gX19zaG93X2xpbmVfcmFuZ2UobHIsIG1vZHVsZSk7CisJZXhpdF9zeW1ib2xfbWFwcygpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBzaG93X2F2YWlsYWJsZV92YXJzX2F0KHN0cnVjdCBkZWJ1Z2luZm8gKmRpbmZvLAogCQkJCSAgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKIAkJCQkgIGludCBtYXhfdmxzLCBzdHJ1Y3Qgc3RyZmlsdGVyICpfZmlsdGVyLApAQCAtNzA3LDE0ICs3NjMsMTUgQEAKIAlpbnQgaSwgcmV0ID0gMDsKIAlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKIAotCXJldCA9IGluaXRfdm1saW51eCgpOworCXJldCA9IGluaXRfc3ltYm9sX21hcHMoZmFsc2UpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJZGluZm8gPSBvcGVuX2RlYnVnaW5mbyhtb2R1bGUpOwogCWlmICghZGluZm8pIHsKIAkJcHJfd2FybmluZygiRmFpbGVkIHRvIG9wZW4gZGVidWdpbmZvIGZpbGUuXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OwogCX0KIAogCXNldHVwX3BhZ2VyKCk7CkBAIC03MjQsMjMgKzc4MSwxOSBAQAogCQkJCQkgICAgIGV4dGVybnMpOwogCiAJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOworb3V0OgorCWV4aXRfc3ltYm9sX21hcHMoKTsKIAlyZXR1cm4gcmV0OwogfQogCiAjZWxzZQkvKiAhSEFWRV9EV0FSRl9TVVBQT1JUICovCiAKLXN0YXRpYyBpbnQga3Byb2JlX2NvbnZlcnRfdG9fcGVyZl9wcm9iZShzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAotCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHApCitzdGF0aWMgaW50CitmaW5kX3BlcmZfcHJvYmVfcG9pbnRfZnJvbV9kd2FyZihzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwIF9fbWF5YmVfdW51c2VkLAorCQkJCSBzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAgX19tYXliZV91bnVzZWQsCisJCQkJIGJvb2wgaXNfa3Byb2JlIF9fbWF5YmVfdW51c2VkKQogewotCXN0cnVjdCBzeW1ib2wgKnN5bTsKLQotCXN5bSA9IF9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZSh0cC0+c3ltYm9sLCBOVUxMKTsKLQlpZiAoIXN5bSkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIHN5bWJvbCAlcyBpbiBrZXJuZWwuXG4iLCB0cC0+c3ltYm9sKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JcmV0dXJuIGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludCh0cCwgcHApOworCXJldHVybiAtRU5PU1lTOwogfQogCiBzdGF0aWMgaW50IHRyeV90b19maW5kX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LApAQCAtNzc2LDI0ICs4MjksMjIgQEAKIAogdm9pZCBsaW5lX3JhbmdlX19jbGVhcihzdHJ1Y3QgbGluZV9yYW5nZSAqbHIpCiB7Ci0Jc3RydWN0IGxpbmVfbm9kZSAqbG47Ci0KIAlmcmVlKGxyLT5mdW5jdGlvbik7CiAJZnJlZShsci0+ZmlsZSk7CiAJZnJlZShsci0+cGF0aCk7CiAJZnJlZShsci0+Y29tcF9kaXIpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmbHItPmxpbmVfbGlzdCkpIHsKLQkJbG4gPSBsaXN0X2ZpcnN0X2VudHJ5KCZsci0+bGluZV9saXN0LCBzdHJ1Y3QgbGluZV9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmxuLT5saXN0KTsKLQkJZnJlZShsbik7Ci0JfQorCWludGxpc3RfX2RlbGV0ZShsci0+bGluZV9saXN0KTsKIAltZW1zZXQobHIsIDAsIHNpemVvZigqbHIpKTsKIH0KIAotdm9pZCBsaW5lX3JhbmdlX19pbml0KHN0cnVjdCBsaW5lX3JhbmdlICpscikKK2ludCBsaW5lX3JhbmdlX19pbml0KHN0cnVjdCBsaW5lX3JhbmdlICpscikKIHsKIAltZW1zZXQobHIsIDAsIHNpemVvZigqbHIpKTsKLQlJTklUX0xJU1RfSEVBRCgmbHItPmxpbmVfbGlzdCk7CisJbHItPmxpbmVfbGlzdCA9IGludGxpc3RfX25ldyhOVUxMKTsKKwlpZiAoIWxyLT5saW5lX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfbGluZV9udW0oY2hhciAqKnB0ciwgaW50ICp2YWwsIGNvbnN0IGNoYXIgKndoYXQpCkBAIC0xMjY3LDE2ICsxMzE4LDIxIEBACiAJfSBlbHNlCiAJCXAgPSBhcmd2WzFdOwogCWZtdDFfc3RyID0gc3RydG9rX3IocCwgIisiLCAmZm10KTsKLQl0cC0+c3ltYm9sID0gc3RyZHVwKGZtdDFfc3RyKTsKLQlpZiAodHAtPnN5bWJvbCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCWlmIChmbXQxX3N0clswXSA9PSAnMCcpCS8qIG9ubHkgdGhlIGFkZHJlc3Mgc3RhcnRlZCB3aXRoIDB4ICovCisJCXRwLT5hZGRyZXNzID0gc3RydG91bChmbXQxX3N0ciwgTlVMTCwgMCk7CisJZWxzZSB7CisJCS8qIE9ubHkgdGhlIHN5bWJvbC1iYXNlZCBwcm9iZSBoYXMgb2Zmc2V0ICovCisJCXRwLT5zeW1ib2wgPSBzdHJkdXAoZm10MV9zdHIpOworCQlpZiAodHAtPnN5bWJvbCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZm10Ml9zdHIgPSBzdHJ0b2tfcihOVUxMLCAiIiwgJmZtdCk7CisJCWlmIChmbXQyX3N0ciA9PSBOVUxMKQorCQkJdHAtPm9mZnNldCA9IDA7CisJCWVsc2UKKwkJCXRwLT5vZmZzZXQgPSBzdHJ0b3VsKGZtdDJfc3RyLCBOVUxMLCAxMCk7CiAJfQotCWZtdDJfc3RyID0gc3RydG9rX3IoTlVMTCwgIiIsICZmbXQpOwotCWlmIChmbXQyX3N0ciA9PSBOVUxMKQotCQl0cC0+b2Zmc2V0ID0gMDsKLQllbHNlCi0JCXRwLT5vZmZzZXQgPSBzdHJ0b3VsKGZtdDJfc3RyLCBOVUxMLCAxMCk7CiAKIAl0ZXYtPm5hcmdzID0gYXJnYyAtIDI7CiAJdGV2LT5hcmdzID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnKSAqIHRldi0+bmFyZ3MpOwpAQCAtMTUxOCwyMCArMTU3NCwyNyBAQAogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKKwlsZW4gPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVjOiVzLyVzICIsIHRwLT5yZXRwcm9iZSA/ICdyJyA6ICdwJywKKwkJCSB0ZXYtPmdyb3VwLCB0ZXYtPmV2ZW50KTsKKwlpZiAobGVuIDw9IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBVcHJvYmVzIG11c3QgaGF2ZSB0cC0+YWRkcmVzcyBhbmQgdHAtPm1vZHVsZSAqLworCWlmICh0ZXYtPnVwcm9iZXMgJiYgKCF0cC0+YWRkcmVzcyB8fCAhdHAtPm1vZHVsZSkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBVc2UgdGhlIHRwLT5hZGRyZXNzIGZvciB1cHJvYmVzICovCiAJaWYgKHRldi0+dXByb2JlcykKLQkJbGVuID0gZV9zbnByaW50ZihidWYsIE1BWF9DTURMRU4sICIlYzolcy8lcyAlczolcyIsCi0JCQkJIHRwLT5yZXRwcm9iZSA/ICdyJyA6ICdwJywKLQkJCQkgdGV2LT5ncm91cCwgdGV2LT5ldmVudCwKLQkJCQkgdHAtPm1vZHVsZSwgdHAtPnN5bWJvbCk7CisJCXJldCA9IGVfc25wcmludGYoYnVmICsgbGVuLCBNQVhfQ01ETEVOIC0gbGVuLCAiJXM6MHglbHgiLAorCQkJCSB0cC0+bW9kdWxlLCB0cC0+YWRkcmVzcyk7CiAJZWxzZQotCQlsZW4gPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVjOiVzLyVzICVzJXMlcyslbHUiLAotCQkJCSB0cC0+cmV0cHJvYmUgPyAncicgOiAncCcsCi0JCQkJIHRldi0+Z3JvdXAsIHRldi0+ZXZlbnQsCisJCXJldCA9IGVfc25wcmludGYoYnVmICsgbGVuLCBNQVhfQ01ETEVOIC0gbGVuLCAiJXMlcyVzKyVsdSIsCiAJCQkJIHRwLT5tb2R1bGUgPzogIiIsIHRwLT5tb2R1bGUgPyAiOiIgOiAiIiwKIAkJCQkgdHAtPnN5bWJvbCwgdHAtPm9mZnNldCk7CiAKLQlpZiAobGVuIDw9IDApCisJaWYgKHJldCA8PSAwKQogCQlnb3RvIGVycm9yOworCWxlbiArPSByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgdGV2LT5uYXJnczsgaSsrKSB7CiAJCXJldCA9IHN5bnRoZXNpemVfcHJvYmVfdHJhY2VfYXJnKCZ0ZXYtPmFyZ3NbaV0sIGJ1ZiArIGxlbiwKQEAgLTE1NDcsNiArMTYxMCw3OSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGZpbmRfcGVyZl9wcm9iZV9wb2ludF9mcm9tX21hcChzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAorCQkJCQkgIHN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCwKKwkJCQkJICBib29sIGlzX2twcm9iZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBOVUxMOworCXN0cnVjdCBtYXAgKm1hcDsKKwl1NjQgYWRkcjsKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKworCWlmICghaXNfa3Byb2JlKSB7CisJCW1hcCA9IGRzb19fbmV3X21hcCh0cC0+bW9kdWxlKTsKKwkJaWYgKCFtYXApCisJCQlnb3RvIG91dDsKKwkJYWRkciA9IHRwLT5hZGRyZXNzOworCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgYWRkciwgTlVMTCk7CisJfSBlbHNlIHsKKwkJYWRkciA9IGtlcm5lbF9nZXRfc3ltYm9sX2FkZHJlc3NfYnlfbmFtZSh0cC0+c3ltYm9sLCB0cnVlKTsKKwkJaWYgKGFkZHIpIHsKKwkJCWFkZHIgKz0gdHAtPm9mZnNldDsKKwkJCXN5bSA9IF9fZmluZF9rZXJuZWxfZnVuY3Rpb24oYWRkciwgJm1hcCk7CisJCX0KKwl9CisJaWYgKCFzeW0pCisJCWdvdG8gb3V0OworCisJcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOworCXBwLT5vZmZzZXQgPSBhZGRyIC0gbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+c3RhcnQpOworCXBwLT5mdW5jdGlvbiA9IHN0cmR1cChzeW0tPm5hbWUpOworCXJldCA9IHBwLT5mdW5jdGlvbiA/IDAgOiAtRU5PTUVNOworCitvdXQ6CisJaWYgKG1hcCAmJiAhaXNfa3Byb2JlKSB7CisJCWRzb19fZGVsZXRlKG1hcC0+ZHNvKTsKKwkJbWFwX19kZWxldGUobWFwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludChzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwLAorCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAsCisJCQkJCWJvb2wgaXNfa3Byb2JlKQoreworCWNoYXIgYnVmWzEyOF07CisJaW50IHJldDsKKworCXJldCA9IGZpbmRfcGVyZl9wcm9iZV9wb2ludF9mcm9tX2R3YXJmKHRwLCBwcCwgaXNfa3Byb2JlKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gZmluZF9wZXJmX3Byb2JlX3BvaW50X2Zyb21fbWFwKHRwLCBwcCwgaXNfa3Byb2JlKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKKwlwcl9kZWJ1ZygiRmFpbGVkIHRvIGZpbmQgcHJvYmUgcG9pbnQgZnJvbSBib3RoIG9mIGR3YXJmIGFuZCBtYXAuXG4iKTsKKworCWlmICh0cC0+c3ltYm9sKSB7CisJCXBwLT5mdW5jdGlvbiA9IHN0cmR1cCh0cC0+c3ltYm9sKTsKKwkJcHAtPm9mZnNldCA9IHRwLT5vZmZzZXQ7CisJfSBlbHNlIGlmICghdHAtPm1vZHVsZSAmJiAhaXNfa3Byb2JlKSB7CisJCXJldCA9IGVfc25wcmludGYoYnVmLCAxMjgsICIweCUiIFBSSXg2NCwgKHU2NCl0cC0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcHAtPmZ1bmN0aW9uID0gc3RyZHVwKGJ1Zik7CisJCXBwLT5vZmZzZXQgPSAwOworCX0KKwlpZiAocHAtPmZ1bmN0aW9uID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcHAtPnJldHByb2JlID0gdHAtPnJldHByb2JlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY29udmVydF90b19wZXJmX3Byb2JlX2V2ZW50KHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2LAogCQkJICAgICAgIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsIGJvb2wgaXNfa3Byb2JlKQogewpAQCAtMTU2MCwxMSArMTY5Niw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogQ29udmVydCB0cmFjZV9wb2ludCB0byBwcm9iZV9wb2ludCAqLwotCWlmIChpc19rcHJvYmUpCi0JCXJldCA9IGtwcm9iZV9jb252ZXJ0X3RvX3BlcmZfcHJvYmUoJnRldi0+cG9pbnQsICZwZXYtPnBvaW50KTsKLQllbHNlCi0JCXJldCA9IGNvbnZlcnRfdG9fcGVyZl9wcm9iZV9wb2ludCgmdGV2LT5wb2ludCwgJnBldi0+cG9pbnQpOwotCisJcmV0ID0gY29udmVydF90b19wZXJmX3Byb2JlX3BvaW50KCZ0ZXYtPnBvaW50LCAmcGV2LT5wb2ludCwgaXNfa3Byb2JlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTczMSw3ICsxODYzLDggQEAKIH0KIAogLyogU2hvdyBhbiBldmVudCAqLwotc3RhdGljIGludCBzaG93X3BlcmZfcHJvYmVfZXZlbnQoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikKK3N0YXRpYyBpbnQgc2hvd19wZXJmX3Byb2JlX2V2ZW50KHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCisJCQkJIGNvbnN0IGNoYXIgKm1vZHVsZSkKIHsKIAlpbnQgaSwgcmV0OwogCWNoYXIgYnVmWzEyOF07CkBAIC0xNzQ3LDYgKzE4ODAsOCBAQAogCQlyZXR1cm4gcmV0OwogCiAJcHJpbnRmKCIgICUtMjBzIChvbiAlcyIsIGJ1ZiwgcGxhY2UpOworCWlmIChtb2R1bGUpCisJCXByaW50ZigiIGluICVzIiwgbW9kdWxlKTsKIAogCWlmIChwZXYtPm5hcmdzID4gMCkgewogCQlwcmludGYoIiB3aXRoIik7CkBAIC0xNzg0LDcgKzE5MTksOCBAQAogCQkJcmV0ID0gY29udmVydF90b19wZXJmX3Byb2JlX2V2ZW50KCZ0ZXYsICZwZXYsCiAJCQkJCQkJCWlzX2twcm9iZSk7CiAJCQlpZiAocmV0ID49IDApCi0JCQkJcmV0ID0gc2hvd19wZXJmX3Byb2JlX2V2ZW50KCZwZXYpOworCQkJCXJldCA9IHNob3dfcGVyZl9wcm9iZV9ldmVudCgmcGV2LAorCQkJCQkJCSAgICB0ZXYucG9pbnQubW9kdWxlKTsKIAkJfQogCQljbGVhcl9wZXJmX3Byb2JlX2V2ZW50KCZwZXYpOwogCQljbGVhcl9wcm9iZV90cmFjZV9ldmVudCgmdGV2KTsKQEAgLTE4MDcsNyArMTk0Myw3IEBACiAJaWYgKGZkIDwgMCkKIAkJcmV0dXJuIGZkOwogCi0JcmV0ID0gaW5pdF92bWxpbnV4KCk7CisJcmV0ID0gaW5pdF9zeW1ib2xfbWFwcyhmYWxzZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE4MjAsNiArMTk1Niw3IEBACiAJCWNsb3NlKGZkKTsKIAl9CiAKKwlleGl0X3N5bWJvbF9tYXBzKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTk4Miw3ICsyMTE5LDcgQEAKIAkJZ3JvdXAgPSBwZXYtPmdyb3VwOwogCQlwZXYtPmV2ZW50ID0gdGV2LT5ldmVudDsKIAkJcGV2LT5ncm91cCA9IHRldi0+Z3JvdXA7Ci0JCXNob3dfcGVyZl9wcm9iZV9ldmVudChwZXYpOworCQlzaG93X3BlcmZfcHJvYmVfZXZlbnQocGV2LCB0ZXYtPnBvaW50Lm1vZHVsZSk7CiAJCS8qIFRyaWNrIGhlcmUgLSByZXN0b3JlIGN1cnJlbnQgZXZlbnQvZ3JvdXAgKi8KIAkJcGV2LT5ldmVudCA9IChjaGFyICopZXZlbnQ7CiAJCXBldi0+Z3JvdXAgPSAoY2hhciAqKWdyb3VwOwpAQCAtMjAwOCwxMyArMjE0NSwxNTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY2hhciAqbG9va2luZ19mdW5jdGlvbl9uYW1lOworc3RhdGljIGludCBudW1fbWF0Y2hlZF9mdW5jdGlvbnM7CisKK3N0YXRpYyBpbnQgcHJvYmVfZnVuY3Rpb25fZmlsdGVyKHN0cnVjdCBtYXAgKm1hcCBfX21heWJlX3VudXNlZCwKKwkJCQkgICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKChzeW0tPmJpbmRpbmcgPT0gU1RCX0dMT0JBTCB8fCBzeW0tPmJpbmRpbmcgPT0gU1RCX0xPQ0FMKSAmJgorCSAgICBzdHJjbXAobG9va2luZ19mdW5jdGlvbl9uYW1lLCBzeW0tPm5hbWUpID09IDApIHsKKwkJbnVtX21hdGNoZWRfZnVuY3Rpb25zKys7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBzdHJkdXBfb3JfZ290byhzdHIsIGxhYmVsKQlcCisJKHsgY2hhciAqX19wID0gc3RyZHVwKHN0cik7IGlmICghX19wKSBnb3RvIGxhYmVsOyBfX3A7IH0pCisKKy8qCisgKiBGaW5kIHByb2JlIGZ1bmN0aW9uIGFkZHJlc3NlcyBmcm9tIG1hcC4KKyAqIFJldHVybiBhbiBlcnJvciBvciB0aGUgbnVtYmVyIG9mIGZvdW5kIHByb2JlX3RyYWNlX2V2ZW50CisgKi8KK3N0YXRpYyBpbnQgZmluZF9wcm9iZV90cmFjZV9ldmVudHNfZnJvbV9tYXAoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKKwkJCQkJICAgIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsCisJCQkJCSAgICBpbnQgbWF4X3RldnMsIGNvbnN0IGNoYXIgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgbWFwICptYXAgPSBOVUxMOworCXN0cnVjdCBrbWFwICprbWFwID0gTlVMTDsKKwlzdHJ1Y3QgcmVmX3JlbG9jX3N5bSAqcmVsb2Nfc3ltID0gTlVMTDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHJiX25vZGUgKm5kOworCXN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2OworCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCA9ICZwZXYtPnBvaW50OworCXN0cnVjdCBwcm9iZV90cmFjZV9wb2ludCAqdHA7CisJaW50IHJldCwgaTsKKworCS8qIEluaXQgbWFwcyBvZiBnaXZlbiBleGVjdXRhYmxlIG9yIGtlcm5lbCAqLworCWlmIChwZXYtPnVwcm9iZXMpCisJCW1hcCA9IGRzb19fbmV3X21hcCh0YXJnZXQpOworCWVsc2UKKwkJbWFwID0ga2VybmVsX2dldF9tb2R1bGVfbWFwKHRhcmdldCk7CisJaWYgKCFtYXApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBMb2FkIG1hdGNoZWQgc3ltYm9sczogU2luY2UgdGhlIGRpZmZlcmVudCBsb2NhbCBzeW1ib2xzIG1heSBoYXZlCisJICogc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgYWRkcmVzc2VzLCB0aGlzIGxpc3RzIGFsbCB0aGUgc3ltYm9scy4KKwkgKi8KKwludW1fbWF0Y2hlZF9mdW5jdGlvbnMgPSAwOworCWxvb2tpbmdfZnVuY3Rpb25fbmFtZSA9IHBwLT5mdW5jdGlvbjsKKwlyZXQgPSBtYXBfX2xvYWQobWFwLCBwcm9iZV9mdW5jdGlvbl9maWx0ZXIpOworCWlmIChyZXQgfHwgbnVtX21hdGNoZWRfZnVuY3Rpb25zID09IDApIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCBzeW1ib2wgJXMgaW4gJXNcbiIsIHBwLT5mdW5jdGlvbiwKKwkJCXRhcmdldCA/IDogImtlcm5lbCIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKG51bV9tYXRjaGVkX2Z1bmN0aW9ucyA+IG1heF90ZXZzKSB7CisJCXByX2VycigiVG9vIG1hbnkgZnVuY3Rpb25zIG1hdGNoZWQgaW4gJXNcbiIsCisJCQl0YXJnZXQgPyA6ICJrZXJuZWwiKTsKKwkJcmV0ID0gLUUyQklHOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXBldi0+dXByb2JlcykgeworCQlrbWFwID0gbWFwX19rbWFwKG1hcCk7CisJCXJlbG9jX3N5bSA9IGttYXAtPnJlZl9yZWxvY19zeW07CisJCWlmICghcmVsb2Nfc3ltKSB7CisJCQlwcl93YXJuaW5nKCJSZWxvY2F0ZWQgYmFzZSBzeW1ib2wgaXMgbm90IGZvdW5kIVxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBTZXR1cCByZXN1bHQgdHJhY2UtcHJvYmUtZXZlbnRzICovCisJKnRldnMgPSB6YWxsb2Moc2l6ZW9mKCp0ZXYpICogbnVtX21hdGNoZWRfZnVuY3Rpb25zKTsKKwlpZiAoISp0ZXZzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IDA7CisJbWFwX19mb3JfZWFjaF9zeW1ib2wobWFwLCBzeW0sIG5kKSB7CisJCXRldiA9ICgqdGV2cykgKyByZXQ7CisJCXRwID0gJnRldi0+cG9pbnQ7CisJCWlmIChyZXQgPT0gbnVtX21hdGNoZWRfZnVuY3Rpb25zKSB7CisJCQlwcl93YXJuaW5nKCJUb28gbWFueSBzeW1ib2xzIGFyZSBsaXN0ZWQuIFNraXAgaXQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXJldCsrOworCisJCWlmIChwcC0+b2Zmc2V0ID4gc3ltLT5lbmQgLSBzeW0tPnN0YXJ0KSB7CisJCQlwcl93YXJuaW5nKCJPZmZzZXQgJWxkIGlzIGJpZ2dlciB0aGFuIHRoZSBzaXplIG9mICVzXG4iLAorCQkJCSAgIHBwLT5vZmZzZXQsIHN5bS0+bmFtZSk7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCS8qIEFkZCBvbmUgcHJvYmUgcG9pbnQgKi8KKwkJdHAtPmFkZHJlc3MgPSBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5zdGFydCkgKyBwcC0+b2Zmc2V0OworCQlpZiAocmVsb2Nfc3ltKSB7CisJCQl0cC0+c3ltYm9sID0gc3RyZHVwX29yX2dvdG8ocmVsb2Nfc3ltLT5uYW1lLCBub21lbV9vdXQpOworCQkJdHAtPm9mZnNldCA9IHRwLT5hZGRyZXNzIC0gcmVsb2Nfc3ltLT5hZGRyOworCQl9IGVsc2UgeworCQkJdHAtPnN5bWJvbCA9IHN0cmR1cF9vcl9nb3RvKHN5bS0+bmFtZSwgbm9tZW1fb3V0KTsKKwkJCXRwLT5vZmZzZXQgPSBwcC0+b2Zmc2V0OworCQl9CisJCXRwLT5yZXRwcm9iZSA9IHBwLT5yZXRwcm9iZTsKKwkJaWYgKHRhcmdldCkKKwkJCXRldi0+cG9pbnQubW9kdWxlID0gc3RyZHVwX29yX2dvdG8odGFyZ2V0LCBub21lbV9vdXQpOworCQl0ZXYtPnVwcm9iZXMgPSBwZXYtPnVwcm9iZXM7CisJCXRldi0+bmFyZ3MgPSBwZXYtPm5hcmdzOworCQlpZiAodGV2LT5uYXJncykgeworCQkJdGV2LT5hcmdzID0gemFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvYmVfdHJhY2VfYXJnKSAqCisJCQkJCSAgIHRldi0+bmFyZ3MpOworCQkJaWYgKHRldi0+YXJncyA9PSBOVUxMKQorCQkJCWdvdG8gbm9tZW1fb3V0OworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB0ZXYtPm5hcmdzOyBpKyspIHsKKwkJCWlmIChwZXYtPmFyZ3NbaV0ubmFtZSkKKwkJCQl0ZXYtPmFyZ3NbaV0ubmFtZSA9CisJCQkJCXN0cmR1cF9vcl9nb3RvKHBldi0+YXJnc1tpXS5uYW1lLAorCQkJCQkJCW5vbWVtX291dCk7CisKKwkJCXRldi0+YXJnc1tpXS52YWx1ZSA9IHN0cmR1cF9vcl9nb3RvKHBldi0+YXJnc1tpXS52YXIsCisJCQkJCQkJICAgIG5vbWVtX291dCk7CisJCQlpZiAocGV2LT5hcmdzW2ldLnR5cGUpCisJCQkJdGV2LT5hcmdzW2ldLnR5cGUgPQorCQkJCQlzdHJkdXBfb3JfZ290byhwZXYtPmFyZ3NbaV0udHlwZSwKKwkJCQkJCQlub21lbV9vdXQpOworCQl9CisJfQorCitvdXQ6CisJaWYgKG1hcCAmJiBwZXYtPnVwcm9iZXMpIHsKKwkJLyogT25seSB3aGVuIHVzaW5nIHVwcm9iZShleGVjKSBtYXAgbmVlZHMgdG8gYmUgcmVsZWFzZWQgKi8KKwkJZHNvX19kZWxldGUobWFwLT5kc28pOworCQltYXBfX2RlbGV0ZShtYXApOworCX0KKwlyZXR1cm4gcmV0OworCitub21lbV9vdXQ6CisJcmV0ID0gLUVOT01FTTsKK2Vycl9vdXQ6CisJY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLCBudW1fbWF0Y2hlZF9mdW5jdGlvbnMpOworCXpmcmVlKHRldnMpOworCWdvdG8gb3V0OworfQorCiBzdGF0aWMgaW50IGNvbnZlcnRfdG9fcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCiAJCQkJCSAgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywKIAkJCQkJICBpbnQgbWF4X3RldnMsIGNvbnN0IGNoYXIgKnRhcmdldCkKIHsKLQlzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JaW50IHJldCwgaTsKLQlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsKKwlpbnQgcmV0OwogCiAJaWYgKHBldi0+dXByb2JlcyAmJiAhcGV2LT5ncm91cCkgewogCQkvKiBSZXBsYWNlIGdyb3VwIG5hbWUgaWYgbm90IGdpdmVuICovCkBAIC0yMDMwLDkxICsyMzEzLDcgQEAKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CS8qIEZvdW5kIGluIGRlYnVnaW5mbyBvciBnb3QgYW4gZXJyb3IgKi8KIAotCWlmIChwZXYtPnVwcm9iZXMpIHsKLQkJcmV0ID0gY29udmVydF9uYW1lX3RvX2FkZHIocGV2LCB0YXJnZXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyogQWxsb2NhdGUgdHJhY2UgZXZlbnQgYnVmZmVyICovCi0JdGV2ID0gKnRldnMgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCkpOwotCWlmICh0ZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBDb3B5IHBhcmFtZXRlcnMgKi8KLQl0ZXYtPnBvaW50LnN5bWJvbCA9IHN0cmR1cChwZXYtPnBvaW50LmZ1bmN0aW9uKTsKLQlpZiAodGV2LT5wb2ludC5zeW1ib2wgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWlmICh0YXJnZXQpIHsKLQkJdGV2LT5wb2ludC5tb2R1bGUgPSBzdHJkdXAodGFyZ2V0KTsKLQkJaWYgKHRldi0+cG9pbnQubW9kdWxlID09IE5VTEwpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQotCi0JdGV2LT5wb2ludC5vZmZzZXQgPSBwZXYtPnBvaW50Lm9mZnNldDsKLQl0ZXYtPnBvaW50LnJldHByb2JlID0gcGV2LT5wb2ludC5yZXRwcm9iZTsKLQl0ZXYtPm5hcmdzID0gcGV2LT5uYXJnczsKLQl0ZXYtPnVwcm9iZXMgPSBwZXYtPnVwcm9iZXM7Ci0KLQlpZiAodGV2LT5uYXJncykgewotCQl0ZXYtPmFyZ3MgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9hcmcpCi0JCQkJICAgKiB0ZXYtPm5hcmdzKTsKLQkJaWYgKHRldi0+YXJncyA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgdGV2LT5uYXJnczsgaSsrKSB7Ci0JCQlpZiAocGV2LT5hcmdzW2ldLm5hbWUpIHsKLQkJCQl0ZXYtPmFyZ3NbaV0ubmFtZSA9IHN0cmR1cChwZXYtPmFyZ3NbaV0ubmFtZSk7Ci0JCQkJaWYgKHRldi0+YXJnc1tpXS5uYW1lID09IE5VTEwpIHsKLQkJCQkJcmV0ID0gLUVOT01FTTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXYtPmFyZ3NbaV0udmFsdWUgPSBzdHJkdXAocGV2LT5hcmdzW2ldLnZhcik7Ci0JCQlpZiAodGV2LT5hcmdzW2ldLnZhbHVlID09IE5VTEwpIHsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAocGV2LT5hcmdzW2ldLnR5cGUpIHsKLQkJCQl0ZXYtPmFyZ3NbaV0udHlwZSA9IHN0cmR1cChwZXYtPmFyZ3NbaV0udHlwZSk7Ci0JCQkJaWYgKHRldi0+YXJnc1tpXS50eXBlID09IE5VTEwpIHsKLQkJCQkJcmV0ID0gLUVOT01FTTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAocGV2LT51cHJvYmVzKQotCQlyZXR1cm4gMTsKLQotCS8qIEN1cnJlbnRseSBqdXN0IGNoZWNraW5nIGZ1bmN0aW9uIG5hbWUgZnJvbSBzeW1ib2wgbWFwICovCi0Jc3ltID0gX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKHRldi0+cG9pbnQuc3ltYm9sLCBOVUxMKTsKLQlpZiAoIXN5bSkgewotCQlwcl93YXJuaW5nKCJLZXJuZWwgc3ltYm9sIFwnJXNcJyBub3QgZm91bmQuXG4iLAotCQkJICAgdGV2LT5wb2ludC5zeW1ib2wpOwotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycm9yOwotCX0gZWxzZSBpZiAodGV2LT5wb2ludC5vZmZzZXQgPiBzeW0tPmVuZCAtIHN5bS0+c3RhcnQpIHsKLQkJcHJfd2FybmluZygiT2Zmc2V0IHNwZWNpZmllZCBpcyBncmVhdGVyIHRoYW4gc2l6ZSBvZiAlc1xuIiwKLQkJCSAgIHRldi0+cG9pbnQuc3ltYm9sKTsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBlcnJvcjsKLQotCX0KLQotCXJldHVybiAxOwotZXJyb3I6Ci0JY2xlYXJfcHJvYmVfdHJhY2VfZXZlbnQodGV2KTsKLQlmcmVlKHRldik7Ci0JKnRldnMgPSBOVUxMOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGZpbmRfcHJvYmVfdHJhY2VfZXZlbnRzX2Zyb21fbWFwKHBldiwgdGV2cywgbWF4X3RldnMsIHRhcmdldCk7CiB9CiAKIHN0cnVjdCBfX2V2ZW50X3BhY2thZ2UgewpAQCAtMjEzNSwxMiArMjMzNCw3IEBACiAJaWYgKHBrZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoIXBldnMtPnVwcm9iZXMpCi0JCS8qIEluaXQgdm1saW51eCBwYXRoICovCi0JCXJldCA9IGluaXRfdm1saW51eCgpOwotCWVsc2UKLQkJcmV0ID0gaW5pdF91c2VyX2V4ZWMoKTsKLQorCXJldCA9IGluaXRfc3ltYm9sX21hcHMocGV2cy0+dXByb2Jlcyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZnJlZShwa2dzKTsKIAkJcmV0dXJuIHJldDsKQEAgLTIxNzQsNiArMjM2OCw3IEBACiAJCXpmcmVlKCZwa2dzW2ldLnRldnMpOwogCX0KIAlmcmVlKHBrZ3MpOworCWV4aXRfc3ltYm9sX21hcHMoKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMzIzLDE1OSArMjUxOCw1MSBAQAogc3RhdGljIGludCBmaWx0ZXJfYXZhaWxhYmxlX2Z1bmN0aW9ucyhzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQsCiAJCQkJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltKQogewotCWlmIChzeW0tPmJpbmRpbmcgPT0gU1RCX0dMT0JBTCAmJgorCWlmICgoc3ltLT5iaW5kaW5nID09IFNUQl9HTE9CQUwgfHwgc3ltLT5iaW5kaW5nID09IFNUQl9MT0NBTCkgJiYKIAkgICAgc3RyZmlsdGVyX19jb21wYXJlKGF2YWlsYWJsZV9mdW5jX2ZpbHRlciwgc3ltLT5uYW1lKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgX19zaG93X2F2YWlsYWJsZV9mdW5jcyhzdHJ1Y3QgbWFwICptYXApCitpbnQgc2hvd19hdmFpbGFibGVfZnVuY3MoY29uc3QgY2hhciAqdGFyZ2V0LCBzdHJ1Y3Qgc3RyZmlsdGVyICpfZmlsdGVyLAorCQkJCQlib29sIHVzZXIpCiB7Ci0JaWYgKG1hcF9fbG9hZChtYXAsIGZpbHRlcl9hdmFpbGFibGVfZnVuY3Rpb25zKSkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBsb2FkIG1hcC5cbiIpOworCXN0cnVjdCBtYXAgKm1hcDsKKwlpbnQgcmV0OworCisJcmV0ID0gaW5pdF9zeW1ib2xfbWFwcyh1c2VyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEdldCBhIHN5bWJvbCBtYXAgKi8KKwlpZiAodXNlcikKKwkJbWFwID0gZHNvX19uZXdfbWFwKHRhcmdldCk7CisJZWxzZQorCQltYXAgPSBrZXJuZWxfZ2V0X21vZHVsZV9tYXAodGFyZ2V0KTsKKwlpZiAoIW1hcCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgYSBtYXAgZm9yICVzXG4iLCAodGFyZ2V0KSA/IDogImtlcm5lbCIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwkvKiBMb2FkIHN5bWJvbHMgd2l0aCBnaXZlbiBmaWx0ZXIgKi8KKwlhdmFpbGFibGVfZnVuY19maWx0ZXIgPSBfZmlsdGVyOworCWlmIChtYXBfX2xvYWQobWFwLCBmaWx0ZXJfYXZhaWxhYmxlX2Z1bmN0aW9ucykpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gbG9hZCBzeW1ib2xzIGluICVzXG4iLCAodGFyZ2V0KSA/IDogImtlcm5lbCIpOworCQlnb3RvIGVuZDsKKwl9CiAJaWYgKCFkc29fX3NvcnRlZF9ieV9uYW1lKG1hcC0+ZHNvLCBtYXAtPnR5cGUpKQogCQlkc29fX3NvcnRfYnlfbmFtZShtYXAtPmRzbywgbWFwLT50eXBlKTsKIAotCWRzb19fZnByaW50Zl9zeW1ib2xzX2J5X25hbWUobWFwLT5kc28sIG1hcC0+dHlwZSwgc3Rkb3V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdmFpbGFibGVfa2VybmVsX2Z1bmNzKGNvbnN0IGNoYXIgKm1vZHVsZSkKLXsKLQlzdHJ1Y3QgbWFwICptYXA7Ci0JaW50IHJldDsKLQotCXJldCA9IGluaXRfdm1saW51eCgpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JbWFwID0ga2VybmVsX2dldF9tb2R1bGVfbWFwKG1vZHVsZSk7Ci0JaWYgKCFtYXApIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCAlcyBtYXAuXG4iLCAobW9kdWxlKSA/IDogImtlcm5lbCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIF9fc2hvd19hdmFpbGFibGVfZnVuY3MobWFwKTsKLX0KLQotc3RhdGljIGludCBhdmFpbGFibGVfdXNlcl9mdW5jcyhjb25zdCBjaGFyICp0YXJnZXQpCi17Ci0Jc3RydWN0IG1hcCAqbWFwOwotCWludCByZXQ7Ci0KLQlyZXQgPSBpbml0X3VzZXJfZXhlYygpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JbWFwID0gZHNvX19uZXdfbWFwKHRhcmdldCk7Ci0JcmV0ID0gX19zaG93X2F2YWlsYWJsZV9mdW5jcyhtYXApOwotCWRzb19fZGVsZXRlKG1hcC0+ZHNvKTsKLQltYXBfX2RlbGV0ZShtYXApOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBzaG93X2F2YWlsYWJsZV9mdW5jcyhjb25zdCBjaGFyICp0YXJnZXQsIHN0cnVjdCBzdHJmaWx0ZXIgKl9maWx0ZXIsCi0JCQkJCWJvb2wgdXNlcikKLXsKKwkvKiBTaG93IGFsbCAoZmlsdGVyZWQpIHN5bWJvbHMgKi8KIAlzZXR1cF9wYWdlcigpOwotCWF2YWlsYWJsZV9mdW5jX2ZpbHRlciA9IF9maWx0ZXI7Ci0KLQlpZiAoIXVzZXIpCi0JCXJldHVybiBhdmFpbGFibGVfa2VybmVsX2Z1bmNzKHRhcmdldCk7Ci0KLQlyZXR1cm4gYXZhaWxhYmxlX3VzZXJfZnVuY3ModGFyZ2V0KTsKLX0KLQotLyoKLSAqIHVwcm9iZV9ldmVudHMgb25seSBhY2NlcHRzIGFkZHJlc3M6Ci0gKiBDb252ZXJ0IGZ1bmN0aW9uIGFuZCBhbnkgb2Zmc2V0IHRvIGFkZHJlc3MKLSAqLwotc3RhdGljIGludCBjb252ZXJ0X25hbWVfdG9fYWRkcihzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LCBjb25zdCBjaGFyICpleGVjKQotewotCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCA9ICZwZXYtPnBvaW50OwotCXN0cnVjdCBzeW1ib2wgKnN5bTsKLQlzdHJ1Y3QgbWFwICptYXAgPSBOVUxMOwotCWNoYXIgKmZ1bmN0aW9uID0gTlVMTDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdmFkZHIgPSAwOwotCi0JaWYgKCFwcC0+ZnVuY3Rpb24pIHsKLQkJcHJfd2FybmluZygiTm8gZnVuY3Rpb24gc3BlY2lmaWVkIGZvciB1cHJvYmVzIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZ1bmN0aW9uID0gc3RyZHVwKHBwLT5mdW5jdGlvbik7Ci0JaWYgKCFmdW5jdGlvbikgewotCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGJ5IHN0cmR1cC5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltYXAgPSBkc29fX25ld19tYXAoZXhlYyk7Ci0JaWYgKCFtYXApIHsKLQkJcHJfd2FybmluZygiQ2Fubm90IGZpbmQgYXBwcm9wcmlhdGUgRFNPIGZvciAlcy5cbiIsIGV4ZWMpOwotCQlnb3RvIG91dDsKLQl9Ci0JYXZhaWxhYmxlX2Z1bmNfZmlsdGVyID0gc3RyZmlsdGVyX19uZXcoZnVuY3Rpb24sIE5VTEwpOwotCWlmIChtYXBfX2xvYWQobWFwLCBmaWx0ZXJfYXZhaWxhYmxlX2Z1bmN0aW9ucykpIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gbG9hZCBtYXAuXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKG1hcCwgZnVuY3Rpb24sIE5VTEwpOwotCWlmICghc3ltKSB7Ci0JCXByX3dhcm5pbmcoIkNhbm5vdCBmaW5kICVzIGluIERTTyAlc1xuIiwgZnVuY3Rpb24sIGV4ZWMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAobWFwLT5zdGFydCA+IHN5bS0+c3RhcnQpCi0JCXZhZGRyID0gbWFwLT5zdGFydDsKLQl2YWRkciArPSBzeW0tPnN0YXJ0ICsgcHAtPm9mZnNldCArIG1hcC0+cGdvZmY7Ci0JcHAtPm9mZnNldCA9IDA7Ci0KLQlpZiAoIXBldi0+ZXZlbnQpIHsKLQkJcGV2LT5ldmVudCA9IGZ1bmN0aW9uOwotCQlmdW5jdGlvbiA9IE5VTEw7Ci0JfQotCWlmICghcGV2LT5ncm91cCkgewotCQljaGFyICpwdHIxLCAqcHRyMiwgKmV4ZWNfY29weTsKLQotCQlwZXYtPmdyb3VwID0gemFsbG9jKHNpemVvZihjaGFyICopICogNjQpOwotCQlleGVjX2NvcHkgPSBzdHJkdXAoZXhlYyk7Ci0JCWlmICghZXhlY19jb3B5KSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJcHJfd2FybmluZygiRmFpbGVkIHRvIGNvcHkgZXhlYyBzdHJpbmcuXG4iKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcHRyMSA9IHN0cmR1cChiYXNlbmFtZShleGVjX2NvcHkpKTsKLQkJaWYgKHB0cjEpIHsKLQkJCXB0cjIgPSBzdHJwYnJrKHB0cjEsICItLl8iKTsKLQkJCWlmIChwdHIyKQotCQkJCSpwdHIyID0gJ1wwJzsKLQkJCWVfc25wcmludGYocGV2LT5ncm91cCwgNjQsICIlc18lcyIsIFBFUkZQUk9CRV9HUk9VUCwKLQkJCQkJcHRyMSk7Ci0JCQlmcmVlKHB0cjEpOwotCQl9Ci0JCWZyZWUoZXhlY19jb3B5KTsKLQl9Ci0JZnJlZShwcC0+ZnVuY3Rpb24pOwotCXBwLT5mdW5jdGlvbiA9IHphbGxvYyhzaXplb2YoY2hhciAqKSAqIE1BWF9QUk9CRV9BUkdTKTsKLQlpZiAoIXBwLT5mdW5jdGlvbikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGJ5IHphbGxvYy5cbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JZV9zbnByaW50ZihwcC0+ZnVuY3Rpb24sIE1BWF9QUk9CRV9BUkdTLCAiMHglbGx4IiwgdmFkZHIpOwotCXJldCA9IDA7Ci0KLW91dDoKLQlpZiAobWFwKSB7CisJZHNvX19mcHJpbnRmX3N5bWJvbHNfYnlfbmFtZShtYXAtPmRzbywgbWFwLT50eXBlLCBzdGRvdXQpOworZW5kOgorCWlmICh1c2VyKSB7CiAJCWRzb19fZGVsZXRlKG1hcC0+ZHNvKTsKIAkJbWFwX19kZWxldGUobWFwKTsKIAl9Ci0JaWYgKGZ1bmN0aW9uKQotCQlmcmVlKGZ1bmN0aW9uKTsKKwlleGl0X3N5bWJvbF9tYXBzKCk7CisKIAlyZXR1cm4gcmV0OwogfQorCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCmluZGV4IGZjYWY3MjcuLjc3NmM5MzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfUFJPQkVfRVZFTlRfSAogCiAjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgImludGxpc3QuaCIKICNpbmNsdWRlICJzdHJsaXN0LmgiCiAjaW5jbHVkZSAic3RyZmlsdGVyLmgiCiAKQEAgLTc2LDEzICs3Nyw2IEBACiAJc3RydWN0IHBlcmZfcHJvYmVfYXJnCSphcmdzOwkvKiBBcmd1bWVudHMgKi8KIH07CiAKLQotLyogTGluZSBudW1iZXIgY29udGFpbmVyICovCi1zdHJ1Y3QgbGluZV9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JaW50CQkJbGluZTsKLX07Ci0KIC8qIExpbmUgcmFuZ2UgKi8KIHN0cnVjdCBsaW5lX3JhbmdlIHsKIAljaGFyCQkJKmZpbGU7CQkvKiBGaWxlIG5hbWUgKi8KQEAgLTkyLDcgKzg2LDcgQEAKIAlpbnQJCQlvZmZzZXQ7CQkvKiBTdGFydCBsaW5lIG9mZnNldCAqLwogCWNoYXIJCQkqcGF0aDsJCS8qIFJlYWwgcGF0aCBuYW1lICovCiAJY2hhcgkJCSpjb21wX2RpcjsJLyogQ29tcGlsZSBkaXJlY3RvcnkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbmVfbGlzdDsJLyogVmlzaWJsZSBsaW5lcyAqLworCXN0cnVjdCBpbnRsaXN0CQkqbGluZV9saXN0OwkvKiBWaXNpYmxlIGxpbmVzICovCiB9OwogCiAvKiBMaXN0IG9mIHZhcmlhYmxlcyAqLwpAQCAtMTI0LDcgKzExOCw3IEBACiBleHRlcm4gdm9pZCBsaW5lX3JhbmdlX19jbGVhcihzdHJ1Y3QgbGluZV9yYW5nZSAqbHIpOwogCiAvKiBJbml0aWFsaXplIGxpbmUgcmFuZ2UgKi8KLWV4dGVybiB2b2lkIGxpbmVfcmFuZ2VfX2luaXQoc3RydWN0IGxpbmVfcmFuZ2UgKmxyKTsKK2V4dGVybiBpbnQgbGluZV9yYW5nZV9faW5pdChzdHJ1Y3QgbGluZV9yYW5nZSAqbHIpOwogCiAvKiBJbnRlcm5hbCB1c2U6IFJldHVybiBrZXJuZWwvbW9kdWxlIHBhdGggKi8KIGV4dGVybiBjb25zdCBjaGFyICprZXJuZWxfZ2V0X21vZHVsZV9wYXRoKGNvbnN0IGNoYXIgKm1vZHVsZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKaW5kZXggMDYxZWRiMS4uZGYwMjM4NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwpAQCAtMzQsNyArMzQsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSAiZXZlbnQuaCIKKyNpbmNsdWRlICJkc28uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImludGxpc3QuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAic3ltYm9sLmgiCiAjaW5jbHVkZSAicHJvYmUtZmluZGVyLmgiCkBAIC00Miw2NSArNDQsNiBAQAogLyogS3Byb2JlIHRyYWNlciBiYXNpYyB0eXBlIGlzIHVwIHRvIHU2NCAqLwogI2RlZmluZSBNQVhfQkFTSUNfVFlQRV9CSVRTCTY0CiAKLS8qIExpbmUgbnVtYmVyIGxpc3Qgb3BlcmF0aW9ucyAqLwotCi0vKiBBZGQgYSBsaW5lIHRvIGxpbmUgbnVtYmVyIGxpc3QgKi8KLXN0YXRpYyBpbnQgbGluZV9saXN0X19hZGRfbGluZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBpbnQgbGluZSkKLXsKLQlzdHJ1Y3QgbGluZV9ub2RlICpsbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCi0JLyogUmV2ZXJzZSBzZWFyY2gsIGJlY2F1c2UgbmV3IGxpbmUgd2lsbCBiZSB0aGUgbGFzdCBvbmUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UobG4sIGhlYWQsIGxpc3QpIHsKLQkJaWYgKGxuLT5saW5lIDwgbGluZSkgewotCQkJcCA9ICZsbi0+bGlzdDsKLQkJCWdvdG8gZm91bmQ7Ci0JCX0gZWxzZSBpZiAobG4tPmxpbmUgPT0gbGluZSkJLyogQWxyZWFkeSBleGlzdCAqLwotCQkJcmV0dXJuIDE7Ci0JfQotCS8qIExpc3QgaXMgZW1wdHksIG9yIHRoZSBzbWFsbGVzdCBlbnRyeSAqLwotCXAgPSBoZWFkOwotZm91bmQ6Ci0JcHJfZGVidWcoImxpbmUgbGlzdDogYWRkIGEgbGluZSAldVxuIiwgbGluZSk7Ci0JbG4gPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW5lX25vZGUpKTsKLQlpZiAobG4gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbG4tPmxpbmUgPSBsaW5lOwotCUlOSVRfTElTVF9IRUFEKCZsbi0+bGlzdCk7Ci0JbGlzdF9hZGQoJmxuLT5saXN0LCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogQ2hlY2sgaWYgdGhlIGxpbmUgaW4gbGluZSBudW1iZXIgbGlzdCAqLwotc3RhdGljIGludCBsaW5lX2xpc3RfX2hhc19saW5lKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGludCBsaW5lKQotewotCXN0cnVjdCBsaW5lX25vZGUgKmxuOwotCi0JLyogUmV2ZXJzZSBzZWFyY2gsIGJlY2F1c2UgbmV3IGxpbmUgd2lsbCBiZSB0aGUgbGFzdCBvbmUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxuLCBoZWFkLCBsaXN0KQotCQlpZiAobG4tPmxpbmUgPT0gbGluZSkKLQkJCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEluaXQgbGluZSBudW1iZXIgbGlzdCAqLwotc3RhdGljIHZvaWQgbGluZV9saXN0X19pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0JSU5JVF9MSVNUX0hFQUQoaGVhZCk7Ci19Ci0KLS8qIEZyZWUgbGluZSBudW1iZXIgbGlzdCAqLwotc3RhdGljIHZvaWQgbGluZV9saXN0X19mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGxpbmVfbm9kZSAqbG47Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7Ci0JCWxuID0gbGlzdF9maXJzdF9lbnRyeShoZWFkLCBzdHJ1Y3QgbGluZV9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmxuLT5saXN0KTsKLQkJZnJlZShsbik7Ci0JfQotfQotCiAvKiBEd2FyZiBGTCB3cmFwcGVycyAqLwogc3RhdGljIGNoYXIgKmRlYnVnaW5mb19wYXRoOwkvKiBDdXJyZW50bHkgZHVtbXkgKi8KIApAQCAtMTQ3LDgwICs5MCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLSNpZiBfRUxGVVRJTFNfUFJFUkVRKDAsIDE0OCkKLS8qIFRoaXMgbWV0aG9kIGlzIGJ1Z2d5IGlmIGVsZnV0aWxzIGlzIG9sZGVyIHRoYW4gMC4xNDggKi8KLXN0YXRpYyBpbnQgX19saW51eF9rZXJuZWxfZmluZF9lbGYoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkgICB2b2lkICoqdXNlcmRhdGEsCi0JCQkJICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCQkJICAgRHdhcmZfQWRkciBiYXNlLAotCQkJCSAgIGNoYXIgKipmaWxlX25hbWUsIEVsZiAqKmVsZnApCi17Ci0JaW50IGZkOwotCWNvbnN0IGNoYXIgKnBhdGggPSBrZXJuZWxfZ2V0X21vZHVsZV9wYXRoKG1vZHVsZV9uYW1lKTsKLQotCXByX2RlYnVnMigiVXNlIGZpbGUgJXMgZm9yICVzXG4iLCBwYXRoLCBtb2R1bGVfbmFtZSk7Ci0JaWYgKHBhdGgpIHsKLQkJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCSpmaWxlX25hbWUgPSBzdHJkdXAocGF0aCk7Ci0JCQlyZXR1cm4gZmQ7Ci0JCX0KLQl9Ci0JLyogSWYgZmFpbGVkLCB0cnkgdG8gY2FsbCBzdGFuZGFyZCBtZXRob2QgKi8KLQlyZXR1cm4gZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGYobW9kLCB1c2VyZGF0YSwgbW9kdWxlX25hbWUsIGJhc2UsCi0JCQkJCSAgZmlsZV9uYW1lLCBlbGZwKTsKLX0KLQotc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIGtlcm5lbF9jYWxsYmFja3MgPSB7Ci0JLmZpbmRfZGVidWdpbmZvID0gZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbywKLQkuZGVidWdpbmZvX3BhdGggPSAmZGVidWdpbmZvX3BhdGgsCi0KLQkuZmluZF9lbGYgPSBfX2xpbnV4X2tlcm5lbF9maW5kX2VsZiwKLQkuc2VjdGlvbl9hZGRyZXNzID0gZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcywKLX07Ci0KLS8qIEdldCBhIER3YXJmIGZyb20gbGl2ZSBrZXJuZWwgaW1hZ2UgKi8KLXN0YXRpYyBpbnQgZGVidWdpbmZvX19pbml0X29ubGluZV9rZXJuZWxfZHdhcmYoc3RydWN0IGRlYnVnaW5mbyAqZGJnLAotCQkJCQkgICAgICAgRHdhcmZfQWRkciBhZGRyKQotewotCWRiZy0+ZHdmbCA9IGR3ZmxfYmVnaW4oJmtlcm5lbF9jYWxsYmFja3MpOwotCWlmICghZGJnLT5kd2ZsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIExvYWQgdGhlIGtlcm5lbCBkd2FydmVzOiBEb24ndCBjYXJlIHRoZSByZXN1bHQgaGVyZSAqLwotCWR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwoZGJnLT5kd2ZsKTsKLQlkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcyhkYmctPmR3ZmwpOwotCi0JZGJnLT5kYmcgPSBkd2ZsX2FkZHJkd2FyZihkYmctPmR3ZmwsIGFkZHIsICZkYmctPmJpYXMpOwotCS8qIEhlcmUsIGNoZWNrIHdoZXRoZXIgd2UgY291bGQgZ2V0IGEgcmVhbCBkd2FyZiAqLwotCWlmICghZGJnLT5kYmcpIHsKLQkJcHJfZGVidWcoIkZhaWxlZCB0byBmaW5kIGtlcm5lbCBkd2FyZiBhdCAlbHhcbiIsCi0JCQkgKHVuc2lnbmVkIGxvbmcpYWRkcik7Ci0JCWR3ZmxfZW5kKGRiZy0+ZHdmbCk7Ci0JCW1lbXNldChkYmcsIDAsIHNpemVvZigqZGJnKSk7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXJldHVybiAwOwotfQotI2Vsc2UKLS8qIFdpdGggb2xkZXIgZWxmdXRpbHMsIHRoaXMganVzdCBzdXBwb3J0IGtlcm5lbCBtb2R1bGUuLi4gKi8KLXN0YXRpYyBpbnQgZGVidWdpbmZvX19pbml0X29ubGluZV9rZXJuZWxfZHdhcmYoc3RydWN0IGRlYnVnaW5mbyAqZGJnLAotCQkJCQkgICAgICAgRHdhcmZfQWRkciBhZGRyIF9fbWF5YmVfdW51c2VkKQotewotCWNvbnN0IGNoYXIgKnBhdGggPSBrZXJuZWxfZ2V0X21vZHVsZV9wYXRoKCJrZXJuZWwiKTsKLQotCWlmICghcGF0aCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIHZtbGludXggcGF0aFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXByX2RlYnVnMigiVXNlIGZpbGUgJXMgZm9yIGRlYnVnaW5mb1xuIiwgcGF0aCk7Ci0JcmV0dXJuIGRlYnVnaW5mb19faW5pdF9vZmZsaW5lX2R3YXJmKGRiZywgcGF0aCk7Ci19Ci0jZW5kaWYKLQotc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXcoY29uc3QgY2hhciAqcGF0aCkKK3N0YXRpYyBzdHJ1Y3QgZGVidWdpbmZvICpfX2RlYnVnaW5mb19fbmV3KGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAJc3RydWN0IGRlYnVnaW5mbyAqZGJnID0gemFsbG9jKHNpemVvZigqZGJnKSk7CiAJaWYgKCFkYmcpCkBAIC0yMjgsMjEgKzk4LDQ0IEBACiAKIAlpZiAoZGVidWdpbmZvX19pbml0X29mZmxpbmVfZHdhcmYoZGJnLCBwYXRoKSA8IDApCiAJCXpmcmVlKCZkYmcpOwotCisJaWYgKGRiZykKKwkJcHJfZGVidWcoIk9wZW4gRGVidWdpbmZvIGZpbGU6ICVzXG4iLCBwYXRoKTsKIAlyZXR1cm4gZGJnOwogfQogCi1zdHJ1Y3QgZGVidWdpbmZvICpkZWJ1Z2luZm9fX25ld19vbmxpbmVfa2VybmVsKHVuc2lnbmVkIGxvbmcgYWRkcikKK2VudW0gZHNvX2JpbmFyeV90eXBlIGRpc3Ryb19kd2FyZl90eXBlc1tdID0geworCURTT19CSU5BUllfVFlQRV9fRkVET1JBX0RFQlVHSU5GTywKKwlEU09fQklOQVJZX1RZUEVfX1VCVU5UVV9ERUJVR0lORk8sCisJRFNPX0JJTkFSWV9UWVBFX19PUEVORU1CRURERURfREVCVUdJTkZPLAorCURTT19CSU5BUllfVFlQRV9fQlVJTERJRF9ERUJVR0lORk8sCisJRFNPX0JJTkFSWV9UWVBFX19OT1RfRk9VTkQsCit9OworCitzdHJ1Y3QgZGVidWdpbmZvICpkZWJ1Z2luZm9fX25ldyhjb25zdCBjaGFyICpwYXRoKQogewotCXN0cnVjdCBkZWJ1Z2luZm8gKmRiZyA9IHphbGxvYyhzaXplb2YoKmRiZykpOworCWVudW0gZHNvX2JpbmFyeV90eXBlICp0eXBlOworCWNoYXIgYnVmW1BBVEhfTUFYXSwgbmlsID0gJ1wwJzsKKwlzdHJ1Y3QgZHNvICpkc287CisJc3RydWN0IGRlYnVnaW5mbyAqZGluZm8gPSBOVUxMOwogCi0JaWYgKCFkYmcpCi0JCXJldHVybiBOVUxMOworCS8qIFRyeSB0byBvcGVuIGRpc3RybyBkZWJ1Z2luZm8gZmlsZXMgKi8KKwlkc28gPSBkc29fX25ldyhwYXRoKTsKKwlpZiAoIWRzbykKKwkJZ290byBvdXQ7CiAKLQlpZiAoZGVidWdpbmZvX19pbml0X29ubGluZV9rZXJuZWxfZHdhcmYoZGJnLCAoRHdhcmZfQWRkcilhZGRyKSA8IDApCi0JCXpmcmVlKCZkYmcpOworCWZvciAodHlwZSA9IGRpc3Ryb19kd2FyZl90eXBlczsKKwkgICAgICFkaW5mbyAmJiAqdHlwZSAhPSBEU09fQklOQVJZX1RZUEVfX05PVF9GT1VORDsKKwkgICAgIHR5cGUrKykgeworCQlpZiAoZHNvX19yZWFkX2JpbmFyeV90eXBlX2ZpbGVuYW1lKGRzbywgKnR5cGUsICZuaWwsCisJCQkJCQkgICBidWYsIFBBVEhfTUFYKSA8IDApCisJCQljb250aW51ZTsKKwkJZGluZm8gPSBfX2RlYnVnaW5mb19fbmV3KGJ1Zik7CisJfQorCWRzb19fZGVsZXRlKGRzbyk7CiAKLQlyZXR1cm4gZGJnOworb3V0OgorCS8qIGlmIGZhaWxlZCB0byBvcGVuIGFsbCBkaXN0cm8gZGVidWdpbmZvLCBvcGVuIGdpdmVuIGJpbmFyeSAqLworCXJldHVybiBkaW5mbyA/IDogX19kZWJ1Z2luZm9fX25ldyhwYXRoKTsKIH0KIAogdm9pZCBkZWJ1Z2luZm9fX2RlbGV0ZShzdHJ1Y3QgZGVidWdpbmZvICpkYmcpCkBAIC04ODAsNyArNzczLDcgQEAKIH0KIAogLyogRmluZCBsaW5lcyB3aGljaCBtYXRjaCBsYXp5IHBhdHRlcm4gKi8KLXN0YXRpYyBpbnQgZmluZF9sYXp5X21hdGNoX2xpbmVzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCitzdGF0aWMgaW50IGZpbmRfbGF6eV9tYXRjaF9saW5lcyhzdHJ1Y3QgaW50bGlzdCAqbGlzdCwKIAkJCQkgY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKnBhdCkKIHsKIAlGSUxFICpmcDsKQEAgLTkwMSw3ICs3OTQsNyBAQAogCQkJbGluZVtsZW4gLSAxXSA9ICdcMCc7CiAKIAkJaWYgKHN0cmxhenltYXRjaChsaW5lLCBwYXQpKSB7Ci0JCQlsaW5lX2xpc3RfX2FkZF9saW5lKGhlYWQsIGxpbmVudW0pOworCQkJaW50bGlzdF9fYWRkKGxpc3QsIGxpbmVudW0pOwogCQkJY291bnQrKzsKIAkJfQogCQlsaW5lbnVtKys7CkBAIC05MjQsNyArODE3LDcgQEAKIAlEd2FyZl9EaWUgKnNjX2RpZSwgZGllX21lbTsKIAlpbnQgcmV0OwogCi0JaWYgKCFsaW5lX2xpc3RfX2hhc19saW5lKCZwZi0+bGNhY2hlLCBsaW5lbm8pIHx8CisJaWYgKCFpbnRsaXN0X19oYXNfZW50cnkocGYtPmxjYWNoZSwgbGluZW5vKSB8fAogCSAgICBzdHJ0YWlsY21wKGZuYW1lLCBwZi0+Zm5hbWUpICE9IDApCiAJCXJldHVybiAwOwogCkBAIC05NTIsOSArODQ1LDkgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChsaXN0X2VtcHR5KCZwZi0+bGNhY2hlKSkgeworCWlmIChpbnRsaXN0X19lbXB0eShwZi0+bGNhY2hlKSkgewogCQkvKiBNYXRjaGluZyBsYXp5IGxpbmUgcGF0dGVybiAqLwotCQlyZXQgPSBmaW5kX2xhenlfbWF0Y2hfbGluZXMoJnBmLT5sY2FjaGUsIHBmLT5mbmFtZSwKKwkJcmV0ID0gZmluZF9sYXp5X21hdGNoX2xpbmVzKHBmLT5sY2FjaGUsIHBmLT5mbmFtZSwKIAkJCQkJICAgIHBmLT5wZXYtPnBvaW50LmxhenlfbGluZSk7CiAJCWlmIChyZXQgPD0gMCkKIAkJCXJldHVybiByZXQ7CkBAIC0xMDk2LDcgKzk4OSw5IEBACiAjZW5kaWYKIAogCW9mZiA9IDA7Ci0JbGluZV9saXN0X19pbml0KCZwZi0+bGNhY2hlKTsKKwlwZi0+bGNhY2hlID0gaW50bGlzdF9fbmV3KE5VTEwpOworCWlmICghcGYtPmxjYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBGYXN0cGF0aDogbG9va3VwIGJ5IGZ1bmN0aW9uIG5hbWUgZnJvbSAuZGVidWdfcHVibmFtZXMgc2VjdGlvbiAqLwogCWlmIChwcC0+ZnVuY3Rpb24pIHsKQEAgLTExNDksNyArMTA0NCw4IEBACiAJfQogCiBmb3VuZDoKLQlsaW5lX2xpc3RfX2ZyZWUoJnBmLT5sY2FjaGUpOworCWludGxpc3RfX2RlbGV0ZShwZi0+bGNhY2hlKTsKKwlwZi0+bGNhY2hlID0gTlVMTDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNTM3LDcgKzE0MzMsNyBAQAogCQlpZiAobHItPnBhdGggPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KLQlyZXR1cm4gbGluZV9saXN0X19hZGRfbGluZSgmbHItPmxpbmVfbGlzdCwgbGluZW5vKTsKKwlyZXR1cm4gaW50bGlzdF9fYWRkKGxyLT5saW5lX2xpc3QsIGxpbmVubyk7CiB9CiAKIHN0YXRpYyBpbnQgbGluZV9yYW5nZV93YWxrX2NiKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZW5vLApAQCAtMTU2NSw3ICsxNDYxLDcgQEAKIAogCS8qIFVwZGF0ZSBzdGF0dXMgKi8KIAlpZiAocmV0ID49IDApCi0JCWlmICghbGlzdF9lbXB0eSgmbGYtPmxyLT5saW5lX2xpc3QpKQorCQlpZiAoIWludGxpc3RfX2VtcHR5KGxmLT5sci0+bGluZV9saXN0KSkKIAkJCXJldCA9IGxmLT5mb3VuZCA9IDE7CiAJCWVsc2UKIAkJCXJldCA9IDA7CS8qIExpbmVzIGFyZSBub3QgZm91bmQgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaAppbmRleCBmZmMzM2NkLi45MjU5MGIyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCkBAIC0zLDYgKzMsNyBAQAogCiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJpbnRsaXN0LmgiCiAjaW5jbHVkZSAicHJvYmUtZXZlbnQuaCIKIAogI2RlZmluZSBNQVhfUFJPQkVfQlVGRkVSCTEwMjQKQEAgLTI5LDggKzMwLDggQEAKIAlEd2FyZl9BZGRyCWJpYXM7CiB9OwogCisvKiBUaGlzIGFsc28gdHJpZXMgdG8gb3BlbiBkaXN0cm8gZGVidWdpbmZvICovCiBleHRlcm4gc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXcoY29uc3QgY2hhciAqcGF0aCk7Ci1leHRlcm4gc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXdfb25saW5lX2tlcm5lbCh1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIHZvaWQgZGVidWdpbmZvX19kZWxldGUoc3RydWN0IGRlYnVnaW5mbyAqZGJnKTsKIAogLyogRmluZCBwcm9iZV90cmFjZV9ldmVudHMgc3BlY2lmaWVkIGJ5IHBlcmZfcHJvYmVfZXZlbnQgZnJvbSBkZWJ1Z2luZm8gKi8KQEAgLTY2LDcgKzY3LDcgQEAKIAljb25zdCBjaGFyCQkqZm5hbWU7CQkvKiBSZWFsIGZpbGUgbmFtZSAqLwogCUR3YXJmX0RpZQkJY3VfZGllOwkJLyogQ3VycmVudCBDVSAqLwogCUR3YXJmX0RpZQkJc3BfZGllOwotCXN0cnVjdCBsaXN0X2hlYWQJbGNhY2hlOwkJLyogTGluZSBjYWNoZSBmb3IgbGF6eSBtYXRjaCAqLworCXN0cnVjdCBpbnRsaXN0CQkqbGNhY2hlOwkvKiBMaW5lIGNhY2hlIGZvciBsYXp5IG1hdGNoICovCiAKIAkvKiBGb3IgdmFyaWFibGUgc2VhcmNoaW5nICovCiAjaWYgX0VMRlVUSUxTX1BSRVJFUSgwLCAxNDIpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLWV4dC1zb3VyY2VzIGIvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi1leHQtc291cmNlcwppbmRleCA1OTViZmM3Li4xNmE0NzVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLWV4dC1zb3VyY2VzCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24tZXh0LXNvdXJjZXMKQEAgLTE3LDYgKzE3LDYgQEAKIHV0aWwvY2dyb3VwLmMKIHV0aWwvcmJsaXN0LmMKIHV0aWwvc3RybGlzdC5jCi11dGlsL2ZzLmMKKy4uL2xpYi9hcGkvZnMvZnMuYwogdXRpbC90cmFjZS1ldmVudC5jCiAuLi8uLi9saWIvcmJ0cmVlLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9yZWNvcmQuYwppbmRleCAzNzM3NjI1Li4wNDllMGEwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3JlY29yZC5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgImV2c2VsLmgiCiAjaW5jbHVkZSAiY3B1bWFwLmgiCiAjaW5jbHVkZSAicGFyc2UtZXZlbnRzLmgiCi0jaW5jbHVkZSAiZnMuaCIKKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlICJ1dGlsLmgiCiAKIHR5cGVkZWYgdm9pZCAoKnNldHVwX3Byb2JlX2ZuX3QpKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwppbmRleCA1ZGE2Y2U3Li41NTk2MGYyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKQEAgLTcwMiwxMSArNzAyLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByZWdzX3VzZXJfX3ByaW50ZihzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgdTY0IG1hc2spCitzdGF0aWMgdm9pZCByZWdzX3VzZXJfX3ByaW50ZihzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKIAlzdHJ1Y3QgcmVnc19kdW1wICp1c2VyX3JlZ3MgPSAmc2FtcGxlLT51c2VyX3JlZ3M7CiAKIAlpZiAodXNlcl9yZWdzLT5yZWdzKSB7CisJCXU2NCBtYXNrID0gdXNlcl9yZWdzLT5tYXNrOwogCQlwcmludGYoIi4uLiB1c2VyIHJlZ3M6IG1hc2sgMHglIiBQUkl4NjQgIlxuIiwgbWFzayk7CiAJCXJlZ3NfZHVtcF9fcHJpbnRmKG1hc2ssIHVzZXJfcmVncy0+cmVncyk7CiAJfQpAQCAtNzkzLDcgKzc5NCw3IEBACiAJaWYgKCFkdW1wX3RyYWNlKQogCQlyZXR1cm47CiAKLQlwcmludGYoIihJUCwgJWQpOiAlZC8lZDogJSMiIFBSSXg2NCAiIHBlcmlvZDogJSIgUFJJdTY0ICIgYWRkcjogJSMiIFBSSXg2NCAiXG4iLAorCXByaW50ZigiKElQLCAweCV4KTogJWQvJWQ6ICUjIiBQUkl4NjQgIiBwZXJpb2Q6ICUiIFBSSXU2NCAiIGFkZHI6ICUjIiBQUkl4NjQgIlxuIiwKIAkgICAgICAgZXZlbnQtPmhlYWRlci5taXNjLCBzYW1wbGUtPnBpZCwgc2FtcGxlLT50aWQsIHNhbXBsZS0+aXAsCiAJICAgICAgIHNhbXBsZS0+cGVyaW9kLCBzYW1wbGUtPmFkZHIpOwogCkBAIC04MDYsNyArODA3LDcgQEAKIAkJYnJhbmNoX3N0YWNrX19wcmludGYoc2FtcGxlKTsKIAogCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1JFR1NfVVNFUikKLQkJcmVnc191c2VyX19wcmludGYoc2FtcGxlLCBldnNlbC0+YXR0ci5zYW1wbGVfcmVnc191c2VyKTsKKwkJcmVnc191c2VyX19wcmludGYoc2FtcGxlKTsKIAogCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1NUQUNLX1VTRVIpCiAJCXN0YWNrX3VzZXJfX3ByaW50Zigmc2FtcGxlLT51c2VyX3N0YWNrKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCmluZGV4IDUxNmQxOWYuLjNiN2RiZjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYwpAQCAtNTA2LDYgKzUwNiw4IEBACiAJLyogdGhlIHN0YXJ0IG9mIHRoaXMgc2VjdGlvbiBpcyBhIHplcm8tdGVybWluYXRlZCBzdHJpbmcgKi8KIAlzdHJuY3B5KGRlYnVnbGluaywgZGF0YS0+ZF9idWYsIHNpemUpOwogCisJZXJyID0gMDsKKwogb3V0X2VsZl9lbmQ6CiAJZWxmX2VuZChlbGYpOwogb3V0X2Nsb3NlOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCmluZGV4IGU4OWFmYzAuLjk1ZTI0OTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogCXJldHVybiBzeW1ib2xzX19maW5kKCZkc28tPnN5bWJvbHNbdHlwZV0sIGFkZHIpOwogfQogCi1zdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpcnN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpcnN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKIAlyZXR1cm4gc3ltYm9sc19fZmlyc3QoJmRzby0+c3ltYm9sc1t0eXBlXSk7CiB9CkBAIC0xMjUxLDYgKzEyNTEsNDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBib29sIGRzb19faXNfY29tcGF0aWJsZV9zeW10YWJfdHlwZShzdHJ1Y3QgZHNvICpkc28sIGJvb2wga21vZCwKKwkJCQkJICAgZW51bSBkc29fYmluYXJ5X3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIERTT19CSU5BUllfVFlQRV9fSkFWQV9KSVQ6CisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0RFQlVHTElOSzoKKwljYXNlIERTT19CSU5BUllfVFlQRV9fU1lTVEVNX1BBVEhfRFNPOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19GRURPUkFfREVCVUdJTkZPOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19VQlVOVFVfREVCVUdJTkZPOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19CVUlMRElEX0RFQlVHSU5GTzoKKwljYXNlIERTT19CSU5BUllfVFlQRV9fT1BFTkVNQkVEREVEX0RFQlVHSU5GTzoKKwkJcmV0dXJuICFrbW9kICYmIGRzby0+a2VybmVsID09IERTT19UWVBFX1VTRVI7CisKKwljYXNlIERTT19CSU5BUllfVFlQRV9fS0FMTFNZTVM6CisJY2FzZSBEU09fQklOQVJZX1RZUEVfX1ZNTElOVVg6CisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0tDT1JFOgorCQlyZXR1cm4gZHNvLT5rZXJuZWwgPT0gRFNPX1RZUEVfS0VSTkVMOworCisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0dVRVNUX0tBTExTWU1TOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9WTUxJTlVYOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9LQ09SRToKKwkJcmV0dXJuIGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTDsKKworCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9LTU9EVUxFOgorCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19TWVNURU1fUEFUSF9LTU9EVUxFOgorCQkvKgorCQkgKiBrZXJuZWwgbW9kdWxlcyBrbm93IHRoZWlyIHN5bXRhYiB0eXBlIC0gaXQncyBzZXQgd2hlbgorCQkgKiBjcmVhdGluZyBhIG1vZHVsZSBkc28gaW4gbWFjaGluZV9fbmV3X21vZHVsZSgpLgorCQkgKi8KKwkJcmV0dXJuIGttb2QgJiYgZHNvLT5zeW10YWJfdHlwZSA9PSB0eXBlOworCisJY2FzZSBEU09fQklOQVJZX1RZUEVfX0JVSUxEX0lEX0NBQ0hFOgorCQlyZXR1cm4gdHJ1ZTsKKworCWNhc2UgRFNPX0JJTkFSWV9UWVBFX19OT1RfRk9VTkQ6CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogaW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAljaGFyICpuYW1lOwpAQCAtMTI2MSw2ICsxMzAxLDcgQEAKIAlpbnQgc3NfcG9zID0gMDsKIAlzdHJ1Y3Qgc3ltc3JjIHNzX1syXTsKIAlzdHJ1Y3Qgc3ltc3JjICpzeW1zX3NzID0gTlVMTCwgKnJ1bnRpbWVfc3MgPSBOVUxMOworCWJvb2wga21vZDsKIAogCWRzb19fc2V0X2xvYWRlZChkc28sIG1hcC0+dHlwZSk7CiAKQEAgLTEzMDEsNyArMTM0MiwxMSBAQAogCWlmICghbmFtZSkKIAkJcmV0dXJuIC0xOwogCi0JLyogSXRlcmF0ZSBvdmVyIGNhbmRpZGF0ZSBkZWJ1ZyBpbWFnZXMuCisJa21vZCA9IGRzby0+c3ltdGFiX3R5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19TWVNURU1fUEFUSF9LTU9EVUxFIHx8CisJCWRzby0+c3ltdGFiX3R5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9LTU9EVUxFOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgY2FuZGlkYXRlIGRlYnVnIGltYWdlcy4KIAkgKiBLZWVwIHRyYWNrIG9mICJpbnRlcmVzdGluZyIgb25lcyAodGhvc2Ugd2hpY2ggaGF2ZSBhIHN5bXRhYiwgZHluc3ltLAogCSAqIGFuZC9vciBvcGQgc2VjdGlvbikgZm9yIHByb2Nlc3NpbmcuCiAJICovCkBAIC0xMzExLDYgKzEzNTYsOSBAQAogCiAJCWVudW0gZHNvX2JpbmFyeV90eXBlIHN5bXRhYl90eXBlID0gYmluYXJ5X3R5cGVfc3ltdGFiW2ldOwogCisJCWlmICghZHNvX19pc19jb21wYXRpYmxlX3N5bXRhYl90eXBlKGRzbywga21vZCwgc3ltdGFiX3R5cGUpKQorCQkJY29udGludWU7CisKIAkJaWYgKGRzb19fcmVhZF9iaW5hcnlfdHlwZV9maWxlbmFtZShkc28sIHN5bXRhYl90eXBlLAogCQkJCQkJICAgcm9vdF9kaXIsIG5hbWUsIFBBVEhfTUFYKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTM1MywxNSArMTQwMSwxMCBAQAogCWlmICghcnVudGltZV9zcyAmJiBzeW1zX3NzKQogCQlydW50aW1lX3NzID0gc3ltc19zczsKIAotCWlmIChzeW1zX3NzKSB7Ci0JCWludCBrbTsKLQotCQlrbSA9IGRzby0+c3ltdGFiX3R5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19TWVNURU1fUEFUSF9LTU9EVUxFIHx8Ci0JCSAgICAgZHNvLT5zeW10YWJfdHlwZSA9PSBEU09fQklOQVJZX1RZUEVfX0dVRVNUX0tNT0RVTEU7Ci0JCXJldCA9IGRzb19fbG9hZF9zeW0oZHNvLCBtYXAsIHN5bXNfc3MsIHJ1bnRpbWVfc3MsIGZpbHRlciwga20pOwotCX0gZWxzZSB7CisJaWYgKHN5bXNfc3MpCisJCXJldCA9IGRzb19fbG9hZF9zeW0oZHNvLCBtYXAsIHN5bXNfc3MsIHJ1bnRpbWVfc3MsIGZpbHRlciwga21vZCk7CisJZWxzZQogCQlyZXQgPSAtMTsKLQl9CiAKIAlpZiAocmV0ID4gMCkgewogCQlpbnQgbnJfcGx0OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCmluZGV4IGZmZmUyODguLjUwMWU0ZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAorKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKQEAgLTc5LDYgKzc5LDE3IEBACiB2b2lkIHN5bWJvbF9fZGVsZXRlKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiB2b2lkIHN5bWJvbHNfX2RlbGV0ZShzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scyk7CiAKKy8qIHN5bWJvbHNfX2Zvcl9lYWNoX2VudHJ5IC0gaXRlcmF0ZSBvdmVyIHN5bWJvbHMgKHJiX3Jvb3QpCisgKgorICogQHN5bWJvbHM6IHRoZSByYl9yb290IG9mIHN5bWJvbHMKKyAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgorICogQG5kOiB0aGUgJ3N0cnVjdCByYl9ub2RlIConIHRvIHVzZSBhcyBhIHRlbXBvcmFyeSBzdG9yYWdlCisgKi8KKyNkZWZpbmUgc3ltYm9sc19fZm9yX2VhY2hfZW50cnkoc3ltYm9scywgcG9zLCBuZCkJCQlcCisJZm9yIChuZCA9IHJiX2ZpcnN0KHN5bWJvbHMpOwkJCQkJXAorCSAgICAgbmQgJiYgKHBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKSk7CVwKKwkgICAgIG5kID0gcmJfbmV4dChuZCkpCisKIHN0YXRpYyBpbmxpbmUgc2l6ZV90IHN5bWJvbF9fc2l6ZShjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJcmV0dXJuIHN5bS0+ZW5kIC0gc3ltLT5zdGFydCArIDE7CkBAIC0xNzUsNyArMTg2LDcgQEAKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07CiAJdTY0CSAgICAgIGFkZHI7CiAJY2hhcgkgICAgICBsZXZlbDsKLQlib29sCSAgICAgIGZpbHRlcmVkOworCXU4CSAgICAgIGZpbHRlcmVkOwogCXU4CSAgICAgIGNwdW1vZGU7CiAJczMyCSAgICAgIGNwdTsKIH07CkBAIC0yMjMsNyArMjM0LDYgQEAKIAkJCQl1NjQgYWRkcik7CiBzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCWNvbnN0IGNoYXIgKm5hbWUpOwotc3RydWN0IHN5bWJvbCAqZHNvX19maXJzdF9zeW1ib2woc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpOwogCiBpbnQgZmlsZW5hbWVfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CiBpbnQgc3lzZnNfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMgYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMKaW5kZXggMDM1ODg4Mi4uM2NlMDQ5OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuYwpAQCAtMTQyLDMgKzE0MiwyNCBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgdGhyZWFkX19maW5kX2NwdW1vZGVfYWRkcl9sb2NhdGlvbihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCisJCQkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJCQllbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAorCQkJCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpCit7CisJc2l6ZV90IGk7CisJY29uc3QgdTggY29uc3QgY3B1bW9kZXNbXSA9IHsKKwkJUEVSRl9SRUNPUkRfTUlTQ19VU0VSLAorCQlQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTCwKKwkJUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9VU0VSLAorCQlQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX0tFUk5FTAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHVtb2Rlcyk7IGkrKykgeworCQl0aHJlYWRfX2ZpbmRfYWRkcl9sb2NhdGlvbih0aHJlYWQsIG1hY2hpbmUsIGNwdW1vZGVzW2ldLCB0eXBlLAorCQkJCQkgICBhZGRyLCBhbCk7CisJCWlmIChhbC0+bWFwKQorCQkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oIGIvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oCmluZGV4IDViODU2YmYuLjliMjlmMDggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuaAorKysgYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmgKQEAgLTQ0LDEyICs0NCw2IEBACiBpbnQgdGhyZWFkX19mb3JrKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IHRocmVhZCAqcGFyZW50LCB1NjQgdGltZXN0YW1wKTsKIHNpemVfdCB0aHJlYWRfX2ZwcmludGYoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBGSUxFICpmcCk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1hcCAqdGhyZWFkX19maW5kX21hcChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCi0JCQkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIpCi17Ci0JcmV0dXJuIHRocmVhZCA/IG1hcF9ncm91cHNfX2ZpbmQoJnRocmVhZC0+bWcsIHR5cGUsIGFkZHIpIDogTlVMTDsKLX0KLQogdm9pZCB0aHJlYWRfX2ZpbmRfYWRkcl9tYXAoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCSAgIHU4IGNwdW1vZGUsIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIsCiAJCQkgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOwpAQCAtNTgsNiArNTIsMTEgQEAKIAkJCQl1OCBjcHVtb2RlLCBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAogCQkJCXN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCk7CiAKK3ZvaWQgdGhyZWFkX19maW5kX2NwdW1vZGVfYWRkcl9sb2NhdGlvbihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCisJCQkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJCQllbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAorCQkJCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgKnRocmVhZF9fcHJpdihzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7CiAJcmV0dXJuIHRocmVhZC0+cHJpdjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggZTBkNmQwN2YuLmMzNjYzNmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIAl0cmFjZV9zZXFfaW5pdCgmcyk7CiAJcGV2ZW50X2V2ZW50X2luZm8oJnMsIGV2ZW50LCAmcmVjb3JkKTsKIAl0cmFjZV9zZXFfZG9fcHJpbnRmKCZzKTsKKwl0cmFjZV9zZXFfZGVzdHJveSgmcyk7CiB9CiAKIHZvaWQgcGFyc2VfcHJvY19rYWxsc3ltcyhzdHJ1Y3QgcGV2ZW50ICpwZXZlbnQsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmMgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkYjczZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGliZHcuYwpAQCAtMCwwICsxLDIxMCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8ZWxmdXRpbHMvbGliZHcuaD4KKyNpbmNsdWRlIDxlbGZ1dGlscy9saWJkd2ZsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInVud2luZC5oIgorI2luY2x1ZGUgInVud2luZC1saWJkdy5oIgorI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAicGVyZl9yZWdzLmgiCisKK3N0YXRpYyBjaGFyICpkZWJ1Z2luZm9fcGF0aDsKKworc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIG9mZmxpbmVfY2FsbGJhY2tzID0geworCS5maW5kX2RlYnVnaW5mbwkJPSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvLAorCS5kZWJ1Z2luZm9fcGF0aAkJPSAmZGVidWdpbmZvX3BhdGgsCisJLnNlY3Rpb25fYWRkcmVzcwk9IGR3Zmxfb2ZmbGluZV9zZWN0aW9uX2FkZHJlc3MsCit9OworCitzdGF0aWMgaW50IF9fcmVwb3J0X21vZHVsZShzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsIHU2NCBpcCwKKwkJCSAgICBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQoreworCUR3ZmxfTW9kdWxlICptb2Q7CisJc3RydWN0IGRzbyAqZHNvID0gTlVMTDsKKworCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLAorCQkJCSAgIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKKwkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgYWwpOworCisJaWYgKGFsLT5tYXApCisJCWRzbyA9IGFsLT5tYXAtPmRzbzsKKworCWlmICghZHNvKQorCQlyZXR1cm4gMDsKKworCW1vZCA9IGR3ZmxfYWRkcm1vZHVsZSh1aS0+ZHdmbCwgaXApOworCWlmICghbW9kKQorCQltb2QgPSBkd2ZsX3JlcG9ydF9lbGYodWktPmR3ZmwsIGRzby0+c2hvcnRfbmFtZSwKKwkJCQkgICAgICBkc28tPmxvbmdfbmFtZSwgLTEsIGFsLT5tYXAtPnN0YXJ0LAorCQkJCSAgICAgIGZhbHNlKTsKKworCXJldHVybiBtb2QgJiYgZHdmbF9hZGRybW9kdWxlKHVpLT5kd2ZsLCBpcCkgPT0gbW9kID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHJlcG9ydF9tb2R1bGUodTY0IGlwLCBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQoreworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCisJcmV0dXJuIF9fcmVwb3J0X21vZHVsZSgmYWwsIGlwLCB1aSk7Cit9CisKK3N0YXRpYyBpbnQgZW50cnkodTY0IGlwLCBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQorCit7CisJc3RydWN0IHVud2luZF9lbnRyeSBlOworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCisJaWYgKF9fcmVwb3J0X21vZHVsZSgmYWwsIGlwLCB1aSkpCisJCXJldHVybiAtMTsKKworCWUuaXAgID0gaXA7CisJZS5tYXAgPSBhbC5tYXA7CisJZS5zeW0gPSBhbC5zeW07CisKKwlwcl9kZWJ1ZygidW53aW5kOiAlczppcCA9IDB4JSIgUFJJeDY0ICIgKDB4JSIgUFJJeDY0ICIpXG4iLAorCQkgYWwuc3ltID8gYWwuc3ltLT5uYW1lIDogIicnIiwKKwkJIGlwLAorCQkgYWwubWFwID8gYWwubWFwLT5tYXBfaXAoYWwubWFwLCBpcCkgOiAodTY0KSAwKTsKKworCXJldHVybiB1aS0+Y2IoJmUsIHVpLT5hcmcpOworfQorCitzdGF0aWMgcGlkX3QgbmV4dF90aHJlYWQoRHdmbCAqZHdmbCwgdm9pZCAqYXJnLCB2b2lkICoqdGhyZWFkX2FyZ3ApCit7CisJLyogV2Ugd2FudCBvbmx5IHNpbmdsZSB0aHJlYWQgdG8gYmUgcHJvY2Vzc2VkLiAqLworCWlmICgqdGhyZWFkX2FyZ3AgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkqdGhyZWFkX2FyZ3AgPSBhcmc7CisJcmV0dXJuIGR3ZmxfcGlkKGR3ZmwpOworfQorCitzdGF0aWMgaW50IGFjY2Vzc19kc29fbWVtKHN0cnVjdCB1bndpbmRfaW5mbyAqdWksIER3YXJmX0FkZHIgYWRkciwKKwkJCSAgRHdhcmZfV29yZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKwlzc2l6ZV90IHNpemU7CisKKwl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodWktPnRocmVhZCwgdWktPm1hY2hpbmUsIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKKwkJCSAgICAgIE1BUF9fRlVOQ1RJT04sIGFkZHIsICZhbCk7CisJaWYgKCFhbC5tYXApIHsKKwkJcHJfZGVidWcoInVud2luZDogbm8gbWFwIGZvciAlbHhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFhbC5tYXAtPmRzbykKKwkJcmV0dXJuIC0xOworCisJc2l6ZSA9IGRzb19fZGF0YV9yZWFkX2FkZHIoYWwubWFwLT5kc28sIGFsLm1hcCwgdWktPm1hY2hpbmUsCisJCQkJICAgYWRkciwgKHU4ICopIGRhdGEsIHNpemVvZigqZGF0YSkpOworCisJcmV0dXJuICEoc2l6ZSA9PSBzaXplb2YoKmRhdGEpKTsKK30KKworc3RhdGljIGJvb2wgbWVtb3J5X3JlYWQoRHdmbCAqZHdmbCBfX21heWJlX3VudXNlZCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9Xb3JkICpyZXN1bHQsCisJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHVud2luZF9pbmZvICp1aSA9IGFyZzsKKwlzdHJ1Y3Qgc3RhY2tfZHVtcCAqc3RhY2sgPSAmdWktPnNhbXBsZS0+dXNlcl9zdGFjazsKKwl1NjQgc3RhcnQsIGVuZDsKKwlpbnQgb2Zmc2V0OworCWludCByZXQ7CisKKwlyZXQgPSBwZXJmX3JlZ192YWx1ZSgmc3RhcnQsICZ1aS0+c2FtcGxlLT51c2VyX3JlZ3MsIFBFUkZfUkVHX1NQKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwllbmQgPSBzdGFydCArIHN0YWNrLT5zaXplOworCisJLyogQ2hlY2sgb3ZlcmZsb3cuICovCisJaWYgKGFkZHIgKyBzaXplb2YoRHdhcmZfV29yZCkgPCBhZGRyKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYWRkciA8IHN0YXJ0IHx8IGFkZHIgKyBzaXplb2YoRHdhcmZfV29yZCkgPiBlbmQpIHsKKwkJcmV0ID0gYWNjZXNzX2Rzb19tZW0odWksIGFkZHIsIHJlc3VsdCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2RlYnVnKCJ1bndpbmQ6IGFjY2Vzc19tZW0gMHglIiBQUkl4NjQgIiBub3QgaW5zaWRlIHJhbmdlIgorCQkJCSAiIDB4JSIgUFJJeDY0ICItMHglIiBQUkl4NjQgIlxuIiwKKwkJCQlhZGRyLCBzdGFydCwgZW5kKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlvZmZzZXQgID0gYWRkciAtIHN0YXJ0OworCSpyZXN1bHQgPSAqKER3YXJmX1dvcmQgKikmc3RhY2stPmRhdGFbb2Zmc2V0XTsKKwlwcl9kZWJ1ZygidW53aW5kOiBhY2Nlc3NfbWVtIGFkZHIgMHglIiBQUkl4NjQgIiwgdmFsICVseCwgb2Zmc2V0ICVkXG4iLAorCQkgYWRkciwgKHVuc2lnbmVkIGxvbmcpKnJlc3VsdCwgb2Zmc2V0KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNvbnN0IER3ZmxfVGhyZWFkX0NhbGxiYWNrcyBjYWxsYmFja3MgPSB7CisJLm5leHRfdGhyZWFkCQk9IG5leHRfdGhyZWFkLAorCS5tZW1vcnlfcmVhZAkJPSBtZW1vcnlfcmVhZCwKKwkuc2V0X2luaXRpYWxfcmVnaXN0ZXJzCT0gbGliZHdfX2FyY2hfc2V0X2luaXRpYWxfcmVnaXN0ZXJzLAorfTsKKworc3RhdGljIGludAorZnJhbWVfY2FsbGJhY2soRHdmbF9GcmFtZSAqc3RhdGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOworCUR3YXJmX0FkZHIgcGM7CisKKwlpZiAoIWR3ZmxfZnJhbWVfcGMoc3RhdGUsICZwYywgTlVMTCkpIHsKKwkJcHJfZXJyKCIlcyIsIGR3ZmxfZXJybXNnKC0xKSk7CisJCXJldHVybiBEV0FSRl9DQl9BQk9SVDsKKwl9CisKKwlyZXR1cm4gZW50cnkocGMsIHVpKSB8fCAhKC0tdWktPm1heF9zdGFjaykgPworCSAgICAgICBEV0FSRl9DQl9BQk9SVCA6IERXQVJGX0NCX09LOworfQorCitpbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAorCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKKwkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSwKKwkJCWludCBtYXhfc3RhY2spCit7CisJc3RydWN0IHVud2luZF9pbmZvIHVpID0geworCQkuc2FtcGxlCQk9IGRhdGEsCisJCS50aHJlYWQJCT0gdGhyZWFkLAorCQkubWFjaGluZQk9IG1hY2hpbmUsCisJCS5jYgkJPSBjYiwKKwkJLmFyZwkJPSBhcmcsCisJCS5tYXhfc3RhY2sJPSBtYXhfc3RhY2ssCisJfTsKKwlEd2FyZl9Xb3JkIGlwOworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKCFkYXRhLT51c2VyX3JlZ3MucmVncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1aS5kd2ZsID0gZHdmbF9iZWdpbigmb2ZmbGluZV9jYWxsYmFja3MpOworCWlmICghdWkuZHdmbCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBwZXJmX3JlZ192YWx1ZSgmaXAsICZkYXRhLT51c2VyX3JlZ3MsIFBFUkZfUkVHX0lQKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHJlcG9ydF9tb2R1bGUoaXAsICZ1aSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAoIWR3ZmxfYXR0YWNoX3N0YXRlKHVpLmR3ZmwsIEVNX05PTkUsIHRocmVhZC0+dGlkLCAmY2FsbGJhY2tzLCAmdWkpKQorCQlnb3RvIG91dDsKKworCWVyciA9IGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcyh1aS5kd2ZsLCB0aHJlYWQtPnRpZCwgZnJhbWVfY2FsbGJhY2ssICZ1aSk7CisKKwlpZiAoZXJyICYmICF1aS5tYXhfc3RhY2spCisJCWVyciA9IDA7CisKKyBvdXQ6CisJaWYgKGVycikKKwkJcHJfZGVidWcoInVud2luZDogZmFpbGVkIHdpdGggJyVzJ1xuIiwgZHdmbF9lcnJtc2coLTEpKTsKKworCWR3ZmxfZW5kKHVpLmR3ZmwpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJkdy5oIGIvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJkdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2ExNDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX1BFUkZfVU5XSU5EX0xJQkRXX0gKKyNkZWZpbmUgX19QRVJGX1VOV0lORF9MSUJEV19ICisKKyNpbmNsdWRlIDxlbGZ1dGlscy9saWJkd2ZsLmg+CisjaW5jbHVkZSAiZXZlbnQuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1bndpbmQuaCIKKworYm9vbCBsaWJkd19fYXJjaF9zZXRfaW5pdGlhbF9yZWdpc3RlcnMoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJnKTsKKworc3RydWN0IHVud2luZF9pbmZvIHsKKwlEd2ZsCQkJKmR3Zmw7CisJc3RydWN0IHBlcmZfc2FtcGxlICAgICAgKnNhbXBsZTsKKwlzdHJ1Y3QgbWFjaGluZSAgICAgICAgICAqbWFjaGluZTsKKwlzdHJ1Y3QgdGhyZWFkICAgICAgICAgICAqdGhyZWFkOworCXVud2luZF9lbnRyeV9jYl90CWNiOworCXZvaWQJCQkqYXJnOworCWludAkJCW1heF9zdGFjazsKK307CisKKyNlbmRpZiAvKiBfX1BFUkZfVU5XSU5EX0xJQkRXX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGlidW53aW5kLmMgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTc2OGQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC5jCkBAIC0wLDAgKzEsNTgxIEBACisvKgorICogUG9zdCBtb3J0ZW0gRHdhcmYgQ0ZJIGJhc2VkIHVud2luZGluZyBvbiB0b3Agb2YgcmVncyBhbmQgc3RhY2sgZHVtcHMuCisgKgorICogTG90cyBvZiB0aGlzIGNvZGUgaGF2ZSBiZWVuIGJvcnJvd2VkIG9yIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBwYXJ0cyBvZgorICogdGhlIGxpYnVud2luZCAwLjk5IGNvZGUgd2hpY2ggYXJlIChhbW9uZ3N0IG90aGVyIGNvbnRyaWJ1dG9ycyBJIG1heSBoYXZlCisgKiBmb3Jnb3R0ZW4pOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA3IEhld2xldHQtUGFja2FyZCBDbworICoJQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgorICoKKyAqIEFuZCB0aGUgYnVncyBoYXZlIGJlZW4gYWRkZWQgYnk6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBGcmVkZXJpYyBXZWlzYmVja2VyIDxmd2Vpc2JlY0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIEppcmkgT2xzYSA8am9sc2FAcmVkaGF0LmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpYnVud2luZC5oPgorI2luY2x1ZGUgPGxpYnVud2luZC1wdHJhY2UuaD4KKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJzZXNzaW9uLmgiCisjaW5jbHVkZSAicGVyZl9yZWdzLmgiCisjaW5jbHVkZSAidW53aW5kLmgiCisjaW5jbHVkZSAic3ltYm9sLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCitleHRlcm4gaW50CitVTldfT0JKKGR3YXJmX3NlYXJjaF91bndpbmRfdGFibGUpICh1bndfYWRkcl9zcGFjZV90IGFzLAorCQkJCSAgICB1bndfd29yZF90IGlwLAorCQkJCSAgICB1bndfZHluX2luZm9fdCAqZGksCisJCQkJICAgIHVud19wcm9jX2luZm9fdCAqcGksCisJCQkJICAgIGludCBuZWVkX3Vud2luZF9pbmZvLCB2b2lkICphcmcpOworCisjZGVmaW5lIGR3YXJmX3NlYXJjaF91bndpbmRfdGFibGUgVU5XX09CSihkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlKQorCitleHRlcm4gaW50CitVTldfT0JKKGR3YXJmX2ZpbmRfZGVidWdfZnJhbWUpIChpbnQgZm91bmQsIHVud19keW5faW5mb190ICpkaV9kZWJ1ZywKKwkJCQkgdW53X3dvcmRfdCBpcCwKKwkJCQkgdW53X3dvcmRfdCBzZWdiYXNlLAorCQkJCSBjb25zdCBjaGFyICpvYmpfbmFtZSwgdW53X3dvcmRfdCBzdGFydCwKKwkJCQkgdW53X3dvcmRfdCBlbmQpOworCisjZGVmaW5lIGR3YXJmX2ZpbmRfZGVidWdfZnJhbWUgVU5XX09CSihkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKQorCisjZGVmaW5lIERXX0VIX1BFX0ZPUk1BVF9NQVNLCTB4MGYJLyogZm9ybWF0IG9mIHRoZSBlbmNvZGVkIHZhbHVlICovCisjZGVmaW5lIERXX0VIX1BFX0FQUExfTUFTSwkweDcwCS8qIGhvdyB0aGUgdmFsdWUgaXMgdG8gYmUgYXBwbGllZCAqLworCisvKiBQb2ludGVyLWVuY29kaW5nIGZvcm1hdHM6ICovCisjZGVmaW5lIERXX0VIX1BFX29taXQJCTB4ZmYKKyNkZWZpbmUgRFdfRUhfUEVfcHRyCQkweDAwCS8qIHBvaW50ZXItc2l6ZWQgdW5zaWduZWQgdmFsdWUgKi8KKyNkZWZpbmUgRFdfRUhfUEVfdWRhdGE0CQkweDAzCS8qIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZSAqLworI2RlZmluZSBEV19FSF9QRV91ZGF0YTgJCTB4MDQJLyogdW5zaWduZWQgNjQtYml0IHZhbHVlICovCisjZGVmaW5lIERXX0VIX1BFX3NkYXRhNAkJMHgwYgkvKiBzaWduZWQgMzItYml0IHZhbHVlICovCisjZGVmaW5lIERXX0VIX1BFX3NkYXRhOAkJMHgwYwkvKiBzaWduZWQgNjQtYml0IHZhbHVlICovCisKKy8qIFBvaW50ZXItZW5jb2RpbmcgYXBwbGljYXRpb246ICovCisjZGVmaW5lIERXX0VIX1BFX2Fic3B0cgkJMHgwMAkvKiBhYnNvbHV0ZSB2YWx1ZSAqLworI2RlZmluZSBEV19FSF9QRV9wY3JlbAkJMHgxMAkvKiByZWwuIHRvIGFkZHIuIG9mIGVuY29kZWQgdmFsdWUgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCBkb2N1bWVudGVkIGJ5IExTQiB2MS4zLCB5ZXQgdGhleSBhcmUgdXNlZCBieQorICogR0NDLCBwcmVzdW1hYmx5IHRoZXkgYXJlbid0IGRvY3VtZW50ZWQgYnkgTFNCIHNpbmNlIHRoZXkgYXJlbid0CisgKiB1c2VkIG9uIExpbnV4OgorICovCisjZGVmaW5lIERXX0VIX1BFX2Z1bmNyZWwJMHg0MAkvKiBzdGFydC1vZi1wcm9jZWR1cmUtcmVsYXRpdmUgKi8KKyNkZWZpbmUgRFdfRUhfUEVfYWxpZ25lZAkweDUwCS8qIGFsaWduZWQgcG9pbnRlciAqLworCisvKiBGbGFncyBpbnRlbnRpb25hbHkgbm90IGhhbmRsZWQsIHNpbmNlIHRoZXkncmUgbm90IG5lZWRlZDoKKyAqICNkZWZpbmUgRFdfRUhfUEVfaW5kaXJlY3QgICAgICAweDgwCisgKiAjZGVmaW5lIERXX0VIX1BFX3VsZWIxMjggICAgICAgMHgwMQorICogI2RlZmluZSBEV19FSF9QRV91ZGF0YTIgICAgICAgIDB4MDIKKyAqICNkZWZpbmUgRFdfRUhfUEVfc2xlYjEyOCAgICAgICAweDA5CisgKiAjZGVmaW5lIERXX0VIX1BFX3NkYXRhMiAgICAgICAgMHgwYQorICogI2RlZmluZSBEV19FSF9QRV90ZXh0cmVsICAgICAgIDB4MjAKKyAqICNkZWZpbmUgRFdfRUhfUEVfZGF0YXJlbCAgICAgICAweDMwCisgKi8KKworc3RydWN0IHVud2luZF9pbmZvIHsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGUJKnNhbXBsZTsKKwlzdHJ1Y3QgbWFjaGluZQkJKm1hY2hpbmU7CisJc3RydWN0IHRocmVhZAkJKnRocmVhZDsKK307CisKKyNkZWZpbmUgZHdfcmVhZChwdHIsIHR5cGUsIGVuZCkgKHsJXAorCXR5cGUgKl9fcCA9ICh0eXBlICopIHB0cjsJXAorCXR5cGUgIF9fdjsJCQlcCisJaWYgKChfX3AgKyAxKSA+ICh0eXBlICopIGVuZCkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCVwKKwlfX3YgPSAqX19wKys7CQkJXAorCXB0ciA9ICh0eXBlb2YocHRyKSkgX19wOwlcCisJX192OwkJCQlcCisJfSkKKworc3RhdGljIGludCBfX2R3X3JlYWRfZW5jb2RlZF92YWx1ZSh1OCAqKnAsIHU4ICplbmQsIHU2NCAqdmFsLAorCQkJCSAgIHU4IGVuY29kaW5nKQoreworCXU4ICpjdXIgPSAqcDsKKwkqdmFsID0gMDsKKworCXN3aXRjaCAoZW5jb2RpbmcpIHsKKwljYXNlIERXX0VIX1BFX29taXQ6CisJCSp2YWwgPSAwOworCQlnb3RvIG91dDsKKwljYXNlIERXX0VIX1BFX3B0cjoKKwkJKnZhbCA9IGR3X3JlYWQoY3VyLCB1bnNpZ25lZCBsb25nLCBlbmQpOworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGVuY29kaW5nICYgRFdfRUhfUEVfQVBQTF9NQVNLKSB7CisJY2FzZSBEV19FSF9QRV9hYnNwdHI6CisJCWJyZWFrOworCWNhc2UgRFdfRUhfUEVfcGNyZWw6CisJCSp2YWwgPSAodW5zaWduZWQgbG9uZykgY3VyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGVuY29kaW5nICYgMHgwNykgPT0gMHgwMCkKKwkJZW5jb2RpbmcgfD0gRFdfRUhfUEVfdWRhdGE0OworCisJc3dpdGNoIChlbmNvZGluZyAmIERXX0VIX1BFX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBEV19FSF9QRV9zZGF0YTQ6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHMzMiwgZW5kKTsKKwkJYnJlYWs7CisJY2FzZSBEV19FSF9QRV91ZGF0YTQ6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHUzMiwgZW5kKTsKKwkJYnJlYWs7CisJY2FzZSBEV19FSF9QRV9zZGF0YTg6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHM2NCwgZW5kKTsKKwkJYnJlYWs7CisJY2FzZSBEV19FSF9QRV91ZGF0YTg6CisJCSp2YWwgKz0gZHdfcmVhZChjdXIsIHU2NCwgZW5kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisgb3V0OgorCSpwID0gY3VyOworCXJldHVybiAwOworfQorCisjZGVmaW5lIGR3X3JlYWRfZW5jb2RlZF92YWx1ZShwdHIsIGVuZCwgZW5jKSAoewkJCVwKKwl1NjQgX192OwkJCQkJCVwKKwlpZiAoX19kd19yZWFkX2VuY29kZWRfdmFsdWUoJnB0ciwgZW5kLCAmX192LCBlbmMpKSB7CVwKKwkJcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9fdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0pCisKK3N0YXRpYyB1NjQgZWxmX3NlY3Rpb25fb2Zmc2V0KGludCBmZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlFbGYgKmVsZjsKKwlHRWxmX0VoZHIgZWhkcjsKKwlHRWxmX1NoZHIgc2hkcjsKKwl1NjQgb2Zmc2V0ID0gMDsKKworCWVsZiA9IGVsZl9iZWdpbihmZCwgUEVSRl9FTEZfQ19SRUFEX01NQVAsIE5VTEwpOworCWlmIChlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlkbyB7CisJCWlmIChnZWxmX2dldGVoZHIoZWxmLCAmZWhkcikgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWlmICghZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgbmFtZSwgTlVMTCkpCisJCQlicmVhazsKKworCQlvZmZzZXQgPSBzaGRyLnNoX29mZnNldDsKKwl9IHdoaWxlICgwKTsKKworCWVsZl9lbmQoZWxmKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdHJ1Y3QgdGFibGVfZW50cnkgeworCXUzMiBzdGFydF9pcF9vZmZzZXQ7CisJdTMyIGZkZV9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgZWhfZnJhbWVfaGRyIHsKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb247CisJdW5zaWduZWQgY2hhciBlaF9mcmFtZV9wdHJfZW5jOworCXVuc2lnbmVkIGNoYXIgZmRlX2NvdW50X2VuYzsKKwl1bnNpZ25lZCBjaGFyIHRhYmxlX2VuYzsKKworCS8qCisJICogVGhlIHJlc3Qgb2YgdGhlIGhlYWRlciBpcyB2YXJpYWJsZS1sZW5ndGggYW5kIGNvbnNpc3RzIG9mIHRoZQorCSAqIGZvbGxvd2luZyBtZW1iZXJzOgorCSAqCisJICoJZW5jb2RlZF90IGVoX2ZyYW1lX3B0cjsKKwkgKgllbmNvZGVkX3QgZmRlX2NvdW50OworCSAqLworCisJLyogQSBzaW5nbGUgZW5jb2RlZCBwb2ludGVyIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuIDggYnl0ZXMuICovCisJdTY0IGVuY1syXTsKKworCS8qCisJICogc3RydWN0IHsKKwkgKiAgICBlbmNvZGVkX3Qgc3RhcnRfaXA7CisJICogICAgZW5jb2RlZF90IGZkZV9hZGRyOworCSAqIH0gYmluYXJ5X3NlYXJjaF90YWJsZVtmZGVfY291bnRdOworCSAqLworCWNoYXIgZGF0YVswXTsKK30gX19wYWNrZWQ7CisKK3N0YXRpYyBpbnQgdW53aW5kX3NwZWNfZWhmcmFtZShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJICAgICAgIHU2NCBvZmZzZXQsIHU2NCAqdGFibGVfZGF0YSwgdTY0ICpzZWdiYXNlLAorCQkJICAgICAgIHU2NCAqZmRlX2NvdW50KQoreworCXN0cnVjdCBlaF9mcmFtZV9oZHIgaGRyOworCXU4ICplbmMgPSAodTggKikgJmhkci5lbmM7CisJdTggKmVuZCA9ICh1OCAqKSAmaGRyLmRhdGE7CisJc3NpemVfdCByOworCisJciA9IGRzb19fZGF0YV9yZWFkX29mZnNldChkc28sIG1hY2hpbmUsIG9mZnNldCwKKwkJCQkgICh1OCAqKSAmaGRyLCBzaXplb2YoaGRyKSk7CisJaWYgKHIgIT0gc2l6ZW9mKGhkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogV2UgZG9udCBuZWVkIGVoX2ZyYW1lX3B0ciwganVzdCBza2lwIGl0LiAqLworCWR3X3JlYWRfZW5jb2RlZF92YWx1ZShlbmMsIGVuZCwgaGRyLmVoX2ZyYW1lX3B0cl9lbmMpOworCisJKmZkZV9jb3VudCAgPSBkd19yZWFkX2VuY29kZWRfdmFsdWUoZW5jLCBlbmQsIGhkci5mZGVfY291bnRfZW5jKTsKKwkqc2VnYmFzZSAgICA9IG9mZnNldDsKKwkqdGFibGVfZGF0YSA9IChlbmMgLSAodTggKikgJmhkcikgKyBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF91bndpbmRfc3BlY19laF9mcmFtZShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJCSAgICAgdTY0ICp0YWJsZV9kYXRhLCB1NjQgKnNlZ2Jhc2UsCisJCQkJICAgICB1NjQgKmZkZV9jb3VudCkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTCwgZmQ7CisJdTY0IG9mZnNldDsKKworCWZkID0gZHNvX19kYXRhX2ZkKGRzbywgbWFjaGluZSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayB0aGUgLmVoX2ZyYW1lIHNlY3Rpb24gZm9yIHVud2luZGluZyBpbmZvICovCisJb2Zmc2V0ID0gZWxmX3NlY3Rpb25fb2Zmc2V0KGZkLCAiLmVoX2ZyYW1lX2hkciIpOworCWNsb3NlKGZkKTsKKworCWlmIChvZmZzZXQpCisJCXJldCA9IHVud2luZF9zcGVjX2VoZnJhbWUoZHNvLCBtYWNoaW5lLCBvZmZzZXQsCisJCQkJCSAgdGFibGVfZGF0YSwgc2VnYmFzZSwKKwkJCQkJICBmZGVfY291bnQpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBOT19MSUJVTldJTkRfREVCVUdfRlJBTUUKK3N0YXRpYyBpbnQgcmVhZF91bndpbmRfc3BlY19kZWJ1Z19mcmFtZShzdHJ1Y3QgZHNvICpkc28sCisJCQkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1NjQgKm9mZnNldCkKK3sKKwlpbnQgZmQgPSBkc29fX2RhdGFfZmQoZHNvLCBtYWNoaW5lKTsKKworCWlmIChmZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgdGhlIC5kZWJ1Z19mcmFtZSBzZWN0aW9uIGZvciB1bndpbmRpbmcgaW5mbyAqLworCSpvZmZzZXQgPSBlbGZfc2VjdGlvbl9vZmZzZXQoZmQsICIuZGVidWdfZnJhbWUiKTsKKwljbG9zZShmZCk7CisKKwlpZiAoKm9mZnNldCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1hcCAqZmluZF9tYXAodW53X3dvcmRfdCBpcCwgc3RydWN0IHVud2luZF9pbmZvICp1aSkKK3sKKwlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKworCXRocmVhZF9fZmluZF9hZGRyX21hcCh1aS0+dGhyZWFkLCB1aS0+bWFjaGluZSwgUEVSRl9SRUNPUkRfTUlTQ19VU0VSLAorCQkJICAgICAgTUFQX19GVU5DVElPTiwgaXAsICZhbCk7CisJcmV0dXJuIGFsLm1hcDsKK30KKworc3RhdGljIGludAorZmluZF9wcm9jX2luZm8odW53X2FkZHJfc3BhY2VfdCBhcywgdW53X3dvcmRfdCBpcCwgdW53X3Byb2NfaW5mb190ICpwaSwKKwkgICAgICAgaW50IG5lZWRfdW53aW5kX2luZm8sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOworCXN0cnVjdCBtYXAgKm1hcDsKKwl1bndfZHluX2luZm9fdCBkaTsKKwl1NjQgdGFibGVfZGF0YSwgc2VnYmFzZSwgZmRlX2NvdW50OworCisJbWFwID0gZmluZF9tYXAoaXAsIHVpKTsKKwlpZiAoIW1hcCB8fCAhbWFwLT5kc28pCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoInVud2luZDogZmluZF9wcm9jX2luZm8gZHNvICVzXG4iLCBtYXAtPmRzby0+bmFtZSk7CisKKwkvKiBDaGVjayB0aGUgLmVoX2ZyYW1lIHNlY3Rpb24gZm9yIHVud2luZGluZyBpbmZvICovCisJaWYgKCFyZWFkX3Vud2luZF9zcGVjX2VoX2ZyYW1lKG1hcC0+ZHNvLCB1aS0+bWFjaGluZSwKKwkJCQkgICAgICAgJnRhYmxlX2RhdGEsICZzZWdiYXNlLCAmZmRlX2NvdW50KSkgeworCQltZW1zZXQoJmRpLCAwLCBzaXplb2YoZGkpKTsKKwkJZGkuZm9ybWF0ICAgPSBVTldfSU5GT19GT1JNQVRfUkVNT1RFX1RBQkxFOworCQlkaS5zdGFydF9pcCA9IG1hcC0+c3RhcnQ7CisJCWRpLmVuZF9pcCAgID0gbWFwLT5lbmQ7CisJCWRpLnUucnRpLnNlZ2Jhc2UgICAgPSBtYXAtPnN0YXJ0ICsgc2VnYmFzZTsKKwkJZGkudS5ydGkudGFibGVfZGF0YSA9IG1hcC0+c3RhcnQgKyB0YWJsZV9kYXRhOworCQlkaS51LnJ0aS50YWJsZV9sZW4gID0gZmRlX2NvdW50ICogc2l6ZW9mKHN0cnVjdCB0YWJsZV9lbnRyeSkKKwkJCQkgICAgICAvIHNpemVvZih1bndfd29yZF90KTsKKwkJcmV0dXJuIGR3YXJmX3NlYXJjaF91bndpbmRfdGFibGUoYXMsIGlwLCAmZGksIHBpLAorCQkJCQkJIG5lZWRfdW53aW5kX2luZm8sIGFyZyk7CisJfQorCisjaWZuZGVmIE5PX0xJQlVOV0lORF9ERUJVR19GUkFNRQorCS8qIENoZWNrIHRoZSAuZGVidWdfZnJhbWUgc2VjdGlvbiBmb3IgdW53aW5kaW5nIGluZm8gKi8KKwlpZiAoIXJlYWRfdW53aW5kX3NwZWNfZGVidWdfZnJhbWUobWFwLT5kc28sIHVpLT5tYWNoaW5lLCAmc2VnYmFzZSkpIHsKKwkJbWVtc2V0KCZkaSwgMCwgc2l6ZW9mKGRpKSk7CisJCWlmIChkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKDAsICZkaSwgaXAsIDAsIG1hcC0+ZHNvLT5uYW1lLAorCQkJCQkgICBtYXAtPnN0YXJ0LCBtYXAtPmVuZCkpCisJCQlyZXR1cm4gZHdhcmZfc2VhcmNoX3Vud2luZF90YWJsZShhcywgaXAsICZkaSwgcGksCisJCQkJCQkJIG5lZWRfdW53aW5kX2luZm8sIGFyZyk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhY2Nlc3NfZnByZWcodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJCXVud19yZWdudW1fdCBfX21heWJlX3VudXNlZCBudW0sCisJCQl1bndfZnByZWdfdCBfX21heWJlX3VudXNlZCAqdmFsLAorCQkJaW50IF9fbWF5YmVfdW51c2VkIF9fd3JpdGUsCisJCQl2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCit7CisJcHJfZXJyKCJ1bndpbmQ6IGFjY2Vzc19mcHJlZyB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1VTldfRUlOVkFMOworfQorCitzdGF0aWMgaW50IGdldF9keW5faW5mb19saXN0X2FkZHIodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJCQkgIHVud193b3JkX3QgX19tYXliZV91bnVzZWQgKmRpbF9hZGRyLAorCQkJCSAgdm9pZCBfX21heWJlX3VudXNlZCAqYXJnKQoreworCXJldHVybiAtVU5XX0VOT0lORk87Cit9CisKK3N0YXRpYyBpbnQgcmVzdW1lKHVud19hZGRyX3NwYWNlX3QgX19tYXliZV91bnVzZWQgYXMsCisJCSAgdW53X2N1cnNvcl90IF9fbWF5YmVfdW51c2VkICpjdSwKKwkJICB2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCit7CisJcHJfZXJyKCJ1bndpbmQ6IHJlc3VtZSB1bnN1cHBvcnRlZFxuIik7CisJcmV0dXJuIC1VTldfRUlOVkFMOworfQorCitzdGF0aWMgaW50CitnZXRfcHJvY19uYW1lKHVud19hZGRyX3NwYWNlX3QgX19tYXliZV91bnVzZWQgYXMsCisJICAgICAgdW53X3dvcmRfdCBfX21heWJlX3VudXNlZCBhZGRyLAorCQljaGFyIF9fbWF5YmVfdW51c2VkICpidWZwLCBzaXplX3QgX19tYXliZV91bnVzZWQgYnVmX2xlbiwKKwkJdW53X3dvcmRfdCBfX21heWJlX3VudXNlZCAqb2ZmcCwgdm9pZCBfX21heWJlX3VudXNlZCAqYXJnKQoreworCXByX2VycigidW53aW5kOiBnZXRfcHJvY19uYW1lIHVuc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gLVVOV19FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYWNjZXNzX2Rzb19tZW0oc3RydWN0IHVud2luZF9pbmZvICp1aSwgdW53X3dvcmRfdCBhZGRyLAorCQkJICB1bndfd29yZF90ICpkYXRhKQoreworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCXNzaXplX3Qgc2l6ZTsKKworCXRocmVhZF9fZmluZF9hZGRyX21hcCh1aS0+dGhyZWFkLCB1aS0+bWFjaGluZSwgUEVSRl9SRUNPUkRfTUlTQ19VU0VSLAorCQkJICAgICAgTUFQX19GVU5DVElPTiwgYWRkciwgJmFsKTsKKwlpZiAoIWFsLm1hcCkgeworCQlwcl9kZWJ1ZygidW53aW5kOiBubyBtYXAgZm9yICVseFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIWFsLm1hcC0+ZHNvKQorCQlyZXR1cm4gLTE7CisKKwlzaXplID0gZHNvX19kYXRhX3JlYWRfYWRkcihhbC5tYXAtPmRzbywgYWwubWFwLCB1aS0+bWFjaGluZSwKKwkJCQkgICBhZGRyLCAodTggKikgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisKKwlyZXR1cm4gIShzaXplID09IHNpemVvZigqZGF0YSkpOworfQorCitzdGF0aWMgaW50IGFjY2Vzc19tZW0odW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJICAgICAgdW53X3dvcmRfdCBhZGRyLCB1bndfd29yZF90ICp2YWxwLAorCQkgICAgICBpbnQgX193cml0ZSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7CisJc3RydWN0IHN0YWNrX2R1bXAgKnN0YWNrID0gJnVpLT5zYW1wbGUtPnVzZXJfc3RhY2s7CisJdTY0IHN0YXJ0LCBlbmQ7CisJaW50IG9mZnNldDsKKwlpbnQgcmV0OworCisJLyogRG9uJ3Qgc3VwcG9ydCB3cml0ZSwgcHJvYmFibHkgbm90IG5lZWRlZC4gKi8KKwlpZiAoX193cml0ZSB8fCAhc3RhY2sgfHwgIXVpLT5zYW1wbGUtPnVzZXJfcmVncy5yZWdzKSB7CisJCSp2YWxwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gcGVyZl9yZWdfdmFsdWUoJnN0YXJ0LCAmdWktPnNhbXBsZS0+dXNlcl9yZWdzLCBQRVJGX1JFR19TUCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWVuZCA9IHN0YXJ0ICsgc3RhY2stPnNpemU7CisKKwkvKiBDaGVjayBvdmVyZmxvdy4gKi8KKwlpZiAoYWRkciArIHNpemVvZih1bndfd29yZF90KSA8IGFkZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkZHIgPCBzdGFydCB8fCBhZGRyICsgc2l6ZW9mKHVud193b3JkX3QpID49IGVuZCkgeworCQlyZXQgPSBhY2Nlc3NfZHNvX21lbSh1aSwgYWRkciwgdmFscCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2RlYnVnKCJ1bndpbmQ6IGFjY2Vzc19tZW0gJXAgbm90IGluc2lkZSByYW5nZSIKKwkJCQkgIiAweCUiIFBSSXg2NCAiLTB4JSIgUFJJeDY0ICJcbiIsCisJCQkJICh2b2lkICopIGFkZHIsIHN0YXJ0LCBlbmQpOworCQkJKnZhbHAgPSAwOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlvZmZzZXQgPSBhZGRyIC0gc3RhcnQ7CisJKnZhbHAgID0gKih1bndfd29yZF90ICopJnN0YWNrLT5kYXRhW29mZnNldF07CisJcHJfZGVidWcoInVud2luZDogYWNjZXNzX21lbSBhZGRyICVwIHZhbCAlbHgsIG9mZnNldCAlZFxuIiwKKwkJICh2b2lkICopIGFkZHIsICh1bnNpZ25lZCBsb25nKSp2YWxwLCBvZmZzZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjY2Vzc19yZWcodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKKwkJICAgICAgdW53X3JlZ251bV90IHJlZ251bSwgdW53X3dvcmRfdCAqdmFscCwKKwkJICAgICAgaW50IF9fd3JpdGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOworCWludCBpZCwgcmV0OworCXU2NCB2YWw7CisKKwkvKiBEb24ndCBzdXBwb3J0IHdyaXRlLCBJIHN1c3BlY3Qgd2UgZG9uJ3QgbmVlZCBpdC4gKi8KKwlpZiAoX193cml0ZSkgeworCQlwcl9lcnIoInVud2luZDogYWNjZXNzX3JlZyB3ICVkXG4iLCByZWdudW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXVpLT5zYW1wbGUtPnVzZXJfcmVncy5yZWdzKSB7CisJCSp2YWxwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWQgPSBsaWJ1bndpbmRfX2FyY2hfcmVnX2lkKHJlZ251bSk7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBwZXJmX3JlZ192YWx1ZSgmdmFsLCAmdWktPnNhbXBsZS0+dXNlcl9yZWdzLCBpZCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInVud2luZDogY2FuJ3QgcmVhZCByZWcgJWRcbiIsIHJlZ251bSk7CisJCXJldHVybiByZXQ7CisJfQorCisJKnZhbHAgPSAodW53X3dvcmRfdCkgdmFsOworCXByX2RlYnVnKCJ1bndpbmQ6IHJlZyAlZCwgdmFsICVseFxuIiwgcmVnbnVtLCAodW5zaWduZWQgbG9uZykqdmFscCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF91bndpbmRfaW5mbyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAorCQkJICAgIHVud19wcm9jX2luZm9fdCAqcGkgX19tYXliZV91bnVzZWQsCisJCQkgICAgdm9pZCAqYXJnIF9fbWF5YmVfdW51c2VkKQoreworCXByX2RlYnVnKCJ1bndpbmQ6IHB1dF91bndpbmRfaW5mbyBjYWxsZWRcbiIpOworfQorCitzdGF0aWMgaW50IGVudHJ5KHU2NCBpcCwgc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJIHVud2luZF9lbnRyeV9jYl90IGNiLCB2b2lkICphcmcpCit7CisJc3RydWN0IHVud2luZF9lbnRyeSBlOworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCisJdGhyZWFkX19maW5kX2FkZHJfbG9jYXRpb24odGhyZWFkLCBtYWNoaW5lLAorCQkJCSAgIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKKwkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKKworCWUuaXAgPSBpcDsKKwllLm1hcCA9IGFsLm1hcDsKKwllLnN5bSA9IGFsLnN5bTsKKworCXByX2RlYnVnKCJ1bndpbmQ6ICVzOmlwID0gMHglIiBQUkl4NjQgIiAoMHglIiBQUkl4NjQgIilcbiIsCisJCSBhbC5zeW0gPyBhbC5zeW0tPm5hbWUgOiAiJyciLAorCQkgaXAsCisJCSBhbC5tYXAgPyBhbC5tYXAtPm1hcF9pcChhbC5tYXAsIGlwKSA6ICh1NjQpIDApOworCisJcmV0dXJuIGNiKCZlLCBhcmcpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2Vycm9yKGludCBlcnIpCit7CisJc3dpdGNoIChlcnIpIHsKKwljYXNlIFVOV19FSU5WQUw6CisJCXByX2VycigidW53aW5kOiBPbmx5IHN1cHBvcnRzIGxvY2FsLlxuIik7CisJCWJyZWFrOworCWNhc2UgVU5XX0VVTlNQRUM6CisJCXByX2VycigidW53aW5kOiBVbnNwZWNpZmllZCBlcnJvci5cbiIpOworCQlicmVhazsKKwljYXNlIFVOV19FQkFEUkVHOgorCQlwcl9lcnIoInVud2luZDogUmVnaXN0ZXIgdW5hdmFpbGFibGUuXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdW53X2FjY2Vzc29yc190IGFjY2Vzc29ycyA9IHsKKwkuZmluZF9wcm9jX2luZm8JCT0gZmluZF9wcm9jX2luZm8sCisJLnB1dF91bndpbmRfaW5mbwk9IHB1dF91bndpbmRfaW5mbywKKwkuZ2V0X2R5bl9pbmZvX2xpc3RfYWRkcgk9IGdldF9keW5faW5mb19saXN0X2FkZHIsCisJLmFjY2Vzc19tZW0JCT0gYWNjZXNzX21lbSwKKwkuYWNjZXNzX3JlZwkJPSBhY2Nlc3NfcmVnLAorCS5hY2Nlc3NfZnByZWcJCT0gYWNjZXNzX2ZwcmVnLAorCS5yZXN1bWUJCQk9IHJlc3VtZSwKKwkuZ2V0X3Byb2NfbmFtZQkJPSBnZXRfcHJvY19uYW1lLAorfTsKKworc3RhdGljIGludCBnZXRfZW50cmllcyhzdHJ1Y3QgdW53aW5kX2luZm8gKnVpLCB1bndpbmRfZW50cnlfY2JfdCBjYiwKKwkJICAgICAgIHZvaWQgKmFyZywgaW50IG1heF9zdGFjaykKK3sKKwl1bndfYWRkcl9zcGFjZV90IGFkZHJfc3BhY2U7CisJdW53X2N1cnNvcl90IGM7CisJaW50IHJldDsKKworCWFkZHJfc3BhY2UgPSB1bndfY3JlYXRlX2FkZHJfc3BhY2UoJmFjY2Vzc29ycywgMCk7CisJaWYgKCFhZGRyX3NwYWNlKSB7CisJCXByX2VycigidW53aW5kOiBDYW4ndCBjcmVhdGUgdW53aW5kIGFkZHJlc3Mgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gdW53X2luaXRfcmVtb3RlKCZjLCBhZGRyX3NwYWNlLCB1aSk7CisJaWYgKHJldCkKKwkJZGlzcGxheV9lcnJvcihyZXQpOworCisJd2hpbGUgKCFyZXQgJiYgKHVud19zdGVwKCZjKSA+IDApICYmIG1heF9zdGFjay0tKSB7CisJCXVud193b3JkX3QgaXA7CisKKwkJdW53X2dldF9yZWcoJmMsIFVOV19SRUdfSVAsICZpcCk7CisJCXJldCA9IGlwID8gZW50cnkoaXAsIHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLCBjYiwgYXJnKSA6IDA7CisJfQorCisJdW53X2Rlc3Ryb3lfYWRkcl9zcGFjZShhZGRyX3NwYWNlKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAorCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKKwkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSwgaW50IG1heF9zdGFjaykKK3sKKwl1NjQgaXA7CisJc3RydWN0IHVud2luZF9pbmZvIHVpID0geworCQkuc2FtcGxlICAgICAgID0gZGF0YSwKKwkJLnRocmVhZCAgICAgICA9IHRocmVhZCwKKwkJLm1hY2hpbmUgICAgICA9IG1hY2hpbmUsCisJfTsKKwlpbnQgcmV0OworCisJaWYgKCFkYXRhLT51c2VyX3JlZ3MucmVncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBwZXJmX3JlZ192YWx1ZSgmaXAsICZkYXRhLT51c2VyX3JlZ3MsIFBFUkZfUkVHX0lQKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZW50cnkoaXAsIHRocmVhZCwgbWFjaGluZSwgY2IsIGFyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gLS1tYXhfc3RhY2sgPiAwID8gZ2V0X2VudHJpZXMoJnVpLCBjYiwgYXJnLCBtYXhfc3RhY2spIDogMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQuYyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyZjIzYi4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL3V0aWwvdW53aW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTkgKzAsMCBAQAotLyoKLSAqIFBvc3QgbW9ydGVtIER3YXJmIENGSSBiYXNlZCB1bndpbmRpbmcgb24gdG9wIG9mIHJlZ3MgYW5kIHN0YWNrIGR1bXBzLgotICoKLSAqIExvdHMgb2YgdGhpcyBjb2RlIGhhdmUgYmVlbiBib3Jyb3dlZCBvciBoZWF2aWx5IGluc3BpcmVkIGZyb20gcGFydHMgb2YKLSAqIHRoZSBsaWJ1bndpbmQgMC45OSBjb2RlIHdoaWNoIGFyZSAoYW1vbmdzdCBvdGhlciBjb250cmlidXRvcnMgSSBtYXkgaGF2ZQotICogZm9yZ290dGVuKToKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBIZXdsZXR0LVBhY2thcmQgQ28KLSAqCUNvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4KLSAqCi0gKiBBbmQgdGhlIGJ1Z3MgaGF2ZSBiZWVuIGFkZGVkIGJ5OgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEyLCBKaXJpIE9sc2EgPGpvbHNhQHJlZGhhdC5jb20+Ci0gKgotICovCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaWJ1bndpbmQuaD4KLSNpbmNsdWRlIDxsaWJ1bndpbmQtcHRyYWNlLmg+Ci0jaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotI2luY2x1ZGUgInBlcmZfcmVncy5oIgotI2luY2x1ZGUgInVud2luZC5oIgotI2luY2x1ZGUgInN5bWJvbC5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotZXh0ZXJuIGludAotVU5XX09CSihkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlKSAodW53X2FkZHJfc3BhY2VfdCBhcywKLQkJCQkgICAgdW53X3dvcmRfdCBpcCwKLQkJCQkgICAgdW53X2R5bl9pbmZvX3QgKmRpLAotCQkJCSAgICB1bndfcHJvY19pbmZvX3QgKnBpLAotCQkJCSAgICBpbnQgbmVlZF91bndpbmRfaW5mbywgdm9pZCAqYXJnKTsKLQotI2RlZmluZSBkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlIFVOV19PQkooZHdhcmZfc2VhcmNoX3Vud2luZF90YWJsZSkKLQotZXh0ZXJuIGludAotVU5XX09CSihkd2FyZl9maW5kX2RlYnVnX2ZyYW1lKSAoaW50IGZvdW5kLCB1bndfZHluX2luZm9fdCAqZGlfZGVidWcsCi0JCQkJIHVud193b3JkX3QgaXAsCi0JCQkJIHVud193b3JkX3Qgc2VnYmFzZSwKLQkJCQkgY29uc3QgY2hhciAqb2JqX25hbWUsIHVud193b3JkX3Qgc3RhcnQsCi0JCQkJIHVud193b3JkX3QgZW5kKTsKLQotI2RlZmluZSBkd2FyZl9maW5kX2RlYnVnX2ZyYW1lIFVOV19PQkooZHdhcmZfZmluZF9kZWJ1Z19mcmFtZSkKLQotI2RlZmluZSBEV19FSF9QRV9GT1JNQVRfTUFTSwkweDBmCS8qIGZvcm1hdCBvZiB0aGUgZW5jb2RlZCB2YWx1ZSAqLwotI2RlZmluZSBEV19FSF9QRV9BUFBMX01BU0sJMHg3MAkvKiBob3cgdGhlIHZhbHVlIGlzIHRvIGJlIGFwcGxpZWQgKi8KLQotLyogUG9pbnRlci1lbmNvZGluZyBmb3JtYXRzOiAqLwotI2RlZmluZSBEV19FSF9QRV9vbWl0CQkweGZmCi0jZGVmaW5lIERXX0VIX1BFX3B0cgkJMHgwMAkvKiBwb2ludGVyLXNpemVkIHVuc2lnbmVkIHZhbHVlICovCi0jZGVmaW5lIERXX0VIX1BFX3VkYXRhNAkJMHgwMwkvKiB1bnNpZ25lZCAzMi1iaXQgdmFsdWUgKi8KLSNkZWZpbmUgRFdfRUhfUEVfdWRhdGE4CQkweDA0CS8qIHVuc2lnbmVkIDY0LWJpdCB2YWx1ZSAqLwotI2RlZmluZSBEV19FSF9QRV9zZGF0YTQJCTB4MGIJLyogc2lnbmVkIDMyLWJpdCB2YWx1ZSAqLwotI2RlZmluZSBEV19FSF9QRV9zZGF0YTgJCTB4MGMJLyogc2lnbmVkIDY0LWJpdCB2YWx1ZSAqLwotCi0vKiBQb2ludGVyLWVuY29kaW5nIGFwcGxpY2F0aW9uOiAqLwotI2RlZmluZSBEV19FSF9QRV9hYnNwdHIJCTB4MDAJLyogYWJzb2x1dGUgdmFsdWUgKi8KLSNkZWZpbmUgRFdfRUhfUEVfcGNyZWwJCTB4MTAJLyogcmVsLiB0byBhZGRyLiBvZiBlbmNvZGVkIHZhbHVlICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGFyZSBub3QgZG9jdW1lbnRlZCBieSBMU0IgdjEuMywgeWV0IHRoZXkgYXJlIHVzZWQgYnkKLSAqIEdDQywgcHJlc3VtYWJseSB0aGV5IGFyZW4ndCBkb2N1bWVudGVkIGJ5IExTQiBzaW5jZSB0aGV5IGFyZW4ndAotICogdXNlZCBvbiBMaW51eDoKLSAqLwotI2RlZmluZSBEV19FSF9QRV9mdW5jcmVsCTB4NDAJLyogc3RhcnQtb2YtcHJvY2VkdXJlLXJlbGF0aXZlICovCi0jZGVmaW5lIERXX0VIX1BFX2FsaWduZWQJMHg1MAkvKiBhbGlnbmVkIHBvaW50ZXIgKi8KLQotLyogRmxhZ3MgaW50ZW50aW9uYWx5IG5vdCBoYW5kbGVkLCBzaW5jZSB0aGV5J3JlIG5vdCBuZWVkZWQ6Ci0gKiAjZGVmaW5lIERXX0VIX1BFX2luZGlyZWN0ICAgICAgMHg4MAotICogI2RlZmluZSBEV19FSF9QRV91bGViMTI4ICAgICAgIDB4MDEKLSAqICNkZWZpbmUgRFdfRUhfUEVfdWRhdGEyICAgICAgICAweDAyCi0gKiAjZGVmaW5lIERXX0VIX1BFX3NsZWIxMjggICAgICAgMHgwOQotICogI2RlZmluZSBEV19FSF9QRV9zZGF0YTIgICAgICAgIDB4MGEKLSAqICNkZWZpbmUgRFdfRUhfUEVfdGV4dHJlbCAgICAgICAweDIwCi0gKiAjZGVmaW5lIERXX0VIX1BFX2RhdGFyZWwgICAgICAgMHgzMAotICovCi0KLXN0cnVjdCB1bndpbmRfaW5mbyB7Ci0Jc3RydWN0IHBlcmZfc2FtcGxlCSpzYW1wbGU7Ci0Jc3RydWN0IG1hY2hpbmUJCSptYWNoaW5lOwotCXN0cnVjdCB0aHJlYWQJCSp0aHJlYWQ7Ci0JdTY0CQkJc2FtcGxlX3VyZWdzOwotfTsKLQotI2RlZmluZSBkd19yZWFkKHB0ciwgdHlwZSwgZW5kKSAoewlcCi0JdHlwZSAqX19wID0gKHR5cGUgKikgcHRyOwlcCi0JdHlwZSAgX192OwkJCVwKLQlpZiAoKF9fcCArIDEpID4gKHR5cGUgKikgZW5kKQlcCi0JCXJldHVybiAtRUlOVkFMOwkJXAotCV9fdiA9ICpfX3ArKzsJCQlcCi0JcHRyID0gKHR5cGVvZihwdHIpKSBfX3A7CVwKLQlfX3Y7CQkJCVwKLQl9KQotCi1zdGF0aWMgaW50IF9fZHdfcmVhZF9lbmNvZGVkX3ZhbHVlKHU4ICoqcCwgdTggKmVuZCwgdTY0ICp2YWwsCi0JCQkJICAgdTggZW5jb2RpbmcpCi17Ci0JdTggKmN1ciA9ICpwOwotCSp2YWwgPSAwOwotCi0Jc3dpdGNoIChlbmNvZGluZykgewotCWNhc2UgRFdfRUhfUEVfb21pdDoKLQkJKnZhbCA9IDA7Ci0JCWdvdG8gb3V0OwotCWNhc2UgRFdfRUhfUEVfcHRyOgotCQkqdmFsID0gZHdfcmVhZChjdXIsIHVuc2lnbmVkIGxvbmcsIGVuZCk7Ci0JCWdvdG8gb3V0OwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoZW5jb2RpbmcgJiBEV19FSF9QRV9BUFBMX01BU0spIHsKLQljYXNlIERXX0VIX1BFX2Fic3B0cjoKLQkJYnJlYWs7Ci0JY2FzZSBEV19FSF9QRV9wY3JlbDoKLQkJKnZhbCA9ICh1bnNpZ25lZCBsb25nKSBjdXI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICgoZW5jb2RpbmcgJiAweDA3KSA9PSAweDAwKQotCQllbmNvZGluZyB8PSBEV19FSF9QRV91ZGF0YTQ7Ci0KLQlzd2l0Y2ggKGVuY29kaW5nICYgRFdfRUhfUEVfRk9STUFUX01BU0spIHsKLQljYXNlIERXX0VIX1BFX3NkYXRhNDoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgczMyLCBlbmQpOwotCQlicmVhazsKLQljYXNlIERXX0VIX1BFX3VkYXRhNDoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgdTMyLCBlbmQpOwotCQlicmVhazsKLQljYXNlIERXX0VIX1BFX3NkYXRhODoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgczY0LCBlbmQpOwotCQlicmVhazsKLQljYXNlIERXX0VIX1BFX3VkYXRhODoKLQkJKnZhbCArPSBkd19yZWFkKGN1ciwgdTY0LCBlbmQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLSBvdXQ6Ci0JKnAgPSBjdXI7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgZHdfcmVhZF9lbmNvZGVkX3ZhbHVlKHB0ciwgZW5kLCBlbmMpICh7CQkJXAotCXU2NCBfX3Y7CQkJCQkJXAotCWlmIChfX2R3X3JlYWRfZW5jb2RlZF92YWx1ZSgmcHRyLCBlbmQsICZfX3YsIGVuYykpIHsJXAotCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX192OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSkKLQotc3RhdGljIHU2NCBlbGZfc2VjdGlvbl9vZmZzZXQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lKQotewotCUVsZiAqZWxmOwotCUdFbGZfRWhkciBlaGRyOwotCUdFbGZfU2hkciBzaGRyOwotCXU2NCBvZmZzZXQgPSAwOwotCi0JZWxmID0gZWxmX2JlZ2luKGZkLCBQRVJGX0VMRl9DX1JFQURfTU1BUCwgTlVMTCk7Ci0JaWYgKGVsZiA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCWRvIHsKLQkJaWYgKGdlbGZfZ2V0ZWhkcihlbGYsICZlaGRyKSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJaWYgKCFlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgJmVoZHIsICZzaGRyLCBuYW1lLCBOVUxMKSkKLQkJCWJyZWFrOwotCi0JCW9mZnNldCA9IHNoZHIuc2hfb2Zmc2V0OwotCX0gd2hpbGUgKDApOwotCi0JZWxmX2VuZChlbGYpOwotCXJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0cnVjdCB0YWJsZV9lbnRyeSB7Ci0JdTMyIHN0YXJ0X2lwX29mZnNldDsKLQl1MzIgZmRlX29mZnNldDsKLX07Ci0KLXN0cnVjdCBlaF9mcmFtZV9oZHIgewotCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsKLQl1bnNpZ25lZCBjaGFyIGVoX2ZyYW1lX3B0cl9lbmM7Ci0JdW5zaWduZWQgY2hhciBmZGVfY291bnRfZW5jOwotCXVuc2lnbmVkIGNoYXIgdGFibGVfZW5jOwotCi0JLyoKLQkgKiBUaGUgcmVzdCBvZiB0aGUgaGVhZGVyIGlzIHZhcmlhYmxlLWxlbmd0aCBhbmQgY29uc2lzdHMgb2YgdGhlCi0JICogZm9sbG93aW5nIG1lbWJlcnM6Ci0JICoKLQkgKgllbmNvZGVkX3QgZWhfZnJhbWVfcHRyOwotCSAqCWVuY29kZWRfdCBmZGVfY291bnQ7Ci0JICovCi0KLQkvKiBBIHNpbmdsZSBlbmNvZGVkIHBvaW50ZXIgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gOCBieXRlcy4gKi8KLQl1NjQgZW5jWzJdOwotCi0JLyoKLQkgKiBzdHJ1Y3QgewotCSAqICAgIGVuY29kZWRfdCBzdGFydF9pcDsKLQkgKiAgICBlbmNvZGVkX3QgZmRlX2FkZHI7Ci0JICogfSBiaW5hcnlfc2VhcmNoX3RhYmxlW2ZkZV9jb3VudF07Ci0JICovCi0JY2hhciBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotc3RhdGljIGludCB1bndpbmRfc3BlY19laGZyYW1lKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCi0JCQkgICAgICAgdTY0IG9mZnNldCwgdTY0ICp0YWJsZV9kYXRhLCB1NjQgKnNlZ2Jhc2UsCi0JCQkgICAgICAgdTY0ICpmZGVfY291bnQpCi17Ci0Jc3RydWN0IGVoX2ZyYW1lX2hkciBoZHI7Ci0JdTggKmVuYyA9ICh1OCAqKSAmaGRyLmVuYzsKLQl1OCAqZW5kID0gKHU4ICopICZoZHIuZGF0YTsKLQlzc2l6ZV90IHI7Ci0KLQlyID0gZHNvX19kYXRhX3JlYWRfb2Zmc2V0KGRzbywgbWFjaGluZSwgb2Zmc2V0LAotCQkJCSAgKHU4ICopICZoZHIsIHNpemVvZihoZHIpKTsKLQlpZiAociAhPSBzaXplb2YoaGRyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBXZSBkb250IG5lZWQgZWhfZnJhbWVfcHRyLCBqdXN0IHNraXAgaXQuICovCi0JZHdfcmVhZF9lbmNvZGVkX3ZhbHVlKGVuYywgZW5kLCBoZHIuZWhfZnJhbWVfcHRyX2VuYyk7Ci0KLQkqZmRlX2NvdW50ICA9IGR3X3JlYWRfZW5jb2RlZF92YWx1ZShlbmMsIGVuZCwgaGRyLmZkZV9jb3VudF9lbmMpOwotCSpzZWdiYXNlICAgID0gb2Zmc2V0OwotCSp0YWJsZV9kYXRhID0gKGVuYyAtICh1OCAqKSAmaGRyKSArIG9mZnNldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX3Vud2luZF9zcGVjX2VoX2ZyYW1lKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCi0JCQkJICAgICB1NjQgKnRhYmxlX2RhdGEsIHU2NCAqc2VnYmFzZSwKLQkJCQkgICAgIHU2NCAqZmRlX2NvdW50KQotewotCWludCByZXQgPSAtRUlOVkFMLCBmZDsKLQl1NjQgb2Zmc2V0OwotCi0JZmQgPSBkc29fX2RhdGFfZmQoZHNvLCBtYWNoaW5lKTsKLQlpZiAoZmQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIENoZWNrIHRoZSAuZWhfZnJhbWUgc2VjdGlvbiBmb3IgdW53aW5kaW5nIGluZm8gKi8KLQlvZmZzZXQgPSBlbGZfc2VjdGlvbl9vZmZzZXQoZmQsICIuZWhfZnJhbWVfaGRyIik7Ci0JY2xvc2UoZmQpOwotCi0JaWYgKG9mZnNldCkKLQkJcmV0ID0gdW53aW5kX3NwZWNfZWhmcmFtZShkc28sIG1hY2hpbmUsIG9mZnNldCwKLQkJCQkJICB0YWJsZV9kYXRhLCBzZWdiYXNlLAotCQkJCQkgIGZkZV9jb3VudCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jaWZuZGVmIE5PX0xJQlVOV0lORF9ERUJVR19GUkFNRQotc3RhdGljIGludCByZWFkX3Vud2luZF9zcGVjX2RlYnVnX2ZyYW1lKHN0cnVjdCBkc28gKmRzbywKLQkJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHU2NCAqb2Zmc2V0KQotewotCWludCBmZCA9IGRzb19fZGF0YV9mZChkc28sIG1hY2hpbmUpOwotCi0JaWYgKGZkIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBDaGVjayB0aGUgLmRlYnVnX2ZyYW1lIHNlY3Rpb24gZm9yIHVud2luZGluZyBpbmZvICovCi0JKm9mZnNldCA9IGVsZl9zZWN0aW9uX29mZnNldChmZCwgIi5kZWJ1Z19mcmFtZSIpOwotCWNsb3NlKGZkKTsKLQotCWlmICgqb2Zmc2V0KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwICpmaW5kX21hcCh1bndfd29yZF90IGlwLCBzdHJ1Y3QgdW53aW5kX2luZm8gKnVpKQotewotCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOwotCi0JdGhyZWFkX19maW5kX2FkZHJfbWFwKHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLCBQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCi0JCQkgICAgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKLQlyZXR1cm4gYWwubWFwOwotfQotCi1zdGF0aWMgaW50Ci1maW5kX3Byb2NfaW5mbyh1bndfYWRkcl9zcGFjZV90IGFzLCB1bndfd29yZF90IGlwLCB1bndfcHJvY19pbmZvX3QgKnBpLAotCSAgICAgICBpbnQgbmVlZF91bndpbmRfaW5mbywgdm9pZCAqYXJnKQotewotCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7Ci0Jc3RydWN0IG1hcCAqbWFwOwotCXVud19keW5faW5mb190IGRpOwotCXU2NCB0YWJsZV9kYXRhLCBzZWdiYXNlLCBmZGVfY291bnQ7Ci0KLQltYXAgPSBmaW5kX21hcChpcCwgdWkpOwotCWlmICghbWFwIHx8ICFtYXAtPmRzbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcl9kZWJ1ZygidW53aW5kOiBmaW5kX3Byb2NfaW5mbyBkc28gJXNcbiIsIG1hcC0+ZHNvLT5uYW1lKTsKLQotCS8qIENoZWNrIHRoZSAuZWhfZnJhbWUgc2VjdGlvbiBmb3IgdW53aW5kaW5nIGluZm8gKi8KLQlpZiAoIXJlYWRfdW53aW5kX3NwZWNfZWhfZnJhbWUobWFwLT5kc28sIHVpLT5tYWNoaW5lLAotCQkJCSAgICAgICAmdGFibGVfZGF0YSwgJnNlZ2Jhc2UsICZmZGVfY291bnQpKSB7Ci0JCW1lbXNldCgmZGksIDAsIHNpemVvZihkaSkpOwotCQlkaS5mb3JtYXQgICA9IFVOV19JTkZPX0ZPUk1BVF9SRU1PVEVfVEFCTEU7Ci0JCWRpLnN0YXJ0X2lwID0gbWFwLT5zdGFydDsKLQkJZGkuZW5kX2lwICAgPSBtYXAtPmVuZDsKLQkJZGkudS5ydGkuc2VnYmFzZSAgICA9IG1hcC0+c3RhcnQgKyBzZWdiYXNlOwotCQlkaS51LnJ0aS50YWJsZV9kYXRhID0gbWFwLT5zdGFydCArIHRhYmxlX2RhdGE7Ci0JCWRpLnUucnRpLnRhYmxlX2xlbiAgPSBmZGVfY291bnQgKiBzaXplb2Yoc3RydWN0IHRhYmxlX2VudHJ5KQotCQkJCSAgICAgIC8gc2l6ZW9mKHVud193b3JkX3QpOwotCQlyZXR1cm4gZHdhcmZfc2VhcmNoX3Vud2luZF90YWJsZShhcywgaXAsICZkaSwgcGksCi0JCQkJCQkgbmVlZF91bndpbmRfaW5mbywgYXJnKTsKLQl9Ci0KLSNpZm5kZWYgTk9fTElCVU5XSU5EX0RFQlVHX0ZSQU1FCi0JLyogQ2hlY2sgdGhlIC5kZWJ1Z19mcmFtZSBzZWN0aW9uIGZvciB1bndpbmRpbmcgaW5mbyAqLwotCWlmICghcmVhZF91bndpbmRfc3BlY19kZWJ1Z19mcmFtZShtYXAtPmRzbywgdWktPm1hY2hpbmUsICZzZWdiYXNlKSkgewotCQltZW1zZXQoJmRpLCAwLCBzaXplb2YoZGkpKTsKLQkJaWYgKGR3YXJmX2ZpbmRfZGVidWdfZnJhbWUoMCwgJmRpLCBpcCwgMCwgbWFwLT5kc28tPm5hbWUsCi0JCQkJCSAgIG1hcC0+c3RhcnQsIG1hcC0+ZW5kKSkKLQkJCXJldHVybiBkd2FyZl9zZWFyY2hfdW53aW5kX3RhYmxlKGFzLCBpcCwgJmRpLCBwaSwKLQkJCQkJCQkgbmVlZF91bndpbmRfaW5mbywgYXJnKTsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGFjY2Vzc19mcHJlZyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkJdW53X3JlZ251bV90IF9fbWF5YmVfdW51c2VkIG51bSwKLQkJCXVud19mcHJlZ190IF9fbWF5YmVfdW51c2VkICp2YWwsCi0JCQlpbnQgX19tYXliZV91bnVzZWQgX193cml0ZSwKLQkJCXZvaWQgX19tYXliZV91bnVzZWQgKmFyZykKLXsKLQlwcl9lcnIoInVud2luZDogYWNjZXNzX2ZwcmVnIHVuc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLVVOV19FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2R5bl9pbmZvX2xpc3RfYWRkcih1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkJCSAgdW53X3dvcmRfdCBfX21heWJlX3VudXNlZCAqZGlsX2FkZHIsCi0JCQkJICB2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCi17Ci0JcmV0dXJuIC1VTldfRU5PSU5GTzsKLX0KLQotc3RhdGljIGludCByZXN1bWUodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKLQkJICB1bndfY3Vyc29yX3QgX19tYXliZV91bnVzZWQgKmN1LAotCQkgIHZvaWQgX19tYXliZV91bnVzZWQgKmFyZykKLXsKLQlwcl9lcnIoInVud2luZDogcmVzdW1lIHVuc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLVVOV19FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9wcm9jX25hbWUodW53X2FkZHJfc3BhY2VfdCBfX21heWJlX3VudXNlZCBhcywKLQkgICAgICB1bndfd29yZF90IF9fbWF5YmVfdW51c2VkIGFkZHIsCi0JCWNoYXIgX19tYXliZV91bnVzZWQgKmJ1ZnAsIHNpemVfdCBfX21heWJlX3VudXNlZCBidWZfbGVuLAotCQl1bndfd29yZF90IF9fbWF5YmVfdW51c2VkICpvZmZwLCB2b2lkIF9fbWF5YmVfdW51c2VkICphcmcpCi17Ci0JcHJfZXJyKCJ1bndpbmQ6IGdldF9wcm9jX25hbWUgdW5zdXBwb3J0ZWRcbiIpOwotCXJldHVybiAtVU5XX0VJTlZBTDsKLX0KLQotc3RhdGljIGludCBhY2Nlc3NfZHNvX21lbShzdHJ1Y3QgdW53aW5kX2luZm8gKnVpLCB1bndfd29yZF90IGFkZHIsCi0JCQkgIHVud193b3JkX3QgKmRhdGEpCi17Ci0Jc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7Ci0Jc3NpemVfdCBzaXplOwotCi0JdGhyZWFkX19maW5kX2FkZHJfbWFwKHVpLT50aHJlYWQsIHVpLT5tYWNoaW5lLCBQRVJGX1JFQ09SRF9NSVNDX1VTRVIsCi0JCQkgICAgICBNQVBfX0ZVTkNUSU9OLCBhZGRyLCAmYWwpOwotCWlmICghYWwubWFwKSB7Ci0JCXByX2RlYnVnKCJ1bndpbmQ6IG5vIG1hcCBmb3IgJWx4XG4iLCAodW5zaWduZWQgbG9uZylhZGRyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICghYWwubWFwLT5kc28pCi0JCXJldHVybiAtMTsKLQotCXNpemUgPSBkc29fX2RhdGFfcmVhZF9hZGRyKGFsLm1hcC0+ZHNvLCBhbC5tYXAsIHVpLT5tYWNoaW5lLAotCQkJCSAgIGFkZHIsICh1OCAqKSBkYXRhLCBzaXplb2YoKmRhdGEpKTsKLQotCXJldHVybiAhKHNpemUgPT0gc2l6ZW9mKCpkYXRhKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX3ZhbHVlKHVud193b3JkX3QgKnZhbHAsIHN0cnVjdCByZWdzX2R1bXAgKnJlZ3MsIGludCBpZCwKLQkJICAgICB1NjQgc2FtcGxlX3JlZ3MpCi17Ci0JaW50IGksIGlkeCA9IDA7Ci0KLQlpZiAoIShzYW1wbGVfcmVncyAmICgxIDw8IGlkKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IGlkOyBpKyspIHsKLQkJaWYgKHNhbXBsZV9yZWdzICYgKDEgPDwgaSkpCi0JCQlpZHgrKzsKLQl9Ci0KLQkqdmFscCA9IHJlZ3MtPnJlZ3NbaWR4XTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhY2Nlc3NfbWVtKHVud19hZGRyX3NwYWNlX3QgX19tYXliZV91bnVzZWQgYXMsCi0JCSAgICAgIHVud193b3JkX3QgYWRkciwgdW53X3dvcmRfdCAqdmFscCwKLQkJICAgICAgaW50IF9fd3JpdGUsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdW53aW5kX2luZm8gKnVpID0gYXJnOwotCXN0cnVjdCBzdGFja19kdW1wICpzdGFjayA9ICZ1aS0+c2FtcGxlLT51c2VyX3N0YWNrOwotCXVud193b3JkX3Qgc3RhcnQsIGVuZDsKLQlpbnQgb2Zmc2V0OwotCWludCByZXQ7Ci0KLQkvKiBEb24ndCBzdXBwb3J0IHdyaXRlLCBwcm9iYWJseSBub3QgbmVlZGVkLiAqLwotCWlmIChfX3dyaXRlIHx8ICFzdGFjayB8fCAhdWktPnNhbXBsZS0+dXNlcl9yZWdzLnJlZ3MpIHsKLQkJKnZhbHAgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXQgPSByZWdfdmFsdWUoJnN0YXJ0LCAmdWktPnNhbXBsZS0+dXNlcl9yZWdzLCBQRVJGX1JFR19TUCwKLQkJCXVpLT5zYW1wbGVfdXJlZ3MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQllbmQgPSBzdGFydCArIHN0YWNrLT5zaXplOwotCi0JLyogQ2hlY2sgb3ZlcmZsb3cuICovCi0JaWYgKGFkZHIgKyBzaXplb2YodW53X3dvcmRfdCkgPCBhZGRyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhZGRyIDwgc3RhcnQgfHwgYWRkciArIHNpemVvZih1bndfd29yZF90KSA+PSBlbmQpIHsKLQkJcmV0ID0gYWNjZXNzX2Rzb19tZW0odWksIGFkZHIsIHZhbHApOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9kZWJ1ZygidW53aW5kOiBhY2Nlc3NfbWVtICVwIG5vdCBpbnNpZGUgcmFuZ2UgJXAtJXBcbiIsCi0JCQkJKHZvaWQgKilhZGRyLCAodm9pZCAqKXN0YXJ0LCAodm9pZCAqKWVuZCk7Ci0JCQkqdmFscCA9IDA7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCW9mZnNldCA9IGFkZHIgLSBzdGFydDsKLQkqdmFscCAgPSAqKHVud193b3JkX3QgKikmc3RhY2stPmRhdGFbb2Zmc2V0XTsKLQlwcl9kZWJ1ZygidW53aW5kOiBhY2Nlc3NfbWVtIGFkZHIgJXAsIHZhbCAlbHgsIG9mZnNldCAlZFxuIiwKLQkJICh2b2lkICopYWRkciwgKHVuc2lnbmVkIGxvbmcpKnZhbHAsIG9mZnNldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWNjZXNzX3JlZyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkgICAgICB1bndfcmVnbnVtX3QgcmVnbnVtLCB1bndfd29yZF90ICp2YWxwLAotCQkgICAgICBpbnQgX193cml0ZSwgdm9pZCAqYXJnKQotewotCXN0cnVjdCB1bndpbmRfaW5mbyAqdWkgPSBhcmc7Ci0JaW50IGlkLCByZXQ7Ci0KLQkvKiBEb24ndCBzdXBwb3J0IHdyaXRlLCBJIHN1c3BlY3Qgd2UgZG9uJ3QgbmVlZCBpdC4gKi8KLQlpZiAoX193cml0ZSkgewotCQlwcl9lcnIoInVud2luZDogYWNjZXNzX3JlZyB3ICVkXG4iLCByZWdudW0pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIXVpLT5zYW1wbGUtPnVzZXJfcmVncy5yZWdzKSB7Ci0JCSp2YWxwID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWQgPSB1bndpbmRfX2FyY2hfcmVnX2lkKHJlZ251bSk7Ci0JaWYgKGlkIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSByZWdfdmFsdWUodmFscCwgJnVpLT5zYW1wbGUtPnVzZXJfcmVncywgaWQsIHVpLT5zYW1wbGVfdXJlZ3MpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJ1bndpbmQ6IGNhbid0IHJlYWQgcmVnICVkXG4iLCByZWdudW0pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByX2RlYnVnKCJ1bndpbmQ6IHJlZyAlZCwgdmFsICVseFxuIiwgcmVnbnVtLCAodW5zaWduZWQgbG9uZykqdmFscCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dF91bndpbmRfaW5mbyh1bndfYWRkcl9zcGFjZV90IF9fbWF5YmVfdW51c2VkIGFzLAotCQkJICAgIHVud19wcm9jX2luZm9fdCAqcGkgX19tYXliZV91bnVzZWQsCi0JCQkgICAgdm9pZCAqYXJnIF9fbWF5YmVfdW51c2VkKQotewotCXByX2RlYnVnKCJ1bndpbmQ6IHB1dF91bndpbmRfaW5mbyBjYWxsZWRcbiIpOwotfQotCi1zdGF0aWMgaW50IGVudHJ5KHU2NCBpcCwgc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJIHVud2luZF9lbnRyeV9jYl90IGNiLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IHVud2luZF9lbnRyeSBlOwotCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOwotCi0JdGhyZWFkX19maW5kX2FkZHJfbG9jYXRpb24odGhyZWFkLCBtYWNoaW5lLAotCQkJCSAgIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKLQkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKLQotCWUuaXAgPSBpcDsKLQllLm1hcCA9IGFsLm1hcDsKLQllLnN5bSA9IGFsLnN5bTsKLQotCXByX2RlYnVnKCJ1bndpbmQ6ICVzOmlwID0gMHglIiBQUkl4NjQgIiAoMHglIiBQUkl4NjQgIilcbiIsCi0JCSBhbC5zeW0gPyBhbC5zeW0tPm5hbWUgOiAiJyciLAotCQkgaXAsCi0JCSBhbC5tYXAgPyBhbC5tYXAtPm1hcF9pcChhbC5tYXAsIGlwKSA6ICh1NjQpIDApOwotCi0JcmV0dXJuIGNiKCZlLCBhcmcpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNwbGF5X2Vycm9yKGludCBlcnIpCi17Ci0Jc3dpdGNoIChlcnIpIHsKLQljYXNlIFVOV19FSU5WQUw6Ci0JCXByX2VycigidW53aW5kOiBPbmx5IHN1cHBvcnRzIGxvY2FsLlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgVU5XX0VVTlNQRUM6Ci0JCXByX2VycigidW53aW5kOiBVbnNwZWNpZmllZCBlcnJvci5cbiIpOwotCQlicmVhazsKLQljYXNlIFVOV19FQkFEUkVHOgotCQlwcl9lcnIoInVud2luZDogUmVnaXN0ZXIgdW5hdmFpbGFibGUuXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdW53X2FjY2Vzc29yc190IGFjY2Vzc29ycyA9IHsKLQkuZmluZF9wcm9jX2luZm8JCT0gZmluZF9wcm9jX2luZm8sCi0JLnB1dF91bndpbmRfaW5mbwk9IHB1dF91bndpbmRfaW5mbywKLQkuZ2V0X2R5bl9pbmZvX2xpc3RfYWRkcgk9IGdldF9keW5faW5mb19saXN0X2FkZHIsCi0JLmFjY2Vzc19tZW0JCT0gYWNjZXNzX21lbSwKLQkuYWNjZXNzX3JlZwkJPSBhY2Nlc3NfcmVnLAotCS5hY2Nlc3NfZnByZWcJCT0gYWNjZXNzX2ZwcmVnLAotCS5yZXN1bWUJCQk9IHJlc3VtZSwKLQkuZ2V0X3Byb2NfbmFtZQkJPSBnZXRfcHJvY19uYW1lLAotfTsKLQotc3RhdGljIGludCBnZXRfZW50cmllcyhzdHJ1Y3QgdW53aW5kX2luZm8gKnVpLCB1bndpbmRfZW50cnlfY2JfdCBjYiwKLQkJICAgICAgIHZvaWQgKmFyZywgaW50IG1heF9zdGFjaykKLXsKLQl1bndfYWRkcl9zcGFjZV90IGFkZHJfc3BhY2U7Ci0JdW53X2N1cnNvcl90IGM7Ci0JaW50IHJldDsKLQotCWFkZHJfc3BhY2UgPSB1bndfY3JlYXRlX2FkZHJfc3BhY2UoJmFjY2Vzc29ycywgMCk7Ci0JaWYgKCFhZGRyX3NwYWNlKSB7Ci0JCXByX2VycigidW53aW5kOiBDYW4ndCBjcmVhdGUgdW53aW5kIGFkZHJlc3Mgc3BhY2UuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0ID0gdW53X2luaXRfcmVtb3RlKCZjLCBhZGRyX3NwYWNlLCB1aSk7Ci0JaWYgKHJldCkKLQkJZGlzcGxheV9lcnJvcihyZXQpOwotCi0Jd2hpbGUgKCFyZXQgJiYgKHVud19zdGVwKCZjKSA+IDApICYmIG1heF9zdGFjay0tKSB7Ci0JCXVud193b3JkX3QgaXA7Ci0KLQkJdW53X2dldF9yZWcoJmMsIFVOV19SRUdfSVAsICZpcCk7Ci0JCXJldCA9IGVudHJ5KGlwLCB1aS0+dGhyZWFkLCB1aS0+bWFjaGluZSwgY2IsIGFyZyk7Ci0JfQotCi0JdW53X2Rlc3Ryb3lfYWRkcl9zcGFjZShhZGRyX3NwYWNlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAotCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKLQkJCXU2NCBzYW1wbGVfdXJlZ3MsIHN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSwKLQkJCWludCBtYXhfc3RhY2spCi17Ci0JdW53X3dvcmRfdCBpcDsKLQlzdHJ1Y3QgdW53aW5kX2luZm8gdWkgPSB7Ci0JCS5zYW1wbGUgICAgICAgPSBkYXRhLAotCQkuc2FtcGxlX3VyZWdzID0gc2FtcGxlX3VyZWdzLAotCQkudGhyZWFkICAgICAgID0gdGhyZWFkLAotCQkubWFjaGluZSAgICAgID0gbWFjaGluZSwKLQl9OwotCWludCByZXQ7Ci0KLQlpZiAoIWRhdGEtPnVzZXJfcmVncy5yZWdzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHJlZ192YWx1ZSgmaXAsICZkYXRhLT51c2VyX3JlZ3MsIFBFUkZfUkVHX0lQLCBzYW1wbGVfdXJlZ3MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBlbnRyeShpcCwgdGhyZWFkLCBtYWNoaW5lLCBjYiwgYXJnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiBnZXRfZW50cmllcygmdWksIGNiLCBhcmcsIG1heF9zdGFjayk7Ci19CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdW53aW5kLmggYi90b29scy9wZXJmL3V0aWwvdW53aW5kLmgKaW5kZXggZDU5NjZmNDkuLmIwMzEzMTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQuaAorKysgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLmgKQEAgLTEzLDI0ICsxMywyNSBAQAogCiB0eXBlZGVmIGludCAoKnVud2luZF9lbnRyeV9jYl90KShzdHJ1Y3QgdW53aW5kX2VudHJ5ICplbnRyeSwgdm9pZCAqYXJnKTsKIAotI2lmZGVmIEhBVkVfTElCVU5XSU5EX1NVUFBPUlQKKyNpZmRlZiBIQVZFX0RXQVJGX1VOV0lORF9TVVBQT1JUCiBpbnQgdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiwgdm9pZCAqYXJnLAogCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCiAJCQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCi0JCQl1NjQgc2FtcGxlX3VyZWdzLAogCQkJc3RydWN0IHBlcmZfc2FtcGxlICpkYXRhLCBpbnQgbWF4X3N0YWNrKTsKLWludCB1bndpbmRfX2FyY2hfcmVnX2lkKGludCByZWdudW0pOworLyogbGlidW53aW5kIHNwZWNpZmljICovCisjaWZkZWYgSEFWRV9MSUJVTldJTkRfU1VQUE9SVAoraW50IGxpYnVud2luZF9fYXJjaF9yZWdfaWQoaW50IHJlZ251bSk7CisjZW5kaWYKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludAogdW53aW5kX19nZXRfZW50cmllcyh1bndpbmRfZW50cnlfY2JfdCBjYiBfX21heWJlX3VudXNlZCwKIAkJICAgIHZvaWQgKmFyZyBfX21heWJlX3VudXNlZCwKIAkJICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lIF9fbWF5YmVfdW51c2VkLAogCQkgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkIF9fbWF5YmVfdW51c2VkLAotCQkgICAgdTY0IHNhbXBsZV91cmVncyBfX21heWJlX3VudXNlZCwKIAkJICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqZGF0YSBfX21heWJlX3VudXNlZCwKIAkJICAgIGludCBtYXhfc3RhY2sgX19tYXliZV91bnVzZWQpCiB7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogSEFWRV9MSUJVTldJTkRfU1VQUE9SVCAqLworI2VuZGlmIC8qIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQgKi8KICNlbmRpZiAvKiBfX1VOV0lORF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdXRpbC5jIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuYwppbmRleCA0MmFkNjY3Li45ZjY2NTQ5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdXRpbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMKQEAgLTEsNiArMSw2IEBACiAjaW5jbHVkZSAiLi4vcGVyZi5oIgogI2luY2x1ZGUgInV0aWwuaCIKLSNpbmNsdWRlICJmcy5oIgorI2luY2x1ZGUgPGFwaS9mcy9mcy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaWZkZWYgSEFWRV9CQUNLVFJBQ0VfU1VQUE9SVAogI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9NYWtlZmlsZQppbmRleCBiZDI0YWU1Li4zMTYxOTRmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKIAogZXhwb3J0IENDIENGTEFHUwogCi1UQVJHRVRTID0gcG11CitUQVJHRVRTID0gcG11IGNvcHlsb29wcwogCiBlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMmQzYmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9NYWtlZmlsZQpAQCAtMCwwICsxLDI5IEBACisjIFRoZSBsb29wcyBhcmUgYWxsIDY0LWJpdCBjb2RlCitDRkxBR1MgKz0gLW02NAorQ0ZMQUdTICs9IC1JJChDVVJESVIpCitDRkxBR1MgKz0gLUQgU0VMRlRFU1QKKworIyBVc2Ugb3VyIENGTEFHUyBmb3IgdGhlIGltcGxpY2l0IC5TIHJ1bGUKK0FTRkxBR1MgPSAkKENGTEFHUykKKworUFJPR1MgOj0gY29weXVzZXJfNjQgY29weXVzZXJfcG93ZXI3IG1lbWNweV82NCBtZW1jcHlfcG93ZXI3CitFWFRSQV9TT1VSQ0VTIDo9IHZhbGlkYXRlLmMgLi4vaGFybmVzcy5jCisKK2FsbDogJChQUk9HUykKKworY29weXVzZXJfNjQ6ICAgICBDUFBGTEFHUyArPSAtRCBDT1BZX0xPT1A9dGVzdF9fX2NvcHlfdG9mcm9tX3VzZXJfYmFzZQorY29weXVzZXJfcG93ZXI3OiBDUFBGTEFHUyArPSAtRCBDT1BZX0xPT1A9dGVzdF9fX2NvcHlfdG9mcm9tX3VzZXJfcG93ZXI3CittZW1jcHlfNjQ6ICAgICAgIENQUEZMQUdTICs9IC1EIENPUFlfTE9PUD10ZXN0X21lbWNweQorbWVtY3B5X3Bvd2VyNzogICBDUFBGTEFHUyArPSAtRCBDT1BZX0xPT1A9dGVzdF9tZW1jcHlfcG93ZXI3CisKKyQoUFJPR1MpOiAkKEVYVFJBX1NPVVJDRVMpCisKK3J1bl90ZXN0czogYWxsCisJQC1mb3IgUFJPRyBpbiAkKFBST0dTKTsgZG8gXAorCQkuLyQkUFJPRzsgXAorCWRvbmU7CisKK2NsZWFuOgorCXJtIC1mICQoUFJPR1MpICoubworCisuUEhPTlk6IGFsbCBydW5fdGVzdHMgY2xlYW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2FzbS9wcGNfYXNtLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHBjX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDljODQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHBjX2FzbS5oCkBAIC0wLDAgKzEsODYgQEAKKyNpbmNsdWRlIDxwcGMtYXNtLmg+CisKKyNkZWZpbmUgQ09ORklHX0FMVElWRUMKKworI2RlZmluZSByMQkxCisKKyNkZWZpbmUgdnIwICAgICAwCisjZGVmaW5lIHZyMSAgICAgMQorI2RlZmluZSB2cjIgICAgIDIKKyNkZWZpbmUgdnIzICAgICAzCisjZGVmaW5lIHZyNCAgICAgNAorI2RlZmluZSB2cjUgICAgIDUKKyNkZWZpbmUgdnI2ICAgICA2CisjZGVmaW5lIHZyNyAgICAgNworI2RlZmluZSB2cjggICAgIDgKKyNkZWZpbmUgdnI5ICAgICA5CisjZGVmaW5lIHZyMTAgICAgMTAKKyNkZWZpbmUgdnIxMSAgICAxMQorI2RlZmluZSB2cjEyICAgIDEyCisjZGVmaW5lIHZyMTMgICAgMTMKKyNkZWZpbmUgdnIxNCAgICAxNAorI2RlZmluZSB2cjE1ICAgIDE1CisjZGVmaW5lIHZyMTYgICAgMTYKKyNkZWZpbmUgdnIxNyAgICAxNworI2RlZmluZSB2cjE4ICAgIDE4CisjZGVmaW5lIHZyMTkgICAgMTkKKyNkZWZpbmUgdnIyMCAgICAyMAorI2RlZmluZSB2cjIxICAgIDIxCisjZGVmaW5lIHZyMjIgICAgMjIKKyNkZWZpbmUgdnIyMyAgICAyMworI2RlZmluZSB2cjI0ICAgIDI0CisjZGVmaW5lIHZyMjUgICAgMjUKKyNkZWZpbmUgdnIyNiAgICAyNgorI2RlZmluZSB2cjI3ICAgIDI3CisjZGVmaW5lIHZyMjggICAgMjgKKyNkZWZpbmUgdnIyOSAgICAyOQorI2RlZmluZSB2cjMwICAgIDMwCisjZGVmaW5lIHZyMzEgICAgMzEKKworI2RlZmluZSBSMTQgcjE0CisjZGVmaW5lIFIxNSByMTUKKyNkZWZpbmUgUjE2IHIxNgorI2RlZmluZSBSMTcgcjE3CisjZGVmaW5lIFIxOCByMTgKKyNkZWZpbmUgUjE5IHIxOQorI2RlZmluZSBSMjAgcjIwCisjZGVmaW5lIFIyMSByMjEKKyNkZWZpbmUgUjIyIHIyMgorCisjZGVmaW5lIFNUQUNLRlJBTUVTSVpFCTI1NgorI2RlZmluZSBTVEtfUEFSQU0oaSkJKDQ4ICsgKChpKS0zKSo4KQorI2RlZmluZSBTVEtfUkVHKGkpCSgxMTIgKyAoKGkpLTE0KSo4KQorCisjZGVmaW5lIF9HTE9CQUwoQSkgRlVOQ19TVEFSVCh0ZXN0XyAjIyBBKQorCisjZGVmaW5lIFBQQ19NVE9DUkYoQSwgQikJbXRvY3JmIEEsIEIKKworRlVOQ19TVEFSVChlbnRlcl92bXhfdXNlcmNvcHkpCisJbGkJcjMsMQorCWJscgorCitGVU5DX1NUQVJUKGV4aXRfdm14X3VzZXJjb3B5KQorCWxpCXIzLDAKKwlibHIKKworRlVOQ19TVEFSVChlbnRlcl92bXhfY29weSkKKwlsaQlyMywxCisJYmxyCisKK0ZVTkNfU1RBUlQoZXhpdF92bXhfY29weSkKKwlibHIKKworRlVOQ19TVEFSVChtZW1jcHlfcG93ZXI3KQorCWJscgorCitGVU5DX1NUQVJUKF9fY29weV90b2Zyb21fdXNlcl9wb3dlcjcpCisJYmxyCisKK0ZVTkNfU1RBUlQoX19jb3B5X3RvZnJvbV91c2VyX2Jhc2UpCisJYmxyCisKKyNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT04KKyNkZWZpbmUgRlRSX1NFQ1RJT05fRUxTRQorI2RlZmluZSBBTFRfRlRSX1NFQ1RJT05fRU5EX0lGQ0xSKHgpCisjZGVmaW5lIEFMVF9GVFJfU0VDVElPTl9FTkQoeCwgeSkKKyNkZWZpbmUgRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKHgpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHJvY2Vzc29yLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9hc20vcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2FzbS9wcm9jZXNzb3IuaApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvY29weXVzZXJfNjQuUyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2NvcHl1c2VyXzY0LlMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjFjNDE4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL2NvcHl1c2VyXzY0LlMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl82NC5TClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvY29weXVzZXJfcG93ZXI3LlMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9jb3B5dXNlcl9wb3dlcjcuUwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40Nzg2ODk1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvY29weXVzZXJfcG93ZXI3LlMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl9wb3dlcjcuUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL21lbWNweV82NC5TIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvbWVtY3B5XzY0LlMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uY2NlMzNmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL21lbWNweV82NC5TCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uLy4uL2FyY2gvcG93ZXJwYy9saWIvbWVtY3B5XzY0LlMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9tZW1jcHlfcG93ZXI3LlMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy9tZW1jcHlfcG93ZXI3LlMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGQ2ZmJmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL21lbWNweV9wb3dlcjcuUwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi9hcmNoL3Bvd2VycGMvbGliL21lbWNweV9wb3dlcjcuUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL3ZhbGlkYXRlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy92YWxpZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTBmZjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2NvcHlsb29wcy92YWxpZGF0ZS5jCkBAIC0wLDAgKzEsOTkgQEAKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICIuLi91dGlscy5oIgorCisjZGVmaW5lIE1BWF9MRU4gODE5MgorI2RlZmluZSBNQVhfT0ZGU0VUIDE2CisjZGVmaW5lIE1JTl9SRURaT05FIDEyOAorI2RlZmluZSBCVUZMRU4gKE1BWF9MRU4rTUFYX09GRlNFVCsyKk1JTl9SRURaT05FKQorI2RlZmluZSBQT0lTT04gMHhhNQorCit1bnNpZ25lZCBsb25nIENPUFlfTE9PUCh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworc3RhdGljIHZvaWQgZG9fb25lKGNoYXIgKnNyYywgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nIHNyY19vZmYsCisJCSAgIHVuc2lnbmVkIGxvbmcgZHN0X29mZiwgdW5zaWduZWQgbG9uZyBsZW4sIHZvaWQgKnJlZHpvbmUsCisJCSAgIHZvaWQgKmZpbGwpCit7CisJY2hhciAqc3JjcCwgKmRzdHA7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgbG9uZyBpOworCisJc3JjcCA9IHNyYyArIE1JTl9SRURaT05FICsgc3JjX29mZjsKKwlkc3RwID0gZHN0ICsgTUlOX1JFRFpPTkUgKyBkc3Rfb2ZmOworCisJbWVtc2V0KHNyYywgUE9JU09OLCBCVUZMRU4pOworCW1lbXNldChkc3QsIFBPSVNPTiwgQlVGTEVOKTsKKwltZW1jcHkoc3JjcCwgZmlsbCwgbGVuKTsKKworCXJldCA9IENPUFlfTE9PUChkc3RwLCBzcmNwLCBsZW4pOworCWlmIChyZXQgJiYgcmV0ICE9ICh1bnNpZ25lZCBsb25nKWRzdHApIHsKKwkJcHJpbnRmKCIoJXAsJXAsJWxkKSByZXR1cm5lZCAlbGRcbiIsIGRzdHAsIHNyY3AsIGxlbiwgcmV0KTsKKwkJYWJvcnQoKTsKKwl9CisKKwlpZiAobWVtY21wKGRzdHAsIHNyY3AsIGxlbikpIHsKKwkJcHJpbnRmKCIoJXAsJXAsJWxkKSBtaXNjb21wYXJlXG4iLCBkc3RwLCBzcmNwLCBsZW4pOworCQlwcmludGYoInNyYzogIik7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXByaW50ZigiJTAyeCAiLCBzcmNwW2ldKTsKKwkJcHJpbnRmKCJcbmRzdDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXByaW50ZigiJTAyeCAiLCBkc3RwW2ldKTsKKwkJcHJpbnRmKCJcbiIpOworCQlhYm9ydCgpOworCX0KKworCWlmIChtZW1jbXAoZHN0LCByZWR6b25lLCBkc3RwIC0gZHN0KSkgeworCQlwcmludGYoIiglcCwlcCwlbGQpIHJlZHpvbmUgYmVmb3JlIGNvcnJ1cHRlZFxuIiwKKwkJICAgICAgIGRzdHAsIHNyY3AsIGxlbik7CisJCWFib3J0KCk7CisJfQorCisJaWYgKG1lbWNtcChkc3RwK2xlbiwgcmVkem9uZSwgZHN0K0JVRkxFTi0oZHN0cCtsZW4pKSkgeworCQlwcmludGYoIiglcCwlcCwlbGQpIHJlZHpvbmUgYWZ0ZXIgY29ycnVwdGVkXG4iLAorCQkgICAgICAgZHN0cCwgc3JjcCwgbGVuKTsKKwkJYWJvcnQoKTsKKwl9Cit9CisKK2ludCB0ZXN0X2NvcHlfbG9vcCh2b2lkKQoreworCWNoYXIgKnNyYywgKmRzdCwgKnJlZHpvbmUsICpmaWxsOworCXVuc2lnbmVkIGxvbmcgbGVuLCBzcmNfb2ZmLCBkc3Rfb2ZmOworCXVuc2lnbmVkIGxvbmcgaTsKKworCXNyYyA9IG1lbWFsaWduKEJVRkxFTiwgQlVGTEVOKTsKKwlkc3QgPSBtZW1hbGlnbihCVUZMRU4sIEJVRkxFTik7CisJcmVkem9uZSA9IG1hbGxvYyhCVUZMRU4pOworCWZpbGwgPSBtYWxsb2MoQlVGTEVOKTsKKworCWlmICghc3JjIHx8ICFkc3QgfHwgIXJlZHpvbmUgfHwgIWZpbGwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJtYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwltZW1zZXQocmVkem9uZSwgUE9JU09OLCBCVUZMRU4pOworCisJLyogRmlsbCB3aXRoIHNlcXVlbnRpYWwgYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlVGTEVOOyBpKyspCisJCWZpbGxbaV0gPSBpICYgMHhmZjsKKworCWZvciAobGVuID0gMTsgbGVuIDwgTUFYX0xFTjsgbGVuKyspIHsKKwkJZm9yIChzcmNfb2ZmID0gMDsgc3JjX29mZiA8IE1BWF9PRkZTRVQ7IHNyY19vZmYrKykgeworCQkJZm9yIChkc3Rfb2ZmID0gMDsgZHN0X29mZiA8IE1BWF9PRkZTRVQ7IGRzdF9vZmYrKykgeworCQkJCWRvX29uZShzcmMsIGRzdCwgc3JjX29mZiwgZHN0X29mZiwgbGVuLAorCQkJCSAgICAgICByZWR6b25lLCBmaWxsKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3ModGVzdF9jb3B5X2xvb3AsIHN0cihDT1BZX0xPT1ApKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaAppbmRleCA1ODUxYzRiLi4wZGUwNjQ0IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3V0aWxzLmgKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy91dGlscy5oCkBAIC0zMSw0ICszMSw3IEBACiAJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCisjZGVmaW5lIF9zdHIocykgI3MKKyNkZWZpbmUgc3RyKHMpIF9zdHIocykKKwogI2VuZGlmIC8qIF9TRUxGVEVTVFNfUE9XRVJQQ19VVElMU19IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9mdW5jdGlvbnMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9mdW5jdGlvbnMuc2gKaW5kZXggNTg3NTYxZC4uOWIxN2U4MSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4vZnVuY3Rpb25zLnNoCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2Z1bmN0aW9ucy5zaApAQCAtOTYsNiArOTYsNyBAQAogCQllY2hvIHFlbXUtc3lzdGVtLXBwYzY0CiAJZWxzZQogCQllY2hvIENhbm5vdCBmaWd1cmUgb3V0IHdoYXQgcWVtdSBjb21tYW5kIHRvIHVzZSEgMT4mMgorCQllY2hvIGZpbGUgJDEgb3V0cHV0OiAkdQogCQkjIFVzdWFsbHkgdGhpcyB3aWxsIGJlIG9uZSBvZiAvdXNyL2Jpbi9xZW11LXN5c3RlbS0qCiAJCSMgVXNlIFJDVV9RRU1VX0NNRCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhcHByb3ByaWF0ZQogCQkjIGFyZ3VtZW50IHRvIHRvcC1sZXZlbCBzY3JpcHQuCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1sb2NrLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXJlY2hlY2stbG9jay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjkxODZlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXJlY2hlY2stbG9jay5zaApAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vYmFzaAorIworIyBBbmFseXplIGEgZ2l2ZW4gcmVzdWx0cyBkaXJlY3RvcnkgZm9yIGxvY2t0b3J0dXJlIHByb2dyZXNzLgorIworIyBVc2FnZTogc2gga3ZtLXJlY2hlY2stbG9jay5zaCByZXNkaXIKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisjIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCisjCisjIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDE0CisjCisjIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorCitpPSIkMSIKK2lmIHRlc3QgLWQgJGkKK3RoZW4KKwk6CitlbHNlCisJZWNobyBVbnJlYWRhYmxlIHJlc3VsdHMgZGlyZWN0b3J5OiAkaQorCWV4aXQgMQorZmkKKworY29uZmlnZmlsZT1gZWNobyAkaSB8IHNlZCAtZSAncy9eLipcLy8vJ2AKK25jcz1gZ3JlcCAiV3JpdGVzOiAgVG90YWw6IiAkaS9jb25zb2xlLmxvZyAyPiAvZGV2L251bGwgfCB0YWlsIC0xIHwgc2VkIC1lICdzL14uKiBUb3RhbDogLy8nIC1lICdzLyAuKiQvLydgCitpZiB0ZXN0IC16ICIkbmNzIgordGhlbgorCWVjaG8gJGNvbmZpZ2ZpbGUKK2Vsc2UKKwl0aXRsZT0iJGNvbmZpZ2ZpbGUgLS0tLS0tLSAkbmNzIGFjcXVpc2l0aW9ucy9yZWxlYXNlcyIKKwlkdXI9YHNlZCAtZSAncy9eLiogbG9ja3RvcnR1cmUuc2h1dGRvd25fc2Vjcz0vLycgLWUgJ3MvIC4qJC8vJyA8ICRpL3FlbXUtY21kIDI+IC9kZXYvbnVsbGAKKwlpZiB0ZXN0IC16ICIkZHVyIgorCXRoZW4KKwkJOgorCWVsc2UKKwkJbmNzcHM9YGF3ayAtdiBuY3M9JG5jcyAtdiBkdXI9JGR1ciAnCisJCQlCRUdJTiB7IHByaW50IG5jcyAvIGR1ciB9JyA8IC9kZXYvbnVsbGAKKwkJdGl0bGU9IiR0aXRsZSAoJG5jc3BzIHBlciBzZWNvbmQpIgorCWZpCisJZWNobyAkdGl0bGUKK2ZpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1yY3Uuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1yY3Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDc1YjFkYzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay1yY3Uuc2gKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQW5hbHl6ZSBhIGdpdmVuIHJlc3VsdHMgZGlyZWN0b3J5IGZvciByY3V0b3J0dXJlIHByb2dyZXNzLgorIworIyBVc2FnZTogc2gga3ZtLXJlY2hlY2stcmN1LnNoIHJlc2RpcgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyMKKyMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTQKKyMKKyMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisKK2k9IiQxIgoraWYgdGVzdCAtZCAkaQordGhlbgorCToKK2Vsc2UKKwllY2hvIFVucmVhZGFibGUgcmVzdWx0cyBkaXJlY3Rvcnk6ICRpCisJZXhpdCAxCitmaQorCitjb25maWdmaWxlPWBlY2hvICRpIHwgc2VkIC1lICdzL14uKlwvLy8nYAorbmdwcz1gZ3JlcCB2ZXI6ICRpL2NvbnNvbGUubG9nIDI+IC9kZXYvbnVsbCB8IHRhaWwgLTEgfCBzZWQgLWUgJ3MvXi4qIHZlcjogLy8nIC1lICdzLyAuKiQvLydgCitpZiB0ZXN0IC16ICIkbmdwcyIKK3RoZW4KKwllY2hvICRjb25maWdmaWxlCitlbHNlCisJdGl0bGU9IiRjb25maWdmaWxlIC0tLS0tLS0gJG5ncHMgZ3JhY2UgcGVyaW9kcyIKKwlkdXI9YHNlZCAtZSAncy9eLiogcmN1dG9ydHVyZS5zaHV0ZG93bl9zZWNzPS8vJyAtZSAncy8gLiokLy8nIDwgJGkvcWVtdS1jbWQgMj4gL2Rldi9udWxsYAorCWlmIHRlc3QgLXogIiRkdXIiCisJdGhlbgorCQk6CisJZWxzZQorCQluZ3BzcHM9YGF3ayAtdiBuZ3BzPSRuZ3BzIC12IGR1cj0kZHVyICcKKwkJCUJFR0lOIHsgcHJpbnQgbmdwcyAvIGR1ciB9JyA8IC9kZXYvbnVsbGAKKwkJdGl0bGU9IiR0aXRsZSAoJG5ncHNwcyBwZXIgc2Vjb25kKSIKKwlmaQorCWVjaG8gJHRpdGxlCitmaQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXJlY2hlY2suc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay5zaAppbmRleCBiYWVmMDlmLi5hNDRkYWFhIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay5zaAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tcmVjaGVjay5zaApAQCAtMSw2ICsxLDYgQEAKICMhL2Jpbi9iYXNoCiAjCi0jIEdpdmVuIHRoZSByZXN1bHRzIGRpcmVjdG9yaWVzIGZvciBwcmV2aW91cyBLVk0gcnVucyBvZiByY3V0b3J0dXJlLAorIyBHaXZlbiB0aGUgcmVzdWx0cyBkaXJlY3RvcmllcyBmb3IgcHJldmlvdXMgS1ZNLWJhc2VkIHRvcnR1cmUgcnVucywKICMgY2hlY2sgdGhlIGJ1aWxkIGFuZCBjb25zb2xlIG91dHB1dCBmb3IgZXJyb3JzLiAgR2l2ZW4gYSBkaXJlY3RvcnkKICMgY29udGFpbmluZyByZXN1bHRzIGRpcmVjdG9yaWVzLCB0aGlzIHJlY3Vyc2l2ZWx5IGNoZWNrcyB0aGVtIGFsbC4KICMKQEAgLTI3LDExICsyNywxOCBAQAogUEFUSD1gcHdkYC90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2JpbjokUEFUSDsgZXhwb3J0IFBBVEgKIGZvciByZCBpbiAiJEAiCiBkbworCWZpcnN0dGltZT0xCiAJZGlycz1gZmluZCAkcmQgLW5hbWUgTWFrZS5kZWZjb25maWcub3V0IC1wcmludCB8IHNvcnQgfCBzZWQgLWUgJ3MsL1teL10qJCwsJyB8IHNvcnQgLXVgCiAJZm9yIGkgaW4gJGRpcnMKIAlkbwotCQljb25maWdmaWxlPWBlY2hvICRpIHwgc2VkIC1lICdzL14uKlwvLy8nYAotCQllY2hvICRjb25maWdmaWxlCisJCWlmIHRlc3QgLW4gIiRmaXJzdHRpbWUiCisJCXRoZW4KKwkJCWZpcnN0dGltZT0iIgorCQkJcmVzZGlyPWBlY2hvICRpIHwgc2VkIC1lICdzLC8kLCwnIC1lICdzLC9bXi9dKiQsLCdgCisJCQloZWFkIC0xICRyZXNkaXIvbG9nCisJCWZpCisJCVRPUlRVUkVfU1VJVEU9ImBjYXQgJGkvLi4vVE9SVFVSRV9TVUlURWAiCisJCWt2bS1yZWNoZWNrLSR7VE9SVFVSRV9TVUlURX0uc2ggJGkKIAkJY29uZmlnY2hlY2suc2ggJGkvLmNvbmZpZyAkaS9Db25maWdGcmFnbWVudAogCQlwYXJzZS1idWlsZC5zaCAkaS9NYWtlLm91dCAkY29uZmlnZmlsZQogCQlwYXJzZS1yY3V0b3J0dXJlLnNoICRpL2NvbnNvbGUubG9nICRjb25maWdmaWxlCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tdGVzdC0xLXJjdS5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS10ZXN0LTEtcmN1LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTFiMjM3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS10ZXN0LTEtcmN1LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIFJ1biBhIGt2bS1iYXNlZCB0ZXN0IG9mIHRoZSBzcGVjaWZpZWQgdHJlZSBvbiB0aGUgc3BlY2lmaWVkIGNvbmZpZ3MuCi0jIEZ1bGx5IGF1dG9tYXRlZCBydW4gYW5kIGVycm9yIGNoZWNraW5nLCBubyBncmFwaGljcyBjb25zb2xlLgotIwotIyBFeGVjdXRlIHRoaXMgaW4gdGhlIHNvdXJjZSB0cmVlLiAgRG8gbm90IHJ1biBpdCBhcyBhIGJhY2tncm91bmQgdGFzawotIyBiZWNhdXNlIHFlbXUgZG9lcyBub3Qgc2VlbSB0byBsaWtlIHRoYXQgbXVjaC4KLSMKLSMgVXNhZ2U6IHNoIGt2bS10ZXN0LTEtcmN1LnNoIGNvbmZpZyBidWlsZGRpciByZXNkaXIgbWludXRlcyBxZW11LWFyZ3MgYm9vdGFyZ3MKLSMKLSMgcWVtdS1hcmdzIGRlZmF1bHRzIHRvICIiIC0tIHlvdSB3aWxsIHdhbnQgIi1ub2dyYXBoaWMiIGlmIHJ1bm5pbmcgaGVhZGxlc3MuCi0jIGJvb3RhcmdzIGRlZmF1bHRzIHRvCSJyb290PS9kZXYvc2RhIG5vYXBpYyBzZWxpbnV4PTAgY29uc29sZT10dHlTMCIKLSMJCQkiaW5pdGNhbGxfZGVidWcgZGVidWcgcmN1dG9ydHVyZS5zdGF0X2ludGVydmFsPTE1IgotIwkJCSJyY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JCgobWludXRlcyAqIDYwKSkiCi0jCQkJInJjdXRvcnR1cmUucmN1dG9ydHVyZV9ydW5uYWJsZT0xIgotIwotIyBBbnl0aGluZyB5b3Ugc3BlY2lmeSBmb3IgZWl0aGVyIHFlbXUtYXJncyBvciBib290YXJncyBpcyBhcHBlbmRlZCB0bwotIyB0aGUgZGVmYXVsdCB2YWx1ZXMuICBUaGUgIi1zbXAiIHZhbHVlIGlzIGRlZHVjZWQgZnJvbSB0aGUgY29udGVudHMgb2YKLSMgdGhlIGNvbmZpZyBmcmFnbWVudC4KLSMKLSMgTW9yZSBzb3BoaXN0aWNhdGVkIGFyZ3VtZW50IHBhcnNpbmcgaXMgY2xlYXJseSBuZWVkZWQuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAotIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgotIwotIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMQotIwotIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotZ3JhY2U9MTIwCi0KLVQ9L3RtcC9rdm0tdGVzdC0xLXJjdS5zaC4kJAotdHJhcCAncm0gLXJmICRUJyAwCi0KLS4gJEtWTS9iaW4vZnVuY3Rpb25zLnNoCi0uICRLVlBBVEgvdmVyX2Z1bmN0aW9ucy5zaAotCi1jb25maWdfdGVtcGxhdGU9JHsxfQotdGl0bGU9YGVjaG8gJGNvbmZpZ190ZW1wbGF0ZSB8IHNlZCAtZSAncy9eLipcLy8vJ2AKLWJ1aWxkZGlyPSR7Mn0KLWlmIHRlc3QgLXogIiRidWlsZGRpciIgLW8gISAtZCAiJGJ1aWxkZGlyIiAtbyAhIC13ICIkYnVpbGRkaXIiCi10aGVuCi0JZWNobyAia3ZtLXRlc3QtMS1yY3Uuc2ggOiRidWlsZGRpcjogTm90IGEgd3JpdGFibGUgZGlyZWN0b3J5LCBjYW5ub3QgYnVpbGQgaW50byBpdCIKLQlleGl0IDEKLWZpCi1yZXNkaXI9JHszfQotaWYgdGVzdCAteiAiJHJlc2RpciIgLW8gISAtZCAiJHJlc2RpciIgLW8gISAtdyAiJHJlc2RpciIKLXRoZW4KLQllY2hvICJrdm0tdGVzdC0xLXJjdS5zaCA6JHJlc2RpcjogTm90IGEgd3JpdGFibGUgZGlyZWN0b3J5LCBjYW5ub3QgYnVpbGQgaW50byBpdCIKLQlleGl0IDEKLWZpCi1jcCAkY29uZmlnX3RlbXBsYXRlICRyZXNkaXIvQ29uZmlnRnJhZ21lbnQKLWVjaG8gJyAtLS0nIGBkYXRlYDogU3RhcnRpbmcgYnVpbGQKLWVjaG8gJyAtLS0nIEtjb25maWcgZnJhZ21lbnQgYXQ6ICRjb25maWdfdGVtcGxhdGUgPj4gJHJlc2Rpci9sb2cKLWNhdCA8PCAnX19fRU9GX19fJyA+PiAkVAotQ09ORklHX1JDVV9UT1JUVVJFX1RFU1Q9eQotX19fRU9GX19fCi0jIE9wdGltaXphdGlvbnMgYmVsb3cgdGhpcyBwb2ludAotIyBDT05GSUdfVVNCPW4KLSMgQ09ORklHX1NFQ1VSSVRZPW4KLSMgQ09ORklHX05GU19GUz1uCi0jIENPTkZJR19TT1VORD1uCi0jIENPTkZJR19JTlBVVF9KT1lTVElDSz1uCi0jIENPTkZJR19JTlBVVF9UQUJMRVQ9bgotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49bgotIyBDT05GSUdfSU5QVVRfTUlTQz1uCi0jIENPTkZJR19JTlBVVF9NT1VTRT1uCi0jICMgQ09ORklHX05FVD1uICMgZGlzYWJsZXMgY29uc29sZSBhY2Nlc3MsIHNvIGFjY2VwdCB0aGUgc2xvd2VyIGJ1aWxkLgotIyBDT05GSUdfU0NTST1uCi0jIENPTkZJR19BVEE9bgotIyBDT05GSUdfRkFUX0ZTPW4KLSMgQ09ORklHX01TRE9TX0ZTPW4KLSMgQ09ORklHX1ZGQVRfRlM9bgotIyBDT05GSUdfSVNPOTY2MF9GUz1uCi0jIENPTkZJR19RVU9UQT1uCi0jIENPTkZJR19ISUQ9bgotIyBDT05GSUdfQ1JZUFRPPW4KLSMgQ09ORklHX1BDQ0FSRD1uCi0jIENPTkZJR19QQ01DSUE9bgotIyBDT05GSUdfQ0FSREJVUz1uCi0jIENPTkZJR19ZRU5UQT1uCi1pZiBrdm0tYnVpbGQuc2ggJGNvbmZpZ190ZW1wbGF0ZSAkYnVpbGRkaXIgJFQKLXRoZW4KLQljcCAkYnVpbGRkaXIvTWFrZSoub3V0ICRyZXNkaXIKLQljcCAkYnVpbGRkaXIvLmNvbmZpZyAkcmVzZGlyCi0JY3AgJGJ1aWxkZGlyL2FyY2gveDg2L2Jvb3QvYnpJbWFnZSAkcmVzZGlyCi0JcGFyc2UtYnVpbGQuc2ggJHJlc2Rpci9NYWtlLm91dCAkdGl0bGUKLWVsc2UKLQljcCAkYnVpbGRkaXIvTWFrZSoub3V0ICRyZXNkaXIKLQllY2hvIEJ1aWxkIGZhaWxlZCwgbm90IHJ1bm5pbmcgS1ZNLCBzZWUgJHJlc2Rpci4KLQlleGl0IDEKLWZpCi1taW51dGVzPSQ0Ci1zZWNvbmRzPSQoKCRtaW51dGVzICogNjApKQotcWVtdV9hcmdzPSQ1Ci1ib290X2FyZ3M9JDYKLQotY2QgJEtWTQota3N0YXJ0dGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSB9JyA8IC9kZXYvbnVsbGAKLWVjaG8gJyAtLS0nIGBkYXRlYDogU3RhcnRpbmcga2VybmVsCi0KLSMgRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3Igb2YgcWVtdSBjb21tYW5kLgotUUVNVT0iYGlkZW50aWZ5X3FlbXUgJGJ1aWxkZGlyL3ZtbGludXgub2AiCi0KLSMgR2VuZXJhdGUgLXNtcCBxZW11IGFyZ3VtZW50LgotY3B1X2NvdW50PWBjb25maWdOUl9DUFVTLnNoICRjb25maWdfdGVtcGxhdGVgCi12Y3B1cz1gaWRlbnRpZnlfcWVtdV92Y3B1c2AKLWlmIHRlc3QgJGNwdV9jb3VudCAtZ3QgJHZjcHVzCi10aGVuCi0JZWNobyBDUFUgY291bnQgbGltaXRlZCBmcm9tICRjcHVfY291bnQgdG8gJHZjcHVzCi0JdG91Y2ggJHJlc2Rpci9XYXJuaW5ncwotCWVjaG8gQ1BVIGNvdW50IGxpbWl0ZWQgZnJvbSAkY3B1X2NvdW50IHRvICR2Y3B1cyA+PiAkcmVzZGlyL1dhcm5pbmdzCi0JY3B1X2NvdW50PSR2Y3B1cwotZmkKLXFlbXVfYXJncz0iYHNwZWNpZnlfcWVtdV9jcHVzICIkUUVNVSIgIiRxZW11X2FyZ3MiICIkY3B1X2NvdW50ImAiCi0KLSMgR2VuZXJhdGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGFuZCBpbnRlcmFjdGlvbi1zcGVjaWZpYyBxZW11IGFyZ3VtZW50cwotcWVtdV9hcmdzPSIkcWVtdV9hcmdzIGBpZGVudGlmeV9xZW11X2FyZ3MgIiRRRU1VIiAiJGJ1aWxkZGlyL2NvbnNvbGUubG9nImAiCi0KLSMgR2VuZXJhdGUgcWVtdSAtYXBwZW5kIGFyZ3VtZW50cwotcWVtdV9hcHBlbmQ9ImBpZGVudGlmeV9xZW11X2FwcGVuZCAiJFFFTVUiYCIKLQotIyBQdWxsIGluIEtjb25maWctZnJhZ21lbnQgYm9vdCBwYXJhbWV0ZXJzCi1ib290X2FyZ3M9ImBjb25maWdmcmFnX2Jvb3RfcGFyYW1zICIkYm9vdF9hcmdzIiAiJGNvbmZpZ190ZW1wbGF0ZSJgIgotIyBHZW5lcmF0ZSBDUFUtaG90cGx1ZyBib290IHBhcmFtZXRlcnMKLWJvb3RfYXJncz0iYHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgIiRib290X2FyZ3MiICRidWlsZGRpci8uY29uZmlnYCIKLSMgR2VuZXJhdGUgcmN1X2JhcnJpZXIoKSBib290IHBhcmFtZXRlcgotYm9vdF9hcmdzPSJgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzICIkYm9vdF9hcmdzImAiCi0jIFB1bGwgaW4gc3RhbmRhcmQgcmN1dG9ydHVyZSBib290IGFyZ3VtZW50cwotYm9vdF9hcmdzPSIkYm9vdF9hcmdzIHJjdXRvcnR1cmUuc3RhdF9pbnRlcnZhbD0xNSByY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JHNlY29uZHMgcmN1dG9ydHVyZS5yY3V0b3J0dXJlX3J1bm5hYmxlPTEiCi0KLWVjaG8gJFFFTVUgJHFlbXVfYXJncyAtbSA1MTIgLWtlcm5lbCAkYnVpbGRkaXIvYXJjaC94ODYvYm9vdC9iekltYWdlIC1hcHBlbmQgXCIkcWVtdV9hcHBlbmQgJGJvb3RfYXJnc1wiID4gJHJlc2Rpci9xZW11LWNtZAotaWYgdGVzdCAtbiAiJFJDVV9CVUlMRE9OTFkiCi10aGVuCi0JZWNobyBCdWlsZC1vbmx5IHJ1biBzcGVjaWZpZWQsIGJvb3QvdGVzdCBvbWl0dGVkLgotCWV4aXQgMAotZmkKLSRRRU1VICRxZW11X2FyZ3MgLW0gNTEyIC1rZXJuZWwgJGJ1aWxkZGlyL2FyY2gveDg2L2Jvb3QvYnpJbWFnZSAtYXBwZW5kICIkcWVtdV9hcHBlbmQgJGJvb3RfYXJncyIgJgotcWVtdV9waWQ9JCEKLWNvbW1hbmRjb21wbGV0ZWQ9MAotZWNobyBNb25pdG9yaW5nIHFlbXUgam9iIGF0IHBpZCAkcWVtdV9waWQKLWZvciAoKGk9MDtpPCRzZWNvbmRzO2krKykpCi1kbwotCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKLQl0aGVuCi0JCXNsZWVwIDEKLQllbHNlCi0JCWNvbW1hbmRjb21wbGV0ZWQ9MQotCQlrcnVudGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSAtICciJGtzdGFydHRpbWUiJyB9JyA8IC9kZXYvbnVsbGAKLQkJaWYgdGVzdCAka3J1bnRpbWUgLWx0ICRzZWNvbmRzCi0JCXRoZW4KLQkJCWVjaG8gQ29tcGxldGVkIGluICRrcnVudGltZSB2cy4gJHNlY29uZHMgPj4gJHJlc2Rpci9XYXJuaW5ncyAyPiYxCi0JCWVsc2UKLQkJCWVjaG8gJyAtLS0nIGBkYXRlYDogS2VybmVsIGRvbmUKLQkJZmkKLQkJYnJlYWsKLQlmaQotZG9uZQotaWYgdGVzdCAkY29tbWFuZGNvbXBsZXRlZCAtZXEgMAotdGhlbgotCWVjaG8gR3JhY2UgcGVyaW9kIGZvciBxZW11IGpvYiBhdCBwaWQgJHFlbXVfcGlkCi0JZm9yICgoaT0wO2k8PSRncmFjZTtpKyspKQotCWRvCi0JCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKLQkJdGhlbgotCQkJc2xlZXAgMQotCQllbHNlCi0JCQlicmVhawotCQlmaQotCQlpZiB0ZXN0ICRpIC1lcSAkZ3JhY2UKLQkJdGhlbgotCQkJa3J1bnRpbWU9YGF3ayAnQkVHSU4geyBwcmludCBzeXN0aW1lKCkgLSAnIiRrc3RhcnR0aW1lIicgfSdgCi0JCQllY2hvICIhISEgSGFuZyBhdCAka3J1bnRpbWUgdnMuICRzZWNvbmRzIHNlY29uZHMiID4+ICRyZXNkaXIvV2FybmluZ3MgMj4mMQotCQkJa2lsbCAtS0lMTCAkcWVtdV9waWQKLQkJZmkKLQlkb25lCi1maQotCi1jcCAkYnVpbGRkaXIvY29uc29sZS5sb2cgJHJlc2RpcgotcGFyc2UtcmN1dG9ydHVyZS5zaCAkcmVzZGlyL2NvbnNvbGUubG9nICR0aXRsZQotcGFyc2UtY29uc29sZS5zaCAkcmVzZGlyL2NvbnNvbGUubG9nICR0aXRsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXRlc3QtMS1ydW4uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0tdGVzdC0xLXJ1bi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGIyOGJiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLXRlc3QtMS1ydW4uc2gKQEAgLTAsMCArMSwyMDMgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFJ1biBhIGt2bS1iYXNlZCB0ZXN0IG9mIHRoZSBzcGVjaWZpZWQgdHJlZSBvbiB0aGUgc3BlY2lmaWVkIGNvbmZpZ3MuCisjIEZ1bGx5IGF1dG9tYXRlZCBydW4gYW5kIGVycm9yIGNoZWNraW5nLCBubyBncmFwaGljcyBjb25zb2xlLgorIworIyBFeGVjdXRlIHRoaXMgaW4gdGhlIHNvdXJjZSB0cmVlLiAgRG8gbm90IHJ1biBpdCBhcyBhIGJhY2tncm91bmQgdGFzaworIyBiZWNhdXNlIHFlbXUgZG9lcyBub3Qgc2VlbSB0byBsaWtlIHRoYXQgbXVjaC4KKyMKKyMgVXNhZ2U6IHNoIGt2bS10ZXN0LTEtcnVuLnNoIGNvbmZpZyBidWlsZGRpciByZXNkaXIgbWludXRlcyBxZW11LWFyZ3MgYm9vdF9hcmdzCisjCisjIHFlbXUtYXJncyBkZWZhdWx0cyB0byAiLW5vZ3JhcGhpYyIsIGFsb25nIHdpdGggYXJndW1lbnRzIHNwZWNpZnlpbmcgdGhlCisjCQkJbnVtYmVyIG9mIENQVXMgYW5kIG90aGVyIG9wdGlvbnMgZ2VuZXJhdGVkIGZyb20KKyMJCQl0aGUgdW5kZXJseWluZyBDUFUgYXJjaGl0ZWN0dXJlLgorIyBib290X2FyZ3MgZGVmYXVsdHMgdG8gdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zCisjCQkJc2hlbGwgZnVuY3Rpb24uCisjCisjIEFueXRoaW5nIHlvdSBzcGVjaWZ5IGZvciBlaXRoZXIgcWVtdS1hcmdzIG9yIGJvb3RfYXJncyBpcyBhcHBlbmRlZCB0bworIyB0aGUgZGVmYXVsdCB2YWx1ZXMuICBUaGUgIi1zbXAiIHZhbHVlIGlzIGRlZHVjZWQgZnJvbSB0aGUgY29udGVudHMgb2YKKyMgdGhlIGNvbmZpZyBmcmFnbWVudC4KKyMKKyMgTW9yZSBzb3BoaXN0aWNhdGVkIGFyZ3VtZW50IHBhcnNpbmcgaXMgY2xlYXJseSBuZWVkZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgorIworIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMQorIworIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KKworZ3JhY2U9MTIwCisKK1Q9L3RtcC9rdm0tdGVzdC0xLXJ1bi5zaC4kJAordHJhcCAncm0gLXJmICRUJyAwCisKKy4gJEtWTS9iaW4vZnVuY3Rpb25zLnNoCisuICRLVlBBVEgvdmVyX2Z1bmN0aW9ucy5zaAorCitjb25maWdfdGVtcGxhdGU9JHsxfQorY29uZmlnX2Rpcj1gZWNobyAkY29uZmlnX3RlbXBsYXRlIHwgc2VkIC1lICdzLC9bXi9dKiQsLCdgCit0aXRsZT1gZWNobyAkY29uZmlnX3RlbXBsYXRlIHwgc2VkIC1lICdzL14uKlwvLy8nYAorYnVpbGRkaXI9JHsyfQoraWYgdGVzdCAteiAiJGJ1aWxkZGlyIiAtbyAhIC1kICIkYnVpbGRkaXIiIC1vICEgLXcgIiRidWlsZGRpciIKK3RoZW4KKwllY2hvICJrdm0tdGVzdC0xLXJ1bi5zaCA6JGJ1aWxkZGlyOiBOb3QgYSB3cml0YWJsZSBkaXJlY3RvcnksIGNhbm5vdCBidWlsZCBpbnRvIGl0IgorCWV4aXQgMQorZmkKK3Jlc2Rpcj0kezN9CitpZiB0ZXN0IC16ICIkcmVzZGlyIiAtbyAhIC1kICIkcmVzZGlyIiAtbyAhIC13ICIkcmVzZGlyIgordGhlbgorCWVjaG8gImt2bS10ZXN0LTEtcnVuLnNoIDokcmVzZGlyOiBOb3QgYSB3cml0YWJsZSBkaXJlY3RvcnksIGNhbm5vdCBzdG9yZSByZXN1bHRzIGludG8gaXQiCisJZXhpdCAxCitmaQorY3AgJGNvbmZpZ190ZW1wbGF0ZSAkcmVzZGlyL0NvbmZpZ0ZyYWdtZW50CitlY2hvICcgLS0tJyBgZGF0ZWA6IFN0YXJ0aW5nIGJ1aWxkCitlY2hvICcgLS0tJyBLY29uZmlnIGZyYWdtZW50IGF0OiAkY29uZmlnX3RlbXBsYXRlID4+ICRyZXNkaXIvbG9nCitpZiB0ZXN0IC1yICIkY29uZmlnX2Rpci9DRmNvbW1vbiIKK3RoZW4KKwljYXQgPCAkY29uZmlnX2Rpci9DRmNvbW1vbiA+PiAkVAorZmkKKyMgT3B0aW1pemF0aW9ucyBiZWxvdyB0aGlzIHBvaW50CisjIENPTkZJR19VU0I9bgorIyBDT05GSUdfU0VDVVJJVFk9bgorIyBDT05GSUdfTkZTX0ZTPW4KKyMgQ09ORklHX1NPVU5EPW4KKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLPW4KKyMgQ09ORklHX0lOUFVUX1RBQkxFVD1uCisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj1uCisjIENPTkZJR19JTlBVVF9NSVNDPW4KKyMgQ09ORklHX0lOUFVUX01PVVNFPW4KKyMgIyBDT05GSUdfTkVUPW4gIyBkaXNhYmxlcyBjb25zb2xlIGFjY2Vzcywgc28gYWNjZXB0IHRoZSBzbG93ZXIgYnVpbGQuCisjIENPTkZJR19TQ1NJPW4KKyMgQ09ORklHX0FUQT1uCisjIENPTkZJR19GQVRfRlM9bgorIyBDT05GSUdfTVNET1NfRlM9bgorIyBDT05GSUdfVkZBVF9GUz1uCisjIENPTkZJR19JU085NjYwX0ZTPW4KKyMgQ09ORklHX1FVT1RBPW4KKyMgQ09ORklHX0hJRD1uCisjIENPTkZJR19DUllQVE89bgorIyBDT05GSUdfUENDQVJEPW4KKyMgQ09ORklHX1BDTUNJQT1uCisjIENPTkZJR19DQVJEQlVTPW4KKyMgQ09ORklHX1lFTlRBPW4KK2lmIGt2bS1idWlsZC5zaCAkY29uZmlnX3RlbXBsYXRlICRidWlsZGRpciAkVAordGhlbgorCWNwICRidWlsZGRpci9NYWtlKi5vdXQgJHJlc2RpcgorCWNwICRidWlsZGRpci8uY29uZmlnICRyZXNkaXIKKwljcCAkYnVpbGRkaXIvYXJjaC94ODYvYm9vdC9iekltYWdlICRyZXNkaXIKKwlwYXJzZS1idWlsZC5zaCAkcmVzZGlyL01ha2Uub3V0ICR0aXRsZQorCWlmIHRlc3QgLWYgJGJ1aWxkZGlyLndhaXQKKwl0aGVuCisJCW12ICRidWlsZGRpci53YWl0ICRidWlsZGRpci5yZWFkeQorCWZpCitlbHNlCisJY3AgJGJ1aWxkZGlyL01ha2UqLm91dCAkcmVzZGlyCisJZWNobyBCdWlsZCBmYWlsZWQsIG5vdCBydW5uaW5nIEtWTSwgc2VlICRyZXNkaXIuCisJaWYgdGVzdCAtZiAkYnVpbGRkaXIud2FpdAorCXRoZW4KKwkJbXYgJGJ1aWxkZGlyLndhaXQgJGJ1aWxkZGlyLnJlYWR5CisJZmkKKwlleGl0IDEKK2ZpCit3aGlsZSB0ZXN0IC1mICRidWlsZGRpci5yZWFkeQorZG8KKwlzbGVlcCAxCitkb25lCittaW51dGVzPSQ0CitzZWNvbmRzPSQoKCRtaW51dGVzICogNjApKQorcWVtdV9hcmdzPSQ1Citib290X2FyZ3M9JDYKKworY2QgJEtWTQora3N0YXJ0dGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSB9JyA8IC9kZXYvbnVsbGAKK2VjaG8gJyAtLS0nIGBkYXRlYDogU3RhcnRpbmcga2VybmVsCisKKyMgRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3Igb2YgcWVtdSBjb21tYW5kLgorUUVNVT0iYGlkZW50aWZ5X3FlbXUgJGJ1aWxkZGlyL3ZtbGludXhgIgorCisjIEdlbmVyYXRlIC1zbXAgcWVtdSBhcmd1bWVudC4KK3FlbXVfYXJncz0iLW5vZ3JhcGhpYyAkcWVtdV9hcmdzIgorY3B1X2NvdW50PWBjb25maWdOUl9DUFVTLnNoICRjb25maWdfdGVtcGxhdGVgCit2Y3B1cz1gaWRlbnRpZnlfcWVtdV92Y3B1c2AKK2lmIHRlc3QgJGNwdV9jb3VudCAtZ3QgJHZjcHVzCit0aGVuCisJZWNobyBDUFUgY291bnQgbGltaXRlZCBmcm9tICRjcHVfY291bnQgdG8gJHZjcHVzCisJdG91Y2ggJHJlc2Rpci9XYXJuaW5ncworCWVjaG8gQ1BVIGNvdW50IGxpbWl0ZWQgZnJvbSAkY3B1X2NvdW50IHRvICR2Y3B1cyA+PiAkcmVzZGlyL1dhcm5pbmdzCisJY3B1X2NvdW50PSR2Y3B1cworZmkKK3FlbXVfYXJncz0iYHNwZWNpZnlfcWVtdV9jcHVzICIkUUVNVSIgIiRxZW11X2FyZ3MiICIkY3B1X2NvdW50ImAiCisKKyMgR2VuZXJhdGUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGFuZCBpbnRlcmFjdGlvbi1zcGVjaWZpYyBxZW11IGFyZ3VtZW50cworcWVtdV9hcmdzPSIkcWVtdV9hcmdzIGBpZGVudGlmeV9xZW11X2FyZ3MgIiRRRU1VIiAiJGJ1aWxkZGlyL2NvbnNvbGUubG9nImAiCisKKyMgR2VuZXJhdGUgcWVtdSAtYXBwZW5kIGFyZ3VtZW50cworcWVtdV9hcHBlbmQ9ImBpZGVudGlmeV9xZW11X2FwcGVuZCAiJFFFTVUiYCIKKworIyBQdWxsIGluIEtjb25maWctZnJhZ21lbnQgYm9vdCBwYXJhbWV0ZXJzCitib290X2FyZ3M9ImBjb25maWdmcmFnX2Jvb3RfcGFyYW1zICIkYm9vdF9hcmdzIiAiJGNvbmZpZ190ZW1wbGF0ZSJgIgorIyBHZW5lcmF0ZSBrZXJuZWwtdmVyc2lvbi1zcGVjaWZpYyBib290IHBhcmFtZXRlcnMKK2Jvb3RfYXJncz0iYHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zICIkYm9vdF9hcmdzIiAkYnVpbGRkaXIvLmNvbmZpZyAkc2Vjb25kc2AiCisKK2VjaG8gJFFFTVUgJHFlbXVfYXJncyAtbSA1MTIgLWtlcm5lbCAkYnVpbGRkaXIvYXJjaC94ODYvYm9vdC9iekltYWdlIC1hcHBlbmQgXCIkcWVtdV9hcHBlbmQgJGJvb3RfYXJnc1wiID4gJHJlc2Rpci9xZW11LWNtZAoraWYgdGVzdCAtbiAiJFJDVV9CVUlMRE9OTFkiCit0aGVuCisJZWNobyBCdWlsZC1vbmx5IHJ1biBzcGVjaWZpZWQsIGJvb3QvdGVzdCBvbWl0dGVkLgorCWV4aXQgMAorZmkKKyRRRU1VICRxZW11X2FyZ3MgLW0gNTEyIC1rZXJuZWwgJGJ1aWxkZGlyL2FyY2gveDg2L2Jvb3QvYnpJbWFnZSAtYXBwZW5kICIkcWVtdV9hcHBlbmQgJGJvb3RfYXJncyIgJgorcWVtdV9waWQ9JCEKK2NvbW1hbmRjb21wbGV0ZWQ9MAorZWNobyBNb25pdG9yaW5nIHFlbXUgam9iIGF0IHBpZCAkcWVtdV9waWQKK2ZvciAoKGk9MDtpPCRzZWNvbmRzO2krKykpCitkbworCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKKwl0aGVuCisJCXNsZWVwIDEKKwllbHNlCisJCWNvbW1hbmRjb21wbGV0ZWQ9MQorCQlrcnVudGltZT1gYXdrICdCRUdJTiB7IHByaW50IHN5c3RpbWUoKSAtICciJGtzdGFydHRpbWUiJyB9JyA8IC9kZXYvbnVsbGAKKwkJaWYgdGVzdCAka3J1bnRpbWUgLWx0ICRzZWNvbmRzCisJCXRoZW4KKwkJCWVjaG8gQ29tcGxldGVkIGluICRrcnVudGltZSB2cy4gJHNlY29uZHMgPj4gJHJlc2Rpci9XYXJuaW5ncyAyPiYxCisJCWVsc2UKKwkJCWVjaG8gJyAtLS0nIGBkYXRlYDogS2VybmVsIGRvbmUKKwkJZmkKKwkJYnJlYWsKKwlmaQorZG9uZQoraWYgdGVzdCAkY29tbWFuZGNvbXBsZXRlZCAtZXEgMAordGhlbgorCWVjaG8gR3JhY2UgcGVyaW9kIGZvciBxZW11IGpvYiBhdCBwaWQgJHFlbXVfcGlkCisJZm9yICgoaT0wO2k8PSRncmFjZTtpKyspKQorCWRvCisJCWlmIGtpbGwgLTAgJHFlbXVfcGlkID4gL2Rldi9udWxsIDI+JjEKKwkJdGhlbgorCQkJc2xlZXAgMQorCQllbHNlCisJCQlicmVhaworCQlmaQorCQlpZiB0ZXN0ICRpIC1lcSAkZ3JhY2UKKwkJdGhlbgorCQkJa3J1bnRpbWU9YGF3ayAnQkVHSU4geyBwcmludCBzeXN0aW1lKCkgLSAnIiRrc3RhcnR0aW1lIicgfSdgCisJCQllY2hvICIhISEgSGFuZyBhdCAka3J1bnRpbWUgdnMuICRzZWNvbmRzIHNlY29uZHMiID4+ICRyZXNkaXIvV2FybmluZ3MgMj4mMQorCQkJa2lsbCAtS0lMTCAkcWVtdV9waWQKKwkJZmkKKwlkb25lCitmaQorCitjcCAkYnVpbGRkaXIvY29uc29sZS5sb2cgJHJlc2RpcgorcGFyc2UtJHtUT1JUVVJFX1NVSVRFfXRvcnR1cmUuc2ggJHJlc2Rpci9jb25zb2xlLmxvZyAkdGl0bGUKK3BhcnNlLWNvbnNvbGUuc2ggJHJlc2Rpci9jb25zb2xlLmxvZyAkdGl0bGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS5zaAppbmRleCAxYjc5MjNiLi41YTc4Y2JmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0uc2gKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLnNoCkBAIC0zMCwxNCArMzAsMjEgQEAKIHNjcmlwdG5hbWU9JDAKIGFyZ3M9IiQqIgogCitUPS90bXAva3ZtLnNoLiQkCit0cmFwICdybSAtcmYgJFQnIDAKK21rZGlyICRUCisKIGR1cj0zMAorZHJ5cnVuPSIiCiBLVk09ImBwd2RgL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUiOyBleHBvcnQgS1ZNCiBQQVRIPSR7S1ZNfS9iaW46JFBBVEg7IGV4cG9ydCBQQVRICiBidWlsZGRpcj0iJHtLVk19L2IxIgogUkNVX0lOSVRSRD0iJEtWTS9pbml0cmQiOyBleHBvcnQgUkNVX0lOSVRSRAogUkNVX0tNQUtFX0FSRz0iIjsgZXhwb3J0IFJDVV9LTUFLRV9BUkcKK1RPUlRVUkVfU1VJVEU9cmN1CiByZXNkaXI9IiIKIGNvbmZpZ3M9IiIKK2NwdXM9MAogZHM9YGRhdGUgKyVZLiVtLiVkLSVIOiVNOiVTYAoga3ZlcnNpb249IiIKIApAQCAtNDksNyArNTYsOSBAQAogCWVjaG8gIiAgICAgICAtLWJ1aWxkZGlyIGFic29sdXRlLXBhdGhuYW1lIgogCWVjaG8gIiAgICAgICAtLWJ1aWxkb25seSIKIAllY2hvICIgICAgICAgLS1jb25maWdzIFwiY29uZmlnLWZpbGUgbGlzdFwiIgorCWVjaG8gIiAgICAgICAtLWNwdXMgTiIKIAllY2hvICIgICAgICAgLS1kYXRlc3RhbXAgc3RyaW5nIgorCWVjaG8gIiAgICAgICAtLWRyeXJ1biBzY2hlZHxzY3JpcHQiCiAJZWNobyAiICAgICAgIC0tZHVyYXRpb24gbWludXRlcyIKIAllY2hvICIgICAgICAgLS1pbnRlcmFjdGl2ZSIKIAllY2hvICIgICAgICAgLS1rbWFrZS1hcmcga2VybmVsLW1ha2UtYXJndW1lbnRzIgpAQCAtNTgsOCArNjcsOSBAQAogCWVjaG8gIiAgICAgICAtLW5vLWluaXRyZCIKIAllY2hvICIgICAgICAgLS1xZW11LWFyZ3MgcWVtdS1zeXN0ZW0tLi4uIgogCWVjaG8gIiAgICAgICAtLXFlbXUtY21kIHFlbXUtc3lzdGVtLS4uLiIKLQllY2hvICIgICAgICAgLS1yZXN1bHRzIGFic29sdXRlLXBhdGhuYW1lIgogCWVjaG8gIiAgICAgICAtLXJlbGJ1aWxkZGlyIHJlbGF0aXZlLXBhdGhuYW1lIgorCWVjaG8gIiAgICAgICAtLXJlc3VsdHMgYWJzb2x1dGUtcGF0aG5hbWUiCisJZWNobyAiICAgICAgIC0tdG9ydHVyZSByY3UiCiAJZXhpdCAxCiB9CiAKQEAgLTg1LDExICs5NSwyMSBAQAogCQljb25maWdzPSIkMiIKIAkJc2hpZnQKIAkJOzsKKwktLWNwdXMpCisJCWNoZWNrYXJnIC0tY3B1cyAiKG51bWJlcikiICIkIyIgIiQyIiAnXlswLTldKiQnICdeLS0nCisJCWNwdXM9JDIKKwkJc2hpZnQKKwkJOzsKIAktLWRhdGVzdGFtcCkKIAkJY2hlY2thcmcgLS1kYXRlc3RhbXAgIihyZWxhdGl2ZSBwYXRobmFtZSkiICIkIyIgIiQyIiAnXlteL10qJCcgJ14tLScKIAkJZHM9JDIKIAkJc2hpZnQKIAkJOzsKKwktLWRyeXJ1bikKKwkJY2hlY2thcmcgLS1kcnlydW4gInNjaGVkfHNjcmlwdCIgJCMgIiQyIiAnc2NoZWRcfHNjcmlwdCcgJ14tLScKKwkJZHJ5cnVuPSQyCisJCXNoaWZ0CisJCTs7CiAJLS1kdXJhdGlvbikKIAkJY2hlY2thcmcgLS1kdXJhdGlvbiAiKG1pbnV0ZXMpIiAkIyAiJDIiICdeWzAtOV0qJCcgJ15lcnJvcicKIAkJZHVyPSQyCkBAIC0xMzgsNiArMTU4LDExIEBACiAJCXJlc2Rpcj0kMgogCQlzaGlmdAogCQk7OworCS0tdG9ydHVyZSkKKwkJY2hlY2thcmcgLS10b3J0dXJlICIoc3VpdGUgbmFtZSkiICIkIyIgIiQyIiAnXlwobG9ja1x8cmN1XCkkJyAnXi0tJworCQlUT1JUVVJFX1NVSVRFPSQyCisJCXNoaWZ0CisJCTs7CiAJKikKIAkJZWNobyBVbmtub3duIGFyZ3VtZW50ICQxCiAJCXVzYWdlCkBAIC0xNDYsNyArMTcxLDcgQEAKIAlzaGlmdAogZG9uZQogCi1DT05GSUdGUkFHPSR7S1ZNfS9jb25maWdzOyBleHBvcnQgQ09ORklHRlJBRworQ09ORklHRlJBRz0ke0tWTX0vY29uZmlncy8ke1RPUlRVUkVfU1VJVEV9OyBleHBvcnQgQ09ORklHRlJBRwogS1ZQQVRIPSR7Q09ORklHRlJBR30vJGt2ZXJzaW9uOyBleHBvcnQgS1ZQQVRICiAKIGlmIHRlc3QgLXogIiRjb25maWdzIgpAQCAtMTU3LDU0ICsxODIsMjMxIEBACiBpZiB0ZXN0IC16ICIkcmVzZGlyIgogdGhlbgogCXJlc2Rpcj0kS1ZNL3JlcwotCWlmICEgdGVzdCAtZSAkcmVzZGlyCi0JdGhlbgotCQlta2RpciAkcmVzZGlyIHx8IDoKLQlmaQotZWxzZQorZmkKKworaWYgdGVzdCAiJGRyeXJ1biIgPSAiIgordGhlbgogCWlmICEgdGVzdCAtZSAkcmVzZGlyCiAJdGhlbgogCQlta2RpciAtcCAiJHJlc2RpciIgfHwgOgogCWZpCi1maQotbWtkaXIgJHJlc2Rpci8kZHMKLXRvdWNoICRyZXNkaXIvJGRzL2xvZwotZWNobyAkc2NyaXB0bmFtZSAkYXJncyA+PiAkcmVzZGlyLyRkcy9sb2cKKwlta2RpciAkcmVzZGlyLyRkcwogCi1wd2QgPiAkcmVzZGlyLyRkcy90ZXN0aWQudHh0Ci1pZiB0ZXN0IC1kIC5naXQKLXRoZW4KLQlnaXQgc3RhdHVzID4+ICRyZXNkaXIvJGRzL3Rlc3RpZC50eHQKLQlnaXQgcmV2LXBhcnNlIEhFQUQgPj4gJHJlc2Rpci8kZHMvdGVzdGlkLnR4dAotZmkKLWJ1aWxkZGlyPSRLVk0vYjEKLWlmICEgdGVzdCAtZSAkYnVpbGRkaXIKLXRoZW4KLQlta2RpciAkYnVpbGRkaXIgfHwgOgorCSMgQmUgbm9pc3kgb25seSBpZiBydW5uaW5nIHRoZSBzY3JpcHQuCisJZWNobyBSZXN1bHRzIGRpcmVjdG9yeTogJHJlc2Rpci8kZHMKKwllY2hvICRzY3JpcHRuYW1lICRhcmdzCisKKwl0b3VjaCAkcmVzZGlyLyRkcy9sb2cKKwllY2hvICRzY3JpcHRuYW1lICRhcmdzID4+ICRyZXNkaXIvJGRzL2xvZworCWVjaG8gJHtUT1JUVVJFX1NVSVRFfSA+ICRyZXNkaXIvJGRzL1RPUlRVUkVfU1VJVEUKKworCXB3ZCA+ICRyZXNkaXIvJGRzL3Rlc3RpZC50eHQKKwlpZiB0ZXN0IC1kIC5naXQKKwl0aGVuCisJCWdpdCBzdGF0dXMgPj4gJHJlc2Rpci8kZHMvdGVzdGlkLnR4dAorCQlnaXQgcmV2LXBhcnNlIEhFQUQgPj4gJHJlc2Rpci8kZHMvdGVzdGlkLnR4dAorCWZpCiBmaQogCisjIENyZWF0ZSBhIGZpbGUgb2YgdGVzdC1uYW1lLyNjcHVzIHBhaXJzLCBzb3J0ZWQgYnkgZGVjcmVhc2luZyAjY3B1cy4KK3RvdWNoICRUL2NmZ2NwdQogZm9yIENGIGluICRjb25maWdzCiBkbwotCSMgUnVubmluZyBUUkVFMDEgbXVsdGlwbGUgdGltZXMgY3JlYXRlcyBUUkVFMDEsIFRSRUUwMS4yLCBUUkVFMDEuMywgLi4uCi0JcmQ9JHJlc2Rpci8kZHMvJENGCi0JaWYgdGVzdCAtZCAiJHtyZH0iCisJaWYgdGVzdCAtZiAiJENPTkZJR0ZSQUcvJGt2ZXJzaW9uLyRDRiIKIAl0aGVuCi0JCW49ImBscyAtZCAiJHtyZH0iKiB8IGdyZXAgJ1wuWzAtOV1cKyQnIHwKLQkJCXNlZCAtZSAncy9eLipcLlwoWzAtOV1cK1wpL1wxLycgfAotCQkJc29ydCAtazFuIHwgdGFpbCAtMWAiCi0JCWlmIHRlc3QgLXogIiRuIgotCQl0aGVuCi0JCQlyZD0iJHtyZH0uMiIKLQkJZWxzZQotCQkJbj0iYGV4cHIgJG4gKyAxYCIKLQkJCXJkPSIke3JkfS4ke259IgotCQlmaQorCQllY2hvICRDRiBgY29uZmlnTlJfQ1BVUy5zaCAkQ09ORklHRlJBRy8ka3ZlcnNpb24vJENGYCA+PiAkVC9jZmdjcHUKKwllbHNlCisJCWVjaG8gIlRoZSAtLWNvbmZpZ3MgZmlsZSAkQ0YgZG9lcyBub3QgZXhpc3QsIHRlcm1pbmF0aW5nLiIKKwkJZXhpdCAxCiAJZmkKLQlta2RpciAiJHtyZH0iCi0JZWNobyBSZXN1bHRzIGRpcmVjdG9yeTogJHJkCi0Ja3ZtLXRlc3QtMS1yY3Uuc2ggJENPTkZJR0ZSQUcvJGt2ZXJzaW9uLyRDRiAkYnVpbGRkaXIgJHJkICRkdXIgIi1ub2dyYXBoaWMgJFJDVV9RRU1VX0FSRyIgInJjdXRvcnR1cmUudGVzdF9ub19pZGxlX2h6PTEgcmN1dG9ydHVyZS52ZXJib3NlPTEgJFJDVV9CT09UQVJHUyIKIGRvbmUKK3NvcnQgLWsybnIgJFQvY2ZnY3B1ID4gJFQvY2ZnY3B1LnNvcnQKKworIyBVc2UgYSBncmVlZHkgYmluLXBhY2tpbmcgYWxnb3JpdGhtLCBzb3J0aW5nIHRoZSBsaXN0IGFjY29yZGluZ2x5LgorYXdrIDwgJFQvY2ZnY3B1LnNvcnQgPiAkVC9jZmdjcHUucGFjayAtdiBuY3B1cz0kY3B1cyAnCitCRUdJTiB7CisJbmpvYnMgPSAwOworfQorCit7CisJIyBSZWFkIGZpbGUgb2YgdGVzdHMgYW5kIGNvcnJlc3BvbmRpbmcgcmVxdWlyZWQgbnVtYmVycyBvZiBDUFVzLgorCWNmW25qb2JzXSA9ICQxOworCWNwdXNbbmpvYnNdID0gJDI7CisJbmpvYnMrKzsKK30KKworRU5EIHsKKwlhbGxkb25lID0gMDsKKwliYXRjaCA9IDA7CisJbmMgPSAtMTsKKworCSMgRWFjaCBwYXNzIHRocm91Z2ggdGhlIGZvbGxvd2luZyBsb29wIGNyZWF0ZXMgb24gdGVzdCBiYXRjaAorCSMgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgY29uY3VycmVudGx5IGdpdmVuIG5jcHVzLiAgTm90ZSB0aGF0IGEKKwkjIGdpdmVuIHRlc3QgdGhhdCByZXF1aXJlcyBtb3JlIHRoYW4gdGhlIGF2YWlsYWJsZSBDUFVzIHdpbGwgcnVuIGluCisJIyB0aGVpciBvd24gYmF0Y2guICBTdWNoIHRlc3RzIGp1c3QgaGF2ZSB0byBtYWtlIGRvIHdpdGggd2hhdAorCSMgaXMgYXZhaWxhYmxlLgorCXdoaWxlIChuYyAhPSBuY3B1cykgeworCQliYXRjaCsrOworCQluYyA9IG5jcHVzOworCisJCSMgRWFjaCBwYXNzIHRocm91Z2ggdGhlIGZvbGxvd2luZyBsb29wIGNvbnNpZGVycyBvbmUKKwkJIyB0ZXN0IGZvciBpbmNsdXNpb24gaW4gdGhlIGN1cnJlbnQgYmF0Y2guCisJCWZvciAoaSA9IDA7IGkgPCBuam9iczsgaSsrKSB7CisJCQlpZiAoZG9uZVtpXSkKKwkJCQljb250aW51ZTsgIyBBbHJlYWR5IHBhcnQgb2YgYSBiYXRjaC4KKwkJCWlmIChuYyA+PSBjcHVzW2ldIHx8IG5jID09IG5jcHVzKSB7CisKKwkJCQkjIFRoaXMgdGVzdCBmaXRzIGludG8gdGhlIGN1cnJlbnQgYmF0Y2guCisJCQkJZG9uZVtpXSA9IGJhdGNoOworCQkJCW5jIC09IGNwdXNbaV07CisJCQkJaWYgKG5jIDw9IDApCisJCQkJCWJyZWFrOyAjIFRvby1iaWcgdGVzdCBpbiBpdHMgb3duIGJhdGNoLgorCQkJfQorCQl9CisJfQorCisJIyBEdW1wIG91dCB0aGUgdGVzdHMgaW4gYmF0Y2ggb3JkZXIuCisJZm9yIChiID0gMTsgYiA8PSBiYXRjaDsgYisrKQorCQlmb3IgKGkgPSAwOyBpIDwgbmpvYnM7IGkrKykKKwkJCWlmIChkb25lW2ldID09IGIpCisJCQkJcHJpbnQgY2ZbaV0sIGNwdXNbaV07Cit9JworCisjIEdlbmVyYXRlIGEgc2NyaXB0IHRvIGV4ZWN1dGUgdGhlIHRlc3RzIGluIGFwcHJvcHJpYXRlIGJhdGNoZXMuCitjYXQgPDwgX19fRU9GX19fID4gJFQvc2NyaXB0CitUT1JUVVJFX1NVSVRFPSIkVE9SVFVSRV9TVUlURSI7IGV4cG9ydCBUT1JUVVJFX1NVSVRFCitfX19FT0ZfX18KK2F3ayA8ICRUL2NmZ2NwdS5wYWNrIFwKKwktdiBDT05GSUdESVI9IiRDT05GSUdGUkFHLyRrdmVyc2lvbi8iIFwKKwktdiBLVk09IiRLVk0iIFwKKwktdiBuY3B1cz0kY3B1cyBcCisJLXYgcmQ9JHJlc2Rpci8kZHMvIFwKKwktdiBkdXI9JGR1ciBcCisJLXYgUkNVX1FFTVVfQVJHPSRSQ1VfUUVNVV9BUkcgXAorCS12IFJDVV9CT09UQVJHUz0kUkNVX0JPT1RBUkdTIFwKKydCRUdJTiB7CisJaSA9IDA7Cit9CisKK3sKKwljZltpXSA9ICQxOworCWNwdXNbaV0gPSAkMjsKKwlpKys7Cit9CisKKyMgRHVtcCBvdXQgdGhlIHNjcmlwdGluZyByZXF1aXJlZCB0byBydW4gb25lIHRlc3QgYmF0Y2guCitmdW5jdGlvbiBkdW1wKGZpcnN0LCBwYXN0bGFzdCkKK3sKKwlwcmludCAiZWNobyAtLS0tU3RhcnQgYmF0Y2g6IGBkYXRlYCI7CisJcHJpbnQgImVjaG8gLS0tLVN0YXJ0IGJhdGNoOiBgZGF0ZWAgPj4gIiByZCAiL2xvZyI7CisJam49MQorCWZvciAoaiA9IGZpcnN0OyBqIDwgcGFzdGxhc3Q7IGorKykgeworCQlidWlsZGRpcj1LVk0gIi9iIiBqbgorCQljcHVzcltqbl0gPSBjcHVzW2pdOworCQlpZiAoY2ZyZXBbY2Zbal1dID09ICIiKSB7CisJCQljZnJbam5dID0gY2Zbal07CisJCQljZnJlcFtjZltqXV0gPSAxOworCQl9IGVsc2UgeworCQkJY2ZyZXBbY2Zbal1dKys7CisJCQljZnJbam5dID0gY2Zbal0gIi4iIGNmcmVwW2NmW2pdXTsKKwkJfQorCQlpZiAoY3B1c3Jbam5dID4gbmNwdXMgJiYgbmNwdXMgIT0gMCkKKwkJCW92ZiA9ICIoISkiOworCQllbHNlCisJCQlvdmYgPSAiIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBTdGFydGluZyBidWlsZC4gYGRhdGVgIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBTdGFydGluZyBidWlsZC4gYGRhdGVgID4+ICIgcmQgIi9sb2ciOworCQlwcmludCAicm0gLWYgIiBidWlsZGRpciAiLioiOworCQlwcmludCAidG91Y2ggIiBidWlsZGRpciAiLndhaXQiOworCQlwcmludCAibWtkaXIgIiBidWlsZGRpciAiID4gL2Rldi9udWxsIDI+JjEgfHwgOiI7CisJCXByaW50ICJta2RpciAiIHJkIGNmcltqbl0gIiB8fCA6IjsKKwkJcHJpbnQgImt2bS10ZXN0LTEtcnVuLnNoICIgQ09ORklHRElSIGNmW2pdLCBidWlsZGRpciwgcmQgY2ZyW2puXSwgZHVyICIgXCIiIFJDVV9RRU1VX0FSRyAiXCIgXCIiIFJDVV9CT09UQVJHUyAiXCIgPiAiIHJkIGNmcltqbl0gICIva3ZtLXRlc3QtMS1ydW4uc2gub3V0IDI+JjEgJiIKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBXYWl0aW5nIGZvciBidWlsZCB0byBjb21wbGV0ZS4gYGRhdGVgIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBXYWl0aW5nIGZvciBidWlsZCB0byBjb21wbGV0ZS4gYGRhdGVgID4+ICIgcmQgIi9sb2ciOworCQlwcmludCAid2hpbGUgdGVzdCAtZiAiIGJ1aWxkZGlyICIud2FpdCIKKwkJcHJpbnQgImRvIgorCQlwcmludCAiXHRzbGVlcCAxIgorCQlwcmludCAiZG9uZSIKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBCdWlsZCBjb21wbGV0ZS4gYGRhdGVgIjsKKwkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBCdWlsZCBjb21wbGV0ZS4gYGRhdGVgID4+ICIgcmQgIi9sb2ciOworCQlqbisrOworCX0KKwlmb3IgKGogPSAxOyBqIDwgam47IGorKykgeworCQlidWlsZGRpcj1LVk0gIi9iIiBqCisJCXByaW50ICJybSAtZiAiIGJ1aWxkZGlyICIucmVhZHkiCisJCXByaW50ICJlY2hvIC0tLS0iLCBjZnJbal0sIGNwdXNyW2pdIG92ZiAiOiBTdGFydGluZyBrZXJuZWwuIGBkYXRlYCI7CisJCXByaW50ICJlY2hvIC0tLS0iLCBjZnJbal0sIGNwdXNyW2pdIG92ZiAiOiBTdGFydGluZyBrZXJuZWwuIGBkYXRlYCA+PiAiIHJkICIvbG9nIjsKKwl9CisJcHJpbnQgIndhaXQiCisJcHJpbnQgImVjaG8gLS0tLSBBbGwga2VybmVsIHJ1bnMgY29tcGxldGUuIGBkYXRlYCI7CisJcHJpbnQgImVjaG8gLS0tLSBBbGwga2VybmVsIHJ1bnMgY29tcGxldGUuIGBkYXRlYCA+PiAiIHJkICIvbG9nIjsKKwlmb3IgKGogPSAxOyBqIDwgam47IGorKykgeworCQlidWlsZGRpcj1LVk0gIi9iIiBqCisJCXByaW50ICJlY2hvIC0tLS0iLCBjZnJbal0sIGNwdXNyW2pdIG92ZiAiOiBCdWlsZC9ydW4gcmVzdWx0czoiOworCQlwcmludCAiZWNobyAtLS0tIiwgY2ZyW2pdLCBjcHVzcltqXSBvdmYgIjogQnVpbGQvcnVuIHJlc3VsdHM6ID4+ICIgcmQgIi9sb2ciOworCQlwcmludCAiY2F0ICIgcmQgY2ZyW2pdICAiL2t2bS10ZXN0LTEtcnVuLnNoLm91dCI7CisJCXByaW50ICJjYXQgIiByZCBjZnJbal0gICIva3ZtLXRlc3QtMS1ydW4uc2gub3V0ID4+ICIgcmQgIi9sb2ciOworCX0KK30KKworRU5EIHsKKwluam9icyA9IGk7CisJbmMgPSBuY3B1czsKKwlmaXJzdCA9IDA7CisKKwkjIEVhY2ggcGFzcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbG9vcCBjb25zaWRlcnMgb25lIHRlc3QuCisJZm9yIChpID0gMDsgaSA8IG5qb2JzOyBpKyspIHsKKwkJaWYgKG5jcHVzID09IDApIHsKKwkJCSMgU2VxdWVudGlhbCB0ZXN0IHNwZWNpZmllZCwgZWFjaCB0ZXN0IGl0cyBvd24gYmF0Y2guCisJCQlkdW1wKGksIGkgKyAxKTsKKwkJCWZpcnN0ID0gaTsKKwkJfSBlbHNlIGlmIChuYyA8IGNwdXNbaV0gJiYgaSAhPSAwKSB7CisJCQkjIE91dCBvZiBDUFVzLCBkdW1wIG91dCBhIGJhdGNoLgorCQkJZHVtcChmaXJzdCwgaSk7CisJCQlmaXJzdCA9IGk7CisJCQluYyA9IG5jcHVzOworCQl9CisJCSMgQWNjb3VudCBmb3IgdGhlIENQVXMgbmVlZGVkIGJ5IHRoZSBjdXJyZW50IHRlc3QuCisJCW5jIC09IGNwdXNbaV07CisJfQorCSMgRHVtcCB0aGUgbGFzdCBiYXRjaC4KKwlpZiAobmNwdXMgIT0gMCkKKwkJZHVtcChmaXJzdCwgaSk7Cit9JyA+PiAkVC9zY3JpcHQKKworaWYgdGVzdCAiJGRyeXJ1biIgPSBzY3JpcHQKK3RoZW4KKwkjIER1bXAgb3V0IHRoZSBzY3JpcHQsIGJ1dCBkZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0CisJIyBpdCBuZWVkcyB0byBydW4gc3RhbmRhbG9uZS4KKwllY2hvIENPTkZJR0ZSQUc9IiRDT05GSUdGUkFHOyBleHBvcnQgQ09ORklHRlJBRyIKKwllY2hvIEtWTT0iJEtWTTsgZXhwb3J0IEtWTSIKKwllY2hvIEtWUEFUSD0iJEtWUEFUSDsgZXhwb3J0IEtWUEFUSCIKKwllY2hvIFBBVEg9IiRQQVRIOyBleHBvcnQgUEFUSCIKKwllY2hvIFJDVV9CVUlMRE9OTFk9IiRSQ1VfQlVJTERPTkxZOyBleHBvcnQgUkNVX0JVSUxET05MWSIKKwllY2hvIFJDVV9JTklUUkQ9IiRSQ1VfSU5JVFJEOyBleHBvcnQgUkNVX0lOSVRSRCIKKwllY2hvIFJDVV9LTUFLRV9BUkc9IiRSQ1VfS01BS0VfQVJHOyBleHBvcnQgUkNVX0tNQUtFX0FSRyIKKwllY2hvIFJDVV9RRU1VX0NNRD0iJFJDVV9RRU1VX0NNRDsgZXhwb3J0IFJDVV9RRU1VX0NNRCIKKwllY2hvIFJDVV9RRU1VX0lOVEVSQUNUSVZFPSIkUkNVX1FFTVVfSU5URVJBQ1RJVkU7IGV4cG9ydCBSQ1VfUUVNVV9JTlRFUkFDVElWRSIKKwllY2hvIFJDVV9RRU1VX01BQz0iJFJDVV9RRU1VX01BQzsgZXhwb3J0IFJDVV9RRU1VX01BQyIKKwllY2hvICJta2RpciAtcCAiJHJlc2RpciIgfHwgOiIKKwllY2hvICJta2RpciAkcmVzZGlyLyRkcyIKKwljYXQgJFQvc2NyaXB0CisJZXhpdCAwCitlbGlmIHRlc3QgIiRkcnlydW4iID0gc2NoZWQKK3RoZW4KKwkjIEV4dHJhY3QgdGhlIHRlc3QgcnVuIHNjaGVkdWxlIGZyb20gdGhlIHNjcmlwdC4KKwllZ3JlcCAnc3RhcnQgYmF0Y2h8U3RhcnRpbmcgYnVpbGRcLicgJFQvc2NyaXB0IHwKKwkJc2VkIC1lICdzLzouKiQvLycgLWUgJ3MvXmVjaG8gLy8nCisJZXhpdCAwCitlbHNlCisJIyBOb3QgYSBkcnlydSwgc28gcnVuIHRoZSBzY3JpcHQuCisJc2ggJFQvc2NyaXB0CitmaQorCiAjIFRyYWNpbmc6IHRyYWNlX2V2ZW50PXJjdTpyY3VfZ3JhY2VfcGVyaW9kLHJjdTpyY3VfZnV0dXJlX2dyYWNlX3BlcmlvZCxyY3U6cmN1X2dyYWNlX3BlcmlvZF9pbml0LHJjdTpyY3Vfbm9jYl93YWtlLHJjdTpyY3VfcHJlZW1wdF90YXNrLHJjdTpyY3VfdW5sb2NrX3ByZWVtcHRlZF90YXNrLHJjdTpyY3VfcXVpZXNjZW50X3N0YXRlX3JlcG9ydCxyY3U6cmN1X2ZxcyxyY3U6cmN1X2NhbGxiYWNrLHJjdTpyY3Vfa2ZyZWVfY2FsbGJhY2sscmN1OnJjdV9iYXRjaF9zdGFydCxyY3U6cmN1X2ludm9rZV9jYWxsYmFjayxyY3U6cmN1X2ludm9rZV9rZnJlZV9jYWxsYmFjayxyY3U6cmN1X2JhdGNoX2VuZCxyY3U6cmN1X3RvcnR1cmVfcmVhZCxyY3U6cmN1X2JhcnJpZXIKIAorZWNobworZWNobwogZWNobyAiIC0tLSBgZGF0ZWAgVGVzdCBzdW1tYXJ5OiIKK2VjaG8gUmVzdWx0cyBkaXJlY3Rvcnk6ICRyZXNkaXIvJGRzCiBrdm0tcmVjaGVjay5zaCAkcmVzZGlyLyRkcwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtTiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9TUkNVLU4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTBlMjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtTgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTgKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUFJFRU1QVF9OT05FPXkKLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9TUkNVLVAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTBlMDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1NSQ1UtUAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTgKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUFJFRU1QVF9OT05FPW4KLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9USU5ZMDEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjgyM2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUNPTkZJR19TTVA9bgotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19USU5ZX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfREVCVUdfTE9DS19BTExPQz1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJFRU1QVF9DT1VOVD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9USU5ZMDIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDcyZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RJTlkwMgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUNPTkZJR19TTVA9bgotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19USU5ZX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9eQotQ09ORklHX05PX0haX0lETEU9bgotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9UUkFDRT15Ci1DT05GSUdfREVCVUdfTE9DS19BTExPQz15Ci1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJFRU1QVF9DT1VOVD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTExOWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT1uCi1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9eQotI0NIRUNLI0NPTkZJR19UUkVFX1BSRUVNUFRfUkNVPXkKLUNPTkZJR19IWl9QRVJJT0RJQz1uCi1DT05GSUdfTk9fSFpfSURMRT15Ci1DT05GSUdfTk9fSFpfRlVMTD1uCi1DT05GSUdfUkNVX0ZBU1RfTk9fSFo9eQotQ09ORklHX1JDVV9UUkFDRT15Ci1DT05GSUdfSE9UUExVR19DUFU9eQotQ09ORklHX1JDVV9GQU5PVVQ9OAotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgotQ09ORklHX1JDVV9OT0NCX0NQVT15Ci1DT05GSUdfUkNVX05PQ0JfQ1BVX1pFUk89eQotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX1JDVV9CT09TVD1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQwOTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT1uCi1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9eQotI0NIRUNLI0NPTkZJR19UUkVFX1BSRUVNUFRfUkNVPXkKLUNPTkZJR19IWl9QRVJJT0RJQz1uCi1DT05GSUdfTk9fSFpfSURMRT15Ci1DT05GSUdfTk9fSFpfRlVMTD1uCi1DT05GSUdfUkNVX0ZBU1RfTk9fSFo9biAKLUNPTkZJR19SQ1VfVFJBQ0U9bgotQ09ORklHX0hPVFBMVUdfQ1BVPW4KLUNPTkZJR19TVVNQRU5EPW4KLUNPTkZJR19ISUJFUk5BVElPTj1uCi1DT05GSUdfUkNVX0ZBTk9VVD0zCi1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTMKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQotQ09ORklHX1BST1ZFX0xPQ0tJTkc9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9eQotQ09ORklHX1JDVV9CT09TVD1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2RlNWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwMworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT1uCi1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9eQotI0NIRUNLI0NPTkZJR19UUkVFX1BSRUVNUFRfUkNVPXkKLUNPTkZJR19IWl9QRVJJT0RJQz15Ci1DT05GSUdfTk9fSFpfSURMRT1uCi1DT05GSUdfTk9fSFpfRlVMTD1uCi1DT05GSUdfUkNVX1RSQUNFPXkKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUkNVX0ZBTk9VVD00Ci1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTQKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX1JDVV9CT09TVD15Ci1DT05GSUdfUkNVX0JPT1NUX1BSSU89MgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDQgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDgzOWI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTgKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KLUNPTkZJR19QUkVFTVBUPW4KLSNDSEVDSyNDT05GSUdfVFJFRV9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPW4KLUNPTkZJR19OT19IWl9GVUxMPXkKLUNPTkZJR19OT19IWl9GVUxMX0FMTD15Ci1DT05GSUdfUkNVX0ZBU1RfTk9fSFo9eQotQ09ORklHX1JDVV9UUkFDRT15Ci1DT05GSUdfSE9UUExVR19DUFU9bgotQ09ORklHX1NVU1BFTkQ9bgotQ09ORklHX0hJQkVSTkFUSU9OPW4KLUNPTkZJR19SQ1VfRkFOT1VUPTIKLUNPTkZJR19SQ1VfRkFOT1VUX0xFQUY9MgotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgotQ09ORklHX1JDVV9OT0NCX0NQVT1uCi1DT05GSUdfREVCVUdfTE9DS19BTExPQz1uCi1DT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89eQotQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT15Ci1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmE3MmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9GQVNUX05PX0haPW4KLUNPTkZJR19SQ1VfVFJBQ0U9bgotQ09ORklHX0hPVFBMVUdfQ1BVPXkKLUNPTkZJR19SQ1VfRkFOT1VUPTYKLUNPTkZJR19SQ1VfRkFOT1VUX0xFQUY9NgotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgotQ09ORklHX1JDVV9OT0NCX0NQVT15Ci1DT05GSUdfUkNVX05PQ0JfQ1BVX05PTkU9eQotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQotQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQotQ09ORklHX1BST1ZFX1JDVT15Ci1DT05GSUdfUFJPVkVfUkNVX0RFTEFZPXkKLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgotQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTVhYjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9OAotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgotQ09ORklHX1BSRUVNUFQ9bgotI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9GQVNUX05PX0haPW4KLUNPTkZJR19SQ1VfVFJBQ0U9bgotQ09ORklHX0hPVFBMVUdfQ1BVPW4KLUNPTkZJR19TVVNQRU5EPW4KLUNPTkZJR19ISUJFUk5BVElPTj1uCi1DT05GSUdfUkNVX0ZBTk9VVD02Ci1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTYKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPXkKLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQotQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQotQ09ORklHX1BST1ZFX1JDVT15Ci1DT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgotQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD15Ci1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Njc0MDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL1RSRUUwNworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUNPTkZJR19TTVA9eQotQ09ORklHX05SX0NQVVM9MTYKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KLUNPTkZJR19QUkVFTVBUPW4KLSNDSEVDSyNDT05GSUdfVFJFRV9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPW4KLUNPTkZJR19OT19IWl9GVUxMPXkKLUNPTkZJR19OT19IWl9GVUxMX0FMTD15Ci1DT05GSUdfTk9fSFpfRlVMTF9TWVNJRExFPXkKLUNPTkZJR19SQ1VfRkFTVF9OT19IWj1uCi1DT05GSUdfUkNVX1RSQUNFPXkKLUNPTkZJR19IT1RQTFVHX0NQVT15Ci1DT05GSUdfUkNVX0ZBTk9VVD0yCi1DT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTIKLUNPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPXkKLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA5N2E2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTE2Ci1DT05GSUdfUFJFRU1QVF9OT05FPW4KLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD15Ci0jQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPXkKLUNPTkZJR19OT19IWl9GVUxMPW4KLUNPTkZJR19SQ1VfRkFTVF9OT19IWj1uCi1DT05GSUdfUkNVX1RSQUNFPW4KLUNPTkZJR19IT1RQTFVHX0NQVT1uCi1DT05GSUdfU1VTUEVORD1uCi1DT05GSUdfSElCRVJOQVRJT049bgotQ09ORklHX1JDVV9GQU5PVVQ9MwotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9eQotQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCi1DT05GSUdfUkNVX05PQ0JfQ1BVPXkKLUNPTkZJR19SQ1VfTk9DQl9DUFVfQUxMPXkKLUNPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KLUNPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgotQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KLUNPTkZJR19SQ1VfQk9PU1Q9bgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDgtVCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDgtVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyYzRlNC4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA4LVQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTE2Ci1DT05GSUdfUFJFRU1QVF9OT05FPW4KLUNPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCi1DT05GSUdfUFJFRU1QVD15Ci0jQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQotQ09ORklHX0haX1BFUklPRElDPW4KLUNPTkZJR19OT19IWl9JRExFPXkKLUNPTkZJR19OT19IWl9GVUxMPW4KLUNPTkZJR19SQ1VfRkFTVF9OT19IWj1uCi1DT05GSUdfUkNVX1RSQUNFPXkKLUNPTkZJR19IT1RQTFVHX0NQVT1uCi1DT05GSUdfU1VTUEVORD1uCi1DT05GSUdfSElCRVJOQVRJT049bgotQ09ORklHX1JDVV9GQU5PVVQ9MwotQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9eQotQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCi1DT05GSUdfUkNVX05PQ0JfQ1BVPXkKLUNPTkZJR19SQ1VfTk9DQl9DUFVfQUxMPXkKLUNPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KLUNPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgotQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KLUNPTkZJR19SQ1VfQk9PU1Q9bgotQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgotQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDFlYzBkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1DT05GSUdfU01QPW4KLUNPTkZJR19OUl9DUFVTPTEKLUNPTkZJR19QUkVFTVBUX05PTkU9bgotQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KLUNPTkZJR19QUkVFTVBUPXkKLSNDSEVDSyNDT05GSUdfVFJFRV9QUkVFTVBUX1JDVT15Ci1DT05GSUdfSFpfUEVSSU9ESUM9bgotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haX0ZVTEw9bgotQ09ORklHX1JDVV9UUkFDRT1uCi1DT05GSUdfSE9UUExVR19DUFU9bgotQ09ORklHX1NVU1BFTkQ9bgotQ09ORklHX0hJQkVSTkFUSU9OPW4KLUNPTkZJR19SQ1VfTk9DQl9DUFU9bgotQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgotQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCi1DT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KLUNPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgotQ09ORklHX1JDVV9CT09TVD1uCi1DT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCi1DT05GSUdfUFJJTlRLX1RJTUU9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQlVTVEVEIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQlVTVEVECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMWRhMTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9CVVNURUQKQEAgLTAsMCArMSw2IEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTQKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9CVVNURUQuYm9vdCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0JVU1RFRC5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODZjMTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9CVVNURUQuYm9vdApAQCAtMCwwICsxIEBACitsb2NrdG9ydHVyZS50b3J0dXJlX3R5cGU9bG9ja19idXN0ZWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0NGTElTVCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0NGTElTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDYxYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQ0ZMSVNUCkBAIC0wLDAgKzEgQEAKK0xPQ0swMQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQ0Zjb21tb24gYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvbG9jay9DRmNvbW1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzcyZGMyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svQ0Zjb21tb24KQEAgLTAsMCArMSwyIEBACitDT05GSUdfTE9DS19UT1JUVVJFX1RFU1Q9eQorQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0xPQ0swMSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL0xPQ0swMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTYyNWUzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svTE9DSzAxCkBAIC0wLDAgKzEsNiBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfSE9UUExVR19DUFU9eQorQ09ORklHX1BSRUVNUFRfTk9ORT1uCitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL2xvY2svdmVyX2Z1bmN0aW9ucy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NmVhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9sb2NrL3Zlcl9mdW5jdGlvbnMuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgS2VybmVsLXZlcnNpb24tZGVwZW5kZW50IHNoZWxsIGZ1bmN0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdHMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAorIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgorIworIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxNAorIworIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KKworIyBsb2NrdG9ydHVyZV9wYXJhbV9vbm9mZiBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlCisjCisjIEFkZHMgb25vZmYgbG9ja3RvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCitsb2NrdG9ydHVyZV9wYXJhbV9vbm9mZiAoKSB7CisJaWYgISBib290cGFyYW1faG90cGx1Z19jcHUgIiQxIiAmJiBjb25maWdmcmFnX2hvdHBsdWdfY3B1ICIkMiIKKwl0aGVuCisJCWVjaG8gQ1BVLWhvdHBsdWcga2VybmVsLCBhZGRpbmcgbG9ja3RvcnR1cmUgb25vZmYuIDE+JjIKKwkJZWNobyBsb2NrdG9ydHVyZS5vbm9mZl9pbnRlcnZhbD0zIGxvY2t0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKKwlmaQorfQorCisjIHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUgc2Vjb25kcworIworIyBBZGRzIHBlci12ZXJzaW9uIHRvcnR1cmUtbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBzdXBwb3J0aW5nIHRoZW0uCitwZXJfdmVyc2lvbl9ib290X3BhcmFtcyAoKSB7CisJZWNobyAkMSBgbG9ja3RvcnR1cmVfcGFyYW1fb25vZmYgIiQxIiAiJDIiYCBcCisJCWxvY2t0b3J0dXJlLnN0YXRfaW50ZXJ2YWw9MTUgXAorCQlsb2NrdG9ydHVyZS5zaHV0ZG93bl9zZWNzPSQzIFwKKwkJbG9ja3RvcnR1cmUubG9ja3RvcnR1cmVfcnVubmFibGU9MSBcCisJCWxvY2t0b3J0dXJlLnZlcmJvc2U9MQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9CVVNURUQgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0JVU1RFRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQ4YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9CVVNURUQKQEAgLTAsMCArMSw3IEBACitDT05GSUdfUkNVX1RSQUNFPW4KK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9NAorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19QUkVFTVBUX05PTkU9bgorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvQlVTVEVELmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0JVU1RFRC5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDRmOWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0JVU1RFRC5ib290CkBAIC0wLDAgKzEgQEAKK3JjdXRvcnR1cmUudG9ydHVyZV90eXBlPXJjdV9idXN0ZWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9DRkxJU1QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL0NGTElTVApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9DRkxJU1QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvQ0Zjb21tb24gYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0NGY29tbW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDJhODYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0NGY29tbW9uCkBAIC0wLDAgKzEsMiBAQAorQ09ORklHX1JDVV9UT1JUVVJFX1RFU1Q9eQorQ09ORklHX1BSSU5US19USU1FPXkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1OIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9TUkNVLU4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiYjQxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1OCkBAIC0wLDAgKzEsNyBAQAorQ09ORklHX1JDVV9UUkFDRT1uCitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTQKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUFJFRU1QVF9OT05FPXkKK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1OLmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1NSQ1UtTi5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1OLmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1OLmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1QIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9TUkNVLVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2ZjI3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1QCkBAIC0wLDAgKzEsNyBAQAorQ09ORklHX1JDVV9UUkFDRT1uCitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1QLmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1NSQ1UtUC5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvU1JDVS1QLmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvU1JDVS1QLmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVElOWTAxIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9USU5ZMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2M2UwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVElOWTAxCkBAIC0wLDAgKzEsMTIgQEAKK0NPTkZJR19TTVA9bgorQ09ORklHX1BSRUVNUFRfTk9ORT15CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9bgorI0NIRUNLI0NPTkZJR19USU5ZX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9UUkFDRT1uCitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCitDT05GSUdfUFJFRU1QVF9DT1VOVD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RJTlkwMiBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVElOWTAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmVhZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RJTlkwMgpAQCAtMCwwICsxLDEyIEBACitDT05GSUdfU01QPW4KK0NPTkZJR19QUkVFTVBUX05PTkU9eQorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPW4KKyNDSEVDSyNDT05GSUdfVElOWV9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPXkKK0NPTkZJR19OT19IWl9JRExFPW4KK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfVFJBQ0U9eQorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgorQ09ORklHX1BSRUVNUFRfQ09VTlQ9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDEgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzgyN2VjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDEKQEAgLTAsMCArMSwyMiBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfRkFTVF9OT19IWj15CitDT05GSUdfUkNVX1RSQUNFPXkKK0NPTkZJR19IT1RQTFVHX0NQVT15CitDT05GSUdfUkNVX0ZBTk9VVD04CitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFVfWkVSTz15CitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfUkNVX0JPT1NUPW4KK0NPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEPW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDEuYm9vdCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTAxLmJvb3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9UUkVFMDEuYm9vdApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDEuYm9vdApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDIgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTc3N2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDIKQEAgLTAsMCArMSwyNSBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfRkFTVF9OT19IWj1uCitDT05GSUdfUkNVX1RSQUNFPW4KK0NPTkZJR19IT1RQTFVHX0NQVT1uCitDT05GSUdfU1VTUEVORD1uCitDT05GSUdfSElCRVJOQVRJT049bgorQ09ORklHX1JDVV9GQU5PVVQ9MworQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0zCitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPW4KK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPXkKK0NPTkZJR19QUk9WRV9MT0NLSU5HPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPXkKK0NPTkZJR19SQ1VfQk9PU1Q9bgorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWYxMTFjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDMKQEAgLTAsMCArMSwyMiBAQAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPXkKK0NPTkZJR19OT19IWl9JRExFPW4KK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfVFJBQ0U9eQorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19SQ1VfRkFOT1VUPTQKK0NPTkZJR19SQ1VfRkFOT1VUX0xFQUY9NAorQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgorQ09ORklHX1JDVV9OT0NCX0NQVT1uCitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfUkNVX0JPT1NUPXkKK0NPTkZJR19SQ1VfQk9PU1RfUFJJTz0yCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmQyN2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNApAQCAtMCwwICsxLDI0IEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPW4KKyNDSEVDSyNDT05GSUdfVFJFRV9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPW4KK0NPTkZJR19OT19IWl9GVUxMPXkKK0NPTkZJR19OT19IWl9GVUxMX0FMTD15CitDT05GSUdfUkNVX0ZBU1RfTk9fSFo9eQorQ09ORklHX1JDVV9UUkFDRT15CitDT05GSUdfSE9UUExVR19DUFU9bgorQ09ORklHX1NVU1BFTkQ9bgorQ09ORklHX0hJQkVSTkFUSU9OPW4KK0NPTkZJR19SQ1VfRkFOT1VUPTIKK0NPTkZJR19SQ1VfRkFOT1VUX0xFQUY9MgorQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgorQ09ORklHX1JDVV9OT0NCX0NQVT1uCitDT05GSUdfREVCVUdfTE9DS19BTExPQz1uCitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89eQorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT15CitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA0LmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNC5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA0LmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA0LmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA1IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmMzJlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA1CkBAIC0wLDAgKzEsMjQgQEAKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9OAorQ09ORklHX1BSRUVNUFRfTk9ORT15CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9bgorI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9GQVNUX05PX0haPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19SQ1VfRkFOT1VUPTYKK0NPTkZJR19SQ1VfRkFOT1VUX0xFQUY9NgorQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9bgorQ09ORklHX1JDVV9OT0NCX0NQVT15CitDT05GSUdfUkNVX05PQ0JfQ1BVX05PTkU9eQorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQorQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQorQ09ORklHX1BST1ZFX1JDVT15CitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPXkKK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA1LmJvb3QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNS5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvVFJFRTA1LmJvb3QKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA1LmJvb3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA2IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0NzdkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA2CkBAIC0wLDAgKzEsMjUgQEAKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9OAorQ09ORklHX1BSRUVNUFRfTk9ORT15CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9bgorQ09ORklHX1BSRUVNUFQ9bgorI0NIRUNLI0NPTkZJR19UUkVFX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9GQVNUX05PX0haPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPW4KK0NPTkZJR19TVVNQRU5EPW4KK0NPTkZJR19ISUJFUk5BVElPTj1uCitDT05GSUdfUkNVX0ZBTk9VVD02CitDT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTYKK0NPTkZJR19SQ1VfRkFOT1VUX0VYQUNUPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFU9bgorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQorQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQorQ09ORklHX1BST1ZFX1JDVT15CitDT05GSUdfUFJPVkVfUkNVX0RFTEFZPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX0lORk89bgorQ09ORklHX1JDVV9DUFVfU1RBTExfVkVSQk9TRT1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MmY4NmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwNwpAQCAtMCwwICsxLDIzIEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTE2CitDT05GSUdfUFJFRU1QVF9OT05FPXkKK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD1uCisjQ0hFQ0sjQ09ORklHX1RSRUVfUkNVPXkKK0NPTkZJR19IWl9QRVJJT0RJQz1uCitDT05GSUdfTk9fSFpfSURMRT1uCitDT05GSUdfTk9fSFpfRlVMTD15CitDT05GSUdfTk9fSFpfRlVMTF9BTEw9eQorQ09ORklHX05PX0haX0ZVTExfU1lTSURMRT15CitDT05GSUdfUkNVX0ZBU1RfTk9fSFo9bgorQ09ORklHX1JDVV9UUkFDRT15CitDT05GSUdfSE9UUExVR19DUFU9eQorQ09ORklHX1JDVV9GQU5PVVQ9MgorQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPW4KK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz15CitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KK0NPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEPW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA4IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzOGNlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvVFJFRTA4CkBAIC0wLDAgKzEsMjUgQEAKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9MTYKK0NPTkZJR19QUkVFTVBUX05PTkU9bgorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPW4KK0NPTkZJR19QUkVFTVBUPXkKKyNDSEVDSyNDT05GSUdfVFJFRV9QUkVFTVBUX1JDVT15CitDT05GSUdfSFpfUEVSSU9ESUM9bgorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX05PX0haX0ZVTEw9bgorQ09ORklHX1JDVV9GQVNUX05PX0haPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPW4KK0NPTkZJR19TVVNQRU5EPW4KK0NPTkZJR19ISUJFUk5BVElPTj1uCitDT05GSUdfUkNVX0ZBTk9VVD0zCitDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVD15CitDT05GSUdfUkNVX0ZBTk9VVF9MRUFGPTIKK0NPTkZJR19SQ1VfTk9DQl9DUFU9eQorQ09ORklHX1JDVV9OT0NCX0NQVV9BTEw9eQorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9bgorQ09ORklHX1BST1ZFX1JDVV9ERUxBWT1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPPW4KK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX1ZFUkJPU0U9bgorQ09ORklHX1JDVV9CT09TVD1uCitDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRD1uCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwOC1UIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDgtVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQ1MjNkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDgtVApAQCAtMCwwICsxLDI1IEBACitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTE2CitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfRkFTVF9OT19IWj1uCitDT05GSUdfUkNVX1RSQUNFPXkKK0NPTkZJR19IT1RQTFVHX0NQVT1uCitDT05GSUdfU1VTUEVORD1uCitDT05GSUdfSElCRVJOQVRJT049bgorQ09ORklHX1JDVV9GQU5PVVQ9MworQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1Q9eQorQ09ORklHX1JDVV9GQU5PVVRfTEVBRj0yCitDT05GSUdfUkNVX05PQ0JfQ1BVPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFVfQUxMPXkKK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KK0NPTkZJR19SQ1VfQk9PU1Q9bgorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L1RSRUUwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWU0ZjdjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9UUkVFMDkKQEAgLTAsMCArMSwyMCBAQAorQ09ORklHX1NNUD1uCitDT05GSUdfTlJfQ1BVUz0xCitDT05GSUdfUFJFRU1QVF9OT05FPW4KK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT1uCitDT05GSUdfUFJFRU1QVD15CisjQ0hFQ0sjQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1U9eQorQ09ORklHX0haX1BFUklPRElDPW4KK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19OT19IWl9GVUxMPW4KK0NPTkZJR19SQ1VfVFJBQ0U9bgorQ09ORklHX0hPVFBMVUdfQ1BVPW4KK0NPTkZJR19TVVNQRU5EPW4KK0NPTkZJR19ISUJFUk5BVElPTj1uCitDT05GSUdfUkNVX05PQ0JfQ1BVPW4KK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPW4KK0NPTkZJR19QUk9WRV9SQ1VfREVMQVk9bgorQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTz1uCitDT05GSUdfUkNVX0NQVV9TVEFMTF9WRVJCT1NFPW4KK0NPTkZJR19SQ1VfQk9PU1Q9bgorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9bgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvQ0ZMSVNUIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvQ0ZMSVNUCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvQ0ZMSVNUCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OMS1TLVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL04xLVMtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL04xLVMtVC1OSC1TRC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OMS1TLVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OMi0yLXQtbmgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL04yLTItdC1uaC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL04yLTItdC1uaC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OMi0yLXQtbmgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OMy0zLVQtbmgtU0QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL04zLTMtVC1uaC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL04zLTMtVC1uaC1TRC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OMy0zLVQtbmgtU0QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9ONC1BLXQtTkgtc2QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL040LUEtdC1OSC1zZC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL040LUEtdC1OSC1zZC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9ONC1BLXQtTkgtc2QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9ONS1VLVQtTkgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL041LVUtVC1OSC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL041LVUtVC1OSC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9ONS1VLVQtTkgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OVDEtbmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvTlQxLW5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9OVDEtbmgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OVDEtbmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL05UMy1OSCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9OVDMtTkgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL05UMy1OSApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL05UMy1OSApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDEtUy1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDEtUy1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QMi0yLXQtbmgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QMy0zLVQtbmgtU0QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDQtQS10LU5ILXNkLVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QNC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QNC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDQtQS10LU5ILXNkLVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUDUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QNS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QNS1VLVQtTkgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUDUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUFQxLW5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL1BUMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvUFQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUFQxLW5oCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QVDItTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YwLjAvUFQyLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjAuMC9QVDItTkgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC9QVDItTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92MC4wL3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjZTM3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjAuMC92ZXJfZnVuY3Rpb25zLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyMKKyMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKKyMKKyMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisKKyMgcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZSBzZWNvbmRzCisjCisjIEFkZHMgcGVyLXZlcnNpb24gdG9ydHVyZS1tb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIHN1cHBvcnRpbmcgdGhlbS4KKyMgV2hpY2ggb2xkIGtlcm5lbHMgZG8gbm90LgorcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgKCkgeworCWVjaG8JcmN1dG9ydHVyZS5zdGF0X2ludGVydmFsPTE1IFwKKwkJcmN1dG9ydHVyZS5zaHV0ZG93bl9zZWNzPSQzIFwKKwkJcmN1dG9ydHVyZS5yY3V0b3J0dXJlX3J1bm5hYmxlPTEgXAorCQlyY3V0b3J0dXJlLnRlc3Rfbm9faWRsZV9oej0xIFwKKwkJcmN1dG9ydHVyZS52ZXJib3NlPTEKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9DRkxJU1QgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL0NGTElTVApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9DRkxJU1QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9OMS1TLVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9OMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjEtUy1ULU5ILVNELVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9OMS1TLVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjItMi10LW5oLXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL04yLTItdC1uaC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL04zLTMtVC1uaC1TRC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL04zLTMtVC1uaC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9OMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL04zLTMtVC1uaC1TRC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9ONC1BLXQtTkgtc2QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjQtQS10LU5ILXNkLVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONC1BLXQtTkgtc2QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjUtVS1ULU5ILXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL041LVUtVC1OSC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL042LS0tdC1uaC1TRC1zbXAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL042LS0tdC1uaC1TRC1zbXAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9ONi0tLXQtbmgtU0Qtc21wLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL042LS0tdC1uaC1TRC1zbXAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9ONy00LVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONy00LVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjctNC1ULU5ILVNELVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9ONy00LVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTjgtMi1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjgtMi1ULU5ILVNELVNNUC1IUApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL044LTItVC1OSC1TRC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTjgtMi1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL05UMS1uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTlQxLW5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTlQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL05UMS1uaApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL05UMy1OSCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvTlQzLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvTlQzLU5ICnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL05UMy1OSApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1AxLVMtVC1OSC1TRC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1AxLVMtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1AxLVMtVC1OSC1TRC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QMi0yLXQtbmgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDItMi10LW5oLXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QMi0yLXQtbmgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDMtMy1ULW5oLVNELVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1AzLTMtVC1uaC1TRC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A0LUEtdC1OSC1zZC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A0LUEtdC1OSC1zZC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A0LUEtdC1OSC1zZC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNS1VLVQtTkgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QNS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDUtVS1ULU5ILXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QNS1VLVQtTkgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDYtLS10LW5oLVNELXNtcC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDYtLS10LW5oLVNELXNtcC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A2LS0tdC1uaC1TRC1zbXAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDYtLS10LW5oLVNELXNtcC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQLWFsbCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDctNC1ULU5ILVNELVNNUC1IUC1hbGwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQLWFsbApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QNy00LVQtTkgtU0QtU01QLUhQLWFsbApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAtbm9uZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMTIvUDctNC1ULU5ILVNELVNNUC1IUC1ub25lCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMTIvUDctNC1ULU5ILVNELVNNUC1IUC1ub25lCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtSFAtbm9uZQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QNy00LVQtTkgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1A3LTQtVC1OSC1TRC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QVDEtbmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1BUMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1BUMS1uaApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QVDEtbmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4xMi9QVDItTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjEyL1BUMi1OSApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjEyL1BUMi1OSApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4xMi9QVDItTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL0NGTElTVCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9DRkxJU1QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL0NGTElTVApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL0NGTElTVApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjEtUy1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjEtUy1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OMi0yLXQtbmgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OMy0zLVQtbmgtU0QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjQtQS10LU5ILXNkLVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9ONC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9ONC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjQtQS10LU5ILXNkLVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTjUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9ONS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9ONS1VLVQtTkgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTjUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTlQxLW5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL05UMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvTlQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTlQxLW5oCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OVDMtTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvTlQzLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy9OVDMtTkgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9OVDMtTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1AxLVMtVC1OSC1TRC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDEtUy1ULU5ILVNELVNNUC1IUApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDEtUy1ULU5ILVNELVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1AxLVMtVC1OSC1TRC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1AyLTItdC1uaC1zZC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDItMi10LW5oLXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDItMi10LW5oLXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1AyLTItdC1uaC1zZC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1AzLTMtVC1uaC1TRC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDMtMy1ULW5oLVNELVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDMtMy1ULW5oLVNELVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1AzLTMtVC1uaC1TRC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1A0LUEtdC1OSC1zZC1TTVAtSFAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDQtQS10LU5ILXNkLVNNUC1IUApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDQtQS10LU5ILXNkLVNNUC1IUApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1A0LUEtdC1OSC1zZC1TTVAtSFAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1A1LVUtVC1OSC1zZC1TTVAtaHAgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUDUtVS1ULU5ILXNkLVNNUC1ocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUDUtVS1ULU5ILXNkLVNNUC1ocApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1A1LVUtVC1OSC1zZC1TTVAtaHAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1BUMS1uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy9QVDEtbmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My4zL1BUMS1uaApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1BUMS1uaApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUFQyLU5IIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My4zL1BUMi1OSApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvUFQyLU5ICnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvUFQyLU5ICmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvdmVyX2Z1bmN0aW9ucy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuMy92ZXJfZnVuY3Rpb25zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTU1NjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjMvdmVyX2Z1bmN0aW9ucy5zaApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vYmFzaAorIworIyBLZXJuZWwtdmVyc2lvbi1kZXBlbmRlbnQgc2hlbGwgZnVuY3Rpb25zIGZvciB0aGUgcmVzdCBvZiB0aGUgc2NyaXB0cy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisjIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCisjCisjIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDEzCisjCisjIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorCisjIHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZQorIworIyBBZGRzIG9ub2ZmIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCityY3V0b3J0dXJlX3BhcmFtX29ub2ZmICgpIHsKKwlpZiAhIGJvb3RwYXJhbV9ob3RwbHVnX2NwdSAiJDEiICYmIGNvbmZpZ2ZyYWdfaG90cGx1Z19jcHUgIiQyIgorCXRoZW4KKwkJZWNobyBDUFUtaG90cGx1ZyBrZXJuZWwsIGFkZGluZyByY3V0b3J0dXJlIG9ub2ZmLiAxPiYyCisJCWVjaG8gcmN1dG9ydHVyZS5vbm9mZl9pbnRlcnZhbD0zIHJjdXRvcnR1cmUub25vZmZfaG9sZG9mZj0zMAorCWZpCit9CisKKyMgcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZSBzZWNvbmRzCisjCisjIEFkZHMgcGVyLXZlcnNpb24gdG9ydHVyZS1tb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIHN1cHBvcnRpbmcgdGhlbS4KK3Blcl92ZXJzaW9uX2Jvb3RfcGFyYW1zICgpIHsKKwllY2hvICQxIGByY3V0b3J0dXJlX3BhcmFtX29ub2ZmICIkMSIgIiQyImAgXAorCQlyY3V0b3J0dXJlLnN0YXRfaW50ZXJ2YWw9MTUgXAorCQlyY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JDMgXAorCQlyY3V0b3J0dXJlLnJjdXRvcnR1cmVfcnVubmFibGU9MSBcCisJCXJjdXRvcnR1cmUudGVzdF9ub19pZGxlX2h6PTEgXAorCQlyY3V0b3J0dXJlLnZlcmJvc2U9MQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvQ0ZMSVNUIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L0NGTElTVApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvQ0ZMSVNUCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvQ0ZMSVNUCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OMS1TLVQtTkgtU0QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L04xLVMtVC1OSC1TRC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L04xLVMtVC1OSC1TRC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OMS1TLVQtTkgtU0QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OMi0yLXQtbmgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L04yLTItdC1uaC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L04yLTItdC1uaC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OMi0yLXQtbmgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OMy0zLVQtbmgtU0QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L04zLTMtVC1uaC1TRC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L04zLTMtVC1uaC1TRC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OMy0zLVQtbmgtU0QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9ONC1BLXQtTkgtc2QtU01QLUhQIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L040LUEtdC1OSC1zZC1TTVAtSFAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L040LUEtdC1OSC1zZC1TTVAtSFAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9ONC1BLXQtTkgtc2QtU01QLUhQCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9ONS1VLVQtTkgtc2QtU01QLWhwIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L041LVUtVC1OSC1zZC1TTVAtaHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L041LVUtVC1OSC1zZC1TTVAtaHAKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9ONS1VLVQtTkgtc2QtU01QLWhwCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OVDEtbmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvTlQxLW5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9OVDEtbmgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OVDEtbmgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L05UMy1OSCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9OVDMtTkgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92My41L05UMy1OSApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L05UMy1OSApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDEtUy1ULU5ILVNELVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QMS1TLVQtTkgtU0QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QMS1TLVQtTkgtU0QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDEtUy1ULU5ILVNELVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDItMi10LW5oLXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QMi0yLXQtbmgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QMi0yLXQtbmgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDItMi10LW5oLXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDMtMy1ULW5oLVNELVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QMy0zLVQtbmgtU0QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QMy0zLVQtbmgtU0QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDMtMy1ULW5oLVNELVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDQtQS10LU5ILXNkLVNNUC1IUCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QNC1BLXQtTkgtc2QtU01QLUhQCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QNC1BLXQtTkgtc2QtU01QLUhQCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDQtQS10LU5ILXNkLVNNUC1IUApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUDUtVS1ULU5ILXNkLVNNUC1ocCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QNS1VLVQtTkgtc2QtU01QLWhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QNS1VLVQtTkgtc2QtU01QLWhwCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUDUtVS1ULU5ILXNkLVNNUC1ocApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUFQxLW5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L1BUMS1uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvUFQxLW5oCnJlbmFtZSB0byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUFQxLW5oCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QVDItTkggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3YzLjUvUFQyLU5ICnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS9QVDItTkgKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS9QVDItTkgKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS92My41L3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3N2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdjMuNS92ZXJfZnVuY3Rpb25zLnNoCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKKyMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KKyMKKyMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKKyMKKyMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisKKyMgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzIGJvb3RwYXJhbS1zdHJpbmcKKyMKKyMgQWRkcyBuX2JhcnJpZXJfY2JzIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlciB0byBrZXJuZWxzIGhhdmluZyBpdC4KK3JjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAoKSB7CisJaWYgZWNobyAkMSB8IGdyZXAgLXEgInJjdXRvcnR1cmVcLm5fYmFycmllcl9jYnMiCisJdGhlbgorCQk6CisJZWxzZQorCQllY2hvIHJjdXRvcnR1cmUubl9iYXJyaWVyX2Nicz00CisJZmkKK30KKworIyByY3V0b3J0dXJlX3BhcmFtX29ub2ZmIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUKKyMKKyMgQWRkcyBvbm9mZiByY3V0b3J0dXJlIG1vZHVsZSBwYXJhbWV0ZXJzIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgorcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiAoKSB7CisJaWYgISBib290cGFyYW1faG90cGx1Z19jcHUgIiQxIiAmJiBjb25maWdmcmFnX2hvdHBsdWdfY3B1ICIkMiIKKwl0aGVuCisJCWVjaG8gQ1BVLWhvdHBsdWcga2VybmVsLCBhZGRpbmcgcmN1dG9ydHVyZSBvbm9mZi4gMT4mMgorCQllY2hvIHJjdXRvcnR1cmUub25vZmZfaW50ZXJ2YWw9MyByY3V0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKKwlmaQorfQorCisjIHBlcl92ZXJzaW9uX2Jvb3RfcGFyYW1zIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUgc2Vjb25kcworIworIyBBZGRzIHBlci12ZXJzaW9uIHRvcnR1cmUtbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBzdXBwb3J0aW5nIHRoZW0uCitwZXJfdmVyc2lvbl9ib290X3BhcmFtcyAoKSB7CisJZWNobyAkMSBgcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiAiJDEiICIkMiJgIFwKKwkJYHJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAiJDEiYCBcCisJCXJjdXRvcnR1cmUuc3RhdF9pbnRlcnZhbD0xNSBcCisJCXJjdXRvcnR1cmUuc2h1dGRvd25fc2Vjcz0kMyBcCisJCXJjdXRvcnR1cmUucmN1dG9ydHVyZV9ydW5uYWJsZT0xIFwKKwkJcmN1dG9ydHVyZS50ZXN0X25vX2lkbGVfaHo9MSBcCisJCXJjdXRvcnR1cmUudmVyYm9zZT0xCit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3Zlcl9mdW5jdGlvbnMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L3Zlcl9mdW5jdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3N2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvdmVyX2Z1bmN0aW9ucy5zaApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vYmFzaAorIworIyBLZXJuZWwtdmVyc2lvbi1kZXBlbmRlbnQgc2hlbGwgZnVuY3Rpb25zIGZvciB0aGUgcmVzdCBvZiB0aGUgc2NyaXB0cy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBhY2Nlc3MgaXQgb25saW5lIGF0CisjIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwuCisjCisjIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDEzCisjCisjIEF1dGhvcnM6IFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPgorCisjIHJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyBib290cGFyYW0tc3RyaW5nCisjCisjIEFkZHMgbl9iYXJyaWVyX2NicyByY3V0b3J0dXJlIG1vZHVsZSBwYXJhbWV0ZXIgdG8ga2VybmVscyBoYXZpbmcgaXQuCityY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgKCkgeworCWlmIGVjaG8gJDEgfCBncmVwIC1xICJyY3V0b3J0dXJlXC5uX2JhcnJpZXJfY2JzIgorCXRoZW4KKwkJOgorCWVsc2UKKwkJZWNobyByY3V0b3J0dXJlLm5fYmFycmllcl9jYnM9NAorCWZpCit9CisKKyMgcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlCisjCisjIEFkZHMgb25vZmYgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIGhhdmluZyBpdC4KK3JjdXRvcnR1cmVfcGFyYW1fb25vZmYgKCkgeworCWlmICEgYm9vdHBhcmFtX2hvdHBsdWdfY3B1ICIkMSIgJiYgY29uZmlnZnJhZ19ob3RwbHVnX2NwdSAiJDIiCisJdGhlbgorCQllY2hvIENQVS1ob3RwbHVnIGtlcm5lbCwgYWRkaW5nIHJjdXRvcnR1cmUgb25vZmYuIDE+JjIKKwkJZWNobyByY3V0b3J0dXJlLm9ub2ZmX2ludGVydmFsPTMgcmN1dG9ydHVyZS5vbm9mZl9ob2xkb2ZmPTMwCisJZmkKK30KKworIyBwZXJfdmVyc2lvbl9ib290X3BhcmFtcyBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlIHNlY29uZHMKKyMKKyMgQWRkcyBwZXItdmVyc2lvbiB0b3J0dXJlLW1vZHVsZSBwYXJhbWV0ZXJzIHRvIGtlcm5lbHMgc3VwcG9ydGluZyB0aGVtLgorcGVyX3ZlcnNpb25fYm9vdF9wYXJhbXMgKCkgeworCWVjaG8gJDEgYHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgIiQxIiAiJDIiYCBcCisJCWByY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgIiQxImAgXAorCQlyY3V0b3J0dXJlLnN0YXRfaW50ZXJ2YWw9MTUgXAorCQlyY3V0b3J0dXJlLnNodXRkb3duX3NlY3M9JDMgXAorCQlyY3V0b3J0dXJlLnJjdXRvcnR1cmVfcnVubmFibGU9MSBcCisJCXJjdXRvcnR1cmUudGVzdF9ub19pZGxlX2h6PTEgXAorCQlyY3V0b3J0dXJlLnZlcmJvc2U9MQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvdmVyX2Z1bmN0aW9ucy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy92MC4wL3Zlcl9mdW5jdGlvbnMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDUyNTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YwLjAvdmVyX2Z1bmN0aW9ucy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKLSMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KLSMKLSMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKLSMKLSMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+Ci0KLSMgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzIGJvb3RwYXJhbS1zdHJpbmcKLSMKLSMgQWRkcyBuX2JhcnJpZXJfY2JzIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlciB0byBrZXJuZWxzIGhhdmluZyBpdC4KLXJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAoKSB7Ci0JZWNobyAkMQotfQotCi0jIHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZQotIwotIyBBZGRzIG9ub2ZmIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCi1yY3V0b3J0dXJlX3BhcmFtX29ub2ZmICgpIHsKLQllY2hvICQxCi19CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjMvdmVyX2Z1bmN0aW9ucy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3NDMyZi4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuMy92ZXJfZnVuY3Rpb25zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgS2VybmVsLXZlcnNpb24tZGVwZW5kZW50IHNoZWxsIGZ1bmN0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdHMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAotIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgotIwotIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMwotIwotIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotIyByY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgYm9vdHBhcmFtLXN0cmluZwotIwotIyBBZGRzIG5fYmFycmllcl9jYnMgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVyIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgotcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzICgpIHsKLQllY2hvICQxCi19Ci0KLSMgcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiBib290cGFyYW0tc3RyaW5nIGNvbmZpZy1maWxlCi0jCi0jIEFkZHMgb25vZmYgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVycyB0byBrZXJuZWxzIGhhdmluZyBpdC4KLXJjdXRvcnR1cmVfcGFyYW1fb25vZmYgKCkgewotCWlmICEgYm9vdHBhcmFtX2hvdHBsdWdfY3B1ICIkMSIgJiYgY29uZmlnZnJhZ19ob3RwbHVnX2NwdSAiJDIiCi0JdGhlbgotCQllY2hvIENQVS1ob3RwbHVnIGtlcm5lbCwgYWRkaW5nIHJjdXRvcnR1cmUgb25vZmYuCi0JCWVjaG8gJDEgcmN1dG9ydHVyZS5vbm9mZl9pbnRlcnZhbD0zIHJjdXRvcnR1cmUub25vZmZfaG9sZG9mZj0zMAotCWVsc2UKLQkJZWNobyAkMQotCWZpCi19CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS92ZXJfZnVuY3Rpb25zLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3YzLjUvdmVyX2Z1bmN0aW9ucy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1ZjEzYS4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdjMuNS92ZXJfZnVuY3Rpb25zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgS2VybmVsLXZlcnNpb24tZGVwZW5kZW50IHNoZWxsIGZ1bmN0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdHMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gYWNjZXNzIGl0IG9ubGluZSBhdAotIyBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sLgotIwotIyBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMwotIwotIyBBdXRob3JzOiBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotIyByY3V0b3J0dXJlX3BhcmFtX25fYmFycmllcl9jYnMgYm9vdHBhcmFtLXN0cmluZwotIwotIyBBZGRzIG5fYmFycmllcl9jYnMgcmN1dG9ydHVyZSBtb2R1bGUgcGFyYW1ldGVyIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgotcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzICgpIHsKLQlpZiBlY2hvICQxIHwgZ3JlcCAtcSAicmN1dG9ydHVyZVwubl9iYXJyaWVyX2NicyIKLQl0aGVuCi0JCWVjaG8gJDEKLQllbHNlCi0JCWVjaG8gJDEgcmN1dG9ydHVyZS5uX2JhcnJpZXJfY2JzPTQKLQlmaQotfQotCi0jIHJjdXRvcnR1cmVfcGFyYW1fb25vZmYgYm9vdHBhcmFtLXN0cmluZyBjb25maWctZmlsZQotIwotIyBBZGRzIG9ub2ZmIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlcnMgdG8ga2VybmVscyBoYXZpbmcgaXQuCi1yY3V0b3J0dXJlX3BhcmFtX29ub2ZmICgpIHsKLQlpZiAhIGJvb3RwYXJhbV9ob3RwbHVnX2NwdSAiJDEiICYmIGNvbmZpZ2ZyYWdfaG90cGx1Z19jcHUgIiQyIgotCXRoZW4KLQkJZWNobyBDUFUtaG90cGx1ZyBrZXJuZWwsIGFkZGluZyByY3V0b3J0dXJlIG9ub2ZmLgotCQllY2hvICQxIHJjdXRvcnR1cmUub25vZmZfaW50ZXJ2YWw9MyByY3V0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKLQllbHNlCi0JCWVjaG8gJDEKLQlmaQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3Zlcl9mdW5jdGlvbnMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdmVyX2Z1bmN0aW9ucy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0MGVhZC4uMDAwMDAwMAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvdmVyX2Z1bmN0aW9ucy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIEtlcm5lbC12ZXJzaW9uLWRlcGVuZGVudCBzaGVsbCBmdW5jdGlvbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBzY3JpcHRzLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGFjY2VzcyBpdCBvbmxpbmUgYXQKLSMgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbC4KLSMKLSMgQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTMKLSMKLSMgQXV0aG9yczogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+Ci0KLSMgcmN1dG9ydHVyZV9wYXJhbV9uX2JhcnJpZXJfY2JzIGJvb3RwYXJhbS1zdHJpbmcKLSMKLSMgQWRkcyBuX2JhcnJpZXJfY2JzIHJjdXRvcnR1cmUgbW9kdWxlIHBhcmFtZXRlciB0byBrZXJuZWxzIGhhdmluZyBpdC4KLXJjdXRvcnR1cmVfcGFyYW1fbl9iYXJyaWVyX2NicyAoKSB7Ci0JaWYgZWNobyAkMSB8IGdyZXAgLXEgInJjdXRvcnR1cmVcLm5fYmFycmllcl9jYnMiCi0JdGhlbgotCQllY2hvICQxCi0JZWxzZQotCQllY2hvICQxIHJjdXRvcnR1cmUubl9iYXJyaWVyX2Nicz00Ci0JZmkKLX0KLQotIyByY3V0b3J0dXJlX3BhcmFtX29ub2ZmIGJvb3RwYXJhbS1zdHJpbmcgY29uZmlnLWZpbGUKLSMKLSMgQWRkcyBvbm9mZiByY3V0b3J0dXJlIG1vZHVsZSBwYXJhbWV0ZXJzIHRvIGtlcm5lbHMgaGF2aW5nIGl0LgotcmN1dG9ydHVyZV9wYXJhbV9vbm9mZiAoKSB7Ci0JaWYgISBib290cGFyYW1faG90cGx1Z19jcHUgIiQxIiAmJiBjb25maWdmcmFnX2hvdHBsdWdfY3B1ICIkMiIKLQl0aGVuCi0JCWVjaG8gQ1BVLWhvdHBsdWcga2VybmVsLCBhZGRpbmcgcmN1dG9ydHVyZSBvbm9mZi4gMT4mMgotCQllY2hvICQxIHJjdXRvcnR1cmUub25vZmZfaW50ZXJ2YWw9MyByY3V0b3J0dXJlLm9ub2ZmX2hvbGRvZmY9MzAKLQllbHNlCi0JCWVjaG8gJDEKLQlmaQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9kb2MvVFJFRV9SQ1UtS2NvbmZpZy50eHQgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2RvYy9UUkVFX1JDVS1rY29uZmlnLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9kb2MvVFJFRV9SQ1UtS2NvbmZpZy50eHQKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvZG9jL1RSRUVfUkNVLWtjb25maWcudHh0CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCAwM2EwMzgxLi5iNWVjN2ZiIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogc3RhdGljIHZvaWQgbWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoc3RydWN0IGt2bSAqa3ZtLAogCQkJCSAgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90LCBnZm5fdCBnZm4pOwogCi1ib29sIGt2bV9yZWJvb3Rpbmc7CitfX3Zpc2libGUgYm9vbCBrdm1fcmVib290aW5nOwogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlYm9vdGluZyk7CiAKIHN0YXRpYyBib29sIGxhcmdlcGFnZXNfZW5hYmxlZCA9IHRydWU7Cg==